ZGlmZiAtLWdpdCBhLy5tYWlsbWFwIGIvLm1haWxtYXAKaW5kZXggOTdmN2I0Zi4uNGU4M2U3YiAxMDA2NDQKLS0tIGEvLm1haWxtYXAKKysrIGIvLm1haWxtYXAKQEAgLTMyLDYgKzMyLDcgQEAKIENvcmV5IE1pbnlhcmQgPG1pbnlhcmRAYWNtLm9yZz4KIERhdmlkIEJyb3duZWxsIDxkYXZpZC1iQHBhY2JlbGwubmV0PgogRGF2aWQgV29vZGhvdXNlIDxkd213MkBzaGlueWJvb2suaW5mcmFkZWFkLm9yZz4KK0RtaXRyeSBFcmVtaW4tU29sZW5pa292IDxkYmFyeXNoa292QGdtYWlsLmNvbT4KIERvbWVuIFB1bmNlciA8ZG9tZW5AY29kZXJvY2sub3JnPgogRG91Z2xhcyBHaWxiZXJ0IDxkb3VnZ0B0b3JxdWUubmV0PgogRWQgTC4gQ2FzaGluIDxlY2FzaGluQGNvcmFpZC5jb20+CmRpZmYgLS1naXQgYS9DUkVESVRTIGIvQ1JFRElUUwppbmRleCBhYmUwNWEwLi45MzlkYTQ2IDEwMDY0NAotLS0gYS9DUkVESVRTCisrKyBiL0NSRURJVFMKQEAgLTQ2NCw2ICs0NjQsMTEgQEAKIFM6IE5hbXBhLCBJZGFobyA4MzY4NgogUzogVVNBCiAKK046IERpcmsgSi4gQnJhbmRld2llCitFOiBkaXJrLmouYnJhbmRld2llQGludGVsLmNvbQorRTogbGludXgtd2ltYXhAaW50ZWwuY29tCitEOiBJbnRlbCBXaXJlbGVzcyBXaU1BWCBDb25uZWN0aW9uIDI0MDAgU0RJTyBkcml2ZXIKKwogTjogRGVycmljayBKLiBCcmFzaGVhcgogRTogc2hhZG93QGRlbWVudGlhLm9yZwogVzogaHR0cDovL3d3dy5kZW1lbnRpYS5vcmcvfnNoYWRvdwpAQCAtMTY4MSw3ICsxNjg2LDcgQEAKIEQ6IGZiZGV2IGhhY2tpbmcKIAogTjogSmVzcGVyIEp1aGwKLUU6IGplc3Blci5qdWhsQGdtYWlsLmNvbQorRTogampAY2hhb3NiaXRzLm5ldAogRDogVmFyaW91cyBmaXhlcywgY2xlYW51cHMgYW5kIG1pbm9yIGZlYXR1cmVzIGFsbCBvdmVyIHRoZSB0cmVlLgogRDogV3JvdGUgaW5pdGlhbCB2ZXJzaW9uIG9mIHRoZSBoZGFwcyBkcml2ZXIgKHNpbmNlIHBhc3NlZCBvbiB0byBvdGhlcnMpLgogUzogTGVtbm9zdmVqIDEsIDMudHYKQEAgLTIxMTksNiArMjEyNCwxMSBAQAogRTogaGpsQGdudS5haS5taXQuZWR1CiBEOiBHQ0MgKyBsaWJyYXJpZXMgaGFja2VyCiAKK046IFlhbmlyIEx1YmV0a2luCitFOiB5YW5pcngubHViYXRraW5AaW50ZWwuY29tCitFOiBsaW51eC13aW1heEBpbnRlbC5jb20KK0Q6IEludGVsIFdpcmVsZXNzIFdpTUFYIENvbm5lY3Rpb24gMjQwMCBkcml2ZXIKKwogTjogTWljaGFsIEx1ZHZpZwogRTogbWljaGFsQGxvZ2l4LmN6CiBFOiBtaWNoYWwubHVkdmlnQGFzdGVyaXNrLmNvLm56CkBAIC0yNjkzLDYgKzI3MDMsMTMgQEAKIFM6IFRodW5kZXIgQmF5LCBPbnRhcmlvCiBTOiBDQU5BREEgUDdDIDVNOQogCitOOiBJbmFreSBQZXJlei1Hb256YWxlegorRTogaW5ha3kucGVyZXotZ29uemFsZXpAaW50ZWwuY29tCitFOiBsaW51eC13aW1heEBpbnRlbC5jb20KK0U6IGluYWt5cGdAeWFob28uY29tCitEOiBXaU1BWCBzdGFjaworRDogSW50ZWwgV2lyZWxlc3MgV2lNQVggQ29ubmVjdGlvbiAyNDAwIGRyaXZlcgorCiBOOiBZdXJpIFBlcgogRTogeXVyaUBwdHMubWlwdC5ydQogRDogU29tZSBzbWJmcyBmaXhlcwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1jbGFzcy1yZWd1bGF0b3IgYi9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWNsYXNzLXJlZ3VsYXRvcgppbmRleCAzNzMxZjZmLi44NzNlZjFmIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWNsYXNzLXJlZ3VsYXRvcgorKysgYi9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWNsYXNzLXJlZ3VsYXRvcgpAQCAtMyw4ICszLDkgQEAKIEtlcm5lbFZlcnNpb246CTIuNi4yNgogQ29udGFjdDoJTGlhbSBHaXJkd29vZCA8bHJnQHNsaW1sb2dpYy5jby51az4KIERlc2NyaXB0aW9uOgotCQlFYWNoIHJlZ3VsYXRvciBkaXJlY3Rvcnkgd2lsbCBjb250YWluIGEgZmllbGQgY2FsbGVkCi0JCXN0YXRlLiBUaGlzIGhvbGRzIHRoZSByZWd1bGF0b3Igb3V0cHV0IHN0YXRlLgorCQlTb21lIHJlZ3VsYXRvciBkaXJlY3RvcmllcyB3aWxsIGNvbnRhaW4gYSBmaWVsZCBjYWxsZWQKKwkJc3RhdGUuIFRoaXMgcmVwb3J0cyB0aGUgcmVndWxhdG9yIGVuYWJsZSBzdGF0dXMsIGZvcgorCQlyZWd1bGF0b3JzIHdoaWNoIGNhbiByZXBvcnQgdGhhdCB2YWx1ZS4KIAogCQlUaGlzIHdpbGwgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgc3RyaW5nczoKIApAQCAtMTgsNyArMTksOCBAQAogCQknZGlzYWJsZWQnIG1lYW5zIHRoZSByZWd1bGF0b3Igb3V0cHV0IGlzIE9GRiBhbmQgaXMgbm90CiAJCXN1cHBseWluZyBwb3dlciB0byB0aGUgc3lzdGVtLi4KIAotCQkndW5rbm93bicgbWVhbnMgc29mdHdhcmUgY2Fubm90IGRldGVybWluZSB0aGUgc3RhdGUuCisJCSd1bmtub3duJyBtZWFucyBzb2Z0d2FyZSBjYW5ub3QgZGV0ZXJtaW5lIHRoZSBzdGF0ZSwgb3IKKwkJdGhlIHJlcG9ydGVkIHN0YXRlIGlzIGludmFsaWQuCiAKIAkJTk9URTogdGhpcyBmaWVsZCBjYW4gYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIG1pY3Jvdm9sdHMKIAkJYW5kIG1pY3JvYW1wcyB0byBkZXRlcm1pbmUgcmVndWxhdG9yIG91dHB1dCBsZXZlbHMuCkBAIC01Myw5ICs1NSwxMCBAQAogS2VybmVsVmVyc2lvbjoJMi42LjI2CiBDb250YWN0OglMaWFtIEdpcmR3b29kIDxscmdAc2xpbWxvZ2ljLmNvLnVrPgogRGVzY3JpcHRpb246Ci0JCUVhY2ggcmVndWxhdG9yIGRpcmVjdG9yeSB3aWxsIGNvbnRhaW4gYSBmaWVsZCBjYWxsZWQKKwkJU29tZSByZWd1bGF0b3IgZGlyZWN0b3JpZXMgd2lsbCBjb250YWluIGEgZmllbGQgY2FsbGVkCiAJCW1pY3Jvdm9sdHMuIFRoaXMgaG9sZHMgdGhlIHJlZ3VsYXRvciBvdXRwdXQgdm9sdGFnZSBzZXR0aW5nCi0JCW1lYXN1cmVkIGluIG1pY3Jvdm9sdHMgKGkuZS4gRS02IFZvbHRzKS4KKwkJbWVhc3VyZWQgaW4gbWljcm92b2x0cyAoaS5lLiBFLTYgVm9sdHMpLCBmb3IgcmVndWxhdG9ycworCQl3aGljaCBjYW4gcmVwb3J0IHRoYXQgdm9sdGFnZS4KIAogCQlOT1RFOiBUaGlzIHZhbHVlIHNob3VsZCBub3QgYmUgdXNlZCB0byBkZXRlcm1pbmUgdGhlIHJlZ3VsYXRvcgogCQlvdXRwdXQgdm9sdGFnZSBsZXZlbCBhcyB0aGlzIHZhbHVlIGlzIHRoZSBzYW1lIHJlZ2FyZGxlc3Mgb2YKQEAgLTY3LDkgKzcwLDEwIEBACiBLZXJuZWxWZXJzaW9uOgkyLjYuMjYKIENvbnRhY3Q6CUxpYW0gR2lyZHdvb2QgPGxyZ0BzbGltbG9naWMuY28udWs+CiBEZXNjcmlwdGlvbjoKLQkJRWFjaCByZWd1bGF0b3IgZGlyZWN0b3J5IHdpbGwgY29udGFpbiBhIGZpZWxkIGNhbGxlZAorCQlTb21lIHJlZ3VsYXRvciBkaXJlY3RvcmllcyB3aWxsIGNvbnRhaW4gYSBmaWVsZCBjYWxsZWQKIAkJbWljcm9hbXBzLiBUaGlzIGhvbGRzIHRoZSByZWd1bGF0b3Igb3V0cHV0IGN1cnJlbnQgbGltaXQKLQkJc2V0dGluZyBtZWFzdXJlZCBpbiBtaWNyb2FtcHMgKGkuZS4gRS02IEFtcHMpLgorCQlzZXR0aW5nIG1lYXN1cmVkIGluIG1pY3JvYW1wcyAoaS5lLiBFLTYgQW1wcyksIGZvciByZWd1bGF0b3JzCisJCXdoaWNoIGNhbiByZXBvcnQgdGhhdCBjdXJyZW50LgogCiAJCU5PVEU6IFRoaXMgdmFsdWUgc2hvdWxkIG5vdCBiZSB1c2VkIHRvIGRldGVybWluZSB0aGUgcmVndWxhdG9yCiAJCW91dHB1dCBjdXJyZW50IGxldmVsIGFzIHRoaXMgdmFsdWUgaXMgdGhlIHNhbWUgcmVnYXJkbGVzcyBvZgpAQCAtODEsOCArODUsOSBAQAogS2VybmVsVmVyc2lvbjoJMi42LjI2CiBDb250YWN0OglMaWFtIEdpcmR3b29kIDxscmdAc2xpbWxvZ2ljLmNvLnVrPgogRGVzY3JpcHRpb246Ci0JCUVhY2ggcmVndWxhdG9yIGRpcmVjdG9yeSB3aWxsIGNvbnRhaW4gYSBmaWVsZCBjYWxsZWQKLQkJb3Btb2RlLiBUaGlzIGhvbGRzIHRoZSByZWd1bGF0b3Igb3BlcmF0aW5nIG1vZGUgc2V0dGluZy4KKwkJU29tZSByZWd1bGF0b3IgZGlyZWN0b3JpZXMgd2lsbCBjb250YWluIGEgZmllbGQgY2FsbGVkCisJCW9wbW9kZS4gVGhpcyBob2xkcyB0aGUgY3VycmVudCByZWd1bGF0b3Igb3BlcmF0aW5nIG1vZGUsCisJCWZvciByZWd1bGF0b3JzIHdoaWNoIGNhbiByZXBvcnQgaXQuCiAKIAkJVGhlIG9wbW9kZSB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgc3RyaW5nczoKIApAQCAtOTIsNyArOTcsNyBAQAogCQknc3RhbmRieScKIAkJJ3Vua25vd24nCiAKLQkJVGhlIG1vZGVzIGFyZSBkZXNjcmliZWQgaW4gaW5jbHVkZS9saW51eC9yZWd1bGF0b3IvcmVndWxhdG9yLmgKKwkJVGhlIG1vZGVzIGFyZSBkZXNjcmliZWQgaW4gaW5jbHVkZS9saW51eC9yZWd1bGF0b3IvY29uc3VtZXIuaAogCiAJCU5PVEU6IFRoaXMgdmFsdWUgc2hvdWxkIG5vdCBiZSB1c2VkIHRvIGRldGVybWluZSB0aGUgcmVndWxhdG9yCiAJCW91dHB1dCBvcGVyYXRpbmcgbW9kZSBhcyB0aGlzIHZhbHVlIGlzIHRoZSBzYW1lIHJlZ2FyZGxlc3Mgb2YKQEAgLTEwNCw5ICsxMDksMTAgQEAKIEtlcm5lbFZlcnNpb246CTIuNi4yNgogQ29udGFjdDoJTGlhbSBHaXJkd29vZCA8bHJnQHNsaW1sb2dpYy5jby51az4KIERlc2NyaXB0aW9uOgotCQlFYWNoIHJlZ3VsYXRvciBkaXJlY3Rvcnkgd2lsbCBjb250YWluIGEgZmllbGQgY2FsbGVkCisJCVNvbWUgcmVndWxhdG9yIGRpcmVjdG9yaWVzIHdpbGwgY29udGFpbiBhIGZpZWxkIGNhbGxlZAogCQltaW5fbWljcm92b2x0cy4gVGhpcyBob2xkcyB0aGUgbWluaW11bSBzYWZlIHdvcmtpbmcgcmVndWxhdG9yCi0JCW91dHB1dCB2b2x0YWdlIHNldHRpbmcgZm9yIHRoaXMgZG9tYWluIG1lYXN1cmVkIGluIG1pY3Jvdm9sdHMuCisJCW91dHB1dCB2b2x0YWdlIHNldHRpbmcgZm9yIHRoaXMgZG9tYWluIG1lYXN1cmVkIGluIG1pY3Jvdm9sdHMsCisJCWZvciByZWd1bGF0b3JzIHdoaWNoIHN1cHBvcnQgdm9sdGFnZSBjb25zdHJhaW50cy4KIAogCQlOT1RFOiB0aGlzIHdpbGwgcmV0dXJuIHRoZSBzdHJpbmcgJ2NvbnN0cmFpbnQgbm90IGRlZmluZWQnIGlmCiAJCXRoZSBwb3dlciBkb21haW4gaGFzIG5vIG1pbiBtaWNyb3ZvbHRzIGNvbnN0cmFpbnQgZGVmaW5lZCBieQpAQCAtMTE4LDkgKzEyNCwxMCBAQAogS2VybmVsVmVyc2lvbjoJMi42LjI2CiBDb250YWN0OglMaWFtIEdpcmR3b29kIDxscmdAc2xpbWxvZ2ljLmNvLnVrPgogRGVzY3JpcHRpb246Ci0JCUVhY2ggcmVndWxhdG9yIGRpcmVjdG9yeSB3aWxsIGNvbnRhaW4gYSBmaWVsZCBjYWxsZWQKKwkJU29tZSByZWd1bGF0b3IgZGlyZWN0b3JpZXMgd2lsbCBjb250YWluIGEgZmllbGQgY2FsbGVkCiAJCW1heF9taWNyb3ZvbHRzLiBUaGlzIGhvbGRzIHRoZSBtYXhpbXVtIHNhZmUgd29ya2luZyByZWd1bGF0b3IKLQkJb3V0cHV0IHZvbHRhZ2Ugc2V0dGluZyBmb3IgdGhpcyBkb21haW4gbWVhc3VyZWQgaW4gbWljcm92b2x0cy4KKwkJb3V0cHV0IHZvbHRhZ2Ugc2V0dGluZyBmb3IgdGhpcyBkb21haW4gbWVhc3VyZWQgaW4gbWljcm92b2x0cywKKwkJZm9yIHJlZ3VsYXRvcnMgd2hpY2ggc3VwcG9ydCB2b2x0YWdlIGNvbnN0cmFpbnRzLgogCiAJCU5PVEU6IHRoaXMgd2lsbCByZXR1cm4gdGhlIHN0cmluZyAnY29uc3RyYWludCBub3QgZGVmaW5lZCcgaWYKIAkJdGhlIHBvd2VyIGRvbWFpbiBoYXMgbm8gbWF4IG1pY3Jvdm9sdHMgY29uc3RyYWludCBkZWZpbmVkIGJ5CkBAIC0xMzIsMTAgKzEzOSwxMCBAQAogS2VybmVsVmVyc2lvbjoJMi42LjI2CiBDb250YWN0OglMaWFtIEdpcmR3b29kIDxscmdAc2xpbWxvZ2ljLmNvLnVrPgogRGVzY3JpcHRpb246Ci0JCUVhY2ggcmVndWxhdG9yIGRpcmVjdG9yeSB3aWxsIGNvbnRhaW4gYSBmaWVsZCBjYWxsZWQKKwkJU29tZSByZWd1bGF0b3IgZGlyZWN0b3JpZXMgd2lsbCBjb250YWluIGEgZmllbGQgY2FsbGVkCiAJCW1pbl9taWNyb2FtcHMuIFRoaXMgaG9sZHMgdGhlIG1pbmltdW0gc2FmZSB3b3JraW5nIHJlZ3VsYXRvcgogCQlvdXRwdXQgY3VycmVudCBsaW1pdCBzZXR0aW5nIGZvciB0aGlzIGRvbWFpbiBtZWFzdXJlZCBpbgotCQltaWNyb2FtcHMuCisJCW1pY3JvYW1wcywgZm9yIHJlZ3VsYXRvcnMgd2hpY2ggc3VwcG9ydCBjdXJyZW50IGNvbnN0cmFpbnRzLgogCiAJCU5PVEU6IHRoaXMgd2lsbCByZXR1cm4gdGhlIHN0cmluZyAnY29uc3RyYWludCBub3QgZGVmaW5lZCcgaWYKIAkJdGhlIHBvd2VyIGRvbWFpbiBoYXMgbm8gbWluIG1pY3JvYW1wcyBjb25zdHJhaW50IGRlZmluZWQgYnkKQEAgLTE0NywxMCArMTU0LDEwIEBACiBLZXJuZWxWZXJzaW9uOgkyLjYuMjYKIENvbnRhY3Q6CUxpYW0gR2lyZHdvb2QgPGxyZ0BzbGltbG9naWMuY28udWs+CiBEZXNjcmlwdGlvbjoKLQkJRWFjaCByZWd1bGF0b3IgZGlyZWN0b3J5IHdpbGwgY29udGFpbiBhIGZpZWxkIGNhbGxlZAorCQlTb21lIHJlZ3VsYXRvciBkaXJlY3RvcmllcyB3aWxsIGNvbnRhaW4gYSBmaWVsZCBjYWxsZWQKIAkJbWF4X21pY3JvYW1wcy4gVGhpcyBob2xkcyB0aGUgbWF4aW11bSBzYWZlIHdvcmtpbmcgcmVndWxhdG9yCiAJCW91dHB1dCBjdXJyZW50IGxpbWl0IHNldHRpbmcgZm9yIHRoaXMgZG9tYWluIG1lYXN1cmVkIGluCi0JCW1pY3JvYW1wcy4KKwkJbWljcm9hbXBzLCBmb3IgcmVndWxhdG9ycyB3aGljaCBzdXBwb3J0IGN1cnJlbnQgY29uc3RyYWludHMuCiAKIAkJTk9URTogdGhpcyB3aWxsIHJldHVybiB0aGUgc3RyaW5nICdjb25zdHJhaW50IG5vdCBkZWZpbmVkJyBpZgogCQl0aGUgcG93ZXIgZG9tYWluIGhhcyBubyBtYXggbWljcm9hbXBzIGNvbnN0cmFpbnQgZGVmaW5lZCBieQpAQCAtMTg1LDcgKzE5Miw3IEBACiBLZXJuZWxWZXJzaW9uOgkyLjYuMjYKIENvbnRhY3Q6CUxpYW0gR2lyZHdvb2QgPGxyZ0BzbGltbG9naWMuY28udWs+CiBEZXNjcmlwdGlvbjoKLQkJRWFjaCByZWd1bGF0b3IgZGlyZWN0b3J5IHdpbGwgY29udGFpbiBhIGZpZWxkIGNhbGxlZAorCQlTb21lIHJlZ3VsYXRvciBkaXJlY3RvcmllcyB3aWxsIGNvbnRhaW4gYSBmaWVsZCBjYWxsZWQKIAkJcmVxdWVzdGVkX21pY3JvYW1wcy4gVGhpcyBob2xkcyB0aGUgdG90YWwgcmVxdWVzdGVkIGxvYWQKIAkJY3VycmVudCBpbiBtaWNyb2FtcHMgZm9yIHRoaXMgcmVndWxhdG9yIGZyb20gYWxsIGl0cyBjb25zdW1lcgogCQlkZXZpY2VzLgpAQCAtMjA0LDEyNSArMjExLDEwMiBAQAogS2VybmVsVmVyc2lvbjoJMi42LjI2CiBDb250YWN0OglMaWFtIEdpcmR3b29kIDxscmdAc2xpbWxvZ2ljLmNvLnVrPgogRGVzY3JpcHRpb246Ci0JCUVhY2ggcmVndWxhdG9yIGRpcmVjdG9yeSB3aWxsIGNvbnRhaW4gYSBmaWVsZCBjYWxsZWQKKwkJU29tZSByZWd1bGF0b3IgZGlyZWN0b3JpZXMgd2lsbCBjb250YWluIGEgZmllbGQgY2FsbGVkCiAJCXN1c3BlbmRfbWVtX21pY3Jvdm9sdHMuIFRoaXMgaG9sZHMgdGhlIHJlZ3VsYXRvciBvdXRwdXQKIAkJdm9sdGFnZSBzZXR0aW5nIGZvciB0aGlzIGRvbWFpbiBtZWFzdXJlZCBpbiBtaWNyb3ZvbHRzIHdoZW4KLQkJdGhlIHN5c3RlbSBpcyBzdXNwZW5kZWQgdG8gbWVtb3J5LgotCi0JCU5PVEU6IHRoaXMgd2lsbCByZXR1cm4gdGhlIHN0cmluZyAnbm90IGRlZmluZWQnIGlmCi0JCXRoZSBwb3dlciBkb21haW4gaGFzIG5vIHN1c3BlbmQgdG8gbWVtb3J5IHZvbHRhZ2UgZGVmaW5lZCBieQotCQlwbGF0Zm9ybSBjb2RlLgorCQl0aGUgc3lzdGVtIGlzIHN1c3BlbmRlZCB0byBtZW1vcnksIGZvciB2b2x0YWdlIHJlZ3VsYXRvcnMKKwkJaW1wbGVtZW50aW5nIHN1c3BlbmQgdm9sdGFnZSBjb25maWd1cmF0aW9uIGNvbnN0cmFpbnRzLgogCiBXaGF0OgkJL3N5cy9jbGFzcy9yZWd1bGF0b3IvLi4uL3N1c3BlbmRfZGlza19taWNyb3ZvbHRzCiBEYXRlOgkJTWF5IDIwMDgKIEtlcm5lbFZlcnNpb246CTIuNi4yNgogQ29udGFjdDoJTGlhbSBHaXJkd29vZCA8bHJnQHNsaW1sb2dpYy5jby51az4KIERlc2NyaXB0aW9uOgotCQlFYWNoIHJlZ3VsYXRvciBkaXJlY3Rvcnkgd2lsbCBjb250YWluIGEgZmllbGQgY2FsbGVkCisJCVNvbWUgcmVndWxhdG9yIGRpcmVjdG9yaWVzIHdpbGwgY29udGFpbiBhIGZpZWxkIGNhbGxlZAogCQlzdXNwZW5kX2Rpc2tfbWljcm92b2x0cy4gVGhpcyBob2xkcyB0aGUgcmVndWxhdG9yIG91dHB1dAogCQl2b2x0YWdlIHNldHRpbmcgZm9yIHRoaXMgZG9tYWluIG1lYXN1cmVkIGluIG1pY3Jvdm9sdHMgd2hlbgotCQl0aGUgc3lzdGVtIGlzIHN1c3BlbmRlZCB0byBkaXNrLgotCi0JCU5PVEU6IHRoaXMgd2lsbCByZXR1cm4gdGhlIHN0cmluZyAnbm90IGRlZmluZWQnIGlmCi0JCXRoZSBwb3dlciBkb21haW4gaGFzIG5vIHN1c3BlbmQgdG8gZGlzayB2b2x0YWdlIGRlZmluZWQgYnkKLQkJcGxhdGZvcm0gY29kZS4KKwkJdGhlIHN5c3RlbSBpcyBzdXNwZW5kZWQgdG8gZGlzaywgZm9yIHZvbHRhZ2UgcmVndWxhdG9ycworCQlpbXBsZW1lbnRpbmcgc3VzcGVuZCB2b2x0YWdlIGNvbmZpZ3VyYXRpb24gY29uc3RyYWludHMuCiAKIFdoYXQ6CQkvc3lzL2NsYXNzL3JlZ3VsYXRvci8uLi4vc3VzcGVuZF9zdGFuZGJ5X21pY3Jvdm9sdHMKIERhdGU6CQlNYXkgMjAwOAogS2VybmVsVmVyc2lvbjoJMi42LjI2CiBDb250YWN0OglMaWFtIEdpcmR3b29kIDxscmdAc2xpbWxvZ2ljLmNvLnVrPgogRGVzY3JpcHRpb246Ci0JCUVhY2ggcmVndWxhdG9yIGRpcmVjdG9yeSB3aWxsIGNvbnRhaW4gYSBmaWVsZCBjYWxsZWQKKwkJU29tZSByZWd1bGF0b3IgZGlyZWN0b3JpZXMgd2lsbCBjb250YWluIGEgZmllbGQgY2FsbGVkCiAJCXN1c3BlbmRfc3RhbmRieV9taWNyb3ZvbHRzLiBUaGlzIGhvbGRzIHRoZSByZWd1bGF0b3Igb3V0cHV0CiAJCXZvbHRhZ2Ugc2V0dGluZyBmb3IgdGhpcyBkb21haW4gbWVhc3VyZWQgaW4gbWljcm92b2x0cyB3aGVuCi0JCXRoZSBzeXN0ZW0gaXMgc3VzcGVuZGVkIHRvIHN0YW5kYnkuCi0KLQkJTk9URTogdGhpcyB3aWxsIHJldHVybiB0aGUgc3RyaW5nICdub3QgZGVmaW5lZCcgaWYKLQkJdGhlIHBvd2VyIGRvbWFpbiBoYXMgbm8gc3VzcGVuZCB0byBzdGFuZGJ5IHZvbHRhZ2UgZGVmaW5lZCBieQotCQlwbGF0Zm9ybSBjb2RlLgorCQl0aGUgc3lzdGVtIGlzIHN1c3BlbmRlZCB0byBzdGFuZGJ5LCBmb3Igdm9sdGFnZSByZWd1bGF0b3JzCisJCWltcGxlbWVudGluZyBzdXNwZW5kIHZvbHRhZ2UgY29uZmlndXJhdGlvbiBjb25zdHJhaW50cy4KIAogV2hhdDoJCS9zeXMvY2xhc3MvcmVndWxhdG9yLy4uLi9zdXNwZW5kX21lbV9tb2RlCiBEYXRlOgkJTWF5IDIwMDgKIEtlcm5lbFZlcnNpb246CTIuNi4yNgogQ29udGFjdDoJTGlhbSBHaXJkd29vZCA8bHJnQHNsaW1sb2dpYy5jby51az4KIERlc2NyaXB0aW9uOgotCQlFYWNoIHJlZ3VsYXRvciBkaXJlY3Rvcnkgd2lsbCBjb250YWluIGEgZmllbGQgY2FsbGVkCisJCVNvbWUgcmVndWxhdG9yIGRpcmVjdG9yaWVzIHdpbGwgY29udGFpbiBhIGZpZWxkIGNhbGxlZAogCQlzdXNwZW5kX21lbV9tb2RlLiBUaGlzIGhvbGRzIHRoZSByZWd1bGF0b3Igb3BlcmF0aW5nIG1vZGUKIAkJc2V0dGluZyBmb3IgdGhpcyBkb21haW4gd2hlbiB0aGUgc3lzdGVtIGlzIHN1c3BlbmRlZCB0bwotCQltZW1vcnkuCi0KLQkJTk9URTogdGhpcyB3aWxsIHJldHVybiB0aGUgc3RyaW5nICdub3QgZGVmaW5lZCcgaWYKLQkJdGhlIHBvd2VyIGRvbWFpbiBoYXMgbm8gc3VzcGVuZCB0byBtZW1vcnkgbW9kZSBkZWZpbmVkIGJ5Ci0JCXBsYXRmb3JtIGNvZGUuCisJCW1lbW9yeSwgZm9yIHJlZ3VsYXRvcnMgaW1wbGVtZW50aW5nIHN1c3BlbmQgbW9kZQorCQljb25maWd1cmF0aW9uIGNvbnN0cmFpbnRzLgogCiBXaGF0OgkJL3N5cy9jbGFzcy9yZWd1bGF0b3IvLi4uL3N1c3BlbmRfZGlza19tb2RlCiBEYXRlOgkJTWF5IDIwMDgKIEtlcm5lbFZlcnNpb246CTIuNi4yNgogQ29udGFjdDoJTGlhbSBHaXJkd29vZCA8bHJnQHNsaW1sb2dpYy5jby51az4KIERlc2NyaXB0aW9uOgotCQlFYWNoIHJlZ3VsYXRvciBkaXJlY3Rvcnkgd2lsbCBjb250YWluIGEgZmllbGQgY2FsbGVkCisJCVNvbWUgcmVndWxhdG9yIGRpcmVjdG9yaWVzIHdpbGwgY29udGFpbiBhIGZpZWxkIGNhbGxlZAogCQlzdXNwZW5kX2Rpc2tfbW9kZS4gVGhpcyBob2xkcyB0aGUgcmVndWxhdG9yIG9wZXJhdGluZyBtb2RlCi0JCXNldHRpbmcgZm9yIHRoaXMgZG9tYWluIHdoZW4gdGhlIHN5c3RlbSBpcyBzdXNwZW5kZWQgdG8gZGlzay4KLQotCQlOT1RFOiB0aGlzIHdpbGwgcmV0dXJuIHRoZSBzdHJpbmcgJ25vdCBkZWZpbmVkJyBpZgotCQl0aGUgcG93ZXIgZG9tYWluIGhhcyBubyBzdXNwZW5kIHRvIGRpc2sgbW9kZSBkZWZpbmVkIGJ5Ci0JCXBsYXRmb3JtIGNvZGUuCisJCXNldHRpbmcgZm9yIHRoaXMgZG9tYWluIHdoZW4gdGhlIHN5c3RlbSBpcyBzdXNwZW5kZWQgdG8gZGlzaywKKwkJZm9yIHJlZ3VsYXRvcnMgaW1wbGVtZW50aW5nIHN1c3BlbmQgbW9kZSBjb25maWd1cmF0aW9uCisJCWNvbnN0cmFpbnRzLgogCiBXaGF0OgkJL3N5cy9jbGFzcy9yZWd1bGF0b3IvLi4uL3N1c3BlbmRfc3RhbmRieV9tb2RlCiBEYXRlOgkJTWF5IDIwMDgKIEtlcm5lbFZlcnNpb246CTIuNi4yNgogQ29udGFjdDoJTGlhbSBHaXJkd29vZCA8bHJnQHNsaW1sb2dpYy5jby51az4KIERlc2NyaXB0aW9uOgotCQlFYWNoIHJlZ3VsYXRvciBkaXJlY3Rvcnkgd2lsbCBjb250YWluIGEgZmllbGQgY2FsbGVkCisJCVNvbWUgcmVndWxhdG9yIGRpcmVjdG9yaWVzIHdpbGwgY29udGFpbiBhIGZpZWxkIGNhbGxlZAogCQlzdXNwZW5kX3N0YW5kYnlfbW9kZS4gVGhpcyBob2xkcyB0aGUgcmVndWxhdG9yIG9wZXJhdGluZyBtb2RlCiAJCXNldHRpbmcgZm9yIHRoaXMgZG9tYWluIHdoZW4gdGhlIHN5c3RlbSBpcyBzdXNwZW5kZWQgdG8KLQkJc3RhbmRieS4KLQotCQlOT1RFOiB0aGlzIHdpbGwgcmV0dXJuIHRoZSBzdHJpbmcgJ25vdCBkZWZpbmVkJyBpZgotCQl0aGUgcG93ZXIgZG9tYWluIGhhcyBubyBzdXNwZW5kIHRvIHN0YW5kYnkgbW9kZSBkZWZpbmVkIGJ5Ci0JCXBsYXRmb3JtIGNvZGUuCisJCXN0YW5kYnksIGZvciByZWd1bGF0b3JzIGltcGxlbWVudGluZyBzdXNwZW5kIG1vZGUKKwkJY29uZmlndXJhdGlvbiBjb25zdHJhaW50cy4KIAogV2hhdDoJCS9zeXMvY2xhc3MvcmVndWxhdG9yLy4uLi9zdXNwZW5kX21lbV9zdGF0ZQogRGF0ZToJCU1heSAyMDA4CiBLZXJuZWxWZXJzaW9uOgkyLjYuMjYKIENvbnRhY3Q6CUxpYW0gR2lyZHdvb2QgPGxyZ0BzbGltbG9naWMuY28udWs+CiBEZXNjcmlwdGlvbjoKLQkJRWFjaCByZWd1bGF0b3IgZGlyZWN0b3J5IHdpbGwgY29udGFpbiBhIGZpZWxkIGNhbGxlZAorCQlTb21lIHJlZ3VsYXRvciBkaXJlY3RvcmllcyB3aWxsIGNvbnRhaW4gYSBmaWVsZCBjYWxsZWQKIAkJc3VzcGVuZF9tZW1fc3RhdGUuIFRoaXMgaG9sZHMgdGhlIHJlZ3VsYXRvciBvcGVyYXRpbmcgc3RhdGUKLQkJd2hlbiBzdXNwZW5kZWQgdG8gbWVtb3J5LgorCQl3aGVuIHN1c3BlbmRlZCB0byBtZW1vcnksIGZvciByZWd1bGF0b3JzIGltcGxlbWVudGluZyBzdXNwZW5kCisJCWNvbmZpZ3VyYXRpb24gY29uc3RyYWludHMuCiAKLQkJVGhpcyB3aWxsIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHN0cmluZ3M6Ci0KLQkJJ2VuYWJsZWQnCi0JCSdkaXNhYmxlZCcKLQkJJ25vdCBkZWZpbmVkJworCQlUaGlzIHdpbGwgYmUgb25lIG9mIHRoZSBzYW1lIHN0cmluZ3MgcmVwb3J0ZWQgYnkKKwkJdGhlICJzdGF0ZSIgYXR0cmlidXRlLgogCiBXaGF0OgkJL3N5cy9jbGFzcy9yZWd1bGF0b3IvLi4uL3N1c3BlbmRfZGlza19zdGF0ZQogRGF0ZToJCU1heSAyMDA4CiBLZXJuZWxWZXJzaW9uOgkyLjYuMjYKIENvbnRhY3Q6CUxpYW0gR2lyZHdvb2QgPGxyZ0BzbGltbG9naWMuY28udWs+CiBEZXNjcmlwdGlvbjoKLQkJRWFjaCByZWd1bGF0b3IgZGlyZWN0b3J5IHdpbGwgY29udGFpbiBhIGZpZWxkIGNhbGxlZAorCQlTb21lIHJlZ3VsYXRvciBkaXJlY3RvcmllcyB3aWxsIGNvbnRhaW4gYSBmaWVsZCBjYWxsZWQKIAkJc3VzcGVuZF9kaXNrX3N0YXRlLiBUaGlzIGhvbGRzIHRoZSByZWd1bGF0b3Igb3BlcmF0aW5nIHN0YXRlCi0JCXdoZW4gc3VzcGVuZGVkIHRvIGRpc2suCisJCXdoZW4gc3VzcGVuZGVkIHRvIGRpc2ssIGZvciByZWd1bGF0b3JzIGltcGxlbWVudGluZworCQlzdXNwZW5kIGNvbmZpZ3VyYXRpb24gY29uc3RyYWludHMuCiAKLQkJVGhpcyB3aWxsIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHN0cmluZ3M6Ci0KLQkJJ2VuYWJsZWQnCi0JCSdkaXNhYmxlZCcKLQkJJ25vdCBkZWZpbmVkJworCQlUaGlzIHdpbGwgYmUgb25lIG9mIHRoZSBzYW1lIHN0cmluZ3MgcmVwb3J0ZWQgYnkKKwkJdGhlICJzdGF0ZSIgYXR0cmlidXRlLgogCiBXaGF0OgkJL3N5cy9jbGFzcy9yZWd1bGF0b3IvLi4uL3N1c3BlbmRfc3RhbmRieV9zdGF0ZQogRGF0ZToJCU1heSAyMDA4CiBLZXJuZWxWZXJzaW9uOgkyLjYuMjYKIENvbnRhY3Q6CUxpYW0gR2lyZHdvb2QgPGxyZ0BzbGltbG9naWMuY28udWs+CiBEZXNjcmlwdGlvbjoKLQkJRWFjaCByZWd1bGF0b3IgZGlyZWN0b3J5IHdpbGwgY29udGFpbiBhIGZpZWxkIGNhbGxlZAorCQlTb21lIHJlZ3VsYXRvciBkaXJlY3RvcmllcyB3aWxsIGNvbnRhaW4gYSBmaWVsZCBjYWxsZWQKIAkJc3VzcGVuZF9zdGFuZGJ5X3N0YXRlLiBUaGlzIGhvbGRzIHRoZSByZWd1bGF0b3Igb3BlcmF0aW5nCi0JCXN0YXRlIHdoZW4gc3VzcGVuZGVkIHRvIHN0YW5kYnkuCisJCXN0YXRlIHdoZW4gc3VzcGVuZGVkIHRvIHN0YW5kYnksIGZvciByZWd1bGF0b3JzIGltcGxlbWVudGluZworCQlzdXNwZW5kIGNvbmZpZ3VyYXRpb24gY29uc3RyYWludHMuCiAKLQkJVGhpcyB3aWxsIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHN0cmluZ3M6Ci0KLQkJJ2VuYWJsZWQnCi0JCSdkaXNhYmxlZCcKLQkJJ25vdCBkZWZpbmVkJworCQlUaGlzIHdpbGwgYmUgb25lIG9mIHRoZSBzYW1lIHN0cmluZ3MgcmVwb3J0ZWQgYnkKKwkJdGhlICJzdGF0ZSIgYXR0cmlidXRlLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1kZXZpY2VzLW1lbW9yeSBiL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtZGV2aWNlcy1tZW1vcnkKaW5kZXggN2ExNmZlMS4uOWZlOTFjMCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1kZXZpY2VzLW1lbW9yeQorKysgYi9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWRldmljZXMtbWVtb3J5CkBAIC02LDcgKzYsNiBAQAogCQlpbnRlcm5hbCBzdGF0ZSBvZiB0aGUga2VybmVsIG1lbW9yeSBibG9ja3MuIEZpbGVzIGNvdWxkIGJlCiAJCWFkZGVkIG9yIHJlbW92ZWQgZHluYW1pY2FsbHkgdG8gcmVwcmVzZW50IGhvdC1hZGQvcmVtb3ZlCiAJCW9wZXJhdGlvbnMuCi0KIFVzZXJzOgkJaG90cGx1ZyBtZW1vcnkgYWRkL3JlbW92ZSB0b29scwogCQlodHRwczovL3czLm9wZW5zb3VyY2UuaWJtLmNvbS9wcm9qZWN0cy9wb3dlcnBjLXV0aWxzLwogCkBAIC0xOSw2ICsxOCw1NiBAQAogCQlUaGlzIGlzIHVzZWZ1bCBmb3IgYSB1c2VyLWxldmVsIGFnZW50IHRvIGRldGVybWluZQogCQlpZGVudGlmeSByZW1vdmFibGUgc2VjdGlvbnMgb2YgdGhlIG1lbW9yeSBiZWZvcmUgYXR0ZW1wdGluZwogCQlwb3RlbnRpYWxseSBleHBlbnNpdmUgaG90LXJlbW92ZSBtZW1vcnkgb3BlcmF0aW9uCi0KIFVzZXJzOgkJaG90cGx1ZyBtZW1vcnkgcmVtb3ZlIHRvb2xzCiAJCWh0dHBzOi8vdzMub3BlbnNvdXJjZS5pYm0uY29tL3Byb2plY3RzL3Bvd2VycGMtdXRpbHMvCisKK1doYXQ6CQkvc3lzL2RldmljZXMvc3lzdGVtL21lbW9yeS9tZW1vcnlYL3BoeXNfZGV2aWNlCitEYXRlOgkJU2VwdGVtYmVyIDIwMDgKK0NvbnRhY3Q6CUJhZGFyaSBQdWxhdmFydHkgPHBiYWRhcmlAdXMuaWJtLmNvbT4KK0Rlc2NyaXB0aW9uOgorCQlUaGUgZmlsZSAvc3lzL2RldmljZXMvc3lzdGVtL21lbW9yeS9tZW1vcnlYL3BoeXNfZGV2aWNlCisJCWlzIHJlYWQtb25seSBhbmQgaXMgZGVzaWduZWQgdG8gc2hvdyB0aGUgbmFtZSBvZiBwaHlzaWNhbAorCQltZW1vcnkgZGV2aWNlLiAgSW1wbGVtZW50YXRpb24gaXMgY3VycmVudGx5IGluY29tcGxldGUuCisKK1doYXQ6CQkvc3lzL2RldmljZXMvc3lzdGVtL21lbW9yeS9tZW1vcnlYL3BoeXNfaW5kZXgKK0RhdGU6CQlTZXB0ZW1iZXIgMjAwOAorQ29udGFjdDoJQmFkYXJpIFB1bGF2YXJ0eSA8cGJhZGFyaUB1cy5pYm0uY29tPgorRGVzY3JpcHRpb246CisJCVRoZSBmaWxlIC9zeXMvZGV2aWNlcy9zeXN0ZW0vbWVtb3J5L21lbW9yeVgvcGh5c19pbmRleAorCQlpcyByZWFkLW9ubHkgYW5kIGNvbnRhaW5zIHRoZSBzZWN0aW9uIElEIGluIGhleGFkZWNpbWFsCisJCXdoaWNoIGlzIGVxdWl2YWxlbnQgdG8gZGVjaW1hbCBYIGNvbnRhaW5lZCBpbiB0aGUKKwkJbWVtb3J5IHNlY3Rpb24gZGlyZWN0b3J5IG5hbWUuCisKK1doYXQ6CQkvc3lzL2RldmljZXMvc3lzdGVtL21lbW9yeS9tZW1vcnlYL3N0YXRlCitEYXRlOgkJU2VwdGVtYmVyIDIwMDgKK0NvbnRhY3Q6CUJhZGFyaSBQdWxhdmFydHkgPHBiYWRhcmlAdXMuaWJtLmNvbT4KK0Rlc2NyaXB0aW9uOgorCQlUaGUgZmlsZSAvc3lzL2RldmljZXMvc3lzdGVtL21lbW9yeS9tZW1vcnlYL3N0YXRlCisJCWlzIHJlYWQtd3JpdGUuICBXaGVuIHJlYWQsIGl0J3MgY29udGVudHMgc2hvdyB0aGUKKwkJb25saW5lL29mZmxpbmUgc3RhdGUgb2YgdGhlIG1lbW9yeSBzZWN0aW9uLiAgV2hlbiB3cml0dGVuLAorCQlyb290IGNhbiB0b2dnbGUgdGhlIHRoZSBvbmxpbmUvb2ZmbGluZSBzdGF0ZSBvZiBhIHJlbW92YWJsZQorCQltZW1vcnkgc2VjdGlvbiAoc2VlIHJlbW92YWJsZSBmaWxlIGRlc2NyaXB0aW9uIGFib3ZlKQorCQl1c2luZyB0aGUgZm9sbG93aW5nIGNvbW1hbmRzLgorCQkjIGVjaG8gb25saW5lID4gL3N5cy9kZXZpY2VzL3N5c3RlbS9tZW1vcnkvbWVtb3J5WC9zdGF0ZQorCQkjIGVjaG8gb2ZmbGluZSA+IC9zeXMvZGV2aWNlcy9zeXN0ZW0vbWVtb3J5L21lbW9yeVgvc3RhdGUKKworCQlGb3IgZXhhbXBsZSwgaWYgL3N5cy9kZXZpY2VzL3N5c3RlbS9tZW1vcnkvbWVtb3J5MjIvcmVtb3ZhYmxlCisJCWNvbnRhaW5zIGEgdmFsdWUgb2YgMSBhbmQKKwkJL3N5cy9kZXZpY2VzL3N5c3RlbS9tZW1vcnkvbWVtb3J5MjIvc3RhdGUgY29udGFpbnMgdGhlCisJCXN0cmluZyAib25saW5lIiB0aGUgZm9sbG93aW5nIGNvbW1hbmQgY2FuIGJlIGV4ZWN1dGVkIGJ5CisJCWJ5IHJvb3QgdG8gb2ZmbGluZSB0aGF0IHNlY3Rpb24uCisJCSMgZWNobyBvZmZsaW5lID4gL3N5cy9kZXZpY2VzL3N5c3RlbS9tZW1vcnkvbWVtb3J5MjIvc3RhdGUKK1VzZXJzOgkJaG90cGx1ZyBtZW1vcnkgcmVtb3ZlIHRvb2xzCisJCWh0dHBzOi8vdzMub3BlbnNvdXJjZS5pYm0uY29tL3Byb2plY3RzL3Bvd2VycGMtdXRpbHMvCisKK1doYXQ6CQkvc3lzL2RldmljZXMvc3lzdGVtL25vZGUvbm9kZVgvbWVtb3J5WQorRGF0ZToJCVNlcHRlbWJlciAyMDA4CitDb250YWN0OglHYXJ5IEhhZGUgPGdhcnloYWRlQHVzLmlibS5jb20+CitEZXNjcmlwdGlvbjoKKwkJV2hlbiBDT05GSUdfTlVNQSBpcyBlbmFibGVkCisJCS9zeXMvZGV2aWNlcy9zeXN0ZW0vbm9kZS9ub2RlWC9tZW1vcnlZIGlzIGEgc3ltYm9saWMgbGluayB0aGF0CisJCXBvaW50cyB0byB0aGUgY29ycmVzcG9uZGluZyAvc3lzL2RldmljZXMvc3lzdGVtL21lbW9yeS9tZW1vcnlZCisJCW1lbW9yeSBzZWN0aW9uIGRpcmVjdG9yeS4gIEZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nIHN5bWJvbGljCisJCWxpbmsgaXMgY3JlYXRlZCBmb3IgbWVtb3J5IHNlY3Rpb24gOSBvbiBub2RlMC4KKwkJL3N5cy9kZXZpY2VzL3N5c3RlbS9ub2RlL25vZGUwL21lbW9yeTkgLT4gLi4vLi4vbWVtb3J5L21lbW9yeTkKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9ETUEtbWFwcGluZy50eHQgYi9Eb2N1bWVudGF0aW9uL0RNQS1tYXBwaW5nLnR4dAppbmRleCBjNzRmZWM4Li5iMmE0ZDZkIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0RNQS1tYXBwaW5nLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL0RNQS1tYXBwaW5nLnR4dApAQCAtMjYsNyArMjYsNyBAQAogdHJhbnNmZXIuCiAKIFRoZSBmb2xsb3dpbmcgQVBJIHdpbGwgd29yayBvZiBjb3Vyc2UgZXZlbiBvbiBwbGF0Zm9ybXMgd2hlcmUgbm8gc3VjaAotaGFyZHdhcmUgZXhpc3RzLCBzZWUgZS5nLiBpbmNsdWRlL2FzbS1pMzg2L3BjaS5oIGZvciBob3cgaXQgaXMgaW1wbGVtZW50ZWQgb24KK2hhcmR3YXJlIGV4aXN0cywgc2VlIGUuZy4gYXJjaC94ODYvaW5jbHVkZS9hc20vcGNpLmggZm9yIGhvdyBpdCBpcyBpbXBsZW1lbnRlZCBvbgogdG9wIG9mIHRoZSB2aXJ0X3RvX2J1cyBpbnRlcmZhY2UuCiAKIEZpcnN0IG9mIGFsbCwgeW91IHNob3VsZCBtYWtlIHN1cmUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay9NYWtlZmlsZSBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9NYWtlZmlsZQppbmRleCAwYTA4MTI2Li5kYzMxNTRlIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svTWFrZWZpbGUKKysrIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL01ha2VmaWxlCkBAIC0xMiw3ICsxMiw3IEBACiAJICAgIGtlcm5lbC1hcGkueG1sIGZpbGVzeXN0ZW1zLnhtbCBsc20ueG1sIHVzYi54bWwga2dkYi54bWwgXAogCSAgICBnYWRnZXQueG1sIGxpYmF0YS54bWwgbXRkbmFuZC54bWwgbGlicnMueG1sIHJhcGlkaW8ueG1sIFwKIAkgICAgZ2VuZXJpY2lycS54bWwgczM5MC1kcml2ZXJzLnhtbCB1aW8taG93dG8ueG1sIHNjc2kueG1sIFwKLQkgICAgbWFjODAyMTEueG1sIGRlYnVnb2JqZWN0cy54bWwgc2gueG1sCisJICAgIG1hYzgwMjExLnhtbCBkZWJ1Z29iamVjdHMueG1sIHNoLnhtbCByZWd1bGF0b3IueG1sCiAKICMjIwogIyBUaGUgYnVpbGQgcHJvY2VzcyBpcyBhcyBmb2xsb3dzICh0YXJnZXRzKToKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay9uZXR3b3JraW5nLnRtcGwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbmV0d29ya2luZy50bXBsCmluZGV4IDYyNzcwN2EuLjU5YWQ2OWEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vRG9jQm9vay9uZXR3b3JraW5nLnRtcGwKKysrIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL25ldHdvcmtpbmcudG1wbApAQCAtNzQsNiArNzQsMTQgQEAKICFFbmV0L3N1bnJwYy9ycGNiX2NsbnQuYwogIUVuZXQvc3VucnBjL2NsbnQuYwogICAgICA8L3NlY3QxPgorICAgICA8c2VjdDE+PHRpdGxlPldpTUFYPC90aXRsZT4KKyFFbmV0L3dpbWF4L29wLW1zZy5jCishRW5ldC93aW1heC9vcC1yZXNldC5jCishRW5ldC93aW1heC9vcC1yZmtpbGwuYworIUVuZXQvd2ltYXgvc3RhY2suYworIUlpbmNsdWRlL25ldC93aW1heC5oCishSWluY2x1ZGUvbGludXgvd2ltYXguaAorICAgICA8L3NlY3QxPgogICA8L2NoYXB0ZXI+CiAKICAgPGNoYXB0ZXIgaWQ9Im5ldGRldiI+CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svcmVndWxhdG9yLnRtcGwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svcmVndWxhdG9yLnRtcGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTNmNGY4ZAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9yZWd1bGF0b3IudG1wbApAQCAtMCwwICsxLDMwNCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhRE9DVFlQRSBib29rIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBEb2NCb29rIFhNTCBWNC4xLjIvL0VOIgorCSJodHRwOi8vd3d3Lm9hc2lzLW9wZW4ub3JnL2RvY2Jvb2sveG1sLzQuMS4yL2RvY2Jvb2t4LmR0ZCIgW10+CisKKzxib29rIGlkPSJyZWd1bGF0b3ItYXBpIj4KKyA8Ym9va2luZm8+CisgIDx0aXRsZT5Wb2x0YWdlIGFuZCBjdXJyZW50IHJlZ3VsYXRvciBBUEk8L3RpdGxlPgorCisgIDxhdXRob3Jncm91cD4KKyAgIDxhdXRob3I+CisgICAgPGZpcnN0bmFtZT5MaWFtPC9maXJzdG5hbWU+CisgICAgPHN1cm5hbWU+R2lyZHdvb2Q8L3N1cm5hbWU+CisgICAgPGFmZmlsaWF0aW9uPgorICAgICA8YWRkcmVzcz4KKyAgICAgIDxlbWFpbD5scmdAc2xpbWxvZ2ljLmNvLnVrPC9lbWFpbD4KKyAgICAgPC9hZGRyZXNzPgorICAgIDwvYWZmaWxpYXRpb24+CisgICA8L2F1dGhvcj4KKyAgIDxhdXRob3I+CisgICAgPGZpcnN0bmFtZT5NYXJrPC9maXJzdG5hbWU+CisgICAgPHN1cm5hbWU+QnJvd248L3N1cm5hbWU+CisgICAgPGFmZmlsaWF0aW9uPgorICAgICA8b3JnbmFtZT5Xb2xmc29uIE1pY3JvZWxlY3Ryb25pY3M8L29yZ25hbWU+CisgICAgIDxhZGRyZXNzPgorICAgICAgPGVtYWlsPmJyb29uaWVAb3BlbnNvdXJjZS53b2xmc29ubWljcm8uY29tPC9lbWFpbD4KKyAgICAgPC9hZGRyZXNzPgorICAgIDwvYWZmaWxpYXRpb24+CisgICA8L2F1dGhvcj4KKyAgPC9hdXRob3Jncm91cD4KKworICA8Y29weXJpZ2h0PgorICAgPHllYXI+MjAwNy0yMDA4PC95ZWFyPgorICAgPGhvbGRlcj5Xb2xmc29uIE1pY3JvZWxlY3Ryb25pY3M8L2hvbGRlcj4KKyAgPC9jb3B5cmlnaHQ+CisgIDxjb3B5cmlnaHQ+CisgICA8eWVhcj4yMDA4PC95ZWFyPgorICAgPGhvbGRlcj5MaWFtIEdpcmR3b29kPC9ob2xkZXI+CisgIDwvY29weXJpZ2h0PgorCisgIDxsZWdhbG5vdGljZT4KKyAgIDxwYXJhPgorICAgICBUaGlzIGRvY3VtZW50YXRpb24gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUKKyAgICAgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICAgICBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAgIDwvcGFyYT4KKworICAgPHBhcmE+CisgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKKyAgICAgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZAorICAgICB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgICAgIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAgIDwvcGFyYT4KKworICAgPHBhcmE+CisgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgICAgIE1BIDAyMTExLTEzMDcgVVNBCisgICA8L3BhcmE+CisKKyAgIDxwYXJhPgorICAgICBGb3IgbW9yZSBkZXRhaWxzIHNlZSB0aGUgZmlsZSBDT1BZSU5HIGluIHRoZSBzb3VyY2UKKyAgICAgZGlzdHJpYnV0aW9uIG9mIExpbnV4LgorICAgPC9wYXJhPgorICA8L2xlZ2Fsbm90aWNlPgorIDwvYm9va2luZm8+CisKKzx0b2M+PC90b2M+CisKKyAgPGNoYXB0ZXIgaWQ9ImludHJvIj4KKyAgICA8dGl0bGU+SW50cm9kdWN0aW9uPC90aXRsZT4KKyAgICA8cGFyYT4KKwlUaGlzIGZyYW1ld29yayBpcyBkZXNpZ25lZCB0byBwcm92aWRlIGEgc3RhbmRhcmQga2VybmVsCisJaW50ZXJmYWNlIHRvIGNvbnRyb2wgdm9sdGFnZSBhbmQgY3VycmVudCByZWd1bGF0b3JzLgorICAgIDwvcGFyYT4KKyAgICA8cGFyYT4KKwlUaGUgaW50ZW50aW9uIGlzIHRvIGFsbG93IHN5c3RlbXMgdG8gZHluYW1pY2FsbHkgY29udHJvbAorCXJlZ3VsYXRvciBwb3dlciBvdXRwdXQgaW4gb3JkZXIgdG8gc2F2ZSBwb3dlciBhbmQgcHJvbG9uZworCWJhdHRlcnkgbGlmZS4gIFRoaXMgYXBwbGllcyB0byBib3RoIHZvbHRhZ2UgcmVndWxhdG9ycyAod2hlcmUKKwl2b2x0YWdlIG91dHB1dCBpcyBjb250cm9sbGFibGUpIGFuZCBjdXJyZW50IHNpbmtzICh3aGVyZSBjdXJyZW50CisJbGltaXQgaXMgY29udHJvbGxhYmxlKS4KKyAgICA8L3BhcmE+CisgICAgPHBhcmE+CisJTm90ZSB0aGF0IGFkZGl0aW9uYWwgKGFuZCBjdXJyZW50bHkgbW9yZSBjb21wbGV0ZSkgZG9jdW1lbnRhdGlvbgorCWlzIGF2YWlsYWJsZSBpbiB0aGUgTGludXgga2VybmVsIHNvdXJjZSB1bmRlcgorCTxmaWxlbmFtZT5Eb2N1bWVudGF0aW9uL3Bvd2VyL3JlZ3VsYXRvcjwvZmlsZW5hbWU+LgorICAgIDwvcGFyYT4KKworICAgIDxzZWN0MSBpZD0iZ2xvc3NhcnkiPgorICAgICAgIDx0aXRsZT5HbG9zc2FyeTwvdGl0bGU+CisgICAgICAgPHBhcmE+CisJVGhlIHJlZ3VsYXRvciBBUEkgdXNlcyBhIG51bWJlciBvZiB0ZXJtcyB3aGljaCBtYXkgbm90IGJlCisJZmFtaWxpYXI6CisgICAgICAgPC9wYXJhPgorICAgICAgIDxnbG9zc2FyeT4KKworICAgICAgICAgPGdsb3NzZW50cnk+CisJICAgPGdsb3NzdGVybT5SZWd1bGF0b3I8L2dsb3NzdGVybT4KKwkgICA8Z2xvc3NkZWY+CisJICAgICA8cGFyYT4KKwlFbGVjdHJvbmljIGRldmljZSB0aGF0IHN1cHBsaWVzIHBvd2VyIHRvIG90aGVyIGRldmljZXMuICBNb3N0CisJcmVndWxhdG9ycyBjYW4gZW5hYmxlIGFuZCBkaXNhYmxlIHRoZWlyIG91dHB1dCBhbmQgc29tZSBjYW4gYWxzbworCWNvbnRyb2wgdGhlaXIgb3V0cHV0IHZvbHRhZ2Ugb3IgY3VycmVudC4KKwkgICAgIDwvcGFyYT4KKwkgICA8L2dsb3NzZGVmPgorICAgICAgICAgPC9nbG9zc2VudHJ5PgorCisJIDxnbG9zc2VudHJ5PgorCSAgIDxnbG9zc3Rlcm0+Q29uc3VtZXI8L2dsb3NzdGVybT4KKwkgICA8Z2xvc3NkZWY+CisJICAgICA8cGFyYT4KKwlFbGVjdHJvbmljIGRldmljZSB3aGljaCBjb25zdW1lcyBwb3dlciBwcm92aWRlZCBieSBhIHJlZ3VsYXRvci4KKwlUaGVzZSBtYXkgZWl0aGVyIGJlIHN0YXRpYywgcmVxdWlyaW5nIG9ubHkgYSBmaXhlZCBzdXBwbHksIG9yCisJZHluYW1pYywgcmVxdWlyaW5nIGFjdGl2ZSBtYW5hZ2VtZW50IG9mIHRoZSByZWd1bGF0b3IgYXQKKwlydW50aW1lLgorCSAgICAgPC9wYXJhPgorCSAgIDwvZ2xvc3NkZWY+CisJIDwvZ2xvc3NlbnRyeT4KKworCSA8Z2xvc3NlbnRyeT4KKwkgICA8Z2xvc3N0ZXJtPlBvd2VyIERvbWFpbjwvZ2xvc3N0ZXJtPgorCSAgIDxnbG9zc2RlZj4KKwkgICAgIDxwYXJhPgorCVRoZSBlbGVjdHJvbmljIGNpcmN1aXQgc3VwcGxpZWQgYnkgYSBnaXZlbiByZWd1bGF0b3IsIGluY2x1ZGluZworCXRoZSByZWd1bGF0b3IgYW5kIGFsbCBjb25zdW1lciBkZXZpY2VzLiAgVGhlIGNvbmZpZ3VyYXRpb24gb2YKKwl0aGUgcmVndWxhdG9yIGlzIHNoYXJlZCBiZXR3ZWVuIGFsbCB0aGUgY29tcG9uZW50cyBpbiB0aGUKKwljaXJjdWl0LgorCSAgICAgPC9wYXJhPgorCSAgIDwvZ2xvc3NkZWY+CisJIDwvZ2xvc3NlbnRyeT4KKworCSA8Z2xvc3NlbnRyeT4KKwkgICA8Z2xvc3N0ZXJtPlBvd2VyIE1hbmFnZW1lbnQgSW50ZWdyYXRlZCBDaXJjdWl0PC9nbG9zc3Rlcm0+CisJICAgPGFjcm9ueW0+UE1JQzwvYWNyb255bT4KKwkgICA8Z2xvc3NkZWY+CisJICAgICA8cGFyYT4KKwlBbiBJQyB3aGljaCBjb250YWlucyBudW1lcm91cyByZWd1bGF0b3JzIGFuZCBvZnRlbiBhbHNvIG90aGVyCisJc3Vic3lzdGVtcy4gIEluIGFuIGVtYmVkZGVkIHN5c3RlbSB0aGUgcHJpbWFyeSBQTUlDIGlzIG9mdGVuCisJZXF1aXZhbGVudCB0byBhIGNvbWJpbmF0aW9uIG9mIHRoZSBQU1UgYW5kIHNvdXRoYnJpZGdlIGluIGEKKwlkZXNrdG9wIHN5c3RlbS4KKwkgICAgIDwvcGFyYT4KKwkgICA8L2dsb3NzZGVmPgorCSA8L2dsb3NzZW50cnk+CisJPC9nbG9zc2FyeT4KKyAgICAgPC9zZWN0MT4KKyAgPC9jaGFwdGVyPgorCisgIDxjaGFwdGVyIGlkPSJjb25zdW1lciI+CisgICAgIDx0aXRsZT5Db25zdW1lciBkcml2ZXIgaW50ZXJmYWNlPC90aXRsZT4KKyAgICAgPHBhcmE+CisgICAgICAgVGhpcyBvZmZlcnMgYSBzaW1pbGFyIEFQSSB0byB0aGUga2VybmVsIGNsb2NrIGZyYW1ld29yay4KKyAgICAgICBDb25zdW1lciBkcml2ZXJzIHVzZSA8bGluaworICAgICAgIGxpbmtlbmQ9J0FQSS1yZWd1bGF0b3ItZ2V0Jz5nZXQ8L2xpbms+IGFuZCA8bGluaworICAgICAgIGxpbmtlbmQ9J0FQSS1yZWd1bGF0b3ItcHV0Jz5wdXQ8L2xpbms+IG9wZXJhdGlvbnMgdG8gYWNxdWlyZSBhbmQKKyAgICAgICByZWxlYXNlIHJlZ3VsYXRvcnMuICBGdW5jdGlvbnMgYXJlCisgICAgICAgcHJvdmlkZWQgdG8gPGxpbmsgbGlua2VuZD0nQVBJLXJlZ3VsYXRvci1lbmFibGUnPmVuYWJsZTwvbGluaz4KKyAgICAgICBhbmQgPGxpbmsgbGlua2VuZD0nQVBJLXJlZ3VsYXRvci1kaXNhYmxlJz5kaXNhYmxlPC9saW5rPiB0aGUKKyAgICAgICByZWd1YXRvciBhbmQgdG8gZ2V0IGFuZCBzZXQgdGhlIHJ1bnRpbWUgcGFyYW1ldGVycyBvZiB0aGUKKyAgICAgICByZWd1bGF0b3IuCisgICAgIDwvcGFyYT4KKyAgICAgPHBhcmE+CisgICAgICAgV2hlbiByZXF1ZXN0aW5nIHJlZ3VsYXRvcnMgY29uc3VtZXJzIHVzZSBzeW1ib2xpYyBuYW1lcyBmb3IgdGhlaXIKKyAgICAgICBzdXBwbGllcywgc3VjaCBhcyAiVmNjIiwgd2hpY2ggYXJlIG1hcHBlZCBpbnRvIGFjdHVhbCByZWd1bGF0b3IKKyAgICAgICBkZXZpY2VzIGJ5IHRoZSBtYWNoaW5lIGludGVyZmFjZS4KKyAgICAgPC9wYXJhPgorICAgICA8cGFyYT4KKwlBIHN0dWIgdmVyc2lvbiBvZiB0aGlzIEFQSSBpcyBwcm92aWRlZCB3aGVuIHRoZSByZWd1bGF0b3IKKwlmcmFtZXdvcmsgaXMgbm90IGluIHVzZSBpbiBvcmRlciB0byBtaW5pbWlzZSB0aGUgbmVlZCB0byB1c2UKKwlpZmRlZnMuCisgICAgIDwvcGFyYT4KKworICAgICA8c2VjdDEgaWQ9ImNvbnN1bWVyLWVuYWJsZSI+CisgICAgICAgPHRpdGxlPkVuYWJsaW5nIGFuZCBkaXNhYmxpbmc8L3RpdGxlPgorICAgICAgIDxwYXJhPgorICAgICAgICAgVGhlIHJlZ3VsYXRvciBBUEkgcHJvdmlkZXMgcmVmZXJlbmNlIGNvdW50ZWQgZW5hYmxpbmcgYW5kCisJIGRpc2FibGluZyBvZiByZWd1bGF0b3JzLiBDb25zdW1lciBkZXZpY2VzIHVzZSB0aGUgPGZ1bmN0aW9uPjxsaW5rCisJIGxpbmtlbmQ9J0FQSS1yZWd1bGF0b3ItZW5hYmxlJz5yZWd1bGF0b3JfZW5hYmxlPC9saW5rPjwvZnVuY3Rpb24+CisJIGFuZCA8ZnVuY3Rpb24+PGxpbmsKKwkgbGlua2VuZD0nQVBJLXJlZ3VsYXRvci1kaXNhYmxlJz5yZWd1bGF0b3JfZGlzYWJsZTwvbGluaz4KKwkgPC9mdW5jdGlvbj4gZnVuY3Rpb25zIHRvIGVuYWJsZSBhbmQgZGlzYWJsZSByZWd1bGF0b3JzLiAgQ2FsbHMKKwkgdG8gdGhlIHR3byBmdW5jdGlvbnMgbXVzdCBiZSBiYWxhbmNlZC4KKyAgICAgICA8L3BhcmE+CisgICAgICAgPHBhcmE+CisgICAgICAgICBOb3RlIHRoYXQgc2luY2UgbXVsdGlwbGUgY29uc3VtZXJzIG1heSBiZSB1c2luZyBhIHJlZ3VsYXRvciBhbmQKKwkgbWFjaGluZSBjb25zdHJhaW50cyBtYXkgbm90IGFsbG93IHRoZSByZWd1bGF0b3IgdG8gYmUgZGlzYWJsZWQKKwkgdGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgY2FsbGluZworCSA8ZnVuY3Rpb24+cmVndWxhdG9yX2Rpc2FibGU8L2Z1bmN0aW9uPiB3aWxsIGFjdHVhbGx5IGNhdXNlIHRoZQorCSBzdXBwbHkgcHJvdmlkZWQgYnkgdGhlIHJlZ3VsYXRvciB0byBiZSBkaXNhYmxlZC4gQ29uc3VtZXIKKwkgZHJpdmVycyBzaG91bGQgYXNzdW1lIHRoYXQgdGhlIHJlZ3VsYXRvciBtYXkgYmUgZW5hYmxlZCBhdCBhbGwKKwkgdGltZXMuCisgICAgICAgPC9wYXJhPgorICAgICA8L3NlY3QxPgorCisgICAgIDxzZWN0MSBpZD0iY29uc3VtZXItY29uZmlnIj4KKyAgICAgICA8dGl0bGU+Q29uZmlndXJhdGlvbjwvdGl0bGU+CisgICAgICAgPHBhcmE+CisgICAgICAgICBTb21lIGNvbnN1bWVyIGRldmljZXMgbWF5IG5lZWQgdG8gYmUgYWJsZSB0byBkeW5hbWljYWxseQorCSBjb25maWd1cmUgdGhlaXIgc3VwcGxpZXMuICBGb3IgZXhhbXBsZSwgTU1DIGRyaXZlcnMgbWF5IG5lZWQgdG8KKwkgc2VsZWN0IHRoZSBjb3JyZWN0IG9wZXJhdGluZyB2b2x0YWdlIGZvciB0aGVpciBjYXJkcy4gIFRoaXMgbWF5CisJIGJlIGRvbmUgd2hpbGUgdGhlIHJlZ3VsYXRvciBpcyBlbmFibGVkIG9yIGRpc2FibGVkLgorICAgICAgIDwvcGFyYT4KKyAgICAgICA8cGFyYT4KKwkgVGhlIDxmdW5jdGlvbj48bGluaworCSBsaW5rZW5kPSdBUEktcmVndWxhdG9yLXNldC12b2x0YWdlJz5yZWd1bGF0b3Jfc2V0X3ZvbHRhZ2U8L2xpbms+CisJIDwvZnVuY3Rpb24+IGFuZCA8ZnVuY3Rpb24+PGxpbmsKKwkgbGlua2VuZD0nQVBJLXJlZ3VsYXRvci1zZXQtY3VycmVudC1saW1pdCcKKwkgPnJlZ3VsYXRvcl9zZXRfY3VycmVudF9saW1pdDwvbGluaz4KKwkgPC9mdW5jdGlvbj4gZnVuY3Rpb25zIHByb3ZpZGUgdGhlIHByaW1hcnkgaW50ZXJmYWNlIGZvciB0aGlzLgorCSBCb3RoIHRha2UgcmFuZ2VzIG9mIHZvbHRhZ2VzIGFuZCBjdXJyZW50cywgc3VwcG9ydGluZyBkcml2ZXJzCisJIHRoYXQgZG8gbm90IHJlcXVpcmUgYSBzcGVjaWZpYyB2YWx1ZSAoZWcsIENQVSBmcmVxdWVuY3kgc2NhbGluZworCSBub3JtYWxseSBwZXJtaXRzIHRoZSBDUFUgdG8gdXNlIGEgd2lkZXIgcmFuZ2Ugb2Ygc3VwcGx5CisJIHZvbHRhZ2VzIGF0IGxvd2VyIGZyZXF1ZW5jaWVzIGJ1dCBkb2VzIG5vdCByZXF1aXJlIHRoYXQgdGhlCisJIHN1cHBseSB2b2x0YWdlIGJlIGxvd2VyZWQpLiAgV2hlcmUgYW4gZXhhY3QgdmFsdWUgaXMgcmVxdWlyZWQKKwkgYm90aCBtaW5pbXVtIGFuZCBtYXhpbXVtIHZhbHVlcyBzaG91bGQgYmUgaWRlbnRpY2FsLgorICAgICAgIDwvcGFyYT4KKyAgICAgPC9zZWN0MT4KKworICAgICA8c2VjdDEgaWQ9ImNvbnN1bWVyLWNhbGxiYWNrIj4KKyAgICAgICA8dGl0bGU+Q2FsbGJhY2tzPC90aXRsZT4KKyAgICAgICA8cGFyYT4KKwkgIENhbGxiYWNrcyBtYXkgYWxzbyBiZSA8bGluaworCSAgbGlua2VuZD0nQVBJLXJlZ3VsYXRvci1yZWdpc3Rlci1ub3RpZmllcic+cmVnaXN0ZXJlZDwvbGluaz4KKwkgIGZvciBldmVudHMgc3VjaCBhcyByZWd1bGF0aW9uIGZhaWx1cmVzLgorICAgICAgIDwvcGFyYT4KKyAgICAgPC9zZWN0MT4KKyAgIDwvY2hhcHRlcj4KKworICAgPGNoYXB0ZXIgaWQ9ImRyaXZlciI+CisgICAgIDx0aXRsZT5SZWd1bGF0b3IgZHJpdmVyIGludGVyZmFjZTwvdGl0bGU+CisgICAgIDxwYXJhPgorICAgICAgIERyaXZlcnMgZm9yIHJlZ3VsYXRvciBjaGlwcyA8bGluaworICAgICAgIGxpbmtlbmQ9J0FQSS1yZWd1bGF0b3ItcmVnaXN0ZXInPnJlZ2lzdGVyPC9saW5rPiB0aGUgcmVndWxhdG9ycworICAgICAgIHdpdGggdGhlIHJlZ3VsYXRvciBjb3JlLCBwcm92aWRpbmcgb3BlcmF0aW9ucyBzdHJ1Y3R1cmVzIHRvIHRoZQorICAgICAgIGNvcmUuICBBIDxsaW5rCisgICAgICAgbGlua2VuZD0nQVBJLXJlZ3VsYXRvci1ub3RpZmllci1jYWxsLWNoYWluJz5ub3RpZmllcjwvbGluaz4gaW50ZXJmYWNlCisgICAgICAgYWxsb3dzIGVycm9yIGNvbmRpdGlvbnMgdG8gYmUgcmVwb3J0ZWQgdG8gdGhlIGNvcmUuCisgICAgIDwvcGFyYT4KKyAgICAgPHBhcmE+CisgICAgICAgUmVnaXN0cmF0aW9uIHNob3VsZCBiZSB0cmlnZ2VyZWQgYnkgZXhwbGljaXQgc2V0dXAgZG9uZSBieSB0aGUKKyAgICAgICBwbGF0Zm9ybSwgc3VwcGx5aW5nIGEgPGxpbmsKKyAgICAgICBsaW5rZW5kPSdBUEktc3RydWN0LXJlZ3VsYXRvci1pbml0LWRhdGEnPnN0cnVjdAorICAgICAgIHJlZ3VsYXRvcl9pbml0X2RhdGE8L2xpbms+IGZvciB0aGUgcmVndWxhdG9yIGNvbnRhaW5pbmcKKyAgICAgICA8bGluayBsaW5rZW5kPSdtYWNoaW5lLWNvbnN0cmFpbnQnPmNvbnN0cmFpbnQ8L2xpbms+IGFuZAorICAgICAgIDxsaW5rIGxpbmtlbmQ9J21hY2hpbmUtc3VwcGx5Jz5zdXBwbHk8L2xpbms+IGluZm9ybWF0aW9uLgorICAgICA8L3BhcmE+CisgICA8L2NoYXB0ZXI+CisKKyAgIDxjaGFwdGVyIGlkPSJtYWNoaW5lIj4KKyAgICAgPHRpdGxlPk1hY2hpbmUgaW50ZXJmYWNlPC90aXRsZT4KKyAgICAgPHBhcmE+CisgICAgICAgVGhpcyBpbnRlcmZhY2UgcHJvdmlkZXMgYSB3YXkgdG8gZGVmaW5lIGhvdyByZWd1bGF0b3JzIGFyZQorICAgICAgIGNvbm5lY3RlZCB0byBjb25zdW1lcnMgb24gYSBnaXZlbiBzeXN0ZW0gYW5kIHdoYXQgdGhlIHZhbGlkCisgICAgICAgb3BlcmF0aW5nIHBhcmFtZXRlcnMgYXJlIGZvciB0aGUgc3lzdGVtLgorICAgICA8L3BhcmE+CisKKyAgICAgPHNlY3QxIGlkPSJtYWNoaW5lLXN1cHBseSI+CisgICAgICAgPHRpdGxlPlN1cHBsaWVzPC90aXRsZT4KKyAgICAgICA8cGFyYT4KKyAgICAgICAgIFJlZ3VsYXRvciBzdXBwbGllcyBhcmUgc3BlY2lmaWVkIHVzaW5nIDxsaW5rCisJIGxpbmtlbmQ9J0FQSS1zdHJ1Y3QtcmVndWxhdG9yLWNvbnN1bWVyLXN1cHBseSc+c3RydWN0CisJIHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHk8L2xpbms+LiAgVGhpcyBpcyBkb25lIGF0CisJIDxsaW5rIGxpbmtlbmQ9J2RyaXZlcic+ZHJpdmVyIHJlZ2lzdHJhdGlvbgorCSB0aW1lPC9saW5rPiBhcyBwYXJ0IG9mIHRoZSBtYWNoaW5lIGNvbnN0cmFpbnRzLgorICAgICAgIDwvcGFyYT4KKyAgICAgPC9zZWN0MT4KKworICAgICA8c2VjdDEgaWQ9Im1hY2hpbmUtY29uc3RyYWludCI+CisgICAgICAgPHRpdGxlPkNvbnN0cmFpbnRzPC90aXRsZT4KKyAgICAgICA8cGFyYT4KKwkgQXMgd2VsbCBhcyBkZWZpbmluaW5nIHRoZSBjb25uZWN0aW9ucyB0aGUgbWFjaGluZSBpbnRlcmZhY2UKKwkgYWxzbyBwcm92aWRlcyBjb25zdHJhaW50cyBkZWZpbmluaW5nIHRoZSBvcGVyYXRpb25zIHRoYXQKKwkgY2xpZW50cyBhcmUgYWxsb3dlZCB0byBwZXJmb3JtIGFuZCB0aGUgcGFyYW1ldGVycyB0aGF0IG1heSBiZQorCSBzZXQuICBUaGlzIGlzIHJlcXVpcmVkIHNpbmNlIGdlbmVyYWxseSByZWd1bGF0b3IgZGV2aWNlcyB3aWxsCisJIG9mZmVyIG1vcmUgZmxleGliaWxpdHkgdGhhbiBpdCBpcyBzYWZlIHRvIHVzZSBvbiBhIGdpdmVuCisJIHN5c3RlbSwgZm9yIGV4YW1wbGUgc3VwcG9ydGluZyBoaWdoZXIgc3VwcGx5IHZvbHRhZ2VzIHRoYW4gdGhlCisJIGNvbnN1bWVycyBhcmUgcmF0ZWQgZm9yLgorICAgICAgIDwvcGFyYT4KKyAgICAgICA8cGFyYT4KKwkgVGhpcyBpcyBkb25lIGF0IDxsaW5rIGxpbmtlbmQ9J2RyaXZlcic+ZHJpdmVyCisJIHJlZ2lzdHJhdGlvbiB0aW1lPC9saW5rPiBieSBwcm92aWRpbmcgYSA8bGluaworCSBsaW5rZW5kPSdBUEktc3RydWN0LXJlZ3VsYXRpb24tY29uc3RyYWludHMnPnN0cnVjdAorCSByZWd1bGF0aW9uX2NvbnN0cmFpbnRzPC9saW5rPi4KKyAgICAgICA8L3BhcmE+CisgICAgICAgPHBhcmE+CisgICAgICAgICBUaGUgY29uc3RyYWludHMgbWF5IGFsc28gc3BlY2lmeSBhbiBpbml0aWFsIGNvbmZpZ3VyYXRpb24gZm9yIHRoZQorICAgICAgICAgcmVndWxhdG9yIGluIHRoZSBjb25zdHJhaW50cywgd2hpY2ggaXMgcGFydGljdWxhcmx5IHVzZWZ1bCBmb3IKKyAgICAgICAgIHVzZSB3aXRoIHN0YXRpYyBjb25zdW1lcnMuCisgICAgICAgPC9wYXJhPgorICAgICA8L3NlY3QxPgorICA8L2NoYXB0ZXI+CisKKyAgPGNoYXB0ZXIgaWQ9ImFwaSI+CisgICAgPHRpdGxlPkFQSSByZWZlcmVuY2U8L3RpdGxlPgorICAgIDxwYXJhPgorICAgICAgRHVlIHRvIGxpbWl0YXRpb25zIG9mIHRoZSBrZXJuZWwgZG9jdW1lbnRhdGlvbiBmcmFtZXdvcmsgYW5kIHRoZQorICAgICAgZXhpc3RpbmcgbGF5b3V0IG9mIHRoZSBzb3VyY2UgY29kZSB0aGUgZW50aXJlIHJlZ3VsYXRvciBBUEkgaXMKKyAgICAgIGRvY3VtZW50ZWQgaGVyZS4KKyAgICA8L3BhcmE+CishSWluY2x1ZGUvbGludXgvcmVndWxhdG9yL2NvbnN1bWVyLmgKKyFJaW5jbHVkZS9saW51eC9yZWd1bGF0b3IvbWFjaGluZS5oCishSWluY2x1ZGUvbGludXgvcmVndWxhdG9yL2RyaXZlci5oCishRWRyaXZlcnMvcmVndWxhdG9yL2NvcmUuYworICA8L2NoYXB0ZXI+Cis8L2Jvb2s+CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdWlvLWhvd3RvLnRtcGwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdWlvLWhvd3RvLnRtcGwKaW5kZXggZGY4N2QxYi4uYjc4N2U0NyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Vpby1ob3d0by50bXBsCisrKyBiL0RvY3VtZW50YXRpb24vRG9jQm9vay91aW8taG93dG8udG1wbApAQCAtNDIsNiArNDIsMTIgQEAKIAogPHJldmhpc3Rvcnk+CiAJPHJldmlzaW9uPgorCTxyZXZudW1iZXI+MC42PC9yZXZudW1iZXI+CisJPGRhdGU+MjAwOC0xMi0wNTwvZGF0ZT4KKwk8YXV0aG9yaW5pdGlhbHM+aGprPC9hdXRob3Jpbml0aWFscz4KKwk8cmV2cmVtYXJrPkFkZGVkIGRlc2NyaXB0aW9uIG9mIHBvcnRpbyBzeXNmcyBhdHRyaWJ1dGVzLjwvcmV2cmVtYXJrPgorCTwvcmV2aXNpb24+CisJPHJldmlzaW9uPgogCTxyZXZudW1iZXI+MC41PC9yZXZudW1iZXI+CiAJPGRhdGU+MjAwOC0wNS0yMjwvZGF0ZT4KIAk8YXV0aG9yaW5pdGlhbHM+aGprPC9hdXRob3Jpbml0aWFscz4KQEAgLTMxOCw2ICszMjQsNTQgQEAKIG9mZnNldCA9IE4gKiBnZXRwYWdlc2l6ZSgpOwogPC9wcm9ncmFtbGlzdGluZz4KIAorPHBhcmE+CisJU29tZXRpbWVzIHRoZXJlIGlzIGhhcmR3YXJlIHdpdGggbWVtb3J5LWxpa2UgcmVnaW9ucyB0aGF0IGNhbiBub3QgYmUKKwltYXBwZWQgd2l0aCB0aGUgdGVjaG5pcXVlIGRlc2NyaWJlZCBoZXJlLCBidXQgdGhlcmUgYXJlIHN0aWxsIHdheXMgdG8KKwlhY2Nlc3MgdGhlbSBmcm9tIHVzZXJzcGFjZS4gVGhlIG1vc3QgY29tbW9uIGV4YW1wbGUgYXJlIHg4NiBpb3BvcnRzLgorCU9uIHg4NiBzeXN0ZW1zLCB1c2Vyc3BhY2UgY2FuIGFjY2VzcyB0aGVzZSBpb3BvcnRzIHVzaW5nCisJPGZ1bmN0aW9uPmlvcGVybSgpPC9mdW5jdGlvbj4sIDxmdW5jdGlvbj5pb3BsKCk8L2Z1bmN0aW9uPiwKKwk8ZnVuY3Rpb24+aW5iKCk8L2Z1bmN0aW9uPiwgPGZ1bmN0aW9uPm91dGIoKTwvZnVuY3Rpb24+LCBhbmQgc2ltaWxhcgorCWZ1bmN0aW9ucy4KKzwvcGFyYT4KKzxwYXJhPgorCVNpbmNlIHRoZXNlIGlvcG9ydCByZWdpb25zIGNhbiBub3QgYmUgbWFwcGVkLCB0aGV5IHdpbGwgbm90IGFwcGVhciB1bmRlcgorCTxmaWxlbmFtZT4vc3lzL2NsYXNzL3Vpby91aW9YL21hcHMvPC9maWxlbmFtZT4gbGlrZSB0aGUgbm9ybWFsIG1lbW9yeQorCWRlc2NyaWJlZCBhYm92ZS4gV2l0aG91dCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcG9ydCByZWdpb25zIGEgaGFyZHdhcmUKKwloYXMgdG8gb2ZmZXIsIGl0IGJlY29tZXMgZGlmZmljdWx0IGZvciB0aGUgdXNlcnNwYWNlIHBhcnQgb2YgdGhlCisJZHJpdmVyIHRvIGZpbmQgb3V0IHdoaWNoIHBvcnRzIGJlbG9uZyB0byB3aGljaCBVSU8gZGV2aWNlLgorPC9wYXJhPgorPHBhcmE+CisJVG8gYWRkcmVzcyB0aGlzIHNpdHVhdGlvbiwgdGhlIG5ldyBkaXJlY3RvcnkKKwk8ZmlsZW5hbWU+L3N5cy9jbGFzcy91aW8vdWlvWC9wb3J0aW8vPC9maWxlbmFtZT4gd2FzIGFkZGVkLiBJdCBvbmx5CisJZXhpc3RzIGlmIHRoZSBkcml2ZXIgd2FudHMgdG8gcGFzcyBpbmZvcm1hdGlvbiBhYm91dCBvbmUgb3IgbW9yZSBwb3J0CisJcmVnaW9ucyB0byB1c2Vyc3BhY2UuIElmIHRoYXQgaXMgdGhlIGNhc2UsIHN1YmRpcmVjdG9yaWVzIG5hbWVkCisJPGZpbGVuYW1lPnBvcnQwPC9maWxlbmFtZT4sIDxmaWxlbmFtZT5wb3J0MTwvZmlsZW5hbWU+LCBhbmQgc28gb24sCisJd2lsbCBhcHBlYXIgdW5kZXJuZWF0aAorCTxmaWxlbmFtZT4vc3lzL2NsYXNzL3Vpby91aW9YL3BvcnRpby88L2ZpbGVuYW1lPi4KKzwvcGFyYT4KKzxwYXJhPgorCUVhY2ggPGZpbGVuYW1lPnBvcnRYLzwvZmlsZW5hbWU+IGRpcmVjdG9yeSBjb250YWlucyB0aHJlZSByZWFkLW9ubHkKKwlmaWxlcyB0aGF0IHNob3cgc3RhcnQsIHNpemUsIGFuZCB0eXBlIG9mIHRoZSBwb3J0IHJlZ2lvbjoKKzwvcGFyYT4KKzxpdGVtaXplZGxpc3Q+Cis8bGlzdGl0ZW0+CisJPHBhcmE+CisJPGZpbGVuYW1lPnN0YXJ0PC9maWxlbmFtZT46IFRoZSBmaXJzdCBwb3J0IG9mIHRoaXMgcmVnaW9uLgorCTwvcGFyYT4KKzwvbGlzdGl0ZW0+Cis8bGlzdGl0ZW0+CisJPHBhcmE+CisJPGZpbGVuYW1lPnNpemU8L2ZpbGVuYW1lPjogVGhlIG51bWJlciBvZiBwb3J0cyBpbiB0aGlzIHJlZ2lvbi4KKwk8L3BhcmE+Cis8L2xpc3RpdGVtPgorPGxpc3RpdGVtPgorCTxwYXJhPgorCTxmaWxlbmFtZT5wb3J0dHlwZTwvZmlsZW5hbWU+OiBBIHN0cmluZyBkZXNjcmliaW5nIHRoZSB0eXBlIG9mIHBvcnQuCisJPC9wYXJhPgorPC9saXN0aXRlbT4KKzwvaXRlbWl6ZWRsaXN0PgorCisKIDwvc2VjdDE+CiA8L2NoYXB0ZXI+CiAKQEAgLTMzOSwxMiArMzkzLDEyIEBACiAKIDxpdGVtaXplZGxpc3Q+CiA8bGlzdGl0ZW0+PHBhcmE+Ci08dmFybmFtZT5jaGFyICpuYW1lPC92YXJuYW1lPjogUmVxdWlyZWQuIFRoZSBuYW1lIG9mIHlvdXIgZHJpdmVyIGFzCis8dmFybmFtZT5jb25zdCBjaGFyICpuYW1lPC92YXJuYW1lPjogUmVxdWlyZWQuIFRoZSBuYW1lIG9mIHlvdXIgZHJpdmVyIGFzCiBpdCB3aWxsIGFwcGVhciBpbiBzeXNmcy4gSSByZWNvbW1lbmQgdXNpbmcgdGhlIG5hbWUgb2YgeW91ciBtb2R1bGUgZm9yIHRoaXMuCiA8L3BhcmE+PC9saXN0aXRlbT4KIAogPGxpc3RpdGVtPjxwYXJhPgotPHZhcm5hbWU+Y2hhciAqdmVyc2lvbjwvdmFybmFtZT46IFJlcXVpcmVkLiBUaGlzIHN0cmluZyBhcHBlYXJzIGluCis8dmFybmFtZT5jb25zdCBjaGFyICp2ZXJzaW9uPC92YXJuYW1lPjogUmVxdWlyZWQuIFRoaXMgc3RyaW5nIGFwcGVhcnMgaW4KIDxmaWxlbmFtZT4vc3lzL2NsYXNzL3Vpby91aW9YL3ZlcnNpb248L2ZpbGVuYW1lPi4KIDwvcGFyYT48L2xpc3RpdGVtPgogCkBAIC0zNTYsNiArNDEwLDEzIEBACiA8L3BhcmE+PC9saXN0aXRlbT4KIAogPGxpc3RpdGVtPjxwYXJhPgorPHZhcm5hbWU+c3RydWN0IHVpb19wb3J0IHBvcnRbIE1BWF9VSU9fUE9SVFNfUkVHSU9OUyBdPC92YXJuYW1lPjogUmVxdWlyZWQKK2lmIHlvdSB3YW50IHRvIHBhc3MgaW5mb3JtYXRpb24gYWJvdXQgaW9wb3J0cyB0byB1c2Vyc3BhY2UuIEZvciBlYWNoIHBvcnQKK3JlZ2lvbiB5b3UgbmVlZCB0byBmaWxsIG9uZSBvZiB0aGUgPHZhcm5hbWU+dWlvX3BvcnQ8L3Zhcm5hbWU+IHN0cnVjdHVyZXMuCitTZWUgdGhlIGRlc2NyaXB0aW9uIGJlbG93IGZvciBkZXRhaWxzLgorPC9wYXJhPjwvbGlzdGl0ZW0+CisKKzxsaXN0aXRlbT48cGFyYT4KIDx2YXJuYW1lPmxvbmcgaXJxPC92YXJuYW1lPjogUmVxdWlyZWQuIElmIHlvdXIgaGFyZHdhcmUgZ2VuZXJhdGVzIGFuCiBpbnRlcnJ1cHQsIGl0J3MgeW91ciBtb2R1bGVzIHRhc2sgdG8gZGV0ZXJtaW5lIHRoZSBpcnEgbnVtYmVyIGR1cmluZwogaW5pdGlhbGl6YXRpb24uIElmIHlvdSBkb24ndCBoYXZlIGEgaGFyZHdhcmUgZ2VuZXJhdGVkIGludGVycnVwdCBidXQKQEAgLTQ0OCw2ICs1MDksNDIgQEAKIDx2YXJuYW1lPnN0cnVjdCB1aW9fbWVtPC92YXJuYW1lPiEgSXQgaXMgdXNlZCBieSB0aGUgVUlPIGZyYW1ld29yawogdG8gc2V0IHVwIHN5c2ZzIGZpbGVzIGZvciB0aGlzIG1hcHBpbmcuIFNpbXBseSBsZWF2ZSBpdCBhbG9uZS4KIDwvcGFyYT4KKworPHBhcmE+CitTb21ldGltZXMsIHlvdXIgZGV2aWNlIGNhbiBoYXZlIG9uZSBvciBtb3JlIHBvcnQgcmVnaW9ucyB3aGljaCBjYW4gbm90IGJlCittYXBwZWQgdG8gdXNlcnNwYWNlLiBCdXQgaWYgdGhlcmUgYXJlIG90aGVyIHBvc3NpYmlsaXRpZXMgZm9yIHVzZXJzcGFjZSB0bworYWNjZXNzIHRoZXNlIHBvcnRzLCBpdCBtYWtlcyBzZW5zZSB0byBtYWtlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBwb3J0cworYXZhaWxhYmxlIGluIHN5c2ZzLiBGb3IgZWFjaCByZWdpb24sIHlvdSBoYXZlIHRvIHNldCB1cCBhCis8dmFybmFtZT5zdHJ1Y3QgdWlvX3BvcnQ8L3Zhcm5hbWU+IGluIHRoZSA8dmFybmFtZT5wb3J0W108L3Zhcm5hbWU+IGFycmF5LgorSGVyZSdzIGEgZGVzY3JpcHRpb24gb2YgdGhlIGZpZWxkcyBvZiA8dmFybmFtZT5zdHJ1Y3QgdWlvX3BvcnQ8L3Zhcm5hbWU+OgorPC9wYXJhPgorCis8aXRlbWl6ZWRsaXN0PgorPGxpc3RpdGVtPjxwYXJhPgorPHZhcm5hbWU+Y2hhciAqcG9ydHR5cGU8L3Zhcm5hbWU+OiBSZXF1aXJlZC4gU2V0IHRoaXMgdG8gb25lIG9mIHRoZSBwcmVkZWZpbmVkCitjb25zdGFudHMuIFVzZSA8dmFybmFtZT5VSU9fUE9SVF9YODY8L3Zhcm5hbWU+IGZvciB0aGUgaW9wb3J0cyBmb3VuZCBpbiB4ODYKK2FyY2hpdGVjdHVyZXMuCis8L3BhcmE+PC9saXN0aXRlbT4KKworPGxpc3RpdGVtPjxwYXJhPgorPHZhcm5hbWU+dW5zaWduZWQgbG9uZyBzdGFydDwvdmFybmFtZT46IFJlcXVpcmVkIGlmIHRoZSBwb3J0IHJlZ2lvbiBpcyB1c2VkLgorRmlsbCBpbiB0aGUgbnVtYmVyIG9mIHRoZSBmaXJzdCBwb3J0IG9mIHRoaXMgcmVnaW9uLgorPC9wYXJhPjwvbGlzdGl0ZW0+CisKKzxsaXN0aXRlbT48cGFyYT4KKzx2YXJuYW1lPnVuc2lnbmVkIGxvbmcgc2l6ZTwvdmFybmFtZT46IEZpbGwgaW4gdGhlIG51bWJlciBvZiBwb3J0cyBpbiB0aGlzCityZWdpb24uIElmIDx2YXJuYW1lPnNpemU8L3Zhcm5hbWU+IGlzIHplcm8sIHRoZSByZWdpb24gaXMgY29uc2lkZXJlZCB1bnVzZWQuCitOb3RlIHRoYXQgeW91IDxlbXBoYXNpcz5tdXN0PC9lbXBoYXNpcz4gaW5pdGlhbGl6ZSA8dmFybmFtZT5zaXplPC92YXJuYW1lPgord2l0aCB6ZXJvIGZvciBhbGwgdW51c2VkIHJlZ2lvbnMuCis8L3BhcmE+PC9saXN0aXRlbT4KKzwvaXRlbWl6ZWRsaXN0PgorCis8cGFyYT4KK1BsZWFzZSBkbyBub3QgdG91Y2ggdGhlIDx2YXJuYW1lPnBvcnRpbzwvdmFybmFtZT4gZWxlbWVudCBvZgorPHZhcm5hbWU+c3RydWN0IHVpb19wb3J0PC92YXJuYW1lPiEgSXQgaXMgdXNlZCBpbnRlcm5hbGx5IGJ5IHRoZSBVSU8KK2ZyYW1ld29yayB0byBzZXQgdXAgc3lzZnMgZmlsZXMgZm9yIHRoaXMgcmVnaW9uLiBTaW1wbHkgbGVhdmUgaXQgYWxvbmUuCis8L3BhcmE+CisKIDwvc2VjdDE+CiAKIDxzZWN0MSBpZD0iYWRkaW5nX2lycV9oYW5kbGVyIj4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vUENJL3BjaS50eHQgYi9Eb2N1bWVudGF0aW9uL1BDSS9wY2kudHh0CmluZGV4IGZkNDkwN2EuLjdmNmRlNmUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vUENJL3BjaS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9QQ0kvcGNpLnR4dApAQCAtMjk0LDcgKzI5NCw4IEBACiAKIHBjaV9zZXRfbWFzdGVyKCkgd2lsbCBlbmFibGUgRE1BIGJ5IHNldHRpbmcgdGhlIGJ1cyBtYXN0ZXIgYml0CiBpbiB0aGUgUENJX0NPTU1BTkQgcmVnaXN0ZXIuIEl0IGFsc28gZml4ZXMgdGhlIGxhdGVuY3kgdGltZXIgdmFsdWUgaWYKLWl0J3Mgc2V0IHRvIHNvbWV0aGluZyBib2d1cyBieSB0aGUgQklPUy4KK2l0J3Mgc2V0IHRvIHNvbWV0aGluZyBib2d1cyBieSB0aGUgQklPUy4gIHBjaV9jbGVhcl9tYXN0ZXIoKSB3aWxsCitkaXNhYmxlIERNQSBieSBjbGVhcmluZyB0aGUgYnVzIG1hc3RlciBiaXQuCiAKIElmIHRoZSBQQ0kgZGV2aWNlIGNhbiB1c2UgdGhlIFBDSSBNZW1vcnktV3JpdGUtSW52YWxpZGF0ZSB0cmFuc2FjdGlvbiwKIGNhbGwgcGNpX3NldF9td2koKS4gIFRoaXMgZW5hYmxlcyB0aGUgUENJX0NPTU1BTkQgYml0IGZvciBNZW0tV3ItSW52YWwKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vUkNVLzAwLUlOREVYIGIvRG9jdW1lbnRhdGlvbi9SQ1UvMDAtSU5ERVgKaW5kZXggN2RjMDY5NS4uOWJiNjJmNyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9SQ1UvMDAtSU5ERVgKKysrIGIvRG9jdW1lbnRhdGlvbi9SQ1UvMDAtSU5ERVgKQEAgLTEyLDYgKzEyLDggQEAKIAktIFJlZmVyZW5jZS1jb3VudCBkZXNpZ24gZm9yIGVsZW1lbnRzIG9mIGxpc3RzL2FycmF5cyBwcm90ZWN0ZWQgYnkgUkNVCiByY3UudHh0CiAJLSBSQ1UgQ29uY2VwdHMKK3JjdWJhcnJpZXIudHh0CisJLSBVbmxvYWRpbmcgbW9kdWxlcyB0aGF0IHVzZSBSQ1UgY2FsbGJhY2tzCiBSVEZQLnR4dAogCS0gTGlzdCBvZiBSQ1UgcGFwZXJzIChiaWJsaW9ncmFwaHkpIGdvaW5nIGJhY2sgdG8gMTk4MC4KIHRvcnR1cmUudHh0CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL1JDVS9yY3ViYXJyaWVyLnR4dCBiL0RvY3VtZW50YXRpb24vUkNVL3JjdWJhcnJpZXIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwOTYwMmQKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL1JDVS9yY3ViYXJyaWVyLnR4dApAQCAtMCwwICsxLDMwNCBAQAorUkNVIGFuZCBVbmxvYWRhYmxlIE1vZHVsZXMKKworW09yaWdpbmFsbHkgcHVibGlzaGVkIGluIExXTiBKYW4uIDE0LCAyMDA3OiBodHRwOi8vbHduLm5ldC9BcnRpY2xlcy8yMTc0ODQvXQorCitSQ1UgKHJlYWQtY29weSB1cGRhdGUpIGlzIGEgc3luY2hyb25pemF0aW9uIG1lY2hhbmlzbSB0aGF0IGNhbiBiZSB0aG91Z2h0CitvZiBhcyBhIHJlcGxhY2VtZW50IGZvciByZWFkLXdyaXRlciBsb2NraW5nIChhbW9uZyBvdGhlciB0aGluZ3MpLCBidXQgd2l0aAordmVyeSBsb3ctb3ZlcmhlYWQgcmVhZGVycyB0aGF0IGFyZSBpbW11bmUgdG8gZGVhZGxvY2ssIHByaW9yaXR5IGludmVyc2lvbiwKK2FuZCB1bmJvdW5kZWQgbGF0ZW5jeS4gUkNVIHJlYWQtc2lkZSBjcml0aWNhbCBzZWN0aW9ucyBhcmUgZGVsaW1pdGVkCitieSByY3VfcmVhZF9sb2NrKCkgYW5kIHJjdV9yZWFkX3VubG9jaygpLCB3aGljaCwgaW4gbm9uLUNPTkZJR19QUkVFTVBUCitrZXJuZWxzLCBnZW5lcmF0ZSBubyBjb2RlIHdoYXRzb2V2ZXIuCisKK1RoaXMgbWVhbnMgdGhhdCBSQ1Ugd3JpdGVycyBhcmUgdW5hd2FyZSBvZiB0aGUgcHJlc2VuY2Ugb2YgY29uY3VycmVudAorcmVhZGVycywgc28gdGhhdCBSQ1UgdXBkYXRlcyB0byBzaGFyZWQgZGF0YSBtdXN0IGJlIHVuZGVydGFrZW4gcXVpdGUKK2NhcmVmdWxseSwgbGVhdmluZyBhbiBvbGQgdmVyc2lvbiBvZiB0aGUgZGF0YSBzdHJ1Y3R1cmUgaW4gcGxhY2UgdW50aWwgYWxsCitwcmUtZXhpc3RpbmcgcmVhZGVycyBoYXZlIGZpbmlzaGVkLiBUaGVzZSBvbGQgdmVyc2lvbnMgYXJlIG5lZWRlZCBiZWNhdXNlCitzdWNoIHJlYWRlcnMgbWlnaHQgaG9sZCBhIHJlZmVyZW5jZSB0byB0aGVtLiBSQ1UgdXBkYXRlcyBjYW4gdGhlcmVmb3JlIGJlCityYXRoZXIgZXhwZW5zaXZlLCBhbmQgUkNVIGlzIHRodXMgYmVzdCBzdWl0ZWQgZm9yIHJlYWQtbW9zdGx5IHNpdHVhdGlvbnMuCisKK0hvdyBjYW4gYW4gUkNVIHdyaXRlciBwb3NzaWJseSBkZXRlcm1pbmUgd2hlbiBhbGwgcmVhZGVycyBhcmUgZmluaXNoZWQsCitnaXZlbiB0aGF0IHJlYWRlcnMgbWlnaHQgd2VsbCBsZWF2ZSBhYnNvbHV0ZWx5IG5vIHRyYWNlIG9mIHRoZWlyCitwcmVzZW5jZT8gVGhlcmUgaXMgYSBzeW5jaHJvbml6ZV9yY3UoKSBwcmltaXRpdmUgdGhhdCBibG9ja3MgdW50aWwgYWxsCitwcmUtZXhpc3RpbmcgcmVhZGVycyBoYXZlIGNvbXBsZXRlZC4gQW4gdXBkYXRlciB3aXNoaW5nIHRvIGRlbGV0ZSBhbgorZWxlbWVudCBwIGZyb20gYSBsaW5rZWQgbGlzdCBtaWdodCBkbyB0aGUgZm9sbG93aW5nLCB3aGlsZSBob2xkaW5nIGFuCithcHByb3ByaWF0ZSBsb2NrLCBvZiBjb3Vyc2U6CisKKwlsaXN0X2RlbF9yY3UocCk7CisJc3luY2hyb25pemVfcmN1KCk7CisJa2ZyZWUocCk7CisKK0J1dCB0aGUgYWJvdmUgY29kZSBjYW5ub3QgYmUgdXNlZCBpbiBJUlEgY29udGV4dCAtLSB0aGUgY2FsbF9yY3UoKQorcHJpbWl0aXZlIG11c3QgYmUgdXNlZCBpbnN0ZWFkLiBUaGlzIHByaW1pdGl2ZSB0YWtlcyBhIHBvaW50ZXIgdG8gYW4KK3JjdV9oZWFkIHN0cnVjdCBwbGFjZWQgd2l0aGluIHRoZSBSQ1UtcHJvdGVjdGVkIGRhdGEgc3RydWN0dXJlIGFuZAorYW5vdGhlciBwb2ludGVyIHRvIGEgZnVuY3Rpb24gdGhhdCBtYXkgYmUgaW52b2tlZCBsYXRlciB0byBmcmVlIHRoYXQKK3N0cnVjdHVyZS4gQ29kZSB0byBkZWxldGUgYW4gZWxlbWVudCBwIGZyb20gdGhlIGxpbmtlZCBsaXN0IGZyb20gSVJRCitjb250ZXh0IG1pZ2h0IHRoZW4gYmUgYXMgZm9sbG93czoKKworCWxpc3RfZGVsX3JjdShwKTsKKwljYWxsX3JjdSgmcC0+cmN1LCBwX2NhbGxiYWNrKTsKKworU2luY2UgY2FsbF9yY3UoKSBuZXZlciBibG9ja3MsIHRoaXMgY29kZSBjYW4gc2FmZWx5IGJlIHVzZWQgZnJvbSB3aXRoaW4KK0lSUSBjb250ZXh0LiBUaGUgZnVuY3Rpb24gcF9jYWxsYmFjaygpIG1pZ2h0IGJlIGRlZmluZWQgYXMgZm9sbG93czoKKworCXN0YXRpYyB2b2lkIHBfY2FsbGJhY2soc3RydWN0IHJjdV9oZWFkICpycCkKKwl7CisJCXN0cnVjdCBwc3RydWN0ICpwID0gY29udGFpbmVyX29mKHJwLCBzdHJ1Y3QgcHN0cnVjdCwgcmN1KTsKKworCQlrZnJlZShwKTsKKwl9CisKKworVW5sb2FkaW5nIE1vZHVsZXMgVGhhdCBVc2UgY2FsbF9yY3UoKQorCitCdXQgd2hhdCBpZiBwX2NhbGxiYWNrIGlzIGRlZmluZWQgaW4gYW4gdW5sb2FkYWJsZSBtb2R1bGU/CisKK0lmIHdlIHVubG9hZCB0aGUgbW9kdWxlIHdoaWxlIHNvbWUgUkNVIGNhbGxiYWNrcyBhcmUgcGVuZGluZywKK3RoZSBDUFVzIGV4ZWN1dGluZyB0aGVzZSBjYWxsYmFja3MgYXJlIGdvaW5nIHRvIGJlIHNldmVyZWx5CitkaXNhcHBvaW50ZWQgd2hlbiB0aGV5IGFyZSBsYXRlciBpbnZva2VkLCBhcyBmYW5jaWZ1bGx5IGRlcGljdGVkIGF0CitodHRwOi8vbHduLm5ldC9pbWFnZXMvbnMva2VybmVsL3JjdS1kcm9wLmpwZy4KKworV2UgY291bGQgdHJ5IHBsYWNpbmcgYSBzeW5jaHJvbml6ZV9yY3UoKSBpbiB0aGUgbW9kdWxlLWV4aXQgY29kZSBwYXRoLAorYnV0IHRoaXMgaXMgbm90IHN1ZmZpY2llbnQuIEFsdGhvdWdoIHN5bmNocm9uaXplX3JjdSgpIGRvZXMgd2FpdCBmb3IgYQorZ3JhY2UgcGVyaW9kIHRvIGVsYXBzZSwgaXQgZG9lcyBub3Qgd2FpdCBmb3IgdGhlIGNhbGxiYWNrcyB0byBjb21wbGV0ZS4KKworT25lIG1pZ2h0IGJlIHRlbXB0ZWQgdG8gdHJ5IHNldmVyYWwgYmFjay10by1iYWNrIHN5bmNocm9uaXplX3JjdSgpCitjYWxscywgYnV0IHRoaXMgaXMgc3RpbGwgbm90IGd1YXJhbnRlZWQgdG8gd29yay4gSWYgdGhlcmUgaXMgYSB2ZXJ5CitoZWF2eSBSQ1UtY2FsbGJhY2sgbG9hZCwgdGhlbiBzb21lIG9mIHRoZSBjYWxsYmFja3MgbWlnaHQgYmUgZGVmZXJyZWQKK2luIG9yZGVyIHRvIGFsbG93IG90aGVyIHByb2Nlc3NpbmcgdG8gcHJvY2VlZC4gU3VjaCBkZWZlcnJhbCBpcyByZXF1aXJlZAoraW4gcmVhbHRpbWUga2VybmVscyBpbiBvcmRlciB0byBhdm9pZCBleGNlc3NpdmUgc2NoZWR1bGluZyBsYXRlbmNpZXMuCisKKworcmN1X2JhcnJpZXIoKQorCitXZSBpbnN0ZWFkIG5lZWQgdGhlIHJjdV9iYXJyaWVyKCkgcHJpbWl0aXZlLiBUaGlzIHByaW1pdGl2ZSBpcyBzaW1pbGFyCit0byBzeW5jaHJvbml6ZV9yY3UoKSwgYnV0IGluc3RlYWQgb2Ygd2FpdGluZyBzb2xlbHkgZm9yIGEgZ3JhY2UKK3BlcmlvZCB0byBlbGFwc2UsIGl0IGFsc28gd2FpdHMgZm9yIGFsbCBvdXRzdGFuZGluZyBSQ1UgY2FsbGJhY2tzIHRvCitjb21wbGV0ZS4gUHNldWRvLWNvZGUgdXNpbmcgcmN1X2JhcnJpZXIoKSBpcyBhcyBmb2xsb3dzOgorCisgICAxLiBQcmV2ZW50IGFueSBuZXcgUkNVIGNhbGxiYWNrcyBmcm9tIGJlaW5nIHBvc3RlZC4KKyAgIDIuIEV4ZWN1dGUgcmN1X2JhcnJpZXIoKS4KKyAgIDMuIEFsbG93IHRoZSBtb2R1bGUgdG8gYmUgdW5sb2FkZWQuCisKK1F1aWNrIFF1aXogIzE6IFdoeSBpcyB0aGVyZSBubyBzcmN1X2JhcnJpZXIoKT8KKworVGhlIHJjdXRvcnR1cmUgbW9kdWxlIG1ha2VzIHVzZSBvZiByY3VfYmFycmllciBpbiBpdHMgZXhpdCBmdW5jdGlvbgorYXMgZm9sbG93czoKKworIDEgc3RhdGljIHZvaWQKKyAyIHJjdV90b3J0dXJlX2NsZWFudXAodm9pZCkKKyAzIHsKKyA0ICAgaW50IGk7CisgNQorIDYgICBmdWxsc3RvcCA9IDE7CisgNyAgIGlmIChzaHVmZmxlcl90YXNrICE9IE5VTEwpIHsKKyA4ICAgICBWRVJCT1NFX1BSSU5US19TVFJJTkcoIlN0b3BwaW5nIHJjdV90b3J0dXJlX3NodWZmbGUgdGFzayIpOworIDkgICAgIGt0aHJlYWRfc3RvcChzaHVmZmxlcl90YXNrKTsKKzEwICAgfQorMTEgICBzaHVmZmxlcl90YXNrID0gTlVMTDsKKzEyCisxMyAgIGlmICh3cml0ZXJfdGFzayAhPSBOVUxMKSB7CisxNCAgICAgVkVSQk9TRV9QUklOVEtfU1RSSU5HKCJTdG9wcGluZyByY3VfdG9ydHVyZV93cml0ZXIgdGFzayIpOworMTUgICAgIGt0aHJlYWRfc3RvcCh3cml0ZXJfdGFzayk7CisxNiAgIH0KKzE3ICAgd3JpdGVyX3Rhc2sgPSBOVUxMOworMTgKKzE5ICAgaWYgKHJlYWRlcl90YXNrcyAhPSBOVUxMKSB7CisyMCAgICAgZm9yIChpID0gMDsgaSA8IG5yZWFscmVhZGVyczsgaSsrKSB7CisyMSAgICAgICBpZiAocmVhZGVyX3Rhc2tzW2ldICE9IE5VTEwpIHsKKzIyICAgICAgICAgVkVSQk9TRV9QUklOVEtfU1RSSU5HKAorMjMgICAgICAgICAgICJTdG9wcGluZyByY3VfdG9ydHVyZV9yZWFkZXIgdGFzayIpOworMjQgICAgICAgICBrdGhyZWFkX3N0b3AocmVhZGVyX3Rhc2tzW2ldKTsKKzI1ICAgICAgIH0KKzI2ICAgICAgIHJlYWRlcl90YXNrc1tpXSA9IE5VTEw7CisyNyAgICAgfQorMjggICAgIGtmcmVlKHJlYWRlcl90YXNrcyk7CisyOSAgICAgcmVhZGVyX3Rhc2tzID0gTlVMTDsKKzMwICAgfQorMzEgICByY3VfdG9ydHVyZV9jdXJyZW50ID0gTlVMTDsKKzMyCiszMyAgIGlmIChmYWtld3JpdGVyX3Rhc2tzICE9IE5VTEwpIHsKKzM0ICAgICBmb3IgKGkgPSAwOyBpIDwgbmZha2V3cml0ZXJzOyBpKyspIHsKKzM1ICAgICAgIGlmIChmYWtld3JpdGVyX3Rhc2tzW2ldICE9IE5VTEwpIHsKKzM2ICAgICAgICAgVkVSQk9TRV9QUklOVEtfU1RSSU5HKAorMzcgICAgICAgICAgICJTdG9wcGluZyByY3VfdG9ydHVyZV9mYWtld3JpdGVyIHRhc2siKTsKKzM4ICAgICAgICAga3RocmVhZF9zdG9wKGZha2V3cml0ZXJfdGFza3NbaV0pOworMzkgICAgICAgfQorNDAgICAgICAgZmFrZXdyaXRlcl90YXNrc1tpXSA9IE5VTEw7Cis0MSAgICAgfQorNDIgICAgIGtmcmVlKGZha2V3cml0ZXJfdGFza3MpOworNDMgICAgIGZha2V3cml0ZXJfdGFza3MgPSBOVUxMOworNDQgICB9Cis0NQorNDYgICBpZiAoc3RhdHNfdGFzayAhPSBOVUxMKSB7Cis0NyAgICAgVkVSQk9TRV9QUklOVEtfU1RSSU5HKCJTdG9wcGluZyByY3VfdG9ydHVyZV9zdGF0cyB0YXNrIik7Cis0OCAgICAga3RocmVhZF9zdG9wKHN0YXRzX3Rhc2spOworNDkgICB9Cis1MCAgIHN0YXRzX3Rhc2sgPSBOVUxMOworNTEKKzUyICAgLyogV2FpdCBmb3IgYWxsIFJDVSBjYWxsYmFja3MgdG8gZmlyZS4gKi8KKzUzICAgcmN1X2JhcnJpZXIoKTsKKzU0Cis1NSAgIHJjdV90b3J0dXJlX3N0YXRzX3ByaW50KCk7IC8qIC1BZnRlci0gdGhlIHN0YXRzIHRocmVhZCBpcyBzdG9wcGVkISAqLworNTYKKzU3ICAgaWYgKGN1cl9vcHMtPmNsZWFudXAgIT0gTlVMTCkKKzU4ICAgICBjdXJfb3BzLT5jbGVhbnVwKCk7Cis1OSAgIGlmIChhdG9taWNfcmVhZCgmbl9yY3VfdG9ydHVyZV9lcnJvcikpCis2MCAgICAgcmN1X3RvcnR1cmVfcHJpbnRfbW9kdWxlX3Bhcm1zKCJFbmQgb2YgdGVzdDogRkFJTFVSRSIpOworNjEgICBlbHNlCis2MiAgICAgcmN1X3RvcnR1cmVfcHJpbnRfbW9kdWxlX3Bhcm1zKCJFbmQgb2YgdGVzdDogU1VDQ0VTUyIpOworNjMgfQorCitMaW5lIDYgc2V0cyBhIGdsb2JhbCB2YXJpYWJsZSB0aGF0IHByZXZlbnRzIGFueSBSQ1UgY2FsbGJhY2tzIGZyb20KK3JlLXBvc3RpbmcgdGhlbXNlbHZlcy4gVGhpcyB3aWxsIG5vdCBiZSBuZWNlc3NhcnkgaW4gbW9zdCBjYXNlcywgc2luY2UKK1JDVSBjYWxsYmFja3MgcmFyZWx5IGluY2x1ZGUgY2FsbHMgdG8gY2FsbF9yY3UoKS4gSG93ZXZlciwgdGhlIHJjdXRvcnR1cmUKK21vZHVsZSBpcyBhbiBleGNlcHRpb24gdG8gdGhpcyBydWxlLCBhbmQgdGhlcmVmb3JlIG5lZWRzIHRvIHNldCB0aGlzCitnbG9iYWwgdmFyaWFibGUuCisKK0xpbmVzIDctNTAgc3RvcCBhbGwgdGhlIGtlcm5lbCB0YXNrcyBhc3NvY2lhdGVkIHdpdGggdGhlIHJjdXRvcnR1cmUKK21vZHVsZS4gVGhlcmVmb3JlLCBvbmNlIGV4ZWN1dGlvbiByZWFjaGVzIGxpbmUgNTMsIG5vIG1vcmUgcmN1dG9ydHVyZQorUkNVIGNhbGxiYWNrcyB3aWxsIGJlIHBvc3RlZC4gVGhlIHJjdV9iYXJyaWVyKCkgY2FsbCBvbiBsaW5lIDUzIHdhaXRzCitmb3IgYW55IHByZS1leGlzdGluZyBjYWxsYmFja3MgdG8gY29tcGxldGUuCisKK1RoZW4gbGluZXMgNTUtNjIgcHJpbnQgc3RhdHVzIGFuZCBkbyBvcGVyYXRpb24tc3BlY2lmaWMgY2xlYW51cCwgYW5kCit0aGVuIHJldHVybiwgcGVybWl0dGluZyB0aGUgbW9kdWxlLXVubG9hZCBvcGVyYXRpb24gdG8gYmUgY29tcGxldGVkLgorCitRdWljayBRdWl6ICMyOiBJcyB0aGVyZSBhbnkgb3RoZXIgc2l0dWF0aW9uIHdoZXJlIHJjdV9iYXJyaWVyKCkgbWlnaHQKKwliZSByZXF1aXJlZD8KKworWW91ciBtb2R1bGUgbWlnaHQgaGF2ZSBhZGRpdGlvbmFsIGNvbXBsaWNhdGlvbnMuIEZvciBleGFtcGxlLCBpZiB5b3VyCittb2R1bGUgaW52b2tlcyBjYWxsX3JjdSgpIGZyb20gdGltZXJzLCB5b3Ugd2lsbCBuZWVkIHRvIGZpcnN0IGNhbmNlbCBhbGwKK3RoZSB0aW1lcnMsIGFuZCBvbmx5IHRoZW4gaW52b2tlIHJjdV9iYXJyaWVyKCkgdG8gd2FpdCBmb3IgYW55IHJlbWFpbmluZworUkNVIGNhbGxiYWNrcyB0byBjb21wbGV0ZS4KKworCitJbXBsZW1lbnRpbmcgcmN1X2JhcnJpZXIoKQorCitEaXBhbmthciBTYXJtYSdzIGltcGxlbWVudGF0aW9uIG9mIHJjdV9iYXJyaWVyKCkgbWFrZXMgdXNlIG9mIHRoZSBmYWN0Cit0aGF0IFJDVSBjYWxsYmFja3MgYXJlIG5ldmVyIHJlb3JkZXJlZCBvbmNlIHF1ZXVlZCBvbiBvbmUgb2YgdGhlIHBlci1DUFUKK3F1ZXVlcy4gSGlzIGltcGxlbWVudGF0aW9uIHF1ZXVlcyBhbiBSQ1UgY2FsbGJhY2sgb24gZWFjaCBvZiB0aGUgcGVyLUNQVQorY2FsbGJhY2sgcXVldWVzLCBhbmQgdGhlbiB3YWl0cyB1bnRpbCB0aGV5IGhhdmUgYWxsIHN0YXJ0ZWQgZXhlY3V0aW5nLCBhdAord2hpY2ggcG9pbnQsIGFsbCBlYXJsaWVyIFJDVSBjYWxsYmFja3MgYXJlIGd1YXJhbnRlZWQgdG8gaGF2ZSBjb21wbGV0ZWQuCisKK1RoZSBvcmlnaW5hbCBjb2RlIGZvciByY3VfYmFycmllcigpIHdhcyBhcyBmb2xsb3dzOgorCisgMSB2b2lkIHJjdV9iYXJyaWVyKHZvaWQpCisgMiB7CisgMyAgIEJVR19PTihpbl9pbnRlcnJ1cHQoKSk7CisgNCAgIC8qIFRha2UgY3B1Y29udHJvbCBtdXRleCB0byBwcm90ZWN0IGFnYWluc3QgQ1BVIGhvdHBsdWcgKi8KKyA1ICAgbXV0ZXhfbG9jaygmcmN1X2JhcnJpZXJfbXV0ZXgpOworIDYgICBpbml0X2NvbXBsZXRpb24oJnJjdV9iYXJyaWVyX2NvbXBsZXRpb24pOworIDcgICBhdG9taWNfc2V0KCZyY3VfYmFycmllcl9jcHVfY291bnQsIDApOworIDggICBvbl9lYWNoX2NwdShyY3VfYmFycmllcl9mdW5jLCBOVUxMLCAwLCAxKTsKKyA5ICAgd2FpdF9mb3JfY29tcGxldGlvbigmcmN1X2JhcnJpZXJfY29tcGxldGlvbik7CisxMCAgIG11dGV4X3VubG9jaygmcmN1X2JhcnJpZXJfbXV0ZXgpOworMTEgfQorCitMaW5lIDMgdmVyaWZpZXMgdGhhdCB0aGUgY2FsbGVyIGlzIGluIHByb2Nlc3MgY29udGV4dCwgYW5kIGxpbmVzIDUgYW5kIDEwCit1c2UgcmN1X2JhcnJpZXJfbXV0ZXggdG8gZW5zdXJlIHRoYXQgb25seSBvbmUgcmN1X2JhcnJpZXIoKSBpcyB1c2luZyB0aGUKK2dsb2JhbCBjb21wbGV0aW9uIGFuZCBjb3VudGVycyBhdCBhIHRpbWUsIHdoaWNoIGFyZSBpbml0aWFsaXplZCBvbiBsaW5lcworNiBhbmQgNy4gTGluZSA4IGNhdXNlcyBlYWNoIENQVSB0byBpbnZva2UgcmN1X2JhcnJpZXJfZnVuYygpLCB3aGljaCBpcworc2hvd24gYmVsb3cuIE5vdGUgdGhhdCB0aGUgZmluYWwgIjEiIGluIG9uX2VhY2hfY3B1KCkncyBhcmd1bWVudCBsaXN0CitlbnN1cmVzIHRoYXQgYWxsIHRoZSBjYWxscyB0byByY3VfYmFycmllcl9mdW5jKCkgd2lsbCBoYXZlIGNvbXBsZXRlZAorYmVmb3JlIG9uX2VhY2hfY3B1KCkgcmV0dXJucy4gTGluZSA5IHRoZW4gd2FpdHMgZm9yIHRoZSBjb21wbGV0aW9uLgorCitUaGlzIGNvZGUgd2FzIHJld3JpdHRlbiBpbiAyMDA4IHRvIHN1cHBvcnQgcmN1X2JhcnJpZXJfYmgoKSBhbmQKK3JjdV9iYXJyaWVyX3NjaGVkKCkgaW4gYWRkaXRpb24gdG8gdGhlIG9yaWdpbmFsIHJjdV9iYXJyaWVyKCkuCisKK1RoZSByY3VfYmFycmllcl9mdW5jKCkgcnVucyBvbiBlYWNoIENQVSwgd2hlcmUgaXQgaW52b2tlcyBjYWxsX3JjdSgpCit0byBwb3N0IGFuIFJDVSBjYWxsYmFjaywgYXMgZm9sbG93czoKKworIDEgc3RhdGljIHZvaWQgcmN1X2JhcnJpZXJfZnVuYyh2b2lkICpub3R1c2VkKQorIDIgeworIDMgaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKyA0IHN0cnVjdCByY3VfZGF0YSAqcmRwID0gJnBlcl9jcHUocmN1X2RhdGEsIGNwdSk7CisgNSBzdHJ1Y3QgcmN1X2hlYWQgKmhlYWQ7CisgNgorIDcgaGVhZCA9ICZyZHAtPmJhcnJpZXI7CisgOCBhdG9taWNfaW5jKCZyY3VfYmFycmllcl9jcHVfY291bnQpOworIDkgY2FsbF9yY3UoaGVhZCwgcmN1X2JhcnJpZXJfY2FsbGJhY2spOworMTAgfQorCitMaW5lcyAzIGFuZCA0IGxvY2F0ZSBSQ1UncyBpbnRlcm5hbCBwZXItQ1BVIHJjdV9kYXRhIHN0cnVjdHVyZSwKK3doaWNoIGNvbnRhaW5zIHRoZSBzdHJ1Y3QgcmN1X2hlYWQgdGhhdCBuZWVkZWQgZm9yIHRoZSBsYXRlciBjYWxsIHRvCitjYWxsX3JjdSgpLiBMaW5lIDcgcGlja3MgdXAgYSBwb2ludGVyIHRvIHRoaXMgc3RydWN0IHJjdV9oZWFkLCBhbmQgbGluZQorOCBpbmNyZW1lbnRzIGEgZ2xvYmFsIGNvdW50ZXIuIFRoaXMgY291bnRlciB3aWxsIGxhdGVyIGJlIGRlY3JlbWVudGVkCitieSB0aGUgY2FsbGJhY2suIExpbmUgOSB0aGVuIHJlZ2lzdGVycyB0aGUgcmN1X2JhcnJpZXJfY2FsbGJhY2soKSBvbgordGhlIGN1cnJlbnQgQ1BVJ3MgcXVldWUuCisKK1RoZSByY3VfYmFycmllcl9jYWxsYmFjaygpIGZ1bmN0aW9uIHNpbXBseSBhdG9taWNhbGx5IGRlY3JlbWVudHMgdGhlCityY3VfYmFycmllcl9jcHVfY291bnQgdmFyaWFibGUgYW5kIGZpbmFsaXplcyB0aGUgY29tcGxldGlvbiB3aGVuIGl0CityZWFjaGVzIHplcm8sIGFzIGZvbGxvd3M6CisKKyAxIHN0YXRpYyB2b2lkIHJjdV9iYXJyaWVyX2NhbGxiYWNrKHN0cnVjdCByY3VfaGVhZCAqbm90dXNlZCkKKyAyIHsKKyAzIGlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZyY3VfYmFycmllcl9jcHVfY291bnQpKQorIDQgY29tcGxldGUoJnJjdV9iYXJyaWVyX2NvbXBsZXRpb24pOworIDUgfQorCitRdWljayBRdWl6ICMzOiBXaGF0IGhhcHBlbnMgaWYgQ1BVIDAncyByY3VfYmFycmllcl9mdW5jKCkgZXhlY3V0ZXMKKwlpbW1lZGlhdGVseSAodGh1cyBpbmNyZW1lbnRpbmcgcmN1X2JhcnJpZXJfY3B1X2NvdW50IHRvIHRoZQorCXZhbHVlIG9uZSksIGJ1dCB0aGUgb3RoZXIgQ1BVJ3MgcmN1X2JhcnJpZXJfZnVuYygpIGludm9jYXRpb25zCisJYXJlIGRlbGF5ZWQgZm9yIGEgZnVsbCBncmFjZSBwZXJpb2Q/IENvdWxkbid0IHRoaXMgcmVzdWx0IGluCisJcmN1X2JhcnJpZXIoKSByZXR1cm5pbmcgcHJlbWF0dXJlbHk/CisKKworcmN1X2JhcnJpZXIoKSBTdW1tYXJ5CisKK1RoZSByY3VfYmFycmllcigpIHByaW1pdGl2ZSBoYXMgc2VlbiByZWxhdGl2ZWx5IGxpdHRsZSB1c2UsIHNpbmNlIG1vc3QKK2NvZGUgdXNpbmcgUkNVIGlzIGluIHRoZSBjb3JlIGtlcm5lbCByYXRoZXIgdGhhbiBpbiBtb2R1bGVzLiBIb3dldmVyLCBpZgoreW91IGFyZSB1c2luZyBSQ1UgZnJvbSBhbiB1bmxvYWRhYmxlIG1vZHVsZSwgeW91IG5lZWQgdG8gdXNlIHJjdV9iYXJyaWVyKCkKK3NvIHRoYXQgeW91ciBtb2R1bGUgbWF5IGJlIHNhZmVseSB1bmxvYWRlZC4KKworCitBbnN3ZXJzIHRvIFF1aWNrIFF1aXp6ZXMKKworUXVpY2sgUXVpeiAjMTogV2h5IGlzIHRoZXJlIG5vIHNyY3VfYmFycmllcigpPworCitBbnN3ZXI6IFNpbmNlIHRoZXJlIGlzIG5vIGNhbGxfc3JjdSgpLCB0aGVyZSBjYW4gYmUgbm8gb3V0c3RhbmRpbmcgU1JDVQorCWNhbGxiYWNrcy4gVGhlcmVmb3JlLCB0aGVyZSBpcyBubyBuZWVkIHRvIHdhaXQgZm9yIHRoZW0uCisKK1F1aWNrIFF1aXogIzI6IElzIHRoZXJlIGFueSBvdGhlciBzaXR1YXRpb24gd2hlcmUgcmN1X2JhcnJpZXIoKSBtaWdodAorCWJlIHJlcXVpcmVkPworCitBbnN3ZXI6IEludGVyZXN0aW5nbHkgZW5vdWdoLCByY3VfYmFycmllcigpIHdhcyBub3Qgb3JpZ2luYWxseQorCWltcGxlbWVudGVkIGZvciBtb2R1bGUgdW5sb2FkaW5nLiBOaWtpdGEgRGFuaWxvdiB3YXMgdXNpbmcKKwlSQ1UgaW4gYSBmaWxlc3lzdGVtLCB3aGljaCByZXN1bHRlZCBpbiBhIHNpbWlsYXIgc2l0dWF0aW9uIGF0CisJZmlsZXN5c3RlbS11bm1vdW50IHRpbWUuIERpcGFua2FyIFNhcm1hIGNvZGVkIHVwIHJjdV9iYXJyaWVyKCkKKwlpbiByZXNwb25zZSwgc28gdGhhdCBOaWtpdGEgY291bGQgaW52b2tlIGl0IGR1cmluZyB0aGUKKwlmaWxlc3lzdGVtLXVubW91bnQgcHJvY2Vzcy4KKworCU11Y2ggbGF0ZXIsIHlvdXJzIHRydWx5IGhpdCB0aGUgUkNVIG1vZHVsZS11bmxvYWQgcHJvYmxlbSB3aGVuCisJaW1wbGVtZW50aW5nIHJjdXRvcnR1cmUsIGFuZCBmb3VuZCB0aGF0IHJjdV9iYXJyaWVyKCkgc29sdmVzCisJdGhpcyBwcm9ibGVtIGFzIHdlbGwuCisKK1F1aWNrIFF1aXogIzM6IFdoYXQgaGFwcGVucyBpZiBDUFUgMCdzIHJjdV9iYXJyaWVyX2Z1bmMoKSBleGVjdXRlcworCWltbWVkaWF0ZWx5ICh0aHVzIGluY3JlbWVudGluZyByY3VfYmFycmllcl9jcHVfY291bnQgdG8gdGhlCisJdmFsdWUgb25lKSwgYnV0IHRoZSBvdGhlciBDUFUncyByY3VfYmFycmllcl9mdW5jKCkgaW52b2NhdGlvbnMKKwlhcmUgZGVsYXllZCBmb3IgYSBmdWxsIGdyYWNlIHBlcmlvZD8gQ291bGRuJ3QgdGhpcyByZXN1bHQgaW4KKwlyY3VfYmFycmllcigpIHJldHVybmluZyBwcmVtYXR1cmVseT8KKworQW5zd2VyOiBUaGlzIGNhbm5vdCBoYXBwZW4uIFRoZSByZWFzb24gaXMgdGhhdCBvbl9lYWNoX2NwdSgpIGhhcyBpdHMgbGFzdAorCWFyZ3VtZW50LCB0aGUgd2FpdCBmbGFnLCBzZXQgdG8gIjEiLiBUaGlzIGZsYWcgaXMgcGFzc2VkIHRocm91Z2gKKwl0byBzbXBfY2FsbF9mdW5jdGlvbigpIGFuZCBmdXJ0aGVyIHRvIHNtcF9jYWxsX2Z1bmN0aW9uX29uX2NwdSgpLAorCWNhdXNpbmcgdGhpcyBsYXR0ZXIgdG8gc3BpbiB1bnRpbCB0aGUgY3Jvc3MtQ1BVIGludm9jYXRpb24gb2YKKwlyY3VfYmFycmllcl9mdW5jKCkgaGFzIGNvbXBsZXRlZC4gVGhpcyBieSBpdHNlbGYgd291bGQgcHJldmVudAorCWEgZ3JhY2UgcGVyaW9kIGZyb20gY29tcGxldGluZyBvbiBub24tQ09ORklHX1BSRUVNUFQga2VybmVscywKKwlzaW5jZSBlYWNoIENQVSBtdXN0IHVuZGVyZ28gYSBjb250ZXh0IHN3aXRjaCAob3Igb3RoZXIgcXVpZXNjZW50CisJc3RhdGUpIGJlZm9yZSB0aGUgZ3JhY2UgcGVyaW9kIGNhbiBjb21wbGV0ZS4gSG93ZXZlciwgdGhpcyBpcworCW9mIG5vIHVzZSBpbiBDT05GSUdfUFJFRU1QVCBrZXJuZWxzLgorCisJVGhlcmVmb3JlLCBvbl9lYWNoX2NwdSgpIGRpc2FibGVzIHByZWVtcHRpb24gYWNyb3NzIGl0cyBjYWxsCisJdG8gc21wX2NhbGxfZnVuY3Rpb24oKSBhbmQgYWxzbyBhY3Jvc3MgdGhlIGxvY2FsIGNhbGwgdG8KKwlyY3VfYmFycmllcl9mdW5jKCkuIFRoaXMgcHJldmVudHMgdGhlIGxvY2FsIENQVSBmcm9tIGNvbnRleHQKKwlzd2l0Y2hpbmcsIGFnYWluIHByZXZlbnRpbmcgZ3JhY2UgcGVyaW9kcyBmcm9tIGNvbXBsZXRpbmcuIFRoaXMKKwltZWFucyB0aGF0IGFsbCBDUFVzIGhhdmUgZXhlY3V0ZWQgcmN1X2JhcnJpZXJfZnVuYygpIGJlZm9yZQorCXRoZSBmaXJzdCByY3VfYmFycmllcl9jYWxsYmFjaygpIGNhbiBwb3NzaWJseSBleGVjdXRlLCBpbiB0dXJuCisJcHJldmVudGluZyByY3VfYmFycmllcl9jcHVfY291bnQgZnJvbSBwcmVtYXR1cmVseSByZWFjaGluZyB6ZXJvLgorCisJQ3VycmVudGx5LCAtcnQgaW1wbGVtZW50YXRpb25zIG9mIFJDVSBrZWVwIGJ1dCBhIHNpbmdsZSBnbG9iYWwKKwlxdWV1ZSBmb3IgUkNVIGNhbGxiYWNrcywgYW5kIHRodXMgZG8gbm90IHN1ZmZlciBmcm9tIHRoaXMKKwlwcm9ibGVtLiBIb3dldmVyLCB3aGVuIHRoZSAtcnQgUkNVIGV2ZW50dWFsbHkgZG9lcyBoYXZlIHBlci1DUFUKKwljYWxsYmFjayBxdWV1ZXMsIHRoaW5ncyB3aWxsIGhhdmUgdG8gY2hhbmdlLiBPbmUgc2ltcGxlIGNoYW5nZQorCWlzIHRvIGFkZCBhbiByY3VfcmVhZF9sb2NrKCkgYmVmb3JlIGxpbmUgOCBvZiByY3VfYmFycmllcigpCisJYW5kIGFuIHJjdV9yZWFkX3VubG9jaygpIGFmdGVyIGxpbmUgOCBvZiB0aGlzIHNhbWUgZnVuY3Rpb24uIElmCisJeW91IGNhbiB0aGluayBvZiBhIGJldHRlciBjaGFuZ2UsIHBsZWFzZSBsZXQgbWUga25vdyEKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vYmFkX21lbW9yeS50eHQgYi9Eb2N1bWVudGF0aW9uL2JhZF9tZW1vcnkudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmODQxNjIKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2JhZF9tZW1vcnkudHh0CkBAIC0wLDAgKzEsNDUgQEAKK01hcmNoIDIwMDgKK0phbi1TaW1vbiBNb2VsbGVyLCBkbDlwZkBnbXguZGUKKworCitIb3cgdG8gZGVhbCB3aXRoIGJhZCBtZW1vcnkgZS5nLiByZXBvcnRlZCBieSBtZW10ZXN0ODYrID8KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitUaGVyZSBhcmUgdGhyZWUgcG9zc2liaWxpdGllcyBJIGtub3cgb2Y6CisKKzEpIFJlaW5zZXJ0L3N3YXAgdGhlIG1lbW9yeSBtb2R1bGVzCisKKzIpIEJ1eSBuZXcgbW9kdWxlcyAoYmVzdCEpIG9yIHRyeSB0byBleGNoYW5nZSB0aGUgbWVtb3J5CisgICBpZiB5b3UgaGF2ZSBzcGFyZS1wYXJ0cworCiszKSBVc2UgQmFkUkFNIG9yIG1lbW1hcAorCitUaGlzIEhvd3RvIGlzIGFib3V0IG51bWJlciAzKSAuCisKKworQmFkUkFNCisjIyMjIyMKK0JhZFJBTSBpcyB0aGUgYWN0aXZlbHkgZGV2ZWxvcGVkIGFuZCBhdmFpbGFibGUgYXMga2VybmVsLXBhdGNoCitoZXJlOiAgaHR0cDovL3JpY2sudmFucmVpbi5vcmcvbGludXgvYmFkcmFtLworCitGb3IgbW9yZSBkZXRhaWxzIHNlZSB0aGUgQmFkUkFNIGRvY3VtZW50YXRpb24uCisKK21lbW1hcAorIyMjIyMjCisKK21lbW1hcCBpcyBhbHJlYWR5IGluIHRoZSBrZXJuZWwgYW5kIHVzYWJsZSBhcyBrZXJuZWwtcGFyYW1ldGVyIGF0Citib290LXRpbWUuICBJdHMgc3ludGF4IGlzIHNsaWdodGx5IHN0cmFuZ2UgYW5kIHlvdSBtYXkgbmVlZCB0bworY2FsY3VsYXRlIHRoZSB2YWx1ZXMgYnkgeW91cnNlbGYhCisKK1N5bnRheCB0byBleGNsdWRlIGEgbWVtb3J5IGFyZWEgKHNlZSBrZXJuZWwtcGFyYW1ldGVycy50eHQgZm9yIGRldGFpbHMpOgorbWVtbWFwPTxzaXplPiQ8YWRkcmVzcz4KKworRXhhbXBsZTogbWVtdGVzdDg2KyByZXBvcnRlZCBoZXJlIGVycm9ycyBhdCBhZGRyZXNzIDB4MTg2OTE0NTgsIDB4MTg2OTg0MjQgYW5kCisgICAgICAgICBzb21lIG90aGVycy4gQWxsIGhhZCAweDE4Njl4eHh4IGluIGNvbW1vbiwgc28gSSBjaG9zZSBhIHBhdHRlcm4gb2YKKyAgICAgICAgIDB4MTg2OTAwMDAsMHhmZmZmMDAwMC4KKworV2l0aCB0aGUgbnVtYmVycyBvZiB0aGUgZXhhbXBsZSBhYm92ZToKK21lbW1hcD02NEskMHgxODY5MDAwMAorIG9yCittZW1tYXA9MHgxMDAwMCQweDE4NjkwMDAwCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vYmxhY2tmaW4vMDAtSU5ERVggYi9Eb2N1bWVudGF0aW9uL2JsYWNrZmluLzAwLUlOREVYCmluZGV4IDdjYjNiMzUuLmQ2ODQwYTkgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vYmxhY2tmaW4vMDAtSU5ERVgKKysrIGIvRG9jdW1lbnRhdGlvbi9ibGFja2Zpbi8wMC1JTkRFWApAQCAtOSwzICs5LDYgQEAKIAogRmlsZXN5c3RlbXMKIAktIFJlcXVpcmVtZW50cyBmb3IgbW91bnRpbmcgdGhlIHJvb3QgZmlsZSBzeXN0ZW0uCisKK2JmaW4tZ3Bpby1ub3RlLnR4dAorCS0gTm90ZXMgaW4gZGV2ZWxvcGluZy91c2luZyBiZmluLWdwaW8gZHJpdmVyLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9ibGFja2Zpbi9iZmluLWdwaW8tbm90ZXMudHh0IGIvRG9jdW1lbnRhdGlvbi9ibGFja2Zpbi9iZmluLWdwaW8tbm90ZXMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4OThjN2QKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2JsYWNrZmluL2JmaW4tZ3Bpby1ub3Rlcy50eHQKQEAgLTAsMCArMSw3MSBAQAorLyoKKyAqIEZpbGU6ICAgICAgICAgRG9jdW1lbnRhdGlvbi9ibGFja2Zpbi9iZmluLWdwaW8tbm90ZS50eHQKKyAqIEJhc2VkIG9uOgorICogQXV0aG9yOgorICoKKyAqIENyZWF0ZWQ6ICAgICAgJElkOiBiZmluLWdwaW8tbm90ZS50eHQgMjAwOC0xMS0yNCAxNjo0MiBncmFmeWFuZyAkCisgKiBEZXNjcmlwdGlvbjogIFRoaXMgZmlsZSBjb250YWlucyB0aGUgbm90ZXMgaW4gZGV2ZWxvcGluZy91c2luZyBiZmluLWdwaW8uCisgKgorICoKKyAqIFJldjoKKyAqCisgKiBNb2RpZmllZDoKKyAqICAgICAgICAgICAgICAgQ29weXJpZ2h0IDIwMDQtMjAwOCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKgorICogQnVnczogICAgICAgICBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KKyAqCisgKi8KKworCisxLiBCbGFja2ZpbiBHUElPIGludHJvZHVjdGlvbgorCisgICAgVGhlcmUgYXJlIG1hbnkgR1BJTyBwaW5zIG9uIEJsYWNrZmluLiBNb3N0IG9mIHRoZXNlIHBpbnMgYXJlIG11eGVkIHRvCisgICAgbXVsdGktZnVuY3Rpb25zLiBUaGV5IGNhbiBiZSBjb25maWd1cmVkIGFzIHBlcmlwaGVyYWwsIG9yIGp1c3QgYXMgR1BJTywKKyAgICBjb25maWd1cmVkIHRvIGlucHV0IHdpdGggaW50ZXJydXB0IGVuYWJsZWQsIG9yIG91dHB1dC4KKworICAgIEZvciBkZXRhaWxlZCBpbmZvcm1hdGlvbiwgcGxlYXNlIHNlZSAiYXJjaC9ibGFja2Zpbi9rZXJuZWwvYmZpbl9ncGlvLmMiLAorICAgIG9yIHRoZSByZWxldmFudCBIUk0uCisKKworMi4gQXZvaWRpbmcgcmVzb3VyY2UgY29uZmxpY3QKKworICAgIEZvbGxvd2VkIGZ1bmN0aW9uIGdyb3VwcyBhcmUgdXNlZCB0byBhdm9pZGluZyByZXNvdXJjZSBjb25mbGljdCwKKyAgICAtIFVzZSB0aGUgcGluIGFzIHBlcmlwaGVyYWwsCisJaW50IHBlcmlwaGVyYWxfcmVxdWVzdCh1bnNpZ25lZCBzaG9ydCBwZXIsIGNvbnN0IGNoYXIgKmxhYmVsKTsKKwlpbnQgcGVyaXBoZXJhbF9yZXF1ZXN0X2xpc3QoY29uc3QgdW5zaWduZWQgc2hvcnQgcGVyW10sIGNvbnN0IGNoYXIgKmxhYmVsKTsKKwl2b2lkIHBlcmlwaGVyYWxfZnJlZSh1bnNpZ25lZCBzaG9ydCBwZXIpOworCXZvaWQgcGVyaXBoZXJhbF9mcmVlX2xpc3QoY29uc3QgdW5zaWduZWQgc2hvcnQgcGVyW10pOworICAgIC0gVXNlIHRoZSBwaW4gYXMgR1BJTywKKwlpbnQgYmZpbl9ncGlvX3JlcXVlc3QodW5zaWduZWQgZ3BpbywgY29uc3QgY2hhciAqbGFiZWwpOworCXZvaWQgYmZpbl9ncGlvX2ZyZWUodW5zaWduZWQgZ3Bpbyk7CisgICAgLSBVc2UgdGhlIHBpbiBhcyBHUElPIGludGVycnVwdCwKKwlpbnQgYmZpbl9ncGlvX2lycV9yZXF1ZXN0KHVuc2lnbmVkIGdwaW8sIGNvbnN0IGNoYXIgKmxhYmVsKTsKKwl2b2lkIGJmaW5fZ3Bpb19pcnFfZnJlZSh1bnNpZ25lZCBncGlvKTsKKworICAgIFRoZSByZXF1ZXN0IGZ1bmN0aW9ucyB3aWxsIHJlY29yZCB0aGUgZnVuY3Rpb24gc3RhdGUgZm9yIGEgY2VydGFpbiBwaW4sCisgICAgdGhlIGZyZWUgZnVuY3Rpb25zIHdpbGwgY2xlYXIgaXQncyBmdW5jdGlvbiBzdGF0ZS4KKyAgICBPbmNlIGEgcGluIGlzIHJlcXVlc3RlZCwgaXQgY2FuJ3QgYmUgcmVxdWVzdGVkIGFnYWluIGJlZm9yZSBpdCBpcyBmcmVlZCBieQorICAgIHByZXZpb3VzIGNhbGxlciwgb3RoZXJ3aXNlIGtlcm5lbCB3aWxsIGR1bXAgc3RhY2tzLCBhbmQgdGhlIHJlcXVlc3QKKyAgICBmdW5jdGlvbiBmYWlsLgorICAgIFRoZXNlIGZ1bmN0aW9ucyBhcmUgd3JhcHBlZCBieSBvdGhlciBmdW5jdGlvbnMsIG1vc3Qgb2YgdGhlIHVzZXJzIG5lZWQgbm90CisgICAgY2FyZS4KKworCiszLiBCdXQgdGhlcmUgYXJlIHNvbWUgZXhjZXB0aW9ucworICAgIC0gS2VybmVsIHBlcm1pdCB0aGUgaWRlbnRpY2FsIEdQSU8gYmUgcmVxdWVzdGVkIGJvdGggYXMgR1BJTyBhbmQgR1BJTworICAgIGludGVycnV0LgorICAgIFNvbWUgZHJpdmVycywgbGlrZSBncGlvLWtleXMsIG5lZWQgdGhpcyBiZWhhdmlvci4gS2VybmVsIG9ubHkgcHJpbnQgb3V0CisgICAgd2FybmluZyBtZXNzYWdlcyBsaWtlLAorCWJmaW4tZ3BpbzogR1BJTyAyNCBpcyBhbHJlYWR5IHJlc2VydmVkIGJ5IGdwaW8ta2V5czogQlROMCwgYW5kIHlvdSBhcmUKK2NvbmZpZ3VyaW5nIGl0IGFzIElSUSEKKworICAgICAgICBOb3RlOiBDb25zaWRlciB0aGUgY2FzZSB0aGF0LCBpZiB0aGVyZSBhcmUgdHdvIGRyaXZlcnMgbmVlZCB0aGUKKwlpZGVudGljYWwgR1BJTywgb25lIG9mIHRoZW0gdXNlIGl0IGFzIEdQSU8sIHRoZSBvdGhlciB1c2UgaXQgYXMKKwlHUElPIGludGVycnVwdC4gVGhpcyB3aWxsIHJlYWxseSBjYXVzZSByZXNvdXJjZSBjb25mbGljdC4gU28gaWYKKwl0aGVyZSBpcyBhbnkgYWJub3JtYWwgZHJpdmVyIGJlaGF2aW9yLCBwbGVhc2UgY2hlY2sgdGhlIGJmaW4tZ3BpbworCXdhcm5pbmcgbWVzc2FnZXMuCisKKyAgICAtIEtlcm5lbCBwZXJtaXQgdGhlIGlkZW50aWNhbCBHUElPIGJlIHJlcXVlc3RlZCBmcm9tIHRoZSBzYW1lIGRyaXZlciB0d2ljZS4KKworCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vY2dyb3Vwcy9jZ3JvdXBzLnR4dCBiL0RvY3VtZW50YXRpb24vY2dyb3Vwcy9jZ3JvdXBzLnR4dAppbmRleCBkOTAxNGFhLi5lMzNlZTc0IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2Nncm91cHMvY2dyb3Vwcy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9jZ3JvdXBzL2Nncm91cHMudHh0CkBAIC0yMjcsNyArMjI3LDYgQEAKIGNvbnRhaW5pbmcgdGhlIGZvbGxvd2luZyBmaWxlcyBkZXNjcmliaW5nIHRoYXQgY2dyb3VwOgogCiAgLSB0YXNrczogbGlzdCBvZiB0YXNrcyAoYnkgcGlkKSBhdHRhY2hlZCB0byB0aGF0IGNncm91cAotIC0gcmVsZWFzYWJsZSBmbGFnOiBjZ3JvdXAgY3VycmVudGx5IHJlbW92ZWFibGU/CiAgLSBub3RpZnlfb25fcmVsZWFzZSBmbGFnOiBydW4gdGhlIHJlbGVhc2UgYWdlbnQgb24gZXhpdD8KICAtIHJlbGVhc2VfYWdlbnQ6IHRoZSBwYXRoIHRvIHVzZSBmb3IgcmVsZWFzZSBub3RpZmljYXRpb25zICh0aGlzIGZpbGUKICAgIGV4aXN0cyBpbiB0aGUgdG9wIGNncm91cCBvbmx5KQpAQCAtMzYwLDcgKzM1OSw3IEBACiAKIEluIHRoaXMgZGlyZWN0b3J5IHlvdSBjYW4gZmluZCBzZXZlcmFsIGZpbGVzOgogIyBscwotbm90aWZ5X29uX3JlbGVhc2UgcmVsZWFzYWJsZSB0YXNrcworbm90aWZ5X29uX3JlbGVhc2UgdGFza3MKIChwbHVzIHdoYXRldmVyIGZpbGVzIGFkZGVkIGJ5IHRoZSBhdHRhY2hlZCBzdWJzeXN0ZW1zKQogCiBOb3cgYXR0YWNoIHlvdXIgc2hlbGwgdG8gdGhpcyBjZ3JvdXA6CkBAIC00NzksNyArNDc4LDYgQEAKIGNyZWF0ZSgpIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQgZm9yIHRoZSBuZXcgY2dyb3VwKS4KIAogdm9pZCBwcmVfZGVzdHJveShzdHJ1Y3QgY2dyb3VwX3N1YnN5cyAqc3MsIHN0cnVjdCBjZ3JvdXAgKmNncnApOwotKGNncm91cF9tdXRleCBoZWxkIGJ5IGNhbGxlcikKIAogQ2FsbGVkIGJlZm9yZSBjaGVja2luZyB0aGUgcmVmZXJlbmNlIGNvdW50IG9uIGVhY2ggc3Vic3lzdGVtLiBUaGlzIG1heQogYmUgdXNlZnVsIGZvciBzdWJzeXN0ZW1zIHdoaWNoIGhhdmUgc29tZSBleHRyYSByZWZlcmVuY2VzIGV2ZW4gaWYKQEAgLTQ5OCw2ICs0OTYsNyBAQAogCiB2b2lkIGF0dGFjaChzdHJ1Y3QgY2dyb3VwX3N1YnN5cyAqc3MsIHN0cnVjdCBjZ3JvdXAgKmNncnAsCiAJICAgIHN0cnVjdCBjZ3JvdXAgKm9sZF9jZ3JwLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCisoY2dyb3VwX211dGV4IGhlbGQgYnkgY2FsbGVyKQogCiBDYWxsZWQgYWZ0ZXIgdGhlIHRhc2sgaGFzIGJlZW4gYXR0YWNoZWQgdG8gdGhlIGNncm91cCwgdG8gYWxsb3cgYW55CiBwb3N0LWF0dGFjaG1lbnQgYWN0aXZpdHkgdGhhdCByZXF1aXJlcyBtZW1vcnkgYWxsb2NhdGlvbnMgb3IgYmxvY2tpbmcuCkBAIC01MTEsNiArNTEwLDcgQEAKIENhbGxlZCBkdXJpbmcgdGFzayBleGl0LgogCiBpbnQgcG9wdWxhdGUoc3RydWN0IGNncm91cF9zdWJzeXMgKnNzLCBzdHJ1Y3QgY2dyb3VwICpjZ3JwKQorKGNncm91cF9tdXRleCBoZWxkIGJ5IGNhbGxlcikKIAogQ2FsbGVkIGFmdGVyIGNyZWF0aW9uIG9mIGEgY2dyb3VwIHRvIGFsbG93IGEgc3Vic3lzdGVtIHRvIHBvcHVsYXRlCiB0aGUgY2dyb3VwIGRpcmVjdG9yeSB3aXRoIGZpbGUgZW50cmllcy4gIFRoZSBzdWJzeXN0ZW0gc2hvdWxkIG1ha2UKQEAgLTUyMCw2ICs1MjAsNyBAQAogYWx3YXlzIGhhbmRsZWQgd2VsbC4KIAogdm9pZCBwb3N0X2Nsb25lKHN0cnVjdCBjZ3JvdXBfc3Vic3lzICpzcywgc3RydWN0IGNncm91cCAqY2dycCkKKyhjZ3JvdXBfbXV0ZXggaGVsZCBieSBjYWxsZXIpCiAKIENhbGxlZCBhdCB0aGUgZW5kIG9mIGNncm91cF9jbG9uZSgpIHRvIGRvIGFueSBwYXJhbWF0ZXIKIGluaXRpYWxpemF0aW9uIHdoaWNoIG1pZ2h0IGJlIHJlcXVpcmVkIGJlZm9yZSBhIHRhc2sgY291bGQgYXR0YWNoLiAgRm9yCkBAIC01MjcsNyArNTI4LDcgQEAKIHVwLgogCiB2b2lkIGJpbmQoc3RydWN0IGNncm91cF9zdWJzeXMgKnNzLCBzdHJ1Y3QgY2dyb3VwICpyb290KQotKGNncm91cF9tdXRleCBoZWxkIGJ5IGNhbGxlcikKKyhjZ3JvdXBfbXV0ZXggYW5kIHNzLT5oaWVyYXJjaHlfbXV0ZXggaGVsZCBieSBjYWxsZXIpCiAKIENhbGxlZCB3aGVuIGEgY2dyb3VwIHN1YnN5c3RlbSBpcyByZWJvdW5kIHRvIGEgZGlmZmVyZW50IGhpZXJhcmNoeQogYW5kIHJvb3QgY2dyb3VwLiBDdXJyZW50bHkgdGhpcyB3aWxsIG9ubHkgaW52b2x2ZSBtb3ZlbWVudCBiZXR3ZWVuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2NvbnRyb2xsZXJzL21lbWNnX3Rlc3QudHh0IGIvRG9jdW1lbnRhdGlvbi9jb250cm9sbGVycy9tZW1jZ190ZXN0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOGQ0ZDNlCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9jb250cm9sbGVycy9tZW1jZ190ZXN0LnR4dApAQCAtMCwwICsxLDM0MiBAQAorTWVtb3J5IFJlc291cmNlIENvbnRyb2xsZXIoTWVtY2cpICBJbXBsZW1lbnRhdGlvbiBNZW1vLgorTGFzdCBVcGRhdGVkOiAyMDA4LzEyLzE1CitCYXNlIEtlcm5lbCBWZXJzaW9uOiBiYXNlZCBvbiAyLjYuMjgtcmM4LW1tLgorCitCZWNhdXNlIFZNIGlzIGdldHRpbmcgY29tcGxleCAob25lIG9mIHJlYXNvbnMgaXMgbWVtY2cuLi4pLCBtZW1jZydzIGJlaGF2aW9yCitpcyBjb21wbGV4LiBUaGlzIGlzIGEgZG9jdW1lbnQgZm9yIG1lbWNnJ3MgaW50ZXJuYWwgYmVoYXZpb3IuCitQbGVhc2Ugbm90ZSB0aGF0IGltcGxlbWVudGF0aW9uIGRldGFpbHMgY2FuIGJlIGNoYW5nZWQuCisKKygqKSBUb3BpY3Mgb24gQVBJIHNob3VsZCBiZSBpbiBEb2N1bWVudGF0aW9uL2NvbnRyb2xsZXJzL21lbW9yeS50eHQpCisKKzAuIEhvdyB0byByZWNvcmQgdXNhZ2UgPworICAgMiBvYmplY3RzIGFyZSB1c2VkLgorCisgICBwYWdlX2Nncm91cCAuLi4uYW4gb2JqZWN0IHBlciBwYWdlLgorCUFsbG9jYXRlZCBhdCBib290IG9yIG1lbW9yeSBob3RwbHVnLiBGcmVlZCBhdCBtZW1vcnkgaG90IHJlbW92YWwuCisKKyAgIHN3YXBfY2dyb3VwIC4uLiBhbiBlbnRyeSBwZXIgc3dwX2VudHJ5LgorCUFsbG9jYXRlZCBhdCBzd2Fwb24oKS4gRnJlZWQgYXQgc3dhcG9mZigpLgorCisgICBUaGUgcGFnZV9jZ3JvdXAgaGFzIFVTRUQgYml0IGFuZCBkb3VibGUgY291bnQgYWdhaW5zdCBhIHBhZ2VfY2dyb3VwIG5ldmVyCisgICBvY2N1cnMuIHN3YXBfY2dyb3VwIGlzIHVzZWQgb25seSB3aGVuIGEgY2hhcmdlZCBwYWdlIGlzIHN3YXBwZWQtb3V0LgorCisxLiBDaGFyZ2UKKworICAgYSBwYWdlL3N3cF9lbnRyeSBtYXkgYmUgY2hhcmdlZCAodXNhZ2UgKz0gUEFHRV9TSVpFKSBhdAorCisJbWVtX2Nncm91cF9uZXdwYWdlX2NoYXJnZSgpCisJICBDYWxsZWQgYXQgbmV3IHBhZ2UgZmF1bHQgYW5kIENvcHktT24tV3JpdGUuCisKKwltZW1fY2dyb3VwX3RyeV9jaGFyZ2Vfc3dhcGluKCkKKwkgIENhbGxlZCBhdCBkb19zd2FwX3BhZ2UoKSAocGFnZSBmYXVsdCBvbiBzd2FwIGVudHJ5KSBhbmQgc3dhcG9mZi4KKwkgIEZvbGxvd2VkIGJ5IGNoYXJnZS1jb21taXQtY2FuY2VsIHByb3RvY29sLiAoV2l0aCBzd2FwIGFjY291bnRpbmcpCisJICBBdCBjb21taXQsIGEgY2hhcmdlIHJlY29yZGVkIGluIHN3YXBfY2dyb3VwIGlzIHJlbW92ZWQuCisKKwltZW1fY2dyb3VwX2NhY2hlX2NoYXJnZSgpCisJICBDYWxsZWQgYXQgYWRkX3RvX3BhZ2VfY2FjaGUoKQorCisJbWVtX2Nncm91cF9jYWNoZV9jaGFyZ2Vfc3dhcGluKCkKKwkgIENhbGxlZCBhdCBzaG1lbSdzIHN3YXBpbi4KKworCW1lbV9jZ3JvdXBfcHJlcGFyZV9taWdyYXRpb24oKQorCSAgQ2FsbGVkIGJlZm9yZSBtaWdyYXRpb24uICJleHRyYSIgY2hhcmdlIGlzIGRvbmUgYW5kIGZvbGxvd2VkIGJ5CisJICBjaGFyZ2UtY29tbWl0LWNhbmNlbCBwcm90b2NvbC4KKwkgIEF0IGNvbW1pdCwgY2hhcmdlIGFnYWluc3Qgb2xkcGFnZSBvciBuZXdwYWdlIHdpbGwgYmUgY29tbWl0dGVkLgorCisyLiBVbmNoYXJnZQorICBhIHBhZ2Uvc3dwX2VudHJ5IG1heSBiZSB1bmNoYXJnZWQgKHVzYWdlIC09IFBBR0VfU0laRSkgYnkKKworCW1lbV9jZ3JvdXBfdW5jaGFyZ2VfcGFnZSgpCisJICBDYWxsZWQgd2hlbiBhbiBhbm9ueW1vdXMgcGFnZSBpcyBmdWxseSB1bm1hcHBlZC4gSS5lLiwgbWFwY291bnQgZ29lcworCSAgdG8gMC4gSWYgdGhlIHBhZ2UgaXMgU3dhcENhY2hlLCB1bmNoYXJnZSBpcyBkZWxheWVkIHVudGlsCisJICBtZW1fY2dyb3VwX3VuY2hhcmdlX3N3YXBjYWNoZSgpLgorCisJbWVtX2Nncm91cF91bmNoYXJnZV9jYWNoZV9wYWdlKCkKKwkgIENhbGxlZCB3aGVuIGEgcGFnZS1jYWNoZSBpcyBkZWxldGVkIGZyb20gcmFkaXgtdHJlZS4gSWYgdGhlIHBhZ2UgaXMKKwkgIFN3YXBDYWNoZSwgdW5jaGFyZ2UgaXMgZGVsYXllZCB1bnRpbCBtZW1fY2dyb3VwX3VuY2hhcmdlX3N3YXBjYWNoZSgpLgorCisJbWVtX2Nncm91cF91bmNoYXJnZV9zd2FwY2FjaGUoKQorCSAgQ2FsbGVkIHdoZW4gU3dhcENhY2hlIGlzIHJlbW92ZWQgZnJvbSByYWRpeC10cmVlLiBUaGUgY2hhcmdlIGl0c2VsZgorCSAgaXMgbW92ZWQgdG8gc3dhcF9jZ3JvdXAuIChJZiBtZW0rc3dhcCBjb250cm9sbGVyIGlzIGRpc2FibGVkLCBubworCSAgY2hhcmdlIHRvIHN3YXAgb2NjdXJzLikKKworCW1lbV9jZ3JvdXBfdW5jaGFyZ2Vfc3dhcCgpCisJICBDYWxsZWQgd2hlbiBzd3BfZW50cnkncyByZWZjbnQgZ29lcyBkb3duIHRvIDAuIEEgY2hhcmdlIGFnYWluc3Qgc3dhcAorCSAgZGlzYXBwZWFycy4KKworCW1lbV9jZ3JvdXBfZW5kX21pZ3JhdGlvbihvbGQsIG5ldykKKwlBdCBzdWNjZXNzIG9mIG1pZ3JhdGlvbiBvbGQgaXMgdW5jaGFyZ2VkIChpZiBuZWNlc3NhcnkpLCBhIGNoYXJnZQorCXRvIG5ldyBwYWdlIGlzIGNvbW1pdHRlZC4gQXQgZmFpbHVyZSwgY2hhcmdlIHRvIG9sZCBwYWdlIGlzIGNvbW1pdHRlZC4KKworMy4gY2hhcmdlLWNvbW1pdC1jYW5jZWwKKwlJbiBzb21lIGNhc2UsIHdlIGNhbid0IGtub3cgdGhpcyAiY2hhcmdlIiBpcyB2YWxpZCBvciBub3QgYXQgY2hhcmdpbmcKKwkoYmVjYXVzZSBvZiByYWNlcykuCisJVG8gaGFuZGxlIHN1Y2ggY2FzZSwgdGhlcmUgYXJlIGNoYXJnZS1jb21taXQtY2FuY2VsIGZ1bmN0aW9ucy4KKwkJbWVtX2Nncm91cF90cnlfY2hhcmdlX1hYWAorCQltZW1fY2dyb3VwX2NvbW1pdF9jaGFyZ2VfWFhYCisJCW1lbV9jZ3JvdXBfY2FuY2VsX2NoYXJnZV9YWFgKKwl0aGVzZSBhcmUgdXNlZCBpbiBzd2FwLWluIGFuZCBtaWdyYXRpb24uCisKKwlBdCB0cnlfY2hhcmdlKCksIHRoZXJlIGFyZSBubyBmbGFncyB0byBzYXkgInRoaXMgcGFnZSBpcyBjaGFyZ2VkIi4KKwlhdCB0aGlzIHBvaW50LCB1c2FnZSArPSBQQUdFX1NJWkUuCisKKwlBdCBjb21taXQoKSwgdGhlIGZ1bmN0aW9uIGNoZWNrcyB0aGUgcGFnZSBzaG91bGQgYmUgY2hhcmdlZCBvciBub3QKKwlhbmQgc2V0IGZsYWdzIG9yIGF2b2lkIGNoYXJnaW5nLih1c2FnZSAtPSBQQUdFX1NJWkUpCisKKwlBdCBjYW5jZWwoKSwgc2ltcGx5IHVzYWdlIC09IFBBR0VfU0laRS4KKworVW5kZXIgYmVsb3cgZXhwbGFuYXRpb24sIHdlIGFzc3VtZSBDT05GSUdfTUVNX1JFU19DVFJMX1NXQVA9eS4KKworNC4gQW5vbnltb3VzCisJQW5vbnltb3VzIHBhZ2UgaXMgbmV3bHkgYWxsb2NhdGVkIGF0CisJCSAgLSBwYWdlIGZhdWx0IGludG8gTUFQX0FOT05ZTU9VUyBtYXBwaW5nLgorCQkgIC0gQ29weS1Pbi1Xcml0ZS4KKyAJSXQgaXMgY2hhcmdlZCByaWdodCBhZnRlciBpdCdzIGFsbG9jYXRlZCBiZWZvcmUgZG9pbmcgYW55IHBhZ2UgdGFibGUKKwlyZWxhdGVkIG9wZXJhdGlvbnMuIE9mIGNvdXJzZSwgaXQncyB1bmNoYXJnZWQgd2hlbiBhbm90aGVyIHBhZ2UgaXMgdXNlZAorCWZvciB0aGUgZmF1bHQgYWRkcmVzcy4KKworCUF0IGZyZWVpbmcgYW5vbnltb3VzIHBhZ2UgKGJ5IGV4aXQoKSBvciBtdW5tYXAoKSksIHphcF9wdGUoKSBpcyBjYWxsZWQKKwlhbmQgcGFnZXMgZm9yIHB0ZXMgYXJlIGZyZWVkIG9uZSBieSBvbmUuKHNlZSBtbS9tZW1vcnkuYykuIFVuY2hhcmdlcworCWFyZSBkb25lIGF0IHBhZ2VfcmVtb3ZlX3JtYXAoKSB3aGVuIHBhZ2VfbWFwY291bnQoKSBnb2VzIGRvd24gdG8gMC4KKworCUFub3RoZXIgcGFnZSBmcmVlaW5nIGlzIGJ5IHBhZ2UtcmVjbGFpbSAodm1zY2FuLmMpIGFuZCBhbm9ueW1vdXMKKwlwYWdlcyBhcmUgc3dhcHBlZCBvdXQuIEluIHRoaXMgY2FzZSwgdGhlIHBhZ2UgaXMgbWFya2VkIGFzCisJUGFnZVN3YXBDYWNoZSgpLiB1bmNoYXJnZSgpIHJvdXRpbmUgZG9lc24ndCB1bmNoYXJnZSB0aGUgcGFnZSBtYXJrZWQKKwlhcyBTd2FwQ2FjaGUoKS4gSXQncyBkZWxheWVkIHVudGlsIF9fZGVsZXRlX2Zyb21fc3dhcF9jYWNoZSgpLgorCisJNC4xIFN3YXAtaW4uCisJQXQgc3dhcC1pbiwgdGhlIHBhZ2UgaXMgdGFrZW4gZnJvbSBzd2FwLWNhY2hlLiBUaGVyZSBhcmUgMiBjYXNlcy4KKworCShhKSBJZiB0aGUgU3dhcENhY2hlIGlzIG5ld2x5IGFsbG9jYXRlZCBhbmQgcmVhZCwgaXQgaGFzIG5vIGNoYXJnZXMuCisJKGIpIElmIHRoZSBTd2FwQ2FjaGUgaGFzIGJlZW4gbWFwcGVkIGJ5IHByb2Nlc3NlcywgaXQgaGFzIGJlZW4KKwkgICAgY2hhcmdlZCBhbHJlYWR5LgorCisJVGhpcyBzd2FwLWluIGlzIG9uZSBvZiB0aGUgbW9zdCBjb21wbGljYXRlZCB3b3JrLiBJbiBkb19zd2FwX3BhZ2UoKSwKKwlmb2xsb3dpbmcgZXZlbnRzIG9jY3VyIHdoZW4gcHRlIGlzIHVuY2hhbmdlZC4KKworCSgxKSB0aGUgcGFnZSAoU3dhcENhY2hlKSBpcyBsb29rZWQgdXAuCisJKDIpIGxvY2tfcGFnZSgpCisJKDMpIHRyeV9jaGFyZ2Vfc3dhcGluKCkKKwkoNCkgcmV1c2Vfc3dhcF9wYWdlKCkgKG1heSBjYWxsIGRlbGV0ZV9zd2FwX2NhY2hlKCkpCisJKDUpIGNvbW1pdF9jaGFyZ2Vfc3dhcGluKCkKKwkoNikgc3dhcF9mcmVlKCkuCisKKwlDb25zaWRlcmluZyBmb2xsb3dpbmcgc2l0dWF0aW9uIGZvciBleGFtcGxlLgorCisJKEEpIFRoZSBwYWdlIGhhcyBub3QgYmVlbiBjaGFyZ2VkIGJlZm9yZSAoMikgYW5kIHJldXNlX3N3YXBfcGFnZSgpCisJICAgIGRvZXNuJ3QgY2FsbCBkZWxldGVfZnJvbV9zd2FwX2NhY2hlKCkuCisJKEIpIFRoZSBwYWdlIGhhcyBub3QgYmVlbiBjaGFyZ2VkIGJlZm9yZSAoMikgYW5kIHJldXNlX3N3YXBfcGFnZSgpCisJICAgIGNhbGxzIGRlbGV0ZV9mcm9tX3N3YXBfY2FjaGUoKS4KKwkoQykgVGhlIHBhZ2UgaGFzIGJlZW4gY2hhcmdlZCBiZWZvcmUgKDIpIGFuZCByZXVzZV9zd2FwX3BhZ2UoKSBkb2Vzbid0CisJICAgIGNhbGwgZGVsZXRlX2Zyb21fc3dhcF9jYWNoZSgpLgorCShEKSBUaGUgcGFnZSBoYXMgYmVlbiBjaGFyZ2VkIGJlZm9yZSAoMikgYW5kIHJldXNlX3N3YXBfcGFnZSgpIGNhbGxzCisJICAgIGRlbGV0ZV9mcm9tX3N3YXBfY2FjaGUoKS4KKworCSAgICBtZW1vcnkudXNhZ2UvbWVtc3cudXNhZ2UgY2hhbmdlcyB0byB0aGlzIHBhZ2Uvc3dwX2VudHJ5IHdpbGwgYmUKKwkgQ2FzZSAgICAgICAgICAoQSkgICAgICAoQikgICAgICAgKEMpICAgICAoRCkKKyAgICAgICAgIEV2ZW50CisgICAgICAgQmVmb3JlICgyKSAgICAgMC8gMSAgICAgMC8gMSAgICAgIDEvIDEgICAgMS8gMQorICAgICAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAoMykgICAgICAgICsxLysxICAgICsxLysxICAgICArMS8rMSAgICsxLysxCisgICAgICAgICAgKDQpICAgICAgICAgIC0gICAgICAgMC8gMCAgICAgICAtICAgICAtMS8gMAorICAgICAgICAgICg1KSAgICAgICAgIDAvLTEgICAgIDAvIDAgICAgIC0xLy0xICAgIDAvIDAKKyAgICAgICAgICAoNikgICAgICAgICAgLSAgICAgICAwLy0xICAgICAgIC0gICAgICAwLy0xCisgICAgICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgIFJlc3VsdCAgICAgICAgIDEvIDEgICAgIDEvIDEgICAgICAxLyAxICAgIDEvIDEKKworICAgICAgIEluIGFueSBjYXNlcywgY2hhcmdlcyB0byB0aGlzIHBhZ2Ugc2hvdWxkIGJlIDEvIDEuCisKKwk0LjIgU3dhcC1vdXQuCisJQXQgc3dhcC1vdXQsIHR5cGljYWwgc3RhdGUgdHJhbnNpdGlvbiBpcyBiZWxvdy4KKworCShhKSBhZGQgdG8gc3dhcCBjYWNoZS4gKG1hcmtlZCBhcyBTd2FwQ2FjaGUpCisJICAgIHN3cF9lbnRyeSdzIHJlZmNudCArPSAxLgorCShiKSBmdWxseSB1bm1hcHBlZC4KKwkgICAgc3dwX2VudHJ5J3MgcmVmY250ICs9ICMgb2YgcHRlcy4KKwkoYykgd3JpdGUgYmFjayB0byBzd2FwLgorCShkKSBkZWxldGUgZnJvbSBzd2FwIGNhY2hlLiAocmVtb3ZlIGZyb20gU3dhcENhY2hlKQorCSAgICBzd3BfZW50cnkncyByZWZjbnQgLT0gMS4KKworCisJQXQgKGIpLCB0aGUgcGFnZSBpcyBtYXJrZWQgYXMgU3dhcENhY2hlIGFuZCBub3QgdW5jaGFyZ2VkLgorCUF0IChkKSwgdGhlIHBhZ2UgaXMgcmVtb3ZlZCBmcm9tIFN3YXBDYWNoZSBhbmQgYSBjaGFyZ2UgaW4gcGFnZV9jZ3JvdXAKKwlpcyBtb3ZlZCB0byBzd2FwX2Nncm91cC4KKworCUZpbmFsbHksIGF0IHRhc2sgZXhpdCwKKwkoZSkgemFwX3B0ZSgpIGlzIGNhbGxlZCBhbmQgc3dwX2VudHJ5J3MgcmVmY250IC09MSAtPiAwLgorCUhlcmUsIGEgY2hhcmdlIGluIHN3YXBfY2dyb3VwIGRpc2FwcGVhcnMuCisKKzUuIFBhZ2UgQ2FjaGUKKyAgIAlQYWdlIENhY2hlIGlzIGNoYXJnZWQgYXQKKwktIGFkZF90b19wYWdlX2NhY2hlX2xvY2tlZCgpLgorCisJdW5jaGFyZ2VkIGF0CisJLSBfX3JlbW92ZV9mcm9tX3BhZ2VfY2FjaGUoKS4KKworCVRoZSBsb2dpYyBpcyB2ZXJ5IGNsZWFyLiAoQWJvdXQgbWlncmF0aW9uLCBzZWUgYmVsb3cpCisJTm90ZTogX19yZW1vdmVfZnJvbV9wYWdlX2NhY2hlKCkgaXMgY2FsbGVkIGJ5IHJlbW92ZV9mcm9tX3BhZ2VfY2FjaGUoKQorCWFuZCBfX3JlbW92ZV9tYXBwaW5nKCkuCisKKzYuIFNobWVtKHRtcGZzKSBQYWdlIENhY2hlCisJTWVtY2cncyBjaGFyZ2UvdW5jaGFyZ2UgaGF2ZSBzcGVjaWFsIGhhbmRsZXJzIG9mIHNobWVtLiBUaGUgYmVzdCB3YXkKKwl0byB1bmRlcnN0YW5kIHNobWVtJ3MgcGFnZSBzdGF0ZSB0cmFuc2l0aW9uIGlzIHRvIHJlYWQgbW0vc2htZW0uYy4KKwlCdXQgYnJpZWYgZXhwbGFuYXRpb24gb2YgdGhlIGJlaGF2aW9yIG9mIG1lbWNnIGFyb3VuZCBzaG1lbSB3aWxsIGJlCisJaGVscGZ1bCB0byB1bmRlcnN0YW5kIHRoZSBsb2dpYy4KKworCVNobWVtJ3MgcGFnZSAoanVzdCBsZWFmIHBhZ2UsIG5vdCBkaXJlY3QvaW5kaXJlY3QgYmxvY2spIGNhbiBiZSBvbgorCQktIHJhZGl4LXRyZWUgb2Ygc2htZW0ncyBpbm9kZS4KKwkJLSBTd2FwQ2FjaGUuCisJCS0gQm90aCBvbiByYWRpeC10cmVlIGFuZCBTd2FwQ2FjaGUuIFRoaXMgaGFwcGVucyBhdCBzd2FwLWluCisJCSAgYW5kIHN3YXAtb3V0LAorCisJSXQncyBjaGFyZ2VkIHdoZW4uLi4KKwktIEEgbmV3IHBhZ2UgaXMgYWRkZWQgdG8gc2htZW0ncyByYWRpeC10cmVlLgorCS0gQSBzd3AgcGFnZSBpcyByZWFkLiAobW92ZSBhIGNoYXJnZSBmcm9tIHN3YXBfY2dyb3VwIHRvIHBhZ2VfY2dyb3VwKQorCUl0J3MgdW5jaGFyZ2VkIHdoZW4KKwktIEEgcGFnZSBpcyByZW1vdmVkIGZyb20gcmFkaXgtdHJlZSBhbmQgbm90IFN3YXBDYWNoZS4KKwktIFdoZW4gU3dhcENhY2hlIGlzIHJlbW92ZWQsIGEgY2hhcmdlIGlzIG1vdmVkIHRvIHN3YXBfY2dyb3VwLgorCS0gV2hlbiBzd3BfZW50cnkncyByZWZjbnQgZ29lcyBkb3duIHRvIDAsIGEgY2hhcmdlIGluIHN3YXBfY2dyb3VwCisJICBkaXNhcHBlYXJzLgorCis3LiBQYWdlIE1pZ3JhdGlvbgorICAgCU9uZSBvZiB0aGUgbW9zdCBjb21wbGljYXRlZCBmdW5jdGlvbnMgaXMgcGFnZS1taWdyYXRpb24taGFuZGxlci4KKwlNZW1jZyBoYXMgMiByb3V0aW5lcy4gQXNzdW1lIHRoYXQgd2UgYXJlIG1pZ3JhdGluZyBhIHBhZ2UncyBjb250ZW50cworCWZyb20gT0xEUEFHRSB0byBORVdQQUdFLgorCisJVXN1YWwgbWlncmF0aW9uIGxvZ2ljIGlzLi4KKwkoYSkgcmVtb3ZlIHRoZSBwYWdlIGZyb20gTFJVLgorCShiKSBhbGxvY2F0ZSBORVdQQUdFIChtaWdyYXRpb24gdGFyZ2V0KQorCShjKSBsb2NrIGJ5IGxvY2tfcGFnZSgpLgorCShkKSB1bm1hcCBhbGwgbWFwcGluZ3MuCisJKGUtMSkgSWYgbmVjZXNzYXJ5LCByZXBsYWNlIGVudHJ5IGluIHJhZGl4LXRyZWUuCisJKGUtMikgbW92ZSBjb250ZW50cyBvZiBhIHBhZ2UuCisJKGYpIG1hcCBhbGwgbWFwcGluZ3MgYWdhaW4uCisJKGcpIHB1c2hiYWNrIHRoZSBwYWdlIHRvIExSVS4KKwkoLSkgT0xEUEFHRSB3aWxsIGJlIGZyZWVkLgorCisJQmVmb3JlIChnKSwgbWVtY2cgc2hvdWxkIGNvbXBsZXRlIGFsbCBuZWNlc3NhcnkgY2hhcmdlL3VuY2hhcmdlIHRvCisJTkVXUEFHRS9PTERQQUdFLgorCisJVGhlIHBvaW50IGlzLi4uLgorCS0gSWYgT0xEUEFHRSBpcyBhbm9ueW1vdXMsIGFsbCBjaGFyZ2VzIHdpbGwgYmUgZHJvcHBlZCBhdCAoZCkgYmVjYXVzZQorICAgICAgICAgIHRyeV90b191bm1hcCgpIGRyb3BzIGFsbCBtYXBjb3VudCBhbmQgdGhlIHBhZ2Ugd2lsbCBub3QgYmUKKwkgIFN3YXBDYWNoZS4KKworCS0gSWYgT0xEUEFHRSBpcyBTd2FwQ2FjaGUsIGNoYXJnZXMgd2lsbCBiZSBrZXB0IGF0IChnKSBiZWNhdXNlCisJICBfX2RlbGV0ZV9mcm9tX3N3YXBfY2FjaGUoKSBpc24ndCBjYWxsZWQgYXQgKGUtMSkKKworCS0gSWYgT0xEUEFHRSBpcyBwYWdlLWNhY2hlLCBjaGFyZ2VzIHdpbGwgYmUga2VwdCBhdCAoZykgYmVjYXVzZQorCSAgcmVtb3ZlX2Zyb21fc3dhcF9jYWNoZSgpIGlzbid0IGNhbGxlZCBhdCAoZS0xKQorCisJbWVtY2cgcHJvdmlkZXMgZm9sbG93aW5nIGhvb2tzLgorCisJLSBtZW1fY2dyb3VwX3ByZXBhcmVfbWlncmF0aW9uKE9MRFBBR0UpCisJICBDYWxsZWQgYWZ0ZXIgKGIpIHRvIGFjY291bnQgYSBjaGFyZ2UgKHVzYWdlICs9IFBBR0VfU0laRSkgYWdhaW5zdAorCSAgbWVtY2cgd2hpY2ggT0xEUEFHRSBiZWxvbmdzIHRvLgorCisgICAgICAgIC0gbWVtX2Nncm91cF9lbmRfbWlncmF0aW9uKE9MRFBBR0UsIE5FV1BBR0UpCisJICBDYWxsZWQgYWZ0ZXIgKGYpIGJlZm9yZSAoZykuCisJICBJZiBPTERQQUdFIGlzIHVzZWQsIGNvbW1pdCBPTERQQUdFIGFnYWluLiBJZiBPTERQQUdFIGlzIGFscmVhZHkKKwkgIGNoYXJnZWQsIGEgY2hhcmdlIGJ5IHByZXBhcmVfbWlncmF0aW9uKCkgaXMgYXV0b21hdGljYWxseSBjYW5jZWxlZC4KKwkgIElmIE5FV1BBR0UgaXMgdXNlZCwgY29tbWl0IE5FV1BBR0UgYW5kIHVuY2hhcmdlIE9MRFBBR0UuCisKKwkgIEJ1dCB6YXBfcHRlKCkgKGJ5IGV4aXQgb3IgbXVubWFwKSBjYW4gYmUgY2FsbGVkIHdoaWxlIG1pZ3JhdGlvbiwKKwkgIHdlIGhhdmUgdG8gY2hlY2sgaWYgT0xEUEFHRS9ORVdQQUdFIGlzIGEgdmFsaWQgcGFnZSBhZnRlciBjb21taXQoKS4KKworOC4gTFJVCisgICAgICAgIEVhY2ggbWVtY2cgaGFzIGl0cyBvd24gcHJpdmF0ZSBMUlUuIE5vdywgaXQncyBoYW5kbGluZyBpcyB1bmRlciBnbG9iYWwKKwlWTSdzIGNvbnRyb2wgKG1lYW5zIHRoYXQgaXQncyBoYW5kbGVkIHVuZGVyIGdsb2JhbCB6b25lLT5scnVfbG9jaykuCisJQWxtb3N0IGFsbCByb3V0aW5lcyBhcm91bmQgbWVtY2cncyBMUlUgaXMgY2FsbGVkIGJ5IGdsb2JhbCBMUlUncworCWxpc3QgbWFuYWdlbWVudCBmdW5jdGlvbnMgdW5kZXIgem9uZS0+bHJ1X2xvY2soKS4KKworCUEgc3BlY2lhbCBmdW5jdGlvbiBpcyBtZW1fY2dyb3VwX2lzb2xhdGVfcGFnZXMoKS4gVGhpcyBzY2FucworCW1lbWNnJ3MgcHJpdmF0ZSBMUlUgYW5kIGNhbGwgX19pc29sYXRlX2xydV9wYWdlKCkgdG8gZXh0cmFjdCBhIHBhZ2UKKwlmcm9tIExSVS4KKwkoQnkgX19pc29sYXRlX2xydV9wYWdlKCksIHRoZSBwYWdlIGlzIHJlbW92ZWQgZnJvbSBib3RoIG9mIGdsb2JhbCBhbmQKKwkgcHJpdmF0ZSBMUlUuKQorCisKKzkuIFR5cGljYWwgVGVzdHMuCisKKyBUZXN0cyBmb3IgcmFjeSBjYXNlcy4KKworIDkuMSBTbWFsbCBsaW1pdCB0byBtZW1jZy4KKwlXaGVuIHlvdSBkbyB0ZXN0IHRvIGRvIHJhY3kgY2FzZSwgaXQncyBnb29kIHRlc3QgdG8gc2V0IG1lbWNnJ3MgbGltaXQKKwl0byBiZSB2ZXJ5IHNtYWxsIHJhdGhlciB0aGFuIEdCLiBNYW55IHJhY2VzIGZvdW5kIGluIHRoZSB0ZXN0IHVuZGVyCisJeEtCIG9yIHh4TUIgbGltaXRzLgorCShNZW1vcnkgYmVoYXZpb3IgdW5kZXIgR0IgYW5kIE1lbW9yeSBiZWhhdmlvciB1bmRlciBNQiBzaG93cyB2ZXJ5CisJIGRpZmZlcmVudCBzaXR1YXRpb24uKQorCisgOS4yIFNobWVtCisJSGlzdG9yaWNhbGx5LCBtZW1jZydzIHNobWVtIGhhbmRsaW5nIHdhcyBwb29yIGFuZCB3ZSBzYXcgc29tZSBhbW91bnQKKwlvZiB0cm91YmxlcyBoZXJlLiBUaGlzIGlzIGJlY2F1c2Ugc2htZW0gaXMgcGFnZS1jYWNoZSBidXQgY2FuIGJlCisJU3dhcENhY2hlLiBUZXN0IHdpdGggc2htZW0vdG1wZnMgaXMgYWx3YXlzIGdvb2QgdGVzdC4KKworIDkuMyBNaWdyYXRpb24KKwlGb3IgTlVNQSwgbWlncmF0aW9uIGlzIGFuIGFub3RoZXIgc3BlY2lhbCBjYXNlLiBUbyBkbyBlYXN5IHRlc3QsIGNwdXNldAorCWlzIHVzZWZ1bC4gRm9sbG93aW5nIGlzIGEgc2FtcGxlIHNjcmlwdCB0byBkbyBtaWdyYXRpb24uCisKKwltb3VudCAtdCBjZ3JvdXAgLW8gY3B1c2V0IG5vbmUgL29wdC9jcHVzZXQKKworCW1rZGlyIC9vcHQvY3B1c2V0LzAxCisJZWNobyAxID4gL29wdC9jcHVzZXQvMDEvY3B1c2V0LmNwdXMKKwllY2hvIDAgPiAvb3B0L2NwdXNldC8wMS9jcHVzZXQubWVtcworCWVjaG8gMSA+IC9vcHQvY3B1c2V0LzAxL2NwdXNldC5tZW1vcnlfbWlncmF0ZQorCW1rZGlyIC9vcHQvY3B1c2V0LzAyCisJZWNobyAxID4gL29wdC9jcHVzZXQvMDIvY3B1c2V0LmNwdXMKKwllY2hvIDEgPiAvb3B0L2NwdXNldC8wMi9jcHVzZXQubWVtcworCWVjaG8gMSA+IC9vcHQvY3B1c2V0LzAyL2NwdXNldC5tZW1vcnlfbWlncmF0ZQorCisJSW4gYWJvdmUgc2V0LCB3aGVuIHlvdSBtb3ZlcyBhIHRhc2sgZnJvbSAwMSB0byAwMiwgcGFnZSBtaWdyYXRpb24gdG8KKwlub2RlIDAgdG8gbm9kZSAxIHdpbGwgb2NjdXIuIEZvbGxvd2luZyBpcyBhIHNjcmlwdCB0byBtaWdyYXRlIGFsbAorCXVuZGVyIGNwdXNldC4KKwktLQorCW1vdmVfdGFzaygpCisJeworCWZvciBwaWQgaW4gJDEKKyAgICAgICAgZG8KKyAgICAgICAgICAgICAgICAvYmluL2VjaG8gJHBpZCA+JDIvdGFza3MgMj4vZGV2L251bGwKKwkJZWNobyAtbiAkcGlkCisJCWVjaG8gLW4gIiAiCisgICAgICAgIGRvbmUKKwllY2hvIEVORAorCX0KKworCUcxX1RBU0s9YGNhdCAke0cxfS90YXNrc2AKKwlHMl9UQVNLPWBjYXQgJHtHMn0vdGFza3NgCisJbW92ZV90YXNrICIke0cxX1RBU0t9IiAke0cyfSAmCisJLS0KKyA5LjQgTWVtb3J5IGhvdHBsdWcuCisJbWVtb3J5IGhvdHBsdWcgdGVzdCBpcyBvbmUgb2YgZ29vZCB0ZXN0LgorCXRvIG9mZmxpbmUgbWVtb3J5LCBkbyBmb2xsb3dpbmcuCisJIyBlY2hvIG9mZmxpbmUgPiAvc3lzL2RldmljZXMvc3lzdGVtL21lbW9yeS9tZW1vcnlYWFgvc3RhdGUKKwkoWFhYIGlzIHRoZSBwbGFjZSBvZiBtZW1vcnkpCisJVGhpcyBpcyBhbiBlYXN5IHdheSB0byB0ZXN0IHBhZ2UgbWlncmF0aW9uLCB0b28uCisKKyA5LjUgbWtkaXIvcm1kaXIKKwlXaGVuIHVzaW5nIGhpZXJhcmNoeSwgbWtkaXIvcm1kaXIgdGVzdCBzaG91bGQgYmUgZG9uZS4KKwlVc2UgdGVzdHMgbGlrZSB0aGUgZm9sbG93aW5nLgorCisJZWNobyAxID4vb3B0L2Nncm91cC8wMS9tZW1vcnkvdXNlX2hpZXJhcmNoeQorCW1rZGlyIC9vcHQvY2dyb3VwLzAxL2NoaWxkX2EKKwlta2RpciAvb3B0L2Nncm91cC8wMS9jaGlsZF9iCisKKwlzZXQgbGltaXQgdG8gMDEuCisJYWRkIGxpbWl0IHRvIDAxL2NoaWxkX2IKKwlydW4gam9icyB1bmRlciBjaGlsZF9hIGFuZCBjaGlsZF9iCisKKwljcmVhdGUvZGVsZXRlIGZvbGxvd2luZyBncm91cHMgYXQgcmFuZG9tIHdoaWxlIGpvYnMgYXJlIHJ1bm5pbmcuCisJL29wdC9jZ3JvdXAvMDEvY2hpbGRfYS9jaGlsZF9hYQorCS9vcHQvY2dyb3VwLzAxL2NoaWxkX2IvY2hpbGRfYmIKKwkvb3B0L2Nncm91cC8wMS9jaGlsZF9jCisKKwlydW5uaW5nIG5ldyBqb2JzIGluIG5ldyBncm91cCBpcyBhbHNvIGdvb2QuCisKKyA5LjYgTW91bnQgd2l0aCBvdGhlciBzdWJzeXN0ZW1zLgorCU1vdW50aW5nIHdpdGggb3RoZXIgc3Vic3lzdGVtcyBpcyBhIGdvb2QgdGVzdCBiZWNhdXNlIHRoZXJlIGlzIGEKKwlyYWNlIGFuZCBsb2NrIGRlcGVuZGVuY3kgd2l0aCBvdGhlciBjZ3JvdXAgc3Vic3lzdGVtcy4KKworCWV4YW1wbGUpCisJIyBtb3VudCAtdCBjZ3JvdXAgbm9uZSAvY2dyb3VwIC10IGNwdXNldCxtZW1vcnksY3B1LGRldmljZXMKKworCWFuZCBkbyB0YXNrIG1vdmUsIG1rZGlyLCBybWRpciBldGMuLi51bmRlciB0aGlzLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9jb250cm9sbGVycy9tZW1vcnkudHh0IGIvRG9jdW1lbnRhdGlvbi9jb250cm9sbGVycy9tZW1vcnkudHh0CmluZGV4IDFjMDc1NDcuLmUxNTAxOTYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vY29udHJvbGxlcnMvbWVtb3J5LnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2NvbnRyb2xsZXJzL21lbW9yeS50eHQKQEAgLTEzNyw3ICsxMzcsMzIgQEAKIHBhZ2Ugd2lsbCBldmVudHVhbGx5IGdldCBjaGFyZ2VkIGZvciBpdCAob25jZSBpdCBpcyB1bmNoYXJnZWQgZnJvbQogdGhlIGNncm91cCB0aGF0IGJyb3VnaHQgaXQgaW4gLS0gdGhpcyB3aWxsIGhhcHBlbiBvbiBtZW1vcnkgcHJlc3N1cmUpLgogCi0yLjQgUmVjbGFpbQorRXhjZXB0aW9uOiBJZiBDT05GSUdfQ0dST1VQX0NHUk9VUF9NRU1fUkVTX0NUTFJfU1dBUCBpcyBub3QgdXNlZC4uCitXaGVuIHlvdSBkbyBzd2Fwb2ZmIGFuZCBtYWtlIHN3YXBwZWQtb3V0IHBhZ2VzIG9mIHNobWVtKHRtcGZzKSB0bworYmUgYmFja2VkIGludG8gbWVtb3J5IGluIGZvcmNlLCBjaGFyZ2VzIGZvciBwYWdlcyBhcmUgYWNjb3VudGVkIGFnYWluc3QgdGhlCitjYWxsZXIgb2Ygc3dhcG9mZiByYXRoZXIgdGhhbiB0aGUgdXNlcnMgb2Ygc2htZW0uCisKKworMi40IFN3YXAgRXh0ZW5zaW9uIChDT05GSUdfQ0dST1VQX01FTV9SRVNfQ1RMUl9TV0FQKQorU3dhcCBFeHRlbnNpb24gYWxsb3dzIHlvdSB0byByZWNvcmQgY2hhcmdlIGZvciBzd2FwLiBBIHN3YXBwZWQtaW4gcGFnZSBpcworY2hhcmdlZCBiYWNrIHRvIG9yaWdpbmFsIHBhZ2UgYWxsb2NhdG9yIGlmIHBvc3NpYmxlLgorCitXaGVuIHN3YXAgaXMgYWNjb3VudGVkLCBmb2xsb3dpbmcgZmlsZXMgYXJlIGFkZGVkLgorIC0gbWVtb3J5Lm1lbXN3LnVzYWdlX2luX2J5dGVzLgorIC0gbWVtb3J5Lm1lbXN3LmxpbWl0X2luX2J5dGVzLgorCit1c2FnZSBvZiBtZW0rc3dhcCBpcyBsaW1pdGVkIGJ5IG1lbXN3LmxpbWl0X2luX2J5dGVzLgorCitOb3RlOiB3aHkgJ21lbStzd2FwJyByYXRoZXIgdGhhbiBzd2FwLgorVGhlIGdsb2JhbCBMUlUoa3N3YXBkKSBjYW4gc3dhcCBvdXQgYXJiaXRyYXJ5IHBhZ2VzLiBTd2FwLW91dCBtZWFucwordG8gbW92ZSBhY2NvdW50IGZyb20gbWVtb3J5IHRvIHN3YXAuLi50aGVyZSBpcyBubyBjaGFuZ2UgaW4gdXNhZ2Ugb2YKK21lbStzd2FwLgorCitJbiBvdGhlciB3b3Jkcywgd2hlbiB3ZSB3YW50IHRvIGxpbWl0IHRoZSB1c2FnZSBvZiBzd2FwIHdpdGhvdXQgYWZmZWN0aW5nCitnbG9iYWwgTFJVLCBtZW0rc3dhcCBsaW1pdCBpcyBiZXR0ZXIgdGhhbiBqdXN0IGxpbWl0aW5nIHN3YXAgZnJvbSBPUyBwb2ludAorb2Ygdmlldy4KKworMi41IFJlY2xhaW0KIAogRWFjaCBjZ3JvdXAgbWFpbnRhaW5zIGEgcGVyIGNncm91cCBMUlUgdGhhdCBjb25zaXN0cyBvZiBhbiBhY3RpdmUKIGFuZCBpbmFjdGl2ZSBsaXN0LiBXaGVuIGEgY2dyb3VwIGdvZXMgb3ZlciBpdHMgbGltaXQsIHdlIGZpcnN0IHRyeQpAQCAtMjA3LDEyICsyMzIsNiBAQAogVGhlIG1lbW9yeS5zdGF0IGZpbGUgZ2l2ZXMgYWNjb3VudGluZyBpbmZvcm1hdGlvbi4gTm93LCB0aGUgbnVtYmVyIG9mCiBjYWNoZXMsIFJTUyBhbmQgQWN0aXZlIHBhZ2VzL0luYWN0aXZlIHBhZ2VzIGFyZSBzaG93bi4KIAotVGhlIG1lbW9yeS5mb3JjZV9lbXB0eSBnaXZlcyBhbiBpbnRlcmZhY2UgdG8gZHJvcCAqYWxsKiBjaGFyZ2VzIGJ5IGZvcmNlLgotCi0jIGVjaG8gMSA+IG1lbW9yeS5mb3JjZV9lbXB0eQotCi13aWxsIGRyb3AgYWxsIGNoYXJnZXMgaW4gY2dyb3VwLiBDdXJyZW50bHksIHRoaXMgaXMgbWFpbnRhaW5lZCBmb3IgdGVzdC4KLQogNC4gVGVzdGluZwogCiBCYWxiaXIgcG9zdGVkIGxtYmVuY2gsIEFJTTksIExUUCBhbmQgdm1tc3RyZXNzIHJlc3VsdHMgWzEwXSBhbmQgWzExXS4KQEAgLTI0MiwxMCArMjYxLDEwNiBAQAogCiBBIGNncm91cCBjYW4gYmUgcmVtb3ZlZCBieSBybWRpciwgYnV0IGFzIGRpc2N1c3NlZCBpbiBzZWN0aW9ucyA0LjEgYW5kIDQuMiwgYQogY2dyb3VwIG1pZ2h0IGhhdmUgc29tZSBjaGFyZ2UgYXNzb2NpYXRlZCB3aXRoIGl0LCBldmVuIHRob3VnaCBhbGwKLXRhc2tzIGhhdmUgbWlncmF0ZWQgYXdheSBmcm9tIGl0LiBTdWNoIGNoYXJnZXMgYXJlIGF1dG9tYXRpY2FsbHkgZHJvcHBlZCBhdAotcm1kaXIoKSBpZiB0aGVyZSBhcmUgbm8gdGFza3MuCit0YXNrcyBoYXZlIG1pZ3JhdGVkIGF3YXkgZnJvbSBpdC4KK1N1Y2ggY2hhcmdlcyBhcmUgZnJlZWQoYXQgZGVmYXVsdCkgb3IgbW92ZWQgdG8gaXRzIHBhcmVudC4gV2hlbiBtb3ZlZCwKK2JvdGggb2YgUlNTIGFuZCBDQUNIRVMgYXJlIG1vdmVkIHRvIHBhcmVudC4KK0lmIGJvdGggb2YgdGhlbSBhcmUgYnVzeSwgcm1kaXIoKSByZXR1cm5zIC1FQlVTWS4gU2VlIDUuMSBBbHNvLgogCi01LiBUT0RPCitDaGFyZ2VzIHJlY29yZGVkIGluIHN3YXAgaW5mb3JtYXRpb24gaXMgbm90IHVwZGF0ZWQgYXQgcmVtb3ZhbCBvZiBjZ3JvdXAuCitSZWNvcmRlZCBpbmZvcm1hdGlvbiBpcyBkaXNjYXJkZWQgYW5kIGEgY2dyb3VwIHdoaWNoIHVzZXMgc3dhcCAoc3dhcGNhY2hlKQord2lsbCBiZSBjaGFyZ2VkIGFzIGEgbmV3IG93bmVyIG9mIGl0LgorCisKKzUuIE1pc2MuIGludGVyZmFjZXMuCisKKzUuMSBmb3JjZV9lbXB0eQorICBtZW1vcnkuZm9yY2VfZW1wdHkgaW50ZXJmYWNlIGlzIHByb3ZpZGVkIHRvIG1ha2UgY2dyb3VwJ3MgbWVtb3J5IHVzYWdlIGVtcHR5LgorICBZb3UgY2FuIHVzZSB0aGlzIGludGVyZmFjZSBvbmx5IHdoZW4gdGhlIGNncm91cCBoYXMgbm8gdGFza3MuCisgIFdoZW4gd3JpdGluZyBhbnl0aGluZyB0byB0aGlzCisKKyAgIyBlY2hvIDAgPiBtZW1vcnkuZm9yY2VfZW1wdHkKKworICBBbG1vc3QgYWxsIHBhZ2VzIHRyYWNrZWQgYnkgdGhpcyBtZW1jZyB3aWxsIGJlIHVubWFwcGVkIGFuZCBmcmVlZC4gU29tZSBvZgorICBwYWdlcyBjYW5ub3QgYmUgZnJlZWQgYmVjYXVzZSBpdCdzIGxvY2tlZCBvciBpbi11c2UuIFN1Y2ggcGFnZXMgYXJlIG1vdmVkCisgIHRvIHBhcmVudCBhbmQgdGhpcyBjZ3JvdXAgd2lsbCBiZSBlbXB0eS4gQnV0IHRoaXMgbWF5IHJldHVybiAtRUJVU1kgaW4KKyAgc29tZSB0b28gYnVzeSBjYXNlLgorCisgIFR5cGljYWwgdXNlIGNhc2Ugb2YgdGhpcyBpbnRlcmZhY2UgaXMgdGhhdCBjYWxsaW5nIHRoaXMgYmVmb3JlIHJtZGlyKCkuCisgIEJlY2F1c2Ugcm1kaXIoKSBtb3ZlcyBhbGwgcGFnZXMgdG8gcGFyZW50LCBzb21lIG91dC1vZi11c2UgcGFnZSBjYWNoZXMgY2FuIGJlCisgIG1vdmVkIHRvIHRoZSBwYXJlbnQuIElmIHlvdSB3YW50IHRvIGF2b2lkIHRoYXQsIGZvcmNlX2VtcHR5IHdpbGwgYmUgdXNlZnVsLgorCis1LjIgc3RhdCBmaWxlCisgIG1lbW9yeS5zdGF0IGZpbGUgaW5jbHVkZXMgZm9sbG93aW5nIHN0YXRpc3RpY3MgKG5vdykKKwljYWNoZQkJCS0gIyBvZiBwYWdlcyBmcm9tIHBhZ2UtY2FjaGUgYW5kIHNobWVtLgorCXJzcwkJCS0gIyBvZiBwYWdlcyBmcm9tIGFub255bW91cyBtZW1vcnkuCisJcGdwZ2luCQkJLSAjIG9mIGV2ZW50IG9mIGNoYXJnaW5nCisJcGdwZ291dAkJCS0gIyBvZiBldmVudCBvZiB1bmNoYXJnaW5nCisJYWN0aXZlX2Fub24JCS0gIyBvZiBwYWdlcyBvbiBhY3RpdmUgbHJ1IG9mIGFub24sIHNobWVtLgorCWluYWN0aXZlX2Fub24gCQktICMgb2YgcGFnZXMgb24gYWN0aXZlIGxydSBvZiBhbm9uLCBzaG1lbQorCWFjdGl2ZV9maWxlCQktICMgb2YgcGFnZXMgb24gYWN0aXZlIGxydSBvZiBmaWxlLWNhY2hlCisJaW5hY3RpdmVfZmlsZQkJLSAjIG9mIHBhZ2VzIG9uIGluYWN0aXZlIGxydSBvZiBmaWxlIGNhY2hlCisJdW5ldmljdGFibGUJCS0gIyBvZiBwYWdlcyBjYW5ub3QgYmUgcmVjbGFpbWVkLihtbG9ja2VkIGV0YykKKworCUJlbG93IGlzIGRlcGVuZCBvbiBDT05GSUdfREVCVUdfVk0uCisJaW5hY3RpdmVfcmF0aW8JCS0gVk0gaW5lcm5hbCBwYXJhbWV0ZXIuIChzZWUgbW0vcGFnZV9hbGxvYy5jKQorCXJlY2VudF9yb3RhdGVkX2Fub24JLSBWTSBpbnRlcm5hbCBwYXJhbWV0ZXIuIChzZWUgbW0vdm1zY2FuLmMpCisJcmVjZW50X3JvdGF0ZWRfZmlsZQktIFZNIGludGVybmFsIHBhcmFtZXRlci4gKHNlZSBtbS92bXNjYW4uYykKKwlyZWNlbnRfc2Nhbm5lZF9hbm9uIAktIFZNIGludGVybmFsIHBhcmFtZXRlci4gKHNlZSBtbS92bXNjYW4uYykKKwlyZWNlbnRfc2Nhbm5lZF9maWxlIAktIFZNIGludGVybmFsIHBhcmFtZXRlci4gKHNlZSBtbS92bXNjYW4uYykKKworICBNZW1vOgorCXJlY2VudF9yb3RhdGVkIG1lYW5zIHJlY2VudCBmcmVxdWVuY3kgb2YgbHJ1IHJvdGF0aW9uLgorCXJlY2VudF9zY2FubmVkIG1lYW5zIHJlY2VudCAjIG9mIHNjYW5zIHRvIGxydS4KKwlzaG93aW5nIGZvciBiZXR0ZXIgZGVidWcgcGxlYXNlIHNlZSB0aGUgY29kZSBmb3IgbWVhbmluZ3MuCisKKworNS4zIHN3YXBwaW5lc3MKKyAgU2ltaWxhciB0byAvcHJvYy9zeXMvdm0vc3dhcHBpbmVzcywgYnV0IGFmZmVjdGluZyBhIGhpZXJhcmNoeSBvZiBncm91cHMgb25seS4KKworICBGb2xsb3dpbmcgY2dyb3VwJ3Mgc3dhcGluZXNzIGNhbid0IGJlIGNoYW5nZWQuCisgIC0gcm9vdCBjZ3JvdXAgKHVzZXMgL3Byb2Mvc3lzL3ZtL3N3YXBwaW5lc3MpLgorICAtIGEgY2dyb3VwIHdoaWNoIHVzZXMgaGllcmFyY2h5IGFuZCBpdCBoYXMgY2hpbGQgY2dyb3VwLgorICAtIGEgY2dyb3VwIHdoaWNoIHVzZXMgaGllcmFyY2h5IGFuZCBub3QgdGhlIHJvb3Qgb2YgaGllcmFyY2h5LgorCisKKzYuIEhpZXJhcmNoeSBzdXBwb3J0CisKK1RoZSBtZW1vcnkgY29udHJvbGxlciBzdXBwb3J0cyBhIGRlZXAgaGllcmFyY2h5IGFuZCBoaWVyYXJjaGljYWwgYWNjb3VudGluZy4KK1RoZSBoaWVyYXJjaHkgaXMgY3JlYXRlZCBieSBjcmVhdGluZyB0aGUgYXBwcm9wcmlhdGUgY2dyb3VwcyBpbiB0aGUKK2Nncm91cCBmaWxlc3lzdGVtLiBDb25zaWRlciBmb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBjZ3JvdXAgZmlsZXN5c3RlbQoraGllcmFyY2h5CisKKwkJcm9vdAorCSAgICAgLyAgfCAgIFwKKyAgICAgICAgICAgLwl8ICAgIFwKKwkgIGEJYgljCisJCQl8IFwKKwkJCXwgIFwKKwkJCWQgICBlCisKK0luIHRoZSBkaWFncmFtIGFib3ZlLCB3aXRoIGhpZXJhcmNoaWNhbCBhY2NvdW50aW5nIGVuYWJsZWQsIGFsbCBtZW1vcnkKK3VzYWdlIG9mIGUsIGlzIGFjY291bnRlZCB0byBpdHMgYW5jZXN0b3JzIHVwIHVudGlsIHRoZSByb290IChpLmUsIGMgYW5kIHJvb3QpLAordGhhdCBoYXMgbWVtb3J5LnVzZV9oaWVyYXJjaHkgZW5hYmxlZC4gIElmIG9uZSBvZiB0aGUgYW5jZXN0b3JzIGdvZXMgb3ZlciBpdHMKK2xpbWl0LCB0aGUgcmVjbGFpbSBhbGdvcml0aG0gcmVjbGFpbXMgZnJvbSB0aGUgdGFza3MgaW4gdGhlIGFuY2VzdG9yIGFuZCB0aGUKK2NoaWxkcmVuIG9mIHRoZSBhbmNlc3Rvci4KKworNi4xIEVuYWJsaW5nIGhpZXJhcmNoaWNhbCBhY2NvdW50aW5nIGFuZCByZWNsYWltCisKK1RoZSBtZW1vcnkgY29udHJvbGxlciBieSBkZWZhdWx0IGRpc2FibGVzIHRoZSBoaWVyYXJjaHkgZmVhdHVyZS4gU3VwcG9ydAorY2FuIGJlIGVuYWJsZWQgYnkgd3JpdGluZyAxIHRvIG1lbW9yeS51c2VfaGllcmFyY2h5IGZpbGUgb2YgdGhlIHJvb3QgY2dyb3VwCisKKyMgZWNobyAxID4gbWVtb3J5LnVzZV9oaWVyYXJjaHkKKworVGhlIGZlYXR1cmUgY2FuIGJlIGRpc2FibGVkIGJ5CisKKyMgZWNobyAwID4gbWVtb3J5LnVzZV9oaWVyYXJjaHkKKworTk9URTE6IEVuYWJsaW5nL2Rpc2FibGluZyB3aWxsIGZhaWwgaWYgdGhlIGNncm91cCBhbHJlYWR5IGhhcyBvdGhlcgorY2dyb3VwcyBjcmVhdGVkIGJlbG93IGl0LgorCitOT1RFMjogVGhpcyBmZWF0dXJlIGNhbiBiZSBlbmFibGVkL2Rpc2FibGVkIHBlciBzdWJ0cmVlLgorCis3LiBUT0RPCiAKIDEuIEFkZCBzdXBwb3J0IGZvciBhY2NvdW50aW5nIGh1Z2UgcGFnZXMgKGFzIGEgc2VwYXJhdGUgY29udHJvbGxlcikKIDIuIE1ha2UgcGVyLWNncm91cCBzY2FubmVyIHJlY2xhaW0gbm90LXNoYXJlZCBwYWdlcyBmaXJzdApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZWxsX3JidS50eHQgYi9Eb2N1bWVudGF0aW9uL2RlbGxfcmJ1LnR4dAppbmRleCAyYzBkNjMxLi5jMTFiOTMxIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RlbGxfcmJ1LnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RlbGxfcmJ1LnR4dApAQCAtODEsOCArODEsOCBAQAogQWxzbyBlY2hvaW5nIGVpdGhlciBtb25vICxwYWNrZXQgb3IgaW5pdCBpbiB0byBpbWFnZV90eXBlIHdpbGwgZnJlZSB1cCB0aGUKIG1lbW9yeSBhbGxvY2F0ZWQgYnkgdGhlIGRyaXZlci4KIAotSWYgYW4gdXNlciBieSBhY2NpZGVudCBleGVjdXRlcyBzdGVwcyAxIGFuZCAzIGFib3ZlIHdpdGhvdXQgZXhlY3V0aW5nIHN0ZXAgMjsKLWl0IHdpbGwgbWFrZSB0aGUgL3N5cy9jbGFzcy9maXJtd2FyZS9kZWxsX3JidS8gZW50cmllcyB0byBkaXNhcHBlYXIuCitJZiBhIHVzZXIgYnkgYWNjaWRlbnQgZXhlY3V0ZXMgc3RlcHMgMSBhbmQgMyBhYm92ZSB3aXRob3V0IGV4ZWN1dGluZyBzdGVwIDI7CitpdCB3aWxsIG1ha2UgdGhlIC9zeXMvY2xhc3MvZmlybXdhcmUvZGVsbF9yYnUvIGVudHJpZXMgZGlzYXBwZWFyLgogVGhlIGVudHJpZXMgY2FuIGJlIHJlY3JlYXRlZCBieSBkb2luZyB0aGUgZm9sbG93aW5nCiBlY2hvIGluaXQgPiAvc3lzL2RldmljZXMvcGxhdGZvcm0vZGVsbF9yYnUvaW1hZ2VfdHlwZQogTk9URTogZWNob2luZyBpbml0IGluIGltYWdlX3R5cGUgZG9lcyBub3QgY2hhbmdlIGl0IG9yaWdpbmFsIHZhbHVlLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZlbG9wbWVudC1wcm9jZXNzLzQuQ29kaW5nIGIvRG9jdW1lbnRhdGlvbi9kZXZlbG9wbWVudC1wcm9jZXNzLzQuQ29kaW5nCmluZGV4IDAxNGFjYTguLmE1YTM0NTAgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2ZWxvcG1lbnQtcHJvY2Vzcy80LkNvZGluZworKysgYi9Eb2N1bWVudGF0aW9uL2RldmVsb3BtZW50LXByb2Nlc3MvNC5Db2RpbmcKQEAgLTM3NSwxMCArMzc1LDEwIEBACiBqdXN0aWZpY2F0aW9uIGlzIHNvbGlkLgogCiBXaGVuIG1ha2luZyBhbiBpbmNvbXBhdGlibGUgQVBJIGNoYW5nZSwgb25lIHNob3VsZCwgd2hlbmV2ZXIgcG9zc2libGUsCi1lbnN1cmUgdGhhdCBjb2RlIHdoaWNoIGhhcyBub3QgYmVlbiB1cGRhdGVkIGlzIGNhdWdodCBieSB0aGUgY29tcGlsZXIuICAKK2Vuc3VyZSB0aGF0IGNvZGUgd2hpY2ggaGFzIG5vdCBiZWVuIHVwZGF0ZWQgaXMgY2F1Z2h0IGJ5IHRoZSBjb21waWxlci4KIFRoaXMgd2lsbCBoZWxwIHlvdSB0byBiZSBzdXJlIHRoYXQgeW91IGhhdmUgZm91bmQgYWxsIGluLXRyZWUgdXNlcyBvZiB0aGF0CiBpbnRlcmZhY2UuICBJdCB3aWxsIGFsc28gYWxlcnQgZGV2ZWxvcGVycyBvZiBvdXQtb2YtdHJlZSBjb2RlIHRoYXQgdGhlcmUgaXMKIGEgY2hhbmdlIHRoYXQgdGhleSBuZWVkIHRvIHJlc3BvbmQgdG8uICBTdXBwb3J0aW5nIG91dC1vZi10cmVlIGNvZGUgaXMgbm90CiBzb21ldGhpbmcgdGhhdCBrZXJuZWwgZGV2ZWxvcGVycyBuZWVkIHRvIGJlIHdvcnJpZWQgYWJvdXQsIGJ1dCB3ZSBhbHNvIGRvCi1ub3QgaGF2ZSB0byBtYWtlIGxpZmUgaGFyZGVyIGZvciBvdXQtb2YtdHJlZSBkZXZlbG9wZXJzIHRoYW4gaXQgaXQgbmVlZHMgdG8KLWJlLiAKK25vdCBoYXZlIHRvIG1ha2UgbGlmZSBoYXJkZXIgZm9yIG91dC1vZi10cmVlIGRldmVsb3BlcnMgdGhhbiBpdCBuZWVkcyB0bworYmUuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2ZlYXR1cmUtcmVtb3ZhbC1zY2hlZHVsZS50eHQgYi9Eb2N1bWVudGF0aW9uL2ZlYXR1cmUtcmVtb3ZhbC1zY2hlZHVsZS50eHQKaW5kZXggZGYxOGQ4Ny4uNWRkYmUzNSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9mZWF0dXJlLXJlbW92YWwtc2NoZWR1bGUudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZmVhdHVyZS1yZW1vdmFsLXNjaGVkdWxlLnR4dApAQCAtMzE1LDMgKzMxNSwyMyBAQAogV2h5OglEZXByZWNhdGVkIGJ5IHRoZSBuZXcgKHN0YW5kYXJkKSBkZXZpY2UgZHJpdmVyIGJpbmRpbmcgbW9kZWwuIFVzZQogCWkyY19kcml2ZXItPnByb2JlKCkgYW5kIC0+cmVtb3ZlKCkgaW5zdGVhZC4KIFdobzoJSmVhbiBEZWx2YXJlIDxraGFsaUBsaW51eC1mci5vcmc+CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitXaGF0Oglmc2NoZXIgYW5kIGZzY3BvcyBkcml2ZXJzCitXaGVuOglKdW5lIDIwMDkKK1doeToJRGVwcmVjYXRlZCBieSB0aGUgbmV3IGZzY2htZCBkcml2ZXIuCitXaG86CUhhbnMgZGUgR29lZGUgPGhkZWdvZWRlQHJlZGhhdC5jb20+CisJSmVhbiBEZWx2YXJlIDxraGFsaUBsaW51eC1mci5vcmc+CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitXaGF0OglTRUxpbnV4ICJjb21wYXRfbmV0IiBmdW5jdGlvbmFsaXR5CitXaGVuOgkyLjYuMzAgYXQgdGhlIGVhcmxpZXN0CitXaHk6CUluIDIuNi4xOCB0aGUgU2VjbWFyayBjb25jZXB0IHdhcyBpbnRyb2R1Y2VkIHRvIHJlcGxhY2UgdGhlICJjb21wYXRfbmV0IgorCW5ldHdvcmsgYWNjZXNzIGNvbnRyb2wgZnVuY3Rpb25hbGl0eSBvZiBTRUxpbnV4LiAgU2VjbWFyayBvZmZlcnMgYm90aAorCWJldHRlciBwZXJmb3JtYW5jZSBhbmQgZ3JlYXRlciBmbGV4aWJpbGl0eSB0aGFuIHRoZSAiY29tcGF0X25ldCIKKwltZWNoYW5pc20uICBOb3cgdGhhdCB0aGUgbWFqb3IgTGludXggZGlzdHJpYnV0aW9ucyBoYXZlIG1vdmVkIHRvCisJU2VjbWFyaywgaXQgaXMgdGltZSB0byBkZXByZWNhdGUgdGhlIG9sZGVyIG1lY2hhbmlzbSBhbmQgc3RhcnQgdGhlCisJcHJvY2VzcyBvZiByZW1vdmluZyB0aGUgb2xkIGNvZGUuCitXaG86CVBhdWwgTW9vcmUgPHBhdWwubW9vcmVAaHAuY29tPgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9Mb2NraW5nIGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9Mb2NraW5nCmluZGV4IGNjZWM1NTMuLmNmYmZhMTUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvTG9ja2luZworKysgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL0xvY2tpbmcKQEAgLTM5Nyw3ICszOTcsNyBAQAogfTsKIAogbG9ja2luZyBydWxlczoKLQlBbGwgZXhjZXB0IC0+cG9sbCgpIG1heSBibG9jay4KKwlBbGwgbWF5IGJsb2NrLgogCQkJQktMCiBsbHNlZWs6CQkJbm8JKHNlZSBiZWxvdykKIHJlYWQ6CQkJbm8KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvZXh0NC50eHQgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2V4dDQudHh0CmluZGV4IDE3NGVhZmYuLmNlYzgyOWIgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvZXh0NC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9leHQ0LnR4dApAQCAtNTgsMTMgKzU4LDIyIEBACiAKIAkjIG1vdW50IC10IGV4dDQgL2Rldi9oZGExIC93aGVyZXZlcgogCi0gIC0gV2hlbiBjb21wYXJpbmcgcGVyZm9ybWFuY2Ugd2l0aCBvdGhlciBmaWxlc3lzdGVtcywgcmVtZW1iZXIgdGhhdAotICAgIGV4dDMvNCBieSBkZWZhdWx0IG9mZmVycyBoaWdoZXIgZGF0YSBpbnRlZ3JpdHkgZ3VhcmFudGVlcyB0aGFuIG1vc3QuCi0gICAgU28gd2hlbiBjb21wYXJpbmcgd2l0aCBhIG1ldGFkYXRhLW9ubHkgam91cm5hbGxpbmcgZmlsZXN5c3RlbSwgc3VjaAotICAgIGFzIGV4dDMsIHVzZSBgbW91bnQgLW8gZGF0YT13cml0ZWJhY2snLiAgQW5kIHlvdSBtaWdodCBhcyB3ZWxsIHVzZQotICAgIGBtb3VudCAtbyBub2JoJyB0b28gYWxvbmcgd2l0aCBpdC4gIE1ha2luZyB0aGUgam91cm5hbCBsYXJnZXIgdGhhbgotICAgIHRoZSBta2UyZnMgZGVmYXVsdCBvZnRlbiBoZWxwcyBwZXJmb3JtYW5jZSB3aXRoIG1ldGFkYXRhLWludGVuc2l2ZQotICAgIHdvcmtsb2Fkcy4KKyAgLSBXaGVuIGNvbXBhcmluZyBwZXJmb3JtYW5jZSB3aXRoIG90aGVyIGZpbGVzeXN0ZW1zLCBpdCdzIGFsd2F5cworICAgIGltcG9ydGFudCB0byB0cnkgbXVsdGlwbGUgd29ya2xvYWRzOyB2ZXJ5IG9mdGVuIGEgc3VidGxlIGNoYW5nZSBpbiBhCisgICAgd29ya2xvYWQgcGFyYW1ldGVyIGNhbiBjb21wbGV0ZWx5IGNoYW5nZSB0aGUgcmFua2luZyBvZiB3aGljaAorICAgIGZpbGVzeXN0ZW1zIGRvIHdlbGwgY29tcGFyZWQgdG8gb3RoZXJzLiAgV2hlbiBjb21wYXJpbmcgdmVyc3VzIGV4dDMsCisgICAgbm90ZSB0aGF0IGV4dDQgZW5hYmxlcyB3cml0ZSBiYXJyaWVycyBieSBkZWZhdWx0LCB3aGlsZSBleHQzIGRvZXMKKyAgICBub3QgZW5hYmxlIHdyaXRlIGJhcnJpZXJzIGJ5IGRlZmF1bHQuICBTbyBpdCBpcyB1c2VmdWwgdG8gdXNlCisgICAgZXhwbGljaXRseSBzcGVjaWZ5IHdoZXRoZXIgYmFycmllcnMgYXJlIGVuYWJsZWQgb3Igbm90IHdoZW4gdmlhIHRoZQorICAgICctbyBiYXJyaWVycz1bMHwxXScgbW91bnQgb3B0aW9uIGZvciBib3RoIGV4dDMgYW5kIGV4dDQgZmlsZXN5c3RlbXMKKyAgICBmb3IgYSBmYWlyIGNvbXBhcmlzb24uICBXaGVuIHR1bmluZyBleHQzIGZvciBiZXN0IGJlbmNobWFyayBudW1iZXJzLAorICAgIGl0IGlzIG9mdGVuIHdvcnRod2hpbGUgdG8gdHJ5IGNoYW5naW5nIHRoZSBkYXRhIGpvdXJuYWxpbmcgbW9kZTsgJy1vCisgICAgZGF0YT13cml0ZWJhY2ssbm9iaCcgY2FuIGJlIGZhc3RlciBmb3Igc29tZSB3b3JrbG9hZHMuICAoTm90ZQorICAgIGhvd2V2ZXIgdGhhdCBydW5uaW5nIG1vdW50ZWQgd2l0aCBkYXRhPXdyaXRlYmFjayBjYW4gcG90ZW50aWFsbHkKKyAgICBsZWF2ZSBzdGFsZSBkYXRhIGV4cG9zZWQgaW4gcmVjZW50bHkgd3JpdHRlbiBmaWxlcyBpbiBjYXNlIG9mIGFuCisgICAgdW5jbGVhbiBzaHV0ZG93biwgd2hpY2ggY291bGQgYmUgYSBzZWN1cml0eSBleHBvc3VyZSBpbiBzb21lCisgICAgc2l0dWF0aW9ucy4pICBDb25maWd1cmluZyB0aGUgZmlsZXN5c3RlbSB3aXRoIGEgbGFyZ2Ugam91cm5hbCBjYW4KKyAgICBhbHNvIGJlIGhlbHBmdWwgZm9yIG1ldGFkYXRhLWludGVuc2l2ZSB3b3JrbG9hZHMuCiAKIDIuIEZlYXR1cmVzCiA9PT09PT09PT09PQpAQCAtNzQsNyArODMsNyBAQAogKiBhYmlsaXR5IHRvIHVzZSBmaWxlc3lzdGVtcyA+IDE2VEIgKGUyZnNwcm9ncyBzdXBwb3J0IG5vdCBhdmFpbGFibGUgeWV0KQogKiBleHRlbnQgZm9ybWF0IHJlZHVjZXMgbWV0YWRhdGEgb3ZlcmhlYWQgKFJBTSwgSU8gZm9yIGFjY2VzcywgdHJhbnNhY3Rpb25zKQogKiBleHRlbnQgZm9ybWF0IG1vcmUgcm9idXN0IGluIGZhY2Ugb2Ygb24tZGlzayBjb3JydXB0aW9uIGR1ZSB0byBtYWdpY3MsCi0qIGludGVybmFsIHJlZHVuYW5jeSBpbiB0cmVlCisqIGludGVybmFsIHJlZHVuZGFuY3kgaW4gdHJlZQogKiBpbXByb3ZlZCBmaWxlIGFsbG9jYXRpb24gKG11bHRpLWJsb2NrIGFsbG9jKQogKiBmaXggMzIwMDAgc3ViZGlyZWN0b3J5IGxpbWl0CiAqIG5zZWMgdGltZXN0YW1wcyBmb3IgbXRpbWUsIGF0aW1lLCBjdGltZSwgY3JlYXRlIHRpbWUKQEAgLTExNiwxMCArMTI1LDExIEBACiBXaGVuIG1vdW50aW5nIGFuIGV4dDQgZmlsZXN5c3RlbSwgdGhlIGZvbGxvd2luZyBvcHRpb24gYXJlIGFjY2VwdGVkOgogKCopID09IGRlZmF1bHQKIAotZXh0ZW50cwkJKCopCWV4dDQgd2lsbCB1c2UgZXh0ZW50cyB0byBhZGRyZXNzIGZpbGUgZGF0YS4gIFRoZQotCQkJZmlsZSBzeXN0ZW0gd2lsbCBubyBsb25nZXIgYmUgbW91bnRhYmxlIGJ5IGV4dDMuCi0KLW5vZXh0ZW50cwkJZXh0NCB3aWxsIG5vdCB1c2UgZXh0ZW50cyBmb3IgbmV3bHkgY3JlYXRlZCBmaWxlcworcm8gICAgICAgICAgICAgICAgICAgCU1vdW50IGZpbGVzeXN0ZW0gcmVhZCBvbmx5LiBOb3RlIHRoYXQgZXh0NCB3aWxsCisgICAgICAgICAgICAgICAgICAgICAJcmVwbGF5IHRoZSBqb3VybmFsIChhbmQgdGh1cyB3cml0ZSB0byB0aGUKKyAgICAgICAgICAgICAgICAgICAgIAlwYXJ0aXRpb24pIGV2ZW4gd2hlbiBtb3VudGVkICJyZWFkIG9ubHkiLiBUaGUKKyAgICAgICAgICAgICAgICAgICAgIAltb3VudCBvcHRpb25zICJybyxub2xvYWQiIGNhbiBiZSB1c2VkIHRvIHByZXZlbnQKKwkJICAgICAJd3JpdGVzIHRvIHRoZSBmaWxlc3lzdGVtLgogCiBqb3VybmFsX2NoZWNrc3VtCUVuYWJsZSBjaGVja3N1bW1pbmcgb2YgdGhlIGpvdXJuYWwgdHJhbnNhY3Rpb25zLgogCQkJVGhpcyB3aWxsIGFsbG93IHRoZSByZWNvdmVyeSBjb2RlIGluIGUyZnNjayBhbmQgdGhlCkBAIC0xMzQsMTcgKzE0NCwxNyBAQAogam91cm5hbD11cGRhdGUJCVVwZGF0ZSB0aGUgZXh0NCBmaWxlIHN5c3RlbSdzIGpvdXJuYWwgdG8gdGhlIGN1cnJlbnQKIAkJCWZvcm1hdC4KIAotam91cm5hbD1pbnVtCQlXaGVuIGEgam91cm5hbCBhbHJlYWR5IGV4aXN0cywgdGhpcyBvcHRpb24gaXMgaWdub3JlZC4KLQkJCU90aGVyd2lzZSwgaXQgc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgdGhlIGlub2RlIHdoaWNoCi0JCQl3aWxsIHJlcHJlc2VudCB0aGUgZXh0NCBmaWxlIHN5c3RlbSdzIGpvdXJuYWwgZmlsZS4KLQogam91cm5hbF9kZXY9ZGV2bnVtCVdoZW4gdGhlIGV4dGVybmFsIGpvdXJuYWwgZGV2aWNlJ3MgbWFqb3IvbWlub3IgbnVtYmVycwogCQkJaGF2ZSBjaGFuZ2VkLCB0aGlzIG9wdGlvbiBhbGxvd3MgdGhlIHVzZXIgdG8gc3BlY2lmeQogCQkJdGhlIG5ldyBqb3VybmFsIGxvY2F0aW9uLiAgVGhlIGpvdXJuYWwgZGV2aWNlIGlzCiAJCQlpZGVudGlmaWVkIHRocm91Z2ggaXRzIG5ldyBtYWpvci9taW5vciBudW1iZXJzIGVuY29kZWQKIAkJCWluIGRldm51bS4KIAotbm9sb2FkCQkJRG9uJ3QgbG9hZCB0aGUgam91cm5hbCBvbiBtb3VudGluZy4KK25vbG9hZAkJCURvbid0IGxvYWQgdGhlIGpvdXJuYWwgb24gbW91bnRpbmcuICBOb3RlIHRoYXQKKyAgICAgICAgICAgICAgICAgICAgIAlpZiB0aGUgZmlsZXN5c3RlbSB3YXMgbm90IHVubW91bnRlZCBjbGVhbmx5LAorICAgICAgICAgICAgICAgICAgICAgCXNraXBwaW5nIHRoZSBqb3VybmFsIHJlcGxheSB3aWxsIGxlYWQgdG8gdGhlCisgICAgICAgICAgICAgICAgICAgICAJZmlsZXN5c3RlbSBjb250YWluaW5nIGluY29uc2lzdGVuY2llcyB0aGF0IGNhbgorICAgICAgICAgICAgICAgICAgICAgCWxlYWQgdG8gYW55IG51bWJlciBvZiBwcm9ibGVtcy4KIAogZGF0YT1qb3VybmFsCQlBbGwgZGF0YSBhcmUgY29tbWl0dGVkIGludG8gdGhlIGpvdXJuYWwgcHJpb3IgdG8gYmVpbmcKIAkJCXdyaXR0ZW4gaW50byB0aGUgbWFpbiBmaWxlIHN5c3RlbS4KQEAgLTIxOSw5ICsyMjksMTIgQEAKIAogZGVidWcJCQlFeHRyYSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gaXMgc2VudCB0byBzeXNsb2cuCiAKLWVycm9ycz1yZW1vdW50LXJvKCopCVJlbW91bnQgdGhlIGZpbGVzeXN0ZW0gcmVhZC1vbmx5IG9uIGFuIGVycm9yLgorZXJyb3JzPXJlbW91bnQtcm8JUmVtb3VudCB0aGUgZmlsZXN5c3RlbSByZWFkLW9ubHkgb24gYW4gZXJyb3IuCiBlcnJvcnM9Y29udGludWUJCUtlZXAgZ29pbmcgb24gYSBmaWxlc3lzdGVtIGVycm9yLgogZXJyb3JzPXBhbmljCQlQYW5pYyBhbmQgaGFsdCB0aGUgbWFjaGluZSBpZiBhbiBlcnJvciBvY2N1cnMuCisgICAgICAgICAgICAgICAgICAgICAgICAoVGhlc2UgbW91bnQgb3B0aW9ucyBvdmVycmlkZSB0aGUgZXJyb3JzIGJlaGF2aW9yCisgICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZpZWQgaW4gdGhlIHN1cGVyYmxvY2ssIHdoaWNoIGNhbiBiZSBjb25maWd1cmVkCisgICAgICAgICAgICAgICAgICAgICAgICB1c2luZyB0dW5lMmZzKQogCiBkYXRhX2Vycj1pZ25vcmUoKikJSnVzdCBwcmludCBhbiBlcnJvciBtZXNzYWdlIGlmIGFuIGVycm9yIG9jY3VycwogCQkJaW4gYSBmaWxlIGRhdGEgYnVmZmVyIGluIG9yZGVyZWQgbW9kZS4KQEAgLTI2MSw2ICsyNzQsNDIgQEAKIG5vZGVsYWxsb2MJCURpc2FibGUgZGVsYXllZCBhbGxvY2F0aW9uLiBCbG9ja3MgYXJlIGFsbG9jYXRpb24KIAkJCXdoZW4gZGF0YSBpcyBjb3BpZWQgZnJvbSB1c2VyIHRvIHBhZ2UgY2FjaGUuCiAKK21heF9iYXRjaF90aW1lPXVzZWMJTWF4aW11bSBhbW91bnQgb2YgdGltZSBleHQ0IHNob3VsZCB3YWl0IGZvcgorCQkJYWRkaXRpb25hbCBmaWxlc3lzdGVtIG9wZXJhdGlvbnMgdG8gYmUgYmF0Y2gKKwkJCXRvZ2V0aGVyIHdpdGggYSBzeW5jaHJvbm91cyB3cml0ZSBvcGVyYXRpb24uCisJCQlTaW5jZSBhIHN5bmNocm9ub3VzIHdyaXRlIG9wZXJhdGlvbiBpcyBnb2luZyB0bworCQkJZm9yY2UgYSBjb21taXQgYW5kIHRoZW4gYSB3YWl0IGZvciB0aGUgSS9PCisJCQljb21wbGV0ZSwgaXQgZG9lc24ndCBjb3N0IG11Y2gsIGFuZCBjYW4gYmUgYQorCQkJaHVnZSB0aHJvdWdocHV0IHdpbiwgd2Ugd2FpdCBmb3IgYSBzbWFsbCBhbW91bnQKKwkJCW9mIHRpbWUgdG8gc2VlIGlmIGFueSBvdGhlciB0cmFuc2FjdGlvbnMgY2FuCisJCQlwaWdneWJhY2sgb24gdGhlIHN5bmNocm9ub3VzIHdyaXRlLiAgIFRoZQorCQkJYWxnb3JpdGhtIHVzZWQgaXMgZGVzaWduZWQgdG8gYXV0b21hdGljYWxseSB0dW5lCisJCQlmb3IgdGhlIHNwZWVkIG9mIHRoZSBkaXNrLCBieSBtZWFzdXJpbmcgdGhlCisJCQlhbW91bnQgb2YgdGltZSAob24gYXZlcmFnZSkgdGhhdCBpdCB0YWtlcyB0bworCQkJZmluaXNoIGNvbW1pdHRpbmcgYSB0cmFuc2FjdGlvbi4gIENhbGwgdGhpcyB0aW1lCisJCQl0aGUgImNvbW1pdCB0aW1lIi4gIElmIHRoZSB0aW1lIHRoYXQgdGhlCisJCQl0cmFuc2FjdG9pbiBoYXMgYmVlbiBydW5uaW5nIGlzIGxlc3MgdGhhbiB0aGUKKwkJCWNvbW1pdCB0aW1lLCBleHQ0IHdpbGwgdHJ5IHNsZWVwaW5nIGZvciB0aGUKKwkJCWNvbW1pdCB0aW1lIHRvIHNlZSBpZiBvdGhlciBvcGVyYXRpb25zIHdpbGwgam9pbgorCQkJdGhlIHRyYW5zYWN0aW9uLiAgIFRoZSBjb21taXQgdGltZSBpcyBjYXBwZWQgYnkKKwkJCXRoZSBtYXhfYmF0Y2hfdGltZSwgd2hpY2ggZGVmYXVsdHMgdG8gMTUwMDB1cworCQkJKDE1bXMpLiAgIFRoaXMgb3B0aW1pemF0aW9uIGNhbiBiZSB0dXJuZWQgb2ZmCisJCQllbnRpcmVseSBieSBzZXR0aW5nIG1heF9iYXRjaF90aW1lIHRvIDAuCisKK21pbl9iYXRjaF90aW1lPXVzZWMJVGhpcyBwYXJhbWV0ZXIgc2V0cyB0aGUgY29tbWl0IHRpbWUgKGFzCisJCQlkZXNjcmliZWQgYWJvdmUpIHRvIGJlIGF0IGxlYXN0IG1pbl9iYXRjaF90aW1lLgorCQkJSXQgZGVmYXVsdHMgdG8gemVybyBtaWNyb3NlY29uZHMuICBJbmNyZWFzaW5nCisJCQl0aGlzIHBhcmFtZXRlciBtYXkgaW1wcm92ZSB0aGUgdGhyb3VnaHB1dCBvZgorCQkJbXVsdGktdGhyZWFkZWQsIHN5bmNocm9ub3VzIHdvcmtsb2FkcyBvbiB2ZXJ5CisJCQlmYXN0IGRpc2tzLCBhdCB0aGUgY29zdCBvZiBpbmNyZWFzaW5nIGxhdGVuY3kuCisKK2pvdXJuYWxfaW9wcmlvPXByaW8JVGhlIEkvTyBwcmlvcml0eSAoZnJvbSAwIHRvIDcsIHdoZXJlIDAgaXMgdGhlCisJCQloaWdoZXN0IHByaW9ydHkpIHdoaWNoIHNob3VsZCBiZSB1c2VkIGZvciBJL08KKwkJCW9wZXJhdGlvbnMgc3VibWl0dGVkIGJ5IGtqb3VybmFsZDIgZHVyaW5nIGEKKwkJCWNvbW1pdCBvcGVyYXRpb24uICBUaGlzIGRlZmF1bHRzIHRvIDMsIHdoaWNoIGlzCisJCQlhIHNsaWdodGx5IGhpZ2hlciBwcmlvcml0eSB0aGFuIHRoZSBkZWZhdWx0IEkvTworCQkJcHJpb3JpdHkuCisKIERhdGEgTW9kZQogPT09PT09PT09CiBUaGVyZSBhcmUgMyBkaWZmZXJlbnQgZGF0YSBtb2RlczoKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvb2NmczIudHh0IGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9vY2ZzMi50eHQKaW5kZXggNjczMTBmYi4uYzJhMDg3MSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9vY2ZzMi50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9vY2ZzMi50eHQKQEAgLTMxLDcgKzMxLDYgQEAKIAktIHF1b3RhcwogCS0gRGlyZWN0b3J5IGNoYW5nZSBub3RpZmljYXRpb24gKEZfTk9USUZZKQogCS0gRGlzdHJpYnV0ZWQgQ2FjaGluZyAoRl9TRVRMRUFTRS9GX0dFVExFQVNFL2JyZWFrX2xlYXNlKQotCS0gUE9TSVggQUNMcwogCiBNb3VudCBvcHRpb25zCiA9PT09PT09PT09PT09CkBAIC03OSwzICs3OCw1IEBACiAJCQliaXRzIG9mIHNpZ25pZmljYW5jZS4KIHVzZXJfeGF0dHIJKCopCUVuYWJsZXMgRXh0ZW5kZWQgVXNlciBBdHRyaWJ1dGVzLgogbm91c2VyX3hhdHRyCQlEaXNhYmxlcyBFeHRlbmRlZCBVc2VyIEF0dHJpYnV0ZXMuCithY2wJCQlFbmFibGVzIFBPU0lYIEFjY2VzcyBDb250cm9sIExpc3RzIHN1cHBvcnQuCitub2FjbAkJKCopCURpc2FibGVzIFBPU0lYIEFjY2VzcyBDb250cm9sIExpc3RzIHN1cHBvcnQuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3Byb2MudHh0IGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9wcm9jLnR4dAppbmRleCA3MWRmMzUzLi5kMTA1ZWI0IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3Byb2MudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvcHJvYy50eHQKQEAgLTE0MCw2ICsxNDAsNyBAQAogIHN0YXRtCQlQcm9jZXNzIG1lbW9yeSBzdGF0dXMgaW5mb3JtYXRpb24KICBzdGF0dXMJCVByb2Nlc3Mgc3RhdHVzIGluIGh1bWFuIHJlYWRhYmxlIGZvcm0KICB3Y2hhbgkJSWYgQ09ORklHX0tBTExTWU1TIGlzIHNldCwgYSBwcmUtZGVjb2RlZCB3Y2hhbgorIHN0YWNrCQlSZXBvcnQgZnVsbCBzdGFjayB0cmFjZSwgZW5hYmxlIHZpYSBDT05GSUdfU1RBQ0tUUkFDRQogIHNtYXBzCQlFeHRlbnNpb24gYmFzZWQgb24gbWFwcywgdGhlIHJzcyBzaXplIGZvciBlYWNoIG1hcHBlZCBmaWxlCiAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KIApAQCAtMTM4NSw2ICsxMzg2LDE1IEBACiB0byByZXRhaW4gZGVudHJ5IGFuZCBpbm9kZSBjYWNoZXMuICBJbmNyZWFzaW5nIHZmc19jYWNoZV9wcmVzc3VyZSBiZXlvbmQgMTAwCiBjYXVzZXMgdGhlIGtlcm5lbCB0byBwcmVmZXIgdG8gcmVjbGFpbSBkZW50cmllcyBhbmQgaW5vZGVzLgogCitkaXJ0eV9iYWNrZ3JvdW5kX2J5dGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0NvbnRhaW5zIHRoZSBhbW91bnQgb2YgZGlydHkgbWVtb3J5IGF0IHdoaWNoIHRoZSBwZGZsdXNoIGJhY2tncm91bmQgd3JpdGViYWNrCitkYWVtb24gd2lsbCBzdGFydCB3cml0ZWJhY2suCisKK0lmIGRpcnR5X2JhY2tncm91bmRfYnl0ZXMgaXMgd3JpdHRlbiwgZGlydHlfYmFja2dyb3VuZF9yYXRpbyBiZWNvbWVzIGEgZnVuY3Rpb24KK29mIGl0cyB2YWx1ZSAoZGlydHlfYmFja2dyb3VuZF9ieXRlcyAvIHRoZSBhbW91bnQgb2YgZGlydHlhYmxlIHN5c3RlbSBtZW1vcnkpLgorCiBkaXJ0eV9iYWNrZ3JvdW5kX3JhdGlvCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKQEAgLTEzOTMsMTQgKzE0MDMsMjkgQEAKIHBhZ2VzIGF0IHdoaWNoIHRoZSBwZGZsdXNoIGJhY2tncm91bmQgd3JpdGViYWNrIGRhZW1vbiB3aWxsIHN0YXJ0IHdyaXRpbmcgb3V0CiBkaXJ0eSBkYXRhLgogCitJZiBkaXJ0eV9iYWNrZ3JvdW5kX3JhdGlvIGlzIHdyaXR0ZW4sIGRpcnR5X2JhY2tncm91bmRfYnl0ZXMgYmVjb21lcyBhIGZ1bmN0aW9uCitvZiBpdHMgdmFsdWUgKGRpcnR5X2JhY2tncm91bmRfcmF0aW8gKiB0aGUgYW1vdW50IG9mIGRpcnR5YWJsZSBzeXN0ZW0gbWVtb3J5KS4KKworZGlydHlfYnl0ZXMKKy0tLS0tLS0tLS0tCisKK0NvbnRhaW5zIHRoZSBhbW91bnQgb2YgZGlydHkgbWVtb3J5IGF0IHdoaWNoIGEgcHJvY2VzcyBnZW5lcmF0aW5nIGRpc2sgd3JpdGVzCit3aWxsIGl0c2VsZiBzdGFydCB3cml0ZWJhY2suCisKK0lmIGRpcnR5X2J5dGVzIGlzIHdyaXR0ZW4sIGRpcnR5X3JhdGlvIGJlY29tZXMgYSBmdW5jdGlvbiBvZiBpdHMgdmFsdWUKKyhkaXJ0eV9ieXRlcyAvIHRoZSBhbW91bnQgb2YgZGlydHlhYmxlIHN5c3RlbSBtZW1vcnkpLgorCiBkaXJ0eV9yYXRpbwotLS0tLS0tLS0tLS0tLS0tLS0KKy0tLS0tLS0tLS0tCiAKIENvbnRhaW5zLCBhcyBhIHBlcmNlbnRhZ2Ugb2YgdGhlIGRpcnR5YWJsZSBzeXN0ZW0gbWVtb3J5IChmcmVlIHBhZ2VzICsgbWFwcGVkCiBwYWdlcyArIGZpbGUgY2FjaGUsIG5vdCBpbmNsdWRpbmcgbG9ja2VkIHBhZ2VzIGFuZCBIdWdlUGFnZXMpLCB0aGUgbnVtYmVyIG9mCiBwYWdlcyBhdCB3aGljaCBhIHByb2Nlc3Mgd2hpY2ggaXMgZ2VuZXJhdGluZyBkaXNrIHdyaXRlcyB3aWxsIGl0c2VsZiBzdGFydAogd3JpdGluZyBvdXQgZGlydHkgZGF0YS4KIAorSWYgZGlydHlfcmF0aW8gaXMgd3JpdHRlbiwgZGlydHlfYnl0ZXMgYmVjb21lcyBhIGZ1bmN0aW9uIG9mIGl0cyB2YWx1ZQorKGRpcnR5X3JhdGlvICogdGhlIGFtb3VudCBvZiBkaXJ0eWFibGUgc3lzdGVtIG1lbW9yeSkuCisKIGRpcnR5X3dyaXRlYmFja19jZW50aXNlY3MKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9od21vbi9hYml0dWd1cnUtZGF0YXNoZWV0IGIvRG9jdW1lbnRhdGlvbi9od21vbi9hYml0dWd1cnUtZGF0YXNoZWV0CmluZGV4IGFlZjVhOWIuLmQ5MjUxZWYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vaHdtb24vYWJpdHVndXJ1LWRhdGFzaGVldAorKysgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL2FiaXR1Z3VydS1kYXRhc2hlZXQKQEAgLTc0LDcgKzc0LDcgQEAKIE5vdGljZSB0aGF0IHNvbWUgYmFua3MgaGF2ZSBib3RoIGEgcmVhZCBhbmQgYSB3cml0ZSBhZGRyZXNzIHRoaXMgaXMgaG93IHRoZQogdUd1cnUgZGV0ZXJtaW5lcyBpZiBhIHJlYWQgZnJvbSBvciBhIHdyaXRlIHRvIHRoZSBiYW5rIGlzIHRha2luZyBwbGFjZSwgdGh1cwogd2hlbiByZWFkaW5nIHlvdSBzaG91bGQgYWx3YXlzIHVzZSB0aGUgcmVhZCBhZGRyZXNzIGFuZCB3aGVuIHdyaXRpbmcgdGhlCi13cml0ZSBhZGRyZXNzLiBUaGUgd3JpdGUgYWRkcmVzcyBpcyBhbHdheXMgb25lICgxKSBtb3JlIHRoZW4gdGhlIHJlYWQgYWRkcmVzcy4KK3dyaXRlIGFkZHJlc3MuIFRoZSB3cml0ZSBhZGRyZXNzIGlzIGFsd2F5cyBvbmUgKDEpIG1vcmUgdGhhbiB0aGUgcmVhZCBhZGRyZXNzLgogCiAKIHVHdXJ1IHJlYWR5CkBAIC0xMjEsNyArMTIxLDcgQEAKIHRlc3QgZm9yIHRoaXMuIE5vdGljZSB0aGF0IHRoZSBudW1iZXIgb2YgYnl0ZXMgaXMgYmFuayBhZGRyZXNzIGRlcGVuZGVudCBzZWUKIGFib3ZlIGFuZCBiZWxvdy4KIAotQWZ0ZXIgY29tcGxldGluZyBhIHN1Y2Nlc3NmdWxsIHJlYWQgaXQgaXMgYWR2aXNlZCB0byBwdXQgdGhlIHVHdXJ1IGJhY2sgaW4KK0FmdGVyIGNvbXBsZXRpbmcgYSBzdWNjZXNzZnVsIHJlYWQgaXQgaXMgYWR2aXNlZCB0byBwdXQgdGhlIHVHdXJ1IGJhY2sgaW4KIHJlYWR5IG1vZGUsIHNvIHRoYXQgaXQgaXMgcmVhZHkgZm9yIHRoZSBuZXh0IHJlYWQgLyB3cml0ZSBjeWNsZS4gVGhpcyB3YXkKIGlmIHlvdXIgcHJvZ3JhbSAvIGRyaXZlciBpcyB1bmxvYWRlZCBhbmQgbGF0ZXIgbG9hZGVkIGFnYWluIHRoZSBkZXRlY3Rpb24KIGFsZ29yaXRobSBkZXNjcmliZWQgYWJvdmUgd2lsbCBzdGlsbCB3b3JrLgpAQCAtMTQxLDcgKzE0MSw3IEBACiAKIE9uY2UgREFUQSBob2xkcyAweDAxIHJlYWQgQ01EIGl0IHNob3VsZCBob2xkIDB4QUMgbm93LgogCi1BZnRlciBjb21wbGV0aW5nIGEgc3VjY2Vzc2Z1bGwgd3JpdGUgaXQgaXMgYWR2aXNlZCB0byBwdXQgdGhlIHVHdXJ1IGJhY2sgaW4KK0FmdGVyIGNvbXBsZXRpbmcgYSBzdWNjZXNzZnVsIHdyaXRlIGl0IGlzIGFkdmlzZWQgdG8gcHV0IHRoZSB1R3VydSBiYWNrIGluCiByZWFkeSBtb2RlLCBzbyB0aGF0IGl0IGlzIHJlYWR5IGZvciB0aGUgbmV4dCByZWFkIC8gd3JpdGUgY3ljbGUuIFRoaXMgd2F5CiBpZiB5b3VyIHByb2dyYW0gLyBkcml2ZXIgaXMgdW5sb2FkZWQgYW5kIGxhdGVyIGxvYWRlZCBhZ2FpbiB0aGUgZGV0ZWN0aW9uCiBhbGdvcml0aG0gZGVzY3JpYmVkIGFib3ZlIHdpbGwgc3RpbGwgd29yay4KQEAgLTIyNCw3ICsyMjQsNyBAQAogQml0IDQ6IDEgaWYgYWxhcm0gY2F1c2UgbWVhc3VyZWQgdGVtcCBpcyBvdmVyIHRoZSB3YXJuaW5nIHRocmVzaG9sZAkoUikKIEJpdCA1OiAxIGlmIGFsYXJtIGNhdXNlIG1lYXN1cmVkIHZvbHQgaXMgb3ZlciB0aGUgbWF4IHRocmVzaG9sZAkJKFIpCiBCaXQgNjogMSBpZiBhbGFybSBjYXVzZSBtZWFzdXJlZCB2b2x0IGlzIHVuZGVyIHRoZSBtaW4gdGhyZXNob2xkCShSKQotQml0IDc6IFZvbHQgc2Vuc29yOiBTaHV0ZG93biBpZiBhbGFybSBwZXJzaXN0IGZvciBtb3JlIHRoZW4gNCBzZWNvbmRzCShSVykKK0JpdCA3OiBWb2x0IHNlbnNvcjogU2h1dGRvd24gaWYgYWxhcm0gcGVyc2lzdCBmb3IgbW9yZSB0aGFuIDQgc2Vjb25kcwkoUlcpCiAgICAgICAgVGVtcCBzZW5zb3I6IFNodXRkb3duIGlmIHRlbXAgaXMgb3ZlciB0aGUgc2h1dGRvd24gdGhyZXNob2xkCShSVykKIAogKiAgVGhpcyBiaXQgaXMgb25seSBob25vcmVkL3VzZWQgYnkgdGhlIHVHdXJ1IGlmIGEgdGVtcCBzZW5zb3IgaXMgY29ubmVjdGVkCkBAIC0yOTMsNyArMjkzLDcgQEAKIEFsYXJtIGJlaGF2aW91ciBmb3IgdGhlIHNlbGVjdGVkIHNlbnNvci4gQSAxIGVuYWJsZXMgdGhlIGRlc2NyaWJlZCBiZWhhdmlvdXIuCiBCaXQgMDogR2l2ZSBhbiBhbGFybSBpZiBtZWFzdXJlZCBycG0gaXMgdW5kZXIgdGhlIG1pbiB0aHJlc2hvbGQJKFJXKQogQml0IDM6IEJlZXAgaWYgYWxhcm0JCQkJCQkoUlcpCi1CaXQgNzogU2h1dGRvd24gaWYgYWxhcm0gcGVyc2lzdCBmb3IgbW9yZSB0aGVuIDQgc2Vjb25kcwkoUlcpCitCaXQgNzogU2h1dGRvd24gaWYgYWxhcm0gcGVyc2lzdCBmb3IgbW9yZSB0aGFuIDQgc2Vjb25kcwkoUlcpCiAKIEJ5dGUgMToKIG1pbiB0aHJlc2hvbGQgKHNjYWxlIGFzIGJhbmsgMHgyNikKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaHdtb24vYWR0NzQ3MCBiL0RvY3VtZW50YXRpb24vaHdtb24vYWR0NzQ3MAppbmRleCA3NWQxM2NhLi44Y2U0YWEwIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2h3bW9uL2FkdDc0NzAKKysrIGIvRG9jdW1lbnRhdGlvbi9od21vbi9hZHQ3NDcwCkBAIC0zMSwxNSArMzEsMTEgQEAKIGxpbWl0IHZhbHVlcy4gVGhlIEFEVDc0NzAgd2lsbCBzaWduYWwgYW4gQUxBUk0gaWYgYW55IG1lYXN1cmVkIHZhbHVlIGV4Y2VlZHMKIGVpdGhlciBsaW1pdC4KIAotVGhlIEFEVDc0NzAgRE9FUyBOT1Qgc2FtcGxlIGFsbCBpbnB1dHMgY29udGludW91c2x5LiAgQSBzaW5nbGUgcGluIG9uIHRoZQotQURUNzQ3MCBpcyBjb25uZWN0ZWQgdG8gYSBtdWx0aXR1ZGUgb2YgdGhlcm1hbCBkaW9kZXMsIGJ1dCB0aGUgY2hpcCBtdXN0IGJlCi1pbnN0cnVjdGVkIGV4cGxpY2l0bHkgdG8gcmVhZCB0aGUgbXVsdGl0dWRlIG9mIGRpb2Rlcy4gIElmIHlvdSB3YW50IHRvIHVzZQotYXV0b21hdGljIGZhbiBjb250cm9sIG1vZGUsIHlvdSBtdXN0IG1hbnVhbGx5IHJlYWQgYW55IG9mIHRoZSB0ZW1wZXJhdHVyZQotc2Vuc29ycyBvciB0aGUgZmFuIGNvbnRyb2wgYWxnb3JpdGhtIHdpbGwgbm90IHJ1bi4gIFRoZSBjaGlwIFdJTEwgTk9UIERPIFRISVMKLUFVVE9NQVRJQ0FMTFk7IHRoaXMgbXVzdCBiZSBkb25lIGZyb20gdXNlcnNwYWNlLiAgVGhpcyBtYXkgYmUgYSBidWcgaW4gdGhlIGNoaXAKLWRlc2lnbiwgZ2l2ZW4gdGhhdCBtYW55IG90aGVyIEFEIGNoaXBzIHRha2UgY2FyZSBvZiB0aGlzLiAgVGhlIGRyaXZlciB3aWxsIG5vdAotcmVhZCB0aGUgcmVnaXN0ZXJzIG1vcmUgb2Z0ZW4gdGhhbiBvbmNlIGV2ZXJ5IDUgc2Vjb25kcy4gIEZ1cnRoZXIsCi1jb25maWd1cmF0aW9uIGRhdGEgaXMgb25seSByZWFkIG9uY2UgcGVyIG1pbnV0ZS4KK1RoZSBBRFQ3NDcwIHNhbXBsZXMgYWxsIGlucHV0cyBjb250aW51b3VzbHkuICBBIGtlcm5lbCB0aHJlYWQgaXMgc3RhcnRlZCB1cCBmb3IKK3RoZSBwdXJwb3NlIG9mIHBlcmlvZGljYWxseSBxdWVyeWluZyB0aGUgdGVtcGVyYXR1cmUgc2Vuc29ycywgdGh1cyBhbGxvd2luZyB0aGUKK2F1dG9tYXRpYyBmYW4gcHdtIGNvbnRyb2wgdG8gc2V0IHRoZSBmYW4gc3BlZWQuICBUaGUgZHJpdmVyIHdpbGwgbm90IHJlYWQgdGhlCityZWdpc3RlcnMgbW9yZSBvZnRlbiB0aGFuIG9uY2UgZXZlcnkgNSBzZWNvbmRzLiAgRnVydGhlciwgY29uZmlndXJhdGlvbiBkYXRhIGlzCitvbmx5IHJlYWQgb25jZSBwZXIgbWludXRlLgogCiBTcGVjaWFsIEZlYXR1cmVzCiAtLS0tLS0tLS0tLS0tLS0tCkBAIC03Miw1ICs2OCw2IEBACiBOb3RlcwogLS0tLS0KIAotQXMgc3RhdGVkIGFib3ZlLCB0aGUgdGVtcGVyYXR1cmUgaW5wdXRzIG11c3QgYmUgcmVhZCBwZXJpb2RpY2FsbHkgZnJvbQotdXNlcnNwYWNlIGluIG9yZGVyIGZvciB0aGUgYXV0b21hdGljIHB3bSBhbGdvcml0aG0gdG8gcnVuLgorVGhlIHRlbXBlcmF0dXJlIGlucHV0cyBubyBsb25nZXIgbmVlZCB0byBiZSByZWFkIHBlcmlvZGljYWxseSBmcm9tIHVzZXJzcGFjZSBpbgorb3JkZXIgZm9yIHRoZSBhdXRvbWF0aWMgcHdtIGFsZ29yaXRobSB0byBydW4uICBUaGlzIHdhcyB0aGUgY2FzZSBmb3IgZWFybGllcgordmVyc2lvbnMgb2YgdGhlIGRyaXZlci4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaHdtb24vZjcxODgyZmcgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL2Y3MTg4MmZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4MzIxMjYKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL2Y3MTg4MmZnCkBAIC0wLDAgKzEsODkgQEAKK0tlcm5lbCBkcml2ZXIgZjcxODgyZmcKKz09PT09PT09PT09PT09PT09PT09PT0KKworU3VwcG9ydGVkIGNoaXBzOgorICAqIEZpbnRlayBGNzE4ODJGRyBhbmQgRjcxODgzRkcKKyAgICBQcmVmaXg6ICdmNzE4ODJmZycKKyAgICBBZGRyZXNzZXMgc2Nhbm5lZDogbm9uZSwgYWRkcmVzcyByZWFkIGZyb20gU3VwZXIgSS9PIGNvbmZpZyBzcGFjZQorICAgIERhdGFzaGVldDogQXZhaWxhYmxlIGZyb20gdGhlIEZpbnRlayB3ZWJzaXRlCisgICogRmludGVrIEY3MTg2MkZHIGFuZCBGNzE4NjNGRworICAgIFByZWZpeDogJ2Y3MTg2MmZnJworICAgIEFkZHJlc3NlcyBzY2FubmVkOiBub25lLCBhZGRyZXNzIHJlYWQgZnJvbSBTdXBlciBJL08gY29uZmlnIHNwYWNlCisgICAgRGF0YXNoZWV0OiBBdmFpbGFibGUgZnJvbSB0aGUgRmludGVrIHdlYnNpdGUKKyAgKiBGaW50ZWsgRjgwMDAKKyAgICBQcmVmaXg6ICdmODAwMCcKKyAgICBBZGRyZXNzZXMgc2Nhbm5lZDogbm9uZSwgYWRkcmVzcyByZWFkIGZyb20gU3VwZXIgSS9PIGNvbmZpZyBzcGFjZQorICAgIERhdGFzaGVldDogTm90IHB1YmxpYworCitBdXRob3I6IEhhbnMgZGUgR29lZGUgPGhkZWdvZWRlQHJlZGhhdC5jb20+CisKKworRGVzY3JpcHRpb24KKy0tLS0tLS0tLS0tCisKK0ZpbnRlayBGNzE4eHhGRy9GODAwMCBTdXBlciBJL08gY2hpcHMgaW5jbHVkZSBjb21wbGV0ZSBoYXJkd2FyZSBtb25pdG9yaW5nCitjYXBhYmlsaXRpZXMuIFRoZXkgY2FuIG1vbml0b3IgdXAgdG8gOSB2b2x0YWdlcyAoMyBmb3IgdGhlIEY4MDAwKSwgNCBmYW5zIGFuZAorMyB0ZW1wZXJhdHVyZSBzZW5zb3JzLgorCitUaGVzZSBjaGlwcyBhbHNvIGhhdmUgZmFuIGNvbnRyb2xsaW5nIGZlYXR1cmVzLCB1c2luZyBlaXRoZXIgREMgb3IgUFdNLCBpbgordGhyZWUgZGlmZmVyZW50IG1vZGVzIChvbmUgbWFudWFsLCB0d28gYXV0b21hdGljKS4KKworVGhlIGRyaXZlciBhc3N1bWVzIHRoYXQgbm8gbW9yZSB0aGFuIG9uZSBjaGlwIGlzIHByZXNlbnQsIHdoaWNoIHNlZW1zCityZWFzb25hYmxlLgorCisKK01vbml0b3JpbmcKKy0tLS0tLS0tLS0KKworVGhlIFZvbHRhZ2UsIEZhbiBhbmQgVGVtcGVyYXR1cmUgTW9uaXRvcmluZyB1c2VzIHRoZSBzdGFuZGFyZCBzeXNmcworaW50ZXJmYWNlIGFzIGRvY3VtZW50ZWQgaW4gc3lzZnMtaW50ZXJmYWNlLCB3aXRob3V0IGFueSBleGNlcHRpb25zLgorCisKK0ZhbiBDb250cm9sCistLS0tLS0tLS0tLQorCitCb3RoIFBXTSAocHVsc2Utd2lkdGggbW9kdWxhdGlvbikgYW5kIERDIGZhbiBzcGVlZCBjb250cm9sIG1ldGhvZHMgYXJlCitzdXBwb3J0ZWQuIFRoZSByaWdodCBvbmUgdG8gdXNlIGRlcGVuZHMgb24gZXh0ZXJuYWwgY2lyY3VpdHJ5IG9uIHRoZQorbW90aGVyYm9hcmQsIHNvIHRoZSBkcml2ZXIgYXNzdW1lcyB0aGF0IHRoZSBCSU9TIHNldCB0aGUgbWV0aG9kCitwcm9wZXJseS4KKworVGhlcmUgYXJlIDIgbW9kZXMgdG8gc3BlY2lmeSB0aGUgc3BlZWQgb2YgdGhlIGZhbiwgUFdNIGR1dHkgY3ljbGUgKG9yIERDCit2b2x0YWdlKSBtb2RlLCB3aGVyZSAwLTEwMCUgZHV0eSBjeWNsZSAoMC0xMDAlIG9mIDEyVikgaXMgc3BlY2lmaWVkLiBBbmQgUlBNCittb2RlIHdoZXJlIHRoZSBhY3R1YWwgUlBNIG9mIHRoZSBmYW4gKGFzIG1lYXN1cmVkKSBpcyBjb250cm9sbGVkIGFuZCB0aGUgc3BlZWQKK2dldHMgc3BlY2lmaWVkIGFzIDAtMTAwJSBvZiB0aGUgZmFuI19mdWxsX3NwZWVkIGZpbGUuCisKK1NpbmNlIGJvdGggbW9kZXMgd29yayBpbiBhIDAtMTAwJSAobWFwcGVkIHRvIDAtMjU1KSBzY2FsZSwgdGhlcmUgaXNuJ3QgYQord2hvbGUgbG90IG9mIGEgZGlmZmVyZW5jZSB3aGVuIG1vZGlmeWluZyBmYW4gY29udHJvbCBzZXR0aW5ncy4gVGhlIG9ubHkKK2ltcG9ydGFudCBkaWZmZXJlbmNlIGlzIHRoYXQgaW4gUlBNIG1vZGUgdGhlIDAtMTAwJSBjb250cm9scyB0aGUgZmFuIHNwZWVkCitiZXR3ZWVuIDAtMTAwJSBvZiBmYW4jX2Z1bGxfc3BlZWQuIEl0IGlzIGFzc3VtZWQgdGhhdCBpZiB0aGUgQklPUyBwcm9ncmFtcworUlBNIG1vZGUsIGl0IHdpbGwgYWxzbyBzZXQgZmFuI19mdWxsX3NwZWVkIHByb3Blcmx5LCBpZiBpdCBkb2VzIG5vdCB0aGVuCitmYW4gY29udHJvbCB3aWxsIG5vdCB3b3JrIHByb3Blcmx5LCB1bmxlc3MgeW91IHNldCBhIHNhbmUgZmFuI19mdWxsX3NwZWVkCit2YWx1ZSB5b3Vyc2VsZi4KKworU3dpdGNoaW5nIGJldHdlZW4gdGhlc2UgbW9kZXMgcmVxdWlyZXMgcmUtaW5pdGlhbGl6aW5nIGEgd2hvbGUgYnVuY2ggb2YKK3JlZ2lzdGVycywgc28gdGhlIG1vZGUgd2hpY2ggdGhlIEJJT1MgaGFzIHNldCBpcyBrZXB0LiBUaGUgbW9kZSBpcworcHJpbnRlZCB3aGVuIGxvYWRpbmcgdGhlIGRyaXZlci4KKworVGhyZWUgZGlmZmVyZW50IGZhbiBjb250cm9sIG1vZGVzIGFyZSBzdXBwb3J0ZWQ7IHRoZSBtb2RlIG51bWJlciBpcyB3cml0dGVuCit0byB0aGUgcHdtI19lbmFibGUgZmlsZS4gTm90ZSB0aGF0IG5vdCBhbGwgbW9kZXMgYXJlIHN1cHBvcnRlZCBvbiBhbGwKK2NoaXBzLCBhbmQgc29tZSBtb2RlcyBtYXkgb25seSBiZSBhdmFpbGFibGUgaW4gUlBNIC8gUFdNIG1vZGUgb24gdGhlIEY4MDAwLgorV3JpdGluZyBhbiB1bnN1cHBvcnRlZCBtb2RlIHdpbGwgcmVzdWx0IGluIGFuIGludmFsaWQgcGFyYW1ldGVyIGVycm9yLgorCisqIDE6IE1hbnVhbCBtb2RlCisgIFlvdSBhc2sgZm9yIGEgc3BlY2lmaWMgUFdNIGR1dHkgY3ljbGUgLyBEQyB2b2x0YWdlIG9yIGEgc3BlY2lmaWMgJSBvZgorICBmYW4jX2Z1bGxfc3BlZWQgYnkgd3JpdGluZyB0byB0aGUgcHdtIyBmaWxlLiBUaGlzIG1vZGUgaXMgb25seQorICBhdmFpbGFibGUgb24gdGhlIEY4MDAwIGlmIHRoZSBmYW4gY2hhbm5lbCBpcyBpbiBSUE0gbW9kZS4KKworKiAyOiBOb3JtYWwgYXV0byBtb2RlCisgIFlvdSBjYW4gZGVmaW5lIGEgbnVtYmVyIG9mIHRlbXBlcmF0dXJlL2ZhbiBzcGVlZCB0cmlwIHBvaW50cywgd2hpY2ggJSB0aGUKKyAgZmFuIHNob3VsZCBydW4gYXQgYXQgdGhpcyB0ZW1wIGFuZCB3aGljaCB0ZW1wIGEgZmFuIHNob3VsZCBmb2xsb3cgdXNpbmcgdGhlCisgIHN0YW5kYXJkIHN5c2ZzIGludGVyZmFjZS4gVGhlIG51bWJlciBhbmQgdHlwZSBvZiB0cmlwIHBvaW50cyBpcyBjaGlwCisgIGRlcGVuZGVkLCBzZWUgd2hpY2ggZmlsZXMgYXJlIGF2YWlsYWJsZSBpbiBzeXNmcy4KKyAgRmFuL1BXTSBjaGFubmVsIDMgb2YgdGhlIEY4MDAwIGlzIGFsd2F5cyBpbiB0aGlzIG1vZGUhCisKKyogMzogVGhlcm1vc3RhdCBtb2RlIChPbmx5IGF2YWlsYWJsZSBvbiB0aGUgRjgwMDAgd2hlbiBpbiBkdXR5IGN5Y2xlIG1vZGUpCisgIFRoZSBmYW4gc3BlZWQgaXMgcmVndWxhdGVkIHRvIGtlZXAgdGhlIHRlbXAgdGhlIGZhbiBpcyBtYXBwZWQgdG8gYmV0d2VlbgorICB0ZW1wI19hdXRvX3BvaW50Ml90ZW1wIGFuZCB0ZW1wI19hdXRvX3BvaW50M190ZW1wLgorCitCb3RoIG9mIHRoZSBhdXRvbWF0aWMgbW9kZXMgcmVxdWlyZSB0aGF0IHB3bTEgY29ycmVzcG9uZHMgdG8gZmFuMSwgcHdtMiB0bworZmFuMiBhbmQgcHdtMyB0byBmYW4zLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9od21vbi9pdDg3IGIvRG9jdW1lbnRhdGlvbi9od21vbi9pdDg3CmluZGV4IDA0MmMwNDEuLjY1OTMxNWQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vaHdtb24vaXQ4NworKysgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL2l0ODcKQEAgLTI2LDYgKzI2LDEwIEBACiAgICAgRGF0YXNoZWV0OiBQdWJsaWNseSBhdmFpbGFibGUgYXQgdGhlIElURSB3ZWJzaXRlCiAgICAgICAgICAgICAgICBodHRwOi8vd3d3Lml0ZS5jb20udHcvcHJvZHVjdF9pbmZvL2ZpbGUvcGMvSVQ4NzE4Rl9WMC4yLnppcAogICAgICAgICAgICAgICAgaHR0cDovL3d3dy5pdGUuY29tLnR3L3Byb2R1Y3RfaW5mby9maWxlL3BjL0lUODcxOEZfVjAlMjAzXyhmb3IlMjBDJTIwdmVyc2lvbikuemlwCisgICogSVQ4NzIwRgorICAgIFByZWZpeDogJ2l0ODcyMCcKKyAgICBBZGRyZXNzZXMgc2Nhbm5lZDogZnJvbSBTdXBlciBJL08gY29uZmlnIHNwYWNlICg4IEkvTyBwb3J0cykKKyAgICBEYXRhc2hlZXQ6IE5vdCB5ZXQgcHVibGljbHkgYXZhaWxhYmxlLgogICAqIFNpUzk1MCAgIFtjbG9uZSBvZiBJVDg3MDVGXQogICAgIFByZWZpeDogJ2l0ODcnCiAgICAgQWRkcmVzc2VzIHNjYW5uZWQ6IGZyb20gU3VwZXIgSS9PIGNvbmZpZyBzcGFjZSAoOCBJL08gcG9ydHMpCkBAIC03MSw3ICs3NSw3IEBACiAtLS0tLS0tLS0tLQogCiBUaGlzIGRyaXZlciBpbXBsZW1lbnRzIHN1cHBvcnQgZm9yIHRoZSBJVDg3MDVGLCBJVDg3MTJGLCBJVDg3MTZGLAotSVQ4NzE4RiwgSVQ4NzI2RiBhbmQgU2lTOTUwIGNoaXBzLgorSVQ4NzE4RiwgSVQ4NzIwRiwgSVQ4NzI2RiBhbmQgU2lTOTUwIGNoaXBzLgogCiBUaGVzZSBjaGlwcyBhcmUgJ1N1cGVyIEkvTyBjaGlwcycsIHN1cHBvcnRpbmcgZmxvcHB5IGRpc2tzLCBpbmZyYXJlZCBwb3J0cywKIGpveXN0aWNrcyBhbmQgb3RoZXIgbWlzY2VsbGFuZW91cyBzdHVmZi4gRm9yIGhhcmR3YXJlIG1vbml0b3JpbmcsIHRoZXkKQEAgLTg0LDE5ICs4OCwxOSBAQAogdGhvdWdoLCBzbyB0aGUgZnVuY3Rpb25hbGl0eSBtYXkgbm90IGJlIGF2YWlsYWJsZSBvbiBhIGdpdmVuIHN5c3RlbS4KIFRoZSBkcml2ZXIgZHVtYmx5IGFzc3VtZSBpdCBpcyB0aGVyZS4KIAotVGhlIElUODcxOEYgYWxzbyBmZWF0dXJlcyBWSUQgaW5wdXRzICh1cCB0byA4IHBpbnMpIGJ1dCB0aGUgdmFsdWUgaXMKLXN0b3JlZCBpbiB0aGUgU3VwZXItSS9PIGNvbmZpZ3VyYXRpb24gc3BhY2UuIER1ZSB0byB0ZWNobmljYWwgbGltaXRhdGlvbnMsCitUaGUgSVQ4NzE4RiBhbmQgSVQ4NzIwRiBhbHNvIGZlYXR1cmVzIFZJRCBpbnB1dHMgKHVwIHRvIDggcGlucykgYnV0IHRoZSB2YWx1ZQoraXMgc3RvcmVkIGluIHRoZSBTdXBlci1JL08gY29uZmlndXJhdGlvbiBzcGFjZS4gRHVlIHRvIHRlY2huaWNhbCBsaW1pdGF0aW9ucywKIHRoaXMgdmFsdWUgY2FuIGN1cnJlbnRseSBvbmx5IGJlIHJlYWQgb25jZSBhdCBpbml0aWFsaXphdGlvbiB0aW1lLCBzbwogdGhlIGRyaXZlciB3b24ndCBub3RpY2UgYW5kIHJlcG9ydCBjaGFuZ2VzIGluIHRoZSBWSUQgdmFsdWUuIFRoZSB0d28KIHVwcGVyIFZJRCBiaXRzIHNoYXJlIHRoZWlyIHBpbnMgd2l0aCB2b2x0YWdlIGlucHV0cyAoaW41IGFuZCBpbjYpIHNvIHlvdQogY2FuJ3QgaGF2ZSBib3RoIG9uIGEgZ2l2ZW4gYm9hcmQuCiAKLVRoZSBJVDg3MTZGLCBJVDg3MThGIGFuZCBsYXRlciBJVDg3MTJGIHJldmlzaW9ucyBoYXZlIHN1cHBvcnQgZm9yCitUaGUgSVQ4NzE2RiwgSVQ4NzE4RiwgSVQ4NzIwRiBhbmQgbGF0ZXIgSVQ4NzEyRiByZXZpc2lvbnMgaGF2ZSBzdXBwb3J0IGZvcgogMiBhZGRpdGlvbmFsIGZhbnMuIFRoZSBhZGRpdGlvbmFsIGZhbnMgYXJlIHN1cHBvcnRlZCBieSB0aGUgZHJpdmVyLgogCi1UaGUgSVQ4NzE2RiBhbmQgSVQ4NzE4RiwgYW5kIGxhdGUgSVQ4NzEyRiBhbmQgSVQ4NzA1RiBhbHNvIGhhdmUgb3B0aW9uYWwKLTE2LWJpdCB0YWNob21ldGVyIGNvdW50ZXJzIGZvciBmYW5zIDEgdG8gMy4gVGhpcyBpcyBiZXR0ZXIgKG5vIG1vcmUgZmFuCi1jbG9jayBkaXZpZGVyIG1lc3MpIGJ1dCBub3QgY29tcGF0aWJsZSB3aXRoIHRoZSBvbGRlciBjaGlwcyBhbmQKK1RoZSBJVDg3MTZGLCBJVDg3MThGIGFuZCBJVDg3MjBGLCBhbmQgbGF0ZSBJVDg3MTJGIGFuZCBJVDg3MDVGIGFsc28gaGF2ZQorb3B0aW9uYWwgMTYtYml0IHRhY2hvbWV0ZXIgY291bnRlcnMgZm9yIGZhbnMgMSB0byAzLiBUaGlzIGlzIGJldHRlciAobm8gbW9yZQorZmFuIGNsb2NrIGRpdmlkZXIgbWVzcykgYnV0IG5vdCBjb21wYXRpYmxlIHdpdGggdGhlIG9sZGVyIGNoaXBzIGFuZAogcmV2aXNpb25zLiBUaGUgMTYtYml0IHRhY2hvbWV0ZXIgbW9kZSBpcyBlbmFibGVkIGJ5IHRoZSBkcml2ZXIgd2hlbiBvbmUKIG9mIHRoZSBhYm92ZSBjaGlwcyBpcyBkZXRlY3RlZC4KIApAQCAtMTIyLDcgKzEyNiw3IEBACiBpbnB1dHMgY2FuIG1lYXN1cmUgdm9sdGFnZXMgYmV0d2VlbiAwIGFuZCA0LjA4IHZvbHRzLCB3aXRoIGEgcmVzb2x1dGlvbiBvZgogMC4wMTYgdm9sdC4gVGhlIGJhdHRlcnkgdm9sdGFnZSBpbjggZG9lcyBub3QgaGF2ZSBsaW1pdCByZWdpc3RlcnMuCiAKLVRoZSBWSUQgbGluZXMgKElUODcxMkYvSVQ4NzE2Ri9JVDg3MThGKSBlbmNvZGUgdGhlIGNvcmUgdm9sdGFnZSB2YWx1ZToKK1RoZSBWSUQgbGluZXMgKElUODcxMkYvSVQ4NzE2Ri9JVDg3MThGL0lUODcyMEYpIGVuY29kZSB0aGUgY29yZSB2b2x0YWdlIHZhbHVlOgogdGhlIHZvbHRhZ2UgbGV2ZWwgeW91ciBwcm9jZXNzb3Igc2hvdWxkIHdvcmsgd2l0aC4gVGhpcyBpcyBoYXJkY29kZWQgYnkKIHRoZSBtYWluYm9hcmQgYW5kL29yIHByb2Nlc3NvciBpdHNlbGYuIEl0IGlzIGEgdmFsdWUgaW4gdm9sdHMuCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaHdtb24vbG03MCBiL0RvY3VtZW50YXRpb24vaHdtb24vbG03MAppbmRleCAyYmRkM2ZlLi4wZDI0MDI5IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2h3bW9uL2xtNzAKKysrIGIvRG9jdW1lbnRhdGlvbi9od21vbi9sbTcwCkBAIC0xLDkgKzEsMTEgQEAKIEtlcm5lbCBkcml2ZXIgbG03MAogPT09PT09PT09PT09PT09PT09CiAKLVN1cHBvcnRlZCBjaGlwOgorU3VwcG9ydGVkIGNoaXBzOgogICAqIE5hdGlvbmFsIFNlbWljb25kdWN0b3IgTE03MAogICAgIERhdGFzaGVldDogaHR0cDovL3d3dy5uYXRpb25hbC5jb20vcGYvTE0vTE03MC5odG1sCisgICogVGV4YXMgSW5zdHJ1bWVudHMgVE1QMTIxL1RNUDEyMworICAgIEluZm9ybWF0aW9uOiBodHRwOi8vZm9jdXMudGkuY29tL2RvY3MvcHJvZC9mb2xkZXJzL3ByaW50L3RtcDEyMS5odG1sCiAKIEF1dGhvcjoKICAgICAgICAgS2Fpd2FuIE4gQmlsbGltb3JpYSA8a2Fpd2FuQGRlc2lnbmVyZ3JhcGhpeC5jb20+CkBAIC0yNSw2ICsyNywxNCBAQAogZHJpdmVyIGZvciBpbnRlcnByZXRhdGlvbi4gVGhpcyBkcml2ZXIgbWFrZXMgdXNlIG9mIHRoZSBrZXJuZWwncyBpbi1jb3JlCiBTUEkgc3VwcG9ydC4KIAorQXMgYSByZWFsIChpbi10cmVlKSBleGFtcGxlIG9mIHRoaXMgIlNQSSBwcm90b2NvbCBkcml2ZXIiIGludGVyZmFjaW5nCit3aXRoIGEgIlNQSSBtYXN0ZXIgY29udHJvbGxlciBkcml2ZXIiLCBzZWUgZHJpdmVycy9zcGkvc3BpX2xtNzBsbHAuYworYW5kIGl0cyBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24uCisKK1RoZSBUTVAxMjEvVE1QMTIzIGFyZSB2ZXJ5IHNpbWlsYXI7IG1haW4gZGlmZmVyZW5jZXMgYXJlIDQgd2lyZSBTUEkgaW50ZXItCitmYWNlIChyZWFkIG9ubHkpIGFuZCAxMy1iaXQgdGVtcGVyYXR1cmUgZGF0YSAoMC4wNjI1IGRlZ3JlZXMgY2Vsc2l1cyByZXNvLQorbHV0aW9uKS4KKwogVGhhbmtzIHRvCiAtLS0tLS0tLS0KIEplYW4gRGVsdmFyZSA8a2hhbGlAbGludXgtZnIub3JnPiBmb3IgbWVudG9yaW5nIHRoZSBod21vbi1zaWRlIGRyaXZlcgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9od21vbi9sbTg1IGIvRG9jdW1lbnRhdGlvbi9od21vbi9sbTg1CmluZGV4IDQwMDYyMDcuLmExMzY4MDggMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vaHdtb24vbG04NQorKysgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL2xtODUKQEAgLTE2NCw3ICsxNjQsNyBAQAogICAgICAgICAgICAgICAgICAgICAgIHRlbXBlcmF0dXJlLiAoUFdNIHZhbHVlIGZyb20gMCB0byAyNTUpCiAKICogcHdtI19hdXRvX3B3bV9taW5jdGwgLSB0aGlzIGZsYWdzIHNlbGVjdHMgZm9yIHRlbXAjX2F1dG9fdGVtcF9vZmYgdGVtcGVyYXR1cmUKLSAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYmFoYXZpb3VyIG9mIGZhbnMuIFdyaXRlIDEgdG8gbGV0IGZhbnMgc3Bpbm5pbmcgYXQKKyAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYmVoYXZpb3VyIG9mIGZhbnMuIFdyaXRlIDEgdG8gbGV0IGZhbnMgc3Bpbm5pbmcgYXQKIAkJCSBwd20jX2F1dG9fcHdtX21pbiBvciB3cml0ZSAwIHRvIGxldCB0aGVtIG9mZi4KIAogTk9URTogSXQgaGFzIGJlZW4gcmVwb3J0ZWQgdGhhdCB0aGVyZSBpcyBhIGJ1ZyBpbiB0aGUgTE04NSB0aGF0IGNhdXNlcyB0aGUgZmxhZwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9od21vbi9sdGM0MjQ1IGIvRG9jdW1lbnRhdGlvbi9od21vbi9sdGM0MjQ1Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhZTdhM2EKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL2x0YzQyNDUKQEAgLTAsMCArMSw4MSBAQAorS2VybmVsIGRyaXZlciBsdGM0MjQ1Cis9PT09PT09PT09PT09PT09PT09PT0KKworU3VwcG9ydGVkIGNoaXBzOgorICAqIExpbmVhciBUZWNobm9sb2d5IExUQzQyNDUKKyAgICBQcmVmaXg6ICdsdGM0MjQ1JworICAgIEFkZHJlc3NlcyBzY2FubmVkOiAweDIwLTB4M2YKKyAgICBEYXRhc2hlZXQ6CisgICAgICAgIGh0dHA6Ly93d3cubGluZWFyLmNvbS9wYy9kb3dubG9hZERvY3VtZW50LmRvP25hdklkPUgwLEMxLEMxMDAzLEMxMDA2LEMxMTQwLFAxOTM5MixEMTM1MTcKKworQXV0aG9yOiBJcmEgVy4gU255ZGVyIDxpd3NAb3Zyby5jYWx0ZWNoLmVkdT4KKworCitEZXNjcmlwdGlvbgorLS0tLS0tLS0tLS0KKworVGhlIExUQzQyNDUgY29udHJvbGxlciBhbGxvd3MgYSBib2FyZCB0byBiZSBzYWZlbHkgaW5zZXJ0ZWQgYW5kIHJlbW92ZWQKK2Zyb20gYSBsaXZlIGJhY2twbGFuZSBpbiBtdWx0aXBsZSBzdXBwbHkgc3lzdGVtcyBzdWNoIGFzIENvbXBhY3RQQ0kgYW5kCitQQ0kgRXhwcmVzcy4KKworCitVc2FnZSBOb3RlcworLS0tLS0tLS0tLS0KKworVGhpcyBkcml2ZXIgZG9lcyBub3QgcHJvYmUgZm9yIExUQzQyNDUgZGV2aWNlcywgZHVlIHRvIHRoZSBmYWN0IHRoYXQgc29tZQorb2YgdGhlIHBvc3NpYmxlIGFkZHJlc3NlcyBhcmUgdW5mcmllbmRseSB0byBwcm9iaW5nLiBZb3Ugd2lsbCBuZWVkIHRvIHVzZQordGhlICJmb3JjZSIgcGFyYW1ldGVyIHRvIHRlbGwgdGhlIGRyaXZlciB3aGVyZSB0byBmaW5kIHRoZSBkZXZpY2UuCisKK0V4YW1wbGU6IHRoZSBmb2xsb3dpbmcgd2lsbCBsb2FkIHRoZSBkcml2ZXIgZm9yIGFuIExUQzQyNDUgYXQgYWRkcmVzcyAweDIzCitvbiBJMkMgYnVzICMxOgorJCBtb2Rwcm9iZSBsdGM0MjQ1IGZvcmNlPTEsMHgyMworCisKK1N5c2ZzIGVudHJpZXMKKy0tLS0tLS0tLS0tLS0KKworVGhlIExUQzQyNDUgaGFzIGJ1aWx0LWluIGxpbWl0cyBmb3Igb3ZlciBhbmQgdW5kZXIgY3VycmVudCB3YXJuaW5ncy4gVGhpcworbWFrZXMgaXQgdmVyeSBsaWtlbHkgdGhhdCB0aGUgcmVmZXJlbmNlIGNpcmN1aXQgd2lsbCBiZSB1c2VkLgorCitUaGlzIGRyaXZlciB1c2VzIHRoZSB2YWx1ZXMgaW4gdGhlIGRhdGFzaGVldCB0byBjaGFuZ2UgdGhlIHJlZ2lzdGVyIHZhbHVlcworaW50byB0aGUgdmFsdWVzIHNwZWNpZmllZCBpbiB0aGUgc3lzZnMtaW50ZXJmYWNlIGRvY3VtZW50LiBUaGUgY3VycmVudCByZWFkaW5ncworcmVseSBvbiB0aGUgc2Vuc2UgcmVzaXN0b3JzIGxpc3RlZCBpbiBUYWJsZSAyOiAiU2Vuc2UgUmVzaXN0b3IgVmFsdWVzIi4KKworaW4xX2lucHV0CQkxMnYgaW5wdXQgdm9sdGFnZSAobVYpCitpbjJfaW5wdXQJCTV2ICBpbnB1dCB2b2x0YWdlIChtVikKK2luM19pbnB1dAkJM3YgIGlucHV0IHZvbHRhZ2UgKG1WKQoraW40X2lucHV0CQlWZWUgKC0xMnYpIGlucHV0IHZvbHRhZ2UgKG1WKQorCitpbjFfbWluX2FsYXJtCQkxMnYgaW5wdXQgdW5kZXJ2b2x0YWdlIGFsYXJtCitpbjJfbWluX2FsYXJtCQk1diAgaW5wdXQgdW5kZXJ2b2x0YWdlIGFsYXJtCitpbjNfbWluX2FsYXJtCQkzdiAgaW5wdXQgdW5kZXJ2b2x0YWdlIGFsYXJtCitpbjRfbWluX2FsYXJtCQlWZWUgKC0xMnYpIGlucHV0IHVuZGVydm9sdGFnZSBhbGFybQorCitjdXJyMV9pbnB1dAkJMTJ2IGN1cnJlbnQgKG1BKQorY3VycjJfaW5wdXQJCTV2ICBjdXJyZW50IChtQSkKK2N1cnIzX2lucHV0CQkzdiAgY3VycmVudCAobUEpCitjdXJyNF9pbnB1dAkJVmVlICgtMTJ2KSBjdXJyZW50IChtQSkKKworY3VycjFfbWF4X2FsYXJtCQkxMnYgb3ZlcmN1cnJlbnQgYWxhcm0KK2N1cnIyX21heF9hbGFybQkJNXYgIG92ZXJjdXJyZW50IGFsYXJtCitjdXJyM19tYXhfYWxhcm0JCTN2ICBvdmVyY3VycmVudCBhbGFybQorY3VycjRfbWF4X2FsYXJtCQlWZWUgKC0xMnYpIG92ZXJjdXJyZW50IGFsYXJtCisKK2luNV9pbnB1dAkJMTJ2IG91dHB1dCB2b2x0YWdlIChtVikKK2luNl9pbnB1dAkJNXYgIG91dHB1dCB2b2x0YWdlIChtVikKK2luN19pbnB1dAkJM3YgIG91dHB1dCB2b2x0YWdlIChtVikKK2luOF9pbnB1dAkJVmVlICgtMTJ2KSBvdXRwdXQgdm9sdGFnZSAobVYpCisKK2luNV9taW5fYWxhcm0JCTEydiBvdXRwdXQgdW5kZXJ2b2x0YWdlIGFsYXJtCitpbjZfbWluX2FsYXJtCQk1diAgb3V0cHV0IHVuZGVydm9sdGFnZSBhbGFybQoraW43X21pbl9hbGFybQkJM3YgIG91dHB1dCB1bmRlcnZvbHRhZ2UgYWxhcm0KK2luOF9taW5fYWxhcm0JCVZlZSAoLTEydikgb3V0cHV0IHVuZGVydm9sdGFnZSBhbGFybQorCitpbjlfaW5wdXQJCUdQSU8gIzEgdm9sdGFnZSBkYXRhCitpbjEwX2lucHV0CQlHUElPICMyIHZvbHRhZ2UgZGF0YQoraW4xMV9pbnB1dAkJR1BJTyAjMyB2b2x0YWdlIGRhdGEKKworcG93ZXIxX2lucHV0CQkxMnYgcG93ZXIgdXNhZ2UgKG1XKQorcG93ZXIyX2lucHV0CQk1diAgcG93ZXIgdXNhZ2UgKG1XKQorcG93ZXIzX2lucHV0CQkzdiAgcG93ZXIgdXNhZ2UgKG1XKQorcG93ZXI0X2lucHV0CQlWZWUgKC0xMnYpIHBvd2VyIHVzYWdlIChtVykKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaWRlL3dhcm0tcGx1Zy1ob3d0by50eHQgYi9Eb2N1bWVudGF0aW9uL2lkZS93YXJtLXBsdWctaG93dG8udHh0CmluZGV4IGQ1ODg1NDYuLjk4MTUyYmMgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vaWRlL3dhcm0tcGx1Zy1ob3d0by50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9pZGUvd2FybS1wbHVnLWhvd3RvLnR4dApAQCAtMTEsMyArMTEsOCBAQAogIyBlY2hvIC1uICIxIiA+IC9zeXMvY2xhc3MvaWRlX3BvcnQvaWRleC9zY2FuCiAKIGRvbmUKKworTk9URTogcGxlYXNlIG1ha2Ugc3VyZSB0aGF0IHBhcnRpdGlvbnMgYXJlIHVubW91bnRlZCBhbmQgdGhhdCB0aGVyZSBhcmUKK25vIG90aGVyIGFjdGl2ZSByZWZlcmVuY2VzIHRvIGRldmljZXMgYmVmb3JlIGRvaW5nICJkZWxldGVfZGV2aWNlcyIgc3RlcCwKK2Fsc28gZG8gbm90IGF0dGVtcHQgInNjYW4iIHN0ZXAgb24gZGV2aWNlcyBjdXJyZW50bHkgaW4gdXNlIC0tIG90aGVyd2lzZQorcmVzdWx0cyBtYXkgYmUgdW5wcmVkaWN0YWJsZSBhbmQgbGVhZCB0byBkYXRhIGxvc3MgaWYgeW91J3JlIHVubHVja3kKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaW5wdXQvd2Fsa2VyYTA3MDEudHh0IGIvRG9jdW1lbnRhdGlvbi9pbnB1dC93YWxrZXJhMDcwMS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGY0Mjg5ZQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vaW5wdXQvd2Fsa2VyYTA3MDEudHh0CkBAIC0wLDAgKzEsMTA5IEBACisKK1dhbGtlcmEgV0stMDcwMSB0cmFuc21pdHRlciBpcyBzdXBwbGllZCB3aXRoIGEgcmVhZHkgdG8gZmx5IFdhbGtlcmEKK2hlbGljb3B0ZXJzIHN1Y2ggYXMgSE0zNiwgSE0zNywgSE02MC4gVGhlIHdhbGtlcmEwNzAxIG1vZHVsZSBlbmFibGVzIHRvIHVzZQordGhpcyB0cmFuc21pdHRlciBhcyBqb3lzdGljaworCitEZXZlbCBob21lcGFnZSBhbmQgZG93bmxvYWQ6CitodHRwOi8venViLmZlaS50dWtlLnNrL3dhbGtlcmEtd2swNzAxLworCitvciB1c2UgY29naXRvOgorY2ctY2xvbmUgaHR0cDovL3p1Yi5mZWkudHVrZS5zay9HSVQvd2Fsa2VyYTA3MDEtam95c3RpY2sKKworCitDb25uZWN0aW5nIHRvIFBDOgorCitBdCBiYWNrIHNpZGUgb2YgdHJhbnNtaXR0ZXIgUy12aWRlbyBjb25uZWN0b3IgY2FuIGJlIGZvdW5kLiBNb2R1bGF0aW9uCitwdWxzZXMgZnJvbSBwcm9jZXNzb3IgdG8gSEYgcGFydCBjYW4gYmUgZm91bmQgYXQgcGluIDIgb2YgdGhpcyBjb25uZWN0b3IsCitwaW4gMyBpcyBHTkQuIEJldHdlZW4gcGluIDMgYW5kIENQVSA1azYgcmVzaXN0b3IgY2FuIGJlIGZvdW5kLiBUbyBnZXQKK21vZHVsYXRpb24gcHVsc2VzIHRvIFBDLCBzaWduYWwgcHVsc2VzIG11c3QgYmUgYW1wbGlmaWVkLgorCitDYWJsZTogKHdhbGtlcmEgVFggdG8gcGFycG9ydCkKKworV2Fsa2VyYSBXSy0wNzAxIFRYIFMtVklERU8gY29ubmVjdG9yOgorIChiYWNrIHNpZGUgb2YgVFgpCisgICAgIF9fICAgX18gICAgICAgICAgICAgIFMtdmlkZW86ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbm9uMjUKKyAgICAvICB8X3wgIFwgICAgICAgICAgICAgcGluIDIgKHNpZ25hbCkgICAgICAgICAgICAgIE5QTiAgICAgICAgICAgcGFycG9ydAorICAgLyBPIDQgMyBPIFwgICAgICAgICAgICBwaW4gMyAoR05EKSAgICAgICAgTEVEICAgICAgICBfX19fX19fX19fX19fX19fICAxMCBBQ0sKKyAgKCBPIDIgICAxIE8gKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBDCisgICBcICAgX19fICAgLyAgICAgIDIgX19fX19fX19fX19fX19fX19fX19fX19ffFx8X19fX198LworICAgIHwgW19fX10gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwvfCAgIEIgfFwKKyAgICAgLS0tLS0tLSAgICAgICAgMyBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffF9fX19fX19fX19fX19fX18gMjUgR05ECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRQorCisKK0kgdXNlIGdyZWVuIExFRCBhbmQgQkMxMDkgTlBOIHRyYW5zaXN0b3IuCisKK1NvZnR3YXJlOgorCitCdWlsZCBrZXJuZWwgd2l0aCB3YWxrZXJhMDcwMSBtb2R1bGUuIE1vZHVsZSB3YWxrZXJhMDcwMSBuZWVkIGV4Y2x1c2l2ZQorYWNjZXNzIHRvIHBhcnBvcnQsIG1vZHVsZXMgbGlrZSBscCBtdXN0IGJlIHVubG9hZGVkIGJlZm9yZSBsb2FkaW5nCit3YWxrZXJhMDcwMSBtb2R1bGUsIGNoZWNrIGRtZXNnIGZvciBlcnJvciBtZXNzYWdlcy4gQ29ubmVjdCBUWCB0byBQQyBieQorY2FibGUgYW5kIHJ1biBqc3Rlc3QgL2Rldi9pbnB1dC9qczAgdG8gc2VlIHZhbHVlcyBmcm9tIFRYLiBJZiBubyB2YWx1ZSBjYW4KK2JlIGNoYW5nZWQgYnkgVFggImpveXN0aWNrIiwgY2hlY2sgb3V0cHV0IGZyb20gL3Byb2MvaW50ZXJydXB0cy4gVmFsdWUgZm9yCisodXN1YWxseSBpcnE3KSBwYXJwb3J0IG11c3QgaW5jcmVhc2UgaWYgVFggaXMgb24uCisKKworCitUZWNobmljYWwgZGV0YWlsczoKKworRHJpdmVyIHVzZSBpbnRlcnJ1cHQgZnJvbSBwYXJwb3J0IEFDSyBpbnB1dCBiaXQgdG8gbWVhc3VyZSBwdWxzZSBsZW5ndGgKK3VzaW5nIGhydGltZXJzLgorCitGcmFtZSBmb3JtYXQ6CitCYXNlZCBvbiB3YWxrZXJhIFdLLTA3MDEgUENNIEZvcm1hdCBkZXNjcmlwdGlvbiBieSBTaGF1bCBFaXppa292aWNoLgorKGRvd25sb2FkZWQgZnJvbSBodHRwOi8vd3d3LnNtYXJ0cHJvcG9wbHVzLmNvbS9Eb2NzL1dhbGtlcmFfV2stMDcwMV9QQ00ucGRmKQorCitTaWduYWwgcHVsc2VzOgorICAgICAgICAgICAgICAgICAgIChBTkFMT0cpCisgICAgU1lOQyAgICAgIEJJTiAgIE9DVAorICArLS0tLS0tLS0tKyAgICAgICstLS0tLS0rCisgIHwgICAgICAgICB8ICAgICAgfCAgICAgIHwKKy0tKyAgICAgICAgICstLS0tLS0rICAgICAgKy0tLQorCitGcmFtZToKKyBTWU5DICwgQklOMSwgT0NUMSwgQklOMiwgT0NUMiAuLi4gQklOMjQsIE9DVDI0LCBCSU4yNSwgbmV4dCBmcmFtZSBTWU5DIC4uCisKK3B1bHNlIGxlbmd0aDoKKyAgIEJpbmFyeSB2YWx1ZXM6CQlBbmFsb2cgb2N0YWwgdmFsdWVzOgorCisgICAyODggdVMgQmluYXJ5IDAJCTMxOCB1UyAgICAgICAwMDAKKyAgIDQzOCB1UyBCaW5hcnkgMQkJMzk4IHVTICAgICAgIDAwMQorCQkJCTQ3OCB1UyAgICAgICAwMTAKKwkJCQk1NTggdVMgICAgICAgMDExCisJCQkJNjM4IHVTICAgICAgIDEwMAorICAxMzA2IHVTIFNZTkMJCQk3MTggdVMgICAgICAgMTAxCisJCQkJNzk4IHVTICAgICAgIDExMAorCQkJCTg3OCB1UyAgICAgICAxMTEKKworMjQgYmluK29jdCB2YWx1ZXMgKyAxIGJpbiB2YWx1ZSA9IDI0KjQrMSBiaXRzICA9IDk3IGJpdHMKKworKFdhcm5pbmcsIHB1bHNlcyBvbiBBQ0sgYXIgaW52ZXJ0ZWQgYnkgdHJhbnNpc3RvciwgaXJxIGlzIHJpc2VkIHVwIG9uIHN5bmMKK3RvIGJpbiBjaGFuZ2Ugb3Igb2N0YWwgdmFsdWUgdG8gYmluIGNoYW5nZSkuCisKK0JpbmFyeSBkYXRhIHJlcHJlc2VudGF0aW9uczoKKworT25lIGJpbmFyeSBhbmQgb2N0YWwgdmFsdWUgY2FuIGJlIGdyb3VwZWQgdG8gbmliYmxlLiAyNCBuaWJibGVzICsgb25lIGJpbmFyeQordmFsdWVzIGNhbiBiZSBzYW1wbGVkIGJldHdlZW4gc3luYyBwdWxzZXMuCisKK1ZhbHVlcyBmb3IgZmlyc3QgZm91ciBjaGFubmVscyAoYW5hbG9nIGpveXN0aWNrIHZhbHVlcykgY2FuIGJlIGZvdW5kIGluCitmaXJzdCAxMCBuaWJibGVzLiBBbmFsb2cgdmFsdWUgaXMgcmVwcmVzZW50ZWQgYnkgb25lIHNpZ24gYml0IGFuZCA5IGJpdAorYWJzb2x1dGUgYmluYXJ5IHZhbHVlLiAoMTAgYml0cyBwZXIgY2hhbm5lbCkuIE5leHQgbmliYmxlIGlzIGNoZWNrc3VtIGZvcgorZmlyc3QgdGVuIG5pYmJsZXMuCisKK05leHQgbmliYmxlcyAxMiAuLiAyMSByZXByZXNlbnRzIGZvdXIgY2hhbm5lbHMgKG5vdCBhbGwgY2hhbm5lbHMgY2FuIGJlCitkaXJlY3RseSBjb250cm9sbGVkIGZyb20gVFgpLiBCaW5hcnkgcmVwcmVzZW50YXRpb25zIGFyIHRoZSBzYW1lIGFzIGluIGZpcnN0Citmb3VyIGNoYW5uZWxzLiBJbiBuaWJibGVzIDIyIGFuZCAyMyBpcyBhIHNwZWNpYWwgbWFnaWMgbnVtYmVyLiBOaWJibGUgMjQgaXMKK2NoZWNrc3VtIGZvciBuaWJibGVzIDEyLi4yMy4KKworQWZ0ZXIgbGFzdCBvY3RhbCB2YWx1ZSBmb3IgbmliYmxlIDI0IGFuZCBuZXh0IHN5bmMgcHVsc2Ugb25lIGFkZGl0aW9uYWwKK2JpbmFyeSB2YWx1ZSBjYW4gYmUgc2FtcGxlZC4gVGhpcyBiaXQgYW5kIG1hZ2ljIG51bWJlciBpcyBub3QgdXNlZCBpbgorc29mdHdhcmUgZHJpdmVyLiBTb21lIGRldGFpbHMgYWJvdXQgdGhpcyBtYWdpYyBudW1iZXJzIGNhbiBiZSBmb3VuZCBpbgorV2Fsa2VyYV9Xay0wNzAxX1BDTS5wZGYuCisKK0NoZWNrc3VtIGNhbGN1bGF0aW9uOgorCitTdW1tYXJ5IG9mIG9jdGFsIHZhbHVlcyBpbiBuaWJibGVzIG11c3QgYmUgc2FtZSBhcyBvY3RhbCB2YWx1ZSBpbiBjaGVja3N1bQorbmliYmxlIChvbmx5IGZpcnN0IDMgYml0cyBhcmUgdXNlZCkuIEJpbmFyeSB2YWx1ZSBmb3IgY2hlY2tzdW0gbmliYmxlIGlzCitjYWxjdWxhdGVkIGJ5IHN1bSBvZiBiaW5hcnkgdmFsdWVzIGluIGNoZWNrZWQgbmliYmxlcyArIHN1bSBvZiBvY3RhbCB2YWx1ZXMKK2luIGNoZWNrZWQgbmliYmxlcyBkaXZpZGVkIGJ5IDguIE9ubHkgYml0IDAgb2YgdGhpcyBzdW0gaXMgdXNlZC4KKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9pb2N0bC9pb2N0bC1udW1iZXIudHh0IGIvRG9jdW1lbnRhdGlvbi9pb2N0bC9pb2N0bC1udW1iZXIudHh0CmluZGV4IDgyNDY5OTEuLmYxZDYzOTkgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vaW9jdGwvaW9jdGwtbnVtYmVyLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2lvY3RsL2lvY3RsLW51bWJlci50eHQKQEAgLTg0LDcgKzg0LDcgQEAKICdCJwlDMC1GRgkJCQlhZHZhbmNlZCBiYnVzCiAJCQkJCTxtYWlsdG86bWFhc3NlbkB1bmktZnJlaWJ1cmcuZGU+CiAnQycJYWxsCWxpbnV4L3NvdW5kY2FyZC5oCi0nRCcJYWxsCWFzbS1zMzkwL2Rhc2QuaAorJ0QnCWFsbAlhcmNoL3MzOTAvaW5jbHVkZS9hc20vZGFzZC5oCiAnRScJYWxsCWxpbnV4L2lucHV0LmgKICdGJwlhbGwJbGludXgvZmIuaAogJ0gnCWFsbAlsaW51eC9oaWRkZXYuaApAQCAtMTA1LDcgKzEwNSw3IEBACiAnUycJODAtODEJc2NzaS9zY3NpX2lvY3RsLmgJY29uZmxpY3QhCiAnUycJODItRkYJc2NzaS9zY3NpLmgJCWNvbmZsaWN0IQogJ1QnCWFsbAlsaW51eC9zb3VuZGNhcmQuaAljb25mbGljdCEKLSdUJwlhbGwJYXNtLWkzODYvaW9jdGxzLmgJY29uZmxpY3QhCisnVCcJYWxsCWFyY2gveDg2L2luY2x1ZGUvYXNtL2lvY3Rscy5oCWNvbmZsaWN0IQogJ1UnCTAwLUVGCWxpbnV4L2RyaXZlcnMvdXNiL3VzYi5oCiAnVicJYWxsCWxpbnV4L3Z0LmgKICdXJwkwMC0xRglsaW51eC93YXRjaGRvZy5oCWNvbmZsaWN0IQpAQCAtMTIwLDcgKzEyMCw3IEBACiAJCQkJCTxtYWlsdG86bmF0YWxpYUBuaWtoZWZrLm5pa2hlZi5ubD4KICdjJwkwMC03RglsaW51eC9jb21zdGF0cy5oCWNvbmZsaWN0IQogJ2MnCTAwLTdGCWxpbnV4L2NvZGEuaAkJY29uZmxpY3QhCi0nYycJODAtOUYJYXNtLXMzOTAvY2hzYy5oCisnYycJODAtOUYJYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2Noc2MuaAogJ2QnCTAwLUZGCWxpbnV4L2NoYXIvZHJtL2RybS9oCWNvbmZsaWN0IQogJ2QnCTAwLURGCWxpbnV4L3ZpZGVvX2RlY29kZXIuaAljb25mbGljdCEKICdkJwlGMC1GRglsaW51eC9kaWdpMS5oCkBAIC0xNzAsNyArMTcwLDcgQEAKIAkJCQkJPG1haWx0bzpvZUBwb3J0LmRlPgogMHg4MAkwMC0xRglsaW51eC9mYi5oCiAweDgxCTAwLTFGCWxpbnV4L3ZpZGVvdGV4dC5oCi0weDg5CTAwLTA2CWFzbS1pMzg2L3NvY2tpb3MuaAorMHg4OQkwMC0wNglhcmNoL3g4Ni9pbmNsdWRlL2FzbS9zb2NraW9zLmgKIDB4ODkJMEItREYJbGludXgvc29ja2lvcy5oCiAweDg5CUUwLUVGCWxpbnV4L3NvY2tpb3MuaAkJU0lPQ1BST1RPUFJJVkFURSByYW5nZQogMHg4OQlGMC1GRglsaW51eC9zb2NraW9zLmgJCVNJT0NERVZQUklWQVRFIHJhbmdlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2tidWlsZC9rYnVpbGQudHh0IGIvRG9jdW1lbnRhdGlvbi9rYnVpbGQva2J1aWxkLnR4dAppbmRleCA1MTc3MTg0Li45MjNmOWRkIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2tidWlsZC9rYnVpbGQudHh0CisrKyBiL0RvY3VtZW50YXRpb24va2J1aWxkL2tidWlsZC50eHQKQEAgLTEyNCwzICsxMjQsMTAgQEAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBGb3IgbW9kdWxlcyB1c2Ugc3ltYm9scyBmcm9tIGFub3RoZXIgbW9kdWxlcy4KIFNlZSBtb3JlIGRldGFpbHMgaW4gbW9kdWxlcy50eHQuCisKK0FMTFNPVVJDRV9BUkNIUworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0ZvciB0YWdzL1RBR1MvY3Njb3BlIHRhcmdldHMsIHlvdSBjYW4gc3BlY2lmeSBtb3JlIHRoYW4gb25lIGFyY2hzCit0byBiZSBpbmNsdWRlZCBpbiB0aGUgZGF0YWJhc2VzLCBzZXBhcmF0ZWQgYnkgYmxhbmtzcGFjZS4gZS5nLgorCisgICAgJCBtYWtlIEFMTFNPVVJDRV9BUkNIUz0ieDg2IG1pcHMgYXJtIiB0YWdzCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2tidWlsZC9tb2R1bGVzLnR4dCBiL0RvY3VtZW50YXRpb24va2J1aWxkL21vZHVsZXMudHh0CmluZGV4IDE4MjFjMDcuLmIxMDk2ZGEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24va2J1aWxkL21vZHVsZXMudHh0CisrKyBiL0RvY3VtZW50YXRpb24va2J1aWxkL21vZHVsZXMudHh0CkBAIC0yNTMsNyArMjUzLDcgQEAKIAogCQkjIE1vZHVsZSBzcGVjaWZpYyB0YXJnZXRzCiAJCWdlbmJpbjoKLQkJCWVjaG8gIlgiID4gODEyM19iaW5fc2hpcHBlZAorCQkJZWNobyAiWCIgPiA4MTIzX2Jpbi5vX3NoaXBwZWQKIAogCiAJSW4gZXhhbXBsZSAyLCB3ZSBhcmUgZG93biB0byB0d28gZmFpcmx5IHNpbXBsZSBmaWxlcyBhbmQgZm9yIHNpbXBsZQpAQCAtMjc5LDcgKzI3OSw3IEBACiAKIAkJIyBNb2R1bGUgc3BlY2lmaWMgdGFyZ2V0cwogCQlnZW5iaW46Ci0JCQllY2hvICJYIiA+IDgxMjNfYmluX3NoaXBwZWQKKwkJCWVjaG8gIlgiID4gODEyM19iaW4ub19zaGlwcGVkCiAKIAkJZW5kaWYKIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9rZXJuZWwtZG9jLW5hbm8tSE9XVE8udHh0IGIvRG9jdW1lbnRhdGlvbi9rZXJuZWwtZG9jLW5hbm8tSE9XVE8udHh0CmluZGV4IGM2ODQxZWUuLmQ3M2ZiZDIgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24va2VybmVsLWRvYy1uYW5vLUhPV1RPLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2tlcm5lbC1kb2MtbmFuby1IT1dUTy50eHQKQEAgLTcxLDYgKzcxLDExIEBACiB0aGlzIG9wZW5pbmcgc2hvcnQgZnVuY3Rpb24gZGVzY3JpcHRpb24gbGluZSwgd2l0aCBubyBpbnRlcnZlbmluZwogZW1wdHkgY29tbWVudCBsaW5lcy4KIAorSWYgYSBmdW5jdGlvbiBwYXJhbWV0ZXIgaXMgIi4uLiIgKHZhcmFyZ3MpLCBpdCBzaG91bGQgYmUgbGlzdGVkIGluCitrZXJuZWwtZG9jIG5vdGF0aW9uIGFzOgorICogQC4uLjogZGVzY3JpcHRpb24KKworCiBFeGFtcGxlIGtlcm5lbC1kb2MgZGF0YSBzdHJ1Y3R1cmUgY29tbWVudC4KIAogLyoqCkBAIC0yODIsNiArMjg3LDMyIEBACiB9OwogCiAKK0luY2x1ZGluZyBkb2N1bWVudGF0aW9uIGJsb2NrcyBpbiBzb3VyY2UgZmlsZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVG8gZmFjaWxpdGF0ZSBoYXZpbmcgc291cmNlIGNvZGUgYW5kIGNvbW1lbnRzIGNsb3NlIHRvZ2V0aGVyLCB5b3UgY2FuCitpbmNsdWRlIGtlcm5lbC1kb2MgZG9jdW1lbnRhdGlvbiBibG9ja3MgdGhhdCBhcmUgZnJlZS1mb3JtIGNvbW1lbnRzCitpbnN0ZWFkIG9mIGJlaW5nIGtlcm5lbC1kb2MgZm9yIGZ1bmN0aW9ucywgc3RydWN0dXJlcywgdW5pb25zLAorZW51bXMsIG9yIHR5cGVkZWZzLiAgVGhpcyBjb3VsZCBiZSB1c2VkIGZvciBzb21ldGhpbmcgbGlrZSBhCit0aGVvcnkgb2Ygb3BlcmF0aW9uIGZvciBhIGRyaXZlciBvciBsaWJyYXJ5IGNvZGUsIGZvciBleGFtcGxlLgorCitUaGlzIGlzIGRvbmUgYnkgdXNpbmcgYSBET0M6IHNlY3Rpb24ga2V5d29yZCB3aXRoIGEgc2VjdGlvbiB0aXRsZS4gIEUuZy46CisKKy8qKgorICogRE9DOiBUaGVvcnkgb2YgT3BlcmF0aW9uCisgKgorICogVGhlIHdoaXpiYW5nIGZvb2JhciBpcyBhIGRpbGx5IG9mIGEgZ2l6bW8uICBJdCBjYW4gZG8gd2hhdGV2ZXIgeW91CisgKiB3YW50IGl0IHRvIGRvLCBhdCBhbnkgdGltZS4gIEl0IHJlYWRzIHlvdXIgbWluZC4gIEhlcmUncyBob3cgaXQgd29ya3MuCisgKgorICogZm9vIGJhciBzcGxhdAorICoKKyAqIFRoZSBvbmx5IGRyYXdiYWNrIHRvIHRoaXMgZ2l6bW8gaXMgdGhhdCBpcyBjYW4gc29tZXRpbWVzIGRhbWFnZQorICogaGFyZHdhcmUsIHNvZnR3YXJlLCBvciBpdHMgc3ViamVjdChzKS4KKyAqLworCitET0M6IHNlY3Rpb25zIGFyZSB1c2VkIGluIFNHTUwgdGVtcGxhdGVzIGZpbGVzIGFzIGluZGljYXRlZCBiZWxvdy4KKworCiBIb3cgdG8gbWFrZSBuZXcgU0dNTCB0ZW1wbGF0ZSBmaWxlcwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIApAQCAtMzAyLDYgKzMzMyw5IEBACiAhRjxmaWxlbmFtZT4gPGZ1bmN0aW9uIFtmdW5jdGlvbnMuLi5dPiBpcyByZXBsYWNlZCBieSB0aGUKIGRvY3VtZW50YXRpb24sIGluIDxmaWxlbmFtZT4sIGZvciB0aGUgZnVuY3Rpb25zIGxpc3RlZC4KIAorIVA8ZmlsZW5hbWU+IDxzZWN0aW9uIHRpdGxlPiBpcyByZXBsYWNlZCBieSB0aGUgY29udGVudHMgb2YgdGhlIERPQzoKK3NlY3Rpb24gdGl0bGVkIDxzZWN0aW9uIHRpdGxlPiBmcm9tIDxmaWxlbmFtZT4uCitTcGFjZXMgYXJlIGFsbG93ZWQgaW4gPHNlY3Rpb24gdGl0bGU+OyBkbyBub3QgcXVvdGUgdGhlIDxzZWN0aW9uIHRpdGxlPi4KIAogVGltLgogKi8gPHR3YXVnaEByZWRoYXQuY29tPgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9rZXJuZWwtcGFyYW1ldGVycy50eHQgYi9Eb2N1bWVudGF0aW9uL2tlcm5lbC1wYXJhbWV0ZXJzLnR4dAppbmRleCBhMmQ4ODA1Li5mYjg0OTAyIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2tlcm5lbC1wYXJhbWV0ZXJzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2tlcm5lbC1wYXJhbWV0ZXJzLnR4dApAQCAtOTEsNiArOTEsNyBAQAogCVNVU1BFTkQJU3lzdGVtIHN1c3BlbmQgc3RhdGVzIGFyZSBlbmFibGVkLgogCUZUUkFDRQlGdW5jdGlvbiB0cmFjaW5nIGVuYWJsZWQuCiAJVFMJQXBwcm9wcmlhdGUgdG91Y2hzY3JlZW4gc3VwcG9ydCBpcyBlbmFibGVkLgorCVVNUwlVU0IgTWFzcyBTdG9yYWdlIHN1cHBvcnQgaXMgZW5hYmxlZC4KIAlVU0IJVVNCIHN1cHBvcnQgaXMgZW5hYmxlZC4KIAlVU0JISUQJVVNCIEh1bWFuIEludGVyZmFjZSBEZXZpY2Ugc3VwcG9ydCBpcyBlbmFibGVkLgogCVY0TAlWaWRlbyBGb3IgTGludXggc3VwcG9ydCBpcyBlbmFibGVkLgpAQCAtNDY5LDggKzQ3MCw4IEBACiAKIAljbGVhcmNwdWlkPUJJVE5VTSBbWDg2XQogCQkJRGlzYWJsZSBDUFVJRCBmZWF0dXJlIFggZm9yIHRoZSBrZXJuZWwuIFNlZQotCQkJaW5jbHVkZS9hc20teDg2L2NwdWZlYXR1cmUuaCBmb3IgdGhlIHZhbGlkIGJpdCBudW1iZXJzLgotCQkJTm90ZSB0aGUgTGludXggc3BlY2lmaWMgYml0cyBhcmUgbm90IG5lY2Vzc2FyaWx5CisJCQlhcmNoL3g4Ni9pbmNsdWRlL2FzbS9jcHVmZWF0dXJlLmggZm9yIHRoZSB2YWxpZCBiaXQKKwkJCW51bWJlcnMuIE5vdGUgdGhlIExpbnV4IHNwZWNpZmljIGJpdHMgYXJlIG5vdCBuZWNlc3NhcmlseQogCQkJc3RhYmxlIG92ZXIga2VybmVsIG9wdGlvbnMsIGJ1dCB0aGUgdmVuZG9yIHNwZWNpZmljCiAJCQlvbmVzIHNob3VsZCBiZS4KIAkJCUFsc28gbm90ZSB0aGF0IHVzZXIgcHJvZ3JhbXMgY2FsbGluZyBDUFVJRCBkaXJlY3RseQpAQCAtNTUxLDYgKzU1MiwxMSBAQAogCQkJbm90IHdvcmsgcmVsaWFibHkgd2l0aCBhbGwgY29uc29sZXMsIGJ1dCBpcyBrbm93bgogCQkJdG8gd29yayB3aXRoIHNlcmlhbCBhbmQgVkdBIGNvbnNvbGVzLgogCisJY29yZWR1bXBfZmlsdGVyPQorCQkJW0tOTF0gQ2hhbmdlIHRoZSBkZWZhdWx0IHZhbHVlIGZvcgorCQkJL3Byb2MvPHBpZD4vY29yZWR1bXBfZmlsdGVyLgorCQkJU2VlIGFsc28gRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9wcm9jLnR4dC4KKwogCWNwY2locF9nZW5lcmljPQlbSFcsUENJXSBHZW5lcmljIHBvcnQgSS9PIENvbXBhY3RQQ0kgZHJpdmVyCiAJCQlGb3JtYXQ6CiAJCQk8Zmlyc3Rfc2xvdD4sPGxhc3Rfc2xvdD4sPHBvcnQ+LDxlbnVtX2JpdD5bLDxkZWJ1Zz5dCkBAIC05MTMsNiArOTE5LDEwIEBACiAKIAlpbnR0ZXN0PQlbSUE2NF0KIAorCWlvbWVtPQkJRGlzYWJsZSBzdHJpY3QgY2hlY2tpbmcgb2YgYWNjZXNzIHRvIE1NSU8gbWVtb3J5CisJCXN0cmljdAlyZWdpb25zIGZyb20gdXNlcnNwYWNlLgorCQlyZWxheGVkCisKIAlpb21tdT0JCVt4ODZdCiAJCW9mZgogCQlmb3JjZQpAQCAtMTExNyw2ICsxMTI3LDggQEAKIAkJCUlmIHRoZXJlIGFyZSBtdWx0aXBsZSBtYXRjaGluZyBjb25maWd1cmF0aW9ucyBjaGFuZ2luZwogCQkJdGhlIHNhbWUgYXR0cmlidXRlLCB0aGUgbGFzdCBvbmUgaXMgdXNlZC4KIAorCWxtYj1kZWJ1ZwlbS05MXSBFbmFibGUgbG1iIGRlYnVnIG1lc3NhZ2VzLgorCiAJbG9hZF9yYW1kaXNrPQlbUkFNXSBMaXN0IG9mIHJhbWRpc2tzIHRvIGxvYWQgZnJvbSBmbG9wcHkKIAkJCVNlZSBEb2N1bWVudGF0aW9uL2Jsb2NrZGV2L3JhbWRpc2sudHh0LgogCkBAIC0xNTUwLDYgKzE1NjIsOSBAQAogCiAJbm9zb2Z0bG9ja3VwCVtLTkxdIERpc2FibGUgdGhlIHNvZnQtbG9ja3VwIGRldGVjdG9yLgogCisJbm9zd2FwYWNjb3VudAlbS05MXSBEaXNhYmxlIGFjY291bnRpbmcgb2Ygc3dhcCBpbiBtZW1vcnkgcmVzb3VyY2UKKwkJCWNvbnRyb2xsZXIuIChTZWUgRG9jdW1lbnRhdGlvbi9jb250cm9sbGVycy9tZW1vcnkudHh0KQorCiAJbm9zeW5jCQlbSFcsTTY4S10gRGlzYWJsZXMgc3luYyBuZWdvdGlhdGlvbiBmb3IgYWxsIGRldmljZXMuCiAKIAlub3RzYwkJW0JVR1M9WDg2LTMyXSBEaXNhYmxlIFRpbWUgU3RhbXAgQ291bnRlcgpAQCAtMTU2OSw2ICsxNTg0LDEwIEBACiAKIAlucl91YXJ0cz0JW1NFUklBTF0gbWF4aW11bSBudW1iZXIgb2YgVUFSVHMgdG8gYmUgcmVnaXN0ZXJlZC4KIAorCW9oY2kxMzk0X2RtYT1lYXJseQlbSFddIGVuYWJsZSBkZWJ1Z2dpbmcgdmlhIHRoZSBvaGNpMTM5NCBkcml2ZXIuCisJCQlTZWUgRG9jdW1lbnRhdGlvbi9kZWJ1Z2dpbmctdmlhLW9oY2kxMzk0LnR4dCBmb3IgbW9yZQorCQkJaW5mby4KKwogCW9scGNfZWNfdGltZW91dD0gW09MUENdIG1zIGRlbGF5IHdoZW4gaXNzdWluZyBFQyBjb21tYW5kcwogCQkJUmF0aGVyIHRoYW4gdGltaW5nIG91dCBhZnRlciAyMCBtcyBpZiBhbiBFQwogCQkJY29tbWFuZCBpcyBub3QgcHJvcGVybHkgQUNLZWQsIG92ZXJyaWRlIHRoZSBsZW5ndGgKQEAgLTE3OTMsMTAgKzE4MTIsMTAgQEAKIAkJCWF1dG9jb25maWd1cmF0aW9uLgogCQkJUmFuZ2VzIGFyZSBpbiBwYWlycyAobWVtb3J5IGJhc2UgYW5kIHNpemUpLgogCi0JZHluYW1pY19wcmludGsKLQkJCUVuYWJsZXMgcHJfZGVidWcoKS9kZXZfZGJnKCkgY2FsbHMgaWYKLQkJCUNPTkZJR19EWU5BTUlDX1BSSU5US19ERUJVRyBoYXMgYmVlbiBlbmFibGVkLiBUaGVzZSBjYW4gYWxzbwotCQkJYmUgc3dpdGNoZWQgb24vb2ZmIHZpYSA8ZGVidWdmcz4vZHluYW1pY19wcmludGsvbW9kdWxlcworCWR5bmFtaWNfcHJpbnRrCUVuYWJsZXMgcHJfZGVidWcoKS9kZXZfZGJnKCkgY2FsbHMgaWYKKwkJCUNPTkZJR19EWU5BTUlDX1BSSU5US19ERUJVRyBoYXMgYmVlbiBlbmFibGVkLgorCQkJVGhlc2UgY2FuIGFsc28gYmUgc3dpdGNoZWQgb24vb2ZmIHZpYQorCQkJPGRlYnVnZnM+L2R5bmFtaWNfcHJpbnRrL21vZHVsZXMKIAogCXByaW50LWZhdGFsLXNpZ25hbHM9CiAJCQlbS05MXSBkZWJ1ZzogcHJpbnQgZmF0YWwgc2lnbmFscwpAQCAtMTg4NCw3ICsxOTAzLDcgQEAKIAogCXJlYm9vdD0JCVtCVUdTPVg4Ni0zMixCVUdTPUFSTSxCVUdTPUlBLTY0XSBSZWJvb3RpbmcgbW9kZQogCQkJRm9ybWF0OiA8cmVib290X21vZGU+Wyw8cmVib290X21vZGUyPlssLi4uXV0KLQkJCVNlZSBhcmNoLyova2VybmVsL3JlYm9vdC5jIG9yIGFyY2gvKi9rZXJuZWwvcHJvY2Vzcy5jCQkJCisJCQlTZWUgYXJjaC8qL2tlcm5lbC9yZWJvb3QuYyBvciBhcmNoLyova2VybmVsL3Byb2Nlc3MuYwogCiAJcmVsYXhfZG9tYWluX2xldmVsPQogCQkJW0tOTCwgU01QXSBTZXQgc2NoZWR1bGVyJ3MgZGVmYXVsdCByZWxheF9kb21haW5fbGV2ZWwuCkBAIC0yMzcyLDYgKzIzOTEsNDEgQEAKIAl1c2JoaWQubW91c2Vwb2xsPQogCQkJW1VTQkhJRF0gVGhlIGludGVydmFsIHdoaWNoIG1pY2UgYXJlIHRvIGJlIHBvbGxlZCBhdC4KIAorCXVzYi1zdG9yYWdlLmRlbGF5X3VzZT0KKwkJCVtVTVNdIFRoZSBkZWxheSBpbiBzZWNvbmRzIGJlZm9yZSBhIG5ldyBkZXZpY2UgaXMKKwkJCXNjYW5uZWQgZm9yIExvZ2ljYWwgVW5pdHMgKGRlZmF1bHQgNSkuCisKKwl1c2Itc3RvcmFnZS5xdWlya3M9CisJCQlbVU1TXSBBIGxpc3Qgb2YgcXVpcmtzIGVudHJpZXMgdG8gc3VwcGxlbWVudCBvcgorCQkJb3ZlcnJpZGUgdGhlIGJ1aWx0LWluIHVudXN1YWxfZGV2cyBsaXN0LiAgTGlzdAorCQkJZW50cmllcyBhcmUgc2VwYXJhdGVkIGJ5IGNvbW1hcy4gIEVhY2ggZW50cnkgaGFzCisJCQl0aGUgZm9ybSBWSUQ6UElEOkZsYWdzIHdoZXJlIFZJRCBhbmQgUElEIGFyZSBWZW5kb3IKKwkJCWFuZCBQcm9kdWN0IElEIHZhbHVlcyAoNC1kaWdpdCBoZXggbnVtYmVycykgYW5kCisJCQlGbGFncyBpcyBhIHNldCBvZiBjaGFyYWN0ZXJzLCBlYWNoIGNvcnJlc3BvbmRpbmcKKwkJCXRvIGEgY29tbW9uIHVzYi1zdG9yYWdlIHF1aXJrIGZsYWcgYXMgZm9sbG93czoKKwkJCQlhID0gU0FORV9TRU5TRSAoY29sbGVjdCBtb3JlIHRoYW4gMTggYnl0ZXMKKwkJCQkJb2Ygc2Vuc2UgZGF0YSk7CisJCQkJYyA9IEZJWF9DQVBBQ0lUWSAoZGVjcmVhc2UgdGhlIHJlcG9ydGVkCisJCQkJCWRldmljZSBjYXBhY2l0eSBieSBvbmUgc2VjdG9yKTsKKwkJCQloID0gQ0FQQUNJVFlfSEVVUklTVElDUyAoZGVjcmVhc2UgdGhlCisJCQkJCXJlcG9ydGVkIGRldmljZSBjYXBhY2l0eSBieSBvbmUKKwkJCQkJc2VjdG9yIGlmIHRoZSBudW1iZXIgaXMgb2RkKTsKKwkJCQlpID0gSUdOT1JFX0RFVklDRSAoZG9uJ3QgYmluZCB0byB0aGlzCisJCQkJCWRldmljZSk7CisJCQkJbCA9IE5PVF9MT0NLQUJMRSAoZG9uJ3QgdHJ5IHRvIGxvY2sgYW5kCisJCQkJCXVubG9jayBlamVjdGFibGUgbWVkaWEpOworCQkJCW0gPSBNQVhfU0VDVE9SU182NCAoZG9uJ3QgdHJhbnNmZXIgbW9yZQorCQkJCQl0aGFuIDY0IHNlY3RvcnMgPSAzMiBLQiBhdCBhIHRpbWUpOworCQkJCW8gPSBDQVBBQ0lUWV9PSyAoYWNjZXB0IHRoZSBjYXBhY2l0eQorCQkJCQlyZXBvcnRlZCBieSB0aGUgZGV2aWNlKTsKKwkJCQlyID0gSUdOT1JFX1JFU0lEVUUgKHRoZSBkZXZpY2UgcmVwb3J0cworCQkJCQlib2d1cyByZXNpZHVlIHZhbHVlcyk7CisJCQkJcyA9IFNJTkdMRV9MVU4gKHRoZSBkZXZpY2UgaGFzIG9ubHkgb25lCisJCQkJCUxvZ2ljYWwgVW5pdCk7CisJCQkJdyA9IE5PX1dQX0RFVEVDVCAoZG9uJ3QgdGVzdCB3aGV0aGVyIHRoZQorCQkJCQltZWRpdW0gaXMgd3JpdGUtcHJvdGVjdGVkKS4KKwkJCUV4YW1wbGU6IHF1aXJrcz0wNDE5OmFhZjU6cmwsMDQyMTowNDMzOnJjCisKIAlhZGRfZWZpX21lbW1hcAlbRUZJOyB4ODYtMzIsWDg2LTY0XSBJbmNsdWRlIEVGSSBtZW1vcnkgbWFwIGluCiAJCQlrZXJuZWwncyBtYXAgb2YgYXZhaWxhYmxlIHBoeXNpY2FsIFJBTS4KIApAQCAtMjQzMiw4ICsyNDg2LDggQEAKIAkJCUZvcm1hdDoKIAkJCTxpcnE+LDxpcnFfbWFzaz4sPGlvPiw8ZnVsbF9kdXBsZXg+LDxkb19zb3VuZD4sPGxvY2t1cF9oYWNrPlssPGlycTI+Wyw8aXJxMz5bLDxpcnE0Pl1dXQogCi0Jbm9yYW5kbWFwcwlEb24ndCB1c2UgYWRkcmVzcyBzcGFjZSByYW5kb21pemF0aW9uCi0JCQlFcXVpdmFsZW50IHRvIGVjaG8gMCA+IC9wcm9jL3N5cy9rZXJuZWwvcmFuZG9taXplX3ZhX3NwYWNlCisJbm9yYW5kbWFwcwlEb24ndCB1c2UgYWRkcmVzcyBzcGFjZSByYW5kb21pemF0aW9uLiAgRXF1aXZhbGVudCB0bworCQkJZWNobyAwID4gL3Byb2Mvc3lzL2tlcm5lbC9yYW5kb21pemVfdmFfc3BhY2UKIAogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2tvYmplY3QudHh0IGIvRG9jdW1lbnRhdGlvbi9rb2JqZWN0LnR4dAppbmRleCBmNWQyYWFkLi5iMmUzNzQ1IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2tvYmplY3QudHh0CisrKyBiL0RvY3VtZW50YXRpb24va29iamVjdC50eHQKQEAgLTExOCw4ICsxMTgsOCBAQAogCiAgICAgaW50IGtvYmplY3RfcmVuYW1lKHN0cnVjdCBrb2JqZWN0ICprb2JqLCBjb25zdCBjaGFyICpuZXdfbmFtZSk7CiAKLU5vdGUga29iamVjdF9yZW5hbWUgZG9lcyBwZXJmb3JtIGFueSBsb2NraW5nIG9yIGhhdmUgYSBzb2xpZCBub3Rpb24gb2YKLXdoYXQgbmFtZXMgYXJlIHZhbGlkIHNvIHRoZSBwcm92aWRlIG11c3QgcHJvdmlkZSB0aGVpciBvd24gc2FuaXR5IGNoZWNraW5nCitrb2JqZWN0X3JlbmFtZSBkb2VzIG5vdCBwZXJmb3JtIGFueSBsb2NraW5nIG9yIGhhdmUgYSBzb2xpZCBub3Rpb24gb2YKK3doYXQgbmFtZXMgYXJlIHZhbGlkIHNvIHRoZSBjYWxsZXIgbXVzdCBwcm92aWRlIHRoZWlyIG93biBzYW5pdHkgY2hlY2tpbmcKIGFuZCBzZXJpYWxpemF0aW9uLgogCiBUaGVyZSBpcyBhIGZ1bmN0aW9uIGNhbGxlZCBrb2JqZWN0X3NldF9uYW1lKCkgYnV0IHRoYXQgaXMgbGVnYWN5IGNydWZ0IGFuZApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9rcHJvYmVzLnR4dCBiL0RvY3VtZW50YXRpb24va3Byb2Jlcy50eHQKaW5kZXggYTc5NjMzZC4uNDhiM2RlOSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9rcHJvYmVzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2twcm9iZXMudHh0CkBAIC00OTcsNyArNDk3LDEwIEBACiBUaGUgc2Vjb25kIGNvbHVtbiBpZGVudGlmaWVzIHRoZSB0eXBlIG9mIHByb2JlIChrIC0ga3Byb2JlLCByIC0ga3JldHByb2JlCiBhbmQgaiAtIGpwcm9iZSksIHdoaWxlIHRoZSB0aGlyZCBjb2x1bW4gc3BlY2lmaWVzIHRoZSBzeW1ib2wrb2Zmc2V0IG9mCiB0aGUgcHJvYmUuIElmIHRoZSBwcm9iZWQgZnVuY3Rpb24gYmVsb25ncyB0byBhIG1vZHVsZSwgdGhlIG1vZHVsZSBuYW1lCi1pcyBhbHNvIHNwZWNpZmllZC4KK2lzIGFsc28gc3BlY2lmaWVkLiBGb2xsb3dpbmcgY29sdW1ucyBzaG93IHByb2JlIHN0YXR1cy4gSWYgdGhlIHByb2JlIGlzIG9uCithIHZpcnR1YWwgYWRkcmVzcyB0aGF0IGlzIG5vIGxvbmdlciB2YWxpZCAobW9kdWxlIGluaXQgc2VjdGlvbnMsIG1vZHVsZQordmlydHVhbCBhZGRyZXNzZXMgdGhhdCBjb3JyZXNwb25kIHRvIG1vZHVsZXMgdGhhdCd2ZSBiZWVuIHVubG9hZGVkKSwKK3N1Y2ggcHJvYmVzIGFyZSBtYXJrZWQgd2l0aCBbR09ORV0uCiAKIC9kZWJ1Zy9rcHJvYmVzL2VuYWJsZWQ6IFR1cm4ga3Byb2JlcyBPTi9PRkYKIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9sYXB0b3BzL3RoaW5rcGFkLWFjcGkudHh0IGIvRG9jdW1lbnRhdGlvbi9sYXB0b3BzL3RoaW5rcGFkLWFjcGkudHh0CmluZGV4IDcxZjBmZTEuLjg5OGI0OTggMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vbGFwdG9wcy90aGlua3BhZC1hY3BpLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2xhcHRvcHMvdGhpbmtwYWQtYWNwaS50eHQKQEAgLTE0NzUsNyArMTQ3NSw3IEBACiAKIDB4MDIwMTAwOglNYXJrZXIgZm9yIHRoaW5rcGFkLWFjcGkgd2l0aCBob3Qga2V5IE5WUkFNIHBvbGxpbmcKIAkJc3VwcG9ydC4gIElmIHlvdSBtdXN0LCB1c2UgaXQgdG8ga25vdyB5b3Ugc2hvdWxkIG5vdAotCQlzdGFydCBhbiB1c2Vyc3BhY2UgTlZSQU0gcG9sbGVyIChhbGxvd3MgdG8gZGV0ZWN0IHdoZW4KKwkJc3RhcnQgYSB1c2Vyc3BhY2UgTlZSQU0gcG9sbGVyIChhbGxvd3MgdG8gZGV0ZWN0IHdoZW4KIAkJTlZSQU0gaXMgY29tcGlsZWQgb3V0IGJ5IHRoZSB1c2VyIGJlY2F1c2UgaXQgaXMKIAkJdW5uZWVkZWQvdW5kZXNpcmVkIGluIHRoZSBmaXJzdCBwbGFjZSkuCiAweDAyMDEwMToJTWFya2VyIGZvciB0aGlua3BhZC1hY3BpIHdpdGggaG90IGtleSBOVlJBTSBwb2xsaW5nCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL21hZ2ljLW51bWJlci50eHQgYi9Eb2N1bWVudGF0aW9uL21hZ2ljLW51bWJlci50eHQKaW5kZXggOTUwNzAwMi4uNTA1ZjE5NiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9tYWdpYy1udW1iZXIudHh0CisrKyBiL0RvY3VtZW50YXRpb24vbWFnaWMtbnVtYmVyLnR4dApAQCAtMTI1LDE0ICsxMjUsMTQgQEAKIFJPVVRFUl9NQUdJQyAgICAgICAgICAweDUyNGQ0MTU3ICB3YW5fZGV2aWNlICAgICAgICBpbmNsdWRlL2xpbnV4L3dhbnJvdXRlci5oCiBTQ0NfTUFHSUMgICAgICAgICAgICAgMHg1MjY5NjM2OCAgZ3NfcG9ydCAgICAgICAgICAgZHJpdmVycy9jaGFyL3NjYy5oCiBTQVZFS01TR19NQUdJQzEgICAgICAgMHg1MzQxNTY0NSAgc2F2ZWttc2cgICAgICAgICAgYXJjaC8qL2FtaWdhL2NvbmZpZy5jCi1HREFfTUFHSUMgICAgICAgICAgICAgMHg1ODQ2NDU1MiAgZ2RhICAgICAgICAgICAgICAgaW5jbHVkZS9hc20tbWlwczY0L3NuL2dkYS5oCitHREFfTUFHSUMgICAgICAgICAgICAgMHg1ODQ2NDU1MiAgZ2RhICAgICAgICAgICAgICAgYXJjaC9taXBzL2luY2x1ZGUvYXNtL3NuL2dkYS5oCiBSRURfTUFHSUMxICAgICAgICAgICAgMHg1YTJjZjA3MSAgKGFueSkgICAgICAgICAgICAgbW0vc2xhYi5jCiBTVExfUE9SVE1BR0lDICAgICAgICAgMHg1YTcxODJjOSAgc3RscG9ydCAgICAgICAgICAgaW5jbHVkZS9saW51eC9zdGFsbGlvbi5oCiBFRVBST01fTUFHSUNfVkFMVUUgICAgMHg1YWI0NzhkMiAgbGFuYWlfZGV2ICAgICAgICAgZHJpdmVycy9hdG0vbGFuYWkuYwogSERMQ0RSVl9NQUdJQyAgICAgICAgIDB4NWFjNmU3NzggIGhkbGNkcnZfc3RhdGUgICAgIGluY2x1ZGUvbGludXgvaGRsY2Rydi5oCiBFUENBX01BR0lDICAgICAgICAgICAgMHg1YzZkZjEwNCAgY2hhbm5lbCAgICAgICAgICAgaW5jbHVkZS9saW51eC9lcGNhLmgKIFBDWFhfTUFHSUMgICAgICAgICAgICAweDVjNmRmMTA0ICBjaGFubmVsICAgICAgICAgICBkcml2ZXJzL2NoYXIvcGN4eC5oCi1LVl9NQUdJQyAgICAgICAgICAgICAgMHg1ZjRiNTY1ZiAga2VybmVsX3ZhcnNfcyAgICAgaW5jbHVkZS9hc20tbWlwczY0L3NuL2tsa2VybnZhcnMuaAorS1ZfTUFHSUMgICAgICAgICAgICAgIDB4NWY0YjU2NWYgIGtlcm5lbF92YXJzX3MgICAgIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9zbi9rbGtlcm52YXJzLmgKIEk4MTBfU1RBVEVfTUFHSUMgICAgICAweDYzNjU3MzczICBpODEwX3N0YXRlICAgICAgICBzb3VuZC9vc3MvaTgxMF9hdWRpby5jCiBUUklERU5UX1NUQVRFX01BR0lDICAgMHg2MzY1NzM3MyAgdHJpZW50X3N0YXRlICAgICAgc291bmQvb3NzL3RyaWRlbnQuYwogTTNfQ0FSRF9NQUdJQyAgICAgICAgIDB4NjQ2ZTZmNTAgIG0zX2NhcmQgICAgICAgICAgIHNvdW5kL29zcy9tYWVzdHJvMy5jCkBAIC0xNTgsNyArMTU4LDcgQEAKIFFVRVVFX01BR0lDX0ZSRUUgICAgICAweGY3ZTFjOWEzICBxdWV1ZV9lbnRyeSAgICAgICBkcml2ZXJzL3Njc2kvYXJtL3F1ZXVlLmMKIFFVRVVFX01BR0lDX1VTRUQgICAgICAweGY3ZTFjYzMzICBxdWV1ZV9lbnRyeSAgICAgICBkcml2ZXJzL3Njc2kvYXJtL3F1ZXVlLmMKIEhUQl9DTUFHSUMgICAgICAgICAgICAweEZFRkFGRUYxICBodGJfY2xhc3MgICAgICAgICBuZXQvc2NoZWQvc2NoX2h0Yi5jCi1OTUlfTUFHSUMgICAgICAgICAgICAgMHg0ODQxNGQ0ZDQ1NTIwMSBubWlfcyAgICAgICAgaW5jbHVkZS9hc20tbWlwczY0L3NuL25taS5oCitOTUlfTUFHSUMgICAgICAgICAgICAgMHg0ODQxNGQ0ZDQ1NTIwMSBubWlfcyAgICAgICAgYXJjaC9taXBzL2luY2x1ZGUvYXNtL3NuL25taS5oCiAKIE5vdGUgdGhhdCB0aGVyZSBhcmUgYWxzbyBkZWZpbmVkIHNwZWNpYWwgcGVyLWRyaXZlciBtYWdpYyBudW1iZXJzIGluIHNvdW5kCiBtZW1vcnkgbWFuYWdlbWVudC4gU2VlIGluY2x1ZGUvc291bmQvc25kbWFnaWMuaCBmb3IgY29tcGxldGUgbGlzdCBvZiB0aGVtLiBNYW55CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL21lbW9yeS1ob3RwbHVnLnR4dCBiL0RvY3VtZW50YXRpb24vbWVtb3J5LWhvdHBsdWcudHh0CmluZGV4IDE2ODExN2IuLjRjMmVjZjUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vbWVtb3J5LWhvdHBsdWcudHh0CisrKyBiL0RvY3VtZW50YXRpb24vbWVtb3J5LWhvdHBsdWcudHh0CkBAIC0xMjQsNyArMTI0LDcgQEAKICAgICBUaGlzIG9wdGlvbiBjYW4gYmUga2VybmVsIG1vZHVsZSB0b28uCiAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0zIHN5c2ZzIGZpbGVzIGZvciBtZW1vcnkgaG90cGx1ZworNCBzeXNmcyBmaWxlcyBmb3IgbWVtb3J5IGhvdHBsdWcKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBBbGwgc2VjdGlvbnMgaGF2ZSB0aGVpciBkZXZpY2UgaW5mb3JtYXRpb24gdW5kZXIgL3N5cy9kZXZpY2VzL3N5c3RlbS9tZW1vcnkgYXMKIApAQCAtMTM4LDExICsxMzgsMTIgQEAKICgweDEwMDAwMDAwMCAvIDFHaWIgPSA0KQogVGhpcyBkZXZpY2UgY292ZXJzIGFkZHJlc3MgcmFuZ2UgWzB4MTAwMDAwMDAwIC4uLiAweDE0MDAwMDAwMCkKIAotVW5kZXIgZWFjaCBzZWN0aW9uLCB5b3UgY2FuIHNlZSAzIGZpbGVzLgorVW5kZXIgZWFjaCBzZWN0aW9uLCB5b3UgY2FuIHNlZSA0IGZpbGVzLgogCiAvc3lzL2RldmljZXMvc3lzdGVtL21lbW9yeS9tZW1vcnlYWFgvcGh5c19pbmRleAogL3N5cy9kZXZpY2VzL3N5c3RlbS9tZW1vcnkvbWVtb3J5WFhYL3BoeXNfZGV2aWNlCiAvc3lzL2RldmljZXMvc3lzdGVtL21lbW9yeS9tZW1vcnlYWFgvc3RhdGUKKy9zeXMvZGV2aWNlcy9zeXN0ZW0vbWVtb3J5L21lbW9yeVhYWC9yZW1vdmFibGUKIAogJ3BoeXNfaW5kZXgnIDogcmVhZC1vbmx5IGFuZCBjb250YWlucyBzZWN0aW9uIGlkLCBzYW1lIGFzIFhYWC4KICdzdGF0ZScgICAgICA6IHJlYWQtd3JpdGUKQEAgLTE1MCwxMCArMTUxLDIwIEBACiAgICAgICAgICAgICAgICBhdCB3cml0ZTogdXNlciBjYW4gc3BlY2lmeSAib25saW5lIiwgIm9mZmxpbmUiIGNvbW1hbmQKICdwaHlzX2RldmljZSc6IHJlYWQtb25seTogZGVzaWduZWQgdG8gc2hvdyB0aGUgbmFtZSBvZiBwaHlzaWNhbCBtZW1vcnkgZGV2aWNlLgogICAgICAgICAgICAgICAgVGhpcyBpcyBub3Qgd2VsbCBpbXBsZW1lbnRlZCBub3cuCisncmVtb3ZhYmxlJyAgOiByZWFkLW9ubHk6IGNvbnRhaW5zIGFuIGludGVnZXIgdmFsdWUgaW5kaWNhdGluZworICAgICAgICAgICAgICAgd2hldGhlciB0aGUgbWVtb3J5IHNlY3Rpb24gaXMgcmVtb3ZhYmxlIG9yIG5vdAorICAgICAgICAgICAgICAgcmVtb3ZhYmxlLiAgQSB2YWx1ZSBvZiAxIGluZGljYXRlcyB0aGF0IHRoZSBtZW1vcnkKKyAgICAgICAgICAgICAgIHNlY3Rpb24gaXMgcmVtb3ZhYmxlIGFuZCBhIHZhbHVlIG9mIDAgaW5kaWNhdGVzIHRoYXQKKyAgICAgICAgICAgICAgIGl0IGlzIG5vdCByZW1vdmFibGUuCiAKIE5PVEU6CiAgIFRoZXNlIGRpcmVjdG9yaWVzL2ZpbGVzIGFwcGVhciBhZnRlciBwaHlzaWNhbCBtZW1vcnkgaG90cGx1ZyBwaGFzZS4KIAorSWYgQ09ORklHX05VTUEgaXMgZW5hYmxlZCB0aGUKKy9zeXMvZGV2aWNlcy9zeXN0ZW0vbWVtb3J5L21lbW9yeVhYWCBtZW1vcnkgc2VjdGlvbgorZGlyZWN0b3JpZXMgY2FuIGFsc28gYmUgYWNjZXNzZWQgdmlhIHN5bWJvbGljIGxpbmtzIGxvY2F0ZWQgaW4KK3RoZSAvc3lzL2RldmljZXMvc3lzdGVtL25vZGUvbm9kZSogZGlyZWN0b3JpZXMuICBGb3IgZXhhbXBsZToKKy9zeXMvZGV2aWNlcy9zeXN0ZW0vbm9kZS9ub2RlMC9tZW1vcnk5IC0+IC4uLy4uL21lbW9yeS9tZW1vcnk5CiAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiA0LiBQaHlzaWNhbCBtZW1vcnkgaG90LWFkZCBwaGFzZQpAQCAtMzY1LDcgKzM3Niw2IEBACiAgIC0gYWxsb3dpbmcgbWVtb3J5IGhvdC1hZGQgdG8gWk9ORV9NT1ZBQkxFLiBtYXliZSB3ZSBuZWVkIHNvbWUgc3dpdGNoIGxpa2UKICAgICBzeXNjdGwgb3IgbmV3IGNvbnRyb2wgZmlsZS4KICAgLSBzaG93aW5nIG1lbW9yeSBzZWN0aW9uIGFuZCBwaHlzaWNhbCBkZXZpY2UgcmVsYXRpb25zaGlwLgotICAtIHNob3dpbmcgbWVtb3J5IHNlY3Rpb24gYW5kIG5vZGUgcmVsYXRpb25zaGlwIChtYXliZSBnb29kIGZvciBOVU1BKQogICAtIHNob3dpbmcgbWVtb3J5IHNlY3Rpb24gaXMgdW5kZXIgWk9ORV9NT1ZBQkxFIG9yIG5vdAogICAtIHRlc3QgYW5kIG1ha2UgaXQgYmV0dGVyIG1lbW9yeSBvZmZsaW5pbmcuCiAgIC0gc3VwcG9ydCBIdWdlVExCIHBhZ2UgbWlncmF0aW9uIGFuZCBvZmZsaW5pbmcuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL21pcHMvQVUxeHh4X0lERS5SRUFETUUgYi9Eb2N1bWVudGF0aW9uL21pcHMvQVUxeHh4X0lERS5SRUFETUUKaW5kZXggMjVhNmVkMS4uZjU0OTYyYSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9taXBzL0FVMXh4eF9JREUuUkVBRE1FCisrKyBiL0RvY3VtZW50YXRpb24vbWlwcy9BVTF4eHhfSURFLlJFQURNRQpAQCAtNDQsNyArNDQsNyBAQAogCiBUd28gZmlsZXMgYXJlIGludHJvZHVjZWQ6CiAKLSAgYSkgJ2luY2x1ZGUvYXNtLW1pcHMvbWFjaC1hdTF4MDAvYXUxeHh4X2lkZS5oJworICBhKSAnYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtYXUxeDAwL2F1MXh4eF9pZGUuaCcKICAgICAgY29udGFpbmVzIDogc3RydWN0IF9hdWlkZV9od2lmCiAgICAgICAgICAgICAgICAgIHRpbWluZyBwYXJhbWV0ZXJzIGZvciBQSU8gbW9kZSAwLzEvMi8zLzQKICAgICAgICAgICAgICAgICAgdGltaW5nIHBhcmFtZXRlcnMgZm9yIE1XRE1BIDAvMS8yCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvcnhycGMudHh0IGIvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3J4cnBjLnR4dAppbmRleCBjMzY2OWEzLi42MGQwNWViIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvcnhycGMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9yeHJwYy50eHQKQEAgLTU0MCw3ICs1NDAsNyBAQAogICAgICBNU0dfTU9SRSBzaG91bGQgYmUgc2V0IGluIG1zZ2hkcjo6bXNnX2ZsYWdzIG9uIGFsbCBidXQgdGhlIGxhc3QgcGFydCBvZgogICAgICB0aGUgcmVxdWVzdC4gIE11bHRpcGxlIHJlcXVlc3RzIG1heSBiZSBtYWRlIHNpbXVsdGFuZW91c2x5LgogCi0gICAgIElmIGEgY2FsbCBpcyBpbnRlbmRlZCB0byBnbyB0byBhIGRlc3RpbmF0aW9uIG90aGVyIHRoZW4gdGhlIGRlZmF1bHQKKyAgICAgSWYgYSBjYWxsIGlzIGludGVuZGVkIHRvIGdvIHRvIGEgZGVzdGluYXRpb24gb3RoZXIgdGhhbiB0aGUgZGVmYXVsdAogICAgICBzcGVjaWZpZWQgdGhyb3VnaCBjb25uZWN0KCksIHRoZW4gbXNnaGRyOjptc2dfbmFtZSBzaG91bGQgYmUgc2V0IG9uIHRoZQogICAgICBmaXJzdCByZXF1ZXN0IG1lc3NhZ2Ugb2YgdGhhdCBjYWxsLgogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvdHVudGFwLnR4dCBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy90dW50YXAudHh0CmluZGV4IDgzOWNiYjcuLmMwYWFiOTggMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy90dW50YXAudHh0CisrKyBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy90dW50YXAudHh0CkBAIC0xMTgsNyArMTE4LDcgQEAKIEl0IGlzIHVzZWQgYnkgVlR1biAoaHR0cDovL3Z0dW4uc291cmNlZm9yZ2UubmV0KS4KIAogQW5vdGhlciBpbnRlcmVzdGluZyBhcHBsaWNhdGlvbiB1c2luZyBUVU4vVEFQIGlzIHBpcHNlY2QKLShodHRwOi8vcGVyc28uZW5zdC5mci9+YmV5c3NhYy9waXBzZWMvKSwgYW4gdXNlcnNwYWNlIElQU2VjCisoaHR0cDovL3BlcnNvLmVuc3QuZnIvfmJleXNzYWMvcGlwc2VjLyksIGEgdXNlcnNwYWNlIElQU2VjCiBpbXBsZW1lbnRhdGlvbiB0aGF0IGNhbiB1c2UgY29tcGxldGUga2VybmVsIHJvdXRpbmcgKHVubGlrZSBGcmVlUy9XQU4pLgogCiAzLiBIb3cgZG9lcyBWaXJ0dWFsIG5ldHdvcmsgZGV2aWNlIGFjdHVhbGx5IHdvcmsgPyAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vcG93ZXJwYy9jcHVfZmVhdHVyZXMudHh0IGIvRG9jdW1lbnRhdGlvbi9wb3dlcnBjL2NwdV9mZWF0dXJlcy50eHQKaW5kZXggNDcyNzM5OC4uZmZhNDE4MyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9wb3dlcnBjL2NwdV9mZWF0dXJlcy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9wb3dlcnBjL2NwdV9mZWF0dXJlcy50eHQKQEAgLTMxLDcgKzMxLDcgQEAKIAogQWZ0ZXIgZGV0ZWN0aW5nIHRoZSBwcm9jZXNzb3IgdHlwZSwgdGhlIGtlcm5lbCBwYXRjaGVzIG91dCBzZWN0aW9ucyBvZiBjb2RlCiB0aGF0IHNob3VsZG4ndCBiZSB1c2VkIGJ5IHdyaXRpbmcgbm9wJ3Mgb3ZlciBpdC4gVXNpbmcgY3B1ZmVhdHVyZXMgcmVxdWlyZXMKLWp1c3QgMiBtYWNyb3MgKGZvdW5kIGluIGluY2x1ZGUvYXNtLXBwYy9jcHV0YWJsZS5oKSwgYXMgc2VlbiBpbiBoZWFkLlMKK2p1c3QgMiBtYWNyb3MgKGZvdW5kIGluIGFyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9jcHV0YWJsZS5oKSwgYXMgc2VlbiBpbiBoZWFkLlMKIHRyYW5zZmVyX3RvX2hhbmRsZXI6CiAKIAkjaWZkZWYgQ09ORklHX0FMVElWRUMKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vcG93ZXJwYy9kdHMtYmluZGluZ3MvZnNsL2JvYXJkLnR4dCBiL0RvY3VtZW50YXRpb24vcG93ZXJwYy9kdHMtYmluZGluZ3MvZnNsL2JvYXJkLnR4dAppbmRleCA4MWE5MTdlLi42Yzk3NGQyIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3Bvd2VycGMvZHRzLWJpbmRpbmdzL2ZzbC9ib2FyZC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9wb3dlcnBjL2R0cy1iaW5kaW5ncy9mc2wvYm9hcmQudHh0CkBAIC0xOCw3ICsxOCw3IEBACiAKIFJlcXVpcmVkIHByb3Blcml0aWVzOgogLSBjb21wYXRpYmxlIDogc2hvdWxkIGJlICJmc2wsZnBnYS1waXhpcyIuCi0tIHJlZyA6IHNob3VsZCBjb250YWluIHRoZSBhZGRyZXNzIGFuZCB0aGUgbGVuZ2h0IG9mIHRoZSBGUFBHQSByZWdpc3RlcgorLSByZWcgOiBzaG91bGQgY29udGFpbiB0aGUgYWRkcmVzcyBhbmQgdGhlIGxlbmd0aCBvZiB0aGUgRlBQR0EgcmVnaXN0ZXIKICAgc2V0LgogCiBFeGFtcGxlIChNUEM4NjEwSFBDRCk6CkBAIC0yNywzICsyNywzMyBAQAogCQljb21wYXRpYmxlID0gImZzbCxmcGdhLXBpeGlzIjsKIAkJcmVnID0gPDB4ZTgwMDAwMDAgMzI+OwogCX07CisKKyogRnJlZXNjYWxlIEJDU1IgR1BJTyBiYW5rcworCitTb21lIEJDU1IgcmVnaXN0ZXJzIGFjdCBhcyBzaW1wbGUgR1BJTyBjb250cm9sbGVycywgZWFjaCBzdWNoCityZWdpc3RlciBjYW4gYmUgcmVwcmVzZW50ZWQgYnkgdGhlIGdwaW8tY29udHJvbGxlciBub2RlLgorCitSZXF1aXJlZCBwcm9wZXJpdGllczoKKy0gY29tcGF0aWJsZSA6IFNob3VsZCBiZSAiZnNsLDxib2FyZD4tYmNzci1ncGlvIi4KKy0gcmVnIDogU2hvdWxkIGNvbnRhaW4gdGhlIGFkZHJlc3MgYW5kIHRoZSBsZW5ndGggb2YgdGhlIEdQSU8gYmFuaworICByZWdpc3Rlci4KKy0gI2dwaW8tY2VsbHMgOiBTaG91bGQgYmUgdHdvLiBUaGUgZmlyc3QgY2VsbCBpcyB0aGUgcGluIG51bWJlciBhbmQgdGhlCisgIHNlY29uZCBjZWxsIGlzIHVzZWQgdG8gc3BlY2lmeSBvcHRpb25hbCBwYXJhbXRlcnMgKGN1cnJlbnRseSB1bnVzZWQpLgorLSBncGlvLWNvbnRyb2xsZXIgOiBNYXJrcyB0aGUgcG9ydCBhcyBHUElPIGNvbnRyb2xsZXIuCisKK0V4YW1wbGU6CisKKwliY3NyQDEsMCB7CisJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkjc2l6ZS1jZWxscyA9IDwxPjsKKwkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODM2MG1kcy1iY3NyIjsKKwkJcmVnID0gPDEgMCAweDgwMDA+OworCQlyYW5nZXMgPSA8MCAxIDAgMHg4MDAwPjsKKworCQliY3NyMTM6IGdwaW8tY29udHJvbGxlckBkIHsKKwkJCSNncGlvLWNlbGxzID0gPDI+OworCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODM2MG1kcy1iY3NyLWdwaW8iOworCQkJcmVnID0gPDB4ZCAxPjsKKwkJCWdwaW8tY29udHJvbGxlcjsKKwkJfTsKKwl9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zMzkwL0RlYnVnZ2luZzM5MC50eHQgYi9Eb2N1bWVudGF0aW9uL3MzOTAvRGVidWdnaW5nMzkwLnR4dAppbmRleCBkMzBhMjgxLi4xMDcxMWQ5IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3MzOTAvRGVidWdnaW5nMzkwLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3MzOTAvRGVidWdnaW5nMzkwLnR4dApAQCAtMTQwMiw3ICsxNDAyLDcgQEAKIHBvc3NpYmlsaXRpZXMgb2YgdGhlc2UgYXMgdGhlIGluc3RydWN0aW9uIGlzIG1hZGUgdXAgb2YgYSAgMHhBIG9wY29kZSAmIHRoZSBzZWNvbmQgYnl0ZSBiZWluZwogdGhlIHN5c2NhbGwgbnVtYmVyLiBUaGV5IGFyZSB0cmFjZWQgdXNpbmcgdGhlIHNpbXBsZSBjb21tYW5kLgogVFIgU1ZDICA8T3B0aW9uYWwgdmFsdWUgb3IgcmFuZ2U+Ci10aGUgc3lzY2FsbHMgYXJlIGRlZmluZWQgaW4gbGludXgvaW5jbHVkZS9hc20tczM5MC91bmlzdGQuaAordGhlIHN5c2NhbGxzIGFyZSBkZWZpbmVkIGluIGxpbnV4L2FyY2gvczM5MC9pbmNsdWRlL2FzbS91bmlzdGQuaAogZS5nLiB0byB0cmFjZSBhbGwgZmlsZSBvcGVucyBqdXN0IGRvCiBUUiBTVkMgNSAoIGFzIHRoaXMgaXMgdGhlIHN5c2NhbGwgbnVtYmVyIG9mIG9wZW4gKQogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3MzOTAvY2RzLnR4dCBiL0RvY3VtZW50YXRpb24vczM5MC9jZHMudHh0CmluZGV4IGM0YjdiMmIuLjQ4MGE3OGUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vczM5MC9jZHMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vczM5MC9jZHMudHh0CkBAIC05OCw3ICs5OCw3IEBACiBvZiB0aGVtIGNhbiBiZSBmb3VuZCBvbiBvdGhlciBMaW51eCBwbGF0Zm9ybXMgaW1wbGVtZW50YXRpb25zIHRvby4KIE1pc2NlbGxhbmVvdXMgZnVuY3Rpb24gcHJvdG90eXBlcywgZGF0YSBkZWNsYXJhdGlvbnMsIGFuZCBtYWNybyBkZWZpbml0aW9ucwogY2FuIGJlIGZvdW5kIGluIHRoZSBhcmNoaXRlY3R1cmUgc3BlY2lmaWMgQyBoZWFkZXIgZmlsZQotbGludXgvaW5jbHVkZS9hc20tczM5MC9pcnEuaC4KK2xpbnV4L2FyY2gvczM5MC9pbmNsdWRlL2FzbS9pcnEuaC4KIAogT3ZlcnZpZXcgb2YgQ0RTIGludGVyZmFjZSBjb25jZXB0cwogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3MzOTAvczM5MGRiZi50eHQgYi9Eb2N1bWVudGF0aW9uL3MzOTAvczM5MGRiZi50eHQKaW5kZXggZTA1NDIwOS4uMmQxMDA1MyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9zMzkwL3MzOTBkYmYudHh0CisrKyBiL0RvY3VtZW50YXRpb24vczM5MC9zMzkwZGJmLnR4dApAQCAtMiw3ICsyLDcgQEAKID09PT09PT09PT09PT09PT09PQogCiBmaWxlczogYXJjaC9zMzkwL2tlcm5lbC9kZWJ1Zy5jCi0gICAgICAgaW5jbHVkZS9hc20tczM5MC9kZWJ1Zy5oCisgICAgICAgYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2RlYnVnLmgKIAogRGVzY3JpcHRpb246CiAtLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vc2NzaS9DaGFuZ2VMb2cubHBmYyBiL0RvY3VtZW50YXRpb24vc2NzaS9DaGFuZ2VMb2cubHBmYwppbmRleCBhZTNmOTYyYS4uZmYxOWE1MiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9zY3NpL0NoYW5nZUxvZy5scGZjCisrKyBiL0RvY3VtZW50YXRpb24vc2NzaS9DaGFuZ2VMb2cubHBmYwpAQCAtNzMzLDcgKzczMyw3IEBACiAJICBJL08gY29tcGxldGlvbiBwYXRoIGEgbGl0dGxlIG1vcmUsIGVzcGVjaWFsbHkgdGFraW5nIGNhcmUgb2YKIAkgIGZhc3QtcGF0aGluZyB0aGUgbm9uLWVycm9yIGNhc2UuICBBbHNvIHJlbW92ZXMgdG9ucyBvZiBkZWFkCiAJICBtZW1iZXJzIGFuZCBkZWZpbmVzIGZyb20gbHBmY19zY3NpLmggLSBlLmcuIGxwZmNfdGFyZ2V0IGlzIGRvd24KLQkgIHRvIG5vdGhpbmcgbW9yZSB0aGVuIHRoZSBscGZjX25vZGVsaXN0IHBvaW50ZXIuCisJICB0byBub3RoaW5nIG1vcmUgdGhhbiB0aGUgbHBmY19ub2RlbGlzdCBwb2ludGVyLgogCSogQWRkZWQgYmluYXJ5IHN5c2ZzIGZpbGUgdG8gaXNzdWUgbWJveCBjb21tYW5kcwogCSogUmVwbGFjZWQgI2lmIF9fQklHX0VORElBTiB3aXRoICNpZiBfX0JJR19FTkRJQU5fQklURklFTEQgZm9yCiAJICBjb21wYXRpYmlsaXR5IHdpdGggdGhlIHVzZXIgc3BhY2UgYXBwbGljYXRpb25zLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zY3NpL0NoYW5nZUxvZy5uY3I1M2M4eHggYi9Eb2N1bWVudGF0aW9uL3Njc2kvQ2hhbmdlTG9nLm5jcjUzYzh4eAppbmRleCBhOWY3MjFhLi44YjI3OGMxIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3Njc2kvQ2hhbmdlTG9nLm5jcjUzYzh4eAorKysgYi9Eb2N1bWVudGF0aW9uL3Njc2kvQ2hhbmdlTG9nLm5jcjUzYzh4eApAQCAtMTksNyArMTksNyBAQAogCiBXZWQgSnVsIDI2IDIzOjMwIDIwMDAgR2VyYXJkIFJvdWRpZXIgKGdyb3VkaWVyQGNsdWItaW50ZXJuZXQuZnIpCiAJKiB2ZXJzaW9uIG5jcjUzYzh4eC0zLjQuMQotCS0gUHJvdmlkZSBPcGVuRmlybWFyZSBwYXRoIHRocm91Z2ggdGhlIHByb2MgRlMgb24gUFBDLgorCS0gUHJvdmlkZSBPcGVuRmlybXdhcmUgcGF0aCB0aHJvdWdoIHRoZSBwcm9jIEZTIG9uIFBQQy4KIAktIFJlbW92ZSB0cmFpbGluZyBhcmd1bWVudCAjMiBmcm9tIGEgY291cGxlIG9mICN1bmRlZnMuCiAKIFN1biBKdWwgMDkgMTY6MzAgMjAwMCBHZXJhcmQgUm91ZGllciAoZ3JvdWRpZXJAY2x1Yi1pbnRlcm5ldC5mcikKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vc2NzaS9DaGFuZ2VMb2cuc3ltNTNjOHh4IGIvRG9jdW1lbnRhdGlvbi9zY3NpL0NoYW5nZUxvZy5zeW01M2M4eHgKaW5kZXggZWY5ODVlYy4uMDJmZmJjMSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9zY3NpL0NoYW5nZUxvZy5zeW01M2M4eHgKKysrIGIvRG9jdW1lbnRhdGlvbi9zY3NpL0NoYW5nZUxvZy5zeW01M2M4eHgKQEAgLTgxLDcgKzgxLDcgQEAKIAogV2VkIEp1bCAyNiAyMzozMCAyMDAwIEdlcmFyZCBSb3VkaWVyIChncm91ZGllckBjbHViLWludGVybmV0LmZyKQogCSogdmVyc2lvbiBzeW01M2M4eHgtMS43LjEKLQktIFByb3ZpZGUgT3BlbkZpcm1hcmUgcGF0aCB0aHJvdWdoIHRoZSBwcm9jIEZTIG9uIFBQQy4KKwktIFByb3ZpZGUgT3BlbkZpcm13YXJlIHBhdGggdGhyb3VnaCB0aGUgcHJvYyBGUyBvbiBQUEMuCiAJLSBEb3dubG9hZCBvZiBvbi1jaGlwIFNSQU0gdXNpbmcgbWVtY3B5X3RvaW8oKSBkb2Vzbid0IHdvcmsgCiAJICBvbiBQUEMuIFJlc3RvcmUgcHJldmlvdXMgbWV0aG9kIChNRU1PUlkgTU9WRSBmcm9tIFNDUklQVFMpLgogCS0gUmVtb3ZlIHRyYWlsaW5nIGFyZ3VtZW50ICMyIGZyb20gYSBjb3VwbGUgb2YgI3VuZGVmcy4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vc2NzaS9zY3NpX2ZjX3RyYW5zcG9ydC50eHQgYi9Eb2N1bWVudGF0aW9uL3Njc2kvc2NzaV9mY190cmFuc3BvcnQudHh0CmluZGV4IDM4ZDMyNGQuLmU1YjA3MWQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vc2NzaS9zY3NpX2ZjX3RyYW5zcG9ydC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9zY3NpL3Njc2lfZmNfdHJhbnNwb3J0LnR4dApAQCAtMTkxLDcgKzE5MSw3IEBACiAgICAgICBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gYSBkcml2ZXIgImF0dGFjaCIgb24gYW4gYWRhcHRlciwgd2hpY2ggaXMKICAgICAgIGluZGVwZW5kZW50IG9mIHRoZSBhZGFwdGVyJ3MgbGluayBzdGF0ZS4KICAgICAtIEluc3RhbnRpYXRpb24gb2YgdGhlIHZwb3J0IG9uIHRoZSBGQyBsaW5rIHZpYSBFTFMgdHJhZmZpYywgZXRjLgotICAgICAgVGhpcyBpcyBlcXVpdmFsZW50IHRvIGEgImxpbmsgdXAiIGFuZCBzdWNjZXNzZnVsbCBsaW5rIGluaXRpYWxpemF0aW9uLgorICAgICAgVGhpcyBpcyBlcXVpdmFsZW50IHRvIGEgImxpbmsgdXAiIGFuZCBzdWNjZXNzZnVsIGxpbmsgaW5pdGlhbGl6YXRpb24uCiAgIEZ1cnRoZXIgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIHRoZSBpbnRlcmZhY2VzIHNlY3Rpb24gYmVsb3cgZm9yCiAgIFZwb3J0IENyZWF0aW9uLgogCkBAIC0zMjAsNyArMzIwLDcgQEAKICAgICAgIFRoaXMgaXMgZXF1aXZhbGVudCB0byBhIGRyaXZlciAiYXR0YWNoIiBvbiBhbiBhZGFwdGVyLCB3aGljaCBpcwogICAgICAgaW5kZXBlbmRlbnQgb2YgdGhlIGFkYXB0ZXIncyBsaW5rIHN0YXRlLgogICAgIC0gSW5zdGFudGlhdGlvbiBvZiB0aGUgdnBvcnQgb24gdGhlIEZDIGxpbmsgdmlhIEVMUyB0cmFmZmljLCBldGMuCi0gICAgICBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gYSAibGluayB1cCIgYW5kIHN1Y2Nlc3NmdWxsIGxpbmsgaW5pdGlhbGl6YXRpb24uCisgICAgICBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gYSAibGluayB1cCIgYW5kIHN1Y2Nlc3NmdWwgbGluayBpbml0aWFsaXphdGlvbi4KIAogICBUaGUgTExERCdzIHZwb3J0X2NyZWF0ZSgpIGZ1bmN0aW9uIHdpbGwgbm90IHN5bmNocm9ub3VzbHkgd2FpdCBmb3IgYm90aAogICBwYXJ0cyB0byBiZSBmdWxseSBjb21wbGV0ZWQgYmVmb3JlIHJldHVybmluZy4gSXQgbXVzdCB2YWxpZGF0ZSB0aGF0IHRoZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zcGkvc3BpLWxtNzBsbHAgYi9Eb2N1bWVudGF0aW9uL3NwaS9zcGktbG03MGxscAppbmRleCAxNTRiZDAyLi4zNGE5Y2ZkIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3NwaS9zcGktbG03MGxscAorKysgYi9Eb2N1bWVudGF0aW9uL3NwaS9zcGktbG03MGxscApAQCAtMTMsMTAgKzEzLDIwIEBACiBUaGlzIGRyaXZlciBwcm92aWRlcyBnbHVlIGNvZGUgY29ubmVjdGluZyBhIE5hdGlvbmFsIFNlbWljb25kdWN0b3IgTE03MCBMTFAKIHRlbXBlcmF0dXJlIHNlbnNvciBldmFsdWF0aW9uIGJvYXJkIHRvIHRoZSBrZXJuZWwncyBTUEkgY29yZSBzdWJzeXN0ZW0uCiAKK1RoaXMgaXMgYSBTUEkgbWFzdGVyIGNvbnRyb2xsZXIgZHJpdmVyLiBJdCBjYW4gYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoCisobGF5ZXJlZCB1bmRlcikgdGhlIExNNzAgbG9naWNhbCBkcml2ZXIgKGEgIlNQSSBwcm90b2NvbCBkcml2ZXIiKS4KIEluIGVmZmVjdCwgdGhpcyBkcml2ZXIgdHVybnMgdGhlIHBhcmFsbGVsIHBvcnQgaW50ZXJmYWNlIG9uIHRoZSBldmFsIGJvYXJkCiBpbnRvIGEgU1BJIGJ1cyB3aXRoIGEgc2luZ2xlIGRldmljZSwgd2hpY2ggd2lsbCBiZSBkcml2ZW4gYnkgdGhlIGdlbmVyaWMKIExNNzAgZHJpdmVyIChkcml2ZXJzL2h3bW9uL2xtNzAuYykuCiAKKworSGFyZHdhcmUgSW50ZXJmYWNpbmcKKy0tLS0tLS0tLS0tLS0tLS0tLS0tCitUaGUgc2NoZW1hdGljIGZvciB0aGlzIHBhcnRpY3VsYXIgYm9hcmQgKHRoZSBMTTcwRVZBTC1MTFApIGlzCithdmFpbGFibGUgKG9uIHBhZ2UgNCkgaGVyZToKKworICBodHRwOi8vd3d3Lm5hdGlvbmFsLmNvbS9hcHBpbmZvL3RlbXBzZW5zb3JzL2ZpbGVzL0xNNzBMTFBFVkFMbWFudWFsLnBkZgorCiBUaGUgaGFyZHdhcmUgaW50ZXJmYWNpbmcgb24gdGhlIExNNzAgTExQIGV2YWwgYm9hcmQgaXMgYXMgZm9sbG93czoKIAogICAgUGFyYWxsZWwgICAgICAgICAgICAgICAgIExNNzAgTExQCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3N5c2N0bC92bS50eHQgYi9Eb2N1bWVudGF0aW9uL3N5c2N0bC92bS50eHQKaW5kZXggZDc5ZWVkYS4uY2QwNTk5NCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9zeXNjdGwvdm0udHh0CisrKyBiL0RvY3VtZW50YXRpb24vc3lzY3RsL3ZtLnR4dApAQCAtNDEsNyArNDEsOCBAQAogCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCi1kaXJ0eV9yYXRpbywgZGlydHlfYmFja2dyb3VuZF9yYXRpbywgZGlydHlfZXhwaXJlX2NlbnRpc2VjcywKK2RpcnR5X2J5dGVzLCBkaXJ0eV9yYXRpbywgZGlydHlfYmFja2dyb3VuZF9ieXRlcywKK2RpcnR5X2JhY2tncm91bmRfcmF0aW8sIGRpcnR5X2V4cGlyZV9jZW50aXNlY3MsCiBkaXJ0eV93cml0ZWJhY2tfY2VudGlzZWNzLCBoaWdobWVtX2lzX2RpcnR5YWJsZSwKIHZmc19jYWNoZV9wcmVzc3VyZSwgbGFwdG9wX21vZGUsIGJsb2NrX2R1bXAsIHN3YXBfdG9rZW5fdGltZW91dCwKIGRyb3AtY2FjaGVzLCBodWdlcGFnZXNfdHJlYXRfYXNfbW92YWJsZToKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdXNiL3Bvd2VyLW1hbmFnZW1lbnQudHh0IGIvRG9jdW1lbnRhdGlvbi91c2IvcG93ZXItbWFuYWdlbWVudC50eHQKaW5kZXggZTQ4ZWExZC4uYWQ2NDI2MSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi91c2IvcG93ZXItbWFuYWdlbWVudC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi91c2IvcG93ZXItbWFuYWdlbWVudC50eHQKQEAgLTMxMywxMSArMzEzLDEzIEBACiB0aGF0IGl0IHN1cHBvcnRzIGF1dG9zdXNwZW5kIGJ5IHNldHRpbmcgdGhlIC5zdXBwb3J0c19hdXRvc3VzcGVuZCBmbGFnCiBpbiBpdHMgdXNiX2RyaXZlciBzdHJ1Y3R1cmUuICBJdCBpcyB0aGVuIHJlc3BvbnNpYmxlIGZvciBpbmZvcm1pbmcgdGhlCiBVU0IgY29yZSB3aGVuZXZlciBvbmUgb2YgaXRzIGludGVyZmFjZXMgYmVjb21lcyBidXN5IG9yIGlkbGUuICBUaGUKLWRyaXZlciBkb2VzIHNvIGJ5IGNhbGxpbmcgdGhlc2UgdGhyZWUgZnVuY3Rpb25zOgorZHJpdmVyIGRvZXMgc28gYnkgY2FsbGluZyB0aGVzZSBmaXZlIGZ1bmN0aW9uczoKIAogCWludCAgdXNiX2F1dG9wbV9nZXRfaW50ZXJmYWNlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKTsKIAl2b2lkIHVzYl9hdXRvcG1fcHV0X2ludGVyZmFjZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50Zik7CiAJaW50ICB1c2JfYXV0b3BtX3NldF9pbnRlcmZhY2Uoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpOworCWludCAgdXNiX2F1dG9wbV9nZXRfaW50ZXJmYWNlX2FzeW5jKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKTsKKwl2b2lkIHVzYl9hdXRvcG1fcHV0X2ludGVyZmFjZV9hc3luYyhzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50Zik7CiAKIFRoZSBmdW5jdGlvbnMgd29yayBieSBtYWludGFpbmluZyBhIGNvdW50ZXIgaW4gdGhlIHVzYl9pbnRlcmZhY2UKIHN0cnVjdHVyZS4gIFdoZW4gaW50Zi0+cG1fdXNhZ2VfY291bnQgaXMgPiAwIHRoZW4gdGhlIGludGVyZmFjZSBpcwpAQCAtMzMwLDEwICszMzIsMTIgQEAKIFRoaXMgZmllbGQgaXMgdXNlZCBvbmx5IGJ5IHRoZSBVU0IgY29yZS4pCiAKIFRoZSBkcml2ZXIgb3ducyBpbnRmLT5wbV91c2FnZV9jb3VudDsgaXQgY2FuIG1vZGlmeSB0aGUgdmFsdWUgaG93ZXZlcgotYW5kIHdoZW5ldmVyIGl0IGxpa2VzLiAgQSBuaWNlIGFzcGVjdCBvZiB0aGUgdXNiX2F1dG9wbV8qIHJvdXRpbmVzIGlzCi10aGF0IHRoZSBjaGFuZ2VzIHRoZXkgbWFrZSBhcmUgcHJvdGVjdGVkIGJ5IHRoZSB1c2JfZGV2aWNlIHN0cnVjdHVyZSdzCi1QTSBtdXRleCAodWRldi0+cG1fbXV0ZXgpOyBob3dldmVyIGRyaXZlcnMgbWF5IGNoYW5nZSBwbV91c2FnZV9jb3VudAotd2l0aG91dCBob2xkaW5nIHRoZSBtdXRleC4KK2FuZCB3aGVuZXZlciBpdCBsaWtlcy4gIEEgbmljZSBhc3BlY3Qgb2YgdGhlIG5vbi1hc3luYyB1c2JfYXV0b3BtXyoKK3JvdXRpbmVzIGlzIHRoYXQgdGhlIGNoYW5nZXMgdGhleSBtYWtlIGFyZSBwcm90ZWN0ZWQgYnkgdGhlIHVzYl9kZXZpY2UKK3N0cnVjdHVyZSdzIFBNIG11dGV4ICh1ZGV2LT5wbV9tdXRleCk7IGhvd2V2ZXIgZHJpdmVycyBtYXkgY2hhbmdlCitwbV91c2FnZV9jb3VudCB3aXRob3V0IGhvbGRpbmcgdGhlIG11dGV4LiAgRHJpdmVycyB1c2luZyB0aGUgYXN5bmMKK3JvdXRpbmVzIGFyZSByZXNwb25zaWJsZSBmb3IgdGhlaXIgb3duIHN5bmNocm9uaXphdGlvbiBhbmQgbXV0dWFsCitleGNsdXNpb24uCiAKIAl1c2JfYXV0b3BtX2dldF9pbnRlcmZhY2UoKSBpbmNyZW1lbnRzIHBtX3VzYWdlX2NvdW50IGFuZAogCWF0dGVtcHRzIGFuIGF1dG9yZXN1bWUgaWYgdGhlIG5ldyB2YWx1ZSBpcyA+IDAgYW5kIHRoZQpAQCAtMzQ4LDYgKzM1MiwxNCBAQAogCWlzIHN1c3BlbmRlZCwgYW5kIGl0IGF0dGVtcHRzIGFuIGF1dG9zdXNwZW5kIGlmIHRoZSB2YWx1ZSBpcwogCTw9IDAgYW5kIHRoZSBkZXZpY2UgaXNuJ3Qgc3VzcGVuZGVkLgogCisJdXNiX2F1dG9wbV9nZXRfaW50ZXJmYWNlX2FzeW5jKCkgYW5kCisJdXNiX2F1dG9wbV9wdXRfaW50ZXJmYWNlX2FzeW5jKCkgZG8gYWxtb3N0IHRoZSBzYW1lIHRoaW5ncyBhcworCXRoZWlyIG5vbi1hc3luYyBjb3VudGVycGFydHMuICBUaGUgZGlmZmVyZW5jZXMgYXJlOiB0aGV5IGRvCisJbm90IGFjcXVpcmUgdGhlIFBNIG11dGV4LCBhbmQgdGhleSB1c2UgYSB3b3JrcXVldWUgdG8gZG8gdGhlaXIKKwlqb2JzLiAgQXMgYSByZXN1bHQgdGhleSBjYW4gYmUgY2FsbGVkIGluIGFuIGF0b21pYyBjb250ZXh0LAorCXN1Y2ggYXMgYW4gVVJCJ3MgY29tcGxldGlvbiBoYW5kbGVyLCBidXQgd2hlbiB0aGV5IHJldHVybiB0aGUKKwlkZXZpY2Ugd2lsbCBub3QgZ2VuZXJhbGx5IG5vdCB5ZXQgYmUgaW4gdGhlIGRlc2lyZWQgc3RhdGUuCisKIFRoZXJlIGFsc28gYXJlIGEgY291cGxlIG9mIHV0aWxpdHkgcm91dGluZXMgZHJpdmVycyBjYW4gdXNlOgogCiAJdXNiX2F1dG9wbV9lbmFibGUoKSBzZXRzIHBtX3VzYWdlX2NudCB0byAwIGFuZCB0aGVuIGNhbGxzCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3ZtL3VuZXZpY3RhYmxlLWxydS50eHQgYi9Eb2N1bWVudGF0aW9uL3ZtL3VuZXZpY3RhYmxlLWxydS50eHQKaW5kZXggMTI1ZWVkNS4uMDcwNmE3MiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi92bS91bmV2aWN0YWJsZS1scnUudHh0CisrKyBiL0RvY3VtZW50YXRpb24vdm0vdW5ldmljdGFibGUtbHJ1LnR4dApAQCAtMTM3LDEzICsxMzcsNiBAQAogbWFwIGluIHRyeV90b191bm1hcCgpLiAgSWYgdHJ5X3RvX3VubWFwKCkgcmV0dXJucyBTV0FQX01MT0NLLCBzaHJpbmtfcGFnZV9saXN0KCkKIHdpbGwgY3VsbCB0aGUgcGFnZSBhdCB0aGF0IHBvaW50LgogCi1Ob3RlIHRoYXQgZm9yIGFub255bW91cyBwYWdlcywgc2hyaW5rX3BhZ2VfbGlzdCgpIGF0dGVtcHRzIHRvIGFkZCB0aGUgcGFnZSB0bwotdGhlIHN3YXAgY2FjaGUgYmVmb3JlIGl0IHRyaWVzIHRvIHVubWFwIHRoZSBwYWdlLiAgVG8gYXZvaWQgdGhpcyB1bm5lY2Vzc2FyeQotY29uc3VtcHRpb24gb2Ygc3dhcCBzcGFjZSwgc2hyaW5rX3BhZ2VfbGlzdCgpIGNhbGxzIHRyeV90b19tdW5sb2NrKCkgdG8gY2hlY2sKLXdoZXRoZXIgYW55IFZNX0xPQ0tFRCB2bWFzIG1hcCB0aGUgcGFnZSB3aXRob3V0IGF0dGVtcHRpbmcgdG8gdW5tYXAgdGhlIHBhZ2UuCi1JZiB0cnlfdG9fbXVubG9jaygpIHJldHVybnMgU1dBUF9NTE9DSywgc2hyaW5rX3BhZ2VfbGlzdCgpIHdpbGwgY3VsbCB0aGUgcGFnZQotd2l0aG91dCBjb25zdW1pbmcgc3dhcCBzcGFjZS4gIHRyeV90b19tdW5sb2NrKCkgd2lsbCBiZSBkZXNjcmliZWQgYmVsb3cuCi0KIFRvICJjdWxsIiBhbiB1bmV2aWN0YWJsZSBwYWdlLCB2bXNjYW4gc2ltcGx5IHB1dHMgdGhlIHBhZ2UgYmFjayBvbiB0aGUgbHJ1CiBsaXN0IHVzaW5nIHB1dGJhY2tfbHJ1X3BhZ2UoKS0tdGhlIGludmVyc2Ugb3BlcmF0aW9uIHRvIGlzb2xhdGVfbHJ1X3BhZ2UoKS0tCiBhZnRlciBkcm9wcGluZyB0aGUgcGFnZSBsb2NrLiAgQmVjYXVzZSB0aGUgY29uZGl0aW9uIHdoaWNoIG1ha2VzIHRoZSBwYWdlCkBAIC0xOTAsOCArMTgzLDggQEAKICAgIGluIHRoZSBWTV9MT0NLRUQgZmxhZyBiZWluZyBzZXQgZm9yIHRoZSB2bWEuCiAzKSBpbiB0aGUgZmF1bHQgcGF0aCwgaWYgbWxvY2tlZCBwYWdlcyBhcmUgImN1bGxlZCIgaW4gdGhlIGZhdWx0IHBhdGgsCiAgICBhbmQgd2hlbiBhIFZNX0xPQ0tFRCBzdGFjayBzZWdtZW50IGlzIGV4cGFuZGVkLgotNCkgYXMgbWVudGlvbmVkIGFib3ZlLCBpbiB2bXNjYW46c2hyaW5rX3BhZ2VfbGlzdCgpIHdpdGggYXR0ZW1wdGluZyB0bwotICAgcmVjbGFpbSBhIHBhZ2UgaW4gYSBWTV9MT0NLRUQgdm1hLS12aWEgdHJ5X3RvX3VubWFwKCkgb3IgdHJ5X3RvX211bmxvY2soKS4KKzQpIGFzIG1lbnRpb25lZCBhYm92ZSwgaW4gdm1zY2FuOnNocmlua19wYWdlX2xpc3QoKSB3aGVuIGF0dGVtcHRpbmcgdG8KKyAgIHJlY2xhaW0gYSBwYWdlIGluIGEgVk1fTE9DS0VEIHZtYSB2aWEgdHJ5X3RvX3VubWFwKCkuCiAKIE1sb2NrZWQgcGFnZXMgYmVjb21lIHVubG9ja2VkIGFuZCByZXNjdWVkIGZyb20gdGhlIHVuZXZpY3RhYmxlIGxpc3Qgd2hlbjoKIApAQCAtMjYwLDkgKzI1Myw5IEBACiAKIDIpIHZtYXMgbWFwcGluZyBodWdldGxiZnMgcGFnZSBhcmUgYWxyZWFkeSBlZmZlY3RpdmVseSBwaW5uZWQgaW50byBtZW1vcnkuCiAgICBXZSBkb24ndCBuZWVkIG5vciB3YW50IHRvIG1sb2NrKCkgdGhlc2UgcGFnZXMuICBIb3dldmVyLCB0byBwcmVzZXJ2ZSB0aGUKLSAgIHByaW9yIGJlaGF2aW9yIG9mIG1sb2NrKCktLWJlZm9yZSB0aGUgdW5ldmljdGFibGUvbWxvY2sgY2hhbmdlcy0tbWxvY2tfZml4dXAoKQotICAgd2lsbCBjYWxsIG1ha2VfcGFnZXNfcHJlc2VudCgpIGluIHRoZSBodWdldGxiZnMgdm1hIHJhbmdlIHRvIGFsbG9jYXRlIHRoZQotICAgaHVnZSBwYWdlcyBhbmQgcG9wdWxhdGUgdGhlIHB0ZXMuCisgICBwcmlvciBiZWhhdmlvciBvZiBtbG9jaygpLS1iZWZvcmUgdGhlIHVuZXZpY3RhYmxlL21sb2NrIGNoYW5nZXMtLQorICAgbWxvY2tfZml4dXAoKSB3aWxsIGNhbGwgbWFrZV9wYWdlc19wcmVzZW50KCkgaW4gdGhlIGh1Z2V0bGJmcyB2bWEgcmFuZ2UKKyAgIHRvIGFsbG9jYXRlIHRoZSBodWdlIHBhZ2VzIGFuZCBwb3B1bGF0ZSB0aGUgcHRlcy4KIAogMykgdm1hcyB3aXRoIFZNX0RPTlRFWFBBTkR8Vk1fUkVTRVJWRUQgYXJlIGdlbmVyYWxseSB1c2VyIHNwYWNlIG1hcHBpbmdzIG9mCiAgICBrZXJuZWwgcGFnZXMsIHN1Y2ggYXMgdGhlIHZkc28gcGFnZSwgcmVsYXkgY2hhbm5lbCBwYWdlcywgZXRjLiAgVGhlc2UgcGFnZXMKQEAgLTMyMiw3ICszMTUsNyBAQAogcGFzc2luZyBhIGZsYWcgdG8gaW5kaWNhdGUgdGhhdCBtdW5sb2NrKCkgaXMgYmVpbmcgcGVyZm9ybWVkLgogCiBCZWNhdXNlIHRoZSB2bWEgYWNjZXNzIHByb3RlY3Rpb25zIGNvdWxkIGhhdmUgYmVlbiBjaGFuZ2VkIHRvIFBST1RfTk9ORSBhZnRlcgotZmF1bHRpbmcgaW4gYW5kIG1sb2NraW5nIHNvbWUgcGFnZXMsIGdldF91c2VyX3BhZ2VzKCkgd2FzIHVucmVsaWFibGUgZm9yIHZpc2l0aW5nCitmYXVsdGluZyBpbiBhbmQgbWxvY2tpbmcgcGFnZXMsIGdldF91c2VyX3BhZ2VzKCkgd2FzIHVucmVsaWFibGUgZm9yIHZpc2l0aW5nCiB0aGVzZSBwYWdlcyBmb3IgbXVubG9ja2luZy4gIEJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCB0byBsZWF2ZSBwYWdlcyBtbG9ja2VkKCksCiBnZXRfdXNlcl9wYWdlcygpIHdhcyBlbmhhbmNlZCB0byBhY2NlcHQgYSBmbGFnIHRvIGlnbm9yZSB0aGUgcGVybWlzc2lvbnMgd2hlbgogZmV0Y2hpbmcgdGhlIHBhZ2VzLS1hbGwgb2Ygd2hpY2ggc2hvdWxkIGJlIHJlc2lkZW50IGFzIGEgcmVzdWx0IG9mIHByZXZpb3VzCkBAIC00MTYsOCArNDA5LDggQEAKIFdoZW4gdW5tYXBwaW5nIGFuIG1sb2NrZWQgcmVnaW9uIG9mIG1lbW9yeSwgd2hldGhlciBieSBhbiBleHBsaWNpdCBjYWxsIHRvCiBtdW5tYXAoKSBvciB2aWEgYW4gaW50ZXJuYWwgdW5tYXAgZnJvbSBleGl0KCkgb3IgZXhlYygpIHByb2Nlc3NpbmcsIHdlIG11c3QKIG11bmxvY2sgdGhlIHBhZ2VzIGlmIHdlJ3JlIHJlbW92aW5nIHRoZSBsYXN0IFZNX0xPQ0tFRCB2bWEgdGhhdCBtYXBzIHRoZSBwYWdlcy4KLUJlZm9yZSB0aGUgdW5ldmljdGFibGUvbWxvY2sgY2hhbmdlcywgbWxvY2tpbmcgZGlkIG5vdCBtYXJrIHRoZSBwYWdlcyBpbiBhbnkgd2F5LAotc28gdW5tYXBwaW5nIHRoZW0gcmVxdWlyZWQgbm8gcHJvY2Vzc2luZy4KK0JlZm9yZSB0aGUgdW5ldmljdGFibGUvbWxvY2sgY2hhbmdlcywgbWxvY2tpbmcgZGlkIG5vdCBtYXJrIHRoZSBwYWdlcyBpbiBhbnkKK3dheSwgc28gdW5tYXBwaW5nIHRoZW0gcmVxdWlyZWQgbm8gcHJvY2Vzc2luZy4KIAogVG8gbXVubG9jayBhIHJhbmdlIG9mIG1lbW9yeSB1bmRlciB0aGUgdW5ldmljdGFibGUvbWxvY2sgaW5mcmFzdHJ1Y3R1cmUsIHRoZQogbXVubWFwKCkgaGFuZGVyIGFuZCB0YXNrIGFkZHJlc3Mgc3BhY2UgdGVhciBkb3duIGZ1bmN0aW9uIGNhbGwKQEAgLTUxNywxMiArNTEwLDEwIEBACiBNbG9ja2VkIHBhZ2VzOiAgdHJ5X3RvX211bmxvY2soKSBSZXZlcnNlIE1hcCBTY2FuCiAKIFRPRE8vRklYTUU6ICBhIGJldHRlciBuYW1lIG1pZ2h0IGJlIHBhZ2VfbWxvY2tlZCgpLS1hbmFsb2dvdXMgdG8gdGhlCi1wYWdlX3JlZmVyZW5jZWQoKSByZXZlcnNlIG1hcCB3YWxrZXItLWVzcGVjaWFsbHkgaWYgd2UgY29udGludWUgdG8gY2FsbCB0aGlzCi1mcm9tIHNocmlua19wYWdlX2xpc3QoKS4gIFNlZSByZWxhdGVkIFRPRE8vRklYTUUgYmVsb3cuCitwYWdlX3JlZmVyZW5jZWQoKSByZXZlcnNlIG1hcCB3YWxrZXIuCiAKLVdoZW4gbXVubG9ja192bWFfcGFnZSgpLS1zZWUgIk1sb2NrZWQgUGFnZXM6ICBtdW5sb2NrKCkvbXVubG9ja2FsbCgpIFN5c3RlbQotQ2FsbCBIYW5kbGluZyIgYWJvdmUtLXRyaWVzIHRvIG11bmxvY2sgYSBwYWdlLCBvciB3aGVuIHNocmlua19wYWdlX2xpc3QoKQotZW5jb3VudGVycyBhbiBhbm9ueW1vdXMgcGFnZSB0aGF0IGlzIG5vdCB5ZXQgaW4gdGhlIHN3YXAgY2FjaGUsIHRoZXkgbmVlZCB0bworV2hlbiBtdW5sb2NrX3ZtYV9wYWdlKCktLXNlZSAiTWxvY2tlZCBQYWdlczogIG11bmxvY2soKS9tdW5sb2NrYWxsKCkKK1N5c3RlbSBDYWxsIEhhbmRsaW5nIiBhYm92ZS0tdHJpZXMgdG8gbXVubG9jayBhIHBhZ2UsIGl0IG5lZWRzIHRvCiBkZXRlcm1pbmUgd2hldGhlciBvciBub3QgdGhlIHBhZ2UgaXMgbWFwcGVkIGJ5IGFueSBWTV9MT0NLRUQgdm1hLCB3aXRob3V0CiBhY3R1YWxseSBhdHRlbXB0aW5nIHRvIHVubWFwIGFsbCBwdGVzIGZyb20gdGhlIHBhZ2UuICBGb3IgdGhpcyBwdXJwb3NlLCB0aGUKIHVuZXZpY3RhYmxlL21sb2NrIGluZnJhc3RydWN0dXJlIGludHJvZHVjZWQgYSB2YXJpYW50IG9mIHRyeV90b191bm1hcCgpIGNhbGxlZApAQCAtNTM1LDEwICs1MjYsNyBAQAogcGFnZXMgbWFwcGVkIGluIGxpbmVhciBWTUFzLCBhcyBpbiB0aGUgdHJ5X3RvX3VubWFwKCkgY2FzZSwgdGhlIGZ1bmN0aW9ucwogYXR0ZW1wdCB0byBhY3F1aXJlIHRoZSBhc3NvY2lhdGVkIG1tYXAgc2VtcGhvcmUsIG1sb2NrIHRoZSBwYWdlIHZpYQogbWxvY2tfdm1hX3BhZ2UoKSBhbmQgcmV0dXJuIFNXQVBfTUxPQ0suICBUaGlzIGVmZmVjdGl2ZWx5IHVuZG9lcyB0aGUKLXByZS1jbGVhcmluZyBvZiB0aGUgcGFnZSdzIFBHX21sb2NrZWQgZG9uZSBieSBtdW5sb2NrX3ZtYV9wYWdlKCkgYW5kIGluZm9ybXMKLXNocmlua19wYWdlX2xpc3QoKSB0aGF0IHRoZSBhbm9ueW1vdXMgcGFnZSBzaG91bGQgYmUgY3VsbGVkIHJhdGhlciB0aGFuIGFkZGVkCi10byB0aGUgc3dhcCBjYWNoZSBpbiBwcmVwYXJhdGlvbiBmb3IgYSB0cnlfdG9fdW5tYXAoKSB0aGF0IHdpbGwgYWxtb3N0Ci1jZXJ0YWlubHkgZmFpbC4KK3ByZS1jbGVhcmluZyBvZiB0aGUgcGFnZSdzIFBHX21sb2NrZWQgZG9uZSBieSBtdW5sb2NrX3ZtYV9wYWdlLgogCiBJZiB0cnlfdG9fdW5tYXAoKSBpcyB1bmFibGUgdG8gYWNxdWlyZSBhIFZNX0xPQ0tFRCB2bWEncyBhc3NvY2lhdGVkIG1tYXAKIHNlbWFwaG9yZSwgaXQgd2lsbCByZXR1cm4gU1dBUF9BR0FJTi4gIFRoaXMgd2lsbCBhbGxvdyBzaHJpbmtfcGFnZV9saXN0KCkKQEAgLTU1NywxMCArNTQ1LDcgQEAKIHN1Y2Nlc3NmdWxseSBhY3F1aXJlIHRoZSB2bWEncyBtbWFwIHNlbXBob3JlIGZvciByZWFkIGFuZCBtbG9jayB0aGUgcGFnZS4KIEFsdGhvdWdoIHRyeV90b19tdW5sb2NrKCkgY2FuIGJlIGNhbGxlZCBtYW55IFt2ZXJ5IG1hbnkhXSB0aW1lcyB3aGVuCiBtdW5sb2NrKClpbmcgYSBsYXJnZSByZWdpb24gb3IgdGVhcmluZyBkb3duIGEgbGFyZ2UgYWRkcmVzcyBzcGFjZSB0aGF0IGhhcyBiZWVuCi1tbG9ja2VkIHZpYSBtbG9ja2FsbCgpLCBvdmVyYWxsIHRoaXMgaXMgYSBmYWlybHkgcmFyZSBldmVudC4gIEluIGFkZGl0aW9uLAotYWx0aG91Z2ggc2hyaW5rX3BhZ2VfbGlzdCgpIGNhbGxzIHRyeV90b19tdW5sb2NrKCkgZm9yIGV2ZXJ5IGFub255bW91cyBwYWdlIHRoYXQKLWl0IGhhbmRsZXMgdGhhdCBpcyBub3QgeWV0IGluIHRoZSBzd2FwIGNhY2hlLCBvbiBhdmVyYWdlIGFub255bW91cyBwYWdlcyB3aWxsCi1oYXZlIHZlcnkgc2hvcnQgcmV2ZXJzZSBtYXAgbGlzdHMuCittbG9ja2VkIHZpYSBtbG9ja2FsbCgpLCBvdmVyYWxsIHRoaXMgaXMgYSBmYWlybHkgcmFyZSBldmVudC4KIAogTWxvY2tlZCBQYWdlOiAgUGFnZSBSZWNsYWltIGluIHNocmlua18qX2xpc3QoKQogCkBAIC01ODgsOCArNTczLDggQEAKICAgIG11bmxvY2tfdm1hX3BhZ2UoKSB3YXMgZm9yY2VkIHRvIGxldCB0aGUgcGFnZSBiYWNrIG9uIHRvIHRoZSBub3JtYWwKICAgIExSVSBsaXN0IGZvciB2bXNjYW4gdG8gaGFuZGxlLgogCi1zaHJpbmtfaW5hY3RpdmVfbGlzdCgpIGFsc28gY3VsbHMgYW55IHVuZXZpY3RhYmxlIHBhZ2VzIHRoYXQgaXQgZmluZHMKLW9uIHRoZSBpbmFjdGl2ZSBsaXN0cywgYWdhaW4gZGl2ZXJ0aW5nIHRoZW0gdG8gdGhlIGFwcHJvcHJpYXRlIHpvbmUncyB1bmV2aWN0YWJsZQorc2hyaW5rX2luYWN0aXZlX2xpc3QoKSBhbHNvIGN1bGxzIGFueSB1bmV2aWN0YWJsZSBwYWdlcyB0aGF0IGl0IGZpbmRzIG9uCit0aGUgaW5hY3RpdmUgbGlzdHMsIGFnYWluIGRpdmVydGluZyB0aGVtIHRvIHRoZSBhcHByb3ByaWF0ZSB6b25lJ3MgdW5ldmljdGFibGUKIGxydSBsaXN0LiAgc2hyaW5rX2luYWN0aXZlX2xpc3QoKSBzaG91bGQgb25seSBzZWUgU0hNX0xPQ0tlZCBwYWdlcyB0aGF0IGJlY2FtZQogU0hNX0xPQ0tlZCBhZnRlciBzaHJpbmtfYWN0aXZlX2xpc3QoKSBoYWQgbW92ZWQgdGhlbSB0byB0aGUgaW5hY3RpdmUgbGlzdCwgb3IKIHBhZ2VzIG1hcHBlZCBpbnRvIFZNX0xPQ0tFRCB2bWFzIHRoYXQgbXVubG9ja192bWFfcGFnZSgpIGNvdWxkbid0IGlzb2xhdGUgZnJvbQpAQCAtNTk3LDE5ICs1ODIsNyBAQAogdGhlIGxhdHRlciwgYnV0IHdpbGwgcGFzcyBvbiB0byBzaHJpbmtfcGFnZV9saXN0KCkuCiAKIHNocmlua19wYWdlX2xpc3QoKSBhZ2FpbiBjdWxscyBvYnZpb3VzbHkgdW5ldmljdGFibGUgcGFnZXMgdGhhdCBpdCBjb3VsZAotZW5jb3VudGVyIGZvciBzaW1pbGFyIHJlYXNvbiB0byBzaHJpbmtfaW5hY3RpdmVfbGlzdCgpLiAgQXMgYWxyZWFkeSBkaXNjdXNzZWQsCi1zaHJpbmtfcGFnZV9saXN0KCkgcHJvYWN0aXZlbHkgbG9va3MgZm9yIGFub255bW91cyBwYWdlcyB0aGF0IHNob3VsZCBoYXZlCi1QR19tbG9ja2VkIHNldCBidXQgZG9uJ3QtLXRoZXNlIHdvdWxkIG5vdCBiZSBkZXRlY3RlZCBieSBwYWdlX2V2aWN0YWJsZSgpLS10bwotYXZvaWQgYWRkaW5nIHRoZW0gdG8gdGhlIHN3YXAgY2FjaGUgdW5uZWNlc3NhcmlseS4gIEZpbGUgcGFnZXMgbWFwcGVkIGludG8KK2VuY291bnRlciBmb3Igc2ltaWxhciByZWFzb24gdG8gc2hyaW5rX2luYWN0aXZlX2xpc3QoKS4gIFBhZ2VzIG1hcHBlZCBpbnRvCiBWTV9MT0NLRUQgdm1hcyBidXQgd2l0aG91dCBQR19tbG9ja2VkIHNldCB3aWxsIG1ha2UgaXQgYWxsIHRoZSB3YXkgdG8KLXRyeV90b191bm1hcCgpLiAgc2hyaW5rX3BhZ2VfbGlzdCgpIHdpbGwgZGl2ZXJ0IHRoZW0gdG8gdGhlIHVuZXZpY3RhYmxlIGxpc3Qgd2hlbgotdHJ5X3RvX3VubWFwKCkgcmV0dXJucyBTV0FQX01MT0NLLCBhcyBkaXNjdXNzZWQgYWJvdmUuCi0KLVRPRE8vRklYTUU6ICBJZiB3ZSBjYW4gZW5oYW5jZSB0aGUgc3dhcCBjYWNoZSB0byByZWxpYWJseSByZW1vdmUgZW50cmllcwotd2l0aCBwYWdlX2NvdW50KHBhZ2UpID4gMiwgYXMgbG9uZyBhcyBhbGwgcHRlcyBhcmUgbWFwcGVkIHRvIHRoZSBwYWdlIGFuZAotbm90IHRoZSBzd2FwIGVudHJ5LCB3ZSBjYW4gcHJvYmFibHkgcmVtb3ZlIHRoZSBjYWxsIHRvIHRyeV90b19tdW5sb2NrKCkgaW4KLXNocmlua19wYWdlX2xpc3QoKSBhbmQganVzdCByZW1vdmUgdGhlIHBhZ2UgZnJvbSB0aGUgc3dhcCBjYWNoZSB3aGVuCi10cnlfdG9fdW5tYXAoKSByZXR1cm5zIFNXQVBfTUxPQ0suICAgQ3VycmVudGx5LCByZW1vdmVfZXhjbHVzaXZlX3N3YXBfcGFnZSgpCi1kb2Vzbid0IHNlZW0gdG8gYWxsb3cgdGhhdC4KLQotCit0cnlfdG9fdW5tYXAoKS4gIHNocmlua19wYWdlX2xpc3QoKSB3aWxsIGRpdmVydCB0aGVtIHRvIHRoZSB1bmV2aWN0YWJsZSBsaXN0Cit3aGVuIHRyeV90b191bm1hcCgpIHJldHVybnMgU1dBUF9NTE9DSywgYXMgZGlzY3Vzc2VkIGFib3ZlLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi93MS9tYXN0ZXJzLzAwLUlOREVYIGIvRG9jdW1lbnRhdGlvbi93MS9tYXN0ZXJzLzAwLUlOREVYCmluZGV4IDdiMGNlYWEuLmQ2M2ZhMDIgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vdzEvbWFzdGVycy8wMC1JTkRFWAorKysgYi9Eb2N1bWVudGF0aW9uL3cxL21hc3RlcnMvMDAtSU5ERVgKQEAgLTQsNSArNCw3IEBACiAJLSBUaGUgTWF4aW0vRGFsbGFzIFNlbWljb25kdWN0b3IgRFMyNDgyIHByb3ZpZGVzIDEtd2lyZSBidXNzZXMuCiBkczI0OTAKIAktIFRoZSBNYXhpbS9EYWxsYXMgU2VtaWNvbmR1Y3RvciBEUzI0OTAgYnVpbGRzIFVTQiA8LT4gVzEgYnJpZGdlcy4KK214Y193MQorCS0gVzEgbWFzdGVyIGNvbnRyb2xsZXIgZHJpdmVyIGZvdW5kIG9uIEZyZWVzY2FsZSBNWDIvTVgzIFNvQ3MKIHcxLWdwaW8KIAktIEdQSU8gMS13aXJlIGJ1cyBtYXN0ZXIgZHJpdmVyLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi93MS9tYXN0ZXJzL214Yy13MSBiL0RvY3VtZW50YXRpb24vdzEvbWFzdGVycy9teGMtdzEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTdmNjE5OQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vdzEvbWFzdGVycy9teGMtdzEKQEAgLTAsMCArMSwxMSBAQAorS2VybmVsIGRyaXZlciBteGNfdzEKKz09PT09PT09PT09PT09PT09PT09CisKK1N1cHBvcnRlZCBjaGlwczoKKyAgKiBGcmVlc2NhbGUgTVgyNywgTVgzMSBhbmQgcHJvYmFibHkgb3RoZXIgaS5NWCBTb0NzCisgICAgRGF0YXNoZWV0czoKKyAgICAgICAgaHR0cDovL3d3dy5mcmVlc2NhbGUuY29tL2ZpbGVzLzMyYml0L2RvYy9kYXRhX3NoZWV0L01DSU1YMzEucGRmP2Zwc3A9MQorCWh0dHA6Ly93d3cuZnJlZXNjYWxlLmNvbS9maWxlcy9kc3AvTUNJTVgyNy5wZGY/ZnBzcD0xCisKK0F1dGhvcjogT3JpZ2luYWxseSBiYXNlZCBvbiBGcmVlc2NhbGUgY29kZSwgcHJlcGFyZWQgZm9yIG1haW5saW5lIGJ5CisJU2FzY2hhIEhhdWVyIDxzLmhhdWVyQHBlbmd1dHJvbml4LmRlPgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi93MS93MS5uZXRsaW5rIGIvRG9jdW1lbnRhdGlvbi93MS93MS5uZXRsaW5rCmluZGV4IDM2NDBjN2MuLjgwNDQ0NWYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vdzEvdzEubmV0bGluaworKysgYi9Eb2N1bWVudGF0aW9uL3cxL3cxLm5ldGxpbmsKQEAgLTUsNjkgKzUsMTU3IEBACiA9PT09PT09PT09PT09CiAKIFRoZXJlIGFyZSB0aHJlZSB0eXBlcyBvZiBtZXNzYWdlcyBiZXR3ZWVuIHcxIGNvcmUgYW5kIHVzZXJzcGFjZToKLTEuIEV2ZW50cy4gVGhleSBhcmUgZ2VuZXJhdGVkIGVhY2ggdGltZSBuZXcgbWFzdGVyIG9yIHNsYXZlIGRldmljZSBmb3VuZAotCWVpdGhlciBkdWUgdG8gYXV0b21hdGljIG9yIHJlcXVlc3RlZCBzZWFyY2guCi0yLiBVc2Vyc3BhY2UgY29tbWFuZHMuIEluY2x1ZGVzIHJlYWQvd3JpdGUgYW5kIHNlYXJjaC9hbGFybSBzZWFyY2ggY29tYW1uZHMuCisxLiBFdmVudHMuIFRoZXkgYXJlIGdlbmVyYXRlZCBlYWNoIHRpbWUgbmV3IG1hc3RlciBvciBzbGF2ZSBkZXZpY2UKKwlmb3VuZCBlaXRoZXIgZHVlIHRvIGF1dG9tYXRpYyBvciByZXF1ZXN0ZWQgc2VhcmNoLgorMi4gVXNlcnNwYWNlIGNvbW1hbmRzLgogMy4gUmVwbGllcyB0byB1c2Vyc3BhY2UgY29tbWFuZHMuCiAKIAogUHJvdG9jb2wuCiA9PT09PT09PQogCi1bc3RydWN0IGNuX21zZ10gLSBjb25uZWN0b3IgaGVhZGVyLiBJdCdzIGxlbmd0aCBmaWVsZCBpcyBlcXVhbCB0byBzaXplIG9mIHRoZSBhdHRhY2hlZCBkYXRhLgorW3N0cnVjdCBjbl9tc2ddIC0gY29ubmVjdG9yIGhlYWRlci4KKwlJdHMgbGVuZ3RoIGZpZWxkIGlzIGVxdWFsIHRvIHNpemUgb2YgdGhlIGF0dGFjaGVkIGRhdGEKIFtzdHJ1Y3QgdzFfbmV0bGlua19tc2ddIC0gdzEgbmV0bGluayBoZWFkZXIuCiAJX191OCB0eXBlIAktIG1lc3NhZ2UgdHlwZS4KLQkJCVcxX1NMQVZFX0FERC9XMV9TTEFWRV9SRU1PVkUgLSBzbGF2ZSBhZGQvcmVtb3ZlIGV2ZW50cy4KLQkJCVcxX01BU1RFUl9BREQvVzFfTUFTVEVSX1JFTU9WRSAtIG1hc3RlciBhZGQvcmVtb3ZlIGV2ZW50cy4KLQkJCVcxX01BU1RFUl9DTUQgLSB1c2Vyc3BhY2UgY29tbWFuZCBmb3IgYnVzIG1hc3RlciBkZXZpY2UgKHNlYXJjaC9hbGFybSBzZWFyY2gpLgotCQkJVzFfU0xBVkVfQ01EIC0gdXNlcnNwYWNlIGNvbW1hbmQgZm9yIHNsYXZlIGRldmljZSAocmVhZC93cml0ZS8gc2VhcmNoL2FsYXJtIHNlYXJjaAotCQkJCQlmb3IgYnVzIG1hc3RlciBkZXZpY2Ugd2hlcmUgZ2l2ZW4gc2xhdmUgZGV2aWNlIGZvdW5kKS4KKwkJCVcxX0xJU1RfTUFTVEVSUworCQkJCWxpc3QgY3VycmVudCBidXMgbWFzdGVycworCQkJVzFfU0xBVkVfQUREL1cxX1NMQVZFX1JFTU9WRQorCQkJCXNsYXZlIGFkZC9yZW1vdmUgZXZlbnRzCisJCQlXMV9NQVNURVJfQUREL1cxX01BU1RFUl9SRU1PVkUKKwkJCQltYXN0ZXIgYWRkL3JlbW92ZSBldmVudHMKKwkJCVcxX01BU1RFUl9DTUQKKwkJCQl1c2Vyc3BhY2UgY29tbWFuZCBmb3IgYnVzIG1hc3RlcgorCQkJCWRldmljZSAoc2VhcmNoL2FsYXJtIHNlYXJjaCkKKwkJCVcxX1NMQVZFX0NNRAorCQkJCXVzZXJzcGFjZSBjb21tYW5kIGZvciBzbGF2ZSBkZXZpY2UKKwkJCQkocmVhZC93cml0ZS90b3VjaCkKIAlfX3U4IHJlcwktIHJlc2VydmVkCi0JX191MTYgbGVuCS0gc2l6ZSBvZiBhdHRhY2hlZCB0byB0aGlzIGhlYWRlciBkYXRhLgorCV9fdTE2IGxlbgktIHNpemUgb2YgZGF0YSBhdHRhY2hlZCB0byB0aGlzIGhlYWRlciBkYXRhCiAJdW5pb24gewotCQlfX3U4IGlkOwkJCSAtIHNsYXZlIHVuaXF1ZSBkZXZpY2UgaWQKKwkJX191OCBpZFs4XTsJCQkgLSBzbGF2ZSB1bmlxdWUgZGV2aWNlIGlkCiAJCXN0cnVjdCB3MV9tc3QgewotCQkJX191MzIJCWlkOwkgLSBtYXN0ZXIncyBpZC4KKwkJCV9fdTMyCQlpZDsJIC0gbWFzdGVyJ3MgaWQKIAkJCV9fdTMyCQlyZXM7CSAtIHJlc2VydmVkCiAJCX0gbXN0OwogCX0gaWQ7CiAKLVtzdHJ1Y3J0IHcxX25ldGxpbmtfY21kXSAtIGNvbW1hbmQgZm9yIGdpdmVkIG1hc3RlciBvciBzbGF2ZSBkZXZpY2UuCitbc3RydWN0IHcxX25ldGxpbmtfY21kXSAtIGNvbW1hbmQgZm9yIGdpdmVuIG1hc3RlciBvciBzbGF2ZSBkZXZpY2UuCiAJX191OCBjbWQJLSBjb21tYW5kIG9wY29kZS4KLQkJCVcxX0NNRF9SRUFEIAktIHJlYWQgY29tbWFuZC4KLQkJCVcxX0NNRF9XUklURQktIHdyaXRlIGNvbW1hbmQuCi0JCQlXMV9DTURfU0VBUkNICS0gc2VhcmNoIGNvbW1hbmQuCi0JCQlXMV9DTURfQUxBUk1fU0VBUkNIIC0gYWxhcm0gc2VhcmNoIGNvbW1hbmQuCisJCQlXMV9DTURfUkVBRCAJLSByZWFkIGNvbW1hbmQKKwkJCVcxX0NNRF9XUklURQktIHdyaXRlIGNvbW1hbmQKKwkJCVcxX0NNRF9UT1VDSAktIHRvdWNoIGNvbW1hbmQKKwkJCQkod3JpdGUgYW5kIHNhbXBsZSBkYXRhIGJhY2sgdG8gdXNlcnNwYWNlKQorCQkJVzFfQ01EX1NFQVJDSAktIHNlYXJjaCBjb21tYW5kCisJCQlXMV9DTURfQUxBUk1fU0VBUkNIIC0gYWxhcm0gc2VhcmNoIGNvbW1hbmQKIAlfX3U4IHJlcwktIHJlc2VydmVkCi0JX191MTYgbGVuCS0gbGVuZ3RoIG9mIGRhdGEgZm9yIHRoaXMgY29tbWFuZC4KLQkJCUZvciByZWFkIGNvbW1hbmQgZGF0YSBtdXN0IGJlIGFsbG9jYXRlZCBsaWtlIGZvciB3cml0ZSBjb21tYW5kLgotCV9fdTggZGF0YVswXQktIGRhdGEgZm9yIHRoaXMgY29tbWFuZC4KKwlfX3UxNiBsZW4JLSBsZW5ndGggb2YgZGF0YSBmb3IgdGhpcyBjb21tYW5kCisJCUZvciByZWFkIGNvbW1hbmQgZGF0YSBtdXN0IGJlIGFsbG9jYXRlZCBsaWtlIGZvciB3cml0ZSBjb21tYW5kCisJX191OCBkYXRhWzBdCS0gZGF0YSBmb3IgdGhpcyBjb21tYW5kCiAKIAotRWFjaCBjb25uZWN0b3IgbWVzc2FnZSBjYW4gaW5jbHVkZSBvbmUgb3IgbW9yZSB3MV9uZXRsaW5rX21zZyB3aXRoIHplcm8gb2YgbW9yZSBhdHRhY2hlZCB3MV9uZXRsaW5rX2NtZCBtZXNzYWdlcy4KK0VhY2ggY29ubmVjdG9yIG1lc3NhZ2UgY2FuIGluY2x1ZGUgb25lIG9yIG1vcmUgdzFfbmV0bGlua19tc2cgd2l0aAoremVybyBvciBtb3JlIGF0dGFjaGVkIHcxX25ldGxpbmtfY21kIG1lc3NhZ2VzLgogCi1Gb3IgZXZlbnQgbWVzc2FnZXMgdGhlcmUgYXJlIG5vIHcxX25ldGxpbmtfY21kIGVtYmVkZGVkIHN0cnVjdHVyZXMsIG9ubHkgY29ubmVjdG9yIGhlYWRlcgotYW5kIHcxX25ldGxpbmtfbXNnIHN0cnVjdXRyZSB3aXRoICJsZW4iIGZpZWxkIGJlaW5nIHplcm8gYW5kIGZpbGxlZCB0eXBlIChvbmUgb2YgZXZlbnQgdHlwZXMpCi1hbmQgaWQgLSBlaXRoZXIgOCBieXRlcyBvZiBzbGF2ZSB1bmlxdWUgaWQgaW4gaG9zdCBvcmRlciwgb3IgbWFzdGVyJ3MgaWQsIHdoaWNoIGlzIGFzc2lnbmVkCi10byBidXMgbWFzdGVyIGRldmljZSB3aGVuIGl0IGlzIGFkZGVkIHRvIHcxIGNvcmUuCitGb3IgZXZlbnQgbWVzc2FnZXMgdGhlcmUgYXJlIG5vIHcxX25ldGxpbmtfY21kIGVtYmVkZGVkIHN0cnVjdHVyZXMsCitvbmx5IGNvbm5lY3RvciBoZWFkZXIgYW5kIHcxX25ldGxpbmtfbXNnIHN0cnVjdXRyZSB3aXRoICJsZW4iIGZpZWxkCitiZWluZyB6ZXJvIGFuZCBmaWxsZWQgdHlwZSAob25lIG9mIGV2ZW50IHR5cGVzKSBhbmQgaWQ6CitlaXRoZXIgOCBieXRlcyBvZiBzbGF2ZSB1bmlxdWUgaWQgaW4gaG9zdCBvcmRlciwKK29yIG1hc3RlcidzIGlkLCB3aGljaCBpcyBhc3NpZ25lZCB0byBidXMgbWFzdGVyIGRldmljZQord2hlbiBpdCBpcyBhZGRlZCB0byB3MSBjb3JlLgogCi1DdXJyZW50bHkgcmVwbGllcyB0byB1c2Vyc3BhY2UgY29tbWFuZHMgYXJlIG9ubHkgZ2VuZXJhdGVkIGZvciByZWFkIGNvbW1hbmQgcmVxdWVzdC4KLU9uZSByZXBseSBpcyBnZW5lcmF0ZWQgZXhhY3RseSBmb3Igb25lIHcxX25ldGxpbmtfY21kIHJlYWQgcmVxdWVzdC4KLVJlcGxpZXMgYXJlIG5vdCBjb21iaW5lZCB3aGVuIHNlbnQgLSBpLmUuIHR5cGljYWwgcmVwbHkgbWVzc2FnZXMgbG9va3MgbGlrZSB0aGUgZm9sbG93aW5nOgorQ3VycmVudGx5IHJlcGxpZXMgdG8gdXNlcnNwYWNlIGNvbW1hbmRzIGFyZSBvbmx5IGdlbmVyYXRlZCBmb3IgcmVhZAorY29tbWFuZCByZXF1ZXN0LiBPbmUgcmVwbHkgaXMgZ2VuZXJhdGVkIGV4YWN0bHkgZm9yIG9uZSB3MV9uZXRsaW5rX2NtZAorcmVhZCByZXF1ZXN0LiBSZXBsaWVzIGFyZSBub3QgY29tYmluZWQgd2hlbiBzZW50IC0gaS5lLiB0eXBpY2FsIHJlcGx5CittZXNzYWdlcyBsb29rcyBsaWtlIHRoZSBmb2xsb3dpbmc6CisKIFtjbl9tc2ddW3cxX25ldGxpbmtfbXNnXVt3MV9uZXRsaW5rX2NtZF0KLWNuX21zZy5sZW4gPSBzaXplb2Yoc3RydWN0IHcxX25ldGxpbmtfbXNnKSArIHNpemVvZihzdHJ1Y3QgdzFfbmV0bGlua19jbWQpICsgY21kLT5sZW47Citjbl9tc2cubGVuID0gc2l6ZW9mKHN0cnVjdCB3MV9uZXRsaW5rX21zZykgKworCSAgICAgc2l6ZW9mKHN0cnVjdCB3MV9uZXRsaW5rX2NtZCkgKworCSAgICAgY21kLT5sZW47CiB3MV9uZXRsaW5rX21zZy5sZW4gPSBzaXplb2Yoc3RydWN0IHcxX25ldGxpbmtfY21kKSArIGNtZC0+bGVuOwogdzFfbmV0bGlua19jbWQubGVuID0gY21kLT5sZW47CiAKK1JlcGxpZXMgdG8gVzFfTElTVF9NQVNURVJTIHNob3VsZCBzZW5kIGEgbWVzc2FnZSBiYWNrIHRvIHRoZSB1c2Vyc3BhY2UKK3doaWNoIHdpbGwgY29udGFpbiBsaXN0IG9mIGFsbCByZWdpc3RlcmVkIG1hc3RlciBpZHMgaW4gdGhlIGZvbGxvd2luZworZm9ybWF0OgorCisJY25fbXNnIChDTl9XMV9JRFguQ05fVzFfVkFMIGFzIGlkLCBsZW4gaXMgZXF1YWwgdG8gc2l6ZW9mKHN0cnVjdAorCXcxX25ldGxpbmtfbXNnKSBwbHVzIG51bWJlciBvZiBtYXN0ZXJzIG11bHRpcGxlZCBieSA0KQorCXcxX25ldGxpbmtfbXNnICh0eXBlOiBXMV9MSVNUX01BU1RFUlMsIGxlbiBpcyBlcXVhbCB0bworCQludW1iZXIgb2YgbWFzdGVycyBtdWx0aXBsaWVkIGJ5IDQgKHUzMiBzaXplKSkKKwlpZDAgLi4uIGlkTgorCisJRWFjaCBtZXNzYWdlIGlzIGF0IG1vc3QgNGsgaW4gc2l6ZSwgc28gaWYgbnVtYmVyIG9mIG1hc3RlciBkZXZpY2VzCisJZXhjZWVkcyB0aGlzLCBpdCB3aWxsIGJlIHNwbGl0IGludG8gc2V2ZXJhbCBtZXNzYWdlcywKKwljbi5zZXEgd2lsbCBiZSBpbmNyZWFzZWQgZm9yIGVhY2ggb25lLgorCitXMSBzZWFyY2ggYW5kIGFsYXJtIHNlYXJjaCBjb21tYW5kcy4KK3JlcXVlc3Q6CitbY25fbXNnXQorICBbdzFfbmV0bGlua19tc2cgdHlwZSA9IFcxX01BU1RFUl9DTUQKKyAgCWlkIGlzIGVxdWFsIHRvIHRoZSBidXMgbWFzdGVyIGlkIHRvIHVzZSBmb3Igc2VhcmNoaW5nXQorICBbdzFfbmV0bGlua19jbWQgY21kID0gVzFfQ01EX1NFQVJDSCBvciBXMV9DTURfQUxBUk1fU0VBUkNIXQorCityZXBseToKKyAgW2NuX21zZywgYWNrID0gMSBhbmQgaW5jcmVhc2luZywgMCBtZWFucyB0aGUgbGFzdCBtZXNzYWdlLAorICAJc2VxIGlzIGVxdWFsIHRvIHRoZSByZXF1ZXN0IHNlcV0KKyAgW3cxX25ldGxpbmtfbXNnIHR5cGUgPSBXMV9NQVNURVJfQ01EXQorICBbdzFfbmV0bGlua19jbWQgY21kID0gVzFfQ01EX1NFQVJDSCBvciBXMV9DTURfQUxBUk1fU0VBUkNICisJbGVuIGlzIGVxdWFsIHRvIG51bWJlciBvZiBJRHMgbXVsdGlwbGllZCBieSA4XQorICBbNjRiaXQtaWQwIC4uLiA2NGJpdC1pZE5dCitMZW5ndGggaW4gZWFjaCBoZWFkZXIgY29ycmVzcG9uZHMgdG8gdGhlIHNpemUgb2YgdGhlIGRhdGEgYmVoaW5kIGl0LCBzbwordzFfbmV0bGlua19jbWQtPmxlbiA9IE4gKiA4OyB3aGVyZSBOIGlzIG51bWJlciBvZiBJRHMgaW4gdGhpcyBtZXNzYWdlLgorCUNhbiBiZSB6ZXJvLgordzFfbmV0bGlua19tc2ctPmxlbiA9IHNpemVvZihzdHJ1Y3QgdzFfbmV0bGlua19jbWQpICsgTiAqIDg7Citjbl9tc2ctPmxlbiA9IHNpemVvZihzdHJ1Y3QgdzFfbmV0bGlua19tc2cpICsKKwkgICAgICBzaXplb2Yoc3RydWN0IHcxX25ldGxpbmtfY21kKSArCisJICAgICAgTio4OworCitXMSByZXNldCBjb21tYW5kLgorW2NuX21zZ10KKyAgW3cxX25ldGxpbmtfbXNnIHR5cGUgPSBXMV9NQVNURVJfQ01ECisgIAlpZCBpcyBlcXVhbCB0byB0aGUgYnVzIG1hc3RlciBpZCB0byB1c2UgZm9yIHNlYXJjaGluZ10KKyAgW3cxX25ldGxpbmtfY21kIGNtZCA9IFcxX0NNRF9SRVNFVF0KKworCitDb21tYW5kIHN0YXR1cyByZXBsaWVzLgorPT09PT09PT09PT09PT09PT09PT09PQorCitFYWNoIGNvbW1hbmQgKGVpdGhlciByb290LCBtYXN0ZXIgb3Igc2xhdmUgd2l0aCBvciB3aXRob3V0IHcxX25ldGxpbmtfY21kCitzdHJ1Y3R1cmUpIHdpbGwgYmUgJ2Fja2VkJyBieSB0aGUgdzEgY29yZS4gRm9ybWF0IG9mIHRoZSByZXBseSBpcyB0aGUgc2FtZQorYXMgcmVxdWVzdCBtZXNzYWdlIGV4Y2VwdCB0aGF0IGxlbmd0aCBwYXJhbWV0ZXJzIGRvIG5vdCBhY2NvdW50IGZvciBkYXRhCityZXF1ZXN0ZWQgYnkgdGhlIHVzZXIsIGkuZS4gcmVhZC93cml0ZS90b3VjaCBJTyByZXF1ZXN0cyB3aWxsIG5vdCBjb250YWluCitkYXRhLCBzbyB3MV9uZXRsaW5rX2NtZC5sZW4gd2lsbCBiZSAwLCB3MV9uZXRsaW5rX21zZy5sZW4gd2lsbCBiZSBzaXplCitvZiB0aGUgdzFfbmV0bGlua19jbWQgc3RydWN0dXJlIGFuZCBjbl9tc2cubGVuIHdpbGwgYmUgZXF1YWwgdG8gdGhlIHN1bQorb2YgdGhlIHNpemVvZihzdHJ1Y3QgdzFfbmV0bGlua19tc2cpIGFuZCBzaXplb2Yoc3RydWN0IHcxX25ldGxpbmtfY21kKS4KK0lmIHJlcGx5IGlzIGdlbmVyYXRlZCBmb3IgbWFzdGVyIG9yIHJvb3QgY29tbWFuZCAod2hpY2ggZG8gbm90IGhhdmUKK3cxX25ldGxpbmtfY21kIGF0dGFjaGVkKSwgcmVwbHkgd2lsbCBjb250YWluIG9ubHkgY25fbXNnIGFuZCB3MV9uZXRsaW5rX21zZworc3RydWN0aXJlcy4KKwordzFfbmV0bGlua19tc2cuc3RhdHVzIGZpZWxkIHdpbGwgY2FycnkgcG9zaXRpdmUgZXJyb3IgdmFsdWUKKyhFSU5WQUwgZm9yIGV4YW1wbGUpIG9yIHplcm8gaW4gY2FzZSBvZiBzdWNjZXNzLgorCitBbGwgb3RoZXIgZmllbGRzIGluIGV2ZXJ5IHN0cnVjdHVyZSB3aWxsIG1pcnJvciB0aGUgc2FtZSBwYXJhbWV0ZXJzIGluIHRoZQorcmVxdWVzdCBtZXNzYWdlIChleGNlcHQgbGVuZ3RocyBhcyBkZXNjcmliZWQgYWJvdmUpLgorCitTdGF0dXMgcmVwbHkgaXMgZ2VuZXJhdGVkIGZvciBldmVyeSB3MV9uZXRsaW5rX2NtZCBlbWJlZGRlZCBpbiB0aGUKK3cxX25ldGxpbmtfbXNnLCBpZiB0aGVyZSBhcmUgbm8gdzFfbmV0bGlua19jbWQgc3RydWN0dXJlcywKK3JlcGx5IHdpbGwgYmUgZ2VuZXJhdGVkIGZvciB0aGUgdzFfbmV0bGlua19tc2cuCisKK0FsbCB3MV9uZXRsaW5rX2NtZCBjb21tYW5kIHN0cnVjdHVyZXMgYXJlIGhhbmRsZWQgaW4gZXZlcnkgdzFfbmV0bGlua19tc2csCitldmVuIGlmIHRoZXJlIHdlcmUgZXJyb3JzLCBvbmx5IGxlbmd0aCBtaXNtYXRjaCBpbnRlcnJ1cHRzIG1lc3NhZ2UgcHJvY2Vzc2luZy4KKwogCiBPcGVyYXRpb24gc3RlcHMgaW4gdzEgY29yZSB3aGVuIG5ldyBjb21tYW5kIGlzIHJlY2VpdmVkLgogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCi1XaGVuIG5ldyBtZXNzYWdlICh3MV9uZXRsaW5rX21zZykgaXMgcmVjZWl2ZWQgdzEgY29yZSBkZXRlY3RzIGlmIGl0IGlzIG1hc3RlciBvZiBzbGF2ZSByZXF1ZXN0LAotYWNjb3JkaW5nIHRvIHcxX25ldGxpbmtfbXNnLnR5cGUgZmllbGQuCitXaGVuIG5ldyBtZXNzYWdlICh3MV9uZXRsaW5rX21zZykgaXMgcmVjZWl2ZWQgdzEgY29yZSBkZXRlY3RzIGlmIGl0IGlzCittYXN0ZXIgb3Igc2xhdmUgcmVxdWVzdCwgYWNjb3JkaW5nIHRvIHcxX25ldGxpbmtfbXNnLnR5cGUgZmllbGQuCiBUaGVuIG1hc3RlciBvciBzbGF2ZSBkZXZpY2UgaXMgc2VhcmNoZWQgZm9yLgotV2hlbiBmb3VuZCwgbWFzdGVyIGRldmljZSAocmVxdWVzdGVkIG9yIHRob3NlIG9uZSBvbiB3aGVyZSBzbGF2ZSBkZXZpY2UgaXMgZm91bmQpIGlzIGxvY2tlZC4KLUlmIHNsYXZlIGNvbW1hbmQgaXMgcmVxdWVzdGVkLCB0aGVuIHJlc2V0L3NlbGVjdCBwcm9jZWR1cmUgaXMgc3RhcnRlZCB0byBzZWxlY3QgZ2l2ZW4gZGV2aWNlLgorV2hlbiBmb3VuZCwgbWFzdGVyIGRldmljZSAocmVxdWVzdGVkIG9yIHRob3NlIG9uZSBvbiB3aGVyZSBzbGF2ZSBkZXZpY2UKK2lzIGZvdW5kKSBpcyBsb2NrZWQuIElmIHNsYXZlIGNvbW1hbmQgaXMgcmVxdWVzdGVkLCB0aGVuIHJlc2V0L3NlbGVjdAorcHJvY2VkdXJlIGlzIHN0YXJ0ZWQgdG8gc2VsZWN0IGdpdmVuIGRldmljZS4KIAogVGhlbiBhbGwgcmVxdWVzdGVkIGluIHcxX25ldGxpbmtfbXNnIG9wZXJhdGlvbnMgYXJlIHBlcmZvcm1lZCBvbmUgYnkgb25lLgogSWYgY29tbWFuZCByZXF1aXJlcyByZXBseSAobGlrZSByZWFkIGNvbW1hbmQpIGl0IGlzIHNlbnQgb24gY29tbWFuZCBjb21wbGV0aW9uLgpAQCAtODIsOCArMTcwLDggQEAKIEVhY2ggY29ubmVjdG9yIG1lc3NhZ2UgaW5jbHVkZXMgdHdvIHUzMiBmaWVsZHMgYXMgImFkZHJlc3MiLgogdzEgdXNlcyBDTl9XMV9JRFggYW5kIENOX1cxX1ZBTCBkZWZpbmVkIGluIGluY2x1ZGUvbGludXgvY29ubmVjdG9yLmggaGVhZGVyLgogRWFjaCBtZXNzYWdlIGFsc28gaW5jbHVkZXMgc2VxdWVuY2UgYW5kIGFja25vd2xlZGdlIG51bWJlcnMuCi1TZXF1ZW5jZSBudW1iZXIgZm9yIGV2ZW50IG1lc3NhZ2VzIGlzIGFwcHJvcHJpYXRlIGJ1cyBtYXN0ZXIgc2VxdWVuY2UgbnVtYmVyIGluY3JlYXNlZCB3aXRoCi1lYWNoIGV2ZW50IG1lc3NhZ2Ugc2VudCAidGhyb3VnaCIgdGhpcyBtYXN0ZXIuCitTZXF1ZW5jZSBudW1iZXIgZm9yIGV2ZW50IG1lc3NhZ2VzIGlzIGFwcHJvcHJpYXRlIGJ1cyBtYXN0ZXIgc2VxdWVuY2UgbnVtYmVyCitpbmNyZWFzZWQgd2l0aCBlYWNoIGV2ZW50IG1lc3NhZ2Ugc2VudCAidGhyb3VnaCIgdGhpcyBtYXN0ZXIuCiBTZXF1ZW5jZSBudW1iZXIgZm9yIHVzZXJzcGFjZSByZXF1ZXN0cyBpcyBzZXQgYnkgdXNlcnNwYWNlIGFwcGxpY2F0aW9uLgogU2VxdWVuY2UgbnVtYmVyIGZvciByZXBseSBpcyB0aGUgc2FtZSBhcyB3YXMgaW4gcmVxdWVzdCwgYW5kCiBhY2tub3dsZWRnZSBudW1iZXIgaXMgc2V0IHRvIHNlcSsxLgpAQCAtOTMsNiArMTgxLDYgQEAKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKIDEuIERvY3VtZW50YXRpb24vY29ubmVjdG9yCi0yLiBodHRwOi8vdHNlcnZpY2UubmV0LnJ1L35zMG1icmUvYXJjaGl2ZS93MQotVGhpcyBhcmNoaXZlIGluY2x1ZGVzIHVzZXJzcGFjZSBhcHBsaWNhdGlvbiB3MWQuYyB3aGljaAotdXNlcyByZWFkL3dyaXRlL3NlYXJjaCBjb21tYW5kcyBmb3IgYWxsIG1hc3Rlci9zbGF2ZSBkZXZpY2VzIGZvdW5kIG9uIHRoZSBidXMuCisyLiBodHRwOi8vd3d3LmlvcmVtYXAubmV0L2FyY2hpdmUvdzEKK1RoaXMgYXJjaGl2ZSBpbmNsdWRlcyB1c2Vyc3BhY2UgYXBwbGljYXRpb24gdzFkLmMgd2hpY2ggdXNlcworcmVhZC93cml0ZS9zZWFyY2ggY29tbWFuZHMgZm9yIGFsbCBtYXN0ZXIvc2xhdmUgZGV2aWNlcyBmb3VuZCBvbiB0aGUgYnVzLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi93aW1heC9SRUFETUUuaTI0MDBtIGIvRG9jdW1lbnRhdGlvbi93aW1heC9SRUFETUUuaTI0MDBtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkZmZkODkKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL3dpbWF4L1JFQURNRS5pMjQwMG0KQEAgLTAsMCArMSwyNjAgQEAKKworICAgRHJpdmVyIGZvciB0aGUgSW50ZWwgV2lyZWxlc3MgV2ltYXggQ29ubmVjdGlvbiAyNDAwbQorCisgICAoQykgMjAwOCBJbnRlbCBDb3Jwb3JhdGlvbiA8IGxpbnV4LXdpbWF4QGludGVsLmNvbSA+CisKKyAgIFRoaXMgcHJvdmlkZXMgYSBkcml2ZXIgZm9yIHRoZSBJbnRlbCBXaXJlbGVzcyBXaU1BWCBDb25uZWN0aW9uIDI0MDBtCisgICBhbmQgYSBiYXNpYyBMaW51eCBrZXJuZWwgV2lNQVggc3RhY2suCisKKzEuIFJlcXVpcmVtZW50cworCisgICAgICogTGludXggaW5zdGFsbGF0aW9uIHdpdGggTGludXgga2VybmVsIDIuNi4yMiBvciBuZXdlciAoaWYgYnVpbGRpbmcKKyAgICAgICBmcm9tIGEgc2VwYXJhdGUgdHJlZSkKKyAgICAgKiBJbnRlbCBpMjQwMG0gRWNobyBQZWFrIG9yIEJheHRlciBQZWFrOyB0aGlzIGluY2x1ZGVzIHRoZSBJbnRlbAorICAgICAgIFdpcmVsZXNzIFdpTUFYL1dpRmkgTGluayA1eDUwIHNlcmllcy4KKyAgICAgKiBidWlsZCB0b29sczoKKyAgICAgICAgICArIExpbnV4IGtlcm5lbCBkZXZlbG9wbWVudCBwYWNrYWdlIGZvciB0aGUgdGFyZ2V0IGtlcm5lbDsgdG8KKyAgICAgICAgICAgIGJ1aWxkIGFnYWluc3QgeW91ciBjdXJyZW50bHkgcnVubmluZyBrZXJuZWwsIHlvdSBuZWVkIHRvIGhhdmUKKyAgICAgICAgICAgIHRoZSBrZXJuZWwgZGV2ZWxvcG1lbnQgcGFja2FnZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBydW5uaW5nCisgICAgICAgICAgICBpbWFnZSBpbnN0YWxsZWQgKHVzdWFsbHkgaWYgeW91ciBrZXJuZWwgaXMgbmFtZWQKKyAgICAgICAgICAgIGxpbnV4LVZFUlNJT04sIHRoZSBkZXZlbG9wbWVudCBwYWNrYWdlIGlzIGNhbGxlZAorICAgICAgICAgICAgbGludXgtZGV2LVZFUlNJT04gb3IgbGludXgtaGVhZGVycy1WRVJTSU9OKS4KKyAgICAgICAgICArIEdOVSBDIENvbXBpbGVyLCBtYWtlCisKKzIuIENvbXBpbGF0aW9uIGFuZCBpbnN0YWxsYXRpb24KKworMi4xLiBDb21waWxhdGlvbiBvZiB0aGUgZHJpdmVycyBpbmNsdWRlZCBpbiB0aGUga2VybmVsCisKKyAgIENvbmZpZ3VyZSB0aGUga2VybmVsOyB0byBlbmFibGUgdGhlIFdpTUFYIGRyaXZlcnMgc2VsZWN0IERyaXZlcnMgPgorICAgTmV0d29ya2luZyBEcml2ZXJzID4gV2lNQVggZGV2aWNlIHN1cHBvcnQuIEVuYWJsZSBhbGwgb2YgdGhlbSBhcworICAgbW9kdWxlcyAoZWFzaWVyKS4KKworICAgSWYgVVNCIG9yIFNESU8gYXJlIG5vdCBlbmFibGVkIGluIHRoZSBrZXJuZWwgY29uZmlndXJhdGlvbiwgdGhlIG9wdGlvbnMKKyAgIHRvIGJ1aWxkIHRoZSBpMjQwMG0gVVNCIG9yIFNESU8gZHJpdmVycyB3aWxsIG5vdCBzaG93LiBFbmFibGUgc2FpZAorICAgc3Vic3lzdGVtcyBhbmQgZ28gYmFjayB0byB0aGUgV2lNQVggbWVudSB0byBlbmFibGUgdGhlIGRyaXZlcnMuCisKKyAgIENvbXBpbGUgYW5kIGluc3RhbGwgeW91ciBrZXJuZWwgYXMgdXN1YWwuCisKKzIuMi4gQ29tcGlsYXRpb24gb2YgdGhlIGRyaXZlcnMgZGlzdHJpYnV0ZWQgYXMgYW4gc3RhbmRhbG9uZSBtb2R1bGUKKworICAgVG8gY29tcGlsZQorCiskIGNkIHNvdXJjZS9kaXJlY3RvcnkKKyQgbWFrZQorCisgICBPbmNlIGJ1aWx0IHlvdSBjYW4gbG9hZCBhbmQgdW5sb2FkIHVzaW5nIHRoZSBwcm92aWRlZCBsb2FkLnNoIHNjcmlwdDsKKyAgIGxvYWQuc2ggd2lsbCBsb2FkIHRoZSBtb2R1bGVzLCBsb2FkLnNoIHUgd2lsbCB1bmxvYWQgdGhlbS4KKworICAgVG8gaW5zdGFsbCBpbiB0aGUgZGVmYXVsdCBrZXJuZWwgZGlyZWN0b3JpZXMgKGFuZCBlbmFibGUgYXV0byBsb2FkaW5nCisgICB3aGVuIHRoZSBkZXZpY2UgaXMgcGx1Z2dlZCk6CisKKyQgbWFrZSBpbnN0YWxsCiskIGRlcG1vZCAtYQorCisgICBJZiB5b3VyIGtlcm5lbCBkZXZlbG9wbWVudCBmaWxlcyBhcmUgbG9jYXRlZCBpbiBhIG5vbiBzdGFuZGFyZAorICAgZGlyZWN0b3J5IG9yIGlmIHlvdSB3YW50IHRvIGJ1aWxkIGZvciBhIGtlcm5lbCB0aGF0IGlzIG5vdCB0aGUKKyAgIGN1cnJlbnRseSBydW5uaW5nIG9uZSwgc2V0IEtESVIgdG8gdGhlIHJpZ2h0IGxvY2F0aW9uOgorCiskIG1ha2UgS0RJUj0vcGF0aC90by9rZXJuZWwvZGV2L3RyZWUKKworICAgRm9yIG1vcmUgaW5mb3JtYXRpb24sIHBsZWFzZSBjb250YWN0IGxpbnV4LXdpbWF4QGludGVsLmNvbS4KKworMy4gSW5zdGFsbGluZyB0aGUgZmlybXdhcmUKKworICAgVGhlIGZpcm13YXJlIGNhbiBiZSBvYnRhaW5lZCBmcm9tIGh0dHA6Ly9saW51eHdpbWF4Lm9yZyBvciBtaWdodCBoYXZlCisgICBiZWVuIHN1cHBsaWVkIHdpdGggeW91ciBoYXJkd2FyZS4KKworICAgSXQgaGFzIHRvIGJlIGluc3RhbGxlZCBpbiB0aGUgdGFyZ2V0IHN5c3RlbToKKyAgICAgKgorJCBjcCBGSVJNV0FSRUZJTEUuc2JjZiAvbGliL2Zpcm13YXJlL2kyNDAwbS1mdy1CVVNUWVBFLTEuMy5zYmNmCisKKyAgICAgKiBOT1RFOiBpZiB5b3VyIGZpcm13YXJlIGNhbWUgaW4gYW4gLnJwbSBvciAuZGViIGZpbGUsIGp1c3QgaW5zdGFsbAorICAgICAgIGl0IGFzIG5vcm1hbCwgd2l0aCB0aGUgcnBtIChycG0gLWkgRklSTVdBUkUucnBtKSBvciBkcGtnCisgICAgICAgKGRwa2cgLWkgRklSTVdBUkUuZGViKSBjb21tYW5kcy4gTm8gZnVydGhlciBhY3Rpb24gaXMgbmVlZGVkLgorICAgICAqIEJVU1RZUEUgd2lsbCBiZSB1c2Igb3Igc2RpbywgZGVwZW5kaW5nIG9uIHRoZSBoYXJkd2FyZSB5b3UgaGF2ZS4KKyAgICAgICBFYWNoIGhhcmR3YXJlIHR5cGUgY29tZXMgd2l0aCBpdHMgb3duIGZpcm13YXJlIGFuZCB3aWxsIG5vdCB3b3JrCisgICAgICAgd2l0aCBvdGhlciB0eXBlcy4KKworNC4gRGVzaWduCisKKyAgIFRoaXMgcGFja2FnZSBjb250YWlucyB0d28gbWFqb3IgcGFydHM6IGEgV2lNQVgga2VybmVsIHN0YWNrIGFuZCBhCisgICBkcml2ZXIgZm9yIHRoZSBJbnRlbCBpMjQwMG0uCisKKyAgIFRoZSBXaU1BWCBzdGFjayBpcyBkZXNpZ25lZCB0byBwcm92aWRlIGZvciBjb21tb24gV2lNQVggY29udHJvbAorICAgc2VydmljZXMgdG8gY3VycmVudCBhbmQgZnV0dXJlIFdpTUFYIGRldmljZXMgZnJvbSBhbnkgdmVuZG9yOyBwbGVhc2UKKyAgIHNlZSBSRUFETUUud2ltYXggZm9yIGRldGFpbHMuCisKKyAgIFRoZSBpMjQwMG0ga2VybmVsIGRyaXZlciBpcyBicm9rZW4gdXAgaW4gdHdvIG1haW4gcGFydHM6IHRoZSBidXMKKyAgIGdlbmVyaWMgZHJpdmVyIGFuZCB0aGUgYnVzLXNwZWNpZmljIGRyaXZlcnMuIFRoZSBidXMgZ2VuZXJpYyBkcml2ZXIKKyAgIGZvcm1zIHRoZSBkcml2ZXJjb3JlIGFuZCBjb250YWluIG5vIGtub3dsZWRnZSBvZiB0aGUgYWN0dWFsIG1ldGhvZCB3ZQorICAgdXNlIHRvIGNvbm5lY3QgdG8gdGhlIGRldmljZS4gVGhlIGJ1cyBzcGVjaWZpYyBkcml2ZXJzIGFyZSBqdXN0IHRoZQorICAgZ2x1ZSB0byBjb25uZWN0IHRoZSBidXMtZ2VuZXJpYyBkcml2ZXIgYW5kIHRoZSBkZXZpY2UuIEN1cnJlbnRseSBvbmx5CisgICBVU0IgYW5kIFNESU8gYXJlIHN1cHBvcnRlZC4gU2VlIGRyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS9pMjQwMG0uaCBmb3IKKyAgIG1vcmUgaW5mb3JtYXRpb24uCisKKyAgIFRoZSBidXMgZ2VuZXJpYyBkcml2ZXIgaXMgbG9naWNhbGx5IGJyb2tlbiB1cCBpbiB0d28gcGFydHM6IE9TLWdsdWUgYW5kCisgICBoYXJkd2FyZS1nbHVlLiBUaGUgT1MtZ2x1ZSBpbnRlcmZhY2VzIHdpdGggTGludXguIFRoZSBoYXJkd2FyZS1nbHVlCisgICBpbnRlcmZhY2VzIHdpdGggdGhlIGRldmljZSBvbiB1c2luZyBhbiBpbnRlcmZhY2UgcHJvdmlkZWQgYnkgdGhlCisgICBidXMtc3BlY2lmaWMgZHJpdmVyLiBUaGUgcmVhc29uIGZvciB0aGlzIGJyZWFrdXAgaXMgdG8gYmUgYWJsZSB0bworICAgZWFzaWx5IHJldXNlIHRoZSBoYXJkd2FyZS1nbHVlIHRvIHdyaXRlIGRyaXZlcnMgZm9yIG90aGVyIE9TZXM7IG5vdGUKKyAgIHRoZSBoYXJkd2FyZSBnbHVlIHBhcnQgaXMgd3JpdHRlbiBhcyBhIG5hdGl2ZSBMaW51eCBkcml2ZXI7IG5vCisgICBhYnN0cmFjdGlvbiBsYXllcnMgYXJlIHVzZWQsIHNvIHRvIHBvcnQgdG8gYW5vdGhlciBPUywgdGhlIExpbnV4IGtlcm5lbAorICAgQVBJIGNhbGxzIHNob3VsZCBiZSByZXBsYWNlZCB3aXRoIHRoZSB0YXJnZXQgT1Mncy4KKworNS4gVXNhZ2UKKworICAgVG8gbG9hZCB0aGUgZHJpdmVyLCBmb2xsb3cgdGhlIGluc3RydWN0aW9ucyBpbiB0aGUgaW5zdGFsbCBzZWN0aW9uOworICAgb25jZSB0aGUgZHJpdmVyIGlzIGxvYWRlZCwgcGx1ZyBpbiB0aGUgZGV2aWNlICh1bmxlc3MgaXQgaXMgcGVybWFuZW50bHkKKyAgIHBsdWdnZWQgaW4pLiBUaGUgZHJpdmVyIHdpbGwgZW51bWVyYXRlIHRoZSBkZXZpY2UsIHVwbG9hZCB0aGUgZmlybXdhcmUKKyAgIGFuZCBvdXRwdXQgbWVzc2FnZXMgaW4gdGhlIGtlcm5lbCBsb2cgKGRtZXNnLCAvdmFyL2xvZy9tZXNzYWdlcyBvcgorICAgL3Zhci9sb2cva2Vybi5sb2cpIHN1Y2ggYXM6CisKKy4uLgoraTI0MDBtX3VzYiA1LTQ6MS4wOiBmaXJtd2FyZSBpbnRlcmZhY2UgdmVyc2lvbiA4LjAuMAoraTI0MDBtX3VzYiA1LTQ6MS4wOiBXaU1BWCBpbnRlcmZhY2Ugd214MCAoMDA6MWQ6ZTE6MDE6OTQ6MmMpIHJlYWR5CisKKyAgIEF0IHRoaXMgcG9pbnQgdGhlIGRldmljZSBpcyByZWFkeSB0byB3b3JrLgorCisgICBDdXJyZW50IHZlcnNpb25zIHJlcXVpcmUgdGhlIEludGVsIFdpTUFYIE5ldHdvcmsgU2VydmljZSBpbiB1c2Vyc3BhY2UKKyAgIHRvIG1ha2UgdGhpbmdzIHdvcmsuIFNlZSB0aGUgbmV0d29yayBzZXJ2aWNlJ3MgUkVBRE1FIGZvciBpbnN0cnVjdGlvbnMKKyAgIG9uIGhvdyB0byBzY2FuLCBjb25uZWN0IGFuZCBkaXNjb25uZWN0LgorCis1LjEuIE1vZHVsZSBwYXJhbWV0ZXJzCisKKyAgIE1vZHVsZSBwYXJhbWV0ZXJzIGNhbiBiZSBzZXQgYXQga2VybmVsIG9yIG1vZHVsZSBsb2FkIHRpbWUgb3IgYnkKKyAgIGVjaG9pbmcgdmFsdWVzOgorCiskIGVjaG8gVkFMVUUgPiAvc3lzL21vZHVsZS9NT0RVTEVOQU1FL3BhcmFtZXRlcnMvUEFSQU1FVEVSTkFNRQorCisgICBUbyBtYWtlIGNoYW5nZXMgcGVybWFuZW50LCBmb3IgZXhhbXBsZSwgZm9yIHRoZSBpMjQwMG0gbW9kdWxlLCB5b3UgY2FuCisgICBhbHNvIGNyZWF0ZSBhIGZpbGUgbmFtZWQgL2V0Yy9tb2Rwcm9iZS5kL2kyNDAwbSBjb250YWluaW5nOgorCitvcHRpb25zIGkyNDAwbSBpZGxlX21vZGVfZGlzYWJsZWQ9MQorCisgICBUbyBmaW5kIHdoaWNoIHBhcmFtZXRlcnMgYXJlIHN1cHBvcnRlZCBieSBhIG1vZHVsZSwgcnVuOgorCiskIG1vZGluZm8gcGF0aC90by9tb2R1bGUua28KKworICAgRHVyaW5nIGtlcm5lbCBib290dXAgKGlmIHRoZSBkcml2ZXIgaXMgbGlua2VkIGluIHRoZSBrZXJuZWwpLCBzcGVjaWZ5CisgICB0aGUgZm9sbG93aW5nIHRvIHRoZSBrZXJuZWwgY29tbWFuZCBsaW5lOgorCitpMjQwMG0uUEFSQU1FVEVSPVZBTFVFCisKKzUuMS4xLiBpMjQwMG06IGlkbGVfbW9kZV9kaXNhYmxlZAorCisgICBUaGUgaTI0MDBtIG1vZHVsZSBzdXBwb3J0cyBhIHBhcmFtZXRlciB0byBkaXNhYmxlIGlkbGUgbW9kZS4gVGhpcworICAgcGFyYW1ldGVyLCBvbmNlIHNldCwgd2lsbCB0YWtlIGVmZmVjdCBvbmx5IHdoZW4gdGhlIGRldmljZSBpcworICAgcmVpbml0aWFsaXplZCBieSB0aGUgZHJpdmVyIChlZzogZm9sbG93aW5nIGEgcmVzZXQgb3IgYSByZWNvbm5lY3QpLgorCis1LjIuIERlYnVnIG9wZXJhdGlvbnM6IGRlYnVnZnMgZW50cmllcworCisgICBUaGUgZHJpdmVyIHdpbGwgcmVnaXN0ZXIgZGVidWdmcyBlbnRyaWVzIHRoYXQgYWxsb3cgdGhlIHVzZXIgdG8gdHdlYWsKKyAgIGRlYnVnIHNldHRpbmdzLiBUaGVyZSBhcmUgdGhyZWUgbWFpbiBjb250YWluZXIgZGlyZWN0b3JpZXMgd2hlcmUKKyAgIGVudHJpZXMgYXJlIHBsYWNlZCwgd2hpY2ggY29ycmVzcG9uZCB0byB0aGUgdGhyZWUgYmxvY2tzIGEgaTI0MDBtIFdpTUFYCisgICBkcml2ZXIgaGFzOgorICAgICAqIC9zeXMva2VybmVsL2RlYnVnL3dpbWF4OkRFVk5BTUUvIGZvciB0aGUgZ2VuZXJpYyBXaU1BWCBzdGFjaworICAgICAgIGNvbnRyb2xzCisgICAgICogL3N5cy9rZXJuZWwvZGVidWcvd2ltYXg6REVWTkFNRS9pMjQwMG0gZm9yIHRoZSBpMjQwMG0gZ2VuZXJpYworICAgICAgIGRyaXZlciBjb250cm9scworICAgICAqIC9zeXMva2VybmVsL2RlYnVnL3dpbWF4OkRFVk5BTUUvaTI0MDBtLXVzYiAob3IgLXNkaW8pIGZvciB0aGUKKyAgICAgICBidXMtc3BlY2lmaWMgaTI0MDBtLXVzYiBvciBpMjQwMG0tc2RpbyBjb250cm9scykuCisKKyAgIE9mIGNvdXJzZSwgaWYgZGVidWdmcyBpcyBtb3VudGVkIGluIGEgZGlyZWN0b3J5IG90aGVyIHRoYW4KKyAgIC9zeXMva2VybmVsL2RlYnVnLCB0aG9zZSBwYXRocyB3aWxsIGNoYW5nZS4KKworNS4yLjEuIEluY3JlYXNpbmcgZGVidWcgb3V0cHV0CisKKyAgIFRoZSBmaWxlcyBuYW1lZCAqZGxfKiBpbmRpY2F0ZSBrbm9icyBmb3IgY29udHJvbGxpbmcgdGhlIGRlYnVnIG91dHB1dAorICAgb2YgZGlmZmVyZW50IHN1Ym1vZHVsZXM6CisgICAgICoKKyMgZmluZCAvc3lzL2tlcm5lbC9kZWJ1Zy93aW1heFw6d214MCAtbmFtZSBcKmRsX1wqCisvc3lzL2tlcm5lbC9kZWJ1Zy93aW1heDp3bXgwL2kyNDAwbS11c2IvZGxfdHgKKy9zeXMva2VybmVsL2RlYnVnL3dpbWF4OndteDAvaTI0MDBtLXVzYi9kbF9yeAorL3N5cy9rZXJuZWwvZGVidWcvd2ltYXg6d214MC9pMjQwMG0tdXNiL2RsX25vdGlmCisvc3lzL2tlcm5lbC9kZWJ1Zy93aW1heDp3bXgwL2kyNDAwbS11c2IvZGxfZncKKy9zeXMva2VybmVsL2RlYnVnL3dpbWF4OndteDAvaTI0MDBtLXVzYi9kbF91c2IKKy9zeXMva2VybmVsL2RlYnVnL3dpbWF4OndteDAvaTI0MDBtL2RsX3R4Cisvc3lzL2tlcm5lbC9kZWJ1Zy93aW1heDp3bXgwL2kyNDAwbS9kbF9yeAorL3N5cy9rZXJuZWwvZGVidWcvd2ltYXg6d214MC9pMjQwMG0vZGxfcmZraWxsCisvc3lzL2tlcm5lbC9kZWJ1Zy93aW1heDp3bXgwL2kyNDAwbS9kbF9uZXRkZXYKKy9zeXMva2VybmVsL2RlYnVnL3dpbWF4OndteDAvaTI0MDBtL2RsX2Z3Cisvc3lzL2tlcm5lbC9kZWJ1Zy93aW1heDp3bXgwL2kyNDAwbS9kbF9kZWJ1Z2ZzCisvc3lzL2tlcm5lbC9kZWJ1Zy93aW1heDp3bXgwL2kyNDAwbS9kbF9kcml2ZXIKKy9zeXMva2VybmVsL2RlYnVnL3dpbWF4OndteDAvaTI0MDBtL2RsX2NvbnRyb2wKKy9zeXMva2VybmVsL2RlYnVnL3dpbWF4OndteDAvd2ltYXhfZGxfc3RhY2sKKy9zeXMva2VybmVsL2RlYnVnL3dpbWF4OndteDAvd2ltYXhfZGxfb3BfcmZraWxsCisvc3lzL2tlcm5lbC9kZWJ1Zy93aW1heDp3bXgwL3dpbWF4X2RsX29wX3Jlc2V0Cisvc3lzL2tlcm5lbC9kZWJ1Zy93aW1heDp3bXgwL3dpbWF4X2RsX29wX21zZworL3N5cy9rZXJuZWwvZGVidWcvd2ltYXg6d214MC93aW1heF9kbF9pZF90YWJsZQorL3N5cy9rZXJuZWwvZGVidWcvd2ltYXg6d214MC93aW1heF9kbF9kZWJ1Z2ZzCisKKyAgIEJ5IHJlYWRpbmcgdGhlIGZpbGUgeW91IGNhbiBvYnRhaW4gdGhlIGN1cnJlbnQgdmFsdWUgb2Ygc2FpZCBkZWJ1ZworICAgbGV2ZWw7IGJ5IHdyaXRpbmcgdG8gaXQsIHlvdSBjYW4gc2V0IGl0LgorCisgICBUbyBpbmNyZWFzZSB0aGUgZGVidWcgbGV2ZWwgb2YsIGZvciBleGFtcGxlLCB0aGUgaTI0MDBtJ3MgZ2VuZXJpYyBUWAorICAgZW5naW5lLCBqdXN0IHdyaXRlOgorCiskIGVjaG8gMyA+IC9zeXMva2VybmVsL2RlYnVnL3dpbWF4OndteDAvaTI0MDBtL2RsX3R4CisKKyAgIEluY3JlYXNpbmcgbnVtYmVycyB5aWVsZCBpbmNyZWFzaW5nIGRlYnVnIGluZm9ybWF0aW9uOyBmb3IgZGV0YWlscyBvZgorICAgd2hhdCBpcyBwcmludGVkIGFuZCB0aGUgYXZhaWxhYmxlIGxldmVscywgY2hlY2sgdGhlIHNvdXJjZS4gVGhlIGNvZGUKKyAgIHVzZXMgMCBmb3IgZGlzYWJsZWQgYW5kIGluY3JlYXNpbmcgdmFsdWVzIHVudGlsIDguCisKKzUuMi4yLiBSWCBhbmQgVFggc3RhdGlzdGljcworCisgICBUaGUgaTI0MDBtL3J4X3N0YXRzIGFuZCBpMjQwMG0vdHhfc3RhdHMgcHJvdmlkZSBzdGF0aXN0aWNzIGFib3V0IHRoZQorICAgZGF0YSByZWNlcHRpb24vZGVsaXZlcnkgZnJvbSB0aGUgZGV2aWNlOgorCiskIGNhdCAvc3lzL2tlcm5lbC9kZWJ1Zy93aW1heDp3bXgwL2kyNDAwbS9yeF9zdGF0cworNDUgMSAzIDM0IDMxMDQgNDggNDgwCisKKyAgIFRoZSBudW1iZXJzIHJlcG9ydGVkIGFyZQorICAgICAqIHBhY2tldHMvUlgtYnVmZmVyOiB0b3RhbCwgbWluLCBtYXgKKyAgICAgKiBSWC1idWZmZXJzOiB0b3RhbCBSWCBidWZmZXJzIHJlY2VpdmVkLCBhY2N1bXVsYXRlZCBSWCBidWZmZXIgc2l6ZQorICAgICAgIGluIGJ5dGVzLCBtaW4gc2l6ZSByZWNlaXZlZCwgbWF4IHNpemUgcmVjZWl2ZWQKKworICAgVGh1cywgdG8gZmluZCB0aGUgYXZlcmFnZSBidWZmZXIgc2l6ZSByZWNlaXZlZCwgZGl2aWRlIGFjY3VtdWxhdGVkCisgICBSWC1idWZmZXIgLyB0b3RhbCBSWC1idWZmZXJzLgorCisgICBUbyBjbGVhciB0aGUgc3RhdGlzdGljcyBiYWNrIHRvIDAsIHdyaXRlIGFueXRoaW5nIHRvIHRoZSByeF9zdGF0cyBmaWxlOgorCiskIGVjaG8gMSA+IC9zeXMva2VybmVsL2RlYnVnL3dpbWF4OndteDAvaTI0MDBtX3J4X3N0YXRzCisKKyAgIExpa2V3aXNlIGZvciBUWC4KKworICAgTm90ZSB0aGUgcGFja2V0cyB0aGlzIGRlYnVnIGZpbGUgcmVmZXJzIHRvIGFyZSBub3QgbmV0d29yayBwYWNrZXQsIGJ1dAorICAgcGFja2V0cyBpbiB0aGUgc2Vuc2Ugb2YgdGhlIGRldmljZS1zcGVjaWZpYyBwcm90b2NvbCBmb3IgY29tbXVuaWNhdGlvbgorICAgdG8gdGhlIGhvc3QuIFNlZSBkcml2ZXJzL25ldC93aW1heC9pMjQwMG0vdHguYy4KKworNS4yLjMuIFRyYWNpbmcgbWVzc2FnZXMgcmVjZWl2ZWQgZnJvbSB1c2VyIHNwYWNlCisKKyAgIFRvIGVjaG8gbWVzc2FnZXMgcmVjZWl2ZWQgZnJvbSB1c2VyIHNwYWNlIGludG8gdGhlIHRyYWNlIHBpcGUgdGhhdCB0aGUKKyAgIGkyNDAwbSBkcml2ZXIgY3JlYXRlcywgc2V0IHRoZSBkZWJ1ZyBmaWxlIGkyNDAwbS90cmFjZV9tc2dfZnJvbV91c2VyIHRvCisgICAxOgorICAgICAqCiskIGVjaG8gMSA+IC9zeXMva2VybmVsL2RlYnVnL3dpbWF4OndteDAvaTI0MDBtL3RyYWNlX21zZ19mcm9tX3VzZXIKKworNS4yLjQuIFBlcmZvcm1pbmcgYSBkZXZpY2UgcmVzZXQKKworICAgQnkgd3JpdGluZyBhIDAsIGEgMSBvciBhIDIgdG8gdGhlIGZpbGUKKyAgIC9zeXMva2VybmVsL2RlYnVnL3dpbWF4OndteDAvcmVzZXQsIHRoZSBkcml2ZXIgcGVyZm9ybXMgYSB3YXJtICh3aXRob3V0CisgICBkaXNjb25uZWN0aW5nIGZyb20gdGhlIGJ1cyksIGNvbGQgKGRpc2Nvbm5lY3RpbmcgZnJvbSB0aGUgYnVzKSBvciBidXMKKyAgIChidXMgc3BlY2lmaWMpIHJlc2V0IG9uIHRoZSBkZXZpY2UuCisKKzUuMi41LiBBc2tpbmcgdGhlIGRldmljZSB0byBlbnRlciBwb3dlciBzYXZpbmcgbW9kZQorCisgICBCeSB3cml0aW5nIGFueSB2YWx1ZSB0byB0aGUgL3N5cy9rZXJuZWwvZGVidWcvd2ltYXg6d214MCBmaWxlLCB0aGUKKyAgIGRldmljZSB3aWxsIGF0dGVtcHQgdG8gZW50ZXIgcG93ZXIgc2F2aW5nIG1vZGUuCisKKzYuIFRyb3VibGVzaG9vdGluZworCis2LjEuIERyaXZlciBjb21wbGFpbnMgYWJvdXQgJ2kyNDAwbS1mdy11c2ItMS4yLnNiY2Y6IHJlcXVlc3QgZmFpbGVkJworCisgICBJZiB1cG9uIGNvbm5lY3RpbmcgdGhlIGRldmljZSwgdGhlIGZvbGxvd2luZyBpcyBvdXRwdXQgaW4gdGhlIGtlcm5lbAorICAgbG9nOgorCitpMjQwMG1fdXNiIDUtNDoxLjA6IGZ3IGkyNDAwbS1mdy11c2ItMS4zLnNiY2Y6IHJlcXVlc3QgZmFpbGVkOiAtMgorCisgICBUaGlzIG1lYW5zIHRoYXQgdGhlIGRyaXZlciBjYW5ub3QgbG9jYXRlIHRoZSBmaXJtd2FyZSBmaWxlIG5hbWVkCisgICAvbGliL2Zpcm13YXJlL2kyNDAwbS1mdy11c2ItMS4yLnNiY2YuIENoZWNrIHRoYXQgdGhlIGZpbGUgaXMgcHJlc2VudCBpbgorICAgdGhlIHJpZ2h0IGxvY2F0aW9uLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi93aW1heC9SRUFETUUud2ltYXggYi9Eb2N1bWVudGF0aW9uL3dpbWF4L1JFQURNRS53aW1heApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzhjNDM3Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi93aW1heC9SRUFETUUud2ltYXgKQEAgLTAsMCArMSw4MSBAQAorCisgICBMaW51eCBrZXJuZWwgV2lNQVggc3RhY2sKKworICAgKEMpIDIwMDggSW50ZWwgQ29ycG9yYXRpb24gPCBsaW51eC13aW1heEBpbnRlbC5jb20gPgorCisgICBUaGlzIHByb3ZpZGVzIGEgYmFzaWMgTGludXgga2VybmVsIFdpTUFYIHN0YWNrIHRvIHByb3ZpZGUgYSBjb21tb24KKyAgIGNvbnRyb2wgQVBJIGZvciBXaU1BWCBkZXZpY2VzLCB1c2FibGUgZnJvbSBrZXJuZWwgYW5kIHVzZXIgc3BhY2UuCisKKzEuIERlc2lnbgorCisgICBUaGUgV2lNQVggc3RhY2sgaXMgZGVzaWduZWQgdG8gcHJvdmlkZSBmb3IgY29tbW9uIFdpTUFYIGNvbnRyb2wKKyAgIHNlcnZpY2VzIHRvIGN1cnJlbnQgYW5kIGZ1dHVyZSBXaU1BWCBkZXZpY2VzIGZyb20gYW55IHZlbmRvci4KKworICAgQmVjYXVzZSBjdXJyZW50bHkgdGhlcmUgaXMgb25seSBvbmUgYW5kIHdlIGRvbid0IGtub3cgd2hhdCB3b3VsZCBiZSB0aGUKKyAgIGNvbW1vbiBzZXJ2aWNlcywgdGhlIEFQSXMgaXQgY3VycmVudGx5IHByb3ZpZGVzIGFyZSB2ZXJ5IG1pbmltYWwuCisgICBIb3dldmVyLCBpdCBpcyBkb25lIGluIHN1Y2ggYSB3YXkgdGhhdCBpdCBpcyBlYXNpbHkgZXh0ZW5zaWJsZSB0bworICAgYWNjb21tb2RhdGUgZnV0dXJlIHJlcXVpcmVtZW50cy4KKworICAgVGhlIHN0YWNrIHdvcmtzIGJ5IGVtYmVkZGluZyBhIHN0cnVjdCB3aW1heF9kZXYgaW4geW91ciBkZXZpY2UncworICAgY29udHJvbCBzdHJ1Y3R1cmVzLiBUaGlzIHByb3ZpZGVzIGEgc2V0IG9mIGNhbGxiYWNrcyB0aGF0IHRoZSBXaU1BWAorICAgc3RhY2sgd2lsbCBjYWxsIGluIG9yZGVyIHRvIGltcGxlbWVudCBjb250cm9sIG9wZXJhdGlvbnMgcmVxdWVzdGVkIGJ5CisgICB0aGUgdXNlci4gQXMgd2VsbCwgdGhlIHN0YWNrIHByb3ZpZGVzIEFQSSBmdW5jdGlvbnMgdGhhdCB0aGUgZHJpdmVyCisgICBjYWxscyB0byBub3RpZnkgYWJvdXQgY2hhbmdlcyBvZiBzdGF0ZSBpbiB0aGUgZGV2aWNlLgorCisgICBUaGUgc3RhY2sgZXhwb3J0cyB0aGUgQVBJIGNhbGxzIG5lZWRlZCB0byBjb250cm9sIHRoZSBkZXZpY2UgdG8gdXNlcgorICAgc3BhY2UgdXNpbmcgZ2VuZXJpYyBuZXRsaW5rIGFzIGEgbWFyc2hhbGxpbmcgbWVjaGFuaXNtLiBZb3UgY2FuIGFjY2VzcworICAgdGhlbSB1c2luZyB5b3VyIG93biBjb2RlIG9yIHVzZSB0aGUgd3JhcHBlcnMgcHJvdmlkZWQgZm9yIHlvdXIKKyAgIGNvbnZlbmllbmNlIGluIGxpYndpbWF4IChpbiB0aGUgd2ltYXgtdG9vbHMgcGFja2FnZSkuCisKKyAgIEZvciBkZXRhaWxlZCBpbmZvcm1hdGlvbiBvbiB0aGUgc3RhY2ssIHBsZWFzZSBzZWUKKyAgIGluY2x1ZGUvbGludXgvd2ltYXguaC4KKworMi4gVXNhZ2UKKworICAgRm9yIHVzYWdlIGluIGEgZHJpdmVyIChyZWdpc3RyYXRpb24sIEFQSSwgZXRjKSBwbGVhc2UgcmVmZXIgdG8gdGhlCisgICBpbnN0cnVjdGlvbnMgaW4gdGhlIGhlYWRlciBmaWxlIGluY2x1ZGUvbGludXgvd2ltYXguaC4KKworICAgV2hlbiBhIGRldmljZSBpcyByZWdpc3RlcmVkIHdpdGggdGhlIFdpTUFYIHN0YWNrLCBhIHNldCBvZiBkZWJ1Z2ZzCisgICBmaWxlcyB3aWxsIGFwcGVhciBpbiAvc3lzL2tlcm5lbC9kZWJ1Zy93aW1heDp3bXhYIGNhbiB0d2VhayBmb3IKKyAgIGNvbnRyb2wuCisKKzIuMS4gT2J0YWluaW5nIGRlYnVnIGluZm9ybWF0aW9uOiBkZWJ1Z2ZzIGVudHJpZXMKKworICAgVGhlIFdpTUFYIHN0YWNrIGlzIGNvbXBpbGVkLCBieSBkZWZhdWx0LCB3aXRoIGRlYnVnIG1lc3NhZ2VzIHRoYXQgY2FuCisgICBiZSB1c2VkIHRvIGRpYWdub3NlIGlzc3Vlcy4gQnkgZGVmYXVsdCwgc2FpZCBtZXNzYWdlcyBhcmUgZGlzYWJsZWQuCisKKyAgIFRoZSBkcml2ZXJzIHdpbGwgcmVnaXN0ZXIgZGVidWdmcyBlbnRyaWVzIHRoYXQgYWxsb3cgdGhlIHVzZXIgdG8gdHdlYWsKKyAgIGRlYnVnIHNldHRpbmdzLgorCisgICBFYWNoIGRyaXZlciwgd2hlbiByZWdpc3RlcmluZyB3aXRoIHRoZSBzdGFjaywgd2lsbCBjYXVzZSBhIGRlYnVnZnMKKyAgIGRpcmVjdG9yeSBuYW1lZCB3aW1heDpERVZJQ0VOQU1FIHRvIGJlIGNyZWF0ZWQ7IG9wdGlvbmFsbHksIGl0IG1pZ2h0CisgICBjcmVhdGUgbW9yZSBzdWJlbnRyaWVzIGJlbG93IGl0LgorCisyLjEuMS4gSW5jcmVhc2luZyBkZWJ1ZyBvdXRwdXQKKworICAgVGhlIGZpbGVzIG5hbWVkICpkbF8qIGluZGljYXRlIGtub2JzIGZvciBjb250cm9sbGluZyB0aGUgZGVidWcgb3V0cHV0CisgICBvZiBkaWZmZXJlbnQgc3VibW9kdWxlcyBvZiB0aGUgV2lNQVggc3RhY2s6CisgICAgICoKKyMgZmluZCAvc3lzL2tlcm5lbC9kZWJ1Zy93aW1heFw6d214MCAtbmFtZSBcKmRsX1wqCisvc3lzL2tlcm5lbC9kZWJ1Zy93aW1heDp3bXgwL3dpbWF4X2RsX3N0YWNrCisvc3lzL2tlcm5lbC9kZWJ1Zy93aW1heDp3bXgwL3dpbWF4X2RsX29wX3Jma2lsbAorL3N5cy9rZXJuZWwvZGVidWcvd2ltYXg6d214MC93aW1heF9kbF9vcF9yZXNldAorL3N5cy9rZXJuZWwvZGVidWcvd2ltYXg6d214MC93aW1heF9kbF9vcF9tc2cKKy9zeXMva2VybmVsL2RlYnVnL3dpbWF4OndteDAvd2ltYXhfZGxfaWRfdGFibGUKKy9zeXMva2VybmVsL2RlYnVnL3dpbWF4OndteDAvd2ltYXhfZGxfZGVidWdmcworL3N5cy9rZXJuZWwvZGVidWcvd2ltYXg6d214MC8uLi4uICMgb3RoZXIgZHJpdmVyIHNwZWNpZmljIGZpbGVzCisKKyAgICAgICBOT1RFOiBPZiBjb3Vyc2UsIGlmIGRlYnVnZnMgaXMgbW91bnRlZCBpbiBhIGRpcmVjdG9yeSBvdGhlciB0aGFuCisgICAgICAgL3N5cy9rZXJuZWwvZGVidWcsIHRob3NlIHBhdGhzIHdpbGwgY2hhbmdlLgorCisgICBCeSByZWFkaW5nIHRoZSBmaWxlIHlvdSBjYW4gb2J0YWluIHRoZSBjdXJyZW50IHZhbHVlIG9mIHNhaWQgZGVidWcKKyAgIGxldmVsOyBieSB3cml0aW5nIHRvIGl0LCB5b3UgY2FuIHNldCBpdC4KKworICAgVG8gaW5jcmVhc2UgdGhlIGRlYnVnIGxldmVsIG9mLCBmb3IgZXhhbXBsZSwgdGhlIGlkLXRhYmxlIHN1Ym1vZHVsZSwKKyAgIGp1c3Qgd3JpdGU6CisKKyQgZWNobyAzID4gL3N5cy9rZXJuZWwvZGVidWcvd2ltYXg6d214MC93aW1heF9kbF9pZF90YWJsZQorCisgICBJbmNyZWFzaW5nIG51bWJlcnMgeWllbGQgaW5jcmVhc2luZyBkZWJ1ZyBpbmZvcm1hdGlvbjsgZm9yIGRldGFpbHMgb2YKKyAgIHdoYXQgaXMgcHJpbnRlZCBhbmQgdGhlIGF2YWlsYWJsZSBsZXZlbHMsIGNoZWNrIHRoZSBzb3VyY2UuIFRoZSBjb2RlCisgICB1c2VzIDAgZm9yIGRpc2FibGVkIGFuZCBpbmNyZWFzaW5nIHZhbHVlcyB1bnRpbCA4LgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi94ODYvemVyby1wYWdlLnR4dCBiL0RvY3VtZW50YXRpb24veDg2L3plcm8tcGFnZS50eHQKaW5kZXggMTY5YWQ0Mi4uNGY5MTM4NSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi94ODYvemVyby1wYWdlLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3g4Ni96ZXJvLXBhZ2UudHh0CkBAIC0zLDcgKzMsNyBAQAogcmVhbC1tb2RlIHNldHVwIGNvZGUgb2YgdGhlIGtlcm5lbC4gUmVmZXJlbmNlcy9zZXR0aW5ncyB0byBpdCBtYWlubHkKIGFyZSBpbjoKIAotICBpbmNsdWRlL2FzbS14ODYvYm9vdHBhcmFtLmgKKyAgYXJjaC94ODYvaW5jbHVkZS9hc20vYm9vdHBhcmFtLmgKIAogCiBPZmZzZXQJUHJvdG8JTmFtZQkJTWVhbmluZwpkaWZmIC0tZ2l0IGEvTUFJTlRBSU5FUlMgYi9NQUlOVEFJTkVSUwppbmRleCBiZWZhY2YwLi41N2UwMzA5IDEwMDY0NAotLS0gYS9NQUlOVEFJTkVSUworKysgYi9NQUlOVEFJTkVSUwpAQCAtNjE2LDcgKzYxNiw3IEBACiBTOglNYWludGFpbmVkCiAKIEFSTS9UT1NBIE1BQ0hJTkUgU1VQUE9SVAotUDoJRG1pdHJ5IEJhcnlzaGtvdgorUDoJRG1pdHJ5IEVyZW1pbi1Tb2xlbmlrb3YKIE06CWRiYXJ5c2hrb3ZAZ21haWwuY29tCiBQOglEaXJrIE9wZmVyCiBNOglkaXJrQG9wZmVyLW9ubGluZS5kZQpAQCAtMTAyNCwxNiArMTAyNCwxNyBAQAogQlRUViBWSURFTzRMSU5VWCBEUklWRVIKIFA6CU1hdXJvIENhcnZhbGhvIENoZWhhYgogTToJbWNoZWhhYkBpbmZyYWRlYWQub3JnCi1NOgl2NGwtZHZiLW1haW50YWluZXJAbGludXh0di5vcmcKK0w6CWxpbnV4LW1lZGlhQHZnZXIua2VybmVsLm9yZwogTDoJdmlkZW80bGludXgtbGlzdEByZWRoYXQuY29tCiBXOglodHRwOi8vbGludXh0di5vcmcKLVQ6CWdpdCBrZXJuZWwub3JnOi9wdWIvc2NtL2xpbnV4L2tlcm5lbC9naXQvbWNoZWhhYi92NGwtZHZiLmdpdAorVDoJZ2l0IGtlcm5lbC5vcmc6L3B1Yi9zY20vbGludXgva2VybmVsL2dpdC9tY2hlaGFiL2xpbnV4LTIuNi5naXQKIFM6CU1haW50YWluZWQKIAogQ0FGRSBDTU9TIElOVEVHUkFURUQgQ0FNRVJBIENPTlRST0xMRVIgRFJJVkVSCiBQOglKb25hdGhhbiBDb3JiZXQKIE06CWNvcmJldEBsd24ubmV0Ci1MOgl2aWRlbzRsaW51eC1saXN0QHJlZGhhdC5jb20KK0w6CWxpbnV4LW1lZGlhQHZnZXIua2VybmVsLm9yZworVDoJZ2l0IGtlcm5lbC5vcmc6L3B1Yi9zY20vbGludXgva2VybmVsL2dpdC9tY2hlaGFiL2xpbnV4LTIuNi5naXQKIFM6CU1haW50YWluZWQKIAogQ0FMR0FSWSB4ODYtNjQgSU9NTVUKQEAgLTEwOTIsMTEgKzEwOTMsOCBAQAogCiBDSEVDS1BBVENICiBQOglBbmR5IFdoaXRjcm9mdAotTToJYXB3QHNoYWRvd2VuLm9yZwotUDoJUmFuZHkgRHVubGFwCi1NOglyZHVubGFwQHhlbm90aW1lLm5ldAotUDoJSm9lbCBTY2hvcHAKLU06CWpzY2hvcHBAYXVzdGluLmlibS5jb20KK006CWFwd0BjYW5vbmljYWwuY29tCitMOglsaW51eC1rZXJuZWxAdmdlci5rZXJuZWwub3JnCiBTOglTdXBwb3J0ZWQKIAogQ0lTQ08gMTBHIEVUSEVSTkVUIERSSVZFUgpAQCAtMTI2NCw3ICsxMjYyLDggQEAKIE06CWh2ZXJrdWlsQHhzNGFsbC5ubCwgYXdhbGxzQHJhZGl4Lm5ldAogTDoJaXZ0di1kZXZlbEBpdnR2ZHJpdmVyLm9yZwogTDoJaXZ0di11c2Vyc0BpdnR2ZHJpdmVyLm9yZwotTDoJdmlkZW80bGludXgtbGlzdEByZWRoYXQuY29tCitMOglsaW51eC1tZWRpYUB2Z2VyLmtlcm5lbC5vcmcKK1Q6CWdpdCBrZXJuZWwub3JnOi9wdWIvc2NtL2xpbnV4L2tlcm5lbC9naXQvbWNoZWhhYi9saW51eC0yLjYuZ2l0CiBXOglodHRwOi8vbGludXh0di5vcmcKIFM6CU1haW50YWluZWQKIApAQCAtMTM2MSw2ICsxMzYwLDExIEBACiBNOgltYWNyb0BsaW51eC1taXBzLm9yZwogUzoJTWFpbnRhaW5lZAogCitERUxMIExBUFRPUCBEUklWRVIKK1A6CU1hdHRoZXcgR2FycmV0dAorTToJbWpnNTlAc3JjZi51Y2FtLm9yZworUzoJTWFpbnRhaW5lZAorCiBERUxMIExBUFRPUCBTTU0gRFJJVkVSCiBQOglNYXNzaW1vIERhbCBab3R0bwogTToJZHpAZGViaWFuLm9yZwpAQCAtMTQ5MCwxMCArMTQ5NCwxMCBAQAogCiBEVkIgU1VCU1lTVEVNIEFORCBEUklWRVJTCiBQOglMaW51eFRWLm9yZyBQcm9qZWN0Ci1NOgl2NGwtZHZiLW1haW50YWluZXJAbGludXh0di5vcmcKK006CWxpbnV4LW1lZGlhQHZnZXIua2VybmVsLm9yZwogTDoJbGludXgtZHZiQGxpbnV4dHYub3JnIChzdWJzY3JpcHRpb24gcmVxdWlyZWQpCiBXOglodHRwOi8vbGludXh0di5vcmcvCi1UOglnaXQga2VybmVsLm9yZzovcHViL3NjbS9saW51eC9rZXJuZWwvZ2l0L21jaGVoYWIvdjRsLWR2Yi5naXQKK1Q6CWdpdCBrZXJuZWwub3JnOi9wdWIvc2NtL2xpbnV4L2tlcm5lbC9naXQvbWNoZWhhYi9saW51eC0yLjYuZ2l0CiBTOglNYWludGFpbmVkCiAKIERaIERFQ1NUQVRJT04gRFoxMSBTRVJJQUwgRFJJVkVSCkBAIC0xODg1LDMyICsxODg5LDM3IEBACiBHU1BDQSBGSU5FUElYIFNVQkRSSVZFUgogUDoJRnJhbmsgWmFnbwogTToJZnJhbmtAemFnby5uZXQKLUw6CXZpZGVvNGxpbnV4LWxpc3RAcmVkaGF0LmNvbQorTDoJbGludXgtbWVkaWFAdmdlci5rZXJuZWwub3JnCitUOglnaXQga2VybmVsLm9yZzovcHViL3NjbS9saW51eC9rZXJuZWwvZ2l0L21jaGVoYWIvbGludXgtMi42LmdpdAogUzoJTWFpbnRhaW5lZAogCiBHU1BDQSBNNTYwMiBTVUJEUklWRVIKIFA6CUVyaWsgQW5kcmVuCiBNOgllcmlrLmFuZHJlbkBnbWFpbC5jb20KLUw6CXZpZGVvNGxpbnV4LWxpc3RAcmVkaGF0LmNvbQorTDoJbGludXgtbWVkaWFAdmdlci5rZXJuZWwub3JnCitUOglnaXQga2VybmVsLm9yZzovcHViL3NjbS9saW51eC9rZXJuZWwvZ2l0L21jaGVoYWIvbGludXgtMi42LmdpdAogUzoJTWFpbnRhaW5lZAogCiBHU1BDQSBQQUMyMDcgU09OSVhCIFNVQkRSSVZFUgogUDoJSGFucyBkZSBHb2VkZQogTToJaGRlZ29lZGVAcmVkaGF0LmNvbQotTDoJdmlkZW80bGludXgtbGlzdEByZWRoYXQuY29tCitMOglsaW51eC1tZWRpYUB2Z2VyLmtlcm5lbC5vcmcKK1Q6CWdpdCBrZXJuZWwub3JnOi9wdWIvc2NtL2xpbnV4L2tlcm5lbC9naXQvbWNoZWhhYi9saW51eC0yLjYuZ2l0CiBTOglNYWludGFpbmVkCiAKIEdTUENBIFQ2MTMgU1VCRFJJVkVSCiBQOglMZWFuZHJvIENvc3RhbnRpbm8KIE06CWxjb3N0YW50aW5vQGdtYWlsLmNvbQotTDoJdmlkZW80bGludXgtbGlzdEByZWRoYXQuY29tCitMOglsaW51eC1tZWRpYUB2Z2VyLmtlcm5lbC5vcmcKK1Q6CWdpdCBrZXJuZWwub3JnOi9wdWIvc2NtL2xpbnV4L2tlcm5lbC9naXQvbWNoZWhhYi9saW51eC0yLjYuZ2l0CiBTOglNYWludGFpbmVkCiAKIEdTUENBIFVTQiBXRUJDQU0gRFJJVkVSCiBQOglKZWFuLUZyYW5jb2lzIE1vaW5lCiBNOgltb2luZWpmQGZyZWUuZnIKIFc6CWh0dHA6Ly9tb2luZWpmLmZyZWUuZnIKLUw6CXZpZGVvNGxpbnV4LWxpc3RAcmVkaGF0LmNvbQorTDoJbGludXgtbWVkaWFAdmdlci5rZXJuZWwub3JnCitUOglnaXQga2VybmVsLm9yZzovcHViL3NjbS9saW51eC9rZXJuZWwvZ2l0L21jaGVoYWIvbGludXgtMi42LmdpdAogUzoJTWFpbnRhaW5lZAogCiBIQVJEV0FSRSBNT05JVE9SSU5HCkBAIC0yMzA4LDYgKzIzMTcsMTQgQEAKIFc6CWh0dHA6Ly9pcHcyMjAwLnNvdXJjZWZvcmdlLm5ldAogUzoJU3VwcG9ydGVkCiAKK0lOVEVMIFdJUkVMRVNTIFdJTUFYIENPTk5FQ1RJT04gMjQwMAorUDoJSW5ha3kgUGVyZXotR29uemFsZXoKK006CWluYWt5LnBlcmV6LWdvbnphbGV6QGludGVsLmNvbQorTToJbGludXgtd2ltYXhAaW50ZWwuY29tCitMOgl3aW1heEBsaW51eHdpbWF4Lm9yZworUzoJU3VwcG9ydGVkCitXOglodHRwOi8vbGludXh3aW1heC5vcmcKKwogSU5URUwgV0lSRUxFU1MgV0lGSSBMSU5LIChpd2x3aWZpKQogUDoJWmh1IFlpCiBNOgl5aS56aHVAaW50ZWwuY29tCkBAIC0yNDMyLDcgKzI0NDksOCBAQAogTToJaHZlcmt1aWxAeHM0YWxsLm5sCiBMOglpdnR2LWRldmVsQGl2dHZkcml2ZXIub3JnCiBMOglpdnR2LXVzZXJzQGl2dHZkcml2ZXIub3JnCi1MOgl2aWRlbzRsaW51eC1saXN0QHJlZGhhdC5jb20KK0w6CWxpbnV4LW1lZGlhQHZnZXIua2VybmVsLm9yZworVDoJZ2l0IGtlcm5lbC5vcmc6L3B1Yi9zY20vbGludXgva2VybmVsL2dpdC9tY2hlaGFiL2xpbnV4LTIuNi5naXQKIFc6CWh0dHA6Ly93d3cuaXZ0dmRyaXZlci5vcmcKIFM6CU1haW50YWluZWQKIApAQCAtMjk4NSw2ICszMDAzLDcgQEAKIFA6CUZlbGlwZSBCYWxiaQogTToJZmVsaXBlLmJhbGJpQG5va2lhLmNvbQogTDoJbGludXgtdXNiQHZnZXIua2VybmVsLm9yZworVDoJZ2l0IGdpdG9yaW91cy5vcmc6L211c2IvbWFpbmxpbmUuZ2l0CiBTOglNYWludGFpbmVkCiAKIE1ZUklDT00gTVlSSS0xMEcgMTBHYkUgRFJJVkVSIChNWVJJMTBHRSkKQEAgLTMxOTEsNyArMzIxMCw4IEBACiBPTU5JVklTSU9OIE9WNzY3MCBTRU5TT1IgRFJJVkVSCiBQOglKb25hdGhhbiBDb3JiZXQKIE06CWNvcmJldEBsd24ubmV0Ci1MOgl2aWRlbzRsaW51eC1saXN0QHJlZGhhdC5jb20KK0w6CWxpbnV4LW1lZGlhQHZnZXIua2VybmVsLm9yZworVDoJZ2l0IGtlcm5lbC5vcmc6L3B1Yi9zY20vbGludXgva2VybmVsL2dpdC9tY2hlaGFiL2xpbnV4LTIuNi5naXQKIFM6CU1haW50YWluZWQKIAogT05FTkFORCBGTEFTSCBEUklWRVIKQEAgLTM0NjksMTIgKzM0ODksMTkgQEAKIEw6CWNiZS1vc3MtZGV2QG96bGFicy5vcmcKIFM6CVN1cHBvcnRlZAogCitQUzNWUkFNIERSSVZFUgorUDoJSmltIFBhcmlzCitNOglqaW1AanRhbi5jb20KK0w6CWNiZS1vc3MtZGV2QG96bGFicy5vcmcKK1M6CU1haW50YWluZWQKKwogUFZSVVNCMiBWSURFTzRMSU5VWCBEUklWRVIKIFA6CU1pa2UgSXNlbHkKIE06CWlzZWx5QHBvYm94LmNvbQogTDoJcHZydXNiMkBpc2VseS5uZXQJKHN1YnNjcmliZXJzLW9ubHkpCi1MOgl2aWRlbzRsaW51eC1saXN0QHJlZGhhdC5jb20KK0w6CWxpbnV4LW1lZGlhQHZnZXIua2VybmVsLm9yZwogVzoJaHR0cDovL3d3dy5pc2VseS5uZXQvcHZydXNiMi8KK1Q6CWdpdCBrZXJuZWwub3JnOi9wdWIvc2NtL2xpbnV4L2tlcm5lbC9naXQvbWNoZWhhYi9saW51eC0yLjYuZ2l0CiBTOglNYWludGFpbmVkCiAKIFBYQTJ4eC9QWEEzeHggU1VQUE9SVApAQCAtMzY5NCw2ICszNzIxLDggQEAKIFNBQTcxNDYgVklERU80TElOVVgtMiBEUklWRVIKIFA6CU1pY2hhZWwgSHVub2xkCiBNOgltaWNoYWVsQG1paHUuZGUKK0w6CWxpbnV4LW1lZGlhQHZnZXIua2VybmVsLm9yZworVDoJZ2l0IGtlcm5lbC5vcmc6L3B1Yi9zY20vbGludXgva2VybmVsL2dpdC9tY2hlaGFiL2xpbnV4LTIuNi5naXQKIFc6CWh0dHA6Ly93d3cubWlodS5kZS9saW51eC9zYWE3MTQ2CiBTOglNYWludGFpbmVkCiAKQEAgLTM5NTcsNyArMzk4Niw4IEBACiBTT0MtQ0FNRVJBIFY0TDIgU1VCU1lTVEVNCiBQOglHdWVubmFkaSBMaWFraG92ZXRza2kKIE06CWcubGlha2hvdmV0c2tpQGdteC5kZQotTDoJdmlkZW80bGludXgtbGlzdEByZWRoYXQuY29tCitMOglsaW51eC1tZWRpYUB2Z2VyLmtlcm5lbC5vcmcKK1Q6CWdpdCBrZXJuZWwub3JnOi9wdWIvc2NtL2xpbnV4L2tlcm5lbC9naXQvbWNoZWhhYi9saW51eC0yLjYuZ2l0CiBTOglNYWludGFpbmVkCiAKIFNPRUtSSVMgTkVUNDhYWCBMRUQgU1VQUE9SVApAQCAtNDAxNSwxMCArNDA0NSwxMiBAQAogVzoJaHR0cDovL2Fsc2EtcHJvamVjdC5vcmcvbWFpbi9pbmRleC5waHAvQVNvQwogUzoJU3VwcG9ydGVkCiAKLVNQQVJDIChzcGFyYzMyKQotUDoJV2lsbGlhbSBMLiBJcndpbgotTToJd2xpQGhvbG9tb3JwaHkuY29tCitTUEFSQyArIFVsdHJhU1BBUkMgKHNwYXJjL3NwYXJjNjQpCitQOglEYXZpZCBTLiBNaWxsZXIKK006CWRhdmVtQGRhdmVtbG9mdC5uZXQKIEw6CXNwYXJjbGludXhAdmdlci5rZXJuZWwub3JnCitUOglnaXQga2VybmVsLm9yZzovcHViL3NjbS9saW51eC9rZXJuZWwvZ2l0L2RhdmVtL3NwYXJjLTIuNi5naXQKK1Q6CWdpdCBrZXJuZWwub3JnOi9wdWIvc2NtL2xpbnV4L2tlcm5lbC9naXQvZGF2ZW0vc3BhcmMtbmV4dC0yLjYuZ2l0CiBTOglNYWludGFpbmVkCiAKIFNQRUNJQUxJWCBJTzgrIE1VTFRJUE9SVCBTRVJJQUwgQ0FSRCBEUklWRVIKQEAgLTQyMzAsOSArNDI2MiwxMCBAQAogUzoJTWFpbnRhaW5lZAogCiBUUklWSUFMIFBBVENIRVMKLVA6CUplc3BlciBKdWhsCitQOglKaXJpIEtvc2luYQogTToJdHJpdmlhbEBrZXJuZWwub3JnCiBMOglsaW51eC1rZXJuZWxAdmdlci5rZXJuZWwub3JnCitUOglnaXQga2VybmVsLm9yZzovcHViL3NjbS9saW51eC9rZXJuZWwvZ2l0L2ppa29zL3RyaXZpYWwuZ2l0CiBTOglNYWludGFpbmVkCiAKIFRUWSBMQVlFUgpAQCAtNDMwMiwxMyArNDMzNSw2IEBACiBMOglsaW51eC1rZXJuZWxAdmdlci5rZXJuZWwub3JnCiBTOglNYWludGFpbmVkCiAKLVVsdHJhU1BBUkMgKHNwYXJjNjQpCi1QOglEYXZpZCBTLiBNaWxsZXIKLU06CWRhdmVtQGRhdmVtbG9mdC5uZXQKLUw6CXNwYXJjbGludXhAdmdlci5rZXJuZWwub3JnCi1UOglnaXQga2VybmVsLm9yZzovcHViL3NjbS9saW51eC9rZXJuZWwvZ2l0L2RhdmVtL3NwYXJjLTIuNi5naXQKLVM6CU1haW50YWluZWQKLQogVUxUUkEtV0lERUJBTkQgKFVXQikgU1VCU1lTVEVNOgogUDoJRGF2aWQgVnJhYmVsCiBNOglkYXZpZC52cmFiZWxAY3NyLmNvbQpAQCAtNDM4MCw3ICs0NDA2LDggQEAKIFA6CUx1Y2EgUmlzb2xpYQogTToJbHVjYS5yaXNvbGlhQHN0dWRpby51bmliby5pdAogTDoJbGludXgtdXNiQHZnZXIua2VybmVsLm9yZwotTDoJdmlkZW80bGludXgtbGlzdEByZWRoYXQuY29tCitMOglsaW51eC1tZWRpYUB2Z2VyLmtlcm5lbC5vcmcKK1Q6CWdpdCBrZXJuZWwub3JnOi9wdWIvc2NtL2xpbnV4L2tlcm5lbC9naXQvbWNoZWhhYi9saW51eC0yLjYuZ2l0CiBXOglodHRwOi8vd3d3LmxpbnV4LXByb2plY3RzLm9yZwogUzoJTWFpbnRhaW5lZAogCkBAIC00NTI5LDcgKzQ1NTYsOCBAQAogUDoJTHVjYSBSaXNvbGlhCiBNOglsdWNhLnJpc29saWFAc3R1ZGlvLnVuaWJvLml0CiBMOglsaW51eC11c2JAdmdlci5rZXJuZWwub3JnCi1MOgl2aWRlbzRsaW51eC1saXN0QHJlZGhhdC5jb20KK0w6CWxpbnV4LW1lZGlhQHZnZXIua2VybmVsLm9yZworVDoJZ2l0IGtlcm5lbC5vcmc6L3B1Yi9zY20vbGludXgva2VybmVsL2dpdC9tY2hlaGFiL2xpbnV4LTIuNi5naXQKIFc6CWh0dHA6Ly93d3cubGludXgtcHJvamVjdHMub3JnCiBTOglNYWludGFpbmVkCiAKQEAgLTQ1NTgsNyArNDU4Niw4IEBACiBQOglMYXVyZW50IFBpbmNoYXJ0CiBNOglsYXVyZW50LnBpbmNoYXJ0QHNreW5ldC5iZQogTDoJbGludXgtdXZjLWRldmVsQGxpc3RzLmJlcmxpb3MuZGUgKHN1YnNjcmliZXJzLW9ubHkpCi1MOgl2aWRlbzRsaW51eC1saXN0QHJlZGhhdC5jb20KK0w6CWxpbnV4LW1lZGlhQHZnZXIua2VybmVsLm9yZworVDoJZ2l0IGtlcm5lbC5vcmc6L3B1Yi9zY20vbGludXgva2VybmVsL2dpdC9tY2hlaGFiL2xpbnV4LTIuNi5naXQKIFc6CWh0dHA6Ly9saW51eC11dmMuYmVybGlvcy5kZQogUzoJTWFpbnRhaW5lZAogCkBAIC00NTY2LDcgKzQ1OTUsOCBAQAogUDoJTHVjYSBSaXNvbGlhCiBNOglsdWNhLnJpc29saWFAc3R1ZGlvLnVuaWJvLml0CiBMOglsaW51eC11c2JAdmdlci5rZXJuZWwub3JnCi1MOgl2aWRlbzRsaW51eC1saXN0QHJlZGhhdC5jb20KK0w6CWxpbnV4LW1lZGlhQHZnZXIua2VybmVsLm9yZworVDoJZ2l0IGtlcm5lbC5vcmc6L3B1Yi9zY20vbGludXgva2VybmVsL2dpdC9tY2hlaGFiL2xpbnV4LTIuNi5naXQKIFc6CWh0dHA6Ly93d3cubGludXgtcHJvamVjdHMub3JnCiBTOglNYWludGFpbmVkCiAKQEAgLTQ1ODAsNyArNDYxMCw4IEBACiBQOglMdWNhIFJpc29saWEKIE06CWx1Y2Eucmlzb2xpYUBzdHVkaW8udW5pYm8uaXQKIEw6CWxpbnV4LXVzYkB2Z2VyLmtlcm5lbC5vcmcKLUw6CXZpZGVvNGxpbnV4LWxpc3RAcmVkaGF0LmNvbQorTDoJbGludXgtbWVkaWFAdmdlci5rZXJuZWwub3JnCitUOglnaXQga2VybmVsLm9yZzovcHViL3NjbS9saW51eC9rZXJuZWwvZ2l0L21jaGVoYWIvbGludXgtMi42LmdpdAogVzoJaHR0cDovL3d3dy5saW51eC1wcm9qZWN0cy5vcmcKIFM6CU1haW50YWluZWQKIApAQCAtNDU5NSw3ICs0NjI2LDggQEAKIFA6CUFudG9pbmUgSmFjcXVldAogTToJcm95YWxlQHplcmV6by5jb20KIEw6CWxpbnV4LXVzYkB2Z2VyLmtlcm5lbC5vcmcKLUw6CXZpZGVvNGxpbnV4LWxpc3RAcmVkaGF0LmNvbQorTDoJbGludXgtbWVkaWFAdmdlci5rZXJuZWwub3JnCitUOglnaXQga2VybmVsLm9yZzovcHViL3NjbS9saW51eC9rZXJuZWwvZ2l0L21jaGVoYWIvbGludXgtMi42LmdpdAogVzoJaHR0cDovL3JveWFsZS56ZXJlem8uY29tL3pyMzY0eHgvCiBTOglNYWludGFpbmVkCiAKQEAgLTQ2NjQsMTAgKzQ2OTYsMTAgQEAKIFZJREVPIEZPUiBMSU5VWCAoVjRMKQogUDoJTWF1cm8gQ2FydmFsaG8gQ2hlaGFiCiBNOgltY2hlaGFiQGluZnJhZGVhZC5vcmcKLU06CXY0bC1kdmItbWFpbnRhaW5lckBsaW51eHR2Lm9yZworTDoJbGludXgtbWVkaWFAdmdlci5rZXJuZWwub3JnCiBMOgl2aWRlbzRsaW51eC1saXN0QHJlZGhhdC5jb20KIFc6CWh0dHA6Ly9saW51eHR2Lm9yZwotVDoJZ2l0IGtlcm5lbC5vcmc6L3B1Yi9zY20vbGludXgva2VybmVsL2dpdC9tY2hlaGFiL3Y0bC1kdmIuZ2l0CitUOglnaXQga2VybmVsLm9yZzovcHViL3NjbS9saW51eC9rZXJuZWwvZ2l0L21jaGVoYWIvbGludXgtMi42LmdpdAogUzoJTWFpbnRhaW5lZAogCiBWTEFOICg4MDIuMVEpCkBAIC00NzQwLDYgKzQ3NzIsMTQgQEAKIEw6CWxpbnV4LXNjc2lAdmdlci5rZXJuZWwub3JnCiBTOglNYWludGFpbmVkCiAKK1dJTUFYIFNUQUNLCitQOglJbmFreSBQZXJlei1Hb256YWxlegorTToJaW5ha3kucGVyZXotZ29uemFsZXpAaW50ZWwuY29tCitNOglsaW51eC13aW1heEBpbnRlbC5jb20KK0w6CXdpbWF4QGxpbnV4d2ltYXgub3JnCitTOglTdXBwb3J0ZWQKK1c6CWh0dHA6Ly9saW51eHdpbWF4Lm9yZworCiBXSU1FRElBIExMQyBQUk9UT0NPTCAoV0xQKSBTVUJTWVNURU0KIFA6CURhdmlkIFZyYWJlbAogTToJZGF2aWQudnJhYmVsQGNzci5jb20KZGlmZiAtLWdpdCBhL01ha2VmaWxlIGIvTWFrZWZpbGUKaW5kZXggZjkwMDY2Ni4uMjgzMzEyOCAxMDA2NDQKLS0tIGEvTWFrZWZpbGUKKysrIGIvTWFrZWZpbGUKQEAgLTk2NSw2ICs5NjUsNyBAQAogCSAgICBta2RpciAtcCBpbmNsdWRlMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAJICAgIGxuIC1mc24gJChzcmN0cmVlKS9pbmNsdWRlL2FzbS0kKFNSQ0FSQ0gpIGluY2x1ZGUyL2FzbTsgICAgIFwKIAlmaQorCWxuIC1mc24gJChzcmN0cmVlKSBzb3VyY2UKIGVuZGlmCiAKICMgcHJlcGFyZTIgY3JlYXRlcyBhIG1ha2VmaWxlIGlmIHVzaW5nIGEgc2VwYXJhdGUgb3V0cHV0IGRpcmVjdG9yeQpAQCAtMTAwOCw3ICsxMDA5LDcgQEAKIGVuZGVmCiAKICMgV2UgY3JlYXRlIHRoZSB0YXJnZXQgZGlyZWN0b3J5IG9mIHRoZSBzeW1saW5rIGlmIGl0IGRvZXMKLSMgbm90IGV4aXN0IHNvIHRoZSB0ZXN0IGluIGNoYWNrLXN5bWxpbmsgd29ya3MgYW5kIHdlIGhhdmUgYQorIyBub3QgZXhpc3Qgc28gdGhlIHRlc3QgaW4gY2hlY2stc3ltbGluayB3b3JrcyBhbmQgd2UgaGF2ZSBhCiAjIGRpcmVjdG9yeSBmb3IgZ2VuZXJhdGVkIGZpbGVzYXMgdXNlZCBieSBzb21lIGFyY2hpdGVjdHVyZXMuCiBkZWZpbmUgY3JlYXRlLXN5bWxpbmsKIAlpZiBbICEgLUwgaW5jbHVkZS9hc20gXTsgdGhlbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXApkaWZmIC0tZ2l0IGEvYXJjaC9hbHBoYS9pbmNsdWRlL2FzbS9LYnVpbGQgYi9hcmNoL2FscGhhL2luY2x1ZGUvYXNtL0tidWlsZAppbmRleCBiN2M4ZjE4Li40ZGFkMjczIDEwMDY0NAotLS0gYS9hcmNoL2FscGhhL2luY2x1ZGUvYXNtL0tidWlsZAorKysgYi9hcmNoL2FscGhhL2luY2x1ZGUvYXNtL0tidWlsZApAQCAtOSwzICs5LDQgQEAKIHVuaWZkZWYteSArPSBmcHUuaAogdW5pZmRlZi15ICs9IHN5c2luZm8uaAogdW5pZmRlZi15ICs9IGNvbXBpbGVyLmgKK3VuaWZkZWYteSArPSBzd2FiLmgKZGlmZiAtLWdpdCBhL2FyY2gvYWxwaGEvaW5jbHVkZS9hc20vYXRvbWljLmggYi9hcmNoL2FscGhhL2luY2x1ZGUvYXNtL2F0b21pYy5oCmluZGV4IGNhODhlNTQuLjYyYjM2MzUgMTAwNjQ0Ci0tLSBhL2FyY2gvYWxwaGEvaW5jbHVkZS9hc20vYXRvbWljLmgKKysrIGIvYXJjaC9hbHBoYS9pbmNsdWRlL2FzbS9hdG9taWMuaApAQCAtMSw2ICsxLDcgQEAKICNpZm5kZWYgX0FMUEhBX0FUT01JQ19ICiAjZGVmaW5lIF9BTFBIQV9BVE9NSUNfSAogCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vYmFycmllci5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KIApAQCAtMTMsMTQgKzE0LDYgQEAKICAqLwogCiAKLS8qCi0gKiBDb3VudGVyIGlzIHZvbGF0aWxlIHRvIG1ha2Ugc3VyZSBnY2MgZG9lc24ndCB0cnkgdG8gYmUgY2xldmVyCi0gKiBhbmQgbW92ZSB0aGluZ3MgYXJvdW5kIG9uIHVzLiBXZSBuZWVkIHRvIHVzZSBfZXhhY3RseV8gdGhlIGFkZHJlc3MKLSAqIHRoZSB1c2VyIGdhdmUgdXMsIG5vdCBzb21lIGFsaWFzIHRoYXQgY29udGFpbnMgdGhlIHNhbWUgaW5mb3JtYXRpb24uCi0gKi8KLXR5cGVkZWYgc3RydWN0IHsgdm9sYXRpbGUgaW50IGNvdW50ZXI7IH0gYXRvbWljX3Q7Ci10eXBlZGVmIHN0cnVjdCB7IHZvbGF0aWxlIGxvbmcgY291bnRlcjsgfSBhdG9taWM2NF90OwotCiAjZGVmaW5lIEFUT01JQ19JTklUKGkpCQkoIChhdG9taWNfdCkgeyAoaSkgfSApCiAjZGVmaW5lIEFUT01JQzY0X0lOSVQoaSkJKCAoYXRvbWljNjRfdCkgeyAoaSkgfSApCiAKZGlmZiAtLWdpdCBhL2FyY2gvYWxwaGEvaW5jbHVkZS9hc20vYnl0ZW9yZGVyLmggYi9hcmNoL2FscGhhL2luY2x1ZGUvYXNtL2J5dGVvcmRlci5oCmluZGV4IDU4ZTk1OGYuLjY3NzJmMzEgMTAwNjQ0Ci0tLSBhL2FyY2gvYWxwaGEvaW5jbHVkZS9hc20vYnl0ZW9yZGVyLmgKKysrIGIvYXJjaC9hbHBoYS9pbmNsdWRlL2FzbS9ieXRlb3JkZXIuaApAQCAtMSw0NyArMSw3IEBACiAjaWZuZGVmIF9BTFBIQV9CWVRFT1JERVJfSAogI2RlZmluZSBfQUxQSEFfQllURU9SREVSX0gKIAotI2luY2x1ZGUgPGFzbS90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+Ci0jaW5jbHVkZSA8YXNtL2NvbXBpbGVyLmg+Ci0KLSNpZmRlZiBfX0dOVUNfXwotCi1zdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX2NvbnN0X18gX191MzIgX19hcmNoX19zd2FiMzIoX191MzIgeCkKLXsKLQkvKgotCSAqIFVuZm9ydHVuYXRlbHksIHdlIGNhbid0IHVzZSB0aGUgNiBpbnN0cnVjdGlvbiBzZXF1ZW5jZQotCSAqIG9uIGV2NiBzaW5jZSB0aGUgbGF0ZW5jeSBvZiB0aGUgVU5QS0JXIGlzIDMsIHdoaWNoIGlzCi0JICogcHJldHR5IGhhcmQgdG8gaGlkZS4gIEp1c3QgaW4gY2FzZSBhIGZ1dHVyZSBpbXBsZW1lbnRhdGlvbgotCSAqIGhhcyBhIGxvd2VyIGxhdGVuY3ksIGhlcmUncyB0aGUgc2VxdWVuY2UgKGFsc28gYnkgTWlrZSBCdXJyb3dzKQotCSAqCi0JICogVU5QS0JXIGEwLCB2MCAgICAgICB2MDogMDBBQTAwQkIwMENDMDBERAotCSAqIFNMTCB2MCwgMjQsIGEwICAgICAgYTA6IEJCMDBDQzAwREQwMDAwMDAKLQkgKiBCSVMgdjAsIGEwLCBhMCAgICAgIGEwOiBCQkFBQ0NCQkREQ0MwMERECi0JICogRVhUV0wgYTAsIDYsIHYwICAgICB2MDogMDAwMDAwMDAwMDAwQkJBQQotCSAqIFpBUCBhMCwgMHhmMywgYTAgICAgYTA6IDAwMDAwMDAwRERDQzAwMDAKLQkgKiBBRERMIGEwLCB2MCwgdjAgICAgIHYwOiBzc3Nzc3Nzc0REQ0NCQkFBCi0JICovCi0KLQlfX3U2NCB0MCwgdDEsIHQyLCB0MzsKLQotCXQwID0gX19rZXJuZWxfaW5zbGgoeCwgNyk7CS8qIHQwIDogMDAwMDAwMDAwMEFBQkJDQyAqLwotCXQxID0gX19rZXJuZWxfaW5zd2woeCwgMyk7CS8qIHQxIDogMDAwMDAwQ0NERDAwMDAwMCAqLwotCXQxIHw9IHQwOwkJCS8qIHQxIDogMDAwMDAwQ0NEREFBQkJDQyAqLwotCXQyID0gdDEgPj4gMTY7CQkJLyogdDIgOiAwMDAwMDAwMDAwQ0NEREFBICovCi0JdDAgPSB0MSAmIDB4RkYwMEZGMDA7CQkvKiB0MCA6IDAwMDAwMDAwREQwMEJCMDAgKi8KLQl0MyA9IHQyICYgMHgwMEZGMDBGRjsJCS8qIHQzIDogMDAwMDAwMDAwMENDMDBBQSAqLwotCXQxID0gdDAgKyB0MzsJCQkvKiB0MSA6IHNzc3Nzc3NzRERDQ0JCQUEgKi8KLQotCXJldHVybiB0MTsKLX0KLQotI2RlZmluZSBfX2FyY2hfX3N3YWIzMiBfX2FyY2hfX3N3YWIzMgotCi0jZW5kaWYgLyogX19HTlVDX18gKi8KLQotI2RlZmluZSBfX0JZVEVPUkRFUl9IQVNfVTY0X18KLQorI2luY2x1ZGUgPGFzbS9zd2FiLmg+CiAjaW5jbHVkZSA8bGludXgvYnl0ZW9yZGVyL2xpdHRsZV9lbmRpYW4uaD4KIAogI2VuZGlmIC8qIF9BTFBIQV9CWVRFT1JERVJfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hbHBoYS9pbmNsdWRlL2FzbS9zd2FiLmggYi9hcmNoL2FscGhhL2luY2x1ZGUvYXNtL3N3YWIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OGU3MDg5Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hbHBoYS9pbmNsdWRlL2FzbS9zd2FiLmgKQEAgLTAsMCArMSw0MiBAQAorI2lmbmRlZiBfQUxQSEFfU1dBQl9ICisjZGVmaW5lIF9BTFBIQV9TV0FCX0gKKworI2luY2x1ZGUgPGFzbS90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CisjaW5jbHVkZSA8YXNtL2NvbXBpbGVyLmg+CisKKyNpZmRlZiBfX0dOVUNfXworCitzdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX2NvbnN0X18gX191MzIgX19hcmNoX3N3YWIzMihfX3UzMiB4KQoreworCS8qCisJICogVW5mb3J0dW5hdGVseSwgd2UgY2FuJ3QgdXNlIHRoZSA2IGluc3RydWN0aW9uIHNlcXVlbmNlCisJICogb24gZXY2IHNpbmNlIHRoZSBsYXRlbmN5IG9mIHRoZSBVTlBLQlcgaXMgMywgd2hpY2ggaXMKKwkgKiBwcmV0dHkgaGFyZCB0byBoaWRlLiAgSnVzdCBpbiBjYXNlIGEgZnV0dXJlIGltcGxlbWVudGF0aW9uCisJICogaGFzIGEgbG93ZXIgbGF0ZW5jeSwgaGVyZSdzIHRoZSBzZXF1ZW5jZSAoYWxzbyBieSBNaWtlIEJ1cnJvd3MpCisJICoKKwkgKiBVTlBLQlcgYTAsIHYwICAgICAgIHYwOiAwMEFBMDBCQjAwQ0MwMERECisJICogU0xMIHYwLCAyNCwgYTAgICAgICBhMDogQkIwMENDMDBERDAwMDAwMAorCSAqIEJJUyB2MCwgYTAsIGEwICAgICAgYTA6IEJCQUFDQ0JCRERDQzAwREQKKwkgKiBFWFRXTCBhMCwgNiwgdjAgICAgIHYwOiAwMDAwMDAwMDAwMDBCQkFBCisJICogWkFQIGEwLCAweGYzLCBhMCAgICBhMDogMDAwMDAwMDBERENDMDAwMAorCSAqIEFEREwgYTAsIHYwLCB2MCAgICAgdjA6IHNzc3Nzc3NzRERDQ0JCQUEKKwkgKi8KKworCV9fdTY0IHQwLCB0MSwgdDIsIHQzOworCisJdDAgPSBfX2tlcm5lbF9pbnNsaCh4LCA3KTsJLyogdDAgOiAwMDAwMDAwMDAwQUFCQkNDICovCisJdDEgPSBfX2tlcm5lbF9pbnN3bCh4LCAzKTsJLyogdDEgOiAwMDAwMDBDQ0REMDAwMDAwICovCisJdDEgfD0gdDA7CQkJLyogdDEgOiAwMDAwMDBDQ0REQUFCQkNDICovCisJdDIgPSB0MSA+PiAxNjsJCQkvKiB0MiA6IDAwMDAwMDAwMDBDQ0REQUEgKi8KKwl0MCA9IHQxICYgMHhGRjAwRkYwMDsJCS8qIHQwIDogMDAwMDAwMDBERDAwQkIwMCAqLworCXQzID0gdDIgJiAweDAwRkYwMEZGOwkJLyogdDMgOiAwMDAwMDAwMDAwQ0MwMEFBICovCisJdDEgPSB0MCArIHQzOwkJCS8qIHQxIDogc3Nzc3Nzc3NERENDQkJBQSAqLworCisJcmV0dXJuIHQxOworfQorI2RlZmluZSBfX2FyY2hfc3dhYjMyIF9fYXJjaF9zd2FiMzIKKworI2VuZGlmIC8qIF9fR05VQ19fICovCisKKyNlbmRpZiAvKiBfQUxQSEFfU1dBQl9IICovCmRpZmYgLS1naXQgYS9hcmNoL2FscGhhL2tlcm5lbC9wY2kuYyBiL2FyY2gvYWxwaGEva2VybmVsL3BjaS5jCmluZGV4IGZmOGNiNjMuLmEzYjkzODggMTAwNjQ0Ci0tLSBhL2FyY2gvYWxwaGEva2VybmVsL3BjaS5jCisrKyBiL2FyY2gvYWxwaGEva2VybmVsL3BjaS5jCkBAIC0zMjAsMjQgKzMyMCw2IEBACiAJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgUENJX0lOVEVSUlVQVF9MSU5FLCBpcnEpOwogfQogCi0vKiBNb3N0IEFscGhhcyBoYXZlIHN0cmFpZ2h0LWZvcndhcmQgc3dpenpsaW5nIG5lZWRzLiAgKi8KLQotdTggX19pbml0Ci1jb21tb25fc3dpenpsZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCAqcGlucCkKLXsKLQl1OCBwaW4gPSAqcGlucDsKLQotCXdoaWxlIChkZXYtPmJ1cy0+cGFyZW50KSB7Ci0JCXBpbiA9IGJyaWRnZV9zd2l6emxlKHBpbiwgUENJX1NMT1QoZGV2LT5kZXZmbikpOwotCQkvKiBNb3ZlIHVwIHRoZSBjaGFpbiBvZiBicmlkZ2VzLiAqLwotCQlkZXYgPSBkZXYtPmJ1cy0+c2VsZjsKLSAgICAgICAgfQotCSpwaW5wID0gcGluOwotCi0JLyogVGhlIHNsb3QgaXMgdGhlIHNsb3Qgb2YgdGhlIGxhc3QgYnJpZGdlLiAqLwotCXJldHVybiBQQ0lfU0xPVChkZXYtPmRldmZuKTsKLX0KLQogdm9pZAogcGNpYmlvc19yZXNvdXJjZV90b19idXMoc3RydWN0IHBjaV9kZXYgKmRldiwgc3RydWN0IHBjaV9idXNfcmVnaW9uICpyZWdpb24sCiAJCQkgc3RydWN0IHJlc291cmNlICpyZXMpCmRpZmYgLS1naXQgYS9hcmNoL2FscGhhL2tlcm5lbC9wY2lfaW1wbC5oIGIvYXJjaC9hbHBoYS9rZXJuZWwvcGNpX2ltcGwuaAppbmRleCBmOGI3NDk5Li4wMGVkZDA0IDEwMDY0NAotLS0gYS9hcmNoL2FscGhhL2tlcm5lbC9wY2lfaW1wbC5oCisrKyBiL2FyY2gvYWxwaGEva2VybmVsL3BjaV9pbXBsLmgKQEAgLTEwNiwxNiArMTA2LDExIEBACiAgKiAgIFdoZXJlIEEgPSBwaW4gMSwgQiA9IHBpbiAyIGFuZCBzbyBvbiBhbmQgcGluPTAgPSBkZWZhdWx0ID0gQS4KICAqICAgVGh1cywgZWFjaCBzd2l6emxlIGlzICgocGluLTEpICsgKGRldmljZSMtNCkpICUgNAogICoKLSAqICAgVGhlIGZvbGxvd2luZyBjb2RlIHN3aXp6bGVzIGZvciBleGFjdGx5IG9uZSBicmlkZ2UuICBUaGUgcm91dGluZQotICogICBjb21tb25fc3dpenpsZSBiZWxvdyBoYW5kbGVzIG11bHRpcGxlIGJyaWRnZXMuICBCdXQgdGhlcmUgYXJlIGEKLSAqICAgY291cGxlIGJvYXJkcyB0aGF0IGRvIHN0cmFuZ2UgdGhpbmdzLCBzbyB3ZSBkZWZpbmUgdGhpcyBoZXJlLgorICogICBwY2lfc3dpenpsZV9pbnRlcnJ1cHRfcGluKCkgc3dpenpsZXMgZm9yIGV4YWN0bHkgb25lIGJyaWRnZS4gIFRoZSByb3V0aW5lCisgKiAgIHBjaV9jb21tb25fc3dpenpsZSgpIGhhbmRsZXMgbXVsdGlwbGUgYnJpZGdlcy4gIEJ1dCB0aGVyZSBhcmUgYQorICogICBjb3VwbGUgYm9hcmRzIHRoYXQgZG8gc3RyYW5nZSB0aGluZ3MuCiAgKi8KIAotc3RhdGljIGlubGluZSB1OCBicmlkZ2Vfc3dpenpsZSh1OCBwaW4sIHU4IHNsb3QpIAotewotCXJldHVybiAoKChwaW4tMSkgKyBzbG90KSAlIDQpICsgMTsKLX0KLQogCiAvKiBUaGUgZm9sbG93aW5nIG1hY3JvIGlzIHVzZWQgdG8gaW1wbGVtZW50IHRoZSB0YWJsZS1iYXNlZCBpcnEgbWFwcGluZwogICAgZnVuY3Rpb24gZm9yIGFsbCBzaW5nbGUtYnVzIEFscGhhcy4gICovCkBAIC0xODQsNyArMTc5LDcgQEAKIGV4dGVybiB1bnNpZ25lZCBsb25nIGFscGhhX2FncGdhcnRfc2l6ZTsKIAogZXh0ZXJuIHZvaWQgY29tbW9uX2luaXRfcGNpKHZvaWQpOwotZXh0ZXJuIHU4IGNvbW1vbl9zd2l6emxlKHN0cnVjdCBwY2lfZGV2ICosIHU4ICopOworI2RlZmluZSBjb21tb25fc3dpenpsZSBwY2lfY29tbW9uX3N3aXp6bGUKIGV4dGVybiBzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmFsbG9jX3BjaV9jb250cm9sbGVyKHZvaWQpOwogZXh0ZXJuIHN0cnVjdCByZXNvdXJjZSAqYWxsb2NfcmVzb3VyY2Uodm9pZCk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYWxwaGEva2VybmVsL3N5c19kcDI2NC5jIGIvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX2RwMjY0LmMKaW5kZXggYWI0NGMxNi4uOWM5ZDFmZCAxMDA2NDQKLS0tIGEvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX2RwMjY0LmMKKysrIGIvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX2RwMjY0LmMKQEAgLTQ4MSw3ICs0ODEsNyBAQAogCQkJCXNsb3QgPSBQQ0lfU0xPVChkZXYtPmRldmZuKTsKIAkJCQlicmVhazsKIAkJCX0KLQkJCXBpbiA9IGJyaWRnZV9zd2l6emxlKHBpbiwgUENJX1NMT1QoZGV2LT5kZXZmbikpIDsKKwkJCXBpbiA9IHBjaV9zd2l6emxlX2ludGVycnVwdF9waW4oZGV2LCBwaW4pOwogCiAJCQkvKiBNb3ZlIHVwIHRoZSBjaGFpbiBvZiBicmlkZ2VzLiAgKi8KIAkJCWRldiA9IGRldi0+YnVzLT5zZWxmOwpkaWZmIC0tZ2l0IGEvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX2VpZ2VyLmMgYi9hcmNoL2FscGhhL2tlcm5lbC9zeXNfZWlnZXIuYwppbmRleCA3ZWYzYjZmLi5iYWY2MGYzIDEwMDY0NAotLS0gYS9hcmNoL2FscGhhL2tlcm5lbC9zeXNfZWlnZXIuYworKysgYi9hcmNoL2FscGhhL2tlcm5lbC9zeXNfZWlnZXIuYwpAQCAtMjA0LDcgKzIwNCw3IEBACiAJCQlicmVhazsKIAkJfQogCQkvKiBNdXN0IGJlIGEgY2FyZC1iYXNlZCBicmlkZ2UuICAqLwotCQlwaW4gPSBicmlkZ2Vfc3dpenpsZShwaW4sIFBDSV9TTE9UKGRldi0+ZGV2Zm4pKTsKKwkJcGluID0gcGNpX3N3aXp6bGVfaW50ZXJydXB0X3BpbihkZXYsIHBpbik7CiAKIAkJLyogTW92ZSB1cCB0aGUgY2hhaW4gb2YgYnJpZGdlcy4gICovCiAJCWRldiA9IGRldi0+YnVzLT5zZWxmOwpkaWZmIC0tZ2l0IGEvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX21pYXRhLmMgYi9hcmNoL2FscGhhL2tlcm5lbC9zeXNfbWlhdGEuYwppbmRleCA5MTBiNDNjLi42MWNjZDk1IDEwMDY0NAotLS0gYS9hcmNoL2FscGhhL2tlcm5lbC9zeXNfbWlhdGEuYworKysgYi9hcmNoL2FscGhhL2tlcm5lbC9zeXNfbWlhdGEuYwpAQCAtMjE5LDcgKzIxOSw3IEBACiAJCQkJc2xvdCA9IFBDSV9TTE9UKGRldi0+ZGV2Zm4pICsgOTsKIAkJCQlicmVhazsKIAkJCX0KLQkJCXBpbiA9IGJyaWRnZV9zd2l6emxlKHBpbiwgUENJX1NMT1QoZGV2LT5kZXZmbikpOworCQkJcGluID0gcGNpX3N3aXp6bGVfaW50ZXJydXB0X3BpbihkZXYsIHBpbik7CiAKIAkJCS8qIE1vdmUgdXAgdGhlIGNoYWluIG9mIGJyaWRnZXMuICAqLwogCQkJZGV2ID0gZGV2LT5idXMtPnNlbGY7CmRpZmYgLS1naXQgYS9hcmNoL2FscGhhL2tlcm5lbC9zeXNfbm9yaXRha2UuYyBiL2FyY2gvYWxwaGEva2VybmVsL3N5c19ub3JpdGFrZS5jCmluZGV4IGViMmExZDYuLjUzODg3NmIgMTAwNjQ0Ci0tLSBhL2FyY2gvYWxwaGEva2VybmVsL3N5c19ub3JpdGFrZS5jCisrKyBiL2FyY2gvYWxwaGEva2VybmVsL3N5c19ub3JpdGFrZS5jCkBAIC0yNTcsNyArMjU3LDcgQEAKIAkJCQlzbG90ID0gUENJX1NMT1QoZGV2LT5kZXZmbikgKyAxNTsKIAkJCQlicmVhazsKIAkJCX0KLQkJCXBpbiA9IGJyaWRnZV9zd2l6emxlKHBpbiwgUENJX1NMT1QoZGV2LT5kZXZmbikpIDsKKwkJCXBpbiA9IHBjaV9zd2l6emxlX2ludGVycnVwdF9waW4oZGV2LCBwaW4pOwogCiAJCQkvKiBNb3ZlIHVwIHRoZSBjaGFpbiBvZiBicmlkZ2VzLiAgKi8KIAkJCWRldiA9IGRldi0+YnVzLT5zZWxmOwpkaWZmIC0tZ2l0IGEvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX3J1ZmZpYW4uYyBiL2FyY2gvYWxwaGEva2VybmVsL3N5c19ydWZmaWFuLmMKaW5kZXggNWI5OWNmMy4uZjE1YTMyOSAxMDA2NDQKLS0tIGEvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX3J1ZmZpYW4uYworKysgYi9hcmNoL2FscGhhL2tlcm5lbC9zeXNfcnVmZmlhbi5jCkBAIC0xNjAsNyArMTYwLDcgQEAKIAkJCQlzbG90ID0gUENJX1NMT1QoZGV2LT5kZXZmbikgKyAxMDsKIAkJCQlicmVhazsKIAkJCX0KLQkJCXBpbiA9IGJyaWRnZV9zd2l6emxlKHBpbiwgUENJX1NMT1QoZGV2LT5kZXZmbikpOworCQkJcGluID0gcGNpX3N3aXp6bGVfaW50ZXJydXB0X3BpbihkZXYsIHBpbik7CiAKIAkJCS8qIE1vdmUgdXAgdGhlIGNoYWluIG9mIGJyaWRnZXMuICAqLwogCQkJZGV2ID0gZGV2LT5idXMtPnNlbGY7CmRpZmYgLS1naXQgYS9hcmNoL2FscGhhL2tlcm5lbC9zeXNfc2FibGUuYyBiL2FyY2gvYWxwaGEva2VybmVsL3N5c19zYWJsZS5jCmluZGV4IGE0NTU1ZjQuLmQyMzJlNDIgMTAwNjQ0Ci0tLSBhL2FyY2gvYWxwaGEva2VybmVsL3N5c19zYWJsZS5jCisrKyBiL2FyY2gvYWxwaGEva2VybmVsL3N5c19zYWJsZS5jCkBAIC00MjUsNyArNDI1LDcgQEAKIAkJCQlzbG90ID0gUENJX1NMT1QoZGV2LT5kZXZmbikgKyAxMTsKIAkJCQlicmVhazsKIAkJCX0KLQkJCXBpbiA9IGJyaWRnZV9zd2l6emxlKHBpbiwgUENJX1NMT1QoZGV2LT5kZXZmbikpIDsKKwkJCXBpbiA9IHBjaV9zd2l6emxlX2ludGVycnVwdF9waW4oZGV2LCBwaW4pOwogCiAJCQkvKiBNb3ZlIHVwIHRoZSBjaGFpbiBvZiBicmlkZ2VzLiAgKi8KIAkJCWRldiA9IGRldi0+YnVzLT5zZWxmOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vS2NvbmZpZyBiL2FyY2gvYXJtL0tjb25maWcKaW5kZXggZDZlYmUzOS4uZGJmZGY4NyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vS2NvbmZpZworKysgYi9hcmNoL2FybS9LY29uZmlnCkBAIC0xMzI1LDYgKzEzMjUsOCBAQAogCiBzb3VyY2UgImRyaXZlcnMvdWlvL0tjb25maWciCiAKK3NvdXJjZSAiZHJpdmVycy9zdGFnaW5nL0tjb25maWciCisKIGVuZG1lbnUKIAogc291cmNlICJmcy9LY29uZmlnIgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy9jbHBzNzUwMF9kZWZjb25maWcgYi9hcmNoL2FybS9jb25maWdzL2NscHM3NTAwX2RlZmNvbmZpZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDllOWY5ZC4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9jb25maWdzL2NscHM3NTAwX2RlZmNvbmZpZworKysgL2Rldi9udWxsCkBAIC0xLDgwMSArMCwwIEBACi0jCi0jIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0Ci0jIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMTItcmMxLWJrMgotIyBTdW4gTWFyIDI3IDE3OjIwOjQ4IDIwMDUKLSMKLUNPTkZJR19BUk09eQotQ09ORklHX01NVT15Ci1DT05GSUdfVUlEMTY9eQotQ09ORklHX1JXU0VNX0dFTkVSSUNfU1BJTkxPQ0s9eQotQ09ORklHX0dFTkVSSUNfQ0FMSUJSQVRFX0RFTEFZPXkKLUNPTkZJR19HRU5FUklDX0lPTUFQPXkKLQotIwotIyBDb2RlIG1hdHVyaXR5IGxldmVsIG9wdGlvbnMKLSMKLUNPTkZJR19FWFBFUklNRU5UQUw9eQotQ09ORklHX0NMRUFOX0NPTVBJTEU9eQotQ09ORklHX0JST0tFTl9PTl9TTVA9eQotCi0jCi0jIEdlbmVyYWwgc2V0dXAKLSMKLUNPTkZJR19MT0NBTFZFUlNJT049IiIKLUNPTkZJR19TV0FQPXkKLUNPTkZJR19TWVNWSVBDPXkKLSMgQ09ORklHX1BPU0lYX01RVUVVRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CU0RfUFJPQ0VTU19BQ0NUIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NZU0NUTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BVURJVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19IT1RQTFVHIGlzIG5vdCBzZXQKLUNPTkZJR19LT0JKRUNUX1VFVkVOVD15Ci0jIENPTkZJR19JS0NPTkZJRyBpcyBub3Qgc2V0Ci1DT05GSUdfRU1CRURERUQ9eQotQ09ORklHX0tBTExTWU1TPXkKLSMgQ09ORklHX0tBTExTWU1TX0VYVFJBX1BBU1MgaXMgbm90IHNldAotQ09ORklHX0JBU0VfRlVMTD15Ci1DT05GSUdfRlVURVg9eQotQ09ORklHX0VQT0xMPXkKLUNPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRT15Ci1DT05GSUdfU0hNRU09eQotQ09ORklHX0NDX0FMSUdOX0ZVTkNUSU9OUz0wCi1DT05GSUdfQ0NfQUxJR05fTEFCRUxTPTAKLUNPTkZJR19DQ19BTElHTl9MT09QUz0wCi1DT05GSUdfQ0NfQUxJR05fSlVNUFM9MAotIyBDT05GSUdfVElOWV9TSE1FTSBpcyBub3Qgc2V0Ci1DT05GSUdfQkFTRV9TTUFMTD0wCi0KLSMKLSMgTG9hZGFibGUgbW9kdWxlIHN1cHBvcnQKLSMKLSMgQ09ORklHX01PRFVMRVMgaXMgbm90IHNldAotCi0jCi0jIFN5c3RlbSBUeXBlCi0jCi1DT05GSUdfQVJDSF9DTFBTNzUwMD15Ci0jIENPTkZJR19BUkNIX0NMUFM3MTFYIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfQ08yODUgaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9FQlNBMTEwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfRk9PVEJSSURHRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX0lOVEVHUkFUT1IgaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9JT1AzWFggaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9JWFA0WFggaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9JWFAyMDAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfTDcyMDAgaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9QWEEgaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9SUEMgaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9TQTExMDAgaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9TM0MyNDEwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfU0hBUksgaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9MSDdBNDBYIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfT01BUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX1ZFUlNBVElMRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX0lNWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX0g3MjBYIGlzIG5vdCBzZXQKLQotIwotIyBQcm9jZXNzb3IgVHlwZQotIwotQ09ORklHX0NQVV8zMj15Ci1DT05GSUdfQ1BVX0FSTTcxMD15Ci1DT05GSUdfQ1BVXzMydjM9eQotQ09ORklHX0NQVV9DQUNIRV9WMz15Ci1DT05GSUdfQ1BVX0NBQ0hFX1ZJVlQ9eQotQ09ORklHX0NQVV9DT1BZX1YzPXkKLUNPTkZJR19DUFVfVExCX1YzPXkKLQotIwotIyBQcm9jZXNzb3IgRmVhdHVyZXMKLSMKLUNPTkZJR19USU1FUl9BQ09STj15Ci0KLSMKLSMgQnVzIHN1cHBvcnQKLSMKLUNPTkZJR19JU0E9eQotCi0jCi0jIFBDQ0FSRCAoUENNQ0lBL0NhcmRCdXMpIHN1cHBvcnQKLSMKLSMgQ09ORklHX1BDQ0FSRCBpcyBub3Qgc2V0Ci0KLSMKLSMgS2VybmVsIEZlYXR1cmVzCi0jCi0jIENPTkZJR19QUkVFTVBUIGlzIG5vdCBzZXQKLUNPTkZJR19BTElHTk1FTlRfVFJBUD15Ci0KLSMKLSMgQm9vdCBvcHRpb25zCi0jCi1DT05GSUdfWkJPT1RfUk9NX1RFWFQ9MHgwCi1DT05GSUdfWkJPT1RfUk9NX0JTUz0weDAKLUNPTkZJR19DTURMSU5FPSJtZW09MTZNIHJvb3Q9bmZzIgotIyBDT05GSUdfWElQX0tFUk5FTCBpcyBub3Qgc2V0Ci0KLSMKLSMgRmxvYXRpbmcgcG9pbnQgZW11bGF0aW9uCi0jCi0KLSMKLSMgQXQgbGVhc3Qgb25lIGVtdWxhdGlvbiBtdXN0IGJlIHNlbGVjdGVkCi0jCi0jIENPTkZJR19GUEVfTldGUEUgaXMgbm90IHNldAotCi0jCi0jIFVzZXJzcGFjZSBiaW5hcnkgZm9ybWF0cwotIwotQ09ORklHX0JJTkZNVF9FTEY9eQotIyBDT05GSUdfQklORk1UX0FPVVQgaXMgbm90IHNldAotIyBDT05GSUdfQklORk1UX01JU0MgaXMgbm90IHNldAotIyBDT05GSUdfQVJUSFVSIGlzIG5vdCBzZXQKLQotIwotIyBQb3dlciBtYW5hZ2VtZW50IG9wdGlvbnMKLSMKLSMgQ09ORklHX1BNIGlzIG5vdCBzZXQKLQotIwotIyBEZXZpY2UgRHJpdmVycwotIwotCi0jCi0jIEdlbmVyaWMgRHJpdmVyIE9wdGlvbnMKLSMKLUNPTkZJR19TVEFOREFMT05FPXkKLUNPTkZJR19QUkVWRU5UX0ZJUk1XQVJFX0JVSUxEPXkKLSMgQ09ORklHX0ZXX0xPQURFUiBpcyBub3Qgc2V0Ci0KLSMKLSMgTWVtb3J5IFRlY2hub2xvZ3kgRGV2aWNlcyAoTVREKQotIwotQ09ORklHX01URD15Ci0jIENPTkZJR19NVERfREVCVUcgaXMgbm90IHNldAotIyBDT05GSUdfTVREX0NPTkNBVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NVERfUEFSVElUSU9OUyBpcyBub3Qgc2V0Ci0KLSMKLSMgVXNlciBNb2R1bGVzIEFuZCBUcmFuc2xhdGlvbiBMYXllcnMKLSMKLSMgQ09ORklHX01URF9DSEFSIGlzIG5vdCBzZXQKLSMgQ09ORklHX01URF9CTE9DSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NVERfQkxPQ0tfUk8gaXMgbm90IHNldAotIyBDT05GSUdfRlRMIGlzIG5vdCBzZXQKLSMgQ09ORklHX05GVEwgaXMgbm90IHNldAotIyBDT05GSUdfSU5GVEwgaXMgbm90IHNldAotCi0jCi0jIFJBTS9ST00vRmxhc2ggY2hpcCBkcml2ZXJzCi0jCi0jIENPTkZJR19NVERfQ0ZJIGlzIG5vdCBzZXQKLSMgQ09ORklHX01URF9KRURFQ1BST0JFIGlzIG5vdCBzZXQKLUNPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMT15Ci1DT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzI9eQotQ09ORklHX01URF9NQVBfQkFOS19XSURUSF80PXkKLSMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF84IGlzIG5vdCBzZXQKLSMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8xNiBpcyBub3Qgc2V0Ci0jIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMzIgaXMgbm90IHNldAotQ09ORklHX01URF9DRklfSTE9eQotQ09ORklHX01URF9DRklfSTI9eQotIyBDT05GSUdfTVREX0NGSV9JNCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NVERfQ0ZJX0k4IGlzIG5vdCBzZXQKLSMgQ09ORklHX01URF9SQU0gaXMgbm90IHNldAotIyBDT05GSUdfTVREX1JPTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19NVERfQUJTRU5UIGlzIG5vdCBzZXQKLQotIwotIyBNYXBwaW5nIGRyaXZlcnMgZm9yIGNoaXAgYWNjZXNzCi0jCi0jIENPTkZJR19NVERfQ09NUExFWF9NQVBQSU5HUyBpcyBub3Qgc2V0Ci0KLSMKLSMgU2VsZi1jb250YWluZWQgTVREIGRldmljZSBkcml2ZXJzCi0jCi0jIENPTkZJR19NVERfU0xSQU0gaXMgbm90IHNldAotIyBDT05GSUdfTVREX1BIUkFNIGlzIG5vdCBzZXQKLSMgQ09ORklHX01URF9NVERSQU0gaXMgbm90IHNldAotIyBDT05GSUdfTVREX0JMS01URCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NVERfQkxPQ0syTVREIGlzIG5vdCBzZXQKLQotIwotIyBEaXNrLU9uLUNoaXAgRGV2aWNlIERyaXZlcnMKLSMKLSMgQ09ORklHX01URF9ET0MyMDAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX01URF9ET0MyMDAxIGlzIG5vdCBzZXQKLSMgQ09ORklHX01URF9ET0MyMDAxUExVUyBpcyBub3Qgc2V0Ci0KLSMKLSMgTkFORCBGbGFzaCBEZXZpY2UgRHJpdmVycwotIwotIyBDT05GSUdfTVREX05BTkQgaXMgbm90IHNldAotCi0jCi0jIFBhcmFsbGVsIHBvcnQgc3VwcG9ydAotIwotQ09ORklHX1BBUlBPUlQ9eQotQ09ORklHX1BBUlBPUlRfUEM9eQotQ09ORklHX1BBUlBPUlRfUENfRklGTz15Ci0jIENPTkZJR19QQVJQT1JUX1BDX1NVUEVSSU8gaXMgbm90IHNldAotIyBDT05GSUdfUEFSUE9SVF9BUkMgaXMgbm90IHNldAotIyBDT05GSUdfUEFSUE9SVF9HU0MgaXMgbm90IHNldAotQ09ORklHX1BBUlBPUlRfMTI4ND15Ci0KLSMKLSMgUGx1ZyBhbmQgUGxheSBzdXBwb3J0Ci0jCi0jIENPTkZJR19QTlAgaXMgbm90IHNldAotCi0jCi0jIEJsb2NrIGRldmljZXMKLSMKLSMgQ09ORklHX0JMS19ERVZfRkQgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9YRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19QQVJJREUgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9DT1dfQ09NTU9OIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfTE9PUCBpcyBub3Qgc2V0Ci1DT05GSUdfQkxLX0RFVl9OQkQ9eQotQ09ORklHX0JMS19ERVZfUkFNPXkKLUNPTkZJR19CTEtfREVWX1JBTV9DT1VOVD0xNgotQ09ORklHX0JMS19ERVZfUkFNX1NJWkU9NDA5NgotIyBDT05GSUdfQkxLX0RFVl9JTklUUkQgaXMgbm90IHNldAotQ09ORklHX0lOSVRSQU1GU19TT1VSQ0U9IiIKLSMgQ09ORklHX0NEUk9NX1BLVENEVkQgaXMgbm90IHNldAotCi0jCi0jIElPIFNjaGVkdWxlcnMKLSMKLUNPTkZJR19JT1NDSEVEX05PT1A9eQotQ09ORklHX0lPU0NIRURfQVM9eQotQ09ORklHX0lPU0NIRURfREVBRExJTkU9eQotQ09ORklHX0lPU0NIRURfQ0ZRPXkKLSMgQ09ORklHX0FUQV9PVkVSX0VUSCBpcyBub3Qgc2V0Ci0KLSMKLSMgQVRBL0FUQVBJL01GTS9STEwgc3VwcG9ydAotIwotIyBDT05GSUdfSURFIGlzIG5vdCBzZXQKLQotIwotIyBTQ1NJIGRldmljZSBzdXBwb3J0Ci0jCi0jIENPTkZJR19TQ1NJIGlzIG5vdCBzZXQKLQotIwotIyBNdWx0aS1kZXZpY2Ugc3VwcG9ydCAoUkFJRCBhbmQgTFZNKQotIwotIyBDT05GSUdfTUQgaXMgbm90IHNldAotCi0jCi0jIEZ1c2lvbiBNUFQgZGV2aWNlIHN1cHBvcnQKLSMKLQotIwotIyBJRUVFIDEzOTQgKEZpcmVXaXJlKSBzdXBwb3J0Ci0jCi0KLSMKLSMgSTJPIGRldmljZSBzdXBwb3J0Ci0jCi0KLSMKLSMgTmV0d29ya2luZyBzdXBwb3J0Ci0jCi1DT05GSUdfTkVUPXkKLQotIwotIyBOZXR3b3JraW5nIG9wdGlvbnMKLSMKLSMgQ09ORklHX1BBQ0tFVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRMSU5LX0RFViBpcyBub3Qgc2V0Ci1DT05GSUdfVU5JWD15Ci0jIENPTkZJR19ORVRfS0VZIGlzIG5vdCBzZXQKLUNPTkZJR19JTkVUPXkKLSMgQ09ORklHX0lQX01VTFRJQ0FTVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUF9BRFZBTkNFRF9ST1VURVIgaXMgbm90IHNldAotQ09ORklHX0lQX1BOUD15Ci0jIENPTkZJR19JUF9QTlBfREhDUCBpcyBub3Qgc2V0Ci1DT05GSUdfSVBfUE5QX0JPT1RQPXkKLSMgQ09ORklHX0lQX1BOUF9SQVJQIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9JUElQIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9JUEdSRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUlBEIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NZTl9DT09LSUVTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVRfQUggaXMgbm90IHNldAotIyBDT05GSUdfSU5FVF9FU1AgaXMgbm90IHNldAotIyBDT05GSUdfSU5FVF9JUENPTVAgaXMgbm90IHNldAotIyBDT05GSUdfSU5FVF9UVU5ORUwgaXMgbm90IHNldAotQ09ORklHX0lQX1RDUERJQUc9eQotIyBDT05GSUdfSVBfVENQRElBR19JUFY2IGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQVjYgaXMgbm90IHNldAotIyBDT05GSUdfTkVURklMVEVSIGlzIG5vdCBzZXQKLQotIwotIyBTQ1RQIENvbmZpZ3VyYXRpb24gKEVYUEVSSU1FTlRBTCkKLSMKLSMgQ09ORklHX0lQX1NDVFAgaXMgbm90IHNldAotIyBDT05GSUdfQVRNIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JSSURHRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19WTEFOXzgwMjFRIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQ05FVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19MTEMyIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BVEFMSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19YMjUgaXMgbm90IHNldAotIyBDT05GSUdfTEFQQiBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfRElWRVJUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VDT05FVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19XQU5fUk9VVEVSIGlzIG5vdCBzZXQKLQotIwotIyBRb1MgYW5kL29yIGZhaXIgcXVldWVpbmcKLSMKLSMgQ09ORklHX05FVF9TQ0hFRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfQ0xTX1JPVVRFIGlzIG5vdCBzZXQKLQotIwotIyBOZXR3b3JrIHRlc3RpbmcKLSMKLSMgQ09ORklHX05FVF9QS1RHRU4gaXMgbm90IHNldAotIyBDT05GSUdfTkVUUE9MTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hBTVJBRElPIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lSREEgaXMgbm90IHNldAotIyBDT05GSUdfQlQgaXMgbm90IHNldAotQ09ORklHX05FVERFVklDRVM9eQotQ09ORklHX0RVTU1ZPXkKLSMgQ09ORklHX0JPTkRJTkcgaXMgbm90IHNldAotIyBDT05GSUdfRVFVQUxJWkVSIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RVTiBpcyBub3Qgc2V0Ci0KLSMKLSMgQVJDbmV0IGRldmljZXMKLSMKLSMgQ09ORklHX0FSQ05FVCBpcyBub3Qgc2V0Ci0KLSMKLSMgRXRoZXJuZXQgKDEwIG9yIDEwME1iaXQpCi0jCi1DT05GSUdfTkVUX0VUSEVSTkVUPXkKLSMgQ09ORklHX01JSSBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfVkVORE9SXzNDT00gaXMgbm90IHNldAotIyBDT05GSUdfTEFOQ0UgaXMgbm90IHNldAotIyBDT05GSUdfTkVUX1ZFTkRPUl9TTUMgaXMgbm90IHNldAotIyBDT05GSUdfU01DOTFYIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9WRU5ET1JfUkFDQUwgaXMgbm90IHNldAotIyBDT05GSUdfQVQxNzAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFUENBIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hQMTAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9JU0EgaXMgbm90IHNldAotQ09ORklHX05FVF9QQ0k9eQotIyBDT05GSUdfQUMzMjAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FQUklDT1QgaXMgbm90IHNldAotQ09ORklHX0NTODl4MD15Ci0jIENPTkZJR19ORVRfUE9DS0VUIGlzIG5vdCBzZXQKLQotIwotIyBFdGhlcm5ldCAoMTAwMCBNYml0KQotIwotCi0jCi0jIEV0aGVybmV0ICgxMDAwMCBNYml0KQotIwotCi0jCi0jIFRva2VuIFJpbmcgZGV2aWNlcwotIwotIyBDT05GSUdfVFIgaXMgbm90IHNldAotCi0jCi0jIFdpcmVsZXNzIExBTiAobm9uLWhhbXJhZGlvKQotIwotIyBDT05GSUdfTkVUX1JBRElPIGlzIG5vdCBzZXQKLQotIwotIyBXYW4gaW50ZXJmYWNlcwotIwotIyBDT05GSUdfV0FOIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BMSVAgaXMgbm90IHNldAotQ09ORklHX1BQUD15Ci0jIENPTkZJR19QUFBfTVVMVElMSU5LIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BQUF9GSUxURVIgaXMgbm90IHNldAotIyBDT05GSUdfUFBQX0FTWU5DIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BQUF9TWU5DX1RUWSBpcyBub3Qgc2V0Ci0jIENPTkZJR19QUFBfREVGTEFURSBpcyBub3Qgc2V0Ci0jIENPTkZJR19QUFBfQlNEQ09NUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19QUFBPRSBpcyBub3Qgc2V0Ci1DT05GSUdfU0xJUD15Ci1DT05GSUdfU0xJUF9DT01QUkVTU0VEPXkKLSMgQ09ORklHX1NMSVBfU01BUlQgaXMgbm90IHNldAotIyBDT05GSUdfU0xJUF9NT0RFX1NMSVA2IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIQVBFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRDT05TT0xFIGlzIG5vdCBzZXQKLQotIwotIyBJU0ROIHN1YnN5c3RlbQotIwotIyBDT05GSUdfSVNETiBpcyBub3Qgc2V0Ci0KLSMKLSMgSW5wdXQgZGV2aWNlIHN1cHBvcnQKLSMKLUNPTkZJR19JTlBVVD15Ci0KLSMKLSMgVXNlcmxhbmQgaW50ZXJmYWNlcwotIwotQ09ORklHX0lOUFVUX01PVVNFREVWPXkKLUNPTkZJR19JTlBVVF9NT1VTRURFVl9QU0FVWD15Ci1DT05GSUdfSU5QVVRfTU9VU0VERVZfU0NSRUVOX1g9MTAyNAotQ09ORklHX0lOUFVUX01PVVNFREVWX1NDUkVFTl9ZPTc2OAotIyBDT05GSUdfSU5QVVRfSk9ZREVWIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lOUFVUX1RTREVWIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lOUFVUX0VWREVWIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lOUFVUX0VWQlVHIGlzIG5vdCBzZXQKLQotIwotIyBJbnB1dCBEZXZpY2UgRHJpdmVycwotIwotQ09ORklHX0lOUFVUX0tFWUJPQVJEPXkKLUNPTkZJR19LRVlCT0FSRF9BVEtCRD15Ci0jIENPTkZJR19LRVlCT0FSRF9TVU5LQkQgaXMgbm90IHNldAotIyBDT05GSUdfS0VZQk9BUkRfTEtLQkQgaXMgbm90IHNldAotIyBDT05GSUdfS0VZQk9BUkRfWFRLQkQgaXMgbm90IHNldAotIyBDT05GSUdfS0VZQk9BUkRfTkVXVE9OIGlzIG5vdCBzZXQKLUNPTkZJR19JTlBVVF9NT1VTRT15Ci1DT05GSUdfTU9VU0VfUFMyPXkKLSMgQ09ORklHX01PVVNFX1NFUklBTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NT1VTRV9JTlBPUlQgaXMgbm90IHNldAotIyBDT05GSUdfTU9VU0VfTE9HSUJNIGlzIG5vdCBzZXQKLSMgQ09ORklHX01PVVNFX1BDMTEwUEFEIGlzIG5vdCBzZXQKLSMgQ09ORklHX01PVVNFX1ZTWFhYQUEgaXMgbm90IHNldAotIyBDT05GSUdfSU5QVVRfSk9ZU1RJQ0sgaXMgbm90IHNldAotIyBDT05GSUdfSU5QVVRfVE9VQ0hTQ1JFRU4gaXMgbm90IHNldAotIyBDT05GSUdfSU5QVVRfTUlTQyBpcyBub3Qgc2V0Ci0KLSMKLSMgSGFyZHdhcmUgSS9PIHBvcnRzCi0jCi1DT05GSUdfU0VSSU89eQotIyBDT05GSUdfU0VSSU9fU0VSUE9SVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRVJJT19QQVJLQkQgaXMgbm90IHNldAotQ09ORklHX1NFUklPX1JQQ0tCRD15Ci1DT05GSUdfU0VSSU9fTElCUFMyPXkKLSMgQ09ORklHX1NFUklPX1JBVyBpcyBub3Qgc2V0Ci0jIENPTkZJR19HQU1FUE9SVCBpcyBub3Qgc2V0Ci1DT05GSUdfU09VTkRfR0FNRVBPUlQ9eQotCi0jCi0jIENoYXJhY3RlciBkZXZpY2VzCi0jCi1DT05GSUdfVlQ9eQotQ09ORklHX1ZUX0NPTlNPTEU9eQotQ09ORklHX0hXX0NPTlNPTEU9eQotIyBDT05GSUdfU0VSSUFMX05PTlNUQU5EQVJEIGlzIG5vdCBzZXQKLQotIwotIyBTZXJpYWwgZHJpdmVycwotIwotQ09ORklHX1NFUklBTF84MjUwPXkKLUNPTkZJR19TRVJJQUxfODI1MF9DT05TT0xFPXkKLUNPTkZJR19TRVJJQUxfODI1MF9OUl9VQVJUUz00Ci0jIENPTkZJR19TRVJJQUxfODI1MF9FWFRFTkRFRCBpcyBub3Qgc2V0Ci0KLSMKLSMgTm9uLTgyNTAgc2VyaWFsIHBvcnQgc3VwcG9ydAotIwotQ09ORklHX1NFUklBTF9DT1JFPXkKLUNPTkZJR19TRVJJQUxfQ09SRV9DT05TT0xFPXkKLUNPTkZJR19VTklYOThfUFRZUz15Ci1DT05GSUdfTEVHQUNZX1BUWVM9eQotQ09ORklHX0xFR0FDWV9QVFlfQ09VTlQ9MjU2Ci1DT05GSUdfUFJJTlRFUj15Ci0jIENPTkZJR19MUF9DT05TT0xFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BQREVWIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RJUEFSIGlzIG5vdCBzZXQKLQotIwotIyBJUE1JCi0jCi0jIENPTkZJR19JUE1JX0hBTkRMRVIgaXMgbm90IHNldAotCi0jCi0jIFdhdGNoZG9nIENhcmRzCi0jCi0jIENPTkZJR19XQVRDSERPRyBpcyBub3Qgc2V0Ci0jIENPTkZJR19OVlJBTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19SVEMgaXMgbm90IHNldAotIyBDT05GSUdfRFRMSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19SMzk2NCBpcyBub3Qgc2V0Ci0KLSMKLSMgRnRhcGUsIHRoZSBmbG9wcHkgdGFwZSBkZXZpY2UgZHJpdmVyCi0jCi0jIENPTkZJR19EUk0gaXMgbm90IHNldAotIyBDT05GSUdfUkFXX0RSSVZFUiBpcyBub3Qgc2V0Ci0KLSMKLSMgVFBNIGRldmljZXMKLSMKLSMgQ09ORklHX1RDR19UUE0gaXMgbm90IHNldAotCi0jCi0jIEkyQyBzdXBwb3J0Ci0jCi1DT05GSUdfSTJDPXkKLSMgQ09ORklHX0kyQ19DSEFSREVWIGlzIG5vdCBzZXQKLQotIwotIyBJMkMgQWxnb3JpdGhtcwotIwotQ09ORklHX0kyQ19BTEdPQklUPXkKLSMgQ09ORklHX0kyQ19BTEdPUENGIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19BTEdPUENBIGlzIG5vdCBzZXQKLQotIwotIyBJMkMgSGFyZHdhcmUgQnVzIHN1cHBvcnQKLSMKLSMgQ09ORklHX0kyQ19FTEVLVE9SIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19QQVJQT1JUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19QQVJQT1JUX0xJR0hUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19QQ0FfSVNBIGlzIG5vdCBzZXQKLQotIwotIyBIYXJkd2FyZSBTZW5zb3JzIENoaXAgc3VwcG9ydAotIwotIyBDT05GSUdfSTJDX1NFTlNPUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX0FETTEwMjEgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19BRE0xMDI1IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfQURNMTAyNiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX0FETTEwMzEgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19BU0IxMDAgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19EUzE2MjEgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19GU0NIRVIgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19GU0NQT1MgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19HTDUxOFNNIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfR0w1MjBTTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX0lUODcgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19MTTYzIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfTE03NSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX0xNNzcgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19MTTc4IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfTE04MCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX0xNODMgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19MTTg1IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfTE04NyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX0xNOTAgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19NQVgxNjE5IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfUEM4NzM2MCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX1NNU0M0N0IzOTcgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19TTVNDNDdNMSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX1c4Mzc4MUQgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19XODNMNzg1VFMgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19XODM2MjdIRiBpcyBub3Qgc2V0Ci0KLSMKLSMgT3RoZXIgSTJDIENoaXAgc3VwcG9ydAotIwotIyBDT05GSUdfU0VOU09SU19FRVBST00gaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19QQ0Y4NTc0IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfUENGODU5MSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX1JUQzg1NjQgaXMgbm90IHNldAotIyBDT05GSUdfSTJDX0RFQlVHX0NPUkUgaXMgbm90IHNldAotIyBDT05GSUdfSTJDX0RFQlVHX0FMR08gaXMgbm90IHNldAotIyBDT05GSUdfSTJDX0RFQlVHX0JVUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfREVCVUdfQ0hJUCBpcyBub3Qgc2V0Ci0KLSMKLSMgTWlzYyBkZXZpY2VzCi0jCi0KLSMKLSMgTXVsdGltZWRpYSBkZXZpY2VzCi0jCi0jIENPTkZJR19WSURFT19ERVYgaXMgbm90IHNldAotCi0jCi0jIERpZ2l0YWwgVmlkZW8gQnJvYWRjYXN0aW5nIERldmljZXMKLSMKLSMgQ09ORklHX0RWQiBpcyBub3Qgc2V0Ci0KLSMKLSMgR3JhcGhpY3Mgc3VwcG9ydAotIwotQ09ORklHX0ZCPXkKLUNPTkZJR19GQl9DRkJfRklMTFJFQ1Q9eQotQ09ORklHX0ZCX0NGQl9DT1BZQVJFQT15Ci1DT05GSUdfRkJfQ0ZCX0lNQUdFQkxJVD15Ci1DT05GSUdfRkJfU09GVF9DVVJTT1I9eQotIyBDT05GSUdfRkJfTU9ERV9IRUxQRVJTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZCX1RJTEVCTElUVElORyBpcyBub3Qgc2V0Ci1DT05GSUdfRkJfQUNPUk49eQotIyBDT05GSUdfRkJfVklSVFVBTCBpcyBub3Qgc2V0Ci0KLSMKLSMgQ29uc29sZSBkaXNwbGF5IGRyaXZlciBzdXBwb3J0Ci0jCi0jIENPTkZJR19WR0FfQ09OU09MRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19NREFfQ09OU09MRSBpcyBub3Qgc2V0Ci1DT05GSUdfRFVNTVlfQ09OU09MRT15Ci1DT05GSUdfRlJBTUVCVUZGRVJfQ09OU09MRT15Ci1DT05GSUdfRk9OVFM9eQotQ09ORklHX0ZPTlRfOHg4PXkKLUNPTkZJR19GT05UXzh4MTY9eQotIyBDT05GSUdfRk9OVF82eDExIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZPTlRfUEVBUkxfOHg4IGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZPTlRfQUNPUk5fOHg4IGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZPTlRfTUlOSV80eDYgaXMgbm90IHNldAotIyBDT05GSUdfRk9OVF9TVU44eDE2IGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZPTlRfU1VOMTJ4MjIgaXMgbm90IHNldAotCi0jCi0jIExvZ28gY29uZmlndXJhdGlvbgotIwotQ09ORklHX0xPR089eQotQ09ORklHX0xPR09fTElOVVhfTU9OTz15Ci1DT05GSUdfTE9HT19MSU5VWF9WR0ExNj15Ci1DT05GSUdfTE9HT19MSU5VWF9DTFVUMjI0PXkKLSMgQ09ORklHX0JBQ0tMSUdIVF9MQ0RfU1VQUE9SVCBpcyBub3Qgc2V0Ci0KLSMKLSMgU291bmQKLSMKLSMgQ09ORklHX1NPVU5EIGlzIG5vdCBzZXQKLQotIwotIyBVU0Igc3VwcG9ydAotIwotQ09ORklHX1VTQl9BUkNIX0hBU19IQ0Q9eQotIyBDT05GSUdfVVNCX0FSQ0hfSEFTX09IQ0kgaXMgbm90IHNldAotIyBDT05GSUdfVVNCIGlzIG5vdCBzZXQKLQotIwotIyBVU0IgR2FkZ2V0IFN1cHBvcnQKLSMKLSMgQ09ORklHX1VTQl9HQURHRVQgaXMgbm90IHNldAotCi0jCi0jIE1NQy9TRCBDYXJkIHN1cHBvcnQKLSMKLSMgQ09ORklHX01NQyBpcyBub3Qgc2V0Ci0KLSMKLSMgRmlsZSBzeXN0ZW1zCi0jCi1DT05GSUdfRVhUMl9GUz15Ci0jIENPTkZJR19FWFQyX0ZTX1hBVFRSIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VYVDNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfSkJEIGlzIG5vdCBzZXQKLSMgQ09ORklHX1JFSVNFUkZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0pGU19GUyBpcyBub3Qgc2V0Ci0KLSMKLSMgWEZTIHN1cHBvcnQKLSMKLSMgQ09ORklHX1hGU19GUyBpcyBub3Qgc2V0Ci1DT05GSUdfTUlOSVhfRlM9eQotIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfUVVPVEEgaXMgbm90IHNldAotQ09ORklHX0ROT1RJRlk9eQotIyBDT05GSUdfQVVUT0ZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FVVE9GUzRfRlMgaXMgbm90IHNldAotCi0jCi0jIENELVJPTS9EVkQgRmlsZXN5c3RlbXMKLSMKLSMgQ09ORklHX0lTTzk2NjBfRlMgaXMgbm90IHNldAotIyBDT05GSUdfVURGX0ZTIGlzIG5vdCBzZXQKLQotIwotIyBET1MvRkFUL05UIEZpbGVzeXN0ZW1zCi0jCi0jIENPTkZJR19NU0RPU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19WRkFUX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX05URlNfRlMgaXMgbm90IHNldAotCi0jCi0jIFBzZXVkbyBmaWxlc3lzdGVtcwotIwotQ09ORklHX1BST0NfRlM9eQotQ09ORklHX1NZU0ZTPXkKLSMgQ09ORklHX0RFVkZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFVlBUU19GU19YQVRUUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19UTVBGUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19IVUdFVExCX1BBR0UgaXMgbm90IHNldAotQ09ORklHX1JBTUZTPXkKLQotIwotIyBNaXNjZWxsYW5lb3VzIGZpbGVzeXN0ZW1zCi0jCi0jIENPTkZJR19BREZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FGRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfSEZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hGU1BMVVNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfQkVGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19CRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfRUZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0pGRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfSkZGUzJfRlMgaXMgbm90IHNldAotIyBDT05GSUdfQ1JBTUZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1ZYRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfSFBGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19RTlg0RlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfU1lTVl9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19VRlNfRlMgaXMgbm90IHNldAotCi0jCi0jIE5ldHdvcmsgRmlsZSBTeXN0ZW1zCi0jCi1DT05GSUdfTkZTX0ZTPXkKLSMgQ09ORklHX05GU19WMyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORlNfVjQgaXMgbm90IHNldAotIyBDT05GSUdfTkZTX0RJUkVDVElPIGlzIG5vdCBzZXQKLSMgQ09ORklHX05GU0QgaXMgbm90IHNldAotQ09ORklHX1JPT1RfTkZTPXkKLUNPTkZJR19MT0NLRD15Ci1DT05GSUdfU1VOUlBDPXkKLSMgQ09ORklHX1JQQ1NFQ19HU1NfS1JCNSBpcyBub3Qgc2V0Ci0jIENPTkZJR19SUENTRUNfR1NTX1NQS00zIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NNQl9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DSUZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX05DUF9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DT0RBX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FGU19GUyBpcyBub3Qgc2V0Ci0KLSMKLSMgUGFydGl0aW9uIFR5cGVzCi0jCi1DT05GSUdfUEFSVElUSU9OX0FEVkFOQ0VEPXkKLSMgQ09ORklHX0FDT1JOX1BBUlRJVElPTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19PU0ZfUEFSVElUSU9OIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FNSUdBX1BBUlRJVElPTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19BVEFSSV9QQVJUSVRJT04gaXMgbm90IHNldAotIyBDT05GSUdfTUFDX1BBUlRJVElPTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19NU0RPU19QQVJUSVRJT04gaXMgbm90IHNldAotIyBDT05GSUdfTERNX1BBUlRJVElPTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TR0lfUEFSVElUSU9OIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VMVFJJWF9QQVJUSVRJT04gaXMgbm90IHNldAotIyBDT05GSUdfU1VOX1BBUlRJVElPTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19FRklfUEFSVElUSU9OIGlzIG5vdCBzZXQKLQotIwotIyBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydAotIwotIyBDT05GSUdfTkxTIGlzIG5vdCBzZXQKLQotIwotIyBQcm9maWxpbmcgc3VwcG9ydAotIwotIyBDT05GSUdfUFJPRklMSU5HIGlzIG5vdCBzZXQKLQotIwotIyBLZXJuZWwgaGFja2luZwotIwotIyBDT05GSUdfUFJJTlRLX1RJTUUgaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfS0VSTkVMIGlzIG5vdCBzZXQKLUNPTkZJR19MT0dfQlVGX1NISUZUPTE0Ci0jIENPTkZJR19ERUJVR19CVUdWRVJCT1NFIGlzIG5vdCBzZXQKLUNPTkZJR19GUkFNRV9QT0lOVEVSPXkKLSMgQ09ORklHX0RFQlVHX1VTRVIgaXMgbm90IHNldAotCi0jCi0jIFNlY3VyaXR5IG9wdGlvbnMKLSMKLSMgQ09ORklHX0tFWVMgaXMgbm90IHNldAotIyBDT05GSUdfU0VDVVJJVFkgaXMgbm90IHNldAotCi0jCi0jIENyeXB0b2dyYXBoaWMgb3B0aW9ucwotIwotIyBDT05GSUdfQ1JZUFRPIGlzIG5vdCBzZXQKLQotIwotIyBIYXJkd2FyZSBjcnlwdG8gZGV2aWNlcwotIwotCi0jCi0jIExpYnJhcnkgcm91dGluZXMKLSMKLSMgQ09ORklHX0NSQ19DQ0lUVCBpcyBub3Qgc2V0Ci1DT05GSUdfQ1JDMzI9eQotIyBDT05GSUdfTElCQ1JDMzJDIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL0tidWlsZCBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL0tidWlsZAppbmRleCA3MzIzN2JkLi40M2IwYjJiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9LYnVpbGQKKysrIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vS2J1aWxkCkBAIC0xLDMgKzEsNCBAQAogaW5jbHVkZSBpbmNsdWRlL2FzbS1nZW5lcmljL0tidWlsZC5hc20KIAogdW5pZmRlZi15ICs9IGh3Y2FwLmgKK3VuaWZkZWYteSArPSBzd2FiLmgKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2F0b21pYy5oIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vYXRvbWljLmgKaW5kZXggMzI1Zjg4MS4uZWU5OTcyMyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vYXRvbWljLmgKKysrIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vYXRvbWljLmgKQEAgLTEyLDEwICsxMiw5IEBACiAjZGVmaW5lIF9fQVNNX0FSTV9BVE9NSUNfSAogCiAjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KIAotdHlwZWRlZiBzdHJ1Y3QgeyB2b2xhdGlsZSBpbnQgY291bnRlcjsgfSBhdG9taWNfdDsKLQogI2RlZmluZSBBVE9NSUNfSU5JVChpKQl7IChpKSB9CiAKICNpZmRlZiBfX0tFUk5FTF9fCmRpZmYgLS1naXQgYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9ieXRlb3JkZXIuaCBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2J5dGVvcmRlci5oCmluZGV4IDRmYmZiMjIuLmMwMmI2ZmMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2J5dGVvcmRlci5oCisrKyBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2J5dGVvcmRlci5oCkBAIC0xNSwzOCArMTUsNyBAQAogI2lmbmRlZiBfX0FTTV9BUk1fQllURU9SREVSX0gKICNkZWZpbmUgX19BU01fQVJNX0JZVEVPUkRFUl9ICiAKLSNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgotI2luY2x1ZGUgPGFzbS90eXBlcy5oPgotCi1zdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX2NvbnN0X18gX191MzIgX19fYXJjaF9fc3dhYjMyKF9fdTMyIHgpCi17Ci0JX191MzIgdDsKLQotI2lmbmRlZiBfX3RodW1iX18KLQlpZiAoIV9fYnVpbHRpbl9jb25zdGFudF9wKHgpKSB7Ci0JCS8qCi0JCSAqIFRoZSBjb21waWxlciBuZWVkcyBhIGJpdCBvZiBhIGhpbnQgaGVyZSB0byBhbHdheXMgZG8gdGhlCi0JCSAqIHJpZ2h0IHRoaW5nIGFuZCBub3Qgc2NyZXcgaXQgdXAgdG8gZGlmZmVyZW50IGRlZ3JlZXMKLQkJICogZGVwZW5kaW5nIG9uIHRoZSBnY2MgdmVyc2lvbi4KLQkJICovCi0JCWFzbSAoImVvclx0JTAsICUxLCAlMSwgcm9yICMxNiIgOiAiPXIiICh0KSA6ICJyIiAoeCkpOwotCX0gZWxzZQotI2VuZGlmCi0JCXQgPSB4IF4gKCh4IDw8IDE2KSB8ICh4ID4+IDE2KSk7IC8qIGVvciByMSxyMCxyMCxyb3IgIzE2ICovCi0KLQl4ID0gKHggPDwgMjQpIHwgKHggPj4gOCk7CQkvKiBtb3YgcjAscjAscm9yICM4ICAgICAgKi8KLQl0ICY9IH4weDAwRkYwMDAwOwkJCS8qIGJpYyByMSxyMSwjMHgwMEZGMDAwMCAqLwotCXggXj0gKHQgPj4gOCk7CQkJCS8qIGVvciByMCxyMCxyMSxsc3IgIzggICAqLwotCi0JcmV0dXJuIHg7Ci19Ci0KLSNkZWZpbmUgX19hcmNoX19zd2FiMzIoeCkgX19fYXJjaF9fc3dhYjMyKHgpCi0KLSNpZiAhZGVmaW5lZChfX1NUUklDVF9BTlNJX18pIHx8IGRlZmluZWQoX19LRVJORUxfXykKLSMgIGRlZmluZSBfX0JZVEVPUkRFUl9IQVNfVTY0X18KLSMgIGRlZmluZSBfX1NXQUJfNjRfVEhSVV8zMl9fCi0jZW5kaWYKKyNpbmNsdWRlIDxhc20vc3dhYi5oPgogCiAjaWZkZWYgX19BUk1FQl9fCiAjaW5jbHVkZSA8bGludXgvYnl0ZW9yZGVyL2JpZ19lbmRpYW4uaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL21hY2gvcGNpLmggYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9tYWNoL3BjaS5oCmluZGV4IDMyZGExYWUuLmEzOGJkYzcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL21hY2gvcGNpLmgKKysrIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vbWFjaC9wY2kuaApAQCAtNDIsNyArNDIsNyBAQAogLyoKICAqIFRoaXMgaXMgdGhlIHN0YW5kYXJkIFBDSS1QQ0kgYnJpZGdlIHN3aXp6bGluZyBhbGdvcml0aG0uCiAgKi8KLXU4IHBjaV9zdGRfc3dpenpsZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCAqcGlucCk7CisjZGVmaW5lIHBjaV9zdGRfc3dpenpsZSBwY2lfY29tbW9uX3N3aXp6bGUKIAogLyoKICAqIENhbGwgdGhpcyB3aXRoIHlvdXIgaHdfcGNpIHN0cnVjdCB0byBpbml0aWFsaXNlIHRoZSBQQ0kgc3lzdGVtLgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vc3dhYi5oIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vc3dhYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3YTY4OWIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9zd2FiLmgKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqICBhcmNoL2FybS9pbmNsdWRlL2FzbS9ieXRlb3JkZXIuaAorICoKKyAqIEFSTSBFbmRpYW4tbmVzcy4gIEluIGxpdHRsZSBlbmRpYW4gbW9kZSwgdGhlIGRhdGEgYnVzIGlzIGNvbm5lY3RlZCBzdWNoCisgKiB0aGF0IGJ5dGUgYWNjZXNzZXMgYXBwZWFyIGFzOgorICogIDAgPSBkMC4uLmQ3LCAxID0gZDguLi5kMTUsIDIgPSBkMTYuLi5kMjMsIDMgPSBkMjQuLi5kMzEKKyAqIGFuZCB3b3JkIGFjY2Vzc2VzIChkYXRhIG9yIGluc3RydWN0aW9uKSBhcHBlYXIgYXM6CisgKiAgZDAuLi5kMzEKKyAqCisgKiBXaGVuIGluIGJpZyBlbmRpYW4gbW9kZSwgYnl0ZSBhY2Nlc3NlcyBhcHBlYXIgYXM6CisgKiAgMCA9IGQyNC4uLmQzMSwgMSA9IGQxNi4uLmQyMywgMiA9IGQ4Li4uZDE1LCAzID0gZDAuLi5kNworICogYW5kIHdvcmQgYWNjZXNzZXMgKGRhdGEgb3IgaW5zdHJ1Y3Rpb24pIGFwcGVhciBhczoKKyAqICBkMC4uLmQzMQorICovCisjaWZuZGVmIF9fQVNNX0FSTV9TV0FCX0gKKyNkZWZpbmUgX19BU01fQVJNX1NXQUJfSAorCisjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KKyNpbmNsdWRlIDxhc20vdHlwZXMuaD4KKworI2lmICFkZWZpbmVkKF9fU1RSSUNUX0FOU0lfXykgfHwgZGVmaW5lZChfX0tFUk5FTF9fKQorIyAgZGVmaW5lIF9fU1dBQl82NF9USFJVXzMyX18KKyNlbmRpZgorCitzdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX2NvbnN0X18gX191MzIgX19hcmNoX3N3YWIzMihfX3UzMiB4KQoreworCV9fdTMyIHQ7CisKKyNpZm5kZWYgX190aHVtYl9fCisJaWYgKCFfX2J1aWx0aW5fY29uc3RhbnRfcCh4KSkgeworCQkvKgorCQkgKiBUaGUgY29tcGlsZXIgbmVlZHMgYSBiaXQgb2YgYSBoaW50IGhlcmUgdG8gYWx3YXlzIGRvIHRoZQorCQkgKiByaWdodCB0aGluZyBhbmQgbm90IHNjcmV3IGl0IHVwIHRvIGRpZmZlcmVudCBkZWdyZWVzCisJCSAqIGRlcGVuZGluZyBvbiB0aGUgZ2NjIHZlcnNpb24uCisJCSAqLworCQlhc20gKCJlb3JcdCUwLCAlMSwgJTEsIHJvciAjMTYiIDogIj1yIiAodCkgOiAiciIgKHgpKTsKKwl9IGVsc2UKKyNlbmRpZgorCQl0ID0geCBeICgoeCA8PCAxNikgfCAoeCA+PiAxNikpOyAvKiBlb3IgcjEscjAscjAscm9yICMxNiAqLworCisJeCA9ICh4IDw8IDI0KSB8ICh4ID4+IDgpOwkJLyogbW92IHIwLHIwLHJvciAjOCAgICAgICovCisJdCAmPSB+MHgwMEZGMDAwMDsJCQkvKiBiaWMgcjEscjEsIzB4MDBGRjAwMDAgKi8KKwl4IF49ICh0ID4+IDgpOwkJCQkvKiBlb3IgcjAscjAscjEsbHNyICM4ICAgKi8KKworCXJldHVybiB4OworfQorI2RlZmluZSBfX2FyY2hfc3dhYjMyIF9fYXJjaF9zd2FiMzIKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9iaW9zMzIuYyBiL2FyY2gvYXJtL2tlcm5lbC9iaW9zMzIuYwppbmRleCAxN2E1OWI2Li44MDk2ODE5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvYmlvczMyLmMKKysrIGIvYXJjaC9hcm0va2VybmVsL2Jpb3MzMi5jCkBAIC00ODAsMzMgKzQ4MCw2IEBACiAjZW5kaWYKIAogLyoKLSAqIFRoaXMgaXMgdGhlIHN0YW5kYXJkIFBDSS1QQ0kgYnJpZGdlIHN3aXp6bGluZyBhbGdvcml0aG06Ci0gKgotICogICBEZXY6IDAgIDEgIDIgIDMKLSAqICAgIEEgICBBICBCICBDICBECi0gKiAgICBCICAgQiAgQyAgRCAgQQotICogICAgQyAgIEMgIEQgIEEgIEIKLSAqICAgIEQgICBEICBBICBCICBDCi0gKiAgICAgICAgXl5eXl5eXl5eXiBpcnEgcGluIG9uIGJyaWRnZQotICovCi11OCBfX2RldmluaXQgcGNpX3N0ZF9zd2l6emxlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4ICpwaW5wKQotewotCWludCBwaW4gPSAqcGlucCAtIDE7Ci0KLQl3aGlsZSAoZGV2LT5idXMtPnNlbGYpIHsKLQkJcGluID0gKHBpbiArIFBDSV9TTE9UKGRldi0+ZGV2Zm4pKSAmIDM7Ci0JCS8qCi0JCSAqIG1vdmUgdXAgdGhlIGNoYWluIG9mIGJyaWRnZXMsCi0JCSAqIHN3aXp6bGluZyBhcyB3ZSBnby4KLQkJICovCi0JCWRldiA9IGRldi0+YnVzLT5zZWxmOwotCX0KLQkqcGlucCA9IHBpbiArIDE7Ci0KLQlyZXR1cm4gUENJX1NMT1QoZGV2LT5kZXZmbik7Ci19Ci0KLS8qCiAgKiBTd2l6emxlIHRoZSBkZXZpY2UgcGluIGVhY2ggdGltZSB3ZSBjcm9zcyBhIGJyaWRnZS4KICAqIFRoaXMgbWlnaHQgdXBkYXRlIHBpbiBhbmQgcmV0dXJucyB0aGUgc2xvdCBudW1iZXIuCiAgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9lY2FyZC5jIGIvYXJjaC9hcm0va2VybmVsL2VjYXJkLmMKaW5kZXggNjBjMDc5ZC4uZWVkMmY3OSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL2VjYXJkLmMKKysrIGIvYXJjaC9hcm0va2VybmVsL2VjYXJkLmMKQEAgLTgxNyw3ICs4MTcsNyBAQAogCWVjLT5kbWEgPSBOT19ETUE7CiAJZWMtPm9wcyA9ICZlY2FyZF9kZWZhdWx0X29wczsKIAotCXNucHJpbnRmKGVjLT5kZXYuYnVzX2lkLCBzaXplb2YoZWMtPmRldi5idXNfaWQpLCAiZWNhcmQlZCIsIHNsb3QpOworCWRldl9zZXRfbmFtZSgmZWMtPmRldiwgImVjYXJkJWQiLCBzbG90KTsKIAllYy0+ZGV2LnBhcmVudCA9IE5VTEw7CiAJZWMtPmRldi5idXMgPSAmZWNhcmRfYnVzX3R5cGU7CiAJZWMtPmRldi5kbWFfbWFzayA9ICZlYy0+ZG1hX21hc2s7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvaXNhLmMgYi9hcmNoL2FybS9rZXJuZWwvaXNhLmMKaW5kZXggNTBhMzBiYy4uOGFjOWI4NCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL2lzYS5jCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9pc2EuYwpAQCAtMTYsNiArMTYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvc3lzY3RsLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgaXNhX21lbWJhc2UsIGlzYV9wb3J0YmFzZSwgaXNhX3BvcnRzaGlmdDsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL2twcm9iZXMuYyBiL2FyY2gvYXJtL2tlcm5lbC9rcHJvYmVzLmMKaW5kZXggM2Y5YWJlMC4uZjY5MmVmZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL2twcm9iZXMuYworKysgYi9hcmNoL2FybS9rZXJuZWwva3Byb2Jlcy5jCkBAIC05Miw5ICs5Miw3IEBACiB2b2lkIF9fa3Byb2JlcyBhcmNoX3JlbW92ZV9rcHJvYmUoc3RydWN0IGtwcm9iZSAqcCkKIHsKIAlpZiAocC0+YWluc24uaW5zbikgewotCQltdXRleF9sb2NrKCZrcHJvYmVfbXV0ZXgpOwogCQlmcmVlX2luc25fc2xvdChwLT5haW5zbi5pbnNuLCAwKTsKLQkJbXV0ZXhfdW5sb2NrKCZrcHJvYmVfbXV0ZXgpOwogCQlwLT5haW5zbi5pbnNuID0gTlVMTDsKIAl9CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWFhZWMyMDAwL2NvcmUuYyBiL2FyY2gvYXJtL21hY2gtYWFlYzIwMDAvY29yZS5jCmluZGV4IDUwZTEzOTYuLmI1YzVmYzZiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWFhZWMyMDAwL2NvcmUuYworKysgYi9hcmNoL2FybS9tYWNoLWFhZWMyMDAwL2NvcmUuYwpAQCAtMjEyLDcgKzIxMiw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgYW1iYV9kZXZpY2UgY2xjZF9kZXZpY2UgPSB7CiAJLmRldgkJPSB7Ci0JCS5idXNfaWQJCQk9ICJtYjoxNiIsCisJCS5pbml0X25hbWUJCT0gIm1iOjE2IiwKIAkJLmNvaGVyZW50X2RtYV9tYXNrCT0gfjAsCiAJCS5wbGF0Zm9ybV9kYXRhCQk9ICZjbGNkX3BsYXRfZGF0YSwKIAl9LApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFjYXA5LmMgYi9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MWNhcDkuYwppbmRleCAwYTM4YzY5Li43MzM3NjE3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MWNhcDkuYworKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MWNhcDkuYwpAQCAtMTUsNiArMTUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BtLmg+CiAKKyNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MXJtOTIwMC5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFybTkyMDAuYwppbmRleCAyODU5NGZjLi4yZTllY2FkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MXJtOTIwMC5jCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxcm05MjAwLmMKQEAgLTEyLDYgKzEyLDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCisjaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KICNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KICNpbmNsdWRlIDxtYWNoL2F0OTFybTkyMDAuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxc2FtOTI2MC5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFzYW05MjYwLmMKaW5kZXggYWNjYjY5ZS4uMDg5NGYxMCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFzYW05MjYwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFzYW05MjYwLmMKQEAgLTEzLDYgKzEzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wbS5oPgogCisjaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KICNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KICNpbmNsdWRlIDxtYWNoL2NwdS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFzYW05MjYxLmMgYi9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MXNhbTkyNjEuYwppbmRleCA3YjUxYTU5Li4zYWNkN2Q3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MXNhbTkyNjEuYworKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MXNhbTkyNjEuYwpAQCAtMTMsNiArMTMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BtLmg+CiAKKyNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgogI2luY2x1ZGUgPG1hY2gvYXQ5MXNhbTkyNjEuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxc2FtOTI2My5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFzYW05MjYzLmMKaW5kZXggYWRhNGI2Ny4uOTQyNzkyZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFzYW05MjYzLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFzYW05MjYzLmMKQEAgLTEzLDYgKzEzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wbS5oPgogCisjaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KICNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KICNpbmNsdWRlIDxtYWNoL2F0OTFzYW05MjYzLmg+CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MXNhbTlybC5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFzYW05cmwuYwppbmRleCAyNTJlOTU0Li4yMTFjNWMxIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MXNhbTlybC5jCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxc2FtOXJsLmMKQEAgLTEyLDYgKzEyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wbS5oPgogCisjaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KICNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KICNpbmNsdWRlIDxtYWNoL2NwdS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXNhbTlybGVrLmMgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtc2FtOXJsZWsuYwppbmRleCA5YjkzN2VlLi4zNWUxMmE0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtc2FtOXJsZWsuYworKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtc2FtOXJsZWsuYwpAQCAtMjksNiArMjksNyBAQAogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxtYWNoL2JvYXJkLmg+CiAjaW5jbHVkZSA8bWFjaC9ncGlvLmg+CisjaW5jbHVkZSA8bWFjaC9hdDkxc2FtOV9zbWMuaD4KICNpbmNsdWRlIDxtYWNoL2F0OTFfc2hkd2MuaD4KIAogI2luY2x1ZGUgInNhbTlfc21jLmgiCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWNscHM3MTF4L2VkYjcyMTEtbW0uYyBiL2FyY2gvYXJtL21hY2gtY2xwczcxMXgvZWRiNzIxMS1tbS5jCmluZGV4IGM1OGUzMmUuLjBiZWExNDUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtY2xwczcxMXgvZWRiNzIxMS1tbS5jCisrKyBiL2FyY2gvYXJtL21hY2gtY2xwczcxMXgvZWRiNzIxMS1tbS5jCkBAIC0yNCw3ICsyNCw2IEBACiAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KLSNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgogI2luY2x1ZGUgPGFzbS9zaXplcy5oPgogIAogI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1jbHBzNzExeC9mb3J0dW5ldC5jIGIvYXJjaC9hcm0vbWFjaC1jbHBzNzExeC9mb3J0dW5ldC5jCmluZGV4IDcxMjJiM2QuLjc0MzBlNDAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtY2xwczcxMXgvZm9ydHVuZXQuYworKysgYi9hcmNoL2FybS9tYWNoLWNscHM3MTF4L2ZvcnR1bmV0LmMKQEAgLTI0LDcgKzI0LDYgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0cmQuaD4KIAogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KLSNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8YXNtL3NldHVwLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2RldmljZXMuYyBiL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9kZXZpY2VzLmMKaW5kZXggM2Q0YjFkZS4uODA4NjMzZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2RldmljZXMuYworKysgYi9hcmNoL2FybS9tYWNoLWRhdmluY2kvZGV2aWNlcy5jCkBAIC0yMCw2ICsyMCw3IEBACiAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8bWFjaC9pMmMuaD4KKyNpbmNsdWRlIDxtYWNoL2lycXMuaD4KIAogc3RhdGljIHN0cnVjdCByZXNvdXJjZSBpMmNfcmVzb3VyY2VzW10gPSB7CiAJewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2luY2x1ZGUvbWFjaC9ncGlvLmggYi9hcmNoL2FybS9tYWNoLWRhdmluY2kvaW5jbHVkZS9tYWNoL2dwaW8uaAppbmRleCBiM2EyOTYxLi5iNDU2ZjA3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvaW5jbHVkZS9tYWNoL2dwaW8uaAorKysgYi9hcmNoL2FybS9tYWNoLWRhdmluY2kvaW5jbHVkZS9tYWNoL2dwaW8uaApAQCAtMTYsNiArMTYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8YXNtLWdlbmVyaWMvZ3Bpby5oPgogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxtYWNoL2lycXMuaD4KIAogLyoKICAqIGJhc2ljIGdwaW8gcm91dGluZXMKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXA5M3h4L2NvcmUuYyBiL2FyY2gvYXJtL21hY2gtZXA5M3h4L2NvcmUuYwppbmRleCA0NzgxZjMyLi42ZDkxNTJkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWVwOTN4eC9jb3JlLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1lcDkzeHgvY29yZS5jCkBAIC00MDksNyArNDA5LDcgQEAKIAogc3RhdGljIHN0cnVjdCBhbWJhX2RldmljZSB1YXJ0MV9kZXZpY2UgPSB7CiAJLmRldgkJPSB7Ci0JCS5idXNfaWQJCT0gImFwYjp1YXJ0MSIsCisJCS5pbml0X25hbWUJPSAiYXBiOnVhcnQxIiwKIAkJLnBsYXRmb3JtX2RhdGEJPSAmZXA5M3h4X3VhcnRfZGF0YSwKIAl9LAogCS5yZXMJCT0gewpAQCAtNDIzLDcgKzQyMyw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgYW1iYV9kZXZpY2UgdWFydDJfZGV2aWNlID0gewogCS5kZXYJCT0gewotCQkuYnVzX2lkCQk9ICJhcGI6dWFydDIiLAorCQkuaW5pdF9uYW1lCT0gImFwYjp1YXJ0MiIsCiAJCS5wbGF0Zm9ybV9kYXRhCT0gJmVwOTN4eF91YXJ0X2RhdGEsCiAJfSwKIAkucmVzCQk9IHsKQEAgLTQzNyw3ICs0MzcsNyBAQAogCiBzdGF0aWMgc3RydWN0IGFtYmFfZGV2aWNlIHVhcnQzX2RldmljZSA9IHsKIAkuZGV2CQk9IHsKLQkJLmJ1c19pZAkJPSAiYXBiOnVhcnQzIiwKKwkJLmluaXRfbmFtZQk9ICJhcGI6dWFydDMiLAogCQkucGxhdGZvcm1fZGF0YQk9ICZlcDkzeHhfdWFydF9kYXRhLAogCX0sCiAJLnJlcwkJPSB7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvY29tbW9uLmMgYi9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvY29tbW9uLmMKaW5kZXggMzZmZjA2ZC4uYjk3ZjUyOSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL2NvbW1vbi5jCisrKyBiL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9jb21tb24uYwpAQCAtMjgsMTIgKzI4LDE3IEBACiAKICNpbmNsdWRlICJjb21tb24uaCIKIAotZXh0ZXJuIHZvaWQgX19pbml0IGlzYV9pbml0X2lycSh1bnNpZ25lZCBpbnQgaXJxKTsKLQogdW5zaWduZWQgaW50IG1lbV9mY2xrXzIxMjg1ID0gNTAwMDAwMDA7CiAKIEVYUE9SVF9TWU1CT0wobWVtX2ZjbGtfMjEyODUpOwogCitzdGF0aWMgdm9pZCBfX2luaXQgZWFybHlfZmNsayhjaGFyICoqYXJnKQoreworCW1lbV9mY2xrXzIxMjg1ID0gc2ltcGxlX3N0cnRvdWwoKmFyZywgYXJnLCAwKTsKK30KKworX19lYXJseV9wYXJhbSgibWVtX2ZjbGtfMjEyODU9IiwgZWFybHlfZmNsayk7CisKIHN0YXRpYyBpbnQgX19pbml0IHBhcnNlX3RhZ19tZW1jbGsoY29uc3Qgc3RydWN0IHRhZyAqdGFnKQogewogCW1lbV9mY2xrXzIxMjg1ID0gdGFnLT51Lm1lbWNsay5mbWVtY2xrOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL2NvbW1vbi5oIGIvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL2NvbW1vbi5oCmluZGV4IDU4MGUzMWIuLmIwNWU2NjIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9jb21tb24uaAorKysgYi9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvY29tbW9uLmgKQEAgLTcsMyArNyw0IEBACiBleHRlcm4gdm9pZCBmb290YnJpZGdlX21hcF9pbyh2b2lkKTsKIGV4dGVybiB2b2lkIGZvb3RicmlkZ2VfaW5pdF9pcnEodm9pZCk7CiAKK2V4dGVybiB2b2lkIGlzYV9pbml0X2lycSh1bnNpZ25lZCBpbnQgaXJxKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9kYzIxMjg1LmMgYi9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvZGMyMTI4NS5jCmluZGV4IDEzMzA4NjAuLjNmZmE1NDggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9kYzIxMjg1LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL2RjMjEyODUuYwpAQCAtMjg3LDYgKzI4Nyw5IEBACiAJcmV0dXJuIHBjaV9zY2FuX2J1cygwLCAmZGMyMTI4NV9vcHMsIHN5cyk7CiB9CiAKKyNkZWZpbmUgZGMyMTI4NV9yZXF1ZXN0X2lycShfYSwgX2IsIF9jLCBfZCwgX2UpIFwKKwlXQVJOX09OKHJlcXVlc3RfaXJxKF9hLCBfYiwgX2MsIF9kLCBfZSkgPCAwKQorCiB2b2lkIF9faW5pdCBkYzIxMjg1X3ByZWluaXQodm9pZCkKIHsKIAl1bnNpZ25lZCBpbnQgbWVtX3NpemUsIG1lbV9tYXNrOwpAQCAtMzM1LDE2ICszMzgsMTYgQEAKIAkvKgogCSAqIFdlIGRvbid0IGNhcmUgaWYgdGhlc2UgZmFpbC4KIAkgKi8KLQlyZXF1ZXN0X2lycShJUlFfUENJX1NFUlIsIGRjMjEyODVfc2Vycl9pcnEsIElSUUZfRElTQUJMRUQsCi0JCSAgICAiUENJIHN5c3RlbSBlcnJvciIsICZzZXJyX3RpbWVyKTsKLQlyZXF1ZXN0X2lycShJUlFfUENJX1BFUlIsIGRjMjEyODVfcGFyaXR5X2lycSwgSVJRRl9ESVNBQkxFRCwKLQkJICAgICJQQ0kgcGFyaXR5IGVycm9yIiwgJnBlcnJfdGltZXIpOwotCXJlcXVlc3RfaXJxKElSUV9QQ0lfQUJPUlQsIGRjMjEyODVfYWJvcnRfaXJxLCBJUlFGX0RJU0FCTEVELAotCQkgICAgIlBDSSBhYm9ydCIsIE5VTEwpOwotCXJlcXVlc3RfaXJxKElSUV9ESVNDQVJEX1RJTUVSLCBkYzIxMjg1X2Rpc2NhcmRfaXJxLCBJUlFGX0RJU0FCTEVELAotCQkgICAgIkRpc2NhcmQgdGltZXIiLCBOVUxMKTsKLQlyZXF1ZXN0X2lycShJUlFfUENJX0RQRVJSLCBkYzIxMjg1X2RwYXJpdHlfaXJxLCBJUlFGX0RJU0FCTEVELAotCQkgICAgIlBDSSBkYXRhIHBhcml0eSIsIE5VTEwpOworCWRjMjEyODVfcmVxdWVzdF9pcnEoSVJRX1BDSV9TRVJSLCBkYzIxMjg1X3NlcnJfaXJxLCBJUlFGX0RJU0FCTEVELAorCQkJICAgICJQQ0kgc3lzdGVtIGVycm9yIiwgJnNlcnJfdGltZXIpOworCWRjMjEyODVfcmVxdWVzdF9pcnEoSVJRX1BDSV9QRVJSLCBkYzIxMjg1X3Bhcml0eV9pcnEsIElSUUZfRElTQUJMRUQsCisJCQkgICAgIlBDSSBwYXJpdHkgZXJyb3IiLCAmcGVycl90aW1lcik7CisJZGMyMTI4NV9yZXF1ZXN0X2lycShJUlFfUENJX0FCT1JULCBkYzIxMjg1X2Fib3J0X2lycSwgSVJRRl9ESVNBQkxFRCwKKwkJCSAgICAiUENJIGFib3J0IiwgTlVMTCk7CisJZGMyMTI4NV9yZXF1ZXN0X2lycShJUlFfRElTQ0FSRF9USU1FUiwgZGMyMTI4NV9kaXNjYXJkX2lycSwgSVJRRl9ESVNBQkxFRCwKKwkJCSAgICAiRGlzY2FyZCB0aW1lciIsIE5VTEwpOworCWRjMjEyODVfcmVxdWVzdF9pcnEoSVJRX1BDSV9EUEVSUiwgZGMyMTI4NV9kcGFyaXR5X2lycSwgSVJRRl9ESVNBQkxFRCwKKwkJCSAgICAiUENJIGRhdGEgcGFyaXR5IiwgTlVMTCk7CiAKIAlpZiAoY2ZuX21vZGUpIHsKIAkJc3RhdGljIHN0cnVjdCByZXNvdXJjZSBjc3JpbzsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9pc2EtaXJxLmMgYi9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvaXNhLWlycS5jCmluZGV4IDllZTgwYTIuLjhiZmQwNmEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9pc2EtaXJxLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL2lzYS1pcnEuYwpAQCAtMjgsNiArMjgsOCBAQAogI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogCisjaW5jbHVkZSAiY29tbW9uLmgiCisKIHN0YXRpYyB2b2lkIGlzYV9tYXNrX3BpY19sb19pcnEodW5zaWduZWQgaW50IGlycSkKIHsKIAl1bnNpZ25lZCBpbnQgbWFzayA9IDEgPDwgKGlycSAmIDcpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1oNzIweC9oNzIwMi1ldmFsLmMgYi9hcmNoL2FybS9tYWNoLWg3MjB4L2g3MjAyLWV2YWwuYwppbmRleCA1NjE2MWQ1Li44YzBiYTk5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWg3MjB4L2g3MjAyLWV2YWwuYworKysgYi9hcmNoL2FybS9tYWNoLWg3MjB4L2g3MjAyLWV2YWwuYwpAQCAtMjUsNiArMjUsNyBAQAogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KICNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CisjaW5jbHVkZSA8bWFjaC9pcnFzLmg+CiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgImNvbW1vbi5oIgogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWludGVncmF0b3IvY29yZS5jIGIvYXJjaC9hcm0vbWFjaC1pbnRlZ3JhdG9yL2NvcmUuYwppbmRleCBjODljOTQ5Li42Zjg4NzI5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWludGVncmF0b3IvY29yZS5jCisrKyBiL2FyY2gvYXJtL21hY2gtaW50ZWdyYXRvci9jb3JlLmMKQEAgLTM3LDcgKzM3LDcgQEAKIAogc3RhdGljIHN0cnVjdCBhbWJhX2RldmljZSBydGNfZGV2aWNlID0gewogCS5kZXYJCT0gewotCQkuYnVzX2lkCT0gIm1iOjE1IiwKKwkJLmluaXRfbmFtZSA9ICJtYjoxNSIsCiAJfSwKIAkucmVzCQk9IHsKIAkJLnN0YXJ0CT0gSU5URUdSQVRPUl9SVENfQkFTRSwKQEAgLTUwLDcgKzUwLDcgQEAKIAogc3RhdGljIHN0cnVjdCBhbWJhX2RldmljZSB1YXJ0MF9kZXZpY2UgPSB7CiAJLmRldgkJPSB7Ci0JCS5idXNfaWQJPSAibWI6MTYiLAorCQkuaW5pdF9uYW1lID0gIm1iOjE2IiwKIAkJLnBsYXRmb3JtX2RhdGEgPSAmaW50ZWdyYXRvcl91YXJ0X2RhdGEsCiAJfSwKIAkucmVzCQk9IHsKQEAgLTY0LDcgKzY0LDcgQEAKIAogc3RhdGljIHN0cnVjdCBhbWJhX2RldmljZSB1YXJ0MV9kZXZpY2UgPSB7CiAJLmRldgkJPSB7Ci0JCS5idXNfaWQJPSAibWI6MTciLAorCQkuaW5pdF9uYW1lID0gIm1iOjE3IiwKIAkJLnBsYXRmb3JtX2RhdGEgPSAmaW50ZWdyYXRvcl91YXJ0X2RhdGEsCiAJfSwKIAkucmVzCQk9IHsKQEAgLTc4LDcgKzc4LDcgQEAKIAogc3RhdGljIHN0cnVjdCBhbWJhX2RldmljZSBrbWkwX2RldmljZSA9IHsKIAkuZGV2CQk9IHsKLQkJLmJ1c19pZAk9ICJtYjoxOCIsCisJCS5pbml0X25hbWUgPSAibWI6MTgiLAogCX0sCiAJLnJlcwkJPSB7CiAJCS5zdGFydAk9IEtNSTBfQkFTRSwKQEAgLTkxLDcgKzkxLDcgQEAKIAogc3RhdGljIHN0cnVjdCBhbWJhX2RldmljZSBrbWkxX2RldmljZSA9IHsKIAkuZGV2CQk9IHsKLQkJLmJ1c19pZAk9ICJtYjoxOSIsCisJCS5pbml0X25hbWUgPSAibWI6MTkiLAogCX0sCiAJLnJlcwkJPSB7CiAJCS5zdGFydAk9IEtNSTFfQkFTRSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW50ZWdyYXRvci9pbnRlZ3JhdG9yX2NwLmMgYi9hcmNoL2FybS9tYWNoLWludGVncmF0b3IvaW50ZWdyYXRvcl9jcC5jCmluZGV4IDQyN2MyZDguLjRhYzA0MDUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW50ZWdyYXRvci9pbnRlZ3JhdG9yX2NwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1pbnRlZ3JhdG9yL2ludGVncmF0b3JfY3AuYwpAQCAtNDA3LDcgKzQwNyw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgYW1iYV9kZXZpY2UgbW1jX2RldmljZSA9IHsKIAkuZGV2CQk9IHsKLQkJLmJ1c19pZAk9ICJtYjoxYyIsCisJCS5pbml0X25hbWUgPSAibWI6MWMiLAogCQkucGxhdGZvcm1fZGF0YSA9ICZtbWNfZGF0YSwKIAl9LAogCS5yZXMJCT0gewpAQCAtNDIxLDcgKzQyMSw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgYW1iYV9kZXZpY2UgYWFjaV9kZXZpY2UgPSB7CiAJLmRldgkJPSB7Ci0JCS5idXNfaWQJPSAibWI6MWQiLAorCQkuaW5pdF9uYW1lID0gIm1iOjFkIiwKIAl9LAogCS5yZXMJCT0gewogCQkuc3RhcnQJPSBJTlRDUF9QQV9BQUNJX0JBU0UsCkBAIC01MzIsNyArNTMyLDcgQEAKIAogc3RhdGljIHN0cnVjdCBhbWJhX2RldmljZSBjbGNkX2RldmljZSA9IHsKIAkuZGV2CQk9IHsKLQkJLmJ1c19pZAk9ICJtYjpjMCIsCisJCS5pbml0X25hbWUgPSAibWI6YzAiLAogCQkuY29oZXJlbnRfZG1hX21hc2sgPSB+MCwKIAkJLnBsYXRmb3JtX2RhdGEgPSAmY2xjZF9kYXRhLAogCX0sCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWludGVncmF0b3IvcGNpLmMgYi9hcmNoL2FybS9tYWNoLWludGVncmF0b3IvcGNpLmMKaW5kZXggYWY3ZDNmZi4uMmZkYjk1NCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pbnRlZ3JhdG9yL3BjaS5jCisrKyBiL2FyY2gvYXJtL21hY2gtaW50ZWdyYXRvci9wY2kuYwpAQCAtNjMsMTMgKzYzLDcgQEAKICAqCiAgKiBXaGVyZSBBID0gcGluIDEsIEIgPSBwaW4gMiBhbmQgc28gb24gYW5kIHBpbj0wID0gZGVmYXVsdCA9IEEuCiAgKiBUaHVzLCBlYWNoIHN3aXp6bGUgaXMgKChwaW4tMSkgKyAoZGV2aWNlIy00KSkgJSA0Ci0gKgotICogVGhlIGZvbGxvd2luZyBjb2RlIHN3aXp6bGVzIGZvciBleGFjdGx5IG9uZSBicmlkZ2UuICAKICAqLwotc3RhdGljIGlubGluZSBpbnQgYnJpZGdlX3N3aXp6bGUoaW50IHBpbiwgdW5zaWduZWQgaW50IHNsb3QpIAotewotCXJldHVybiAocGluICsgc2xvdCkgJiAzOwotfQogCiAvKgogICogVGhpcyByb3V0aW5lIGhhbmRsZXMgbXVsdGlwbGUgYnJpZGdlcy4KQEAgLTgxLDE1ICs3NSwxNCBAQAogCWlmIChwaW4gPT0gMCkKIAkJcGluID0gMTsKIAotCXBpbiAtPSAxOwogCXdoaWxlIChkZXYtPmJ1cy0+c2VsZikgewotCQlwaW4gPSBicmlkZ2Vfc3dpenpsZShwaW4sIFBDSV9TTE9UKGRldi0+ZGV2Zm4pKTsKKwkJcGluID0gcGNpX3N3aXp6bGVfaW50ZXJydXB0X3BpbihkZXYsIHBpbik7CiAJCS8qCiAJCSAqIG1vdmUgdXAgdGhlIGNoYWluIG9mIGJyaWRnZXMsIHN3aXp6bGluZyBhcyB3ZSBnby4KIAkJICovCiAJCWRldiA9IGRldi0+YnVzLT5zZWxmOwogCX0KLQkqcGlucCA9IHBpbiArIDE7CisJKnBpbnAgPSBwaW47CiAKIAlyZXR1cm4gUENJX1NMT1QoZGV2LT5kZXZmbik7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWtpcmt3b29kL2NvbW1vbi5jIGIvYXJjaC9hcm0vbWFjaC1raXJrd29vZC9jb21tb24uYwppbmRleCA3YjhlZjk3Li5iMzQwNGI3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWtpcmt3b29kL2NvbW1vbi5jCisrKyBiL2FyY2gvYXJtL21hY2gta2lya3dvb2QvY29tbW9uLmMKQEAgLTY5OCw2ICs2OTgsNyBAQAogCXByaW50ayhLRVJOX0lORk8gIktpcmt3b29kOiAlcywgVENMSz0lZC5cbiIsCiAJCWtpcmt3b29kX2lkKCksIGtpcmt3b29kX3RjbGspOwogCWtpcmt3b29kX2dlMDBfc2hhcmVkX2RhdGEudF9jbGsgPSBraXJrd29vZF90Y2xrOworCWtpcmt3b29kX2dlMDFfc2hhcmVkX2RhdGEudF9jbGsgPSBraXJrd29vZF90Y2xrOwogCWtpcmt3b29kX3NwaV9wbGF0X2RhdGEudGNsayA9IGtpcmt3b29kX3RjbGs7CiAJa2lya3dvb2RfdWFydDBfZGF0YVswXS51YXJ0Y2xrID0ga2lya3dvb2RfdGNsazsKIAlraXJrd29vZF91YXJ0MV9kYXRhWzBdLnVhcnRjbGsgPSBraXJrd29vZF90Y2xrOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1raXJrd29vZC9wY2llLmMgYi9hcmNoL2FybS9tYWNoLWtpcmt3b29kL3BjaWUuYwppbmRleCBmNmIwOGYyLi43M2ZjY2FjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWtpcmt3b29kL3BjaWUuYworKysgYi9hcmNoL2FybS9tYWNoLWtpcmt3b29kL3BjaWUuYwpAQCAtMTEsNiArMTEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L21idXMuaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvcGNpLmg+CiAjaW5jbHVkZSA8cGxhdC9wY2llLmg+CiAjaW5jbHVkZSAiY29tbW9uLmgiCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWtzODY5NS9kZXZpY2VzLmMgYi9hcmNoL2FybS9tYWNoLWtzODY5NS9kZXZpY2VzLmMKaW5kZXggMzZhYjBmZC4uYjg5ZmI2ZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1rczg2OTUvZGV2aWNlcy5jCisrKyBiL2FyY2gvYXJtL21hY2gta3M4Njk1L2RldmljZXMuYwpAQCAtMjIsNiArMjIsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAKKyNpbmNsdWRlIDxtYWNoL2lycXMuaD4KICNpbmNsdWRlIDxtYWNoL3JlZ3Mtd2FuLmg+CiAjaW5jbHVkZSA8bWFjaC9yZWdzLWxhbi5oPgogI2luY2x1ZGUgPG1hY2gvcmVncy1ocG5hLmg+CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWxoN2E0MHgvY2xjZC5jIGIvYXJjaC9hcm0vbWFjaC1saDdhNDB4L2NsY2QuYwppbmRleCBhMmE1NDMyLi5jNDcyYjllIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWxoN2E0MHgvY2xjZC5jCisrKyBiL2FyY2gvYXJtL21hY2gtbGg3YTQweC9jbGNkLmMKQEAgLTIwNyw3ICsyMDcsNyBAQAogc3RhdGljIHN0cnVjdCBhbWJhX2RldmljZSBuYW1lIyNfZGV2aWNlID0gewkJCVwKIAkuZGV2ID0gewkJCQkJCVwKIAkJLmNvaGVyZW50X2RtYV9tYXNrID0gfjAsCQkJXAotCQkuYnVzX2lkCT0gYnVzaWQsCQkJCVwKKwkJLmluaXRfbmFtZSA9IGJ1c2lkLAkJCQlcCiAJCS5wbGF0Zm9ybV9kYXRhID0gcGxhdCwJCQkJXAogCQl9LAkJCQkJCVwKIAkucmVzID0gewkJCQkJCVwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL2RldmljZXMuYyBiL2FyY2gvYXJtL21hY2gtbXNtL2RldmljZXMuYwppbmRleCBmMmE3NGI5Li4zMWI2YjMwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW1zbS9kZXZpY2VzLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1tc20vZGV2aWNlcy5jCkBAIC0xNiw2ICsxNiw3IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAKKyNpbmNsdWRlIDxtYWNoL2lycXMuaD4KICNpbmNsdWRlIDxtYWNoL21zbV9pb21hcC5oPgogI2luY2x1ZGUgImRldmljZXMuaCIKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tdjc4eHgwL3BjaWUuYyBiL2FyY2gvYXJtL21hY2gtbXY3OHh4MC9wY2llLmMKaW5kZXggNDMwZWE4NC4uYWFkM2E3YSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1tdjc4eHgwL3BjaWUuYworKysgYi9hcmNoL2FybS9tYWNoLW12Nzh4eDAvcGNpZS5jCkBAIC0xMSw2ICsxMSw3IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvbWJ1cy5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vbWFjaC9wY2kuaD4KICNpbmNsdWRlIDxwbGF0L3BjaWUuaD4KICNpbmNsdWRlICJjb21tb24uaCIKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXgyL2RldmljZXMuYyBiL2FyY2gvYXJtL21hY2gtbXgyL2RldmljZXMuYwppbmRleCBhZjEyMWY1Li4yZjkyNDBiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW14Mi9kZXZpY2VzLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1teDIvZGV2aWNlcy5jCkBAIC0zMiw2ICszMiw3IEBACiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogCisjaW5jbHVkZSA8bWFjaC9pcnFzLmg+CiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogCiAvKgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1teDMvZGV2aWNlcy5jIGIvYXJjaC9hcm0vbWFjaC1teDMvZGV2aWNlcy5jCmluZGV4IDFkNDZjYjQuLmY4NDI4ODAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXgzL2RldmljZXMuYworKysgYi9hcmNoL2FybS9tYWNoLW14My9kZXZpY2VzLmMKQEAgLTIyLDYgKzIyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KICNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPG1hY2gvaXJxcy5oPgogI2luY2x1ZGUgPG1hY2gvaW14LXVhcnQuaD4KIAogc3RhdGljIHN0cnVjdCByZXNvdXJjZSB1YXJ0MFtdID0gewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1uZXR4L2ZiLmMgYi9hcmNoL2FybS9tYWNoLW5ldHgvZmIuYwppbmRleCA4ZjFmOTkyLi4xZDg0NGUyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW5ldHgvZmIuYworKysgYi9hcmNoL2FybS9tYWNoLW5ldHgvZmIuYwpAQCAtMjQsNiArMjQsOCBAQAogI2luY2x1ZGUgPGxpbnV4L2FtYmEvY2xjZC5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogCisjaW5jbHVkZSA8YXNtL2lycS5oPgorCiAjaW5jbHVkZSA8bWFjaC9uZXR4LXJlZ3MuaD4KICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAKQEAgLTkxLDcgKzkzLDcgQEAKIAogc3RhdGljIHN0cnVjdCBhbWJhX2RldmljZSBmYl9kZXZpY2UgPSB7CiAJLmRldgkJPSB7Ci0JCS5idXNfaWQJPSAiZmIiLAorCQkuaW5pdF9uYW1lID0gImZiIiwKIAkJLmNvaGVyZW50X2RtYV9tYXNrID0gfjAsCiAJfSwKIAkucmVzCQk9IHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbmV0eC90aW1lLmMgYi9hcmNoL2FybS9tYWNoLW5ldHgvdGltZS5jCmluZGV4IGQ1MWQ2MjcuLmYyMDFmZGQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbmV0eC90aW1lLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1uZXR4L3RpbWUuYwpAQCAtMTYzLDcgKzE2Myw3IEBACiAJICogQWRkaW5nIHNvbWUgc2FmZXR5IC4uLiAqLwogCW5ldHhfY2xvY2tldmVudC5taW5fZGVsdGFfbnMgPQogCQljbG9ja2V2ZW50X2RlbHRhMm5zKDB4YTAwLCAmbmV0eF9jbG9ja2V2ZW50KTsKLQluZXR4X2Nsb2NrZXZlbnQuY3B1bWFzayA9IGNwdW1hc2tfb2ZfY3B1KDApOworCW5ldHhfY2xvY2tldmVudC5jcHVtYXNrID0gY3B1bWFza19vZigwKTsKIAljbG9ja2V2ZW50c19yZWdpc3Rlcl9kZXZpY2UoJm5ldHhfY2xvY2tldmVudCk7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbmV0eC94Yy5jIGIvYXJjaC9hcm0vbWFjaC1uZXR4L3hjLmMKaW5kZXggOGZjNjIwNS4uMTgxYTc4YiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1uZXR4L3hjLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1uZXR4L3hjLmMKQEAgLTI0LDYgKzI0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pby5oPgogCiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPG1hY2gvaXJxcy5oPgogI2luY2x1ZGUgPG1hY2gvbmV0eC1yZWdzLmg+CiAKICNpbmNsdWRlIDxtYWNoL3hjLmg+CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAxL21jYnNwLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAxL21jYnNwLmMKaW5kZXggN2RlN2M2OS4uNDQ3NGRhNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9tY2JzcC5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDEvbWNic3AuYwpAQCAtMTgsNiArMTgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogCiAjaW5jbHVkZSA8bWFjaC9kbWEuaD4KKyNpbmNsdWRlIDxtYWNoL2lycXMuaD4KICNpbmNsdWRlIDxtYWNoL211eC5oPgogI2luY2x1ZGUgPG1hY2gvY3B1Lmg+CiAjaW5jbHVkZSA8bWFjaC9tY2JzcC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9jbG9jazI0eHguaCBiL2FyY2gvYXJtL21hY2gtb21hcDIvY2xvY2syNHh4LmgKaW5kZXggZmY2Y2QxNC4uYWQ2ZDk4ZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9jbG9jazI0eHguaAorKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2Nsb2NrMjR4eC5oCkBAIC0yMzIxLDcgKzIzMjEsNyBAQAogfTsKIAogc3RhdGljIHN0cnVjdCBjbGsgaTJjaHMyX2ZjayA9IHsKLQkubmFtZQkJPSAiaTJjaHNfZmNrIiwKKwkubmFtZQkJPSAiaTJjX2ZjayIsCiAJLmlkCQk9IDIsCiAJLnBhcmVudAkJPSAmZnVuY185Nm1fY2ssCiAJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAyNDNYLApAQCAtMjM1NCw3ICsyMzU0LDcgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgY2xrIGkyY2hzMV9mY2sgPSB7Ci0JLm5hbWUJCT0gImkyY2hzX2ZjayIsCisJLm5hbWUJCT0gImkyY19mY2siLAogCS5pZAkJPSAxLAogCS5wYXJlbnQJCT0gJmZ1bmNfOTZtX2NrLAogCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMjQzWCwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvbWNic3AuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvbWNic3AuYwppbmRleCBjYWUzZWJlLi5hY2RjNzA5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL21jYnNwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9tY2JzcC5jCkBAIC0xOCw2ICsxOCw3IEBACiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAKICNpbmNsdWRlIDxtYWNoL2RtYS5oPgorI2luY2x1ZGUgPG1hY2gvaXJxcy5oPgogI2luY2x1ZGUgPG1hY2gvbXV4Lmg+CiAjaW5jbHVkZSA8bWFjaC9jcHUuaD4KICNpbmNsdWRlIDxtYWNoL21jYnNwLmg+CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9yaW9uNXgvcGNpLmMgYi9hcmNoL2FybS9tYWNoLW9yaW9uNXgvcGNpLmMKaW5kZXggYTdiN2Q3Ny4uZDBhNzg1YSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L3BjaS5jCisrKyBiL2FyY2gvYXJtL21hY2gtb3Jpb241eC9wY2kuYwpAQCAtMTMsNiArMTMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L21idXMuaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvcGNpLmg+CiAjaW5jbHVkZSA8cGxhdC9wY2llLmg+CiAjaW5jbHVkZSAiY29tbW9uLmgiCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXBueDQwMDgvZ3Bpby5jIGIvYXJjaC9hcm0vbWFjaC1wbng0MDA4L2dwaW8uYwppbmRleCAwMTVjYzIxLi5mMjE5OTE0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXBueDQwMDgvZ3Bpby5jCisrKyBiL2FyY2gvYXJtL21hY2gtcG54NDAwOC9ncGlvLmMKQEAgLTE4LDYgKzE4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxtYWNoL3BsYXRmb3JtLmg+CiAjaW5jbHVkZSA8bWFjaC9ncGlvLmg+CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcG54NDAwOC9pMmMuYyBiL2FyY2gvYXJtL21hY2gtcG54NDAwOC9pMmMuYwppbmRleCA4N2MwOTMyLi5mM2ZlYTI5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXBueDQwMDgvaTJjLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1wbng0MDA4L2kyYy5jCkBAIC0xNSw2ICsxNSw3IEBACiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bWFjaC9wbGF0Zm9ybS5oPgorI2luY2x1ZGUgPG1hY2gvaXJxcy5oPgogI2luY2x1ZGUgPG1hY2gvaTJjLmg+CiAKIHN0YXRpYyBpbnQgc2V0X2Nsb2NrX3J1bihzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvZTM1MC5jIGIvYXJjaC9hcm0vbWFjaC1weGEvZTM1MC5jCmluZGV4IDI1MTEyOTMuLmVkY2Q5ZDUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL2UzNTAuYworKysgYi9hcmNoL2FybS9tYWNoLXB4YS9lMzUwLmMKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KIAorI2luY2x1ZGUgPG1hY2gvaXJxcy5oPgogI2luY2x1ZGUgPG1hY2gvbWZwLXB4YTI1eC5oPgogI2luY2x1ZGUgPG1hY2gvcHhhLXJlZ3MuaD4KICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9lNDAwLmMgYi9hcmNoL2FybS9tYWNoLXB4YS9lNDAwLmMKaW5kZXggYmVkMDMzNi4uNzdiYjhlMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvZTQwMC5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL2U0MDAuYwpAQCAtMjgsNiArMjgsNyBAQAogI2luY2x1ZGUgPG1hY2gvZXNlcmllcy1ncGlvLmg+CiAjaW5jbHVkZSA8bWFjaC9weGFmYi5oPgogI2luY2x1ZGUgPG1hY2gvdWRjLmg+CisjaW5jbHVkZSA8bWFjaC9pcnFzLmg+CiAKICNpbmNsdWRlICJnZW5lcmljLmgiCiAjaW5jbHVkZSAiZXNlcmllcy5oIgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvZTc0MC5jIGIvYXJjaC9hcm0vbWFjaC1weGEvZTc0MC5jCmluZGV4IGIwMGQ2NzAuLjZkNDhlMDAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL2U3NDAuYworKysgYi9hcmNoL2FybS9tYWNoLXB4YS9lNzQwLmMKQEAgLTMwLDYgKzMwLDcgQEAKICNpbmNsdWRlIDxtYWNoL2VzZXJpZXMtZ3Bpby5oPgogI2luY2x1ZGUgPG1hY2gvdWRjLmg+CiAjaW5jbHVkZSA8bWFjaC9pcmRhLmg+CisjaW5jbHVkZSA8bWFjaC9pcnFzLmg+CiAKICNpbmNsdWRlICJnZW5lcmljLmgiCiAjaW5jbHVkZSAiZXNlcmllcy5oIgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvZTc1MC5jIGIvYXJjaC9hcm0vbWFjaC1weGEvZTc1MC5jCmluZGV4IDg0ZDdjMWEuLmJlMWFiOGUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL2U3NTAuYworKysgYi9hcmNoL2FybS9tYWNoLXB4YS9lNzUwLmMKQEAgLTI5LDYgKzI5LDcgQEAKICNpbmNsdWRlIDxtYWNoL2VzZXJpZXMtZ3Bpby5oPgogI2luY2x1ZGUgPG1hY2gvdWRjLmg+CiAjaW5jbHVkZSA8bWFjaC9pcmRhLmg+CisjaW5jbHVkZSA8bWFjaC9pcnFzLmg+CiAKICNpbmNsdWRlICJnZW5lcmljLmgiCiAjaW5jbHVkZSAiZXNlcmllcy5oIgpAQCAtMTA1LDYgKzEwNiw1NyBAQAogCS5yZXNvdXJjZSAgICAgICA9IGU3NTBfZmJfcmVzb3VyY2VzLAogfTsKIAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0gZTc1MCBNRlAgcGFyYW1ldGVycyAtLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBlNzUwX3Bpbl9jb25maWdbXSBfX2luaXRkYXRhID0geworCS8qIENoaXAgc2VsZWN0cyAqLworCUdQSU8xNV9uQ1NfMSwgICAvKiBDUzEgLSBGbGFzaCAqLworCUdQSU83OV9uQ1NfMywgICAvKiBDUzMgLSBJTUFHRU9OICovCisJR1BJTzgwX25DU180LCAgIC8qIENTNCAtIFRNSU8gKi8KKworCS8qIENsb2NrcyAqLworCUdQSU8xMV8zXzZNSHosCisKKwkvKiBCVFVBUlQgKi8KKwlHUElPNDJfQlRVQVJUX1JYRCwKKwlHUElPNDNfQlRVQVJUX1RYRCwKKwlHUElPNDRfQlRVQVJUX0NUUywKKworCS8qIFRNSU8gY29udHJvbGxlciAqLworCUdQSU8xOV9HUElPLCAvKiB0N2w2NnhiICNQQ0xSICovCisJR1BJTzQ1X0dQSU8sIC8qIHQ3bDY2eGIgI1NVU1BFTkQgKE5PVCBCVFVBUlQhKSAqLworCisJLyogVURDICovCisJR1BJTzEzX0dQSU8sCisJR1BJTzNfR1BJTywKKworCS8qIElyREEgKi8KKwlHUElPMzhfR1BJTyB8IE1GUF9MUE1fRFJJVkVfSElHSCwKKworCS8qIFBDIENhcmQgKi8KKwlHUElPOF9HUElPLCAgIC8qIENEMCAqLworCUdQSU80NF9HUElPLCAgLyogQ0QxICovCisJR1BJTzExX0dQSU8sICAvKiBJUlEwICovCisJR1BJTzZfR1BJTywgICAvKiBJUlExICovCisJR1BJTzI3X0dQSU8sICAvKiBSU1QwICovCisJR1BJTzI0X0dQSU8sICAvKiBSU1QxICovCisJR1BJTzIwX0dQSU8sICAvKiBQV1IwICovCisJR1BJTzIzX0dQSU8sICAvKiBQV1IxICovCisJR1BJTzQ4X25QT0UsCisJR1BJTzQ5X25QV0UsCisJR1BJTzUwX25QSU9SLAorCUdQSU81MV9uUElPVywKKwlHUElPNTJfblBDRV8xLAorCUdQSU81M19uUENFXzIsCisJR1BJTzU0X25QU0tUU0VMLAorCUdQSU81NV9uUFJFRywKKwlHUElPNTZfblBXQUlULAorCUdQSU81N19uSU9JUzE2LAorCisJLyogd2FrZXVwICovCisJR1BJTzBfR1BJTyB8IFdBS0VVUF9PTl9FREdFX1JJU0UsCit9OworCiAvKiAtLS0tLS0tLS0tLS0tLS0tLSBlNzUwIHRjNjM5M3hiIHBhcmFtZXRlcnMgLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKIHN0YXRpYyBzdHJ1Y3QgdGM2MzkzeGJfcGxhdGZvcm1fZGF0YSBlNzUwX3RjNjM5M3hiX2luZm8gPSB7CkBAIC0xMzcsNiArMTg5LDcgQEAKIAogc3RhdGljIHZvaWQgX19pbml0IGU3NTBfaW5pdCh2b2lkKQogeworCXB4YTJ4eF9tZnBfY29uZmlnKEFSUkFZX0FORF9TSVpFKGU3NTBfcGluX2NvbmZpZykpOwogCWNsa19hZGRfYWxpYXMoIkNMS19DSzNQNk1JIiwgJmU3NTBfdGM2MzkzeGJfZGV2aWNlLmRldiwKIAkJCSJHUElPMTFfQ0xLIiwgTlVMTCksCiAJZXNlcmllc19nZXRfdG1pb19ncGlvcygpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvZTgwMC5jIGIvYXJjaC9hcm0vbWFjaC1weGEvZTgwMC5jCmluZGV4IDlhODZhNDIuLmNjOWIxMjkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL2U4MDAuYworKysgYi9hcmNoL2FybS9tYWNoLXB4YS9lODAwLmMKQEAgLTI4LDYgKzI4LDcgQEAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8bWFjaC9lc2VyaWVzLWdwaW8uaD4KICNpbmNsdWRlIDxtYWNoL3VkYy5oPgorI2luY2x1ZGUgPG1hY2gvaXJxcy5oPgogCiAjaW5jbHVkZSAiZ2VuZXJpYy5oIgogI2luY2x1ZGUgImVzZXJpZXMuaCIKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9weGEzeHgtcmVncy5oIGIvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL3B4YTN4eC1yZWdzLmgKaW5kZXggYjFmY2QxMC4uYmNmM2ZiMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL3B4YTN4eC1yZWdzLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL3B4YTN4eC1yZWdzLmgKQEAgLTE5MywxMCArMTkzLDggQEAKICNkZWZpbmUgQ0tFTl9NSU5JX0lNCTQ4CS8qIDwgTWluaS1JTSAqLwogI2RlZmluZSBDS0VOX01JTklfTENECTQ5CS8qIDwgTWluaSBMQ0QgKi8KIAotI2lmIGRlZmluZWQoQ09ORklHX0NQVV9QWEEzMTApCiAjZGVmaW5lIENLRU5fTU1DMwk1CS8qIDwgTU1DMyBDbG9jayBFbmFibGUgKi8KICNkZWZpbmUgQ0tFTl9NVkVECTQzCS8qIDwgTVZFRCBjbG9jayBlbmFibGUgKi8KLSNlbmRpZgogCiAvKiBOb3RlOiBHQ1UgY2xvY2sgZW5hYmxlIGJpdCBkaWZmZXJzIG9uIFBYQTMwMC9QWEEzMTAgYW5kIFBYQTMyMCAqLwogI2RlZmluZSBQWEEzMDBfQ0tFTl9HUkFQSElDUwk0MgkvKiBHcmFwaGljcyBjb250cm9sbGVyIGNsb2NrIGVuYWJsZSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL3B4YTkzMF9yb3RhcnkuaCBiL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9weGE5MzBfcm90YXJ5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDUzNTg3YwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9weGE5MzBfcm90YXJ5LmgKQEAgLTAsMCArMSwyMCBAQAorI2lmbmRlZiBfX0FTTV9BUkNIX1BYQTkzMF9ST1RBUllfSAorI2RlZmluZSBfX0FTTV9BUkNIX1BYQTkzMF9ST1RBUllfSAorCisvKiBOT1RFOgorICoKKyAqIHJvdGFyeSBjYW4gYmUgZWl0aGVyIGludGVycHJldGVkIGFzIGEgcmFsYXRpdmUgaW5wdXQgZXZlbnQgKGUuZy4KKyAqIFJFTF9XSEVFTCBvciBSRUxfSFdIRUVMKSBvciBhIHNwZWNpZmljIGtleSBldmVudCAoZS5nLiBVUC9ET1dOCisgKiBvciBMRUZUL1JJR0hUKSwgZGVwZW5kaW5nIG9uIGlmIHVwX2tleSAmIGRvd25fa2V5IGFyZSBhc3NpZ25lZAorICogb3IgcmVsX2NvZGUgaXMgYXNzaWduZWQgYSBub24temVybyB2YWx1ZS4gV2hlbiBhbGwgYXJlIG5vbi16ZXJvLAorICogdXBfa2V5IGFuZCBkb3duX2tleSB3aWxsIGJlIHByZWZlcnJlZC4KKyAqLworc3RydWN0IHB4YTkzMF9yb3RhcnlfcGxhdGZvcm1fZGF0YSB7CisJaW50CXVwX2tleTsKKwlpbnQJZG93bl9rZXk7CisJaW50CXJlbF9jb2RlOworfTsKKwordm9pZCBfX2luaXQgcHhhOTMwX3NldF9yb3RhcnlrZXlfaW5mbyhzdHJ1Y3QgcHhhOTMwX3JvdGFyeV9wbGF0Zm9ybV9kYXRhICppbmZvKTsKKworI2VuZGlmIC8qIF9fQVNNX0FSQ0hfUFhBOTMwX1JPVEFSWV9IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvcHhhOTMwX3Rya2JhbGwuaCBiL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9weGE5MzBfdHJrYmFsbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlMDc4OWIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvcHhhOTMwX3Rya2JhbGwuaApAQCAtMCwwICsxLDEwIEBACisjaWZuZGVmIF9fQVNNX0FSQ0hfUFhBOTMwX1RSS0JBTExfSAorI2RlZmluZSBfX0FTTV9BUkNIX1BYQTkzMF9UUktCQUxMX0gKKworc3RydWN0IHB4YTkzMF90cmtiYWxsX3BsYXRmb3JtX2RhdGEgeworCWludCB4X2ZpbHRlcjsKKwlpbnQgeV9maWx0ZXI7Cit9OworCisjZW5kaWYgLyogX19BU01fQVJDSF9QWEE5MzBfVFJLQkFMTF9IICovCisKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvY29yZS5oIGIvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9jb3JlLmgKaW5kZXggNjNiZTJhYi4uNDQyNjliMSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9jb3JlLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9jb3JlLmgKQEAgLTMxLDcgKzMxLDcgQEAKIHN0YXRpYyBzdHJ1Y3QgYW1iYV9kZXZpY2UgbmFtZSMjX2RldmljZSA9IHsJCQlcCiAJLmRldgkJPSB7CQkJCQlcCiAJCS5jb2hlcmVudF9kbWFfbWFzayA9IH4wLAkJCVwKLQkJLmJ1c19pZAk9IGJ1c2lkLAkJCQlcCisJCS5pbml0X25hbWUgPSBidXNpZCwJCQkJXAogCQkucGxhdGZvcm1fZGF0YSA9IHBsYXQsCQkJCVwKIAl9LAkJCQkJCQlcCiAJLnJlcwkJPSB7CQkJCQlcCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L3BsYXRzbXAuYyBiL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvcGxhdHNtcC5jCmluZGV4IDhmY2U4NWYuLmVhM2M3NTUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvcGxhdHNtcC5jCisrKyBiL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvcGxhdHNtcC5jCkBAIC0xMiw2ICsxMiw3IEBACiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KICNpbmNsdWRlIDxsaW51eC9zbXAuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvaW5jbHVkZS9tYWNoL2dwaW8uaCBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9pbmNsdWRlL21hY2gvZ3Bpby5oCmluZGV4IGUwMzQ5YWYuLjAwNDc2YTUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9pbmNsdWRlL21hY2gvZ3Bpby5oCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9pbmNsdWRlL21hY2gvZ3Bpby5oCkBAIC0xNCw2ICsxNCw3IEBACiAjZGVmaW5lIGdwaW9fZ2V0X3ZhbHVlCV9fZ3Bpb19nZXRfdmFsdWUKICNkZWZpbmUgZ3Bpb19zZXRfdmFsdWUJX19ncGlvX3NldF92YWx1ZQogI2RlZmluZSBncGlvX2NhbnNsZWVwCV9fZ3Bpb19jYW5zbGVlcAorI2RlZmluZSBncGlvX3RvX2lycQlfX2dwaW9fdG9faXJxCiAKIC8qIHNvbWUgYm9hcmRzIHJlcXVpcmUgZXh0cmEgZ3BpbyBjYXBhY2l0eSB0byBzdXBwb3J0IGV4dGVybmFsCiAgKiBkZXZpY2VzIHRoYXQgbmVlZCBHUElPLgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2luY2x1ZGUvbWFjaC9pcnFzLmggYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvaW5jbHVkZS9tYWNoL2lycXMuaAppbmRleCA5NTY1OTAzLi40OWVmY2U4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvaW5jbHVkZS9tYWNoL2lycXMuaAorKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvaW5jbHVkZS9tYWNoL2lycXMuaApAQCAtMTIsMTAgKzEyLDYgQEAKICNpZm5kZWYgX19BU01fQVJDSF9JUlFTX0gKICNkZWZpbmUgX19BU01fQVJDSF9JUlFTX0ggX19GSUxFX18KIAotI2lmbmRlZiBfX0FTTV9BUk1fSVJRX0gKLSNlcnJvciAiRG8gbm90IGluY2x1ZGUgdGhpcyBkaXJlY3RseSwgaW5zdGVhZCAjaW5jbHVkZSA8YXNtL2lycS5oPiIKLSNlbmRpZgotCiAvKiB3ZSBrZWVwIHRoZSBmaXJzdCBzZXQgb2YgQ1BVIElSUXMgb3V0IG9mIHRoZSByYW5nZSBvZgogICogdGhlIElTQSBzcGFjZSwgc28gdGhhdCB0aGUgUEMxMDQgaGFzIHRoZW0gdG8gaXRzZWxmCiAgKiBhbmQgd2UgZG9uJ3QgZW5kIHVwIGhhdmluZyB0byBkbyBob3JyaWJsZSB0aGluZ3MgdG8gdGhlCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvaW5jbHVkZS9tYWNoL3NwaS5oIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2luY2x1ZGUvbWFjaC9zcGkuaAppbmRleCA3NzRmM2FkLi4xZDMwMGZiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvaW5jbHVkZS9tYWNoL3NwaS5oCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9pbmNsdWRlL21hY2gvc3BpLmgKQEAgLTE0LDcgKzE0LDcgQEAKICNkZWZpbmUgX19BU01fQVJDSF9TUElfSCBfX0ZJTEVfXwogCiBzdHJ1Y3QgczNjMjQxMF9zcGlfaW5mbyB7Ci0JdW5zaWduZWQgbG9uZwkJIHBpbl9jczsJLyogc2ltcGxlIGdwaW8gY3MgKi8KKwlpbnQJCQkgcGluX2NzOwkvKiBzaW1wbGUgZ3BpbyBjcyAqLwogCXVuc2lnbmVkIGludAkJIG51bV9jczsJLyogdG90YWwgY2hpcHNlbGVjdHMgKi8KIAlpbnQJCQkgYnVzX251bTsgICAgICAgLyogYnVzIG51bWJlciB0byB1c2UuICovCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQ0MC9tYWNoLWF0MjQ0MGV2Yi5jIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDQwL21hY2gtYXQyNDQwZXZiLmMKaW5kZXggMGE2ZDBhNS4uMzE1YzQyZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDQwL21hY2gtYXQyNDQwZXZiLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDQwL21hY2gtYXQyNDQwZXZiLmMKQEAgLTQ3LDcgKzQ3LDcgQEAKICNpbmNsdWRlIDxwbGF0L2Nsb2NrLmg+CiAjaW5jbHVkZSA8cGxhdC9kZXZzLmg+CiAjaW5jbHVkZSA8cGxhdC9jcHUuaD4KLSNpbmNsdWRlIDxhc20vcGxhdC1zM2MyNHh4L21jaS5oPgorI2luY2x1ZGUgPHBsYXQvbWNpLmg+CiAKIHN0YXRpYyBzdHJ1Y3QgbWFwX2Rlc2MgYXQyNDQwZXZiX2lvZGVzY1tdIF9faW5pdGRhdGEgPSB7CiAJLyogTm90aGluZyBoZXJlICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzY0MDAvaW5jbHVkZS9tYWNoL2lycXMuaCBiL2FyY2gvYXJtL21hY2gtczNjNjQwMC9pbmNsdWRlL21hY2gvaXJxcy5oCmluZGV4IGIzOGM0N2MuLjRjOTdmOWEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjNjQwMC9pbmNsdWRlL21hY2gvaXJxcy5oCisrKyBiL2FyY2gvYXJtL21hY2gtczNjNjQwMC9pbmNsdWRlL21hY2gvaXJxcy5oCkBAIC0xMSwxMCArMTEsNiBAQAogI2lmbmRlZiBfX0FTTV9BUkNIX0lSUVNfSAogI2RlZmluZSBfX0FTTV9BUkNIX0lSUVNfSCBfX0ZJTEVfXwogCi0jaWZuZGVmIF9fQVNNX0FSTV9JUlFfSAotI2Vycm9yICJEbyBub3QgaW5jbHVkZSB0aGlzIGRpcmVjdGx5LCBpbnN0ZWFkICNpbmNsdWRlIDxhc20vaXJxLmg+IgotI2VuZGlmCi0KICNpbmNsdWRlIDxwbGF0L2lycXMuaD4KIAogI2VuZGlmIC8qIF9fQVNNX0FSQ0hfSVJRX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdmVyc2F0aWxlL2NvcmUuaCBiL2FyY2gvYXJtL21hY2gtdmVyc2F0aWxlL2NvcmUuaAppbmRleCBhZmNhYTg1Li45ZDM5ODg2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXZlcnNhdGlsZS9jb3JlLmgKKysrIGIvYXJjaC9hcm0vbWFjaC12ZXJzYXRpbGUvY29yZS5oCkBAIC0zNCw3ICszNCw3IEBACiBzdGF0aWMgc3RydWN0IGFtYmFfZGV2aWNlIG5hbWUjI19kZXZpY2UgPSB7CQkJXAogCS5kZXYJCT0gewkJCQkJXAogCQkuY29oZXJlbnRfZG1hX21hc2sgPSB+MCwJCQlcCi0JCS5idXNfaWQJPSBidXNpZCwJCQkJXAorCQkuaW5pdF9uYW1lID0gYnVzaWQsCQkJCVwKIAkJLnBsYXRmb3JtX2RhdGEgPSBwbGF0LAkJCQlcCiAJfSwJCQkJCQkJXAogCS5yZXMJCT0gewkJCQkJXApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL3VzYi5oIGIvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL3VzYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkYWNiMzAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvdXNiLmgKQEAgLTAsMCArMSwyMyBAQAorLyoKKyAqCUNvcHlyaWdodCAoQykgMjAwOCBEYXJpdXMgQXVndWxpcyA8YXVndWxpcy5kYXJpdXNAZ21haWwuY29tPgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKglpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICoJdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqCShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKglidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICoJTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICoJR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaWZuZGVmIF9fQVNNX0FSQ0hfTVhDX1VTQgorI2RlZmluZSBfX0FTTV9BUkNIX01YQ19VU0IKKworc3RydWN0IGlteHVzYl9wbGF0Zm9ybV9kYXRhIHsKKwlpbnQgKCppbml0KShzdHJ1Y3QgZGV2aWNlICopOworCWludCAoKmV4aXQpKHN0cnVjdCBkZXZpY2UgKik7Cit9OworCisjZW5kaWYgLyogX19BU01fQVJDSF9NWENfVVNCICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW9tYXAvaTJjLmMgYi9hcmNoL2FybS9wbGF0LW9tYXAvaTJjLmMKaW5kZXggODlhNmFiMC4uNDY3NTMxZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1vbWFwL2kyYy5jCisrKyBiL2FyY2gvYXJtL3BsYXQtb21hcC9pMmMuYwpAQCAtMjYsNiArMjYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPG1hY2gvaXJxcy5oPgogI2luY2x1ZGUgPG1hY2gvbXV4Lmg+CiAKICNkZWZpbmUgT01BUF9JMkNfU0laRQkJMHgzZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvbWFjaC9tZW1vcnkuaCBiL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL21hY2gvbWVtb3J5LmgKaW5kZXggMjExYzlmNi4uZDZiNWNhNiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvbWFjaC9tZW1vcnkuaAorKysgYi9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9tYWNoL21lbW9yeS5oCkBAIC01OSw3ICs1OSw3IEBACiAKICNkZWZpbmUgdmlydF90b19sYnVzKHgpCQkoKHgpIC0gUEFHRV9PRkZTRVQgKyBPTUFQMTUxMF9MQl9PRkZTRVQpCiAjZGVmaW5lIGxidXNfdG9fdmlydCh4KQkJKCh4KSAtIE9NQVAxNTEwX0xCX09GRlNFVCArIFBBR0VfT0ZGU0VUKQotI2RlZmluZSBpc19sYnVzX2RldmljZShkZXYpCShjcHVfaXNfb21hcDE1eHgoKSAmJiBkZXYgJiYgKHN0cm5jbXAoZGV2LT5idXNfaWQsICJvaGNpIiwgNCkgPT0gMCkpCisjZGVmaW5lIGlzX2xidXNfZGV2aWNlKGRldikJKGNwdV9pc19vbWFwMTV4eCgpICYmIGRldiAmJiAoc3RybmNtcChkZXZfbmFtZShkZXYpLCAib2hjaSIsIDQpID09IDApKQogCiAjZGVmaW5lIF9fYXJjaF9wYWdlX3RvX2RtYShkZXYsIHBhZ2UpCSh7aXNfbGJ1c19kZXZpY2UoZGV2KSA/IFwKIAkJCQkJKGRtYV9hZGRyX3QpdmlydF90b19sYnVzKHBhZ2VfYWRkcmVzcyhwYWdlKSkgOiBcCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW9tYXAvdXNiLmMgYi9hcmNoL2FybS9wbGF0LW9tYXAvdXNiLmMKaW5kZXggNjdjYTFlMi4uYWRkMDQ4NSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1vbWFwL3VzYi5jCisrKyBiL2FyY2gvYXJtL3BsYXQtb21hcC91c2IuYwpAQCAtNzcsMzggKzc3LDYgQEAKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAotI2lmCWRlZmluZWQoQ09ORklHX0FSQ0hfT01BUF9PVEcpIHx8IGRlZmluZWQoQ09ORklHX1VTQl9NVVNCX09URykKLQotc3RhdGljIHN0cnVjdCBvdGdfdHJhbnNjZWl2ZXIgKnhjZWl2OwotCi0vKioKLSAqIG90Z19nZXRfdHJhbnNjZWl2ZXIgLSBmaW5kIHRoZSAoc2luZ2xlKSBPVEcgdHJhbnNjZWl2ZXIgZHJpdmVyCi0gKgotICogUmV0dXJucyB0aGUgdHJhbnNjZWl2ZXIgZHJpdmVyLCBhZnRlciBnZXR0aW5nIGEgcmVmY291bnQgdG8gaXQ7IG9yCi0gKiBudWxsIGlmIHRoZXJlIGlzIG5vIHN1Y2ggdHJhbnNjZWl2ZXIuICBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvcgotICogcmVsZWFzaW5nIHRoYXQgY291bnQuCi0gKi8KLXN0cnVjdCBvdGdfdHJhbnNjZWl2ZXIgKm90Z19nZXRfdHJhbnNjZWl2ZXIodm9pZCkKLXsKLQlpZiAoeGNlaXYpCi0JCWdldF9kZXZpY2UoeGNlaXYtPmRldik7Ci0JcmV0dXJuIHhjZWl2OwotfQotRVhQT1JUX1NZTUJPTChvdGdfZ2V0X3RyYW5zY2VpdmVyKTsKLQotaW50IG90Z19zZXRfdHJhbnNjZWl2ZXIoc3RydWN0IG90Z190cmFuc2NlaXZlciAqeCkKLXsKLQlpZiAoeGNlaXYgJiYgeCkKLQkJcmV0dXJuIC1FQlVTWTsKLQl4Y2VpdiA9IHg7Ci0JcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MKG90Z19zZXRfdHJhbnNjZWl2ZXIpOwotCi0jZW5kaWYKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQogI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUF9PVEcpIHx8IGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDE1WFgpCiAKIHN0YXRpYyB2b2lkIG9tYXAyX3VzYl9kZXZjb25mX2NsZWFyKHU4IHBvcnQsIHUzMiBtYXNrKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zM2MvZGV2LWZiLmMgYi9hcmNoL2FybS9wbGF0LXMzYy9kZXYtZmIuYwppbmRleCAwNDU0YjhlLi5hOTAxOThmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LXMzYy9kZXYtZmIuYworKysgYi9hcmNoL2FybS9wbGF0LXMzYy9kZXYtZmIuYwpAQCAtMTYsNiArMTYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CiAKKyNpbmNsdWRlIDxtYWNoL2lycXMuaD4KICNpbmNsdWRlIDxtYWNoL21hcC5oPgogI2luY2x1ZGUgPG1hY2gvcmVncy1mYi5oPgogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXMzYy9kZXYtaTJjMC5jIGIvYXJjaC9hcm0vcGxhdC1zM2MvZGV2LWkyYzAuYwppbmRleCAyYzAxMjhjLi5mZTMyNzA3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LXMzYy9kZXYtaTJjMC5jCisrKyBiL2FyY2gvYXJtL3BsYXQtczNjL2Rldi1pMmMwLmMKQEAgLTE1LDYgKzE1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KIAorI2luY2x1ZGUgPG1hY2gvaXJxcy5oPgogI2luY2x1ZGUgPG1hY2gvbWFwLmg+CiAKICNpbmNsdWRlIDxwbGF0L3JlZ3MtaWljLmg+CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXMzYy9kZXYtaTJjMS5jIGIvYXJjaC9hcm0vcGxhdC1zM2MvZGV2LWkyYzEuYwppbmRleCA5NjU4ZmIwLi4yMzg3ZmJmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LXMzYy9kZXYtaTJjMS5jCisrKyBiL2FyY2gvYXJtL3BsYXQtczNjL2Rldi1pMmMxLmMKQEAgLTE1LDYgKzE1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KIAorI2luY2x1ZGUgPG1hY2gvaXJxcy5oPgogI2luY2x1ZGUgPG1hY2gvbWFwLmg+CiAKICNpbmNsdWRlIDxwbGF0L3JlZ3MtaWljLmg+CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXMzYzI0eHgvZ3Bpb2xpYi5jIGIvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2dwaW9saWIuYwppbmRleCBmOTVjNmM5Li45NGEzNDFhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LXMzYzI0eHgvZ3Bpb2xpYi5jCisrKyBiL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9ncGlvbGliLmMKQEAgLTU5LDYgKzU5LDIyIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgczNjMjR4eF9ncGlvbGliX2JhbmtmX3RvaXJxKHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCkKK3sKKwlpZiAob2Zmc2V0IDwgNCkKKwkJcmV0dXJuIElSUV9FSU5UMCArIG9mZnNldDsKKwkKKwlpZiAob2Zmc2V0IDwgOCkKKwkJcmV0dXJuIElSUV9FSU5UNCArIG9mZnNldCAtIDQ7CisJCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgczNjMjR4eF9ncGlvbGliX2JhbmtnX3RvaXJxKHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCkKK3sKKwlyZXR1cm4gSVJRX0VJTlQ4ICsgb2Zmc2V0OworfQorCiBzdHJ1Y3QgczNjX2dwaW9fY2hpcCBzM2MyNHh4X2dwaW9zW10gPSB7CiAJWzBdID0gewogCQkuYmFzZQk9IFMzQzI0WFhfR1BJT19CQVNFKFMzQzI0MTBfR1BBMCksCkBAIC0xMTQsNiArMTMwLDcgQEAKIAkJCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCiAJCQkubGFiZWwJCQk9ICJHUElPRiIsCiAJCQkubmdwaW8JCQk9IDgsCisJCQkudG9faXJxCQkJPSBzM2MyNHh4X2dwaW9saWJfYmFua2ZfdG9pcnEsCiAJCX0sCiAJfSwKIAlbNl0gPSB7CkBAIC0xMjMsNiArMTQwLDcgQEAKIAkJCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCiAJCQkubGFiZWwJCQk9ICJHUElPRyIsCiAJCQkubmdwaW8JCQk9IDEwLAorCQkJLnRvX2lycQkJCT0gczNjMjR4eF9ncGlvbGliX2JhbmtnX3RvaXJxLAogCQl9LAogCX0sCiB9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L3B3bS5jIGIvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L3B3bS5jCmluZGV4IGVjNTZiODguLjAxMjBiNzYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9wd20uYworKysgYi9hcmNoL2FybS9wbGF0LXMzYzI0eHgvcHdtLmMKQEAgLTE5LDYgKzE5LDggQEAKICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L3B3bS5oPgogCisjaW5jbHVkZSA8bWFjaC9pcnFzLmg+CisKICNpbmNsdWRlIDxwbGF0L2RldnMuaD4KICNpbmNsdWRlIDxwbGF0L3JlZ3MtdGltZXIuaD4KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zM2M2NHh4L2luY2x1ZGUvcGxhdC9pcnFzLmggYi9hcmNoL2FybS9wbGF0LXMzYzY0eHgvaW5jbHVkZS9wbGF0L2lycXMuaAppbmRleCAwMmU4ZGQ0Li4yODQ2ZjU1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LXMzYzY0eHgvaW5jbHVkZS9wbGF0L2lycXMuaAorKysgYi9hcmNoL2FybS9wbGF0LXMzYzY0eHgvaW5jbHVkZS9wbGF0L2lycXMuaApAQCAtMTkxLDcgKzE5MSw3IEBACiAjZGVmaW5lIElSUV9FSU5UX0dST1VQOF9CQVNFCShJUlFfRUlOVF9HUk9VUDdfQkFTRSArIElSUV9FSU5UX0dST1VQN19OUikKICNkZWZpbmUgSVJRX0VJTlRfR1JPVVA5X0JBU0UJKElSUV9FSU5UX0dST1VQOF9CQVNFICsgSVJRX0VJTlRfR1JPVVA4X05SKQogCi0jZGVmaW5lIElSUV9FSU5UX0dST1VQKGdyb3VwLCBubykJKElSUV9FSU5UX0dST1VQIyNncm91cCMjX19CQVNFICsgKHgpKQorI2RlZmluZSBJUlFfRUlOVF9HUk9VUChncm91cCwgbm8pCShJUlFfRUlOVF9HUk9VUCMjZ3JvdXAjI19CQVNFICsgKG5vKSkKIAogLyogU2V0IHRoZSBkZWZhdWx0IE5SX0lSUVMgKi8KIApkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9LY29uZmlnIGIvYXJjaC9hdnIzMi9LY29uZmlnCmluZGV4IDI2ZWNhODdmLi5iMTg5NjgwZCAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9LY29uZmlnCisrKyBiL2FyY2gvYXZyMzIvS2NvbmZpZwpAQCAtMTIyLDYgKzEyMiwyNCBAQAogCWJvb2wgIkFUTkdXMTAwIE5ldHdvcmsgR2F0ZXdheSIKIAlzZWxlY3QgQ1BVX0FUMzJBUDcwMDAKIAorY29uZmlnIEJPQVJEX0hBTU1FUkhFQUQKKwlib29sICJIYW1tZXJoZWFkIGJvYXJkIgorCXNlbGVjdCBDUFVfQVQzMkFQNzAwMAorCXNlbGVjdCBVU0JfQVJDSF9IQVNfSENECisJaGVscAorCSAgVGhlIEhhbW1lcmhlYWQgcGxhdGZvcm0gaXMgYnVpbHQgYXJvdW5kIGEgQVZSMzIgMzItYml0IG1pY3JvY29udHJvbGxlciBmcm9tIEF0bWVsLgorCSAgSXQgb2ZmZXJzIHZlcnNhdGlsZSBwZXJpcGhlcmFscywgc3VjaCBhcyBldGhlcm5ldCwgdXNiIGRldmljZSwgdXNiIGhvc3QgZXRjLgorCisJICBUaGUgYm9hcmQgYWxzbyBpbmNvb3BlcmF0ZXMgYSBwb3dlciBzdXBwbHkgYW5kIGlzIGEgUG93ZXIgb3ZlciBFdGhlcm5ldCAoUG9FKSBQb3dlcmVkCisJICBEZXZpY2UgKFBEKS4KKworCSAgQWRkaXRvbmFsbHksIGEgQ3ljbG9uZSBJSUkgRlBHQSBmcm9tIEFsdGVyYSBpcyBpbnRlZ3JhdGVkIG9uIHRoZSBib2FyZC4gVGhlIEZQR0EgaXMKKwkgIG1hcHBlZCBpbnRvIHRoZSAzMi1iaXQgQVZSIG1lbW9yeSBidXMuIFRoZSBGUEdBIG9mZmVycyB0d28gRERSMiBTRFJBTSBpbnRlcmZhY2VzLCB3aGljaAorCSAgd2lsbCBjb3ZlciBldmVuIHRoZSBtb3N0IGV4Y2VwdGlvbmFsIG5lZWQgb2YgbWVtb3J5IGJhbmR3aWR0aC4gVG9nZXRoZXIgd2l0aCB0aGUgb25ib2FyZAorCSAgdmlkZW8gZGVjb2RlciB0aGUgYm9hcmQgaXMgcmVhZHkgZm9yIHZpZGVvIHByb2Nlc3NpbmcuCisKKwkgIEZvciBtb3JlIGluZm9ybWF0aW9uIHNlZTogaHR0cDovL3d3dy5taXJvbWljby5jb20vaGFtbWVyaGVhZAorCiBjb25maWcgQk9BUkRfRkFWUl8zMgogCWJvb2wgIkZhdnItMzIgTENELWJvYXJkIgogCXNlbGVjdCBDUFVfQVQzMkFQNzAwMApAQCAtMTMzLDYgKzE1MSw3IEBACiAKIHNvdXJjZSAiYXJjaC9hdnIzMi9ib2FyZHMvYXRzdGsxMDAwL0tjb25maWciCiBzb3VyY2UgImFyY2gvYXZyMzIvYm9hcmRzL2F0bmd3MTAwL0tjb25maWciCitzb3VyY2UgImFyY2gvYXZyMzIvYm9hcmRzL2hhbW1lcmhlYWQvS2NvbmZpZyIKIHNvdXJjZSAiYXJjaC9hdnIzMi9ib2FyZHMvZmF2ci0zMi9LY29uZmlnIgogCiBjaG9pY2UKZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIvTWFrZWZpbGUgYi9hcmNoL2F2cjMyL01ha2VmaWxlCmluZGV4IGIwODhlMTAuLmYzZWYzYmIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIvTWFrZWZpbGUKKysrIGIvYXJjaC9hdnIzMi9NYWtlZmlsZQpAQCAtMzMsNiArMzMsNyBAQAogY29yZS15CQkJCQkrPSAkKG1hY2hkaXJzKQogY29yZS0kKENPTkZJR19CT0FSRF9BVFNUSzEwMDApCQkrPSBhcmNoL2F2cjMyL2JvYXJkcy9hdHN0azEwMDAvCiBjb3JlLSQoQ09ORklHX0JPQVJEX0FUTkdXMTAwKQkJKz0gYXJjaC9hdnIzMi9ib2FyZHMvYXRuZ3cxMDAvCitjb3JlLSQoQ09ORklHX0JPQVJEX0hBTU1FUkhFQUQpCQkrPSBhcmNoL2F2cjMyL2JvYXJkcy9oYW1tZXJoZWFkLwogY29yZS0kKENPTkZJR19CT0FSRF9GQVZSXzMyKQkJKz0gYXJjaC9hdnIzMi9ib2FyZHMvZmF2ci0zMi8KIGNvcmUtJChDT05GSUdfQk9BUkRfTUlNQzIwMCkJCSs9IGFyY2gvYXZyMzIvYm9hcmRzL21pbWMyMDAvCiBjb3JlLSQoQ09ORklHX0xPQURFUl9VX0JPT1QpCQkrPSBhcmNoL2F2cjMyL2Jvb3QvdS1ib290LwpkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9ib2FyZHMvYXRuZ3cxMDAvc2V0dXAuYyBiL2FyY2gvYXZyMzIvYm9hcmRzL2F0bmd3MTAwL3NldHVwLmMKaW5kZXggMzJmYjliYS4uMDVkMzcyMiAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9ib2FyZHMvYXRuZ3cxMDAvc2V0dXAuYworKysgYi9hcmNoL2F2cjMyL2JvYXJkcy9hdG5ndzEwMC9zZXR1cC5jCkBAIC0xOSw4ICsxOSw4IEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9sZWRzLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPGxpbnV4L2F0bWVsLW1jaS5oPgogCi0jaW5jbHVkZSA8YXNtL2F0bWVsLW1jaS5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgogCmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL2JvYXJkcy9hdHN0azEwMDAvYXRzdGsxMDAyLmMgYi9hcmNoL2F2cjMyL2JvYXJkcy9hdHN0azEwMDAvYXRzdGsxMDAyLmMKaW5kZXggNWM1Y2RmMy4uMWYzM2ExMCAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9ib2FyZHMvYXRzdGsxMDAwL2F0c3RrMTAwMi5jCisrKyBiL2FyY2gvYXZyMzIvYm9hcmRzL2F0c3RrMTAwMC9hdHN0azEwMDIuYwpAQCAtMTYsMTIgKzE2LDEyIEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpL2F0NzNjMjEzLmg+CisjaW5jbHVkZSA8bGludXgvYXRtZWwtbWNpLmg+CiAKICNpbmNsdWRlIDx2aWRlby9hdG1lbF9sY2RjLmg+CiAKICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vc2V0dXAuaD4KLSNpbmNsdWRlIDxhc20vYXRtZWwtbWNpLmg+CiAKICNpbmNsdWRlIDxtYWNoL2F0MzJhcDcwMHguaD4KICNpbmNsdWRlIDxtYWNoL2JvYXJkLmg+CkBAIC0yODcsMjMgKzI4Nyw3IEBACiAJICogQVRTVEsxMDAwIHVzZXMgMzItYml0IFNEUkFNIGludGVyZmFjZS4gUmVzZXJ2ZSB0aGUKIAkgKiBTRFJBTS1zcGVjaWZpYyBwaW5zIHNvIHRoYXQgbm9ib2R5IG1lc3NlcyB3aXRoIHRoZW0uCiAJICovCi0JYXQzMl9yZXNlcnZlX3BpbihHUElPX1BJTl9QRSgwKSk7CS8qIERBVEFbMTZdCSovCi0JYXQzMl9yZXNlcnZlX3BpbihHUElPX1BJTl9QRSgxKSk7CS8qIERBVEFbMTddCSovCi0JYXQzMl9yZXNlcnZlX3BpbihHUElPX1BJTl9QRSgyKSk7CS8qIERBVEFbMThdCSovCi0JYXQzMl9yZXNlcnZlX3BpbihHUElPX1BJTl9QRSgzKSk7CS8qIERBVEFbMTldCSovCi0JYXQzMl9yZXNlcnZlX3BpbihHUElPX1BJTl9QRSg0KSk7CS8qIERBVEFbMjBdCSovCi0JYXQzMl9yZXNlcnZlX3BpbihHUElPX1BJTl9QRSg1KSk7CS8qIERBVEFbMjFdCSovCi0JYXQzMl9yZXNlcnZlX3BpbihHUElPX1BJTl9QRSg2KSk7CS8qIERBVEFbMjJdCSovCi0JYXQzMl9yZXNlcnZlX3BpbihHUElPX1BJTl9QRSg3KSk7CS8qIERBVEFbMjNdCSovCi0JYXQzMl9yZXNlcnZlX3BpbihHUElPX1BJTl9QRSg4KSk7CS8qIERBVEFbMjRdCSovCi0JYXQzMl9yZXNlcnZlX3BpbihHUElPX1BJTl9QRSg5KSk7CS8qIERBVEFbMjVdCSovCi0JYXQzMl9yZXNlcnZlX3BpbihHUElPX1BJTl9QRSgxMCkpOwkvKiBEQVRBWzI2XQkqLwotCWF0MzJfcmVzZXJ2ZV9waW4oR1BJT19QSU5fUEUoMTEpKTsJLyogREFUQVsyN10JKi8KLQlhdDMyX3Jlc2VydmVfcGluKEdQSU9fUElOX1BFKDEyKSk7CS8qIERBVEFbMjhdCSovCi0JYXQzMl9yZXNlcnZlX3BpbihHUElPX1BJTl9QRSgxMykpOwkvKiBEQVRBWzI5XQkqLwotCWF0MzJfcmVzZXJ2ZV9waW4oR1BJT19QSU5fUEUoMTQpKTsJLyogREFUQVszMF0JKi8KLQlhdDMyX3Jlc2VydmVfcGluKEdQSU9fUElOX1BFKDE1KSk7CS8qIERBVEFbMzFdCSovCi0JYXQzMl9yZXNlcnZlX3BpbihHUElPX1BJTl9QRSgyNikpOwkvKiBTRENTCQkqLworCWF0MzJfcmVzZXJ2ZV9waW4oR1BJT19QSU9FX0JBU0UsIEFUTUVMX0VCSV9QRV9EQVRBX0FMTCk7CiAKICNpZmRlZiBDT05GSUdfQk9BUkRfQVRTVEsxMDA2CiAJc21jX3NldF90aW1pbmcoJm5hbmRfY29uZmlnLCAmbmFuZF90aW1pbmcpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9ib2FyZHMvYXRzdGsxMDAwL2F0c3RrMTAwMy5jIGIvYXJjaC9hdnIzMi9ib2FyZHMvYXRzdGsxMDAwL2F0c3RrMTAwMy5jCmluZGV4IDEzNGI1NjYuLmIzYTIzYzggMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIvYm9hcmRzL2F0c3RrMTAwMC9hdHN0azEwMDMuYworKysgYi9hcmNoL2F2cjMyL2JvYXJkcy9hdHN0azEwMDAvYXRzdGsxMDAzLmMKQEAgLTE3LDkgKzE3LDkgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3NwaS9hdDczYzIxMy5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9hdG1lbC1tY2kuaD4KIAogI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgotI2luY2x1ZGUgPGFzbS9hdG1lbC1tY2kuaD4KIAogI2luY2x1ZGUgPG1hY2gvYXQzMmFwNzAweC5oPgogI2luY2x1ZGUgPG1hY2gvYm9hcmQuaD4KQEAgLTEzMSwyMyArMTMxLDcgQEAKIAkgKiBBVFNUSzEwMDAgdXNlcyAzMi1iaXQgU0RSQU0gaW50ZXJmYWNlLiBSZXNlcnZlIHRoZQogCSAqIFNEUkFNLXNwZWNpZmljIHBpbnMgc28gdGhhdCBub2JvZHkgbWVzc2VzIHdpdGggdGhlbS4KIAkgKi8KLQlhdDMyX3Jlc2VydmVfcGluKEdQSU9fUElOX1BFKDApKTsJLyogREFUQVsxNl0JKi8KLQlhdDMyX3Jlc2VydmVfcGluKEdQSU9fUElOX1BFKDEpKTsJLyogREFUQVsxN10JKi8KLQlhdDMyX3Jlc2VydmVfcGluKEdQSU9fUElOX1BFKDIpKTsJLyogREFUQVsxOF0JKi8KLQlhdDMyX3Jlc2VydmVfcGluKEdQSU9fUElOX1BFKDMpKTsJLyogREFUQVsxOV0JKi8KLQlhdDMyX3Jlc2VydmVfcGluKEdQSU9fUElOX1BFKDQpKTsJLyogREFUQVsyMF0JKi8KLQlhdDMyX3Jlc2VydmVfcGluKEdQSU9fUElOX1BFKDUpKTsJLyogREFUQVsyMV0JKi8KLQlhdDMyX3Jlc2VydmVfcGluKEdQSU9fUElOX1BFKDYpKTsJLyogREFUQVsyMl0JKi8KLQlhdDMyX3Jlc2VydmVfcGluKEdQSU9fUElOX1BFKDcpKTsJLyogREFUQVsyM10JKi8KLQlhdDMyX3Jlc2VydmVfcGluKEdQSU9fUElOX1BFKDgpKTsJLyogREFUQVsyNF0JKi8KLQlhdDMyX3Jlc2VydmVfcGluKEdQSU9fUElOX1BFKDkpKTsJLyogREFUQVsyNV0JKi8KLQlhdDMyX3Jlc2VydmVfcGluKEdQSU9fUElOX1BFKDEwKSk7CS8qIERBVEFbMjZdCSovCi0JYXQzMl9yZXNlcnZlX3BpbihHUElPX1BJTl9QRSgxMSkpOwkvKiBEQVRBWzI3XQkqLwotCWF0MzJfcmVzZXJ2ZV9waW4oR1BJT19QSU5fUEUoMTIpKTsJLyogREFUQVsyOF0JKi8KLQlhdDMyX3Jlc2VydmVfcGluKEdQSU9fUElOX1BFKDEzKSk7CS8qIERBVEFbMjldCSovCi0JYXQzMl9yZXNlcnZlX3BpbihHUElPX1BJTl9QRSgxNCkpOwkvKiBEQVRBWzMwXQkqLwotCWF0MzJfcmVzZXJ2ZV9waW4oR1BJT19QSU5fUEUoMTUpKTsJLyogREFUQVszMV0JKi8KLQlhdDMyX3Jlc2VydmVfcGluKEdQSU9fUElOX1BFKDI2KSk7CS8qIFNEQ1MJCSovCisJYXQzMl9yZXNlcnZlX3BpbihHUElPX1BJT0VfQkFTRSwgQVRNRUxfRUJJX1BFX0RBVEFfQUxMKTsKIAogI2lmZGVmCUNPTkZJR19CT0FSRF9BVFNUSzEwMFhfU1cyX0NVU1RPTQogCWF0MzJfYWRkX2RldmljZV91c2FydCgxKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIvYm9hcmRzL2F0c3RrMTAwMC9hdHN0azEwMDQuYyBiL2FyY2gvYXZyMzIvYm9hcmRzL2F0c3RrMTAwMC9hdHN0azEwMDQuYwppbmRleCBjYjMyZWI4Li4yOWIzNWFjIDEwMDY0NAotLS0gYS9hcmNoL2F2cjMyL2JvYXJkcy9hdHN0azEwMDAvYXRzdGsxMDA0LmMKKysrIGIvYXJjaC9hdnIzMi9ib2FyZHMvYXRzdGsxMDAwL2F0c3RrMTAwNC5jCkBAIC0xNywxMSArMTcsMTEgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3NwaS9hdDczYzIxMy5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9hdG1lbC1tY2kuaD4KIAogI2luY2x1ZGUgPHZpZGVvL2F0bWVsX2xjZGMuaD4KIAogI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgotI2luY2x1ZGUgPGFzbS9hdG1lbC1tY2kuaD4KIAogI2luY2x1ZGUgPG1hY2gvYXQzMmFwNzAweC5oPgogI2luY2x1ZGUgPG1hY2gvYm9hcmQuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIvYm9hcmRzL2ZhdnItMzIvc2V0dXAuYyBiL2FyY2gvYXZyMzIvYm9hcmRzL2ZhdnItMzIvc2V0dXAuYwppbmRleCAxZWU0ZmFmLi43NDVjNDA4IDEwMDY0NAotLS0gYS9hcmNoL2F2cjMyL2JvYXJkcy9mYXZyLTMyL3NldHVwLmMKKysrIGIvYXJjaC9hdnIzMi9ib2FyZHMvZmF2ci0zMi9zZXR1cC5jCkBAIC0xNyw2ICsxNyw3IEBACiAjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgogI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9sZWRzLmg+CisjaW5jbHVkZSA8bGludXgvYXRtZWwtbWNpLmg+CiAjaW5jbHVkZSA8bGludXgvYXRtZWwtcHdtLWJsLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaS9hZHM3ODQ2Lmg+CkBAIC03OSw2ICs4MCwxNCBAQAogCX0sCiB9OwogCitzdGF0aWMgc3RydWN0IG1jaV9wbGF0Zm9ybV9kYXRhIF9faW5pdGRhdGEgbWNpMF9kYXRhID0geworCS5zbG90WzBdID0geworCQkuYnVzX3dpZHRoCT0gNCwKKwkJLmRldGVjdF9waW4JPSAtRU5PREVWLAorCQkud3BfcGluCQk9IC1FTk9ERVYsCisJfSwKK307CisKIHN0YXRpYyBzdHJ1Y3QgZmJfdmlkZW9tb2RlIF9faW5pdGRhdGEgbGIxMDR2MDNfbW9kZXNbXSA9IHsKIAl7CiAJCS5uYW1lCQk9ICI2NDB4NDgwIEAgNTAiLApAQCAtMzA3LDI4ICszMTYsMTAgQEAKIAkgKiBGYXZyLTMyIHVzZXMgMzItYml0IFNEUkFNIGludGVyZmFjZS4gUmVzZXJ2ZSB0aGUgU0RSQU0tc3BlY2lmaWMKIAkgKiBwaW5zIHNvIHRoYXQgbm9ib2R5IG1lc3NlcyB3aXRoIHRoZW0uCiAJICovCi0JYXQzMl9yZXNlcnZlX3BpbihHUElPX1BJTl9QRSgwKSk7CS8qIERBVEFbMTZdCSovCi0JYXQzMl9yZXNlcnZlX3BpbihHUElPX1BJTl9QRSgxKSk7CS8qIERBVEFbMTddCSovCi0JYXQzMl9yZXNlcnZlX3BpbihHUElPX1BJTl9QRSgyKSk7CS8qIERBVEFbMThdCSovCi0JYXQzMl9yZXNlcnZlX3BpbihHUElPX1BJTl9QRSgzKSk7CS8qIERBVEFbMTldCSovCi0JYXQzMl9yZXNlcnZlX3BpbihHUElPX1BJTl9QRSg0KSk7CS8qIERBVEFbMjBdCSovCi0JYXQzMl9yZXNlcnZlX3BpbihHUElPX1BJTl9QRSg1KSk7CS8qIERBVEFbMjFdCSovCi0JYXQzMl9yZXNlcnZlX3BpbihHUElPX1BJTl9QRSg2KSk7CS8qIERBVEFbMjJdCSovCi0JYXQzMl9yZXNlcnZlX3BpbihHUElPX1BJTl9QRSg3KSk7CS8qIERBVEFbMjNdCSovCi0JYXQzMl9yZXNlcnZlX3BpbihHUElPX1BJTl9QRSg4KSk7CS8qIERBVEFbMjRdCSovCi0JYXQzMl9yZXNlcnZlX3BpbihHUElPX1BJTl9QRSg5KSk7CS8qIERBVEFbMjVdCSovCi0JYXQzMl9yZXNlcnZlX3BpbihHUElPX1BJTl9QRSgxMCkpOwkvKiBEQVRBWzI2XQkqLwotCWF0MzJfcmVzZXJ2ZV9waW4oR1BJT19QSU5fUEUoMTEpKTsJLyogREFUQVsyN10JKi8KLQlhdDMyX3Jlc2VydmVfcGluKEdQSU9fUElOX1BFKDEyKSk7CS8qIERBVEFbMjhdCSovCi0JYXQzMl9yZXNlcnZlX3BpbihHUElPX1BJTl9QRSgxMykpOwkvKiBEQVRBWzI5XQkqLwotCWF0MzJfcmVzZXJ2ZV9waW4oR1BJT19QSU5fUEUoMTQpKTsJLyogREFUQVszMF0JKi8KLQlhdDMyX3Jlc2VydmVfcGluKEdQSU9fUElOX1BFKDE1KSk7CS8qIERBVEFbMzFdCSovCi0JYXQzMl9yZXNlcnZlX3BpbihHUElPX1BJTl9QRSgyNikpOwkvKiBTRENTCQkqLworCWF0MzJfcmVzZXJ2ZV9waW4oR1BJT19QSU9FX0JBU0UsIEFUTUVMX0VCSV9QRV9EQVRBX0FMTCk7CiAKIAlhdDMyX3NlbGVjdF9ncGlvKEdQSU9fUElOX1BCKDMpLCAwKTsJLyogSVJRIGZyb20gQURTNzg0MyAqLwogCi0JYXQzMl9hZGRfc3lzdGVtX2RldmljZXMoKTsKLQogCWF0MzJfYWRkX2RldmljZV91c2FydCgwKTsKIAogCXNldF9od19hZGRyKGF0MzJfYWRkX2RldmljZV9ldGgoMCwgJmV0aF9kYXRhWzBdKSk7CkBAIC0zMzksNyArMzMwLDcgQEAKIAogCWF0MzJfYWRkX2RldmljZV9wd20oMSA8PCBhdG1lbF9wd21fYmxfcGRhdGEucHdtX2NoYW5uZWwpOwogCWF0MzJfYWRkX2RldmljZV9zcGkoMSwgc3BpMV9ib2FyZF9pbmZvLCBBUlJBWV9TSVpFKHNwaTFfYm9hcmRfaW5mbykpOwotCWF0MzJfYWRkX2RldmljZV9tY2koMCwgTlVMTCk7CisJYXQzMl9hZGRfZGV2aWNlX21jaSgwLCAmbWNpMF9kYXRhKTsKIAlhdDMyX2FkZF9kZXZpY2VfdXNiYSgwLCBOVUxMKTsKIAlhdDMyX2FkZF9kZXZpY2VfbGNkYygwLCAmZmF2cjMyX2xjZGNfZGF0YSwgZmJtZW1fc3RhcnQsIGZibWVtX3NpemUsIDApOwogCmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL2JvYXJkcy9oYW1tZXJoZWFkL0tjb25maWcgYi9hcmNoL2F2cjMyL2JvYXJkcy9oYW1tZXJoZWFkL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmRhMjMzMQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXZyMzIvYm9hcmRzL2hhbW1lcmhlYWQvS2NvbmZpZwpAQCAtMCwwICsxLDQzIEBACisjIEhhbW1lcmhlYWQgY3VzdG9taXphdGlvbgorCitpZiBCT0FSRF9IQU1NRVJIRUFECisKK2NvbmZpZyBCT0FSRF9IQU1NRVJIRUFEX1VTQgorCWJvb2wgIlBoaWxpcHMgSVNQMTE2eC1oY2QgVVNCIHN1cHBvcnQiCisJaGVscAorCSAgVGhpcyBlbmFibGVzIFVTQiBzdXBwb3J0IGZvciBIYW1tZXJoZWFkcyBpbnRlcm5hbCBJU1AxMTZ4CisJICBjb250cm9sbGVyIGZyb20gUGhpbGlwcy4KKworCSAgQ2hvb3NlICdZJyBoZXJlIGlmIHlvdSB3YW50IHRvIGhhdmUgeW91ciBib2FyZCBVU0IgZHJpdmVuLgorCitjb25maWcgQk9BUkRfSEFNTUVSSEVBRF9MQ0QKKwlib29sICJBdG1lbCBBVDkxL0FUMzIgTENEIHN1cHBvcnQiCisJaGVscAorCSAgVGhpcyBlbmFibGVzIExDRCBzdXBwb3J0IGZvciB0aGUgSGFtbWVyaGVhZCBib2FyZC4gWW91IG1heQorCSAgYWxzbyBhZGQgc3VwcG9ydCBmb3IgZnJhbWVidWZmZXIgZGV2aWNlcyAoQVQ5MS9BVDMyIExDRCBDb250cm9sbGVyKQorCSAgYW5kIGZyYW1lYnVmZmVyIGNvbnNvbGUgc3VwcG9ydCB0byBnZXQgdGhlIG1vc3Qgb3V0IG9mIHlvdXIgTENELgorCisJICBDaG9vc2UgJ1knIGhlcmUgaWYgeW91IGhhdmUgb3JkZXJlZCBhIENvcm9uYSBkYXVndGhlciBib2FyZCBhbmQKKwkgIHdhbnQgdG8gaGF2ZSBzdXBwb3J0IGZvciB5b3VyIEhhbnRyb25peCBIREEtMzUxVC1MViBMQ0QuCisKK2NvbmZpZyBCT0FSRF9IQU1NRVJIRUFEX1NORAorCWJvb2wgIkF0bWVsIEFDOTcgU291bmQgc3VwcG9ydCIKKwloZWxwCisJICBUaGlzIGVuYWJsZXMgU291bmQgc3VwcG9ydCBmb3IgdGhlIEhhbW1lcmhlYWQgYm9hcmQuIFlvdSBtYXkKKwkgIGFsc28gZ28gdHJvdWdoIHRoZSBBTFNBIHNldHRpbmdzIHRvIGdldCBpdCB3b3JraW5nLgorCisJICBDaG9vc2UgJ1knIGhlcmUgaWYgeW91IGhhdmUgb3JkZXJlZCBhIENvcm9uYSBkYXVndGhlciBib2FyZCBhbmQKKwkgIHdhbnQgdG8gbWFrZSB5b3VyIGJvYXJkIGZ1bmt5LgorCitjb25maWcgQk9BUkRfSEFNTUVSSEVBRF9GUEdBCisJYm9vbCAiSGFtbWVyaGVhZCBGUEdBIFN1cHBvcnQiCisJZGVmYXVsdCB5CisJaGVscAorCSAgVGhpcyBhZGRzIHN1cHBvcnQgZm9yIHRoZSBDeWNsb25lIElJSSBGUEdBIGZyb20gQWx0ZXJhCisJICBmb3VuZCBvbiBNaXJvbWljbydzIEhhbW1lcmhlYWQgYm9hcmQuCisKKwkgIENob29zZSAnWScgaGVyZSBpZiB5b3Ugd2FudCB0byBoYXZlIEZQR0Egc3VwcG9ydCBlbmFibGVkLgorCSAgWW91IHdpbGwgaGF2ZSB0byBjaG9vc2UgdGhlICJIYW1tZXJoZWFkIEZQR0EgRGV2aWNlIFN1cHBvcnQiIGluCisJICBEZXZpY2UgRHJpdmVycy0+TWlzYyB0byBiZSBhYmxlIHRvIHVzZSBGUEdBIGZ1bmN0aW9uYWxpdHkuCisKK2VuZGlmCSMgQk9BUkRfQVROR1cxMDAKZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIvYm9hcmRzL2hhbW1lcmhlYWQvTWFrZWZpbGUgYi9hcmNoL2F2cjMyL2JvYXJkcy9oYW1tZXJoZWFkL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3NDBhYTEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2F2cjMyL2JvYXJkcy9oYW1tZXJoZWFkL01ha2VmaWxlCkBAIC0wLDAgKzEgQEAKK29iai15CQkJCSs9IHNldHVwLm8gZmxhc2gubwpkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9ib2FyZHMvaGFtbWVyaGVhZC9mbGFzaC5jIGIvYXJjaC9hdnIzMi9ib2FyZHMvaGFtbWVyaGVhZC9mbGFzaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5OGM2ZGQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2F2cjMyL2JvYXJkcy9oYW1tZXJoZWFkL2ZsYXNoLmMKQEAgLTAsMCArMSwzNzcgQEAKKy8qCisgKiBIYW1tZXJoZWFkIGJvYXJkLXNwZWNpZmljIGZsYXNoIGluaXRpYWxpemF0aW9uCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4IE1pcm9taWNvIEFHCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9tdGQuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvcGFydGl0aW9ucy5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9waHlzbWFwLmg+CisjaW5jbHVkZSA8bGludXgvdXNiL2lzcDExNnguaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisKKyNpbmNsdWRlIDxtYWNoL3BvcnRtdXguaD4KKyNpbmNsdWRlIDxtYWNoL2F0MzJhcDcwMHguaD4KKyNpbmNsdWRlIDxtYWNoL3NtYy5oPgorCisjaW5jbHVkZSAiLi4vLi4vbWFjaC1hdDMyYXAvY2xvY2suaCIKKyNpbmNsdWRlICJmbGFzaC5oIgorCisKKyNkZWZpbmUgSEFNTUVSSEVBRF9VU0JfUEVSSVBIX0dDTEswCTB4NDAwMDAwMDAKKyNkZWZpbmUgSEFNTUVSSEVBRF9VU0JfUEVSSVBIX0NTMgkweDAyMDAwMDAwCisjZGVmaW5lIEhBTU1FUkhFQURfVVNCX1BFUklQSF9FWFRJTlQwCTB4MDIwMDAwMDAKKworI2RlZmluZSBIQU1NRVJIRUFEX0ZQR0FfUEVSSVBIX01PU0kJMHgwMDAwMDAwMgorI2RlZmluZSBIQU1NRVJIRUFEX0ZQR0FfUEVSSVBIX1NDSwkweDAwMDAwMDIwCisjZGVmaW5lIEhBTU1FUkhFQURfRlBHQV9QRVJJUEhfRVhUSU5UMwkweDEwMDAwMDAwCisKK3N0YXRpYyBzdHJ1Y3Qgc21jX3RpbWluZyBmbGFzaF90aW1pbmcgX19pbml0ZGF0YSA9IHsKKwkubmNzX3JlYWRfc2V0dXAJCT0gMCwKKwkubnJkX3NldHVwCQk9IDQwLAorCS5uY3Nfd3JpdGVfc2V0dXAJPSAwLAorCS5ud2Vfc2V0dXAJCT0gMTAsCisKKwkubmNzX3JlYWRfcHVsc2UJCT0gODAsCisJLm5yZF9wdWxzZQkJPSA0MCwKKwkubmNzX3dyaXRlX3B1bHNlCT0gNjUsCisJLm53ZV9wdWxzZQkJPSA1NSwKKworCS5yZWFkX2N5Y2xlCQk9IDEyMCwKKwkud3JpdGVfY3ljbGUJCT0gMTIwLAorfTsKKworc3RhdGljIHN0cnVjdCBzbWNfY29uZmlnIGZsYXNoX2NvbmZpZyBfX2luaXRkYXRhID0geworCS5idXNfd2lkdGgJCT0gMiwKKwkubnJkX2NvbnRyb2xsZWQJCT0gMSwKKwkubndlX2NvbnRyb2xsZWQJCT0gMSwKKwkuYnl0ZV93cml0ZQkJPSAxLAorfTsKKworc3RhdGljIHN0cnVjdCBtdGRfcGFydGl0aW9uIGZsYXNoX3BhcnRzW10gPSB7CisJeworCQkubmFtZQkJPSAidS1ib290IiwKKwkJLm9mZnNldAkJPSAweDAwMDAwMDAwLAorCQkuc2l6ZQkJPSAweDAwMDIwMDAwLCAgICAgICAgICAgLyogMTI4IEtpQiAqLworCQkubWFza19mbGFncwk9IE1URF9XUklURUFCTEUsCisJfSwKKwl7CisJCS5uYW1lCQk9ICJyb290IiwKKwkJLm9mZnNldAkJPSAweDAwMDIwMDAwLAorCQkuc2l6ZQkJPSAweDAwN2QwMDAwLAorCX0sCisJeworCQkubmFtZQkJPSAiZW52IiwKKwkJLm9mZnNldAkJPSAweDAwN2YwMDAwLAorCQkuc2l6ZQkJPSAweDAwMDEwMDAwLAorCQkubWFza19mbGFncwk9IE1URF9XUklURUFCTEUsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGh5c21hcF9mbGFzaF9kYXRhIGZsYXNoX2RhdGEgPSB7CisJLndpZHRoCQk9IDIsCisJLm5yX3BhcnRzCT0gQVJSQVlfU0laRShmbGFzaF9wYXJ0cyksCisJLnBhcnRzCQk9IGZsYXNoX3BhcnRzLAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBmbGFzaF9yZXNvdXJjZSA9IHsKKwkuc3RhcnQJCT0gMHgwMDAwMDAwMCwKKwkuZW5kCQk9IDB4MDA3ZmZmZmYsCisJLmZsYWdzCQk9IElPUkVTT1VSQ0VfTUVNLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgZmxhc2hfZGV2aWNlID0geworCS5uYW1lCQk9ICJwaHlzbWFwLWZsYXNoIiwKKwkuaWQJCT0gMCwKKwkucmVzb3VyY2UJPSAmZmxhc2hfcmVzb3VyY2UsCisJLm51bV9yZXNvdXJjZXMJPSAxLAorCS5kZXYJCT0geyAucGxhdGZvcm1fZGF0YSA9ICZmbGFzaF9kYXRhLCB9LAorfTsKKworI2lmZGVmIENPTkZJR19CT0FSRF9IQU1NRVJIRUFEX1VTQgorCitzdGF0aWMgc3RydWN0IHNtY190aW1pbmcgaXNwMTE2MF90aW1pbmcgX19pbml0ZGF0YSA9IHsKKwkubmNzX3JlYWRfc2V0dXAJCT0gNzUsCisJLm5yZF9zZXR1cAkJPSA3NSwKKwkubmNzX3dyaXRlX3NldHVwCT0gNzUsCisJLm53ZV9zZXR1cAkJPSA3NSwKKworCisJLyogV2UgdXNlIGNvbnNlcnZhdGl2ZSB0aW1pbmcgc2V0dGluZ3MsIGFzIHRoZSBtaW5pbWFsIHNldHRpbmdzIGFyZW4ndAorCSAgIHN0YWJsZS4gVGhlcmUgbWF5IGJlIHJvb20gZm9yIHR3ZWFraW5nLiAqLworCS5uY3NfcmVhZF9wdWxzZQkJPSA3NSwgIC8qIG1pbi4gMzNucyAqLworCS5ucmRfcHVsc2UJCT0gNzUsICAvKiBtaW4uIDMzbnMgKi8KKwkubmNzX3dyaXRlX3B1bHNlCT0gNzUsICAvKiBtaW4uIDI2bnMgKi8KKwkubndlX3B1bHNlCQk9IDc1LCAgLyogbWluLiAyNm5zICovCisKKwkucmVhZF9jeWNsZQkJPSAyMjUsIC8qIG1pbi4gMTQzbnMgKi8KKwkud3JpdGVfY3ljbGUJCT0gMjI1LCAvKiBtaW4uIDEzNm5zICovCit9OworCitzdGF0aWMgc3RydWN0IHNtY19jb25maWcgaXNwMTE2MF9jb25maWcgX19pbml0ZGF0YSA9IHsKKwkuYnVzX3dpZHRoCQk9IDIsCisJLm5yZF9jb250cm9sbGVkCQk9IDEsCisJLm53ZV9jb250cm9sbGVkCQk9IDEsCisJLmJ5dGVfd3JpdGUJCT0gMCwKK307CisKKy8qCisgKiBUaGUgcGxhdGZvcm0gZGVsYXkgZnVuY3Rpb24gaXMgb25seSB1c2VkIHRvIGVuZm9yY2UgdGhlIHN0cmFuZ2UKKyAqIHJlYWQgdG8gd3JpdGUgZGVsYXkuIFRoaXMgY2FuIG5vdCBiZSBjb25maWd1cmVkIGluIHRoZSBTTUMuIEFsbCBvdGhlcgorICogdGltaW5ncyBhcmUgY29udHJvbGxlZCBieSB0aGUgU01DIChzZWUgdGltaW5ncyBvYm92ZSkKKyAqIFNvIGluIGlzcDExNngtaGNkLmMgd2Ugc2hvdWxkIGNvbW1lbnQgb3V0IFVTRV9QTEFURk9STV9ERUxBWQorICovCit2b2lkIGlzcDExNnhfZGVsYXkoc3RydWN0IGRldmljZSAqZGV2LCBpbnQgZGVsYXkpCit7CisJaWYgKGRlbGF5ID4gMTUwKQorCQluZGVsYXkoZGVsYXkgLSAxNTApOworfQorCitzdGF0aWMgc3RydWN0ICBpc3AxMTZ4X3BsYXRmb3JtX2RhdGEgaXNwMTE2MF9kYXRhID0geworCS5zZWwxNUtyZXMJCT0gMSwJLyogdXNlIGludGVybmFsIGRvd25zdHJlYW0gcmVzaXN0b3JzICovCisJLm9jX2VuYWJsZQkJPSAwLAkvKiBleHRlcm5hbCBvdmVyY3VycmVudCBkZXRlY3Rpb24gKi8KKwkuaW50X2VkZ2VfdHJpZ2dlcmVkCT0gMCwJLyogaW50ZXJydXB0IGlzIGxldmVsIHRyaWdnZXJlZCAqLworCS5pbnRfYWN0X2hpZ2gJCT0gMCwJLyogaW50ZXJydXB0IGlzIGFjdGl2ZSBsb3cgKi8KKwkuZGVsYXkgPSBpc3AxMTZ4X2RlbGF5LAkJLyogcGxhdGZvcm0gZGVsYXkgZnVuY3Rpb24gKi8KK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgaXNwMTE2MF9yZXNvdXJjZVtdID0geworCXsKKwkJLnN0YXJ0CQk9IDB4MDgwMDAwMDAsCisJCS5lbmQJCT0gMHgwODAwMDAwMSwKKwkJLmZsYWdzCQk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJeworCQkuc3RhcnQJCT0gMHgwODAwMDAwMiwKKwkJLmVuZAkJPSAweDA4MDAwMDAzLAorCQkuZmxhZ3MJCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwl7CisJCS5zdGFydAkJPSA2NCwKKwkJLmZsYWdzCQk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBpc3AxMTYwX2RldmljZSA9IHsKKwkubmFtZQkJPSAiaXNwMTE2eC1oY2QiLAorCS5pZAkJPSAwLAorCS5yZXNvdXJjZQk9IGlzcDExNjBfcmVzb3VyY2UsCisJLm51bV9yZXNvdXJjZXMJPSAzLAorCS5kZXYJCT0geworCQkucGxhdGZvcm1fZGF0YSA9ICZpc3AxMTYwX2RhdGEsCisJfSwKK307CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19CT0FSRF9IQU1NRVJIRUFEX1VTQgorc3RhdGljIGludCBfX2luaXQgaGFtbWVyaGVhZF91c2JoX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgY2xrICpnY2xrOworCXN0cnVjdCBjbGsgKm9zYzsKKworCWludCByZXQ7CisKKwkvKiBzZXR1cCBzbWMgZm9yIHVzYmggKi8KKwlzbWNfc2V0X3RpbWluZygmaXNwMTE2MF9jb25maWcsICZpc3AxMTYwX3RpbWluZyk7CisJcmV0ID0gc21jX3NldF9jb25maWd1cmF0aW9uKDIsICZpc3AxMTYwX2NvbmZpZyk7CisKKwlpZiAocmV0IDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIKKwkJICAgICAgICJoYW1tZXJoZWFkOiBmYWlsZWQgdG8gc2V0IElTUDExNjAgVVNCSCB0aW1pbmdcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCS8qIHNldHVwIGdjbGswIHRvIHJ1biBmcm9tIG9zYzEgKi8KKwlnY2xrID0gY2xrX2dldChOVUxMLCAiZ2NsazAiKTsKKwlpZiAoSVNfRVJSKGdjbGspKQorCQlnb3RvIGVycl9nY2xrOworCisJb3NjID0gY2xrX2dldChOVUxMLCAib3NjMSIpOworCWlmIChJU19FUlIob3NjKSkKKwkJZ290byBlcnJfb3NjOworCisJaWYgKGNsa19zZXRfcGFyZW50KGdjbGssIG9zYykpIHsKKwkJcHJfZGVidWcoImhhbW1lcmhlYWQ6IGZhaWxlZCB0byBzZXQgb3NjMSBmb3IgVVNCSCBjbG9ja1xuIik7CisJCWdvdG8gZXJyX3NldF9jbGs7CisJfQorCisJLyogc2V0IGNsb2NrIHRvIDZNSHogKi8KKwljbGtfc2V0X3JhdGUoZ2NsaywgNjAwMDAwMCk7CisKKwkvKiBhbmQgZW5hYmxlICovCisJY2xrX2VuYWJsZShnY2xrKTsKKworCS8qIHNlbGVjdCBHQ0xLMCBwZXJpcGhlcmFsIGZ1bmN0aW9uICovCisJYXQzMl9zZWxlY3RfcGVyaXBoKEdQSU9fUElPQV9CQVNFLCBIQU1NRVJIRUFEX1VTQl9QRVJJUEhfR0NMSzAsCisJCQkgICBHUElPX1BFUklQSF9BLCAwKTsKKworCS8qIGVuYWJsZSBDUzIgcGVyaXBoZXJhbCBmdW5jdGlvbiAqLworCWF0MzJfc2VsZWN0X3BlcmlwaChHUElPX1BJT0VfQkFTRSwgSEFNTUVSSEVBRF9VU0JfUEVSSVBIX0NTMiwKKwkJCSAgIEdQSU9fUEVSSVBIX0EsIDApOworCisJLyogSF9XQUtFVVAgbXVzdCBiZSBkcml2ZW4gbG93ICovCisJYXQzMl9zZWxlY3RfZ3BpbyhHUElPX1BJTl9QQSg4KSwgQVQzMl9HUElPRl9PVVRQVVQpOworCisJLyogU2VsZWN0IEVYVElOVDAgZm9yIFBCMjUgKi8KKwlhdDMyX3NlbGVjdF9wZXJpcGgoR1BJT19QSU9CX0JBU0UsIEhBTU1FUkhFQURfVVNCX1BFUklQSF9FWFRJTlQwLAorCQkJICAgR1BJT19QRVJJUEhfQSwgMCk7CisKKwkvKiByZWdpc3RlciB1c2JoIGRldmljZSBkcml2ZXIgKi8KKwlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJmlzcDExNjBfZGV2aWNlKTsKKworIGVycl9zZXRfY2xrOgorCWNsa19wdXQob3NjKTsKKyBlcnJfb3NjOgorCWNsa19wdXQoZ2Nsayk7CisgZXJyX2djbGs6CisJcmV0dXJuIHJldDsKK30KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0JPQVJEX0hBTU1FUkhFQURfRlBHQQorc3RhdGljIHN0cnVjdCBzbWNfdGltaW5nIGZwZ2FfdGltaW5nIF9faW5pdGRhdGEgPSB7CisJLm5jc19yZWFkX3NldHVwCQk9IDE2LAorCS5ucmRfc2V0dXAJCT0gMzIsCisJLm5jc19yZWFkX3B1bHNlCQk9IDQ4LAorCS5ucmRfcHVsc2UJCT0gMzIsCisJLnJlYWRfY3ljbGUJCT0gNjQsCisKKwkubmNzX3dyaXRlX3NldHVwCT0gMTYsCisJLm53ZV9zZXR1cAkJPSAxNiwKKwkubmNzX3dyaXRlX3B1bHNlCT0gMzIsCisJLm53ZV9wdWxzZQkJPSAzMiwKKwkud3JpdGVfY3ljbGUJCT0gNjQsCit9OworCitzdGF0aWMgc3RydWN0IHNtY19jb25maWcgZnBnYV9jb25maWcgX19pbml0ZGF0YSA9IHsKKwkuYnVzX3dpZHRoCQk9IDQsCisJLm5yZF9jb250cm9sbGVkCQk9IDEsCisJLm53ZV9jb250cm9sbGVkCQk9IDEsCisJLmJ5dGVfd3JpdGUJCT0gMCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgaGhfZnBnYTBfcmVzb3VyY2VbXSA9IHsKKwl7CisJCS5zdGFydAkJPSAweGZmZTAwNDAwLAorCQkuZW5kCQk9IDB4ZmZlMDA0MDAgKyAweDNmZiwKKwkJLmZsYWdzCQk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJeworCQkuc3RhcnQJCT0gNCwKKwkJLmVuZAkJPSA0LAorCQkuZmxhZ3MJCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwl7CisJCS5zdGFydAkJPSAweDBjMDAwMDAwLAorCQkuZW5kCQk9IDB4MGMwMDAxMDAsCisJCS5mbGFncwkJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCXsKKwkJLnN0YXJ0CQk9IDY3LAorCQkuZW5kCQk9IDY3LAorCQkuZmxhZ3MJCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0YXRpYyB1NjQgaGhfZnBnYTBfZG1hX21hc2sgPSBETUFfMzJCSVRfTUFTSzsKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGhoX2ZwZ2EwX2RldmljZSA9IHsKKwkubmFtZQkJPSAiaGhfZnBnYSIsCisJLmlkCQk9IDAsCisJLmRldgkJPSB7CisJCS5kbWFfbWFzayA9ICZoaF9mcGdhMF9kbWFfbWFzaywKKwkJLmNvaGVyZW50X2RtYV9tYXNrID0gRE1BXzMyQklUX01BU0ssCisJfSwKKwkucmVzb3VyY2UJPSBoaF9mcGdhMF9yZXNvdXJjZSwKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoaGhfZnBnYTBfcmVzb3VyY2UpLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgaGhfZnBnYTBfc3BpX2NsayA9IHsKKwkubmFtZQkJPSAic3BpX2NsayIsCisJLmRldgkJPSAmaGhfZnBnYTBfZGV2aWNlLmRldiwKKwkubW9kZQkJPSBwYmFfY2xrX21vZGUsCisJLmdldF9yYXRlCT0gcGJhX2Nsa19nZXRfcmF0ZSwKKwkuaW5kZXgJCT0gMSwKK307CisKK3N0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKl9faW5pdCBhdDMyX2FkZF9kZXZpY2VfaGhfZnBnYSh2b2lkKQoreworCS8qIFNlbGVjdCBwZXJpcGhlcmFsIGZ1bmN0aW9uYWxsaXR5IGZvciBTUEkgU0NLIGFuZCBNT1NJICovCisJYXQzMl9zZWxlY3RfcGVyaXBoKEdQSU9fUElPQl9CQVNFLCBIQU1NRVJIRUFEX0ZQR0FfUEVSSVBIX1NDSywKKwkJCSAgIEdQSU9fUEVSSVBIX0IsIDApOworCWF0MzJfc2VsZWN0X3BlcmlwaChHUElPX1BJT0JfQkFTRSwgSEFNTUVSSEVBRF9GUEdBX1BFUklQSF9NT1NJLAorCQkJICAgR1BJT19QRVJJUEhfQiwgMCk7CisKKwkvKiByZXNlcnZlIGFsbCBvdGhlciBuZWVkZWQgZ3BpbworCSAqIFdlIGhhdmUgb24gYm9hcmQgcHVsbCB1cHMsIHNvIHRoZXJlIGlzIG5vIG5lZWQKKwkgKiB0byBlbmFibGUgZ3BpbyBwdWxsIHVwcyAqLworCS8qIElOSVRfRE9ORSAoaW5wdXQpICovCisJYXQzMl9zZWxlY3RfZ3BpbyhHUElPX1BJTl9QQigwKSwgMCk7CisKKwkvKiBuU1RBVFVTIChpbnB1dCkgKi8KKwlhdDMyX3NlbGVjdF9ncGlvKEdQSU9fUElOX1BCKDIpLCAwKTsKKworCS8qIG5DT05GSUcgKG91dHB1dCwgbG93KSAqLworCWF0MzJfc2VsZWN0X2dwaW8oR1BJT19QSU5fUEIoMyksIEFUMzJfR1BJT0ZfT1VUUFVUKTsKKworCS8qIENPTkZfRE9ORSAoaW5wdXQpICovCisJYXQzMl9zZWxlY3RfZ3BpbyhHUElPX1BJTl9QQig0KSwgMCk7CisKKwkvKiBTZWxlY3QgRVhUSU5UMyBmb3IgUEIyOCAoSW50ZXJydXB0IGZyb20gRlBHQSkgKi8KKwlhdDMyX3NlbGVjdF9wZXJpcGgoR1BJT19QSU9CX0JBU0UsIEhBTU1FUkhFQURfRlBHQV9QRVJJUEhfRVhUSU5UMywKKwkJCSAgIEdQSU9fUEVSSVBIX0EsIDApOworCisJLyogR2V0IG91ciBwYXJlbnQgY2xvY2sgKi8KKwloaF9mcGdhMF9zcGlfY2xrLnBhcmVudCA9IGNsa19nZXQoTlVMTCwgInBiYSIpOworCWNsa19wdXQoaGhfZnBnYTBfc3BpX2Nsay5wYXJlbnQpOworCisJLyogUmVnaXN0ZXIgY2xvY2sgaW4gYXQzMiBjbG9jayB0cmVlICovCisJYXQzMl9jbGtfcmVnaXN0ZXIoJmhoX2ZwZ2EwX3NwaV9jbGspOworCisJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZoaF9mcGdhMF9kZXZpY2UpOworCXJldHVybiAmaGhfZnBnYTBfZGV2aWNlOworfQorI2VuZGlmCisKKy8qIFRoaXMgbmVlZHMgdG8gYmUgY2FsbGVkIGFmdGVyIHRoZSBTTUMgaGFzIGJlZW4gaW5pdGlhbGl6ZWQgKi8KK3N0YXRpYyBpbnQgX19pbml0IGhhbW1lcmhlYWRfZmxhc2hfaW5pdCh2b2lkKQoreworCWludCByZXQ7CisKKwlzbWNfc2V0X3RpbWluZygmZmxhc2hfY29uZmlnLCAmZmxhc2hfdGltaW5nKTsKKwlyZXQgPSBzbWNfc2V0X2NvbmZpZ3VyYXRpb24oMCwgJmZsYXNoX2NvbmZpZyk7CisKKwlpZiAocmV0IDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgImhhbW1lcmhlYWQ6IGZhaWxlZCB0byBzZXQgTk9SIGZsYXNoIHRpbWluZ1xuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZmbGFzaF9kZXZpY2UpOworCisjaWZkZWYgQ09ORklHX0JPQVJEX0hBTU1FUkhFQURfVVNCCisJaGFtbWVyaGVhZF91c2JoX2luaXQoKTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0JPQVJEX0hBTU1FUkhFQURfRlBHQQorCS8qIFNldHVwIFNNQyBmb3IgRlBHQSBpbnRlcmZhY2UgKi8KKwlzbWNfc2V0X3RpbWluZygmZnBnYV9jb25maWcsICZmcGdhX3RpbWluZyk7CisJcmV0ID0gc21jX3NldF9jb25maWd1cmF0aW9uKDMsICZmcGdhX2NvbmZpZyk7CisjZW5kaWYKKworCisJaWYgKHJldCA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJoYW1tZXJoZWFkOiBmYWlsZWQgdG8gc2V0IEZQR0EgdGltaW5nXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworZGV2aWNlX2luaXRjYWxsKGhhbW1lcmhlYWRfZmxhc2hfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL2JvYXJkcy9oYW1tZXJoZWFkL2ZsYXNoLmggYi9hcmNoL2F2cjMyL2JvYXJkcy9oYW1tZXJoZWFkL2ZsYXNoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWE3MGM2MgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXZyMzIvYm9hcmRzL2hhbW1lcmhlYWQvZmxhc2guaApAQCAtMCwwICsxLDYgQEAKKyNpZm5kZWYgX19CT0FSRFNfSEFNTUVSSEVBRF9GTEFTSF9ICisjZGVmaW5lIF9fQk9BUkRTX0hBTU1FUkhFQURfRkxBU0hfSAorCitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICphdDMyX2FkZF9kZXZpY2VfaGhfZnBnYSh2b2lkKTsKKworI2VuZGlmIC8qIF9fQk9BUkRTX0hBTU1FUkhFQURfRkxBU0hfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9ib2FyZHMvaGFtbWVyaGVhZC9zZXR1cC5jIGIvYXJjaC9hdnIzMi9ib2FyZHMvaGFtbWVyaGVhZC9zZXR1cC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkMmZlODIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2F2cjMyL2JvYXJkcy9oYW1tZXJoZWFkL3NldHVwLmMKQEAgLTAsMCArMSwyNDUgQEAKKy8qCisgKiBCb2FyZC1zcGVjaWZpYyBzZXR1cCBjb2RlIGZvciB0aGUgTWlyb21pY28gSGFtbWVyaGVhZCBib2FyZAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBNaXJvbWljbyBBRworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKyNpbmNsdWRlIDxsaW51eC9hdG1lbC1tY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9mYi5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLWdwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorCisjaW5jbHVkZSA8dmlkZW8vYXRtZWxfbGNkYy5oPgorCisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxhc20vc2V0dXAuaD4KKworI2luY2x1ZGUgPG1hY2gvYXQzMmFwNzAweC5oPgorI2luY2x1ZGUgPG1hY2gvYm9hcmQuaD4KKyNpbmNsdWRlIDxtYWNoL2luaXQuaD4KKyNpbmNsdWRlIDxtYWNoL3BvcnRtdXguaD4KKworI2luY2x1ZGUgIi4uLy4uL21hY2gtYXQzMmFwL2Nsb2NrLmgiCisjaW5jbHVkZSAiZmxhc2guaCIKKworLyogT3NjaWxsYXRvciBmcmVxdWVuY2llcy4gVGhlc2UgYXJlIGJvYXJkLXNwZWNpZmljICovCit1bnNpZ25lZCBsb25nIGF0MzJfYm9hcmRfb3NjX3JhdGVzWzNdID0geworCVswXSA9IDMyNzY4LAkvKiAzMi43Njgga0h6IG9uIFJUQyBvc2MgKi8KKwlbMV0gPSAyNTAwMDAwMCwgLyogMjVNSHogb24gb3NjMCAqLworCVsyXSA9IDEyMDAwMDAwLAkvKiAxMiBNSHogb24gb3NjMSAqLworfTsKKworLyogSW5pdGlhbGl6ZWQgYnkgYm9vdGxvYWRlci1zcGVjaWZpYyBzdGFydHVwIGNvZGUuICovCitzdHJ1Y3QgdGFnICpib290bG9hZGVyX3RhZ3MgX19pbml0ZGF0YTsKKworI2lmZGVmIENPTkZJR19CT0FSRF9IQU1NRVJIRUFEX0xDRAorc3RhdGljIHN0cnVjdCBmYl92aWRlb21vZGUgX19pbml0ZGF0YSBoZGEzNTB0bHZfbW9kZXNbXSA9IHsKKwl7CisJCS5uYW1lCQk9ICIzMjB4MjQwIEAgNzUiLAorCQkucmVmcmVzaAk9IDc1LAorCQkueHJlcwkJPSAzMjAsCisJCS55cmVzCQk9IDI0MCwKKwkJLnBpeGNsb2NrCT0gS0haMlBJQ09TKDY4OTEpLAorCisJCS5sZWZ0X21hcmdpbgk9IDQ4LAorCQkucmlnaHRfbWFyZ2luCT0gMTgsCisJCS51cHBlcl9tYXJnaW4JPSAxOCwKKwkJLmxvd2VyX21hcmdpbgk9IDQsCisJCS5oc3luY19sZW4JPSAyMCwKKwkJLnZzeW5jX2xlbgk9IDIsCisKKwkJLnN5bmMJCT0gMCwKKwkJLnZtb2RlCQk9IEZCX1ZNT0RFX05PTklOVEVSTEFDRUQsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZmJfbW9uc3BlY3MgX19pbml0ZGF0YSBoYW1tZXJoZWFkX2hkYTM1MHRfbW9uc3BlY3MgPSB7CisJLm1hbnVmYWN0dXJlcgkJPSAiSEFOIiwKKwkubW9uaXRvcgkJPSAiSERBMzUwVC1MViIsCisJLm1vZGVkYgkJCT0gaGRhMzUwdGx2X21vZGVzLAorCS5tb2RlZGJfbGVuCQk9IEFSUkFZX1NJWkUoaGRhMzUwdGx2X21vZGVzKSwKKwkuaGZtaW4JCQk9IDE0OTAwLAorCS5oZm1heAkJCT0gMjIzNTAsCisJLnZmbWluCQkJPSA2MCwKKwkudmZtYXgJCQk9IDkwLAorCS5kY2xrbWF4CQk9IDEwMDAwMDAwLAorfTsKKworc3RydWN0IGF0bWVsX2xjZGZiX2luZm8gX19pbml0ZGF0YSBoYW1tZXJoZWFkX2xjZGNfZGF0YSA9IHsKKwkuZGVmYXVsdF9icHAJCT0gMjQsCisJLmRlZmF1bHRfZG1hY29uCQk9IEFUTUVMX0xDRENfRE1BRU4gfCBBVE1FTF9MQ0RDX0RNQTJERU4sCisJLmRlZmF1bHRfbGNkY29uMgk9IChBVE1FTF9MQ0RDX0RJU1RZUEVfVEZUCisJCQkJICAgfCBBVE1FTF9MQ0RDX0lOVkNMSworCQkJCSAgIHwgQVRNRUxfTENEQ19DTEtNT0RfQUxXQVlTQUNUSVZFCisJCQkJICAgfCBBVE1FTF9MQ0RDX01FTU9SX0JJRyksCisJLmRlZmF1bHRfbW9uc3BlY3MJPSAmaGFtbWVyaGVhZF9oZGEzNTB0X21vbnNwZWNzLAorCS5ndWFyZF90aW1lCQk9IDIsCit9OworI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgbWNpX3BsYXRmb3JtX2RhdGEgX19pbml0ZGF0YSBtY2kwX2RhdGEgPSB7CisJLnNsb3RbMF0gPSB7CisJCS5idXNfd2lkdGgJPSA0LAorCQkuZGV0ZWN0X3Bpbgk9IC1FTk9ERVYsCisJCS53cF9waW4JCT0gLUVOT0RFViwKKwl9LAorfTsKKworc3RydWN0IGV0aF9hZGRyIHsKKwl1OCBhZGRyWzZdOworfTsKKworc3RhdGljIHN0cnVjdCBldGhfYWRkciBfX2luaXRkYXRhIGh3X2FkZHJbMV07CitzdGF0aWMgc3RydWN0IGV0aF9wbGF0Zm9ybV9kYXRhIF9faW5pdGRhdGEgZXRoX2RhdGFbMV07CisKKy8qCisgKiBUaGUgbmV4dCB0d28gZnVuY3Rpb25zIHNob3VsZCBnbyBhd2F5IGFzIHRoZSBib290IGxvYWRlciBpcworICogc3VwcG9zZWQgdG8gaW5pdGlhbGl6ZSB0aGUgbWFjYiBhZGRyZXNzIHJlZ2lzdGVycyB3aXRoIGEgdmFsaWQKKyAqIGV0aGVybmV0IGFkZHJlc3MuIEJ1dCB3ZSBuZWVkIHRvIGtlZXAgaXQgYXJvdW5kIGZvciBhIHdoaWxlIHVudGlsCisgKiB3ZSBjYW4gYmUgcmVhc29uYWJseSBzdXJlIHRoZSBib290IGxvYWRlciBkb2VzIHRoaXMuCisgKgorICogVGhlIHBoeV9pZCBpcyBpZ25vcmVkIGFzIHRoZSBkcml2ZXIgd2lsbCBwcm9iZSBmb3IgaXQuCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IHBhcnNlX3RhZ19ldGhlcm5ldChzdHJ1Y3QgdGFnICp0YWcpCit7CisJaW50IGkgPSB0YWctPnUuZXRoZXJuZXQubWFjX2luZGV4OworCisJaWYgKGkgPCBBUlJBWV9TSVpFKGh3X2FkZHIpKQorCQltZW1jcHkoaHdfYWRkcltpXS5hZGRyLCB0YWctPnUuZXRoZXJuZXQuaHdfYWRkcmVzcywKKwkJICAgICAgIHNpemVvZihod19hZGRyW2ldLmFkZHIpKTsKKworCXJldHVybiAwOworfQorX190YWd0YWJsZShBVEFHX0VUSEVSTkVULCBwYXJzZV90YWdfZXRoZXJuZXQpOworCitzdGF0aWMgdm9pZCBfX2luaXQgc2V0X2h3X2FkZHIoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJY29uc3QgdTggKmFkZHI7CisJdm9pZCBfX2lvbWVtICpyZWdzOworCXN0cnVjdCBjbGsgKnBjbGs7CisKKwlpZiAoIXJlcykKKwkJcmV0dXJuOworCisJaWYgKHBkZXYtPmlkID49IEFSUkFZX1NJWkUoaHdfYWRkcikpCisJCXJldHVybjsKKworCWFkZHIgPSBod19hZGRyW3BkZXYtPmlkXS5hZGRyOworCisJaWYgKCFpc192YWxpZF9ldGhlcl9hZGRyKGFkZHIpKQorCQlyZXR1cm47CisKKwkvKgorCSAqIFNpbmNlIHRoaXMgaXMgYm9hcmQtc3BlY2lmaWMgY29kZSwgd2UnbGwgY2hlYXQgYW5kIHVzZSB0aGUKKwkgKiBwaHlzaWNhbCBhZGRyZXNzIGRpcmVjdGx5IGFzIHdlIGhhcHBlbiB0byBrbm93IHRoYXQgaXQncworCSAqIHRoZSBzYW1lIGFzIHRoZSB2aXJ0dWFsIGFkZHJlc3MuCisJICovCisJcmVncyA9ICh2b2lkIF9faW9tZW0gX19mb3JjZSAqKXJlcy0+c3RhcnQ7CisJcGNsayA9IGNsa19nZXQoJnBkZXYtPmRldiwgInBjbGsiKTsKKworCWlmICghcGNsaykKKwkJcmV0dXJuOworCisJY2xrX2VuYWJsZShwY2xrKTsKKworCV9fcmF3X3dyaXRlbCgoYWRkclszXSA8PCAyNCkgfCAoYWRkclsyXSA8PCAxNikgfCAoYWRkclsxXSA8PCA4KSB8CisJCSAgICAgYWRkclswXSwgcmVncyArIDB4OTgpOworCV9fcmF3X3dyaXRlbCgoYWRkcls1XSA8PCA4KSB8IGFkZHJbNF0sIHJlZ3MgKyAweDljKTsKKworCWNsa19kaXNhYmxlKHBjbGspOworCWNsa19wdXQocGNsayk7Cit9CisKK3ZvaWQgX19pbml0IHNldHVwX2JvYXJkKHZvaWQpCit7CisJYXQzMl9tYXBfdXNhcnQoMSwgMCk7CS8qIFVTQVJUIDE6IC9kZXYvdHR5UzAsIERCOSAqLworCWF0MzJfc2V0dXBfc2VyaWFsX2NvbnNvbGUoMCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2dwaW9fcGxhdGZvcm1fZGF0YSBpMmNfZ3Bpb19kYXRhID0geworCS5zZGFfcGluCQk9IEdQSU9fUElOX1BBKDYpLAorCS5zY2xfcGluCQk9IEdQSU9fUElOX1BBKDcpLAorCS5zZGFfaXNfb3Blbl9kcmFpbgk9IDEsCisJLnNjbF9pc19vcGVuX2RyYWluCT0gMSwKKwkudWRlbGF5CQkJPSAyLAkvKiBjbG9zZSB0byAxMDAga0h6ICovCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBpMmNfZ3Bpb19kZXZpY2UgPSB7CisJLm5hbWUJCT0gImkyYy1ncGlvIiwKKwkuaWQJCT0gMCwKKwkuZGV2CQk9IHsgLnBsYXRmb3JtX2RhdGEgPSAmaTJjX2dwaW9fZGF0YSwgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gX19pbml0ZGF0YSBpMmNfaW5mb1tdID0ge307CisKKyNpZmRlZiBDT05GSUdfQk9BUkRfSEFNTUVSSEVBRF9TTkQKK3N0YXRpYyBzdHJ1Y3QgYWM5N2NfcGxhdGZvcm1fZGF0YSBhYzk3Y19kYXRhID0geworCS5yZXNldF9waW4gPSBHUElPX1BJTl9QQSgxNiksCit9OworI2VuZGlmCisKK3N0YXRpYyBpbnQgX19pbml0IGhhbW1lcmhlYWRfaW5pdCh2b2lkKQoreworCS8qCisJICogSGFtbWVyaGVhZCB1c2VzIDMyLWJpdCBTRFJBTSBpbnRlcmZhY2UuIFJlc2VydmUgdGhlCisJICogU0RSQU0tc3BlY2lmaWMgcGlucyBzbyB0aGF0IG5vYm9keSBtZXNzZXMgd2l0aCB0aGVtLgorCSAqLworCWF0MzJfcmVzZXJ2ZV9waW4oR1BJT19QSU9FX0JBU0UsIEFUTUVMX0VCSV9QRV9EQVRBX0FMTCk7CisKKwlhdDMyX2FkZF9kZXZpY2VfdXNhcnQoMCk7CisKKwkvKiBSZXNlcnZlIFBCMjkgKEdDTEszKS4gVGhpcyBwaW4gaXMgdXNlZCBhcyBjbG9jayBzb3VyY2UKKwkgKiBmb3IgRVRIIFBIWSAoMjVNSHopLiBHQ0xLMyBzZXR1cCBpcyBkb25lIGJ5IFUtQm9vdC4KKwkgKi8KKwlhdDMyX3Jlc2VydmVfcGluKEdQSU9fUElPQl9CQVNFLCAoMTw8MjkpKTsKKworCS8qCisJICogSGFtbWVyaGVhZCB1c2VzIG9ubHkgb25lIGV0aGVybmV0IHBvcnQsIHNvIHdlIGRvbid0IHNldAorCSAqIGFkZHJlc3Mgb2Ygc2Vjb25kIHBvcnQKKwkgKi8KKwlzZXRfaHdfYWRkcihhdDMyX2FkZF9kZXZpY2VfZXRoKDAsICZldGhfZGF0YVswXSkpOworCisjaWZkZWYgQ09ORklHX0JPQVJEX0hBTU1FUkhFQURfRlBHQQorCWF0MzJfYWRkX2RldmljZV9oaF9mcGdhKCk7CisjZW5kaWYKKwlhdDMyX2FkZF9kZXZpY2VfbWNpKDAsICZtY2kwX2RhdGEpOworCisjaWZkZWYgQ09ORklHX0JPQVJEX0hBTU1FUkhFQURfVVNCCisJYXQzMl9hZGRfZGV2aWNlX3VzYmEoMCwgTlVMTCk7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQk9BUkRfSEFNTUVSSEVBRF9MQ0QKKwlhdDMyX2FkZF9kZXZpY2VfbGNkYygwLCAmaGFtbWVyaGVhZF9sY2RjX2RhdGEsIGZibWVtX3N0YXJ0LAorCQkJICAgICBmYm1lbV9zaXplLCBBVE1FTF9MQ0RDX1BSSV8yNEJJVCk7CisjZW5kaWYKKworCWF0MzJfc2VsZWN0X2dwaW8oaTJjX2dwaW9fZGF0YS5zZGFfcGluLAorCQkJIEFUMzJfR1BJT0ZfTVVMVElEUlYgfCBBVDMyX0dQSU9GX09VVFBVVCB8CisJCQkgQVQzMl9HUElPRl9ISUdIKTsKKwlhdDMyX3NlbGVjdF9ncGlvKGkyY19ncGlvX2RhdGEuc2NsX3BpbiwKKwkJCSBBVDMyX0dQSU9GX01VTFRJRFJWIHwgQVQzMl9HUElPRl9PVVRQVVQgfAorCQkJIEFUMzJfR1BJT0ZfSElHSCk7CisJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZpMmNfZ3Bpb19kZXZpY2UpOworCWkyY19yZWdpc3Rlcl9ib2FyZF9pbmZvKDAsIGkyY19pbmZvLCBBUlJBWV9TSVpFKGkyY19pbmZvKSk7CisKKyNpZmRlZiBDT05GSUdfQk9BUkRfSEFNTUVSSEVBRF9TTkQKKwlhdDMyX2FkZF9kZXZpY2VfYWM5N2MoMCwgJmFjOTdjX2RhdGEpOworI2VuZGlmCisKKwkvKiBTZWxlY3QgdGhlIFRvdWNoc2NyZWVuIGludGVycnVwdCBwaW4gbW9kZSAqLworCWF0MzJfc2VsZWN0X3BlcmlwaChHUElPX1BJT0JfQkFTRSwgMHgwODAwMDAwMCwgR1BJT19QRVJJUEhfQSwgMCk7CisKKwlyZXR1cm4gMDsKK30KKworcG9zdGNvcmVfaW5pdGNhbGwoaGFtbWVyaGVhZF9pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIvYm9hcmRzL21pbWMyMDAvc2V0dXAuYyBiL2FyY2gvYXZyMzIvYm9hcmRzL21pbWMyMDAvc2V0dXAuYwppbmRleCAzOTdjYmI4Li4yYjU4ZDYxIDEwMDY0NAotLS0gYS9hcmNoL2F2cjMyL2JvYXJkcy9taW1jMjAwL3NldHVwLmMKKysrIGIvYXJjaC9hdnIzMi9ib2FyZHMvbWltYzIwMC9zZXR1cC5jCkBAIC0yNCw3ICsyNCw3IEBACiAjaW5jbHVkZSA8dmlkZW8vYXRtZWxfbGNkYy5oPgogI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CiAKLSNpbmNsdWRlIDxhc20vYXRtZWwtbWNpLmg+CisjaW5jbHVkZSA8bGludXgvYXRtZWwtbWNpLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxhc20vc2V0dXAuaD4KIApAQCAtMjA3LDggKzIwNyw2IEBACiAJICogcmVzZXJ2ZSBhbnkgcGlucyBmb3IgaXQuCiAJICovCiAKLQlhdDMyX2FkZF9zeXN0ZW1fZGV2aWNlcygpOwotCiAJYXQzMl9hZGRfZGV2aWNlX3VzYXJ0KDApOwogCWF0MzJfYWRkX2RldmljZV91c2FydCgxKTsKIAlhdDMyX2FkZF9kZXZpY2VfdXNhcnQoMik7CmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL2NvbmZpZ3MvYXRuZ3cxMDBfZGVmY29uZmlnIGIvYXJjaC9hdnIzMi9jb25maWdzL2F0bmd3MTAwX2RlZmNvbmZpZwppbmRleCA1NDE1MjA5Li4xNjRlMjgxIDEwMDY0NAotLS0gYS9hcmNoL2F2cjMyL2NvbmZpZ3MvYXRuZ3cxMDBfZGVmY29uZmlnCisrKyBiL2FyY2gvYXZyMzIvY29uZmlncy9hdG5ndzEwMF9kZWZjb25maWcKQEAgLTg5Miw3ICs4OTIsNyBAQAogIyBETUEgQ2xpZW50cwogIwogIyBDT05GSUdfTkVUX0RNQSBpcyBub3Qgc2V0Ci1DT05GSUdfRE1BVEVTVD1tCisjIENPTkZJR19ETUFURVNUIGlzIG5vdCBzZXQKICMgQ09ORklHX1VJTyBpcyBub3Qgc2V0CiAKICMKZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIvY29uZmlncy9hdHN0azEwMDJfZGVmY29uZmlnIGIvYXJjaC9hdnIzMi9jb25maWdzL2F0c3RrMTAwMl9kZWZjb25maWcKaW5kZXggNjlmY2U2Yi4uYzlkYzY0OCAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9jb25maWdzL2F0c3RrMTAwMl9kZWZjb25maWcKKysrIGIvYXJjaC9hdnIzMi9jb25maWdzL2F0c3RrMTAwMl9kZWZjb25maWcKQEAgLTk2NCw3ICs5NjQsNyBAQAogIyBETUEgQ2xpZW50cwogIwogIyBDT05GSUdfTkVUX0RNQSBpcyBub3Qgc2V0Ci1DT05GSUdfRE1BVEVTVD1tCisjIENPTkZJR19ETUFURVNUIGlzIG5vdCBzZXQKICMgQ09ORklHX1VJTyBpcyBub3Qgc2V0CiAKICMKZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIvY29uZmlncy9hdHN0azEwMDNfZGVmY29uZmlnIGIvYXJjaC9hdnIzMi9jb25maWdzL2F0c3RrMTAwM19kZWZjb25maWcKaW5kZXggNTQ3N2VkMy4uMjllYTEzMiAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9jb25maWdzL2F0c3RrMTAwM19kZWZjb25maWcKKysrIGIvYXJjaC9hdnIzMi9jb25maWdzL2F0c3RrMTAwM19kZWZjb25maWcKQEAgLTg4Miw3ICs4ODIsNyBAQAogIyBETUEgQ2xpZW50cwogIwogIyBDT05GSUdfTkVUX0RNQSBpcyBub3Qgc2V0Ci1DT05GSUdfRE1BVEVTVD1tCisjIENPTkZJR19ETUFURVNUIGlzIG5vdCBzZXQKICMgQ09ORklHX1VJTyBpcyBub3Qgc2V0CiAKICMKZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIvY29uZmlncy9hdHN0azEwMDZfZGVmY29uZmlnIGIvYXJjaC9hdnIzMi9jb25maWdzL2F0c3RrMTAwNl9kZWZjb25maWcKaW5kZXggNmM0NWEzYi4uMzYxYzMxYyAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9jb25maWdzL2F0c3RrMTAwNl9kZWZjb25maWcKKysrIGIvYXJjaC9hdnIzMi9jb25maWdzL2F0c3RrMTAwNl9kZWZjb25maWcKQEAgLTEwMTQsNyArMTAxNCw3IEBACiAjIERNQSBDbGllbnRzCiAjCiAjIENPTkZJR19ORVRfRE1BIGlzIG5vdCBzZXQKLUNPTkZJR19ETUFURVNUPW0KKyMgQ09ORklHX0RNQVRFU1QgaXMgbm90IHNldAogIyBDT05GSUdfVUlPIGlzIG5vdCBzZXQKICMgQ09ORklHX1NUQUdJTkcgaXMgbm90IHNldAogQ09ORklHX1NUQUdJTkdfRVhDTFVERV9CVUlMRD15CmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL2NvbmZpZ3MvaGFtbWVyaGVhZF9kZWZjb25maWcgYi9hcmNoL2F2cjMyL2NvbmZpZ3MvaGFtbWVyaGVhZF9kZWZjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQzZDI5OAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXZyMzIvY29uZmlncy9oYW1tZXJoZWFkX2RlZmNvbmZpZwpAQCAtMCwwICsxLDE0NjcgQEAKKyMKKyMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4yNworIyBUdWUgRGVjICA5IDE1OjM3OjMwIDIwMDgKKyMKK0NPTkZJR19BVlIzMj15CitDT05GSUdfR0VORVJJQ19HUElPPXkKK0NPTkZJR19HRU5FUklDX0hBUkRJUlFTPXkKK0NPTkZJR19TVEFDS1RSQUNFX1NVUFBPUlQ9eQorQ09ORklHX0xPQ0tERVBfU1VQUE9SVD15CitDT05GSUdfVFJBQ0VfSVJRRkxBR1NfU1VQUE9SVD15CitDT05GSUdfSEFSRElSUVNfU1dfUkVTRU5EPXkKK0NPTkZJR19HRU5FUklDX0lSUV9QUk9CRT15CitDT05GSUdfUldTRU1fR0VORVJJQ19TUElOTE9DSz15CitDT05GSUdfR0VORVJJQ19USU1FPXkKK0NPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTPXkKKyMgQ09ORklHX1JXU0VNX1hDSEdBRERfQUxHT1JJVEhNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSEFTX0lMT0cyX1UzMiBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0hBU19JTE9HMl9VNjQgaXMgbm90IHNldAorQ09ORklHX0dFTkVSSUNfSFdFSUdIVD15CitDT05GSUdfR0VORVJJQ19DQUxJQlJBVEVfREVMQVk9eQorQ09ORklHX0dFTkVSSUNfQlVHPXkKK0NPTkZJR19ERUZDT05GSUdfTElTVD0iL2xpYi9tb2R1bGVzLyRVTkFNRV9SRUxFQVNFLy5jb25maWciCisKKyMKKyMgR2VuZXJhbCBzZXR1cAorIworQ09ORklHX0VYUEVSSU1FTlRBTD15CitDT05GSUdfQlJPS0VOX09OX1NNUD15CitDT05GSUdfSU5JVF9FTlZfQVJHX0xJTUlUPTMyCitDT05GSUdfTE9DQUxWRVJTSU9OPSIiCisjIENPTkZJR19MT0NBTFZFUlNJT05fQVVUTyBpcyBub3Qgc2V0CitDT05GSUdfU1dBUD15CitDT05GSUdfU1lTVklQQz15CitDT05GSUdfU1lTVklQQ19TWVNDVEw9eQorQ09ORklHX1BPU0lYX01RVUVVRT15CitDT05GSUdfQlNEX1BST0NFU1NfQUNDVD15CitDT05GSUdfQlNEX1BST0NFU1NfQUNDVF9WMz15CisjIENPTkZJR19UQVNLU1RBVFMgaXMgbm90IHNldAorIyBDT05GSUdfQVVESVQgaXMgbm90IHNldAorIyBDT05GSUdfSUtDT05GSUcgaXMgbm90IHNldAorQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKKyMgQ09ORklHX0NHUk9VUFMgaXMgbm90IHNldAorIyBDT05GSUdfR1JPVVBfU0NIRUQgaXMgbm90IHNldAorQ09ORklHX1NZU0ZTX0RFUFJFQ0FURUQ9eQorQ09ORklHX1NZU0ZTX0RFUFJFQ0FURURfVjI9eQorIyBDT05GSUdfUkVMQVkgaXMgbm90IHNldAorIyBDT05GSUdfTkFNRVNQQUNFUyBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9JTklUUkQ9eQorQ09ORklHX0lOSVRSQU1GU19TT1VSQ0U9IiIKK0NPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRT15CitDT05GSUdfU1lTQ1RMPXkKK0NPTkZJR19FTUJFRERFRD15CisjIENPTkZJR19TWVNDVExfU1lTQ0FMTCBpcyBub3Qgc2V0CitDT05GSUdfS0FMTFNZTVM9eQorIyBDT05GSUdfS0FMTFNZTVNfQUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tBTExTWU1TX0VYVFJBX1BBU1MgaXMgbm90IHNldAorQ09ORklHX0hPVFBMVUc9eQorQ09ORklHX1BSSU5USz15CitDT05GSUdfQlVHPXkKK0NPTkZJR19FTEZfQ09SRT15CisjIENPTkZJR19DT01QQVRfQlJLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JBU0VfRlVMTCBpcyBub3Qgc2V0CitDT05GSUdfRlVURVg9eQorQ09ORklHX0FOT05fSU5PREVTPXkKK0NPTkZJR19FUE9MTD15CitDT05GSUdfU0lHTkFMRkQ9eQorQ09ORklHX1RJTUVSRkQ9eQorQ09ORklHX0VWRU5URkQ9eQorQ09ORklHX1NITUVNPXkKK0NPTkZJR19BSU89eQorQ09ORklHX1ZNX0VWRU5UX0NPVU5URVJTPXkKK0NPTkZJR19QQ0lfUVVJUktTPXkKK0NPTkZJR19TTFVCX0RFQlVHPXkKKyMgQ09ORklHX1NMQUIgaXMgbm90IHNldAorQ09ORklHX1NMVUI9eQorIyBDT05GSUdfU0xPQiBpcyBub3Qgc2V0CitDT05GSUdfUFJPRklMSU5HPXkKKyMgQ09ORklHX01BUktFUlMgaXMgbm90IHNldAorQ09ORklHX09QUk9GSUxFPW0KK0NPTkZJR19IQVZFX09QUk9GSUxFPXkKK0NPTkZJR19LUFJPQkVTPXkKK0NPTkZJR19IQVZFX0tQUk9CRVM9eQorQ09ORklHX0hBVkVfQ0xLPXkKKyMgQ09ORklHX0hBVkVfR0VORVJJQ19ETUFfQ09IRVJFTlQgaXMgbm90IHNldAorQ09ORklHX1NMQUJJTkZPPXkKK0NPTkZJR19SVF9NVVRFWEVTPXkKKyMgQ09ORklHX1RJTllfU0hNRU0gaXMgbm90IHNldAorQ09ORklHX0JBU0VfU01BTEw9MQorQ09ORklHX01PRFVMRVM9eQorIyBDT05GSUdfTU9EVUxFX0ZPUkNFX0xPQUQgaXMgbm90IHNldAorQ09ORklHX01PRFVMRV9VTkxPQUQ9eQorQ09ORklHX01PRFVMRV9GT1JDRV9VTkxPQUQ9eQorIyBDT05GSUdfTU9EVkVSU0lPTlMgaXMgbm90IHNldAorIyBDT05GSUdfTU9EVUxFX1NSQ1ZFUlNJT05fQUxMIGlzIG5vdCBzZXQKK0NPTkZJR19LTU9EPXkKK0NPTkZJR19CTE9DSz15CisjIENPTkZJR19MQkQgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9JT19UUkFDRSBpcyBub3Qgc2V0CisjIENPTkZJR19MU0YgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9CU0cgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9JTlRFR1JJVFkgaXMgbm90IHNldAorCisjCisjIElPIFNjaGVkdWxlcnMKKyMKK0NPTkZJR19JT1NDSEVEX05PT1A9eQorIyBDT05GSUdfSU9TQ0hFRF9BUyBpcyBub3Qgc2V0CisjIENPTkZJR19JT1NDSEVEX0RFQURMSU5FIGlzIG5vdCBzZXQKK0NPTkZJR19JT1NDSEVEX0NGUT15CisjIENPTkZJR19ERUZBVUxUX0FTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFRkFVTFRfREVBRExJTkUgaXMgbm90IHNldAorQ09ORklHX0RFRkFVTFRfQ0ZRPXkKKyMgQ09ORklHX0RFRkFVTFRfTk9PUCBpcyBub3Qgc2V0CitDT05GSUdfREVGQVVMVF9JT1NDSEVEPSJjZnEiCitDT05GSUdfQ0xBU1NJQ19SQ1U9eQorIyBDT05GSUdfRlJFRVpFUiBpcyBub3Qgc2V0CisKKyMKKyMgU3lzdGVtIFR5cGUgYW5kIGZlYXR1cmVzCisjCitDT05GSUdfVElDS19PTkVTSE9UPXkKK0NPTkZJR19OT19IWj15CitDT05GSUdfSElHSF9SRVNfVElNRVJTPXkKK0NPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTX0JVSUxEPXkKK0NPTkZJR19TVUJBUkNIX0FWUjMyQj15CitDT05GSUdfTU1VPXkKK0NPTkZJR19QRVJGT1JNQU5DRV9DT1VOVEVSUz15CitDT05GSUdfUExBVEZPUk1fQVQzMkFQPXkKK0NPTkZJR19DUFVfQVQzMkFQNzAwWD15CitDT05GSUdfQ1BVX0FUMzJBUDcwMDA9eQorIyBDT05GSUdfQk9BUkRfQVRTVEsxMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JPQVJEX0FUTkdXMTAwIGlzIG5vdCBzZXQKK0NPTkZJR19CT0FSRF9IQU1NRVJIRUFEPXkKKyMgQ09ORklHX0JPQVJEX0ZBVlJfMzIgaXMgbm90IHNldAorIyBDT05GSUdfQk9BUkRfTUlNQzIwMCBpcyBub3Qgc2V0CitDT05GSUdfQk9BUkRfSEFNTUVSSEVBRF9VU0I9eQorQ09ORklHX0JPQVJEX0hBTU1FUkhFQURfTENEPXkKK0NPTkZJR19CT0FSRF9IQU1NRVJIRUFEX1NORD15CisjIENPTkZJR19CT0FSRF9IQU1NRVJIRUFEX0ZQR0EgaXMgbm90IHNldAorQ09ORklHX0xPQURFUl9VX0JPT1Q9eQorCisjCisjIEF0bWVsIEFWUjMyIEFQIG9wdGlvbnMKKyMKKyMgQ09ORklHX0FQNzAwWF8zMl9CSVRfU01DIGlzIG5vdCBzZXQKK0NPTkZJR19BUDcwMFhfMTZfQklUX1NNQz15CisjIENPTkZJR19BUDcwMFhfOF9CSVRfU01DIGlzIG5vdCBzZXQKK0NPTkZJR19MT0FEX0FERFJFU1M9MHgxMDAwMDAwMAorQ09ORklHX0VOVFJZX0FERFJFU1M9MHg5MDAwMDAwMAorQ09ORklHX1BIWVNfT0ZGU0VUPTB4MTAwMDAwMDAKK0NPTkZJR19QUkVFTVBUX05PTkU9eQorIyBDT05GSUdfUFJFRU1QVF9WT0xVTlRBUlkgaXMgbm90IHNldAorIyBDT05GSUdfUFJFRU1QVCBpcyBub3Qgc2V0CitDT05GSUdfUVVJQ0tMSVNUPXkKKyMgQ09ORklHX0hBVkVfQVJDSF9CT09UTUVNX05PREUgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9IQVZFX01FTU9SWV9QUkVTRU5UIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FRURfTk9ERV9NRU1NQVBfU0laRSBpcyBub3Qgc2V0CitDT05GSUdfQVJDSF9GTEFUTUVNX0VOQUJMRT15CisjIENPTkZJR19BUkNIX0RJU0NPTlRJR01FTV9FTkFCTEUgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9TUEFSU0VNRU1fRU5BQkxFIGlzIG5vdCBzZXQKK0NPTkZJR19TRUxFQ1RfTUVNT1JZX01PREVMPXkKK0NPTkZJR19GTEFUTUVNX01BTlVBTD15CisjIENPTkZJR19ESVNDT05USUdNRU1fTUFOVUFMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NQQVJTRU1FTV9NQU5VQUwgaXMgbm90IHNldAorQ09ORklHX0ZMQVRNRU09eQorQ09ORklHX0ZMQVRfTk9ERV9NRU1fTUFQPXkKK0NPTkZJR19QQUdFRkxBR1NfRVhURU5ERUQ9eQorQ09ORklHX1NQTElUX1BUTE9DS19DUFVTPTQKKyMgQ09ORklHX1JFU09VUkNFU182NEJJVCBpcyBub3Qgc2V0CisjIENPTkZJR19QSFlTX0FERFJfVF82NEJJVCBpcyBub3Qgc2V0CitDT05GSUdfWk9ORV9ETUFfRkxBRz0wCitDT05GSUdfTlJfUVVJQ0s9MgorQ09ORklHX1ZJUlRfVE9fQlVTPXkKK0NPTkZJR19VTkVWSUNUQUJMRV9MUlU9eQorIyBDT05GSUdfT1dORVJTSElQX1RSQUNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX05NSV9ERUJVR0dJTkcgaXMgbm90IHNldAorIyBDT05GSUdfSFpfMTAwIGlzIG5vdCBzZXQKK0NPTkZJR19IWl8yNTA9eQorIyBDT05GSUdfSFpfMzAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0haXzEwMDAgaXMgbm90IHNldAorQ09ORklHX0haPTI1MAorQ09ORklHX1NDSEVEX0hSVElDSz15CitDT05GSUdfQ01ETElORT0iIgorCisjCisjIFBvd2VyIG1hbmFnZW1lbnQgb3B0aW9ucworIworIyBDT05GSUdfUE0gaXMgbm90IHNldAorQ09ORklHX0FSQ0hfU1VTUEVORF9QT1NTSUJMRT15CisKKyMKKyMgQ1BVIEZyZXF1ZW5jeSBzY2FsaW5nCisjCitDT05GSUdfQ1BVX0ZSRVE9eQorQ09ORklHX0NQVV9GUkVRX1RBQkxFPXkKKyMgQ09ORklHX0NQVV9GUkVRX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9GUkVRX1NUQVQgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX0ZSRVFfREVGQVVMVF9HT1ZfUEVSRk9STUFOQ0UgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX0ZSRVFfREVGQVVMVF9HT1ZfUE9XRVJTQVZFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9GUkVRX0RFRkFVTFRfR09WX1VTRVJTUEFDRSBpcyBub3Qgc2V0CitDT05GSUdfQ1BVX0ZSRVFfREVGQVVMVF9HT1ZfT05ERU1BTkQ9eQorIyBDT05GSUdfQ1BVX0ZSRVFfREVGQVVMVF9HT1ZfQ09OU0VSVkFUSVZFIGlzIG5vdCBzZXQKK0NPTkZJR19DUFVfRlJFUV9HT1ZfUEVSRk9STUFOQ0U9eQorIyBDT05GSUdfQ1BVX0ZSRVFfR09WX1BPV0VSU0FWRSBpcyBub3Qgc2V0CitDT05GSUdfQ1BVX0ZSRVFfR09WX1VTRVJTUEFDRT15CitDT05GSUdfQ1BVX0ZSRVFfR09WX09OREVNQU5EPXkKKyMgQ09ORklHX0NQVV9GUkVRX0dPVl9DT05TRVJWQVRJVkUgaXMgbm90IHNldAorQ09ORklHX0NQVV9GUkVRX0FUMzJBUD15CisKKyMKKyMgQnVzIG9wdGlvbnMKKyMKKyMgQ09ORklHX0FSQ0hfU1VQUE9SVFNfTVNJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BDQ0FSRCBpcyBub3Qgc2V0CisKKyMKKyMgRXhlY3V0YWJsZSBmaWxlIGZvcm1hdHMKKyMKK0NPTkZJR19CSU5GTVRfRUxGPXkKKyMgQ09ORklHX0NPUkVfRFVNUF9ERUZBVUxUX0VMRl9IRUFERVJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBVkVfQU9VVCBpcyBub3Qgc2V0CisjIENPTkZJR19CSU5GTVRfTUlTQyBpcyBub3Qgc2V0CitDT05GSUdfTkVUPXkKKworIworIyBOZXR3b3JraW5nIG9wdGlvbnMKKyMKK0NPTkZJR19QQUNLRVQ9eQorQ09ORklHX1BBQ0tFVF9NTUFQPXkKK0NPTkZJR19VTklYPXkKK0NPTkZJR19YRlJNPXkKK0NPTkZJR19YRlJNX1VTRVI9eQorIyBDT05GSUdfWEZSTV9TVUJfUE9MSUNZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1hGUk1fTUlHUkFURSBpcyBub3Qgc2V0CisjIENPTkZJR19YRlJNX1NUQVRJU1RJQ1MgaXMgbm90IHNldAorQ09ORklHX1hGUk1fSVBDT01QPXkKK0NPTkZJR19ORVRfS0VZPXkKKyMgQ09ORklHX05FVF9LRVlfTUlHUkFURSBpcyBub3Qgc2V0CitDT05GSUdfSU5FVD15CitDT05GSUdfSVBfTVVMVElDQVNUPXkKK0NPTkZJR19JUF9BRFZBTkNFRF9ST1VURVI9eQorQ09ORklHX0FTS19JUF9GSUJfSEFTSD15CisjIENPTkZJR19JUF9GSUJfVFJJRSBpcyBub3Qgc2V0CitDT05GSUdfSVBfRklCX0hBU0g9eQorIyBDT05GSUdfSVBfTVVMVElQTEVfVEFCTEVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX1JPVVRFX01VTFRJUEFUSCBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9ST1VURV9WRVJCT1NFIGlzIG5vdCBzZXQKK0NPTkZJR19JUF9QTlA9eQorQ09ORklHX0lQX1BOUF9ESENQPXkKKyMgQ09ORklHX0lQX1BOUF9CT09UUCBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9QTlBfUkFSUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfSVBJUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfSVBHUkUgaXMgbm90IHNldAorQ09ORklHX0lQX01ST1VURT15CitDT05GSUdfSVBfUElNU01fVjE9eQorIyBDT05GSUdfSVBfUElNU01fVjIgaXMgbm90IHNldAorIyBDT05GSUdfQVJQRCBpcyBub3Qgc2V0CitDT05GSUdfU1lOX0NPT0tJRVM9eQorQ09ORklHX0lORVRfQUg9eQorQ09ORklHX0lORVRfRVNQPXkKK0NPTkZJR19JTkVUX0lQQ09NUD15CitDT05GSUdfSU5FVF9YRlJNX1RVTk5FTD15CitDT05GSUdfSU5FVF9UVU5ORUw9eQorQ09ORklHX0lORVRfWEZSTV9NT0RFX1RSQU5TUE9SVD15CitDT05GSUdfSU5FVF9YRlJNX01PREVfVFVOTkVMPXkKK0NPTkZJR19JTkVUX1hGUk1fTU9ERV9CRUVUPXkKKyMgQ09ORklHX0lORVRfTFJPIGlzIG5vdCBzZXQKK0NPTkZJR19JTkVUX0RJQUc9eQorQ09ORklHX0lORVRfVENQX0RJQUc9eQorIyBDT05GSUdfVENQX0NPTkdfQURWQU5DRUQgaXMgbm90IHNldAorQ09ORklHX1RDUF9DT05HX0NVQklDPXkKK0NPTkZJR19ERUZBVUxUX1RDUF9DT05HPSJjdWJpYyIKKyMgQ09ORklHX1RDUF9NRDVTSUcgaXMgbm90IHNldAorIyBDT05GSUdfSVBWNiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRXT1JLX1NFQ01BUksgaXMgbm90IHNldAorQ09ORklHX05FVEZJTFRFUj15CisjIENPTkZJR19ORVRGSUxURVJfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfTkVURklMVEVSX0FEVkFOQ0VEIGlzIG5vdCBzZXQKKworIworIyBDb3JlIE5ldGZpbHRlciBDb25maWd1cmF0aW9uCisjCitDT05GSUdfTkVURklMVEVSX05FVExJTks9bQorQ09ORklHX05FVEZJTFRFUl9ORVRMSU5LX0xPRz1tCitDT05GSUdfTkZfQ09OTlRSQUNLPW0KK0NPTkZJR19ORl9DT05OVFJBQ0tfRlRQPW0KK0NPTkZJR19ORl9DT05OVFJBQ0tfSVJDPW0KK0NPTkZJR19ORl9DT05OVFJBQ0tfU0lQPW0KK0NPTkZJR19ORl9DVF9ORVRMSU5LPW0KK0NPTkZJR19ORVRGSUxURVJfWFRBQkxFUz15CitDT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9NQVJLPW0KK0NPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX05GTE9HPW0KK0NPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX1RDUE1TUz1tCitDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0NPTk5UUkFDSz1tCitDT05GSUdfTkVURklMVEVSX1hUX01BVENIX01BUks9bQorQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9QT0xJQ1k9bQorQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9TVEFURT1tCisjIENPTkZJR19JUF9WUyBpcyBub3Qgc2V0CisKKyMKKyMgSVA6IE5ldGZpbHRlciBDb25maWd1cmF0aW9uCisjCitDT05GSUdfTkZfREVGUkFHX0lQVjQ9bQorQ09ORklHX05GX0NPTk5UUkFDS19JUFY0PW0KK0NPTkZJR19ORl9DT05OVFJBQ0tfUFJPQ19DT01QQVQ9eQorQ09ORklHX0lQX05GX0lQVEFCTEVTPW0KK0NPTkZJR19JUF9ORl9GSUxURVI9bQorQ09ORklHX0lQX05GX1RBUkdFVF9SRUpFQ1Q9bQorQ09ORklHX0lQX05GX1RBUkdFVF9MT0c9bQorIyBDT05GSUdfSVBfTkZfVEFSR0VUX1VMT0cgaXMgbm90IHNldAorQ09ORklHX05GX05BVD1tCitDT05GSUdfTkZfTkFUX05FRURFRD15CitDT05GSUdfSVBfTkZfVEFSR0VUX01BU1FVRVJBREU9bQorQ09ORklHX05GX05BVF9GVFA9bQorQ09ORklHX05GX05BVF9JUkM9bQorIyBDT05GSUdfTkZfTkFUX1RGVFAgaXMgbm90IHNldAorIyBDT05GSUdfTkZfTkFUX0FNQU5EQSBpcyBub3Qgc2V0CisjIENPTkZJR19ORl9OQVRfUFBUUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORl9OQVRfSDMyMyBpcyBub3Qgc2V0CitDT05GSUdfTkZfTkFUX1NJUD1tCitDT05GSUdfSVBfTkZfTUFOR0xFPW0KKyMgQ09ORklHX0lQX0RDQ1AgaXMgbm90IHNldAorIyBDT05GSUdfSVBfU0NUUCBpcyBub3Qgc2V0CisjIENPTkZJR19USVBDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUTSBpcyBub3Qgc2V0CisjIENPTkZJR19CUklER0UgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0RTQSBpcyBub3Qgc2V0CisjIENPTkZJR19WTEFOXzgwMjFRIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQ05FVCBpcyBub3Qgc2V0CisjIENPTkZJR19MTEMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQWCBpcyBub3Qgc2V0CisjIENPTkZJR19BVEFMSyBpcyBub3Qgc2V0CisjIENPTkZJR19YMjUgaXMgbm90IHNldAorIyBDT05GSUdfTEFQQiBpcyBub3Qgc2V0CisjIENPTkZJR19FQ09ORVQgaXMgbm90IHNldAorIyBDT05GSUdfV0FOX1JPVVRFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfU0NIRUQgaXMgbm90IHNldAorCisjCisjIE5ldHdvcmsgdGVzdGluZworIworIyBDT05GSUdfTkVUX1BLVEdFTiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfVENQUFJPQkUgaXMgbm90IHNldAorIyBDT05GSUdfSEFNUkFESU8gaXMgbm90IHNldAorIyBDT05GSUdfQ0FOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lSREEgaXMgbm90IHNldAorIyBDT05GSUdfQlQgaXMgbm90IHNldAorIyBDT05GSUdfQUZfUlhSUEMgaXMgbm90IHNldAorIyBDT05GSUdfUEhPTkVUIGlzIG5vdCBzZXQKK0NPTkZJR19XSVJFTEVTUz15CisjIENPTkZJR19DRkc4MDIxMSBpcyBub3Qgc2V0CisjIENPTkZJR19XSVJFTEVTU19PTERfUkVHVUxBVE9SWSBpcyBub3Qgc2V0CisjIENPTkZJR19XSVJFTEVTU19FWFQgaXMgbm90IHNldAorIyBDT05GSUdfTUFDODAyMTEgaXMgbm90IHNldAorIyBDT05GSUdfSUVFRTgwMjExIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JGS0lMTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfOVAgaXMgbm90IHNldAorCisjCisjIERldmljZSBEcml2ZXJzCisjCisKKyMKKyMgR2VuZXJpYyBEcml2ZXIgT3B0aW9ucworIworQ09ORklHX1VFVkVOVF9IRUxQRVJfUEFUSD0iL3NiaW4vaG90cGx1ZyIKK0NPTkZJR19TVEFOREFMT05FPXkKKyMgQ09ORklHX1BSRVZFTlRfRklSTVdBUkVfQlVJTEQgaXMgbm90IHNldAorIyBDT05GSUdfRldfTE9BREVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0RSSVZFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19ERVZSRVMgaXMgbm90IHNldAorIyBDT05GSUdfU1lTX0hZUEVSVklTT1IgaXMgbm90IHNldAorIyBDT05GSUdfQ09OTkVDVE9SIGlzIG5vdCBzZXQKK0NPTkZJR19NVEQ9eQorIyBDT05GSUdfTVREX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DT05DQVQgaXMgbm90IHNldAorQ09ORklHX01URF9QQVJUSVRJT05TPXkKKyMgQ09ORklHX01URF9SRURCT09UX1BBUlRTIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ01ETElORV9QQVJUUz15CisjIENPTkZJR19NVERfQVI3X1BBUlRTIGlzIG5vdCBzZXQKKworIworIyBVc2VyIE1vZHVsZXMgQW5kIFRyYW5zbGF0aW9uIExheWVycworIworQ09ORklHX01URF9DSEFSPXkKK0NPTkZJR19NVERfQkxLREVWUz15CitDT05GSUdfTVREX0JMT0NLPXkKKyMgQ09ORklHX0ZUTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORlRMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORlRMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JGRF9GVEwgaXMgbm90IHNldAorIyBDT05GSUdfU1NGREMgaXMgbm90IHNldAorIyBDT05GSUdfTVREX09PUFMgaXMgbm90IHNldAorCisjCisjIFJBTS9ST00vRmxhc2ggY2hpcCBkcml2ZXJzCisjCitDT05GSUdfTVREX0NGST15CisjIENPTkZJR19NVERfSkVERUNQUk9CRSBpcyBub3Qgc2V0CitDT05GSUdfTVREX0dFTl9QUk9CRT15CisjIENPTkZJR19NVERfQ0ZJX0FEVl9PUFRJT05TIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMT15CitDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzI9eQorQ09ORklHX01URF9NQVBfQkFOS19XSURUSF80PXkKKyMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF84IGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8xNiBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMzIgaXMgbm90IHNldAorQ09ORklHX01URF9DRklfSTE9eQorQ09ORklHX01URF9DRklfSTI9eQorIyBDT05GSUdfTVREX0NGSV9JNCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ0ZJX0k4IGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DRklfSU5URUxFWFQgaXMgbm90IHNldAorQ09ORklHX01URF9DRklfQU1EU1REPXkKKyMgQ09ORklHX01URF9DRklfU1RBQSBpcyBub3Qgc2V0CitDT05GSUdfTVREX0NGSV9VVElMPXkKKyMgQ09ORklHX01URF9SQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX1JPTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQUJTRU5UIGlzIG5vdCBzZXQKKworIworIyBNYXBwaW5nIGRyaXZlcnMgZm9yIGNoaXAgYWNjZXNzCisjCisjIENPTkZJR19NVERfQ09NUExFWF9NQVBQSU5HUyBpcyBub3Qgc2V0CitDT05GSUdfTVREX1BIWVNNQVA9eQorQ09ORklHX01URF9QSFlTTUFQX1NUQVJUPTB4ODAwMDAwMDAKK0NPTkZJR19NVERfUEhZU01BUF9MRU49MHgwCitDT05GSUdfTVREX1BIWVNNQVBfQkFOS1dJRFRIPTIKKyMgQ09ORklHX01URF9QTEFUUkFNIGlzIG5vdCBzZXQKKworIworIyBTZWxmLWNvbnRhaW5lZCBNVEQgZGV2aWNlIGRyaXZlcnMKKyMKK0NPTkZJR19NVERfREFUQUZMQVNIPXkKKyMgQ09ORklHX01URF9EQVRBRkxBU0hfV1JJVEVfVkVSSUZZIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9EQVRBRkxBU0hfT1RQIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9NMjVQODAgaXMgbm90IHNldAorIyBDT05GSUdfTVREX1NMUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9QSFJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTVREUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9CTE9DSzJNVEQgaXMgbm90IHNldAorCisjCisjIERpc2stT24tQ2hpcCBEZXZpY2UgRHJpdmVycworIworIyBDT05GSUdfTVREX0RPQzIwMDAgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0RPQzIwMDEgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0RPQzIwMDFQTFVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9OQU5EIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9PTkVOQU5EIGlzIG5vdCBzZXQKKworIworIyBVQkkgLSBVbnNvcnRlZCBibG9jayBpbWFnZXMKKyMKKyMgQ09ORklHX01URF9VQkkgaXMgbm90IHNldAorIyBDT05GSUdfUEFSUE9SVCBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVj15CisjIENPTkZJR19CTEtfREVWX0NPV19DT01NT04gaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9MT09QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfTkJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfVUIgaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfUkFNPW0KK0NPTkZJR19CTEtfREVWX1JBTV9DT1VOVD0xNgorQ09ORklHX0JMS19ERVZfUkFNX1NJWkU9NDA5NgorIyBDT05GSUdfQkxLX0RFVl9YSVAgaXMgbm90IHNldAorIyBDT05GSUdfQ0RST01fUEtUQ0RWRCBpcyBub3Qgc2V0CisjIENPTkZJR19BVEFfT1ZFUl9FVEggaXMgbm90IHNldAorQ09ORklHX01JU0NfREVWSUNFUz15CisjIENPTkZJR19BVE1FTF9QV00gaXMgbm90IHNldAorQ09ORklHX0FUTUVMX1RDTElCPXkKK0NPTkZJR19BVE1FTF9UQ0JfQ0xLU1JDPXkKK0NPTkZJR19BVE1FTF9UQ0JfQ0xLU1JDX0JMT0NLPTAKKyMgQ09ORklHX0VFUFJPTV85M0NYNiBpcyBub3Qgc2V0CisjIENPTkZJR19BVE1FTF9TU0MgaXMgbm90IHNldAorIyBDT05GSUdfRU5DTE9TVVJFX1NFUlZJQ0VTIGlzIG5vdCBzZXQKKworIworIyBTQ1NJIGRldmljZSBzdXBwb3J0CisjCisjIENPTkZJR19SQUlEX0FUVFJTIGlzIG5vdCBzZXQKK0NPTkZJR19TQ1NJPW0KK0NPTkZJR19TQ1NJX0RNQT15CisjIENPTkZJR19TQ1NJX1RHVCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX05FVExJTksgaXMgbm90IHNldAorQ09ORklHX1NDU0lfUFJPQ19GUz15CisKKyMKKyMgU0NTSSBzdXBwb3J0IHR5cGUgKGRpc2ssIHRhcGUsIENELVJPTSkKKyMKK0NPTkZJR19CTEtfREVWX1NEPW0KKyMgQ09ORklHX0NIUl9ERVZfU1QgaXMgbm90IHNldAorIyBDT05GSUdfQ0hSX0RFVl9PU1NUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfU1IgaXMgbm90IHNldAorIyBDT05GSUdfQ0hSX0RFVl9TRyBpcyBub3Qgc2V0CisjIENPTkZJR19DSFJfREVWX1NDSCBpcyBub3Qgc2V0CisKKyMKKyMgU29tZSBTQ1NJIGRldmljZXMgKGUuZy4gQ0QganVrZWJveCkgc3VwcG9ydCBtdWx0aXBsZSBMVU5zCisjCisjIENPTkZJR19TQ1NJX01VTFRJX0xVTiBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0NPTlNUQU5UUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0xPR0dJTkcgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9TQ0FOX0FTWU5DIGlzIG5vdCBzZXQKK0NPTkZJR19TQ1NJX1dBSVRfU0NBTj1tCisKKyMKKyMgU0NTSSBUcmFuc3BvcnRzCisjCisjIENPTkZJR19TQ1NJX1NQSV9BVFRSUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0ZDX0FUVFJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfSVNDU0lfQVRUUlMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9TQVNfTElCU0FTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfU1JQX0FUVFJTIGlzIG5vdCBzZXQKK0NPTkZJR19TQ1NJX0xPV0xFVkVMPXkKKyMgQ09ORklHX0lTQ1NJX1RDUCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfREggaXMgbm90IHNldAorIyBDT05GSUdfQVRBIGlzIG5vdCBzZXQKKyMgQ09ORklHX01EIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRERVZJQ0VTPXkKKyMgQ09ORklHX0RVTU1ZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JPTkRJTkcgaXMgbm90IHNldAorIyBDT05GSUdfTUFDVkxBTiBpcyBub3Qgc2V0CisjIENPTkZJR19FUVVBTElaRVIgaXMgbm90IHNldAorIyBDT05GSUdfVFVOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZFVEggaXMgbm90IHNldAorQ09ORklHX1BIWUxJQj15CisKKyMKKyMgTUlJIFBIWSBkZXZpY2UgZHJpdmVycworIworIyBDT05GSUdfTUFSVkVMTF9QSFkgaXMgbm90IHNldAorIyBDT05GSUdfREFWSUNPTV9QSFkgaXMgbm90IHNldAorIyBDT05GSUdfUVNFTUlfUEhZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xYVF9QSFkgaXMgbm90IHNldAorIyBDT05GSUdfQ0lDQURBX1BIWSBpcyBub3Qgc2V0CisjIENPTkZJR19WSVRFU1NFX1BIWSBpcyBub3Qgc2V0CisjIENPTkZJR19TTVNDX1BIWSBpcyBub3Qgc2V0CisjIENPTkZJR19CUk9BRENPTV9QSFkgaXMgbm90IHNldAorIyBDT05GSUdfSUNQTFVTX1BIWSBpcyBub3Qgc2V0CisjIENPTkZJR19SRUFMVEVLX1BIWSBpcyBub3Qgc2V0CisjIENPTkZJR19GSVhFRF9QSFkgaXMgbm90IHNldAorIyBDT05GSUdfTURJT19CSVRCQU5HIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRfRVRIRVJORVQ9eQorIyBDT05GSUdfTUlJIGlzIG5vdCBzZXQKK0NPTkZJR19NQUNCPXkKKyMgQ09ORklHX0VOQzI4SjYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lCTV9ORVdfRU1BQ19aTUlJIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lCTV9ORVdfRU1BQ19SR01JSSBpcyBub3Qgc2V0CisjIENPTkZJR19JQk1fTkVXX0VNQUNfVEFIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lCTV9ORVdfRU1BQ19FTUFDNCBpcyBub3Qgc2V0CisjIENPTkZJR19JQk1fTkVXX0VNQUNfTk9fRkxPV19DVFJMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lCTV9ORVdfRU1BQ19NQUxfQ0xSX0lDSU5UU1RBVCBpcyBub3Qgc2V0CisjIENPTkZJR19JQk1fTkVXX0VNQUNfTUFMX0NPTU1PTl9FUlIgaXMgbm90IHNldAorIyBDT05GSUdfQjQ0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVERFVl8xMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVERFVl8xMDAwMCBpcyBub3Qgc2V0CisKKyMKKyMgV2lyZWxlc3MgTEFOCisjCisjIENPTkZJR19XTEFOX1BSRTgwMjExIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dMQU5fODAyMTEgaXMgbm90IHNldAorIyBDT05GSUdfSVdMV0lGSV9MRURTIGlzIG5vdCBzZXQKKworIworIyBVU0IgTmV0d29yayBBZGFwdGVycworIworIyBDT05GSUdfVVNCX0NBVEMgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0tBV0VUSCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfUEVHQVNVUyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfUlRMODE1MCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfVVNCTkVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dBTiBpcyBub3Qgc2V0CisjIENPTkZJR19QUFAgaXMgbm90IHNldAorIyBDT05GSUdfU0xJUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRDT05TT0xFIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVFBPTEwgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUiBpcyBub3Qgc2V0CisjIENPTkZJR19JU0ROIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BIT05FIGlzIG5vdCBzZXQKKworIworIyBJbnB1dCBkZXZpY2Ugc3VwcG9ydAorIworQ09ORklHX0lOUFVUPXkKK0NPTkZJR19JTlBVVF9GRl9NRU1MRVNTPW0KKyMgQ09ORklHX0lOUFVUX1BPTExERVYgaXMgbm90IHNldAorCisjCisjIFVzZXJsYW5kIGludGVyZmFjZXMKKyMKK0NPTkZJR19JTlBVVF9NT1VTRURFVj15CitDT05GSUdfSU5QVVRfTU9VU0VERVZfUFNBVVg9eQorQ09ORklHX0lOUFVUX01PVVNFREVWX1NDUkVFTl9YPTEwMjQKK0NPTkZJR19JTlBVVF9NT1VTRURFVl9TQ1JFRU5fWT03NjgKKyMgQ09ORklHX0lOUFVUX0pPWURFViBpcyBub3Qgc2V0CitDT05GSUdfSU5QVVRfRVZERVY9bQorIyBDT05GSUdfSU5QVVRfRVZCVUcgaXMgbm90IHNldAorCisjCisjIElucHV0IERldmljZSBEcml2ZXJzCisjCitDT05GSUdfSU5QVVRfS0VZQk9BUkQ9eQorQ09ORklHX0tFWUJPQVJEX0FUS0JEPXkKKyMgQ09ORklHX0tFWUJPQVJEX1NVTktCRCBpcyBub3Qgc2V0CisjIENPTkZJR19LRVlCT0FSRF9MS0tCRCBpcyBub3Qgc2V0CisjIENPTkZJR19LRVlCT0FSRF9YVEtCRCBpcyBub3Qgc2V0CisjIENPTkZJR19LRVlCT0FSRF9ORVdUT04gaXMgbm90IHNldAorIyBDT05GSUdfS0VZQk9BUkRfU1RPV0FXQVkgaXMgbm90IHNldAorIyBDT05GSUdfS0VZQk9BUkRfR1BJTyBpcyBub3Qgc2V0CitDT05GSUdfSU5QVVRfTU9VU0U9eQorQ09ORklHX01PVVNFX1BTMj15CitDT05GSUdfTU9VU0VfUFMyX0FMUFM9eQorQ09ORklHX01PVVNFX1BTMl9MT0dJUFMyUFA9eQorQ09ORklHX01PVVNFX1BTMl9TWU5BUFRJQ1M9eQorQ09ORklHX01PVVNFX1BTMl9MSUZFQk9PSz15CitDT05GSUdfTU9VU0VfUFMyX1RSQUNLUE9JTlQ9eQorIyBDT05GSUdfTU9VU0VfUFMyX1RPVUNIS0lUIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PVVNFX1NFUklBTCBpcyBub3Qgc2V0CisjIENPTkZJR19NT1VTRV9BUFBMRVRPVUNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PVVNFX0JDTTU5NzQgaXMgbm90IHNldAorIyBDT05GSUdfTU9VU0VfVlNYWFhBQSBpcyBub3Qgc2V0CisjIENPTkZJR19NT1VTRV9HUElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0pPWVNUSUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1RBQkxFVCBpcyBub3Qgc2V0CitDT05GSUdfSU5QVVRfVE9VQ0hTQ1JFRU49eQorIyBDT05GSUdfVE9VQ0hTQ1JFRU5fQURTNzg0NiBpcyBub3Qgc2V0CisjIENPTkZJR19UT1VDSFNDUkVFTl9GVUpJVFNVIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RPVUNIU0NSRUVOX0dVTlpFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RPVUNIU0NSRUVOX0VMTyBpcyBub3Qgc2V0CisjIENPTkZJR19UT1VDSFNDUkVFTl9NVE9VQ0ggaXMgbm90IHNldAorIyBDT05GSUdfVE9VQ0hTQ1JFRU5fSU5FWElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RPVUNIU0NSRUVOX01LNzEyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RPVUNIU0NSRUVOX1BFTk1PVU5UIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RPVUNIU0NSRUVOX1RPVUNIUklHSFQgaXMgbm90IHNldAorIyBDT05GSUdfVE9VQ0hTQ1JFRU5fVE9VQ0hXSU4gaXMgbm90IHNldAorIyBDT05GSUdfVE9VQ0hTQ1JFRU5fVVNCX0NPTVBPU0lURSBpcyBub3Qgc2V0CisjIENPTkZJR19UT1VDSFNDUkVFTl9UT1VDSElUMjEzIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX01JU0MgaXMgbm90IHNldAorCisjCisjIEhhcmR3YXJlIEkvTyBwb3J0cworIworQ09ORklHX1NFUklPPXkKK0NPTkZJR19TRVJJT19JODA0Mj15CitDT05GSUdfU0VSSU9fU0VSUE9SVD15CisjIENPTkZJR19TRVJJT19BVDMyUFNJRiBpcyBub3Qgc2V0CitDT05GSUdfU0VSSU9fTElCUFMyPXkKKyMgQ09ORklHX1NFUklPX1JBVyBpcyBub3Qgc2V0CisjIENPTkZJR19HQU1FUE9SVCBpcyBub3Qgc2V0CisKKyMKKyMgQ2hhcmFjdGVyIGRldmljZXMKKyMKK0NPTkZJR19WVD15CitDT05GSUdfQ09OU09MRV9UUkFOU0xBVElPTlM9eQorQ09ORklHX1ZUX0NPTlNPTEU9eQorQ09ORklHX0hXX0NPTlNPTEU9eQorIyBDT05GSUdfVlRfSFdfQ09OU09MRV9CSU5ESU5HIGlzIG5vdCBzZXQKK0NPTkZJR19ERVZLTUVNPXkKKyMgQ09ORklHX1NFUklBTF9OT05TVEFOREFSRCBpcyBub3Qgc2V0CisKKyMKKyMgU2VyaWFsIGRyaXZlcnMKKyMKKyMgQ09ORklHX1NFUklBTF84MjUwIGlzIG5vdCBzZXQKKworIworIyBOb24tODI1MCBzZXJpYWwgcG9ydCBzdXBwb3J0CisjCitDT05GSUdfU0VSSUFMX0FUTUVMPXkKK0NPTkZJR19TRVJJQUxfQVRNRUxfQ09OU09MRT15CitDT05GSUdfU0VSSUFMX0FUTUVMX1BEQz15CisjIENPTkZJR19TRVJJQUxfQVRNRUxfVFRZQVQgaXMgbm90IHNldAorQ09ORklHX1NFUklBTF9DT1JFPXkKK0NPTkZJR19TRVJJQUxfQ09SRV9DT05TT0xFPXkKK0NPTkZJR19VTklYOThfUFRZUz15CisjIENPTkZJR19MRUdBQ1lfUFRZUyBpcyBub3Qgc2V0CisjIENPTkZJR19JUE1JX0hBTkRMRVIgaXMgbm90IHNldAorIyBDT05GSUdfSFdfUkFORE9NIGlzIG5vdCBzZXQKKyMgQ09ORklHX1IzOTY0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JBV19EUklWRVIgaXMgbm90IHNldAorIyBDT05GSUdfVENHX1RQTSBpcyBub3Qgc2V0CitDT05GSUdfSTJDPW0KK0NPTkZJR19JMkNfQk9BUkRJTkZPPXkKK0NPTkZJR19JMkNfQ0hBUkRFVj1tCitDT05GSUdfSTJDX0hFTFBFUl9BVVRPPXkKK0NPTkZJR19JMkNfQUxHT0JJVD1tCisKKyMKKyMgSTJDIEhhcmR3YXJlIEJ1cyBzdXBwb3J0CisjCisKKyMKKyMgSTJDIHN5c3RlbSBidXMgZHJpdmVycyAobW9zdGx5IGVtYmVkZGVkIC8gc3lzdGVtLW9uLWNoaXApCisjCitDT05GSUdfSTJDX0dQSU89bQorIyBDT05GSUdfSTJDX09DT1JFUyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfU0lNVEVDIGlzIG5vdCBzZXQKKworIworIyBFeHRlcm5hbCBJMkMvU01CdXMgYWRhcHRlciBkcml2ZXJzCisjCisjIENPTkZJR19JMkNfUEFSUE9SVF9MSUdIVCBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfVEFPU19FVk0gaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1RJTllfVVNCIGlzIG5vdCBzZXQKKworIworIyBPdGhlciBJMkMvU01CdXMgYnVzIGRyaXZlcnMKKyMKKyMgQ09ORklHX0kyQ19QQ0FfUExBVEZPUk0gaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1NUVUIgaXMgbm90IHNldAorCisjCisjIE1pc2NlbGxhbmVvdXMgSTJDIENoaXAgc3VwcG9ydAorIworIyBDT05GSUdfRFMxNjgyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUMjQgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19FRVBST00gaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19QQ0Y4NTc0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1BDRjg1NzUgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19QQ0E5NTM5IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfUENGODU5MSBpcyBub3Qgc2V0CisjIENPTkZJR19UUFM2NTAxMCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX01BWDY4NzUgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19UU0wyNTUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19ERUJVR19DT1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19ERUJVR19BTEdPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19ERUJVR19CVVMgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0NISVAgaXMgbm90IHNldAorQ09ORklHX1NQST15CisjIENPTkZJR19TUElfREVCVUcgaXMgbm90IHNldAorQ09ORklHX1NQSV9NQVNURVI9eQorCisjCisjIFNQSSBNYXN0ZXIgQ29udHJvbGxlciBEcml2ZXJzCisjCitDT05GSUdfU1BJX0FUTUVMPXkKKyMgQ09ORklHX1NQSV9CSVRCQU5HIGlzIG5vdCBzZXQKKworIworIyBTUEkgUHJvdG9jb2wgTWFzdGVycworIworIyBDT05GSUdfU1BJX0FUMjUgaXMgbm90IHNldAorQ09ORklHX1NQSV9TUElERVY9bQorIyBDT05GSUdfU1BJX1RMRTYyWDAgaXMgbm90IHNldAorQ09ORklHX0FSQ0hfUkVRVUlSRV9HUElPTElCPXkKK0NPTkZJR19HUElPTElCPXkKKyMgQ09ORklHX0RFQlVHX0dQSU8gaXMgbm90IHNldAorIyBDT05GSUdfR1BJT19TWVNGUyBpcyBub3Qgc2V0CisKKyMKKyMgSTJDIEdQSU8gZXhwYW5kZXJzOgorIworIyBDT05GSUdfR1BJT19NQVg3MzJYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dQSU9fUENBOTUzWCBpcyBub3Qgc2V0CisjIENPTkZJR19HUElPX1BDRjg1N1ggaXMgbm90IHNldAorCisjCisjIFBDSSBHUElPIGV4cGFuZGVyczoKKyMKKworIworIyBTUEkgR1BJTyBleHBhbmRlcnM6CisjCisjIENPTkZJR19HUElPX01BWDczMDEgaXMgbm90IHNldAorIyBDT05GSUdfR1BJT19NQ1AyM1MwOCBpcyBub3Qgc2V0CisjIENPTkZJR19XMSBpcyBub3Qgc2V0CisjIENPTkZJR19QT1dFUl9TVVBQTFkgaXMgbm90IHNldAorIyBDT05GSUdfSFdNT04gaXMgbm90IHNldAorIyBDT05GSUdfVEhFUk1BTCBpcyBub3Qgc2V0CisjIENPTkZJR19USEVSTUFMX0hXTU9OIGlzIG5vdCBzZXQKK0NPTkZJR19XQVRDSERPRz15CisjIENPTkZJR19XQVRDSERPR19OT1dBWU9VVCBpcyBub3Qgc2V0CisKKyMKKyMgV2F0Y2hkb2cgRGV2aWNlIERyaXZlcnMKKyMKKyMgQ09ORklHX1NPRlRfV0FUQ0hET0cgaXMgbm90IHNldAorQ09ORklHX0FUMzJBUDcwMFhfV0RUPXkKKworIworIyBVU0ItYmFzZWQgV2F0Y2hkb2cgQ2FyZHMKKyMKKyMgQ09ORklHX1VTQlBDV0FUQ0hET0cgaXMgbm90IHNldAorCisjCisjIFNvbmljcyBTaWxpY29uIEJhY2twbGFuZQorIworQ09ORklHX1NTQl9QT1NTSUJMRT15CisjIENPTkZJR19TU0IgaXMgbm90IHNldAorCisjCisjIE11bHRpZnVuY3Rpb24gZGV2aWNlIGRyaXZlcnMKKyMKKyMgQ09ORklHX01GRF9DT1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9TTTUwMSBpcyBub3Qgc2V0CisjIENPTkZJR19IVENfUEFTSUMzIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9UTUlPIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9XTTg0MDAgaXMgbm90IHNldAorIyBDT05GSUdfTUZEX1dNODM1MF9JMkMgaXMgbm90IHNldAorCisjCisjIE11bHRpbWVkaWEgZGV2aWNlcworIworCisjCisjIE11bHRpbWVkaWEgY29yZSBzdXBwb3J0CisjCisjIENPTkZJR19WSURFT19ERVYgaXMgbm90IHNldAorIyBDT05GSUdfRFZCX0NPUkUgaXMgbm90IHNldAorIyBDT05GSUdfVklERU9fTUVESUEgaXMgbm90IHNldAorCisjCisjIE11bHRpbWVkaWEgZHJpdmVycworIworIyBDT05GSUdfREFCIGlzIG5vdCBzZXQKKworIworIyBHcmFwaGljcyBzdXBwb3J0CisjCisjIENPTkZJR19WR0FTVEFURSBpcyBub3Qgc2V0CisjIENPTkZJR19WSURFT19PVVRQVVRfQ09OVFJPTCBpcyBub3Qgc2V0CitDT05GSUdfRkI9eQorIyBDT05GSUdfRklSTVdBUkVfRURJRCBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9EREMgaXMgbm90IHNldAorIyBDT05GSUdfRkJfQk9PVF9WRVNBX1NVUFBPUlQgaXMgbm90IHNldAorQ09ORklHX0ZCX0NGQl9GSUxMUkVDVD15CitDT05GSUdfRkJfQ0ZCX0NPUFlBUkVBPXkKK0NPTkZJR19GQl9DRkJfSU1BR0VCTElUPXkKKyMgQ09ORklHX0ZCX0NGQl9SRVZfUElYRUxTX0lOX0JZVEUgaXMgbm90IHNldAorIyBDT05GSUdfRkJfU1lTX0ZJTExSRUNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1NZU19DT1BZQVJFQSBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9TWVNfSU1BR0VCTElUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX0ZPUkVJR05fRU5ESUFOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1NZU19GT1BTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1NWR0FMSUIgaXMgbm90IHNldAorIyBDT05GSUdfRkJfTUFDTU9ERVMgaXMgbm90IHNldAorIyBDT05GSUdfRkJfQkFDS0xJR0hUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX01PREVfSEVMUEVSUyBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9USUxFQkxJVFRJTkcgaXMgbm90IHNldAorCisjCisjIEZyYW1lIGJ1ZmZlciBoYXJkd2FyZSBkcml2ZXJzCisjCisjIENPTkZJR19GQl9TMUQxM1hYWCBpcyBub3Qgc2V0CitDT05GSUdfRkJfQVRNRUw9eQorIyBDT05GSUdfRkJfVklSVFVBTCBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9NRVRST05PTUUgaXMgbm90IHNldAorIyBDT05GSUdfQkFDS0xJR0hUX0xDRF9TVVBQT1JUIGlzIG5vdCBzZXQKKworIworIyBEaXNwbGF5IGRldmljZSBzdXBwb3J0CisjCisjIENPTkZJR19ESVNQTEFZX1NVUFBPUlQgaXMgbm90IHNldAorCisjCisjIENvbnNvbGUgZGlzcGxheSBkcml2ZXIgc3VwcG9ydAorIworQ09ORklHX0RVTU1ZX0NPTlNPTEU9eQorQ09ORklHX0ZSQU1FQlVGRkVSX0NPTlNPTEU9eQorIyBDT05GSUdfRlJBTUVCVUZGRVJfQ09OU09MRV9ERVRFQ1RfUFJJTUFSWSBpcyBub3Qgc2V0CisjIENPTkZJR19GUkFNRUJVRkZFUl9DT05TT0xFX1JPVEFUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZPTlRTIGlzIG5vdCBzZXQKK0NPTkZJR19GT05UXzh4OD15CitDT05GSUdfRk9OVF84eDE2PXkKKyMgQ09ORklHX0xPR08gaXMgbm90IHNldAorQ09ORklHX1NPVU5EPW0KK0NPTkZJR19TT1VORF9PU1NfQ09SRT15CitDT05GSUdfU05EPW0KK0NPTkZJR19TTkRfVElNRVI9bQorQ09ORklHX1NORF9QQ009bQorQ09ORklHX1NORF9TRVFVRU5DRVI9bQorIyBDT05GSUdfU05EX1NFUV9EVU1NWSBpcyBub3Qgc2V0CitDT05GSUdfU05EX09TU0VNVUw9eQorQ09ORklHX1NORF9NSVhFUl9PU1M9bQorQ09ORklHX1NORF9QQ01fT1NTPW0KK0NPTkZJR19TTkRfUENNX09TU19QTFVHSU5TPXkKK0NPTkZJR19TTkRfU0VRVUVOQ0VSX09TUz15CisjIENPTkZJR19TTkRfRFlOQU1JQ19NSU5PUlMgaXMgbm90IHNldAorIyBDT05GSUdfU05EX1NVUFBPUlRfT0xEX0FQSSBpcyBub3Qgc2V0CitDT05GSUdfU05EX1ZFUkJPU0VfUFJPQ0ZTPXkKKyMgQ09ORklHX1NORF9WRVJCT1NFX1BSSU5USyBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfREVCVUcgaXMgbm90IHNldAorQ09ORklHX1NORF9EUklWRVJTPXkKKyMgQ09ORklHX1NORF9EVU1NWSBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfVklSTUlESSBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfTVRQQVYgaXMgbm90IHNldAorIyBDT05GSUdfU05EX1NFUklBTF9VMTY1NTAgaXMgbm90IHNldAorIyBDT05GSUdfU05EX01QVTQwMSBpcyBub3Qgc2V0CitDT05GSUdfU05EX1NQST15CitDT05GSUdfU05EX1VTQj15CisjIENPTkZJR19TTkRfVVNCX0FVRElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9VU0JfQ0FJQVEgaXMgbm90IHNldAorIyBDT05GSUdfU05EX1NPQyBpcyBub3Qgc2V0CisjIENPTkZJR19TT1VORF9QUklNRSBpcyBub3Qgc2V0CitDT05GSUdfSElEX1NVUFBPUlQ9eQorQ09ORklHX0hJRD15CisjIENPTkZJR19ISURfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfSElEUkFXIGlzIG5vdCBzZXQKKworIworIyBVU0IgSW5wdXQgRGV2aWNlcworIworQ09ORklHX1VTQl9ISUQ9bQorIyBDT05GSUdfSElEX1BJRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfSElEREVWIGlzIG5vdCBzZXQKKworIworIyBVU0IgSElEIEJvb3QgUHJvdG9jb2wgZHJpdmVycworIworIyBDT05GSUdfVVNCX0tCRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTU9VU0UgaXMgbm90IHNldAorCisjCisjIFNwZWNpYWwgSElEIGRyaXZlcnMKKyMKK0NPTkZJR19ISURfQ09NUEFUPXkKK0NPTkZJR19ISURfQTRURUNIPW0KK0NPTkZJR19ISURfQVBQTEU9bQorQ09ORklHX0hJRF9CRUxLSU49bQorQ09ORklHX0hJRF9CUklHSFQ9bQorQ09ORklHX0hJRF9DSEVSUlk9bQorQ09ORklHX0hJRF9DSElDT05ZPW0KK0NPTkZJR19ISURfQ1lQUkVTUz1tCitDT05GSUdfSElEX0RFTEw9bQorQ09ORklHX0hJRF9FWktFWT1tCitDT05GSUdfSElEX0dZUkFUSU9OPW0KK0NPTkZJR19ISURfTE9HSVRFQ0g9bQorIyBDT05GSUdfTE9HSVRFQ0hfRkYgaXMgbm90IHNldAorIyBDT05GSUdfTE9HSVJVTUJMRVBBRDJfRkYgaXMgbm90IHNldAorQ09ORklHX0hJRF9NSUNST1NPRlQ9bQorQ09ORklHX0hJRF9NT05URVJFWT1tCitDT05GSUdfSElEX1BBTlRIRVJMT1JEPW0KKyMgQ09ORklHX1BBTlRIRVJMT1JEX0ZGIGlzIG5vdCBzZXQKK0NPTkZJR19ISURfUEVUQUxZTlg9bQorQ09ORklHX0hJRF9TQU1TVU5HPW0KK0NPTkZJR19ISURfU09OWT1tCitDT05GSUdfSElEX1NVTlBMVVM9bQorQ09ORklHX1RIUlVTVE1BU1RFUl9GRj1tCitDT05GSUdfWkVST1BMVVNfRkY9bQorQ09ORklHX1VTQl9TVVBQT1JUPXkKK0NPTkZJR19VU0JfQVJDSF9IQVNfSENEPXkKKyMgQ09ORklHX1VTQl9BUkNIX0hBU19PSENJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9BUkNIX0hBU19FSENJIGlzIG5vdCBzZXQKK0NPTkZJR19VU0I9bQorIyBDT05GSUdfVVNCX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9BTk5PVU5DRV9ORVdfREVWSUNFUyBpcyBub3Qgc2V0CisKKyMKKyMgTWlzY2VsbGFuZW91cyBVU0Igb3B0aW9ucworIworQ09ORklHX1VTQl9ERVZJQ0VGUz15CisjIENPTkZJR19VU0JfREVWSUNFX0NMQVNTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9EWU5BTUlDX01JTk9SUyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfT1RHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9PVEdfV0hJVEVMSVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9PVEdfQkxBQ0tMSVNUX0hVQiBpcyBub3Qgc2V0CitDT05GSUdfVVNCX01PTj15CisKKyMKKyMgVVNCIEhvc3QgQ29udHJvbGxlciBEcml2ZXJzCisjCisjIENPTkZJR19VU0JfQzY3WDAwX0hDRCBpcyBub3Qgc2V0CitDT05GSUdfVVNCX0lTUDExNlhfSENEPW0KKyMgQ09ORklHX1VTQl9JU1AxNzYwX0hDRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0w4MTFfSENEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9SOEE2NjU5N19IQ0QgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX01VU0JfSERSQyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfR0FER0VUX01VU0JfSERSQyBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIERldmljZSBDbGFzcyBkcml2ZXJzCisjCisjIENPTkZJR19VU0JfQUNNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9QUklOVEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9XRE0gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1RNQyBpcyBub3Qgc2V0CisKKyMKKyMgTk9URTogVVNCX1NUT1JBR0UgZW5hYmxlcyBTQ1NJLCBhbmQgJ1NDU0kgZGlzayBzdXBwb3J0JworIworCisjCisjIG1heSBhbHNvIGJlIG5lZWRlZDsgc2VlIFVTQl9TVE9SQUdFIEhlbHAgZm9yIG1vcmUgaW5mb3JtYXRpb24KKyMKK0NPTkZJR19VU0JfU1RPUkFHRT1tCisjIENPTkZJR19VU0JfU1RPUkFHRV9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9EQVRBRkFCIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX0ZSRUVDT00gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfSVNEMjAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX0RQQ00gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfVVNCQVQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfU0REUjA5IGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX1NERFI1NSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9KVU1QU0hPVCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9BTEFVREEgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfT05FVE9VQ0ggaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfS0FSTUEgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfQ1lQUkVTU19BVEFDQiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTElCVVNVQUwgaXMgbm90IHNldAorCisjCisjIFVTQiBJbWFnaW5nIGRldmljZXMKKyMKKyMgQ09ORklHX1VTQl9NREM4MDAgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX01JQ1JPVEVLIGlzIG5vdCBzZXQKKworIworIyBVU0IgcG9ydCBkcml2ZXJzCisjCisjIENPTkZJR19VU0JfU0VSSUFMIGlzIG5vdCBzZXQKKworIworIyBVU0IgTWlzY2VsbGFuZW91cyBkcml2ZXJzCisjCisjIENPTkZJR19VU0JfRU1JNjIgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0VNSTI2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9BRFVUVVggaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFVlNFRyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfUklPNTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9MRUdPVE9XRVIgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0xDRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQkVSUllfQ0hBUkdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9MRUQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0NZUFJFU1NfQ1k3QzYzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9DWVRIRVJNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9QSElER0VUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9JRE1PVVNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9GVERJX0VMQU4gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0FQUExFRElTUExBWSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTEQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1RSQU5DRVZJQlJBVE9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9JT1dBUlJJT1IgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1RFU1QgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0lTSUdIVEZXIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9WU1QgaXMgbm90IHNldAorQ09ORklHX1VTQl9HQURHRVQ9eQorIyBDT05GSUdfVVNCX0dBREdFVF9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfR0FER0VUX0RFQlVHX0ZJTEVTIGlzIG5vdCBzZXQKK0NPTkZJR19VU0JfR0FER0VUX1ZCVVNfRFJBVz0yCitDT05GSUdfVVNCX0dBREdFVF9TRUxFQ1RFRD15CisjIENPTkZJR19VU0JfR0FER0VUX0FUOTEgaXMgbm90IHNldAorQ09ORklHX1VTQl9HQURHRVRfQVRNRUxfVVNCQT15CitDT05GSUdfVVNCX0FUTUVMX1VTQkE9eQorIyBDT05GSUdfVVNCX0dBREdFVF9GU0xfVVNCMiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfR0FER0VUX0xIN0E0MFggaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0dBREdFVF9PTUFQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9HQURHRVRfUFhBMjVYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9HQURHRVRfUFhBMjdYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9HQURHRVRfUzNDMjQxMCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfR0FER0VUX002NjU5MiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfR0FER0VUX0FNRDU1MzZVREMgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0dBREdFVF9GU0xfUUUgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0dBREdFVF9ORVQyMjgwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9HQURHRVRfR09LVSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfR0FER0VUX0RVTU1ZX0hDRCBpcyBub3Qgc2V0CitDT05GSUdfVVNCX0dBREdFVF9EVUFMU1BFRUQ9eQorQ09ORklHX1VTQl9aRVJPPW0KK0NPTkZJR19VU0JfRVRIPW0KK0NPTkZJR19VU0JfRVRIX1JORElTPXkKK0NPTkZJR19VU0JfR0FER0VURlM9bQorQ09ORklHX1VTQl9GSUxFX1NUT1JBR0U9bQorIyBDT05GSUdfVVNCX0ZJTEVfU1RPUkFHRV9URVNUIGlzIG5vdCBzZXQKK0NPTkZJR19VU0JfR19TRVJJQUw9bQorIyBDT05GSUdfVVNCX01JRElfR0FER0VUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9HX1BSSU5URVIgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0NEQ19DT01QT1NJVEUgaXMgbm90IHNldAorQ09ORklHX01NQz1tCisjIENPTkZJR19NTUNfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfTU1DX1VOU0FGRV9SRVNVTUUgaXMgbm90IHNldAorCisjCisjIE1NQy9TRC9TRElPIENhcmQgRHJpdmVycworIworQ09ORklHX01NQ19CTE9DSz1tCitDT05GSUdfTU1DX0JMT0NLX0JPVU5DRT15CisjIENPTkZJR19TRElPX1VBUlQgaXMgbm90IHNldAorIyBDT05GSUdfTU1DX1RFU1QgaXMgbm90IHNldAorCisjCisjIE1NQy9TRC9TRElPIEhvc3QgQ29udHJvbGxlciBEcml2ZXJzCisjCisjIENPTkZJR19NTUNfU0RIQ0kgaXMgbm90IHNldAorQ09ORklHX01NQ19BVE1FTE1DST1tCisjIENPTkZJR19NTUNfU1BJIGlzIG5vdCBzZXQKKyMgQ09ORklHX01FTVNUSUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FV19MRURTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FDQ0VTU0lCSUxJVFkgaXMgbm90IHNldAorQ09ORklHX1JUQ19MSUI9eQorQ09ORklHX1JUQ19DTEFTUz15CitDT05GSUdfUlRDX0hDVE9TWVM9eQorQ09ORklHX1JUQ19IQ1RPU1lTX0RFVklDRT0icnRjMCIKKyMgQ09ORklHX1JUQ19ERUJVRyBpcyBub3Qgc2V0CisKKyMKKyMgUlRDIGludGVyZmFjZXMKKyMKK0NPTkZJR19SVENfSU5URl9TWVNGUz15CitDT05GSUdfUlRDX0lOVEZfUFJPQz15CitDT05GSUdfUlRDX0lOVEZfREVWPXkKKyMgQ09ORklHX1JUQ19JTlRGX0RFVl9VSUVfRU1VTCBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1RFU1QgaXMgbm90IHNldAorCisjCisjIEkyQyBSVEMgZHJpdmVycworIworIyBDT05GSUdfUlRDX0RSVl9EUzEzMDcgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9EUzEzNzQgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9EUzE2NzIgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9NQVg2OTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfUlM1QzM3MiBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0lTTDEyMDggaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9YMTIwNSBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1BDRjg1NjMgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9QQ0Y4NTgzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfTTQxVDgwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfUzM1MzkwQSBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0ZNMzEzMCBpcyBub3Qgc2V0CisKKyMKKyMgU1BJIFJUQyBkcml2ZXJzCisjCisjIENPTkZJR19SVENfRFJWX000MVQ5NCBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0RTMTMwNSBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX01BWDY5MDIgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9SOTcwMSBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1JTNUMzNDggaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9EUzMyMzQgaXMgbm90IHNldAorCisjCisjIFBsYXRmb3JtIFJUQyBkcml2ZXJzCisjCisjIENPTkZJR19SVENfRFJWX0RTMTI4NiBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0RTMTUxMSBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0RTMTU1MyBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0RTMTc0MiBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1NUSzE3VEE4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfTTQ4VDg2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfTTQ4VDM1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfTTQ4VDU5IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfQlE0ODAyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfVjMwMjAgaXMgbm90IHNldAorCisjCisjIG9uLUNQVSBSVEMgZHJpdmVycworIworQ09ORklHX1JUQ19EUlZfQVQzMkFQNzAwWD15CisjIENPTkZJR19ETUFERVZJQ0VTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VJTyBpcyBub3Qgc2V0CisjIENPTkZJR19TVEFHSU5HIGlzIG5vdCBzZXQKKworIworIyBGaWxlIHN5c3RlbXMKKyMKK0NPTkZJR19FWFQyX0ZTPW0KKyMgQ09ORklHX0VYVDJfRlNfWEFUVFIgaXMgbm90IHNldAorIyBDT05GSUdfRVhUMl9GU19YSVAgaXMgbm90IHNldAorIyBDT05GSUdfRVhUM19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19FWFQ0X0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFSVNFUkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19GU19QT1NJWF9BQ0wgaXMgbm90IHNldAorQ09ORklHX0ZJTEVfTE9DS0lORz15CisjIENPTkZJR19YRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfT0NGUzJfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRE5PVElGWSBpcyBub3Qgc2V0CitDT05GSUdfSU5PVElGWT15CitDT05GSUdfSU5PVElGWV9VU0VSPXkKKyMgQ09ORklHX1FVT1RBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FVVE9GU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BVVRPRlM0X0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZVU0VfRlMgaXMgbm90IHNldAorCisjCisjIENELVJPTS9EVkQgRmlsZXN5c3RlbXMKKyMKKyMgQ09ORklHX0lTTzk2NjBfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVURGX0ZTIGlzIG5vdCBzZXQKKworIworIyBET1MvRkFUL05UIEZpbGVzeXN0ZW1zCisjCitDT05GSUdfRkFUX0ZTPXkKK0NPTkZJR19NU0RPU19GUz15CitDT05GSUdfVkZBVF9GUz1tCitDT05GSUdfRkFUX0RFRkFVTFRfQ09ERVBBR0U9ODUwCitDT05GSUdfRkFUX0RFRkFVTFRfSU9DSEFSU0VUPSJpc284ODU5LTEiCisjIENPTkZJR19OVEZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBQc2V1ZG8gZmlsZXN5c3RlbXMKKyMKK0NPTkZJR19QUk9DX0ZTPXkKKyMgQ09ORklHX1BST0NfS0NPUkUgaXMgbm90IHNldAorQ09ORklHX1BST0NfU1lTQ1RMPXkKK0NPTkZJR19QUk9DX1BBR0VfTU9OSVRPUj15CitDT05GSUdfU1lTRlM9eQorQ09ORklHX1RNUEZTPXkKKyMgQ09ORklHX1RNUEZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CisjIENPTkZJR19IVUdFVExCX1BBR0UgaXMgbm90IHNldAorQ09ORklHX0NPTkZJR0ZTX0ZTPXkKKworIworIyBNaXNjZWxsYW5lb3VzIGZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19BREZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hGU1BMVVNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQkVGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19CRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRUZTX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19KRkZTMl9GUz15CitDT05GSUdfSkZGUzJfRlNfREVCVUc9MAorQ09ORklHX0pGRlMyX0ZTX1dSSVRFQlVGRkVSPXkKKyMgQ09ORklHX0pGRlMyX0ZTX1dCVUZfVkVSSUZZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGRlMyX1NVTU1BUlkgaXMgbm90IHNldAorIyBDT05GSUdfSkZGUzJfRlNfWEFUVFIgaXMgbm90IHNldAorIyBDT05GSUdfSkZGUzJfQ09NUFJFU1NJT05fT1BUSU9OUyBpcyBub3Qgc2V0CitDT05GSUdfSkZGUzJfWkxJQj15CisjIENPTkZJR19KRkZTMl9MWk8gaXMgbm90IHNldAorQ09ORklHX0pGRlMyX1JUSU1FPXkKKyMgQ09ORklHX0pGRlMyX1JVQklOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQU1GUyBpcyBub3Qgc2V0CisjIENPTkZJR19WWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JTklYX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX09NRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSFBGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19RTlg0RlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfU1lTVl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19VRlNfRlMgaXMgbm90IHNldAorQ09ORklHX05FVFdPUktfRklMRVNZU1RFTVM9eQorQ09ORklHX05GU19GUz15CitDT05GSUdfTkZTX1YzPXkKKyMgQ09ORklHX05GU19WM19BQ0wgaXMgbm90IHNldAorIyBDT05GSUdfTkZTX1Y0IGlzIG5vdCBzZXQKK0NPTkZJR19ST09UX05GUz15CisjIENPTkZJR19ORlNEIGlzIG5vdCBzZXQKK0NPTkZJR19MT0NLRD15CitDT05GSUdfTE9DS0RfVjQ9eQorQ09ORklHX05GU19DT01NT049eQorQ09ORklHX1NVTlJQQz15CisjIENPTkZJR19TVU5SUENfUkVHSVNURVJfVjQgaXMgbm90IHNldAorIyBDT05GSUdfUlBDU0VDX0dTU19LUkI1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JQQ1NFQ19HU1NfU1BLTTMgaXMgbm90IHNldAorIyBDT05GSUdfU01CX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NJRlMgaXMgbm90IHNldAorIyBDT05GSUdfTkNQX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NPREFfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQUZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBQYXJ0aXRpb24gVHlwZXMKKyMKKyMgQ09ORklHX1BBUlRJVElPTl9BRFZBTkNFRCBpcyBub3Qgc2V0CitDT05GSUdfTVNET1NfUEFSVElUSU9OPXkKK0NPTkZJR19OTFM9eQorQ09ORklHX05MU19ERUZBVUxUPSJpc284ODU5LTEiCitDT05GSUdfTkxTX0NPREVQQUdFXzQzNz1tCisjIENPTkZJR19OTFNfQ09ERVBBR0VfNzM3IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV83NzUgaXMgbm90IHNldAorQ09ORklHX05MU19DT0RFUEFHRV84NTA9bQorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1MiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODU1IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NTcgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODYxIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjIgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODY0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2NiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODY5IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV85MzYgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzk1MCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfOTMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV85NDkgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg3NCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV84IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV8xMjUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV8xMjUxIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19BU0NJSSBpcyBub3Qgc2V0CitDT05GSUdfTkxTX0lTTzg4NTlfMT1tCisjIENPTkZJR19OTFNfSVNPODg1OV8yIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzMgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfNCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV81IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzYgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfNyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV85IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzEzIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzE0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzE1IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19LT0k4X1IgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0tPSThfVSBpcyBub3Qgc2V0CitDT05GSUdfTkxTX1VURjg9bQorIyBDT05GSUdfRExNIGlzIG5vdCBzZXQKKworIworIyBLZXJuZWwgaGFja2luZworIworIyBDT05GSUdfUFJJTlRLX1RJTUUgaXMgbm90IHNldAorQ09ORklHX0VOQUJMRV9XQVJOX0RFUFJFQ0FURUQ9eQorQ09ORklHX0VOQUJMRV9NVVNUX0NIRUNLPXkKK0NPTkZJR19GUkFNRV9XQVJOPTEwMjQKK0NPTkZJR19NQUdJQ19TWVNSUT15CisjIENPTkZJR19VTlVTRURfU1lNQk9MUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IRUFERVJTX0NIRUNLIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19LRVJORUw9eQorIyBDT05GSUdfREVCVUdfU0hJUlEgaXMgbm90IHNldAorQ09ORklHX0RFVEVDVF9TT0ZUTE9DS1VQPXkKKyMgQ09ORklHX0JPT1RQQVJBTV9TT0ZUTE9DS1VQX1BBTklDIGlzIG5vdCBzZXQKK0NPTkZJR19CT09UUEFSQU1fU09GVExPQ0tVUF9QQU5JQ19WQUxVRT0wCitDT05GSUdfU0NIRURfREVCVUc9eQorIyBDT05GSUdfU0NIRURTVEFUUyBpcyBub3Qgc2V0CisjIENPTkZJR19USU1FUl9TVEFUUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19PQkpFQ1RTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NMVUJfREVCVUdfT04gaXMgbm90IHNldAorIyBDT05GSUdfU0xVQl9TVEFUUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19SVF9NVVRFWEVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUX01VVEVYX1RFU1RFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TUElOTE9DSyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19NVVRFWEVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0xPQ0tfQUxMT0MgaXMgbm90IHNldAorIyBDT05GSUdfUFJPVkVfTE9DS0lORyBpcyBub3Qgc2V0CisjIENPTkZJR19MT0NLX1NUQVQgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU1BJTkxPQ0tfU0xFRVAgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfTE9DS0lOR19BUElfU0VMRlRFU1RTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0tPQkpFQ1QgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX0JVR1ZFUkJPU0U9eQorIyBDT05GSUdfREVCVUdfSU5GTyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19WTSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19XUklURUNPVU5UIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX01FTU9SWV9JTklUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0xJU1QgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU0cgaXMgbm90IHNldAorQ09ORklHX0ZSQU1FX1BPSU5URVI9eQorIyBDT05GSUdfQk9PVF9QUklOVEtfREVMQVkgaXMgbm90IHNldAorIyBDT05GSUdfUkNVX1RPUlRVUkVfVEVTVCBpcyBub3Qgc2V0CisjIENPTkZJR19SQ1VfQ1BVX1NUQUxMX0RFVEVDVE9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tQUk9CRVNfU0FOSVRZX1RFU1QgaXMgbm90IHNldAorIyBDT05GSUdfQkFDS1RSQUNFX1NFTEZfVEVTVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19CTE9DS19FWFRfREVWVCBpcyBub3Qgc2V0CisjIENPTkZJR19MS0RUTSBpcyBub3Qgc2V0CisjIENPTkZJR19GQVVMVF9JTkpFQ1RJT04gaXMgbm90IHNldAorIyBDT05GSUdfRFlOQU1JQ19QUklOVEtfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfU0FNUExFUyBpcyBub3Qgc2V0CisKKyMKKyMgU2VjdXJpdHkgb3B0aW9ucworIworIyBDT05GSUdfS0VZUyBpcyBub3Qgc2V0CisjIENPTkZJR19TRUNVUklUWSBpcyBub3Qgc2V0CisjIENPTkZJR19TRUNVUklUWUZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFQ1VSSVRZX0ZJTEVfQ0FQQUJJTElUSUVTIGlzIG5vdCBzZXQKK0NPTkZJR19DUllQVE89eQorCisjCisjIENyeXB0byBjb3JlIG9yIGhlbHBlcgorIworIyBDT05GSUdfQ1JZUFRPX0ZJUFMgaXMgbm90IHNldAorQ09ORklHX0NSWVBUT19BTEdBUEk9eQorQ09ORklHX0NSWVBUT19BRUFEPXkKK0NPTkZJR19DUllQVE9fQkxLQ0lQSEVSPXkKK0NPTkZJR19DUllQVE9fSEFTSD15CitDT05GSUdfQ1JZUFRPX1JORz15CitDT05GSUdfQ1JZUFRPX01BTkFHRVI9eQorIyBDT05GSUdfQ1JZUFRPX0dGMTI4TVVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19OVUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DUllQVEQgaXMgbm90IHNldAorQ09ORklHX0NSWVBUT19BVVRIRU5DPXkKKyMgQ09ORklHX0NSWVBUT19URVNUIGlzIG5vdCBzZXQKKworIworIyBBdXRoZW50aWNhdGVkIEVuY3J5cHRpb24gd2l0aCBBc3NvY2lhdGVkIERhdGEKKyMKKyMgQ09ORklHX0NSWVBUT19DQ00gaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0dDTSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0VRSVYgaXMgbm90IHNldAorCisjCisjIEJsb2NrIG1vZGVzCisjCitDT05GSUdfQ1JZUFRPX0NCQz15CisjIENPTkZJR19DUllQVE9fQ1RSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DVFMgaXMgbm90IHNldAorQ09ORklHX0NSWVBUT19FQ0I9bQorIyBDT05GSUdfQ1JZUFRPX0xSVyBpcyBub3Qgc2V0CitDT05GSUdfQ1JZUFRPX1BDQkM9bQorIyBDT05GSUdfQ1JZUFRPX1hUUyBpcyBub3Qgc2V0CisKKyMKKyMgSGFzaCBtb2RlcworIworQ09ORklHX0NSWVBUT19ITUFDPXkKKyMgQ09ORklHX0NSWVBUT19YQ0JDIGlzIG5vdCBzZXQKKworIworIyBEaWdlc3QKKyMKKyMgQ09ORklHX0NSWVBUT19DUkMzMkMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX01ENCBpcyBub3Qgc2V0CitDT05GSUdfQ1JZUFRPX01ENT15CisjIENPTkZJR19DUllQVE9fTUlDSEFFTF9NSUMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1JNRDEyOCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fUk1EMTYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19STUQyNTYgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1JNRDMyMCBpcyBub3Qgc2V0CitDT05GSUdfQ1JZUFRPX1NIQTE9eQorIyBDT05GSUdfQ1JZUFRPX1NIQTI1NiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0hBNTEyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19UR1IxOTIgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1dQNTEyIGlzIG5vdCBzZXQKKworIworIyBDaXBoZXJzCisjCisjIENPTkZJR19DUllQVE9fQUVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19BTlVCSVMgaXMgbm90IHNldAorQ09ORklHX0NSWVBUT19BUkM0PW0KKyMgQ09ORklHX0NSWVBUT19CTE9XRklTSCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ0FNRUxMSUEgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NBU1Q1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DQVNUNiBpcyBub3Qgc2V0CitDT05GSUdfQ1JZUFRPX0RFUz15CisjIENPTkZJR19DUllQVE9fRkNSWVBUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19LSEFaQUQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NBTFNBMjAgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NFRUQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NFUlBFTlQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1RFQSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fVFdPRklTSCBpcyBub3Qgc2V0CisKKyMKKyMgQ29tcHJlc3Npb24KKyMKK0NPTkZJR19DUllQVE9fREVGTEFURT15CisjIENPTkZJR19DUllQVE9fTFpPIGlzIG5vdCBzZXQKKworIworIyBSYW5kb20gTnVtYmVyIEdlbmVyYXRpb24KKyMKKyMgQ09ORklHX0NSWVBUT19BTlNJX0NQUk5HIGlzIG5vdCBzZXQKK0NPTkZJR19DUllQVE9fSFc9eQorCisjCisjIExpYnJhcnkgcm91dGluZXMKKyMKK0NPTkZJR19CSVRSRVZFUlNFPXkKK0NPTkZJR19DUkNfQ0NJVFQ9bQorIyBDT05GSUdfQ1JDMTYgaXMgbm90IHNldAorIyBDT05GSUdfQ1JDX1QxMERJRiBpcyBub3Qgc2V0CitDT05GSUdfQ1JDX0lUVV9UPW0KK0NPTkZJR19DUkMzMj15CitDT05GSUdfQ1JDNz1tCisjIENPTkZJR19MSUJDUkMzMkMgaXMgbm90IHNldAorQ09ORklHX1pMSUJfSU5GTEFURT15CitDT05GSUdfWkxJQl9ERUZMQVRFPXkKK0NPTkZJR19HRU5FUklDX0FMTE9DQVRPUj15CitDT05GSUdfUExJU1Q9eQorQ09ORklHX0hBU19JT01FTT15CitDT05GSUdfSEFTX0lPUE9SVD15CitDT05GSUdfSEFTX0RNQT15CmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL2luY2x1ZGUvYXNtL0tidWlsZCBiL2FyY2gvYXZyMzIvaW5jbHVkZS9hc20vS2J1aWxkCmluZGV4IDMxMzY2MjguLjIxOTgyMmMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIvaW5jbHVkZS9hc20vS2J1aWxkCisrKyBiL2FyY2gvYXZyMzIvaW5jbHVkZS9hc20vS2J1aWxkCkBAIC0xLDMgKzEsNCBAQAogaW5jbHVkZSBpbmNsdWRlL2FzbS1nZW5lcmljL0tidWlsZC5hc20KIAoraGVhZGVyLXkJKz0gc3dhYi5oCiBoZWFkZXIteQkrPSBjYWNoZWN0bC5oCmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL2luY2x1ZGUvYXNtL2F0bWVsLW1jaS5oIGIvYXJjaC9hdnIzMi9pbmNsdWRlL2FzbS9hdG1lbC1tY2kuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTVlNTRjNi4uMDAwMDAwMAotLS0gYS9hcmNoL2F2cjMyL2luY2x1ZGUvYXNtL2F0bWVsLW1jaS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotI2lmbmRlZiBfX0FTTV9BVlIzMl9BVE1FTF9NQ0lfSAotI2RlZmluZSBfX0FTTV9BVlIzMl9BVE1FTF9NQ0lfSAotCi0jZGVmaW5lIEFUTUVMX01DSV9NQVhfTlJfU0xPVFMJMgotCi0jaW5jbHVkZSA8bGludXgvZHdfZG1hYy5oPgotCi0vKioKLSAqIHN0cnVjdCBtY2lfc2xvdF9wZGF0YSAtIGJvYXJkLXNwZWNpZmljIHBlci1zbG90IGNvbmZpZ3VyYXRpb24KLSAqIEBidXNfd2lkdGg6IE51bWJlciBvZiBkYXRhIGxpbmVzIHdpcmVkIHVwIHRoZSBzbG90Ci0gKiBAZGV0ZWN0X3BpbjogR1BJTyBwaW4gd2lyZWQgdG8gdGhlIGNhcmQgZGV0ZWN0IHN3aXRjaAotICogQHdwX3BpbjogR1BJTyBwaW4gd2lyZWQgdG8gdGhlIHdyaXRlIHByb3RlY3Qgc2Vuc29yCi0gKgotICogSWYgYSBnaXZlbiBzbG90IGlzIG5vdCBwcmVzZW50IG9uIHRoZSBib2FyZCwgQGJ1c193aWR0aCBzaG91bGQgYmUKLSAqIHNldCB0byAwLiBUaGUgb3RoZXIgZmllbGRzIGFyZSBpZ25vcmVkIGluIHRoaXMgY2FzZS4KLSAqCi0gKiBBbnkgcGlucyB0aGF0IGFyZW4ndCBhdmFpbGFibGUgc2hvdWxkIGJlIHNldCB0byBhIG5lZ2F0aXZlIHZhbHVlLgotICoKLSAqIE5vdGUgdGhhdCBzdXBwb3J0IGZvciBtdWx0aXBsZSBzbG90cyBpcyBleHBlcmltZW50YWwgLS0gc29tZSBjYXJkcwotICogbWlnaHQgZ2V0IHVwc2V0IGlmIHdlIGRvbid0IGdldCB0aGUgY2xvY2sgbWFuYWdlbWVudCBleGFjdGx5IHJpZ2h0LgotICogQnV0IGluIG1vc3QgY2FzZXMsIGl0IHNob3VsZCB3b3JrIGp1c3QgZmluZS4KLSAqLwotc3RydWN0IG1jaV9zbG90X3BkYXRhIHsKLQl1bnNpZ25lZCBpbnQJCWJ1c193aWR0aDsKLQlpbnQJCQlkZXRlY3RfcGluOwotCWludAkJCXdwX3BpbjsKLX07Ci0KLS8qKgotICogc3RydWN0IG1jaV9wbGF0Zm9ybV9kYXRhIC0gYm9hcmQtc3BlY2lmaWMgTU1DL1NEY2FyZCBjb25maWd1cmF0aW9uCi0gKiBAZG1hX3NsYXZlOiBETUEgc2xhdmUgaW50ZXJmYWNlIHRvIHVzZSBpbiBkYXRhIHRyYW5zZmVycy4KLSAqIEBzbG90OiBQZXItc2xvdCBjb25maWd1cmF0aW9uIGRhdGEuCi0gKi8KLXN0cnVjdCBtY2lfcGxhdGZvcm1fZGF0YSB7Ci0Jc3RydWN0IGR3X2RtYV9zbGF2ZQlkbWFfc2xhdmU7Ci0Jc3RydWN0IG1jaV9zbG90X3BkYXRhCXNsb3RbQVRNRUxfTUNJX01BWF9OUl9TTE9UU107Ci19OwotCi0jZW5kaWYgLyogX19BU01fQVZSMzJfQVRNRUxfTUNJX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIvaW5jbHVkZS9hc20vYXRvbWljLmggYi9hcmNoL2F2cjMyL2luY2x1ZGUvYXNtL2F0b21pYy5oCmluZGV4IDdlZjM4NjIuLjMxODgxNTEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIvaW5jbHVkZS9hc20vYXRvbWljLmgKKysrIGIvYXJjaC9hdnIzMi9pbmNsdWRlL2FzbS9hdG9taWMuaApAQCAtMTQsOSArMTQsOSBAQAogI2lmbmRlZiBfX0FTTV9BVlIzMl9BVE9NSUNfSAogI2RlZmluZSBfX0FTTV9BVlIzMl9BVE9NSUNfSAogCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAKLXR5cGVkZWYgc3RydWN0IHsgdm9sYXRpbGUgaW50IGNvdW50ZXI7IH0gYXRvbWljX3Q7CiAjZGVmaW5lIEFUT01JQ19JTklUKGkpICB7IChpKSB9CiAKICNkZWZpbmUgYXRvbWljX3JlYWQodikJCSgodiktPmNvdW50ZXIpCmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL2luY2x1ZGUvYXNtL2J5dGVvcmRlci5oIGIvYXJjaC9hdnIzMi9pbmNsdWRlL2FzbS9ieXRlb3JkZXIuaAppbmRleCA4ZTNhZjAyLi4yYWJhNjRiIDEwMDY0NAotLS0gYS9hcmNoL2F2cjMyL2luY2x1ZGUvYXNtL2J5dGVvcmRlci5oCisrKyBiL2FyY2gvYXZyMzIvaW5jbHVkZS9hc20vYnl0ZW9yZGVyLmgKQEAgLTQsMzQgKzQsNyBAQAogI2lmbmRlZiBfX0FTTV9BVlIzMl9CWVRFT1JERVJfSAogI2RlZmluZSBfX0FTTV9BVlIzMl9CWVRFT1JERVJfSAogCi0jaW5jbHVkZSA8YXNtL3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KKyNpbmNsdWRlIDxhc20vc3dhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2J5dGVvcmRlci9iaWdfZW5kaWFuLmg+CiAKLSNkZWZpbmUgX19CSUdfRU5ESUFOCi0jZGVmaW5lIF9fU1dBQl82NF9USFJVXzMyX18KLQotI2lmZGVmIF9fQ0hFQ0tFUl9fCi1leHRlcm4gdW5zaWduZWQgbG9uZyBfX2J1aWx0aW5fYnN3YXBfMzIodW5zaWduZWQgbG9uZyB4KTsKLWV4dGVybiB1bnNpZ25lZCBzaG9ydCBfX2J1aWx0aW5fYnN3YXBfMTYodW5zaWduZWQgc2hvcnQgeCk7Ci0jZW5kaWYKLQotLyoKLSAqIGF2cjMyLWxpbnV4LWdjYyB2ZXJzaW9ucyBlYXJsaWVyIHRoYW4gNC4yIGltcHJvcGVybHkgc2lnbi1leHRlbmRzCi0gKiB0aGUgcmVzdWx0LgotICovCi0jaWYgIShfX0dOVUNfXyA9PSA0ICYmIF9fR05VQ19NSU5PUl9fIDwgMikKLXN0YXRpYyBpbmxpbmUgX19hdHRyaWJ1dGVfY29uc3RfXyBfX3UxNiBfX2FyY2hfc3dhYjE2KF9fdTE2IHZhbCkKLXsKLQlyZXR1cm4gX19idWlsdGluX2Jzd2FwXzE2KHZhbCk7Ci19Ci0jZGVmaW5lIF9fYXJjaF9zd2FiMTYgX19hcmNoX3N3YWIxNgotCi1zdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX2NvbnN0X18gX191MzIgX19hcmNoX3N3YWIzMihfX3UzMiB2YWwpCi17Ci0JcmV0dXJuIF9fYnVpbHRpbl9ic3dhcF8zMih2YWwpOwotfQotI2RlZmluZSBfX2FyY2hfc3dhYjMyIF9fYXJjaF9zd2FiMzIKLSNlbmRpZgotCi0jaW5jbHVkZSA8bGludXgvYnl0ZW9yZGVyLmg+CiAjZW5kaWYgLyogX19BU01fQVZSMzJfQllURU9SREVSX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIvaW5jbHVkZS9hc20va2RlYnVnLmggYi9hcmNoL2F2cjMyL2luY2x1ZGUvYXNtL2tkZWJ1Zy5oCmluZGV4IGNhNGY5NTQuLmY5MzBjZTIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIvaW5jbHVkZS9hc20va2RlYnVnLmgKKysrIGIvYXJjaC9hdnIzMi9pbmNsdWRlL2FzbS9rZGVidWcuaApAQCAtNiw2ICs2LDcgQEAKIAlESUVfQlJFQUtQT0lOVCwKIAlESUVfU1NURVAsCiAJRElFX05NSSwKKwlESUVfT09QUywKIH07CiAKICNlbmRpZiAvKiBfX0FTTV9BVlIzMl9LREVCVUdfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9pbmNsdWRlL2FzbS9zd2FiLmggYi9hcmNoL2F2cjMyL2luY2x1ZGUvYXNtL3N3YWIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTRhYTViCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hdnIzMi9pbmNsdWRlL2FzbS9zd2FiLmgKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIEFWUjMyIGJ5dGVzd2FwcGluZyBmdW5jdGlvbnMuCisgKi8KKyNpZm5kZWYgX19BU01fQVZSMzJfU1dBQl9ICisjZGVmaW5lIF9fQVNNX0FWUjMyX1NXQUJfSAorCisjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KKworI2RlZmluZSBfX1NXQUJfNjRfVEhSVV8zMl9fCisKKyNpZmRlZiBfX0NIRUNLRVJfXworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgX19idWlsdGluX2Jzd2FwXzMyKHVuc2lnbmVkIGxvbmcgeCk7CitleHRlcm4gdW5zaWduZWQgc2hvcnQgX19idWlsdGluX2Jzd2FwXzE2KHVuc2lnbmVkIHNob3J0IHgpOworI2VuZGlmCisKKy8qCisgKiBhdnIzMi1saW51eC1nY2MgdmVyc2lvbnMgZWFybGllciB0aGFuIDQuMiBpbXByb3Blcmx5IHNpZ24tZXh0ZW5kcworICogdGhlIHJlc3VsdC4KKyAqLworI2lmICEoX19HTlVDX18gPT0gNCAmJiBfX0dOVUNfTUlOT1JfXyA8IDIpCitzdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX2NvbnN0X18gX191MTYgX19hcmNoX3N3YWIxNihfX3UxNiB2YWwpCit7CisJcmV0dXJuIF9fYnVpbHRpbl9ic3dhcF8xNih2YWwpOworfQorI2RlZmluZSBfX2FyY2hfc3dhYjE2IF9fYXJjaF9zd2FiMTYKKworc3RhdGljIGlubGluZSBfX2F0dHJpYnV0ZV9jb25zdF9fIF9fdTMyIF9fYXJjaF9zd2FiMzIoX191MzIgdmFsKQoreworCXJldHVybiBfX2J1aWx0aW5fYnN3YXBfMzIodmFsKTsKK30KKyNkZWZpbmUgX19hcmNoX3N3YWIzMiBfX2FyY2hfc3dhYjMyCisjZW5kaWYKKworI2VuZGlmIC8qIF9fQVNNX0FWUjMyX1NXQUJfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9pbmNsdWRlL2FzbS9zeXNjYWxscy5oIGIvYXJjaC9hdnIzMi9pbmNsdWRlL2FzbS9zeXNjYWxscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4M2Q2NjYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2F2cjMyL2luY2x1ZGUvYXNtL3N5c2NhbGxzLmgKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIHN5c2NhbGxzLmggLSBMaW51eCBzeXNjYWxsIGludGVyZmFjZXMgKGFyY2gtc3BlY2lmaWMpCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA4IEphc3dpbmRlciBTaW5naAorICoKKyAqIFRoaXMgZmlsZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgR1BMdjIuCisgKiBTZWUgdGhlIGZpbGUgQ09QWUlORyBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgX0FTTV9BVlIzMl9TWVNDQUxMU19ICisjZGVmaW5lIF9BU01fQVZSMzJfU1lTQ0FMTFNfSAorCisjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KKworLyoga2VybmVsL3Byb2Nlc3MuYyAqLworYXNtbGlua2FnZSBpbnQgc3lzX2Zvcmsoc3RydWN0IHB0X3JlZ3MgKik7Cithc21saW5rYWdlIGludCBzeXNfY2xvbmUodW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZywKKwkJCSB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nLAorCQkJIHN0cnVjdCBwdF9yZWdzICopOworYXNtbGlua2FnZSBpbnQgc3lzX3Zmb3JrKHN0cnVjdCBwdF9yZWdzICopOworYXNtbGlua2FnZSBpbnQgc3lzX2V4ZWN2ZShjaGFyIF9fdXNlciAqLCBjaGFyIF9fdXNlciAqX191c2VyICosCisJCQkgIGNoYXIgX191c2VyICpfX3VzZXIgKiwgc3RydWN0IHB0X3JlZ3MgKik7CisKKy8qIGtlcm5lbC9zaWduYWwuYyAqLworYXNtbGlua2FnZSBpbnQgc3lzX3NpZ2FsdHN0YWNrKGNvbnN0IHN0YWNrX3QgX191c2VyICosIHN0YWNrX3QgX191c2VyICosCisJCQkgICAgICAgc3RydWN0IHB0X3JlZ3MgKik7Cithc21saW5rYWdlIGludCBzeXNfcnRfc2lncmV0dXJuKHN0cnVjdCBwdF9yZWdzICopOworCisvKiBrZXJuZWwvc3lzX2F2cjMyLmMgKi8KK2FzbWxpbmthZ2UgbG9uZyBzeXNfbW1hcDIodW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZywKKwkJCSAgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZywgb2ZmX3QpOworCisvKiBtbS9jYWNoZS5jICovCithc21saW5rYWdlIGludCBzeXNfY2FjaGVmbHVzaChpbnQsIHZvaWQgX191c2VyICosIHNpemVfdCk7CisKKyNlbmRpZiAvKiBfQVNNX0FWUjMyX1NZU0NBTExTX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIva2VybmVsL3Byb2Nlc3MuYyBiL2FyY2gvYXZyMzIva2VybmVsL3Byb2Nlc3MuYwppbmRleCAxMzRkNTMwLi40M2FlNTU1IDEwMDY0NAotLS0gYS9hcmNoL2F2cjMyL2tlcm5lbC9wcm9jZXNzLmMKKysrIGIvYXJjaC9hdnIzMi9rZXJuZWwvcHJvY2Vzcy5jCkBAIC0xOCw2ICsxOCw3IEBACiAKICNpbmNsdWRlIDxhc20vc3lzcmVnLmg+CiAjaW5jbHVkZSA8YXNtL29jZC5oPgorI2luY2x1ZGUgPGFzbS9zeXNjYWxscy5oPgogCiAjaW5jbHVkZSA8bWFjaC9wbS5oPgogCmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL2tlcm5lbC9zaWduYWwuYyBiL2FyY2gvYXZyMzIva2VybmVsL3NpZ25hbC5jCmluZGV4IGM1YjExZjkuLjgwM2Q3YmUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIva2VybmVsL3NpZ25hbC5jCisrKyBiL2FyY2gvYXZyMzIva2VybmVsL3NpZ25hbC5jCkBAIC0xOSw2ICsxOSw3IEBACiAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS91Y29udGV4dC5oPgorI2luY2x1ZGUgPGFzbS9zeXNjYWxscy5oPgogCiAjZGVmaW5lIF9CTE9DS0FCTEUgKH4oc2lnbWFzayhTSUdLSUxMKSB8IHNpZ21hc2soU0lHU1RPUCkpKQogCmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL2tlcm5lbC9zeXNfYXZyMzIuYyBiL2FyY2gvYXZyMzIva2VybmVsL3N5c19hdnIzMi5jCmluZGV4IDhlODkxMWUuLjVkMmRhZWEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIva2VybmVsL3N5c19hdnIzMi5jCisrKyBiL2FyY2gvYXZyMzIva2VybmVsL3N5c19hdnIzMi5jCkBAIC0xMyw2ICsxMyw3IEBACiAKICNpbmNsdWRlIDxhc20vbW1hbi5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3N5c2NhbGxzLmg+CiAKIGFzbWxpbmthZ2UgbG9uZyBzeXNfbW1hcDIodW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGxlbiwKIAkJCSAgdW5zaWduZWQgbG9uZyBwcm90LCB1bnNpZ25lZCBsb25nIGZsYWdzLApkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9rZXJuZWwvdHJhcHMuYyBiL2FyY2gvYXZyMzIva2VybmVsL3RyYXBzLmMKaW5kZXggMGQ5ODczNy4uZDU0N2M4ZCAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9rZXJuZWwvdHJhcHMuYworKysgYi9hcmNoL2F2cjMyL2tlcm5lbC90cmFwcy5jCkBAIC03LDYgKzcsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9idWcuaD4KKyNpbmNsdWRlIDxsaW51eC9oYXJkaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2thbGxzeW1zLmg+CiAjaW5jbHVkZSA8bGludXgva2RlYnVnLmg+CmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL2F0MzJhcDcwMHguYyBiL2FyY2gvYXZyMzIvbWFjaC1hdDMyYXAvYXQzMmFwNzAweC5jCmluZGV4IDQxNGYxNzQuLjNmYmZkMWUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIvbWFjaC1hdDMyYXAvYXQzMmFwNzAweC5jCisrKyBiL2FyY2gvYXZyMzIvbWFjaC1hdDMyYXAvYXQzMmFwNzAweC5jCkBAIC0xNSw4ICsxNSw4IEBACiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KICNpbmNsdWRlIDxsaW51eC91c2IvYXRtZWxfdXNiYV91ZGMuaD4KKyNpbmNsdWRlIDxsaW51eC9hdG1lbC1tY2kuaD4KIAotI2luY2x1ZGUgPGFzbS9hdG1lbC1tY2kuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CiAKQEAgLTQyMSw3ICs0MjEsNyBAQAogCXJldHVybiBidXNfY2xrX2dldF9yYXRlKGNsaywgc2hpZnQpOwogfQogCi1zdGF0aWMgdm9pZCBwYmFfY2xrX21vZGUoc3RydWN0IGNsayAqY2xrLCBpbnQgZW5hYmxlZCkKK3ZvaWQgcGJhX2Nsa19tb2RlKHN0cnVjdCBjbGsgKmNsaywgaW50IGVuYWJsZWQpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1MzIgbWFzazsKQEAgLTQzNiw3ICs0MzYsNyBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBtX2xvY2ssIGZsYWdzKTsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGxvbmcgcGJhX2Nsa19nZXRfcmF0ZShzdHJ1Y3QgY2xrICpjbGspCit1bnNpZ25lZCBsb25nIHBiYV9jbGtfZ2V0X3JhdGUoc3RydWN0IGNsayAqY2xrKQogewogCXVuc2lnbmVkIGxvbmcgY2tzZWwsIHNoaWZ0ID0gMDsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC9jbG9jay5jIGIvYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC9jbG9jay5jCmluZGV4IDEzOGEwMGEuLjQ0MmYwOGMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIvbWFjaC1hdDMyYXAvY2xvY2suYworKysgYi9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL2Nsb2NrLmMKQEAgLTE5OCw3ICsxOTgsNyBAQAogCXVuc2lnbmVkCWk7CiAKIAkvKiBza2lwIGNsb2NrcyBjb3VwbGVkIHRvIGRldmljZXMgdGhhdCBhcmVuJ3QgcmVnaXN0ZXJlZCAqLwotCWlmIChwYXJlbnQtPmRldiAmJiAhcGFyZW50LT5kZXYtPmJ1c19pZFswXSAmJiAhcGFyZW50LT51c2VycykKKwlpZiAocGFyZW50LT5kZXYgJiYgIWRldl9uYW1lKHBhcmVudC0+ZGV2KSAmJiAhcGFyZW50LT51c2VycykKIAkJcmV0dXJuOwogCiAJLyogPG5lc3Qgc3BhY2VzPiBuYW1lIDxwYWQgdG8gZW5kPiAqLwpAQCAtMjE0LDcgKzIxNCw3IEBACiAJCXBhcmVudC0+dXNlcnMgPyAib24iIDogIm9mZiIsCS8qIE5PVEU6IG5vdC1wYXJhbm9pZCEhICovCiAJCWNsa19nZXRfcmF0ZShwYXJlbnQpKTsKIAlpZiAocGFyZW50LT5kZXYpCi0JCXNlcV9wcmludGYoci0+cywgIiwgZm9yICVzIiwgcGFyZW50LT5kZXYtPmJ1c19pZCk7CisJCXNlcV9wcmludGYoci0+cywgIiwgZm9yICVzIiwgZGV2X25hbWUocGFyZW50LT5kZXYpKTsKIAlzZXFfcHJpbnRmKHItPnMsICJcbiIpOwogCiAJLyogY29zdCBvZiB0aGlzIHNjYW4gaXMgc21hbGwsIGJ1dCBub3QgbGluZWFyLi4uICovCmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL2Nsb2NrLmggYi9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL2Nsb2NrLmgKaW5kZXggNjIzYmYwZS4uNGM3ZWJiZCAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC9jbG9jay5oCisrKyBiL2FyY2gvYXZyMzIvbWFjaC1hdDMyYXAvY2xvY2suaApAQCAtMzAsMyArMzAsNiBAQAogCXUxNgkJdXNlcnM7CQkvKiBFbmFibGVkIGlmIG5vbi16ZXJvICovCiAJdTE2CQlpbmRleDsJCS8qIFNpYmxpbmcgaW5kZXggKi8KIH07CisKK3Vuc2lnbmVkIGxvbmcgcGJhX2Nsa19nZXRfcmF0ZShzdHJ1Y3QgY2xrICpjbGspOwordm9pZCBwYmFfY2xrX21vZGUoc3RydWN0IGNsayAqY2xrLCBpbnQgZW5hYmxlZCk7CmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL2luY2x1ZGUvbWFjaC9hdDMyYXA3MDB4LmggYi9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL2luY2x1ZGUvbWFjaC9hdDMyYXA3MDB4LmgKaW5kZXggYTc3ZDM3Mi4uNWM0Yzk3MSAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC9pbmNsdWRlL21hY2gvYXQzMmFwNzAweC5oCisrKyBiL2FyY2gvYXZyMzIvbWFjaC1hdDMyYXAvaW5jbHVkZS9tYWNoL2F0MzJhcDcwMHguaApAQCAtMjExLDQgKzIxMSw3IEBACiAKICNkZWZpbmUgQVRNRUxfTENEQ19BTFRfMTVCSVQJKEFUTUVMX0xDRENfQ09OVFJPTCB8IEFUTUVMX0xDRENfQUxUXzE1Ql9EQVRBKQogCisvKiBCaXRtYXNrIGZvciBhbGwgRUJJIGRhdGEgKEQxNi4uRDMxKSBwaW5zIG9uIHBvcnQgRSAqLworI2RlZmluZSBBVE1FTF9FQklfUEVfREFUQV9BTEwgICgweDAwMDBGRkZGKQorCiAjZW5kaWYgLyogX19BU01fQVJDSF9BVDMyQVA3MDBYX0hfXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC9pbmNsdWRlL21hY2gvcG9ydG11eC5oIGIvYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC9pbmNsdWRlL21hY2gvcG9ydG11eC5oCmluZGV4IDIxYzc5MzcuLjQ4NzMwMjQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIvbWFjaC1hdDMyYXAvaW5jbHVkZS9tYWNoL3BvcnRtdXguaAorKysgYi9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL2luY2x1ZGUvbWFjaC9wb3J0bXV4LmgKQEAgLTI1LDYgKzI1LDYgQEAKIAkJCXVuc2lnbmVkIGludCBwZXJpcGgsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOwogdm9pZCBhdDMyX3NlbGVjdF9ncGlvKHVuc2lnbmVkIGludCBwaW4sIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOwogdm9pZCBhdDMyX2Rlc2VsZWN0X3Bpbih1bnNpZ25lZCBpbnQgcGluKTsKLXZvaWQgYXQzMl9yZXNlcnZlX3Bpbih1bnNpZ25lZCBpbnQgcGluKTsKK3ZvaWQgYXQzMl9yZXNlcnZlX3Bpbih1bnNpZ25lZCBpbnQgcG9ydCwgdTMyIHBpbl9tYXNrKTsKIAogI2VuZGlmIC8qIF9fQVNNX0FSQ0hfUE9SVE1VWF9IX18gKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIvbWFjaC1hdDMyYXAvcGlvLmMgYi9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL3Bpby5jCmluZGV4IGVkODFhOGIuLjA5YTI3NGMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIvbWFjaC1hdDMyYXAvcGlvLmMKKysrIGIvYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC9waW8uYwpAQCAtMTY3LDIyICsxNjcsMjkgQEAKIH0KIAogLyogUmVzZXJ2ZSBhIHBpbiwgcHJldmVudGluZyBhbnlvbmUgZWxzZSBmcm9tIGNoYW5naW5nIGl0cyBjb25maWd1cmF0aW9uLiAqLwotdm9pZCBfX2luaXQgYXQzMl9yZXNlcnZlX3Bpbih1bnNpZ25lZCBpbnQgcGluKQordm9pZCBfX2luaXQgYXQzMl9yZXNlcnZlX3Bpbih1bnNpZ25lZCBpbnQgcG9ydCwgdTMyIHBpbl9tYXNrKQogewogCXN0cnVjdCBwaW9fZGV2aWNlICpwaW87Ci0JdW5zaWduZWQgaW50IHBpbl9pbmRleCA9IHBpbiAmIDB4MWY7CiAKLQlwaW8gPSBncGlvX3RvX3BpbyhwaW4pOworCS8qIGFzc2lnbiBhbmQgdmVyaWZ5IHBpbyAqLworCXBpbyA9IGdwaW9fdG9fcGlvKHBvcnQpOwogCWlmICh1bmxpa2VseSghcGlvKSkgewotCQlwcmludGsoInBpbzogaW52YWxpZCBwaW4gJXVcbiIsIHBpbik7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgInBpbzogaW52YWxpZCBwb3J0ICV1XG4iLCBwb3J0KTsKIAkJZ290byBmYWlsOwogCX0KIAotCWlmICh1bmxpa2VseSh0ZXN0X2FuZF9zZXRfYml0KHBpbl9pbmRleCwgJnBpby0+cGlubXV4X21hc2spKSkgewotCQlwcmludGsoIiVzOiBwaW4gJXUgaXMgYnVzeVxuIiwgcGlvLT5uYW1lLCBwaW5faW5kZXgpOworCS8qIFRlc3QgaWYgYW55IG9mIHRoZSByZXF1ZXN0ZWQgcGlucyBpcyBhbHJlYWR5IG11eGVkICovCisJc3Bpbl9sb2NrKCZwaW9fbG9jayk7CisJaWYgKHVubGlrZWx5KHBpby0+cGlubXV4X21hc2sgJiBwaW5fbWFzaykpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHBpbihzKSBidXN5IChyZXEuIDB4JXgsIGJ1c3kgMHgleClcbiIsCisJCSAgICAgICBwaW8tPm5hbWUsIHBpbl9tYXNrLCBwaW8tPnBpbm11eF9tYXNrICYgcGluX21hc2spOworCQlzcGluX3VubG9jaygmcGlvX2xvY2spOwogCQlnb3RvIGZhaWw7CiAJfQogCisJLyogUmVzZXJ2ZSBwaW5zICovCisJcGlvLT5waW5tdXhfbWFzayB8PSBwaW5fbWFzazsKKwlzcGluX3VubG9jaygmcGlvX2xvY2spOwogCXJldHVybjsKIAogZmFpbDoKZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIvbW0vY2FjaGUuYyBiL2FyY2gvYXZyMzIvbW0vY2FjaGUuYwppbmRleCAxNWE0ZTVlLi4yNGE3NGQxIDEwMDY0NAotLS0gYS9hcmNoL2F2cjMyL21tL2NhY2hlLmMKKysrIGIvYXJjaC9hdnIzMi9tbS9jYWNoZS5jCkBAIC0xMyw2ICsxMyw3IEBACiAjaW5jbHVkZSA8YXNtL2NhY2hlY3RsLmg+CiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3N5c2NhbGxzLmg+CiAKIC8qCiAgKiBJZiB5b3UgYXR0ZW1wdCB0byBmbHVzaCBhbnl0aGluZyBtb3JlIHRoYW4gdGhpcywgeW91IG5lZWQgc3VwZXJ1c2VyCmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL21tL2luaXQuYyBiL2FyY2gvYXZyMzIvbW0vaW5pdC5jCmluZGV4IGZhOTJmZjYuLmU4MTlmYTYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIvbW0vaW5pdC5jCisrKyBiL2FyY2gvYXZyMzIvbW0vaW5pdC5jCkBAIC05Nyw3ICs5Nyw2IEBACiAKIAltZW1fbWFwID0gTk9ERV9EQVRBKDApLT5ub2RlX21lbV9tYXA7CiAKLQltZW1zZXQoemVyb19wYWdlLCAwLCBQQUdFX1NJWkUpOwogCWVtcHR5X3plcm9fcGFnZSA9IHZpcnRfdG9fcGFnZSh6ZXJvX3BhZ2UpOwogCWZsdXNoX2RjYWNoZV9wYWdlKGVtcHR5X3plcm9fcGFnZSk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL0tjb25maWcgYi9hcmNoL2JsYWNrZmluL0tjb25maWcKaW5kZXggMjllNzFlZC4uYTk0OWM0ZiAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9LY29uZmlnCisrKyBiL2FyY2gvYmxhY2tmaW4vS2NvbmZpZwpAQCAtMjYsNiArMjYsNyBAQAogCWRlZmF1bHQgeQogCXNlbGVjdCBIQVZFX0lERQogCXNlbGVjdCBIQVZFX09QUk9GSUxFCisJc2VsZWN0IEFSQ0hfV0FOVF9PUFRJT05BTF9HUElPTElCCiAKIGNvbmZpZyBaT05FX0RNQQogCWJvb2wKQEAgLTU5LDEwICs2MCw2IEBACiAJYm9vbAogCWRlZmF1bHQgeQogCi1jb25maWcgSEFSRFdBUkVfUE0KLQlkZWZfYm9vbCB5Ci0JZGVwZW5kcyBvbiBPUFJPRklMRQotCiBzb3VyY2UgImluaXQvS2NvbmZpZyIKIAogc291cmNlICJrZXJuZWwvS2NvbmZpZy5wcmVlbXB0IgpAQCAtNzcsNiArNzQsMjYgQEAKIAlwcm9tcHQgIkNQVSIKIAlkZWZhdWx0IEJGNTMzCiAKK2NvbmZpZyBCRjUxMgorCWJvb2wgIkJGNTEyIgorCWhlbHAKKwkgIEJGNTEyIFByb2Nlc3NvciBTdXBwb3J0LgorCitjb25maWcgQkY1MTQKKwlib29sICJCRjUxNCIKKwloZWxwCisJICBCRjUxNCBQcm9jZXNzb3IgU3VwcG9ydC4KKworY29uZmlnIEJGNTE2CisJYm9vbCAiQkY1MTYiCisJaGVscAorCSAgQkY1MTYgUHJvY2Vzc29yIFN1cHBvcnQuCisKK2NvbmZpZyBCRjUxOAorCWJvb2wgIkJGNTE4IgorCWhlbHAKKwkgIEJGNTE4IFByb2Nlc3NvciBTdXBwb3J0LgorCiBjb25maWcgQkY1MjIKIAlib29sICJCRjUyMiIKIAloZWxwCkBAIC0xMzcsNiArMTU0LDE2IEBACiAJaGVscAogCSAgQkY1MzcgUHJvY2Vzc29yIFN1cHBvcnQuCiAKK2NvbmZpZyBCRjUzOAorCWJvb2wgIkJGNTM4IgorCWhlbHAKKwkgIEJGNTM4IFByb2Nlc3NvciBTdXBwb3J0LgorCitjb25maWcgQkY1MzkKKwlib29sICJCRjUzOSIKKwloZWxwCisJICBCRjUzOSBQcm9jZXNzb3IgU3VwcG9ydC4KKwogY29uZmlnIEJGNTQyCiAJYm9vbCAiQkY1NDIiCiAJaGVscApAQCAtMTY5LDI4ICsxOTYsNTUgQEAKIAogZW5kY2hvaWNlCiAKK2NvbmZpZyBTTVAKKwlkZXBlbmRzIG9uIEJGNTYxCisJYm9vbCAiU3ltbWV0cmljIG11bHRpLXByb2Nlc3Npbmcgc3VwcG9ydCIKKwktLS1oZWxwLS0tCisJICBUaGlzIGVuYWJsZXMgc3VwcG9ydCBmb3Igc3lzdGVtcyB3aXRoIG1vcmUgdGhhbiBvbmUgQ1BVLAorCSAgbGlrZSB0aGUgZHVhbCBjb3JlIEJGNTYxLiBJZiB5b3UgaGF2ZSBhIHN5c3RlbSB3aXRoIG9ubHkgb25lCisJICBDUFUsIHNheSBOLiBJZiB5b3UgaGF2ZSBhIHN5c3RlbSB3aXRoIG1vcmUgdGhhbiBvbmUgQ1BVLCBzYXkgWS4KKworCSAgSWYgeW91IGRvbid0IGtub3cgd2hhdCB0byBkbyBoZXJlLCBzYXkgTi4KKworY29uZmlnIE5SX0NQVVMKKwlpbnQKKwlkZXBlbmRzIG9uIFNNUAorCWRlZmF1bHQgMiBpZiBCRjU2MQorCitjb25maWcgSVJRX1BFUl9DUFUKKwlib29sCisJZGVwZW5kcyBvbiBTTVAKKwlkZWZhdWx0IHkKKworY29uZmlnIFRJQ0tfU09VUkNFX1NZU1RNUjAKKwlib29sCisJc2VsZWN0IEJGSU5fR1BUSU1FUlMKKwlkZXBlbmRzIG9uIFNNUAorCWRlZmF1bHQgeQorCiBjb25maWcgQkZfUkVWX01JTgogCWludAotCWRlZmF1bHQgMCBpZiAoQkY1MnggfHwgQkY1NHgpCisJZGVmYXVsdCAwIGlmIChCRjUxeCB8fCBCRjUyeCB8fCBCRjU0eCkKIAlkZWZhdWx0IDIgaWYgKEJGNTM3IHx8IEJGNTM2IHx8IEJGNTM0KQogCWRlZmF1bHQgMyBpZiAoQkY1NjEgfHxCRjUzMyB8fCBCRjUzMiB8fCBCRjUzMSkKKwlkZWZhdWx0IDQgaWYgKEJGNTM4IHx8IEJGNTM5KQogCiBjb25maWcgQkZfUkVWX01BWAogCWludAotCWRlZmF1bHQgMiBpZiAoQkY1MnggfHwgQkY1NHgpCisJZGVmYXVsdCAyIGlmIChCRjUxeCB8fCBCRjUyeCB8fCBCRjU0eCkKIAlkZWZhdWx0IDMgaWYgKEJGNTM3IHx8IEJGNTM2IHx8IEJGNTM0KQotCWRlZmF1bHQgNSBpZiAoQkY1NjEpCisJZGVmYXVsdCA1IGlmIChCRjU2MSB8fCBCRjUzOCB8fCBCRjUzOSkKIAlkZWZhdWx0IDYgaWYgKEJGNTMzIHx8IEJGNTMyIHx8IEJGNTMxKQogCiBjaG9pY2UKIAlwcm9tcHQgIlNpbGljb24gUmV2IgotCWRlZmF1bHQgQkZfUkVWXzBfMSBpZiAoQkY1MnggfHwgQkY1NHgpCisJZGVmYXVsdCBCRl9SRVZfMF8xIGlmIChCRjUxeCB8fCBCRjUyeCB8fCBCRjU0eCkKIAlkZWZhdWx0IEJGX1JFVl8wXzIgaWYgKEJGNTM0IHx8IEJGNTM2IHx8IEJGNTM3KQogCWRlZmF1bHQgQkZfUkVWXzBfMyBpZiAoQkY1MzEgfHwgQkY1MzIgfHwgQkY1MzMgfHwgQkY1NjEpCiAKIGNvbmZpZyBCRl9SRVZfMF8wCiAJYm9vbCAiMC4wIgotCWRlcGVuZHMgb24gKEJGNTJ4IHx8IEJGNTR4KQorCWRlcGVuZHMgb24gKEJGNTF4IHx8IEJGNTJ4IHx8IEJGNTR4KQogCiBjb25maWcgQkZfUkVWXzBfMQogCWJvb2wgIjAuMSIKQEAgLTIwNiwxMSArMjYwLDExIEBACiAKIGNvbmZpZyBCRl9SRVZfMF80CiAJYm9vbCAiMC40IgotCWRlcGVuZHMgb24gKEJGNTYxIHx8IEJGNTMzIHx8IEJGNTMyIHx8IEJGNTMxKQorCWRlcGVuZHMgb24gKEJGNTYxIHx8IEJGNTMzIHx8IEJGNTMyIHx8IEJGNTMxIHx8IEJGNTM4IHx8IEJGNTM5KQogCiBjb25maWcgQkZfUkVWXzBfNQogCWJvb2wgIjAuNSIKLQlkZXBlbmRzIG9uIChCRjU2MSB8fCBCRjUzMyB8fCBCRjUzMiB8fCBCRjUzMSkKKwlkZXBlbmRzIG9uIChCRjU2MSB8fCBCRjUzMyB8fCBCRjUzMiB8fCBCRjUzMSB8fCBCRjUzOCB8fCBCRjUzOSkKIAogY29uZmlnIEJGX1JFVl8wXzYKIAlib29sICIwLjYiCkBAIC0yMjQsNiArMjc4LDExIEBACiAKIGVuZGNob2ljZQogCitjb25maWcgQkY1MXgKKwlib29sCisJZGVwZW5kcyBvbiAoQkY1MTIgfHwgQkY1MTQgfHwgQkY1MTYgfHwgQkY1MTgpCisJZGVmYXVsdCB5CisKIGNvbmZpZyBCRjUyeAogCWJvb2wKIAlkZXBlbmRzIG9uIChCRjUyMiB8fCBCRjUyMyB8fCBCRjUyNCB8fCBCRjUyNSB8fCBCRjUyNiB8fCBCRjUyNykKQEAgLTI1OCw3ICszMTcsNyBAQAogCiBjb25maWcgTUVNX01UNDhMQzMyTThBMl83NQogCWJvb2wKLQlkZXBlbmRzIG9uIChCRklONTM3X1NUQU1QIHx8IFBOQVYxMCkKKwlkZXBlbmRzIG9uIChCRklONTM3X1NUQU1QIHx8IFBOQVYxMCB8fCBCRklONTM4X0VaS0lUKQogCWRlZmF1bHQgeQogCiBjb25maWcgTUVNX01UNDhMQzhNMzJCMkI1XzcKQEAgLTI3MSwxMCArMzMwLDE3IEBACiAJZGVwZW5kcyBvbiAoQkZJTjUyN19FWktJVCB8fCBCRklONTMyX0lQMFggfHwgQkxBQ0tTVEFNUCB8fCBCRklONTI2X0VaQlJEKQogCWRlZmF1bHQgeQogCitjb25maWcgTUVNX01UNDhMQzMyTThBMl83NQorCWJvb2wKKwlkZXBlbmRzIG9uIChCRklONTE4Rl9FWkJSRCkKKwlkZWZhdWx0IHkKKworc291cmNlICJhcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvS2NvbmZpZyIKIHNvdXJjZSAiYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L0tjb25maWciCiBzb3VyY2UgImFyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9LY29uZmlnIgogc291cmNlICJhcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvS2NvbmZpZyIKIHNvdXJjZSAiYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L0tjb25maWciCitzb3VyY2UgImFyY2gvYmxhY2tmaW4vbWFjaC1iZjUzOC9LY29uZmlnIgogc291cmNlICJhcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvS2NvbmZpZyIKIAogbWVudSAiQm9hcmQgY3VzdG9taXphdGlvbnMiCkBAIC0zMDcsNiArMzczLDcgQEAKIAogY29uZmlnIFJPTV9CQVNFCiAJaGV4ICJLZXJuZWwgUk9NIEJhc2UiCisJZGVwZW5kcyBvbiBST01LRVJORUwKIAlkZWZhdWx0ICIweDIwMDQwMDAwIgogCXJhbmdlIDB4MjAwMDAwMDAgMHgyMDQwMDAwMCBpZiAhKEJGNTR4IHx8IEJGNTYxKQogCXJhbmdlIDB4MjAwMDAwMDAgMHgzMDAwMDAwMCBpZiAoQkY1NHggfHwgQkY1NjEpCkBAIC0zMTgsNyArMzg1LDcgQEAKIAlpbnQgIkZyZXF1ZW5jeSBvZiB0aGUgY3J5c3RhbCBvbiB0aGUgYm9hcmQgaW4gSHoiCiAJZGVmYXVsdCAiMTEwNTkyMDAiIGlmIEJGSU41MzNfU1RBTVAKIAlkZWZhdWx0ICIyNzAwMDAwMCIgaWYgQkZJTjUzM19FWktJVAotCWRlZmF1bHQgIjI1MDAwMDAwIiBpZiAoQkZJTjUzN19TVEFNUCB8fCBCRklONTI3X0VaS0lUIHx8IEg4NjA2X0hWU0lTVEVNQVMgfHwgQkxBQ0tTVEFNUCB8fCBCRklONTI2X0VaQlJEKQorCWRlZmF1bHQgIjI1MDAwMDAwIiBpZiAoQkZJTjUzN19TVEFNUCB8fCBCRklONTI3X0VaS0lUIHx8IEg4NjA2X0hWU0lTVEVNQVMgfHwgQkxBQ0tTVEFNUCB8fCBCRklONTI2X0VaQlJEIHx8IEJGSU41MzhfRVpLSVQgfHwgQkZJTjUxOEYtRVpCUkQpCiAJZGVmYXVsdCAiMzAwMDAwMDAiIGlmIEJGSU41NjFfRVpLSVQKIAlkZWZhdWx0ICIyNDU3NjAwMCIgaWYgUE5BVjEwCiAJZGVmYXVsdCAiMTAwMDAwMDAiIGlmIEJGSU41MzJfSVAwWApAQCAtMzU0LDExICs0MjEsMTEgQEAKIAlyYW5nZSAxIDY0CiAJZGVmYXVsdCAiMjIiIGlmIEJGSU41MzNfRVpLSVQKIAlkZWZhdWx0ICI0NSIgaWYgQkZJTjUzM19TVEFNUAotCWRlZmF1bHQgIjIwIiBpZiAoQkZJTjUzN19TVEFNUCB8fCBCRklONTI3X0VaS0lUIHx8IEJGSU41NDhfRVpLSVQgfHwgQkZJTjU0OF9CTFVFVEVDSE5JWF9DTSkKKwlkZWZhdWx0ICIyMCIgaWYgKEJGSU41MzdfU1RBTVAgfHwgQkZJTjUyN19FWktJVCB8fCBCRklONTQ4X0VaS0lUIHx8IEJGSU41NDhfQkxVRVRFQ0hOSVhfQ00gfHwgQkZJTjUzOF9FWktJVCkKIAlkZWZhdWx0ICIyMiIgaWYgQkZJTjUzM19CTFVFVEVDSE5JWF9DTQogCWRlZmF1bHQgIjIwIiBpZiAoQkZJTjUzN19CTFVFVEVDSE5JWF9DTSB8fCBCRklONTI3X0JMVUVURUNITklYX0NNIHx8IEJGSU41NjFfQkxVRVRFQ0hOSVhfQ00pCiAJZGVmYXVsdCAiMjAiIGlmIEJGSU41NjFfRVpLSVQKLQlkZWZhdWx0ICIxNiIgaWYgKEg4NjA2X0hWU0lTVEVNQVMgfHwgQkxBQ0tTVEFNUCB8fCBCRklONTI2X0VaQlJEKQorCWRlZmF1bHQgIjE2IiBpZiAoSDg2MDZfSFZTSVNURU1BUyB8fCBCTEFDS1NUQU1QIHx8IEJGSU41MjZfRVpCUkQgfHwgQkZJTjUxOEZfRVpCUkQpCiAJaGVscAogCSAgVGhpcyBjb250cm9scyB0aGUgZnJlcXVlbmN5IG9mIHRoZSBvbi1jaGlwIFBMTC4gVGhpcyBjYW4gYmUgYmV0d2VlbiAxIGFuZCA2NC4KIAkgIFBMTCBGcmVxdWVuY3kgPSAoQ3J5c3RhbCBGcmVxdWVuY3kpICogKHRoaXMgc2V0dGluZykKQEAgLTQwNywxOSArNDc0LDcwIEBACiAJYm9vbCAiTVQ0NlYzMk0xNl81QiIKIGVuZGNob2ljZQogCi1jb25maWcgTUFYX01FTV9TSVpFCi0JaW50ICJNYXggU0RSQU0gTWVtb3J5IFNpemUgaW4gTUJ5dGVzIgotCWRlcGVuZHMgb24gIU1QVQotCWRlZmF1bHQgNTEyCitjaG9pY2UKKwlwcm9tcHQgIkREUi9TRFJBTSBUaW1pbmciCisJZGVwZW5kcyBvbiBCRklOX0tFUk5FTF9DTE9DSworCWRlZmF1bHQgQkZJTl9LRVJORUxfQ0xPQ0tfTUVNSU5JVF9DQUxDCiAJaGVscAotCSAgVGhpcyBpcyB0aGUgbWF4IG1lbW9yeSBzaXplIHRoYXQgdGhlIGtlcm5lbCB3aWxsIGNyZWF0ZSBDUExCCi0JICB0YWJsZXMgZm9yLiAgWW91ciBzeXN0ZW0gd2lsbCBub3QgYmUgYWJsZSB0byBoYW5kbGUgYW55IG1vcmUuCisJICBUaGlzIG9wdGlvbiBhbGxvd3MgeW91IHRvIHNwZWNpZnkgQmxhY2tmaW4gU0RSQU0vRERSIFRpbWluZyBwYXJhbWV0ZXJzCisJICBUaGUgY2FsY3VsYXRlZCBTRFJBTSB0aW1pbmcgcGFyYW1ldGVycyBtYXkgbm90IGJlIDEwMCUKKwkgIGFjY3VyYXRlIC0gVGhpcyBvcHRpb24gaXMgdGhlcmVmb3JlIG1hcmtlZCBleHBlcmltZW50YWwuCisKK2NvbmZpZyBCRklOX0tFUk5FTF9DTE9DS19NRU1JTklUX0NBTEMKKwlib29sICJDYWxjdWxhdGUgVGltaW5ncyAoRVhQRVJJTUVOVEFMKSIKKwlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTAorCitjb25maWcgQkZJTl9LRVJORUxfQ0xPQ0tfTUVNSU5JVF9TUEVDCisJYm9vbCAiUHJvdmlkZSBhY2N1cmF0ZSBUaW1pbmdzIGJhc2VkIG9uIHRhcmdldCBTQ0xLIgorCWhlbHAKKwkgIFBsZWFzZSBjb25zdWx0IHRoZSBCbGFja2ZpbiBIYXJkd2FyZSBSZWZlcmVuY2UgTWFudWFscyBhcyB3ZWxsCisJICBhcyB0aGUgbWVtb3J5IGRldmljZSBkYXRhc2hlZXQuCisJICBodHRwOi8vZG9jcy5ibGFja2Zpbi51Y2xpbnV4Lm9yZy9kb2t1LnBocD9pZD1iZmluOnNkcmFtCitlbmRjaG9pY2UKKworbWVudSAiTWVtb3J5IEluaXQgQ29udHJvbCIKKwlkZXBlbmRzIG9uIEJGSU5fS0VSTkVMX0NMT0NLX01FTUlOSVRfU1BFQworCitjb25maWcgTUVNX0REUkNUTDAKKwlkZXBlbmRzIG9uIEJGNTR4CisJaGV4ICJERFJDVEwwIgorCWRlZmF1bHQgMHgwCisKK2NvbmZpZyBNRU1fRERSQ1RMMQorCWRlcGVuZHMgb24gQkY1NHgKKwloZXggIkREUkNUTDEiCisJZGVmYXVsdCAweDAKKworY29uZmlnIE1FTV9ERFJDVEwyCisJZGVwZW5kcyBvbiBCRjU0eAorCWhleCAiRERSQ1RMMiIKKwlkZWZhdWx0IDB4MAorCitjb25maWcgTUVNX0VCSVVfRERSUVVFCisJZGVwZW5kcyBvbiBCRjU0eAorCWhleCAiRERSUVVFIgorCWRlZmF1bHQgMHgwCisKK2NvbmZpZyBNRU1fU0RSUkMKKwlkZXBlbmRzIG9uICFCRjU0eAorCWhleCAiU0RSUkMiCisJZGVmYXVsdCAweDAKKworY29uZmlnIE1FTV9TREdDVEwKKwlkZXBlbmRzIG9uICFCRjU0eAorCWhleCAiU0RHQ1RMIgorCWRlZmF1bHQgMHgwCitlbmRtZW51CiAKICMKICMgTWF4ICYgTWluIFNwZWVkcyBmb3IgdmFyaW91cyBDaGlwcwogIwogY29uZmlnIE1BWF9WQ09fSFoKIAlpbnQKKwlkZWZhdWx0IDQwMDAwMDAwMCBpZiBCRjUxMgorCWRlZmF1bHQgNDAwMDAwMDAwIGlmIEJGNTE0CisJZGVmYXVsdCA0MDAwMDAwMDAgaWYgQkY1MTYKKwlkZWZhdWx0IDQwMDAwMDAwMCBpZiBCRjUxOAogCWRlZmF1bHQgNjAwMDAwMDAwIGlmIEJGNTIyCiAJZGVmYXVsdCA0MDAwMDAwMDAgaWYgQkY1MjMKIAlkZWZhdWx0IDQwMDAwMDAwMCBpZiBCRjUyNApAQCAtNDU5LDYgKzU3Nyw3IEBACiAKIGNvbmZpZyBHRU5FUklDX1RJTUUKIAlib29sICJHZW5lcmljIHRpbWUiCisJZGVwZW5kcyBvbiAhU01QCiAJZGVmYXVsdCB5CiAKIGNvbmZpZyBHRU5FUklDX0NMT0NLRVZFTlRTCkBAIC01MzMsNiArNjUyLDcgQEAKIAogCiBtZW51ICJCbGFja2ZpbiBLZXJuZWwgT3B0aW1pemF0aW9ucyIKKwlkZXBlbmRzIG9uICFTTVAKIAogY29tbWVudCAiTWVtb3J5IE9wdGltaXphdGlvbnMiCiAKQEAgLTY1NSw2ICs3NzUsMTcgQEAKIAogCSAgQ3VycmVudGx5IG9ubHkgd29ya3Mgd2l0aCBGTEFUIGJpbmFyaWVzLgogCitjb25maWcgRVhDRVBUSU9OX0wxX1NDUkFUQ0gKKwlib29sICJMb2NhdGUgZXhjZXB0aW9uIHN0YWNrIGluIEwxIFNjcmF0Y2ggTWVtb3J5IgorCWRlZmF1bHQgbgorCWRlcGVuZHMgb24gIUFQUF9TVEFDS19MMSAmJiAhU1lTQ0FMTF9UQUJfTDEKKwloZWxwCisJICBXaGVuZXZlciBhbiBleGNlcHRpb24gb2NjdXJzLCB1c2UgdGhlIEwxIFNjcmF0Y2ggbWVtb3J5IGZvcgorCSAgc3RhY2sgc3RvcmFnZS4gIFlvdSBjYW5ub3QgcGxhY2UgdGhlIHN0YWNrcyBvZiBGTEFUIGJpbmFyaWVzCisJICBpbiBMMSB3aGVuIHVzaW5nIHRoaXMgb3B0aW9uLgorCisJICBJZiB5b3UgZG9uJ3QgdXNlIEwxIFNjcmF0Y2gsIHRoZW4geW91IHNob3VsZCBzYXkgWSBoZXJlLgorCiBjb21tZW50ICJTcGVlZCBPcHRpbWl6YXRpb25zIgogY29uZmlnIEJGSU5fSU5TX0xPV09WRVJIRUFECiAJYm9vbCAiaW5zW2J3bF0gbG93IG92ZXJoZWFkLCBoaWdoZXIgaW50ZXJydXB0IGxhdGVuY3kiCkBAIC02ODQsNyArODE1LDYgQEAKIAogZW5kbWVudQogCi0KIGNob2ljZQogCXByb21wdCAiS2VybmVsIGV4ZWN1dGVzIGZyb20iCiAJaGVscApAQCAtNzE0LDE3ICs4NDQsOSBAQAogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZQogCSAgd2lsbCBiZSBjYWxsZWQgZ3B0aW1lcnMua28uCiAKLWNvbmZpZyBCRklOX0RNQV81WFgKLQlib29sICJFbmFibGUgRE1BIFN1cHBvcnQiCi0JZGVwZW5kcyBvbiAoQkY1MnggfHwgQkY1M3ggfHwgQkY1NjEgfHwgQkY1NHgpCi0JZGVmYXVsdCB5Ci0JaGVscAotCSAgRE1BIGRyaXZlciBmb3IgQkY1eHguCi0KIGNob2ljZQotCXByb21wdCAiVW5jYWNoZWQgU0RSQU0gcmVnaW9uIgorCXByb21wdCAiVW5jYWNoZWQgRE1BIHJlZ2lvbiIKIAlkZWZhdWx0IERNQV9VTkNBQ0hFRF8xTQotCWRlcGVuZHMgb24gQkZJTl9ETUFfNVhYCiBjb25maWcgRE1BX1VOQ0FDSEVEXzRNCiAJYm9vbCAiRW5hYmxlIDRNIERNQSByZWdpb24iCiBjb25maWcgRE1BX1VOQ0FDSEVEXzJNCkBAIC03NTEsOSArODczLDExIEBACiBjaG9pY2UKIAlwcm9tcHQgIlBvbGljeSIKIAlkZXBlbmRzIG9uIEJGSU5fRENBQ0hFCi0JZGVmYXVsdCBCRklOX1dCCisJZGVmYXVsdCBCRklOX1dCIGlmICFTTVAKKwlkZWZhdWx0IEJGSU5fV1QgaWYgU01QCiBjb25maWcgQkZJTl9XQgogCWJvb2wgIldyaXRlIGJhY2siCisJZGVwZW5kcyBvbiAhU01QCiAJaGVscAogCSAgV3JpdGUgQmFjayBQb2xpY3k6CiAJICAgIENhY2hlZCBkYXRhIHdpbGwgYmUgd3JpdHRlbiBiYWNrIHRvIFNEUkFNIG9ubHkgd2hlbiBuZWVkZWQuCkBAIC03OTAsNyArOTE0LDcgQEAKIAogY29uZmlnIEJGSU5fTDJfQ0FDSEVBQkxFCiAJYm9vbCAiQ2FjaGUgTDIgU1JBTSIKLQlkZXBlbmRzIG9uIChCRklOX0RDQUNIRSB8fCBCRklOX0lDQUNIRSkgJiYgKEJGNTR4IHx8IEJGNTYxKQorCWRlcGVuZHMgb24gKEJGSU5fRENBQ0hFIHx8IEJGSU5fSUNBQ0hFKSAmJiAoQkY1NHggfHwgKEJGNTYxICYmICFTTVApKQogCWRlZmF1bHQgbgogCWhlbHAKIAkgIFNlbGVjdCB0byBtYWtlIEwyIFNSQU0gY2FjaGVhYmxlIGluIEwxIGRhdGEgYW5kIGluc3RydWN0aW9uIGNhY2hlLgpAQCAtOTgwLDcgKzExMDQsNyBAQAogCWludCAiR1BJTyBudW1iZXIiCiAJcmFuZ2UgMCA0NwogCWRlcGVuZHMgb24gUE1fV0FLRVVQX0JZX0dQSU8KLQlkZWZhdWx0IDIgaWYgQkZJTjUzN19TVEFNUAorCWRlZmF1bHQgMgogCiBjaG9pY2UKIAlwcm9tcHQgIkdQSU8gUG9sYXJpdHkiCkBAIC0xMDAzLDcgKzExMjcsNyBAQAogCiBjb25maWcgUE1fQkZJTl9XQUtFX1BINgogCWJvb2wgIkFsbG93IFdha2UtVXAgZnJvbSBvbi1jaGlwIFBIWSBvciBQSDYgR1AiCi0JZGVwZW5kcyBvbiBQTSAmJiAoQkY1MnggfHwgQkY1MzQgfHwgQkY1MzYgfHwgQkY1MzcpCisJZGVwZW5kcyBvbiBQTSAmJiAoQkY1MXggfHwgQkY1MnggfHwgQkY1MzQgfHwgQkY1MzYgfHwgQkY1MzcpCiAJZGVmYXVsdCBuCiAJaGVscAogCSAgRW5hYmxlIFBIWSBhbmQgUEg2IEdQIFdha2UtVXAgKFZvbHRhZ2UgUmVndWxhdG9yIFBvd2VyLVVwKQpAQCAtMTAyMCwxNSArMTE0NCwyMSBAQAogCiBzb3VyY2UgImRyaXZlcnMvY3B1ZnJlcS9LY29uZmlnIgogCitjb25maWcgQkZJTl9DUFVfRlJFUQorCWJvb2wKKwlkZXBlbmRzIG9uIENQVV9GUkVRCisJc2VsZWN0IENQVV9GUkVRX1RBQkxFCisJZGVmYXVsdCB5CisKIGNvbmZpZyBDUFVfVk9MVEFHRQogCWJvb2wgIkNQVSBWb2x0YWdlIHNjYWxpbmciCi0JZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwJCisJZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwKIAlkZXBlbmRzIG9uIENQVV9GUkVRCiAJZGVmYXVsdCBuCiAJaGVscAogCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCBDUFUgdm9sdGFnZSBzY2FsaW5nIGFjY29yZGluZyB0byB0aGUgQ1BVIGZyZXF1ZW5jeS4KIAkgIFRoaXMgb3B0aW9uIHZpb2xhdGVzIHRoZSBQTEwgQllQQVNTIHJlY29tbWVuZGF0aW9uIGluIHRoZSBCbGFja2ZpbiBQcm9jZXNzb3IKLQkgIG1hbnVhbHMuIFRoZXJlIGlzIGEgdGhlb3JldGljYWwgcmlzayB0aGF0IGR1cmluZyBWRERJTlQgdHJhbnNpdGlvbnMgCisJICBtYW51YWxzLiBUaGVyZSBpcyBhIHRoZW9yZXRpY2FsIHJpc2sgdGhhdCBkdXJpbmcgVkRESU5UIHRyYW5zaXRpb25zCiAJICB0aGUgUExMIG1heSB1bmxvY2suCiAKIGVuZG1lbnUKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vS2NvbmZpZy5kZWJ1ZyBiL2FyY2gvYmxhY2tmaW4vS2NvbmZpZy5kZWJ1ZwppbmRleCAzYWQyNTk4Li41Zjk4MWQ5IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL0tjb25maWcuZGVidWcKKysrIGIvYXJjaC9ibGFja2Zpbi9LY29uZmlnLmRlYnVnCkBAIC0yLDggKzIsMzAgQEAKIAogc291cmNlICJsaWIvS2NvbmZpZy5kZWJ1ZyIKIAorY29uZmlnIERFQlVHX1NUQUNLT1ZFUkZMT1cKKwlib29sICJDaGVjayBmb3Igc3RhY2sgb3ZlcmZsb3dzIgorCWRlcGVuZHMgb24gREVCVUdfS0VSTkVMCisJaGVscAorCSAgVGhpcyBvcHRpb24gd2lsbCBjYXVzZSBtZXNzYWdlcyB0byBiZSBwcmludGVkIGlmIGZyZWUgc3RhY2sgc3BhY2UKKwkgIGRyb3BzIGJlbG93IGEgY2VydGFpbiBsaW1pdC4KKworY29uZmlnIERFQlVHX1NUQUNLX1VTQUdFCisJYm9vbCAiRW5hYmxlIHN0YWNrIHV0aWxpemF0aW9uIGluc3RydW1lbnRhdGlvbiIKKwlkZXBlbmRzIG9uIERFQlVHX0tFUk5FTAorCWhlbHAKKwkgIEVuYWJsZXMgdGhlIGRpc3BsYXkgb2YgdGhlIG1pbmltdW0gYW1vdW50IG9mIGZyZWUgc3RhY2sgd2hpY2ggZWFjaAorCSAgdGFzayBoYXMgZXZlciBoYWQgYXZhaWxhYmxlIGluIHRoZSBzeXNycS1UIG91dHB1dC4KKworCSAgVGhpcyBvcHRpb24gd2lsbCBzbG93IGRvd24gcHJvY2VzcyBjcmVhdGlvbiBzb21ld2hhdC4KKwogY29uZmlnIEhBVkVfQVJDSF9LR0RCCi0gICAgICAgZGVmX2Jvb2wgeQorCWRlZl9ib29sIHkKKworY29uZmlnIEtHREJfVEVTVENBU0UKKwl0cmlzdGF0ZSAiS0dEQjogZm9yIHRlc3QgY2FzZSBpbiBleHBlY3QiCisJZGVmYXVsdCBuCisJaGVscAorCSAgVGhpcyBpcyBhIGtnZGIgdGVzdCBjYXNlIGZvciBhdXRvbWF0ZWQgdGVzdGluZy4KIAogY29uZmlnIERFQlVHX1ZFUkJPU0UKIAlib29sICJWZXJib3NlIGZhdWx0IG1lc3NhZ2VzIgpAQCAtMTgyLDExICsyMDQsMTEgQEAKIAkgIDQgZm9yICgyXjQpIDE2aywgb3IgNDA5NiBlbnRyaWVzCiAKIGNvbmZpZyBERUJVR19CRklOX05PX0tFUk5fSFdUUkFDRQotCWJvb2wgIlRyYWNlIHVzZXIgYXBwcyAodHVybiBvZmYgaHd0cmFjZSBpbiBrZXJuZWwpIgorCWJvb2wgIlR1cm4gb2ZmIGh3dHJhY2UgaW4gQ1BMQiBoYW5kbGVycyIKIAlkZXBlbmRzIG9uIERFQlVHX0JGSU5fSFdUUkFDRV9PTgotCWRlZmF1bHQgbgorCWRlZmF1bHQgeQogCWhlbHAKLQkgIFNvbWUgcGllY2VzIG9mIHRoZSBrZXJuZWwgY29udGFpbiBhIGxvdCBvZiBmbG93IGNoYW5nZXMgd2hpY2ggY2FuCisJICBUaGUgQ1BMQiBlcnJvciBoYW5kbGVyIGNvbnRhaW5zIGEgbG90IG9mIGZsb3cgY2hhbmdlcyB3aGljaCBjYW4KIAkgIHF1aWNrbHkgZmlsbCB1cCB0aGUgaGFyZHdhcmUgdHJhY2UgYnVmZmVyLiAgV2hlbiBkZWJ1Z2dpbmcgY3Jhc2hlcywKIAkgIHRoZSBoYXJkd2FyZSB0cmFjZSBtYXkgaW5kaWNhdGUgdGhhdCB0aGUgcHJvYmxlbSBsaWVzIGluIGtlcm5lbAogCSAgc3BhY2Ugd2hlbiBpbiByZWFsaXR5IGFuIGFwcGxpY2F0aW9uIGlzIGJ1Z2d5LgpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9NYWtlZmlsZSBiL2FyY2gvYmxhY2tmaW4vTWFrZWZpbGUKaW5kZXggNmJmNTA5Ny4uZTU1MGM4ZCAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9NYWtlZmlsZQorKysgYi9hcmNoL2JsYWNrZmluL01ha2VmaWxlCkBAIC0yMSw2ICsyMSwxMCBAQAogS0JVSUxEX0RFRkNPTkZJRyA6PSBCRjUzNy1TVEFNUF9kZWZjb25maWcKIAogIyBzZXR1cCB0aGUgbWFjaGluZSBuYW1lIGFuZCB0aGUgbWFjaGluZSBkZXBlbmRlbnQgc2V0dGluZ3MKK21hY2hpbmUtJChDT05GSUdfQkY1MTIpIDo9IGJmNTE4CittYWNoaW5lLSQoQ09ORklHX0JGNTE0KSA6PSBiZjUxOAorbWFjaGluZS0kKENPTkZJR19CRjUxNikgOj0gYmY1MTgKK21hY2hpbmUtJChDT05GSUdfQkY1MTgpIDo9IGJmNTE4CiBtYWNoaW5lLSQoQ09ORklHX0JGNTIyKSA6PSBiZjUyNwogbWFjaGluZS0kKENPTkZJR19CRjUyMykgOj0gYmY1MjcKIG1hY2hpbmUtJChDT05GSUdfQkY1MjQpIDo9IGJmNTI3CkBAIC0zMyw2ICszNyw4IEBACiBtYWNoaW5lLSQoQ09ORklHX0JGNTM0KSA6PSBiZjUzNwogbWFjaGluZS0kKENPTkZJR19CRjUzNikgOj0gYmY1MzcKIG1hY2hpbmUtJChDT05GSUdfQkY1MzcpIDo9IGJmNTM3CittYWNoaW5lLSQoQ09ORklHX0JGNTM4KSA6PSBiZjUzOAorbWFjaGluZS0kKENPTkZJR19CRjUzOSkgOj0gYmY1MzgKIG1hY2hpbmUtJChDT05GSUdfQkY1NDIpIDo9IGJmNTQ4CiBtYWNoaW5lLSQoQ09ORklHX0JGNTQ0KSA6PSBiZjU0OAogbWFjaGluZS0kKENPTkZJR19CRjU0NykgOj0gYmY1NDgKQEAgLTQyLDYgKzQ4LDEwIEBACiBNQUNISU5FIDo9ICQobWFjaGluZS15KQogZXhwb3J0IE1BQ0hJTkUKIAorY3B1LSQoQ09ORklHX0JGNTEyKSA6PSBiZjUxMgorY3B1LSQoQ09ORklHX0JGNTE0KSA6PSBiZjUxNAorY3B1LSQoQ09ORklHX0JGNTE2KSA6PSBiZjUxNgorY3B1LSQoQ09ORklHX0JGNTE4KSA6PSBiZjUxOAogY3B1LSQoQ09ORklHX0JGNTIyKSA6PSBiZjUyMgogY3B1LSQoQ09ORklHX0JGNTIzKSA6PSBiZjUyMwogY3B1LSQoQ09ORklHX0JGNTI0KSA6PSBiZjUyNApAQCAtNTQsNiArNjQsOCBAQAogY3B1LSQoQ09ORklHX0JGNTM0KSA6PSBiZjUzNAogY3B1LSQoQ09ORklHX0JGNTM2KSA6PSBiZjUzNgogY3B1LSQoQ09ORklHX0JGNTM3KSA6PSBiZjUzNworY3B1LSQoQ09ORklHX0JGNTM4KSA6PSBiZjUzOAorY3B1LSQoQ09ORklHX0JGNTM5KSA6PSBiZjUzOQogY3B1LSQoQ09ORklHX0JGNTQyKSA6PSBiZjU0MgogY3B1LSQoQ09ORklHX0JGNTQ0KSA6PSBiZjU0NAogY3B1LSQoQ09ORklHX0JGNTQ3KSA6PSBiZjU0NwpAQCAtNzksNyArOTEsNyBAQAogQ0hFQ0tGTEFHU19TSUxJQ09OID0gJChzaGVsbCBlY2hvICIiIHwgJChDUFApICQoS0JVSUxEX0NGTEFHUykgLWREIC0gMj4vZGV2L251bGwgfCBhd2sgJyQkMiA9PSAiX19TSUxJQ09OX1JFVklTSU9OX18iIHsgcHJpbnQgJCQzIH0nKQogQ0hFQ0tGTEFHUyArPSAtRF9fU0lMSUNPTl9SRVZJU0lPTl9fPSQoQ0hFQ0tGTEFHU19TSUxJQ09OKSAtRGwxX3RleHQ9X191c2VkX18KIAotaGVhZC15ICAgOj0gYXJjaC8kKEFSQ0gpL21hY2gtJChNQUNISU5FKS9oZWFkLm8gYXJjaC8kKEFSQ0gpL2tlcm5lbC9pbml0X3Rhc2subworaGVhZC15ICAgOj0gYXJjaC8kKEFSQ0gpL2tlcm5lbC9pbml0X3Rhc2subwogCiBjb3JlLXkgICArPSBhcmNoLyQoQVJDSCkva2VybmVsLyBhcmNoLyQoQVJDSCkvbW0vIGFyY2gvJChBUkNIKS9tYWNoLWNvbW1vbi8KIApAQCAtOTUsMTAgKzEwNywxMCBAQAogY29yZS15CSs9IGFyY2gvJChBUkNIKS9rZXJuZWwvY3BsYi1ub21wdS8KIGVuZGlmCiAKLWxpYnMteSAgICs9IGFyY2gvJChBUkNIKS9saWIvCi0KIGRyaXZlcnMtJChDT05GSUdfT1BST0ZJTEUpICs9IGFyY2gvJChBUkNIKS9vcHJvZmlsZS8KIAorbGlicy15ICAgKz0gYXJjaC8kKEFSQ0gpL2xpYi8KKwogbWFjaGRpcnMJOj0gJChwYXRzdWJzdCAlLGFyY2gvYmxhY2tmaW4vbWFjaC0lLywgJChtYWNoaW5lLXkpKQogCiBLQlVJTERfQ0ZMQUdTICs9IC1JYXJjaC8kKEFSQ0gpL2luY2x1ZGUvCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvQkY1MThGLUVaQlJEX2RlZmNvbmZpZyBiL2FyY2gvYmxhY2tmaW4vY29uZmlncy9CRjUxOEYtRVpCUkRfZGVmY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwYjNmMjQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvQkY1MThGLUVaQlJEX2RlZmNvbmZpZwpAQCAtMCwwICsxLDExOTEgQEAKKyMKKyMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4yOC1yYzIKKyMKKyMgQ09ORklHX01NVSBpcyBub3Qgc2V0CisjIENPTkZJR19GUFUgaXMgbm90IHNldAorQ09ORklHX1JXU0VNX0dFTkVSSUNfU1BJTkxPQ0s9eQorIyBDT05GSUdfUldTRU1fWENIR0FERF9BTEdPUklUSE0gaXMgbm90IHNldAorQ09ORklHX0JMQUNLRklOPXkKK0NPTkZJR19aT05FX0RNQT15CitDT05GSUdfR0VORVJJQ19GSU5EX05FWFRfQklUPXkKK0NPTkZJR19HRU5FUklDX0hXRUlHSFQ9eQorQ09ORklHX0dFTkVSSUNfSEFSRElSUVM9eQorQ09ORklHX0dFTkVSSUNfSVJRX1BST0JFPXkKK0NPTkZJR19HRU5FUklDX0dQSU89eQorQ09ORklHX0ZPUkNFX01BWF9aT05FT1JERVI9MTQKK0NPTkZJR19HRU5FUklDX0NBTElCUkFURV9ERUxBWT15CitDT05GSUdfREVGQ09ORklHX0xJU1Q9Ii9saWIvbW9kdWxlcy8kVU5BTUVfUkVMRUFTRS8uY29uZmlnIgorCisjCisjIEdlbmVyYWwgc2V0dXAKKyMKK0NPTkZJR19FWFBFUklNRU5UQUw9eQorQ09ORklHX0JST0tFTl9PTl9TTVA9eQorQ09ORklHX0lOSVRfRU5WX0FSR19MSU1JVD0zMgorQ09ORklHX0xPQ0FMVkVSU0lPTj0iIgorQ09ORklHX0xPQ0FMVkVSU0lPTl9BVVRPPXkKK0NPTkZJR19TWVNWSVBDPXkKK0NPTkZJR19TWVNWSVBDX1NZU0NUTD15CisjIENPTkZJR19QT1NJWF9NUVVFVUUgaXMgbm90IHNldAorIyBDT05GSUdfQlNEX1BST0NFU1NfQUNDVCBpcyBub3Qgc2V0CisjIENPTkZJR19UQVNLU1RBVFMgaXMgbm90IHNldAorIyBDT05GSUdfQVVESVQgaXMgbm90IHNldAorQ09ORklHX0lLQ09ORklHPXkKK0NPTkZJR19JS0NPTkZJR19QUk9DPXkKK0NPTkZJR19MT0dfQlVGX1NISUZUPTE0CisjIENPTkZJR19DR1JPVVBTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dST1VQX1NDSEVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU0ZTX0RFUFJFQ0FURURfVjIgaXMgbm90IHNldAorIyBDT05GSUdfUkVMQVkgaXMgbm90IHNldAorIyBDT05GSUdfTkFNRVNQQUNFUyBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9JTklUUkQ9eQorQ09ORklHX0lOSVRSQU1GU19TT1VSQ0U9IiIKKyMgQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFIGlzIG5vdCBzZXQKK0NPTkZJR19TWVNDVEw9eQorQ09ORklHX0VNQkVEREVEPXkKK0NPTkZJR19VSUQxNj15CitDT05GSUdfU1lTQ1RMX1NZU0NBTEw9eQorQ09ORklHX0tBTExTWU1TPXkKKyMgQ09ORklHX0tBTExTWU1TX0FMTCBpcyBub3Qgc2V0CisjIENPTkZJR19LQUxMU1lNU19FWFRSQV9QQVNTIGlzIG5vdCBzZXQKK0NPTkZJR19IT1RQTFVHPXkKK0NPTkZJR19QUklOVEs9eQorQ09ORklHX0JVRz15CisjIENPTkZJR19FTEZfQ09SRSBpcyBub3Qgc2V0CitDT05GSUdfQ09NUEFUX0JSSz15CitDT05GSUdfQkFTRV9GVUxMPXkKK0NPTkZJR19GVVRFWD15CitDT05GSUdfQU5PTl9JTk9ERVM9eQorQ09ORklHX0VQT0xMPXkKK0NPTkZJR19TSUdOQUxGRD15CitDT05GSUdfVElNRVJGRD15CitDT05GSUdfRVZFTlRGRD15CitDT05GSUdfQUlPPXkKK0NPTkZJR19WTV9FVkVOVF9DT1VOVEVSUz15CitDT05GSUdfU0xBQj15CisjIENPTkZJR19TTFVCIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NMT0IgaXMgbm90IHNldAorIyBDT05GSUdfUFJPRklMSU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BUktFUlMgaXMgbm90IHNldAorQ09ORklHX0hBVkVfT1BST0ZJTEU9eQorIyBDT05GSUdfSEFWRV9HRU5FUklDX0RNQV9DT0hFUkVOVCBpcyBub3Qgc2V0CitDT05GSUdfU0xBQklORk89eQorQ09ORklHX1JUX01VVEVYRVM9eQorQ09ORklHX1RJTllfU0hNRU09eQorQ09ORklHX0JBU0VfU01BTEw9MAorQ09ORklHX01PRFVMRVM9eQorIyBDT05GSUdfTU9EVUxFX0ZPUkNFX0xPQUQgaXMgbm90IHNldAorQ09ORklHX01PRFVMRV9VTkxPQUQ9eQorIyBDT05GSUdfTU9EVUxFX0ZPUkNFX1VOTE9BRCBpcyBub3Qgc2V0CisjIENPTkZJR19NT0RWRVJTSU9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19NT0RVTEVfU1JDVkVSU0lPTl9BTEwgaXMgbm90IHNldAorQ09ORklHX0tNT0Q9eQorQ09ORklHX0JMT0NLPXkKKyMgQ09ORklHX0xCRCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0lPX1RSQUNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xTRiBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0JTRyBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0lOVEVHUklUWSBpcyBub3Qgc2V0CisKKyMKKyMgSU8gU2NoZWR1bGVycworIworQ09ORklHX0lPU0NIRURfTk9PUD15CisjIENPTkZJR19JT1NDSEVEX0FTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lPU0NIRURfREVBRExJTkUgaXMgbm90IHNldAorIyBDT05GSUdfSU9TQ0hFRF9DRlEgaXMgbm90IHNldAorIyBDT05GSUdfREVGQVVMVF9BUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUZBVUxUX0RFQURMSU5FIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFRkFVTFRfQ0ZRIGlzIG5vdCBzZXQKK0NPTkZJR19ERUZBVUxUX05PT1A9eQorQ09ORklHX0RFRkFVTFRfSU9TQ0hFRD0ibm9vcCIKK0NPTkZJR19DTEFTU0lDX1JDVT15CisjIENPTkZJR19QUkVFTVBUX05PTkUgaXMgbm90IHNldAorQ09ORklHX1BSRUVNUFRfVk9MVU5UQVJZPXkKKyMgQ09ORklHX1BSRUVNUFQgaXMgbm90IHNldAorIyBDT05GSUdfRlJFRVpFUiBpcyBub3Qgc2V0CisKKyMKKyMgQmxhY2tmaW4gUHJvY2Vzc29yIE9wdGlvbnMKKyMKKworIworIyBQcm9jZXNzb3IgYW5kIEJvYXJkIFNldHRpbmdzCisjCisjIENPTkZJR19CRjUxMiBpcyBub3Qgc2V0CisjIENPTkZJR19CRjUxNCBpcyBub3Qgc2V0CisjIENPTkZJR19CRjUxNiBpcyBub3Qgc2V0CitDT05GSUdfQkY1MTg9eQorIyBDT05GSUdfQkY1MjIgaXMgbm90IHNldAorIyBDT05GSUdfQkY1MjMgaXMgbm90IHNldAorIyBDT05GSUdfQkY1MjQgaXMgbm90IHNldAorIyBDT05GSUdfQkY1MjUgaXMgbm90IHNldAorIyBDT05GSUdfQkY1MjYgaXMgbm90IHNldAorIyBDT05GSUdfQkY1MjcgaXMgbm90IHNldAorIyBDT05GSUdfQkY1MzEgaXMgbm90IHNldAorIyBDT05GSUdfQkY1MzIgaXMgbm90IHNldAorIyBDT05GSUdfQkY1MzMgaXMgbm90IHNldAorIyBDT05GSUdfQkY1MzQgaXMgbm90IHNldAorIyBDT05GSUdfQkY1MzYgaXMgbm90IHNldAorIyBDT05GSUdfQkY1MzcgaXMgbm90IHNldAorIyBDT05GSUdfQkY1MzggaXMgbm90IHNldAorIyBDT05GSUdfQkY1MzkgaXMgbm90IHNldAorIyBDT05GSUdfQkY1NDIgaXMgbm90IHNldAorIyBDT05GSUdfQkY1NDQgaXMgbm90IHNldAorIyBDT05GSUdfQkY1NDcgaXMgbm90IHNldAorIyBDT05GSUdfQkY1NDggaXMgbm90IHNldAorIyBDT05GSUdfQkY1NDkgaXMgbm90IHNldAorIyBDT05GSUdfQkY1NjEgaXMgbm90IHNldAorQ09ORklHX0JGX1JFVl9NSU49MAorQ09ORklHX0JGX1JFVl9NQVg9MgorQ09ORklHX0JGX1JFVl8wXzA9eQorIyBDT05GSUdfQkZfUkVWXzBfMSBpcyBub3Qgc2V0CisjIENPTkZJR19CRl9SRVZfMF8yIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGX1JFVl8wXzMgaXMgbm90IHNldAorIyBDT05GSUdfQkZfUkVWXzBfNCBpcyBub3Qgc2V0CisjIENPTkZJR19CRl9SRVZfMF81IGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGX1JFVl8wXzYgaXMgbm90IHNldAorIyBDT05GSUdfQkZfUkVWX0FOWSBpcyBub3Qgc2V0CisjIENPTkZJR19CRl9SRVZfTk9ORSBpcyBub3Qgc2V0CitDT05GSUdfQkY1MXg9eQorQ09ORklHX0JGSU41MThGX0VaQlJEPXkKKworIworIyBCRjUxOCBTcGVjaWZpYyBDb25maWd1cmF0aW9uCisjCisKKyMKKyMgQWx0ZXJuYXRpdmUgTXVsdGlwbGV4aW5nIFNjaGVtZQorIworIyBDT05GSUdfQkY1MThfU1BPUlQwX1BPUlRGIGlzIG5vdCBzZXQKK0NPTkZJR19CRjUxOF9TUE9SVDBfUE9SVEc9eQorQ09ORklHX0JGNTE4X1NQT1JUMF9UU0NMS19QRzEwPXkKKyMgQ09ORklHX0JGNTE4X1NQT1JUMF9UU0NMS19QRzE0IGlzIG5vdCBzZXQKK0NPTkZJR19CRjUxOF9VQVJUMV9QT1JURj15CisjIENPTkZJR19CRjUxOF9VQVJUMV9QT1JURyBpcyBub3Qgc2V0CisKKyMKKyMgSW50ZXJydXB0IFByaW9yaXR5IEFzc2lnbm1lbnQKKyMKKworIworIyBQcmlvcml0eQorIworQ09ORklHX0lSUV9QTExfV0FLRVVQPTcKK0NPTkZJR19JUlFfRE1BMF9FUlJPUj03CitDT05GSUdfSVJRX0RNQVIwX0JMSz03CitDT05GSUdfSVJRX0RNQVIxX0JMSz03CitDT05GSUdfSVJRX0RNQVIwX09WUj03CitDT05GSUdfSVJRX0RNQVIxX09WUj03CitDT05GSUdfSVJRX1BQSV9FUlJPUj03CitDT05GSUdfSVJRX01BQ19FUlJPUj03CitDT05GSUdfSVJRX1NQT1JUMF9FUlJPUj03CitDT05GSUdfSVJRX1NQT1JUMV9FUlJPUj03CitDT05GSUdfSVJRX1BUUF9FUlJPUj03CitDT05GSUdfSVJRX1VBUlQwX0VSUk9SPTcKK0NPTkZJR19JUlFfVUFSVDFfRVJST1I9NworQ09ORklHX0lSUV9SVEM9OAorQ09ORklHX0lSUV9QUEk9OAorQ09ORklHX0lSUV9TUE9SVDBfUlg9OQorQ09ORklHX0lSUV9TUE9SVDBfVFg9OQorQ09ORklHX0lSUV9TUE9SVDFfUlg9OQorQ09ORklHX0lSUV9TUE9SVDFfVFg9OQorQ09ORklHX0lSUV9UV0k9MTAKK0NPTkZJR19JUlFfU1BJMD0xMAorQ09ORklHX0lSUV9VQVJUMF9SWD0xMAorQ09ORklHX0lSUV9VQVJUMF9UWD0xMAorQ09ORklHX0lSUV9VQVJUMV9SWD0xMAorQ09ORklHX0lSUV9VQVJUMV9UWD0xMAorQ09ORklHX0lSUV9PUFRTRUM9MTEKK0NPTkZJR19JUlFfQ05UPTExCitDT05GSUdfSVJRX01BQ19SWD0xMQorQ09ORklHX0lSUV9QT1JUSF9JTlRBPTExCitDT05GSUdfSVJRX01BQ19UWD0xMQorQ09ORklHX0lSUV9QT1JUSF9JTlRCPTExCitDT05GSUdfSVJRX1RJTUVSMD0xMgorQ09ORklHX0lSUV9USU1FUjE9MTIKK0NPTkZJR19JUlFfVElNRVIyPTEyCitDT05GSUdfSVJRX1RJTUVSMz0xMgorQ09ORklHX0lSUV9USU1FUjQ9MTIKK0NPTkZJR19JUlFfVElNRVI1PTEyCitDT05GSUdfSVJRX1RJTUVSNj0xMgorQ09ORklHX0lSUV9USU1FUjc9MTIKK0NPTkZJR19JUlFfUE9SVEdfSU5UQT0xMgorQ09ORklHX0lSUV9QT1JUR19JTlRCPTEyCitDT05GSUdfSVJRX01FTV9ETUEwPTEzCitDT05GSUdfSVJRX01FTV9ETUExPTEzCitDT05GSUdfSVJRX1dBVENIPTEzCitDT05GSUdfSVJRX1BPUlRGX0lOVEE9MTMKK0NPTkZJR19JUlFfUE9SVEZfSU5UQj0xMworQ09ORklHX0lSUV9TUEkwX0VSUk9SPTcKK0NPTkZJR19JUlFfU1BJMV9FUlJPUj03CitDT05GSUdfSVJRX1JTSV9JTlQwPTcKK0NPTkZJR19JUlFfUlNJX0lOVDE9NworQ09ORklHX0lSUV9QV01fVFJJUD0xMAorQ09ORklHX0lSUV9QV01fU1lOQz0xMAorQ09ORklHX0lSUV9QVFBfU1RBVD0xMAorCisjCisjIEJvYXJkIGN1c3RvbWl6YXRpb25zCisjCisjIENPTkZJR19DTURMSU5FX0JPT0wgaXMgbm90IHNldAorQ09ORklHX0JPT1RfTE9BRD0weDEwMDAKKworIworIyBDbG9jay9QTEwgU2V0dXAKKyMKK0NPTkZJR19DTEtJTl9IWj0yNTAwMDAwMAorIyBDT05GSUdfQkZJTl9LRVJORUxfQ0xPQ0sgaXMgbm90IHNldAorQ09ORklHX01BWF9WQ09fSFo9NDAwMDAwMDAwCitDT05GSUdfTUlOX1ZDT19IWj01MDAwMDAwMAorQ09ORklHX01BWF9TQ0xLX0haPTEzMzMzMzMzMworQ09ORklHX01JTl9TQ0xLX0haPTI3MDAwMDAwCisKKyMKKyMgS2VybmVsIFRpbWVyL1NjaGVkdWxlcgorIworIyBDT05GSUdfSFpfMTAwIGlzIG5vdCBzZXQKK0NPTkZJR19IWl8yNTA9eQorIyBDT05GSUdfSFpfMzAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0haXzEwMDAgaXMgbm90IHNldAorQ09ORklHX0haPTI1MAorIyBDT05GSUdfU0NIRURfSFJUSUNLIGlzIG5vdCBzZXQKK0NPTkZJR19HRU5FUklDX1RJTUU9eQorQ09ORklHX0dFTkVSSUNfQ0xPQ0tFVkVOVFM9eQorIyBDT05GSUdfQ1lDTEVTX0NMT0NLU09VUkNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX05PX0haIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hJR0hfUkVTX1RJTUVSUyBpcyBub3Qgc2V0CitDT05GSUdfR0VORVJJQ19DTE9DS0VWRU5UU19CVUlMRD15CisKKyMKKyMgTWlzYworIworQ09ORklHX0JGSU5fU0NSQVRDSF9SRUdfUkVUTj15CisjIENPTkZJR19CRklOX1NDUkFUQ0hfUkVHX1JFVEUgaXMgbm90IHNldAorIyBDT05GSUdfQkZJTl9TQ1JBVENIX1JFR19DWUNMRVMgaXMgbm90IHNldAorCisjCisjIEJsYWNrZmluIEtlcm5lbCBPcHRpbWl6YXRpb25zCisjCisKKyMKKyMgTWVtb3J5IE9wdGltaXphdGlvbnMKKyMKK0NPTkZJR19JX0VOVFJZX0wxPXkKK0NPTkZJR19FWENQVF9JUlFfU1lTQ19MMT15CitDT05GSUdfRE9fSVJRX0wxPXkKK0NPTkZJR19DT1JFX1RJTUVSX0lSUV9MMT15CitDT05GSUdfSURMRV9MMT15CisjIENPTkZJR19TQ0hFRFVMRV9MMSBpcyBub3Qgc2V0CitDT05GSUdfQVJJVEhNRVRJQ19PUFNfTDE9eQorQ09ORklHX0FDQ0VTU19PS19MMT15CisjIENPTkZJR19NRU1TRVRfTDEgaXMgbm90IHNldAorIyBDT05GSUdfTUVNQ1BZX0wxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU19CRklOX1NQSU5MT0NLX0wxIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX0NIRUNLU1VNX0wxIGlzIG5vdCBzZXQKK0NPTkZJR19DQUNIRUxJTkVfQUxJR05FRF9MMT15CisjIENPTkZJR19TWVNDQUxMX1RBQl9MMSBpcyBub3Qgc2V0CisjIENPTkZJR19DUExCX1NXSVRDSF9UQUJfTDEgaXMgbm90IHNldAorQ09ORklHX0FQUF9TVEFDS19MMT15CisKKyMKKyMgU3BlZWQgT3B0aW1pemF0aW9ucworIworQ09ORklHX0JGSU5fSU5TX0xPV09WRVJIRUFEPXkKK0NPTkZJR19SQU1LRVJORUw9eQorIyBDT05GSUdfUk9NS0VSTkVMIGlzIG5vdCBzZXQKK0NPTkZJR19TRUxFQ1RfTUVNT1JZX01PREVMPXkKK0NPTkZJR19GTEFUTUVNX01BTlVBTD15CisjIENPTkZJR19ESVNDT05USUdNRU1fTUFOVUFMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NQQVJTRU1FTV9NQU5VQUwgaXMgbm90IHNldAorQ09ORklHX0ZMQVRNRU09eQorQ09ORklHX0ZMQVRfTk9ERV9NRU1fTUFQPXkKK0NPTkZJR19QQUdFRkxBR1NfRVhURU5ERUQ9eQorQ09ORklHX1NQTElUX1BUTE9DS19DUFVTPTQKKyMgQ09ORklHX1JFU09VUkNFU182NEJJVCBpcyBub3Qgc2V0CisjIENPTkZJR19QSFlTX0FERFJfVF82NEJJVCBpcyBub3Qgc2V0CitDT05GSUdfWk9ORV9ETUFfRkxBRz0xCitDT05GSUdfVklSVF9UT19CVVM9eQorQ09ORklHX0JGSU5fR1BUSU1FUlM9eQorIyBDT05GSUdfRE1BX1VOQ0FDSEVEXzRNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RNQV9VTkNBQ0hFRF8yTSBpcyBub3Qgc2V0CitDT05GSUdfRE1BX1VOQ0FDSEVEXzFNPXkKKyMgQ09ORklHX0RNQV9VTkNBQ0hFRF9OT05FIGlzIG5vdCBzZXQKKworIworIyBDYWNoZSBTdXBwb3J0CisjCitDT05GSUdfQkZJTl9JQ0FDSEU9eQorQ09ORklHX0JGSU5fRENBQ0hFPXkKKyMgQ09ORklHX0JGSU5fRENBQ0hFX0JBTktBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGSU5fSUNBQ0hFX0xPQ0sgaXMgbm90IHNldAorQ09ORklHX0JGSU5fV0I9eQorIyBDT05GSUdfQkZJTl9XVCBpcyBub3Qgc2V0CisjIENPTkZJR19NUFUgaXMgbm90IHNldAorCisjCisjIEFzeW5jaG9ub3VzIE1lbW9yeSBDb25maWd1cmF0aW9uCisjCisKKyMKKyMgRUJJVV9BTUdDVEwgR2xvYmFsIENvbnRyb2wKKyMKK0NPTkZJR19DX0FNQ0tFTj15CitDT05GSUdfQ19DRFBSSU89eQorIyBDT05GSUdfQ19BTUJFTiBpcyBub3Qgc2V0CisjIENPTkZJR19DX0FNQkVOX0IwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NfQU1CRU5fQjBfQjEgaXMgbm90IHNldAorIyBDT05GSUdfQ19BTUJFTl9CMF9CMV9CMiBpcyBub3Qgc2V0CitDT05GSUdfQ19BTUJFTl9BTEw9eQorCisjCisjIEVCSVVfQU1CQ1RMIENvbnRyb2wKKyMKK0NPTkZJR19CQU5LXzA9MHg3QkIwCitDT05GSUdfQkFOS18xPTB4NTU1NAorQ09ORklHX0JBTktfMj0weDdCQjAKK0NPTkZJR19CQU5LXzM9MHhGRkMwCisKKyMKKyMgQnVzIG9wdGlvbnMgKFBDSSwgUENNQ0lBLCBFSVNBLCBNQ0EsIElTQSkKKyMKKyMgQ09ORklHX0FSQ0hfU1VQUE9SVFNfTVNJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BDQ0FSRCBpcyBub3Qgc2V0CisKKyMKKyMgRXhlY3V0YWJsZSBmaWxlIGZvcm1hdHMKKyMKK0NPTkZJR19CSU5GTVRfRUxGX0ZEUElDPXkKK0NPTkZJR19CSU5GTVRfRkxBVD15CitDT05GSUdfQklORk1UX1pGTEFUPXkKKyMgQ09ORklHX0JJTkZNVF9TSEFSRURfRkxBVCBpcyBub3Qgc2V0CisjIENPTkZJR19IQVZFX0FPVVQgaXMgbm90IHNldAorIyBDT05GSUdfQklORk1UX01JU0MgaXMgbm90IHNldAorCisjCisjIFBvd2VyIG1hbmFnZW1lbnQgb3B0aW9ucworIworIyBDT05GSUdfUE0gaXMgbm90IHNldAorQ09ORklHX0FSQ0hfU1VTUEVORF9QT1NTSUJMRT15CisjIENPTkZJR19QTV9XQUtFVVBfQllfR1BJTyBpcyBub3Qgc2V0CisKKyMKKyMgQ1BVIEZyZXF1ZW5jeSBzY2FsaW5nCisjCisjIENPTkZJR19DUFVfRlJFUSBpcyBub3Qgc2V0CitDT05GSUdfTkVUPXkKKworIworIyBOZXR3b3JraW5nIG9wdGlvbnMKKyMKK0NPTkZJR19QQUNLRVQ9eQorIyBDT05GSUdfUEFDS0VUX01NQVAgaXMgbm90IHNldAorQ09ORklHX1VOSVg9eQorQ09ORklHX1hGUk09eQorIyBDT05GSUdfWEZSTV9VU0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1hGUk1fU1VCX1BPTElDWSBpcyBub3Qgc2V0CisjIENPTkZJR19YRlJNX01JR1JBVEUgaXMgbm90IHNldAorIyBDT05GSUdfWEZSTV9TVEFUSVNUSUNTIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9LRVkgaXMgbm90IHNldAorQ09ORklHX0lORVQ9eQorIyBDT05GSUdfSVBfTVVMVElDQVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX0FEVkFOQ0VEX1JPVVRFUiBpcyBub3Qgc2V0CitDT05GSUdfSVBfRklCX0hBU0g9eQorQ09ORklHX0lQX1BOUD15CisjIENPTkZJR19JUF9QTlBfREhDUCBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9QTlBfQk9PVFAgaXMgbm90IHNldAorIyBDT05GSUdfSVBfUE5QX1JBUlAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0lQSVAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0lQR1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSUEQgaXMgbm90IHNldAorQ09ORklHX1NZTl9DT09LSUVTPXkKKyMgQ09ORklHX0lORVRfQUggaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9FU1AgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9JUENPTVAgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9YRlJNX1RVTk5FTCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX1RVTk5FTCBpcyBub3Qgc2V0CitDT05GSUdfSU5FVF9YRlJNX01PREVfVFJBTlNQT1JUPXkKK0NPTkZJR19JTkVUX1hGUk1fTU9ERV9UVU5ORUw9eQorQ09ORklHX0lORVRfWEZSTV9NT0RFX0JFRVQ9eQorIyBDT05GSUdfSU5FVF9MUk8gaXMgbm90IHNldAorQ09ORklHX0lORVRfRElBRz15CitDT05GSUdfSU5FVF9UQ1BfRElBRz15CisjIENPTkZJR19UQ1BfQ09OR19BRFZBTkNFRCBpcyBub3Qgc2V0CitDT05GSUdfVENQX0NPTkdfQ1VCSUM9eQorQ09ORklHX0RFRkFVTFRfVENQX0NPTkc9ImN1YmljIgorIyBDT05GSUdfVENQX01ENVNJRyBpcyBub3Qgc2V0CisjIENPTkZJR19JUFY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVExBQkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVFdPUktfU0VDTUFSSyBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRGSUxURVIgaXMgbm90IHNldAorIyBDT05GSUdfSVBfRENDUCBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9TQ1RQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RJUEMgaXMgbm90IHNldAorIyBDT05GSUdfQVRNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JSSURHRSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfRFNBIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZMQU5fODAyMVEgaXMgbm90IHNldAorIyBDT05GSUdfREVDTkVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xMQzIgaXMgbm90IHNldAorIyBDT05GSUdfSVBYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQUxLIGlzIG5vdCBzZXQKKyMgQ09ORklHX1gyNSBpcyBub3Qgc2V0CisjIENPTkZJR19MQVBCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VDT05FVCBpcyBub3Qgc2V0CisjIENPTkZJR19XQU5fUk9VVEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9TQ0hFRCBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29yayB0ZXN0aW5nCisjCisjIENPTkZJR19ORVRfUEtUR0VOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBTVJBRElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NBTiBpcyBub3Qgc2V0CisjIENPTkZJR19JUkRBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGX1JYUlBDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BIT05FVCBpcyBub3Qgc2V0CitDT05GSUdfV0lSRUxFU1M9eQorIyBDT05GSUdfQ0ZHODAyMTEgaXMgbm90IHNldAorQ09ORklHX1dJUkVMRVNTX09MRF9SRUdVTEFUT1JZPXkKKyMgQ09ORklHX1dJUkVMRVNTX0VYVCBpcyBub3Qgc2V0CisjIENPTkZJR19NQUM4MDIxMSBpcyBub3Qgc2V0CisjIENPTkZJR19JRUVFODAyMTEgaXMgbm90IHNldAorIyBDT05GSUdfUkZLSUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF85UCBpcyBub3Qgc2V0CisKKyMKKyMgRGV2aWNlIERyaXZlcnMKKyMKKworIworIyBHZW5lcmljIERyaXZlciBPcHRpb25zCisjCitDT05GSUdfVUVWRU5UX0hFTFBFUl9QQVRIPSIvc2Jpbi9ob3RwbHVnIgorQ09ORklHX1NUQU5EQUxPTkU9eQorQ09ORklHX1BSRVZFTlRfRklSTVdBUkVfQlVJTEQ9eQorIyBDT05GSUdfRldfTE9BREVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0RSSVZFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19ERVZSRVMgaXMgbm90IHNldAorIyBDT05GSUdfU1lTX0hZUEVSVklTT1IgaXMgbm90IHNldAorIyBDT05GSUdfQ09OTkVDVE9SIGlzIG5vdCBzZXQKK0NPTkZJR19NVEQ9eQorIyBDT05GSUdfTVREX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DT05DQVQgaXMgbm90IHNldAorQ09ORklHX01URF9QQVJUSVRJT05TPXkKKyMgQ09ORklHX01URF9SRURCT09UX1BBUlRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DTURMSU5FX1BBUlRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9BUjdfUEFSVFMgaXMgbm90IHNldAorCisjCisjIFVzZXIgTW9kdWxlcyBBbmQgVHJhbnNsYXRpb24gTGF5ZXJzCisjCitDT05GSUdfTVREX0NIQVI9eQorQ09ORklHX01URF9CTEtERVZTPXkKK0NPTkZJR19NVERfQkxPQ0s9eQorIyBDT05GSUdfRlRMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05GVEwgaXMgbm90IHNldAorIyBDT05GSUdfSU5GVEwgaXMgbm90IHNldAorIyBDT05GSUdfUkZEX0ZUTCBpcyBub3Qgc2V0CisjIENPTkZJR19TU0ZEQyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfT09QUyBpcyBub3Qgc2V0CisKKyMKKyMgUkFNL1JPTS9GbGFzaCBjaGlwIGRyaXZlcnMKKyMKKyMgQ09ORklHX01URF9DRkkgaXMgbm90IHNldAorQ09ORklHX01URF9KRURFQ1BST0JFPW0KK0NPTkZJR19NVERfR0VOX1BST0JFPW0KKyMgQ09ORklHX01URF9DRklfQURWX09QVElPTlMgaXMgbm90IHNldAorQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8xPXkKK0NPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMj15CitDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzQ9eQorIyBDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzggaXMgbm90IHNldAorIyBDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzE2IGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8zMiBpcyBub3Qgc2V0CitDT05GSUdfTVREX0NGSV9JMT15CitDT05GSUdfTVREX0NGSV9JMj15CisjIENPTkZJR19NVERfQ0ZJX0k0IGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DRklfSTggaXMgbm90IHNldAorIyBDT05GSUdfTVREX0NGSV9JTlRFTEVYVCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ0ZJX0FNRFNURCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ0ZJX1NUQUEgaXMgbm90IHNldAorQ09ORklHX01URF9SQU09eQorQ09ORklHX01URF9ST009bQorIyBDT05GSUdfTVREX0FCU0VOVCBpcyBub3Qgc2V0CisKKyMKKyMgTWFwcGluZyBkcml2ZXJzIGZvciBjaGlwIGFjY2VzcworIworQ09ORklHX01URF9DT01QTEVYX01BUFBJTkdTPXkKKyMgQ09ORklHX01URF9QSFlTTUFQIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9HUElPX0FERFIgaXMgbm90IHNldAorIyBDT05GSUdfTVREX1VDTElOVVggaXMgbm90IHNldAorIyBDT05GSUdfTVREX1BMQVRSQU0gaXMgbm90IHNldAorCisjCisjIFNlbGYtY29udGFpbmVkIE1URCBkZXZpY2UgZHJpdmVycworIworIyBDT05GSUdfTVREX1NMUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9QSFJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTVREUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9CTE9DSzJNVEQgaXMgbm90IHNldAorCisjCisjIERpc2stT24tQ2hpcCBEZXZpY2UgRHJpdmVycworIworIyBDT05GSUdfTVREX0RPQzIwMDAgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0RPQzIwMDEgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0RPQzIwMDFQTFVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9OQU5EIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9PTkVOQU5EIGlzIG5vdCBzZXQKKworIworIyBVQkkgLSBVbnNvcnRlZCBibG9jayBpbWFnZXMKKyMKKyMgQ09ORklHX01URF9VQkkgaXMgbm90IHNldAorIyBDT05GSUdfUEFSUE9SVCBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVj15CisjIENPTkZJR19CTEtfREVWX0NPV19DT01NT04gaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9MT09QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfTkJEIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX1JBTT15CitDT05GSUdfQkxLX0RFVl9SQU1fQ09VTlQ9MTYKK0NPTkZJR19CTEtfREVWX1JBTV9TSVpFPTQwOTYKKyMgQ09ORklHX0JMS19ERVZfWElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NEUk9NX1BLVENEVkQgaXMgbm90IHNldAorIyBDT05GSUdfQVRBX09WRVJfRVRIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSEQgaXMgbm90IHNldAorQ09ORklHX01JU0NfREVWSUNFUz15CisjIENPTkZJR19FRVBST01fOTNDWDYgaXMgbm90IHNldAorIyBDT05GSUdfRU5DTE9TVVJFX1NFUlZJQ0VTIGlzIG5vdCBzZXQKK0NPTkZJR19IQVZFX0lERT15CisjIENPTkZJR19JREUgaXMgbm90IHNldAorCisjCisjIFNDU0kgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX1JBSURfQVRUUlMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSSBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0RNQSBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX05FVExJTksgaXMgbm90IHNldAorIyBDT05GSUdfQVRBIGlzIG5vdCBzZXQKKyMgQ09ORklHX01EIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRERVZJQ0VTPXkKKyMgQ09ORklHX0RVTU1ZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JPTkRJTkcgaXMgbm90IHNldAorIyBDT05GSUdfTUFDVkxBTiBpcyBub3Qgc2V0CisjIENPTkZJR19FUVVBTElaRVIgaXMgbm90IHNldAorIyBDT05GSUdfVFVOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZFVEggaXMgbm90IHNldAorQ09ORklHX1BIWUxJQj15CisKKyMKKyMgTUlJIFBIWSBkZXZpY2UgZHJpdmVycworIworIyBDT05GSUdfTUFSVkVMTF9QSFkgaXMgbm90IHNldAorIyBDT05GSUdfREFWSUNPTV9QSFkgaXMgbm90IHNldAorIyBDT05GSUdfUVNFTUlfUEhZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xYVF9QSFkgaXMgbm90IHNldAorIyBDT05GSUdfQ0lDQURBX1BIWSBpcyBub3Qgc2V0CisjIENPTkZJR19WSVRFU1NFX1BIWSBpcyBub3Qgc2V0CisjIENPTkZJR19TTVNDX1BIWSBpcyBub3Qgc2V0CisjIENPTkZJR19CUk9BRENPTV9QSFkgaXMgbm90IHNldAorIyBDT05GSUdfSUNQTFVTX1BIWSBpcyBub3Qgc2V0CisjIENPTkZJR19SRUFMVEVLX1BIWSBpcyBub3Qgc2V0CisjIENPTkZJR19GSVhFRF9QSFkgaXMgbm90IHNldAorIyBDT05GSUdfTURJT19CSVRCQU5HIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRfRVRIRVJORVQ9eQorQ09ORklHX01JST15CisjIENPTkZJR19CRklOX01BQyBpcyBub3Qgc2V0CisjIENPTkZJR19TTUM5MVggaXMgbm90IHNldAorIyBDT05GSUdfU01TQzkxMVggaXMgbm90IHNldAorIyBDT05GSUdfRE05MDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lCTV9ORVdfRU1BQ19aTUlJIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lCTV9ORVdfRU1BQ19SR01JSSBpcyBub3Qgc2V0CisjIENPTkZJR19JQk1fTkVXX0VNQUNfVEFIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lCTV9ORVdfRU1BQ19FTUFDNCBpcyBub3Qgc2V0CisjIENPTkZJR19JQk1fTkVXX0VNQUNfTk9fRkxPV19DVFJMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lCTV9ORVdfRU1BQ19NQUxfQ0xSX0lDSU5UU1RBVCBpcyBub3Qgc2V0CisjIENPTkZJR19JQk1fTkVXX0VNQUNfTUFMX0NPTU1PTl9FUlIgaXMgbm90IHNldAorIyBDT05GSUdfTkVUREVWXzEwMDAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUREVWXzEwMDAwIGlzIG5vdCBzZXQKKworIworIyBXaXJlbGVzcyBMQU4KKyMKKyMgQ09ORklHX1dMQU5fUFJFODAyMTEgaXMgbm90IHNldAorIyBDT05GSUdfV0xBTl84MDIxMSBpcyBub3Qgc2V0CisjIENPTkZJR19JV0xXSUZJX0xFRFMgaXMgbm90IHNldAorIyBDT05GSUdfV0FOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQUCBpcyBub3Qgc2V0CisjIENPTkZJR19TTElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVENPTlNPTEUgaXMgbm90IHNldAorIyBDT05GSUdfTkVUUE9MTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lTRE4gaXMgbm90IHNldAorIyBDT05GSUdfUEhPTkUgaXMgbm90IHNldAorCisjCisjIElucHV0IGRldmljZSBzdXBwb3J0CisjCitDT05GSUdfSU5QVVQ9eQorIyBDT05GSUdfSU5QVVRfRkZfTUVNTEVTUyBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9QT0xMREVWIGlzIG5vdCBzZXQKKworIworIyBVc2VybGFuZCBpbnRlcmZhY2VzCisjCisjIENPTkZJR19JTlBVVF9NT1VTRURFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9KT1lERVYgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfRVZERVYgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfRVZCVUcgaXMgbm90IHNldAorCisjCisjIElucHV0IERldmljZSBEcml2ZXJzCisjCisjIENPTkZJR19JTlBVVF9LRVlCT0FSRCBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9NT1VTRSBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9KT1lTVElDSyBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9UQUJMRVQgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfVE9VQ0hTQ1JFRU4gaXMgbm90IHNldAorQ09ORklHX0lOUFVUX01JU0M9eQorIyBDT05GSUdfSU5QVVRfVUlOUFVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NPTkZJR19JTlBVVF9QQ0Y4NTc0IGlzIG5vdCBzZXQKKworIworIyBIYXJkd2FyZSBJL08gcG9ydHMKKyMKKyMgQ09ORklHX1NFUklPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dBTUVQT1JUIGlzIG5vdCBzZXQKKworIworIyBDaGFyYWN0ZXIgZGV2aWNlcworIworIyBDT05GSUdfQUQ5OTYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NQSV9BRENfQkY1MzMgaXMgbm90IHNldAorIyBDT05GSUdfQkY1eHhfUFBJRkNEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGSU5fU0lNUExFX1RJTUVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGNXh4X1BQSSBpcyBub3Qgc2V0CisjIENPTkZJR19CRklOX1NQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGSU5fVElNRVJfTEFURU5DWSBpcyBub3Qgc2V0CisjIENPTkZJR19UV0lfTENEIGlzIG5vdCBzZXQKK0NPTkZJR19CRklOX0RNQV9JTlRFUkZBQ0U9bQorQ09ORklHX1NJTVBMRV9HUElPPW0KK0NPTkZJR19WVD15CitDT05GSUdfQ09OU09MRV9UUkFOU0xBVElPTlM9eQorQ09ORklHX1ZUX0NPTlNPTEU9eQorQ09ORklHX0hXX0NPTlNPTEU9eQorIyBDT05GSUdfVlRfSFdfQ09OU09MRV9CSU5ESU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFVktNRU0gaXMgbm90IHNldAorIyBDT05GSUdfQkZJTl9KVEFHX0NPTU0gaXMgbm90IHNldAorIyBDT05GSUdfU0VSSUFMX05PTlNUQU5EQVJEIGlzIG5vdCBzZXQKKworIworIyBTZXJpYWwgZHJpdmVycworIworIyBDT05GSUdfU0VSSUFMXzgyNTAgaXMgbm90IHNldAorCisjCisjIE5vbi04MjUwIHNlcmlhbCBwb3J0IHN1cHBvcnQKKyMKK0NPTkZJR19TRVJJQUxfQkZJTj15CitDT05GSUdfU0VSSUFMX0JGSU5fQ09OU09MRT15CitDT05GSUdfU0VSSUFMX0JGSU5fRE1BPXkKKyMgQ09ORklHX1NFUklBTF9CRklOX1BJTyBpcyBub3Qgc2V0CitDT05GSUdfU0VSSUFMX0JGSU5fVUFSVDA9eQorIyBDT05GSUdfQkZJTl9VQVJUMF9DVFNSVFMgaXMgbm90IHNldAorIyBDT05GSUdfU0VSSUFMX0JGSU5fVUFSVDEgaXMgbm90IHNldAorQ09ORklHX1NFUklBTF9DT1JFPXkKK0NPTkZJR19TRVJJQUxfQ09SRV9DT05TT0xFPXkKKyMgQ09ORklHX1NFUklBTF9CRklOX1NQT1JUIGlzIG5vdCBzZXQKK0NPTkZJR19VTklYOThfUFRZUz15CisjIENPTkZJR19MRUdBQ1lfUFRZUyBpcyBub3Qgc2V0CisKKyMKKyMgQ0FOLCB0aGUgY2FyIGJ1cyBhbmQgaW5kdXN0cmlhbCBmaWVsZGJ1cworIworIyBDT05GSUdfQ0FONExJTlVYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQTUlfSEFORExFUiBpcyBub3Qgc2V0CisjIENPTkZJR19IV19SQU5ET00gaXMgbm90IHNldAorIyBDT05GSUdfUjM5NjQgaXMgbm90IHNldAorIyBDT05GSUdfUkFXX0RSSVZFUiBpcyBub3Qgc2V0CisjIENPTkZJR19UQ0dfVFBNIGlzIG5vdCBzZXQKK0NPTkZJR19JMkM9eQorQ09ORklHX0kyQ19CT0FSRElORk89eQorQ09ORklHX0kyQ19DSEFSREVWPXkKK0NPTkZJR19JMkNfSEVMUEVSX0FVVE89eQorCisjCisjIEkyQyBIYXJkd2FyZSBCdXMgc3VwcG9ydAorIworCisjCisjIEkyQyBzeXN0ZW0gYnVzIGRyaXZlcnMgKG1vc3RseSBlbWJlZGRlZCAvIHN5c3RlbS1vbi1jaGlwKQorIworQ09ORklHX0kyQ19CTEFDS0ZJTl9UV0k9eQorQ09ORklHX0kyQ19CTEFDS0ZJTl9UV0lfQ0xLX0tIWj0xMDAKKyMgQ09ORklHX0kyQ19HUElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19PQ09SRVMgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1NJTVRFQyBpcyBub3Qgc2V0CisKKyMKKyMgRXh0ZXJuYWwgSTJDL1NNQnVzIGFkYXB0ZXIgZHJpdmVycworIworIyBDT05GSUdfSTJDX1BBUlBPUlRfTElHSFQgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1RBT1NfRVZNIGlzIG5vdCBzZXQKKworIworIyBPdGhlciBJMkMvU01CdXMgYnVzIGRyaXZlcnMKKyMKKyMgQ09ORklHX0kyQ19QQ0FfUExBVEZPUk0gaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1NUVUIgaXMgbm90IHNldAorCisjCisjIE1pc2NlbGxhbmVvdXMgSTJDIENoaXAgc3VwcG9ydAorIworIyBDT05GSUdfRFMxNjgyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUMjQgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRDUyNTIgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19FRVBST00gaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19QQ0Y4NTc0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1BDRjg1NzUgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19QQ0E5NTM5IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfUENGODU5MSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX01BWDY4NzUgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19UU0wyNTUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19ERUJVR19DT1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19ERUJVR19BTEdPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19ERUJVR19CVVMgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0NISVAgaXMgbm90IHNldAorIyBDT05GSUdfU1BJIGlzIG5vdCBzZXQKK0NPTkZJR19BUkNIX1dBTlRfT1BUSU9OQUxfR1BJT0xJQj15CisjIENPTkZJR19HUElPTElCIGlzIG5vdCBzZXQKKyMgQ09ORklHX1cxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BPV0VSX1NVUFBMWSBpcyBub3Qgc2V0CisjIENPTkZJR19IV01PTiBpcyBub3Qgc2V0CisjIENPTkZJR19USEVSTUFMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RIRVJNQUxfSFdNT04gaXMgbm90IHNldAorQ09ORklHX1dBVENIRE9HPXkKKyMgQ09ORklHX1dBVENIRE9HX05PV0FZT1VUIGlzIG5vdCBzZXQKKworIworIyBXYXRjaGRvZyBEZXZpY2UgRHJpdmVycworIworIyBDT05GSUdfU09GVF9XQVRDSERPRyBpcyBub3Qgc2V0CitDT05GSUdfQkZJTl9XRFQ9eQorCisjCisjIE11bHRpZnVuY3Rpb24gZGV2aWNlIGRyaXZlcnMKKyMKKyMgQ09ORklHX01GRF9DT1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9TTTUwMSBpcyBub3Qgc2V0CisjIENPTkZJR19IVENfUEFTSUMzIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9UTUlPIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9XTTg0MDAgaXMgbm90IHNldAorIyBDT05GSUdfTUZEX1dNODM1MF9JMkMgaXMgbm90IHNldAorCisjCisjIE11bHRpbWVkaWEgZGV2aWNlcworIworCisjCisjIE11bHRpbWVkaWEgY29yZSBzdXBwb3J0CisjCisjIENPTkZJR19WSURFT19ERVYgaXMgbm90IHNldAorIyBDT05GSUdfRFZCX0NPUkUgaXMgbm90IHNldAorIyBDT05GSUdfVklERU9fTUVESUEgaXMgbm90IHNldAorCisjCisjIE11bHRpbWVkaWEgZHJpdmVycworIworIyBDT05GSUdfREFCIGlzIG5vdCBzZXQKKworIworIyBHcmFwaGljcyBzdXBwb3J0CisjCisjIENPTkZJR19WR0FTVEFURSBpcyBub3Qgc2V0CisjIENPTkZJR19WSURFT19PVVRQVVRfQ09OVFJPTCBpcyBub3Qgc2V0CisjIENPTkZJR19GQiBpcyBub3Qgc2V0CisjIENPTkZJR19CQUNLTElHSFRfTENEX1NVUFBPUlQgaXMgbm90IHNldAorCisjCisjIERpc3BsYXkgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX0RJU1BMQVlfU1VQUE9SVCBpcyBub3Qgc2V0CisKKyMKKyMgQ29uc29sZSBkaXNwbGF5IGRyaXZlciBzdXBwb3J0CisjCitDT05GSUdfRFVNTVlfQ09OU09MRT15CisjIENPTkZJR19TT1VORCBpcyBub3Qgc2V0CisjIENPTkZJR19ISURfU1VQUE9SVCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1VQUE9SVCBpcyBub3Qgc2V0CisjIENPTkZJR19NTUMgaXMgbm90IHNldAorIyBDT05GSUdfTUVNU1RJQ0sgaXMgbm90IHNldAorIyBDT05GSUdfTkVXX0xFRFMgaXMgbm90IHNldAorIyBDT05GSUdfQUNDRVNTSUJJTElUWSBpcyBub3Qgc2V0CitDT05GSUdfUlRDX0xJQj15CitDT05GSUdfUlRDX0NMQVNTPXkKK0NPTkZJR19SVENfSENUT1NZUz15CitDT05GSUdfUlRDX0hDVE9TWVNfREVWSUNFPSJydGMwIgorIyBDT05GSUdfUlRDX0RFQlVHIGlzIG5vdCBzZXQKKworIworIyBSVEMgaW50ZXJmYWNlcworIworQ09ORklHX1JUQ19JTlRGX1NZU0ZTPXkKK0NPTkZJR19SVENfSU5URl9QUk9DPXkKK0NPTkZJR19SVENfSU5URl9ERVY9eQorIyBDT05GSUdfUlRDX0lOVEZfREVWX1VJRV9FTVVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfVEVTVCBpcyBub3Qgc2V0CisKKyMKKyMgSTJDIFJUQyBkcml2ZXJzCisjCisjIENPTkZJR19SVENfRFJWX0RTMTMwNyBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0RTMTM3NCBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0RTMTY3MiBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX01BWDY5MDAgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9SUzVDMzcyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfSVNMMTIwOCBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1gxMjA1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfUENGODU2MyBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1BDRjg1ODMgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9NNDFUODAgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9TMzUzOTBBIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfRk0zMTMwIGlzIG5vdCBzZXQKKworIworIyBTUEkgUlRDIGRyaXZlcnMKKyMKKworIworIyBQbGF0Zm9ybSBSVEMgZHJpdmVycworIworIyBDT05GSUdfUlRDX0RSVl9EUzEyODYgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9EUzE1MTEgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9EUzE1NTMgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9EUzE3NDIgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9TVEsxN1RBOCBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX000OFQ4NiBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX000OFQzNSBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX000OFQ1OSBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0JRNDgwMiBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1YzMDIwIGlzIG5vdCBzZXQKKworIworIyBvbi1DUFUgUlRDIGRyaXZlcnMKKyMKK0NPTkZJR19SVENfRFJWX0JGSU49eQorIyBDT05GSUdfRE1BREVWSUNFUyBpcyBub3Qgc2V0CisjIENPTkZJR19VSU8gaXMgbm90IHNldAorIyBDT05GSUdfU1RBR0lORyBpcyBub3Qgc2V0CisKKyMKKyMgRmlsZSBzeXN0ZW1zCisjCisjIENPTkZJR19FWFQyX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRVhUNF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19SRUlTRVJGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19KRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKK0NPTkZJR19GSUxFX0xPQ0tJTkc9eQorIyBDT05GSUdfWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX09DRlMyX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ROT1RJRlkgaXMgbm90IHNldAorQ09ORklHX0lOT1RJRlk9eQorQ09ORklHX0lOT1RJRllfVVNFUj15CisjIENPTkZJR19RVU9UQSBpcyBub3Qgc2V0CisjIENPTkZJR19BVVRPRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQVVUT0ZTNF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19GVVNFX0ZTIGlzIG5vdCBzZXQKKworIworIyBDRC1ST00vRFZEIEZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19JU085NjYwX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VERl9GUyBpcyBub3Qgc2V0CisKKyMKKyMgRE9TL0ZBVC9OVCBGaWxlc3lzdGVtcworIworIyBDT05GSUdfTVNET1NfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVkZBVF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19OVEZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBQc2V1ZG8gZmlsZXN5c3RlbXMKKyMKK0NPTkZJR19QUk9DX0ZTPXkKK0NPTkZJR19QUk9DX1NZU0NUTD15CitDT05GSUdfU1lTRlM9eQorIyBDT05GSUdfVE1QRlMgaXMgbm90IHNldAorIyBDT05GSUdfSFVHRVRMQl9QQUdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NPTkZJR0ZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBNaXNjZWxsYW5lb3VzIGZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19BREZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hGU1BMVVNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQkVGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19CRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1lBRkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGRlMyX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQU1GUyBpcyBub3Qgc2V0CisjIENPTkZJR19WWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JTklYX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX09NRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSFBGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19RTlg0RlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfU1lTVl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19VRlNfRlMgaXMgbm90IHNldAorQ09ORklHX05FVFdPUktfRklMRVNZU1RFTVM9eQorQ09ORklHX05GU19GUz1tCitDT05GSUdfTkZTX1YzPXkKKyMgQ09ORklHX05GU19WM19BQ0wgaXMgbm90IHNldAorIyBDT05GSUdfTkZTX1Y0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05GU0QgaXMgbm90IHNldAorQ09ORklHX0xPQ0tEPW0KK0NPTkZJR19MT0NLRF9WND15CitDT05GSUdfTkZTX0NPTU1PTj15CitDT05GSUdfU1VOUlBDPW0KKyMgQ09ORklHX1NVTlJQQ19SRUdJU1RFUl9WNCBpcyBub3Qgc2V0CisjIENPTkZJR19SUENTRUNfR1NTX0tSQjUgaXMgbm90IHNldAorIyBDT05GSUdfUlBDU0VDX0dTU19TUEtNMyBpcyBub3Qgc2V0CitDT05GSUdfU01CX0ZTPW0KKyMgQ09ORklHX1NNQl9OTFNfREVGQVVMVCBpcyBub3Qgc2V0CisjIENPTkZJR19DSUZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX05DUF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19DT0RBX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgUGFydGl0aW9uIFR5cGVzCisjCisjIENPTkZJR19QQVJUSVRJT05fQURWQU5DRUQgaXMgbm90IHNldAorQ09ORklHX01TRE9TX1BBUlRJVElPTj15CitDT05GSUdfTkxTPXkKK0NPTkZJR19OTFNfREVGQVVMVD0iaXNvODg1OS0xIgorQ09ORklHX05MU19DT0RFUEFHRV80Mzc9eQorIyBDT05GSUdfTkxTX0NPREVQQUdFXzczNyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfNzc1IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NTAgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1MiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODU1IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NTcgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODYxIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjIgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODY0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2NiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODY5IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV85MzYgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzk1MCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfOTMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV85NDkgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg3NCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV84IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV8xMjUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV8xMjUxIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19BU0NJSSBpcyBub3Qgc2V0CitDT05GSUdfTkxTX0lTTzg4NTlfMT15CisjIENPTkZJR19OTFNfSVNPODg1OV8yIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzMgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfNCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV81IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzYgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfNyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV85IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzEzIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzE0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzE1IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19LT0k4X1IgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0tPSThfVSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfVVRGOCBpcyBub3Qgc2V0CisjIENPTkZJR19ETE0gaXMgbm90IHNldAorCisjCisjIEtlcm5lbCBoYWNraW5nCisjCisjIENPTkZJR19QUklOVEtfVElNRSBpcyBub3Qgc2V0CitDT05GSUdfRU5BQkxFX1dBUk5fREVQUkVDQVRFRD15CitDT05GSUdfRU5BQkxFX01VU1RfQ0hFQ0s9eQorQ09ORklHX0ZSQU1FX1dBUk49MTAyNAorIyBDT05GSUdfTUFHSUNfU1lTUlEgaXMgbm90IHNldAorIyBDT05GSUdfVU5VU0VEX1NZTUJPTFMgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX0ZTPXkKKyMgQ09ORklHX0hFQURFUlNfQ0hFQ0sgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX0tFUk5FTD15CisjIENPTkZJR19ERUJVR19TSElSUSBpcyBub3Qgc2V0CitDT05GSUdfREVURUNUX1NPRlRMT0NLVVA9eQorIyBDT05GSUdfQk9PVFBBUkFNX1NPRlRMT0NLVVBfUEFOSUMgaXMgbm90IHNldAorQ09ORklHX0JPT1RQQVJBTV9TT0ZUTE9DS1VQX1BBTklDX1ZBTFVFPTAKK0NPTkZJR19TQ0hFRF9ERUJVRz15CisjIENPTkZJR19TQ0hFRFNUQVRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RJTUVSX1NUQVRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX09CSkVDVFMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU0xBQiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19SVF9NVVRFWEVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUX01VVEVYX1RFU1RFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TUElOTE9DSyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19NVVRFWEVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NQSU5MT0NLX1NMRUVQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0xPQ0tJTkdfQVBJX1NFTEZURVNUUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19LT0JKRUNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0JVR1ZFUkJPU0UgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX0lORk89eQorIyBDT05GSUdfREVCVUdfVk0gaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfV1JJVEVDT1VOVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19NRU1PUllfSU5JVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19MSVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZSQU1FX1BPSU5URVIgaXMgbm90IHNldAorIyBDT05GSUdfQk9PVF9QUklOVEtfREVMQVkgaXMgbm90IHNldAorIyBDT05GSUdfUkNVX1RPUlRVUkVfVEVTVCBpcyBub3Qgc2V0CisjIENPTkZJR19SQ1VfQ1BVX1NUQUxMX0RFVEVDVE9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JBQ0tUUkFDRV9TRUxGX1RFU1QgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfQkxPQ0tfRVhUX0RFVlQgaXMgbm90IHNldAorIyBDT05GSUdfRkFVTFRfSU5KRUNUSU9OIGlzIG5vdCBzZXQKK0NPTkZJR19TWVNDVExfU1lTQ0FMTF9DSEVDSz15CisjIENPTkZJR19EWU5BTUlDX1BSSU5US19ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19TQU1QTEVTIGlzIG5vdCBzZXQKK0NPTkZJR19IQVZFX0FSQ0hfS0dEQj15CisjIENPTkZJR19LR0RCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NUQUNLT1ZFUkZMT1cgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU1RBQ0tfVVNBR0UgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX1ZFUkJPU0U9eQorQ09ORklHX0RFQlVHX01NUlM9eQorIyBDT05GSUdfREVCVUdfSFdFUlIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfRE9VQkxFRkFVTFQgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX0hVTlRfRk9SX1pFUk89eQorQ09ORklHX0RFQlVHX0JGSU5fSFdUUkFDRV9PTj15CitDT05GSUdfREVCVUdfQkZJTl9IV1RSQUNFX0NPTVBSRVNTSU9OX09GRj15CisjIENPTkZJR19ERUJVR19CRklOX0hXVFJBQ0VfQ09NUFJFU1NJT05fT05FIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0JGSU5fSFdUUkFDRV9DT01QUkVTU0lPTl9UV08gaXMgbm90IHNldAorQ09ORklHX0RFQlVHX0JGSU5fSFdUUkFDRV9DT01QUkVTU0lPTj0wCisjIENPTkZJR19ERUJVR19CRklOX0hXVFJBQ0VfRVhQQU5EIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0JGSU5fTk9fS0VSTl9IV1RSQUNFIGlzIG5vdCBzZXQKK0NPTkZJR19FQVJMWV9QUklOVEs9eQorQ09ORklHX0NQTEJfSU5GTz15CitDT05GSUdfQUNDRVNTX0NIRUNLPXkKKworIworIyBTZWN1cml0eSBvcHRpb25zCisjCisjIENPTkZJR19LRVlTIGlzIG5vdCBzZXQKK0NPTkZJR19TRUNVUklUWT15CisjIENPTkZJR19TRUNVUklUWUZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFQ1VSSVRZX05FVFdPUksgaXMgbm90IHNldAorIyBDT05GSUdfU0VDVVJJVFlfRklMRV9DQVBBQklMSVRJRVMgaXMgbm90IHNldAorQ09ORklHX1NFQ1VSSVRZX0RFRkFVTFRfTU1BUF9NSU5fQUREUj0wCitDT05GSUdfQ1JZUFRPPXkKKworIworIyBDcnlwdG8gY29yZSBvciBoZWxwZXIKKyMKKyMgQ09ORklHX0NSWVBUT19GSVBTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19NQU5BR0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19HRjEyOE1VTCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTlVMTCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ1JZUFREIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19BVVRIRU5DIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19URVNUIGlzIG5vdCBzZXQKKworIworIyBBdXRoZW50aWNhdGVkIEVuY3J5cHRpb24gd2l0aCBBc3NvY2lhdGVkIERhdGEKKyMKKyMgQ09ORklHX0NSWVBUT19DQ00gaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0dDTSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0VRSVYgaXMgbm90IHNldAorCisjCisjIEJsb2NrIG1vZGVzCisjCisjIENPTkZJR19DUllQVE9fQ0JDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DVFIgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NUUyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fRUNCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19MUlcgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1BDQkMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1hUUyBpcyBub3Qgc2V0CisKKyMKKyMgSGFzaCBtb2RlcworIworIyBDT05GSUdfQ1JZUFRPX0hNQUMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1hDQkMgaXMgbm90IHNldAorCisjCisjIERpZ2VzdAorIworIyBDT05GSUdfQ1JZUFRPX0NSQzMyQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTUQ0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19NRDUgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX01JQ0hBRUxfTUlDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19STUQxMjggaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1JNRDE2MCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fUk1EMjU2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19STUQzMjAgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NIQTEgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NIQTI1NiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0hBNTEyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19UR1IxOTIgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1dQNTEyIGlzIG5vdCBzZXQKKworIworIyBDaXBoZXJzCisjCisjIENPTkZJR19DUllQVE9fQUVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19BTlVCSVMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0FSQzQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0JMT1dGSVNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DQU1FTExJQSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ0FTVDUgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NBU1Q2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19ERVMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0ZDUllQVCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fS0hBWkFEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TQUxTQTIwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TRUVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TRVJQRU5UIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19URUEgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1RXT0ZJU0ggaXMgbm90IHNldAorCisjCisjIENvbXByZXNzaW9uCisjCisjIENPTkZJR19DUllQVE9fREVGTEFURSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTFpPIGlzIG5vdCBzZXQKKworIworIyBSYW5kb20gTnVtYmVyIEdlbmVyYXRpb24KKyMKKyMgQ09ORklHX0NSWVBUT19BTlNJX0NQUk5HIGlzIG5vdCBzZXQKK0NPTkZJR19DUllQVE9fSFc9eQorCisjCisjIExpYnJhcnkgcm91dGluZXMKKyMKK0NPTkZJR19CSVRSRVZFUlNFPXkKK0NPTkZJR19DUkNfQ0NJVFQ9bQorIyBDT05GSUdfQ1JDMTYgaXMgbm90IHNldAorIyBDT05GSUdfQ1JDX1QxMERJRiBpcyBub3Qgc2V0CisjIENPTkZJR19DUkNfSVRVX1QgaXMgbm90IHNldAorQ09ORklHX0NSQzMyPXkKKyMgQ09ORklHX0NSQzcgaXMgbm90IHNldAorIyBDT05GSUdfTElCQ1JDMzJDIGlzIG5vdCBzZXQKK0NPTkZJR19aTElCX0lORkxBVEU9eQorQ09ORklHX1BMSVNUPXkKK0NPTkZJR19IQVNfSU9NRU09eQorQ09ORklHX0hBU19JT1BPUlQ9eQorQ09ORklHX0hBU19ETUE9eQpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9jb25maWdzL0JGNTI2LUVaQlJEX2RlZmNvbmZpZyBiL2FyY2gvYmxhY2tmaW4vY29uZmlncy9CRjUyNi1FWkJSRF9kZWZjb25maWcKaW5kZXggNDQ0M2E0Ny4uNjlmNjZjMyAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9jb25maWdzL0JGNTI2LUVaQlJEX2RlZmNvbmZpZworKysgYi9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvQkY1MjYtRVpCUkRfZGVmY29uZmlnCkBAIC0xLDcgKzEsNiBAQAogIwogIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAotIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjI2LjMKLSMgVGh1IEF1ZyAyOCAxNjo0OTo1MyAyMDA4CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMjgtcmMyCiAjCiAjIENPTkZJR19NTVUgaXMgbm90IHNldAogIyBDT05GSUdfRlBVIGlzIG5vdCBzZXQKQEAgLTM3LDggKzM2LDcgQEAKIENPTkZJR19MT0dfQlVGX1NISUZUPTE0CiAjIENPTkZJR19DR1JPVVBTIGlzIG5vdCBzZXQKICMgQ09ORklHX0dST1VQX1NDSEVEIGlzIG5vdCBzZXQKLUNPTkZJR19TWVNGU19ERVBSRUNBVEVEPXkKLUNPTkZJR19TWVNGU19ERVBSRUNBVEVEX1YyPXkKKyMgQ09ORklHX1NZU0ZTX0RFUFJFQ0FURURfVjIgaXMgbm90IHNldAogIyBDT05GSUdfUkVMQVkgaXMgbm90IHNldAogIyBDT05GSUdfTkFNRVNQQUNFUyBpcyBub3Qgc2V0CiBDT05GSUdfQkxLX0RFVl9JTklUUkQ9eQpAQCAtNDgsMTMgKzQ2LDEzIEBACiBDT05GSUdfRU1CRURERUQ9eQogQ09ORklHX1VJRDE2PXkKIENPTkZJR19TWVNDVExfU1lTQ0FMTD15Ci1DT05GSUdfU1lTQ1RMX1NZU0NBTExfQ0hFQ0s9eQogQ09ORklHX0tBTExTWU1TPXkKKyMgQ09ORklHX0tBTExTWU1TX0FMTCBpcyBub3Qgc2V0CiAjIENPTkZJR19LQUxMU1lNU19FWFRSQV9QQVNTIGlzIG5vdCBzZXQKIENPTkZJR19IT1RQTFVHPXkKIENPTkZJR19QUklOVEs9eQogQ09ORklHX0JVRz15Ci1DT05GSUdfRUxGX0NPUkU9eQorIyBDT05GSUdfRUxGX0NPUkUgaXMgbm90IHNldAogQ09ORklHX0NPTVBBVF9CUks9eQogQ09ORklHX0JBU0VfRlVMTD15CiBDT05GSUdfRlVURVg9eQpAQCAtNjMsNiArNjEsNyBAQAogQ09ORklHX1NJR05BTEZEPXkKIENPTkZJR19USU1FUkZEPXkKIENPTkZJR19FVkVOVEZEPXkKK0NPTkZJR19BSU89eQogQ09ORklHX1ZNX0VWRU5UX0NPVU5URVJTPXkKIENPTkZJR19TTEFCPXkKICMgQ09ORklHX1NMVUIgaXMgbm90IHNldApAQCAtNzAsOSArNjksNyBAQAogIyBDT05GSUdfUFJPRklMSU5HIGlzIG5vdCBzZXQKICMgQ09ORklHX01BUktFUlMgaXMgbm90IHNldAogQ09ORklHX0hBVkVfT1BST0ZJTEU9eQotIyBDT05GSUdfSEFWRV9LUFJPQkVTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hBVkVfS1JFVFBST0JFUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19IQVZFX0RNQV9BVFRSUyBpcyBub3Qgc2V0CisjIENPTkZJR19IQVZFX0dFTkVSSUNfRE1BX0NPSEVSRU5UIGlzIG5vdCBzZXQKIENPTkZJR19TTEFCSU5GTz15CiBDT05GSUdfUlRfTVVURVhFUz15CiBDT05GSUdfVElOWV9TSE1FTT15CkBAIC04OSw2ICs4Niw3IEBACiAjIENPTkZJR19CTEtfREVWX0lPX1RSQUNFIGlzIG5vdCBzZXQKICMgQ09ORklHX0xTRiBpcyBub3Qgc2V0CiAjIENPTkZJR19CTEtfREVWX0JTRyBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0lOVEVHUklUWSBpcyBub3Qgc2V0CiAKICMKICMgSU8gU2NoZWR1bGVycwpAQCAtMTA2LDYgKzEwNCw3IEBACiAjIENPTkZJR19QUkVFTVBUX05PTkUgaXMgbm90IHNldAogQ09ORklHX1BSRUVNUFRfVk9MVU5UQVJZPXkKICMgQ09ORklHX1BSRUVNUFQgaXMgbm90IHNldAorIyBDT05GSUdfRlJFRVpFUiBpcyBub3Qgc2V0CiAKICMKICMgQmxhY2tmaW4gUHJvY2Vzc29yIE9wdGlvbnMKQEAgLTExNCw2ICsxMTMsMTAgQEAKICMKICMgUHJvY2Vzc29yIGFuZCBCb2FyZCBTZXR0aW5ncwogIworIyBDT05GSUdfQkY1MTIgaXMgbm90IHNldAorIyBDT05GSUdfQkY1MTQgaXMgbm90IHNldAorIyBDT05GSUdfQkY1MTYgaXMgbm90IHNldAorIyBDT05GSUdfQkY1MTggaXMgbm90IHNldAogIyBDT05GSUdfQkY1MjIgaXMgbm90IHNldAogIyBDT05GSUdfQkY1MjMgaXMgbm90IHNldAogIyBDT05GSUdfQkY1MjQgaXMgbm90IHNldApAQCAtMTI2LDIyICsxMjksNzEgQEAKICMgQ09ORklHX0JGNTM0IGlzIG5vdCBzZXQKICMgQ09ORklHX0JGNTM2IGlzIG5vdCBzZXQKICMgQ09ORklHX0JGNTM3IGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGNTM4IGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGNTM5IGlzIG5vdCBzZXQKICMgQ09ORklHX0JGNTQyIGlzIG5vdCBzZXQKICMgQ09ORklHX0JGNTQ0IGlzIG5vdCBzZXQKICMgQ09ORklHX0JGNTQ3IGlzIG5vdCBzZXQKICMgQ09ORklHX0JGNTQ4IGlzIG5vdCBzZXQKICMgQ09ORklHX0JGNTQ5IGlzIG5vdCBzZXQKICMgQ09ORklHX0JGNTYxIGlzIG5vdCBzZXQKK0NPTkZJR19CRl9SRVZfTUlOPTAKK0NPTkZJR19CRl9SRVZfTUFYPTIKIENPTkZJR19CRl9SRVZfMF8wPXkKICMgQ09ORklHX0JGX1JFVl8wXzEgaXMgbm90IHNldAogIyBDT05GSUdfQkZfUkVWXzBfMiBpcyBub3Qgc2V0CiAjIENPTkZJR19CRl9SRVZfMF8zIGlzIG5vdCBzZXQKICMgQ09ORklHX0JGX1JFVl8wXzQgaXMgbm90IHNldAogIyBDT05GSUdfQkZfUkVWXzBfNSBpcyBub3Qgc2V0CisjIENPTkZJR19CRl9SRVZfMF82IGlzIG5vdCBzZXQKICMgQ09ORklHX0JGX1JFVl9BTlkgaXMgbm90IHNldAogIyBDT05GSUdfQkZfUkVWX05PTkUgaXMgbm90IHNldAogQ09ORklHX0JGNTJ4PXkKIENPTkZJR19NRU1fTVQ0OExDMzJNMTZBMlRHXzc1PXkKK0NPTkZJR19JUlFfUExMX1dBS0VVUD03CitDT05GSUdfSVJRX0RNQTBfRVJST1I9NworQ09ORklHX0lSUV9ETUFSMF9CTEs9NworQ09ORklHX0lSUV9ETUFSMV9CTEs9NworQ09ORklHX0lSUV9ETUFSMF9PVlI9NworQ09ORklHX0lSUV9ETUFSMV9PVlI9NworQ09ORklHX0lSUV9QUElfRVJST1I9NworQ09ORklHX0lSUV9NQUNfRVJST1I9NworQ09ORklHX0lSUV9TUE9SVDBfRVJST1I9NworQ09ORklHX0lSUV9TUE9SVDFfRVJST1I9NworQ09ORklHX0lSUV9VQVJUMF9FUlJPUj03CitDT05GSUdfSVJRX1VBUlQxX0VSUk9SPTcKK0NPTkZJR19JUlFfUlRDPTgKK0NPTkZJR19JUlFfUFBJPTgKK0NPTkZJR19JUlFfU1BPUlQwX1JYPTkKK0NPTkZJR19JUlFfU1BPUlQwX1RYPTkKK0NPTkZJR19JUlFfU1BPUlQxX1JYPTkKK0NPTkZJR19JUlFfU1BPUlQxX1RYPTkKK0NPTkZJR19JUlFfVFdJPTEwCitDT05GSUdfSVJRX1VBUlQwX1JYPTEwCitDT05GSUdfSVJRX1VBUlQwX1RYPTEwCitDT05GSUdfSVJRX1VBUlQxX1JYPTEwCitDT05GSUdfSVJRX1VBUlQxX1RYPTEwCitDT05GSUdfSVJRX09QVFNFQz0xMQorQ09ORklHX0lSUV9DTlQ9MTEKK0NPTkZJR19JUlFfTUFDX1JYPTExCitDT05GSUdfSVJRX1BPUlRIX0lOVEE9MTEKK0NPTkZJR19JUlFfTUFDX1RYPTExCitDT05GSUdfSVJRX1BPUlRIX0lOVEI9MTEKK0NPTkZJR19JUlFfVElNRVIwPTEyCitDT05GSUdfSVJRX1RJTUVSMT0xMgorQ09ORklHX0lSUV9USU1FUjI9MTIKK0NPTkZJR19JUlFfVElNRVIzPTEyCitDT05GSUdfSVJRX1RJTUVSND0xMgorQ09ORklHX0lSUV9USU1FUjU9MTIKK0NPTkZJR19JUlFfVElNRVI2PTEyCitDT05GSUdfSVJRX1RJTUVSNz0xMgorQ09ORklHX0lSUV9QT1JUR19JTlRBPTEyCitDT05GSUdfSVJRX1BPUlRHX0lOVEI9MTIKK0NPTkZJR19JUlFfTUVNX0RNQTA9MTMKK0NPTkZJR19JUlFfTUVNX0RNQTE9MTMKK0NPTkZJR19JUlFfV0FUQ0g9MTMKK0NPTkZJR19JUlFfUE9SVEZfSU5UQT0xMworQ09ORklHX0lSUV9QT1JURl9JTlRCPTEzCiAjIENPTkZJR19CRklONTI3X0VaS0lUIGlzIG5vdCBzZXQKICMgQ09ORklHX0JGSU41MjdfQkxVRVRFQ0hOSVhfQ00gaXMgbm90IHNldAogQ09ORklHX0JGSU41MjZfRVpCUkQ9eQpAQCAtMTY5LDUxICsyMjEsNyBAQAogIwogIyBQcmlvcml0eQogIwotQ09ORklHX0lSUV9QTExfV0FLRVVQPTcKLUNPTkZJR19JUlFfRE1BMF9FUlJPUj03Ci1DT05GSUdfSVJRX0RNQVIwX0JMSz03Ci1DT05GSUdfSVJRX0RNQVIxX0JMSz03Ci1DT05GSUdfSVJRX0RNQVIwX09WUj03Ci1DT05GSUdfSVJRX0RNQVIxX09WUj03Ci1DT05GSUdfSVJRX1BQSV9FUlJPUj03Ci1DT05GSUdfSVJRX01BQ19FUlJPUj03Ci1DT05GSUdfSVJRX1NQT1JUMF9FUlJPUj03Ci1DT05GSUdfSVJRX1NQT1JUMV9FUlJPUj03Ci1DT05GSUdfSVJRX1VBUlQwX0VSUk9SPTcKLUNPTkZJR19JUlFfVUFSVDFfRVJST1I9NwotQ09ORklHX0lSUV9SVEM9OAotQ09ORklHX0lSUV9QUEk9OAotQ09ORklHX0lSUV9TUE9SVDBfUlg9OQotQ09ORklHX0lSUV9TUE9SVDBfVFg9OQotQ09ORklHX0lSUV9TUE9SVDFfUlg9OQotQ09ORklHX0lSUV9TUE9SVDFfVFg9OQotQ09ORklHX0lSUV9UV0k9MTAKIENPTkZJR19JUlFfU1BJPTEwCi1DT05GSUdfSVJRX1VBUlQwX1JYPTEwCi1DT05GSUdfSVJRX1VBUlQwX1RYPTEwCi1DT05GSUdfSVJRX1VBUlQxX1JYPTEwCi1DT05GSUdfSVJRX1VBUlQxX1RYPTEwCi1DT05GSUdfSVJRX09QVFNFQz0xMQotQ09ORklHX0lSUV9DTlQ9MTEKLUNPTkZJR19JUlFfTUFDX1JYPTExCi1DT05GSUdfSVJRX1BPUlRIX0lOVEE9MTEKLUNPTkZJR19JUlFfTUFDX1RYPTExCi1DT05GSUdfSVJRX1BPUlRIX0lOVEI9MTEKLUNPTkZJR19JUlFfVE1SMD0xMgotQ09ORklHX0lSUV9UTVIxPTEyCi1DT05GSUdfSVJRX1RNUjI9MTIKLUNPTkZJR19JUlFfVE1SMz0xMgotQ09ORklHX0lSUV9UTVI0PTEyCi1DT05GSUdfSVJRX1RNUjU9MTIKLUNPTkZJR19JUlFfVE1SNj0xMgotQ09ORklHX0lSUV9UTVI3PTEyCi1DT05GSUdfSVJRX1BPUlRHX0lOVEE9MTIKLUNPTkZJR19JUlFfUE9SVEdfSU5UQj0xMgotQ09ORklHX0lSUV9NRU1fRE1BMD0xMwotQ09ORklHX0lSUV9NRU1fRE1BMT0xMwotQ09ORklHX0lSUV9XQVRDSD0xMwotQ09ORklHX0lSUV9QT1JURl9JTlRBPTEzCi1DT05GSUdfSVJRX1BPUlRGX0lOVEI9MTMKIENPTkZJR19JUlFfU1BJX0VSUk9SPTcKIENPTkZJR19JUlFfTkZDX0VSUk9SPTcKIENPTkZJR19JUlFfSERNQV9FUlJPUj03CkBAIC0yMzUsNyArMjQzLDYgQEAKICMKIENPTkZJR19DTEtJTl9IWj0yNTAwMDAwMAogIyBDT05GSUdfQkZJTl9LRVJORUxfQ0xPQ0sgaXMgbm90IHNldAotQ09ORklHX01BWF9NRU1fU0laRT01MTIKIENPTkZJR19NQVhfVkNPX0haPTQwMDAwMDAwMAogQ09ORklHX01JTl9WQ09fSFo9NTAwMDAwMDAKIENPTkZJR19NQVhfU0NMS19IWj0xMzMzMzMzMzMKQEAgLTI1MywxNiArMjYwLDExIEBACiBDT05GSUdfR0VORVJJQ19USU1FPXkKIENPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTPXkKICMgQ09ORklHX0NZQ0xFU19DTE9DS1NPVVJDRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19USUNLX09ORVNIT1QgaXMgbm90IHNldAogIyBDT05GSUdfTk9fSFogaXMgbm90IHNldAogIyBDT05GSUdfSElHSF9SRVNfVElNRVJTIGlzIG5vdCBzZXQKIENPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTX0JVSUxEPXkKIAogIwotIyBNZW1vcnkgU2V0dXAKLSMKLQotIwogIyBNaXNjCiAjCiBDT05GSUdfQkZJTl9TQ1JBVENIX1JFR19SRVROPXkKQEAgLTI5MSw2ICsyOTMsNyBAQAogQ09ORklHX0NBQ0hFTElORV9BTElHTkVEX0wxPXkKICMgQ09ORklHX1NZU0NBTExfVEFCX0wxIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQTEJfU1dJVENIX1RBQl9MMSBpcyBub3Qgc2V0CitDT05GSUdfQVBQX1NUQUNLX0wxPXkKIAogIwogIyBTcGVlZCBPcHRpbWl6YXRpb25zCkBAIC0zMDQsMTUgKzMwNywxMyBAQAogIyBDT05GSUdfU1BBUlNFTUVNX01BTlVBTCBpcyBub3Qgc2V0CiBDT05GSUdfRkxBVE1FTT15CiBDT05GSUdfRkxBVF9OT0RFX01FTV9NQVA9eQotIyBDT05GSUdfU1BBUlNFTUVNX1NUQVRJQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TUEFSU0VNRU1fVk1FTU1BUF9FTkFCTEUgaXMgbm90IHNldAogQ09ORklHX1BBR0VGTEFHU19FWFRFTkRFRD15CiBDT05GSUdfU1BMSVRfUFRMT0NLX0NQVVM9NAogIyBDT05GSUdfUkVTT1VSQ0VTXzY0QklUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BIWVNfQUREUl9UXzY0QklUIGlzIG5vdCBzZXQKIENPTkZJR19aT05FX0RNQV9GTEFHPTEKIENPTkZJR19WSVJUX1RPX0JVUz15CiBDT05GSUdfQkZJTl9HUFRJTUVSUz15Ci1DT05GSUdfQkZJTl9ETUFfNVhYPXkKICMgQ09ORklHX0RNQV9VTkNBQ0hFRF80TSBpcyBub3Qgc2V0CiAjIENPTkZJR19ETUFfVU5DQUNIRURfMk0gaXMgbm90IHNldAogQ09ORklHX0RNQV9VTkNBQ0hFRF8xTT15CkBAIC0zNjUsNiArMzY2LDcgQEAKIENPTkZJR19CSU5GTVRfRkxBVD15CiBDT05GSUdfQklORk1UX1pGTEFUPXkKICMgQ09ORklHX0JJTkZNVF9TSEFSRURfRkxBVCBpcyBub3Qgc2V0CisjIENPTkZJR19IQVZFX0FPVVQgaXMgbm90IHNldAogIyBDT05GSUdfQklORk1UX01JU0MgaXMgbm90IHNldAogCiAjCkBAIC0zNzgsMTAgKzM4MCw2IEBACiAjIENQVSBGcmVxdWVuY3kgc2NhbGluZwogIwogIyBDT05GSUdfQ1BVX0ZSRVEgaXMgbm90IHNldAotCi0jCi0jIE5ldHdvcmtpbmcKLSMKIENPTkZJR19ORVQ9eQogCiAjCkBAIC00MzIsNiArNDMwLDcgQEAKICMgQ09ORklHX1RJUEMgaXMgbm90IHNldAogIyBDT05GSUdfQVRNIGlzIG5vdCBzZXQKICMgQ09ORklHX0JSSURHRSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfRFNBIGlzIG5vdCBzZXQKICMgQ09ORklHX1ZMQU5fODAyMVEgaXMgbm90IHNldAogIyBDT05GSUdfREVDTkVUIGlzIG5vdCBzZXQKICMgQ09ORklHX0xMQzIgaXMgbm90IHNldApAQCAtNDUyLDExICs0NTEsMTAgQEAKICMgQ09ORklHX0lSREEgaXMgbm90IHNldAogIyBDT05GSUdfQlQgaXMgbm90IHNldAogIyBDT05GSUdfQUZfUlhSUEMgaXMgbm90IHNldAotCi0jCi0jIFdpcmVsZXNzCi0jCisjIENPTkZJR19QSE9ORVQgaXMgbm90IHNldAorQ09ORklHX1dJUkVMRVNTPXkKICMgQ09ORklHX0NGRzgwMjExIGlzIG5vdCBzZXQKK0NPTkZJR19XSVJFTEVTU19PTERfUkVHVUxBVE9SWT15CiAjIENPTkZJR19XSVJFTEVTU19FWFQgaXMgbm90IHNldAogIyBDT05GSUdfTUFDODAyMTEgaXMgbm90IHNldAogIyBDT05GSUdfSUVFRTgwMjExIGlzIG5vdCBzZXQKQEAgLTQ3NCw2ICs0NzIsOCBAQAogQ09ORklHX1NUQU5EQUxPTkU9eQogQ09ORklHX1BSRVZFTlRfRklSTVdBUkVfQlVJTEQ9eQogIyBDT05GSUdfRldfTE9BREVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0RSSVZFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19ERVZSRVMgaXMgbm90IHNldAogIyBDT05GSUdfU1lTX0hZUEVSVklTT1IgaXMgbm90IHNldAogIyBDT05GSUdfQ09OTkVDVE9SIGlzIG5vdCBzZXQKIENPTkZJR19NVEQ9eQpAQCAtNTM0LDcgKzUzNCw4IEBACiAjIFNlbGYtY29udGFpbmVkIE1URCBkZXZpY2UgZHJpdmVycwogIwogIyBDT05GSUdfTVREX0RBVEFGTEFTSCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NVERfTTI1UDgwIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfTTI1UDgwPXkKK0NPTkZJR19NMjVQWFhfVVNFX0ZBU1RfUkVBRD15CiAjIENPTkZJR19NVERfU0xSQU0gaXMgbm90IHNldAogIyBDT05GSUdfTVREX1BIUkFNIGlzIG5vdCBzZXQKICMgQ09ORklHX01URF9NVERSQU0gaXMgbm90IHNldApAQCAtNTc5LDYgKzU4MCw3IEBACiAjIENPTkZJR19CTEtfREVWX1hJUCBpcyBub3Qgc2V0CiAjIENPTkZJR19DRFJPTV9QS1RDRFZEIGlzIG5vdCBzZXQKICMgQ09ORklHX0FUQV9PVkVSX0VUSCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0hEIGlzIG5vdCBzZXQKIENPTkZJR19NSVNDX0RFVklDRVM9eQogIyBDT05GSUdfRUVQUk9NXzkzQ1g2IGlzIG5vdCBzZXQKICMgQ09ORklHX0VOQ0xPU1VSRV9TRVJWSUNFUyBpcyBub3Qgc2V0CkBAIC01OTUsNyArNTk3LDYgQEAKICMgQ09ORklHX0FUQSBpcyBub3Qgc2V0CiAjIENPTkZJR19NRCBpcyBub3Qgc2V0CiBDT05GSUdfTkVUREVWSUNFUz15Ci0jIENPTkZJR19ORVRERVZJQ0VTX01VTFRJUVVFVUUgaXMgbm90IHNldAogIyBDT05GSUdfRFVNTVkgaXMgbm90IHNldAogIyBDT05GSUdfQk9ORElORyBpcyBub3Qgc2V0CiAjIENPTkZJR19NQUNWTEFOIGlzIG5vdCBzZXQKQEAgLTYzMyw5ICs2MzQsMTAgQEAKICMgQ09ORklHX0lCTV9ORVdfRU1BQ19SR01JSSBpcyBub3Qgc2V0CiAjIENPTkZJR19JQk1fTkVXX0VNQUNfVEFIIGlzIG5vdCBzZXQKICMgQ09ORklHX0lCTV9ORVdfRU1BQ19FTUFDNCBpcyBub3Qgc2V0Ci0jIENPTkZJR19CNDQgaXMgbm90IHNldAorIyBDT05GSUdfSUJNX05FV19FTUFDX05PX0ZMT1dfQ1RSTCBpcyBub3Qgc2V0CisjIENPTkZJR19JQk1fTkVXX0VNQUNfTUFMX0NMUl9JQ0lOVFNUQVQgaXMgbm90IHNldAorIyBDT05GSUdfSUJNX05FV19FTUFDX01BTF9DT01NT05fRVJSIGlzIG5vdCBzZXQKIENPTkZJR19ORVRERVZfMTAwMD15Ci0jIENPTkZJR19FMTAwMEVfRU5BQkxFRCBpcyBub3Qgc2V0CiAjIENPTkZJR19BWDg4MTgwIGlzIG5vdCBzZXQKIENPTkZJR19ORVRERVZfMTAwMDA9eQogCkBAIC02NjcsNyArNjY5LDcgQEAKICMgSW5wdXQgZGV2aWNlIHN1cHBvcnQKICMKIENPTkZJR19JTlBVVD15Ci0jIENPTkZJR19JTlBVVF9GRl9NRU1MRVNTIGlzIG5vdCBzZXQKK0NPTkZJR19JTlBVVF9GRl9NRU1MRVNTPW0KICMgQ09ORklHX0lOUFVUX1BPTExERVYgaXMgbm90IHNldAogCiAjCkBAIC02OTIsOCArNjk0LDkgQEAKICMgQ09ORklHX0lOUFVUX0tFWVNQQU5fUkVNT1RFIGlzIG5vdCBzZXQKICMgQ09ORklHX0lOUFVUX1BPV0VSTUFURSBpcyBub3Qgc2V0CiAjIENPTkZJR19JTlBVVF9ZRUFMSU5LIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0NNMTA5IGlzIG5vdCBzZXQKICMgQ09ORklHX0lOUFVUX1VJTlBVVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19UV0lfS0VZUEFEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NPTkZJR19JTlBVVF9QQ0Y4NTc0IGlzIG5vdCBzZXQKIAogIwogIyBIYXJkd2FyZSBJL08gcG9ydHMKQEAgLTcxMiwxMiArNzE1LDE1IEBACiAjIENPTkZJR19CRklOX1NQT1JUIGlzIG5vdCBzZXQKICMgQ09ORklHX0JGSU5fVElNRVJfTEFURU5DWSBpcyBub3Qgc2V0CiAjIENPTkZJR19UV0lfTENEIGlzIG5vdCBzZXQKK0NPTkZJR19CRklOX0RNQV9JTlRFUkZBQ0U9bQogQ09ORklHX1NJTVBMRV9HUElPPW0KIENPTkZJR19WVD15CitDT05GSUdfQ09OU09MRV9UUkFOU0xBVElPTlM9eQogQ09ORklHX1ZUX0NPTlNPTEU9eQogQ09ORklHX0hXX0NPTlNPTEU9eQogIyBDT05GSUdfVlRfSFdfQ09OU09MRV9CSU5ESU5HIGlzIG5vdCBzZXQKLUNPTkZJR19ERVZLTUVNPXkKKyMgQ09ORklHX0RFVktNRU0gaXMgbm90IHNldAorIyBDT05GSUdfQkZJTl9KVEFHX0NPTU0gaXMgbm90IHNldAogIyBDT05GSUdfU0VSSUFMX05PTlNUQU5EQVJEIGlzIG5vdCBzZXQKIAogIwpAQCAtNzYwLDI1ICs3NjYsMzkgQEAKICMKICMgSTJDIEhhcmR3YXJlIEJ1cyBzdXBwb3J0CiAjCisKKyMKKyMgSTJDIHN5c3RlbSBidXMgZHJpdmVycyAobW9zdGx5IGVtYmVkZGVkIC8gc3lzdGVtLW9uLWNoaXApCisjCiBDT05GSUdfSTJDX0JMQUNLRklOX1RXST15Ci1DT05GSUdfSTJDX0JMQUNLRklOX1RXSV9DTEtfS0haPTUwCitDT05GSUdfSTJDX0JMQUNLRklOX1RXSV9DTEtfS0haPTEwMAogIyBDT05GSUdfSTJDX0dQSU8gaXMgbm90IHNldAogIyBDT05GSUdfSTJDX09DT1JFUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfUEFSUE9SVF9MSUdIVCBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfU0lNVEVDIGlzIG5vdCBzZXQKKworIworIyBFeHRlcm5hbCBJMkMvU01CdXMgYWRhcHRlciBkcml2ZXJzCisjCisjIENPTkZJR19JMkNfUEFSUE9SVF9MSUdIVCBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfVEFPU19FVk0gaXMgbm90IHNldAotIyBDT05GSUdfSTJDX1NUVUIgaXMgbm90IHNldAogIyBDT05GSUdfSTJDX1RJTllfVVNCIGlzIG5vdCBzZXQKKworIworIyBPdGhlciBJMkMvU01CdXMgYnVzIGRyaXZlcnMKKyMKICMgQ09ORklHX0kyQ19QQ0FfUExBVEZPUk0gaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1NUVUIgaXMgbm90IHNldAogCiAjCiAjIE1pc2NlbGxhbmVvdXMgSTJDIENoaXAgc3VwcG9ydAogIwogIyBDT05GSUdfRFMxNjgyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUMjQgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19BRDUyNTIgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19FRVBST00gaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19QQ0Y4NTc0IGlzIG5vdCBzZXQKICMgQ09ORklHX1BDRjg1NzUgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19QQ0E5NTM5IGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfUENGODU5MSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX01BWDY4NzUgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19UU0wyNTUwIGlzIG5vdCBzZXQKQEAgLTc4NywxMiArODA3LDE0IEBACiAjIENPTkZJR19JMkNfREVCVUdfQlVTIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19ERUJVR19DSElQIGlzIG5vdCBzZXQKIENPTkZJR19TUEk9eQorIyBDT05GSUdfU1BJX0RFQlVHIGlzIG5vdCBzZXQKIENPTkZJR19TUElfTUFTVEVSPXkKIAogIwogIyBTUEkgTWFzdGVyIENvbnRyb2xsZXIgRHJpdmVycwogIwogQ09ORklHX1NQSV9CRklOPXkKKyMgQ09ORklHX1NQSV9CRklOX0xPQ0sgaXMgbm90IHNldAogIyBDT05GSUdfU1BJX0JJVEJBTkcgaXMgbm90IHNldAogCiAjCkBAIC04MDEsMTEgKzgyMywxNSBAQAogIyBDT05GSUdfU1BJX0FUMjUgaXMgbm90IHNldAogIyBDT05GSUdfU1BJX1NQSURFViBpcyBub3Qgc2V0CiAjIENPTkZJR19TUElfVExFNjJYMCBpcyBub3Qgc2V0CitDT05GSUdfQVJDSF9XQU5UX09QVElPTkFMX0dQSU9MSUI9eQorIyBDT05GSUdfR1BJT0xJQiBpcyBub3Qgc2V0CiAjIENPTkZJR19XMSBpcyBub3Qgc2V0CiAjIENPTkZJR19QT1dFUl9TVVBQTFkgaXMgbm90IHNldAogQ09ORklHX0hXTU9OPXkKICMgQ09ORklHX0hXTU9OX1ZJRCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FENzQxNCBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0FENzQxOCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FEQ1hYIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfQURNMTAyMSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0FETTEwMjUgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19BRE0xMDI2IGlzIG5vdCBzZXQKQEAgLTgzNCw2ICs4NjAsNyBAQAogIyBDT05GSUdfU0VOU09SU19MTTkwIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfTE05MiBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0xNOTMgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19NQVgxMTExIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfTUFYMTYxOSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX01BWDY2NTAgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19QQzg3MzYwIGlzIG5vdCBzZXQKQEAgLTg3MSwxNiArODk4LDE0IEBACiAjIENPTkZJR19VU0JQQ1dBVENIRE9HIGlzIG5vdCBzZXQKIAogIwotIyBTb25pY3MgU2lsaWNvbiBCYWNrcGxhbmUKLSMKLUNPTkZJR19TU0JfUE9TU0lCTEU9eQotIyBDT05GSUdfU1NCIGlzIG5vdCBzZXQKLQotIwogIyBNdWx0aWZ1bmN0aW9uIGRldmljZSBkcml2ZXJzCiAjCisjIENPTkZJR19NRkRfQ09SRSBpcyBub3Qgc2V0CiAjIENPTkZJR19NRkRfU001MDEgaXMgbm90IHNldAogIyBDT05GSUdfSFRDX1BBU0lDMyBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfVE1JTyBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfV004NDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9XTTgzNTBfSTJDIGlzIG5vdCBzZXQKIAogIwogIyBNdWx0aW1lZGlhIGRldmljZXMKQEAgLTkxNSwxNSArOTQwLDggQEAKICMgQ29uc29sZSBkaXNwbGF5IGRyaXZlciBzdXBwb3J0CiAjCiBDT05GSUdfRFVNTVlfQ09OU09MRT15Ci0KLSMKLSMgU291bmQKLSMKIENPTkZJR19TT1VORD1tCi0KLSMKLSMgQWR2YW5jZWQgTGludXggU291bmQgQXJjaGl0ZWN0dXJlCi0jCitDT05GSUdfU09VTkRfT1NTX0NPUkU9eQogQ09ORklHX1NORD1tCiBDT05GSUdfU05EX1RJTUVSPW0KIENPTkZJR19TTkRfUENNPW0KQEAgLTkzNyw1NiArOTU1LDQwIEBACiBDT05GSUdfU05EX1ZFUkJPU0VfUFJPQ0ZTPXkKICMgQ09ORklHX1NORF9WRVJCT1NFX1BSSU5USyBpcyBub3Qgc2V0CiAjIENPTkZJR19TTkRfREVCVUcgaXMgbm90IHNldAotCi0jCi0jIEdlbmVyaWMgZGV2aWNlcwotIworQ09ORklHX1NORF9EUklWRVJTPXkKICMgQ09ORklHX1NORF9EVU1NWSBpcyBub3Qgc2V0CiAjIENPTkZJR19TTkRfTVRQQVYgaXMgbm90IHNldAogIyBDT05GSUdfU05EX1NFUklBTF9VMTY1NTAgaXMgbm90IHNldAogIyBDT05GSUdfU05EX01QVTQwMSBpcyBub3Qgc2V0Ci0KLSMKLSMgU1BJIGRldmljZXMKLSMKK0NPTkZJR19TTkRfU1BJPXkKIAogIwogIyBBTFNBIEJsYWNrZmluIGRldmljZXMKICMKICMgQ09ORklHX1NORF9CTEFDS0ZJTl9BRDE4MzYgaXMgbm90IHNldAotIyBDT05GSUdfU05EX0JGSU5fQUQ3MzMxMSBpcyBub3Qgc2V0CiAjIENPTkZJR19TTkRfQkZJTl9BRDczMzIyIGlzIG5vdCBzZXQKLQotIwotIyBVU0IgZGV2aWNlcwotIworQ09ORklHX1NORF9VU0I9eQogIyBDT05GSUdfU05EX1VTQl9BVURJTyBpcyBub3Qgc2V0CiAjIENPTkZJR19TTkRfVVNCX0NBSUFRIGlzIG5vdCBzZXQKLQotIwotIyBTeXN0ZW0gb24gQ2hpcCBhdWRpbyBzdXBwb3J0Ci0jCiBDT05GSUdfU05EX1NPQz1tCitDT05GSUdfU05EX1NPQ19BQzk3X0JVUz15CiBDT05GSUdfU05EX0JGNVhYX0kyUz1tCiBDT05GSUdfU05EX0JGNVhYX1NPQ19TU00yNjAyPW0KLSMgQ09ORklHX1NORF9CRjVYWF9BQzk3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9CRjVYWF9TT0NfQUQ3MzMxMSBpcyBub3Qgc2V0CitDT05GSUdfU05EX0JGNVhYX0FDOTc9bQorQ09ORklHX1NORF9CRjVYWF9NTUFQX1NVUFBPUlQ9eQorIyBDT05GSUdfU05EX0JGNVhYX01VTFRJQ0hBTl9TVVBQT1JUIGlzIG5vdCBzZXQKIENPTkZJR19TTkRfQkY1WFhfU09DX1NQT1JUPW0KIENPTkZJR19TTkRfQkY1WFhfU09DX0kyUz1tCitDT05GSUdfU05EX0JGNVhYX1NPQ19BQzk3PW0KK0NPTkZJR19TTkRfQkY1WFhfU09DX0FEMTk4MD1tCiBDT05GSUdfU05EX0JGNVhYX1NQT1JUX05VTT0wCi0KLSMKLSMgQUxTQSBTb0MgYXVkaW8gZm9yIEZyZWVzY2FsZSBTT0NzCi0jCi0KLSMKLSMgU29DIEF1ZGlvIGZvciB0aGUgVGV4YXMgSW5zdHJ1bWVudHMgT01BUAotIworIyBDT05GSUdfU05EX0JGNVhYX0hBVkVfQ09MRF9SRVNFVCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfU09DX0FMTF9DT0RFQ1MgaXMgbm90IHNldAorQ09ORklHX1NORF9TT0NfQUQxOTgwPW0KIENPTkZJR19TTkRfU09DX1NTTTI2MDI9bQotCi0jCi0jIE9wZW4gU291bmQgU3lzdGVtCi0jCiAjIENPTkZJR19TT1VORF9QUklNRSBpcyBub3Qgc2V0CitDT05GSUdfQUM5N19CVVM9bQogQ09ORklHX0hJRF9TVVBQT1JUPXkKIENPTkZJR19ISUQ9eQogIyBDT05GSUdfSElEX0RFQlVHIGlzIG5vdCBzZXQKQEAgLTk5Niw5ICs5OTgsMzYgQEAKICMgVVNCIElucHV0IERldmljZXMKICMKIENPTkZJR19VU0JfSElEPXkKLSMgQ09ORklHX1VTQl9ISURJTlBVVF9QT1dFUkJPT0sgaXMgbm90IHNldAotIyBDT05GSUdfSElEX0ZGIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hJRF9QSUQgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0hJRERFViBpcyBub3Qgc2V0CisKKyMKKyMgU3BlY2lhbCBISUQgZHJpdmVycworIworQ09ORklHX0hJRF9DT01QQVQ9eQorQ09ORklHX0hJRF9BNFRFQ0g9eQorQ09ORklHX0hJRF9BUFBMRT15CitDT05GSUdfSElEX0JFTEtJTj15CitDT05GSUdfSElEX0JSSUdIVD15CitDT05GSUdfSElEX0NIRVJSWT15CitDT05GSUdfSElEX0NISUNPTlk9eQorQ09ORklHX0hJRF9DWVBSRVNTPXkKK0NPTkZJR19ISURfREVMTD15CitDT05GSUdfSElEX0VaS0VZPXkKK0NPTkZJR19ISURfR1lSQVRJT049eQorQ09ORklHX0hJRF9MT0dJVEVDSD15CisjIENPTkZJR19MT0dJVEVDSF9GRiBpcyBub3Qgc2V0CisjIENPTkZJR19MT0dJUlVNQkxFUEFEMl9GRiBpcyBub3Qgc2V0CitDT05GSUdfSElEX01JQ1JPU09GVD15CitDT05GSUdfSElEX01PTlRFUkVZPXkKK0NPTkZJR19ISURfUEFOVEhFUkxPUkQ9eQorIyBDT05GSUdfUEFOVEhFUkxPUkRfRkYgaXMgbm90IHNldAorQ09ORklHX0hJRF9QRVRBTFlOWD15CitDT05GSUdfSElEX1NBTVNVTkc9eQorQ09ORklHX0hJRF9TT05ZPXkKK0NPTkZJR19ISURfU1VOUExVUz15CitDT05GSUdfVEhSVVNUTUFTVEVSX0ZGPW0KK0NPTkZJR19aRVJPUExVU19GRj1tCiBDT05GSUdfVVNCX1NVUFBPUlQ9eQogQ09ORklHX1VTQl9BUkNIX0hBU19IQ0Q9eQogIyBDT05GSUdfVVNCX0FSQ0hfSEFTX09IQ0kgaXMgbm90IHNldApAQCAtMTAxNiw2ICsxMDQ1LDkgQEAKICMgQ09ORklHX1VTQl9PVEcgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX09UR19XSElURUxJU1QgaXMgbm90IHNldAogQ09ORklHX1VTQl9PVEdfQkxBQ0tMSVNUX0hVQj15CitDT05GSUdfVVNCX01PTj15CisjIENPTkZJR19VU0JfV1VTQiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfV1VTQl9DQkFGIGlzIG5vdCBzZXQKIAogIwogIyBVU0IgSG9zdCBDb250cm9sbGVyIERyaXZlcnMKQEAgLTEwMjYsNiArMTA1OCw3IEBACiAjIENPTkZJR19VU0JfSVNQMTM2Ml9IQ0QgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX1NMODExX0hDRCBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfUjhBNjY1OTdfSENEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9IV0FfSENEIGlzIG5vdCBzZXQKIENPTkZJR19VU0JfTVVTQl9IRFJDPXkKIENPTkZJR19VU0JfTVVTQl9TT0M9eQogCkBAIC0xMDM3LDcgKzEwNzAsNyBAQAogIyBDT05GSUdfVVNCX01VU0JfT1RHIGlzIG5vdCBzZXQKIENPTkZJR19VU0JfTVVTQl9IRFJDX0hDRD15CiBDT05GSUdfTVVTQl9QSU9fT05MWT15Ci1DT05GSUdfVVNCX01VU0JfTE9HTEVWRUw9MAorIyBDT05GSUdfVVNCX01VU0JfREVCVUcgaXMgbm90IHNldAogCiAjCiAjIFVTQiBEZXZpY2UgQ2xhc3MgZHJpdmVycwpAQCAtMTA0NSw2ICsxMDc4LDcgQEAKICMgQ09ORklHX1VTQl9BQ00gaXMgbm90IHNldAogIyBDT05GSUdfVVNCX1BSSU5URVIgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX1dETSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfVE1DIGlzIG5vdCBzZXQKIAogIwogIyBOT1RFOiBVU0JfU1RPUkFHRSBlbmFibGVzIFNDU0ksIGFuZCAnU0NTSSBkaXNrIHN1cHBvcnQnCkBAIC0xMDU5LDcgKzEwOTMsNiBAQAogIyBVU0IgSW1hZ2luZyBkZXZpY2VzCiAjCiAjIENPTkZJR19VU0JfTURDODAwIGlzIG5vdCBzZXQKLUNPTkZJR19VU0JfTU9OPXkKIAogIwogIyBVU0IgcG9ydCBkcml2ZXJzCkBAIC0xMDcyLDcgKzExMDUsNyBAQAogIyBDT05GSUdfVVNCX0VNSTYyIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9FTUkyNiBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfQURVVFVYIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9BVUVSU1dBTEQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFVlNFRyBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfUklPNTAwIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9MRUdPVE9XRVIgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0xDRCBpcyBub3Qgc2V0CkBAIC0xMDg5LDYgKzExMjIsNyBAQAogIyBDT05GSUdfVVNCX1RSQU5DRVZJQlJBVE9SIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9JT1dBUlJJT1IgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0lTSUdIVEZXIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9WU1QgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0dBREdFVCBpcyBub3Qgc2V0CiAjIENPTkZJR19NTUMgaXMgbm90IHNldAogIyBDT05GSUdfTUVNU1RJQ0sgaXMgbm90IHNldApAQCAtMTEyOCwzNiArMTE2Miw0NSBAQAogIwogIyBTUEkgUlRDIGRyaXZlcnMKICMKKyMgQ09ORklHX1JUQ19EUlZfTTQxVDk0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfRFMxMzA1IGlzIG5vdCBzZXQKICMgQ09ORklHX1JUQ19EUlZfTUFYNjkwMiBpcyBub3Qgc2V0CiAjIENPTkZJR19SVENfRFJWX1I5NzAxIGlzIG5vdCBzZXQKICMgQ09ORklHX1JUQ19EUlZfUlM1QzM0OCBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0RTMzIzNCBpcyBub3Qgc2V0CiAKICMKICMgUGxhdGZvcm0gUlRDIGRyaXZlcnMKICMKKyMgQ09ORklHX1JUQ19EUlZfRFMxMjg2IGlzIG5vdCBzZXQKICMgQ09ORklHX1JUQ19EUlZfRFMxNTExIGlzIG5vdCBzZXQKICMgQ09ORklHX1JUQ19EUlZfRFMxNTUzIGlzIG5vdCBzZXQKICMgQ09ORklHX1JUQ19EUlZfRFMxNzQyIGlzIG5vdCBzZXQKICMgQ09ORklHX1JUQ19EUlZfU1RLMTdUQTggaXMgbm90IHNldAogIyBDT05GSUdfUlRDX0RSVl9NNDhUODYgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9NNDhUMzUgaXMgbm90IHNldAogIyBDT05GSUdfUlRDX0RSVl9NNDhUNTkgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9CUTQ4MDIgaXMgbm90IHNldAogIyBDT05GSUdfUlRDX0RSVl9WMzAyMCBpcyBub3Qgc2V0CiAKICMKICMgb24tQ1BVIFJUQyBkcml2ZXJzCiAjCiBDT05GSUdfUlRDX0RSVl9CRklOPXkKKyMgQ09ORklHX0RNQURFVklDRVMgaXMgbm90IHNldAogIyBDT05GSUdfVUlPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NUQUdJTkcgaXMgbm90IHNldAogCiAjCiAjIEZpbGUgc3lzdGVtcwogIwogIyBDT05GSUdfRVhUMl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19FWFQzX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VYVDRERVZfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRVhUNF9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19SRUlTRVJGU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19KRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKK0NPTkZJR19GSUxFX0xPQ0tJTkc9eQogIyBDT05GSUdfWEZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX09DRlMyX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0ROT1RJRlkgaXMgbm90IHNldApAQCAtMTIyNSw2ICsxMjY4LDcgQEAKICMgQ09ORklHX0NSQU1GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19WWEZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX01JTklYX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX09NRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfSFBGU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19RTlg0RlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldApAQCAtMTI0MCw3ICsxMjg0LDcgQEAKIENPTkZJR19MT0NLRF9WND15CiBDT05GSUdfTkZTX0NPTU1PTj15CiBDT05GSUdfU1VOUlBDPW0KLSMgQ09ORklHX1NVTlJQQ19CSU5EMzQgaXMgbm90IHNldAorIyBDT05GSUdfU1VOUlBDX1JFR0lTVEVSX1Y0IGlzIG5vdCBzZXQKICMgQ09ORklHX1JQQ1NFQ19HU1NfS1JCNSBpcyBub3Qgc2V0CiAjIENPTkZJR19SUENTRUNfR1NTX1NQS00zIGlzIG5vdCBzZXQKIENPTkZJR19TTUJfRlM9bQpAQCAtMTMwOCwxMCArMTM1Miw0OCBAQAogIyBDT05GSUdfVU5VU0VEX1NZTUJPTFMgaXMgbm90IHNldAogQ09ORklHX0RFQlVHX0ZTPXkKICMgQ09ORklHX0hFQURFUlNfQ0hFQ0sgaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfS0VSTkVMIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19LRVJORUw9eQorIyBDT05GSUdfREVCVUdfU0hJUlEgaXMgbm90IHNldAorQ09ORklHX0RFVEVDVF9TT0ZUTE9DS1VQPXkKKyMgQ09ORklHX0JPT1RQQVJBTV9TT0ZUTE9DS1VQX1BBTklDIGlzIG5vdCBzZXQKK0NPTkZJR19CT09UUEFSQU1fU09GVExPQ0tVUF9QQU5JQ19WQUxVRT0wCitDT05GSUdfU0NIRURfREVCVUc9eQorIyBDT05GSUdfU0NIRURTVEFUUyBpcyBub3Qgc2V0CisjIENPTkZJR19USU1FUl9TVEFUUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19PQkpFQ1RTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NMQUIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfUlRfTVVURVhFUyBpcyBub3Qgc2V0CisjIENPTkZJR19SVF9NVVRFWF9URVNURVIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU1BJTkxPQ0sgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfTVVURVhFUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TUElOTE9DS19TTEVFUCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19MT0NLSU5HX0FQSV9TRUxGVEVTVFMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfS09CSkVDVCBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19CVUdWRVJCT1NFIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19JTkZPPXkKKyMgQ09ORklHX0RFQlVHX1ZNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1dSSVRFQ09VTlQgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfTUVNT1JZX0lOSVQgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfTElTVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TRyBpcyBub3Qgc2V0CisjIENPTkZJR19GUkFNRV9QT0lOVEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JPT1RfUFJJTlRLX0RFTEFZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JDVV9UT1JUVVJFX1RFU1QgaXMgbm90IHNldAorIyBDT05GSUdfUkNVX0NQVV9TVEFMTF9ERVRFQ1RPUiBpcyBub3Qgc2V0CisjIENPTkZJR19CQUNLVFJBQ0VfU0VMRl9URVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0JMT0NLX0VYVF9ERVZUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZBVUxUX0lOSkVDVElPTiBpcyBub3Qgc2V0CitDT05GSUdfU1lTQ1RMX1NZU0NBTExfQ0hFQ0s9eQorIyBDT05GSUdfRFlOQU1JQ19QUklOVEtfREVCVUcgaXMgbm90IHNldAogIyBDT05GSUdfU0FNUExFUyBpcyBub3Qgc2V0CitDT05GSUdfSEFWRV9BUkNIX0tHREI9eQorIyBDT05GSUdfS0dEQiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TVEFDS09WRVJGTE9XIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NUQUNLX1VTQUdFIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19WRVJCT1NFPXkKIENPTkZJR19ERUJVR19NTVJTPXkKKyMgQ09ORklHX0RFQlVHX0hXRVJSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0RPVUJMRUZBVUxUIGlzIG5vdCBzZXQKIENPTkZJR19ERUJVR19IVU5UX0ZPUl9aRVJPPXkKIENPTkZJR19ERUJVR19CRklOX0hXVFJBQ0VfT049eQogQ09ORklHX0RFQlVHX0JGSU5fSFdUUkFDRV9DT01QUkVTU0lPTl9PRkY9eQpAQCAtMTMyOSw4ICsxNDExLDkgQEAKICMKICMgQ09ORklHX0tFWVMgaXMgbm90IHNldAogQ09ORklHX1NFQ1VSSVRZPXkKKyMgQ09ORklHX1NFQ1VSSVRZRlMgaXMgbm90IHNldAogIyBDT05GSUdfU0VDVVJJVFlfTkVUV09SSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRUNVUklUWV9DQVBBQklMSVRJRVMgaXMgbm90IHNldAorIyBDT05GSUdfU0VDVVJJVFlfRklMRV9DQVBBQklMSVRJRVMgaXMgbm90IHNldAogIyBDT05GSUdfU0VDVVJJVFlfUk9PVFBMVUcgaXMgbm90IHNldAogQ09ORklHX1NFQ1VSSVRZX0RFRkFVTFRfTU1BUF9NSU5fQUREUj0wCiBDT05GSUdfQ1JZUFRPPXkKQEAgLTEzMzgsNiArMTQyMSw3IEBACiAjCiAjIENyeXB0byBjb3JlIG9yIGhlbHBlcgogIworIyBDT05GSUdfQ1JZUFRPX0ZJUFMgaXMgbm90IHNldAogIyBDT05GSUdfQ1JZUFRPX01BTkFHRVIgaXMgbm90IHNldAogIyBDT05GSUdfQ1JZUFRPX0dGMTI4TVVMIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSWVBUT19OVUxMIGlzIG5vdCBzZXQKQEAgLTEzNzYsNiArMTQ2MCwxMCBAQAogIyBDT05GSUdfQ1JZUFRPX01ENCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUllQVE9fTUQ1IGlzIG5vdCBzZXQKICMgQ09ORklHX0NSWVBUT19NSUNIQUVMX01JQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fUk1EMTI4IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19STUQxNjAgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1JNRDI1NiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fUk1EMzIwIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSWVBUT19TSEExIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSWVBUT19TSEEyNTYgaXMgbm90IHNldAogIyBDT05GSUdfQ1JZUFRPX1NIQTUxMiBpcyBub3Qgc2V0CkBAIC0xNDA2LDE1ICsxNDk0LDIwIEBACiAjCiAjIENPTkZJR19DUllQVE9fREVGTEFURSBpcyBub3Qgc2V0CiAjIENPTkZJR19DUllQVE9fTFpPIGlzIG5vdCBzZXQKKworIworIyBSYW5kb20gTnVtYmVyIEdlbmVyYXRpb24KKyMKKyMgQ09ORklHX0NSWVBUT19BTlNJX0NQUk5HIGlzIG5vdCBzZXQKIENPTkZJR19DUllQVE9fSFc9eQogCiAjCiAjIExpYnJhcnkgcm91dGluZXMKICMKIENPTkZJR19CSVRSRVZFUlNFPXkKLSMgQ09ORklHX0dFTkVSSUNfRklORF9GSVJTVF9CSVQgaXMgbm90IHNldAogQ09ORklHX0NSQ19DQ0lUVD1tCiAjIENPTkZJR19DUkMxNiBpcyBub3Qgc2V0CisjIENPTkZJR19DUkNfVDEwRElGIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSQ19JVFVfVCBpcyBub3Qgc2V0CiBDT05GSUdfQ1JDMzI9eQogIyBDT05GSUdfQ1JDNyBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvQkY1MjctRVpLSVRfZGVmY29uZmlnIGIvYXJjaC9ibGFja2Zpbi9jb25maWdzL0JGNTI3LUVaS0lUX2RlZmNvbmZpZwppbmRleCA0YTJhNjYwLi5mOTI2NjhhIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvQkY1MjctRVpLSVRfZGVmY29uZmlnCisrKyBiL2FyY2gvYmxhY2tmaW4vY29uZmlncy9CRjUyNy1FWktJVF9kZWZjb25maWcKQEAgLTEsNiArMSw2IEBACiAjCiAjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0Ci0jIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMjQuNworIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjI4LXJjMgogIwogIyBDT05GSUdfTU1VIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZQVSBpcyBub3Qgc2V0CkBAIC04LDcgKzgsNiBAQAogIyBDT05GSUdfUldTRU1fWENIR0FERF9BTEdPUklUSE0gaXMgbm90IHNldAogQ09ORklHX0JMQUNLRklOPXkKIENPTkZJR19aT05FX0RNQT15Ci1DT05GSUdfU0VNQVBIT1JFX1NMRUVQRVJTPXkKIENPTkZJR19HRU5FUklDX0ZJTkRfTkVYVF9CSVQ9eQogQ09ORklHX0dFTkVSSUNfSFdFSUdIVD15CiBDT05GSUdfR0VORVJJQ19IQVJESVJRUz15CkBAIC0zMSwxOCArMzAsMTYgQEAKICMgQ09ORklHX1BPU0lYX01RVUVVRSBpcyBub3Qgc2V0CiAjIENPTkZJR19CU0RfUFJPQ0VTU19BQ0NUIGlzIG5vdCBzZXQKICMgQ09ORklHX1RBU0tTVEFUUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0VSX05TIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BJRF9OUyBpcyBub3Qgc2V0CiAjIENPTkZJR19BVURJVCBpcyBub3Qgc2V0CiBDT05GSUdfSUtDT05GSUc9eQogQ09ORklHX0lLQ09ORklHX1BST0M9eQogQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKICMgQ09ORklHX0NHUk9VUFMgaXMgbm90IHNldAotQ09ORklHX0ZBSVJfR1JPVVBfU0NIRUQ9eQotQ09ORklHX0ZBSVJfVVNFUl9TQ0hFRD15Ci0jIENPTkZJR19GQUlSX0NHUk9VUF9TQ0hFRCBpcyBub3Qgc2V0Ci1DT05GSUdfU1lTRlNfREVQUkVDQVRFRD15CisjIENPTkZJR19HUk9VUF9TQ0hFRCBpcyBub3Qgc2V0CisjIENPTkZJR19TWVNGU19ERVBSRUNBVEVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU0ZTX0RFUFJFQ0FURURfVjIgaXMgbm90IHNldAogIyBDT05GSUdfUkVMQVkgaXMgbm90IHNldAorIyBDT05GSUdfTkFNRVNQQUNFUyBpcyBub3Qgc2V0CiBDT05GSUdfQkxLX0RFVl9JTklUUkQ9eQogQ09ORklHX0lOSVRSQU1GU19TT1VSQ0U9IiIKICMgQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFIGlzIG5vdCBzZXQKQEAgLTUxLDI2ICs0OCwzNSBAQAogQ09ORklHX1VJRDE2PXkKIENPTkZJR19TWVNDVExfU1lTQ0FMTD15CiBDT05GSUdfS0FMTFNZTVM9eQorIyBDT05GSUdfS0FMTFNZTVNfQUxMIGlzIG5vdCBzZXQKICMgQ09ORklHX0tBTExTWU1TX0VYVFJBX1BBU1MgaXMgbm90IHNldAogQ09ORklHX0hPVFBMVUc9eQogQ09ORklHX1BSSU5USz15CiBDT05GSUdfQlVHPXkKLUNPTkZJR19FTEZfQ09SRT15CisjIENPTkZJR19FTEZfQ09SRSBpcyBub3Qgc2V0CitDT05GSUdfQ09NUEFUX0JSSz15CiBDT05GSUdfQkFTRV9GVUxMPXkKIENPTkZJR19GVVRFWD15CiBDT05GSUdfQU5PTl9JTk9ERVM9eQogQ09ORklHX0VQT0xMPXkKIENPTkZJR19TSUdOQUxGRD15CitDT05GSUdfVElNRVJGRD15CiBDT05GSUdfRVZFTlRGRD15CitDT05GSUdfQUlPPXkKIENPTkZJR19WTV9FVkVOVF9DT1VOVEVSUz15CiBDT05GSUdfU0xBQj15CiAjIENPTkZJR19TTFVCIGlzIG5vdCBzZXQKICMgQ09ORklHX1NMT0IgaXMgbm90IHNldAorIyBDT05GSUdfUFJPRklMSU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BUktFUlMgaXMgbm90IHNldAorQ09ORklHX0hBVkVfT1BST0ZJTEU9eQorIyBDT05GSUdfSEFWRV9HRU5FUklDX0RNQV9DT0hFUkVOVCBpcyBub3Qgc2V0CiBDT05GSUdfU0xBQklORk89eQogQ09ORklHX1JUX01VVEVYRVM9eQogQ09ORklHX1RJTllfU0hNRU09eQogQ09ORklHX0JBU0VfU01BTEw9MAogQ09ORklHX01PRFVMRVM9eQorIyBDT05GSUdfTU9EVUxFX0ZPUkNFX0xPQUQgaXMgbm90IHNldAogQ09ORklHX01PRFVMRV9VTkxPQUQ9eQogIyBDT05GSUdfTU9EVUxFX0ZPUkNFX1VOTE9BRCBpcyBub3Qgc2V0CiAjIENPTkZJR19NT0RWRVJTSU9OUyBpcyBub3Qgc2V0CkBAIC04MSw2ICs4Nyw3IEBACiAjIENPTkZJR19CTEtfREVWX0lPX1RSQUNFIGlzIG5vdCBzZXQKICMgQ09ORklHX0xTRiBpcyBub3Qgc2V0CiAjIENPTkZJR19CTEtfREVWX0JTRyBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0lOVEVHUklUWSBpcyBub3Qgc2V0CiAKICMKICMgSU8gU2NoZWR1bGVycwpAQCAtOTQsOSArMTAxLDExIEBACiAjIENPTkZJR19ERUZBVUxUX0NGUSBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUZBVUxUX05PT1AgaXMgbm90IHNldAogQ09ORklHX0RFRkFVTFRfSU9TQ0hFRD0iYW50aWNpcGF0b3J5IgorQ09ORklHX0NMQVNTSUNfUkNVPXkKICMgQ09ORklHX1BSRUVNUFRfTk9ORSBpcyBub3Qgc2V0CiBDT05GSUdfUFJFRU1QVF9WT0xVTlRBUlk9eQogIyBDT05GSUdfUFJFRU1QVCBpcyBub3Qgc2V0CisjIENPTkZJR19GUkVFWkVSIGlzIG5vdCBzZXQKIAogIwogIyBCbGFja2ZpbiBQcm9jZXNzb3IgT3B0aW9ucwpAQCAtMTA1LDYgKzExNCwxMCBAQAogIwogIyBQcm9jZXNzb3IgYW5kIEJvYXJkIFNldHRpbmdzCiAjCisjIENPTkZJR19CRjUxMiBpcyBub3Qgc2V0CisjIENPTkZJR19CRjUxNCBpcyBub3Qgc2V0CisjIENPTkZJR19CRjUxNiBpcyBub3Qgc2V0CisjIENPTkZJR19CRjUxOCBpcyBub3Qgc2V0CiAjIENPTkZJR19CRjUyMiBpcyBub3Qgc2V0CiAjIENPTkZJR19CRjUyMyBpcyBub3Qgc2V0CiAjIENPTkZJR19CRjUyNCBpcyBub3Qgc2V0CkBAIC0xMTcsMjMgKzEzMCw3NCBAQAogIyBDT05GSUdfQkY1MzQgaXMgbm90IHNldAogIyBDT05GSUdfQkY1MzYgaXMgbm90IHNldAogIyBDT05GSUdfQkY1MzcgaXMgbm90IHNldAorIyBDT05GSUdfQkY1MzggaXMgbm90IHNldAorIyBDT05GSUdfQkY1MzkgaXMgbm90IHNldAogIyBDT05GSUdfQkY1NDIgaXMgbm90IHNldAogIyBDT05GSUdfQkY1NDQgaXMgbm90IHNldAogIyBDT05GSUdfQkY1NDcgaXMgbm90IHNldAogIyBDT05GSUdfQkY1NDggaXMgbm90IHNldAogIyBDT05GSUdfQkY1NDkgaXMgbm90IHNldAogIyBDT05GSUdfQkY1NjEgaXMgbm90IHNldAorQ09ORklHX0JGX1JFVl9NSU49MAorQ09ORklHX0JGX1JFVl9NQVg9MgogQ09ORklHX0JGX1JFVl8wXzA9eQogIyBDT05GSUdfQkZfUkVWXzBfMSBpcyBub3Qgc2V0CiAjIENPTkZJR19CRl9SRVZfMF8yIGlzIG5vdCBzZXQKICMgQ09ORklHX0JGX1JFVl8wXzMgaXMgbm90IHNldAogIyBDT05GSUdfQkZfUkVWXzBfNCBpcyBub3Qgc2V0CiAjIENPTkZJR19CRl9SRVZfMF81IGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGX1JFVl8wXzYgaXMgbm90IHNldAogIyBDT05GSUdfQkZfUkVWX0FOWSBpcyBub3Qgc2V0CiAjIENPTkZJR19CRl9SRVZfTk9ORSBpcyBub3Qgc2V0CiBDT05GSUdfQkY1Mng9eQogQ09ORklHX01FTV9NVDQ4TEMzMk0xNkEyVEdfNzU9eQorQ09ORklHX0lSUV9QTExfV0FLRVVQPTcKK0NPTkZJR19JUlFfRE1BMF9FUlJPUj03CitDT05GSUdfSVJRX0RNQVIwX0JMSz03CitDT05GSUdfSVJRX0RNQVIxX0JMSz03CitDT05GSUdfSVJRX0RNQVIwX09WUj03CitDT05GSUdfSVJRX0RNQVIxX09WUj03CitDT05GSUdfSVJRX1BQSV9FUlJPUj03CitDT05GSUdfSVJRX01BQ19FUlJPUj03CitDT05GSUdfSVJRX1NQT1JUMF9FUlJPUj03CitDT05GSUdfSVJRX1NQT1JUMV9FUlJPUj03CitDT05GSUdfSVJRX1VBUlQwX0VSUk9SPTcKK0NPTkZJR19JUlFfVUFSVDFfRVJST1I9NworQ09ORklHX0lSUV9SVEM9OAorQ09ORklHX0lSUV9QUEk9OAorQ09ORklHX0lSUV9TUE9SVDBfUlg9OQorQ09ORklHX0lSUV9TUE9SVDBfVFg9OQorQ09ORklHX0lSUV9TUE9SVDFfUlg9OQorQ09ORklHX0lSUV9TUE9SVDFfVFg9OQorQ09ORklHX0lSUV9UV0k9MTAKK0NPTkZJR19JUlFfVUFSVDBfUlg9MTAKK0NPTkZJR19JUlFfVUFSVDBfVFg9MTAKK0NPTkZJR19JUlFfVUFSVDFfUlg9MTAKK0NPTkZJR19JUlFfVUFSVDFfVFg9MTAKK0NPTkZJR19JUlFfT1BUU0VDPTExCitDT05GSUdfSVJRX0NOVD0xMQorQ09ORklHX0lSUV9NQUNfUlg9MTEKK0NPTkZJR19JUlFfUE9SVEhfSU5UQT0xMQorQ09ORklHX0lSUV9NQUNfVFg9MTEKK0NPTkZJR19JUlFfUE9SVEhfSU5UQj0xMQorQ09ORklHX0lSUV9USU1FUjA9OAorQ09ORklHX0lSUV9USU1FUjE9MTIKK0NPTkZJR19JUlFfVElNRVIyPTEyCitDT05GSUdfSVJRX1RJTUVSMz0xMgorQ09ORklHX0lSUV9USU1FUjQ9MTIKK0NPTkZJR19JUlFfVElNRVI1PTEyCitDT05GSUdfSVJRX1RJTUVSNj0xMgorQ09ORklHX0lSUV9USU1FUjc9MTIKK0NPTkZJR19JUlFfUE9SVEdfSU5UQT0xMgorQ09ORklHX0lSUV9QT1JUR19JTlRCPTEyCitDT05GSUdfSVJRX01FTV9ETUEwPTEzCitDT05GSUdfSVJRX01FTV9ETUExPTEzCitDT05GSUdfSVJRX1dBVENIPTEzCitDT05GSUdfSVJRX1BPUlRGX0lOVEE9MTMKK0NPTkZJR19JUlFfUE9SVEZfSU5UQj0xMwogQ09ORklHX0JGSU41MjdfRVpLSVQ9eQorIyBDT05GSUdfQkZJTjUyN19CTFVFVEVDSE5JWF9DTSBpcyBub3Qgc2V0CisjIENPTkZJR19CRklONTI2X0VaQlJEIGlzIG5vdCBzZXQKIAogIwogIyBCRjUyNyBTcGVjaWZpYyBDb25maWd1cmF0aW9uCkBAIC0xNTgsNTEgKzIyMiw3IEBACiAjCiAjIFByaW9yaXR5CiAjCi1DT05GSUdfSVJRX1BMTF9XQUtFVVA9NwotQ09ORklHX0lSUV9ETUEwX0VSUk9SPTcKLUNPTkZJR19JUlFfRE1BUjBfQkxLPTcKLUNPTkZJR19JUlFfRE1BUjFfQkxLPTcKLUNPTkZJR19JUlFfRE1BUjBfT1ZSPTcKLUNPTkZJR19JUlFfRE1BUjFfT1ZSPTcKLUNPTkZJR19JUlFfUFBJX0VSUk9SPTcKLUNPTkZJR19JUlFfTUFDX0VSUk9SPTcKLUNPTkZJR19JUlFfU1BPUlQwX0VSUk9SPTcKLUNPTkZJR19JUlFfU1BPUlQxX0VSUk9SPTcKLUNPTkZJR19JUlFfVUFSVDBfRVJST1I9NwotQ09ORklHX0lSUV9VQVJUMV9FUlJPUj03Ci1DT05GSUdfSVJRX1JUQz04Ci1DT05GSUdfSVJRX1BQST04Ci1DT05GSUdfSVJRX1NQT1JUMF9SWD05Ci1DT05GSUdfSVJRX1NQT1JUMF9UWD05Ci1DT05GSUdfSVJRX1NQT1JUMV9SWD05Ci1DT05GSUdfSVJRX1NQT1JUMV9UWD05Ci1DT05GSUdfSVJRX1RXST0xMAogQ09ORklHX0lSUV9TUEk9MTAKLUNPTkZJR19JUlFfVUFSVDBfUlg9MTAKLUNPTkZJR19JUlFfVUFSVDBfVFg9MTAKLUNPTkZJR19JUlFfVUFSVDFfUlg9MTAKLUNPTkZJR19JUlFfVUFSVDFfVFg9MTAKLUNPTkZJR19JUlFfT1BUU0VDPTExCi1DT05GSUdfSVJRX0NOVD0xMQotQ09ORklHX0lSUV9NQUNfUlg9MTEKLUNPTkZJR19JUlFfUE9SVEhfSU5UQT0xMQotQ09ORklHX0lSUV9NQUNfVFg9MTEKLUNPTkZJR19JUlFfUE9SVEhfSU5UQj0xMQotQ09ORklHX0lSUV9UTVIwPTEyCi1DT05GSUdfSVJRX1RNUjE9MTIKLUNPTkZJR19JUlFfVE1SMj0xMgotQ09ORklHX0lSUV9UTVIzPTEyCi1DT05GSUdfSVJRX1RNUjQ9MTIKLUNPTkZJR19JUlFfVE1SNT0xMgotQ09ORklHX0lSUV9UTVI2PTEyCi1DT05GSUdfSVJRX1RNUjc9MTIKLUNPTkZJR19JUlFfUE9SVEdfSU5UQT0xMgotQ09ORklHX0lSUV9QT1JUR19JTlRCPTEyCi1DT05GSUdfSVJRX01FTV9ETUEwPTEzCi1DT05GSUdfSVJRX01FTV9ETUExPTEzCi1DT05GSUdfSVJRX1dBVENIPTEzCi1DT05GSUdfSVJRX1BPUlRGX0lOVEE9MTMKLUNPTkZJR19JUlFfUE9SVEZfSU5UQj0xMwogQ09ORklHX0lSUV9TUElfRVJST1I9NwogQ09ORklHX0lSUV9ORkNfRVJST1I9NwogQ09ORklHX0lSUV9IRE1BX0VSUk9SPTcKQEAgLTIyNCw3ICsyNDQsNiBAQAogIwogQ09ORklHX0NMS0lOX0haPTI1MDAwMDAwCiAjIENPTkZJR19CRklOX0tFUk5FTF9DTE9DSyBpcyBub3Qgc2V0Ci1DT05GSUdfTUFYX01FTV9TSVpFPTUxMgogQ09ORklHX01BWF9WQ09fSFo9NjAwMDAwMDAwCiBDT05GSUdfTUlOX1ZDT19IWj01MDAwMDAwMAogQ09ORklHX01BWF9TQ0xLX0haPTEzMzMzMzMzMwpAQCAtMjM4LDEwICsyNTcsMTAgQEAKICMgQ09ORklHX0haXzMwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19IWl8xMDAwIGlzIG5vdCBzZXQKIENPTkZJR19IWj0yNTAKKyMgQ09ORklHX1NDSEVEX0hSVElDSyBpcyBub3Qgc2V0CiBDT05GSUdfR0VORVJJQ19USU1FPXkKIENPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTPXkKICMgQ09ORklHX0NZQ0xFU19DTE9DS1NPVVJDRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19USUNLX09ORVNIT1QgaXMgbm90IHNldAogIyBDT05GSUdfTk9fSFogaXMgbm90IHNldAogIyBDT05GSUdfSElHSF9SRVNfVElNRVJTIGlzIG5vdCBzZXQKIENPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTX0JVSUxEPXkKQEAgLTI3NSw2ICsyOTQsMTIgQEAKIENPTkZJR19DQUNIRUxJTkVfQUxJR05FRF9MMT15CiAjIENPTkZJR19TWVNDQUxMX1RBQl9MMSBpcyBub3Qgc2V0CiAjIENPTkZJR19DUExCX1NXSVRDSF9UQUJfTDEgaXMgbm90IHNldAorQ09ORklHX0FQUF9TVEFDS19MMT15CisKKyMKKyMgU3BlZWQgT3B0aW1pemF0aW9ucworIworQ09ORklHX0JGSU5fSU5TX0xPV09WRVJIRUFEPXkKIENPTkZJR19SQU1LRVJORUw9eQogIyBDT05GSUdfUk9NS0VSTkVMIGlzIG5vdCBzZXQKIENPTkZJR19TRUxFQ1RfTUVNT1JZX01PREVMPXkKQEAgLTI4MywxNCArMzA4LDEzIEBACiAjIENPTkZJR19TUEFSU0VNRU1fTUFOVUFMIGlzIG5vdCBzZXQKIENPTkZJR19GTEFUTUVNPXkKIENPTkZJR19GTEFUX05PREVfTUVNX01BUD15Ci0jIENPTkZJR19TUEFSU0VNRU1fU1RBVElDIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NQQVJTRU1FTV9WTUVNTUFQX0VOQUJMRSBpcyBub3Qgc2V0CitDT05GSUdfUEFHRUZMQUdTX0VYVEVOREVEPXkKIENPTkZJR19TUExJVF9QVExPQ0tfQ1BVUz00CiAjIENPTkZJR19SRVNPVVJDRVNfNjRCSVQgaXMgbm90IHNldAorIyBDT05GSUdfUEhZU19BRERSX1RfNjRCSVQgaXMgbm90IHNldAogQ09ORklHX1pPTkVfRE1BX0ZMQUc9MQogQ09ORklHX1ZJUlRfVE9fQlVTPXkKIENPTkZJR19CRklOX0dQVElNRVJTPXkKLUNPTkZJR19CRklOX0RNQV81WFg9eQogIyBDT05GSUdfRE1BX1VOQ0FDSEVEXzRNIGlzIG5vdCBzZXQKICMgQ09ORklHX0RNQV9VTkNBQ0hFRF8yTSBpcyBub3Qgc2V0CiBDT05GSUdfRE1BX1VOQ0FDSEVEXzFNPXkKQEAgLTMwNSw3ICszMjksNiBAQAogIyBDT05GSUdfQkZJTl9JQ0FDSEVfTE9DSyBpcyBub3Qgc2V0CiAjIENPTkZJR19CRklOX1dCIGlzIG5vdCBzZXQKIENPTkZJR19CRklOX1dUPXkKLUNPTkZJR19MMV9NQVhfUElFQ0U9MTYKICMgQ09ORklHX01QVSBpcyBub3Qgc2V0CiAKICMKQEAgLTMzNCw3ICszNTcsNiBAQAogIwogIyBCdXMgb3B0aW9ucyAoUENJLCBQQ01DSUEsIEVJU0EsIE1DQSwgSVNBKQogIwotIyBDT05GSUdfUENJIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfU1VQUE9SVFNfTVNJIGlzIG5vdCBzZXQKICMgQ09ORklHX1BDQ0FSRCBpcyBub3Qgc2V0CiAKQEAgLTM0NSwyMyArMzY3LDIwIEBACiBDT05GSUdfQklORk1UX0ZMQVQ9eQogQ09ORklHX0JJTkZNVF9aRkxBVD15CiAjIENPTkZJR19CSU5GTVRfU0hBUkVEX0ZMQVQgaXMgbm90IHNldAorIyBDT05GSUdfSEFWRV9BT1VUIGlzIG5vdCBzZXQKICMgQ09ORklHX0JJTkZNVF9NSVNDIGlzIG5vdCBzZXQKIAogIwogIyBQb3dlciBtYW5hZ2VtZW50IG9wdGlvbnMKICMKICMgQ09ORklHX1BNIGlzIG5vdCBzZXQKLUNPTkZJR19TVVNQRU5EX1VQX1BPU1NJQkxFPXkKK0NPTkZJR19BUkNIX1NVU1BFTkRfUE9TU0lCTEU9eQogIyBDT05GSUdfUE1fV0FLRVVQX0JZX0dQSU8gaXMgbm90IHNldAogCiAjCiAjIENQVSBGcmVxdWVuY3kgc2NhbGluZwogIwogIyBDT05GSUdfQ1BVX0ZSRVEgaXMgbm90IHNldAotCi0jCi0jIE5ldHdvcmtpbmcKLSMKIENPTkZJR19ORVQ9eQogCiAjCkBAIC0zNzQsNiArMzkzLDcgQEAKICMgQ09ORklHX1hGUk1fVVNFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19YRlJNX1NVQl9QT0xJQ1kgaXMgbm90IHNldAogIyBDT05GSUdfWEZSTV9NSUdSQVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1hGUk1fU1RBVElTVElDUyBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRfS0VZIGlzIG5vdCBzZXQKIENPTkZJR19JTkVUPXkKICMgQ09ORklHX0lQX01VTFRJQ0FTVCBpcyBub3Qgc2V0CkBAIC00MDMsOCArNDIzLDYgQEAKIENPTkZJR19ERUZBVUxUX1RDUF9DT05HPSJjdWJpYyIKICMgQ09ORklHX1RDUF9NRDVTSUcgaXMgbm90IHNldAogIyBDT05GSUdfSVBWNiBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkVUNl9YRlJNX1RVTk5FTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkVUNl9UVU5ORUwgaXMgbm90IHNldAogIyBDT05GSUdfTkVUTEFCRUwgaXMgbm90IHNldAogIyBDT05GSUdfTkVUV09SS19TRUNNQVJLIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVEZJTFRFUiBpcyBub3Qgc2V0CkBAIC00MTMsNiArNDMxLDcgQEAKICMgQ09ORklHX1RJUEMgaXMgbm90IHNldAogIyBDT05GSUdfQVRNIGlzIG5vdCBzZXQKICMgQ09ORklHX0JSSURHRSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfRFNBIGlzIG5vdCBzZXQKICMgQ09ORklHX1ZMQU5fODAyMVEgaXMgbm90IHNldAogIyBDT05GSUdfREVDTkVUIGlzIG5vdCBzZXQKICMgQ09ORklHX0xMQzIgaXMgbm90IHNldApAQCAtNDI5LDYgKzQ0OCw3IEBACiAjCiAjIENPTkZJR19ORVRfUEtUR0VOIGlzIG5vdCBzZXQKICMgQ09ORklHX0hBTVJBRElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NBTiBpcyBub3Qgc2V0CiBDT05GSUdfSVJEQT1tCiAKICMKQEAgLTQ2NywxNSArNDg3LDYgQEAKICMgQ09ORklHX0tTOTU5X0RPTkdMRSBpcyBub3Qgc2V0CiAKICMKLSMgT2xkIFNJUiBkZXZpY2UgZHJpdmVycwotIwotIyBDT05GSUdfSVJQT1JUX1NJUiBpcyBub3Qgc2V0Ci0KLSMKLSMgT2xkIFNlcmlhbCBkb25nbGUgc3VwcG9ydAotIwotCi0jCiAjIEZJUiBkZXZpY2UgZHJpdmVycwogIwogIyBDT05GSUdfVVNCX0lSREEgaXMgbm90IHNldApAQCAtNDgzLDExICs0OTQsMTAgQEAKICMgQ09ORklHX01DU19GSVIgaXMgbm90IHNldAogIyBDT05GSUdfQlQgaXMgbm90IHNldAogIyBDT05GSUdfQUZfUlhSUEMgaXMgbm90IHNldAotCi0jCi0jIFdpcmVsZXNzCi0jCisjIENPTkZJR19QSE9ORVQgaXMgbm90IHNldAorQ09ORklHX1dJUkVMRVNTPXkKICMgQ09ORklHX0NGRzgwMjExIGlzIG5vdCBzZXQKK0NPTkZJR19XSVJFTEVTU19PTERfUkVHVUxBVE9SWT15CiAjIENPTkZJR19XSVJFTEVTU19FWFQgaXMgbm90IHNldAogIyBDT05GSUdfTUFDODAyMTEgaXMgbm90IHNldAogIyBDT05GSUdfSUVFRTgwMjExIGlzIG5vdCBzZXQKQEAgLTUwNSw2ICs1MTUsOCBAQAogQ09ORklHX1NUQU5EQUxPTkU9eQogQ09ORklHX1BSRVZFTlRfRklSTVdBUkVfQlVJTEQ9eQogIyBDT05GSUdfRldfTE9BREVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0RSSVZFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19ERVZSRVMgaXMgbm90IHNldAogIyBDT05GSUdfU1lTX0hZUEVSVklTT1IgaXMgbm90IHNldAogIyBDT05GSUdfQ09OTkVDVE9SIGlzIG5vdCBzZXQKIENPTkZJR19NVEQ9eQpAQCAtNTEzLDYgKzUyNSw3IEBACiBDT05GSUdfTVREX1BBUlRJVElPTlM9eQogIyBDT05GSUdfTVREX1JFREJPT1RfUEFSVFMgaXMgbm90IHNldAogIyBDT05GSUdfTVREX0NNRExJTkVfUEFSVFMgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0FSN19QQVJUUyBpcyBub3Qgc2V0CiAKICMKICMgVXNlciBNb2R1bGVzIEFuZCBUcmFuc2xhdGlvbiBMYXllcnMKQEAgLTU1Niw2ICs1NjksNyBAQAogIwogQ09ORklHX01URF9DT01QTEVYX01BUFBJTkdTPXkKICMgQ09ORklHX01URF9QSFlTTUFQIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9HUElPX0FERFIgaXMgbm90IHNldAogIyBDT05GSUdfTVREX1VDTElOVVggaXMgbm90IHNldAogIyBDT05GSUdfTVREX1BMQVRSQU0gaXMgbm90IHNldAogCkBAIC01NjMsNyArNTc3LDggQEAKICMgU2VsZi1jb250YWluZWQgTVREIGRldmljZSBkcml2ZXJzCiAjCiAjIENPTkZJR19NVERfREFUQUZMQVNIIGlzIG5vdCBzZXQKLSMgQ09ORklHX01URF9NMjVQODAgaXMgbm90IHNldAorQ09ORklHX01URF9NMjVQODA9eQorQ09ORklHX00yNVBYWF9VU0VfRkFTVF9SRUFEPXkKICMgQ09ORklHX01URF9TTFJBTSBpcyBub3Qgc2V0CiAjIENPTkZJR19NVERfUEhSQU0gaXMgbm90IHNldAogIyBDT05GSUdfTVREX01URFJBTSBpcyBub3Qgc2V0CkBAIC02MDUsMTEgKzYyMCwxNCBAQAogQ09ORklHX0JMS19ERVZfUkFNPXkKIENPTkZJR19CTEtfREVWX1JBTV9DT1VOVD0xNgogQ09ORklHX0JMS19ERVZfUkFNX1NJWkU9NDA5NgotQ09ORklHX0JMS19ERVZfUkFNX0JMT0NLU0laRT0xMDI0CisjIENPTkZJR19CTEtfREVWX1hJUCBpcyBub3Qgc2V0CiAjIENPTkZJR19DRFJPTV9QS1RDRFZEIGlzIG5vdCBzZXQKICMgQ09ORklHX0FUQV9PVkVSX0VUSCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0hEIGlzIG5vdCBzZXQKIENPTkZJR19NSVNDX0RFVklDRVM9eQogIyBDT05GSUdfRUVQUk9NXzkzQ1g2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0VOQ0xPU1VSRV9TRVJWSUNFUyBpcyBub3Qgc2V0CitDT05GSUdfSEFWRV9JREU9eQogIyBDT05GSUdfSURFIGlzIG5vdCBzZXQKIAogIwpAQCAtNjIyLDcgKzY0MCw2IEBACiAjIENPTkZJR19BVEEgaXMgbm90IHNldAogIyBDT05GSUdfTUQgaXMgbm90IHNldAogQ09ORklHX05FVERFVklDRVM9eQotIyBDT05GSUdfTkVUREVWSUNFU19NVUxUSVFVRVVFIGlzIG5vdCBzZXQKICMgQ09ORklHX0RVTU1ZIGlzIG5vdCBzZXQKICMgQ09ORklHX0JPTkRJTkcgaXMgbm90IHNldAogIyBDT05GSUdfTUFDVkxBTiBpcyBub3Qgc2V0CkBAIC02NDMsNiArNjYwLDcgQEAKICMgQ09ORklHX1NNU0NfUEhZIGlzIG5vdCBzZXQKICMgQ09ORklHX0JST0FEQ09NX1BIWSBpcyBub3Qgc2V0CiAjIENPTkZJR19JQ1BMVVNfUEhZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFQUxURUtfUEhZIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZJWEVEX1BIWSBpcyBub3Qgc2V0CiAjIENPTkZJR19NRElPX0JJVEJBTkcgaXMgbm90IHNldAogQ09ORklHX05FVF9FVEhFUk5FVD15CkBAIC02NTUsMTEgKzY3MywxNCBAQAogIyBDT05GSUdfU01DOTFYIGlzIG5vdCBzZXQKICMgQ09ORklHX1NNU0M5MTFYIGlzIG5vdCBzZXQKICMgQ09ORklHX0RNOTAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19FTkMyOEo2MCBpcyBub3Qgc2V0CiAjIENPTkZJR19JQk1fTkVXX0VNQUNfWk1JSSBpcyBub3Qgc2V0CiAjIENPTkZJR19JQk1fTkVXX0VNQUNfUkdNSUkgaXMgbm90IHNldAogIyBDT05GSUdfSUJNX05FV19FTUFDX1RBSCBpcyBub3Qgc2V0CiAjIENPTkZJR19JQk1fTkVXX0VNQUNfRU1BQzQgaXMgbm90IHNldAotIyBDT05GSUdfQjQ0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0lCTV9ORVdfRU1BQ19OT19GTE9XX0NUUkwgaXMgbm90IHNldAorIyBDT05GSUdfSUJNX05FV19FTUFDX01BTF9DTFJfSUNJTlRTVEFUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lCTV9ORVdfRU1BQ19NQUxfQ09NTU9OX0VSUiBpcyBub3Qgc2V0CiBDT05GSUdfTkVUREVWXzEwMDA9eQogIyBDT05GSUdfQVg4ODE4MCBpcyBub3Qgc2V0CiBDT05GSUdfTkVUREVWXzEwMDAwPXkKQEAgLTY2OSw2ICs2OTAsNyBAQAogIwogIyBDT05GSUdfV0xBTl9QUkU4MDIxMSBpcyBub3Qgc2V0CiAjIENPTkZJR19XTEFOXzgwMjExIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lXTFdJRklfTEVEUyBpcyBub3Qgc2V0CiAKICMKICMgVVNCIE5ldHdvcmsgQWRhcHRlcnMKQEAgLTY4MSw3ICs3MDMsNiBAQAogIyBDT05GSUdfV0FOIGlzIG5vdCBzZXQKICMgQ09ORklHX1BQUCBpcyBub3Qgc2V0CiAjIENPTkZJR19TTElQIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIQVBFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRDT05TT0xFIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVFBPTEwgaXMgbm90IHNldAogIyBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUiBpcyBub3Qgc2V0CkBAIC02OTIsNyArNzEzLDcgQEAKICMgSW5wdXQgZGV2aWNlIHN1cHBvcnQKICMKIENPTkZJR19JTlBVVD15Ci0jIENPTkZJR19JTlBVVF9GRl9NRU1MRVNTIGlzIG5vdCBzZXQKK0NPTkZJR19JTlBVVF9GRl9NRU1MRVNTPW0KICMgQ09ORklHX0lOUFVUX1BPTExERVYgaXMgbm90IHNldAogCiAjCkBAIC03MTcsOCArNzM4LDkgQEAKICMgQ09ORklHX0lOUFVUX0tFWVNQQU5fUkVNT1RFIGlzIG5vdCBzZXQKICMgQ09ORklHX0lOUFVUX1BPV0VSTUFURSBpcyBub3Qgc2V0CiAjIENPTkZJR19JTlBVVF9ZRUFMSU5LIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0NNMTA5IGlzIG5vdCBzZXQKICMgQ09ORklHX0lOUFVUX1VJTlBVVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19UV0lfS0VZUEFEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NPTkZJR19JTlBVVF9QQ0Y4NTc0IGlzIG5vdCBzZXQKIAogIwogIyBIYXJkd2FyZSBJL08gcG9ydHMKQEAgLTczNCwxNiArNzU2LDE4IEBACiAjIENPTkZJR19CRjV4eF9QUElGQ0QgaXMgbm90IHNldAogIyBDT05GSUdfQkZJTl9TSU1QTEVfVElNRVIgaXMgbm90IHNldAogIyBDT05GSUdfQkY1eHhfUFBJIGlzIG5vdCBzZXQKLUNPTkZJR19CRklOX09UUD15Ci0jIENPTkZJR19CRklOX09UUF9XUklURV9FTkFCTEUgaXMgbm90IHNldAogIyBDT05GSUdfQkZJTl9TUE9SVCBpcyBub3Qgc2V0CiAjIENPTkZJR19CRklOX1RJTUVSX0xBVEVOQ1kgaXMgbm90IHNldAogIyBDT05GSUdfVFdJX0xDRCBpcyBub3Qgc2V0CitDT05GSUdfQkZJTl9ETUFfSU5URVJGQUNFPW0KIENPTkZJR19TSU1QTEVfR1BJTz1tCiBDT05GSUdfVlQ9eQorQ09ORklHX0NPTlNPTEVfVFJBTlNMQVRJT05TPXkKIENPTkZJR19WVF9DT05TT0xFPXkKIENPTkZJR19IV19DT05TT0xFPXkKICMgQ09ORklHX1ZUX0hXX0NPTlNPTEVfQklORElORyBpcyBub3Qgc2V0CisjIENPTkZJR19ERVZLTUVNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGSU5fSlRBR19DT01NIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFUklBTF9OT05TVEFOREFSRCBpcyBub3Qgc2V0CiAKICMKQEAgLTc2Niw2ICs3OTAsOCBAQAogIyBDT05GSUdfU0VSSUFMX0JGSU5fU1BPUlQgaXMgbm90IHNldAogQ09ORklHX1VOSVg5OF9QVFlTPXkKICMgQ09ORklHX0xFR0FDWV9QVFlTIGlzIG5vdCBzZXQKK0NPTkZJR19CRklOX09UUD15CisjIENPTkZJR19CRklOX09UUF9XUklURV9FTkFCTEUgaXMgbm90IHNldAogCiAjCiAjIENBTiwgdGhlIGNhciBidXMgYW5kIGluZHVzdHJpYWwgZmllbGRidXMKQEAgLTc3Myw0NCArNzk5LDQ5IEBACiAjIENPTkZJR19DQU40TElOVVggaXMgbm90IHNldAogIyBDT05GSUdfSVBNSV9IQU5ETEVSIGlzIG5vdCBzZXQKICMgQ09ORklHX0hXX1JBTkRPTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19HRU5fUlRDIGlzIG5vdCBzZXQKICMgQ09ORklHX1IzOTY0IGlzIG5vdCBzZXQKICMgQ09ORklHX1JBV19EUklWRVIgaXMgbm90IHNldAogIyBDT05GSUdfVENHX1RQTSBpcyBub3Qgc2V0CiBDT05GSUdfSTJDPXkKIENPTkZJR19JMkNfQk9BUkRJTkZPPXkKIENPTkZJR19JMkNfQ0hBUkRFVj1tCi0KLSMKLSMgSTJDIEFsZ29yaXRobXMKLSMKLSMgQ09ORklHX0kyQ19BTEdPQklUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19BTEdPUENGIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19BTEdPUENBIGlzIG5vdCBzZXQKK0NPTkZJR19JMkNfSEVMUEVSX0FVVE89eQogCiAjCiAjIEkyQyBIYXJkd2FyZSBCdXMgc3VwcG9ydAogIworCisjCisjIEkyQyBzeXN0ZW0gYnVzIGRyaXZlcnMgKG1vc3RseSBlbWJlZGRlZCAvIHN5c3RlbS1vbi1jaGlwKQorIwogQ09ORklHX0kyQ19CTEFDS0ZJTl9UV0k9bQotQ09ORklHX0kyQ19CTEFDS0ZJTl9UV0lfQ0xLX0tIWj01MAorQ09ORklHX0kyQ19CTEFDS0ZJTl9UV0lfQ0xLX0tIWj0xMDAKICMgQ09ORklHX0kyQ19HUElPIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19PQ09SRVMgaXMgbm90IHNldAotIyBDT05GSUdfSTJDX1BBUlBPUlRfTElHSFQgaXMgbm90IHNldAogIyBDT05GSUdfSTJDX1NJTVRFQyBpcyBub3Qgc2V0CisKKyMKKyMgRXh0ZXJuYWwgSTJDL1NNQnVzIGFkYXB0ZXIgZHJpdmVycworIworIyBDT05GSUdfSTJDX1BBUlBPUlRfTElHSFQgaXMgbm90IHNldAogIyBDT05GSUdfSTJDX1RBT1NfRVZNIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19TVFVCIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19USU5ZX1VTQiBpcyBub3Qgc2V0CiAKICMKKyMgT3RoZXIgSTJDL1NNQnVzIGJ1cyBkcml2ZXJzCisjCisjIENPTkZJR19JMkNfUENBX1BMQVRGT1JNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19TVFVCIGlzIG5vdCBzZXQKKworIwogIyBNaXNjZWxsYW5lb3VzIEkyQyBDaGlwIHN1cHBvcnQKICMKLSMgQ09ORklHX1NFTlNPUlNfRFMxMzM3IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfRFMxMzc0IGlzIG5vdCBzZXQKICMgQ09ORklHX0RTMTY4MiBpcyBub3Qgc2V0CisjIENPTkZJR19BVDI0IGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfQUQ1MjUyIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfRUVQUk9NIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfUENGODU3NCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX1BDRjg1NzUgaXMgbm90IHNldAorIyBDT05GSUdfUENGODU3NSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1BDQTk1MzkgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19QQ0Y4NTkxIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfTUFYNjg3NSBpcyBub3Qgc2V0CkBAIC04MTksMTcgKzg1MCwxNSBAQAogIyBDT05GSUdfSTJDX0RFQlVHX0FMR08gaXMgbm90IHNldAogIyBDT05GSUdfSTJDX0RFQlVHX0JVUyBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfREVCVUdfQ0hJUCBpcyBub3Qgc2V0Ci0KLSMKLSMgU1BJIHN1cHBvcnQKLSMKIENPTkZJR19TUEk9eQorIyBDT05GSUdfU1BJX0RFQlVHIGlzIG5vdCBzZXQKIENPTkZJR19TUElfTUFTVEVSPXkKIAogIwogIyBTUEkgTWFzdGVyIENvbnRyb2xsZXIgRHJpdmVycwogIwogQ09ORklHX1NQSV9CRklOPXkKKyMgQ09ORklHX1NQSV9CRklOX0xPQ0sgaXMgbm90IHNldAogIyBDT05GSUdfU1BJX0JJVEJBTkcgaXMgbm90IHNldAogCiAjCkBAIC04MzgsMTEgKzg2NywxNSBAQAogIyBDT05GSUdfU1BJX0FUMjUgaXMgbm90IHNldAogIyBDT05GSUdfU1BJX1NQSURFViBpcyBub3Qgc2V0CiAjIENPTkZJR19TUElfVExFNjJYMCBpcyBub3Qgc2V0CitDT05GSUdfQVJDSF9XQU5UX09QVElPTkFMX0dQSU9MSUI9eQorIyBDT05GSUdfR1BJT0xJQiBpcyBub3Qgc2V0CiAjIENPTkZJR19XMSBpcyBub3Qgc2V0CiAjIENPTkZJR19QT1dFUl9TVVBQTFkgaXMgbm90IHNldAogQ09ORklHX0hXTU9OPXkKICMgQ09ORklHX0hXTU9OX1ZJRCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FENzQxNCBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0FENzQxOCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FEQ1hYIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfQURNMTAyMSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0FETTEwMjUgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19BRE0xMDI2IGlzIG5vdCBzZXQKQEAgLTg1MCw2ICs4ODMsNyBAQAogIyBDT05GSUdfU0VOU09SU19BRE0xMDMxIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfQURNOTI0MCBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0FEVDc0NzAgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRFQ3NDczIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfQVRYUDEgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19EUzE2MjEgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19GNzE4MDVGIGlzIG5vdCBzZXQKQEAgLTg3MCw2ICs5MDQsNyBAQAogIyBDT05GSUdfU0VOU09SU19MTTkwIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfTE05MiBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0xNOTMgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19NQVgxMTExIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfTUFYMTYxOSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX01BWDY2NTAgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19QQzg3MzYwIGlzIG5vdCBzZXQKQEAgLTg3OCw2ICs5MTMsNyBAQAogIyBDT05GSUdfU0VOU09SU19TTVNDNDdNMSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1NNU0M0N00xOTIgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19TTVNDNDdCMzk3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURTNzgyOCBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1RITUM1MCBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1ZUMTIxMSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1c4Mzc4MUQgaXMgbm90IHNldApAQCAtODg1LDkgKzkyMSwxMiBAQAogIyBDT05GSUdfU0VOU09SU19XODM3OTJEIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfVzgzNzkzIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfVzgzTDc4NVRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVzgzTDc4Nk5HIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfVzgzNjI3SEYgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19XODM2MjdFSEYgaXMgbm90IHNldAogIyBDT05GSUdfSFdNT05fREVCVUdfQ0hJUCBpcyBub3Qgc2V0CisjIENPTkZJR19USEVSTUFMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RIRVJNQUxfSFdNT04gaXMgbm90IHNldAogQ09ORklHX1dBVENIRE9HPXkKICMgQ09ORklHX1dBVENIRE9HX05PV0FZT1VUIGlzIG5vdCBzZXQKIApAQCAtOTAzLDIxICs5NDIsMjkgQEAKICMgQ09ORklHX1VTQlBDV0FUQ0hET0cgaXMgbm90IHNldAogCiAjCi0jIFNvbmljcyBTaWxpY29uIEJhY2twbGFuZQotIwotQ09ORklHX1NTQl9QT1NTSUJMRT15Ci0jIENPTkZJR19TU0IgaXMgbm90IHNldAotCi0jCiAjIE11bHRpZnVuY3Rpb24gZGV2aWNlIGRyaXZlcnMKICMKKyMgQ09ORklHX01GRF9DT1JFIGlzIG5vdCBzZXQKICMgQ09ORklHX01GRF9TTTUwMSBpcyBub3Qgc2V0CisjIENPTkZJR19IVENfUEFTSUMzIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9UTUlPIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9XTTg0MDAgaXMgbm90IHNldAorIyBDT05GSUdfTUZEX1dNODM1MF9JMkMgaXMgbm90IHNldAogCiAjCiAjIE11bHRpbWVkaWEgZGV2aWNlcwogIworCisjCisjIE11bHRpbWVkaWEgY29yZSBzdXBwb3J0CisjCiAjIENPTkZJR19WSURFT19ERVYgaXMgbm90IHNldAogIyBDT05GSUdfRFZCX0NPUkUgaXMgbm90IHNldAorIyBDT05GSUdfVklERU9fTUVESUEgaXMgbm90IHNldAorCisjCisjIE11bHRpbWVkaWEgZHJpdmVycworIwogIyBDT05GSUdfREFCIGlzIG5vdCBzZXQKIAogIwpAQCAtOTI4LDYgKzk3NSw3IEBACiBDT05GSUdfRkI9eQogIyBDT05GSUdfRklSTVdBUkVfRURJRCBpcyBub3Qgc2V0CiAjIENPTkZJR19GQl9EREMgaXMgbm90IHNldAorIyBDT05GSUdfRkJfQk9PVF9WRVNBX1NVUFBPUlQgaXMgbm90IHNldAogQ09ORklHX0ZCX0NGQl9GSUxMUkVDVD15CiBDT05GSUdfRkJfQ0ZCX0NPUFlBUkVBPXkKIENPTkZJR19GQl9DRkJfSU1BR0VCTElUPXkKQEAgLTkzNSw4ICs5ODMsOCBAQAogIyBDT05GSUdfRkJfU1lTX0ZJTExSRUNUIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX1NZU19DT1BZQVJFQSBpcyBub3Qgc2V0CiAjIENPTkZJR19GQl9TWVNfSU1BR0VCTElUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX0ZPUkVJR05fRU5ESUFOIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX1NZU19GT1BTIGlzIG5vdCBzZXQKLUNPTkZJR19GQl9ERUZFUlJFRF9JTz15CiAjIENPTkZJR19GQl9TVkdBTElCIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX01BQ01PREVTIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX0JBQ0tMSUdIVCBpcyBub3Qgc2V0CkBAIC05NDcsMTIgKzk5NSwxOCBAQAogIyBGcmFtZSBidWZmZXIgaGFyZHdhcmUgZHJpdmVycwogIwogQ09ORklHX0ZCX0JGSU5fVDM1ME1DUUI9eQorIyBDT05GSUdfRkJfQkZJTl9MUTAzNVExIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX0JGSU5fNzM5MyBpcyBub3Qgc2V0CiAjIENPTkZJR19GQl9TMUQxM1hYWCBpcyBub3Qgc2V0CiAjIENPTkZJR19GQl9WSVJUVUFMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX01FVFJPTk9NRSBpcyBub3Qgc2V0CiBDT05GSUdfQkFDS0xJR0hUX0xDRF9TVVBQT1JUPXkKIENPTkZJR19MQ0RfQ0xBU1NfREVWSUNFPW0KIENPTkZJR19MQ0RfTFRWMzUwUVY9bQorIyBDT05GSUdfTENEX0lMSTkzMjAgaXMgbm90IHNldAorIyBDT05GSUdfTENEX1RETzI0TSBpcyBub3Qgc2V0CisjIENPTkZJR19MQ0RfVkdHMjQzMkE0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0xDRF9QTEFURk9STSBpcyBub3Qgc2V0CiBDT05GSUdfQkFDS0xJR0hUX0NMQVNTX0RFVklDRT1tCiAjIENPTkZJR19CQUNLTElHSFRfQ09SR0kgaXMgbm90IHNldAogCkBAIC05NzcsMTUgKzEwMzEsOCBAQAogIyBDT05GSUdfTE9HT19MSU5VWF9DTFVUMjI0IGlzIG5vdCBzZXQKICMgQ09ORklHX0xPR09fQkxBQ0tGSU5fVkdBMTYgaXMgbm90IHNldAogQ09ORklHX0xPR09fQkxBQ0tGSU5fQ0xVVDIyND15Ci0KLSMKLSMgU291bmQKLSMKIENPTkZJR19TT1VORD1tCi0KLSMKLSMgQWR2YW5jZWQgTGludXggU291bmQgQXJjaGl0ZWN0dXJlCi0jCisjIENPTkZJR19TT1VORF9PU1NfQ09SRSBpcyBub3Qgc2V0CiBDT05GSUdfU05EPW0KIENPTkZJR19TTkRfVElNRVI9bQogQ09ORklHX1NORF9QQ009bQpAQCAtOTk3LDYyICsxMDQ0LDM4IEBACiBDT05GSUdfU05EX1ZFUkJPU0VfUFJPQ0ZTPXkKICMgQ09ORklHX1NORF9WRVJCT1NFX1BSSU5USyBpcyBub3Qgc2V0CiAjIENPTkZJR19TTkRfREVCVUcgaXMgbm90IHNldAotCi0jCi0jIEdlbmVyaWMgZGV2aWNlcwotIworQ09ORklHX1NORF9EUklWRVJTPXkKICMgQ09ORklHX1NORF9EVU1NWSBpcyBub3Qgc2V0CiAjIENPTkZJR19TTkRfTVRQQVYgaXMgbm90IHNldAogIyBDT05GSUdfU05EX1NFUklBTF9VMTY1NTAgaXMgbm90IHNldAogIyBDT05GSUdfU05EX01QVTQwMSBpcyBub3Qgc2V0Ci0KLSMKLSMgU1BJIGRldmljZXMKLSMKK0NPTkZJR19TTkRfU1BJPXkKIAogIwogIyBBTFNBIEJsYWNrZmluIGRldmljZXMKICMKICMgQ09ORklHX1NORF9CTEFDS0ZJTl9BRDE4MzYgaXMgbm90IHNldAotIyBDT05GSUdfU05EX0JMQUNLRklOX0FEMTgzNl9URE0gaXMgbm90IHNldAotIyBDT05GSUdfU05EX0JMQUNLRklOX0FEMTgzNl9JMlMgaXMgbm90IHNldAotIyBDT05GSUdfU05EX0JMQUNLRklOX0FEMTgzNl9NVUxTVUIgaXMgbm90IHNldAotIyBDT05GSUdfU05EX0JMQUNLRklOX0FEMTgzNl81UDEgaXMgbm90IHNldAotIyBDT05GSUdfU05EX0JGSU5fQUQ3MzMxMSBpcyBub3Qgc2V0CiAjIENPTkZJR19TTkRfQkZJTl9BRDczMzIyIGlzIG5vdCBzZXQKLQotIwotIyBVU0IgZGV2aWNlcwotIworQ09ORklHX1NORF9VU0I9eQogIyBDT05GSUdfU05EX1VTQl9BVURJTyBpcyBub3Qgc2V0CiAjIENPTkZJR19TTkRfVVNCX0NBSUFRIGlzIG5vdCBzZXQKLQotIwotIyBTeXN0ZW0gb24gQ2hpcCBhdWRpbyBzdXBwb3J0Ci0jCi1DT05GSUdfU05EX1NPQ19BQzk3X0JVUz15CiBDT05GSUdfU05EX1NPQz1tCi1DT05GSUdfU05EX0JGNVhYX1NPQz1tCi1DT05GSUdfU05EX01NQVBfU1VQUE9SVD15CitDT05GSUdfU05EX1NPQ19BQzk3X0JVUz15CitDT05GSUdfU05EX0JGNVhYX0kyUz1tCitDT05GSUdfU05EX0JGNVhYX1NPQ19TU00yNjAyPW0KKyMgQ09ORklHX1NORF9CRjVYWF9TT0NfQUQ3MzMxMSBpcyBub3Qgc2V0CitDT05GSUdfU05EX0JGNVhYX0FDOTc9bQorQ09ORklHX1NORF9CRjVYWF9NTUFQX1NVUFBPUlQ9eQorIyBDT05GSUdfU05EX0JGNVhYX01VTFRJQ0hBTl9TVVBQT1JUIGlzIG5vdCBzZXQKK0NPTkZJR19TTkRfQkY1WFhfU09DX1NQT1JUPW0KIENPTkZJR19TTkRfQkY1WFhfU09DX0kyUz1tCiBDT05GSUdfU05EX0JGNVhYX1NPQ19BQzk3PW0KLSMgQ09ORklHX1NORF9CRjVYWF9TT0NfV004NzUwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9CRjVYWF9TT0NfV004NzMxIGlzIG5vdCBzZXQKLUNPTkZJR19TTkRfQkY1WFhfU09DX1NTTTI2MDI9bQotQ09ORklHX1NORF9CRjVYWF9TT0NfQkY1eHg9bQorQ09ORklHX1NORF9CRjVYWF9TT0NfQUQxOTgwPW0KIENPTkZJR19TTkRfQkY1WFhfU1BPUlRfTlVNPTAKICMgQ09ORklHX1NORF9CRjVYWF9IQVZFX0NPTERfUkVTRVQgaXMgbm90IHNldAotCi0jCi0jIFNvQyBBdWRpbyBzdXBwb3J0IGZvciBTdXBlckgKLSMKLUNPTkZJR19TTkRfU09DX1NTTTI2MDI9bQotIyBDT05GSUdfU05EX1NPQ19TU00yNjAyX1NQSSBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfU09DX0FMTF9DT0RFQ1MgaXMgbm90IHNldAogQ09ORklHX1NORF9TT0NfQUQxOTgwPW0KLQotIwotIyBPcGVuIFNvdW5kIFN5c3RlbQotIworQ09ORklHX1NORF9TT0NfU1NNMjYwMj1tCiAjIENPTkZJR19TT1VORF9QUklNRSBpcyBub3Qgc2V0CiBDT05GSUdfQUM5N19CVVM9bQogQ09ORklHX0hJRF9TVVBQT1JUPXkKQEAgLTEwNjQsMTUgKzEwODcsNDMgQEAKICMgVVNCIElucHV0IERldmljZXMKICMKIENPTkZJR19VU0JfSElEPXkKLSMgQ09ORklHX1VTQl9ISURJTlBVVF9QT1dFUkJPT0sgaXMgbm90IHNldAotIyBDT05GSUdfSElEX0ZGIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hJRF9QSUQgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0hJRERFViBpcyBub3Qgc2V0CisKKyMKKyMgU3BlY2lhbCBISUQgZHJpdmVycworIworQ09ORklHX0hJRF9DT01QQVQ9eQorQ09ORklHX0hJRF9BNFRFQ0g9eQorQ09ORklHX0hJRF9BUFBMRT15CitDT05GSUdfSElEX0JFTEtJTj15CitDT05GSUdfSElEX0JSSUdIVD15CitDT05GSUdfSElEX0NIRVJSWT15CitDT05GSUdfSElEX0NISUNPTlk9eQorQ09ORklHX0hJRF9DWVBSRVNTPXkKK0NPTkZJR19ISURfREVMTD15CitDT05GSUdfSElEX0VaS0VZPXkKK0NPTkZJR19ISURfR1lSQVRJT049eQorQ09ORklHX0hJRF9MT0dJVEVDSD15CisjIENPTkZJR19MT0dJVEVDSF9GRiBpcyBub3Qgc2V0CisjIENPTkZJR19MT0dJUlVNQkxFUEFEMl9GRiBpcyBub3Qgc2V0CitDT05GSUdfSElEX01JQ1JPU09GVD15CitDT05GSUdfSElEX01PTlRFUkVZPXkKK0NPTkZJR19ISURfUEFOVEhFUkxPUkQ9eQorIyBDT05GSUdfUEFOVEhFUkxPUkRfRkYgaXMgbm90IHNldAorQ09ORklHX0hJRF9QRVRBTFlOWD15CitDT05GSUdfSElEX1NBTVNVTkc9eQorQ09ORklHX0hJRF9TT05ZPXkKK0NPTkZJR19ISURfU1VOUExVUz15CitDT05GSUdfVEhSVVNUTUFTVEVSX0ZGPW0KK0NPTkZJR19aRVJPUExVU19GRj1tCiBDT05GSUdfVVNCX1NVUFBPUlQ9eQogQ09ORklHX1VTQl9BUkNIX0hBU19IQ0Q9eQogIyBDT05GSUdfVVNCX0FSQ0hfSEFTX09IQ0kgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0FSQ0hfSEFTX0VIQ0kgaXMgbm90IHNldAogQ09ORklHX1VTQj15CiAjIENPTkZJR19VU0JfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0FOTk9VTkNFX05FV19ERVZJQ0VTIGlzIG5vdCBzZXQKIAogIwogIyBNaXNjZWxsYW5lb3VzIFVTQiBvcHRpb25zCkBAIC0xMDgzLDE1ICsxMTM0LDIwIEBACiAjIENPTkZJR19VU0JfT1RHIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9PVEdfV0hJVEVMSVNUIGlzIG5vdCBzZXQKIENPTkZJR19VU0JfT1RHX0JMQUNLTElTVF9IVUI9eQorQ09ORklHX1VTQl9NT049eQorIyBDT05GSUdfVVNCX1dVU0IgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1dVU0JfQ0JBRiBpcyBub3Qgc2V0CiAKICMKICMgVVNCIEhvc3QgQ29udHJvbGxlciBEcml2ZXJzCiAjCisjIENPTkZJR19VU0JfQzY3WDAwX0hDRCBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfSVNQMTE2WF9IQ0QgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0lTUDEzNjJfSENEIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9JU1AxNzYwX0hDRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfSVNQMTM2Ml9IQ0QgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX1NMODExX0hDRCBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfUjhBNjY1OTdfSENEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9IV0FfSENEIGlzIG5vdCBzZXQKIENPTkZJR19VU0JfTVVTQl9IRFJDPXkKIENPTkZJR19VU0JfTVVTQl9TT0M9eQogCkBAIC0xMTAzLDEzICsxMTU5LDE1IEBACiAjIENPTkZJR19VU0JfTVVTQl9PVEcgaXMgbm90IHNldAogQ09ORklHX1VTQl9NVVNCX0hEUkNfSENEPXkKIENPTkZJR19NVVNCX1BJT19PTkxZPXkKLUNPTkZJR19VU0JfTVVTQl9MT0dMRVZFTD0wCisjIENPTkZJR19VU0JfTVVTQl9ERUJVRyBpcyBub3Qgc2V0CiAKICMKICMgVVNCIERldmljZSBDbGFzcyBkcml2ZXJzCiAjCiAjIENPTkZJR19VU0JfQUNNIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9QUklOVEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9XRE0gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1RNQyBpcyBub3Qgc2V0CiAKICMKICMgTk9URTogVVNCX1NUT1JBR0UgZW5hYmxlcyBTQ1NJLCBhbmQgJ1NDU0kgZGlzayBzdXBwb3J0JwpAQCAtMTEyNCwxNSArMTE4MiwxMCBAQAogIyBVU0IgSW1hZ2luZyBkZXZpY2VzCiAjCiAjIENPTkZJR19VU0JfTURDODAwIGlzIG5vdCBzZXQKLUNPTkZJR19VU0JfTU9OPXkKIAogIwogIyBVU0IgcG9ydCBkcml2ZXJzCiAjCi0KLSMKLSMgVVNCIFNlcmlhbCBDb252ZXJ0ZXIgc3VwcG9ydAotIwogIyBDT05GSUdfVVNCX1NFUklBTCBpcyBub3Qgc2V0CiAKICMKQEAgLTExNDEsNyArMTE5NCw3IEBACiAjIENPTkZJR19VU0JfRU1JNjIgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0VNSTI2IGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9BRFVUVVggaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0FVRVJTV0FMRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VWU0VHIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9SSU81MDAgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0xFR09UT1dFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfTENEIGlzIG5vdCBzZXQKQEAgLTExNTcsMTcgKzEyMTAsMTMgQEAKICMgQ09ORklHX1VTQl9MRCBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfVFJBTkNFVklCUkFUT1IgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0lPV0FSUklPUiBpcyBub3Qgc2V0Ci0KLSMKLSMgVVNCIERTTCBtb2RlbSBzdXBwb3J0Ci0jCi0KLSMKLSMgVVNCIEdhZGdldCBTdXBwb3J0Ci0jCisjIENPTkZJR19VU0JfSVNJR0hURlcgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1ZTVCBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfR0FER0VUIGlzIG5vdCBzZXQKICMgQ09ORklHX01NQyBpcyBub3Qgc2V0CisjIENPTkZJR19NRU1TVElDSyBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVdfTEVEUyBpcyBub3Qgc2V0CisjIENPTkZJR19BQ0NFU1NJQklMSVRZIGlzIG5vdCBzZXQKIENPTkZJR19SVENfTElCPXkKIENPTkZJR19SVENfQ0xBU1M9eQogQ09ORklHX1JUQ19IQ1RPU1lTPXkKQEAgLTExOTYsNTEgKzEyNDUsNTcgQEAKICMgQ09ORklHX1JUQ19EUlZfUENGODU2MyBpcyBub3Qgc2V0CiAjIENPTkZJR19SVENfRFJWX1BDRjg1ODMgaXMgbm90IHNldAogIyBDT05GSUdfUlRDX0RSVl9NNDFUODAgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9TMzUzOTBBIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfRk0zMTMwIGlzIG5vdCBzZXQKIAogIwogIyBTUEkgUlRDIGRyaXZlcnMKICMKLSMgQ09ORklHX1JUQ19EUlZfUlM1QzM0OCBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX000MVQ5NCBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0RTMTMwNSBpcyBub3Qgc2V0CiAjIENPTkZJR19SVENfRFJWX01BWDY5MDIgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9SOTcwMSBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1JTNUMzNDggaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9EUzMyMzQgaXMgbm90IHNldAogCiAjCiAjIFBsYXRmb3JtIFJUQyBkcml2ZXJzCiAjCisjIENPTkZJR19SVENfRFJWX0RTMTI4NiBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0RTMTUxMSBpcyBub3Qgc2V0CiAjIENPTkZJR19SVENfRFJWX0RTMTU1MyBpcyBub3Qgc2V0Ci0jIENPTkZJR19SVENfRFJWX1NUSzE3VEE4IGlzIG5vdCBzZXQKICMgQ09ORklHX1JUQ19EUlZfRFMxNzQyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfU1RLMTdUQTggaXMgbm90IHNldAogIyBDT05GSUdfUlRDX0RSVl9NNDhUODYgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9NNDhUMzUgaXMgbm90IHNldAogIyBDT05GSUdfUlRDX0RSVl9NNDhUNTkgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9CUTQ4MDIgaXMgbm90IHNldAogIyBDT05GSUdfUlRDX0RSVl9WMzAyMCBpcyBub3Qgc2V0CiAKICMKICMgb24tQ1BVIFJUQyBkcml2ZXJzCiAjCiBDT05GSUdfUlRDX0RSVl9CRklOPXkKLQotIwotIyBVc2Vyc3BhY2UgSS9PCi0jCisjIENPTkZJR19ETUFERVZJQ0VTIGlzIG5vdCBzZXQKICMgQ09ORklHX1VJTyBpcyBub3Qgc2V0CisjIENPTkZJR19TVEFHSU5HIGlzIG5vdCBzZXQKIAogIwogIyBGaWxlIHN5c3RlbXMKICMKICMgQ09ORklHX0VYVDJfRlMgaXMgbm90IHNldAogIyBDT05GSUdfRVhUM19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19FWFQ0REVWX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDRfRlMgaXMgbm90IHNldAogIyBDT05GSUdfUkVJU0VSRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfSkZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CitDT05GSUdfRklMRV9MT0NLSU5HPXkKICMgQ09ORklHX1hGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19HRlMyX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX09DRlMyX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX01JTklYX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1JPTUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ROT1RJRlkgaXMgbm90IHNldAogQ09ORklHX0lOT1RJRlk9eQogQ09ORklHX0lOT1RJRllfVVNFUj15CiAjIENPTkZJR19RVU9UQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19ETk9USUZZIGlzIG5vdCBzZXQKICMgQ09ORklHX0FVVE9GU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19BVVRPRlM0X0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZVU0VfRlMgaXMgbm90IHNldApAQCAtMTI4MCwxMSArMTMzNSwxMSBAQAogIyBDT05GSUdfRUZTX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19ZQUZGU19GUz1tCiBDT05GSUdfWUFGRlNfWUFGRlMxPXkKKyMgQ09ORklHX1lBRkZTXzlCWVRFX1RBR1MgaXMgbm90IHNldAogIyBDT05GSUdfWUFGRlNfRE9FU19FQ0MgaXMgbm90IHNldAogQ09ORklHX1lBRkZTX1lBRkZTMj15CiBDT05GSUdfWUFGRlNfQVVUT19ZQUZGUzI9eQogIyBDT05GSUdfWUFGRlNfRElTQUJMRV9MQVpZX0xPQUQgaXMgbm90IHNldAotQ09ORklHX1lBRkZTX0NIRUNLUE9JTlRfUkVTRVJWRURfQkxPQ0tTPTEwCiAjIENPTkZJR19ZQUZGU19ESVNBQkxFX1dJREVfVE5PREVTIGlzIG5vdCBzZXQKICMgQ09ORklHX1lBRkZTX0FMV0FZU19DSEVDS19DSFVOS19FUkFTRUQgaXMgbm90IHNldAogQ09ORklHX1lBRkZTX1NIT1JUX05BTUVTX0lOX1JBTT15CkBAIC0xMzAxLDggKzEzNTYsMTEgQEAKICMgQ09ORklHX0pGRlMyX1JVQklOIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSQU1GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19WWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JTklYX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX09NRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfSFBGU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19RTlg0RlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfU1lTVl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19VRlNfRlMgaXMgbm90IHNldAogQ09ORklHX05FVFdPUktfRklMRVNZU1RFTVM9eQpAQCAtMTMxMCwxMyArMTM2OCwxMiBAQAogQ09ORklHX05GU19WMz15CiAjIENPTkZJR19ORlNfVjNfQUNMIGlzIG5vdCBzZXQKICMgQ09ORklHX05GU19WNCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORlNfRElSRUNUSU8gaXMgbm90IHNldAogIyBDT05GSUdfTkZTRCBpcyBub3Qgc2V0CiBDT05GSUdfTE9DS0Q9bQogQ09ORklHX0xPQ0tEX1Y0PXkKIENPTkZJR19ORlNfQ09NTU9OPXkKIENPTkZJR19TVU5SUEM9bQotIyBDT05GSUdfU1VOUlBDX0JJTkQzNCBpcyBub3Qgc2V0CisjIENPTkZJR19TVU5SUENfUkVHSVNURVJfVjQgaXMgbm90IHNldAogIyBDT05GSUdfUlBDU0VDX0dTU19LUkI1IGlzIG5vdCBzZXQKICMgQ09ORklHX1JQQ1NFQ19HU1NfU1BLTTMgaXMgbm90IHNldAogQ09ORklHX1NNQl9GUz1tCkBAIC0xMzcyLDkgKzE0MjksNiBAQAogIyBDT05GSUdfTkxTX0tPSThfVSBpcyBub3Qgc2V0CiAjIENPTkZJR19OTFNfVVRGOCBpcyBub3Qgc2V0CiAjIENPTkZJR19ETE0gaXMgbm90IHNldAotQ09ORklHX0lOU1RSVU1FTlRBVElPTj15Ci0jIENPTkZJR19QUk9GSUxJTkcgaXMgbm90IHNldAotIyBDT05GSUdfTUFSS0VSUyBpcyBub3Qgc2V0CiAKICMKICMgS2VybmVsIGhhY2tpbmcKQEAgLTEzODIsMTQgKzE0MzYsNTMgQEAKICMgQ09ORklHX1BSSU5US19USU1FIGlzIG5vdCBzZXQKIENPTkZJR19FTkFCTEVfV0FSTl9ERVBSRUNBVEVEPXkKIENPTkZJR19FTkFCTEVfTVVTVF9DSEVDSz15CitDT05GSUdfRlJBTUVfV0FSTj0xMDI0CiAjIENPTkZJR19NQUdJQ19TWVNSUSBpcyBub3Qgc2V0CiAjIENPTkZJR19VTlVTRURfU1lNQk9MUyBpcyBub3Qgc2V0CiBDT05GSUdfREVCVUdfRlM9eQogIyBDT05GSUdfSEVBREVSU19DSEVDSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19LRVJORUwgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX0tFUk5FTD15CisjIENPTkZJR19ERUJVR19TSElSUSBpcyBub3Qgc2V0CitDT05GSUdfREVURUNUX1NPRlRMT0NLVVA9eQorIyBDT05GSUdfQk9PVFBBUkFNX1NPRlRMT0NLVVBfUEFOSUMgaXMgbm90IHNldAorQ09ORklHX0JPT1RQQVJBTV9TT0ZUTE9DS1VQX1BBTklDX1ZBTFVFPTAKK0NPTkZJR19TQ0hFRF9ERUJVRz15CisjIENPTkZJR19TQ0hFRFNUQVRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RJTUVSX1NUQVRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX09CSkVDVFMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU0xBQiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19SVF9NVVRFWEVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUX01VVEVYX1RFU1RFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TUElOTE9DSyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19NVVRFWEVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NQSU5MT0NLX1NMRUVQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0xPQ0tJTkdfQVBJX1NFTEZURVNUUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19LT0JKRUNUIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX0JVR1ZFUkJPU0UgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX0lORk89eQorIyBDT05GSUdfREVCVUdfVk0gaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfV1JJVEVDT1VOVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19NRU1PUllfSU5JVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19MSVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZSQU1FX1BPSU5URVIgaXMgbm90IHNldAorIyBDT05GSUdfQk9PVF9QUklOVEtfREVMQVkgaXMgbm90IHNldAorIyBDT05GSUdfUkNVX1RPUlRVUkVfVEVTVCBpcyBub3Qgc2V0CisjIENPTkZJR19SQ1VfQ1BVX1NUQUxMX0RFVEVDVE9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JBQ0tUUkFDRV9TRUxGX1RFU1QgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfQkxPQ0tfRVhUX0RFVlQgaXMgbm90IHNldAorIyBDT05GSUdfRkFVTFRfSU5KRUNUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU0NUTF9TWVNDQUxMX0NIRUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RZTkFNSUNfUFJJTlRLX0RFQlVHIGlzIG5vdCBzZXQKICMgQ09ORklHX1NBTVBMRVMgaXMgbm90IHNldAorQ09ORklHX0hBVkVfQVJDSF9LR0RCPXkKKyMgQ09ORklHX0tHREIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU1RBQ0tPVkVSRkxPVyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TVEFDS19VU0FHRSBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfVkVSQk9TRT15CiBDT05GSUdfREVCVUdfTU1SUz15CisjIENPTkZJR19ERUJVR19IV0VSUiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19ET1VCTEVGQVVMVCBpcyBub3Qgc2V0CiBDT05GSUdfREVCVUdfSFVOVF9GT1JfWkVSTz15CiBDT05GSUdfREVCVUdfQkZJTl9IV1RSQUNFX09OPXkKIENPTkZJR19ERUJVR19CRklOX0hXVFJBQ0VfQ09NUFJFU1NJT05fT0ZGPXkKQEAgLTE0MDcsMTAgKzE1MDAsOTUgQEAKICMKICMgQ09ORklHX0tFWVMgaXMgbm90IHNldAogQ09ORklHX1NFQ1VSSVRZPXkKKyMgQ09ORklHX1NFQ1VSSVRZRlMgaXMgbm90IHNldAogIyBDT05GSUdfU0VDVVJJVFlfTkVUV09SSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRUNVUklUWV9DQVBBQklMSVRJRVMgaXMgbm90IHNldAorIyBDT05GSUdfU0VDVVJJVFlfRklMRV9DQVBBQklMSVRJRVMgaXMgbm90IHNldAogIyBDT05GSUdfU0VDVVJJVFlfUk9PVFBMVUcgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPIGlzIG5vdCBzZXQKK0NPTkZJR19TRUNVUklUWV9ERUZBVUxUX01NQVBfTUlOX0FERFI9MAorQ09ORklHX0NSWVBUTz15CisKKyMKKyMgQ3J5cHRvIGNvcmUgb3IgaGVscGVyCisjCisjIENPTkZJR19DUllQVE9fRklQUyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTUFOQUdFUiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fR0YxMjhNVUwgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX05VTEwgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NSWVBURCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQVVUSEVOQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fVEVTVCBpcyBub3Qgc2V0CisKKyMKKyMgQXV0aGVudGljYXRlZCBFbmNyeXB0aW9uIHdpdGggQXNzb2NpYXRlZCBEYXRhCisjCisjIENPTkZJR19DUllQVE9fQ0NNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19HQ00gaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NFUUlWIGlzIG5vdCBzZXQKKworIworIyBCbG9jayBtb2RlcworIworIyBDT05GSUdfQ1JZUFRPX0NCQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ1RSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DVFMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0VDQiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTFJXIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19QQ0JDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19YVFMgaXMgbm90IHNldAorCisjCisjIEhhc2ggbW9kZXMKKyMKKyMgQ09ORklHX0NSWVBUT19ITUFDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19YQ0JDIGlzIG5vdCBzZXQKKworIworIyBEaWdlc3QKKyMKKyMgQ09ORklHX0NSWVBUT19DUkMzMkMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX01ENCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTUQ1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19NSUNIQUVMX01JQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fUk1EMTI4IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19STUQxNjAgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1JNRDI1NiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fUk1EMzIwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TSEExIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TSEEyNTYgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NIQTUxMiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fVEdSMTkyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19XUDUxMiBpcyBub3Qgc2V0CisKKyMKKyMgQ2lwaGVycworIworIyBDT05GSUdfQ1JZUFRPX0FFUyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQU5VQklTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19BUkM0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19CTE9XRklTSCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ0FNRUxMSUEgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NBU1Q1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DQVNUNiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fREVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19GQ1JZUFQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0tIQVpBRCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0FMU0EyMCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0VFRCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0VSUEVOVCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fVEVBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19UV09GSVNIIGlzIG5vdCBzZXQKKworIworIyBDb21wcmVzc2lvbgorIworIyBDT05GSUdfQ1JZUFRPX0RFRkxBVEUgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0xaTyBpcyBub3Qgc2V0CisKKyMKKyMgUmFuZG9tIE51bWJlciBHZW5lcmF0aW9uCisjCisjIENPTkZJR19DUllQVE9fQU5TSV9DUFJORyBpcyBub3Qgc2V0CitDT05GSUdfQ1JZUFRPX0hXPXkKIAogIwogIyBMaWJyYXJ5IHJvdXRpbmVzCkBAIC0xNDE4LDYgKzE1OTYsNyBAQAogQ09ORklHX0JJVFJFVkVSU0U9eQogQ09ORklHX0NSQ19DQ0lUVD1tCiAjIENPTkZJR19DUkMxNiBpcyBub3Qgc2V0CisjIENPTkZJR19DUkNfVDEwRElGIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSQ19JVFVfVCBpcyBub3Qgc2V0CiBDT05GSUdfQ1JDMzI9eQogIyBDT05GSUdfQ1JDNyBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvQkY1MzMtRVpLSVRfZGVmY29uZmlnIGIvYXJjaC9ibGFja2Zpbi9jb25maWdzL0JGNTMzLUVaS0lUX2RlZmNvbmZpZwppbmRleCBkZWViNWU0Li45MmFmZDk4IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvQkY1MzMtRVpLSVRfZGVmY29uZmlnCisrKyBiL2FyY2gvYmxhY2tmaW4vY29uZmlncy9CRjUzMy1FWktJVF9kZWZjb25maWcKQEAgLTEsNiArMSw2IEBACiAjCiAjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0Ci0jIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMjQuNworIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjI4LXJjMgogIwogIyBDT05GSUdfTU1VIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZQVSBpcyBub3Qgc2V0CkBAIC04LDcgKzgsNiBAQAogIyBDT05GSUdfUldTRU1fWENIR0FERF9BTEdPUklUSE0gaXMgbm90IHNldAogQ09ORklHX0JMQUNLRklOPXkKIENPTkZJR19aT05FX0RNQT15Ci1DT05GSUdfU0VNQVBIT1JFX1NMRUVQRVJTPXkKIENPTkZJR19HRU5FUklDX0ZJTkRfTkVYVF9CSVQ9eQogQ09ORklHX0dFTkVSSUNfSFdFSUdIVD15CiBDT05GSUdfR0VORVJJQ19IQVJESVJRUz15CkBAIC0zMSwxOCArMzAsMTYgQEAKICMgQ09ORklHX1BPU0lYX01RVUVVRSBpcyBub3Qgc2V0CiAjIENPTkZJR19CU0RfUFJPQ0VTU19BQ0NUIGlzIG5vdCBzZXQKICMgQ09ORklHX1RBU0tTVEFUUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0VSX05TIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BJRF9OUyBpcyBub3Qgc2V0CiAjIENPTkZJR19BVURJVCBpcyBub3Qgc2V0CiBDT05GSUdfSUtDT05GSUc9eQogQ09ORklHX0lLQ09ORklHX1BST0M9eQogQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKICMgQ09ORklHX0NHUk9VUFMgaXMgbm90IHNldAotQ09ORklHX0ZBSVJfR1JPVVBfU0NIRUQ9eQotQ09ORklHX0ZBSVJfVVNFUl9TQ0hFRD15Ci0jIENPTkZJR19GQUlSX0NHUk9VUF9TQ0hFRCBpcyBub3Qgc2V0Ci1DT05GSUdfU1lTRlNfREVQUkVDQVRFRD15CisjIENPTkZJR19HUk9VUF9TQ0hFRCBpcyBub3Qgc2V0CisjIENPTkZJR19TWVNGU19ERVBSRUNBVEVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU0ZTX0RFUFJFQ0FURURfVjIgaXMgbm90IHNldAogIyBDT05GSUdfUkVMQVkgaXMgbm90IHNldAorIyBDT05GSUdfTkFNRVNQQUNFUyBpcyBub3Qgc2V0CiBDT05GSUdfQkxLX0RFVl9JTklUUkQ9eQogQ09ORklHX0lOSVRSQU1GU19TT1VSQ0U9IiIKICMgQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFIGlzIG5vdCBzZXQKQEAgLTUxLDI2ICs0OCwzNSBAQAogQ09ORklHX1VJRDE2PXkKIENPTkZJR19TWVNDVExfU1lTQ0FMTD15CiBDT05GSUdfS0FMTFNZTVM9eQorIyBDT05GSUdfS0FMTFNZTVNfQUxMIGlzIG5vdCBzZXQKICMgQ09ORklHX0tBTExTWU1TX0VYVFJBX1BBU1MgaXMgbm90IHNldAogQ09ORklHX0hPVFBMVUc9eQogQ09ORklHX1BSSU5USz15CiBDT05GSUdfQlVHPXkKLUNPTkZJR19FTEZfQ09SRT15CisjIENPTkZJR19FTEZfQ09SRSBpcyBub3Qgc2V0CitDT05GSUdfQ09NUEFUX0JSSz15CiBDT05GSUdfQkFTRV9GVUxMPXkKIENPTkZJR19GVVRFWD15CiBDT05GSUdfQU5PTl9JTk9ERVM9eQogQ09ORklHX0VQT0xMPXkKIENPTkZJR19TSUdOQUxGRD15CitDT05GSUdfVElNRVJGRD15CiBDT05GSUdfRVZFTlRGRD15CitDT05GSUdfQUlPPXkKIENPTkZJR19WTV9FVkVOVF9DT1VOVEVSUz15CiBDT05GSUdfU0xBQj15CiAjIENPTkZJR19TTFVCIGlzIG5vdCBzZXQKICMgQ09ORklHX1NMT0IgaXMgbm90IHNldAorIyBDT05GSUdfUFJPRklMSU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BUktFUlMgaXMgbm90IHNldAorQ09ORklHX0hBVkVfT1BST0ZJTEU9eQorIyBDT05GSUdfSEFWRV9HRU5FUklDX0RNQV9DT0hFUkVOVCBpcyBub3Qgc2V0CiBDT05GSUdfU0xBQklORk89eQogQ09ORklHX1JUX01VVEVYRVM9eQogQ09ORklHX1RJTllfU0hNRU09eQogQ09ORklHX0JBU0VfU01BTEw9MAogQ09ORklHX01PRFVMRVM9eQorIyBDT05GSUdfTU9EVUxFX0ZPUkNFX0xPQUQgaXMgbm90IHNldAogQ09ORklHX01PRFVMRV9VTkxPQUQ9eQogIyBDT05GSUdfTU9EVUxFX0ZPUkNFX1VOTE9BRCBpcyBub3Qgc2V0CiAjIENPTkZJR19NT0RWRVJTSU9OUyBpcyBub3Qgc2V0CkBAIC04MSw2ICs4Nyw3IEBACiAjIENPTkZJR19CTEtfREVWX0lPX1RSQUNFIGlzIG5vdCBzZXQKICMgQ09ORklHX0xTRiBpcyBub3Qgc2V0CiAjIENPTkZJR19CTEtfREVWX0JTRyBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0lOVEVHUklUWSBpcyBub3Qgc2V0CiAKICMKICMgSU8gU2NoZWR1bGVycwpAQCAtOTQsOSArMTAxLDExIEBACiAjIENPTkZJR19ERUZBVUxUX0NGUSBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUZBVUxUX05PT1AgaXMgbm90IHNldAogQ09ORklHX0RFRkFVTFRfSU9TQ0hFRD0iYW50aWNpcGF0b3J5IgorQ09ORklHX0NMQVNTSUNfUkNVPXkKICMgQ09ORklHX1BSRUVNUFRfTk9ORSBpcyBub3Qgc2V0CiBDT05GSUdfUFJFRU1QVF9WT0xVTlRBUlk9eQogIyBDT05GSUdfUFJFRU1QVCBpcyBub3Qgc2V0CitDT05GSUdfRlJFRVpFUj15CiAKICMKICMgQmxhY2tmaW4gUHJvY2Vzc29yIE9wdGlvbnMKQEAgLTEwNSw2ICsxMTQsMTAgQEAKICMKICMgUHJvY2Vzc29yIGFuZCBCb2FyZCBTZXR0aW5ncwogIworIyBDT05GSUdfQkY1MTIgaXMgbm90IHNldAorIyBDT05GSUdfQkY1MTQgaXMgbm90IHNldAorIyBDT05GSUdfQkY1MTYgaXMgbm90IHNldAorIyBDT05GSUdfQkY1MTggaXMgbm90IHNldAogIyBDT05GSUdfQkY1MjIgaXMgbm90IHNldAogIyBDT05GSUdfQkY1MjMgaXMgbm90IHNldAogIyBDT05GSUdfQkY1MjQgaXMgbm90IHNldApAQCAtMTE3LDI0ICsxMzAsMzAgQEAKICMgQ09ORklHX0JGNTM0IGlzIG5vdCBzZXQKICMgQ09ORklHX0JGNTM2IGlzIG5vdCBzZXQKICMgQ09ORklHX0JGNTM3IGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGNTM4IGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGNTM5IGlzIG5vdCBzZXQKICMgQ09ORklHX0JGNTQyIGlzIG5vdCBzZXQKICMgQ09ORklHX0JGNTQ0IGlzIG5vdCBzZXQKICMgQ09ORklHX0JGNTQ3IGlzIG5vdCBzZXQKICMgQ09ORklHX0JGNTQ4IGlzIG5vdCBzZXQKICMgQ09ORklHX0JGNTQ5IGlzIG5vdCBzZXQKICMgQ09ORklHX0JGNTYxIGlzIG5vdCBzZXQKK0NPTkZJR19CRl9SRVZfTUlOPTMKK0NPTkZJR19CRl9SRVZfTUFYPTYKICMgQ09ORklHX0JGX1JFVl8wXzAgaXMgbm90IHNldAogIyBDT05GSUdfQkZfUkVWXzBfMSBpcyBub3Qgc2V0CiAjIENPTkZJR19CRl9SRVZfMF8yIGlzIG5vdCBzZXQKIENPTkZJR19CRl9SRVZfMF8zPXkKICMgQ09ORklHX0JGX1JFVl8wXzQgaXMgbm90IHNldAogIyBDT05GSUdfQkZfUkVWXzBfNSBpcyBub3Qgc2V0CisjIENPTkZJR19CRl9SRVZfMF82IGlzIG5vdCBzZXQKICMgQ09ORklHX0JGX1JFVl9BTlkgaXMgbm90IHNldAogIyBDT05GSUdfQkZfUkVWX05PTkUgaXMgbm90IHNldAogQ09ORklHX0JGNTN4PXkKIENPTkZJR19NRU1fTVQ0OExDMTZNMTZBMlRHXzc1PXkKIENPTkZJR19CRklONTMzX0VaS0lUPXkKICMgQ09ORklHX0JGSU41MzNfU1RBTVAgaXMgbm90IHNldAorIyBDT05GSUdfQkxBQ0tTVEFNUCBpcyBub3Qgc2V0CiAjIENPTkZJR19CRklONTMzX0JMVUVURUNITklYX0NNIGlzIG5vdCBzZXQKICMgQ09ORklHX0g4NjA2X0hWU0lTVEVNQVMgaXMgbm90IHNldAogIyBDT05GSUdfQkZJTjUzMl9JUDBYIGlzIG5vdCBzZXQKQEAgLTE4Nyw3ICsyMDYsNiBAQAogIwogQ09ORklHX0NMS0lOX0haPTI3MDAwMDAwCiAjIENPTkZJR19CRklOX0tFUk5FTF9DTE9DSyBpcyBub3Qgc2V0Ci1DT05GSUdfTUFYX01FTV9TSVpFPTUxMgogQ09ORklHX01BWF9WQ09fSFo9NzUwMDAwMDAwCiBDT05GSUdfTUlOX1ZDT19IWj01MDAwMDAwMAogQ09ORklHX01BWF9TQ0xLX0haPTEzMzMzMzMzMwpAQCAtMjAxLDYgKzIxOSw3IEBACiAjIENPTkZJR19IWl8zMDAgaXMgbm90IHNldAogIyBDT05GSUdfSFpfMTAwMCBpcyBub3Qgc2V0CiBDT05GSUdfSFo9MjUwCitDT05GSUdfU0NIRURfSFJUSUNLPXkKIENPTkZJR19HRU5FUklDX1RJTUU9eQogQ09ORklHX0dFTkVSSUNfQ0xPQ0tFVkVOVFM9eQogIyBDT05GSUdfQ1lDTEVTX0NMT0NLU09VUkNFIGlzIG5vdCBzZXQKQEAgLTIzOCw2ICsyNTcsMTIgQEAKIENPTkZJR19DQUNIRUxJTkVfQUxJR05FRF9MMT15CiAjIENPTkZJR19TWVNDQUxMX1RBQl9MMSBpcyBub3Qgc2V0CiAjIENPTkZJR19DUExCX1NXSVRDSF9UQUJfTDEgaXMgbm90IHNldAorQ09ORklHX0FQUF9TVEFDS19MMT15CisKKyMKKyMgU3BlZWQgT3B0aW1pemF0aW9ucworIworQ09ORklHX0JGSU5fSU5TX0xPV09WRVJIRUFEPXkKIENPTkZJR19SQU1LRVJORUw9eQogIyBDT05GSUdfUk9NS0VSTkVMIGlzIG5vdCBzZXQKIENPTkZJR19TRUxFQ1RfTUVNT1JZX01PREVMPXkKQEAgLTI0NiwxNCArMjcxLDEzIEBACiAjIENPTkZJR19TUEFSU0VNRU1fTUFOVUFMIGlzIG5vdCBzZXQKIENPTkZJR19GTEFUTUVNPXkKIENPTkZJR19GTEFUX05PREVfTUVNX01BUD15Ci0jIENPTkZJR19TUEFSU0VNRU1fU1RBVElDIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NQQVJTRU1FTV9WTUVNTUFQX0VOQUJMRSBpcyBub3Qgc2V0CitDT05GSUdfUEFHRUZMQUdTX0VYVEVOREVEPXkKIENPTkZJR19TUExJVF9QVExPQ0tfQ1BVUz00CiAjIENPTkZJR19SRVNPVVJDRVNfNjRCSVQgaXMgbm90IHNldAorIyBDT05GSUdfUEhZU19BRERSX1RfNjRCSVQgaXMgbm90IHNldAogQ09ORklHX1pPTkVfRE1BX0ZMQUc9MQogQ09ORklHX1ZJUlRfVE9fQlVTPXkKICMgQ09ORklHX0JGSU5fR1BUSU1FUlMgaXMgbm90IHNldAotQ09ORklHX0JGSU5fRE1BXzVYWD15CiAjIENPTkZJR19ETUFfVU5DQUNIRURfNE0gaXMgbm90IHNldAogIyBDT05GSUdfRE1BX1VOQ0FDSEVEXzJNIGlzIG5vdCBzZXQKIENPTkZJR19ETUFfVU5DQUNIRURfMU09eQpAQCAtMjY4LDcgKzI5Miw2IEBACiAjIENPTkZJR19CRklOX0lDQUNIRV9MT0NLIGlzIG5vdCBzZXQKICMgQ09ORklHX0JGSU5fV0IgaXMgbm90IHNldAogQ09ORklHX0JGSU5fV1Q9eQotQ09ORklHX0wxX01BWF9QSUVDRT0xNgogIyBDT05GSUdfTVBVIGlzIG5vdCBzZXQKIAogIwpAQCAtMjk3LDcgKzMyMCw2IEBACiAjCiAjIEJ1cyBvcHRpb25zIChQQ0ksIFBDTUNJQSwgRUlTQSwgTUNBLCBJU0EpCiAjCi0jIENPTkZJR19QQ0kgaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9TVVBQT1JUU19NU0kgaXMgbm90IHNldAogIyBDT05GSUdfUENDQVJEIGlzIG5vdCBzZXQKIApAQCAtMzA4LDI5ICszMzAsMzAgQEAKIENPTkZJR19CSU5GTVRfRkxBVD15CiBDT05GSUdfQklORk1UX1pGTEFUPXkKICMgQ09ORklHX0JJTkZNVF9TSEFSRURfRkxBVCBpcyBub3Qgc2V0CisjIENPTkZJR19IQVZFX0FPVVQgaXMgbm90IHNldAogIyBDT05GSUdfQklORk1UX01JU0MgaXMgbm90IHNldAogCiAjCiAjIFBvd2VyIG1hbmFnZW1lbnQgb3B0aW9ucwogIwogQ09ORklHX1BNPXkKLSMgQ09ORklHX1BNX0xFR0FDWSBpcyBub3Qgc2V0CiAjIENPTkZJR19QTV9ERUJVRyBpcyBub3Qgc2V0CiBDT05GSUdfUE1fU0xFRVA9eQotQ09ORklHX1NVU1BFTkRfVVBfUE9TU0lCTEU9eQogQ09ORklHX1NVU1BFTkQ9eQorQ09ORklHX1NVU1BFTkRfRlJFRVpFUj15CitDT05GSUdfQVJDSF9TVVNQRU5EX1BPU1NJQkxFPXkKIENPTkZJR19QTV9CRklOX1NMRUVQX0RFRVBFUj15CiAjIENPTkZJR19QTV9CRklOX1NMRUVQIGlzIG5vdCBzZXQKICMgQ09ORklHX1BNX1dBS0VVUF9CWV9HUElPIGlzIG5vdCBzZXQKIAogIworIyBQb3NzaWJsZSBTdXNwZW5kIE1lbSAvIEhpYmVybmF0ZSBXYWtlLVVwIFNvdXJjZXMKKyMKKworIwogIyBDUFUgRnJlcXVlbmN5IHNjYWxpbmcKICMKICMgQ09ORklHX0NQVV9GUkVRIGlzIG5vdCBzZXQKLQotIwotIyBOZXR3b3JraW5nCi0jCiBDT05GSUdfTkVUPXkKIAogIwpAQCAtMzQzLDYgKzM2Niw3IEBACiAjIENPTkZJR19YRlJNX1VTRVIgaXMgbm90IHNldAogIyBDT05GSUdfWEZSTV9TVUJfUE9MSUNZIGlzIG5vdCBzZXQKICMgQ09ORklHX1hGUk1fTUlHUkFURSBpcyBub3Qgc2V0CisjIENPTkZJR19YRlJNX1NUQVRJU1RJQ1MgaXMgbm90IHNldAogIyBDT05GSUdfTkVUX0tFWSBpcyBub3Qgc2V0CiBDT05GSUdfSU5FVD15CiAjIENPTkZJR19JUF9NVUxUSUNBU1QgaXMgbm90IHNldApAQCAtMzcyLDggKzM5Niw2IEBACiBDT05GSUdfREVGQVVMVF9UQ1BfQ09ORz0iY3ViaWMiCiAjIENPTkZJR19UQ1BfTUQ1U0lHIGlzIG5vdCBzZXQKICMgQ09ORklHX0lQVjYgaXMgbm90IHNldAotIyBDT05GSUdfSU5FVDZfWEZSTV9UVU5ORUwgaXMgbm90IHNldAotIyBDT05GSUdfSU5FVDZfVFVOTkVMIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVExBQkVMIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVFdPUktfU0VDTUFSSyBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRGSUxURVIgaXMgbm90IHNldApAQCAtMzgyLDYgKzQwNCw3IEBACiAjIENPTkZJR19USVBDIGlzIG5vdCBzZXQKICMgQ09ORklHX0FUTSBpcyBub3Qgc2V0CiAjIENPTkZJR19CUklER0UgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0RTQSBpcyBub3Qgc2V0CiAjIENPTkZJR19WTEFOXzgwMjFRIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQ05FVCBpcyBub3Qgc2V0CiAjIENPTkZJR19MTEMyIGlzIG5vdCBzZXQKQEAgLTM5OCw2ICs0MjEsNyBAQAogIwogIyBDT05GSUdfTkVUX1BLVEdFTiBpcyBub3Qgc2V0CiAjIENPTkZJR19IQU1SQURJTyBpcyBub3Qgc2V0CisjIENPTkZJR19DQU4gaXMgbm90IHNldAogQ09ORklHX0lSREE9bQogCiAjCkBAIC00MzAsMjQgKzQ1NCwxNCBAQAogIyBDT05GSUdfRE9OR0xFIGlzIG5vdCBzZXQKIAogIwotIyBPbGQgU0lSIGRldmljZSBkcml2ZXJzCi0jCi0jIENPTkZJR19JUlBPUlRfU0lSIGlzIG5vdCBzZXQKLQotIwotIyBPbGQgU2VyaWFsIGRvbmdsZSBzdXBwb3J0Ci0jCi0KLSMKICMgRklSIGRldmljZSBkcml2ZXJzCiAjCiAjIENPTkZJR19CVCBpcyBub3Qgc2V0CiAjIENPTkZJR19BRl9SWFJQQyBpcyBub3Qgc2V0Ci0KLSMKLSMgV2lyZWxlc3MKLSMKKyMgQ09ORklHX1BIT05FVCBpcyBub3Qgc2V0CitDT05GSUdfV0lSRUxFU1M9eQogIyBDT05GSUdfQ0ZHODAyMTEgaXMgbm90IHNldAorQ09ORklHX1dJUkVMRVNTX09MRF9SRUdVTEFUT1JZPXkKICMgQ09ORklHX1dJUkVMRVNTX0VYVCBpcyBub3Qgc2V0CiAjIENPTkZJR19NQUM4MDIxMSBpcyBub3Qgc2V0CiAjIENPTkZJR19JRUVFODAyMTEgaXMgbm90IHNldApAQCAtNDY1LDYgKzQ3OSw4IEBACiBDT05GSUdfU1RBTkRBTE9ORT15CiBDT05GSUdfUFJFVkVOVF9GSVJNV0FSRV9CVUlMRD15CiAjIENPTkZJR19GV19MT0FERVIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfRFJJVkVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0RFVlJFUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TWVNfSFlQRVJWSVNPUiBpcyBub3Qgc2V0CiAjIENPTkZJR19DT05ORUNUT1IgaXMgbm90IHNldAogQ09ORklHX01URD15CkBAIC00NzMsNiArNDg5LDcgQEAKIENPTkZJR19NVERfUEFSVElUSU9OUz15CiAjIENPTkZJR19NVERfUkVEQk9PVF9QQVJUUyBpcyBub3Qgc2V0CiAjIENPTkZJR19NVERfQ01ETElORV9QQVJUUyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQVI3X1BBUlRTIGlzIG5vdCBzZXQKIAogIwogIyBVc2VyIE1vZHVsZXMgQW5kIFRyYW5zbGF0aW9uIExheWVycwpAQCAtNTE2LDYgKzUzMyw3IEBACiAjCiBDT05GSUdfTVREX0NPTVBMRVhfTUFQUElOR1M9eQogIyBDT05GSUdfTVREX1BIWVNNQVAgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0dQSU9fQUREUiBpcyBub3Qgc2V0CiAjIENPTkZJR19NVERfVUNMSU5VWCBpcyBub3Qgc2V0CiAjIENPTkZJR19NVERfUExBVFJBTSBpcyBub3Qgc2V0CiAKQEAgLTU1MCwxMSArNTY4LDE0IEBACiBDT05GSUdfQkxLX0RFVl9SQU09eQogQ09ORklHX0JMS19ERVZfUkFNX0NPVU5UPTE2CiBDT05GSUdfQkxLX0RFVl9SQU1fU0laRT00MDk2Ci1DT05GSUdfQkxLX0RFVl9SQU1fQkxPQ0tTSVpFPTEwMjQKKyMgQ09ORklHX0JMS19ERVZfWElQIGlzIG5vdCBzZXQKICMgQ09ORklHX0NEUk9NX1BLVENEVkQgaXMgbm90IHNldAogIyBDT05GSUdfQVRBX09WRVJfRVRIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSEQgaXMgbm90IHNldAogQ09ORklHX01JU0NfREVWSUNFUz15CiAjIENPTkZJR19FRVBST01fOTNDWDYgaXMgbm90IHNldAorIyBDT05GSUdfRU5DTE9TVVJFX1NFUlZJQ0VTIGlzIG5vdCBzZXQKK0NPTkZJR19IQVZFX0lERT15CiAjIENPTkZJR19JREUgaXMgbm90IHNldAogCiAjCkBAIC01NjcsNyArNTg4LDYgQEAKICMgQ09ORklHX0FUQSBpcyBub3Qgc2V0CiAjIENPTkZJR19NRCBpcyBub3Qgc2V0CiBDT05GSUdfTkVUREVWSUNFUz15Ci0jIENPTkZJR19ORVRERVZJQ0VTX01VTFRJUVVFVUUgaXMgbm90IHNldAogIyBDT05GSUdfRFVNTVkgaXMgbm90IHNldAogIyBDT05GSUdfQk9ORElORyBpcyBub3Qgc2V0CiAjIENPTkZJR19NQUNWTEFOIGlzIG5vdCBzZXQKQEAgLTU4MCwxMSArNjAwLDE0IEBACiBDT05GSUdfU01DOTFYPXkKICMgQ09ORklHX1NNU0M5MTFYIGlzIG5vdCBzZXQKICMgQ09ORklHX0RNOTAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19FTkMyOEo2MCBpcyBub3Qgc2V0CiAjIENPTkZJR19JQk1fTkVXX0VNQUNfWk1JSSBpcyBub3Qgc2V0CiAjIENPTkZJR19JQk1fTkVXX0VNQUNfUkdNSUkgaXMgbm90IHNldAogIyBDT05GSUdfSUJNX05FV19FTUFDX1RBSCBpcyBub3Qgc2V0CiAjIENPTkZJR19JQk1fTkVXX0VNQUNfRU1BQzQgaXMgbm90IHNldAotIyBDT05GSUdfQjQ0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0lCTV9ORVdfRU1BQ19OT19GTE9XX0NUUkwgaXMgbm90IHNldAorIyBDT05GSUdfSUJNX05FV19FTUFDX01BTF9DTFJfSUNJTlRTVEFUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lCTV9ORVdfRU1BQ19NQUxfQ09NTU9OX0VSUiBpcyBub3Qgc2V0CiBDT05GSUdfTkVUREVWXzEwMDA9eQogIyBDT05GSUdfQVg4ODE4MCBpcyBub3Qgc2V0CiBDT05GSUdfTkVUREVWXzEwMDAwPXkKQEAgLTU5NCwxMCArNjE3LDEwIEBACiAjCiAjIENPTkZJR19XTEFOX1BSRTgwMjExIGlzIG5vdCBzZXQKICMgQ09ORklHX1dMQU5fODAyMTEgaXMgbm90IHNldAorIyBDT05GSUdfSVdMV0lGSV9MRURTIGlzIG5vdCBzZXQKICMgQ09ORklHX1dBTiBpcyBub3Qgc2V0CiAjIENPTkZJR19QUFAgaXMgbm90IHNldAogIyBDT05GSUdfU0xJUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSEFQRVIgaXMgbm90IHNldAogIyBDT05GSUdfTkVUQ09OU09MRSBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRQT0xMIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIgaXMgbm90IHNldApAQCAtNjQ1LDggKzY2OCwxMSBAQAogIyBDT05GSUdfQkY1eHhfUFBJIGlzIG5vdCBzZXQKIENPTkZJR19CRklOX1NQT1JUPXkKICMgQ09ORklHX0JGSU5fVElNRVJfTEFURU5DWSBpcyBub3Qgc2V0CitDT05GSUdfQkZJTl9ETUFfSU5URVJGQUNFPW0KIENPTkZJR19TSU1QTEVfR1BJTz1tCiAjIENPTkZJR19WVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERVZLTUVNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGSU5fSlRBR19DT01NIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFUklBTF9OT05TVEFOREFSRCBpcyBub3Qgc2V0CiAKICMKQEAgLTY3NSwyMiArNzAxLDE5IEBACiAjIENPTkZJR19DQU40TElOVVggaXMgbm90IHNldAogIyBDT05GSUdfSVBNSV9IQU5ETEVSIGlzIG5vdCBzZXQKICMgQ09ORklHX0hXX1JBTkRPTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19HRU5fUlRDIGlzIG5vdCBzZXQKICMgQ09ORklHX1IzOTY0IGlzIG5vdCBzZXQKICMgQ09ORklHX1JBV19EUklWRVIgaXMgbm90IHNldAogIyBDT05GSUdfVENHX1RQTSBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkMgaXMgbm90IHNldAotCi0jCi0jIFNQSSBzdXBwb3J0Ci0jCiBDT05GSUdfU1BJPXkKKyMgQ09ORklHX1NQSV9ERUJVRyBpcyBub3Qgc2V0CiBDT05GSUdfU1BJX01BU1RFUj15CiAKICMKICMgU1BJIE1hc3RlciBDb250cm9sbGVyIERyaXZlcnMKICMKIENPTkZJR19TUElfQkZJTj15CisjIENPTkZJR19TUElfQkZJTl9MT0NLIGlzIG5vdCBzZXQKICMgQ09ORklHX1NQSV9CSVRCQU5HIGlzIG5vdCBzZXQKIAogIwpAQCAtNjk5LDE0ICs3MjIsMTggQEAKICMgQ09ORklHX1NQSV9BVDI1IGlzIG5vdCBzZXQKICMgQ09ORklHX1NQSV9TUElERVYgaXMgbm90IHNldAogIyBDT05GSUdfU1BJX1RMRTYyWDAgaXMgbm90IHNldAorQ09ORklHX0FSQ0hfV0FOVF9PUFRJT05BTF9HUElPTElCPXkKKyMgQ09ORklHX0dQSU9MSUIgaXMgbm90IHNldAogIyBDT05GSUdfVzEgaXMgbm90IHNldAogIyBDT05GSUdfUE9XRVJfU1VQUExZIGlzIG5vdCBzZXQKIENPTkZJR19IV01PTj15CiAjIENPTkZJR19IV01PTl9WSUQgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRENYWCBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0Y3MTgwNUYgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19GNzE4ODJGRyBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0lUODcgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19MTTcwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTUFYMTExMSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1BDODczNjAgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19QQzg3NDI3IGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfU01TQzQ3TTEgaXMgbm90IHNldApAQCAtNzE1LDYgKzc0Miw4IEBACiAjIENPTkZJR19TRU5TT1JTX1c4MzYyN0hGIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfVzgzNjI3RUhGIGlzIG5vdCBzZXQKICMgQ09ORklHX0hXTU9OX0RFQlVHX0NISVAgaXMgbm90IHNldAorIyBDT05GSUdfVEhFUk1BTCBpcyBub3Qgc2V0CisjIENPTkZJR19USEVSTUFMX0hXTU9OIGlzIG5vdCBzZXQKIENPTkZJR19XQVRDSERPRz15CiAjIENPTkZJR19XQVRDSERPR19OT1dBWU9VVCBpcyBub3Qgc2V0CiAKQEAgLTcyNSwyMSArNzU0LDI4IEBACiBDT05GSUdfQkZJTl9XRFQ9eQogCiAjCi0jIFNvbmljcyBTaWxpY29uIEJhY2twbGFuZQotIwotQ09ORklHX1NTQl9QT1NTSUJMRT15Ci0jIENPTkZJR19TU0IgaXMgbm90IHNldAotCi0jCiAjIE11bHRpZnVuY3Rpb24gZGV2aWNlIGRyaXZlcnMKICMKKyMgQ09ORklHX01GRF9DT1JFIGlzIG5vdCBzZXQKICMgQ09ORklHX01GRF9TTTUwMSBpcyBub3Qgc2V0CisjIENPTkZJR19IVENfUEFTSUMzIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9UTUlPIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9XTTg0MDAgaXMgbm90IHNldAogCiAjCiAjIE11bHRpbWVkaWEgZGV2aWNlcwogIworCisjCisjIE11bHRpbWVkaWEgY29yZSBzdXBwb3J0CisjCiAjIENPTkZJR19WSURFT19ERVYgaXMgbm90IHNldAogIyBDT05GSUdfRFZCX0NPUkUgaXMgbm90IHNldAorIyBDT05GSUdfVklERU9fTUVESUEgaXMgbm90IHNldAorCisjCisjIE11bHRpbWVkaWEgZHJpdmVycworIwogIyBDT05GSUdfREFCIGlzIG5vdCBzZXQKIAogIwpAQCAtNzU0LDE4ICs3OTAsMjIgQEAKICMgRGlzcGxheSBkZXZpY2Ugc3VwcG9ydAogIwogIyBDT05GSUdfRElTUExBWV9TVVBQT1JUIGlzIG5vdCBzZXQKLQotIwotIyBTb3VuZAotIwogIyBDT05GSUdfU09VTkQgaXMgbm90IHNldAogQ09ORklHX0hJRF9TVVBQT1JUPXkKIENPTkZJR19ISUQ9bQogIyBDT05GSUdfSElEX0RFQlVHIGlzIG5vdCBzZXQKICMgQ09ORklHX0hJRFJBVyBpcyBub3Qgc2V0CisjIENPTkZJR19ISURfUElEIGlzIG5vdCBzZXQKKworIworIyBTcGVjaWFsIEhJRCBkcml2ZXJzCisjCitDT05GSUdfSElEX0NPTVBBVD15CiAjIENPTkZJR19VU0JfU1VQUE9SVCBpcyBub3Qgc2V0CiAjIENPTkZJR19NTUMgaXMgbm90IHNldAorIyBDT05GSUdfTUVNU1RJQ0sgaXMgbm90IHNldAogIyBDT05GSUdfTkVXX0xFRFMgaXMgbm90IHNldAorIyBDT05GSUdfQUNDRVNTSUJJTElUWSBpcyBub3Qgc2V0CiBDT05GSUdfUlRDX0xJQj15CiBDT05GSUdfUlRDX0NMQVNTPXkKIENPTkZJR19SVENfSENUT1NZUz15CkBAIC03ODQsNDcgKzgyNCw1MSBAQAogIwogIyBTUEkgUlRDIGRyaXZlcnMKICMKLSMgQ09ORklHX1JUQ19EUlZfUlM1QzM0OCBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX000MVQ5NCBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0RTMTMwNSBpcyBub3Qgc2V0CiAjIENPTkZJR19SVENfRFJWX01BWDY5MDIgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9SOTcwMSBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1JTNUMzNDggaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9EUzMyMzQgaXMgbm90IHNldAogCiAjCiAjIFBsYXRmb3JtIFJUQyBkcml2ZXJzCiAjCisjIENPTkZJR19SVENfRFJWX0RTMTI4NiBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0RTMTUxMSBpcyBub3Qgc2V0CiAjIENPTkZJR19SVENfRFJWX0RTMTU1MyBpcyBub3Qgc2V0Ci0jIENPTkZJR19SVENfRFJWX1NUSzE3VEE4IGlzIG5vdCBzZXQKICMgQ09ORklHX1JUQ19EUlZfRFMxNzQyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfU1RLMTdUQTggaXMgbm90IHNldAogIyBDT05GSUdfUlRDX0RSVl9NNDhUODYgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9NNDhUMzUgaXMgbm90IHNldAogIyBDT05GSUdfUlRDX0RSVl9NNDhUNTkgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9CUTQ4MDIgaXMgbm90IHNldAogIyBDT05GSUdfUlRDX0RSVl9WMzAyMCBpcyBub3Qgc2V0CiAKICMKICMgb24tQ1BVIFJUQyBkcml2ZXJzCiAjCiBDT05GSUdfUlRDX0RSVl9CRklOPXkKLQotIwotIyBVc2Vyc3BhY2UgSS9PCi0jCisjIENPTkZJR19ETUFERVZJQ0VTIGlzIG5vdCBzZXQKICMgQ09ORklHX1VJTyBpcyBub3Qgc2V0CisjIENPTkZJR19TVEFHSU5HIGlzIG5vdCBzZXQKIAogIwogIyBGaWxlIHN5c3RlbXMKICMKICMgQ09ORklHX0VYVDJfRlMgaXMgbm90IHNldAogIyBDT05GSUdfRVhUM19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19FWFQ0REVWX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDRfRlMgaXMgbm90IHNldAogIyBDT05GSUdfUkVJU0VSRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfSkZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CitDT05GSUdfRklMRV9MT0NLSU5HPXkKICMgQ09ORklHX1hGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19HRlMyX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX09DRlMyX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX01JTklYX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1JPTUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ROT1RJRlkgaXMgbm90IHNldAogQ09ORklHX0lOT1RJRlk9eQogQ09ORklHX0lOT1RJRllfVVNFUj15CiAjIENPTkZJR19RVU9UQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19ETk9USUZZIGlzIG5vdCBzZXQKICMgQ09ORklHX0FVVE9GU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19BVVRPRlM0X0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZVU0VfRlMgaXMgbm90IHNldApAQCAtODY0LDExICs5MDgsMTEgQEAKICMgQ09ORklHX0VGU19GUyBpcyBub3Qgc2V0CiBDT05GSUdfWUFGRlNfRlM9bQogQ09ORklHX1lBRkZTX1lBRkZTMT15CisjIENPTkZJR19ZQUZGU185QllURV9UQUdTIGlzIG5vdCBzZXQKICMgQ09ORklHX1lBRkZTX0RPRVNfRUNDIGlzIG5vdCBzZXQKIENPTkZJR19ZQUZGU19ZQUZGUzI9eQogQ09ORklHX1lBRkZTX0FVVE9fWUFGRlMyPXkKICMgQ09ORklHX1lBRkZTX0RJU0FCTEVfTEFaWV9MT0FEIGlzIG5vdCBzZXQKLUNPTkZJR19ZQUZGU19DSEVDS1BPSU5UX1JFU0VSVkVEX0JMT0NLUz0xMAogIyBDT05GSUdfWUFGRlNfRElTQUJMRV9XSURFX1ROT0RFUyBpcyBub3Qgc2V0CiAjIENPTkZJR19ZQUZGU19BTFdBWVNfQ0hFQ0tfQ0hVTktfRVJBU0VEIGlzIG5vdCBzZXQKIENPTkZJR19ZQUZGU19TSE9SVF9OQU1FU19JTl9SQU09eQpAQCAtODg1LDggKzkyOSwxMSBAQAogIyBDT05GSUdfSkZGUzJfUlVCSU4gaXMgbm90IHNldAogIyBDT05GSUdfQ1JBTUZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1ZYRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTUlOSVhfRlMgaXMgbm90IHNldAorIyBDT05GSUdfT01GU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19IUEZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1FOWDRGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19ST01GU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TWVNWX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1VGU19GUyBpcyBub3Qgc2V0CiBDT05GSUdfTkVUV09SS19GSUxFU1lTVEVNUz15CkBAIC04OTQsMTMgKzk0MSwxMiBAQAogQ09ORklHX05GU19WMz15CiAjIENPTkZJR19ORlNfVjNfQUNMIGlzIG5vdCBzZXQKICMgQ09ORklHX05GU19WNCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORlNfRElSRUNUSU8gaXMgbm90IHNldAogIyBDT05GSUdfTkZTRCBpcyBub3Qgc2V0CiBDT05GSUdfTE9DS0Q9bQogQ09ORklHX0xPQ0tEX1Y0PXkKIENPTkZJR19ORlNfQ09NTU9OPXkKIENPTkZJR19TVU5SUEM9bQotIyBDT05GSUdfU1VOUlBDX0JJTkQzNCBpcyBub3Qgc2V0CisjIENPTkZJR19TVU5SUENfUkVHSVNURVJfVjQgaXMgbm90IHNldAogIyBDT05GSUdfUlBDU0VDX0dTU19LUkI1IGlzIG5vdCBzZXQKICMgQ09ORklHX1JQQ1NFQ19HU1NfU1BLTTMgaXMgbm90IHNldAogQ09ORklHX1NNQl9GUz1tCkBAIC05NTYsOSArMTAwMiw2IEBACiAjIENPTkZJR19OTFNfS09JOF9VIGlzIG5vdCBzZXQKICMgQ09ORklHX05MU19VVEY4IGlzIG5vdCBzZXQKICMgQ09ORklHX0RMTSBpcyBub3Qgc2V0Ci1DT05GSUdfSU5TVFJVTUVOVEFUSU9OPXkKLSMgQ09ORklHX1BST0ZJTElORyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NQVJLRVJTIGlzIG5vdCBzZXQKIAogIwogIyBLZXJuZWwgaGFja2luZwpAQCAtOTY2LDE0ICsxMDA5LDUzIEBACiAjIENPTkZJR19QUklOVEtfVElNRSBpcyBub3Qgc2V0CiBDT05GSUdfRU5BQkxFX1dBUk5fREVQUkVDQVRFRD15CiBDT05GSUdfRU5BQkxFX01VU1RfQ0hFQ0s9eQorQ09ORklHX0ZSQU1FX1dBUk49MTAyNAogIyBDT05GSUdfTUFHSUNfU1lTUlEgaXMgbm90IHNldAogIyBDT05GSUdfVU5VU0VEX1NZTUJPTFMgaXMgbm90IHNldAogQ09ORklHX0RFQlVHX0ZTPXkKICMgQ09ORklHX0hFQURFUlNfQ0hFQ0sgaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfS0VSTkVMIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19LRVJORUw9eQorIyBDT05GSUdfREVCVUdfU0hJUlEgaXMgbm90IHNldAorQ09ORklHX0RFVEVDVF9TT0ZUTE9DS1VQPXkKKyMgQ09ORklHX0JPT1RQQVJBTV9TT0ZUTE9DS1VQX1BBTklDIGlzIG5vdCBzZXQKK0NPTkZJR19CT09UUEFSQU1fU09GVExPQ0tVUF9QQU5JQ19WQUxVRT0wCitDT05GSUdfU0NIRURfREVCVUc9eQorIyBDT05GSUdfU0NIRURTVEFUUyBpcyBub3Qgc2V0CisjIENPTkZJR19USU1FUl9TVEFUUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19PQkpFQ1RTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NMQUIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfUlRfTVVURVhFUyBpcyBub3Qgc2V0CisjIENPTkZJR19SVF9NVVRFWF9URVNURVIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU1BJTkxPQ0sgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfTVVURVhFUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TUElOTE9DS19TTEVFUCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19MT0NLSU5HX0FQSV9TRUxGVEVTVFMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfS09CSkVDVCBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19CVUdWRVJCT1NFIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19JTkZPPXkKKyMgQ09ORklHX0RFQlVHX1ZNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1dSSVRFQ09VTlQgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfTUVNT1JZX0lOSVQgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfTElTVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TRyBpcyBub3Qgc2V0CisjIENPTkZJR19GUkFNRV9QT0lOVEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JPT1RfUFJJTlRLX0RFTEFZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JDVV9UT1JUVVJFX1RFU1QgaXMgbm90IHNldAorIyBDT05GSUdfUkNVX0NQVV9TVEFMTF9ERVRFQ1RPUiBpcyBub3Qgc2V0CisjIENPTkZJR19CQUNLVFJBQ0VfU0VMRl9URVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0JMT0NLX0VYVF9ERVZUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZBVUxUX0lOSkVDVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19TWVNDVExfU1lTQ0FMTF9DSEVDSyBpcyBub3Qgc2V0CisjIENPTkZJR19EWU5BTUlDX1BSSU5US19ERUJVRyBpcyBub3Qgc2V0CiAjIENPTkZJR19TQU1QTEVTIGlzIG5vdCBzZXQKK0NPTkZJR19IQVZFX0FSQ0hfS0dEQj15CisjIENPTkZJR19LR0RCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NUQUNLT1ZFUkZMT1cgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU1RBQ0tfVVNBR0UgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX1ZFUkJPU0U9eQogQ09ORklHX0RFQlVHX01NUlM9eQorIyBDT05GSUdfREVCVUdfSFdFUlIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfRE9VQkxFRkFVTFQgaXMgbm90IHNldAogQ09ORklHX0RFQlVHX0hVTlRfRk9SX1pFUk89eQogQ09ORklHX0RFQlVHX0JGSU5fSFdUUkFDRV9PTj15CiBDT05GSUdfREVCVUdfQkZJTl9IV1RSQUNFX0NPTVBSRVNTSU9OX09GRj15CkBAIC05OTEsOSArMTA3Myw5NCBAQAogIwogIyBDT05GSUdfS0VZUyBpcyBub3Qgc2V0CiBDT05GSUdfU0VDVVJJVFk9eQorIyBDT05GSUdfU0VDVVJJVFlGUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TRUNVUklUWV9ORVRXT1JLIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFQ1VSSVRZX0NBUEFCSUxJVElFUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE8gaXMgbm90IHNldAorIyBDT05GSUdfU0VDVVJJVFlfRklMRV9DQVBBQklMSVRJRVMgaXMgbm90IHNldAorQ09ORklHX1NFQ1VSSVRZX0RFRkFVTFRfTU1BUF9NSU5fQUREUj0wCitDT05GSUdfQ1JZUFRPPXkKKworIworIyBDcnlwdG8gY29yZSBvciBoZWxwZXIKKyMKKyMgQ09ORklHX0NSWVBUT19GSVBTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19NQU5BR0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19HRjEyOE1VTCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTlVMTCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ1JZUFREIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19BVVRIRU5DIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19URVNUIGlzIG5vdCBzZXQKKworIworIyBBdXRoZW50aWNhdGVkIEVuY3J5cHRpb24gd2l0aCBBc3NvY2lhdGVkIERhdGEKKyMKKyMgQ09ORklHX0NSWVBUT19DQ00gaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0dDTSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0VRSVYgaXMgbm90IHNldAorCisjCisjIEJsb2NrIG1vZGVzCisjCisjIENPTkZJR19DUllQVE9fQ0JDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DVFIgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NUUyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fRUNCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19MUlcgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1BDQkMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1hUUyBpcyBub3Qgc2V0CisKKyMKKyMgSGFzaCBtb2RlcworIworIyBDT05GSUdfQ1JZUFRPX0hNQUMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1hDQkMgaXMgbm90IHNldAorCisjCisjIERpZ2VzdAorIworIyBDT05GSUdfQ1JZUFRPX0NSQzMyQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTUQ0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19NRDUgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX01JQ0hBRUxfTUlDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19STUQxMjggaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1JNRDE2MCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fUk1EMjU2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19STUQzMjAgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NIQTEgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NIQTI1NiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0hBNTEyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19UR1IxOTIgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1dQNTEyIGlzIG5vdCBzZXQKKworIworIyBDaXBoZXJzCisjCisjIENPTkZJR19DUllQVE9fQUVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19BTlVCSVMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0FSQzQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0JMT1dGSVNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DQU1FTExJQSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ0FTVDUgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NBU1Q2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19ERVMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0ZDUllQVCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fS0hBWkFEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TQUxTQTIwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TRUVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TRVJQRU5UIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19URUEgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1RXT0ZJU0ggaXMgbm90IHNldAorCisjCisjIENvbXByZXNzaW9uCisjCisjIENPTkZJR19DUllQVE9fREVGTEFURSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTFpPIGlzIG5vdCBzZXQKKworIworIyBSYW5kb20gTnVtYmVyIEdlbmVyYXRpb24KKyMKKyMgQ09ORklHX0NSWVBUT19BTlNJX0NQUk5HIGlzIG5vdCBzZXQKK0NPTkZJR19DUllQVE9fSFc9eQogCiAjCiAjIExpYnJhcnkgcm91dGluZXMKQEAgLTEwMDEsNiArMTE2OCw3IEBACiBDT05GSUdfQklUUkVWRVJTRT15CiBDT05GSUdfQ1JDX0NDSVRUPW0KICMgQ09ORklHX0NSQzE2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQ19UMTBESUYgaXMgbm90IHNldAogIyBDT05GSUdfQ1JDX0lUVV9UIGlzIG5vdCBzZXQKIENPTkZJR19DUkMzMj15CiAjIENPTkZJR19DUkM3IGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vY29uZmlncy9CRjUzMy1TVEFNUF9kZWZjb25maWcgYi9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvQkY1MzMtU1RBTVBfZGVmY29uZmlnCmluZGV4IGMyMzI2N2UuLjQ5ZWFiYjQgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vY29uZmlncy9CRjUzMy1TVEFNUF9kZWZjb25maWcKKysrIGIvYXJjaC9ibGFja2Zpbi9jb25maWdzL0JGNTMzLVNUQU1QX2RlZmNvbmZpZwpAQCAtMSw2ICsxLDYgQEAKICMKICMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKLSMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4yNC43CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMjgtcmMyCiAjCiAjIENPTkZJR19NTVUgaXMgbm90IHNldAogIyBDT05GSUdfRlBVIGlzIG5vdCBzZXQKQEAgLTgsNyArOCw2IEBACiAjIENPTkZJR19SV1NFTV9YQ0hHQUREX0FMR09SSVRITSBpcyBub3Qgc2V0CiBDT05GSUdfQkxBQ0tGSU49eQogQ09ORklHX1pPTkVfRE1BPXkKLUNPTkZJR19TRU1BUEhPUkVfU0xFRVBFUlM9eQogQ09ORklHX0dFTkVSSUNfRklORF9ORVhUX0JJVD15CiBDT05GSUdfR0VORVJJQ19IV0VJR0hUPXkKIENPTkZJR19HRU5FUklDX0hBUkRJUlFTPXkKQEAgLTMxLDE4ICszMCwxNiBAQAogIyBDT05GSUdfUE9TSVhfTVFVRVVFIGlzIG5vdCBzZXQKICMgQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1QgaXMgbm90IHNldAogIyBDT05GSUdfVEFTS1NUQVRTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTRVJfTlMgaXMgbm90IHNldAotIyBDT05GSUdfUElEX05TIGlzIG5vdCBzZXQKICMgQ09ORklHX0FVRElUIGlzIG5vdCBzZXQKIENPTkZJR19JS0NPTkZJRz15CiBDT05GSUdfSUtDT05GSUdfUFJPQz15CiBDT05GSUdfTE9HX0JVRl9TSElGVD0xNAogIyBDT05GSUdfQ0dST1VQUyBpcyBub3Qgc2V0Ci1DT05GSUdfRkFJUl9HUk9VUF9TQ0hFRD15Ci1DT05GSUdfRkFJUl9VU0VSX1NDSEVEPXkKLSMgQ09ORklHX0ZBSVJfQ0dST1VQX1NDSEVEIGlzIG5vdCBzZXQKLUNPTkZJR19TWVNGU19ERVBSRUNBVEVEPXkKKyMgQ09ORklHX0dST1VQX1NDSEVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU0ZTX0RFUFJFQ0FURUQgaXMgbm90IHNldAorIyBDT05GSUdfU1lTRlNfREVQUkVDQVRFRF9WMiBpcyBub3Qgc2V0CiAjIENPTkZJR19SRUxBWSBpcyBub3Qgc2V0CisjIENPTkZJR19OQU1FU1BBQ0VTIGlzIG5vdCBzZXQKIENPTkZJR19CTEtfREVWX0lOSVRSRD15CiBDT05GSUdfSU5JVFJBTUZTX1NPVVJDRT0iIgogIyBDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkUgaXMgbm90IHNldApAQCAtNTEsMjYgKzQ4LDM1IEBACiBDT05GSUdfVUlEMTY9eQogQ09ORklHX1NZU0NUTF9TWVNDQUxMPXkKIENPTkZJR19LQUxMU1lNUz15CisjIENPTkZJR19LQUxMU1lNU19BTEwgaXMgbm90IHNldAogIyBDT05GSUdfS0FMTFNZTVNfRVhUUkFfUEFTUyBpcyBub3Qgc2V0CiBDT05GSUdfSE9UUExVRz15CiBDT05GSUdfUFJJTlRLPXkKIENPTkZJR19CVUc9eQotQ09ORklHX0VMRl9DT1JFPXkKKyMgQ09ORklHX0VMRl9DT1JFIGlzIG5vdCBzZXQKK0NPTkZJR19DT01QQVRfQlJLPXkKIENPTkZJR19CQVNFX0ZVTEw9eQogQ09ORklHX0ZVVEVYPXkKIENPTkZJR19BTk9OX0lOT0RFUz15CiBDT05GSUdfRVBPTEw9eQogQ09ORklHX1NJR05BTEZEPXkKK0NPTkZJR19USU1FUkZEPXkKIENPTkZJR19FVkVOVEZEPXkKK0NPTkZJR19BSU89eQogQ09ORklHX1ZNX0VWRU5UX0NPVU5URVJTPXkKIENPTkZJR19TTEFCPXkKICMgQ09ORklHX1NMVUIgaXMgbm90IHNldAogIyBDT05GSUdfU0xPQiBpcyBub3Qgc2V0CisjIENPTkZJR19QUk9GSUxJTkcgaXMgbm90IHNldAorIyBDT05GSUdfTUFSS0VSUyBpcyBub3Qgc2V0CitDT05GSUdfSEFWRV9PUFJPRklMRT15CisjIENPTkZJR19IQVZFX0dFTkVSSUNfRE1BX0NPSEVSRU5UIGlzIG5vdCBzZXQKIENPTkZJR19TTEFCSU5GTz15CiBDT05GSUdfUlRfTVVURVhFUz15CiBDT05GSUdfVElOWV9TSE1FTT15CiBDT05GSUdfQkFTRV9TTUFMTD0wCiBDT05GSUdfTU9EVUxFUz15CisjIENPTkZJR19NT0RVTEVfRk9SQ0VfTE9BRCBpcyBub3Qgc2V0CiBDT05GSUdfTU9EVUxFX1VOTE9BRD15CiAjIENPTkZJR19NT0RVTEVfRk9SQ0VfVU5MT0FEIGlzIG5vdCBzZXQKICMgQ09ORklHX01PRFZFUlNJT05TIGlzIG5vdCBzZXQKQEAgLTgxLDYgKzg3LDcgQEAKICMgQ09ORklHX0JMS19ERVZfSU9fVFJBQ0UgaXMgbm90IHNldAogIyBDT05GSUdfTFNGIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfQlNHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSU5URUdSSVRZIGlzIG5vdCBzZXQKIAogIwogIyBJTyBTY2hlZHVsZXJzCkBAIC05NCw5ICsxMDEsMTEgQEAKICMgQ09ORklHX0RFRkFVTFRfQ0ZRIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFRkFVTFRfTk9PUCBpcyBub3Qgc2V0CiBDT05GSUdfREVGQVVMVF9JT1NDSEVEPSJhbnRpY2lwYXRvcnkiCitDT05GSUdfQ0xBU1NJQ19SQ1U9eQogIyBDT05GSUdfUFJFRU1QVF9OT05FIGlzIG5vdCBzZXQKIENPTkZJR19QUkVFTVBUX1ZPTFVOVEFSWT15CiAjIENPTkZJR19QUkVFTVBUIGlzIG5vdCBzZXQKK0NPTkZJR19GUkVFWkVSPXkKIAogIwogIyBCbGFja2ZpbiBQcm9jZXNzb3IgT3B0aW9ucwpAQCAtMTA1LDYgKzExNCwxMCBAQAogIwogIyBQcm9jZXNzb3IgYW5kIEJvYXJkIFNldHRpbmdzCiAjCisjIENPTkZJR19CRjUxMiBpcyBub3Qgc2V0CisjIENPTkZJR19CRjUxNCBpcyBub3Qgc2V0CisjIENPTkZJR19CRjUxNiBpcyBub3Qgc2V0CisjIENPTkZJR19CRjUxOCBpcyBub3Qgc2V0CiAjIENPTkZJR19CRjUyMiBpcyBub3Qgc2V0CiAjIENPTkZJR19CRjUyMyBpcyBub3Qgc2V0CiAjIENPTkZJR19CRjUyNCBpcyBub3Qgc2V0CkBAIC0xMTcsMjQgKzEzMCwzMCBAQAogIyBDT05GSUdfQkY1MzQgaXMgbm90IHNldAogIyBDT05GSUdfQkY1MzYgaXMgbm90IHNldAogIyBDT05GSUdfQkY1MzcgaXMgbm90IHNldAorIyBDT05GSUdfQkY1MzggaXMgbm90IHNldAorIyBDT05GSUdfQkY1MzkgaXMgbm90IHNldAogIyBDT05GSUdfQkY1NDIgaXMgbm90IHNldAogIyBDT05GSUdfQkY1NDQgaXMgbm90IHNldAogIyBDT05GSUdfQkY1NDcgaXMgbm90IHNldAogIyBDT05GSUdfQkY1NDggaXMgbm90IHNldAogIyBDT05GSUdfQkY1NDkgaXMgbm90IHNldAogIyBDT05GSUdfQkY1NjEgaXMgbm90IHNldAorQ09ORklHX0JGX1JFVl9NSU49MworQ09ORklHX0JGX1JFVl9NQVg9NgogIyBDT05GSUdfQkZfUkVWXzBfMCBpcyBub3Qgc2V0CiAjIENPTkZJR19CRl9SRVZfMF8xIGlzIG5vdCBzZXQKICMgQ09ORklHX0JGX1JFVl8wXzIgaXMgbm90IHNldAogQ09ORklHX0JGX1JFVl8wXzM9eQogIyBDT05GSUdfQkZfUkVWXzBfNCBpcyBub3Qgc2V0CiAjIENPTkZJR19CRl9SRVZfMF81IGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGX1JFVl8wXzYgaXMgbm90IHNldAogIyBDT05GSUdfQkZfUkVWX0FOWSBpcyBub3Qgc2V0CiAjIENPTkZJR19CRl9SRVZfTk9ORSBpcyBub3Qgc2V0CiBDT05GSUdfQkY1M3g9eQogQ09ORklHX01FTV9NVDQ4TEM2NE00QTJGQl83RT15CiAjIENPTkZJR19CRklONTMzX0VaS0lUIGlzIG5vdCBzZXQKIENPTkZJR19CRklONTMzX1NUQU1QPXkKKyMgQ09ORklHX0JMQUNLU1RBTVAgaXMgbm90IHNldAogIyBDT05GSUdfQkZJTjUzM19CTFVFVEVDSE5JWF9DTSBpcyBub3Qgc2V0CiAjIENPTkZJR19IODYwNl9IVlNJU1RFTUFTIGlzIG5vdCBzZXQKICMgQ09ORklHX0JGSU41MzJfSVAwWCBpcyBub3Qgc2V0CkBAIC0xODcsNyArMjA2LDYgQEAKICMKIENPTkZJR19DTEtJTl9IWj0xMTA1OTIwMAogIyBDT05GSUdfQkZJTl9LRVJORUxfQ0xPQ0sgaXMgbm90IHNldAotQ09ORklHX01BWF9NRU1fU0laRT01MTIKIENPTkZJR19NQVhfVkNPX0haPTc1MDAwMDAwMAogQ09ORklHX01JTl9WQ09fSFo9NTAwMDAwMDAKIENPTkZJR19NQVhfU0NMS19IWj0xMzMzMzMzMzMKQEAgLTIwMSw2ICsyMTksNyBAQAogIyBDT05GSUdfSFpfMzAwIGlzIG5vdCBzZXQKICMgQ09ORklHX0haXzEwMDAgaXMgbm90IHNldAogQ09ORklHX0haPTI1MAorQ09ORklHX1NDSEVEX0hSVElDSz15CiBDT05GSUdfR0VORVJJQ19USU1FPXkKIENPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTPXkKICMgQ09ORklHX0NZQ0xFU19DTE9DS1NPVVJDRSBpcyBub3Qgc2V0CkBAIC0yMzgsNiArMjU3LDEyIEBACiBDT05GSUdfQ0FDSEVMSU5FX0FMSUdORURfTDE9eQogIyBDT05GSUdfU1lTQ0FMTF9UQUJfTDEgaXMgbm90IHNldAogIyBDT05GSUdfQ1BMQl9TV0lUQ0hfVEFCX0wxIGlzIG5vdCBzZXQKK0NPTkZJR19BUFBfU1RBQ0tfTDE9eQorCisjCisjIFNwZWVkIE9wdGltaXphdGlvbnMKKyMKK0NPTkZJR19CRklOX0lOU19MT1dPVkVSSEVBRD15CiBDT05GSUdfUkFNS0VSTkVMPXkKICMgQ09ORklHX1JPTUtFUk5FTCBpcyBub3Qgc2V0CiBDT05GSUdfU0VMRUNUX01FTU9SWV9NT0RFTD15CkBAIC0yNDYsMTQgKzI3MSwxMyBAQAogIyBDT05GSUdfU1BBUlNFTUVNX01BTlVBTCBpcyBub3Qgc2V0CiBDT05GSUdfRkxBVE1FTT15CiBDT05GSUdfRkxBVF9OT0RFX01FTV9NQVA9eQotIyBDT05GSUdfU1BBUlNFTUVNX1NUQVRJQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TUEFSU0VNRU1fVk1FTU1BUF9FTkFCTEUgaXMgbm90IHNldAorQ09ORklHX1BBR0VGTEFHU19FWFRFTkRFRD15CiBDT05GSUdfU1BMSVRfUFRMT0NLX0NQVVM9NAogIyBDT05GSUdfUkVTT1VSQ0VTXzY0QklUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BIWVNfQUREUl9UXzY0QklUIGlzIG5vdCBzZXQKIENPTkZJR19aT05FX0RNQV9GTEFHPTEKIENPTkZJR19WSVJUX1RPX0JVUz15CiAjIENPTkZJR19CRklOX0dQVElNRVJTIGlzIG5vdCBzZXQKLUNPTkZJR19CRklOX0RNQV81WFg9eQogIyBDT05GSUdfRE1BX1VOQ0FDSEVEXzRNIGlzIG5vdCBzZXQKICMgQ09ORklHX0RNQV9VTkNBQ0hFRF8yTSBpcyBub3Qgc2V0CiBDT05GSUdfRE1BX1VOQ0FDSEVEXzFNPXkKQEAgLTI2OCw3ICsyOTIsNiBAQAogIyBDT05GSUdfQkZJTl9JQ0FDSEVfTE9DSyBpcyBub3Qgc2V0CiAjIENPTkZJR19CRklOX1dCIGlzIG5vdCBzZXQKIENPTkZJR19CRklOX1dUPXkKLUNPTkZJR19MMV9NQVhfUElFQ0U9MTYKICMgQ09ORklHX01QVSBpcyBub3Qgc2V0CiAKICMKQEAgLTI5Nyw3ICszMjAsNiBAQAogIwogIyBCdXMgb3B0aW9ucyAoUENJLCBQQ01DSUEsIEVJU0EsIE1DQSwgSVNBKQogIwotIyBDT05GSUdfUENJIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfU1VQUE9SVFNfTVNJIGlzIG5vdCBzZXQKICMgQ09ORklHX1BDQ0FSRCBpcyBub3Qgc2V0CiAKQEAgLTMwOCwyOSArMzMwLDMwIEBACiBDT05GSUdfQklORk1UX0ZMQVQ9eQogQ09ORklHX0JJTkZNVF9aRkxBVD15CiAjIENPTkZJR19CSU5GTVRfU0hBUkVEX0ZMQVQgaXMgbm90IHNldAorIyBDT05GSUdfSEFWRV9BT1VUIGlzIG5vdCBzZXQKICMgQ09ORklHX0JJTkZNVF9NSVNDIGlzIG5vdCBzZXQKIAogIwogIyBQb3dlciBtYW5hZ2VtZW50IG9wdGlvbnMKICMKIENPTkZJR19QTT15Ci0jIENPTkZJR19QTV9MRUdBQ1kgaXMgbm90IHNldAogIyBDT05GSUdfUE1fREVCVUcgaXMgbm90IHNldAogQ09ORklHX1BNX1NMRUVQPXkKLUNPTkZJR19TVVNQRU5EX1VQX1BPU1NJQkxFPXkKIENPTkZJR19TVVNQRU5EPXkKK0NPTkZJR19TVVNQRU5EX0ZSRUVaRVI9eQorQ09ORklHX0FSQ0hfU1VTUEVORF9QT1NTSUJMRT15CiBDT05GSUdfUE1fQkZJTl9TTEVFUF9ERUVQRVI9eQogIyBDT05GSUdfUE1fQkZJTl9TTEVFUCBpcyBub3Qgc2V0CiAjIENPTkZJR19QTV9XQUtFVVBfQllfR1BJTyBpcyBub3Qgc2V0CiAKICMKKyMgUG9zc2libGUgU3VzcGVuZCBNZW0gLyBIaWJlcm5hdGUgV2FrZS1VcCBTb3VyY2VzCisjCisKKyMKICMgQ1BVIEZyZXF1ZW5jeSBzY2FsaW5nCiAjCiAjIENPTkZJR19DUFVfRlJFUSBpcyBub3Qgc2V0Ci0KLSMKLSMgTmV0d29ya2luZwotIwogQ09ORklHX05FVD15CiAKICMKQEAgLTM0Myw2ICszNjYsNyBAQAogIyBDT05GSUdfWEZSTV9VU0VSIGlzIG5vdCBzZXQKICMgQ09ORklHX1hGUk1fU1VCX1BPTElDWSBpcyBub3Qgc2V0CiAjIENPTkZJR19YRlJNX01JR1JBVEUgaXMgbm90IHNldAorIyBDT05GSUdfWEZSTV9TVEFUSVNUSUNTIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVF9LRVkgaXMgbm90IHNldAogQ09ORklHX0lORVQ9eQogIyBDT05GSUdfSVBfTVVMVElDQVNUIGlzIG5vdCBzZXQKQEAgLTM3Miw4ICszOTYsNiBAQAogQ09ORklHX0RFRkFVTFRfVENQX0NPTkc9ImN1YmljIgogIyBDT05GSUdfVENQX01ENVNJRyBpcyBub3Qgc2V0CiAjIENPTkZJR19JUFY2IGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVQ2X1hGUk1fVFVOTkVMIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVQ2X1RVTk5FTCBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRMQUJFTCBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRXT1JLX1NFQ01BUksgaXMgbm90IHNldAogIyBDT05GSUdfTkVURklMVEVSIGlzIG5vdCBzZXQKQEAgLTM4Miw2ICs0MDQsNyBAQAogIyBDT05GSUdfVElQQyBpcyBub3Qgc2V0CiAjIENPTkZJR19BVE0gaXMgbm90IHNldAogIyBDT05GSUdfQlJJREdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9EU0EgaXMgbm90IHNldAogIyBDT05GSUdfVkxBTl84MDIxUSBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUNORVQgaXMgbm90IHNldAogIyBDT05GSUdfTExDMiBpcyBub3Qgc2V0CkBAIC0zOTgsNiArNDIxLDcgQEAKICMKICMgQ09ORklHX05FVF9QS1RHRU4gaXMgbm90IHNldAogIyBDT05GSUdfSEFNUkFESU8gaXMgbm90IHNldAorIyBDT05GSUdfQ0FOIGlzIG5vdCBzZXQKIENPTkZJR19JUkRBPW0KIAogIwpAQCAtNDMyLDI0ICs0NTYsMTQgQEAKICMgQ09ORklHX0RPTkdMRSBpcyBub3Qgc2V0CiAKICMKLSMgT2xkIFNJUiBkZXZpY2UgZHJpdmVycwotIwotIyBDT05GSUdfSVJQT1JUX1NJUiBpcyBub3Qgc2V0Ci0KLSMKLSMgT2xkIFNlcmlhbCBkb25nbGUgc3VwcG9ydAotIwotCi0jCiAjIEZJUiBkZXZpY2UgZHJpdmVycwogIwogIyBDT05GSUdfQlQgaXMgbm90IHNldAogIyBDT05GSUdfQUZfUlhSUEMgaXMgbm90IHNldAotCi0jCi0jIFdpcmVsZXNzCi0jCisjIENPTkZJR19QSE9ORVQgaXMgbm90IHNldAorQ09ORklHX1dJUkVMRVNTPXkKICMgQ09ORklHX0NGRzgwMjExIGlzIG5vdCBzZXQKK0NPTkZJR19XSVJFTEVTU19PTERfUkVHVUxBVE9SWT15CiAjIENPTkZJR19XSVJFTEVTU19FWFQgaXMgbm90IHNldAogIyBDT05GSUdfTUFDODAyMTEgaXMgbm90IHNldAogIyBDT05GSUdfSUVFRTgwMjExIGlzIG5vdCBzZXQKQEAgLTQ2Nyw2ICs0ODEsOCBAQAogQ09ORklHX1NUQU5EQUxPTkU9eQogQ09ORklHX1BSRVZFTlRfRklSTVdBUkVfQlVJTEQ9eQogIyBDT05GSUdfRldfTE9BREVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0RSSVZFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19ERVZSRVMgaXMgbm90IHNldAogIyBDT05GSUdfU1lTX0hZUEVSVklTT1IgaXMgbm90IHNldAogIyBDT05GSUdfQ09OTkVDVE9SIGlzIG5vdCBzZXQKIENPTkZJR19NVEQ9eQpAQCAtNDc1LDYgKzQ5MSw3IEBACiBDT05GSUdfTVREX1BBUlRJVElPTlM9eQogIyBDT05GSUdfTVREX1JFREJPT1RfUEFSVFMgaXMgbm90IHNldAogQ09ORklHX01URF9DTURMSU5FX1BBUlRTPXkKKyMgQ09ORklHX01URF9BUjdfUEFSVFMgaXMgbm90IHNldAogCiAjCiAjIFVzZXIgTW9kdWxlcyBBbmQgVHJhbnNsYXRpb24gTGF5ZXJzCkBAIC01MjAsNiArNTM3LDcgQEAKIENPTkZJR19NVERfQ09NUExFWF9NQVBQSU5HUz15CiAjIENPTkZJR19NVERfUEhZU01BUCBpcyBub3Qgc2V0CiBDT05GSUdfTVREX0JGSU5fQVNZTkM9bQorIyBDT05GSUdfTVREX0dQSU9fQUREUiBpcyBub3Qgc2V0CiAjIENPTkZJR19NVERfVUNMSU5VWCBpcyBub3Qgc2V0CiAjIENPTkZJR19NVERfUExBVFJBTSBpcyBub3Qgc2V0CiAKQEAgLTU1NCwxMSArNTcyLDE0IEBACiBDT05GSUdfQkxLX0RFVl9SQU09eQogQ09ORklHX0JMS19ERVZfUkFNX0NPVU5UPTE2CiBDT05GSUdfQkxLX0RFVl9SQU1fU0laRT00MDk2Ci1DT05GSUdfQkxLX0RFVl9SQU1fQkxPQ0tTSVpFPTEwMjQKKyMgQ09ORklHX0JMS19ERVZfWElQIGlzIG5vdCBzZXQKICMgQ09ORklHX0NEUk9NX1BLVENEVkQgaXMgbm90IHNldAogIyBDT05GSUdfQVRBX09WRVJfRVRIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSEQgaXMgbm90IHNldAogQ09ORklHX01JU0NfREVWSUNFUz15CiAjIENPTkZJR19FRVBST01fOTNDWDYgaXMgbm90IHNldAorIyBDT05GSUdfRU5DTE9TVVJFX1NFUlZJQ0VTIGlzIG5vdCBzZXQKK0NPTkZJR19IQVZFX0lERT15CiAjIENPTkZJR19JREUgaXMgbm90IHNldAogCiAjCkBAIC01NzEsNyArNTkyLDYgQEAKICMgQ09ORklHX0FUQSBpcyBub3Qgc2V0CiAjIENPTkZJR19NRCBpcyBub3Qgc2V0CiBDT05GSUdfTkVUREVWSUNFUz15Ci0jIENPTkZJR19ORVRERVZJQ0VTX01VTFRJUVVFVUUgaXMgbm90IHNldAogIyBDT05GSUdfRFVNTVkgaXMgbm90IHNldAogIyBDT05GSUdfQk9ORElORyBpcyBub3Qgc2V0CiAjIENPTkZJR19NQUNWTEFOIGlzIG5vdCBzZXQKQEAgLTU4NCwxMSArNjA0LDE0IEBACiBDT05GSUdfU01DOTFYPXkKICMgQ09ORklHX1NNU0M5MTFYIGlzIG5vdCBzZXQKICMgQ09ORklHX0RNOTAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19FTkMyOEo2MCBpcyBub3Qgc2V0CiAjIENPTkZJR19JQk1fTkVXX0VNQUNfWk1JSSBpcyBub3Qgc2V0CiAjIENPTkZJR19JQk1fTkVXX0VNQUNfUkdNSUkgaXMgbm90IHNldAogIyBDT05GSUdfSUJNX05FV19FTUFDX1RBSCBpcyBub3Qgc2V0CiAjIENPTkZJR19JQk1fTkVXX0VNQUNfRU1BQzQgaXMgbm90IHNldAotIyBDT05GSUdfQjQ0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0lCTV9ORVdfRU1BQ19OT19GTE9XX0NUUkwgaXMgbm90IHNldAorIyBDT05GSUdfSUJNX05FV19FTUFDX01BTF9DTFJfSUNJTlRTVEFUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lCTV9ORVdfRU1BQ19NQUxfQ09NTU9OX0VSUiBpcyBub3Qgc2V0CiBDT05GSUdfTkVUREVWXzEwMDA9eQogIyBDT05GSUdfQVg4ODE4MCBpcyBub3Qgc2V0CiBDT05GSUdfTkVUREVWXzEwMDAwPXkKQEAgLTU5OCwxMCArNjIxLDEwIEBACiAjCiAjIENPTkZJR19XTEFOX1BSRTgwMjExIGlzIG5vdCBzZXQKICMgQ09ORklHX1dMQU5fODAyMTEgaXMgbm90IHNldAorIyBDT05GSUdfSVdMV0lGSV9MRURTIGlzIG5vdCBzZXQKICMgQ09ORklHX1dBTiBpcyBub3Qgc2V0CiAjIENPTkZJR19QUFAgaXMgbm90IHNldAogIyBDT05GSUdfU0xJUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSEFQRVIgaXMgbm90IHNldAogIyBDT05GSUdfTkVUQ09OU09MRSBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRQT0xMIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIgaXMgbm90IHNldApAQCAtNjMzLDcgKzY1Niw3IEBACiAjIENPTkZJR19JTlBVVF9UT1VDSFNDUkVFTiBpcyBub3Qgc2V0CiBDT05GSUdfSU5QVVRfTUlTQz15CiAjIENPTkZJR19JTlBVVF9VSU5QVVQgaXMgbm90IHNldAotQ09ORklHX1RXSV9LRVlQQUQ9bQorQ09ORklHX0NPTkZJR19JTlBVVF9QQ0Y4NTc0PW0KIAogIwogIyBIYXJkd2FyZSBJL08gcG9ydHMKQEAgLTY1Miw4ICs2NzUsMTEgQEAKIENPTkZJR19CRklOX1NQT1JUPXkKICMgQ09ORklHX0JGSU5fVElNRVJfTEFURU5DWSBpcyBub3Qgc2V0CiBDT05GSUdfVFdJX0xDRD1tCitDT05GSUdfQkZJTl9ETUFfSU5URVJGQUNFPW0KIENPTkZJR19TSU1QTEVfR1BJTz1tCiAjIENPTkZJR19WVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERVZLTUVNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGSU5fSlRBR19DT01NIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFUklBTF9OT05TVEFOREFSRCBpcyBub3Qgc2V0CiAKICMKQEAgLTY4Miw0MSArNzA4LDQ2IEBACiAjIENPTkZJR19DQU40TElOVVggaXMgbm90IHNldAogIyBDT05GSUdfSVBNSV9IQU5ETEVSIGlzIG5vdCBzZXQKICMgQ09ORklHX0hXX1JBTkRPTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19HRU5fUlRDIGlzIG5vdCBzZXQKICMgQ09ORklHX1IzOTY0IGlzIG5vdCBzZXQKICMgQ09ORklHX1JBV19EUklWRVIgaXMgbm90IHNldAogIyBDT05GSUdfVENHX1RQTSBpcyBub3Qgc2V0CiBDT05GSUdfSTJDPW0KIENPTkZJR19JMkNfQk9BUkRJTkZPPXkKIENPTkZJR19JMkNfQ0hBUkRFVj1tCi0KLSMKLSMgSTJDIEFsZ29yaXRobXMKLSMKLUNPTkZJR19JMkNfQUxHT0JJVD1tCi0jIENPTkZJR19JMkNfQUxHT1BDRiBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfQUxHT1BDQSBpcyBub3Qgc2V0CitDT05GSUdfSTJDX0hFTFBFUl9BVVRPPXkKIAogIwogIyBJMkMgSGFyZHdhcmUgQnVzIHN1cHBvcnQKICMKKworIworIyBJMkMgc3lzdGVtIGJ1cyBkcml2ZXJzIChtb3N0bHkgZW1iZWRkZWQgLyBzeXN0ZW0tb24tY2hpcCkKKyMKICMgQ09ORklHX0kyQ19HUElPIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19PQ09SRVMgaXMgbm90IHNldAotIyBDT05GSUdfSTJDX1BBUlBPUlRfTElHSFQgaXMgbm90IHNldAogIyBDT05GSUdfSTJDX1NJTVRFQyBpcyBub3Qgc2V0CisKKyMKKyMgRXh0ZXJuYWwgSTJDL1NNQnVzIGFkYXB0ZXIgZHJpdmVycworIworIyBDT05GSUdfSTJDX1BBUlBPUlRfTElHSFQgaXMgbm90IHNldAogIyBDT05GSUdfSTJDX1RBT1NfRVZNIGlzIG5vdCBzZXQKKworIworIyBPdGhlciBJMkMvU01CdXMgYnVzIGRyaXZlcnMKKyMKKyMgQ09ORklHX0kyQ19QQ0FfUExBVEZPUk0gaXMgbm90IHNldAogIyBDT05GSUdfSTJDX1NUVUIgaXMgbm90IHNldAogCiAjCiAjIE1pc2NlbGxhbmVvdXMgSTJDIENoaXAgc3VwcG9ydAogIwotIyBDT05GSUdfU0VOU09SU19EUzEzMzcgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19EUzEzNzQgaXMgbm90IHNldAogIyBDT05GSUdfRFMxNjgyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUMjQgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19BRDUyNTIgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19FRVBST00gaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19QQ0Y4NTc0IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfUENGODU3NSBpcyBub3Qgc2V0CisjIENPTkZJR19QQ0Y4NTc1IGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfUENBOTUzOSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1BDRjg1OTEgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19NQVg2ODc1IGlzIG5vdCBzZXQKQEAgLTcyNSwxNyArNzU2LDE1IEBACiAjIENPTkZJR19JMkNfREVCVUdfQUxHTyBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfREVCVUdfQlVTIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19ERUJVR19DSElQIGlzIG5vdCBzZXQKLQotIwotIyBTUEkgc3VwcG9ydAotIwogQ09ORklHX1NQST15CisjIENPTkZJR19TUElfREVCVUcgaXMgbm90IHNldAogQ09ORklHX1NQSV9NQVNURVI9eQogCiAjCiAjIFNQSSBNYXN0ZXIgQ29udHJvbGxlciBEcml2ZXJzCiAjCiBDT05GSUdfU1BJX0JGSU49eQorIyBDT05GSUdfU1BJX0JGSU5fTE9DSyBpcyBub3Qgc2V0CiAjIENPTkZJR19TUElfQklUQkFORyBpcyBub3Qgc2V0CiAKICMKQEAgLTc0NCwxMSArNzczLDE1IEBACiAjIENPTkZJR19TUElfQVQyNSBpcyBub3Qgc2V0CiAjIENPTkZJR19TUElfU1BJREVWIGlzIG5vdCBzZXQKICMgQ09ORklHX1NQSV9UTEU2MlgwIGlzIG5vdCBzZXQKK0NPTkZJR19BUkNIX1dBTlRfT1BUSU9OQUxfR1BJT0xJQj15CisjIENPTkZJR19HUElPTElCIGlzIG5vdCBzZXQKICMgQ09ORklHX1cxIGlzIG5vdCBzZXQKICMgQ09ORklHX1BPV0VSX1NVUFBMWSBpcyBub3Qgc2V0CiBDT05GSUdfSFdNT049eQogIyBDT05GSUdfSFdNT05fVklEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQUQ3NDE0IGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfQUQ3NDE4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURDWFggaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19BRE0xMDIxIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfQURNMTAyNSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0FETTEwMjYgaXMgbm90IHNldApAQCAtNzU2LDYgKzc4OSw3IEBACiAjIENPTkZJR19TRU5TT1JTX0FETTEwMzEgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19BRE05MjQwIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfQURUNzQ3MCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FEVDc0NzMgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19BVFhQMSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0RTMTYyMSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0Y3MTgwNUYgaXMgbm90IHNldApAQCAtNzc2LDYgKzgxMCw3IEBACiAjIENPTkZJR19TRU5TT1JTX0xNOTAgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19MTTkyIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfTE05MyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX01BWDExMTEgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19NQVgxNjE5IGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfTUFYNjY1MCBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1BDODczNjAgaXMgbm90IHNldApAQCAtNzg0LDYgKzgxOSw3IEBACiAjIENPTkZJR19TRU5TT1JTX1NNU0M0N00xIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfU01TQzQ3TTE5MiBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1NNU0M0N0IzOTcgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRFM3ODI4IGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfVEhNQzUwIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfVlQxMjExIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfVzgzNzgxRCBpcyBub3Qgc2V0CkBAIC03OTEsOSArODI3LDEyIEBACiAjIENPTkZJR19TRU5TT1JTX1c4Mzc5MkQgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19XODM3OTMgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19XODNMNzg1VFMgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19XODNMNzg2TkcgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19XODM2MjdIRiBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1c4MzYyN0VIRiBpcyBub3Qgc2V0CiAjIENPTkZJR19IV01PTl9ERUJVR19DSElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RIRVJNQUwgaXMgbm90IHNldAorIyBDT05GSUdfVEhFUk1BTF9IV01PTiBpcyBub3Qgc2V0CiBDT05GSUdfV0FUQ0hET0c9eQogIyBDT05GSUdfV0FUQ0hET0dfTk9XQVlPVVQgaXMgbm90IHNldAogCkBAIC04MDQsMjEgKzg0MywyOSBAQAogQ09ORklHX0JGSU5fV0RUPXkKIAogIwotIyBTb25pY3MgU2lsaWNvbiBCYWNrcGxhbmUKLSMKLUNPTkZJR19TU0JfUE9TU0lCTEU9eQotIyBDT05GSUdfU1NCIGlzIG5vdCBzZXQKLQotIwogIyBNdWx0aWZ1bmN0aW9uIGRldmljZSBkcml2ZXJzCiAjCisjIENPTkZJR19NRkRfQ09SRSBpcyBub3Qgc2V0CiAjIENPTkZJR19NRkRfU001MDEgaXMgbm90IHNldAorIyBDT05GSUdfSFRDX1BBU0lDMyBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfVE1JTyBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfV004NDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9XTTgzNTBfSTJDIGlzIG5vdCBzZXQKIAogIwogIyBNdWx0aW1lZGlhIGRldmljZXMKICMKKworIworIyBNdWx0aW1lZGlhIGNvcmUgc3VwcG9ydAorIwogIyBDT05GSUdfVklERU9fREVWIGlzIG5vdCBzZXQKICMgQ09ORklHX0RWQl9DT1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZJREVPX01FRElBIGlzIG5vdCBzZXQKKworIworIyBNdWx0aW1lZGlhIGRyaXZlcnMKKyMKICMgQ09ORklHX0RBQiBpcyBub3Qgc2V0CiAKICMKQEAgLTgyOSw2ICs4NzYsNyBAQAogQ09ORklHX0ZCPW0KIENPTkZJR19GSVJNV0FSRV9FRElEPXkKICMgQ09ORklHX0ZCX0REQyBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9CT09UX1ZFU0FfU1VQUE9SVCBpcyBub3Qgc2V0CiBDT05GSUdfRkJfQ0ZCX0ZJTExSRUNUPW0KIENPTkZJR19GQl9DRkJfQ09QWUFSRUE9bQogQ09ORklHX0ZCX0NGQl9JTUFHRUJMSVQ9bQpAQCAtODM2LDggKzg4NCw4IEBACiAjIENPTkZJR19GQl9TWVNfRklMTFJFQ1QgaXMgbm90IHNldAogIyBDT05GSUdfRkJfU1lTX0NPUFlBUkVBIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX1NZU19JTUFHRUJMSVQgaXMgbm90IHNldAorIyBDT05GSUdfRkJfRk9SRUlHTl9FTkRJQU4gaXMgbm90IHNldAogIyBDT05GSUdfRkJfU1lTX0ZPUFMgaXMgbm90IHNldAotQ09ORklHX0ZCX0RFRkVSUkVEX0lPPXkKICMgQ09ORklHX0ZCX1NWR0FMSUIgaXMgbm90IHNldAogIyBDT05GSUdfRkJfTUFDTU9ERVMgaXMgbm90IHNldAogIyBDT05GSUdfRkJfQkFDS0xJR0hUIGlzIG5vdCBzZXQKQEAgLTg0OCw2ICs4OTYsNyBAQAogIyBGcmFtZSBidWZmZXIgaGFyZHdhcmUgZHJpdmVycwogIwogIyBDT05GSUdfRkJfQkZJTl9UMzUwTUNRQiBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9CRklOX0xRMDM1UTEgaXMgbm90IHNldAogQ09ORklHX0ZCX0JGSU5fNzM5Mz1tCiBDT05GSUdfTlRTQz15CiAjIENPTkZJR19QQUwgaXMgbm90IHNldApAQCAtODU5LDYgKzkwOCw3IEBACiAjIENPTkZJR19BRFY3MzkzXzJYTUVNIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX1MxRDEzWFhYIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX1ZJUlRVQUwgaXMgbm90IHNldAorIyBDT05GSUdfRkJfTUVUUk9OT01FIGlzIG5vdCBzZXQKICMgQ09ORklHX0JBQ0tMSUdIVF9MQ0RfU1VQUE9SVCBpcyBub3Qgc2V0CiAKICMKQEAgLTg2NiwxNSArOTE2LDggQEAKICMKICMgQ09ORklHX0RJU1BMQVlfU1VQUE9SVCBpcyBub3Qgc2V0CiAjIENPTkZJR19MT0dPIGlzIG5vdCBzZXQKLQotIwotIyBTb3VuZAotIwogQ09ORklHX1NPVU5EPW0KLQotIwotIyBBZHZhbmNlZCBMaW51eCBTb3VuZCBBcmNoaXRlY3R1cmUKLSMKK0NPTkZJR19TT1VORF9PU1NfQ09SRT15CiBDT05GSUdfU05EPW0KIENPTkZJR19TTkRfVElNRVI9bQogQ09ORklHX1NORF9QQ009bQpAQCAtODg4LDE4ICs5MzEsMTIgQEAKIENPTkZJR19TTkRfVkVSQk9TRV9QUk9DRlM9eQogIyBDT05GSUdfU05EX1ZFUkJPU0VfUFJJTlRLIGlzIG5vdCBzZXQKICMgQ09ORklHX1NORF9ERUJVRyBpcyBub3Qgc2V0Ci0KLSMKLSMgR2VuZXJpYyBkZXZpY2VzCi0jCitDT05GSUdfU05EX0RSSVZFUlM9eQogIyBDT05GSUdfU05EX0RVTU1ZIGlzIG5vdCBzZXQKICMgQ09ORklHX1NORF9NVFBBViBpcyBub3Qgc2V0CiAjIENPTkZJR19TTkRfU0VSSUFMX1UxNjU1MCBpcyBub3Qgc2V0CiAjIENPTkZJR19TTkRfTVBVNDAxIGlzIG5vdCBzZXQKLQotIwotIyBTUEkgZGV2aWNlcwotIworQ09ORklHX1NORF9TUEk9eQogCiAjCiAjIEFMU0EgQmxhY2tmaW4gZGV2aWNlcwpAQCAtOTExLDQ2ICs5NDgsNDYgQEAKICMgQ09ORklHX1NORF9CTEFDS0ZJTl9BRDE4MzZfNVAxIGlzIG5vdCBzZXQKIENPTkZJR19TTkRfQkxBQ0tGSU5fU1BPUlQ9MAogQ09ORklHX1NORF9CTEFDS0ZJTl9TUElfUEZCSVQ9NAotQ09ORklHX1NORF9CRklOX0FENzMzMTE9bQogQ09ORklHX1NORF9CRklOX1NQT1JUPTAKLUNPTkZJR19TTkRfQkZJTl9BRDczMzExX1NFPTQKIENPTkZJR19TTkRfQkZJTl9BRDczMzIyPW0KIENPTkZJR19TTkRfQkZJTl9BRDczMzIyX1NQT1JUMF9TRT0xMAogQ09ORklHX1NORF9CRklOX0FENzMzMjJfU1BPUlQxX1NFPTE0CiBDT05GSUdfU05EX0JGSU5fQUQ3MzMyMl9SRVNFVD0xMgotCi0jCi0jIFN5c3RlbSBvbiBDaGlwIGF1ZGlvIHN1cHBvcnQKLSMKLUNPTkZJR19TTkRfU09DX0FDOTdfQlVTPXkKIENPTkZJR19TTkRfU09DPW0KLUNPTkZJR19TTkRfQkY1WFhfU09DPW0KLUNPTkZJR19TTkRfTU1BUF9TVVBQT1JUPXkKLUNPTkZJR19TTkRfQkY1WFhfU09DX0FDOTc9bQotIyBDT05GSUdfU05EX0JGNVhYX1NPQ19XTTg3NTAgaXMgbm90IHNldAotIyBDT05GSUdfU05EX0JGNVhYX1NPQ19XTTg3MzEgaXMgbm90IHNldAorQ09ORklHX1NORF9TT0NfQUM5N19CVVM9eQorQ09ORklHX1NORF9CRjVYWF9JMlM9bQogIyBDT05GSUdfU05EX0JGNVhYX1NPQ19TU00yNjAyIGlzIG5vdCBzZXQKLUNPTkZJR19TTkRfQkY1WFhfU09DX0JGNXh4PW0KK0NPTkZJR19TTkRfQkY1WFhfU09DX0FENzMzMTE9bQorQ09ORklHX1NORF9CRklOX0FENzMzMTFfU0U9NAorQ09ORklHX1NORF9CRjVYWF9BQzk3PW0KK0NPTkZJR19TTkRfQkY1WFhfTU1BUF9TVVBQT1JUPXkKKyMgQ09ORklHX1NORF9CRjVYWF9NVUxUSUNIQU5fU1VQUE9SVCBpcyBub3Qgc2V0CitDT05GSUdfU05EX0JGNVhYX1NPQ19TUE9SVD1tCitDT05GSUdfU05EX0JGNVhYX1NPQ19JMlM9bQorQ09ORklHX1NORF9CRjVYWF9TT0NfQUM5Nz1tCitDT05GSUdfU05EX0JGNVhYX1NPQ19BRDE5ODA9bQogQ09ORklHX1NORF9CRjVYWF9TUE9SVF9OVU09MAogIyBDT05GSUdfU05EX0JGNVhYX0hBVkVfQ09MRF9SRVNFVCBpcyBub3Qgc2V0Ci0KLSMKLSMgU29DIEF1ZGlvIHN1cHBvcnQgZm9yIFN1cGVySAotIworIyBDT05GSUdfU05EX1NPQ19BTExfQ09ERUNTIGlzIG5vdCBzZXQKIENPTkZJR19TTkRfU09DX0FEMTk4MD1tCi0KLSMKLSMgT3BlbiBTb3VuZCBTeXN0ZW0KLSMKK0NPTkZJR19TTkRfU09DX0FENzMzMTE9bQogIyBDT05GSUdfU09VTkRfUFJJTUUgaXMgbm90IHNldAogQ09ORklHX0FDOTdfQlVTPW0KIENPTkZJR19ISURfU1VQUE9SVD15CiBDT05GSUdfSElEPXkKICMgQ09ORklHX0hJRF9ERUJVRyBpcyBub3Qgc2V0CiAjIENPTkZJR19ISURSQVcgaXMgbm90IHNldAorIyBDT05GSUdfSElEX1BJRCBpcyBub3Qgc2V0CisKKyMKKyMgU3BlY2lhbCBISUQgZHJpdmVycworIworQ09ORklHX0hJRF9DT01QQVQ9eQogIyBDT05GSUdfVVNCX1NVUFBPUlQgaXMgbm90IHNldAogIyBDT05GSUdfTU1DIGlzIG5vdCBzZXQKKyMgQ09ORklHX01FTVNUSUNLIGlzIG5vdCBzZXQKICMgQ09ORklHX05FV19MRURTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FDQ0VTU0lCSUxJVFkgaXMgbm90IHNldAogQ09ORklHX1JUQ19MSUI9eQogQ09ORklHX1JUQ19DTEFTUz15CiBDT05GSUdfUlRDX0hDVE9TWVM9eQpAQCAtOTc5LDUxICsxMDE2LDU3IEBACiAjIENPTkZJR19SVENfRFJWX1BDRjg1NjMgaXMgbm90IHNldAogIyBDT05GSUdfUlRDX0RSVl9QQ0Y4NTgzIGlzIG5vdCBzZXQKICMgQ09ORklHX1JUQ19EUlZfTTQxVDgwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfUzM1MzkwQSBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0ZNMzEzMCBpcyBub3Qgc2V0CiAKICMKICMgU1BJIFJUQyBkcml2ZXJzCiAjCi0jIENPTkZJR19SVENfRFJWX1JTNUMzNDggaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9NNDFUOTQgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9EUzEzMDUgaXMgbm90IHNldAogIyBDT05GSUdfUlRDX0RSVl9NQVg2OTAyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfUjk3MDEgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9SUzVDMzQ4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfRFMzMjM0IGlzIG5vdCBzZXQKIAogIwogIyBQbGF0Zm9ybSBSVEMgZHJpdmVycwogIworIyBDT05GSUdfUlRDX0RSVl9EUzEyODYgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9EUzE1MTEgaXMgbm90IHNldAogIyBDT05GSUdfUlRDX0RSVl9EUzE1NTMgaXMgbm90IHNldAotIyBDT05GSUdfUlRDX0RSVl9TVEsxN1RBOCBpcyBub3Qgc2V0CiAjIENPTkZJR19SVENfRFJWX0RTMTc0MiBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1NUSzE3VEE4IGlzIG5vdCBzZXQKICMgQ09ORklHX1JUQ19EUlZfTTQ4VDg2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfTTQ4VDM1IGlzIG5vdCBzZXQKICMgQ09ORklHX1JUQ19EUlZfTTQ4VDU5IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfQlE0ODAyIGlzIG5vdCBzZXQKICMgQ09ORklHX1JUQ19EUlZfVjMwMjAgaXMgbm90IHNldAogCiAjCiAjIG9uLUNQVSBSVEMgZHJpdmVycwogIwogQ09ORklHX1JUQ19EUlZfQkZJTj15Ci0KLSMKLSMgVXNlcnNwYWNlIEkvTwotIworIyBDT05GSUdfRE1BREVWSUNFUyBpcyBub3Qgc2V0CiAjIENPTkZJR19VSU8gaXMgbm90IHNldAorIyBDT05GSUdfU1RBR0lORyBpcyBub3Qgc2V0CiAKICMKICMgRmlsZSBzeXN0ZW1zCiAjCiAjIENPTkZJR19FWFQyX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0VYVDNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfRVhUNERFVl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19FWFQ0X0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1JFSVNFUkZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0pGU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19GU19QT1NJWF9BQ0wgaXMgbm90IHNldAorQ09ORklHX0ZJTEVfTE9DS0lORz15CiAjIENPTkZJR19YRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfR0ZTMl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19PQ0ZTMl9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NSU5JWF9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ST01GU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19ETk9USUZZIGlzIG5vdCBzZXQKIENPTkZJR19JTk9USUZZPXkKIENPTkZJR19JTk9USUZZX1VTRVI9eQogIyBDT05GSUdfUVVPVEEgaXMgbm90IHNldAotIyBDT05GSUdfRE5PVElGWSBpcyBub3Qgc2V0CiAjIENPTkZJR19BVVRPRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfQVVUT0ZTNF9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19GVVNFX0ZTIGlzIG5vdCBzZXQKQEAgLTEwNjMsMTEgKzExMDYsMTEgQEAKICMgQ09ORklHX0VGU19GUyBpcyBub3Qgc2V0CiBDT05GSUdfWUFGRlNfRlM9bQogQ09ORklHX1lBRkZTX1lBRkZTMT15CisjIENPTkZJR19ZQUZGU185QllURV9UQUdTIGlzIG5vdCBzZXQKICMgQ09ORklHX1lBRkZTX0RPRVNfRUNDIGlzIG5vdCBzZXQKIENPTkZJR19ZQUZGU19ZQUZGUzI9eQogQ09ORklHX1lBRkZTX0FVVE9fWUFGRlMyPXkKICMgQ09ORklHX1lBRkZTX0RJU0FCTEVfTEFaWV9MT0FEIGlzIG5vdCBzZXQKLUNPTkZJR19ZQUZGU19DSEVDS1BPSU5UX1JFU0VSVkVEX0JMT0NLUz0xMAogIyBDT05GSUdfWUFGRlNfRElTQUJMRV9XSURFX1ROT0RFUyBpcyBub3Qgc2V0CiAjIENPTkZJR19ZQUZGU19BTFdBWVNfQ0hFQ0tfQ0hVTktfRVJBU0VEIGlzIG5vdCBzZXQKIENPTkZJR19ZQUZGU19TSE9SVF9OQU1FU19JTl9SQU09eQpAQCAtMTA4NCw4ICsxMTI3LDExIEBACiAjIENPTkZJR19KRkZTMl9SVUJJTiBpcyBub3Qgc2V0CiAjIENPTkZJR19DUkFNRlMgaXMgbm90IHNldAogIyBDT05GSUdfVlhGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19NSU5JWF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19PTUZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0hQRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfUU5YNEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JPTUZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1NZU1ZfRlMgaXMgbm90IHNldAogIyBDT05GSUdfVUZTX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19ORVRXT1JLX0ZJTEVTWVNURU1TPXkKQEAgLTEwOTMsMTMgKzExMzksMTIgQEAKIENPTkZJR19ORlNfVjM9eQogIyBDT05GSUdfTkZTX1YzX0FDTCBpcyBub3Qgc2V0CiAjIENPTkZJR19ORlNfVjQgaXMgbm90IHNldAotIyBDT05GSUdfTkZTX0RJUkVDVElPIGlzIG5vdCBzZXQKICMgQ09ORklHX05GU0QgaXMgbm90IHNldAogQ09ORklHX0xPQ0tEPW0KIENPTkZJR19MT0NLRF9WND15CiBDT05GSUdfTkZTX0NPTU1PTj15CiBDT05GSUdfU1VOUlBDPW0KLSMgQ09ORklHX1NVTlJQQ19CSU5EMzQgaXMgbm90IHNldAorIyBDT05GSUdfU1VOUlBDX1JFR0lTVEVSX1Y0IGlzIG5vdCBzZXQKICMgQ09ORklHX1JQQ1NFQ19HU1NfS1JCNSBpcyBub3Qgc2V0CiAjIENPTkZJR19SUENTRUNfR1NTX1NQS00zIGlzIG5vdCBzZXQKIENPTkZJR19TTUJfRlM9bQpAQCAtMTE1NSw5ICsxMjAwLDYgQEAKICMgQ09ORklHX05MU19LT0k4X1UgaXMgbm90IHNldAogIyBDT05GSUdfTkxTX1VURjggaXMgbm90IHNldAogIyBDT05GSUdfRExNIGlzIG5vdCBzZXQKLUNPTkZJR19JTlNUUlVNRU5UQVRJT049eQotIyBDT05GSUdfUFJPRklMSU5HIGlzIG5vdCBzZXQKLSMgQ09ORklHX01BUktFUlMgaXMgbm90IHNldAogCiAjCiAjIEtlcm5lbCBoYWNraW5nCkBAIC0xMTY1LDE0ICsxMjA3LDUzIEBACiAjIENPTkZJR19QUklOVEtfVElNRSBpcyBub3Qgc2V0CiBDT05GSUdfRU5BQkxFX1dBUk5fREVQUkVDQVRFRD15CiBDT05GSUdfRU5BQkxFX01VU1RfQ0hFQ0s9eQorQ09ORklHX0ZSQU1FX1dBUk49MTAyNAogIyBDT05GSUdfTUFHSUNfU1lTUlEgaXMgbm90IHNldAogIyBDT05GSUdfVU5VU0VEX1NZTUJPTFMgaXMgbm90IHNldAogQ09ORklHX0RFQlVHX0ZTPXkKICMgQ09ORklHX0hFQURFUlNfQ0hFQ0sgaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfS0VSTkVMIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19LRVJORUw9eQorIyBDT05GSUdfREVCVUdfU0hJUlEgaXMgbm90IHNldAorQ09ORklHX0RFVEVDVF9TT0ZUTE9DS1VQPXkKKyMgQ09ORklHX0JPT1RQQVJBTV9TT0ZUTE9DS1VQX1BBTklDIGlzIG5vdCBzZXQKK0NPTkZJR19CT09UUEFSQU1fU09GVExPQ0tVUF9QQU5JQ19WQUxVRT0wCitDT05GSUdfU0NIRURfREVCVUc9eQorIyBDT05GSUdfU0NIRURTVEFUUyBpcyBub3Qgc2V0CisjIENPTkZJR19USU1FUl9TVEFUUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19PQkpFQ1RTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NMQUIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfUlRfTVVURVhFUyBpcyBub3Qgc2V0CisjIENPTkZJR19SVF9NVVRFWF9URVNURVIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU1BJTkxPQ0sgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfTVVURVhFUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TUElOTE9DS19TTEVFUCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19MT0NLSU5HX0FQSV9TRUxGVEVTVFMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfS09CSkVDVCBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19CVUdWRVJCT1NFIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19JTkZPPXkKKyMgQ09ORklHX0RFQlVHX1ZNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1dSSVRFQ09VTlQgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfTUVNT1JZX0lOSVQgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfTElTVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TRyBpcyBub3Qgc2V0CisjIENPTkZJR19GUkFNRV9QT0lOVEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JPT1RfUFJJTlRLX0RFTEFZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JDVV9UT1JUVVJFX1RFU1QgaXMgbm90IHNldAorIyBDT05GSUdfUkNVX0NQVV9TVEFMTF9ERVRFQ1RPUiBpcyBub3Qgc2V0CisjIENPTkZJR19CQUNLVFJBQ0VfU0VMRl9URVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0JMT0NLX0VYVF9ERVZUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZBVUxUX0lOSkVDVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19TWVNDVExfU1lTQ0FMTF9DSEVDSyBpcyBub3Qgc2V0CisjIENPTkZJR19EWU5BTUlDX1BSSU5US19ERUJVRyBpcyBub3Qgc2V0CiAjIENPTkZJR19TQU1QTEVTIGlzIG5vdCBzZXQKK0NPTkZJR19IQVZFX0FSQ0hfS0dEQj15CisjIENPTkZJR19LR0RCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NUQUNLT1ZFUkZMT1cgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU1RBQ0tfVVNBR0UgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX1ZFUkJPU0U9eQogQ09ORklHX0RFQlVHX01NUlM9eQorIyBDT05GSUdfREVCVUdfSFdFUlIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfRE9VQkxFRkFVTFQgaXMgbm90IHNldAogQ09ORklHX0RFQlVHX0hVTlRfRk9SX1pFUk89eQogQ09ORklHX0RFQlVHX0JGSU5fSFdUUkFDRV9PTj15CiBDT05GSUdfREVCVUdfQkZJTl9IV1RSQUNFX0NPTVBSRVNTSU9OX09GRj15CkBAIC0xMTkwLDkgKzEyNzEsOTQgQEAKICMKICMgQ09ORklHX0tFWVMgaXMgbm90IHNldAogQ09ORklHX1NFQ1VSSVRZPXkKKyMgQ09ORklHX1NFQ1VSSVRZRlMgaXMgbm90IHNldAogIyBDT05GSUdfU0VDVVJJVFlfTkVUV09SSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRUNVUklUWV9DQVBBQklMSVRJRVMgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFQ1VSSVRZX0ZJTEVfQ0FQQUJJTElUSUVTIGlzIG5vdCBzZXQKK0NPTkZJR19TRUNVUklUWV9ERUZBVUxUX01NQVBfTUlOX0FERFI9MAorQ09ORklHX0NSWVBUTz15CisKKyMKKyMgQ3J5cHRvIGNvcmUgb3IgaGVscGVyCisjCisjIENPTkZJR19DUllQVE9fRklQUyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTUFOQUdFUiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fR0YxMjhNVUwgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX05VTEwgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NSWVBURCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQVVUSEVOQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fVEVTVCBpcyBub3Qgc2V0CisKKyMKKyMgQXV0aGVudGljYXRlZCBFbmNyeXB0aW9uIHdpdGggQXNzb2NpYXRlZCBEYXRhCisjCisjIENPTkZJR19DUllQVE9fQ0NNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19HQ00gaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NFUUlWIGlzIG5vdCBzZXQKKworIworIyBCbG9jayBtb2RlcworIworIyBDT05GSUdfQ1JZUFRPX0NCQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ1RSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DVFMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0VDQiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTFJXIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19QQ0JDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19YVFMgaXMgbm90IHNldAorCisjCisjIEhhc2ggbW9kZXMKKyMKKyMgQ09ORklHX0NSWVBUT19ITUFDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19YQ0JDIGlzIG5vdCBzZXQKKworIworIyBEaWdlc3QKKyMKKyMgQ09ORklHX0NSWVBUT19DUkMzMkMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX01ENCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTUQ1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19NSUNIQUVMX01JQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fUk1EMTI4IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19STUQxNjAgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1JNRDI1NiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fUk1EMzIwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TSEExIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TSEEyNTYgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NIQTUxMiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fVEdSMTkyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19XUDUxMiBpcyBub3Qgc2V0CisKKyMKKyMgQ2lwaGVycworIworIyBDT05GSUdfQ1JZUFRPX0FFUyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQU5VQklTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19BUkM0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19CTE9XRklTSCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ0FNRUxMSUEgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NBU1Q1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DQVNUNiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fREVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19GQ1JZUFQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0tIQVpBRCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0FMU0EyMCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0VFRCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0VSUEVOVCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fVEVBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19UV09GSVNIIGlzIG5vdCBzZXQKKworIworIyBDb21wcmVzc2lvbgorIworIyBDT05GSUdfQ1JZUFRPX0RFRkxBVEUgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0xaTyBpcyBub3Qgc2V0CisKKyMKKyMgUmFuZG9tIE51bWJlciBHZW5lcmF0aW9uCisjCisjIENPTkZJR19DUllQVE9fQU5TSV9DUFJORyBpcyBub3Qgc2V0CitDT05GSUdfQ1JZUFRPX0hXPXkKIAogIwogIyBMaWJyYXJ5IHJvdXRpbmVzCkBAIC0xMjAwLDYgKzEzNjYsNyBAQAogQ09ORklHX0JJVFJFVkVSU0U9eQogQ09ORklHX0NSQ19DQ0lUVD1tCiAjIENPTkZJR19DUkMxNiBpcyBub3Qgc2V0CisjIENPTkZJR19DUkNfVDEwRElGIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSQ19JVFVfVCBpcyBub3Qgc2V0CiBDT05GSUdfQ1JDMzI9eQogIyBDT05GSUdfQ1JDNyBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvQkY1MzctU1RBTVBfZGVmY29uZmlnIGIvYXJjaC9ibGFja2Zpbi9jb25maWdzL0JGNTM3LVNUQU1QX2RlZmNvbmZpZwppbmRleCA2M2EwZjg1Li4zMzIxNDJmIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvQkY1MzctU1RBTVBfZGVmY29uZmlnCisrKyBiL2FyY2gvYmxhY2tmaW4vY29uZmlncy9CRjUzNy1TVEFNUF9kZWZjb25maWcKQEAgLTEsNiArMSw3IEBACiAjCiAjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0Ci0jIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMjQuNworIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjI4LXJjMgorIyBUdWUgRGVjIDMwIDE3OjI0OjM3IDIwMDgKICMKICMgQ09ORklHX01NVSBpcyBub3Qgc2V0CiAjIENPTkZJR19GUFUgaXMgbm90IHNldApAQCAtOCw3ICs5LDYgQEAKICMgQ09ORklHX1JXU0VNX1hDSEdBRERfQUxHT1JJVEhNIGlzIG5vdCBzZXQKIENPTkZJR19CTEFDS0ZJTj15CiBDT05GSUdfWk9ORV9ETUE9eQotQ09ORklHX1NFTUFQSE9SRV9TTEVFUEVSUz15CiBDT05GSUdfR0VORVJJQ19GSU5EX05FWFRfQklUPXkKIENPTkZJR19HRU5FUklDX0hXRUlHSFQ9eQogQ09ORklHX0dFTkVSSUNfSEFSRElSUVM9eQpAQCAtMzEsMTggKzMxLDE2IEBACiAjIENPTkZJR19QT1NJWF9NUVVFVUUgaXMgbm90IHNldAogIyBDT05GSUdfQlNEX1BST0NFU1NfQUNDVCBpcyBub3Qgc2V0CiAjIENPTkZJR19UQVNLU1RBVFMgaXMgbm90IHNldAotIyBDT05GSUdfVVNFUl9OUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19QSURfTlMgaXMgbm90IHNldAogIyBDT05GSUdfQVVESVQgaXMgbm90IHNldAogQ09ORklHX0lLQ09ORklHPXkKIENPTkZJR19JS0NPTkZJR19QUk9DPXkKIENPTkZJR19MT0dfQlVGX1NISUZUPTE0CiAjIENPTkZJR19DR1JPVVBTIGlzIG5vdCBzZXQKLUNPTkZJR19GQUlSX0dST1VQX1NDSEVEPXkKLUNPTkZJR19GQUlSX1VTRVJfU0NIRUQ9eQotIyBDT05GSUdfRkFJUl9DR1JPVVBfU0NIRUQgaXMgbm90IHNldAotQ09ORklHX1NZU0ZTX0RFUFJFQ0FURUQ9eQorIyBDT05GSUdfR1JPVVBfU0NIRUQgaXMgbm90IHNldAorIyBDT05GSUdfU1lTRlNfREVQUkVDQVRFRCBpcyBub3Qgc2V0CisjIENPTkZJR19TWVNGU19ERVBSRUNBVEVEX1YyIGlzIG5vdCBzZXQKICMgQ09ORklHX1JFTEFZIGlzIG5vdCBzZXQKKyMgQ09ORklHX05BTUVTUEFDRVMgaXMgbm90IHNldAogQ09ORklHX0JMS19ERVZfSU5JVFJEPXkKIENPTkZJR19JTklUUkFNRlNfU09VUkNFPSIiCiAjIENPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRSBpcyBub3Qgc2V0CkBAIC01MSwyNiArNDksMzUgQEAKIENPTkZJR19VSUQxNj15CiBDT05GSUdfU1lTQ1RMX1NZU0NBTEw9eQogQ09ORklHX0tBTExTWU1TPXkKKyMgQ09ORklHX0tBTExTWU1TX0FMTCBpcyBub3Qgc2V0CiAjIENPTkZJR19LQUxMU1lNU19FWFRSQV9QQVNTIGlzIG5vdCBzZXQKIENPTkZJR19IT1RQTFVHPXkKIENPTkZJR19QUklOVEs9eQogQ09ORklHX0JVRz15Ci1DT05GSUdfRUxGX0NPUkU9eQorIyBDT05GSUdfRUxGX0NPUkUgaXMgbm90IHNldAorQ09ORklHX0NPTVBBVF9CUks9eQogQ09ORklHX0JBU0VfRlVMTD15CiBDT05GSUdfRlVURVg9eQogQ09ORklHX0FOT05fSU5PREVTPXkKIENPTkZJR19FUE9MTD15CiBDT05GSUdfU0lHTkFMRkQ9eQorQ09ORklHX1RJTUVSRkQ9eQogQ09ORklHX0VWRU5URkQ9eQorQ09ORklHX0FJTz15CiBDT05GSUdfVk1fRVZFTlRfQ09VTlRFUlM9eQogQ09ORklHX1NMQUI9eQogIyBDT05GSUdfU0xVQiBpcyBub3Qgc2V0CiAjIENPTkZJR19TTE9CIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BST0ZJTElORyBpcyBub3Qgc2V0CisjIENPTkZJR19NQVJLRVJTIGlzIG5vdCBzZXQKK0NPTkZJR19IQVZFX09QUk9GSUxFPXkKKyMgQ09ORklHX0hBVkVfR0VORVJJQ19ETUFfQ09IRVJFTlQgaXMgbm90IHNldAogQ09ORklHX1NMQUJJTkZPPXkKIENPTkZJR19SVF9NVVRFWEVTPXkKIENPTkZJR19USU5ZX1NITUVNPXkKIENPTkZJR19CQVNFX1NNQUxMPTAKIENPTkZJR19NT0RVTEVTPXkKKyMgQ09ORklHX01PRFVMRV9GT1JDRV9MT0FEIGlzIG5vdCBzZXQKIENPTkZJR19NT0RVTEVfVU5MT0FEPXkKICMgQ09ORklHX01PRFVMRV9GT1JDRV9VTkxPQUQgaXMgbm90IHNldAogIyBDT05GSUdfTU9EVkVSU0lPTlMgaXMgbm90IHNldApAQCAtODEsNiArODgsNyBAQAogIyBDT05GSUdfQkxLX0RFVl9JT19UUkFDRSBpcyBub3Qgc2V0CiAjIENPTkZJR19MU0YgaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9CU0cgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9JTlRFR1JJVFkgaXMgbm90IHNldAogCiAjCiAjIElPIFNjaGVkdWxlcnMKQEAgLTk0LDkgKzEwMiwxMSBAQAogIyBDT05GSUdfREVGQVVMVF9DRlEgaXMgbm90IHNldAogIyBDT05GSUdfREVGQVVMVF9OT09QIGlzIG5vdCBzZXQKIENPTkZJR19ERUZBVUxUX0lPU0NIRUQ9ImFudGljaXBhdG9yeSIKK0NPTkZJR19DTEFTU0lDX1JDVT15CiAjIENPTkZJR19QUkVFTVBUX05PTkUgaXMgbm90IHNldAogQ09ORklHX1BSRUVNUFRfVk9MVU5UQVJZPXkKICMgQ09ORklHX1BSRUVNUFQgaXMgbm90IHNldAorQ09ORklHX0ZSRUVaRVI9eQogCiAjCiAjIEJsYWNrZmluIFByb2Nlc3NvciBPcHRpb25zCkBAIC0xMDUsNiArMTE1LDEwIEBACiAjCiAjIFByb2Nlc3NvciBhbmQgQm9hcmQgU2V0dGluZ3MKICMKKyMgQ09ORklHX0JGNTEyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGNTE0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGNTE2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGNTE4IGlzIG5vdCBzZXQKICMgQ09ORklHX0JGNTIyIGlzIG5vdCBzZXQKICMgQ09ORklHX0JGNTIzIGlzIG5vdCBzZXQKICMgQ09ORklHX0JGNTI0IGlzIG5vdCBzZXQKQEAgLTExNywxOCArMTMxLDIzIEBACiAjIENPTkZJR19CRjUzNCBpcyBub3Qgc2V0CiAjIENPTkZJR19CRjUzNiBpcyBub3Qgc2V0CiBDT05GSUdfQkY1Mzc9eQorIyBDT05GSUdfQkY1MzggaXMgbm90IHNldAorIyBDT05GSUdfQkY1MzkgaXMgbm90IHNldAogIyBDT05GSUdfQkY1NDIgaXMgbm90IHNldAogIyBDT05GSUdfQkY1NDQgaXMgbm90IHNldAogIyBDT05GSUdfQkY1NDcgaXMgbm90IHNldAogIyBDT05GSUdfQkY1NDggaXMgbm90IHNldAogIyBDT05GSUdfQkY1NDkgaXMgbm90IHNldAogIyBDT05GSUdfQkY1NjEgaXMgbm90IHNldAorQ09ORklHX0JGX1JFVl9NSU49MgorQ09ORklHX0JGX1JFVl9NQVg9MwogIyBDT05GSUdfQkZfUkVWXzBfMCBpcyBub3Qgc2V0CiAjIENPTkZJR19CRl9SRVZfMF8xIGlzIG5vdCBzZXQKIENPTkZJR19CRl9SRVZfMF8yPXkKICMgQ09ORklHX0JGX1JFVl8wXzMgaXMgbm90IHNldAogIyBDT05GSUdfQkZfUkVWXzBfNCBpcyBub3Qgc2V0CiAjIENPTkZJR19CRl9SRVZfMF81IGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGX1JFVl8wXzYgaXMgbm90IHNldAogIyBDT05GSUdfQkZfUkVWX0FOWSBpcyBub3Qgc2V0CiAjIENPTkZJR19CRl9SRVZfTk9ORSBpcyBub3Qgc2V0CiBDT05GSUdfQkY1M3g9eQpAQCAtMTQxLDI3ICsxNjAsMjggQEAKIENPTkZJR19JUlFfU1BPUlQxX1JYPTkKIENPTkZJR19JUlFfU1BPUlQxX1RYPTkKIENPTkZJR19JUlFfVFdJPTEwCi1DT05GSUdfSVJRX1NQST0xMAogQ09ORklHX0lSUV9VQVJUMF9SWD0xMAogQ09ORklHX0lSUV9VQVJUMF9UWD0xMAogQ09ORklHX0lSUV9VQVJUMV9SWD0xMAogQ09ORklHX0lSUV9VQVJUMV9UWD0xMAogQ09ORklHX0lSUV9NQUNfUlg9MTEKIENPTkZJR19JUlFfTUFDX1RYPTExCi1DT05GSUdfSVJRX1RNUjA9MTIKLUNPTkZJR19JUlFfVE1SMT0xMgotQ09ORklHX0lSUV9UTVIyPTEyCi1DT05GSUdfSVJRX1RNUjM9MTIKLUNPTkZJR19JUlFfVE1SND0xMgotQ09ORklHX0lSUV9UTVI1PTEyCi1DT05GSUdfSVJRX1RNUjY9MTIKLUNPTkZJR19JUlFfVE1SNz0xMgorQ09ORklHX0lSUV9USU1FUjA9OAorQ09ORklHX0lSUV9USU1FUjE9MTIKK0NPTkZJR19JUlFfVElNRVIyPTEyCitDT05GSUdfSVJRX1RJTUVSMz0xMgorQ09ORklHX0lSUV9USU1FUjQ9MTIKK0NPTkZJR19JUlFfVElNRVI1PTEyCitDT05GSUdfSVJRX1RJTUVSNj0xMgorQ09ORklHX0lSUV9USU1FUjc9MTIKIENPTkZJR19JUlFfUE9SVEdfSU5UQj0xMgogQ09ORklHX0lSUV9NRU1fRE1BMD0xMwogQ09ORklHX0lSUV9NRU1fRE1BMT0xMwogQ09ORklHX0lSUV9XQVRDSD0xMworQ09ORklHX0lSUV9TUEk9MTAKIENPTkZJR19CRklONTM3X1NUQU1QPXkKICMgQ09ORklHX0JGSU41MzdfQkxVRVRFQ0hOSVhfQ00gaXMgbm90IHNldAorIyBDT05GSUdfQkZJTjUzN19CTFVFVEVDSE5JWF9UQ00gaXMgbm90IHNldAogIyBDT05GSUdfUE5BVjEwIGlzIG5vdCBzZXQKICMgQ09ORklHX0NBTVNJR19NSU5PVEFVUiBpcyBub3Qgc2V0CiAjIENPTkZJR19HRU5FUklDX0JGNTM3X0JPQVJEIGlzIG5vdCBzZXQKQEAgLTE5NCw3ICsyMTQsNiBAQAogIwogQ09ORklHX0NMS0lOX0haPTI1MDAwMDAwCiAjIENPTkZJR19CRklOX0tFUk5FTF9DTE9DSyBpcyBub3Qgc2V0Ci1DT05GSUdfTUFYX01FTV9TSVpFPTUxMgogQ09ORklHX01BWF9WQ09fSFo9NjAwMDAwMDAwCiBDT05GSUdfTUlOX1ZDT19IWj01MDAwMDAwMAogQ09ORklHX01BWF9TQ0xLX0haPTEzMzMzMzMzMwpAQCAtMjA4LDYgKzIyNyw3IEBACiAjIENPTkZJR19IWl8zMDAgaXMgbm90IHNldAogIyBDT05GSUdfSFpfMTAwMCBpcyBub3Qgc2V0CiBDT05GSUdfSFo9MjUwCitDT05GSUdfU0NIRURfSFJUSUNLPXkKIENPTkZJR19HRU5FUklDX1RJTUU9eQogQ09ORklHX0dFTkVSSUNfQ0xPQ0tFVkVOVFM9eQogIyBDT05GSUdfQ1lDTEVTX0NMT0NLU09VUkNFIGlzIG5vdCBzZXQKQEAgLTI0NSw2ICsyNjUsMTIgQEAKIENPTkZJR19DQUNIRUxJTkVfQUxJR05FRF9MMT15CiAjIENPTkZJR19TWVNDQUxMX1RBQl9MMSBpcyBub3Qgc2V0CiAjIENPTkZJR19DUExCX1NXSVRDSF9UQUJfTDEgaXMgbm90IHNldAorQ09ORklHX0FQUF9TVEFDS19MMT15CisKKyMKKyMgU3BlZWQgT3B0aW1pemF0aW9ucworIworQ09ORklHX0JGSU5fSU5TX0xPV09WRVJIRUFEPXkKIENPTkZJR19SQU1LRVJORUw9eQogIyBDT05GSUdfUk9NS0VSTkVMIGlzIG5vdCBzZXQKIENPTkZJR19TRUxFQ1RfTUVNT1JZX01PREVMPXkKQEAgLTI1MywxNCArMjc5LDEzIEBACiAjIENPTkZJR19TUEFSU0VNRU1fTUFOVUFMIGlzIG5vdCBzZXQKIENPTkZJR19GTEFUTUVNPXkKIENPTkZJR19GTEFUX05PREVfTUVNX01BUD15Ci0jIENPTkZJR19TUEFSU0VNRU1fU1RBVElDIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NQQVJTRU1FTV9WTUVNTUFQX0VOQUJMRSBpcyBub3Qgc2V0CitDT05GSUdfUEFHRUZMQUdTX0VYVEVOREVEPXkKIENPTkZJR19TUExJVF9QVExPQ0tfQ1BVUz00CiAjIENPTkZJR19SRVNPVVJDRVNfNjRCSVQgaXMgbm90IHNldAorIyBDT05GSUdfUEhZU19BRERSX1RfNjRCSVQgaXMgbm90IHNldAogQ09ORklHX1pPTkVfRE1BX0ZMQUc9MQogQ09ORklHX1ZJUlRfVE9fQlVTPXkKLSMgQ09ORklHX0JGSU5fR1BUSU1FUlMgaXMgbm90IHNldAotQ09ORklHX0JGSU5fRE1BXzVYWD15CitDT05GSUdfQkZJTl9HUFRJTUVSUz1tCiAjIENPTkZJR19ETUFfVU5DQUNIRURfNE0gaXMgbm90IHNldAogIyBDT05GSUdfRE1BX1VOQ0FDSEVEXzJNIGlzIG5vdCBzZXQKIENPTkZJR19ETUFfVU5DQUNIRURfMU09eQpAQCAtMjc1LDcgKzMwMCw2IEBACiAjIENPTkZJR19CRklOX0lDQUNIRV9MT0NLIGlzIG5vdCBzZXQKICMgQ09ORklHX0JGSU5fV0IgaXMgbm90IHNldAogQ09ORklHX0JGSU5fV1Q9eQotQ09ORklHX0wxX01BWF9QSUVDRT0xNgogIyBDT05GSUdfTVBVIGlzIG5vdCBzZXQKIAogIwpAQCAtMzA0LDcgKzMyOCw2IEBACiAjCiAjIEJ1cyBvcHRpb25zIChQQ0ksIFBDTUNJQSwgRUlTQSwgTUNBLCBJU0EpCiAjCi0jIENPTkZJR19QQ0kgaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9TVVBQT1JUU19NU0kgaXMgbm90IHNldAogIyBDT05GSUdfUENDQVJEIGlzIG5vdCBzZXQKIApAQCAtMzE1LDI5ICszMzgsMzEgQEAKIENPTkZJR19CSU5GTVRfRkxBVD15CiBDT05GSUdfQklORk1UX1pGTEFUPXkKICMgQ09ORklHX0JJTkZNVF9TSEFSRURfRkxBVCBpcyBub3Qgc2V0CisjIENPTkZJR19IQVZFX0FPVVQgaXMgbm90IHNldAogIyBDT05GSUdfQklORk1UX01JU0MgaXMgbm90IHNldAogCiAjCiAjIFBvd2VyIG1hbmFnZW1lbnQgb3B0aW9ucwogIwogQ09ORklHX1BNPXkKLSMgQ09ORklHX1BNX0xFR0FDWSBpcyBub3Qgc2V0CiAjIENPTkZJR19QTV9ERUJVRyBpcyBub3Qgc2V0CiBDT05GSUdfUE1fU0xFRVA9eQotQ09ORklHX1NVU1BFTkRfVVBfUE9TU0lCTEU9eQogQ09ORklHX1NVU1BFTkQ9eQorQ09ORklHX1NVU1BFTkRfRlJFRVpFUj15CitDT05GSUdfQVJDSF9TVVNQRU5EX1BPU1NJQkxFPXkKIENPTkZJR19QTV9CRklOX1NMRUVQX0RFRVBFUj15CiAjIENPTkZJR19QTV9CRklOX1NMRUVQIGlzIG5vdCBzZXQKICMgQ09ORklHX1BNX1dBS0VVUF9CWV9HUElPIGlzIG5vdCBzZXQKIAogIworIyBQb3NzaWJsZSBTdXNwZW5kIE1lbSAvIEhpYmVybmF0ZSBXYWtlLVVwIFNvdXJjZXMKKyMKKyMgQ09ORklHX1BNX0JGSU5fV0FLRV9QSDYgaXMgbm90IHNldAorCisjCiAjIENQVSBGcmVxdWVuY3kgc2NhbGluZwogIwogIyBDT05GSUdfQ1BVX0ZSRVEgaXMgbm90IHNldAotCi0jCi0jIE5ldHdvcmtpbmcKLSMKIENPTkZJR19ORVQ9eQogCiAjCkBAIC0zNTAsNiArMzc1LDcgQEAKICMgQ09ORklHX1hGUk1fVVNFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19YRlJNX1NVQl9QT0xJQ1kgaXMgbm90IHNldAogIyBDT05GSUdfWEZSTV9NSUdSQVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1hGUk1fU1RBVElTVElDUyBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRfS0VZIGlzIG5vdCBzZXQKIENPTkZJR19JTkVUPXkKICMgQ09ORklHX0lQX01VTFRJQ0FTVCBpcyBub3Qgc2V0CkBAIC0zNzksOCArNDA1LDYgQEAKIENPTkZJR19ERUZBVUxUX1RDUF9DT05HPSJjdWJpYyIKICMgQ09ORklHX1RDUF9NRDVTSUcgaXMgbm90IHNldAogIyBDT05GSUdfSVBWNiBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkVUNl9YRlJNX1RVTk5FTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkVUNl9UVU5ORUwgaXMgbm90IHNldAogIyBDT05GSUdfTkVUTEFCRUwgaXMgbm90IHNldAogIyBDT05GSUdfTkVUV09SS19TRUNNQVJLIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVEZJTFRFUiBpcyBub3Qgc2V0CkBAIC0zODksNiArNDEzLDcgQEAKICMgQ09ORklHX1RJUEMgaXMgbm90IHNldAogIyBDT05GSUdfQVRNIGlzIG5vdCBzZXQKICMgQ09ORklHX0JSSURHRSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfRFNBIGlzIG5vdCBzZXQKICMgQ09ORklHX1ZMQU5fODAyMVEgaXMgbm90IHNldAogIyBDT05GSUdfREVDTkVUIGlzIG5vdCBzZXQKICMgQ09ORklHX0xMQzIgaXMgbm90IHNldApAQCAtNDA1LDYgKzQzMCw3IEBACiAjCiAjIENPTkZJR19ORVRfUEtUR0VOIGlzIG5vdCBzZXQKICMgQ09ORklHX0hBTVJBRElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NBTiBpcyBub3Qgc2V0CiBDT05GSUdfSVJEQT1tCiAKICMKQEAgLTQ0MCwyNCArNDY2LDE0IEBACiAjIENPTkZJR19ET05HTEUgaXMgbm90IHNldAogCiAjCi0jIE9sZCBTSVIgZGV2aWNlIGRyaXZlcnMKLSMKLSMgQ09ORklHX0lSUE9SVF9TSVIgaXMgbm90IHNldAotCi0jCi0jIE9sZCBTZXJpYWwgZG9uZ2xlIHN1cHBvcnQKLSMKLQotIwogIyBGSVIgZGV2aWNlIGRyaXZlcnMKICMKICMgQ09ORklHX0JUIGlzIG5vdCBzZXQKICMgQ09ORklHX0FGX1JYUlBDIGlzIG5vdCBzZXQKLQotIwotIyBXaXJlbGVzcwotIworIyBDT05GSUdfUEhPTkVUIGlzIG5vdCBzZXQKK0NPTkZJR19XSVJFTEVTUz15CiAjIENPTkZJR19DRkc4MDIxMSBpcyBub3Qgc2V0CitDT05GSUdfV0lSRUxFU1NfT0xEX1JFR1VMQVRPUlk9eQogIyBDT05GSUdfV0lSRUxFU1NfRVhUIGlzIG5vdCBzZXQKICMgQ09ORklHX01BQzgwMjExIGlzIG5vdCBzZXQKICMgQ09ORklHX0lFRUU4MDIxMSBpcyBub3Qgc2V0CkBAIC00NzUsNiArNDkxLDggQEAKIENPTkZJR19TVEFOREFMT05FPXkKIENPTkZJR19QUkVWRU5UX0ZJUk1XQVJFX0JVSUxEPXkKICMgQ09ORklHX0ZXX0xPQURFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19EUklWRVIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfREVWUkVTIGlzIG5vdCBzZXQKICMgQ09ORklHX1NZU19IWVBFUlZJU09SIGlzIG5vdCBzZXQKICMgQ09ORklHX0NPTk5FQ1RPUiBpcyBub3Qgc2V0CiBDT05GSUdfTVREPXkKQEAgLTQ4Myw2ICs1MDEsNyBAQAogQ09ORklHX01URF9QQVJUSVRJT05TPXkKICMgQ09ORklHX01URF9SRURCT09UX1BBUlRTIGlzIG5vdCBzZXQKIENPTkZJR19NVERfQ01ETElORV9QQVJUUz15CisjIENPTkZJR19NVERfQVI3X1BBUlRTIGlzIG5vdCBzZXQKIAogIwogIyBVc2VyIE1vZHVsZXMgQW5kIFRyYW5zbGF0aW9uIExheWVycwpAQCAtNTUzLDE1ICs1NzIsMTEgQEAKICMgQ09ORklHX01URF9OQU5EX1ZFUklGWV9XUklURSBpcyBub3Qgc2V0CiAjIENPTkZJR19NVERfTkFORF9FQ0NfU01DIGlzIG5vdCBzZXQKICMgQ09ORklHX01URF9OQU5EX01VU0VVTV9JRFMgaXMgbm90IHNldAotQ09ORklHX01URF9OQU5EX0JGSU49bQotQ09ORklHX0JGSU5fTkFORF9CQVNFPTB4MjAyMTIwMDAKLUNPTkZJR19CRklOX05BTkRfQ0xFPTIKLUNPTkZJR19CRklOX05BTkRfQUxFPTEKLUNPTkZJR19CRklOX05BTkRfUkVBRFk9MworIyBDT05GSUdfTVREX05BTkRfQkZJTiBpcyBub3Qgc2V0CiBDT05GSUdfTVREX05BTkRfSURTPW0KICMgQ09ORklHX01URF9OQU5EX0RJU0tPTkNISVAgaXMgbm90IHNldAogIyBDT05GSUdfTVREX05BTkRfTkFORFNJTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19NVERfTkFORF9QTEFURk9STSBpcyBub3Qgc2V0CitDT05GSUdfTVREX05BTkRfUExBVEZPUk09bQogIyBDT05GSUdfTVREX09ORU5BTkQgaXMgbm90IHNldAogCiAjCkBAIC01NzYsMTEgKzU5MSwxNCBAQAogQ09ORklHX0JMS19ERVZfUkFNPXkKIENPTkZJR19CTEtfREVWX1JBTV9DT1VOVD0xNgogQ09ORklHX0JMS19ERVZfUkFNX1NJWkU9NDA5NgotQ09ORklHX0JMS19ERVZfUkFNX0JMT0NLU0laRT0xMDI0CisjIENPTkZJR19CTEtfREVWX1hJUCBpcyBub3Qgc2V0CiAjIENPTkZJR19DRFJPTV9QS1RDRFZEIGlzIG5vdCBzZXQKICMgQ09ORklHX0FUQV9PVkVSX0VUSCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0hEIGlzIG5vdCBzZXQKIENPTkZJR19NSVNDX0RFVklDRVM9eQogIyBDT05GSUdfRUVQUk9NXzkzQ1g2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0VOQ0xPU1VSRV9TRVJWSUNFUyBpcyBub3Qgc2V0CitDT05GSUdfSEFWRV9JREU9eQogIyBDT05GSUdfSURFIGlzIG5vdCBzZXQKIAogIwpAQCAtNTkzLDcgKzYxMSw2IEBACiAjIENPTkZJR19BVEEgaXMgbm90IHNldAogIyBDT05GSUdfTUQgaXMgbm90IHNldAogQ09ORklHX05FVERFVklDRVM9eQotIyBDT05GSUdfTkVUREVWSUNFU19NVUxUSVFVRVVFIGlzIG5vdCBzZXQKICMgQ09ORklHX0RVTU1ZIGlzIG5vdCBzZXQKICMgQ09ORklHX0JPTkRJTkcgaXMgbm90IHNldAogIyBDT05GSUdfTUFDVkxBTiBpcyBub3Qgc2V0CkBAIC02MTQsNiArNjMxLDcgQEAKIENPTkZJR19TTVNDX1BIWT15CiAjIENPTkZJR19CUk9BRENPTV9QSFkgaXMgbm90IHNldAogIyBDT05GSUdfSUNQTFVTX1BIWSBpcyBub3Qgc2V0CisjIENPTkZJR19SRUFMVEVLX1BIWSBpcyBub3Qgc2V0CiAjIENPTkZJR19GSVhFRF9QSFkgaXMgbm90IHNldAogIyBDT05GSUdfTURJT19CSVRCQU5HIGlzIG5vdCBzZXQKIENPTkZJR19ORVRfRVRIRVJORVQ9eQpAQCAtNjI2LDExICs2NDQsMTQgQEAKICMgQ09ORklHX1NNQzkxWCBpcyBub3Qgc2V0CiAjIENPTkZJR19TTVNDOTExWCBpcyBub3Qgc2V0CiAjIENPTkZJR19ETTkwMDAgaXMgbm90IHNldAorIyBDT05GSUdfRU5DMjhKNjAgaXMgbm90IHNldAogIyBDT05GSUdfSUJNX05FV19FTUFDX1pNSUkgaXMgbm90IHNldAogIyBDT05GSUdfSUJNX05FV19FTUFDX1JHTUlJIGlzIG5vdCBzZXQKICMgQ09ORklHX0lCTV9ORVdfRU1BQ19UQUggaXMgbm90IHNldAogIyBDT05GSUdfSUJNX05FV19FTUFDX0VNQUM0IGlzIG5vdCBzZXQKLSMgQ09ORklHX0I0NCBpcyBub3Qgc2V0CisjIENPTkZJR19JQk1fTkVXX0VNQUNfTk9fRkxPV19DVFJMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lCTV9ORVdfRU1BQ19NQUxfQ0xSX0lDSU5UU1RBVCBpcyBub3Qgc2V0CisjIENPTkZJR19JQk1fTkVXX0VNQUNfTUFMX0NPTU1PTl9FUlIgaXMgbm90IHNldAogQ09ORklHX05FVERFVl8xMDAwPXkKICMgQ09ORklHX0FYODgxODAgaXMgbm90IHNldAogQ09ORklHX05FVERFVl8xMDAwMD15CkBAIC02NDAsMTAgKzY2MSwxMCBAQAogIwogIyBDT05GSUdfV0xBTl9QUkU4MDIxMSBpcyBub3Qgc2V0CiAjIENPTkZJR19XTEFOXzgwMjExIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lXTFdJRklfTEVEUyBpcyBub3Qgc2V0CiAjIENPTkZJR19XQU4gaXMgbm90IHNldAogIyBDT05GSUdfUFBQIGlzIG5vdCBzZXQKICMgQ09ORklHX1NMSVAgaXMgbm90IHNldAotIyBDT05GSUdfU0hBUEVSIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVENPTlNPTEUgaXMgbm90IHNldAogIyBDT05GSUdfTkVUUE9MTCBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSIGlzIG5vdCBzZXQKQEAgLTY3NSwxMiArNjk2LDE1IEBACiAjIENPTkZJR19JTlBVVF9UT1VDSFNDUkVFTiBpcyBub3Qgc2V0CiBDT05GSUdfSU5QVVRfTUlTQz15CiAjIENPTkZJR19JTlBVVF9VSU5QVVQgaXMgbm90IHNldAotQ09ORklHX1RXSV9LRVlQQUQ9bQorQ09ORklHX0NPTkZJR19JTlBVVF9QQ0Y4NTc0PW0KIAogIwogIyBIYXJkd2FyZSBJL08gcG9ydHMKICMKLSMgQ09ORklHX1NFUklPIGlzIG5vdCBzZXQKK0NPTkZJR19TRVJJTz15CitDT05GSUdfU0VSSU9fU0VSUE9SVD15CitDT05GSUdfU0VSSU9fTElCUFMyPXkKKyMgQ09ORklHX1NFUklPX1JBVyBpcyBub3Qgc2V0CiAjIENPTkZJR19HQU1FUE9SVCBpcyBub3Qgc2V0CiAKICMKQEAgLTY5MSwxMSArNzE1LDE0IEBACiAjIENPTkZJR19CRjV4eF9QUElGQ0QgaXMgbm90IHNldAogIyBDT05GSUdfQkZJTl9TSU1QTEVfVElNRVIgaXMgbm90IHNldAogIyBDT05GSUdfQkY1eHhfUFBJIGlzIG5vdCBzZXQKLUNPTkZJR19CRklOX1NQT1JUPXkKK0NPTkZJR19CRklOX1NQT1JUPW0KICMgQ09ORklHX0JGSU5fVElNRVJfTEFURU5DWSBpcyBub3Qgc2V0CiBDT05GSUdfVFdJX0xDRD1tCitDT05GSUdfQkZJTl9ETUFfSU5URVJGQUNFPW0KIENPTkZJR19TSU1QTEVfR1BJTz1tCiAjIENPTkZJR19WVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERVZLTUVNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGSU5fSlRBR19DT01NIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFUklBTF9OT05TVEFOREFSRCBpcyBub3Qgc2V0CiAKICMKQEAgLTcyNyw0OCArNzU0LDUxIEBACiAjCiAjIGxpbnV4IGVtYmVkZGVkIGRyaXZlcnMKICMKLSMgQ09ORklHX0NBTl9NQ0Y1MjgyIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NBTl9VTkNUV0lOQ0FOIGlzIG5vdCBzZXQKIENPTkZJR19DQU5fQkxBQ0tGSU49bQogIyBDT05GSUdfSVBNSV9IQU5ETEVSIGlzIG5vdCBzZXQKICMgQ09ORklHX0hXX1JBTkRPTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19HRU5fUlRDIGlzIG5vdCBzZXQKICMgQ09ORklHX1IzOTY0IGlzIG5vdCBzZXQKICMgQ09ORklHX1JBV19EUklWRVIgaXMgbm90IHNldAogIyBDT05GSUdfVENHX1RQTSBpcyBub3Qgc2V0CiBDT05GSUdfSTJDPW0KIENPTkZJR19JMkNfQk9BUkRJTkZPPXkKIENPTkZJR19JMkNfQ0hBUkRFVj1tCi0KLSMKLSMgSTJDIEFsZ29yaXRobXMKLSMKLSMgQ09ORklHX0kyQ19BTEdPQklUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19BTEdPUENGIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19BTEdPUENBIGlzIG5vdCBzZXQKK0NPTkZJR19JMkNfSEVMUEVSX0FVVE89eQogCiAjCiAjIEkyQyBIYXJkd2FyZSBCdXMgc3VwcG9ydAogIworCisjCisjIEkyQyBzeXN0ZW0gYnVzIGRyaXZlcnMgKG1vc3RseSBlbWJlZGRlZCAvIHN5c3RlbS1vbi1jaGlwKQorIwogQ09ORklHX0kyQ19CTEFDS0ZJTl9UV0k9bQotQ09ORklHX0kyQ19CTEFDS0ZJTl9UV0lfQ0xLX0tIWj01MAorQ09ORklHX0kyQ19CTEFDS0ZJTl9UV0lfQ0xLX0tIWj0xMDAKICMgQ09ORklHX0kyQ19HUElPIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19PQ09SRVMgaXMgbm90IHNldAotIyBDT05GSUdfSTJDX1BBUlBPUlRfTElHSFQgaXMgbm90IHNldAogIyBDT05GSUdfSTJDX1NJTVRFQyBpcyBub3Qgc2V0CisKKyMKKyMgRXh0ZXJuYWwgSTJDL1NNQnVzIGFkYXB0ZXIgZHJpdmVycworIworIyBDT05GSUdfSTJDX1BBUlBPUlRfTElHSFQgaXMgbm90IHNldAogIyBDT05GSUdfSTJDX1RBT1NfRVZNIGlzIG5vdCBzZXQKKworIworIyBPdGhlciBJMkMvU01CdXMgYnVzIGRyaXZlcnMKKyMKKyMgQ09ORklHX0kyQ19QQ0FfUExBVEZPUk0gaXMgbm90IHNldAogIyBDT05GSUdfSTJDX1NUVUIgaXMgbm90IHNldAogCiAjCiAjIE1pc2NlbGxhbmVvdXMgSTJDIENoaXAgc3VwcG9ydAogIwotIyBDT05GSUdfU0VOU09SU19EUzEzMzcgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19EUzEzNzQgaXMgbm90IHNldAogIyBDT05GSUdfRFMxNjgyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUMjQgaXMgbm90IHNldAogQ09ORklHX1NFTlNPUlNfQUQ1MjUyPW0KICMgQ09ORklHX1NFTlNPUlNfRUVQUk9NIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfUENGODU3NCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX1BDRjg1NzUgaXMgbm90IHNldAorIyBDT05GSUdfUENGODU3NSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1BDQTk1MzkgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19QQ0Y4NTkxIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfTUFYNjg3NSBpcyBub3Qgc2V0CkBAIC03NzcsMTcgKzgwNywxNSBAQAogIyBDT05GSUdfSTJDX0RFQlVHX0FMR08gaXMgbm90IHNldAogIyBDT05GSUdfSTJDX0RFQlVHX0JVUyBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfREVCVUdfQ0hJUCBpcyBub3Qgc2V0Ci0KLSMKLSMgU1BJIHN1cHBvcnQKLSMKIENPTkZJR19TUEk9eQorIyBDT05GSUdfU1BJX0RFQlVHIGlzIG5vdCBzZXQKIENPTkZJR19TUElfTUFTVEVSPXkKIAogIwogIyBTUEkgTWFzdGVyIENvbnRyb2xsZXIgRHJpdmVycwogIwogQ09ORklHX1NQSV9CRklOPXkKKyMgQ09ORklHX1NQSV9CRklOX0xPQ0sgaXMgbm90IHNldAogIyBDT05GSUdfU1BJX0JJVEJBTkcgaXMgbm90IHNldAogCiAjCkBAIC03OTYsMTEgKzgyNCwxNSBAQAogIyBDT05GSUdfU1BJX0FUMjUgaXMgbm90IHNldAogIyBDT05GSUdfU1BJX1NQSURFViBpcyBub3Qgc2V0CiAjIENPTkZJR19TUElfVExFNjJYMCBpcyBub3Qgc2V0CitDT05GSUdfQVJDSF9XQU5UX09QVElPTkFMX0dQSU9MSUI9eQorIyBDT05GSUdfR1BJT0xJQiBpcyBub3Qgc2V0CiAjIENPTkZJR19XMSBpcyBub3Qgc2V0CiAjIENPTkZJR19QT1dFUl9TVVBQTFkgaXMgbm90IHNldAogQ09ORklHX0hXTU9OPXkKICMgQ09ORklHX0hXTU9OX1ZJRCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FENzQxNCBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0FENzQxOCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FEQ1hYIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfQURNMTAyMSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0FETTEwMjUgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19BRE0xMDI2IGlzIG5vdCBzZXQKQEAgLTgwOCw2ICs4NDAsNyBAQAogIyBDT05GSUdfU0VOU09SU19BRE0xMDMxIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfQURNOTI0MCBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0FEVDc0NzAgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRFQ3NDczIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfQVRYUDEgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19EUzE2MjEgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19GNzE4MDVGIGlzIG5vdCBzZXQKQEAgLTgyOCw2ICs4NjEsNyBAQAogIyBDT05GSUdfU0VOU09SU19MTTkwIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfTE05MiBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0xNOTMgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19NQVgxMTExIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfTUFYMTYxOSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX01BWDY2NTAgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19QQzg3MzYwIGlzIG5vdCBzZXQKQEAgLTgzNiw2ICs4NzAsNyBAQAogIyBDT05GSUdfU0VOU09SU19TTVNDNDdNMSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1NNU0M0N00xOTIgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19TTVNDNDdCMzk3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURTNzgyOCBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1RITUM1MCBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1ZUMTIxMSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1c4Mzc4MUQgaXMgbm90IHNldApAQCAtODQzLDkgKzg3OCwxMiBAQAogIyBDT05GSUdfU0VOU09SU19XODM3OTJEIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfVzgzNzkzIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfVzgzTDc4NVRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVzgzTDc4Nk5HIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfVzgzNjI3SEYgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19XODM2MjdFSEYgaXMgbm90IHNldAogIyBDT05GSUdfSFdNT05fREVCVUdfQ0hJUCBpcyBub3Qgc2V0CisjIENPTkZJR19USEVSTUFMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RIRVJNQUxfSFdNT04gaXMgbm90IHNldAogQ09ORklHX1dBVENIRE9HPXkKICMgQ09ORklHX1dBVENIRE9HX05PV0FZT1VUIGlzIG5vdCBzZXQKIApAQCAtODU2LDIxICs4OTQsMjkgQEAKIENPTkZJR19CRklOX1dEVD15CiAKICMKLSMgU29uaWNzIFNpbGljb24gQmFja3BsYW5lCi0jCi1DT05GSUdfU1NCX1BPU1NJQkxFPXkKLSMgQ09ORklHX1NTQiBpcyBub3Qgc2V0Ci0KLSMKICMgTXVsdGlmdW5jdGlvbiBkZXZpY2UgZHJpdmVycwogIworIyBDT05GSUdfTUZEX0NPUkUgaXMgbm90IHNldAogIyBDT05GSUdfTUZEX1NNNTAxIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hUQ19QQVNJQzMgaXMgbm90IHNldAorIyBDT05GSUdfTUZEX1RNSU8gaXMgbm90IHNldAorIyBDT05GSUdfTUZEX1dNODQwMCBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfV004MzUwX0kyQyBpcyBub3Qgc2V0CiAKICMKICMgTXVsdGltZWRpYSBkZXZpY2VzCiAjCisKKyMKKyMgTXVsdGltZWRpYSBjb3JlIHN1cHBvcnQKKyMKICMgQ09ORklHX1ZJREVPX0RFViBpcyBub3Qgc2V0CiAjIENPTkZJR19EVkJfQ09SRSBpcyBub3Qgc2V0CisjIENPTkZJR19WSURFT19NRURJQSBpcyBub3Qgc2V0CisKKyMKKyMgTXVsdGltZWRpYSBkcml2ZXJzCisjCiAjIENPTkZJR19EQUIgaXMgbm90IHNldAogCiAjCkBAIC04ODEsNiArOTI3LDcgQEAKIENPTkZJR19GQj1tCiBDT05GSUdfRklSTVdBUkVfRURJRD15CiAjIENPTkZJR19GQl9EREMgaXMgbm90IHNldAorIyBDT05GSUdfRkJfQk9PVF9WRVNBX1NVUFBPUlQgaXMgbm90IHNldAogQ09ORklHX0ZCX0NGQl9GSUxMUkVDVD1tCiBDT05GSUdfRkJfQ0ZCX0NPUFlBUkVBPW0KIENPTkZJR19GQl9DRkJfSU1BR0VCTElUPW0KQEAgLTg4OCw4ICs5MzUsOCBAQAogIyBDT05GSUdfRkJfU1lTX0ZJTExSRUNUIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX1NZU19DT1BZQVJFQSBpcyBub3Qgc2V0CiAjIENPTkZJR19GQl9TWVNfSU1BR0VCTElUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX0ZPUkVJR05fRU5ESUFOIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX1NZU19GT1BTIGlzIG5vdCBzZXQKLUNPTkZJR19GQl9ERUZFUlJFRF9JTz15CiAjIENPTkZJR19GQl9TVkdBTElCIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX01BQ01PREVTIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX0JBQ0tMSUdIVCBpcyBub3Qgc2V0CkBAIC04OTksOCArOTQ2LDEyIEBACiAjCiAjIEZyYW1lIGJ1ZmZlciBoYXJkd2FyZSBkcml2ZXJzCiAjCi0jIENPTkZJR19GQl9ISVRBQ0hJX1RYMDkgaXMgbm90IHNldAogIyBDT05GSUdfRkJfQkZJTl9UMzUwTUNRQiBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9CRklOX0xRMDM1UTEgaXMgbm90IHNldAorQ09ORklHX0ZCX0JGNTM3X0xRMDM1PW0KK0NPTkZJR19MUTAzNV9TTEFWRV9BRERSPTB4NTgKKyMgQ09ORklHX0ZCX0JGSU5fTEFORFNDQVBFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX0JGSU5fQkdSIGlzIG5vdCBzZXQKIENPTkZJR19GQl9CRklOXzczOTM9bQogQ09ORklHX05UU0M9eQogIyBDT05GSUdfUEFMIGlzIG5vdCBzZXQKQEAgLTkxMCwxNSArOTYxLDE3IEBACiAjIENPTkZJR19QQUxfWUNCQ1IgaXMgbm90IHNldAogQ09ORklHX0FEVjczOTNfMVhNRU09eQogIyBDT05GSUdfQURWNzM5M18yWE1FTSBpcyBub3Qgc2V0Ci1DT05GSUdfRkJfQkY1MzdfTFEwMzU9bQotQ09ORklHX0xRMDM1X1NMQVZFX0FERFI9MHg1OAotIyBDT05GSUdfRkJfQkZJTl9MQU5EU0NBUEUgaXMgbm90IHNldAotIyBDT05GSUdfRkJfQkZJTl9CR1IgaXMgbm90IHNldAorIyBDT05GSUdfRkJfSElUQUNISV9UWDA5IGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX1MxRDEzWFhYIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX1ZJUlRVQUwgaXMgbm90IHNldAorIyBDT05GSUdfRkJfTUVUUk9OT01FIGlzIG5vdCBzZXQKIENPTkZJR19CQUNLTElHSFRfTENEX1NVUFBPUlQ9eQogQ09ORklHX0xDRF9DTEFTU19ERVZJQ0U9bQogIyBDT05GSUdfTENEX0xUVjM1MFFWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xDRF9JTEk5MzIwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xDRF9URE8yNE0gaXMgbm90IHNldAorIyBDT05GSUdfTENEX1ZHRzI0MzJBNCBpcyBub3Qgc2V0CisjIENPTkZJR19MQ0RfUExBVEZPUk0gaXMgbm90IHNldAogQ09ORklHX0JBQ0tMSUdIVF9DTEFTU19ERVZJQ0U9bQogQ09ORklHX0JBQ0tMSUdIVF9DT1JHST1tCiAKQEAgLTkyNywxNSArOTgwLDggQEAKICMKICMgQ09ORklHX0RJU1BMQVlfU1VQUE9SVCBpcyBub3Qgc2V0CiAjIENPTkZJR19MT0dPIGlzIG5vdCBzZXQKLQotIwotIyBTb3VuZAotIwogQ09ORklHX1NPVU5EPW0KLQotIwotIyBBZHZhbmNlZCBMaW51eCBTb3VuZCBBcmNoaXRlY3R1cmUKLSMKK0NPTkZJR19TT1VORF9PU1NfQ09SRT15CiBDT05GSUdfU05EPW0KIENPTkZJR19TTkRfVElNRVI9bQogQ09ORklHX1NORF9QQ009bQpAQCAtOTQ5LDE4ICs5OTUsMTIgQEAKIENPTkZJR19TTkRfVkVSQk9TRV9QUk9DRlM9eQogIyBDT05GSUdfU05EX1ZFUkJPU0VfUFJJTlRLIGlzIG5vdCBzZXQKICMgQ09ORklHX1NORF9ERUJVRyBpcyBub3Qgc2V0Ci0KLSMKLSMgR2VuZXJpYyBkZXZpY2VzCi0jCitDT05GSUdfU05EX0RSSVZFUlM9eQogIyBDT05GSUdfU05EX0RVTU1ZIGlzIG5vdCBzZXQKICMgQ09ORklHX1NORF9NVFBBViBpcyBub3Qgc2V0CiAjIENPTkZJR19TTkRfU0VSSUFMX1UxNjU1MCBpcyBub3Qgc2V0CiAjIENPTkZJR19TTkRfTVBVNDAxIGlzIG5vdCBzZXQKLQotIwotIyBTUEkgZGV2aWNlcwotIworQ09ORklHX1NORF9TUEk9eQogCiAjCiAjIEFMU0EgQmxhY2tmaW4gZGV2aWNlcwpAQCAtOTcyLDUxICsxMDEyLDQ2IEBACiAjIENPTkZJR19TTkRfQkxBQ0tGSU5fQUQxODM2XzVQMSBpcyBub3Qgc2V0CiBDT05GSUdfU05EX0JMQUNLRklOX1NQT1JUPTAKIENPTkZJR19TTkRfQkxBQ0tGSU5fU1BJX1BGQklUPTQKLUNPTkZJR19TTkRfQkZJTl9BRDczMzExPW0KIENPTkZJR19TTkRfQkZJTl9TUE9SVD0wCi1DT05GSUdfU05EX0JGSU5fQUQ3MzMxMV9TRT00CiBDT05GSUdfU05EX0JGSU5fQUQ3MzMyMj1tCiBDT05GSUdfU05EX0JGSU5fQUQ3MzMyMl9TUE9SVDBfU0U9MTAKIENPTkZJR19TTkRfQkZJTl9BRDczMzIyX1NQT1JUMV9TRT0xNAogQ09ORklHX1NORF9CRklOX0FENzMzMjJfUkVTRVQ9MTIKLQotIwotIyBTeXN0ZW0gb24gQ2hpcCBhdWRpbyBzdXBwb3J0Ci0jCi1DT05GSUdfU05EX1NPQ19BQzk3X0JVUz15CiBDT05GSUdfU05EX1NPQz1tCi1DT05GSUdfU05EX0JGNVhYX1NPQz1tCi1DT05GSUdfU05EX01NQVBfU1VQUE9SVD15Ci1DT05GSUdfU05EX0JGNVhYX1NPQ19BQzk3PW0KLSMgQ09ORklHX1NORF9CRjVYWF9TT0NfV004NzUwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9CRjVYWF9TT0NfV004NzMxIGlzIG5vdCBzZXQKK0NPTkZJR19TTkRfU09DX0FDOTdfQlVTPXkKK0NPTkZJR19TTkRfQkY1WFhfSTJTPW0KICMgQ09ORklHX1NORF9CRjVYWF9TT0NfU1NNMjYwMiBpcyBub3Qgc2V0Ci1DT05GSUdfU05EX0JGNVhYX1NPQ19CRjV4eD1tCitDT05GSUdfU05EX0JGNVhYX1NPQ19BRDczMzExPW0KK0NPTkZJR19TTkRfQkZJTl9BRDczMzExX1NFPTQKK0NPTkZJR19TTkRfQkY1WFhfQUM5Nz1tCitDT05GSUdfU05EX0JGNVhYX01NQVBfU1VQUE9SVD15CisjIENPTkZJR19TTkRfQkY1WFhfTVVMVElDSEFOX1NVUFBPUlQgaXMgbm90IHNldAorQ09ORklHX1NORF9CRjVYWF9TT0NfU1BPUlQ9bQorQ09ORklHX1NORF9CRjVYWF9TT0NfSTJTPW0KK0NPTkZJR19TTkRfQkY1WFhfU09DX0FDOTc9bQorQ09ORklHX1NORF9CRjVYWF9TT0NfQUQxOTgwPW0KIENPTkZJR19TTkRfQkY1WFhfU1BPUlRfTlVNPTAKICMgQ09ORklHX1NORF9CRjVYWF9IQVZFX0NPTERfUkVTRVQgaXMgbm90IHNldAotCi0jCi0jIFNvQyBBdWRpbyBzdXBwb3J0IGZvciBTdXBlckgKLSMKKyMgQ09ORklHX1NORF9TT0NfQUxMX0NPREVDUyBpcyBub3Qgc2V0CiBDT05GSUdfU05EX1NPQ19BRDE5ODA9bQotCi0jCi0jIE9wZW4gU291bmQgU3lzdGVtCi0jCitDT05GSUdfU05EX1NPQ19BRDczMzExPW0KICMgQ09ORklHX1NPVU5EX1BSSU1FIGlzIG5vdCBzZXQKIENPTkZJR19BQzk3X0JVUz1tCiBDT05GSUdfSElEX1NVUFBPUlQ9eQogQ09ORklHX0hJRD15CiAjIENPTkZJR19ISURfREVCVUcgaXMgbm90IHNldAogIyBDT05GSUdfSElEUkFXIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hJRF9QSUQgaXMgbm90IHNldAorCisjCisjIFNwZWNpYWwgSElEIGRyaXZlcnMKKyMKK0NPTkZJR19ISURfQ09NUEFUPXkKICMgQ09ORklHX1VTQl9TVVBQT1JUIGlzIG5vdCBzZXQKLSMgQ09ORklHX05PX0RVTU1ZX0RFTEFZIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RVTU1ZX0RFTEFZX0JBTkswIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RVTU1ZX0RFTEFZX0JBTksxIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RVTU1ZX0RFTEFZX0JBTksyIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RVTU1ZX0RFTEFZX0JBTkszIGlzIG5vdCBzZXQKICMgQ09ORklHX01NQyBpcyBub3Qgc2V0CisjIENPTkZJR19NRU1TVElDSyBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVdfTEVEUyBpcyBub3Qgc2V0CisjIENPTkZJR19BQ0NFU1NJQklMSVRZIGlzIG5vdCBzZXQKIENPTkZJR19SVENfTElCPXkKIENPTkZJR19SVENfQ0xBU1M9eQogQ09ORklHX1JUQ19IQ1RPU1lTPXkKQEAgLTEwNDUsNTEgKzEwODAsNTcgQEAKICMgQ09ORklHX1JUQ19EUlZfUENGODU2MyBpcyBub3Qgc2V0CiAjIENPTkZJR19SVENfRFJWX1BDRjg1ODMgaXMgbm90IHNldAogIyBDT05GSUdfUlRDX0RSVl9NNDFUODAgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9TMzUzOTBBIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfRk0zMTMwIGlzIG5vdCBzZXQKIAogIwogIyBTUEkgUlRDIGRyaXZlcnMKICMKLSMgQ09ORklHX1JUQ19EUlZfUlM1QzM0OCBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX000MVQ5NCBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0RTMTMwNSBpcyBub3Qgc2V0CiAjIENPTkZJR19SVENfRFJWX01BWDY5MDIgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9SOTcwMSBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1JTNUMzNDggaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9EUzMyMzQgaXMgbm90IHNldAogCiAjCiAjIFBsYXRmb3JtIFJUQyBkcml2ZXJzCiAjCisjIENPTkZJR19SVENfRFJWX0RTMTI4NiBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0RTMTUxMSBpcyBub3Qgc2V0CiAjIENPTkZJR19SVENfRFJWX0RTMTU1MyBpcyBub3Qgc2V0Ci0jIENPTkZJR19SVENfRFJWX1NUSzE3VEE4IGlzIG5vdCBzZXQKICMgQ09ORklHX1JUQ19EUlZfRFMxNzQyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfU1RLMTdUQTggaXMgbm90IHNldAogIyBDT05GSUdfUlRDX0RSVl9NNDhUODYgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9NNDhUMzUgaXMgbm90IHNldAogIyBDT05GSUdfUlRDX0RSVl9NNDhUNTkgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9CUTQ4MDIgaXMgbm90IHNldAogIyBDT05GSUdfUlRDX0RSVl9WMzAyMCBpcyBub3Qgc2V0CiAKICMKICMgb24tQ1BVIFJUQyBkcml2ZXJzCiAjCiBDT05GSUdfUlRDX0RSVl9CRklOPXkKLQotIwotIyBVc2Vyc3BhY2UgSS9PCi0jCisjIENPTkZJR19ETUFERVZJQ0VTIGlzIG5vdCBzZXQKICMgQ09ORklHX1VJTyBpcyBub3Qgc2V0CisjIENPTkZJR19TVEFHSU5HIGlzIG5vdCBzZXQKIAogIwogIyBGaWxlIHN5c3RlbXMKICMKICMgQ09ORklHX0VYVDJfRlMgaXMgbm90IHNldAogIyBDT05GSUdfRVhUM19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19FWFQ0REVWX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDRfRlMgaXMgbm90IHNldAogIyBDT05GSUdfUkVJU0VSRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfSkZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CitDT05GSUdfRklMRV9MT0NLSU5HPXkKICMgQ09ORklHX1hGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19HRlMyX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX09DRlMyX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX01JTklYX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1JPTUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ROT1RJRlkgaXMgbm90IHNldAogQ09ORklHX0lOT1RJRlk9eQogQ09ORklHX0lOT1RJRllfVVNFUj15CiAjIENPTkZJR19RVU9UQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19ETk9USUZZIGlzIG5vdCBzZXQKICMgQ09ORklHX0FVVE9GU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19BVVRPRlM0X0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZVU0VfRlMgaXMgbm90IHNldApAQCAtMTEyOSwxMSArMTE3MCwxMSBAQAogIyBDT05GSUdfRUZTX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19ZQUZGU19GUz1tCiBDT05GSUdfWUFGRlNfWUFGRlMxPXkKKyMgQ09ORklHX1lBRkZTXzlCWVRFX1RBR1MgaXMgbm90IHNldAogIyBDT05GSUdfWUFGRlNfRE9FU19FQ0MgaXMgbm90IHNldAogQ09ORklHX1lBRkZTX1lBRkZTMj15CiBDT05GSUdfWUFGRlNfQVVUT19ZQUZGUzI9eQogIyBDT05GSUdfWUFGRlNfRElTQUJMRV9MQVpZX0xPQUQgaXMgbm90IHNldAotQ09ORklHX1lBRkZTX0NIRUNLUE9JTlRfUkVTRVJWRURfQkxPQ0tTPTEwCiAjIENPTkZJR19ZQUZGU19ESVNBQkxFX1dJREVfVE5PREVTIGlzIG5vdCBzZXQKICMgQ09ORklHX1lBRkZTX0FMV0FZU19DSEVDS19DSFVOS19FUkFTRUQgaXMgbm90IHNldAogQ09ORklHX1lBRkZTX1NIT1JUX05BTUVTX0lOX1JBTT15CkBAIC0xMTUwLDggKzExOTEsMTEgQEAKICMgQ09ORklHX0pGRlMyX1JVQklOIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSQU1GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19WWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JTklYX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX09NRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfSFBGU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19RTlg0RlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfU1lTVl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19VRlNfRlMgaXMgbm90IHNldAogQ09ORklHX05FVFdPUktfRklMRVNZU1RFTVM9eQpAQCAtMTE1OSwxMyArMTIwMywxMiBAQAogQ09ORklHX05GU19WMz15CiAjIENPTkZJR19ORlNfVjNfQUNMIGlzIG5vdCBzZXQKICMgQ09ORklHX05GU19WNCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORlNfRElSRUNUSU8gaXMgbm90IHNldAogIyBDT05GSUdfTkZTRCBpcyBub3Qgc2V0CiBDT05GSUdfTE9DS0Q9bQogQ09ORklHX0xPQ0tEX1Y0PXkKIENPTkZJR19ORlNfQ09NTU9OPXkKIENPTkZJR19TVU5SUEM9bQotIyBDT05GSUdfU1VOUlBDX0JJTkQzNCBpcyBub3Qgc2V0CisjIENPTkZJR19TVU5SUENfUkVHSVNURVJfVjQgaXMgbm90IHNldAogIyBDT05GSUdfUlBDU0VDX0dTU19LUkI1IGlzIG5vdCBzZXQKICMgQ09ORklHX1JQQ1NFQ19HU1NfU1BLTTMgaXMgbm90IHNldAogQ09ORklHX1NNQl9GUz1tCkBAIC0xMjIxLDkgKzEyNjQsNiBAQAogIyBDT05GSUdfTkxTX0tPSThfVSBpcyBub3Qgc2V0CiAjIENPTkZJR19OTFNfVVRGOCBpcyBub3Qgc2V0CiAjIENPTkZJR19ETE0gaXMgbm90IHNldAotQ09ORklHX0lOU1RSVU1FTlRBVElPTj15Ci0jIENPTkZJR19QUk9GSUxJTkcgaXMgbm90IHNldAotIyBDT05GSUdfTUFSS0VSUyBpcyBub3Qgc2V0CiAKICMKICMgS2VybmVsIGhhY2tpbmcKQEAgLTEyMzEsMTQgKzEyNzEsNTMgQEAKICMgQ09ORklHX1BSSU5US19USU1FIGlzIG5vdCBzZXQKIENPTkZJR19FTkFCTEVfV0FSTl9ERVBSRUNBVEVEPXkKIENPTkZJR19FTkFCTEVfTVVTVF9DSEVDSz15CitDT05GSUdfRlJBTUVfV0FSTj0xMDI0CiAjIENPTkZJR19NQUdJQ19TWVNSUSBpcyBub3Qgc2V0CiAjIENPTkZJR19VTlVTRURfU1lNQk9MUyBpcyBub3Qgc2V0CiBDT05GSUdfREVCVUdfRlM9eQogIyBDT05GSUdfSEVBREVSU19DSEVDSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19LRVJORUwgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX0tFUk5FTD15CisjIENPTkZJR19ERUJVR19TSElSUSBpcyBub3Qgc2V0CitDT05GSUdfREVURUNUX1NPRlRMT0NLVVA9eQorIyBDT05GSUdfQk9PVFBBUkFNX1NPRlRMT0NLVVBfUEFOSUMgaXMgbm90IHNldAorQ09ORklHX0JPT1RQQVJBTV9TT0ZUTE9DS1VQX1BBTklDX1ZBTFVFPTAKK0NPTkZJR19TQ0hFRF9ERUJVRz15CisjIENPTkZJR19TQ0hFRFNUQVRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RJTUVSX1NUQVRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX09CSkVDVFMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU0xBQiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19SVF9NVVRFWEVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUX01VVEVYX1RFU1RFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TUElOTE9DSyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19NVVRFWEVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NQSU5MT0NLX1NMRUVQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0xPQ0tJTkdfQVBJX1NFTEZURVNUUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19LT0JKRUNUIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX0JVR1ZFUkJPU0UgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX0lORk89eQorIyBDT05GSUdfREVCVUdfVk0gaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfV1JJVEVDT1VOVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19NRU1PUllfSU5JVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19MSVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZSQU1FX1BPSU5URVIgaXMgbm90IHNldAorIyBDT05GSUdfQk9PVF9QUklOVEtfREVMQVkgaXMgbm90IHNldAorIyBDT05GSUdfUkNVX1RPUlRVUkVfVEVTVCBpcyBub3Qgc2V0CisjIENPTkZJR19SQ1VfQ1BVX1NUQUxMX0RFVEVDVE9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JBQ0tUUkFDRV9TRUxGX1RFU1QgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfQkxPQ0tfRVhUX0RFVlQgaXMgbm90IHNldAorIyBDT05GSUdfRkFVTFRfSU5KRUNUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU0NUTF9TWVNDQUxMX0NIRUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RZTkFNSUNfUFJJTlRLX0RFQlVHIGlzIG5vdCBzZXQKICMgQ09ORklHX1NBTVBMRVMgaXMgbm90IHNldAorQ09ORklHX0hBVkVfQVJDSF9LR0RCPXkKKyMgQ09ORklHX0tHREIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU1RBQ0tPVkVSRkxPVyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TVEFDS19VU0FHRSBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfVkVSQk9TRT15CiBDT05GSUdfREVCVUdfTU1SUz15CisjIENPTkZJR19ERUJVR19IV0VSUiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19ET1VCTEVGQVVMVCBpcyBub3Qgc2V0CiBDT05GSUdfREVCVUdfSFVOVF9GT1JfWkVSTz15CiBDT05GSUdfREVCVUdfQkZJTl9IV1RSQUNFX09OPXkKIENPTkZJR19ERUJVR19CRklOX0hXVFJBQ0VfQ09NUFJFU1NJT05fT0ZGPXkKQEAgLTEyNTYsOSArMTMzNSw5NCBAQAogIwogIyBDT05GSUdfS0VZUyBpcyBub3Qgc2V0CiBDT05GSUdfU0VDVVJJVFk9eQorIyBDT05GSUdfU0VDVVJJVFlGUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TRUNVUklUWV9ORVRXT1JLIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFQ1VSSVRZX0NBUEFCSUxJVElFUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE8gaXMgbm90IHNldAorIyBDT05GSUdfU0VDVVJJVFlfRklMRV9DQVBBQklMSVRJRVMgaXMgbm90IHNldAorQ09ORklHX1NFQ1VSSVRZX0RFRkFVTFRfTU1BUF9NSU5fQUREUj0wCitDT05GSUdfQ1JZUFRPPXkKKworIworIyBDcnlwdG8gY29yZSBvciBoZWxwZXIKKyMKKyMgQ09ORklHX0NSWVBUT19GSVBTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19NQU5BR0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19HRjEyOE1VTCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTlVMTCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ1JZUFREIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19BVVRIRU5DIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19URVNUIGlzIG5vdCBzZXQKKworIworIyBBdXRoZW50aWNhdGVkIEVuY3J5cHRpb24gd2l0aCBBc3NvY2lhdGVkIERhdGEKKyMKKyMgQ09ORklHX0NSWVBUT19DQ00gaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0dDTSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0VRSVYgaXMgbm90IHNldAorCisjCisjIEJsb2NrIG1vZGVzCisjCisjIENPTkZJR19DUllQVE9fQ0JDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DVFIgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NUUyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fRUNCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19MUlcgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1BDQkMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1hUUyBpcyBub3Qgc2V0CisKKyMKKyMgSGFzaCBtb2RlcworIworIyBDT05GSUdfQ1JZUFRPX0hNQUMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1hDQkMgaXMgbm90IHNldAorCisjCisjIERpZ2VzdAorIworIyBDT05GSUdfQ1JZUFRPX0NSQzMyQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTUQ0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19NRDUgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX01JQ0hBRUxfTUlDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19STUQxMjggaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1JNRDE2MCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fUk1EMjU2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19STUQzMjAgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NIQTEgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NIQTI1NiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0hBNTEyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19UR1IxOTIgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1dQNTEyIGlzIG5vdCBzZXQKKworIworIyBDaXBoZXJzCisjCisjIENPTkZJR19DUllQVE9fQUVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19BTlVCSVMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0FSQzQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0JMT1dGSVNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DQU1FTExJQSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ0FTVDUgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NBU1Q2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19ERVMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0ZDUllQVCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fS0hBWkFEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TQUxTQTIwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TRUVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TRVJQRU5UIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19URUEgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1RXT0ZJU0ggaXMgbm90IHNldAorCisjCisjIENvbXByZXNzaW9uCisjCisjIENPTkZJR19DUllQVE9fREVGTEFURSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTFpPIGlzIG5vdCBzZXQKKworIworIyBSYW5kb20gTnVtYmVyIEdlbmVyYXRpb24KKyMKKyMgQ09ORklHX0NSWVBUT19BTlNJX0NQUk5HIGlzIG5vdCBzZXQKK0NPTkZJR19DUllQVE9fSFc9eQogCiAjCiAjIExpYnJhcnkgcm91dGluZXMKQEAgLTEyNjYsNiArMTQzMCw3IEBACiBDT05GSUdfQklUUkVWRVJTRT15CiBDT05GSUdfQ1JDX0NDSVRUPW0KICMgQ09ORklHX0NSQzE2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQ19UMTBESUYgaXMgbm90IHNldAogIyBDT05GSUdfQ1JDX0lUVV9UIGlzIG5vdCBzZXQKIENPTkZJR19DUkMzMj15CiAjIENPTkZJR19DUkM3IGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vY29uZmlncy9CRjUzOC1FWktJVF9kZWZjb25maWcgYi9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvQkY1MzgtRVpLSVRfZGVmY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkMTU5MzQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvQkY1MzgtRVpLSVRfZGVmY29uZmlnCkBAIC0wLDAgKzEsMTM2OCBAQAorIworIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjI4LXJjMgorIworIyBDT05GSUdfTU1VIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZQVSBpcyBub3Qgc2V0CitDT05GSUdfUldTRU1fR0VORVJJQ19TUElOTE9DSz15CisjIENPTkZJR19SV1NFTV9YQ0hHQUREX0FMR09SSVRITSBpcyBub3Qgc2V0CitDT05GSUdfQkxBQ0tGSU49eQorQ09ORklHX1pPTkVfRE1BPXkKK0NPTkZJR19HRU5FUklDX0ZJTkRfTkVYVF9CSVQ9eQorQ09ORklHX0dFTkVSSUNfSFdFSUdIVD15CitDT05GSUdfR0VORVJJQ19IQVJESVJRUz15CitDT05GSUdfR0VORVJJQ19JUlFfUFJPQkU9eQorQ09ORklHX0dFTkVSSUNfR1BJTz15CitDT05GSUdfRk9SQ0VfTUFYX1pPTkVPUkRFUj0xNAorQ09ORklHX0dFTkVSSUNfQ0FMSUJSQVRFX0RFTEFZPXkKK0NPTkZJR19ERUZDT05GSUdfTElTVD0iL2xpYi9tb2R1bGVzLyRVTkFNRV9SRUxFQVNFLy5jb25maWciCisKKyMKKyMgR2VuZXJhbCBzZXR1cAorIworQ09ORklHX0VYUEVSSU1FTlRBTD15CitDT05GSUdfQlJPS0VOX09OX1NNUD15CitDT05GSUdfSU5JVF9FTlZfQVJHX0xJTUlUPTMyCitDT05GSUdfTE9DQUxWRVJTSU9OPSIiCitDT05GSUdfTE9DQUxWRVJTSU9OX0FVVE89eQorQ09ORklHX1NZU1ZJUEM9eQorQ09ORklHX1NZU1ZJUENfU1lTQ1RMPXkKKyMgQ09ORklHX1BPU0lYX01RVUVVRSBpcyBub3Qgc2V0CisjIENPTkZJR19CU0RfUFJPQ0VTU19BQ0NUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RBU0tTVEFUUyBpcyBub3Qgc2V0CisjIENPTkZJR19BVURJVCBpcyBub3Qgc2V0CitDT05GSUdfSUtDT05GSUc9eQorQ09ORklHX0lLQ09ORklHX1BST0M9eQorQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKKyMgQ09ORklHX0NHUk9VUFMgaXMgbm90IHNldAorIyBDT05GSUdfR1JPVVBfU0NIRUQgaXMgbm90IHNldAorIyBDT05GSUdfU1lTRlNfREVQUkVDQVRFRF9WMiBpcyBub3Qgc2V0CisjIENPTkZJR19SRUxBWSBpcyBub3Qgc2V0CisjIENPTkZJR19OQU1FU1BBQ0VTIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX0lOSVRSRD15CitDT05GSUdfSU5JVFJBTUZTX1NPVVJDRT0iIgorIyBDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkUgaXMgbm90IHNldAorQ09ORklHX1NZU0NUTD15CitDT05GSUdfRU1CRURERUQ9eQorQ09ORklHX1VJRDE2PXkKK0NPTkZJR19TWVNDVExfU1lTQ0FMTD15CitDT05GSUdfS0FMTFNZTVM9eQorIyBDT05GSUdfS0FMTFNZTVNfQUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tBTExTWU1TX0VYVFJBX1BBU1MgaXMgbm90IHNldAorQ09ORklHX0hPVFBMVUc9eQorQ09ORklHX1BSSU5USz15CitDT05GSUdfQlVHPXkKKyMgQ09ORklHX0VMRl9DT1JFIGlzIG5vdCBzZXQKK0NPTkZJR19DT01QQVRfQlJLPXkKK0NPTkZJR19CQVNFX0ZVTEw9eQorQ09ORklHX0ZVVEVYPXkKK0NPTkZJR19BTk9OX0lOT0RFUz15CitDT05GSUdfRVBPTEw9eQorQ09ORklHX1NJR05BTEZEPXkKK0NPTkZJR19USU1FUkZEPXkKK0NPTkZJR19FVkVOVEZEPXkKK0NPTkZJR19BSU89eQorQ09ORklHX1ZNX0VWRU5UX0NPVU5URVJTPXkKK0NPTkZJR19TTEFCPXkKKyMgQ09ORklHX1NMVUIgaXMgbm90IHNldAorIyBDT05GSUdfU0xPQiBpcyBub3Qgc2V0CisjIENPTkZJR19QUk9GSUxJTkcgaXMgbm90IHNldAorIyBDT05GSUdfTUFSS0VSUyBpcyBub3Qgc2V0CitDT05GSUdfSEFWRV9PUFJPRklMRT15CisjIENPTkZJR19IQVZFX0dFTkVSSUNfRE1BX0NPSEVSRU5UIGlzIG5vdCBzZXQKK0NPTkZJR19TTEFCSU5GTz15CitDT05GSUdfUlRfTVVURVhFUz15CitDT05GSUdfVElOWV9TSE1FTT15CitDT05GSUdfQkFTRV9TTUFMTD0wCitDT05GSUdfTU9EVUxFUz15CisjIENPTkZJR19NT0RVTEVfRk9SQ0VfTE9BRCBpcyBub3Qgc2V0CitDT05GSUdfTU9EVUxFX1VOTE9BRD15CisjIENPTkZJR19NT0RVTEVfRk9SQ0VfVU5MT0FEIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PRFZFUlNJT05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PRFVMRV9TUkNWRVJTSU9OX0FMTCBpcyBub3Qgc2V0CitDT05GSUdfS01PRD15CitDT05GSUdfQkxPQ0s9eQorIyBDT05GSUdfTEJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSU9fVFJBQ0UgaXMgbm90IHNldAorIyBDT05GSUdfTFNGIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfQlNHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSU5URUdSSVRZIGlzIG5vdCBzZXQKKworIworIyBJTyBTY2hlZHVsZXJzCisjCitDT05GSUdfSU9TQ0hFRF9OT09QPXkKK0NPTkZJR19JT1NDSEVEX0FTPXkKKyMgQ09ORklHX0lPU0NIRURfREVBRExJTkUgaXMgbm90IHNldAorQ09ORklHX0lPU0NIRURfQ0ZRPXkKK0NPTkZJR19ERUZBVUxUX0FTPXkKKyMgQ09ORklHX0RFRkFVTFRfREVBRExJTkUgaXMgbm90IHNldAorIyBDT05GSUdfREVGQVVMVF9DRlEgaXMgbm90IHNldAorIyBDT05GSUdfREVGQVVMVF9OT09QIGlzIG5vdCBzZXQKK0NPTkZJR19ERUZBVUxUX0lPU0NIRUQ9ImFudGljaXBhdG9yeSIKK0NPTkZJR19DTEFTU0lDX1JDVT15CisjIENPTkZJR19QUkVFTVBUX05PTkUgaXMgbm90IHNldAorQ09ORklHX1BSRUVNUFRfVk9MVU5UQVJZPXkKKyMgQ09ORklHX1BSRUVNUFQgaXMgbm90IHNldAorIyBDT05GSUdfRlJFRVpFUiBpcyBub3Qgc2V0CisKKyMKKyMgQmxhY2tmaW4gUHJvY2Vzc29yIE9wdGlvbnMKKyMKKworIworIyBQcm9jZXNzb3IgYW5kIEJvYXJkIFNldHRpbmdzCisjCisjIENPTkZJR19CRjUxMiBpcyBub3Qgc2V0CisjIENPTkZJR19CRjUxNCBpcyBub3Qgc2V0CisjIENPTkZJR19CRjUxNiBpcyBub3Qgc2V0CisjIENPTkZJR19CRjUxOCBpcyBub3Qgc2V0CisjIENPTkZJR19CRjUyMiBpcyBub3Qgc2V0CisjIENPTkZJR19CRjUyMyBpcyBub3Qgc2V0CisjIENPTkZJR19CRjUyNCBpcyBub3Qgc2V0CisjIENPTkZJR19CRjUyNSBpcyBub3Qgc2V0CisjIENPTkZJR19CRjUyNiBpcyBub3Qgc2V0CisjIENPTkZJR19CRjUyNyBpcyBub3Qgc2V0CisjIENPTkZJR19CRjUzMSBpcyBub3Qgc2V0CisjIENPTkZJR19CRjUzMiBpcyBub3Qgc2V0CisjIENPTkZJR19CRjUzMyBpcyBub3Qgc2V0CisjIENPTkZJR19CRjUzNCBpcyBub3Qgc2V0CisjIENPTkZJR19CRjUzNiBpcyBub3Qgc2V0CisjIENPTkZJR19CRjUzNyBpcyBub3Qgc2V0CitDT05GSUdfQkY1Mzg9eQorIyBDT05GSUdfQkY1MzkgaXMgbm90IHNldAorIyBDT05GSUdfQkY1NDIgaXMgbm90IHNldAorIyBDT05GSUdfQkY1NDQgaXMgbm90IHNldAorIyBDT05GSUdfQkY1NDcgaXMgbm90IHNldAorIyBDT05GSUdfQkY1NDggaXMgbm90IHNldAorIyBDT05GSUdfQkY1NDkgaXMgbm90IHNldAorIyBDT05GSUdfQkY1NjEgaXMgbm90IHNldAorQ09ORklHX0JGX1JFVl9NSU49NAorQ09ORklHX0JGX1JFVl9NQVg9NQorIyBDT05GSUdfQkZfUkVWXzBfMCBpcyBub3Qgc2V0CisjIENPTkZJR19CRl9SRVZfMF8xIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGX1JFVl8wXzIgaXMgbm90IHNldAorIyBDT05GSUdfQkZfUkVWXzBfMyBpcyBub3Qgc2V0CitDT05GSUdfQkZfUkVWXzBfND15CisjIENPTkZJR19CRl9SRVZfMF81IGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGX1JFVl8wXzYgaXMgbm90IHNldAorIyBDT05GSUdfQkZfUkVWX0FOWSBpcyBub3Qgc2V0CisjIENPTkZJR19CRl9SRVZfTk9ORSBpcyBub3Qgc2V0CitDT05GSUdfTUVNX01UNDhMQzMyTThBMl83NT15CitDT05GSUdfSVJRX1BMTF9XQUtFVVA9NworQ09ORklHX0lSUV9ETUEwX0VSUk9SPTcKK0NPTkZJR19JUlFfUFBJX0VSUk9SPTcKK0NPTkZJR19JUlFfU1BPUlQwX0VSUk9SPTcKK0NPTkZJR19JUlFfU1BPUlQxX0VSUk9SPTcKK0NPTkZJR19JUlFfVUFSVDBfRVJST1I9NworQ09ORklHX0lSUV9VQVJUMV9FUlJPUj03CitDT05GSUdfSVJRX1JUQz04CitDT05GSUdfSVJRX1BQST04CitDT05GSUdfSVJRX1NQT1JUMF9SWD05CitDT05GSUdfSVJRX1NQT1JUMF9UWD05CitDT05GSUdfSVJRX1NQT1JUMV9SWD05CitDT05GSUdfSVJRX1NQT1JUMV9UWD05CitDT05GSUdfSVJRX1NQSTA9MTAKK0NPTkZJR19JUlFfVUFSVDBfUlg9MTAKK0NPTkZJR19JUlFfVUFSVDBfVFg9MTAKK0NPTkZJR19JUlFfVUFSVDFfUlg9MTAKK0NPTkZJR19JUlFfVUFSVDFfVFg9MTAKK0NPTkZJR19JUlFfVElNRVIwPTEyCitDT05GSUdfSVJRX1RJTUVSMT0xMgorQ09ORklHX0lSUV9USU1FUjI9MTIKK0NPTkZJR19JUlFfV0FUQ0g9MTMKK0NPTkZJR19JUlFfUE9SVEZfSU5UQT0xMgorQ09ORklHX0lSUV9QT1JURl9JTlRCPTEyCitDT05GSUdfSVJRX1NQSTBfRVJST1I9NworQ09ORklHX0lSUV9TUEkxX0VSUk9SPTcKK0NPTkZJR19JUlFfRE1BMV9FUlJPUj03CitDT05GSUdfSVJRX0NBTl9SWD0xMQorQ09ORklHX0lSUV9DQU5fVFg9MTEKK0NPTkZJR19CRklONTM4X0VaS0lUPXkKKworIworIyBCRjUzOCBTcGVjaWZpYyBDb25maWd1cmF0aW9uCisjCisKKyMKKyMgSW50ZXJydXB0IFByaW9yaXR5IEFzc2lnbm1lbnQKKyMKKworIworIyBQcmlvcml0eQorIworQ09ORklHX0lSUV9NRU0wX0RNQTA9MTMKK0NPTkZJR19JUlFfTUVNMF9ETUExPTEzCitDT05GSUdfSVJRX1NQT1JUMl9FUlJPUj03CitDT05GSUdfSVJRX1NQT1JUM19FUlJPUj03CitDT05GSUdfSVJRX1NQSTJfRVJST1I9NworQ09ORklHX0lSUV9VQVJUMl9FUlJPUj03CitDT05GSUdfSVJRX0NBTl9FUlJPUj03CitDT05GSUdfSVJRX1NQT1JUMl9SWD05CitDT05GSUdfSVJRX1NQT1JUMl9UWD05CitDT05GSUdfSVJRX1NQT1JUM19SWD05CitDT05GSUdfSVJRX1NQT1JUM19UWD05CitDT05GSUdfSVJRX1NQSTE9MTAKK0NPTkZJR19JUlFfU1BJMj0xMAorQ09ORklHX0lSUV9VQVJUMl9SWD0xMAorQ09ORklHX0lSUV9VQVJUMl9UWD0xMAorQ09ORklHX0lSUV9UV0kwPTExCitDT05GSUdfSVJRX1RXSTE9MTEKK0NPTkZJR19JUlFfTUVNMV9ETUEwPTEzCitDT05GSUdfSVJRX01FTTFfRE1BMT0xMworCisjCisjIEJvYXJkIGN1c3RvbWl6YXRpb25zCisjCisjIENPTkZJR19DTURMSU5FX0JPT0wgaXMgbm90IHNldAorQ09ORklHX0JPT1RfTE9BRD0weDEwMDAKKworIworIyBDbG9jay9QTEwgU2V0dXAKKyMKK0NPTkZJR19DTEtJTl9IWj0yNTAwMDAwMAorIyBDT05GSUdfQkZJTl9LRVJORUxfQ0xPQ0sgaXMgbm90IHNldAorQ09ORklHX01BWF9WQ09fSFo9NTMzMzMzMzMzCitDT05GSUdfTUlOX1ZDT19IWj01MDAwMDAwMAorQ09ORklHX01BWF9TQ0xLX0haPTEzMzMzMzMzMworQ09ORklHX01JTl9TQ0xLX0haPTI3MDAwMDAwCisKKyMKKyMgS2VybmVsIFRpbWVyL1NjaGVkdWxlcgorIworIyBDT05GSUdfSFpfMTAwIGlzIG5vdCBzZXQKK0NPTkZJR19IWl8yNTA9eQorIyBDT05GSUdfSFpfMzAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0haXzEwMDAgaXMgbm90IHNldAorQ09ORklHX0haPTI1MAorQ09ORklHX1NDSEVEX0hSVElDSz15CitDT05GSUdfR0VORVJJQ19USU1FPXkKK0NPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTPXkKKyMgQ09ORklHX0NZQ0xFU19DTE9DS1NPVVJDRSBpcyBub3Qgc2V0CitDT05GSUdfVElDS19PTkVTSE9UPXkKKyMgQ09ORklHX05PX0haIGlzIG5vdCBzZXQKK0NPTkZJR19ISUdIX1JFU19USU1FUlM9eQorQ09ORklHX0dFTkVSSUNfQ0xPQ0tFVkVOVFNfQlVJTEQ9eQorCisjCisjIE1pc2MKKyMKK0NPTkZJR19CRklOX1NDUkFUQ0hfUkVHX1JFVE49eQorIyBDT05GSUdfQkZJTl9TQ1JBVENIX1JFR19SRVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGSU5fU0NSQVRDSF9SRUdfQ1lDTEVTIGlzIG5vdCBzZXQKKworIworIyBCbGFja2ZpbiBLZXJuZWwgT3B0aW1pemF0aW9ucworIworCisjCisjIE1lbW9yeSBPcHRpbWl6YXRpb25zCisjCitDT05GSUdfSV9FTlRSWV9MMT15CitDT05GSUdfRVhDUFRfSVJRX1NZU0NfTDE9eQorQ09ORklHX0RPX0lSUV9MMT15CitDT05GSUdfQ09SRV9USU1FUl9JUlFfTDE9eQorQ09ORklHX0lETEVfTDE9eQorQ09ORklHX1NDSEVEVUxFX0wxPXkKK0NPTkZJR19BUklUSE1FVElDX09QU19MMT15CitDT05GSUdfQUNDRVNTX09LX0wxPXkKK0NPTkZJR19NRU1TRVRfTDE9eQorQ09ORklHX01FTUNQWV9MMT15CitDT05GSUdfU1lTX0JGSU5fU1BJTkxPQ0tfTDE9eQorIyBDT05GSUdfSVBfQ0hFQ0tTVU1fTDEgaXMgbm90IHNldAorQ09ORklHX0NBQ0hFTElORV9BTElHTkVEX0wxPXkKKyMgQ09ORklHX1NZU0NBTExfVEFCX0wxIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQTEJfU1dJVENIX1RBQl9MMSBpcyBub3Qgc2V0CitDT05GSUdfQVBQX1NUQUNLX0wxPXkKKworIworIyBTcGVlZCBPcHRpbWl6YXRpb25zCisjCitDT05GSUdfQkZJTl9JTlNfTE9XT1ZFUkhFQUQ9eQorQ09ORklHX1JBTUtFUk5FTD15CisjIENPTkZJR19ST01LRVJORUwgaXMgbm90IHNldAorQ09ORklHX1NFTEVDVF9NRU1PUllfTU9ERUw9eQorQ09ORklHX0ZMQVRNRU1fTUFOVUFMPXkKKyMgQ09ORklHX0RJU0NPTlRJR01FTV9NQU5VQUwgaXMgbm90IHNldAorIyBDT05GSUdfU1BBUlNFTUVNX01BTlVBTCBpcyBub3Qgc2V0CitDT05GSUdfRkxBVE1FTT15CitDT05GSUdfRkxBVF9OT0RFX01FTV9NQVA9eQorQ09ORklHX1BBR0VGTEFHU19FWFRFTkRFRD15CitDT05GSUdfU1BMSVRfUFRMT0NLX0NQVVM9NAorIyBDT05GSUdfUkVTT1VSQ0VTXzY0QklUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BIWVNfQUREUl9UXzY0QklUIGlzIG5vdCBzZXQKK0NPTkZJR19aT05FX0RNQV9GTEFHPTEKK0NPTkZJR19WSVJUX1RPX0JVUz15CitDT05GSUdfQkZJTl9HUFRJTUVSUz15CisjIENPTkZJR19ETUFfVU5DQUNIRURfNE0gaXMgbm90IHNldAorIyBDT05GSUdfRE1BX1VOQ0FDSEVEXzJNIGlzIG5vdCBzZXQKK0NPTkZJR19ETUFfVU5DQUNIRURfMU09eQorIyBDT05GSUdfRE1BX1VOQ0FDSEVEX05PTkUgaXMgbm90IHNldAorCisjCisjIENhY2hlIFN1cHBvcnQKKyMKK0NPTkZJR19CRklOX0lDQUNIRT15CitDT05GSUdfQkZJTl9EQ0FDSEU9eQorIyBDT05GSUdfQkZJTl9EQ0FDSEVfQkFOS0EgaXMgbm90IHNldAorIyBDT05GSUdfQkZJTl9JQ0FDSEVfTE9DSyBpcyBub3Qgc2V0CisjIENPTkZJR19CRklOX1dCIGlzIG5vdCBzZXQKK0NPTkZJR19CRklOX1dUPXkKKyMgQ09ORklHX01QVSBpcyBub3Qgc2V0CisKKyMKKyMgQXN5bmNob25vdXMgTWVtb3J5IENvbmZpZ3VyYXRpb24KKyMKKworIworIyBFQklVX0FNR0NUTCBHbG9iYWwgQ29udHJvbAorIworQ09ORklHX0NfQU1DS0VOPXkKK0NPTkZJR19DX0NEUFJJTz15CisjIENPTkZJR19DX0FNQkVOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NfQU1CRU5fQjAgaXMgbm90IHNldAorIyBDT05GSUdfQ19BTUJFTl9CMF9CMSBpcyBub3Qgc2V0CisjIENPTkZJR19DX0FNQkVOX0IwX0IxX0IyIGlzIG5vdCBzZXQKK0NPTkZJR19DX0FNQkVOX0FMTD15CisKKyMKKyMgRUJJVV9BTUJDVEwgQ29udHJvbAorIworQ09ORklHX0JBTktfMD0weDdCQjAKK0NPTkZJR19CQU5LXzE9MHg3QkIwCitDT05GSUdfQkFOS18yPTB4N0JCMAorQ09ORklHX0JBTktfMz0weDk5QjIKKworIworIyBCdXMgb3B0aW9ucyAoUENJLCBQQ01DSUEsIEVJU0EsIE1DQSwgSVNBKQorIworIyBDT05GSUdfQVJDSF9TVVBQT1JUU19NU0kgaXMgbm90IHNldAorIyBDT05GSUdfUENDQVJEIGlzIG5vdCBzZXQKKworIworIyBFeGVjdXRhYmxlIGZpbGUgZm9ybWF0cworIworQ09ORklHX0JJTkZNVF9FTEZfRkRQSUM9eQorQ09ORklHX0JJTkZNVF9GTEFUPXkKK0NPTkZJR19CSU5GTVRfWkZMQVQ9eQorIyBDT05GSUdfQklORk1UX1NIQVJFRF9GTEFUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBVkVfQU9VVCBpcyBub3Qgc2V0CisjIENPTkZJR19CSU5GTVRfTUlTQyBpcyBub3Qgc2V0CisKKyMKKyMgUG93ZXIgbWFuYWdlbWVudCBvcHRpb25zCisjCisjIENPTkZJR19QTSBpcyBub3Qgc2V0CitDT05GSUdfQVJDSF9TVVNQRU5EX1BPU1NJQkxFPXkKKyMgQ09ORklHX1BNX1dBS0VVUF9CWV9HUElPIGlzIG5vdCBzZXQKKworIworIyBDUFUgRnJlcXVlbmN5IHNjYWxpbmcKKyMKKyMgQ09ORklHX0NQVV9GUkVRIGlzIG5vdCBzZXQKK0NPTkZJR19ORVQ9eQorCisjCisjIE5ldHdvcmtpbmcgb3B0aW9ucworIworQ09ORklHX1BBQ0tFVD15CisjIENPTkZJR19QQUNLRVRfTU1BUCBpcyBub3Qgc2V0CitDT05GSUdfVU5JWD15CitDT05GSUdfWEZSTT15CisjIENPTkZJR19YRlJNX1VTRVIgaXMgbm90IHNldAorIyBDT05GSUdfWEZSTV9TVUJfUE9MSUNZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1hGUk1fTUlHUkFURSBpcyBub3Qgc2V0CisjIENPTkZJR19YRlJNX1NUQVRJU1RJQ1MgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0tFWSBpcyBub3Qgc2V0CitDT05GSUdfSU5FVD15CisjIENPTkZJR19JUF9NVUxUSUNBU1QgaXMgbm90IHNldAorIyBDT05GSUdfSVBfQURWQU5DRURfUk9VVEVSIGlzIG5vdCBzZXQKK0NPTkZJR19JUF9GSUJfSEFTSD15CitDT05GSUdfSVBfUE5QPXkKKyMgQ09ORklHX0lQX1BOUF9ESENQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX1BOUF9CT09UUCBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9QTlBfUkFSUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfSVBJUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfSVBHUkUgaXMgbm90IHNldAorIyBDT05GSUdfQVJQRCBpcyBub3Qgc2V0CitDT05GSUdfU1lOX0NPT0tJRVM9eQorIyBDT05GSUdfSU5FVF9BSCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0VTUCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0lQQ09NUCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX1hGUk1fVFVOTkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfVFVOTkVMIGlzIG5vdCBzZXQKK0NPTkZJR19JTkVUX1hGUk1fTU9ERV9UUkFOU1BPUlQ9eQorQ09ORklHX0lORVRfWEZSTV9NT0RFX1RVTk5FTD15CitDT05GSUdfSU5FVF9YRlJNX01PREVfQkVFVD15CisjIENPTkZJR19JTkVUX0xSTyBpcyBub3Qgc2V0CitDT05GSUdfSU5FVF9ESUFHPXkKK0NPTkZJR19JTkVUX1RDUF9ESUFHPXkKKyMgQ09ORklHX1RDUF9DT05HX0FEVkFOQ0VEIGlzIG5vdCBzZXQKK0NPTkZJR19UQ1BfQ09OR19DVUJJQz15CitDT05GSUdfREVGQVVMVF9UQ1BfQ09ORz0iY3ViaWMiCisjIENPTkZJR19UQ1BfTUQ1U0lHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQVjYgaXMgbm90IHNldAorIyBDT05GSUdfTkVUTEFCRUwgaXMgbm90IHNldAorIyBDT05GSUdfTkVUV09SS19TRUNNQVJLIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVEZJTFRFUiBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9EQ0NQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX1NDVFAgaXMgbm90IHNldAorIyBDT05GSUdfVElQQyBpcyBub3Qgc2V0CisjIENPTkZJR19BVE0gaXMgbm90IHNldAorIyBDT05GSUdfQlJJREdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9EU0EgaXMgbm90IHNldAorIyBDT05GSUdfVkxBTl84MDIxUSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUNORVQgaXMgbm90IHNldAorIyBDT05GSUdfTExDMiBpcyBub3Qgc2V0CisjIENPTkZJR19JUFggaXMgbm90IHNldAorIyBDT05GSUdfQVRBTEsgaXMgbm90IHNldAorIyBDT05GSUdfWDI1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0xBUEIgaXMgbm90IHNldAorIyBDT05GSUdfRUNPTkVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dBTl9ST1VURVIgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1NDSEVEIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JrIHRlc3RpbmcKKyMKKyMgQ09ORklHX05FVF9QS1RHRU4gaXMgbm90IHNldAorIyBDT05GSUdfSEFNUkFESU8gaXMgbm90IHNldAorIyBDT05GSUdfQ0FOIGlzIG5vdCBzZXQKK0NPTkZJR19JUkRBPW0KKworIworIyBJckRBIHByb3RvY29scworIworQ09ORklHX0lSTEFOPW0KK0NPTkZJR19JUkNPTU09bQorIyBDT05GSUdfSVJEQV9VTFRSQSBpcyBub3Qgc2V0CisKKyMKKyMgSXJEQSBvcHRpb25zCisjCitDT05GSUdfSVJEQV9DQUNIRV9MQVNUX0xTQVA9eQorIyBDT05GSUdfSVJEQV9GQVNUX1JSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lSREFfREVCVUcgaXMgbm90IHNldAorCisjCisjIEluZnJhcmVkLXBvcnQgZGV2aWNlIGRyaXZlcnMKKyMKKworIworIyBTSVIgZGV2aWNlIGRyaXZlcnMKKyMKK0NPTkZJR19JUlRUWV9TSVI9bQorQ09ORklHX0JGSU5fU0lSPW0KK0NPTkZJR19TSVJfQkZJTl9ETUE9eQorIyBDT05GSUdfU0lSX0JGSU5fUElPIGlzIG5vdCBzZXQKKworIworIyBEb25nbGUgc3VwcG9ydAorIworIyBDT05GSUdfRE9OR0xFIGlzIG5vdCBzZXQKKworIworIyBGSVIgZGV2aWNlIGRyaXZlcnMKKyMKKyMgQ09ORklHX0JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGX1JYUlBDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BIT05FVCBpcyBub3Qgc2V0CitDT05GSUdfV0lSRUxFU1M9eQorIyBDT05GSUdfQ0ZHODAyMTEgaXMgbm90IHNldAorQ09ORklHX1dJUkVMRVNTX09MRF9SRUdVTEFUT1JZPXkKKyMgQ09ORklHX1dJUkVMRVNTX0VYVCBpcyBub3Qgc2V0CisjIENPTkZJR19NQUM4MDIxMSBpcyBub3Qgc2V0CisjIENPTkZJR19JRUVFODAyMTEgaXMgbm90IHNldAorIyBDT05GSUdfUkZLSUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF85UCBpcyBub3Qgc2V0CisKKyMKKyMgRGV2aWNlIERyaXZlcnMKKyMKKworIworIyBHZW5lcmljIERyaXZlciBPcHRpb25zCisjCitDT05GSUdfVUVWRU5UX0hFTFBFUl9QQVRIPSIvc2Jpbi9ob3RwbHVnIgorQ09ORklHX1NUQU5EQUxPTkU9eQorQ09ORklHX1BSRVZFTlRfRklSTVdBUkVfQlVJTEQ9eQorIyBDT05GSUdfRldfTE9BREVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0RSSVZFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19ERVZSRVMgaXMgbm90IHNldAorIyBDT05GSUdfU1lTX0hZUEVSVklTT1IgaXMgbm90IHNldAorIyBDT05GSUdfQ09OTkVDVE9SIGlzIG5vdCBzZXQKK0NPTkZJR19NVEQ9eQorIyBDT05GSUdfTVREX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DT05DQVQgaXMgbm90IHNldAorQ09ORklHX01URF9QQVJUSVRJT05TPXkKKyMgQ09ORklHX01URF9SRURCT09UX1BBUlRTIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ01ETElORV9QQVJUUz15CisjIENPTkZJR19NVERfQVI3X1BBUlRTIGlzIG5vdCBzZXQKKworIworIyBVc2VyIE1vZHVsZXMgQW5kIFRyYW5zbGF0aW9uIExheWVycworIworQ09ORklHX01URF9DSEFSPW0KK0NPTkZJR19NVERfQkxLREVWUz15CitDT05GSUdfTVREX0JMT0NLPXkKKyMgQ09ORklHX0ZUTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORlRMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORlRMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JGRF9GVEwgaXMgbm90IHNldAorIyBDT05GSUdfU1NGREMgaXMgbm90IHNldAorIyBDT05GSUdfTVREX09PUFMgaXMgbm90IHNldAorCisjCisjIFJBTS9ST00vRmxhc2ggY2hpcCBkcml2ZXJzCisjCitDT05GSUdfTVREX0NGST1tCisjIENPTkZJR19NVERfSkVERUNQUk9CRSBpcyBub3Qgc2V0CitDT05GSUdfTVREX0dFTl9QUk9CRT1tCisjIENPTkZJR19NVERfQ0ZJX0FEVl9PUFRJT05TIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMT15CitDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzI9eQorQ09ORklHX01URF9NQVBfQkFOS19XSURUSF80PXkKKyMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF84IGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8xNiBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMzIgaXMgbm90IHNldAorQ09ORklHX01URF9DRklfSTE9eQorQ09ORklHX01URF9DRklfSTI9eQorIyBDT05GSUdfTVREX0NGSV9JNCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ0ZJX0k4IGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DRklfSU5URUxFWFQgaXMgbm90IHNldAorQ09ORklHX01URF9DRklfQU1EU1REPW0KKyMgQ09ORklHX01URF9DRklfU1RBQSBpcyBub3Qgc2V0CitDT05GSUdfTVREX0NGSV9VVElMPW0KK0NPTkZJR19NVERfUkFNPXkKK0NPTkZJR19NVERfUk9NPW0KKyMgQ09ORklHX01URF9BQlNFTlQgaXMgbm90IHNldAorCisjCisjIE1hcHBpbmcgZHJpdmVycyBmb3IgY2hpcCBhY2Nlc3MKKyMKKyMgQ09ORklHX01URF9DT01QTEVYX01BUFBJTkdTIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfUEhZU01BUD1tCitDT05GSUdfTVREX1BIWVNNQVBfU1RBUlQ9MHgyMDAwMDAwMAorQ09ORklHX01URF9QSFlTTUFQX0xFTj0weDAKK0NPTkZJR19NVERfUEhZU01BUF9CQU5LV0lEVEg9MgorIyBDT05GSUdfTVREX1VDTElOVVggaXMgbm90IHNldAorIyBDT05GSUdfTVREX1BMQVRSQU0gaXMgbm90IHNldAorCisjCisjIFNlbGYtY29udGFpbmVkIE1URCBkZXZpY2UgZHJpdmVycworIworIyBDT05GSUdfTVREX0RBVEFGTEFTSCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTTI1UDgwIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9TTFJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfUEhSQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX01URFJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQkxPQ0syTVREIGlzIG5vdCBzZXQKKworIworIyBEaXNrLU9uLUNoaXAgRGV2aWNlIERyaXZlcnMKKyMKKyMgQ09ORklHX01URF9ET0MyMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9ET0MyMDAxIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9ET0MyMDAxUExVUyBpcyBub3Qgc2V0CitDT05GSUdfTVREX05BTkQ9bQorIyBDT05GSUdfTVREX05BTkRfVkVSSUZZX1dSSVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9OQU5EX0VDQ19TTUMgaXMgbm90IHNldAorIyBDT05GSUdfTVREX05BTkRfTVVTRVVNX0lEUyBpcyBub3Qgc2V0CitDT05GSUdfTVREX05BTkRfQkZJTj1tCitDT05GSUdfQkZJTl9OQU5EX0JBU0U9MHgyMDIxMjAwMAorQ09ORklHX0JGSU5fTkFORF9DTEU9MgorQ09ORklHX0JGSU5fTkFORF9BTEU9MQorQ09ORklHX0JGSU5fTkFORF9SRUFEWT0zCitDT05GSUdfTVREX05BTkRfSURTPW0KKyMgQ09ORklHX01URF9OQU5EX0RJU0tPTkNISVAgaXMgbm90IHNldAorIyBDT05GSUdfTVREX05BTkRfTkFORFNJTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTkFORF9QTEFURk9STSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfT05FTkFORCBpcyBub3Qgc2V0CisKKyMKKyMgVUJJIC0gVW5zb3J0ZWQgYmxvY2sgaW1hZ2VzCisjCisjIENPTkZJR19NVERfVUJJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBUlBPUlQgaXMgbm90IHNldAorQ09ORklHX0JMS19ERVY9eQorIyBDT05GSUdfQkxLX0RFVl9DT1dfQ09NTU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfTE9PUCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX05CRCBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9SQU09eQorQ09ORklHX0JMS19ERVZfUkFNX0NPVU5UPTE2CitDT05GSUdfQkxLX0RFVl9SQU1fU0laRT00MDk2CisjIENPTkZJR19CTEtfREVWX1hJUCBpcyBub3Qgc2V0CisjIENPTkZJR19DRFJPTV9QS1RDRFZEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQV9PVkVSX0VUSCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0hEIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JU0NfREVWSUNFUyBpcyBub3Qgc2V0CitDT05GSUdfSEFWRV9JREU9eQorIyBDT05GSUdfSURFIGlzIG5vdCBzZXQKKworIworIyBTQ1NJIGRldmljZSBzdXBwb3J0CisjCisjIENPTkZJR19SQUlEX0FUVFJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0kgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9ETUEgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9ORVRMSU5LIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQSBpcyBub3Qgc2V0CisjIENPTkZJR19NRCBpcyBub3Qgc2V0CitDT05GSUdfTkVUREVWSUNFUz15CisjIENPTkZJR19EVU1NWSBpcyBub3Qgc2V0CisjIENPTkZJR19CT05ESU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQ1ZMQU4gaXMgbm90IHNldAorIyBDT05GSUdfRVFVQUxJWkVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RVTiBpcyBub3Qgc2V0CisjIENPTkZJR19WRVRIIGlzIG5vdCBzZXQKK0NPTkZJR19QSFlMSUI9eQorCisjCisjIE1JSSBQSFkgZGV2aWNlIGRyaXZlcnMKKyMKKyMgQ09ORklHX01BUlZFTExfUEhZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RBVklDT01fUEhZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1FTRU1JX1BIWSBpcyBub3Qgc2V0CisjIENPTkZJR19MWFRfUEhZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NJQ0FEQV9QSFkgaXMgbm90IHNldAorIyBDT05GSUdfVklURVNTRV9QSFkgaXMgbm90IHNldAorQ09ORklHX1NNU0NfUEhZPXkKKyMgQ09ORklHX0JST0FEQ09NX1BIWSBpcyBub3Qgc2V0CisjIENPTkZJR19JQ1BMVVNfUEhZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFQUxURUtfUEhZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZJWEVEX1BIWSBpcyBub3Qgc2V0CisjIENPTkZJR19NRElPX0JJVEJBTkcgaXMgbm90IHNldAorQ09ORklHX05FVF9FVEhFUk5FVD15CitDT05GSUdfTUlJPXkKK0NPTkZJR19TTUM5MVg9eQorIyBDT05GSUdfU01TQzkxMVggaXMgbm90IHNldAorIyBDT05GSUdfRE05MDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VOQzI4SjYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lCTV9ORVdfRU1BQ19aTUlJIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lCTV9ORVdfRU1BQ19SR01JSSBpcyBub3Qgc2V0CisjIENPTkZJR19JQk1fTkVXX0VNQUNfVEFIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lCTV9ORVdfRU1BQ19FTUFDNCBpcyBub3Qgc2V0CisjIENPTkZJR19JQk1fTkVXX0VNQUNfTk9fRkxPV19DVFJMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lCTV9ORVdfRU1BQ19NQUxfQ0xSX0lDSU5UU1RBVCBpcyBub3Qgc2V0CisjIENPTkZJR19JQk1fTkVXX0VNQUNfTUFMX0NPTU1PTl9FUlIgaXMgbm90IHNldAorIyBDT05GSUdfTkVUREVWXzEwMDAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUREVWXzEwMDAwIGlzIG5vdCBzZXQKKworIworIyBXaXJlbGVzcyBMQU4KKyMKKyMgQ09ORklHX1dMQU5fUFJFODAyMTEgaXMgbm90IHNldAorIyBDT05GSUdfV0xBTl84MDIxMSBpcyBub3Qgc2V0CisjIENPTkZJR19JV0xXSUZJX0xFRFMgaXMgbm90IHNldAorIyBDT05GSUdfV0FOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQUCBpcyBub3Qgc2V0CisjIENPTkZJR19TTElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVENPTlNPTEUgaXMgbm90IHNldAorIyBDT05GSUdfTkVUUE9MTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lTRE4gaXMgbm90IHNldAorIyBDT05GSUdfUEhPTkUgaXMgbm90IHNldAorCisjCisjIElucHV0IGRldmljZSBzdXBwb3J0CisjCitDT05GSUdfSU5QVVQ9eQorIyBDT05GSUdfSU5QVVRfRkZfTUVNTEVTUyBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9QT0xMREVWIGlzIG5vdCBzZXQKKworIworIyBVc2VybGFuZCBpbnRlcmZhY2VzCisjCisjIENPTkZJR19JTlBVVF9NT1VTRURFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9KT1lERVYgaXMgbm90IHNldAorQ09ORklHX0lOUFVUX0VWREVWPW0KKyMgQ09ORklHX0lOUFVUX0VWQlVHIGlzIG5vdCBzZXQKKworIworIyBJbnB1dCBEZXZpY2UgRHJpdmVycworIworIyBDT05GSUdfSU5QVVRfS0VZQk9BUkQgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfTU9VU0UgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfSk9ZU1RJQ0sgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfVEFCTEVUIGlzIG5vdCBzZXQKK0NPTkZJR19JTlBVVF9UT1VDSFNDUkVFTj15CisjIENPTkZJR19UT1VDSFNDUkVFTl9BRFM3ODQ2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1RPVUNIU0NSRUVOX0FENzg3NyBpcyBub3Qgc2V0CisjIENPTkZJR19UT1VDSFNDUkVFTl9BRDc4NzlfSTJDIGlzIG5vdCBzZXQKK0NPTkZJR19UT1VDSFNDUkVFTl9BRDc4NzlfU1BJPXkKK0NPTkZJR19UT1VDSFNDUkVFTl9BRDc4Nzk9bQorIyBDT05GSUdfVE9VQ0hTQ1JFRU5fRlVKSVRTVSBpcyBub3Qgc2V0CisjIENPTkZJR19UT1VDSFNDUkVFTl9HVU5aRSBpcyBub3Qgc2V0CisjIENPTkZJR19UT1VDSFNDUkVFTl9FTE8gaXMgbm90IHNldAorIyBDT05GSUdfVE9VQ0hTQ1JFRU5fTVRPVUNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RPVUNIU0NSRUVOX0lORVhJTyBpcyBub3Qgc2V0CisjIENPTkZJR19UT1VDSFNDUkVFTl9NSzcxMiBpcyBub3Qgc2V0CisjIENPTkZJR19UT1VDSFNDUkVFTl9QRU5NT1VOVCBpcyBub3Qgc2V0CisjIENPTkZJR19UT1VDSFNDUkVFTl9UT1VDSFJJR0hUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RPVUNIU0NSRUVOX1RPVUNIV0lOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RPVUNIU0NSRUVOX1RPVUNISVQyMTMgaXMgbm90IHNldAorQ09ORklHX0lOUFVUX01JU0M9eQorIyBDT05GSUdfSU5QVVRfVUlOUFVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NPTkZJR19JTlBVVF9QQ0Y4NTc0IGlzIG5vdCBzZXQKKworIworIyBIYXJkd2FyZSBJL08gcG9ydHMKKyMKKyMgQ09ORklHX1NFUklPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dBTUVQT1JUIGlzIG5vdCBzZXQKKworIworIyBDaGFyYWN0ZXIgZGV2aWNlcworIworIyBDT05GSUdfQUQ5OTYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NQSV9BRENfQkY1MzMgaXMgbm90IHNldAorIyBDT05GSUdfQkY1eHhfUFBJRkNEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGSU5fU0lNUExFX1RJTUVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGNXh4X1BQSSBpcyBub3Qgc2V0CitDT05GSUdfQkZJTl9TUE9SVD15CisjIENPTkZJR19CRklOX1RJTUVSX0xBVEVOQ1kgaXMgbm90IHNldAorIyBDT05GSUdfVFdJX0xDRCBpcyBub3Qgc2V0CitDT05GSUdfQkZJTl9ETUFfSU5URVJGQUNFPW0KK0NPTkZJR19TSU1QTEVfR1BJTz1tCisjIENPTkZJR19WVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERVZLTUVNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGSU5fSlRBR19DT01NIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFUklBTF9OT05TVEFOREFSRCBpcyBub3Qgc2V0CisKKyMKKyMgU2VyaWFsIGRyaXZlcnMKKyMKKyMgQ09ORklHX1NFUklBTF84MjUwIGlzIG5vdCBzZXQKKworIworIyBOb24tODI1MCBzZXJpYWwgcG9ydCBzdXBwb3J0CisjCitDT05GSUdfU0VSSUFMX0JGSU49eQorQ09ORklHX1NFUklBTF9CRklOX0NPTlNPTEU9eQorQ09ORklHX1NFUklBTF9CRklOX0RNQT15CisjIENPTkZJR19TRVJJQUxfQkZJTl9QSU8gaXMgbm90IHNldAorQ09ORklHX1NFUklBTF9CRklOX1VBUlQwPXkKKyMgQ09ORklHX0JGSU5fVUFSVDBfQ1RTUlRTIGlzIG5vdCBzZXQKK0NPTkZJR19TRVJJQUxfQkZJTl9VQVJUMT15CisjIENPTkZJR19CRklOX1VBUlQxX0NUU1JUUyBpcyBub3Qgc2V0CitDT05GSUdfU0VSSUFMX0JGSU5fVUFSVDI9eQorIyBDT05GSUdfQkZJTl9VQVJUMl9DVFNSVFMgaXMgbm90IHNldAorQ09ORklHX1NFUklBTF9DT1JFPXkKK0NPTkZJR19TRVJJQUxfQ09SRV9DT05TT0xFPXkKKyMgQ09ORklHX1NFUklBTF9CRklOX1NQT1JUIGlzIG5vdCBzZXQKK0NPTkZJR19VTklYOThfUFRZUz15CisjIENPTkZJR19MRUdBQ1lfUFRZUyBpcyBub3Qgc2V0CisKKyMKKyMgQ0FOLCB0aGUgY2FyIGJ1cyBhbmQgaW5kdXN0cmlhbCBmaWVsZGJ1cworIworIyBDT05GSUdfQ0FONExJTlVYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQTUlfSEFORExFUiBpcyBub3Qgc2V0CisjIENPTkZJR19IV19SQU5ET00gaXMgbm90IHNldAorIyBDT05GSUdfUjM5NjQgaXMgbm90IHNldAorIyBDT05GSUdfUkFXX0RSSVZFUiBpcyBub3Qgc2V0CisjIENPTkZJR19UQ0dfVFBNIGlzIG5vdCBzZXQKK0NPTkZJR19JMkM9eQorQ09ORklHX0kyQ19CT0FSRElORk89eQorIyBDT05GSUdfSTJDX0NIQVJERVYgaXMgbm90IHNldAorQ09ORklHX0kyQ19IRUxQRVJfQVVUTz15CisKKyMKKyMgSTJDIEhhcmR3YXJlIEJ1cyBzdXBwb3J0CisjCisKKyMKKyMgSTJDIHN5c3RlbSBidXMgZHJpdmVycyAobW9zdGx5IGVtYmVkZGVkIC8gc3lzdGVtLW9uLWNoaXApCisjCitDT05GSUdfSTJDX0JMQUNLRklOX1RXST15CitDT05GSUdfSTJDX0JMQUNLRklOX1RXSV9DTEtfS0haPTEwMAorIyBDT05GSUdfSTJDX0dQSU8gaXMgbm90IHNldAorIyBDT05GSUdfSTJDX09DT1JFUyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfU0lNVEVDIGlzIG5vdCBzZXQKKworIworIyBFeHRlcm5hbCBJMkMvU01CdXMgYWRhcHRlciBkcml2ZXJzCisjCisjIENPTkZJR19JMkNfUEFSUE9SVF9MSUdIVCBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfVEFPU19FVk0gaXMgbm90IHNldAorCisjCisjIE90aGVyIEkyQy9TTUJ1cyBidXMgZHJpdmVycworIworIyBDT05GSUdfSTJDX1BDQV9QTEFURk9STSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfU1RVQiBpcyBub3Qgc2V0CisKKyMKKyMgTWlzY2VsbGFuZW91cyBJMkMgQ2hpcCBzdXBwb3J0CisjCisjIENPTkZJR19EUzE2ODIgaXMgbm90IHNldAorIyBDT05GSUdfQVQyNCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FENTI1MiBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0VFUFJPTSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1BDRjg1NzQgaXMgbm90IHNldAorIyBDT05GSUdfUENGODU3NSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1BDQTk1MzkgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19QQ0Y4NTkxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTUFYNjg3NSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1RTTDI1NTAgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0NPUkUgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0FMR08gaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0JVUyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfREVCVUdfQ0hJUCBpcyBub3Qgc2V0CitDT05GSUdfU1BJPXkKKyMgQ09ORklHX1NQSV9ERUJVRyBpcyBub3Qgc2V0CitDT05GSUdfU1BJX01BU1RFUj15CisKKyMKKyMgU1BJIE1hc3RlciBDb250cm9sbGVyIERyaXZlcnMKKyMKK0NPTkZJR19TUElfQkZJTj15CisjIENPTkZJR19TUElfQkZJTl9MT0NLIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NQSV9CSVRCQU5HIGlzIG5vdCBzZXQKKworIworIyBTUEkgUHJvdG9jb2wgTWFzdGVycworIworIyBDT05GSUdfU1BJX0FUMjUgaXMgbm90IHNldAorIyBDT05GSUdfU1BJX1NQSURFViBpcyBub3Qgc2V0CisjIENPTkZJR19TUElfVExFNjJYMCBpcyBub3Qgc2V0CitDT05GSUdfQVJDSF9XQU5UX09QVElPTkFMX0dQSU9MSUI9eQorIyBDT05GSUdfR1BJT0xJQiBpcyBub3Qgc2V0CisjIENPTkZJR19XMSBpcyBub3Qgc2V0CisjIENPTkZJR19QT1dFUl9TVVBQTFkgaXMgbm90IHNldAorQ09ORklHX0hXTU9OPXkKKyMgQ09ORklHX0hXTU9OX1ZJRCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FENzQxNCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FENzQxOCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FEQ1hYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURNMTAyMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FETTEwMjUgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRE0xMDI2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURNMTAyOSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FETTEwMzEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRE05MjQwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURUNzQ3MCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FEVDc0NzMgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BVFhQMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0RTMTYyMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0Y3MTgwNUYgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19GNzE4ODJGRyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0Y3NTM3NVMgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19HTDUxOFNNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfR0w1MjBTTSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0lUODcgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTYzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE03MCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNNzUgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTc3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE03OCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNODAgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTgzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE04NSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNODcgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTkwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE05MiBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNOTMgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19NQVgxMTExIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTUFYMTYxOSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX01BWDY2NTAgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19QQzg3MzYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfUEM4NzQyNyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0RNRTE3MzcgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19TTVNDNDdNMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1NNU0M0N00xOTIgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19TTVNDNDdCMzk3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURTNzgyOCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1RITUM1MCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1ZUMTIxMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1c4Mzc4MUQgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19XODM3OTFEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVzgzNzkyRCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1c4Mzc5MyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1c4M0w3ODVUUyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1c4M0w3ODZORyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1c4MzYyN0hGIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVzgzNjI3RUhGIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hXTU9OX0RFQlVHX0NISVAgaXMgbm90IHNldAorIyBDT05GSUdfVEhFUk1BTCBpcyBub3Qgc2V0CisjIENPTkZJR19USEVSTUFMX0hXTU9OIGlzIG5vdCBzZXQKK0NPTkZJR19XQVRDSERPRz15CisjIENPTkZJR19XQVRDSERPR19OT1dBWU9VVCBpcyBub3Qgc2V0CisKKyMKKyMgV2F0Y2hkb2cgRGV2aWNlIERyaXZlcnMKKyMKKyMgQ09ORklHX1NPRlRfV0FUQ0hET0cgaXMgbm90IHNldAorQ09ORklHX0JGSU5fV0RUPXkKKworIworIyBNdWx0aWZ1bmN0aW9uIGRldmljZSBkcml2ZXJzCisjCisjIENPTkZJR19NRkRfQ09SRSBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfU001MDEgaXMgbm90IHNldAorIyBDT05GSUdfSFRDX1BBU0lDMyBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfVE1JTyBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfV004NDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9XTTgzNTBfSTJDIGlzIG5vdCBzZXQKKworIworIyBNdWx0aW1lZGlhIGRldmljZXMKKyMKKworIworIyBNdWx0aW1lZGlhIGNvcmUgc3VwcG9ydAorIworIyBDT05GSUdfVklERU9fREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RWQl9DT1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZJREVPX01FRElBIGlzIG5vdCBzZXQKKworIworIyBNdWx0aW1lZGlhIGRyaXZlcnMKKyMKKyMgQ09ORklHX0RBQiBpcyBub3Qgc2V0CisKKyMKKyMgR3JhcGhpY3Mgc3VwcG9ydAorIworIyBDT05GSUdfVkdBU1RBVEUgaXMgbm90IHNldAorIyBDT05GSUdfVklERU9fT1VUUFVUX0NPTlRST0wgaXMgbm90IHNldAorQ09ORklHX0ZCPW0KKyMgQ09ORklHX0ZJUk1XQVJFX0VESUQgaXMgbm90IHNldAorIyBDT05GSUdfRkJfRERDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX0JPT1RfVkVTQV9TVVBQT1JUIGlzIG5vdCBzZXQKK0NPTkZJR19GQl9DRkJfRklMTFJFQ1Q9bQorQ09ORklHX0ZCX0NGQl9DT1BZQVJFQT1tCitDT05GSUdfRkJfQ0ZCX0lNQUdFQkxJVD1tCisjIENPTkZJR19GQl9DRkJfUkVWX1BJWEVMU19JTl9CWVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1NZU19GSUxMUkVDVCBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9TWVNfQ09QWUFSRUEgaXMgbm90IHNldAorIyBDT05GSUdfRkJfU1lTX0lNQUdFQkxJVCBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9GT1JFSUdOX0VORElBTiBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9TWVNfRk9QUyBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9TVkdBTElCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX01BQ01PREVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX0JBQ0tMSUdIVCBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9NT0RFX0hFTFBFUlMgaXMgbm90IHNldAorIyBDT05GSUdfRkJfVElMRUJMSVRUSU5HIGlzIG5vdCBzZXQKKworIworIyBGcmFtZSBidWZmZXIgaGFyZHdhcmUgZHJpdmVycworIworIyBDT05GSUdfRkJfQkZJTl9UMzUwTUNRQiBpcyBub3Qgc2V0CitDT05GSUdfRkJfQkZJTl9MUTAzNVExPW0KKyMgQ09ORklHX0ZCX0JGSU5fNzM5MyBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9TMUQxM1hYWCBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9WSVJUVUFMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX01FVFJPTk9NRSBpcyBub3Qgc2V0CisjIENPTkZJR19CQUNLTElHSFRfTENEX1NVUFBPUlQgaXMgbm90IHNldAorCisjCisjIERpc3BsYXkgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX0RJU1BMQVlfU1VQUE9SVCBpcyBub3Qgc2V0CisjIENPTkZJR19MT0dPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NPVU5EIGlzIG5vdCBzZXQKK0NPTkZJR19ISURfU1VQUE9SVD15CitDT05GSUdfSElEPXkKKyMgQ09ORklHX0hJRF9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19ISURSQVcgaXMgbm90IHNldAorIyBDT05GSUdfSElEX1BJRCBpcyBub3Qgc2V0CisKKyMKKyMgU3BlY2lhbCBISUQgZHJpdmVycworIworQ09ORklHX0hJRF9DT01QQVQ9eQorIyBDT05GSUdfVVNCX1NVUFBPUlQgaXMgbm90IHNldAorIyBDT05GSUdfTU1DIGlzIG5vdCBzZXQKKyMgQ09ORklHX01FTVNUSUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FV19MRURTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FDQ0VTU0lCSUxJVFkgaXMgbm90IHNldAorQ09ORklHX1JUQ19MSUI9eQorQ09ORklHX1JUQ19DTEFTUz15CitDT05GSUdfUlRDX0hDVE9TWVM9eQorQ09ORklHX1JUQ19IQ1RPU1lTX0RFVklDRT0icnRjMCIKKyMgQ09ORklHX1JUQ19ERUJVRyBpcyBub3Qgc2V0CisKKyMKKyMgUlRDIGludGVyZmFjZXMKKyMKK0NPTkZJR19SVENfSU5URl9TWVNGUz15CitDT05GSUdfUlRDX0lOVEZfUFJPQz15CitDT05GSUdfUlRDX0lOVEZfREVWPXkKKyMgQ09ORklHX1JUQ19JTlRGX0RFVl9VSUVfRU1VTCBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1RFU1QgaXMgbm90IHNldAorCisjCisjIEkyQyBSVEMgZHJpdmVycworIworIyBDT05GSUdfUlRDX0RSVl9EUzEzMDcgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9EUzEzNzQgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9EUzE2NzIgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9NQVg2OTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfUlM1QzM3MiBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0lTTDEyMDggaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9YMTIwNSBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1BDRjg1NjMgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9QQ0Y4NTgzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfTTQxVDgwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfUzM1MzkwQSBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0ZNMzEzMCBpcyBub3Qgc2V0CisKKyMKKyMgU1BJIFJUQyBkcml2ZXJzCisjCisjIENPTkZJR19SVENfRFJWX000MVQ5NCBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0RTMTMwNSBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX01BWDY5MDIgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9SOTcwMSBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1JTNUMzNDggaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9EUzMyMzQgaXMgbm90IHNldAorCisjCisjIFBsYXRmb3JtIFJUQyBkcml2ZXJzCisjCisjIENPTkZJR19SVENfRFJWX0RTMTI4NiBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0RTMTUxMSBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0RTMTU1MyBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0RTMTc0MiBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1NUSzE3VEE4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfTTQ4VDg2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfTTQ4VDM1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfTTQ4VDU5IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfQlE0ODAyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfVjMwMjAgaXMgbm90IHNldAorCisjCisjIG9uLUNQVSBSVEMgZHJpdmVycworIworQ09ORklHX1JUQ19EUlZfQkZJTj15CisjIENPTkZJR19ETUFERVZJQ0VTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VJTyBpcyBub3Qgc2V0CisjIENPTkZJR19TVEFHSU5HIGlzIG5vdCBzZXQKKworIworIyBGaWxlIHN5c3RlbXMKKyMKKyMgQ09ORklHX0VYVDJfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRVhUM19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19FWFQ0X0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFSVNFUkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19GU19QT1NJWF9BQ0wgaXMgbm90IHNldAorQ09ORklHX0ZJTEVfTE9DS0lORz15CisjIENPTkZJR19YRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfT0NGUzJfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRE5PVElGWSBpcyBub3Qgc2V0CitDT05GSUdfSU5PVElGWT15CitDT05GSUdfSU5PVElGWV9VU0VSPXkKKyMgQ09ORklHX1FVT1RBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FVVE9GU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BVVRPRlM0X0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZVU0VfRlMgaXMgbm90IHNldAorCisjCisjIENELVJPTS9EVkQgRmlsZXN5c3RlbXMKKyMKKyMgQ09ORklHX0lTTzk2NjBfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVURGX0ZTIGlzIG5vdCBzZXQKKworIworIyBET1MvRkFUL05UIEZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19NU0RPU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19WRkFUX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX05URlNfRlMgaXMgbm90IHNldAorCisjCisjIFBzZXVkbyBmaWxlc3lzdGVtcworIworQ09ORklHX1BST0NfRlM9eQorQ09ORklHX1BST0NfU1lTQ1RMPXkKK0NPTkZJR19TWVNGUz15CisjIENPTkZJR19UTVBGUyBpcyBub3Qgc2V0CisjIENPTkZJR19IVUdFVExCX1BBR0UgaXMgbm90IHNldAorIyBDT05GSUdfQ09ORklHRlNfRlMgaXMgbm90IHNldAorCisjCisjIE1pc2NlbGxhbmVvdXMgZmlsZXN5c3RlbXMKKyMKKyMgQ09ORklHX0FERlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQUZGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEZTUExVU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19CRUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19FRlNfRlMgaXMgbm90IHNldAorQ09ORklHX1lBRkZTX0ZTPW0KK0NPTkZJR19ZQUZGU19ZQUZGUzE9eQorIyBDT05GSUdfWUFGRlNfOUJZVEVfVEFHUyBpcyBub3Qgc2V0CisjIENPTkZJR19ZQUZGU19ET0VTX0VDQyBpcyBub3Qgc2V0CitDT05GSUdfWUFGRlNfWUFGRlMyPXkKK0NPTkZJR19ZQUZGU19BVVRPX1lBRkZTMj15CisjIENPTkZJR19ZQUZGU19ESVNBQkxFX0xBWllfTE9BRCBpcyBub3Qgc2V0CisjIENPTkZJR19ZQUZGU19ESVNBQkxFX1dJREVfVE5PREVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1lBRkZTX0FMV0FZU19DSEVDS19DSFVOS19FUkFTRUQgaXMgbm90IHNldAorQ09ORklHX1lBRkZTX1NIT1JUX05BTUVTX0lOX1JBTT15CitDT05GSUdfSkZGUzJfRlM9bQorQ09ORklHX0pGRlMyX0ZTX0RFQlVHPTAKK0NPTkZJR19KRkZTMl9GU19XUklURUJVRkZFUj15CisjIENPTkZJR19KRkZTMl9GU19XQlVGX1ZFUklGWSBpcyBub3Qgc2V0CisjIENPTkZJR19KRkZTMl9TVU1NQVJZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGRlMyX0ZTX1hBVFRSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGRlMyX0NPTVBSRVNTSU9OX09QVElPTlMgaXMgbm90IHNldAorQ09ORklHX0pGRlMyX1pMSUI9eQorIyBDT05GSUdfSkZGUzJfTFpPIGlzIG5vdCBzZXQKK0NPTkZJR19KRkZTMl9SVElNRT15CisjIENPTkZJR19KRkZTMl9SVUJJTiBpcyBub3Qgc2V0CisjIENPTkZJR19DUkFNRlMgaXMgbm90IHNldAorIyBDT05GSUdfVlhGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19NSU5JWF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19PTUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hQRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUU5YNEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JPTUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU1ZfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVUZTX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRXT1JLX0ZJTEVTWVNURU1TPXkKK0NPTkZJR19ORlNfRlM9bQorQ09ORklHX05GU19WMz15CisjIENPTkZJR19ORlNfVjNfQUNMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05GU19WNCBpcyBub3Qgc2V0CisjIENPTkZJR19ORlNEIGlzIG5vdCBzZXQKK0NPTkZJR19MT0NLRD1tCitDT05GSUdfTE9DS0RfVjQ9eQorQ09ORklHX05GU19DT01NT049eQorQ09ORklHX1NVTlJQQz1tCisjIENPTkZJR19TVU5SUENfUkVHSVNURVJfVjQgaXMgbm90IHNldAorIyBDT05GSUdfUlBDU0VDX0dTU19LUkI1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JQQ1NFQ19HU1NfU1BLTTMgaXMgbm90IHNldAorQ09ORklHX1NNQl9GUz1tCisjIENPTkZJR19TTUJfTkxTX0RFRkFVTFQgaXMgbm90IHNldAorIyBDT05GSUdfQ0lGUyBpcyBub3Qgc2V0CisjIENPTkZJR19OQ1BfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQ09EQV9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BRlNfRlMgaXMgbm90IHNldAorCisjCisjIFBhcnRpdGlvbiBUeXBlcworIworIyBDT05GSUdfUEFSVElUSU9OX0FEVkFOQ0VEIGlzIG5vdCBzZXQKK0NPTkZJR19NU0RPU19QQVJUSVRJT049eQorQ09ORklHX05MUz1tCitDT05GSUdfTkxTX0RFRkFVTFQ9Imlzbzg4NTktMSIKKyMgQ09ORklHX05MU19DT0RFUEFHRV80MzcgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzczNyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfNzc1IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NTAgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1MiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODU1IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NTcgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODYxIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjIgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODY0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2NiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODY5IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV85MzYgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzk1MCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfOTMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV85NDkgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg3NCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV84IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV8xMjUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV8xMjUxIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19BU0NJSSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV8xIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzIgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfMyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV80IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfNiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV83IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzkgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfMTMgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfMTQgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfMTUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0tPSThfUiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfS09JOF9VIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19VVEY4IGlzIG5vdCBzZXQKKyMgQ09ORklHX0RMTSBpcyBub3Qgc2V0CisKKyMKKyMgS2VybmVsIGhhY2tpbmcKKyMKKyMgQ09ORklHX1BSSU5US19USU1FIGlzIG5vdCBzZXQKK0NPTkZJR19FTkFCTEVfV0FSTl9ERVBSRUNBVEVEPXkKK0NPTkZJR19FTkFCTEVfTVVTVF9DSEVDSz15CitDT05GSUdfRlJBTUVfV0FSTj0xMDI0CisjIENPTkZJR19NQUdJQ19TWVNSUSBpcyBub3Qgc2V0CisjIENPTkZJR19VTlVTRURfU1lNQk9MUyBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfRlM9eQorIyBDT05GSUdfSEVBREVSU19DSEVDSyBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfS0VSTkVMPXkKKyMgQ09ORklHX0RFQlVHX1NISVJRIGlzIG5vdCBzZXQKK0NPTkZJR19ERVRFQ1RfU09GVExPQ0tVUD15CisjIENPTkZJR19CT09UUEFSQU1fU09GVExPQ0tVUF9QQU5JQyBpcyBub3Qgc2V0CitDT05GSUdfQk9PVFBBUkFNX1NPRlRMT0NLVVBfUEFOSUNfVkFMVUU9MAorQ09ORklHX1NDSEVEX0RFQlVHPXkKKyMgQ09ORklHX1NDSEVEU1RBVFMgaXMgbm90IHNldAorIyBDT05GSUdfVElNRVJfU1RBVFMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfT0JKRUNUUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TTEFCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1JUX01VVEVYRVMgaXMgbm90IHNldAorIyBDT05GSUdfUlRfTVVURVhfVEVTVEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NQSU5MT0NLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX01VVEVYRVMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU1BJTkxPQ0tfU0xFRVAgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfTE9DS0lOR19BUElfU0VMRlRFU1RTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0tPQkpFQ1QgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfQlVHVkVSQk9TRSBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfSU5GTz15CisjIENPTkZJR19ERUJVR19WTSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19XUklURUNPVU5UIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX01FTU9SWV9JTklUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0xJU1QgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU0cgaXMgbm90IHNldAorIyBDT05GSUdfRlJBTUVfUE9JTlRFUiBpcyBub3Qgc2V0CisjIENPTkZJR19CT09UX1BSSU5US19ERUxBWSBpcyBub3Qgc2V0CisjIENPTkZJR19SQ1VfVE9SVFVSRV9URVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JDVV9DUFVfU1RBTExfREVURUNUT1IgaXMgbm90IHNldAorIyBDT05GSUdfQkFDS1RSQUNFX1NFTEZfVEVTVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19CTE9DS19FWFRfREVWVCBpcyBub3Qgc2V0CisjIENPTkZJR19GQVVMVF9JTkpFQ1RJT04gaXMgbm90IHNldAorQ09ORklHX1NZU0NUTF9TWVNDQUxMX0NIRUNLPXkKKyMgQ09ORklHX0RZTkFNSUNfUFJJTlRLX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBTVBMRVMgaXMgbm90IHNldAorQ09ORklHX0hBVkVfQVJDSF9LR0RCPXkKKyMgQ09ORklHX0tHREIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU1RBQ0tPVkVSRkxPVyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TVEFDS19VU0FHRSBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfVkVSQk9TRT15CitDT05GSUdfREVCVUdfTU1SUz15CisjIENPTkZJR19ERUJVR19IV0VSUiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19ET1VCTEVGQVVMVCBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfSFVOVF9GT1JfWkVSTz15CitDT05GSUdfREVCVUdfQkZJTl9IV1RSQUNFX09OPXkKK0NPTkZJR19ERUJVR19CRklOX0hXVFJBQ0VfQ09NUFJFU1NJT05fT0ZGPXkKKyMgQ09ORklHX0RFQlVHX0JGSU5fSFdUUkFDRV9DT01QUkVTU0lPTl9PTkUgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfQkZJTl9IV1RSQUNFX0NPTVBSRVNTSU9OX1RXTyBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfQkZJTl9IV1RSQUNFX0NPTVBSRVNTSU9OPTAKKyMgQ09ORklHX0RFQlVHX0JGSU5fSFdUUkFDRV9FWFBBTkQgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfQkZJTl9OT19LRVJOX0hXVFJBQ0UgaXMgbm90IHNldAorQ09ORklHX0VBUkxZX1BSSU5USz15CitDT05GSUdfQ1BMQl9JTkZPPXkKK0NPTkZJR19BQ0NFU1NfQ0hFQ0s9eQorCisjCisjIFNlY3VyaXR5IG9wdGlvbnMKKyMKKyMgQ09ORklHX0tFWVMgaXMgbm90IHNldAorQ09ORklHX1NFQ1VSSVRZPXkKKyMgQ09ORklHX1NFQ1VSSVRZRlMgaXMgbm90IHNldAorIyBDT05GSUdfU0VDVVJJVFlfTkVUV09SSyBpcyBub3Qgc2V0CisjIENPTkZJR19TRUNVUklUWV9GSUxFX0NBUEFCSUxJVElFUyBpcyBub3Qgc2V0CitDT05GSUdfU0VDVVJJVFlfREVGQVVMVF9NTUFQX01JTl9BRERSPTAKK0NPTkZJR19DUllQVE89eQorCisjCisjIENyeXB0byBjb3JlIG9yIGhlbHBlcgorIworIyBDT05GSUdfQ1JZUFRPX0ZJUFMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX01BTkFHRVIgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0dGMTI4TVVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19OVUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DUllQVEQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0FVVEhFTkMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1RFU1QgaXMgbm90IHNldAorCisjCisjIEF1dGhlbnRpY2F0ZWQgRW5jcnlwdGlvbiB3aXRoIEFzc29jaWF0ZWQgRGF0YQorIworIyBDT05GSUdfQ1JZUFRPX0NDTSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fR0NNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TRVFJViBpcyBub3Qgc2V0CisKKyMKKyMgQmxvY2sgbW9kZXMKKyMKKyMgQ09ORklHX0NSWVBUT19DQkMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NUUiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ1RTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19FQ0IgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0xSVyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fUENCQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fWFRTIGlzIG5vdCBzZXQKKworIworIyBIYXNoIG1vZGVzCisjCisjIENPTkZJR19DUllQVE9fSE1BQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fWENCQyBpcyBub3Qgc2V0CisKKyMKKyMgRGlnZXN0CisjCisjIENPTkZJR19DUllQVE9fQ1JDMzJDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19NRDQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX01ENSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTUlDSEFFTF9NSUMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1JNRDEyOCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fUk1EMTYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19STUQyNTYgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1JNRDMyMCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0hBMSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0hBMjU2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TSEE1MTIgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1RHUjE5MiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fV1A1MTIgaXMgbm90IHNldAorCisjCisjIENpcGhlcnMKKyMKKyMgQ09ORklHX0NSWVBUT19BRVMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0FOVUJJUyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQVJDNCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQkxPV0ZJU0ggaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NBTUVMTElBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DQVNUNSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ0FTVDYgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0RFUyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fRkNSWVBUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19LSEFaQUQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NBTFNBMjAgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NFRUQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NFUlBFTlQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1RFQSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fVFdPRklTSCBpcyBub3Qgc2V0CisKKyMKKyMgQ29tcHJlc3Npb24KKyMKKyMgQ09ORklHX0NSWVBUT19ERUZMQVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19MWk8gaXMgbm90IHNldAorCisjCisjIFJhbmRvbSBOdW1iZXIgR2VuZXJhdGlvbgorIworIyBDT05GSUdfQ1JZUFRPX0FOU0lfQ1BSTkcgaXMgbm90IHNldAorQ09ORklHX0NSWVBUT19IVz15CisKKyMKKyMgTGlicmFyeSByb3V0aW5lcworIworQ09ORklHX0JJVFJFVkVSU0U9eQorQ09ORklHX0NSQ19DQ0lUVD1tCisjIENPTkZJR19DUkMxNiBpcyBub3Qgc2V0CisjIENPTkZJR19DUkNfVDEwRElGIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQ19JVFVfVCBpcyBub3Qgc2V0CitDT05GSUdfQ1JDMzI9eQorIyBDT05GSUdfQ1JDNyBpcyBub3Qgc2V0CisjIENPTkZJR19MSUJDUkMzMkMgaXMgbm90IHNldAorQ09ORklHX1pMSUJfSU5GTEFURT15CitDT05GSUdfWkxJQl9ERUZMQVRFPW0KK0NPTkZJR19QTElTVD15CitDT05GSUdfSEFTX0lPTUVNPXkKK0NPTkZJR19IQVNfSU9QT1JUPXkKK0NPTkZJR19IQVNfRE1BPXkKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vY29uZmlncy9CRjU0OC1FWktJVF9kZWZjb25maWcgYi9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvQkY1NDgtRVpLSVRfZGVmY29uZmlnCmluZGV4IGJmNjM2NjAuLmQ0ZWQ5Y2UgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vY29uZmlncy9CRjU0OC1FWktJVF9kZWZjb25maWcKKysrIGIvYXJjaC9ibGFja2Zpbi9jb25maWdzL0JGNTQ4LUVaS0lUX2RlZmNvbmZpZwpAQCAtMSw2ICsxLDYgQEAKICMKICMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKLSMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4yNC43CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMjgtcmMyCiAjCiAjIENPTkZJR19NTVUgaXMgbm90IHNldAogIyBDT05GSUdfRlBVIGlzIG5vdCBzZXQKQEAgLTgsNyArOCw2IEBACiAjIENPTkZJR19SV1NFTV9YQ0hHQUREX0FMR09SSVRITSBpcyBub3Qgc2V0CiBDT05GSUdfQkxBQ0tGSU49eQogQ09ORklHX1pPTkVfRE1BPXkKLUNPTkZJR19TRU1BUEhPUkVfU0xFRVBFUlM9eQogQ09ORklHX0dFTkVSSUNfRklORF9ORVhUX0JJVD15CiBDT05GSUdfR0VORVJJQ19IV0VJR0hUPXkKIENPTkZJR19HRU5FUklDX0hBUkRJUlFTPXkKQEAgLTMxLDE4ICszMCwxNiBAQAogIyBDT05GSUdfUE9TSVhfTVFVRVVFIGlzIG5vdCBzZXQKICMgQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1QgaXMgbm90IHNldAogIyBDT05GSUdfVEFTS1NUQVRTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTRVJfTlMgaXMgbm90IHNldAotIyBDT05GSUdfUElEX05TIGlzIG5vdCBzZXQKICMgQ09ORklHX0FVRElUIGlzIG5vdCBzZXQKIENPTkZJR19JS0NPTkZJRz15CiBDT05GSUdfSUtDT05GSUdfUFJPQz15CiBDT05GSUdfTE9HX0JVRl9TSElGVD0xNAogIyBDT05GSUdfQ0dST1VQUyBpcyBub3Qgc2V0Ci1DT05GSUdfRkFJUl9HUk9VUF9TQ0hFRD15Ci1DT05GSUdfRkFJUl9VU0VSX1NDSEVEPXkKLSMgQ09ORklHX0ZBSVJfQ0dST1VQX1NDSEVEIGlzIG5vdCBzZXQKLUNPTkZJR19TWVNGU19ERVBSRUNBVEVEPXkKKyMgQ09ORklHX0dST1VQX1NDSEVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU0ZTX0RFUFJFQ0FURUQgaXMgbm90IHNldAorIyBDT05GSUdfU1lTRlNfREVQUkVDQVRFRF9WMiBpcyBub3Qgc2V0CiAjIENPTkZJR19SRUxBWSBpcyBub3Qgc2V0CisjIENPTkZJR19OQU1FU1BBQ0VTIGlzIG5vdCBzZXQKIENPTkZJR19CTEtfREVWX0lOSVRSRD15CiBDT05GSUdfSU5JVFJBTUZTX1NPVVJDRT0iIgogIyBDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkUgaXMgbm90IHNldApAQCAtNTEsMjYgKzQ4LDM1IEBACiBDT05GSUdfVUlEMTY9eQogQ09ORklHX1NZU0NUTF9TWVNDQUxMPXkKIENPTkZJR19LQUxMU1lNUz15CisjIENPTkZJR19LQUxMU1lNU19BTEwgaXMgbm90IHNldAogIyBDT05GSUdfS0FMTFNZTVNfRVhUUkFfUEFTUyBpcyBub3Qgc2V0CiBDT05GSUdfSE9UUExVRz15CiBDT05GSUdfUFJJTlRLPXkKIENPTkZJR19CVUc9eQotQ09ORklHX0VMRl9DT1JFPXkKKyMgQ09ORklHX0VMRl9DT1JFIGlzIG5vdCBzZXQKK0NPTkZJR19DT01QQVRfQlJLPXkKIENPTkZJR19CQVNFX0ZVTEw9eQogQ09ORklHX0ZVVEVYPXkKIENPTkZJR19BTk9OX0lOT0RFUz15CiBDT05GSUdfRVBPTEw9eQogQ09ORklHX1NJR05BTEZEPXkKK0NPTkZJR19USU1FUkZEPXkKIENPTkZJR19FVkVOVEZEPXkKK0NPTkZJR19BSU89eQogQ09ORklHX1ZNX0VWRU5UX0NPVU5URVJTPXkKIENPTkZJR19TTEFCPXkKICMgQ09ORklHX1NMVUIgaXMgbm90IHNldAogIyBDT05GSUdfU0xPQiBpcyBub3Qgc2V0CisjIENPTkZJR19QUk9GSUxJTkcgaXMgbm90IHNldAorIyBDT05GSUdfTUFSS0VSUyBpcyBub3Qgc2V0CitDT05GSUdfSEFWRV9PUFJPRklMRT15CisjIENPTkZJR19IQVZFX0dFTkVSSUNfRE1BX0NPSEVSRU5UIGlzIG5vdCBzZXQKIENPTkZJR19TTEFCSU5GTz15CiBDT05GSUdfUlRfTVVURVhFUz15CiBDT05GSUdfVElOWV9TSE1FTT15CiBDT05GSUdfQkFTRV9TTUFMTD0wCiBDT05GSUdfTU9EVUxFUz15CisjIENPTkZJR19NT0RVTEVfRk9SQ0VfTE9BRCBpcyBub3Qgc2V0CiBDT05GSUdfTU9EVUxFX1VOTE9BRD15CiAjIENPTkZJR19NT0RVTEVfRk9SQ0VfVU5MT0FEIGlzIG5vdCBzZXQKICMgQ09ORklHX01PRFZFUlNJT05TIGlzIG5vdCBzZXQKQEAgLTgxLDYgKzg3LDcgQEAKICMgQ09ORklHX0JMS19ERVZfSU9fVFJBQ0UgaXMgbm90IHNldAogIyBDT05GSUdfTFNGIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfQlNHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSU5URUdSSVRZIGlzIG5vdCBzZXQKIAogIwogIyBJTyBTY2hlZHVsZXJzCkBAIC05NCw5ICsxMDEsMTEgQEAKICMgQ09ORklHX0RFRkFVTFRfQ0ZRIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFRkFVTFRfTk9PUCBpcyBub3Qgc2V0CiBDT05GSUdfREVGQVVMVF9JT1NDSEVEPSJhbnRpY2lwYXRvcnkiCitDT05GSUdfQ0xBU1NJQ19SQ1U9eQogIyBDT05GSUdfUFJFRU1QVF9OT05FIGlzIG5vdCBzZXQKIENPTkZJR19QUkVFTVBUX1ZPTFVOVEFSWT15CiAjIENPTkZJR19QUkVFTVBUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZSRUVaRVIgaXMgbm90IHNldAogCiAjCiAjIEJsYWNrZmluIFByb2Nlc3NvciBPcHRpb25zCkBAIC0xMDUsNiArMTE0LDEwIEBACiAjCiAjIFByb2Nlc3NvciBhbmQgQm9hcmQgU2V0dGluZ3MKICMKKyMgQ09ORklHX0JGNTEyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGNTE0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGNTE2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGNTE4IGlzIG5vdCBzZXQKICMgQ09ORklHX0JGNTIyIGlzIG5vdCBzZXQKICMgQ09ORklHX0JGNTIzIGlzIG5vdCBzZXQKICMgQ09ORklHX0JGNTI0IGlzIG5vdCBzZXQKQEAgLTExNywxOCArMTMwLDIzIEBACiAjIENPTkZJR19CRjUzNCBpcyBub3Qgc2V0CiAjIENPTkZJR19CRjUzNiBpcyBub3Qgc2V0CiAjIENPTkZJR19CRjUzNyBpcyBub3Qgc2V0CisjIENPTkZJR19CRjUzOCBpcyBub3Qgc2V0CisjIENPTkZJR19CRjUzOSBpcyBub3Qgc2V0CiAjIENPTkZJR19CRjU0MiBpcyBub3Qgc2V0CiAjIENPTkZJR19CRjU0NCBpcyBub3Qgc2V0CiAjIENPTkZJR19CRjU0NyBpcyBub3Qgc2V0CiBDT05GSUdfQkY1NDg9eQogIyBDT05GSUdfQkY1NDkgaXMgbm90IHNldAogIyBDT05GSUdfQkY1NjEgaXMgbm90IHNldAorQ09ORklHX0JGX1JFVl9NSU49MAorQ09ORklHX0JGX1JFVl9NQVg9MgogQ09ORklHX0JGX1JFVl8wXzA9eQogIyBDT05GSUdfQkZfUkVWXzBfMSBpcyBub3Qgc2V0CiAjIENPTkZJR19CRl9SRVZfMF8yIGlzIG5vdCBzZXQKICMgQ09ORklHX0JGX1JFVl8wXzMgaXMgbm90IHNldAogIyBDT05GSUdfQkZfUkVWXzBfNCBpcyBub3Qgc2V0CiAjIENPTkZJR19CRl9SRVZfMF81IGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGX1JFVl8wXzYgaXMgbm90IHNldAogIyBDT05GSUdfQkZfUkVWX0FOWSBpcyBub3Qgc2V0CiAjIENPTkZJR19CRl9SRVZfTk9ORSBpcyBub3Qgc2V0CiBDT05GSUdfQkY1NHg9eQpAQCAtMTM4LDE1ICsxNTYsMTIgQEAKIENPTkZJR19JUlFfU1BPUlQwX1RYPTkKIENPTkZJR19JUlFfU1BPUlQxX1JYPTkKIENPTkZJR19JUlFfU1BPUlQxX1RYPTkKK0NPTkZJR19JUlFfU1BJMD0xMAogQ09ORklHX0lSUV9VQVJUMF9SWD0xMAogQ09ORklHX0lSUV9VQVJUMF9UWD0xMAogQ09ORklHX0lSUV9VQVJUMV9SWD0xMAogQ09ORklHX0lSUV9VQVJUMV9UWD0xMAogQ09ORklHX0lSUV9DTlQ9OAotQ09ORklHX0lSUV9VU0JfSU5UMD0xMQotQ09ORklHX0lSUV9VU0JfSU5UMT0xMQotQ09ORklHX0lSUV9VU0JfSU5UMj0xMQotQ09ORklHX0lSUV9VU0JfRE1BPTExCiBDT05GSUdfSVJRX1RJTUVSMD0xMQogQ09ORklHX0lSUV9USU1FUjE9MTEKIENPTkZJR19JUlFfVElNRVIyPTExCkBAIC0xNTUsOSArMTcwLDIxIEBACiBDT05GSUdfSVJRX1RJTUVSNT0xMQogQ09ORklHX0lSUV9USU1FUjY9MTEKIENPTkZJR19JUlFfVElNRVI3PTExCitDT05GSUdfSVJRX1VTQl9JTlQwPTExCitDT05GSUdfSVJRX1VTQl9JTlQxPTExCitDT05GSUdfSVJRX1VTQl9JTlQyPTExCitDT05GSUdfSVJRX1VTQl9ETUE9MTEKIENPTkZJR19JUlFfVElNRVI4PTExCiBDT05GSUdfSVJRX1RJTUVSOT0xMQogQ09ORklHX0lSUV9USU1FUjEwPTExCitDT05GSUdfSVJRX1NQT1JUMl9SWD05CitDT05GSUdfSVJRX1NQT1JUMl9UWD05CitDT05GSUdfSVJRX1NQT1JUM19SWD05CitDT05GSUdfSVJRX1NQT1JUM19UWD05CitDT05GSUdfSVJRX1NQSTE9MTAKK0NPTkZJR19JUlFfU1BJMj0xMAorQ09ORklHX0lSUV9UV0kwPTExCitDT05GSUdfSVJRX1RXSTE9MTEKIENPTkZJR19CRklONTQ4X0VaS0lUPXkKICMgQ09ORklHX0JGSU41NDhfQkxVRVRFQ0hOSVhfQ00gaXMgbm90IHNldAogCkBAIC0xODAsNyArMjA3LDYgQEAKIENPTkZJR19JUlFfU1BJMF9FUlI9NwogQ09ORklHX0lSUV9VQVJUMF9FUlI9NwogQ09ORklHX0lSUV9FUFBJMD04Ci1DT05GSUdfSVJRX1NQSTA9MTAKIENPTkZJR19JUlFfUElOVDA9MTIKIENPTkZJR19JUlFfUElOVDE9MTIKIENPTkZJR19JUlFfTURNQVMwPTEzCkBAIC0xOTUsMTggKzIyMSwxMCBAQAogQ09ORklHX0lSUV9VQVJUMV9FUlI9NwogQ09ORklHX0lSUV9VQVJUMl9FUlI9NwogQ09ORklHX0lSUV9DQU4wX0VSUj03Ci1DT05GSUdfSVJRX1NQT1JUMl9SWD05Ci1DT05GSUdfSVJRX1NQT1JUMl9UWD05Ci1DT05GSUdfSVJRX1NQT1JUM19SWD05Ci1DT05GSUdfSVJRX1NQT1JUM19UWD05CiBDT05GSUdfSVJRX0VQUEkxPTkKIENPTkZJR19JUlFfRVBQSTI9OQotQ09ORklHX0lSUV9TUEkxPTEwCi1DT05GSUdfSVJRX1NQSTI9MTAKIENPTkZJR19JUlFfQVRBUElfUlg9MTAKIENPTkZJR19JUlFfQVRBUElfVFg9MTAKLUNPTkZJR19JUlFfVFdJMD0xMQotQ09ORklHX0lSUV9UV0kxPTExCiBDT05GSUdfSVJRX0NBTjBfUlg9MTEKIENPTkZJR19JUlFfQ0FOMF9UWD0xMQogQ09ORklHX0lSUV9NRE1BUzI9MTMKQEAgLTI2MCw3ICsyNzgsNiBAQAogIwogQ09ORklHX0NMS0lOX0haPTI1MDAwMDAwCiAjIENPTkZJR19CRklOX0tFUk5FTF9DTE9DSyBpcyBub3Qgc2V0Ci1DT05GSUdfTUFYX01FTV9TSVpFPTUxMgogQ09ORklHX01BWF9WQ09fSFo9NjAwMDAwMDAwCiBDT05GSUdfTUlOX1ZDT19IWj01MDAwMDAwMAogQ09ORklHX01BWF9TQ0xLX0haPTEzMzMzMzMzMwpAQCAtMjc0LDEwICsyOTEsMTAgQEAKICMgQ09ORklHX0haXzMwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19IWl8xMDAwIGlzIG5vdCBzZXQKIENPTkZJR19IWj0yNTAKKyMgQ09ORklHX1NDSEVEX0hSVElDSyBpcyBub3Qgc2V0CiBDT05GSUdfR0VORVJJQ19USU1FPXkKIENPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTPXkKICMgQ09ORklHX0NZQ0xFU19DTE9DS1NPVVJDRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19USUNLX09ORVNIT1QgaXMgbm90IHNldAogIyBDT05GSUdfTk9fSFogaXMgbm90IHNldAogIyBDT05GSUdfSElHSF9SRVNfVElNRVJTIGlzIG5vdCBzZXQKIENPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTX0JVSUxEPXkKQEAgLTMxMSw2ICszMjgsMTIgQEAKIENPTkZJR19DQUNIRUxJTkVfQUxJR05FRF9MMT15CiAjIENPTkZJR19TWVNDQUxMX1RBQl9MMSBpcyBub3Qgc2V0CiAjIENPTkZJR19DUExCX1NXSVRDSF9UQUJfTDEgaXMgbm90IHNldAorQ09ORklHX0FQUF9TVEFDS19MMT15CisKKyMKKyMgU3BlZWQgT3B0aW1pemF0aW9ucworIworQ09ORklHX0JGSU5fSU5TX0xPV09WRVJIRUFEPXkKIENPTkZJR19SQU1LRVJORUw9eQogIyBDT05GSUdfUk9NS0VSTkVMIGlzIG5vdCBzZXQKIENPTkZJR19TRUxFQ1RfTUVNT1JZX01PREVMPXkKQEAgLTMxOSwxNCArMzQyLDEzIEBACiAjIENPTkZJR19TUEFSU0VNRU1fTUFOVUFMIGlzIG5vdCBzZXQKIENPTkZJR19GTEFUTUVNPXkKIENPTkZJR19GTEFUX05PREVfTUVNX01BUD15Ci0jIENPTkZJR19TUEFSU0VNRU1fU1RBVElDIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NQQVJTRU1FTV9WTUVNTUFQX0VOQUJMRSBpcyBub3Qgc2V0CitDT05GSUdfUEFHRUZMQUdTX0VYVEVOREVEPXkKIENPTkZJR19TUExJVF9QVExPQ0tfQ1BVUz00CiAjIENPTkZJR19SRVNPVVJDRVNfNjRCSVQgaXMgbm90IHNldAorIyBDT05GSUdfUEhZU19BRERSX1RfNjRCSVQgaXMgbm90IHNldAogQ09ORklHX1pPTkVfRE1BX0ZMQUc9MQogQ09ORklHX1ZJUlRfVE9fQlVTPXkKICMgQ09ORklHX0JGSU5fR1BUSU1FUlMgaXMgbm90IHNldAotQ09ORklHX0JGSU5fRE1BXzVYWD15CiAjIENPTkZJR19ETUFfVU5DQUNIRURfNE0gaXMgbm90IHNldAogQ09ORklHX0RNQV9VTkNBQ0hFRF8yTT15CiAjIENPTkZJR19ETUFfVU5DQUNIRURfMU0gaXMgbm90IHNldApAQCAtMzQxLDcgKzM2Myw3IEBACiAjIENPTkZJR19CRklOX0lDQUNIRV9MT0NLIGlzIG5vdCBzZXQKICMgQ09ORklHX0JGSU5fV0IgaXMgbm90IHNldAogQ09ORklHX0JGSU5fV1Q9eQotQ09ORklHX0wxX01BWF9QSUVDRT0xNgorIyBDT05GSUdfQkZJTl9MMl9DQUNIRUFCTEUgaXMgbm90IHNldAogIyBDT05GSUdfTVBVIGlzIG5vdCBzZXQKIAogIwpAQCAtMzczLDcgKzM5NSw2IEBACiAjCiAjIEJ1cyBvcHRpb25zIChQQ0ksIFBDTUNJQSwgRUlTQSwgTUNBLCBJU0EpCiAjCi0jIENPTkZJR19QQ0kgaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9TVVBQT1JUU19NU0kgaXMgbm90IHNldAogIyBDT05GSUdfUENDQVJEIGlzIG5vdCBzZXQKIApAQCAtMzg0LDIzICs0MDUsMjAgQEAKIENPTkZJR19CSU5GTVRfRkxBVD15CiBDT05GSUdfQklORk1UX1pGTEFUPXkKICMgQ09ORklHX0JJTkZNVF9TSEFSRURfRkxBVCBpcyBub3Qgc2V0CisjIENPTkZJR19IQVZFX0FPVVQgaXMgbm90IHNldAogIyBDT05GSUdfQklORk1UX01JU0MgaXMgbm90IHNldAogCiAjCiAjIFBvd2VyIG1hbmFnZW1lbnQgb3B0aW9ucwogIwogIyBDT05GSUdfUE0gaXMgbm90IHNldAotQ09ORklHX1NVU1BFTkRfVVBfUE9TU0lCTEU9eQorQ09ORklHX0FSQ0hfU1VTUEVORF9QT1NTSUJMRT15CiAjIENPTkZJR19QTV9XQUtFVVBfQllfR1BJTyBpcyBub3Qgc2V0CiAKICMKICMgQ1BVIEZyZXF1ZW5jeSBzY2FsaW5nCiAjCiAjIENPTkZJR19DUFVfRlJFUSBpcyBub3Qgc2V0Ci0KLSMKLSMgTmV0d29ya2luZwotIwogQ09ORklHX05FVD15CiAKICMKQEAgLTQxMyw2ICs0MzEsNyBAQAogIyBDT05GSUdfWEZSTV9VU0VSIGlzIG5vdCBzZXQKICMgQ09ORklHX1hGUk1fU1VCX1BPTElDWSBpcyBub3Qgc2V0CiAjIENPTkZJR19YRlJNX01JR1JBVEUgaXMgbm90IHNldAorIyBDT05GSUdfWEZSTV9TVEFUSVNUSUNTIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVF9LRVkgaXMgbm90IHNldAogQ09ORklHX0lORVQ9eQogIyBDT05GSUdfSVBfTVVMVElDQVNUIGlzIG5vdCBzZXQKQEAgLTQ0Miw4ICs0NjEsNiBAQAogQ09ORklHX0RFRkFVTFRfVENQX0NPTkc9ImN1YmljIgogIyBDT05GSUdfVENQX01ENVNJRyBpcyBub3Qgc2V0CiAjIENPTkZJR19JUFY2IGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVQ2X1hGUk1fVFVOTkVMIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVQ2X1RVTk5FTCBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRMQUJFTCBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRXT1JLX1NFQ01BUksgaXMgbm90IHNldAogIyBDT05GSUdfTkVURklMVEVSIGlzIG5vdCBzZXQKQEAgLTQ1Miw2ICs0NjksNyBAQAogIyBDT05GSUdfVElQQyBpcyBub3Qgc2V0CiAjIENPTkZJR19BVE0gaXMgbm90IHNldAogIyBDT05GSUdfQlJJREdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9EU0EgaXMgbm90IHNldAogIyBDT05GSUdfVkxBTl84MDIxUSBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUNORVQgaXMgbm90IHNldAogIyBDT05GSUdfTExDMiBpcyBub3Qgc2V0CkBAIC00NjgsNiArNDg2LDcgQEAKICMKICMgQ09ORklHX05FVF9QS1RHRU4gaXMgbm90IHNldAogIyBDT05GSUdfSEFNUkFESU8gaXMgbm90IHNldAorIyBDT05GSUdfQ0FOIGlzIG5vdCBzZXQKIENPTkZJR19JUkRBPW0KIAogIwpAQCAtNDkzLDkgKzUxMiw5IEBACiAjCiBDT05GSUdfSVJUVFlfU0lSPW0KIENPTkZJR19CRklOX1NJUj1tCitDT05GSUdfQkZJTl9TSVIzPXkKICMgQ09ORklHX0JGSU5fU0lSMCBpcyBub3Qgc2V0CiAjIENPTkZJR19CRklOX1NJUjIgaXMgbm90IHNldAotQ09ORklHX0JGSU5fU0lSMz15CiBDT05GSUdfU0lSX0JGSU5fRE1BPXkKICMgQ09ORklHX1NJUl9CRklOX1BJTyBpcyBub3Qgc2V0CiAKQEAgLTUwOCwxNSArNTI3LDYgQEAKICMgQ09ORklHX0tTOTU5X0RPTkdMRSBpcyBub3Qgc2V0CiAKICMKLSMgT2xkIFNJUiBkZXZpY2UgZHJpdmVycwotIwotIyBDT05GSUdfSVJQT1JUX1NJUiBpcyBub3Qgc2V0Ci0KLSMKLSMgT2xkIFNlcmlhbCBkb25nbGUgc3VwcG9ydAotIwotCi0jCiAjIEZJUiBkZXZpY2UgZHJpdmVycwogIwogIyBDT05GSUdfVVNCX0lSREEgaXMgbm90IHNldApAQCAtNTI0LDExICs1MzQsMTAgQEAKICMgQ09ORklHX01DU19GSVIgaXMgbm90IHNldAogIyBDT05GSUdfQlQgaXMgbm90IHNldAogIyBDT05GSUdfQUZfUlhSUEMgaXMgbm90IHNldAotCi0jCi0jIFdpcmVsZXNzCi0jCisjIENPTkZJR19QSE9ORVQgaXMgbm90IHNldAorQ09ORklHX1dJUkVMRVNTPXkKICMgQ09ORklHX0NGRzgwMjExIGlzIG5vdCBzZXQKK0NPTkZJR19XSVJFTEVTU19PTERfUkVHVUxBVE9SWT15CiAjIENPTkZJR19XSVJFTEVTU19FWFQgaXMgbm90IHNldAogIyBDT05GSUdfTUFDODAyMTEgaXMgbm90IHNldAogIyBDT05GSUdfSUVFRTgwMjExIGlzIG5vdCBzZXQKQEAgLTU0Niw2ICs1NTUsOCBAQAogQ09ORklHX1NUQU5EQUxPTkU9eQogQ09ORklHX1BSRVZFTlRfRklSTVdBUkVfQlVJTEQ9eQogIyBDT05GSUdfRldfTE9BREVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0RSSVZFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19ERVZSRVMgaXMgbm90IHNldAogIyBDT05GSUdfU1lTX0hZUEVSVklTT1IgaXMgbm90IHNldAogIyBDT05GSUdfQ09OTkVDVE9SIGlzIG5vdCBzZXQKIENPTkZJR19NVEQ9eQpAQCAtNTU0LDYgKzU2NSw3IEBACiBDT05GSUdfTVREX1BBUlRJVElPTlM9eQogIyBDT05GSUdfTVREX1JFREJPT1RfUEFSVFMgaXMgbm90IHNldAogQ09ORklHX01URF9DTURMSU5FX1BBUlRTPXkKKyMgQ09ORklHX01URF9BUjdfUEFSVFMgaXMgbm90IHNldAogCiAjCiAjIFVzZXIgTW9kdWxlcyBBbmQgVHJhbnNsYXRpb24gTGF5ZXJzCkBAIC02MDEsNiArNjEzLDcgQEAKIENPTkZJR19NVERfUEhZU01BUF9TVEFSVD0weDIwMDAwMDAwCiBDT05GSUdfTVREX1BIWVNNQVBfTEVOPTAKIENPTkZJR19NVERfUEhZU01BUF9CQU5LV0lEVEg9MgorIyBDT05GSUdfTVREX0dQSU9fQUREUiBpcyBub3Qgc2V0CiAjIENPTkZJR19NVERfVUNMSU5VWCBpcyBub3Qgc2V0CiAjIENPTkZJR19NVERfUExBVFJBTSBpcyBub3Qgc2V0CiAKQEAgLTYwOCw3ICs2MjEsOCBAQAogIyBTZWxmLWNvbnRhaW5lZCBNVEQgZGV2aWNlIGRyaXZlcnMKICMKICMgQ09ORklHX01URF9EQVRBRkxBU0ggaXMgbm90IHNldAotIyBDT05GSUdfTVREX00yNVA4MCBpcyBub3Qgc2V0CitDT05GSUdfTVREX00yNVA4MD15CitDT05GSUdfTTI1UFhYX1VTRV9GQVNUX1JFQUQ9eQogIyBDT05GSUdfTVREX1NMUkFNIGlzIG5vdCBzZXQKICMgQ09ORklHX01URF9QSFJBTSBpcyBub3Qgc2V0CiAjIENPTkZJR19NVERfTVREUkFNIGlzIG5vdCBzZXQKQEAgLTY0OCwxMSArNjYyLDE0IEBACiBDT05GSUdfQkxLX0RFVl9SQU09eQogQ09ORklHX0JMS19ERVZfUkFNX0NPVU5UPTE2CiBDT05GSUdfQkxLX0RFVl9SQU1fU0laRT00MDk2Ci1DT05GSUdfQkxLX0RFVl9SQU1fQkxPQ0tTSVpFPTEwMjQKKyMgQ09ORklHX0JMS19ERVZfWElQIGlzIG5vdCBzZXQKICMgQ09ORklHX0NEUk9NX1BLVENEVkQgaXMgbm90IHNldAogIyBDT05GSUdfQVRBX09WRVJfRVRIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSEQgaXMgbm90IHNldAogQ09ORklHX01JU0NfREVWSUNFUz15CiAjIENPTkZJR19FRVBST01fOTNDWDYgaXMgbm90IHNldAorIyBDT05GSUdfRU5DTE9TVVJFX1NFUlZJQ0VTIGlzIG5vdCBzZXQKK0NPTkZJR19IQVZFX0lERT15CiAjIENPTkZJR19JREUgaXMgbm90IHNldAogCiAjCkBAIC02OTYsMTMgKzcxMywxNiBAQAogQ09ORklHX1NDU0lfTE9XTEVWRUw9eQogIyBDT05GSUdfSVNDU0lfVENQIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9ESCBpcyBub3Qgc2V0CiBDT05GSUdfQVRBPXkKICMgQ09ORklHX0FUQV9OT05TVEFOREFSRCBpcyBub3Qgc2V0CitDT05GSUdfU0FUQV9QTVA9eQorQ09ORklHX0FUQV9TRkY9eQorIyBDT05GSUdfU0FUQV9NViBpcyBub3Qgc2V0CiAjIENPTkZJR19QQVRBX1BMQVRGT1JNIGlzIG5vdCBzZXQKIENPTkZJR19QQVRBX0JGNTRYPXkKICMgQ09ORklHX01EIGlzIG5vdCBzZXQKIENPTkZJR19ORVRERVZJQ0VTPXkKLSMgQ09ORklHX05FVERFVklDRVNfTVVMVElRVUVVRSBpcyBub3Qgc2V0CiAjIENPTkZJR19EVU1NWSBpcyBub3Qgc2V0CiAjIENPTkZJR19CT05ESU5HIGlzIG5vdCBzZXQKICMgQ09ORklHX01BQ1ZMQU4gaXMgbm90IHNldApAQCAtNzE1LDExICs3MzUsMTQgQEAKICMgQ09ORklHX1NNQzkxWCBpcyBub3Qgc2V0CiBDT05GSUdfU01TQzkxMVg9eQogIyBDT05GSUdfRE05MDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VOQzI4SjYwIGlzIG5vdCBzZXQKICMgQ09ORklHX0lCTV9ORVdfRU1BQ19aTUlJIGlzIG5vdCBzZXQKICMgQ09ORklHX0lCTV9ORVdfRU1BQ19SR01JSSBpcyBub3Qgc2V0CiAjIENPTkZJR19JQk1fTkVXX0VNQUNfVEFIIGlzIG5vdCBzZXQKICMgQ09ORklHX0lCTV9ORVdfRU1BQ19FTUFDNCBpcyBub3Qgc2V0Ci0jIENPTkZJR19CNDQgaXMgbm90IHNldAorIyBDT05GSUdfSUJNX05FV19FTUFDX05PX0ZMT1dfQ1RSTCBpcyBub3Qgc2V0CisjIENPTkZJR19JQk1fTkVXX0VNQUNfTUFMX0NMUl9JQ0lOVFNUQVQgaXMgbm90IHNldAorIyBDT05GSUdfSUJNX05FV19FTUFDX01BTF9DT01NT05fRVJSIGlzIG5vdCBzZXQKIENPTkZJR19ORVRERVZfMTAwMD15CiAjIENPTkZJR19BWDg4MTgwIGlzIG5vdCBzZXQKIENPTkZJR19ORVRERVZfMTAwMDA9eQpAQCAtNzI5LDYgKzc1Miw3IEBACiAjCiAjIENPTkZJR19XTEFOX1BSRTgwMjExIGlzIG5vdCBzZXQKICMgQ09ORklHX1dMQU5fODAyMTEgaXMgbm90IHNldAorIyBDT05GSUdfSVdMV0lGSV9MRURTIGlzIG5vdCBzZXQKIAogIwogIyBVU0IgTmV0d29yayBBZGFwdGVycwpAQCAtNzQxLDcgKzc2NSw2IEBACiAjIENPTkZJR19XQU4gaXMgbm90IHNldAogIyBDT05GSUdfUFBQIGlzIG5vdCBzZXQKICMgQ09ORklHX1NMSVAgaXMgbm90IHNldAotIyBDT05GSUdfU0hBUEVSIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVENPTlNPTEUgaXMgbm90IHNldAogIyBDT05GSUdfTkVUUE9MTCBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSIGlzIG5vdCBzZXQKQEAgLTc1Miw3ICs3NzUsNyBAQAogIyBJbnB1dCBkZXZpY2Ugc3VwcG9ydAogIwogQ09ORklHX0lOUFVUPXkKLSMgQ09ORklHX0lOUFVUX0ZGX01FTUxFU1MgaXMgbm90IHNldAorQ09ORklHX0lOUFVUX0ZGX01FTUxFU1M9bQogIyBDT05GSUdfSU5QVVRfUE9MTERFViBpcyBub3Qgc2V0CiAKICMKQEAgLTc3NiwzMCArNzk5LDM3IEBACiAjIENPTkZJR19LRVlCT0FSRF9HUElPIGlzIG5vdCBzZXQKIENPTkZJR19LRVlCT0FSRF9CRklOPXkKICMgQ09ORklHX0tFWUJPQVJEX09QRU5DT1JFUyBpcyBub3Qgc2V0CisjIENPTkZJR19LRVlCT0FSRF9BRFA1NTg4IGlzIG5vdCBzZXQKICMgQ09ORklHX0lOUFVUX01PVVNFIGlzIG5vdCBzZXQKICMgQ09ORklHX0lOUFVUX0pPWVNUSUNLIGlzIG5vdCBzZXQKICMgQ09ORklHX0lOUFVUX1RBQkxFVCBpcyBub3Qgc2V0CiBDT05GSUdfSU5QVVRfVE9VQ0hTQ1JFRU49eQogIyBDT05GSUdfVE9VQ0hTQ1JFRU5fQURTNzg0NiBpcyBub3Qgc2V0CiBDT05GSUdfVE9VQ0hTQ1JFRU5fQUQ3ODc3PW0KKyMgQ09ORklHX1RPVUNIU0NSRUVOX0FENzg3OV9JMkMgaXMgbm90IHNldAorIyBDT05GSUdfVE9VQ0hTQ1JFRU5fQUQ3ODc5X1NQSSBpcyBub3Qgc2V0CisjIENPTkZJR19UT1VDSFNDUkVFTl9BRDc4NzkgaXMgbm90IHNldAogIyBDT05GSUdfVE9VQ0hTQ1JFRU5fRlVKSVRTVSBpcyBub3Qgc2V0CiAjIENPTkZJR19UT1VDSFNDUkVFTl9HVU5aRSBpcyBub3Qgc2V0CiAjIENPTkZJR19UT1VDSFNDUkVFTl9FTE8gaXMgbm90IHNldAogIyBDT05GSUdfVE9VQ0hTQ1JFRU5fTVRPVUNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RPVUNIU0NSRUVOX0lORVhJTyBpcyBub3Qgc2V0CiAjIENPTkZJR19UT1VDSFNDUkVFTl9NSzcxMiBpcyBub3Qgc2V0CiAjIENPTkZJR19UT1VDSFNDUkVFTl9QRU5NT1VOVCBpcyBub3Qgc2V0CiAjIENPTkZJR19UT1VDSFNDUkVFTl9UT1VDSFJJR0hUIGlzIG5vdCBzZXQKICMgQ09ORklHX1RPVUNIU0NSRUVOX1RPVUNIV0lOIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RPVUNIU0NSRUVOX1VDQjE0MDAgaXMgbm90IHNldAorIyBDT05GSUdfVE9VQ0hTQ1JFRU5fV005N1hYIGlzIG5vdCBzZXQKICMgQ09ORklHX1RPVUNIU0NSRUVOX1VTQl9DT01QT1NJVEUgaXMgbm90IHNldAorIyBDT05GSUdfVE9VQ0hTQ1JFRU5fVE9VQ0hJVDIxMyBpcyBub3Qgc2V0CiBDT05GSUdfSU5QVVRfTUlTQz15CiAjIENPTkZJR19JTlBVVF9BVElfUkVNT1RFIGlzIG5vdCBzZXQKICMgQ09ORklHX0lOUFVUX0FUSV9SRU1PVEUyIGlzIG5vdCBzZXQKICMgQ09ORklHX0lOUFVUX0tFWVNQQU5fUkVNT1RFIGlzIG5vdCBzZXQKICMgQ09ORklHX0lOUFVUX1BPV0VSTUFURSBpcyBub3Qgc2V0CiAjIENPTkZJR19JTlBVVF9ZRUFMSU5LIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0NNMTA5IGlzIG5vdCBzZXQKICMgQ09ORklHX0lOUFVUX1VJTlBVVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19UV0lfS0VZUEFEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NPTkZJR19JTlBVVF9QQ0Y4NTc0IGlzIG5vdCBzZXQKIAogIwogIyBIYXJkd2FyZSBJL08gcG9ydHMKQEAgLTgxNSwxNiArODQ1LDE4IEBACiAjIENPTkZJR19CRjV4eF9QUElGQ0QgaXMgbm90IHNldAogIyBDT05GSUdfQkZJTl9TSU1QTEVfVElNRVIgaXMgbm90IHNldAogIyBDT05GSUdfQkY1eHhfUFBJIGlzIG5vdCBzZXQKLUNPTkZJR19CRklOX09UUD15Ci0jIENPTkZJR19CRklOX09UUF9XUklURV9FTkFCTEUgaXMgbm90IHNldAogIyBDT05GSUdfQkZJTl9TUE9SVCBpcyBub3Qgc2V0CiAjIENPTkZJR19CRklOX1RJTUVSX0xBVEVOQ1kgaXMgbm90IHNldAogIyBDT05GSUdfVFdJX0xDRCBpcyBub3Qgc2V0CitDT05GSUdfQkZJTl9ETUFfSU5URVJGQUNFPW0KIENPTkZJR19TSU1QTEVfR1BJTz1tCiBDT05GSUdfVlQ9eQorQ09ORklHX0NPTlNPTEVfVFJBTlNMQVRJT05TPXkKIENPTkZJR19WVF9DT05TT0xFPXkKIENPTkZJR19IV19DT05TT0xFPXkKICMgQ09ORklHX1ZUX0hXX0NPTlNPTEVfQklORElORyBpcyBub3Qgc2V0CisjIENPTkZJR19ERVZLTUVNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGSU5fSlRBR19DT01NIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFUklBTF9OT05TVEFOREFSRCBpcyBub3Qgc2V0CiAKICMKQEAgLTg0OSw2ICs4ODEsOCBAQAogIyBDT05GSUdfU0VSSUFMX0JGSU5fU1BPUlQgaXMgbm90IHNldAogQ09ORklHX1VOSVg5OF9QVFlTPXkKICMgQ09ORklHX0xFR0FDWV9QVFlTIGlzIG5vdCBzZXQKK0NPTkZJR19CRklOX09UUD15CisjIENPTkZJR19CRklOX09UUF9XUklURV9FTkFCTEUgaXMgbm90IHNldAogCiAjCiAjIENBTiwgdGhlIGNhciBidXMgYW5kIGluZHVzdHJpYWwgZmllbGRidXMKQEAgLTg1Niw0NCArODkwLDQ5IEBACiAjIENPTkZJR19DQU40TElOVVggaXMgbm90IHNldAogIyBDT05GSUdfSVBNSV9IQU5ETEVSIGlzIG5vdCBzZXQKICMgQ09ORklHX0hXX1JBTkRPTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19HRU5fUlRDIGlzIG5vdCBzZXQKICMgQ09ORklHX1IzOTY0IGlzIG5vdCBzZXQKICMgQ09ORklHX1JBV19EUklWRVIgaXMgbm90IHNldAogIyBDT05GSUdfVENHX1RQTSBpcyBub3Qgc2V0CiBDT05GSUdfSTJDPXkKIENPTkZJR19JMkNfQk9BUkRJTkZPPXkKIENPTkZJR19JMkNfQ0hBUkRFVj15Ci0KLSMKLSMgSTJDIEFsZ29yaXRobXMKLSMKLSMgQ09ORklHX0kyQ19BTEdPQklUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19BTEdPUENGIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19BTEdPUENBIGlzIG5vdCBzZXQKK0NPTkZJR19JMkNfSEVMUEVSX0FVVE89eQogCiAjCiAjIEkyQyBIYXJkd2FyZSBCdXMgc3VwcG9ydAogIworCisjCisjIEkyQyBzeXN0ZW0gYnVzIGRyaXZlcnMgKG1vc3RseSBlbWJlZGRlZCAvIHN5c3RlbS1vbi1jaGlwKQorIwogQ09ORklHX0kyQ19CTEFDS0ZJTl9UV0k9eQotQ09ORklHX0kyQ19CTEFDS0ZJTl9UV0lfQ0xLX0tIWj01MAorQ09ORklHX0kyQ19CTEFDS0ZJTl9UV0lfQ0xLX0tIWj0xMDAKICMgQ09ORklHX0kyQ19HUElPIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19PQ09SRVMgaXMgbm90IHNldAotIyBDT05GSUdfSTJDX1BBUlBPUlRfTElHSFQgaXMgbm90IHNldAogIyBDT05GSUdfSTJDX1NJTVRFQyBpcyBub3Qgc2V0CisKKyMKKyMgRXh0ZXJuYWwgSTJDL1NNQnVzIGFkYXB0ZXIgZHJpdmVycworIworIyBDT05GSUdfSTJDX1BBUlBPUlRfTElHSFQgaXMgbm90IHNldAogIyBDT05GSUdfSTJDX1RBT1NfRVZNIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19TVFVCIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19USU5ZX1VTQiBpcyBub3Qgc2V0CiAKICMKKyMgT3RoZXIgSTJDL1NNQnVzIGJ1cyBkcml2ZXJzCisjCisjIENPTkZJR19JMkNfUENBX1BMQVRGT1JNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19TVFVCIGlzIG5vdCBzZXQKKworIwogIyBNaXNjZWxsYW5lb3VzIEkyQyBDaGlwIHN1cHBvcnQKICMKLSMgQ09ORklHX1NFTlNPUlNfRFMxMzM3IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfRFMxMzc0IGlzIG5vdCBzZXQKICMgQ09ORklHX0RTMTY4MiBpcyBub3Qgc2V0CisjIENPTkZJR19BVDI0IGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfQUQ1MjUyIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfRUVQUk9NIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfUENGODU3NCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX1BDRjg1NzUgaXMgbm90IHNldAorIyBDT05GSUdfUENGODU3NSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1BDQTk1MzkgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19QQ0Y4NTkxIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfTUFYNjg3NSBpcyBub3Qgc2V0CkBAIC05MDIsMTcgKzk0MSwxNSBAQAogIyBDT05GSUdfSTJDX0RFQlVHX0FMR08gaXMgbm90IHNldAogIyBDT05GSUdfSTJDX0RFQlVHX0JVUyBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfREVCVUdfQ0hJUCBpcyBub3Qgc2V0Ci0KLSMKLSMgU1BJIHN1cHBvcnQKLSMKIENPTkZJR19TUEk9eQorIyBDT05GSUdfU1BJX0RFQlVHIGlzIG5vdCBzZXQKIENPTkZJR19TUElfTUFTVEVSPXkKIAogIwogIyBTUEkgTWFzdGVyIENvbnRyb2xsZXIgRHJpdmVycwogIwogQ09ORklHX1NQSV9CRklOPXkKKyMgQ09ORklHX1NQSV9CRklOX0xPQ0sgaXMgbm90IHNldAogIyBDT05GSUdfU1BJX0JJVEJBTkcgaXMgbm90IHNldAogCiAjCkBAIC05MjEsMTEgKzk1OCwxNSBAQAogIyBDT05GSUdfU1BJX0FUMjUgaXMgbm90IHNldAogIyBDT05GSUdfU1BJX1NQSURFViBpcyBub3Qgc2V0CiAjIENPTkZJR19TUElfVExFNjJYMCBpcyBub3Qgc2V0CitDT05GSUdfQVJDSF9XQU5UX09QVElPTkFMX0dQSU9MSUI9eQorIyBDT05GSUdfR1BJT0xJQiBpcyBub3Qgc2V0CiAjIENPTkZJR19XMSBpcyBub3Qgc2V0CiAjIENPTkZJR19QT1dFUl9TVVBQTFkgaXMgbm90IHNldAogQ09ORklHX0hXTU9OPXkKICMgQ09ORklHX0hXTU9OX1ZJRCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FENzQxNCBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0FENzQxOCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FEQ1hYIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfQURNMTAyMSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0FETTEwMjUgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19BRE0xMDI2IGlzIG5vdCBzZXQKQEAgLTkzMyw2ICs5NzQsNyBAQAogIyBDT05GSUdfU0VOU09SU19BRE0xMDMxIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfQURNOTI0MCBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0FEVDc0NzAgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRFQ3NDczIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfQVRYUDEgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19EUzE2MjEgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19GNzE4MDVGIGlzIG5vdCBzZXQKQEAgLTk1Myw2ICs5OTUsNyBAQAogIyBDT05GSUdfU0VOU09SU19MTTkwIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfTE05MiBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0xNOTMgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19NQVgxMTExIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfTUFYMTYxOSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX01BWDY2NTAgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19QQzg3MzYwIGlzIG5vdCBzZXQKQEAgLTk2MSw2ICsxMDA0LDcgQEAKICMgQ09ORklHX1NFTlNPUlNfU01TQzQ3TTEgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19TTVNDNDdNMTkyIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfU01TQzQ3QjM5NyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FEUzc4MjggaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19USE1DNTAgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19WVDEyMTEgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19XODM3ODFEIGlzIG5vdCBzZXQKQEAgLTk2OCw5ICsxMDEyLDEyIEBACiAjIENPTkZJR19TRU5TT1JTX1c4Mzc5MkQgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19XODM3OTMgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19XODNMNzg1VFMgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19XODNMNzg2TkcgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19XODM2MjdIRiBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1c4MzYyN0VIRiBpcyBub3Qgc2V0CiAjIENPTkZJR19IV01PTl9ERUJVR19DSElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RIRVJNQUwgaXMgbm90IHNldAorIyBDT05GSUdfVEhFUk1BTF9IV01PTiBpcyBub3Qgc2V0CiBDT05GSUdfV0FUQ0hET0c9eQogIyBDT05GSUdfV0FUQ0hET0dfTk9XQVlPVVQgaXMgbm90IHNldAogCkBAIC05ODYsMjMgKzEwMzMsMzAgQEAKICMgQ09ORklHX1VTQlBDV0FUQ0hET0cgaXMgbm90IHNldAogCiAjCi0jIFNvbmljcyBTaWxpY29uIEJhY2twbGFuZQotIwotQ09ORklHX1NTQl9QT1NTSUJMRT15Ci0jIENPTkZJR19TU0IgaXMgbm90IHNldAotCi0jCiAjIE11bHRpZnVuY3Rpb24gZGV2aWNlIGRyaXZlcnMKICMKKyMgQ09ORklHX01GRF9DT1JFIGlzIG5vdCBzZXQKICMgQ09ORklHX01GRF9TTTUwMSBpcyBub3Qgc2V0CisjIENPTkZJR19IVENfUEFTSUMzIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9UTUlPIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9XTTg0MDAgaXMgbm90IHNldAorIyBDT05GSUdfTUZEX1dNODM1MF9JMkMgaXMgbm90IHNldAogCiAjCiAjIE11bHRpbWVkaWEgZGV2aWNlcwogIworCisjCisjIE11bHRpbWVkaWEgY29yZSBzdXBwb3J0CisjCiAjIENPTkZJR19WSURFT19ERVYgaXMgbm90IHNldAogIyBDT05GSUdfRFZCX0NPUkUgaXMgbm90IHNldAorIyBDT05GSUdfVklERU9fTUVESUEgaXMgbm90IHNldAorCisjCisjIE11bHRpbWVkaWEgZHJpdmVycworIwogIyBDT05GSUdfREFCIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9EQUJVU0IgaXMgbm90IHNldAogCiAjCiAjIEdyYXBoaWNzIHN1cHBvcnQKQEAgLTEwMTIsNiArMTA2Niw3IEBACiBDT05GSUdfRkI9eQogQ09ORklHX0ZJUk1XQVJFX0VESUQ9eQogIyBDT05GSUdfRkJfRERDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX0JPT1RfVkVTQV9TVVBQT1JUIGlzIG5vdCBzZXQKIENPTkZJR19GQl9DRkJfRklMTFJFQ1Q9eQogQ09ORklHX0ZCX0NGQl9DT1BZQVJFQT15CiBDT05GSUdfRkJfQ0ZCX0lNQUdFQkxJVD15CkBAIC0xMDE5LDggKzEwNzQsOCBAQAogIyBDT05GSUdfRkJfU1lTX0ZJTExSRUNUIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX1NZU19DT1BZQVJFQSBpcyBub3Qgc2V0CiAjIENPTkZJR19GQl9TWVNfSU1BR0VCTElUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX0ZPUkVJR05fRU5ESUFOIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX1NZU19GT1BTIGlzIG5vdCBzZXQKLUNPTkZJR19GQl9ERUZFUlJFRF9JTz15CiAjIENPTkZJR19GQl9TVkdBTElCIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX01BQ01PREVTIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX0JBQ0tMSUdIVCBpcyBub3Qgc2V0CkBAIC0xMDMyLDkgKzEwODcsMTEgQEAKICMKIENPTkZJR19GQl9CRjU0WF9MUTA0Mz15CiAjIENPTkZJR19GQl9CRklOX1QzNTBNQ1FCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX0JGSU5fTFEwMzVRMSBpcyBub3Qgc2V0CiAjIENPTkZJR19GQl9CRklOXzczOTMgaXMgbm90IHNldAogIyBDT05GSUdfRkJfUzFEMTNYWFggaXMgbm90IHNldAogIyBDT05GSUdfRkJfVklSVFVBTCBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9NRVRST05PTUUgaXMgbm90IHNldAogIyBDT05GSUdfQkFDS0xJR0hUX0xDRF9TVVBQT1JUIGlzIG5vdCBzZXQKIAogIwpAQCAtMTA2NiwxNSArMTEyMyw4IEBACiAjIENPTkZJR19MT0dPX0xJTlVYX0NMVVQyMjQgaXMgbm90IHNldAogIyBDT05GSUdfTE9HT19CTEFDS0ZJTl9WR0ExNiBpcyBub3Qgc2V0CiBDT05GSUdfTE9HT19CTEFDS0ZJTl9DTFVUMjI0PXkKLQotIwotIyBTb3VuZAotIwogQ09ORklHX1NPVU5EPXkKLQotIwotIyBBZHZhbmNlZCBMaW51eCBTb3VuZCBBcmNoaXRlY3R1cmUKLSMKK0NPTkZJR19TT1VORF9PU1NfQ09SRT15CiBDT05GSUdfU05EPXkKIENPTkZJR19TTkRfVElNRVI9eQogQ09ORklHX1NORF9QQ009eQpAQCAtMTA4OCw1NiArMTEzOCwzNSBAQAogQ09ORklHX1NORF9WRVJCT1NFX1BST0NGUz15CiAjIENPTkZJR19TTkRfVkVSQk9TRV9QUklOVEsgaXMgbm90IHNldAogIyBDT05GSUdfU05EX0RFQlVHIGlzIG5vdCBzZXQKLQotIwotIyBHZW5lcmljIGRldmljZXMKLSMKK0NPTkZJR19TTkRfRFJJVkVSUz15CiAjIENPTkZJR19TTkRfRFVNTVkgaXMgbm90IHNldAogIyBDT05GSUdfU05EX01UUEFWIGlzIG5vdCBzZXQKICMgQ09ORklHX1NORF9TRVJJQUxfVTE2NTUwIGlzIG5vdCBzZXQKICMgQ09ORklHX1NORF9NUFU0MDEgaXMgbm90IHNldAotCi0jCi0jIFNQSSBkZXZpY2VzCi0jCitDT05GSUdfU05EX1NQST15CiAKICMKICMgQUxTQSBCbGFja2ZpbiBkZXZpY2VzCiAjCiAjIENPTkZJR19TTkRfQkxBQ0tGSU5fQUQxODM2IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9CRklOX0FENzMzMTEgaXMgbm90IHNldAogIyBDT05GSUdfU05EX0JGSU5fQUQ3MzMyMiBpcyBub3Qgc2V0Ci0KLSMKLSMgVVNCIGRldmljZXMKLSMKK0NPTkZJR19TTkRfVVNCPXkKICMgQ09ORklHX1NORF9VU0JfQVVESU8gaXMgbm90IHNldAogIyBDT05GSUdfU05EX1VTQl9DQUlBUSBpcyBub3Qgc2V0Ci0KLSMKLSMgU3lzdGVtIG9uIENoaXAgYXVkaW8gc3VwcG9ydAotIwotQ09ORklHX1NORF9TT0NfQUM5N19CVVM9eQogQ09ORklHX1NORF9TT0M9eQotQ09ORklHX1NORF9CRjVYWF9TT0M9eQotQ09ORklHX1NORF9NTUFQX1NVUFBPUlQ9eQorQ09ORklHX1NORF9TT0NfQUM5N19CVVM9eQorIyBDT05GSUdfU05EX0JGNVhYX0kyUyBpcyBub3Qgc2V0CitDT05GSUdfU05EX0JGNVhYX0FDOTc9eQorQ09ORklHX1NORF9CRjVYWF9NTUFQX1NVUFBPUlQ9eQorIyBDT05GSUdfU05EX0JGNVhYX01VTFRJQ0hBTl9TVVBQT1JUIGlzIG5vdCBzZXQKK0NPTkZJR19TTkRfQkY1WFhfU09DX1NQT1JUPXkKIENPTkZJR19TTkRfQkY1WFhfU09DX0FDOTc9eQotQ09ORklHX1NORF9CRjVYWF9TT0NfQkY1NDhfRVpLSVQ9eQotIyBDT05GSUdfU05EX0JGNVhYX1NPQ19XTTg3NTAgaXMgbm90IHNldAotIyBDT05GSUdfU05EX0JGNVhYX1NPQ19XTTg3MzEgaXMgbm90IHNldAotIyBDT05GSUdfU05EX0JGNVhYX1NPQ19TU00yNjAyIGlzIG5vdCBzZXQKK0NPTkZJR19TTkRfQkY1WFhfU09DX0FEMTk4MD15CiBDT05GSUdfU05EX0JGNVhYX1NQT1JUX05VTT0wCiBDT05GSUdfU05EX0JGNVhYX0hBVkVfQ09MRF9SRVNFVD15CiBDT05GSUdfU05EX0JGNVhYX1JFU0VUX0dQSU9fTlVNPTE5Ci0KLSMKLSMgU29DIEF1ZGlvIHN1cHBvcnQgZm9yIFN1cGVySAotIworIyBDT05GSUdfU05EX1NPQ19BTExfQ09ERUNTIGlzIG5vdCBzZXQKIENPTkZJR19TTkRfU09DX0FEMTk4MD15Ci0KLSMKLSMgT3BlbiBTb3VuZCBTeXN0ZW0KLSMKICMgQ09ORklHX1NPVU5EX1BSSU1FIGlzIG5vdCBzZXQKIENPTkZJR19BQzk3X0JVUz15CiBDT05GSUdfSElEX1NVUFBPUlQ9eQpAQCAtMTE0OSwxNSArMTE3OCw0MyBAQAogIyBVU0IgSW5wdXQgRGV2aWNlcwogIwogQ09ORklHX1VTQl9ISUQ9eQotIyBDT05GSUdfVVNCX0hJRElOUFVUX1BPV0VSQk9PSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ISURfRkYgaXMgbm90IHNldAorIyBDT05GSUdfSElEX1BJRCBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfSElEREVWIGlzIG5vdCBzZXQKKworIworIyBTcGVjaWFsIEhJRCBkcml2ZXJzCisjCitDT05GSUdfSElEX0NPTVBBVD15CitDT05GSUdfSElEX0E0VEVDSD15CitDT05GSUdfSElEX0FQUExFPXkKK0NPTkZJR19ISURfQkVMS0lOPXkKK0NPTkZJR19ISURfQlJJR0hUPXkKK0NPTkZJR19ISURfQ0hFUlJZPXkKK0NPTkZJR19ISURfQ0hJQ09OWT15CitDT05GSUdfSElEX0NZUFJFU1M9eQorQ09ORklHX0hJRF9ERUxMPXkKK0NPTkZJR19ISURfRVpLRVk9eQorQ09ORklHX0hJRF9HWVJBVElPTj15CitDT05GSUdfSElEX0xPR0lURUNIPXkKKyMgQ09ORklHX0xPR0lURUNIX0ZGIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xPR0lSVU1CTEVQQUQyX0ZGIGlzIG5vdCBzZXQKK0NPTkZJR19ISURfTUlDUk9TT0ZUPXkKK0NPTkZJR19ISURfTU9OVEVSRVk9eQorQ09ORklHX0hJRF9QQU5USEVSTE9SRD15CisjIENPTkZJR19QQU5USEVSTE9SRF9GRiBpcyBub3Qgc2V0CitDT05GSUdfSElEX1BFVEFMWU5YPXkKK0NPTkZJR19ISURfU0FNU1VORz15CitDT05GSUdfSElEX1NPTlk9eQorQ09ORklHX0hJRF9TVU5QTFVTPXkKK0NPTkZJR19USFJVU1RNQVNURVJfRkY9bQorQ09ORklHX1pFUk9QTFVTX0ZGPW0KIENPTkZJR19VU0JfU1VQUE9SVD15CiBDT05GSUdfVVNCX0FSQ0hfSEFTX0hDRD15CiAjIENPTkZJR19VU0JfQVJDSF9IQVNfT0hDSSBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfQVJDSF9IQVNfRUhDSSBpcyBub3Qgc2V0CiBDT05GSUdfVVNCPXkKICMgQ09ORklHX1VTQl9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQU5OT1VOQ0VfTkVXX0RFVklDRVMgaXMgbm90IHNldAogCiAjCiAjIE1pc2NlbGxhbmVvdXMgVVNCIG9wdGlvbnMKQEAgLTExNjgsMTUgKzEyMjUsMjAgQEAKICMgQ09ORklHX1VTQl9PVEcgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX09UR19XSElURUxJU1QgaXMgbm90IHNldAogQ09ORklHX1VTQl9PVEdfQkxBQ0tMSVNUX0hVQj15CitDT05GSUdfVVNCX01PTj15CisjIENPTkZJR19VU0JfV1VTQiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfV1VTQl9DQkFGIGlzIG5vdCBzZXQKIAogIwogIyBVU0IgSG9zdCBDb250cm9sbGVyIERyaXZlcnMKICMKKyMgQ09ORklHX1VTQl9DNjdYMDBfSENEIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9JU1AxMTZYX0hDRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfSVNQMTM2Ml9IQ0QgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0lTUDE3NjBfSENEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9JU1AxMzYyX0hDRCBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfU0w4MTFfSENEIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9SOEE2NjU5N19IQ0QgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0hXQV9IQ0QgaXMgbm90IHNldAogQ09ORklHX1VTQl9NVVNCX0hEUkM9eQogQ09ORklHX1VTQl9NVVNCX1NPQz15CiAKQEAgLTExOTAsMTMgKzEyNTIsMTUgQEAKICMgQ09ORklHX01VU0JfUElPX09OTFkgaXMgbm90IHNldAogQ09ORklHX1VTQl9JTlZFTlRSQV9ETUE9eQogIyBDT05GSUdfVVNCX1RJX0NQUElfRE1BIGlzIG5vdCBzZXQKLUNPTkZJR19VU0JfTVVTQl9MT0dMRVZFTD0wCisjIENPTkZJR19VU0JfTVVTQl9ERUJVRyBpcyBub3Qgc2V0CiAKICMKICMgVVNCIERldmljZSBDbGFzcyBkcml2ZXJzCiAjCiAjIENPTkZJR19VU0JfQUNNIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9QUklOVEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9XRE0gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1RNQyBpcyBub3Qgc2V0CiAKICMKICMgTk9URTogVVNCX1NUT1JBR0UgZW5hYmxlcyBTQ1NJLCBhbmQgJ1NDU0kgZGlzayBzdXBwb3J0JwpAQCAtMTIxOCw2ICsxMjgyLDcgQEAKICMgQ09ORklHX1VTQl9TVE9SQUdFX0FMQVVEQSBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfU1RPUkFHRV9PTkVUT1VDSCBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfU1RPUkFHRV9LQVJNQSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9DWVBSRVNTX0FUQUNCIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9MSUJVU1VBTCBpcyBub3Qgc2V0CiAKICMKQEAgLTEyMjUsMTUgKzEyOTAsMTAgQEAKICMKICMgQ09ORklHX1VTQl9NREM4MDAgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX01JQ1JPVEVLIGlzIG5vdCBzZXQKLUNPTkZJR19VU0JfTU9OPXkKIAogIwogIyBVU0IgcG9ydCBkcml2ZXJzCiAjCi0KLSMKLSMgVVNCIFNlcmlhbCBDb252ZXJ0ZXIgc3VwcG9ydAotIwogIyBDT05GSUdfVVNCX1NFUklBTCBpcyBub3Qgc2V0CiAKICMKQEAgLTEyNDIsNyArMTMwMiw3IEBACiAjIENPTkZJR19VU0JfRU1JNjIgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0VNSTI2IGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9BRFVUVVggaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0FVRVJTV0FMRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VWU0VHIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9SSU81MDAgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0xFR09UT1dFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfTENEIGlzIG5vdCBzZXQKQEAgLTEyNTgsMzQgKzEzMTgsMzEgQEAKICMgQ09ORklHX1VTQl9MRCBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfVFJBTkNFVklCUkFUT1IgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0lPV0FSUklPUiBpcyBub3Qgc2V0Ci0KLSMKLSMgVVNCIERTTCBtb2RlbSBzdXBwb3J0Ci0jCi0KLSMKLSMgVVNCIEdhZGdldCBTdXBwb3J0Ci0jCisjIENPTkZJR19VU0JfSVNJR0hURlcgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1ZTVCBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfR0FER0VUIGlzIG5vdCBzZXQKIENPTkZJR19NTUM9bQogIyBDT05GSUdfTU1DX0RFQlVHIGlzIG5vdCBzZXQKICMgQ09ORklHX01NQ19VTlNBRkVfUkVTVU1FIGlzIG5vdCBzZXQKIAogIwotIyBNTUMvU0QgQ2FyZCBEcml2ZXJzCisjIE1NQy9TRC9TRElPIENhcmQgRHJpdmVycwogIwogQ09ORklHX01NQ19CTE9DSz1tCiBDT05GSUdfTU1DX0JMT0NLX0JPVU5DRT15CiAjIENPTkZJR19TRElPX1VBUlQgaXMgbm90IHNldAorIyBDT05GSUdfTU1DX1RFU1QgaXMgbm90IHNldAogCiAjCi0jIE1NQy9TRCBIb3N0IENvbnRyb2xsZXIgRHJpdmVycworIyBNTUMvU0QvU0RJTyBIb3N0IENvbnRyb2xsZXIgRHJpdmVycwogIworIyBDT05GSUdfTU1DX1NESENJIGlzIG5vdCBzZXQKIENPTkZJR19TREhfQkZJTj1tCiAjIENPTkZJR19TREhfQkZJTl9NSVNTSU5HX0NNRF9QVUxMVVBfV09SS0FST1VORCBpcyBub3Qgc2V0CiAjIENPTkZJR19NTUNfU1BJIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NQSV9NTUMgaXMgbm90IHNldAorIyBDT05GSUdfTUVNU1RJQ0sgaXMgbm90IHNldAogIyBDT05GSUdfTkVXX0xFRFMgaXMgbm90IHNldAorIyBDT05GSUdfQUNDRVNTSUJJTElUWSBpcyBub3Qgc2V0CiBDT05GSUdfUlRDX0xJQj15CiBDT05GSUdfUlRDX0NMQVNTPXkKIENPTkZJR19SVENfSENUT1NZUz15CkBAIC0xMzE0LDMyICsxMzcxLDQwIEBACiAjIENPTkZJR19SVENfRFJWX1BDRjg1NjMgaXMgbm90IHNldAogIyBDT05GSUdfUlRDX0RSVl9QQ0Y4NTgzIGlzIG5vdCBzZXQKICMgQ09ORklHX1JUQ19EUlZfTTQxVDgwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfUzM1MzkwQSBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0ZNMzEzMCBpcyBub3Qgc2V0CiAKICMKICMgU1BJIFJUQyBkcml2ZXJzCiAjCi0jIENPTkZJR19SVENfRFJWX1JTNUMzNDggaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9NNDFUOTQgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9EUzEzMDUgaXMgbm90IHNldAogIyBDT05GSUdfUlRDX0RSVl9NQVg2OTAyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfUjk3MDEgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9SUzVDMzQ4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfRFMzMjM0IGlzIG5vdCBzZXQKIAogIwogIyBQbGF0Zm9ybSBSVEMgZHJpdmVycwogIworIyBDT05GSUdfUlRDX0RSVl9EUzEyODYgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9EUzE1MTEgaXMgbm90IHNldAogIyBDT05GSUdfUlRDX0RSVl9EUzE1NTMgaXMgbm90IHNldAotIyBDT05GSUdfUlRDX0RSVl9TVEsxN1RBOCBpcyBub3Qgc2V0CiAjIENPTkZJR19SVENfRFJWX0RTMTc0MiBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1NUSzE3VEE4IGlzIG5vdCBzZXQKICMgQ09ORklHX1JUQ19EUlZfTTQ4VDg2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfTTQ4VDM1IGlzIG5vdCBzZXQKICMgQ09ORklHX1JUQ19EUlZfTTQ4VDU5IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfQlE0ODAyIGlzIG5vdCBzZXQKICMgQ09ORklHX1JUQ19EUlZfVjMwMjAgaXMgbm90IHNldAogCiAjCiAjIG9uLUNQVSBSVEMgZHJpdmVycwogIwogQ09ORklHX1JUQ19EUlZfQkZJTj15Ci0KLSMKLSMgVXNlcnNwYWNlIEkvTwotIworIyBDT05GSUdfRE1BREVWSUNFUyBpcyBub3Qgc2V0CiAjIENPTkZJR19VSU8gaXMgbm90IHNldAorIyBDT05GSUdfU1RBR0lORyBpcyBub3Qgc2V0CiAKICMKICMgRmlsZSBzeXN0ZW1zCkBAIC0xMzUyLDIyICsxNDE3LDIwIEBACiBDT05GSUdfRVhUM19GU19YQVRUUj15CiAjIENPTkZJR19FWFQzX0ZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CiAjIENPTkZJR19FWFQzX0ZTX1NFQ1VSSVRZIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VYVDRERVZfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRVhUNF9GUyBpcyBub3Qgc2V0CiBDT05GSUdfSkJEPXkKICMgQ09ORklHX0pCRF9ERUJVRyBpcyBub3Qgc2V0CiBDT05GSUdfRlNfTUJDQUNIRT15CiAjIENPTkZJR19SRUlTRVJGU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19KRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKK0NPTkZJR19GSUxFX0xPQ0tJTkc9eQogIyBDT05GSUdfWEZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0dGUzJfRlMgaXMgbm90IHNldAogIyBDT05GSUdfT0NGUzJfRlMgaXMgbm90IHNldAotIyBDT05GSUdfTUlOSVhfRlMgaXMgbm90IHNldAotIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRE5PVElGWSBpcyBub3Qgc2V0CiBDT05GSUdfSU5PVElGWT15CiBDT05GSUdfSU5PVElGWV9VU0VSPXkKICMgQ09ORklHX1FVT1RBIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ROT1RJRlkgaXMgbm90IHNldAogIyBDT05GSUdfQVVUT0ZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0FVVE9GUzRfRlMgaXMgbm90IHNldAogIyBDT05GSUdfRlVTRV9GUyBpcyBub3Qgc2V0CkBAIC0xNDE0LDExICsxNDc3LDExIEBACiAjIENPTkZJR19FRlNfRlMgaXMgbm90IHNldAogQ09ORklHX1lBRkZTX0ZTPW0KIENPTkZJR19ZQUZGU19ZQUZGUzE9eQorIyBDT05GSUdfWUFGRlNfOUJZVEVfVEFHUyBpcyBub3Qgc2V0CiAjIENPTkZJR19ZQUZGU19ET0VTX0VDQyBpcyBub3Qgc2V0CiBDT05GSUdfWUFGRlNfWUFGRlMyPXkKIENPTkZJR19ZQUZGU19BVVRPX1lBRkZTMj15CiAjIENPTkZJR19ZQUZGU19ESVNBQkxFX0xBWllfTE9BRCBpcyBub3Qgc2V0Ci1DT05GSUdfWUFGRlNfQ0hFQ0tQT0lOVF9SRVNFUlZFRF9CTE9DS1M9MTAKICMgQ09ORklHX1lBRkZTX0RJU0FCTEVfV0lERV9UTk9ERVMgaXMgbm90IHNldAogIyBDT05GSUdfWUFGRlNfQUxXQVlTX0NIRUNLX0NIVU5LX0VSQVNFRCBpcyBub3Qgc2V0CiBDT05GSUdfWUFGRlNfU0hPUlRfTkFNRVNfSU5fUkFNPXkKQEAgLTE0MzUsOCArMTQ5OCwxMSBAQAogIyBDT05GSUdfSkZGUzJfUlVCSU4gaXMgbm90IHNldAogIyBDT05GSUdfQ1JBTUZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1ZYRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTUlOSVhfRlMgaXMgbm90IHNldAorIyBDT05GSUdfT01GU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19IUEZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1FOWDRGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19ST01GU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TWVNWX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1VGU19GUyBpcyBub3Qgc2V0CiBDT05GSUdfTkVUV09SS19GSUxFU1lTVEVNUz15CkBAIC0xNDQ0LDE4ICsxNTEwLDE2IEBACiBDT05GSUdfTkZTX1YzPXkKICMgQ09ORklHX05GU19WM19BQ0wgaXMgbm90IHNldAogIyBDT05GSUdfTkZTX1Y0IGlzIG5vdCBzZXQKLSMgQ09ORklHX05GU19ESVJFQ1RJTyBpcyBub3Qgc2V0CiBDT05GSUdfTkZTRD1tCiBDT05GSUdfTkZTRF9WMz15CiAjIENPTkZJR19ORlNEX1YzX0FDTCBpcyBub3Qgc2V0CiAjIENPTkZJR19ORlNEX1Y0IGlzIG5vdCBzZXQKLUNPTkZJR19ORlNEX1RDUD15CiBDT05GSUdfTE9DS0Q9bQogQ09ORklHX0xPQ0tEX1Y0PXkKIENPTkZJR19FWFBPUlRGUz1tCiBDT05GSUdfTkZTX0NPTU1PTj15CiBDT05GSUdfU1VOUlBDPW0KLSMgQ09ORklHX1NVTlJQQ19CSU5EMzQgaXMgbm90IHNldAorIyBDT05GSUdfU1VOUlBDX1JFR0lTVEVSX1Y0IGlzIG5vdCBzZXQKICMgQ09ORklHX1JQQ1NFQ19HU1NfS1JCNSBpcyBub3Qgc2V0CiAjIENPTkZJR19SUENTRUNfR1NTX1NQS00zIGlzIG5vdCBzZXQKIENPTkZJR19TTUJfRlM9bQpAQCAtMTUzMyw5ICsxNTk3LDYgQEAKIENPTkZJR19OTFNfS09JOF9VPW0KIENPTkZJR19OTFNfVVRGOD1tCiAjIENPTkZJR19ETE0gaXMgbm90IHNldAotQ09ORklHX0lOU1RSVU1FTlRBVElPTj15Ci0jIENPTkZJR19QUk9GSUxJTkcgaXMgbm90IHNldAotIyBDT05GSUdfTUFSS0VSUyBpcyBub3Qgc2V0CiAKICMKICMgS2VybmVsIGhhY2tpbmcKQEAgLTE1NDMsMTQgKzE2MDQsNTMgQEAKICMgQ09ORklHX1BSSU5US19USU1FIGlzIG5vdCBzZXQKIENPTkZJR19FTkFCTEVfV0FSTl9ERVBSRUNBVEVEPXkKIENPTkZJR19FTkFCTEVfTVVTVF9DSEVDSz15CitDT05GSUdfRlJBTUVfV0FSTj0xMDI0CiAjIENPTkZJR19NQUdJQ19TWVNSUSBpcyBub3Qgc2V0CiAjIENPTkZJR19VTlVTRURfU1lNQk9MUyBpcyBub3Qgc2V0CiBDT05GSUdfREVCVUdfRlM9eQogIyBDT05GSUdfSEVBREVSU19DSEVDSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19LRVJORUwgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX0tFUk5FTD15CisjIENPTkZJR19ERUJVR19TSElSUSBpcyBub3Qgc2V0CitDT05GSUdfREVURUNUX1NPRlRMT0NLVVA9eQorIyBDT05GSUdfQk9PVFBBUkFNX1NPRlRMT0NLVVBfUEFOSUMgaXMgbm90IHNldAorQ09ORklHX0JPT1RQQVJBTV9TT0ZUTE9DS1VQX1BBTklDX1ZBTFVFPTAKK0NPTkZJR19TQ0hFRF9ERUJVRz15CisjIENPTkZJR19TQ0hFRFNUQVRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RJTUVSX1NUQVRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX09CSkVDVFMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU0xBQiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19SVF9NVVRFWEVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUX01VVEVYX1RFU1RFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TUElOTE9DSyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19NVVRFWEVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NQSU5MT0NLX1NMRUVQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0xPQ0tJTkdfQVBJX1NFTEZURVNUUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19LT0JKRUNUIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX0JVR1ZFUkJPU0UgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX0lORk89eQorIyBDT05GSUdfREVCVUdfVk0gaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfV1JJVEVDT1VOVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19NRU1PUllfSU5JVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19MSVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZSQU1FX1BPSU5URVIgaXMgbm90IHNldAorIyBDT05GSUdfQk9PVF9QUklOVEtfREVMQVkgaXMgbm90IHNldAorIyBDT05GSUdfUkNVX1RPUlRVUkVfVEVTVCBpcyBub3Qgc2V0CisjIENPTkZJR19SQ1VfQ1BVX1NUQUxMX0RFVEVDVE9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JBQ0tUUkFDRV9TRUxGX1RFU1QgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfQkxPQ0tfRVhUX0RFVlQgaXMgbm90IHNldAorIyBDT05GSUdfRkFVTFRfSU5KRUNUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU0NUTF9TWVNDQUxMX0NIRUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RZTkFNSUNfUFJJTlRLX0RFQlVHIGlzIG5vdCBzZXQKICMgQ09ORklHX1NBTVBMRVMgaXMgbm90IHNldAorQ09ORklHX0hBVkVfQVJDSF9LR0RCPXkKKyMgQ09ORklHX0tHREIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU1RBQ0tPVkVSRkxPVyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TVEFDS19VU0FHRSBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfVkVSQk9TRT15CiBDT05GSUdfREVCVUdfTU1SUz15CisjIENPTkZJR19ERUJVR19IV0VSUiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19ET1VCTEVGQVVMVCBpcyBub3Qgc2V0CiBDT05GSUdfREVCVUdfSFVOVF9GT1JfWkVSTz15CiBDT05GSUdfREVCVUdfQkZJTl9IV1RSQUNFX09OPXkKIENPTkZJR19ERUJVR19CRklOX0hXVFJBQ0VfQ09NUFJFU1NJT05fT0ZGPXkKQEAgLTE1NjgsMTAgKzE2NjgsOTUgQEAKICMKICMgQ09ORklHX0tFWVMgaXMgbm90IHNldAogQ09ORklHX1NFQ1VSSVRZPXkKKyMgQ09ORklHX1NFQ1VSSVRZRlMgaXMgbm90IHNldAogIyBDT05GSUdfU0VDVVJJVFlfTkVUV09SSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRUNVUklUWV9DQVBBQklMSVRJRVMgaXMgbm90IHNldAorIyBDT05GSUdfU0VDVVJJVFlfRklMRV9DQVBBQklMSVRJRVMgaXMgbm90IHNldAogIyBDT05GSUdfU0VDVVJJVFlfUk9PVFBMVUcgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPIGlzIG5vdCBzZXQKK0NPTkZJR19TRUNVUklUWV9ERUZBVUxUX01NQVBfTUlOX0FERFI9MAorQ09ORklHX0NSWVBUTz15CisKKyMKKyMgQ3J5cHRvIGNvcmUgb3IgaGVscGVyCisjCisjIENPTkZJR19DUllQVE9fRklQUyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTUFOQUdFUiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fR0YxMjhNVUwgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX05VTEwgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NSWVBURCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQVVUSEVOQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fVEVTVCBpcyBub3Qgc2V0CisKKyMKKyMgQXV0aGVudGljYXRlZCBFbmNyeXB0aW9uIHdpdGggQXNzb2NpYXRlZCBEYXRhCisjCisjIENPTkZJR19DUllQVE9fQ0NNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19HQ00gaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NFUUlWIGlzIG5vdCBzZXQKKworIworIyBCbG9jayBtb2RlcworIworIyBDT05GSUdfQ1JZUFRPX0NCQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ1RSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DVFMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0VDQiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTFJXIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19QQ0JDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19YVFMgaXMgbm90IHNldAorCisjCisjIEhhc2ggbW9kZXMKKyMKKyMgQ09ORklHX0NSWVBUT19ITUFDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19YQ0JDIGlzIG5vdCBzZXQKKworIworIyBEaWdlc3QKKyMKKyMgQ09ORklHX0NSWVBUT19DUkMzMkMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX01ENCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTUQ1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19NSUNIQUVMX01JQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fUk1EMTI4IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19STUQxNjAgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1JNRDI1NiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fUk1EMzIwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TSEExIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TSEEyNTYgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NIQTUxMiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fVEdSMTkyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19XUDUxMiBpcyBub3Qgc2V0CisKKyMKKyMgQ2lwaGVycworIworIyBDT05GSUdfQ1JZUFRPX0FFUyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQU5VQklTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19BUkM0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19CTE9XRklTSCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ0FNRUxMSUEgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NBU1Q1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DQVNUNiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fREVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19GQ1JZUFQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0tIQVpBRCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0FMU0EyMCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0VFRCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0VSUEVOVCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fVEVBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19UV09GSVNIIGlzIG5vdCBzZXQKKworIworIyBDb21wcmVzc2lvbgorIworIyBDT05GSUdfQ1JZUFRPX0RFRkxBVEUgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0xaTyBpcyBub3Qgc2V0CisKKyMKKyMgUmFuZG9tIE51bWJlciBHZW5lcmF0aW9uCisjCisjIENPTkZJR19DUllQVE9fQU5TSV9DUFJORyBpcyBub3Qgc2V0CitDT05GSUdfQ1JZUFRPX0hXPXkKIAogIwogIyBMaWJyYXJ5IHJvdXRpbmVzCkBAIC0xNTc5LDYgKzE3NjQsNyBAQAogQ09ORklHX0JJVFJFVkVSU0U9eQogQ09ORklHX0NSQ19DQ0lUVD1tCiAjIENPTkZJR19DUkMxNiBpcyBub3Qgc2V0CisjIENPTkZJR19DUkNfVDEwRElGIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSQ19JVFVfVCBpcyBub3Qgc2V0CiBDT05GSUdfQ1JDMzI9eQogIyBDT05GSUdfQ1JDNyBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvQkY1NjEtRVpLSVRfZGVmY29uZmlnIGIvYXJjaC9ibGFja2Zpbi9jb25maWdzL0JGNTYxLUVaS0lUX2RlZmNvbmZpZwppbmRleCAzYzcwZDYyLi4xZWNiN2EzIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvQkY1NjEtRVpLSVRfZGVmY29uZmlnCisrKyBiL2FyY2gvYmxhY2tmaW4vY29uZmlncy9CRjU2MS1FWktJVF9kZWZjb25maWcKQEAgLTEsNiArMSw2IEBACiAjCiAjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0Ci0jIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMjQuNworIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjI4LXJjMgogIwogIyBDT05GSUdfTU1VIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZQVSBpcyBub3Qgc2V0CkBAIC04LDcgKzgsNiBAQAogIyBDT05GSUdfUldTRU1fWENIR0FERF9BTEdPUklUSE0gaXMgbm90IHNldAogQ09ORklHX0JMQUNLRklOPXkKIENPTkZJR19aT05FX0RNQT15Ci1DT05GSUdfU0VNQVBIT1JFX1NMRUVQRVJTPXkKIENPTkZJR19HRU5FUklDX0ZJTkRfTkVYVF9CSVQ9eQogQ09ORklHX0dFTkVSSUNfSFdFSUdIVD15CiBDT05GSUdfR0VORVJJQ19IQVJESVJRUz15CkBAIC0zMSwxOCArMzAsMTYgQEAKICMgQ09ORklHX1BPU0lYX01RVUVVRSBpcyBub3Qgc2V0CiAjIENPTkZJR19CU0RfUFJPQ0VTU19BQ0NUIGlzIG5vdCBzZXQKICMgQ09ORklHX1RBU0tTVEFUUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0VSX05TIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BJRF9OUyBpcyBub3Qgc2V0CiAjIENPTkZJR19BVURJVCBpcyBub3Qgc2V0CiBDT05GSUdfSUtDT05GSUc9eQogQ09ORklHX0lLQ09ORklHX1BST0M9eQogQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKICMgQ09ORklHX0NHUk9VUFMgaXMgbm90IHNldAotQ09ORklHX0ZBSVJfR1JPVVBfU0NIRUQ9eQotQ09ORklHX0ZBSVJfVVNFUl9TQ0hFRD15Ci0jIENPTkZJR19GQUlSX0NHUk9VUF9TQ0hFRCBpcyBub3Qgc2V0Ci1DT05GSUdfU1lTRlNfREVQUkVDQVRFRD15CisjIENPTkZJR19HUk9VUF9TQ0hFRCBpcyBub3Qgc2V0CisjIENPTkZJR19TWVNGU19ERVBSRUNBVEVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU0ZTX0RFUFJFQ0FURURfVjIgaXMgbm90IHNldAogIyBDT05GSUdfUkVMQVkgaXMgbm90IHNldAorIyBDT05GSUdfTkFNRVNQQUNFUyBpcyBub3Qgc2V0CiBDT05GSUdfQkxLX0RFVl9JTklUUkQ9eQogQ09ORklHX0lOSVRSQU1GU19TT1VSQ0U9IiIKICMgQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFIGlzIG5vdCBzZXQKQEAgLTUxLDI2ICs0OCwzNSBAQAogQ09ORklHX1VJRDE2PXkKIENPTkZJR19TWVNDVExfU1lTQ0FMTD15CiBDT05GSUdfS0FMTFNZTVM9eQorIyBDT05GSUdfS0FMTFNZTVNfQUxMIGlzIG5vdCBzZXQKICMgQ09ORklHX0tBTExTWU1TX0VYVFJBX1BBU1MgaXMgbm90IHNldAogQ09ORklHX0hPVFBMVUc9eQogQ09ORklHX1BSSU5USz15CiBDT05GSUdfQlVHPXkKLUNPTkZJR19FTEZfQ09SRT15CisjIENPTkZJR19FTEZfQ09SRSBpcyBub3Qgc2V0CitDT05GSUdfQ09NUEFUX0JSSz15CiBDT05GSUdfQkFTRV9GVUxMPXkKIENPTkZJR19GVVRFWD15CiBDT05GSUdfQU5PTl9JTk9ERVM9eQogQ09ORklHX0VQT0xMPXkKIENPTkZJR19TSUdOQUxGRD15CitDT05GSUdfVElNRVJGRD15CiBDT05GSUdfRVZFTlRGRD15CitDT05GSUdfQUlPPXkKIENPTkZJR19WTV9FVkVOVF9DT1VOVEVSUz15CiBDT05GSUdfU0xBQj15CiAjIENPTkZJR19TTFVCIGlzIG5vdCBzZXQKICMgQ09ORklHX1NMT0IgaXMgbm90IHNldAorIyBDT05GSUdfUFJPRklMSU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BUktFUlMgaXMgbm90IHNldAorQ09ORklHX0hBVkVfT1BST0ZJTEU9eQorIyBDT05GSUdfSEFWRV9HRU5FUklDX0RNQV9DT0hFUkVOVCBpcyBub3Qgc2V0CiBDT05GSUdfU0xBQklORk89eQogQ09ORklHX1JUX01VVEVYRVM9eQogQ09ORklHX1RJTllfU0hNRU09eQogQ09ORklHX0JBU0VfU01BTEw9MAogQ09ORklHX01PRFVMRVM9eQorIyBDT05GSUdfTU9EVUxFX0ZPUkNFX0xPQUQgaXMgbm90IHNldAogQ09ORklHX01PRFVMRV9VTkxPQUQ9eQogIyBDT05GSUdfTU9EVUxFX0ZPUkNFX1VOTE9BRCBpcyBub3Qgc2V0CiAjIENPTkZJR19NT0RWRVJTSU9OUyBpcyBub3Qgc2V0CkBAIC04MSw2ICs4Nyw3IEBACiAjIENPTkZJR19CTEtfREVWX0lPX1RSQUNFIGlzIG5vdCBzZXQKICMgQ09ORklHX0xTRiBpcyBub3Qgc2V0CiAjIENPTkZJR19CTEtfREVWX0JTRyBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0lOVEVHUklUWSBpcyBub3Qgc2V0CiAKICMKICMgSU8gU2NoZWR1bGVycwpAQCAtOTQsOSArMTAxLDExIEBACiAjIENPTkZJR19ERUZBVUxUX0NGUSBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUZBVUxUX05PT1AgaXMgbm90IHNldAogQ09ORklHX0RFRkFVTFRfSU9TQ0hFRD0iYW50aWNpcGF0b3J5IgorQ09ORklHX0NMQVNTSUNfUkNVPXkKICMgQ09ORklHX1BSRUVNUFRfTk9ORSBpcyBub3Qgc2V0CiBDT05GSUdfUFJFRU1QVF9WT0xVTlRBUlk9eQogIyBDT05GSUdfUFJFRU1QVCBpcyBub3Qgc2V0CisjIENPTkZJR19GUkVFWkVSIGlzIG5vdCBzZXQKIAogIwogIyBCbGFja2ZpbiBQcm9jZXNzb3IgT3B0aW9ucwpAQCAtMTA1LDYgKzExNCwxMCBAQAogIwogIyBQcm9jZXNzb3IgYW5kIEJvYXJkIFNldHRpbmdzCiAjCisjIENPTkZJR19CRjUxMiBpcyBub3Qgc2V0CisjIENPTkZJR19CRjUxNCBpcyBub3Qgc2V0CisjIENPTkZJR19CRjUxNiBpcyBub3Qgc2V0CisjIENPTkZJR19CRjUxOCBpcyBub3Qgc2V0CiAjIENPTkZJR19CRjUyMiBpcyBub3Qgc2V0CiAjIENPTkZJR19CRjUyMyBpcyBub3Qgc2V0CiAjIENPTkZJR19CRjUyNCBpcyBub3Qgc2V0CkBAIC0xMTcsMjQgKzEzMCwzOCBAQAogIyBDT05GSUdfQkY1MzQgaXMgbm90IHNldAogIyBDT05GSUdfQkY1MzYgaXMgbm90IHNldAogIyBDT05GSUdfQkY1MzcgaXMgbm90IHNldAorIyBDT05GSUdfQkY1MzggaXMgbm90IHNldAorIyBDT05GSUdfQkY1MzkgaXMgbm90IHNldAogIyBDT05GSUdfQkY1NDIgaXMgbm90IHNldAogIyBDT05GSUdfQkY1NDQgaXMgbm90IHNldAogIyBDT05GSUdfQkY1NDcgaXMgbm90IHNldAogIyBDT05GSUdfQkY1NDggaXMgbm90IHNldAogIyBDT05GSUdfQkY1NDkgaXMgbm90IHNldAogQ09ORklHX0JGNTYxPXkKKyMgQ09ORklHX1NNUCBpcyBub3Qgc2V0CitDT05GSUdfQkZfUkVWX01JTj0zCitDT05GSUdfQkZfUkVWX01BWD01CiAjIENPTkZJR19CRl9SRVZfMF8wIGlzIG5vdCBzZXQKICMgQ09ORklHX0JGX1JFVl8wXzEgaXMgbm90IHNldAogIyBDT05GSUdfQkZfUkVWXzBfMiBpcyBub3Qgc2V0CiBDT05GSUdfQkZfUkVWXzBfMz15CiAjIENPTkZJR19CRl9SRVZfMF80IGlzIG5vdCBzZXQKICMgQ09ORklHX0JGX1JFVl8wXzUgaXMgbm90IHNldAorIyBDT05GSUdfQkZfUkVWXzBfNiBpcyBub3Qgc2V0CiAjIENPTkZJR19CRl9SRVZfQU5ZIGlzIG5vdCBzZXQKICMgQ09ORklHX0JGX1JFVl9OT05FIGlzIG5vdCBzZXQKIENPTkZJR19NRU1fTVQ0OExDMTZNMTZBMlRHXzc1PXkKIENPTkZJR19JUlFfUExMX1dBS0VVUD03CiBDT05GSUdfSVJRX1NQT1JUMF9FUlJPUj03CiBDT05GSUdfSVJRX1NQT1JUMV9FUlJPUj03CitDT05GSUdfSVJRX1RJTUVSMD0xMAorQ09ORklHX0lSUV9USU1FUjE9MTAKK0NPTkZJR19JUlFfVElNRVIyPTEwCitDT05GSUdfSVJRX1RJTUVSMz0xMAorQ09ORklHX0lSUV9USU1FUjQ9MTAKK0NPTkZJR19JUlFfVElNRVI1PTEwCitDT05GSUdfSVJRX1RJTUVSNj0xMAorQ09ORklHX0lSUV9USU1FUjc9MTAKIENPTkZJR19JUlFfU1BJX0VSUk9SPTcKIENPTkZJR19CRklONTYxX0VaS0lUPXkKICMgQ09ORklHX0JGSU41NjFfVEVQTEEgaXMgbm90IHNldApAQCAtMTQ4LDEwICsxNzUsNiBAQAogIwogIyBDb3JlIEIgU3VwcG9ydAogIwotCi0jCi0jIENvcmUgQiBTdXBwb3J0Ci0jCiBDT05GSUdfQkY1NjFfQ09SRUI9eQogQ09ORklHX0JGNTYxX0NPUkVCX1JFU0VUPXkKIApAQCAtMTkzLDE0ICsyMTYsNiBAQAogQ09ORklHX0lSUV9ETUEyXzk9OQogQ09ORklHX0lSUV9ETUEyXzEwPTkKIENPTkZJR19JUlFfRE1BMl8xMT05Ci1DT05GSUdfSVJRX1RJTUVSMD0xMAotQ09ORklHX0lSUV9USU1FUjE9MTAKLUNPTkZJR19JUlFfVElNRVIyPTEwCi1DT05GSUdfSVJRX1RJTUVSMz0xMAotQ09ORklHX0lSUV9USU1FUjQ9MTAKLUNPTkZJR19JUlFfVElNRVI1PTEwCi1DT05GSUdfSVJRX1RJTUVSNj0xMAotQ09ORklHX0lSUV9USU1FUjc9MTAKIENPTkZJR19JUlFfVElNRVI4PTEwCiBDT05GSUdfSVJRX1RJTUVSOT0xMAogQ09ORklHX0lSUV9USU1FUjEwPTEwCkBAIC0yMzAsNyArMjQ1LDYgQEAKICMKIENPTkZJR19DTEtJTl9IWj0zMDAwMDAwMAogIyBDT05GSUdfQkZJTl9LRVJORUxfQ0xPQ0sgaXMgbm90IHNldAotQ09ORklHX01BWF9NRU1fU0laRT01MTIKIENPTkZJR19NQVhfVkNPX0haPTYwMDAwMDAwMAogQ09ORklHX01JTl9WQ09fSFo9NTAwMDAwMDAKIENPTkZJR19NQVhfU0NMS19IWj0xMzMzMzMzMzMKQEAgLTI0NCw2ICsyNTgsNyBAQAogIyBDT05GSUdfSFpfMzAwIGlzIG5vdCBzZXQKICMgQ09ORklHX0haXzEwMDAgaXMgbm90IHNldAogQ09ORklHX0haPTI1MAorQ09ORklHX1NDSEVEX0hSVElDSz15CiBDT05GSUdfR0VORVJJQ19USU1FPXkKIENPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTPXkKICMgQ09ORklHX0NZQ0xFU19DTE9DS1NPVVJDRSBpcyBub3Qgc2V0CkBAIC0yODEsNiArMjk2LDEyIEBACiBDT05GSUdfQ0FDSEVMSU5FX0FMSUdORURfTDE9eQogIyBDT05GSUdfU1lTQ0FMTF9UQUJfTDEgaXMgbm90IHNldAogIyBDT05GSUdfQ1BMQl9TV0lUQ0hfVEFCX0wxIGlzIG5vdCBzZXQKK0NPTkZJR19BUFBfU1RBQ0tfTDE9eQorCisjCisjIFNwZWVkIE9wdGltaXphdGlvbnMKKyMKK0NPTkZJR19CRklOX0lOU19MT1dPVkVSSEVBRD15CiBDT05GSUdfUkFNS0VSTkVMPXkKICMgQ09ORklHX1JPTUtFUk5FTCBpcyBub3Qgc2V0CiBDT05GSUdfU0VMRUNUX01FTU9SWV9NT0RFTD15CkBAIC0yODksMTQgKzMxMCwxMyBAQAogIyBDT05GSUdfU1BBUlNFTUVNX01BTlVBTCBpcyBub3Qgc2V0CiBDT05GSUdfRkxBVE1FTT15CiBDT05GSUdfRkxBVF9OT0RFX01FTV9NQVA9eQotIyBDT05GSUdfU1BBUlNFTUVNX1NUQVRJQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TUEFSU0VNRU1fVk1FTU1BUF9FTkFCTEUgaXMgbm90IHNldAorQ09ORklHX1BBR0VGTEFHU19FWFRFTkRFRD15CiBDT05GSUdfU1BMSVRfUFRMT0NLX0NQVVM9NAogIyBDT05GSUdfUkVTT1VSQ0VTXzY0QklUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BIWVNfQUREUl9UXzY0QklUIGlzIG5vdCBzZXQKIENPTkZJR19aT05FX0RNQV9GTEFHPTEKIENPTkZJR19WSVJUX1RPX0JVUz15CiAjIENPTkZJR19CRklOX0dQVElNRVJTIGlzIG5vdCBzZXQKLUNPTkZJR19CRklOX0RNQV81WFg9eQogIyBDT05GSUdfRE1BX1VOQ0FDSEVEXzRNIGlzIG5vdCBzZXQKICMgQ09ORklHX0RNQV9VTkNBQ0hFRF8yTSBpcyBub3Qgc2V0CiBDT05GSUdfRE1BX1VOQ0FDSEVEXzFNPXkKQEAgLTMxMSw3ICszMzEsNyBAQAogIyBDT05GSUdfQkZJTl9JQ0FDSEVfTE9DSyBpcyBub3Qgc2V0CiAjIENPTkZJR19CRklOX1dCIGlzIG5vdCBzZXQKIENPTkZJR19CRklOX1dUPXkKLUNPTkZJR19MMV9NQVhfUElFQ0U9MTYKKyMgQ09ORklHX0JGSU5fTDJfQ0FDSEVBQkxFIGlzIG5vdCBzZXQKICMgQ09ORklHX01QVSBpcyBub3Qgc2V0CiAKICMKQEAgLTM0NCw3ICszNjQsNiBAQAogIwogIyBCdXMgb3B0aW9ucyAoUENJLCBQQ01DSUEsIEVJU0EsIE1DQSwgSVNBKQogIwotIyBDT05GSUdfUENJIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfU1VQUE9SVFNfTVNJIGlzIG5vdCBzZXQKICMgQ09ORklHX1BDQ0FSRCBpcyBub3Qgc2V0CiAKQEAgLTM1NSwyMyArMzc0LDIwIEBACiBDT05GSUdfQklORk1UX0ZMQVQ9eQogQ09ORklHX0JJTkZNVF9aRkxBVD15CiAjIENPTkZJR19CSU5GTVRfU0hBUkVEX0ZMQVQgaXMgbm90IHNldAorIyBDT05GSUdfSEFWRV9BT1VUIGlzIG5vdCBzZXQKICMgQ09ORklHX0JJTkZNVF9NSVNDIGlzIG5vdCBzZXQKIAogIwogIyBQb3dlciBtYW5hZ2VtZW50IG9wdGlvbnMKICMKICMgQ09ORklHX1BNIGlzIG5vdCBzZXQKLUNPTkZJR19TVVNQRU5EX1VQX1BPU1NJQkxFPXkKK0NPTkZJR19BUkNIX1NVU1BFTkRfUE9TU0lCTEU9eQogIyBDT05GSUdfUE1fV0FLRVVQX0JZX0dQSU8gaXMgbm90IHNldAogCiAjCiAjIENQVSBGcmVxdWVuY3kgc2NhbGluZwogIwogIyBDT05GSUdfQ1BVX0ZSRVEgaXMgbm90IHNldAotCi0jCi0jIE5ldHdvcmtpbmcKLSMKIENPTkZJR19ORVQ9eQogCiAjCkBAIC0zODQsNiArNDAwLDcgQEAKICMgQ09ORklHX1hGUk1fVVNFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19YRlJNX1NVQl9QT0xJQ1kgaXMgbm90IHNldAogIyBDT05GSUdfWEZSTV9NSUdSQVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1hGUk1fU1RBVElTVElDUyBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRfS0VZIGlzIG5vdCBzZXQKIENPTkZJR19JTkVUPXkKICMgQ09ORklHX0lQX01VTFRJQ0FTVCBpcyBub3Qgc2V0CkBAIC00MTMsOCArNDMwLDYgQEAKIENPTkZJR19ERUZBVUxUX1RDUF9DT05HPSJjdWJpYyIKICMgQ09ORklHX1RDUF9NRDVTSUcgaXMgbm90IHNldAogIyBDT05GSUdfSVBWNiBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkVUNl9YRlJNX1RVTk5FTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkVUNl9UVU5ORUwgaXMgbm90IHNldAogIyBDT05GSUdfTkVUTEFCRUwgaXMgbm90IHNldAogIyBDT05GSUdfTkVUV09SS19TRUNNQVJLIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVEZJTFRFUiBpcyBub3Qgc2V0CkBAIC00MjMsNiArNDM4LDcgQEAKICMgQ09ORklHX1RJUEMgaXMgbm90IHNldAogIyBDT05GSUdfQVRNIGlzIG5vdCBzZXQKICMgQ09ORklHX0JSSURHRSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfRFNBIGlzIG5vdCBzZXQKICMgQ09ORklHX1ZMQU5fODAyMVEgaXMgbm90IHNldAogIyBDT05GSUdfREVDTkVUIGlzIG5vdCBzZXQKICMgQ09ORklHX0xMQzIgaXMgbm90IHNldApAQCAtNDM5LDYgKzQ1NSw3IEBACiAjCiAjIENPTkZJR19ORVRfUEtUR0VOIGlzIG5vdCBzZXQKICMgQ09ORklHX0hBTVJBRElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NBTiBpcyBub3Qgc2V0CiBDT05GSUdfSVJEQT1tCiAKICMKQEAgLTQ3MSwyNCArNDg4LDE0IEBACiAjIENPTkZJR19ET05HTEUgaXMgbm90IHNldAogCiAjCi0jIE9sZCBTSVIgZGV2aWNlIGRyaXZlcnMKLSMKLSMgQ09ORklHX0lSUE9SVF9TSVIgaXMgbm90IHNldAotCi0jCi0jIE9sZCBTZXJpYWwgZG9uZ2xlIHN1cHBvcnQKLSMKLQotIwogIyBGSVIgZGV2aWNlIGRyaXZlcnMKICMKICMgQ09ORklHX0JUIGlzIG5vdCBzZXQKICMgQ09ORklHX0FGX1JYUlBDIGlzIG5vdCBzZXQKLQotIwotIyBXaXJlbGVzcwotIworIyBDT05GSUdfUEhPTkVUIGlzIG5vdCBzZXQKK0NPTkZJR19XSVJFTEVTUz15CiAjIENPTkZJR19DRkc4MDIxMSBpcyBub3Qgc2V0CitDT05GSUdfV0lSRUxFU1NfT0xEX1JFR1VMQVRPUlk9eQogIyBDT05GSUdfV0lSRUxFU1NfRVhUIGlzIG5vdCBzZXQKICMgQ09ORklHX01BQzgwMjExIGlzIG5vdCBzZXQKICMgQ09ORklHX0lFRUU4MDIxMSBpcyBub3Qgc2V0CkBAIC01MDYsNiArNTEzLDggQEAKIENPTkZJR19TVEFOREFMT05FPXkKIENPTkZJR19QUkVWRU5UX0ZJUk1XQVJFX0JVSUxEPXkKICMgQ09ORklHX0ZXX0xPQURFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19EUklWRVIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfREVWUkVTIGlzIG5vdCBzZXQKICMgQ09ORklHX1NZU19IWVBFUlZJU09SIGlzIG5vdCBzZXQKICMgQ09ORklHX0NPTk5FQ1RPUiBpcyBub3Qgc2V0CiBDT05GSUdfTVREPXkKQEAgLTUxNCw2ICs1MjMsNyBAQAogQ09ORklHX01URF9QQVJUSVRJT05TPXkKICMgQ09ORklHX01URF9SRURCT09UX1BBUlRTIGlzIG5vdCBzZXQKIENPTkZJR19NVERfQ01ETElORV9QQVJUUz15CisjIENPTkZJR19NVERfQVI3X1BBUlRTIGlzIG5vdCBzZXQKIAogIwogIyBVc2VyIE1vZHVsZXMgQW5kIFRyYW5zbGF0aW9uIExheWVycwpAQCAtNTk1LDExICs2MDUsMTQgQEAKIENPTkZJR19CTEtfREVWX1JBTT15CiBDT05GSUdfQkxLX0RFVl9SQU1fQ09VTlQ9MTYKIENPTkZJR19CTEtfREVWX1JBTV9TSVpFPTQwOTYKLUNPTkZJR19CTEtfREVWX1JBTV9CTE9DS1NJWkU9MTAyNAorIyBDT05GSUdfQkxLX0RFVl9YSVAgaXMgbm90IHNldAogIyBDT05GSUdfQ0RST01fUEtUQ0RWRCBpcyBub3Qgc2V0CiAjIENPTkZJR19BVEFfT1ZFUl9FVEggaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9IRCBpcyBub3Qgc2V0CiBDT05GSUdfTUlTQ19ERVZJQ0VTPXkKICMgQ09ORklHX0VFUFJPTV85M0NYNiBpcyBub3Qgc2V0CisjIENPTkZJR19FTkNMT1NVUkVfU0VSVklDRVMgaXMgbm90IHNldAorQ09ORklHX0hBVkVfSURFPXkKICMgQ09ORklHX0lERSBpcyBub3Qgc2V0CiAKICMKQEAgLTYxMiw3ICs2MjUsNiBAQAogIyBDT05GSUdfQVRBIGlzIG5vdCBzZXQKICMgQ09ORklHX01EIGlzIG5vdCBzZXQKIENPTkZJR19ORVRERVZJQ0VTPXkKLSMgQ09ORklHX05FVERFVklDRVNfTVVMVElRVUVVRSBpcyBub3Qgc2V0CiAjIENPTkZJR19EVU1NWSBpcyBub3Qgc2V0CiAjIENPTkZJR19CT05ESU5HIGlzIG5vdCBzZXQKICMgQ09ORklHX01BQ1ZMQU4gaXMgbm90IHNldApAQCAtNjI1LDExICs2MzcsMTQgQEAKIENPTkZJR19TTUM5MVg9eQogIyBDT05GSUdfU01TQzkxMVggaXMgbm90IHNldAogIyBDT05GSUdfRE05MDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VOQzI4SjYwIGlzIG5vdCBzZXQKICMgQ09ORklHX0lCTV9ORVdfRU1BQ19aTUlJIGlzIG5vdCBzZXQKICMgQ09ORklHX0lCTV9ORVdfRU1BQ19SR01JSSBpcyBub3Qgc2V0CiAjIENPTkZJR19JQk1fTkVXX0VNQUNfVEFIIGlzIG5vdCBzZXQKICMgQ09ORklHX0lCTV9ORVdfRU1BQ19FTUFDNCBpcyBub3Qgc2V0Ci0jIENPTkZJR19CNDQgaXMgbm90IHNldAorIyBDT05GSUdfSUJNX05FV19FTUFDX05PX0ZMT1dfQ1RSTCBpcyBub3Qgc2V0CisjIENPTkZJR19JQk1fTkVXX0VNQUNfTUFMX0NMUl9JQ0lOVFNUQVQgaXMgbm90IHNldAorIyBDT05GSUdfSUJNX05FV19FTUFDX01BTF9DT01NT05fRVJSIGlzIG5vdCBzZXQKIENPTkZJR19ORVRERVZfMTAwMD15CiAjIENPTkZJR19BWDg4MTgwIGlzIG5vdCBzZXQKIENPTkZJR19ORVRERVZfMTAwMDA9eQpAQCAtNjM5LDEwICs2NTQsMTAgQEAKICMKICMgQ09ORklHX1dMQU5fUFJFODAyMTEgaXMgbm90IHNldAogIyBDT05GSUdfV0xBTl84MDIxMSBpcyBub3Qgc2V0CisjIENPTkZJR19JV0xXSUZJX0xFRFMgaXMgbm90IHNldAogIyBDT05GSUdfV0FOIGlzIG5vdCBzZXQKICMgQ09ORklHX1BQUCBpcyBub3Qgc2V0CiAjIENPTkZJR19TTElQIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIQVBFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRDT05TT0xFIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVFBPTEwgaXMgbm90IHNldAogIyBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUiBpcyBub3Qgc2V0CkBAIC02OTAsOCArNzA1LDExIEBACiAjIENPTkZJR19CRjV4eF9QUEkgaXMgbm90IHNldAogIyBDT05GSUdfQkZJTl9TUE9SVCBpcyBub3Qgc2V0CiAjIENPTkZJR19CRklOX1RJTUVSX0xBVEVOQ1kgaXMgbm90IHNldAorQ09ORklHX0JGSU5fRE1BX0lOVEVSRkFDRT1tCiBDT05GSUdfU0lNUExFX0dQSU89bQogIyBDT05GSUdfVlQgaXMgbm90IHNldAorIyBDT05GSUdfREVWS01FTSBpcyBub3Qgc2V0CisjIENPTkZJR19CRklOX0pUQUdfQ09NTSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRVJJQUxfTk9OU1RBTkRBUkQgaXMgbm90IHNldAogCiAjCkBAIC03MjAsMjIgKzczOCwxOSBAQAogIyBDT05GSUdfQ0FONExJTlVYIGlzIG5vdCBzZXQKICMgQ09ORklHX0lQTUlfSEFORExFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19IV19SQU5ET00gaXMgbm90IHNldAotIyBDT05GSUdfR0VOX1JUQyBpcyBub3Qgc2V0CiAjIENPTkZJR19SMzk2NCBpcyBub3Qgc2V0CiAjIENPTkZJR19SQVdfRFJJVkVSIGlzIG5vdCBzZXQKICMgQ09ORklHX1RDR19UUE0gaXMgbm90IHNldAogIyBDT05GSUdfSTJDIGlzIG5vdCBzZXQKLQotIwotIyBTUEkgc3VwcG9ydAotIwogQ09ORklHX1NQST15CisjIENPTkZJR19TUElfREVCVUcgaXMgbm90IHNldAogQ09ORklHX1NQSV9NQVNURVI9eQogCiAjCiAjIFNQSSBNYXN0ZXIgQ29udHJvbGxlciBEcml2ZXJzCiAjCiBDT05GSUdfU1BJX0JGSU49eQorIyBDT05GSUdfU1BJX0JGSU5fTE9DSyBpcyBub3Qgc2V0CiAjIENPTkZJR19TUElfQklUQkFORyBpcyBub3Qgc2V0CiAKICMKQEAgLTc0NCwxNCArNzU5LDE4IEBACiAjIENPTkZJR19TUElfQVQyNSBpcyBub3Qgc2V0CiAjIENPTkZJR19TUElfU1BJREVWIGlzIG5vdCBzZXQKICMgQ09ORklHX1NQSV9UTEU2MlgwIGlzIG5vdCBzZXQKK0NPTkZJR19BUkNIX1dBTlRfT1BUSU9OQUxfR1BJT0xJQj15CisjIENPTkZJR19HUElPTElCIGlzIG5vdCBzZXQKICMgQ09ORklHX1cxIGlzIG5vdCBzZXQKICMgQ09ORklHX1BPV0VSX1NVUFBMWSBpcyBub3Qgc2V0CiBDT05GSUdfSFdNT049eQogIyBDT05GSUdfSFdNT05fVklEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURDWFggaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19GNzE4MDVGIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfRjcxODgyRkcgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19JVDg3IGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfTE03MCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX01BWDExMTEgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19QQzg3MzYwIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfUEM4NzQyNyBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1NNU0M0N00xIGlzIG5vdCBzZXQKQEAgLTc2MCw2ICs3NzksOCBAQAogIyBDT05GSUdfU0VOU09SU19XODM2MjdIRiBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1c4MzYyN0VIRiBpcyBub3Qgc2V0CiAjIENPTkZJR19IV01PTl9ERUJVR19DSElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RIRVJNQUwgaXMgbm90IHNldAorIyBDT05GSUdfVEhFUk1BTF9IV01PTiBpcyBub3Qgc2V0CiBDT05GSUdfV0FUQ0hET0c9eQogIyBDT05GSUdfV0FUQ0hET0dfTk9XQVlPVVQgaXMgbm90IHNldAogCkBAIC03NzAsMjEgKzc5MSwyOCBAQAogQ09ORklHX0JGSU5fV0RUPXkKIAogIwotIyBTb25pY3MgU2lsaWNvbiBCYWNrcGxhbmUKLSMKLUNPTkZJR19TU0JfUE9TU0lCTEU9eQotIyBDT05GSUdfU1NCIGlzIG5vdCBzZXQKLQotIwogIyBNdWx0aWZ1bmN0aW9uIGRldmljZSBkcml2ZXJzCiAjCisjIENPTkZJR19NRkRfQ09SRSBpcyBub3Qgc2V0CiAjIENPTkZJR19NRkRfU001MDEgaXMgbm90IHNldAorIyBDT05GSUdfSFRDX1BBU0lDMyBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfVE1JTyBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfV004NDAwIGlzIG5vdCBzZXQKIAogIwogIyBNdWx0aW1lZGlhIGRldmljZXMKICMKKworIworIyBNdWx0aW1lZGlhIGNvcmUgc3VwcG9ydAorIwogIyBDT05GSUdfVklERU9fREVWIGlzIG5vdCBzZXQKICMgQ09ORklHX0RWQl9DT1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZJREVPX01FRElBIGlzIG5vdCBzZXQKKworIworIyBNdWx0aW1lZGlhIGRyaXZlcnMKKyMKICMgQ09ORklHX0RBQiBpcyBub3Qgc2V0CiAKICMKQEAgLTc5OSw0MyArODI3LDQzIEBACiAjIERpc3BsYXkgZGV2aWNlIHN1cHBvcnQKICMKICMgQ09ORklHX0RJU1BMQVlfU1VQUE9SVCBpcyBub3Qgc2V0Ci0KLSMKLSMgU291bmQKLSMKICMgQ09ORklHX1NPVU5EIGlzIG5vdCBzZXQKIENPTkZJR19ISURfU1VQUE9SVD15CiBDT05GSUdfSElEPW0KICMgQ09ORklHX0hJRF9ERUJVRyBpcyBub3Qgc2V0CiAjIENPTkZJR19ISURSQVcgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1NVUFBPUlQgaXMgbm90IHNldAotIyBDT05GSUdfTU1DIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FV19MRURTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1JUQ19DTEFTUyBpcyBub3Qgc2V0CisjIENPTkZJR19ISURfUElEIGlzIG5vdCBzZXQKIAogIwotIyBVc2Vyc3BhY2UgSS9PCisjIFNwZWNpYWwgSElEIGRyaXZlcnMKICMKK0NPTkZJR19ISURfQ09NUEFUPXkKKyMgQ09ORklHX1VTQl9TVVBQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX01NQyBpcyBub3Qgc2V0CisjIENPTkZJR19NRU1TVElDSyBpcyBub3Qgc2V0CisjIENPTkZJR19ORVdfTEVEUyBpcyBub3Qgc2V0CisjIENPTkZJR19BQ0NFU1NJQklMSVRZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19DTEFTUyBpcyBub3Qgc2V0CisjIENPTkZJR19ETUFERVZJQ0VTIGlzIG5vdCBzZXQKICMgQ09ORklHX1VJTyBpcyBub3Qgc2V0CisjIENPTkZJR19TVEFHSU5HIGlzIG5vdCBzZXQKIAogIwogIyBGaWxlIHN5c3RlbXMKICMKICMgQ09ORklHX0VYVDJfRlMgaXMgbm90IHNldAogIyBDT05GSUdfRVhUM19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19FWFQ0REVWX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDRfRlMgaXMgbm90IHNldAogIyBDT05GSUdfUkVJU0VSRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfSkZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CitDT05GSUdfRklMRV9MT0NLSU5HPXkKICMgQ09ORklHX1hGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19HRlMyX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX09DRlMyX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX01JTklYX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1JPTUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ROT1RJRlkgaXMgbm90IHNldAogQ09ORklHX0lOT1RJRlk9eQogQ09ORklHX0lOT1RJRllfVVNFUj15CiAjIENPTkZJR19RVU9UQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19ETk9USUZZIGlzIG5vdCBzZXQKICMgQ09ORklHX0FVVE9GU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19BVVRPRlM0X0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZVU0VfRlMgaXMgbm90IHNldApAQCAtODc1LDExICs5MDMsMTEgQEAKICMgQ09ORklHX0VGU19GUyBpcyBub3Qgc2V0CiBDT05GSUdfWUFGRlNfRlM9bQogQ09ORklHX1lBRkZTX1lBRkZTMT15CisjIENPTkZJR19ZQUZGU185QllURV9UQUdTIGlzIG5vdCBzZXQKICMgQ09ORklHX1lBRkZTX0RPRVNfRUNDIGlzIG5vdCBzZXQKIENPTkZJR19ZQUZGU19ZQUZGUzI9eQogQ09ORklHX1lBRkZTX0FVVE9fWUFGRlMyPXkKICMgQ09ORklHX1lBRkZTX0RJU0FCTEVfTEFaWV9MT0FEIGlzIG5vdCBzZXQKLUNPTkZJR19ZQUZGU19DSEVDS1BPSU5UX1JFU0VSVkVEX0JMT0NLUz0xMAogIyBDT05GSUdfWUFGRlNfRElTQUJMRV9XSURFX1ROT0RFUyBpcyBub3Qgc2V0CiAjIENPTkZJR19ZQUZGU19BTFdBWVNfQ0hFQ0tfQ0hVTktfRVJBU0VEIGlzIG5vdCBzZXQKIENPTkZJR19ZQUZGU19TSE9SVF9OQU1FU19JTl9SQU09eQpAQCAtODk2LDggKzkyNCwxMSBAQAogIyBDT05GSUdfSkZGUzJfUlVCSU4gaXMgbm90IHNldAogIyBDT05GSUdfQ1JBTUZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1ZYRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTUlOSVhfRlMgaXMgbm90IHNldAorIyBDT05GSUdfT01GU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19IUEZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1FOWDRGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19ST01GU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TWVNWX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1VGU19GUyBpcyBub3Qgc2V0CiBDT05GSUdfTkVUV09SS19GSUxFU1lTVEVNUz15CkBAIC05MDUsMTMgKzkzNiwxMiBAQAogQ09ORklHX05GU19WMz15CiAjIENPTkZJR19ORlNfVjNfQUNMIGlzIG5vdCBzZXQKICMgQ09ORklHX05GU19WNCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORlNfRElSRUNUSU8gaXMgbm90IHNldAogIyBDT05GSUdfTkZTRCBpcyBub3Qgc2V0CiBDT05GSUdfTE9DS0Q9bQogQ09ORklHX0xPQ0tEX1Y0PXkKIENPTkZJR19ORlNfQ09NTU9OPXkKIENPTkZJR19TVU5SUEM9bQotIyBDT05GSUdfU1VOUlBDX0JJTkQzNCBpcyBub3Qgc2V0CisjIENPTkZJR19TVU5SUENfUkVHSVNURVJfVjQgaXMgbm90IHNldAogIyBDT05GSUdfUlBDU0VDX0dTU19LUkI1IGlzIG5vdCBzZXQKICMgQ09ORklHX1JQQ1NFQ19HU1NfU1BLTTMgaXMgbm90IHNldAogQ09ORklHX1NNQl9GUz1tCkBAIC05NjcsOSArOTk3LDYgQEAKICMgQ09ORklHX05MU19LT0k4X1UgaXMgbm90IHNldAogIyBDT05GSUdfTkxTX1VURjggaXMgbm90IHNldAogIyBDT05GSUdfRExNIGlzIG5vdCBzZXQKLUNPTkZJR19JTlNUUlVNRU5UQVRJT049eQotIyBDT05GSUdfUFJPRklMSU5HIGlzIG5vdCBzZXQKLSMgQ09ORklHX01BUktFUlMgaXMgbm90IHNldAogCiAjCiAjIEtlcm5lbCBoYWNraW5nCkBAIC05NzcsMTQgKzEwMDQsNTMgQEAKICMgQ09ORklHX1BSSU5US19USU1FIGlzIG5vdCBzZXQKIENPTkZJR19FTkFCTEVfV0FSTl9ERVBSRUNBVEVEPXkKIENPTkZJR19FTkFCTEVfTVVTVF9DSEVDSz15CitDT05GSUdfRlJBTUVfV0FSTj0xMDI0CiAjIENPTkZJR19NQUdJQ19TWVNSUSBpcyBub3Qgc2V0CiAjIENPTkZJR19VTlVTRURfU1lNQk9MUyBpcyBub3Qgc2V0CiBDT05GSUdfREVCVUdfRlM9eQogIyBDT05GSUdfSEVBREVSU19DSEVDSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19LRVJORUwgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX0tFUk5FTD15CisjIENPTkZJR19ERUJVR19TSElSUSBpcyBub3Qgc2V0CitDT05GSUdfREVURUNUX1NPRlRMT0NLVVA9eQorIyBDT05GSUdfQk9PVFBBUkFNX1NPRlRMT0NLVVBfUEFOSUMgaXMgbm90IHNldAorQ09ORklHX0JPT1RQQVJBTV9TT0ZUTE9DS1VQX1BBTklDX1ZBTFVFPTAKK0NPTkZJR19TQ0hFRF9ERUJVRz15CisjIENPTkZJR19TQ0hFRFNUQVRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RJTUVSX1NUQVRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX09CSkVDVFMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU0xBQiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19SVF9NVVRFWEVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUX01VVEVYX1RFU1RFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TUElOTE9DSyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19NVVRFWEVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NQSU5MT0NLX1NMRUVQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0xPQ0tJTkdfQVBJX1NFTEZURVNUUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19LT0JKRUNUIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX0JVR1ZFUkJPU0UgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX0lORk89eQorIyBDT05GSUdfREVCVUdfVk0gaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfV1JJVEVDT1VOVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19NRU1PUllfSU5JVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19MSVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZSQU1FX1BPSU5URVIgaXMgbm90IHNldAorIyBDT05GSUdfQk9PVF9QUklOVEtfREVMQVkgaXMgbm90IHNldAorIyBDT05GSUdfUkNVX1RPUlRVUkVfVEVTVCBpcyBub3Qgc2V0CisjIENPTkZJR19SQ1VfQ1BVX1NUQUxMX0RFVEVDVE9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JBQ0tUUkFDRV9TRUxGX1RFU1QgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfQkxPQ0tfRVhUX0RFVlQgaXMgbm90IHNldAorIyBDT05GSUdfRkFVTFRfSU5KRUNUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU0NUTF9TWVNDQUxMX0NIRUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RZTkFNSUNfUFJJTlRLX0RFQlVHIGlzIG5vdCBzZXQKICMgQ09ORklHX1NBTVBMRVMgaXMgbm90IHNldAorQ09ORklHX0hBVkVfQVJDSF9LR0RCPXkKKyMgQ09ORklHX0tHREIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU1RBQ0tPVkVSRkxPVyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TVEFDS19VU0FHRSBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfVkVSQk9TRT15CiBDT05GSUdfREVCVUdfTU1SUz15CisjIENPTkZJR19ERUJVR19IV0VSUiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19ET1VCTEVGQVVMVCBpcyBub3Qgc2V0CiBDT05GSUdfREVCVUdfSFVOVF9GT1JfWkVSTz15CiBDT05GSUdfREVCVUdfQkZJTl9IV1RSQUNFX09OPXkKIENPTkZJR19ERUJVR19CRklOX0hXVFJBQ0VfQ09NUFJFU1NJT05fT0ZGPXkKQEAgLTk5NCw3ICsxMDYwLDYgQEAKICMgQ09ORklHX0RFQlVHX0JGSU5fSFdUUkFDRV9FWFBBTkQgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfQkZJTl9OT19LRVJOX0hXVFJBQ0UgaXMgbm90IHNldAogQ09ORklHX0VBUkxZX1BSSU5USz15Ci0jIENPTkZJR19EVUFMX0NPUkVfVEVTVF9NT0RVTEUgaXMgbm90IHNldAogQ09ORklHX0NQTEJfSU5GTz15CiBDT05GSUdfQUNDRVNTX0NIRUNLPXkKIApAQCAtMTAwMyw5ICsxMDY4LDk0IEBACiAjCiAjIENPTkZJR19LRVlTIGlzIG5vdCBzZXQKIENPTkZJR19TRUNVUklUWT15CisjIENPTkZJR19TRUNVUklUWUZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFQ1VSSVRZX05FVFdPUksgaXMgbm90IHNldAotIyBDT05GSUdfU0VDVVJJVFlfQ0FQQUJJTElUSUVTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUTyBpcyBub3Qgc2V0CisjIENPTkZJR19TRUNVUklUWV9GSUxFX0NBUEFCSUxJVElFUyBpcyBub3Qgc2V0CitDT05GSUdfU0VDVVJJVFlfREVGQVVMVF9NTUFQX01JTl9BRERSPTAKK0NPTkZJR19DUllQVE89eQorCisjCisjIENyeXB0byBjb3JlIG9yIGhlbHBlcgorIworIyBDT05GSUdfQ1JZUFRPX0ZJUFMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX01BTkFHRVIgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0dGMTI4TVVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19OVUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DUllQVEQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0FVVEhFTkMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1RFU1QgaXMgbm90IHNldAorCisjCisjIEF1dGhlbnRpY2F0ZWQgRW5jcnlwdGlvbiB3aXRoIEFzc29jaWF0ZWQgRGF0YQorIworIyBDT05GSUdfQ1JZUFRPX0NDTSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fR0NNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TRVFJViBpcyBub3Qgc2V0CisKKyMKKyMgQmxvY2sgbW9kZXMKKyMKKyMgQ09ORklHX0NSWVBUT19DQkMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NUUiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ1RTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19FQ0IgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0xSVyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fUENCQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fWFRTIGlzIG5vdCBzZXQKKworIworIyBIYXNoIG1vZGVzCisjCisjIENPTkZJR19DUllQVE9fSE1BQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fWENCQyBpcyBub3Qgc2V0CisKKyMKKyMgRGlnZXN0CisjCisjIENPTkZJR19DUllQVE9fQ1JDMzJDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19NRDQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX01ENSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTUlDSEFFTF9NSUMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1JNRDEyOCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fUk1EMTYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19STUQyNTYgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1JNRDMyMCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0hBMSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0hBMjU2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TSEE1MTIgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1RHUjE5MiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fV1A1MTIgaXMgbm90IHNldAorCisjCisjIENpcGhlcnMKKyMKKyMgQ09ORklHX0NSWVBUT19BRVMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0FOVUJJUyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQVJDNCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQkxPV0ZJU0ggaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NBTUVMTElBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DQVNUNSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ0FTVDYgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0RFUyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fRkNSWVBUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19LSEFaQUQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NBTFNBMjAgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NFRUQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NFUlBFTlQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1RFQSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fVFdPRklTSCBpcyBub3Qgc2V0CisKKyMKKyMgQ29tcHJlc3Npb24KKyMKKyMgQ09ORklHX0NSWVBUT19ERUZMQVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19MWk8gaXMgbm90IHNldAorCisjCisjIFJhbmRvbSBOdW1iZXIgR2VuZXJhdGlvbgorIworIyBDT05GSUdfQ1JZUFRPX0FOU0lfQ1BSTkcgaXMgbm90IHNldAorQ09ORklHX0NSWVBUT19IVz15CiAKICMKICMgTGlicmFyeSByb3V0aW5lcwpAQCAtMTAxMyw2ICsxMTYzLDcgQEAKIENPTkZJR19CSVRSRVZFUlNFPXkKIENPTkZJR19DUkNfQ0NJVFQ9bQogIyBDT05GSUdfQ1JDMTYgaXMgbm90IHNldAorIyBDT05GSUdfQ1JDX1QxMERJRiBpcyBub3Qgc2V0CiAjIENPTkZJR19DUkNfSVRVX1QgaXMgbm90IHNldAogQ09ORklHX0NSQzMyPXkKICMgQ09ORklHX0NSQzcgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9jb25maWdzL0JsYWNrU3RhbXBfZGVmY29uZmlnIGIvYXJjaC9ibGFja2Zpbi9jb25maWdzL0JsYWNrU3RhbXBfZGVmY29uZmlnCmluZGV4IDI5MjFmOTkuLjk2ODNiMmUgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vY29uZmlncy9CbGFja1N0YW1wX2RlZmNvbmZpZworKysgYi9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvQmxhY2tTdGFtcF9kZWZjb25maWcKQEAgLTUzLDcgKzUzLDcgQEAKIENPTkZJR19IT1RQTFVHPXkKIENPTkZJR19QUklOVEs9eQogQ09ORklHX0JVRz15Ci1DT05GSUdfRUxGX0NPUkU9eQorIyBDT05GSUdfRUxGX0NPUkUgaXMgbm90IHNldAogQ09ORklHX0NPTVBBVF9CUks9eQogQ09ORklHX0JBU0VfRlVMTD15CiBDT05GSUdfRlVURVg9eQpAQCAtMjc2LDcgKzI3Niw2IEBACiBDT05GSUdfWk9ORV9ETUFfRkxBRz0xCiBDT05GSUdfVklSVF9UT19CVVM9eQogQ09ORklHX0JGSU5fR1BUSU1FUlM9eQotQ09ORklHX0JGSU5fRE1BXzVYWD15CiAjIENPTkZJR19ETUFfVU5DQUNIRURfNE0gaXMgbm90IHNldAogIyBDT05GSUdfRE1BX1VOQ0FDSEVEXzJNIGlzIG5vdCBzZXQKIENPTkZJR19ETUFfVU5DQUNIRURfMU09eQpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9jb25maWdzL0NNLUJGNTI3X2RlZmNvbmZpZyBiL2FyY2gvYmxhY2tmaW4vY29uZmlncy9DTS1CRjUyN19kZWZjb25maWcKaW5kZXggYjZhMTQ2My4uYTA0MWU3ZSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9jb25maWdzL0NNLUJGNTI3X2RlZmNvbmZpZworKysgYi9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvQ00tQkY1MjdfZGVmY29uZmlnCkBAIC00Miw3ICs0Miw3IEBACiBDT05GSUdfRkFJUl9HUk9VUF9TQ0hFRD15CiBDT05GSUdfRkFJUl9VU0VSX1NDSEVEPXkKICMgQ09ORklHX0ZBSVJfQ0dST1VQX1NDSEVEIGlzIG5vdCBzZXQKLUNPTkZJR19TWVNGU19ERVBSRUNBVEVEPXkKKyMgQ09ORklHX1NZU0ZTX0RFUFJFQ0FURUQgaXMgbm90IHNldAogIyBDT05GSUdfUkVMQVkgaXMgbm90IHNldAogQ09ORklHX0JMS19ERVZfSU5JVFJEPXkKIENPTkZJR19JTklUUkFNRlNfU09VUkNFPSIiCkBAIC01Niw3ICs1Niw3IEBACiBDT05GSUdfSE9UUExVRz15CiBDT05GSUdfUFJJTlRLPXkKIENPTkZJR19CVUc9eQotQ09ORklHX0VMRl9DT1JFPXkKKyMgQ09ORklHX0VMRl9DT1JFIGlzIG5vdCBzZXQKIENPTkZJR19CQVNFX0ZVTEw9eQogQ09ORklHX0ZVVEVYPXkKIENPTkZJR19BTk9OX0lOT0RFUz15CkBAIC0xOTAsMTQgKzE5MCwxNCBAQAogQ09ORklHX0lSUV9QT1JUSF9JTlRBPTExCiBDT05GSUdfSVJRX01BQ19UWD0xMQogQ09ORklHX0lSUV9QT1JUSF9JTlRCPTExCi1DT05GSUdfSVJRX1RNUjA9MTIKLUNPTkZJR19JUlFfVE1SMT0xMgotQ09ORklHX0lSUV9UTVIyPTEyCi1DT05GSUdfSVJRX1RNUjM9MTIKLUNPTkZJR19JUlFfVE1SND0xMgotQ09ORklHX0lSUV9UTVI1PTEyCi1DT05GSUdfSVJRX1RNUjY9MTIKLUNPTkZJR19JUlFfVE1SNz0xMgorQ09ORklHX0lSUV9USU1FUjA9MTIKK0NPTkZJR19JUlFfVElNRVIxPTEyCitDT05GSUdfSVJRX1RJTUVSMj0xMgorQ09ORklHX0lSUV9USU1FUjM9MTIKK0NPTkZJR19JUlFfVElNRVI0PTEyCitDT05GSUdfSVJRX1RJTUVSNT0xMgorQ09ORklHX0lSUV9USU1FUjY9MTIKK0NPTkZJR19JUlFfVElNRVI3PTEyCiBDT05GSUdfSVJRX1BPUlRHX0lOVEE9MTIKIENPTkZJR19JUlFfUE9SVEdfSU5UQj0xMgogQ09ORklHX0lSUV9NRU1fRE1BMD0xMwpAQCAtMjkyLDcgKzI5Miw2IEBACiBDT05GSUdfWk9ORV9ETUFfRkxBRz0xCiBDT05GSUdfVklSVF9UT19CVVM9eQogQ09ORklHX0JGSU5fR1BUSU1FUlM9eQotQ09ORklHX0JGSU5fRE1BXzVYWD15CiAjIENPTkZJR19ETUFfVU5DQUNIRURfNE0gaXMgbm90IHNldAogIyBDT05GSUdfRE1BX1VOQ0FDSEVEXzJNIGlzIG5vdCBzZXQKIENPTkZJR19ETUFfVU5DQUNIRURfMU09eQpAQCAtNjUwLDYgKzY0OSw3IEBACiAjIENPTkZJR19UV0lfTENEIGlzIG5vdCBzZXQKIENPTkZJR19TSU1QTEVfR1BJTz1tCiAjIENPTkZJR19WVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERVZLTUVNIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFUklBTF9OT05TVEFOREFSRCBpcyBub3Qgc2V0CiAKICMKQEAgLTY5OSw3ICs2OTksNyBAQAogIyBJMkMgSGFyZHdhcmUgQnVzIHN1cHBvcnQKICMKIENPTkZJR19JMkNfQkxBQ0tGSU5fVFdJPW0KLUNPTkZJR19JMkNfQkxBQ0tGSU5fVFdJX0NMS19LSFo9NTAKK0NPTkZJR19JMkNfQkxBQ0tGSU5fVFdJX0NMS19LSFo9MTAwCiAjIENPTkZJR19JMkNfR1BJTyBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfT0NPUkVTIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19QQVJQT1JUX0xJR0hUIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vY29uZmlncy9DTS1CRjUzM19kZWZjb25maWcgYi9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvQ00tQkY1MzNfZGVmY29uZmlnCmluZGV4IGMzYmE5MDYuLjA4NTIxMWIgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vY29uZmlncy9DTS1CRjUzM19kZWZjb25maWcKKysrIGIvYXJjaC9ibGFja2Zpbi9jb25maWdzL0NNLUJGNTMzX2RlZmNvbmZpZwpAQCAtNDIsNyArNDIsNyBAQAogQ09ORklHX0lLQ09ORklHPXkKIENPTkZJR19JS0NPTkZJR19QUk9DPXkKIENPTkZJR19MT0dfQlVGX1NISUZUPTE0Ci1DT05GSUdfU1lTRlNfREVQUkVDQVRFRD15CisjIENPTkZJR19TWVNGU19ERVBSRUNBVEVEIGlzIG5vdCBzZXQKICMgQ09ORklHX1JFTEFZIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfSU5JVFJEIGlzIG5vdCBzZXQKICMgQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFIGlzIG5vdCBzZXQKQEAgLTU1LDcgKzU1LDcgQEAKICMgQ09ORklHX0hPVFBMVUcgaXMgbm90IHNldAogQ09ORklHX1BSSU5USz15CiBDT05GSUdfQlVHPXkKLUNPTkZJR19FTEZfQ09SRT15CisjIENPTkZJR19FTEZfQ09SRSBpcyBub3Qgc2V0CiBDT05GSUdfQkFTRV9GVUxMPXkKIENPTkZJR19GVVRFWD15CiBDT05GSUdfQU5PTl9JTk9ERVM9eQpAQCAtMjU0LDcgKzI1NCw2IEBACiBDT05GSUdfWk9ORV9ETUFfRkxBRz0xCiBDT05GSUdfTEFSR0VfQUxMT0NTPXkKICMgQ09ORklHX0JGSU5fR1BUSU1FUlMgaXMgbm90IHNldAotQ09ORklHX0JGSU5fRE1BXzVYWD15CiAjIENPTkZJR19ETUFfVU5DQUNIRURfMk0gaXMgbm90IHNldAogQ09ORklHX0RNQV9VTkNBQ0hFRF8xTT15CiAjIENPTkZJR19ETUFfVU5DQUNIRURfTk9ORSBpcyBub3Qgc2V0CkBAIC01OTgsNiArNTk3LDcgQEAKIENPTkZJR19CRklOX1NQT1JUPXkKICMgQ09ORklHX0JGSU5fVElNRVJfTEFURU5DWSBpcyBub3Qgc2V0CiAjIENPTkZJR19WVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERVZLTUVNIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFUklBTF9OT05TVEFOREFSRCBpcyBub3Qgc2V0CiAKICMKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vY29uZmlncy9DTS1CRjUzN0VfZGVmY29uZmlnIGIvYXJjaC9ibGFja2Zpbi9jb25maWdzL0NNLUJGNTM3RV9kZWZjb25maWcKaW5kZXggY2RjNmI3Zi4uNzUwMjAzZSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9jb25maWdzL0NNLUJGNTM3RV9kZWZjb25maWcKKysrIGIvYXJjaC9ibGFja2Zpbi9jb25maWdzL0NNLUJGNTM3RV9kZWZjb25maWcKQEAgLTQyLDcgKzQyLDcgQEAKIENPTkZJR19JS0NPTkZJRz15CiBDT05GSUdfSUtDT05GSUdfUFJPQz15CiBDT05GSUdfTE9HX0JVRl9TSElGVD0xNAotQ09ORklHX1NZU0ZTX0RFUFJFQ0FURUQ9eQorIyBDT05GSUdfU1lTRlNfREVQUkVDQVRFRCBpcyBub3Qgc2V0CiAjIENPTkZJR19SRUxBWSBpcyBub3Qgc2V0CiAjIENPTkZJR19CTEtfREVWX0lOSVRSRCBpcyBub3Qgc2V0CiAjIENPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRSBpcyBub3Qgc2V0CkBAIC01NSw3ICs1NSw3IEBACiAjIENPTkZJR19IT1RQTFVHIGlzIG5vdCBzZXQKIENPTkZJR19QUklOVEs9eQogQ09ORklHX0JVRz15Ci1DT05GSUdfRUxGX0NPUkU9eQorIyBDT05GSUdfRUxGX0NPUkUgaXMgbm90IHNldAogQ09ORklHX0JBU0VfRlVMTD15CiBDT05GSUdfRlVURVg9eQogQ09ORklHX0FOT05fSU5PREVTPXkKQEAgLTE1NywxNCArMTU3LDE0IEBACiBDT05GSUdfSVJRX1VBUlQxX1RYPTEwCiBDT05GSUdfSVJRX01BQ19SWD0xMQogQ09ORklHX0lSUV9NQUNfVFg9MTEKLUNPTkZJR19JUlFfVE1SMD0xMgotQ09ORklHX0lSUV9UTVIxPTEyCi1DT05GSUdfSVJRX1RNUjI9MTIKLUNPTkZJR19JUlFfVE1SMz0xMgotQ09ORklHX0lSUV9UTVI0PTEyCi1DT05GSUdfSVJRX1RNUjU9MTIKLUNPTkZJR19JUlFfVE1SNj0xMgotQ09ORklHX0lSUV9UTVI3PTEyCitDT05GSUdfSVJRX1RJTUVSMD0xMgorQ09ORklHX0lSUV9USU1FUjE9MTIKK0NPTkZJR19JUlFfVElNRVIyPTEyCitDT05GSUdfSVJRX1RJTUVSMz0xMgorQ09ORklHX0lSUV9USU1FUjQ9MTIKK0NPTkZJR19JUlFfVElNRVI1PTEyCitDT05GSUdfSVJRX1RJTUVSNj0xMgorQ09ORklHX0lSUV9USU1FUjc9MTIKIENPTkZJR19JUlFfUE9SVEdfSU5UQj0xMgogQ09ORklHX0lSUV9NRU1fRE1BMD0xMwogQ09ORklHX0lSUV9NRU1fRE1BMT0xMwpAQCAtMjYyLDcgKzI2Miw2IEBACiBDT05GSUdfWk9ORV9ETUFfRkxBRz0xCiBDT05GSUdfTEFSR0VfQUxMT0NTPXkKICMgQ09ORklHX0JGSU5fR1BUSU1FUlMgaXMgbm90IHNldAotQ09ORklHX0JGSU5fRE1BXzVYWD15CiAjIENPTkZJR19ETUFfVU5DQUNIRURfMk0gaXMgbm90IHNldAogQ09ORklHX0RNQV9VTkNBQ0hFRF8xTT15CiAjIENPTkZJR19ETUFfVU5DQUNIRURfTk9ORSBpcyBub3Qgc2V0CkBAIC02MjcsNiArNjI2LDcgQEAKIENPTkZJR19CRklOX1NQT1JUPXkKICMgQ09ORklHX0JGSU5fVElNRVJfTEFURU5DWSBpcyBub3Qgc2V0CiAjIENPTkZJR19WVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERVZLTUVNIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFUklBTF9OT05TVEFOREFSRCBpcyBub3Qgc2V0CiAKICMKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vY29uZmlncy9DTS1CRjUzN1VfZGVmY29uZmlnIGIvYXJjaC9ibGFja2Zpbi9jb25maWdzL0NNLUJGNTM3VV9kZWZjb25maWcKaW5kZXggZjA3NGJkYy4uZGVjOGE3ZCAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9jb25maWdzL0NNLUJGNTM3VV9kZWZjb25maWcKKysrIGIvYXJjaC9ibGFja2Zpbi9jb25maWdzL0NNLUJGNTM3VV9kZWZjb25maWcKQEAgLTQyLDcgKzQyLDcgQEAKIENPTkZJR19JS0NPTkZJRz15CiBDT05GSUdfSUtDT05GSUdfUFJPQz15CiBDT05GSUdfTE9HX0JVRl9TSElGVD0xNAotQ09ORklHX1NZU0ZTX0RFUFJFQ0FURUQ9eQorIyBDT05GSUdfU1lTRlNfREVQUkVDQVRFRCBpcyBub3Qgc2V0CiAjIENPTkZJR19SRUxBWSBpcyBub3Qgc2V0CiAjIENPTkZJR19CTEtfREVWX0lOSVRSRCBpcyBub3Qgc2V0CiAjIENPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRSBpcyBub3Qgc2V0CkBAIC01NSw3ICs1NSw3IEBACiAjIENPTkZJR19IT1RQTFVHIGlzIG5vdCBzZXQKIENPTkZJR19QUklOVEs9eQogQ09ORklHX0JVRz15Ci1DT05GSUdfRUxGX0NPUkU9eQorIyBDT05GSUdfRUxGX0NPUkUgaXMgbm90IHNldAogQ09ORklHX0JBU0VfRlVMTD15CiBDT05GSUdfRlVURVg9eQogQ09ORklHX0FOT05fSU5PREVTPXkKQEAgLTE1NywxNCArMTU3LDE0IEBACiBDT05GSUdfSVJRX1VBUlQxX1RYPTEwCiBDT05GSUdfSVJRX01BQ19SWD0xMQogQ09ORklHX0lSUV9NQUNfVFg9MTEKLUNPTkZJR19JUlFfVE1SMD0xMgotQ09ORklHX0lSUV9UTVIxPTEyCi1DT05GSUdfSVJRX1RNUjI9MTIKLUNPTkZJR19JUlFfVE1SMz0xMgotQ09ORklHX0lSUV9UTVI0PTEyCi1DT05GSUdfSVJRX1RNUjU9MTIKLUNPTkZJR19JUlFfVE1SNj0xMgotQ09ORklHX0lSUV9UTVI3PTEyCitDT05GSUdfSVJRX1RJTUVSMD0xMgorQ09ORklHX0lSUV9USU1FUjE9MTIKK0NPTkZJR19JUlFfVElNRVIyPTEyCitDT05GSUdfSVJRX1RJTUVSMz0xMgorQ09ORklHX0lSUV9USU1FUjQ9MTIKK0NPTkZJR19JUlFfVElNRVI1PTEyCitDT05GSUdfSVJRX1RJTUVSNj0xMgorQ09ORklHX0lSUV9USU1FUjc9MTIKIENPTkZJR19JUlFfUE9SVEdfSU5UQj0xMgogQ09ORklHX0lSUV9NRU1fRE1BMD0xMwogQ09ORklHX0lSUV9NRU1fRE1BMT0xMwpAQCAtMjYyLDcgKzI2Miw2IEBACiBDT05GSUdfWk9ORV9ETUFfRkxBRz0xCiBDT05GSUdfTEFSR0VfQUxMT0NTPXkKICMgQ09ORklHX0JGSU5fR1BUSU1FUlMgaXMgbm90IHNldAotQ09ORklHX0JGSU5fRE1BXzVYWD15CiAjIENPTkZJR19ETUFfVU5DQUNIRURfMk0gaXMgbm90IHNldAogQ09ORklHX0RNQV9VTkNBQ0hFRF8xTT15CiAjIENPTkZJR19ETUFfVU5DQUNIRURfTk9ORSBpcyBub3Qgc2V0CkBAIC02MDcsNiArNjA2LDcgQEAKIENPTkZJR19CRklOX1NQT1JUPXkKICMgQ09ORklHX0JGSU5fVElNRVJfTEFURU5DWSBpcyBub3Qgc2V0CiAjIENPTkZJR19WVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERVZLTUVNIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFUklBTF9OT05TVEFOREFSRCBpcyBub3Qgc2V0CiAKICMKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vY29uZmlncy9DTS1CRjU0OF9kZWZjb25maWcgYi9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvQ00tQkY1NDhfZGVmY29uZmlnCmluZGV4IDVjNDRmZGIuLmVmZDY4YmMgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vY29uZmlncy9DTS1CRjU0OF9kZWZjb25maWcKKysrIGIvYXJjaC9ibGFja2Zpbi9jb25maWdzL0NNLUJGNTQ4X2RlZmNvbmZpZwpAQCAtNDEsNyArNDEsNyBAQAogQ09ORklHX0ZBSVJfR1JPVVBfU0NIRUQ9eQogQ09ORklHX0ZBSVJfVVNFUl9TQ0hFRD15CiAjIENPTkZJR19GQUlSX0NHUk9VUF9TQ0hFRCBpcyBub3Qgc2V0Ci1DT05GSUdfU1lTRlNfREVQUkVDQVRFRD15CisjIENPTkZJR19TWVNGU19ERVBSRUNBVEVEIGlzIG5vdCBzZXQKICMgQ09ORklHX1JFTEFZIGlzIG5vdCBzZXQKIENPTkZJR19CTEtfREVWX0lOSVRSRD15CiBDT05GSUdfSU5JVFJBTUZTX1NPVVJDRT0iIgpAQCAtNTUsNyArNTUsNyBAQAogQ09ORklHX0hPVFBMVUc9eQogQ09ORklHX1BSSU5USz15CiBDT05GSUdfQlVHPXkKLUNPTkZJR19FTEZfQ09SRT15CisjIENPTkZJR19FTEZfQ09SRSBpcyBub3Qgc2V0CiBDT05GSUdfQkFTRV9GVUxMPXkKIENPTkZJR19GVVRFWD15CiBDT05GSUdfQU5PTl9JTk9ERVM9eQpAQCAtMzI1LDcgKzMyNSw2IEBACiBDT05GSUdfWk9ORV9ETUFfRkxBRz0xCiBDT05GSUdfVklSVF9UT19CVVM9eQogIyBDT05GSUdfQkZJTl9HUFRJTUVSUyBpcyBub3Qgc2V0Ci1DT05GSUdfQkZJTl9ETUFfNVhYPXkKICMgQ09ORklHX0RNQV9VTkNBQ0hFRF8yTSBpcyBub3Qgc2V0CiBDT05GSUdfRE1BX1VOQ0FDSEVEXzFNPXkKICMgQ09ORklHX0RNQV9VTkNBQ0hFRF9OT05FIGlzIG5vdCBzZXQKQEAgLTU0NCw3ICs1NDMsNyBAQAogQ09ORklHX01URF9DT01QTEVYX01BUFBJTkdTPXkKIENPTkZJR19NVERfUEhZU01BUD15CiBDT05GSUdfTVREX1BIWVNNQVBfU1RBUlQ9MHgyMDAwMDAwMAotQ09ORklHX01URF9QSFlTTUFQX0xFTj0weDgwMDAwMAorQ09ORklHX01URF9QSFlTTUFQX0xFTj0wCiBDT05GSUdfTVREX1BIWVNNQVBfQkFOS1dJRFRIPTIKICMgQ09ORklHX01URF9VQ0xJTlVYIGlzIG5vdCBzZXQKICMgQ09ORklHX01URF9QTEFUUkFNIGlzIG5vdCBzZXQKQEAgLTczMiw2ICs3MzEsNyBAQAogIyBDT05GSUdfVFdJX0xDRCBpcyBub3Qgc2V0CiAjIENPTkZJR19TSU1QTEVfR1BJTyBpcyBub3Qgc2V0CiAjIENPTkZJR19WVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERVZLTUVNIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFUklBTF9OT05TVEFOREFSRCBpcyBub3Qgc2V0CiAKICMKQEAgLTc4Miw3ICs3ODIsNyBAQAogIyBJMkMgSGFyZHdhcmUgQnVzIHN1cHBvcnQKICMKIENPTkZJR19JMkNfQkxBQ0tGSU5fVFdJPXkKLUNPTkZJR19JMkNfQkxBQ0tGSU5fVFdJX0NMS19LSFo9NTAKK0NPTkZJR19JMkNfQkxBQ0tGSU5fVFdJX0NMS19LSFo9MTAwCiAjIENPTkZJR19JMkNfR1BJTyBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfT0NPUkVTIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19QQVJQT1JUX0xJR0hUIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vY29uZmlncy9DTS1CRjU2MV9kZWZjb25maWcgYi9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvQ00tQkY1NjFfZGVmY29uZmlnCmluZGV4IDA4NmZlNWQuLjM0NmJjN2EgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vY29uZmlncy9DTS1CRjU2MV9kZWZjb25maWcKKysrIGIvYXJjaC9ibGFja2Zpbi9jb25maWdzL0NNLUJGNTYxX2RlZmNvbmZpZwpAQCAtNDIsNyArNDIsNyBAQAogQ09ORklHX0ZBSVJfR1JPVVBfU0NIRUQ9eQogQ09ORklHX0ZBSVJfVVNFUl9TQ0hFRD15CiAjIENPTkZJR19GQUlSX0NHUk9VUF9TQ0hFRCBpcyBub3Qgc2V0Ci1DT05GSUdfU1lTRlNfREVQUkVDQVRFRD15CisjIENPTkZJR19TWVNGU19ERVBSRUNBVEVEIGlzIG5vdCBzZXQKICMgQ09ORklHX1JFTEFZIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfSU5JVFJEIGlzIG5vdCBzZXQKICMgQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFIGlzIG5vdCBzZXQKQEAgLTU1LDcgKzU1LDcgQEAKICMgQ09ORklHX0hPVFBMVUcgaXMgbm90IHNldAogQ09ORklHX1BSSU5USz15CiBDT05GSUdfQlVHPXkKLUNPTkZJR19FTEZfQ09SRT15CisjIENPTkZJR19FTEZfQ09SRSBpcyBub3Qgc2V0CiBDT05GSUdfQkFTRV9GVUxMPXkKIENPTkZJR19GVVRFWD15CiBDT05GSUdfQU5PTl9JTk9ERVM9eQpAQCAtMzAwLDcgKzMwMCw2IEBACiBDT05GSUdfVklSVF9UT19CVVM9eQogQ09ORklHX0xBUkdFX0FMTE9DUz15CiAjIENPTkZJR19CRklOX0dQVElNRVJTIGlzIG5vdCBzZXQKLUNPTkZJR19CRklOX0RNQV81WFg9eQogIyBDT05GSUdfRE1BX1VOQ0FDSEVEXzJNIGlzIG5vdCBzZXQKIENPTkZJR19ETUFfVU5DQUNIRURfMU09eQogIyBDT05GSUdfRE1BX1VOQ0FDSEVEX05PTkUgaXMgbm90IHNldApAQCAtNjEyLDYgKzYxMSw3IEBACiAjIENPTkZJR19CRklOX1RJTUVSX0xBVEVOQ1kgaXMgbm90IHNldAogIyBDT05GSUdfU0lNUExFX0dQSU8gaXMgbm90IHNldAogIyBDT05GSUdfVlQgaXMgbm90IHNldAorIyBDT05GSUdfREVWS01FTSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRVJJQUxfTk9OU1RBTkRBUkQgaXMgbm90IHNldAogCiAjCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvSDg2MDZfZGVmY29uZmlnIGIvYXJjaC9ibGFja2Zpbi9jb25maWdzL0g4NjA2X2RlZmNvbmZpZwppbmRleCAxZmMzMWYxLi41ZDM5MDFkIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvSDg2MDZfZGVmY29uZmlnCisrKyBiL2FyY2gvYmxhY2tmaW4vY29uZmlncy9IODYwNl9kZWZjb25maWcKQEAgLTU0LDcgKzU0LDcgQEAKIENPTkZJR19IT1RQTFVHPXkKIENPTkZJR19QUklOVEs9eQogQ09ORklHX0JVRz15Ci1DT05GSUdfRUxGX0NPUkU9eQorIyBDT05GSUdfRUxGX0NPUkUgaXMgbm90IHNldAogQ09ORklHX0JBU0VfRlVMTD15CiBDT05GSUdfRlVURVg9eQogQ09ORklHX0FOT05fSU5PREVTPXkKQEAgLTI1MCw3ICsyNTAsNiBAQAogQ09ORklHX1pPTkVfRE1BX0ZMQUc9MQogQ09ORklHX0xBUkdFX0FMTE9DUz15CiBDT05GSUdfQkZJTl9HUFRJTUVSUz15Ci1DT05GSUdfQkZJTl9ETUFfNVhYPXkKICMgQ09ORklHX0RNQV9VTkNBQ0hFRF8yTSBpcyBub3Qgc2V0CiBDT05GSUdfRE1BX1VOQ0FDSEVEXzFNPXkKICMgQ09ORklHX0RNQV9VTkNBQ0hFRF9OT05FIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vY29uZmlncy9JUDBYX2RlZmNvbmZpZyBiL2FyY2gvYmxhY2tmaW4vY29uZmlncy9JUDBYX2RlZmNvbmZpZwppbmRleCAyODVkMjI0Li5lNjZmNWRhIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvSVAwWF9kZWZjb25maWcKKysrIGIvYXJjaC9ibGFja2Zpbi9jb25maWdzL0lQMFhfZGVmY29uZmlnCkBAIC01NSw3ICs1NSw3IEBACiAjIENPTkZJR19IT1RQTFVHIGlzIG5vdCBzZXQKIENPTkZJR19QUklOVEs9eQogQ09ORklHX0JVRz15Ci1DT05GSUdfRUxGX0NPUkU9eQorIyBDT05GSUdfRUxGX0NPUkUgaXMgbm90IHNldAogQ09ORklHX0JBU0VfRlVMTD15CiBDT05GSUdfRlVURVg9eQogQ09ORklHX0FOT05fSU5PREVTPXkKQEAgLTI2Miw3ICsyNjIsNiBAQAogQ09ORklHX1pPTkVfRE1BX0ZMQUc9MQogQ09ORklHX0xBUkdFX0FMTE9DUz15CiAjIENPTkZJR19CRklOX0dQVElNRVJTIGlzIG5vdCBzZXQKLUNPTkZJR19CRklOX0RNQV81WFg9eQogIyBDT05GSUdfRE1BX1VOQ0FDSEVEXzJNIGlzIG5vdCBzZXQKIENPTkZJR19ETUFfVU5DQUNIRURfMU09eQogIyBDT05GSUdfRE1BX1VOQ0FDSEVEX05PTkUgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9jb25maWdzL1BOQVYtMTBfZGVmY29uZmlnIGIvYXJjaC9ibGFja2Zpbi9jb25maWdzL1BOQVYtMTBfZGVmY29uZmlnCmluZGV4IGJmZmNhN2QuLmNlNWRkZTkgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vY29uZmlncy9QTkFWLTEwX2RlZmNvbmZpZworKysgYi9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvUE5BVi0xMF9kZWZjb25maWcKQEAgLTEsNiArMSw2IEBACiAjCiAjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0Ci0jIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMjIuMTIKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4yOC1yYzIKICMKICMgQ09ORklHX01NVSBpcyBub3Qgc2V0CiAjIENPTkZJR19GUFUgaXMgbm90IHNldApAQCAtOCw0MSArOCwzNyBAQAogIyBDT05GSUdfUldTRU1fWENIR0FERF9BTEdPUklUSE0gaXMgbm90IHNldAogQ09ORklHX0JMQUNLRklOPXkKIENPTkZJR19aT05FX0RNQT15Ci1DT05GSUdfU0VNQVBIT1JFX1NMRUVQRVJTPXkKIENPTkZJR19HRU5FUklDX0ZJTkRfTkVYVF9CSVQ9eQogQ09ORklHX0dFTkVSSUNfSFdFSUdIVD15CiBDT05GSUdfR0VORVJJQ19IQVJESVJRUz15CiBDT05GSUdfR0VORVJJQ19JUlFfUFJPQkU9eQotQ09ORklHX0dFTkVSSUNfVElNRT15CiBDT05GSUdfR0VORVJJQ19HUElPPXkKIENPTkZJR19GT1JDRV9NQVhfWk9ORU9SREVSPTE0CiBDT05GSUdfR0VORVJJQ19DQUxJQlJBVEVfREVMQVk9eQogQ09ORklHX0RFRkNPTkZJR19MSVNUPSIvbGliL21vZHVsZXMvJFVOQU1FX1JFTEVBU0UvLmNvbmZpZyIKIAogIwotIyBDb2RlIG1hdHVyaXR5IGxldmVsIG9wdGlvbnMKKyMgR2VuZXJhbCBzZXR1cAogIwogQ09ORklHX0VYUEVSSU1FTlRBTD15CiBDT05GSUdfQlJPS0VOX09OX1NNUD15CiBDT05GSUdfSU5JVF9FTlZfQVJHX0xJTUlUPTMyCi0KLSMKLSMgR2VuZXJhbCBzZXR1cAotIwogQ09ORklHX0xPQ0FMVkVSU0lPTj0iIgogQ09ORklHX0xPQ0FMVkVSU0lPTl9BVVRPPXkKIENPTkZJR19TWVNWSVBDPXkKLSMgQ09ORklHX0lQQ19OUyBpcyBub3Qgc2V0CiBDT05GSUdfU1lTVklQQ19TWVNDVEw9eQogIyBDT05GSUdfUE9TSVhfTVFVRVVFIGlzIG5vdCBzZXQKICMgQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1QgaXMgbm90IHNldAogIyBDT05GSUdfVEFTS1NUQVRTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VUU19OUyBpcyBub3Qgc2V0CiAjIENPTkZJR19BVURJVCBpcyBub3Qgc2V0CiAjIENPTkZJR19JS0NPTkZJRyBpcyBub3Qgc2V0CiBDT05GSUdfTE9HX0JVRl9TSElGVD0xNAotQ09ORklHX1NZU0ZTX0RFUFJFQ0FURUQ9eQorIyBDT05GSUdfQ0dST1VQUyBpcyBub3Qgc2V0CisjIENPTkZJR19HUk9VUF9TQ0hFRCBpcyBub3Qgc2V0CisjIENPTkZJR19TWVNGU19ERVBSRUNBVEVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU0ZTX0RFUFJFQ0FURURfVjIgaXMgbm90IHNldAogIyBDT05GSUdfUkVMQVkgaXMgbm90IHNldAorIyBDT05GSUdfTkFNRVNQQUNFUyBpcyBub3Qgc2V0CiAjIENPTkZJR19CTEtfREVWX0lOSVRSRCBpcyBub3Qgc2V0CiAjIENPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRSBpcyBub3Qgc2V0CiBDT05GSUdfU1lTQ1RMPXkKQEAgLTU0LDQwICs1MCw0MSBAQAogQ09ORklHX0hPVFBMVUc9eQogQ09ORklHX1BSSU5USz15CiBDT05GSUdfQlVHPXkKLUNPTkZJR19FTEZfQ09SRT15CisjIENPTkZJR19FTEZfQ09SRSBpcyBub3Qgc2V0CitDT05GSUdfQ09NUEFUX0JSSz15CiBDT05GSUdfQkFTRV9GVUxMPXkKIENPTkZJR19GVVRFWD15CiBDT05GSUdfQU5PTl9JTk9ERVM9eQogQ09ORklHX0VQT0xMPXkKIENPTkZJR19TSUdOQUxGRD15CitDT05GSUdfVElNRVJGRD15CiBDT05GSUdfRVZFTlRGRD15CitDT05GSUdfQUlPPXkKIENPTkZJR19WTV9FVkVOVF9DT1VOVEVSUz15Ci1DT05GSUdfQklHX09SREVSX0FMTE9DX05PRkFJTF9NQUdJQz05Ci0jIENPTkZJR19OUDIgaXMgbm90IHNldAogQ09ORklHX1NMQUI9eQogIyBDT05GSUdfU0xVQiBpcyBub3Qgc2V0CiAjIENPTkZJR19TTE9CIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BST0ZJTElORyBpcyBub3Qgc2V0CisjIENPTkZJR19NQVJLRVJTIGlzIG5vdCBzZXQKK0NPTkZJR19IQVZFX09QUk9GSUxFPXkKKyMgQ09ORklHX0hBVkVfR0VORVJJQ19ETUFfQ09IRVJFTlQgaXMgbm90IHNldAorQ09ORklHX1NMQUJJTkZPPXkKIENPTkZJR19SVF9NVVRFWEVTPXkKIENPTkZJR19USU5ZX1NITUVNPXkKIENPTkZJR19CQVNFX1NNQUxMPTAKLQotIwotIyBMb2FkYWJsZSBtb2R1bGUgc3VwcG9ydAotIwogQ09ORklHX01PRFVMRVM9eQorIyBDT05GSUdfTU9EVUxFX0ZPUkNFX0xPQUQgaXMgbm90IHNldAogQ09ORklHX01PRFVMRV9VTkxPQUQ9eQogIyBDT05GSUdfTU9EVUxFX0ZPUkNFX1VOTE9BRCBpcyBub3Qgc2V0CiAjIENPTkZJR19NT0RWRVJTSU9OUyBpcyBub3Qgc2V0CiAjIENPTkZJR19NT0RVTEVfU1JDVkVSU0lPTl9BTEwgaXMgbm90IHNldAogQ09ORklHX0tNT0Q9eQotCi0jCi0jIEJsb2NrIGxheWVyCi0jCiBDT05GSUdfQkxPQ0s9eQogIyBDT05GSUdfTEJEIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfSU9fVFJBQ0UgaXMgbm90IHNldAogIyBDT05GSUdfTFNGIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfQlNHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSU5URUdSSVRZIGlzIG5vdCBzZXQKIAogIwogIyBJTyBTY2hlZHVsZXJzCkBAIC0xMDEsOSArOTgsMTEgQEAKICMgQ09ORklHX0RFRkFVTFRfQ0ZRIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFRkFVTFRfTk9PUCBpcyBub3Qgc2V0CiBDT05GSUdfREVGQVVMVF9JT1NDSEVEPSJhbnRpY2lwYXRvcnkiCitDT05GSUdfQ0xBU1NJQ19SQ1U9eQogIyBDT05GSUdfUFJFRU1QVF9OT05FIGlzIG5vdCBzZXQKIENPTkZJR19QUkVFTVBUX1ZPTFVOVEFSWT15CiAjIENPTkZJR19QUkVFTVBUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZSRUVaRVIgaXMgbm90IHNldAogCiAjCiAjIEJsYWNrZmluIFByb2Nlc3NvciBPcHRpb25zCkBAIC0xMTIsOCArMTExLDE1IEBACiAjCiAjIFByb2Nlc3NvciBhbmQgQm9hcmQgU2V0dGluZ3MKICMKKyMgQ09ORklHX0JGNTEyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGNTE0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGNTE2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGNTE4IGlzIG5vdCBzZXQKICMgQ09ORklHX0JGNTIyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGNTIzIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGNTI0IGlzIG5vdCBzZXQKICMgQ09ORklHX0JGNTI1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGNTI2IGlzIG5vdCBzZXQKICMgQ09ORklHX0JGNTI3IGlzIG5vdCBzZXQKICMgQ09ORklHX0JGNTMxIGlzIG5vdCBzZXQKICMgQ09ORklHX0JGNTMyIGlzIG5vdCBzZXQKQEAgLTEyMSwyMiArMTI3LDI2IEBACiAjIENPTkZJR19CRjUzNCBpcyBub3Qgc2V0CiAjIENPTkZJR19CRjUzNiBpcyBub3Qgc2V0CiBDT05GSUdfQkY1Mzc9eQorIyBDT05GSUdfQkY1MzggaXMgbm90IHNldAorIyBDT05GSUdfQkY1MzkgaXMgbm90IHNldAogIyBDT05GSUdfQkY1NDIgaXMgbm90IHNldAogIyBDT05GSUdfQkY1NDQgaXMgbm90IHNldAogIyBDT05GSUdfQkY1NDcgaXMgbm90IHNldAogIyBDT05GSUdfQkY1NDggaXMgbm90IHNldAogIyBDT05GSUdfQkY1NDkgaXMgbm90IHNldAogIyBDT05GSUdfQkY1NjEgaXMgbm90IHNldAorQ09ORklHX0JGX1JFVl9NSU49MgorQ09ORklHX0JGX1JFVl9NQVg9MwogIyBDT05GSUdfQkZfUkVWXzBfMCBpcyBub3Qgc2V0CiAjIENPTkZJR19CRl9SRVZfMF8xIGlzIG5vdCBzZXQKIENPTkZJR19CRl9SRVZfMF8yPXkKICMgQ09ORklHX0JGX1JFVl8wXzMgaXMgbm90IHNldAogIyBDT05GSUdfQkZfUkVWXzBfNCBpcyBub3Qgc2V0CiAjIENPTkZJR19CRl9SRVZfMF81IGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGX1JFVl8wXzYgaXMgbm90IHNldAogIyBDT05GSUdfQkZfUkVWX0FOWSBpcyBub3Qgc2V0CiAjIENPTkZJR19CRl9SRVZfTk9ORSBpcyBub3Qgc2V0CiBDT05GSUdfQkY1M3g9eQotQ09ORklHX0JGSU5fU0lOR0xFX0NPUkU9eQogQ09ORklHX01FTV9NVDQ4TEMzMk04QTJfNzU9eQogQ09ORklHX0lSUV9QTExfV0FLRVVQPTcKIENPTkZJR19JUlFfUlRDPTgKQEAgLTE0NiwyOCArMTU2LDMwIEBACiBDT05GSUdfSVJRX1NQT1JUMV9SWD05CiBDT05GSUdfSVJRX1NQT1JUMV9UWD05CiBDT05GSUdfSVJRX1RXST0xMAotQ09ORklHX0lSUV9TUEk9MTAKIENPTkZJR19JUlFfVUFSVDBfUlg9MTAKIENPTkZJR19JUlFfVUFSVDBfVFg9MTAKIENPTkZJR19JUlFfVUFSVDFfUlg9MTAKIENPTkZJR19JUlFfVUFSVDFfVFg9MTAKIENPTkZJR19JUlFfTUFDX1JYPTExCiBDT05GSUdfSVJRX01BQ19UWD0xMQotQ09ORklHX0lSUV9UTVIwPTEyCi1DT05GSUdfSVJRX1RNUjE9MTIKLUNPTkZJR19JUlFfVE1SMj0xMgotQ09ORklHX0lSUV9UTVIzPTEyCi1DT05GSUdfSVJRX1RNUjQ9MTIKLUNPTkZJR19JUlFfVE1SNT0xMgotQ09ORklHX0lSUV9UTVI2PTEyCi1DT05GSUdfSVJRX1RNUjc9MTIKK0NPTkZJR19JUlFfVElNRVIwPTEyCitDT05GSUdfSVJRX1RJTUVSMT0xMgorQ09ORklHX0lSUV9USU1FUjI9MTIKK0NPTkZJR19JUlFfVElNRVIzPTEyCitDT05GSUdfSVJRX1RJTUVSND0xMgorQ09ORklHX0lSUV9USU1FUjU9MTIKK0NPTkZJR19JUlFfVElNRVI2PTEyCitDT05GSUdfSVJRX1RJTUVSNz0xMgogQ09ORklHX0lSUV9QT1JUR19JTlRCPTEyCiBDT05GSUdfSVJRX01FTV9ETUEwPTEzCiBDT05GSUdfSVJRX01FTV9ETUExPTEzCiBDT05GSUdfSVJRX1dBVENIPTEzCitDT05GSUdfSVJRX1NQST0xMAogIyBDT05GSUdfQkZJTjUzN19TVEFNUCBpcyBub3Qgc2V0CiAjIENPTkZJR19CRklONTM3X0JMVUVURUNITklYX0NNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGSU41MzdfQkxVRVRFQ0hOSVhfVENNIGlzIG5vdCBzZXQKIENPTkZJR19QTkFWMTA9eQorIyBDT05GSUdfQ0FNU0lHX01JTk9UQVVSIGlzIG5vdCBzZXQKICMgQ09ORklHX0dFTkVSSUNfQkY1MzdfQk9BUkQgaXMgbm90IHNldAogCiAjCkBAIC0xOTEsNiArMjAzLDcgQEAKICMgQm9hcmQgY3VzdG9taXphdGlvbnMKICMKICMgQ09ORklHX0NNRExJTkVfQk9PTCBpcyBub3Qgc2V0CitDT05GSUdfQk9PVF9MT0FEPTB4MTAwMAogCiAjCiAjIENsb2NrL1BMTCBTZXR1cApAQCAtMTk5LDcgKzIxMiw3IEBACiAjIENPTkZJR19CRklOX0tFUk5FTF9DTE9DSyBpcyBub3Qgc2V0CiBDT05GSUdfTUFYX1ZDT19IWj02MDAwMDAwMDAKIENPTkZJR19NSU5fVkNPX0haPTUwMDAwMDAwCi1DT05GSUdfTUFYX1NDTEtfSFo9MTMzMDAwMDAwCitDT05GSUdfTUFYX1NDTEtfSFo9MTMzMzMzMzMzCiBDT05GSUdfTUlOX1NDTEtfSFo9MjcwMDAwMDAKIAogIwpAQCAtMjEwLDEzICsyMjMsMTcgQEAKICMgQ09ORklHX0haXzMwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19IWl8xMDAwIGlzIG5vdCBzZXQKIENPTkZJR19IWj0yNTAKKyMgQ09ORklHX1NDSEVEX0hSVElDSyBpcyBub3Qgc2V0CitDT05GSUdfR0VORVJJQ19USU1FPXkKK0NPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTPXkKKyMgQ09ORklHX0NZQ0xFU19DTE9DS1NPVVJDRSBpcyBub3Qgc2V0CisjIENPTkZJR19OT19IWiBpcyBub3Qgc2V0CisjIENPTkZJR19ISUdIX1JFU19USU1FUlMgaXMgbm90IHNldAorQ09ORklHX0dFTkVSSUNfQ0xPQ0tFVkVOVFNfQlVJTEQ9eQogCiAjCi0jIE1lbW9yeSBTZXR1cAorIyBNaXNjCiAjCi1DT05GSUdfTUFYX01FTV9TSVpFPTY0Ci1DT05GSUdfTUVNX0FERF9XSURUSD0xMAotQ09ORklHX0JPT1RfTE9BRD0weDEwMDAKIENPTkZJR19CRklOX1NDUkFUQ0hfUkVHX1JFVE49eQogIyBDT05GSUdfQkZJTl9TQ1JBVENIX1JFR19SRVRFIGlzIG5vdCBzZXQKICMgQ09ORklHX0JGSU5fU0NSQVRDSF9SRUdfQ1lDTEVTIGlzIG5vdCBzZXQKQEAgLTI0Myw2ICsyNjAsMTIgQEAKIENPTkZJR19DQUNIRUxJTkVfQUxJR05FRF9MMT15CiBDT05GSUdfU1lTQ0FMTF9UQUJfTDE9eQogQ09ORklHX0NQTEJfU1dJVENIX1RBQl9MMT15CitDT05GSUdfQVBQX1NUQUNLX0wxPXkKKworIworIyBTcGVlZCBPcHRpbWl6YXRpb25zCisjCitDT05GSUdfQkZJTl9JTlNfTE9XT1ZFUkhFQUQ9eQogQ09ORklHX1JBTUtFUk5FTD15CiAjIENPTkZJR19ST01LRVJORUwgaXMgbm90IHNldAogQ09ORklHX1NFTEVDVF9NRU1PUllfTU9ERUw9eQpAQCAtMjUxLDEzICsyNzQsMTQgQEAKICMgQ09ORklHX1NQQVJTRU1FTV9NQU5VQUwgaXMgbm90IHNldAogQ09ORklHX0ZMQVRNRU09eQogQ09ORklHX0ZMQVRfTk9ERV9NRU1fTUFQPXkKLSMgQ09ORklHX1NQQVJTRU1FTV9TVEFUSUMgaXMgbm90IHNldAorQ09ORklHX1BBR0VGTEFHU19FWFRFTkRFRD15CiBDT05GSUdfU1BMSVRfUFRMT0NLX0NQVVM9NAogIyBDT05GSUdfUkVTT1VSQ0VTXzY0QklUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BIWVNfQUREUl9UXzY0QklUIGlzIG5vdCBzZXQKIENPTkZJR19aT05FX0RNQV9GTEFHPTEKLUNPTkZJR19MQVJHRV9BTExPQ1M9eQotIyBDT05GSUdfQkZJTl9HUFRJTUVSUyBpcyBub3Qgc2V0Ci1DT05GSUdfQkZJTl9ETUFfNVhYPXkKK0NPTkZJR19WSVJUX1RPX0JVUz15CitDT05GSUdfQkZJTl9HUFRJTUVSUz15CisjIENPTkZJR19ETUFfVU5DQUNIRURfNE0gaXMgbm90IHNldAogIyBDT05GSUdfRE1BX1VOQ0FDSEVEXzJNIGlzIG5vdCBzZXQKIENPTkZJR19ETUFfVU5DQUNIRURfMU09eQogIyBDT05GSUdfRE1BX1VOQ0FDSEVEX05PTkUgaXMgbm90IHNldApAQCAtMjcxLDcgKzI5NSw3IEBACiAjIENPTkZJR19CRklOX0lDQUNIRV9MT0NLIGlzIG5vdCBzZXQKIENPTkZJR19CRklOX1dCPXkKICMgQ09ORklHX0JGSU5fV1QgaXMgbm90IHNldAotQ09ORklHX0wxX01BWF9QSUVDRT0xNgorIyBDT05GSUdfTVBVIGlzIG5vdCBzZXQKIAogIwogIyBBc3luY2hvbm91cyBNZW1vcnkgQ29uZmlndXJhdGlvbgpAQCAtMjk5LDEyICszMjMsNyBAQAogIwogIyBCdXMgb3B0aW9ucyAoUENJLCBQQ01DSUEsIEVJU0EsIE1DQSwgSVNBKQogIwotIyBDT05GSUdfUENJIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfU1VQUE9SVFNfTVNJIGlzIG5vdCBzZXQKLQotIwotIyBQQ0NBUkQgKFBDTUNJQS9DYXJkQnVzKSBzdXBwb3J0Ci0jCiAjIENPTkZJR19QQ0NBUkQgaXMgbm90IHNldAogCiAjCkBAIC0zMTQsMjEgKzMzMywyMCBAQAogQ09ORklHX0JJTkZNVF9GTEFUPXkKIENPTkZJR19CSU5GTVRfWkZMQVQ9eQogIyBDT05GSUdfQklORk1UX1NIQVJFRF9GTEFUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBVkVfQU9VVCBpcyBub3Qgc2V0CiAjIENPTkZJR19CSU5GTVRfTUlTQyBpcyBub3Qgc2V0CiAKICMKICMgUG93ZXIgbWFuYWdlbWVudCBvcHRpb25zCiAjCiAjIENPTkZJR19QTSBpcyBub3Qgc2V0CitDT05GSUdfQVJDSF9TVVNQRU5EX1BPU1NJQkxFPXkKKyMgQ09ORklHX1BNX1dBS0VVUF9CWV9HUElPIGlzIG5vdCBzZXQKIAogIwogIyBDUFUgRnJlcXVlbmN5IHNjYWxpbmcKICMKICMgQ09ORklHX0NQVV9GUkVRIGlzIG5vdCBzZXQKLQotIwotIyBOZXR3b3JraW5nCi0jCiBDT05GSUdfTkVUPXkKIAogIwpAQCAtMzQxLDYgKzM1OSw3IEBACiAjIENPTkZJR19YRlJNX1VTRVIgaXMgbm90IHNldAogIyBDT05GSUdfWEZSTV9TVUJfUE9MSUNZIGlzIG5vdCBzZXQKICMgQ09ORklHX1hGUk1fTUlHUkFURSBpcyBub3Qgc2V0CisjIENPTkZJR19YRlJNX1NUQVRJU1RJQ1MgaXMgbm90IHNldAogIyBDT05GSUdfTkVUX0tFWSBpcyBub3Qgc2V0CiBDT05GSUdfSU5FVD15CiAjIENPTkZJR19JUF9NVUxUSUNBU1QgaXMgbm90IHNldApAQCAtMzYyLDYgKzM4MSw3IEBACiBDT05GSUdfSU5FVF9YRlJNX01PREVfVFJBTlNQT1JUPXkKIENPTkZJR19JTkVUX1hGUk1fTU9ERV9UVU5ORUw9eQogQ09ORklHX0lORVRfWEZSTV9NT0RFX0JFRVQ9eQorIyBDT05GSUdfSU5FVF9MUk8gaXMgbm90IHNldAogQ09ORklHX0lORVRfRElBRz15CiBDT05GSUdfSU5FVF9UQ1BfRElBRz15CiAjIENPTkZJR19UQ1BfQ09OR19BRFZBTkNFRCBpcyBub3Qgc2V0CkBAIC0zNjksOCArMzg5LDYgQEAKIENPTkZJR19ERUZBVUxUX1RDUF9DT05HPSJjdWJpYyIKICMgQ09ORklHX1RDUF9NRDVTSUcgaXMgbm90IHNldAogIyBDT05GSUdfSVBWNiBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkVUNl9YRlJNX1RVTk5FTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkVUNl9UVU5ORUwgaXMgbm90IHNldAogIyBDT05GSUdfTkVUTEFCRUwgaXMgbm90IHNldAogIyBDT05GSUdfTkVUV09SS19TRUNNQVJLIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVEZJTFRFUiBpcyBub3Qgc2V0CkBAIC0zNzksNiArMzk3LDcgQEAKICMgQ09ORklHX1RJUEMgaXMgbm90IHNldAogIyBDT05GSUdfQVRNIGlzIG5vdCBzZXQKICMgQ09ORklHX0JSSURHRSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfRFNBIGlzIG5vdCBzZXQKICMgQ09ORklHX1ZMQU5fODAyMVEgaXMgbm90IHNldAogIyBDT05GSUdfREVDTkVUIGlzIG5vdCBzZXQKICMgQ09ORklHX0xMQzIgaXMgbm90IHNldApAQCAtMzg4LDEwICs0MDcsNiBAQAogIyBDT05GSUdfTEFQQiBpcyBub3Qgc2V0CiAjIENPTkZJR19FQ09ORVQgaXMgbm90IHNldAogIyBDT05GSUdfV0FOX1JPVVRFUiBpcyBub3Qgc2V0Ci0KLSMKLSMgUW9TIGFuZC9vciBmYWlyIHF1ZXVlaW5nCi0jCiAjIENPTkZJR19ORVRfU0NIRUQgaXMgbm90IHNldAogCiAjCkBAIC0zOTksMTggKzQxNCwxOSBAQAogIwogIyBDT05GSUdfTkVUX1BLVEdFTiBpcyBub3Qgc2V0CiAjIENPTkZJR19IQU1SQURJTyBpcyBub3Qgc2V0CisjIENPTkZJR19DQU4gaXMgbm90IHNldAogIyBDT05GSUdfSVJEQSBpcyBub3Qgc2V0CiAjIENPTkZJR19CVCBpcyBub3Qgc2V0CiAjIENPTkZJR19BRl9SWFJQQyBpcyBub3Qgc2V0Ci0KLSMKLSMgV2lyZWxlc3MKLSMKKyMgQ09ORklHX1BIT05FVCBpcyBub3Qgc2V0CitDT05GSUdfV0lSRUxFU1M9eQogIyBDT05GSUdfQ0ZHODAyMTEgaXMgbm90IHNldAorQ09ORklHX1dJUkVMRVNTX09MRF9SRUdVTEFUT1JZPXkKICMgQ09ORklHX1dJUkVMRVNTX0VYVCBpcyBub3Qgc2V0CiAjIENPTkZJR19NQUM4MDIxMSBpcyBub3Qgc2V0CiAjIENPTkZJR19JRUVFODAyMTEgaXMgbm90IHNldAogIyBDT05GSUdfUkZLSUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF85UCBpcyBub3Qgc2V0CiAKICMKICMgRGV2aWNlIERyaXZlcnMKQEAgLTQxOSwxNCArNDM1LDExIEBACiAjCiAjIEdlbmVyaWMgRHJpdmVyIE9wdGlvbnMKICMKK0NPTkZJR19VRVZFTlRfSEVMUEVSX1BBVEg9Ii9zYmluL2hvdHBsdWciCiBDT05GSUdfU1RBTkRBTE9ORT15CiBDT05GSUdfUFJFVkVOVF9GSVJNV0FSRV9CVUlMRD15CiAjIENPTkZJR19GV19MT0FERVIgaXMgbm90IHNldAogIyBDT05GSUdfU1lTX0hZUEVSVklTT1IgaXMgbm90IHNldAotCi0jCi0jIENvbm5lY3RvciAtIHVuaWZpZWQgdXNlcnNwYWNlIDwtPiBrZXJuZWxzcGFjZSBsaW5rZXIKLSMKICMgQ09ORklHX0NPTk5FQ1RPUiBpcyBub3Qgc2V0CiBDT05GSUdfTVREPXkKICMgQ09ORklHX01URF9ERUJVRyBpcyBub3Qgc2V0CkBAIC00MzQsNiArNDQ3LDcgQEAKIENPTkZJR19NVERfUEFSVElUSU9OUz15CiAjIENPTkZJR19NVERfUkVEQk9PVF9QQVJUUyBpcyBub3Qgc2V0CiAjIENPTkZJR19NVERfQ01ETElORV9QQVJUUyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQVI3X1BBUlRTIGlzIG5vdCBzZXQKIAogIwogIyBVc2VyIE1vZHVsZXMgQW5kIFRyYW5zbGF0aW9uIExheWVycwpAQCAtNDQ2LDYgKzQ2MCw3IEBACiAjIENPTkZJR19JTkZUTCBpcyBub3Qgc2V0CiAjIENPTkZJR19SRkRfRlRMIGlzIG5vdCBzZXQKICMgQ09ORklHX1NTRkRDIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9PT1BTIGlzIG5vdCBzZXQKIAogIwogIyBSQU0vUk9NL0ZsYXNoIGNoaXAgZHJpdmVycwpAQCAtNDcwLDcgKzQ4NSw3IEBACiAjIE1hcHBpbmcgZHJpdmVycyBmb3IgY2hpcCBhY2Nlc3MKICMKIENPTkZJR19NVERfQ09NUExFWF9NQVBQSU5HUz15Ci0jIENPTkZJR19NVERfQkY1eHggaXMgbm90IHNldAorIyBDT05GSUdfTVREX0dQSU9fQUREUiBpcyBub3Qgc2V0CiBDT05GSUdfTVREX1VDTElOVVg9eQogIyBDT05GSUdfTVREX1BMQVRSQU0gaXMgbm90IHNldAogCkBAIC01MDksMzMgKzUyNCwyMiBAQAogIyBVQkkgLSBVbnNvcnRlZCBibG9jayBpbWFnZXMKICMKICMgQ09ORklHX01URF9VQkkgaXMgbm90IHNldAotCi0jCi0jIFBhcmFsbGVsIHBvcnQgc3VwcG9ydAotIwogIyBDT05GSUdfUEFSUE9SVCBpcyBub3Qgc2V0Ci0KLSMKLSMgUGx1ZyBhbmQgUGxheSBzdXBwb3J0Ci0jCi0jIENPTkZJR19QTlBBQ1BJIGlzIG5vdCBzZXQKLQotIwotIyBCbG9jayBkZXZpY2VzCi0jCitDT05GSUdfQkxLX0RFVj15CiAjIENPTkZJR19CTEtfREVWX0NPV19DT01NT04gaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9MT09QIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfTkJEIGlzIG5vdCBzZXQKIENPTkZJR19CTEtfREVWX1JBTT15CiBDT05GSUdfQkxLX0RFVl9SQU1fQ09VTlQ9MTYKIENPTkZJR19CTEtfREVWX1JBTV9TSVpFPTQwOTYKLUNPTkZJR19CTEtfREVWX1JBTV9CTE9DS1NJWkU9MTAyNAorIyBDT05GSUdfQkxLX0RFVl9YSVAgaXMgbm90IHNldAogIyBDT05GSUdfQ0RST01fUEtUQ0RWRCBpcyBub3Qgc2V0CiAjIENPTkZJR19BVEFfT1ZFUl9FVEggaXMgbm90IHNldAotCi0jCi0jIE1pc2MgZGV2aWNlcwotIworIyBDT05GSUdfQkxLX0RFVl9IRCBpcyBub3Qgc2V0CitDT05GSUdfTUlTQ19ERVZJQ0VTPXkKKyMgQ09ORklHX0VFUFJPTV85M0NYNiBpcyBub3Qgc2V0CisjIENPTkZJR19FTkNMT1NVUkVfU0VSVklDRVMgaXMgbm90IHNldAorQ09ORklHX0hBVkVfSURFPXkKICMgQ09ORklHX0lERSBpcyBub3Qgc2V0CiAKICMKQEAgLTU0MywyMiArNTQ3LDE3IEBACiAjCiAjIENPTkZJR19SQUlEX0FUVFJTIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0kgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9ETUEgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9ORVRMSU5LIGlzIG5vdCBzZXQKICMgQ09ORklHX0FUQSBpcyBub3Qgc2V0Ci0KLSMKLSMgTXVsdGktZGV2aWNlIHN1cHBvcnQgKFJBSUQgYW5kIExWTSkKLSMKICMgQ09ORklHX01EIGlzIG5vdCBzZXQKLQotIwotIyBOZXR3b3JrIGRldmljZSBzdXBwb3J0Ci0jCiBDT05GSUdfTkVUREVWSUNFUz15CiAjIENPTkZJR19EVU1NWSBpcyBub3Qgc2V0CiAjIENPTkZJR19CT05ESU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQ1ZMQU4gaXMgbm90IHNldAogIyBDT05GSUdfRVFVQUxJWkVSIGlzIG5vdCBzZXQKICMgQ09ORklHX1RVTiBpcyBub3Qgc2V0CisjIENPTkZJR19WRVRIIGlzIG5vdCBzZXQKIENPTkZJR19QSFlMSUI9eQogCiAjCkBAIC01NzIsNDYgKzU3MSw0NSBAQAogIyBDT05GSUdfVklURVNTRV9QSFkgaXMgbm90IHNldAogIyBDT05GSUdfU01TQ19QSFkgaXMgbm90IHNldAogIyBDT05GSUdfQlJPQURDT01fUEhZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lDUExVU19QSFkgaXMgbm90IHNldAorIyBDT05GSUdfUkVBTFRFS19QSFkgaXMgbm90IHNldAogIyBDT05GSUdfRklYRURfUEhZIGlzIG5vdCBzZXQKLQotIwotIyBFdGhlcm5ldCAoMTAgb3IgMTAwTWJpdCkKLSMKKyMgQ09ORklHX01ESU9fQklUQkFORyBpcyBub3Qgc2V0CiBDT05GSUdfTkVUX0VUSEVSTkVUPXkKIENPTkZJR19NSUk9eQotIyBDT05GSUdfU01DOTFYIGlzIG5vdCBzZXQKIENPTkZJR19CRklOX01BQz15CiAjIENPTkZJR19CRklOX01BQ19VU0VfTDEgaXMgbm90IHNldAogQ09ORklHX0JGSU5fVFhfREVTQ19OVU09MTAwCiBDT05GSUdfQkZJTl9SWF9ERVNDX05VTT0xMDAKIENPTkZJR19CRklOX01BQ19STUlJPXkKKyMgQ09ORklHX1NNQzkxWCBpcyBub3Qgc2V0CiAjIENPTkZJR19TTVNDOTExWCBpcyBub3Qgc2V0CiAjIENPTkZJR19ETTkwMDAgaXMgbm90IHNldAorIyBDT05GSUdfRU5DMjhKNjAgaXMgbm90IHNldAorIyBDT05GSUdfSUJNX05FV19FTUFDX1pNSUkgaXMgbm90IHNldAorIyBDT05GSUdfSUJNX05FV19FTUFDX1JHTUlJIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lCTV9ORVdfRU1BQ19UQUggaXMgbm90IHNldAorIyBDT05GSUdfSUJNX05FV19FTUFDX0VNQUM0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0lCTV9ORVdfRU1BQ19OT19GTE9XX0NUUkwgaXMgbm90IHNldAorIyBDT05GSUdfSUJNX05FV19FTUFDX01BTF9DTFJfSUNJTlRTVEFUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lCTV9ORVdfRU1BQ19NQUxfQ09NTU9OX0VSUiBpcyBub3Qgc2V0CiBDT05GSUdfTkVUREVWXzEwMDA9eQotQ09ORklHX05FVERFVl8xMDAwMD15CiAjIENPTkZJR19BWDg4MTgwIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRERVZfMTAwMDA9eQogCiAjCiAjIFdpcmVsZXNzIExBTgogIwogIyBDT05GSUdfV0xBTl9QUkU4MDIxMSBpcyBub3Qgc2V0CiAjIENPTkZJR19XTEFOXzgwMjExIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lXTFdJRklfTEVEUyBpcyBub3Qgc2V0CiAjIENPTkZJR19XQU4gaXMgbm90IHNldAogIyBDT05GSUdfUFBQIGlzIG5vdCBzZXQKICMgQ09ORklHX1NMSVAgaXMgbm90IHNldAotIyBDT05GSUdfU0hBUEVSIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVENPTlNPTEUgaXMgbm90IHNldAogIyBDT05GSUdfTkVUUE9MTCBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSIGlzIG5vdCBzZXQKLQotIwotIyBJU0ROIHN1YnN5c3RlbQotIwogIyBDT05GSUdfSVNETiBpcyBub3Qgc2V0Ci0KLSMKLSMgVGVsZXBob255IFN1cHBvcnQKLSMKICMgQ09ORklHX1BIT05FIGlzIG5vdCBzZXQKIAogIwpAQCAtNjI2LDkgKzYyNCw2IEBACiAjCiAjIENPTkZJR19JTlBVVF9NT1VTRURFViBpcyBub3Qgc2V0CiAjIENPTkZJR19JTlBVVF9KT1lERVYgaXMgbm90IHNldAotQ09ORklHX0lOUFVUX1RTREVWPXkKLUNPTkZJR19JTlBVVF9UU0RFVl9TQ1JFRU5fWD0yNDAKLUNPTkZJR19JTlBVVF9UU0RFVl9TQ1JFRU5fWT0zMjAKIENPTkZJR19JTlBVVF9FVkRFVj15CiAjIENPTkZJR19JTlBVVF9FVkJVRyBpcyBub3Qgc2V0CiAKQEAgLTY0MiwyNCArNjM3LDI5IEBACiBDT05GSUdfSU5QVVRfVE9VQ0hTQ1JFRU49eQogIyBDT05GSUdfVE9VQ0hTQ1JFRU5fQURTNzg0NiBpcyBub3Qgc2V0CiBDT05GSUdfVE9VQ0hTQ1JFRU5fQUQ3ODc3PXkKKyMgQ09ORklHX1RPVUNIU0NSRUVOX0FENzg3OV9JMkMgaXMgbm90IHNldAorIyBDT05GSUdfVE9VQ0hTQ1JFRU5fQUQ3ODc5X1NQSSBpcyBub3Qgc2V0CisjIENPTkZJR19UT1VDSFNDUkVFTl9BRDc4NzkgaXMgbm90IHNldAorIyBDT05GSUdfVE9VQ0hTQ1JFRU5fRlVKSVRTVSBpcyBub3Qgc2V0CiAjIENPTkZJR19UT1VDSFNDUkVFTl9HVU5aRSBpcyBub3Qgc2V0CiAjIENPTkZJR19UT1VDSFNDUkVFTl9FTE8gaXMgbm90IHNldAogIyBDT05GSUdfVE9VQ0hTQ1JFRU5fTVRPVUNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RPVUNIU0NSRUVOX0lORVhJTyBpcyBub3Qgc2V0CiAjIENPTkZJR19UT1VDSFNDUkVFTl9NSzcxMiBpcyBub3Qgc2V0CiAjIENPTkZJR19UT1VDSFNDUkVFTl9QRU5NT1VOVCBpcyBub3Qgc2V0CiAjIENPTkZJR19UT1VDSFNDUkVFTl9UT1VDSFJJR0hUIGlzIG5vdCBzZXQKICMgQ09ORklHX1RPVUNIU0NSRUVOX1RPVUNIV0lOIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RPVUNIU0NSRUVOX1VDQjE0MDAgaXMgbm90IHNldAogIyBDT05GSUdfVE9VQ0hTQ1JFRU5fVVNCX0NPTVBPU0lURSBpcyBub3Qgc2V0CisjIENPTkZJR19UT1VDSFNDUkVFTl9UT1VDSElUMjEzIGlzIG5vdCBzZXQKIENPTkZJR19JTlBVVF9NSVNDPXkKICMgQ09ORklHX0lOUFVUX0FUSV9SRU1PVEUgaXMgbm90IHNldAogIyBDT05GSUdfSU5QVVRfQVRJX1JFTU9URTIgaXMgbm90IHNldAogIyBDT05GSUdfSU5QVVRfS0VZU1BBTl9SRU1PVEUgaXMgbm90IHNldAogIyBDT05GSUdfSU5QVVRfUE9XRVJNQVRFIGlzIG5vdCBzZXQKICMgQ09ORklHX0lOUFVUX1lFQUxJTksgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfQ00xMDkgaXMgbm90IHNldAogQ09ORklHX0lOUFVUX1VJTlBVVD15Ci0jIENPTkZJR19CRjUzWF9QRkJVVFRPTlMgaXMgbm90IHNldAotIyBDT05GSUdfVFdJX0tFWVBBRCBpcyBub3Qgc2V0CisjIENPTkZJR19DT05GSUdfSU5QVVRfUENGODU3NCBpcyBub3Qgc2V0CiAKICMKICMgSGFyZHdhcmUgSS9PIHBvcnRzCkBAIC02NzIsMTggKzY3MiwxNyBAQAogIwogIyBDT05GSUdfQUQ5OTYwIGlzIG5vdCBzZXQKICMgQ09ORklHX1NQSV9BRENfQkY1MzMgaXMgbm90IHNldAotIyBDT05GSUdfQkY1eHhfUEZMQUdTIGlzIG5vdCBzZXQKICMgQ09ORklHX0JGNXh4X1BQSUZDRCBpcyBub3Qgc2V0CiAjIENPTkZJR19CRklOX1NJTVBMRV9USU1FUiBpcyBub3Qgc2V0CiAjIENPTkZJR19CRjV4eF9QUEkgaXMgbm90IHNldAogQ09ORklHX0JGSU5fU1BPUlQ9eQogIyBDT05GSUdfQkZJTl9USU1FUl9MQVRFTkNZIGlzIG5vdCBzZXQKIENPTkZJR19UV0lfTENEPW0KLUNPTkZJR19UV0lfTENEX1NMQVZFX0FERFI9MzQKLSMgQ09ORklHX0FENTMwNCBpcyBub3Qgc2V0Ci0jIENPTkZJR19CRjV4eF9URUE1NzY0IGlzIG5vdCBzZXQKLSMgQ09ORklHX0JGNXh4X0ZCRE1BIGlzIG5vdCBzZXQKK0NPTkZJR19CRklOX0RNQV9JTlRFUkZBQ0U9bQorIyBDT05GSUdfU0lNUExFX0dQSU8gaXMgbm90IHNldAogIyBDT05GSUdfVlQgaXMgbm90IHNldAorQ09ORklHX0RFVktNRU09eQorIyBDT05GSUdfQkZJTl9KVEFHX0NPTU0gaXMgbm90IHNldAogIyBDT05GSUdfU0VSSUFMX05PTlNUQU5EQVJEIGlzIG5vdCBzZXQKIAogIwpAQCAtNzE2LDY4ICs3MTUsNTkgQEAKICMKICMgbGludXggZW1iZWRkZWQgZHJpdmVycwogIwotIyBDT05GSUdfQ0FOX01DRjUyODIgaXMgbm90IHNldAotIyBDT05GSUdfQ0FOX1VOQ1RXSU5DQU4gaXMgbm90IHNldAogQ09ORklHX0NBTl9CTEFDS0ZJTj1tCi0KLSMKLSMgSVBNSQotIwogIyBDT05GSUdfSVBNSV9IQU5ETEVSIGlzIG5vdCBzZXQKLSMgQ09ORklHX1dBVENIRE9HIGlzIG5vdCBzZXQKIENPTkZJR19IV19SQU5ET009eQotIyBDT05GSUdfR0VOX1JUQyBpcyBub3Qgc2V0CiAjIENPTkZJR19SMzk2NCBpcyBub3Qgc2V0CiAjIENPTkZJR19SQVdfRFJJVkVSIGlzIG5vdCBzZXQKLQotIwotIyBUUE0gZGV2aWNlcwotIwogIyBDT05GSUdfVENHX1RQTSBpcyBub3Qgc2V0CiBDT05GSUdfSTJDPXkKIENPTkZJR19JMkNfQk9BUkRJTkZPPXkKIENPTkZJR19JMkNfQ0hBUkRFVj15Ci0KLSMKLSMgSTJDIEFsZ29yaXRobXMKLSMKLSMgQ09ORklHX0kyQ19BTEdPQklUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19BTEdPUENGIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19BTEdPUENBIGlzIG5vdCBzZXQKK0NPTkZJR19JMkNfSEVMUEVSX0FVVE89eQogCiAjCiAjIEkyQyBIYXJkd2FyZSBCdXMgc3VwcG9ydAogIwotIyBDT05GSUdfSTJDX0JMQUNLRklOX0dQSU8gaXMgbm90IHNldAorCisjCisjIEkyQyBzeXN0ZW0gYnVzIGRyaXZlcnMgKG1vc3RseSBlbWJlZGRlZCAvIHN5c3RlbS1vbi1jaGlwKQorIwogQ09ORklHX0kyQ19CTEFDS0ZJTl9UV0k9eQotQ09ORklHX0kyQ19CTEFDS0ZJTl9UV0lfQ0xLX0tIWj01MAorQ09ORklHX0kyQ19CTEFDS0ZJTl9UV0lfQ0xLX0tIWj0xMDAKICMgQ09ORklHX0kyQ19HUElPIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19PQ09SRVMgaXMgbm90IHNldAotIyBDT05GSUdfSTJDX1BBUlBPUlRfTElHSFQgaXMgbm90IHNldAogIyBDT05GSUdfSTJDX1NJTVRFQyBpcyBub3Qgc2V0CisKKyMKKyMgRXh0ZXJuYWwgSTJDL1NNQnVzIGFkYXB0ZXIgZHJpdmVycworIworIyBDT05GSUdfSTJDX1BBUlBPUlRfTElHSFQgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1RBT1NfRVZNIGlzIG5vdCBzZXQKKworIworIyBPdGhlciBJMkMvU01CdXMgYnVzIGRyaXZlcnMKKyMKKyMgQ09ORklHX0kyQ19QQ0FfUExBVEZPUk0gaXMgbm90IHNldAogIyBDT05GSUdfSTJDX1NUVUIgaXMgbm90IHNldAogCiAjCiAjIE1pc2NlbGxhbmVvdXMgSTJDIENoaXAgc3VwcG9ydAogIwotIyBDT05GSUdfU0VOU09SU19EUzEzMzcgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19EUzEzNzQgaXMgbm90IHNldAorIyBDT05GSUdfRFMxNjgyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUMjQgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19BRDUyNTIgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19FRVBST00gaXMgbm90IHNldAogQ09ORklHX1NFTlNPUlNfUENGODU3ND1tCi1DT05GSUdfU0VOU09SU19QQ0Y4NTc1PXkKLSMgQ09ORklHX1NFTlNPUlNfUENBOTU0MyBpcyBub3Qgc2V0CisjIENPTkZJR19QQ0Y4NTc1IGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfUENBOTUzOSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1BDRjg1OTEgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19NQVg2ODc1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVFNMMjU1MCBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfREVCVUdfQ09SRSBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfREVCVUdfQUxHTyBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfREVCVUdfQlVTIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19ERUJVR19DSElQIGlzIG5vdCBzZXQKLQotIwotIyBTUEkgc3VwcG9ydAotIwogQ09ORklHX1NQST15CiBDT05GSUdfU1BJX01BU1RFUj15CiAKQEAgLTc4NSw2ICs3NzUsNyBAQAogIyBTUEkgTWFzdGVyIENvbnRyb2xsZXIgRHJpdmVycwogIwogQ09ORklHX1NQSV9CRklOPXkKKyMgQ09ORklHX1NQSV9CRklOX0xPQ0sgaXMgbm90IHNldAogIyBDT05GSUdfU1BJX0JJVEJBTkcgaXMgbm90IHNldAogCiAjCkBAIC03OTIsMjcgKzc4MywyOSBAQAogIwogIyBDT05GSUdfU1BJX0FUMjUgaXMgbm90IHNldAogIyBDT05GSUdfU1BJX1NQSURFViBpcyBub3Qgc2V0Ci0KLSMKLSMgRGFsbGFzJ3MgMS13aXJlIGJ1cwotIworIyBDT05GSUdfU1BJX1RMRTYyWDAgaXMgbm90IHNldAorQ09ORklHX0FSQ0hfV0FOVF9PUFRJT05BTF9HUElPTElCPXkKKyMgQ09ORklHX0dQSU9MSUIgaXMgbm90IHNldAogIyBDT05GSUdfVzEgaXMgbm90IHNldAorIyBDT05GSUdfUE9XRVJfU1VQUExZIGlzIG5vdCBzZXQKIENPTkZJR19IV01PTj15CiAjIENPTkZJR19IV01PTl9WSUQgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19BQklUVUdVUlUgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRDc0MTQgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19BRDc0MTggaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRENYWCBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0FETTEwMjEgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19BRE0xMDI1IGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfQURNMTAyNiBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0FETTEwMjkgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19BRE0xMDMxIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfQURNOTI0MCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX0FTQjEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FEVDc0NzAgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRFQ3NDczIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfQVRYUDEgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19EUzE2MjEgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19GNzE4MDVGIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfRlNDSEVSIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfRlNDUE9TIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfRjcxODgyRkcgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19GNzUzNzVTIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfR0w1MThTTSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0dMNTIwU00gaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19JVDg3IGlzIG5vdCBzZXQKQEAgLTgyNyw1OCArODIwLDc2IEBACiAjIENPTkZJR19TRU5TT1JTX0xNODcgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19MTTkwIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfTE05MiBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNOTMgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19NQVgxMTExIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfTUFYMTYxOSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX01BWDY2NTAgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19QQzg3MzYwIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfUEM4NzQyNyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0RNRTE3MzcgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19TTVNDNDdNMSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1NNU0M0N00xOTIgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19TTVNDNDdCMzk3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURTNzgyOCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1RITUM1MCBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1ZUMTIxMSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1c4Mzc4MUQgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19XODM3OTFEIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfVzgzNzkyRCBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1c4Mzc5MyBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1c4M0w3ODVUUyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1c4M0w3ODZORyBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1c4MzYyN0hGIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfVzgzNjI3RUhGIGlzIG5vdCBzZXQKICMgQ09ORklHX0hXTU9OX0RFQlVHX0NISVAgaXMgbm90IHNldAorIyBDT05GSUdfVEhFUk1BTCBpcyBub3Qgc2V0CisjIENPTkZJR19USEVSTUFMX0hXTU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dBVENIRE9HIGlzIG5vdCBzZXQKIAogIwogIyBNdWx0aWZ1bmN0aW9uIGRldmljZSBkcml2ZXJzCiAjCisjIENPTkZJR19NRkRfQ09SRSBpcyBub3Qgc2V0CiAjIENPTkZJR19NRkRfU001MDEgaXMgbm90IHNldAorIyBDT05GSUdfSFRDX1BBU0lDMyBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfVE1JTyBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfV004NDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9XTTgzNTBfSTJDIGlzIG5vdCBzZXQKIAogIwogIyBNdWx0aW1lZGlhIGRldmljZXMKICMKKworIworIyBNdWx0aW1lZGlhIGNvcmUgc3VwcG9ydAorIwogIyBDT05GSUdfVklERU9fREVWIGlzIG5vdCBzZXQKICMgQ09ORklHX0RWQl9DT1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZJREVPX01FRElBIGlzIG5vdCBzZXQKKworIworIyBNdWx0aW1lZGlhIGRyaXZlcnMKKyMKIENPTkZJR19EQUI9eQogCiAjCiAjIEdyYXBoaWNzIHN1cHBvcnQKICMKLUNPTkZJR19CQUNLTElHSFRfTENEX1NVUFBPUlQ9eQotQ09ORklHX0JBQ0tMSUdIVF9DTEFTU19ERVZJQ0U9eQotQ09ORklHX0xDRF9DTEFTU19ERVZJQ0U9eQotCi0jCi0jIERpc3BsYXkgZGV2aWNlIHN1cHBvcnQKLSMKLSMgQ09ORklHX0RJU1BMQVlfU1VQUE9SVCBpcyBub3Qgc2V0CiAjIENPTkZJR19WR0FTVEFURSBpcyBub3Qgc2V0CisjIENPTkZJR19WSURFT19PVVRQVVRfQ09OVFJPTCBpcyBub3Qgc2V0CiBDT05GSUdfRkI9eQogQ09ORklHX0ZJUk1XQVJFX0VESUQ9eQogIyBDT05GSUdfRkJfRERDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX0JPT1RfVkVTQV9TVVBQT1JUIGlzIG5vdCBzZXQKIENPTkZJR19GQl9DRkJfRklMTFJFQ1Q9eQogQ09ORklHX0ZCX0NGQl9DT1BZQVJFQT15CiBDT05GSUdfRkJfQ0ZCX0lNQUdFQkxJVD15CisjIENPTkZJR19GQl9DRkJfUkVWX1BJWEVMU19JTl9CWVRFIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX1NZU19GSUxMUkVDVCBpcyBub3Qgc2V0CiAjIENPTkZJR19GQl9TWVNfQ09QWUFSRUEgaXMgbm90IHNldAogIyBDT05GSUdfRkJfU1lTX0lNQUdFQkxJVCBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9GT1JFSUdOX0VORElBTiBpcyBub3Qgc2V0CiAjIENPTkZJR19GQl9TWVNfRk9QUyBpcyBub3Qgc2V0Ci1DT05GSUdfRkJfREVGRVJSRURfSU89eQogIyBDT05GSUdfRkJfU1ZHQUxJQiBpcyBub3Qgc2V0CiAjIENPTkZJR19GQl9NQUNNT0RFUyBpcyBub3Qgc2V0CiAjIENPTkZJR19GQl9CQUNLTElHSFQgaXMgbm90IHNldApAQCAtODg4LDI1ICs4OTksMzQgQEAKICMKICMgRnJhbWUgYnVmZmVyIGhhcmR3YXJlIGRyaXZlcnMKICMKLSMgQ09ORklHX0ZCX0JGSU5fNzE3MSBpcyBub3Qgc2V0Ci0jIENPTkZJR19GQl9CRklOXzczOTMgaXMgbm90IHNldAorIyBDT05GSUdfRkJfQkZJTl9UMzUwTUNRQiBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9CRklOX0xRMDM1UTEgaXMgbm90IHNldAogQ09ORklHX0ZCX0JGNTM3X0xRMDM1PXkKIENPTkZJR19MUTAzNV9TTEFWRV9BRERSPTB4NTgKIENPTkZJR19GQl9CRklOX0xBTkRTQ0FQRT15CiAjIENPTkZJR19GQl9CRklOX0JHUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19GQl9CRklOX1QzNTBNQ1FCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX0JGSU5fNzM5MyBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9ISVRBQ0hJX1RYMDkgaXMgbm90IHNldAogIyBDT05GSUdfRkJfUzFEMTNYWFggaXMgbm90IHNldAogIyBDT05GSUdfRkJfVklSVFVBTCBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9NRVRST05PTUUgaXMgbm90IHNldAorQ09ORklHX0JBQ0tMSUdIVF9MQ0RfU1VQUE9SVD15CitDT05GSUdfTENEX0NMQVNTX0RFVklDRT15CisjIENPTkZJR19MQ0RfTFRWMzUwUVYgaXMgbm90IHNldAorIyBDT05GSUdfTENEX0lMSTkzMjAgaXMgbm90IHNldAorIyBDT05GSUdfTENEX1RETzI0TSBpcyBub3Qgc2V0CisjIENPTkZJR19MQ0RfVkdHMjQzMkE0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0xDRF9QTEFURk9STSBpcyBub3Qgc2V0CitDT05GSUdfQkFDS0xJR0hUX0NMQVNTX0RFVklDRT15CisjIENPTkZJR19CQUNLTElHSFRfQ09SR0kgaXMgbm90IHNldAorCisjCisjIERpc3BsYXkgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX0RJU1BMQVlfU1VQUE9SVCBpcyBub3Qgc2V0CiAjIENPTkZJR19MT0dPIGlzIG5vdCBzZXQKLQotIwotIyBTb3VuZAotIwogQ09ORklHX1NPVU5EPXkKLQotIwotIyBBZHZhbmNlZCBMaW51eCBTb3VuZCBBcmNoaXRlY3R1cmUKLSMKK0NPTkZJR19TT1VORF9PU1NfQ09SRT15CiBDT05GSUdfU05EPW0KICMgQ09ORklHX1NORF9TRVFVRU5DRVIgaXMgbm90IHNldAogIyBDT05GSUdfU05EX01JWEVSX09TUyBpcyBub3Qgc2V0CkBAIC05MTYsNDYgKzkzNiwzMCBAQAogIyBDT05GSUdfU05EX1ZFUkJPU0VfUFJPQ0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1NORF9WRVJCT1NFX1BSSU5USyBpcyBub3Qgc2V0CiAjIENPTkZJR19TTkRfREVCVUcgaXMgbm90IHNldAotCi0jCi0jIEdlbmVyaWMgZGV2aWNlcwotIworQ09ORklHX1NORF9EUklWRVJTPXkKICMgQ09ORklHX1NORF9EVU1NWSBpcyBub3Qgc2V0CiAjIENPTkZJR19TTkRfTVRQQVYgaXMgbm90IHNldAogIyBDT05GSUdfU05EX1NFUklBTF9VMTY1NTAgaXMgbm90IHNldAogIyBDT05GSUdfU05EX01QVTQwMSBpcyBub3Qgc2V0CitDT05GSUdfU05EX1NQST15CiAKICMKICMgQUxTQSBCbGFja2ZpbiBkZXZpY2VzCiAjCiAjIENPTkZJR19TTkRfQkxBQ0tGSU5fQUQxODM2IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9CRklOX0FENzMzMTEgaXMgbm90IHNldAotCi0jCi0jIFN5c3RlbSBvbiBDaGlwIGF1ZGlvIHN1cHBvcnQKLSMKKyMgQ09ORklHX1NORF9CRklOX0FENzMzMjIgaXMgbm90IHNldAogIyBDT05GSUdfU05EX1NPQyBpcyBub3Qgc2V0Ci0KLSMKLSMgT3BlbiBTb3VuZCBTeXN0ZW0KLSMKIENPTkZJR19TT1VORF9QUklNRT15Ci0jIENPTkZJR19PU1NfT0JTT0xFVEUgaXMgbm90IHNldAotIyBDT05GSUdfU09VTkRfTVNORENMQVMgaXMgbm90IHNldAotIyBDT05GSUdfU09VTkRfTVNORFBJTiBpcyBub3Qgc2V0Ci0KLSMKLSMgSElEIERldmljZXMKLSMKK0NPTkZJR19ISURfU1VQUE9SVD15CiAjIENPTkZJR19ISUQgaXMgbm90IHNldAotCi0jCi0jIFVTQiBzdXBwb3J0Ci0jCisjIENPTkZJR19ISURfUElEIGlzIG5vdCBzZXQKK0NPTkZJR19VU0JfU1VQUE9SVD15CiBDT05GSUdfVVNCX0FSQ0hfSEFTX0hDRD15CiAjIENPTkZJR19VU0JfQVJDSF9IQVNfT0hDSSBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfQVJDSF9IQVNfRUhDSSBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0IgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX09UR19XSElURUxJU1QgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX09UR19CTEFDS0xJU1RfSFVCIGlzIG5vdCBzZXQKIAogIwogIyBFbmFibGUgSG9zdCBvciBHYWRnZXQgc3VwcG9ydCB0byBzZWUgSW52ZW50cmEgb3B0aW9ucwpAQCAtOTY0LDM3ICs5NjgsMTEgQEAKICMKICMgTk9URTogVVNCX1NUT1JBR0UgZW5hYmxlcyBTQ1NJLCBhbmQgJ1NDU0kgZGlzayBzdXBwb3J0JwogIwotCi0jCi0jIFVTQiBHYWRnZXQgU3VwcG9ydAotIwogIyBDT05GSUdfVVNCX0dBREdFVCBpcyBub3Qgc2V0CiAjIENPTkZJR19NTUMgaXMgbm90IHNldAotCi0jCi0jIExFRCBkZXZpY2VzCi0jCisjIENPTkZJR19NRU1TVElDSyBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVdfTEVEUyBpcyBub3Qgc2V0Ci0KLSMKLSMgTEVEIGRyaXZlcnMKLSMKLQotIwotIyBMRUQgVHJpZ2dlcnMKLSMKLQotIwotIyBJbmZpbmlCYW5kIHN1cHBvcnQKLSMKLQotIwotIyBFREFDIC0gZXJyb3IgZGV0ZWN0aW9uIGFuZCByZXBvcnRpbmcgKFJBUykgKEVYUEVSSU1FTlRBTCkKLSMKLQotIwotIyBSZWFsIFRpbWUgQ2xvY2sKLSMKKyMgQ09ORklHX0FDQ0VTU0lCSUxJVFkgaXMgbm90IHNldAogQ09ORklHX1JUQ19MSUI9eQogQ09ORklHX1JUQ19DTEFTUz15CiBDT05GSUdfUlRDX0hDVE9TWVM9eQpAQCAtMTAxNCw2ICs5OTIsNyBAQAogIyBJMkMgUlRDIGRyaXZlcnMKICMKICMgQ09ORklHX1JUQ19EUlZfRFMxMzA3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfRFMxMzc0IGlzIG5vdCBzZXQKICMgQ09ORklHX1JUQ19EUlZfRFMxNjcyIGlzIG5vdCBzZXQKICMgQ09ORklHX1JUQ19EUlZfTUFYNjkwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19SVENfRFJWX1JTNUMzNzIgaXMgbm90IHNldApAQCAtMTAyMSw0MyArMTAwMCw0MSBAQAogIyBDT05GSUdfUlRDX0RSVl9YMTIwNSBpcyBub3Qgc2V0CiAjIENPTkZJR19SVENfRFJWX1BDRjg1NjMgaXMgbm90IHNldAogIyBDT05GSUdfUlRDX0RSVl9QQ0Y4NTgzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfTTQxVDgwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfUzM1MzkwQSBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0ZNMzEzMCBpcyBub3Qgc2V0CiAKICMKICMgU1BJIFJUQyBkcml2ZXJzCiAjCi0jIENPTkZJR19SVENfRFJWX1JTNUMzNDggaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9NNDFUOTQgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9EUzEzMDUgaXMgbm90IHNldAogIyBDT05GSUdfUlRDX0RSVl9NQVg2OTAyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfUjk3MDEgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9SUzVDMzQ4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfRFMzMjM0IGlzIG5vdCBzZXQKIAogIwogIyBQbGF0Zm9ybSBSVEMgZHJpdmVycwogIworIyBDT05GSUdfUlRDX0RSVl9EUzEyODYgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9EUzE1MTEgaXMgbm90IHNldAogIyBDT05GSUdfUlRDX0RSVl9EUzE1NTMgaXMgbm90IHNldAogIyBDT05GSUdfUlRDX0RSVl9EUzE3NDIgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9TVEsxN1RBOCBpcyBub3Qgc2V0CiAjIENPTkZJR19SVENfRFJWX000OFQ4NiBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX000OFQzNSBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX000OFQ1OSBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0JRNDgwMiBpcyBub3Qgc2V0CiAjIENPTkZJR19SVENfRFJWX1YzMDIwIGlzIG5vdCBzZXQKIAogIwogIyBvbi1DUFUgUlRDIGRyaXZlcnMKICMKIENPTkZJR19SVENfRFJWX0JGSU49eQotCi0jCi0jIERNQSBFbmdpbmUgc3VwcG9ydAotIwotIyBDT05GSUdfRE1BX0VOR0lORSBpcyBub3Qgc2V0Ci0KLSMKLSMgRE1BIENsaWVudHMKLSMKLQotIwotIyBETUEgRGV2aWNlcwotIwotCi0jCi0jIFBCWCBzdXBwb3J0Ci0jCi0jIENPTkZJR19QQlggaXMgbm90IHNldAorIyBDT05GSUdfRE1BREVWSUNFUyBpcyBub3Qgc2V0CisjIENPTkZJR19VSU8gaXMgbm90IHNldAorIyBDT05GSUdfU1RBR0lORyBpcyBub3Qgc2V0CiAKICMKICMgRmlsZSBzeXN0ZW1zCkBAIC0xMDY3LDIwICsxMDQ0LDE4IEBACiAjIENPTkZJR19FWFQyX0ZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CiAjIENPTkZJR19FWFQyX0ZTX1NFQ1VSSVRZIGlzIG5vdCBzZXQKICMgQ09ORklHX0VYVDNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfRVhUNERFVl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19FWFQ0X0ZTIGlzIG5vdCBzZXQKIENPTkZJR19GU19NQkNBQ0hFPXkKICMgQ09ORklHX1JFSVNFUkZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0pGU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19GU19QT1NJWF9BQ0wgaXMgbm90IHNldAorQ09ORklHX0ZJTEVfTE9DS0lORz15CiAjIENPTkZJR19YRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfR0ZTMl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19PQ0ZTMl9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NSU5JWF9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ST01GU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19ETk9USUZZIGlzIG5vdCBzZXQKIENPTkZJR19JTk9USUZZPXkKIENPTkZJR19JTk9USUZZX1VTRVI9eQogIyBDT05GSUdfUVVPVEEgaXMgbm90IHNldAotIyBDT05GSUdfRE5PVElGWSBpcyBub3Qgc2V0CiAjIENPTkZJR19BVVRPRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfQVVUT0ZTNF9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19GVVNFX0ZTIGlzIG5vdCBzZXQKQEAgLTExMDYsNyArMTA4MSw2IEBACiBDT05GSUdfU1lTRlM9eQogIyBDT05GSUdfVE1QRlMgaXMgbm90IHNldAogIyBDT05GSUdfSFVHRVRMQl9QQUdFIGlzIG5vdCBzZXQKLUNPTkZJR19SQU1GUz15CiAjIENPTkZJR19DT05GSUdGU19GUyBpcyBub3Qgc2V0CiAKICMKQEAgLTExMjEsMzYgKzEwOTUsMzUgQEAKICMgQ09ORklHX0VGU19GUyBpcyBub3Qgc2V0CiBDT05GSUdfWUFGRlNfRlM9eQogQ09ORklHX1lBRkZTX1lBRkZTMT15CisjIENPTkZJR19ZQUZGU185QllURV9UQUdTIGlzIG5vdCBzZXQKICMgQ09ORklHX1lBRkZTX0RPRVNfRUNDIGlzIG5vdCBzZXQKIENPTkZJR19ZQUZGU19ZQUZGUzI9eQogQ09ORklHX1lBRkZTX0FVVE9fWUFGRlMyPXkKICMgQ09ORklHX1lBRkZTX0RJU0FCTEVfTEFaWV9MT0FEIGlzIG5vdCBzZXQKLUNPTkZJR19ZQUZGU19DSEVDS1BPSU5UX1JFU0VSVkVEX0JMT0NLUz0xMAogIyBDT05GSUdfWUFGRlNfRElTQUJMRV9XSURFX1ROT0RFUyBpcyBub3Qgc2V0CiAjIENPTkZJR19ZQUZGU19BTFdBWVNfQ0hFQ0tfQ0hVTktfRVJBU0VEIGlzIG5vdCBzZXQKIENPTkZJR19ZQUZGU19TSE9SVF9OQU1FU19JTl9SQU09eQogIyBDT05GSUdfSkZGUzJfRlMgaXMgbm90IHNldAogIyBDT05GSUdfQ1JBTUZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1ZYRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTUlOSVhfRlMgaXMgbm90IHNldAorIyBDT05GSUdfT01GU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19IUEZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1FOWDRGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19ST01GU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TWVNWX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1VGU19GUyBpcyBub3Qgc2V0Ci0KLSMKLSMgTmV0d29yayBGaWxlIFN5c3RlbXMKLSMKK0NPTkZJR19ORVRXT1JLX0ZJTEVTWVNURU1TPXkKIENPTkZJR19ORlNfRlM9bQogQ09ORklHX05GU19WMz15CiAjIENPTkZJR19ORlNfVjNfQUNMIGlzIG5vdCBzZXQKICMgQ09ORklHX05GU19WNCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORlNfRElSRUNUSU8gaXMgbm90IHNldAogIyBDT05GSUdfTkZTRCBpcyBub3Qgc2V0CiBDT05GSUdfTE9DS0Q9bQogQ09ORklHX0xPQ0tEX1Y0PXkKIENPTkZJR19ORlNfQ09NTU9OPXkKIENPTkZJR19TVU5SUEM9bQotIyBDT05GSUdfU1VOUlBDX0JJTkQzNCBpcyBub3Qgc2V0CisjIENPTkZJR19TVU5SUENfUkVHSVNURVJfVjQgaXMgbm90IHNldAogIyBDT05GSUdfUlBDU0VDX0dTU19LUkI1IGlzIG5vdCBzZXQKICMgQ09ORklHX1JQQ1NFQ19HU1NfU1BLTTMgaXMgbm90IHNldAogQ09ORklHX1NNQl9GUz1tCkBAIC0xMTU5LDE3ICsxMTMyLDEyIEBACiAjIENPTkZJR19OQ1BfRlMgaXMgbm90IHNldAogIyBDT05GSUdfQ09EQV9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19BRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfOVBfRlMgaXMgbm90IHNldAogCiAjCiAjIFBhcnRpdGlvbiBUeXBlcwogIwogIyBDT05GSUdfUEFSVElUSU9OX0FEVkFOQ0VEIGlzIG5vdCBzZXQKIENPTkZJR19NU0RPU19QQVJUSVRJT049eQotCi0jCi0jIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0Ci0jCiBDT05GSUdfTkxTPW0KIENPTkZJR19OTFNfREVGQVVMVD0iaXNvODg1OS0xIgogIyBDT05GSUdfTkxTX0NPREVQQUdFXzQzNyBpcyBub3Qgc2V0CkBAIC0xMjEwLDI5ICsxMTc4LDMwIEBACiAjIENPTkZJR19OTFNfS09JOF9SIGlzIG5vdCBzZXQKICMgQ09ORklHX05MU19LT0k4X1UgaXMgbm90IHNldAogIyBDT05GSUdfTkxTX1VURjggaXMgbm90IHNldAotCi0jCi0jIERpc3RyaWJ1dGVkIExvY2sgTWFuYWdlcgotIwogIyBDT05GSUdfRExNIGlzIG5vdCBzZXQKIAogIwotIyBQcm9maWxpbmcgc3VwcG9ydAotIwotIyBDT05GSUdfUFJPRklMSU5HIGlzIG5vdCBzZXQKLQotIwogIyBLZXJuZWwgaGFja2luZwogIwogIyBDT05GSUdfUFJJTlRLX1RJTUUgaXMgbm90IHNldAorQ09ORklHX0VOQUJMRV9XQVJOX0RFUFJFQ0FURUQ9eQogQ09ORklHX0VOQUJMRV9NVVNUX0NIRUNLPXkKK0NPTkZJR19GUkFNRV9XQVJOPTEwMjQKICMgQ09ORklHX01BR0lDX1NZU1JRIGlzIG5vdCBzZXQKICMgQ09ORklHX1VOVVNFRF9TWU1CT0xTIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0hFQURFUlNfQ0hFQ0sgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfS0VSTkVMIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX0JVR1ZFUkJPU0UgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfTUVNT1JZX0lOSVQgaXMgbm90IHNldAorIyBDT05GSUdfUkNVX0NQVV9TVEFMTF9ERVRFQ1RPUiBpcyBub3Qgc2V0CisjIENPTkZJR19TWVNDVExfU1lTQ0FMTF9DSEVDSyBpcyBub3Qgc2V0CisjIENPTkZJR19EWU5BTUlDX1BSSU5US19ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19TQU1QTEVTIGlzIG5vdCBzZXQKK0NPTkZJR19IQVZFX0FSQ0hfS0dEQj15CitDT05GSUdfREVCVUdfVkVSQk9TRT15CiAjIENPTkZJR19ERUJVR19NTVJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0RPVUJMRUZBVUxUIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX0hVTlRfRk9SX1pFUk8gaXMgbm90IHNldAogQ09ORklHX0RFQlVHX0JGSU5fSFdUUkFDRV9PTj15CiBDT05GSUdfREVCVUdfQkZJTl9IV1RSQUNFX0NPTVBSRVNTSU9OX09GRj15CkBAIC0xMjUwLDEzICsxMjE5LDk0IEBACiAjCiAjIENPTkZJR19LRVlTIGlzIG5vdCBzZXQKIENPTkZJR19TRUNVUklUWT15CisjIENPTkZJR19TRUNVUklUWUZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFQ1VSSVRZX05FVFdPUksgaXMgbm90IHNldAotQ09ORklHX1NFQ1VSSVRZX0NBUEFCSUxJVElFUz15CisjIENPTkZJR19TRUNVUklUWV9GSUxFX0NBUEFCSUxJVElFUyBpcyBub3Qgc2V0CitDT05GSUdfU0VDVVJJVFlfREVGQVVMVF9NTUFQX01JTl9BRERSPTAKK0NPTkZJR19DUllQVE89eQogCiAjCi0jIENyeXB0b2dyYXBoaWMgb3B0aW9ucworIyBDcnlwdG8gY29yZSBvciBoZWxwZXIKICMKLSMgQ09ORklHX0NSWVBUTyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fRklQUyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTUFOQUdFUiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fR0YxMjhNVUwgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX05VTEwgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NSWVBURCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQVVUSEVOQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fVEVTVCBpcyBub3Qgc2V0CisKKyMKKyMgQXV0aGVudGljYXRlZCBFbmNyeXB0aW9uIHdpdGggQXNzb2NpYXRlZCBEYXRhCisjCisjIENPTkZJR19DUllQVE9fQ0NNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19HQ00gaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NFUUlWIGlzIG5vdCBzZXQKKworIworIyBCbG9jayBtb2RlcworIworIyBDT05GSUdfQ1JZUFRPX0NCQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ1RSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DVFMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0VDQiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTFJXIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19QQ0JDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19YVFMgaXMgbm90IHNldAorCisjCisjIEhhc2ggbW9kZXMKKyMKKyMgQ09ORklHX0NSWVBUT19ITUFDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19YQ0JDIGlzIG5vdCBzZXQKKworIworIyBEaWdlc3QKKyMKKyMgQ09ORklHX0NSWVBUT19DUkMzMkMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX01ENCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTUQ1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19NSUNIQUVMX01JQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fUk1EMTI4IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19STUQxNjAgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1JNRDI1NiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fUk1EMzIwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TSEExIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TSEEyNTYgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NIQTUxMiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fVEdSMTkyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19XUDUxMiBpcyBub3Qgc2V0CisKKyMKKyMgQ2lwaGVycworIworIyBDT05GSUdfQ1JZUFRPX0FFUyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQU5VQklTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19BUkM0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19CTE9XRklTSCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ0FNRUxMSUEgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NBU1Q1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DQVNUNiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fREVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19GQ1JZUFQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0tIQVpBRCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0FMU0EyMCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0VFRCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0VSUEVOVCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fVEVBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19UV09GSVNIIGlzIG5vdCBzZXQKKworIworIyBDb21wcmVzc2lvbgorIworIyBDT05GSUdfQ1JZUFRPX0RFRkxBVEUgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0xaTyBpcyBub3Qgc2V0CisKKyMKKyMgUmFuZG9tIE51bWJlciBHZW5lcmF0aW9uCisjCisjIENPTkZJR19DUllQVE9fQU5TSV9DUFJORyBpcyBub3Qgc2V0CitDT05GSUdfQ1JZUFRPX0hXPXkKIAogIwogIyBMaWJyYXJ5IHJvdXRpbmVzCkBAIC0xMjY0LDggKzEzMTQsMTAgQEAKIENPTkZJR19CSVRSRVZFUlNFPXkKIENPTkZJR19DUkNfQ0NJVFQ9bQogIyBDT05GSUdfQ1JDMTYgaXMgbm90IHNldAorIyBDT05GSUdfQ1JDX1QxMERJRiBpcyBub3Qgc2V0CiAjIENPTkZJR19DUkNfSVRVX1QgaXMgbm90IHNldAogQ09ORklHX0NSQzMyPXkKKyMgQ09ORklHX0NSQzcgaXMgbm90IHNldAogIyBDT05GSUdfTElCQ1JDMzJDIGlzIG5vdCBzZXQKIENPTkZJR19aTElCX0lORkxBVEU9eQogQ09ORklHX1BMSVNUPXkKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vY29uZmlncy9TUlYxX2RlZmNvbmZpZyBiL2FyY2gvYmxhY2tmaW4vY29uZmlncy9TUlYxX2RlZmNvbmZpZwppbmRleCBiMTMwOWY4Li43YzgyNTBkIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvU1JWMV9kZWZjb25maWcKKysrIGIvYXJjaC9ibGFja2Zpbi9jb25maWdzL1NSVjFfZGVmY29uZmlnCkBAIC01OSw3ICs1OSw3IEBACiBDT05GSUdfSE9UUExVRz15CiBDT05GSUdfUFJJTlRLPXkKIENPTkZJR19CVUc9eQotQ09ORklHX0VMRl9DT1JFPXkKKyMgQ09ORklHX0VMRl9DT1JFIGlzIG5vdCBzZXQKIENPTkZJR19CQVNFX0ZVTEw9eQogQ09ORklHX0ZVVEVYPXkKIENPTkZJR19BTk9OX0lOT0RFUz15CkBAIC0xNzIsMTQgKzE3MiwxNCBAQAogQ09ORklHX0lSUV9VQVJUMV9UWD0xMAogQ09ORklHX0lSUV9NQUNfUlg9MTEKIENPTkZJR19JUlFfTUFDX1RYPTExCi1DT05GSUdfSVJRX1RNUjA9MTIKLUNPTkZJR19JUlFfVE1SMT0xMgotQ09ORklHX0lSUV9UTVIyPTEyCi1DT05GSUdfSVJRX1RNUjM9MTIKLUNPTkZJR19JUlFfVE1SND0xMgotQ09ORklHX0lSUV9UTVI1PTEyCi1DT05GSUdfSVJRX1RNUjY9MTIKLUNPTkZJR19JUlFfVE1SNz0xMgorQ09ORklHX0lSUV9USU1FUjA9MTIKK0NPTkZJR19JUlFfVElNRVIxPTEyCitDT05GSUdfSVJRX1RJTUVSMj0xMgorQ09ORklHX0lSUV9USU1FUjM9MTIKK0NPTkZJR19JUlFfVElNRVI0PTEyCitDT05GSUdfSVJRX1RJTUVSNT0xMgorQ09ORklHX0lSUV9USU1FUjY9MTIKK0NPTkZJR19JUlFfVElNRVI3PTEyCiBDT05GSUdfSVJRX1BPUlRHX0lOVEI9MTIKIENPTkZJR19JUlFfTUVNX0RNQTA9MTMKIENPTkZJR19JUlFfTUVNX0RNQTE9MTMKQEAgLTI3MSw3ICsyNzEsNiBAQAogIyBDT05GSUdfUkVTT1VSQ0VTXzY0QklUIGlzIG5vdCBzZXQKIENPTkZJR19aT05FX0RNQV9GTEFHPTEKIENPTkZJR19MQVJHRV9BTExPQ1M9eQotQ09ORklHX0JGSU5fRE1BXzVYWD15CiBDT05GSUdfRE1BX1VOQ0FDSEVEXzJNPXkKICMgQ09ORklHX0RNQV9VTkNBQ0hFRF8xTSBpcyBub3Qgc2V0CiAjIENPTkZJR19ETUFfVU5DQUNIRURfTk9ORSBpcyBub3Qgc2V0CkBAIC03ODYsNyArNzg1LDcgQEAKICMKICMgQ09ORklHX0kyQ19CTEFDS0ZJTl9HUElPIGlzIG5vdCBzZXQKIENPTkZJR19JMkNfQkxBQ0tGSU5fVFdJPXkKLUNPTkZJR19JMkNfQkxBQ0tGSU5fVFdJX0NMS19LSFo9NTAKK0NPTkZJR19JMkNfQkxBQ0tGSU5fVFdJX0NMS19LSFo9MTAwCiAjIENPTkZJR19JMkNfR1BJTyBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfT0NPUkVTIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19QQVJQT1JUX0xJR0hUIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vY29uZmlncy9UQ00tQkY1MzdfZGVmY29uZmlnIGIvYXJjaC9ibGFja2Zpbi9jb25maWdzL1RDTS1CRjUzN19kZWZjb25maWcKaW5kZXggYzQ4MmVlMS4uOWFmNTIyYyAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9jb25maWdzL1RDTS1CRjUzN19kZWZjb25maWcKKysrIGIvYXJjaC9ibGFja2Zpbi9jb25maWdzL1RDTS1CRjUzN19kZWZjb25maWcKQEAgLTEsNyArMSw3IEBACiAjCiAjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0Ci0jIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMjQuNwotIyBUaHUgSnVsIDMxIDAwOjUzOjE1IDIwMDgKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4yOC1yYzIKKyMgVHVlIEphbiAgNiAwOToyMjoxNyAyMDA5CiAjCiAjIENPTkZJR19NTVUgaXMgbm90IHNldAogIyBDT05GSUdfRlBVIGlzIG5vdCBzZXQKQEAgLTksNyArOSw2IEBACiAjIENPTkZJR19SV1NFTV9YQ0hHQUREX0FMR09SSVRITSBpcyBub3Qgc2V0CiBDT05GSUdfQkxBQ0tGSU49eQogQ09ORklHX1pPTkVfRE1BPXkKLUNPTkZJR19TRU1BUEhPUkVfU0xFRVBFUlM9eQogQ09ORklHX0dFTkVSSUNfRklORF9ORVhUX0JJVD15CiBDT05GSUdfR0VORVJJQ19IV0VJR0hUPXkKIENPTkZJR19HRU5FUklDX0hBUkRJUlFTPXkKQEAgLTMwLDE3ICsyOSwxNCBAQAogQ09ORklHX1NZU1ZJUEM9eQogQ09ORklHX1NZU1ZJUENfU1lTQ1RMPXkKICMgQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1QgaXMgbm90IHNldAotIyBDT05GSUdfVVNFUl9OUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19QSURfTlMgaXMgbm90IHNldAogQ09ORklHX0lLQ09ORklHPXkKIENPTkZJR19JS0NPTkZJR19QUk9DPXkKIENPTkZJR19MT0dfQlVGX1NISUZUPTE0CiAjIENPTkZJR19DR1JPVVBTIGlzIG5vdCBzZXQKLUNPTkZJR19GQUlSX0dST1VQX1NDSEVEPXkKLUNPTkZJR19GQUlSX1VTRVJfU0NIRUQ9eQotIyBDT05GSUdfRkFJUl9DR1JPVVBfU0NIRUQgaXMgbm90IHNldAotQ09ORklHX1NZU0ZTX0RFUFJFQ0FURUQ9eQorIyBDT05GSUdfR1JPVVBfU0NIRUQgaXMgbm90IHNldAorIyBDT05GSUdfU1lTRlNfREVQUkVDQVRFRF9WMiBpcyBub3Qgc2V0CiAjIENPTkZJR19SRUxBWSBpcyBub3Qgc2V0CisjIENPTkZJR19OQU1FU1BBQ0VTIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfSU5JVFJEIGlzIG5vdCBzZXQKICMgQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFIGlzIG5vdCBzZXQKIENPTkZJR19TWVNDVEw9eQpAQCAtNTIsMjIgKzQ4LDMwIEBACiAjIENPTkZJR19IT1RQTFVHIGlzIG5vdCBzZXQKIENPTkZJR19QUklOVEs9eQogQ09ORklHX0JVRz15Ci1DT05GSUdfRUxGX0NPUkU9eQorIyBDT05GSUdfRUxGX0NPUkUgaXMgbm90IHNldAorQ09ORklHX0NPTVBBVF9CUks9eQogQ09ORklHX0JBU0VfRlVMTD15CiBDT05GSUdfRlVURVg9eQogQ09ORklHX0FOT05fSU5PREVTPXkKIENPTkZJR19FUE9MTD15CiBDT05GSUdfU0lHTkFMRkQ9eQorQ09ORklHX1RJTUVSRkQ9eQogQ09ORklHX0VWRU5URkQ9eQorQ09ORklHX0FJTz15CiBDT05GSUdfVk1fRVZFTlRfQ09VTlRFUlM9eQogQ09ORklHX1NMQUI9eQogIyBDT05GSUdfU0xVQiBpcyBub3Qgc2V0CiAjIENPTkZJR19TTE9CIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BST0ZJTElORyBpcyBub3Qgc2V0CisjIENPTkZJR19NQVJLRVJTIGlzIG5vdCBzZXQKK0NPTkZJR19IQVZFX09QUk9GSUxFPXkKKyMgQ09ORklHX0hBVkVfR0VORVJJQ19ETUFfQ09IRVJFTlQgaXMgbm90IHNldAogQ09ORklHX1NMQUJJTkZPPXkKIENPTkZJR19SVF9NVVRFWEVTPXkKIENPTkZJR19USU5ZX1NITUVNPXkKIENPTkZJR19CQVNFX1NNQUxMPTAKIENPTkZJR19NT0RVTEVTPXkKKyMgQ09ORklHX01PRFVMRV9GT1JDRV9MT0FEIGlzIG5vdCBzZXQKIENPTkZJR19NT0RVTEVfVU5MT0FEPXkKICMgQ09ORklHX01PRFVMRV9GT1JDRV9VTkxPQUQgaXMgbm90IHNldAogIyBDT05GSUdfTU9EVkVSU0lPTlMgaXMgbm90IHNldApAQCAtNzgsNiArODIsNyBAQAogIyBDT05GSUdfQkxLX0RFVl9JT19UUkFDRSBpcyBub3Qgc2V0CiAjIENPTkZJR19MU0YgaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9CU0cgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9JTlRFR1JJVFkgaXMgbm90IHNldAogCiAjCiAjIElPIFNjaGVkdWxlcnMKQEAgLTkxLDkgKzk2LDExIEBACiAjIENPTkZJR19ERUZBVUxUX0NGUSBpcyBub3Qgc2V0CiBDT05GSUdfREVGQVVMVF9OT09QPXkKIENPTkZJR19ERUZBVUxUX0lPU0NIRUQ9Im5vb3AiCitDT05GSUdfQ0xBU1NJQ19SQ1U9eQogQ09ORklHX1BSRUVNUFRfTk9ORT15CiAjIENPTkZJR19QUkVFTVBUX1ZPTFVOVEFSWSBpcyBub3Qgc2V0CiAjIENPTkZJR19QUkVFTVBUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZSRUVaRVIgaXMgbm90IHNldAogCiAjCiAjIEJsYWNrZmluIFByb2Nlc3NvciBPcHRpb25zCkBAIC0xMDIsNiArMTA5LDEwIEBACiAjCiAjIFByb2Nlc3NvciBhbmQgQm9hcmQgU2V0dGluZ3MKICMKKyMgQ09ORklHX0JGNTEyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGNTE0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGNTE2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGNTE4IGlzIG5vdCBzZXQKICMgQ09ORklHX0JGNTIyIGlzIG5vdCBzZXQKICMgQ09ORklHX0JGNTIzIGlzIG5vdCBzZXQKICMgQ09ORklHX0JGNTI0IGlzIG5vdCBzZXQKQEAgLTExNCwxOCArMTI1LDIzIEBACiAjIENPTkZJR19CRjUzNCBpcyBub3Qgc2V0CiAjIENPTkZJR19CRjUzNiBpcyBub3Qgc2V0CiBDT05GSUdfQkY1Mzc9eQorIyBDT05GSUdfQkY1MzggaXMgbm90IHNldAorIyBDT05GSUdfQkY1MzkgaXMgbm90IHNldAogIyBDT05GSUdfQkY1NDIgaXMgbm90IHNldAogIyBDT05GSUdfQkY1NDQgaXMgbm90IHNldAogIyBDT05GSUdfQkY1NDcgaXMgbm90IHNldAogIyBDT05GSUdfQkY1NDggaXMgbm90IHNldAogIyBDT05GSUdfQkY1NDkgaXMgbm90IHNldAogIyBDT05GSUdfQkY1NjEgaXMgbm90IHNldAorQ09ORklHX0JGX1JFVl9NSU49MgorQ09ORklHX0JGX1JFVl9NQVg9MwogIyBDT05GSUdfQkZfUkVWXzBfMCBpcyBub3Qgc2V0CiAjIENPTkZJR19CRl9SRVZfMF8xIGlzIG5vdCBzZXQKIENPTkZJR19CRl9SRVZfMF8yPXkKICMgQ09ORklHX0JGX1JFVl8wXzMgaXMgbm90IHNldAogIyBDT05GSUdfQkZfUkVWXzBfNCBpcyBub3Qgc2V0CiAjIENPTkZJR19CRl9SRVZfMF81IGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGX1JFVl8wXzYgaXMgbm90IHNldAogIyBDT05GSUdfQkZfUkVWX0FOWSBpcyBub3Qgc2V0CiAjIENPTkZJR19CRl9SRVZfTk9ORSBpcyBub3Qgc2V0CiBDT05GSUdfQkY1M3g9eQpAQCAtMTM3LDI1ICsxNTMsMjUgQEAKIENPTkZJR19JUlFfU1BPUlQxX1JYPTkKIENPTkZJR19JUlFfU1BPUlQxX1RYPTkKIENPTkZJR19JUlFfVFdJPTEwCi1DT05GSUdfSVJRX1NQST0xMAogQ09ORklHX0lSUV9VQVJUMF9SWD0xMAogQ09ORklHX0lSUV9VQVJUMF9UWD0xMAogQ09ORklHX0lSUV9VQVJUMV9SWD0xMAogQ09ORklHX0lSUV9VQVJUMV9UWD0xMAogQ09ORklHX0lSUV9NQUNfUlg9MTEKIENPTkZJR19JUlFfTUFDX1RYPTExCi1DT05GSUdfSVJRX1RNUjA9MTIKLUNPTkZJR19JUlFfVE1SMT0xMgotQ09ORklHX0lSUV9UTVIyPTEyCi1DT05GSUdfSVJRX1RNUjM9MTIKLUNPTkZJR19JUlFfVE1SND0xMgotQ09ORklHX0lSUV9UTVI1PTEyCi1DT05GSUdfSVJRX1RNUjY9MTIKLUNPTkZJR19JUlFfVE1SNz0xMgorQ09ORklHX0lSUV9USU1FUjA9MTIKK0NPTkZJR19JUlFfVElNRVIxPTEyCitDT05GSUdfSVJRX1RJTUVSMj0xMgorQ09ORklHX0lSUV9USU1FUjM9MTIKK0NPTkZJR19JUlFfVElNRVI0PTEyCitDT05GSUdfSVJRX1RJTUVSNT0xMgorQ09ORklHX0lSUV9USU1FUjY9MTIKK0NPTkZJR19JUlFfVElNRVI3PTEyCiBDT05GSUdfSVJRX1BPUlRHX0lOVEI9MTIKIENPTkZJR19JUlFfTUVNX0RNQTA9MTMKIENPTkZJR19JUlFfTUVNX0RNQTE9MTMKIENPTkZJR19JUlFfV0FUQ0g9MTMKK0NPTkZJR19JUlFfU1BJPTEwCiAjIENPTkZJR19CRklONTM3X1NUQU1QIGlzIG5vdCBzZXQKICMgQ09ORklHX0JGSU41MzdfQkxVRVRFQ0hOSVhfQ00gaXMgbm90IHNldAogQ09ORklHX0JGSU41MzdfQkxVRVRFQ0hOSVhfVENNPXkKQEAgLTE5MSw3ICsyMDcsNiBAQAogIwogQ09ORklHX0NMS0lOX0haPTI1MDAwMDAwCiAjIENPTkZJR19CRklOX0tFUk5FTF9DTE9DSyBpcyBub3Qgc2V0Ci1DT05GSUdfTUFYX01FTV9TSVpFPTMyCiBDT05GSUdfTUFYX1ZDT19IWj02MDAwMDAwMDAKIENPTkZJR19NSU5fVkNPX0haPTUwMDAwMDAwCiBDT05GSUdfTUFYX1NDTEtfSFo9MTMzMzMzMzMzCkBAIC0yMDUsMTAgKzIyMCwxMCBAQAogIyBDT05GSUdfSFpfMzAwIGlzIG5vdCBzZXQKICMgQ09ORklHX0haXzEwMDAgaXMgbm90IHNldAogQ09ORklHX0haPTI1MAorIyBDT05GSUdfU0NIRURfSFJUSUNLIGlzIG5vdCBzZXQKIENPTkZJR19HRU5FUklDX1RJTUU9eQogQ09ORklHX0dFTkVSSUNfQ0xPQ0tFVkVOVFM9eQogIyBDT05GSUdfQ1lDTEVTX0NMT0NLU09VUkNFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RJQ0tfT05FU0hPVCBpcyBub3Qgc2V0CiAjIENPTkZJR19OT19IWiBpcyBub3Qgc2V0CiAjIENPTkZJR19ISUdIX1JFU19USU1FUlMgaXMgbm90IHNldAogQ09ORklHX0dFTkVSSUNfQ0xPQ0tFVkVOVFNfQlVJTEQ9eQpAQCAtMjQyLDYgKzI1NywxMiBAQAogQ09ORklHX0NBQ0hFTElORV9BTElHTkVEX0wxPXkKIENPTkZJR19TWVNDQUxMX1RBQl9MMT15CiBDT05GSUdfQ1BMQl9TV0lUQ0hfVEFCX0wxPXkKK0NPTkZJR19BUFBfU1RBQ0tfTDE9eQorCisjCisjIFNwZWVkIE9wdGltaXphdGlvbnMKKyMKK0NPTkZJR19CRklOX0lOU19MT1dPVkVSSEVBRD15CiBDT05GSUdfUkFNS0VSTkVMPXkKICMgQ09ORklHX1JPTUtFUk5FTCBpcyBub3Qgc2V0CiBDT05GSUdfU0VMRUNUX01FTU9SWV9NT0RFTD15CkBAIC0yNTAsMTQgKzI3MSwxMyBAQAogIyBDT05GSUdfU1BBUlNFTUVNX01BTlVBTCBpcyBub3Qgc2V0CiBDT05GSUdfRkxBVE1FTT15CiBDT05GSUdfRkxBVF9OT0RFX01FTV9NQVA9eQotIyBDT05GSUdfU1BBUlNFTUVNX1NUQVRJQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TUEFSU0VNRU1fVk1FTU1BUF9FTkFCTEUgaXMgbm90IHNldAorQ09ORklHX1BBR0VGTEFHU19FWFRFTkRFRD15CiBDT05GSUdfU1BMSVRfUFRMT0NLX0NQVVM9NAogIyBDT05GSUdfUkVTT1VSQ0VTXzY0QklUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BIWVNfQUREUl9UXzY0QklUIGlzIG5vdCBzZXQKIENPTkZJR19aT05FX0RNQV9GTEFHPTEKIENPTkZJR19WSVJUX1RPX0JVUz15CiAjIENPTkZJR19CRklOX0dQVElNRVJTIGlzIG5vdCBzZXQKLUNPTkZJR19CRklOX0RNQV81WFg9eQogIyBDT05GSUdfRE1BX1VOQ0FDSEVEXzRNIGlzIG5vdCBzZXQKICMgQ09ORklHX0RNQV9VTkNBQ0hFRF8yTSBpcyBub3Qgc2V0CiBDT05GSUdfRE1BX1VOQ0FDSEVEXzFNPXkKQEAgLTMwMCw3ICszMjAsNiBAQAogIwogIyBCdXMgb3B0aW9ucyAoUENJLCBQQ01DSUEsIEVJU0EsIE1DQSwgSVNBKQogIwotIyBDT05GSUdfUENJIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfU1VQUE9SVFNfTVNJIGlzIG5vdCBzZXQKIAogIwpAQCAtMzEwLDIzICszMjksMjAgQEAKIENPTkZJR19CSU5GTVRfRkxBVD15CiBDT05GSUdfQklORk1UX1pGTEFUPXkKIENPTkZJR19CSU5GTVRfU0hBUkVEX0ZMQVQ9eQorIyBDT05GSUdfSEFWRV9BT1VUIGlzIG5vdCBzZXQKICMgQ09ORklHX0JJTkZNVF9NSVNDIGlzIG5vdCBzZXQKIAogIwogIyBQb3dlciBtYW5hZ2VtZW50IG9wdGlvbnMKICMKICMgQ09ORklHX1BNIGlzIG5vdCBzZXQKLUNPTkZJR19TVVNQRU5EX1VQX1BPU1NJQkxFPXkKK0NPTkZJR19BUkNIX1NVU1BFTkRfUE9TU0lCTEU9eQogIyBDT05GSUdfUE1fV0FLRVVQX0JZX0dQSU8gaXMgbm90IHNldAogCiAjCiAjIENQVSBGcmVxdWVuY3kgc2NhbGluZwogIwogIyBDT05GSUdfQ1BVX0ZSRVEgaXMgbm90IHNldAotCi0jCi0jIE5ldHdvcmtpbmcKLSMKICMgQ09ORklHX05FVCBpcyBub3Qgc2V0CiAKICMKQEAgLTM0NSw2ICszNjEsNyBAQAogQ09ORklHX01URF9QQVJUSVRJT05TPXkKICMgQ09ORklHX01URF9SRURCT09UX1BBUlRTIGlzIG5vdCBzZXQKICMgQ09ORklHX01URF9DTURMSU5FX1BBUlRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9BUjdfUEFSVFMgaXMgbm90IHNldAogCiAjCiAjIFVzZXIgTW9kdWxlcyBBbmQgVHJhbnNsYXRpb24gTGF5ZXJzCkBAIC0zNjIsOCArMzc5LDEwIEBACiAjCiAjIFJBTS9ST00vRmxhc2ggY2hpcCBkcml2ZXJzCiAjCi0jIENPTkZJR19NVERfQ0ZJIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ0ZJPXkKICMgQ09ORklHX01URF9KRURFQ1BST0JFIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfR0VOX1BST0JFPXkKKyMgQ09ORklHX01URF9DRklfQURWX09QVElPTlMgaXMgbm90IHNldAogQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8xPXkKIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMj15CiBDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzQ9eQpAQCAtMzc0LDYgKzM5MywxMCBAQAogQ09ORklHX01URF9DRklfSTI9eQogIyBDT05GSUdfTVREX0NGSV9JNCBpcyBub3Qgc2V0CiAjIENPTkZJR19NVERfQ0ZJX0k4IGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ0ZJX0lOVEVMRVhUPXkKKyMgQ09ORklHX01URF9DRklfQU1EU1REIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DRklfU1RBQSBpcyBub3Qgc2V0CitDT05GSUdfTVREX0NGSV9VVElMPXkKIENPTkZJR19NVERfUkFNPXkKICMgQ09ORklHX01URF9ST00gaXMgbm90IHNldAogIyBDT05GSUdfTVREX0FCU0VOVCBpcyBub3Qgc2V0CkBAIC0zODEsOCArNDA0LDkgQEAKICMKICMgTWFwcGluZyBkcml2ZXJzIGZvciBjaGlwIGFjY2VzcwogIwotIyBDT05GSUdfTVREX0NPTVBMRVhfTUFQUElOR1MgaXMgbm90IHNldAotIyBDT05GSUdfTVREX0dQSU9fQUREUiBpcyBub3Qgc2V0CitDT05GSUdfTVREX0NPTVBMRVhfTUFQUElOR1M9eQorIyBDT05GSUdfTVREX1BIWVNNQVAgaXMgbm90IHNldAorQ09ORklHX01URF9HUElPX0FERFI9eQogQ09ORklHX01URF9VQ0xJTlVYPXkKICMgQ09ORklHX01URF9QTEFUUkFNIGlzIG5vdCBzZXQKIApAQCAtNDE2LDEwICs0NDAsMTMgQEAKIENPTkZJR19CTEtfREVWX1JBTT15CiBDT05GSUdfQkxLX0RFVl9SQU1fQ09VTlQ9MTYKIENPTkZJR19CTEtfREVWX1JBTV9TSVpFPTQwOTYKLUNPTkZJR19CTEtfREVWX1JBTV9CTE9DS1NJWkU9MTAyNAorIyBDT05GSUdfQkxLX0RFVl9YSVAgaXMgbm90IHNldAogIyBDT05GSUdfQ0RST01fUEtUQ0RWRCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0hEIGlzIG5vdCBzZXQKIENPTkZJR19NSVNDX0RFVklDRVM9eQogIyBDT05GSUdfRUVQUk9NXzkzQ1g2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0VOQ0xPU1VSRV9TRVJWSUNFUyBpcyBub3Qgc2V0CitDT05GSUdfSEFWRV9JREU9eQogIyBDT05GSUdfSURFIGlzIG5vdCBzZXQKIAogIwpAQCAtNDU0LDggKzQ4MSwxMSBAQAogIyBDT05GSUdfQkY1eHhfUFBJIGlzIG5vdCBzZXQKIENPTkZJR19CRklOX1NQT1JUPXkKICMgQ09ORklHX0JGSU5fVElNRVJfTEFURU5DWSBpcyBub3Qgc2V0CitDT05GSUdfQkZJTl9ETUFfSU5URVJGQUNFPW0KICMgQ09ORklHX1NJTVBMRV9HUElPIGlzIG5vdCBzZXQKICMgQ09ORklHX1ZUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFVktNRU0gaXMgbm90IHNldAorIyBDT05GSUdfQkZJTl9KVEFHX0NPTU0gaXMgbm90IHNldAogIyBDT05GSUdfU0VSSUFMX05PTlNUQU5EQVJEIGlzIG5vdCBzZXQKIAogIwpAQCAtNDg2LDE1ICs1MTYsMTAgQEAKICMgQ09ORklHX0NBTjRMSU5VWCBpcyBub3Qgc2V0CiAjIENPTkZJR19JUE1JX0hBTkRMRVIgaXMgbm90IHNldAogIyBDT05GSUdfSFdfUkFORE9NIGlzIG5vdCBzZXQKLSMgQ09ORklHX0dFTl9SVEMgaXMgbm90IHNldAogIyBDT05GSUdfUjM5NjQgaXMgbm90IHNldAogIyBDT05GSUdfUkFXX0RSSVZFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19UQ0dfVFBNIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQyBpcyBub3Qgc2V0Ci0KLSMKLSMgU1BJIHN1cHBvcnQKLSMKIENPTkZJR19TUEk9eQogQ09ORklHX1NQSV9NQVNURVI9eQogCkBAIC01MDIsNiArNTI3LDcgQEAKICMgU1BJIE1hc3RlciBDb250cm9sbGVyIERyaXZlcnMKICMKIENPTkZJR19TUElfQkZJTj15CisjIENPTkZJR19TUElfQkZJTl9MT0NLIGlzIG5vdCBzZXQKICMgQ09ORklHX1NQSV9CSVRCQU5HIGlzIG5vdCBzZXQKIAogIwpAQCAtNTEwLDkgKzUzNiwxMyBAQAogIyBDT05GSUdfU1BJX0FUMjUgaXMgbm90IHNldAogIyBDT05GSUdfU1BJX1NQSURFViBpcyBub3Qgc2V0CiAjIENPTkZJR19TUElfVExFNjJYMCBpcyBub3Qgc2V0CitDT05GSUdfQVJDSF9XQU5UX09QVElPTkFMX0dQSU9MSUI9eQorIyBDT05GSUdfR1BJT0xJQiBpcyBub3Qgc2V0CiAjIENPTkZJR19XMSBpcyBub3Qgc2V0CiAjIENPTkZJR19QT1dFUl9TVVBQTFkgaXMgbm90IHNldAogIyBDT05GSUdfSFdNT04gaXMgbm90IHNldAorIyBDT05GSUdfVEhFUk1BTCBpcyBub3Qgc2V0CisjIENPTkZJR19USEVSTUFMX0hXTU9OIGlzIG5vdCBzZXQKIENPTkZJR19XQVRDSERPRz15CiAjIENPTkZJR19XQVRDSERPR19OT1dBWU9VVCBpcyBub3Qgc2V0CiAKQEAgLTUyMywyMCArNTUzLDI3IEBACiBDT05GSUdfQkZJTl9XRFQ9eQogCiAjCi0jIFNvbmljcyBTaWxpY29uIEJhY2twbGFuZQotIwotQ09ORklHX1NTQl9QT1NTSUJMRT15Ci0jIENPTkZJR19TU0IgaXMgbm90IHNldAotCi0jCiAjIE11bHRpZnVuY3Rpb24gZGV2aWNlIGRyaXZlcnMKICMKKyMgQ09ORklHX01GRF9DT1JFIGlzIG5vdCBzZXQKICMgQ09ORklHX01GRF9TTTUwMSBpcyBub3Qgc2V0CisjIENPTkZJR19IVENfUEFTSUMzIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9UTUlPIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9XTTg0MDAgaXMgbm90IHNldAogCiAjCiAjIE11bHRpbWVkaWEgZGV2aWNlcwogIworCisjCisjIE11bHRpbWVkaWEgY29yZSBzdXBwb3J0CisjCiAjIENPTkZJR19WSURFT19ERVYgaXMgbm90IHNldAorIyBDT05GSUdfVklERU9fTUVESUEgaXMgbm90IHNldAorCisjCisjIE11bHRpbWVkaWEgZHJpdmVycworIwogIyBDT05GSUdfREFCIGlzIG5vdCBzZXQKIAogIwpAQCAtNTUxLDIwICs1ODgsMTYgQEAKICMgRGlzcGxheSBkZXZpY2Ugc3VwcG9ydAogIwogIyBDT05GSUdfRElTUExBWV9TVVBQT1JUIGlzIG5vdCBzZXQKLQotIwotIyBTb3VuZAotIwogIyBDT05GSUdfU09VTkQgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX1NVUFBPUlQgaXMgbm90IHNldAogIyBDT05GSUdfTU1DIGlzIG5vdCBzZXQKKyMgQ09ORklHX01FTVNUSUNLIGlzIG5vdCBzZXQKICMgQ09ORklHX05FV19MRURTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FDQ0VTU0lCSUxJVFkgaXMgbm90IHNldAogIyBDT05GSUdfUlRDX0NMQVNTIGlzIG5vdCBzZXQKLQotIwotIyBVc2Vyc3BhY2UgSS9PCi0jCisjIENPTkZJR19ETUFERVZJQ0VTIGlzIG5vdCBzZXQKICMgQ09ORklHX1VJTyBpcyBub3Qgc2V0CisjIENPTkZJR19TVEFHSU5HIGlzIG5vdCBzZXQKIAogIwogIyBGaWxlIHN5c3RlbXMKQEAgLTU3NCwxOSArNjA3LDE3IEBACiAjIENPTkZJR19FWFQyX0ZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CiAjIENPTkZJR19FWFQyX0ZTX1NFQ1VSSVRZIGlzIG5vdCBzZXQKICMgQ09ORklHX0VYVDNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfRVhUNERFVl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19FWFQ0X0ZTIGlzIG5vdCBzZXQKIENPTkZJR19GU19NQkNBQ0hFPXkKICMgQ09ORklHX1JFSVNFUkZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0pGU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19GU19QT1NJWF9BQ0wgaXMgbm90IHNldAorQ09ORklHX0ZJTEVfTE9DS0lORz15CiAjIENPTkZJR19YRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfR0ZTMl9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NSU5JWF9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ST01GU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19ETk9USUZZIGlzIG5vdCBzZXQKIENPTkZJR19JTk9USUZZPXkKIENPTkZJR19JTk9USUZZX1VTRVI9eQogIyBDT05GSUdfUVVPVEEgaXMgbm90IHNldAotIyBDT05GSUdfRE5PVElGWSBpcyBub3Qgc2V0CiAjIENPTkZJR19BVVRPRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfQVVUT0ZTNF9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19GVVNFX0ZTIGlzIG5vdCBzZXQKQEAgLTYyOCw4ICs2NTksMTEgQEAKICMgQ09ORklHX0pGRlMyX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSQU1GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19WWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JTklYX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX09NRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfSFBGU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19RTlg0RlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfU1lTVl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19VRlNfRlMgaXMgbm90IHNldAogCkBAIC02MzksNyArNjczLDYgQEAKICMgQ09ORklHX1BBUlRJVElPTl9BRFZBTkNFRCBpcyBub3Qgc2V0CiBDT05GSUdfTVNET1NfUEFSVElUSU9OPXkKICMgQ09ORklHX05MUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTlNUUlVNRU5UQVRJT04gaXMgbm90IHNldAogCiAjCiAjIEtlcm5lbCBoYWNraW5nCkBAIC02NDcsMTQgKzY4MCwyMiBAQAogIyBDT05GSUdfUFJJTlRLX1RJTUUgaXMgbm90IHNldAogQ09ORklHX0VOQUJMRV9XQVJOX0RFUFJFQ0FURUQ9eQogQ09ORklHX0VOQUJMRV9NVVNUX0NIRUNLPXkKK0NPTkZJR19GUkFNRV9XQVJOPTEwMjQKICMgQ09ORklHX01BR0lDX1NZU1JRIGlzIG5vdCBzZXQKICMgQ09ORklHX1VOVVNFRF9TWU1CT0xTIGlzIG5vdCBzZXQKIENPTkZJR19ERUJVR19GUz15CiAjIENPTkZJR19IRUFERVJTX0NIRUNLIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX0tFUk5FTCBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19CVUdWRVJCT1NFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX01FTU9SWV9JTklUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JDVV9DUFVfU1RBTExfREVURUNUT1IgaXMgbm90IHNldAorIyBDT05GSUdfU1lTQ1RMX1NZU0NBTExfQ0hFQ0sgaXMgbm90IHNldAorIyBDT05GSUdfRFlOQU1JQ19QUklOVEtfREVCVUcgaXMgbm90IHNldAogIyBDT05GSUdfU0FNUExFUyBpcyBub3Qgc2V0CitDT05GSUdfSEFWRV9BUkNIX0tHREI9eQorQ09ORklHX0RFQlVHX1ZFUkJPU0U9eQogQ09ORklHX0RFQlVHX01NUlM9eQorIyBDT05GSUdfREVCVUdfRE9VQkxFRkFVTFQgaXMgbm90IHNldAogQ09ORklHX0RFQlVHX0hVTlRfRk9SX1pFUk89eQogQ09ORklHX0RFQlVHX0JGSU5fSFdUUkFDRV9PTj15CiBDT05GSUdfREVCVUdfQkZJTl9IV1RSQUNFX0NPTVBSRVNTSU9OX09GRj15CkBAIC02NzEsOSArNzEyLDggQEAKICMgU2VjdXJpdHkgb3B0aW9ucwogIwogIyBDT05GSUdfS0VZUyBpcyBub3Qgc2V0Ci1DT05GSUdfU0VDVVJJVFk9eQotIyBDT05GSUdfU0VDVVJJVFlfTkVUV09SSyBpcyBub3Qgc2V0Ci1DT05GSUdfU0VDVVJJVFlfQ0FQQUJJTElUSUVTPXkKKyMgQ09ORklHX1NFQ1VSSVRZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFQ1VSSVRZRlMgaXMgbm90IHNldAogIyBDT05GSUdfU0VDVVJJVFlfRklMRV9DQVBBQklMSVRJRVMgaXMgbm90IHNldAogIyBDT05GSUdfQ1JZUFRPIGlzIG5vdCBzZXQKIApAQCAtNjgyLDYgKzcyMiw3IEBACiAjCiAjIENPTkZJR19DUkNfQ0NJVFQgaXMgbm90IHNldAogIyBDT05GSUdfQ1JDMTYgaXMgbm90IHNldAorIyBDT05GSUdfQ1JDX1QxMERJRiBpcyBub3Qgc2V0CiAjIENPTkZJR19DUkNfSVRVX1QgaXMgbm90IHNldAogIyBDT05GSUdfQ1JDMzIgaXMgbm90IHNldAogIyBDT05GSUdfQ1JDNyBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL0tidWlsZCBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vS2J1aWxkCmluZGV4IDYwNmVjZmQuLmQwZDFhYzQgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vS2J1aWxkCisrKyBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vS2J1aWxkCkBAIC0xLDMgKzEsNCBAQAogaW5jbHVkZSBpbmNsdWRlL2FzbS1nZW5lcmljL0tidWlsZC5hc20KIAogdW5pZmRlZi15ICs9IGZpeGVkX2NvZGUuaAordW5pZmRlZi15ICs9IHN3YWIuaApkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9hdG9taWMuaCBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vYXRvbWljLmgKaW5kZXggN2NmNTA4Ny4uOTRiMmE5YiAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9hdG9taWMuaAorKysgYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2F0b21pYy5oCkBAIC0xLDYgKzEsNyBAQAogI2lmbmRlZiBfX0FSQ0hfQkxBQ0tGSU5fQVRPTUlDX18KICNkZWZpbmUgX19BUkNIX0JMQUNLRklOX0FUT01JQ19fCiAKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4JLyogbG9jYWxfaXJxX1hYWCgpICovCiAKIC8qCkBAIC0xMyw2OSArMTQsMTczIEBACiAgKiBUb255IEtvdSAodG9ueWtvQGxpbmVvLmNhKSAgIExpbmVvIEluYy4gICAyMDAxCiAgKi8KIAotdHlwZWRlZiBzdHJ1Y3QgewotCWludCBjb3VudGVyOwotfSBhdG9taWNfdDsKICNkZWZpbmUgQVRPTUlDX0lOSVQoaSkJeyAoaSkgfQotCi0jZGVmaW5lIGF0b21pY19yZWFkKHYpCQkoKHYpLT5jb3VudGVyKQogI2RlZmluZSBhdG9taWNfc2V0KHYsIGkpCSgoKHYpLT5jb3VudGVyKSA9IGkpCiAKLXN0YXRpYyBfX2lubGluZV9fIHZvaWQgYXRvbWljX2FkZChpbnQgaSwgYXRvbWljX3QgKiB2KQorI2lmZGVmIENPTkZJR19TTVAKKworI2RlZmluZSBhdG9taWNfcmVhZCh2KQlfX3Jhd191bmNhY2hlZF9mZXRjaF9hc20oJih2KS0+Y291bnRlcikKKworYXNtbGlua2FnZSBpbnQgX19yYXdfdW5jYWNoZWRfZmV0Y2hfYXNtKGNvbnN0IHZvbGF0aWxlIGludCAqcHRyKTsKKworYXNtbGlua2FnZSBpbnQgX19yYXdfYXRvbWljX3VwZGF0ZV9hc20odm9sYXRpbGUgaW50ICpwdHIsIGludCB2YWx1ZSk7CisKK2FzbWxpbmthZ2UgaW50IF9fcmF3X2F0b21pY19jbGVhcl9hc20odm9sYXRpbGUgaW50ICpwdHIsIGludCB2YWx1ZSk7CisKK2FzbWxpbmthZ2UgaW50IF9fcmF3X2F0b21pY19zZXRfYXNtKHZvbGF0aWxlIGludCAqcHRyLCBpbnQgdmFsdWUpOworCithc21saW5rYWdlIGludCBfX3Jhd19hdG9taWNfeG9yX2FzbSh2b2xhdGlsZSBpbnQgKnB0ciwgaW50IHZhbHVlKTsKKworYXNtbGlua2FnZSBpbnQgX19yYXdfYXRvbWljX3Rlc3RfYXNtKGNvbnN0IHZvbGF0aWxlIGludCAqcHRyLCBpbnQgdmFsdWUpOworCitzdGF0aWMgaW5saW5lIHZvaWQgYXRvbWljX2FkZChpbnQgaSwgYXRvbWljX3QgKnYpCit7CisJX19yYXdfYXRvbWljX3VwZGF0ZV9hc20oJnYtPmNvdW50ZXIsIGkpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYXRvbWljX3N1YihpbnQgaSwgYXRvbWljX3QgKnYpCit7CisJX19yYXdfYXRvbWljX3VwZGF0ZV9hc20oJnYtPmNvdW50ZXIsIC1pKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgYXRvbWljX2FkZF9yZXR1cm4oaW50IGksIGF0b21pY190ICp2KQoreworCXJldHVybiBfX3Jhd19hdG9taWNfdXBkYXRlX2FzbSgmdi0+Y291bnRlciwgaSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGF0b21pY19zdWJfcmV0dXJuKGludCBpLCBhdG9taWNfdCAqdikKK3sKKwlyZXR1cm4gX19yYXdfYXRvbWljX3VwZGF0ZV9hc20oJnYtPmNvdW50ZXIsIC1pKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGF0b21pY19pbmModm9sYXRpbGUgYXRvbWljX3QgKnYpCit7CisJX19yYXdfYXRvbWljX3VwZGF0ZV9hc20oJnYtPmNvdW50ZXIsIDEpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYXRvbWljX2RlYyh2b2xhdGlsZSBhdG9taWNfdCAqdikKK3sKKwlfX3Jhd19hdG9taWNfdXBkYXRlX2FzbSgmdi0+Y291bnRlciwgLTEpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYXRvbWljX2NsZWFyX21hc2soaW50IG1hc2ssIGF0b21pY190ICp2KQoreworCV9fcmF3X2F0b21pY19jbGVhcl9hc20oJnYtPmNvdW50ZXIsIG1hc2spOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYXRvbWljX3NldF9tYXNrKGludCBtYXNrLCBhdG9taWNfdCAqdikKK3sKKwlfX3Jhd19hdG9taWNfc2V0X2FzbSgmdi0+Y291bnRlciwgbWFzayk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGF0b21pY190ZXN0X21hc2soaW50IG1hc2ssIGF0b21pY190ICp2KQoreworCXJldHVybiBfX3Jhd19hdG9taWNfdGVzdF9hc20oJnYtPmNvdW50ZXIsIG1hc2spOworfQorCisvKiBBdG9taWMgb3BlcmF0aW9ucyBhcmUgYWxyZWFkeSBzZXJpYWxpemluZyAqLworI2RlZmluZSBzbXBfbWJfX2JlZm9yZV9hdG9taWNfZGVjKCkgICAgYmFycmllcigpCisjZGVmaW5lIHNtcF9tYl9fYWZ0ZXJfYXRvbWljX2RlYygpIGJhcnJpZXIoKQorI2RlZmluZSBzbXBfbWJfX2JlZm9yZV9hdG9taWNfaW5jKCkgICAgYmFycmllcigpCisjZGVmaW5lIHNtcF9tYl9fYWZ0ZXJfYXRvbWljX2luYygpIGJhcnJpZXIoKQorCisjZWxzZSAvKiAhQ09ORklHX1NNUCAqLworCisjZGVmaW5lIGF0b21pY19yZWFkKHYpCSgodiktPmNvdW50ZXIpCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhdG9taWNfYWRkKGludCBpLCBhdG9taWNfdCAqdikKIHsKIAlsb25nIGZsYWdzOwogCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCWxvY2FsX2lycV9zYXZlX2h3KGZsYWdzKTsKIAl2LT5jb3VudGVyICs9IGk7Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCWxvY2FsX2lycV9yZXN0b3JlX2h3KGZsYWdzKTsKIH0KIAotc3RhdGljIF9faW5saW5lX18gdm9pZCBhdG9taWNfc3ViKGludCBpLCBhdG9taWNfdCAqIHYpCitzdGF0aWMgaW5saW5lIHZvaWQgYXRvbWljX3N1YihpbnQgaSwgYXRvbWljX3QgKnYpCiB7CiAJbG9uZyBmbGFnczsKIAotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlsb2NhbF9pcnFfc2F2ZV9odyhmbGFncyk7CiAJdi0+Y291bnRlciAtPSBpOwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwlsb2NhbF9pcnFfcmVzdG9yZV9odyhmbGFncyk7CiAKIH0KIAotc3RhdGljIGlubGluZSBpbnQgYXRvbWljX2FkZF9yZXR1cm4oaW50IGksIGF0b21pY190ICogdikKK3N0YXRpYyBpbmxpbmUgaW50IGF0b21pY19hZGRfcmV0dXJuKGludCBpLCBhdG9taWNfdCAqdikKIHsKIAlpbnQgX190ZW1wID0gMDsKIAlsb25nIGZsYWdzOwogCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCWxvY2FsX2lycV9zYXZlX2h3KGZsYWdzKTsKIAl2LT5jb3VudGVyICs9IGk7CiAJX190ZW1wID0gdi0+Y291bnRlcjsKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJbG9jYWxfaXJxX3Jlc3RvcmVfaHcoZmxhZ3MpOwogCiAKIAlyZXR1cm4gX190ZW1wOwogfQogCitzdGF0aWMgaW5saW5lIGludCBhdG9taWNfc3ViX3JldHVybihpbnQgaSwgYXRvbWljX3QgKnYpCit7CisJaW50IF9fdGVtcCA9IDA7CisJbG9uZyBmbGFnczsKKworCWxvY2FsX2lycV9zYXZlX2h3KGZsYWdzKTsKKwl2LT5jb3VudGVyIC09IGk7CisJX190ZW1wID0gdi0+Y291bnRlcjsKKwlsb2NhbF9pcnFfcmVzdG9yZV9odyhmbGFncyk7CisKKwlyZXR1cm4gX190ZW1wOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYXRvbWljX2luYyh2b2xhdGlsZSBhdG9taWNfdCAqdikKK3sKKwlsb25nIGZsYWdzOworCisJbG9jYWxfaXJxX3NhdmVfaHcoZmxhZ3MpOworCXYtPmNvdW50ZXIrKzsKKwlsb2NhbF9pcnFfcmVzdG9yZV9odyhmbGFncyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhdG9taWNfZGVjKHZvbGF0aWxlIGF0b21pY190ICp2KQoreworCWxvbmcgZmxhZ3M7CisKKwlsb2NhbF9pcnFfc2F2ZV9odyhmbGFncyk7CisJdi0+Y291bnRlci0tOworCWxvY2FsX2lycV9yZXN0b3JlX2h3KGZsYWdzKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGF0b21pY19jbGVhcl9tYXNrKHVuc2lnbmVkIGludCBtYXNrLCBhdG9taWNfdCAqdikKK3sKKwlsb25nIGZsYWdzOworCisJbG9jYWxfaXJxX3NhdmVfaHcoZmxhZ3MpOworCXYtPmNvdW50ZXIgJj0gfm1hc2s7CisJbG9jYWxfaXJxX3Jlc3RvcmVfaHcoZmxhZ3MpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYXRvbWljX3NldF9tYXNrKHVuc2lnbmVkIGludCBtYXNrLCBhdG9taWNfdCAqdikKK3sKKwlsb25nIGZsYWdzOworCisJbG9jYWxfaXJxX3NhdmVfaHcoZmxhZ3MpOworCXYtPmNvdW50ZXIgfD0gbWFzazsKKwlsb2NhbF9pcnFfcmVzdG9yZV9odyhmbGFncyk7Cit9CisKKy8qIEF0b21pYyBvcGVyYXRpb25zIGFyZSBhbHJlYWR5IHNlcmlhbGl6aW5nICovCisjZGVmaW5lIHNtcF9tYl9fYmVmb3JlX2F0b21pY19kZWMoKSAgICBiYXJyaWVyKCkKKyNkZWZpbmUgc21wX21iX19hZnRlcl9hdG9taWNfZGVjKCkgYmFycmllcigpCisjZGVmaW5lIHNtcF9tYl9fYmVmb3JlX2F0b21pY19pbmMoKSAgICBiYXJyaWVyKCkKKyNkZWZpbmUgc21wX21iX19hZnRlcl9hdG9taWNfaW5jKCkgYmFycmllcigpCisKKyNlbmRpZiAvKiAhQ09ORklHX1NNUCAqLworCiAjZGVmaW5lIGF0b21pY19hZGRfbmVnYXRpdmUoYSwgdikJKGF0b21pY19hZGRfcmV0dXJuKChhKSwgKHYpKSA8IDApCi1zdGF0aWMgaW5saW5lIGludCBhdG9taWNfc3ViX3JldHVybihpbnQgaSwgYXRvbWljX3QgKiB2KQotewotCWludCBfX3RlbXAgPSAwOwotCWxvbmcgZmxhZ3M7Ci0KLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0Jdi0+Y291bnRlciAtPSBpOwotCV9fdGVtcCA9IHYtPmNvdW50ZXI7Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCi0JcmV0dXJuIF9fdGVtcDsKLX0KLQotc3RhdGljIF9faW5saW5lX18gdm9pZCBhdG9taWNfaW5jKHZvbGF0aWxlIGF0b21pY190ICogdikKLXsKLQlsb25nIGZsYWdzOwotCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCXYtPmNvdW50ZXIrKzsKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci19CisjZGVmaW5lIGF0b21pY19kZWNfcmV0dXJuKHYpIGF0b21pY19zdWJfcmV0dXJuKDEsKHYpKQorI2RlZmluZSBhdG9taWNfaW5jX3JldHVybih2KSBhdG9taWNfYWRkX3JldHVybigxLCh2KSkKIAogI2RlZmluZSBhdG9taWNfY21weGNoZyh2LCBvLCBuKSAoKGludCljbXB4Y2hnKCYoKHYpLT5jb3VudGVyKSwgKG8pLCAobikpKQogI2RlZmluZSBhdG9taWNfeGNoZyh2LCBuZXcpICh4Y2hnKCYoKHYpLT5jb3VudGVyKSwgbmV3KSkKQEAgLTkwLDQyICsxOTUsNiBAQAogfSkKICNkZWZpbmUgYXRvbWljX2luY19ub3RfemVybyh2KSBhdG9taWNfYWRkX3VubGVzcygodiksIDEsIDApCiAKLXN0YXRpYyBfX2lubGluZV9fIHZvaWQgYXRvbWljX2RlYyh2b2xhdGlsZSBhdG9taWNfdCAqIHYpCi17Ci0JbG9uZyBmbGFnczsKLQotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQl2LT5jb3VudGVyLS07Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotfQotCi1zdGF0aWMgX19pbmxpbmVfXyB2b2lkIGF0b21pY19jbGVhcl9tYXNrKHVuc2lnbmVkIGludCBtYXNrLCBhdG9taWNfdCAqIHYpCi17Ci0JbG9uZyBmbGFnczsKLQotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQl2LT5jb3VudGVyICY9IH5tYXNrOwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLX0KLQotc3RhdGljIF9faW5saW5lX18gdm9pZCBhdG9taWNfc2V0X21hc2sodW5zaWduZWQgaW50IG1hc2ssIGF0b21pY190ICogdikKLXsKLQlsb25nIGZsYWdzOwotCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCXYtPmNvdW50ZXIgfD0gbWFzazsKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci19Ci0KLS8qIEF0b21pYyBvcGVyYXRpb25zIGFyZSBhbHJlYWR5IHNlcmlhbGl6aW5nICovCi0jZGVmaW5lIHNtcF9tYl9fYmVmb3JlX2F0b21pY19kZWMoKSAgICBiYXJyaWVyKCkKLSNkZWZpbmUgc21wX21iX19hZnRlcl9hdG9taWNfZGVjKCkgYmFycmllcigpCi0jZGVmaW5lIHNtcF9tYl9fYmVmb3JlX2F0b21pY19pbmMoKSAgICBiYXJyaWVyKCkKLSNkZWZpbmUgc21wX21iX19hZnRlcl9hdG9taWNfaW5jKCkgYmFycmllcigpCi0KLSNkZWZpbmUgYXRvbWljX2RlY19yZXR1cm4odikgYXRvbWljX3N1Yl9yZXR1cm4oMSwodikpCi0jZGVmaW5lIGF0b21pY19pbmNfcmV0dXJuKHYpIGF0b21pY19hZGRfcmV0dXJuKDEsKHYpKQotCiAvKgogICogYXRvbWljX2luY19hbmRfdGVzdCAtIGluY3JlbWVudCBhbmQgdGVzdAogICogQHY6IHBvaW50ZXIgb2YgdHlwZSBhdG9taWNfdApkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9iZmluLWdsb2JhbC5oIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9iZmluLWdsb2JhbC5oCmluZGV4IDc3Mjk1NjYuLmRhZmZjMDYgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vYmZpbi1nbG9iYWwuaAorKysgYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2JmaW4tZ2xvYmFsLmgKQEAgLTQ3LDYgKzQ3LDkgQEAKICMgZGVmaW5lIERNQV9VTkNBQ0hFRF9SRUdJT04gKDApCiAjZW5kaWYKIAorZXh0ZXJuIHZvaWQgYmZpbl9zZXR1cF9jYWNoZXModW5zaWduZWQgaW50IGNwdSk7CitleHRlcm4gdm9pZCBiZmluX3NldHVwX2NwdWRhdGEodW5zaWduZWQgaW50IGNwdSk7CisKIGV4dGVybiB1bnNpZ25lZCBsb25nIGdldF9jY2xrKHZvaWQpOwogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgZ2V0X3NjbGsodm9pZCk7CiBleHRlcm4gdW5zaWduZWQgbG9uZyBzY2xrX3RvX3VzZWNzKHVuc2lnbmVkIGxvbmcgc2Nsayk7CkBAIC01OCw4ICs2MSw2IEBACiAKIC8qIGluaXQgZnVuY3Rpb25zIG9ubHkgKi8KIGV4dGVybiBpbnQgaW5pdF9hcmNoX2lycSh2b2lkKTsKLWV4dGVybiB2b2lkIGJmaW5faWNhY2hlX2luaXQodm9pZCk7Ci1leHRlcm4gdm9pZCBiZmluX2RjYWNoZV9pbml0KHZvaWQpOwogZXh0ZXJuIHZvaWQgaW5pdF9leGNlcHRpb25fdmVjdG9ycyh2b2lkKTsKIGV4dGVybiB2b2lkIHByb2dyYW1fSUFSKHZvaWQpOwogCkBAIC0xMTAsNyArMTExLDcgQEAKIAogI2lmZGVmIENPTkZJR19CRklOX0lDQUNIRV9MT0NLCiBleHRlcm4gdm9pZCBjYWNoZV9ncmFiX2xvY2soaW50IHdheSk7Ci1leHRlcm4gdm9pZCBjYWNoZV9sb2NrKGludCB3YXkpOworZXh0ZXJuIHZvaWQgYmZpbl9jYWNoZV9sb2NrKGludCB3YXkpOwogI2VuZGlmCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9iZmluNXh4X3NwaS5oIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9iZmluNXh4X3NwaS5oCmluZGV4IDlmYTE5MTUuLjEzMDZlNmIgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vYmZpbjV4eF9zcGkuaAorKysgYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2JmaW41eHhfc3BpLmgKQEAgLTEsMjIgKzEsMTIgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotKiBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwOCwgQW5hbG9nIERldmljZXMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQKLSoKLSogRklMRSBiZmluNXh4X3NwaS5oCi0qIFBST0dSQU1NRVIoUyk6IEx1a2UgWWFuZyAoQW5hbG9nIERldmljZXMgSW5jLikKLSoKLSoKLSogREFURSBPRiBDUkVBVElPTjogTWFyY2guIDEwdGggMjAwNgotKgotKiBTWU5PUFNJUzoKLSoKLSogREVTQ1JJUFRJT046IGhlYWRlciBmaWxlIGZvciBTUEkgY29udHJvbGxlciBkcml2ZXIgZm9yIEJsYWNrZmluNXh4LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotKiBNT0RJRklDQVRJT04gSElTVE9SWToKLSogTWFyY2ggMTAsIDIwMDYgIGJmaW41eHhfc3BpLmggQ3JlYXRlZC4gKEx1a2UgWWFuZykKLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIEJsYWNrZmluIE9uLUNoaXAgU1BJIERyaXZlcgorICoKKyAqIENvcHlyaWdodCAyMDA0LTIwMDggQW5hbG9nIERldmljZXMgSW5jLgorICoKKyAqIEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLworICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KKyAqLwogCiAjaWZuZGVmIF9TUElfQ0hBTk5FTF9IXwogI2RlZmluZSBfU1BJX0NIQU5ORUxfSF8KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vYmZpbl9zZGguaCBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vYmZpbl9zZGguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjFkNTQ5Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9iZmluX3NkaC5oCkBAIC0wLDAgKzEsMTkgQEAKKy8qCisgKiBiZmluX3NkaC5oIC0gQmxhY2tmaW4gU0RIIGRlZmluaXRpb25zCisgKgorICogQ29weXJpZ2h0IDIwMDggQW5hbG9nIERldmljZXMgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KKyAqLworCisjaWZuZGVmIF9fQkZJTl9TREhfSF9fCisjZGVmaW5lIF9fQkZJTl9TREhfSF9fCisKK3N0cnVjdCBiZmluX3NkX2hvc3QgeworCWludCBkbWFfY2hhbjsKKwlpbnQgaXJxX2ludDA7CisJaW50IGlycV9pbnQxOworCXUxNiBwaW5fcmVxWzddOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2JmaW5fc3BvcnQuaCBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vYmZpbl9zcG9ydC5oCmluZGV4IGM3NmVkOGQuLmZlODhhMmMgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vYmZpbl9zcG9ydC5oCisrKyBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vYmZpbl9zcG9ydC5oCkBAIC0xMjAsOSArMTIwLDYgQEAKICNkZWZpbmUgU1BPUlRfSU9DX01BR0lDCQknUCcKICNkZWZpbmUgU1BPUlRfSU9DX0NPTkZJRwlfSU9XUignUCcsIDB4MDEsIHN0cnVjdCBzcG9ydF9jb25maWcpCiAKLS8qIFRlc3QgcHVycG9zZSAqLwotI2RlZmluZSBFTkFCTEVfQUQ3MzMxMQkJX0lPV1IoJ1AnLCAweDAyLCBpbnQpCi0KIHN0cnVjdCBzcG9ydF9kZXYgewogCXN0cnVjdCBjZGV2IGNkZXY7CS8qIENoYXIgZGV2aWNlIHN0cnVjdHVyZSAqLwogCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2Jmcm9tLmggYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2Jmcm9tLmgKaW5kZXggY2ZlODAyNC4uOWU0YmU1ZSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9iZnJvbS5oCisrKyBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vYmZyb20uaApAQCAtNDMsNiArNDMsMTEgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBiZnJvbV9Tb2Z0UmVzZXQodm9pZCAqbmV3X3N0YWNrKQogewogCXdoaWxlICgxKQorCQkvKgorCQkgKiBXZSBkb24ndCBkZWNsYXJlIHRoZSBTUCBhcyBjbG9iYmVyZWQgb24gcHVycG9zZSwgc2luY2UKKwkJICogaXQgY29uZnVzZXMgdGhlIGhlY2sgb3V0IG9mIHRoZSBjb21waWxlciwgYW5kIHRoaXMgZnVuY3Rpb24KKwkJICogbmV2ZXIgcmV0dXJucworCQkgKi8KIAkJX19hc21fXyBfX3ZvbGF0aWxlX18oCiAJCQkic3AgPSAlW3N0YWNrXTsiCiAJCQkianVtcCAoJVtiZnJvbV9zeXNjb250cm9sXSk7IgpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9iaXRvcHMuaCBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vYml0b3BzLmgKaW5kZXggYzQyOGU0MS4uMjFiMDM2ZSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9iaXRvcHMuaAorKysgYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2JpdG9wcy5oCkBAIC03LDcgKzcsNiBAQAogCiAjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KICNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CS8qIHN3YWIzMiAqLwotI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4JCS8qIHNhdmVfZmxhZ3MgKi8KIAogI2lmZGVmIF9fS0VSTkVMX18KIApAQCAtMjAsOTYgKzE5LDE5MiBAQAogI2luY2x1ZGUgPGFzbS1nZW5lcmljL2JpdG9wcy9zY2hlZC5oPgogI2luY2x1ZGUgPGFzbS1nZW5lcmljL2JpdG9wcy9mZnouaD4KIAotc3RhdGljIF9faW5saW5lX18gdm9pZCBzZXRfYml0KGludCBuciwgdm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqYWRkcikKKyNpZmRlZiBDT05GSUdfU01QCisKKyNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CisKK2FzbWxpbmthZ2UgaW50IF9fcmF3X2JpdF9zZXRfYXNtKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKmFkZHIsIGludCBucik7CisKK2FzbWxpbmthZ2UgaW50IF9fcmF3X2JpdF9jbGVhcl9hc20odm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqYWRkciwgaW50IG5yKTsKKworYXNtbGlua2FnZSBpbnQgX19yYXdfYml0X3RvZ2dsZV9hc20odm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqYWRkciwgaW50IG5yKTsKKworYXNtbGlua2FnZSBpbnQgX19yYXdfYml0X3Rlc3Rfc2V0X2FzbSh2b2xhdGlsZSB1bnNpZ25lZCBsb25nICphZGRyLCBpbnQgbnIpOworCithc21saW5rYWdlIGludCBfX3Jhd19iaXRfdGVzdF9jbGVhcl9hc20odm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqYWRkciwgaW50IG5yKTsKKworYXNtbGlua2FnZSBpbnQgX19yYXdfYml0X3Rlc3RfdG9nZ2xlX2FzbSh2b2xhdGlsZSB1bnNpZ25lZCBsb25nICphZGRyLCBpbnQgbnIpOworCithc21saW5rYWdlIGludCBfX3Jhd19iaXRfdGVzdF9hc20oY29uc3Qgdm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqYWRkciwgaW50IG5yKTsKKworc3RhdGljIGlubGluZSB2b2lkIHNldF9iaXQoaW50IG5yLCB2b2xhdGlsZSB1bnNpZ25lZCBsb25nICphZGRyKQoreworCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKmEgPSBhZGRyICsgKG5yID4+IDUpOworCV9fcmF3X2JpdF9zZXRfYXNtKGEsIG5yICYgMHgxZik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjbGVhcl9iaXQoaW50IG5yLCB2b2xhdGlsZSB1bnNpZ25lZCBsb25nICphZGRyKQoreworCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKmEgPSBhZGRyICsgKG5yID4+IDUpOworCV9fcmF3X2JpdF9jbGVhcl9hc20oYSwgbnIgJiAweDFmKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGNoYW5nZV9iaXQoaW50IG5yLCB2b2xhdGlsZSB1bnNpZ25lZCBsb25nICphZGRyKQoreworCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKmEgPSBhZGRyICsgKG5yID4+IDUpOworCV9fcmF3X2JpdF90b2dnbGVfYXNtKGEsIG5yICYgMHgxZik7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHRlc3RfYml0KGludCBuciwgY29uc3Qgdm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqYWRkcikKK3sKKwl2b2xhdGlsZSBjb25zdCB1bnNpZ25lZCBsb25nICphID0gYWRkciArIChuciA+PiA1KTsKKwlyZXR1cm4gX19yYXdfYml0X3Rlc3RfYXNtKGEsIG5yICYgMHgxZikgIT0gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgdGVzdF9hbmRfc2V0X2JpdChpbnQgbnIsIHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKmFkZHIpCit7CisJdm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqYSA9IGFkZHIgKyAobnIgPj4gNSk7CisJcmV0dXJuIF9fcmF3X2JpdF90ZXN0X3NldF9hc20oYSwgbnIgJiAweDFmKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgdGVzdF9hbmRfY2xlYXJfYml0KGludCBuciwgdm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqYWRkcikKK3sKKwl2b2xhdGlsZSB1bnNpZ25lZCBsb25nICphID0gYWRkciArIChuciA+PiA1KTsKKwlyZXR1cm4gX19yYXdfYml0X3Rlc3RfY2xlYXJfYXNtKGEsIG5yICYgMHgxZik7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHRlc3RfYW5kX2NoYW5nZV9iaXQoaW50IG5yLCB2b2xhdGlsZSB1bnNpZ25lZCBsb25nICphZGRyKQoreworCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKmEgPSBhZGRyICsgKG5yID4+IDUpOworCXJldHVybiBfX3Jhd19iaXRfdGVzdF90b2dnbGVfYXNtKGEsIG5yICYgMHgxZik7Cit9CisKKyNlbHNlIC8qICFDT05GSUdfU01QICovCisKKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CQkvKiBzYXZlX2ZsYWdzICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfYml0KGludCBuciwgdm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqYWRkcikKIHsKIAlpbnQgKmEgPSAoaW50ICopYWRkcjsKIAlpbnQgbWFzazsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCiAJYSArPSBuciA+PiA1OwogCW1hc2sgPSAxIDw8IChuciAmIDB4MWYpOwotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlsb2NhbF9pcnFfc2F2ZV9odyhmbGFncyk7CiAJKmEgfD0gbWFzazsKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJbG9jYWxfaXJxX3Jlc3RvcmVfaHcoZmxhZ3MpOwogfQogCi1zdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fc2V0X2JpdChpbnQgbnIsIHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKmFkZHIpCitzdGF0aWMgaW5saW5lIHZvaWQgY2xlYXJfYml0KGludCBuciwgdm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqYWRkcikKIHsKIAlpbnQgKmEgPSAoaW50ICopYWRkcjsKIAlpbnQgbWFzazsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWEgKz0gbnIgPj4gNTsKKwltYXNrID0gMSA8PCAobnIgJiAweDFmKTsKKwlsb2NhbF9pcnFfc2F2ZV9odyhmbGFncyk7CisJKmEgJj0gfm1hc2s7CisJbG9jYWxfaXJxX3Jlc3RvcmVfaHcoZmxhZ3MpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY2hhbmdlX2JpdChpbnQgbnIsIHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKmFkZHIpCit7CisJaW50IG1hc2ssIGZsYWdzOworCXVuc2lnbmVkIGxvbmcgKkFERFIgPSAodW5zaWduZWQgbG9uZyAqKWFkZHI7CisKKwlBRERSICs9IG5yID4+IDU7CisJbWFzayA9IDEgPDwgKG5yICYgMzEpOworCWxvY2FsX2lycV9zYXZlX2h3KGZsYWdzKTsKKwkqQUREUiBePSBtYXNrOworCWxvY2FsX2lycV9yZXN0b3JlX2h3KGZsYWdzKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgdGVzdF9hbmRfc2V0X2JpdChpbnQgbnIsIHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKmFkZHIpCit7CisJaW50IG1hc2ssIHJldHZhbDsKKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKmEgPSAodm9sYXRpbGUgdW5zaWduZWQgaW50ICopYWRkcjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJYSArPSBuciA+PiA1OwogCW1hc2sgPSAxIDw8IChuciAmIDB4MWYpOworCWxvY2FsX2lycV9zYXZlX2h3KGZsYWdzKTsKKwlyZXR2YWwgPSAobWFzayAmICphKSAhPSAwOwogCSphIHw9IG1hc2s7CisJbG9jYWxfaXJxX3Jlc3RvcmVfaHcoZmxhZ3MpOworCisJcmV0dXJuIHJldHZhbDsKIH0KIAorc3RhdGljIGlubGluZSBpbnQgdGVzdF9hbmRfY2xlYXJfYml0KGludCBuciwgdm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqYWRkcikKK3sKKwlpbnQgbWFzaywgcmV0dmFsOworCXZvbGF0aWxlIHVuc2lnbmVkIGludCAqYSA9ICh2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKilhZGRyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlhICs9IG5yID4+IDU7CisJbWFzayA9IDEgPDwgKG5yICYgMHgxZik7CisJbG9jYWxfaXJxX3NhdmVfaHcoZmxhZ3MpOworCXJldHZhbCA9IChtYXNrICYgKmEpICE9IDA7CisJKmEgJj0gfm1hc2s7CisJbG9jYWxfaXJxX3Jlc3RvcmVfaHcoZmxhZ3MpOworCisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGlubGluZSBpbnQgdGVzdF9hbmRfY2hhbmdlX2JpdChpbnQgbnIsIHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKmFkZHIpCit7CisJaW50IG1hc2ssIHJldHZhbDsKKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKmEgPSAodm9sYXRpbGUgdW5zaWduZWQgaW50ICopYWRkcjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJYSArPSBuciA+PiA1OworCW1hc2sgPSAxIDw8IChuciAmIDB4MWYpOworCWxvY2FsX2lycV9zYXZlX2h3KGZsYWdzKTsKKwlyZXR2YWwgPSAobWFzayAmICphKSAhPSAwOworCSphIF49IG1hc2s7CisJbG9jYWxfaXJxX3Jlc3RvcmVfaHcoZmxhZ3MpOworCXJldHVybiByZXR2YWw7Cit9CisKKyNlbmRpZiAvKiBDT05GSUdfU01QICovCisKIC8qCiAgKiBjbGVhcl9iaXQoKSBkb2Vzbid0IHByb3ZpZGUgYW55IGJhcnJpZXIgZm9yIHRoZSBjb21waWxlci4KICAqLwogI2RlZmluZSBzbXBfbWJfX2JlZm9yZV9jbGVhcl9iaXQoKQliYXJyaWVyKCkKICNkZWZpbmUgc21wX21iX19hZnRlcl9jbGVhcl9iaXQoKQliYXJyaWVyKCkKIAotc3RhdGljIF9faW5saW5lX18gdm9pZCBjbGVhcl9iaXQoaW50IG5yLCB2b2xhdGlsZSB1bnNpZ25lZCBsb25nICphZGRyKQotewotCWludCAqYSA9IChpbnQgKilhZGRyOwotCWludCBtYXNrOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JYSArPSBuciA+PiA1OwotCW1hc2sgPSAxIDw8IChuciAmIDB4MWYpOwotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQkqYSAmPSB+bWFzazsKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci19Ci0KLXN0YXRpYyBfX2lubGluZV9fIHZvaWQgX19jbGVhcl9iaXQoaW50IG5yLCB2b2xhdGlsZSB1bnNpZ25lZCBsb25nICphZGRyKQorc3RhdGljIGlubGluZSB2b2lkIF9fc2V0X2JpdChpbnQgbnIsIHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKmFkZHIpCiB7CiAJaW50ICphID0gKGludCAqKWFkZHI7CiAJaW50IG1hc2s7CiAKIAlhICs9IG5yID4+IDU7CiAJbWFzayA9IDEgPDwgKG5yICYgMHgxZik7Ci0JKmEgJj0gfm1hc2s7Ci19Ci0KLXN0YXRpYyBfX2lubGluZV9fIHZvaWQgY2hhbmdlX2JpdChpbnQgbnIsIHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKmFkZHIpCi17Ci0JaW50IG1hc2ssIGZsYWdzOwotCXVuc2lnbmVkIGxvbmcgKkFERFIgPSAodW5zaWduZWQgbG9uZyAqKWFkZHI7Ci0KLQlBRERSICs9IG5yID4+IDU7Ci0JbWFzayA9IDEgPDwgKG5yICYgMzEpOwotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQkqQUREUiBePSBtYXNrOwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLX0KLQotc3RhdGljIF9faW5saW5lX18gdm9pZCBfX2NoYW5nZV9iaXQoaW50IG5yLCB2b2xhdGlsZSB1bnNpZ25lZCBsb25nICphZGRyKQotewotCWludCBtYXNrOwotCXVuc2lnbmVkIGxvbmcgKkFERFIgPSAodW5zaWduZWQgbG9uZyAqKWFkZHI7Ci0KLQlBRERSICs9IG5yID4+IDU7Ci0JbWFzayA9IDEgPDwgKG5yICYgMzEpOwotCSpBRERSIF49IG1hc2s7Ci19Ci0KLXN0YXRpYyBfX2lubGluZV9fIGludCB0ZXN0X2FuZF9zZXRfYml0KGludCBuciwgdm9pZCAqYWRkcikKLXsKLQlpbnQgbWFzaywgcmV0dmFsOwotCXZvbGF0aWxlIHVuc2lnbmVkIGludCAqYSA9ICh2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKilhZGRyOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlhICs9IG5yID4+IDU7Ci0JbWFzayA9IDEgPDwgKG5yICYgMHgxZik7Ci0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCXJldHZhbCA9IChtYXNrICYgKmEpICE9IDA7CiAJKmEgfD0gbWFzazsKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci0KLQlyZXR1cm4gcmV0dmFsOwogfQogCi1zdGF0aWMgX19pbmxpbmVfXyBpbnQgX190ZXN0X2FuZF9zZXRfYml0KGludCBuciwgdm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqYWRkcikKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2NsZWFyX2JpdChpbnQgbnIsIHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKmFkZHIpCit7CisJaW50ICphID0gKGludCAqKWFkZHI7CisJaW50IG1hc2s7CisKKwlhICs9IG5yID4+IDU7CisJbWFzayA9IDEgPDwgKG5yICYgMHgxZik7CisJKmEgJj0gfm1hc2s7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2NoYW5nZV9iaXQoaW50IG5yLCB2b2xhdGlsZSB1bnNpZ25lZCBsb25nICphZGRyKQoreworCWludCBtYXNrOworCXVuc2lnbmVkIGxvbmcgKkFERFIgPSAodW5zaWduZWQgbG9uZyAqKWFkZHI7CisKKwlBRERSICs9IG5yID4+IDU7CisJbWFzayA9IDEgPDwgKG5yICYgMzEpOworCSpBRERSIF49IG1hc2s7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IF9fdGVzdF9hbmRfc2V0X2JpdChpbnQgbnIsIHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKmFkZHIpCiB7CiAJaW50IG1hc2ssIHJldHZhbDsKIAl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKmEgPSAodm9sYXRpbGUgdW5zaWduZWQgaW50ICopYWRkcjsKQEAgLTEyMSwyMyArMjE2LDcgQEAKIAlyZXR1cm4gcmV0dmFsOwogfQogCi1zdGF0aWMgX19pbmxpbmVfXyBpbnQgdGVzdF9hbmRfY2xlYXJfYml0KGludCBuciwgdm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqYWRkcikKLXsKLQlpbnQgbWFzaywgcmV0dmFsOwotCXZvbGF0aWxlIHVuc2lnbmVkIGludCAqYSA9ICh2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKilhZGRyOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlhICs9IG5yID4+IDU7Ci0JbWFzayA9IDEgPDwgKG5yICYgMHgxZik7Ci0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCXJldHZhbCA9IChtYXNrICYgKmEpICE9IDA7Ci0JKmEgJj0gfm1hc2s7Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCi0JcmV0dXJuIHJldHZhbDsKLX0KLQotc3RhdGljIF9faW5saW5lX18gaW50IF9fdGVzdF9hbmRfY2xlYXJfYml0KGludCBuciwgdm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqYWRkcikKK3N0YXRpYyBpbmxpbmUgaW50IF9fdGVzdF9hbmRfY2xlYXJfYml0KGludCBuciwgdm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqYWRkcikKIHsKIAlpbnQgbWFzaywgcmV0dmFsOwogCXZvbGF0aWxlIHVuc2lnbmVkIGludCAqYSA9ICh2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKilhZGRyOwpAQCAtMTQ5LDIyICsyMjgsNyBAQAogCXJldHVybiByZXR2YWw7CiB9CiAKLXN0YXRpYyBfX2lubGluZV9fIGludCB0ZXN0X2FuZF9jaGFuZ2VfYml0KGludCBuciwgdm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqYWRkcikKLXsKLQlpbnQgbWFzaywgcmV0dmFsOwotCXZvbGF0aWxlIHVuc2lnbmVkIGludCAqYSA9ICh2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKilhZGRyOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlhICs9IG5yID4+IDU7Ci0JbWFzayA9IDEgPDwgKG5yICYgMHgxZik7Ci0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCXJldHZhbCA9IChtYXNrICYgKmEpICE9IDA7Ci0JKmEgXj0gbWFzazsKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci0JcmV0dXJuIHJldHZhbDsKLX0KLQotc3RhdGljIF9faW5saW5lX18gaW50IF9fdGVzdF9hbmRfY2hhbmdlX2JpdChpbnQgbnIsCitzdGF0aWMgaW5saW5lIGludCBfX3Rlc3RfYW5kX2NoYW5nZV9iaXQoaW50IG5yLAogCQkJCQkgICAgdm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqYWRkcikKIHsKIAlpbnQgbWFzaywgcmV0dmFsOwpAQCAtMTc3LDE2ICsyNDEsNyBAQAogCXJldHVybiByZXR2YWw7CiB9CiAKLS8qCi0gKiBUaGlzIHJvdXRpbmUgZG9lc24ndCBuZWVkIHRvIGJlIGF0b21pYy4KLSAqLwotc3RhdGljIF9faW5saW5lX18gaW50IF9fY29uc3RhbnRfdGVzdF9iaXQoaW50IG5yLCBjb25zdCB2b2lkICphZGRyKQotewotCXJldHVybiAoKDFVTCA8PCAobnIgJiAzMSkpICYKLQkJKCgoY29uc3Qgdm9sYXRpbGUgdW5zaWduZWQgaW50ICopYWRkcilbbnIgPj4gNV0pKSAhPSAwOwotfQotCi1zdGF0aWMgX19pbmxpbmVfXyBpbnQgX190ZXN0X2JpdChpbnQgbnIsIGNvbnN0IHZvaWQgKmFkZHIpCitzdGF0aWMgaW5saW5lIGludCBfX3Rlc3RfYml0KGludCBuciwgY29uc3Qgdm9pZCAqYWRkcikKIHsKIAlpbnQgKmEgPSAoaW50ICopYWRkcjsKIAlpbnQgbWFzazsKQEAgLTE5NiwxMCArMjUxLDE2IEBACiAJcmV0dXJuICgobWFzayAmICphKSAhPSAwKTsKIH0KIAotI2RlZmluZSB0ZXN0X2JpdChucixhZGRyKSBcCi0oX19idWlsdGluX2NvbnN0YW50X3AobnIpID8gXAotIF9fY29uc3RhbnRfdGVzdF9iaXQoKG5yKSwoYWRkcikpIDogXAotIF9fdGVzdF9iaXQoKG5yKSwoYWRkcikpKQorI2lmbmRlZiBDT05GSUdfU01QCisvKgorICogVGhpcyByb3V0aW5lIGRvZXNuJ3QgbmVlZCBpcnEgc2F2ZSBhbmQgcmVzdG9yZSBvcHMgaW4gVVAKKyAqIGNvbnRleHQuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHRlc3RfYml0KGludCBuciwgY29uc3Qgdm9pZCAqYWRkcikKK3sKKwlyZXR1cm4gX190ZXN0X2JpdChuciwgYWRkcik7Cit9CisjZW5kaWYKIAogI2luY2x1ZGUgPGFzbS1nZW5lcmljL2JpdG9wcy9maW5kLmg+CiAjaW5jbHVkZSA8YXNtLWdlbmVyaWMvYml0b3BzL2h3ZWlnaHQuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vYmxhY2tmaW4uaCBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vYmxhY2tmaW4uaAppbmRleCA4NzQ5YjBlLi44YmIyY2IxIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2JsYWNrZmluLmgKKysrIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9ibGFja2Zpbi5oCkBAIC02LDExICs2LDYgQEAKICNpZm5kZWYgX0JMQUNLRklOX0hfCiAjZGVmaW5lIF9CTEFDS0ZJTl9IXwogCi0jZGVmaW5lIExPKGNvbjMyKSAoKGNvbjMyKSAmIDB4RkZGRikKLSNkZWZpbmUgbG8oY29uMzIpICgoY29uMzIpICYgMHhGRkZGKQotI2RlZmluZSBISShjb24zMikgKCgoY29uMzIpID4+IDE2KSAmIDB4RkZGRikKLSNkZWZpbmUgaGkoY29uMzIpICgoKGNvbjMyKSA+PiAxNikgJiAweEZGRkYpCi0KICNpbmNsdWRlIDxtYWNoL2Fub21hbHkuaD4KIAogI2lmbmRlZiBfX0FTU0VNQkxZX18KQEAgLTY1LDYgKzYwLDExIEBACiAKICNlbHNlICAvKiBfX0FTU0VNQkxZX18gKi8KIAorI2RlZmluZSBMTyhjb24zMikgKChjb24zMikgJiAweEZGRkYpCisjZGVmaW5lIGxvKGNvbjMyKSAoKGNvbjMyKSAmIDB4RkZGRikKKyNkZWZpbmUgSEkoY29uMzIpICgoKGNvbjMyKSA+PiAxNikgJiAweEZGRkYpCisjZGVmaW5lIGhpKGNvbjMyKSAoKChjb24zMikgPj4gMTYpICYgMHhGRkZGKQorCiAvKiBTU1lOQyAmIENTWU5DIGltcGxlbWVudGF0aW9ucyBmb3IgYXNzZW1ibHkgZmlsZXMgKi8KIAogI2RlZmluZSBzc3luYyh4KSBTU1lOQyh4KQpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9ieXRlb3JkZXIuaCBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vYnl0ZW9yZGVyLmgKaW5kZXggNmE2NzNkNC4uYjllNzk3YSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9ieXRlb3JkZXIuaAorKysgYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2J5dGVvcmRlci5oCkBAIC0xLDQ4ICsxLDcgQEAKICNpZm5kZWYgX0JMQUNLRklOX0JZVEVPUkRFUl9ICiAjZGVmaW5lIF9CTEFDS0ZJTl9CWVRFT1JERVJfSAogCi0jaW5jbHVkZSA8YXNtL3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KLQotI2lmZGVmIF9fR05VQ19fCi0KLXN0YXRpYyBfX2lubGluZV9fIF9fYXR0cmlidXRlX2NvbnN0X18gX191MzIgX19fYXJjaF9fc3dhaGIzMihfX3UzMiB4eCkKLXsKLQlfX3UzMiB0bXA7Ci0JX19hc21fXygiJTEgPSAlMCA+PiA4IChWKTtcblx0IgotCQkiJTAgPSAlMCA8PCA4IChWKTtcblx0IgotCQkiJTAgPSAlMCB8ICUxO1xuXHQiCi0JCTogIitkIih4eCksICI9JmQiKHRtcCkpOwotCXJldHVybiB4eDsKLX0KLQotc3RhdGljIF9faW5saW5lX18gX19hdHRyaWJ1dGVfY29uc3RfXyBfX3UzMiBfX19hcmNoX19zd2FodzMyKF9fdTMyIHh4KQotewotCV9fdTMyIHJ2OwotCV9fYXNtX18oIiUwID0gUEFDSyglMS5MLCAlMS5IKTtcblx0IjogIj1kIihydik6ICJkIih4eCkpOwotCXJldHVybiBydjsKLX0KLQotI2RlZmluZSBfX2FyY2hfX3N3YWhiMzIoeCkgX19fYXJjaF9fc3dhaGIzMih4KQotI2RlZmluZSBfX2FyY2hfX3N3YWh3MzIoeCkgX19fYXJjaF9fc3dhaHczMih4KQotI2RlZmluZSBfX2FyY2hfX3N3YWIzMih4KSBfX19hcmNoX19zd2FoYjMyKF9fX2FyY2hfX3N3YWh3MzIoeCkpCi0KLXN0YXRpYyBfX2lubGluZV9fIF9fYXR0cmlidXRlX2NvbnN0X18gX191MTYgX19fYXJjaF9fc3dhYjE2KF9fdTE2IHh4KQotewotCV9fdTMyIHh3ID0geHg7Ci0JX19hc21fXygiJTAgPDw9IDg7XG4JJTAuTCA9ICUwLkwgKyAlMC5IIChOUyk7XG4iOiAiK2QiKHh3KSk7Ci0JcmV0dXJuIChfX3UxNil4dzsKLX0KLQotI2RlZmluZSBfX2FyY2hfX3N3YWIxNih4KSBfX19hcmNoX19zd2FiMTYoeCkKLQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAhZGVmaW5lZChfX1NUUklDVF9BTlNJX18pIHx8IGRlZmluZWQoX19LRVJORUxfXykKLSMgIGRlZmluZSBfX0JZVEVPUkRFUl9IQVNfVTY0X18KLSMgIGRlZmluZSBfX1NXQUJfNjRfVEhSVV8zMl9fCi0jZW5kaWYKLQorI2luY2x1ZGUgPGFzbS9zd2FiLmg+CiAjaW5jbHVkZSA8bGludXgvYnl0ZW9yZGVyL2xpdHRsZV9lbmRpYW4uaD4KIAogI2VuZGlmCQkJCS8qIF9CTEFDS0ZJTl9CWVRFT1JERVJfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9jYWNoZS5oIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9jYWNoZS5oCmluZGV4IDAyM2Q3MjEuLjg2NjM3ODEgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vY2FjaGUuaAorKysgYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2NhY2hlLmgKQEAgLTEyLDYgKzEyLDExIEBACiAjZGVmaW5lIEwxX0NBQ0hFX0JZVEVTCSgxIDw8IEwxX0NBQ0hFX1NISUZUKQogI2RlZmluZSBTTVBfQ0FDSEVfQllURVMJTDFfQ0FDSEVfQllURVMKIAorI2lmZGVmIENPTkZJR19TTVAKKyNkZWZpbmUgX19jYWNoZWxpbmVfYWxpZ25lZAorI2Vsc2UKKyNkZWZpbmUgX19fX2NhY2hlbGluZV9hbGlnbmVkCisKIC8qCiAgKiBQdXQgY2FjaGVsaW5lX2FsaWdlZCBkYXRhIHRvIEwxIGRhdGEgbWVtb3J5CiAgKi8KQEAgLTIxLDkgKzI2LDMzIEBACiAJCV9fc2VjdGlvbl9fKCIuZGF0YV9sMS5jYWNoZWxpbmVfYWxpZ25lZCIpKSkKICNlbmRpZgogCisjZW5kaWYKKwogLyoKICAqIGxhcmdlc3QgTDEgd2hpY2ggdGhpcyBhcmNoIHN1cHBvcnRzCiAgKi8KICNkZWZpbmUgTDFfQ0FDSEVfU0hJRlRfTUFYCTUKIAorI2lmIGRlZmluZWQoQ09ORklHX1NNUCkgJiYgXAorICAgICFkZWZpbmVkKENPTkZJR19CRklOX0NBQ0hFX0NPSEVSRU5UKSAmJiBcCisgICAgZGVmaW5lZChDT05GSUdfQkZJTl9EQ0FDSEUpCisjZGVmaW5lIF9fQVJDSF9TWU5DX0NPUkVfRENBQ0hFCisjaWZuZGVmIF9fQVNTRU1CTFlfXworYXNtbGlua2FnZSB2b2lkIF9fcmF3X3NtcF9tYXJrX2JhcnJpZXJfYXNtKHZvaWQpOworYXNtbGlua2FnZSB2b2lkIF9fcmF3X3NtcF9jaGVja19iYXJyaWVyX2FzbSh2b2lkKTsKKworc3RhdGljIGlubGluZSB2b2lkIHNtcF9tYXJrX2JhcnJpZXIodm9pZCkKK3sKKwlfX3Jhd19zbXBfbWFya19iYXJyaWVyX2FzbSgpOworfQorc3RhdGljIGlubGluZSB2b2lkIHNtcF9jaGVja19iYXJyaWVyKHZvaWQpCit7CisJX19yYXdfc21wX2NoZWNrX2JhcnJpZXJfYXNtKCk7Cit9CisKK3ZvaWQgcmVzeW5jX2NvcmVfZGNhY2hlKHZvaWQpOworI2VuZGlmCisjZW5kaWYKKworCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vY2FjaGVmbHVzaC5oIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9jYWNoZWZsdXNoLmgKaW5kZXggNDQwMzQxNS4uMWIwNDBmNSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9jYWNoZWZsdXNoLmgKKysrIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9jYWNoZWZsdXNoLmgKQEAgLTM1LDYgKzM1LDcgQEAKIGV4dGVybiB2b2lkIGJsYWNrZmluX2RjYWNoZV9mbHVzaF9yYW5nZSh1bnNpZ25lZCBsb25nIHN0YXJ0X2FkZHJlc3MsIHVuc2lnbmVkIGxvbmcgZW5kX2FkZHJlc3MpOwogZXh0ZXJuIHZvaWQgYmxhY2tmaW5fZGNhY2hlX2ludmFsaWRhdGVfcmFuZ2UodW5zaWduZWQgbG9uZyBzdGFydF9hZGRyZXNzLCB1bnNpZ25lZCBsb25nIGVuZF9hZGRyZXNzKTsKIGV4dGVybiB2b2lkIGJsYWNrZmluX2RmbHVzaF9wYWdlKHZvaWQgKnBhZ2UpOworZXh0ZXJuIHZvaWQgYmxhY2tmaW5faW52YWxpZGF0ZV9lbnRpcmVfZGNhY2hlKHZvaWQpOwogCiAjZGVmaW5lIGZsdXNoX2RjYWNoZV9tbWFwX2xvY2sobWFwcGluZykJCWRvIHsgfSB3aGlsZSAoMCkKICNkZWZpbmUgZmx1c2hfZGNhY2hlX21tYXBfdW5sb2NrKG1hcHBpbmcpCWRvIHsgfSB3aGlsZSAoMCkKQEAgLTQ0LDEyICs0NSwyMCBAQAogI2RlZmluZSBmbHVzaF9jYWNoZV92bWFwKHN0YXJ0LCBlbmQpCQlkbyB7IH0gd2hpbGUgKDApCiAjZGVmaW5lIGZsdXNoX2NhY2hlX3Z1bm1hcChzdGFydCwgZW5kKQkJZG8geyB9IHdoaWxlICgwKQogCisjaWZkZWYgQ09ORklHX1NNUAorI2RlZmluZSBmbHVzaF9pY2FjaGVfcmFuZ2Vfb3RoZXJzKHN0YXJ0LCBlbmQpCVwKKwlzbXBfaWNhY2hlX2ZsdXNoX3JhbmdlX290aGVycygoc3RhcnQpLCAoZW5kKSkKKyNlbHNlCisjZGVmaW5lIGZsdXNoX2ljYWNoZV9yYW5nZV9vdGhlcnMoc3RhcnQsIGVuZCkJZG8geyB9IHdoaWxlICgwKQorI2VuZGlmCisKIHN0YXRpYyBpbmxpbmUgdm9pZCBmbHVzaF9pY2FjaGVfcmFuZ2UodW5zaWduZWQgc3RhcnQsIHVuc2lnbmVkIGVuZCkKIHsKICNpZiBkZWZpbmVkKENPTkZJR19CRklOX0RDQUNIRSkgJiYgZGVmaW5lZChDT05GSUdfQkZJTl9JQ0FDSEUpCiAKICMgaWYgZGVmaW5lZChDT05GSUdfQkZJTl9XVCkKIAlibGFja2Zpbl9pY2FjaGVfZmx1c2hfcmFuZ2UoKHN0YXJ0KSwgKGVuZCkpOworCWZsdXNoX2ljYWNoZV9yYW5nZV9vdGhlcnMoc3RhcnQsIGVuZCk7CiAjIGVsc2UKIAlibGFja2Zpbl9pY2FjaGVfZGNhY2hlX2ZsdXNoX3JhbmdlKChzdGFydCksIChlbmQpKTsKICMgZW5kaWYKQEAgLTU4LDYgKzY3LDcgQEAKIAogIyBpZiBkZWZpbmVkKENPTkZJR19CRklOX0lDQUNIRSkKIAlibGFja2Zpbl9pY2FjaGVfZmx1c2hfcmFuZ2UoKHN0YXJ0KSwgKGVuZCkpOworCWZsdXNoX2ljYWNoZV9yYW5nZV9vdGhlcnMoc3RhcnQsIGVuZCk7CiAjIGVuZGlmCiAjIGlmIGRlZmluZWQoQ09ORklHX0JGSU5fRENBQ0hFKQogCWJsYWNrZmluX2RjYWNoZV9mbHVzaF9yYW5nZSgoc3RhcnQpLCAoZW5kKSk7CkBAIC02NiwxMCArNzYsMTIgQEAKICNlbmRpZgogfQogCi0jZGVmaW5lIGNvcHlfdG9fdXNlcl9wYWdlKHZtYSwgcGFnZSwgdmFkZHIsIGRzdCwgc3JjLCBsZW4pIFwKLWRvIHsgbWVtY3B5KGRzdCwgc3JjLCBsZW4pOyBcCi0gICAgIGZsdXNoX2ljYWNoZV9yYW5nZSAoKHVuc2lnbmVkKSAoZHN0KSwgKHVuc2lnbmVkKSAoZHN0KSArIChsZW4pKTsgXAorI2RlZmluZSBjb3B5X3RvX3VzZXJfcGFnZSh2bWEsIHBhZ2UsIHZhZGRyLCBkc3QsIHNyYywgbGVuKQkJXAorZG8geyBtZW1jcHkoZHN0LCBzcmMsIGxlbik7CQkJCQkJXAorICAgICBmbHVzaF9pY2FjaGVfcmFuZ2UoKHVuc2lnbmVkKSAoZHN0KSwgKHVuc2lnbmVkKSAoZHN0KSArIChsZW4pKTsJXAorICAgICBmbHVzaF9pY2FjaGVfcmFuZ2Vfb3RoZXJzKCh1bnNpZ25lZCBsb25nKSAoZHN0KSwgKHVuc2lnbmVkIGxvbmcpIChkc3QpICsgKGxlbikpO1wKIH0gd2hpbGUgKDApCisKICNkZWZpbmUgY29weV9mcm9tX3VzZXJfcGFnZSh2bWEsIHBhZ2UsIHZhZGRyLCBkc3QsIHNyYywgbGVuKQltZW1jcHkoZHN0LCBzcmMsIGxlbikKIAogI2lmIGRlZmluZWQoQ09ORklHX0JGSU5fRENBQ0hFKQpAQCAtODIsNyArOTQsNyBAQAogIyBkZWZpbmUgZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSkJCQlibGFja2Zpbl9kZmx1c2hfcGFnZShwYWdlX2FkZHJlc3MocGFnZSkpCiAjZWxzZQogIyBkZWZpbmUgZmx1c2hfZGNhY2hlX3JhbmdlKHN0YXJ0LGVuZCkJCWRvIHsgfSB3aGlsZSAoMCkKLSMgZGVmaW5lIGZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpCQkJZG8geyB9IHdoaWxlICgwKQorIyBkZWZpbmUgZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSkJCWRvIHsgfSB3aGlsZSAoMCkKICNlbmRpZgogCiBleHRlcm4gdW5zaWduZWQgbG9uZyByZXNlcnZlZF9tZW1fZGNhY2hlX29uOwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9jaGVja3N1bS5oIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9jaGVja3N1bS5oCmluZGV4IDZmNmFmMmIuLmY2NzI4OWEgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vY2hlY2tzdW0uaAorKysgYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2NoZWNrc3VtLmgKQEAgLTc4LDcgKzc4LDggQEAKICAgICAgICAgICAgICAgICAgIiUwID0gJTAgKyAlNDtcblx0IgogICAgICAgICAgICAgICAgICAiTk9QO1xuXHQiCiAgCQkgOiAiPWQiIChzdW0pCi0JCSA6ICJkIiAoZGFkZHIpLCAiZCIgKHNhZGRyKSwgImQiICgobnRvaHMobGVuKTw8MTYpK3Byb3RvKjI1NiksICJkIiAoMSksICIwIihzdW0pKTsKKwkJIDogImQiIChkYWRkciksICJkIiAoc2FkZHIpLCAiZCIgKChudG9ocyhsZW4pPDwxNikrcHJvdG8qMjU2KSwgImQiICgxKSwgIjAiKHN1bSkKKwkJIDogIkNDIik7CiAKIAlyZXR1cm4gKHN1bSk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2NvbnRleHQuUyBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vY29udGV4dC5TCmluZGV4IGMwZTYzMGUuLjE2NTYxYWIgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vY29udGV4dC5TCisrKyBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vY29udGV4dC5TCkBAIC0zMDMsOSArMzAzLDE0IEBACiAJUkVUSSA9IFtzcCsrXTsKIAlSRVRTID0gW3NwKytdOwogCi0JcDAuaCA9IF9pcnFfZmxhZ3M7Ci0JcDAubCA9IF9pcnFfZmxhZ3M7CisjaWZkZWYgQ09ORklHX1NNUAorCUdFVF9QREEocDAsIHIwKTsKKwlyMCA9IFtwMCArIFBEQV9JUlFGTEFHU107CisjZWxzZQorCXAwLmggPSBfYmZpbl9pcnFfZmxhZ3M7CisJcDAubCA9IF9iZmluX2lycV9mbGFnczsKIAlyMCA9IFtwMF07CisjZW5kaWYKIAlzdGkgcjA7CiAKIAlzcCArPSA0OwkvKiBTa2lwIFJlc2VydmVkICovCkBAIC0zNTMsMyArMzU4LDQxIEBACiAJY3N5bmM7CiAuZW5kbQogCisubWFjcm8gc2F2ZV9jb250ZXh0X2NwbGIKKwlbLS1zcF0gPSAoUjc6MCwgUDU6MCk7CisJWy0tc3BdID0gZnA7CisKKwlbLS1zcF0gPSBhMC54OworCVstLXNwXSA9IGEwLnc7CisJWy0tc3BdID0gYTEueDsKKwlbLS1zcF0gPSBhMS53OworCisJWy0tc3BdID0gTEMwOworCVstLXNwXSA9IExDMTsKKwlbLS1zcF0gPSBMVDA7CisJWy0tc3BdID0gTFQxOworCVstLXNwXSA9IExCMDsKKwlbLS1zcF0gPSBMQjE7CisKKwlbLS1zcF0gPSBSRVRTOworLmVuZG0KKworLm1hY3JvIHJlc3RvcmVfY29udGV4dF9jcGxiCisJUkVUUyA9IFtzcCsrXTsKKworCUxCMSA9IFtzcCsrXTsKKwlMQjAgPSBbc3ArK107CisJTFQxID0gW3NwKytdOworCUxUMCA9IFtzcCsrXTsKKwlMQzEgPSBbc3ArK107CisJTEMwID0gW3NwKytdOworCisJYTEudyA9IFtzcCsrXTsKKwlhMS54ID0gW3NwKytdOworCWEwLncgPSBbc3ArK107CisJYTAueCA9IFtzcCsrXTsKKworCWZwID0gW3NwKytdOworCisJKFI3OjAsIFA1OjApID0gW1NQKytdOworLmVuZG0KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vY3BsYi1tcHUuaCBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vY3BsYi1tcHUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzVjNjdiOS4uMDAwMDAwMAotLS0gYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2NwbGItbXB1LmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKgotICogRmlsZTogICAgICAgICBpbmNsdWRlL2FzbS1ibGFja2Zpbi9jcGxiaW5pdC5oCi0gKiBCYXNlZCBvbjoKLSAqIEF1dGhvcjoKLSAqCi0gKiBDcmVhdGVkOgotICogRGVzY3JpcHRpb246Ci0gKgotICogTW9kaWZpZWQ6Ci0gKiAgICAgICAgICAgICAgIENvcHlyaWdodCAyMDA0LTIwMDYgQW5hbG9nIERldmljZXMgSW5jLgotICoKLSAqIEJ1Z3M6ICAgICAgICAgRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgdGhlIGZpbGUgQ09QWUlORywgb3Igd3JpdGUKLSAqIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotICovCi0jaWZuZGVmIF9fQVNNX0JGSU5fQ1BMQl9NUFVfSAotI2RlZmluZSBfX0FTTV9CRklOX0NQTEJfTVBVX0gKLQotc3RydWN0IGNwbGJfZW50cnkgewotCXVuc2lnbmVkIGxvbmcgZGF0YSwgYWRkcjsKLX07Ci0KLXN0cnVjdCBtZW1fcmVnaW9uIHsKLQl1bnNpZ25lZCBsb25nIHN0YXJ0LCBlbmQ7Ci0JdW5zaWduZWQgbG9uZyBkY3BsYl9kYXRhOwotCXVuc2lnbmVkIGxvbmcgaWNwbGJfZGF0YTsKLX07Ci0KLWV4dGVybiBzdHJ1Y3QgY3BsYl9lbnRyeSBkY3BsYl90YmxbTUFYX0NQTEJTXTsKLWV4dGVybiBzdHJ1Y3QgY3BsYl9lbnRyeSBpY3BsYl90YmxbTUFYX0NQTEJTXTsKLWV4dGVybiBpbnQgZmlyc3Rfc3dpdGNoZWRfaWNwbGI7Ci1leHRlcm4gaW50IGZpcnN0X21hc2tfZGNwbGI7Ci1leHRlcm4gaW50IGZpcnN0X3N3aXRjaGVkX2RjcGxiOwotCi1leHRlcm4gaW50IG5yX2RjcGxiX21pc3MsIG5yX2ljcGxiX21pc3MsIG5yX2ljcGxiX3N1cHZfbWlzcywgbnJfZGNwbGJfcHJvdDsKLWV4dGVybiBpbnQgbnJfY3BsYl9mbHVzaDsKLQotZXh0ZXJuIGludCBwYWdlX21hc2tfb3JkZXI7Ci1leHRlcm4gaW50IHBhZ2VfbWFza19uZWx0czsKLQotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgKmN1cnJlbnRfcnd4X21hc2s7Ci0KLWV4dGVybiB2b2lkIGZsdXNoX3N3aXRjaGVkX2NwbGJzKHZvaWQpOwotZXh0ZXJuIHZvaWQgc2V0X21hc2tfZGNwbGJzKHVuc2lnbmVkIGxvbmcgKik7Ci0KLWV4dGVybiB2b2lkIF9fbm9yZXR1cm4gcGFuaWNfY3BsYl9lcnJvcihpbnQgc2Vxc3RhdCwgc3RydWN0IHB0X3JlZ3MgKik7Ci0KLSNlbmRpZiAvKiBfX0FTTV9CRklOX0NQTEJfTVBVX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vY3BsYi5oIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9jcGxiLmgKaW5kZXggOWU4YjQwMy4uYWQ1NjZmZiAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9jcGxiLmgKKysrIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9jcGxiLmgKQEAgLTMwLDcgKzMwLDYgQEAKICNpZm5kZWYgX0NQTEJfSAogI2RlZmluZSBfQ1BMQl9ICiAKLSNpbmNsdWRlIDxhc20vYmxhY2tmaW4uaD4KICNpbmNsdWRlIDxtYWNoL2Fub21hbHkuaD4KIAogI2RlZmluZSBTRFJBTV9JR0VORVJJQyAgICAoQ1BMQl9MMV9DSEJMIHwgQ1BMQl9VU0VSX1JEIHwgQ1BMQl9WQUxJRCB8IENQTEJfUE9SVFBSSU8pCkBAIC01NSwxMyArNTQsMjQgQEAKICNlbmRpZgogCiAjZGVmaW5lIEwxX0RNRU1PUlkgICAgICAgKENQTEJfTE9DSyB8IENQTEJfQ09NTU9OKQorCisjaWZkZWYgQ09ORklHX1NNUAorI2RlZmluZSBMMl9BVFRSICAgICAgICAgICAoSU5JVElBTF9UIHwgSV9DUExCIHwgRF9DUExCKQorI2RlZmluZSBMMl9JTUVNT1JZICAgICAgICAgKENQTEJfQ09NTU9OIHwgQ1BMQl9MT0NLKQorI2RlZmluZSBMMl9ETUVNT1JZICAgICAgICAgKENQTEJfQ09NTU9OIHwgQ1BMQl9MT0NLKQorCisjZWxzZQogI2lmZGVmIENPTkZJR19CRklOX0wyX0NBQ0hFQUJMRQogI2RlZmluZSBMMl9JTUVNT1JZICAgICAgICAoU0RSQU1fSUdFTkVSSUMpCiAjZGVmaW5lIEwyX0RNRU1PUlkgICAgICAgIChTRFJBTV9ER0VORVJJQykKICNlbHNlCiAjZGVmaW5lIEwyX0lNRU1PUlkgICAgICAgIChDUExCX0NPTU1PTikKICNkZWZpbmUgTDJfRE1FTU9SWSAgICAgICAgKENQTEJfQ09NTU9OKQotI2VuZGlmCisjZW5kaWYgLyogQ09ORklHX0JGSU5fTDJfQ0FDSEVBQkxFICovCisKKyNkZWZpbmUgTDJfQVRUUiAgICAgICAgICAgKElOSVRJQUxfVCB8IFNXSVRDSF9UIHwgSV9DUExCIHwgRF9DUExCKQorI2VuZGlmIC8qIENPTkZJR19TTVAgKi8KKwogI2RlZmluZSBTRFJBTV9ETk9OX0NIQkwgIChDUExCX0NPTU1PTikKICNkZWZpbmUgU0RSQU1fRUJJVSAgICAgICAoQ1BMQl9DT01NT04pCiAjZGVmaW5lIFNEUkFNX09PUFMgICAgICAgKENQTEJfVkFMSUQgfCBBTk9NQUxZXzA1MDAwMTU4X1dPUktBUk9VTkQgfCBDUExCX0xPQ0sgfCBDUExCX0RJUlRZKQpAQCAtNzEsMTQgKzgxLDcgQEAKICNkZWZpbmUgU0laRV8xTSAweDAwMTAwMDAwICAgICAgLyogMU0gKi8KICNkZWZpbmUgU0laRV80TSAweDAwNDAwMDAwICAgICAgLyogNE0gKi8KIAotI2lmZGVmIENPTkZJR19NUFUKICNkZWZpbmUgTUFYX0NQTEJTIDE2Ci0jZWxzZQotI2RlZmluZSBNQVhfQ1BMQlMgKDE2ICogMikKLSNlbmRpZgotCi0jZGVmaW5lIEFTWU5DX01FTU9SWV9DUExCX0NPVkVSQUdFCSgoQVNZTkNfQkFOSzBfU0laRSArIEFTWU5DX0JBTksxX1NJWkUgKyBcCi0JCQkJIEFTWU5DX0JBTksyX1NJWkUgKyBBU1lOQ19CQU5LM19TSVpFKSAvIFNJWkVfNE0pCiAKICNkZWZpbmUgQ1BMQl9FTkFCTEVfSUNBQ0hFX1AJMAogI2RlZmluZSBDUExCX0VOQUJMRV9EQ0FDSEVfUAkxCkBAIC0xMTMsNCArMTE2LDggQEAKICNkZWZpbmUgQ1BMQl9JTk9DQUNIRSAgIAlDUExCX1VTRVJfUkQgfCBDUExCX1ZBTElECiAjZGVmaW5lIENQTEJfSURPQ0FDSEUgICAJQ1BMQl9JTk9DQUNIRSB8IENQTEJfTDFfQ0hCTAogCisjZGVmaW5lIEZBVUxUX1JXICAgICAgICAoMSA8PCAxNikKKyNkZWZpbmUgRkFVTFRfVVNFUlNVUFYgICgxIDw8IDE3KQorI2RlZmluZSBGQVVMVF9DUExCQklUUyAgMHgwMDAwZmZmZgorCiAjZW5kaWYJCQkJLyogX0NQTEJfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9jcGxiaW5pdC5oIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9jcGxiaW5pdC5oCmluZGV4IGY4NDViNDEuLjA1YjE0YTYgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vY3BsYmluaXQuaAorKysgYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2NwbGJpbml0LmgKQEAgLTMyLDYxICszMiw1NiBAQAogCiAjaW5jbHVkZSA8YXNtL2JsYWNrZmluLmg+CiAjaW5jbHVkZSA8YXNtL2NwbGIuaD4KKyNpbmNsdWRlIDxsaW51eC90aHJlYWRzLmg+CisKKyNpZmRlZiBDT05GSUdfQ1BMQl9TV0lUQ0hfVEFCX0wxCisjIGRlZmluZSBQRFRfQVRUUiBfX2F0dHJpYnV0ZV9fKChsMV9kYXRhKSkKKyNlbHNlCisjIGRlZmluZSBQRFRfQVRUUgorI2VuZGlmCisKK3N0cnVjdCBjcGxiX2VudHJ5IHsKKwl1bnNpZ25lZCBsb25nIGRhdGEsIGFkZHI7Cit9OworCitzdHJ1Y3QgY3BsYl9ib3VuZGFyeSB7CisJdW5zaWduZWQgbG9uZyBlYWRkcjsgLyogRW5kIG9mIHRoaXMgcmVnaW9uLiAgKi8KKwl1bnNpZ25lZCBsb25nIGRhdGE7IC8qIENQTEIgZGF0YSB2YWx1ZS4gICovCit9OworCitleHRlcm4gc3RydWN0IGNwbGJfYm91bmRhcnkgZGNwbGJfYm91bmRzW107CitleHRlcm4gc3RydWN0IGNwbGJfYm91bmRhcnkgaWNwbGJfYm91bmRzW107CitleHRlcm4gaW50IGRjcGxiX25yX2JvdW5kcywgaWNwbGJfbnJfYm91bmRzOworCitleHRlcm4gc3RydWN0IGNwbGJfZW50cnkgZGNwbGJfdGJsW05SX0NQVVNdW01BWF9DUExCU107CitleHRlcm4gc3RydWN0IGNwbGJfZW50cnkgaWNwbGJfdGJsW05SX0NQVVNdW01BWF9DUExCU107CitleHRlcm4gaW50IGZpcnN0X3N3aXRjaGVkX2ljcGxiOworZXh0ZXJuIGludCBmaXJzdF9zd2l0Y2hlZF9kY3BsYjsKKworZXh0ZXJuIGludCBucl9kY3BsYl9taXNzW10sIG5yX2ljcGxiX21pc3NbXSwgbnJfaWNwbGJfc3Vwdl9taXNzW107CitleHRlcm4gaW50IG5yX2RjcGxiX3Byb3RbXSwgbnJfY3BsYl9mbHVzaFtdOwogCiAjaWZkZWYgQ09ORklHX01QVQogCi0jaW5jbHVkZSA8YXNtL2NwbGItbXB1Lmg+CitleHRlcm4gaW50IGZpcnN0X21hc2tfZGNwbGI7CiAKLSNlbHNlCitleHRlcm4gaW50IHBhZ2VfbWFza19vcmRlcjsKK2V4dGVybiBpbnQgcGFnZV9tYXNrX25lbHRzOwogCi0jZGVmaW5lIElOSVRJQUxfVCAweDEKLSNkZWZpbmUgU1dJVENIX1QgIDB4MgotI2RlZmluZSBJX0NQTEIgICAgMHg0Ci0jZGVmaW5lIERfQ1BMQiAgICAweDgKK2V4dGVybiB1bnNpZ25lZCBsb25nICpjdXJyZW50X3J3eF9tYXNrW05SX0NQVVNdOwogCi0jZGVmaW5lIElOX0tFUk5FTCAxCitleHRlcm4gdm9pZCBmbHVzaF9zd2l0Y2hlZF9jcGxicyh1bnNpZ25lZCBpbnQpOworZXh0ZXJuIHZvaWQgc2V0X21hc2tfZGNwbGJzKHVuc2lnbmVkIGxvbmcgKiwgdW5zaWduZWQgaW50KTsKIAotZW51bQote1pFUk9fUCwgTDFJX01FTSwgTDFEX01FTSwgU0RSQU1fS0VSTiAsIFNEUkFNX1JBTV9NVEQsIFNEUkFNX0RNQVosIFJFU19NRU0sIEFTWU5DX01FTSwgTDJfTUVNfTsKLQotc3RydWN0IGNwbGJfZGVzYyB7Ci0JdTMyIHN0YXJ0OyAvKiBzdGFydCBhZGRyZXNzICovCi0JdTMyIGVuZDsgLyogZW5kIGFkZHJlc3MgKi8KLQl1MzIgcHNpemU7IC8qIHByZWZlcmVkIHNpemUgaWYgYW55IG90aGVyd2lzZSAxTUIgb3IgNE1CKi8KLQl1MTYgYXR0cjsvKiBhdHRyaWJ1dGVzICovCi0JdTE2IGlfY29uZjsvKiBJLUNQTEIgREFUQSAqLwotCXUxNiBkX2NvbmY7LyogRC1DUExCIERBVEEgKi8KLQl1MTYgdmFsaWQ7LyogdmFsaWQgKi8KLQljb25zdCBzOCBuYW1lWzMwXTsvKiBuYW1lICovCi19OwotCi1zdHJ1Y3QgY3BsYl90YWIgewotICB1X2xvbmcgKnRhYjsKLQl1MTYgcG9zOwotCXUxNiBzaXplOwotfTsKLQotZXh0ZXJuIHVfbG9uZyBpY3BsYl90YWJsZVtdOwotZXh0ZXJuIHVfbG9uZyBkY3BsYl90YWJsZVtdOwotCi0vKiBUaWxsIGhlcmUgd2UgYXJlIGRpc2N1c3NpbmcgYWJvdXQgdGhlIHN0YXRpYyBtZW1vcnkgbWFuYWdlbWVudCBtb2RlbC4KLSAqIEhvd2V2ZXIsIHRoZSBvcGVyYXRpbmcgZW52b3Jvbm1lbnRzIGNvbW1vbmx5IGRlZmluZSBtb3JlIENQTEIKLSAqIGRlc2NyaXB0b3JzIHRvIGNvdmVyIHRoZSBlbnRpcmUgYWRkcmVzc2FibGUgbWVtb3J5IHRoYW4gd2lsbCBmaXQgaW50bwotICogdGhlIGF2YWlsYWJsZSBvbi1jaGlwIDE2IENQTEIgTU1Scy4gV2hlbiB0aGlzIGhhcHBlbnMsIHRoZSBiZWxvdyB0YWJsZQotICogd2lsbCBiZSB1c2VkIHdoaWNoIHdpbGwgaG9sZCBhbGwgdGhlIHBvdGVudGlhbGx5IHJlcXVpcmVkIENQTEIgZGVzY3JpcHRvcnMKLSAqCi0gKiBUaGlzIGlzIGhvdyBQYWdlIGRlc2NyaXB0b3IgVGFibGUgaXMgaW1wbGVtZW50ZWQgaW4gdUNsaW51eC9CbGFja2Zpbi4KLSAqLwotCi1leHRlcm4gdV9sb25nIGlwZHRfdGFibGVbXTsKLWV4dGVybiB1X2xvbmcgZHBkdF90YWJsZVtdOwotI2lmZGVmIENPTkZJR19DUExCX0lORk8KLWV4dGVybiB1X2xvbmcgaXBkdF9zd2FwY291bnRfdGFibGVbXTsKLWV4dGVybiB1X2xvbmcgZHBkdF9zd2FwY291bnRfdGFibGVbXTsKLSNlbmRpZgorZXh0ZXJuIHZvaWQgX19ub3JldHVybiBwYW5pY19jcGxiX2Vycm9yKGludCBzZXFzdGF0LCBzdHJ1Y3QgcHRfcmVncyAqKTsKIAogI2VuZGlmIC8qIENPTkZJR19NUFUgKi8KIAotZXh0ZXJuIHZvaWQgZ2VuZXJhdGVfY3BsYl90YWJsZXModm9pZCk7CitleHRlcm4gdm9pZCBiZmluX2ljYWNoZV9pbml0KHN0cnVjdCBjcGxiX2VudHJ5ICppY3BsYl90YmwpOworZXh0ZXJuIHZvaWQgYmZpbl9kY2FjaGVfaW5pdChzdHJ1Y3QgY3BsYl9lbnRyeSAqaWNwbGJfdGJsKTsKIAorI2lmIGRlZmluZWQoQ09ORklHX0JGSU5fRENBQ0hFKSB8fCBkZWZpbmVkKENPTkZJR19CRklOX0lDQUNIRSkKK2V4dGVybiB2b2lkIGdlbmVyYXRlX2NwbGJfdGFibGVzX2FsbCh2b2lkKTsKK2V4dGVybiB2b2lkIGdlbmVyYXRlX2NwbGJfdGFibGVzX2NwdSh1bnNpZ25lZCBpbnQgY3B1KTsKKyNlbmRpZgogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2NwdS5oIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9jcHUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjU5NGVmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9jcHUuaApAQCAtMCwwICsxLDQxIEBACisvKgorICogRmlsZTogICAgICAgICBhcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2NwdS5oLgorICogQXV0aG9yOiAgICAgICBQaGlsaXBwZSBHZXJ1bSA8cnBtQHhlbm9tYWkub3JnPgorICoKKyAqICAgICAgICAgICAgICAgQ29weXJpZ2h0IDIwMDcgQW5hbG9nIERldmljZXMgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIHRoZSBmaWxlIENPUFlJTkcsIG9yIHdyaXRlCisgKiB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqLworCisjaWZuZGVmIF9fQVNNX0JMQUNLRklOX0NQVV9ICisjZGVmaW5lIF9fQVNNX0JMQUNLRklOX0NQVV9ICisKKyNpbmNsdWRlIDxsaW51eC9wZXJjcHUuaD4KKworc3RydWN0IHRhc2tfc3RydWN0OworCitzdHJ1Y3QgYmxhY2tmaW5fY3B1ZGF0YSB7CisJc3RydWN0IGNwdSBjcHU7CisJc3RydWN0IHRhc2tfc3RydWN0ICppZGxlOworCXVuc2lnbmVkIGludCBpbWVtY3RsOworCXVuc2lnbmVkIGludCBkbWVtY3RsOworCXVuc2lnbmVkIGxvbmcgbG9vcHNfcGVyX2ppZmZ5OworCXVuc2lnbmVkIGxvbmcgZGNhY2hlX2ludmxkX2NvdW50OworfTsKKworREVDTEFSRV9QRVJfQ1BVKHN0cnVjdCBibGFja2Zpbl9jcHVkYXRhLCBjcHVfZGF0YSk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9kbWEuaCBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vZG1hLmgKaW5kZXggNjUwOTczMy4uZTRmN2I4MCAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9kbWEuaAorKysgYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2RtYS5oCkBAIC0xLDQ0ICsxLDE3IEBACiAvKgotICogRmlsZTogICAgICAgICBpbmNsdWRlL2FzbS1ibGFja2Zpbi9zaW1wbGVfYmY1MzNfZG1hLmgKLSAqIEJhc2VkIG9uOiAgICAgbm9uZSAtIG9yaWdpbmFsIHdvcmsKLSAqIEF1dGhvcjogICAgICAgTEcgU29mdCBJbmRpYQotICogICAgICAgICAgICAgICBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNSBBbmFsb2cgRGV2aWNlcyBJbmMuCi0gKiBDcmVhdGVkOiAgICAgIFR1ZSBTZXAgMjEgMjAwNAotICogRGVzY3JpcHRpb246ICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIG1ham9yIERhdGEgc3RydWN0dXJlcyBhbmQgY29uc3RhbnRzCi0gKiAJCSB1c2VkIGZvciBETUEgSW1wbGVtZW50YXRpb24gaW4gQkY1MzMKLSAqIE1vZGlmaWVkOgorICogZG1hLmggLSBCbGFja2ZpbiBETUEgZGVmaW5lcy9zdHJ1Y3R1cmVzL2V0Yy4uLgogICoKLSAqIEJ1Z3M6ICAgICAgICAgRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gKiBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuCi0gKiBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICogQ29weXJpZ2h0IDIwMDQtMjAwOCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCiAgKi8KIAogI2lmbmRlZiBfQkxBQ0tGSU5fRE1BX0hfCiAjZGVmaW5lIF9CTEFDS0ZJTl9ETUFfSF8KIAotI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxhc20vaXJxLmg+Ci0jaW5jbHVkZSA8YXNtL3NpZ25hbC5oPgotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bWFjaC9kbWEuaD4KLSNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPG1hY2gvZG1hLmg+CiAjaW5jbHVkZSA8YXNtL2JsYWNrZmluLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KIAogI2RlZmluZSBNQVhfRE1BX0FERFJFU1MgUEFHRV9PRkZTRVQKIApAQCAtNzksNyArNTIsNyBAQAogI2RlZmluZSBETUFfU1lOQ19SRVNUQVJUCTEKIAogc3RydWN0IGRtYXNnIHsKLQl1bnNpZ25lZCBsb25nIG5leHRfZGVzY19hZGRyOworCXZvaWQgKm5leHRfZGVzY19hZGRyOwogCXVuc2lnbmVkIGxvbmcgc3RhcnRfYWRkcjsKIAl1bnNpZ25lZCBzaG9ydCBjZmc7CiAJdW5zaWduZWQgc2hvcnQgeF9jb3VudDsKQEAgLTg5LDcgKzYyLDcgQEAKIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKIHN0cnVjdCBkbWFfcmVnaXN0ZXIgewotCXVuc2lnbmVkIGxvbmcgbmV4dF9kZXNjX3B0cjsJLyogRE1BIE5leHQgRGVzY3JpcHRvciBQb2ludGVyIHJlZ2lzdGVyICovCisJdm9pZCAqbmV4dF9kZXNjX3B0cjsJLyogRE1BIE5leHQgRGVzY3JpcHRvciBQb2ludGVyIHJlZ2lzdGVyICovCiAJdW5zaWduZWQgbG9uZyBzdGFydF9hZGRyOwkvKiBETUEgU3RhcnQgYWRkcmVzcyAgcmVnaXN0ZXIgKi8KIAogCXVuc2lnbmVkIHNob3J0IGNmZzsJLyogRE1BIENvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgKi8KQEAgLTEwOSw3ICs4Miw3IEBACiAJc2hvcnQgeV9tb2RpZnk7CS8qIERNQSB5X21vZGlmeSByZWdpc3RlciAqLwogCXVuc2lnbmVkIHNob3J0IGR1bW15NTsKIAotCXVuc2lnbmVkIGxvbmcgY3Vycl9kZXNjX3B0cjsJLyogRE1BIEN1cnJlbnQgRGVzY3JpcHRvciBQb2ludGVyCisJdm9pZCAqY3Vycl9kZXNjX3B0cjsJLyogRE1BIEN1cnJlbnQgRGVzY3JpcHRvciBQb2ludGVyCiAJCQkJCSAgIHJlZ2lzdGVyICovCiAJdW5zaWduZWQgbG9uZyBjdXJyX2FkZHJfcHRyOwkvKiBETUEgQ3VycmVudCBBZGRyZXNzIFBvaW50ZXIKIAkJCQkJCSAgIHJlZ2lzdGVyICovCkBAIC0xMzEsMTkgKzEwNCwxNSBAQAogCiB9OwogCi10eXBlZGVmIGlycXJldHVybl90KCpkbWFfaW50ZXJydXB0X3QpIChpbnQgaXJxLCB2b2lkICpkZXZfaWQpOwotCitzdHJ1Y3QgbXV0ZXg7CiBzdHJ1Y3QgZG1hX2NoYW5uZWwgewogCXN0cnVjdCBtdXRleCBkbWFsb2NrOwotCWNoYXIgKmRldmljZV9pZDsKKwljb25zdCBjaGFyICpkZXZpY2VfaWQ7CiAJZW51bSBkbWFfY2hhbl9zdGF0dXMgY2hhbl9zdGF0dXM7Ci0Jc3RydWN0IGRtYV9yZWdpc3RlciAqcmVnczsKKwl2b2xhdGlsZSBzdHJ1Y3QgZG1hX3JlZ2lzdGVyICpyZWdzOwogCXN0cnVjdCBkbWFzZyAqc2c7CQkvKiBsYXJnZSBtb2RlIGRlc2NyaXB0b3IgKi8KLQl1bnNpZ25lZCBpbnQgY3RybF9udW07CS8qIGNvbnRyb2xsZXIgbnVtYmVyICovCi0JZG1hX2ludGVycnVwdF90IGlycV9jYWxsYmFjazsKKwl1bnNpZ25lZCBpbnQgaXJxOwogCXZvaWQgKmRhdGE7Ci0JdW5zaWduZWQgaW50IGRtYV9lbmFibGVfZmxhZzsKLQl1bnNpZ25lZCBpbnQgbG9vcGJhY2tfZmxhZzsKICNpZmRlZiBDT05GSUdfUE0KIAl1bnNpZ25lZCBzaG9ydCBzYXZlZF9wZXJpcGhlcmFsX21hcDsKICNlbmRpZgpAQCAtMTU3LDQ5ICsxMjYsMTMyIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglETUEgQVBJJ3MKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBmdW5jdGlvbnMgdG8gc2V0IHJlZ2lzdGVyIG1vZGUgKi8KLXZvaWQgc2V0X2RtYV9zdGFydF9hZGRyKHVuc2lnbmVkIGludCBjaGFubmVsLCB1bnNpZ25lZCBsb25nIGFkZHIpOwotdm9pZCBzZXRfZG1hX25leHRfZGVzY19hZGRyKHVuc2lnbmVkIGludCBjaGFubmVsLCB1bnNpZ25lZCBsb25nIGFkZHIpOwotdm9pZCBzZXRfZG1hX2N1cnJfZGVzY19hZGRyKHVuc2lnbmVkIGludCBjaGFubmVsLCB1bnNpZ25lZCBsb25nIGFkZHIpOwotdm9pZCBzZXRfZG1hX3hfY291bnQodW5zaWduZWQgaW50IGNoYW5uZWwsIHVuc2lnbmVkIHNob3J0IHhfY291bnQpOwotdm9pZCBzZXRfZG1hX3hfbW9kaWZ5KHVuc2lnbmVkIGludCBjaGFubmVsLCBzaG9ydCB4X21vZGlmeSk7Ci12b2lkIHNldF9kbWFfeV9jb3VudCh1bnNpZ25lZCBpbnQgY2hhbm5lbCwgdW5zaWduZWQgc2hvcnQgeV9jb3VudCk7Ci12b2lkIHNldF9kbWFfeV9tb2RpZnkodW5zaWduZWQgaW50IGNoYW5uZWwsIHNob3J0IHlfbW9kaWZ5KTsKLXZvaWQgc2V0X2RtYV9jb25maWcodW5zaWduZWQgaW50IGNoYW5uZWwsIHVuc2lnbmVkIHNob3J0IGNvbmZpZyk7Ci11bnNpZ25lZCBzaG9ydCBzZXRfYmZpbl9kbWFfY29uZmlnKGNoYXIgZGlyZWN0aW9uLCBjaGFyIGZsb3dfbW9kZSwKLQkJCQkgICBjaGFyIGludHJfbW9kZSwgY2hhciBkbWFfbW9kZSwgY2hhciB3aWR0aCwKLQkJCQkgICBjaGFyIHN5bmNtb2RlKTsKLXZvaWQgc2V0X2RtYV9jdXJyX2FkZHIodW5zaWduZWQgaW50IGNoYW5uZWwsIHVuc2lnbmVkIGxvbmcgYWRkcik7CitleHRlcm4gc3RydWN0IGRtYV9jaGFubmVsIGRtYV9jaFtNQVhfRE1BX0NIQU5ORUxTXTsKK2V4dGVybiBzdHJ1Y3QgZG1hX3JlZ2lzdGVyICpkbWFfaW9fYmFzZV9hZGRyW01BWF9ETUFfQ0hBTk5FTFNdOworZXh0ZXJuIGludCBjaGFubmVsMmlycSh1bnNpZ25lZCBpbnQgY2hhbm5lbCk7CiAKLS8qIGdldCBjdXJyIHN0YXR1cyBmb3IgcG9sbGluZyAqLwotdW5zaWduZWQgc2hvcnQgZ2V0X2RtYV9jdXJyX2lycXN0YXQodW5zaWduZWQgaW50IGNoYW5uZWwpOwotdW5zaWduZWQgc2hvcnQgZ2V0X2RtYV9jdXJyX3hjb3VudCh1bnNpZ25lZCBpbnQgY2hhbm5lbCk7Ci11bnNpZ25lZCBzaG9ydCBnZXRfZG1hX2N1cnJfeWNvdW50KHVuc2lnbmVkIGludCBjaGFubmVsKTsKLXVuc2lnbmVkIGxvbmcgZ2V0X2RtYV9uZXh0X2Rlc2NfcHRyKHVuc2lnbmVkIGludCBjaGFubmVsKTsKLXVuc2lnbmVkIGxvbmcgZ2V0X2RtYV9jdXJyX2Rlc2NfcHRyKHVuc2lnbmVkIGludCBjaGFubmVsKTsKLXVuc2lnbmVkIGxvbmcgZ2V0X2RtYV9jdXJyX2FkZHIodW5zaWduZWQgaW50IGNoYW5uZWwpOworc3RhdGljIGlubGluZSB2b2lkIHNldF9kbWFfc3RhcnRfYWRkcih1bnNpZ25lZCBpbnQgY2hhbm5lbCwgdW5zaWduZWQgbG9uZyBhZGRyKQoreworCWRtYV9jaFtjaGFubmVsXS5yZWdzLT5zdGFydF9hZGRyID0gYWRkcjsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfZG1hX25leHRfZGVzY19hZGRyKHVuc2lnbmVkIGludCBjaGFubmVsLCB2b2lkICphZGRyKQoreworCWRtYV9jaFtjaGFubmVsXS5yZWdzLT5uZXh0X2Rlc2NfcHRyID0gYWRkcjsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfZG1hX2N1cnJfZGVzY19hZGRyKHVuc2lnbmVkIGludCBjaGFubmVsLCB2b2lkICphZGRyKQoreworCWRtYV9jaFtjaGFubmVsXS5yZWdzLT5jdXJyX2Rlc2NfcHRyID0gYWRkcjsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfZG1hX3hfY291bnQodW5zaWduZWQgaW50IGNoYW5uZWwsIHVuc2lnbmVkIHNob3J0IHhfY291bnQpCit7CisJZG1hX2NoW2NoYW5uZWxdLnJlZ3MtPnhfY291bnQgPSB4X2NvdW50OworfQorc3RhdGljIGlubGluZSB2b2lkIHNldF9kbWFfeV9jb3VudCh1bnNpZ25lZCBpbnQgY2hhbm5lbCwgdW5zaWduZWQgc2hvcnQgeV9jb3VudCkKK3sKKwlkbWFfY2hbY2hhbm5lbF0ucmVncy0+eV9jb3VudCA9IHlfY291bnQ7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X2RtYV94X21vZGlmeSh1bnNpZ25lZCBpbnQgY2hhbm5lbCwgc2hvcnQgeF9tb2RpZnkpCit7CisJZG1hX2NoW2NoYW5uZWxdLnJlZ3MtPnhfbW9kaWZ5ID0geF9tb2RpZnk7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X2RtYV95X21vZGlmeSh1bnNpZ25lZCBpbnQgY2hhbm5lbCwgc2hvcnQgeV9tb2RpZnkpCit7CisJZG1hX2NoW2NoYW5uZWxdLnJlZ3MtPnlfbW9kaWZ5ID0geV9tb2RpZnk7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X2RtYV9jb25maWcodW5zaWduZWQgaW50IGNoYW5uZWwsIHVuc2lnbmVkIHNob3J0IGNvbmZpZykKK3sKKwlkbWFfY2hbY2hhbm5lbF0ucmVncy0+Y2ZnID0gY29uZmlnOworfQorc3RhdGljIGlubGluZSB2b2lkIHNldF9kbWFfY3Vycl9hZGRyKHVuc2lnbmVkIGludCBjaGFubmVsLCB1bnNpZ25lZCBsb25nIGFkZHIpCit7CisJZG1hX2NoW2NoYW5uZWxdLnJlZ3MtPmN1cnJfYWRkcl9wdHIgPSBhZGRyOworfQogCi0vKiBzZXQgbGFyZ2UgRE1BIG1vZGUgZGVzY3JpcHRvciAqLwotdm9pZCBzZXRfZG1hX3NnKHVuc2lnbmVkIGludCBjaGFubmVsLCBzdHJ1Y3QgZG1hc2cgKnNnLCBpbnQgbnJfc2cpOworc3RhdGljIGlubGluZSB1bnNpZ25lZCBzaG9ydAorc2V0X2JmaW5fZG1hX2NvbmZpZyhjaGFyIGRpcmVjdGlvbiwgY2hhciBmbG93X21vZGUsCisJCSAgICBjaGFyIGludHJfbW9kZSwgY2hhciBkbWFfbW9kZSwgY2hhciB3aWR0aCwgY2hhciBzeW5jbW9kZSkKK3sKKwlyZXR1cm4gKGRpcmVjdGlvbiA8PCAxKSB8ICh3aWR0aCA8PCAyKSB8IChkbWFfbW9kZSA8PCA0KSB8CisJCShpbnRyX21vZGUgPDwgNikgfCAoZmxvd19tb2RlIDw8IDEyKSB8IChzeW5jbW9kZSA8PCA1KTsKK30KIAotLyogY2hlY2sgaWYgY3VycmVudCBjaGFubmVsIGlzIGluIHVzZSAqLwotaW50IGRtYV9jaGFubmVsX2FjdGl2ZSh1bnNpZ25lZCBpbnQgY2hhbm5lbCk7CitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIHNob3J0IGdldF9kbWFfY3Vycl9pcnFzdGF0KHVuc2lnbmVkIGludCBjaGFubmVsKQoreworCXJldHVybiBkbWFfY2hbY2hhbm5lbF0ucmVncy0+aXJxX3N0YXR1czsKK30KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgc2hvcnQgZ2V0X2RtYV9jdXJyX3hjb3VudCh1bnNpZ25lZCBpbnQgY2hhbm5lbCkKK3sKKwlyZXR1cm4gZG1hX2NoW2NoYW5uZWxdLnJlZ3MtPmN1cnJfeF9jb3VudDsKK30KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgc2hvcnQgZ2V0X2RtYV9jdXJyX3ljb3VudCh1bnNpZ25lZCBpbnQgY2hhbm5lbCkKK3sKKwlyZXR1cm4gZG1hX2NoW2NoYW5uZWxdLnJlZ3MtPmN1cnJfeV9jb3VudDsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCAqZ2V0X2RtYV9uZXh0X2Rlc2NfcHRyKHVuc2lnbmVkIGludCBjaGFubmVsKQoreworCXJldHVybiBkbWFfY2hbY2hhbm5lbF0ucmVncy0+bmV4dF9kZXNjX3B0cjsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCAqZ2V0X2RtYV9jdXJyX2Rlc2NfcHRyKHVuc2lnbmVkIGludCBjaGFubmVsKQoreworCXJldHVybiBkbWFfY2hbY2hhbm5lbF0ucmVncy0+Y3Vycl9kZXNjX3B0cjsKK30KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgc2hvcnQgZ2V0X2RtYV9jb25maWcodW5zaWduZWQgaW50IGNoYW5uZWwpCit7CisJcmV0dXJuIGRtYV9jaFtjaGFubmVsXS5yZWdzLT5jZmc7Cit9CitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgZ2V0X2RtYV9jdXJyX2FkZHIodW5zaWduZWQgaW50IGNoYW5uZWwpCit7CisJcmV0dXJuIGRtYV9jaFtjaGFubmVsXS5yZWdzLT5jdXJyX2FkZHJfcHRyOworfQogCi0vKiBjb21tb24gZnVuY3Rpb25zIG11c3QgYmUgY2FsbGVkIGluIGFueSBtb2RlICovCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X2RtYV9zZyh1bnNpZ25lZCBpbnQgY2hhbm5lbCwgc3RydWN0IGRtYXNnICpzZywgaW50IG5kc2l6ZSkKK3sKKwlkbWFfY2hbY2hhbm5lbF0ucmVncy0+Y2ZnID0KKwkJKGRtYV9jaFtjaGFubmVsXS5yZWdzLT5jZmcgJiB+KDB4ZiA8PCA4KSkgfAorCQkoKG5kc2l6ZSAmIDB4ZikgPDwgOCk7CisJZG1hX2NoW2NoYW5uZWxdLnJlZ3MtPm5leHRfZGVzY19wdHIgPSBzZzsKK30KKworc3RhdGljIGlubGluZSBpbnQgZG1hX2NoYW5uZWxfYWN0aXZlKHVuc2lnbmVkIGludCBjaGFubmVsKQoreworCWlmIChkbWFfY2hbY2hhbm5lbF0uY2hhbl9zdGF0dXMgPT0gRE1BX0NIQU5ORUxfRlJFRSkKKwkJcmV0dXJuIDA7CisJZWxzZQorCQlyZXR1cm4gMTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGRpc2FibGVfZG1hKHVuc2lnbmVkIGludCBjaGFubmVsKQoreworCWRtYV9jaFtjaGFubmVsXS5yZWdzLT5jZmcgJj0gfkRNQUVOOworCVNTWU5DKCk7CisJZG1hX2NoW2NoYW5uZWxdLmNoYW5fc3RhdHVzID0gRE1BX0NIQU5ORUxfUkVRVUVTVEVEOworfQorc3RhdGljIGlubGluZSB2b2lkIGVuYWJsZV9kbWEodW5zaWduZWQgaW50IGNoYW5uZWwpCit7CisJZG1hX2NoW2NoYW5uZWxdLnJlZ3MtPmN1cnJfeF9jb3VudCA9IDA7CisJZG1hX2NoW2NoYW5uZWxdLnJlZ3MtPmN1cnJfeV9jb3VudCA9IDA7CisJZG1hX2NoW2NoYW5uZWxdLnJlZ3MtPmNmZyB8PSBETUFFTjsKKwlkbWFfY2hbY2hhbm5lbF0uY2hhbl9zdGF0dXMgPSBETUFfQ0hBTk5FTF9FTkFCTEVEOworfQogdm9pZCBmcmVlX2RtYSh1bnNpZ25lZCBpbnQgY2hhbm5lbCk7Ci1pbnQgZG1hX2NoYW5uZWxfYWN0aXZlKHVuc2lnbmVkIGludCBjaGFubmVsKTsgLyogY2hlY2sgaWYgYSBjaGFubmVsIGlzIGluIHVzZSAqLwotdm9pZCBkaXNhYmxlX2RtYSh1bnNpZ25lZCBpbnQgY2hhbm5lbCk7Ci12b2lkIGVuYWJsZV9kbWEodW5zaWduZWQgaW50IGNoYW5uZWwpOwotaW50IHJlcXVlc3RfZG1hKHVuc2lnbmVkIGludCBjaGFubmVsLCBjaGFyICpkZXZpY2VfaWQpOwotaW50IHNldF9kbWFfY2FsbGJhY2sodW5zaWduZWQgaW50IGNoYW5uZWwsIGRtYV9pbnRlcnJ1cHRfdCBjYWxsYmFjaywKLQkJICAgICB2b2lkICpkYXRhKTsKLXZvaWQgZG1hX2Rpc2FibGVfaXJxKHVuc2lnbmVkIGludCBjaGFubmVsKTsKLXZvaWQgZG1hX2VuYWJsZV9pcnEodW5zaWduZWQgaW50IGNoYW5uZWwpOwotdm9pZCBjbGVhcl9kbWFfaXJxc3RhdCh1bnNpZ25lZCBpbnQgY2hhbm5lbCk7CitpbnQgcmVxdWVzdF9kbWEodW5zaWduZWQgaW50IGNoYW5uZWwsIGNvbnN0IGNoYXIgKmRldmljZV9pZCk7CitpbnQgc2V0X2RtYV9jYWxsYmFjayh1bnNpZ25lZCBpbnQgY2hhbm5lbCwgaXJxX2hhbmRsZXJfdCBjYWxsYmFjaywgdm9pZCAqZGF0YSk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkbWFfZGlzYWJsZV9pcnEodW5zaWduZWQgaW50IGNoYW5uZWwpCit7CisJZGlzYWJsZV9pcnEoZG1hX2NoW2NoYW5uZWxdLmlycSk7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgZG1hX2VuYWJsZV9pcnEodW5zaWduZWQgaW50IGNoYW5uZWwpCit7CisJZW5hYmxlX2lycShkbWFfY2hbY2hhbm5lbF0uaXJxKTsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCBjbGVhcl9kbWFfaXJxc3RhdCh1bnNpZ25lZCBpbnQgY2hhbm5lbCkKK3sKKwlkbWFfY2hbY2hhbm5lbF0ucmVncy0+aXJxX3N0YXR1cyA9IERNQV9ET05FIHwgRE1BX0VSUjsKK30KKwogdm9pZCAqZG1hX21lbWNweSh2b2lkICpkZXN0LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBjb3VudCk7CiB2b2lkICpzYWZlX2RtYV9tZW1jcHkodm9pZCAqZGVzdCwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3QgY291bnQpOwotCi1leHRlcm4gaW50IGNoYW5uZWwyaXJxKHVuc2lnbmVkIGludCBjaGFubmVsKTsKLWV4dGVybiBzdHJ1Y3QgZG1hX3JlZ2lzdGVyICpkbWFfaW9fYmFzZV9hZGRyW01BWF9CTEFDS0ZJTl9ETUFfQ0hBTk5FTF07Cit2b2lkIGJsYWNrZmluX2RtYV9lYXJseV9pbml0KHZvaWQpOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vZW50cnkuaCBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vZW50cnkuaAppbmRleCBjNGY3MjFlLi5iMzBhMjk2IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2VudHJ5LmgKKysrIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9lbnRyeS5oCkBAIC0yNyw2ICsyNywxNCBAQAogI2RlZmluZSBTQVZFX0FMTF9TWVMJCXNhdmVfY29udGV4dF9ub19pbnRlcnJ1cHRzCiAvKiBUaGlzIGlzIHVzZWQgZm9yIGFsbCBub3JtYWwgaW50ZXJydXB0cy4gIEl0IHNhdmVzIGEgbWluaW11bSBvZiByZWdpc3RlcnMKICAgIHRvIHRoZSBzdGFjaywgbG9hZHMgdGhlIElSUSBudW1iZXIsIGFuZCBqdW1wcyB0byBjb21tb24gY29kZS4gICovCisjaWZkZWYgQ09ORklHX0lQSVBFCisjIGRlZmluZSBMT0FEX0lQSVBFX0lQRU5EIFwKKwlQMC5sID0gbG8oSVBFTkQpOyBcCisJUDAuaCA9IGhpKElQRU5EKTsgXAorCVIxID0gW1AwXTsKKyNlbHNlCisjIGRlZmluZSBMT0FEX0lQSVBFX0lQRU5ECisjZW5kaWYKICNkZWZpbmUgSU5URVJSVVBUX0VOVFJZKE4pCQkJCQkJXAogICAgIFstLXNwXSA9IFNZU0NGRzsJCQkJCQkJXAogCQkJCQkJCQkJXApAQCAtMzQsNiArNDIsNyBAQAogICAgIFstLXNwXSA9IFIwOwkvKm9yaWdfcjAqLwkJCQkJXAogICAgIFstLXNwXSA9IChSNzowLFA1OjApOwkJCQkJCVwKICAgICBSMCA9IChOKTsJCQkJCQkJCVwKKyAgICBMT0FEX0lQSVBFX0lQRU5ECQkJCQkJCVwKICAgICBqdW1wIF9fY29tbW9uX2ludF9lbnRyeTsKIAogLyogRm9yIHRpbWVyIGludGVycnVwdHMsIHdlIG5lZWQgdG8gc2F2ZSBJUEVORCwgc2luY2UgdGhlIHVzZXJfbW9kZQpAQCAtNTMsOSArNjIsMTEgQEAKIC8qIFRoaXMgb25lIHB1c2hlcyBSRVRJIHdpdGhvdXQgdXNpbmcgQ0xJLiAgSW50ZXJydXB0cyBhcmUgZW5hYmxlZC4gICovCiAjZGVmaW5lIFNBVkVfQ09OVEVYVF9TWVNDQUxMCXNhdmVfY29udGV4dF9zeXNjYWxsCiAjZGVmaW5lIFNBVkVfQ09OVEVYVAkJc2F2ZV9jb250ZXh0X3dpdGhfaW50ZXJydXB0cworI2RlZmluZSBTQVZFX0NPTlRFWFRfQ1BMQglzYXZlX2NvbnRleHRfY3BsYgogCiAjZGVmaW5lIFJFU1RPUkVfQUxMX1NZUwkJcmVzdG9yZV9jb250ZXh0X25vX2ludGVycnVwdHMKICNkZWZpbmUgUkVTVE9SRV9DT05URVhUCQlyZXN0b3JlX2NvbnRleHRfd2l0aF9pbnRlcnJ1cHRzCisjZGVmaW5lIFJFU1RPUkVfQ09OVEVYVF9DUExCCXJlc3RvcmVfY29udGV4dF9jcGxiCiAKICNlbmRpZgkJCQkvKiBfX0FTU0VNQkxZX18gKi8KICNlbmRpZgkJCQkvKiBfX0JGSU5fRU5UUllfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9ncGlvLmggYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2dwaW8uaAppbmRleCBhZDMzYWMyLi45NDc3ZDgyIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2dwaW8uaAorKysgYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2dwaW8uaApAQCAtODQsMTEgKzg0LDE0IEBACiAjaWZuZGVmIF9fQVJDSF9CTEFDS0ZJTl9HUElPX0hfXwogI2RlZmluZSBfX0FSQ0hfQkxBQ0tGSU5fR1BJT19IX18KIAotI2RlZmluZSBncGlvX2JhbmsoeCkgKCh4KSA+PiA0KQotI2RlZmluZSBncGlvX2JpdCh4KSAgKDE8PCgoeCkgJiAweEYpKQotI2RlZmluZSBncGlvX3N1Yl9uKHgpICgoeCkgJiAweEYpCisjZGVmaW5lIGdwaW9fYmFuayh4KSAJKCh4KSA+PiA0KQorI2RlZmluZSBncGlvX2JpdCh4KSAgCSgxPDwoKHgpICYgMHhGKSkKKyNkZWZpbmUgZ3Bpb19zdWJfbih4KSAJKCh4KSAmIDB4RikKIAotI2RlZmluZSBHUElPX0JBTktTSVpFIDE2CisjZGVmaW5lIEdQSU9fQkFOS1NJWkUgCTE2CisjZGVmaW5lIEdQSU9fQkFOS19OVU0gCURJVl9ST1VORF9VUChNQVhfQkxBQ0tGSU5fR1BJT1MsIEdQSU9fQkFOS1NJWkUpCisKKyNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KIAogI2RlZmluZQlHUElPXzAJMAogI2RlZmluZQlHUElPXzEJMQpAQCAtMTM5LDE1MSArMTQyLDkgQEAKICNkZWZpbmUJR1BJT180Ngk0NgogI2RlZmluZQlHUElPXzQ3CTQ3CiAKLQogI2RlZmluZSBQRVJJUEhFUkFMX1VTQUdFIDEKICNkZWZpbmUgR1BJT19VU0FHRSAwCiAKLSNpZmRlZiBCRjUzM19GQU1JTFkKLSNkZWZpbmUgTUFYX0JMQUNLRklOX0dQSU9TIDE2Ci0KLSNkZWZpbmUJR1BJT19QRjAJMAotI2RlZmluZQlHUElPX1BGMQkxCi0jZGVmaW5lCUdQSU9fUEYyCTIKLSNkZWZpbmUJR1BJT19QRjMJMwotI2RlZmluZQlHUElPX1BGNAk0Ci0jZGVmaW5lCUdQSU9fUEY1CTUKLSNkZWZpbmUJR1BJT19QRjYJNgotI2RlZmluZQlHUElPX1BGNwk3Ci0jZGVmaW5lCUdQSU9fUEY4CTgKLSNkZWZpbmUJR1BJT19QRjkJOQotI2RlZmluZQlHUElPX1BGMTAJMTAKLSNkZWZpbmUJR1BJT19QRjExCTExCi0jZGVmaW5lCUdQSU9fUEYxMgkxMgotI2RlZmluZQlHUElPX1BGMTMJMTMKLSNkZWZpbmUJR1BJT19QRjE0CTE0Ci0jZGVmaW5lCUdQSU9fUEYxNQkxNQotCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoQkY1MjdfRkFNSUxZKSB8fCBkZWZpbmVkKEJGNTM3X0ZBTUlMWSkKLSNkZWZpbmUgTUFYX0JMQUNLRklOX0dQSU9TIDQ4Ci0KLSNkZWZpbmUJR1BJT19QRjAJMAotI2RlZmluZQlHUElPX1BGMQkxCi0jZGVmaW5lCUdQSU9fUEYyCTIKLSNkZWZpbmUJR1BJT19QRjMJMwotI2RlZmluZQlHUElPX1BGNAk0Ci0jZGVmaW5lCUdQSU9fUEY1CTUKLSNkZWZpbmUJR1BJT19QRjYJNgotI2RlZmluZQlHUElPX1BGNwk3Ci0jZGVmaW5lCUdQSU9fUEY4CTgKLSNkZWZpbmUJR1BJT19QRjkJOQotI2RlZmluZQlHUElPX1BGMTAJMTAKLSNkZWZpbmUJR1BJT19QRjExCTExCi0jZGVmaW5lCUdQSU9fUEYxMgkxMgotI2RlZmluZQlHUElPX1BGMTMJMTMKLSNkZWZpbmUJR1BJT19QRjE0CTE0Ci0jZGVmaW5lCUdQSU9fUEYxNQkxNQotI2RlZmluZQlHUElPX1BHMAkxNgotI2RlZmluZQlHUElPX1BHMQkxNwotI2RlZmluZQlHUElPX1BHMgkxOAotI2RlZmluZQlHUElPX1BHMwkxOQotI2RlZmluZQlHUElPX1BHNAkyMAotI2RlZmluZQlHUElPX1BHNQkyMQotI2RlZmluZQlHUElPX1BHNgkyMgotI2RlZmluZQlHUElPX1BHNwkyMwotI2RlZmluZQlHUElPX1BHOAkyNAotI2RlZmluZQlHUElPX1BHOQkyNQotI2RlZmluZQlHUElPX1BHMTAgICAgICAJMjYKLSNkZWZpbmUJR1BJT19QRzExICAgICAgCTI3Ci0jZGVmaW5lCUdQSU9fUEcxMiAgICAgIAkyOAotI2RlZmluZQlHUElPX1BHMTMgICAgICAJMjkKLSNkZWZpbmUJR1BJT19QRzE0ICAgICAgCTMwCi0jZGVmaW5lCUdQSU9fUEcxNSAgICAgIAkzMQotI2RlZmluZQlHUElPX1BIMAkzMgotI2RlZmluZQlHUElPX1BIMQkzMwotI2RlZmluZQlHUElPX1BIMgkzNAotI2RlZmluZQlHUElPX1BIMwkzNQotI2RlZmluZQlHUElPX1BINAkzNgotI2RlZmluZQlHUElPX1BINQkzNwotI2RlZmluZQlHUElPX1BINgkzOAotI2RlZmluZQlHUElPX1BINwkzOQotI2RlZmluZQlHUElPX1BIOAk0MAotI2RlZmluZQlHUElPX1BIOQk0MQotI2RlZmluZQlHUElPX1BIMTAgICAgICAJNDIKLSNkZWZpbmUJR1BJT19QSDExICAgICAgCTQzCi0jZGVmaW5lCUdQSU9fUEgxMiAgICAgIAk0NAotI2RlZmluZQlHUElPX1BIMTMgICAgICAJNDUKLSNkZWZpbmUJR1BJT19QSDE0ICAgICAgCTQ2Ci0jZGVmaW5lCUdQSU9fUEgxNSAgICAgIAk0NwotCi0jZGVmaW5lIFBPUlRfRiBHUElPX1BGMAotI2RlZmluZSBQT1JUX0cgR1BJT19QRzAKLSNkZWZpbmUgUE9SVF9IIEdQSU9fUEgwCi0KLSNlbmRpZgotCi0jaWZkZWYgQkY1NDhfRkFNSUxZCi0jaW5jbHVkZSA8bWFjaC9ncGlvLmg+Ci0jZW5kaWYKLQotI2lmZGVmIEJGNTYxX0ZBTUlMWQotI2RlZmluZSBNQVhfQkxBQ0tGSU5fR1BJT1MgNDgKLQotI2RlZmluZQlHUElPX1BGMAkwCi0jZGVmaW5lCUdQSU9fUEYxCTEKLSNkZWZpbmUJR1BJT19QRjIJMgotI2RlZmluZQlHUElPX1BGMwkzCi0jZGVmaW5lCUdQSU9fUEY0CTQKLSNkZWZpbmUJR1BJT19QRjUJNQotI2RlZmluZQlHUElPX1BGNgk2Ci0jZGVmaW5lCUdQSU9fUEY3CTcKLSNkZWZpbmUJR1BJT19QRjgJOAotI2RlZmluZQlHUElPX1BGOQk5Ci0jZGVmaW5lCUdQSU9fUEYxMAkxMAotI2RlZmluZQlHUElPX1BGMTEJMTEKLSNkZWZpbmUJR1BJT19QRjEyCTEyCi0jZGVmaW5lCUdQSU9fUEYxMwkxMwotI2RlZmluZQlHUElPX1BGMTQJMTQKLSNkZWZpbmUJR1BJT19QRjE1CTE1Ci0jZGVmaW5lCUdQSU9fUEYxNgkxNgotI2RlZmluZQlHUElPX1BGMTcJMTcKLSNkZWZpbmUJR1BJT19QRjE4CTE4Ci0jZGVmaW5lCUdQSU9fUEYxOQkxOQotI2RlZmluZQlHUElPX1BGMjAJMjAKLSNkZWZpbmUJR1BJT19QRjIxCTIxCi0jZGVmaW5lCUdQSU9fUEYyMgkyMgotI2RlZmluZQlHUElPX1BGMjMJMjMKLSNkZWZpbmUJR1BJT19QRjI0CTI0Ci0jZGVmaW5lCUdQSU9fUEYyNQkyNQotI2RlZmluZQlHUElPX1BGMjYJMjYKLSNkZWZpbmUJR1BJT19QRjI3CTI3Ci0jZGVmaW5lCUdQSU9fUEYyOAkyOAotI2RlZmluZQlHUElPX1BGMjkJMjkKLSNkZWZpbmUJR1BJT19QRjMwCTMwCi0jZGVmaW5lCUdQSU9fUEYzMQkzMQotI2RlZmluZQlHUElPX1BGMzIJMzIKLSNkZWZpbmUJR1BJT19QRjMzCTMzCi0jZGVmaW5lCUdQSU9fUEYzNAkzNAotI2RlZmluZQlHUElPX1BGMzUJMzUKLSNkZWZpbmUJR1BJT19QRjM2CTM2Ci0jZGVmaW5lCUdQSU9fUEYzNwkzNwotI2RlZmluZQlHUElPX1BGMzgJMzgKLSNkZWZpbmUJR1BJT19QRjM5CTM5Ci0jZGVmaW5lCUdQSU9fUEY0MAk0MAotI2RlZmluZQlHUElPX1BGNDEJNDEKLSNkZWZpbmUJR1BJT19QRjQyCTQyCi0jZGVmaW5lCUdQSU9fUEY0Mwk0MwotI2RlZmluZQlHUElPX1BGNDQJNDQKLSNkZWZpbmUJR1BJT19QRjQ1CTQ1Ci0jZGVmaW5lCUdQSU9fUEY0Ngk0NgotI2RlZmluZQlHUElPX1BGNDcJNDcKLQotI2RlZmluZSBQT1JUX0ZJTzAgR1BJT18wCi0jZGVmaW5lIFBPUlRfRklPMSBHUElPXzE2Ci0jZGVmaW5lIFBPUlRfRklPMiBHUElPXzMyCi0jZW5kaWYKLQogI2lmbmRlZiBfX0FTU0VNQkxZX18KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC00MjUsMjAgKzI4Niw3NyBAQAogKiBNT0RJRklDQVRJT04gSElTVE9SWSA6CiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotaW50IGdwaW9fcmVxdWVzdCh1bnNpZ25lZCwgY29uc3QgY2hhciAqKTsKLXZvaWQgZ3Bpb19mcmVlKHVuc2lnbmVkKTsKLQotdm9pZCBncGlvX3NldF92YWx1ZSh1bnNpZ25lZCBncGlvLCBpbnQgYXJnKTsKLWludCBncGlvX2dldF92YWx1ZSh1bnNpZ25lZCBncGlvKTsKK2ludCBiZmluX2dwaW9fcmVxdWVzdCh1bnNpZ25lZCBncGlvLCBjb25zdCBjaGFyICpsYWJlbCk7Cit2b2lkIGJmaW5fZ3Bpb19mcmVlKHVuc2lnbmVkIGdwaW8pOworaW50IGJmaW5fZ3Bpb19pcnFfcmVxdWVzdCh1bnNpZ25lZCBncGlvLCBjb25zdCBjaGFyICpsYWJlbCk7Cit2b2lkIGJmaW5fZ3Bpb19pcnFfZnJlZSh1bnNpZ25lZCBncGlvKTsKK2ludCBiZmluX2dwaW9fZGlyZWN0aW9uX2lucHV0KHVuc2lnbmVkIGdwaW8pOworaW50IGJmaW5fZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KHVuc2lnbmVkIGdwaW8sIGludCB2YWx1ZSk7CitpbnQgYmZpbl9ncGlvX2dldF92YWx1ZSh1bnNpZ25lZCBncGlvKTsKK3ZvaWQgYmZpbl9ncGlvX3NldF92YWx1ZSh1bnNpZ25lZCBncGlvLCBpbnQgdmFsdWUpOwogCiAjaWZuZGVmIEJGNTQ4X0ZBTUlMWQotI2RlZmluZSBncGlvX3NldF92YWx1ZShncGlvLCB2YWx1ZSkJc2V0X2dwaW9fZGF0YShncGlvLCB2YWx1ZSkKKyNkZWZpbmUgYmZpbl9ncGlvX3NldF92YWx1ZShncGlvLCB2YWx1ZSkgICAgc2V0X2dwaW9fZGF0YShncGlvLCB2YWx1ZSkKICNlbmRpZgogCi1pbnQgZ3Bpb19kaXJlY3Rpb25faW5wdXQodW5zaWduZWQgZ3Bpbyk7Ci1pbnQgZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KHVuc2lnbmVkIGdwaW8sIGludCB2YWx1ZSk7CisjaWZkZWYgQ09ORklHX0dQSU9MSUIKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9ncGlvLmg+CQkvKiBjYW5zbGVlcCB3cmFwcGVycyAqLworCitzdGF0aWMgaW5saW5lIGludCBncGlvX2dldF92YWx1ZSh1bnNpZ25lZCBpbnQgZ3BpbykKK3sKKwlpZiAoZ3BpbyA8IE1BWF9CTEFDS0ZJTl9HUElPUykKKwkJcmV0dXJuIGJmaW5fZ3Bpb19nZXRfdmFsdWUoZ3Bpbyk7CisJZWxzZQorCQlyZXR1cm4gX19ncGlvX2dldF92YWx1ZShncGlvKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGdwaW9fc2V0X3ZhbHVlKHVuc2lnbmVkIGludCBncGlvLCBpbnQgdmFsdWUpCit7CisJaWYgKGdwaW8gPCBNQVhfQkxBQ0tGSU5fR1BJT1MpCisJCWJmaW5fZ3Bpb19zZXRfdmFsdWUoZ3BpbywgdmFsdWUpOworCWVsc2UKKwkJX19ncGlvX3NldF92YWx1ZShncGlvLCB2YWx1ZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGdwaW9fY2Fuc2xlZXAodW5zaWduZWQgaW50IGdwaW8pCit7CisJcmV0dXJuIF9fZ3Bpb19jYW5zbGVlcChncGlvKTsKK30KKworI2Vsc2UgLyogIUNPTkZJR19HUElPTElCICovCisKK3N0YXRpYyBpbmxpbmUgaW50IGdwaW9fcmVxdWVzdCh1bnNpZ25lZCBncGlvLCBjb25zdCBjaGFyICpsYWJlbCkKK3sKKwlyZXR1cm4gYmZpbl9ncGlvX3JlcXVlc3QoZ3BpbywgbGFiZWwpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZ3Bpb19mcmVlKHVuc2lnbmVkIGdwaW8pCit7CisJcmV0dXJuIGJmaW5fZ3Bpb19mcmVlKGdwaW8pOworfQorCitzdGF0aWMgaW5saW5lIGludCBncGlvX2RpcmVjdGlvbl9pbnB1dCh1bnNpZ25lZCBncGlvKQoreworCXJldHVybiBiZmluX2dwaW9fZGlyZWN0aW9uX2lucHV0KGdwaW8pOworfQorCitzdGF0aWMgaW5saW5lIGludCBncGlvX2RpcmVjdGlvbl9vdXRwdXQodW5zaWduZWQgZ3BpbywgaW50IHZhbHVlKQoreworCXJldHVybiBiZmluX2dwaW9fZGlyZWN0aW9uX291dHB1dChncGlvLCB2YWx1ZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGdwaW9fZ2V0X3ZhbHVlKHVuc2lnbmVkIGdwaW8pCit7CisJcmV0dXJuIGJmaW5fZ3Bpb19nZXRfdmFsdWUoZ3Bpbyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBncGlvX3NldF92YWx1ZSh1bnNpZ25lZCBncGlvLCBpbnQgdmFsdWUpCit7CisJcmV0dXJuIGJmaW5fZ3Bpb19zZXRfdmFsdWUoZ3BpbywgdmFsdWUpOworfQogCiAjaW5jbHVkZSA8YXNtLWdlbmVyaWMvZ3Bpby5oPgkJLyogY2Fuc2xlZXAgd3JhcHBlcnMgKi8KKyNlbmRpZgkvKiAhQ09ORklHX0dQSU9MSUIgKi8KICNpbmNsdWRlIDxhc20vaXJxLmg+CiAKIHN0YXRpYyBpbmxpbmUgaW50IGdwaW9fdG9faXJxKHVuc2lnbmVkIGdwaW8pCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2hhcmRpcnEuaCBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vaGFyZGlycS5oCmluZGV4IGI2YjE5ZjEuLjcxNzE4MWEgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vaGFyZGlycS5oCisrKyBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vaGFyZGlycS5oCkBAIC00Miw0ICs0Miw2IEBACiAKICNkZWZpbmUgX19BUkNIX0lSUV9FWElUX0lSUVNfRElTQUJMRUQJMQogCitleHRlcm4gdm9pZCBhY2tfYmFkX2lycSh1bnNpZ25lZCBpbnQgaXJxKTsKKwogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2lvLmggYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2lvLmgKaW5kZXggN2RjNzdhMi4uNjNiMmQ4YyAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9pby5oCisrKyBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vaW8uaApAQCAtOTQsMTIgKzk0LDEyIEBACiAjZGVmaW5lIG91dHdfcCh4LGFkZHIpIG91dHcoeCxhZGRyKQogI2RlZmluZSBvdXRsX3AoeCxhZGRyKSBvdXRsKHgsYWRkcikKIAotI2RlZmluZSBpb3JlYWQ4X3JlcChhLGQsYykJaW5zYihhLGQsYykKLSNkZWZpbmUgaW9yZWFkMTZfcmVwKGEsZCxjKQlpbnN3KGEsZCxjKQotI2RlZmluZSBpb3JlYWQzMl9yZXAoYSxkLGMpCWluc2woYSxkLGMpCi0jZGVmaW5lIGlvd3JpdGU4X3JlcChhLHMsYykJb3V0c2IoYSxzLGMpCi0jZGVmaW5lIGlvd3JpdGUxNl9yZXAoYSxzLGMpCW91dHN3KGEscyxjKQotI2RlZmluZSBpb3dyaXRlMzJfcmVwKGEscyxjKQlvdXRzbChhLHMsYykKKyNkZWZpbmUgaW9yZWFkOF9yZXAoYSxkLGMpCXJlYWRzYihhLGQsYykKKyNkZWZpbmUgaW9yZWFkMTZfcmVwKGEsZCxjKQlyZWFkc3coYSxkLGMpCisjZGVmaW5lIGlvcmVhZDMyX3JlcChhLGQsYykJcmVhZHNsKGEsZCxjKQorI2RlZmluZSBpb3dyaXRlOF9yZXAoYSxzLGMpCXdyaXRlc2IoYSxzLGMpCisjZGVmaW5lIGlvd3JpdGUxNl9yZXAoYSxzLGMpCXdyaXRlc3coYSxzLGMpCisjZGVmaW5lIGlvd3JpdGUzMl9yZXAoYSxzLGMpCXdyaXRlc2woYSxzLGMpCiAKICNkZWZpbmUgaW9yZWFkOChYKQkJCXJlYWRiKFgpCiAjZGVmaW5lIGlvcmVhZDE2KFgpCQkJcmVhZHcoWCkKQEAgLTEwOCw2ICsxMDgsOCBAQAogI2RlZmluZSBpb3dyaXRlMTYodmFsLFgpCQl3cml0ZXcodmFsLFgpCiAjZGVmaW5lIGlvd3JpdGUzMih2YWwsWCkJCXdyaXRlbCh2YWwsWCkKIAorI2RlZmluZSBtbWlvd2IoKSB3bWIoKQorCiAjZGVmaW5lIElPX1NQQUNFX0xJTUlUIDB4ZmZmZmZmZmYKIAogLyogVmFsdWVzIGZvciBub2NhY2hlZmxhZyBhbmQgY21vZGUgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vaXBpcGUuaCBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vaXBpcGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NmY1M2Q4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9pcGlwZS5oCkBAIC0wLDAgKzEsMjc4IEBACisvKiAgIC0qLSBsaW51eC1jIC0qLQorICogICBpbmNsdWRlL2FzbS1ibGFja2Zpbi9pcGlwZS5oCisgKgorICogICBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNyBQaGlsaXBwZSBHZXJ1bS4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlIE1BIDAyMTM5LAorICogICBVU0E7IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisgKiAgIHZlcnNpb24uCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fQVNNX0JMQUNLRklOX0lQSVBFX0gKKyNkZWZpbmUgX19BU01fQkxBQ0tGSU5fSVBJUEVfSAorCisjaWZkZWYgQ09ORklHX0lQSVBFCisKKyNpbmNsdWRlIDxsaW51eC9jcHVtYXNrLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L3RocmVhZHMuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9pcGlwZV9wZXJjcHUuaD4KKyNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9iaXRvcHMuaD4KKyNpbmNsdWRlIDxhc20vYXRvbWljLmg+CisjaW5jbHVkZSA8YXNtL3RyYXBzLmg+CisKKyNkZWZpbmUgSVBJUEVfQVJDSF9TVFJJTkcgICAgICIxLjgtMDAiCisjZGVmaW5lIElQSVBFX01BSk9SX05VTUJFUiAgICAxCisjZGVmaW5lIElQSVBFX01JTk9SX05VTUJFUiAgICA4CisjZGVmaW5lIElQSVBFX1BBVENIX05VTUJFUiAgICAwCisKKyNpZmRlZiBDT05GSUdfU01QCisjZXJyb3IgIkktcGlwZS9ibGFja2ZpbjogU01QIG5vdCBpbXBsZW1lbnRlZCIKKyNlbHNlIC8qICFDT05GSUdfU01QICovCisjZGVmaW5lIGlwaXBlX3Byb2Nlc3Nvcl9pZCgpCTAKKyNlbmRpZgkvKiBDT05GSUdfU01QICovCisKKyNkZWZpbmUgcHJlcGFyZV9hcmNoX3N3aXRjaChuZXh0KQkJXAorZG8gewkJCQkJCVwKKwlpcGlwZV9zY2hlZHVsZV9ub3RpZnkoY3VycmVudCwgbmV4dCk7CVwKKwlsb2NhbF9pcnFfZGlzYWJsZV9odygpOwkJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgdGFza19oaWphY2tlZChwKQkJCQkJCVwKKwkoewkJCQkJCQkJXAorCQlpbnQgX194X18gPSBpcGlwZV9jdXJyZW50X2RvbWFpbiAhPSBpcGlwZV9yb290X2RvbWFpbjsJXAorCQkvKiBXZSB3b3VsZCBuZWVkIHRvIGNsZWFyIHRoZSBTWU5DIGZsYWcgZm9yIHRoZSByb290IGRvbWFpbiAqLyBcCisJCS8qIG92ZXIgdGhlIGN1cnJlbnQgcHJvY2Vzc29yIGluIFNNUCBtb2RlLiAqLwkJXAorCQlsb2NhbF9pcnFfZW5hYmxlX2h3KCk7IF9feF9fOwkJCQlcCisJfSkKKworc3RydWN0IGlwaXBlX2RvbWFpbjsKKworc3RydWN0IGlwaXBlX3N5c2luZm8geworCisJaW50IG5jcHVzOwkJLyogTnVtYmVyIG9mIENQVXMgb24gYm9hcmQgKi8KKwl1NjQgY3B1ZnJlcTsJCS8qIENQVSBmcmVxdWVuY3kgKGluIEh6KSAqLworCisJLyogQXJjaC1kZXBlbmRlbnQgYmxvY2sgKi8KKworCXN0cnVjdCB7CisJCXVuc2lnbmVkIHRtaXJxOwkvKiBUaW1lciB0aWNrIElSUSAqLworCQl1NjQgdG1mcmVxOwkvKiBUaW1lciBmcmVxdWVuY3kgKi8KKwl9IGFyY2hkZXA7Cit9OworCisjZGVmaW5lIGlwaXBlX3JlYWRfdHNjKHQpCQkJCQlcCisJKHsJCQkJCQkJXAorCXVuc2lnbmVkIGxvbmcgX19jeTI7CQkJCQlcCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCIxOiAlMCA9IENZQ0xFUzJcbiIJCVwKKwkJCQkiJTEgPSBDWUNMRVNcbiIJCQlcCisJCQkJIiUyID0gQ1lDTEVTMlxuIgkJXAorCQkJCSJDQyA9ICUyID09ICUwXG4iCQlcCisJCQkJImlmICEgQ0MganVtcCAxYlxuIgkJXAorCQkJCTogIj1yIiAoKCh1bnNpZ25lZCBsb25nICopJnQpWzFdKSwJXAorCQkJCSAgIj1yIiAoKCh1bnNpZ25lZCBsb25nICopJnQpWzBdKSwJXAorCQkJCSAgIj1yIiAoX19jeTIpCQkJCVwKKwkJCQk6IC8qbm8gaW5wdXQqLyA6ICJDQyIpOwkJCVwKKwl0OwkJCQkJCQkJXAorCX0pCisKKyNkZWZpbmUgaXBpcGVfY3B1X2ZyZXEoKQlfX2lwaXBlX2NvcmVfY2xvY2sKKyNkZWZpbmUgaXBpcGVfdHNjMm5zKF90KQkoKCh1bnNpZ25lZCBsb25nKShfdCkpICogX19pcGlwZV9mcmVxX3NjYWxlKQorI2RlZmluZSBpcGlwZV90c2MydXMoX3QpCShpcGlwZV90c2MybnMoX3QpIC8gMTAwMCArIDEpCisKKy8qIFByaXZhdGUgaW50ZXJmYWNlIC0tIEludGVybmFsIHVzZSBvbmx5ICovCisKKyNkZWZpbmUgX19pcGlwZV9jaGVja19wbGF0Zm9ybSgpCWRvIHsgfSB3aGlsZSAoMCkKKworI2RlZmluZSBfX2lwaXBlX2luaXRfcGxhdGZvcm0oKQkJZG8geyB9IHdoaWxlICgwKQorCitleHRlcm4gYXRvbWljX3QgX19pcGlwZV9pcnFfbHZkZXB0aFtJVkcxNSArIDFdOworCitleHRlcm4gdW5zaWduZWQgbG9uZyBfX2lwaXBlX2lycV9sdm1hc2s7CisKK2V4dGVybiBzdHJ1Y3QgaXBpcGVfZG9tYWluIGlwaXBlX3Jvb3Q7CisKKy8qIGVuYWJsZS9kaXNhYmxlX2lycWRlc2MgX211c3RfIGJlIHVzZWQgaW4gcGFpcnMuICovCisKK3ZvaWQgX19pcGlwZV9lbmFibGVfaXJxZGVzYyhzdHJ1Y3QgaXBpcGVfZG9tYWluICppcGQsCisJCQkgICAgdW5zaWduZWQgaXJxKTsKKwordm9pZCBfX2lwaXBlX2Rpc2FibGVfaXJxZGVzYyhzdHJ1Y3QgaXBpcGVfZG9tYWluICppcGQsCisJCQkgICAgIHVuc2lnbmVkIGlycSk7CisKKyNkZWZpbmUgX19pcGlwZV9lbmFibGVfaXJxKGlycSkJCShpcnFfZGVzY1tpcnFdLmNoaXAtPnVubWFzayhpcnEpKQorCisjZGVmaW5lIF9faXBpcGVfZGlzYWJsZV9pcnEoaXJxKQkoaXJxX2Rlc2NbaXJxXS5jaGlwLT5tYXNrKGlycSkpCisKKyNkZWZpbmUgX19pcGlwZV9sb2NrX3Jvb3QoKQkJCQkJXAorCXNldF9iaXQoSVBJUEVfUk9PVExPQ0tfRkxBRywgJmlwaXBlX3Jvb3RfZG9tYWluLT5mbGFncykKKworI2RlZmluZSBfX2lwaXBlX3VubG9ja19yb290KCkJCQkJCVwKKwljbGVhcl9iaXQoSVBJUEVfUk9PVExPQ0tfRkxBRywgJmlwaXBlX3Jvb3RfZG9tYWluLT5mbGFncykKKwordm9pZCBfX2lwaXBlX2VuYWJsZV9waXBlbGluZSh2b2lkKTsKKworI2RlZmluZSBfX2lwaXBlX2hvb2tfY3JpdGljYWxfaXBpKGlwZCkgZG8geyB9IHdoaWxlICgwKQorCisjZGVmaW5lIF9faXBpcGVfc3luY19waXBlbGluZShzeW5jbWFzaykJCQkJCVwKKwlkbyB7CQkJCQkJCQlcCisJCXN0cnVjdCBpcGlwZV9kb21haW4gKmlwZCA9IGlwaXBlX2N1cnJlbnRfZG9tYWluOwlcCisJCWlmIChsaWtlbHkoaXBkICE9IGlwaXBlX3Jvb3RfZG9tYWluIHx8ICF0ZXN0X2JpdChJUElQRV9ST09UTE9DS19GTEFHLCAmaXBkLT5mbGFncykpKSBcCisJCQlfX2lwaXBlX3N5bmNfc3RhZ2Uoc3luY21hc2spOwkJCVwKKwl9IHdoaWxlICgwKQorCit2b2lkIF9faXBpcGVfaGFuZGxlX2lycSh1bnNpZ25lZCBpcnEsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKKworaW50IF9faXBpcGVfZ2V0X2lycV9wcmlvcml0eSh1bnNpZ25lZCBpcnEpOworCitpbnQgX19pcGlwZV9nZXRfaXJxdGhyZWFkX3ByaW9yaXR5KHVuc2lnbmVkIGlycSk7CisKK3ZvaWQgX19pcGlwZV9zdGFsbF9yb290X3Jhdyh2b2lkKTsKKwordm9pZCBfX2lwaXBlX3Vuc3RhbGxfcm9vdF9yYXcodm9pZCk7CisKK3ZvaWQgX19pcGlwZV9zZXJpYWxfZGVidWcoY29uc3QgY2hhciAqZm10LCAuLi4pOworCitERUNMQVJFX1BFUl9DUFUoc3RydWN0IHB0X3JlZ3MsIF9faXBpcGVfdGlja19yZWdzKTsKKworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgX19pcGlwZV9jb3JlX2Nsb2NrOworCitleHRlcm4gdW5zaWduZWQgbG9uZyBfX2lwaXBlX2ZyZXFfc2NhbGU7CisKK2V4dGVybiB1bnNpZ25lZCBsb25nIF9faXBpcGVfaXJxX3RhaWxfaG9vazsKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIF9faXBpcGVfZmZueih1bnNpZ25lZCBsb25nIHVsKQoreworCXJldHVybiBmZnModWwpIC0gMTsKK30KKworI2RlZmluZSBfX2lwaXBlX3J1bl9pcnF0YWlsKCkgIC8qIE11c3QgYmUgYSBtYWNybyAqLwkJCVwKKwlkbyB7CQkJCQkJCQlcCisJCWFzbWxpbmthZ2Ugdm9pZCBfX2lwaXBlX2NhbGxfaXJxdGFpbCh2b2lkKTsJCVwKKwkJdW5zaWduZWQgbG9uZyBfX3BlbmRpbmc7CQkJCVwKKwkJQ1NZTkMoKTsJCQkJCVwKKwkJX19wZW5kaW5nID0gYmZpbl9yZWFkX0lQRU5EKCk7CQkJCVwKKwkJaWYgKF9fcGVuZGluZyAmIDB4ODAwMCkgewkJCQlcCisJCQlfX3BlbmRpbmcgJj0gfjB4ODAxMDsJCQkJXAorCQkJaWYgKF9fcGVuZGluZyAmJiAoX19wZW5kaW5nICYgKF9fcGVuZGluZyAtIDEpKSA9PSAwKSBcCisJCQkJX19pcGlwZV9jYWxsX2lycXRhaWwoKTsJCQlcCisJCX0JCQkJCQkJXAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgX19pcGlwZV9ydW5faXNyKGlwZCwgaXJxKQkJCQkJXAorCWRvIHsJCQkJCQkJCVwKKwkJaWYgKGlwZCA9PSBpcGlwZV9yb290X2RvbWFpbikgewkJCQlcCisJCQkvKgkJCQkJCVwKKwkJCSAqIE5vdGU6IHRoZSBJLXBpcGUgaW1wbGVtZW50cyBhIHRocmVhZGVkIGludGVycnVwdCBtb2RlbCBvbiBcCisJCQkgKiB0aGlzIGFyY2ggZm9yIExpbnV4IGV4dGVybmFsIElSUXMuIFRoZSBpbnRlcnJ1cHQgaGFuZGxlciB3ZSBcCisJCQkgKiBjYWxsIGhlcmUgb25seSB3YWtlcyB1cCB0aGUgYXNzb2NpYXRlZCBJUlEgdGhyZWFkLiBcCisJCQkgKi8JCQkJCQlcCisJCQlpZiAoaXBpcGVfdmlydHVhbF9pcnFfcChpcnEpKSB7CQkJXAorCQkJCS8qIE5vIGlycXRhaWwgaGVyZTsgdmlydHVhbCBpbnRlcnJ1cHRzIGhhdmUgbm8gZWZmZWN0IFwKKwkJCQkgICBvbiBJUEVORCBzbyB0aGVyZSBpcyBubyBuZWVkIGZvciBwcm9jZXNzaW5nIFwKKwkJCQkgICBkZWZlcnJhbC4gKi8JCQkJXAorCQkJCWxvY2FsX2lycV9lbmFibGVfbm9oZWFkKGlwZCk7CQlcCisJCQkJaXBkLT5pcnFzW2lycV0uaGFuZGxlcihpcnEsIGlwZC0+aXJxc1tpcnFdLmNvb2tpZSk7IFwKKwkJCQlsb2NhbF9pcnFfZGlzYWJsZV9ub2hlYWQoaXBkKTsJCVwKKwkJCX0gZWxzZQkJCQkJCVwKKwkJCQkvKgkJCQkJXAorCQkJCSAqIE5vIG5lZWQgdG8gcnVuIHRoZSBpcnF0YWlsIGhlcmUgZWl0aGVyOyBcCisJCQkJICogd2UgY2FuJ3QgYmUgcHJlZW1wdGVkIGJ5IGh3IElSUXMsIHNvCVwKKwkJCQkgKiBub24tTGludXggSVJRcyBjYW5ub3Qgc3RhY2sgb3ZlciB0aGUgc2hvcnQgXAorCQkJCSAqIHRocmVhZCB3YWtldXAgY29kZS4gV2hpY2ggaW4gdHVybiBtZWFucyBcCisJCQkJICogdGhhdCBubyBpcnF0YWlsIGNvbmRpdGlvbiBjb3VsZCBiZSBwZW5kaW5nIFwKKwkJCQkgKiBmb3IgZG9tYWlucyBhYm92ZSBMaW51eCBpbiB0aGUgcGlwZWxpbmUuIFwKKwkJCQkgKi8JCQkJCVwKKwkJCQlpcGQtPmlycXNbaXJxXS5oYW5kbGVyKGlycSwgJl9fcmF3X2dldF9jcHVfdmFyKF9faXBpcGVfdGlja19yZWdzKSk7IFwKKwkJfSBlbHNlIHsJCQkJCQlcCisJCQlfX2NsZWFyX2JpdChJUElQRV9TWU5DX0ZMQUcsICZpcGlwZV9jcHVkb21fdmFyKGlwZCwgc3RhdHVzKSk7IFwKKwkJCWxvY2FsX2lycV9lbmFibGVfbm9oZWFkKGlwZCk7CQkJXAorCQkJaXBkLT5pcnFzW2lycV0uaGFuZGxlcihpcnEsIGlwZC0+aXJxc1tpcnFdLmNvb2tpZSk7IFwKKwkJCS8qIEF0dGVtcHQgdG8gZXhpdCB0aGUgb3V0ZXIgaW50ZXJydXB0IGxldmVsIGJlZm9yZSBcCisJCQkgKiBzdGFydGluZyB0aGUgZGVmZXJyZWQgSVJRIHByb2Nlc3NpbmcuICovCVwKKwkJCWxvY2FsX2lycV9kaXNhYmxlX25vaGVhZChpcGQpOwkJCVwKKwkJCV9faXBpcGVfcnVuX2lycXRhaWwoKTsJCQkJXAorCQkJX19zZXRfYml0KElQSVBFX1NZTkNfRkxBRywgJmlwaXBlX2NwdWRvbV92YXIoaXBkLCBzdGF0dXMpKTsgXAorCQl9CQkJCQkJCVwKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIF9faXBpcGVfc3lzY2FsbF93YXRjaGVkX3AocCwgc2MpCVwKKwkoKChwKS0+ZmxhZ3MgJiBQRl9FVk5PVElGWSkgfHwgKHVuc2lnbmVkIGxvbmcpc2MgPj0gTlJfc3lzY2FsbHMpCisKK3ZvaWQgaXBpcGVfaW5pdF9pcnFfdGhyZWFkcyh2b2lkKTsKKworaW50IGlwaXBlX3N0YXJ0X2lycV90aHJlYWQodW5zaWduZWQgaXJxLCBzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpOworCisjZGVmaW5lIElTX1NZU0lSUShpcnEpCQkoKGlycSkgPiBJUlFfQ09SRVRNUiAmJiAoaXJxKSA8PSBTWVNfSVJRUykKKyNkZWZpbmUgSVNfR1BJT0lSUShpcnEpCQkoKGlycSkgPj0gR1BJT19JUlFfQkFTRSAmJiAoaXJxKSA8IE5SX0lSUVMpCisKKyNkZWZpbmUgSVJRX1NZU1RNUgkJSVJRX1RJTUVSMAorI2RlZmluZSBJUlFfUFJJT1RNUgkJQ09ORklHX0lSUV9USU1FUjAKKworI2lmIGRlZmluZWQoQ09ORklHX0JGNTMxKSB8fCBkZWZpbmVkKENPTkZJR19CRjUzMikgfHwgZGVmaW5lZChDT05GSUdfQkY1MzMpCisjZGVmaW5lIFBSSU9fR1BJT0RFTVVYKGlycSkJQ09ORklHX1BGQQorI2VsaWYgZGVmaW5lZChDT05GSUdfQkY1MzQpIHx8IGRlZmluZWQoQ09ORklHX0JGNTM2KSB8fCBkZWZpbmVkKENPTkZJR19CRjUzNykKKyNkZWZpbmUgUFJJT19HUElPREVNVVgoaXJxKQlDT05GSUdfSVJRX1BST0dfSU5UQQorI2VsaWYgZGVmaW5lZChDT05GSUdfQkY1MngpCisjZGVmaW5lIFBSSU9fR1BJT0RFTVVYKGlycSkJKChpcnEpID09IElSUV9QT1JURl9JTlRBID8gQ09ORklHX0lSUV9QT1JURl9JTlRBIDogXAorCQkJCSAoaXJxKSA9PSBJUlFfUE9SVEdfSU5UQSA/IENPTkZJR19JUlFfUE9SVEdfSU5UQSA6IFwKKwkJCQkgKGlycSkgPT0gSVJRX1BPUlRIX0lOVEEgPyBDT05GSUdfSVJRX1BPUlRIX0lOVEEgOiBcCisJCQkJIC0xKQorI2VsaWYgZGVmaW5lZChDT05GSUdfQkY1NjEpCisjZGVmaW5lIFBSSU9fR1BJT0RFTVVYKGlycSkJKChpcnEpID09IElSUV9QUk9HMF9JTlRBID8gQ09ORklHX0lSUV9QUk9HMF9JTlRBIDogXAorCQkJCSAoaXJxKSA9PSBJUlFfUFJPRzFfSU5UQSA/IENPTkZJR19JUlFfUFJPRzFfSU5UQSA6IFwKKwkJCQkgKGlycSkgPT0gSVJRX1BST0cyX0lOVEEgPyBDT05GSUdfSVJRX1BST0cyX0lOVEEgOiBcCisJCQkJIC0xKQorI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSX0RJU0FCTEUodmFsKQliZmluX3dyaXRlX1RNUlM4X0RJU0FCTEUodmFsKQorI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSX0VOQUJMRSh2YWwpCWJmaW5fd3JpdGVfVE1SUzhfRU5BQkxFKHZhbCkKKyNkZWZpbmUgYmZpbl93cml0ZV9USU1FUl9TVEFUVVModmFsKQliZmluX3dyaXRlX1RNUlM4X1NUQVRVUyh2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9USU1FUl9TVEFUVVMoKQliZmluX3JlYWRfVE1SUzhfU1RBVFVTKCkKKyNlbGlmIGRlZmluZWQoQ09ORklHX0JGNTR4KQorI2RlZmluZSBQUklPX0dQSU9ERU1VWChpcnEpCSgoaXJxKSA9PSBJUlFfUElOVDAgPyBDT05GSUdfSVJRX1BJTlQwIDogXAorCQkJCSAoaXJxKSA9PSBJUlFfUElOVDEgPyBDT05GSUdfSVJRX1BJTlQxIDogXAorCQkJCSAoaXJxKSA9PSBJUlFfUElOVDIgPyBDT05GSUdfSVJRX1BJTlQyIDogXAorCQkJCSAoaXJxKSA9PSBJUlFfUElOVDMgPyBDT05GSUdfSVJRX1BJTlQzIDogXAorCQkJCSAtMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9USU1FUl9ESVNBQkxFKHZhbCkJYmZpbl93cml0ZV9USU1FUl9ESVNBQkxFMCh2YWwpCisjZGVmaW5lIGJmaW5fd3JpdGVfVElNRVJfRU5BQkxFKHZhbCkJYmZpbl93cml0ZV9USU1FUl9FTkFCTEUwKHZhbCkKKyNkZWZpbmUgYmZpbl93cml0ZV9USU1FUl9TVEFUVVModmFsKQliZmluX3dyaXRlX1RJTUVSX1NUQVRVUzAodmFsKQorI2RlZmluZSBiZmluX3JlYWRfVElNRVJfU1RBVFVTKHZhbCkJYmZpbl9yZWFkX1RJTUVSX1NUQVRVUzAodmFsKQorI2Vsc2UKKyMgZXJyb3IgIm5vIFBSSU9fR1BJT0RFTVVYKCkgZm9yIHRoaXMgcGFydCIKKyNlbmRpZgorCisjZGVmaW5lIF9faXBpcGVfcm9vdF90aWNrX3AocmVncykJKChyZWdzLT5pcGVuZCAmIDB4MTApICE9IDApCisKKyNlbHNlIC8qICFDT05GSUdfSVBJUEUgKi8KKworI2RlZmluZSB0YXNrX2hpamFja2VkKHApCQkwCisjZGVmaW5lIGlwaXBlX3RyYXBfbm90aWZ5KHQsIHIpICAJMAorCisjZGVmaW5lIF9faXBpcGVfc3RhbGxfcm9vdF9yYXcoKQlkbyB7IH0gd2hpbGUgKDApCisjZGVmaW5lIF9faXBpcGVfdW5zdGFsbF9yb290X3JhdygpCWRvIHsgfSB3aGlsZSAoMCkKKworI2RlZmluZSBpcGlwZV9pbml0X2lycV90aHJlYWRzKCkJCWRvIHsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgaXBpcGVfc3RhcnRfaXJxX3RocmVhZChpcnEsIGRlc2MpCTAKKworI2RlZmluZSBJUlFfU1lTVE1SCQlJUlFfQ09SRVRNUgorI2RlZmluZSBJUlFfUFJJT1RNUgkJSVJRX0NPUkVUTVIKKworI2RlZmluZSBfX2lwaXBlX3Jvb3RfdGlja19wKHJlZ3MpCTEKKworI2VuZGlmIC8qICFDT05GSUdfSVBJUEUgKi8KKworI2VuZGlmCS8qICFfX0FTTV9CTEFDS0ZJTl9JUElQRV9IICovCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2lwaXBlX2Jhc2UuaCBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vaXBpcGVfYmFzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiMTAyNWEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2lwaXBlX2Jhc2UuaApAQCAtMCwwICsxLDgwIEBACisvKiAgIC0qLSBsaW51eC1jIC0qLQorICogICBpbmNsdWRlL2FzbS1ibGFja2Zpbi9fYmFzZWlwaXBlLmgKKyAqCisgKiAgIENvcHlyaWdodCAoQykgMjAwNyBQaGlsaXBwZSBHZXJ1bS4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlIE1BIDAyMTM5LAorICogICBVU0E7IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisgKiAgIHZlcnNpb24uCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fQVNNX0JMQUNLRklOX0lQSVBFX0JBU0VfSAorI2RlZmluZSBfX0FTTV9CTEFDS0ZJTl9JUElQRV9CQVNFX0gKKworI2lmZGVmIENPTkZJR19JUElQRQorCisjZGVmaW5lIElQSVBFX05SX1hJUlFTCQlOUl9JUlFTCisjZGVmaW5lIElQSVBFX0lSUV9JU0hJRlQJNQkvKiAyXjUgZm9yIDMyYml0cyBhcmNoLiAqLworCisvKiBCbGFja2Zpbi1zcGVjaWZpYywgZ2xvYmFsIGRvbWFpbiBmbGFncyAqLworI2RlZmluZSBJUElQRV9ST09UTE9DS19GTEFHCTEJLyogTG9jayBwaXBlbGluZSBmb3Igcm9vdCAqLworCisgLyogQmxhY2tmaW4gdHJhcHMgLS0gaS5lLiBleGNlcHRpb24gdmVjdG9yIG51bWJlcnMgKi8KKyNkZWZpbmUgSVBJUEVfTlJfRkFVTFRTCQk1MiAvKiBXZSBsZWF2ZSBhIGdhcCBhZnRlciBWRUNfSUxMX1JFUy4gKi8KKy8qIFBzZXVkby12ZWN0b3JzIHVzZWQgZm9yIGtlcm5lbCBldmVudHMgKi8KKyNkZWZpbmUgSVBJUEVfRklSU1RfRVZFTlQJSVBJUEVfTlJfRkFVTFRTCisjZGVmaW5lIElQSVBFX0VWRU5UX1NZU0NBTEwJKElQSVBFX0ZJUlNUX0VWRU5UKQorI2RlZmluZSBJUElQRV9FVkVOVF9TQ0hFRFVMRQkoSVBJUEVfRklSU1RfRVZFTlQgKyAxKQorI2RlZmluZSBJUElQRV9FVkVOVF9TSUdXQUtFCShJUElQRV9GSVJTVF9FVkVOVCArIDIpCisjZGVmaW5lIElQSVBFX0VWRU5UX1NFVFNDSEVECShJUElQRV9GSVJTVF9FVkVOVCArIDMpCisjZGVmaW5lIElQSVBFX0VWRU5UX0lOSVQJKElQSVBFX0ZJUlNUX0VWRU5UICsgNCkKKyNkZWZpbmUgSVBJUEVfRVZFTlRfRVhJVAkoSVBJUEVfRklSU1RfRVZFTlQgKyA1KQorI2RlZmluZSBJUElQRV9FVkVOVF9DTEVBTlVQCShJUElQRV9GSVJTVF9FVkVOVCArIDYpCisjZGVmaW5lIElQSVBFX0xBU1RfRVZFTlQJSVBJUEVfRVZFTlRfQ0xFQU5VUAorI2RlZmluZSBJUElQRV9OUl9FVkVOVFMJCShJUElQRV9MQVNUX0VWRU5UICsgMSkKKworI2RlZmluZSBJUElQRV9USU1FUl9JUlEJCUlSUV9DT1JFVE1SCisKKyNpZm5kZWYgX19BU1NFTUJMWV9fCisKKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKworZXh0ZXJuIGludCB0ZXN0X2JpdChpbnQgbnIsIGNvbnN0IHZvaWQgKmFkZHIpOworCisKK2V4dGVybiB1bnNpZ25lZCBsb25nIF9faXBpcGVfcm9vdF9zdGF0dXM7IC8qIEFsaWFzIHRvIGlwaXBlX3Jvb3RfY3B1ZG9tX3ZhcihzdGF0dXMpICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2lwaXBlX3N0YWxsX3Jvb3Qodm9pZCkKK3sKKwl2b2xhdGlsZSB1bnNpZ25lZCBsb25nICpwID0gJl9faXBpcGVfcm9vdF9zdGF0dXM7CisJc2V0X2JpdCgwLCBwKTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIF9faXBpcGVfdGVzdF9hbmRfc3RhbGxfcm9vdCh2b2lkKQoreworCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKnAgPSAmX19pcGlwZV9yb290X3N0YXR1czsKKwlyZXR1cm4gdGVzdF9hbmRfc2V0X2JpdCgwLCBwKTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIF9faXBpcGVfdGVzdF9yb290KHZvaWQpCit7CisJY29uc3QgdW5zaWduZWQgbG9uZyAqcCA9ICZfX2lwaXBlX3Jvb3Rfc3RhdHVzOworCXJldHVybiB0ZXN0X2JpdCgwLCBwKTsKK30KKworI2VuZGlmIC8qICFfX0FTU0VNQkxZX18gKi8KKworI2VuZGlmIC8qIENPTkZJR19JUElQRSAqLworCisjZW5kaWYgLyogIV9fQVNNX0JMQUNLRklOX0lQSVBFX0JBU0VfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9pcnEuaCBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vaXJxLmgKaW5kZXggODlmNTllMS4uM2Q5Nzc5MCAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9pcnEuaAorKysgYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2lycS5oCkBAIC0xNyw1NiArMTcsMjcyIEBACiAjaWZuZGVmIF9CRklOX0lSUV9IXwogI2RlZmluZSBfQkZJTl9JUlFfSF8KIAotI2luY2x1ZGUgPG1hY2gvaXJxLmg+Ci0jaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoqKioqICAgSU5UUk9EVUNUSU9OICoqKioqKioqKioqCi0gKiAgIE9uIHRoZSBCbGFja2ZpbiwgdGhlIGludGVycnVwdCBzdHJ1Y3R1cmUgYWxsb3dzIHJlbW1hcHBpbmcgb2YgdGhlIGhhcmR3YXJlCi0gKiAgIGxldmVscy4KLSAqIC0gSSdtIGdvaW5nIHRvIGFzc3VtZSB0aGF0IHRoZSBIL1cgbGV2ZWwgaXMgZ29pbmcgdG8gc3RheSBhdCB0aGUgZGVmYXVsdAotICogICBzZXR0aW5ncy4gSWYgc29tZW9uZSB3YW50cyB0byBnbyB0aHJvdWdoIGFuZCBhYnN0YXJ0IHRoaXMgb3V0LCBmZWVsIGZyZWUKLSAqICAgdG8gbW9kIHRoZSBpbnRlcnJ1cHQgbnVtYmVyaW5nIHNjaGVtZS4KLSAqIC0gSSdtIGFic3RyYWN0aW5nIHRoZSBpbnRlcnJ1cHRzIHNvIHRoYXQgdUNsaW51eCBkb2VzIG5vdCBrbm93IGFueXRoaW5nCi0gKiAgIGFib3V0IHRoZSBIL1cgbGV2ZWxzLiBJZiB5b3Ugd2FudCB0byBjaGFuZ2UgdGhlIEgvVyBBTkQga2VlcCB0aGUgYWJzdHJhY3RlZAotICogICBsZXZlbHMgdGhhdCB1Q2xpbnV4IHNlZXMsIHlvdSBzaG91bGQgYmUgYWJsZSB0byBkbyBtb3N0IG9mIGl0IGhlcmUuCi0gKiAtIEkndmUgbGVmdCB0aGUgImFic3RyYWN0IiBudW1iZXJpbmcgc3BhcmNlIGluIGNhc2Ugc29tZW9uZSB3YW50cyB0byBwdWxsIHRoZQotICogICBpbnRlcnJ1cHRzIGFwYXJ0IChqdXN0IHRoZSBUWC9SWCBmb3IgdGhlIHZhcmlvdXMgZGV2aWNlcykKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCiAvKiBTWVNfSVJRUyBhbmQgTlJfSVJRUyBhcmUgZGVmaW5lZCBpbiA8bWFjaC1iZjV4eC9pcnEuaD4qLworI2luY2x1ZGUgPG1hY2gvaXJxLmg+CisjaW5jbHVkZSA8YXNtL3BkYS5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKworI2lmZGVmIENPTkZJR19TTVAKKy8qIEZvcndhcmQgZGVjbCBuZWVkZWQgZHVlIHRvIGNkZWYgaW50ZXIgZGVwZW5kZW5jaWVzICovCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IF9fcHVyZSBiZmluX2RzcGlkKHZvaWQpOworIyBkZWZpbmUgYmxhY2tmaW5fY29yZV9pZCgpIChiZmluX2RzcGlkKCkgJiAweGZmKQorIyBkZWZpbmUgYmZpbl9pcnFfZmxhZ3MgY3B1X3BkYVtibGFja2Zpbl9jb3JlX2lkKCldLmltYXNrCisjZWxzZQorZXh0ZXJuIHVuc2lnbmVkIGxvbmcgYmZpbl9pcnFfZmxhZ3M7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19JUElQRQorCisjaW5jbHVkZSA8bGludXgvaXBpcGVfdHJhY2UuaD4KKwordm9pZCBfX2lwaXBlX3Vuc3RhbGxfcm9vdCh2b2lkKTsKKwordm9pZCBfX2lwaXBlX3Jlc3RvcmVfcm9vdCh1bnNpZ25lZCBsb25nIGZsYWdzKTsKKworI2lmZGVmIENPTkZJR19ERUJVR19IV0VSUgorIyBkZWZpbmUgX19hbGxfbWFza2VkX2lycV9mbGFncyAweDNmCisjIGRlZmluZSBfX3NhdmVfYW5kX2NsaV9odyh4KSBcCisJX19hc21fXyBfX3ZvbGF0aWxlX18oIFwKKwkJImNsaSAlMDsiIFwKKwkJInN0aSAlMTsiIFwKKwkJOiAiPSZkIih4KSBcCisJCTogImQiICgweDNGKSBcCisJKQorI2Vsc2UKKyMgZGVmaW5lIF9fYWxsX21hc2tlZF9pcnFfZmxhZ3MgMHgxZgorIyBkZWZpbmUgX19zYXZlX2FuZF9jbGlfaHcoeCkgXAorCV9fYXNtX18gX192b2xhdGlsZV9fKCBcCisJCSJjbGkgJTA7IiBcCisJCTogIj0mZCIoeCkgXAorCSkKKyNlbmRpZgorCisjZGVmaW5lIGlycXNfZW5hYmxlZF9mcm9tX2ZsYWdzX2h3KHgpCSgoeCkgIT0gX19hbGxfbWFza2VkX2lycV9mbGFncykKKyNkZWZpbmUgcmF3X2lycXNfZGlzYWJsZWRfZmxhZ3MoZmxhZ3MpCSghaXJxc19lbmFibGVkX2Zyb21fZmxhZ3NfaHcoZmxhZ3MpKQorI2RlZmluZSBsb2NhbF90ZXN0X2lmbGFnX2h3KHgpCQlpcnFzX2VuYWJsZWRfZnJvbV9mbGFnc19odyh4KQorCisjZGVmaW5lIGxvY2FsX3NhdmVfZmxhZ3MoeCkJCQkJCQlcCisJZG8gewkJCQkJCQkJXAorCQkoeCkgPSBfX2lwaXBlX3Rlc3Rfcm9vdCgpID8gXAorCQkJX19hbGxfbWFza2VkX2lycV9mbGFncyA6IGJmaW5faXJxX2ZsYWdzOyBcCisJfSB3aGlsZSAoMCkKKworI2RlZmluZSBsb2NhbF9pcnFfc2F2ZSh4KQkJCQlcCisJZG8gewkJCQkJCVwKKwkJKHgpID0gX19pcGlwZV90ZXN0X2FuZF9zdGFsbF9yb290KCk7CVwKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIGxvY2FsX2lycV9yZXN0b3JlKHgpCV9faXBpcGVfcmVzdG9yZV9yb290KHgpCisjZGVmaW5lIGxvY2FsX2lycV9kaXNhYmxlKCkJX19pcGlwZV9zdGFsbF9yb290KCkKKyNkZWZpbmUgbG9jYWxfaXJxX2VuYWJsZSgpCV9faXBpcGVfdW5zdGFsbF9yb290KCkKKyNkZWZpbmUgaXJxc19kaXNhYmxlZCgpCQlfX2lwaXBlX3Rlc3Rfcm9vdCgpCisKKyNkZWZpbmUgbG9jYWxfc2F2ZV9mbGFnc19odyh4KSBcCisJX19hc21fXyBfX3ZvbGF0aWxlX18oIFwKKwkJImNsaSAlMDsiIFwKKwkJInN0aSAlMDsiIFwKKwkJOiAiPWQiKHgpIFwKKwkpCisKKyNkZWZpbmUJaXJxc19kaXNhYmxlZF9odygpCQkJCVwKKwkoewkJCQkJCVwKKwkJdW5zaWduZWQgbG9uZyBmbGFnczsJCQlcCisJCWxvY2FsX3NhdmVfZmxhZ3NfaHcoZmxhZ3MpOwkJXAorCQkhaXJxc19lbmFibGVkX2Zyb21fZmxhZ3NfaHcoZmxhZ3MpOwlcCisJfSkKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHJhd19tYW5nbGVfaXJxX2JpdHMoaW50IHZpcnQsIHVuc2lnbmVkIGxvbmcgcmVhbCkKK3sKKwkvKiBNZXJnZSB2aXJ0dWFsIGFuZCByZWFsIGludGVycnVwdCBtYXNrIGJpdHMgaW50byBhIHNpbmdsZQorCSAgIDMyYml0IHdvcmQuICovCisJcmV0dXJuIChyZWFsICYgfigxIDw8IDMxKSkgfCAoKHZpcnQgIT0gMCkgPDwgMzEpOworfQorCitzdGF0aWMgaW5saW5lIGludCByYXdfZGVtYW5nbGVfaXJxX2JpdHModW5zaWduZWQgbG9uZyAqeCkKK3sKKwlpbnQgdmlydCA9ICgqeCAmICgxIDw8IDMxKSkgIT0gMDsKKwkqeCAmPSB+KDFMIDw8IDMxKTsKKwlyZXR1cm4gdmlydDsKK30KKworI2lmZGVmIENPTkZJR19JUElQRV9UUkFDRV9JUlFTT0ZGCisKKyNkZWZpbmUgbG9jYWxfaXJxX2Rpc2FibGVfaHcoKQkJCQkJCVwKKwlkbyB7CQkJCQkJCQlcCisJCWludCBfdG1wX2R1bW15OwkJCQkJCVwKKwkJaWYgKCFpcnFzX2Rpc2FibGVkX2h3KCkpCQkJCVwKKwkJCWlwaXBlX3RyYWNlX2JlZ2luKDB4ODAwMDAwMDApOwkJCVwKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJjbGkgJTA7IiA6ICI9ZCIgKF90bXBfZHVtbXkpIDogKTsJXAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgbG9jYWxfaXJxX2VuYWJsZV9odygpCQkJCQkJXAorCWRvIHsJCQkJCQkJCVwKKwkJaWYgKGlycXNfZGlzYWJsZWRfaHcoKSkJCQkJCVwKKwkJCWlwaXBlX3RyYWNlX2VuZCgweDgwMDAwMDAwKTsJCQlcCisJCV9fYXNtX18gX192b2xhdGlsZV9fICgic3RpICUwOyIgOiA6ICJkIihiZmluX2lycV9mbGFncykpOwlcCisJfSB3aGlsZSAoMCkKKworI2RlZmluZSBsb2NhbF9pcnFfc2F2ZV9odyh4KQkJCQlcCisJZG8gewkJCQkJCVwKKwkJX19zYXZlX2FuZF9jbGlfaHcoeCk7CQkJXAorCQlpZiAobG9jYWxfdGVzdF9pZmxhZ19odyh4KSkJCVwKKwkJCWlwaXBlX3RyYWNlX2JlZ2luKDB4ODAwMDAwMDEpOwlcCisJfSB3aGlsZSAoMCkKKworI2RlZmluZSBsb2NhbF9pcnFfcmVzdG9yZV9odyh4KQkJCQlcCisJZG8gewkJCQkJCVwKKwkJaWYgKGxvY2FsX3Rlc3RfaWZsYWdfaHcoeCkpIHsJCVwKKwkJCWlwaXBlX3RyYWNlX2VuZCgweDgwMDAwMDAxKTsJXAorCQkJbG9jYWxfaXJxX2VuYWJsZV9od19ub3RyYWNlKCk7CVwKKwkJfQkJCQkJXAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgbG9jYWxfaXJxX2Rpc2FibGVfaHdfbm90cmFjZSgpCQkJCQlcCisJZG8gewkJCQkJCQkJXAorCQlpbnQgX3RtcF9kdW1teTsJCQkJCQlcCisJCV9fYXNtX18gX192b2xhdGlsZV9fICgiY2xpICUwOyIgOiAiPWQiIChfdG1wX2R1bW15KSA6ICk7CVwKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIGxvY2FsX2lycV9lbmFibGVfaHdfbm90cmFjZSgpIFwKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyggXAorCQkic3RpICUwOyIgXAorCQk6IFwKKwkJOiAiZCIoYmZpbl9pcnFfZmxhZ3MpIFwKKwkpCisKKyNkZWZpbmUgbG9jYWxfaXJxX3NhdmVfaHdfbm90cmFjZSh4KSBfX3NhdmVfYW5kX2NsaV9odyh4KQorCisjZGVmaW5lIGxvY2FsX2lycV9yZXN0b3JlX2h3X25vdHJhY2UoeCkJCQlcCisJZG8gewkJCQkJCVwKKwkJaWYgKGxvY2FsX3Rlc3RfaWZsYWdfaHcoeCkpCQlcCisJCQlsb2NhbF9pcnFfZW5hYmxlX2h3X25vdHJhY2UoKTsJXAorCX0gd2hpbGUgKDApCisKKyNlbHNlIC8qIENPTkZJR19JUElQRV9UUkFDRV9JUlFTT0ZGICovCisKKyNkZWZpbmUgbG9jYWxfaXJxX2VuYWJsZV9odygpIFwKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyggXAorCQkic3RpICUwOyIgXAorCQk6IFwKKwkJOiAiZCIoYmZpbl9pcnFfZmxhZ3MpIFwKKwkpCisKKyNkZWZpbmUgbG9jYWxfaXJxX2Rpc2FibGVfaHcoKQkJCVwKKwlkbyB7CQkJCQlcCisJCWludCBfdG1wX2R1bW15OwkJCVwKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18gKAkJXAorCQkJImNsaSAlMDsiCQlcCisJCQk6ICI9ZCIgKF90bXBfZHVtbXkpKTsJXAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgbG9jYWxfaXJxX3Jlc3RvcmVfaHcoeCkgXAorCWRvIHsgXAorCQlpZiAoaXJxc19lbmFibGVkX2Zyb21fZmxhZ3NfaHcoeCkpIFwKKwkJCWxvY2FsX2lycV9lbmFibGVfaHcoKTsgXAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgbG9jYWxfaXJxX3NhdmVfaHcoeCkJCV9fc2F2ZV9hbmRfY2xpX2h3KHgpCisKKyNkZWZpbmUgbG9jYWxfaXJxX2Rpc2FibGVfaHdfbm90cmFjZSgpCWxvY2FsX2lycV9kaXNhYmxlX2h3KCkKKyNkZWZpbmUgbG9jYWxfaXJxX2VuYWJsZV9od19ub3RyYWNlKCkJbG9jYWxfaXJxX2VuYWJsZV9odygpCisjZGVmaW5lIGxvY2FsX2lycV9zYXZlX2h3X25vdHJhY2UoeCkJbG9jYWxfaXJxX3NhdmVfaHcoeCkKKyNkZWZpbmUgbG9jYWxfaXJxX3Jlc3RvcmVfaHdfbm90cmFjZSh4KQlsb2NhbF9pcnFfcmVzdG9yZV9odyh4KQorCisjZW5kaWYgIC8qIENPTkZJR19JUElQRV9UUkFDRV9JUlFTT0ZGICovCisKKyNlbHNlIC8qICFDT05GSUdfSVBJUEUgKi8KIAogLyoKLSAqIE1hY2hpbmUgc3BlY2lmaWMgaW50ZXJydXB0IHNvdXJjZXMuCi0gKgotICogQWRkaW5nIGFuIGludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmUgZm9yIGEgc291cmNlIHdpdGggdGhpcyBiaXQKLSAqIHNldCBpbmRpY2F0ZXMgYSBzcGVjaWFsIG1hY2hpbmUgc3BlY2lmaWMgaW50ZXJydXB0IHNvdXJjZS4KLSAqIFRoZSBtYWNoaW5lIHNwZWNpZmljIGZpbGVzIGRlZmluZSB0aGVzZSBzb3VyY2VzLgotICoKLSAqIFRoZSBJUlFfTUFDSFNQRUMgYml0IGlzIG5vdyBnb25lIC0gdGhlIG9ubHkgdGhpbmcgaXQgZGlkIHdhcyB0bwotICogaW50cm9kdWNlIHVubmVjZXNzYXJ5IG92ZXJoZWFkLgotICoKLSAqIEFsbCBpbnRlcnJ1cHQgaGFuZGxpbmcgaXMgYWN0dWFsbHkgbWFjaGluZSBzcGVjaWZpYyBzbyBpdCBpcyBiZXR0ZXIKLSAqIHRvIHVzZSBmdW5jdGlvbiBwb2ludGVycywgYXMgdXNlZCBieSB0aGUgU3BhcmMgcG9ydCwgYW5kIHNlbGVjdCB0aGUKLSAqIGludGVycnVwdCBoYW5kbGluZyBmdW5jdGlvbnMgd2hlbiBpbml0aWFsaXppbmcgdGhlIGtlcm5lbC4gVGhpcyB3YXkKLSAqIHdlIHNhdmUgc29tZSB1bm5lY2Vzc2FyeSBvdmVyaGVhZCBhdCBydW4tdGltZS4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDEvMTEvOTcgLSBKZXMKKyAqIEludGVycnVwdCBjb25maWd1cmluZyBtYWNyb3MuCiAgKi8KKyNkZWZpbmUgbG9jYWxfaXJxX2Rpc2FibGUoKSBcCisJZG8geyBcCisJCWludCBfX3RtcF9kdW1teTsgXAorCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyggXAorCQkJImNsaSAlMDsiIFwKKwkJCTogIj1kIiAoX190bXBfZHVtbXkpIFwKKwkJKTsgXAorCX0gd2hpbGUgKDApCiAKLWV4dGVybiB2b2lkIGFja19iYWRfaXJxKHVuc2lnbmVkIGludCBpcnEpOworI2RlZmluZSBsb2NhbF9pcnFfZW5hYmxlKCkgXAorCV9fYXNtX18gX192b2xhdGlsZV9fKCBcCisJCSJzdGkgJTA7IiBcCisJCTogXAorCQk6ICJkIiAoYmZpbl9pcnFfZmxhZ3MpIFwKKwkpCiAKLXN0YXRpYyBfX2lubGluZV9fIGludCBpcnFfY2Fub25pY2FsaXplKGludCBpcnEpCisjaWZkZWYgQ09ORklHX0RFQlVHX0hXRVJSCisjIGRlZmluZSBfX3NhdmVfYW5kX2NsaSh4KSBcCisJX19hc21fXyBfX3ZvbGF0aWxlX18oIFwKKwkJImNsaSAlMDsiIFwKKwkJInN0aSAlMTsiIFwKKwkJOiAiPSZkIiAoeCkgXAorCQk6ICJkIiAoMHgzRikgXAorCSkKKyNlbHNlCisjIGRlZmluZSBfX3NhdmVfYW5kX2NsaSh4KSBcCisJX19hc21fXyBfX3ZvbGF0aWxlX18oIFwKKwkJImNsaSAlMDsiIFwKKwkJOiAiPSZkIiAoeCkgXAorCSkKKyNlbmRpZgorCisjZGVmaW5lIGxvY2FsX3NhdmVfZmxhZ3MoeCkgXAorCV9fYXNtX18gX192b2xhdGlsZV9fKCBcCisJCSJjbGkgJTA7IiBcCisJCSJzdGkgJTA7IiBcCisJCTogIj1kIiAoeCkgXAorCSkKKworI2lmZGVmIENPTkZJR19ERUJVR19IV0VSUgorI2RlZmluZSBpcnFzX2VuYWJsZWRfZnJvbV9mbGFncyh4KSAoKCh4KSAmIH4weDNmKSAhPSAwKQorI2Vsc2UKKyNkZWZpbmUgaXJxc19lbmFibGVkX2Zyb21fZmxhZ3MoeCkgKCh4KSAhPSAweDFmKQorI2VuZGlmCisKKyNkZWZpbmUgbG9jYWxfaXJxX3Jlc3RvcmUoeCkgXAorCWRvIHsgXAorCQlpZiAoaXJxc19lbmFibGVkX2Zyb21fZmxhZ3MoeCkpIFwKKwkJCWxvY2FsX2lycV9lbmFibGUoKTsgXAorCX0gd2hpbGUgKDApCisKKy8qIEZvciBzcGlubG9ja3MgZXRjICovCisjZGVmaW5lIGxvY2FsX2lycV9zYXZlKHgpIF9fc2F2ZV9hbmRfY2xpKHgpCisKKyNkZWZpbmUgaXJxc19kaXNhYmxlZCgpCQkJCVwKKyh7CQkJCQkJXAorCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CQkJXAorCWxvY2FsX3NhdmVfZmxhZ3MoZmxhZ3MpOwkJXAorCSFpcnFzX2VuYWJsZWRfZnJvbV9mbGFncyhmbGFncyk7CVwKK30pCisKKyNkZWZpbmUgbG9jYWxfaXJxX3NhdmVfaHcoeCkJCWxvY2FsX2lycV9zYXZlKHgpCisjZGVmaW5lIGxvY2FsX2lycV9yZXN0b3JlX2h3KHgpCQlsb2NhbF9pcnFfcmVzdG9yZSh4KQorI2RlZmluZSBsb2NhbF9pcnFfZW5hYmxlX2h3KCkJCWxvY2FsX2lycV9lbmFibGUoKQorI2RlZmluZSBsb2NhbF9pcnFfZGlzYWJsZV9odygpCQlsb2NhbF9pcnFfZGlzYWJsZSgpCisjZGVmaW5lIGlycXNfZGlzYWJsZWRfaHcoKQkJaXJxc19kaXNhYmxlZCgpCisKKyNlbmRpZiAvKiAhQ09ORklHX0lQSVBFICovCisKKyNpZiBBTk9NQUxZXzA1MDAwMjQ0ICYmIGRlZmluZWQoQ09ORklHX0JGSU5fSUNBQ0hFKQorIyBkZWZpbmUgTk9QX1BBRF9BTk9NQUxZXzA1MDAwMjQ0ICJub3A7IG5vcDsiCisjZWxzZQorIyBkZWZpbmUgTk9QX1BBRF9BTk9NQUxZXzA1MDAwMjQ0CisjZW5kaWYKKworI2RlZmluZSBpZGxlX3dpdGhfaXJxX2Rpc2FibGVkKCkgXAorCV9fYXNtX18gX192b2xhdGlsZV9fKCBcCisJCU5PUF9QQURfQU5PTUFMWV8wNTAwMDI0NCBcCisJCSIuYWxpZ24gODsiIFwKKwkJInN0aSAlMDsiIFwKKwkJImlkbGU7IiBcCisJCTogXAorCQk6ICJkIiAoYmZpbl9pcnFfZmxhZ3MpIFwKKwkpCisKK3N0YXRpYyBpbmxpbmUgaW50IGlycV9jYW5vbmljYWxpemUoaW50IGlycSkKIHsKIAlyZXR1cm4gaXJxOwogfQogCi0vKiBjb3VudCBvZiBzcHVyaW91cyBpbnRlcnJ1cHRzICovCi0vKiBleHRlcm4gdm9sYXRpbGUgdW5zaWduZWQgaW50IG51bV9zcHVyaW91czsgKi8KLQotI2lmbmRlZiBOT19JUlEKLSNkZWZpbmUgTk9fSVJRICgodW5zaWduZWQgaW50KSgtMSkpCi0jZW5kaWYKLQotI2RlZmluZSBTSUNfU1lTSVJRKGlycSkJKGlycSAtIChJUlFfQ09SRVRNUiArIDEpKQotCiAjZW5kaWYJCQkJLyogX0JGSU5fSVJRX0hfICovCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2wxbGF5b3V0LmggYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2wxbGF5b3V0LmgKaW5kZXggYzEzZGVkNy4uNzlkYmVmYSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9sMWxheW91dC5oCisrKyBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vbDFsYXlvdXQuaApAQCAtOCw2ICs4LDcgQEAKIAogI2luY2x1ZGUgPGFzbS9ibGFja2Zpbi5oPgogCisjaWZuZGVmIENPTkZJR19TTVAKICNpZm5kZWYgX19BU1NFTUJMWV9fCiAKIC8qIERhdGEgdGhhdCBpcyAibWFwcGVkIiBpbnRvIHRoZSBwcm9jZXNzIFZNIGF0IHRoZSBzdGFydCBvZiB0aGUgTDEgc2NyYXRjaApAQCAtMjQsOCArMjUsMTAgQEAKIH07CiAKIC8qIEEgcG9pbnRlciB0byB0aGUgc3RydWN0dXJlIGluIG1lbW9yeS4gICovCi0jZGVmaW5lIEwxX1NDUkFUQ0hfVEFTS19JTkZPICgoc3RydWN0IGwxX3NjcmF0Y2hfdGFza19pbmZvICopTDFfU0NSQVRDSF9TVEFSVCkKKyNkZWZpbmUgTDFfU0NSQVRDSF9UQVNLX0lORk8gKChzdHJ1Y3QgbDFfc2NyYXRjaF90YXNrX2luZm8gKilcCisJCQkJCQlnZXRfbDFfc2NyYXRjaF9zdGFydCgpKQogCiAjZW5kaWYKKyNlbmRpZgogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vbWVtX2luaXQuaCBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vbWVtX2luaXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTVhOTMxCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9tZW1faW5pdC5oCkBAIC0wLDAgKzEsMzY0IEBACisvKgorICogYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9tZW1faW5pdC5oIC0gcmVwcm9ncmFtIGNsb2NrcyAvIG1lbW9yeQorICoKKyAqIENvcHlyaWdodCAyMDA0LTIwMDggQW5hbG9nIERldmljZXMgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KKyAqLworCisjaWYgZGVmaW5lZChFQklVX1NER0NUTCkKKyNpZiBkZWZpbmVkKENPTkZJR19NRU1fTVQ0OExDMTZNMTZBMlRHXzc1KSB8fCBcCisgICAgZGVmaW5lZChDT05GSUdfTUVNX01UNDhMQzY0TTRBMkZCXzdFKSB8fCBcCisgICAgZGVmaW5lZChDT05GSUdfTUVNX01UNDhMQzE2TThBMlRHXzc1KSB8fCBcCisgICAgZGVmaW5lZChDT05GSUdfTUVNX0dFTkVSSUNfQk9BUkQpIHx8IFwKKyAgICBkZWZpbmVkKENPTkZJR19NRU1fTVQ0OExDMzJNOEEyXzc1KSB8fCBcCisgICAgZGVmaW5lZChDT05GSUdfTUVNX01UNDhMQzhNMzJCMkI1XzcpIHx8IFwKKyAgICBkZWZpbmVkKENPTkZJR19NRU1fTVQ0OExDMzJNMTZBMlRHXzc1KSB8fCBcCisgICAgZGVmaW5lZChDT05GSUdfTUVNX01UNDhMQzMyTThBMl83NSkKKyNpZiAoQ09ORklHX1NDTEtfSFogPiAxMTk0MDI5ODUpCisjZGVmaW5lIFNEUkFNX3RSUCAgICAgICBUUlBfMgorI2RlZmluZSBTRFJBTV90UlBfbnVtICAgMgorI2RlZmluZSBTRFJBTV90UkFTICAgICAgVFJBU183CisjZGVmaW5lIFNEUkFNX3RSQVNfbnVtICA3CisjZGVmaW5lIFNEUkFNX3RSQ0QgICAgICBUUkNEXzIKKyNkZWZpbmUgU0RSQU1fdFdSICAgICAgIFRXUl8yCisjZW5kaWYKKyNpZiAoQ09ORklHX1NDTEtfSFogPiAxMDQ0Nzc2MTIpICYmIChDT05GSUdfU0NMS19IWiA8PSAxMTk0MDI5ODUpCisjZGVmaW5lIFNEUkFNX3RSUCAgICAgICBUUlBfMgorI2RlZmluZSBTRFJBTV90UlBfbnVtICAgMgorI2RlZmluZSBTRFJBTV90UkFTICAgICAgVFJBU182CisjZGVmaW5lIFNEUkFNX3RSQVNfbnVtICA2CisjZGVmaW5lIFNEUkFNX3RSQ0QgICAgICBUUkNEXzIKKyNkZWZpbmUgU0RSQU1fdFdSICAgICAgIFRXUl8yCisjZW5kaWYKKyNpZiAoQ09ORklHX1NDTEtfSFogPiA4OTU1MjIzOSkgJiYgKENPTkZJR19TQ0xLX0haIDw9IDEwNDQ3NzYxMikKKyNkZWZpbmUgU0RSQU1fdFJQICAgICAgIFRSUF8yCisjZGVmaW5lIFNEUkFNX3RSUF9udW0gICAyCisjZGVmaW5lIFNEUkFNX3RSQVMgICAgICBUUkFTXzUKKyNkZWZpbmUgU0RSQU1fdFJBU19udW0gIDUKKyNkZWZpbmUgU0RSQU1fdFJDRCAgICAgIFRSQ0RfMgorI2RlZmluZSBTRFJBTV90V1IgICAgICAgVFdSXzIKKyNlbmRpZgorI2lmIChDT05GSUdfU0NMS19IWiA+IDc0NjI2ODY2KSAmJiAoQ09ORklHX1NDTEtfSFogPD0gODk1NTIyMzkpCisjZGVmaW5lIFNEUkFNX3RSUCAgICAgICBUUlBfMgorI2RlZmluZSBTRFJBTV90UlBfbnVtICAgMgorI2RlZmluZSBTRFJBTV90UkFTICAgICAgVFJBU180CisjZGVmaW5lIFNEUkFNX3RSQVNfbnVtICA0CisjZGVmaW5lIFNEUkFNX3RSQ0QgICAgICBUUkNEXzIKKyNkZWZpbmUgU0RSQU1fdFdSICAgICAgIFRXUl8yCisjZW5kaWYKKyNpZiAoQ09ORklHX1NDTEtfSFogPiA2NjY2NjY2NykgJiYgKENPTkZJR19TQ0xLX0haIDw9IDc0NjI2ODY2KQorI2RlZmluZSBTRFJBTV90UlAgICAgICAgVFJQXzIKKyNkZWZpbmUgU0RSQU1fdFJQX251bSAgIDIKKyNkZWZpbmUgU0RSQU1fdFJBUyAgICAgIFRSQVNfMworI2RlZmluZSBTRFJBTV90UkFTX251bSAgMworI2RlZmluZSBTRFJBTV90UkNEICAgICAgVFJDRF8yCisjZGVmaW5lIFNEUkFNX3RXUiAgICAgICBUV1JfMgorI2VuZGlmCisjaWYgKENPTkZJR19TQ0xLX0haID4gNTk3MDE0OTMpICYmIChDT05GSUdfU0NMS19IWiA8PSA2NjY2NjY2NykKKyNkZWZpbmUgU0RSQU1fdFJQICAgICAgIFRSUF8xCisjZGVmaW5lIFNEUkFNX3RSUF9udW0gICAxCisjZGVmaW5lIFNEUkFNX3RSQVMgICAgICBUUkFTXzQKKyNkZWZpbmUgU0RSQU1fdFJBU19udW0gIDMKKyNkZWZpbmUgU0RSQU1fdFJDRCAgICAgIFRSQ0RfMQorI2RlZmluZSBTRFJBTV90V1IgICAgICAgVFdSXzIKKyNlbmRpZgorI2lmIChDT05GSUdfU0NMS19IWiA+IDQ0Nzc2MTE5KSAmJiAoQ09ORklHX1NDTEtfSFogPD0gNTk3MDE0OTMpCisjZGVmaW5lIFNEUkFNX3RSUCAgICAgICBUUlBfMQorI2RlZmluZSBTRFJBTV90UlBfbnVtICAgMQorI2RlZmluZSBTRFJBTV90UkFTICAgICAgVFJBU18zCisjZGVmaW5lIFNEUkFNX3RSQVNfbnVtICAzCisjZGVmaW5lIFNEUkFNX3RSQ0QgICAgICBUUkNEXzEKKyNkZWZpbmUgU0RSQU1fdFdSICAgICAgIFRXUl8yCisjZW5kaWYKKyNpZiAoQ09ORklHX1NDTEtfSFogPiAyOTg1MDc0NikgJiYgKENPTkZJR19TQ0xLX0haIDw9IDQ0Nzc2MTE5KQorI2RlZmluZSBTRFJBTV90UlAgICAgICAgVFJQXzEKKyNkZWZpbmUgU0RSQU1fdFJQX251bSAgIDEKKyNkZWZpbmUgU0RSQU1fdFJBUyAgICAgIFRSQVNfMgorI2RlZmluZSBTRFJBTV90UkFTX251bSAgMgorI2RlZmluZSBTRFJBTV90UkNEICAgICAgVFJDRF8xCisjZGVmaW5lIFNEUkFNX3RXUiAgICAgICBUV1JfMgorI2VuZGlmCisjaWYgKENPTkZJR19TQ0xLX0haIDw9IDI5ODUwNzQ2KQorI2RlZmluZSBTRFJBTV90UlAgICAgICAgVFJQXzEKKyNkZWZpbmUgU0RSQU1fdFJQX251bSAgIDEKKyNkZWZpbmUgU0RSQU1fdFJBUyAgICAgIFRSQVNfMQorI2RlZmluZSBTRFJBTV90UkFTX251bSAgMQorI2RlZmluZSBTRFJBTV90UkNEICAgICAgVFJDRF8xCisjZGVmaW5lIFNEUkFNX3RXUiAgICAgICBUV1JfMgorI2VuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX01FTV9NVDQ4TEMxNk04QTJUR183NSkgfHwgXAorICAgIGRlZmluZWQoQ09ORklHX01FTV9NVDQ4TEM4TTMyQjJCNV83KQorICAvKlNEUkFNIElORk9STUFUSU9OOiAqLworI2RlZmluZSBTRFJBTV9UcmVmICA2NAkJLyogUmVmcmVzaCBwZXJpb2QgaW4gbWlsbGlzZWNvbmRzICAgKi8KKyNkZWZpbmUgU0RSQU1fTlJBICAgNDA5NgkvKiBOdW1iZXIgb2Ygcm93IGFkZHJlc3NlcyBpbiBTRFJBTSAqLworI2RlZmluZSBTRFJBTV9DTCAgICBDTF8zCisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX01FTV9NVDQ4TEMzMk04QTJfNzUpIHx8IFwKKyAgICBkZWZpbmVkKENPTkZJR19NRU1fTVQ0OExDNjRNNEEyRkJfN0UpIHx8IFwKKyAgICBkZWZpbmVkKENPTkZJR19NRU1fR0VORVJJQ19CT0FSRCkgfHwgXAorICAgIGRlZmluZWQoQ09ORklHX01FTV9NVDQ4TEMzMk0xNkEyVEdfNzUpIHx8IFwKKyAgICBkZWZpbmVkKENPTkZJR19NRU1fTVQ0OExDMTZNMTZBMlRHXzc1KSB8fCBcCisgICAgZGVmaW5lZChDT05GSUdfTUVNX01UNDhMQzMyTThBMl83NSkKKyAgLypTRFJBTSBJTkZPUk1BVElPTjogKi8KKyNkZWZpbmUgU0RSQU1fVHJlZiAgNjQJCS8qIFJlZnJlc2ggcGVyaW9kIGluIG1pbGxpc2Vjb25kcyAgICovCisjZGVmaW5lIFNEUkFNX05SQSAgIDgxOTIJLyogTnVtYmVyIG9mIHJvdyBhZGRyZXNzZXMgaW4gU0RSQU0gKi8KKyNkZWZpbmUgU0RSQU1fQ0wgICAgQ0xfMworI2VuZGlmCisKKworI2lmZGVmIENPTkZJR19CRklOX0tFUk5FTF9DTE9DS19NRU1JTklUX0NBTEMKKy8qIEVxdWF0aW9uIGZyb20gc2VjdGlvbiAxNyAocDE3LTQ2KSBvZiBCRjUzMyBIUk0gKi8KKyNkZWZpbmUgbWVtX1NEUlJDICAgICAgICgoKENPTkZJR19TQ0xLX0haIC8gMTAwMCkgKiBTRFJBTV9UcmVmKSAvIFNEUkFNX05SQSkgLSAoU0RSQU1fdFJBU19udW0gKyBTRFJBTV90UlBfbnVtKQorCisvKiBFbmFibGUgU0NMSyBPdXQgKi8KKyNkZWZpbmUgbWVtX1NER0NUTCAgICAgICAgKDB4ODAwMDAwMDAgfCBTQ1RMRSB8IFNEUkFNX0NMIHwgU0RSQU1fdFJBUyB8IFNEUkFNX3RSUCB8IFNEUkFNX3RSQ0QgfCBTRFJBTV90V1IgfCBQU1MpCisjZWxzZQorI2RlZmluZSBtZW1fU0RSUkMgCUNPTkZJR19NRU1fU0RSUkMKKyNkZWZpbmUgbWVtX1NER0NUTAlDT05GSUdfTUVNX1NER0NUTAorI2VuZGlmCisjZW5kaWYKKworCisjaWYgZGVmaW5lZChFQklVX0REUkNUTDApCisjZGVmaW5lIE1JTl9ERFJfU0NMSyh4KQkoeCooQ09ORklHX1NDTEtfSFovMTAwMC8xMDAwKS8xMDAwICsgMSkKKyNkZWZpbmUgTUFYX0REUl9TQ0xLKHgpCSh4KihDT05GSUdfU0NMS19IWi8xMDAwLzEwMDApLzEwMDApCisjZGVmaW5lIEREUl9DTEtfSFooeCkJKDEwMDAqMTAwMCoxMDAwL3gpCisKKyNpZiBkZWZpbmVkKENPTkZJR19NRU1fTVQ0NlYzMk0xNl82VCkKKyNkZWZpbmUgRERSX1NJWkUJREVWU1pfNTEyCisjZGVmaW5lIEREUl9XSURUSAlERVZXRF8xNgorI2RlZmluZSBERFJfTUFYX3RDSwkxMworCisjZGVmaW5lIEREUl90UkMJCUREUl9UUkMoTUlOX0REUl9TQ0xLKDYwKSkKKyNkZWZpbmUgRERSX3RSQVMJRERSX1RSQVMoTUlOX0REUl9TQ0xLKDQyKSkKKyNkZWZpbmUgRERSX3RSUAkJRERSX1RSUChNSU5fRERSX1NDTEsoMTUpKQorI2RlZmluZSBERFJfdFJGQwlERFJfVFJGQyhNSU5fRERSX1NDTEsoNzIpKQorI2RlZmluZSBERFJfdFJFRkkJRERSX1RSRUZJKE1BWF9ERFJfU0NMSyg3ODAwKSkKKworI2RlZmluZSBERFJfdFJDRAlERFJfVFJDRChNSU5fRERSX1NDTEsoMTUpKQorI2RlZmluZSBERFJfdFdUUglERFJfVFdUUigxKQorI2RlZmluZSBERFJfdE1SRAlERFJfVE1SRChNSU5fRERSX1NDTEsoMTIpKQorI2RlZmluZSBERFJfdFdSCQlERFJfVFdSKE1JTl9ERFJfU0NMSygxNSkpCisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX01FTV9NVDQ2VjMyTTE2XzVCKQorI2RlZmluZSBERFJfU0laRQlERVZTWl81MTIKKyNkZWZpbmUgRERSX1dJRFRICURFVldEXzE2CisjZGVmaW5lIEREUl9NQVhfdENLCTEzCisKKyNkZWZpbmUgRERSX3RSQwkJRERSX1RSQyhNSU5fRERSX1NDTEsoNTUpKQorI2RlZmluZSBERFJfdFJBUwlERFJfVFJBUyhNSU5fRERSX1NDTEsoNDApKQorI2RlZmluZSBERFJfdFJQCQlERFJfVFJQKE1JTl9ERFJfU0NMSygxNSkpCisjZGVmaW5lIEREUl90UkZDCUREUl9UUkZDKE1JTl9ERFJfU0NMSyg3MCkpCisjZGVmaW5lIEREUl90UkVGSQlERFJfVFJFRkkoTUFYX0REUl9TQ0xLKDc4MDApKQorCisjZGVmaW5lIEREUl90UkNECUREUl9UUkNEKE1JTl9ERFJfU0NMSygxNSkpCisjZGVmaW5lIEREUl90V1RSCUREUl9UV1RSKDIpCisjZGVmaW5lIEREUl90TVJECUREUl9UTVJEKE1JTl9ERFJfU0NMSygxMCkpCisjZGVmaW5lIEREUl90V1IJCUREUl9UV1IoTUlOX0REUl9TQ0xLKDE1KSkKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfTUVNX0dFTkVSSUNfQk9BUkQpCisjZGVmaW5lIEREUl9TSVpFCURFVlNaXzUxMgorI2RlZmluZSBERFJfV0lEVEgJREVWV0RfMTYKKyNkZWZpbmUgRERSX01BWF90Q0sJMTMKKworI2RlZmluZSBERFJfdFJDRAlERFJfVFJDRCgzKQorI2RlZmluZSBERFJfdFdUUglERFJfVFdUUigyKQorI2RlZmluZSBERFJfdFdSCQlERFJfVFdSKDIpCisjZGVmaW5lIEREUl90TVJECUREUl9UTVJEKDIpCisjZGVmaW5lIEREUl90UlAJCUREUl9UUlAoMykKKyNkZWZpbmUgRERSX3RSQVMJRERSX1RSQVMoNykKKyNkZWZpbmUgRERSX3RSQwkJRERSX1RSQygxMCkKKyNkZWZpbmUgRERSX3RSRkMJRERSX1RSRkMoMTIpCisjZGVmaW5lIEREUl90UkVGSQlERFJfVFJFRkkoMTI4OCkKKyNlbmRpZgorCisjaWYgKENPTkZJR19TQ0xLX0haIDwgRERSX0NMS19IWihERFJfTUFYX3RDSykpCisjIGVycm9yICJDT05GSUdfU0NMS19IWiBpcyB0b28gc21hbGwgKDxERFJfQ0xLX0haKEREUl9NQVhfdENLKSBIeikuIgorI2VsaWYoQ09ORklHX1NDTEtfSFogPD0gMTMzMzMzMzMzKQorIyBkZWZpbmUJRERSX0NMCQlDTF8yCisjZWxzZQorIyBlcnJvciAiQ09ORklHX1NDTEtfSFogaXMgdG9vIGxhcmdlICg+MTMzMzMzMzMzIEh6KS4iCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19CRklOX0tFUk5FTF9DTE9DS19NRU1JTklUX0NBTEMKKyNkZWZpbmUgbWVtX0REUkNUTDAJKEREUl90UlAgfCBERFJfdFJBUyB8IEREUl90UkMgfCBERFJfdFJGQyB8IEREUl90UkVGSSkKKyNkZWZpbmUgbWVtX0REUkNUTDEJKEREUl9EQVRXSURUSCB8IEVYVEJBTktfMSB8IEREUl9TSVpFIHwgRERSX1dJRFRIIHwgRERSX3RXVFIgXAorCQkJfCBERFJfdE1SRCB8IEREUl90V1IgfCBERFJfdFJDRCkKKyNkZWZpbmUgbWVtX0REUkNUTDIJRERSX0NMCisjZWxzZQorI2RlZmluZSBtZW1fRERSQ1RMMAlDT05GSUdfTUVNX0REUkNUTDAKKyNkZWZpbmUgbWVtX0REUkNUTDEJQ09ORklHX01FTV9ERFJDVEwxCisjZGVmaW5lIG1lbV9ERFJDVEwyCUNPTkZJR19NRU1fRERSQ1RMMgorI2VuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQgQ09ORklHX0NMS0lOX0hBTEYKKyNkZWZpbmUgQ0xLSU5fSEFMRiAgICAgICAxCisjZWxzZQorI2RlZmluZSBDTEtJTl9IQUxGICAgICAgIDAKKyNlbmRpZgorCisjaWYgZGVmaW5lZCBDT05GSUdfUExMX0JZUEFTUworI2RlZmluZSBQTExfQllQQVNTICAgICAgMQorI2Vsc2UKKyNkZWZpbmUgUExMX0JZUEFTUyAgICAgICAwCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKkN1cnJlbnRseSBOb3QgQmVpbmcgVXNlZCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZiBkZWZpbmVkKENPTkZJR19GTEFTSF9TUEVFRF9CV0FUKSAmJiBcCitkZWZpbmVkKENPTkZJR19GTEFTSF9TUEVFRF9CUkFUKSAmJiBcCitkZWZpbmVkKENPTkZJR19GTEFTSF9TUEVFRF9CSFQpICYmIFwKK2RlZmluZWQoQ09ORklHX0ZMQVNIX1NQRUVEX0JTVCkgJiYgXAorZGVmaW5lZChDT05GSUdfRkxBU0hfU1BFRURfQlRUKQorCisjZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMX1dBVCAgKChDT05GSUdfRkxBU0hfU1BFRURfQldBVCAqIDQpIC8gKDQwMDAwMDAwMDAgLyBDT05GSUdfU0NMS19IWikpICsgMQorI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTF9SQVQgICgoQ09ORklHX0ZMQVNIX1NQRUVEX0JSQVQgKiA0KSAvICg0MDAwMDAwMDAwIC8gQ09ORklHX1NDTEtfSFopKSArIDEKKyNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVExfSFQgICAoKENPTkZJR19GTEFTSF9TUEVFRF9CSFQgICogNCkgLyAoNDAwMDAwMDAwMCAvIENPTkZJR19TQ0xLX0haKSkKKyNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVExfU1QgICAoKENPTkZJR19GTEFTSF9TUEVFRF9CU1QgICogNCkgLyAoNDAwMDAwMDAwMCAvIENPTkZJR19TQ0xLX0haKSkgKyAxCisjZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMX1RUICAgKChDT05GSUdfRkxBU0hfU1BFRURfQlRUICAqIDQpIC8gKDQwMDAwMDAwMDAgLyBDT05GSUdfU0NMS19IWikpICsgMQorCisjaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1RUID4gMykKKyNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1RUICAgQjBUVF80CisjZW5kaWYKKyNpZiAoZmxhc2hfRUJJVV9BTUJDVExfVFQgPT0gMykKKyNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1RUICAgQjBUVF8zCisjZW5kaWYKKyNpZiAoZmxhc2hfRUJJVV9BTUJDVExfVFQgPT0gMikKKyNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1RUICAgQjBUVF8yCisjZW5kaWYKKyNpZiAoZmxhc2hfRUJJVV9BTUJDVExfVFQgPCAyKQorI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfVFQgICBCMFRUXzEKKyNlbmRpZgorCisjaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1NUID4gMykKKyNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1NUICAgQjBTVF80CisjZW5kaWYKKyNpZiAoZmxhc2hfRUJJVV9BTUJDVExfU1QgPT0gMykKKyNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1NUICAgQjBTVF8zCisjZW5kaWYKKyNpZiAoZmxhc2hfRUJJVV9BTUJDVExfU1QgPT0gMikKKyNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1NUICAgQjBTVF8yCisjZW5kaWYKKyNpZiAoZmxhc2hfRUJJVV9BTUJDVExfU1QgPCAyKQorI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfU1QgICBCMFNUXzEKKyNlbmRpZgorCisjaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX0hUID4gMikKKyNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX0hUICAgQjBIVF8zCisjZW5kaWYKKyNpZiAoZmxhc2hfRUJJVV9BTUJDVExfSFQgPT0gMikKKyNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX0hUICAgQjBIVF8yCisjZW5kaWYKKyNpZiAoZmxhc2hfRUJJVV9BTUJDVExfSFQgPT0gMSkKKyNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX0hUICAgQjBIVF8xCisjZW5kaWYKKyNpZiAoZmxhc2hfRUJJVV9BTUJDVExfSFQgPT0gMCAmJiBDT05GSUdfRkxBU0hfU1BFRURfQkhUID09IDApCisjZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9IVCAgIEIwSFRfMAorI2VuZGlmCisjaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX0hUID09IDAgJiYgQ09ORklHX0ZMQVNIX1NQRUVEX0JIVCAhPSAwKQorI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfSFQgICBCMEhUXzEKKyNlbmRpZgorCisjaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1dBVCA+IDE0KQorI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfV0FUICBCMFdBVF8xNQorI2VuZGlmCisjaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1dBVCA9PSAxNCkKKyNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1dBVCAgQjBXQVRfMTQKKyNlbmRpZgorI2lmIChmbGFzaF9FQklVX0FNQkNUTF9XQVQgPT0gMTMpCisjZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9XQVQgIEIwV0FUXzEzCisjZW5kaWYKKyNpZiAoZmxhc2hfRUJJVV9BTUJDVExfV0FUID09IDEyKQorI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfV0FUICBCMFdBVF8xMgorI2VuZGlmCisjaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1dBVCA9PSAxMSkKKyNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1dBVCAgQjBXQVRfMTEKKyNlbmRpZgorI2lmIChmbGFzaF9FQklVX0FNQkNUTF9XQVQgPT0gMTApCisjZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9XQVQgIEIwV0FUXzEwCisjZW5kaWYKKyNpZiAoZmxhc2hfRUJJVV9BTUJDVExfV0FUID09IDkpCisjZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9XQVQgIEIwV0FUXzkKKyNlbmRpZgorI2lmIChmbGFzaF9FQklVX0FNQkNUTF9XQVQgPT0gOCkKKyNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1dBVCAgQjBXQVRfOAorI2VuZGlmCisjaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1dBVCA9PSA3KQorI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfV0FUICBCMFdBVF83CisjZW5kaWYKKyNpZiAoZmxhc2hfRUJJVV9BTUJDVExfV0FUID09IDYpCisjZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9XQVQgIEIwV0FUXzYKKyNlbmRpZgorI2lmIChmbGFzaF9FQklVX0FNQkNUTF9XQVQgPT0gNSkKKyNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1dBVCAgQjBXQVRfNQorI2VuZGlmCisjaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1dBVCA9PSA0KQorI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfV0FUICBCMFdBVF80CisjZW5kaWYKKyNpZiAoZmxhc2hfRUJJVV9BTUJDVExfV0FUID09IDMpCisjZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9XQVQgIEIwV0FUXzMKKyNlbmRpZgorI2lmIChmbGFzaF9FQklVX0FNQkNUTF9XQVQgPT0gMikKKyNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1dBVCAgQjBXQVRfMgorI2VuZGlmCisjaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1dBVCA9PSAxKQorI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfV0FUICBCMFdBVF8xCisjZW5kaWYKKworI2lmIChmbGFzaF9FQklVX0FNQkNUTF9SQVQgPiAxNCkKKyNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1JBVCAgQjBSQVRfMTUKKyNlbmRpZgorI2lmIChmbGFzaF9FQklVX0FNQkNUTF9SQVQgPT0gMTQpCisjZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9SQVQgIEIwUkFUXzE0CisjZW5kaWYKKyNpZiAoZmxhc2hfRUJJVV9BTUJDVExfUkFUID09IDEzKQorI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfUkFUICBCMFJBVF8xMworI2VuZGlmCisjaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1JBVCA9PSAxMikKKyNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1JBVCAgQjBSQVRfMTIKKyNlbmRpZgorI2lmIChmbGFzaF9FQklVX0FNQkNUTF9SQVQgPT0gMTEpCisjZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9SQVQgIEIwUkFUXzExCisjZW5kaWYKKyNpZiAoZmxhc2hfRUJJVV9BTUJDVExfUkFUID09IDEwKQorI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfUkFUICBCMFJBVF8xMAorI2VuZGlmCisjaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1JBVCA9PSA5KQorI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfUkFUICBCMFJBVF85CisjZW5kaWYKKyNpZiAoZmxhc2hfRUJJVV9BTUJDVExfUkFUID09IDgpCisjZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9SQVQgIEIwUkFUXzgKKyNlbmRpZgorI2lmIChmbGFzaF9FQklVX0FNQkNUTF9SQVQgPT0gNykKKyNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1JBVCAgQjBSQVRfNworI2VuZGlmCisjaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1JBVCA9PSA2KQorI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfUkFUICBCMFJBVF82CisjZW5kaWYKKyNpZiAoZmxhc2hfRUJJVV9BTUJDVExfUkFUID09IDUpCisjZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9SQVQgIEIwUkFUXzUKKyNlbmRpZgorI2lmIChmbGFzaF9FQklVX0FNQkNUTF9SQVQgPT0gNCkKKyNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1JBVCAgQjBSQVRfNAorI2VuZGlmCisjaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1JBVCA9PSAzKQorI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfUkFUICBCMFJBVF8zCisjZW5kaWYKKyNpZiAoZmxhc2hfRUJJVV9BTUJDVExfUkFUID09IDIpCisjZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9SQVQgIEIwUkFUXzIKKyNlbmRpZgorI2lmIChmbGFzaF9FQklVX0FNQkNUTF9SQVQgPT0gMSkKKyNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1JBVCAgQjBSQVRfMQorI2VuZGlmCisKKyNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwICBcCisJKGZsYXNoX0VCSVVfQU1CQ1RMMF9XQVQgfCBmbGFzaF9FQklVX0FNQkNUTDBfUkFUIHwgZmxhc2hfRUJJVV9BTUJDVEwwX0hUIHwgXAorCSBmbGFzaF9FQklVX0FNQkNUTDBfU1QgfCBmbGFzaF9FQklVX0FNQkNUTDBfVFQgfCBDT05GSUdfRkxBU0hfU1BFRURfUkRZRU4pCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vbWVtX21hcC5oIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9tZW1fbWFwLmgKaW5kZXggODhkMDRhNy4uZTkyYjMxMCAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9tZW1fbWFwLmgKKysrIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9tZW1fbWFwLmgKQEAgLTksNCArOSw3OSBAQAogCiAjaW5jbHVkZSA8bWFjaC9tZW1fbWFwLmg+CiAKKyNpZm5kZWYgX19BU1NFTUJMWV9fCisKKyNpZmRlZiBDT05GSUdfU01QCitzdGF0aWMgaW5saW5lIHVsb25nIGdldF9sMV9zY3JhdGNoX3N0YXJ0X2NwdShpbnQgY3B1KQoreworCXJldHVybiAoY3B1KSA/IENPUkVCX0wxX1NDUkFUQ0hfU1RBUlQgOiBDT1JFQV9MMV9TQ1JBVENIX1NUQVJUOworfQorc3RhdGljIGlubGluZSB1bG9uZyBnZXRfbDFfY29kZV9zdGFydF9jcHUoaW50IGNwdSkKK3sKKwlyZXR1cm4gKGNwdSkgPyBDT1JFQl9MMV9DT0RFX1NUQVJUIDogQ09SRUFfTDFfQ09ERV9TVEFSVDsKK30KK3N0YXRpYyBpbmxpbmUgdWxvbmcgZ2V0X2wxX2RhdGFfYV9zdGFydF9jcHUoaW50IGNwdSkKK3sKKwlyZXR1cm4gKGNwdSkgPyBDT1JFQl9MMV9EQVRBX0FfU1RBUlQgOiBDT1JFQV9MMV9EQVRBX0FfU1RBUlQ7Cit9CitzdGF0aWMgaW5saW5lIHVsb25nIGdldF9sMV9kYXRhX2Jfc3RhcnRfY3B1KGludCBjcHUpCit7CisJcmV0dXJuIChjcHUpID8gQ09SRUJfTDFfREFUQV9CX1NUQVJUIDogQ09SRUFfTDFfREFUQV9CX1NUQVJUOworfQorCitzdGF0aWMgaW5saW5lIHVsb25nIGdldF9sMV9zY3JhdGNoX3N0YXJ0KHZvaWQpCit7CisJcmV0dXJuIGdldF9sMV9zY3JhdGNoX3N0YXJ0X2NwdShibGFja2Zpbl9jb3JlX2lkKCkpOworfQorc3RhdGljIGlubGluZSB1bG9uZyBnZXRfbDFfY29kZV9zdGFydCh2b2lkKQoreworCXJldHVybiBnZXRfbDFfY29kZV9zdGFydF9jcHUoYmxhY2tmaW5fY29yZV9pZCgpKTsKK30KK3N0YXRpYyBpbmxpbmUgdWxvbmcgZ2V0X2wxX2RhdGFfYV9zdGFydCh2b2lkKQoreworCXJldHVybiBnZXRfbDFfZGF0YV9hX3N0YXJ0X2NwdShibGFja2Zpbl9jb3JlX2lkKCkpOworfQorc3RhdGljIGlubGluZSB1bG9uZyBnZXRfbDFfZGF0YV9iX3N0YXJ0KHZvaWQpCit7CisJcmV0dXJuIGdldF9sMV9kYXRhX2Jfc3RhcnRfY3B1KGJsYWNrZmluX2NvcmVfaWQoKSk7Cit9CisKKyNlbHNlIC8qICFDT05GSUdfU01QICovCisKK3N0YXRpYyBpbmxpbmUgdWxvbmcgZ2V0X2wxX3NjcmF0Y2hfc3RhcnRfY3B1KGludCBjcHUpCit7CisJcmV0dXJuIEwxX1NDUkFUQ0hfU1RBUlQ7Cit9CitzdGF0aWMgaW5saW5lIHVsb25nIGdldF9sMV9jb2RlX3N0YXJ0X2NwdShpbnQgY3B1KQoreworCXJldHVybiBMMV9DT0RFX1NUQVJUOworfQorc3RhdGljIGlubGluZSB1bG9uZyBnZXRfbDFfZGF0YV9hX3N0YXJ0X2NwdShpbnQgY3B1KQoreworCXJldHVybiBMMV9EQVRBX0FfU1RBUlQ7Cit9CitzdGF0aWMgaW5saW5lIHVsb25nIGdldF9sMV9kYXRhX2Jfc3RhcnRfY3B1KGludCBjcHUpCit7CisJcmV0dXJuIEwxX0RBVEFfQl9TVEFSVDsKK30KK3N0YXRpYyBpbmxpbmUgdWxvbmcgZ2V0X2wxX3NjcmF0Y2hfc3RhcnQodm9pZCkKK3sKKwlyZXR1cm4gZ2V0X2wxX3NjcmF0Y2hfc3RhcnRfY3B1KDApOworfQorc3RhdGljIGlubGluZSB1bG9uZyBnZXRfbDFfY29kZV9zdGFydCh2b2lkKQoreworCXJldHVybiAgZ2V0X2wxX2NvZGVfc3RhcnRfY3B1KDApOworfQorc3RhdGljIGlubGluZSB1bG9uZyBnZXRfbDFfZGF0YV9hX3N0YXJ0KHZvaWQpCit7CisJcmV0dXJuIGdldF9sMV9kYXRhX2Ffc3RhcnRfY3B1KDApOworfQorc3RhdGljIGlubGluZSB1bG9uZyBnZXRfbDFfZGF0YV9iX3N0YXJ0KHZvaWQpCit7CisJcmV0dXJuIGdldF9sMV9kYXRhX2Jfc3RhcnRfY3B1KDApOworfQorCisjZW5kaWYgLyogQ09ORklHX1NNUCAqLworI2VuZGlmIC8qIF9fQVNTRU1CTFlfXyAqLworCiAjZW5kaWYJCQkJLyogX01FTV9NQVBfSF8gKi8KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vbW11X2NvbnRleHQuaCBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vbW11X2NvbnRleHQuaAppbmRleCAzNTU5M2RkLi45NDRlMjlmIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL21tdV9jb250ZXh0LmgKKysrIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9tbXVfY29udGV4dC5oCkBAIC0zNyw2ICszNywxMCBAQAogI2luY2x1ZGUgPGFzbS9wZ2FsbG9jLmg+CiAjaW5jbHVkZSA8YXNtL2NwbGJpbml0Lmg+CiAKKy8qIE5vdGU6IEwxIHN0YWNrcyBhcmUgQ1BVLXByaXZhdGUgdGhpbmdzLCBzbyB3ZSBibHVudGx5IGRpc2FibGUgdGhpcworICAgZmVhdHVyZSBpbiBTTVAgbW9kZSwgYW5kIHVzZSB0aGUgcGVyLUNQVSBzY3JhdGNoIFNSQU0gYmFuayBvbmx5IHRvCisgICBzdG9yZSB0aGUgUERBIGluc3RlYWQuICovCisKIGV4dGVybiB2b2lkICpjdXJyZW50X2wxX3N0YWNrX3NhdmU7CiBleHRlcm4gaW50IG5yX2wxc3RhY2tfdGFza3M7CiBleHRlcm4gdm9pZCAqbDFfc3RhY2tfYmFzZTsKQEAgLTg4LDEyICs5MiwxNSBAQAogc3RhdGljIGlubGluZSB2b2lkIHN3aXRjaF9tbShzdHJ1Y3QgbW1fc3RydWN0ICpwcmV2X21tLCBzdHJ1Y3QgbW1fc3RydWN0ICpuZXh0X21tLAogCQkJICAgICBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKIHsKKyNpZmRlZiBDT05GSUdfTVBVCisJdW5zaWduZWQgaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKyNlbmRpZgogCWlmIChwcmV2X21tID09IG5leHRfbW0pCiAJCXJldHVybjsKICNpZmRlZiBDT05GSUdfTVBVCi0JaWYgKHByZXZfbW0tPmNvbnRleHQucGFnZV9yd3hfbWFzayA9PSBjdXJyZW50X3J3eF9tYXNrKSB7Ci0JCWZsdXNoX3N3aXRjaGVkX2NwbGJzKCk7Ci0JCXNldF9tYXNrX2RjcGxicyhuZXh0X21tLT5jb250ZXh0LnBhZ2Vfcnd4X21hc2spOworCWlmIChwcmV2X21tLT5jb250ZXh0LnBhZ2Vfcnd4X21hc2sgPT0gY3VycmVudF9yd3hfbWFza1tjcHVdKSB7CisJCWZsdXNoX3N3aXRjaGVkX2NwbGJzKGNwdSk7CisJCXNldF9tYXNrX2RjcGxicyhuZXh0X21tLT5jb250ZXh0LnBhZ2Vfcnd4X21hc2ssIGNwdSk7CiAJfQogI2VuZGlmCiAKQEAgLTEzOCw5ICsxNDUsMTAgQEAKIAogc3RhdGljIGlubGluZSB2b2lkIHVwZGF0ZV9wcm90ZWN0aW9ucyhzdHJ1Y3QgbW1fc3RydWN0ICptbSkKIHsKLQlpZiAobW0tPmNvbnRleHQucGFnZV9yd3hfbWFzayA9PSBjdXJyZW50X3J3eF9tYXNrKSB7Ci0JCWZsdXNoX3N3aXRjaGVkX2NwbGJzKCk7Ci0JCXNldF9tYXNrX2RjcGxicyhtbS0+Y29udGV4dC5wYWdlX3J3eF9tYXNrKTsKKwl1bnNpZ25lZCBpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCWlmIChtbS0+Y29udGV4dC5wYWdlX3J3eF9tYXNrID09IGN1cnJlbnRfcnd4X21hc2tbY3B1XSkgeworCQlmbHVzaF9zd2l0Y2hlZF9jcGxicyhjcHUpOworCQlzZXRfbWFza19kY3BsYnMobW0tPmNvbnRleHQucGFnZV9yd3hfbWFzaywgY3B1KTsKIAl9CiB9CiAjZW5kaWYKQEAgLTE2NSw2ICsxNzMsOSBAQAogc3RhdGljIGlubGluZSB2b2lkIGRlc3Ryb3lfY29udGV4dChzdHJ1Y3QgbW1fc3RydWN0ICptbSkKIHsKIAlzdHJ1Y3Qgc3JhbV9saXN0X3N0cnVjdCAqdG1wOworI2lmZGVmIENPTkZJR19NUFUKKwl1bnNpZ25lZCBpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfQVBQX1NUQUNLX0wxCiAJaWYgKGN1cnJlbnRfbDFfc3RhY2tfc2F2ZSA9PSBtbS0+Y29udGV4dC5sMV9zdGFja19zYXZlKQpAQCAtMTc5LDggKzE5MCw4IEBACiAJCWtmcmVlKHRtcCk7CiAJfQogI2lmZGVmIENPTkZJR19NUFUKLQlpZiAoY3VycmVudF9yd3hfbWFzayA9PSBtbS0+Y29udGV4dC5wYWdlX3J3eF9tYXNrKQotCQljdXJyZW50X3J3eF9tYXNrID0gTlVMTDsKKwlpZiAoY3VycmVudF9yd3hfbWFza1tjcHVdID09IG1tLT5jb250ZXh0LnBhZ2Vfcnd4X21hc2spCisJCWN1cnJlbnRfcnd4X21hc2tbY3B1XSA9IE5VTEw7CiAJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZyltbS0+Y29udGV4dC5wYWdlX3J3eF9tYXNrLCBwYWdlX21hc2tfb3JkZXIpOwogI2VuZGlmCiB9CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL211dGV4LWRlYy5oIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9tdXRleC1kZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTM0MTUxCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9tdXRleC1kZWMuaApAQCAtMCwwICsxLDExMiBAQAorLyoKKyAqIGluY2x1ZGUvYXNtLWdlbmVyaWMvbXV0ZXgtZGVjLmgKKyAqCisgKiBHZW5lcmljIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtdXRleCBmYXN0cGF0aCwgYmFzZWQgb24gYXRvbWljCisgKiBkZWNyZW1lbnQvaW5jcmVtZW50LgorICovCisjaWZuZGVmIF9BU01fR0VORVJJQ19NVVRFWF9ERUNfSAorI2RlZmluZSBfQVNNX0dFTkVSSUNfTVVURVhfREVDX0gKKworLyoqCisgKiAgX19tdXRleF9mYXN0cGF0aF9sb2NrIC0gdHJ5IHRvIHRha2UgdGhlIGxvY2sgYnkgbW92aW5nIHRoZSBjb3VudAorICogICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gMSB0byBhIDAgdmFsdWUKKyAqICBAY291bnQ6IHBvaW50ZXIgb2YgdHlwZSBhdG9taWNfdAorICogIEBmYWlsX2ZuOiBmdW5jdGlvbiB0byBjYWxsIGlmIHRoZSBvcmlnaW5hbCB2YWx1ZSB3YXMgbm90IDEKKyAqCisgKiBDaGFuZ2UgdGhlIGNvdW50IGZyb20gMSB0byBhIHZhbHVlIGxvd2VyIHRoYW4gMSwgYW5kIGNhbGwgPGZhaWxfZm4+IGlmCisgKiBpdCB3YXNuJ3QgMSBvcmlnaW5hbGx5LiBUaGlzIGZ1bmN0aW9uIE1VU1QgbGVhdmUgdGhlIHZhbHVlIGxvd2VyIHRoYW4KKyAqIDEgZXZlbiB3aGVuIHRoZSAiMSIgYXNzZXJ0aW9uIHdhc24ndCB0cnVlLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQKK19fbXV0ZXhfZmFzdHBhdGhfbG9jayhhdG9taWNfdCAqY291bnQsIGZhc3RjYWxsIHZvaWQgKCpmYWlsX2ZuKShhdG9taWNfdCAqKSkKK3sKKwlpZiAodW5saWtlbHkoYXRvbWljX2RlY19yZXR1cm4oY291bnQpIDwgMCkpCisJCWZhaWxfZm4oY291bnQpOworCWVsc2UKKwkJc21wX21iKCk7Cit9CisKKy8qKgorICogIF9fbXV0ZXhfZmFzdHBhdGhfbG9ja19yZXR2YWwgLSB0cnkgdG8gdGFrZSB0aGUgbG9jayBieSBtb3ZpbmcgdGhlIGNvdW50CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gMSB0byBhIDAgdmFsdWUKKyAqICBAY291bnQ6IHBvaW50ZXIgb2YgdHlwZSBhdG9taWNfdAorICogIEBmYWlsX2ZuOiBmdW5jdGlvbiB0byBjYWxsIGlmIHRoZSBvcmlnaW5hbCB2YWx1ZSB3YXMgbm90IDEKKyAqCisgKiBDaGFuZ2UgdGhlIGNvdW50IGZyb20gMSB0byBhIHZhbHVlIGxvd2VyIHRoYW4gMSwgYW5kIGNhbGwgPGZhaWxfZm4+IGlmCisgKiBpdCB3YXNuJ3QgMSBvcmlnaW5hbGx5LiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgMCBpZiB0aGUgZmFzdHBhdGggc3VjY2VlZHMsCisgKiBvciBhbnl0aGluZyB0aGUgc2xvdyBwYXRoIGZ1bmN0aW9uIHJldHVybnMuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitfX211dGV4X2Zhc3RwYXRoX2xvY2tfcmV0dmFsKGF0b21pY190ICpjb3VudCwgZmFzdGNhbGwgaW50ICgqZmFpbF9mbikoYXRvbWljX3QgKikpCit7CisJaWYgKHVubGlrZWx5KGF0b21pY19kZWNfcmV0dXJuKGNvdW50KSA8IDApKQorCQlyZXR1cm4gZmFpbF9mbihjb3VudCk7CisJZWxzZSB7CisJCXNtcF9tYigpOworCQlyZXR1cm4gMDsKKwl9Cit9CisKKy8qKgorICogIF9fbXV0ZXhfZmFzdHBhdGhfdW5sb2NrIC0gdHJ5IHRvIHByb21vdGUgdGhlIGNvdW50IGZyb20gMCB0byAxCisgKiAgQGNvdW50OiBwb2ludGVyIG9mIHR5cGUgYXRvbWljX3QKKyAqICBAZmFpbF9mbjogZnVuY3Rpb24gdG8gY2FsbCBpZiB0aGUgb3JpZ2luYWwgdmFsdWUgd2FzIG5vdCAwCisgKgorICogVHJ5IHRvIHByb21vdGUgdGhlIGNvdW50IGZyb20gMCB0byAxLiBJZiBpdCB3YXNuJ3QgMCwgY2FsbCA8ZmFpbF9mbj4uCisgKiBJbiB0aGUgZmFpbHVyZSBjYXNlLCB0aGlzIGZ1bmN0aW9uIGlzIGFsbG93ZWQgdG8gZWl0aGVyIHNldCB0aGUgdmFsdWUgdG8KKyAqIDEsIG9yIHRvIHNldCBpdCB0byBhIHZhbHVlIGxvd2VyIHRoYW4gMS4KKyAqCisgKiBJZiB0aGUgaW1wbGVtZW50YXRpb24gc2V0cyBpdCB0byBhIHZhbHVlIG9mIGxvd2VyIHRoYW4gMSwgdGhlbiB0aGUKKyAqIF9fbXV0ZXhfc2xvd3BhdGhfbmVlZHNfdG9fdW5sb2NrKCkgbWFjcm8gbmVlZHMgdG8gcmV0dXJuIDEsIGl0IG5lZWRzCisgKiB0byByZXR1cm4gMCBvdGhlcndpc2UuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorX19tdXRleF9mYXN0cGF0aF91bmxvY2soYXRvbWljX3QgKmNvdW50LCBmYXN0Y2FsbCB2b2lkICgqZmFpbF9mbikoYXRvbWljX3QgKikpCit7CisJc21wX21iKCk7CisJaWYgKHVubGlrZWx5KGF0b21pY19pbmNfcmV0dXJuKGNvdW50KSA8PSAwKSkKKwkJZmFpbF9mbihjb3VudCk7Cit9CisKKyNkZWZpbmUgX19tdXRleF9zbG93cGF0aF9uZWVkc190b191bmxvY2soKQkJMQorCisvKioKKyAqIF9fbXV0ZXhfZmFzdHBhdGhfdHJ5bG9jayAtIHRyeSB0byBhY3F1aXJlIHRoZSBtdXRleCwgd2l0aG91dCB3YWl0aW5nCisgKgorICogIEBjb3VudDogcG9pbnRlciBvZiB0eXBlIGF0b21pY190CisgKiAgQGZhaWxfZm46IGZhbGxiYWNrIGZ1bmN0aW9uCisgKgorICogQ2hhbmdlIHRoZSBjb3VudCBmcm9tIDEgdG8gYSB2YWx1ZSBsb3dlciB0aGFuIDEsIGFuZCByZXR1cm4gMCAoZmFpbHVyZSkKKyAqIGlmIGl0IHdhc24ndCAxIG9yaWdpbmFsbHksIG9yIHJldHVybiAxIChzdWNjZXNzKSBvdGhlcndpc2UuIFRoaXMgZnVuY3Rpb24KKyAqIE1VU1QgbGVhdmUgdGhlIHZhbHVlIGxvd2VyIHRoYW4gMSBldmVuIHdoZW4gdGhlICIxIiBhc3NlcnRpb24gd2Fzbid0IHRydWUuCisgKiBBZGRpdGlvbmFsbHksIGlmIHRoZSB2YWx1ZSB3YXMgPCAwIG9yaWdpbmFsbHksIHRoaXMgZnVuY3Rpb24gbXVzdCBub3QgbGVhdmUKKyAqIGl0IHRvIDAgb24gZmFpbHVyZS4KKyAqCisgKiBJZiB0aGUgYXJjaGl0ZWN0dXJlIGhhcyBubyBlZmZlY3RpdmUgdHJ5bG9jayB2YXJpYW50LCBpdCBzaG91bGQgY2FsbCB0aGUKKyAqIDxmYWlsX2ZuPiBzcGlubG9jay1iYXNlZCB0cnlsb2NrIHZhcmlhbnQgdW5jb25kaXRpb25hbGx5LgorICovCitzdGF0aWMgaW5saW5lIGludAorX19tdXRleF9mYXN0cGF0aF90cnlsb2NrKGF0b21pY190ICpjb3VudCwgaW50ICgqZmFpbF9mbikoYXRvbWljX3QgKikpCit7CisJLyoKKwkgKiBXZSBoYXZlIHR3byB2YXJpYW50cyBoZXJlLiBUaGUgY21weGNoZyBiYXNlZCBvbmUgaXMgdGhlIGJlc3Qgb25lCisJICogYmVjYXVzZSBpdCBuZXZlciBpbmR1Y2UgYSBmYWxzZSBjb250ZW50aW9uIHN0YXRlLiAgSXQgaXMgaW5jbHVkZWQKKwkgKiBoZXJlIGJlY2F1c2UgYXJjaGl0ZWN0dXJlcyB1c2luZyB0aGUgaW5jL2RlYyBhbGdvcml0aG1zIG92ZXIgdGhlCisJICogeGNoZyBvbmVzIGFyZSBtdWNoIG1vcmUgbGlrZWx5IHRvIHN1cHBvcnQgY21weGNoZyBuYXRpdmVseS4KKwkgKgorCSAqIElmIG5vdCB3ZSBmYWxsIGJhY2sgdG8gdGhlIHNwaW5sb2NrIGJhc2VkIHZhcmlhbnQgLSB0aGF0IGlzCisJICoganVzdCBhcyBlZmZpY2llbnQgKGFuZCBzaW1wbGVyKSBhcyBhICdkZXN0cnVjdGl2ZScgcHJvYmluZyBvZgorCSAqIHRoZSBtdXRleCBzdGF0ZSB3b3VsZCBiZS4KKwkgKi8KKyNpZmRlZiBfX0hBVkVfQVJDSF9DTVBYQ0hHCisJaWYgKGxpa2VseShhdG9taWNfY21weGNoZyhjb3VudCwgMSwgMCkgPT0gMSkpIHsKKwkJc21wX21iKCk7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKKyNlbHNlCisJcmV0dXJuIGZhaWxfZm4oY291bnQpOworI2VuZGlmCit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9tdXRleC5oIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9tdXRleC5oCmluZGV4IDQ1OGMxZjcuLjVkMzk5MjUgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vbXV0ZXguaAorKysgYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL211dGV4LmgKQEAgLTYsNCArNiw2NyBAQAogICogaW1wbGVtZW50YXRpb24uIChzZWUgYXNtLWdlbmVyaWMvbXV0ZXgteGNoZy5oIGZvciBkZXRhaWxzKQogICovCiAKKyNpZm5kZWYgX0FTTV9NVVRFWF9ICisjZGVmaW5lIF9BU01fTVVURVhfSAorCisjaWZuZGVmIENPTkZJR19TTVAKICNpbmNsdWRlIDxhc20tZ2VuZXJpYy9tdXRleC1kZWMuaD4KKyNlbHNlCisKK3N0YXRpYyBpbmxpbmUgdm9pZAorX19tdXRleF9mYXN0cGF0aF9sb2NrKGF0b21pY190ICpjb3VudCwgdm9pZCAoKmZhaWxfZm4pKGF0b21pY190ICopKQoreworCWlmICh1bmxpa2VseShhdG9taWNfZGVjX3JldHVybihjb3VudCkgPCAwKSkKKwkJZmFpbF9mbihjb3VudCk7CisJZWxzZQorCQlzbXBfbWIoKTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK19fbXV0ZXhfZmFzdHBhdGhfbG9ja19yZXR2YWwoYXRvbWljX3QgKmNvdW50LCBpbnQgKCpmYWlsX2ZuKShhdG9taWNfdCAqKSkKK3sKKwlpZiAodW5saWtlbHkoYXRvbWljX2RlY19yZXR1cm4oY291bnQpIDwgMCkpCisJCXJldHVybiBmYWlsX2ZuKGNvdW50KTsKKwllbHNlIHsKKwkJc21wX21iKCk7CisJCXJldHVybiAwOworCX0KK30KKworc3RhdGljIGlubGluZSB2b2lkCitfX211dGV4X2Zhc3RwYXRoX3VubG9jayhhdG9taWNfdCAqY291bnQsIHZvaWQgKCpmYWlsX2ZuKShhdG9taWNfdCAqKSkKK3sKKwlzbXBfbWIoKTsKKwlpZiAodW5saWtlbHkoYXRvbWljX2luY19yZXR1cm4oY291bnQpIDw9IDApKQorCQlmYWlsX2ZuKGNvdW50KTsKK30KKworI2RlZmluZSBfX211dGV4X3Nsb3dwYXRoX25lZWRzX3RvX3VubG9jaygpCQkxCisKK3N0YXRpYyBpbmxpbmUgaW50CitfX211dGV4X2Zhc3RwYXRoX3RyeWxvY2soYXRvbWljX3QgKmNvdW50LCBpbnQgKCpmYWlsX2ZuKShhdG9taWNfdCAqKSkKK3sKKwkvKgorCSAqIFdlIGhhdmUgdHdvIHZhcmlhbnRzIGhlcmUuIFRoZSBjbXB4Y2hnIGJhc2VkIG9uZSBpcyB0aGUgYmVzdCBvbmUKKwkgKiBiZWNhdXNlIGl0IG5ldmVyIGluZHVjZSBhIGZhbHNlIGNvbnRlbnRpb24gc3RhdGUuICBJdCBpcyBpbmNsdWRlZAorCSAqIGhlcmUgYmVjYXVzZSBhcmNoaXRlY3R1cmVzIHVzaW5nIHRoZSBpbmMvZGVjIGFsZ29yaXRobXMgb3ZlciB0aGUKKwkgKiB4Y2hnIG9uZXMgYXJlIG11Y2ggbW9yZSBsaWtlbHkgdG8gc3VwcG9ydCBjbXB4Y2hnIG5hdGl2ZWx5LgorCSAqCisJICogSWYgbm90IHdlIGZhbGwgYmFjayB0byB0aGUgc3BpbmxvY2sgYmFzZWQgdmFyaWFudCAtIHRoYXQgaXMKKwkgKiBqdXN0IGFzIGVmZmljaWVudCAoYW5kIHNpbXBsZXIpIGFzIGEgJ2Rlc3RydWN0aXZlJyBwcm9iaW5nIG9mCisJICogdGhlIG11dGV4IHN0YXRlIHdvdWxkIGJlLgorCSAqLworI2lmZGVmIF9fSEFWRV9BUkNIX0NNUFhDSEcKKwlpZiAobGlrZWx5KGF0b21pY19jbXB4Y2hnKGNvdW50LCAxLCAwKSA9PSAxKSkgeworCQlzbXBfbWIoKTsKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworI2Vsc2UKKwlyZXR1cm4gZmFpbF9mbihjb3VudCk7CisjZW5kaWYKK30KKworI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9wZGEuaCBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vcGRhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQ4ZDRhNwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vcGRhLmgKQEAgLTAsMCArMSw3MCBAQAorLyoKKyAqIEZpbGU6ICAgICAgICAgYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9wZGEuaAorICogQXV0aG9yOiAgICAgICBQaGlsaXBwZSBHZXJ1bSA8cnBtQHhlbm9tYWkub3JnPgorICoKKyAqICAgICAgICAgICAgICAgQ29weXJpZ2h0IDIwMDcgQW5hbG9nIERldmljZXMgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIHRoZSBmaWxlIENPUFlJTkcsIG9yIHdyaXRlCisgKiB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqLworCisjaWZuZGVmIF9BU01fQkxBQ0tGSU5fUERBX0gKKyNkZWZpbmUgX0FTTV9CTEFDS0ZJTl9QREFfSAorCisjaW5jbHVkZSA8bWFjaC9hbm9tYWx5Lmg+CisKKyNpZm5kZWYgX19BU1NFTUJMWV9fCisKK3N0cnVjdCBibGFja2Zpbl9wZGEgewkJCS8qIFBlci1wcm9jZXNzb3IgRGF0YSBBcmVhICovCisJc3RydWN0IGJsYWNrZmluX3BkYSAqbmV4dDsKKworCXVuc2lnbmVkIGxvbmcgc3lzY2ZnOworI2lmZGVmIENPTkZJR19TTVAKKwl1bnNpZ25lZCBsb25nIGltYXNrOwkJLyogQ3VycmVudCBJTUFTSyB2YWx1ZSAqLworI2VuZGlmCisKKwl1bnNpZ25lZCBsb25nICppcGR0OwkJLyogU3RhcnQgb2Ygc3dpdGNoYWJsZSBJLUNQTEIgdGFibGUgKi8KKwl1bnNpZ25lZCBsb25nICppcGR0X3N3YXBjb3VudDsJLyogTnVtYmVyIG9mIHN3YXBzIGluIGlwZHQgKi8KKwl1bnNpZ25lZCBsb25nICpkcGR0OwkJLyogU3RhcnQgb2Ygc3dpdGNoYWJsZSBELUNQTEIgdGFibGUgKi8KKwl1bnNpZ25lZCBsb25nICpkcGR0X3N3YXBjb3VudDsJLyogTnVtYmVyIG9mIHN3YXBzIGluIGRwZHQgKi8KKworCS8qCisJICogU2luZ2xlIGluc3RydWN0aW9ucyBjYW4gaGF2ZSBtdWx0aXBsZSBmYXVsdHMsIHdoaWNoCisJICogbmVlZCB0byBiZSBoYW5kbGVkIGJ5IHRyYXBzLmMsIGluIGlycTUuIFdlIHN0b3JlCisJICogdGhlIGV4Y2VwdGlvbiBjYXVzZSB0byBlbnN1cmUgd2UgZG9uJ3QgbWlzcyBhCisJICogZG91YmxlIGZhdWx0IGNvbmRpdGlvbgorCSAqLworCXVuc2lnbmVkIGxvbmcgZXhfaXB0cjsKKwl1bnNpZ25lZCBsb25nIGV4X29wdHI7CisJdW5zaWduZWQgbG9uZyBleF9idWZbNF07CisJdW5zaWduZWQgbG9uZyBleF9pbWFzazsJCS8qIFNhdmVkIGltYXNrIGZyb20gZXhjZXB0aW9uICovCisJdW5zaWduZWQgbG9uZyAqZXhfc3RhY2s7CS8qIEV4Y2VwdGlvbiBzdGFjayBzcGFjZSAqLworCisjaWZkZWYgQU5PTUFMWV8wNTAwMDI2MQorCXVuc2lnbmVkIGxvbmcgbGFzdF9jcGxiX2ZhdWx0X3JldHg7CisjZW5kaWYKKwl1bnNpZ25lZCBsb25nIGRjcGxiX2ZhdWx0X2FkZHI7CisJdW5zaWduZWQgbG9uZyBpY3BsYl9mYXVsdF9hZGRyOworCXVuc2lnbmVkIGxvbmcgcmV0eDsKKwl1bnNpZ25lZCBsb25nIHNlcXN0YXQ7Cit9OworCitleHRlcm4gc3RydWN0IGJsYWNrZmluX3BkYSBjcHVfcGRhW107CisKK3ZvaWQgcmVzZXJ2ZV9wZGEodm9pZCk7CisKKyNlbmRpZgkvKiBfX0FTU0VNQkxZX18gKi8KKworI2VuZGlmIC8qIF9BU01fQkxBQ0tGSU5fUERBX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vcGVyY3B1LmggYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3BlcmNwdS5oCmluZGV4IDc4ZGQ2MWYuLjc5N2MwYzEgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vcGVyY3B1LmgKKysrIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9wZXJjcHUuaApAQCAtMyw0ICszLDE0IEBACiAKICNpbmNsdWRlIDxhc20tZ2VuZXJpYy9wZXJjcHUuaD4KIAotI2VuZGlmCQkJCS8qIF9fQVJDSF9CTEFDS0ZJTl9QRVJDUFVfXyAqLworI2lmZGVmIENPTkZJR19NT0RVTEVTCisjZGVmaW5lIFBFUkNQVV9NT0RVTEVfUkVTRVJWRSA4MTkyCisjZWxzZQorI2RlZmluZSBQRVJDUFVfTU9EVUxFX1JFU0VSVkUgMAorI2VuZGlmCisKKyNkZWZpbmUgUEVSQ1BVX0VOT1VHSF9ST09NIFwKKwkoQUxJR04oX19wZXJfY3B1X2VuZCAtIF9fcGVyX2NwdV9zdGFydCwgU01QX0NBQ0hFX0JZVEVTKSArIFwKKwkgUEVSQ1BVX01PRFVMRV9SRVNFUlZFKQorCisjZW5kaWYJLyogX19BUkNIX0JMQUNLRklOX1BFUkNQVV9fICovCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3BndGFibGUuaCBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vcGd0YWJsZS5oCmluZGV4IGYxMTY4NGUuLjc4M2M4ZjcgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vcGd0YWJsZS5oCisrKyBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vcGd0YWJsZS5oCkBAIC0yOSw2ICsyOSw3IEBACiAjZGVmaW5lIFBBR0VfQ09QWQkJX19wZ3Byb3QoMCkJLyogdGhlc2UgbWVhbiBub3RoaW5nIHRvIE5PX01NICovCiAjZGVmaW5lIFBBR0VfUkVBRE9OTFkJCV9fcGdwcm90KDApCS8qIHRoZXNlIG1lYW4gbm90aGluZyB0byBOT19NTSAqLwogI2RlZmluZSBQQUdFX0tFUk5FTAkJX19wZ3Byb3QoMCkJLyogdGhlc2UgbWVhbiBub3RoaW5nIHRvIE5PX01NICovCisjZGVmaW5lIHBncHJvdF9ub25jYWNoZWQocHJvdCkJKHByb3QpCiAKIGV4dGVybiB2b2lkIHBhZ2luZ19pbml0KHZvaWQpOwogCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3Byb2Nlc3Nvci5oIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9wcm9jZXNzb3IuaAppbmRleCBlM2U5YjQxLi4wZWVjZTIzIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3Byb2Nlc3Nvci5oCisrKyBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vcHJvY2Vzc29yLmgKQEAgLTI0LDYgKzI0LDE0IEBACiAJX19hc21fXyBfX3ZvbGF0aWxlX18oInVzcCA9ICUwO1xuXHQiOjoiZGEiKHVzcCkpOwogfQogCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgX19nZXRfU1Aodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIHNwOworCisJX19hc21fXyBfX3ZvbGF0aWxlX18oIiUwID0gc3A7XG5cdCIgOiAiPWRhIihzcCkpOworCXJldHVybiBzcDsKK30KKwogLyoKICAqIFVzZXIgc3BhY2UgcHJvY2VzcyBzaXplOiAxc3QgYnl0ZSBiZXlvbmQgdXNlciBhZGRyZXNzIHNwYWNlLgogICogRmFpcmx5IG1lYW5pbmdsZXNzIG9uIG5vbW11LiAgUGFydHMgb2YgdXNlciBwcm9ncmFtcyBjYW4gYmUgc2NhdHRlcmVkCkBAIC01Nyw2ICs2NSw3IEBACiAgKiBwYXNzIHRoZSBkYXRhIHNlZ21lbnQgaW50byB1c2VyIHByb2dyYW1zIGlmIGl0IGV4aXN0cywKICAqIGl0IGNhbid0IGh1cnQgYW55dGhpbmcgYXMgZmFyIGFzIEkgY2FuIHRlbGwKICAqLworI2lmbmRlZiBDT05GSUdfU01QCiAjZGVmaW5lIHN0YXJ0X3RocmVhZChfcmVncywgX3BjLCBfdXNwKQkJCQkJXAogZG8gewkJCQkJCQkJCVwKIAlzZXRfZnMoVVNFUl9EUyk7CQkJCQkJXApAQCAtNzAsNiArNzksMTYgQEAKIAkJc2l6ZW9mKCpMMV9TQ1JBVENIX1RBU0tfSU5GTykpOwkJCQlcCiAJd3J1c3AoX3VzcCk7CQkJCQkJCVwKIH0gd2hpbGUoMCkKKyNlbHNlCisjZGVmaW5lIHN0YXJ0X3RocmVhZChfcmVncywgX3BjLCBfdXNwKQkJCQkJXAorZG8gewkJCQkJCQkJCVwKKwlzZXRfZnMoVVNFUl9EUyk7CQkJCQkJXAorCShfcmVncyktPnBjID0gKF9wYyk7CQkJCQkJXAorCWlmIChjdXJyZW50LT5tbSkJCQkJCQlcCisJCShfcmVncyktPnA1ID0gY3VycmVudC0+bW0tPnN0YXJ0X2RhdGE7CQkJXAorCXdydXNwKF91c3ApOwkJCQkJCQlcCit9IHdoaWxlICgwKQorI2VuZGlmCiAKIC8qIEZvcndhcmQgZGVjbGFyYXRpb24sIGEgc3RyYW5nZSBDIHRoaW5nICovCiBzdHJ1Y3QgdGFza19zdHJ1Y3Q7CkBAIC0xMDYsNyArMTI1LDggQEAKIAllaXA7IH0pCiAjZGVmaW5lCUtTVEtfRVNQKHRzaykJKCh0c2spID09IGN1cnJlbnQgPyByZHVzcCgpIDogKHRzayktPnRocmVhZC51c3ApCiAKLSNkZWZpbmUgY3B1X3JlbGF4KCkgICAgCWJhcnJpZXIoKQorI2RlZmluZSBjcHVfcmVsYXgoKSAgICAJc21wX21iKCkKKwogCiAvKiBHZXQgdGhlIFNpbGljb24gUmV2aXNpb24gb2YgdGhlIGNoaXAgKi8KIHN0YXRpYyBpbmxpbmUgdWludDMyX3QgX19wdXJlIGJmaW5fcmV2aWQodm9pZCkKQEAgLTEzNyw3ICsxNTcsMTEgQEAKIHN0YXRpYyBpbmxpbmUgdWludDE2X3QgX19wdXJlIGJmaW5fY3B1aWQodm9pZCkKIHsKIAlyZXR1cm4gKGJmaW5fcmVhZF9DSElQSUQoKSAmIENISVBJRF9GQU1JTFkpID4+IDEyOworfQogCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IF9fcHVyZSBiZmluX2RzcGlkKHZvaWQpCit7CisJcmV0dXJuIGJmaW5fcmVhZF9EU1BJRCgpOwogfQogCiBzdGF0aWMgaW5saW5lIHVpbnQzMl90IF9fcHVyZSBiZmluX2NvbXBpbGVkX3JldmlkKHZvaWQpCkBAIC0xNTQsNiArMTc4LDggQEAKIAlyZXR1cm4gNDsKICNlbGlmIGRlZmluZWQoQ09ORklHX0JGX1JFVl8wXzUpCiAJcmV0dXJuIDU7CisjZWxpZiBkZWZpbmVkKENPTkZJR19CRl9SRVZfMF82KQorCXJldHVybiA2OwogI2VsaWYgZGVmaW5lZChDT05GSUdfQkZfUkVWX0FOWSkKIAlyZXR1cm4gMHhmZmZmOwogI2Vsc2UKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vcmVib290LmggYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3JlYm9vdC5oCmluZGV4IDZkNDQ4YjUuLjQ4NTZkNjIgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vcmVib290LmgKKysrIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9yZWJvb3QuaApAQCAtMSw3ICsxLDcgQEAKIC8qCi0gKiBpbmNsdWRlL2FzbS1ibGFja2Zpbi9yZWJvb3QuaCAtIHNodXRkb3duL3JlYm9vdCBoZWFkZXIKKyAqIHJlYm9vdC5oIC0gc2h1dGRvd24vcmVib290IGhlYWRlcgogICoKLSAqIENvcHlyaWdodCAyMDA0LTIwMDcgQW5hbG9nIERldmljZXMgSW5jLgorICogQ29weXJpZ2h0IDIwMDQtMjAwOCBBbmFsb2cgRGV2aWNlcyBJbmMuCiAgKgogICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgogICovCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3J3bG9jay5oIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9yd2xvY2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTcyNGIzCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9yd2xvY2suaApAQCAtMCwwICsxLDYgQEAKKyNpZm5kZWYgX0FTTV9CTEFDS0ZJTl9SV0xPQ0tfSAorI2RlZmluZSBfQVNNX0JMQUNLRklOX1JXTE9DS19ICisKKyNkZWZpbmUgUldfTE9DS19CSUFTCTB4MDEwMDAwMDAKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3NlcmlhbC5oIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9zZXJpYWwuaAppbmRleCA5OTRkZDg2Li4zYTQ3NjA2IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3NlcmlhbC5oCisrKyBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vc2VyaWFsLmgKQEAgLTMsMyArMyw0IEBACiAgKi8KIAogI2RlZmluZSBTRVJJQUxfRVhUUkFfSVJRX0ZMQUdTIElSUUZfVFJJR0dFUl9ISUdICisjZGVmaW5lIEJBU0VfQkFVRCAoMTg0MzIwMCAvIDE2KQpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9zbXAuaCBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vc21wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTE4ZGVlZQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vc21wLmgKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIEZpbGU6ICAgICAgICAgYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9zbXAuaAorICogQXV0aG9yOiAgICAgICBQaGlsaXBwZSBHZXJ1bSA8cnBtQHhlbm9tYWkub3JnPgorICoKKyAqICAgICAgICAgICAgICAgQ29weXJpZ2h0IDIwMDcgQW5hbG9nIERldmljZXMgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIHRoZSBmaWxlIENPUFlJTkcsIG9yIHdyaXRlCisgKiB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqLworCisjaWZuZGVmIF9fQVNNX0JMQUNLRklOX1NNUF9ICisjZGVmaW5lIF9fQVNNX0JMQUNLRklOX1NNUF9ICisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90aHJlYWRzLmg+CisjaW5jbHVkZSA8bGludXgvY3B1bWFzay5oPgorI2luY2x1ZGUgPGxpbnV4L2NhY2hlLmg+CisjaW5jbHVkZSA8YXNtL2JsYWNrZmluLmg+CisjaW5jbHVkZSA8bWFjaC9zbXAuaD4KKworI2RlZmluZSByYXdfc21wX3Byb2Nlc3Nvcl9pZCgpICBibGFja2Zpbl9jb3JlX2lkKCkKKworZXh0ZXJuIGNoYXIgY29yZWJfdHJhbXBvbGluZV9zdGFydCwgY29yZWJfdHJhbXBvbGluZV9lbmQ7CisKK3N0cnVjdCBjb3JlbG9ja19zbG90IHsKKwlpbnQgbG9jazsKK307CisKK3ZvaWQgc21wX2ljYWNoZV9mbHVzaF9yYW5nZV9vdGhlcnModW5zaWduZWQgbG9uZyBzdGFydCwKKwkJCQkgICB1bnNpZ25lZCBsb25nIGVuZCk7CisKKyNlbmRpZiAvKiAhX19BU01fQkxBQ0tGSU5fU01QX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vc3BpbmxvY2suaCBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vc3BpbmxvY2suaAppbmRleCA2NGU5MDhhLi4wMjQ5YWMzIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3NwaW5sb2NrLmgKKysrIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9zcGlubG9jay5oCkBAIC0xLDYgKzEsODkgQEAKICNpZm5kZWYgX19CRklOX1NQSU5MT0NLX0gKICNkZWZpbmUgX19CRklOX1NQSU5MT0NLX0gKIAotI2Vycm9yIGJsYWNrZmluIGFyY2hpdGVjdHVyZSBkb2VzIG5vdCBzdXBwb3J0IFNNUCBzcGluIGxvY2sgeWV0CisjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgogCi0jZW5kaWYKK2FzbWxpbmthZ2UgaW50IF9fcmF3X3NwaW5faXNfbG9ja2VkX2FzbSh2b2xhdGlsZSBpbnQgKnB0cik7Cithc21saW5rYWdlIHZvaWQgX19yYXdfc3Bpbl9sb2NrX2FzbSh2b2xhdGlsZSBpbnQgKnB0cik7Cithc21saW5rYWdlIGludCBfX3Jhd19zcGluX3RyeWxvY2tfYXNtKHZvbGF0aWxlIGludCAqcHRyKTsKK2FzbWxpbmthZ2Ugdm9pZCBfX3Jhd19zcGluX3VubG9ja19hc20odm9sYXRpbGUgaW50ICpwdHIpOworYXNtbGlua2FnZSB2b2lkIF9fcmF3X3JlYWRfbG9ja19hc20odm9sYXRpbGUgaW50ICpwdHIpOworYXNtbGlua2FnZSBpbnQgX19yYXdfcmVhZF90cnlsb2NrX2FzbSh2b2xhdGlsZSBpbnQgKnB0cik7Cithc21saW5rYWdlIHZvaWQgX19yYXdfcmVhZF91bmxvY2tfYXNtKHZvbGF0aWxlIGludCAqcHRyKTsKK2FzbWxpbmthZ2Ugdm9pZCBfX3Jhd193cml0ZV9sb2NrX2FzbSh2b2xhdGlsZSBpbnQgKnB0cik7Cithc21saW5rYWdlIGludCBfX3Jhd193cml0ZV90cnlsb2NrX2FzbSh2b2xhdGlsZSBpbnQgKnB0cik7Cithc21saW5rYWdlIHZvaWQgX19yYXdfd3JpdGVfdW5sb2NrX2FzbSh2b2xhdGlsZSBpbnQgKnB0cik7CisKK3N0YXRpYyBpbmxpbmUgaW50IF9fcmF3X3NwaW5faXNfbG9ja2VkKHJhd19zcGlubG9ja190ICpsb2NrKQoreworCXJldHVybiBfX3Jhd19zcGluX2lzX2xvY2tlZF9hc20oJmxvY2stPmxvY2spOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgX19yYXdfc3Bpbl9sb2NrKHJhd19zcGlubG9ja190ICpsb2NrKQoreworCV9fcmF3X3NwaW5fbG9ja19hc20oJmxvY2stPmxvY2spOworfQorCisjZGVmaW5lIF9fcmF3X3NwaW5fbG9ja19mbGFncyhsb2NrLCBmbGFncykgX19yYXdfc3Bpbl9sb2NrKGxvY2spCisKK3N0YXRpYyBpbmxpbmUgaW50IF9fcmF3X3NwaW5fdHJ5bG9jayhyYXdfc3BpbmxvY2tfdCAqbG9jaykKK3sKKwlyZXR1cm4gX19yYXdfc3Bpbl90cnlsb2NrX2FzbSgmbG9jay0+bG9jayk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3Jhd19zcGluX3VubG9jayhyYXdfc3BpbmxvY2tfdCAqbG9jaykKK3sKKwlfX3Jhd19zcGluX3VubG9ja19hc20oJmxvY2stPmxvY2spOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgX19yYXdfc3Bpbl91bmxvY2tfd2FpdChyYXdfc3BpbmxvY2tfdCAqbG9jaykKK3sKKwl3aGlsZSAoX19yYXdfc3Bpbl9pc19sb2NrZWQobG9jaykpCisJCWNwdV9yZWxheCgpOworfQorCitzdGF0aWMgaW5saW5lIGludCBfX3Jhd19yZWFkX2Nhbl9sb2NrKHJhd19yd2xvY2tfdCAqcncpCit7CisJcmV0dXJuIF9fcmF3X3VuY2FjaGVkX2ZldGNoX2FzbSgmcnctPmxvY2spID4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgX19yYXdfd3JpdGVfY2FuX2xvY2socmF3X3J3bG9ja190ICpydykKK3sKKwlyZXR1cm4gX19yYXdfdW5jYWNoZWRfZmV0Y2hfYXNtKCZydy0+bG9jaykgPT0gUldfTE9DS19CSUFTOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgX19yYXdfcmVhZF9sb2NrKHJhd19yd2xvY2tfdCAqcncpCit7CisJX19yYXdfcmVhZF9sb2NrX2FzbSgmcnctPmxvY2spOworfQorCitzdGF0aWMgaW5saW5lIGludCBfX3Jhd19yZWFkX3RyeWxvY2socmF3X3J3bG9ja190ICpydykKK3sKKwlyZXR1cm4gX19yYXdfcmVhZF90cnlsb2NrX2FzbSgmcnctPmxvY2spOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgX19yYXdfcmVhZF91bmxvY2socmF3X3J3bG9ja190ICpydykKK3sKKwlfX3Jhd19yZWFkX3VubG9ja19hc20oJnJ3LT5sb2NrKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIF9fcmF3X3dyaXRlX2xvY2socmF3X3J3bG9ja190ICpydykKK3sKKwlfX3Jhd193cml0ZV9sb2NrX2FzbSgmcnctPmxvY2spOworfQorCitzdGF0aWMgaW5saW5lIGludCBfX3Jhd193cml0ZV90cnlsb2NrKHJhd19yd2xvY2tfdCAqcncpCit7CisJcmV0dXJuIF9fcmF3X3dyaXRlX3RyeWxvY2tfYXNtKCZydy0+bG9jayk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3Jhd193cml0ZV91bmxvY2socmF3X3J3bG9ja190ICpydykKK3sKKwlfX3Jhd193cml0ZV91bmxvY2tfYXNtKCZydy0+bG9jayk7Cit9CisKKyNkZWZpbmUgX3Jhd19zcGluX3JlbGF4KGxvY2spICAJY3B1X3JlbGF4KCkKKyNkZWZpbmUgX3Jhd19yZWFkX3JlbGF4KGxvY2spCWNwdV9yZWxheCgpCisjZGVmaW5lIF9yYXdfd3JpdGVfcmVsYXgobG9jaykJY3B1X3JlbGF4KCkKKworI2VuZGlmIC8qICAhX19CRklOX1NQSU5MT0NLX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vc3BpbmxvY2tfdHlwZXMuaCBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vc3BpbmxvY2tfdHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMWUzYzRjCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9zcGlubG9ja190eXBlcy5oCkBAIC0wLDAgKzEsMjIgQEAKKyNpZm5kZWYgX19BU01fU1BJTkxPQ0tfVFlQRVNfSAorI2RlZmluZSBfX0FTTV9TUElOTE9DS19UWVBFU19ICisKKyNpZm5kZWYgX19MSU5VWF9TUElOTE9DS19UWVBFU19ICisjIGVycm9yICJwbGVhc2UgZG9uJ3QgaW5jbHVkZSB0aGlzIGZpbGUgZGlyZWN0bHkiCisjZW5kaWYKKworI2luY2x1ZGUgPGFzbS9yd2xvY2suaD4KKwordHlwZWRlZiBzdHJ1Y3QgeworCXZvbGF0aWxlIHVuc2lnbmVkIGludCBsb2NrOworfSByYXdfc3BpbmxvY2tfdDsKKworI2RlZmluZSBfX1JBV19TUElOX0xPQ0tfVU5MT0NLRUQJeyAwIH0KKwordHlwZWRlZiBzdHJ1Y3QgeworCXZvbGF0aWxlIHVuc2lnbmVkIGludCBsb2NrOworfSByYXdfcndsb2NrX3Q7CisKKyNkZWZpbmUgX19SQVdfUldfTE9DS19VTkxPQ0tFRAkJeyBSV19MT0NLX0JJQVMgfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vc3dhYi5oIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9zd2FiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjlhMDUxYgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vc3dhYi5oCkBAIC0wLDAgKzEsNDggQEAKKyNpZm5kZWYgX0JMQUNLRklOX1NXQUJfSAorI2RlZmluZSBfQkxBQ0tGSU5fU1dBQl9ICisKKyNpbmNsdWRlIDxhc20vdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgorCisjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgIWRlZmluZWQoX19TVFJJQ1RfQU5TSV9fKSB8fCBkZWZpbmVkKF9fS0VSTkVMX18pCisjICBkZWZpbmUgX19TV0FCXzY0X1RIUlVfMzJfXworI2VuZGlmCisKKyNpZmRlZiBfX0dOVUNfXworCitzdGF0aWMgX19pbmxpbmVfXyBfX2F0dHJpYnV0ZV9jb25zdF9fIF9fdTMyIF9fYXJjaF9zd2FoYjMyKF9fdTMyIHh4KQoreworCV9fdTMyIHRtcDsKKwlfX2FzbV9fKCIlMSA9ICUwID4+IDggKFYpO1xuXHQiCisJCSIlMCA9ICUwIDw8IDggKFYpO1xuXHQiCisJCSIlMCA9ICUwIHwgJTE7XG5cdCIKKwkJOiAiK2QiKHh4KSwgIj0mZCIodG1wKSk7CisJcmV0dXJuIHh4OworfQorI2RlZmluZSBfX2FyY2hfc3dhaGIzMiBfX2FyY2hfc3dhaGIzMgorCitzdGF0aWMgX19pbmxpbmVfXyBfX2F0dHJpYnV0ZV9jb25zdF9fIF9fdTMyIF9fYXJjaF9zd2FodzMyKF9fdTMyIHh4KQoreworCV9fdTMyIHJ2OworCV9fYXNtX18oIiUwID0gUEFDSyglMS5MLCAlMS5IKTtcblx0IjogIj1kIihydik6ICJkIih4eCkpOworCXJldHVybiBydjsKK30KKyNkZWZpbmUgX19hcmNoX3N3YWh3MzIgX19hcmNoX3N3YWh3MzIKKworc3RhdGljIF9faW5saW5lX18gX19hdHRyaWJ1dGVfY29uc3RfXyBfX3UzMiBfX2FyY2hfc3dhYjMyKF9fdTMyIHh4KQoreworCXJldHVybiBfX2FyY2hfc3dhaGIzMihfX2FyY2hfc3dhaHczMih4eCkpOworfQorI2RlZmluZSBfX2FyY2hfc3dhYjMyIF9fYXJjaF9zd2FiMzIKKworc3RhdGljIF9faW5saW5lX18gX19hdHRyaWJ1dGVfY29uc3RfXyBfX3UxNiBfX2FyY2hfc3dhYjE2KF9fdTE2IHh4KQoreworCV9fdTMyIHh3ID0geHg7CisJX19hc21fXygiJTAgPDw9IDg7XG4JJTAuTCA9ICUwLkwgKyAlMC5IIChOUyk7XG4iOiAiK2QiKHh3KSk7CisJcmV0dXJuIChfX3UxNil4dzsKK30KKyNkZWZpbmUgX19hcmNoX3N3YWIxNiBfX2FyY2hfc3dhYjE2CisKKyNlbmRpZiAvKiBfX0dOVUNfXyAqLworCisjZW5kaWYJCQkJLyogX0JMQUNLRklOX1NXQUJfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9zeXN0ZW0uaCBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vc3lzdGVtLmgKaW5kZXggOGYxNjI3ZC4uYTRjODI1NCAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9zeXN0ZW0uaAorKysgYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3N5c3RlbS5oCkBAIC0zNywxMTQgKzM3LDk4IEBACiAjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CiAjaW5jbHVkZSA8bWFjaC9hbm9tYWx5Lmg+Ci0KLS8qCi0gKiBJbnRlcnJ1cHQgY29uZmlndXJpbmcgbWFjcm9zLgotICovCi0KLWV4dGVybiB1bnNpZ25lZCBsb25nIGlycV9mbGFnczsKLQotI2RlZmluZSBsb2NhbF9pcnFfZW5hYmxlKCkgXAotCV9fYXNtX18gX192b2xhdGlsZV9fKCBcCi0JCSJzdGkgJTA7IiBcCi0JCTogXAotCQk6ICJkIiAoaXJxX2ZsYWdzKSBcCi0JKQotCi0jZGVmaW5lIGxvY2FsX2lycV9kaXNhYmxlKCkgXAotCWRvIHsgXAotCQlpbnQgX190bXBfZHVtbXk7IFwKLQkJX19hc21fXyBfX3ZvbGF0aWxlX18oIFwKLQkJCSJjbGkgJTA7IiBcCi0JCQk6ICI9ZCIgKF9fdG1wX2R1bW15KSBcCi0JCSk7IFwKLQl9IHdoaWxlICgwKQotCi0jaWYgQU5PTUFMWV8wNTAwMDI0NCAmJiBkZWZpbmVkKENPTkZJR19CRklOX0lDQUNIRSkKLSMgZGVmaW5lIE5PUF9QQURfQU5PTUFMWV8wNTAwMDI0NCAibm9wOyBub3A7IgotI2Vsc2UKLSMgZGVmaW5lIE5PUF9QQURfQU5PTUFMWV8wNTAwMDI0NAotI2VuZGlmCi0KLSNkZWZpbmUgaWRsZV93aXRoX2lycV9kaXNhYmxlZCgpIFwKLQlfX2FzbV9fIF9fdm9sYXRpbGVfXyggXAotCQlOT1BfUEFEX0FOT01BTFlfMDUwMDAyNDQgXAotCQkiLmFsaWduIDg7IiBcCi0JCSJzdGkgJTA7IiBcCi0JCSJpZGxlOyIgXAotCQk6IFwKLQkJOiAiZCIgKGlycV9mbGFncykgXAotCSkKLQotI2lmZGVmIENPTkZJR19ERUJVR19IV0VSUgotIyBkZWZpbmUgX19zYXZlX2FuZF9jbGkoeCkgXAotCV9fYXNtX18gX192b2xhdGlsZV9fKCBcCi0JCSJjbGkgJTA7IiBcCi0JCSJzdGkgJTE7IiBcCi0JCTogIj0mZCIgKHgpIFwKLQkJOiAiZCIgKDB4M0YpIFwKLQkpCi0jZWxzZQotIyBkZWZpbmUgX19zYXZlX2FuZF9jbGkoeCkgXAotCV9fYXNtX18gX192b2xhdGlsZV9fKCBcCi0JCSJjbGkgJTA7IiBcCi0JCTogIj0mZCIgKHgpIFwKLQkpCi0jZW5kaWYKLQotI2RlZmluZSBsb2NhbF9zYXZlX2ZsYWdzKHgpIFwKLQlfX2FzbV9fIF9fdm9sYXRpbGVfXyggXAotCQkiY2xpICUwOyIgXAotCQkic3RpICUwOyIgXAotCQk6ICI9ZCIgKHgpIFwKLQkpCi0KLSNpZmRlZiBDT05GSUdfREVCVUdfSFdFUlIKLSNkZWZpbmUgaXJxc19lbmFibGVkX2Zyb21fZmxhZ3MoeCkgKCgoeCkgJiB+MHgzZikgIT0gMCkKLSNlbHNlCi0jZGVmaW5lIGlycXNfZW5hYmxlZF9mcm9tX2ZsYWdzKHgpICgoeCkgIT0gMHgxZikKLSNlbmRpZgotCi0jZGVmaW5lIGxvY2FsX2lycV9yZXN0b3JlKHgpIFwKLQlkbyB7IFwKLQkJaWYgKGlycXNfZW5hYmxlZF9mcm9tX2ZsYWdzKHgpKSBcCi0JCQlsb2NhbF9pcnFfZW5hYmxlKCk7IFwKLQl9IHdoaWxlICgwKQotCi0vKiBGb3Igc3BpbmxvY2tzIGV0YyAqLwotI2RlZmluZSBsb2NhbF9pcnFfc2F2ZSh4KSBfX3NhdmVfYW5kX2NsaSh4KQotCi0jZGVmaW5lCWlycXNfZGlzYWJsZWQoKQkJCQlcCi0oewkJCQkJCVwKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwkJCVwKLQlsb2NhbF9zYXZlX2ZsYWdzKGZsYWdzKTsJCVwKLQkhaXJxc19lbmFibGVkX2Zyb21fZmxhZ3MoZmxhZ3MpOwlcCi19KQorI2luY2x1ZGUgPGFzbS9wZGEuaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgogCiAvKgogICogRm9yY2Ugc3RyaWN0IENQVSBvcmRlcmluZy4KICAqLwotI2RlZmluZSBub3AoKSAgYXNtIHZvbGF0aWxlICgibm9wO1xuXHQiOjopCi0jZGVmaW5lIG1iKCkgICBhc20gdm9sYXRpbGUgKCIiICAgOiA6IDoibWVtb3J5IikKLSNkZWZpbmUgcm1iKCkgIGFzbSB2b2xhdGlsZSAoIiIgICA6IDogOiJtZW1vcnkiKQotI2RlZmluZSB3bWIoKSAgYXNtIHZvbGF0aWxlICgiIiAgIDogOiA6Im1lbW9yeSIpCisjZGVmaW5lIG5vcCgpICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIm5vcDtcblx0IiA6IDogKQorI2RlZmluZSBtYigpICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKCIiICAgOiA6IDogIm1lbW9yeSIpCisjZGVmaW5lIHJtYigpICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIiIgICA6IDogOiAibWVtb3J5IikKKyNkZWZpbmUgd21iKCkgIF9fYXNtX18gX192b2xhdGlsZV9fICgiIiAgIDogOiA6ICJtZW1vcnkiKQogI2RlZmluZSBzZXRfbWIodmFyLCB2YWx1ZSkgZG8geyAodm9pZCkgeGNoZygmdmFyLCB2YWx1ZSk7IH0gd2hpbGUgKDApCi0KICNkZWZpbmUgcmVhZF9iYXJyaWVyX2RlcGVuZHMoKSAJCWRvIHsgfSB3aGlsZSgwKQogCiAjaWZkZWYgQ09ORklHX1NNUAotI2RlZmluZSBzbXBfbWIoKQltYigpCi0jZGVmaW5lIHNtcF9ybWIoKQlybWIoKQotI2RlZmluZSBzbXBfd21iKCkJd21iKCkKLSNkZWZpbmUgc21wX3JlYWRfYmFycmllcl9kZXBlbmRzKCkJcmVhZF9iYXJyaWVyX2RlcGVuZHMoKQorYXNtbGlua2FnZSB1bnNpZ25lZCBsb25nIF9fcmF3X3hjaGdfMV9hc20odm9sYXRpbGUgdm9pZCAqcHRyLCB1bnNpZ25lZCBsb25nIHZhbHVlKTsKK2FzbWxpbmthZ2UgdW5zaWduZWQgbG9uZyBfX3Jhd194Y2hnXzJfYXNtKHZvbGF0aWxlIHZvaWQgKnB0ciwgdW5zaWduZWQgbG9uZyB2YWx1ZSk7Cithc21saW5rYWdlIHVuc2lnbmVkIGxvbmcgX19yYXdfeGNoZ180X2FzbSh2b2xhdGlsZSB2b2lkICpwdHIsIHVuc2lnbmVkIGxvbmcgdmFsdWUpOworYXNtbGlua2FnZSB1bnNpZ25lZCBsb25nIF9fcmF3X2NtcHhjaGdfMV9hc20odm9sYXRpbGUgdm9pZCAqcHRyLAorCQkJCQl1bnNpZ25lZCBsb25nIG5ldywgdW5zaWduZWQgbG9uZyBvbGQpOworYXNtbGlua2FnZSB1bnNpZ25lZCBsb25nIF9fcmF3X2NtcHhjaGdfMl9hc20odm9sYXRpbGUgdm9pZCAqcHRyLAorCQkJCQl1bnNpZ25lZCBsb25nIG5ldywgdW5zaWduZWQgbG9uZyBvbGQpOworYXNtbGlua2FnZSB1bnNpZ25lZCBsb25nIF9fcmF3X2NtcHhjaGdfNF9hc20odm9sYXRpbGUgdm9pZCAqcHRyLAorCQkJCQl1bnNpZ25lZCBsb25nIG5ldywgdW5zaWduZWQgbG9uZyBvbGQpOworCisjaWZkZWYgX19BUkNIX1NZTkNfQ09SRV9EQ0FDSEUKKyMgZGVmaW5lIHNtcF9tYigpCWRvIHsgYmFycmllcigpOyBzbXBfY2hlY2tfYmFycmllcigpOyBzbXBfbWFya19iYXJyaWVyKCk7IH0gd2hpbGUgKDApCisjIGRlZmluZSBzbXBfcm1iKCkJZG8geyBiYXJyaWVyKCk7IHNtcF9jaGVja19iYXJyaWVyKCk7IH0gd2hpbGUgKDApCisjIGRlZmluZSBzbXBfd21iKCkJZG8geyBiYXJyaWVyKCk7IHNtcF9tYXJrX2JhcnJpZXIoKTsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgc21wX3JlYWRfYmFycmllcl9kZXBlbmRzKCkJZG8geyBiYXJyaWVyKCk7IHNtcF9jaGVja19iYXJyaWVyKCk7IH0gd2hpbGUgKDApCisKICNlbHNlCisjIGRlZmluZSBzbXBfbWIoKQliYXJyaWVyKCkKKyMgZGVmaW5lIHNtcF9ybWIoKQliYXJyaWVyKCkKKyMgZGVmaW5lIHNtcF93bWIoKQliYXJyaWVyKCkKKyNkZWZpbmUgc21wX3JlYWRfYmFycmllcl9kZXBlbmRzKCkJYmFycmllcigpCisjZW5kaWYKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIF9feGNoZyh1bnNpZ25lZCBsb25nIHgsIHZvbGF0aWxlIHZvaWQgKnB0ciwKKwkJCQkgICBpbnQgc2l6ZSkKK3sKKwl1bnNpZ25lZCBsb25nIHRtcDsKKworCXN3aXRjaCAoc2l6ZSkgeworCWNhc2UgMToKKwkJdG1wID0gX19yYXdfeGNoZ18xX2FzbShwdHIsIHgpOworCQlicmVhazsKKwljYXNlIDI6CisJCXRtcCA9IF9fcmF3X3hjaGdfMl9hc20ocHRyLCB4KTsKKwkJYnJlYWs7CisJY2FzZSA0OgorCQl0bXAgPSBfX3Jhd194Y2hnXzRfYXNtKHB0ciwgeCk7CisJCWJyZWFrOworCX0KKworCXJldHVybiB0bXA7Cit9CisKKy8qCisgKiBBdG9taWMgY29tcGFyZSBhbmQgZXhjaGFuZ2UuICBDb21wYXJlIE9MRCB3aXRoIE1FTSwgaWYgaWRlbnRpY2FsLAorICogc3RvcmUgTkVXIGluIE1FTS4gIFJldHVybiB0aGUgaW5pdGlhbCB2YWx1ZSBpbiBNRU0uICBTdWNjZXNzIGlzCisgKiBpbmRpY2F0ZWQgYnkgY29tcGFyaW5nIFJFVFVSTiB3aXRoIE9MRC4KKyAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIF9fY21weGNoZyh2b2xhdGlsZSB2b2lkICpwdHIsIHVuc2lnbmVkIGxvbmcgb2xkLAorCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgbmV3LCBpbnQgc2l6ZSkKK3sKKwl1bnNpZ25lZCBsb25nIHRtcDsKKworCXN3aXRjaCAoc2l6ZSkgeworCWNhc2UgMToKKwkJdG1wID0gX19yYXdfY21weGNoZ18xX2FzbShwdHIsIG5ldywgb2xkKTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQl0bXAgPSBfX3Jhd19jbXB4Y2hnXzJfYXNtKHB0ciwgbmV3LCBvbGQpOworCQlicmVhazsKKwljYXNlIDQ6CisJCXRtcCA9IF9fcmF3X2NtcHhjaGdfNF9hc20ocHRyLCBuZXcsIG9sZCk7CisJCWJyZWFrOworCX0KKworCXJldHVybiB0bXA7Cit9CisjZGVmaW5lIGNtcHhjaGcocHRyLCBvLCBuKSBcCisJKChfX3R5cGVvZl9fKCoocHRyKSkpX19jbXB4Y2hnKChwdHIpLCAodW5zaWduZWQgbG9uZykobyksIFwKKwkJKHVuc2lnbmVkIGxvbmcpKG4pLCBzaXplb2YoKihwdHIpKSkpCisKKyNlbHNlIC8qICFDT05GSUdfU01QICovCisKICNkZWZpbmUgc21wX21iKCkJYmFycmllcigpCiAjZGVmaW5lIHNtcF9ybWIoKQliYXJyaWVyKCkKICNkZWZpbmUgc21wX3dtYigpCWJhcnJpZXIoKQogI2RlZmluZSBzbXBfcmVhZF9iYXJyaWVyX2RlcGVuZHMoKQlkbyB7IH0gd2hpbGUoMCkKLSNlbmRpZgotCi0jZGVmaW5lIHhjaGcocHRyLHgpICgoX190eXBlb2ZfXygqKHB0cikpKV9feGNoZygodW5zaWduZWQgbG9uZykoeCksKHB0ciksc2l6ZW9mKCoocHRyKSkpKQogCiBzdHJ1Y3QgX194Y2hnX2R1bW15IHsKIAl1bnNpZ25lZCBsb25nIGFbMTAwXTsKQEAgLTE1Nyw3ICsxNDEsNyBAQAogCXVuc2lnbmVkIGxvbmcgdG1wID0gMDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzID0gMDsKIAotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlsb2NhbF9pcnFfc2F2ZV9odyhmbGFncyk7CiAKIAlzd2l0Y2ggKHNpemUpIHsKIAljYXNlIDE6CkBAIC0xNzksNyArMTYzLDcgQEAKIAkJCSA6ICI9JmQiICh0bXApIDogImQiICh4KSwgIm0iICgqX194ZyhwdHIpKSA6ICJtZW1vcnkiKTsKIAkJYnJlYWs7CiAJfQotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwlsb2NhbF9pcnFfcmVzdG9yZV9odyhmbGFncyk7CiAJcmV0dXJuIHRtcDsKIH0KIApAQCAtMTk0LDkgKzE3OCwxMiBAQAogCQkJKHVuc2lnbmVkIGxvbmcpKG4pLCBzaXplb2YoKihwdHIpKSkpCiAjZGVmaW5lIGNtcHhjaGc2NF9sb2NhbChwdHIsIG8sIG4pIF9fY21weGNoZzY0X2xvY2FsX2dlbmVyaWMoKHB0ciksIChvKSwgKG4pKQogCi0jaWZuZGVmIENPTkZJR19TTVAKICNpbmNsdWRlIDxhc20tZ2VuZXJpYy9jbXB4Y2hnLmg+Ci0jZW5kaWYKKworI2VuZGlmIC8qICFDT05GSUdfU01QICovCisKKyNkZWZpbmUgeGNoZyhwdHIsIHgpICgoX190eXBlb2ZfXygqKHB0cikpKV9feGNoZygodW5zaWduZWQgbG9uZykoeCksIChwdHIpLCBzaXplb2YoKihwdHIpKSkpCisjZGVmaW5lIHRhcyhwdHIpICgodm9pZCl4Y2hnKChwdHIpLCAxKSkKIAogI2RlZmluZSBwcmVwYXJlX3RvX3N3aXRjaCgpICAgICBkbyB7IH0gd2hpbGUoMCkKIApAQCAtMjA1LDEwICsxOTIsMTIgQEAKICAqIHB0ciBpc24ndCB0aGUgY3VycmVudCB0YXNrLCBpbiB3aGljaCBjYXNlIGl0IGRvZXMgbm90aGluZy4KICAqLwogCi0jaW5jbHVkZSA8YXNtL2JsYWNrZmluLmg+CisjaW5jbHVkZSA8YXNtL2wxbGF5b3V0Lmg+CisjaW5jbHVkZSA8YXNtL21lbV9tYXAuaD4KIAogYXNtbGlua2FnZSBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnJlc3VtZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnByZXYsIHN0cnVjdCB0YXNrX3N0cnVjdCAqbmV4dCk7CiAKKyNpZm5kZWYgQ09ORklHX1NNUAogI2RlZmluZSBzd2l0Y2hfdG8ocHJldixuZXh0LGxhc3QpIFwKIGRvIHsgICAgXAogCW1lbWNweSAoJnRhc2tfdGhyZWFkX2luZm8ocHJldiktPmwxX3Rhc2tfaW5mbywgTDFfU0NSQVRDSF9UQVNLX0lORk8sIFwKQEAgLTIxNyw1ICsyMDYsMTEgQEAKIAkJc2l6ZW9mICpMMV9TQ1JBVENIX1RBU0tfSU5GTyk7IFwKIAkobGFzdCkgPSByZXN1bWUgKHByZXYsIG5leHQpOyAgIFwKIH0gd2hpbGUgKDApCisjZWxzZQorI2RlZmluZSBzd2l0Y2hfdG8ocHJldiwgbmV4dCwgbGFzdCkgXAorZG8geyAgICBcCisJKGxhc3QpID0gcmVzdW1lKHByZXYsIG5leHQpOyAgIFwKK30gd2hpbGUgKDApCisjZW5kaWYKIAotI2VuZGlmCQkJCS8qIF9CTEFDS0ZJTl9TWVNURU1fSCAqLworI2VuZGlmCS8qIF9CTEFDS0ZJTl9TWVNURU1fSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS90aHJlYWRfaW5mby5oIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS90aHJlYWRfaW5mby5oCmluZGV4IDY0Mjc2OTMuLmU3MjFjZTUgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vdGhyZWFkX2luZm8uaAorKysgYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3RocmVhZF9pbmZvLmgKQEAgLTQ0LDYgKzQ0LDcgQEAKICAqLwogI2RlZmluZSBUSFJFQURfU0laRV9PUkRFUgkxCiAjZGVmaW5lIFRIUkVBRF9TSVpFCQk4MTkyCS8qIDIgcGFnZXMgKi8KKyNkZWZpbmUgU1RBQ0tfV0FSTgkJKFRIUkVBRF9TSVpFLzgpCiAKICNpZm5kZWYgX19BU1NFTUJMWV9fCiAKQEAgLTYyLDcgKzYzLDkgQEAKIAlpbnQgcHJlZW1wdF9jb3VudDsJLyogMCA9PiBwcmVlbXB0YWJsZSwgPDAgPT4gQlVHICovCiAJbW1fc2VnbWVudF90IGFkZHJfbGltaXQ7CS8qIGFkZHJlc3MgbGltaXQgKi8KIAlzdHJ1Y3QgcmVzdGFydF9ibG9jayByZXN0YXJ0X2Jsb2NrOworI2lmbmRlZiBDT05GSUdfU01QCiAJc3RydWN0IGwxX3NjcmF0Y2hfdGFza19pbmZvIGwxX3Rhc2tfaW5mbzsKKyNlbmRpZgogfTsKIAogLyoKQEAgLTkwLDcgKzkzLDcgQEAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IHRocmVhZF9pbmZvICpjdXJyZW50X3RocmVhZF9pbmZvKHZvaWQpCiB7CiAJc3RydWN0IHRocmVhZF9pbmZvICp0aTsKLSAgICAgIF9fYXNtX18oIiUwID0gc3A7IjogIj0mZCIodGkpOgorICAgICAgX19hc21fXygiJTAgPSBzcDsiIDogIj1kYSIodGkpIDoKIAkpOwogCXJldHVybiAoc3RydWN0IHRocmVhZF9pbmZvICopKChsb25nKXRpICYgfigobG9uZylUSFJFQURfU0laRS0xKSk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3VhY2Nlc3MuaCBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vdWFjY2Vzcy5oCmluZGV4IGQ5MjhiODAuLjMyNDgwMzMgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vdWFjY2Vzcy5oCisrKyBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vdWFjY2Vzcy5oCkBAIC0xNDksNTQgKzE0OSw0MiBAQAogCQkgOiAvKiBubyBvdXRwdXRzICovCQkJXAogCQkgOiJkIiAoeCksImEiIChfX3B0cihwKSkgOiAibWVtb3J5IikKIAotI2RlZmluZSBnZXRfdXNlcih4LHApCQkJCQkJCVwKLQkoewkJCQkJCQkJXAotCQlpbnQgX2VyciA9IDA7CQkJCQkJXAotCQl0eXBlb2YoKihwKSkgKl9wID0gKHApOwkJCQkJXAotCQlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgX3AsIHNpemVvZigqKF9wKSkpKSB7CVwKLQkJCV9lcnIgPSAtRUZBVUxUOwkJCQkJXAotCQl9CQkJCQkJCVwKLQkJZWxzZSB7CQkJCQkJCVwKLQkJc3dpdGNoIChzaXplb2YoKihfcCkpKSB7CQkJCVwKLQkJY2FzZSAxOgkJCQkJCQlcCi0JCQlfX2dldF91c2VyX2FzbSh4LCBfcCwgQiwoWikpOwkJCVwKLQkJCWJyZWFrOwkJCQkJCVwKLQkJY2FzZSAyOgkJCQkJCQlcCi0JCQlfX2dldF91c2VyX2FzbSh4LCBfcCwgVywoWikpOwkJCVwKLQkJCWJyZWFrOwkJCQkJCVwKLQkJY2FzZSA0OgkJCQkJCQlcCi0JCQlfX2dldF91c2VyX2FzbSh4LCBfcCwgICwgKTsJCQlcCi0JCQlicmVhazsJCQkJCQlcCi0JCWNhc2UgODogewkJCQkJCVwKLQkJCXVuc2lnbmVkIGxvbmcgX3hsLCBfeGg7CQkJCVwKLQkJCV9fZ2V0X3VzZXJfYXNtKF94bCwgKCh1bnNpZ25lZCBsb25nICopX3ApKzAsICAsICk7IFwKLQkJCV9fZ2V0X3VzZXJfYXNtKF94aCwgKCh1bnNpZ25lZCBsb25nICopX3ApKzEsICAsICk7IFwKLQkJCSgodW5zaWduZWQgbG9uZyAqKSZ4KVswXSA9IF94bDsJCQlcCi0JCQkoKHVuc2lnbmVkIGxvbmcgKikmeClbMV0gPSBfeGg7CQkJXAotCQl9IGJyZWFrOwkJCQkJCVwKLQkJZGVmYXVsdDoJCQkJCQlcCi0JCQl4ID0gMDsJCQkJCQlcCi0JCQlwcmludGsoS0VSTl9JTkZPICJnZXRfdXNlcl9iYWQ6ICVzOiVkICVzXG4iLCAgICBcCi0JCQkgICAgICAgX19GSUxFX18sIF9fTElORV9fLCBfX2Z1bmNfXyk7CVwKLQkJCV9lcnIgPSBfX2dldF91c2VyX2JhZCgpOwkJCVwKLQkJCWJyZWFrOwkJCQkJCVwKLQkJfQkJCQkJCQlcCi0JCX0JCQkJCQkJXAotCQlfZXJyOwkJCQkJCQlcCi0JfSkKKyNkZWZpbmUgZ2V0X3VzZXIoeCwgcHRyKQkJCQkJXAorKHsJCQkJCQkJCVwKKwlpbnQgX2VyciA9IDA7CQkJCQkJXAorCXVuc2lnbmVkIGxvbmcgX3ZhbCA9IDA7CQkJCQlcCisJY29uc3QgdHlwZW9mKCoocHRyKSkgX191c2VyICpfcCA9IChwdHIpOwkJXAorCWNvbnN0IHNpemVfdCBwdHJfc2l6ZSA9IHNpemVvZigqKF9wKSk7CQkJXAorCWlmIChsaWtlbHkoYWNjZXNzX29rKFZFUklGWV9SRUFELCBfcCwgcHRyX3NpemUpKSkgewlcCisJCUJVSUxEX0JVR19PTihwdHJfc2l6ZSA+PSA4KTsJCQlcCisJCXN3aXRjaCAocHRyX3NpemUpIHsJCQkJXAorCQljYXNlIDE6CQkJCQkJXAorCQkJX19nZXRfdXNlcl9hc20oX3ZhbCwgX3AsIEIsKFopKTsJXAorCQkJYnJlYWs7CQkJCQlcCisJCWNhc2UgMjoJCQkJCQlcCisJCQlfX2dldF91c2VyX2FzbShfdmFsLCBfcCwgVywoWikpOwlcCisJCQlicmVhazsJCQkJCVwKKwkJY2FzZSA0OgkJCQkJCVwKKwkJCV9fZ2V0X3VzZXJfYXNtKF92YWwsIF9wLCAgLCApOwkJXAorCQkJYnJlYWs7CQkJCQlcCisJCX0JCQkJCQlcCisJfSBlbHNlCQkJCQkJCVwKKwkJX2VyciA9IC1FRkFVTFQ7CQkJCQlcCisJeCA9ICh0eXBlb2YoKihwdHIpKSlfdmFsOwkJCQlcCisJX2VycjsJCQkJCQkJXAorfSkKIAogI2RlZmluZSBfX2dldF91c2VyKHgscCkgZ2V0X3VzZXIoeCxwKQogCiAjZGVmaW5lIF9fZ2V0X3VzZXJfYmFkKCkgKGJhZF91c2VyX2FjY2Vzc19sZW5ndGgoKSwgKC1FRkFVTFQpKQogCi0jZGVmaW5lIF9fZ2V0X3VzZXJfYXNtKHgscCxiaHcsb3B0aW9uKQkJCQlcCi0JewkJCQkJCQlcCi0JCXVuc2lnbmVkIGxvbmcgX3RtcDsJCQkJXAotCQlfX2FzbV9fICgiJTAgPSIgI2JodyAiWyUxXSIjb3B0aW9uIjtcblx0IglcCi0JCQkgOiAiPWQiIChfdG1wKQkJCQlcCi0JCQkgOiAiYSIgKF9fcHRyKHApKSk7CQkJXAotCQkoeCkgPSAoX190eXBlb2ZfXygqKHApKSkgX3RtcDsJCQlcCi0JfQorI2RlZmluZSBfX2dldF91c2VyX2FzbSh4LCBwdHIsIGJodywgb3B0aW9uKQlcCisoewkJCQkJCVwKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCQkJXAorCQkiJTAgPSIgI2JodyAiWyUxXSIgI29wdGlvbiAiOyIJXAorCQk6ICI9ZCIgKHgpCQkJXAorCQk6ICJhIiAoX19wdHIocHRyKSkpOwkJXAorfSkKIAogI2RlZmluZSBfX2NvcHlfZnJvbV91c2VyKHRvLCBmcm9tLCBuKSBjb3B5X2Zyb21fdXNlcih0bywgZnJvbSwgbikKICNkZWZpbmUgX19jb3B5X3RvX3VzZXIodG8sIGZyb20sIG4pIGNvcHlfdG9fdXNlcih0bywgZnJvbSwgbikKQEAgLTIwOSw4ICsxOTcsOCBAQAogI2RlZmluZSBjb3B5X2Zyb21fdXNlcl9yZXQodG8sZnJvbSxuLHJldHZhbCkgKHsgaWYgKGNvcHlfZnJvbV91c2VyKHRvLGZyb20sbikpXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldHZhbDsgfSkKIAotc3RhdGljIGlubGluZSBsb25nIGNvcHlfZnJvbV91c2VyKHZvaWQgKnRvLAotCQkJCSAgY29uc3Qgdm9pZCBfX3VzZXIgKiBmcm9tLCB1bnNpZ25lZCBsb25nIG4pCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgX19tdXN0X2NoZWNrCitjb3B5X2Zyb21fdXNlcih2b2lkICp0bywgY29uc3Qgdm9pZCBfX3VzZXIgKmZyb20sIHVuc2lnbmVkIGxvbmcgbikKIHsKIAlpZiAoYWNjZXNzX29rKFZFUklGWV9SRUFELCBmcm9tLCBuKSkKIAkJbWVtY3B5KHRvLCBmcm9tLCBuKTsKQEAgLTIxOSw4ICsyMDcsOCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW5saW5lIGxvbmcgY29weV90b191c2VyKHZvaWQgKnRvLAotCQkJCWNvbnN0IHZvaWQgX191c2VyICogZnJvbSwgdW5zaWduZWQgbG9uZyBuKQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIF9fbXVzdF9jaGVjaworY29weV90b191c2VyKHZvaWQgKnRvLCBjb25zdCB2b2lkIF9fdXNlciAqZnJvbSwgdW5zaWduZWQgbG9uZyBuKQogewogCWlmIChhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCB0bywgbikpCiAJCW1lbWNweSh0bywgZnJvbSwgbik7CkBAIC0yMzMsOCArMjIxLDggQEAKICAqIENvcHkgYSBudWxsIHRlcm1pbmF0ZWQgc3RyaW5nIGZyb20gdXNlcnNwYWNlLgogICovCiAKLXN0YXRpYyBpbmxpbmUgbG9uZyBzdHJuY3B5X2Zyb21fdXNlcihjaGFyICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqc3JjLCBsb25nIGNvdW50KQorc3RhdGljIGlubGluZSBsb25nIF9fbXVzdF9jaGVjaworc3RybmNweV9mcm9tX3VzZXIoY2hhciAqZHN0LCBjb25zdCBjaGFyICpzcmMsIGxvbmcgY291bnQpCiB7CiAJY2hhciAqdG1wOwogCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCBzcmMsIDEpKQpAQCAtMjYwLDcgKzI0OCw4IEBACiAgKiBaZXJvIFVzZXJzcGFjZQogICovCiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBfX2NsZWFyX3VzZXIodm9pZCAqdG8sIHVuc2lnbmVkIGxvbmcgbikKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBfX211c3RfY2hlY2sKK19fY2xlYXJfdXNlcih2b2lkICp0bywgdW5zaWduZWQgbG9uZyBuKQogewogCW1lbXNldCh0bywgMCwgbik7CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3hvci5oIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS94b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODJlYjEyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS94b3IuaApAQCAtMCwwICsxIEBACisjaW5jbHVkZSA8YXNtLWdlbmVyaWMveG9yLmg+CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2tlcm5lbC9NYWtlZmlsZSBiL2FyY2gvYmxhY2tmaW4va2VybmVsL01ha2VmaWxlCmluZGV4IDYwNmFkYzcuLjM4YTIzMzMgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4va2VybmVsL01ha2VmaWxlCisrKyBiL2FyY2gvYmxhY2tmaW4va2VybmVsL01ha2VmaWxlCkBAIC03LDcgKzcsNyBAQAogb2JqLXkgOj0gXAogCWVudHJ5Lm8gcHJvY2Vzcy5vIGJmaW5fa3N5bXMubyBwdHJhY2UubyBzZXR1cC5vIHNpZ25hbC5vIFwKIAlzeXNfYmZpbi5vIHRyYXBzLm8gaXJxY2hpcC5vIGRtYS1tYXBwaW5nLm8gZmxhdC5vIFwKLQlmaXhlZF9jb2RlLm8gcmVib290Lm8gYmZpbl9ncGlvLm8KKwlmaXhlZF9jb2RlLm8gcmVib290Lm8gYmZpbl9ncGlvLm8gYmZpbl9kbWFfNXh4Lm8KIAogaWZlcSAoJChDT05GSUdfR0VORVJJQ19DTE9DS0VWRU5UUykseSkKICAgICBvYmoteSArPSB0aW1lLXRzLm8KQEAgLTE1LDggKzE1LDExIEBACiAgICAgb2JqLXkgKz0gdGltZS5vCiBlbmRpZgogCitvYmotJChDT05GSUdfSVBJUEUpICAgICAgICAgICAgICAgICAgKz0gaXBpcGUubworb2JqLSQoQ09ORklHX0lQSVBFX1RSQUNFX01DT1VOVCkgICAgICs9IG1jb3VudC5vCiBvYmotJChDT05GSUdfQkZJTl9HUFRJTUVSUykgICAgICAgICAgKz0gZ3B0aW1lcnMubworb2JqLSQoQ09ORklHX0NQTEJfSU5GTykgICAgICAgICAgICAgICs9IGNwbGJpbmZvLm8KIG9iai0kKENPTkZJR19NT0RVTEVTKSAgICAgICAgICAgICAgICArPSBtb2R1bGUubwotb2JqLSQoQ09ORklHX0JGSU5fRE1BXzVYWCkgICAgICAgICAgICs9IGJmaW5fZG1hXzV4eC5vCiBvYmotJChDT05GSUdfS0dEQikgICAgICAgICAgICAgICAgICAgKz0ga2dkYi5vCitvYmotJChDT05GSUdfS0dEQl9URVNUQ0FTRSkgICAgICAgICAgKz0ga2dkYl90ZXN0Lm8KIG9iai0kKENPTkZJR19FQVJMWV9QUklOVEspICAgICAgICAgICArPSBlYXJseV9wcmludGsubwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwvYXNtLW9mZnNldHMuYyBiL2FyY2gvYmxhY2tmaW4va2VybmVsL2FzbS1vZmZzZXRzLmMKaW5kZXggOWJiODVkZC4uYjVkZjk0NSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwvYXNtLW9mZnNldHMuYworKysgYi9hcmNoL2JsYWNrZmluL2tlcm5lbC9hc20tb2Zmc2V0cy5jCkBAIC01Niw2ICs1Niw5IEBACiAJLyogb2Zmc2V0cyBpbnRvIHRoZSB0aHJlYWQgc3RydWN0ICovCiAJREVGSU5FKFRIUkVBRF9LU1AsIG9mZnNldG9mKHN0cnVjdCB0aHJlYWRfc3RydWN0LCBrc3ApKTsKIAlERUZJTkUoVEhSRUFEX1VTUCwgb2Zmc2V0b2Yoc3RydWN0IHRocmVhZF9zdHJ1Y3QsIHVzcCkpOworCURFRklORShUSFJFQURfU1IsIG9mZnNldG9mKHN0cnVjdCB0aHJlYWRfc3RydWN0LCBzZXFzdGF0KSk7CisJREVGSU5FKFBUX1NSLCBvZmZzZXRvZihzdHJ1Y3QgdGhyZWFkX3N0cnVjdCwgc2Vxc3RhdCkpOworCURFRklORShUSFJFQURfRVNQMCwgb2Zmc2V0b2Yoc3RydWN0IHRocmVhZF9zdHJ1Y3QsIGVzcDApKTsKIAlERUZJTkUoVEhSRUFEX1BDLCBvZmZzZXRvZihzdHJ1Y3QgdGhyZWFkX3N0cnVjdCwgcGMpKTsKIAlERUZJTkUoS0VSTkVMX1NUQUNLX1NJWkUsIFRIUkVBRF9TSVpFKTsKIApAQCAtMTI4LDUgKzEzMSwzMSBAQAogCURFRklORShTSUdTRUdWLCBTSUdTRUdWKTsKIAlERUZJTkUoU0lHVFJBUCwgU0lHVFJBUCk7CiAKKwkvKiBQREEgbWFuYWdlbWVudCAoaW4gTDEgc2NyYXRjaHBhZCkgKi8KKwlERUZJTkUoUERBX1NZU0NGRywgb2Zmc2V0b2Yoc3RydWN0IGJsYWNrZmluX3BkYSwgc3lzY2ZnKSk7CisjaWZkZWYgQ09ORklHX1NNUAorCURFRklORShQREFfSVJRRkxBR1MsIG9mZnNldG9mKHN0cnVjdCBibGFja2Zpbl9wZGEsIGltYXNrKSk7CisjZW5kaWYKKwlERUZJTkUoUERBX0lQRFQsIG9mZnNldG9mKHN0cnVjdCBibGFja2Zpbl9wZGEsIGlwZHQpKTsKKwlERUZJTkUoUERBX0lQRFRfU1dBUENPVU5ULCBvZmZzZXRvZihzdHJ1Y3QgYmxhY2tmaW5fcGRhLCBpcGR0X3N3YXBjb3VudCkpOworCURFRklORShQREFfRFBEVCwgb2Zmc2V0b2Yoc3RydWN0IGJsYWNrZmluX3BkYSwgZHBkdCkpOworCURFRklORShQREFfRFBEVF9TV0FQQ09VTlQsIG9mZnNldG9mKHN0cnVjdCBibGFja2Zpbl9wZGEsIGRwZHRfc3dhcGNvdW50KSk7CisJREVGSU5FKFBEQV9FWElQVFIsIG9mZnNldG9mKHN0cnVjdCBibGFja2Zpbl9wZGEsIGV4X2lwdHIpKTsKKwlERUZJTkUoUERBX0VYT1BUUiwgb2Zmc2V0b2Yoc3RydWN0IGJsYWNrZmluX3BkYSwgZXhfb3B0cikpOworCURFRklORShQREFfRVhCVUYsIG9mZnNldG9mKHN0cnVjdCBibGFja2Zpbl9wZGEsIGV4X2J1ZikpOworCURFRklORShQREFfRVhJTUFTSywgb2Zmc2V0b2Yoc3RydWN0IGJsYWNrZmluX3BkYSwgZXhfaW1hc2spKTsKKwlERUZJTkUoUERBX0VYU1RBQ0ssIG9mZnNldG9mKHN0cnVjdCBibGFja2Zpbl9wZGEsIGV4X3N0YWNrKSk7CisjaWZkZWYgQU5PTUFMWV8wNTAwMDI2MQorCURFRklORShQREFfTEZSRVRYLCBvZmZzZXRvZihzdHJ1Y3QgYmxhY2tmaW5fcGRhLCBsYXN0X2NwbGJfZmF1bHRfcmV0eCkpOworI2VuZGlmCisJREVGSU5FKFBEQV9EQ1BMQiwgb2Zmc2V0b2Yoc3RydWN0IGJsYWNrZmluX3BkYSwgZGNwbGJfZmF1bHRfYWRkcikpOworCURFRklORShQREFfSUNQTEIsIG9mZnNldG9mKHN0cnVjdCBibGFja2Zpbl9wZGEsIGljcGxiX2ZhdWx0X2FkZHIpKTsKKwlERUZJTkUoUERBX1JFVFgsIG9mZnNldG9mKHN0cnVjdCBibGFja2Zpbl9wZGEsIHJldHgpKTsKKwlERUZJTkUoUERBX1NFUVNUQVQsIG9mZnNldG9mKHN0cnVjdCBibGFja2Zpbl9wZGEsIHNlcXN0YXQpKTsKKyNpZmRlZiBDT05GSUdfU01QCisJLyogSW50ZXItY29yZSBsb2NrIChpbiBMMiBTUkFNKSAqLworCURFRklORShTSVpFT0ZfQ09SRUxPQ0ssIHNpemVvZihzdHJ1Y3QgY29yZWxvY2tfc2xvdCkpOworI2VuZGlmCisKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4va2VybmVsL2JmaW5fZG1hXzV4eC5jIGIvYXJjaC9ibGFja2Zpbi9rZXJuZWwvYmZpbl9kbWFfNXh4LmMKaW5kZXggMzM5MjkzZC4uMDdlMDJjMCAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwvYmZpbl9kbWFfNXh4LmMKKysrIGIvYXJjaC9ibGFja2Zpbi9rZXJuZWwvYmZpbl9kbWFfNXh4LmMKQEAgLTEsNjMgKzEsMjcgQEAKIC8qCi0gKiBGaWxlOiAgICAgICAgIGFyY2gvYmxhY2tmaW4va2VybmVsL2JmaW5fZG1hXzV4eC5jCi0gKiBCYXNlZCBvbjoKLSAqIEF1dGhvcjoKKyAqIGJmaW5fZG1hXzV4eC5jIC0gQmxhY2tmaW4gRE1BIGltcGxlbWVudGF0aW9uCiAgKgotICogQ3JlYXRlZDoKLSAqIERlc2NyaXB0aW9uOiAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBzaW1wbGUgRE1BIEltcGxlbWVudGF0aW9uIGZvciBCbGFja2ZpbgotICoKLSAqIE1vZGlmaWVkOgotICogICAgICAgICAgICAgICBDb3B5cmlnaHQgMjAwNC0yMDA2IEFuYWxvZyBEZXZpY2VzIEluYy4KLSAqCi0gKiBCdWdzOiAgICAgICAgIEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLwotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIHRoZSBmaWxlIENPUFlJTkcsIG9yIHdyaXRlCi0gKiB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqIENvcHlyaWdodCAyMDA0LTIwMDggQW5hbG9nIERldmljZXMgSW5jLgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgogICovCiAKICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAKICNpbmNsdWRlIDxhc20vYmxhY2tmaW4uaD4KLSNpbmNsdWRlIDxhc20vZG1hLmg+CiAjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KKyNpbmNsdWRlIDxhc20vZG1hLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KIAotLyogUmVtb3ZlIHVudXNlZCBjb2RlIG5vdCBleHBvcnRlZCBieSBzeW1ib2wgb3IgaW50ZXJuYWxseSBjYWxsZWQgKi8KLSNkZWZpbmUgUkVNT1ZFX0RFQURfQ09ERQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEdsb2JhbCBWYXJpYWJsZXMKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIHN0cnVjdCBkbWFfY2hhbm5lbCBkbWFfY2hbTUFYX0JMQUNLRklOX0RNQV9DSEFOTkVMXTsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqICAgICAgIFNldCB0aGUgQnVmZmVyIENsZWFyIGJpdCBpbiB0aGUgQ29uZmlndXJhdGlvbiByZWdpc3RlciBvZiBzcGVjaWZpYyBETUEKLSAqICAgICAgIGNoYW5uZWwuIFRoaXMgd2lsbCBzdG9wIHRoZSBkZXNjcmlwdG9yIGJhc2VkIERNQSBvcGVyYXRpb24uCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXN0YXRpYyB2b2lkIGNsZWFyX2RtYV9idWZmZXIodW5zaWduZWQgaW50IGNoYW5uZWwpCi17Ci0JZG1hX2NoW2NoYW5uZWxdLnJlZ3MtPmNmZyB8PSBSRVNUQVJUOwotCVNTWU5DKCk7Ci0JZG1hX2NoW2NoYW5uZWxdLnJlZ3MtPmNmZyAmPSB+UkVTVEFSVDsKLQlTU1lOQygpOwotfQorc3RydWN0IGRtYV9jaGFubmVsIGRtYV9jaFtNQVhfRE1BX0NIQU5ORUxTXTsKK0VYUE9SVF9TWU1CT0woZG1hX2NoKTsKIAogc3RhdGljIGludCBfX2luaXQgYmxhY2tmaW5fZG1hX2luaXQodm9pZCkKIHsKQEAgLTY1LDMyICsyOSw2NyBAQAogCiAJcHJpbnRrKEtFUk5fSU5GTyAiQmxhY2tmaW4gRE1BIENvbnRyb2xsZXJcbiIpOwogCi0JZm9yIChpID0gMDsgaSA8IE1BWF9CTEFDS0ZJTl9ETUFfQ0hBTk5FTDsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IE1BWF9ETUFfQ0hBTk5FTFM7IGkrKykgewogCQlkbWFfY2hbaV0uY2hhbl9zdGF0dXMgPSBETUFfQ0hBTk5FTF9GUkVFOwogCQlkbWFfY2hbaV0ucmVncyA9IGRtYV9pb19iYXNlX2FkZHJbaV07CiAJCW11dGV4X2luaXQoJihkbWFfY2hbaV0uZG1hbG9jaykpOwogCX0KIAkvKiBNYXJrIE1FTURNQSBDaGFubmVsIDAgYXMgcmVxdWVzdGVkIHNpbmNlIHdlJ3JlIHVzaW5nIGl0IGludGVybmFsbHkgKi8KLQlkbWFfY2hbQ0hfTUVNX1NUUkVBTTBfREVTVF0uY2hhbl9zdGF0dXMgPSBETUFfQ0hBTk5FTF9SRVFVRVNURUQ7Ci0JZG1hX2NoW0NIX01FTV9TVFJFQU0wX1NSQ10uY2hhbl9zdGF0dXMgPSBETUFfQ0hBTk5FTF9SRVFVRVNURUQ7CisJcmVxdWVzdF9kbWEoQ0hfTUVNX1NUUkVBTTBfREVTVCwgIkJsYWNrZmluIGRtYV9tZW1jcHkiKTsKKwlyZXF1ZXN0X2RtYShDSF9NRU1fU1RSRUFNMF9TUkMsICJCbGFja2ZpbiBkbWFfbWVtY3B5Iik7CiAKICNpZiBkZWZpbmVkKENPTkZJR19ERUJfRE1BX1VSR0VOVCkKIAliZmluX3dyaXRlX0VCSVVfRERSUVVFKGJmaW5fcmVhZF9FQklVX0REUlFVRSgpCiAJCQkgfCBERUIxX1VSR0VOVCB8IERFQjJfVVJHRU5UIHwgREVCM19VUkdFTlQpOwogI2VuZGlmCisKKwlyZXR1cm4gMDsKK30KK2FyY2hfaW5pdGNhbGwoYmxhY2tmaW5fZG1hX2luaXQpOworCisjaWZkZWYgQ09ORklHX1BST0NfRlMKK3N0YXRpYyBpbnQgcHJvY19kbWFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0RNQV9DSEFOTkVMUzsgKytpKQorCQlpZiAoZG1hX2NoW2ldLmNoYW5fc3RhdHVzICE9IERNQV9DSEFOTkVMX0ZSRUUpCisJCQlzZXFfcHJpbnRmKG0sICIlMmQ6ICVzXG4iLCBpLCBkbWFfY2hbaV0uZGV2aWNlX2lkKTsKKwogCXJldHVybiAwOwogfQogCi1hcmNoX2luaXRjYWxsKGJsYWNrZmluX2RtYV9pbml0KTsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqCVJlcXVlc3QgdGhlIHNwZWNpZmljIERNQSBjaGFubmVsIGZyb20gdGhlIHN5c3RlbS4KLSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IHJlcXVlc3RfZG1hKHVuc2lnbmVkIGludCBjaGFubmVsLCBjaGFyICpkZXZpY2VfaWQpCitzdGF0aWMgaW50IHByb2NfZG1hX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCiB7CisJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIHByb2NfZG1hX3Nob3csIE5VTEwpOworfQogCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwcm9jX2RtYV9vcGVyYXRpb25zID0geworCS5vcGVuCQk9IHByb2NfZG1hX29wZW4sCisJLnJlYWQJCT0gc2VxX3JlYWQsCisJLmxsc2VlawkJPSBzZXFfbHNlZWssCisJLnJlbGVhc2UJPSBzaW5nbGVfcmVsZWFzZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHByb2NfZG1hX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcHJvY19jcmVhdGUoImRtYSIsIDAsIE5VTEwsICZwcm9jX2RtYV9vcGVyYXRpb25zKSAhPSBOVUxMOworfQorbGF0ZV9pbml0Y2FsbChwcm9jX2RtYV9pbml0KTsKKyNlbmRpZgorCisvKioKKyAqCXJlcXVlc3RfZG1hIC0gcmVxdWVzdCBhIERNQSBjaGFubmVsCisgKgorICogUmVxdWVzdCB0aGUgc3BlY2lmaWMgRE1BIGNoYW5uZWwgZnJvbSB0aGUgc3lzdGVtIGlmIGl0J3MgYXZhaWxhYmxlLgorICovCitpbnQgcmVxdWVzdF9kbWEodW5zaWduZWQgaW50IGNoYW5uZWwsIGNvbnN0IGNoYXIgKmRldmljZV9pZCkKK3sKIAlwcl9kZWJ1ZygicmVxdWVzdF9kbWEoKSA6IEJFR0lOIFxuIik7CiAKKwlpZiAoZGV2aWNlX2lkID09IE5VTEwpCisJCXByaW50ayhLRVJOX1dBUk5JTkcgInJlcXVlc3RfZG1hKCV1KTogbm8gZGV2aWNlX2lkIGdpdmVuXG4iLCBjaGFubmVsKTsKKwogI2lmIGRlZmluZWQoQ09ORklHX0JGNTYxKSAmJiBBTk9NQUxZXzA1MDAwMTgyCiAJaWYgKGNoYW5uZWwgPj0gQ0hfSU1FTV9TVFJFQU0wX0RFU1QgJiYgY2hhbm5lbCA8PSBDSF9JTUVNX1NUUkVBTTFfREVTVCkgewogCQlpZiAoZ2V0X2NjbGsoKSA+IDUwMDAwMDAwMCkgewpAQCAtMTI5LDYwICsxMjgsNjMgQEAKICNlbmRpZgogCiAJZG1hX2NoW2NoYW5uZWxdLmRldmljZV9pZCA9IGRldmljZV9pZDsKLQlkbWFfY2hbY2hhbm5lbF0uaXJxX2NhbGxiYWNrID0gTlVMTDsKKwlkbWFfY2hbY2hhbm5lbF0uaXJxID0gMDsKIAogCS8qIFRoaXMgaXMgdG8gYmUgZW5hYmxlZCBieSBwdXR0aW5nIGEgcmVzdHJpY3Rpb24gLQogCSAqIHlvdSBoYXZlIHRvIHJlcXVlc3QgRE1BLCBiZWZvcmUgZG9pbmcgYW55IG9wZXJhdGlvbnMgb24KIAkgKiBkZXNjcmlwdG9yL2NoYW5uZWwKIAkgKi8KIAlwcl9kZWJ1ZygicmVxdWVzdF9kbWEoKSA6IEVORCAgXG4iKTsKLQlyZXR1cm4gY2hhbm5lbDsKKwlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0wocmVxdWVzdF9kbWEpOwogCi1pbnQgc2V0X2RtYV9jYWxsYmFjayh1bnNpZ25lZCBpbnQgY2hhbm5lbCwgZG1hX2ludGVycnVwdF90IGNhbGxiYWNrLCB2b2lkICpkYXRhKQoraW50IHNldF9kbWFfY2FsbGJhY2sodW5zaWduZWQgaW50IGNoYW5uZWwsIGlycV9oYW5kbGVyX3QgY2FsbGJhY2ssIHZvaWQgKmRhdGEpCiB7Ci0JaW50IHJldF9pcnEgPSAwOwotCiAJQlVHX09OKCEoZG1hX2NoW2NoYW5uZWxdLmNoYW5fc3RhdHVzICE9IERNQV9DSEFOTkVMX0ZSRUUKLQkgICAgICAgJiYgY2hhbm5lbCA8IE1BWF9CTEFDS0ZJTl9ETUFfQ0hBTk5FTCkpOworCSAgICAgICAmJiBjaGFubmVsIDwgTUFYX0RNQV9DSEFOTkVMUykpOwogCiAJaWYgKGNhbGxiYWNrICE9IE5VTEwpIHsKLQkJaW50IHJldF92YWw7Ci0JCXJldF9pcnEgPSBjaGFubmVsMmlycShjaGFubmVsKTsKKwkJaW50IHJldDsKKwkJdW5zaWduZWQgaW50IGlycSA9IGNoYW5uZWwyaXJxKGNoYW5uZWwpOwogCisJCXJldCA9IHJlcXVlc3RfaXJxKGlycSwgY2FsbGJhY2ssIElSUUZfRElTQUJMRUQsCisJCQlkbWFfY2hbY2hhbm5lbF0uZGV2aWNlX2lkLCBkYXRhKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKKwkJZG1hX2NoW2NoYW5uZWxdLmlycSA9IGlycTsKIAkJZG1hX2NoW2NoYW5uZWxdLmRhdGEgPSBkYXRhOwotCi0JCXJldF92YWwgPQotCQkgICAgcmVxdWVzdF9pcnEocmV0X2lycSwgKHZvaWQgKiljYWxsYmFjaywgSVJRRl9ESVNBQkxFRCwKLQkJCQlkbWFfY2hbY2hhbm5lbF0uZGV2aWNlX2lkLCBkYXRhKTsKLQkJaWYgKHJldF92YWwpIHsKLQkJCXByaW50ayhLRVJOX05PVElDRQotCQkJICAgICAgICJSZXF1ZXN0IGlycSBpbiBETUEgZW5naW5lIGZhaWxlZC5cbiIpOwotCQkJcmV0dXJuIC1FUEVSTTsKLQkJfQotCQlkbWFfY2hbY2hhbm5lbF0uaXJxX2NhbGxiYWNrID0gY2FsbGJhY2s7CiAJfQogCXJldHVybiAwOwogfQogRVhQT1JUX1NZTUJPTChzZXRfZG1hX2NhbGxiYWNrKTsKIAorLyoqCisgKgljbGVhcl9kbWFfYnVmZmVyIC0gY2xlYXIgRE1BIGZpZm9zIGZvciBzcGVjaWZpZWQgY2hhbm5lbAorICoKKyAqIFNldCB0aGUgQnVmZmVyIENsZWFyIGJpdCBpbiB0aGUgQ29uZmlndXJhdGlvbiByZWdpc3RlciBvZiBzcGVjaWZpYyBETUEKKyAqIGNoYW5uZWwuIFRoaXMgd2lsbCBzdG9wIHRoZSBkZXNjcmlwdG9yIGJhc2VkIERNQSBvcGVyYXRpb24uCisgKi8KK3N0YXRpYyB2b2lkIGNsZWFyX2RtYV9idWZmZXIodW5zaWduZWQgaW50IGNoYW5uZWwpCit7CisJZG1hX2NoW2NoYW5uZWxdLnJlZ3MtPmNmZyB8PSBSRVNUQVJUOworCVNTWU5DKCk7CisJZG1hX2NoW2NoYW5uZWxdLnJlZ3MtPmNmZyAmPSB+UkVTVEFSVDsKK30KKwogdm9pZCBmcmVlX2RtYSh1bnNpZ25lZCBpbnQgY2hhbm5lbCkKIHsKLQlpbnQgcmV0X2lycTsKLQogCXByX2RlYnVnKCJmcmVlZG1hKCkgOiBCRUdJTiBcbiIpOwogCUJVR19PTighKGRtYV9jaFtjaGFubmVsXS5jaGFuX3N0YXR1cyAhPSBETUFfQ0hBTk5FTF9GUkVFCi0JICAgICAgICYmIGNoYW5uZWwgPCBNQVhfQkxBQ0tGSU5fRE1BX0NIQU5ORUwpKTsKKwkgICAgICAgJiYgY2hhbm5lbCA8IE1BWF9ETUFfQ0hBTk5FTFMpKTsKIAogCS8qIEhhbHQgdGhlIERNQSAqLwogCWRpc2FibGVfZG1hKGNoYW5uZWwpOwogCWNsZWFyX2RtYV9idWZmZXIoY2hhbm5lbCk7CiAKLQlpZiAoZG1hX2NoW2NoYW5uZWxdLmlycV9jYWxsYmFjayAhPSBOVUxMKSB7Ci0JCXJldF9pcnEgPSBjaGFubmVsMmlycShjaGFubmVsKTsKLQkJZnJlZV9pcnEocmV0X2lycSwgZG1hX2NoW2NoYW5uZWxdLmRhdGEpOwotCX0KKwlpZiAoZG1hX2NoW2NoYW5uZWxdLmlycSkKKwkJZnJlZV9pcnEoZG1hX2NoW2NoYW5uZWxdLmlycSwgZG1hX2NoW2NoYW5uZWxdLmRhdGEpOwogCiAJLyogQ2xlYXIgdGhlIERNQSBWYXJpYWJsZSBpbiB0aGUgQ2hhbm5lbCAqLwogCW11dGV4X2xvY2soJihkbWFfY2hbY2hhbm5lbF0uZG1hbG9jaykpOwpAQCAtMTkzLDI5NCArMTk1LDE1IEBACiB9CiBFWFBPUlRfU1lNQk9MKGZyZWVfZG1hKTsKIAotdm9pZCBkbWFfZW5hYmxlX2lycSh1bnNpZ25lZCBpbnQgY2hhbm5lbCkKLXsKLQlpbnQgcmV0X2lycTsKLQotCXByX2RlYnVnKCJkbWFfZW5hYmxlX2lycSgpIDogQkVHSU4gXG4iKTsKLQlCVUdfT04oIShkbWFfY2hbY2hhbm5lbF0uY2hhbl9zdGF0dXMgIT0gRE1BX0NIQU5ORUxfRlJFRQotCSAgICAgICAmJiBjaGFubmVsIDwgTUFYX0JMQUNLRklOX0RNQV9DSEFOTkVMKSk7Ci0KLQlyZXRfaXJxID0gY2hhbm5lbDJpcnEoY2hhbm5lbCk7Ci0JZW5hYmxlX2lycShyZXRfaXJxKTsKLX0KLUVYUE9SVF9TWU1CT0woZG1hX2VuYWJsZV9pcnEpOwotCi12b2lkIGRtYV9kaXNhYmxlX2lycSh1bnNpZ25lZCBpbnQgY2hhbm5lbCkKLXsKLQlpbnQgcmV0X2lycTsKLQotCXByX2RlYnVnKCJkbWFfZGlzYWJsZV9pcnEoKSA6IEJFR0lOIFxuIik7Ci0JQlVHX09OKCEoZG1hX2NoW2NoYW5uZWxdLmNoYW5fc3RhdHVzICE9IERNQV9DSEFOTkVMX0ZSRUUKLQkgICAgICAgJiYgY2hhbm5lbCA8IE1BWF9CTEFDS0ZJTl9ETUFfQ0hBTk5FTCkpOwotCi0JcmV0X2lycSA9IGNoYW5uZWwyaXJxKGNoYW5uZWwpOwotCWRpc2FibGVfaXJxKHJldF9pcnEpOwotfQotRVhQT1JUX1NZTUJPTChkbWFfZGlzYWJsZV9pcnEpOwotCi1pbnQgZG1hX2NoYW5uZWxfYWN0aXZlKHVuc2lnbmVkIGludCBjaGFubmVsKQotewotCWlmIChkbWFfY2hbY2hhbm5lbF0uY2hhbl9zdGF0dXMgPT0gRE1BX0NIQU5ORUxfRlJFRSkgewotCQlyZXR1cm4gMDsKLQl9IGVsc2UgewotCQlyZXR1cm4gMTsKLQl9Ci19Ci1FWFBPUlRfU1lNQk9MKGRtYV9jaGFubmVsX2FjdGl2ZSk7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qCXN0b3AgdGhlIHNwZWNpZmljIERNQSBjaGFubmVsLgotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXZvaWQgZGlzYWJsZV9kbWEodW5zaWduZWQgaW50IGNoYW5uZWwpCi17Ci0JcHJfZGVidWcoInN0b3BfZG1hKCkgOiBCRUdJTiBcbiIpOwotCi0JQlVHX09OKCEoZG1hX2NoW2NoYW5uZWxdLmNoYW5fc3RhdHVzICE9IERNQV9DSEFOTkVMX0ZSRUUKLQkgICAgICAgJiYgY2hhbm5lbCA8IE1BWF9CTEFDS0ZJTl9ETUFfQ0hBTk5FTCkpOwotCi0JZG1hX2NoW2NoYW5uZWxdLnJlZ3MtPmNmZyAmPSB+RE1BRU47CS8qIENsZWFuIHRoZSBlbmFibGUgYml0ICovCi0JU1NZTkMoKTsKLQlkbWFfY2hbY2hhbm5lbF0uY2hhbl9zdGF0dXMgPSBETUFfQ0hBTk5FTF9SRVFVRVNURUQ7Ci0JLyogTmVlZHMgdG8gYmUgZW5hYmxlZCBMYXRlciAqLwotCXByX2RlYnVnKCJzdG9wX2RtYSgpIDogRU5EIFxuIik7Ci0JcmV0dXJuOwotfQotRVhQT1JUX1NZTUJPTChkaXNhYmxlX2RtYSk7Ci0KLXZvaWQgZW5hYmxlX2RtYSh1bnNpZ25lZCBpbnQgY2hhbm5lbCkKLXsKLQlwcl9kZWJ1ZygiZW5hYmxlX2RtYSgpIDogQkVHSU4gXG4iKTsKLQotCUJVR19PTighKGRtYV9jaFtjaGFubmVsXS5jaGFuX3N0YXR1cyAhPSBETUFfQ0hBTk5FTF9GUkVFCi0JICAgICAgICYmIGNoYW5uZWwgPCBNQVhfQkxBQ0tGSU5fRE1BX0NIQU5ORUwpKTsKLQotCWRtYV9jaFtjaGFubmVsXS5jaGFuX3N0YXR1cyA9IERNQV9DSEFOTkVMX0VOQUJMRUQ7Ci0JZG1hX2NoW2NoYW5uZWxdLnJlZ3MtPmN1cnJfeF9jb3VudCA9IDA7Ci0JZG1hX2NoW2NoYW5uZWxdLnJlZ3MtPmN1cnJfeV9jb3VudCA9IDA7Ci0KLQlkbWFfY2hbY2hhbm5lbF0ucmVncy0+Y2ZnIHw9IERNQUVOOwkvKiBTZXQgdGhlIGVuYWJsZSBiaXQgKi8KLQlTU1lOQygpOwotCXByX2RlYnVnKCJlbmFibGVfZG1hKCkgOiBFTkQgXG4iKTsKLQlyZXR1cm47Ci19Ci1FWFBPUlRfU1lNQk9MKGVuYWJsZV9kbWEpOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKgkJU2V0IHRoZSBTdGFydCBBZGRyZXNzIHJlZ2lzdGVyIGZvciB0aGUgc3BlY2lmaWMgRE1BIGNoYW5uZWwKLSogCQlUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIGZvciByZWdpc3RlciBiYXNlZCBETUEsCi0qCQl0byBzZXR1cCB0aGUgc3RhcnQgYWRkcmVzcwotKgkJYWRkcjoJCVN0YXJ0aW5nIGFkZHJlc3Mgb2YgdGhlIERNQSBEYXRhIHRvIGJlIHRyYW5zZmVycmVkLgotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXZvaWQgc2V0X2RtYV9zdGFydF9hZGRyKHVuc2lnbmVkIGludCBjaGFubmVsLCB1bnNpZ25lZCBsb25nIGFkZHIpCi17Ci0JcHJfZGVidWcoInNldF9kbWFfc3RhcnRfYWRkcigpIDogQkVHSU4gXG4iKTsKLQotCUJVR19PTighKGRtYV9jaFtjaGFubmVsXS5jaGFuX3N0YXR1cyAhPSBETUFfQ0hBTk5FTF9GUkVFCi0JICAgICAgICYmIGNoYW5uZWwgPCBNQVhfQkxBQ0tGSU5fRE1BX0NIQU5ORUwpKTsKLQotCWRtYV9jaFtjaGFubmVsXS5yZWdzLT5zdGFydF9hZGRyID0gYWRkcjsKLQlTU1lOQygpOwotCXByX2RlYnVnKCJzZXRfZG1hX3N0YXJ0X2FkZHIoKSA6IEVORFxuIik7Ci19Ci1FWFBPUlRfU1lNQk9MKHNldF9kbWFfc3RhcnRfYWRkcik7Ci0KLXZvaWQgc2V0X2RtYV9uZXh0X2Rlc2NfYWRkcih1bnNpZ25lZCBpbnQgY2hhbm5lbCwgdW5zaWduZWQgbG9uZyBhZGRyKQotewotCXByX2RlYnVnKCJzZXRfZG1hX25leHRfZGVzY19hZGRyKCkgOiBCRUdJTiBcbiIpOwotCi0JQlVHX09OKCEoZG1hX2NoW2NoYW5uZWxdLmNoYW5fc3RhdHVzICE9IERNQV9DSEFOTkVMX0ZSRUUKLQkgICAgICAgJiYgY2hhbm5lbCA8IE1BWF9CTEFDS0ZJTl9ETUFfQ0hBTk5FTCkpOwotCi0JZG1hX2NoW2NoYW5uZWxdLnJlZ3MtPm5leHRfZGVzY19wdHIgPSBhZGRyOwotCVNTWU5DKCk7Ci0JcHJfZGVidWcoInNldF9kbWFfbmV4dF9kZXNjX2FkZHIoKSA6IEVORFxuIik7Ci19Ci1FWFBPUlRfU1lNQk9MKHNldF9kbWFfbmV4dF9kZXNjX2FkZHIpOwotCi12b2lkIHNldF9kbWFfY3Vycl9kZXNjX2FkZHIodW5zaWduZWQgaW50IGNoYW5uZWwsIHVuc2lnbmVkIGxvbmcgYWRkcikKLXsKLQlwcl9kZWJ1Zygic2V0X2RtYV9jdXJyX2Rlc2NfYWRkcigpIDogQkVHSU4gXG4iKTsKLQotCUJVR19PTighKGRtYV9jaFtjaGFubmVsXS5jaGFuX3N0YXR1cyAhPSBETUFfQ0hBTk5FTF9GUkVFCi0JICAgICAgICYmIGNoYW5uZWwgPCBNQVhfQkxBQ0tGSU5fRE1BX0NIQU5ORUwpKTsKLQotCWRtYV9jaFtjaGFubmVsXS5yZWdzLT5jdXJyX2Rlc2NfcHRyID0gYWRkcjsKLQlTU1lOQygpOwotCXByX2RlYnVnKCJzZXRfZG1hX2N1cnJfZGVzY19hZGRyKCkgOiBFTkRcbiIpOwotfQotRVhQT1JUX1NZTUJPTChzZXRfZG1hX2N1cnJfZGVzY19hZGRyKTsKLQotdm9pZCBzZXRfZG1hX3hfY291bnQodW5zaWduZWQgaW50IGNoYW5uZWwsIHVuc2lnbmVkIHNob3J0IHhfY291bnQpCi17Ci0JQlVHX09OKCEoZG1hX2NoW2NoYW5uZWxdLmNoYW5fc3RhdHVzICE9IERNQV9DSEFOTkVMX0ZSRUUKLQkgICAgICAgJiYgY2hhbm5lbCA8IE1BWF9CTEFDS0ZJTl9ETUFfQ0hBTk5FTCkpOwotCi0JZG1hX2NoW2NoYW5uZWxdLnJlZ3MtPnhfY291bnQgPSB4X2NvdW50OwotCVNTWU5DKCk7Ci19Ci1FWFBPUlRfU1lNQk9MKHNldF9kbWFfeF9jb3VudCk7Ci0KLXZvaWQgc2V0X2RtYV95X2NvdW50KHVuc2lnbmVkIGludCBjaGFubmVsLCB1bnNpZ25lZCBzaG9ydCB5X2NvdW50KQotewotCUJVR19PTighKGRtYV9jaFtjaGFubmVsXS5jaGFuX3N0YXR1cyAhPSBETUFfQ0hBTk5FTF9GUkVFCi0JICAgICAgICYmIGNoYW5uZWwgPCBNQVhfQkxBQ0tGSU5fRE1BX0NIQU5ORUwpKTsKLQotCWRtYV9jaFtjaGFubmVsXS5yZWdzLT55X2NvdW50ID0geV9jb3VudDsKLQlTU1lOQygpOwotfQotRVhQT1JUX1NZTUJPTChzZXRfZG1hX3lfY291bnQpOwotCi12b2lkIHNldF9kbWFfeF9tb2RpZnkodW5zaWduZWQgaW50IGNoYW5uZWwsIHNob3J0IHhfbW9kaWZ5KQotewotCUJVR19PTighKGRtYV9jaFtjaGFubmVsXS5jaGFuX3N0YXR1cyAhPSBETUFfQ0hBTk5FTF9GUkVFCi0JICAgICAgICYmIGNoYW5uZWwgPCBNQVhfQkxBQ0tGSU5fRE1BX0NIQU5ORUwpKTsKLQotCWRtYV9jaFtjaGFubmVsXS5yZWdzLT54X21vZGlmeSA9IHhfbW9kaWZ5OwotCVNTWU5DKCk7Ci19Ci1FWFBPUlRfU1lNQk9MKHNldF9kbWFfeF9tb2RpZnkpOwotCi12b2lkIHNldF9kbWFfeV9tb2RpZnkodW5zaWduZWQgaW50IGNoYW5uZWwsIHNob3J0IHlfbW9kaWZ5KQotewotCUJVR19PTighKGRtYV9jaFtjaGFubmVsXS5jaGFuX3N0YXR1cyAhPSBETUFfQ0hBTk5FTF9GUkVFCi0JICAgICAgICYmIGNoYW5uZWwgPCBNQVhfQkxBQ0tGSU5fRE1BX0NIQU5ORUwpKTsKLQotCWRtYV9jaFtjaGFubmVsXS5yZWdzLT55X21vZGlmeSA9IHlfbW9kaWZ5OwotCVNTWU5DKCk7Ci19Ci1FWFBPUlRfU1lNQk9MKHNldF9kbWFfeV9tb2RpZnkpOwotCi12b2lkIHNldF9kbWFfY29uZmlnKHVuc2lnbmVkIGludCBjaGFubmVsLCB1bnNpZ25lZCBzaG9ydCBjb25maWcpCi17Ci0JQlVHX09OKCEoZG1hX2NoW2NoYW5uZWxdLmNoYW5fc3RhdHVzICE9IERNQV9DSEFOTkVMX0ZSRUUKLQkgICAgICAgJiYgY2hhbm5lbCA8IE1BWF9CTEFDS0ZJTl9ETUFfQ0hBTk5FTCkpOwotCi0JZG1hX2NoW2NoYW5uZWxdLnJlZ3MtPmNmZyA9IGNvbmZpZzsKLQlTU1lOQygpOwotfQotRVhQT1JUX1NZTUJPTChzZXRfZG1hX2NvbmZpZyk7Ci0KLXVuc2lnbmVkIHNob3J0Ci1zZXRfYmZpbl9kbWFfY29uZmlnKGNoYXIgZGlyZWN0aW9uLCBjaGFyIGZsb3dfbW9kZSwKLQkJICAgIGNoYXIgaW50cl9tb2RlLCBjaGFyIGRtYV9tb2RlLCBjaGFyIHdpZHRoLCBjaGFyIHN5bmNtb2RlKQotewotCXVuc2lnbmVkIHNob3J0IGNvbmZpZzsKLQotCWNvbmZpZyA9Ci0JICAgICgoZGlyZWN0aW9uIDw8IDEpIHwgKHdpZHRoIDw8IDIpIHwgKGRtYV9tb2RlIDw8IDQpIHwKLQkgICAgIChpbnRyX21vZGUgPDwgNikgfCAoZmxvd19tb2RlIDw8IDEyKSB8IChzeW5jbW9kZSA8PCA1KSk7Ci0JcmV0dXJuIGNvbmZpZzsKLX0KLUVYUE9SVF9TWU1CT0woc2V0X2JmaW5fZG1hX2NvbmZpZyk7Ci0KLXZvaWQgc2V0X2RtYV9zZyh1bnNpZ25lZCBpbnQgY2hhbm5lbCwgc3RydWN0IGRtYXNnICpzZywgaW50IG5yX3NnKQotewotCUJVR19PTighKGRtYV9jaFtjaGFubmVsXS5jaGFuX3N0YXR1cyAhPSBETUFfQ0hBTk5FTF9GUkVFCi0JICAgICAgICYmIGNoYW5uZWwgPCBNQVhfQkxBQ0tGSU5fRE1BX0NIQU5ORUwpKTsKLQotCWRtYV9jaFtjaGFubmVsXS5yZWdzLT5jZmcgfD0gKChucl9zZyAmIDB4MEYpIDw8IDgpOwotCi0JZG1hX2NoW2NoYW5uZWxdLnJlZ3MtPm5leHRfZGVzY19wdHIgPSAodW5zaWduZWQgaW50KXNnOwotCi0JU1NZTkMoKTsKLX0KLUVYUE9SVF9TWU1CT0woc2V0X2RtYV9zZyk7Ci0KLXZvaWQgc2V0X2RtYV9jdXJyX2FkZHIodW5zaWduZWQgaW50IGNoYW5uZWwsIHVuc2lnbmVkIGxvbmcgYWRkcikKLXsKLQlCVUdfT04oIShkbWFfY2hbY2hhbm5lbF0uY2hhbl9zdGF0dXMgIT0gRE1BX0NIQU5ORUxfRlJFRQotCSAgICAgICAmJiBjaGFubmVsIDwgTUFYX0JMQUNLRklOX0RNQV9DSEFOTkVMKSk7Ci0KLQlkbWFfY2hbY2hhbm5lbF0ucmVncy0+Y3Vycl9hZGRyX3B0ciA9IGFkZHI7Ci0JU1NZTkMoKTsKLX0KLUVYUE9SVF9TWU1CT0woc2V0X2RtYV9jdXJyX2FkZHIpOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICoJR2V0IHRoZSBETUEgc3RhdHVzIG9mIGEgc3BlY2lmaWMgRE1BIGNoYW5uZWwgZnJvbSB0aGUgc3lzdGVtLgotICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi11bnNpZ25lZCBzaG9ydCBnZXRfZG1hX2N1cnJfaXJxc3RhdCh1bnNpZ25lZCBpbnQgY2hhbm5lbCkKLXsKLQlCVUdfT04oIShkbWFfY2hbY2hhbm5lbF0uY2hhbl9zdGF0dXMgIT0gRE1BX0NIQU5ORUxfRlJFRQotCSAgICAgICAmJiBjaGFubmVsIDwgTUFYX0JMQUNLRklOX0RNQV9DSEFOTkVMKSk7Ci0KLQlyZXR1cm4gZG1hX2NoW2NoYW5uZWxdLnJlZ3MtPmlycV9zdGF0dXM7Ci19Ci1FWFBPUlRfU1lNQk9MKGdldF9kbWFfY3Vycl9pcnFzdGF0KTsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqCUNsZWFyIHRoZSBETUFfRE9ORSBiaXQgaW4gRE1BIHN0YXR1cy4gU3RvcCB0aGUgRE1BIGNvbXBsZXRpb24gaW50ZXJydXB0LgotICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi12b2lkIGNsZWFyX2RtYV9pcnFzdGF0KHVuc2lnbmVkIGludCBjaGFubmVsKQotewotCUJVR19PTighKGRtYV9jaFtjaGFubmVsXS5jaGFuX3N0YXR1cyAhPSBETUFfQ0hBTk5FTF9GUkVFCi0JICAgICAgICYmIGNoYW5uZWwgPCBNQVhfQkxBQ0tGSU5fRE1BX0NIQU5ORUwpKTsKLQlkbWFfY2hbY2hhbm5lbF0ucmVncy0+aXJxX3N0YXR1cyB8PSAzOwotfQotRVhQT1JUX1NZTUJPTChjbGVhcl9kbWFfaXJxc3RhdCk7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKglHZXQgY3VycmVudCBETUEgeGNvdW50IG9mIGEgc3BlY2lmaWMgRE1BIGNoYW5uZWwgZnJvbSB0aGUgc3lzdGVtLgotICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi11bnNpZ25lZCBzaG9ydCBnZXRfZG1hX2N1cnJfeGNvdW50KHVuc2lnbmVkIGludCBjaGFubmVsKQotewotCUJVR19PTighKGRtYV9jaFtjaGFubmVsXS5jaGFuX3N0YXR1cyAhPSBETUFfQ0hBTk5FTF9GUkVFCi0JICAgICAgICYmIGNoYW5uZWwgPCBNQVhfQkxBQ0tGSU5fRE1BX0NIQU5ORUwpKTsKLQotCXJldHVybiBkbWFfY2hbY2hhbm5lbF0ucmVncy0+Y3Vycl94X2NvdW50OwotfQotRVhQT1JUX1NZTUJPTChnZXRfZG1hX2N1cnJfeGNvdW50KTsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqCUdldCBjdXJyZW50IERNQSB5Y291bnQgb2YgYSBzcGVjaWZpYyBETUEgY2hhbm5lbCBmcm9tIHRoZSBzeXN0ZW0uCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXVuc2lnbmVkIHNob3J0IGdldF9kbWFfY3Vycl95Y291bnQodW5zaWduZWQgaW50IGNoYW5uZWwpCi17Ci0JQlVHX09OKCEoZG1hX2NoW2NoYW5uZWxdLmNoYW5fc3RhdHVzICE9IERNQV9DSEFOTkVMX0ZSRUUKLQkgICAgICAgJiYgY2hhbm5lbCA8IE1BWF9CTEFDS0ZJTl9ETUFfQ0hBTk5FTCkpOwotCi0JcmV0dXJuIGRtYV9jaFtjaGFubmVsXS5yZWdzLT5jdXJyX3lfY291bnQ7Ci19Ci1FWFBPUlRfU1lNQk9MKGdldF9kbWFfY3Vycl95Y291bnQpOwotCi11bnNpZ25lZCBsb25nIGdldF9kbWFfbmV4dF9kZXNjX3B0cih1bnNpZ25lZCBpbnQgY2hhbm5lbCkKLXsKLQlCVUdfT04oIShkbWFfY2hbY2hhbm5lbF0uY2hhbl9zdGF0dXMgIT0gRE1BX0NIQU5ORUxfRlJFRQotCSAgICAgICYmIGNoYW5uZWwgPCBNQVhfQkxBQ0tGSU5fRE1BX0NIQU5ORUwpKTsKLQotCXJldHVybiBkbWFfY2hbY2hhbm5lbF0ucmVncy0+bmV4dF9kZXNjX3B0cjsKLX0KLUVYUE9SVF9TWU1CT0woZ2V0X2RtYV9uZXh0X2Rlc2NfcHRyKTsKLQotdW5zaWduZWQgbG9uZyBnZXRfZG1hX2N1cnJfZGVzY19wdHIodW5zaWduZWQgaW50IGNoYW5uZWwpCi17Ci0JQlVHX09OKCEoZG1hX2NoW2NoYW5uZWxdLmNoYW5fc3RhdHVzICE9IERNQV9DSEFOTkVMX0ZSRUUKLQkgICAgICAmJiBjaGFubmVsIDwgTUFYX0JMQUNLRklOX0RNQV9DSEFOTkVMKSk7Ci0KLQlyZXR1cm4gZG1hX2NoW2NoYW5uZWxdLnJlZ3MtPmN1cnJfZGVzY19wdHI7Ci19Ci1FWFBPUlRfU1lNQk9MKGdldF9kbWFfY3Vycl9kZXNjX3B0cik7Ci0KLXVuc2lnbmVkIGxvbmcgZ2V0X2RtYV9jdXJyX2FkZHIodW5zaWduZWQgaW50IGNoYW5uZWwpCi17Ci0JQlVHX09OKCEoZG1hX2NoW2NoYW5uZWxdLmNoYW5fc3RhdHVzICE9IERNQV9DSEFOTkVMX0ZSRUUKLQkgICAgICAmJiBjaGFubmVsIDwgTUFYX0JMQUNLRklOX0RNQV9DSEFOTkVMKSk7Ci0KLQlyZXR1cm4gZG1hX2NoW2NoYW5uZWxdLnJlZ3MtPmN1cnJfYWRkcl9wdHI7Ci19Ci1FWFBPUlRfU1lNQk9MKGdldF9kbWFfY3Vycl9hZGRyKTsKLQogI2lmZGVmIENPTkZJR19QTQorIyBpZm5kZWYgTUFYX0RNQV9TVVNQRU5EX0NIQU5ORUxTCisjICBkZWZpbmUgTUFYX0RNQV9TVVNQRU5EX0NIQU5ORUxTIE1BWF9ETUFfQ0hBTk5FTFMKKyMgZW5kaWYKIGludCBibGFja2Zpbl9kbWFfc3VzcGVuZCh2b2lkKQogewogCWludCBpOwogCi0jaWZkZWYgQ09ORklHX0JGNTYxCS8qIElNRE1BIGNoYW5uZWxzIGRvZXNuJ3QgaGF2ZSBhIFBFUklQSEVSQUxfTUFQICovCi0JZm9yIChpID0gMDsgaSA8PSBDSF9NRU1fU1RSRUFNM19TUkM7IGkrKykgewotI2Vsc2UKLQlmb3IgKGkgPSAwOyBpIDwgTUFYX0JMQUNLRklOX0RNQV9DSEFOTkVMOyBpKyspIHsKLSNlbmRpZgorCWZvciAoaSA9IDA7IGkgPCBNQVhfRE1BX1NVU1BFTkRfQ0hBTk5FTFM7ICsraSkgewogCQlpZiAoZG1hX2NoW2ldLmNoYW5fc3RhdHVzID09IERNQV9DSEFOTkVMX0VOQUJMRUQpIHsKIAkJCXByaW50ayhLRVJOX0VSUiAiRE1BIENoYW5uZWwgJWQgZmFpbGVkIHRvIHN1c3BlbmRcbiIsIGkpOwogCQkJcmV0dXJuIC1FQlVTWTsKQEAgLTQ5NSwzODggKzIxOCwyMDEgQEAKIHZvaWQgYmxhY2tmaW5fZG1hX3Jlc3VtZSh2b2lkKQogewogCWludCBpOwotCi0jaWZkZWYgQ09ORklHX0JGNTYxCS8qIElNRE1BIGNoYW5uZWxzIGRvZXNuJ3QgaGF2ZSBhIFBFUklQSEVSQUxfTUFQICovCi0JZm9yIChpID0gMDsgaSA8PSBDSF9NRU1fU1RSRUFNM19TUkM7IGkrKykKLSNlbHNlCi0JZm9yIChpID0gMDsgaSA8IE1BWF9CTEFDS0ZJTl9ETUFfQ0hBTk5FTDsgaSsrKQotI2VuZGlmCisJZm9yIChpID0gMDsgaSA8IE1BWF9ETUFfU1VTUEVORF9DSEFOTkVMUzsgKytpKQogCQlkbWFfY2hbaV0ucmVncy0+cGVyaXBoZXJhbF9tYXAgPSBkbWFfY2hbaV0uc2F2ZWRfcGVyaXBoZXJhbF9tYXA7CiB9CiAjZW5kaWYKIAotc3RhdGljIHZvaWQgKl9fZG1hX21lbWNweSh2b2lkICpkZXN0LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBzaXplKQorLyoqCisgKglibGFja2Zpbl9kbWFfZWFybHlfaW5pdCAtIG1pbmltYWwgRE1BIGluaXQKKyAqCisgKiBTZXR1cCBhIGZldyBETUEgcmVnaXN0ZXJzIHNvIHdlIGNhbiBzYWZlbHkgZG8gRE1BIHRyYW5zZmVycyBlYXJseSBvbiBpbgorICogdGhlIGtlcm5lbCBib290aW5nIHByb2Nlc3MuICBSZWFsbHkgdGhpcyBqdXN0IG1lYW5zIHVzaW5nIGRtYV9tZW1jcHkoKS4KKyAqLwordm9pZCBfX2luaXQgYmxhY2tmaW5fZG1hX2Vhcmx5X2luaXQodm9pZCkKIHsKLQlpbnQgZGlyZWN0aW9uOwkvKiAxIC0gYWRkcmVzcyBkZWNyZWFzZSwgMCAtIGFkZHJlc3MgaW5jcmVhc2UgKi8KLQlpbnQgZmxhZ19hbGlnbjsJLyogMSAtIGFkZHJlc3MgYWxpZ25lZCwgIDAgLSBhZGRyZXNzIHVuYWxpZ25lZCAqLwotCWludCBmbGFnXzJEOwkvKiAxIC0gMkQgRE1BIG5lZWRlZCwJIDAgLSAxRCBETUEgbmVlZGVkICovCisJYmZpbl93cml0ZV9NRE1BX1MwX0NPTkZJRygwKTsKK30KKworLyoqCisgKglfX2RtYV9tZW1jcHkgLSBwcm9ncmFtIHRoZSBNRE1BIHJlZ2lzdGVycworICoKKyAqIEFjdHVhbGx5IHByb2dyYW0gTURNQTAgYW5kIHdhaXQgZm9yIHRoZSB0cmFuc2ZlciB0byBmaW5pc2guICBEaXNhYmxlIElSUXMKKyAqIHdoaWxlIHByb2dyYW1taW5nIHJlZ2lzdGVycyBzbyB0aGF0IGV2ZXJ5dGhpbmcgaXMgZnVsbHkgY29uZmlndXJlZC4gIFdhaXQKKyAqIGZvciBETUEgdG8gZmluaXNoIHdpdGggSVJRcyBlbmFibGVkLiAgSWYgaW50ZXJydXB0ZWQsIHRoZSBpbml0aWFsIERNQV9ET05FCisgKiBjaGVjayB3aWxsIG1ha2Ugc3VyZSB3ZSBkb24ndCBjbG9iYmVyIGFueSBleGlzdGluZyB0cmFuc2Zlci4KKyAqLworc3RhdGljIHZvaWQgX19kbWFfbWVtY3B5KHUzMiBkYWRkciwgczE2IGRtb2QsIHUzMiBzYWRkciwgczE2IHNtb2QsIHNpemVfdCBjbnQsIHUzMiBjb25mKQoreworCXN0YXRpYyBERUZJTkVfU1BJTkxPQ0sobWRtYV9sb2NrKTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JaWYgKHNpemUgPD0gMCkKLQkJcmV0dXJuIE5VTEw7CisJc3Bpbl9sb2NrX2lycXNhdmUoJm1kbWFfbG9jaywgZmxhZ3MpOwogCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCWlmIChiZmluX3JlYWRfTURNQV9TMF9DT05GSUcoKSkKKwkJd2hpbGUgKCEoYmZpbl9yZWFkX01ETUFfRDBfSVJRX1NUQVRVUygpICYgRE1BX0RPTkUpKQorCQkJY29udGludWU7CiAKLQlpZiAoKHVuc2lnbmVkIGxvbmcpc3JjIDwgbWVtb3J5X2VuZCkKLQkJYmxhY2tmaW5fZGNhY2hlX2ZsdXNoX3JhbmdlKCh1bnNpZ25lZCBpbnQpc3JjLAotCQkJCQkgICAgKHVuc2lnbmVkIGludCkoc3JjICsgc2l6ZSkpOworCWlmIChjb25mICYgRE1BMkQpIHsKKwkJLyogRm9yIGxhcmdlciBiaXQgc2l6ZXMsIHdlJ3ZlIGFscmVhZHkgZGl2aWRlZCBkb3duIGNudCBzbyBpdAorCQkgKiBpcyBubyBsb25nZXIgYSBtdWx0aXBsZSBvZiA2NGsuICBTbyB3ZSBoYXZlIHRvIGJyZWFrIGRvd24KKwkJICogdGhlIGxpbWl0IGhlcmUgc28gaXQgaXMgYSBtdWx0aXBsZSBvZiB0aGUgaW5jb21pbmcgc2l6ZS4KKwkJICogVGhlcmUgaXMgbm8gbGltaXRhdGlvbiBoZXJlIGluIHRlcm1zIG9mIHRvdGFsIHNpemUgb3RoZXIKKwkJICogdGhhbiB0aGUgaGFyZHdhcmUgdGhvdWdoIGFzIHRoZSBiaXRzIGxvc3QgaW4gdGhlIHNoaWZ0IGFyZQorCQkgKiBtYWRlIHVwIGJ5IE1PRElGWSAoPT0gd2UgY2FuIGhpdCB0aGUgd2hvbGUgYWRkcmVzcyBzcGFjZSkuCisJCSAqIFg6ICgyXigxNiAtIDApKSAqIDEgPT0gKDJeKDE2IC0gMSkpICogMiA9PSAoMl4oMTYgLSAyKSkgKiA0CisJCSAqLworCQl1MzIgc2hpZnQgPSBhYnMoZG1vZCkgPj4gMTsKKwkJc2l6ZV90IHljbnQgPSBjbnQgPj4gKDE2IC0gc2hpZnQpOworCQljbnQgPSAxIDw8ICgxNiAtIHNoaWZ0KTsKKwkJYmZpbl93cml0ZV9NRE1BX0QwX1lfQ09VTlQoeWNudCk7CisJCWJmaW5fd3JpdGVfTURNQV9TMF9ZX0NPVU5UKHljbnQpOworCQliZmluX3dyaXRlX01ETUFfRDBfWV9NT0RJRlkoZG1vZCk7CisJCWJmaW5fd3JpdGVfTURNQV9TMF9ZX01PRElGWShzbW9kKTsKKwl9CiAKLQlpZiAoKHVuc2lnbmVkIGxvbmcpZGVzdCA8IG1lbW9yeV9lbmQpCi0JCWJsYWNrZmluX2RjYWNoZV9pbnZhbGlkYXRlX3JhbmdlKCh1bnNpZ25lZCBpbnQpZGVzdCwKLQkJCQkJCSAodW5zaWduZWQgaW50KShkZXN0ICsgc2l6ZSkpOwotCisJYmZpbl93cml0ZV9NRE1BX0QwX1NUQVJUX0FERFIoZGFkZHIpOworCWJmaW5fd3JpdGVfTURNQV9EMF9YX0NPVU5UKGNudCk7CisJYmZpbl93cml0ZV9NRE1BX0QwX1hfTU9ESUZZKGRtb2QpOwogCWJmaW5fd3JpdGVfTURNQV9EMF9JUlFfU1RBVFVTKERNQV9ET05FIHwgRE1BX0VSUik7CiAKLQlpZiAoKHVuc2lnbmVkIGxvbmcpc3JjIDwgKHVuc2lnbmVkIGxvbmcpZGVzdCkKLQkJZGlyZWN0aW9uID0gMTsKLQllbHNlCi0JCWRpcmVjdGlvbiA9IDA7CisJYmZpbl93cml0ZV9NRE1BX1MwX1NUQVJUX0FERFIoc2FkZHIpOworCWJmaW5fd3JpdGVfTURNQV9TMF9YX0NPVU5UKGNudCk7CisJYmZpbl93cml0ZV9NRE1BX1MwX1hfTU9ESUZZKHNtb2QpOworCWJmaW5fd3JpdGVfTURNQV9TMF9JUlFfU1RBVFVTKERNQV9ET05FIHwgRE1BX0VSUik7CiAKLQlpZiAoKCgodW5zaWduZWQgbG9uZylkZXN0ICUgMikgPT0gMCkgJiYgKCgodW5zaWduZWQgbG9uZylzcmMgJSAyKSA9PSAwKQotCSAgICAmJiAoKHNpemUgJSAyKSA9PSAwKSkKLQkJZmxhZ19hbGlnbiA9IDE7Ci0JZWxzZQotCQlmbGFnX2FsaWduID0gMDsKKwliZmluX3dyaXRlX01ETUFfUzBfQ09ORklHKERNQUVOIHwgY29uZik7CisJYmZpbl93cml0ZV9NRE1BX0QwX0NPTkZJRyhXTlIgfCBESV9FTiB8IERNQUVOIHwgY29uZik7CiAKLQlpZiAoc2l6ZSA+IDB4MTAwMDApCS8qIHNpemUgPiA2NEsgKi8KLQkJZmxhZ18yRCA9IDE7Ci0JZWxzZQotCQlmbGFnXzJEID0gMDsKLQotCS8qIFNldHVwIGRlc3RpbmF0aW9uIGFuZCBzb3VyY2Ugc3RhcnQgYWRkcmVzcyAqLwotCWlmIChkaXJlY3Rpb24pIHsKLQkJaWYgKGZsYWdfYWxpZ24pIHsKLQkJCWJmaW5fd3JpdGVfTURNQV9EMF9TVEFSVF9BRERSKGRlc3QgKyBzaXplIC0gMik7Ci0JCQliZmluX3dyaXRlX01ETUFfUzBfU1RBUlRfQUREUihzcmMgKyBzaXplIC0gMik7Ci0JCX0gZWxzZSB7Ci0JCQliZmluX3dyaXRlX01ETUFfRDBfU1RBUlRfQUREUihkZXN0ICsgc2l6ZSAtIDEpOwotCQkJYmZpbl93cml0ZV9NRE1BX1MwX1NUQVJUX0FERFIoc3JjICsgc2l6ZSAtIDEpOwotCQl9Ci0JfSBlbHNlIHsKLQkJYmZpbl93cml0ZV9NRE1BX0QwX1NUQVJUX0FERFIoZGVzdCk7Ci0JCWJmaW5fd3JpdGVfTURNQV9TMF9TVEFSVF9BRERSKHNyYyk7Ci0JfQotCi0JLyogU2V0dXAgZGVzdGluYXRpb24gYW5kIHNvdXJjZSB4Y291bnQgKi8KLQlpZiAoZmxhZ18yRCkgewotCQlpZiAoZmxhZ19hbGlnbikgewotCQkJYmZpbl93cml0ZV9NRE1BX0QwX1hfQ09VTlQoMTAyNCAvIDIpOwotCQkJYmZpbl93cml0ZV9NRE1BX1MwX1hfQ09VTlQoMTAyNCAvIDIpOwotCQl9IGVsc2UgewotCQkJYmZpbl93cml0ZV9NRE1BX0QwX1hfQ09VTlQoMTAyNCk7Ci0JCQliZmluX3dyaXRlX01ETUFfUzBfWF9DT1VOVCgxMDI0KTsKLQkJfQotCQliZmluX3dyaXRlX01ETUFfRDBfWV9DT1VOVChzaXplID4+IDEwKTsKLQkJYmZpbl93cml0ZV9NRE1BX1MwX1lfQ09VTlQoc2l6ZSA+PiAxMCk7Ci0JfSBlbHNlIHsKLQkJaWYgKGZsYWdfYWxpZ24pIHsKLQkJCWJmaW5fd3JpdGVfTURNQV9EMF9YX0NPVU5UKHNpemUgLyAyKTsKLQkJCWJmaW5fd3JpdGVfTURNQV9TMF9YX0NPVU5UKHNpemUgLyAyKTsKLQkJfSBlbHNlIHsKLQkJCWJmaW5fd3JpdGVfTURNQV9EMF9YX0NPVU5UKHNpemUpOwotCQkJYmZpbl93cml0ZV9NRE1BX1MwX1hfQ09VTlQoc2l6ZSk7Ci0JCX0KLQl9Ci0KLQkvKiBTZXR1cCBkZXN0aW5hdGlvbiBhbmQgc291cmNlIHhtb2RpZnkgYW5kIHltb2RpZnkgKi8KLQlpZiAoZGlyZWN0aW9uKSB7Ci0JCWlmIChmbGFnX2FsaWduKSB7Ci0JCQliZmluX3dyaXRlX01ETUFfRDBfWF9NT0RJRlkoLTIpOwotCQkJYmZpbl93cml0ZV9NRE1BX1MwX1hfTU9ESUZZKC0yKTsKLQkJCWlmIChmbGFnXzJEKSB7Ci0JCQkJYmZpbl93cml0ZV9NRE1BX0QwX1lfTU9ESUZZKC0yKTsKLQkJCQliZmluX3dyaXRlX01ETUFfUzBfWV9NT0RJRlkoLTIpOwotCQkJfQotCQl9IGVsc2UgewotCQkJYmZpbl93cml0ZV9NRE1BX0QwX1hfTU9ESUZZKC0xKTsKLQkJCWJmaW5fd3JpdGVfTURNQV9TMF9YX01PRElGWSgtMSk7Ci0JCQlpZiAoZmxhZ18yRCkgewotCQkJCWJmaW5fd3JpdGVfTURNQV9EMF9ZX01PRElGWSgtMSk7Ci0JCQkJYmZpbl93cml0ZV9NRE1BX1MwX1lfTU9ESUZZKC0xKTsKLQkJCX0KLQkJfQotCX0gZWxzZSB7Ci0JCWlmIChmbGFnX2FsaWduKSB7Ci0JCQliZmluX3dyaXRlX01ETUFfRDBfWF9NT0RJRlkoMik7Ci0JCQliZmluX3dyaXRlX01ETUFfUzBfWF9NT0RJRlkoMik7Ci0JCQlpZiAoZmxhZ18yRCkgewotCQkJCWJmaW5fd3JpdGVfTURNQV9EMF9ZX01PRElGWSgyKTsKLQkJCQliZmluX3dyaXRlX01ETUFfUzBfWV9NT0RJRlkoMik7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQliZmluX3dyaXRlX01ETUFfRDBfWF9NT0RJRlkoMSk7Ci0JCQliZmluX3dyaXRlX01ETUFfUzBfWF9NT0RJRlkoMSk7Ci0JCQlpZiAoZmxhZ18yRCkgewotCQkJCWJmaW5fd3JpdGVfTURNQV9EMF9ZX01PRElGWSgxKTsKLQkJCQliZmluX3dyaXRlX01ETUFfUzBfWV9NT0RJRlkoMSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKiBFbmFibGUgc291cmNlIERNQSAqLwotCWlmIChmbGFnXzJEKSB7Ci0JCWlmIChmbGFnX2FsaWduKSB7Ci0JCQliZmluX3dyaXRlX01ETUFfUzBfQ09ORklHKERNQUVOIHwgRE1BMkQgfCBXRFNJWkVfMTYpOwotCQkJYmZpbl93cml0ZV9NRE1BX0QwX0NPTkZJRyhXTlIgfCBESV9FTiB8IERNQUVOIHwgRE1BMkQgfCBXRFNJWkVfMTYpOwotCQl9IGVsc2UgewotCQkJYmZpbl93cml0ZV9NRE1BX1MwX0NPTkZJRyhETUFFTiB8IERNQTJEKTsKLQkJCWJmaW5fd3JpdGVfTURNQV9EMF9DT05GSUcoV05SIHwgRElfRU4gfCBETUFFTiB8IERNQTJEKTsKLQkJfQotCX0gZWxzZSB7Ci0JCWlmIChmbGFnX2FsaWduKSB7Ci0JCQliZmluX3dyaXRlX01ETUFfUzBfQ09ORklHKERNQUVOIHwgV0RTSVpFXzE2KTsKLQkJCWJmaW5fd3JpdGVfTURNQV9EMF9DT05GSUcoV05SIHwgRElfRU4gfCBETUFFTiB8IFdEU0laRV8xNik7Ci0JCX0gZWxzZSB7Ci0JCQliZmluX3dyaXRlX01ETUFfUzBfQ09ORklHKERNQUVOKTsKLQkJCWJmaW5fd3JpdGVfTURNQV9EMF9DT05GSUcoV05SIHwgRElfRU4gfCBETUFFTik7Ci0JCX0KLQl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWRtYV9sb2NrLCBmbGFncyk7CiAKIAlTU1lOQygpOwogCiAJd2hpbGUgKCEoYmZpbl9yZWFkX01ETUFfRDBfSVJRX1NUQVRVUygpICYgRE1BX0RPTkUpKQotCQk7CisJCWlmIChiZmluX3JlYWRfTURNQV9TMF9DT05GSUcoKSkKKwkJCWNvbnRpbnVlOworCQllbHNlCisJCQlyZXR1cm47CiAKLQliZmluX3dyaXRlX01ETUFfRDBfSVJRX1NUQVRVUyhiZmluX3JlYWRfTURNQV9EMF9JUlFfU1RBVFVTKCkgfAotCQkJCSAgICAgIChETUFfRE9ORSB8IERNQV9FUlIpKTsKKwliZmluX3dyaXRlX01ETUFfRDBfSVJRX1NUQVRVUyhETUFfRE9ORSB8IERNQV9FUlIpOwogCiAJYmZpbl93cml0ZV9NRE1BX1MwX0NPTkZJRygwKTsKIAliZmluX3dyaXRlX01ETUFfRDBfQ09ORklHKDApOwotCi0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCi0JcmV0dXJuIGRlc3Q7CiB9CiAKLXZvaWQgKmRtYV9tZW1jcHkodm9pZCAqZGVzdCwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3Qgc2l6ZSkKKy8qKgorICoJX2RtYV9tZW1jcHkgLSB0cmFuc2xhdGUgQyBtZW1jcHkgc2V0dGluZ3MgaW50byBNRE1BIHNldHRpbmdzCisgKgorICogSGFuZGxlIGFsbCB0aGUgaGlnaCBsZXZlbCBzdGVwcyBiZWZvcmUgd2UgdG91Y2ggdGhlIE1ETUEgcmVnaXN0ZXJzLiAgU28KKyAqIGhhbmRsZSBkaXJlY3Rpb24sIHR3ZWFraW5nIG9mIHNpemVzLCBhbmQgZm9ybWF0dGluZyBvZiBhZGRyZXNzZXMuCisgKi8KK3N0YXRpYyB2b2lkICpfZG1hX21lbWNweSh2b2lkICpwZHN0LCBjb25zdCB2b2lkICpwc3JjLCBzaXplX3Qgc2l6ZSkKIHsKLQlzaXplX3QgYnVsazsKLQlzaXplX3QgcmVzdDsKLQl2b2lkICogYWRkcjsKKwl1MzIgY29uZiwgc2hpZnQ7CisJczE2IG1vZDsKKwl1bnNpZ25lZCBsb25nIGRzdCA9ICh1bnNpZ25lZCBsb25nKXBkc3Q7CisJdW5zaWduZWQgbG9uZyBzcmMgPSAodW5zaWduZWQgbG9uZylwc3JjOwogCi0JYnVsayA9IChzaXplID4+IDE2KSA8PCAxNjsKKwlpZiAoc2l6ZSA9PSAwKQorCQlyZXR1cm4gTlVMTDsKKworCWlmIChkc3QgJSA0ID09IDAgJiYgc3JjICUgNCA9PSAwICYmIHNpemUgJSA0ID09IDApIHsKKwkJY29uZiA9IFdEU0laRV8zMjsKKwkJc2hpZnQgPSAyOworCX0gZWxzZSBpZiAoZHN0ICUgMiA9PSAwICYmIHNyYyAlIDIgPT0gMCAmJiBzaXplICUgMiA9PSAwKSB7CisJCWNvbmYgPSBXRFNJWkVfMTY7CisJCXNoaWZ0ID0gMTsKKwl9IGVsc2UgeworCQljb25mID0gV0RTSVpFXzg7CisJCXNoaWZ0ID0gMDsKKwl9CisKKwkvKiBJZiB0aGUgdHdvIG1lbW9yeSByZWdpb25zIGhhdmUgYSBjaGFuY2Ugb2Ygb3ZlcmxhcHBpbmcsIG1ha2UKKwkgKiBzdXJlIHRoZSBtZW1jcHkgc3RpbGwgd29ya3MgYXMgZXhwZWN0ZWQuICBEbyB0aGlzIGJ5IGhhdmluZyB0aGUKKwkgKiBjb3B5IHJ1biBiYWNrd2FyZHMgaW5zdGVhZC4KKwkgKi8KKwltb2QgPSAxIDw8IHNoaWZ0OworCWlmIChzcmMgPCBkc3QpIHsKKwkJbW9kICo9IC0xOworCQlkc3QgKz0gc2l6ZSArIG1vZDsKKwkJc3JjICs9IHNpemUgKyBtb2Q7CisJfQorCXNpemUgPj49IHNoaWZ0OworCisJaWYgKHNpemUgPiAweDEwMDAwKQorCQljb25mIHw9IERNQTJEOworCisJX19kbWFfbWVtY3B5KGRzdCwgbW9kLCBzcmMsIG1vZCwgc2l6ZSwgY29uZik7CisKKwlyZXR1cm4gcGRzdDsKK30KKworLyoqCisgKglkbWFfbWVtY3B5IC0gRE1BIG1lbWNweSB1bmRlciBtdXRleCBsb2NrCisgKgorICogRG8gbm90IGNoZWNrIGFyZ3VtZW50cyBiZWZvcmUgc3RhcnRpbmcgdGhlIERNQSBtZW1jcHkuICBCcmVhayB0aGUgdHJhbnNmZXIKKyAqIHVwIGludG8gdHdvIHBpZWNlcy4gIFRoZSBmaXJzdCB0cmFuc2ZlciBpcyBpbiBtdWx0aXBsZXMgb2YgNjRrIGFuZCB0aGUKKyAqIHNlY29uZCB0cmFuc2ZlciBpcyB0aGUgcGllY2Ugc21hbGxlciB0aGFuIDY0ay4KKyAqLwordm9pZCAqZG1hX21lbWNweSh2b2lkICpwZHN0LCBjb25zdCB2b2lkICpwc3JjLCBzaXplX3Qgc2l6ZSkKK3sKKwl1bnNpZ25lZCBsb25nIGRzdCA9ICh1bnNpZ25lZCBsb25nKXBkc3Q7CisJdW5zaWduZWQgbG9uZyBzcmMgPSAodW5zaWduZWQgbG9uZylwc3JjOworCXNpemVfdCBidWxrLCByZXN0OworCisJaWYgKGJmaW5fYWRkcl9kY2FjaGFibGUoc3JjKSkKKwkJYmxhY2tmaW5fZGNhY2hlX2ZsdXNoX3JhbmdlKHNyYywgc3JjICsgc2l6ZSk7CisKKwlpZiAoYmZpbl9hZGRyX2RjYWNoYWJsZShkc3QpKQorCQlibGFja2Zpbl9kY2FjaGVfaW52YWxpZGF0ZV9yYW5nZShkc3QsIGRzdCArIHNpemUpOworCisJYnVsayA9IHNpemUgJiB+MHhmZmZmOwogCXJlc3QgPSBzaXplIC0gYnVsazsKIAlpZiAoYnVsaykKLQkJX19kbWFfbWVtY3B5KGRlc3QsIHNyYywgYnVsayk7Ci0JYWRkciA9IF9fZG1hX21lbWNweShkZXN0K2J1bGssIHNyYytidWxrLCByZXN0KTsKLQlyZXR1cm4gYWRkcjsKKwkJX2RtYV9tZW1jcHkocGRzdCwgcHNyYywgYnVsayk7CisJX2RtYV9tZW1jcHkocGRzdCArIGJ1bGssIHBzcmMgKyBidWxrLCByZXN0KTsKKwlyZXR1cm4gcGRzdDsKIH0KIEVYUE9SVF9TWU1CT0woZG1hX21lbWNweSk7CiAKLXZvaWQgKnNhZmVfZG1hX21lbWNweSh2b2lkICpkZXN0LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBzaXplKQorLyoqCisgKglzYWZlX2RtYV9tZW1jcHkgLSBETUEgbWVtY3B5IHcvYXJndW1lbnQgY2hlY2tpbmcKKyAqCisgKiBWZXJpZnkgYXJndW1lbnRzIGFyZSBzYWZlIGJlZm9yZSBoZWFkaW5nIHRvIGRtYV9tZW1jcHkoKS4KKyAqLwordm9pZCAqc2FmZV9kbWFfbWVtY3B5KHZvaWQgKmRzdCwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3Qgc2l6ZSkKIHsKLQl2b2lkICphZGRyOwotCWFkZHIgPSBkbWFfbWVtY3B5KGRlc3QsIHNyYywgc2l6ZSk7Ci0JcmV0dXJuIGFkZHI7CisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBkc3QsIHNpemUpKQorCQlyZXR1cm4gTlVMTDsKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgc3JjLCBzaXplKSkKKwkJcmV0dXJuIE5VTEw7CisJcmV0dXJuIGRtYV9tZW1jcHkoZHN0LCBzcmMsIHNpemUpOwogfQogRVhQT1JUX1NZTUJPTChzYWZlX2RtYV9tZW1jcHkpOwogCi12b2lkIGRtYV9vdXRzYih1bnNpZ25lZCBsb25nIGFkZHIsIGNvbnN0IHZvaWQgKmJ1ZiwgdW5zaWduZWQgc2hvcnQgbGVuKQorc3RhdGljIHZvaWQgX2RtYV9vdXQodW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGJ1ZiwgdW5zaWduZWQgc2hvcnQgbGVuLAorICAgICAgICAgICAgICAgICAgICAgdTE2IHNpemUsIHUxNiBkbWFfc2l6ZSkKIHsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCi0JYmxhY2tmaW5fZGNhY2hlX2ZsdXNoX3JhbmdlKCh1bnNpZ25lZCBpbnQpYnVmLAotCQkJICh1bnNpZ25lZCBpbnQpKGJ1ZikgKyBsZW4pOwotCi0JYmZpbl93cml0ZV9NRE1BX0QwX1NUQVJUX0FERFIoYWRkcik7Ci0JYmZpbl93cml0ZV9NRE1BX0QwX1hfQ09VTlQobGVuKTsKLQliZmluX3dyaXRlX01ETUFfRDBfWF9NT0RJRlkoMCk7Ci0JYmZpbl93cml0ZV9NRE1BX0QwX0lSUV9TVEFUVVMoRE1BX0RPTkUgfCBETUFfRVJSKTsKLQotCWJmaW5fd3JpdGVfTURNQV9TMF9TVEFSVF9BRERSKGJ1Zik7Ci0JYmZpbl93cml0ZV9NRE1BX1MwX1hfQ09VTlQobGVuKTsKLQliZmluX3dyaXRlX01ETUFfUzBfWF9NT0RJRlkoMSk7Ci0JYmZpbl93cml0ZV9NRE1BX1MwX0lSUV9TVEFUVVMoRE1BX0RPTkUgfCBETUFfRVJSKTsKLQotCWJmaW5fd3JpdGVfTURNQV9TMF9DT05GSUcoRE1BRU4gfCBXRFNJWkVfOCk7Ci0JYmZpbl93cml0ZV9NRE1BX0QwX0NPTkZJRyhXTlIgfCBESV9FTiB8IERNQUVOIHwgV0RTSVpFXzgpOwotCi0JU1NZTkMoKTsKLQotCXdoaWxlICghKGJmaW5fcmVhZF9NRE1BX0QwX0lSUV9TVEFUVVMoKSAmIERNQV9ET05FKSk7Ci0KLQliZmluX3dyaXRlX01ETUFfRDBfSVJRX1NUQVRVUyhETUFfRE9ORSB8IERNQV9FUlIpOwotCi0JYmZpbl93cml0ZV9NRE1BX1MwX0NPTkZJRygwKTsKLQliZmluX3dyaXRlX01ETUFfRDBfQ09ORklHKDApOwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLQorCWJsYWNrZmluX2RjYWNoZV9mbHVzaF9yYW5nZShidWYsIGJ1ZiArIGxlbiAqIHNpemUpOworCV9fZG1hX21lbWNweShhZGRyLCAwLCBidWYsIHNpemUsIGxlbiwgZG1hX3NpemUpOwogfQotRVhQT1JUX1NZTUJPTChkbWFfb3V0c2IpOwogCi0KLXZvaWQgZG1hX2luc2IodW5zaWduZWQgbG9uZyBhZGRyLCB2b2lkICpidWYsIHVuc2lnbmVkIHNob3J0IGxlbikKK3N0YXRpYyB2b2lkIF9kbWFfaW4odW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGJ1ZiwgdW5zaWduZWQgc2hvcnQgbGVuLAorICAgICAgICAgICAgICAgICAgICB1MTYgc2l6ZSwgdTE2IGRtYV9zaXplKQogewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlibGFja2Zpbl9kY2FjaGVfaW52YWxpZGF0ZV9yYW5nZSgodW5zaWduZWQgaW50KWJ1ZiwKLQkJCSAodW5zaWduZWQgaW50KShidWYpICsgbGVuKTsKLQotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQliZmluX3dyaXRlX01ETUFfRDBfU1RBUlRfQUREUihidWYpOwotCWJmaW5fd3JpdGVfTURNQV9EMF9YX0NPVU5UKGxlbik7Ci0JYmZpbl93cml0ZV9NRE1BX0QwX1hfTU9ESUZZKDEpOwotCWJmaW5fd3JpdGVfTURNQV9EMF9JUlFfU1RBVFVTKERNQV9ET05FIHwgRE1BX0VSUik7Ci0KLQliZmluX3dyaXRlX01ETUFfUzBfU1RBUlRfQUREUihhZGRyKTsKLQliZmluX3dyaXRlX01ETUFfUzBfWF9DT1VOVChsZW4pOwotCWJmaW5fd3JpdGVfTURNQV9TMF9YX01PRElGWSgwKTsKLQliZmluX3dyaXRlX01ETUFfUzBfSVJRX1NUQVRVUyhETUFfRE9ORSB8IERNQV9FUlIpOwotCi0JYmZpbl93cml0ZV9NRE1BX1MwX0NPTkZJRyhETUFFTiB8IFdEU0laRV84KTsKLQliZmluX3dyaXRlX01ETUFfRDBfQ09ORklHKFdOUiB8IERJX0VOIHwgRE1BRU4gfCBXRFNJWkVfOCk7Ci0KLQlTU1lOQygpOwotCi0Jd2hpbGUgKCEoYmZpbl9yZWFkX01ETUFfRDBfSVJRX1NUQVRVUygpICYgRE1BX0RPTkUpKTsKLQotCWJmaW5fd3JpdGVfTURNQV9EMF9JUlFfU1RBVFVTKERNQV9ET05FIHwgRE1BX0VSUik7Ci0KLQliZmluX3dyaXRlX01ETUFfUzBfQ09ORklHKDApOwotCWJmaW5fd3JpdGVfTURNQV9EMF9DT05GSUcoMCk7Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCisJYmxhY2tmaW5fZGNhY2hlX2ludmFsaWRhdGVfcmFuZ2UoYnVmLCBidWYgKyBsZW4gKiBzaXplKTsKKwlfX2RtYV9tZW1jcHkoYnVmLCBzaXplLCBhZGRyLCAwLCBsZW4sIGRtYV9zaXplKTsKIH0KLUVYUE9SVF9TWU1CT0woZG1hX2luc2IpOwogCi12b2lkIGRtYV9vdXRzdyh1bnNpZ25lZCBsb25nIGFkZHIsIGNvbnN0IHZvaWQgICpidWYsIHVuc2lnbmVkIHNob3J0IGxlbikKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCi0JYmxhY2tmaW5fZGNhY2hlX2ZsdXNoX3JhbmdlKCh1bnNpZ25lZCBpbnQpYnVmLAotCQkJICh1bnNpZ25lZCBpbnQpKGJ1ZikgKyBsZW4gKiBzaXplb2Yoc2hvcnQpKTsKLQotCWJmaW5fd3JpdGVfTURNQV9EMF9TVEFSVF9BRERSKGFkZHIpOwotCWJmaW5fd3JpdGVfTURNQV9EMF9YX0NPVU5UKGxlbik7Ci0JYmZpbl93cml0ZV9NRE1BX0QwX1hfTU9ESUZZKDApOwotCWJmaW5fd3JpdGVfTURNQV9EMF9JUlFfU1RBVFVTKERNQV9ET05FIHwgRE1BX0VSUik7Ci0KLQliZmluX3dyaXRlX01ETUFfUzBfU1RBUlRfQUREUihidWYpOwotCWJmaW5fd3JpdGVfTURNQV9TMF9YX0NPVU5UKGxlbik7Ci0JYmZpbl93cml0ZV9NRE1BX1MwX1hfTU9ESUZZKDIpOwotCWJmaW5fd3JpdGVfTURNQV9TMF9JUlFfU1RBVFVTKERNQV9ET05FIHwgRE1BX0VSUik7Ci0KLQliZmluX3dyaXRlX01ETUFfUzBfQ09ORklHKERNQUVOIHwgV0RTSVpFXzE2KTsKLQliZmluX3dyaXRlX01ETUFfRDBfQ09ORklHKFdOUiB8IERJX0VOIHwgRE1BRU4gfCBXRFNJWkVfMTYpOwotCi0JU1NZTkMoKTsKLQotCXdoaWxlICghKGJmaW5fcmVhZF9NRE1BX0QwX0lSUV9TVEFUVVMoKSAmIERNQV9ET05FKSk7Ci0KLQliZmluX3dyaXRlX01ETUFfRDBfSVJRX1NUQVRVUyhETUFfRE9ORSB8IERNQV9FUlIpOwotCi0JYmZpbl93cml0ZV9NRE1BX1MwX0NPTkZJRygwKTsKLQliZmluX3dyaXRlX01ETUFfRDBfQ09ORklHKDApOwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLQotfQotRVhQT1JUX1NZTUJPTChkbWFfb3V0c3cpOwotCi12b2lkIGRtYV9pbnN3KHVuc2lnbmVkIGxvbmcgYWRkciwgdm9pZCAqYnVmLCB1bnNpZ25lZCBzaG9ydCBsZW4pCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWJsYWNrZmluX2RjYWNoZV9pbnZhbGlkYXRlX3JhbmdlKCh1bnNpZ25lZCBpbnQpYnVmLAotCQkJICh1bnNpZ25lZCBpbnQpKGJ1ZikgKyBsZW4gKiBzaXplb2Yoc2hvcnQpKTsKLQotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQotCWJmaW5fd3JpdGVfTURNQV9EMF9TVEFSVF9BRERSKGJ1Zik7Ci0JYmZpbl93cml0ZV9NRE1BX0QwX1hfQ09VTlQobGVuKTsKLQliZmluX3dyaXRlX01ETUFfRDBfWF9NT0RJRlkoMik7Ci0JYmZpbl93cml0ZV9NRE1BX0QwX0lSUV9TVEFUVVMoRE1BX0RPTkUgfCBETUFfRVJSKTsKLQotCWJmaW5fd3JpdGVfTURNQV9TMF9TVEFSVF9BRERSKGFkZHIpOwotCWJmaW5fd3JpdGVfTURNQV9TMF9YX0NPVU5UKGxlbik7Ci0JYmZpbl93cml0ZV9NRE1BX1MwX1hfTU9ESUZZKDApOwotCWJmaW5fd3JpdGVfTURNQV9TMF9JUlFfU1RBVFVTKERNQV9ET05FIHwgRE1BX0VSUik7Ci0KLQliZmluX3dyaXRlX01ETUFfUzBfQ09ORklHKERNQUVOIHwgV0RTSVpFXzE2KTsKLQliZmluX3dyaXRlX01ETUFfRDBfQ09ORklHKFdOUiB8IERJX0VOIHwgRE1BRU4gfCBXRFNJWkVfMTYpOwotCi0JU1NZTkMoKTsKLQotCXdoaWxlICghKGJmaW5fcmVhZF9NRE1BX0QwX0lSUV9TVEFUVVMoKSAmIERNQV9ET05FKSk7Ci0KLQliZmluX3dyaXRlX01ETUFfRDBfSVJRX1NUQVRVUyhETUFfRE9ORSB8IERNQV9FUlIpOwotCi0JYmZpbl93cml0ZV9NRE1BX1MwX0NPTkZJRygwKTsKLQliZmluX3dyaXRlX01ETUFfRDBfQ09ORklHKDApOwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLQotfQotRVhQT1JUX1NZTUJPTChkbWFfaW5zdyk7Ci0KLXZvaWQgZG1hX291dHNsKHVuc2lnbmVkIGxvbmcgYWRkciwgY29uc3Qgdm9pZCAqYnVmLCB1bnNpZ25lZCBzaG9ydCBsZW4pCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQotCWJsYWNrZmluX2RjYWNoZV9mbHVzaF9yYW5nZSgodW5zaWduZWQgaW50KWJ1ZiwKLQkJCSAodW5zaWduZWQgaW50KShidWYpICsgbGVuICogc2l6ZW9mKGxvbmcpKTsKLQotCWJmaW5fd3JpdGVfTURNQV9EMF9TVEFSVF9BRERSKGFkZHIpOwotCWJmaW5fd3JpdGVfTURNQV9EMF9YX0NPVU5UKGxlbik7Ci0JYmZpbl93cml0ZV9NRE1BX0QwX1hfTU9ESUZZKDApOwotCWJmaW5fd3JpdGVfTURNQV9EMF9JUlFfU1RBVFVTKERNQV9ET05FIHwgRE1BX0VSUik7Ci0KLQliZmluX3dyaXRlX01ETUFfUzBfU1RBUlRfQUREUihidWYpOwotCWJmaW5fd3JpdGVfTURNQV9TMF9YX0NPVU5UKGxlbik7Ci0JYmZpbl93cml0ZV9NRE1BX1MwX1hfTU9ESUZZKDQpOwotCWJmaW5fd3JpdGVfTURNQV9TMF9JUlFfU1RBVFVTKERNQV9ET05FIHwgRE1BX0VSUik7Ci0KLQliZmluX3dyaXRlX01ETUFfUzBfQ09ORklHKERNQUVOIHwgV0RTSVpFXzMyKTsKLQliZmluX3dyaXRlX01ETUFfRDBfQ09ORklHKFdOUiB8IERJX0VOIHwgRE1BRU4gfCBXRFNJWkVfMzIpOwotCi0JU1NZTkMoKTsKLQotCXdoaWxlICghKGJmaW5fcmVhZF9NRE1BX0QwX0lSUV9TVEFUVVMoKSAmIERNQV9ET05FKSk7Ci0KLQliZmluX3dyaXRlX01ETUFfRDBfSVJRX1NUQVRVUyhETUFfRE9ORSB8IERNQV9FUlIpOwotCi0JYmZpbl93cml0ZV9NRE1BX1MwX0NPTkZJRygwKTsKLQliZmluX3dyaXRlX01ETUFfRDBfQ09ORklHKDApOwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLQotfQotRVhQT1JUX1NZTUJPTChkbWFfb3V0c2wpOwotCi12b2lkIGRtYV9pbnNsKHVuc2lnbmVkIGxvbmcgYWRkciwgdm9pZCAqYnVmLCB1bnNpZ25lZCBzaG9ydCBsZW4pCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWJsYWNrZmluX2RjYWNoZV9pbnZhbGlkYXRlX3JhbmdlKCh1bnNpZ25lZCBpbnQpYnVmLAotCQkJICh1bnNpZ25lZCBpbnQpKGJ1ZikgKyBsZW4gKiBzaXplb2YobG9uZykpOwotCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCi0JYmZpbl93cml0ZV9NRE1BX0QwX1NUQVJUX0FERFIoYnVmKTsKLQliZmluX3dyaXRlX01ETUFfRDBfWF9DT1VOVChsZW4pOwotCWJmaW5fd3JpdGVfTURNQV9EMF9YX01PRElGWSg0KTsKLQliZmluX3dyaXRlX01ETUFfRDBfSVJRX1NUQVRVUyhETUFfRE9ORSB8IERNQV9FUlIpOwotCi0JYmZpbl93cml0ZV9NRE1BX1MwX1NUQVJUX0FERFIoYWRkcik7Ci0JYmZpbl93cml0ZV9NRE1BX1MwX1hfQ09VTlQobGVuKTsKLQliZmluX3dyaXRlX01ETUFfUzBfWF9NT0RJRlkoMCk7Ci0JYmZpbl93cml0ZV9NRE1BX1MwX0lSUV9TVEFUVVMoRE1BX0RPTkUgfCBETUFfRVJSKTsKLQotCWJmaW5fd3JpdGVfTURNQV9TMF9DT05GSUcoRE1BRU4gfCBXRFNJWkVfMzIpOwotCWJmaW5fd3JpdGVfTURNQV9EMF9DT05GSUcoV05SIHwgRElfRU4gfCBETUFFTiB8IFdEU0laRV8zMik7Ci0KLQlTU1lOQygpOwotCi0Jd2hpbGUgKCEoYmZpbl9yZWFkX01ETUFfRDBfSVJRX1NUQVRVUygpICYgRE1BX0RPTkUpKTsKLQotCWJmaW5fd3JpdGVfTURNQV9EMF9JUlFfU1RBVFVTKERNQV9ET05FIHwgRE1BX0VSUik7Ci0KLQliZmluX3dyaXRlX01ETUFfUzBfQ09ORklHKDApOwotCWJmaW5fd3JpdGVfTURNQV9EMF9DT05GSUcoMCk7Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCi19Ci1FWFBPUlRfU1lNQk9MKGRtYV9pbnNsKTsKKyNkZWZpbmUgTUFLRV9ETUFfSU8oaW8sIGJ3bCwgaXNpemUsIGRtYXNpemUsIGNuc3QpIFwKK3ZvaWQgZG1hXyMjaW8jI3MjI2J3bCh1bnNpZ25lZCBsb25nIGFkZHIsIGNuc3Qgdm9pZCAqYnVmLCB1bnNpZ25lZCBzaG9ydCBsZW4pIFwKK3sgXAorCV9kbWFfIyNpbyhhZGRyLCAodW5zaWduZWQgbG9uZylidWYsIGxlbiwgaXNpemUsIFdEU0laRV8jI2RtYXNpemUpOyBcCit9IFwKK0VYUE9SVF9TWU1CT0woZG1hXyMjaW8jI3MjI2J3bCkKK01BS0VfRE1BX0lPKG91dCwgYiwgMSwgIDgsIGNvbnN0KTsKK01BS0VfRE1BX0lPKGluLCAgYiwgMSwgIDgsICk7CitNQUtFX0RNQV9JTyhvdXQsIHcsIDIsIDE2LCBjb25zdCk7CitNQUtFX0RNQV9JTyhpbiwgIHcsIDIsIDE2LCApOworTUFLRV9ETUFfSU8ob3V0LCBsLCA0LCAzMiwgY29uc3QpOworTUFLRV9ETUFfSU8oaW4sICBsLCA0LCAzMiwgKTsKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4va2VybmVsL2JmaW5fZ3Bpby5jIGIvYXJjaC9ibGFja2Zpbi9rZXJuZWwvYmZpbl9ncGlvLmMKaW5kZXggNWMwODAwYS4uNGMxNDMzMSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwvYmZpbl9ncGlvLmMKKysrIGIvYXJjaC9ibGFja2Zpbi9rZXJuZWwvYmZpbl9ncGlvLmMKQEAgLTExOSwyOCArMTE5LDI4IEBACiAjZGVmaW5lIEFXQV9EVU1NWV9SRUFEKC4uLikgIGRvIHsgfSB3aGlsZSAoMCkKICNlbmRpZgogCi0jaWZkZWYgQkY1MzNfRkFNSUxZCi1zdGF0aWMgc3RydWN0IGdwaW9fcG9ydF90ICpncGlvX2JhbmtiW2dwaW9fYmFuayhNQVhfQkxBQ0tGSU5fR1BJT1MpXSA9IHsKKyNpZiBkZWZpbmVkKEJGNTMzX0ZBTUlMWSkgfHwgZGVmaW5lZChCRjUzOF9GQU1JTFkpCitzdGF0aWMgc3RydWN0IGdwaW9fcG9ydF90ICpncGlvX2JhbmtiW10gPSB7CiAJKHN0cnVjdCBncGlvX3BvcnRfdCAqKSBGSU9fRkxBR19ELAogfTsKICNlbmRpZgogCi0jaWYgZGVmaW5lZChCRjUyN19GQU1JTFkpIHx8IGRlZmluZWQoQkY1MzdfRkFNSUxZKQotc3RhdGljIHN0cnVjdCBncGlvX3BvcnRfdCAqZ3Bpb19iYW5rYltncGlvX2JhbmsoTUFYX0JMQUNLRklOX0dQSU9TKV0gPSB7CisjaWYgZGVmaW5lZChCRjUyN19GQU1JTFkpIHx8IGRlZmluZWQoQkY1MzdfRkFNSUxZKSB8fCBkZWZpbmVkKEJGNTE4X0ZBTUlMWSkKK3N0YXRpYyBzdHJ1Y3QgZ3Bpb19wb3J0X3QgKmdwaW9fYmFua2JbXSA9IHsKIAkoc3RydWN0IGdwaW9fcG9ydF90ICopIFBPUlRGSU8sCiAJKHN0cnVjdCBncGlvX3BvcnRfdCAqKSBQT1JUR0lPLAogCShzdHJ1Y3QgZ3Bpb19wb3J0X3QgKikgUE9SVEhJTywKIH07CiAKLXN0YXRpYyB1bnNpZ25lZCBzaG9ydCAqcG9ydF9mZXJbZ3Bpb19iYW5rKE1BWF9CTEFDS0ZJTl9HUElPUyldID0geworc3RhdGljIHVuc2lnbmVkIHNob3J0ICpwb3J0X2ZlcltdID0gewogCSh1bnNpZ25lZCBzaG9ydCAqKSBQT1JURl9GRVIsCiAJKHVuc2lnbmVkIHNob3J0ICopIFBPUlRHX0ZFUiwKIAkodW5zaWduZWQgc2hvcnQgKikgUE9SVEhfRkVSLAogfTsKICNlbmRpZgogCi0jaWZkZWYgQkY1MjdfRkFNSUxZCi1zdGF0aWMgdW5zaWduZWQgc2hvcnQgKnBvcnRfbXV4W2dwaW9fYmFuayhNQVhfQkxBQ0tGSU5fR1BJT1MpXSA9IHsKKyNpZiBkZWZpbmVkKEJGNTI3X0ZBTUlMWSkgfHwgZGVmaW5lZChCRjUxOF9GQU1JTFkpCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgKnBvcnRfbXV4W10gPSB7CiAJKHVuc2lnbmVkIHNob3J0ICopIFBPUlRGX01VWCwKIAkodW5zaWduZWQgc2hvcnQgKikgUE9SVEdfTVVYLAogCSh1bnNpZ25lZCBzaG9ydCAqKSBQT1JUSF9NVVgsCkBAIC0xNTUsNyArMTU1LDcgQEAKICNlbmRpZgogCiAjaWZkZWYgQkY1NjFfRkFNSUxZCi1zdGF0aWMgc3RydWN0IGdwaW9fcG9ydF90ICpncGlvX2JhbmtiW2dwaW9fYmFuayhNQVhfQkxBQ0tGSU5fR1BJT1MpXSA9IHsKK3N0YXRpYyBzdHJ1Y3QgZ3Bpb19wb3J0X3QgKmdwaW9fYmFua2JbXSA9IHsKIAkoc3RydWN0IGdwaW9fcG9ydF90ICopIEZJTzBfRkxBR19ELAogCShzdHJ1Y3QgZ3Bpb19wb3J0X3QgKikgRklPMV9GTEFHX0QsCiAJKHN0cnVjdCBncGlvX3BvcnRfdCAqKSBGSU8yX0ZMQUdfRCwKQEAgLTE2Myw3ICsxNjMsNyBAQAogI2VuZGlmCiAKICNpZmRlZiBCRjU0OF9GQU1JTFkKLXN0YXRpYyBzdHJ1Y3QgZ3Bpb19wb3J0X3QgKmdwaW9fYXJyYXlbZ3Bpb19iYW5rKE1BWF9CTEFDS0ZJTl9HUElPUyldID0geworc3RhdGljIHN0cnVjdCBncGlvX3BvcnRfdCAqZ3Bpb19hcnJheVtdID0gewogCShzdHJ1Y3QgZ3Bpb19wb3J0X3QgKilQT1JUQV9GRVIsCiAJKHN0cnVjdCBncGlvX3BvcnRfdCAqKVBPUlRCX0ZFUiwKIAkoc3RydWN0IGdwaW9fcG9ydF90ICopUE9SVENfRkVSLApAQCAtMTc3LDggKzE3Nyw5IEBACiB9OwogI2VuZGlmCiAKLXN0YXRpYyB1bnNpZ25lZCBzaG9ydCByZXNlcnZlZF9ncGlvX21hcFtncGlvX2JhbmsoTUFYX0JMQUNLRklOX0dQSU9TKV07CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgcmVzZXJ2ZWRfZ3Bpb19tYXBbR1BJT19CQU5LX05VTV07CiBzdGF0aWMgdW5zaWduZWQgc2hvcnQgcmVzZXJ2ZWRfcGVyaV9tYXBbZ3Bpb19iYW5rKE1BWF9SRVNPVVJDRVMpXTsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCByZXNlcnZlZF9ncGlvX2lycV9tYXBbR1BJT19CQU5LX05VTV07CiAKICNkZWZpbmUgUkVTT1VSQ0VfTEFCRUxfU0laRSAJMTYKIApAQCAtMTg4LDQ4ICsxODksNDYgQEAKIAogI2lmIGRlZmluZWQoQ09ORklHX1BNKQogI2lmIGRlZmluZWQoQ09ORklHX0JGNTR4KQotc3RhdGljIHN0cnVjdCBncGlvX3BvcnRfcyBncGlvX2Jhbmtfc2F2ZWRbZ3Bpb19iYW5rKE1BWF9CTEFDS0ZJTl9HUElPUyldOworc3RhdGljIHN0cnVjdCBncGlvX3BvcnRfcyBncGlvX2Jhbmtfc2F2ZWRbR1BJT19CQU5LX05VTV07CiAjZWxzZQotc3RhdGljIHVuc2lnbmVkIHNob3J0IHdha2V1cF9tYXBbZ3Bpb19iYW5rKE1BWF9CTEFDS0ZJTl9HUElPUyldOworc3RhdGljIHVuc2lnbmVkIHNob3J0IHdha2V1cF9tYXBbR1BJT19CQU5LX05VTV07CiBzdGF0aWMgdW5zaWduZWQgY2hhciB3YWtldXBfZmxhZ3NfbWFwW01BWF9CTEFDS0ZJTl9HUElPU107Ci1zdGF0aWMgc3RydWN0IGdwaW9fcG9ydF9zIGdwaW9fYmFua19zYXZlZFtncGlvX2JhbmsoTUFYX0JMQUNLRklOX0dQSU9TKV07CitzdGF0aWMgc3RydWN0IGdwaW9fcG9ydF9zIGdwaW9fYmFua19zYXZlZFtHUElPX0JBTktfTlVNXTsKIAogI2lmZGVmIEJGNTMzX0ZBTUlMWQotc3RhdGljIHVuc2lnbmVkIGludCBzaWNfaXdyX2lycXNbZ3Bpb19iYW5rKE1BWF9CTEFDS0ZJTl9HUElPUyldID0ge0lSUV9QUk9HX0lOVEJ9Oworc3RhdGljIHVuc2lnbmVkIGludCBzaWNfaXdyX2lycXNbXSA9IHtJUlFfUFJPR19JTlRCfTsKICNlbmRpZgogCiAjaWZkZWYgQkY1MzdfRkFNSUxZCi1zdGF0aWMgdW5zaWduZWQgaW50IHNpY19pd3JfaXJxc1tncGlvX2JhbmsoTUFYX0JMQUNLRklOX0dQSU9TKV0gPSB7SVJRX1BST0dfSU5UQiwgSVJRX1BPUlRHX0lOVEIsIElSUV9NQUNfVFh9Oworc3RhdGljIHVuc2lnbmVkIGludCBzaWNfaXdyX2lycXNbXSA9IHtJUlFfUFJPR19JTlRCLCBJUlFfUE9SVEdfSU5UQiwgSVJRX01BQ19UWH07CiAjZW5kaWYKIAotI2lmZGVmIEJGNTI3X0ZBTUlMWQotc3RhdGljIHVuc2lnbmVkIGludCBzaWNfaXdyX2lycXNbZ3Bpb19iYW5rKE1BWF9CTEFDS0ZJTl9HUElPUyldID0ge0lSUV9QT1JURl9JTlRCLCBJUlFfUE9SVEdfSU5UQiwgSVJRX1BPUlRIX0lOVEJ9OworI2lmZGVmIEJGNTM4X0ZBTUlMWQorc3RhdGljIHVuc2lnbmVkIGludCBzaWNfaXdyX2lycXNbXSA9IHtJUlFfUE9SVEZfSU5UQn07CisjZW5kaWYKKworI2lmIGRlZmluZWQoQkY1MjdfRkFNSUxZKSB8fCBkZWZpbmVkKEJGNTE4X0ZBTUlMWSkKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc2ljX2l3cl9pcnFzW10gPSB7SVJRX1BPUlRGX0lOVEIsIElSUV9QT1JUR19JTlRCLCBJUlFfUE9SVEhfSU5UQn07CiAjZW5kaWYKIAogI2lmZGVmIEJGNTYxX0ZBTUlMWQotc3RhdGljIHVuc2lnbmVkIGludCBzaWNfaXdyX2lycXNbZ3Bpb19iYW5rKE1BWF9CTEFDS0ZJTl9HUElPUyldID0ge0lSUV9QUk9HMF9JTlRCLCBJUlFfUFJPRzFfSU5UQiwgSVJRX1BST0cyX0lOVEJ9Oworc3RhdGljIHVuc2lnbmVkIGludCBzaWNfaXdyX2lycXNbXSA9IHtJUlFfUFJPRzBfSU5UQiwgSVJRX1BST0cxX0lOVEIsIElSUV9QUk9HMl9JTlRCfTsKICNlbmRpZgogI2VuZGlmCiAjZW5kaWYgLyogQ09ORklHX1BNICovCiAKLSNpZiBkZWZpbmVkKEJGNTQ4X0ZBTUlMWSkKIGlubGluZSBpbnQgY2hlY2tfZ3Bpbyh1bnNpZ25lZCBncGlvKQogeworI2lmIGRlZmluZWQoQkY1NDhfRkFNSUxZKQogCWlmIChncGlvID09IEdQSU9fUEIxNSB8fCBncGlvID09IEdQSU9fUEMxNCB8fCBncGlvID09IEdQSU9fUEMxNQogCSAgICB8fCBncGlvID09IEdQSU9fUEgxNCB8fCBncGlvID09IEdQSU9fUEgxNQotCSAgICB8fCBncGlvID09IEdQSU9fUEoxNCB8fCBncGlvID09IEdQSU9fUEoxNQotCSAgICB8fCBncGlvID49IE1BWF9CTEFDS0ZJTl9HUElPUykKKwkgICAgfHwgZ3BpbyA9PSBHUElPX1BKMTQgfHwgZ3BpbyA9PSBHUElPX1BKMTUpCiAJCXJldHVybiAtRUlOVkFMOwotCXJldHVybiAwOwotfQotI2Vsc2UKLWlubGluZSBpbnQgY2hlY2tfZ3Bpbyh1bnNpZ25lZCBncGlvKQoteworI2VuZGlmCiAJaWYgKGdwaW8gPj0gTUFYX0JMQUNLRklOX0dQSU9TKQogCQlyZXR1cm4gLUVJTlZBTDsKIAlyZXR1cm4gMDsKIH0KLSNlbmRpZgogCiBzdGF0aWMgdm9pZCBncGlvX2Vycm9yKHVuc2lnbmVkIGdwaW8pCiB7CkBAIC0yNTgsMzUgKzI1NywzMCBAQAogCX0KIAogCWlmIChsYWJlbCkKLQkJcmV0dXJuIHN0cm5jbXAoc3RyX2lkZW50W2lkZW50XS5uYW1lLAotCQkJCSBsYWJlbCwgc3RybGVuKGxhYmVsKSk7CisJCXJldHVybiBzdHJjbXAoc3RyX2lkZW50W2lkZW50XS5uYW1lLCBsYWJlbCk7CiAJZWxzZQogCQlyZXR1cm4gLUVJTlZBTDsKIH0KIAotI2lmIGRlZmluZWQoQkY1MjdfRkFNSUxZKSB8fCBkZWZpbmVkKEJGNTM3X0ZBTUlMWSkKIHN0YXRpYyB2b2lkIHBvcnRfc2V0dXAodW5zaWduZWQgZ3BpbywgdW5zaWduZWQgc2hvcnQgdXNhZ2UpCiB7Ci0JaWYgKCFjaGVja19ncGlvKGdwaW8pKSB7Ci0JCWlmICh1c2FnZSA9PSBHUElPX1VTQUdFKQotCQkJKnBvcnRfZmVyW2dwaW9fYmFuayhncGlvKV0gJj0gfmdwaW9fYml0KGdwaW8pOwotCQllbHNlCi0JCQkqcG9ydF9mZXJbZ3Bpb19iYW5rKGdwaW8pXSB8PSBncGlvX2JpdChncGlvKTsKLQkJU1NZTkMoKTsKLQl9Ci19CisJaWYgKGNoZWNrX2dwaW8oZ3BpbykpCisJCXJldHVybjsKKworI2lmIGRlZmluZWQoQkY1MjdfRkFNSUxZKSB8fCBkZWZpbmVkKEJGNTM3X0ZBTUlMWSkgfHwgZGVmaW5lZChCRjUxOF9GQU1JTFkpCisJaWYgKHVzYWdlID09IEdQSU9fVVNBR0UpCisJCSpwb3J0X2ZlcltncGlvX2JhbmsoZ3BpbyldICY9IH5ncGlvX2JpdChncGlvKTsKKwllbHNlCisJCSpwb3J0X2ZlcltncGlvX2JhbmsoZ3BpbyldIHw9IGdwaW9fYml0KGdwaW8pOworCVNTWU5DKCk7CiAjZWxpZiBkZWZpbmVkKEJGNTQ4X0ZBTUlMWSkKLXN0YXRpYyB2b2lkIHBvcnRfc2V0dXAodW5zaWduZWQgZ3BpbywgdW5zaWduZWQgc2hvcnQgdXNhZ2UpCi17CiAJaWYgKHVzYWdlID09IEdQSU9fVVNBR0UpCiAJCWdwaW9fYXJyYXlbZ3Bpb19iYW5rKGdwaW8pXS0+cG9ydF9mZXIgJj0gfmdwaW9fYml0KGdwaW8pOwogCWVsc2UKIAkJZ3Bpb19hcnJheVtncGlvX2JhbmsoZ3BpbyldLT5wb3J0X2ZlciB8PSBncGlvX2JpdChncGlvKTsKIAlTU1lOQygpOwotfQotI2Vsc2UKLSMgZGVmaW5lIHBvcnRfc2V0dXAoLi4uKSAgZG8geyB9IHdoaWxlICgwKQogI2VuZGlmCit9CiAKICNpZmRlZiBCRjUzN19GQU1JTFkKIHN0YXRpYyBzdHJ1Y3QgewpAQCAtMzc5LDcgKzM3Myw3IEBACiAKIAlyZXR1cm4gKHBtdXggPj4gKDIgKiBncGlvX3N1Yl9uKHBvcnRubykpICYgMHgzKTsKIH0KLSNlbGlmIGRlZmluZWQoQkY1MjdfRkFNSUxZKQorI2VsaWYgZGVmaW5lZChCRjUyN19GQU1JTFkpIHx8IGRlZmluZWQoQkY1MThfRkFNSUxZKQogaW5saW5lIHZvaWQgcG9ydG11eF9zZXR1cCh1bnNpZ25lZCBzaG9ydCBwb3J0bm8sIHVuc2lnbmVkIHNob3J0IGZ1bmN0aW9uKQogewogCXUxNiBwbXV4LCBpZGVudCA9IFBfSURFTlQocG9ydG5vKTsKQEAgLTQyOCwxMyArNDIyLDEzIEBACiB2b2lkIHNldF9ncGlvXyAjIyBuYW1lKHVuc2lnbmVkIGdwaW8sIHVuc2lnbmVkIHNob3J0IGFyZykgXAogeyBcCiAJdW5zaWduZWQgbG9uZyBmbGFnczsgXAotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsgXAorCWxvY2FsX2lycV9zYXZlX2h3KGZsYWdzKTsgXAogCWlmIChhcmcpIFwKIAkJZ3Bpb19iYW5rYltncGlvX2JhbmsoZ3BpbyldLT5uYW1lIHw9IGdwaW9fYml0KGdwaW8pOyBcCiAJZWxzZSBcCiAJCWdwaW9fYmFua2JbZ3Bpb19iYW5rKGdwaW8pXS0+bmFtZSAmPSB+Z3Bpb19iaXQoZ3Bpbyk7IFwKIAlBV0FfRFVNTVlfUkVBRChuYW1lKTsgXAotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsgXAorCWxvY2FsX2lycV9yZXN0b3JlX2h3KGZsYWdzKTsgXAogfSBcCiBFWFBPUlRfU1lNQk9MKHNldF9ncGlvXyAjIyBuYW1lKTsKIApAQCAtNDUwLDEzICs0NDQsMTMgQEAKIHZvaWQgc2V0X2dwaW9fICMjIG5hbWUodW5zaWduZWQgZ3BpbywgdW5zaWduZWQgc2hvcnQgYXJnKSBcCiB7IFwKIAl1bnNpZ25lZCBsb25nIGZsYWdzOyBcCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOyBcCisJbG9jYWxfaXJxX3NhdmVfaHcoZmxhZ3MpOyBcCiAJaWYgKGFyZykgXAogCQlncGlvX2JhbmtiW2dwaW9fYmFuayhncGlvKV0tPm5hbWUgIyMgX3NldCA9IGdwaW9fYml0KGdwaW8pOyBcCiAJZWxzZSBcCiAJCWdwaW9fYmFua2JbZ3Bpb19iYW5rKGdwaW8pXS0+bmFtZSAjIyBfY2xlYXIgPSBncGlvX2JpdChncGlvKTsgXAogCUFXQV9EVU1NWV9SRUFEKG5hbWUpOyBcCi0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOyBcCisJbG9jYWxfaXJxX3Jlc3RvcmVfaHcoZmxhZ3MpOyBcCiB9IFwKIEVYUE9SVF9TWU1CT0woc2V0X2dwaW9fICMjIG5hbWUpOwogI2Vsc2UKQEAgLTQ3OSwxMCArNDczLDEwIEBACiB2b2lkIHNldF9ncGlvX3RvZ2dsZSh1bnNpZ25lZCBncGlvKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCWxvY2FsX2lycV9zYXZlX2h3KGZsYWdzKTsKIAlncGlvX2JhbmtiW2dwaW9fYmFuayhncGlvKV0tPnRvZ2dsZSA9IGdwaW9fYml0KGdwaW8pOwogCUFXQV9EVU1NWV9SRUFEKHRvZ2dsZSk7Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCWxvY2FsX2lycV9yZXN0b3JlX2h3KGZsYWdzKTsKIH0KICNlbHNlCiB2b2lkIHNldF9ncGlvX3RvZ2dsZSh1bnNpZ25lZCBncGlvKQpAQCAtNTAwLDEwICs0OTQsMTAgQEAKIHZvaWQgc2V0X2dwaW9wXyAjIyBuYW1lKHVuc2lnbmVkIGdwaW8sIHVuc2lnbmVkIHNob3J0IGFyZykgXAogeyBcCiAJdW5zaWduZWQgbG9uZyBmbGFnczsgXAotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsgXAorCWxvY2FsX2lycV9zYXZlX2h3KGZsYWdzKTsgXAogCWdwaW9fYmFua2JbZ3Bpb19iYW5rKGdwaW8pXS0+bmFtZSA9IGFyZzsgXAogCUFXQV9EVU1NWV9SRUFEKG5hbWUpOyBcCi0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOyBcCisJbG9jYWxfaXJxX3Jlc3RvcmVfaHcoZmxhZ3MpOyBcCiB9IFwKIEVYUE9SVF9TWU1CT0woc2V0X2dwaW9wXyAjIyBuYW1lKTsKICNlbHNlCkBAIC01MzEsMTAgKzUyNSwxMCBAQAogeyBcCiAJdW5zaWduZWQgbG9uZyBmbGFnczsgXAogCXVuc2lnbmVkIHNob3J0IHJldDsgXAotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsgXAorCWxvY2FsX2lycV9zYXZlX2h3KGZsYWdzKTsgXAogCXJldCA9IDB4MDEgJiAoZ3Bpb19iYW5rYltncGlvX2JhbmsoZ3BpbyldLT5uYW1lID4+IGdwaW9fc3ViX24oZ3BpbykpOyBcCiAJQVdBX0RVTU1ZX1JFQUQobmFtZSk7IFwKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7IFwKKwlsb2NhbF9pcnFfcmVzdG9yZV9odyhmbGFncyk7IFwKIAlyZXR1cm4gcmV0OyBcCiB9IFwKIEVYUE9SVF9TWU1CT0woZ2V0X2dwaW9fICMjIG5hbWUpOwpAQCAtNTY0LDEwICs1NTgsMTAgQEAKIHsgXAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7IFwKIAl1bnNpZ25lZCBzaG9ydCByZXQ7IFwKLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7IFwKKwlsb2NhbF9pcnFfc2F2ZV9odyhmbGFncyk7IFwKIAlyZXQgPSAoZ3Bpb19iYW5rYltncGlvX2JhbmsoZ3BpbyldLT5uYW1lKTsgXAogCUFXQV9EVU1NWV9SRUFEKG5hbWUpOyBcCi0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOyBcCisJbG9jYWxfaXJxX3Jlc3RvcmVfaHcoZmxhZ3MpOyBcCiAJcmV0dXJuIHJldDsgXAogfSBcCiBFWFBPUlRfU1lNQk9MKGdldF9ncGlvcF8gIyMgbmFtZSk7CkBAIC02MTcsMTAgKzYxMSwxMCBAQAogCWlmICgoY2hlY2tfZ3BpbyhncGlvKSA8IDApIHx8ICF0eXBlKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlsb2NhbF9pcnFfc2F2ZV9odyhmbGFncyk7CiAJd2FrZXVwX21hcFtncGlvX2JhbmsoZ3BpbyldIHw9IGdwaW9fYml0KGdwaW8pOwogCXdha2V1cF9mbGFnc19tYXBbZ3Bpb10gPSB0eXBlOwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwlsb2NhbF9pcnFfcmVzdG9yZV9odyhmbGFncyk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTYzMywxMSArNjI3LDExIEBACiAJaWYgKGNoZWNrX2dwaW8oZ3BpbykgPCAwKQogCQlyZXR1cm47CiAKLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJbG9jYWxfaXJxX3NhdmVfaHcoZmxhZ3MpOwogCiAJd2FrZXVwX21hcFtncGlvX2JhbmsoZ3BpbyldICY9IH5ncGlvX2JpdChncGlvKTsKIAotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwlsb2NhbF9pcnFfcmVzdG9yZV9odyhmbGFncyk7CiB9CiBFWFBPUlRfU1lNQk9MKGdwaW9fcG1fd2FrZXVwX2ZyZWUpOwogCkBAIC02NzksNyArNjczLDcgQEAKIAkJZ3Bpb19iYW5rYltiYW5rXS0+bWFza2IgPSAwOwogCiAJCWlmIChtYXNrKSB7Ci0jaWYgZGVmaW5lZChCRjUyN19GQU1JTFkpIHx8IGRlZmluZWQoQkY1MzdfRkFNSUxZKQorI2lmIGRlZmluZWQoQkY1MjdfRkFNSUxZKSB8fCBkZWZpbmVkKEJGNTM3X0ZBTUlMWSkgfHwgZGVmaW5lZChCRjUxOF9GQU1JTFkpCiAJCQlncGlvX2Jhbmtfc2F2ZWRbYmFua10uZmVyICAgPSAqcG9ydF9mZXJbYmFua107CiAjZW5kaWYKIAkJCWdwaW9fYmFua19zYXZlZFtiYW5rXS5pbmVuICA9IGdwaW9fYmFua2JbYmFua10tPmluZW47CkBAIC03MjQsNyArNzE4LDcgQEAKIAkJYmFuayA9IGdwaW9fYmFuayhpKTsKIAogCQlpZiAobWFzaykgewotI2lmIGRlZmluZWQoQkY1MjdfRkFNSUxZKSB8fCBkZWZpbmVkKEJGNTM3X0ZBTUlMWSkKKyNpZiBkZWZpbmVkKEJGNTI3X0ZBTUlMWSkgfHwgZGVmaW5lZChCRjUzN19GQU1JTFkpIHx8IGRlZmluZWQoQkY1MThfRkFNSUxZKQogCQkJKnBvcnRfZmVyW2JhbmtdICAgCT0gZ3Bpb19iYW5rX3NhdmVkW2JhbmtdLmZlcjsKICNlbmRpZgogCQkJZ3Bpb19iYW5rYltiYW5rXS0+aW5lbiAgPSBncGlvX2Jhbmtfc2F2ZWRbYmFua10uaW5lbjsKQEAgLTc1MCw5ICs3NDQsOSBAQAogCWZvciAoaSA9IDA7IGkgPCBNQVhfQkxBQ0tGSU5fR1BJT1M7IGkgKz0gR1BJT19CQU5LU0laRSkgewogCQliYW5rID0gZ3Bpb19iYW5rKGkpOwogCi0jaWYgZGVmaW5lZChCRjUyN19GQU1JTFkpIHx8IGRlZmluZWQoQkY1MzdfRkFNSUxZKQorI2lmIGRlZmluZWQoQkY1MjdfRkFNSUxZKSB8fCBkZWZpbmVkKEJGNTM3X0ZBTUlMWSkgfHwgZGVmaW5lZChCRjUxOF9GQU1JTFkpCiAJCQlncGlvX2Jhbmtfc2F2ZWRbYmFua10uZmVyICAgPSAqcG9ydF9mZXJbYmFua107Ci0jaWZkZWYgQkY1MjdfRkFNSUxZCisjaWYgZGVmaW5lZChCRjUyN19GQU1JTFkpIHx8IGRlZmluZWQoQkY1MThfRkFNSUxZKQogCQkJZ3Bpb19iYW5rX3NhdmVkW2JhbmtdLm11eCAgID0gKnBvcnRfbXV4W2JhbmtdOwogI2Vsc2UKIAkJCWlmIChiYW5rID09IDApCkBAIC03NzgsOCArNzcyLDggQEAKIAlmb3IgKGkgPSAwOyBpIDwgTUFYX0JMQUNLRklOX0dQSU9TOyBpICs9IEdQSU9fQkFOS1NJWkUpIHsKIAkJCWJhbmsgPSBncGlvX2JhbmsoaSk7CiAKLSNpZiBkZWZpbmVkKEJGNTI3X0ZBTUlMWSkgfHwgZGVmaW5lZChCRjUzN19GQU1JTFkpCi0jaWZkZWYgQkY1MjdfRkFNSUxZCisjaWYgZGVmaW5lZChCRjUyN19GQU1JTFkpIHx8IGRlZmluZWQoQkY1MzdfRkFNSUxZKSB8fCBkZWZpbmVkKEJGNTE4X0ZBTUlMWSkKKyNpZiBkZWZpbmVkKEJGNTI3X0ZBTUlMWSkgfHwgZGVmaW5lZChCRjUxOF9GQU1JTFkpCiAJCQkqcG9ydF9tdXhbYmFua10gPSBncGlvX2Jhbmtfc2F2ZWRbYmFua10ubXV4OwogI2Vsc2UKIAkJCWlmIChiYW5rID09IDApCkBAIC04NzMsNyArODY3LDYgQEAKICogTU9ESUZJQ0FUSU9OIEhJU1RPUlkgOgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSNpZmRlZiBCRjU0OF9GQU1JTFkKIGludCBwZXJpcGhlcmFsX3JlcXVlc3QodW5zaWduZWQgc2hvcnQgcGVyLCBjb25zdCBjaGFyICpsYWJlbCkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwpAQCAtODg5LDMxICs4ODIsMzUgQEAKIAlpZiAoIShwZXIgJiBQX0RFRklORUQpKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCWlmIChjaGVja19ncGlvKGlkZW50KSA8IDApCi0JCXJldHVybiAtRUlOVkFMOworCWxvY2FsX2lycV9zYXZlX2h3KGZsYWdzKTsKIAotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQotCWlmICh1bmxpa2VseShyZXNlcnZlZF9ncGlvX21hcFtncGlvX2JhbmsoaWRlbnQpXSAmIGdwaW9fYml0KGlkZW50KSkpIHsKKwkvKiBJZiBhIHBpbiBjYW4gYmUgbXV4ZWQgYXMgZWl0aGVyIEdQSU8gb3IgcGVyaXBoZXJhbCwgbWFrZQorCSAqIHN1cmUgaXQgaXMgbm90IGFscmVhZHkgYSBHUElPIHBpbiB3aGVuIHdlIHJlcXVlc3QgaXQuCisJICovCisJaWYgKHVubGlrZWx5KCFjaGVja19ncGlvKGlkZW50KSAmJgorCSAgICByZXNlcnZlZF9ncGlvX21hcFtncGlvX2JhbmsoaWRlbnQpXSAmIGdwaW9fYml0KGlkZW50KSkpIHsKIAkJZHVtcF9zdGFjaygpOwogCQlwcmludGsoS0VSTl9FUlIKLQkJICAgICIlczogUGVyaXBoZXJhbCAlZCBpcyBhbHJlYWR5IHJlc2VydmVkIGFzIEdQSU8gYnkgJXMgIVxuIiwKKwkJICAgICAgICIlczogUGVyaXBoZXJhbCAlZCBpcyBhbHJlYWR5IHJlc2VydmVkIGFzIEdQSU8gYnkgJXMgIVxuIiwKIAkJICAgICAgIF9fZnVuY19fLCBpZGVudCwgZ2V0X2xhYmVsKGlkZW50KSk7Ci0JCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwkJbG9jYWxfaXJxX3Jlc3RvcmVfaHcoZmxhZ3MpOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KIAogCWlmICh1bmxpa2VseShyZXNlcnZlZF9wZXJpX21hcFtncGlvX2JhbmsoaWRlbnQpXSAmIGdwaW9fYml0KGlkZW50KSkpIHsKIAotCQl1MTYgZnVuY3QgPSBnZXRfcG9ydG11eChpZGVudCk7Ci0KIAkJLyoKIAkJICogUGluIGZ1bmN0aW9ucyBsaWtlIEFNQyBhZGRyZXNzIHN0cm9iZXMgbXkKIAkJICogYmUgcmVxdWVzdGVkIGFuZCB1c2VkIGJ5IHNldmVyYWwgZHJpdmVycwogCQkgKi8KIAotCQlpZiAoISgocGVyICYgUF9NQVlTSEFSRSkgJiYgKGZ1bmN0ID09IFBfRlVOQ1QyTVVYKHBlcikpKSkgeworI2lmZGVmIEJGNTQ4X0ZBTUlMWQorCQl1MTYgZnVuY3QgPSBnZXRfcG9ydG11eChpZGVudCk7CiAKKwkJaWYgKCEoKHBlciAmIFBfTUFZU0hBUkUpICYmIChmdW5jdCA9PSBQX0ZVTkNUMk1VWChwZXIpKSkpIHsKKyNlbHNlCisJCWlmICghKHBlciAmIFBfTUFZU0hBUkUpKSB7CisjZW5kaWYKIAkJCS8qCiAJCQkgKiBBbGxvdyB0aGF0IHRoZSBpZGVudGljYWwgcGluIGZ1bmN0aW9uIGNhbgogCQkJICogYmUgcmVxdWVzdGVkIGZyb20gdGhlIHNhbWUgZHJpdmVyIHR3aWNlCkBAIC05MjYsNyArOTIzLDcgQEAKIAkJCXByaW50ayhLRVJOX0VSUgogCQkJICAgICAgICIlczogUGVyaXBoZXJhbCAlZCBmdW5jdGlvbiAlZCBpcyBhbHJlYWR5IHJlc2VydmVkIGJ5ICVzICFcbiIsCiAJCQkgICAgICAgX19mdW5jX18sIGlkZW50LCBQX0ZVTkNUMk1VWChwZXIpLCBnZXRfbGFiZWwoaWRlbnQpKTsKLQkJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwkJCWxvY2FsX2lycV9yZXN0b3JlX2h3KGZsYWdzKTsKIAkJCXJldHVybiAtRUJVU1k7CiAJCX0KIAl9CkBAIC05MzQsODkgKzkzMSwxOSBAQAogIGFueXdheToKIAlyZXNlcnZlZF9wZXJpX21hcFtncGlvX2JhbmsoaWRlbnQpXSB8PSBncGlvX2JpdChpZGVudCk7CiAKKyNpZmRlZiBCRjU0OF9GQU1JTFkKIAlwb3J0bXV4X3NldHVwKGlkZW50LCBQX0ZVTkNUMk1VWChwZXIpKTsKLQlwb3J0X3NldHVwKGlkZW50LCBQRVJJUEhFUkFMX1VTQUdFKTsKLQotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLQlzZXRfbGFiZWwoaWRlbnQsIGxhYmVsKTsKLQotCXJldHVybiAwOwotfQotRVhQT1JUX1NZTUJPTChwZXJpcGhlcmFsX3JlcXVlc3QpOwogI2Vsc2UKLQotaW50IHBlcmlwaGVyYWxfcmVxdWVzdCh1bnNpZ25lZCBzaG9ydCBwZXIsIGNvbnN0IGNoYXIgKmxhYmVsKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdW5zaWduZWQgc2hvcnQgaWRlbnQgPSBQX0lERU5UKHBlcik7Ci0KLQkvKgotCSAqIERvbid0IGNhcmVzIGFyZSBwaW5zIHdpdGggb25seSBvbmUgZGVkaWNhdGVkIGZ1bmN0aW9uCi0JICovCi0KLQlpZiAocGVyICYgUF9ET05UQ0FSRSkKLQkJcmV0dXJuIDA7Ci0KLQlpZiAoIShwZXIgJiBQX0RFRklORUQpKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQotCWlmICghY2hlY2tfZ3BpbyhpZGVudCkpIHsKLQotCQlpZiAodW5saWtlbHkocmVzZXJ2ZWRfZ3Bpb19tYXBbZ3Bpb19iYW5rKGlkZW50KV0gJiBncGlvX2JpdChpZGVudCkpKSB7Ci0JCQlkdW1wX3N0YWNrKCk7Ci0JCQlwcmludGsoS0VSTl9FUlIKLQkJCSAgICAgICAiJXM6IFBlcmlwaGVyYWwgJWQgaXMgYWxyZWFkeSByZXNlcnZlZCBhcyBHUElPIGJ5ICVzICFcbiIsCi0JCQkgICAgICAgX19mdW5jX18sIGlkZW50LCBnZXRfbGFiZWwoaWRlbnQpKTsKLQkJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLQkJCXJldHVybiAtRUJVU1k7Ci0JCX0KLQotCX0KLQotCWlmICh1bmxpa2VseShyZXNlcnZlZF9wZXJpX21hcFtncGlvX2JhbmsoaWRlbnQpXSAmIGdwaW9fYml0KGlkZW50KSkpIHsKLQotCQkvKgotCQkgKiBQaW4gZnVuY3Rpb25zIGxpa2UgQU1DIGFkZHJlc3Mgc3Ryb2JlcyBteQotCQkgKiBiZSByZXF1ZXN0ZWQgYW5kIHVzZWQgYnkgc2V2ZXJhbCBkcml2ZXJzCi0JCSAqLwotCi0JCWlmICghKHBlciAmIFBfTUFZU0hBUkUpKSB7Ci0KLQkJCS8qCi0JCQkgKiBBbGxvdyB0aGF0IHRoZSBpZGVudGljYWwgcGluIGZ1bmN0aW9uIGNhbgotCQkJICogYmUgcmVxdWVzdGVkIGZyb20gdGhlIHNhbWUgZHJpdmVyIHR3aWNlCi0JCQkgKi8KLQotCQkJaWYgKGNtcF9sYWJlbChpZGVudCwgbGFiZWwpID09IDApCi0JCQkJZ290byBhbnl3YXk7Ci0KLQkJCWR1bXBfc3RhY2soKTsKLQkJCXByaW50ayhLRVJOX0VSUgotCQkJICAgICAgICIlczogUGVyaXBoZXJhbCAlZCBmdW5jdGlvbiAlZCBpcyBhbHJlYWR5IgotCQkJICAgICAgICIgcmVzZXJ2ZWQgYnkgJXMgIVxuIiwKLQkJCSAgICAgICBfX2Z1bmNfXywgaWRlbnQsIFBfRlVOQ1QyTVVYKHBlciksCi0JCQkJZ2V0X2xhYmVsKGlkZW50KSk7Ci0JCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci0JCQlyZXR1cm4gLUVCVVNZOwotCQl9Ci0KLQl9Ci0KLSBhbnl3YXk6CiAJcG9ydG11eF9zZXR1cChwZXIsIFBfRlVOQ1QyTVVYKHBlcikpOwotCisjZW5kaWYKIAlwb3J0X3NldHVwKGlkZW50LCBQRVJJUEhFUkFMX1VTQUdFKTsKIAotCXJlc2VydmVkX3BlcmlfbWFwW2dwaW9fYmFuayhpZGVudCldIHw9IGdwaW9fYml0KGlkZW50KTsKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJbG9jYWxfaXJxX3Jlc3RvcmVfaHcoZmxhZ3MpOwogCXNldF9sYWJlbChpZGVudCwgbGFiZWwpOwogCiAJcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MKHBlcmlwaGVyYWxfcmVxdWVzdCk7Ci0jZW5kaWYKIAogaW50IHBlcmlwaGVyYWxfcmVxdWVzdF9saXN0KGNvbnN0IHVuc2lnbmVkIHNob3J0IHBlcltdLCBjb25zdCBjaGFyICpsYWJlbCkKIHsKQEAgLTEwNTMsMTAgKzk4MCwxMCBAQAogCWlmIChjaGVja19ncGlvKGlkZW50KSA8IDApCiAJCXJldHVybjsKIAotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlsb2NhbF9pcnFfc2F2ZV9odyhmbGFncyk7CiAKIAlpZiAodW5saWtlbHkoIShyZXNlcnZlZF9wZXJpX21hcFtncGlvX2JhbmsoaWRlbnQpXSAmIGdwaW9fYml0KGlkZW50KSkpKSB7Ci0JCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwkJbG9jYWxfaXJxX3Jlc3RvcmVfaHcoZmxhZ3MpOwogCQlyZXR1cm47CiAJfQogCkBAIC0xMDY3LDcgKzk5NCw3IEBACiAKIAlzZXRfbGFiZWwoaWRlbnQsICJmcmVlIik7CiAKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJbG9jYWxfaXJxX3Jlc3RvcmVfaHcoZmxhZ3MpOwogfQogRVhQT1JUX1NZTUJPTChwZXJpcGhlcmFsX2ZyZWUpOwogCkBAIC0xMDk0LDE0ICsxMDIxLDE0IEBACiAqIE1PRElGSUNBVElPTiBISVNUT1JZIDoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1pbnQgZ3Bpb19yZXF1ZXN0KHVuc2lnbmVkIGdwaW8sIGNvbnN0IGNoYXIgKmxhYmVsKQoraW50IGJmaW5fZ3Bpb19yZXF1ZXN0KHVuc2lnbmVkIGdwaW8sIGNvbnN0IGNoYXIgKmxhYmVsKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlpZiAoY2hlY2tfZ3BpbyhncGlvKSA8IDApCiAJCXJldHVybiAtRUlOVkFMOwogCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCWxvY2FsX2lycV9zYXZlX2h3KGZsYWdzKTsKIAogCS8qCiAJICogQWxsb3cgdGhhdCB0aGUgaWRlbnRpY2FsIEdQSU8gY2FuCkBAIC0xMTEwLDE1ICsxMDM3LDE1IEBACiAJICovCiAKIAlpZiAoY21wX2xhYmVsKGdwaW8sIGxhYmVsKSA9PSAwKSB7Ci0JCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwkJbG9jYWxfaXJxX3Jlc3RvcmVfaHcoZmxhZ3MpOwogCQlyZXR1cm4gMDsKIAl9CiAKIAlpZiAodW5saWtlbHkocmVzZXJ2ZWRfZ3Bpb19tYXBbZ3Bpb19iYW5rKGdwaW8pXSAmIGdwaW9fYml0KGdwaW8pKSkgewogCQlkdW1wX3N0YWNrKCk7CiAJCXByaW50ayhLRVJOX0VSUiAiYmZpbi1ncGlvOiBHUElPICVkIGlzIGFscmVhZHkgcmVzZXJ2ZWQgYnkgJXMgIVxuIiwKLQkJCSBncGlvLCBnZXRfbGFiZWwoZ3BpbykpOwotCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJCSAgICAgICBncGlvLCBnZXRfbGFiZWwoZ3BpbykpOworCQlsb2NhbF9pcnFfcmVzdG9yZV9odyhmbGFncyk7CiAJCXJldHVybiAtRUJVU1k7CiAJfQogCWlmICh1bmxpa2VseShyZXNlcnZlZF9wZXJpX21hcFtncGlvX2JhbmsoZ3BpbyldICYgZ3Bpb19iaXQoZ3BpbykpKSB7CkBAIC0xMTI2LDM0ICsxMDUzLDM3IEBACiAJCXByaW50ayhLRVJOX0VSUgogCQkgICAgICAgImJmaW4tZ3BpbzogR1BJTyAlZCBpcyBhbHJlYWR5IHJlc2VydmVkIGFzIFBlcmlwaGVyYWwgYnkgJXMgIVxuIiwKIAkJICAgICAgIGdwaW8sIGdldF9sYWJlbChncGlvKSk7Ci0JCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwkJbG9jYWxfaXJxX3Jlc3RvcmVfaHcoZmxhZ3MpOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KKwlpZiAodW5saWtlbHkocmVzZXJ2ZWRfZ3Bpb19pcnFfbWFwW2dwaW9fYmFuayhncGlvKV0gJiBncGlvX2JpdChncGlvKSkpCisJCXByaW50ayhLRVJOX05PVElDRSAiYmZpbi1ncGlvOiBHUElPICVkIGlzIGFscmVhZHkgcmVzZXJ2ZWQgYXMgZ3Bpby1pcnEhIgorCQkgICAgICAgIiAoRG9jdW1lbnRhdGlvbi9ibGFja2Zpbi9iZmluLWdwaW8tbm90ZXMudHh0KVxuIiwgZ3Bpbyk7CiAKIAlyZXNlcnZlZF9ncGlvX21hcFtncGlvX2JhbmsoZ3BpbyldIHw9IGdwaW9fYml0KGdwaW8pOworCXNldF9sYWJlbChncGlvLCBsYWJlbCk7CiAKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJbG9jYWxfaXJxX3Jlc3RvcmVfaHcoZmxhZ3MpOwogCiAJcG9ydF9zZXR1cChncGlvLCBHUElPX1VTQUdFKTsKLQlzZXRfbGFiZWwoZ3BpbywgbGFiZWwpOwogCiAJcmV0dXJuIDA7CiB9Ci1FWFBPUlRfU1lNQk9MKGdwaW9fcmVxdWVzdCk7CitFWFBPUlRfU1lNQk9MKGJmaW5fZ3Bpb19yZXF1ZXN0KTsKIAotdm9pZCBncGlvX2ZyZWUodW5zaWduZWQgZ3BpbykKK3ZvaWQgYmZpbl9ncGlvX2ZyZWUodW5zaWduZWQgZ3BpbykKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJaWYgKGNoZWNrX2dwaW8oZ3BpbykgPCAwKQogCQlyZXR1cm47CiAKLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJbG9jYWxfaXJxX3NhdmVfaHcoZmxhZ3MpOwogCiAJaWYgKHVubGlrZWx5KCEocmVzZXJ2ZWRfZ3Bpb19tYXBbZ3Bpb19iYW5rKGdwaW8pXSAmIGdwaW9fYml0KGdwaW8pKSkpIHsKIAkJZHVtcF9zdGFjaygpOwogCQlncGlvX2Vycm9yKGdwaW8pOwotCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJCWxvY2FsX2lycV9yZXN0b3JlX2h3KGZsYWdzKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMTE2MSwxMyArMTA5MSw3NiBAQAogCiAJc2V0X2xhYmVsKGdwaW8sICJmcmVlIik7CiAKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJbG9jYWxfaXJxX3Jlc3RvcmVfaHcoZmxhZ3MpOwogfQotRVhQT1JUX1NZTUJPTChncGlvX2ZyZWUpOworRVhQT1JUX1NZTUJPTChiZmluX2dwaW9fZnJlZSk7CisKK2ludCBiZmluX2dwaW9faXJxX3JlcXVlc3QodW5zaWduZWQgZ3BpbywgY29uc3QgY2hhciAqbGFiZWwpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChjaGVja19ncGlvKGdwaW8pIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlsb2NhbF9pcnFfc2F2ZV9odyhmbGFncyk7CisKKwlpZiAodW5saWtlbHkocmVzZXJ2ZWRfZ3Bpb19pcnFfbWFwW2dwaW9fYmFuayhncGlvKV0gJiBncGlvX2JpdChncGlvKSkpIHsKKwkJZHVtcF9zdGFjaygpOworCQlwcmludGsoS0VSTl9FUlIKKwkJICAgICAgICJiZmluLWdwaW86IEdQSU8gJWQgaXMgYWxyZWFkeSByZXNlcnZlZCBhcyBncGlvLWlycSAhXG4iLAorCQkgICAgICAgZ3Bpbyk7CisJCWxvY2FsX2lycV9yZXN0b3JlX2h3KGZsYWdzKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisJaWYgKHVubGlrZWx5KHJlc2VydmVkX3BlcmlfbWFwW2dwaW9fYmFuayhncGlvKV0gJiBncGlvX2JpdChncGlvKSkpIHsKKwkJZHVtcF9zdGFjaygpOworCQlwcmludGsoS0VSTl9FUlIKKwkJICAgICAgICJiZmluLWdwaW86IEdQSU8gJWQgaXMgYWxyZWFkeSByZXNlcnZlZCBhcyBQZXJpcGhlcmFsIGJ5ICVzICFcbiIsCisJCSAgICAgICBncGlvLCBnZXRfbGFiZWwoZ3BpbykpOworCQlsb2NhbF9pcnFfcmVzdG9yZV9odyhmbGFncyk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCWlmICh1bmxpa2VseShyZXNlcnZlZF9ncGlvX21hcFtncGlvX2JhbmsoZ3BpbyldICYgZ3Bpb19iaXQoZ3BpbykpKQorCQlwcmludGsoS0VSTl9OT1RJQ0UgImJmaW4tZ3BpbzogR1BJTyAlZCBpcyBhbHJlYWR5IHJlc2VydmVkIGJ5ICVzISAiCisJCSAgICAgICAiKERvY3VtZW50YXRpb24vYmxhY2tmaW4vYmZpbi1ncGlvLW5vdGVzLnR4dClcbiIsCisJCSAgICAgICBncGlvLCBnZXRfbGFiZWwoZ3BpbykpOworCisJcmVzZXJ2ZWRfZ3Bpb19pcnFfbWFwW2dwaW9fYmFuayhncGlvKV0gfD0gZ3Bpb19iaXQoZ3Bpbyk7CisJc2V0X2xhYmVsKGdwaW8sIGxhYmVsKTsKKworCWxvY2FsX2lycV9yZXN0b3JlX2h3KGZsYWdzKTsKKworCXBvcnRfc2V0dXAoZ3BpbywgR1BJT19VU0FHRSk7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBiZmluX2dwaW9faXJxX2ZyZWUodW5zaWduZWQgZ3BpbykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKGNoZWNrX2dwaW8oZ3BpbykgPCAwKQorCQlyZXR1cm47CisKKwlsb2NhbF9pcnFfc2F2ZV9odyhmbGFncyk7CisKKwlpZiAodW5saWtlbHkoIShyZXNlcnZlZF9ncGlvX2lycV9tYXBbZ3Bpb19iYW5rKGdwaW8pXSAmIGdwaW9fYml0KGdwaW8pKSkpIHsKKwkJZHVtcF9zdGFjaygpOworCQlncGlvX2Vycm9yKGdwaW8pOworCQlsb2NhbF9pcnFfcmVzdG9yZV9odyhmbGFncyk7CisJCXJldHVybjsKKwl9CisKKwlyZXNlcnZlZF9ncGlvX2lycV9tYXBbZ3Bpb19iYW5rKGdwaW8pXSAmPSB+Z3Bpb19iaXQoZ3Bpbyk7CisKKwlzZXRfbGFiZWwoZ3BpbywgImZyZWUiKTsKKworCWxvY2FsX2lycV9yZXN0b3JlX2h3KGZsYWdzKTsKK30KIAogCiAjaWZkZWYgQkY1NDhfRkFNSUxZCi1pbnQgZ3Bpb19kaXJlY3Rpb25faW5wdXQodW5zaWduZWQgZ3BpbykKK2ludCBiZmluX2dwaW9fZGlyZWN0aW9uX2lucHV0KHVuc2lnbmVkIGdwaW8pCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIApAQCAtMTE3NiwxNiArMTE2OSwxNiBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJbG9jYWxfaXJxX3NhdmVfaHcoZmxhZ3MpOwogCWdwaW9fYXJyYXlbZ3Bpb19iYW5rKGdwaW8pXS0+cG9ydF9kaXJfY2xlYXIgPSBncGlvX2JpdChncGlvKTsKIAlncGlvX2FycmF5W2dwaW9fYmFuayhncGlvKV0tPnBvcnRfaW5lbiB8PSBncGlvX2JpdChncGlvKTsKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJbG9jYWxfaXJxX3Jlc3RvcmVfaHcoZmxhZ3MpOwogCiAJcmV0dXJuIDA7CiB9Ci1FWFBPUlRfU1lNQk9MKGdwaW9fZGlyZWN0aW9uX2lucHV0KTsKK0VYUE9SVF9TWU1CT0woYmZpbl9ncGlvX2RpcmVjdGlvbl9pbnB1dCk7CiAKLWludCBncGlvX2RpcmVjdGlvbl9vdXRwdXQodW5zaWduZWQgZ3BpbywgaW50IHZhbHVlKQoraW50IGJmaW5fZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KHVuc2lnbmVkIGdwaW8sIGludCB2YWx1ZSkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCkBAIC0xMTk0LDMwICsxMTg3LDMwIEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlsb2NhbF9pcnFfc2F2ZV9odyhmbGFncyk7CiAJZ3Bpb19hcnJheVtncGlvX2JhbmsoZ3BpbyldLT5wb3J0X2luZW4gJj0gfmdwaW9fYml0KGdwaW8pOwogCWdwaW9fc2V0X3ZhbHVlKGdwaW8sIHZhbHVlKTsKIAlncGlvX2FycmF5W2dwaW9fYmFuayhncGlvKV0tPnBvcnRfZGlyX3NldCA9IGdwaW9fYml0KGdwaW8pOwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwlsb2NhbF9pcnFfcmVzdG9yZV9odyhmbGFncyk7CiAKIAlyZXR1cm4gMDsKIH0KLUVYUE9SVF9TWU1CT0woZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KTsKK0VYUE9SVF9TWU1CT0woYmZpbl9ncGlvX2RpcmVjdGlvbl9vdXRwdXQpOwogCi12b2lkIGdwaW9fc2V0X3ZhbHVlKHVuc2lnbmVkIGdwaW8sIGludCBhcmcpCit2b2lkIGJmaW5fZ3Bpb19zZXRfdmFsdWUodW5zaWduZWQgZ3BpbywgaW50IGFyZykKIHsKIAlpZiAoYXJnKQogCQlncGlvX2FycmF5W2dwaW9fYmFuayhncGlvKV0tPnBvcnRfc2V0ID0gZ3Bpb19iaXQoZ3Bpbyk7CiAJZWxzZQogCQlncGlvX2FycmF5W2dwaW9fYmFuayhncGlvKV0tPnBvcnRfY2xlYXIgPSBncGlvX2JpdChncGlvKTsKIH0KLUVYUE9SVF9TWU1CT0woZ3Bpb19zZXRfdmFsdWUpOworRVhQT1JUX1NZTUJPTChiZmluX2dwaW9fc2V0X3ZhbHVlKTsKIAotaW50IGdwaW9fZ2V0X3ZhbHVlKHVuc2lnbmVkIGdwaW8pCitpbnQgYmZpbl9ncGlvX2dldF92YWx1ZSh1bnNpZ25lZCBncGlvKQogewogCXJldHVybiAoMSAmIChncGlvX2FycmF5W2dwaW9fYmFuayhncGlvKV0tPnBvcnRfZGF0YSA+PiBncGlvX3N1Yl9uKGdwaW8pKSk7CiB9Ci1FWFBPUlRfU1lNQk9MKGdwaW9fZ2V0X3ZhbHVlKTsKK0VYUE9SVF9TWU1CT0woYmZpbl9ncGlvX2dldF92YWx1ZSk7CiAKIHZvaWQgYmZpbl9ncGlvX2lycV9wcmVwYXJlKHVuc2lnbmVkIGdwaW8pCiB7CkBAIC0xMjI1LDM0ICsxMjE4LDM0IEBACiAKIAlwb3J0X3NldHVwKGdwaW8sIEdQSU9fVVNBR0UpOwogCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCWxvY2FsX2lycV9zYXZlX2h3KGZsYWdzKTsKIAlncGlvX2FycmF5W2dwaW9fYmFuayhncGlvKV0tPnBvcnRfZGlyX2NsZWFyID0gZ3Bpb19iaXQoZ3Bpbyk7CiAJZ3Bpb19hcnJheVtncGlvX2JhbmsoZ3BpbyldLT5wb3J0X2luZW4gfD0gZ3Bpb19iaXQoZ3Bpbyk7Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCWxvY2FsX2lycV9yZXN0b3JlX2h3KGZsYWdzKTsKIH0KIAogI2Vsc2UKIAotaW50IGdwaW9fZ2V0X3ZhbHVlKHVuc2lnbmVkIGdwaW8pCitpbnQgYmZpbl9ncGlvX2dldF92YWx1ZSh1bnNpZ25lZCBncGlvKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IHJldDsKIAogCWlmICh1bmxpa2VseShnZXRfZ3Bpb19lZGdlKGdwaW8pKSkgewotCQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJCWxvY2FsX2lycV9zYXZlX2h3KGZsYWdzKTsKIAkJc2V0X2dwaW9fZWRnZShncGlvLCAwKTsKIAkJcmV0ID0gZ2V0X2dwaW9fZGF0YShncGlvKTsKIAkJc2V0X2dwaW9fZWRnZShncGlvLCAxKTsKLQkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCQlsb2NhbF9pcnFfcmVzdG9yZV9odyhmbGFncyk7CiAKIAkJcmV0dXJuIHJldDsKIAl9IGVsc2UKIAkJcmV0dXJuIGdldF9ncGlvX2RhdGEoZ3Bpbyk7CiB9Ci1FWFBPUlRfU1lNQk9MKGdwaW9fZ2V0X3ZhbHVlKTsKK0VYUE9SVF9TWU1CT0woYmZpbl9ncGlvX2dldF92YWx1ZSk7CiAKIAotaW50IGdwaW9fZGlyZWN0aW9uX2lucHV0KHVuc2lnbmVkIGdwaW8pCitpbnQgYmZpbl9ncGlvX2RpcmVjdGlvbl9pbnB1dCh1bnNpZ25lZCBncGlvKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKQEAgLTEyNjEsMTcgKzEyNTQsMTcgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCWxvY2FsX2lycV9zYXZlX2h3KGZsYWdzKTsKIAlncGlvX2JhbmtiW2dwaW9fYmFuayhncGlvKV0tPmRpciAmPSB+Z3Bpb19iaXQoZ3Bpbyk7CiAJZ3Bpb19iYW5rYltncGlvX2JhbmsoZ3BpbyldLT5pbmVuIHw9IGdwaW9fYml0KGdwaW8pOwogCUFXQV9EVU1NWV9SRUFEKGluZW4pOwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwlsb2NhbF9pcnFfcmVzdG9yZV9odyhmbGFncyk7CiAKIAlyZXR1cm4gMDsKIH0KLUVYUE9SVF9TWU1CT0woZ3Bpb19kaXJlY3Rpb25faW5wdXQpOworRVhQT1JUX1NZTUJPTChiZmluX2dwaW9fZGlyZWN0aW9uX2lucHV0KTsKIAotaW50IGdwaW9fZGlyZWN0aW9uX291dHB1dCh1bnNpZ25lZCBncGlvLCBpbnQgdmFsdWUpCitpbnQgYmZpbl9ncGlvX2RpcmVjdGlvbl9vdXRwdXQodW5zaWduZWQgZ3BpbywgaW50IHZhbHVlKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKQEAgLTEyODAsNyArMTI3Myw3IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlsb2NhbF9pcnFfc2F2ZV9odyhmbGFncyk7CiAJZ3Bpb19iYW5rYltncGlvX2JhbmsoZ3BpbyldLT5pbmVuICY9IH5ncGlvX2JpdChncGlvKTsKIAogCWlmICh2YWx1ZSkKQEAgLTEyOTAsMTEgKzEyODMsMTEgQEAKIAogCWdwaW9fYmFua2JbZ3Bpb19iYW5rKGdwaW8pXS0+ZGlyIHw9IGdwaW9fYml0KGdwaW8pOwogCUFXQV9EVU1NWV9SRUFEKGRpcik7Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCWxvY2FsX2lycV9yZXN0b3JlX2h3KGZsYWdzKTsKIAogCXJldHVybiAwOwogfQotRVhQT1JUX1NZTUJPTChncGlvX2RpcmVjdGlvbl9vdXRwdXQpOworRVhQT1JUX1NZTUJPTChiZmluX2dwaW9fZGlyZWN0aW9uX291dHB1dCk7CiAKIC8qIElmIHdlIGFyZSBib290aW5nIGZyb20gU1BJIGFuZCBvdXIgYm9hcmQgbGFja3MgYSBzdHJvbmcgZW5vdWdoIHB1bGwgdXAsCiAgKiB0aGUgY29yZSBjYW4gcmVzZXQgYW5kIGV4ZWN1dGUgdGhlIGJvb3Ryb20gZmFzdGVyIHRoYW4gdGhlIHJlc2lzdG9yIGNhbgpAQCAtMTMyNywxNCArMTMyMCwxNyBAQAogc3RhdGljIGludCBncGlvX3Byb2NfcmVhZChjaGFyICpidWYsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LAogCQkJICBpbnQgbGVuLCBpbnQgKnVudXNlZF9pLCB2b2lkICp1bnVzZWRfdikKIHsKLQlpbnQgYywgb3V0bGVuID0gMDsKKwlpbnQgYywgaXJxLCBncGlvLCBvdXRsZW4gPSAwOwogCiAJZm9yIChjID0gMDsgYyA8IE1BWF9SRVNPVVJDRVM7IGMrKykgewotCQlpZiAoIWNoZWNrX2dwaW8oYykgJiYgKHJlc2VydmVkX2dwaW9fbWFwW2dwaW9fYmFuayhjKV0gJiBncGlvX2JpdChjKSkpCi0JCQlsZW4gPSBzcHJpbnRmKGJ1ZiwgIkdQSU9fJWQ6ICVzIFx0XHRHUElPICVzXG4iLCBjLAotCQkJCSBnZXRfbGFiZWwoYyksIGdldF9ncGlvX2RpcihjKSA/ICJPVVRQVVQiIDogIklOUFVUIik7CisJCWlycSA9IHJlc2VydmVkX2dwaW9faXJxX21hcFtncGlvX2JhbmsoYyldICYgZ3Bpb19iaXQoYyk7CisJCWdwaW8gPSByZXNlcnZlZF9ncGlvX21hcFtncGlvX2JhbmsoYyldICYgZ3Bpb19iaXQoYyk7CisJCWlmICghY2hlY2tfZ3BpbyhjKSAmJiAoZ3BpbyB8fCBpcnEpKQorCQkJbGVuID0gc3ByaW50ZihidWYsICJHUElPXyVkOiBcdCVzJXMgXHRcdEdQSU8gJXNcbiIsIGMsCisJCQkJIGdldF9sYWJlbChjKSwgKGdwaW8gJiYgaXJxKSA/ICIgKiIgOiAiIiwKKwkJCQkgZ2V0X2dwaW9fZGlyKGMpID8gIk9VVFBVVCIgOiAiSU5QVVQiKTsKIAkJZWxzZSBpZiAocmVzZXJ2ZWRfcGVyaV9tYXBbZ3Bpb19iYW5rKGMpXSAmIGdwaW9fYml0KGMpKQotCQkJbGVuID0gc3ByaW50ZihidWYsICJHUElPXyVkOiAlcyBcdFx0UGVyaXBoZXJhbFxuIiwgYywgZ2V0X2xhYmVsKGMpKTsKKwkJCWxlbiA9IHNwcmludGYoYnVmLCAiR1BJT18lZDogXHQlcyBcdFx0UGVyaXBoZXJhbFxuIiwgYywgZ2V0X2xhYmVsKGMpKTsKIAkJZWxzZQogCQkJY29udGludWU7CiAJCWJ1ZiArPSBsZW47CkBAIC0xMzU0LDMgKzEzNTAsNTcgQEAKIH0KIF9faW5pdGNhbGwoZ3Bpb19yZWdpc3Rlcl9wcm9jKTsKICNlbmRpZgorCisjaWZkZWYgQ09ORklHX0dQSU9MSUIKK2ludCBiZmluX2dwaW9saWJfZGlyZWN0aW9uX2lucHV0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIGdwaW8pCit7CisJcmV0dXJuIGJmaW5fZ3Bpb19kaXJlY3Rpb25faW5wdXQoZ3Bpbyk7Cit9CisKK2ludCBiZmluX2dwaW9saWJfZGlyZWN0aW9uX291dHB1dChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBncGlvLCBpbnQgbGV2ZWwpCit7CisJcmV0dXJuIGJmaW5fZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KGdwaW8sIGxldmVsKTsKK30KKworaW50IGJmaW5fZ3Bpb2xpYl9nZXRfdmFsdWUoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgZ3BpbykKK3sKKwlyZXR1cm4gYmZpbl9ncGlvX2dldF92YWx1ZShncGlvKTsKK30KKwordm9pZCBiZmluX2dwaW9saWJfc2V0X3ZhbHVlKHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIGdwaW8sIGludCB2YWx1ZSkKK3sKKyNpZmRlZiBCRjU0OF9GQU1JTFkKKwlyZXR1cm4gYmZpbl9ncGlvX3NldF92YWx1ZShncGlvLCB2YWx1ZSk7CisjZWxzZQorCXJldHVybiBzZXRfZ3Bpb19kYXRhKGdwaW8sIHZhbHVlKTsKKyNlbmRpZgorfQorCitpbnQgYmZpbl9ncGlvbGliX2dwaW9fcmVxdWVzdChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBncGlvKQoreworCXJldHVybiBiZmluX2dwaW9fcmVxdWVzdChncGlvLCBjaGlwLT5sYWJlbCk7Cit9CisKK3ZvaWQgYmZpbl9ncGlvbGliX2dwaW9fZnJlZShzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBncGlvKQoreworCXJldHVybiBiZmluX2dwaW9fZnJlZShncGlvKTsKK30KKworc3RhdGljIHN0cnVjdCBncGlvX2NoaXAgYmZpbl9jaGlwID0geworCS5sYWJlbAkJCT0gIkJsYWNrZmluLUdQSU9saWIiLAorCS5kaXJlY3Rpb25faW5wdXQJPSBiZmluX2dwaW9saWJfZGlyZWN0aW9uX2lucHV0LAorCS5nZXQJCQk9IGJmaW5fZ3Bpb2xpYl9nZXRfdmFsdWUsCisJLmRpcmVjdGlvbl9vdXRwdXQJPSBiZmluX2dwaW9saWJfZGlyZWN0aW9uX291dHB1dCwKKwkuc2V0CQkJPSBiZmluX2dwaW9saWJfc2V0X3ZhbHVlLAorCS5yZXF1ZXN0CQk9IGJmaW5fZ3Bpb2xpYl9ncGlvX3JlcXVlc3QsCisJLmZyZWUJCQk9IGJmaW5fZ3Bpb2xpYl9ncGlvX2ZyZWUsCisJLmJhc2UJCQk9IDAsCisJLm5ncGlvCQkJPSBNQVhfQkxBQ0tGSU5fR1BJT1MsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBiZmluX2dwaW9saWJfc2V0dXAodm9pZCkKK3sKKwlyZXR1cm4gZ3Bpb2NoaXBfYWRkKCZiZmluX2NoaXApOworfQorYXJjaF9pbml0Y2FsbChiZmluX2dwaW9saWJfc2V0dXApOworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2tlcm5lbC9iZmluX2tzeW1zLmMgYi9hcmNoL2JsYWNrZmluL2tlcm5lbC9iZmluX2tzeW1zLmMKaW5kZXggNDM2NzMzMC4uMDFmOTE3ZCAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwvYmZpbl9rc3ltcy5jCisrKyBiL2FyY2gvYmxhY2tmaW4va2VybmVsL2JmaW5fa3N5bXMuYwpAQCAtMSw1MiArMSwyNSBAQAogLyoKLSAqIEZpbGU6ICAgICAgICAgYXJjaC9ibGFja2Zpbi9rZXJuZWwvYmZpbl9rc3ltcy5jCi0gKiBCYXNlZCBvbjogICAgIG5vbmUgLSBvcmlnaW5hbCB3b3JrCi0gKiBBdXRob3I6CisgKiBhcmNoL2JsYWNrZmluL2tlcm5lbC9iZmluX2tzeW1zLmMgLSBleHBvcnRzIGZvciByYW5kb20gc3ltYm9scwogICoKLSAqIENyZWF0ZWQ6Ci0gKiBEZXNjcmlwdGlvbjoKKyAqIENvcHlyaWdodCAyMDA0LTIwMDggQW5hbG9nIERldmljZXMgSW5jLgogICoKLSAqIE1vZGlmaWVkOgotICogICAgICAgICAgICAgICBDb3B5cmlnaHQgMjAwNC0yMDA2IEFuYWxvZyBEZXZpY2VzIEluYy4KLSAqCi0gKiBCdWdzOiAgICAgICAgIEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLwotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIHRoZSBmaWxlIENPUFlJTkcsIG9yIHdyaXRlCi0gKiB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KICAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgogCi0jaW5jbHVkZSA8YXNtL2NoZWNrc3VtLmg+CiAjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KIAotLyogcGxhdGZvcm0gZGVwZW5kZW50IHN1cHBvcnQgKi8KLQotRVhQT1JUX1NZTUJPTChfX2lvcmVtYXApOwotCi1FWFBPUlRfU1lNQk9MKGlwX2Zhc3RfY3N1bSk7Ci0KLUVYUE9SVF9TWU1CT0woa2VybmVsX3RocmVhZCk7Ci0KLUVYUE9SVF9TWU1CT0woaXNfaW5fcm9tKTsKKy8qIEFsbG93IHBlb3BsZSB0byBoYXZlIHRoZWlyIG93biBCbGFja2ZpbiBleGNlcHRpb24gaGFuZGxlciBpbiBhIG1vZHVsZSAqLwogRVhQT1JUX1NZTUJPTChiZmluX3JldHVybl9mcm9tX2V4Y2VwdGlvbik7CiAKLS8qIE5ldHdvcmtpbmcgaGVscGVyIHJvdXRpbmVzLiAqLwotRVhQT1JUX1NZTUJPTChjc3VtX3BhcnRpYWxfY29weSk7CisvKiBBbGwgdGhlIEJsYWNrZmluIGNhY2hlIGZ1bmN0aW9uczogbWFjaC1jb21tb24vY2FjaGUuUyAqLworRVhQT1JUX1NZTUJPTChibGFja2Zpbl9kY2FjaGVfaW52YWxpZGF0ZV9yYW5nZSk7CitFWFBPUlRfU1lNQk9MKGJsYWNrZmluX2ljYWNoZV9kY2FjaGVfZmx1c2hfcmFuZ2UpOworRVhQT1JUX1NZTUJPTChibGFja2Zpbl9pY2FjaGVfZmx1c2hfcmFuZ2UpOworRVhQT1JUX1NZTUJPTChibGFja2Zpbl9kY2FjaGVfZmx1c2hfcmFuZ2UpOworRVhQT1JUX1NZTUJPTChibGFja2Zpbl9kZmx1c2hfcGFnZSk7CiAKIC8qIFRoZSBmb2xsb3dpbmcgYXJlIHNwZWNpYWwgYmVjYXVzZSB0aGV5J3JlIG5vdCBjYWxsZWQKICAqIGV4cGxpY2l0bHkgKHRoZSBDIGNvbXBpbGVyIGdlbmVyYXRlcyB0aGVtKS4gIEZvcnR1bmF0ZWx5LApAQCAtNzQsOCArNDcsNiBAQAogZXh0ZXJuIHZvaWQgX19tdWxkaTModm9pZCk7CiBleHRlcm4gdm9pZCBfX3VkaXZzaTModm9pZCk7CiBleHRlcm4gdm9pZCBfX3Vtb2RzaTModm9pZCk7Ci0KLS8qIGdjYyBsaWIgZnVuY3Rpb25zICovCiBFWFBPUlRfU1lNQk9MKF9fYXNobGRpMyk7CiBFWFBPUlRfU1lNQk9MKF9fYXNocmRpMyk7CiBFWFBPUlRfU1lNQk9MKF9fdW11bHNpM19oaWdocGFydCk7CkBAIC04Nyw2ICs1OCw3IEBACiBFWFBPUlRfU1lNQk9MKF9fdWRpdnNpMyk7CiBFWFBPUlRfU1lNQk9MKF9fdW1vZHNpMyk7CiAKKy8qIElucHV0L291dHB1dCBzeW1ib2xzOiBsaWIve2luLG91dH1zLlMgKi8KIEVYUE9SVF9TWU1CT0wob3V0c2IpOwogRVhQT1JUX1NZTUJPTChpbnNiKTsKIEVYUE9SVF9TWU1CT0wob3V0c3cpOwpAQCAtOTYsMjAgKzY4LDM5IEBACiBFWFBPUlRfU1lNQk9MKG91dHNsKTsKIEVYUE9SVF9TWU1CT0woaW5zbCk7CiBFWFBPUlRfU1lNQk9MKGluc2xfMTYpOwotRVhQT1JUX1NZTUJPTChpcnFfZmxhZ3MpOwotRVhQT1JUX1NZTUJPTChpb3VubWFwKTsKLUVYUE9SVF9TWU1CT0woYmxhY2tmaW5fZGNhY2hlX2ludmFsaWRhdGVfcmFuZ2UpOwotRVhQT1JUX1NZTUJPTChibGFja2Zpbl9pY2FjaGVfZGNhY2hlX2ZsdXNoX3JhbmdlKTsKLUVYUE9SVF9TWU1CT0woYmxhY2tmaW5faWNhY2hlX2ZsdXNoX3JhbmdlKTsKLUVYUE9SVF9TWU1CT0woYmxhY2tmaW5fZGNhY2hlX2ZsdXNoX3JhbmdlKTsKLUVYUE9SVF9TWU1CT0woYmxhY2tmaW5fZGZsdXNoX3BhZ2UpOwogCi1FWFBPUlRfU1lNQk9MKGNzdW1fcGFydGlhbCk7Ci1FWFBPUlRfU1lNQk9MKF9faW5pdF9iZWdpbik7Ci1FWFBPUlRfU1lNQk9MKF9faW5pdF9lbmQpOwotRVhQT1JUX1NZTUJPTChfZWJzc19sMSk7Ci1FWFBPUlRfU1lNQk9MKF9zdGV4dF9sMSk7Ci1FWFBPUlRfU1lNQk9MKF9ldGV4dF9sMSk7Ci1FWFBPUlRfU1lNQk9MKF9zZGF0YV9sMSk7Ci1FWFBPUlRfU1lNQk9MKF9lYnNzX2JfbDEpOwotRVhQT1JUX1NZTUJPTChfc2RhdGFfYl9sMSk7CisjaWZkZWYgQ09ORklHX1NNUAorRVhQT1JUX1NZTUJPTChfX3Jhd19hdG9taWNfdXBkYXRlX2FzbSk7CitFWFBPUlRfU1lNQk9MKF9fcmF3X2F0b21pY19jbGVhcl9hc20pOworRVhQT1JUX1NZTUJPTChfX3Jhd19hdG9taWNfc2V0X2FzbSk7CitFWFBPUlRfU1lNQk9MKF9fcmF3X2F0b21pY194b3JfYXNtKTsKK0VYUE9SVF9TWU1CT0woX19yYXdfYXRvbWljX3Rlc3RfYXNtKTsKK0VYUE9SVF9TWU1CT0woX19yYXdfeGNoZ18xX2FzbSk7CitFWFBPUlRfU1lNQk9MKF9fcmF3X3hjaGdfMl9hc20pOworRVhQT1JUX1NZTUJPTChfX3Jhd194Y2hnXzRfYXNtKTsKK0VYUE9SVF9TWU1CT0woX19yYXdfY21weGNoZ18xX2FzbSk7CitFWFBPUlRfU1lNQk9MKF9fcmF3X2NtcHhjaGdfMl9hc20pOworRVhQT1JUX1NZTUJPTChfX3Jhd19jbXB4Y2hnXzRfYXNtKTsKK0VYUE9SVF9TWU1CT0woX19yYXdfc3Bpbl9pc19sb2NrZWRfYXNtKTsKK0VYUE9SVF9TWU1CT0woX19yYXdfc3Bpbl9sb2NrX2FzbSk7CitFWFBPUlRfU1lNQk9MKF9fcmF3X3NwaW5fdHJ5bG9ja19hc20pOworRVhQT1JUX1NZTUJPTChfX3Jhd19zcGluX3VubG9ja19hc20pOworRVhQT1JUX1NZTUJPTChfX3Jhd19yZWFkX2xvY2tfYXNtKTsKK0VYUE9SVF9TWU1CT0woX19yYXdfcmVhZF90cnlsb2NrX2FzbSk7CitFWFBPUlRfU1lNQk9MKF9fcmF3X3JlYWRfdW5sb2NrX2FzbSk7CitFWFBPUlRfU1lNQk9MKF9fcmF3X3dyaXRlX2xvY2tfYXNtKTsKK0VYUE9SVF9TWU1CT0woX19yYXdfd3JpdGVfdHJ5bG9ja19hc20pOworRVhQT1JUX1NZTUJPTChfX3Jhd193cml0ZV91bmxvY2tfYXNtKTsKK0VYUE9SVF9TWU1CT0woX19yYXdfYml0X3NldF9hc20pOworRVhQT1JUX1NZTUJPTChfX3Jhd19iaXRfY2xlYXJfYXNtKTsKK0VYUE9SVF9TWU1CT0woX19yYXdfYml0X3RvZ2dsZV9hc20pOworRVhQT1JUX1NZTUJPTChfX3Jhd19iaXRfdGVzdF9hc20pOworRVhQT1JUX1NZTUJPTChfX3Jhd19iaXRfdGVzdF9zZXRfYXNtKTsKK0VYUE9SVF9TWU1CT0woX19yYXdfYml0X3Rlc3RfY2xlYXJfYXNtKTsKK0VYUE9SVF9TWU1CT0woX19yYXdfYml0X3Rlc3RfdG9nZ2xlX2FzbSk7CitFWFBPUlRfU1lNQk9MKF9fcmF3X3VuY2FjaGVkX2ZldGNoX2FzbSk7CisjaWZkZWYgX19BUkNIX1NZTkNfQ09SRV9EQ0FDSEUKK0VYUE9SVF9TWU1CT0woX19yYXdfc21wX21hcmtfYmFycmllcl9hc20pOworRVhQT1JUX1NZTUJPTChfX3Jhd19zbXBfY2hlY2tfYmFycmllcl9hc20pOworI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4va2VybmVsL2NwbGItbXB1L01ha2VmaWxlIGIvYXJjaC9ibGFja2Zpbi9rZXJuZWwvY3BsYi1tcHUvTWFrZWZpbGUKaW5kZXggMjg2YjY5My4uN2Q3MGQzYiAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwvY3BsYi1tcHUvTWFrZWZpbGUKKysrIGIvYXJjaC9ibGFja2Zpbi9rZXJuZWwvY3BsYi1tcHUvTWFrZWZpbGUKQEAgLTQsNSArNCw3IEBACiAKIG9iai15IDo9IGNwbGJpbml0Lm8gY2FjaGVpbml0Lm8gY3BsYm1nci5vCiAKLW9iai0kKENPTkZJR19DUExCX0lORk8pICs9IGNwbGJpbmZvLm8KLQorQ0ZMQUdTX2NwbGJtZ3IubyA6PSAtZmZpeGVkLUkwIC1mZml4ZWQtSTEgLWZmaXhlZC1JMiAtZmZpeGVkLUkzIFwKKwkJICAgIC1mZml4ZWQtTDAgLWZmaXhlZC1MMSAtZmZpeGVkLUwyIC1mZml4ZWQtTDMgXAorCQkgICAgLWZmaXhlZC1NMCAtZmZpeGVkLU0xIC1mZml4ZWQtTTIgLWZmaXhlZC1NMyBcCisJCSAgICAtZmZpeGVkLUIwIC1mZml4ZWQtQjEgLWZmaXhlZC1CMiAtZmZpeGVkLUIzCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2tlcm5lbC9jcGxiLW1wdS9jYWNoZWluaXQuYyBiL2FyY2gvYmxhY2tmaW4va2VybmVsL2NwbGItbXB1L2NhY2hlaW5pdC5jCmluZGV4IGE4YjcxMmEuLmM2ZmY5NDcgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4va2VybmVsL2NwbGItbXB1L2NhY2hlaW5pdC5jCisrKyBiL2FyY2gvYmxhY2tmaW4va2VybmVsL2NwbGItbXB1L2NhY2hlaW5pdC5jCkBAIC0yNSw3ICsyNSw3IEBACiAjaW5jbHVkZSA8YXNtL2NwbGJpbml0Lmg+CiAKICNpZiBkZWZpbmVkKENPTkZJR19CRklOX0lDQUNIRSkKLXZvaWQgX19pbml0IGJmaW5faWNhY2hlX2luaXQodm9pZCkKK3ZvaWQgX19jcHVpbml0IGJmaW5faWNhY2hlX2luaXQoc3RydWN0IGNwbGJfZW50cnkgKmljcGxiX3RibCkKIHsKIAl1bnNpZ25lZCBsb25nIGN0cmw7CiAJaW50IGk7CkBAIC00Myw3ICs0Myw3IEBACiAjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX0JGSU5fRENBQ0hFKQotdm9pZCBfX2luaXQgYmZpbl9kY2FjaGVfaW5pdCh2b2lkKQordm9pZCBfX2NwdWluaXQgYmZpbl9kY2FjaGVfaW5pdChzdHJ1Y3QgY3BsYl9lbnRyeSAqZGNwbGJfdGJsKQogewogCXVuc2lnbmVkIGxvbmcgY3RybDsKIAlpbnQgaTsKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4va2VybmVsL2NwbGItbXB1L2NwbGJpbmZvLmMgYi9hcmNoL2JsYWNrZmluL2tlcm5lbC9jcGxiLW1wdS9jcGxiaW5mby5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjJiZWVmLi4wMDAwMDAwCi0tLSBhL2FyY2gvYmxhY2tmaW4va2VybmVsL2NwbGItbXB1L2NwbGJpbmZvLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyoKLSAqIEZpbGU6ICAgICAgICAgYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9jcGxiaW5mby5jCi0gKiBCYXNlZCBvbjoKLSAqIEF1dGhvcjogICAgICAgU29uaWMgWmhhbmcgPHNvbmljLnpoYW5nQGFuYWxvZy5jb20+Ci0gKgotICogQ3JlYXRlZDogICAgICBKYW4uIDIwMDUKLSAqIERlc2NyaXB0aW9uOiAgRGlzcGxheSBDUExCIHN0YXR1cwotICoKLSAqIE1vZGlmaWVkOgotICogICAgICAgICAgICAgICBDb3B5cmlnaHQgMjAwNC0yMDA2IEFuYWxvZyBEZXZpY2VzIEluYy4KLSAqCi0gKiBCdWdzOiAgICAgICAgIEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLwotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIHRoZSBmaWxlIENPUFlJTkcsIG9yIHdyaXRlCi0gKiB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KLSNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+Ci0KLSNpbmNsdWRlIDxhc20vY3VycmVudC5oPgotI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KLSNpbmNsdWRlIDxhc20vY3BsYi5oPgotI2luY2x1ZGUgPGFzbS9jcGxiaW5pdC5oPgotI2luY2x1ZGUgPGFzbS9ibGFja2Zpbi5oPgotCi1zdGF0aWMgY2hhciBwYWdlX3NpemVfc3RyaW5nX3RhYmxlW11bNF0gPSB7ICIxSyIsICI0SyIsICIxTSIsICI0TSIgfTsKLQotc3RhdGljIGNoYXIgKmNwbGJfcHJpbnRfZW50cnkoY2hhciAqYnVmLCBzdHJ1Y3QgY3BsYl9lbnRyeSAqdGJsLCBpbnQgc3dpdGNoZWQpCi17Ci0JaW50IGk7Ci0JYnVmICs9IHNwcmludGYoYnVmLCAiSW5kZXhcdEFkZHJlc3NcdFx0RGF0YVx0U2l6ZVx0VS9SRFx0VS9XUlx0Uy9XUlx0U3dpdGNoXG4iKTsKLQlmb3IgKGkgPSAwOyBpIDwgTUFYX0NQTEJTOyBpKyspIHsKLQkJdW5zaWduZWQgbG9uZyBkYXRhID0gdGJsW2ldLmRhdGE7Ci0JCXVuc2lnbmVkIGxvbmcgYWRkciA9IHRibFtpXS5hZGRyOwotCQlpZiAoIShkYXRhICYgQ1BMQl9WQUxJRCkpCi0JCQljb250aW51ZTsKLQotCQlidWYgKz0KLQkJICAgIHNwcmludGYoYnVmLAotCQkJICAgICIlZFx0MHglMDhseFx0JTA2bHhcdCVzXHQlY1x0JWNcdCVjXHQlY1xuIiwKLQkJCSAgICBpLCBhZGRyLCBkYXRhLAotCQkJICAgIHBhZ2Vfc2l6ZV9zdHJpbmdfdGFibGVbKGRhdGEgJiAweDMwMDAwKSA+PiAxNl0sCi0JCQkgICAgKGRhdGEgJiBDUExCX1VTRVJfUkQpID8gJ1knIDogJ04nLAotCQkJICAgIChkYXRhICYgQ1BMQl9VU0VSX1dSKSA/ICdZJyA6ICdOJywKLQkJCSAgICAoZGF0YSAmIENQTEJfU1VQVl9XUikgPyAnWScgOiAnTicsCi0JCQkgICAgaSA8IHN3aXRjaGVkID8gJ04nIDogJ1knKTsKLQl9Ci0JYnVmICs9IHNwcmludGYoYnVmLCAiXG4iKTsKLQotCXJldHVybiBidWY7Ci19Ci0KLWludCBjcGxiaW5mb19wcm9jX291dHB1dChjaGFyICpidWYpCi17Ci0JY2hhciAqcDsKLQotCXAgPSBidWY7Ci0KLQlwICs9IHNwcmludGYocCwgIi0tLS0tLS0tLS0tLS0tLS0tLSBDUExCIEluZm9ybWF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLVxuXG4iKTsKLQotCWlmIChiZmluX3JlYWRfSU1FTV9DT05UUk9MKCkgJiBFTklDUExCKSB7Ci0JCXAgKz0gc3ByaW50ZihwLCAiSW5zdHJ1Y3Rpb24gQ1BMQiBlbnRyeTpcbiIpOwotCQlwID0gY3BsYl9wcmludF9lbnRyeShwLCBpY3BsYl90YmwsIGZpcnN0X3N3aXRjaGVkX2ljcGxiKTsKLQl9IGVsc2UKLQkJcCArPSBzcHJpbnRmKHAsICJJbnN0cnVjdGlvbiBDUExCIGlzIGRpc2FibGVkLlxuXG4iKTsKLQotCWlmICgxIHx8IGJmaW5fcmVhZF9ETUVNX0NPTlRST0woKSAmIEVORENQTEIpIHsKLQkJcCArPSBzcHJpbnRmKHAsICJEYXRhIENQTEIgZW50cnk6XG4iKTsKLQkJcCA9IGNwbGJfcHJpbnRfZW50cnkocCwgZGNwbGJfdGJsLCBmaXJzdF9zd2l0Y2hlZF9kY3BsYik7Ci0JfSBlbHNlCi0JCXAgKz0gc3ByaW50ZihwLCAiRGF0YSBDUExCIGlzIGRpc2FibGVkLlxuIik7Ci0KLQlwICs9IHNwcmludGYocCwgIklDUExCIG1pc3M6ICVkXG5JQ1BMQiBzdXBlcnZpc29yIG1pc3M6ICVkXG4iLAotCQkgICAgIG5yX2ljcGxiX21pc3MsIG5yX2ljcGxiX3N1cHZfbWlzcyk7Ci0JcCArPSBzcHJpbnRmKHAsICJEQ1BMQiBtaXNzOiAlZFxuRENQTEIgcHJvdGVjdGlvbiBmYXVsdDolZFxuIiwKLQkJICAgICBucl9kY3BsYl9taXNzLCBucl9kY3BsYl9wcm90KTsKLQlwICs9IHNwcmludGYocCwgIkNQTEIgZmx1c2hlczogJWRcbiIsCi0JCSAgICAgbnJfY3BsYl9mbHVzaCk7Ci0KLQlyZXR1cm4gcCAtIGJ1ZjsKLX0KLQotc3RhdGljIGludCBjcGxiaW5mb19yZWFkX3Byb2MoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsCi0JCQkgICAgICBpbnQgY291bnQsIGludCAqZW9mLCB2b2lkICpkYXRhKQotewotCWludCBsZW47Ci0KLQlsZW4gPSBjcGxiaW5mb19wcm9jX291dHB1dChwYWdlKTsKLQlpZiAobGVuIDw9IG9mZiArIGNvdW50KQotCQkqZW9mID0gMTsKLQkqc3RhcnQgPSBwYWdlICsgb2ZmOwotCWxlbiAtPSBvZmY7Ci0JaWYgKGxlbiA+IGNvdW50KQotCQlsZW4gPSBjb3VudDsKLQlpZiAobGVuIDwgMCkKLQkJbGVuID0gMDsKLQlyZXR1cm4gbGVuOwotfQotCi1zdGF0aWMgaW50IF9faW5pdCBjcGxiaW5mb19pbml0KHZvaWQpCi17Ci0Jc3RydWN0IHByb2NfZGlyX2VudHJ5ICplbnRyeTsKLQotCWVudHJ5ID0gY3JlYXRlX3Byb2NfZW50cnkoImNwbGJpbmZvIiwgMCwgTlVMTCk7Ci0JaWYgKCFlbnRyeSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQllbnRyeS0+cmVhZF9wcm9jID0gY3BsYmluZm9fcmVhZF9wcm9jOwotCWVudHJ5LT5kYXRhID0gTlVMTDsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgY3BsYmluZm9fZXhpdCh2b2lkKQotewotCXJlbW92ZV9wcm9jX2VudHJ5KCJjcGxiaW5mbyIsIE5VTEwpOwotfQotCi1tb2R1bGVfaW5pdChjcGxiaW5mb19pbml0KTsKLW1vZHVsZV9leGl0KGNwbGJpbmZvX2V4aXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwvY3BsYi1tcHUvY3BsYmluaXQuYyBiL2FyY2gvYmxhY2tmaW4va2VybmVsL2NwbGItbXB1L2NwbGJpbml0LmMKaW5kZXggNTVhZjcyOS4uYmRiOTU4NCAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwvY3BsYi1tcHUvY3BsYmluaXQuYworKysgYi9hcmNoL2JsYWNrZmluL2tlcm5lbC9jcGxiLW1wdS9jcGxiaW5pdC5jCkBAIC0yNSwxOCArMjUsMTkgQEAKICNpbmNsdWRlIDxhc20vYmxhY2tmaW4uaD4KICNpbmNsdWRlIDxhc20vY3BsYi5oPgogI2luY2x1ZGUgPGFzbS9jcGxiaW5pdC5oPgorI2luY2x1ZGUgPGFzbS9tZW1fbWFwLmg+CiAKICNpZiBBTk9NQUxZXzA1MDAwMjYzCiAjIGVycm9yIHRoZSBNUFUgd2lsbCBub3QgZnVuY3Rpb24gc2FmZWx5IHdoaWxlIEFub21hbHkgMDUwMDAyNjMgYXBwbGllcwogI2VuZGlmCiAKLXN0cnVjdCBjcGxiX2VudHJ5IGljcGxiX3RibFtNQVhfQ1BMQlNdOwotc3RydWN0IGNwbGJfZW50cnkgZGNwbGJfdGJsW01BWF9DUExCU107CitzdHJ1Y3QgY3BsYl9lbnRyeSBpY3BsYl90YmxbTlJfQ1BVU11bTUFYX0NQTEJTXTsKK3N0cnVjdCBjcGxiX2VudHJ5IGRjcGxiX3RibFtOUl9DUFVTXVtNQVhfQ1BMQlNdOwogCiBpbnQgZmlyc3Rfc3dpdGNoZWRfaWNwbGIsIGZpcnN0X3N3aXRjaGVkX2RjcGxiOwogaW50IGZpcnN0X21hc2tfZGNwbGI7CiAKLXZvaWQgX19pbml0IGdlbmVyYXRlX2NwbGJfdGFibGVzKHZvaWQpCit2b2lkIF9faW5pdCBnZW5lcmF0ZV9jcGxiX3RhYmxlc19jcHUodW5zaWduZWQgaW50IGNwdSkKIHsKIAlpbnQgaV9kLCBpX2k7CiAJdW5zaWduZWQgbG9uZyBhZGRyOwpAQCAtNTUsMTUgKzU2LDE2IEBACiAJZF9jYWNoZSB8PSBDUExCX0wxX0FPVyB8IENQTEJfV1Q7CiAjZW5kaWYKICNlbmRpZgorCiAJaV9kID0gaV9pID0gMDsKIAogCS8qIFNldCB1cCB0aGUgemVybyBwYWdlLiAgKi8KLQlkY3BsYl90YmxbaV9kXS5hZGRyID0gMDsKLQlkY3BsYl90YmxbaV9kKytdLmRhdGEgPSBTRFJBTV9PT1BTIHwgUEFHRV9TSVpFXzFLQjsKKwlkY3BsYl90YmxbY3B1XVtpX2RdLmFkZHIgPSAwOworCWRjcGxiX3RibFtjcHVdW2lfZCsrXS5kYXRhID0gU0RSQU1fT09QUyB8IFBBR0VfU0laRV8xS0I7CiAKICNpZiAwCi0JaWNwbGJfdGJsW2lfaV0uYWRkciA9IDA7Ci0JaWNwbGJfdGJsW2lfaSsrXS5kYXRhID0gaV9jYWNoZSB8IENQTEJfVVNFUl9SRCB8IFBBR0VfU0laRV80S0I7CisJaWNwbGJfdGJsW2NwdV1baV9pXS5hZGRyID0gMDsKKwlpY3BsYl90YmxbY3B1XVtpX2krK10uZGF0YSA9IGlfY2FjaGUgfCBDUExCX1VTRVJfUkQgfCBQQUdFX1NJWkVfNEtCOwogI2VuZGlmCiAKIAkvKiBDb3ZlciBrZXJuZWwgbWVtb3J5IHdpdGggNE0gcGFnZXMuICAqLwpAQCAtNzIsMjggKzc0LDI4IEBACiAJaV9kYXRhID0gaV9jYWNoZSB8IENQTEJfVkFMSUQgfCBDUExCX1BPUlRQUklPIHwgUEFHRV9TSVpFXzRNQjsKIAogCWZvciAoOyBhZGRyIDwgbWVtb3J5X3N0YXJ0OyBhZGRyICs9IDQgKiAxMDI0ICogMTAyNCkgewotCQlkY3BsYl90YmxbaV9kXS5hZGRyID0gYWRkcjsKLQkJZGNwbGJfdGJsW2lfZCsrXS5kYXRhID0gZF9kYXRhOwotCQlpY3BsYl90YmxbaV9pXS5hZGRyID0gYWRkcjsKLQkJaWNwbGJfdGJsW2lfaSsrXS5kYXRhID0gaV9kYXRhIHwgKGFkZHIgPT0gMCA/IENQTEJfVVNFUl9SRCA6IDApOworCQlkY3BsYl90YmxbY3B1XVtpX2RdLmFkZHIgPSBhZGRyOworCQlkY3BsYl90YmxbY3B1XVtpX2QrK10uZGF0YSA9IGRfZGF0YTsKKwkJaWNwbGJfdGJsW2NwdV1baV9pXS5hZGRyID0gYWRkcjsKKwkJaWNwbGJfdGJsW2NwdV1baV9pKytdLmRhdGEgPSBpX2RhdGEgfCAoYWRkciA9PSAwID8gQ1BMQl9VU0VSX1JEIDogMCk7CiAJfQogCiAJLyogQ292ZXIgTDEgbWVtb3J5LiAgT25lIDRNIGFyZWEgZm9yIGNvZGUgYW5kIGRhdGEgZWFjaCBpcyBlbm91Z2guICAqLwogI2lmIEwxX0RBVEFfQV9MRU5HVEggPiAwIHx8IEwxX0RBVEFfQl9MRU5HVEggPiAwCi0JZGNwbGJfdGJsW2lfZF0uYWRkciA9IEwxX0RBVEFfQV9TVEFSVDsKLQlkY3BsYl90YmxbaV9kKytdLmRhdGEgPSBMMV9ETUVNT1JZIHwgUEFHRV9TSVpFXzRNQjsKKwlkY3BsYl90YmxbY3B1XVtpX2RdLmFkZHIgPSBnZXRfbDFfZGF0YV9hX3N0YXJ0X2NwdShjcHUpOworCWRjcGxiX3RibFtjcHVdW2lfZCsrXS5kYXRhID0gTDFfRE1FTU9SWSB8IFBBR0VfU0laRV80TUI7CiAjZW5kaWYKICNpZiBMMV9DT0RFX0xFTkdUSCA+IDAKLQlpY3BsYl90YmxbaV9pXS5hZGRyID0gTDFfQ09ERV9TVEFSVDsKLQlpY3BsYl90YmxbaV9pKytdLmRhdGEgPSBMMV9JTUVNT1JZIHwgUEFHRV9TSVpFXzRNQjsKKwlpY3BsYl90YmxbY3B1XVtpX2ldLmFkZHIgPSBnZXRfbDFfY29kZV9zdGFydF9jcHUoY3B1KTsKKwlpY3BsYl90YmxbY3B1XVtpX2krK10uZGF0YSA9IEwxX0lNRU1PUlkgfCBQQUdFX1NJWkVfNE1COwogI2VuZGlmCiAKIAkvKiBDb3ZlciBMMiBtZW1vcnkgKi8KICNpZiBMMl9MRU5HVEggPiAwCi0JZGNwbGJfdGJsW2lfZF0uYWRkciA9IEwyX1NUQVJUOwotCWRjcGxiX3RibFtpX2QrK10uZGF0YSA9IEwyX0RNRU1PUlkgfCBQQUdFX1NJWkVfMU1COwotCWljcGxiX3RibFtpX2ldLmFkZHIgPSBMMl9TVEFSVDsKLQlpY3BsYl90YmxbaV9pKytdLmRhdGEgPSBMMl9JTUVNT1JZIHwgUEFHRV9TSVpFXzFNQjsKKwlkY3BsYl90YmxbY3B1XVtpX2RdLmFkZHIgPSBMMl9TVEFSVDsKKwlkY3BsYl90YmxbY3B1XVtpX2QrK10uZGF0YSA9IEwyX0RNRU1PUlkgfCBQQUdFX1NJWkVfMU1COworCWljcGxiX3RibFtjcHVdW2lfaV0uYWRkciA9IEwyX1NUQVJUOworCWljcGxiX3RibFtjcHVdW2lfaSsrXS5kYXRhID0gTDJfSU1FTU9SWSB8IFBBR0VfU0laRV8xTUI7CiAjZW5kaWYKIAogCWZpcnN0X21hc2tfZGNwbGIgPSBpX2Q7CkBAIC0xMDEsNyArMTAzLDExIEBACiAJZmlyc3Rfc3dpdGNoZWRfaWNwbGIgPSBpX2k7CiAKIAl3aGlsZSAoaV9kIDwgTUFYX0NQTEJTKQotCQlkY3BsYl90YmxbaV9kKytdLmRhdGEgPSAwOworCQlkY3BsYl90YmxbY3B1XVtpX2QrK10uZGF0YSA9IDA7CiAJd2hpbGUgKGlfaSA8IE1BWF9DUExCUykKLQkJaWNwbGJfdGJsW2lfaSsrXS5kYXRhID0gMDsKKwkJaWNwbGJfdGJsW2NwdV1baV9pKytdLmRhdGEgPSAwOworfQorCit2b2lkIGdlbmVyYXRlX2NwbGJfdGFibGVzX2FsbCh2b2lkKQorewogfQpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwvY3BsYi1tcHUvY3BsYm1nci5jIGIvYXJjaC9ibGFja2Zpbi9rZXJuZWwvY3BsYi1tcHUvY3BsYm1nci5jCmluZGV4IGJhYTUyZTIuLjg3NDYzY2UgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4va2VybmVsL2NwbGItbXB1L2NwbGJtZ3IuYworKysgYi9hcmNoL2JsYWNrZmluL2tlcm5lbC9jcGxiLW1wdS9jcGxibWdyLmMKQEAgLTI1LDE1ICsyNSwyMSBAQAogI2luY2x1ZGUgPGFzbS9jcGxiaW5pdC5oPgogI2luY2x1ZGUgPGFzbS9tbXVfY29udGV4dC5oPgogCi0jZGVmaW5lIEZBVUxUX1JXCSgxIDw8IDE2KQotI2RlZmluZSBGQVVMVF9VU0VSU1VQVgkoMSA8PCAxNykKKy8qCisgKiBXQVJOSU5HCisgKgorICogVGhpcyBmaWxlIGlzIGNvbXBpbGVkIHdpdGggY2VydGFpbiAtZmZpeGVkLXJlZyBvcHRpb25zLiAgV2UgaGF2ZSB0bworICogbWFrZSBzdXJlIG5vdCB0byBjYWxsIGFueSBmdW5jdGlvbnMgaGVyZSB0aGF0IGNvdWxkIGNsb2JiZXIgdGhlc2UKKyAqIHJlZ2lzdGVycy4KKyAqLwogCiBpbnQgcGFnZV9tYXNrX25lbHRzOwogaW50IHBhZ2VfbWFza19vcmRlcjsKLXVuc2lnbmVkIGxvbmcgKmN1cnJlbnRfcnd4X21hc2s7Cit1bnNpZ25lZCBsb25nICpjdXJyZW50X3J3eF9tYXNrW05SX0NQVVNdOwogCi1pbnQgbnJfZGNwbGJfbWlzcywgbnJfaWNwbGJfbWlzcywgbnJfaWNwbGJfc3Vwdl9taXNzLCBucl9kY3BsYl9wcm90OwotaW50IG5yX2NwbGJfZmx1c2g7CitpbnQgbnJfZGNwbGJfbWlzc1tOUl9DUFVTXSwgbnJfaWNwbGJfbWlzc1tOUl9DUFVTXTsKK2ludCBucl9pY3BsYl9zdXB2X21pc3NbTlJfQ1BVU10sIG5yX2RjcGxiX3Byb3RbTlJfQ1BVU107CitpbnQgbnJfY3BsYl9mbHVzaFtOUl9DUFVTXTsKIAogc3RhdGljIGlubGluZSB2b2lkIGRpc2FibGVfZGNwbGIodm9pZCkKIHsKQEAgLTk4LDQyICsxMDQsNDIgQEAKIH0KIAogLyogQ291bnRlcnMgdG8gaW1wbGVtZW50IHJvdW5kLXJvYmluIHJlcGxhY2VtZW50LiAgKi8KLXN0YXRpYyBpbnQgaWNwbGJfcnJfaW5kZXgsIGRjcGxiX3JyX2luZGV4Oworc3RhdGljIGludCBpY3BsYl9ycl9pbmRleFtOUl9DUFVTXSwgZGNwbGJfcnJfaW5kZXhbTlJfQ1BVU107CiAKIC8qCiAgKiBGaW5kIGFuIElDUExCIGVudHJ5IHRvIGJlIGV2aWN0ZWQgYW5kIHJldHVybiBpdHMgaW5kZXguCiAgKi8KLXN0YXRpYyBpbnQgZXZpY3Rfb25lX2ljcGxiKHZvaWQpCitzdGF0aWMgaW50IGV2aWN0X29uZV9pY3BsYih1bnNpZ25lZCBpbnQgY3B1KQogewogCWludCBpOwogCWZvciAoaSA9IGZpcnN0X3N3aXRjaGVkX2ljcGxiOyBpIDwgTUFYX0NQTEJTOyBpKyspCi0JCWlmICgoaWNwbGJfdGJsW2ldLmRhdGEgJiBDUExCX1ZBTElEKSA9PSAwKQorCQlpZiAoKGljcGxiX3RibFtjcHVdW2ldLmRhdGEgJiBDUExCX1ZBTElEKSA9PSAwKQogCQkJcmV0dXJuIGk7Ci0JaSA9IGZpcnN0X3N3aXRjaGVkX2ljcGxiICsgaWNwbGJfcnJfaW5kZXg7CisJaSA9IGZpcnN0X3N3aXRjaGVkX2ljcGxiICsgaWNwbGJfcnJfaW5kZXhbY3B1XTsKIAlpZiAoaSA+PSBNQVhfQ1BMQlMpIHsKIAkJaSAtPSBNQVhfQ1BMQlMgLSBmaXJzdF9zd2l0Y2hlZF9pY3BsYjsKLQkJaWNwbGJfcnJfaW5kZXggLT0gTUFYX0NQTEJTIC0gZmlyc3Rfc3dpdGNoZWRfaWNwbGI7CisJCWljcGxiX3JyX2luZGV4W2NwdV0gLT0gTUFYX0NQTEJTIC0gZmlyc3Rfc3dpdGNoZWRfaWNwbGI7CiAJfQotCWljcGxiX3JyX2luZGV4Kys7CisJaWNwbGJfcnJfaW5kZXhbY3B1XSsrOwogCXJldHVybiBpOwogfQogCi1zdGF0aWMgaW50IGV2aWN0X29uZV9kY3BsYih2b2lkKQorc3RhdGljIGludCBldmljdF9vbmVfZGNwbGIodW5zaWduZWQgaW50IGNwdSkKIHsKIAlpbnQgaTsKIAlmb3IgKGkgPSBmaXJzdF9zd2l0Y2hlZF9kY3BsYjsgaSA8IE1BWF9DUExCUzsgaSsrKQotCQlpZiAoKGRjcGxiX3RibFtpXS5kYXRhICYgQ1BMQl9WQUxJRCkgPT0gMCkKKwkJaWYgKChkY3BsYl90YmxbY3B1XVtpXS5kYXRhICYgQ1BMQl9WQUxJRCkgPT0gMCkKIAkJCXJldHVybiBpOwotCWkgPSBmaXJzdF9zd2l0Y2hlZF9kY3BsYiArIGRjcGxiX3JyX2luZGV4OworCWkgPSBmaXJzdF9zd2l0Y2hlZF9kY3BsYiArIGRjcGxiX3JyX2luZGV4W2NwdV07CiAJaWYgKGkgPj0gTUFYX0NQTEJTKSB7CiAJCWkgLT0gTUFYX0NQTEJTIC0gZmlyc3Rfc3dpdGNoZWRfZGNwbGI7Ci0JCWRjcGxiX3JyX2luZGV4IC09IE1BWF9DUExCUyAtIGZpcnN0X3N3aXRjaGVkX2RjcGxiOworCQlkY3BsYl9ycl9pbmRleFtjcHVdIC09IE1BWF9DUExCUyAtIGZpcnN0X3N3aXRjaGVkX2RjcGxiOwogCX0KLQlkY3BsYl9ycl9pbmRleCsrOworCWRjcGxiX3JyX2luZGV4W2NwdV0rKzsKIAlyZXR1cm4gaTsKIH0KIAotc3RhdGljIG5vaW5saW5lIGludCBkY3BsYl9taXNzKHZvaWQpCitzdGF0aWMgbm9pbmxpbmUgaW50IGRjcGxiX21pc3ModW5zaWduZWQgaW50IGNwdSkKIHsKIAl1bnNpZ25lZCBsb25nIGFkZHIgPSBiZmluX3JlYWRfRENQTEJfRkFVTFRfQUREUigpOwogCWludCBzdGF0dXMgPSBiZmluX3JlYWRfRENQTEJfU1RBVFVTKCk7CkBAIC0xNDEsNyArMTQ3LDcgQEAKIAlpbnQgaWR4OwogCXVuc2lnbmVkIGxvbmcgZF9kYXRhOwogCi0JbnJfZGNwbGJfbWlzcysrOworCW5yX2RjcGxiX21pc3NbY3B1XSsrOwogCiAJZF9kYXRhID0gQ1BMQl9TVVBWX1dSIHwgQ1BMQl9WQUxJRCB8IENQTEJfRElSVFkgfCBQQUdFX1NJWkVfNEtCOwogI2lmZGVmIENPTkZJR19CRklOX0RDQUNIRQpAQCAtMTY4LDI1ICsxNzQsMjUgQEAKIAl9IGVsc2UgaWYgKGFkZHIgPj0gX3JhbWVuZCkgewogCSAgICBkX2RhdGEgfD0gQ1BMQl9VU0VSX1JEIHwgQ1BMQl9VU0VSX1dSOwogCX0gZWxzZSB7Ci0JCW1hc2sgPSBjdXJyZW50X3J3eF9tYXNrOworCQltYXNrID0gY3VycmVudF9yd3hfbWFza1tjcHVdOwogCQlpZiAobWFzaykgewogCQkJaW50IHBhZ2UgPSBhZGRyID4+IFBBR0VfU0hJRlQ7Ci0JCQlpbnQgb2ZmcyA9IHBhZ2UgPj4gNTsKKwkJCWludCBpZHggPSBwYWdlID4+IDU7CiAJCQlpbnQgYml0ID0gMSA8PCAocGFnZSAmIDMxKTsKIAotCQkJaWYgKG1hc2tbb2Zmc10gJiBiaXQpCisJCQlpZiAobWFza1tpZHhdICYgYml0KQogCQkJCWRfZGF0YSB8PSBDUExCX1VTRVJfUkQ7CiAKIAkJCW1hc2sgKz0gcGFnZV9tYXNrX25lbHRzOwotCQkJaWYgKG1hc2tbb2Zmc10gJiBiaXQpCisJCQlpZiAobWFza1tpZHhdICYgYml0KQogCQkJCWRfZGF0YSB8PSBDUExCX1VTRVJfV1I7CiAJCX0KIAl9Ci0JaWR4ID0gZXZpY3Rfb25lX2RjcGxiKCk7CisJaWR4ID0gZXZpY3Rfb25lX2RjcGxiKGNwdSk7CiAKIAlhZGRyICY9IFBBR0VfTUFTSzsKLQlkY3BsYl90YmxbaWR4XS5hZGRyID0gYWRkcjsKLQlkY3BsYl90YmxbaWR4XS5kYXRhID0gZF9kYXRhOworCWRjcGxiX3RibFtjcHVdW2lkeF0uYWRkciA9IGFkZHI7CisJZGNwbGJfdGJsW2NwdV1baWR4XS5kYXRhID0gZF9kYXRhOwogCiAJZGlzYWJsZV9kY3BsYigpOwogCWJmaW5fd3JpdGUzMihEQ1BMQl9EQVRBMCArIGlkeCAqIDQsIGRfZGF0YSk7CkBAIC0xOTYsMjEgKzIwMiwyMSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgbm9pbmxpbmUgaW50IGljcGxiX21pc3Modm9pZCkKK3N0YXRpYyBub2lubGluZSBpbnQgaWNwbGJfbWlzcyh1bnNpZ25lZCBpbnQgY3B1KQogewogCXVuc2lnbmVkIGxvbmcgYWRkciA9IGJmaW5fcmVhZF9JQ1BMQl9GQVVMVF9BRERSKCk7CiAJaW50IHN0YXR1cyA9IGJmaW5fcmVhZF9JQ1BMQl9TVEFUVVMoKTsKIAlpbnQgaWR4OwogCXVuc2lnbmVkIGxvbmcgaV9kYXRhOwogCi0JbnJfaWNwbGJfbWlzcysrOworCW5yX2ljcGxiX21pc3NbY3B1XSsrOwogCiAJLyogSWYgaW5zaWRlIHRoZSB1bmNhY2hlZCBETUEgcmVnaW9uLCBmYXVsdC4gICovCiAJaWYgKGFkZHIgPj0gX3JhbWVuZCAtIERNQV9VTkNBQ0hFRF9SRUdJT04gJiYgYWRkciA8IF9yYW1lbmQpCiAJCXJldHVybiBDUExCX1BST1RfVklPTDsKIAogCWlmIChzdGF0dXMgJiBGQVVMVF9VU0VSU1VQVikKLQkJbnJfaWNwbGJfc3Vwdl9taXNzKys7CisJCW5yX2ljcGxiX3N1cHZfbWlzc1tjcHVdKys7CiAKIAkvKgogCSAqIEZpcnN0LCB0cnkgdG8gZmluZCBhIENQTEIgdGhhdCBtYXRjaGVzIHRoaXMgYWRkcmVzcy4gIElmIHdlCkBAIC0yMTgsOCArMjI0LDggQEAKIAkgKiB0aGF0IHRoZSBpbnN0cnVjdGlvbiBjcm9zc2VzIGEgcGFnZSBib3VuZGFyeS4KIAkgKi8KIAlmb3IgKGlkeCA9IGZpcnN0X3N3aXRjaGVkX2ljcGxiOyBpZHggPCBNQVhfQ1BMQlM7IGlkeCsrKSB7Ci0JCWlmIChpY3BsYl90YmxbaWR4XS5kYXRhICYgQ1BMQl9WQUxJRCkgewotCQkJdW5zaWduZWQgbG9uZyB0aGlzX2FkZHIgPSBpY3BsYl90YmxbaWR4XS5hZGRyOworCQlpZiAoaWNwbGJfdGJsW2NwdV1baWR4XS5kYXRhICYgQ1BMQl9WQUxJRCkgeworCQkJdW5zaWduZWQgbG9uZyB0aGlzX2FkZHIgPSBpY3BsYl90YmxbY3B1XVtpZHhdLmFkZHI7CiAJCQlpZiAodGhpc19hZGRyIDw9IGFkZHIgJiYgdGhpc19hZGRyICsgUEFHRV9TSVpFID4gYWRkcikgewogCQkJCWFkZHIgKz0gUEFHRV9TSVpFOwogCQkJCWJyZWFrOwpAQCAtMjU3LDIzICsyNjMsMjMgQEAKIAkJICogT3RoZXJ3aXNlLCBjaGVjayB0aGUgeCBiaXRtYXAgb2YgdGhlIGN1cnJlbnQgcHJvY2Vzcy4KIAkJICovCiAJCWlmICghKHN0YXR1cyAmIEZBVUxUX1VTRVJTVVBWKSkgewotCQkJdW5zaWduZWQgbG9uZyAqbWFzayA9IGN1cnJlbnRfcnd4X21hc2s7CisJCQl1bnNpZ25lZCBsb25nICptYXNrID0gY3VycmVudF9yd3hfbWFza1tjcHVdOwogCiAJCQlpZiAobWFzaykgewogCQkJCWludCBwYWdlID0gYWRkciA+PiBQQUdFX1NISUZUOwotCQkJCWludCBvZmZzID0gcGFnZSA+PiA1OworCQkJCWludCBpZHggPSBwYWdlID4+IDU7CiAJCQkJaW50IGJpdCA9IDEgPDwgKHBhZ2UgJiAzMSk7CiAKIAkJCQltYXNrICs9IDIgKiBwYWdlX21hc2tfbmVsdHM7Ci0JCQkJaWYgKG1hc2tbb2Zmc10gJiBiaXQpCisJCQkJaWYgKG1hc2tbaWR4XSAmIGJpdCkKIAkJCQkJaV9kYXRhIHw9IENQTEJfVVNFUl9SRDsKIAkJCX0KIAkJfQogCX0KLQlpZHggPSBldmljdF9vbmVfaWNwbGIoKTsKKwlpZHggPSBldmljdF9vbmVfaWNwbGIoY3B1KTsKIAlhZGRyICY9IFBBR0VfTUFTSzsKLQlpY3BsYl90YmxbaWR4XS5hZGRyID0gYWRkcjsKLQlpY3BsYl90YmxbaWR4XS5kYXRhID0gaV9kYXRhOworCWljcGxiX3RibFtjcHVdW2lkeF0uYWRkciA9IGFkZHI7CisJaWNwbGJfdGJsW2NwdV1baWR4XS5kYXRhID0gaV9kYXRhOwogCiAJZGlzYWJsZV9pY3BsYigpOwogCWJmaW5fd3JpdGUzMihJQ1BMQl9EQVRBMCArIGlkeCAqIDQsIGlfZGF0YSk7CkBAIC0yODMsMTkgKzI4OSwxOSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgbm9pbmxpbmUgaW50IGRjcGxiX3Byb3RlY3Rpb25fZmF1bHQodm9pZCkKK3N0YXRpYyBub2lubGluZSBpbnQgZGNwbGJfcHJvdGVjdGlvbl9mYXVsdCh1bnNpZ25lZCBpbnQgY3B1KQogewogCWludCBzdGF0dXMgPSBiZmluX3JlYWRfRENQTEJfU1RBVFVTKCk7CiAKLQlucl9kY3BsYl9wcm90Kys7CisJbnJfZGNwbGJfcHJvdFtjcHVdKys7CiAKIAlpZiAoc3RhdHVzICYgRkFVTFRfUlcpIHsKIAkJaW50IGlkeCA9IGZhdWx0aW5nX2NwbGJfaW5kZXgoc3RhdHVzKTsKLQkJdW5zaWduZWQgbG9uZyBkYXRhID0gZGNwbGJfdGJsW2lkeF0uZGF0YTsKKwkJdW5zaWduZWQgbG9uZyBkYXRhID0gZGNwbGJfdGJsW2NwdV1baWR4XS5kYXRhOwogCQlpZiAoIShkYXRhICYgQ1BMQl9XVCkgJiYgIShkYXRhICYgQ1BMQl9ESVJUWSkgJiYKIAkJICAgIHdyaXRlX3Blcm1pdHRlZChzdGF0dXMsIGRhdGEpKSB7CiAJCQlkYXRhIHw9IENQTEJfRElSVFk7Ci0JCQlkY3BsYl90YmxbaWR4XS5kYXRhID0gZGF0YTsKKwkJCWRjcGxiX3RibFtjcHVdW2lkeF0uZGF0YSA9IGRhdGE7CiAJCQliZmluX3dyaXRlMzIoRENQTEJfREFUQTAgKyBpZHggKiA0LCBkYXRhKTsKIAkJCXJldHVybiAwOwogCQl9CkBAIC0zMDYsNDQgKzMxMiw0NSBAQAogaW50IGNwbGJfaGRyKGludCBzZXFzdGF0LCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAlpbnQgY2F1c2UgPSBzZXFzdGF0ICYgMHgzZjsKKwl1bnNpZ25lZCBpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwogCXN3aXRjaCAoY2F1c2UpIHsKIAljYXNlIDB4MjM6Ci0JCXJldHVybiBkY3BsYl9wcm90ZWN0aW9uX2ZhdWx0KCk7CisJCXJldHVybiBkY3BsYl9wcm90ZWN0aW9uX2ZhdWx0KGNwdSk7CiAJY2FzZSAweDJDOgotCQlyZXR1cm4gaWNwbGJfbWlzcygpOworCQlyZXR1cm4gaWNwbGJfbWlzcyhjcHUpOwogCWNhc2UgMHgyNjoKLQkJcmV0dXJuIGRjcGxiX21pc3MoKTsKKwkJcmV0dXJuIGRjcGxiX21pc3MoY3B1KTsKIAlkZWZhdWx0OgogCQlyZXR1cm4gMTsKIAl9CiB9CiAKLXZvaWQgZmx1c2hfc3dpdGNoZWRfY3BsYnModm9pZCkKK3ZvaWQgZmx1c2hfc3dpdGNoZWRfY3BsYnModW5zaWduZWQgaW50IGNwdSkKIHsKIAlpbnQgaTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JbnJfY3BsYl9mbHVzaCsrOworCW5yX2NwbGJfZmx1c2hbY3B1XSsrOwogCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCWxvY2FsX2lycV9zYXZlX2h3KGZsYWdzKTsKIAlkaXNhYmxlX2ljcGxiKCk7CiAJZm9yIChpID0gZmlyc3Rfc3dpdGNoZWRfaWNwbGI7IGkgPCBNQVhfQ1BMQlM7IGkrKykgewotCQlpY3BsYl90YmxbaV0uZGF0YSA9IDA7CisJCWljcGxiX3RibFtjcHVdW2ldLmRhdGEgPSAwOwogCQliZmluX3dyaXRlMzIoSUNQTEJfREFUQTAgKyBpICogNCwgMCk7CiAJfQogCWVuYWJsZV9pY3BsYigpOwogCiAJZGlzYWJsZV9kY3BsYigpOwogCWZvciAoaSA9IGZpcnN0X3N3aXRjaGVkX2RjcGxiOyBpIDwgTUFYX0NQTEJTOyBpKyspIHsKLQkJZGNwbGJfdGJsW2ldLmRhdGEgPSAwOworCQlkY3BsYl90YmxbY3B1XVtpXS5kYXRhID0gMDsKIAkJYmZpbl93cml0ZTMyKERDUExCX0RBVEEwICsgaSAqIDQsIDApOwogCX0KIAllbmFibGVfZGNwbGIoKTsKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJbG9jYWxfaXJxX3Jlc3RvcmVfaHcoZmxhZ3MpOwogCiB9CiAKLXZvaWQgc2V0X21hc2tfZGNwbGJzKHVuc2lnbmVkIGxvbmcgKm1hc2tzKQordm9pZCBzZXRfbWFza19kY3BsYnModW5zaWduZWQgbG9uZyAqbWFza3MsIHVuc2lnbmVkIGludCBjcHUpCiB7CiAJaW50IGk7CiAJdW5zaWduZWQgbG9uZyBhZGRyID0gKHVuc2lnbmVkIGxvbmcpbWFza3M7CkBAIC0zNTEsMTIgKzM1OCwxMiBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlpZiAoIW1hc2tzKSB7Ci0JCWN1cnJlbnRfcnd4X21hc2sgPSBtYXNrczsKKwkJY3VycmVudF9yd3hfbWFza1tjcHVdID0gbWFza3M7CiAJCXJldHVybjsKIAl9CiAKLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0JY3VycmVudF9yd3hfbWFzayA9IG1hc2tzOworCWxvY2FsX2lycV9zYXZlX2h3KGZsYWdzKTsKKwljdXJyZW50X3J3eF9tYXNrW2NwdV0gPSBtYXNrczsKIAogCWRfZGF0YSA9IENQTEJfU1VQVl9XUiB8IENQTEJfVkFMSUQgfCBDUExCX0RJUlRZIHwgUEFHRV9TSVpFXzRLQjsKICNpZmRlZiBDT05GSUdfQkZJTl9EQ0FDSEUKQEAgLTM2OCwxMiArMzc1LDEyIEBACiAKIAlkaXNhYmxlX2RjcGxiKCk7CiAJZm9yIChpID0gZmlyc3RfbWFza19kY3BsYjsgaSA8IGZpcnN0X3N3aXRjaGVkX2RjcGxiOyBpKyspIHsKLQkJZGNwbGJfdGJsW2ldLmFkZHIgPSBhZGRyOwotCQlkY3BsYl90YmxbaV0uZGF0YSA9IGRfZGF0YTsKKwkJZGNwbGJfdGJsW2NwdV1baV0uYWRkciA9IGFkZHI7CisJCWRjcGxiX3RibFtjcHVdW2ldLmRhdGEgPSBkX2RhdGE7CiAJCWJmaW5fd3JpdGUzMihEQ1BMQl9EQVRBMCArIGkgKiA0LCBkX2RhdGEpOwogCQliZmluX3dyaXRlMzIoRENQTEJfQUREUjAgKyBpICogNCwgYWRkcik7CiAJCWFkZHIgKz0gUEFHRV9TSVpFOwogCX0KIAllbmFibGVfZGNwbGIoKTsKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJbG9jYWxfaXJxX3Jlc3RvcmVfaHcoZmxhZ3MpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwvY3BsYi1ub21wdS9NYWtlZmlsZSBiL2FyY2gvYmxhY2tmaW4va2VybmVsL2NwbGItbm9tcHUvTWFrZWZpbGUKaW5kZXggZDM2ZWE5Yi4uN2Q3MGQzYiAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwvY3BsYi1ub21wdS9NYWtlZmlsZQorKysgYi9hcmNoL2JsYWNrZmluL2tlcm5lbC9jcGxiLW5vbXB1L01ha2VmaWxlCkBAIC0yLDcgKzIsOSBAQAogIyBhcmNoL2JsYWNrZmluL2tlcm5lbC9jcGxiLW5vbXB1L01ha2VmaWxlCiAjCiAKLW9iai15IDo9IGNwbGJpbml0Lm8gY2FjaGVpbml0Lm8gY3BsYmhkbHIubyBjcGxibWdyLm8KK29iai15IDo9IGNwbGJpbml0Lm8gY2FjaGVpbml0Lm8gY3BsYm1nci5vCiAKLW9iai0kKENPTkZJR19DUExCX0lORk8pICs9IGNwbGJpbmZvLm8KLQorQ0ZMQUdTX2NwbGJtZ3IubyA6PSAtZmZpeGVkLUkwIC1mZml4ZWQtSTEgLWZmaXhlZC1JMiAtZmZpeGVkLUkzIFwKKwkJICAgIC1mZml4ZWQtTDAgLWZmaXhlZC1MMSAtZmZpeGVkLUwyIC1mZml4ZWQtTDMgXAorCQkgICAgLWZmaXhlZC1NMCAtZmZpeGVkLU0xIC1mZml4ZWQtTTIgLWZmaXhlZC1NMyBcCisJCSAgICAtZmZpeGVkLUIwIC1mZml4ZWQtQjEgLWZmaXhlZC1CMiAtZmZpeGVkLUIzCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2tlcm5lbC9jcGxiLW5vbXB1L2NhY2hlaW5pdC5jIGIvYXJjaC9ibGFja2Zpbi9rZXJuZWwvY3BsYi1ub21wdS9jYWNoZWluaXQuYwppbmRleCBiZDA4MzE1Li5jNmZmOTQ3IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2tlcm5lbC9jcGxiLW5vbXB1L2NhY2hlaW5pdC5jCisrKyBiL2FyY2gvYmxhY2tmaW4va2VybmVsL2NwbGItbm9tcHUvY2FjaGVpbml0LmMKQEAgLTI1LDE5ICsyNSwxNSBAQAogI2luY2x1ZGUgPGFzbS9jcGxiaW5pdC5oPgogCiAjaWYgZGVmaW5lZChDT05GSUdfQkZJTl9JQ0FDSEUpCi12b2lkIF9faW5pdCBiZmluX2ljYWNoZV9pbml0KHZvaWQpCit2b2lkIF9fY3B1aW5pdCBiZmluX2ljYWNoZV9pbml0KHN0cnVjdCBjcGxiX2VudHJ5ICppY3BsYl90YmwpCiB7Ci0JdW5zaWduZWQgbG9uZyAqdGFibGUgPSBpY3BsYl90YWJsZTsKIAl1bnNpZ25lZCBsb25nIGN0cmw7CiAJaW50IGk7CiAKKwlTU1lOQygpOwogCWZvciAoaSA9IDA7IGkgPCBNQVhfQ1BMQlM7IGkrKykgewotCQl1bnNpZ25lZCBsb25nIGFkZHIgPSAqdGFibGUrKzsKLQkJdW5zaWduZWQgbG9uZyBkYXRhID0gKnRhYmxlKys7Ci0JCWlmIChhZGRyID09ICh1bnNpZ25lZCBsb25nKS0xKQotCQkJYnJlYWs7Ci0JCWJmaW5fd3JpdGUzMihJQ1BMQl9BRERSMCArIGkgKiA0LCBhZGRyKTsKLQkJYmZpbl93cml0ZTMyKElDUExCX0RBVEEwICsgaSAqIDQsIGRhdGEpOworCQliZmluX3dyaXRlMzIoSUNQTEJfQUREUjAgKyBpICogNCwgaWNwbGJfdGJsW2ldLmFkZHIpOworCQliZmluX3dyaXRlMzIoSUNQTEJfREFUQTAgKyBpICogNCwgaWNwbGJfdGJsW2ldLmRhdGEpOwogCX0KIAljdHJsID0gYmZpbl9yZWFkX0lNRU1fQ09OVFJPTCgpOwogCWN0cmwgfD0gSU1DIHwgRU5JQ1BMQjsKQEAgLTQ3LDIwICs0MywxNyBAQAogI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19CRklOX0RDQUNIRSkKLXZvaWQgX19pbml0IGJmaW5fZGNhY2hlX2luaXQodm9pZCkKK3ZvaWQgX19jcHVpbml0IGJmaW5fZGNhY2hlX2luaXQoc3RydWN0IGNwbGJfZW50cnkgKmRjcGxiX3RibCkKIHsKLQl1bnNpZ25lZCBsb25nICp0YWJsZSA9IGRjcGxiX3RhYmxlOwogCXVuc2lnbmVkIGxvbmcgY3RybDsKIAlpbnQgaTsKIAorCVNTWU5DKCk7CiAJZm9yIChpID0gMDsgaSA8IE1BWF9DUExCUzsgaSsrKSB7Ci0JCXVuc2lnbmVkIGxvbmcgYWRkciA9ICp0YWJsZSsrOwotCQl1bnNpZ25lZCBsb25nIGRhdGEgPSAqdGFibGUrKzsKLQkJaWYgKGFkZHIgPT0gKHVuc2lnbmVkIGxvbmcpLTEpCi0JCQlicmVhazsKLQkJYmZpbl93cml0ZTMyKERDUExCX0FERFIwICsgaSAqIDQsIGFkZHIpOwotCQliZmluX3dyaXRlMzIoRENQTEJfREFUQTAgKyBpICogNCwgZGF0YSk7CisJCWJmaW5fd3JpdGUzMihEQ1BMQl9BRERSMCArIGkgKiA0LCBkY3BsYl90YmxbaV0uYWRkcik7CisJCWJmaW5fd3JpdGUzMihEQ1BMQl9EQVRBMCArIGkgKiA0LCBkY3BsYl90YmxbaV0uZGF0YSk7CiAJfQorCiAJY3RybCA9IGJmaW5fcmVhZF9ETUVNX0NPTlRST0woKTsKIAljdHJsIHw9IERNRU1fQ05UUjsKIAliZmluX3dyaXRlX0RNRU1fQ09OVFJPTChjdHJsKTsKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4va2VybmVsL2NwbGItbm9tcHUvY3BsYmhkbHIuUyBiL2FyY2gvYmxhY2tmaW4va2VybmVsL2NwbGItbm9tcHUvY3BsYmhkbHIuUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWNiYWJjMC4uMDAwMDAwMAotLS0gYS9hcmNoL2JsYWNrZmluL2tlcm5lbC9jcGxiLW5vbXB1L2NwbGJoZGxyLlMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotLyoKLSAqIEZpbGU6ICAgICAgICAgYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9jcGxiaGRsci5TCi0gKiBCYXNlZCBvbjoKLSAqIEF1dGhvcjogICAgICAgTEcgU29mdCBJbmRpYQotICoKLSAqIENyZWF0ZWQ6ICAgICAgPwotICogRGVzY3JpcHRpb246ICBDUExCIGV4Y2VwdGlvbiBoYW5kbGVyCi0gKgotICogTW9kaWZpZWQ6Ci0gKiAgICAgICAgICAgICAgIENvcHlyaWdodCAyMDA0LTIwMDYgQW5hbG9nIERldmljZXMgSW5jLgotICoKLSAqIEJ1Z3M6ICAgICAgICAgRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgdGhlIGZpbGUgQ09QWUlORywgb3Igd3JpdGUKLSAqIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotICovCi0KLSNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+Ci0jaW5jbHVkZSA8YXNtL2NwbGIuaD4KLSNpbmNsdWRlIDxhc20vZW50cnkuaD4KLQotI2lmZGVmIENPTkZJR19FWENQVF9JUlFfU1lTQ19MMQotLnNlY3Rpb24gLmwxLnRleHQKLSNlbHNlCi0udGV4dAotI2VuZGlmCi0KLS50eXBlIF9jcGxiX21nciwgU1RUX0ZVTkM7Ci0udHlwZSBfcGFuaWNfY3BsYl9lcnJvciwgU1RUX0ZVTkM7Ci0KLS5hbGlnbiAyCi0KLUVOVFJZKF9fY3BsYl9oZHIpCi0JUjIgPSBTRVFTVEFUOwotCi0JLyogTWFzayB0aGUgY29udGVudHMgb2YgU0VRU1RBVCBhbmQgbGVhdmUgb25seSBFWENBVVNFIGluIFIyICovCi0JUjIgPDw9IDI2OwotCVIyID4+PSAyNjsKLQotCVIxID0gMHgyMzsgLyogRGF0YSBhY2Nlc3MgQ1BMQiBwcm90ZWN0aW9uIHZpb2xhdGlvbiAqLwotCUNDID0gUjIgPT0gUjE7Ci0JSUYgIUNDIEpVTVAgLkxub3RfZGF0YV93cml0ZTsKLQlSMCA9IDI7CQkvKiBpcyBhIHdyaXRlIHRvIGRhdGEgc3BhY2UqLwotCUpVTVAgLkxpc19pY3BsYl9taXNzOwotCi0uTG5vdF9kYXRhX3dyaXRlOgotCVIxID0gMHgyQzsgLyogQ1BMQiBtaXNzIG9uIGFuIGluc3RydWN0aW9uIGZldGNoICovCi0JQ0MgPSBSMiA9PSBSMTsKLQlSMCA9IDA7CQkvKiBpc19kYXRhX21pc3MgPT0gRmFsc2UqLwotCUlGIENDIEpVTVAgLkxpc19pY3BsYl9taXNzOwotCi0JUjEgPSAweDI2OwotCUNDID0gUjIgPT0gUjE7Ci0JSUYgIUNDIEpVTVAgLkx1bmtub3duOwotCi0JUjAgPSAxOwkJLyogaXNfZGF0YV9taXNzID09IFRydWUqLwotCi0uTGlzX2ljcGxiX21pc3M6Ci0KLSNpZiBkZWZpbmVkKENPTkZJR19CRklOX0lDQUNIRSkgfHwgZGVmaW5lZChDT05GSUdfQkZJTl9EQ0FDSEUpCi0jIGlmIGRlZmluZWQoQ09ORklHX0JGSU5fSUNBQ0hFKSAmJiAhZGVmaW5lZChDT05GSUdfQkZJTl9EQ0FDSEUpCi0JUjEgPSBDUExCX0VOQUJMRV9JQ0FDSEU7Ci0jIGVuZGlmCi0jIGlmICFkZWZpbmVkKENPTkZJR19CRklOX0lDQUNIRSkgJiYgZGVmaW5lZChDT05GSUdfQkZJTl9EQ0FDSEUpCi0JUjEgPSBDUExCX0VOQUJMRV9EQ0FDSEU7Ci0jIGVuZGlmCi0jIGlmIGRlZmluZWQoQ09ORklHX0JGSU5fSUNBQ0hFKSAmJiBkZWZpbmVkKENPTkZJR19CRklOX0RDQUNIRSkKLQlSMSA9IENQTEJfRU5BQkxFX0RDQUNIRSB8IENQTEJfRU5BQkxFX0lDQUNIRTsKLSMgZW5kaWYKLSNlbHNlCi0JUjEgPSAwOwotI2VuZGlmCi0KLQlbLS1TUF0gPSBSRVRTOwotCUNBTEwgX2NwbGJfbWdyOwotCVJFVFMgPSBbU1ArK107Ci0JQ0MgPSBSMCA9PSAwOwotCUlGICFDQyBKVU1QIC5Mbm90X3JlcGxhY2VkOwotCVJUUzsKLQotLyoKLSAqIERpYWdub3N0aWMgZXhjZXB0aW9uIGhhbmRsZXJzCi0gKi8KLS5MdW5rbm93bjoKLQlSMCA9IENQTEJfVU5LTk9XTl9FUlI7Ci0JSlVNUCAuTGNwbGJfZXJyb3I7Ci0KLS5Mbm90X3JlcGxhY2VkOgotCUNDID0gUjAgPT0gQ1BMQl9OT19VTkxPQ0tFRDsKLQlJRiAhQ0MgSlVNUCAuTG5leHRfY2hlY2s7Ci0JUjAgPSBDUExCX05PX1VOTE9DS0VEOwotCUpVTVAgLkxjcGxiX2Vycm9yOwotCi0uTG5leHRfY2hlY2s6Ci0JQ0MgPSBSMCA9PSBDUExCX05PX0FERFJfTUFUQ0g7Ci0JSUYgIUNDIEpVTVAgLkxuZXh0X2NoZWNrMjsKLQlSMCA9IENQTEJfTk9fQUREUl9NQVRDSDsKLQlKVU1QIC5MY3BsYl9lcnJvcjsKLQotLkxuZXh0X2NoZWNrMjoKLQlDQyA9IFIwID09IENQTEJfUFJPVF9WSU9MOwotCUlGICFDQyBKVU1QIC5Mc3RyYW5nZV9yZXR1cm5fZnJvbV9jcGxiX21ncjsKLQlSMCA9IENQTEJfUFJPVF9WSU9MOwotCUpVTVAgLkxjcGxiX2Vycm9yOwotCi0uTHN0cmFuZ2VfcmV0dXJuX2Zyb21fY3BsYl9tZ3I6Ci0JSURMRTsKLQlDU1lOQzsKLQlKVU1QIC5Mc3RyYW5nZV9yZXR1cm5fZnJvbV9jcGxiX21ncjsKLQotLkxjcGxiX2Vycm9yOgotCVIxID0gc3A7Ci0JU1AgKz0gLTEyOwotCWNhbGwgX3BhbmljX2NwbGJfZXJyb3I7Ci0JU1AgKz0gMTI7Ci0JSlVNUC5MIF9oYW5kbGVfYmFkX2NwbGI7Ci0KLUVORFBST0MoX19jcGxiX2hkcikKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4va2VybmVsL2NwbGItbm9tcHUvY3BsYmluZm8uYyBiL2FyY2gvYmxhY2tmaW4va2VybmVsL2NwbGItbm9tcHUvY3BsYmluZm8uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWU3NGYwYi4uMDAwMDAwMAotLS0gYS9hcmNoL2JsYWNrZmluL2tlcm5lbC9jcGxiLW5vbXB1L2NwbGJpbmZvLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxOTUgKzAsMCBAQAotLyoKLSAqIEZpbGU6ICAgICAgICAgYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9jcGxiaW5mby5jCi0gKiBCYXNlZCBvbjoKLSAqIEF1dGhvcjogICAgICAgU29uaWMgWmhhbmcgPHNvbmljLnpoYW5nQGFuYWxvZy5jb20+Ci0gKgotICogQ3JlYXRlZDogICAgICBKYW4uIDIwMDUKLSAqIERlc2NyaXB0aW9uOiAgRGlzcGxheSBDUExCIHN0YXR1cwotICoKLSAqIE1vZGlmaWVkOgotICogICAgICAgICAgICAgICBDb3B5cmlnaHQgMjAwNC0yMDA2IEFuYWxvZyBEZXZpY2VzIEluYy4KLSAqCi0gKiBCdWdzOiAgICAgICAgIEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLwotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIHRoZSBmaWxlIENPUFlJTkcsIG9yIHdyaXRlCi0gKiB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KLSNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+Ci0KLSNpbmNsdWRlIDxhc20vY3BsYmluaXQuaD4KLSNpbmNsdWRlIDxhc20vYmxhY2tmaW4uaD4KLQotI2RlZmluZSBDUExCX0kgMQotI2RlZmluZSBDUExCX0QgMgotCi0jZGVmaW5lIFNZTkNfU1lTICAgIFNTWU5DKCkKLSNkZWZpbmUgU1lOQ19DT1JFICAgQ1NZTkMoKQotCi0jZGVmaW5lIENQTEJfQklUX1BBR0VTSVpFIDB4MzAwMDAKLQotc3RhdGljIGludCBwYWdlX3NpemVfdGFibGVbNF0gPSB7Ci0JMHgwMDAwMDQwMCwJCS8qIDFLICovCi0JMHgwMDAwMTAwMCwJCS8qIDRLICovCi0JMHgwMDEwMDAwMCwJCS8qIDFNICovCi0JMHgwMDQwMDAwMAkJLyogNE0gKi8KLX07Ci0KLXN0YXRpYyBjaGFyIHBhZ2Vfc2l6ZV9zdHJpbmdfdGFibGVbXVs0XSA9IHsgIjFLIiwgIjRLIiwgIjFNIiwgIjRNIiB9OwotCi1zdGF0aWMgaW50IGNwbGJfZmluZF9lbnRyeSh1bnNpZ25lZCBsb25nICpjcGxiX2FkZHIsCi0JCQkgICB1bnNpZ25lZCBsb25nICpjcGxiX2RhdGEsIHVuc2lnbmVkIGxvbmcgYWRkciwKLQkJCSAgIHVuc2lnbmVkIGxvbmcgZGF0YSkKLXsKLQlpbnQgaWk7Ci0KLQlmb3IgKGlpID0gMDsgaWkgPCAxNjsgaWkrKykKLQkJaWYgKGFkZHIgPj0gY3BsYl9hZGRyW2lpXSAmJiBhZGRyIDwgY3BsYl9hZGRyW2lpXSArCi0JCSAgICBwYWdlX3NpemVfdGFibGVbKGNwbGJfZGF0YVtpaV0gJiBDUExCX0JJVF9QQUdFU0laRSkgPj4gMTZdCi0JCQkmJiAoY3BsYl9kYXRhW2lpXSA9PSBkYXRhKSkKLQkJCXJldHVybiBpaTsKLQotCXJldHVybiAtMTsKLX0KLQotc3RhdGljIGNoYXIgKmNwbGJfcHJpbnRfZW50cnkoY2hhciAqYnVmLCBpbnQgdHlwZSkKLXsKLQl1bnNpZ25lZCBsb25nICpwX2FkZHIgPSBkcGR0X3RhYmxlOwotCXVuc2lnbmVkIGxvbmcgKnBfZGF0YSA9IGRwZHRfdGFibGUgKyAxOwotCXVuc2lnbmVkIGxvbmcgKnBfaWNvdW50ID0gZHBkdF9zd2FwY291bnRfdGFibGU7Ci0JdW5zaWduZWQgbG9uZyAqcF9vY291bnQgPSBkcGR0X3N3YXBjb3VudF90YWJsZSArIDE7Ci0JdW5zaWduZWQgbG9uZyAqY3BsYl9hZGRyID0gKHVuc2lnbmVkIGxvbmcgKilEQ1BMQl9BRERSMDsKLQl1bnNpZ25lZCBsb25nICpjcGxiX2RhdGEgPSAodW5zaWduZWQgbG9uZyAqKURDUExCX0RBVEEwOwotCWludCBlbnRyeSA9IDAsIHVzZWRfY3BsYiA9IDA7Ci0KLQlpZiAodHlwZSA9PSBDUExCX0kpIHsKLQkJYnVmICs9IHNwcmludGYoYnVmLCAiSW5zdHJ1Y3Rpb24gQ1BMQiBlbnRyeTpcbiIpOwotCQlwX2FkZHIgPSBpcGR0X3RhYmxlOwotCQlwX2RhdGEgPSBpcGR0X3RhYmxlICsgMTsKLQkJcF9pY291bnQgPSBpcGR0X3N3YXBjb3VudF90YWJsZTsKLQkJcF9vY291bnQgPSBpcGR0X3N3YXBjb3VudF90YWJsZSArIDE7Ci0JCWNwbGJfYWRkciA9ICh1bnNpZ25lZCBsb25nICopSUNQTEJfQUREUjA7Ci0JCWNwbGJfZGF0YSA9ICh1bnNpZ25lZCBsb25nICopSUNQTEJfREFUQTA7Ci0JfSBlbHNlCi0JCWJ1ZiArPSBzcHJpbnRmKGJ1ZiwgIkRhdGEgQ1BMQiBlbnRyeTpcbiIpOwotCi0JYnVmICs9IHNwcmludGYoYnVmLCAiQWRkcmVzc1x0XHREYXRhXHRTaXplXHRWYWxpZFx0TG9ja2VkXHRTd2FwaW5cdGlDb3VudFx0b0NvdW50XG4iKTsKLQotCXdoaWxlICgqcF9hZGRyICE9IDB4ZmZmZmZmZmYpIHsKLQkJZW50cnkgPSBjcGxiX2ZpbmRfZW50cnkoY3BsYl9hZGRyLCBjcGxiX2RhdGEsICpwX2FkZHIsICpwX2RhdGEpOwotCQlpZiAoZW50cnkgPj0gMCkKLQkJCXVzZWRfY3BsYiB8PSAxIDw8IGVudHJ5OwotCi0JCWJ1ZiArPQotCQkgICAgc3ByaW50ZihidWYsCi0JCQkgICAgIjB4JTA4bHhcdDB4JTA1bHhcdCVzXHQlY1x0JWNcdCUyZFx0JWxkXHQlbGRcbiIsCi0JCQkgICAgKnBfYWRkciwgKnBfZGF0YSwKLQkJCSAgICBwYWdlX3NpemVfc3RyaW5nX3RhYmxlWygqcF9kYXRhICYgMHgzMDAwMCkgPj4gMTZdLAotCQkJICAgICgqcF9kYXRhICYgQ1BMQl9WQUxJRCkgPyAnWScgOiAnTicsCi0JCQkgICAgKCpwX2RhdGEgJiBDUExCX0xPQ0spID8gJ1knIDogJ04nLCBlbnRyeSwgKnBfaWNvdW50LAotCQkJICAgICpwX29jb3VudCk7Ci0KLQkJcF9hZGRyICs9IDI7Ci0JCXBfZGF0YSArPSAyOwotCQlwX2ljb3VudCArPSAyOwotCQlwX29jb3VudCArPSAyOwotCX0KLQotCWlmICh1c2VkX2NwbGIgIT0gMHhmZmZmKSB7Ci0JCWJ1ZiArPSBzcHJpbnRmKGJ1ZiwgIlVudXNlZC9taXNtYXRjaGVkIENQTEJzOlxuIik7Ci0KLQkJZm9yIChlbnRyeSA9IDA7IGVudHJ5IDwgMTY7IGVudHJ5KyspCi0JCQlpZiAoMCA9PSAoKDEgPDwgZW50cnkpICYgdXNlZF9jcGxiKSkgewotCQkJCWludCBmbGFncyA9IGNwbGJfZGF0YVtlbnRyeV07Ci0JCQkJYnVmICs9Ci0JCQkJICAgIHNwcmludGYoYnVmLAotCQkJCQkgICAgIiUyZDogMHglMDhseFx0MHglMDV4XHQlc1x0JWNcdCVjXG4iLAotCQkJCQkgICAgZW50cnksIGNwbGJfYWRkcltlbnRyeV0sIGZsYWdzLAotCQkJCQkgICAgcGFnZV9zaXplX3N0cmluZ190YWJsZVsoZmxhZ3MgJgotCQkJCQkJCQkgICAgMHgzMDAwMCkgPj4KLQkJCQkJCQkJICAgMTZdLAotCQkJCQkgICAgKGZsYWdzICYgQ1BMQl9WQUxJRCkgPyAnWScgOiAnTicsCi0JCQkJCSAgICAoZmxhZ3MgJiBDUExCX0xPQ0spID8gJ1knIDogJ04nKTsKLQkJCX0KLQl9Ci0KLQlidWYgKz0gc3ByaW50ZihidWYsICJcbiIpOwotCi0JcmV0dXJuIGJ1ZjsKLX0KLQotc3RhdGljIGludCBjcGxiaW5mb19wcm9jX291dHB1dChjaGFyICpidWYpCi17Ci0JY2hhciAqcDsKLQotCXAgPSBidWY7Ci0KLQlwICs9IHNwcmludGYocCwgIi0tLS0tLS0tLS0tLS0tLS0tLSBDUExCIEluZm9ybWF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLVxuXG4iKTsKLQotCWlmIChiZmluX3JlYWRfSU1FTV9DT05UUk9MKCkgJiBFTklDUExCKQotCQlwID0gY3BsYl9wcmludF9lbnRyeShwLCBDUExCX0kpOwotCWVsc2UKLQkJcCArPSBzcHJpbnRmKHAsICJJbnN0cnVjdGlvbiBDUExCIGlzIGRpc2FibGVkLlxuXG4iKTsKLQotCWlmIChiZmluX3JlYWRfRE1FTV9DT05UUk9MKCkgJiBFTkRDUExCKQotCQlwID0gY3BsYl9wcmludF9lbnRyeShwLCBDUExCX0QpOwotCWVsc2UKLQkJcCArPSBzcHJpbnRmKHAsICJEYXRhIENQTEIgaXMgZGlzYWJsZWQuXG4iKTsKLQotCXJldHVybiBwIC0gYnVmOwotfQotCi1zdGF0aWMgaW50IGNwbGJpbmZvX3JlYWRfcHJvYyhjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZiwKLQkJCSAgICAgIGludCBjb3VudCwgaW50ICplb2YsIHZvaWQgKmRhdGEpCi17Ci0JaW50IGxlbjsKLQotCWxlbiA9IGNwbGJpbmZvX3Byb2Nfb3V0cHV0KHBhZ2UpOwotCWlmIChsZW4gPD0gb2ZmICsgY291bnQpCi0JCSplb2YgPSAxOwotCSpzdGFydCA9IHBhZ2UgKyBvZmY7Ci0JbGVuIC09IG9mZjsKLQlpZiAobGVuID4gY291bnQpCi0JCWxlbiA9IGNvdW50OwotCWlmIChsZW4gPCAwKQotCQlsZW4gPSAwOwotCXJldHVybiBsZW47Ci19Ci0KLXN0YXRpYyBpbnQgX19pbml0IGNwbGJpbmZvX2luaXQodm9pZCkKLXsKLQlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmVudHJ5OwotCi0JZW50cnkgPSBjcmVhdGVfcHJvY19lbnRyeSgiY3BsYmluZm8iLCAwLCBOVUxMKTsKLQlpZiAoIWVudHJ5KQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWVudHJ5LT5yZWFkX3Byb2MgPSBjcGxiaW5mb19yZWFkX3Byb2M7Ci0JZW50cnktPmRhdGEgPSBOVUxMOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBjcGxiaW5mb19leGl0KHZvaWQpCi17Ci0JcmVtb3ZlX3Byb2NfZW50cnkoImNwbGJpbmZvIiwgTlVMTCk7Ci19Ci0KLW1vZHVsZV9pbml0KGNwbGJpbmZvX2luaXQpOwotbW9kdWxlX2V4aXQoY3BsYmluZm9fZXhpdCk7CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2tlcm5lbC9jcGxiLW5vbXB1L2NwbGJpbml0LmMgYi9hcmNoL2JsYWNrZmluL2tlcm5lbC9jcGxiLW5vbXB1L2NwbGJpbml0LmMKaW5kZXggMmRlYmM5MC4uMGUyOGY3NSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwvY3BsYi1ub21wdS9jcGxiaW5pdC5jCisrKyBiL2FyY2gvYmxhY2tmaW4va2VybmVsL2NwbGItbm9tcHUvY3BsYmluaXQuYwpAQCAtMjAsNDQ1ICsyMCwxNTIgQEAKICAqIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCiAgKiA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQogICovCisKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgPGFzbS9ibGFja2Zpbi5oPgogI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CiAjaW5jbHVkZSA8YXNtL2NwbGIuaD4KICNpbmNsdWRlIDxhc20vY3BsYmluaXQuaD4KKyNpbmNsdWRlIDxhc20vbWVtX21hcC5oPgogCi0jZGVmaW5lIENQTEJfTUVNIENPTkZJR19NQVhfTUVNX1NJWkUKK3N0cnVjdCBjcGxiX2VudHJ5IGljcGxiX3RibFtOUl9DUFVTXVtNQVhfQ1BMQlNdIFBEVF9BVFRSOworc3RydWN0IGNwbGJfZW50cnkgZGNwbGJfdGJsW05SX0NQVVNdW01BWF9DUExCU10gUERUX0FUVFI7CiAKLS8qCi0qIE51bWJlciBvZiByZXF1aXJlZCBkYXRhIENQTEIgc3dpdGNodGFibGUgZW50cmllcwotKiBNRU1TSVpFIC8gNCAod2UgbW9zdGx5IGluc3RhbGwgNE0gcGFnZSBzaXplIENQTEJzCi0qIGFwcHJveCAxNiBmb3Igc21hbGxlciAxTUIgcGFnZSBzaXplIENQTEJzIGZvciBhbGxpZ25tZW50IHB1cnBvc2VzCi0qIDEgZm9yIEwxIERhdGEgTWVtb3J5Ci0qIHBvc3NpYmx5IDEgZm9yIEwyIERhdGEgTWVtb3J5Ci0qIDEgZm9yIENPTkZJR19ERUJVR19IVU5UX0ZPUl9aRVJPCi0qIDEgZm9yIEFTWU5DIE1lbW9yeQotKi8KLSNkZWZpbmUgTUFYX1NXSVRDSF9EX0NQTEJTICgoKENQTEJfTUVNIC8gNCkgKyAxNiArIDEgKyAxICsgMSBcCi0JCQkJICsgQVNZTkNfTUVNT1JZX0NQTEJfQ09WRVJBR0UpICogMikKK2ludCBmaXJzdF9zd2l0Y2hlZF9pY3BsYiBQRFRfQVRUUjsKK2ludCBmaXJzdF9zd2l0Y2hlZF9kY3BsYiBQRFRfQVRUUjsKIAotLyoKLSogTnVtYmVyIG9mIHJlcXVpcmVkIGluc3RydWN0aW9uIENQTEIgc3dpdGNodGFibGUgZW50cmllcwotKiBNRU1TSVpFIC8gNCAod2UgbW9zdGx5IGluc3RhbGwgNE0gcGFnZSBzaXplIENQTEJzCi0qIGFwcHJveCAxMiBmb3Igc21hbGxlciAxTUIgcGFnZSBzaXplIENQTEJzIGZvciBhbGxpZ25tZW50IHB1cnBvc2VzCi0qIDEgZm9yIEwxIEluc3RydWN0aW9uIE1lbW9yeQotKiBwb3NzaWJseSAxIGZvciBMMiBJbnN0cnVjdGlvbiBNZW1vcnkKLSogMSBmb3IgQ09ORklHX0RFQlVHX0hVTlRfRk9SX1pFUk8KLSovCi0jZGVmaW5lIE1BWF9TV0lUQ0hfSV9DUExCUyAoKChDUExCX01FTSAvIDQpICsgMTIgKyAxICsgMSArIDEpICogMikKK3N0cnVjdCBjcGxiX2JvdW5kYXJ5IGRjcGxiX2JvdW5kc1s5XSBQRFRfQVRUUjsKK3N0cnVjdCBjcGxiX2JvdW5kYXJ5IGljcGxiX2JvdW5kc1s3XSBQRFRfQVRUUjsKIAoraW50IGljcGxiX25yX2JvdW5kcyBQRFRfQVRUUjsKK2ludCBkY3BsYl9ucl9ib3VuZHMgUERUX0FUVFI7CiAKLXVfbG9uZyBpY3BsYl90YWJsZVtNQVhfQ1BMQlMgKyAxXTsKLXVfbG9uZyBkY3BsYl90YWJsZVtNQVhfQ1BMQlMgKyAxXTsKLQotI2lmZGVmIENPTkZJR19DUExCX1NXSVRDSF9UQUJfTDEKLSMgZGVmaW5lIFBEVF9BVFRSIF9fYXR0cmlidXRlX18oKGwxX2RhdGEpKQotI2Vsc2UKLSMgZGVmaW5lIFBEVF9BVFRSCi0jZW5kaWYKLQotdV9sb25nIGlwZHRfdGFibGVbTUFYX1NXSVRDSF9JX0NQTEJTICsgMV0gUERUX0FUVFI7Ci11X2xvbmcgZHBkdF90YWJsZVtNQVhfU1dJVENIX0RfQ1BMQlMgKyAxXSBQRFRfQVRUUjsKLQotI2lmZGVmIENPTkZJR19DUExCX0lORk8KLXVfbG9uZyBpcGR0X3N3YXBjb3VudF90YWJsZVtNQVhfU1dJVENIX0lfQ1BMQlNdIFBEVF9BVFRSOwotdV9sb25nIGRwZHRfc3dhcGNvdW50X3RhYmxlW01BWF9TV0lUQ0hfRF9DUExCU10gUERUX0FUVFI7Ci0jZW5kaWYKLQotc3RydWN0IHNfY3BsYiB7Ci0Jc3RydWN0IGNwbGJfdGFiIGluaXRfaTsKLQlzdHJ1Y3QgY3BsYl90YWIgaW5pdF9kOwotCXN0cnVjdCBjcGxiX3RhYiBzd2l0Y2hfaTsKLQlzdHJ1Y3QgY3BsYl90YWIgc3dpdGNoX2Q7Ci19OwotCi0jaWYgZGVmaW5lZChDT05GSUdfQkZJTl9EQ0FDSEUpIHx8IGRlZmluZWQoQ09ORklHX0JGSU5fSUNBQ0hFKQotc3RhdGljIHN0cnVjdCBjcGxiX2Rlc2MgY3BsYl9kYXRhW10gPSB7Ci0JewotCQkuc3RhcnQgPSAwLAotCQkuZW5kID0gU0laRV8xSywKLQkJLnBzaXplID0gU0laRV8xSywKLQkJLmF0dHIgPSBJTklUSUFMX1QgfCBTV0lUQ0hfVCB8IElfQ1BMQiB8IERfQ1BMQiwKLQkJLmlfY29uZiA9IFNEUkFNX09PUFMsCi0JCS5kX2NvbmYgPSBTRFJBTV9PT1BTLAotI2lmIGRlZmluZWQoQ09ORklHX0RFQlVHX0hVTlRfRk9SX1pFUk8pCi0JCS52YWxpZCA9IDEsCi0jZWxzZQotCQkudmFsaWQgPSAwLAotI2VuZGlmCi0JCS5uYW1lID0gIlplcm8gUG9pbnRlciBHdWFyZCBQYWdlIiwKLQl9LAotCXsKLQkJLnN0YXJ0ID0gTDFfQ09ERV9TVEFSVCwKLQkJLmVuZCA9IEwxX0NPREVfU1RBUlQgKyBMMV9DT0RFX0xFTkdUSCwKLQkJLnBzaXplID0gU0laRV80TSwKLQkJLmF0dHIgPSBJTklUSUFMX1QgfCBTV0lUQ0hfVCB8IElfQ1BMQiwKLQkJLmlfY29uZiA9IEwxX0lNRU1PUlksCi0JCS5kX2NvbmYgPSAwLAotCQkudmFsaWQgPSAxLAotCQkubmFtZSA9ICJMMSBJLU1lbW9yeSIsCi0JfSwKLQl7Ci0JCS5zdGFydCA9IEwxX0RBVEFfQV9TVEFSVCwKLQkJLmVuZCA9IEwxX0RBVEFfQl9TVEFSVCArIEwxX0RBVEFfQl9MRU5HVEgsCi0JCS5wc2l6ZSA9IFNJWkVfNE0sCi0JCS5hdHRyID0gSU5JVElBTF9UIHwgU1dJVENIX1QgfCBEX0NQTEIsCi0JCS5pX2NvbmYgPSAwLAotCQkuZF9jb25mID0gTDFfRE1FTU9SWSwKLSNpZiAoKEwxX0RBVEFfQV9MRU5HVEggPiAwKSB8fCAoTDFfREFUQV9CX0xFTkdUSCA+IDApKQotCQkudmFsaWQgPSAxLAotI2Vsc2UKLQkJLnZhbGlkID0gMCwKLSNlbmRpZgotCQkubmFtZSA9ICJMMSBELU1lbW9yeSIsCi0JfSwKLQl7Ci0JCS5zdGFydCA9IDAsCi0JCS5lbmQgPSAwLCAgLyogZHluYW1pYyAqLwotCQkucHNpemUgPSAwLAotCQkuYXR0ciA9IElOSVRJQUxfVCB8IFNXSVRDSF9UIHwgSV9DUExCIHwgRF9DUExCLAotCQkuaV9jb25mID0gU0RSQU1fSUdFTkVSSUMsCi0JCS5kX2NvbmYgPSBTRFJBTV9ER0VORVJJQywKLQkJLnZhbGlkID0gMSwKLQkJLm5hbWUgPSAiS2VybmVsIE1lbW9yeSIsCi0JfSwKLQl7Ci0JCS5zdGFydCA9IDAsIC8qIGR5bmFtaWMgKi8KLQkJLmVuZCA9IDAsIC8qIGR5bmFtaWMgKi8KLQkJLnBzaXplID0gMCwKLQkJLmF0dHIgPSBJTklUSUFMX1QgfCBTV0lUQ0hfVCB8IERfQ1BMQiwKLQkJLmlfY29uZiA9IFNEUkFNX0lHRU5FUklDLAotCQkuZF9jb25mID0gU0RSQU1fRE5PTl9DSEJMLAotCQkudmFsaWQgPSAxLAotCQkubmFtZSA9ICJ1Q2xpbnV4IE1URCBNZW1vcnkiLAotCX0sCi0JewotCQkuc3RhcnQgPSAwLCAvKiBkeW5hbWljICovCi0JCS5lbmQgPSAwLCAgIC8qIGR5bmFtaWMgKi8KLQkJLnBzaXplID0gU0laRV8xTSwKLQkJLmF0dHIgPSBJTklUSUFMX1QgfCBTV0lUQ0hfVCB8IERfQ1BMQiwKLQkJLmRfY29uZiA9IFNEUkFNX0ROT05fQ0hCTCwKLQkJLnZhbGlkID0gMSwKLQkJLm5hbWUgPSAiVW5jYWNoZWQgRE1BIFpvbmUiLAotCX0sCi0JewotCQkuc3RhcnQgPSAwLCAvKiBkeW5hbWljICovCi0JCS5lbmQgPSAwLCAvKiBkeW5hbWljICovCi0JCS5wc2l6ZSA9IDAsCi0JCS5hdHRyID0gU1dJVENIX1QgfCBEX0NQTEIsCi0JCS5pX2NvbmYgPSAwLCAvKiBkeW5hbWljICovCi0JCS5kX2NvbmYgPSAwLCAvKiBkeW5hbWljICovCi0JCS52YWxpZCA9IDEsCi0JCS5uYW1lID0gIlJlc2VydmVkIE1lbW9yeSIsCi0JfSwKLQl7Ci0JCS5zdGFydCA9IEFTWU5DX0JBTkswX0JBU0UsCi0JCS5lbmQgPSBBU1lOQ19CQU5LM19CQVNFICsgQVNZTkNfQkFOSzNfU0laRSwKLQkJLnBzaXplID0gMCwKLQkJLmF0dHIgPSBTV0lUQ0hfVCB8IERfQ1BMQiwKLQkJLmRfY29uZiA9IFNEUkFNX0VCSVUsCi0JCS52YWxpZCA9IDEsCi0JCS5uYW1lID0gIkFzeW5jaHJvbm91cyBNZW1vcnkgQmFua3MiLAotCX0sCi0JewotCQkuc3RhcnQgPSBMMl9TVEFSVCwKLQkJLmVuZCA9IEwyX1NUQVJUICsgTDJfTEVOR1RILAotCQkucHNpemUgPSBTSVpFXzFNLAotCQkuYXR0ciA9IFNXSVRDSF9UIHwgSV9DUExCIHwgRF9DUExCLAotCQkuaV9jb25mID0gTDJfSU1FTU9SWSwKLQkJLmRfY29uZiA9IEwyX0RNRU1PUlksCi0JCS52YWxpZCA9IChMMl9MRU5HVEggPiAwKSwKLQkJLm5hbWUgPSAiTDIgTWVtb3J5IiwKLQl9LAotCXsKLQkJLnN0YXJ0ID0gQk9PVF9ST01fU1RBUlQsCi0JCS5lbmQgPSBCT09UX1JPTV9TVEFSVCArIEJPT1RfUk9NX0xFTkdUSCwKLQkJLnBzaXplID0gU0laRV8xTSwKLQkJLmF0dHIgPSBTV0lUQ0hfVCB8IElfQ1BMQiB8IERfQ1BMQiwKLQkJLmlfY29uZiA9IFNEUkFNX0lHRU5FUklDLAotCQkuZF9jb25mID0gU0RSQU1fREdFTkVSSUMsCi0JCS52YWxpZCA9IDEsCi0JCS5uYW1lID0gIk9uLUNoaXAgQm9vdFJPTSIsCi0JfSwKLX07Ci0KLXN0YXRpYyB1MTYgX19pbml0IGxvY2tfa2VybmVsX2NoZWNrKHUzMiBzdGFydCwgdTMyIGVuZCkKK3ZvaWQgX19pbml0IGdlbmVyYXRlX2NwbGJfdGFibGVzX2NwdSh1bnNpZ25lZCBpbnQgY3B1KQogewotCWlmIChzdGFydCA+PSAodTMyKV9lbmQgfHwgZW5kIDw9ICh1MzIpX3N0ZXh0KQotCQlyZXR1cm4gMDsKKwlpbnQgaV9kLCBpX2k7CisJdW5zaWduZWQgbG9uZyBhZGRyOwogCi0JLyogVGhpcyBjcGxiIGJsb2NrIG92ZXJsYXBwZWQgd2l0aCBrZXJuZWwgYXJlYS4gKi8KLQlyZXR1cm4gSU5fS0VSTkVMOwotfQorCXN0cnVjdCBjcGxiX2VudHJ5ICpkX3RibCA9IGRjcGxiX3RibFtjcHVdOworCXN0cnVjdCBjcGxiX2VudHJ5ICppX3RibCA9IGljcGxiX3RibFtjcHVdOwogCi1zdGF0aWMgdW5zaWduZWQgc2hvcnQgX19pbml0Ci1maWxsX2NwbGJ0YWIoc3RydWN0IGNwbGJfdGFiICp0YWJsZSwKLQkgICAgIHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kLAotCSAgICAgdW5zaWduZWQgbG9uZyBibG9ja19zaXplLCB1bnNpZ25lZCBsb25nIGNwbGJfZGF0YSkKLXsKLQlpbnQgaTsKKwlwcmludGsoS0VSTl9JTkZPICJOT01QVTogc2V0dGluZyB1cCBjcGxiIHRhYmxlc1xuIik7CiAKLQlzd2l0Y2ggKGJsb2NrX3NpemUpIHsKLQljYXNlIFNJWkVfNE06Ci0JCWkgPSAzOwotCQlicmVhazsKLQljYXNlIFNJWkVfMU06Ci0JCWkgPSAyOwotCQlicmVhazsKLQljYXNlIFNJWkVfNEs6Ci0JCWkgPSAxOwotCQlicmVhazsKLQljYXNlIFNJWkVfMUs6Ci0JZGVmYXVsdDoKLQkJaSA9IDA7Ci0JCWJyZWFrOworCWlfZCA9IGlfaSA9IDA7CisKKwkvKiBTZXQgdXAgdGhlIHplcm8gcGFnZS4gICovCisJZF90YmxbaV9kXS5hZGRyID0gMDsKKwlkX3RibFtpX2QrK10uZGF0YSA9IFNEUkFNX09PUFMgfCBQQUdFX1NJWkVfMUtCOworCisJLyogQ292ZXIga2VybmVsIG1lbW9yeSB3aXRoIDRNIHBhZ2VzLiAgKi8KKwlhZGRyID0gMDsKKworCWZvciAoOyBhZGRyIDwgbWVtb3J5X3N0YXJ0OyBhZGRyICs9IDQgKiAxMDI0ICogMTAyNCkgeworCQlkX3RibFtpX2RdLmFkZHIgPSBhZGRyOworCQlkX3RibFtpX2QrK10uZGF0YSA9IFNEUkFNX0RHRU5FUklDIHwgUEFHRV9TSVpFXzRNQjsKKwkJaV90YmxbaV9pXS5hZGRyID0gYWRkcjsKKwkJaV90YmxbaV9pKytdLmRhdGEgPSBTRFJBTV9JR0VORVJJQyB8IFBBR0VfU0laRV80TUI7CiAJfQogCi0JY3BsYl9kYXRhID0gKGNwbGJfZGF0YSAmIH4oMyA8PCAxNikpIHwgKGkgPDwgMTYpOwotCi0Jd2hpbGUgKChzdGFydCA8IGVuZCkgJiYgKHRhYmxlLT5wb3MgPCB0YWJsZS0+c2l6ZSkpIHsKLQotCQl0YWJsZS0+dGFiW3RhYmxlLT5wb3MrK10gPSBzdGFydDsKLQotCQlpZiAobG9ja19rZXJuZWxfY2hlY2soc3RhcnQsIHN0YXJ0ICsgYmxvY2tfc2l6ZSkgPT0gSU5fS0VSTkVMKQotCQkJdGFibGUtPnRhYlt0YWJsZS0+cG9zKytdID0KLQkJCSAgICBjcGxiX2RhdGEgfCBDUExCX0xPQ0sgfCBDUExCX0RJUlRZOwotCQllbHNlCi0JCQl0YWJsZS0+dGFiW3RhYmxlLT5wb3MrK10gPSBjcGxiX2RhdGE7Ci0KLQkJc3RhcnQgKz0gYmxvY2tfc2l6ZTsKKwkvKiBDb3ZlciBMMSBtZW1vcnkuICBPbmUgNE0gYXJlYSBmb3IgY29kZSBhbmQgZGF0YSBlYWNoIGlzIGVub3VnaC4gICovCisJaWYgKEwxX0RBVEFfQV9MRU5HVEggfHwgTDFfREFUQV9CX0xFTkdUSCkgeworCQlkX3RibFtpX2RdLmFkZHIgPSBMMV9EQVRBX0FfU1RBUlQ7CisJCWRfdGJsW2lfZCsrXS5kYXRhID0gTDFfRE1FTU9SWSB8IFBBR0VfU0laRV80TUI7CiAJfQotCXJldHVybiAwOworCWlfdGJsW2lfaV0uYWRkciA9IEwxX0NPREVfU1RBUlQ7CisJaV90YmxbaV9pKytdLmRhdGEgPSBMMV9JTUVNT1JZIHwgUEFHRV9TSVpFXzRNQjsKKworCWZpcnN0X3N3aXRjaGVkX2RjcGxiID0gaV9kOworCWZpcnN0X3N3aXRjaGVkX2ljcGxiID0gaV9pOworCisJQlVHX09OKGZpcnN0X3N3aXRjaGVkX2RjcGxiID4gTUFYX0NQTEJTKTsKKwlCVUdfT04oZmlyc3Rfc3dpdGNoZWRfaWNwbGIgPiBNQVhfQ1BMQlMpOworCisJd2hpbGUgKGlfZCA8IE1BWF9DUExCUykKKwkJZF90YmxbaV9kKytdLmRhdGEgPSAwOworCXdoaWxlIChpX2kgPCBNQVhfQ1BMQlMpCisJCWlfdGJsW2lfaSsrXS5kYXRhID0gMDsKIH0KIAotc3RhdGljIHVuc2lnbmVkIHNob3J0IF9faW5pdAotY2xvc2VfY3BsYnRhYihzdHJ1Y3QgY3BsYl90YWIgKnRhYmxlKQordm9pZCBfX2luaXQgZ2VuZXJhdGVfY3BsYl90YWJsZXNfYWxsKHZvaWQpCiB7CisJaW50IGlfZCwgaV9pOwogCi0Jd2hpbGUgKHRhYmxlLT5wb3MgPCB0YWJsZS0+c2l6ZSkgewotCi0JCXRhYmxlLT50YWJbdGFibGUtPnBvcysrXSA9IDA7Ci0JCXRhYmxlLT50YWJbdGFibGUtPnBvcysrXSA9IDA7IC8qICFDUExCX1ZBTElEICovCi0JfQotCXJldHVybiAwOwotfQotCi0vKiBoZWxwZXIgZnVuY3Rpb24gKi8KLXN0YXRpYyB2b2lkIF9faW5pdAotX19maWxsX2NvZGVfY3BsYnRhYihzdHJ1Y3QgY3BsYl90YWIgKnQsIGludCBpLCB1MzIgYV9zdGFydCwgdTMyIGFfZW5kKQotewotCWlmIChjcGxiX2RhdGFbaV0ucHNpemUpIHsKLQkJZmlsbF9jcGxidGFiKHQsCi0JCQkJY3BsYl9kYXRhW2ldLnN0YXJ0LAotCQkJCWNwbGJfZGF0YVtpXS5lbmQsCi0JCQkJY3BsYl9kYXRhW2ldLnBzaXplLAotCQkJCWNwbGJfZGF0YVtpXS5pX2NvbmYpOwotCX0gZWxzZSB7Ci0jaWYgZGVmaW5lZChDT05GSUdfQkZJTl9JQ0FDSEUpCi0JCWlmIChBTk9NQUxZXzA1MDAwMjYzICYmIGkgPT0gU0RSQU1fS0VSTikgewotCQkJZmlsbF9jcGxidGFiKHQsCi0JCQkJCWNwbGJfZGF0YVtpXS5zdGFydCwKLQkJCQkJY3BsYl9kYXRhW2ldLmVuZCwKLQkJCQkJU0laRV80TSwKLQkJCQkJY3BsYl9kYXRhW2ldLmlfY29uZik7Ci0JCX0gZWxzZQotI2VuZGlmCi0JCXsKLQkJCWZpbGxfY3BsYnRhYih0LAotCQkJCQljcGxiX2RhdGFbaV0uc3RhcnQsCi0JCQkJCWFfc3RhcnQsCi0JCQkJCVNJWkVfMU0sCi0JCQkJCWNwbGJfZGF0YVtpXS5pX2NvbmYpOwotCQkJZmlsbF9jcGxidGFiKHQsCi0JCQkJCWFfc3RhcnQsCi0JCQkJCWFfZW5kLAotCQkJCQlTSVpFXzRNLAotCQkJCQljcGxiX2RhdGFbaV0uaV9jb25mKTsKLQkJCWZpbGxfY3BsYnRhYih0LCBhX2VuZCwKLQkJCQkJY3BsYl9kYXRhW2ldLmVuZCwKLQkJCQkJU0laRV8xTSwKLQkJCQkJY3BsYl9kYXRhW2ldLmlfY29uZik7Ci0JCX0KLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIF9faW5pdAotX19maWxsX2RhdGFfY3BsYnRhYihzdHJ1Y3QgY3BsYl90YWIgKnQsIGludCBpLCB1MzIgYV9zdGFydCwgdTMyIGFfZW5kKQotewotCWlmIChjcGxiX2RhdGFbaV0ucHNpemUpIHsKLQkJZmlsbF9jcGxidGFiKHQsCi0JCQkJY3BsYl9kYXRhW2ldLnN0YXJ0LAotCQkJCWNwbGJfZGF0YVtpXS5lbmQsCi0JCQkJY3BsYl9kYXRhW2ldLnBzaXplLAotCQkJCWNwbGJfZGF0YVtpXS5kX2NvbmYpOwotCX0gZWxzZSB7Ci0JCWZpbGxfY3BsYnRhYih0LAotCQkJCWNwbGJfZGF0YVtpXS5zdGFydCwKLQkJCQlhX3N0YXJ0LCBTSVpFXzFNLAotCQkJCWNwbGJfZGF0YVtpXS5kX2NvbmYpOwotCQlmaWxsX2NwbGJ0YWIodCwgYV9zdGFydCwKLQkJCQlhX2VuZCwgU0laRV80TSwKLQkJCQljcGxiX2RhdGFbaV0uZF9jb25mKTsKLQkJZmlsbF9jcGxidGFiKHQsIGFfZW5kLAotCQkJCWNwbGJfZGF0YVtpXS5lbmQsCi0JCQkJU0laRV8xTSwKLQkJCQljcGxiX2RhdGFbaV0uZF9jb25mKTsKLQl9Ci19Ci0KLXZvaWQgX19pbml0IGdlbmVyYXRlX2NwbGJfdGFibGVzKHZvaWQpCi17Ci0KLQl1MTYgaSwgaiwgcHJvY2VzczsKLQl1MzIgYV9zdGFydCwgYV9lbmQsIGFzLCBhZSwgYXNfMW07Ci0KLQlzdHJ1Y3QgY3BsYl90YWIgKnRfaSA9IE5VTEw7Ci0Jc3RydWN0IGNwbGJfdGFiICp0X2QgPSBOVUxMOwotCXN0cnVjdCBzX2NwbGIgY3BsYjsKLQotCXByaW50ayhLRVJOX0lORk8gIk5PTVBVOiBzZXR0aW5nIHVwIGNwbGIgdGFibGVzIGZvciBnbG9iYWwgYWNjZXNzXG4iKTsKLQotCWNwbGIuaW5pdF9pLnNpemUgPSBNQVhfQ1BMQlM7Ci0JY3BsYi5pbml0X2Quc2l6ZSA9IE1BWF9DUExCUzsKLQljcGxiLnN3aXRjaF9pLnNpemUgPSBNQVhfU1dJVENIX0lfQ1BMQlM7Ci0JY3BsYi5zd2l0Y2hfZC5zaXplID0gTUFYX1NXSVRDSF9EX0NQTEJTOwotCi0JY3BsYi5pbml0X2kucG9zID0gMDsKLQljcGxiLmluaXRfZC5wb3MgPSAwOwotCWNwbGIuc3dpdGNoX2kucG9zID0gMDsKLQljcGxiLnN3aXRjaF9kLnBvcyA9IDA7Ci0KLQljcGxiLmluaXRfaS50YWIgPSBpY3BsYl90YWJsZTsKLQljcGxiLmluaXRfZC50YWIgPSBkY3BsYl90YWJsZTsKLQljcGxiLnN3aXRjaF9pLnRhYiA9IGlwZHRfdGFibGU7Ci0JY3BsYi5zd2l0Y2hfZC50YWIgPSBkcGR0X3RhYmxlOwotCi0JY3BsYl9kYXRhW1NEUkFNX0tFUk5dLmVuZCA9IG1lbW9yeV9lbmQ7Ci0KKwlpX2QgPSAwOworCS8qIE5vcm1hbCBSQU0sIGluY2x1ZGluZyBNVEQgRlMuICAqLwogI2lmZGVmIENPTkZJR19NVERfVUNMSU5VWAotCWNwbGJfZGF0YVtTRFJBTV9SQU1fTVREXS5zdGFydCA9IG1lbW9yeV9tdGRfc3RhcnQ7Ci0JY3BsYl9kYXRhW1NEUkFNX1JBTV9NVERdLmVuZCA9IG1lbW9yeV9tdGRfc3RhcnQgKyBtdGRfc2l6ZTsKLQljcGxiX2RhdGFbU0RSQU1fUkFNX01URF0udmFsaWQgPSBtdGRfc2l6ZSA+IDA7Ci0jIGlmIGRlZmluZWQoQ09ORklHX1JPTUZTX0ZTKQotCWNwbGJfZGF0YVtTRFJBTV9SQU1fTVREXS5hdHRyIHw9IElfQ1BMQjsKLQotCS8qCi0JICogVGhlIFJPTUZTX0ZTIHNpemUgaXMgb2Z0ZW4gbm90IG11bHRpcGxlIG9mIDFNQi4KLQkgKiBUaGlzIGNhbiBjYXVzZSBtdWx0aXBsZSBDUExCIHNldHMgY292ZXJpbmcgdGhlIHNhbWUgbWVtb3J5IGFyZWEuCi0JICogVGhpcyB3aWxsIHRoZW4gY2F1c2UgbXVsdGlwbGUgQ1BMQiBoaXQgZXhjZXB0aW9ucy4KLQkgKiBXb3JrYXJvdW5kOiBXZSBlbnN1cmUgYSBjb250aWd1b3VzIG1lbW9yeSBhcmVhIGJ5IGV4dGVuZGluZyB0aGUga2VybmVsCi0JICogbWVtb3J5IHNlY3Rpb24gb3ZlciB0aGUgbXRkIHNlY3Rpb24uCi0JICogRm9yIFJPTUZTX0ZTIG1lbW9yeSBtdXN0IGJlIGNvdmVyZWQgd2l0aCBJQ1BMQnMgYW55d2F5cy4KLQkgKiBTbyB0aGVyZSBpcyBubyBkaWZmZXJlbmNlIGJldHdlZW4ga2VybmVsIGFuZCBtdGQgbWVtb3J5IHNldHVwLgotCSAqLwotCi0JY3BsYl9kYXRhW1NEUkFNX0tFUk5dLmVuZCA9IG1lbW9yeV9tdGRfc3RhcnQgKyBtdGRfc2l6ZTs7Ci0JY3BsYl9kYXRhW1NEUkFNX1JBTV9NVERdLnZhbGlkID0gMDsKLQotIyBlbmRpZgorCWRjcGxiX2JvdW5kc1tpX2RdLmVhZGRyID0gbWVtb3J5X210ZF9zdGFydCArIG10ZF9zaXplOwogI2Vsc2UKLQljcGxiX2RhdGFbU0RSQU1fUkFNX01URF0udmFsaWQgPSAwOworCWRjcGxiX2JvdW5kc1tpX2RdLmVhZGRyID0gbWVtb3J5X2VuZDsKICNlbmRpZgotCi0JY3BsYl9kYXRhW1NEUkFNX0RNQVpdLnN0YXJ0ID0gX3JhbWVuZCAtIERNQV9VTkNBQ0hFRF9SRUdJT047Ci0JY3BsYl9kYXRhW1NEUkFNX0RNQVpdLmVuZCA9IF9yYW1lbmQ7Ci0KLQljcGxiX2RhdGFbUkVTX01FTV0uc3RhcnQgPSBfcmFtZW5kOwotCWNwbGJfZGF0YVtSRVNfTUVNXS5lbmQgPSBwaHlzaWNhbF9tZW1fZW5kOwotCi0JaWYgKHJlc2VydmVkX21lbV9kY2FjaGVfb24pCi0JCWNwbGJfZGF0YVtSRVNfTUVNXS5kX2NvbmYgPSBTRFJBTV9ER0VORVJJQzsKLQllbHNlCi0JCWNwbGJfZGF0YVtSRVNfTUVNXS5kX2NvbmYgPSBTRFJBTV9ETk9OX0NIQkw7Ci0KLQlpZiAocmVzZXJ2ZWRfbWVtX2ljYWNoZV9vbikKLQkJY3BsYl9kYXRhW1JFU19NRU1dLmlfY29uZiA9IFNEUkFNX0lHRU5FUklDOwotCWVsc2UKLQkJY3BsYl9kYXRhW1JFU19NRU1dLmlfY29uZiA9IFNEUkFNX0lOT05fQ0hCTDsKLQotCWZvciAoaSA9IFpFUk9fUDsgaSA8IEFSUkFZX1NJWkUoY3BsYl9kYXRhKTsgKytpKSB7Ci0JCWlmICghY3BsYl9kYXRhW2ldLnZhbGlkKQotCQkJY29udGludWU7Ci0KLQkJYXNfMW0gPSBjcGxiX2RhdGFbaV0uc3RhcnQgJSBTSVpFXzFNOwotCi0JCS8qIFdlIG5lZWQgdG8gbWFrZSBzdXJlIGFsbCBzZWN0aW9ucyBhcmUgcHJvcGVybHkgMU0gYWxpZ25lZAotCQkgKiBIb3dldmVyIGJldHdlZW4gS2VybmVsIE1lbW9yeSBhbmQgdGhlIEtlcm5lbCBtdGQgc2VjdGlvbiwgZGVwZW5kaW5nIG9uIHRoZQotCQkgKiByb290ZnMgc2l6ZSwgdGhlcmUgY2FuIGJlIG92ZXJsYXBwaW5nIG1lbW9yeSBhcmVhcy4KLQkJICovCi0KLQkJaWYgKGFzXzFtICYmIGkgIT0gTDFJX01FTSAmJiBpICE9IEwxRF9NRU0pIHsKLSNpZmRlZiBDT05GSUdfTVREX1VDTElOVVgKLQkJCWlmIChpID09IFNEUkFNX1JBTV9NVEQpIHsKLQkJCQlpZiAoKGNwbGJfZGF0YVtTRFJBTV9LRVJOXS5lbmQgKyAxKSA+IGNwbGJfZGF0YVtTRFJBTV9SQU1fTVREXS5zdGFydCkKLQkJCQkJY3BsYl9kYXRhW1NEUkFNX1JBTV9NVERdLnN0YXJ0ID0gKGNwbGJfZGF0YVtpXS5zdGFydCAmICgtMipTSVpFXzFNKSkgKyBTSVpFXzFNOwotCQkJCWVsc2UKLQkJCQkJY3BsYl9kYXRhW1NEUkFNX1JBTV9NVERdLnN0YXJ0ID0gKGNwbGJfZGF0YVtpXS5zdGFydCAmICgtMipTSVpFXzFNKSk7Ci0JCQl9IGVsc2UKLSNlbmRpZgotCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIlVuYWxpZ25lZCBTdGFydCBvZiAlcyBhdCAweCVYXG4iLAotCQkJCSAgICAgICBjcGxiX2RhdGFbaV0ubmFtZSwgY3BsYl9kYXRhW2ldLnN0YXJ0KTsKLQkJfQotCi0JCWFzID0gY3BsYl9kYXRhW2ldLnN0YXJ0ICUgU0laRV80TTsKLQkJYWUgPSBjcGxiX2RhdGFbaV0uZW5kICUgU0laRV80TTsKLQotCQlpZiAoYXMpCi0JCQlhX3N0YXJ0ID0gY3BsYl9kYXRhW2ldLnN0YXJ0ICsgKFNJWkVfNE0gLSAoYXMpKTsKLQkJZWxzZQotCQkJYV9zdGFydCA9IGNwbGJfZGF0YVtpXS5zdGFydDsKLQotCQlhX2VuZCA9IGNwbGJfZGF0YVtpXS5lbmQgLSBhZTsKLQotCQlmb3IgKGogPSBJTklUSUFMX1Q7IGogPD0gU1dJVENIX1Q7IGorKykgewotCi0JCQlzd2l0Y2ggKGopIHsKLQkJCWNhc2UgSU5JVElBTF9UOgotCQkJCWlmIChjcGxiX2RhdGFbaV0uYXR0ciAmIElOSVRJQUxfVCkgewotCQkJCQl0X2kgPSAmY3BsYi5pbml0X2k7Ci0JCQkJCXRfZCA9ICZjcGxiLmluaXRfZDsKLQkJCQkJcHJvY2VzcyA9IDE7Ci0JCQkJfSBlbHNlCi0JCQkJCXByb2Nlc3MgPSAwOwotCQkJCWJyZWFrOwotCQkJY2FzZSBTV0lUQ0hfVDoKLQkJCQlpZiAoY3BsYl9kYXRhW2ldLmF0dHIgJiBTV0lUQ0hfVCkgewotCQkJCQl0X2kgPSAmY3BsYi5zd2l0Y2hfaTsKLQkJCQkJdF9kID0gJmNwbGIuc3dpdGNoX2Q7Ci0JCQkJCXByb2Nlc3MgPSAxOwotCQkJCX0gZWxzZQotCQkJCQlwcm9jZXNzID0gMDsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJCXByb2Nlc3MgPSAwOwotCQkJCWJyZWFrOwotCQkJfQotCi0JCQlpZiAoIXByb2Nlc3MpCi0JCQkJY29udGludWU7Ci0JCQlpZiAoY3BsYl9kYXRhW2ldLmF0dHIgJiBJX0NQTEIpCi0JCQkJX19maWxsX2NvZGVfY3BsYnRhYih0X2ksIGksIGFfc3RhcnQsIGFfZW5kKTsKLQotCQkJaWYgKGNwbGJfZGF0YVtpXS5hdHRyICYgRF9DUExCKQotCQkJCV9fZmlsbF9kYXRhX2NwbGJ0YWIodF9kLCBpLCBhX3N0YXJ0LCBhX2VuZCk7Ci0JCX0KKwlkY3BsYl9ib3VuZHNbaV9kKytdLmRhdGEgPSBTRFJBTV9ER0VORVJJQzsKKwkvKiBETUEgdW5jYWNoZWQgcmVnaW9uLiAgKi8KKwlpZiAoRE1BX1VOQ0FDSEVEX1JFR0lPTikgeworCQlkY3BsYl9ib3VuZHNbaV9kXS5lYWRkciA9IF9yYW1lbmQ7CisJCWRjcGxiX2JvdW5kc1tpX2QrK10uZGF0YSA9IFNEUkFNX0ROT05fQ0hCTDsKIAl9CisJaWYgKF9yYW1lbmQgIT0gcGh5c2ljYWxfbWVtX2VuZCkgeworCQkvKiBSZXNlcnZlZCBtZW1vcnkuICAqLworCQlkY3BsYl9ib3VuZHNbaV9kXS5lYWRkciA9IHBoeXNpY2FsX21lbV9lbmQ7CisJCWRjcGxiX2JvdW5kc1tpX2QrK10uZGF0YSA9IChyZXNlcnZlZF9tZW1fZGNhY2hlX29uID8KKwkJCQkJICAgIFNEUkFNX0RHRU5FUklDIDogU0RSQU1fRE5PTl9DSEJMKTsKKwl9CisJLyogQWRkcmVzc2luZyBob2xlIHVwIHRvIHRoZSBhc3luYyBiYW5rLiAgKi8KKwlkY3BsYl9ib3VuZHNbaV9kXS5lYWRkciA9IEFTWU5DX0JBTkswX0JBU0U7CisJZGNwbGJfYm91bmRzW2lfZCsrXS5kYXRhID0gMDsKKwkvKiBBU1lOQyBiYW5rcy4gICovCisJZGNwbGJfYm91bmRzW2lfZF0uZWFkZHIgPSBBU1lOQ19CQU5LM19CQVNFICsgQVNZTkNfQkFOSzNfU0laRTsKKwlkY3BsYl9ib3VuZHNbaV9kKytdLmRhdGEgPSBTRFJBTV9FQklVOworCS8qIEFkZHJlc3NpbmcgaG9sZSB1cCB0byBCb290Uk9NLiAgKi8KKwlkY3BsYl9ib3VuZHNbaV9kXS5lYWRkciA9IEJPT1RfUk9NX1NUQVJUOworCWRjcGxiX2JvdW5kc1tpX2QrK10uZGF0YSA9IDA7CisJLyogQm9vdFJPTSAtLSBsYXJnZXN0IG9uZSBzaG91bGQgYmUgbGVzcyB0aGFuIDEgbWVnLiAgKi8KKwlkY3BsYl9ib3VuZHNbaV9kXS5lYWRkciA9IEJPT1RfUk9NX1NUQVJUICsgKDEgKiAxMDI0ICogMTAyNCk7CisJZGNwbGJfYm91bmRzW2lfZCsrXS5kYXRhID0gU0RSQU1fREdFTkVSSUM7CisJaWYgKEwyX0xFTkdUSCkgeworCQkvKiBBZGRyZXNzaW5nIGhvbGUgdXAgdG8gTDIgU1JBTS4gICovCisJCWRjcGxiX2JvdW5kc1tpX2RdLmVhZGRyID0gTDJfU1RBUlQ7CisJCWRjcGxiX2JvdW5kc1tpX2QrK10uZGF0YSA9IDA7CisJCS8qIEwyIFNSQU0uICAqLworCQlkY3BsYl9ib3VuZHNbaV9kXS5lYWRkciA9IEwyX1NUQVJUICsgTDJfTEVOR1RIOworCQlkY3BsYl9ib3VuZHNbaV9kKytdLmRhdGEgPSBMMl9ETUVNT1JZOworCX0KKwlkY3BsYl9ucl9ib3VuZHMgPSBpX2Q7CisJQlVHX09OKGRjcGxiX25yX2JvdW5kcyA+IEFSUkFZX1NJWkUoZGNwbGJfYm91bmRzKSk7CiAKLS8qIGNsb3NlIHRhYmxlcyAqLwotCi0JY2xvc2VfY3BsYnRhYigmY3BsYi5pbml0X2kpOwotCWNsb3NlX2NwbGJ0YWIoJmNwbGIuaW5pdF9kKTsKLQotCWNwbGIuaW5pdF9pLnRhYltjcGxiLmluaXRfaS5wb3NdID0gLTE7Ci0JY3BsYi5pbml0X2QudGFiW2NwbGIuaW5pdF9kLnBvc10gPSAtMTsKLQljcGxiLnN3aXRjaF9pLnRhYltjcGxiLnN3aXRjaF9pLnBvc10gPSAtMTsKLQljcGxiLnN3aXRjaF9kLnRhYltjcGxiLnN3aXRjaF9kLnBvc10gPSAtMTsKLQotfQotCisJaV9pID0gMDsKKwkvKiBOb3JtYWwgUkFNLCBpbmNsdWRpbmcgTVREIEZTLiAgKi8KKyNpZmRlZiBDT05GSUdfTVREX1VDTElOVVgKKwlpY3BsYl9ib3VuZHNbaV9pXS5lYWRkciA9IG1lbW9yeV9tdGRfc3RhcnQgKyBtdGRfc2l6ZTsKKyNlbHNlCisJaWNwbGJfYm91bmRzW2lfaV0uZWFkZHIgPSBtZW1vcnlfZW5kOwogI2VuZGlmCi0KKwlpY3BsYl9ib3VuZHNbaV9pKytdLmRhdGEgPSBTRFJBTV9JR0VORVJJQzsKKwkvKiBETUEgdW5jYWNoZWQgcmVnaW9uLiAgKi8KKwlpZiAoRE1BX1VOQ0FDSEVEX1JFR0lPTikgeworCQlpY3BsYl9ib3VuZHNbaV9pXS5lYWRkciA9IF9yYW1lbmQ7CisJCWljcGxiX2JvdW5kc1tpX2krK10uZGF0YSA9IDA7CisJfQorCWlmIChfcmFtZW5kICE9IHBoeXNpY2FsX21lbV9lbmQpIHsKKwkJLyogUmVzZXJ2ZWQgbWVtb3J5LiAgKi8KKwkJaWNwbGJfYm91bmRzW2lfaV0uZWFkZHIgPSBwaHlzaWNhbF9tZW1fZW5kOworCQlpY3BsYl9ib3VuZHNbaV9pKytdLmRhdGEgPSAocmVzZXJ2ZWRfbWVtX2ljYWNoZV9vbiA/CisJCQkJCSAgICBTRFJBTV9JR0VORVJJQyA6IFNEUkFNX0lOT05fQ0hCTCk7CisJfQorCS8qIEFkZHJlc3NpbmcgaG9sZSB1cCB0byBCb290Uk9NLiAgKi8KKwlpY3BsYl9ib3VuZHNbaV9pXS5lYWRkciA9IEJPT1RfUk9NX1NUQVJUOworCWljcGxiX2JvdW5kc1tpX2krK10uZGF0YSA9IDA7CisJLyogQm9vdFJPTSAtLSBsYXJnZXN0IG9uZSBzaG91bGQgYmUgbGVzcyB0aGFuIDEgbWVnLiAgKi8KKwlpY3BsYl9ib3VuZHNbaV9pXS5lYWRkciA9IEJPT1RfUk9NX1NUQVJUICsgKDEgKiAxMDI0ICogMTAyNCk7CisJaWNwbGJfYm91bmRzW2lfaSsrXS5kYXRhID0gU0RSQU1fSUdFTkVSSUM7CisJaWYgKEwyX0xFTkdUSCkgeworCQkvKiBBZGRyZXNzaW5nIGhvbGUgdXAgdG8gTDIgU1JBTSwgaW5jbHVkaW5nIHRoZSBhc3luYyBiYW5rLiAgKi8KKwkJaWNwbGJfYm91bmRzW2lfaV0uZWFkZHIgPSBMMl9TVEFSVDsKKwkJaWNwbGJfYm91bmRzW2lfaSsrXS5kYXRhID0gMDsKKwkJLyogTDIgU1JBTS4gICovCisJCWljcGxiX2JvdW5kc1tpX2ldLmVhZGRyID0gTDJfU1RBUlQgKyBMMl9MRU5HVEg7CisJCWljcGxiX2JvdW5kc1tpX2krK10uZGF0YSA9IEwyX0lNRU1PUlk7CisJfQorCWljcGxiX25yX2JvdW5kcyA9IGlfaTsKKwlCVUdfT04oaWNwbGJfbnJfYm91bmRzID4gQVJSQVlfU0laRShpY3BsYl9ib3VuZHMpKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4va2VybmVsL2NwbGItbm9tcHUvY3BsYm1nci5TIGIvYXJjaC9ibGFja2Zpbi9rZXJuZWwvY3BsYi1ub21wdS9jcGxibWdyLlMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1Y2YzYWMuLjAwMDAwMDAKLS0tIGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwvY3BsYi1ub21wdS9jcGxibWdyLlMKKysrIC9kZXYvbnVsbApAQCAtMSw2NDYgKzAsMCBAQAotLyoKLSAqIEZpbGU6ICAgICAgICAgYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9jcGxibWd0ci5TCi0gKiBCYXNlZCBvbjoKLSAqIEF1dGhvcjogICAgICAgTEcgU29mdCBJbmRpYQotICoKLSAqIENyZWF0ZWQ6ICAgICAgPwotICogRGVzY3JpcHRpb246ICBDUExCIHJlcGxhY2VtZW50IHJvdXRpbmUgZm9yIENQTEIgbWlzbWF0Y2gKLSAqCi0gKiBNb2RpZmllZDoKLSAqICAgICAgICAgICAgICAgQ29weXJpZ2h0IDIwMDQtMjAwNiBBbmFsb2cgRGV2aWNlcyBJbmMuCi0gKgotICogQnVnczogICAgICAgICBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSB0aGUgZmlsZSBDT1BZSU5HLCBvciB3cml0ZQotICogdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0gKi8KLQotLyogVXNhZ2U6IGludCBfY3BsYl9tZ3IoaXNfZGF0YV9taXNzLGludCBlbmFibGVfY2FjaGUpCi0gKiBpc19kYXRhX21pc3M9PTIgPT4gTWFyayBhcyBEaXJ0eSwgd3JpdGUgdG8gdGhlIGNsZWFuIGRhdGEgcGFnZQotICogaXNfZGF0YV9taXNzPT0xID0+IFJlcGxhY2UgYSBkYXRhIENQTEIuCi0gKiBpc19kYXRhX21pc3M9PTAgPT4gUmVwbGFjZSBhbiBpbnN0cnVjdGlvbiBDUExCLgotICoKLSAqIFJldHVybnM6Ci0gKiBDUExCX1JFTE9BREVECT0+IFN1Y2Nlc3NmdWxseSB1cGRhdGVkIENQTEIgdGFibGUuCi0gKiBDUExCX05PX1VOTE9DS0VECT0+IEFsbCBDUExCcyBhcmUgbG9ja2VkLCBzbyBjYW5ub3QgYmUgZXZpY3RlZC4KLSAqCQkJICAgVGhpcyBpbmRpY2F0ZXMgdGhhdCB0aGUgQ1BMQnMgaW4gdGhlIGNvbmZpZ3VyYXRpb24KLSAqCQkJICAgdGFibGVpIGFyZSBiYWRseSBjb25maWd1cmVkLCBhcyB0aGlzIHNob3VsZCBuZXZlcgotICoJCQkgICBvY2N1ci4KLSAqIENQTEJfTk9fQUREUl9NQVRDSAk9PiBUaGUgYWRkcmVzcyBiZWluZyBhY2Nlc3NlZCwgdGhhdCB0cmlnZ2VyZWQgdGhlCi0gKgkJCSAgIGV4Y2VwdGlvbiwgaXMgbm90IGNvdmVyZWQgYnkgYW55IG9mIHRoZSBDUExCcyBpbgotICoJCQkgICB0aGUgY29uZmlndXJhdGlvbiB0YWJsZS4gVGhlIGFwcGxpY2F0aW9uIGlzCi0gKgkJCSAgIHByZXN1bWFibHkgbWlzYmVoYXZpbmcuCi0gKiBDUExCX1BST1RfVklPTAk9PiBUaGUgYWRkcmVzcyBiZWluZyBhY2Nlc3NlZCwgdGhhdCB0cmlnZ2VyZWQgdGhlCi0gKgkJCSAgIGV4Y2VwdGlvbiwgd2FzIG5vdCBhIGZpcnN0LXdyaXRlIHRvIGEgY2xlYW4gV3JpdGUKLSAqCQkJICAgQmFjayBEYXRhIHBhZ2UsIGFuZCBzbyBwcmVzdW1hYmx5IGlzIGEgZ2VudWluZQotICoJCQkgICB2aW9sYXRpb24gb2YgdGhlIHBhZ2UncyBwcm90ZWN0aW9uIGF0dHJpYnV0ZXMuCi0gKgkJCSAgIFRoZSBhcHBsaWNhdGlvbiBpcyBtaXNiZWhhdmluZy4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgotI2luY2x1ZGUgPGFzbS9ibGFja2Zpbi5oPgotI2luY2x1ZGUgPGFzbS9jcGxiLmg+Ci0KLSNpZmRlZiBDT05GSUdfRVhDUFRfSVJRX1NZU0NfTDEKLS5zZWN0aW9uIC5sMS50ZXh0Ci0jZWxzZQotLnRleHQKLSNlbmRpZgotCi0uYWxpZ24gMjsKLUVOVFJZKF9jcGxiX21ncikKLQotCVstLVNQXT0oIFI3OjQsUDU6MyApOwotCi0JQ0MgPSBSMCA9PSAyOwotCUlGIENDIEpVTVAgLkxkY3BsYl93cml0ZTsKLQotCUNDID0gUjAgPT0gMDsKLQlJRiAhQ0MgSlVNUCAuTGRjcGxiX21pc3NfY29tcGFyZTsKLQotCS8qIElDUExCIE1pc3MgRXhjZXB0aW9uLiBXZSBuZWVkIHRvIGNob29zZSBvbmUgb2YgdGhlCi0JKiBjdXJyZW50bHktaW5zdGFsbGVkIENQTEJzLCBhbmQgcmVwbGFjZSBpdCB3aXRoIG9uZQotCSogZnJvbSB0aGUgY29uZmlndXJhdGlvbiB0YWJsZS4KLQkqLwotCi0JLyogQSBtdWx0aS13b3JkIGluc3RydWN0aW9uIGNhbiBjcm9zcyBhIHBhZ2UgYm91bmRhcnkuIFRoaXMgbWVhbnMgdGhlCi0JICogZmlyc3QgcGFydCBvZiB0aGUgaW5zdHJ1Y3Rpb24gY2FuIGJlIGluIGEgdmFsaWQgcGFnZSwgYnV0IHRoZQotCSAqIHNlY29uZCBwYXJ0IGlzIG5vdCwgYW5kIGhlbmNlIGdlbmVyYXRlcyB0aGUgaW5zdHJ1Y3Rpb24gbWlzcy4KLQkgKiBIb3dldmVyLCB0aGUgZmF1bHQgYWRkcmVzcyBpcyBmb3IgdGhlIHN0YXJ0IG9mIHRoZSBpbnN0cnVjdGlvbiwKLQkgKiBub3QgdGhlIHBhcnQgdGhhdCdzIGluIHRoZSBiYWQgcGFnZS4gVGhlcmVmb3JlLCB3ZSBoYXZlIHRvIGNoZWNrCi0JICogd2hldGhlciB0aGUgZmF1bHQgYWRkcmVzcyBhcHBsaWVzIHRvIGEgcGFnZSB0aGF0IGlzIGFscmVhZHkgcHJlc2VudAotCSAqIGluIHRoZSB0YWJsZS4KLQkgKi8KLQotCVA0LkwgPSBMTyhJQ1BMQl9GQVVMVF9BRERSKTsKLQlQNC5IID0gSEkoSUNQTEJfRkFVTFRfQUREUik7Ci0KLQlQMSA9IDE2OwotCVA1LkwgPSBfcGFnZV9zaXplX3RhYmxlOwotCVA1LkggPSBfcGFnZV9zaXplX3RhYmxlOwotCi0JUDAuTCA9IExPKElDUExCX0RBVEEwKTsKLQlQMC5IID0gSEkoSUNQTEJfREFUQTApOwotCVI0ID0gW1A0XTsJCS8qIEdldCBmYXVsdGluZyBhZGRyZXNzKi8KLQlSNiA9IDY0OwkJLyogQWR2YW5jZSBwYXN0IHRoZSBmYXVsdCBhZGRyZXNzLCB3aGljaCovCi0JUjYgPSBSNiArIFI0OwkJLyogd2UnbGwgdXNlIGlmIHdlIGZpbmQgYSBtYXRjaCovCi0JUjMgPSAoKDE2IDw8IDgpIHwgMik7CS8qIEV4dHJhY3QgbWFzaywgdHdvIGJpdHMgYXQgcG9zbiAxNiAqLwotCi0JUjUgPSAwOwotLkxpc2VhcmNoOgotCi0JUjEgPSBbUDAtMHgxMDBdOwkvKiBBZGRyZXNzIGZvciB0aGlzIENQTEIgKi8KLQotCVIwID0gW1AwKytdOwkJLyogSW5mbyBmb3IgdGhpcyBDUExCKi8KLQlDQyA9IEJJVFRTVChSMCwwKTsJLyogSXMgdGhlIENQTEIgdmFsaWQ/Ki8KLQlJRiAhQ0MgSlVNUCAuTG5vbWF0Y2g7CS8qIFNraXAgaXQsIGlmIG5vdC4qLwotCUNDID0gUjQgPCBSMShJVSk7CS8qIElmIGZhdWx0IGFkZHJlc3MgbGVzcyB0aGFuIHBhZ2Ugc3RhcnQqLwotCUlGIENDIEpVTVAgLkxub21hdGNoOwkvKiB0aGVuIHNraXAgdGhpcyBvbmUuKi8KLQlSMiA9IEVYVFJBQ1QoUjAsUjMuTCkgKFopOwkvKiBHZXQgcGFnZSBzaXplKi8KLQlQMSA9IFIyOwotCVAxID0gUDUgKyAoUDE8PDIpOwkvKiBpbmRleCBpbnRvIHBhZ2Utc2l6ZSB0YWJsZSovCi0JUjIgPSBbUDFdOwkJLyogR2V0IHRoZSBwYWdlIHNpemUqLwotCVIxID0gUjEgKyBSMjsJCS8qIGFuZCBhZGQgdG8gcGFnZSBzdGFydCwgdG8gZ2V0IHBhZ2UgZW5kKi8KLQlDQyA9IFI0IDwgUjEoSVUpOwkvKiBhbmQgc2VlIHdoZXRoZXIgZmF1bHQgYWRkciBpcyBpbiBwYWdlLiovCi0JSUYgIUNDIFI0ID0gUjY7CQkvKiBJZiBzbywgYWR2YW5jZSB0aGUgYWRkcmVzcyBhbmQgZmluaXNoIGxvb3AuKi8KLQlJRiAhQ0MgSlVNUCAuTGlzZWFyY2hfZG9uZTsKLS5Mbm9tYXRjaDoKLQkvKiBHbyBhcm91bmQgYWdhaW4qLwotCVI1ICs9IDE7Ci0JQ0MgPSBCSVRUU1QoUjUsIDQpOwkvKiBpLmUgQ0MgPSBSNSA+PSAxNiovCi0JSUYgIUNDIEpVTVAgLkxpc2VhcmNoOwotCi0uTGlzZWFyY2hfZG9uZToKLQlJMCA9IFI0OwkJLyogRmF1bHQgYWRkcmVzcyB3ZSdsbCBzZWFyY2ggZm9yKi8KLQotCS8qIHNldCB1cCBwb2ludGVycyAqLwotCVAwLkwgPSBMTyhJQ1BMQl9EQVRBMCk7Ci0JUDAuSCA9IEhJKElDUExCX0RBVEEwKTsKLQotCS8qIFRoZSByZXBsYWNlbWVudCBwcm9jZWR1cmUgZm9yIElDUExCcyAqLwotCi0JUDQuTCA9IExPKElNRU1fQ09OVFJPTCk7Ci0JUDQuSCA9IEhJKElNRU1fQ09OVFJPTCk7Ci0KLQkvKiBUdXJuIG9mZiBDUExCcyB3aGlsZSB3ZSB3b3JrLCBuZWNlc3NhcnkgYWNjb3JkaW5nIHRvIEhSTSBiZWZvcmUKLQkgKiBtb2RpZnlpbmcgQ1BMQiBkZXNjcmlwdG9ycwotCSAqLwotCVI1ID0gW1A0XTsJCS8qIENvbnRyb2wgUmVnaXN0ZXIqLwotCUJJVENMUihSNSxFTklDUExCX1ApOwotCUNMSSBSMTsKLQlTU1lOQzsJCS8qIFNTWU5DIHJlcXVpcmVkIGJlZm9yZSB3cml0aW5nIHRvIElNRU1fQ09OVFJPTC4gKi8KLQkuYWxpZ24gODsKLQlbUDRdID0gUjU7Ci0JU1NZTkM7Ci0JU1RJIFIxOwotCi0JUjEgPSAtMTsJCS8qIGVuZCBwb2ludCBjb21wYXJpc29uICovCi0JUjMgPSAxNjsJCS8qIGNvdW50ZXIgKi8KLQotCS8qIFNlYXJjaCB0aHJvdWdoIENQTEJzIGZvciBmaXJzdCBub24tbG9ja2VkIGVudHJ5ICovCi0JLyogT3ZlcndyaXRlIGl0IGJ5IG1vdmluZyBldmVyeW9uZSBlbHNlIHVwIGJ5IDEgKi8KLS5MaWNoZWNrX2xvY2s6Ci0JUjAgPSBbUDArK107Ci0JUjMgPSBSMyArIFIxOwotCUNDID0gUjMgPT0gUjE7Ci0JSUYgQ0MgSlVNUCAuTGFsbF9sb2NrZWQ7Ci0JQ0MgPSBCSVRUU1QoUjAsIDApOwkJLyogYW4gaW52YWxpZCBlbnRyeSBpcyBnb29kICovCi0JSUYgIUNDIEpVTVAgLkxpZm91bmRfdmljdGltOwotCUNDID0gQklUVFNUKFIwLDEpOwkJLyogYnV0IGEgbG9ja2VkIGVudHJ5IGlzbid0ICovCi0JSUYgQ0MgSlVNUCAuTGljaGVja19sb2NrOwotCi0uTGlmb3VuZF92aWN0aW06Ci0jaWZkZWYgQ09ORklHX0NQTEJfSU5GTwotCVI3ID0gW1AwIC0gMHgxMDRdOwotCVAyLkwgPSBfaXBkdF90YWJsZTsKLQlQMi5IID0gX2lwZHRfdGFibGU7Ci0JUDMuTCA9IF9pcGR0X3N3YXBjb3VudF90YWJsZTsKLQlQMy5IID0gX2lwZHRfc3dhcGNvdW50X3RhYmxlOwotCVAzICs9IC00OwotLkxpY291bnQ6Ci0JUjIgPSBbUDJdOwkvKiBhZGRyZXNzIGZyb20gY29uZmlnIHRhYmxlICovCi0JUDIgKz0gODsKLQlQMyArPSA4OwotCUNDID0gUjI9PS0xOwotCUlGIENDIEpVTVAgLkxpY291bnRfZG9uZTsKLQlDQyA9IFI3PT1SMjsKLQlJRiAhQ0MgSlVNUCAuTGljb3VudDsKLQlSNyA9IFtQM107Ci0JUjcgKz0gMTsKLQlbUDNdID0gUjc7Ci0JQ1NZTkM7Ci0uTGljb3VudF9kb25lOgotI2VuZGlmCi0JTEMwPVIzOwotCUxTRVRVUCguTGlzX21vdmUsLkxpZV9tb3ZlKSBMQzA7Ci0uTGlzX21vdmU6Ci0JUjAgPSBbUDBdOwotCVtQMCAtIDRdID0gUjA7Ci0JUjAgPSBbUDAgLSAweDEwMF07Ci0JW1AwLTB4MTA0XSA9IFIwOwotLkxpZV9tb3ZlOgotCVAwKz00OwotCi0JLyogQ2xlYXIgSUNQTEJfREFUQTE1LCBpbiBjYXNlIHdlIGRvbid0IGZpbmQgYSByZXBsYWNlbWVudAotCSAqIG90aGVyd2lzZSwgd2Ugd291bGQgaGF2ZSBhIGR1cGxpY2F0ZSBlbnRyeSwgYW5kIHdpbGwgY3Jhc2gKLQkgKi8KLQlSMCA9IDA7Ci0JW1AwIC0gNF0gPSBSMDsKLQotCS8qIFdlJ3ZlIG1hZGUgc3BhY2UgaW4gdGhlIElDUExCIHRhYmxlLCBzbyB0aGF0IElDUExCMTUKLQkgKiBpcyBub3cgZnJlZSB0byBiZSBvdmVyd3JpdHRlbi4gTmV4dCwgd2UgaGF2ZSB0byBkZXRlcm1pbmUKLQkgKiB3aGljaCBDUExCIHdlIG5lZWQgdG8gaW5zdGFsbCwgZnJvbSB0aGUgY29uZmlndXJhdGlvbgotCSAqIHRhYmxlLiBUaGlzIGlzIGEgbWF0dGVyIG9mIGdldHRpbmcgdGhlIHN0YXJ0LW9mLXBhZ2UKLQkgKiBhZGRyZXNzZXMgYW5kIHBhZ2UtbGVuZ3RocyBmcm9tIHRoZSBjb25maWcgdGFibGUsIGFuZAotCSAqIGRldGVybWluaW5nIHdoZXRoZXIgdGhlIGZhdWx0IGFkZHJlc3MgZmFsbHMgd2l0aGluIHRoYXQKLQkgKiByYW5nZS4KLSAJICovCi0KLQlQMi5MID0gX2lwZHRfdGFibGU7Ci0JUDIuSCA9IF9pcGR0X3RhYmxlOwotI2lmZGVmCUNPTkZJR19DUExCX0lORk8KLQlQMy5MID0gX2lwZHRfc3dhcGNvdW50X3RhYmxlOwotCVAzLkggPSBfaXBkdF9zd2FwY291bnRfdGFibGU7Ci0JUDMgKz0gLTg7Ci0jZW5kaWYKLQlQMC5MID0gX3BhZ2Vfc2l6ZV90YWJsZTsKLQlQMC5IID0gX3BhZ2Vfc2l6ZV90YWJsZTsKLQotCS8qIFJldHJpZXZlIG91ciBmYXVsdCBhZGRyZXNzICh3aGljaCBtYXkgaGF2ZSBiZWVuIGFkdmFuY2VkCi0JICogYmVjYXVzZSB0aGUgZmF1bHRpbmcgaW5zdHJ1Y3Rpb24gY3Jvc3NlZCBhIHBhZ2UgYm91bmRhcnkpLgotCSAqLwotCi0JUjAgPSBJMDsKLQotCS8qIEFuIGV4dHJhY3Rpb24gcGF0dGVybiwgdG8gZ2V0IHRoZSBwYWdlLXNpemUgYml0cyBmcm9tCi0JICogdGhlIENQTEIgZGF0YSBlbnRyeS4gQml0cyAxNi0xNywgc28gdHdvIGJpdHMgYXQgcG9zbiAxNi4KLQkgKi8KLQotCVIxID0gKCgxNjw8OCl8Mik7Ci0uTGluZXh0OglSNCA9IFtQMisrXTsJLyogYWRkcmVzcyBmcm9tIGNvbmZpZyB0YWJsZSAqLwotCVIyID0gW1AyKytdOwkvKiBkYXRhIGZyb20gY29uZmlnIHRhYmxlICovCi0jaWZkZWYJQ09ORklHX0NQTEJfSU5GTwotCVAzICs9IDg7Ci0jZW5kaWYKLQotCUNDID0gUjQgPT0gLTE7CS8qIEVuZCBvZiBjb25maWcgdGFibGUqLwotCUlGIENDIEpVTVAgLkxub19wYWdlX2luX3RhYmxlOwotCi0JLyogU2VlIGlmIGZhaWxlZCBhZGRyZXNzID4gc3RhcnQgYWRkcmVzcyAqLwotCUNDID0gUjQgPD0gUjAoSVUpOwotCUlGICFDQyBKVU1QIC5MaW5leHQ7Ci0KLQkvKiBleHRyYWN0IHBhZ2Ugc2l6ZSAoMTc6MTYpKi8KLQlSMyA9IEVYVFJBQ1QoUjIsIFIxLkwpIChaKTsKLQotCS8qIGFkZCBwYWdlIHNpemUgdG8gYWRkciB0byBnZXQgcmFuZ2UgKi8KLQotCVA1ID0gUjM7Ci0JUDUgPSBQMCArIChQNSA8PCAyKTsJLyogc2NhbGVkLCBmb3IgaW50IGFjY2VzcyovCi0JUjMgPSBbUDVdOwotCVIzID0gUjMgKyBSNDsKLQotCS8qIFNlZSBpZiBmYWlsZWQgYWRkcmVzcyA8IChzdGFydCBhZGRyZXNzICsgcGFnZSBzaXplKSAqLwotCUNDID0gUjAgPCBSMyhJVSk7Ci0JSUYgIUNDIEpVTVAgLkxpbmV4dDsKLQotCS8qIFdlJ3ZlIGZvdW5kIGEgQ1BMQiBpbiB0aGUgY29uZmlnIHRhYmxlIHRoYXQgY292ZXJzCi0JICogdGhlIGZhdWx0aW5nIGFkZHJlc3MsIHNvIGluc3RhbGwgdGhpcyBDUExCIGludG8gdGhlCi0JICogbGFzdCBlbnRyeSBvZiB0aGUgdGFibGUuCi0JICovCi0KLQlQMS5MID0gTE8oSUNQTEJfREFUQTE1KTsJCS8qIElDUExCX0RBVEExNSAqLwotCVAxLkggPSBISShJQ1BMQl9EQVRBMTUpOwotCVtQMV0gPSBSMjsKLQlbUDEtMHgxMDBdID0gUjQ7Ci0jaWZkZWYJQ09ORklHX0NQTEJfSU5GTwotCVIzID0gW1AzXTsKLQlSMyArPSAxOwotCVtQM10gPSBSMzsKLSNlbmRpZgotCi0JLyogUDQgcG9pbnRzIHRvIElNRU1fQ09OVFJPTCwgYW5kIFI1IGNvbnRhaW5zIGl0cyBvbGQKLQkgKiB2YWx1ZSwgYWZ0ZXIgd2UgZGlzYWJsZWQgSUNQTEJTLiBSZS1lbmFibGUgdGhlbS4KLQkgKi8KLQotCUJJVFNFVChSNSxFTklDUExCX1ApOwotCUNMSSBSMjsKLQlTU1lOQzsJCS8qIFNTWU5DIHJlcXVpcmVkIGJlZm9yZSB3cml0aW5nIHRvIElNRU1fQ09OVFJPTC4gKi8KLQkuYWxpZ24gODsKLQlbUDRdID0gUjU7Ci0JU1NZTkM7Ci0JU1RJIFIyOwotCi0JKCBSNzo0LFA1OjMgKSA9IFtTUCsrXTsKLQlSMCA9IENQTEJfUkVMT0FERUQ7Ci0JUlRTOwotCi0vKiBGQUlMRUQgQ0FTRVMqLwotLkxub19wYWdlX2luX3RhYmxlOgotCVIwID0gQ1BMQl9OT19BRERSX01BVENIOwotCUpVTVAgLkxmYWlsX3JldDsKLQotLkxhbGxfbG9ja2VkOgotCVIwID0gQ1BMQl9OT19VTkxPQ0tFRDsKLQlKVU1QIC5MZmFpbF9yZXQ7Ci0KLS5McHJvdF92aW9sYXRpb246Ci0JUjAgPSBDUExCX1BST1RfVklPTDsKLQotLkxmYWlsX3JldDoKLQkvKiBNYWtlIHN1cmUgd2UgdHVybiBwcm90ZWN0aW9uL2NhY2hlIGJhY2sgb24sIGV2ZW4gaW4gdGhlIGZhaWxpbmcgY2FzZSAqLwotCUJJVFNFVChSNSxFTklDUExCX1ApOwotCUNMSSBSMjsKLQlTU1lOQzsgICAgICAgICAgLyogU1NZTkMgcmVxdWlyZWQgYmVmb3JlIHdyaXRpbmcgdG8gSU1FTV9DT05UUk9MLiAqLwotCS5hbGlnbiA4OwotCVtQNF0gPSBSNTsKLQlTU1lOQzsKLQlTVEkgUjI7Ci0KLQkoIFI3OjQsUDU6MyApID0gW1NQKytdOwotCVJUUzsKLQotLkxkY3BsYl93cml0ZToKLQotCS8qIGlmIGEgRENQTEIgaXMgbWFya2VkIGFzIHdyaXRlLWJhY2sgKENQTEJfV1Q9PTApLCBhbmQKLQkgKiBpdCBpcyBjbGVhbiAoQ1BMQl9ESVJUWT09MCksIHRoZW4gYSB3cml0ZSB0byB0aGUKLQkgKiBDUExCJ3MgcGFnZSB0cmlnZ2VycyBhIHByb3RlY3Rpb24gdmlvbGF0aW9uLiBXZSBoYXZlIHRvCi0JICogbWFyayB0aGUgQ1BMQiBhcyBkaXJ0eSwgdG8gaW5kaWNhdGUgdGhhdCB0aGVyZSBhcmUKLQkgKiBwZW5kaW5nIHdyaXRlcyBhc3NvY2lhdGVkIHdpdGggdGhlIENQTEIuCi0JICovCi0KLQlQNC5MID0gTE8oRENQTEJfU1RBVFVTKTsKLQlQNC5IID0gSEkoRENQTEJfU1RBVFVTKTsKLQlQMy5MID0gTE8oRENQTEJfREFUQTApOwotCVAzLkggPSBISShEQ1BMQl9EQVRBMCk7Ci0JUjUgPSBbUDRdOwotCi0JLyogQSBwcm90ZWN0aW9uIHZpb2xhdGlvbiBjYW4gYmUgY2F1c2VkIGJ5IG1vcmUgdGhhbiBqdXN0IHdyaXRlcwotCSAqIHRvIGEgY2xlYW4gV0IgcGFnZSwgc28gd2UgaGF2ZSB0byBlbnN1cmUgdGhhdDoKLQkgKiAtIEl0J3MgYSB3cml0ZQotCSAqIC0gdG8gYSBjbGVhbiBXQiBwYWdlCi0JICogLSBhbmQgaXMgYWxsb3dlZCBpbiB0aGUgbW9kZSB0aGUgYWNjZXNzIG9jY3VycmVkLgotCSAqLwotCi0JQ0MgPSBCSVRUU1QoUjUsIDE2KTsJLyogZW5zdXJlIGl0IHdhcyBhIHdyaXRlKi8KLQlJRiAhQ0MgSlVNUCAuTHByb3RfdmlvbGF0aW9uOwotCi0JLyogdG8gY2hlY2sgdGhlIHJlc3QsIHdlIGhhdmUgdG8gcmV0cmlldmUgdGhlIERDUExCLiovCi0KLQkvKiBUaGUgbG93IGhhbGYgb2YgRENQTEJfU1RBVFVTIGlzIGEgYml0IG1hc2sqLwotCi0JUjIgPSBSNS5MIChaKTsJLyogaW5kaWNhdGluZyB3aGljaCBDUExCIHRyaWdnZXJlZCB0aGUgZXZlbnQuKi8KLQlSMyA9IDMwOwkvKiBzbyB3ZSBjYW4gdXNlIHRoaXMgdG8gZGV0ZXJtaW5lIHRoZSBvZmZzZXQqLwotCVIyLkwgPSBTSUdOQklUUyBSMjsKLQlSMiA9IFIyLkwgKFopOwkvKiBpbnRvIHRoZSBEQ1BMQiB0YWJsZS4qLwotCVIzID0gUjMgLSBSMjsKLQlQNCA9IFIzOwotCVAzID0gUDMgKyAoUDQ8PDIpOwotCVIzID0gW1AzXTsJLyogUmV0cmlldmUgdGhlIENQTEIqLwotCi0JLyogTm93IHdlIGNhbiBjaGVjayB3aGV0aGVyIGl0J3MgYSBjbGVhbiBXQiBwYWdlKi8KLQotCUNDID0gQklUVFNUKFIzLCAxNCk7CS8qIDA9PVdCLCAxPT1XVCovCi0JSUYgQ0MgSlVNUCAuTHByb3RfdmlvbGF0aW9uOwotCUNDID0gQklUVFNUKFIzLCA3KTsJLyogMCA9PSBjbGVhbiwgMSA9PSBkaXJ0eSovCi0JSUYgQ0MgSlVNUCAuTHByb3RfdmlvbGF0aW9uOwotCi0JLyogQ2hlY2sgd2hldGhlciB0aGUgd3JpdGUgaXMgYWxsb3dlZCBpbiB0aGUgbW9kZSB0aGF0IHdhcyBhY3RpdmUuKi8KLQotCVIyID0gMTw8MzsJCS8qIGNoZWNraW5nIHdyaXRlIGluIHVzZXIgbW9kZSovCi0JQ0MgPSBCSVRUU1QoUjUsIDE3KTsJLyogMD09d2FzIHVzZXIsIDE9PXdhcyBzdXBlciovCi0JUjUgPSBDQzsKLQlSMiA8PD0gUjU7CQkvKiBpZiB3YXMgc3VwZXIsIGNoZWNrIHdyaXRlIGluIHN1cGVyIG1vZGUqLwotCVIyID0gUjMgJiBSMjsKLQlDQyA9IFIyID09IDA7Ci0JSUYgQ0MgSlVNUCAuTHByb3RfdmlvbGF0aW9uOwotCi0JLyogSXQncyBhIGdlbnVpbmUgd3JpdGUtdG8tY2xlYW4tcGFnZS4qLwotCi0JQklUU0VUKFIzLCA3KTsJCS8qIG1hcmsgYXMgZGlydHkqLwotCVtQM10gPSBSMzsJCS8qIGFuZCB3cml0ZSBiYWNrLiovCi0JTk9QOwotCUNTWU5DOwotCSggUjc6NCxQNTozICkgPSBbU1ArK107Ci0JUjAgPSBDUExCX1JFTE9BREVEOwotCVJUUzsKLQotLkxkY3BsYl9taXNzX2NvbXBhcmU6Ci0KLQkvKiBEYXRhIENQTEIgTWlzcyBldmVudC4gV2UgbmVlZCB0byBjaG9vc2UgYSBDUExCIHRvCi0JICogZXZpY3QsIGFuZCB0aGVuIGxvY2F0ZSBhIG5ldyBDUExCIHRvIGluc3RhbGwgZnJvbSB0aGUKLQkgKiBjb25maWcgdGFibGUsIHRoYXQgY292ZXJzIHRoZSBmYXVsdGluZyBhZGRyZXNzLgotCSAqLwotCi0JUDEuTCA9IExPKERDUExCX0RBVEExNSk7Ci0JUDEuSCA9IEhJKERDUExCX0RBVEExNSk7Ci0KLQlQNC5MID0gTE8oRENQTEJfRkFVTFRfQUREUik7Ci0JUDQuSCA9IEhJKERDUExCX0ZBVUxUX0FERFIpOwotCVI0ID0gW1A0XTsKLQlJMCA9IFI0OwotCi0JLyogVGhlIHJlcGxhY2VtZW50IHByb2NlZHVyZSBmb3IgRENQTEJzKi8KLQotCVI2ID0gUjE7CS8qIFNhdmUgZm9yIGxhdGVyKi8KLQotCS8qIFR1cm4gb2ZmIENQTEJzIHdoaWxlIHdlIHdvcmsuKi8KLQlQNC5MID0gTE8oRE1FTV9DT05UUk9MKTsKLQlQNC5IID0gSEkoRE1FTV9DT05UUk9MKTsKLQlSNSA9IFtQNF07Ci0JQklUQ0xSKFI1LEVORENQTEJfUCk7Ci0JQ0xJIFIwOwotCVNTWU5DOwkJLyogU1NZTkMgcmVxdWlyZWQgYmVmb3JlIHdyaXRpbmcgdG8gRE1FTV9DT05UUk9MLiAqLwotCS5hbGlnbiA4OwotCVtQNF0gPSBSNTsKLQlTU1lOQzsKLQlTVEkgUjA7Ci0KLQkvKiBTdGFydCBsb29raW5nIGZvciBhIENQTEIgdG8gZXZpY3QuIE91ciBvcmRlciBvZiBwcmVmZXJlbmNlCi0JICogaXM6IGludmFsaWQgQ1BMQnMsIGNsZWFuIENQTEJzLCBkaXJ0eSBDUExCcy4gTG9ja2VkIENQTEJzCi0JICogYXJlIG5vIGdvb2QuCi0JICovCi0KLQlJMS5MID0gTE8oRENQTEJfREFUQTApOwotCUkxLkggPSBISShEQ1BMQl9EQVRBMCk7Ci0JUDEgPSAyOwotCVAyID0gMTY7Ci0JSTIuTCA9IF9kY3BsYl9wcmVmZXJlbmNlOwotCUkyLkggPSBfZGNwbGJfcHJlZmVyZW5jZTsKLQlMU0VUVVAoLkxzZHNlYXJjaDEsIC5MZWRzZWFyY2gxKSBMQzAgPSBQMTsKLS5Mc2RzZWFyY2gxOgotCVIwID0gW0kyKytdOwkJLyogR2V0IHRoZSBiaXRzIHdlJ3JlIGludGVyZXN0ZWQgaW4qLwotCVAwID0gSTE7CQkvKiBHbyBiYWNrIHRvIHN0YXJ0IG9mIHRhYmxlKi8KLQlMU0VUVVAgKC5Mc2RzZWFyY2gyLCAuTGVkc2VhcmNoMikgTEMxID0gUDI7Ci0uTHNkc2VhcmNoMjoKLQlSMSA9IFtQMCsrXTsJCS8qIEZldGNoIGVhY2ggaW5zdGFsbGVkIENQTEIgaW4gdHVybiovCi0JUjIgPSBSMSAmIFIwOwkJLyogYW5kIHRlc3QgZm9yIGludGVyZXN0aW5nIGJpdHMuKi8KLQlDQyA9IFIyID09IDA7CQkvKiBJZiBub25lIGFyZSBzZXQsIGl0J2xsIGRvLiovCi0JSUYgIUNDIEpVTVAgLkxza2lwX3N0YWNrX2NoZWNrOwotCi0JUjIgPSBbUDAgLSAweDEwNF07IAkvKiBSMiAtIFBhZ2VTdGFydCAqLwotCVAzLkwgPSBfcGFnZV9zaXplX3RhYmxlOyAvKiByZXRyaWV2ZSBlbmQgYWRkcmVzcyAqLwotCVAzLkggPSBfcGFnZV9zaXplX3RhYmxlOyAvKiByZXRyaWV2ZSBlbmQgYWRkcmVzcyAqLwotCVIzID0gMHgxMDAyOwkJLyogMTZ0aCAtIHBvc2l0aW9uLCAyIGJpdHMgLWxlbmd0aCAqLwotI2lmIEFOT01BTFlfMDUwMDAyMDkKLQlub3A7CQkJLyogQW5vbWFseSAwNTAwMDIwOSAqLwotI2VuZGlmCi0JUjcgPSBFWFRSQUNUKFIxLFIzLmwpOwotCVI3ID0gUjcgPDwgMjsJCS8qIFBhZ2Ugc2l6ZSBpbmRleCBvZmZzZXQgKi8KLQlQNSA9IFI3OwotCVAzID0gUDMgKyBQNTsKLQlSNyA9IFtQM107CQkvKiBwYWdlIHNpemUgaW4gYnl0ZXMgKi8KLQotCVI3ID0gUjIgKyBSNzsJCS8qIFI3IC0gUGFnZUVuZCAqLwotCVI0ID0gU1A7IAkJLyogVGVzdCBTUCBpcyBpbiByYW5nZSAqLwotCi0JQ0MgPSBSNyA8IFI0OwkJLyogaWYgUGFnZUVuZCA8IFNQICovCi0JSUYgQ0MgSlVNUCAuTGRmb3VuZF92aWN0aW07Ci0JUjMgPSAweDI4NDsJCS8qIHN0YWNrIGxlbmd0aCBmcm9tIHN0YXJ0IG9mIHRyYXAgdGlsbAotCQkJCSAqIHRoZSBwb2ludC4KLQkJCQkgKiAyMCBzdGFjayBsb2NhdGlvbnMgZm9yIGZ1dHVyZSBtb2RpZmljYXRpb25zCi0JCQkJICovCi0JUjQgPSBSNCArIFIzOwotCUNDID0gUjQgPCBSMjsJCS8qIGlmIFNQICsgc3RhY2tsZW4gPCBQYWdlU3RhcnQgKi8KLQlJRiBDQyBKVU1QIC5MZGZvdW5kX3ZpY3RpbTsKLS5Mc2tpcF9zdGFja19jaGVjazoKLQotLkxlZHNlYXJjaDI6IE5PUDsKLS5MZWRzZWFyY2gxOiBOT1A7Ci0KLQkvKiBJZiB3ZSBnb3QgaGVyZSwgd2UgZGlkbid0IGZpbmQgYSBEQ1BMQiB3ZSBjb25zaWRlcmVkCi0JICogcmVwbGFjYWJsZSwgd2hpY2ggbWVhbnMgYWxsIG9mIHRoZW0gd2VyZSBsb2NrZWQuCi0JICovCi0KLQlKVU1QIC5MYWxsX2xvY2tlZDsKLS5MZGZvdW5kX3ZpY3RpbToKLQotI2lmZGVmIENPTkZJR19DUExCX0lORk8KLQlSNyA9IFtQMCAtIDB4MTA0XTsKLQlQMi5MID0gX2RwZHRfdGFibGU7Ci0JUDIuSCA9IF9kcGR0X3RhYmxlOwotCVAzLkwgPSBfZHBkdF9zd2FwY291bnRfdGFibGU7Ci0JUDMuSCA9IF9kcGR0X3N3YXBjb3VudF90YWJsZTsKLQlQMyArPSAtNDsKLS5MZGljb3VudDoKLQlSMiA9IFtQMl07Ci0JUDIgKz0gODsKLQlQMyArPSA4OwotCUNDID0gUjI9PS0xOwotCUlGIENDIEpVTVAgLkxkaWNvdW50X2RvbmU7Ci0JQ0MgPSBSNz09UjI7Ci0JSUYgIUNDIEpVTVAgLkxkaWNvdW50OwotCVI3ID0gW1AzXTsKLQlSNyArPSAxOwotCVtQM10gPSBSNzsKLS5MZGljb3VudF9kb25lOgotI2VuZGlmCi0KLQkvKiBDbGVhbiBkb3duIHRoZSBoYXJkd2FyZSBsb29wcyovCi0JUjIgPSAwOwotCUxDMSA9IFIyOwotCUxDMCA9IFIyOwotCi0JLyogVGhlcmUncyBhIHN1aXRhYmxlIHZpY3RpbSBpbiBbUDAtNF0gKGJlY2F1c2Ugd2UndmUKLQkgKiBhZHZhbmNlZCBhbHJlYWR5KS4KLQkgKi8KLQotLkxEZG92ZXJ3cml0ZToKLQotCS8qIFtQMC00XSBpcyBhIHN1aXRhYmxlIHZpY3RpbSBDUExCLCBzbyB3ZSB3YW50IHRvCi0JICogb3ZlcndyaXRlIGl0IGJ5IG1vdmluZyBhbGwgdGhlIGZvbGxvd2luZyBDUExCcwotCSAqIG9uZSBzcGFjZSBjbG9zZXIgdG8gdGhlIHN0YXJ0LgotCSAqLwotCi0JUjEuTCA9IExPKERDUExCX0RBVEExNik7CQkvKiBEQ1BMQl9EQVRBMTUgKyA0ICovCi0JUjEuSCA9IEhJKERDUExCX0RBVEExNik7Ci0JUjAgPSBQMDsKLQotCS8qIElmIHRoZSB2aWN0aW0gaGFwcGVucyB0byBiZSBpbiBEQ1BMQjE1LAotCSAqIHdlIGRvbid0IG5lZWQgdG8gbW92ZSBhbnl0aGluZy4KLQkgKi8KLQotCUNDID0gUjEgPT0gUjA7Ci0JSUYgQ0MgSlVNUCAuTGRlX21vdmVkOwotCVIxID0gUjEgLSBSMDsKLQlSMSA+Pj0gMjsKLQlQMSA9IFIxOwotCUxTRVRVUCguTGRzX21vdmUsIC5MZGVfbW92ZSkgTEMwPVAxOwotLkxkc19tb3ZlOgotCVIwID0gW1AwKytdOwkvKiBtb3ZlIGRhdGEgKi8KLQlbUDAgLSA4XSA9IFIwOwotCVIwID0gW1AwLTB4MTA0XQkvKiBtb3ZlIGFkZHJlc3MgKi8KLS5MZGVfbW92ZToKLQkgW1AwLTB4MTA4XSA9IFIwOwotCi0uTGRlX21vdmVkOgotCU5PUDsKLQotCS8qIENsZWFyIERDUExCX0RBVEExNSwgaW4gY2FzZSB3ZSBkb24ndCBmaW5kIGEgcmVwbGFjZW1lbnQKLQkgKiBvdGhlcndpc2UsIHdlIHdvdWxkIGhhdmUgYSBkdXBsaWNhdGUgZW50cnksIGFuZCB3aWxsIGNyYXNoCi0JICovCi0JUjAgPSAwOwotCVtQMCAtIDB4NF0gPSBSMDsKLQotCS8qIFdlJ3ZlIG5vdyBtYWRlIHNwYWNlIGluIERDUExCMTUgZm9yIHRoZSBuZXcgQ1BMQiB0byBiZQotCSAqIGluc3RhbGxlZC4gVGhlIG5leHQgc3RhZ2UgaXMgdG8gbG9jYXRlIGEgQ1BMQiBpbiB0aGUKLQkgKiBjb25maWcgdGFibGUgdGhhdCBjb3ZlcnMgdGhlIGZhdWx0aW5nIGFkZHJlc3MuCi0JICovCi0KLQlSMCA9IEkwOwkJLyogT3VyIGZhdWx0aW5nIGFkZHJlc3MgKi8KLQotCVAyLkwgPSBfZHBkdF90YWJsZTsKLQlQMi5IID0gX2RwZHRfdGFibGU7Ci0jaWZkZWYJQ09ORklHX0NQTEJfSU5GTwotCVAzLkwgPSBfZHBkdF9zd2FwY291bnRfdGFibGU7Ci0JUDMuSCA9IF9kcGR0X3N3YXBjb3VudF90YWJsZTsKLQlQMyArPSAtODsKLSNlbmRpZgotCi0JUDEuTCA9IF9wYWdlX3NpemVfdGFibGU7Ci0JUDEuSCA9IF9wYWdlX3NpemVfdGFibGU7Ci0KLQkvKiBBbiBleHRyYWN0aW9uIHBhdHRlcm4sIHRvIHJldHJpZXZlIGJpdHMgMTc6MTYuKi8KLQotCVIxID0gKDE2PDw4KXwyOwotLkxkbmV4dDoJUjQgPSBbUDIrK107CS8qIGFkZHJlc3MgKi8KLQlSMiA9IFtQMisrXTsJLyogZGF0YSAqLwotI2lmZGVmCUNPTkZJR19DUExCX0lORk8KLQlQMyArPSA4OwotI2VuZGlmCi0KLQlDQyA9IFI0ID09IC0xOwotCUlGIENDIEpVTVAgLkxub19wYWdlX2luX3RhYmxlOwotCi0JLyogU2VlIGlmIGZhaWxlZCBhZGRyZXNzID4gc3RhcnQgYWRkcmVzcyAqLwotCUNDID0gUjQgPD0gUjAoSVUpOwotCUlGICFDQyBKVU1QIC5MZG5leHQ7Ci0KLQkvKiBleHRyYWN0IHBhZ2Ugc2l6ZSAoMTc6MTYpKi8KLQlSMyA9IEVYVFJBQ1QoUjIsIFIxLkwpIChaKTsKLQotCS8qIGFkZCBwYWdlIHNpemUgdG8gYWRkciB0byBnZXQgcmFuZ2UgKi8KLQotCVA1ID0gUjM7Ci0JUDUgPSBQMSArIChQNSA8PCAyKTsKLQlSMyA9IFtQNV07Ci0JUjMgPSBSMyArIFI0OwotCi0JLyogU2VlIGlmIGZhaWxlZCBhZGRyZXNzIDwgKHN0YXJ0IGFkZHJlc3MgKyBwYWdlIHNpemUpICovCi0JQ0MgPSBSMCA8IFIzKElVKTsKLQlJRiAhQ0MgSlVNUCAuTGRuZXh0OwotCi0JLyogV2UndmUgZm91bmQgdGhlIENQTEIgdGhhdCBzaG91bGQgYmUgaW5zdGFsbGVkLCBzbwotCSAqIHdyaXRlIGl0IGludG8gQ1BMQjE1LCBtYXNraW5nIG9mZiBhbnkgY2FjaGluZyBiaXRzCi0JICogaWYgbmVjZXNzYXJ5LgotCSAqLwotCi0JUDEuTCA9IExPKERDUExCX0RBVEExNSk7Ci0JUDEuSCA9IEhJKERDUExCX0RBVEExNSk7Ci0KLQkvKiBJZiB0aGUgRENQTEIgaGFzIGNhY2hlIGJpdHMgc2V0LCBidXQgY2FjaGluZyBoYXNuJ3QKLQkgKiBiZWVuIGVuYWJsZWQsIHRoZW4gd2Ugd2FudCB0byBtYXNrIG9mZiB0aGUgY2FjaGUtaW4tTDEKLQkgKiBiaXQgYmVmb3JlIGluc3RhbGxpbmcuIE1vcmVvdmVyLCBpZiBjYWNoaW5nIGlzIG9mZiwgd2UKLQkgKiBhbHNvIHdhbnQgdG8gZW5zdXJlIHRoYXQgdGhlIERDUExCIGhhcyBXVCBtb2RlIHNldCwgcmF0aGVyCi0JICogdGhhbiBXQiwgc2luY2UgV0IgcGFnZXMgc3RpbGwgdHJpZ2dlciBmaXJzdC13cml0ZSBleGNlcHRpb25zCi0JICogZXZlbiB3aGVuIG5vdCBjYWNoaW5nIGlzIG9mZiwgYW5kIHRoZSBwYWdlIGlzbid0IG1hcmtlZCBhcwotCSAqIGNhY2hhYmxlLiBGaW5hbGx5LCB3ZSBjb3VsZCBtYXJrIHRoZSBwYWdlIGFzIGNsZWFuLCBub3QgZGlydHksCi0JICogYnV0IHdlIGNob29zZSB0byBsZWF2ZSB0aGF0IGRlY2lzaW9uIHRvIHRoZSB1c2VyOyBpZiB0aGUgdXNlcgotCSAqIGNob29zZXMgdG8gaGF2ZSBhIENQTEIgcHJlLWRlZmluZWQgYXMgZGlydHksIHRoZW4gdGhleSBhbHdheXMKLQkgKiBwYXkgdGhlIGNvc3Qgb2YgZmx1c2hpbmcgZHVyaW5nIGV2aWN0aW9uLCBidXQgZG9uJ3QgcGF5IHRoZQotCSAqIGNvc3Qgb2YgZmlyc3Qtd3JpdGUgZXhjZXB0aW9ucyB0byBtYXJrIHRoZSBwYWdlIGFzIGRpcnR5LgotCSAqLwotCi0jaWZkZWYgQ09ORklHX0JGSU5fV1QKLQlCSVRTRVQoUjYsIDE0KTsJCS8qIFNldCBXVCovCi0jZW5kaWYKLQotCVtQMV0gPSBSMjsKLQlbUDEtMHgxMDBdID0gUjQ7Ci0jaWZkZWYJQ09ORklHX0NQTEJfSU5GTwotCVIzID0gW1AzXTsKLQlSMyArPSAxOwotCVtQM10gPSBSMzsKLSNlbmRpZgotCi0JLyogV2UndmUgaW5zdGFsbGVkIHRoZSBDUExCLCBzbyByZS1lbmFibGUgQ1BMQnMuIFA0Ci0JICogcG9pbnRzIHRvIERNRU1fQ09OVFJPTCwgYW5kIFI1IGlzIHRoZSB2YWx1ZSB3ZQotCSAqIGxhc3Qgd3JvdGUgdG8gaXQsIHdoZW4gd2Ugd2VyZSBkaXNhYmxpbmcgQ1BMQnMuCi0JICovCi0KLQlCSVRTRVQoUjUsRU5EQ1BMQl9QKTsKLQlDTEkgUjI7Ci0JLmFsaWduIDg7Ci0JW1A0XSA9IFI1OwotCVNTWU5DOwotCVNUSSBSMjsKLQotCSggUjc6NCxQNTozICkgPSBbU1ArK107Ci0JUjAgPSBDUExCX1JFTE9BREVEOwotCVJUUzsKLUVORFBST0MoX2NwbGJfbWdyKQotCi0uZGF0YQotLmFsaWduIDQ7Ci1fcGFnZV9zaXplX3RhYmxlOgotLmJ5dGU0CTB4MDAwMDA0MDA7CS8qIDFLICovCi0uYnl0ZTQJMHgwMDAwMTAwMDsJLyogNEsgKi8KLS5ieXRlNAkweDAwMTAwMDAwOwkvKiAxTSAqLwotLmJ5dGU0CTB4MDA0MDAwMDA7CS8qIDRNICovCi0KLS5hbGlnbiA0OwotX2RjcGxiX3ByZWZlcmVuY2U6Ci0uYnl0ZTQJMHgwMDAwMDAwMTsJLyogdmFsaWQgYml0ICovCi0uYnl0ZTQJMHgwMDAwMDAwMjsJLyogbG9jayBiaXQgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4va2VybmVsL2NwbGItbm9tcHUvY3BsYm1nci5jIGIvYXJjaC9ibGFja2Zpbi9rZXJuZWwvY3BsYi1ub21wdS9jcGxibWdyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc2MjQ5YQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYmxhY2tmaW4va2VybmVsL2NwbGItbm9tcHUvY3BsYm1nci5jCkBAIC0wLDAgKzEsMjgzIEBACisvKgorICogRmlsZTogICAgICAgICBhcmNoL2JsYWNrZmluL2tlcm5lbC9jcGxiLW5vbXB1LWMvY3BsYm1nci5jCisgKiBCYXNlZCBvbjogICAgIGFyY2gvYmxhY2tmaW4va2VybmVsL2NwbGItbXB1L2NwbGJtZ3IuYworICogQXV0aG9yOiAgICAgICBNaWNoYWVsIE1jVGVybmFuIDxtbWN0ZXJuYW5AYWlydmFuYS5jb20+CisgKgorICogQ3JlYXRlZDogICAgICAwMU5vdjIwMDgKKyAqIERlc2NyaXB0aW9uOiAgQ1BMQiBtaXNzIGhhbmRsZXIuCisgKgorICogTW9kaWZpZWQ6CisgKiAgICAgICAgICAgICAgIENvcHlyaWdodCAyMDA4IEFpcnZhbmEgSW5jLgorICogICAgICAgICAgICAgICBDb3B5cmlnaHQgMjAwNC0yMDA3IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBCdWdzOiAgICAgICAgIEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8YXNtL2JsYWNrZmluLmg+CisjaW5jbHVkZSA8YXNtL2NwbGJpbml0Lmg+CisjaW5jbHVkZSA8YXNtL2NwbGIuaD4KKyNpbmNsdWRlIDxhc20vbW11X2NvbnRleHQuaD4KKworLyoKKyAqIFdBUk5JTkcKKyAqCisgKiBUaGlzIGZpbGUgaXMgY29tcGlsZWQgd2l0aCBjZXJ0YWluIC1mZml4ZWQtcmVnIG9wdGlvbnMuICBXZSBoYXZlIHRvCisgKiBtYWtlIHN1cmUgbm90IHRvIGNhbGwgYW55IGZ1bmN0aW9ucyBoZXJlIHRoYXQgY291bGQgY2xvYmJlciB0aGVzZQorICogcmVnaXN0ZXJzLgorICovCisKK2ludCBucl9kY3BsYl9taXNzW05SX0NQVVNdLCBucl9pY3BsYl9taXNzW05SX0NQVVNdOworaW50IG5yX2RjcGxiX3N1cHZfbWlzc1tOUl9DUFVTXSwgbnJfaWNwbGJfc3Vwdl9taXNzW05SX0NQVVNdOworaW50IG5yX2NwbGJfZmx1c2hbTlJfQ1BVU10sIG5yX2RjcGxiX3Byb3RbTlJfQ1BVU107CisKKyNpZmRlZiBDT05GSUdfRVhDUFRfSVJRX1NZU0NfTDEKKyNkZWZpbmUgTUdSX0FUVFIgX19hdHRyaWJ1dGVfXygobDFfdGV4dCkpCisjZWxzZQorI2RlZmluZSBNR1JfQVRUUgorI2VuZGlmCisKKy8qCisgKiBXZSdyZSBpbiBhbiBleGNlcHRpb24gaGFuZGxlci4gIFRoZSBub3JtYWwgY2xpIG5vcCBub3Agd29ya2Fyb3VuZAorICogaXNuJ3QgZ29pbmcgdG8gZG8gdmVyeSBtdWNoLCBhcyB0aGUgb25seSB0aGluZyB0aGF0IGNhbiBpbnRlcnJ1cHQKKyAqIHVzIGlzIGFuIE5NSSwgYW5kIHRoZSBjbGkgaXNuJ3QgZ29pbmcgdG8gc3RvcCB0aGF0LgorICovCisjZGVmaW5lIE5PV0FfU1NZTkMgX19hc21fXyBfX3ZvbGF0aWxlX18gKCJzc3luYzsiKQorCisvKiBBbm9tYWx5IGhhbmRsZXJzIHByb3ZpZGUgU1NZTkNzLCBzbyBhdm9pZCBleHRyYSBpZiBhbm9tYWx5IGlzIHByZXNlbnQgKi8KKyNpZiBBTk9NQUxZXzA1MDAwMTI1CisKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUVNX0NPTlRST0xfU1NZTkModikgICAgYmZpbl93cml0ZV9ETUVNX0NPTlRST0wodikKKyNkZWZpbmUgYmZpbl93cml0ZV9JTUVNX0NPTlRST0xfU1NZTkModikgICAgYmZpbl93cml0ZV9JTUVNX0NPTlRST0wodikKKworI2Vsc2UKKworI2RlZmluZSBiZmluX3dyaXRlX0RNRU1fQ09OVFJPTF9TU1lOQyh2KSBcCisgICAgZG8geyBOT1dBX1NTWU5DOyBiZmluX3dyaXRlX0RNRU1fQ09OVFJPTCh2KTsgTk9XQV9TU1lOQzsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9JTUVNX0NPTlRST0xfU1NZTkModikgXAorICAgIGRvIHsgTk9XQV9TU1lOQzsgYmZpbl93cml0ZV9JTUVNX0NPTlRST0wodik7IE5PV0FfU1NZTkM7IH0gd2hpbGUgKDApCisKKyNlbmRpZgorCitzdGF0aWMgaW5saW5lIHZvaWQgd3JpdGVfZGNwbGJfZGF0YShpbnQgY3B1LCBpbnQgaWR4LCB1bnNpZ25lZCBsb25nIGRhdGEsCisJCQkJICAgIHVuc2lnbmVkIGxvbmcgYWRkcikKK3sKKwl1bnNpZ25lZCBsb25nIGN0cmwgPSBiZmluX3JlYWRfRE1FTV9DT05UUk9MKCk7CisJYmZpbl93cml0ZV9ETUVNX0NPTlRST0xfU1NZTkMoY3RybCAmIH5FTkRDUExCKTsKKwliZmluX3dyaXRlMzIoRENQTEJfREFUQTAgKyBpZHggKiA0LCBkYXRhKTsKKwliZmluX3dyaXRlMzIoRENQTEJfQUREUjAgKyBpZHggKiA0LCBhZGRyKTsKKwliZmluX3dyaXRlX0RNRU1fQ09OVFJPTF9TU1lOQyhjdHJsKTsKKworI2lmZGVmIENPTkZJR19DUExCX0lORk8KKwlkY3BsYl90YmxbY3B1XVtpZHhdLmFkZHIgPSBhZGRyOworCWRjcGxiX3RibFtjcHVdW2lkeF0uZGF0YSA9IGRhdGE7CisjZW5kaWYKK30KKworc3RhdGljIGlubGluZSB2b2lkIHdyaXRlX2ljcGxiX2RhdGEoaW50IGNwdSwgaW50IGlkeCwgdW5zaWduZWQgbG9uZyBkYXRhLAorCQkJCSAgICB1bnNpZ25lZCBsb25nIGFkZHIpCit7CisJdW5zaWduZWQgbG9uZyBjdHJsID0gYmZpbl9yZWFkX0lNRU1fQ09OVFJPTCgpOworCisJYmZpbl93cml0ZV9JTUVNX0NPTlRST0xfU1NZTkMoY3RybCAmIH5FTklDUExCKTsKKwliZmluX3dyaXRlMzIoSUNQTEJfREFUQTAgKyBpZHggKiA0LCBkYXRhKTsKKwliZmluX3dyaXRlMzIoSUNQTEJfQUREUjAgKyBpZHggKiA0LCBhZGRyKTsKKwliZmluX3dyaXRlX0lNRU1fQ09OVFJPTF9TU1lOQyhjdHJsKTsKKworI2lmZGVmIENPTkZJR19DUExCX0lORk8KKwlpY3BsYl90YmxbY3B1XVtpZHhdLmFkZHIgPSBhZGRyOworCWljcGxiX3RibFtjcHVdW2lkeF0uZGF0YSA9IGRhdGE7CisjZW5kaWYKK30KKworLyoKKyAqIEdpdmVuIHRoZSBjb250ZW50cyBvZiB0aGUgc3RhdHVzIHJlZ2lzdGVyLCByZXR1cm4gdGhlIGluZGV4IG9mIHRoZQorICogQ1BMQiB0aGF0IGNhdXNlZCB0aGUgZmF1bHQuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGZhdWx0aW5nX2NwbGJfaW5kZXgoaW50IHN0YXR1cykKK3sKKwlpbnQgc2lnbmJpdHMgPSBfX2J1aWx0aW5fYmZpbl9ub3JtX2ZyMXgzMihzdGF0dXMgJiAweEZGRkYpOworCXJldHVybiAzMCAtIHNpZ25iaXRzOworfQorCisvKgorICogR2l2ZW4gdGhlIGNvbnRlbnRzIG9mIHRoZSBzdGF0dXMgcmVnaXN0ZXIgYW5kIHRoZSBEQ1BMQl9EQVRBIGNvbnRlbnRzLAorICogcmV0dXJuIHRydWUgaWYgYSB3cml0ZSBhY2Nlc3Mgc2hvdWxkIGJlIHBlcm1pdHRlZC4KKyAqLworc3RhdGljIGlubGluZSBpbnQgd3JpdGVfcGVybWl0dGVkKGludCBzdGF0dXMsIHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlpZiAoc3RhdHVzICYgRkFVTFRfVVNFUlNVUFYpCisJCXJldHVybiAhIShkYXRhICYgQ1BMQl9TVVBWX1dSKTsKKwllbHNlCisJCXJldHVybiAhIShkYXRhICYgQ1BMQl9VU0VSX1dSKTsKK30KKworLyogQ291bnRlcnMgdG8gaW1wbGVtZW50IHJvdW5kLXJvYmluIHJlcGxhY2VtZW50LiAgKi8KK3N0YXRpYyBpbnQgaWNwbGJfcnJfaW5kZXhbTlJfQ1BVU10gUERUX0FUVFI7CitzdGF0aWMgaW50IGRjcGxiX3JyX2luZGV4W05SX0NQVVNdIFBEVF9BVFRSOworCisvKgorICogRmluZCBhbiBJQ1BMQiBlbnRyeSB0byBiZSBldmljdGVkIGFuZCByZXR1cm4gaXRzIGluZGV4LgorICovCitzdGF0aWMgaW50IGV2aWN0X29uZV9pY3BsYihpbnQgY3B1KQoreworCWludCBpID0gZmlyc3Rfc3dpdGNoZWRfaWNwbGIgKyBpY3BsYl9ycl9pbmRleFtjcHVdOworCWlmIChpID49IE1BWF9DUExCUykgeworCQlpIC09IE1BWF9DUExCUyAtIGZpcnN0X3N3aXRjaGVkX2ljcGxiOworCQlpY3BsYl9ycl9pbmRleFtjcHVdIC09IE1BWF9DUExCUyAtIGZpcnN0X3N3aXRjaGVkX2ljcGxiOworCX0KKwlpY3BsYl9ycl9pbmRleFtjcHVdKys7CisJcmV0dXJuIGk7Cit9CisKK3N0YXRpYyBpbnQgZXZpY3Rfb25lX2RjcGxiKGludCBjcHUpCit7CisJaW50IGkgPSBmaXJzdF9zd2l0Y2hlZF9kY3BsYiArIGRjcGxiX3JyX2luZGV4W2NwdV07CisJaWYgKGkgPj0gTUFYX0NQTEJTKSB7CisJCWkgLT0gTUFYX0NQTEJTIC0gZmlyc3Rfc3dpdGNoZWRfZGNwbGI7CisJCWRjcGxiX3JyX2luZGV4W2NwdV0gLT0gTUFYX0NQTEJTIC0gZmlyc3Rfc3dpdGNoZWRfZGNwbGI7CisJfQorCWRjcGxiX3JyX2luZGV4W2NwdV0rKzsKKwlyZXR1cm4gaTsKK30KKworTUdSX0FUVFIgc3RhdGljIGludCBpY3BsYl9taXNzKGludCBjcHUpCit7CisJdW5zaWduZWQgbG9uZyBhZGRyID0gYmZpbl9yZWFkX0lDUExCX0ZBVUxUX0FERFIoKTsKKwlpbnQgc3RhdHVzID0gYmZpbl9yZWFkX0lDUExCX1NUQVRVUygpOworCWludCBpZHg7CisJdW5zaWduZWQgbG9uZyBpX2RhdGEsIGJhc2UsIGFkZHIxLCBlYWRkcjsKKworCW5yX2ljcGxiX21pc3NbY3B1XSsrOworCWlmICh1bmxpa2VseShzdGF0dXMgJiBGQVVMVF9VU0VSU1VQVikpCisJCW5yX2ljcGxiX3N1cHZfbWlzc1tjcHVdKys7CisKKwliYXNlID0gMDsKKwlmb3IgKGlkeCA9IDA7IGlkeCA8IGljcGxiX25yX2JvdW5kczsgaWR4KyspIHsKKwkJZWFkZHIgPSBpY3BsYl9ib3VuZHNbaWR4XS5lYWRkcjsKKwkJaWYgKGFkZHIgPCBlYWRkcikKKwkJCWJyZWFrOworCQliYXNlID0gZWFkZHI7CisJfQorCWlmICh1bmxpa2VseShpZHggPT0gaWNwbGJfbnJfYm91bmRzKSkKKwkJcmV0dXJuIENQTEJfTk9fQUREUl9NQVRDSDsKKworCWlfZGF0YSA9IGljcGxiX2JvdW5kc1tpZHhdLmRhdGE7CisJaWYgKHVubGlrZWx5KGlfZGF0YSA9PSAwKSkKKwkJcmV0dXJuIENQTEJfTk9fQUREUl9NQVRDSDsKKworCWFkZHIxID0gYWRkciAmIH4oU0laRV80TSAtIDEpOworCWFkZHIgJj0gfihTSVpFXzFNIC0gMSk7CisJaV9kYXRhIHw9IFBBR0VfU0laRV8xTUI7CisJaWYgKGFkZHIxID49IGJhc2UgJiYgKGFkZHIxICsgU0laRV80TSkgPD0gZWFkZHIpIHsKKwkJLyoKKwkJICogVGhpcyB3b3JrcyBiZWNhdXNlCisJCSAqIChQQUdFX1NJWkVfNE1CICYgUEFHRV9TSVpFXzFNQikgPT0gUEFHRV9TSVpFXzFNQi4KKwkJICovCisJCWlfZGF0YSB8PSBQQUdFX1NJWkVfNE1COworCQlhZGRyID0gYWRkcjE7CisJfQorCisJLyogUGljayBlbnRyeSB0byBldmljdCAqLworCWlkeCA9IGV2aWN0X29uZV9pY3BsYihjcHUpOworCisJd3JpdGVfaWNwbGJfZGF0YShjcHUsIGlkeCwgaV9kYXRhLCBhZGRyKTsKKworCXJldHVybiBDUExCX1JFTE9BREVEOworfQorCitNR1JfQVRUUiBzdGF0aWMgaW50IGRjcGxiX21pc3MoaW50IGNwdSkKK3sKKwl1bnNpZ25lZCBsb25nIGFkZHIgPSBiZmluX3JlYWRfRENQTEJfRkFVTFRfQUREUigpOworCWludCBzdGF0dXMgPSBiZmluX3JlYWRfRENQTEJfU1RBVFVTKCk7CisJaW50IGlkeDsKKwl1bnNpZ25lZCBsb25nIGRfZGF0YSwgYmFzZSwgYWRkcjEsIGVhZGRyOworCisJbnJfZGNwbGJfbWlzc1tjcHVdKys7CisJaWYgKHVubGlrZWx5KHN0YXR1cyAmIEZBVUxUX1VTRVJTVVBWKSkKKwkJbnJfZGNwbGJfc3Vwdl9taXNzW2NwdV0rKzsKKworCWJhc2UgPSAwOworCWZvciAoaWR4ID0gMDsgaWR4IDwgZGNwbGJfbnJfYm91bmRzOyBpZHgrKykgeworCQllYWRkciA9IGRjcGxiX2JvdW5kc1tpZHhdLmVhZGRyOworCQlpZiAoYWRkciA8IGVhZGRyKQorCQkJYnJlYWs7CisJCWJhc2UgPSBlYWRkcjsKKwl9CisJaWYgKHVubGlrZWx5KGlkeCA9PSBkY3BsYl9ucl9ib3VuZHMpKQorCQlyZXR1cm4gQ1BMQl9OT19BRERSX01BVENIOworCisJZF9kYXRhID0gZGNwbGJfYm91bmRzW2lkeF0uZGF0YTsKKwlpZiAodW5saWtlbHkoZF9kYXRhID09IDApKQorCQlyZXR1cm4gQ1BMQl9OT19BRERSX01BVENIOworCisJYWRkcjEgPSBhZGRyICYgfihTSVpFXzRNIC0gMSk7CisJYWRkciAmPSB+KFNJWkVfMU0gLSAxKTsKKwlkX2RhdGEgfD0gUEFHRV9TSVpFXzFNQjsKKwlpZiAoYWRkcjEgPj0gYmFzZSAmJiAoYWRkcjEgKyBTSVpFXzRNKSA8PSBlYWRkcikgeworCQkvKgorCQkgKiBUaGlzIHdvcmtzIGJlY2F1c2UKKwkJICogKFBBR0VfU0laRV80TUIgJiBQQUdFX1NJWkVfMU1CKSA9PSBQQUdFX1NJWkVfMU1CLgorCQkgKi8KKwkJZF9kYXRhIHw9IFBBR0VfU0laRV80TUI7CisJCWFkZHIgPSBhZGRyMTsKKwl9CisKKwkvKiBQaWNrIGVudHJ5IHRvIGV2aWN0ICovCisJaWR4ID0gZXZpY3Rfb25lX2RjcGxiKGNwdSk7CisKKwl3cml0ZV9kY3BsYl9kYXRhKGNwdSwgaWR4LCBkX2RhdGEsIGFkZHIpOworCisJcmV0dXJuIENQTEJfUkVMT0FERUQ7Cit9CisKK01HUl9BVFRSIHN0YXRpYyBub2lubGluZSBpbnQgZGNwbGJfcHJvdGVjdGlvbl9mYXVsdChpbnQgY3B1KQoreworCWludCBzdGF0dXMgPSBiZmluX3JlYWRfRENQTEJfU1RBVFVTKCk7CisKKwlucl9kY3BsYl9wcm90W2NwdV0rKzsKKworCWlmIChsaWtlbHkoc3RhdHVzICYgRkFVTFRfUlcpKSB7CisJCWludCBpZHggPSBmYXVsdGluZ19jcGxiX2luZGV4KHN0YXR1cyk7CisJCXVuc2lnbmVkIGxvbmcgcmVnYWRkciA9IERDUExCX0RBVEEwICsgaWR4ICogNDsKKwkJdW5zaWduZWQgbG9uZyBkYXRhID0gYmZpbl9yZWFkMzIocmVnYWRkcik7CisKKwkJLyogQ2hlY2sgaWYgZmF1bHQgaXMgdG8gZGlydHkgYSBjbGVhbiBwYWdlICovCisJCWlmICghKGRhdGEgJiBDUExCX1dUKSAmJiAhKGRhdGEgJiBDUExCX0RJUlRZKSAmJgorCQkgICAgd3JpdGVfcGVybWl0dGVkKHN0YXR1cywgZGF0YSkpIHsKKworCQkJZGNwbGJfdGJsW2NwdV1baWR4XS5kYXRhID0gZGF0YTsKKwkJCWJmaW5fd3JpdGUzMihyZWdhZGRyLCBkYXRhKTsKKwkJCXJldHVybiBDUExCX1JFTE9BREVEOworCQl9CisJfQorCisJcmV0dXJuIENQTEJfUFJPVF9WSU9MOworfQorCitNR1JfQVRUUiBpbnQgY3BsYl9oZHIoaW50IHNlcXN0YXQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWludCBjYXVzZSA9IHNlcXN0YXQgJiAweDNmOworCXVuc2lnbmVkIGludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisJc3dpdGNoIChjYXVzZSkgeworCWNhc2UgMHgyQzoKKwkJcmV0dXJuIGljcGxiX21pc3MoY3B1KTsKKwljYXNlIDB4MjY6CisJCXJldHVybiBkY3BsYl9taXNzKGNwdSk7CisJZGVmYXVsdDoKKwkJaWYgKHVubGlrZWx5KGNhdXNlID09IDB4MjMpKQorCQkJcmV0dXJuIGRjcGxiX3Byb3RlY3Rpb25fZmF1bHQoY3B1KTsKKworCQlyZXR1cm4gQ1BMQl9VTktOT1dOX0VSUjsKKwl9Cit9CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2tlcm5lbC9jcGxiaW5mby5jIGIvYXJjaC9ibGFja2Zpbi9rZXJuZWwvY3BsYmluZm8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NGQ3ODMwCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9ibGFja2Zpbi9rZXJuZWwvY3BsYmluZm8uYwpAQCAtMCwwICsxLDE3NyBAQAorLyoKKyAqIGFyY2gvYmxhY2tmaW4va2VybmVsL2NwbGJpbmZvLmMgLSBkaXNwbGF5IENQTEIgc3RhdHVzCisgKgorICogQ29weXJpZ2h0IDIwMDQtMjAwOCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKworI2luY2x1ZGUgPGFzbS9jcGxiaW5pdC5oPgorI2luY2x1ZGUgPGFzbS9ibGFja2Zpbi5oPgorCitzdGF0aWMgY2hhciBjb25zdCBwYWdlX3N0cnRibFtdWzNdID0geyAiMUsiLCAiNEsiLCAiMU0iLCAiNE0iIH07CisjZGVmaW5lIHBhZ2UoZmxhZ3MpICAgICgoKGZsYWdzKSAmIDB4MzAwMDApID4+IDE2KQorI2RlZmluZSBzdHJwYWdlKGZsYWdzKSBwYWdlX3N0cnRibFtwYWdlKGZsYWdzKV0KKworc3RydWN0IGNwbGJpbmZvX2RhdGEgeworCWxvZmZfdCBwb3M7CisJY2hhciBjcGxiX3R5cGU7CisJdTMyIG1lbV9jb250cm9sOworCXN0cnVjdCBjcGxiX2VudHJ5ICp0Ymw7CisJaW50IHN3aXRjaGVkOworfTsKKworc3RhdGljIHZvaWQgY3BsYmluZm9fcHJpbnRfaGVhZGVyKHN0cnVjdCBzZXFfZmlsZSAqbSkKK3sKKwlzZXFfcHJpbnRmKG0sICJJbmRleFx0QWRkcmVzc1x0XHREYXRhXHRTaXplXHRVL1JEXHRVL1dSXHRTL1dSXHRTd2l0Y2hcbiIpOworfQorCitzdGF0aWMgaW50IGNwbGJpbmZvX25vbW9yZShzdHJ1Y3QgY3BsYmluZm9fZGF0YSAqY2RhdGEpCit7CisJcmV0dXJuIGNkYXRhLT5wb3MgPj0gTUFYX0NQTEJTOworfQorCitzdGF0aWMgaW50IGNwbGJpbmZvX3Nob3coc3RydWN0IHNlcV9maWxlICptLCB2b2lkICpwKQoreworCXN0cnVjdCBjcGxiaW5mb19kYXRhICpjZGF0YTsKKwl1bnNpZ25lZCBsb25nIGRhdGEsIGFkZHI7CisJbG9mZl90IHBvczsKKworCWNkYXRhID0gcDsKKwlwb3MgPSBjZGF0YS0+cG9zOworCWFkZHIgPSBjZGF0YS0+dGJsW3Bvc10uYWRkcjsKKwlkYXRhID0gY2RhdGEtPnRibFtwb3NdLmRhdGE7CisKKwlzZXFfcHJpbnRmKG0sCisJCSIlZFx0MHglMDhseFx0JTA1bHhcdCVzXHQlY1x0JWNcdCVjXHQlY1xuIiwKKwkJKGludClwb3MsIGFkZHIsIGRhdGEsIHN0cnBhZ2UoZGF0YSksCisJCShkYXRhICYgQ1BMQl9VU0VSX1JEKSA/ICdZJyA6ICdOJywKKwkJKGRhdGEgJiBDUExCX1VTRVJfV1IpID8gJ1knIDogJ04nLAorCQkoZGF0YSAmIENQTEJfU1VQVl9XUikgPyAnWScgOiAnTicsCisJCXBvcyA8IGNkYXRhLT5zd2l0Y2hlZCA/ICdOJyA6ICdZJyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgY3BsYmluZm9fc2VxX2luaXQoc3RydWN0IGNwbGJpbmZvX2RhdGEgKmNkYXRhLCB1bnNpZ25lZCBpbnQgY3B1KQoreworCWlmIChjZGF0YS0+Y3BsYl90eXBlID09ICdJJykgeworCQljZGF0YS0+bWVtX2NvbnRyb2wgPSBiZmluX3JlYWRfSU1FTV9DT05UUk9MKCk7CisJCWNkYXRhLT50YmwgPSBpY3BsYl90YmxbY3B1XTsKKwkJY2RhdGEtPnN3aXRjaGVkID0gZmlyc3Rfc3dpdGNoZWRfaWNwbGI7CisJfSBlbHNlIHsKKwkJY2RhdGEtPm1lbV9jb250cm9sID0gYmZpbl9yZWFkX0RNRU1fQ09OVFJPTCgpOworCQljZGF0YS0+dGJsID0gZGNwbGJfdGJsW2NwdV07CisJCWNkYXRhLT5zd2l0Y2hlZCA9IGZpcnN0X3N3aXRjaGVkX2RjcGxiOworCX0KK30KKworc3RhdGljIHZvaWQgKmNwbGJpbmZvX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqbSwgbG9mZl90ICpwb3MpCit7CisJc3RydWN0IGNwbGJpbmZvX2RhdGEgKmNkYXRhID0gbS0+cHJpdmF0ZTsKKworCWlmICghKnBvcykgeworCQlzZXFfcHJpbnRmKG0sICIlY0NQTEJzIGFyZSAlc2FibGVkOiAweCV4XG4iLCBjZGF0YS0+Y3BsYl90eXBlLAorCQkJKGNkYXRhLT5tZW1fY29udHJvbCAmIEVORENQTEIgPyAiZW4iIDogImRpcyIpLAorCQkJY2RhdGEtPm1lbV9jb250cm9sKTsKKwkJY3BsYmluZm9fcHJpbnRfaGVhZGVyKG0pOworCX0gZWxzZSBpZiAoY3BsYmluZm9fbm9tb3JlKGNkYXRhKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlnZXRfY3B1KCk7CisJcmV0dXJuIGNkYXRhOworfQorCitzdGF0aWMgdm9pZCAqY3BsYmluZm9fbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnAsIGxvZmZfdCAqcG9zKQoreworCXN0cnVjdCBjcGxiaW5mb19kYXRhICpjZGF0YSA9IHA7CisJY2RhdGEtPnBvcyA9ICsrKCpwb3MpOworCWlmIChjcGxiaW5mb19ub21vcmUoY2RhdGEpKQorCQlyZXR1cm4gTlVMTDsKKwllbHNlCisJCXJldHVybiBjZGF0YTsKK30KKworc3RhdGljIHZvaWQgY3BsYmluZm9fc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnApCit7CisJcHV0X2NwdSgpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHNlcV9vcGVyYXRpb25zIGNwbGJpbmZvX3NvcHMgPSB7CisJLnN0YXJ0ID0gY3BsYmluZm9fc3RhcnQsCisJLm5leHQgID0gY3BsYmluZm9fbmV4dCwKKwkuc3RvcCAgPSBjcGxiaW5mb19zdG9wLAorCS5zaG93ICA9IGNwbGJpbmZvX3Nob3csCit9OworCitzdGF0aWMgaW50IGNwbGJpbmZvX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJY2hhciBidWZbMjU2XSwgKnBhdGgsICpwOworCXVuc2lnbmVkIGludCBjcHU7CisJY2hhciAqc19jcHUsICpzX2NwbGI7CisJaW50IHJldDsKKwlzdHJ1Y3Qgc2VxX2ZpbGUgKm07CisJc3RydWN0IGNwbGJpbmZvX2RhdGEgKmNkYXRhOworCisJcGF0aCA9IGRfcGF0aCgmZmlsZS0+Zl9wYXRoLCBidWYsIHNpemVvZihidWYpKTsKKwlpZiAoSVNfRVJSKHBhdGgpKQorCQlyZXR1cm4gUFRSX0VSUihwYXRoKTsKKwlzX2NwdSA9IHN0cnN0cihwYXRoLCAiL2NwdSIpOworCXNfY3BsYiA9IHN0cnJjaHIocGF0aCwgJy8nKTsKKwlpZiAoIXNfY3B1IHx8ICFzX2NwbGIpCisJCXJldHVybiAtRUlOVkFMOworCisJY3B1ID0gc2ltcGxlX3N0cnRvdWwoc19jcHUgKyA0LCAmcCwgMTApOworCWlmICghY3B1X29ubGluZShjcHUpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXJldCA9IHNlcV9vcGVuX3ByaXZhdGUoZmlsZSwgJmNwbGJpbmZvX3NvcHMsIHNpemVvZigqY2RhdGEpKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCW0gPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJY2RhdGEgPSBtLT5wcml2YXRlOworCisJY2RhdGEtPnBvcyA9IDA7CisJY2RhdGEtPmNwbGJfdHlwZSA9IHRvdXBwZXIoc19jcGxiWzFdKTsKKwljcGxiaW5mb19zZXFfaW5pdChjZGF0YSwgY3B1KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBjcGxiaW5mb19mb3BzID0geworCS5vcGVuICAgID0gY3BsYmluZm9fb3BlbiwKKwkucmVhZCAgICA9IHNlcV9yZWFkLAorCS5sbHNlZWsgID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlID0gc2VxX3JlbGVhc2VfcHJpdmF0ZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGNwbGJpbmZvX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmNwbGJfZGlyLCAqY3B1X2RpcjsKKwljaGFyIGJ1ZlsxMF07CisJdW5zaWduZWQgaW50IGNwdTsKKworCWNwbGJfZGlyID0gcHJvY19ta2RpcigiY3BsYmluZm8iLCBOVUxMKTsKKwlpZiAoIWNwbGJfZGlyKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpIHsKKwkJc3ByaW50ZihidWYsICJjcHUlaSIsIGNwdSk7CisJCWNwdV9kaXIgPSBwcm9jX21rZGlyKGJ1ZiwgY3BsYl9kaXIpOworCQlpZiAoIWNwdV9kaXIpCisJCQlyZXR1cm4gLUVOT01FTTsKKworCQlwcm9jX2NyZWF0ZSgiaWNwbGIiLCBTX0lSVUdPLCBjcHVfZGlyLCAmY3BsYmluZm9fZm9wcyk7CisJCXByb2NfY3JlYXRlKCJkY3BsYiIsIFNfSVJVR08sIGNwdV9kaXIsICZjcGxiaW5mb19mb3BzKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KK2xhdGVfaW5pdGNhbGwoY3BsYmluZm9faW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2tlcm5lbC9lYXJseV9wcmludGsuYyBiL2FyY2gvYmxhY2tmaW4va2VybmVsL2Vhcmx5X3ByaW50ay5jCmluZGV4IDFmNGUzZDIuLmM4YWQwNTEgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4va2VybmVsL2Vhcmx5X3ByaW50ay5jCisrKyBiL2FyY2gvYmxhY2tmaW4va2VybmVsL2Vhcmx5X3ByaW50ay5jCkBAIC0xMDUsMTAgKzEwNSwxMCBAQAogCQljZmxhZyB8PSBDUzU7CiAJCWJyZWFrOwogCWNhc2UgNjoKLQkJY2ZsYWcgfD0gQ1M1OworCQljZmxhZyB8PSBDUzY7CiAJCWJyZWFrOwogCWNhc2UgNzoKLQkJY2ZsYWcgfD0gQ1M1OworCQljZmxhZyB8PSBDUzc7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCWNmbGFnIHw9IENTODsKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4va2VybmVsL2VudHJ5LlMgYi9hcmNoL2JsYWNrZmluL2tlcm5lbC9lbnRyeS5TCmluZGV4IGZhZWE4OGUuLmE5Y2ZiYTkgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4va2VybmVsL2VudHJ5LlMKKysrIGIvYXJjaC9ibGFja2Zpbi9rZXJuZWwvZW50cnkuUwpAQCAtMzAsNiArMzAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KICNpbmNsdWRlIDxhc20vdGhyZWFkX2luZm8uaD4KICNpbmNsdWRlIDxhc20vZXJybm8uaD4KKyNpbmNsdWRlIDxhc20vYmxhY2tmaW4uaD4KICNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KIAogI2luY2x1ZGUgPGFzbS9jb250ZXh0LlM+CkBAIC00MSw2ICs0MiwxMCBAQAogI2VuZGlmCiAKIEVOVFJZKF9yZXRfZnJvbV9mb3JrKQorI2lmZGVmIENPTkZJR19JUElQRQorCVstLXNwXSA9IHJldGk7IAkJLyogSVJRcyBvbi4gKi8KKwlTUCArPSA0OworI2VuZGlmIC8qIENPTkZJR19JUElQRSAqLwogCVNQICs9IC0xMjsKIAljYWxsIF9zY2hlZHVsZV90YWlsOwogCVNQICs9IDEyOwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwvZml4ZWRfY29kZS5TIGIvYXJjaC9ibGFja2Zpbi9rZXJuZWwvZml4ZWRfY29kZS5TCmluZGV4IDRiMDNiYTAuLjBkMmQ5ZTAgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4va2VybmVsL2ZpeGVkX2NvZGUuUworKysgYi9hcmNoL2JsYWNrZmluL2tlcm5lbC9maXhlZF9jb2RlLlMKQEAgLTgsMTAgKzgsMTIgQEAKICAqIEJGNTYxIFNNUCkuCiAgKi8KICNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3VuaXN0ZC5oPgogI2luY2x1ZGUgPGFzbS9lbnRyeS5oPgogCi0udGV4dAorX19JTklUCisKIEVOVFJZKF9maXhlZF9jb2RlX3N0YXJ0KQogCiAuYWxpZ24gMTYKQEAgLTE0NCwzICsxNDYsNSBAQAogRU5EUFJPQyhfc2FmZV91c2VyX2luc3RydWN0aW9uKQogCiBFTlRSWShfZml4ZWRfY29kZV9lbmQpCisKK19fRklOSVQKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4va2VybmVsL2lwaXBlLmMgYi9hcmNoL2JsYWNrZmluL2tlcm5lbC9pcGlwZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzOWJlNWEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2JsYWNrZmluL2tlcm5lbC9pcGlwZS5jCkBAIC0wLDAgKzEsNDI4IEBACisvKiAtKi0gbGludXgtYyAtKi0KKyAqIGxpbnV4L2FyY2gvYmxhY2tmaW4va2VybmVsL2lwaXBlLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwNyBQaGlsaXBwZSBHZXJ1bS4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlIE1BIDAyMTM5LAorICogVVNBOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorICogdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIEFyY2hpdGVjdHVyZS1kZXBlbmRlbnQgSS1waXBlIHN1cHBvcnQgZm9yIHRoZSBCbGFja2Zpbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9wZXJjcHUuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CisjaW5jbHVkZSA8YXNtL3VuaXN0ZC5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vYXRvbWljLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKK3N0YXRpYyBpbnQgY3JlYXRlX2lycV90aHJlYWRzOworCitERUZJTkVfUEVSX0NQVShzdHJ1Y3QgcHRfcmVncywgX19pcGlwZV90aWNrX3JlZ3MpOworCitzdGF0aWMgREVGSU5FX1BFUl9DUFUodW5zaWduZWQgbG9uZywgcGVuZGluZ19pcnF0aHJlYWRfbWFzayk7CisKK3N0YXRpYyBERUZJTkVfUEVSX0NQVShpbnQgW0lWRzEzICsgMV0sIHBlbmRpbmdfaXJxX2NvdW50KTsKKworYXNtbGlua2FnZSB2b2lkIGFzbV9kb19JUlEodW5zaWduZWQgaW50IGlycSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworCitzdGF0aWMgdm9pZCBfX2lwaXBlX25vX2lycXRhaWwodm9pZCk7CisKK3Vuc2lnbmVkIGxvbmcgX19pcGlwZV9pcnFfdGFpbF9ob29rID0gKHVuc2lnbmVkIGxvbmcpJl9faXBpcGVfbm9faXJxdGFpbDsKK0VYUE9SVF9TWU1CT0woX19pcGlwZV9pcnFfdGFpbF9ob29rKTsKKwordW5zaWduZWQgbG9uZyBfX2lwaXBlX2NvcmVfY2xvY2s7CitFWFBPUlRfU1lNQk9MKF9faXBpcGVfY29yZV9jbG9jayk7CisKK3Vuc2lnbmVkIGxvbmcgX19pcGlwZV9mcmVxX3NjYWxlOworRVhQT1JUX1NZTUJPTChfX2lwaXBlX2ZyZXFfc2NhbGUpOworCithdG9taWNfdCBfX2lwaXBlX2lycV9sdmRlcHRoW0lWRzE1ICsgMV07CisKK3Vuc2lnbmVkIGxvbmcgX19pcGlwZV9pcnFfbHZtYXNrID0gX19hbGxfbWFza2VkX2lycV9mbGFnczsKK0VYUE9SVF9TWU1CT0woX19pcGlwZV9pcnFfbHZtYXNrKTsKKworc3RhdGljIHZvaWQgX19pcGlwZV9hY2tfaXJxKHVuc2lnbmVkIGlycSwgc3RydWN0IGlycV9kZXNjICpkZXNjKQoreworCWRlc2MtPmlwaXBlX2FjayhpcnEsIGRlc2MpOworfQorCisvKgorICogX19pcGlwZV9lbmFibGVfcGlwZWxpbmUoKSAtLSBXZSBhcmUgcnVubmluZyBvbiB0aGUgYm9vdCBDUFUsIGh3CisgKiBpbnRlcnJ1cHRzIGFyZSBvZmYsIGFuZCBzZWNvbmRhcnkgQ1BVcyBhcmUgc3RpbGwgbG9zdCBpbiBzcGFjZS4KKyAqLwordm9pZCBfX2lwaXBlX2VuYWJsZV9waXBlbGluZSh2b2lkKQoreworCXVuc2lnbmVkIGlycTsKKworCV9faXBpcGVfY29yZV9jbG9jayA9IGdldF9jY2xrKCk7IC8qIEZldGNoIHRoaXMgb25jZS4gKi8KKwlfX2lwaXBlX2ZyZXFfc2NhbGUgPSAxMDAwMDAwMDAwVUwgLyBfX2lwaXBlX2NvcmVfY2xvY2s7CisKKwlmb3IgKGlycSA9IDA7IGlycSA8IE5SX0lSUVM7ICsraXJxKQorCQlpcGlwZV92aXJ0dWFsaXplX2lycShpcGlwZV9yb290X2RvbWFpbiwKKwkJCQkgICAgIGlycSwKKwkJCQkgICAgIChpcGlwZV9pcnFfaGFuZGxlcl90KSZhc21fZG9fSVJRLAorCQkJCSAgICAgTlVMTCwKKwkJCQkgICAgICZfX2lwaXBlX2Fja19pcnEsCisJCQkJICAgICBJUElQRV9IQU5ETEVfTUFTSyB8IElQSVBFX1BBU1NfTUFTSyk7Cit9CisKKy8qCisgKiBfX2lwaXBlX2hhbmRsZV9pcnEoKSAtLSBJUElQRSdzIGdlbmVyaWMgSVJRIGhhbmRsZXIuIEFuIG9wdGltaXN0aWMKKyAqIGludGVycnVwdCBwcm90ZWN0aW9uIGxvZyBpcyBtYWludGFpbmVkIGhlcmUgZm9yIGVhY2ggZG9tYWluLiBIdworICogaW50ZXJydXB0cyBhcmUgbWFza2VkIG9uIGVudHJ5LgorICovCit2b2lkIF9faXBpcGVfaGFuZGxlX2lycSh1bnNpZ25lZCBpcnEsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBpcGlwZV9kb21haW4gKnRoaXNfZG9tYWluLCAqbmV4dF9kb21haW47CisJc3RydWN0IGxpc3RfaGVhZCAqaGVhZCwgKnBvczsKKwlpbnQgbV9hY2ssIHMgPSAtMTsKKworCS8qCisJICogU29mdHdhcmUtdHJpZ2dlcmVkIElSUXMgZG8gbm90IG5lZWQgYW55IGFjay4gIFRoZSBjb250ZW50cworCSAqIG9mIHRoZSByZWdpc3RlciBmcmFtZSBzaG91bGQgb25seSBiZSB1c2VkIHdoZW4gcHJvY2Vzc2luZworCSAqIHRoZSB0aW1lciBpbnRlcnJ1cHQsIGJ1dCBub3QgZm9yIGhhbmRsaW5nIGFueSBvdGhlcgorCSAqIGludGVycnVwdC4KKwkgKi8KKwltX2FjayA9IChyZWdzID09IE5VTEwgfHwgaXJxID09IElSUV9TWVNUTVIgfHwgaXJxID09IElSUV9DT1JFVE1SKTsKKworCXRoaXNfZG9tYWluID0gaXBpcGVfY3VycmVudF9kb21haW47CisKKwlpZiAodW5saWtlbHkodGVzdF9iaXQoSVBJUEVfU1RJQ0tZX0ZMQUcsICZ0aGlzX2RvbWFpbi0+aXJxc1tpcnFdLmNvbnRyb2wpKSkKKwkJaGVhZCA9ICZ0aGlzX2RvbWFpbi0+cF9saW5rOworCWVsc2UgeworCQloZWFkID0gX19pcGlwZV9waXBlbGluZS5uZXh0OworCQluZXh0X2RvbWFpbiA9IGxpc3RfZW50cnkoaGVhZCwgc3RydWN0IGlwaXBlX2RvbWFpbiwgcF9saW5rKTsKKwkJaWYgKGxpa2VseSh0ZXN0X2JpdChJUElQRV9XSVJFRF9GTEFHLCAmbmV4dF9kb21haW4tPmlycXNbaXJxXS5jb250cm9sKSkpIHsKKwkJCWlmICghbV9hY2sgJiYgbmV4dF9kb21haW4tPmlycXNbaXJxXS5hY2tub3dsZWRnZSAhPSBOVUxMKQorCQkJCW5leHRfZG9tYWluLT5pcnFzW2lycV0uYWNrbm93bGVkZ2UoaXJxLCBpcnFfZGVzYyArIGlycSk7CisJCQlpZiAodGVzdF9iaXQoSVBJUEVfUk9PVExPQ0tfRkxBRywgJmlwaXBlX3Jvb3RfZG9tYWluLT5mbGFncykpCisJCQkJcyA9IF9fdGVzdF9hbmRfc2V0X2JpdChJUElQRV9TVEFMTF9GTEFHLAorCQkJCQkJICAgICAgICZpcGlwZV9yb290X2NwdWRvbV92YXIoc3RhdHVzKSk7CisJCQlfX2lwaXBlX2Rpc3BhdGNoX3dpcmVkKG5leHRfZG9tYWluLCBpcnEpOworCQkJCWdvdG8gZmluYWxpemU7CisJCQlyZXR1cm47CisJCX0KKwl9CisKKwkvKiBBY2sgdGhlIGludGVycnVwdC4gKi8KKworCXBvcyA9IGhlYWQ7CisKKwl3aGlsZSAocG9zICE9ICZfX2lwaXBlX3BpcGVsaW5lKSB7CisJCW5leHRfZG9tYWluID0gbGlzdF9lbnRyeShwb3MsIHN0cnVjdCBpcGlwZV9kb21haW4sIHBfbGluayk7CisJCS8qCisJCSAqIEZvciBlYWNoIGRvbWFpbiBoYW5kbGluZyB0aGUgaW5jb21pbmcgSVJRLCBtYXJrIGl0CisJCSAqIGFzIHBlbmRpbmcgaW4gaXRzIGxvZy4KKwkJICovCisJCWlmICh0ZXN0X2JpdChJUElQRV9IQU5ETEVfRkxBRywgJm5leHRfZG9tYWluLT5pcnFzW2lycV0uY29udHJvbCkpIHsKKwkJCS8qCisJCQkgKiBEb21haW5zIHRoYXQgaGFuZGxlIHRoaXMgSVJRIGFyZSBwb2xsZWQgZm9yCisJCQkgKiBhY2tub3dsZWRnaW5nIGl0IGJ5IGRlY3JlYXNpbmcgcHJpb3JpdHkKKwkJCSAqIG9yZGVyLiBUaGUgaW50ZXJydXB0IG11c3QgYmUgbWFkZSBwZW5kaW5nCisJCQkgKiBfZmlyc3RfIGluIHRoZSBkb21haW4ncyBzdGF0dXMgZmxhZ3MgYmVmb3JlCisJCQkgKiB0aGUgUElDIGlzIHVubG9ja2VkLgorCQkJICovCisJCQlfX2lwaXBlX3NldF9pcnFfcGVuZGluZyhuZXh0X2RvbWFpbiwgaXJxKTsKKworCQkJaWYgKCFtX2FjayAmJiBuZXh0X2RvbWFpbi0+aXJxc1tpcnFdLmFja25vd2xlZGdlICE9IE5VTEwpIHsKKwkJCQluZXh0X2RvbWFpbi0+aXJxc1tpcnFdLmFja25vd2xlZGdlKGlycSwgaXJxX2Rlc2MgKyBpcnEpOworCQkJCW1fYWNrID0gMTsKKwkJCX0KKwkJfQorCisJCS8qCisJCSAqIElmIHRoZSBkb21haW4gZG9lcyBub3Qgd2FudCB0aGUgSVJRIHRvIGJlIHBhc3NlZAorCQkgKiBkb3duIHRoZSBpbnRlcnJ1cHQgcGlwZSwgZXhpdCB0aGUgbG9vcCBub3cuCisJCSAqLworCQlpZiAoIXRlc3RfYml0KElQSVBFX1BBU1NfRkxBRywgJm5leHRfZG9tYWluLT5pcnFzW2lycV0uY29udHJvbCkpCisJCQlicmVhazsKKworCQlwb3MgPSBuZXh0X2RvbWFpbi0+cF9saW5rLm5leHQ7CisJfQorCisJLyoKKwkgKiBOb3cgd2FsayB0aGUgcGlwZWxpbmUsIHlpZWxkaW5nIGNvbnRyb2wgdG8gdGhlIGhpZ2hlc3QKKwkgKiBwcmlvcml0eSBkb21haW4gdGhhdCBoYXMgcGVuZGluZyBpbnRlcnJ1cHQocykgb3IKKwkgKiBpbW1lZGlhdGVseSB0byB0aGUgY3VycmVudCBkb21haW4gaWYgdGhlIGludGVycnVwdCBoYXMgYmVlbgorCSAqIG1hcmtlZCBhcyAnc3RpY2t5Jy4gVGhpcyBzZWFyY2ggZG9lcyBub3QgZ28gYmV5b25kIHRoZQorCSAqIGN1cnJlbnQgZG9tYWluIGluIHRoZSBwaXBlbGluZS4gV2UgYWxzbyBlbmZvcmNlIHRoZQorCSAqIGFkZGl0aW9uYWwgcm9vdCBzdGFnZSBsb2NrIChibGFja2Zpbi1zcGVjaWZpYykuICovCisKKwlpZiAodGVzdF9iaXQoSVBJUEVfUk9PVExPQ0tfRkxBRywgJmlwaXBlX3Jvb3RfZG9tYWluLT5mbGFncykpCisJCXMgPSBfX3Rlc3RfYW5kX3NldF9iaXQoSVBJUEVfU1RBTExfRkxBRywKKwkJCQkgICAgICAgJmlwaXBlX3Jvb3RfY3B1ZG9tX3ZhcihzdGF0dXMpKTsKK2ZpbmFsaXplOgorCisJX19pcGlwZV93YWxrX3BpcGVsaW5lKGhlYWQpOworCisJaWYgKCFzKQorCQlfX2NsZWFyX2JpdChJUElQRV9TVEFMTF9GTEFHLAorCQkJICAgICZpcGlwZV9yb290X2NwdWRvbV92YXIoc3RhdHVzKSk7Cit9CisKK2ludCBfX2lwaXBlX2NoZWNrX3Jvb3Qodm9pZCkKK3sKKwlyZXR1cm4gaXBpcGVfcm9vdF9kb21haW5fcDsKK30KKwordm9pZCBfX2lwaXBlX2VuYWJsZV9pcnFkZXNjKHN0cnVjdCBpcGlwZV9kb21haW4gKmlwZCwgdW5zaWduZWQgaXJxKQoreworCXN0cnVjdCBpcnFfZGVzYyAqZGVzYyA9IGlycV9kZXNjICsgaXJxOworCWludCBwcmlvID0gZGVzYy0+aWNfcHJpbzsKKworCWRlc2MtPmRlcHRoID0gMDsKKwlpZiAoaXBkICE9ICZpcGlwZV9yb290ICYmCisJICAgIGF0b21pY19pbmNfcmV0dXJuKCZfX2lwaXBlX2lycV9sdmRlcHRoW3ByaW9dKSA9PSAxKQorCQlfX3NldF9iaXQocHJpbywgJl9faXBpcGVfaXJxX2x2bWFzayk7Cit9CitFWFBPUlRfU1lNQk9MKF9faXBpcGVfZW5hYmxlX2lycWRlc2MpOworCit2b2lkIF9faXBpcGVfZGlzYWJsZV9pcnFkZXNjKHN0cnVjdCBpcGlwZV9kb21haW4gKmlwZCwgdW5zaWduZWQgaXJxKQoreworCXN0cnVjdCBpcnFfZGVzYyAqZGVzYyA9IGlycV9kZXNjICsgaXJxOworCWludCBwcmlvID0gZGVzYy0+aWNfcHJpbzsKKworCWlmIChpcGQgIT0gJmlwaXBlX3Jvb3QgJiYKKwkgICAgYXRvbWljX2RlY19hbmRfdGVzdCgmX19pcGlwZV9pcnFfbHZkZXB0aFtwcmlvXSkpCisJCV9fY2xlYXJfYml0KHByaW8sICZfX2lwaXBlX2lycV9sdm1hc2spOworfQorRVhQT1JUX1NZTUJPTChfX2lwaXBlX2Rpc2FibGVfaXJxZGVzYyk7CisKK3ZvaWQgX19pcGlwZV9zdGFsbF9yb290X3Jhdyh2b2lkKQoreworCS8qCisJICogVGhpcyBjb2RlIGlzIGNhbGxlZCBieSB0aGUgaW5ze2J3bH0gcm91dGluZXMgKHNlZQorCSAqIGFyY2gvYmxhY2tmaW4vbGliL2lucy5TKSwgd2hpY2ggYXJlIGhlYXZpbHkgdXNlZCBieSB0aGUKKwkgKiBuZXR3b3JrIHN0YWNrLiBJdCBtYXNrcyBhbGwgaW50ZXJydXB0cyBidXQgdGhvc2UgaGFuZGxlZCBieQorCSAqIG5vbi1yb290IGRvbWFpbnMsIHNvIHRoYXQgd2Uga2VlcCBkZWNlbnQgbmV0d29yayB0cmFuc2ZlcgorCSAqIHJhdGVzIGZvciBMaW51eCB3aXRob3V0IGluZHVjaW5nIHBhdGhvbG9naWNhbCBqaXR0ZXIgZm9yCisJICogdGhlIHJlYWwtdGltZSBkb21haW4uCisJICovCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJzdGkgJTA7IiA6IDogImQiKF9faXBpcGVfaXJxX2x2bWFzaykpOworCisJX19zZXRfYml0KElQSVBFX1NUQUxMX0ZMQUcsCisJCSAgJmlwaXBlX3Jvb3RfY3B1ZG9tX3ZhcihzdGF0dXMpKTsKK30KKwordm9pZCBfX2lwaXBlX3Vuc3RhbGxfcm9vdF9yYXcodm9pZCkKK3sKKwlfX2NsZWFyX2JpdChJUElQRV9TVEFMTF9GTEFHLAorCQkgICAgJmlwaXBlX3Jvb3RfY3B1ZG9tX3ZhcihzdGF0dXMpKTsKKworCV9fYXNtX18gX192b2xhdGlsZV9fICgic3RpICUwOyIgOiA6ICJkIihiZmluX2lycV9mbGFncykpOworfQorCitpbnQgX19pcGlwZV9zeXNjYWxsX3Jvb3Qoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qIFdlIG5lZWQgdG8gcnVuIHRoZSBJUlEgdGFpbCBob29rIHdoZW5ldmVyIHdlIGRvbid0CisJICogcHJvcGFnYXRlIGEgc3lzY2FsbCB0byBoaWdoZXIgZG9tYWlucywgYmVjYXVzZSB3ZSBrbm93IHRoYXQKKwkgKiBpbXBvcnRhbnQgb3BlcmF0aW9ucyBtaWdodCBiZSBwZW5kaW5nIHRoZXJlIChlLmcuIFhlbm9tYWkKKwkgKiBkZWZlcnJlZCByZXNjaGVkdWxpbmcpLiAqLworCisJaWYgKCFfX2lwaXBlX3N5c2NhbGxfd2F0Y2hlZF9wKGN1cnJlbnQsIHJlZ3MtPm9yaWdfcDApKSB7CisJCXZvaWQgKCpob29rKSh2b2lkKSA9ICh2b2lkICgqKSh2b2lkKSlfX2lwaXBlX2lycV90YWlsX2hvb2s7CisJCWhvb2soKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyoKKwkgKiBUaGlzIHJvdXRpbmUgZWl0aGVyIHJldHVybnM6CisJICogMCAtLSBpZiB0aGUgc3lzY2FsbCBpcyB0byBiZSBwYXNzZWQgdG8gTGludXg7CisJICogMSAtLSBpZiB0aGUgc3lzY2FsbCBzaG91bGQgbm90IGJlIHBhc3NlZCB0byBMaW51eCwgYW5kIG5vCisJICogdGFpbCB3b3JrIHNob3VsZCBiZSBwZXJmb3JtZWQ7CisJICogLTEgLS0gaWYgdGhlIHN5c2NhbGwgc2hvdWxkIG5vdCBiZSBwYXNzZWQgdG8gTGludXggYnV0IHRoZQorCSAqIHRhaWwgd29yayBoYXMgdG8gYmUgcGVyZm9ybWVkIChmb3IgaGFuZGxpbmcgc2lnbmFscyBldGMpLgorCSAqLworCisJaWYgKF9faXBpcGVfZXZlbnRfbW9uaXRvcmVkX3AoSVBJUEVfRVZFTlRfU1lTQ0FMTCkgJiYKKwkgICAgX19pcGlwZV9kaXNwYXRjaF9ldmVudChJUElQRV9FVkVOVF9TWVNDQUxMLCByZWdzKSA+IDApIHsKKwkJaWYgKGlwaXBlX3Jvb3RfZG9tYWluX3AgJiYgIWluX2F0b21pYygpKSB7CisJCQkvKgorCQkJICogU3luYyBwZW5kaW5nIFZJUlFzIGJlZm9yZSBfVElGX05FRURfUkVTQ0hFRAorCQkJICogaXMgdGVzdGVkLgorCQkJICovCisJCQlsb2NhbF9pcnFfc2F2ZV9odyhmbGFncyk7CisJCQlpZiAoKGlwaXBlX3Jvb3RfY3B1ZG9tX3ZhcihpcnFwZW5kX2hpbWFzaykgJiBJUElQRV9JUlFNQVNLX1ZJUlQpICE9IDApCisJCQkJX19pcGlwZV9zeW5jX3BpcGVsaW5lKElQSVBFX0lSUU1BU0tfVklSVCk7CisJCQlsb2NhbF9pcnFfcmVzdG9yZV9odyhmbGFncyk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJcmV0dXJuIDE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3Vuc2lnbmVkIGxvbmcgaXBpcGVfY3JpdGljYWxfZW50ZXIodm9pZCAoKnN5bmNmbikgKHZvaWQpKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlsb2NhbF9pcnFfc2F2ZV9odyhmbGFncyk7CisKKwlyZXR1cm4gZmxhZ3M7Cit9CisKK3ZvaWQgaXBpcGVfY3JpdGljYWxfZXhpdCh1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCWxvY2FsX2lycV9yZXN0b3JlX2h3KGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgX19pcGlwZV9ub19pcnF0YWlsKHZvaWQpCit7Cit9CisKK2ludCBpcGlwZV9nZXRfc3lzaW5mbyhzdHJ1Y3QgaXBpcGVfc3lzaW5mbyAqaW5mbykKK3sKKwlpbmZvLT5uY3B1cyA9IG51bV9vbmxpbmVfY3B1cygpOworCWluZm8tPmNwdWZyZXEgPSBpcGlwZV9jcHVfZnJlcSgpOworCWluZm8tPmFyY2hkZXAudG1pcnEgPSBJUElQRV9USU1FUl9JUlE7CisJaW5mby0+YXJjaGRlcC50bWZyZXEgPSBpbmZvLT5jcHVmcmVxOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBpcGlwZV90cmlnZ2VyX2lycSgpIC0tIFB1c2ggdGhlIGludGVycnVwdCBhdCBmcm9udCBvZiB0aGUgcGlwZWxpbmUKKyAqIGp1c3QgbGlrZSBpZiBpdCBoYXMgYmVlbiBhY3R1YWxseSByZWNlaXZlZCBmcm9tIGEgaHcgc291cmNlLiBBbHNvCisgKiB3b3JrcyBmb3IgdmlydHVhbCBpbnRlcnJ1cHRzLgorICovCitpbnQgaXBpcGVfdHJpZ2dlcl9pcnEodW5zaWduZWQgaXJxKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoaXJxID49IElQSVBFX05SX0lSUVMgfHwKKwkgICAgKGlwaXBlX3ZpcnR1YWxfaXJxX3AoaXJxKQorCSAgICAgJiYgIXRlc3RfYml0KGlycSAtIElQSVBFX1ZJUlFfQkFTRSwgJl9faXBpcGVfdmlydHVhbF9pcnFfbWFwKSkpCisJCXJldHVybiAtRUlOVkFMOworCisJbG9jYWxfaXJxX3NhdmVfaHcoZmxhZ3MpOworCisJX19pcGlwZV9oYW5kbGVfaXJxKGlycSwgTlVMTCk7CisKKwlsb2NhbF9pcnFfcmVzdG9yZV9odyhmbGFncyk7CisKKwlyZXR1cm4gMTsKK30KKworLyogTW92ZSBMaW51eCBJUlEgdG8gdGhyZWFkcy4gKi8KKworc3RhdGljIGludCBkb19pcnFkKHZvaWQgKl9fZGVzYykKK3sKKwlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MgPSBfX2Rlc2M7CisJdW5zaWduZWQgaXJxID0gZGVzYyAtIGlycV9kZXNjOworCWludCB0aHJwcmlvID0gZGVzYy0+dGhyX3ByaW87CisJaW50IHRocm1hc2sgPSAxIDw8IHRocnByaW87CisJaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKwljcHVtYXNrX3QgY3B1bWFzazsKKworCXNpZ2ZpbGxzZXQoJmN1cnJlbnQtPmJsb2NrZWQpOworCWN1cnJlbnQtPmZsYWdzIHw9IFBGX05PRlJFRVpFOworCWNwdW1hc2sgPSBjcHVtYXNrX29mX2NwdShjcHUpOworCXNldF9jcHVzX2FsbG93ZWQoY3VycmVudCwgY3B1bWFzayk7CisJaXBpcGVfc2V0c2NoZWR1bGVyX3Jvb3QoY3VycmVudCwgU0NIRURfRklGTywgNTAgKyB0aHJwcmlvKTsKKworCXdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpKSB7CisJCWxvY2FsX2lycV9kaXNhYmxlKCk7CisJCWlmICghKGRlc2MtPnN0YXR1cyAmIElSUV9TQ0hFRFVMRUQpKSB7CisJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworcmVzY2hlZDoKKwkJCWxvY2FsX2lycV9lbmFibGUoKTsKKwkJCXNjaGVkdWxlKCk7CisJCQlsb2NhbF9pcnFfZGlzYWJsZSgpOworCQl9CisJCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwkJLyoKKwkJICogSWYgaGlnaGVyIHByaW9yaXR5IGludGVycnVwdCBzZXJ2ZXJzIGFyZSByZWFkeSB0bworCQkgKiBydW4sIHJlc2NoZWR1bGUgaW1tZWRpYXRlbHkuIFdlIG5lZWQgdGhpcyBmb3IgdGhlCisJCSAqIEdQSU8gZGVtdXggSVJRIGhhbmRsZXIgdG8gdW5tYXNrIHRoZSBpbnRlcnJ1cHQgbGluZQorCQkgKiBfbGFzdF8sIGFmdGVyIGFsbCBHUElPIElSUXMgaGF2ZSBydW4uCisJCSAqLworCQlpZiAocGVyX2NwdShwZW5kaW5nX2lycXRocmVhZF9tYXNrLCBjcHUpICYgfih0aHJtYXNrfCh0aHJtYXNrLTEpKSkKKwkJCWdvdG8gcmVzY2hlZDsKKwkJaWYgKC0tcGVyX2NwdShwZW5kaW5nX2lycV9jb3VudFt0aHJwcmlvXSwgY3B1KSA9PSAwKQorCQkJcGVyX2NwdShwZW5kaW5nX2lycXRocmVhZF9tYXNrLCBjcHUpICY9IH50aHJtYXNrOworCQlkZXNjLT5zdGF0dXMgJj0gfklSUV9TQ0hFRFVMRUQ7CisJCWRlc2MtPnRocl9oYW5kbGVyKGlycSwgJl9fcmF3X2dldF9jcHVfdmFyKF9faXBpcGVfdGlja19yZWdzKSk7CisJCWxvY2FsX2lycV9lbmFibGUoKTsKKwl9CisJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBraWNrX2lycWQodW5zaWduZWQgaXJxLCB2b2lkICpjb29raWUpCit7CisJc3RydWN0IGlycV9kZXNjICpkZXNjID0gaXJxX2Rlc2MgKyBpcnE7CisJaW50IHRocnByaW8gPSBkZXNjLT50aHJfcHJpbzsKKwlpbnQgdGhybWFzayA9IDEgPDwgdGhycHJpbzsKKwlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCisJaWYgKCEoZGVzYy0+c3RhdHVzICYgSVJRX1NDSEVEVUxFRCkpIHsKKwkJZGVzYy0+c3RhdHVzIHw9IElSUV9TQ0hFRFVMRUQ7CisJCXBlcl9jcHUocGVuZGluZ19pcnF0aHJlYWRfbWFzaywgY3B1KSB8PSB0aHJtYXNrOworCQkrK3Blcl9jcHUocGVuZGluZ19pcnFfY291bnRbdGhycHJpb10sIGNwdSk7CisJCXdha2VfdXBfcHJvY2VzcyhkZXNjLT50aHJlYWQpOworCX0KK30KKworaW50IGlwaXBlX3N0YXJ0X2lycV90aHJlYWQodW5zaWduZWQgaXJxLCBzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpCit7CisJaWYgKGRlc2MtPnRocmVhZCB8fCAhY3JlYXRlX2lycV90aHJlYWRzKQorCQlyZXR1cm4gMDsKKworCWRlc2MtPnRocmVhZCA9IGt0aHJlYWRfY3JlYXRlKGRvX2lycWQsIGRlc2MsICJJUlEgJWQiLCBpcnEpOworCWlmIChkZXNjLT50aHJlYWQgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgImlycWQ6IGNvdWxkIG5vdCBjcmVhdGUgSVJRIHRocmVhZCAlZCFcbiIsIGlycSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXdha2VfdXBfcHJvY2VzcyhkZXNjLT50aHJlYWQpOworCisJZGVzYy0+dGhyX2hhbmRsZXIgPSBpcGlwZV9yb290X2RvbWFpbi0+aXJxc1tpcnFdLmhhbmRsZXI7CisJaXBpcGVfcm9vdF9kb21haW4tPmlycXNbaXJxXS5oYW5kbGVyID0gJmtpY2tfaXJxZDsKKworCXJldHVybiAwOworfQorCit2b2lkIF9faW5pdCBpcGlwZV9pbml0X2lycV90aHJlYWRzKHZvaWQpCit7CisJdW5zaWduZWQgaXJxOworCXN0cnVjdCBpcnFfZGVzYyAqZGVzYzsKKworCWNyZWF0ZV9pcnFfdGhyZWFkcyA9IDE7CisKKwlmb3IgKGlycSA9IDA7IGlycSA8IE5SX0lSUVM7IGlycSsrKSB7CisJCWRlc2MgPSBpcnFfZGVzYyArIGlycTsKKwkJaWYgKGRlc2MtPmFjdGlvbiAhPSBOVUxMIHx8CisJCQkoZGVzYy0+c3RhdHVzICYgSVJRX05PUkVRVUVTVCkgIT0gMCkKKwkJCWlwaXBlX3N0YXJ0X2lycV90aHJlYWQoaXJxLCBkZXNjKTsKKwl9Cit9CisKK0VYUE9SVF9TWU1CT0woc2hvd19zdGFjayk7CisKKyNpZmRlZiBDT05GSUdfSVBJUEVfVFJBQ0VfTUNPVU5UCit2b2lkIG5vdHJhY2UgX21jb3VudCh2b2lkKTsKK0VYUE9SVF9TWU1CT0woX21jb3VudCk7CisjZW5kaWYgLyogQ09ORklHX0lQSVBFX1RSQUNFX01DT1VOVCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwvaXJxY2hpcC5jIGIvYXJjaC9ibGFja2Zpbi9rZXJuZWwvaXJxY2hpcC5jCmluZGV4IDA3NDAyZjUuLmFiODIwOWMgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4va2VybmVsL2lycWNoaXAuYworKysgYi9hcmNoL2JsYWNrZmluL2tlcm5lbC9pcnFjaGlwLmMKQEAgLTM2LDcgKzM2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KICNpbmNsdWRlIDxhc20vdHJhY2UuaD4KIAotc3RhdGljIHVuc2lnbmVkIGxvbmcgaXJxX2Vycl9jb3VudDsKK3N0YXRpYyBhdG9taWNfdCBpcnFfZXJyX2NvdW50Owogc3RhdGljIHNwaW5sb2NrX3QgaXJxX2NvbnRyb2xsZXJfbG9jazsKIAogLyoKQEAgLTQ4LDEwICs0OCw5IEBACiAKIHZvaWQgYWNrX2JhZF9pcnEodW5zaWduZWQgaW50IGlycSkKIHsKLQlpcnFfZXJyX2NvdW50ICs9IDE7CisJYXRvbWljX2luYygmaXJxX2Vycl9jb3VudCk7CiAJcHJpbnRrKEtFUk5fRVJSICJJUlE6IHNwdXJpb3VzIGludGVycnVwdCAlZFxuIiwgaXJxKTsKIH0KLUVYUE9SVF9TWU1CT0woYWNrX2JhZF9pcnEpOwogCiBzdGF0aWMgc3RydWN0IGlycV9jaGlwIGJhZF9jaGlwID0gewogCS5hY2sgPSBkdW1teV9tYXNrX3VubWFza19pcnEsCkBAIC03Miw3ICs3MSw3IEBACiAKIGludCBzaG93X2ludGVycnVwdHMoc3RydWN0IHNlcV9maWxlICpwLCB2b2lkICp2KQogewotCWludCBpID0gKihsb2ZmX3QgKikgdjsKKwlpbnQgaSA9ICoobG9mZl90ICopIHYsIGo7CiAJc3RydWN0IGlycWFjdGlvbiAqYWN0aW9uOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKQEAgLTgwLDE5ICs3OSwyMCBAQAogCQlzcGluX2xvY2tfaXJxc2F2ZSgmaXJxX2Rlc2NbaV0ubG9jaywgZmxhZ3MpOwogCQlhY3Rpb24gPSBpcnFfZGVzY1tpXS5hY3Rpb247CiAJCWlmICghYWN0aW9uKQotCQkJZ290byB1bmxvY2s7Ci0KLQkJc2VxX3ByaW50ZihwLCAiJTNkOiAlMTB1ICIsIGksIGtzdGF0X2lycXMoaSkpOworCQkJZ290byBza2lwOworCQlzZXFfcHJpbnRmKHAsICIlM2Q6ICIsIGkpOworCQlmb3JfZWFjaF9vbmxpbmVfY3B1KGopCisJCQlzZXFfcHJpbnRmKHAsICIlMTB1ICIsIGtzdGF0X2NwdShqKS5pcnFzW2ldKTsKKwkJc2VxX3ByaW50ZihwLCAiICU4cyIsIGlycV9kZXNjW2ldLmNoaXAtPm5hbWUpOwogCQlzZXFfcHJpbnRmKHAsICIgICVzIiwgYWN0aW9uLT5uYW1lKTsKIAkJZm9yIChhY3Rpb24gPSBhY3Rpb24tPm5leHQ7IGFjdGlvbjsgYWN0aW9uID0gYWN0aW9uLT5uZXh0KQotCQkJc2VxX3ByaW50ZihwLCAiLCAlcyIsIGFjdGlvbi0+bmFtZSk7CisJCQlzZXFfcHJpbnRmKHAsICIgICVzIiwgYWN0aW9uLT5uYW1lKTsKIAogCQlzZXFfcHV0YyhwLCAnXG4nKTsKLSB1bmxvY2s6Cisgc2tpcDoKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXJxX2Rlc2NbaV0ubG9jaywgZmxhZ3MpOwotCX0gZWxzZSBpZiAoaSA9PSBOUl9JUlFTKSB7Ci0JCXNlcV9wcmludGYocCwgIkVycjogJTEwbHVcbiIsIGlycV9lcnJfY291bnQpOwotCX0KKwl9IGVsc2UgaWYgKGkgPT0gTlJfSVJRUykKKwkJc2VxX3ByaW50ZihwLCAiRXJyOiAlMTB1XG4iLCAgYXRvbWljX3JlYWQoJmlycV9lcnJfY291bnQpKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTAxLDcgKzEwMSw2IEBACiAgKiBjb21lIHZpYSB0aGlzIGZ1bmN0aW9uLiAgSW5zdGVhZCwgdGhleSBzaG91bGQgcHJvdmlkZSB0aGVpcgogICogb3duICdoYW5kbGVyJwogICovCi0KICNpZmRlZiBDT05GSUdfRE9fSVJRX0wxCiBfX2F0dHJpYnV0ZV9fKChsMV90ZXh0KSkKICNlbmRpZgpAQCAtMTA5LDggKzEwOCw5IEBACiB7CiAJc3RydWN0IHB0X3JlZ3MgKm9sZF9yZWdzOwogCXN0cnVjdCBpcnFfZGVzYyAqZGVzYyA9IGlycV9kZXNjICsgaXJxOworI2lmbmRlZiBDT05GSUdfSVBJUEUKIAl1bnNpZ25lZCBzaG9ydCBwZW5kaW5nLCBvdGhlcl9pbnRzOwotCisjZW5kaWYKIAlvbGRfcmVncyA9IHNldF9pcnFfcmVncyhyZWdzKTsKIAogCS8qCkBAIC0xMjEsOSArMTIxLDI0IEBACiAJCWRlc2MgPSAmYmFkX2lycV9kZXNjOwogCiAJaXJxX2VudGVyKCk7CisjaWZkZWYgQ09ORklHX0RFQlVHX1NUQUNLT1ZFUkZMT1cKKwkvKiBEZWJ1Z2dpbmcgY2hlY2sgZm9yIHN0YWNrIG92ZXJmbG93OiBpcyB0aGVyZSBsZXNzIHRoYW4gU1RBQ0tfV0FSTiBmcmVlPyAqLworCXsKKwkJbG9uZyBzcDsKIAorCQlzcCA9IF9fZ2V0X1NQKCkgJiAoVEhSRUFEX1NJWkUtMSk7CisKKwkJaWYgKHVubGlrZWx5KHNwIDwgKHNpemVvZihzdHJ1Y3QgdGhyZWFkX2luZm8pICsgU1RBQ0tfV0FSTikpKSB7CisJCQlkdW1wX3N0YWNrKCk7CisJCQlwcmludGsoS0VSTl9FTUVSRyAiJXM6IHBvc3NpYmxlIHN0YWNrIG92ZXJmbG93IHdoaWxlIGhhbmRsaW5nIGlycSAlaSAiCisJCQkJCSIgb25seSAlbGQgYnl0ZXMgZnJlZVxuIiwKKwkJCQlfX2Z1bmNfXywgaXJxLCBzcCAtIHNpemVvZihzdHJ1Y3QgdGhyZWFkX2luZm8pKTsKKwkJfQorCX0KKyNlbmRpZgogCWdlbmVyaWNfaGFuZGxlX2lycShpcnEpOwogCisjaWZuZGVmIENPTkZJR19JUElQRQkvKiBVc2VsZXNzIGFuZCBidWdvdXMgb3ZlciB0aGUgSS1waXBlOiBJUlFzIGFyZSB0aHJlYWRlZC4gKi8KIAkvKiBJZiB3ZSdyZSB0aGUgb25seSBpbnRlcnJ1cHQgcnVubmluZyAoaWdub3JpbmcgSVJRMTUgd2hpY2ggaXMgZm9yCiAJICAgc3lzY2FsbHMpLCBsb3dlciBvdXIgcHJpb3JpdHkgdG8gSVJRMTQgc28gdGhhdCBzb2Z0aXJxcyBydW4gYXQKIAkgICB0aGF0IGxldmVsLiAgSWYgdGhlcmUncyBhbm90aGVyLCBsb3dlci1sZXZlbCBpbnRlcnJ1cHQsIGlycV9leGl0CkBAIC0xMzMsNiArMTQ4LDcgQEAKIAlvdGhlcl9pbnRzID0gcGVuZGluZyAmIChwZW5kaW5nIC0gMSk7CiAJaWYgKG90aGVyX2ludHMgPT0gMCkKIAkJbG93ZXJfdG9faXJxMTQoKTsKKyNlbmRpZiAvKiAhQ09ORklHX0lQSVBFICovCiAJaXJxX2V4aXQoKTsKIAogCXNldF9pcnFfcmVncyhvbGRfcmVncyk7CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2tlcm5lbC9rZ2RiLmMgYi9hcmNoL2JsYWNrZmluL2tlcm5lbC9rZ2RiLmMKaW5kZXggYjc5NWEyMC4uYjE2M2Y2ZCAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwva2dkYi5jCisrKyBiL2FyY2gvYmxhY2tmaW4va2VybmVsL2tnZGIuYwpAQCAtMzQsOSArMzQsMTQgQEAKICNlcnJvciBjaGFuZ2UgdGhlIGRlZmluaXRpb24gb2Ygc2xhdmVjcHVsb2NrcwogI2VuZGlmCiAKLSNpZmRlZiBDT05GSUdfQkZJTl9XRFQKLSMgZXJyb3IgIlBsZWFzZSB1bnNlbGVjdCBibGFja2ZpbiB3YXRjaGRvZyBkcml2ZXIgYmVmb3JlIGJ1aWxkIEtHREIuIgotI2VuZGlmCisjZGVmaW5lIElOX01FTShhZGRyLCBzaXplLCBsMV9hZGRyLCBsMV9zaXplKSBcCisoeyBcCisJdW5zaWduZWQgbG9uZyBfX2FkZHIgPSAodW5zaWduZWQgbG9uZykoYWRkcik7IFwKKwkobDFfc2l6ZSAmJiBfX2FkZHIgPj0gbDFfYWRkciAmJiBfX2FkZHIgKyAoc2l6ZSkgPD0gbDFfYWRkciArIGwxX3NpemUpOyBcCit9KQorI2RlZmluZSBBU1lOQ19CQU5LX1NJWkUgXAorCShBU1lOQ19CQU5LMF9TSVpFICsgQVNZTkNfQkFOSzFfU0laRSArIFwKKwkgQVNZTkNfQkFOSzJfU0laRSArIEFTWU5DX0JBTkszX1NJWkUpCiAKIHZvaWQgcHRfcmVnc190b19nZGJfcmVncyh1bnNpZ25lZCBsb25nICpnZGJfcmVncywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CkBAIC0xMDUsNyArMTEwLDcgQEAKICAqIEV4dHJhY3RzIGVicCwgZXNwIGFuZCBlaXAgdmFsdWVzIHVuZGVyc3RhbmRhYmxlIGJ5IGdkYiBmcm9tIHRoZSB2YWx1ZXMKICAqIHNhdmVkIGJ5IHN3aXRjaF90by4KICAqIHRocmVhZC5lc3AgcG9pbnRzIHRvIGVicC4gZmxhZ3MgYW5kIGVicCBhcmUgcHVzaGVkIGluIHN3aXRjaF90byBoZW5jZSBlc3AKLSAqIHByaW9yIHRvIGVudGVyaW5nIHN3aXRjaF90byBpcyA4IGdyZWF0ZXIgdGhlbiB0aGUgdmFsdWUgdGhhdCBpcyBzYXZlZC4KKyAqIHByaW9yIHRvIGVudGVyaW5nIHN3aXRjaF90byBpcyA4IGdyZWF0ZXIgdGhhbiB0aGUgdmFsdWUgdGhhdCBpcyBzYXZlZC4KICAqIElmIHN3aXRjaF90byBjaGFuZ2VzLCBjaGFuZ2UgZm9sbG93aW5nIGNvZGUgYXBwcm9wcmlhdGVseS4KICAqLwogdm9pZCBzbGVlcGluZ190aHJlYWRfdG9fZ2RiX3JlZ3ModW5zaWduZWQgbG9uZyAqZ2RiX3JlZ3MsIHN0cnVjdCB0YXNrX3N0cnVjdCAqcCkKQEAgLTIxOSw2ICsyMjQsNyBAQAogCQlpZiAoYmZpbl90eXBlID09IGJyZWFraW5mb1ticmVha25vXS50eXBlCiAJCQkmJiAhYnJlYWtpbmZvW2JyZWFrbm9dLm9jY3VwaWVkKSB7CiAJCQlicmVha2luZm9bYnJlYWtub10ub2NjdXBpZWQgPSAxOworCQkJYnJlYWtpbmZvW2JyZWFrbm9dLnNraXAgPSAwOwogCQkJYnJlYWtpbmZvW2JyZWFrbm9dLmVuYWJsZWQgPSAxOwogCQkJYnJlYWtpbmZvW2JyZWFrbm9dLmFkZHIgPSBhZGRyOwogCQkJYnJlYWtpbmZvW2JyZWFrbm9dLmRhdGFhY2MgPSBkYXRhYWNjOwpAQCAtMzYzLDEyICszNjksMTIgQEAKIAogdm9pZCBrZ2RiX3JvdW5kdXBfY3B1cyh1bnNpZ25lZCBsb25nIGZsYWdzKQogewotCXNtcF9jYWxsX2Z1bmN0aW9uKGtnZGJfcGFzc2l2ZV9jcHVfY2FsbGJhY2ssIE5VTEwsIDAsIDApOworCXNtcF9jYWxsX2Z1bmN0aW9uKGtnZGJfcGFzc2l2ZV9jcHVfY2FsbGJhY2ssIE5VTEwsIDApOwogfQogCiB2b2lkIGtnZGJfcm91bmR1cF9jcHUoaW50IGNwdSwgdW5zaWduZWQgbG9uZyBmbGFncykKIHsKLQlzbXBfY2FsbF9mdW5jdGlvbl9zaW5nbGUoY3B1LCBrZ2RiX3Bhc3NpdmVfY3B1X2NhbGxiYWNrLCBOVUxMLCAwLCAwKTsKKwlzbXBfY2FsbF9mdW5jdGlvbl9zaW5nbGUoY3B1LCBrZ2RiX3Bhc3NpdmVfY3B1X2NhbGxiYWNrLCBOVUxMLCAwKTsKIH0KICNlbmRpZgogCkBAIC0zODUsMTAgKzM5MSw4IEBACiAJCQkgICAgICAgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJbG9uZyBhZGRyOwotCWxvbmcgYnJlYWtubzsKIAljaGFyICpwdHI7CiAJaW50IG5ld1BDOwotCWludCB3cF9zdGF0dXM7CiAJaW50IGk7CiAKIAlzd2l0Y2ggKHJlbWNvbV9pbl9idWZmZXJbMF0pIHsKQEAgLTQyNiwxNyArNDMwLDYgQEAKIAkJCWtnZGJfc2luZ2xlX3N0ZXAgPSBpICsgMTsKIAkJfQogCi0JCWlmICh2ZWN0b3IgPT0gVkVDX1dBVENIKSB7Ci0JCQl3cF9zdGF0dXMgPSBiZmluX3JlYWRfV1BTVEFUKCk7Ci0JCQlmb3IgKGJyZWFrbm8gPSAwOyBicmVha25vIDwgSFdfV0FUQ0hQT0lOVF9OVU07IGJyZWFrbm8rKykgewotCQkJCWlmICh3cF9zdGF0dXMgJiAoMSA8PCBicmVha25vKSkgewotCQkJCQlicmVha2luZm8tPnNraXAgPSAxOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQliZmluX3dyaXRlX1dQU1RBVCgwKTsKLQkJfQotCiAJCWJmaW5fY29ycmVjdF9od19icmVhaygpOwogCiAJCXJldHVybiAwOwpAQCAtNDc4LDU3ICs0NzEsMzIgQEAKIAkJcmV0dXJuIDA7CiAJaWYgKGFkZHIgPj0gU1lTTU1SX0JBU0UpCiAJCXJldHVybiAwOwotCWlmIChhZGRyID49IEFTWU5DX0JBTkswX0JBU0UKLQkgICAmJiBhZGRyICsgc2l6ZSA8PSBBU1lOQ19CQU5LM19CQVNFICsgQVNZTkNfQkFOSzNfU0laRSkKKwlpZiAoSU5fTUVNKGFkZHIsIHNpemUsIEFTWU5DX0JBTkswX0JBU0UsIEFTWU5DX0JBTktfU0laRSkpCiAJCXJldHVybiAwOwogCWlmIChjcHUgPT0gMCkgewotCQlpZiAoYWRkciA+PSBMMV9TQ1JBVENIX1NUQVJUCi0JCSAgICYmIChhZGRyICsgc2l6ZSA8PSBMMV9TQ1JBVENIX1NUQVJUICsgTDFfU0NSQVRDSF9MRU5HVEgpKQorCQlpZiAoSU5fTUVNKGFkZHIsIHNpemUsIEwxX1NDUkFUQ0hfU1RBUlQsIEwxX1NDUkFUQ0hfTEVOR1RIKSkKIAkJCXJldHVybiAwOwotI2lmIEwxX0NPREVfTEVOR1RIICE9IDAKLQkJaWYgKGFkZHIgPj0gTDFfQ09ERV9TVEFSVAotCQkgICAmJiAoYWRkciArIHNpemUgPD0gTDFfQ09ERV9TVEFSVCArIEwxX0NPREVfTEVOR1RIKSkKKwkJaWYgKElOX01FTShhZGRyLCBzaXplLCBMMV9DT0RFX1NUQVJULCBMMV9DT0RFX0xFTkdUSCkpCiAJCQlyZXR1cm4gMDsKLSNlbmRpZgotI2lmIEwxX0RBVEFfQV9MRU5HVEggIT0gMAotCQlpZiAoYWRkciA+PSBMMV9EQVRBX0FfU1RBUlQKLQkJICAgJiYgKGFkZHIgKyBzaXplIDw9IEwxX0RBVEFfQV9TVEFSVCArIEwxX0RBVEFfQV9MRU5HVEgpKQorCQlpZiAoSU5fTUVNKGFkZHIsIHNpemUsIEwxX0RBVEFfQV9TVEFSVCwgTDFfREFUQV9BX0xFTkdUSCkpCiAJCQlyZXR1cm4gMDsKLSNlbmRpZgotI2lmIEwxX0RBVEFfQl9MRU5HVEggIT0gMAotCQlpZiAoYWRkciA+PSBMMV9EQVRBX0JfU1RBUlQKLQkJICAgJiYgKGFkZHIgKyBzaXplIDw9IEwxX0RBVEFfQl9TVEFSVCArIEwxX0RBVEFfQl9MRU5HVEgpKQorCQlpZiAoSU5fTUVNKGFkZHIsIHNpemUsIEwxX0RBVEFfQl9TVEFSVCwgTDFfREFUQV9CX0xFTkdUSCkpCiAJCQlyZXR1cm4gMDsKLSNlbmRpZgogI2lmZGVmIENPTkZJR19TTVAKIAl9IGVsc2UgaWYgKGNwdSA9PSAxKSB7Ci0JCWlmIChhZGRyID49IENPUkVCX0wxX1NDUkFUQ0hfU1RBUlQKLQkJICAgJiYgKGFkZHIgKyBzaXplIDw9IENPUkVCX0wxX1NDUkFUQ0hfU1RBUlQKLQkJICAgKyBMMV9TQ1JBVENIX0xFTkdUSCkpCisJCWlmIChJTl9NRU0oYWRkciwgc2l6ZSwgQ09SRUJfTDFfU0NSQVRDSF9TVEFSVCwgTDFfU0NSQVRDSF9MRU5HVEgpKQogCQkJcmV0dXJuIDA7Ci0jIGlmIEwxX0NPREVfTEVOR1RIICE9IDAKLQkJaWYgKGFkZHIgPj0gQ09SRUJfTDFfQ09ERV9TVEFSVAotCQkgICAmJiAoYWRkciArIHNpemUgPD0gQ09SRUJfTDFfQ09ERV9TVEFSVCArIEwxX0NPREVfTEVOR1RIKSkKKwkJaWYgKElOX01FTShhZGRyLCBzaXplLCBDT1JFQl9MMV9DT0RFX1NUQVJULCBMMV9DT0RFX0xFTkdUSCkpCiAJCQlyZXR1cm4gMDsKLSMgZW5kaWYKLSMgaWYgTDFfREFUQV9BX0xFTkdUSCAhPSAwCi0JCWlmIChhZGRyID49IENPUkVCX0wxX0RBVEFfQV9TVEFSVAotCQkgICAmJiAoYWRkciArIHNpemUgPD0gQ09SRUJfTDFfREFUQV9BX1NUQVJUICsgTDFfREFUQV9BX0xFTkdUSCkpCisJCWlmIChJTl9NRU0oYWRkciwgc2l6ZSwgQ09SRUJfTDFfREFUQV9BX1NUQVJULCBMMV9EQVRBX0FfTEVOR1RIKSkKIAkJCXJldHVybiAwOwotIyBlbmRpZgotIyBpZiBMMV9EQVRBX0JfTEVOR1RIICE9IDAKLQkJaWYgKGFkZHIgPj0gQ09SRUJfTDFfREFUQV9CX1NUQVJUCi0JCSAgICYmIChhZGRyICsgc2l6ZSA8PSBDT1JFQl9MMV9EQVRBX0JfU1RBUlQgKyBMMV9EQVRBX0JfTEVOR1RIKSkKKwkJaWYgKElOX01FTShhZGRyLCBzaXplLCBDT1JFQl9MMV9EQVRBX0JfU1RBUlQsIEwxX0RBVEFfQl9MRU5HVEgpKQogCQkJcmV0dXJuIDA7Ci0jIGVuZGlmCiAjZW5kaWYKIAl9CiAKLSNpZiBMMl9MRU5HVEggIT0gMAotCWlmIChhZGRyID49IEwyX1NUQVJUCi0JICAgJiYgYWRkciArIHNpemUgPD0gTDJfU1RBUlQgKyBMMl9MRU5HVEgpCisJaWYgKElOX01FTShhZGRyLCBzaXplLCBMMl9TVEFSVCwgTDJfTEVOR1RIKSkKIAkJcmV0dXJuIDA7Ci0jZW5kaWYKIAogCXJldHVybiBFRkFVTFQ7CiB9CkBAIC01ODIsMTIgKzU1MCw5IEBACiAJCWRlZmF1bHQ6CiAJCQllcnIgPSBFRkFVTFQ7CiAJCX0KLQl9IGVsc2UgaWYgKGNwdSA9PSAwICYmICh1bnNpZ25lZCBpbnQpbWVtID49IEwxX0NPREVfU1RBUlQgJiYKLQkJKHVuc2lnbmVkIGludCkobWVtICsgY291bnQpIDw9IEwxX0NPREVfU1RBUlQgKyBMMV9DT0RFX0xFTkdUSAorCX0gZWxzZSBpZiAoKGNwdSA9PSAwICYmIElOX01FTShtZW0sIGNvdW50LCBMMV9DT0RFX1NUQVJULCBMMV9DT0RFX0xFTkdUSCkpCiAjaWZkZWYgQ09ORklHX1NNUAotCQl8fCBjcHUgPT0gMSAmJiAodW5zaWduZWQgaW50KW1lbSA+PSBDT1JFQl9MMV9DT0RFX1NUQVJUICYmCi0JCSh1bnNpZ25lZCBpbnQpKG1lbSArIGNvdW50KSA8PQotCQlDT1JFQl9MMV9DT0RFX1NUQVJUICsgTDFfQ09ERV9MRU5HVEgKKwkJfHwgKGNwdSA9PSAxICYmIElOX01FTShtZW0sIGNvdW50LCBDT1JFQl9MMV9DT0RFX1NUQVJULCBMMV9DT0RFX0xFTkdUSCkpCiAjZW5kaWYKIAkJKSB7CiAJCS8qIGFjY2VzcyBMMSBpbnN0cnVjdGlvbiBTUkFNKi8KQEAgLTY1OCwxMiArNjIzLDkgQEAKIAkJZGVmYXVsdDoKIAkJCXJldHVybiBFRkFVTFQ7CiAJCX0KLQl9IGVsc2UgaWYgKGNwdSA9PSAwICYmICh1bnNpZ25lZCBpbnQpbWVtID49IEwxX0NPREVfU1RBUlQgJiYKLQkJKHVuc2lnbmVkIGludCkobWVtICsgY291bnQpIDwgTDFfQ09ERV9TVEFSVCArIEwxX0NPREVfTEVOR1RICisJfSBlbHNlIGlmICgoY3B1ID09IDAgJiYgSU5fTUVNKG1lbSwgY291bnQsIEwxX0NPREVfU1RBUlQsIEwxX0NPREVfTEVOR1RIKSkKICNpZmRlZiBDT05GSUdfU01QCi0JCXx8IGNwdSA9PSAxICYmICh1bnNpZ25lZCBpbnQpbWVtID49IENPUkVCX0wxX0NPREVfU1RBUlQgJiYKLQkJKHVuc2lnbmVkIGludCkobWVtICsgY291bnQpIDw9Ci0JCUNPUkVCX0wxX0NPREVfU1RBUlQgKyBMMV9DT0RFX0xFTkdUSAorCQl8fCAoY3B1ID09IDEgJiYgSU5fTUVNKG1lbSwgY291bnQsIENPUkVCX0wxX0NPREVfU1RBUlQsIEwxX0NPREVfTEVOR1RIKSkKICNlbmRpZgogCQkpIHsKIAkJLyogYWNjZXNzIEwxIGluc3RydWN0aW9uIFNSQU0gKi8KQEAgLTcyMywxMiArNjg1LDkgQEAKIAkJZGVmYXVsdDoKIAkJCXJldHVybiBFRkFVTFQ7CiAJCX0KLQl9IGVsc2UgaWYgKGNwdSA9PSAwICYmICh1bnNpZ25lZCBpbnQpbWVtID49IEwxX0NPREVfU1RBUlQgJiYKLQkJKHVuc2lnbmVkIGludCkobWVtICsgY291bnQpIDw9IEwxX0NPREVfU1RBUlQgKyBMMV9DT0RFX0xFTkdUSAorCX0gZWxzZSBpZiAoKGNwdSA9PSAwICYmIElOX01FTShtZW0sIGNvdW50LCBMMV9DT0RFX1NUQVJULCBMMV9DT0RFX0xFTkdUSCkpCiAjaWZkZWYgQ09ORklHX1NNUAotCQl8fCBjcHUgPT0gMSAmJiAodW5zaWduZWQgaW50KW1lbSA+PSBDT1JFQl9MMV9DT0RFX1NUQVJUICYmCi0JCSh1bnNpZ25lZCBpbnQpKG1lbSArIGNvdW50KSA8PQotCQlDT1JFQl9MMV9DT0RFX1NUQVJUICsgTDFfQ09ERV9MRU5HVEgKKwkJfHwgKGNwdSA9PSAxICYmIElOX01FTShtZW0sIGNvdW50LCBDT1JFQl9MMV9DT0RFX1NUQVJULCBMMV9DT0RFX0xFTkdUSCkpCiAjZW5kaWYKIAkJKSB7CiAJCS8qIGFjY2VzcyBMMSBpbnN0cnVjdGlvbiBTUkFNICovCkBAIC03NDUsMjQgKzcwNCwxNiBAQAogCiAJaWYgKGFkZHIgPj0gMHgxMDAwICYmIChhZGRyICsgQlJFQUtfSU5TVFJfU0laRSkgPD0gcGh5c2ljYWxfbWVtX2VuZCkKIAkJcmV0dXJuIDA7Ci0JaWYgKGFkZHIgPj0gQVNZTkNfQkFOSzBfQkFTRQotCSAgICYmIGFkZHIgKyBCUkVBS19JTlNUUl9TSVpFIDw9IEFTWU5DX0JBTkszX0JBU0UgKyBBU1lOQ19CQU5LM19CQVNFKQorCWlmIChJTl9NRU0oYWRkciwgQlJFQUtfSU5TVFJfU0laRSwgQVNZTkNfQkFOSzBfQkFTRSwgQVNZTkNfQkFOS19TSVpFKSkKIAkJcmV0dXJuIDA7Ci0jaWYgTDFfQ09ERV9MRU5HVEggIT0gMAotCWlmIChjcHUgPT0gMCAmJiBhZGRyID49IEwxX0NPREVfU1RBUlQKLQkgICAmJiBhZGRyICsgQlJFQUtfSU5TVFJfU0laRSA8PSBMMV9DT0RFX1NUQVJUICsgTDFfQ09ERV9MRU5HVEgpCisJaWYgKGNwdSA9PSAwICYmIElOX01FTShhZGRyLCBCUkVBS19JTlNUUl9TSVpFLCBMMV9DT0RFX1NUQVJULCBMMV9DT0RFX0xFTkdUSCkpCiAJCXJldHVybiAwOwotIyBpZmRlZiBDT05GSUdfU01QCi0JZWxzZSBpZiAoY3B1ID09IDEgJiYgYWRkciA+PSBDT1JFQl9MMV9DT0RFX1NUQVJUCi0JICAgJiYgYWRkciArIEJSRUFLX0lOU1RSX1NJWkUgPD0gQ09SRUJfTDFfQ09ERV9TVEFSVCArIEwxX0NPREVfTEVOR1RIKQotCQlyZXR1cm4gMDsKLSMgZW5kaWYKLSNlbmRpZgotI2lmIEwyX0xFTkdUSCAhPSAwCi0JaWYgKGFkZHIgPj0gTDJfU1RBUlQKLQkgICAmJiBhZGRyICsgQlJFQUtfSU5TVFJfU0laRSA8PSBMMl9TVEFSVCArIEwyX0xFTkdUSCkKKyNpZmRlZiBDT05GSUdfU01QCisJZWxzZSBpZiAoY3B1ID09IDEgJiYgSU5fTUVNKGFkZHIsIEJSRUFLX0lOU1RSX1NJWkUsIENPUkVCX0wxX0NPREVfU1RBUlQsIEwxX0NPREVfTEVOR1RIKSkKIAkJcmV0dXJuIDA7CiAjZW5kaWYKKwlpZiAoSU5fTUVNKGFkZHIsIEJSRUFLX0lOU1RSX1NJWkUsIEwyX1NUQVJULCBMMl9MRU5HVEgpKQorCQlyZXR1cm4gMDsKIAogCXJldHVybiBFRkFVTFQ7CiB9CkBAIC03NzIsMTMgKzcyMyw5IEBACiAJaW50IGVycjsKIAlpbnQgY3B1ID0gcmF3X3NtcF9wcm9jZXNzb3JfaWQoKTsKIAotCWlmICgoY3B1ID09IDAgJiYgKHVuc2lnbmVkIGludClhZGRyID49IEwxX0NPREVfU1RBUlQKLQkJJiYgKHVuc2lnbmVkIGludCkoYWRkciArIEJSRUFLX0lOU1RSX1NJWkUpCi0JCTwgTDFfQ09ERV9TVEFSVCArIEwxX0NPREVfTEVOR1RIKQorCWlmICgoY3B1ID09IDAgJiYgSU5fTUVNKGFkZHIsIEJSRUFLX0lOU1RSX1NJWkUsIEwxX0NPREVfU1RBUlQsIEwxX0NPREVfTEVOR1RIKSkKICNpZmRlZiBDT05GSUdfU01QCi0JCXx8IChjcHUgPT0gMSAmJiAodW5zaWduZWQgaW50KWFkZHIgPj0gQ09SRUJfTDFfQ09ERV9TVEFSVAotCQkmJiAodW5zaWduZWQgaW50KShhZGRyICsgQlJFQUtfSU5TVFJfU0laRSkKLQkJPCBDT1JFQl9MMV9DT0RFX1NUQVJUICsgTDFfQ09ERV9MRU5HVEgpCisJCXx8IChjcHUgPT0gMSAmJiBJTl9NRU0oYWRkciwgQlJFQUtfSU5TVFJfU0laRSwgQ09SRUJfTDFfQ09ERV9TVEFSVCwgTDFfQ09ERV9MRU5HVEgpKQogI2VuZGlmCiAJCSkgewogCQkvKiBhY2Nlc3MgTDEgaW5zdHJ1Y3Rpb24gU1JBTSAqLwpAQCAtODA0LDkgKzc1MSw3IEBACiAKIGludCBrZ2RiX2FyY2hfcmVtb3ZlX2JyZWFrcG9pbnQodW5zaWduZWQgbG9uZyBhZGRyLCBjaGFyICpidW5kbGUpCiB7Ci0JaWYgKCh1bnNpZ25lZCBpbnQpYWRkciA+PSBMMV9DT0RFX1NUQVJUICYmCi0JCSh1bnNpZ25lZCBpbnQpKGFkZHIgKyBCUkVBS19JTlNUUl9TSVpFKSA8Ci0JCQlMMV9DT0RFX1NUQVJUICsgTDFfQ09ERV9MRU5HVEgpIHsKKwlpZiAoSU5fTUVNKGFkZHIsIEJSRUFLX0lOU1RSX1NJWkUsIEwxX0NPREVfU1RBUlQsIEwxX0NPREVfTEVOR1RIKSkgewogCQkvKiBhY2Nlc3MgTDEgaW5zdHJ1Y3Rpb24gU1JBTSAqLwogCQlpZiAoZG1hX21lbWNweSgodm9pZCAqKWFkZHIsIGJ1bmRsZSwgQlJFQUtfSU5TVFJfU0laRSkgPT0gTlVMTCkKIAkJCXJldHVybiAtRUZBVUxUOwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwva2dkYl90ZXN0LmMgYi9hcmNoL2JsYWNrZmluL2tlcm5lbC9rZ2RiX3Rlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZGJhOWMxCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9ibGFja2Zpbi9rZXJuZWwva2dkYl90ZXN0LmMKQEAgLTAsMCArMSwxMjMgQEAKKy8qCisgKiBhcmNoL2JsYWNrZmluL2tlcm5lbC9rZ2RiX3Rlc3QuYyAtIEJsYWNrZmluIGtnZGIgdGVzdHMKKyAqCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA4IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisKKyNpbmNsdWRlIDxhc20vY3VycmVudC5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorCisjaW5jbHVkZSA8YXNtL2JsYWNrZmluLmg+CisKK3N0YXRpYyBjaGFyIGNtZGxpbmVbMjU2XTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGxlbjsKKworc3RhdGljIGludCBudW0xIF9fYXR0cmlidXRlX18oKGwxX2RhdGEpKTsKKwordm9pZCBrZ2RiX2wxX3Rlc3Qodm9pZCkgX19hdHRyaWJ1dGVfXygobDFfdGV4dCkpOworCit2b2lkIGtnZGJfbDFfdGVzdCh2b2lkKQoreworCXByaW50ayhLRVJOX0FMRVJUICJMMShiZWZvcmUgY2hhbmdlKSA6IGRhdGEgdmFyaWFibGUgYWRkciA9IDB4JXAsIGRhdGEgdmFsdWUgaXMgJWRcbiIsICZudW0xLCBudW0xKTsKKwlwcmludGsoS0VSTl9BTEVSVCAiTDEgOiBjb2RlIGZ1bmN0aW9uIGFkZHIgPSAweCVwXG4iLCBrZ2RiX2wxX3Rlc3QpOworCW51bTEgPSBudW0xICsgMTAgOworCXByaW50ayhLRVJOX0FMRVJUICJMMShhZnRlciBjaGFuZ2UpIDogZGF0YSB2YXJpYWJsZSBhZGRyID0gMHglcCwgZGF0YSB2YWx1ZSBpcyAlZFxuIiwgJm51bTEsIG51bTEpOworCXJldHVybiA7Cit9CisjaWYgTDJfTEVOR1RICisKK3N0YXRpYyBpbnQgbnVtMiBfX2F0dHJpYnV0ZV9fKChsMikpOwordm9pZCBrZ2RiX2wyX3Rlc3Qodm9pZCkgX19hdHRyaWJ1dGVfXygobDIpKTsKKwordm9pZCBrZ2RiX2wyX3Rlc3Qodm9pZCkKK3sKKwlwcmludGsoS0VSTl9BTEVSVCAiTDIoYmVmb3JlIGNoYW5nZSkgOiBkYXRhIHZhcmlhYmxlIGFkZHIgPSAweCVwLCBkYXRhIHZhbHVlIGlzICVkXG4iLCAmbnVtMiwgbnVtMik7CisJcHJpbnRrKEtFUk5fQUxFUlQgIkwyIDogY29kZSBmdW5jdGlvbiBhZGRyID0gMHglcFxuIiwga2dkYl9sMl90ZXN0KTsKKwludW0yID0gbnVtMiArIDIwIDsKKwlwcmludGsoS0VSTl9BTEVSVCAiTDIoYWZ0ZXIgY2hhbmdlKSA6IGRhdGEgdmFyaWFibGUgYWRkciA9IDB4JXAsIGRhdGEgdmFsdWUgaXMgJWRcbiIsICZudW0yLCBudW0yKTsKKwlyZXR1cm4gOworfQorCisjZW5kaWYKKworCitpbnQga2dkYl90ZXN0KGNoYXIgKm5hbWUsIGludCBsZW4sIGludCBjb3VudCwgaW50IHopCit7CisJcHJpbnRrKEtFUk5fREVCVUcgImtnZGIgbmFtZSglZCk6ICVzLCAlZCwgJWRcbiIsIGxlbiwgbmFtZSwgY291bnQsIHopOworCWNvdW50ID0gejsKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBpbnQgdGVzdF9wcm9jX291dHB1dChjaGFyICpidWYpCit7CisJa2dkYl90ZXN0KCJoZWxsbyB3b3JsZCEiLCAxMiwgMHg1NSwgMHgxMCk7CisJa2dkYl9sMV90ZXN0KCk7CisJI2lmIEwyX0xFTkdUSAorCWtnZGJfbDJfdGVzdCgpOworCSNlbmRpZgorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGVzdF9yZWFkX3Byb2MoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsCisJCQkJIGludCBjb3VudCwgaW50ICplb2YsIHZvaWQgKmRhdGEpCit7CisJaW50IGxlbjsKKworCWxlbiA9IHRlc3RfcHJvY19vdXRwdXQocGFnZSk7CisJaWYgKGxlbiA8PSBvZmYrY291bnQpCisJCSplb2YgPSAxOworCSpzdGFydCA9IHBhZ2UgKyBvZmY7CisJbGVuIC09IG9mZjsKKwlpZiAobGVuID4gY291bnQpCisJCWxlbiA9IGNvdW50OworCWlmIChsZW4gPCAwKQorCQlsZW4gPSAwOworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBpbnQgdGVzdF93cml0ZV9wcm9jKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyICpidWZmZXIsCisJCQkJIHVuc2lnbmVkIGxvbmcgY291bnQsIHZvaWQgKmRhdGEpCit7CisJaWYgKGNvdW50ID49IDI1NikKKwkJbGVuID0gMjU1OworCWVsc2UKKwkJbGVuID0gY291bnQ7CisKKwltZW1jcHkoY21kbGluZSwgYnVmZmVyLCBjb3VudCk7CisJY21kbGluZVtsZW5dID0gMDsKKworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGtnZGJ0ZXN0X2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmVudHJ5OworCisJZW50cnkgPSBjcmVhdGVfcHJvY19lbnRyeSgia2dkYnRlc3QiLCAwLCBOVUxMKTsKKwlpZiAoZW50cnkgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwllbnRyeS0+cmVhZF9wcm9jID0gdGVzdF9yZWFkX3Byb2M7CisJZW50cnktPndyaXRlX3Byb2MgPSB0ZXN0X3dyaXRlX3Byb2M7CisJZW50cnktPmRhdGEgPSBOVUxMOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBrZ2RidGVzdF9leGl0KHZvaWQpCit7CisJcmVtb3ZlX3Byb2NfZW50cnkoImtnZGJ0ZXN0IiwgTlVMTCk7Cit9CisKK21vZHVsZV9pbml0KGtnZGJ0ZXN0X2luaXQpOworbW9kdWxlX2V4aXQoa2dkYnRlc3RfZXhpdCk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2tlcm5lbC9tY291bnQuUyBiL2FyY2gvYmxhY2tmaW4va2VybmVsL21jb3VudC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkY2ZiMzgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2JsYWNrZmluL2tlcm5lbC9tY291bnQuUwpAQCAtMCwwICsxLDcwIEBACisvKgorICogbGludXgvYXJjaC9ibGFja2Zpbi9tY291bnQuUworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKgorICogMjAwNy8wNC8xMiBTYXZlIGluZGV4LCBsZW5ndGgsIG1vZGlmeSBhbmQgYmFzZSByZWdpc3RlcnMuIC0tcnBtCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KKyNpbmNsdWRlIDxhc20vYmxhY2tmaW4uaD4KKworLnRleHQKKworLmFsaWduIDQgCS8qIGp1c3QgaW4gY2FzZSAqLworCitFTlRSWShfX21jb3VudCkKKwlbLS1zcF0gPSBpMDsKKwlbLS1zcF0gPSBpMTsKKwlbLS1zcF0gPSBpMjsKKwlbLS1zcF0gPSBpMzsKKwlbLS1zcF0gPSBsMDsKKwlbLS1zcF0gPSBsMTsKKwlbLS1zcF0gPSBsMjsKKwlbLS1zcF0gPSBsMzsKKwlbLS1zcF0gPSBtMDsKKwlbLS1zcF0gPSBtMTsKKwlbLS1zcF0gPSBtMjsKKwlbLS1zcF0gPSBtMzsKKwlbLS1zcF0gPSBiMDsKKwlbLS1zcF0gPSBiMTsKKwlbLS1zcF0gPSBiMjsKKwlbLS1zcF0gPSBiMzsKKwlbLS1zcF0gPSAoIHI3OjAsIHA1OjAgKTsKKwlbLS1zcF0gPSBBU1RBVDsKKworCXAxLkwgPSBfaXBpcGVfdHJhY2VfZW5hYmxlOworCXAxLkggPSBfaXBpcGVfdHJhY2VfZW5hYmxlOworCXI3ID0gW3AxXTsKKwlDQyA9IHI3ID09IDA7CisJaWYgQ0MganVtcCBvdXQ7CisJbGluayAweDEwOworCXIwID0gMHgwOworCVtzcCArIDB4Y10gPSByMDsgLyogdiAqLworCXIwID0gMHgwOwkvKiB0eXBlOiBJUElQRV9UUkFDRV9GTiAqLworCXIxID0gcmV0czsKKwlwMCA9IFtmcF07CS8qIHAwOiBQcmlvciBGUCAqLworCXIyID0gW3AwICsgNF07CS8qIHIyOiBQcmlvciBSRVRTICovCisJY2FsbCBfX19pcGlwZV90cmFjZTsKKwl1bmxpbms7CitvdXQ6CisJQVNUQVQgPSBbc3ArK107CisJKCByNzowLCBwNTowICkgPSBbc3ArK107CisJYjMgPSBbc3ArK107CisJYjIgPSBbc3ArK107CisJYjEgPSBbc3ArK107CisJYjAgPSBbc3ArK107CisJbTMgPSBbc3ArK107CisJbTIgPSBbc3ArK107CisJbTEgPSBbc3ArK107CisJbTAgPSBbc3ArK107CisJbDMgPSBbc3ArK107CisJbDIgPSBbc3ArK107CisJbDEgPSBbc3ArK107CisJbDAgPSBbc3ArK107CisJaTMgPSBbc3ArK107CisJaTIgPSBbc3ArK107CisJaTEgPSBbc3ArK107CisJaTAgPSBbc3ArK107CisJcnRzOworRU5EUFJPQyhfX21jb3VudCkKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4va2VybmVsL21vZHVsZS5jIGIvYXJjaC9ibGFja2Zpbi9rZXJuZWwvbW9kdWxlLmMKaW5kZXggZTFiZWJjOC4uMWJkN2YyZCAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwvbW9kdWxlLmMKKysrIGIvYXJjaC9ibGFja2Zpbi9rZXJuZWwvbW9kdWxlLmMKQEAgLTM3LDExMSArMzcsNiBAQAogI2luY2x1ZGUgPGFzbS9kbWEuaD4KICNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgogCi0vKgotICogaGFuZGxlIGFyaXRobWV0aWMgcmVsb2NhdGlvbnMuCi0gKiBTZWUgYmludXRpbHMvYmZkL2VsZjMyLWJmaW4uYyBmb3IgbW9yZSBkZXRhaWxzCi0gKi8KLSNkZWZpbmUgUkVMT0NfU1RBQ0tfU0laRSAxMDAKLXN0YXRpYyB1aW50MzJfdCByZWxvY19zdGFja1tSRUxPQ19TVEFDS19TSVpFXTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgcmVsb2Nfc3RhY2tfdG9zOwotCi0jZGVmaW5lIGlzX3JlbG9jX3N0YWNrX2VtcHR5KCkgKChyZWxvY19zdGFja190b3MgPiAwKT8wOjEpCi0KLXN0YXRpYyB2b2lkIHJlbG9jX3N0YWNrX3B1c2godWludDMyX3QgdmFsdWUpCi17Ci0JcmVsb2Nfc3RhY2tbcmVsb2Nfc3RhY2tfdG9zKytdID0gdmFsdWU7Ci19Ci0KLXN0YXRpYyB1aW50MzJfdCByZWxvY19zdGFja19wb3Aodm9pZCkKLXsKLQlyZXR1cm4gcmVsb2Nfc3RhY2tbLS1yZWxvY19zdGFja190b3NdOwotfQotCi1zdGF0aWMgdWludDMyX3QgcmVsb2Nfc3RhY2tfb3BlcmF0ZSh1bnNpZ25lZCBpbnQgb3Blciwgc3RydWN0IG1vZHVsZSAqbW9kKQotewotCXVpbnQzMl90IHZhbHVlOwotCi0Jc3dpdGNoIChvcGVyKSB7Ci0JY2FzZSBSX2FkZDoKLQkJdmFsdWUgPSByZWxvY19zdGFja1tyZWxvY19zdGFja190b3MgLSAyXSArCi0JCQlyZWxvY19zdGFja1tyZWxvY19zdGFja190b3MgLSAxXTsKLQkJcmVsb2Nfc3RhY2tfdG9zIC09IDI7Ci0JCWJyZWFrOwotCWNhc2UgUl9zdWI6Ci0JCXZhbHVlID0gcmVsb2Nfc3RhY2tbcmVsb2Nfc3RhY2tfdG9zIC0gMl0gLQotCQkJcmVsb2Nfc3RhY2tbcmVsb2Nfc3RhY2tfdG9zIC0gMV07Ci0JCXJlbG9jX3N0YWNrX3RvcyAtPSAyOwotCQlicmVhazsKLQljYXNlIFJfbXVsdDoKLQkJdmFsdWUgPSByZWxvY19zdGFja1tyZWxvY19zdGFja190b3MgLSAyXSAqCi0JCQlyZWxvY19zdGFja1tyZWxvY19zdGFja190b3MgLSAxXTsKLQkJcmVsb2Nfc3RhY2tfdG9zIC09IDI7Ci0JCWJyZWFrOwotCWNhc2UgUl9kaXY6Ci0JCXZhbHVlID0gcmVsb2Nfc3RhY2tbcmVsb2Nfc3RhY2tfdG9zIC0gMl0gLwotCQkJcmVsb2Nfc3RhY2tbcmVsb2Nfc3RhY2tfdG9zIC0gMV07Ci0JCXJlbG9jX3N0YWNrX3RvcyAtPSAyOwotCQlicmVhazsKLQljYXNlIFJfbW9kOgotCQl2YWx1ZSA9IHJlbG9jX3N0YWNrW3JlbG9jX3N0YWNrX3RvcyAtIDJdICUKLQkJCXJlbG9jX3N0YWNrW3JlbG9jX3N0YWNrX3RvcyAtIDFdOwotCQlyZWxvY19zdGFja190b3MgLT0gMjsKLQkJYnJlYWs7Ci0JY2FzZSBSX2xzaGlmdDoKLQkJdmFsdWUgPSByZWxvY19zdGFja1tyZWxvY19zdGFja190b3MgLSAyXSA8PAotCQkJcmVsb2Nfc3RhY2tbcmVsb2Nfc3RhY2tfdG9zIC0gMV07Ci0JCXJlbG9jX3N0YWNrX3RvcyAtPSAyOwotCQlicmVhazsKLQljYXNlIFJfcnNoaWZ0OgotCQl2YWx1ZSA9IHJlbG9jX3N0YWNrW3JlbG9jX3N0YWNrX3RvcyAtIDJdID4+Ci0JCQlyZWxvY19zdGFja1tyZWxvY19zdGFja190b3MgLSAxXTsKLQkJcmVsb2Nfc3RhY2tfdG9zIC09IDI7Ci0JCWJyZWFrOwotCWNhc2UgUl9hbmQ6Ci0JCXZhbHVlID0gcmVsb2Nfc3RhY2tbcmVsb2Nfc3RhY2tfdG9zIC0gMl0gJgotCQkJcmVsb2Nfc3RhY2tbcmVsb2Nfc3RhY2tfdG9zIC0gMV07Ci0JCXJlbG9jX3N0YWNrX3RvcyAtPSAyOwotCQlicmVhazsKLQljYXNlIFJfb3I6Ci0JCXZhbHVlID0gcmVsb2Nfc3RhY2tbcmVsb2Nfc3RhY2tfdG9zIC0gMl0gfAotCQkJcmVsb2Nfc3RhY2tbcmVsb2Nfc3RhY2tfdG9zIC0gMV07Ci0JCXJlbG9jX3N0YWNrX3RvcyAtPSAyOwotCQlicmVhazsKLQljYXNlIFJfeG9yOgotCQl2YWx1ZSA9IHJlbG9jX3N0YWNrW3JlbG9jX3N0YWNrX3RvcyAtIDJdIF4KLQkJCXJlbG9jX3N0YWNrW3JlbG9jX3N0YWNrX3RvcyAtIDFdOwotCQlyZWxvY19zdGFja190b3MgLT0gMjsKLQkJYnJlYWs7Ci0JY2FzZSBSX2xhbmQ6Ci0JCXZhbHVlID0gcmVsb2Nfc3RhY2tbcmVsb2Nfc3RhY2tfdG9zIC0gMl0gJiYKLQkJCXJlbG9jX3N0YWNrW3JlbG9jX3N0YWNrX3RvcyAtIDFdOwotCQlyZWxvY19zdGFja190b3MgLT0gMjsKLQkJYnJlYWs7Ci0JY2FzZSBSX2xvcjoKLQkJdmFsdWUgPSByZWxvY19zdGFja1tyZWxvY19zdGFja190b3MgLSAyXSB8fAotCQkJcmVsb2Nfc3RhY2tbcmVsb2Nfc3RhY2tfdG9zIC0gMV07Ci0JCXJlbG9jX3N0YWNrX3RvcyAtPSAyOwotCQlicmVhazsKLQljYXNlIFJfbmVnOgotCQl2YWx1ZSA9IC1yZWxvY19zdGFja1tyZWxvY19zdGFja190b3MgLSAxXTsKLQkJcmVsb2Nfc3RhY2tfdG9zLS07Ci0JCWJyZWFrOwotCWNhc2UgUl9jb21wOgotCQl2YWx1ZSA9IH5yZWxvY19zdGFja1tyZWxvY19zdGFja190b3MgLSAxXTsKLQkJcmVsb2Nfc3RhY2tfdG9zIC09IDE7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIm1vZHVsZSAlczogdW5oYW5kbGVkIHJlbG9jdGlvblxuIiwKLQkJCQltb2QtPm5hbWUpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQkvKiBub3cgcHVzaCB0aGUgbmV3IHZhbHVlIGJhY2sgb24gc3RhY2sgKi8KLQlyZWxvY19zdGFja19wdXNoKHZhbHVlKTsKLQotCXJldHVybiB2YWx1ZTsKLX0KLQogdm9pZCAqbW9kdWxlX2FsbG9jKHVuc2lnbmVkIGxvbmcgc2l6ZSkKIHsKIAlpZiAoc2l6ZSA9PSAwKQpAQCAtMzM0LDE2ICsyMjksMTggQEAKIAkJICAgdW5kZWZpbmVkIHN5bWJvbHMgaGF2ZSBiZWVuIHJlc29sdmVkLiAqLwogCQlzeW0gPSAoRWxmMzJfU3ltICopIHNlY2hkcnNbc3ltaW5kZXhdLnNoX2FkZHIKIAkJICAgICsgRUxGMzJfUl9TWU0ocmVsW2ldLnJfaW5mbyk7Ci0JCWlmIChpc19yZWxvY19zdGFja19lbXB0eSgpKSB7Ci0JCQl2YWx1ZSA9IHN5bS0+c3RfdmFsdWU7Ci0JCX0gZWxzZSB7Ci0JCQl2YWx1ZSA9IHJlbG9jX3N0YWNrX3BvcCgpOwotCQl9CisJCXZhbHVlID0gc3ltLT5zdF92YWx1ZTsKIAkJdmFsdWUgKz0gcmVsW2ldLnJfYWRkZW5kOwogCQlwcl9kZWJ1ZygibG9jYXRpb24gaXMgJXgsIHZhbHVlIGlzICV4IHR5cGUgaXMgJWQgXG4iLAogCQkJICh1bnNpZ25lZCBpbnQpIGxvY2F0aW9uMzIsIHZhbHVlLAogCQkJIEVMRjMyX1JfVFlQRShyZWxbaV0ucl9pbmZvKSk7Ci0KKyNpZmRlZiBDT05GSUdfU01QCisJCWlmICgodW5zaWduZWQgbG9uZylsb2NhdGlvbjE2ID49IENPUkVCX0wxX0RBVEFfQV9TVEFSVCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJtb2R1bGUgJXM6IGNhbm5vdCByZWxvY2F0ZSBpbiBMMTogJXUgKFNNUCBrZXJuZWwpIiwKKwkJCQkgICAgICAgbW9kLT5uYW1lLCBFTEYzMl9SX1RZUEUocmVsW2ldLnJfaW5mbykpOworCQkJcmV0dXJuIC1FTk9FWEVDOworCQl9CisjZW5kaWYKIAkJc3dpdGNoIChFTEYzMl9SX1RZUEUocmVsW2ldLnJfaW5mbykpIHsKIAogCQljYXNlIFJfcGNyZWwyNDoKQEAgLTM1NSw2ICsyNTIsMTIgQEAKIAkJCWxvY2F0aW9uMzIgPSAodWludDMyX3QgKikgbG9jYXRpb24xNjsKIAkJCXZhbHVlIC09ICh1aW50MzJfdCkgbG9jYXRpb24zMjsKIAkJCXZhbHVlID4+PSAxOworCQkJaWYgKCh2YWx1ZSAmIDB4RkYwMDAwMDApICE9IDAgJiYKKwkJCSAgICAodmFsdWUgJiAweEZGMDAwMDAwKSAhPSAweEZGMDAwMDAwKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJtb2R1bGUgJXM6IHJlbG9jYXRpb24gb3ZlcmZsb3dcbiIsCisJCQkJICAgICAgIG1vZC0+bmFtZSk7CisJCQkJcmV0dXJuIC1FTk9FWEVDOworCQkJfQogCQkJcHJfZGVidWcoInZhbHVlIGlzICV4LCBiZWZvcmUgJXgtJXggYWZ0ZXIgJXgtJXhcbiIsIHZhbHVlLAogCQkJICAgICAgICpsb2NhdGlvbjE2LCAqKGxvY2F0aW9uMTYgKyAxKSwKIAkJCSAgICAgICAoKmxvY2F0aW9uMTYgJiAweGZmMDApIHwgKHZhbHVlID4+IDE2ICYgMHgwMGZmKSwKQEAgLTM5OSwyOCArMzAyLDYgQEAKIAkJCXByX2RlYnVnKCJiZWZvcmUgJXggYWZ0ZXIgJXhcbiIsICpsb2NhdGlvbjMyLCB2YWx1ZSk7CiAJCQkqbG9jYXRpb24zMiA9IHZhbHVlOwogCQkJYnJlYWs7Ci0JCWNhc2UgUl9wdXNoOgotCQkJcmVsb2Nfc3RhY2tfcHVzaCh2YWx1ZSk7Ci0JCQlicmVhazsKLQkJY2FzZSBSX2NvbnN0OgotCQkJcmVsb2Nfc3RhY2tfcHVzaChyZWxbaV0ucl9hZGRlbmQpOwotCQkJYnJlYWs7Ci0JCWNhc2UgUl9hZGQ6Ci0JCWNhc2UgUl9zdWI6Ci0JCWNhc2UgUl9tdWx0OgotCQljYXNlIFJfZGl2OgotCQljYXNlIFJfbW9kOgotCQljYXNlIFJfbHNoaWZ0OgotCQljYXNlIFJfcnNoaWZ0OgotCQljYXNlIFJfYW5kOgotCQljYXNlIFJfb3I6Ci0JCWNhc2UgUl94b3I6Ci0JCWNhc2UgUl9sYW5kOgotCQljYXNlIFJfbG9yOgotCQljYXNlIFJfbmVnOgotCQljYXNlIFJfY29tcDoKLQkJCXJlbG9jX3N0YWNrX29wZXJhdGUoRUxGMzJfUl9UWVBFKHJlbFtpXS5yX2luZm8pLCBtb2QpOwotCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlwcmludGsoS0VSTl9FUlIgIm1vZHVsZSAlczogVW5rbm93biByZWxvY2F0aW9uOiAldVxuIiwKIAkJCSAgICAgICBtb2QtPm5hbWUsIEVMRjMyX1JfVFlQRShyZWxbaV0ucl9pbmZvKSk7CkBAIC00MzYsNiArMzE3LDcgQEAKIHsKIAl1bnNpZ25lZCBpbnQgaSwgc3RyaW5kZXggPSAwLCBzeW1pbmRleCA9IDA7CiAJY2hhciAqc2Vjc3RyaW5nczsKKwlsb25nIGVyciA9IDA7CiAKIAlzZWNzdHJpbmdzID0gKHZvaWQgKiloZHIgKyBzZWNoZHJzW2hkci0+ZV9zaHN0cm5keF0uc2hfb2Zmc2V0OwogCkBAIC00NjAsOCArMzQyLDEwIEBACiAJCSAgICAoc3RyY21wKCIucmVsYS5sMS50ZXh0Iiwgc2Vjc3RyaW5ncyArIHNlY2hkcnNbaV0uc2hfbmFtZSkgPT0gMCkgfHwKIAkJICAgICgoc3RyY21wKCIucmVsYS50ZXh0Iiwgc2Vjc3RyaW5ncyArIHNlY2hkcnNbaV0uc2hfbmFtZSkgPT0gMCkgJiYKIAkJCShoZHItPmVfZmxhZ3MgJiAoRUZfQkZJTl9DT0RFX0lOX0wxfEVGX0JGSU5fQ09ERV9JTl9MMikpKSkpIHsKLQkJCWFwcGx5X3JlbG9jYXRlX2FkZCgoRWxmX1NoZHIgKikgc2VjaGRycywgc3RydGFiLAorCQkJZXJyID0gYXBwbHlfcmVsb2NhdGVfYWRkKChFbGZfU2hkciAqKSBzZWNoZHJzLCBzdHJ0YWIsCiAJCQkJCSAgIHN5bWluZGV4LCBpLCBtb2QpOworCQkJaWYgKGVyciA8IDApCisJCQkJcmV0dXJuIC1FTk9FWEVDOwogCQl9CiAJfQogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwvcHJvY2Vzcy5jIGIvYXJjaC9ibGFja2Zpbi9rZXJuZWwvcHJvY2Vzcy5jCmluZGV4IDBjM2VhMTEuLjMzZTJlODkgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4va2VybmVsL3Byb2Nlc3MuYworKysgYi9hcmNoL2JsYWNrZmluL2tlcm5lbC9wcm9jZXNzLmMKQEAgLTM5LDYgKzM5LDcgQEAKIAogI2luY2x1ZGUgPGFzbS9ibGFja2Zpbi5oPgogI2luY2x1ZGUgPGFzbS9maXhlZF9jb2RlLmg+CisjaW5jbHVkZSA8YXNtL21lbV9tYXAuaD4KIAogYXNtbGlua2FnZSB2b2lkIHJldF9mcm9tX2Zvcmsodm9pZCk7CiAKQEAgLTgxLDExICs4MiwxNCBAQAogICovCiBzdGF0aWMgdm9pZCBkZWZhdWx0X2lkbGUodm9pZCkKIHsKLQlsb2NhbF9pcnFfZGlzYWJsZSgpOworI2lmZGVmIENPTkZJR19JUElQRQorCWlwaXBlX3N1c3BlbmRfZG9tYWluKCk7CisjZW5kaWYKKwlsb2NhbF9pcnFfZGlzYWJsZV9odygpOwogCWlmICghbmVlZF9yZXNjaGVkKCkpCiAJCWlkbGVfd2l0aF9pcnFfZGlzYWJsZWQoKTsKIAotCWxvY2FsX2lycV9lbmFibGUoKTsKKwlsb2NhbF9pcnFfZW5hYmxlX2h3KCk7CiB9CiAKIC8qCkBAIC0xNTQsNiArMTU4LDcgQEAKIAlyZXR1cm4gZG9fZm9yayhmbGFncyB8IENMT05FX1ZNIHwgQ0xPTkVfVU5UUkFDRUQsIDAsICZyZWdzLCAwLCBOVUxMLAogCQkgICAgICAgTlVMTCk7CiB9CitFWFBPUlRfU1lNQk9MKGtlcm5lbF90aHJlYWQpOwogCiB2b2lkIGZsdXNoX3RocmVhZCh2b2lkKQogewpAQCAtMTcwLDYgKzE3NSwxMyBAQAogCXVuc2lnbmVkIGxvbmcgY2xvbmVfZmxhZ3M7CiAJdW5zaWduZWQgbG9uZyBuZXdzcDsKIAorI2lmZGVmIF9fQVJDSF9TWU5DX0NPUkVfRENBQ0hFCisJaWYgKGN1cnJlbnQtPnJ0Lm5yX2NwdXNfYWxsb3dlZCA9PSBudW1fcG9zc2libGVfY3B1cygpKSB7CisJCWN1cnJlbnQtPmNwdXNfYWxsb3dlZCA9IGNwdW1hc2tfb2ZfY3B1KHNtcF9wcm9jZXNzb3JfaWQoKSk7CisJCWN1cnJlbnQtPnJ0Lm5yX2NwdXNfYWxsb3dlZCA9IDE7CisJfQorI2VuZGlmCisKIAkvKiBzeXNjYWxsMiBwdXRzIGNsb25lX2ZsYWdzIGluIHIwIGFuZCB1c3AgaW4gcjEgKi8KIAljbG9uZV9mbGFncyA9IHJlZ3MtPnIwOwogCW5ld3NwID0gcmVncy0+cjE7CkBAIC0zMzcsMjIgKzM0OSwyMiBAQAogCWlmIChhZGRyID49ICh1bnNpZ25lZCBsb25nKV9faW5pdF9iZWdpbiAmJgogCSAgICBhZGRyICsgc2l6ZSA8PSAodW5zaWduZWQgbG9uZylfX2luaXRfZW5kKQogCQlyZXR1cm4gMTsKLQlpZiAoYWRkciA+PSBMMV9TQ1JBVENIX1NUQVJUCi0JICAgICYmIGFkZHIgKyBzaXplIDw9IEwxX1NDUkFUQ0hfU1RBUlQgKyBMMV9TQ1JBVENIX0xFTkdUSCkKKwlpZiAoYWRkciA+PSBnZXRfbDFfc2NyYXRjaF9zdGFydCgpCisJICAgICYmIGFkZHIgKyBzaXplIDw9IGdldF9sMV9zY3JhdGNoX3N0YXJ0KCkgKyBMMV9TQ1JBVENIX0xFTkdUSCkKIAkJcmV0dXJuIDE7CiAjaWYgTDFfQ09ERV9MRU5HVEggIT0gMAotCWlmIChhZGRyID49IEwxX0NPREVfU1RBUlQgKyAoX2V0ZXh0X2wxIC0gX3N0ZXh0X2wxKQotCSAgICAmJiBhZGRyICsgc2l6ZSA8PSBMMV9DT0RFX1NUQVJUICsgTDFfQ09ERV9MRU5HVEgpCisJaWYgKGFkZHIgPj0gZ2V0X2wxX2NvZGVfc3RhcnQoKSArIChfZXRleHRfbDEgLSBfc3RleHRfbDEpCisJICAgICYmIGFkZHIgKyBzaXplIDw9IGdldF9sMV9jb2RlX3N0YXJ0KCkgKyBMMV9DT0RFX0xFTkdUSCkKIAkJcmV0dXJuIDE7CiAjZW5kaWYKICNpZiBMMV9EQVRBX0FfTEVOR1RIICE9IDAKLQlpZiAoYWRkciA+PSBMMV9EQVRBX0FfU1RBUlQgKyAoX2Vic3NfbDEgLSBfc2RhdGFfbDEpCi0JICAgICYmIGFkZHIgKyBzaXplIDw9IEwxX0RBVEFfQV9TVEFSVCArIEwxX0RBVEFfQV9MRU5HVEgpCisJaWYgKGFkZHIgPj0gZ2V0X2wxX2RhdGFfYV9zdGFydCgpICsgKF9lYnNzX2wxIC0gX3NkYXRhX2wxKQorCSAgICAmJiBhZGRyICsgc2l6ZSA8PSBnZXRfbDFfZGF0YV9hX3N0YXJ0KCkgKyBMMV9EQVRBX0FfTEVOR1RIKQogCQlyZXR1cm4gMTsKICNlbmRpZgogI2lmIEwxX0RBVEFfQl9MRU5HVEggIT0gMAotCWlmIChhZGRyID49IEwxX0RBVEFfQl9TVEFSVCArIChfZWJzc19iX2wxIC0gX3NkYXRhX2JfbDEpCi0JICAgICYmIGFkZHIgKyBzaXplIDw9IEwxX0RBVEFfQl9TVEFSVCArIEwxX0RBVEFfQl9MRU5HVEgpCisJaWYgKGFkZHIgPj0gZ2V0X2wxX2RhdGFfYl9zdGFydCgpICsgKF9lYnNzX2JfbDEgLSBfc2RhdGFfYl9sMSkKKwkgICAgJiYgYWRkciArIHNpemUgPD0gZ2V0X2wxX2RhdGFfYl9zdGFydCgpICsgTDFfREFUQV9CX0xFTkdUSCkKIAkJcmV0dXJuIDE7CiAjZW5kaWYKICNpZiBMMl9MRU5HVEggIT0gMApkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwvcHRyYWNlLmMgYi9hcmNoL2JsYWNrZmluL2tlcm5lbC9wdHJhY2UuYwppbmRleCAxNDBiZjAwLi5kMmQzODg1IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2tlcm5lbC9wdHJhY2UuYworKysgYi9hcmNoL2JsYWNrZmluL2tlcm5lbC9wdHJhY2UuYwpAQCAtNDUsNiArNDUsNyBAQAogI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgogI2luY2x1ZGUgPGFzbS9kbWEuaD4KICNpbmNsdWRlIDxhc20vZml4ZWRfY29kZS5oPgorI2luY2x1ZGUgPGFzbS9tZW1fbWFwLmg+CiAKICNkZWZpbmUgVEVYVF9PRkZTRVQgMAogLyoKQEAgLTgwLDEwICs4MSwxMiBAQAogLyoKICAqIEdldCBhbGwgdXNlciBpbnRlZ2VyIHJlZ2lzdGVycy4KICAqLwotc3RhdGljIGlubGluZSBpbnQgcHRyYWNlX2dldHJlZ3Moc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIHZvaWQgX191c2VyICogdXJlZ3MpCitzdGF0aWMgaW5saW5lIGludCBwdHJhY2VfZ2V0cmVncyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgdm9pZCBfX3VzZXIgKnVyZWdzKQogewotCXN0cnVjdCBwdF9yZWdzICpyZWdzID0gZ2V0X3VzZXJfcmVncyh0c2spOwotCXJldHVybiBjb3B5X3RvX3VzZXIodXJlZ3MsIHJlZ3MsIHNpemVvZihzdHJ1Y3QgcHRfcmVncykpID8gLUVGQVVMVCA6IDA7CisJc3RydWN0IHB0X3JlZ3MgcmVnczsKKwltZW1jcHkoJnJlZ3MsIGdldF91c2VyX3JlZ3ModHNrKSwgc2l6ZW9mKHJlZ3MpKTsKKwlyZWdzLnVzcCA9IHRzay0+dGhyZWFkLnVzcDsKKwlyZXR1cm4gY29weV90b191c2VyKHVyZWdzLCAmcmVncywgc2l6ZW9mKHN0cnVjdCBwdF9yZWdzKSkgPyAtRUZBVUxUIDogMDsKIH0KIAogLyogTWFwcGluZyBmcm9tIFBUX3h4eCB0byB0aGUgc3RhY2sgb2Zmc2V0IGF0IHdoaWNoIHRoZSByZWdpc3RlciBpcwpAQCAtMjIwLDggKzIyMyw4IEBACiAJCQkJYnJlYWs7CiAJCQlwcl9kZWJ1ZygicHRyYWNlOiB1c2VyIGFkZHJlc3MgaXMgdmFsaWRcbiIpOwogCi0JCQlpZiAoTDFfQ09ERV9MRU5HVEggIT0gMCAmJiBhZGRyID49IEwxX0NPREVfU1RBUlQKLQkJCSAgICAmJiBhZGRyICsgc2l6ZW9mKHRtcCkgPD0gTDFfQ09ERV9TVEFSVCArIEwxX0NPREVfTEVOR1RIKSB7CisJCQlpZiAoTDFfQ09ERV9MRU5HVEggIT0gMCAmJiBhZGRyID49IGdldF9sMV9jb2RlX3N0YXJ0KCkKKwkJCSAgICAmJiBhZGRyICsgc2l6ZW9mKHRtcCkgPD0gZ2V0X2wxX2NvZGVfc3RhcnQoKSArIEwxX0NPREVfTEVOR1RIKSB7CiAJCQkJc2FmZV9kbWFfbWVtY3B5ICgmdG1wLCAoY29uc3Qgdm9pZCAqKShhZGRyKSwgc2l6ZW9mKHRtcCkpOwogCQkJCWNvcGllZCA9IHNpemVvZih0bXApOwogCkBAIC0zMDAsOCArMzAzLDggQEAKIAkJCQlicmVhazsKIAkJCXByX2RlYnVnKCJwdHJhY2U6IHVzZXIgYWRkcmVzcyBpcyB2YWxpZFxuIik7CiAKLQkJCWlmIChMMV9DT0RFX0xFTkdUSCAhPSAwICYmIGFkZHIgPj0gTDFfQ09ERV9TVEFSVAotCQkJICAgICYmIGFkZHIgKyBzaXplb2YoZGF0YSkgPD0gTDFfQ09ERV9TVEFSVCArIEwxX0NPREVfTEVOR1RIKSB7CisJCQlpZiAoTDFfQ09ERV9MRU5HVEggIT0gMCAmJiBhZGRyID49IGdldF9sMV9jb2RlX3N0YXJ0KCkKKwkJCSAgICAmJiBhZGRyICsgc2l6ZW9mKGRhdGEpIDw9IGdldF9sMV9jb2RlX3N0YXJ0KCkgKyBMMV9DT0RFX0xFTkdUSCkgewogCQkJCXNhZmVfZG1hX21lbWNweSAoKHZvaWQgKikoYWRkciksICZkYXRhLCBzaXplb2YoZGF0YSkpOwogCQkJCWNvcGllZCA9IHNpemVvZihkYXRhKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwvcmVib290LmMgYi9hcmNoL2JsYWNrZmluL2tlcm5lbC9yZWJvb3QuYwppbmRleCBhZTk3Y2E0Li5lZWVlOGNiIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2tlcm5lbC9yZWJvb3QuYworKysgYi9hcmNoL2JsYWNrZmluL2tlcm5lbC9yZWJvb3QuYwpAQCAtMjEsNyArMjEsNyBAQAogICogdGhlIGNvcmUgcmVzZXQuCiAgKi8KIF9fYXR0cmlidXRlX18oKGwxX3RleHQpKQotc3RhdGljIHZvaWQgYmZpbl9yZXNldCh2b2lkKQorc3RhdGljIHZvaWQgX2JmaW5fcmVzZXQodm9pZCkKIHsKIAkvKiBXYWl0IGZvciBjb21wbGV0aW9uIG9mICJzeXN0ZW0iIGV2ZW50cyBzdWNoIGFzIGNhY2hlIGxpbmUKIAkgKiBsaW5lIGZpbGxzIHNvIHRoYXQgd2UgYXZvaWQgaW5maW5pdGUgc3RhbGxzIGxhdGVyIG9uIGFzCkBAIC02Niw2ICs2NiwxOCBAQAogCX0KIH0KIAorc3RhdGljIHZvaWQgYmZpbl9yZXNldCh2b2lkKQoreworCWlmIChBTk9NQUxZXzA1MDAwMzUzIHx8IEFOT01BTFlfMDUwMDAzODYpCisJCV9iZmluX3Jlc2V0KCk7CisJZWxzZQorCQkvKiB0aGUgYm9vdHJvbSBjaGVja3MgdG8gc2VlIGhvdyBpdCB3YXMgcmVzZXQgYW5kIHdpbGwKKwkJICogYXV0b21hdGljYWxseSBwZXJmb3JtIGEgc29mdHdhcmUgcmVzZXQgZm9yIHVzIHdoZW4KKwkJICogaXQgc3RhcnRzIGV4ZWN1dGluZyBib290CisJCSAqLworCQlhc20oInJhaXNlIDE7Iik7Cit9CisKIF9fYXR0cmlidXRlX18oKHdlYWspKQogdm9pZCBuYXRpdmVfbWFjaGluZV9yZXN0YXJ0KGNoYXIgKmNtZCkKIHsKQEAgLTc1LDE0ICs4NywxMCBAQAogewogCW5hdGl2ZV9tYWNoaW5lX3Jlc3RhcnQoY21kKTsKIAlsb2NhbF9pcnFfZGlzYWJsZSgpOwotCWlmIChBTk9NQUxZXzA1MDAwMzUzIHx8IEFOT01BTFlfMDUwMDAzODYpCi0JCWJmaW5fcmVzZXQoKTsKKwlpZiAoc21wX3Byb2Nlc3Nvcl9pZCgpKQorCQlzbXBfY2FsbF9mdW5jdGlvbigodm9pZCAqKWJmaW5fcmVzZXQsIDAsIDEpOwogCWVsc2UKLQkJLyogdGhlIGJvb3Ryb20gY2hlY2tzIHRvIHNlZSBob3cgaXQgd2FzIHJlc2V0IGFuZCB3aWxsCi0JCSAqIGF1dG9tYXRpY2FsbHkgcGVyZm9ybSBhIHNvZnR3YXJlIHJlc2V0IGZvciB1cyB3aGVuCi0JCSAqIGl0IHN0YXJ0cyBleGVjdXRpbmcgYm9vdAotCQkgKi8KLQkJYXNtKCJyYWlzZSAxOyIpOworCQliZmluX3Jlc2V0KCk7CiB9CiAKIF9fYXR0cmlidXRlX18oKHdlYWspKQpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwvc2V0dXAuYyBiL2FyY2gvYmxhY2tmaW4va2VybmVsL3NldHVwLmMKaW5kZXggNzFhOWE4Yy4uYjJhODExMyAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwvc2V0dXAuYworKysgYi9hcmNoL2JsYWNrZmluL2tlcm5lbC9zZXR1cC5jCkBAIC0xMyw2ICsxMyw3IEBACiAjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvY3B1Lmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC90dHkuaD4KICNpbmNsdWRlIDxsaW51eC9wZm4uaD4KQEAgLTI2LDExICsyNywxMCBAQAogI2luY2x1ZGUgPGFzbS9ibGFja2Zpbi5oPgogI2luY2x1ZGUgPGFzbS9jcGxiaW5pdC5oPgogI2luY2x1ZGUgPGFzbS9kaXY2NC5oPgorI2luY2x1ZGUgPGFzbS9jcHUuaD4KICNpbmNsdWRlIDxhc20vZml4ZWRfY29kZS5oPgogI2luY2x1ZGUgPGFzbS9lYXJseV9wcmludGsuaD4KIAotc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBjcHUsIGNwdV9kZXZpY2VzKTsKLQogdTE2IF9iZmluX3N3cnN0OwogRVhQT1JUX1NZTUJPTChfYmZpbl9zd3JzdCk7CiAKQEAgLTc5LDI5ICs3OSw3MCBAQAogc3RhdGljIHN0cnVjdCBiZmluX21lbW1hcF9lbnRyeSAqb3ZlcmxhcF9saXN0W0JGSU5fTUVNTUFQX01BWF0gX19pbml0ZGF0YTsKIHN0YXRpYyBzdHJ1Y3QgYmZpbl9tZW1tYXBfZW50cnkgbmV3X21hcFtCRklOX01FTU1BUF9NQVhdIF9faW5pdGRhdGE7CiAKLXZvaWQgX19pbml0IGJmaW5fY2FjaGVfaW5pdCh2b2lkKQoteworREVGSU5FX1BFUl9DUFUoc3RydWN0IGJsYWNrZmluX2NwdWRhdGEsIGNwdV9kYXRhKTsKKworc3RhdGljIGludCBlYXJseV9pbml0X2Nsa2luX2h6KGNoYXIgKmJ1Zik7CisKICNpZiBkZWZpbmVkKENPTkZJR19CRklOX0RDQUNIRSkgfHwgZGVmaW5lZChDT05GSUdfQkZJTl9JQ0FDSEUpCi0JZ2VuZXJhdGVfY3BsYl90YWJsZXMoKTsKK3ZvaWQgX19pbml0IGdlbmVyYXRlX2NwbGJfdGFibGVzKHZvaWQpCit7CisJdW5zaWduZWQgaW50IGNwdTsKKworCWdlbmVyYXRlX2NwbGJfdGFibGVzX2FsbCgpOworCS8qIEdlbmVyYXRlIHBlci1DUFUgSSZEIENQTEIgdGFibGVzICovCisJZm9yIChjcHUgPSAwOyBjcHUgPCBudW1fcG9zc2libGVfY3B1cygpOyArK2NwdSkKKwkJZ2VuZXJhdGVfY3BsYl90YWJsZXNfY3B1KGNwdSk7Cit9CiAjZW5kaWYKIAordm9pZCBfX2NwdWluaXQgYmZpbl9zZXR1cF9jYWNoZXModW5zaWduZWQgaW50IGNwdSkKK3sKICNpZmRlZiBDT05GSUdfQkZJTl9JQ0FDSEUKLQliZmluX2ljYWNoZV9pbml0KCk7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiSW5zdHJ1Y3Rpb24gQ2FjaGUgRW5hYmxlZFxuIik7CisJYmZpbl9pY2FjaGVfaW5pdChpY3BsYl90YmxbY3B1XSk7CiAjZW5kaWYKIAogI2lmZGVmIENPTkZJR19CRklOX0RDQUNIRQotCWJmaW5fZGNhY2hlX2luaXQoKTsKLQlwcmludGsoS0VSTl9JTkZPICJEYXRhIENhY2hlIEVuYWJsZWQiCisJYmZpbl9kY2FjaGVfaW5pdChkY3BsYl90YmxbY3B1XSk7CisjZW5kaWYKKworCS8qCisJICogSW4gY2FjaGUgY29oZXJlbmNlIGVtdWxhdGlvbiBtb2RlLCB3ZSBuZWVkIHRvIGhhdmUgdGhlCisJICogRC1jYWNoZSBlbmFibGVkIGJlZm9yZSBydW5uaW5nIGFueSBhdG9taWMgb3BlcmF0aW9uIHdoaWNoCisJICogbWlnaHQgaW52b3ZlIGNhY2hlIGludmFsaWRhdGlvbiAoaS5lLiBzcGlubG9jaywgcndsb2NrKS4KKwkgKiBTbyBwcmludGsncyBhcmUgZGVmZXJyZWQgdW50aWwgdGhlbi4KKwkgKi8KKyNpZmRlZiBDT05GSUdfQkZJTl9JQ0FDSEUKKwlwcmludGsoS0VSTl9JTkZPICJJbnN0cnVjdGlvbiBDYWNoZSBFbmFibGVkIGZvciBDUFUldVxuIiwgY3B1KTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19CRklOX0RDQUNIRQorCXByaW50ayhLRVJOX0lORk8gIkRhdGEgQ2FjaGUgRW5hYmxlZCBmb3IgQ1BVJXUiCiAjIGlmIGRlZmluZWQgQ09ORklHX0JGSU5fV0IKIAkJIiAod3JpdGUtYmFjaykiCiAjIGVsaWYgZGVmaW5lZCBDT05GSUdfQkZJTl9XVAogCQkiICh3cml0ZS10aHJvdWdoKSIKICMgZW5kaWYKLQkJIlxuIik7CisJCSJcbiIsIGNwdSk7CiAjZW5kaWYKIH0KIAordm9pZCBfX2NwdWluaXQgYmZpbl9zZXR1cF9jcHVkYXRhKHVuc2lnbmVkIGludCBjcHUpCit7CisJc3RydWN0IGJsYWNrZmluX2NwdWRhdGEgKmNwdWRhdGEgPSAmcGVyX2NwdShjcHVfZGF0YSwgY3B1KTsKKworCWNwdWRhdGEtPmlkbGUgPSBjdXJyZW50OworCWNwdWRhdGEtPmxvb3BzX3Blcl9qaWZmeSA9IGxvb3BzX3Blcl9qaWZmeTsKKwljcHVkYXRhLT5pbWVtY3RsID0gYmZpbl9yZWFkX0lNRU1fQ09OVFJPTCgpOworCWNwdWRhdGEtPmRtZW1jdGwgPSBiZmluX3JlYWRfRE1FTV9DT05UUk9MKCk7Cit9CisKK3ZvaWQgX19pbml0IGJmaW5fY2FjaGVfaW5pdCh2b2lkKQoreworI2lmIGRlZmluZWQoQ09ORklHX0JGSU5fRENBQ0hFKSB8fCBkZWZpbmVkKENPTkZJR19CRklOX0lDQUNIRSkKKwlnZW5lcmF0ZV9jcGxiX3RhYmxlcygpOworI2VuZGlmCisJYmZpbl9zZXR1cF9jYWNoZXMoMCk7Cit9CisKIHZvaWQgX19pbml0IGJmaW5fcmVsb2NhdGVfbDFfbWVtKHZvaWQpCiB7CiAJdW5zaWduZWQgbG9uZyBsMV9jb2RlX2xlbmd0aDsKQEAgLTEwOSw2ICsxNTAsOCBAQAogCXVuc2lnbmVkIGxvbmcgbDFfZGF0YV9iX2xlbmd0aDsKIAl1bnNpZ25lZCBsb25nIGwyX2xlbmd0aDsKIAorCWJsYWNrZmluX2RtYV9lYXJseV9pbml0KCk7CisKIAlsMV9jb2RlX2xlbmd0aCA9IF9ldGV4dF9sMSAtIF9zdGV4dF9sMTsKIAlpZiAobDFfY29kZV9sZW5ndGggPiBMMV9DT0RFX0xFTkdUSCkKIAkJcGFuaWMoIkwxIEluc3RydWN0aW9uIFNSQU0gT3ZlcmZsb3dcbiIpOwpAQCAtMjMwLDcgKzI3Myw3IEBACiAJLyogcmVjb3JkIGFsbCBrbm93biBjaGFuZ2UtcG9pbnRzIChzdGFydGluZyBhbmQgZW5kaW5nIGFkZHJlc3NlcyksCiAJICAgb21pdHRpbmcgdGhvc2UgdGhhdCBhcmUgZm9yIGVtcHR5IG1lbW9yeSByZWdpb25zICovCiAJY2hnaWR4ID0gMDsKLQlmb3IgKGkgPSAwOyBpIDwgb2xkX25yOyBpKyspCXsKKwlmb3IgKGkgPSAwOyBpIDwgb2xkX25yOyBpKyspIHsKIAkJaWYgKG1hcFtpXS5zaXplICE9IDApIHsKIAkJCWNoYW5nZV9wb2ludFtjaGdpZHhdLT5hZGRyID0gbWFwW2ldLmFkZHI7CiAJCQljaGFuZ2VfcG9pbnRbY2hnaWR4KytdLT5wZW50cnkgPSAmbWFwW2ldOwpAQCAtMjM4LDEzICsyODEsMTMgQEAKIAkJCWNoYW5nZV9wb2ludFtjaGdpZHgrK10tPnBlbnRyeSA9ICZtYXBbaV07CiAJCX0KIAl9Ci0JY2hnX25yID0gY2hnaWR4OyAgICAJLyogdHJ1ZSBudW1iZXIgb2YgY2hhbmdlLXBvaW50cyAqLworCWNoZ19uciA9IGNoZ2lkeDsJLyogdHJ1ZSBudW1iZXIgb2YgY2hhbmdlLXBvaW50cyAqLwogCiAJLyogc29ydCBjaGFuZ2UtcG9pbnQgbGlzdCBieSBtZW1vcnkgYWRkcmVzc2VzIChsb3cgLT4gaGlnaCkgKi8KIAlzdGlsbF9jaGFuZ2luZyA9IDE7Ci0Jd2hpbGUgKHN0aWxsX2NoYW5naW5nKQl7CisJd2hpbGUgKHN0aWxsX2NoYW5naW5nKSB7CiAJCXN0aWxsX2NoYW5naW5nID0gMDsKLQkJZm9yIChpID0gMTsgaSA8IGNoZ19ucjsgaSsrKSAgeworCQlmb3IgKGkgPSAxOyBpIDwgY2hnX25yOyBpKyspIHsKIAkJCS8qIGlmIDxjdXJyZW50X2FkZHI+ID4gPGxhc3RfYWRkcj4sIHN3YXAgKi8KIAkJCS8qIG9yLCBpZiBjdXJyZW50PTxzdGFydF9hZGRyPiAmIGxhc3Q9PGVuZF9hZGRyPiwgc3dhcCAqLwogCQkJaWYgKChjaGFuZ2VfcG9pbnRbaV0tPmFkZHIgPCBjaGFuZ2VfcG9pbnRbaS0xXS0+YWRkcikgfHwKQEAgLTI2MSwxMCArMzA0LDEwIEBACiAJfQogCiAJLyogY3JlYXRlIGEgbmV3IG1lbW1hcCwgcmVtb3Zpbmcgb3ZlcmxhcHMgKi8KLQlvdmVybGFwX2VudHJpZXMgPSAwOwkgLyogbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIG92ZXJsYXAgdGFibGUgKi8KLQluZXdfZW50cnkgPSAwOwkgLyogaW5kZXggZm9yIGNyZWF0aW5nIG5ldyBtZW1tYXAgZW50cmllcyAqLwotCWxhc3RfdHlwZSA9IDA7CQkgLyogc3RhcnQgd2l0aCB1bmRlZmluZWQgbWVtb3J5IHR5cGUgKi8KLQlsYXN0X2FkZHIgPSAwOwkJIC8qIHN0YXJ0IHdpdGggMCBhcyBsYXN0IHN0YXJ0aW5nIGFkZHJlc3MgKi8KKwlvdmVybGFwX2VudHJpZXMgPSAwOwkvKiBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgb3ZlcmxhcCB0YWJsZSAqLworCW5ld19lbnRyeSA9IDA7CQkvKiBpbmRleCBmb3IgY3JlYXRpbmcgbmV3IG1lbW1hcCBlbnRyaWVzICovCisJbGFzdF90eXBlID0gMDsJCS8qIHN0YXJ0IHdpdGggdW5kZWZpbmVkIG1lbW9yeSB0eXBlICovCisJbGFzdF9hZGRyID0gMDsJCS8qIHN0YXJ0IHdpdGggMCBhcyBsYXN0IHN0YXJ0aW5nIGFkZHJlc3MgKi8KIAkvKiBsb29wIHRocm91Z2ggY2hhbmdlLXBvaW50cywgZGV0ZXJtaW5pbmcgYWZmZWN0IG9uIHRoZSBuZXcgbWVtbWFwICovCiAJZm9yIChjaGdpZHggPSAwOyBjaGdpZHggPCBjaGdfbnI7IGNoZ2lkeCsrKSB7CiAJCS8qIGtlZXAgdHJhY2sgb2YgYWxsIG92ZXJsYXBwaW5nIG1lbW1hcCBlbnRyaWVzICovCkBAIC0yODYsMTQgKzMyOSwxNCBAQAogCQkJaWYgKG92ZXJsYXBfbGlzdFtpXS0+dHlwZSA+IGN1cnJlbnRfdHlwZSkKIAkJCQljdXJyZW50X3R5cGUgPSBvdmVybGFwX2xpc3RbaV0tPnR5cGU7CiAJCS8qIGNvbnRpbnVlIGJ1aWxkaW5nIHVwIG5ldyBtZW1tYXAgYmFzZWQgb24gdGhpcyBpbmZvcm1hdGlvbiAqLwotCQlpZiAoY3VycmVudF90eXBlICE9IGxhc3RfdHlwZSkJeworCQlpZiAoY3VycmVudF90eXBlICE9IGxhc3RfdHlwZSkgewogCQkJaWYgKGxhc3RfdHlwZSAhPSAwKSB7CiAJCQkJbmV3X21hcFtuZXdfZW50cnldLnNpemUgPQogCQkJCQljaGFuZ2VfcG9pbnRbY2hnaWR4XS0+YWRkciAtIGxhc3RfYWRkcjsKIAkJCQkvKiBtb3ZlIGZvcndhcmQgb25seSBpZiB0aGUgbmV3IHNpemUgd2FzIG5vbi16ZXJvICovCiAJCQkJaWYgKG5ld19tYXBbbmV3X2VudHJ5XS5zaXplICE9IDApCiAJCQkJCWlmICgrK25ld19lbnRyeSA+PSBCRklOX01FTU1BUF9NQVgpCi0JCQkJCQlicmVhazsgCS8qIG5vIG1vcmUgc3BhY2UgbGVmdCBmb3IgbmV3IGVudHJpZXMgKi8KKwkJCQkJCWJyZWFrOwkvKiBubyBtb3JlIHNwYWNlIGxlZnQgZm9yIG5ldyBlbnRyaWVzICovCiAJCQl9CiAJCQlpZiAoY3VycmVudF90eXBlICE9IDApIHsKIAkJCQluZXdfbWFwW25ld19lbnRyeV0uYWRkciA9IGNoYW5nZV9wb2ludFtjaGdpZHhdLT5hZGRyOwpAQCAtMzAzLDkgKzM0Niw5IEBACiAJCQlsYXN0X3R5cGUgPSBjdXJyZW50X3R5cGU7CiAJCX0KIAl9Ci0JbmV3X25yID0gbmV3X2VudHJ5OyAgIC8qIHJldGFpbiBjb3VudCBmb3IgbmV3IGVudHJpZXMgKi8KKwluZXdfbnIgPSBuZXdfZW50cnk7CS8qIHJldGFpbiBjb3VudCBmb3IgbmV3IGVudHJpZXMgKi8KIAotCS8qIGNvcHkgbmV3ICBtYXBwaW5nIGludG8gb3JpZ2luYWwgbG9jYXRpb24gKi8KKwkvKiBjb3B5IG5ldyBtYXBwaW5nIGludG8gb3JpZ2luYWwgbG9jYXRpb24gKi8KIAltZW1jcHkobWFwLCBuZXdfbWFwLCBuZXdfbnIqc2l6ZW9mKHN0cnVjdCBiZmluX21lbW1hcF9lbnRyeSkpOwogCSpwbnJfbWFwID0gbmV3X25yOwogCkBAIC0zNjEsNyArNDA0LDYgQEAKICAqICAtICJtZW1tYXA9WFhYW0trbU1dW0BdWyRdWFhYW0trbU1dIiBkZWZpbmVzIGEgbWVtb3J5IHJlZ2lvbgogICogICAgICAgQCBmcm9tIDxzdGFydD4gdG8gPHN0YXJ0Pis8bWVtPiwgdHlwZSBSQU0KICAqICAgICAgICQgZnJvbSA8c3RhcnQ+IHRvIDxzdGFydD4rPG1lbT4sIHR5cGUgUkVTRVJWRUQKLSAqCiAgKi8KIHN0YXRpYyBfX2luaXQgdm9pZCBwYXJzZV9jbWRsaW5lX2Vhcmx5KGNoYXIgKmNtZGxpbmVfcCkKIHsKQEAgLTM4MywxNCArNDI1LDE1IEBACiAJCQkJCWlmICgqdG8gIT0gJyAnKSB7CiAJCQkJCQlpZiAoKnRvID09ICckJwogCQkJCQkJICAgIHx8ICoodG8gKyAxKSA9PSAnJCcpCi0JCQkJCQkJcmVzZXJ2ZWRfbWVtX2RjYWNoZV9vbiA9Ci0JCQkJCQkJICAgIDE7CisJCQkJCQkJcmVzZXJ2ZWRfbWVtX2RjYWNoZV9vbiA9IDE7CiAJCQkJCQlpZiAoKnRvID09ICcjJwogCQkJCQkJICAgIHx8ICoodG8gKyAxKSA9PSAnIycpCi0JCQkJCQkJcmVzZXJ2ZWRfbWVtX2ljYWNoZV9vbiA9Ci0JCQkJCQkJICAgIDE7CisJCQkJCQkJcmVzZXJ2ZWRfbWVtX2ljYWNoZV9vbiA9IDE7CiAJCQkJCX0KIAkJCQl9CisJCQl9IGVsc2UgaWYgKCFtZW1jbXAodG8sICJjbGtpbl9oej0iLCA5KSkgeworCQkJCXRvICs9IDk7CisJCQkJZWFybHlfaW5pdF9jbGtpbl9oeih0byk7CiAJCQl9IGVsc2UgaWYgKCFtZW1jbXAodG8sICJlYXJseXByaW50az0iLCAxMikpIHsKIAkJCQl0byArPSAxMjsKIAkJCQlzZXR1cF9lYXJseV9wcmludGsodG8pOwpAQCAtNDE3LDkgKzQ2MCw4IEBACiAgKglbX3JhbWVuZCAtIERNQV9VTkNBQ0hFRF9SRUdJT04sCiAgKgkJX3JhbWVuZF06CQkJdW5jYWNoZWQgRE1BIHJlZ2lvbgogICogIFtfcmFtZW5kLCBwaHlzaWNhbF9tZW1fZW5kXToJbWVtb3J5IG5vdCBtYW5hZ2VkIGJ5IGtlcm5lbAotICoKICAqLwotc3RhdGljIF9faW5pdCB2b2lkICBtZW1vcnlfc2V0dXAodm9pZCkKK3N0YXRpYyBfX2luaXQgdm9pZCBtZW1vcnlfc2V0dXAodm9pZCkKIHsKICNpZmRlZiBDT05GSUdfTVREX1VDTElOVVgKIAl1bnNpZ25lZCBsb25nIG10ZF9waHlzID0gMDsKQEAgLTQzNiw3ICs0NzgsNyBAQAogCW1lbW9yeV9lbmQgPSBfcmFtZW5kIC0gRE1BX1VOQ0FDSEVEX1JFR0lPTjsKIAogI2lmZGVmIENPTkZJR19NUFUKLQkvKiBSb3VuZCB1cCB0byBtdWx0aXBsZSBvZiA0TUIuICAqLworCS8qIFJvdW5kIHVwIHRvIG11bHRpcGxlIG9mIDRNQiAqLwogCW1lbW9yeV9zdGFydCA9IChfcmFtc3RhcnQgKyAweDNmZmZmZikgJiB+MHgzZmZmZmY7CiAjZWxzZQogCW1lbW9yeV9zdGFydCA9IFBBR0VfQUxJR04oX3JhbXN0YXJ0KTsKQEAgLTYxNiw3ICs2NTgsNyBAQAogCWVuZF9wZm4gPSBtZW1vcnlfZW5kID4+IFBBR0VfU0hJRlQ7CiAKIAkvKgotCSAqIGdpdmUgYWxsIHRoZSBtZW1vcnkgdG8gdGhlIGJvb3RtYXAgYWxsb2NhdG9yLCAgdGVsbCBpdCB0byBwdXQgdGhlCisJICogZ2l2ZSBhbGwgdGhlIG1lbW9yeSB0byB0aGUgYm9vdG1hcCBhbGxvY2F0b3IsIHRlbGwgaXQgdG8gcHV0IHRoZQogCSAqIGJvb3QgbWVtX21hcCBhdCB0aGUgc3RhcnQgb2YgbWVtb3J5LgogCSAqLwogCWJvb3RtYXBfc2l6ZSA9IGluaXRfYm9vdG1lbV9ub2RlKE5PREVfREFUQSgwKSwKQEAgLTc5MSw3ICs4MzMsMTEgQEAKIAliZmluX3dyaXRlX1NXUlNUKF9iZmluX3N3cnN0IHwgRE9VQkxFX0ZBVUxUKTsKICNlbmRpZgogCisjaWZkZWYgQ09ORklHX1NNUAorCWlmIChfYmZpbl9zd3JzdCAmIFNXUlNUX0RCTF9GQVVMVF9BKSB7CisjZWxzZQogCWlmIChfYmZpbl9zd3JzdCAmIFJFU0VUX0RPVUJMRSkgeworI2VuZGlmCiAJCXByaW50ayhLRVJOX0VNRVJHICJSZWNvdmVyaW5nIGZyb20gRE9VQkxFIEZBVUxUIGV2ZW50XG4iKTsKICNpZmRlZiBDT05GSUdfREVCVUdfRE9VQkxFRkFVTFQKIAkJLyogV2UgYXNzdW1lIHRoZSBjcmFzaGluZyBrZXJuZWwsIGFuZCB0aGUgY3VycmVudCBzeW1ib2wgdGFibGUgbWF0Y2ggKi8KQEAgLTgyMyw5ICs4NjksMTIgQEAKIAkJCWlmIChiZmluX2NvbXBpbGVkX3JldmlkKCkgPT0gLTEpCiAJCQkJcHJpbnRrKEtFUk5fRVJSICJXYXJuaW5nOiBDb21waWxlZCBmb3IgUmV2IG5vbmUsIGJ1dCBydW5uaW5nIG9uIFJldiAlZFxuIiwKIAkJCQkgICAgICAgYmZpbl9yZXZpZCgpKTsKLQkJCWVsc2UgaWYgKGJmaW5fY29tcGlsZWRfcmV2aWQoKSAhPSAweGZmZmYpCisJCQllbHNlIGlmIChiZmluX2NvbXBpbGVkX3JldmlkKCkgIT0gMHhmZmZmKSB7CiAJCQkJcHJpbnRrKEtFUk5fRVJSICJXYXJuaW5nOiBDb21waWxlZCBmb3IgUmV2ICVkLCBidXQgcnVubmluZyBvbiBSZXYgJWRcbiIsCiAJCQkJICAgICAgIGJmaW5fY29tcGlsZWRfcmV2aWQoKSwgYmZpbl9yZXZpZCgpKTsKKwkJCQlpZiAoYmZpbl9jb21waWxlZF9yZXZpZCgpID4gYmZpbl9yZXZpZCgpKQorCQkJCQlwYW5pYygiRXJyb3I6IHlvdSBhcmUgbWlzc2luZyBhbm9tYWx5IHdvcmthcm91bmRzIGZvciB0aGlzIHJldlxuIik7CisJCQl9CiAJCX0KIAkJaWYgKGJmaW5fcmV2aWQoKSA8IENPTkZJR19CRl9SRVZfTUlOIHx8IGJmaW5fcmV2aWQoKSA+IENPTkZJR19CRl9SRVZfTUFYKQogCQkJcHJpbnRrKEtFUk5fRVJSICJXYXJuaW5nOiBVbnN1cHBvcnRlZCBDaGlwIFJldmlzaW9uIEFEU1AtJXMgUmV2IDAuJWQgZGV0ZWN0ZWRcbiIsCkBAIC04MzUsNyArODg0LDcgQEAKIAlwcmludGsoS0VSTl9JTkZPICJCbGFja2ZpbiBMaW51eCBzdXBwb3J0IGJ5IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy9cbiIpOwogCiAJcHJpbnRrKEtFUk5fSU5GTyAiUHJvY2Vzc29yIFNwZWVkOiAlbHUgTUh6IGNvcmUgY2xvY2sgYW5kICVsdSBNSHogU3lzdGVtIENsb2NrXG4iLAotCSAgICAgICBjY2xrIC8gMTAwMDAwMCwgIHNjbGsgLyAxMDAwMDAwKTsKKwkgICAgICAgY2NsayAvIDEwMDAwMDAsIHNjbGsgLyAxMDAwMDAwKTsKIAogCWlmIChBTk9NQUxZXzA1MDAwMjczICYmIChjY2xrID4+IDEpIDw9IHNjbGspCiAJCXByaW50aygiXG5cblxuQU5PTUFMWV8wNTAwMDI3MzogQ0NMSyBtdXN0IGJlID49IDIqU0NMSyAhISFcblxuXG4iKTsKQEAgLTg2NywxOCArOTE2LDIxIEBACiAJQlVHX09OKChjaGFyICopJnNhZmVfdXNlcl9pbnN0cnVjdGlvbiAtIChjaGFyICopJmZpeGVkX2NvZGVfc3RhcnQKIAkJIT0gU0FGRV9VU0VSX0lOU1RSVUNUSU9OIC0gRklYRURfQ09ERV9TVEFSVCk7CiAKKyNpZmRlZiBDT05GSUdfU01QCisJcGxhdGZvcm1faW5pdF9jcHVzKCk7CisjZW5kaWYKIAlpbml0X2V4Y2VwdGlvbl92ZWN0b3JzKCk7Ci0JYmZpbl9jYWNoZV9pbml0KCk7CisJYmZpbl9jYWNoZV9pbml0KCk7CS8qIEluaXRpYWxpemUgY2FjaGVzIGZvciB0aGUgYm9vdCBDUFUgKi8KIH0KIAogc3RhdGljIGludCBfX2luaXQgdG9wb2xvZ3lfaW5pdCh2b2lkKQogewotCWludCBjcHU7CisJdW5zaWduZWQgaW50IGNwdTsKKwkvKiBSZWNvcmQgQ1BVLXByaXZhdGUgaW5mb3JtYXRpb24gZm9yIHRoZSBib290IHByb2Nlc3Nvci4gKi8KKwliZmluX3NldHVwX2NwdWRhdGEoMCk7CiAKIAlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoY3B1KSB7Ci0JCXN0cnVjdCBjcHUgKmMgPSAmcGVyX2NwdShjcHVfZGV2aWNlcywgY3B1KTsKLQotCQlyZWdpc3Rlcl9jcHUoYywgY3B1KTsKKwkJcmVnaXN0ZXJfY3B1KCZwZXJfY3B1KGNwdV9kYXRhLCBjcHUpLmNwdSwgY3B1KTsKIAl9CiAKIAlyZXR1cm4gMDsKQEAgLTg4NiwzNiArOTM4LDU0IEBACiAKIHN1YnN5c19pbml0Y2FsbCh0b3BvbG9neV9pbml0KTsKIAorLyogR2V0IHRoZSBpbnB1dCBjbG9jayBmcmVxdWVuY3kgKi8KK3N0YXRpYyB1X2xvbmcgY2FjaGVkX2Nsa2luX2h6ID0gQ09ORklHX0NMS0lOX0haOworc3RhdGljIHVfbG9uZyBnZXRfY2xraW5faHoodm9pZCkKK3sKKwlyZXR1cm4gY2FjaGVkX2Nsa2luX2h6OworfQorc3RhdGljIGludCBfX2luaXQgZWFybHlfaW5pdF9jbGtpbl9oeihjaGFyICpidWYpCit7CisJY2FjaGVkX2Nsa2luX2h6ID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAwKTsKKyNpZmRlZiBCRklOX0tFUk5FTF9DTE9DSworCWlmIChjYWNoZWRfY2xraW5faHogIT0gQ09ORklHX0NMS0lOX0haKQorCQlwYW5pYygiY2Fubm90IGNoYW5nZSBjbGtpbl9oeiB3aGVuIHJlcHJvZ3JhbW1pbmcgY2xvY2tzIik7CisjZW5kaWYKKwlyZXR1cm4gMTsKK30KK2Vhcmx5X3BhcmFtKCJjbGtpbl9oej0iLCBlYXJseV9pbml0X2Nsa2luX2h6KTsKKwogLyogR2V0IHRoZSB2b2x0YWdlIGlucHV0IG11bHRpcGxpZXIgKi8KLXN0YXRpYyB1X2xvbmcgY2FjaGVkX3Zjb19wbGxfY3RsLCBjYWNoZWRfdmNvOwogc3RhdGljIHVfbG9uZyBnZXRfdmNvKHZvaWQpCiB7Ci0JdV9sb25nIG1zZWw7CisJc3RhdGljIHVfbG9uZyBjYWNoZWRfdmNvOworCXVfbG9uZyBtc2VsLCBwbGxfY3RsOwogCi0JdV9sb25nIHBsbF9jdGwgPSBiZmluX3JlYWRfUExMX0NUTCgpOwotCWlmIChwbGxfY3RsID09IGNhY2hlZF92Y29fcGxsX2N0bCkKKwkvKiBUaGUgYXNzdW1wdGlvbiBoZXJlIGlzIHRoYXQgVkNPIG5ldmVyIGNoYW5nZXMgYXQgcnVudGltZS4KKwkgKiBJZiwgc29tZWRheSwgd2Ugc3VwcG9ydCB0aGF0LCB0aGVuIHdlJ2xsIGhhdmUgdG8gY2hhbmdlIHRoaXMuCisJICovCisJaWYgKGNhY2hlZF92Y28pCiAJCXJldHVybiBjYWNoZWRfdmNvOwotCWVsc2UKLQkJY2FjaGVkX3Zjb19wbGxfY3RsID0gcGxsX2N0bDsKIAorCXBsbF9jdGwgPSBiZmluX3JlYWRfUExMX0NUTCgpOwogCW1zZWwgPSAocGxsX2N0bCA+PiA5KSAmIDB4M0Y7CiAJaWYgKDAgPT0gbXNlbCkKIAkJbXNlbCA9IDY0OwogCi0JY2FjaGVkX3ZjbyA9IENPTkZJR19DTEtJTl9IWjsKKwljYWNoZWRfdmNvID0gZ2V0X2Nsa2luX2h6KCk7CiAJY2FjaGVkX3ZjbyA+Pj0gKDEgJiBwbGxfY3RsKTsJLyogREYgYml0ICovCiAJY2FjaGVkX3ZjbyAqPSBtc2VsOwogCXJldHVybiBjYWNoZWRfdmNvOwogfQogCiAvKiBHZXQgdGhlIENvcmUgY2xvY2sgKi8KLXN0YXRpYyB1X2xvbmcgY2FjaGVkX2NjbGtfcGxsX2RpdiwgY2FjaGVkX2NjbGs7CiB1X2xvbmcgZ2V0X2NjbGsodm9pZCkKIHsKKwlzdGF0aWMgdV9sb25nIGNhY2hlZF9jY2xrX3BsbF9kaXYsIGNhY2hlZF9jY2xrOwogCXVfbG9uZyBjc2VsLCBzc2VsOwogCiAJaWYgKGJmaW5fcmVhZF9QTExfU1RBVCgpICYgMHgxKQotCQlyZXR1cm4gQ09ORklHX0NMS0lOX0haOworCQlyZXR1cm4gZ2V0X2Nsa2luX2h6KCk7CiAKIAlzc2VsID0gYmZpbl9yZWFkX1BMTF9ESVYoKTsKIAlpZiAoc3NlbCA9PSBjYWNoZWRfY2Nsa19wbGxfZGl2KQpAQCAtOTM0LDIxICsxMDA0LDIxIEBACiBFWFBPUlRfU1lNQk9MKGdldF9jY2xrKTsKIAogLyogR2V0IHRoZSBTeXN0ZW0gY2xvY2sgKi8KLXN0YXRpYyB1X2xvbmcgY2FjaGVkX3NjbGtfcGxsX2RpdiwgY2FjaGVkX3NjbGs7CiB1X2xvbmcgZ2V0X3NjbGsodm9pZCkKIHsKKwlzdGF0aWMgdV9sb25nIGNhY2hlZF9zY2xrOwogCXVfbG9uZyBzc2VsOwogCi0JaWYgKGJmaW5fcmVhZF9QTExfU1RBVCgpICYgMHgxKQotCQlyZXR1cm4gQ09ORklHX0NMS0lOX0haOwotCi0Jc3NlbCA9IGJmaW5fcmVhZF9QTExfRElWKCk7Ci0JaWYgKHNzZWwgPT0gY2FjaGVkX3NjbGtfcGxsX2RpdikKKwkvKiBUaGUgYXNzdW1wdGlvbiBoZXJlIGlzIHRoYXQgU0NMSyBuZXZlciBjaGFuZ2VzIGF0IHJ1bnRpbWUuCisJICogSWYsIHNvbWVkYXksIHdlIHN1cHBvcnQgdGhhdCwgdGhlbiB3ZSdsbCBoYXZlIHRvIGNoYW5nZSB0aGlzLgorCSAqLworCWlmIChjYWNoZWRfc2NsaykKIAkJcmV0dXJuIGNhY2hlZF9zY2xrOwotCWVsc2UKLQkJY2FjaGVkX3NjbGtfcGxsX2RpdiA9IHNzZWw7CiAKLQlzc2VsICY9IDB4ZjsKKwlpZiAoYmZpbl9yZWFkX1BMTF9TVEFUKCkgJiAweDEpCisJCXJldHVybiBnZXRfY2xraW5faHooKTsKKworCXNzZWwgPSBiZmluX3JlYWRfUExMX0RJVigpICYgMHhmOwogCWlmICgwID09IHNzZWwpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiSW52YWxpZCBTeXN0ZW0gQ2xvY2tcbiIpOwogCQlzc2VsID0gMTsKQEAgLTk4MiwxNyArMTA1MiwxOCBAQAogewogCWNoYXIgKmNwdSwgKm1tdSwgKmZwdSwgKnZlbmRvciwgKmNhY2hlOwogCXVpbnQzMl90IHJldmlkOwotCi0JdV9sb25nIGNjbGsgPSAwLCBzY2xrID0gMDsKKwlpbnQgY3B1X251bSA9ICoodW5zaWduZWQgaW50ICopdjsKKwl1X2xvbmcgc2NsaywgY2NsazsKIAl1X2ludCBpY2FjaGVfc2l6ZSA9IEJGSU5fSUNBQ0hFU0laRSAvIDEwMjQsIGRjYWNoZV9zaXplID0gMCwgZHN1cF9iYW5rcyA9IDA7CisJc3RydWN0IGJsYWNrZmluX2NwdWRhdGEgKmNwdWRhdGEgPSAmcGVyX2NwdShjcHVfZGF0YSwgY3B1X251bSk7CiAKIAljcHUgPSBDUFU7CiAJbW11ID0gIm5vbmUiOwogCWZwdSA9ICJub25lIjsKIAlyZXZpZCA9IGJmaW5fcmV2aWQoKTsKIAotCWNjbGsgPSBnZXRfY2NsaygpOwogCXNjbGsgPSBnZXRfc2NsaygpOworCWNjbGsgPSBnZXRfY2NsaygpOwogCiAJc3dpdGNoIChiZmluX3JlYWRfQ0hJUElEKCkgJiBDSElQSURfTUFOVUZBQ1RVUkUpIHsKIAljYXNlIDB4Y2E6CkBAIC0xMDAzLDEwICsxMDc0LDcgQEAKIAkJYnJlYWs7CiAJfQogCi0Jc2VxX3ByaW50ZihtLCAicHJvY2Vzc29yXHQ6ICVkXG4iCi0JCSJ2ZW5kb3JfaWRcdDogJXNcbiIsCi0JCSoodW5zaWduZWQgaW50ICopdiwKLQkJdmVuZG9yKTsKKwlzZXFfcHJpbnRmKG0sICJwcm9jZXNzb3JcdDogJWRcbiIgInZlbmRvcl9pZFx0OiAlc1xuIiwgY3B1X251bSwgdmVuZG9yKTsKIAogCWlmIChDUFVJRCA9PSBiZmluX2NwdWlkKCkpCiAJCXNlcV9wcmludGYobSwgImNwdSBmYW1pbHlcdDogMHglMDR4XG4iLCBDUFVJRCk7CkBAIC0xMDI5LDEyICsxMDk3LDEyIEBACiAJCXNjbGsvMTAwMDAwMCwgc2NsayUxMDAwMDAwKTsKIAlzZXFfcHJpbnRmKG0sICJib2dvbWlwc1x0OiAlbHUuJTAybHVcbiIKIAkJIkNhbGlicmF0aW9uXHQ6ICVsdSBsb29wc1xuIiwKLQkJKGxvb3BzX3Blcl9qaWZmeSAqIEhaKSAvIDUwMDAwMCwKLQkJKChsb29wc19wZXJfamlmZnkgKiBIWikgLyA1MDAwKSAlIDEwMCwKLQkJKGxvb3BzX3Blcl9qaWZmeSAqIEhaKSk7CisJCShjcHVkYXRhLT5sb29wc19wZXJfamlmZnkgKiBIWikgLyA1MDAwMDAsCisJCSgoY3B1ZGF0YS0+bG9vcHNfcGVyX2ppZmZ5ICogSFopIC8gNTAwMCkgJSAxMDAsCisJCShjcHVkYXRhLT5sb29wc19wZXJfamlmZnkgKiBIWikpOwogCiAJLyogQ2hlY2sgQ2FjaGUgY29uZmlndXRhdGlvbiAqLwotCXN3aXRjaCAoYmZpbl9yZWFkX0RNRU1fQ09OVFJPTCgpICYgKDEgPDwgRE1DMF9QIHwgMSA8PCBETUMxX1ApKSB7CisJc3dpdGNoIChjcHVkYXRhLT5kbWVtY3RsICYgKDEgPDwgRE1DMF9QIHwgMSA8PCBETUMxX1ApKSB7CiAJY2FzZSBBQ0FDSEVfQlNSQU06CiAJCWNhY2hlID0gImRiYW5rLUEvQlx0OiBjYWNoZS9zcmFtIjsKIAkJZGNhY2hlX3NpemUgPSAxNjsKQEAgLTEwNTgsMTAgKzExMjYsMTAgQEAKIAl9CiAKIAkvKiBJcyBpdCB0dXJuZWQgb24/ICovCi0JaWYgKChiZmluX3JlYWRfRE1FTV9DT05UUk9MKCkgJiAoRU5EQ1BMQiB8IERNQ19FTkFCTEUpKSAhPSAoRU5EQ1BMQiB8IERNQ19FTkFCTEUpKQorCWlmICgoY3B1ZGF0YS0+ZG1lbWN0bCAmIChFTkRDUExCIHwgRE1DX0VOQUJMRSkpICE9IChFTkRDUExCIHwgRE1DX0VOQUJMRSkpCiAJCWRjYWNoZV9zaXplID0gMDsKIAotCWlmICgoYmZpbl9yZWFkX0lNRU1fQ09OVFJPTCgpICYgKElNQyB8IEVOSUNQTEIpKSAhPSAoSU1DIHwgRU5JQ1BMQikpCisJaWYgKChjcHVkYXRhLT5pbWVtY3RsICYgKElNQyB8IEVOSUNQTEIpKSAhPSAoSU1DIHwgRU5JQ1BMQikpCiAJCWljYWNoZV9zaXplID0gMDsKIAogCXNlcV9wcmludGYobSwgImNhY2hlIHNpemVcdDogJWQgS0IoTDEgaWNhY2hlKSAiCkBAIC0xMDg2LDggKzExNTQsMTEgQEAKIAkJICAgImRjYWNoZSBzZXR1cFx0OiAlZCBTdXBlci1iYW5rcy8lZCBTdWItYmFua3MvJWQgV2F5cywgJWQgTGluZXMvV2F5XG4iLAogCQkgICBkc3VwX2JhbmtzLCBCRklOX0RTVUJCQU5LUywgQkZJTl9EV0FZUywKIAkJICAgQkZJTl9ETElORVMpOworI2lmZGVmIF9fQVJDSF9TWU5DX0NPUkVfRENBQ0hFCisJc2VxX3ByaW50ZihtLCAiU01QIERjYWNoZSBGbHVzaGVzXHQ6ICVsdVxuXG4iLCBjcHVkYXRhLT5kY2FjaGVfaW52bGRfY291bnQpOworI2VuZGlmCiAjaWZkZWYgQ09ORklHX0JGSU5fSUNBQ0hFX0xPQ0sKLQlzd2l0Y2ggKChiZmluX3JlYWRfSU1FTV9DT05UUk9MKCkgPj4gMykgJiBXQVlBTExfTCkgeworCXN3aXRjaCAoKGNwdWRhdGEtPmltZW1jdGwgPj4gMykgJiBXQVlBTExfTCkgewogCWNhc2UgV0FZMF9MOgogCQlzZXFfcHJpbnRmKG0sICJXYXkwIExvY2tlZC1Eb3duXG4iKTsKIAkJYnJlYWs7CkBAIC0xMTM3LDYgKzEyMDgsMTIgQEAKIAkJc2VxX3ByaW50ZihtLCAiTm8gV2F5cyBhcmUgbG9ja2VkXG4iKTsKIAl9CiAjZW5kaWYKKworCWlmIChjcHVfbnVtICE9IG51bV9wb3NzaWJsZV9jcHVzKCkgLSAxKQorCQlyZXR1cm4gMDsKKworCWlmIChMMl9MRU5HVEgpCisJCXNlcV9wcmludGYobSwgIkwyIFNSQU1cdFx0OiAlZEtCXG4iLCBMMl9MRU5HVEgvMHg0MDApOwogCXNlcV9wcmludGYobSwgImJvYXJkIG5hbWVcdDogJXNcbiIsIGJmaW5fYm9hcmRfbmFtZSk7CiAJc2VxX3ByaW50ZihtLCAiYm9hcmQgbWVtb3J5XHQ6ICVsZCBrQiAoMHglcCAtPiAweCVwKVxuIiwKIAkJIHBoeXNpY2FsX21lbV9lbmQgPj4gMTAsICh2b2lkICopMCwgKHZvaWQgKilwaHlzaWNhbF9tZW1fZW5kKTsKQEAgLTExNDQsNiArMTIyMSw3IEBACiAJCSgoaW50KW1lbW9yeV9lbmQgLSAoaW50KV9zdGV4dCkgPj4gMTAsCiAJCV9zdGV4dCwKIAkJKHZvaWQgKiltZW1vcnlfZW5kKTsKKwlzZXFfcHJpbnRmKG0sICJcbiIpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2tlcm5lbC90aW1lLmMgYi9hcmNoL2JsYWNrZmluL2tlcm5lbC90aW1lLmMKaW5kZXggZWIyMzUyMy4uMTcyYjRjNSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwvdGltZS5jCisrKyBiL2FyY2gvYmxhY2tmaW4va2VybmVsL3RpbWUuYwpAQCAtMSwzMiArMSwxMSBAQAogLyoKLSAqIEZpbGU6ICAgICAgICAgYXJjaC9ibGFja2Zpbi9rZXJuZWwvdGltZS5jCi0gKiBCYXNlZCBvbjogICAgIG5vbmUgLSBvcmlnaW5hbCB3b3JrCi0gKiBBdXRob3I6CisgKiBhcmNoL2JsYWNrZmluL2tlcm5lbC90aW1lLmMKICAqCi0gKiBDcmVhdGVkOgotICogRGVzY3JpcHRpb246ICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGJmaW4tc3BlY2lmaWMgdGltZSBoYW5kbGluZyBkZXRhaWxzLgotICogICAgICAgICAgICAgICBNb3N0IG9mIHRoZSBzdHVmZiBpcyBsb2NhdGVkIGluIHRoZSBtYWNoaW5lIHNwZWNpZmljIGZpbGVzLgotICoJCSBGSVhNRTogKFRoaXMgZmlsZSBpcyBzdWJqZWN0IGZvciByZW1vdmFsKQorICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBCbGFja2Zpbi1zcGVjaWZpYyB0aW1lIGhhbmRsaW5nIGRldGFpbHMuCisgKiBNb3N0IG9mIHRoZSBzdHVmZiBpcyBsb2NhdGVkIGluIHRoZSBtYWNoaW5lIHNwZWNpZmljIGZpbGVzLgogICoKLSAqIE1vZGlmaWVkOgotICogICAgICAgICAgICAgICBDb3B5cmlnaHQgMjAwNC0yMDA4IEFuYWxvZyBEZXZpY2VzIEluYy4KLSAqCi0gKiBCdWdzOiAgICAgICAgIEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLwotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIHRoZSBmaWxlIENPUFlJTkcsIG9yIHdyaXRlCi0gKiB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqIENvcHlyaWdodCAyMDA0LTIwMDggQW5hbG9nIERldmljZXMgSW5jLgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgogICovCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KQEAgLTM0LDIzICsxMyw0MyBAQAogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogCiAjaW5jbHVkZSA8YXNtL2JsYWNrZmluLmg+CiAjaW5jbHVkZSA8YXNtL3RpbWUuaD4KKyNpbmNsdWRlIDxhc20vZ3B0aW1lcnMuaD4KIAogLyogVGhpcyBpcyBhbiBOVFAgc2V0dGluZyAqLwogI2RlZmluZQlUSUNLX1NJWkUgKHRpY2tfbnNlYyAvIDEwMDApCiAKLXN0YXRpYyB2b2lkIHRpbWVfc2NoZWRfaW5pdChpcnFfaGFuZGxlcl90IHRpbWVyX3JvdXRpbmUpOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgZ2V0dGltZW9mZnNldCh2b2lkKTsKLQogc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gYmZpbl90aW1lcl9pcnEgPSB7Ci0JLm5hbWUgPSAiQkZJTiBUaW1lciBUaWNrIiwKKwkubmFtZSA9ICJCbGFja2ZpbiBUaW1lciBUaWNrIiwKKyNpZmRlZiBDT05GSUdfSVJRX1BFUl9DUFUKKwkuZmxhZ3MgPSBJUlFGX0RJU0FCTEVEIHwgSVJRRl9QRVJDUFUsCisjZWxzZQogCS5mbGFncyA9IElSUUZfRElTQUJMRUQKKyNlbmRpZgogfTsKIAotc3RhdGljIHZvaWQKLXRpbWVfc2NoZWRfaW5pdChpcnFfaGFuZGxlcl90IHRpbWVyX3JvdXRpbmUpCisjaWYgZGVmaW5lZChDT05GSUdfVElDS19TT1VSQ0VfU1lTVE1SMCkgfHwgZGVmaW5lZChDT05GSUdfSVBJUEUpCit2b2lkIF9faW5pdCBzZXR1cF9zeXN0ZW1fdGltZXIwKHZvaWQpCit7CisJLyogUG93ZXIgZG93biB0aGUgY29yZSB0aW1lciwganVzdCB0byBwbGF5IHNhZmUuICovCisJYmZpbl93cml0ZV9UQ05UTCgwKTsKKworCWRpc2FibGVfZ3B0aW1lcnMoVElNRVIwYml0KTsKKwlzZXRfZ3B0aW1lcl9zdGF0dXMoMCwgVElNRVJfU1RBVFVTX1RSVU4wKTsKKwl3aGlsZSAoZ2V0X2dwdGltZXJfc3RhdHVzKDApICYgVElNRVJfU1RBVFVTX1RSVU4wKQorCQl1ZGVsYXkoMTApOworCisJc2V0X2dwdGltZXJfY29uZmlnKDAsIDB4NTkpOyAvKiBJUlEgZW5hYmxlLCBwZXJpb2RpYywgUFdNX09VVCwgU0NMS2VkLCBPVVQgUEFEIGRpc2FibGVkICovCisJc2V0X2dwdGltZXJfcGVyaW9kKFRJTUVSMF9pZCwgZ2V0X3NjbGsoKSAvIEhaKTsKKwlzZXRfZ3B0aW1lcl9wd2lkdGgoVElNRVIwX2lkLCAxKTsKKwlTU1lOQygpOworCWVuYWJsZV9ncHRpbWVycyhUSU1FUjBiaXQpOworfQorI2Vsc2UKK3ZvaWQgX19pbml0IHNldHVwX2NvcmVfdGltZXIodm9pZCkKIHsKIAl1MzIgdGNvdW50OwogCkBAIC01OCwxMCArNTcsOCBAQAogCWJmaW5fd3JpdGVfVENOVEwoMSk7CiAJQ1NZTkMoKTsKIAotCS8qCi0JICogdGhlIFRTQ0FMRSBwcmVzY2FsZXIgY291bnRlci4KLQkgKi8KLQliZmluX3dyaXRlX1RTQ0FMRSgoVElNRV9TQ0FMRSAtIDEpKTsKKwkvKiB0aGUgVFNDQUxFIHByZXNjYWxlciBjb3VudGVyICovCisJYmZpbl93cml0ZV9UU0NBTEUoVElNRV9TQ0FMRSAtIDEpOwogCiAJdGNvdW50ID0gKChnZXRfY2NsaygpIC8gKEhaICogVElNRV9TQ0FMRSkpIC0gMSk7CiAJYmZpbl93cml0ZV9UUEVSSU9EKHRjb3VudCk7CkBAIC03MSwzNSArNjgsNTIgQEAKIAlDU1lOQygpOwogCiAJYmZpbl93cml0ZV9UQ05UTCg3KTsKK30KKyNlbmRpZgogCi0JYmZpbl90aW1lcl9pcnEuaGFuZGxlciA9IChpcnFfaGFuZGxlcl90KXRpbWVyX3JvdXRpbmU7Ci0JLyogY2FsbCBzZXR1cF9pcnEgaW5zdGVhZCBvZiByZXF1ZXN0X2lycSBiZWNhdXNlIHJlcXVlc3RfaXJxIGNhbGxzCi0JICoga21hbGxvYyB3aGljaCBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQgeWV0Ci0JICovCitzdGF0aWMgdm9pZCBfX2luaXQKK3RpbWVfc2NoZWRfaW5pdChpcnFyZXR1cm5fdCgqdGltZXJfcm91dGluZSkgKGludCwgdm9pZCAqKSkKK3sKKyNpZiBkZWZpbmVkKENPTkZJR19USUNLX1NPVVJDRV9TWVNUTVIwKSB8fCBkZWZpbmVkKENPTkZJR19JUElQRSkKKwlzZXR1cF9zeXN0ZW1fdGltZXIwKCk7CisJYmZpbl90aW1lcl9pcnEuaGFuZGxlciA9IHRpbWVyX3JvdXRpbmU7CisJc2V0dXBfaXJxKElSUV9USU1FUjAsICZiZmluX3RpbWVyX2lycSk7CisjZWxzZQorCXNldHVwX2NvcmVfdGltZXIoKTsKKwliZmluX3RpbWVyX2lycS5oYW5kbGVyID0gdGltZXJfcm91dGluZTsKIAlzZXR1cF9pcnEoSVJRX0NPUkVUTVIsICZiZmluX3RpbWVyX2lycSk7CisjZW5kaWYKIH0KIAogLyoKICAqIFNob3VsZCByZXR1cm4gdXNlY29uZHMgc2luY2UgbGFzdCB0aW1lciB0aWNrCiAgKi8KKyNpZm5kZWYgQ09ORklHX0dFTkVSSUNfVElNRQogc3RhdGljIHVuc2lnbmVkIGxvbmcgZ2V0dGltZW9mZnNldCh2b2lkKQogewogCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OwogCXVuc2lnbmVkIGxvbmcgY2xvY2tzX3Blcl9qaWZmeTsKIAorI2lmIGRlZmluZWQoQ09ORklHX1RJQ0tfU09VUkNFX1NZU1RNUjApIHx8IGRlZmluZWQoQ09ORklHX0lQSVBFKQorCWNsb2Nrc19wZXJfamlmZnkgPSBiZmluX3JlYWRfVElNRVIwX1BFUklPRCgpOworCW9mZnNldCA9IGJmaW5fcmVhZF9USU1FUjBfQ09VTlRFUigpIC8gXAorCQkoKChjbG9ja3NfcGVyX2ppZmZ5ICsgMSkgKiBIWikgLyBVU0VDX1BFUl9TRUMpOworCisJaWYgKChnZXRfZ3B0aW1lcl9zdGF0dXMoMCkgJiBUSU1FUl9TVEFUVVNfVElNSUwwKSAmJiBvZmZzZXQgPCAoMTAwMDAwIC8gSFogLyAyKSkKKwkJb2Zmc2V0ICs9IChVU0VDX1BFUl9TRUMgLyBIWik7CisjZWxzZQogCWNsb2Nrc19wZXJfamlmZnkgPSBiZmluX3JlYWRfVFBFUklPRCgpOwotCW9mZnNldCA9Ci0JICAgIChjbG9ja3NfcGVyX2ppZmZ5IC0KLQkgICAgIGJmaW5fcmVhZF9UQ09VTlQoKSkgLyAoKChjbG9ja3NfcGVyX2ppZmZ5ICsgMSkgKiBIWikgLwotCQkJCSAgICBVU0VDX1BFUl9TRUMpOworCW9mZnNldCA9IChjbG9ja3NfcGVyX2ppZmZ5IC0gYmZpbl9yZWFkX1RDT1VOVCgpKSAvIFwKKwkJKCgoY2xvY2tzX3Blcl9qaWZmeSArIDEpICogSFopIC8gVVNFQ19QRVJfU0VDKTsKIAogCS8qIENoZWNrIGlmIHdlIGp1c3Qgd3JhcHBlZCB0aGUgY291bnRlcnMgYW5kIG1heWJlIG1pc3NlZCBhIHRpY2sgKi8KIAlpZiAoKGJmaW5fcmVhZF9JTEFUKCkgJiAoMSA8PCBJUlFfQ09SRVRNUikpCi0JICAgICYmIChvZmZzZXQgPCAoMTAwMDAwIC8gSFogLyAyKSkpCisJCSYmIChvZmZzZXQgPCAoMTAwMDAwIC8gSFogLyAyKSkpCiAJCW9mZnNldCArPSAoVVNFQ19QRVJfU0VDIC8gSFopOwotCisjZW5kaWYKIAlyZXR1cm4gb2Zmc2V0OwogfQorI2VuZGlmCiAKIHN0YXRpYyBpbmxpbmUgaW50IHNldF9ydGNfbW1zcyh1bnNpZ25lZCBsb25nIG5vd3RpbWUpCiB7CkBAIC0xMTEsNDMgKzEyNSw0OSBAQAogICogYXMgd2VsbCBhcyBjYWxsIHRoZSAiZG9fdGltZXIoKSIgcm91dGluZSBldmVyeSBjbG9ja3RpY2sKICAqLwogI2lmZGVmIENPTkZJR19DT1JFX1RJTUVSX0lSUV9MMQotaXJxcmV0dXJuX3QgdGltZXJfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmR1bW15KV9fYXR0cmlidXRlX18oKGwxX3RleHQpKTsKK19fYXR0cmlidXRlX18oKGwxX3RleHQpKQogI2VuZGlmCi0KIGlycXJldHVybl90IHRpbWVyX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkdW1teSkKIHsKIAkvKiBsYXN0IHRpbWUgdGhlIGNtb3MgY2xvY2sgZ290IHVwZGF0ZWQgKi8KIAlzdGF0aWMgbG9uZyBsYXN0X3J0Y191cGRhdGU7CiAKIAl3cml0ZV9zZXFsb2NrKCZ4dGltZV9sb2NrKTsKKyNpZiBkZWZpbmVkKENPTkZJR19USUNLX1NPVVJDRV9TWVNUTVIwKSAmJiAhZGVmaW5lZChDT05GSUdfSVBJUEUpCisvKiBGSVhNRTogSGVyZSBUSU1JTDAgaXMgbm90IHNldCB3aGVuIElQSVBFIGVuYWJsZWQsIHdoeT8gKi8KKwlpZiAoZ2V0X2dwdGltZXJfc3RhdHVzKDApICYgVElNRVJfU1RBVFVTX1RJTUlMMCkgeworI2VuZGlmCisJCWRvX3RpbWVyKDEpOwogCi0JZG9fdGltZXIoMSk7Ci0KLQlwcm9maWxlX3RpY2soQ1BVX1BST0ZJTElORyk7Ci0KLQkvKgotCSAqIElmIHdlIGhhdmUgYW4gZXh0ZXJuYWxseSBzeW5jaHJvbml6ZWQgTGludXggY2xvY2ssIHRoZW4gdXBkYXRlCi0JICogQ01PUyBjbG9jayBhY2NvcmRpbmdseSBldmVyeSB+MTEgbWludXRlcy4gU2V0X3J0Y19tbXNzKCkgaGFzIHRvIGJlCi0JICogY2FsbGVkIGFzIGNsb3NlIGFzIHBvc3NpYmxlIHRvIDUwMCBtcyBiZWZvcmUgdGhlIG5ldyBzZWNvbmQgc3RhcnRzLgotCSAqLwotCi0JaWYgKG50cF9zeW5jZWQoKSAmJgotCSAgICB4dGltZS50dl9zZWMgPiBsYXN0X3J0Y191cGRhdGUgKyA2NjAgJiYKLQkgICAgKHh0aW1lLnR2X25zZWMgLyBOU0VDX1BFUl9VU0VDKSA+PQotCSAgICA1MDAwMDAgLSAoKHVuc2lnbmVkKVRJQ0tfU0laRSkgLyAyCi0JICAgICYmICh4dGltZS50dl9uc2VjIC8gTlNFQ19QRVJfVVNFQykgPD0KLQkgICAgNTAwMDAwICsgKCh1bnNpZ25lZClUSUNLX1NJWkUpIC8gMikgewotCQlpZiAoc2V0X3J0Y19tbXNzKHh0aW1lLnR2X3NlYykgPT0gMCkKLQkJCWxhc3RfcnRjX3VwZGF0ZSA9IHh0aW1lLnR2X3NlYzsKLQkJZWxzZQotCQkJLyogRG8gaXQgYWdhaW4gaW4gNjBzLiAqLwotCQkJbGFzdF9ydGNfdXBkYXRlID0geHRpbWUudHZfc2VjIC0gNjAwOworCQkvKgorCQkgKiBJZiB3ZSBoYXZlIGFuIGV4dGVybmFsbHkgc3luY2hyb25pemVkIExpbnV4IGNsb2NrLCB0aGVuIHVwZGF0ZQorCQkgKiBDTU9TIGNsb2NrIGFjY29yZGluZ2x5IGV2ZXJ5IH4xMSBtaW51dGVzLiBTZXRfcnRjX21tc3MoKSBoYXMgdG8gYmUKKwkJICogY2FsbGVkIGFzIGNsb3NlIGFzIHBvc3NpYmxlIHRvIDUwMCBtcyBiZWZvcmUgdGhlIG5ldyBzZWNvbmQgc3RhcnRzLgorCQkgKi8KKwkJaWYgKG50cF9zeW5jZWQoKSAmJgorCQkgICAgeHRpbWUudHZfc2VjID4gbGFzdF9ydGNfdXBkYXRlICsgNjYwICYmCisJCSAgICAoeHRpbWUudHZfbnNlYyAvIE5TRUNfUEVSX1VTRUMpID49CisJCSAgICA1MDAwMDAgLSAoKHVuc2lnbmVkKVRJQ0tfU0laRSkgLyAyCisJCSAgICAmJiAoeHRpbWUudHZfbnNlYyAvIE5TRUNfUEVSX1VTRUMpIDw9CisJCSAgICA1MDAwMDAgKyAoKHVuc2lnbmVkKVRJQ0tfU0laRSkgLyAyKSB7CisJCQlpZiAoc2V0X3J0Y19tbXNzKHh0aW1lLnR2X3NlYykgPT0gMCkKKwkJCQlsYXN0X3J0Y191cGRhdGUgPSB4dGltZS50dl9zZWM7CisJCQllbHNlCisJCQkJLyogRG8gaXQgYWdhaW4gaW4gNjBzLiAqLworCQkJCWxhc3RfcnRjX3VwZGF0ZSA9IHh0aW1lLnR2X3NlYyAtIDYwMDsKKwkJfQorI2lmIGRlZmluZWQoQ09ORklHX1RJQ0tfU09VUkNFX1NZU1RNUjApICYmICFkZWZpbmVkKENPTkZJR19JUElQRSkKKwkJc2V0X2dwdGltZXJfc3RhdHVzKDAsIFRJTUVSX1NUQVRVU19USU1JTDApOwogCX0KKyNlbmRpZgogCXdyaXRlX3NlcXVubG9jaygmeHRpbWVfbG9jayk7CiAKLSNpZm5kZWYgQ09ORklHX1NNUAorI2lmZGVmIENPTkZJR19JUElQRQorCXVwZGF0ZV9yb290X3Byb2Nlc3NfdGltZXMoZ2V0X2lycV9yZWdzKCkpOworI2Vsc2UKIAl1cGRhdGVfcHJvY2Vzc190aW1lcyh1c2VyX21vZGUoZ2V0X2lycV9yZWdzKCkpKTsKICNlbmRpZgorCXByb2ZpbGVfdGljayhDUFVfUFJPRklMSU5HKTsKIAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4va2VybmVsL3RyYXBzLmMgYi9hcmNoL2JsYWNrZmluL2tlcm5lbC90cmFwcy5jCmluZGV4IGJlZjAyNWIuLjE3ZDhlNDEgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4va2VybmVsL3RyYXBzLmMKKysrIGIvYXJjaC9ibGFja2Zpbi9rZXJuZWwvdHJhcHMuYwpAQCAtNzUsMTYgKzc1LDYgQEAKIAlDU1lOQygpOwogfQogCi0vKgotICogVXNlZCB0byBzYXZlIHRoZSBSRVRYLCBTRVFTVEFULCBJL0QgQ1BMQiBGQVVMVCBBRERSCi0gKiB2YWx1ZXMgYWNyb3NzIHRoZSB0cmFuc2l0aW9uIGZyb20gZXhjZXB0aW9uIHRvIElSUTUuCi0gKiBXZSBwdXQgdGhlc2UgaW4gTDEsIHNvIHRoZXkgYXJlIGdvaW5nIHRvIGJlIGluIGEgdmFsaWQKLSAqIGxvY2F0aW9uIGR1cmluZyBleGNlcHRpb24gY29udGV4dAotICovCi1fX2F0dHJpYnV0ZV9fKChsMV9kYXRhKSkKLXVuc2lnbmVkIGxvbmcgc2F2ZWRfcmV0eCwgc2F2ZWRfc2Vxc3RhdCwKLQlzYXZlZF9pY3BsYl9mYXVsdF9hZGRyLCBzYXZlZF9kY3BsYl9mYXVsdF9hZGRyOwotCiBzdGF0aWMgdm9pZCBkZWNvZGVfYWRkcmVzcyhjaGFyICpidWYsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcykKIHsKICNpZmRlZiBDT05GSUdfREVCVUdfVkVSQk9TRQpAQCAtMjExLDE4ICsyMDEsMTggQEAKIAlwcmludGsoS0VSTl9FTUVSRyAiXG4iIEtFUk5fRU1FUkcgIkRvdWJsZSBGYXVsdFxuIik7CiAjaWZkZWYgQ09ORklHX0RFQlVHX0RPVUJMRUZBVUxUX1BSSU5UCiAJaWYgKCgobG9uZylmcC0+c2Vxc3RhdCAmICBTRVFTVEFUX0VYQ0FVU0UpID09IFZFQ19VTkNPVikgeworCQl1bnNpZ25lZCBpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwogCQljaGFyIGJ1ZlsxNTBdOwotCQlkZWNvZGVfYWRkcmVzcyhidWYsIHNhdmVkX3JldHgpOworCQlkZWNvZGVfYWRkcmVzcyhidWYsIGNwdV9wZGFbY3B1XS5yZXR4KTsKIAkJcHJpbnRrKEtFUk5fRU1FUkcgIldoaWxlIGhhbmRsaW5nIGV4Y2VwdGlvbiAoRVhDQVVTRSA9IDB4JXgpIGF0ICVzOlxuIiwKLQkJCShpbnQpc2F2ZWRfc2Vxc3RhdCAmIFNFUVNUQVRfRVhDQVVTRSwgYnVmKTsKLQkJZGVjb2RlX2FkZHJlc3MoYnVmLCBzYXZlZF9kY3BsYl9mYXVsdF9hZGRyKTsKKwkJCSh1bnNpZ25lZCBpbnQpY3B1X3BkYVtjcHVdLnNlcXN0YXQgJiBTRVFTVEFUX0VYQ0FVU0UsIGJ1Zik7CisJCWRlY29kZV9hZGRyZXNzKGJ1ZiwgY3B1X3BkYVtjcHVdLmRjcGxiX2ZhdWx0X2FkZHIpOwogCQlwcmludGsoS0VSTl9OT1RJQ0UgIiAgIERDUExCX0ZBVUxUX0FERFI6ICVzXG4iLCBidWYpOwotCQlkZWNvZGVfYWRkcmVzcyhidWYsIHNhdmVkX2ljcGxiX2ZhdWx0X2FkZHIpOworCQlkZWNvZGVfYWRkcmVzcyhidWYsIGNwdV9wZGFbY3B1XS5pY3BsYl9mYXVsdF9hZGRyKTsKIAkJcHJpbnRrKEtFUk5fTk9USUNFICIgICBJQ1BMQl9GQVVMVF9BRERSOiAlc1xuIiwgYnVmKTsKIAogCQlkZWNvZGVfYWRkcmVzcyhidWYsIGZwLT5yZXR4KTsKLQkJcHJpbnRrKEtFUk5fTk9USUNFICJUaGUgaW5zdHJ1Y3Rpb24gYXQgJXMgY2F1c2VkIGEgZG91YmxlIGV4Y2VwdGlvblxuIiwKLQkJCWJ1Zik7CisJCXByaW50ayhLRVJOX05PVElDRSAiVGhlIGluc3RydWN0aW9uIGF0ICVzIGNhdXNlZCBhIGRvdWJsZSBleGNlcHRpb25cbiIsIGJ1Zik7CiAJfSBlbHNlCiAjZW5kaWYKIAl7CkBAIC0yNDAsNiArMjMwLDkgQEAKICNpZmRlZiBDT05GSUdfREVCVUdfQkZJTl9IV1RSQUNFX09OCiAJaW50IGo7CiAjZW5kaWYKKyNpZmRlZiBDT05GSUdfREVCVUdfSFVOVF9GT1JfWkVSTworCXVuc2lnbmVkIGludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisjZW5kaWYKIAlpbnQgc2lnID0gMDsKIAlzaWdpbmZvX3QgaW5mbzsKIAl1bnNpZ25lZCBsb25nIHRyYXBuciA9IGZwLT5zZXFzdGF0ICYgU0VRU1RBVF9FWENBVVNFOwpAQCAtNDE3LDcgKzQxMCw3IEBACiAJCWluZm8uc2lfY29kZSA9IElMTF9DUExCX01VTEhJVDsKIAkJc2lnID0gU0lHU0VHVjsKICNpZmRlZiBDT05GSUdfREVCVUdfSFVOVF9GT1JfWkVSTwotCQlpZiAoc2F2ZWRfZGNwbGJfZmF1bHRfYWRkciA8IEZJWEVEX0NPREVfU1RBUlQpCisJCWlmIChjcHVfcGRhW2NwdV0uZGNwbGJfZmF1bHRfYWRkciA8IEZJWEVEX0NPREVfU1RBUlQpCiAJCQl2ZXJib3NlX3ByaW50ayhLRVJOX05PVElDRSAiTlVMTCBwb2ludGVyIGFjY2Vzc1xuIik7CiAJCWVsc2UKICNlbmRpZgpAQCAtNDcxLDcgKzQ2NCw3IEBACiAJCWluZm8uc2lfY29kZSA9IElMTF9DUExCX01VTEhJVDsKIAkJc2lnID0gU0lHU0VHVjsKICNpZmRlZiBDT05GSUdfREVCVUdfSFVOVF9GT1JfWkVSTwotCQlpZiAoc2F2ZWRfaWNwbGJfZmF1bHRfYWRkciA8IEZJWEVEX0NPREVfU1RBUlQpCisJCWlmIChjcHVfcGRhW2NwdV0uaWNwbGJfZmF1bHRfYWRkciA8IEZJWEVEX0NPREVfU1RBUlQpCiAJCQl2ZXJib3NlX3ByaW50ayhLRVJOX05PVElDRSAiSnVtcCB0byBOVUxMIGFkZHJlc3NcbiIpOwogCQllbHNlCiAjZW5kaWYKQEAgLTU4NCwxMCArNTc3LDE1IEBACiAJCX0KIAl9CiAKLQlpbmZvLnNpX3NpZ25vID0gc2lnOwotCWluZm8uc2lfZXJybm8gPSAwOwotCWluZm8uc2lfYWRkciA9ICh2b2lkIF9fdXNlciAqKWZwLT5wYzsKLQlmb3JjZV9zaWdfaW5mbyhzaWcsICZpbmZvLCBjdXJyZW50KTsKKyNpZmRlZiBDT05GSUdfSVBJUEUKKwlpZiAoIWlwaXBlX3RyYXBfbm90aWZ5KGZwLT5zZXFzdGF0ICYgMHgzZiwgZnApKQorI2VuZGlmCisJeworCQlpbmZvLnNpX3NpZ25vID0gc2lnOworCQlpbmZvLnNpX2Vycm5vID0gMDsKKwkJaW5mby5zaV9hZGRyID0gKHZvaWQgX191c2VyICopZnAtPnBjOworCQlmb3JjZV9zaWdfaW5mbyhzaWcsICZpbmZvLCBjdXJyZW50KTsKKwl9CiAKIAl0cmFjZV9idWZmZXJfcmVzdG9yZShqKTsKIAlyZXR1cm47CkBAIC02NTYsMTMgKzY1NCwxMyBAQAogCXJldHVybiBmYWxzZTsKIH0KIAotLyogCisvKgogICogZGVjb2RlIHRoZSBpbnN0cnVjdGlvbiBpZiB3ZSBhcmUgcHJpbnRpbmcgb3V0IHRoZSB0cmFjZSwgYXMgaXQKICAqIG1ha2VzIHRoaW5ncyBlYXNpZXIgdG8gZm9sbG93LCB3aXRob3V0IHJ1bm5pbmcgaXQgdGhyb3VnaCBvYmpkdW1wCiAgKiBUaGVzZSBhcmUgdGhlIG5vcm1hbCBpbnN0cnVjdGlvbnMgd2hpY2ggY2F1c2UgY2hhbmdlIG9mIGZsb3csIHdoaWNoCiAgKiB3b3VsZCBiZSBhdCB0aGUgc291cmNlIG9mIHRoZSB0cmFjZSBidWZmZXIKICAqLwotI2lmZGVmIENPTkZJR19ERUJVR19WRVJCT1NFCisjaWYgZGVmaW5lZChDT05GSUdfREVCVUdfVkVSQk9TRSkgJiYgZGVmaW5lZChDT05GSUdfREVCVUdfQkZJTl9IV1RSQUNFX09OKQogc3RhdGljIHZvaWQgZGVjb2RlX2luc3RydWN0aW9uKHVuc2lnbmVkIHNob3J0ICphZGRyZXNzKQogewogCXVuc2lnbmVkIHNob3J0IG9wY29kZTsKQEAgLTg0Niw3ICs4NDQsNyBAQAogCX0KIAlpZiAoZnApIHsKIAkJZnJhbWUgPSBmcDsKLQkJcHJpbnRrKCIgRlA6ICgweCVwKVxuIiwgZnApOworCQlwcmludGsoS0VSTl9OT1RJQ0UgIiBGUDogKDB4JXApXG4iLCBmcCk7CiAJfSBlbHNlCiAJCWZyYW1lID0gMDsKIApAQCAtOTYwLDYgKzk1OCw3IEBACiAJCWVsc2UKIAkJCXZlcmJvc2VfcHJpbnRrKEtFUk5fTk9USUNFICJDT01NPSBpbnZhbGlkXG4iKTsKIAorCQlwcmludGsoS0VSTl9OT1RJQ0UgIkNQVSA9ICVkXG4iLCBjdXJyZW50X3RocmVhZF9pbmZvKCktPmNwdSk7CiAJCWlmICghKCh1bnNpZ25lZCBsb25nKWN1cnJlbnQtPm1tICYgMHgzKSAmJiAodW5zaWduZWQgbG9uZyljdXJyZW50LT5tbSA+PSBGSVhFRF9DT0RFX1NUQVJUKQogCQkJdmVyYm9zZV9wcmludGsoS0VSTl9OT1RJQ0UgICJURVhUID0gMHglcC0weCVwICAgICAgICBEQVRBID0gMHglcC0weCVwXG4iCiAJCQkJS0VSTl9OT1RJQ0UgIiBCU1MgPSAweCVwLTB4JXAgIFVTRVItU1RBQ0sgPSAweCVwXG4iCkBAIC0xMDUzLDYgKzEwNTIsNyBAQAogCXN0cnVjdCBpcnFhY3Rpb24gKmFjdGlvbjsKIAl1bnNpZ25lZCBpbnQgaTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CiAKIAl2ZXJib3NlX3ByaW50ayhLRVJOX05PVElDRSAiXG4iIEtFUk5fTk9USUNFICJTRVFVRU5DRVIgU1RBVFVTOlx0XHQlc1xuIiwgcHJpbnRfdGFpbnRlZCgpKTsKIAl2ZXJib3NlX3ByaW50ayhLRVJOX05PVElDRSAiIFNFUVNUQVQ6ICUwOGx4ICBJUEVORDogJTA0bHggIFNZU0NGRzogJTA0bHhcbiIsCkBAIC0xMTEyLDkgKzExMTIsOSBAQAogCiAJaWYgKCgobG9uZylmcC0+c2Vxc3RhdCAmICBTRVFTVEFUX0VYQ0FVU0UpICYmCiAJICAgICgoKGxvbmcpZnAtPnNlcXN0YXQgJiBTRVFTVEFUX0VYQ0FVU0UpICE9IFZFQ19IV0VSUikpIHsKLQkJZGVjb2RlX2FkZHJlc3MoYnVmLCBzYXZlZF9kY3BsYl9mYXVsdF9hZGRyKTsKKwkJZGVjb2RlX2FkZHJlc3MoYnVmLCBjcHVfcGRhW2NwdV0uZGNwbGJfZmF1bHRfYWRkcik7CiAJCXZlcmJvc2VfcHJpbnRrKEtFUk5fTk9USUNFICJEQ1BMQl9GQVVMVF9BRERSOiAlc1xuIiwgYnVmKTsKLQkJZGVjb2RlX2FkZHJlc3MoYnVmLCBzYXZlZF9pY3BsYl9mYXVsdF9hZGRyKTsKKwkJZGVjb2RlX2FkZHJlc3MoYnVmLCBjcHVfcGRhW2NwdV0uaWNwbGJfZmF1bHRfYWRkcik7CiAJCXZlcmJvc2VfcHJpbnRrKEtFUk5fTk9USUNFICJJQ1BMQl9GQVVMVF9BRERSOiAlc1xuIiwgYnVmKTsKIAl9CiAKQEAgLTExNTMsMjAgKzExNTMsMjEgQEAKIGFzbWxpbmthZ2UgaW50IHN5c19iZmluX3NwaW5sb2NrKGludCAqc3BpbmxvY2spX19hdHRyaWJ1dGVfXygobDFfdGV4dCkpOwogI2VuZGlmCiAKLWFzbWxpbmthZ2UgaW50IHN5c19iZmluX3NwaW5sb2NrKGludCAqc3BpbmxvY2spCi17Ci0JaW50IHJldCA9IDA7Ci0JaW50IHRtcCA9IDA7CitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGJmaW5fc3BpbmxvY2tfbG9jayk7CiAKLQlsb2NhbF9pcnFfZGlzYWJsZSgpOwotCXJldCA9IGdldF91c2VyKHRtcCwgc3BpbmxvY2spOwotCWlmIChyZXQgPT0gMCkgewotCQlpZiAodG1wKQorYXNtbGlua2FnZSBpbnQgc3lzX2JmaW5fc3BpbmxvY2soaW50ICpwKQoreworCWludCByZXQsIHRtcCA9IDA7CisKKwlzcGluX2xvY2soJmJmaW5fc3BpbmxvY2tfbG9jayk7CS8qIFRoaXMgd291bGQgYWxzbyBob2xkIGtlcm5lbCBwcmVlbXB0aW9uLiAqLworCXJldCA9IGdldF91c2VyKHRtcCwgcCk7CisJaWYgKGxpa2VseShyZXQgPT0gMCkpIHsKKwkJaWYgKHVubGlrZWx5KHRtcCkpCiAJCQlyZXQgPSAxOwotCQl0bXAgPSAxOwotCQlwdXRfdXNlcih0bXAsIHNwaW5sb2NrKTsKKwkJZWxzZQorCQkJcHV0X3VzZXIoMSwgcCk7CiAJfQotCWxvY2FsX2lycV9lbmFibGUoKTsKKwlzcGluX3VubG9jaygmYmZpbl9zcGlubG9ja19sb2NrKTsKIAlyZXR1cm4gcmV0OwogfQogCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2tlcm5lbC92bWxpbnV4Lmxkcy5TIGIvYXJjaC9ibGFja2Zpbi9rZXJuZWwvdm1saW51eC5sZHMuUwppbmRleCA3ZDEyYzY2Li40YjQzNDFkIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2tlcm5lbC92bWxpbnV4Lmxkcy5TCisrKyBiL2FyY2gvYmxhY2tmaW4va2VybmVsL3ZtbGludXgubGRzLlMKQEAgLTY4LDYgKzY4LDggQEAKIAkJX19ldGV4dCA9IC47CiAJfQogCisJTk9URVMKKwogCS8qIEp1c3QgaW4gY2FzZSB0aGUgZmlyc3QgcmVhZCBvbmx5IGlzIGEgMzItYml0IGFjY2VzcyAqLwogCVJPX0RBVEEoNCkKIApAQCAtMTA5LDcgKzExMSw2IEBACiAjZW5kaWYKIAogCQlEQVRBX0RBVEEKLQkJKiguZGF0YS4qKQogCQlDT05TVFJVQ1RPUlMKIAogCQkvKiBtYWtlIHN1cmUgdGhlIGluaXRfdGFzayBpcyBhbGlnbmVkIHRvIHRoZQpAQCAtMTYxLDEyICsxNjIsMTQgQEAKIAkJKiguY29uX2luaXRjYWxsLmluaXQpCiAJCV9fX2Nvbl9pbml0Y2FsbF9lbmQgPSAuOwogCX0KKwlQRVJDUFUoNCkKIAlTRUNVUklUWV9JTklUCiAJLmluaXQucmFtZnMgOgogCXsKIAkJLiA9IEFMSUdOKDQpOwogCQlfX19pbml0cmFtZnNfc3RhcnQgPSAuOwogCQkqKC5pbml0LnJhbWZzKQorCQkuID0gQUxJR04oNCk7CiAJCV9fX2luaXRyYW1mc19lbmQgPSAuOwogCX0KIApAQCAtMjEyLDcgKzIxNSw3IEBACiAJCV9fZWJzc19iX2wxID0gLjsKIAl9CiAKLQlfX2wyX2xtYV9zdGFydCA9IC47CisJX19sMl9sbWFfc3RhcnQgPSBMT0FEQUREUiguZGF0YV9iX2wxKSArIFNJWkVPRiguZGF0YV9iX2wxKTsKIAogCS50ZXh0X2RhdGFfbDIgTDJfU1RBUlQgOiBBVChMT0FEQUREUiguZGF0YV9iX2wxKSArIFNJWkVPRiguZGF0YV9iX2wxKSkKIAl7CkBAIC0yNDAsNyArMjQzLDcgQEAKIAkvKiBGb3JjZSB0cmFpbGluZyBhbGlnbm1lbnQgb2Ygb3VyIGluaXQgc2VjdGlvbiBzbyB0aGF0IHdoZW4gd2UKIAkgKiBmcmVlIG91ciBpbml0IG1lbW9yeSwgd2UgZG9uJ3QgbGVhdmUgYmVoaW5kIGEgcGFydGlhbCBwYWdlLgogCSAqLwotCS4gPSBMT0FEQUREUiguZGF0YV9iX2wxKSArIFNJWkVPRiguZGF0YV9iX2wxKTsKKwkuID0gTE9BREFERFIoLnRleHRfZGF0YV9sMikgKyBTSVpFT0YoLnRleHRfZGF0YV9sMik7CiAJLiA9IEFMSUdOKFBBR0VfU0laRSk7CiAJX19faW5pdF9lbmQgPSAuOwogCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2xpYi9jaGVja3N1bS5jIGIvYXJjaC9ibGFja2Zpbi9saWIvY2hlY2tzdW0uYwppbmRleCA1Yzg3NTA1Li43NjJhN2YwIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2xpYi9jaGVja3N1bS5jCisrKyBiL2FyY2gvYmxhY2tmaW4vbGliL2NoZWNrc3VtLmMKQEAgLTI5LDYgKzI5LDcgQEAKICAqIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPG5ldC9jaGVja3N1bS5oPgogI2luY2x1ZGUgPGFzbS9jaGVja3N1bS5oPgogCkBAIC03Niw2ICs3Nyw3IEBACiB7CiAJcmV0dXJuIChfX2ZvcmNlIF9fc3VtMTYpfmRvX2NzdW0oaXBoLCBpaGwgKiA0KTsKIH0KK0VYUE9SVF9TWU1CT0woaXBfZmFzdF9jc3VtKTsKIAogLyoKICAqIGNvbXB1dGVzIHRoZSBjaGVja3N1bSBvZiBhIG1lbW9yeSBibG9jayBhdCBidWZmLCBsZW5ndGggbGVuLApAQCAtMTA0LDYgKzEwNiw3IEBACiAKIAlyZXR1cm4gc3VtOwogfQorRVhQT1JUX1NZTUJPTChjc3VtX3BhcnRpYWwpOwogCiAvKgogICogdGhpcyByb3V0aW5lIGlzIHVzZWQgZm9yIG1pc2NlbGxhbmVvdXMgSVAtbGlrZSBjaGVja3N1bXMsIG1haW5seQpAQCAtMTM3LDMgKzE0MCw0IEBACiAJbWVtY3B5KGRzdCwgc3JjLCBsZW4pOwogCXJldHVybiBjc3VtX3BhcnRpYWwoZHN0LCBsZW4sIHN1bSk7CiB9CitFWFBPUlRfU1lNQk9MKGNzdW1fcGFydGlhbF9jb3B5KTsKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbGliL2lucy5TIGIvYXJjaC9ibGFja2Zpbi9saWIvaW5zLlMKaW5kZXggZDYwNTU0ZC4uMTg2M2E2YiAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9saWIvaW5zLlMKKysrIGIvYXJjaC9ibGFja2Zpbi9saWIvaW5zLlMKQEAgLTEsMzEgKzEsOSBAQAogLyoKLSAqIEZpbGU6ICAgICAgICAgYXJjaC9ibGFja2Zpbi9saWIvaW5zLlMKLSAqIEJhc2VkIG9uOgotICogQXV0aG9yOiAgICAgICBCYXMgVmVybWV1bGVuIDxiYXNAYnV5d2F5cy5ubD4KKyAqIGFyY2gvYmxhY2tmaW4vbGliL2lucy5TIC0gaW5ze2J3bH0gdXNpbmcgaGFyZHdhcmUgbG9vcHMKICAqCi0gKiBDcmVhdGVkOiAgICAgIFR1ZSBNYXIgMjIgMTU6Mjc6MjQgQ0VTVCAyMDA1Ci0gKiBEZXNjcmlwdGlvbjogIEltcGxlbWVudGF0aW9uIG9mIGluc3tid2x9IGZvciBCbGFja0ZpbiBwcm9jZXNzb3JzIHVzaW5nIHplcm8gb3ZlcmhlYWQgbG9vcHMuCi0gKgotICogTW9kaWZpZWQ6Ci0gKiAgICAgICAgICAgICAgIENvcHlyaWdodCAyMDA0LTIwMDggQW5hbG9nIERldmljZXMgSW5jLgotICogICAgICAgICAgICAgICBDb3B5cmlnaHQgKEMpIDIwMDUgQmFzIFZlcm1ldWxlbiwgQnV5V2F5cyBCViA8YmFzQGJ1eXdheXMubmw+Ci0gKgotICogQnVnczogICAgICAgICBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSB0aGUgZmlsZSBDT1BZSU5HLCBvciB3cml0ZQotICogdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKiBDb3B5cmlnaHQgMjAwNC0yMDA4IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwNSBCYXMgVmVybWV1bGVuLCBCdXlXYXlzIEJWIDxiYXNAYnV5d2F5cy5ubD4KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KICAqLwogCiAjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgpAQCAtMzMsNiArMTEsNDYgQEAKIAogLmFsaWduIDIKIAorI2lmZGVmIENPTkZJR19JUElQRQorIyBkZWZpbmUgRE9fQ0xJIFwKKwlbLS1zcF0gPSByZXRzOyBcCisJWy0tc3BdID0gKFA1OjApOyBcCisJc3AgKz0gLTEyOyBcCisJY2FsbCBfX19pcGlwZV9zdGFsbF9yb290X3JhdzsgXAorCXNwICs9IDEyOyBcCisJKFA1OjApID0gW3NwKytdOworIyBkZWZpbmUgQ0xJX0lOTkVSX05PUAorI2Vsc2UKKyMgZGVmaW5lIERPX0NMSSBjbGkgUjM7CisjIGRlZmluZSBDTElfSU5ORVJfTk9QIG5vcDsgbm9wOyBub3A7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19JUElQRQorIyBkZWZpbmUgRE9fU1RJIFwKKwlzcCArPSAtMTI7IFwKKwljYWxsIF9fX2lwaXBlX3Vuc3RhbGxfcm9vdF9yYXc7IFwKKwlzcCArPSAxMjsgXAorMjoJcmV0cyA9IFtzcCsrXTsKKyNlbHNlCisjIGRlZmluZSBET19TVEkgMjogc3RpIFIzOworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfQkZJTl9JTlNfTE9XT1ZFUkhFQUQKKyMgZGVmaW5lIENMSV9PVVRFUiBET19DTEk7CisjIGRlZmluZSBTVElfT1VURVIgRE9fU1RJOworIyBkZWZpbmUgQ0xJX0lOTkVSIDE6CisjIGlmIEFOT01BTFlfMDUwMDA0MTYKKyMgIGRlZmluZSBTVElfSU5ORVIgbm9wOyAyOiBub3A7CisjIGVsc2UKKyMgIGRlZmluZSBTVElfSU5ORVIgMjoKKyMgZW5kaWYKKyNlbHNlCisjIGRlZmluZSBDTElfT1VURVIKKyMgZGVmaW5lIFNUSV9PVVRFUgorIyBkZWZpbmUgQ0xJX0lOTkVSIDE6IERPX0NMSTsgQ0xJX0lOTkVSX05PUDsKKyMgZGVmaW5lIFNUSV9JTk5FUiBET19TVEk7CisjZW5kaWYKKwogLyoKICAqIFJlYWRzIG9uIHRoZSBCbGFja2ZpbiBhcmUgc3BlY3VsYXRpdmUuIEluIEJsYWNrZmluIHRlcm1zLCB0aGlzIG1lYW5zIHRoZXkKICAqIGNhbiBiZSBpbnRlcnJ1cHRlZCBhdCBhbnkgdGltZSAoZXZlbiBhZnRlciB0aGV5IGhhdmUgYmVlbiBpc3N1ZWQgb24gdG8gdGhlCkBAIC01MywxNzAgKzcxLDQ4IEBACiAgKiBidWZmZXJzIGluL291dCBvZiBGSUZPcy4KICAqLwogCi1FTlRSWShfaW5zbCkKLSNpZmRlZiBDT05GSUdfQkZJTl9JTlNfTE9XT1ZFUkhFQUQKLQlQMCA9IFIwOwkvKiBQMCA9IHBvcnQgKi8KLQljbGkgUjM7Ci0JUDEgPSBSMTsJLyogUDEgPSBhZGRyZXNzICovCi0JUDIgPSBSMjsJLyogUDIgPSBjb3VudCAqLwotCVNTWU5DOwotCUxTRVRVUCggLkxsb25nX2xvb3BfcywgLkxsb25nX2xvb3BfZSkgTEMwID0gUDI7Ci0uTGxvbmdfbG9vcF9zOiAgUjAgPSBbUDBdOwotCQlbUDErK10gPSBSMDsKLQkJTk9QOwotLkxsb25nX2xvb3BfZTogCU5PUDsKLQlzdGkgUjM7Ci0JUlRTOwotI2Vsc2UKLQlQMCA9IFIwOwkvKiBQMCA9IHBvcnQgKi8KLQlQMSA9IFIxOwkvKiBQMSA9IGFkZHJlc3MgKi8KLQlQMiA9IFIyOwkvKiBQMiA9IGNvdW50ICovCi0JU1NZTkM7Ci0JTFNFVFVQKCAuTGxvbmdfbG9vcF9zLCAuTGxvbmdfbG9vcF9lKSBMQzAgPSBQMjsKLS5MbG9uZ19sb29wX3M6Ci0JQ0xJIFIzOwotCU5PUDsgTk9QOyBOT1A7Ci0JUjAgPSBbUDBdOwotCVtQMSsrXSA9IFIwOwotLkxsb25nX2xvb3BfZToKLQlTVEkgUjM7CisjZGVmaW5lIENPTU1PTl9JTlMoZnVuYywgb3BzKSBcCitFTlRSWShfaW5zIyNmdW5jKSBcCisJUDAgPSBSMDsJLyogUDAgPSBwb3J0ICovIFwKKwlDTElfT1VURVI7CS8qIDMgaW5zdHJ1Y3Rpb25zIGJlZm9yZSBmaXJzdCByZWFkIGFjY2VzcyAqLyBcCisJUDEgPSBSMTsJLyogUDEgPSBhZGRyZXNzICovIFwKKwlQMiA9IFIyOwkvKiBQMiA9IGNvdW50ICovIFwKKwlTU1lOQzsgXAorIFwKKwlMU0VUVVAoMWYsIDJmKSBMQzAgPSBQMjsgXAorCUNMSV9JTk5FUjsgXAorCW9wczsgXAorCVNUSV9JTk5FUjsgXAorIFwKKwlTVElfT1VURVI7IFwKKwlSVFM7IFwKK0VORFBST0MoX2lucyMjZnVuYykKIAotCVJUUzsKLSNlbmRpZgotRU5EUFJPQyhfaW5zbCkKK0NPTU1PTl9JTlMobCwgXAorCVIwID0gW1AwXTsgXAorCVtQMSsrXSA9IFIwOyBcCispCiAKLUVOVFJZKF9pbnN3KQotI2lmZGVmIENPTkZJR19CRklOX0lOU19MT1dPVkVSSEVBRAotCVAwID0gUjA7CS8qIFAwID0gcG9ydCAqLwotCWNsaSBSMzsKLQlQMSA9IFIxOwkvKiBQMSA9IGFkZHJlc3MgKi8KLQlQMiA9IFIyOwkvKiBQMiA9IGNvdW50ICovCi0JU1NZTkM7Ci0JTFNFVFVQKCAuTHdvcmRfbG9vcF9zLCAuTHdvcmRfbG9vcF9lKSBMQzAgPSBQMjsKLS5Md29yZF9sb29wX3M6ICBSMCA9IFdbUDBdOwotCQlXW1AxKytdID0gUjA7Ci0JCU5PUDsKLS5Md29yZF9sb29wX2U6IAlOT1A7Ci0Jc3RpIFIzOwotCVJUUzsKLSNlbHNlCi0JUDAgPSBSMDsJLyogUDAgPSBwb3J0ICovCi0JUDEgPSBSMTsJLyogUDEgPSBhZGRyZXNzICovCi0JUDIgPSBSMjsJLyogUDIgPSBjb3VudCAqLwotCVNTWU5DOwotCUxTRVRVUCggLkx3b3JkX2xvb3BfcywgLkx3b3JkX2xvb3BfZSkgTEMwID0gUDI7Ci0uTHdvcmRfbG9vcF9zOgotCUNMSSBSMzsKLQlOT1A7IE5PUDsgTk9QOwotCVIwID0gV1tQMF07Ci0JV1tQMSsrXSA9IFIwOwotLkx3b3JkX2xvb3BfZToKLQlTVEkgUjM7Ci0JUlRTOworQ09NTU9OX0lOUyh3LCBcCisJUjAgPSBXW1AwXTsgXAorCVdbUDErK10gPSBSMDsgXAorKQogCi0jZW5kaWYKLUVORFBST0MoX2luc3cpCitDT01NT05fSU5TKHdfOCwgXAorCVIwID0gV1tQMF07IFwKKwlCW1AxKytdID0gUjA7IFwKKwlSMCA9IFIwID4+IDg7IFwKKwlCW1AxKytdID0gUjA7IFwKKykKIAotRU5UUlkoX2luc3dfOCkKLSNpZmRlZiBDT05GSUdfQkZJTl9JTlNfTE9XT1ZFUkhFQUQKLQlQMCA9IFIwOwkvKiBQMCA9IHBvcnQgKi8KLQljbGkgUjM7Ci0JUDEgPSBSMTsJLyogUDEgPSBhZGRyZXNzICovCi0JUDIgPSBSMjsJLyogUDIgPSBjb3VudCAqLwotCVNTWU5DOwotCUxTRVRVUCggLkx3b3JkOF9sb29wX3MsIC5Md29yZDhfbG9vcF9lKSBMQzAgPSBQMjsKLS5Md29yZDhfbG9vcF9zOiAgUjAgPSBXW1AwXTsKLQkJQltQMSsrXSA9IFIwOwotCQlSMCA9IFIwID4+IDg7Ci0JCUJbUDErK10gPSBSMDsKLQkJTk9QOwotLkx3b3JkOF9sb29wX2U6IE5PUDsKLQlzdGkgUjM7Ci0JUlRTOwotI2Vsc2UKLQlQMCA9IFIwOwkvKiBQMCA9IHBvcnQgKi8KLQlQMSA9IFIxOwkvKiBQMSA9IGFkZHJlc3MgKi8KLQlQMiA9IFIyOwkvKiBQMiA9IGNvdW50ICovCi0JU1NZTkM7Ci0JTFNFVFVQKCAuTHdvcmQ4X2xvb3BfcywgLkx3b3JkOF9sb29wX2UpIExDMCA9IFAyOwotLkx3b3JkOF9sb29wX3M6Ci0JQ0xJIFIzOwotCU5PUDsgTk9QOyBOT1A7Ci0JUjAgPSBXW1AwXTsKLQlCW1AxKytdID0gUjA7Ci0JUjAgPSBSMCA+PiA4OwotCUJbUDErK10gPSBSMDsKLQlOT1A7Ci0uTHdvcmQ4X2xvb3BfZToKLQlTVEkgUjM7CitDT01NT05fSU5TKGIsIFwKKwlSMCA9IEJbUDBdOyBcCisJQltQMSsrXSA9IFIwOyBcCispCiAKLQlSVFM7Ci0jZW5kaWYKLUVORFBST0MoX2luc3dfOCkKLQotRU5UUlkoX2luc2IpCi0jaWZkZWYgQ09ORklHX0JGSU5fSU5TX0xPV09WRVJIRUFECi0JUDAgPSBSMDsJLyogUDAgPSBwb3J0ICovCi0JY2xpIFIzOwotCVAxID0gUjE7CS8qIFAxID0gYWRkcmVzcyAqLwotCVAyID0gUjI7CS8qIFAyID0gY291bnQgKi8KLQlTU1lOQzsKLQlMU0VUVVAoIC5MYnl0ZV9sb29wX3MsIC5MYnl0ZV9sb29wX2UpIExDMCA9IFAyOwotLkxieXRlX2xvb3BfczogIFIwID0gQltQMF07Ci0JCUJbUDErK10gPSBSMDsKLQkJTk9QOwotLkxieXRlX2xvb3BfZTogIE5PUDsKLQlzdGkgUjM7Ci0JUlRTOwotI2Vsc2UKLQlQMCA9IFIwOyAgICAgICAgLyogUDAgPSBwb3J0ICovCi0JUDEgPSBSMTsgICAgICAgIC8qIFAxID0gYWRkcmVzcyAqLwotCVAyID0gUjI7ICAgICAgICAvKiBQMiA9IGNvdW50ICovCi0JU1NZTkM7Ci0JTFNFVFVQKCAuTGJ5dGVfbG9vcF9zLCAuTGJ5dGVfbG9vcF9lKSBMQzAgPSBQMjsKLS5MYnl0ZV9sb29wX3M6Ci0JQ0xJIFIzOwotCU5PUDsgTk9QOyBOT1A7Ci0JUjAgPSBCW1AwXTsKLQlCW1AxKytdID0gUjA7Ci0uTGJ5dGVfbG9vcF9lOgotCVNUSSBSMzsKLQotCVJUUzsKLSNlbmRpZgotRU5EUFJPQyhfaW5zYikKLQotRU5UUlkoX2luc2xfMTYpCi0jaWZkZWYgQ09ORklHX0JGSU5fSU5TX0xPV09WRVJIRUFECi0JUDAgPSBSMDsJLyogUDAgPSBwb3J0ICovCi0JY2xpIFIzOwotCVAxID0gUjE7CS8qIFAxID0gYWRkcmVzcyAqLwotCVAyID0gUjI7CS8qIFAyID0gY291bnQgKi8KLQlTU1lOQzsKLQlMU0VUVVAoIC5MbG9uZzE2X2xvb3BfcywgLkxsb25nMTZfbG9vcF9lKSBMQzAgPSBQMjsKLS5MbG9uZzE2X2xvb3BfczogIFIwID0gW1AwXTsKLQkJICBXW1AxKytdID0gUjA7Ci0JCSAgUjAgPSBSMCA+PiAxNjsKLQkJICBXW1AxKytdID0gUjA7Ci0JCSAgTk9QOwotLkxsb25nMTZfbG9vcF9lOiAgTk9QOwotCXN0aSBSMzsKLQlSVFM7Ci0jZWxzZQotCVAwID0gUjA7CS8qIFAwID0gcG9ydCAqLwotCVAxID0gUjE7CS8qIFAxID0gYWRkcmVzcyAqLwotCVAyID0gUjI7CS8qIFAyID0gY291bnQgKi8KLQlTU1lOQzsKLQlMU0VUVVAoIC5MbG9uZzE2X2xvb3BfcywgLkxsb25nMTZfbG9vcF9lKSBMQzAgPSBQMjsKLS5MbG9uZzE2X2xvb3BfczoKLQlDTEkgUjM7Ci0JTk9QOyBOT1A7IE5PUDsKLQlSMCA9IFtQMF07Ci0JV1tQMSsrXSA9IFIwOwotCVIwID0gUjAgPj4gMTY7Ci0JV1tQMSsrXSA9IFIwOwotLkxsb25nMTZfbG9vcF9lOgotCVNUSSBSMzsKLQlSVFM7Ci0jZW5kaWYKLUVORFBST0MoX2luc2xfMTYpCitDT01NT05fSU5TKGxfMTYsIFwKKwlSMCA9IFtQMF07IFwKKwlXW1AxKytdID0gUjA7IFwKKwlSMCA9IFIwID4+IDE2OyBcCisJV1tQMSsrXSA9IFIwOyBcCispCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2xpYi9tdWxkaTMuUyBiL2FyY2gvYmxhY2tmaW4vbGliL211bGRpMy5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiZGUxMjAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2JsYWNrZmluL2xpYi9tdWxkaTMuUwpAQCAtMCwwICsxLDY4IEBACisuYWxpZ24gMgorLmdsb2JhbCBfX19tdWxkaTM7CisudHlwZSBfX19tdWxkaTMsIFNUVF9GVU5DOworCisjaWZkZWYgQ09ORklHX0FSSVRITUVUSUNfT1BTX0wxCisuc2VjdGlvbiAubDEudGV4dAorI2Vsc2UKKy50ZXh0CisjZW5kaWYKKworLyoKKwkgICBSMTpSMCAqIFIzOlIyCisJID0gUjEuaDpSMS5sOlIwLmg6UjAubCAqIFIzLmg6UjMubDpSMi5oOlIyLmwKK1tYXQkgPSAoUjEuaCAqIFIzLmgpICogMl45NgorW1hdCSAgICsgKFIxLmggKiBSMy5sICsgUjEubCAqIFIzLmgpICogMl44MAorW1hdCSAgICsgKFIxLmggKiBSMi5oICsgUjEubCAqIFIzLmwgKyBSMy5oICogUjAuaCkgKiAyXjY0CitbVDFdCSAgICsgKFIxLmggKiBSMi5sICsgUjMuaCAqIFIwLmwgKyBSMS5sICogUjIuaCArIFIzLmwgKiBSMC5oKSAqIDJeNDgKK1tUMl0JICAgKyAoUjEubCAqIFIyLmwgKyBSMy5sICogUjAubCArIFIwLmggKiBSMi5oKSAqIDJeMzIKK1tUM10JICAgKyAoUjAubCAqIFIyLmggKyBSMi5sICogUjAuaCkgKiAyXjE2CitbVDRdCSAgICsgKFIwLmwgKiBSMi5sKQorCisJV2UgY2FuIGRpc2NhcmQgdGhlIGZpcnN0IHRocmVlIGxpbmVzIG1hcmtlZCAiWCIgc2luY2Ugd2UgcHJvZHVjZQorCW9ubHkgYSA2NCBiaXQgcmVzdWx0LiAgU28sIHdlIG5lZWQgdGVuIDE2LWJpdCBtdWx0aXBsaWVzLgorCisJSW5kaXZpZHVhbCBtdWwtYWNjIHJlc3VsdHM6CitbRTFdCSA9ICBSMS5oICogUjIubCArIFIzLmggKiBSMC5sICsgUjEubCAqIFIyLmggKyBSMy5sICogUjAuaAorW0UyXQkgPSAgUjEubCAqIFIyLmwgKyBSMy5sICogUjAubCArIFIwLmggKiBSMi5oCitbRTNdCSA9ICBSMC5sICogUjIuaCArIFIyLmwgKiBSMC5oCitbRTRdCSA9ICBSMC5sICogUjIubAorCisJV2UgYWxzbyBuZWVkIHRvIGFkZCBoaWdoIHBhcnRzIGZyb20gbG93ZXItbGV2ZWwgcmVzdWx0cyB0byBoaWdoZXIgb25lczoKKwlFW25dYyA9IEVbbl0gKyAoRVtuKzFdYyA+PiAxNiksIHdoZXJlIEU0YyA6PSBFNAorCisJT25lIGludGVyZXN0aW5nIHByb3BlcnR5IGlzIHRoYXQgYWxsIHBhcnRzIG9mIHRoZSByZXN1bHQgdGhhdCBkZXBlbmQKKwlvbiB0aGUgc2lnbiBvZiB0aGUgbXVsdGlwbGljYXRpb24gYXJlIGRpc2NhcmRlZC4gIFRob3NlIHdvdWxkIGJlIHRoZQorCW11bHRpcGxpY2F0aW9ucyBpbnZvbHZpbmcgUjEuaCBhbmQgUjMuaCwgYnV0IG9ubHkgdGhlIHRvcCAxNiBiaXQgb2YKKwl0aGUgMzIgYml0IHJlc3VsdCBkZXBlbmQgb24gdGhlIHNpZ24sIGFuZCBzaW5jZSBSMS5oIGFuZCBSMy5oIG9ubHkKKwlvY2N1ciBpbiBFMSwgdGhlIHRvcCBoYWxmIG9mIHRoZXNlIHJlc3VsdHMgaXMgY3V0IG9mZi4KKwlTbywgd2UgY2FuIGp1c3QgdXNlIEZVIG1vZGUgZm9yIGFsbCBvZiB0aGUgMTYtYml0IG11bHRpcGxpZXMsIGFuZAorCWlnbm9yZSBxdWVzdGlvbnMgb2Ygd2hlbiB0byB1c2UgbWl4ZWQgbW9kZS4gICovCisKK19fX211bGRpMzoKKwkvKiBbU1BdIHRlY2huaWNhbGx5IGlzIHBhcnQgb2YgdGhlIGNhbGxlcidzIGZyYW1lLCBidXQgd2UgY2FuCisJICAgdXNlIGl0IGFzIHNjcmF0Y2ggc3BhY2UuICAqLworCUEwID0gUjIuSCAqIFIxLkwsIEExID0gUjIuTCAqIFIxLkggKEZVKSB8fCBSMyA9IFtTUCArIDEyXTsJLyogRTEgKi8KKwlBMCArPSBSMy5IICogUjAuTCwgQTEgKz0gUjMuTCAqIFIwLkggKEZVKSB8fCBbU1BdID0gUjQ7CQkvKiBFMSAqLworCUEwICs9IEExOwkJCQkJCQkvKiBFMSAqLworCVI0ID0gQTAudzsKKwlBMCA9IFIwLmwgKiBSMy5sIChGVSk7CQkJCQkJLyogRTIgKi8KKwlBMCArPSBSMi5sICogUjEubCAoRlUpOwkJCQkJCS8qIEUyICovCisKKwlBMSA9IFIyLkwgKiBSMC5MIChGVSk7CQkJCQkJLyogRTQgKi8KKwlSMyA9IEExLnc7CisJQTEgPSBBMSA+PiAxNjsJCQkJCQkJLyogRTNjICovCisJQTAgKz0gUjIuSCAqIFIwLkgsIEExICs9IFIyLkwgKiBSMC5IIChGVSk7CQkJLyogRTIsIEUzYyAqLworCUExICs9IFIwLkwgKiBSMi5IIChGVSk7CQkJCQkJLyogRTNjICovCisJUjAgPSBBMS53OworCUExID0gQTEgPj4gMTY7CQkJCQkJCS8qIEUyYyAqLworCUEwICs9IEExOwkJCQkJCQkvKiBFMmMgKi8KKwlSMSA9IEEwLnc7CisKKwkvKiBsb3cocmVzdWx0KSA9IGxvdyhFM2MpOmxvdyhFNCkgKi8KKwlSMCA9IFBBQ0sgKFIwLmwsIFIzLmwpOworCS8qIGhpZ2gocmVzdWx0KSA9IEUyYyArIChFMSA8PCAxNikgKi8KKwlSMS5oID0gUjEuaCArIFI0LmwgKE5TKSB8fCBSNCA9IFtTUF07CisJUlRTOworCisuc2l6ZSBfX19tdWxkaTMsIC4tX19fbXVsZGkzCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2xpYi9tdWxkaTMuYyBiL2FyY2gvYmxhY2tmaW4vbGliL211bGRpMy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDNkMGM2Li4wMDAwMDAwCi0tLSBhL2FyY2gvYmxhY2tmaW4vbGliL211bGRpMy5jCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoKLSAqIEZpbGU6ICAgICAgICAgYXJjaC9ibGFja2Zpbi9saWIvbXVsZGkzLmMKLSAqIEJhc2VkIG9uOgotICogQXV0aG9yOgotICoKLSAqIENyZWF0ZWQ6Ci0gKiBEZXNjcmlwdGlvbjoKLSAqCi0gKiBNb2RpZmllZDoKLSAqICAgICAgICAgICAgICAgQ29weXJpZ2h0IDIwMDQtMjAwNiBBbmFsb2cgRGV2aWNlcyBJbmMuCi0gKgotICogQnVnczogICAgICAgICBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSB0aGUgZmlsZSBDT1BZSU5HLCBvciB3cml0ZQotICogdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0gKi8KLQotI2lmbmRlZiBTSV9UWVBFX1NJWkUKLSNkZWZpbmUgU0lfVFlQRV9TSVpFIDMyCi0jZW5kaWYKLSNkZWZpbmUgX19sbF9iICgxTCA8PCAoU0lfVFlQRV9TSVpFIC8gMikpCi0jZGVmaW5lIF9fbGxfbG93cGFydCh0KSAoKHVzaXR5cGUpICh0KSAlIF9fbGxfYikKLSNkZWZpbmUgX19sbF9oaWdocGFydCh0KSAoKHVzaXR5cGUpICh0KSAvIF9fbGxfYikKLSNkZWZpbmUgQklUU19QRVJfVU5JVCA4Ci0KLSNpZiAhZGVmaW5lZCh1bXVsX3BwbW0pCi0jZGVmaW5lIHVtdWxfcHBtbSh3MSwgdzAsIHUsIHYpCQkJCQkJXAotICBkbyB7CQkJCQkJCQkJXAotICAgIHVzaXR5cGUgX194MCwgX194MSwgX194MiwgX194MzsJCQkJCVwKLSAgICB1c2l0eXBlIF9fdWwsIF9fdmwsIF9fdWgsIF9fdmg7CQkJCQlcCi0JCQkJCQkJCQlcCi0gICAgX191bCA9IF9fbGxfbG93cGFydCAodSk7CQkJCQkJXAotICAgIF9fdWggPSBfX2xsX2hpZ2hwYXJ0ICh1KTsJCQkJCQlcCi0gICAgX192bCA9IF9fbGxfbG93cGFydCAodik7CQkJCQkJXAotICAgIF9fdmggPSBfX2xsX2hpZ2hwYXJ0ICh2KTsJCQkJCQlcCi0JCQkJCQkJCQlcCi0gICAgX194MCA9ICh1c2l0eXBlKSBfX3VsICogX192bDsJCQkJCVwKLSAgICBfX3gxID0gKHVzaXR5cGUpIF9fdWwgKiBfX3ZoOwkJCQkJXAotICAgIF9feDIgPSAodXNpdHlwZSkgX191aCAqIF9fdmw7CQkJCQlcCi0gICAgX194MyA9ICh1c2l0eXBlKSBfX3VoICogX192aDsJCQkJCVwKLQkJCQkJCQkJCVwKLSAgICBfX3gxICs9IF9fbGxfaGlnaHBhcnQgKF9feDApOy8qIHRoaXMgY2FuJ3QgZ2l2ZSBjYXJyeSAqLwkJXAotICAgIF9feDEgKz0gX194MjsJCS8qIGJ1dCB0aGlzIGluZGVlZCBjYW4gKi8JCVwKLSAgICBpZiAoX194MSA8IF9feDIpCQkvKiBkaWQgd2UgZ2V0IGl0PyAqLwkJCVwKLSAgICAgIF9feDMgKz0gX19sbF9iOwkJLyogeWVzLCBhZGQgaXQgaW4gdGhlIHByb3BlciBwb3MuICovCVwKLQkJCQkJCQkJCVwKLSAgICAodzEpID0gX194MyArIF9fbGxfaGlnaHBhcnQgKF9feDEpOwkJCQkJXAotICAgICh3MCkgPSBfX2xsX2xvd3BhcnQgKF9feDEpICogX19sbF9iICsgX19sbF9sb3dwYXJ0IChfX3gwKTsJCVwKLSAgfSB3aGlsZSAoMCkKLSNlbmRpZgotCi0jaWYgIWRlZmluZWQoX191bXVsc2lkaTMpCi0jZGVmaW5lIF9fdW11bHNpZGkzKHUsIHYpIAkJCQkJCVwKLSAgKHtkaXVuaW9uIF9fdzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICB1bXVsX3BwbW0gKF9fdy5zLmhpZ2gsIF9fdy5zLmxvdywgdSwgdik7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgX193LmxsOyB9KQotI2VuZGlmCi0KLXR5cGVkZWYgdW5zaWduZWQgaW50IHVzaXR5cGUgX19hdHRyaWJ1dGVfXyAoKG1vZGUoU0kpKSk7Ci10eXBlZGVmIGludCBzaXR5cGUgX19hdHRyaWJ1dGVfXyAoKG1vZGUoU0kpKSk7Ci10eXBlZGVmIGludCBkaXR5cGUgX19hdHRyaWJ1dGVfXyAoKG1vZGUoREkpKSk7Ci10eXBlZGVmIGludCB3b3JkX3R5cGUgX19hdHRyaWJ1dGVfXyAoKG1vZGUoX193b3JkX18pKSk7Ci0KLXN0cnVjdCBkaXN0cnVjdCB7Ci0Jc2l0eXBlIGxvdywgaGlnaDsKLX07Ci10eXBlZGVmIHVuaW9uIHsKLQlzdHJ1Y3QgZGlzdHJ1Y3QgczsKLQlkaXR5cGUgbGw7Ci19IGRpdW5pb247Ci0KLSNpZmRlZiBDT05GSUdfQVJJVEhNRVRJQ19PUFNfTDEKLWRpdHlwZSBfX211bGRpMyhkaXR5cGUgdSwgZGl0eXBlIHYpX19hdHRyaWJ1dGVfXygobDFfdGV4dCkpOwotI2VuZGlmCi0KLWRpdHlwZSBfX211bGRpMyhkaXR5cGUgdSwgZGl0eXBlIHYpCi17Ci0JZGl1bmlvbiB3OwotCWRpdW5pb24gdXUsIHZ2OwotCi0JdXUubGwgPSB1LCB2di5sbCA9IHY7Ci0Jdy5sbCA9IF9fdW11bHNpZGkzKHV1LnMubG93LCB2di5zLmxvdyk7Ci0Jdy5zLmhpZ2ggKz0gKCh1c2l0eXBlKSB1dS5zLmxvdyAqICh1c2l0eXBlKSB2di5zLmhpZ2gKLQkJICAgICArICh1c2l0eXBlKSB1dS5zLmhpZ2ggKiAodXNpdHlwZSkgdnYucy5sb3cpOwotCi0JcmV0dXJuIHcubGw7Ci19CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvS2NvbmZpZyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzOTdlZGUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvS2NvbmZpZwpAQCAtMCwwICsxLDIzMyBAQAoraWYgKEJGNTF4KQorCitzb3VyY2UgImFyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9ib2FyZHMvS2NvbmZpZyIKKworbWVudSAiQkY1MTggU3BlY2lmaWMgQ29uZmlndXJhdGlvbiIKKworY29tbWVudCAiQWx0ZXJuYXRpdmUgTXVsdGlwbGV4aW5nIFNjaGVtZSIKKworY2hvaWNlCisJcHJvbXB0ICJTUE9SVDAiCisJZGVmYXVsdCBCRjUxOF9TUE9SVDBfUE9SVEcKKwloZWxwCisJICBTZWxlY3QgUE9SVCB1c2VkIGZvciBTUE9SVDAuIFNlZSBIYXJkd2FyZSBSZWZlcmVuY2UgTWFudWFsCisKK2NvbmZpZyBCRjUxOF9TUE9SVDBfUE9SVEYKKwlib29sICJQT1JUIEYiCisJaGVscAorCSAgUE9SVCBGCisKK2NvbmZpZyBCRjUxOF9TUE9SVDBfUE9SVEcKKwlib29sICJQT1JUIEciCisJaGVscAorCSAgUE9SVCBHCitlbmRjaG9pY2UKKworY2hvaWNlCisJcHJvbXB0ICJTUE9SVDAgVFNDTEsgTG9jYXRpb24iCisJZGVwZW5kcyBvbiBCRjUxOF9TUE9SVDBfUE9SVEcKKwlkZWZhdWx0IEJGNTE4X1NQT1JUMF9UU0NMS19QRzEwCisJaGVscAorCSAgU2VsZWN0IFBJTiB1c2VkIGZvciBTUE9SVDBfVFNDTEsuIFNlZSBIYXJkd2FyZSBSZWZlcmVuY2UgTWFudWFsCisKK2NvbmZpZyBCRjUxOF9TUE9SVDBfVFNDTEtfUEcxMAorCWJvb2wgIlBPUlQgUEcxMCIKKwloZWxwCisJICBQT1JUIFBHMTAKKworY29uZmlnIEJGNTE4X1NQT1JUMF9UU0NMS19QRzE0CisJYm9vbCAiUE9SVCBQRzE0IgorCWhlbHAKKwkgIFBPUlQgUEcxNAorZW5kY2hvaWNlCisKK2Nob2ljZQorCXByb21wdCAiVUFSVDEiCisJZGVmYXVsdCBCRjUxOF9VQVJUMV9QT1JURgorCWhlbHAKKwkgIFNlbGVjdCBQT1JUIHVzZWQgZm9yIFVBUlQxLiBTZWUgSGFyZHdhcmUgUmVmZXJlbmNlIE1hbnVhbAorCitjb25maWcgQkY1MThfVUFSVDFfUE9SVEYKKwlib29sICJQT1JUIEYiCisJaGVscAorCSAgUE9SVCBGCisKK2NvbmZpZyBCRjUxOF9VQVJUMV9QT1JURworCWJvb2wgIlBPUlQgRyIKKwloZWxwCisJICBQT1JUIEcKK2VuZGNob2ljZQorCitjb21tZW50ICJJbnRlcnJ1cHQgUHJpb3JpdHkgQXNzaWdubWVudCIKK21lbnUgIlByaW9yaXR5IgorCitjb25maWcgSVJRX1BMTF9XQUtFVVAKKwlpbnQgIklSUV9QTExfV0FLRVVQIgorCWRlZmF1bHQgNworY29uZmlnIElSUV9ETUEwX0VSUk9SCisJaW50ICJJUlFfRE1BMF9FUlJPUiIKKwlkZWZhdWx0IDcKK2NvbmZpZyBJUlFfRE1BUjBfQkxLCisJaW50ICJJUlFfRE1BUjBfQkxLIgorCWRlZmF1bHQgNworY29uZmlnIElSUV9ETUFSMV9CTEsKKwlpbnQgIklSUV9ETUFSMV9CTEsiCisJZGVmYXVsdCA3Citjb25maWcgSVJRX0RNQVIwX09WUgorCWludCAiSVJRX0RNQVIwX09WUiIKKwlkZWZhdWx0IDcKK2NvbmZpZyBJUlFfRE1BUjFfT1ZSCisJaW50ICJJUlFfRE1BUjFfT1ZSIgorCWRlZmF1bHQgNworY29uZmlnIElSUV9QUElfRVJST1IKKwlpbnQgIklSUV9QUElfRVJST1IiCisJZGVmYXVsdCA3Citjb25maWcgSVJRX01BQ19FUlJPUgorCWludCAiSVJRX01BQ19FUlJPUiIKKwlkZWZhdWx0IDcKK2NvbmZpZyBJUlFfU1BPUlQwX0VSUk9SCisJaW50ICJJUlFfU1BPUlQwX0VSUk9SIgorCWRlZmF1bHQgNworY29uZmlnIElSUV9TUE9SVDFfRVJST1IKKwlpbnQgIklSUV9TUE9SVDFfRVJST1IiCisJZGVmYXVsdCA3Citjb25maWcgSVJRX1BUUF9FUlJPUgorCWludCAiSVJRX1BUUF9FUlJPUiIKKwlkZWZhdWx0IDcKK2NvbmZpZyBJUlFfVUFSVDBfRVJST1IKKwlpbnQgIklSUV9VQVJUMF9FUlJPUiIKKwlkZWZhdWx0IDcKK2NvbmZpZyBJUlFfVUFSVDFfRVJST1IKKwlpbnQgIklSUV9VQVJUMV9FUlJPUiIKKwlkZWZhdWx0IDcKK2NvbmZpZyBJUlFfUlRDCisJaW50ICJJUlFfUlRDIgorCWRlZmF1bHQgOAorY29uZmlnIElSUV9QUEkKKwlpbnQgIklSUV9QUEkiCisJZGVmYXVsdCA4Citjb25maWcgSVJRX1NQT1JUMF9SWAorCWludCAiSVJRX1NQT1JUMF9SWCIKKwlkZWZhdWx0IDkKK2NvbmZpZyBJUlFfU1BPUlQwX1RYCisJaW50ICJJUlFfU1BPUlQwX1RYIgorCWRlZmF1bHQgOQorY29uZmlnIElSUV9TUE9SVDFfUlgKKwlpbnQgIklSUV9TUE9SVDFfUlgiCisJZGVmYXVsdCA5Citjb25maWcgSVJRX1NQT1JUMV9UWAorCWludCAiSVJRX1NQT1JUMV9UWCIKKwlkZWZhdWx0IDkKK2NvbmZpZyBJUlFfVFdJCisJaW50ICJJUlFfVFdJIgorCWRlZmF1bHQgMTAKK2NvbmZpZyBJUlFfU1BJMAorCWludCAiSVJRX1NQSSIKKwlkZWZhdWx0IDEwCitjb25maWcgSVJRX1VBUlQwX1JYCisJaW50ICJJUlFfVUFSVDBfUlgiCisJZGVmYXVsdCAxMAorY29uZmlnIElSUV9VQVJUMF9UWAorCWludCAiSVJRX1VBUlQwX1RYIgorCWRlZmF1bHQgMTAKK2NvbmZpZyBJUlFfVUFSVDFfUlgKKwlpbnQgIklSUV9VQVJUMV9SWCIKKwlkZWZhdWx0IDEwCitjb25maWcgSVJRX1VBUlQxX1RYCisJaW50ICJJUlFfVUFSVDFfVFgiCisJZGVmYXVsdCAxMAorY29uZmlnIElSUV9PUFRTRUMKKwlpbnQgIklSUV9PUFRTRUMiCisJZGVmYXVsdCAxMQorY29uZmlnIElSUV9DTlQKKwlpbnQgIklSUV9DTlQiCisJZGVmYXVsdCAxMQorY29uZmlnIElSUV9NQUNfUlgKKwlpbnQgIklSUV9NQUNfUlgiCisJZGVmYXVsdCAxMQorY29uZmlnIElSUV9QT1JUSF9JTlRBCisJaW50ICJJUlFfUE9SVEhfSU5UQSIKKwlkZWZhdWx0IDExCitjb25maWcgSVJRX01BQ19UWAorCWludCAiSVJRX01BQ19UWC9ORkMiCisJZGVmYXVsdCAxMQorY29uZmlnIElSUV9QT1JUSF9JTlRCCisJaW50ICJJUlFfUE9SVEhfSU5UQiIKKwlkZWZhdWx0IDExCitjb25maWcgSVJRX1RJTUVSMAorCWludCAiSVJRX1RJTUVSMCIKKwlkZWZhdWx0IDgKK2NvbmZpZyBJUlFfVElNRVIxCisJaW50ICJJUlFfVElNRVIxIgorCWRlZmF1bHQgMTIKK2NvbmZpZyBJUlFfVElNRVIyCisJaW50ICJJUlFfVElNRVIyIgorCWRlZmF1bHQgMTIKK2NvbmZpZyBJUlFfVElNRVIzCisJaW50ICJJUlFfVElNRVIzIgorCWRlZmF1bHQgMTIKK2NvbmZpZyBJUlFfVElNRVI0CisJaW50ICJJUlFfVElNRVI0IgorCWRlZmF1bHQgMTIKK2NvbmZpZyBJUlFfVElNRVI1CisJaW50ICJJUlFfVElNRVI1IgorCWRlZmF1bHQgMTIKK2NvbmZpZyBJUlFfVElNRVI2CisJaW50ICJJUlFfVElNRVI2IgorCWRlZmF1bHQgMTIKK2NvbmZpZyBJUlFfVElNRVI3CisJaW50ICJJUlFfVElNRVI3IgorCWRlZmF1bHQgMTIKK2NvbmZpZyBJUlFfUE9SVEdfSU5UQQorCWludCAiSVJRX1BPUlRHX0lOVEEiCisJZGVmYXVsdCAxMgorY29uZmlnIElSUV9QT1JUR19JTlRCCisJaW50ICJJUlFfUE9SVEdfSU5UQiIKKwlkZWZhdWx0IDEyCitjb25maWcgSVJRX01FTV9ETUEwCisJaW50ICJJUlFfTUVNX0RNQTAiCisJZGVmYXVsdCAxMworY29uZmlnIElSUV9NRU1fRE1BMQorCWludCAiSVJRX01FTV9ETUExIgorCWRlZmF1bHQgMTMKK2NvbmZpZyBJUlFfV0FUQ0gKKwlpbnQgIklSUV9XQVRDSCIKKwlkZWZhdWx0IDEzCitjb25maWcgSVJRX1BPUlRGX0lOVEEKKwlpbnQgIklSUV9QT1JURl9JTlRBIgorCWRlZmF1bHQgMTMKK2NvbmZpZyBJUlFfUE9SVEZfSU5UQgorCWludCAiSVJRX1BPUlRGX0lOVEIiCisJZGVmYXVsdCAxMworY29uZmlnIElSUV9TUEkwX0VSUk9SCisJaW50ICJJUlFfU1BJMF9FUlJPUiIKKwlkZWZhdWx0IDcKK2NvbmZpZyBJUlFfU1BJMV9FUlJPUgorCWludCAiSVJRX1NQSTFfRVJST1IiCisJZGVmYXVsdCA3Citjb25maWcgSVJRX1JTSV9JTlQwCisJaW50ICJJUlFfUlNJX0lOVDAiCisJZGVmYXVsdCA3Citjb25maWcgSVJRX1JTSV9JTlQxCisJaW50ICJJUlFfUlNJX0lOVDEiCisJZGVmYXVsdCA3Citjb25maWcgSVJRX1BXTV9UUklQCisJaW50ICJJUlFfUFdNX1RSSVAiCisJZGVmYXVsdCAxMAorY29uZmlnIElSUV9QV01fU1lOQworCWludCAiSVJRX1BXTV9TWU5DIgorCWRlZmF1bHQgMTAKK2NvbmZpZyBJUlFfUFRQX1NUQVQKKwlpbnQgIklSUV9QVFBfU1RBVCIKKwlkZWZhdWx0IDEwCisKKwloZWxwCisJICBFbnRlciB0aGUgcHJpb3JpdHkgbnVtYmVycyBiZXR3ZWVuIDctMTMgT05MWS4gIE90aGVycyBhcmUgUmVzZXJ2ZWQuCisJICBUaGlzIGFwcGxpZXMgdG8gYWxsIHRoZSBhYm92ZS4gIEl0IGlzIG5vdCByZWNvbW1lbmRlZCB0byBhc3NpZ24gdGhlCisJICBoaWdoZXN0IHByaW9yaXR5IG51bWJlciA3IHRvIFVBUlQgb3IgYW55IG90aGVyIGRldmljZS4KKworZW5kbWVudQorCitlbmRtZW51CisKK2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvTWFrZWZpbGUgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTY4YTE5MwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9NYWtlZmlsZQpAQCAtMCwwICsxLDUgQEAKKyMKKyMgYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L01ha2VmaWxlCisjCisKK29iai15IDo9IGludHMtcHJpb3JpdHkubyBkbWEubwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2JvYXJkcy9LY29uZmlnIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2JvYXJkcy9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2MTYzNTEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvYm9hcmRzL0tjb25maWcKQEAgLTAsMCArMSwxMiBAQAorY2hvaWNlCisJcHJvbXB0ICJTeXN0ZW0gdHlwZSIKKwlkZWZhdWx0IEJGSU41MThGX0VaQlJECisJaGVscAorCSAgU2VsZWN0IHlvdXIgYm9hcmQhCisKK2NvbmZpZyBCRklONTE4Rl9FWkJSRAorCWJvb2wgIkJGNTE4Ri1FWkJSRCIKKwloZWxwCisJICBCRjUxOC1FWkJSRCBib2FyZCBzdXBwb3J0LgorCitlbmRjaG9pY2UKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9ib2FyZHMvTWFrZWZpbGUgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvYm9hcmRzL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3MmU4NTkKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvYm9hcmRzL01ha2VmaWxlCkBAIC0wLDAgKzEsNSBAQAorIworIyBhcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvYm9hcmRzL01ha2VmaWxlCisjCisKK29iai0kKENPTkZJR19CRklONTE4Rl9FWkJSRCkgICAgICAgICAgICArPSBlemJyZC5vCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvYm9hcmRzL2V6YnJkLmMgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvYm9hcmRzL2V6YnJkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTVmMTM1MQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9ib2FyZHMvZXpicmQuYwpAQCAtMCwwICsxLDY2OSBAQAorLyoKKyAqIEZpbGU6ICAgICAgICAgYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2JvYXJkcy9lemJyZC5jCisgKiBCYXNlZCBvbjogICAgIGFyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9ib2FyZHMvZXpicmQuYworICogQXV0aG9yOiAgICAgICBCcnlhbiBXdSA8Y29vbG9uZXlAa2VybmVsLm9yZz4KKyAqCisgKiBDcmVhdGVkOgorICogRGVzY3JpcHRpb246CisgKgorICogTW9kaWZpZWQ6CisgKiAgICAgICAgICAgICAgIENvcHlyaWdodCAyMDA1IE5hdGlvbmFsIElDVCBBdXN0cmFsaWEgKE5JQ1RBKQorICogICAgICAgICAgICAgICBDb3B5cmlnaHQgMjAwNC0yMDA4IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBCdWdzOiAgICAgICAgIEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIHRoZSBmaWxlIENPUFlJTkcsIG9yIHdyaXRlCisgKiB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqLworCisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL210ZC5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9wYXJ0aXRpb25zLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL3BoeXNtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL2ZsYXNoLmg+CisKKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxhc20vZG1hLmg+CisjaW5jbHVkZSA8YXNtL2JmaW41eHhfc3BpLmg+CisjaW5jbHVkZSA8YXNtL3JlYm9vdC5oPgorI2luY2x1ZGUgPGFzbS9wb3J0bXV4Lmg+CisjaW5jbHVkZSA8YXNtL2RwbWMuaD4KKyNpbmNsdWRlIDxhc20vYmZpbl9zZGguaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvYWQ3ODc3Lmg+CisKKy8qCisgKiBOYW1lIHRoZSBCb2FyZCBmb3IgdGhlIC9wcm9jL2NwdWluZm8KKyAqLworY29uc3QgY2hhciBiZmluX2JvYXJkX25hbWVbXSA9ICJBREkgQkY1MThGLUVaQlJEIjsKKworLyoKKyAqICBEcml2ZXIgbmVlZHMgdG8ga25vdyBhZGRyZXNzLCBpcnEgYW5kIGZsYWcgcGluLgorICovCisKKyNpZiBkZWZpbmVkKENPTkZJR19NVERfUEhZU01BUCkgfHwgZGVmaW5lZChDT05GSUdfTVREX1BIWVNNQVBfTU9EVUxFKQorc3RhdGljIHN0cnVjdCBtdGRfcGFydGl0aW9uIGV6YnJkX3BhcnRpdGlvbnNbXSA9IHsKKwl7CisJCS5uYW1lICAgICAgID0gImJvb3Rsb2FkZXIobm9yKSIsCisJCS5zaXplICAgICAgID0gMHg0MDAwMCwKKwkJLm9mZnNldCAgICAgPSAwLAorCX0sIHsKKwkJLm5hbWUgICAgICAgPSAibGludXgga2VybmVsKG5vcikiLAorCQkuc2l6ZSAgICAgICA9IDB4MUMwMDAwLAorCQkub2Zmc2V0ICAgICA9IE1URFBBUlRfT0ZTX0FQUEVORCwKKwl9LCB7CisJCS5uYW1lICAgICAgID0gImZpbGUgc3lzdGVtKG5vcikiLAorCQkuc2l6ZSAgICAgICA9IE1URFBBUlRfU0laX0ZVTEwsCisJCS5vZmZzZXQgICAgID0gTVREUEFSVF9PRlNfQVBQRU5ELAorCX0KK307CisKK3N0YXRpYyBzdHJ1Y3QgcGh5c21hcF9mbGFzaF9kYXRhIGV6YnJkX2ZsYXNoX2RhdGEgPSB7CisJLndpZHRoICAgICAgPSAyLAorCS5wYXJ0cyAgICAgID0gZXpicmRfcGFydGl0aW9ucywKKwkubnJfcGFydHMgICA9IEFSUkFZX1NJWkUoZXpicmRfcGFydGl0aW9ucyksCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGV6YnJkX2ZsYXNoX3Jlc291cmNlID0geworCS5zdGFydCA9IDB4MjAwMDAwMDAsCisJLmVuZCAgID0gMHgyMDNmZmZmZiwKKwkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGV6YnJkX2ZsYXNoX2RldmljZSA9IHsKKwkubmFtZSAgICAgICAgICA9ICJwaHlzbWFwLWZsYXNoIiwKKwkuaWQgICAgICAgICAgICA9IDAsCisJLmRldiA9IHsKKwkJLnBsYXRmb3JtX2RhdGEgPSAmZXpicmRfZmxhc2hfZGF0YSwKKwl9LAorCS5udW1fcmVzb3VyY2VzID0gMSwKKwkucmVzb3VyY2UgICAgICA9ICZlemJyZF9mbGFzaF9yZXNvdXJjZSwKK307CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX1JUQ19EUlZfQkZJTikgfHwgZGVmaW5lZChDT05GSUdfUlRDX0RSVl9CRklOX01PRFVMRSkKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHJ0Y19kZXZpY2UgPSB7CisJLm5hbWUgPSAicnRjLWJmaW4iLAorCS5pZCAgID0gLTEsCit9OworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19CRklOX01BQykgfHwgZGVmaW5lZChDT05GSUdfQkZJTl9NQUNfTU9EVUxFKQorc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9tYWNfZGV2aWNlID0geworCS5uYW1lID0gImJmaW5fbWFjIiwKK307CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX01URF9NMjVQODApIFwKKwl8fCBkZWZpbmVkKENPTkZJR19NVERfTTI1UDgwX01PRFVMRSkKK3N0YXRpYyBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiBiZmluX3NwaV9mbGFzaF9wYXJ0aXRpb25zW10gPSB7CisJeworCQkubmFtZSA9ICJib290bG9hZGVyKHNwaSkiLAorCQkuc2l6ZSA9IDB4MDAwNDAwMDAsCisJCS5vZmZzZXQgPSAwLAorCQkubWFza19mbGFncyA9IE1URF9DQVBfUk9NCisJfSwgeworCQkubmFtZSA9ICJsaW51eCBrZXJuZWwoc3BpKSIsCisJCS5zaXplID0gTVREUEFSVF9TSVpfRlVMTCwKKwkJLm9mZnNldCA9IE1URFBBUlRfT0ZTX0FQUEVORCwKKwl9Cit9OworCitzdGF0aWMgc3RydWN0IGZsYXNoX3BsYXRmb3JtX2RhdGEgYmZpbl9zcGlfZmxhc2hfZGF0YSA9IHsKKwkubmFtZSA9ICJtMjVwODAiLAorCS5wYXJ0cyA9IGJmaW5fc3BpX2ZsYXNoX3BhcnRpdGlvbnMsCisJLm5yX3BhcnRzID0gQVJSQVlfU0laRShiZmluX3NwaV9mbGFzaF9wYXJ0aXRpb25zKSwKKwkudHlwZSA9ICJtMjVwMTYiLAorfTsKKworLyogU1BJIGZsYXNoIGNoaXAgKG0yNXA2NCkgKi8KK3N0YXRpYyBzdHJ1Y3QgYmZpbjV4eF9zcGlfY2hpcCBzcGlfZmxhc2hfY2hpcF9pbmZvID0geworCS5lbmFibGVfZG1hID0gMCwgICAgICAgICAvKiB1c2UgZG1hIHRyYW5zZmVyIHdpdGggdGhpcyBjaGlwKi8KKwkuYml0c19wZXJfd29yZCA9IDgsCit9OworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19TUElfQURDX0JGNTMzKSBcCisJfHwgZGVmaW5lZChDT05GSUdfU1BJX0FEQ19CRjUzM19NT0RVTEUpCisvKiBTUEkgQURDIGNoaXAgKi8KK3N0YXRpYyBzdHJ1Y3QgYmZpbjV4eF9zcGlfY2hpcCBzcGlfYWRjX2NoaXBfaW5mbyA9IHsKKwkuZW5hYmxlX2RtYSA9IDEsICAgICAgICAgLyogdXNlIGRtYSB0cmFuc2ZlciB3aXRoIHRoaXMgY2hpcCovCisJLmJpdHNfcGVyX3dvcmQgPSAxNiwKK307CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX1NQSV9NTUMpIHx8IGRlZmluZWQoQ09ORklHX1NQSV9NTUNfTU9EVUxFKQorc3RhdGljIHN0cnVjdCBiZmluNXh4X3NwaV9jaGlwIHNwaV9tbWNfY2hpcF9pbmZvID0geworCS5lbmFibGVfZG1hID0gMSwKKwkuYml0c19wZXJfd29yZCA9IDgsCit9OworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19QQlgpCitzdGF0aWMgc3RydWN0IGJmaW41eHhfc3BpX2NoaXAgc3BpX3NpM3h4eF9jaGlwX2luZm8gPSB7CisJLmN0bF9yZWcJPSAweDQsIC8qIHNlbmQgemVybyAqLworCS5lbmFibGVfZG1hCT0gMCwKKwkuYml0c19wZXJfd29yZAk9IDgsCisJLmNzX2NoYW5nZV9wZXJfd29yZCA9IDEsCit9OworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19UT1VDSFNDUkVFTl9BRDc4NzcpIHx8IGRlZmluZWQoQ09ORklHX1RPVUNIU0NSRUVOX0FENzg3N19NT0RVTEUpCitzdGF0aWMgc3RydWN0IGJmaW41eHhfc3BpX2NoaXAgc3BpX2FkNzg3N19jaGlwX2luZm8gPSB7CisJLmVuYWJsZV9kbWEgPSAwLAorCS5iaXRzX3Blcl93b3JkID0gMTYsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGFkNzg3N19wbGF0Zm9ybV9kYXRhIGJmaW5fYWQ3ODc3X3RzX2luZm8gPSB7CisJLm1vZGVsCQkJPSA3ODc3LAorCS52cmVmX2RlbGF5X3VzZWNzCT0gNTAsCS8qIGludGVybmFsLCBubyBjYXBhY2l0b3IgKi8KKwkueF9wbGF0ZV9vaG1zCQk9IDQxOSwKKwkueV9wbGF0ZV9vaG1zCQk9IDQ4NiwKKwkucHJlc3N1cmVfbWF4CQk9IDEwMDAsCisJLnByZXNzdXJlX21pbgkJPSAwLAorCS5zdG9wYWNxX3BvbGFyaXR5IAk9IDEsCisJLmZpcnN0X2NvbnZlcnNpb25fZGVsYXkgPSAzLAorCS5hY3F1aXNpdGlvbl90aW1lIAk9IDEsCisJLmF2ZXJhZ2luZyAJCT0gMSwKKwkucGVuX2Rvd25fYWNjX2ludGVydmFsIAk9IDEsCit9OworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19TTkRfU09DX1dNODczMSkgfHwgZGVmaW5lZChDT05GSUdfU05EX1NPQ19XTTg3MzFfTU9EVUxFKSBcCisJICYmIGRlZmluZWQoQ09ORklHX1NORF9TT0NfV004NzMxX1NQSSkKK3N0YXRpYyBzdHJ1Y3QgYmZpbjV4eF9zcGlfY2hpcCBzcGlfd204NzMxX2NoaXBfaW5mbyA9IHsKKwkuZW5hYmxlX2RtYSA9IDAsCisJLmJpdHNfcGVyX3dvcmQgPSAxNiwKK307CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX1NQSV9TUElERVYpIHx8IGRlZmluZWQoQ09ORklHX1NQSV9TUElERVZfTU9EVUxFKQorc3RhdGljIHN0cnVjdCBiZmluNXh4X3NwaV9jaGlwIHNwaWRldl9jaGlwX2luZm8gPSB7CisJLmVuYWJsZV9kbWEgPSAwLAorCS5iaXRzX3Blcl93b3JkID0gOCwKK307CisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBzcGlfYm9hcmRfaW5mbyBiZmluX3NwaV9ib2FyZF9pbmZvW10gX19pbml0ZGF0YSA9IHsKKyNpZiBkZWZpbmVkKENPTkZJR19NVERfTTI1UDgwKSBcCisJfHwgZGVmaW5lZChDT05GSUdfTVREX00yNVA4MF9NT0RVTEUpCisJeworCQkvKiB0aGUgbW9kYWxpYXMgbXVzdCBiZSB0aGUgc2FtZSBhcyBzcGkgZGV2aWNlIGRyaXZlciBuYW1lICovCisJCS5tb2RhbGlhcyA9ICJtMjVwODAiLCAvKiBOYW1lIG9mIHNwaV9kcml2ZXIgZm9yIHRoaXMgZGV2aWNlICovCisJCS5tYXhfc3BlZWRfaHogPSAyNTAwMDAwMCwgICAgIC8qIG1heCBzcGkgY2xvY2sgKFNDSykgc3BlZWQgaW4gSFogKi8KKwkJLmJ1c19udW0gPSAwLCAvKiBGcmFtZXdvcmsgYnVzIG51bWJlciAqLworCQkuY2hpcF9zZWxlY3QgPSAxLCAvKiBGcmFtZXdvcmsgY2hpcCBzZWxlY3QuIE9uIFNUQU1QNTM3IGl0IGlzIFNQSVNTRUwxKi8KKwkJLnBsYXRmb3JtX2RhdGEgPSAmYmZpbl9zcGlfZmxhc2hfZGF0YSwKKwkJLmNvbnRyb2xsZXJfZGF0YSA9ICZzcGlfZmxhc2hfY2hpcF9pbmZvLAorCQkubW9kZSA9IFNQSV9NT0RFXzMsCisJfSwKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfU1BJX0FEQ19CRjUzMykgXAorCXx8IGRlZmluZWQoQ09ORklHX1NQSV9BRENfQkY1MzNfTU9EVUxFKQorCXsKKwkJLm1vZGFsaWFzID0gImJmaW5fc3BpX2FkYyIsIC8qIE5hbWUgb2Ygc3BpX2RyaXZlciBmb3IgdGhpcyBkZXZpY2UgKi8KKwkJLm1heF9zcGVlZF9oeiA9IDYyNTAwMDAsICAgICAvKiBtYXggc3BpIGNsb2NrIChTQ0spIHNwZWVkIGluIEhaICovCisJCS5idXNfbnVtID0gMCwgLyogRnJhbWV3b3JrIGJ1cyBudW1iZXIgKi8KKwkJLmNoaXBfc2VsZWN0ID0gMSwgLyogRnJhbWV3b3JrIGNoaXAgc2VsZWN0LiAqLworCQkucGxhdGZvcm1fZGF0YSA9IE5VTEwsIC8qIE5vIHNwaV9kcml2ZXIgc3BlY2lmaWMgY29uZmlnICovCisJCS5jb250cm9sbGVyX2RhdGEgPSAmc3BpX2FkY19jaGlwX2luZm8sCisJfSwKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfU1BJX01NQykgfHwgZGVmaW5lZChDT05GSUdfU1BJX01NQ19NT0RVTEUpCisJeworCQkubW9kYWxpYXMgPSAic3BpX21tY19kdW1teSIsCisJCS5tYXhfc3BlZWRfaHogPSAyNTAwMDAwMCwgICAgIC8qIG1heCBzcGkgY2xvY2sgKFNDSykgc3BlZWQgaW4gSFogKi8KKwkJLmJ1c19udW0gPSAwLAorCQkuY2hpcF9zZWxlY3QgPSAwLAorCQkucGxhdGZvcm1fZGF0YSA9IE5VTEwsCisJCS5jb250cm9sbGVyX2RhdGEgPSAmc3BpX21tY19jaGlwX2luZm8sCisJCS5tb2RlID0gU1BJX01PREVfMywKKwl9LAorCXsKKwkJLm1vZGFsaWFzID0gInNwaV9tbWMiLAorCQkubWF4X3NwZWVkX2h6ID0gMjUwMDAwMDAsICAgICAvKiBtYXggc3BpIGNsb2NrIChTQ0spIHNwZWVkIGluIEhaICovCisJCS5idXNfbnVtID0gMCwKKwkJLmNoaXBfc2VsZWN0ID0gQ09ORklHX1NQSV9NTUNfQ1NfQ0hBTiwKKwkJLnBsYXRmb3JtX2RhdGEgPSBOVUxMLAorCQkuY29udHJvbGxlcl9kYXRhID0gJnNwaV9tbWNfY2hpcF9pbmZvLAorCQkubW9kZSA9IFNQSV9NT0RFXzMsCisJfSwKKyNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX1BCWCkKKwl7CisJCS5tb2RhbGlhcyA9ICJmeHMtc3BpIiwKKwkJLm1heF9zcGVlZF9oeiA9IDEyNTAwMDAwLCAgICAgLyogbWF4IHNwaSBjbG9jayAoU0NLKSBzcGVlZCBpbiBIWiAqLworCQkuYnVzX251bSA9IDAsCisJCS5jaGlwX3NlbGVjdCA9IDggLSBDT05GSUdfSjExX0pVTVBFUiwKKwkJLmNvbnRyb2xsZXJfZGF0YSA9ICZzcGlfc2kzeHh4X2NoaXBfaW5mbywKKwkJLm1vZGUgPSBTUElfTU9ERV8zLAorCX0sCisJeworCQkubW9kYWxpYXMgPSAiZnhvLXNwaSIsCisJCS5tYXhfc3BlZWRfaHogPSAxMjUwMDAwMCwgICAgIC8qIG1heCBzcGkgY2xvY2sgKFNDSykgc3BlZWQgaW4gSFogKi8KKwkJLmJ1c19udW0gPSAwLAorCQkuY2hpcF9zZWxlY3QgPSA4IC0gQ09ORklHX0oxOV9KVU1QRVIsCisJCS5jb250cm9sbGVyX2RhdGEgPSAmc3BpX3NpM3h4eF9jaGlwX2luZm8sCisJCS5tb2RlID0gU1BJX01PREVfMywKKwl9LAorI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfVE9VQ0hTQ1JFRU5fQUQ3ODc3KSB8fCBkZWZpbmVkKENPTkZJR19UT1VDSFNDUkVFTl9BRDc4NzdfTU9EVUxFKQorCXsKKwkJLm1vZGFsaWFzCQk9ICJhZDc4NzciLAorCQkucGxhdGZvcm1fZGF0YQkJPSAmYmZpbl9hZDc4NzdfdHNfaW5mbywKKwkJLmlycQkJCT0gSVJRX1BGOCwKKwkJLm1heF9zcGVlZF9oegk9IDEyNTAwMDAwLCAgICAgLyogbWF4IHNwaSBjbG9jayAoU0NLKSBzcGVlZCBpbiBIWiAqLworCQkuYnVzX251bQk9IDAsCisJCS5jaGlwX3NlbGVjdCAgPSAyLAorCQkuY29udHJvbGxlcl9kYXRhID0gJnNwaV9hZDc4NzdfY2hpcF9pbmZvLAorCX0sCisjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19TTkRfU09DX1dNODczMSkgfHwgZGVmaW5lZChDT05GSUdfU05EX1NPQ19XTTg3MzFfTU9EVUxFKSBcCisJICYmIGRlZmluZWQoQ09ORklHX1NORF9TT0NfV004NzMxX1NQSSkKKwl7CisJCS5tb2RhbGlhcwk9ICJ3bTg3MzEiLAorCQkubWF4X3NwZWVkX2h6CT0gMzEyNTAwMCwgICAgIC8qIG1heCBzcGkgY2xvY2sgKFNDSykgc3BlZWQgaW4gSFogKi8KKwkJLmJ1c19udW0JPSAwLAorCQkuY2hpcF9zZWxlY3QgICAgPSA1LAorCQkuY29udHJvbGxlcl9kYXRhID0gJnNwaV93bTg3MzFfY2hpcF9pbmZvLAorCQkubW9kZSA9IFNQSV9NT0RFXzAsCisJfSwKKyNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX1NQSV9TUElERVYpIHx8IGRlZmluZWQoQ09ORklHX1NQSV9TUElERVZfTU9EVUxFKQorCXsKKwkJLm1vZGFsaWFzID0gInNwaWRldiIsCisJCS5tYXhfc3BlZWRfaHogPSAzMTI1MDAwLCAgICAgLyogbWF4IHNwaSBjbG9jayAoU0NLKSBzcGVlZCBpbiBIWiAqLworCQkuYnVzX251bSA9IDAsCisJCS5jaGlwX3NlbGVjdCA9IDEsCisJCS5jb250cm9sbGVyX2RhdGEgPSAmc3BpZGV2X2NoaXBfaW5mbywKKwl9LAorI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfRkJfQkZJTl9MUTAzNVExKSB8fCBkZWZpbmVkKENPTkZJR19GQl9CRklOX0xRMDM1UTFfTU9EVUxFKQorCXsKKwkJLm1vZGFsaWFzID0gImJmaW4tbHEwMzVxMS1zcGkiLAorCQkubWF4X3NwZWVkX2h6ID0gMjAwMDAwMDAsICAgICAvKiBtYXggc3BpIGNsb2NrIChTQ0spIHNwZWVkIGluIEhaICovCisJCS5idXNfbnVtID0gMCwKKwkJLmNoaXBfc2VsZWN0ID0gMSwKKwkJLmNvbnRyb2xsZXJfZGF0YSA9ICZscTAzNXExX3NwaV9jaGlwX2luZm8sCisJCS5tb2RlID0gU1BJX0NQSEEgfCBTUElfQ1BPTCwKKwl9LAorI2VuZGlmCit9OworCisvKiBTUEkgY29udHJvbGxlciBkYXRhICovCisjaWYgZGVmaW5lZChDT05GSUdfU1BJX0JGSU4pIHx8IGRlZmluZWQoQ09ORklHX1NQSV9CRklOX01PRFVMRSkKKy8qIFNQSSAoMCkgKi8KK3N0YXRpYyBzdHJ1Y3QgYmZpbjV4eF9zcGlfbWFzdGVyIGJmaW5fc3BpMF9pbmZvID0geworCS5udW1fY2hpcHNlbGVjdCA9IDUsCisJLmVuYWJsZV9kbWEgPSAxLCAgLyogbWFzdGVyIGhhcyB0aGUgYWJpbGl0eSB0byBkbyBkbWEgdHJhbnNmZXIgKi8KKwkucGluX3JlcSA9IHtQX1NQSTBfU0NLLCBQX1NQSTBfTUlTTywgUF9TUEkwX01PU0ksIDB9LAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBiZmluX3NwaTBfcmVzb3VyY2VbXSA9IHsKKwlbMF0gPSB7CisJCS5zdGFydCA9IFNQSTBfUkVHQkFTRSwKKwkJLmVuZCAgID0gU1BJMF9SRUdCQVNFICsgMHhGRiwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCisJCX0sCisJWzFdID0geworCQkuc3RhcnQgPSBDSF9TUEkwLAorCQkuZW5kICAgPSBDSF9TUEkwLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9zcGkwX2RldmljZSA9IHsKKwkubmFtZSA9ICJiZmluLXNwaSIsCisJLmlkID0gMCwgLyogQnVzIG51bWJlciAqLworCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShiZmluX3NwaTBfcmVzb3VyY2UpLAorCS5yZXNvdXJjZSA9IGJmaW5fc3BpMF9yZXNvdXJjZSwKKwkuZGV2ID0geworCQkucGxhdGZvcm1fZGF0YSA9ICZiZmluX3NwaTBfaW5mbywgLyogUGFzc2VkIHRvIGRyaXZlciAqLworCX0sCit9OworCisvKiBTUEkgKDEpICovCitzdGF0aWMgc3RydWN0IGJmaW41eHhfc3BpX21hc3RlciBiZmluX3NwaTFfaW5mbyA9IHsKKwkubnVtX2NoaXBzZWxlY3QgPSA1LAorCS5lbmFibGVfZG1hID0gMSwgIC8qIG1hc3RlciBoYXMgdGhlIGFiaWxpdHkgdG8gZG8gZG1hIHRyYW5zZmVyICovCisJLnBpbl9yZXEgPSB7UF9TUEkxX1NDSywgUF9TUEkxX01JU08sIFBfU1BJMV9NT1NJLCAwfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYmZpbl9zcGkxX3Jlc291cmNlW10gPSB7CisJWzBdID0geworCQkuc3RhcnQgPSBTUEkxX1JFR0JBU0UsCisJCS5lbmQgICA9IFNQSTFfUkVHQkFTRSArIDB4RkYsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAorCQl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0ID0gQ0hfU1BJMSwKKwkJLmVuZCAgID0gQ0hfU1BJMSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmaW5fc3BpMV9kZXZpY2UgPSB7CisJLm5hbWUgPSAiYmZpbi1zcGkiLAorCS5pZCA9IDEsIC8qIEJ1cyBudW1iZXIgKi8KKwkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUoYmZpbl9zcGkxX3Jlc291cmNlKSwKKwkucmVzb3VyY2UgPSBiZmluX3NwaTFfcmVzb3VyY2UsCisJLmRldiA9IHsKKwkJLnBsYXRmb3JtX2RhdGEgPSAmYmZpbl9zcGkxX2luZm8sIC8qIFBhc3NlZCB0byBkcml2ZXIgKi8KKwl9LAorfTsKKyNlbmRpZiAgLyogc3BpIG1hc3RlciBhbmQgZGV2aWNlcyAqLworCisjaWYgZGVmaW5lZChDT05GSUdfU0VSSUFMX0JGSU4pIHx8IGRlZmluZWQoQ09ORklHX1NFUklBTF9CRklOX01PRFVMRSkKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYmZpbl91YXJ0X3Jlc291cmNlc1tdID0geworI2lmZGVmIENPTkZJR19TRVJJQUxfQkZJTl9VQVJUMAorCXsKKwkJLnN0YXJ0ID0gMHhGRkMwMDQwMCwKKwkJLmVuZCA9IDB4RkZDMDA0RkYsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfU0VSSUFMX0JGSU5fVUFSVDEKKwl7CisJCS5zdGFydCA9IDB4RkZDMDIwMDAsCisJCS5lbmQgPSAweEZGQzAyMEZGLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKKwl9LAorI2VuZGlmCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX3VhcnRfZGV2aWNlID0geworCS5uYW1lID0gImJmaW4tdWFydCIsCisJLmlkID0gMSwKKwkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUoYmZpbl91YXJ0X3Jlc291cmNlcyksCisJLnJlc291cmNlID0gYmZpbl91YXJ0X3Jlc291cmNlcywKK307CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX0JGSU5fU0lSKSB8fCBkZWZpbmVkKENPTkZJR19CRklOX1NJUl9NT0RVTEUpCisjaWZkZWYgQ09ORklHX0JGSU5fU0lSMAorc3RhdGljIHN0cnVjdCByZXNvdXJjZSBiZmluX3NpcjBfcmVzb3VyY2VzW10gPSB7CisJeworCQkuc3RhcnQgPSAweEZGQzAwNDAwLAorCQkuZW5kID0gMHhGRkMwMDRGRiwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwl7CisJCS5zdGFydCA9IElSUV9VQVJUMF9SWCwKKwkJLmVuZCA9IElSUV9VQVJUMF9SWCsxLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCXsKKwkJLnN0YXJ0ID0gQ0hfVUFSVDBfUlgsCisJCS5lbmQgPSBDSF9VQVJUMF9SWCsxLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0RNQSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9zaXIwX2RldmljZSA9IHsKKwkubmFtZSA9ICJiZmluX3NpciIsCisJLmlkID0gMCwKKwkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUoYmZpbl9zaXIwX3Jlc291cmNlcyksCisJLnJlc291cmNlID0gYmZpbl9zaXIwX3Jlc291cmNlcywKK307CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQkZJTl9TSVIxCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGJmaW5fc2lyMV9yZXNvdXJjZXNbXSA9IHsKKwl7CisJCS5zdGFydCA9IDB4RkZDMDIwMDAsCisJCS5lbmQgPSAweEZGQzAyMEZGLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCXsKKwkJLnN0YXJ0ID0gSVJRX1VBUlQxX1JYLAorCQkuZW5kID0gSVJRX1VBUlQxX1JYKzEsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJeworCQkuc3RhcnQgPSBDSF9VQVJUMV9SWCwKKwkJLmVuZCA9IENIX1VBUlQxX1JYKzEsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfRE1BLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX3NpcjFfZGV2aWNlID0geworCS5uYW1lID0gImJmaW5fc2lyIiwKKwkuaWQgPSAxLAorCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShiZmluX3NpcjFfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UgPSBiZmluX3NpcjFfcmVzb3VyY2VzLAorfTsKKyNlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19JMkNfQkxBQ0tGSU5fVFdJKSB8fCBkZWZpbmVkKENPTkZJR19JMkNfQkxBQ0tGSU5fVFdJX01PRFVMRSkKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYmZpbl90d2kwX3Jlc291cmNlW10gPSB7CisJWzBdID0geworCQkuc3RhcnQgPSBUV0kwX1JFR0JBU0UsCisJCS5lbmQgICA9IFRXSTBfUkVHQkFTRSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydCA9IElSUV9UV0ksCisJCS5lbmQgICA9IElSUV9UV0ksCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBpMmNfYmZpbl90d2lfZGV2aWNlID0geworCS5uYW1lID0gImkyYy1iZmluLXR3aSIsCisJLmlkID0gMCwKKwkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUoYmZpbl90d2kwX3Jlc291cmNlKSwKKwkucmVzb3VyY2UgPSBiZmluX3R3aTBfcmVzb3VyY2UsCit9OworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfSTJDX0JPQVJESU5GTworc3RhdGljIHN0cnVjdCBpMmNfYm9hcmRfaW5mbyBfX2luaXRkYXRhIGJmaW5faTJjX2JvYXJkX2luZm9bXSA9IHsKKyNpZiBkZWZpbmVkKENPTkZJR19UV0lfTENEKSB8fCBkZWZpbmVkKENPTkZJR19UV0lfTENEX01PRFVMRSkKKwl7CisJCUkyQ19CT0FSRF9JTkZPKCJwY2Y4NTc0X2xjZCIsIDB4MjIpLAorCX0sCisjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19UV0lfS0VZUEFEKSB8fCBkZWZpbmVkKENPTkZJR19UV0lfS0VZUEFEX01PRFVMRSkKKwl7CisJCUkyQ19CT0FSRF9JTkZPKCJwY2Y4NTc0X2tleXBhZCIsIDB4MjcpLAorCQkuaXJxID0gSVJRX1BGOCwKKwl9LAorI2VuZGlmCit9OworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19TRVJJQUxfQkZJTl9TUE9SVCkgfHwgZGVmaW5lZChDT05GSUdfU0VSSUFMX0JGSU5fU1BPUlRfTU9EVUxFKQorc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9zcG9ydDBfdWFydF9kZXZpY2UgPSB7CisJLm5hbWUgPSAiYmZpbi1zcG9ydC11YXJ0IiwKKwkuaWQgPSAwLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9zcG9ydDFfdWFydF9kZXZpY2UgPSB7CisJLm5hbWUgPSAiYmZpbi1zcG9ydC11YXJ0IiwKKwkuaWQgPSAxLAorfTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfS0VZQk9BUkRfR1BJTykgfHwgZGVmaW5lZChDT05GSUdfS0VZQk9BUkRfR1BJT19NT0RVTEUpCisjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvX2tleXMuaD4KKworc3RhdGljIHN0cnVjdCBncGlvX2tleXNfYnV0dG9uIGJmaW5fZ3Bpb19rZXlzX3RhYmxlW10gPSB7CisJe0JUTl8wLCBHUElPX1BHMCwgMSwgImdwaW8ta2V5czogQlROMCJ9LAorCXtCVE5fMSwgR1BJT19QRzEzLCAxLCAiZ3Bpby1rZXlzOiBCVE4xIn0sCit9OworCitzdGF0aWMgc3RydWN0IGdwaW9fa2V5c19wbGF0Zm9ybV9kYXRhIGJmaW5fZ3Bpb19rZXlzX2RhdGEgPSB7CisJLmJ1dHRvbnMgICAgICAgID0gYmZpbl9ncGlvX2tleXNfdGFibGUsCisJLm5idXR0b25zICAgICAgID0gQVJSQVlfU0laRShiZmluX2dwaW9fa2V5c190YWJsZSksCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX2RldmljZV9ncGlva2V5cyA9IHsKKwkubmFtZSAgICAgID0gImdwaW8ta2V5cyIsCisJLmRldiA9IHsKKwkJLnBsYXRmb3JtX2RhdGEgPSAmYmZpbl9ncGlvX2tleXNfZGF0YSwKKwl9LAorfTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfU0RIX0JGSU4pIHx8IGRlZmluZWQoQ09ORklHX1NESF9CRklOX01PRFVMRSkKKworc3RhdGljIHN0cnVjdCBiZmluX3NkX2hvc3QgYmZpbl9zZGhfZGF0YSA9IHsKKwkuZG1hX2NoYW4gPSBDSF9SU0ksCisJLmlycV9pbnQwID0gSVJRX1JTSV9JTlQwLAorCS5waW5fcmVxID0ge1BfUlNJX0RBVEEwLCBQX1JTSV9EQVRBMSwgUF9SU0lfREFUQTIsIFBfUlNJX0RBVEEzLCBQX1JTSV9DTUQsIFBfUlNJX0NMSywgMH0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZjUxeF9zZGhfZGV2aWNlID0geworCS5uYW1lID0gImJmaW4tc2RoIiwKKwkuaWQgPSAwLAorCS5kZXYgPSB7CisJCS5wbGF0Zm9ybV9kYXRhID0gJmJmaW5fc2RoX2RhdGEsCisJfSwKK307CisjZW5kaWYKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBiZmluX2dwaW9zX3Jlc291cmNlcyA9IHsKKwkuc3RhcnQgPSAwLAorCS5lbmQgICA9IE1BWF9CTEFDS0ZJTl9HUElPUyAtIDEsCisJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX2dwaW9zX2RldmljZSA9IHsKKwkubmFtZSA9ICJzaW1wbGUtZ3BpbyIsCisJLmlkID0gLTEsCisJLm51bV9yZXNvdXJjZXMgPSAxLAorCS5yZXNvdXJjZSA9ICZiZmluX2dwaW9zX3Jlc291cmNlcywKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgY2Nsa192bGV2X2RhdGFzaGVldFtdID0KK3sKKwlWUlBBSVIoVkxFVl8xMDAsIDQwMDAwMDAwMCksCisJVlJQQUlSKFZMRVZfMTA1LCA0MjYwMDAwMDApLAorCVZSUEFJUihWTEVWXzExMCwgNTAwMDAwMDAwKSwKKwlWUlBBSVIoVkxFVl8xMTUsIDUzMzAwMDAwMCksCisJVlJQQUlSKFZMRVZfMTIwLCA2MDAwMDAwMDApLAorfTsKKworc3RhdGljIHN0cnVjdCBiZmluX2RwbWNfcGxhdGZvcm1fZGF0YSBiZmluX2RtcGNfdnJlZ19kYXRhID0geworCS50dXBsZV90YWIgPSBjY2xrX3ZsZXZfZGF0YXNoZWV0LAorCS50YWJzaXplID0gQVJSQVlfU0laRShjY2xrX3ZsZXZfZGF0YXNoZWV0KSwKKwkudnJfc2V0dGxpbmdfdGltZSA9IDI1IC8qIHVzICovLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9kcG1jID0geworCS5uYW1lID0gImJmaW4gZHBtYyIsCisJLmRldiA9IHsKKwkJLnBsYXRmb3JtX2RhdGEgPSAmYmZpbl9kbXBjX3ZyZWdfZGF0YSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnN0YW1wX2RldmljZXNbXSBfX2luaXRkYXRhID0geworCisJJmJmaW5fZHBtYywKKworI2lmIGRlZmluZWQoQ09ORklHX1JUQ19EUlZfQkZJTikgfHwgZGVmaW5lZChDT05GSUdfUlRDX0RSVl9CRklOX01PRFVMRSkKKwkmcnRjX2RldmljZSwKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfQkZJTl9NQUMpIHx8IGRlZmluZWQoQ09ORklHX0JGSU5fTUFDX01PRFVMRSkKKwkmYmZpbl9tYWNfZGV2aWNlLAorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19TUElfQkZJTikgfHwgZGVmaW5lZChDT05GSUdfU1BJX0JGSU5fTU9EVUxFKQorCSZiZmluX3NwaTBfZGV2aWNlLAorCSZiZmluX3NwaTFfZGV2aWNlLAorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19TRVJJQUxfQkZJTikgfHwgZGVmaW5lZChDT05GSUdfU0VSSUFMX0JGSU5fTU9EVUxFKQorCSZiZmluX3VhcnRfZGV2aWNlLAorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19CRklOX1NJUikgfHwgZGVmaW5lZChDT05GSUdfQkZJTl9TSVJfTU9EVUxFKQorI2lmZGVmIENPTkZJR19CRklOX1NJUjAKKwkmYmZpbl9zaXIwX2RldmljZSwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19CRklOX1NJUjEKKwkmYmZpbl9zaXIxX2RldmljZSwKKyNlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19JMkNfQkxBQ0tGSU5fVFdJKSB8fCBkZWZpbmVkKENPTkZJR19JMkNfQkxBQ0tGSU5fVFdJX01PRFVMRSkKKwkmaTJjX2JmaW5fdHdpX2RldmljZSwKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfU0VSSUFMX0JGSU5fU1BPUlQpIHx8IGRlZmluZWQoQ09ORklHX1NFUklBTF9CRklOX1NQT1JUX01PRFVMRSkKKwkmYmZpbl9zcG9ydDBfdWFydF9kZXZpY2UsCisJJmJmaW5fc3BvcnQxX3VhcnRfZGV2aWNlLAorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19LRVlCT0FSRF9HUElPKSB8fCBkZWZpbmVkKENPTkZJR19LRVlCT0FSRF9HUElPX01PRFVMRSkKKwkmYmZpbl9kZXZpY2VfZ3Bpb2tleXMsCisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX1NESF9CRklOKSB8fCBkZWZpbmVkKENPTkZJR19TREhfQkZJTl9NT0RVTEUpCisJJmJmNTF4X3NkaF9kZXZpY2UsCisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX01URF9QSFlTTUFQKSB8fCBkZWZpbmVkKENPTkZJR19NVERfUEhZU01BUF9NT0RVTEUpCisJJmV6YnJkX2ZsYXNoX2RldmljZSwKKyNlbmRpZgorCisJJmJmaW5fZ3Bpb3NfZGV2aWNlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgZXpicmRfaW5pdCh2b2lkKQoreworCXByaW50ayhLRVJOX0lORk8gIiVzKCk6IHJlZ2lzdGVyaW5nIGRldmljZSByZXNvdXJjZXNcbiIsIF9fZnVuY19fKTsKKworI2lmZGVmIENPTkZJR19JMkNfQk9BUkRJTkZPCisJaTJjX3JlZ2lzdGVyX2JvYXJkX2luZm8oMCwgYmZpbl9pMmNfYm9hcmRfaW5mbywKKwkJCQlBUlJBWV9TSVpFKGJmaW5faTJjX2JvYXJkX2luZm8pKTsKKyNlbmRpZgorCisJcGxhdGZvcm1fYWRkX2RldmljZXMoc3RhbXBfZGV2aWNlcywgQVJSQVlfU0laRShzdGFtcF9kZXZpY2VzKSk7CisJc3BpX3JlZ2lzdGVyX2JvYXJkX2luZm8oYmZpbl9zcGlfYm9hcmRfaW5mbywgQVJSQVlfU0laRShiZmluX3NwaV9ib2FyZF9pbmZvKSk7CisJcmV0dXJuIDA7Cit9CisKK2FyY2hfaW5pdGNhbGwoZXpicmRfaW5pdCk7CisKK3ZvaWQgbmF0aXZlX21hY2hpbmVfcmVzdGFydChjaGFyICpjbWQpCit7CisJLyogd29ya2Fyb3VuZCByZWJvb3QgaGFuZyB3aGVuIGJvb3RpbmcgZnJvbSBTUEkgKi8KKwlpZiAoKGJmaW5fcmVhZF9TWVNDUigpICYgMHg3KSA9PSAweDMpCisJCWJmaW5fZ3Bpb19yZXNldF9zcGkwX3NzZWwxKCk7Cit9CisKK3ZvaWQgYmZpbl9nZXRfZXRoZXJfYWRkcihjaGFyICphZGRyKQoreworCS8qIHRoZSBNQUMgaXMgc3RvcmVkIGluIE9UUCBtZW1vcnkgcGFnZSAweERGICovCisJdTMyIHJldDsKKwl1NjQgb3RwX21hYzsKKwl1MzIgKCpvdHBfcmVhZCkodTMyIHBhZ2UsIHUzMiBmbGFncywgdTY0ICpwYWdlX2NvbnRlbnQpID0gKHZvaWQgKikweEVGMDAwMDFBOworCisJcmV0ID0gb3RwX3JlYWQoMHhERiwgMHgwMCwgJm90cF9tYWMpOworCWlmICghKHJldCAmIDB4MSkpIHsKKwkJY2hhciAqb3RwX21hY19wID0gKGNoYXIgKikmb3RwX21hYzsKKwkJZm9yIChyZXQgPSAwOyByZXQgPCA2OyArK3JldCkKKwkJCWFkZHJbcmV0XSA9IG90cF9tYWNfcFs1IC0gcmV0XTsKKwl9Cit9CitFWFBPUlRfU1lNQk9MKGJmaW5fZ2V0X2V0aGVyX2FkZHIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2RtYS5jIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2RtYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5OGU4OGMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvZG1hLmMKQEAgLTAsMCArMSwxMTggQEAKKy8qCisgKiBGaWxlOiAgICAgICAgIGFyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9kbWEuYworICogQmFzZWQgb246CisgKiBBdXRob3I6ICAgICAgIEJyeWFuIFd1IDxjb29sb25leUBrZXJuZWwub3JnPgorICoKKyAqIENyZWF0ZWQ6CisgKiBEZXNjcmlwdGlvbjogIFRoaXMgZmlsZSBjb250YWlucyB0aGUgc2ltcGxlIERNQSBJbXBsZW1lbnRhdGlvbiBmb3IgQmxhY2tmaW4KKyAqCisgKiBNb2RpZmllZDoKKyAqICAgICAgICAgICAgICAgQ29weXJpZ2h0IDIwMDQtMjAwOCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKgorICogQnVnczogICAgICAgICBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSB0aGUgZmlsZSBDT1BZSU5HLCBvciB3cml0ZQorICogdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGFzbS9ibGFja2Zpbi5oPgorI2luY2x1ZGUgPGFzbS9kbWEuaD4KKworc3RydWN0IGRtYV9yZWdpc3RlciAqZG1hX2lvX2Jhc2VfYWRkcltNQVhfRE1BX0NIQU5ORUxTXSA9IHsKKwkoc3RydWN0IGRtYV9yZWdpc3RlciAqKSBETUEwX05FWFRfREVTQ19QVFIsCisJKHN0cnVjdCBkbWFfcmVnaXN0ZXIgKikgRE1BMV9ORVhUX0RFU0NfUFRSLAorCShzdHJ1Y3QgZG1hX3JlZ2lzdGVyICopIERNQTJfTkVYVF9ERVNDX1BUUiwKKwkoc3RydWN0IGRtYV9yZWdpc3RlciAqKSBETUEzX05FWFRfREVTQ19QVFIsCisJKHN0cnVjdCBkbWFfcmVnaXN0ZXIgKikgRE1BNF9ORVhUX0RFU0NfUFRSLAorCShzdHJ1Y3QgZG1hX3JlZ2lzdGVyICopIERNQTVfTkVYVF9ERVNDX1BUUiwKKwkoc3RydWN0IGRtYV9yZWdpc3RlciAqKSBETUE2X05FWFRfREVTQ19QVFIsCisJKHN0cnVjdCBkbWFfcmVnaXN0ZXIgKikgRE1BN19ORVhUX0RFU0NfUFRSLAorCShzdHJ1Y3QgZG1hX3JlZ2lzdGVyICopIERNQThfTkVYVF9ERVNDX1BUUiwKKwkoc3RydWN0IGRtYV9yZWdpc3RlciAqKSBETUE5X05FWFRfREVTQ19QVFIsCisJKHN0cnVjdCBkbWFfcmVnaXN0ZXIgKikgRE1BMTBfTkVYVF9ERVNDX1BUUiwKKwkoc3RydWN0IGRtYV9yZWdpc3RlciAqKSBETUExMV9ORVhUX0RFU0NfUFRSLAorCShzdHJ1Y3QgZG1hX3JlZ2lzdGVyICopIE1ETUFfUzBfTkVYVF9ERVNDX1BUUiwKKwkoc3RydWN0IGRtYV9yZWdpc3RlciAqKSBNRE1BX0QwX05FWFRfREVTQ19QVFIsCisJKHN0cnVjdCBkbWFfcmVnaXN0ZXIgKikgTURNQV9TMV9ORVhUX0RFU0NfUFRSLAorCShzdHJ1Y3QgZG1hX3JlZ2lzdGVyICopIE1ETUFfRDFfTkVYVF9ERVNDX1BUUiwKK307CitFWFBPUlRfU1lNQk9MKGRtYV9pb19iYXNlX2FkZHIpOworCitpbnQgY2hhbm5lbDJpcnEodW5zaWduZWQgaW50IGNoYW5uZWwpCit7CisJaW50IHJldF9pcnEgPSAtMTsKKworCXN3aXRjaCAoY2hhbm5lbCkgeworCWNhc2UgQ0hfUFBJOgorCQlyZXRfaXJxID0gSVJRX1BQSTsKKwkJYnJlYWs7CisKKwljYXNlIENIX0VNQUNfUlg6CisJCXJldF9pcnEgPSBJUlFfTUFDX1JYOworCQlicmVhazsKKworCWNhc2UgQ0hfRU1BQ19UWDoKKwkJcmV0X2lycSA9IElSUV9NQUNfVFg7CisJCWJyZWFrOworCisJY2FzZSBDSF9VQVJUMV9SWDoKKwkJcmV0X2lycSA9IElSUV9VQVJUMV9SWDsKKwkJYnJlYWs7CisKKwljYXNlIENIX1VBUlQxX1RYOgorCQlyZXRfaXJxID0gSVJRX1VBUlQxX1RYOworCQlicmVhazsKKworCWNhc2UgQ0hfU1BPUlQwX1JYOgorCQlyZXRfaXJxID0gSVJRX1NQT1JUMF9SWDsKKwkJYnJlYWs7CisKKwljYXNlIENIX1NQT1JUMF9UWDoKKwkJcmV0X2lycSA9IElSUV9TUE9SVDBfVFg7CisJCWJyZWFrOworCisJY2FzZSBDSF9TUE9SVDFfUlg6CisJCXJldF9pcnEgPSBJUlFfU1BPUlQxX1JYOworCQlicmVhazsKKworCWNhc2UgQ0hfU1BPUlQxX1RYOgorCQlyZXRfaXJxID0gSVJRX1NQT1JUMV9UWDsKKwkJYnJlYWs7CisKKwljYXNlIENIX1NQSTA6CisJCXJldF9pcnEgPSBJUlFfU1BJMDsKKwkJYnJlYWs7CisKKwljYXNlIENIX1VBUlQwX1JYOgorCQlyZXRfaXJxID0gSVJRX1VBUlQwX1JYOworCQlicmVhazsKKworCWNhc2UgQ0hfVUFSVDBfVFg6CisJCXJldF9pcnEgPSBJUlFfVUFSVDBfVFg7CisJCWJyZWFrOworCisJY2FzZSBDSF9NRU1fU1RSRUFNMF9TUkM6CisJY2FzZSBDSF9NRU1fU1RSRUFNMF9ERVNUOgorCQlyZXRfaXJxID0gSVJRX01FTV9ETUEwOworCQlicmVhazsKKworCWNhc2UgQ0hfTUVNX1NUUkVBTTFfU1JDOgorCWNhc2UgQ0hfTUVNX1NUUkVBTTFfREVTVDoKKwkJcmV0X2lycSA9IElSUV9NRU1fRE1BMTsKKwkJYnJlYWs7CisJfQorCXJldHVybiByZXRfaXJxOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2luY2x1ZGUvbWFjaC9hbm9tYWx5LmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvaW5jbHVkZS9tYWNoL2Fub21hbHkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNWI0YmVmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2luY2x1ZGUvbWFjaC9hbm9tYWx5LmgKQEAgLTAsMCArMSw3OSBAQAorLyoKKyAqIEZpbGU6IGluY2x1ZGUvYXNtLWJsYWNrZmluL21hY2gtYmY1MTgvYW5vbWFseS5oCisgKiBCdWdzOiBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwOCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCisgKi8KKworLyogVGhpcyBmaWxlIHNob3VsZSBiZSB1cCB0byBkYXRlIHdpdGg6CisgKiAgLSA/Pz8/CisgKi8KKworI2lmbmRlZiBfTUFDSF9BTk9NQUxZX0hfCisjZGVmaW5lIF9NQUNIX0FOT01BTFlfSF8KKworLyogTXVsdGktSXNzdWUgSW5zdHJ1Y3Rpb24gd2l0aCBkc3AzMnNoaWZ0aW1tIGluIHNsb3QxIGFuZCBQLXJlZyBTdG9yZSBpbiBzbG90MiBOb3QgU3VwcG9ydGVkICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDAwNzQgKDEpCisvKiBSeC5IIENhbm5vdCBCZSBVc2VkIHRvIEFjY2VzcyAxNi1iaXQgU3lzdGVtIE1NUiBSZWdpc3RlcnMgKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDEyMiAoMSkKKy8qIEZhbHNlIEhhcmR3YXJlIEVycm9yIGZyb20gYW4gQWNjZXNzIGluIHRoZSBTaGFkb3cgb2YgYSBDb25kaXRpb25hbCBCcmFuY2ggKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDI0NSAoMSkKKy8qIFNlbnNpdGl2aXR5IFRvIE5vaXNlIHdpdGggU2xvdyBJbnB1dCBFZGdlIFJhdGVzIG9uIEV4dGVybmFsIFNQT1JUIFRYIGFuZCBSWCBDbG9ja3MgKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDI2NSAoMSkKKy8qIEZhbHNlIEhhcmR3YXJlIEVycm9ycyBDYXVzZWQgYnkgRmV0Y2hlcyBhdCB0aGUgQm91bmRhcnkgb2YgUmVzZXJ2ZWQgTWVtb3J5ICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDAzMTAgKDEpCisvKiBQUEkgVW5kZXJmbG93IEVycm9yIEdvZXMgVW5kZXRlY3RlZCBpbiBJVFUtUiA2NTYgTW9kZSAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwMzY2ICgxKQorLyogTG9ja2JveCBTRVNSIEZpcm13YXJlIERvZXMgTm90IFNhdmUvUmVzdG9yZSBGdWxsIENvbnRleHQgKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDQwNSAoMSkKKy8qIExvY2tib3ggRmlybXdhcmUgTWVtb3J5IENsZWFudXAgUm91dGluZSBEb2VzIG5vdCBDbGVhciBSZWdpc3RlcnMgKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDQwOCAoMSkKKy8qIFNwZWN1bGF0aXZlIEZldGNoZXMgQ2FuIENhdXNlIFVuZGVzaXJlZCBFeHRlcm5hbCBGSUZPIE9wZXJhdGlvbnMgKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDQxNiAoMSkKKy8qIFRXSSBGYWxsIFRpbWUgKFRvZikgTWF5IFZpb2xhdGUgdGhlIE1pbmltdW0gSTJDIFNwZWNpZmljYXRpb24gKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDQyMSAoMSkKKy8qIFRXSSBJbnB1dCBDYXBhY2l0YW5jZSAoQ2kpIE1heSBWaW9sYXRlIHRoZSBNYXhpbXVtIEkyQyBTcGVjaWZpY2F0aW9uICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDA0MjIgKDEpCisvKiBTcGVjdWxhdGl2ZSBGZXRjaGVzIG9mIEluZGlyZWN0LVBvaW50ZXIgSW5zdHJ1Y3Rpb25zIENhbiBDYXVzZSBGYWxzZSBIYXJkd2FyZSBFcnJvcnMgKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDQyNiAoMSkKKy8qIFNvZnR3YXJlIFN5c3RlbSBSZXNldCBDb3JydXB0cyBQTExfTE9DS0NOVCBSZWdpc3RlciAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwNDMwICgxKQorLyogSW5jb3JyZWN0IFVzZSBvZiBTdGFjayBpbiBMb2NrYm94IEZpcm13YXJlIER1cmluZyBBdXRoZW50aWNhdGlvbiAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwNDMxICgxKQorLyogQ2VydGFpbiBTSUMgUmVnaXN0ZXJzIGFyZSBub3QgUmVzZXQgQWZ0ZXIgU29mdCBvciBDb3JlIERvdWJsZSBGYXVsdCBSZXNldCAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwNDM1ICgxKQorLyogUE9SVHhfRFJJVkUgYW5kIFBPUlR4X0hZU1RFUkVTSVMgUmVnaXN0ZXJzIFJlYWQgQmFjayBJbmNvcnJlY3QgVmFsdWVzICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDA0MzggKDEpCisvKiBQcmVib290IENhbm5vdCBiZSBVc2VkIHRvIFByb2dyYW0gdGhlIFBMTF9ESVYgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDQzOSAoMSkKKy8qIGJmcm9tX1N5c0NvbnRyb2woKSBDYW5ub3QgYmUgVXNlZCB0byBXcml0ZSB0aGUgUExMX0RJViBSZWdpc3RlciAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwNDQwICgxKQorLyogSUZMVVNIIEluc3RydWN0aW9uIGF0IEVuZCBvZiBIYXJkd2FyZSBMb29wIENhdXNlcyBJbmZpbml0ZSBTdGFsbCAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwNDQzICgxKQorLyogSW5jb3JyZWN0IEwxIEluc3RydWN0aW9uIEJhbmsgQiBNZW1vcnkgTWFwIExvY2F0aW9uICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDA0NDQgKDEpCisKKy8qIEFub21hbGllcyB0aGF0IGRvbid0IGV4aXN0IG9uIHRoaXMgcHJvYyAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwMTI1ICgwKQorI2RlZmluZSBBTk9NQUxZXzA1MDAwMTU4ICgwKQorI2RlZmluZSBBTk9NQUxZXzA1MDAwMTgzICgwKQorI2RlZmluZSBBTk9NQUxZXzA1MDAwMTk4ICgwKQorI2RlZmluZSBBTk9NQUxZXzA1MDAwMjMwICgwKQorI2RlZmluZSBBTk9NQUxZXzA1MDAwMjQ0ICgwKQorI2RlZmluZSBBTk9NQUxZXzA1MDAwMjYxICgwKQorI2RlZmluZSBBTk9NQUxZXzA1MDAwMjYzICgwKQorI2RlZmluZSBBTk9NQUxZXzA1MDAwMjY2ICgwKQorI2RlZmluZSBBTk9NQUxZXzA1MDAwMjczICgwKQorI2RlZmluZSBBTk9NQUxZXzA1MDAwMjg1ICgwKQorI2RlZmluZSBBTk9NQUxZXzA1MDAwMzA3ICgwKQorI2RlZmluZSBBTk9NQUxZXzA1MDAwMzExICgwKQorI2RlZmluZSBBTk9NQUxZXzA1MDAwMzEyICgwKQorI2RlZmluZSBBTk9NQUxZXzA1MDAwMzIzICgwKQorI2RlZmluZSBBTk9NQUxZXzA1MDAwMzUzICgwKQorI2RlZmluZSBBTk9NQUxZXzA1MDAwMzYzICgwKQorI2RlZmluZSBBTk9NQUxZXzA1MDAwMzg2ICgwKQorI2RlZmluZSBBTk9NQUxZXzA1MDAwNDEyICgwKQorI2RlZmluZSBBTk9NQUxZXzA1MDAwNDMyICgwKQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9pbmNsdWRlL21hY2gvYmY1MTguaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9pbmNsdWRlL21hY2gvYmY1MTguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGRhMWEwCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2luY2x1ZGUvbWFjaC9iZjUxOC5oCkBAIC0wLDAgKzEsMTMyIEBACisvKgorICogRmlsZTogICAgICAgICBpbmNsdWRlL2FzbS1ibGFja2Zpbi9tYWNoLWJmNTE4L2JmNTE4LmgKKyAqIEJhc2VkIG9uOglpbmNsdWRlL2FzbS1ibGFja2Zpbi9tYWNoLWJmNTI3L2JmNTI3LmgKKyAqIEF1dGhvcjoJTWljaGFlbCBIZW5uZXJpY2ggKG1pY2hhZWwuaGVubmVyaWNoQGFuYWxvZy5jb20pCisgKgorICogQ3JlYXRlZDoKKyAqIERlc2NyaXB0aW9uOiAgU1lTVEVNIE1NUiBSRUdJU1RFUiBBTkQgTUVNT1JZIE1BUCBGT1IgQURTUC1CRjUxOAorICoKKyAqIE1vZGlmaWVkOgorICogICAgICAgICAgICAgICBDb3B5cmlnaHQgMjAwNC0yMDA3IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBCdWdzOiAgICAgICAgIEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIHRoZSBmaWxlIENPUFlJTkcsIG9yIHdyaXRlCisgKiB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqLworCisjaWZuZGVmIF9fTUFDSF9CRjUxOF9IX18KKyNkZWZpbmUgX19NQUNIX0JGNTE4X0hfXworCisjZGVmaW5lIE9GRlNFVF8oeCkgKCh4KSAmIDB4MDAwMEZGRkYpCisKKy8qc29tZSBtaXNjIGRlZmluZXMqLworI2RlZmluZSBJTUFTS19JVkcxNQkJMHg4MDAwCisjZGVmaW5lIElNQVNLX0lWRzE0CQkweDQwMDAKKyNkZWZpbmUgSU1BU0tfSVZHMTMJCTB4MjAwMAorI2RlZmluZSBJTUFTS19JVkcxMgkJMHgxMDAwCisKKyNkZWZpbmUgSU1BU0tfSVZHMTEJCTB4MDgwMAorI2RlZmluZSBJTUFTS19JVkcxMAkJMHgwNDAwCisjZGVmaW5lIElNQVNLX0lWRzkJCTB4MDIwMAorI2RlZmluZSBJTUFTS19JVkc4CQkweDAxMDAKKworI2RlZmluZSBJTUFTS19JVkc3CQkweDAwODAKKyNkZWZpbmUgSU1BU0tfSVZHVE1SCQkweDAwNDAKKyNkZWZpbmUgSU1BU0tfSVZHSFcJCTB4MDAyMAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIEJGSU5fRFNVQkJBTktTCTQKKyNkZWZpbmUgQkZJTl9EV0FZUwkJMgorI2RlZmluZSBCRklOX0RMSU5FUwkJNjQKKyNkZWZpbmUgQkZJTl9JU1VCQkFOS1MJNAorI2RlZmluZSBCRklOX0lXQVlTCQk0CisjZGVmaW5lIEJGSU5fSUxJTkVTCQkzMgorCisjZGVmaW5lIFdBWTBfTAkJCTB4MQorI2RlZmluZSBXQVkxX0wJCQkweDIKKyNkZWZpbmUgV0FZMDFfTAkJCTB4MworI2RlZmluZSBXQVkyX0wJCQkweDQKKyNkZWZpbmUgV0FZMDJfTAkJCTB4NQorI2RlZmluZQlXQVkxMl9MCQkJMHg2CisjZGVmaW5lCVdBWTAxMl9MCQkweDcKKworI2RlZmluZQlXQVkzX0wJCQkweDgKKyNkZWZpbmUJV0FZMDNfTAkJCTB4OQorI2RlZmluZQlXQVkxM19MCQkJMHhBCisjZGVmaW5lCVdBWTAxM19MCQkweEIKKworI2RlZmluZQlXQVkzMl9MCQkJMHhDCisjZGVmaW5lCVdBWTMyMF9MCQkweEQKKyNkZWZpbmUJV0FZMzIxX0wJCTB4RQorI2RlZmluZQlXQVlBTExfTAkJMHhGCisKKyNkZWZpbmUgRE1DX0VOQUJMRSAoMjw8MikJLyp5ZXMsIDIsIG5vdCAxICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogRUJJVSBTZXR0aW5ncyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIEFNQkNUTDBWQUwJKChDT05GSUdfQkFOS18xIDw8IDE2KSB8IENPTkZJR19CQU5LXzApCisjZGVmaW5lIEFNQkNUTDFWQUwJKChDT05GSUdfQkFOS18zIDw8IDE2KSB8IENPTkZJR19CQU5LXzIpCisKKyNpZmRlZiBDT05GSUdfQ19BTUJFTl9BTEwKKyNkZWZpbmUgVl9BTUJFTiBBTUJFTl9BTEwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19DX0FNQkVOCisjZGVmaW5lIFZfQU1CRU4gMHgwCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQ19BTUJFTl9CMAorI2RlZmluZSBWX0FNQkVOIEFNQkVOX0IwCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQ19BTUJFTl9CMF9CMQorI2RlZmluZSBWX0FNQkVOIEFNQkVOX0IwX0IxCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQ19BTUJFTl9CMF9CMV9CMgorI2RlZmluZSBWX0FNQkVOIEFNQkVOX0IwX0IxX0IyCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQ19BTUNLRU4KKyNkZWZpbmUgVl9BTUNLRU4gQU1DS0VOCisjZWxzZQorI2RlZmluZSBWX0FNQ0tFTiAweDAKKyNlbmRpZgorI2lmZGVmIENPTkZJR19DX0NEUFJJTworI2RlZmluZSBWX0NEUFJJTyAweDEwMAorI2Vsc2UKKyNkZWZpbmUgVl9DRFBSSU8gMHgwCisjZW5kaWYKKworI2RlZmluZSBBTUdDVExWQUwJKFZfQU1CRU4gfCBWX0FNQ0tFTiB8IFZfQ0RQUklPKQorCisjaWZkZWYgQ09ORklHX0JGNTE4CisjZGVmaW5lIENQVSAiQkY1MTgiCisjZGVmaW5lIENQVUlEIDB4MjdlOAorI2VuZGlmCisjaWZkZWYgQ09ORklHX0JGNTE2CisjZGVmaW5lIENQVSAiQkY1MTYiCisjZGVmaW5lIENQVUlEIDB4MjdlOAorI2VuZGlmCisjaWZkZWYgQ09ORklHX0JGNTE0CisjZGVmaW5lIENQVSAiQkY1MTQiCisjZGVmaW5lIENQVUlEIDB4MjdlOAorI2VuZGlmCisjaWZkZWYgQ09ORklHX0JGNTEyCisjZGVmaW5lIENQVSAiQkY1MTIiCisjZGVmaW5lIENQVUlEIDB4MjdlOAorI2VuZGlmCisKKyNpZm5kZWYgQ1BVCisjZXJyb3IgIlVua25vd24gQ1BVIHR5cGUgLSBUaGlzIGtlcm5lbCBkb2Vzbid0IHNlZW0gdG8gYmUgY29uZmlndXJlZCBwcm9wZXJseSIKKyNlbmRpZgorCisjZW5kaWYJCQkJLyogX19NQUNIX0JGNTE4X0hfXyAgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9pbmNsdWRlL21hY2gvYmZpbl9zZXJpYWxfNXh4LmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvaW5jbHVkZS9tYWNoL2JmaW5fc2VyaWFsXzV4eC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1MGE2M2IKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvaW5jbHVkZS9tYWNoL2JmaW5fc2VyaWFsXzV4eC5oCkBAIC0wLDAgKzEsMTY5IEBACisvKgorICogZmlsZTogICAgICAgIGluY2x1ZGUvYXNtLWJsYWNrZmluL21hY2gtYmY1MTgvYmZpbl9zZXJpYWxfNXh4LmgKKyAqIGJhc2VkIG9uOgorICogYXV0aG9yOgorICoKKyAqIGNyZWF0ZWQ6CisgKiBkZXNjcmlwdGlvbjoKKyAqCWJsYWNrZmluIHNlcmlhbCBkcml2ZXIgaGVhZCBmaWxlCisgKiByZXY6CisgKgorICogbW9kaWZpZWQ6CisgKgorICoKKyAqIGJ1Z3M6ICAgICAgICAgZW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCisgKgorICogdGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgZ251IGdlbmVyYWwgcHVibGljIGxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgZnJlZSBzb2Z0d2FyZSBmb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiB0aGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCB3aXRob3V0IGFueSB3YXJyYW50eTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBtZXJjaGFudGFiaWxpdHkgb3IgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuICBzZWUgdGhlCisgKiBnbnUgZ2VuZXJhbCBwdWJsaWMgbGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIHlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIGdudSBnZW5lcmFsIHB1YmxpYyBsaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIGNvcHlpbmcuCisgKiBpZiBub3QsIHdyaXRlIHRvIHRoZSBmcmVlIHNvZnR3YXJlIGZvdW5kYXRpb24sCisgKiA1OSB0ZW1wbGUgcGxhY2UgLSBzdWl0ZSAzMzAsIGJvc3RvbiwgbWEgMDIxMTEtMTMwNywgdXNhLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KKyNpbmNsdWRlIDxhc20vZG1hLmg+CisjaW5jbHVkZSA8YXNtL3BvcnRtdXguaD4KKworI2RlZmluZSBVQVJUX0dFVF9DSEFSKHVhcnQpICAgICBiZmluX3JlYWQxNigoKHVhcnQpLT5wb3J0Lm1lbWJhc2UgKyBPRkZTRVRfUkJSKSkKKyNkZWZpbmUgVUFSVF9HRVRfRExMKHVhcnQpCWJmaW5fcmVhZDE2KCgodWFydCktPnBvcnQubWVtYmFzZSArIE9GRlNFVF9ETEwpKQorI2RlZmluZSBVQVJUX0dFVF9JRVIodWFydCkgICAgICBiZmluX3JlYWQxNigoKHVhcnQpLT5wb3J0Lm1lbWJhc2UgKyBPRkZTRVRfSUVSKSkKKyNkZWZpbmUgVUFSVF9HRVRfRExIKHVhcnQpCWJmaW5fcmVhZDE2KCgodWFydCktPnBvcnQubWVtYmFzZSArIE9GRlNFVF9ETEgpKQorI2RlZmluZSBVQVJUX0dFVF9JSVIodWFydCkgICAgICBiZmluX3JlYWQxNigoKHVhcnQpLT5wb3J0Lm1lbWJhc2UgKyBPRkZTRVRfSUlSKSkKKyNkZWZpbmUgVUFSVF9HRVRfTENSKHVhcnQpICAgICAgYmZpbl9yZWFkMTYoKCh1YXJ0KS0+cG9ydC5tZW1iYXNlICsgT0ZGU0VUX0xDUikpCisjZGVmaW5lIFVBUlRfR0VUX0dDVEwodWFydCkgICAgIGJmaW5fcmVhZDE2KCgodWFydCktPnBvcnQubWVtYmFzZSArIE9GRlNFVF9HQ1RMKSkKKworI2RlZmluZSBVQVJUX1BVVF9DSEFSKHVhcnQsIHYpICAgYmZpbl93cml0ZTE2KCgodWFydCktPnBvcnQubWVtYmFzZSArIE9GRlNFVF9USFIpLCB2KQorI2RlZmluZSBVQVJUX1BVVF9ETEwodWFydCwgdikgICAgYmZpbl93cml0ZTE2KCgodWFydCktPnBvcnQubWVtYmFzZSArIE9GRlNFVF9ETEwpLCB2KQorI2RlZmluZSBVQVJUX1BVVF9JRVIodWFydCwgdikgICAgYmZpbl93cml0ZTE2KCgodWFydCktPnBvcnQubWVtYmFzZSArIE9GRlNFVF9JRVIpLCB2KQorI2RlZmluZSBVQVJUX1NFVF9JRVIodWFydCwgdikgICAgVUFSVF9QVVRfSUVSKHVhcnQsIFVBUlRfR0VUX0lFUih1YXJ0KSB8ICh2KSkKKyNkZWZpbmUgVUFSVF9DTEVBUl9JRVIodWFydCwgdikgIFVBUlRfUFVUX0lFUih1YXJ0LCBVQVJUX0dFVF9JRVIodWFydCkgJiB+KHYpKQorI2RlZmluZSBVQVJUX1BVVF9ETEgodWFydCwgdikgICAgYmZpbl93cml0ZTE2KCgodWFydCktPnBvcnQubWVtYmFzZSArIE9GRlNFVF9ETEgpLCB2KQorI2RlZmluZSBVQVJUX1BVVF9MQ1IodWFydCwgdikgICAgYmZpbl93cml0ZTE2KCgodWFydCktPnBvcnQubWVtYmFzZSArIE9GRlNFVF9MQ1IpLCB2KQorI2RlZmluZSBVQVJUX1BVVF9HQ1RMKHVhcnQsIHYpICAgYmZpbl93cml0ZTE2KCgodWFydCktPnBvcnQubWVtYmFzZSArIE9GRlNFVF9HQ1RMKSwgdikKKworI2RlZmluZSBVQVJUX1NFVF9ETEFCKHVhcnQpICAgICBkbyB7IFVBUlRfUFVUX0xDUih1YXJ0LCBVQVJUX0dFVF9MQ1IodWFydCkgfCBETEFCKTsgU1NZTkMoKTsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgVUFSVF9DTEVBUl9ETEFCKHVhcnQpICAgZG8geyBVQVJUX1BVVF9MQ1IodWFydCwgVUFSVF9HRVRfTENSKHVhcnQpICYgfkRMQUIpOyBTU1lOQygpOyB9IHdoaWxlICgwKQorCisjZGVmaW5lIFVBUlRfR0VUX0NUUyh4KSBncGlvX2dldF92YWx1ZSh4LT5jdHNfcGluKQorI2RlZmluZSBVQVJUX1NFVF9SVFMoeCkgZ3Bpb19zZXRfdmFsdWUoeC0+cnRzX3BpbiwgMSkKKyNkZWZpbmUgVUFSVF9DTEVBUl9SVFMoeCkgZ3Bpb19zZXRfdmFsdWUoeC0+cnRzX3BpbiwgMCkKKyNkZWZpbmUgVUFSVF9FTkFCTEVfSU5UUyh4LCB2KSBVQVJUX1BVVF9JRVIoeCwgdikKKyNkZWZpbmUgVUFSVF9ESVNBQkxFX0lOVFMoeCkgVUFSVF9QVVRfSUVSKHgsIDApCisKKyNpZiBkZWZpbmVkKENPTkZJR19CRklOX1VBUlQwX0NUU1JUUykgfHwgZGVmaW5lZChDT05GSUdfQkZJTl9VQVJUMV9DVFNSVFMpCisjIGRlZmluZSBDT05GSUdfU0VSSUFMX0JGSU5fQ1RTUlRTCisKKyMgaWZuZGVmIENPTkZJR19VQVJUMF9DVFNfUElOCisjICBkZWZpbmUgQ09ORklHX1VBUlQwX0NUU19QSU4gLTEKKyMgZW5kaWYKKworIyBpZm5kZWYgQ09ORklHX1VBUlQwX1JUU19QSU4KKyMgIGRlZmluZSBDT05GSUdfVUFSVDBfUlRTX1BJTiAtMQorIyBlbmRpZgorCisjIGlmbmRlZiBDT05GSUdfVUFSVDFfQ1RTX1BJTgorIyAgZGVmaW5lIENPTkZJR19VQVJUMV9DVFNfUElOIC0xCisjIGVuZGlmCisKKyMgaWZuZGVmIENPTkZJR19VQVJUMV9SVFNfUElOCisjICBkZWZpbmUgQ09ORklHX1VBUlQxX1JUU19QSU4gLTEKKyMgZW5kaWYKKyNlbmRpZgorCisjZGVmaW5lIEJGSU5fVUFSVF9UWF9GSUZPX1NJWkUJMgorCisvKgorICogVGhlIHBpbiBjb25maWd1cmF0aW9uIGlzIGRpZmZlcmVudCBmcm9tIHNjaGVtYXRpYworICovCitzdHJ1Y3QgYmZpbl9zZXJpYWxfcG9ydCB7CisJc3RydWN0IHVhcnRfcG9ydCBwb3J0OworCXVuc2lnbmVkIGludCBvbGRfc3RhdHVzOworCXVuc2lnbmVkIGludCBsc3I7CisjaWZkZWYgQ09ORklHX1NFUklBTF9CRklOX0RNQQorCWludCB0eF9kb25lOworCWludCB0eF9jb3VudDsKKwlzdHJ1Y3QgY2lyY19idWYgcnhfZG1hX2J1ZjsKKwlzdHJ1Y3QgdGltZXJfbGlzdCByeF9kbWFfdGltZXI7CisJaW50IHJ4X2RtYV9ucm93czsKKwl1bnNpZ25lZCBpbnQgdHhfZG1hX2NoYW5uZWw7CisJdW5zaWduZWQgaW50IHJ4X2RtYV9jaGFubmVsOworCXN0cnVjdCB3b3JrX3N0cnVjdCB0eF9kbWFfd29ya3F1ZXVlOworI2VuZGlmCisjaWZkZWYgQ09ORklHX1NFUklBTF9CRklOX0NUU1JUUworCXN0cnVjdCB0aW1lcl9saXN0IGN0c190aW1lcjsKKwlpbnQgY3RzX3BpbjsKKwlpbnQgcnRzX3BpbjsKKyNlbmRpZgorfTsKKworLyogVGhlIGhhcmR3YXJlIGNsZWFycyB0aGUgTFNSIGJpdHMgdXBvbiByZWFkLCBzbyB3ZSBuZWVkIHRvIGNhY2hlCisgKiBzb21lIG9mIHRoZSBtb3JlIGZ1biBiaXRzIGluIHNvZnR3YXJlIHNvIHRoZXkgZG9uJ3QgZ2V0IGxvc3QKKyAqIHdoZW4gY2hlY2tpbmcgdGhlIExTUiBpbiBvdGhlciBjb2RlIHBhdGhzIChUWCkuCisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IFVBUlRfR0VUX0xTUihzdHJ1Y3QgYmZpbl9zZXJpYWxfcG9ydCAqdWFydCkKK3sKKwl1bnNpZ25lZCBpbnQgbHNyID0gYmZpbl9yZWFkMTYodWFydC0+cG9ydC5tZW1iYXNlICsgT0ZGU0VUX0xTUik7CisJdWFydC0+bHNyIHw9IChsc3IgJiAoQkl8RkV8UEV8T0UpKTsKKwlyZXR1cm4gbHNyIHwgdWFydC0+bHNyOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgVUFSVF9DTEVBUl9MU1Ioc3RydWN0IGJmaW5fc2VyaWFsX3BvcnQgKnVhcnQpCit7CisJdWFydC0+bHNyID0gMDsKKwliZmluX3dyaXRlMTYodWFydC0+cG9ydC5tZW1iYXNlICsgT0ZGU0VUX0xTUiwgLTEpOworfQorCitzdHJ1Y3QgYmZpbl9zZXJpYWxfcmVzIHsKKwl1bnNpZ25lZCBsb25nIHVhcnRfYmFzZV9hZGRyOworCWludCB1YXJ0X2lycTsKKyNpZmRlZiBDT05GSUdfU0VSSUFMX0JGSU5fRE1BCisJdW5zaWduZWQgaW50IHVhcnRfdHhfZG1hX2NoYW5uZWw7CisJdW5zaWduZWQgaW50IHVhcnRfcnhfZG1hX2NoYW5uZWw7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfU0VSSUFMX0JGSU5fQ1RTUlRTCisJaW50IHVhcnRfY3RzX3BpbjsKKwlpbnQgdWFydF9ydHNfcGluOworI2VuZGlmCit9OworCitzdHJ1Y3QgYmZpbl9zZXJpYWxfcmVzIGJmaW5fc2VyaWFsX3Jlc291cmNlW10gPSB7CisjaWZkZWYgQ09ORklHX1NFUklBTF9CRklOX1VBUlQwCisJeworCSAweEZGQzAwNDAwLAorCSBJUlFfVUFSVDBfUlgsCisjaWZkZWYgQ09ORklHX1NFUklBTF9CRklOX0RNQQorCSBDSF9VQVJUMF9UWCwKKwkgQ0hfVUFSVDBfUlgsCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQkZJTl9VQVJUMF9DVFNSVFMKKwkgQ09ORklHX1VBUlQwX0NUU19QSU4sCisJIENPTkZJR19VQVJUMF9SVFNfUElOLAorI2VuZGlmCisJIH0sCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfU0VSSUFMX0JGSU5fVUFSVDEKKwl7CisJIDB4RkZDMDIwMDAsCisJIElSUV9VQVJUMV9SWCwKKyNpZmRlZiBDT05GSUdfU0VSSUFMX0JGSU5fRE1BCisJIENIX1VBUlQxX1RYLAorCSBDSF9VQVJUMV9SWCwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19CRklOX1VBUlQxX0NUU1JUUworCSBDT05GSUdfVUFSVDFfQ1RTX1BJTiwKKwkgQ09ORklHX1VBUlQxX1JUU19QSU4sCisjZW5kaWYKKwkgfSwKKyNlbmRpZgorfTsKKworI2RlZmluZSBEUklWRVJfTkFNRSAiYmZpbi11YXJ0IgpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2luY2x1ZGUvbWFjaC9ibGFja2Zpbi5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2luY2x1ZGUvbWFjaC9ibGFja2Zpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxYTJiOWMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvaW5jbHVkZS9tYWNoL2JsYWNrZmluLmgKQEAgLTAsMCArMSwxMDUgQEAKKy8qCisgKiBGaWxlOiAgICAgICAgIGluY2x1ZGUvYXNtLWJsYWNrZmluL21hY2gtYmY1MTgvYmxhY2tmaW4uaAorICogQmFzZWQgb246CisgKiBBdXRob3I6CisgKgorICogQ3JlYXRlZDoKKyAqIERlc2NyaXB0aW9uOgorICoKKyAqIFJldjoKKyAqCisgKiBNb2RpZmllZDoKKyAqCisgKgorICogQnVnczogICAgICAgICBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4KKyAqIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworI2lmbmRlZiBfTUFDSF9CTEFDS0ZJTl9IXworI2RlZmluZSBfTUFDSF9CTEFDS0ZJTl9IXworCisjZGVmaW5lIEJGNTE4X0ZBTUlMWQorCisjaW5jbHVkZSAiYmY1MTguaCIKKyNpbmNsdWRlICJtZW1fbWFwLmgiCisjaW5jbHVkZSAiZGVmQkY1MTIuaCIKKyNpbmNsdWRlICJhbm9tYWx5LmgiCisKKyNpZiBkZWZpbmVkKENPTkZJR19CRjUxOCkKKyNpbmNsdWRlICJkZWZCRjUxOC5oIgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19CRjUxNikKKyNpbmNsdWRlICJkZWZCRjUxNi5oIgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19CRjUxNCkKKyNpbmNsdWRlICJkZWZCRjUxNC5oIgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19CRjUxMikKKyNpbmNsdWRlICJkZWZCRjUxMi5oIgorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChfX0FTU0VNQkxZX18pCisjaW5jbHVkZSAiY2RlZkJGNTEyLmgiCisKKyNpZiBkZWZpbmVkKENPTkZJR19CRjUxOCkKKyNpbmNsdWRlICJjZGVmQkY1MTguaCIKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfQkY1MTYpCisjaW5jbHVkZSAiY2RlZkJGNTE2LmgiCisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX0JGNTE0KQorI2luY2x1ZGUgImNkZWZCRjUxNC5oIgorI2VuZGlmCisjZW5kaWYKKworLyogVUFSVF9JSVIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgU1RBVFVTKHgpCSgoeCA8PCAxKSAmIDB4MDYpCisjZGVmaW5lIFNUQVRVU19QMQkweDAyCisjZGVmaW5lIFNUQVRVU19QMAkweDAxCisKKyNkZWZpbmUgQkZJTl9VQVJUX05SX1BPUlRTCTIKKworI2RlZmluZSBPRkZTRVRfVEhSICAgICAgICAgICAgICAweDAwCS8qIFRyYW5zbWl0IEhvbGRpbmcgcmVnaXN0ZXIgICAgICAgICAgICAqLworI2RlZmluZSBPRkZTRVRfUkJSICAgICAgICAgICAgICAweDAwCS8qIFJlY2VpdmUgQnVmZmVyIHJlZ2lzdGVyICAgICAgICAgICAgICAqLworI2RlZmluZSBPRkZTRVRfRExMICAgICAgICAgICAgICAweDAwCS8qIERpdmlzb3IgTGF0Y2ggKExvdy1CeXRlKSAgICAgICAgICAgICAqLworI2RlZmluZSBPRkZTRVRfSUVSICAgICAgICAgICAgICAweDA0CS8qIEludGVycnVwdCBFbmFibGUgUmVnaXN0ZXIgICAgICAgICAgICAqLworI2RlZmluZSBPRkZTRVRfRExIICAgICAgICAgICAgICAweDA0CS8qIERpdmlzb3IgTGF0Y2ggKEhpZ2gtQnl0ZSkgICAgICAgICAgICAqLworI2RlZmluZSBPRkZTRVRfSUlSICAgICAgICAgICAgICAweDA4CS8qIEludGVycnVwdCBJZGVudGlmaWNhdGlvbiBSZWdpc3RlciAgICAqLworI2RlZmluZSBPRkZTRVRfTENSICAgICAgICAgICAgICAweDBDCS8qIExpbmUgQ29udHJvbCBSZWdpc3RlciAgICAgICAgICAgICAgICAqLworI2RlZmluZSBPRkZTRVRfTUNSICAgICAgICAgICAgICAweDEwCS8qIE1vZGVtIENvbnRyb2wgUmVnaXN0ZXIgICAgICAgICAgICAgICAqLworI2RlZmluZSBPRkZTRVRfTFNSICAgICAgICAgICAgICAweDE0CS8qIExpbmUgU3RhdHVzIFJlZ2lzdGVyICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBPRkZTRVRfTVNSICAgICAgICAgICAgICAweDE4CS8qIE1vZGVtIFN0YXR1cyBSZWdpc3RlciAgICAgICAgICAgICAgICAqLworI2RlZmluZSBPRkZTRVRfU0NSICAgICAgICAgICAgICAweDFDCS8qIFNDUiBTY3JhdGNoIFJlZ2lzdGVyICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBPRkZTRVRfR0NUTCAgICAgICAgICAgICAweDI0CS8qIEdsb2JhbCBDb250cm9sIFJlZ2lzdGVyICAgICAgICAgICAgICAqLworCisvKiBEUE1DKi8KKyNkZWZpbmUgYmZpbl9yZWFkX1NUT1BDS19PRkYoKSBiZmluX3JlYWRfU1RPUENLKCkKKyNkZWZpbmUgYmZpbl93cml0ZV9TVE9QQ0tfT0ZGKHZhbCkgYmZpbl93cml0ZV9TVE9QQ0sodmFsKQorI2RlZmluZSBTVE9QQ0tfT0ZGIFNUT1BDSworCisvKiBQTExfRElWIE1hc2tzCQkJCQkJCQkJCQkJCSovCisjZGVmaW5lIENDTEtfRElWMSBDU0VMX0RJVjEJLyogICAgICAgICAgQ0NMSyA9IFZDTyAvIDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0NMS19ESVYyIENTRUxfRElWMgkvKiAgICAgICAgICBDQ0xLID0gVkNPIC8gMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDQ0xLX0RJVjQgQ1NFTF9ESVY0CS8qICAgICAgICAgIENDTEsgPSBWQ08gLyA0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENDTEtfRElWOCBDU0VMX0RJVjgJLyogICAgICAgICAgQ0NMSyA9IFZDTyAvIDggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvaW5jbHVkZS9tYWNoL2NkZWZCRjUxMi5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2luY2x1ZGUvbWFjaC9jZGVmQkY1MTIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjBjMTNjCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2luY2x1ZGUvbWFjaC9jZGVmQkY1MTIuaApAQCAtMCwwICsxLDQ2IEBACisvKgorICogRmlsZTogICAgICAgICBpbmNsdWRlL2FzbS1ibGFja2Zpbi9tYWNoLWJmNTE4L2NkZWZiZjUxMi5oCisgKiBCYXNlZCBvbjoKKyAqIEF1dGhvcjoKKyAqCisgKiBDcmVhdGVkOgorICogRGVzY3JpcHRpb246ICBzeXN0ZW0gbW1yIHJlZ2lzdGVyIG1hcAorICoKKyAqIFJldjoKKyAqCisgKiBNb2RpZmllZDoKKyAqCisgKgorICogQnVnczogICAgICAgICBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4KKyAqIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworI2lmbmRlZiBfQ0RFRl9CRjUxMl9ICisjZGVmaW5lIF9DREVGX0JGNTEyX0gKKworLyogaW5jbHVkZSBhbGwgQ29yZSByZWdpc3RlcnMgYW5kIGJpdCBkZWZpbml0aW9ucyAqLworI2luY2x1ZGUgImRlZkJGNTEyLmgiCisKKy8qIGluY2x1ZGUgY29yZSBzcGVjaWZpYyByZWdpc3RlciBwb2ludGVyIGRlZmluaXRpb25zICovCisjaW5jbHVkZSA8YXNtL2NkZWZfTFBCbGFja2Zpbi5oPgorCisvKiBTWVNURU0gJiBNTVIgQUREUkVTUyBERUZJTklUSU9OUyBGT1IgQURTUC1CRjUxMiAqLworCisvKiBpbmNsdWRlIGNkZWZCRjUxeF9iYXNlLmggZm9yIHRoZSBzZXQgb2YgI2RlZmluZXMgdGhhdCBhcmUgY29tbW9uIHRvIGFsbCBBRFNQLUJGNTF4IHByb2Nlc3NvcnMgKi8KKyNpbmNsdWRlICJjZGVmQkY1MXhfYmFzZS5oIgorCisjZW5kaWYgLyogX0NERUZfQkY1MTJfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2luY2x1ZGUvbWFjaC9jZGVmQkY1MTQuaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9pbmNsdWRlL21hY2gvY2RlZkJGNTE0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTUyMWUxNwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9pbmNsdWRlL21hY2gvY2RlZkJGNTE0LmgKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqIEZpbGU6ICAgICAgICAgaW5jbHVkZS9hc20tYmxhY2tmaW4vbWFjaC1iZjUxOC9jZGVmYmY1MTQuaAorICogQmFzZWQgb246CisgKiBBdXRob3I6CisgKgorICogQ3JlYXRlZDoKKyAqIERlc2NyaXB0aW9uOiAgc3lzdGVtIG1tciByZWdpc3RlciBtYXAKKyAqCisgKiBSZXY6CisgKgorICogTW9kaWZpZWQ6CisgKgorICoKKyAqIEJ1Z3M6ICAgICAgICAgRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuCisgKiBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICovCisKKyNpZm5kZWYgX0NERUZfQkY1MTRfSAorI2RlZmluZSBfQ0RFRl9CRjUxNF9ICisKKy8qIGluY2x1ZGUgYWxsIENvcmUgcmVnaXN0ZXJzIGFuZCBiaXQgZGVmaW5pdGlvbnMgKi8KKyNpbmNsdWRlICJkZWZCRjUxNC5oIgorCisvKiBpbmNsdWRlIGNvcmUgc3BlY2lmaWMgcmVnaXN0ZXIgcG9pbnRlciBkZWZpbml0aW9ucyAqLworI2luY2x1ZGUgPGFzbS9jZGVmX0xQQmxhY2tmaW4uaD4KKworLyogU1lTVEVNICYgTU1SIEFERFJFU1MgREVGSU5JVElPTlMgRk9SIEFEU1AtQkY1MTQgKi8KKworLyogaW5jbHVkZSBjZGVmQkY1MXhfYmFzZS5oIGZvciB0aGUgc2V0IG9mICNkZWZpbmVzIHRoYXQgYXJlIGNvbW1vbiB0byBhbGwgQURTUC1CRjUxeCBwcm9jZXNzb3JzICovCisjaW5jbHVkZSAiY2RlZkJGNTF4X2Jhc2UuaCIKKworLyogVGhlIGZvbGxvd2luZyBhcmUgdGhlICNkZWZpbmVzIG5lZWRlZCBieSBBRFNQLUJGNTE0IHRoYXQgYXJlIG5vdCBpbiB0aGUgY29tbW9uIGhlYWRlciAqLworCisjZW5kaWYgLyogX0NERUZfQkY1MTRfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2luY2x1ZGUvbWFjaC9jZGVmQkY1MTYuaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9pbmNsdWRlL21hY2gvY2RlZkJGNTE2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGUyNmNjZgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9pbmNsdWRlL21hY2gvY2RlZkJGNTE2LmgKQEAgLTAsMCArMSwyMTMgQEAKKy8qCisgKiBGaWxlOiAgICAgICAgIGluY2x1ZGUvYXNtLWJsYWNrZmluL21hY2gtYmY1MTgvY2RlZmJmNTE2LmgKKyAqIEJhc2VkIG9uOgorICogQXV0aG9yOgorICoKKyAqIENyZWF0ZWQ6CisgKiBEZXNjcmlwdGlvbjogIHN5c3RlbSBtbXIgcmVnaXN0ZXIgbWFwCisgKgorICogUmV2OgorICoKKyAqIE1vZGlmaWVkOgorICoKKyAqCisgKiBCdWdzOiAgICAgICAgIEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLgorICogSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCisjaWZuZGVmIF9DREVGX0JGNTE2X0gKKyNkZWZpbmUgX0NERUZfQkY1MTZfSAorCisvKiBpbmNsdWRlIGFsbCBDb3JlIHJlZ2lzdGVycyBhbmQgYml0IGRlZmluaXRpb25zICovCisjaW5jbHVkZSAiZGVmQkY1MTYuaCIKKworLyogaW5jbHVkZSBjb3JlIHNwZWNpZmljIHJlZ2lzdGVyIHBvaW50ZXIgZGVmaW5pdGlvbnMgKi8KKyNpbmNsdWRlIDxhc20vY2RlZl9MUEJsYWNrZmluLmg+CisKKy8qIFNZU1RFTSAmIE1NUiBBRERSRVNTIERFRklOSVRJT05TIEZPUiBBRFNQLUJGNTE2ICovCisKKy8qIGluY2x1ZGUgY2RlZkJGNTF4X2Jhc2UuaCBmb3IgdGhlIHNldCBvZiAjZGVmaW5lcyB0aGF0IGFyZSBjb21tb24gdG8gYWxsIEFEU1AtQkY1MXggcHJvY2Vzc29ycyAqLworI2luY2x1ZGUgImNkZWZCRjUxeF9iYXNlLmgiCisKKy8qIFRoZSBmb2xsb3dpbmcgYXJlIHRoZSAjZGVmaW5lcyBuZWVkZWQgYnkgQURTUC1CRjUxNiB0aGF0IGFyZSBub3QgaW4gdGhlIGNvbW1vbiBoZWFkZXIgKi8KKworLyogMTAvMTAwIEV0aGVybmV0IENvbnRyb2xsZXIJKDB4RkZDMDMwMDAgLSAweEZGQzAzMUZGKSAqLworCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX09QTU9ERSgpCQkJYmZpbl9yZWFkMzIoRU1BQ19PUE1PREUpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19PUE1PREUodmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfT1BNT0RFLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX0FERFJMTygpCQkJYmZpbl9yZWFkMzIoRU1BQ19BRERSTE8pCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19BRERSTE8odmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfQUREUkxPLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX0FERFJISSgpCQkJYmZpbl9yZWFkMzIoRU1BQ19BRERSSEkpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19BRERSSEkodmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfQUREUkhJLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX0hBU0hMTygpCQkJYmZpbl9yZWFkMzIoRU1BQ19IQVNITE8pCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19IQVNITE8odmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfSEFTSExPLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX0hBU0hISSgpCQkJYmZpbl9yZWFkMzIoRU1BQ19IQVNISEkpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19IQVNISEkodmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfSEFTSEhJLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1NUQUFERCgpCQkJYmZpbl9yZWFkMzIoRU1BQ19TVEFBREQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19TVEFBREQodmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfU1RBQURELCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1NUQURBVCgpCQkJYmZpbl9yZWFkMzIoRU1BQ19TVEFEQVQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19TVEFEQVQodmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfU1RBREFULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX0ZMQygpCQkJYmZpbl9yZWFkMzIoRU1BQ19GTEMpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19GTEModmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfRkxDLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1ZMQU4xKCkJCQliZmluX3JlYWQzMihFTUFDX1ZMQU4xKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfVkxBTjEodmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfVkxBTjEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfVkxBTjIoKQkJCWJmaW5fcmVhZDMyKEVNQUNfVkxBTjIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19WTEFOMih2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19WTEFOMiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19XS1VQX0NUTCgpCQliZmluX3JlYWQzMihFTUFDX1dLVVBfQ1RMKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfV0tVUF9DVEwodmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfV0tVUF9DVEwsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfV0tVUF9GRk1TSzAoKQkJYmZpbl9yZWFkMzIoRU1BQ19XS1VQX0ZGTVNLMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1dLVVBfRkZNU0swKHZhbCkJYmZpbl93cml0ZTMyKEVNQUNfV0tVUF9GRk1TSzAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfV0tVUF9GRk1TSzEoKQkJYmZpbl9yZWFkMzIoRU1BQ19XS1VQX0ZGTVNLMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1dLVVBfRkZNU0sxKHZhbCkJYmZpbl93cml0ZTMyKEVNQUNfV0tVUF9GRk1TSzEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfV0tVUF9GRk1TSzIoKQkJYmZpbl9yZWFkMzIoRU1BQ19XS1VQX0ZGTVNLMikKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1dLVVBfRkZNU0syKHZhbCkJYmZpbl93cml0ZTMyKEVNQUNfV0tVUF9GRk1TSzIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfV0tVUF9GRk1TSzMoKQkJYmZpbl9yZWFkMzIoRU1BQ19XS1VQX0ZGTVNLMykKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1dLVVBfRkZNU0szKHZhbCkJYmZpbl93cml0ZTMyKEVNQUNfV0tVUF9GRk1TSzMsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfV0tVUF9GRkNNRCgpCQliZmluX3JlYWQzMihFTUFDX1dLVVBfRkZDTUQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19XS1VQX0ZGQ01EKHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX1dLVVBfRkZDTUQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfV0tVUF9GRk9GRigpCQliZmluX3JlYWQzMihFTUFDX1dLVVBfRkZPRkYpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19XS1VQX0ZGT0ZGKHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX1dLVVBfRkZPRkYsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfV0tVUF9GRkNSQzAoKQkJYmZpbl9yZWFkMzIoRU1BQ19XS1VQX0ZGQ1JDMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1dLVVBfRkZDUkMwKHZhbCkJYmZpbl93cml0ZTMyKEVNQUNfV0tVUF9GRkNSQzAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfV0tVUF9GRkNSQzEoKQkJYmZpbl9yZWFkMzIoRU1BQ19XS1VQX0ZGQ1JDMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1dLVVBfRkZDUkMxKHZhbCkJYmZpbl93cml0ZTMyKEVNQUNfV0tVUF9GRkNSQzEsIHZhbCkKKworI2RlZmluZSBiZmluX3JlYWRfRU1BQ19TWVNDVEwoKQkJCWJmaW5fcmVhZDMyKEVNQUNfU1lTQ1RMKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfU1lTQ1RMKHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX1NZU0NUTCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19TWVNUQVQoKQkJCWJmaW5fcmVhZDMyKEVNQUNfU1lTVEFUKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfU1lTVEFUKHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX1NZU1RBVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19SWF9TVEFUKCkJCWJmaW5fcmVhZDMyKEVNQUNfUlhfU1RBVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1JYX1NUQVQodmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfUlhfU1RBVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19SWF9TVEtZKCkJCWJmaW5fcmVhZDMyKEVNQUNfUlhfU1RLWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1JYX1NUS1kodmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfUlhfU1RLWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19SWF9JUlFFKCkJCWJmaW5fcmVhZDMyKEVNQUNfUlhfSVJRRSkKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1JYX0lSUUUodmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfUlhfSVJRRSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19UWF9TVEFUKCkJCWJmaW5fcmVhZDMyKEVNQUNfVFhfU1RBVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1RYX1NUQVQodmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfVFhfU1RBVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19UWF9TVEtZKCkJCWJmaW5fcmVhZDMyKEVNQUNfVFhfU1RLWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1RYX1NUS1kodmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfVFhfU1RLWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19UWF9JUlFFKCkJCWJmaW5fcmVhZDMyKEVNQUNfVFhfSVJRRSkKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1RYX0lSUUUodmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfVFhfSVJRRSwgdmFsKQorCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX01NQ19DVEwoKQkJYmZpbl9yZWFkMzIoRU1BQ19NTUNfQ1RMKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfTU1DX0NUTCh2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19NTUNfQ1RMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX01NQ19SSVJRUygpCQliZmluX3JlYWQzMihFTUFDX01NQ19SSVJRUykKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX01NQ19SSVJRUyh2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19NTUNfUklSUVMsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfTU1DX1JJUlFFKCkJCWJmaW5fcmVhZDMyKEVNQUNfTU1DX1JJUlFFKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfTU1DX1JJUlFFKHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX01NQ19SSVJRRSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19NTUNfVElSUVMoKQkJYmZpbl9yZWFkMzIoRU1BQ19NTUNfVElSUVMpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19NTUNfVElSUVModmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfTU1DX1RJUlFTLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX01NQ19USVJRRSgpCQliZmluX3JlYWQzMihFTUFDX01NQ19USVJRRSkKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX01NQ19USVJRRSh2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19NTUNfVElSUUUsIHZhbCkKKworI2RlZmluZSBiZmluX3JlYWRfRU1BQ19SWENfT0soKQkJCWJmaW5fcmVhZDMyKEVNQUNfUlhDX09LKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfUlhDX09LKHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX1JYQ19PSywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19SWENfRkNTKCkJCWJmaW5fcmVhZDMyKEVNQUNfUlhDX0ZDUykKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1JYQ19GQ1ModmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfUlhDX0ZDUywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19SWENfQUxJR04oKQkJYmZpbl9yZWFkMzIoRU1BQ19SWENfQUxJR04pCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19SWENfQUxJR04odmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfUlhDX0FMSUdOLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1JYQ19PQ1RFVCgpCQliZmluX3JlYWQzMihFTUFDX1JYQ19PQ1RFVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1JYQ19PQ1RFVCh2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19SWENfT0NURVQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfUlhDX0RNQU9WRigpCQliZmluX3JlYWQzMihFTUFDX1JYQ19ETUFPVkYpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19SWENfRE1BT1ZGKHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX1JYQ19ETUFPVkYsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfUlhDX1VOSUNTVCgpCQliZmluX3JlYWQzMihFTUFDX1JYQ19VTklDU1QpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19SWENfVU5JQ1NUKHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX1JYQ19VTklDU1QsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfUlhDX01VTFRJKCkJCWJmaW5fcmVhZDMyKEVNQUNfUlhDX01VTFRJKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfUlhDX01VTFRJKHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX1JYQ19NVUxUSSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19SWENfQlJPQUQoKQkJYmZpbl9yZWFkMzIoRU1BQ19SWENfQlJPQUQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19SWENfQlJPQUQodmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfUlhDX0JST0FELCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1JYQ19MTkVSUkkoKQkJYmZpbl9yZWFkMzIoRU1BQ19SWENfTE5FUlJJKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfUlhDX0xORVJSSSh2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19SWENfTE5FUlJJLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1JYQ19MTkVSUk8oKQkJYmZpbl9yZWFkMzIoRU1BQ19SWENfTE5FUlJPKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfUlhDX0xORVJSTyh2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19SWENfTE5FUlJPLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1JYQ19MT05HKCkJCWJmaW5fcmVhZDMyKEVNQUNfUlhDX0xPTkcpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19SWENfTE9ORyh2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19SWENfTE9ORywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19SWENfTUFDQ1RMKCkJCWJmaW5fcmVhZDMyKEVNQUNfUlhDX01BQ0NUTCkKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1JYQ19NQUNDVEwodmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfUlhDX01BQ0NUTCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19SWENfT1BDT0RFKCkJCWJmaW5fcmVhZDMyKEVNQUNfUlhDX09QQ09ERSkKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1JYQ19PUENPREUodmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfUlhDX09QQ09ERSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19SWENfUEFVU0UoKQkJYmZpbl9yZWFkMzIoRU1BQ19SWENfUEFVU0UpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19SWENfUEFVU0UodmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfUlhDX1BBVVNFLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1JYQ19BTExGUk0oKQkJYmZpbl9yZWFkMzIoRU1BQ19SWENfQUxMRlJNKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfUlhDX0FMTEZSTSh2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19SWENfQUxMRlJNLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1JYQ19BTExPQ1QoKQkJYmZpbl9yZWFkMzIoRU1BQ19SWENfQUxMT0NUKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfUlhDX0FMTE9DVCh2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19SWENfQUxMT0NULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1JYQ19UWVBFRCgpCQliZmluX3JlYWQzMihFTUFDX1JYQ19UWVBFRCkKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1JYQ19UWVBFRCh2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19SWENfVFlQRUQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfUlhDX1NIT1JUKCkJCWJmaW5fcmVhZDMyKEVNQUNfUlhDX1NIT1JUKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfUlhDX1NIT1JUKHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX1JYQ19TSE9SVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19SWENfRVE2NCgpCQliZmluX3JlYWQzMihFTUFDX1JYQ19FUTY0KQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfUlhDX0VRNjQodmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfUlhDX0VRNjQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfUlhDX0xUMTI4KCkJCWJmaW5fcmVhZDMyKEVNQUNfUlhDX0xUMTI4KQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfUlhDX0xUMTI4KHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX1JYQ19MVDEyOCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19SWENfTFQyNTYoKQkJYmZpbl9yZWFkMzIoRU1BQ19SWENfTFQyNTYpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19SWENfTFQyNTYodmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfUlhDX0xUMjU2LCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1JYQ19MVDUxMigpCQliZmluX3JlYWQzMihFTUFDX1JYQ19MVDUxMikKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1JYQ19MVDUxMih2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19SWENfTFQ1MTIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfUlhDX0xUMTAyNCgpCQliZmluX3JlYWQzMihFTUFDX1JYQ19MVDEwMjQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19SWENfTFQxMDI0KHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX1JYQ19MVDEwMjQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfUlhDX0dFMTAyNCgpCQliZmluX3JlYWQzMihFTUFDX1JYQ19HRTEwMjQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19SWENfR0UxMDI0KHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX1JYQ19HRTEwMjQsIHZhbCkKKworI2RlZmluZSBiZmluX3JlYWRfRU1BQ19UWENfT0soKQkJCWJmaW5fcmVhZDMyKEVNQUNfVFhDX09LKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfVFhDX09LKHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX1RYQ19PSywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19UWENfMUNPTCgpCQliZmluX3JlYWQzMihFTUFDX1RYQ18xQ09MKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfVFhDXzFDT0wodmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfVFhDXzFDT0wsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfVFhDX0dUMUNPTCgpCQliZmluX3JlYWQzMihFTUFDX1RYQ19HVDFDT0wpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19UWENfR1QxQ09MKHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX1RYQ19HVDFDT0wsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfVFhDX09DVEVUKCkJCWJmaW5fcmVhZDMyKEVNQUNfVFhDX09DVEVUKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfVFhDX09DVEVUKHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX1RYQ19PQ1RFVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19UWENfREVGRVIoKQkJYmZpbl9yZWFkMzIoRU1BQ19UWENfREVGRVIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19UWENfREVGRVIodmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfVFhDX0RFRkVSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1RYQ19MQVRFQ0woKQkJYmZpbl9yZWFkMzIoRU1BQ19UWENfTEFURUNMKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfVFhDX0xBVEVDTCh2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19UWENfTEFURUNMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1RYQ19YU19DT0woKQkJYmZpbl9yZWFkMzIoRU1BQ19UWENfWFNfQ09MKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfVFhDX1hTX0NPTCh2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19UWENfWFNfQ09MLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1RYQ19ETUFVTkQoKQkJYmZpbl9yZWFkMzIoRU1BQ19UWENfRE1BVU5EKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfVFhDX0RNQVVORCh2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19UWENfRE1BVU5ELCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1RYQ19DUlNFUlIoKQkJYmZpbl9yZWFkMzIoRU1BQ19UWENfQ1JTRVJSKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfVFhDX0NSU0VSUih2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19UWENfQ1JTRVJSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1RYQ19VTklDU1QoKQkJYmZpbl9yZWFkMzIoRU1BQ19UWENfVU5JQ1NUKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfVFhDX1VOSUNTVCh2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19UWENfVU5JQ1NULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1RYQ19NVUxUSSgpCQliZmluX3JlYWQzMihFTUFDX1RYQ19NVUxUSSkKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1RYQ19NVUxUSSh2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19UWENfTVVMVEksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfVFhDX0JST0FEKCkJCWJmaW5fcmVhZDMyKEVNQUNfVFhDX0JST0FEKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfVFhDX0JST0FEKHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX1RYQ19CUk9BRCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19UWENfWFNfREZSKCkJCWJmaW5fcmVhZDMyKEVNQUNfVFhDX1hTX0RGUikKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1RYQ19YU19ERlIodmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfVFhDX1hTX0RGUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19UWENfTUFDQ1RMKCkJCWJmaW5fcmVhZDMyKEVNQUNfVFhDX01BQ0NUTCkKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1RYQ19NQUNDVEwodmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfVFhDX01BQ0NUTCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19UWENfQUxMRlJNKCkJCWJmaW5fcmVhZDMyKEVNQUNfVFhDX0FMTEZSTSkKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1RYQ19BTExGUk0odmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfVFhDX0FMTEZSTSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19UWENfQUxMT0NUKCkJCWJmaW5fcmVhZDMyKEVNQUNfVFhDX0FMTE9DVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1RYQ19BTExPQ1QodmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfVFhDX0FMTE9DVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19UWENfRVE2NCgpCQliZmluX3JlYWQzMihFTUFDX1RYQ19FUTY0KQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfVFhDX0VRNjQodmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfVFhDX0VRNjQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfVFhDX0xUMTI4KCkJCWJmaW5fcmVhZDMyKEVNQUNfVFhDX0xUMTI4KQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfVFhDX0xUMTI4KHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX1RYQ19MVDEyOCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19UWENfTFQyNTYoKQkJYmZpbl9yZWFkMzIoRU1BQ19UWENfTFQyNTYpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19UWENfTFQyNTYodmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfVFhDX0xUMjU2LCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1RYQ19MVDUxMigpCQliZmluX3JlYWQzMihFTUFDX1RYQ19MVDUxMikKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1RYQ19MVDUxMih2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19UWENfTFQ1MTIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfVFhDX0xUMTAyNCgpCQliZmluX3JlYWQzMihFTUFDX1RYQ19MVDEwMjQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19UWENfTFQxMDI0KHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX1RYQ19MVDEwMjQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfVFhDX0dFMTAyNCgpCQliZmluX3JlYWQzMihFTUFDX1RYQ19HRTEwMjQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19UWENfR0UxMDI0KHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX1RYQ19HRTEwMjQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfVFhDX0FCT1JUKCkJCWJmaW5fcmVhZDMyKEVNQUNfVFhDX0FCT1JUKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfVFhDX0FCT1JUKHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX1RYQ19BQk9SVCwgdmFsKQorCisjZW5kaWYgLyogX0NERUZfQkY1MTZfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2luY2x1ZGUvbWFjaC9jZGVmQkY1MTguaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9pbmNsdWRlL21hY2gvY2RlZkJGNTE4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmFmYjM3MAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9pbmNsdWRlL21hY2gvY2RlZkJGNTE4LmgKQEAgLTAsMCArMSwyODIgQEAKKy8qCisgKiBGaWxlOiAgICAgICAgIGluY2x1ZGUvYXNtLWJsYWNrZmluL21hY2gtYmY1MTgvY2RlZmJmNTE4LmgKKyAqIEJhc2VkIG9uOgorICogQXV0aG9yOgorICoKKyAqIENyZWF0ZWQ6CisgKiBEZXNjcmlwdGlvbjogIHN5c3RlbSBtbXIgcmVnaXN0ZXIgbWFwCisgKgorICogUmV2OgorICoKKyAqIE1vZGlmaWVkOgorICoKKyAqCisgKiBCdWdzOiAgICAgICAgIEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLgorICogSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCisjaWZuZGVmIF9DREVGX0JGNTE4X0gKKyNkZWZpbmUgX0NERUZfQkY1MThfSAorCisvKiBpbmNsdWRlIGFsbCBDb3JlIHJlZ2lzdGVycyBhbmQgYml0IGRlZmluaXRpb25zICovCisjaW5jbHVkZSAiZGVmQkY1MTguaCIKKworLyogaW5jbHVkZSBjb3JlIHNwZWNpZmljIHJlZ2lzdGVyIHBvaW50ZXIgZGVmaW5pdGlvbnMgKi8KKyNpbmNsdWRlIDxhc20vY2RlZl9MUEJsYWNrZmluLmg+CisKKy8qIFNZU1RFTSAmIE1NUiBBRERSRVNTIERFRklOSVRJT05TIEZPUiBBRFNQLUJGNTE4ICovCisKKy8qIGluY2x1ZGUgY2RlZkJGNTF4X2Jhc2UuaCBmb3IgdGhlIHNldCBvZiAjZGVmaW5lcyB0aGF0IGFyZSBjb21tb24gdG8gYWxsIEFEU1AtQkY1MXggcHJvY2Vzc29ycyAqLworI2luY2x1ZGUgImNkZWZCRjUxeF9iYXNlLmgiCisKKy8qIFRoZSBmb2xsb3dpbmcgYXJlIHRoZSAjZGVmaW5lcyBuZWVkZWQgYnkgQURTUC1CRjUxOCB0aGF0IGFyZSBub3QgaW4gdGhlIGNvbW1vbiBoZWFkZXIgKi8KKworCisvKiAxMC8xMDAgRXRoZXJuZXQgQ29udHJvbGxlcgkoMHhGRkMwMzAwMCAtIDB4RkZDMDMxRkYpICovCisKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfT1BNT0RFKCkJCQliZmluX3JlYWQzMihFTUFDX09QTU9ERSkKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX09QTU9ERSh2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19PUE1PREUsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfQUREUkxPKCkJCQliZmluX3JlYWQzMihFTUFDX0FERFJMTykKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX0FERFJMTyh2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19BRERSTE8sIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfQUREUkhJKCkJCQliZmluX3JlYWQzMihFTUFDX0FERFJISSkKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX0FERFJISSh2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19BRERSSEksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfSEFTSExPKCkJCQliZmluX3JlYWQzMihFTUFDX0hBU0hMTykKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX0hBU0hMTyh2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19IQVNITE8sIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfSEFTSEhJKCkJCQliZmluX3JlYWQzMihFTUFDX0hBU0hISSkKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX0hBU0hISSh2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19IQVNISEksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfU1RBQUREKCkJCQliZmluX3JlYWQzMihFTUFDX1NUQUFERCkKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1NUQUFERCh2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19TVEFBREQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfU1RBREFUKCkJCQliZmluX3JlYWQzMihFTUFDX1NUQURBVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1NUQURBVCh2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19TVEFEQVQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfRkxDKCkJCQliZmluX3JlYWQzMihFTUFDX0ZMQykKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX0ZMQyh2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19GTEMsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfVkxBTjEoKQkJCWJmaW5fcmVhZDMyKEVNQUNfVkxBTjEpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19WTEFOMSh2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19WTEFOMSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19WTEFOMigpCQkJYmZpbl9yZWFkMzIoRU1BQ19WTEFOMikKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1ZMQU4yKHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX1ZMQU4yLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1dLVVBfQ1RMKCkJCWJmaW5fcmVhZDMyKEVNQUNfV0tVUF9DVEwpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19XS1VQX0NUTCh2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19XS1VQX0NUTCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19XS1VQX0ZGTVNLMCgpCQliZmluX3JlYWQzMihFTUFDX1dLVVBfRkZNU0swKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfV0tVUF9GRk1TSzAodmFsKQliZmluX3dyaXRlMzIoRU1BQ19XS1VQX0ZGTVNLMCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19XS1VQX0ZGTVNLMSgpCQliZmluX3JlYWQzMihFTUFDX1dLVVBfRkZNU0sxKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfV0tVUF9GRk1TSzEodmFsKQliZmluX3dyaXRlMzIoRU1BQ19XS1VQX0ZGTVNLMSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19XS1VQX0ZGTVNLMigpCQliZmluX3JlYWQzMihFTUFDX1dLVVBfRkZNU0syKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfV0tVUF9GRk1TSzIodmFsKQliZmluX3dyaXRlMzIoRU1BQ19XS1VQX0ZGTVNLMiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19XS1VQX0ZGTVNLMygpCQliZmluX3JlYWQzMihFTUFDX1dLVVBfRkZNU0szKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfV0tVUF9GRk1TSzModmFsKQliZmluX3dyaXRlMzIoRU1BQ19XS1VQX0ZGTVNLMywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19XS1VQX0ZGQ01EKCkJCWJmaW5fcmVhZDMyKEVNQUNfV0tVUF9GRkNNRCkKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1dLVVBfRkZDTUQodmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfV0tVUF9GRkNNRCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19XS1VQX0ZGT0ZGKCkJCWJmaW5fcmVhZDMyKEVNQUNfV0tVUF9GRk9GRikKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1dLVVBfRkZPRkYodmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfV0tVUF9GRk9GRiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19XS1VQX0ZGQ1JDMCgpCQliZmluX3JlYWQzMihFTUFDX1dLVVBfRkZDUkMwKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfV0tVUF9GRkNSQzAodmFsKQliZmluX3dyaXRlMzIoRU1BQ19XS1VQX0ZGQ1JDMCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19XS1VQX0ZGQ1JDMSgpCQliZmluX3JlYWQzMihFTUFDX1dLVVBfRkZDUkMxKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfV0tVUF9GRkNSQzEodmFsKQliZmluX3dyaXRlMzIoRU1BQ19XS1VQX0ZGQ1JDMSwgdmFsKQorCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1NZU0NUTCgpCQkJYmZpbl9yZWFkMzIoRU1BQ19TWVNDVEwpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19TWVNDVEwodmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfU1lTQ1RMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1NZU1RBVCgpCQkJYmZpbl9yZWFkMzIoRU1BQ19TWVNUQVQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19TWVNUQVQodmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfU1lTVEFULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1JYX1NUQVQoKQkJYmZpbl9yZWFkMzIoRU1BQ19SWF9TVEFUKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfUlhfU1RBVCh2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19SWF9TVEFULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1JYX1NUS1koKQkJYmZpbl9yZWFkMzIoRU1BQ19SWF9TVEtZKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfUlhfU1RLWSh2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19SWF9TVEtZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1JYX0lSUUUoKQkJYmZpbl9yZWFkMzIoRU1BQ19SWF9JUlFFKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfUlhfSVJRRSh2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19SWF9JUlFFLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1RYX1NUQVQoKQkJYmZpbl9yZWFkMzIoRU1BQ19UWF9TVEFUKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfVFhfU1RBVCh2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19UWF9TVEFULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1RYX1NUS1koKQkJYmZpbl9yZWFkMzIoRU1BQ19UWF9TVEtZKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfVFhfU1RLWSh2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19UWF9TVEtZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1RYX0lSUUUoKQkJYmZpbl9yZWFkMzIoRU1BQ19UWF9JUlFFKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfVFhfSVJRRSh2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19UWF9JUlFFLCB2YWwpCisKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfTU1DX0NUTCgpCQliZmluX3JlYWQzMihFTUFDX01NQ19DVEwpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19NTUNfQ1RMKHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX01NQ19DVEwsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfTU1DX1JJUlFTKCkJCWJmaW5fcmVhZDMyKEVNQUNfTU1DX1JJUlFTKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfTU1DX1JJUlFTKHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX01NQ19SSVJRUywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19NTUNfUklSUUUoKQkJYmZpbl9yZWFkMzIoRU1BQ19NTUNfUklSUUUpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19NTUNfUklSUUUodmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfTU1DX1JJUlFFLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX01NQ19USVJRUygpCQliZmluX3JlYWQzMihFTUFDX01NQ19USVJRUykKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX01NQ19USVJRUyh2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19NTUNfVElSUVMsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfTU1DX1RJUlFFKCkJCWJmaW5fcmVhZDMyKEVNQUNfTU1DX1RJUlFFKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfTU1DX1RJUlFFKHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX01NQ19USVJRRSwgdmFsKQorCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1JYQ19PSygpCQkJYmZpbl9yZWFkMzIoRU1BQ19SWENfT0spCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19SWENfT0sodmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfUlhDX09LLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1JYQ19GQ1MoKQkJYmZpbl9yZWFkMzIoRU1BQ19SWENfRkNTKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfUlhDX0ZDUyh2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19SWENfRkNTLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1JYQ19BTElHTigpCQliZmluX3JlYWQzMihFTUFDX1JYQ19BTElHTikKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1JYQ19BTElHTih2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19SWENfQUxJR04sIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfUlhDX09DVEVUKCkJCWJmaW5fcmVhZDMyKEVNQUNfUlhDX09DVEVUKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfUlhDX09DVEVUKHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX1JYQ19PQ1RFVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19SWENfRE1BT1ZGKCkJCWJmaW5fcmVhZDMyKEVNQUNfUlhDX0RNQU9WRikKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1JYQ19ETUFPVkYodmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfUlhDX0RNQU9WRiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19SWENfVU5JQ1NUKCkJCWJmaW5fcmVhZDMyKEVNQUNfUlhDX1VOSUNTVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1JYQ19VTklDU1QodmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfUlhDX1VOSUNTVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19SWENfTVVMVEkoKQkJYmZpbl9yZWFkMzIoRU1BQ19SWENfTVVMVEkpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19SWENfTVVMVEkodmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfUlhDX01VTFRJLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1JYQ19CUk9BRCgpCQliZmluX3JlYWQzMihFTUFDX1JYQ19CUk9BRCkKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1JYQ19CUk9BRCh2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19SWENfQlJPQUQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfUlhDX0xORVJSSSgpCQliZmluX3JlYWQzMihFTUFDX1JYQ19MTkVSUkkpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19SWENfTE5FUlJJKHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX1JYQ19MTkVSUkksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfUlhDX0xORVJSTygpCQliZmluX3JlYWQzMihFTUFDX1JYQ19MTkVSUk8pCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19SWENfTE5FUlJPKHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX1JYQ19MTkVSUk8sIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfUlhDX0xPTkcoKQkJYmZpbl9yZWFkMzIoRU1BQ19SWENfTE9ORykKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1JYQ19MT05HKHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX1JYQ19MT05HLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1JYQ19NQUNDVEwoKQkJYmZpbl9yZWFkMzIoRU1BQ19SWENfTUFDQ1RMKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfUlhDX01BQ0NUTCh2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19SWENfTUFDQ1RMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1JYQ19PUENPREUoKQkJYmZpbl9yZWFkMzIoRU1BQ19SWENfT1BDT0RFKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfUlhDX09QQ09ERSh2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19SWENfT1BDT0RFLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1JYQ19QQVVTRSgpCQliZmluX3JlYWQzMihFTUFDX1JYQ19QQVVTRSkKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1JYQ19QQVVTRSh2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19SWENfUEFVU0UsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfUlhDX0FMTEZSTSgpCQliZmluX3JlYWQzMihFTUFDX1JYQ19BTExGUk0pCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19SWENfQUxMRlJNKHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX1JYQ19BTExGUk0sIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfUlhDX0FMTE9DVCgpCQliZmluX3JlYWQzMihFTUFDX1JYQ19BTExPQ1QpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19SWENfQUxMT0NUKHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX1JYQ19BTExPQ1QsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfUlhDX1RZUEVEKCkJCWJmaW5fcmVhZDMyKEVNQUNfUlhDX1RZUEVEKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfUlhDX1RZUEVEKHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX1JYQ19UWVBFRCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19SWENfU0hPUlQoKQkJYmZpbl9yZWFkMzIoRU1BQ19SWENfU0hPUlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19SWENfU0hPUlQodmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfUlhDX1NIT1JULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1JYQ19FUTY0KCkJCWJmaW5fcmVhZDMyKEVNQUNfUlhDX0VRNjQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19SWENfRVE2NCh2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19SWENfRVE2NCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19SWENfTFQxMjgoKQkJYmZpbl9yZWFkMzIoRU1BQ19SWENfTFQxMjgpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19SWENfTFQxMjgodmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfUlhDX0xUMTI4LCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1JYQ19MVDI1NigpCQliZmluX3JlYWQzMihFTUFDX1JYQ19MVDI1NikKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1JYQ19MVDI1Nih2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19SWENfTFQyNTYsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfUlhDX0xUNTEyKCkJCWJmaW5fcmVhZDMyKEVNQUNfUlhDX0xUNTEyKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfUlhDX0xUNTEyKHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX1JYQ19MVDUxMiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19SWENfTFQxMDI0KCkJCWJmaW5fcmVhZDMyKEVNQUNfUlhDX0xUMTAyNCkKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1JYQ19MVDEwMjQodmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfUlhDX0xUMTAyNCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19SWENfR0UxMDI0KCkJCWJmaW5fcmVhZDMyKEVNQUNfUlhDX0dFMTAyNCkKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1JYQ19HRTEwMjQodmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfUlhDX0dFMTAyNCwgdmFsKQorCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1RYQ19PSygpCQkJYmZpbl9yZWFkMzIoRU1BQ19UWENfT0spCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19UWENfT0sodmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfVFhDX09LLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1RYQ18xQ09MKCkJCWJmaW5fcmVhZDMyKEVNQUNfVFhDXzFDT0wpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19UWENfMUNPTCh2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19UWENfMUNPTCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19UWENfR1QxQ09MKCkJCWJmaW5fcmVhZDMyKEVNQUNfVFhDX0dUMUNPTCkKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1RYQ19HVDFDT0wodmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfVFhDX0dUMUNPTCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19UWENfT0NURVQoKQkJYmZpbl9yZWFkMzIoRU1BQ19UWENfT0NURVQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19UWENfT0NURVQodmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfVFhDX09DVEVULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1RYQ19ERUZFUigpCQliZmluX3JlYWQzMihFTUFDX1RYQ19ERUZFUikKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1RYQ19ERUZFUih2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19UWENfREVGRVIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfVFhDX0xBVEVDTCgpCQliZmluX3JlYWQzMihFTUFDX1RYQ19MQVRFQ0wpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19UWENfTEFURUNMKHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX1RYQ19MQVRFQ0wsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfVFhDX1hTX0NPTCgpCQliZmluX3JlYWQzMihFTUFDX1RYQ19YU19DT0wpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19UWENfWFNfQ09MKHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX1RYQ19YU19DT0wsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfVFhDX0RNQVVORCgpCQliZmluX3JlYWQzMihFTUFDX1RYQ19ETUFVTkQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19UWENfRE1BVU5EKHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX1RYQ19ETUFVTkQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfVFhDX0NSU0VSUigpCQliZmluX3JlYWQzMihFTUFDX1RYQ19DUlNFUlIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19UWENfQ1JTRVJSKHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX1RYQ19DUlNFUlIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfVFhDX1VOSUNTVCgpCQliZmluX3JlYWQzMihFTUFDX1RYQ19VTklDU1QpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19UWENfVU5JQ1NUKHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX1RYQ19VTklDU1QsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfVFhDX01VTFRJKCkJCWJmaW5fcmVhZDMyKEVNQUNfVFhDX01VTFRJKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfVFhDX01VTFRJKHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX1RYQ19NVUxUSSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19UWENfQlJPQUQoKQkJYmZpbl9yZWFkMzIoRU1BQ19UWENfQlJPQUQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19UWENfQlJPQUQodmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfVFhDX0JST0FELCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1RYQ19YU19ERlIoKQkJYmZpbl9yZWFkMzIoRU1BQ19UWENfWFNfREZSKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfVFhDX1hTX0RGUih2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19UWENfWFNfREZSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1RYQ19NQUNDVEwoKQkJYmZpbl9yZWFkMzIoRU1BQ19UWENfTUFDQ1RMKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfVFhDX01BQ0NUTCh2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19UWENfTUFDQ1RMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1RYQ19BTExGUk0oKQkJYmZpbl9yZWFkMzIoRU1BQ19UWENfQUxMRlJNKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfVFhDX0FMTEZSTSh2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19UWENfQUxMRlJNLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1RYQ19BTExPQ1QoKQkJYmZpbl9yZWFkMzIoRU1BQ19UWENfQUxMT0NUKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfVFhDX0FMTE9DVCh2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19UWENfQUxMT0NULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1RYQ19FUTY0KCkJCWJmaW5fcmVhZDMyKEVNQUNfVFhDX0VRNjQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19UWENfRVE2NCh2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19UWENfRVE2NCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19UWENfTFQxMjgoKQkJYmZpbl9yZWFkMzIoRU1BQ19UWENfTFQxMjgpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19UWENfTFQxMjgodmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfVFhDX0xUMTI4LCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1RYQ19MVDI1NigpCQliZmluX3JlYWQzMihFTUFDX1RYQ19MVDI1NikKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1RYQ19MVDI1Nih2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19UWENfTFQyNTYsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfVFhDX0xUNTEyKCkJCWJmaW5fcmVhZDMyKEVNQUNfVFhDX0xUNTEyKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfVFhDX0xUNTEyKHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX1RYQ19MVDUxMiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19UWENfTFQxMDI0KCkJCWJmaW5fcmVhZDMyKEVNQUNfVFhDX0xUMTAyNCkKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1RYQ19MVDEwMjQodmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfVFhDX0xUMTAyNCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19UWENfR0UxMDI0KCkJCWJmaW5fcmVhZDMyKEVNQUNfVFhDX0dFMTAyNCkKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1RYQ19HRTEwMjQodmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfVFhDX0dFMTAyNCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19UWENfQUJPUlQoKQkJYmZpbl9yZWFkMzIoRU1BQ19UWENfQUJPUlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19UWENfQUJPUlQodmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfVFhDX0FCT1JULCB2YWwpCisKKy8qIFJlbW92YWJsZSBTdG9yYWdlIEludGVyZmFjZSBSZWdpc3RlcnMgKi8KKworI2RlZmluZSBiZmluX3JlYWRfUlNJX1BXUl9DVEwoKSAgICAgICAgYmZpbl9yZWFkMTYoUlNJX1BXUl9DT05UUk9MKQorI2RlZmluZSBiZmluX3dyaXRlX1JTSV9QV1JfQ1RMKHZhbCkgICAgYmZpbl93cml0ZTE2KFJTSV9QV1JfQ09OVFJPTCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUlNJX0NMS19DVEwoKQkgICAgICAgYmZpbl9yZWFkMTYoUlNJX0NMS19DT05UUk9MKQorI2RlZmluZSBiZmluX3dyaXRlX1JTSV9DTEtfQ1RMKHZhbCkgICAgYmZpbl93cml0ZTE2KFJTSV9DTEtfQ09OVFJPTCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUlNJX0FSR1VNRU5UKCkgICAgICAgYmZpbl9yZWFkMzIoUlNJX0FSR1VNRU5UKQorI2RlZmluZSBiZmluX3dyaXRlX1JTSV9BUkdVTUVOVCh2YWwpICAgYmZpbl93cml0ZTMyKFJTSV9BUkdVTUVOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUlNJX0NPTU1BTkQoKSAgICAgICAgYmZpbl9yZWFkMTYoUlNJX0NPTU1BTkQpCisjZGVmaW5lIGJmaW5fd3JpdGVfUlNJX0NPTU1BTkQodmFsKSAgICBiZmluX3dyaXRlMTYoUlNJX0NPTU1BTkQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1JTSV9SRVNQX0NNRCgpICAgICAgIGJmaW5fcmVhZDE2KFJTSV9SRVNQX0NNRCkKKyNkZWZpbmUgYmZpbl93cml0ZV9SU0lfUkVTUF9DTUQodmFsKSAgIGJmaW5fd3JpdGUxNihSU0lfUkVTUF9DTUQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1JTSV9SRVNQT05TRTAoKSAgICAgIGJmaW5fcmVhZDMyKFJTSV9SRVNQT05TRTApCisjZGVmaW5lIGJmaW5fd3JpdGVfUlNJX1JFU1BPTlNFMCh2YWwpICBiZmluX3dyaXRlMzIoUlNJX1JFU1BPTlNFMCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUlNJX1JFU1BPTlNFMSgpICAgICAgYmZpbl9yZWFkMzIoUlNJX1JFU1BPTlNFMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9SU0lfUkVTUE9OU0UxKHZhbCkgIGJmaW5fd3JpdGUzMihSU0lfUkVTUE9OU0UxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9SU0lfUkVTUE9OU0UyKCkgICAgICBiZmluX3JlYWQzMihSU0lfUkVTUE9OU0UyKQorI2RlZmluZSBiZmluX3dyaXRlX1JTSV9SRVNQT05TRTIodmFsKSAgYmZpbl93cml0ZTMyKFJTSV9SRVNQT05TRTIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1JTSV9SRVNQT05TRTMoKSAgICAgIGJmaW5fcmVhZDMyKFJTSV9SRVNQT05TRTMpCisjZGVmaW5lIGJmaW5fd3JpdGVfUlNJX1JFU1BPTlNFMyh2YWwpICBiZmluX3dyaXRlMzIoUlNJX1JFU1BPTlNFMywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUlNJX0RBVEFfVElNRVIoKSAgICAgYmZpbl9yZWFkMzIoUlNJX0RBVEFfVElNRVIpCisjZGVmaW5lIGJmaW5fd3JpdGVfUlNJX0RBVEFfVElNRVIodmFsKSBiZmluX3dyaXRlMzIoUlNJX0RBVEFfVElNRVIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1JTSV9EQVRBX0xHVEgoKSAgICAgIGJmaW5fcmVhZDE2KFJTSV9EQVRBX0xHVEgpCisjZGVmaW5lIGJmaW5fd3JpdGVfUlNJX0RBVEFfTEdUSCh2YWwpICBiZmluX3dyaXRlMTYoUlNJX0RBVEFfTEdUSCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUlNJX0RBVEFfQ1RMKCkgICAgICAgYmZpbl9yZWFkMTYoUlNJX0RBVEFfQ09OVFJPTCkKKyNkZWZpbmUgYmZpbl93cml0ZV9SU0lfREFUQV9DVEwodmFsKSAgIGJmaW5fd3JpdGUxNihSU0lfREFUQV9DT05UUk9MLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9SU0lfREFUQV9DTlQoKSAgICAgICBiZmluX3JlYWQxNihSU0lfREFUQV9DTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfUlNJX0RBVEFfQ05UKHZhbCkgICBiZmluX3dyaXRlMTYoUlNJX0RBVEFfQ05ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9SU0lfU1RBVFVTKCkgICAgICAgICBiZmluX3JlYWQzMihSU0lfU1RBVFVTKQorI2RlZmluZSBiZmluX3dyaXRlX1JTSV9TVEFUVVModmFsKSAgICAgYmZpbl93cml0ZTMyKFJTSV9TVEFUVVMsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1JTSV9TVEFUVVNfQ0xSKCkgICAgIGJmaW5fcmVhZDE2KFJTSV9TVEFUVVNDTCkKKyNkZWZpbmUgYmZpbl93cml0ZV9SU0lfU1RBVFVTX0NMUih2YWwpIGJmaW5fd3JpdGUxNihSU0lfU1RBVFVTQ0wsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1JTSV9NQVNLMCgpICAgICAgICAgIGJmaW5fcmVhZDMyKFJTSV9NQVNLMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9SU0lfTUFTSzAodmFsKSAgICAgIGJmaW5fd3JpdGUzMihSU0lfTUFTSzAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1JTSV9NQVNLMSgpICAgICAgICAgIGJmaW5fcmVhZDMyKFJTSV9NQVNLMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9SU0lfTUFTSzEodmFsKSAgICAgIGJmaW5fd3JpdGUzMihSU0lfTUFTSzEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1JTSV9GSUZPX0NOVCgpICAgICAgIGJmaW5fcmVhZDE2KFJTSV9GSUZPX0NOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9SU0lfRklGT19DTlQodmFsKSAgIGJmaW5fd3JpdGUxNihSU0lfRklGT19DTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1JTSV9DRUFUQV9DVEwoKSAgICAgIGJmaW5fcmVhZDE2KFJTSV9DRUFUQV9DT05UUk9MKQorI2RlZmluZSBiZmluX3dyaXRlX1JTSV9DRUFUQV9DVEwodmFsKSAgYmZpbl93cml0ZTE2KFJTSV9DRUFUQV9DT05UUk9MLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9SU0lfRklGTygpICAgICAgICAgICBiZmluX3JlYWQzMihSU0lfRklGTykKKyNkZWZpbmUgYmZpbl93cml0ZV9SU0lfRklGTyh2YWwpICAgICAgIGJmaW5fd3JpdGUzMihSU0lfRklGTywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUlNJX0VfU1RBVFVTKCkgICAgICAgYmZpbl9yZWFkMTYoUlNJX0VTVEFUKQorI2RlZmluZSBiZmluX3dyaXRlX1JTSV9FX1NUQVRVUyh2YWwpICAgYmZpbl93cml0ZTE2KFJTSV9FU1RBVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUlNJX0VfTUFTSygpICAgICAgICAgYmZpbl9yZWFkMTYoUlNJX0VNQVNLKQorI2RlZmluZSBiZmluX3dyaXRlX1JTSV9FX01BU0sodmFsKSAgICAgYmZpbl93cml0ZTE2KFJTSV9FTUFTSywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUlNJX0NGRygpICAgICAgICAgICAgYmZpbl9yZWFkMTYoUlNJX0NPTkZJRykKKyNkZWZpbmUgYmZpbl93cml0ZV9SU0lfQ0ZHKHZhbCkgICAgICAgIGJmaW5fd3JpdGUxNihSU0lfQ09ORklHLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9SU0lfUkRfV0FJVF9FTigpICAgICBiZmluX3JlYWQxNihSU0lfUkRfV0FJVF9FTikKKyNkZWZpbmUgYmZpbl93cml0ZV9SU0lfUkRfV0FJVF9FTih2YWwpIGJmaW5fd3JpdGUxNihSU0lfUkRfV0FJVF9FTiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUlNJX1BJRDAoKSAgICAgICAgICAgYmZpbl9yZWFkMTYoUlNJX1BJRDApCisjZGVmaW5lIGJmaW5fd3JpdGVfUlNJX1BJRDAodmFsKSAgICAgICBiZmluX3dyaXRlMTYoUlNJX1BJRDAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1JTSV9QSUQxKCkgICAgICAgICAgIGJmaW5fcmVhZDE2KFJTSV9QSUQxKQorI2RlZmluZSBiZmluX3dyaXRlX1JTSV9QSUQxKHZhbCkgICAgICAgYmZpbl93cml0ZTE2KFJTSV9QSUQxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9SU0lfUElEMigpICAgICAgICAgICBiZmluX3JlYWQxNihSU0lfUElEMikKKyNkZWZpbmUgYmZpbl93cml0ZV9SU0lfUElEMih2YWwpICAgICAgIGJmaW5fd3JpdGUxNihSU0lfUElEMiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUlNJX1BJRDMoKSAgICAgICAgICAgYmZpbl9yZWFkMTYoUlNJX1BJRDMpCisjZGVmaW5lIGJmaW5fd3JpdGVfUlNJX1BJRDModmFsKSAgICAgICBiZmluX3dyaXRlMTYoUlNJX1BJRDMsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1JTSV9QSUQ0KCkgICAgICAgICAgIGJmaW5fcmVhZDE2KFJTSV9QSUQ0KQorI2RlZmluZSBiZmluX3dyaXRlX1JTSV9QSUQ0KHZhbCkgICAgICAgYmZpbl93cml0ZTE2KFJTSV9QSUQ0LCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9SU0lfUElENSgpICAgICAgICAgICBiZmluX3JlYWQxNihSU0lfUElENSkKKyNkZWZpbmUgYmZpbl93cml0ZV9SU0lfUElENSh2YWwpICAgICAgIGJmaW5fd3JpdGUxNihSU0lfUElENSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUlNJX1BJRDYoKSAgICAgICAgICAgYmZpbl9yZWFkMTYoUlNJX1BJRDYpCisjZGVmaW5lIGJmaW5fd3JpdGVfUlNJX1BJRDYodmFsKSAgICAgICBiZmluX3dyaXRlMTYoUlNJX1BJRDYsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1JTSV9QSUQ3KCkgICAgICAgICAgIGJmaW5fcmVhZDE2KFJTSV9QSUQ3KQorI2RlZmluZSBiZmluX3dyaXRlX1JTSV9QSUQ3KHZhbCkgICAgICAgYmZpbl93cml0ZTE2KFJTSV9QSUQ3LCB2YWwpCisKKworI2VuZGlmIC8qIF9DREVGX0JGNTE4X0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9pbmNsdWRlL21hY2gvY2RlZkJGNTF4X2Jhc2UuaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9pbmNsdWRlL21hY2gvY2RlZkJGNTF4X2Jhc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTNkNDczCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2luY2x1ZGUvbWFjaC9jZGVmQkY1MXhfYmFzZS5oCkBAIC0wLDAgKzEsMTIwOCBAQAorLyoKKyAqIEZpbGU6ICAgICAgICAgaW5jbHVkZS9hc20tYmxhY2tmaW4vbWFjaC1iZjUxOC9jZGVmQkY1MXhfYmFzZS5oCisgKiBCYXNlZCBvbjoKKyAqIEF1dGhvcjoKKyAqCisgKiBDcmVhdGVkOgorICogRGVzY3JpcHRpb246CisgKgorICogUmV2OgorICoKKyAqIE1vZGlmaWVkOgorICoKKyAqIEJ1Z3M6ICAgICAgICAgRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuCisgKiBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICovCisKKyNpZm5kZWYgX0NERUZfQkY1MlhfSAorI2RlZmluZSBfQ0RFRl9CRjUyWF9ICisKKyNpbmNsdWRlIDxhc20vYmxhY2tmaW4uaD4KKworI2luY2x1ZGUgImRlZkJGNTF4X2Jhc2UuaCIKKworLyogSW5jbHVkZSBjb3JlIHNwZWNpZmljIHJlZ2lzdGVyIHBvaW50ZXIgZGVmaW5pdGlvbnMgCQkJCQkJCQkqLworI2luY2x1ZGUgPGFzbS9jZGVmX0xQQmxhY2tmaW4uaD4KKworLyogPT09PSBiZWdpbiBmcm9tIGNkZWZCRjUzNC5oID09PT0gKi8KKworLyogQ2xvY2sgYW5kIFN5c3RlbSBDb250cm9sCSgweEZGQzAwMDAwIC0gMHhGRkMwMDBGRikJCQkJCQkJCSovCisjZGVmaW5lIGJmaW5fcmVhZF9QTExfQ1RMKCkJCQliZmluX3JlYWQxNihQTExfQ1RMKQorI2RlZmluZSBiZmluX3JlYWRfUExMX0RJVigpCQkJYmZpbl9yZWFkMTYoUExMX0RJVikKKyNkZWZpbmUgYmZpbl93cml0ZV9QTExfRElWKHZhbCkJCQliZmluX3dyaXRlMTYoUExMX0RJViwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVlJfQ1RMKCkJCQliZmluX3JlYWQxNihWUl9DVEwpCisjZGVmaW5lIGJmaW5fcmVhZF9QTExfU1RBVCgpCQkJYmZpbl9yZWFkMTYoUExMX1NUQVQpCisjZGVmaW5lIGJmaW5fd3JpdGVfUExMX1NUQVQodmFsKQkJYmZpbl93cml0ZTE2KFBMTF9TVEFULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QTExfTE9DS0NOVCgpCQkJYmZpbl9yZWFkMTYoUExMX0xPQ0tDTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfUExMX0xPQ0tDTlQodmFsKQkJYmZpbl93cml0ZTE2KFBMTF9MT0NLQ05ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DSElQSUQoKQkJCWJmaW5fcmVhZDMyKENISVBJRCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DSElQSUQodmFsKQkJCWJmaW5fd3JpdGUzMihDSElQSUQsIHZhbCkKKworCisvKiBTeXN0ZW0gSW50ZXJydXB0IENvbnRyb2xsZXIgKDB4RkZDMDAxMDAgLSAweEZGQzAwMUZGKQkJCQkJCQkqLworI2RlZmluZSBiZmluX3JlYWRfU1dSU1QoKQkJCWJmaW5fcmVhZDE2KFNXUlNUKQorI2RlZmluZSBiZmluX3dyaXRlX1NXUlNUKHZhbCkJCQliZmluX3dyaXRlMTYoU1dSU1QsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NZU0NSKCkJCQliZmluX3JlYWQxNihTWVNDUikKKyNkZWZpbmUgYmZpbl93cml0ZV9TWVNDUih2YWwpCQkJYmZpbl93cml0ZTE2KFNZU0NSLCB2YWwpCisKKyNkZWZpbmUgYmZpbl9yZWFkX1NJQ19SVkVDVCgpCQkJYmZpbl9yZWFkMzIoU0lDX1JWRUNUKQorI2RlZmluZSBiZmluX3dyaXRlX1NJQ19SVkVDVCh2YWwpCQliZmluX3dyaXRlMzIoU0lDX1JWRUNULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TSUNfSU1BU0swKCkJCQliZmluX3JlYWQzMihTSUNfSU1BU0swKQorI2RlZmluZSBiZmluX3dyaXRlX1NJQ19JTUFTSzAodmFsKQkJYmZpbl93cml0ZTMyKFNJQ19JTUFTSzAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NJQ19JTUFTSyh4KQkJCWJmaW5fcmVhZDMyKFNJQ19JTUFTSzAgKyAoeCA8PCA2KSkKKyNkZWZpbmUgYmZpbl93cml0ZV9TSUNfSU1BU0soeCwgdmFsKQkJYmZpbl93cml0ZTMyKChTSUNfSU1BU0swICsgKHggPDwgNikpLCB2YWwpCisKKyNkZWZpbmUgYmZpbl9yZWFkX1NJQ19JQVIwKCkJCQliZmluX3JlYWQzMihTSUNfSUFSMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9TSUNfSUFSMCh2YWwpCQliZmluX3dyaXRlMzIoU0lDX0lBUjAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NJQ19JQVIxKCkJCQliZmluX3JlYWQzMihTSUNfSUFSMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9TSUNfSUFSMSh2YWwpCQliZmluX3dyaXRlMzIoU0lDX0lBUjEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NJQ19JQVIyKCkJCQliZmluX3JlYWQzMihTSUNfSUFSMikKKyNkZWZpbmUgYmZpbl93cml0ZV9TSUNfSUFSMih2YWwpCQliZmluX3dyaXRlMzIoU0lDX0lBUjIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NJQ19JQVIzKCkJCQliZmluX3JlYWQzMihTSUNfSUFSMykKKyNkZWZpbmUgYmZpbl93cml0ZV9TSUNfSUFSMyh2YWwpCQliZmluX3dyaXRlMzIoU0lDX0lBUjMsIHZhbCkKKworI2RlZmluZSBiZmluX3JlYWRfU0lDX0lTUjAoKQkJCWJmaW5fcmVhZDMyKFNJQ19JU1IwKQorI2RlZmluZSBiZmluX3dyaXRlX1NJQ19JU1IwKHZhbCkJCWJmaW5fd3JpdGUzMihTSUNfSVNSMCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU0lDX0lTUih4KQkJCWJmaW5fcmVhZDMyKFNJQ19JU1IwICsgKHggPDwgNikpCisjZGVmaW5lIGJmaW5fd3JpdGVfU0lDX0lTUih4LCB2YWwpCQliZmluX3dyaXRlMzIoKFNJQ19JU1IwICsgKHggPDwgNikpLCB2YWwpCisKKyNkZWZpbmUgYmZpbl9yZWFkX1NJQ19JV1IwKCkJCQliZmluX3JlYWQzMihTSUNfSVdSMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9TSUNfSVdSMCh2YWwpCQliZmluX3dyaXRlMzIoU0lDX0lXUjAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NJQ19JV1IoeCkJCQliZmluX3JlYWQzMihTSUNfSVdSMCArICh4IDw8IDYpKQorI2RlZmluZSBiZmluX3dyaXRlX1NJQ19JV1IoeCwgdmFsKQkJYmZpbl93cml0ZTMyKChTSUNfSVdSMCArICh4IDw8IDYpKSwgdmFsKQorCisvKiBTSUMgQWRkaXRpb25zIHRvIEFEU1AtQkY1MXggKDB4RkZDMDAxNEMgLSAweEZGQzAwMTYyKSAqLworCisjZGVmaW5lIGJmaW5fcmVhZF9TSUNfSU1BU0sxKCkJCQliZmluX3JlYWQzMihTSUNfSU1BU0sxKQorI2RlZmluZSBiZmluX3dyaXRlX1NJQ19JTUFTSzEodmFsKQkJYmZpbl93cml0ZTMyKFNJQ19JTUFTSzEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NJQ19JQVI0KCkJCQliZmluX3JlYWQzMihTSUNfSUFSNCkKKyNkZWZpbmUgYmZpbl93cml0ZV9TSUNfSUFSNCh2YWwpCQliZmluX3dyaXRlMzIoU0lDX0lBUjQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NJQ19JQVI1KCkJCQliZmluX3JlYWQzMihTSUNfSUFSNSkKKyNkZWZpbmUgYmZpbl93cml0ZV9TSUNfSUFSNSh2YWwpCQliZmluX3dyaXRlMzIoU0lDX0lBUjUsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NJQ19JQVI2KCkJCQliZmluX3JlYWQzMihTSUNfSUFSNikKKyNkZWZpbmUgYmZpbl93cml0ZV9TSUNfSUFSNih2YWwpCQliZmluX3dyaXRlMzIoU0lDX0lBUjYsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NJQ19JQVI3KCkJCQliZmluX3JlYWQzMihTSUNfSUFSNykKKyNkZWZpbmUgYmZpbl93cml0ZV9TSUNfSUFSNyh2YWwpCQliZmluX3dyaXRlMzIoU0lDX0lBUjcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NJQ19JU1IxKCkJCQliZmluX3JlYWQzMihTSUNfSVNSMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9TSUNfSVNSMSh2YWwpCQliZmluX3dyaXRlMzIoU0lDX0lTUjEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NJQ19JV1IxKCkJCQliZmluX3JlYWQzMihTSUNfSVdSMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9TSUNfSVdSMSh2YWwpCQliZmluX3dyaXRlMzIoU0lDX0lXUjEsIHZhbCkKKworLyogV2F0Y2hkb2cgVGltZXIJCSgweEZGQzAwMjAwIC0gMHhGRkMwMDJGRikJCQkJCQkJCQkqLworI2RlZmluZSBiZmluX3JlYWRfV0RPR19DVEwoKQkJCWJmaW5fcmVhZDE2KFdET0dfQ1RMKQorI2RlZmluZSBiZmluX3dyaXRlX1dET0dfQ1RMKHZhbCkJCWJmaW5fd3JpdGUxNihXRE9HX0NUTCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfV0RPR19DTlQoKQkJCWJmaW5fcmVhZDMyKFdET0dfQ05UKQorI2RlZmluZSBiZmluX3dyaXRlX1dET0dfQ05UKHZhbCkJCWJmaW5fd3JpdGUzMihXRE9HX0NOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfV0RPR19TVEFUKCkJCQliZmluX3JlYWQzMihXRE9HX1NUQVQpCisjZGVmaW5lIGJmaW5fd3JpdGVfV0RPR19TVEFUKHZhbCkJCWJmaW5fd3JpdGUzMihXRE9HX1NUQVQsIHZhbCkKKworCisvKiBSZWFsIFRpbWUgQ2xvY2sJCSgweEZGQzAwMzAwIC0gMHhGRkMwMDNGRikJCQkJCQkJCQkqLworI2RlZmluZSBiZmluX3JlYWRfUlRDX1NUQVQoKQkJCWJmaW5fcmVhZDMyKFJUQ19TVEFUKQorI2RlZmluZSBiZmluX3dyaXRlX1JUQ19TVEFUKHZhbCkJCWJmaW5fd3JpdGUzMihSVENfU1RBVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUlRDX0lDVEwoKQkJCWJmaW5fcmVhZDE2KFJUQ19JQ1RMKQorI2RlZmluZSBiZmluX3dyaXRlX1JUQ19JQ1RMKHZhbCkJCWJmaW5fd3JpdGUxNihSVENfSUNUTCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUlRDX0lTVEFUKCkJCQliZmluX3JlYWQxNihSVENfSVNUQVQpCisjZGVmaW5lIGJmaW5fd3JpdGVfUlRDX0lTVEFUKHZhbCkJCWJmaW5fd3JpdGUxNihSVENfSVNUQVQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1JUQ19TV0NOVCgpCQkJYmZpbl9yZWFkMTYoUlRDX1NXQ05UKQorI2RlZmluZSBiZmluX3dyaXRlX1JUQ19TV0NOVCh2YWwpCQliZmluX3dyaXRlMTYoUlRDX1NXQ05ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9SVENfQUxBUk0oKQkJCWJmaW5fcmVhZDMyKFJUQ19BTEFSTSkKKyNkZWZpbmUgYmZpbl93cml0ZV9SVENfQUxBUk0odmFsKQkJYmZpbl93cml0ZTMyKFJUQ19BTEFSTSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUlRDX0ZBU1QoKQkJCWJmaW5fcmVhZDE2KFJUQ19GQVNUKQorI2RlZmluZSBiZmluX3dyaXRlX1JUQ19GQVNUKHZhbCkJCWJmaW5fd3JpdGUxNihSVENfRkFTVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUlRDX1BSRU4oKQkJCWJmaW5fcmVhZDE2KFJUQ19QUkVOKQorI2RlZmluZSBiZmluX3dyaXRlX1JUQ19QUkVOKHZhbCkJCWJmaW5fd3JpdGUxNihSVENfUFJFTiwgdmFsKQorCisKKy8qIFVBUlQwIENvbnRyb2xsZXIJCSgweEZGQzAwNDAwIC0gMHhGRkMwMDRGRikJCQkJCQkJCQkqLworI2RlZmluZSBiZmluX3JlYWRfVUFSVDBfVEhSKCkJCQliZmluX3JlYWQxNihVQVJUMF9USFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfVUFSVDBfVEhSKHZhbCkJCWJmaW5fd3JpdGUxNihVQVJUMF9USFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VBUlQwX1JCUigpCQkJYmZpbl9yZWFkMTYoVUFSVDBfUkJSKQorI2RlZmluZSBiZmluX3dyaXRlX1VBUlQwX1JCUih2YWwpCQliZmluX3dyaXRlMTYoVUFSVDBfUkJSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VQVJUMF9ETEwoKQkJCWJmaW5fcmVhZDE2KFVBUlQwX0RMTCkKKyNkZWZpbmUgYmZpbl93cml0ZV9VQVJUMF9ETEwodmFsKQkJYmZpbl93cml0ZTE2KFVBUlQwX0RMTCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVUFSVDBfSUVSKCkJCQliZmluX3JlYWQxNihVQVJUMF9JRVIpCisjZGVmaW5lIGJmaW5fd3JpdGVfVUFSVDBfSUVSKHZhbCkJCWJmaW5fd3JpdGUxNihVQVJUMF9JRVIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VBUlQwX0RMSCgpCQkJYmZpbl9yZWFkMTYoVUFSVDBfRExIKQorI2RlZmluZSBiZmluX3dyaXRlX1VBUlQwX0RMSCh2YWwpCQliZmluX3dyaXRlMTYoVUFSVDBfRExILCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VQVJUMF9JSVIoKQkJCWJmaW5fcmVhZDE2KFVBUlQwX0lJUikKKyNkZWZpbmUgYmZpbl93cml0ZV9VQVJUMF9JSVIodmFsKQkJYmZpbl93cml0ZTE2KFVBUlQwX0lJUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVUFSVDBfTENSKCkJCQliZmluX3JlYWQxNihVQVJUMF9MQ1IpCisjZGVmaW5lIGJmaW5fd3JpdGVfVUFSVDBfTENSKHZhbCkJCWJmaW5fd3JpdGUxNihVQVJUMF9MQ1IsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VBUlQwX01DUigpCQkJYmZpbl9yZWFkMTYoVUFSVDBfTUNSKQorI2RlZmluZSBiZmluX3dyaXRlX1VBUlQwX01DUih2YWwpCQliZmluX3dyaXRlMTYoVUFSVDBfTUNSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VQVJUMF9MU1IoKQkJCWJmaW5fcmVhZDE2KFVBUlQwX0xTUikKKyNkZWZpbmUgYmZpbl93cml0ZV9VQVJUMF9MU1IodmFsKQkJYmZpbl93cml0ZTE2KFVBUlQwX0xTUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVUFSVDBfTVNSKCkJCQliZmluX3JlYWQxNihVQVJUMF9NU1IpCisjZGVmaW5lIGJmaW5fd3JpdGVfVUFSVDBfTVNSKHZhbCkJCWJmaW5fd3JpdGUxNihVQVJUMF9NU1IsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VBUlQwX1NDUigpCQkJYmZpbl9yZWFkMTYoVUFSVDBfU0NSKQorI2RlZmluZSBiZmluX3dyaXRlX1VBUlQwX1NDUih2YWwpCQliZmluX3dyaXRlMTYoVUFSVDBfU0NSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VQVJUMF9HQ1RMKCkJCQliZmluX3JlYWQxNihVQVJUMF9HQ1RMKQorI2RlZmluZSBiZmluX3dyaXRlX1VBUlQwX0dDVEwodmFsKQkJYmZpbl93cml0ZTE2KFVBUlQwX0dDVEwsIHZhbCkKKworCisvKiBTUEkgQ29udHJvbGxlcgkJKDB4RkZDMDA1MDAgLSAweEZGQzAwNUZGKQkJCQkJCQkJCSovCisjZGVmaW5lIGJmaW5fcmVhZF9TUElfQ1RMKCkJCQliZmluX3JlYWQxNihTUElfQ1RMKQorI2RlZmluZSBiZmluX3dyaXRlX1NQSV9DVEwodmFsKQkJCWJmaW5fd3JpdGUxNihTUElfQ1RMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUElfRkxHKCkJCQliZmluX3JlYWQxNihTUElfRkxHKQorI2RlZmluZSBiZmluX3dyaXRlX1NQSV9GTEcodmFsKQkJCWJmaW5fd3JpdGUxNihTUElfRkxHLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUElfU1RBVCgpCQkJYmZpbl9yZWFkMTYoU1BJX1NUQVQpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BJX1NUQVQodmFsKQkJYmZpbl93cml0ZTE2KFNQSV9TVEFULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUElfVERCUigpCQkJYmZpbl9yZWFkMTYoU1BJX1REQlIpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BJX1REQlIodmFsKQkJYmZpbl93cml0ZTE2KFNQSV9UREJSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUElfUkRCUigpCQkJYmZpbl9yZWFkMTYoU1BJX1JEQlIpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BJX1JEQlIodmFsKQkJYmZpbl93cml0ZTE2KFNQSV9SREJSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUElfQkFVRCgpCQkJYmZpbl9yZWFkMTYoU1BJX0JBVUQpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BJX0JBVUQodmFsKQkJYmZpbl93cml0ZTE2KFNQSV9CQVVELCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUElfU0hBRE9XKCkJCQliZmluX3JlYWQxNihTUElfU0hBRE9XKQorI2RlZmluZSBiZmluX3dyaXRlX1NQSV9TSEFET1codmFsKQkJYmZpbl93cml0ZTE2KFNQSV9TSEFET1csIHZhbCkKKworCisvKiBUSU1FUjAtNyBSZWdpc3RlcnMJCSgweEZGQzAwNjAwIC0gMHhGRkMwMDZGRikJCQkJCQkJCSovCisjZGVmaW5lIGJmaW5fcmVhZF9USU1FUjBfQ09ORklHKCkJCWJmaW5fcmVhZDE2KFRJTUVSMF9DT05GSUcpCisjZGVmaW5lIGJmaW5fd3JpdGVfVElNRVIwX0NPTkZJRyh2YWwpCQliZmluX3dyaXRlMTYoVElNRVIwX0NPTkZJRywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVElNRVIwX0NPVU5URVIoKQkJYmZpbl9yZWFkMzIoVElNRVIwX0NPVU5URVIpCisjZGVmaW5lIGJmaW5fd3JpdGVfVElNRVIwX0NPVU5URVIodmFsKQkJYmZpbl93cml0ZTMyKFRJTUVSMF9DT1VOVEVSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9USU1FUjBfUEVSSU9EKCkJCWJmaW5fcmVhZDMyKFRJTUVSMF9QRVJJT0QpCisjZGVmaW5lIGJmaW5fd3JpdGVfVElNRVIwX1BFUklPRCh2YWwpCQliZmluX3dyaXRlMzIoVElNRVIwX1BFUklPRCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVElNRVIwX1dJRFRIKCkJCWJmaW5fcmVhZDMyKFRJTUVSMF9XSURUSCkKKyNkZWZpbmUgYmZpbl93cml0ZV9USU1FUjBfV0lEVEgodmFsKQkJYmZpbl93cml0ZTMyKFRJTUVSMF9XSURUSCwgdmFsKQorCisjZGVmaW5lIGJmaW5fcmVhZF9USU1FUjFfQ09ORklHKCkJCWJmaW5fcmVhZDE2KFRJTUVSMV9DT05GSUcpCisjZGVmaW5lIGJmaW5fd3JpdGVfVElNRVIxX0NPTkZJRyh2YWwpCQliZmluX3dyaXRlMTYoVElNRVIxX0NPTkZJRywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVElNRVIxX0NPVU5URVIoKQkJYmZpbl9yZWFkMzIoVElNRVIxX0NPVU5URVIpCisjZGVmaW5lIGJmaW5fd3JpdGVfVElNRVIxX0NPVU5URVIodmFsKQkJYmZpbl93cml0ZTMyKFRJTUVSMV9DT1VOVEVSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9USU1FUjFfUEVSSU9EKCkJCWJmaW5fcmVhZDMyKFRJTUVSMV9QRVJJT0QpCisjZGVmaW5lIGJmaW5fd3JpdGVfVElNRVIxX1BFUklPRCh2YWwpCQliZmluX3dyaXRlMzIoVElNRVIxX1BFUklPRCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVElNRVIxX1dJRFRIKCkJCWJmaW5fcmVhZDMyKFRJTUVSMV9XSURUSCkKKyNkZWZpbmUgYmZpbl93cml0ZV9USU1FUjFfV0lEVEgodmFsKQkJYmZpbl93cml0ZTMyKFRJTUVSMV9XSURUSCwgdmFsKQorCisjZGVmaW5lIGJmaW5fcmVhZF9USU1FUjJfQ09ORklHKCkJCWJmaW5fcmVhZDE2KFRJTUVSMl9DT05GSUcpCisjZGVmaW5lIGJmaW5fd3JpdGVfVElNRVIyX0NPTkZJRyh2YWwpCQliZmluX3dyaXRlMTYoVElNRVIyX0NPTkZJRywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVElNRVIyX0NPVU5URVIoKQkJYmZpbl9yZWFkMzIoVElNRVIyX0NPVU5URVIpCisjZGVmaW5lIGJmaW5fd3JpdGVfVElNRVIyX0NPVU5URVIodmFsKQkJYmZpbl93cml0ZTMyKFRJTUVSMl9DT1VOVEVSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9USU1FUjJfUEVSSU9EKCkJCWJmaW5fcmVhZDMyKFRJTUVSMl9QRVJJT0QpCisjZGVmaW5lIGJmaW5fd3JpdGVfVElNRVIyX1BFUklPRCh2YWwpCQliZmluX3dyaXRlMzIoVElNRVIyX1BFUklPRCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVElNRVIyX1dJRFRIKCkJCWJmaW5fcmVhZDMyKFRJTUVSMl9XSURUSCkKKyNkZWZpbmUgYmZpbl93cml0ZV9USU1FUjJfV0lEVEgodmFsKQkJYmZpbl93cml0ZTMyKFRJTUVSMl9XSURUSCwgdmFsKQorCisjZGVmaW5lIGJmaW5fcmVhZF9USU1FUjNfQ09ORklHKCkJCWJmaW5fcmVhZDE2KFRJTUVSM19DT05GSUcpCisjZGVmaW5lIGJmaW5fd3JpdGVfVElNRVIzX0NPTkZJRyh2YWwpCQliZmluX3dyaXRlMTYoVElNRVIzX0NPTkZJRywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVElNRVIzX0NPVU5URVIoKQkJYmZpbl9yZWFkMzIoVElNRVIzX0NPVU5URVIpCisjZGVmaW5lIGJmaW5fd3JpdGVfVElNRVIzX0NPVU5URVIodmFsKQkJYmZpbl93cml0ZTMyKFRJTUVSM19DT1VOVEVSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9USU1FUjNfUEVSSU9EKCkJCWJmaW5fcmVhZDMyKFRJTUVSM19QRVJJT0QpCisjZGVmaW5lIGJmaW5fd3JpdGVfVElNRVIzX1BFUklPRCh2YWwpCQliZmluX3dyaXRlMzIoVElNRVIzX1BFUklPRCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVElNRVIzX1dJRFRIKCkJCWJmaW5fcmVhZDMyKFRJTUVSM19XSURUSCkKKyNkZWZpbmUgYmZpbl93cml0ZV9USU1FUjNfV0lEVEgodmFsKQkJYmZpbl93cml0ZTMyKFRJTUVSM19XSURUSCwgdmFsKQorCisjZGVmaW5lIGJmaW5fcmVhZF9USU1FUjRfQ09ORklHKCkJCWJmaW5fcmVhZDE2KFRJTUVSNF9DT05GSUcpCisjZGVmaW5lIGJmaW5fd3JpdGVfVElNRVI0X0NPTkZJRyh2YWwpCQliZmluX3dyaXRlMTYoVElNRVI0X0NPTkZJRywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVElNRVI0X0NPVU5URVIoKQkJYmZpbl9yZWFkMzIoVElNRVI0X0NPVU5URVIpCisjZGVmaW5lIGJmaW5fd3JpdGVfVElNRVI0X0NPVU5URVIodmFsKQkJYmZpbl93cml0ZTMyKFRJTUVSNF9DT1VOVEVSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9USU1FUjRfUEVSSU9EKCkJCWJmaW5fcmVhZDMyKFRJTUVSNF9QRVJJT0QpCisjZGVmaW5lIGJmaW5fd3JpdGVfVElNRVI0X1BFUklPRCh2YWwpCQliZmluX3dyaXRlMzIoVElNRVI0X1BFUklPRCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVElNRVI0X1dJRFRIKCkJCWJmaW5fcmVhZDMyKFRJTUVSNF9XSURUSCkKKyNkZWZpbmUgYmZpbl93cml0ZV9USU1FUjRfV0lEVEgodmFsKQkJYmZpbl93cml0ZTMyKFRJTUVSNF9XSURUSCwgdmFsKQorCisjZGVmaW5lIGJmaW5fcmVhZF9USU1FUjVfQ09ORklHKCkJCWJmaW5fcmVhZDE2KFRJTUVSNV9DT05GSUcpCisjZGVmaW5lIGJmaW5fd3JpdGVfVElNRVI1X0NPTkZJRyh2YWwpCQliZmluX3dyaXRlMTYoVElNRVI1X0NPTkZJRywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVElNRVI1X0NPVU5URVIoKQkJYmZpbl9yZWFkMzIoVElNRVI1X0NPVU5URVIpCisjZGVmaW5lIGJmaW5fd3JpdGVfVElNRVI1X0NPVU5URVIodmFsKQkJYmZpbl93cml0ZTMyKFRJTUVSNV9DT1VOVEVSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9USU1FUjVfUEVSSU9EKCkJCWJmaW5fcmVhZDMyKFRJTUVSNV9QRVJJT0QpCisjZGVmaW5lIGJmaW5fd3JpdGVfVElNRVI1X1BFUklPRCh2YWwpCQliZmluX3dyaXRlMzIoVElNRVI1X1BFUklPRCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVElNRVI1X1dJRFRIKCkJCWJmaW5fcmVhZDMyKFRJTUVSNV9XSURUSCkKKyNkZWZpbmUgYmZpbl93cml0ZV9USU1FUjVfV0lEVEgodmFsKQkJYmZpbl93cml0ZTMyKFRJTUVSNV9XSURUSCwgdmFsKQorCisjZGVmaW5lIGJmaW5fcmVhZF9USU1FUjZfQ09ORklHKCkJCWJmaW5fcmVhZDE2KFRJTUVSNl9DT05GSUcpCisjZGVmaW5lIGJmaW5fd3JpdGVfVElNRVI2X0NPTkZJRyh2YWwpCQliZmluX3dyaXRlMTYoVElNRVI2X0NPTkZJRywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVElNRVI2X0NPVU5URVIoKQkJYmZpbl9yZWFkMzIoVElNRVI2X0NPVU5URVIpCisjZGVmaW5lIGJmaW5fd3JpdGVfVElNRVI2X0NPVU5URVIodmFsKQkJYmZpbl93cml0ZTMyKFRJTUVSNl9DT1VOVEVSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9USU1FUjZfUEVSSU9EKCkJCWJmaW5fcmVhZDMyKFRJTUVSNl9QRVJJT0QpCisjZGVmaW5lIGJmaW5fd3JpdGVfVElNRVI2X1BFUklPRCh2YWwpCQliZmluX3dyaXRlMzIoVElNRVI2X1BFUklPRCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVElNRVI2X1dJRFRIKCkJCWJmaW5fcmVhZDMyKFRJTUVSNl9XSURUSCkKKyNkZWZpbmUgYmZpbl93cml0ZV9USU1FUjZfV0lEVEgodmFsKQkJYmZpbl93cml0ZTMyKFRJTUVSNl9XSURUSCwgdmFsKQorCisjZGVmaW5lIGJmaW5fcmVhZF9USU1FUjdfQ09ORklHKCkJCWJmaW5fcmVhZDE2KFRJTUVSN19DT05GSUcpCisjZGVmaW5lIGJmaW5fd3JpdGVfVElNRVI3X0NPTkZJRyh2YWwpCQliZmluX3dyaXRlMTYoVElNRVI3X0NPTkZJRywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVElNRVI3X0NPVU5URVIoKQkJYmZpbl9yZWFkMzIoVElNRVI3X0NPVU5URVIpCisjZGVmaW5lIGJmaW5fd3JpdGVfVElNRVI3X0NPVU5URVIodmFsKQkJYmZpbl93cml0ZTMyKFRJTUVSN19DT1VOVEVSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9USU1FUjdfUEVSSU9EKCkJCWJmaW5fcmVhZDMyKFRJTUVSN19QRVJJT0QpCisjZGVmaW5lIGJmaW5fd3JpdGVfVElNRVI3X1BFUklPRCh2YWwpCQliZmluX3dyaXRlMzIoVElNRVI3X1BFUklPRCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVElNRVI3X1dJRFRIKCkJCWJmaW5fcmVhZDMyKFRJTUVSN19XSURUSCkKKyNkZWZpbmUgYmZpbl93cml0ZV9USU1FUjdfV0lEVEgodmFsKQkJYmZpbl93cml0ZTMyKFRJTUVSN19XSURUSCwgdmFsKQorCisjZGVmaW5lIGJmaW5fcmVhZF9USU1FUl9FTkFCTEUoKQkJYmZpbl9yZWFkMTYoVElNRVJfRU5BQkxFKQorI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSX0VOQUJMRSh2YWwpCQliZmluX3dyaXRlMTYoVElNRVJfRU5BQkxFLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9USU1FUl9ESVNBQkxFKCkJCWJmaW5fcmVhZDE2KFRJTUVSX0RJU0FCTEUpCisjZGVmaW5lIGJmaW5fd3JpdGVfVElNRVJfRElTQUJMRSh2YWwpCQliZmluX3dyaXRlMTYoVElNRVJfRElTQUJMRSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVElNRVJfU1RBVFVTKCkJCWJmaW5fcmVhZDMyKFRJTUVSX1NUQVRVUykKKyNkZWZpbmUgYmZpbl93cml0ZV9USU1FUl9TVEFUVVModmFsKQkJYmZpbl93cml0ZTMyKFRJTUVSX1NUQVRVUywgdmFsKQorCisKKy8qIEdlbmVyYWwgUHVycG9zZSBJL08gUG9ydCBGICgweEZGQzAwNzAwIC0gMHhGRkMwMDdGRikJCQkJCQkJCSovCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JURklPKCkJCQliZmluX3JlYWQxNihQT1JURklPKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRGSU8odmFsKQkJCWJmaW5fd3JpdGUxNihQT1JURklPLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JURklPX0NMRUFSKCkJCWJmaW5fcmVhZDE2KFBPUlRGSU9fQ0xFQVIpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEZJT19DTEVBUih2YWwpCQliZmluX3dyaXRlMTYoUE9SVEZJT19DTEVBUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEZJT19TRVQoKQkJCWJmaW5fcmVhZDE2KFBPUlRGSU9fU0VUKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRGSU9fU0VUKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JURklPX1NFVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEZJT19UT0dHTEUoKQkJYmZpbl9yZWFkMTYoUE9SVEZJT19UT0dHTEUpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEZJT19UT0dHTEUodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRGSU9fVE9HR0xFLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JURklPX01BU0tBKCkJCWJmaW5fcmVhZDE2KFBPUlRGSU9fTUFTS0EpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEZJT19NQVNLQSh2YWwpCQliZmluX3dyaXRlMTYoUE9SVEZJT19NQVNLQSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEZJT19NQVNLQV9DTEVBUigpCQliZmluX3JlYWQxNihQT1JURklPX01BU0tBX0NMRUFSKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRGSU9fTUFTS0FfQ0xFQVIodmFsKQliZmluX3dyaXRlMTYoUE9SVEZJT19NQVNLQV9DTEVBUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEZJT19NQVNLQV9TRVQoKQkJYmZpbl9yZWFkMTYoUE9SVEZJT19NQVNLQV9TRVQpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEZJT19NQVNLQV9TRVQodmFsKQliZmluX3dyaXRlMTYoUE9SVEZJT19NQVNLQV9TRVQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRGSU9fTUFTS0FfVE9HR0xFKCkJYmZpbl9yZWFkMTYoUE9SVEZJT19NQVNLQV9UT0dHTEUpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEZJT19NQVNLQV9UT0dHTEUodmFsKQliZmluX3dyaXRlMTYoUE9SVEZJT19NQVNLQV9UT0dHTEUsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRGSU9fTUFTS0IoKQkJYmZpbl9yZWFkMTYoUE9SVEZJT19NQVNLQikKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JURklPX01BU0tCKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JURklPX01BU0tCLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JURklPX01BU0tCX0NMRUFSKCkJCWJmaW5fcmVhZDE2KFBPUlRGSU9fTUFTS0JfQ0xFQVIpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEZJT19NQVNLQl9DTEVBUih2YWwpCWJmaW5fd3JpdGUxNihQT1JURklPX01BU0tCX0NMRUFSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JURklPX01BU0tCX1NFVCgpCQliZmluX3JlYWQxNihQT1JURklPX01BU0tCX1NFVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JURklPX01BU0tCX1NFVCh2YWwpCWJmaW5fd3JpdGUxNihQT1JURklPX01BU0tCX1NFVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEZJT19NQVNLQl9UT0dHTEUoKQliZmluX3JlYWQxNihQT1JURklPX01BU0tCX1RPR0dMRSkKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JURklPX01BU0tCX1RPR0dMRSh2YWwpCWJmaW5fd3JpdGUxNihQT1JURklPX01BU0tCX1RPR0dMRSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEZJT19ESVIoKQkJCWJmaW5fcmVhZDE2KFBPUlRGSU9fRElSKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRGSU9fRElSKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JURklPX0RJUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEZJT19QT0xBUigpCQliZmluX3JlYWQxNihQT1JURklPX1BPTEFSKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRGSU9fUE9MQVIodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRGSU9fUE9MQVIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRGSU9fRURHRSgpCQliZmluX3JlYWQxNihQT1JURklPX0VER0UpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEZJT19FREdFKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JURklPX0VER0UsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRGSU9fQk9USCgpCQliZmluX3JlYWQxNihQT1JURklPX0JPVEgpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEZJT19CT1RIKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JURklPX0JPVEgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRGSU9fSU5FTigpCQliZmluX3JlYWQxNihQT1JURklPX0lORU4pCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEZJT19JTkVOKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JURklPX0lORU4sIHZhbCkKKworCisvKiBTUE9SVDAgQ29udHJvbGxlcgkJKDB4RkZDMDA4MDAgLSAweEZGQzAwOEZGKQkJCQkJCQkJKi8KKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMF9UQ1IxKCkJCQliZmluX3JlYWQxNihTUE9SVDBfVENSMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDBfVENSMSh2YWwpCQliZmluX3dyaXRlMTYoU1BPUlQwX1RDUjEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMF9UQ1IyKCkJCQliZmluX3JlYWQxNihTUE9SVDBfVENSMikKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDBfVENSMih2YWwpCQliZmluX3dyaXRlMTYoU1BPUlQwX1RDUjIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMF9UQ0xLRElWKCkJCWJmaW5fcmVhZDE2KFNQT1JUMF9UQ0xLRElWKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMF9UQ0xLRElWKHZhbCkJCWJmaW5fd3JpdGUxNihTUE9SVDBfVENMS0RJViwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQwX1RGU0RJVigpCQliZmluX3JlYWQxNihTUE9SVDBfVEZTRElWKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMF9URlNESVYodmFsKQkJYmZpbl93cml0ZTE2KFNQT1JUMF9URlNESVYsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMF9UWCgpCQkJYmZpbl9yZWFkMzIoU1BPUlQwX1RYKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMF9UWCh2YWwpCQliZmluX3dyaXRlMzIoU1BPUlQwX1RYLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfUlgoKQkJCWJmaW5fcmVhZDMyKFNQT1JUMF9SWCkKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDBfUlgodmFsKQkJYmZpbl93cml0ZTMyKFNQT1JUMF9SWCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQwX1RYMzIoKQkJCWJmaW5fcmVhZDMyKFNQT1JUMF9UWDMyKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMF9UWDMyKHZhbCkJCWJmaW5fd3JpdGUzMihTUE9SVDBfVFgzMiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQwX1JYMzIoKQkJCWJmaW5fcmVhZDMyKFNQT1JUMF9SWDMyKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMF9SWDMyKHZhbCkJCWJmaW5fd3JpdGUzMihTUE9SVDBfUlgzMiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQwX1RYMTYoKQkJCWJmaW5fcmVhZDE2KFNQT1JUMF9UWDE2KQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMF9UWDE2KHZhbCkJCWJmaW5fd3JpdGUxNihTUE9SVDBfVFgxNiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQwX1JYMTYoKQkJCWJmaW5fcmVhZDE2KFNQT1JUMF9SWDE2KQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMF9SWDE2KHZhbCkJCWJmaW5fd3JpdGUxNihTUE9SVDBfUlgxNiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQwX1JDUjEoKQkJCWJmaW5fcmVhZDE2KFNQT1JUMF9SQ1IxKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMF9SQ1IxKHZhbCkJCWJmaW5fd3JpdGUxNihTUE9SVDBfUkNSMSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQwX1JDUjIoKQkJCWJmaW5fcmVhZDE2KFNQT1JUMF9SQ1IyKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMF9SQ1IyKHZhbCkJCWJmaW5fd3JpdGUxNihTUE9SVDBfUkNSMiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQwX1JDTEtESVYoKQkJYmZpbl9yZWFkMTYoU1BPUlQwX1JDTEtESVYpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX1JDTEtESVYodmFsKQkJYmZpbl93cml0ZTE2KFNQT1JUMF9SQ0xLRElWLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfUkZTRElWKCkJCWJmaW5fcmVhZDE2KFNQT1JUMF9SRlNESVYpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX1JGU0RJVih2YWwpCQliZmluX3dyaXRlMTYoU1BPUlQwX1JGU0RJViwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQwX1NUQVQoKQkJCWJmaW5fcmVhZDE2KFNQT1JUMF9TVEFUKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMF9TVEFUKHZhbCkJCWJmaW5fd3JpdGUxNihTUE9SVDBfU1RBVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQwX0NITkwoKQkJCWJmaW5fcmVhZDE2KFNQT1JUMF9DSE5MKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMF9DSE5MKHZhbCkJCWJmaW5fd3JpdGUxNihTUE9SVDBfQ0hOTCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQwX01DTUMxKCkJCWJmaW5fcmVhZDE2KFNQT1JUMF9NQ01DMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDBfTUNNQzEodmFsKQkJYmZpbl93cml0ZTE2KFNQT1JUMF9NQ01DMSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQwX01DTUMyKCkJCWJmaW5fcmVhZDE2KFNQT1JUMF9NQ01DMikKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDBfTUNNQzIodmFsKQkJYmZpbl93cml0ZTE2KFNQT1JUMF9NQ01DMiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQwX01UQ1MwKCkJCWJmaW5fcmVhZDMyKFNQT1JUMF9NVENTMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDBfTVRDUzAodmFsKQkJYmZpbl93cml0ZTMyKFNQT1JUMF9NVENTMCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQwX01UQ1MxKCkJCWJmaW5fcmVhZDMyKFNQT1JUMF9NVENTMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDBfTVRDUzEodmFsKQkJYmZpbl93cml0ZTMyKFNQT1JUMF9NVENTMSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQwX01UQ1MyKCkJCWJmaW5fcmVhZDMyKFNQT1JUMF9NVENTMikKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDBfTVRDUzIodmFsKQkJYmZpbl93cml0ZTMyKFNQT1JUMF9NVENTMiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQwX01UQ1MzKCkJCWJmaW5fcmVhZDMyKFNQT1JUMF9NVENTMykKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDBfTVRDUzModmFsKQkJYmZpbl93cml0ZTMyKFNQT1JUMF9NVENTMywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQwX01SQ1MwKCkJCWJmaW5fcmVhZDMyKFNQT1JUMF9NUkNTMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDBfTVJDUzAodmFsKQkJYmZpbl93cml0ZTMyKFNQT1JUMF9NUkNTMCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQwX01SQ1MxKCkJCWJmaW5fcmVhZDMyKFNQT1JUMF9NUkNTMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDBfTVJDUzEodmFsKQkJYmZpbl93cml0ZTMyKFNQT1JUMF9NUkNTMSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQwX01SQ1MyKCkJCWJmaW5fcmVhZDMyKFNQT1JUMF9NUkNTMikKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDBfTVJDUzIodmFsKQkJYmZpbl93cml0ZTMyKFNQT1JUMF9NUkNTMiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQwX01SQ1MzKCkJCWJmaW5fcmVhZDMyKFNQT1JUMF9NUkNTMykKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDBfTVJDUzModmFsKQkJYmZpbl93cml0ZTMyKFNQT1JUMF9NUkNTMywgdmFsKQorCisKKy8qIFNQT1JUMSBDb250cm9sbGVyCQkoMHhGRkMwMDkwMCAtIDB4RkZDMDA5RkYpCQkJCQkJCQkqLworI2RlZmluZSBiZmluX3JlYWRfU1BPUlQxX1RDUjEoKQkJCWJmaW5fcmVhZDE2KFNQT1JUMV9UQ1IxKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMV9UQ1IxKHZhbCkJCWJmaW5fd3JpdGUxNihTUE9SVDFfVENSMSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQxX1RDUjIoKQkJCWJmaW5fcmVhZDE2KFNQT1JUMV9UQ1IyKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMV9UQ1IyKHZhbCkJCWJmaW5fd3JpdGUxNihTUE9SVDFfVENSMiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQxX1RDTEtESVYoKQkJYmZpbl9yZWFkMTYoU1BPUlQxX1RDTEtESVYpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX1RDTEtESVYodmFsKQkJYmZpbl93cml0ZTE2KFNQT1JUMV9UQ0xLRElWLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDFfVEZTRElWKCkJCWJmaW5fcmVhZDE2KFNQT1JUMV9URlNESVYpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX1RGU0RJVih2YWwpCQliZmluX3dyaXRlMTYoU1BPUlQxX1RGU0RJViwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQxX1RYKCkJCQliZmluX3JlYWQzMihTUE9SVDFfVFgpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX1RYKHZhbCkJCWJmaW5fd3JpdGUzMihTUE9SVDFfVFgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMV9SWCgpCQkJYmZpbl9yZWFkMzIoU1BPUlQxX1JYKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMV9SWCh2YWwpCQliZmluX3dyaXRlMzIoU1BPUlQxX1JYLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDFfVFgzMigpCQkJYmZpbl9yZWFkMzIoU1BPUlQxX1RYMzIpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX1RYMzIodmFsKQkJYmZpbl93cml0ZTMyKFNQT1JUMV9UWDMyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDFfUlgzMigpCQkJYmZpbl9yZWFkMzIoU1BPUlQxX1JYMzIpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX1JYMzIodmFsKQkJYmZpbl93cml0ZTMyKFNQT1JUMV9SWDMyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDFfVFgxNigpCQkJYmZpbl9yZWFkMTYoU1BPUlQxX1RYMTYpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX1RYMTYodmFsKQkJYmZpbl93cml0ZTE2KFNQT1JUMV9UWDE2LCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDFfUlgxNigpCQkJYmZpbl9yZWFkMTYoU1BPUlQxX1JYMTYpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX1JYMTYodmFsKQkJYmZpbl93cml0ZTE2KFNQT1JUMV9SWDE2LCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDFfUkNSMSgpCQkJYmZpbl9yZWFkMTYoU1BPUlQxX1JDUjEpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX1JDUjEodmFsKQkJYmZpbl93cml0ZTE2KFNQT1JUMV9SQ1IxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDFfUkNSMigpCQkJYmZpbl9yZWFkMTYoU1BPUlQxX1JDUjIpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX1JDUjIodmFsKQkJYmZpbl93cml0ZTE2KFNQT1JUMV9SQ1IyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDFfUkNMS0RJVigpCQliZmluX3JlYWQxNihTUE9SVDFfUkNMS0RJVikKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDFfUkNMS0RJVih2YWwpCQliZmluX3dyaXRlMTYoU1BPUlQxX1JDTEtESVYsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMV9SRlNESVYoKQkJYmZpbl9yZWFkMTYoU1BPUlQxX1JGU0RJVikKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDFfUkZTRElWKHZhbCkJCWJmaW5fd3JpdGUxNihTUE9SVDFfUkZTRElWLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDFfU1RBVCgpCQkJYmZpbl9yZWFkMTYoU1BPUlQxX1NUQVQpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX1NUQVQodmFsKQkJYmZpbl93cml0ZTE2KFNQT1JUMV9TVEFULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDFfQ0hOTCgpCQkJYmZpbl9yZWFkMTYoU1BPUlQxX0NITkwpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX0NITkwodmFsKQkJYmZpbl93cml0ZTE2KFNQT1JUMV9DSE5MLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDFfTUNNQzEoKQkJYmZpbl9yZWFkMTYoU1BPUlQxX01DTUMxKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMV9NQ01DMSh2YWwpCQliZmluX3dyaXRlMTYoU1BPUlQxX01DTUMxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDFfTUNNQzIoKQkJYmZpbl9yZWFkMTYoU1BPUlQxX01DTUMyKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMV9NQ01DMih2YWwpCQliZmluX3dyaXRlMTYoU1BPUlQxX01DTUMyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDFfTVRDUzAoKQkJYmZpbl9yZWFkMzIoU1BPUlQxX01UQ1MwKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMV9NVENTMCh2YWwpCQliZmluX3dyaXRlMzIoU1BPUlQxX01UQ1MwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDFfTVRDUzEoKQkJYmZpbl9yZWFkMzIoU1BPUlQxX01UQ1MxKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMV9NVENTMSh2YWwpCQliZmluX3dyaXRlMzIoU1BPUlQxX01UQ1MxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDFfTVRDUzIoKQkJYmZpbl9yZWFkMzIoU1BPUlQxX01UQ1MyKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMV9NVENTMih2YWwpCQliZmluX3dyaXRlMzIoU1BPUlQxX01UQ1MyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDFfTVRDUzMoKQkJYmZpbl9yZWFkMzIoU1BPUlQxX01UQ1MzKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMV9NVENTMyh2YWwpCQliZmluX3dyaXRlMzIoU1BPUlQxX01UQ1MzLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDFfTVJDUzAoKQkJYmZpbl9yZWFkMzIoU1BPUlQxX01SQ1MwKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMV9NUkNTMCh2YWwpCQliZmluX3dyaXRlMzIoU1BPUlQxX01SQ1MwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDFfTVJDUzEoKQkJYmZpbl9yZWFkMzIoU1BPUlQxX01SQ1MxKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMV9NUkNTMSh2YWwpCQliZmluX3dyaXRlMzIoU1BPUlQxX01SQ1MxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDFfTVJDUzIoKQkJYmZpbl9yZWFkMzIoU1BPUlQxX01SQ1MyKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMV9NUkNTMih2YWwpCQliZmluX3dyaXRlMzIoU1BPUlQxX01SQ1MyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDFfTVJDUzMoKQkJYmZpbl9yZWFkMzIoU1BPUlQxX01SQ1MzKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMV9NUkNTMyh2YWwpCQliZmluX3dyaXRlMzIoU1BPUlQxX01SQ1MzLCB2YWwpCisKKworLyogRXh0ZXJuYWwgQnVzIEludGVyZmFjZSBVbml0ICgweEZGQzAwQTAwIC0gMHhGRkMwMEFGRikJCQkJCQkJKi8KKyNkZWZpbmUgYmZpbl9yZWFkX0VCSVVfQU1HQ1RMKCkJCQliZmluX3JlYWQxNihFQklVX0FNR0NUTCkKKyNkZWZpbmUgYmZpbl93cml0ZV9FQklVX0FNR0NUTCh2YWwpCQliZmluX3dyaXRlMTYoRUJJVV9BTUdDVEwsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VCSVVfQU1CQ1RMMCgpCQliZmluX3JlYWQzMihFQklVX0FNQkNUTDApCisjZGVmaW5lIGJmaW5fd3JpdGVfRUJJVV9BTUJDVEwwKHZhbCkJCWJmaW5fd3JpdGUzMihFQklVX0FNQkNUTDAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VCSVVfQU1CQ1RMMSgpCQliZmluX3JlYWQzMihFQklVX0FNQkNUTDEpCisjZGVmaW5lIGJmaW5fd3JpdGVfRUJJVV9BTUJDVEwxKHZhbCkJCWJmaW5fd3JpdGUzMihFQklVX0FNQkNUTDEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VCSVVfU0RHQ1RMKCkJCQliZmluX3JlYWQzMihFQklVX1NER0NUTCkKKyNkZWZpbmUgYmZpbl93cml0ZV9FQklVX1NER0NUTCh2YWwpCQliZmluX3dyaXRlMzIoRUJJVV9TREdDVEwsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VCSVVfU0RCQ1RMKCkJCQliZmluX3JlYWQxNihFQklVX1NEQkNUTCkKKyNkZWZpbmUgYmZpbl93cml0ZV9FQklVX1NEQkNUTCh2YWwpCQliZmluX3dyaXRlMTYoRUJJVV9TREJDVEwsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VCSVVfU0RSUkMoKQkJCWJmaW5fcmVhZDE2KEVCSVVfU0RSUkMpCisjZGVmaW5lIGJmaW5fd3JpdGVfRUJJVV9TRFJSQyh2YWwpCQliZmluX3dyaXRlMTYoRUJJVV9TRFJSQywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRUJJVV9TRFNUQVQoKQkJCWJmaW5fcmVhZDE2KEVCSVVfU0RTVEFUKQorI2RlZmluZSBiZmluX3dyaXRlX0VCSVVfU0RTVEFUKHZhbCkJCWJmaW5fd3JpdGUxNihFQklVX1NEU1RBVCwgdmFsKQorCisKKy8qIERNQSBUcmFmZmljIENvbnRyb2wgUmVnaXN0ZXJzCQkJCQkJCQkJCQkJCSovCisjZGVmaW5lIGJmaW5fcmVhZF9ETUFfVENfUEVSKCkJCQliZmluX3JlYWQxNihETUFfVENfUEVSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQV9UQ19QRVIodmFsKQkJYmZpbl93cml0ZTE2KERNQV9UQ19QRVIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQV9UQ19DTlQoKQkJCWJmaW5fcmVhZDE2KERNQV9UQ19DTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BX1RDX0NOVCh2YWwpCQliZmluX3dyaXRlMTYoRE1BX1RDX0NOVCwgdmFsKQorCisvKiBBbHRlcm5hdGUgZGVwcmVjYXRlZCByZWdpc3RlciBuYW1lcyAoYmVsb3cpIHByb3ZpZGVkIGZvciBiYWNrd2FyZHMgY29kZSBjb21wYXRpYmlsaXR5ICovCisjZGVmaW5lIGJmaW5fcmVhZF9ETUFfVENQRVIoKQkJCWJmaW5fcmVhZDE2KERNQV9UQ1BFUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUFfVENQRVIodmFsKQkJYmZpbl93cml0ZTE2KERNQV9UQ1BFUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BX1RDQ05UKCkJCQliZmluX3JlYWQxNihETUFfVENDTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BX1RDQ05UKHZhbCkJCWJmaW5fd3JpdGUxNihETUFfVENDTlQsIHZhbCkKKworLyogRE1BIENvbnRyb2xsZXIJCQkJCQkJCQkJCQkJCQkJCSovCisjZGVmaW5lIGJmaW5fcmVhZF9ETUEwX0NPTkZJRygpCQkJYmZpbl9yZWFkMTYoRE1BMF9DT05GSUcpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMF9DT05GSUcodmFsKQkJYmZpbl93cml0ZTE2KERNQTBfQ09ORklHLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUEwX05FWFRfREVTQ19QVFIoKQkJYmZpbl9yZWFkMzIoRE1BMF9ORVhUX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTBfTkVYVF9ERVNDX1BUUih2YWwpCWJmaW5fd3JpdGUzMihETUEwX05FWFRfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTBfU1RBUlRfQUREUigpCQliZmluX3JlYWQzMihETUEwX1NUQVJUX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMF9TVEFSVF9BRERSKHZhbCkJCWJmaW5fd3JpdGUzMihETUEwX1NUQVJUX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTBfWF9DT1VOVCgpCQliZmluX3JlYWQxNihETUEwX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMF9YX0NPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihETUEwX1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTBfWV9DT1VOVCgpCQliZmluX3JlYWQxNihETUEwX1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMF9ZX0NPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihETUEwX1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTBfWF9NT0RJRlkoKQkJYmZpbl9yZWFkMTYoRE1BMF9YX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEwX1hfTU9ESUZZKHZhbCkJCWJmaW5fd3JpdGUxNihETUEwX1hfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUEwX1lfTU9ESUZZKCkJCWJmaW5fcmVhZDE2KERNQTBfWV9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMF9ZX01PRElGWSh2YWwpCQliZmluX3dyaXRlMTYoRE1BMF9ZX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMF9DVVJSX0RFU0NfUFRSKCkJCWJmaW5fcmVhZDMyKERNQTBfQ1VSUl9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEwX0NVUlJfREVTQ19QVFIodmFsKQliZmluX3dyaXRlMzIoRE1BMF9DVVJSX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUEwX0NVUlJfQUREUigpCQliZmluX3JlYWQzMihETUEwX0NVUlJfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEwX0NVUlJfQUREUih2YWwpCQliZmluX3dyaXRlMzIoRE1BMF9DVVJSX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTBfQ1VSUl9YX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTBfQ1VSUl9YX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTBfQ1VSUl9YX0NPVU5UKHZhbCkJYmZpbl93cml0ZTE2KERNQTBfQ1VSUl9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUEwX0NVUlJfWV9DT1VOVCgpCQliZmluX3JlYWQxNihETUEwX0NVUlJfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEwX0NVUlJfWV9DT1VOVCh2YWwpCWJmaW5fd3JpdGUxNihETUEwX0NVUlJfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMF9JUlFfU1RBVFVTKCkJCWJmaW5fcmVhZDE2KERNQTBfSVJRX1NUQVRVUykKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEwX0lSUV9TVEFUVVModmFsKQkJYmZpbl93cml0ZTE2KERNQTBfSVJRX1NUQVRVUywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMF9QRVJJUEhFUkFMX01BUCgpCQliZmluX3JlYWQxNihETUEwX1BFUklQSEVSQUxfTUFQKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTBfUEVSSVBIRVJBTF9NQVAodmFsKQliZmluX3dyaXRlMTYoRE1BMF9QRVJJUEhFUkFMX01BUCwgdmFsKQorCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExX0NPTkZJRygpCQkJYmZpbl9yZWFkMTYoRE1BMV9DT05GSUcpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMV9DT05GSUcodmFsKQkJYmZpbl93cml0ZTE2KERNQTFfQ09ORklHLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExX05FWFRfREVTQ19QVFIoKQkJYmZpbl9yZWFkMzIoRE1BMV9ORVhUX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTFfTkVYVF9ERVNDX1BUUih2YWwpCWJmaW5fd3JpdGUzMihETUExX05FWFRfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTFfU1RBUlRfQUREUigpCQliZmluX3JlYWQzMihETUExX1NUQVJUX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMV9TVEFSVF9BRERSKHZhbCkJCWJmaW5fd3JpdGUzMihETUExX1NUQVJUX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTFfWF9DT1VOVCgpCQliZmluX3JlYWQxNihETUExX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMV9YX0NPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihETUExX1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTFfWV9DT1VOVCgpCQliZmluX3JlYWQxNihETUExX1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMV9ZX0NPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihETUExX1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTFfWF9NT0RJRlkoKQkJYmZpbl9yZWFkMTYoRE1BMV9YX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExX1hfTU9ESUZZKHZhbCkJCWJmaW5fd3JpdGUxNihETUExX1hfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExX1lfTU9ESUZZKCkJCWJmaW5fcmVhZDE2KERNQTFfWV9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMV9ZX01PRElGWSh2YWwpCQliZmluX3dyaXRlMTYoRE1BMV9ZX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMV9DVVJSX0RFU0NfUFRSKCkJCWJmaW5fcmVhZDMyKERNQTFfQ1VSUl9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExX0NVUlJfREVTQ19QVFIodmFsKQliZmluX3dyaXRlMzIoRE1BMV9DVVJSX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExX0NVUlJfQUREUigpCQliZmluX3JlYWQzMihETUExX0NVUlJfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExX0NVUlJfQUREUih2YWwpCQliZmluX3dyaXRlMzIoRE1BMV9DVVJSX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTFfQ1VSUl9YX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTFfQ1VSUl9YX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTFfQ1VSUl9YX0NPVU5UKHZhbCkJYmZpbl93cml0ZTE2KERNQTFfQ1VSUl9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExX0NVUlJfWV9DT1VOVCgpCQliZmluX3JlYWQxNihETUExX0NVUlJfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExX0NVUlJfWV9DT1VOVCh2YWwpCWJmaW5fd3JpdGUxNihETUExX0NVUlJfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMV9JUlFfU1RBVFVTKCkJCWJmaW5fcmVhZDE2KERNQTFfSVJRX1NUQVRVUykKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExX0lSUV9TVEFUVVModmFsKQkJYmZpbl93cml0ZTE2KERNQTFfSVJRX1NUQVRVUywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMV9QRVJJUEhFUkFMX01BUCgpCQliZmluX3JlYWQxNihETUExX1BFUklQSEVSQUxfTUFQKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTFfUEVSSVBIRVJBTF9NQVAodmFsKQliZmluX3dyaXRlMTYoRE1BMV9QRVJJUEhFUkFMX01BUCwgdmFsKQorCisjZGVmaW5lIGJmaW5fcmVhZF9ETUEyX0NPTkZJRygpCQkJYmZpbl9yZWFkMTYoRE1BMl9DT05GSUcpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMl9DT05GSUcodmFsKQkJYmZpbl93cml0ZTE2KERNQTJfQ09ORklHLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUEyX05FWFRfREVTQ19QVFIoKQkJYmZpbl9yZWFkMzIoRE1BMl9ORVhUX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTJfTkVYVF9ERVNDX1BUUih2YWwpCWJmaW5fd3JpdGUzMihETUEyX05FWFRfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTJfU1RBUlRfQUREUigpCQliZmluX3JlYWQzMihETUEyX1NUQVJUX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMl9TVEFSVF9BRERSKHZhbCkJCWJmaW5fd3JpdGUzMihETUEyX1NUQVJUX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTJfWF9DT1VOVCgpCQliZmluX3JlYWQxNihETUEyX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMl9YX0NPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihETUEyX1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTJfWV9DT1VOVCgpCQliZmluX3JlYWQxNihETUEyX1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMl9ZX0NPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihETUEyX1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTJfWF9NT0RJRlkoKQkJYmZpbl9yZWFkMTYoRE1BMl9YX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEyX1hfTU9ESUZZKHZhbCkJCWJmaW5fd3JpdGUxNihETUEyX1hfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUEyX1lfTU9ESUZZKCkJCWJmaW5fcmVhZDE2KERNQTJfWV9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMl9ZX01PRElGWSh2YWwpCQliZmluX3dyaXRlMTYoRE1BMl9ZX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMl9DVVJSX0RFU0NfUFRSKCkJCWJmaW5fcmVhZDMyKERNQTJfQ1VSUl9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEyX0NVUlJfREVTQ19QVFIodmFsKQliZmluX3dyaXRlMzIoRE1BMl9DVVJSX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUEyX0NVUlJfQUREUigpCQliZmluX3JlYWQzMihETUEyX0NVUlJfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEyX0NVUlJfQUREUih2YWwpCQliZmluX3dyaXRlMzIoRE1BMl9DVVJSX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTJfQ1VSUl9YX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTJfQ1VSUl9YX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTJfQ1VSUl9YX0NPVU5UKHZhbCkJYmZpbl93cml0ZTE2KERNQTJfQ1VSUl9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUEyX0NVUlJfWV9DT1VOVCgpCQliZmluX3JlYWQxNihETUEyX0NVUlJfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEyX0NVUlJfWV9DT1VOVCh2YWwpCWJmaW5fd3JpdGUxNihETUEyX0NVUlJfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMl9JUlFfU1RBVFVTKCkJCWJmaW5fcmVhZDE2KERNQTJfSVJRX1NUQVRVUykKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEyX0lSUV9TVEFUVVModmFsKQkJYmZpbl93cml0ZTE2KERNQTJfSVJRX1NUQVRVUywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMl9QRVJJUEhFUkFMX01BUCgpCQliZmluX3JlYWQxNihETUEyX1BFUklQSEVSQUxfTUFQKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTJfUEVSSVBIRVJBTF9NQVAodmFsKQliZmluX3dyaXRlMTYoRE1BMl9QRVJJUEhFUkFMX01BUCwgdmFsKQorCisjZGVmaW5lIGJmaW5fcmVhZF9ETUEzX0NPTkZJRygpCQkJYmZpbl9yZWFkMTYoRE1BM19DT05GSUcpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BM19DT05GSUcodmFsKQkJYmZpbl93cml0ZTE2KERNQTNfQ09ORklHLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUEzX05FWFRfREVTQ19QVFIoKQkJYmZpbl9yZWFkMzIoRE1BM19ORVhUX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTNfTkVYVF9ERVNDX1BUUih2YWwpCWJmaW5fd3JpdGUzMihETUEzX05FWFRfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTNfU1RBUlRfQUREUigpCQliZmluX3JlYWQzMihETUEzX1NUQVJUX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BM19TVEFSVF9BRERSKHZhbCkJCWJmaW5fd3JpdGUzMihETUEzX1NUQVJUX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTNfWF9DT1VOVCgpCQliZmluX3JlYWQxNihETUEzX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BM19YX0NPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihETUEzX1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTNfWV9DT1VOVCgpCQliZmluX3JlYWQxNihETUEzX1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BM19ZX0NPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihETUEzX1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTNfWF9NT0RJRlkoKQkJYmZpbl9yZWFkMTYoRE1BM19YX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEzX1hfTU9ESUZZKHZhbCkJCWJmaW5fd3JpdGUxNihETUEzX1hfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUEzX1lfTU9ESUZZKCkJCWJmaW5fcmVhZDE2KERNQTNfWV9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BM19ZX01PRElGWSh2YWwpCQliZmluX3dyaXRlMTYoRE1BM19ZX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BM19DVVJSX0RFU0NfUFRSKCkJCWJmaW5fcmVhZDMyKERNQTNfQ1VSUl9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEzX0NVUlJfREVTQ19QVFIodmFsKQliZmluX3dyaXRlMzIoRE1BM19DVVJSX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUEzX0NVUlJfQUREUigpCQliZmluX3JlYWQzMihETUEzX0NVUlJfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEzX0NVUlJfQUREUih2YWwpCQliZmluX3dyaXRlMzIoRE1BM19DVVJSX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTNfQ1VSUl9YX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTNfQ1VSUl9YX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTNfQ1VSUl9YX0NPVU5UKHZhbCkJYmZpbl93cml0ZTE2KERNQTNfQ1VSUl9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUEzX0NVUlJfWV9DT1VOVCgpCQliZmluX3JlYWQxNihETUEzX0NVUlJfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEzX0NVUlJfWV9DT1VOVCh2YWwpCWJmaW5fd3JpdGUxNihETUEzX0NVUlJfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BM19JUlFfU1RBVFVTKCkJCWJmaW5fcmVhZDE2KERNQTNfSVJRX1NUQVRVUykKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEzX0lSUV9TVEFUVVModmFsKQkJYmZpbl93cml0ZTE2KERNQTNfSVJRX1NUQVRVUywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BM19QRVJJUEhFUkFMX01BUCgpCQliZmluX3JlYWQxNihETUEzX1BFUklQSEVSQUxfTUFQKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTNfUEVSSVBIRVJBTF9NQVAodmFsKQliZmluX3dyaXRlMTYoRE1BM19QRVJJUEhFUkFMX01BUCwgdmFsKQorCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE0X0NPTkZJRygpCQkJYmZpbl9yZWFkMTYoRE1BNF9DT05GSUcpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BNF9DT05GSUcodmFsKQkJYmZpbl93cml0ZTE2KERNQTRfQ09ORklHLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE0X05FWFRfREVTQ19QVFIoKQkJYmZpbl9yZWFkMzIoRE1BNF9ORVhUX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTRfTkVYVF9ERVNDX1BUUih2YWwpCWJmaW5fd3JpdGUzMihETUE0X05FWFRfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTRfU1RBUlRfQUREUigpCQliZmluX3JlYWQzMihETUE0X1NUQVJUX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BNF9TVEFSVF9BRERSKHZhbCkJCWJmaW5fd3JpdGUzMihETUE0X1NUQVJUX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTRfWF9DT1VOVCgpCQliZmluX3JlYWQxNihETUE0X1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BNF9YX0NPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihETUE0X1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTRfWV9DT1VOVCgpCQliZmluX3JlYWQxNihETUE0X1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BNF9ZX0NPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihETUE0X1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTRfWF9NT0RJRlkoKQkJYmZpbl9yZWFkMTYoRE1BNF9YX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE0X1hfTU9ESUZZKHZhbCkJCWJmaW5fd3JpdGUxNihETUE0X1hfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE0X1lfTU9ESUZZKCkJCWJmaW5fcmVhZDE2KERNQTRfWV9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BNF9ZX01PRElGWSh2YWwpCQliZmluX3dyaXRlMTYoRE1BNF9ZX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BNF9DVVJSX0RFU0NfUFRSKCkJCWJmaW5fcmVhZDMyKERNQTRfQ1VSUl9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE0X0NVUlJfREVTQ19QVFIodmFsKQliZmluX3dyaXRlMzIoRE1BNF9DVVJSX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE0X0NVUlJfQUREUigpCQliZmluX3JlYWQzMihETUE0X0NVUlJfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE0X0NVUlJfQUREUih2YWwpCQliZmluX3dyaXRlMzIoRE1BNF9DVVJSX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTRfQ1VSUl9YX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTRfQ1VSUl9YX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTRfQ1VSUl9YX0NPVU5UKHZhbCkJYmZpbl93cml0ZTE2KERNQTRfQ1VSUl9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE0X0NVUlJfWV9DT1VOVCgpCQliZmluX3JlYWQxNihETUE0X0NVUlJfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE0X0NVUlJfWV9DT1VOVCh2YWwpCWJmaW5fd3JpdGUxNihETUE0X0NVUlJfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BNF9JUlFfU1RBVFVTKCkJCWJmaW5fcmVhZDE2KERNQTRfSVJRX1NUQVRVUykKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE0X0lSUV9TVEFUVVModmFsKQkJYmZpbl93cml0ZTE2KERNQTRfSVJRX1NUQVRVUywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BNF9QRVJJUEhFUkFMX01BUCgpCQliZmluX3JlYWQxNihETUE0X1BFUklQSEVSQUxfTUFQKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTRfUEVSSVBIRVJBTF9NQVAodmFsKQliZmluX3dyaXRlMTYoRE1BNF9QRVJJUEhFUkFMX01BUCwgdmFsKQorCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE1X0NPTkZJRygpCQkJYmZpbl9yZWFkMTYoRE1BNV9DT05GSUcpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BNV9DT05GSUcodmFsKQkJYmZpbl93cml0ZTE2KERNQTVfQ09ORklHLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE1X05FWFRfREVTQ19QVFIoKQkJYmZpbl9yZWFkMzIoRE1BNV9ORVhUX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTVfTkVYVF9ERVNDX1BUUih2YWwpCWJmaW5fd3JpdGUzMihETUE1X05FWFRfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTVfU1RBUlRfQUREUigpCQliZmluX3JlYWQzMihETUE1X1NUQVJUX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BNV9TVEFSVF9BRERSKHZhbCkJCWJmaW5fd3JpdGUzMihETUE1X1NUQVJUX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTVfWF9DT1VOVCgpCQliZmluX3JlYWQxNihETUE1X1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BNV9YX0NPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihETUE1X1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTVfWV9DT1VOVCgpCQliZmluX3JlYWQxNihETUE1X1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BNV9ZX0NPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihETUE1X1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTVfWF9NT0RJRlkoKQkJYmZpbl9yZWFkMTYoRE1BNV9YX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE1X1hfTU9ESUZZKHZhbCkJCWJmaW5fd3JpdGUxNihETUE1X1hfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE1X1lfTU9ESUZZKCkJCWJmaW5fcmVhZDE2KERNQTVfWV9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BNV9ZX01PRElGWSh2YWwpCQliZmluX3dyaXRlMTYoRE1BNV9ZX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BNV9DVVJSX0RFU0NfUFRSKCkJCWJmaW5fcmVhZDMyKERNQTVfQ1VSUl9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE1X0NVUlJfREVTQ19QVFIodmFsKQliZmluX3dyaXRlMzIoRE1BNV9DVVJSX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE1X0NVUlJfQUREUigpCQliZmluX3JlYWQzMihETUE1X0NVUlJfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE1X0NVUlJfQUREUih2YWwpCQliZmluX3dyaXRlMzIoRE1BNV9DVVJSX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTVfQ1VSUl9YX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTVfQ1VSUl9YX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTVfQ1VSUl9YX0NPVU5UKHZhbCkJYmZpbl93cml0ZTE2KERNQTVfQ1VSUl9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE1X0NVUlJfWV9DT1VOVCgpCQliZmluX3JlYWQxNihETUE1X0NVUlJfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE1X0NVUlJfWV9DT1VOVCh2YWwpCWJmaW5fd3JpdGUxNihETUE1X0NVUlJfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BNV9JUlFfU1RBVFVTKCkJCWJmaW5fcmVhZDE2KERNQTVfSVJRX1NUQVRVUykKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE1X0lSUV9TVEFUVVModmFsKQkJYmZpbl93cml0ZTE2KERNQTVfSVJRX1NUQVRVUywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BNV9QRVJJUEhFUkFMX01BUCgpCQliZmluX3JlYWQxNihETUE1X1BFUklQSEVSQUxfTUFQKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTVfUEVSSVBIRVJBTF9NQVAodmFsKQliZmluX3dyaXRlMTYoRE1BNV9QRVJJUEhFUkFMX01BUCwgdmFsKQorCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE2X0NPTkZJRygpCQkJYmZpbl9yZWFkMTYoRE1BNl9DT05GSUcpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BNl9DT05GSUcodmFsKQkJYmZpbl93cml0ZTE2KERNQTZfQ09ORklHLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE2X05FWFRfREVTQ19QVFIoKQkJYmZpbl9yZWFkMzIoRE1BNl9ORVhUX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTZfTkVYVF9ERVNDX1BUUih2YWwpCWJmaW5fd3JpdGUzMihETUE2X05FWFRfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTZfU1RBUlRfQUREUigpCQliZmluX3JlYWQzMihETUE2X1NUQVJUX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BNl9TVEFSVF9BRERSKHZhbCkJCWJmaW5fd3JpdGUzMihETUE2X1NUQVJUX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTZfWF9DT1VOVCgpCQliZmluX3JlYWQxNihETUE2X1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BNl9YX0NPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihETUE2X1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTZfWV9DT1VOVCgpCQliZmluX3JlYWQxNihETUE2X1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BNl9ZX0NPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihETUE2X1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTZfWF9NT0RJRlkoKQkJYmZpbl9yZWFkMTYoRE1BNl9YX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE2X1hfTU9ESUZZKHZhbCkJCWJmaW5fd3JpdGUxNihETUE2X1hfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE2X1lfTU9ESUZZKCkJCWJmaW5fcmVhZDE2KERNQTZfWV9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BNl9ZX01PRElGWSh2YWwpCQliZmluX3dyaXRlMTYoRE1BNl9ZX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BNl9DVVJSX0RFU0NfUFRSKCkJCWJmaW5fcmVhZDMyKERNQTZfQ1VSUl9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE2X0NVUlJfREVTQ19QVFIodmFsKQliZmluX3dyaXRlMzIoRE1BNl9DVVJSX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE2X0NVUlJfQUREUigpCQliZmluX3JlYWQzMihETUE2X0NVUlJfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE2X0NVUlJfQUREUih2YWwpCQliZmluX3dyaXRlMzIoRE1BNl9DVVJSX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTZfQ1VSUl9YX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTZfQ1VSUl9YX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTZfQ1VSUl9YX0NPVU5UKHZhbCkJYmZpbl93cml0ZTE2KERNQTZfQ1VSUl9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE2X0NVUlJfWV9DT1VOVCgpCQliZmluX3JlYWQxNihETUE2X0NVUlJfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE2X0NVUlJfWV9DT1VOVCh2YWwpCWJmaW5fd3JpdGUxNihETUE2X0NVUlJfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BNl9JUlFfU1RBVFVTKCkJCWJmaW5fcmVhZDE2KERNQTZfSVJRX1NUQVRVUykKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE2X0lSUV9TVEFUVVModmFsKQkJYmZpbl93cml0ZTE2KERNQTZfSVJRX1NUQVRVUywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BNl9QRVJJUEhFUkFMX01BUCgpCQliZmluX3JlYWQxNihETUE2X1BFUklQSEVSQUxfTUFQKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTZfUEVSSVBIRVJBTF9NQVAodmFsKQliZmluX3dyaXRlMTYoRE1BNl9QRVJJUEhFUkFMX01BUCwgdmFsKQorCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE3X0NPTkZJRygpCQkJYmZpbl9yZWFkMTYoRE1BN19DT05GSUcpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BN19DT05GSUcodmFsKQkJYmZpbl93cml0ZTE2KERNQTdfQ09ORklHLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE3X05FWFRfREVTQ19QVFIoKQkJYmZpbl9yZWFkMzIoRE1BN19ORVhUX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTdfTkVYVF9ERVNDX1BUUih2YWwpCWJmaW5fd3JpdGUzMihETUE3X05FWFRfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTdfU1RBUlRfQUREUigpCQliZmluX3JlYWQzMihETUE3X1NUQVJUX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BN19TVEFSVF9BRERSKHZhbCkJCWJmaW5fd3JpdGUzMihETUE3X1NUQVJUX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTdfWF9DT1VOVCgpCQliZmluX3JlYWQxNihETUE3X1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BN19YX0NPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihETUE3X1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTdfWV9DT1VOVCgpCQliZmluX3JlYWQxNihETUE3X1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BN19ZX0NPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihETUE3X1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTdfWF9NT0RJRlkoKQkJYmZpbl9yZWFkMTYoRE1BN19YX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE3X1hfTU9ESUZZKHZhbCkJCWJmaW5fd3JpdGUxNihETUE3X1hfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE3X1lfTU9ESUZZKCkJCWJmaW5fcmVhZDE2KERNQTdfWV9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BN19ZX01PRElGWSh2YWwpCQliZmluX3dyaXRlMTYoRE1BN19ZX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BN19DVVJSX0RFU0NfUFRSKCkJCWJmaW5fcmVhZDMyKERNQTdfQ1VSUl9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE3X0NVUlJfREVTQ19QVFIodmFsKQliZmluX3dyaXRlMzIoRE1BN19DVVJSX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE3X0NVUlJfQUREUigpCQliZmluX3JlYWQzMihETUE3X0NVUlJfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE3X0NVUlJfQUREUih2YWwpCQliZmluX3dyaXRlMzIoRE1BN19DVVJSX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTdfQ1VSUl9YX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTdfQ1VSUl9YX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTdfQ1VSUl9YX0NPVU5UKHZhbCkJYmZpbl93cml0ZTE2KERNQTdfQ1VSUl9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE3X0NVUlJfWV9DT1VOVCgpCQliZmluX3JlYWQxNihETUE3X0NVUlJfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE3X0NVUlJfWV9DT1VOVCh2YWwpCWJmaW5fd3JpdGUxNihETUE3X0NVUlJfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BN19JUlFfU1RBVFVTKCkJCWJmaW5fcmVhZDE2KERNQTdfSVJRX1NUQVRVUykKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE3X0lSUV9TVEFUVVModmFsKQkJYmZpbl93cml0ZTE2KERNQTdfSVJRX1NUQVRVUywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BN19QRVJJUEhFUkFMX01BUCgpCQliZmluX3JlYWQxNihETUE3X1BFUklQSEVSQUxfTUFQKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTdfUEVSSVBIRVJBTF9NQVAodmFsKQliZmluX3dyaXRlMTYoRE1BN19QRVJJUEhFUkFMX01BUCwgdmFsKQorCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE4X0NPTkZJRygpCQkJYmZpbl9yZWFkMTYoRE1BOF9DT05GSUcpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BOF9DT05GSUcodmFsKQkJYmZpbl93cml0ZTE2KERNQThfQ09ORklHLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE4X05FWFRfREVTQ19QVFIoKQkJYmZpbl9yZWFkMzIoRE1BOF9ORVhUX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQThfTkVYVF9ERVNDX1BUUih2YWwpCWJmaW5fd3JpdGUzMihETUE4X05FWFRfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQThfU1RBUlRfQUREUigpCQliZmluX3JlYWQzMihETUE4X1NUQVJUX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BOF9TVEFSVF9BRERSKHZhbCkJCWJmaW5fd3JpdGUzMihETUE4X1NUQVJUX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQThfWF9DT1VOVCgpCQliZmluX3JlYWQxNihETUE4X1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BOF9YX0NPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihETUE4X1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQThfWV9DT1VOVCgpCQliZmluX3JlYWQxNihETUE4X1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BOF9ZX0NPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihETUE4X1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQThfWF9NT0RJRlkoKQkJYmZpbl9yZWFkMTYoRE1BOF9YX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE4X1hfTU9ESUZZKHZhbCkJCWJmaW5fd3JpdGUxNihETUE4X1hfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE4X1lfTU9ESUZZKCkJCWJmaW5fcmVhZDE2KERNQThfWV9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BOF9ZX01PRElGWSh2YWwpCQliZmluX3dyaXRlMTYoRE1BOF9ZX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BOF9DVVJSX0RFU0NfUFRSKCkJCWJmaW5fcmVhZDMyKERNQThfQ1VSUl9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE4X0NVUlJfREVTQ19QVFIodmFsKQliZmluX3dyaXRlMzIoRE1BOF9DVVJSX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE4X0NVUlJfQUREUigpCQliZmluX3JlYWQzMihETUE4X0NVUlJfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE4X0NVUlJfQUREUih2YWwpCQliZmluX3dyaXRlMzIoRE1BOF9DVVJSX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQThfQ1VSUl9YX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQThfQ1VSUl9YX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQThfQ1VSUl9YX0NPVU5UKHZhbCkJYmZpbl93cml0ZTE2KERNQThfQ1VSUl9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE4X0NVUlJfWV9DT1VOVCgpCQliZmluX3JlYWQxNihETUE4X0NVUlJfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE4X0NVUlJfWV9DT1VOVCh2YWwpCWJmaW5fd3JpdGUxNihETUE4X0NVUlJfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BOF9JUlFfU1RBVFVTKCkJCWJmaW5fcmVhZDE2KERNQThfSVJRX1NUQVRVUykKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE4X0lSUV9TVEFUVVModmFsKQkJYmZpbl93cml0ZTE2KERNQThfSVJRX1NUQVRVUywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BOF9QRVJJUEhFUkFMX01BUCgpCQliZmluX3JlYWQxNihETUE4X1BFUklQSEVSQUxfTUFQKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQThfUEVSSVBIRVJBTF9NQVAodmFsKQliZmluX3dyaXRlMTYoRE1BOF9QRVJJUEhFUkFMX01BUCwgdmFsKQorCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE5X0NPTkZJRygpCQkJYmZpbl9yZWFkMTYoRE1BOV9DT05GSUcpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BOV9DT05GSUcodmFsKQkJYmZpbl93cml0ZTE2KERNQTlfQ09ORklHLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE5X05FWFRfREVTQ19QVFIoKQkJYmZpbl9yZWFkMzIoRE1BOV9ORVhUX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTlfTkVYVF9ERVNDX1BUUih2YWwpCWJmaW5fd3JpdGUzMihETUE5X05FWFRfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTlfU1RBUlRfQUREUigpCQliZmluX3JlYWQzMihETUE5X1NUQVJUX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BOV9TVEFSVF9BRERSKHZhbCkJCWJmaW5fd3JpdGUzMihETUE5X1NUQVJUX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTlfWF9DT1VOVCgpCQliZmluX3JlYWQxNihETUE5X1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BOV9YX0NPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihETUE5X1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTlfWV9DT1VOVCgpCQliZmluX3JlYWQxNihETUE5X1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BOV9ZX0NPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihETUE5X1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTlfWF9NT0RJRlkoKQkJYmZpbl9yZWFkMTYoRE1BOV9YX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE5X1hfTU9ESUZZKHZhbCkJCWJmaW5fd3JpdGUxNihETUE5X1hfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE5X1lfTU9ESUZZKCkJCWJmaW5fcmVhZDE2KERNQTlfWV9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BOV9ZX01PRElGWSh2YWwpCQliZmluX3dyaXRlMTYoRE1BOV9ZX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BOV9DVVJSX0RFU0NfUFRSKCkJCWJmaW5fcmVhZDMyKERNQTlfQ1VSUl9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE5X0NVUlJfREVTQ19QVFIodmFsKQliZmluX3dyaXRlMzIoRE1BOV9DVVJSX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE5X0NVUlJfQUREUigpCQliZmluX3JlYWQzMihETUE5X0NVUlJfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE5X0NVUlJfQUREUih2YWwpCQliZmluX3dyaXRlMzIoRE1BOV9DVVJSX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTlfQ1VSUl9YX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTlfQ1VSUl9YX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTlfQ1VSUl9YX0NPVU5UKHZhbCkJYmZpbl93cml0ZTE2KERNQTlfQ1VSUl9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE5X0NVUlJfWV9DT1VOVCgpCQliZmluX3JlYWQxNihETUE5X0NVUlJfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE5X0NVUlJfWV9DT1VOVCh2YWwpCWJmaW5fd3JpdGUxNihETUE5X0NVUlJfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BOV9JUlFfU1RBVFVTKCkJCWJmaW5fcmVhZDE2KERNQTlfSVJRX1NUQVRVUykKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE5X0lSUV9TVEFUVVModmFsKQkJYmZpbl93cml0ZTE2KERNQTlfSVJRX1NUQVRVUywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BOV9QRVJJUEhFUkFMX01BUCgpCQliZmluX3JlYWQxNihETUE5X1BFUklQSEVSQUxfTUFQKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTlfUEVSSVBIRVJBTF9NQVAodmFsKQliZmluX3dyaXRlMTYoRE1BOV9QRVJJUEhFUkFMX01BUCwgdmFsKQorCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExMF9DT05GSUcoKQkJYmZpbl9yZWFkMTYoRE1BMTBfQ09ORklHKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTEwX0NPTkZJRyh2YWwpCQliZmluX3dyaXRlMTYoRE1BMTBfQ09ORklHLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExMF9ORVhUX0RFU0NfUFRSKCkJCWJmaW5fcmVhZDMyKERNQTEwX05FWFRfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTBfTkVYVF9ERVNDX1BUUih2YWwpCWJmaW5fd3JpdGUzMihETUExMF9ORVhUX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExMF9TVEFSVF9BRERSKCkJCWJmaW5fcmVhZDMyKERNQTEwX1NUQVJUX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTBfU1RBUlRfQUREUih2YWwpCWJmaW5fd3JpdGUzMihETUExMF9TVEFSVF9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExMF9YX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTEwX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTBfWF9DT1VOVCh2YWwpCQliZmluX3dyaXRlMTYoRE1BMTBfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTBfWV9DT1VOVCgpCQliZmluX3JlYWQxNihETUExMF9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTEwX1lfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KERNQTEwX1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTEwX1hfTU9ESUZZKCkJCWJmaW5fcmVhZDE2KERNQTEwX1hfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTEwX1hfTU9ESUZZKHZhbCkJCWJmaW5fd3JpdGUxNihETUExMF9YX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTBfWV9NT0RJRlkoKQkJYmZpbl9yZWFkMTYoRE1BMTBfWV9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTBfWV9NT0RJRlkodmFsKQkJYmZpbl93cml0ZTE2KERNQTEwX1lfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExMF9DVVJSX0RFU0NfUFRSKCkJCWJmaW5fcmVhZDMyKERNQTEwX0NVUlJfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTBfQ1VSUl9ERVNDX1BUUih2YWwpCWJmaW5fd3JpdGUzMihETUExMF9DVVJSX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExMF9DVVJSX0FERFIoKQkJYmZpbl9yZWFkMzIoRE1BMTBfQ1VSUl9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTEwX0NVUlJfQUREUih2YWwpCQliZmluX3dyaXRlMzIoRE1BMTBfQ1VSUl9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExMF9DVVJSX1hfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BMTBfQ1VSUl9YX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTEwX0NVUlJfWF9DT1VOVCh2YWwpCWJmaW5fd3JpdGUxNihETUExMF9DVVJSX1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTEwX0NVUlJfWV9DT1VOVCgpCQliZmluX3JlYWQxNihETUExMF9DVVJSX1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTBfQ1VSUl9ZX0NPVU5UKHZhbCkJYmZpbl93cml0ZTE2KERNQTEwX0NVUlJfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTBfSVJRX1NUQVRVUygpCQliZmluX3JlYWQxNihETUExMF9JUlFfU1RBVFVTKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTEwX0lSUV9TVEFUVVModmFsKQliZmluX3dyaXRlMTYoRE1BMTBfSVJRX1NUQVRVUywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTBfUEVSSVBIRVJBTF9NQVAoKQliZmluX3JlYWQxNihETUExMF9QRVJJUEhFUkFMX01BUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExMF9QRVJJUEhFUkFMX01BUCh2YWwpCWJmaW5fd3JpdGUxNihETUExMF9QRVJJUEhFUkFMX01BUCwgdmFsKQorCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExMV9DT05GSUcoKQkJYmZpbl9yZWFkMTYoRE1BMTFfQ09ORklHKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTExX0NPTkZJRyh2YWwpCQliZmluX3dyaXRlMTYoRE1BMTFfQ09ORklHLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExMV9ORVhUX0RFU0NfUFRSKCkJCWJmaW5fcmVhZDMyKERNQTExX05FWFRfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTFfTkVYVF9ERVNDX1BUUih2YWwpCWJmaW5fd3JpdGUzMihETUExMV9ORVhUX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExMV9TVEFSVF9BRERSKCkJCWJmaW5fcmVhZDMyKERNQTExX1NUQVJUX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTFfU1RBUlRfQUREUih2YWwpCWJmaW5fd3JpdGUzMihETUExMV9TVEFSVF9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExMV9YX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTExX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTFfWF9DT1VOVCh2YWwpCQliZmluX3dyaXRlMTYoRE1BMTFfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTFfWV9DT1VOVCgpCQliZmluX3JlYWQxNihETUExMV9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTExX1lfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KERNQTExX1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTExX1hfTU9ESUZZKCkJCWJmaW5fcmVhZDE2KERNQTExX1hfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTExX1hfTU9ESUZZKHZhbCkJCWJmaW5fd3JpdGUxNihETUExMV9YX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTFfWV9NT0RJRlkoKQkJYmZpbl9yZWFkMTYoRE1BMTFfWV9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTFfWV9NT0RJRlkodmFsKQkJYmZpbl93cml0ZTE2KERNQTExX1lfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExMV9DVVJSX0RFU0NfUFRSKCkJCWJmaW5fcmVhZDMyKERNQTExX0NVUlJfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTFfQ1VSUl9ERVNDX1BUUih2YWwpCWJmaW5fd3JpdGUzMihETUExMV9DVVJSX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExMV9DVVJSX0FERFIoKQkJYmZpbl9yZWFkMzIoRE1BMTFfQ1VSUl9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTExX0NVUlJfQUREUih2YWwpCQliZmluX3dyaXRlMzIoRE1BMTFfQ1VSUl9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExMV9DVVJSX1hfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BMTFfQ1VSUl9YX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTExX0NVUlJfWF9DT1VOVCh2YWwpCWJmaW5fd3JpdGUxNihETUExMV9DVVJSX1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTExX0NVUlJfWV9DT1VOVCgpCQliZmluX3JlYWQxNihETUExMV9DVVJSX1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTFfQ1VSUl9ZX0NPVU5UKHZhbCkJYmZpbl93cml0ZTE2KERNQTExX0NVUlJfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTFfSVJRX1NUQVRVUygpCQliZmluX3JlYWQxNihETUExMV9JUlFfU1RBVFVTKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTExX0lSUV9TVEFUVVModmFsKQliZmluX3dyaXRlMTYoRE1BMTFfSVJRX1NUQVRVUywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTFfUEVSSVBIRVJBTF9NQVAoKQliZmluX3JlYWQxNihETUExMV9QRVJJUEhFUkFMX01BUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExMV9QRVJJUEhFUkFMX01BUCh2YWwpCWJmaW5fd3JpdGUxNihETUExMV9QRVJJUEhFUkFMX01BUCwgdmFsKQorCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QwX0NPTkZJRygpCQliZmluX3JlYWQxNihNRE1BX0QwX0NPTkZJRykKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QwX0NPTkZJRyh2YWwpCQliZmluX3dyaXRlMTYoTURNQV9EMF9DT05GSUcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDBfTkVYVF9ERVNDX1BUUigpCWJmaW5fcmVhZDMyKE1ETUFfRDBfTkVYVF9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QwX05FWFRfREVTQ19QVFIodmFsKQliZmluX3dyaXRlMzIoTURNQV9EMF9ORVhUX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QwX1NUQVJUX0FERFIoKQkJYmZpbl9yZWFkMzIoTURNQV9EMF9TVEFSVF9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDBfU1RBUlRfQUREUih2YWwpCWJmaW5fd3JpdGUzMihNRE1BX0QwX1NUQVJUX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDBfWF9DT1VOVCgpCQliZmluX3JlYWQxNihNRE1BX0QwX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMF9YX0NPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihNRE1BX0QwX1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDBfWV9DT1VOVCgpCQliZmluX3JlYWQxNihNRE1BX0QwX1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMF9ZX0NPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihNRE1BX0QwX1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDBfWF9NT0RJRlkoKQkJYmZpbl9yZWFkMTYoTURNQV9EMF9YX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QwX1hfTU9ESUZZKHZhbCkJYmZpbl93cml0ZTE2KE1ETUFfRDBfWF9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDBfWV9NT0RJRlkoKQkJYmZpbl9yZWFkMTYoTURNQV9EMF9ZX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QwX1lfTU9ESUZZKHZhbCkJYmZpbl93cml0ZTE2KE1ETUFfRDBfWV9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDBfQ1VSUl9ERVNDX1BUUigpCWJmaW5fcmVhZDMyKE1ETUFfRDBfQ1VSUl9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QwX0NVUlJfREVTQ19QVFIodmFsKQliZmluX3dyaXRlMzIoTURNQV9EMF9DVVJSX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QwX0NVUlJfQUREUigpCQliZmluX3JlYWQzMihNRE1BX0QwX0NVUlJfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QwX0NVUlJfQUREUih2YWwpCWJmaW5fd3JpdGUzMihNRE1BX0QwX0NVUlJfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMF9DVVJSX1hfQ09VTlQoKQliZmluX3JlYWQxNihNRE1BX0QwX0NVUlJfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QwX0NVUlJfWF9DT1VOVCh2YWwpCWJmaW5fd3JpdGUxNihNRE1BX0QwX0NVUlJfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMF9DVVJSX1lfQ09VTlQoKQliZmluX3JlYWQxNihNRE1BX0QwX0NVUlJfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QwX0NVUlJfWV9DT1VOVCh2YWwpCWJmaW5fd3JpdGUxNihNRE1BX0QwX0NVUlJfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMF9JUlFfU1RBVFVTKCkJCWJmaW5fcmVhZDE2KE1ETUFfRDBfSVJRX1NUQVRVUykKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QwX0lSUV9TVEFUVVModmFsKQliZmluX3dyaXRlMTYoTURNQV9EMF9JUlFfU1RBVFVTLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QwX1BFUklQSEVSQUxfTUFQKCkJYmZpbl9yZWFkMTYoTURNQV9EMF9QRVJJUEhFUkFMX01BUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QwX1BFUklQSEVSQUxfTUFQKHZhbCkJYmZpbl93cml0ZTE2KE1ETUFfRDBfUEVSSVBIRVJBTF9NQVAsIHZhbCkKKworI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMF9DT05GSUcoKQkJYmZpbl9yZWFkMTYoTURNQV9TMF9DT05GSUcpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMF9DT05GSUcodmFsKQkJYmZpbl93cml0ZTE2KE1ETUFfUzBfQ09ORklHLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MwX05FWFRfREVTQ19QVFIoKQliZmluX3JlYWQzMihNRE1BX1MwX05FWFRfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMF9ORVhUX0RFU0NfUFRSKHZhbCkJYmZpbl93cml0ZTMyKE1ETUFfUzBfTkVYVF9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMF9TVEFSVF9BRERSKCkJCWJmaW5fcmVhZDMyKE1ETUFfUzBfU1RBUlRfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MwX1NUQVJUX0FERFIodmFsKQliZmluX3dyaXRlMzIoTURNQV9TMF9TVEFSVF9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MwX1hfQ09VTlQoKQkJYmZpbl9yZWFkMTYoTURNQV9TMF9YX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzBfWF9DT1VOVCh2YWwpCQliZmluX3dyaXRlMTYoTURNQV9TMF9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MwX1lfQ09VTlQoKQkJYmZpbl9yZWFkMTYoTURNQV9TMF9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzBfWV9DT1VOVCh2YWwpCQliZmluX3dyaXRlMTYoTURNQV9TMF9ZX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MwX1hfTU9ESUZZKCkJCWJmaW5fcmVhZDE2KE1ETUFfUzBfWF9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMF9YX01PRElGWSh2YWwpCWJmaW5fd3JpdGUxNihNRE1BX1MwX1hfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MwX1lfTU9ESUZZKCkJCWJmaW5fcmVhZDE2KE1ETUFfUzBfWV9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMF9ZX01PRElGWSh2YWwpCWJmaW5fd3JpdGUxNihNRE1BX1MwX1lfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MwX0NVUlJfREVTQ19QVFIoKQliZmluX3JlYWQzMihNRE1BX1MwX0NVUlJfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMF9DVVJSX0RFU0NfUFRSKHZhbCkJYmZpbl93cml0ZTMyKE1ETUFfUzBfQ1VSUl9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMF9DVVJSX0FERFIoKQkJYmZpbl9yZWFkMzIoTURNQV9TMF9DVVJSX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMF9DVVJSX0FERFIodmFsKQliZmluX3dyaXRlMzIoTURNQV9TMF9DVVJSX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzBfQ1VSUl9YX0NPVU5UKCkJYmZpbl9yZWFkMTYoTURNQV9TMF9DVVJSX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMF9DVVJSX1hfQ09VTlQodmFsKQliZmluX3dyaXRlMTYoTURNQV9TMF9DVVJSX1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzBfQ1VSUl9ZX0NPVU5UKCkJYmZpbl9yZWFkMTYoTURNQV9TMF9DVVJSX1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMF9DVVJSX1lfQ09VTlQodmFsKQliZmluX3dyaXRlMTYoTURNQV9TMF9DVVJSX1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzBfSVJRX1NUQVRVUygpCQliZmluX3JlYWQxNihNRE1BX1MwX0lSUV9TVEFUVVMpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMF9JUlFfU1RBVFVTKHZhbCkJYmZpbl93cml0ZTE2KE1ETUFfUzBfSVJRX1NUQVRVUywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMF9QRVJJUEhFUkFMX01BUCgpCWJmaW5fcmVhZDE2KE1ETUFfUzBfUEVSSVBIRVJBTF9NQVApCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMF9QRVJJUEhFUkFMX01BUCh2YWwpCWJmaW5fd3JpdGUxNihNRE1BX1MwX1BFUklQSEVSQUxfTUFQLCB2YWwpCisKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDFfQ09ORklHKCkJCWJmaW5fcmVhZDE2KE1ETUFfRDFfQ09ORklHKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDFfQ09ORklHKHZhbCkJCWJmaW5fd3JpdGUxNihNRE1BX0QxX0NPTkZJRywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMV9ORVhUX0RFU0NfUFRSKCkJYmZpbl9yZWFkMzIoTURNQV9EMV9ORVhUX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDFfTkVYVF9ERVNDX1BUUih2YWwpCWJmaW5fd3JpdGUzMihNRE1BX0QxX05FWFRfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDFfU1RBUlRfQUREUigpCQliZmluX3JlYWQzMihNRE1BX0QxX1NUQVJUX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMV9TVEFSVF9BRERSKHZhbCkJYmZpbl93cml0ZTMyKE1ETUFfRDFfU1RBUlRfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMV9YX0NPVU5UKCkJCWJmaW5fcmVhZDE2KE1ETUFfRDFfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QxX1hfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KE1ETUFfRDFfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMV9ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KE1ETUFfRDFfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QxX1lfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KE1ETUFfRDFfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMV9YX01PRElGWSgpCQliZmluX3JlYWQxNihNRE1BX0QxX1hfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDFfWF9NT0RJRlkodmFsKQliZmluX3dyaXRlMTYoTURNQV9EMV9YX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMV9ZX01PRElGWSgpCQliZmluX3JlYWQxNihNRE1BX0QxX1lfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDFfWV9NT0RJRlkodmFsKQliZmluX3dyaXRlMTYoTURNQV9EMV9ZX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMV9DVVJSX0RFU0NfUFRSKCkJYmZpbl9yZWFkMzIoTURNQV9EMV9DVVJSX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDFfQ1VSUl9ERVNDX1BUUih2YWwpCWJmaW5fd3JpdGUzMihNRE1BX0QxX0NVUlJfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDFfQ1VSUl9BRERSKCkJCWJmaW5fcmVhZDMyKE1ETUFfRDFfQ1VSUl9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDFfQ1VSUl9BRERSKHZhbCkJYmZpbl93cml0ZTMyKE1ETUFfRDFfQ1VSUl9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QxX0NVUlJfWF9DT1VOVCgpCWJmaW5fcmVhZDE2KE1ETUFfRDFfQ1VSUl9YX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDFfQ1VSUl9YX0NPVU5UKHZhbCkJYmZpbl93cml0ZTE2KE1ETUFfRDFfQ1VSUl9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QxX0NVUlJfWV9DT1VOVCgpCWJmaW5fcmVhZDE2KE1ETUFfRDFfQ1VSUl9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDFfQ1VSUl9ZX0NPVU5UKHZhbCkJYmZpbl93cml0ZTE2KE1ETUFfRDFfQ1VSUl9ZX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QxX0lSUV9TVEFUVVMoKQkJYmZpbl9yZWFkMTYoTURNQV9EMV9JUlFfU1RBVFVTKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDFfSVJRX1NUQVRVUyh2YWwpCWJmaW5fd3JpdGUxNihNRE1BX0QxX0lSUV9TVEFUVVMsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDFfUEVSSVBIRVJBTF9NQVAoKQliZmluX3JlYWQxNihNRE1BX0QxX1BFUklQSEVSQUxfTUFQKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDFfUEVSSVBIRVJBTF9NQVAodmFsKQliZmluX3dyaXRlMTYoTURNQV9EMV9QRVJJUEhFUkFMX01BUCwgdmFsKQorCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MxX0NPTkZJRygpCQliZmluX3JlYWQxNihNRE1BX1MxX0NPTkZJRykKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MxX0NPTkZJRyh2YWwpCQliZmluX3dyaXRlMTYoTURNQV9TMV9DT05GSUcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzFfTkVYVF9ERVNDX1BUUigpCWJmaW5fcmVhZDMyKE1ETUFfUzFfTkVYVF9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MxX05FWFRfREVTQ19QVFIodmFsKQliZmluX3dyaXRlMzIoTURNQV9TMV9ORVhUX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MxX1NUQVJUX0FERFIoKQkJYmZpbl9yZWFkMzIoTURNQV9TMV9TVEFSVF9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzFfU1RBUlRfQUREUih2YWwpCWJmaW5fd3JpdGUzMihNRE1BX1MxX1NUQVJUX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzFfWF9DT1VOVCgpCQliZmluX3JlYWQxNihNRE1BX1MxX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMV9YX0NPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihNRE1BX1MxX1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzFfWV9DT1VOVCgpCQliZmluX3JlYWQxNihNRE1BX1MxX1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMV9ZX0NPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihNRE1BX1MxX1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzFfWF9NT0RJRlkoKQkJYmZpbl9yZWFkMTYoTURNQV9TMV9YX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MxX1hfTU9ESUZZKHZhbCkJYmZpbl93cml0ZTE2KE1ETUFfUzFfWF9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzFfWV9NT0RJRlkoKQkJYmZpbl9yZWFkMTYoTURNQV9TMV9ZX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MxX1lfTU9ESUZZKHZhbCkJYmZpbl93cml0ZTE2KE1ETUFfUzFfWV9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzFfQ1VSUl9ERVNDX1BUUigpCWJmaW5fcmVhZDMyKE1ETUFfUzFfQ1VSUl9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MxX0NVUlJfREVTQ19QVFIodmFsKQliZmluX3dyaXRlMzIoTURNQV9TMV9DVVJSX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MxX0NVUlJfQUREUigpCQliZmluX3JlYWQzMihNRE1BX1MxX0NVUlJfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MxX0NVUlJfQUREUih2YWwpCWJmaW5fd3JpdGUzMihNRE1BX1MxX0NVUlJfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMV9DVVJSX1hfQ09VTlQoKQliZmluX3JlYWQxNihNRE1BX1MxX0NVUlJfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MxX0NVUlJfWF9DT1VOVCh2YWwpCWJmaW5fd3JpdGUxNihNRE1BX1MxX0NVUlJfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMV9DVVJSX1lfQ09VTlQoKQliZmluX3JlYWQxNihNRE1BX1MxX0NVUlJfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MxX0NVUlJfWV9DT1VOVCh2YWwpCWJmaW5fd3JpdGUxNihNRE1BX1MxX0NVUlJfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMV9JUlFfU1RBVFVTKCkJCWJmaW5fcmVhZDE2KE1ETUFfUzFfSVJRX1NUQVRVUykKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MxX0lSUV9TVEFUVVModmFsKQliZmluX3dyaXRlMTYoTURNQV9TMV9JUlFfU1RBVFVTLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MxX1BFUklQSEVSQUxfTUFQKCkJYmZpbl9yZWFkMTYoTURNQV9TMV9QRVJJUEhFUkFMX01BUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MxX1BFUklQSEVSQUxfTUFQKHZhbCkJYmZpbl93cml0ZTE2KE1ETUFfUzFfUEVSSVBIRVJBTF9NQVAsIHZhbCkKKworCisvKiBQYXJhbGxlbCBQZXJpcGhlcmFsIEludGVyZmFjZSAoMHhGRkMwMTAwMCAtIDB4RkZDMDEwRkYpCQkJCQkJCSovCisjZGVmaW5lIGJmaW5fcmVhZF9QUElfQ09OVFJPTCgpCQkJYmZpbl9yZWFkMTYoUFBJX0NPTlRST0wpCisjZGVmaW5lIGJmaW5fd3JpdGVfUFBJX0NPTlRST0wodmFsKQkJYmZpbl93cml0ZTE2KFBQSV9DT05UUk9MLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QUElfU1RBVFVTKCkJCQliZmluX3JlYWQxNihQUElfU1RBVFVTKQorI2RlZmluZSBiZmluX3dyaXRlX1BQSV9TVEFUVVModmFsKQkJYmZpbl93cml0ZTE2KFBQSV9TVEFUVVMsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BQSV9ERUxBWSgpCQkJYmZpbl9yZWFkMTYoUFBJX0RFTEFZKQorI2RlZmluZSBiZmluX3dyaXRlX1BQSV9ERUxBWSh2YWwpCQliZmluX3dyaXRlMTYoUFBJX0RFTEFZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QUElfQ09VTlQoKQkJCWJmaW5fcmVhZDE2KFBQSV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9QUElfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KFBQSV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUFBJX0ZSQU1FKCkJCQliZmluX3JlYWQxNihQUElfRlJBTUUpCisjZGVmaW5lIGJmaW5fd3JpdGVfUFBJX0ZSQU1FKHZhbCkJCWJmaW5fd3JpdGUxNihQUElfRlJBTUUsIHZhbCkKKworCisvKiBUd28tV2lyZSBJbnRlcmZhY2UJCSgweEZGQzAxNDAwIC0gMHhGRkMwMTRGRikJCQkJCQkJCSovCisKKy8qIEdlbmVyYWwgUHVycG9zZSBJL08gUG9ydCBHICgweEZGQzAxNTAwIC0gMHhGRkMwMTVGRikJCQkJCQkJCSovCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JUR0lPKCkJCQliZmluX3JlYWQxNihQT1JUR0lPKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRHSU8odmFsKQkJCWJmaW5fd3JpdGUxNihQT1JUR0lPLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JUR0lPX0NMRUFSKCkJCWJmaW5fcmVhZDE2KFBPUlRHSU9fQ0xFQVIpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEdJT19DTEVBUih2YWwpCQliZmluX3dyaXRlMTYoUE9SVEdJT19DTEVBUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEdJT19TRVQoKQkJCWJmaW5fcmVhZDE2KFBPUlRHSU9fU0VUKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRHSU9fU0VUKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JUR0lPX1NFVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEdJT19UT0dHTEUoKQkJYmZpbl9yZWFkMTYoUE9SVEdJT19UT0dHTEUpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEdJT19UT0dHTEUodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRHSU9fVE9HR0xFLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JUR0lPX01BU0tBKCkJCWJmaW5fcmVhZDE2KFBPUlRHSU9fTUFTS0EpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEdJT19NQVNLQSh2YWwpCQliZmluX3dyaXRlMTYoUE9SVEdJT19NQVNLQSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEdJT19NQVNLQV9DTEVBUigpCQliZmluX3JlYWQxNihQT1JUR0lPX01BU0tBX0NMRUFSKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRHSU9fTUFTS0FfQ0xFQVIodmFsKQliZmluX3dyaXRlMTYoUE9SVEdJT19NQVNLQV9DTEVBUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEdJT19NQVNLQV9TRVQoKQkJYmZpbl9yZWFkMTYoUE9SVEdJT19NQVNLQV9TRVQpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEdJT19NQVNLQV9TRVQodmFsKQliZmluX3dyaXRlMTYoUE9SVEdJT19NQVNLQV9TRVQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRHSU9fTUFTS0FfVE9HR0xFKCkJYmZpbl9yZWFkMTYoUE9SVEdJT19NQVNLQV9UT0dHTEUpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEdJT19NQVNLQV9UT0dHTEUodmFsKQliZmluX3dyaXRlMTYoUE9SVEdJT19NQVNLQV9UT0dHTEUsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRHSU9fTUFTS0IoKQkJYmZpbl9yZWFkMTYoUE9SVEdJT19NQVNLQikKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JUR0lPX01BU0tCKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JUR0lPX01BU0tCLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JUR0lPX01BU0tCX0NMRUFSKCkJCWJmaW5fcmVhZDE2KFBPUlRHSU9fTUFTS0JfQ0xFQVIpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEdJT19NQVNLQl9DTEVBUih2YWwpCWJmaW5fd3JpdGUxNihQT1JUR0lPX01BU0tCX0NMRUFSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JUR0lPX01BU0tCX1NFVCgpCQliZmluX3JlYWQxNihQT1JUR0lPX01BU0tCX1NFVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JUR0lPX01BU0tCX1NFVCh2YWwpCWJmaW5fd3JpdGUxNihQT1JUR0lPX01BU0tCX1NFVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEdJT19NQVNLQl9UT0dHTEUoKQliZmluX3JlYWQxNihQT1JUR0lPX01BU0tCX1RPR0dMRSkKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JUR0lPX01BU0tCX1RPR0dMRSh2YWwpCWJmaW5fd3JpdGUxNihQT1JUR0lPX01BU0tCX1RPR0dMRSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEdJT19ESVIoKQkJCWJmaW5fcmVhZDE2KFBPUlRHSU9fRElSKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRHSU9fRElSKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JUR0lPX0RJUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEdJT19QT0xBUigpCQliZmluX3JlYWQxNihQT1JUR0lPX1BPTEFSKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRHSU9fUE9MQVIodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRHSU9fUE9MQVIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRHSU9fRURHRSgpCQliZmluX3JlYWQxNihQT1JUR0lPX0VER0UpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEdJT19FREdFKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JUR0lPX0VER0UsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRHSU9fQk9USCgpCQliZmluX3JlYWQxNihQT1JUR0lPX0JPVEgpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEdJT19CT1RIKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JUR0lPX0JPVEgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRHSU9fSU5FTigpCQliZmluX3JlYWQxNihQT1JUR0lPX0lORU4pCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEdJT19JTkVOKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JUR0lPX0lORU4sIHZhbCkKKworCisvKiBHZW5lcmFsIFB1cnBvc2UgSS9PIFBvcnQgSCAoMHhGRkMwMTcwMCAtIDB4RkZDMDE3RkYpCQkJCQkJCQkqLworI2RlZmluZSBiZmluX3JlYWRfUE9SVEhJTygpCQkJYmZpbl9yZWFkMTYoUE9SVEhJTykKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JUSElPKHZhbCkJCQliZmluX3dyaXRlMTYoUE9SVEhJTywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEhJT19DTEVBUigpCQliZmluX3JlYWQxNihQT1JUSElPX0NMRUFSKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRISU9fQ0xFQVIodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRISU9fQ0xFQVIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRISU9fU0VUKCkJCQliZmluX3JlYWQxNihQT1JUSElPX1NFVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JUSElPX1NFVCh2YWwpCQliZmluX3dyaXRlMTYoUE9SVEhJT19TRVQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRISU9fVE9HR0xFKCkJCWJmaW5fcmVhZDE2KFBPUlRISU9fVE9HR0xFKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRISU9fVE9HR0xFKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JUSElPX1RPR0dMRSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEhJT19NQVNLQSgpCQliZmluX3JlYWQxNihQT1JUSElPX01BU0tBKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRISU9fTUFTS0EodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRISU9fTUFTS0EsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRISU9fTUFTS0FfQ0xFQVIoKQkJYmZpbl9yZWFkMTYoUE9SVEhJT19NQVNLQV9DTEVBUikKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JUSElPX01BU0tBX0NMRUFSKHZhbCkJYmZpbl93cml0ZTE2KFBPUlRISU9fTUFTS0FfQ0xFQVIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRISU9fTUFTS0FfU0VUKCkJCWJmaW5fcmVhZDE2KFBPUlRISU9fTUFTS0FfU0VUKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRISU9fTUFTS0FfU0VUKHZhbCkJYmZpbl93cml0ZTE2KFBPUlRISU9fTUFTS0FfU0VULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JUSElPX01BU0tBX1RPR0dMRSgpCWJmaW5fcmVhZDE2KFBPUlRISU9fTUFTS0FfVE9HR0xFKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRISU9fTUFTS0FfVE9HR0xFKHZhbCkJYmZpbl93cml0ZTE2KFBPUlRISU9fTUFTS0FfVE9HR0xFLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JUSElPX01BU0tCKCkJCWJmaW5fcmVhZDE2KFBPUlRISU9fTUFTS0IpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEhJT19NQVNLQih2YWwpCQliZmluX3dyaXRlMTYoUE9SVEhJT19NQVNLQiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEhJT19NQVNLQl9DTEVBUigpCQliZmluX3JlYWQxNihQT1JUSElPX01BU0tCX0NMRUFSKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRISU9fTUFTS0JfQ0xFQVIodmFsKQliZmluX3dyaXRlMTYoUE9SVEhJT19NQVNLQl9DTEVBUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEhJT19NQVNLQl9TRVQoKQkJYmZpbl9yZWFkMTYoUE9SVEhJT19NQVNLQl9TRVQpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEhJT19NQVNLQl9TRVQodmFsKQliZmluX3dyaXRlMTYoUE9SVEhJT19NQVNLQl9TRVQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRISU9fTUFTS0JfVE9HR0xFKCkJYmZpbl9yZWFkMTYoUE9SVEhJT19NQVNLQl9UT0dHTEUpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEhJT19NQVNLQl9UT0dHTEUodmFsKQliZmluX3dyaXRlMTYoUE9SVEhJT19NQVNLQl9UT0dHTEUsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRISU9fRElSKCkJCQliZmluX3JlYWQxNihQT1JUSElPX0RJUikKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JUSElPX0RJUih2YWwpCQliZmluX3dyaXRlMTYoUE9SVEhJT19ESVIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRISU9fUE9MQVIoKQkJYmZpbl9yZWFkMTYoUE9SVEhJT19QT0xBUikKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JUSElPX1BPTEFSKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JUSElPX1BPTEFSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JUSElPX0VER0UoKQkJYmZpbl9yZWFkMTYoUE9SVEhJT19FREdFKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRISU9fRURHRSh2YWwpCQliZmluX3dyaXRlMTYoUE9SVEhJT19FREdFLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JUSElPX0JPVEgoKQkJYmZpbl9yZWFkMTYoUE9SVEhJT19CT1RIKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRISU9fQk9USCh2YWwpCQliZmluX3dyaXRlMTYoUE9SVEhJT19CT1RILCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JUSElPX0lORU4oKQkJYmZpbl9yZWFkMTYoUE9SVEhJT19JTkVOKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRISU9fSU5FTih2YWwpCQliZmluX3dyaXRlMTYoUE9SVEhJT19JTkVOLCB2YWwpCisKKworLyogVUFSVDEgQ29udHJvbGxlcgkJKDB4RkZDMDIwMDAgLSAweEZGQzAyMEZGKQkJCQkJCQkJKi8KKyNkZWZpbmUgYmZpbl9yZWFkX1VBUlQxX1RIUigpCQkJYmZpbl9yZWFkMTYoVUFSVDFfVEhSKQorI2RlZmluZSBiZmluX3dyaXRlX1VBUlQxX1RIUih2YWwpCQliZmluX3dyaXRlMTYoVUFSVDFfVEhSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VQVJUMV9SQlIoKQkJCWJmaW5fcmVhZDE2KFVBUlQxX1JCUikKKyNkZWZpbmUgYmZpbl93cml0ZV9VQVJUMV9SQlIodmFsKQkJYmZpbl93cml0ZTE2KFVBUlQxX1JCUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVUFSVDFfRExMKCkJCQliZmluX3JlYWQxNihVQVJUMV9ETEwpCisjZGVmaW5lIGJmaW5fd3JpdGVfVUFSVDFfRExMKHZhbCkJCWJmaW5fd3JpdGUxNihVQVJUMV9ETEwsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VBUlQxX0lFUigpCQkJYmZpbl9yZWFkMTYoVUFSVDFfSUVSKQorI2RlZmluZSBiZmluX3dyaXRlX1VBUlQxX0lFUih2YWwpCQliZmluX3dyaXRlMTYoVUFSVDFfSUVSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VQVJUMV9ETEgoKQkJCWJmaW5fcmVhZDE2KFVBUlQxX0RMSCkKKyNkZWZpbmUgYmZpbl93cml0ZV9VQVJUMV9ETEgodmFsKQkJYmZpbl93cml0ZTE2KFVBUlQxX0RMSCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVUFSVDFfSUlSKCkJCQliZmluX3JlYWQxNihVQVJUMV9JSVIpCisjZGVmaW5lIGJmaW5fd3JpdGVfVUFSVDFfSUlSKHZhbCkJCWJmaW5fd3JpdGUxNihVQVJUMV9JSVIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VBUlQxX0xDUigpCQkJYmZpbl9yZWFkMTYoVUFSVDFfTENSKQorI2RlZmluZSBiZmluX3dyaXRlX1VBUlQxX0xDUih2YWwpCQliZmluX3dyaXRlMTYoVUFSVDFfTENSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VQVJUMV9NQ1IoKQkJCWJmaW5fcmVhZDE2KFVBUlQxX01DUikKKyNkZWZpbmUgYmZpbl93cml0ZV9VQVJUMV9NQ1IodmFsKQkJYmZpbl93cml0ZTE2KFVBUlQxX01DUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVUFSVDFfTFNSKCkJCQliZmluX3JlYWQxNihVQVJUMV9MU1IpCisjZGVmaW5lIGJmaW5fd3JpdGVfVUFSVDFfTFNSKHZhbCkJCWJmaW5fd3JpdGUxNihVQVJUMV9MU1IsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VBUlQxX01TUigpCQkJYmZpbl9yZWFkMTYoVUFSVDFfTVNSKQorI2RlZmluZSBiZmluX3dyaXRlX1VBUlQxX01TUih2YWwpCQliZmluX3dyaXRlMTYoVUFSVDFfTVNSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VQVJUMV9TQ1IoKQkJCWJmaW5fcmVhZDE2KFVBUlQxX1NDUikKKyNkZWZpbmUgYmZpbl93cml0ZV9VQVJUMV9TQ1IodmFsKQkJYmZpbl93cml0ZTE2KFVBUlQxX1NDUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVUFSVDFfR0NUTCgpCQkJYmZpbl9yZWFkMTYoVUFSVDFfR0NUTCkKKyNkZWZpbmUgYmZpbl93cml0ZV9VQVJUMV9HQ1RMKHZhbCkJCWJmaW5fd3JpdGUxNihVQVJUMV9HQ1RMLCB2YWwpCisKKy8qIE9taXQgQ0FOIHJlZ2lzdGVyIHNldHMgZnJvbSB0aGUgY2RlZkJGNTM0LmggKENBTiBpcyBub3QgaW4gdGhlIEFEU1AtQkY1MXggcHJvY2Vzc29yKSAqLworCisvKiBQaW4gQ29udHJvbCBSZWdpc3RlcnMJKDB4RkZDMDMyMDAgLSAweEZGQzAzMkZGKQkJCQkJCQkJKi8KKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRGX0ZFUigpCQkJYmZpbl9yZWFkMTYoUE9SVEZfRkVSKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRGX0ZFUih2YWwpCQliZmluX3dyaXRlMTYoUE9SVEZfRkVSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JUR19GRVIoKQkJCWJmaW5fcmVhZDE2KFBPUlRHX0ZFUikKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JUR19GRVIodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRHX0ZFUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEhfRkVSKCkJCQliZmluX3JlYWQxNihQT1JUSF9GRVIpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEhfRkVSKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JUSF9GRVIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRfTVVYKCkJCQliZmluX3JlYWQxNihQT1JUX01VWCkKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JUX01VWCh2YWwpCQliZmluX3dyaXRlMTYoUE9SVF9NVVgsIHZhbCkKKworCisvKiBIYW5kc2hha2UgTURNQSBSZWdpc3RlcnMJKDB4RkZDMDMzMDAgLSAweEZGQzAzM0ZGKQkJCQkJCQkJKi8KKyNkZWZpbmUgYmZpbl9yZWFkX0hNRE1BMF9DT05UUk9MKCkJCWJmaW5fcmVhZDE2KEhNRE1BMF9DT05UUk9MKQorI2RlZmluZSBiZmluX3dyaXRlX0hNRE1BMF9DT05UUk9MKHZhbCkJCWJmaW5fd3JpdGUxNihITURNQTBfQ09OVFJPTCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfSE1ETUEwX0VDSU5JVCgpCQliZmluX3JlYWQxNihITURNQTBfRUNJTklUKQorI2RlZmluZSBiZmluX3dyaXRlX0hNRE1BMF9FQ0lOSVQodmFsKQkJYmZpbl93cml0ZTE2KEhNRE1BMF9FQ0lOSVQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0hNRE1BMF9CQ0lOSVQoKQkJYmZpbl9yZWFkMTYoSE1ETUEwX0JDSU5JVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ITURNQTBfQkNJTklUKHZhbCkJCWJmaW5fd3JpdGUxNihITURNQTBfQkNJTklULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ITURNQTBfRUNVUkdFTlQoKQkJYmZpbl9yZWFkMTYoSE1ETUEwX0VDVVJHRU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0hNRE1BMF9FQ1VSR0VOVCh2YWwpCQliZmluX3dyaXRlMTYoSE1ETUEwX0VDVVJHRU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ITURNQTBfRUNPVkVSRkxPVygpCQliZmluX3JlYWQxNihITURNQTBfRUNPVkVSRkxPVykKKyNkZWZpbmUgYmZpbl93cml0ZV9ITURNQTBfRUNPVkVSRkxPVyh2YWwpCWJmaW5fd3JpdGUxNihITURNQTBfRUNPVkVSRkxPVywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfSE1ETUEwX0VDT1VOVCgpCQliZmluX3JlYWQxNihITURNQTBfRUNPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0hNRE1BMF9FQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KEhNRE1BMF9FQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0hNRE1BMF9CQ09VTlQoKQkJYmZpbl9yZWFkMTYoSE1ETUEwX0JDT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ITURNQTBfQkNPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihITURNQTBfQkNPVU5ULCB2YWwpCisKKyNkZWZpbmUgYmZpbl9yZWFkX0hNRE1BMV9DT05UUk9MKCkJCWJmaW5fcmVhZDE2KEhNRE1BMV9DT05UUk9MKQorI2RlZmluZSBiZmluX3dyaXRlX0hNRE1BMV9DT05UUk9MKHZhbCkJCWJmaW5fd3JpdGUxNihITURNQTFfQ09OVFJPTCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfSE1ETUExX0VDSU5JVCgpCQliZmluX3JlYWQxNihITURNQTFfRUNJTklUKQorI2RlZmluZSBiZmluX3dyaXRlX0hNRE1BMV9FQ0lOSVQodmFsKQkJYmZpbl93cml0ZTE2KEhNRE1BMV9FQ0lOSVQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0hNRE1BMV9CQ0lOSVQoKQkJYmZpbl9yZWFkMTYoSE1ETUExX0JDSU5JVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ITURNQTFfQkNJTklUKHZhbCkJCWJmaW5fd3JpdGUxNihITURNQTFfQkNJTklULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ITURNQTFfRUNVUkdFTlQoKQkJYmZpbl9yZWFkMTYoSE1ETUExX0VDVVJHRU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0hNRE1BMV9FQ1VSR0VOVCh2YWwpCQliZmluX3dyaXRlMTYoSE1ETUExX0VDVVJHRU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ITURNQTFfRUNPVkVSRkxPVygpCQliZmluX3JlYWQxNihITURNQTFfRUNPVkVSRkxPVykKKyNkZWZpbmUgYmZpbl93cml0ZV9ITURNQTFfRUNPVkVSRkxPVyh2YWwpCWJmaW5fd3JpdGUxNihITURNQTFfRUNPVkVSRkxPVywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfSE1ETUExX0VDT1VOVCgpCQliZmluX3JlYWQxNihITURNQTFfRUNPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0hNRE1BMV9FQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KEhNRE1BMV9FQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0hNRE1BMV9CQ09VTlQoKQkJYmZpbl9yZWFkMTYoSE1ETUExX0JDT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ITURNQTFfQkNPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihITURNQTFfQkNPVU5ULCB2YWwpCisKKy8qID09PT0gZW5kIGZyb20gY2RlZkJGNTM0LmggPT09PSAqLworCisvKiBHUElPIFBJTiBtdXggKDB4RkZDMDMyMTAgLSBPeEZGQzAzMjg4KSAqLworCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JURl9NVVgoKQkJCWJmaW5fcmVhZDE2KFBPUlRGX01VWCkKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JURl9NVVgodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRGX01VWCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEdfTVVYKCkJCQliZmluX3JlYWQxNihQT1JUR19NVVgpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEdfTVVYKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JUR19NVVgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRIX01VWCgpCQkJYmZpbl9yZWFkMTYoUE9SVEhfTVVYKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRIX01VWCh2YWwpCQliZmluX3dyaXRlMTYoUE9SVEhfTVVYLCB2YWwpCisKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRGX0RSSVZFKCkJCQliZmluX3JlYWQxNihQT1JURl9EUklWRSkKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JURl9EUklWRSh2YWwpCQliZmluX3dyaXRlMTYoUE9SVEZfRFJJVkUsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRHX0RSSVZFKCkJCQliZmluX3JlYWQxNihQT1JUR19EUklWRSkKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JUR19EUklWRSh2YWwpCQliZmluX3dyaXRlMTYoUE9SVEdfRFJJVkUsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRIX0RSSVZFKCkJCQliZmluX3JlYWQxNihQT1JUSF9EUklWRSkKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JUSF9EUklWRSh2YWwpCQliZmluX3dyaXRlMTYoUE9SVEhfRFJJVkUsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRGX1NMRVcoKQkJCWJmaW5fcmVhZDE2KFBPUlRGX1NMRVcpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEZfU0xFVyh2YWwpCQliZmluX3dyaXRlMTYoUE9SVEZfU0xFVywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEdfU0xFVygpCQkJYmZpbl9yZWFkMTYoUE9SVEdfU0xFVykKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JUR19TTEVXKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JUR19TTEVXLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JUSF9TTEVXKCkJCQliZmluX3JlYWQxNihQT1JUSF9TTEVXKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRIX1NMRVcodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRIX1NMRVcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRGX0hZU1RFUklTSVMoKQkJYmZpbl9yZWFkMTYoUE9SVEZfSFlTVEVSSVNJUykKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JURl9IWVNURVJJU0lTKHZhbCkJYmZpbl93cml0ZTE2KFBPUlRGX0hZU1RFUklTSVMsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRHX0hZU1RFUklTSVMoKQkJYmZpbl9yZWFkMTYoUE9SVEdfSFlTVEVSSVNJUykKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JUR19IWVNURVJJU0lTKHZhbCkJYmZpbl93cml0ZTE2KFBPUlRHX0hZU1RFUklTSVMsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRIX0hZU1RFUklTSVMoKQkJYmZpbl9yZWFkMTYoUE9SVEhfSFlTVEVSSVNJUykKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JUSF9IWVNURVJJU0lTKHZhbCkJYmZpbl93cml0ZTE2KFBPUlRIX0hZU1RFUklTSVMsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01JU0NQT1JUX0RSSVZFKCkJCWJmaW5fcmVhZDE2KE1JU0NQT1JUX0RSSVZFKQorI2RlZmluZSBiZmluX3dyaXRlX01JU0NQT1JUX0RSSVZFKHZhbCkJCWJmaW5fd3JpdGUxNihNSVNDUE9SVF9EUklWRSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTUlTQ1BPUlRfU0xFVygpCQliZmluX3JlYWQxNihNSVNDUE9SVF9TTEVXKQorI2RlZmluZSBiZmluX3dyaXRlX01JU0NQT1JUX1NMRVcodmFsKQkJYmZpbl93cml0ZTE2KE1JU0NQT1JUX1NMRVcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01JU0NQT1JUX0hZU1RFUklTSVMoKQkJYmZpbl9yZWFkMTYoTUlTQ1BPUlRfSFlTVEVSSVNJUykKKyNkZWZpbmUgYmZpbl93cml0ZV9NSVNDUE9SVF9IWVNURVJJU0lTKHZhbCkJYmZpbl93cml0ZTE2KE1JU0NQT1JUX0hZU1RFUklTSVMsIHZhbCkKKworLyogSE9TVCBQb3J0IFJlZ2lzdGVycyAqLworCisjZGVmaW5lIGJmaW5fcmVhZF9IT1NUX0NPTlRST0woKQkJYmZpbl9yZWFkMTYoSE9TVF9DT05UUk9MKQorI2RlZmluZSBiZmluX3dyaXRlX0hPU1RfQ09OVFJPTCh2YWwpCQliZmluX3dyaXRlMTYoSE9TVF9DT05UUk9MLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9IT1NUX1NUQVRVUygpCQkJYmZpbl9yZWFkMTYoSE9TVF9TVEFUVVMpCisjZGVmaW5lIGJmaW5fd3JpdGVfSE9TVF9TVEFUVVModmFsKQkJYmZpbl93cml0ZTE2KEhPU1RfU1RBVFVTLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9IT1NUX1RJTUVPVVQoKQkJYmZpbl9yZWFkMTYoSE9TVF9USU1FT1VUKQorI2RlZmluZSBiZmluX3dyaXRlX0hPU1RfVElNRU9VVCh2YWwpCQliZmluX3dyaXRlMTYoSE9TVF9USU1FT1VULCB2YWwpCisKKy8qIENvdW50ZXIgUmVnaXN0ZXJzICovCisKKyNkZWZpbmUgYmZpbl9yZWFkX0NOVF9DT05GSUcoKQkJCWJmaW5fcmVhZDE2KENOVF9DT05GSUcpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ05UX0NPTkZJRyh2YWwpCQliZmluX3dyaXRlMTYoQ05UX0NPTkZJRywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ05UX0lNQVNLKCkJCQliZmluX3JlYWQxNihDTlRfSU1BU0spCisjZGVmaW5lIGJmaW5fd3JpdGVfQ05UX0lNQVNLKHZhbCkJCWJmaW5fd3JpdGUxNihDTlRfSU1BU0ssIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NOVF9TVEFUVVMoKQkJCWJmaW5fcmVhZDE2KENOVF9TVEFUVVMpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ05UX1NUQVRVUyh2YWwpCQliZmluX3dyaXRlMTYoQ05UX1NUQVRVUywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ05UX0NPTU1BTkQoKQkJCWJmaW5fcmVhZDE2KENOVF9DT01NQU5EKQorI2RlZmluZSBiZmluX3dyaXRlX0NOVF9DT01NQU5EKHZhbCkJCWJmaW5fd3JpdGUxNihDTlRfQ09NTUFORCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ05UX0RFQk9VTkNFKCkJCWJmaW5fcmVhZDE2KENOVF9ERUJPVU5DRSkKKyNkZWZpbmUgYmZpbl93cml0ZV9DTlRfREVCT1VOQ0UodmFsKQkJYmZpbl93cml0ZTE2KENOVF9ERUJPVU5DRSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ05UX0NPVU5URVIoKQkJCWJmaW5fcmVhZDMyKENOVF9DT1VOVEVSKQorI2RlZmluZSBiZmluX3dyaXRlX0NOVF9DT1VOVEVSKHZhbCkJCWJmaW5fd3JpdGUzMihDTlRfQ09VTlRFUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ05UX01BWCgpCQkJYmZpbl9yZWFkMzIoQ05UX01BWCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DTlRfTUFYKHZhbCkJCQliZmluX3dyaXRlMzIoQ05UX01BWCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ05UX01JTigpCQkJYmZpbl9yZWFkMzIoQ05UX01JTikKKyNkZWZpbmUgYmZpbl93cml0ZV9DTlRfTUlOKHZhbCkJCQliZmluX3dyaXRlMzIoQ05UX01JTiwgdmFsKQorCisvKiBPVFAvRlVTRSBSZWdpc3RlcnMgKi8KKworI2RlZmluZSBiZmluX3JlYWRfT1RQX0NPTlRST0woKQkJCWJmaW5fcmVhZDE2KE9UUF9DT05UUk9MKQorI2RlZmluZSBiZmluX3dyaXRlX09UUF9DT05UUk9MKHZhbCkJCWJmaW5fd3JpdGUxNihPVFBfQ09OVFJPTCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfT1RQX0JFTigpCQkJYmZpbl9yZWFkMTYoT1RQX0JFTikKKyNkZWZpbmUgYmZpbl93cml0ZV9PVFBfQkVOKHZhbCkJCQliZmluX3dyaXRlMTYoT1RQX0JFTiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfT1RQX1NUQVRVUygpCQkJYmZpbl9yZWFkMTYoT1RQX1NUQVRVUykKKyNkZWZpbmUgYmZpbl93cml0ZV9PVFBfU1RBVFVTKHZhbCkJCWJmaW5fd3JpdGUxNihPVFBfU1RBVFVTLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9PVFBfVElNSU5HKCkJCQliZmluX3JlYWQzMihPVFBfVElNSU5HKQorI2RlZmluZSBiZmluX3dyaXRlX09UUF9USU1JTkcodmFsKQkJYmZpbl93cml0ZTMyKE9UUF9USU1JTkcsIHZhbCkKKworLyogU2VjdXJpdHkgUmVnaXN0ZXJzICovCisKKyNkZWZpbmUgYmZpbl9yZWFkX1NFQ1VSRV9TWVNTV1QoKQkJYmZpbl9yZWFkMzIoU0VDVVJFX1NZU1NXVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9TRUNVUkVfU1lTU1dUKHZhbCkJCWJmaW5fd3JpdGUzMihTRUNVUkVfU1lTU1dULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TRUNVUkVfQ09OVFJPTCgpCQliZmluX3JlYWQxNihTRUNVUkVfQ09OVFJPTCkKKyNkZWZpbmUgYmZpbl93cml0ZV9TRUNVUkVfQ09OVFJPTCh2YWwpCQliZmluX3dyaXRlMTYoU0VDVVJFX0NPTlRST0wsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NFQ1VSRV9TVEFUVVMoKQkJYmZpbl9yZWFkMTYoU0VDVVJFX1NUQVRVUykKKyNkZWZpbmUgYmZpbl93cml0ZV9TRUNVUkVfU1RBVFVTKHZhbCkJCWJmaW5fd3JpdGUxNihTRUNVUkVfU1RBVFVTLCB2YWwpCisKKy8qIE9UUCBSZWFkL1dyaXRlIERhdGEgQnVmZmVyIFJlZ2lzdGVycyAqLworCisjZGVmaW5lIGJmaW5fcmVhZF9PVFBfREFUQTAoKQkJCWJmaW5fcmVhZDMyKE9UUF9EQVRBMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9PVFBfREFUQTAodmFsKQkJYmZpbl93cml0ZTMyKE9UUF9EQVRBMCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfT1RQX0RBVEExKCkJCQliZmluX3JlYWQzMihPVFBfREFUQTEpCisjZGVmaW5lIGJmaW5fd3JpdGVfT1RQX0RBVEExKHZhbCkJCWJmaW5fd3JpdGUzMihPVFBfREFUQTEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX09UUF9EQVRBMigpCQkJYmZpbl9yZWFkMzIoT1RQX0RBVEEyKQorI2RlZmluZSBiZmluX3dyaXRlX09UUF9EQVRBMih2YWwpCQliZmluX3dyaXRlMzIoT1RQX0RBVEEyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9PVFBfREFUQTMoKQkJCWJmaW5fcmVhZDMyKE9UUF9EQVRBMykKKyNkZWZpbmUgYmZpbl93cml0ZV9PVFBfREFUQTModmFsKQkJYmZpbl93cml0ZTMyKE9UUF9EQVRBMywgdmFsKQorCisvKiBORkMgUmVnaXN0ZXJzICovCisKKyNkZWZpbmUgYmZpbl9yZWFkX05GQ19DVEwoKQkJCWJmaW5fcmVhZDE2KE5GQ19DVEwpCisjZGVmaW5lIGJmaW5fd3JpdGVfTkZDX0NUTCh2YWwpCQkJYmZpbl93cml0ZTE2KE5GQ19DVEwsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX05GQ19TVEFUKCkJCQliZmluX3JlYWQxNihORkNfU1RBVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ORkNfU1RBVCh2YWwpCQliZmluX3dyaXRlMTYoTkZDX1NUQVQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX05GQ19JUlFTVEFUKCkJCQliZmluX3JlYWQxNihORkNfSVJRU1RBVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ORkNfSVJRU1RBVCh2YWwpCQliZmluX3dyaXRlMTYoTkZDX0lSUVNUQVQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX05GQ19JUlFNQVNLKCkJCQliZmluX3JlYWQxNihORkNfSVJRTUFTSykKKyNkZWZpbmUgYmZpbl93cml0ZV9ORkNfSVJRTUFTSyh2YWwpCQliZmluX3dyaXRlMTYoTkZDX0lSUU1BU0ssIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX05GQ19FQ0MwKCkJCQliZmluX3JlYWQxNihORkNfRUNDMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ORkNfRUNDMCh2YWwpCQliZmluX3dyaXRlMTYoTkZDX0VDQzAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX05GQ19FQ0MxKCkJCQliZmluX3JlYWQxNihORkNfRUNDMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9ORkNfRUNDMSh2YWwpCQliZmluX3dyaXRlMTYoTkZDX0VDQzEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX05GQ19FQ0MyKCkJCQliZmluX3JlYWQxNihORkNfRUNDMikKKyNkZWZpbmUgYmZpbl93cml0ZV9ORkNfRUNDMih2YWwpCQliZmluX3dyaXRlMTYoTkZDX0VDQzIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX05GQ19FQ0MzKCkJCQliZmluX3JlYWQxNihORkNfRUNDMykKKyNkZWZpbmUgYmZpbl93cml0ZV9ORkNfRUNDMyh2YWwpCQliZmluX3dyaXRlMTYoTkZDX0VDQzMsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX05GQ19DT1VOVCgpCQkJYmZpbl9yZWFkMTYoTkZDX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX05GQ19DT1VOVCh2YWwpCQliZmluX3dyaXRlMTYoTkZDX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ORkNfUlNUKCkJCQliZmluX3JlYWQxNihORkNfUlNUKQorI2RlZmluZSBiZmluX3dyaXRlX05GQ19SU1QodmFsKQkJCWJmaW5fd3JpdGUxNihORkNfUlNULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ORkNfUEdDVEwoKQkJCWJmaW5fcmVhZDE2KE5GQ19QR0NUTCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ORkNfUEdDVEwodmFsKQkJYmZpbl93cml0ZTE2KE5GQ19QR0NUTCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTkZDX1JFQUQoKQkJCWJmaW5fcmVhZDE2KE5GQ19SRUFEKQorI2RlZmluZSBiZmluX3dyaXRlX05GQ19SRUFEKHZhbCkJCWJmaW5fd3JpdGUxNihORkNfUkVBRCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTkZDX0FERFIoKQkJCWJmaW5fcmVhZDE2KE5GQ19BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX05GQ19BRERSKHZhbCkJCWJmaW5fd3JpdGUxNihORkNfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTkZDX0NNRCgpCQkJYmZpbl9yZWFkMTYoTkZDX0NNRCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ORkNfQ01EKHZhbCkJCQliZmluX3dyaXRlMTYoTkZDX0NNRCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTkZDX0RBVEFfV1IoKQkJCWJmaW5fcmVhZDE2KE5GQ19EQVRBX1dSKQorI2RlZmluZSBiZmluX3dyaXRlX05GQ19EQVRBX1dSKHZhbCkJCWJmaW5fd3JpdGUxNihORkNfREFUQV9XUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTkZDX0RBVEFfUkQoKQkJCWJmaW5fcmVhZDE2KE5GQ19EQVRBX1JEKQorI2RlZmluZSBiZmluX3dyaXRlX05GQ19EQVRBX1JEKHZhbCkJCWJmaW5fd3JpdGUxNihORkNfREFUQV9SRCwgdmFsKQorCisvKiBUaGVzZSBuZWVkIHRvIGJlIGxhc3QgZHVlIHRvIHRoZSBjZGVmL2xpbnV4IGludGVyLWRlcGVuZGVuY2llcyAqLworI2luY2x1ZGUgPGFzbS9pcnEuaD4KKworLyogV3JpdGluZyB0byBQTExfQ1RMIGluaXRpYXRlcyBhIFBMTCByZWxvY2sgc2VxdWVuY2UuICovCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIGJmaW5fd3JpdGVfUExMX0NUTCh1bnNpZ25lZCBpbnQgdmFsKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIGl3cjAsIGl3cjE7CisKKwlpZiAodmFsID09IGJmaW5fcmVhZF9QTExfQ1RMKCkpCisJCXJldHVybjsKKworCWxvY2FsX2lycV9zYXZlX2h3KGZsYWdzKTsKKwkvKiBFbmFibGUgdGhlIFBMTCBXYWtldXAgYml0IGluIFNJQyBJV1IgKi8KKwlpd3IwID0gYmZpbl9yZWFkMzIoU0lDX0lXUjApOworCWl3cjEgPSBiZmluX3JlYWQzMihTSUNfSVdSMSk7CisJLyogT25seSBhbGxvdyBQUEwgV2FrZXVwKSAqLworCWJmaW5fd3JpdGUzMihTSUNfSVdSMCwgSVdSX0VOQUJMRSgwKSk7CisJYmZpbl93cml0ZTMyKFNJQ19JV1IxLCAwKTsKKworCWJmaW5fd3JpdGUxNihQTExfQ1RMLCB2YWwpOworCVNTWU5DKCk7CisJYXNtKCJJRExFOyIpOworCisJYmZpbl93cml0ZTMyKFNJQ19JV1IwLCBpd3IwKTsKKwliZmluX3dyaXRlMzIoU0lDX0lXUjEsIGl3cjEpOworCWxvY2FsX2lycV9yZXN0b3JlX2h3KGZsYWdzKTsKK30KKworLyogV3JpdGluZyB0byBWUl9DVEwgaW5pdGlhdGVzIGEgUExMIHJlbG9jayBzZXF1ZW5jZS4gKi8KK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgYmZpbl93cml0ZV9WUl9DVEwodW5zaWduZWQgaW50IHZhbCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzLCBpd3IwLCBpd3IxOworCisJaWYgKHZhbCA9PSBiZmluX3JlYWRfVlJfQ1RMKCkpCisJCXJldHVybjsKKworCWxvY2FsX2lycV9zYXZlX2h3KGZsYWdzKTsKKwkvKiBFbmFibGUgdGhlIFBMTCBXYWtldXAgYml0IGluIFNJQyBJV1IgKi8KKwlpd3IwID0gYmZpbl9yZWFkMzIoU0lDX0lXUjApOworCWl3cjEgPSBiZmluX3JlYWQzMihTSUNfSVdSMSk7CisJLyogT25seSBhbGxvdyBQUEwgV2FrZXVwKSAqLworCWJmaW5fd3JpdGUzMihTSUNfSVdSMCwgSVdSX0VOQUJMRSgwKSk7CisJYmZpbl93cml0ZTMyKFNJQ19JV1IxLCAwKTsKKworCWJmaW5fd3JpdGUxNihWUl9DVEwsIHZhbCk7CisJU1NZTkMoKTsKKwlhc20oIklETEU7Iik7CisKKwliZmluX3dyaXRlMzIoU0lDX0lXUjAsIGl3cjApOworCWJmaW5fd3JpdGUzMihTSUNfSVdSMSwgaXdyMSk7CisJbG9jYWxfaXJxX3Jlc3RvcmVfaHcoZmxhZ3MpOworfQorCisjZW5kaWYgLyogX0NERUZfQkY1MlhfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2luY2x1ZGUvbWFjaC9kZWZCRjUxMi5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2luY2x1ZGUvbWFjaC9kZWZCRjUxMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5NmNhOTAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvaW5jbHVkZS9tYWNoL2RlZkJGNTEyLmgKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqIEZpbGU6ICAgICAgICAgaW5jbHVkZS9hc20tYmxhY2tmaW4vbWFjaC1iZjUxOC9kZWZCRjUxMi5oCisgKiBCYXNlZCBvbjoKKyAqIEF1dGhvcjoKKyAqCisgKiBDcmVhdGVkOgorICogRGVzY3JpcHRpb246CisgKgorICogUmV2OgorICoKKyAqIE1vZGlmaWVkOgorICoKKyAqIEJ1Z3M6ICAgICAgICAgRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuCisgKiBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICovCisKKyNpZm5kZWYgX0RFRl9CRjUxMl9ICisjZGVmaW5lIF9ERUZfQkY1MTJfSAorCisvKiBJbmNsdWRlIGFsbCBDb3JlIHJlZ2lzdGVycyBhbmQgYml0IGRlZmluaXRpb25zICovCisjaW5jbHVkZSA8YXNtL2RlZl9MUEJsYWNrZmluLmg+CisKKy8qIFNZU1RFTSAmIE1NUiBBRERSRVNTIERFRklOSVRJT05TIEZPUiBBRFNQLUJGNTEyICovCisKKy8qIEluY2x1ZGUgZGVmQkY1MXhfYmFzZS5oIGZvciB0aGUgc2V0IG9mICNkZWZpbmVzIHRoYXQgYXJlIGNvbW1vbiB0byBhbGwgQURTUC1CRjUxeCBwcm9jZXNzb3JzICovCisjaW5jbHVkZSAiZGVmQkY1MXhfYmFzZS5oIgorCisjZW5kaWYgLyogX0RFRl9CRjUxMl9IICovCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvaW5jbHVkZS9tYWNoL2RlZkJGNTE0LmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvaW5jbHVkZS9tYWNoL2RlZkJGNTE0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQzZjI5MQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9pbmNsdWRlL21hY2gvZGVmQkY1MTQuaApAQCAtMCwwICsxLDExMyBAQAorLyoKKyAqIEZpbGU6ICAgICAgICAgaW5jbHVkZS9hc20tYmxhY2tmaW4vbWFjaC1iZjUxOC9kZWZCRjUxNC5oCisgKiBCYXNlZCBvbjoKKyAqIEF1dGhvcjoKKyAqCisgKiBDcmVhdGVkOgorICogRGVzY3JpcHRpb246CisgKgorICogUmV2OgorICoKKyAqIE1vZGlmaWVkOgorICoKKyAqIEJ1Z3M6ICAgICAgICAgRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuCisgKiBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICovCisKKyNpZm5kZWYgX0RFRl9CRjUxNF9ICisjZGVmaW5lIF9ERUZfQkY1MTRfSAorCisvKiBJbmNsdWRlIGFsbCBDb3JlIHJlZ2lzdGVycyBhbmQgYml0IGRlZmluaXRpb25zICovCisjaW5jbHVkZSA8YXNtL2RlZl9MUEJsYWNrZmluLmg+CisKKy8qIFNZU1RFTSAmIE1NUiBBRERSRVNTIERFRklOSVRJT05TIEZPUiBBRFNQLUJGNTE0ICovCisKKy8qIEluY2x1ZGUgZGVmQkY1MXhfYmFzZS5oIGZvciB0aGUgc2V0IG9mICNkZWZpbmVzIHRoYXQgYXJlIGNvbW1vbiB0byBhbGwgQURTUC1CRjUxeCBwcm9jZXNzb3JzICovCisjaW5jbHVkZSAiZGVmQkY1MXhfYmFzZS5oIgorCisvKiBUaGUgZm9sbG93aW5nIGFyZSB0aGUgI2RlZmluZXMgbmVlZGVkIGJ5IEFEU1AtQkY1MTQgdGhhdCBhcmUgbm90IGluIHRoZSBjb21tb24gaGVhZGVyICovCisKKy8qIFNESCBSZWdpc3RlcnMgKi8KKworI2RlZmluZSBTREhfUFdSX0NUTCAgICAgICAgICAgICAgICAgICAgMHhGRkMwMzkwMCAvKiBTREggUG93ZXIgQ29udHJvbCAqLworI2RlZmluZSBTREhfQ0xLX0NUTCAgICAgICAgICAgICAgICAgICAgMHhGRkMwMzkwNCAvKiBTREggQ2xvY2sgQ29udHJvbCAqLworI2RlZmluZSBTREhfQVJHVU1FTlQgICAgICAgICAgICAgICAgICAgMHhGRkMwMzkwOCAvKiBTREggQXJndW1lbnQgKi8KKyNkZWZpbmUgU0RIX0NPTU1BTkQgICAgICAgICAgICAgICAgICAgIDB4RkZDMDM5MEMgLyogU0RIIENvbW1hbmQgKi8KKyNkZWZpbmUgU0RIX1JFU1BfQ01EICAgICAgICAgICAgICAgICAgIDB4RkZDMDM5MTAgLyogU0RIIFJlc3BvbnNlIENvbW1hbmQgKi8KKyNkZWZpbmUgU0RIX1JFU1BPTlNFMCAgICAgICAgICAgICAgICAgIDB4RkZDMDM5MTQgLyogU0RIIFJlc3BvbnNlMCAqLworI2RlZmluZSBTREhfUkVTUE9OU0UxICAgICAgICAgICAgICAgICAgMHhGRkMwMzkxOCAvKiBTREggUmVzcG9uc2UxICovCisjZGVmaW5lIFNESF9SRVNQT05TRTIgICAgICAgICAgICAgICAgICAweEZGQzAzOTFDIC8qIFNESCBSZXNwb25zZTIgKi8KKyNkZWZpbmUgU0RIX1JFU1BPTlNFMyAgICAgICAgICAgICAgICAgIDB4RkZDMDM5MjAgLyogU0RIIFJlc3BvbnNlMyAqLworI2RlZmluZSBTREhfREFUQV9USU1FUiAgICAgICAgICAgICAgICAgMHhGRkMwMzkyNCAvKiBTREggRGF0YSBUaW1lciAqLworI2RlZmluZSBTREhfREFUQV9MR1RIICAgICAgICAgICAgICAgICAgMHhGRkMwMzkyOCAvKiBTREggRGF0YSBMZW5ndGggKi8KKyNkZWZpbmUgU0RIX0RBVEFfQ1RMICAgICAgICAgICAgICAgICAgIDB4RkZDMDM5MkMgLyogU0RIIERhdGEgQ29udHJvbCAqLworI2RlZmluZSBTREhfREFUQV9DTlQgICAgICAgICAgICAgICAgICAgMHhGRkMwMzkzMCAvKiBTREggRGF0YSBDb3VudGVyICovCisjZGVmaW5lIFNESF9TVEFUVVMgICAgICAgICAgICAgICAgICAgICAweEZGQzAzOTM0IC8qIFNESCBTdGF0dXMgKi8KKyNkZWZpbmUgU0RIX1NUQVRVU19DTFIgICAgICAgICAgICAgICAgIDB4RkZDMDM5MzggLyogU0RIIFN0YXR1cyBDbGVhciAqLworI2RlZmluZSBTREhfTUFTSzAgICAgICAgICAgICAgICAgICAgICAgMHhGRkMwMzkzQyAvKiBTREggSW50ZXJydXB0MCBNYXNrICovCisjZGVmaW5lIFNESF9NQVNLMSAgICAgICAgICAgICAgICAgICAgICAweEZGQzAzOTQwIC8qIFNESCBJbnRlcnJ1cHQxIE1hc2sgKi8KKyNkZWZpbmUgU0RIX0ZJRk9fQ05UICAgICAgICAgICAgICAgICAgIDB4RkZDMDM5NDggLyogU0RIIEZJRk8gQ291bnRlciAqLworI2RlZmluZSBTREhfRklGTyAgICAgICAgICAgICAgICAgICAgICAgMHhGRkMwMzk4MCAvKiBTREggRGF0YSBGSUZPICovCisjZGVmaW5lIFNESF9FX1NUQVRVUyAgICAgICAgICAgICAgICAgICAweEZGQzAzOUMwIC8qIFNESCBFeGNlcHRpb24gU3RhdHVzICovCisjZGVmaW5lIFNESF9FX01BU0sgICAgICAgICAgICAgICAgICAgICAweEZGQzAzOUM0IC8qIFNESCBFeGNlcHRpb24gTWFzayAqLworI2RlZmluZSBTREhfQ0ZHICAgICAgICAgICAgICAgICAgICAgICAgMHhGRkMwMzlDOCAvKiBTREggQ29uZmlndXJhdGlvbiAqLworI2RlZmluZSBTREhfUkRfV0FJVF9FTiAgICAgICAgICAgICAgICAgMHhGRkMwMzlDQyAvKiBTREggUmVhZCBXYWl0IEVuYWJsZSAqLworI2RlZmluZSBTREhfUElEMCAgICAgICAgICAgICAgICAgICAgICAgMHhGRkMwMzlEMCAvKiBTREggUGVyaXBoZXJhbCBJZGVudGlmaWNhdGlvbjAgKi8KKyNkZWZpbmUgU0RIX1BJRDEgICAgICAgICAgICAgICAgICAgICAgIDB4RkZDMDM5RDQgLyogU0RIIFBlcmlwaGVyYWwgSWRlbnRpZmljYXRpb24xICovCisjZGVmaW5lIFNESF9QSUQyICAgICAgICAgICAgICAgICAgICAgICAweEZGQzAzOUQ4IC8qIFNESCBQZXJpcGhlcmFsIElkZW50aWZpY2F0aW9uMiAqLworI2RlZmluZSBTREhfUElEMyAgICAgICAgICAgICAgICAgICAgICAgMHhGRkMwMzlEQyAvKiBTREggUGVyaXBoZXJhbCBJZGVudGlmaWNhdGlvbjMgKi8KKyNkZWZpbmUgU0RIX1BJRDQgICAgICAgICAgICAgICAgICAgICAgIDB4RkZDMDM5RTAgLyogU0RIIFBlcmlwaGVyYWwgSWRlbnRpZmljYXRpb240ICovCisjZGVmaW5lIFNESF9QSUQ1ICAgICAgICAgICAgICAgICAgICAgICAweEZGQzAzOUU0IC8qIFNESCBQZXJpcGhlcmFsIElkZW50aWZpY2F0aW9uNSAqLworI2RlZmluZSBTREhfUElENiAgICAgICAgICAgICAgICAgICAgICAgMHhGRkMwMzlFOCAvKiBTREggUGVyaXBoZXJhbCBJZGVudGlmaWNhdGlvbjYgKi8KKyNkZWZpbmUgU0RIX1BJRDcgICAgICAgICAgICAgICAgICAgICAgIDB4RkZDMDM5RUMgLyogU0RIIFBlcmlwaGVyYWwgSWRlbnRpZmljYXRpb243ICovCisKKy8qIFJlbW92YWJsZSBTdG9yYWdlIEludGVyZmFjZSBSZWdpc3RlcnMgKi8KKworI2RlZmluZSBSU0lfUFdSX0NPTlRST0wgICAgICAgICAgICAgICAgMHhGRkMwMzgwMCAvKiBSU0kgUG93ZXIgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSBSU0lfQ0xLX0NPTlRST0wgICAgICAgICAgICAgICAgMHhGRkMwMzgwNCAvKiBSU0kgQ2xvY2sgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSBSU0lfQVJHVU1FTlQgICAgICAgICAgICAgICAgICAgMHhGRkMwMzgwOCAvKiBSU0kgQXJndW1lbnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUlNJX0NPTU1BTkQgICAgICAgICAgICAgICAgICAgIDB4RkZDMDM4MEMgLyogUlNJIENvbW1hbmQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUlNJX1JFU1BfQ01EICAgICAgICAgICAgICAgICAgIDB4RkZDMDM4MTAgLyogUlNJIFJlc3BvbnNlIENvbW1hbmQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUlNJX1JFU1BPTlNFMCAgICAgICAgICAgICAgICAgIDB4RkZDMDM4MTQgLyogUlNJIFJlc3BvbnNlIFJlZ2lzdGVyICovCisjZGVmaW5lIFJTSV9SRVNQT05TRTEgICAgICAgICAgICAgICAgICAweEZGQzAzODE4IC8qIFJTSSBSZXNwb25zZSBSZWdpc3RlciAqLworI2RlZmluZSBSU0lfUkVTUE9OU0UyICAgICAgICAgICAgICAgICAgMHhGRkMwMzgxQyAvKiBSU0kgUmVzcG9uc2UgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUlNJX1JFU1BPTlNFMyAgICAgICAgICAgICAgICAgIDB4RkZDMDM4MjAgLyogUlNJIFJlc3BvbnNlIFJlZ2lzdGVyICovCisjZGVmaW5lIFJTSV9EQVRBX1RJTUVSICAgICAgICAgICAgICAgICAweEZGQzAzODI0IC8qIFJTSSBEYXRhIFRpbWVyIFJlZ2lzdGVyICovCisjZGVmaW5lIFJTSV9EQVRBX0xHVEggICAgICAgICAgICAgICAgICAweEZGQzAzODI4IC8qIFJTSSBEYXRhIExlbmd0aCBSZWdpc3RlciAqLworI2RlZmluZSBSU0lfREFUQV9DT05UUk9MICAgICAgICAgICAgICAgMHhGRkMwMzgyQyAvKiBSU0kgRGF0YSBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIFJTSV9EQVRBX0NOVCAgICAgICAgICAgICAgICAgICAweEZGQzAzODMwIC8qIFJTSSBEYXRhIENvdW50ZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUlNJX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgIDB4RkZDMDM4MzQgLyogUlNJIFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSBSU0lfU1RBVFVTQ0wgICAgICAgICAgICAgICAgICAgMHhGRkMwMzgzOCAvKiBSU0kgU3RhdHVzIENsZWFyIFJlZ2lzdGVyICovCisjZGVmaW5lIFJTSV9NQVNLMCAgICAgICAgICAgICAgICAgICAgICAweEZGQzAzODNDIC8qIFJTSSBJbnRlcnJ1cHQgMCBNYXNrIFJlZ2lzdGVyICovCisjZGVmaW5lIFJTSV9NQVNLMSAgICAgICAgICAgICAgICAgICAgICAweEZGQzAzODQwIC8qIFJTSSBJbnRlcnJ1cHQgMSBNYXNrIFJlZ2lzdGVyICovCisjZGVmaW5lIFJTSV9GSUZPX0NOVCAgICAgICAgICAgICAgICAgICAweEZGQzAzODQ4IC8qIFJTSSBGSUZPIENvdW50ZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUlNJX0NFQVRBX0NPTlRST0wgICAgICAgICAgICAgIDB4RkZDMDM4NEMgLyogUlNJIENFQVRBIFJlZ2lzdGVyICovCisjZGVmaW5lIFJTSV9GSUZPICAgICAgICAgICAgICAgICAgICAgICAweEZGQzAzODgwIC8qIFJTSSBEYXRhIEZJRk8gUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUlNJX0VTVEFUICAgICAgICAgICAgICAgICAgICAgIDB4RkZDMDM4QzAgLyogUlNJIEV4Y2VwdGlvbiBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUlNJX0VNQVNLICAgICAgICAgICAgICAgICAgICAgIDB4RkZDMDM4QzQgLyogUlNJIEV4Y2VwdGlvbiBNYXNrIFJlZ2lzdGVyICovCisjZGVmaW5lIFJTSV9DT05GSUcgICAgICAgICAgICAgICAgICAgICAweEZGQzAzOEM4IC8qIFJTSSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICovCisjZGVmaW5lIFJTSV9SRF9XQUlUX0VOICAgICAgICAgICAgICAgICAweEZGQzAzOENDIC8qIFJTSSBSZWFkIFdhaXQgRW5hYmxlIFJlZ2lzdGVyICovCisjZGVmaW5lIFJTSV9QSUQwICAgICAgICAgICAgICAgICAgICAgICAweEZGQzAzRkUwIC8qIFJTSSBQZXJpcGhlcmFsIElEIFJlZ2lzdGVyIDAgKi8KKyNkZWZpbmUgUlNJX1BJRDEgICAgICAgICAgICAgICAgICAgICAgIDB4RkZDMDNGRTQgLyogUlNJIFBlcmlwaGVyYWwgSUQgUmVnaXN0ZXIgMSAqLworI2RlZmluZSBSU0lfUElEMiAgICAgICAgICAgICAgICAgICAgICAgMHhGRkMwM0ZFOCAvKiBSU0kgUGVyaXBoZXJhbCBJRCBSZWdpc3RlciAyICovCisjZGVmaW5lIFJTSV9QSUQzICAgICAgICAgICAgICAgICAgICAgICAweEZGQzAzRkVDIC8qIFJTSSBQZXJpcGhlcmFsIElEIFJlZ2lzdGVyIDMgKi8KKyNkZWZpbmUgUlNJX1BJRDQgICAgICAgICAgICAgICAgICAgICAgIDB4RkZDMDNGRjAgLyogUlNJIFBlcmlwaGVyYWwgSUQgUmVnaXN0ZXIgNCAqLworI2RlZmluZSBSU0lfUElENSAgICAgICAgICAgICAgICAgICAgICAgMHhGRkMwM0ZGNCAvKiBSU0kgUGVyaXBoZXJhbCBJRCBSZWdpc3RlciA1ICovCisjZGVmaW5lIFJTSV9QSUQ2ICAgICAgICAgICAgICAgICAgICAgICAweEZGQzAzRkY4IC8qIFJTSSBQZXJpcGhlcmFsIElEIFJlZ2lzdGVyIDYgKi8KKyNkZWZpbmUgUlNJX1BJRDcgICAgICAgICAgICAgICAgICAgICAgIDB4RkZDMDNGRkMgLyogUlNJIFBlcmlwaGVyYWwgSUQgUmVnaXN0ZXIgNyAqLworCisjZW5kaWYgLyogX0RFRl9CRjUxNF9IICovCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvaW5jbHVkZS9tYWNoL2RlZkJGNTE2LmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvaW5jbHVkZS9tYWNoL2RlZkJGNTE2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQ5YTI2OQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9pbmNsdWRlL21hY2gvZGVmQkY1MTYuaApAQCAtMCwwICsxLDQ5MCBAQAorLyoKKyAqIEZpbGU6ICAgICAgICAgaW5jbHVkZS9hc20tYmxhY2tmaW4vbWFjaC1iZjUxOC9kZWZCRjUxNi5oCisgKiBCYXNlZCBvbjoKKyAqIEF1dGhvcjoKKyAqCisgKiBDcmVhdGVkOgorICogRGVzY3JpcHRpb246CisgKgorICogUmV2OgorICoKKyAqIE1vZGlmaWVkOgorICoKKyAqIEJ1Z3M6ICAgICAgICAgRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuCisgKiBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICovCisKKyNpZm5kZWYgX0RFRl9CRjUxNl9ICisjZGVmaW5lIF9ERUZfQkY1MTZfSAorCisvKiBJbmNsdWRlIGFsbCBDb3JlIHJlZ2lzdGVycyBhbmQgYml0IGRlZmluaXRpb25zICovCisjaW5jbHVkZSA8YXNtL2RlZl9MUEJsYWNrZmluLmg+CisKKy8qIFNZU1RFTSAmIE1NUiBBRERSRVNTIERFRklOSVRJT05TIEZPUiBBRFNQLUJGNTE2ICovCisKKy8qIEluY2x1ZGUgZGVmQkY1MXhfYmFzZS5oIGZvciB0aGUgc2V0IG9mICNkZWZpbmVzIHRoYXQgYXJlIGNvbW1vbiB0byBhbGwgQURTUC1CRjUxeCBwcm9jZXNzb3JzICovCisjaW5jbHVkZSAiZGVmQkY1MXhfYmFzZS5oIgorCisvKiBUaGUgZm9sbG93aW5nIGFyZSB0aGUgI2RlZmluZXMgbmVlZGVkIGJ5IEFEU1AtQkY1MTYgdGhhdCBhcmUgbm90IGluIHRoZSBjb21tb24gaGVhZGVyICovCisvKiAxMC8xMDAgRXRoZXJuZXQgQ29udHJvbGxlcgkoMHhGRkMwMzAwMCAtIDB4RkZDMDMxRkYpICovCisKKyNkZWZpbmUgRU1BQ19PUE1PREUgICAgICAgICAgICAgMHhGRkMwMzAwMCAgICAgICAvKiBPcGVyYXRpbmcgTW9kZSBSZWdpc3RlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEVNQUNfQUREUkxPICAgICAgICAgICAgIDB4RkZDMDMwMDQgICAgICAgLyogQWRkcmVzcyBMb3cgKDMyIExTQnMpIFJlZ2lzdGVyICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBFTUFDX0FERFJISSAgICAgICAgICAgICAweEZGQzAzMDA4ICAgICAgIC8qIEFkZHJlc3MgSGlnaCAoMTYgTVNCcykgUmVnaXN0ZXIgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19IQVNITE8gICAgICAgICAgICAgMHhGRkMwMzAwQyAgICAgICAvKiBNdWx0aWNhc3QgSGFzaCBUYWJsZSBMb3cgKEJpbnMgMzEtMCkgUmVnaXN0ZXIgICAgICAgICovCisjZGVmaW5lIEVNQUNfSEFTSEhJICAgICAgICAgICAgIDB4RkZDMDMwMTAgICAgICAgLyogTXVsdGljYXN0IEhhc2ggVGFibGUgSGlnaCAoQmlucyA2My0zMikgUmVnaXN0ZXIgICAgICAqLworI2RlZmluZSBFTUFDX1NUQUFERCAgICAgICAgICAgICAweEZGQzAzMDE0ICAgICAgIC8qIFN0YXRpb24gTWFuYWdlbWVudCBBZGRyZXNzIFJlZ2lzdGVyICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19TVEFEQVQgICAgICAgICAgICAgMHhGRkMwMzAxOCAgICAgICAvKiBTdGF0aW9uIE1hbmFnZW1lbnQgRGF0YSBSZWdpc3RlciAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEVNQUNfRkxDICAgICAgICAgICAgICAgIDB4RkZDMDMwMUMgICAgICAgLyogRmxvdyBDb250cm9sIFJlZ2lzdGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBFTUFDX1ZMQU4xICAgICAgICAgICAgICAweEZGQzAzMDIwICAgICAgIC8qIFZMQU4xIFRhZyBSZWdpc3RlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19WTEFOMiAgICAgICAgICAgICAgMHhGRkMwMzAyNCAgICAgICAvKiBWTEFOMiBUYWcgUmVnaXN0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEVNQUNfV0tVUF9DVEwgICAgICAgICAgIDB4RkZDMDMwMkMgICAgICAgLyogV2FrZS1VcCBDb250cm9sL1N0YXR1cyBSZWdpc3RlciAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBFTUFDX1dLVVBfRkZNU0swICAgICAgICAweEZGQzAzMDMwICAgICAgIC8qIFdha2UtVXAgRnJhbWUgRmlsdGVyIDAgQnl0ZSBNYXNrIFJlZ2lzdGVyICAgICAgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19XS1VQX0ZGTVNLMSAgICAgICAgMHhGRkMwMzAzNCAgICAgICAvKiBXYWtlLVVwIEZyYW1lIEZpbHRlciAxIEJ5dGUgTWFzayBSZWdpc3RlciAgICAgICAgICAgICovCisjZGVmaW5lIEVNQUNfV0tVUF9GRk1TSzIgICAgICAgIDB4RkZDMDMwMzggICAgICAgLyogV2FrZS1VcCBGcmFtZSBGaWx0ZXIgMiBCeXRlIE1hc2sgUmVnaXN0ZXIgICAgICAgICAgICAqLworI2RlZmluZSBFTUFDX1dLVVBfRkZNU0szICAgICAgICAweEZGQzAzMDNDICAgICAgIC8qIFdha2UtVXAgRnJhbWUgRmlsdGVyIDMgQnl0ZSBNYXNrIFJlZ2lzdGVyICAgICAgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19XS1VQX0ZGQ01EICAgICAgICAgMHhGRkMwMzA0MCAgICAgICAvKiBXYWtlLVVwIEZyYW1lIEZpbHRlciBDb21tYW5kcyBSZWdpc3RlciAgICAgICAgICAgICAgICovCisjZGVmaW5lIEVNQUNfV0tVUF9GRk9GRiAgICAgICAgIDB4RkZDMDMwNDQgICAgICAgLyogV2FrZS1VcCBGcmFtZSBGaWx0ZXIgT2Zmc2V0cyBSZWdpc3RlciAgICAgICAgICAgICAgICAqLworI2RlZmluZSBFTUFDX1dLVVBfRkZDUkMwICAgICAgICAweEZGQzAzMDQ4ICAgICAgIC8qIFdha2UtVXAgRnJhbWUgRmlsdGVyIDAsMSBDUkMtMTYgUmVnaXN0ZXIgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19XS1VQX0ZGQ1JDMSAgICAgICAgMHhGRkMwMzA0QyAgICAgICAvKiBXYWtlLVVwIEZyYW1lIEZpbHRlciAyLDMgQ1JDLTE2IFJlZ2lzdGVyICAgICAgICAgICAgICovCisKKyNkZWZpbmUgRU1BQ19TWVNDVEwgICAgICAgICAgICAgMHhGRkMwMzA2MCAgICAgICAvKiBFTUFDIFN5c3RlbSBDb250cm9sIFJlZ2lzdGVyICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEVNQUNfU1lTVEFUICAgICAgICAgICAgIDB4RkZDMDMwNjQgICAgICAgLyogRU1BQyBTeXN0ZW0gU3RhdHVzIFJlZ2lzdGVyICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBFTUFDX1JYX1NUQVQgICAgICAgICAgICAweEZGQzAzMDY4ICAgICAgIC8qIFJYIEN1cnJlbnQgRnJhbWUgU3RhdHVzIFJlZ2lzdGVyICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19SWF9TVEtZICAgICAgICAgICAgMHhGRkMwMzA2QyAgICAgICAvKiBSWCBTdGlja3kgRnJhbWUgU3RhdHVzIFJlZ2lzdGVyICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEVNQUNfUlhfSVJRRSAgICAgICAgICAgIDB4RkZDMDMwNzAgICAgICAgLyogUlggRnJhbWUgU3RhdHVzIEludGVycnVwdCBFbmFibGVzIFJlZ2lzdGVyICAgICAgICAgICAqLworI2RlZmluZSBFTUFDX1RYX1NUQVQgICAgICAgICAgICAweEZGQzAzMDc0ICAgICAgIC8qIFRYIEN1cnJlbnQgRnJhbWUgU3RhdHVzIFJlZ2lzdGVyICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19UWF9TVEtZICAgICAgICAgICAgMHhGRkMwMzA3OCAgICAgICAvKiBUWCBTdGlja3kgRnJhbWUgU3RhdHVzIFJlZ2lzdGVyICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEVNQUNfVFhfSVJRRSAgICAgICAgICAgIDB4RkZDMDMwN0MgICAgICAgLyogVFggRnJhbWUgU3RhdHVzIEludGVycnVwdCBFbmFibGVzIFJlZ2lzdGVyICAgICAgICAgICAqLworCisjZGVmaW5lIEVNQUNfTU1DX0NUTCAgICAgICAgICAgIDB4RkZDMDMwODAgICAgICAgLyogTU1DIENvdW50ZXIgQ29udHJvbCBSZWdpc3RlciAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBFTUFDX01NQ19SSVJRUyAgICAgICAgICAweEZGQzAzMDg0ICAgICAgIC8qIE1NQyBSWCBJbnRlcnJ1cHQgU3RhdHVzIFJlZ2lzdGVyICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19NTUNfUklSUUUgICAgICAgICAgMHhGRkMwMzA4OCAgICAgICAvKiBNTUMgUlggSW50ZXJydXB0IEVuYWJsZXMgUmVnaXN0ZXIgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEVNQUNfTU1DX1RJUlFTICAgICAgICAgIDB4RkZDMDMwOEMgICAgICAgLyogTU1DIFRYIEludGVycnVwdCBTdGF0dXMgUmVnaXN0ZXIgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBFTUFDX01NQ19USVJRRSAgICAgICAgICAweEZGQzAzMDkwICAgICAgIC8qIE1NQyBUWCBJbnRlcnJ1cHQgRW5hYmxlcyBSZWdpc3RlciAgICAgICAgICAgICAgICAgICAgKi8KKworI2RlZmluZSBFTUFDX1JYQ19PSyAgICAgICAgICAgICAweEZGQzAzMTAwICAgICAgIC8qIFJYIEZyYW1lIFN1Y2Nlc3NmdWwgQ291bnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19SWENfRkNTICAgICAgICAgICAgMHhGRkMwMzEwNCAgICAgICAvKiBSWCBGcmFtZSBGQ1MgRmFpbHVyZSBDb3VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEVNQUNfUlhDX0FMSUdOICAgICAgICAgIDB4RkZDMDMxMDggICAgICAgLyogUlggQWxpZ25tZW50IEVycm9yIENvdW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBFTUFDX1JYQ19PQ1RFVCAgICAgICAgICAweEZGQzAzMTBDICAgICAgIC8qIFJYIE9jdGV0cyBTdWNjZXNzZnVsbHkgUmVjZWl2ZWQgQ291bnQgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19SWENfRE1BT1ZGICAgICAgICAgMHhGRkMwMzExMCAgICAgICAvKiBJbnRlcm5hbCBNQUMgU3VibGF5ZXIgRXJyb3IgUlggRnJhbWUgQ291bnQgICAgICAgICAgICovCisjZGVmaW5lIEVNQUNfUlhDX1VOSUNTVCAgICAgICAgIDB4RkZDMDMxMTQgICAgICAgLyogVW5pY2FzdCBSWCBGcmFtZSBDb3VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBFTUFDX1JYQ19NVUxUSSAgICAgICAgICAweEZGQzAzMTE4ICAgICAgIC8qIE11bHRpY2FzdCBSWCBGcmFtZSBDb3VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19SWENfQlJPQUQgICAgICAgICAgMHhGRkMwMzExQyAgICAgICAvKiBCcm9hZGNhc3QgUlggRnJhbWUgQ291bnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEVNQUNfUlhDX0xORVJSSSAgICAgICAgIDB4RkZDMDMxMjAgICAgICAgLyogUlggRnJhbWUgSW4gUmFuZ2UgRXJyb3IgQ291bnQgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBFTUFDX1JYQ19MTkVSUk8gICAgICAgICAweEZGQzAzMTI0ICAgICAgIC8qIFJYIEZyYW1lIE91dCBPZiBSYW5nZSBFcnJvciBDb3VudCAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19SWENfTE9ORyAgICAgICAgICAgMHhGRkMwMzEyOCAgICAgICAvKiBSWCBGcmFtZSBUb28gTG9uZyBDb3VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEVNQUNfUlhDX01BQ0NUTCAgICAgICAgIDB4RkZDMDMxMkMgICAgICAgLyogTUFDIENvbnRyb2wgUlggRnJhbWUgQ291bnQgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBFTUFDX1JYQ19PUENPREUgICAgICAgICAweEZGQzAzMTMwICAgICAgIC8qIFVuc3VwcG9ydGVkIE9wLUNvZGUgUlggRnJhbWUgQ291bnQgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19SWENfUEFVU0UgICAgICAgICAgMHhGRkMwMzEzNCAgICAgICAvKiBNQUMgQ29udHJvbCBQYXVzZSBSWCBGcmFtZSBDb3VudCAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEVNQUNfUlhDX0FMTEZSTSAgICAgICAgIDB4RkZDMDMxMzggICAgICAgLyogT3ZlcmFsbCBSWCBGcmFtZSBDb3VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBFTUFDX1JYQ19BTExPQ1QgICAgICAgICAweEZGQzAzMTNDICAgICAgIC8qIE92ZXJhbGwgUlggT2N0ZXQgQ291bnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19SWENfVFlQRUQgICAgICAgICAgMHhGRkMwMzE0MCAgICAgICAvKiBUeXBlL0xlbmd0aCBDb25zaXN0ZW50IFJYIEZyYW1lIENvdW50ICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEVNQUNfUlhDX1NIT1JUICAgICAgICAgIDB4RkZDMDMxNDQgICAgICAgLyogUlggRnJhbWUgRnJhZ21lbnQgQ291bnQgLSBCeXRlIENvdW50IHggPCA2NCAgICAgICAgICAqLworI2RlZmluZSBFTUFDX1JYQ19FUTY0ICAgICAgICAgICAweEZGQzAzMTQ4ICAgICAgIC8qIEdvb2QgUlggRnJhbWUgQ291bnQgLSBCeXRlIENvdW50IHggPSA2NCAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19SWENfTFQxMjggICAgICAgICAgMHhGRkMwMzE0QyAgICAgICAvKiBHb29kIFJYIEZyYW1lIENvdW50IC0gQnl0ZSBDb3VudCAgNjQgPCB4IDwgMTI4ICAgICAgICovCisjZGVmaW5lIEVNQUNfUlhDX0xUMjU2ICAgICAgICAgIDB4RkZDMDMxNTAgICAgICAgLyogR29vZCBSWCBGcmFtZSBDb3VudCAtIEJ5dGUgQ291bnQgMTI4IDw9IHggPCAyNTYgICAgICAqLworI2RlZmluZSBFTUFDX1JYQ19MVDUxMiAgICAgICAgICAweEZGQzAzMTU0ICAgICAgIC8qIEdvb2QgUlggRnJhbWUgQ291bnQgLSBCeXRlIENvdW50IDI1NiA8PSB4IDwgNTEyICAgICAgKi8KKyNkZWZpbmUgRU1BQ19SWENfTFQxMDI0ICAgICAgICAgMHhGRkMwMzE1OCAgICAgICAvKiBHb29kIFJYIEZyYW1lIENvdW50IC0gQnl0ZSBDb3VudCA1MTIgPD0geCA8IDEwMjQgICAgICovCisjZGVmaW5lIEVNQUNfUlhDX0dFMTAyNCAgICAgICAgIDB4RkZDMDMxNUMgICAgICAgLyogR29vZCBSWCBGcmFtZSBDb3VudCAtIEJ5dGUgQ291bnQgeCA+PSAxMDI0ICAgICAgICAgICAqLworCisjZGVmaW5lIEVNQUNfVFhDX09LICAgICAgICAgICAgIDB4RkZDMDMxODAgICAgICAgLyogVFggRnJhbWUgU3VjY2Vzc2Z1bCBDb3VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19UWENfMUNPTCAgICAgICAgICAgMHhGRkMwMzE4NCAgICAgICAvKiBUWCBGcmFtZXMgU3VjY2Vzc2Z1bCBBZnRlciBTaW5nbGUgQ29sbGlzaW9uIENvdW50ICAgICAqLworI2RlZmluZSBFTUFDX1RYQ19HVDFDT0wgICAgICAgICAweEZGQzAzMTg4ICAgICAgIC8qIFRYIEZyYW1lcyBTdWNjZXNzZnVsIEFmdGVyIE11bHRpcGxlIENvbGxpc2lvbnMgQ291bnQgICovCisjZGVmaW5lIEVNQUNfVFhDX09DVEVUICAgICAgICAgIDB4RkZDMDMxOEMgICAgICAgLyogVFggT2N0ZXRzIFN1Y2Nlc3NmdWxseSBSZWNlaXZlZCBDb3VudCAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19UWENfREVGRVIgICAgICAgICAgMHhGRkMwMzE5MCAgICAgICAvKiBUWCBGcmFtZSBEZWxheWVkIER1ZSBUbyBCdXN5IENvdW50ICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBFTUFDX1RYQ19MQVRFQ0wgICAgICAgICAweEZGQzAzMTk0ICAgICAgIC8qIExhdGUgVFggQ29sbGlzaW9ucyBDb3VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEVNQUNfVFhDX1hTX0NPTCAgICAgICAgIDB4RkZDMDMxOTggICAgICAgLyogVFggRnJhbWUgRmFpbGVkIER1ZSBUbyBFeGNlc3NpdmUgQ29sbGlzaW9ucyBDb3VudCAgICAgKi8KKyNkZWZpbmUgRU1BQ19UWENfRE1BVU5EICAgICAgICAgMHhGRkMwMzE5QyAgICAgICAvKiBJbnRlcm5hbCBNQUMgU3VibGF5ZXIgRXJyb3IgVFggRnJhbWUgQ291bnQgICAgICAgICAgICAqLworI2RlZmluZSBFTUFDX1RYQ19DUlNFUlIgICAgICAgICAweEZGQzAzMUEwICAgICAgIC8qIENhcnJpZXIgU2Vuc2UgRGVhc3NlcnRlZCBEdXJpbmcgVFggRnJhbWUgQ291bnQgICAgICAgICovCisjZGVmaW5lIEVNQUNfVFhDX1VOSUNTVCAgICAgICAgIDB4RkZDMDMxQTQgICAgICAgLyogVW5pY2FzdCBUWCBGcmFtZSBDb3VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19UWENfTVVMVEkgICAgICAgICAgMHhGRkMwMzFBOCAgICAgICAvKiBNdWx0aWNhc3QgVFggRnJhbWUgQ291bnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBFTUFDX1RYQ19CUk9BRCAgICAgICAgICAweEZGQzAzMUFDICAgICAgIC8qIEJyb2FkY2FzdCBUWCBGcmFtZSBDb3VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEVNQUNfVFhDX1hTX0RGUiAgICAgICAgIDB4RkZDMDMxQjAgICAgICAgLyogVFggRnJhbWVzIFdpdGggRXhjZXNzaXZlIERlZmVycmFsIENvdW50ICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19UWENfTUFDQ1RMICAgICAgICAgMHhGRkMwMzFCNCAgICAgICAvKiBNQUMgQ29udHJvbCBUWCBGcmFtZSBDb3VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBFTUFDX1RYQ19BTExGUk0gICAgICAgICAweEZGQzAzMUI4ICAgICAgIC8qIE92ZXJhbGwgVFggRnJhbWUgQ291bnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEVNQUNfVFhDX0FMTE9DVCAgICAgICAgIDB4RkZDMDMxQkMgICAgICAgLyogT3ZlcmFsbCBUWCBPY3RldCBDb3VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19UWENfRVE2NCAgICAgICAgICAgMHhGRkMwMzFDMCAgICAgICAvKiBHb29kIFRYIEZyYW1lIENvdW50IC0gQnl0ZSBDb3VudCB4ID0gNjQgICAgICAgICAgICAgICAqLworI2RlZmluZSBFTUFDX1RYQ19MVDEyOCAgICAgICAgICAweEZGQzAzMUM0ICAgICAgIC8qIEdvb2QgVFggRnJhbWUgQ291bnQgLSBCeXRlIENvdW50ICA2NCA8IHggPCAxMjggICAgICAgICovCisjZGVmaW5lIEVNQUNfVFhDX0xUMjU2ICAgICAgICAgIDB4RkZDMDMxQzggICAgICAgLyogR29vZCBUWCBGcmFtZSBDb3VudCAtIEJ5dGUgQ291bnQgMTI4IDw9IHggPCAyNTYgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19UWENfTFQ1MTIgICAgICAgICAgMHhGRkMwMzFDQyAgICAgICAvKiBHb29kIFRYIEZyYW1lIENvdW50IC0gQnl0ZSBDb3VudCAyNTYgPD0geCA8IDUxMiAgICAgICAqLworI2RlZmluZSBFTUFDX1RYQ19MVDEwMjQgICAgICAgICAweEZGQzAzMUQwICAgICAgIC8qIEdvb2QgVFggRnJhbWUgQ291bnQgLSBCeXRlIENvdW50IDUxMiA8PSB4IDwgMTAyNCAgICAgICovCisjZGVmaW5lIEVNQUNfVFhDX0dFMTAyNCAgICAgICAgIDB4RkZDMDMxRDQgICAgICAgLyogR29vZCBUWCBGcmFtZSBDb3VudCAtIEJ5dGUgQ291bnQgeCA+PSAxMDI0ICAgICAgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19UWENfQUJPUlQgICAgICAgICAgMHhGRkMwMzFEOCAgICAgICAvKiBUb3RhbCBUWCBGcmFtZXMgQWJvcnRlZCBDb3VudCAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisvKiBMaXN0aW5nIGZvciBJRUVFLVN1cHBvcnRlZCBDb3VudCBSZWdpc3RlcnMgKi8KKworI2RlZmluZSBGcmFtZXNSZWNlaXZlZE9LICAgICAgICAgICAgICAgIEVNQUNfUlhDX09LICAgICAgICAvKiBSWCBGcmFtZSBTdWNjZXNzZnVsIENvdW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEZyYW1lQ2hlY2tTZXF1ZW5jZUVycm9ycyAgICAgICAgRU1BQ19SWENfRkNTICAgICAgIC8qIFJYIEZyYW1lIEZDUyBGYWlsdXJlIENvdW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQWxpZ25tZW50RXJyb3JzICAgICAgICAgICAgICAgICBFTUFDX1JYQ19BTElHTiAgICAgLyogUlggQWxpZ25tZW50IEVycm9yIENvdW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBPY3RldHNSZWNlaXZlZE9LICAgICAgICAgICAgICAgIEVNQUNfUlhDX09DVEVUICAgICAvKiBSWCBPY3RldHMgU3VjY2Vzc2Z1bGx5IFJlY2VpdmVkIENvdW50ICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEZyYW1lc0xvc3REdWVUb0ludE1BQ1JjdkVycm9yICAgRU1BQ19SWENfRE1BT1ZGICAgIC8qIEludGVybmFsIE1BQyBTdWJsYXllciBFcnJvciBSWCBGcmFtZSBDb3VudCAgICAgICAgICAgKi8KKyNkZWZpbmUgVW5pY2FzdEZyYW1lc1JlY2VpdmVkT0sgICAgICAgICBFTUFDX1JYQ19VTklDU1QgICAgLyogVW5pY2FzdCBSWCBGcmFtZSBDb3VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBNdWx0aWNhc3RGcmFtZXNSZWNlaXZlZE9LICAgICAgIEVNQUNfUlhDX01VTFRJICAgICAvKiBNdWx0aWNhc3QgUlggRnJhbWUgQ291bnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEJyb2FkY2FzdEZyYW1lc1JlY2VpdmVkT0sgICAgICAgRU1BQ19SWENfQlJPQUQgICAgIC8qIEJyb2FkY2FzdCBSWCBGcmFtZSBDb3VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSW5SYW5nZUxlbmd0aEVycm9ycyAgICAgICAgICAgICBFTUFDX1JYQ19MTkVSUkkgICAgLyogUlggRnJhbWUgSW4gUmFuZ2UgRXJyb3IgQ291bnQgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBPdXRPZlJhbmdlTGVuZ3RoRmllbGQgICAgICAgICAgIEVNQUNfUlhDX0xORVJSTyAgICAvKiBSWCBGcmFtZSBPdXQgT2YgUmFuZ2UgRXJyb3IgQ291bnQgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEZyYW1lVG9vTG9uZ0Vycm9ycyAgICAgICAgICAgICAgRU1BQ19SWENfTE9ORyAgICAgIC8qIFJYIEZyYW1lIFRvbyBMb25nIENvdW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTUFDQ29udHJvbEZyYW1lc1JlY2VpdmVkICAgICAgICBFTUFDX1JYQ19NQUNDVEwgICAgLyogTUFDIENvbnRyb2wgUlggRnJhbWUgQ291bnQgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBVbnN1cHBvcnRlZE9wY29kZXNSZWNlaXZlZCAgICAgIEVNQUNfUlhDX09QQ09ERSAgICAvKiBVbnN1cHBvcnRlZCBPcC1Db2RlIFJYIEZyYW1lIENvdW50ICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFBBVVNFTUFDQ3RybEZyYW1lc1JlY2VpdmVkICAgICAgRU1BQ19SWENfUEFVU0UgICAgIC8qIE1BQyBDb250cm9sIFBhdXNlIFJYIEZyYW1lIENvdW50ICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRnJhbWVzUmVjZWl2ZWRBbGwgICAgICAgICAgICAgICBFTUFDX1JYQ19BTExGUk0gICAgLyogT3ZlcmFsbCBSWCBGcmFtZSBDb3VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBPY3RldHNSZWNlaXZlZEFsbCAgICAgICAgICAgICAgIEVNQUNfUlhDX0FMTE9DVCAgICAvKiBPdmVyYWxsIFJYIE9jdGV0IENvdW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFR5cGVkRnJhbWVzUmVjZWl2ZWQgICAgICAgICAgICAgRU1BQ19SWENfVFlQRUQgICAgIC8qIFR5cGUvTGVuZ3RoIENvbnNpc3RlbnQgUlggRnJhbWUgQ291bnQgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRnJhbWVzTGVuTHQ2NFJlY2VpdmVkICAgICAgICAgICBFTUFDX1JYQ19TSE9SVCAgICAgLyogUlggRnJhbWUgRnJhZ21lbnQgQ291bnQgLSBCeXRlIENvdW50IHggPCA2NCAgICAgICAgICAqLworI2RlZmluZSBGcmFtZXNMZW5FcTY0UmVjZWl2ZWQgICAgICAgICAgIEVNQUNfUlhDX0VRNjQgICAgICAvKiBHb29kIFJYIEZyYW1lIENvdW50IC0gQnl0ZSBDb3VudCB4ID0gNjQgICAgICAgICAgICAgICovCisjZGVmaW5lIEZyYW1lc0xlbjY1XzEyN1JlY2VpdmVkICAgICAgICAgRU1BQ19SWENfTFQxMjggICAgIC8qIEdvb2QgUlggRnJhbWUgQ291bnQgLSBCeXRlIENvdW50ICA2NCA8IHggPCAxMjggICAgICAgKi8KKyNkZWZpbmUgRnJhbWVzTGVuMTI4XzI1NVJlY2VpdmVkICAgICAgICBFTUFDX1JYQ19MVDI1NiAgICAgLyogR29vZCBSWCBGcmFtZSBDb3VudCAtIEJ5dGUgQ291bnQgMTI4IDw9IHggPCAyNTYgICAgICAqLworI2RlZmluZSBGcmFtZXNMZW4yNTZfNTExUmVjZWl2ZWQgICAgICAgIEVNQUNfUlhDX0xUNTEyICAgICAvKiBHb29kIFJYIEZyYW1lIENvdW50IC0gQnl0ZSBDb3VudCAyNTYgPD0geCA8IDUxMiAgICAgICovCisjZGVmaW5lIEZyYW1lc0xlbjUxMl8xMDIzUmVjZWl2ZWQgICAgICAgRU1BQ19SWENfTFQxMDI0ICAgIC8qIEdvb2QgUlggRnJhbWUgQ291bnQgLSBCeXRlIENvdW50IDUxMiA8PSB4IDwgMTAyNCAgICAgKi8KKyNkZWZpbmUgRnJhbWVzTGVuMTAyNF9NYXhSZWNlaXZlZCAgICAgICBFTUFDX1JYQ19HRTEwMjQgICAgLyogR29vZCBSWCBGcmFtZSBDb3VudCAtIEJ5dGUgQ291bnQgeCA+PSAxMDI0ICAgICAgICAgICAqLworCisjZGVmaW5lIEZyYW1lc1RyYW5zbWl0dGVkT0sgICAgICAgICAgICAgRU1BQ19UWENfT0sgICAgICAgIC8qIFRYIEZyYW1lIFN1Y2Nlc3NmdWwgQ291bnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgU2luZ2xlQ29sbGlzaW9uRnJhbWVzICAgICAgICAgICBFTUFDX1RYQ18xQ09MICAgICAgLyogVFggRnJhbWVzIFN1Y2Nlc3NmdWwgQWZ0ZXIgU2luZ2xlIENvbGxpc2lvbiBDb3VudCAgICAqLworI2RlZmluZSBNdWx0aXBsZUNvbGxpc2lvbkZyYW1lcyAgICAgICAgIEVNQUNfVFhDX0dUMUNPTCAgICAvKiBUWCBGcmFtZXMgU3VjY2Vzc2Z1bCBBZnRlciBNdWx0aXBsZSBDb2xsaXNpb25zIENvdW50ICovCisjZGVmaW5lIE9jdGV0c1RyYW5zbWl0dGVkT0sgICAgICAgICAgICAgRU1BQ19UWENfT0NURVQgICAgIC8qIFRYIE9jdGV0cyBTdWNjZXNzZnVsbHkgUmVjZWl2ZWQgQ291bnQgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRnJhbWVzV2l0aERlZmVycmVkWG1pc3Npb25zICAgICBFTUFDX1RYQ19ERUZFUiAgICAgLyogVFggRnJhbWUgRGVsYXllZCBEdWUgVG8gQnVzeSBDb3VudCAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMYXRlQ29sbGlzaW9ucyAgICAgICAgICAgICAgICAgIEVNQUNfVFhDX0xBVEVDTCAgICAvKiBMYXRlIFRYIENvbGxpc2lvbnMgQ291bnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEZyYW1lc0Fib3J0ZWREdWVUb1hTQ29sbHMgICAgICAgRU1BQ19UWENfWFNfQ09MICAgIC8qIFRYIEZyYW1lIEZhaWxlZCBEdWUgVG8gRXhjZXNzaXZlIENvbGxpc2lvbnMgQ291bnQgICAgKi8KKyNkZWZpbmUgRnJhbWVzTG9zdER1ZVRvSW50TWFjWG1pdEVycm9yICBFTUFDX1RYQ19ETUFVTkQgICAgLyogSW50ZXJuYWwgTUFDIFN1YmxheWVyIEVycm9yIFRYIEZyYW1lIENvdW50ICAgICAgICAgICAqLworI2RlZmluZSBDYXJyaWVyU2Vuc2VFcnJvcnMgICAgICAgICAgICAgIEVNQUNfVFhDX0NSU0VSUiAgICAvKiBDYXJyaWVyIFNlbnNlIERlYXNzZXJ0ZWQgRHVyaW5nIFRYIEZyYW1lIENvdW50ICAgICAgICovCisjZGVmaW5lIFVuaWNhc3RGcmFtZXNYbWl0dGVkT0sgICAgICAgICAgRU1BQ19UWENfVU5JQ1NUICAgIC8qIFVuaWNhc3QgVFggRnJhbWUgQ291bnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTXVsdGljYXN0RnJhbWVzWG1pdHRlZE9LICAgICAgICBFTUFDX1RYQ19NVUxUSSAgICAgLyogTXVsdGljYXN0IFRYIEZyYW1lIENvdW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBCcm9hZGNhc3RGcmFtZXNYbWl0dGVkT0sgICAgICAgIEVNQUNfVFhDX0JST0FEICAgICAvKiBCcm9hZGNhc3QgVFggRnJhbWUgQ291bnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEZyYW1lc1dpdGhFeGNlc3NpdmVEZWZlcnJhbCAgICAgRU1BQ19UWENfWFNfREZSICAgIC8qIFRYIEZyYW1lcyBXaXRoIEV4Y2Vzc2l2ZSBEZWZlcnJhbCBDb3VudCAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTUFDQ29udHJvbEZyYW1lc1RyYW5zbWl0dGVkICAgICBFTUFDX1RYQ19NQUNDVEwgICAgLyogTUFDIENvbnRyb2wgVFggRnJhbWUgQ291bnQgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBGcmFtZXNUcmFuc21pdHRlZEFsbCAgICAgICAgICAgIEVNQUNfVFhDX0FMTEZSTSAgICAvKiBPdmVyYWxsIFRYIEZyYW1lIENvdW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE9jdGV0c1RyYW5zbWl0dGVkQWxsICAgICAgICAgICAgRU1BQ19UWENfQUxMT0NUICAgIC8qIE92ZXJhbGwgVFggT2N0ZXQgQ291bnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRnJhbWVzTGVuRXE2NFRyYW5zbWl0dGVkICAgICAgICBFTUFDX1RYQ19FUTY0ICAgICAgLyogR29vZCBUWCBGcmFtZSBDb3VudCAtIEJ5dGUgQ291bnQgeCA9IDY0ICAgICAgICAgICAgICAqLworI2RlZmluZSBGcmFtZXNMZW42NV8xMjdUcmFuc21pdHRlZCAgICAgIEVNQUNfVFhDX0xUMTI4ICAgICAvKiBHb29kIFRYIEZyYW1lIENvdW50IC0gQnl0ZSBDb3VudCAgNjQgPCB4IDwgMTI4ICAgICAgICovCisjZGVmaW5lIEZyYW1lc0xlbjEyOF8yNTVUcmFuc21pdHRlZCAgICAgRU1BQ19UWENfTFQyNTYgICAgIC8qIEdvb2QgVFggRnJhbWUgQ291bnQgLSBCeXRlIENvdW50IDEyOCA8PSB4IDwgMjU2ICAgICAgKi8KKyNkZWZpbmUgRnJhbWVzTGVuMjU2XzUxMVRyYW5zbWl0dGVkICAgICBFTUFDX1RYQ19MVDUxMiAgICAgLyogR29vZCBUWCBGcmFtZSBDb3VudCAtIEJ5dGUgQ291bnQgMjU2IDw9IHggPCA1MTIgICAgICAqLworI2RlZmluZSBGcmFtZXNMZW41MTJfMTAyM1RyYW5zbWl0dGVkICAgIEVNQUNfVFhDX0xUMTAyNCAgICAvKiBHb29kIFRYIEZyYW1lIENvdW50IC0gQnl0ZSBDb3VudCA1MTIgPD0geCA8IDEwMjQgICAgICovCisjZGVmaW5lIEZyYW1lc0xlbjEwMjRfTWF4VHJhbnNtaXR0ZWQgICAgRU1BQ19UWENfR0UxMDI0ICAgIC8qIEdvb2QgVFggRnJhbWUgQ291bnQgLSBCeXRlIENvdW50IHggPj0gMTAyNCAgICAgICAgICAgKi8KKyNkZWZpbmUgVHhBYm9ydGVkRnJhbWVzICAgICAgICAgICAgICAgICBFTUFDX1RYQ19BQk9SVCAgICAgLyogVG90YWwgVFggRnJhbWVzIEFib3J0ZWQgQ291bnQgICAgICAgICAgICAgICAgICAgICAgICAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqIFN5c3RlbSBNTVIgUmVnaXN0ZXIgQml0cyBBbmQgTWFjcm9zCisqKgorKiogRGlzY2xhaW1lcjoJQWxsIG1hY3JvcyBhcmUgaW50ZW5kZWQgdG8gbWFrZSBDIGFuZCBBc3NlbWJseSBjb2RlIG1vcmUgcmVhZGFibGUuCisqKgkJCQlVc2UgdGhlc2UgbWFjcm9zIGNhcmVmdWxseSwgYXMgYW55IHRoYXQgZG8gbGVmdCBzaGlmdHMgZm9yIGZpZWxkCisqKgkJCQlkZXBvc2l0aW5nIHdpbGwgcmVzdWx0IGluIHRoZSBsb3dlciBvcmRlciBiaXRzIGJlaW5nIGRlc3Ryb3llZC4gIEFueQorKioJCQkJbWFjcm8gdGhhdCBzaGlmdHMgbGVmdCB0byBwcm9wZXJseSBwb3NpdGlvbiB0aGUgYml0LWZpZWxkIHNob3VsZCBiZQorKioJCQkJdXNlZCBhcyBwYXJ0IG9mIGFuIE9SIHRvIGluaXRpYWxpemUgYSByZWdpc3RlciBhbmQgTk9UIGFzIGEgZHluYW1pYworKioJCQkJbW9kaWZpZXIgVU5MRVNTIHRoZSBsb3dlciBvcmRlciBiaXRzIGFyZSBzYXZlZCBhbmQgT1JlZCBiYWNrIGluIHdoZW4KKyoqCQkJCXRoZSBtYWNybyBpcyB1c2VkLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAgRVRIRVJORVQgMTAvMTAwIENPTlRST0xMRVIgTUFTS1MgICoqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogRU1BQ19PUE1PREUgTWFza3MgKi8KKworI2RlZmluZQlSRSAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMSAgICAgLyogUmVjZWl2ZXIgRW5hYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJQVNUUCAgICAgICAgICAgICAgIDB4MDAwMDAwMDIgICAgIC8qIEVuYWJsZSBBdXRvbWF0aWMgUGFkIFN0cmlwcGluZyBPbiBSWCBGcmFtZXMgICAgICAgICovCisjZGVmaW5lCUhVICAgICAgICAgICAgICAgICAweDAwMDAwMDEwICAgICAvKiBIYXNoIEZpbHRlciBVbmljYXN0IEFkZHJlc3MgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlITSAgICAgICAgICAgICAgICAgMHgwMDAwMDAyMCAgICAgLyogSGFzaCBGaWx0ZXIgTXVsdGljYXN0IEFkZHJlc3MgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJUEFNICAgICAgICAgICAgICAgIDB4MDAwMDAwNDAgICAgIC8qIFBhc3MtQWxsLU11bHRpY2FzdCBNb2RlIEVuYWJsZSAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVBSICAgICAgICAgICAgICAgICAweDAwMDAwMDgwICAgICAvKiBQcm9taXNjdW91cyBNb2RlIEVuYWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlJRkUgICAgICAgICAgICAgICAgMHgwMDAwMDEwMCAgICAgLyogSW52ZXJzZSBGaWx0ZXJpbmcgRW5hYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJREJGICAgICAgICAgICAgICAgIDB4MDAwMDAyMDAgICAgIC8qIERpc2FibGUgQnJvYWRjYXN0IEZyYW1lIFJlY2VwdGlvbiAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVBCRiAgICAgICAgICAgICAgICAweDAwMDAwNDAwICAgICAvKiBQYXNzIEJhZCBGcmFtZXMgRW5hYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlQU0YgICAgICAgICAgICAgICAgMHgwMDAwMDgwMCAgICAgLyogUGFzcyBTaG9ydCBGcmFtZXMgRW5hYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJUkFGICAgICAgICAgICAgICAgIDB4MDAwMDEwMDAgICAgIC8qIFJlY2VpdmUtQWxsIE1vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVRFICAgICAgICAgICAgICAgICAweDAwMDEwMDAwICAgICAvKiBUcmFuc21pdHRlciBFbmFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlEVFhQQUQgICAgICAgICAgICAgMHgwMDAyMDAwMCAgICAgLyogRGlzYWJsZSBBdXRvbWF0aWMgVFggUGFkZGluZyAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJRFRYQ1JDICAgICAgICAgICAgIDB4MDAwNDAwMDAgICAgIC8qIERpc2FibGUgQXV0b21hdGljIFRYIENSQyBHZW5lcmF0aW9uICAgICAgICAgICAgICAgICovCisjZGVmaW5lCURDICAgICAgICAgICAgICAgICAweDAwMDgwMDAwICAgICAvKiBEZWZlcnJhbCBDaGVjayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlCT0xNVCAgICAgICAgICAgICAgMHgwMDMwMDAwMCAgICAgLyogQmFjay1PZmYgTGltaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJQk9MTVRfMTAgICAgICAgICAgIDB4MDAwMDAwMDAgICAgIC8qCQkxMC1iaXQgcmFuZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJQk9MTVRfOCAgICAgICAgICAgIDB4MDAxMDAwMDAgICAgIC8qCQk4LWJpdCByYW5nZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJQk9MTVRfNCAgICAgICAgICAgIDB4MDAyMDAwMDAgICAgIC8qCQk0LWJpdCByYW5nZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJQk9MTVRfMSAgICAgICAgICAgIDB4MDAzMDAwMDAgICAgIC8qCQkxLWJpdCByYW5nZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJRFJUWSAgICAgICAgICAgICAgIDB4MDA0MDAwMDAgICAgIC8qIERpc2FibGUgVFggUmV0cnkgT24gQ29sbGlzaW9uICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCUxDVFJFICAgICAgICAgICAgICAweDAwODAwMDAwICAgICAvKiBFbmFibGUgVFggUmV0cnkgT24gTGF0ZSBDb2xsaXNpb24gICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlSTUlJICAgICAgICAgICAgICAgMHgwMTAwMDAwMCAgICAgLyogUk1JSS9NSUkqIE1vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJUk1JSV8xMCAgICAgICAgICAgIDB4MDIwMDAwMDAgICAgIC8qIFNwZWVkIFNlbGVjdCBmb3IgUk1JSSBQb3J0ICgxME1CaXQvMTAwTUJpdCopICAgICAgICovCisjZGVmaW5lCUZETU9ERSAgICAgICAgICAgICAweDA0MDAwMDAwICAgICAvKiBEdXBsZXggTW9kZSBFbmFibGUgKEZ1bGwvSGFsZiopICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlMQiAgICAgICAgICAgICAgICAgMHgwODAwMDAwMCAgICAgLyogSW50ZXJuYWwgTG9vcGJhY2sgRW5hYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJRFJPICAgICAgICAgICAgICAgIDB4MTAwMDAwMDAgICAgIC8qIERpc2FibGUgUmVjZWl2ZSBPd24gRnJhbWVzIChIYWxmLUR1cGxleCBNb2RlKSAgICAgICovCisKKy8qIEVNQUNfU1RBQUREIE1hc2tzICovCisKKyNkZWZpbmUJU1RBQlVTWSAgICAgICAgICAgIDB4MDAwMDAwMDEgICAgIC8qIEluaXRpYXRlIFN0YXRpb24gTWd0IFJlZyBBY2Nlc3MgLyBTVEEgQnVzeSBTdGF0ICAgICovCisjZGVmaW5lCVNUQU9QICAgICAgICAgICAgICAweDAwMDAwMDAyICAgICAvKiBTdGF0aW9uIE1hbmFnZW1lbnQgT3BlcmF0aW9uIENvZGUgKFdyaXRlL1JlYWQqKSAgICAqLworI2RlZmluZQlTVEFESVNQUkUgICAgICAgICAgMHgwMDAwMDAwNCAgICAgLyogRGlzYWJsZSBQcmVhbWJsZSBHZW5lcmF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJU1RBSUUgICAgICAgICAgICAgIDB4MDAwMDAwMDggICAgIC8qIFN0YXRpb24gTWd0LiBUcmFuc2ZlciBEb25lIEludGVycnVwdCBFbmFibGUgICAgICAgICovCisjZGVmaW5lCVJFR0FEICAgICAgICAgICAgICAweDAwMDAwN0MwICAgICAvKiBTVEEgUmVnaXN0ZXIgQWRkcmVzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlQSFlBRCAgICAgICAgICAgICAgMHgwMDAwRjgwMCAgICAgLyogUEhZIERldmljZSBBZGRyZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworI2RlZmluZQlTRVRfUkVHQUQoeCkgKCgoeCkmMHgxRik8PCAgNiApICAgLyogU2V0IFNUQSBSZWdpc3RlciBBZGRyZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJU0VUX1BIWUFEKHgpICgoKHgpJjB4MUYpPDwgMTEgKSAgIC8qIFNldCBQSFkgRGV2aWNlIEFkZHJlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKy8qIEVNQUNfU1RBREFUIE1hc2sgKi8KKworI2RlZmluZQlTVEFEQVRBICAgICAgICAgICAgMHgwMDAwRkZGRiAgICAgLyogU3RhdGlvbiBNYW5hZ2VtZW50IERhdGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworLyogRU1BQ19GTEMgTWFza3MgKi8KKworI2RlZmluZQlGTENCVVNZICAgICAgICAgICAgMHgwMDAwMDAwMSAgICAgLyogU2VuZCBGbG93IEN0cmwgRnJhbWUgLyBGbG93IEN0cmwgQnVzeSBTdGF0dXMgICAgICAgKi8KKyNkZWZpbmUJRkxDRSAgICAgICAgICAgICAgIDB4MDAwMDAwMDIgICAgIC8qIEZsb3cgQ29udHJvbCBFbmFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVBDRiAgICAgICAgICAgICAgICAweDAwMDAwMDA0ICAgICAvKiBQYXNzIENvbnRyb2wgRnJhbWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlCS1BSU0VOICAgICAgICAgICAgMHgwMDAwMDAwOCAgICAgLyogRW5hYmxlIEJhY2twcmVzc3VyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJRkxDUEFVU0UgICAgICAgICAgIDB4RkZGRjAwMDAgICAgIC8qIFBhdXNlIFRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyNkZWZpbmUJU0VUX0ZMQ1BBVVNFKHgpICgoKHgpJjB4RkZGRik8PCAxNikgLyogU2V0IFBhdXNlIFRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKy8qIEVNQUNfV0tVUF9DVEwgTWFza3MgKi8KKworI2RlZmluZQlDQVBXS0ZSTSAgICAgICAgICAgMHgwMDAwMDAwMSAgICAvKiBDYXB0dXJlIFdha2UtVXAgRnJhbWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJTVBLRSAgICAgICAgICAgICAgIDB4MDAwMDAwMDIgICAgLyogTWFnaWMgUGFja2V0IEVuYWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVJXS0UgICAgICAgICAgICAgICAweDAwMDAwMDA0ICAgIC8qIFJlbW90ZSBXYWtlLVVwIEZyYW1lIEVuYWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlHVVdLRSAgICAgICAgICAgICAgMHgwMDAwMDAwOCAgICAvKiBHbG9iYWwgVW5pY2FzdCBXYWtlIEVuYWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJTVBLUyAgICAgICAgICAgICAgIDB4MDAwMDAwMjAgICAgLyogTWFnaWMgUGFja2V0IFJlY2VpdmVkIFN0YXR1cyAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVJXS1MgICAgICAgICAgICAgICAweDAwMDAwRjAwICAgIC8qIFdha2UtVXAgRnJhbWUgUmVjZWl2ZWQgU3RhdHVzLCBGaWx0ZXJzIDM6MCAgICAgICAgICAqLworCisvKiBFTUFDX1dLVVBfRkZDTUQgTWFza3MgKi8KKworI2RlZmluZQlXRjBfRSAgICAgICAgICAgICAgMHgwMDAwMDAwMSAgICAvKiBFbmFibGUgV2FrZS1VcCBGaWx0ZXIgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVdGMF9UICAgICAgICAgICAgICAweDAwMDAwMDA4ICAgIC8qIFdha2UtVXAgRmlsdGVyIDAgQWRkciBUeXBlIChNdWx0aWNhc3QvVW5pY2FzdCopICAgICAgKi8KKyNkZWZpbmUJV0YxX0UgICAgICAgICAgICAgIDB4MDAwMDAxMDAgICAgLyogRW5hYmxlIFdha2UtVXAgRmlsdGVyIDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlXRjFfVCAgICAgICAgICAgICAgMHgwMDAwMDgwMCAgICAvKiBXYWtlLVVwIEZpbHRlciAxIEFkZHIgVHlwZSAoTXVsdGljYXN0L1VuaWNhc3QqKSAgICAgICovCisjZGVmaW5lCVdGMl9FICAgICAgICAgICAgICAweDAwMDEwMDAwICAgIC8qIEVuYWJsZSBXYWtlLVVwIEZpbHRlciAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJV0YyX1QgICAgICAgICAgICAgIDB4MDAwODAwMDAgICAgLyogV2FrZS1VcCBGaWx0ZXIgMiBBZGRyIFR5cGUgKE11bHRpY2FzdC9VbmljYXN0KikgICAgICAqLworI2RlZmluZQlXRjNfRSAgICAgICAgICAgICAgMHgwMTAwMDAwMCAgICAvKiBFbmFibGUgV2FrZS1VcCBGaWx0ZXIgMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVdGM19UICAgICAgICAgICAgICAweDA4MDAwMDAwICAgIC8qIFdha2UtVXAgRmlsdGVyIDMgQWRkciBUeXBlIChNdWx0aWNhc3QvVW5pY2FzdCopICAgICAgKi8KKworLyogRU1BQ19XS1VQX0ZGT0ZGIE1hc2tzICovCisKKyNkZWZpbmUJV0YwX09GRiAgICAgICAgICAgIDB4MDAwMDAwRkYgICAgLyogV2FrZS1VcCBGaWx0ZXIgMCBQYXR0ZXJuIE9mZnNldCAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlXRjFfT0ZGICAgICAgICAgICAgMHgwMDAwRkYwMCAgICAvKiBXYWtlLVVwIEZpbHRlciAxIFBhdHRlcm4gT2Zmc2V0ICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVdGMl9PRkYgICAgICAgICAgICAweDAwRkYwMDAwICAgIC8qIFdha2UtVXAgRmlsdGVyIDIgUGF0dGVybiBPZmZzZXQgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJV0YzX09GRiAgICAgICAgICAgIDB4RkYwMDAwMDAgICAgLyogV2FrZS1VcCBGaWx0ZXIgMyBQYXR0ZXJuIE9mZnNldCAgICAgICAgICAgICAgICAgICAgICAqLworCisjZGVmaW5lCVNFVF9XRjBfT0ZGKHgpICgoKHgpJjB4RkYpPDwgIDAgKSAvKiBTZXQgV2FrZS1VcCBGaWx0ZXIgMCBCeXRlIE9mZnNldCAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJU0VUX1dGMV9PRkYoeCkgKCgoeCkmMHhGRik8PCAgOCApIC8qIFNldCBXYWtlLVVwIEZpbHRlciAxIEJ5dGUgT2Zmc2V0ICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlTRVRfV0YyX09GRih4KSAoKCh4KSYweEZGKTw8IDE2ICkgLyogU2V0IFdha2UtVXAgRmlsdGVyIDIgQnl0ZSBPZmZzZXQgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVNFVF9XRjNfT0ZGKHgpICgoKHgpJjB4RkYpPDwgMjQgKSAvKiBTZXQgV2FrZS1VcCBGaWx0ZXIgMyBCeXRlIE9mZnNldCAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFNldCBBTEwgT2Zmc2V0cyAqLworI2RlZmluZQlTRVRfV0ZfT0ZGUyh4MCx4MSx4Mix4MykgKFNFVF9XRjBfT0ZGKCh4MCkpfFNFVF9XRjFfT0ZGKCh4MSkpfFNFVF9XRjJfT0ZGKCh4MikpfFNFVF9XRjNfT0ZGKCh4MykpKQorCisvKiBFTUFDX1dLVVBfRkZDUkMwIE1hc2tzICovCisKKyNkZWZpbmUJV0YwX0NSQyAgICAgICAgICAgMHgwMDAwRkZGRiAgICAvKiBXYWtlLVVwIEZpbHRlciAwIFBhdHRlcm4gQ1JDICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJV0YxX0NSQyAgICAgICAgICAgMHhGRkZGMDAwMCAgICAvKiBXYWtlLVVwIEZpbHRlciAxIFBhdHRlcm4gQ1JDICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworI2RlZmluZQlTRVRfV0YwX0NSQyh4KSAoKCh4KSYweEZGRkYpPDwgICAwICkgLyogU2V0IFdha2UtVXAgRmlsdGVyIDAgVGFyZ2V0IENSQyAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlTRVRfV0YxX0NSQyh4KSAoKCh4KSYweEZGRkYpPDwgIDE2ICkgLyogU2V0IFdha2UtVXAgRmlsdGVyIDEgVGFyZ2V0IENSQyAgICAgICAgICAgICAgICAgICAqLworCisvKiBFTUFDX1dLVVBfRkZDUkMxIE1hc2tzICovCisKKyNkZWZpbmUJV0YyX0NSQyAgICAgICAgICAgMHgwMDAwRkZGRiAgICAvKiBXYWtlLVVwIEZpbHRlciAyIFBhdHRlcm4gQ1JDICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJV0YzX0NSQyAgICAgICAgICAgMHhGRkZGMDAwMCAgICAvKiBXYWtlLVVwIEZpbHRlciAzIFBhdHRlcm4gQ1JDICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworI2RlZmluZQlTRVRfV0YyX0NSQyh4KSAoKCh4KSYweEZGRkYpPDwgICAwICkgLyogU2V0IFdha2UtVXAgRmlsdGVyIDIgVGFyZ2V0IENSQyAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlTRVRfV0YzX0NSQyh4KSAoKCh4KSYweEZGRkYpPDwgIDE2ICkgLyogU2V0IFdha2UtVXAgRmlsdGVyIDMgVGFyZ2V0IENSQyAgICAgICAgICAgICAgICAgICAqLworCisvKiBFTUFDX1NZU0NUTCBNYXNrcyAqLworCisjZGVmaW5lCVBIWUlFICAgICAgICAgICAgIDB4MDAwMDAwMDEgICAgLyogUEhZX0lOVCBJbnRlcnJ1cHQgRW5hYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVJYRFdBICAgICAgICAgICAgIDB4MDAwMDAwMDIgICAgLyogUmVjZWl2ZSBGcmFtZSBETUEgV29yZCBBbGlnbm1lbnQgKE9kZC9FdmVuKikgICAgICAgICAgICovCisjZGVmaW5lCVJYQ0tTICAgICAgICAgICAgIDB4MDAwMDAwMDQgICAgLyogRW5hYmxlIFJYIEZyYW1lIFRDUC9VRFAgQ2hlY2tzdW0gQ29tcHV0YXRpb24gICAgICAgICAgICovCisjZGVmaW5lCVRYRFdBICAgICAgICAgICAgIDB4MDAwMDAwMTAgICAgLyogVHJhbnNtaXQgRnJhbWUgRE1BIFdvcmQgQWxpZ25tZW50IChPZGQvRXZlbiopICAgICAgICAgICovCisjZGVmaW5lCU1EQ0RJViAgICAgICAgICAgIDB4MDAwMDNGMDAgICAgLyogU0NMSzpNREMgQ2xvY2sgRGl2aXNvciBbTURDPVNDTEsvKDIqKE4rMSkpXSAgICAgICAgICAgICovCisKKyNkZWZpbmUJU0VUX01EQ0RJVih4KSAoKCh4KSYweDNGKTw8IDgpICAgLyogU2V0IE1EQyBDbG9jayBEaXZpc29yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworLyogRU1BQ19TWVNUQVQgTWFza3MgKi8KKworI2RlZmluZQlQSFlJTlQgICAgICAgICAgICAweDAwMDAwMDAxICAgIC8qIFBIWV9JTlQgSW50ZXJydXB0IFN0YXR1cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlNTUNJTlQgICAgICAgICAgICAweDAwMDAwMDAyICAgIC8qIE1NQyBDb3VudGVyIEludGVycnVwdCBTdGF0dXMgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlSWEZTSU5UICAgICAgICAgICAweDAwMDAwMDA0ICAgIC8qIFJYIEZyYW1lLVN0YXR1cyBJbnRlcnJ1cHQgU3RhdHVzICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlUWEZTSU5UICAgICAgICAgICAweDAwMDAwMDA4ICAgIC8qIFRYIEZyYW1lLVN0YXR1cyBJbnRlcnJ1cHQgU3RhdHVzICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlXQUtFREVUICAgICAgICAgICAweDAwMDAwMDEwICAgIC8qIFdha2UtVXAgRGV0ZWN0ZWQgU3RhdHVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlSWERNQUVSUiAgICAgICAgICAweDAwMDAwMDIwICAgIC8qIFJYIERNQSBEaXJlY3Rpb24gRXJyb3IgU3RhdHVzICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlUWERNQUVSUiAgICAgICAgICAweDAwMDAwMDQwICAgIC8qIFRYIERNQSBEaXJlY3Rpb24gRXJyb3IgU3RhdHVzICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlTVE1ET05FICAgICAgICAgICAweDAwMDAwMDgwICAgIC8qIFN0YXRpb24gTWd0LiBUcmFuc2ZlciBEb25lIEludGVycnVwdCBTdGF0dXMgICAgICAgICAgICAqLworCisvKiBFTUFDX1JYX1NUQVQsIEVNQUNfUlhfU1RLWSwgYW5kIEVNQUNfUlhfSVJRRSBNYXNrcyAqLworCisjZGVmaW5lCVJYX0ZSTEVOICAgICAgICAgIDB4MDAwMDA3RkYgICAgLyogRnJhbWUgTGVuZ3RoIEluIEJ5dGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVJYX0NPTVAgICAgICAgICAgIDB4MDAwMDEwMDAgICAgLyogUlggRnJhbWUgQ29tcGxldGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVJYX09LICAgICAgICAgICAgIDB4MDAwMDIwMDAgICAgLyogUlggRnJhbWUgUmVjZWl2ZWQgV2l0aCBObyBFcnJvcnMgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVJYX0xPTkcgICAgICAgICAgIDB4MDAwMDQwMDAgICAgLyogUlggRnJhbWUgVG9vIExvbmcgRXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVJYX0FMSUdOICAgICAgICAgIDB4MDAwMDgwMDAgICAgLyogUlggRnJhbWUgQWxpZ25tZW50IEVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVJYX0NSQyAgICAgICAgICAgIDB4MDAwMTAwMDAgICAgLyogUlggRnJhbWUgQ1JDIEVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVJYX0xFTiAgICAgICAgICAgIDB4MDAwMjAwMDAgICAgLyogUlggRnJhbWUgTGVuZ3RoIEVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVJYX0ZSQUcgICAgICAgICAgIDB4MDAwNDAwMDAgICAgLyogUlggRnJhbWUgRnJhZ21lbnQgRXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVJYX0FERFIgICAgICAgICAgIDB4MDAwODAwMDAgICAgLyogUlggRnJhbWUgQWRkcmVzcyBGaWx0ZXIgRmFpbGVkIEVycm9yICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVJYX0RNQU8gICAgICAgICAgIDB4MDAxMDAwMDAgICAgLyogUlggRnJhbWUgRE1BIE92ZXJydW4gRXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVJYX1BIWSAgICAgICAgICAgIDB4MDAyMDAwMDAgICAgLyogUlggRnJhbWUgUEhZIEVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVJYX0xBVEUgICAgICAgICAgIDB4MDA0MDAwMDAgICAgLyogUlggRnJhbWUgTGF0ZSBDb2xsaXNpb24gRXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVJYX1JBTkdFICAgICAgICAgIDB4MDA4MDAwMDAgICAgLyogUlggRnJhbWUgTGVuZ3RoIEZpZWxkIE91dCBvZiBSYW5nZSBFcnJvciAgICAgICAgICAgICAgICovCisjZGVmaW5lCVJYX01VTFRJICAgICAgICAgIDB4MDEwMDAwMDAgICAgLyogUlggTXVsdGljYXN0IEZyYW1lIEluZGljYXRvciAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVJYX0JST0FEICAgICAgICAgIDB4MDIwMDAwMDAgICAgLyogUlggQnJvYWRjYXN0IEZyYW1lIEluZGljYXRvciAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVJYX0NUTCAgICAgICAgICAgIDB4MDQwMDAwMDAgICAgLyogUlggQ29udHJvbCBGcmFtZSBJbmRpY2F0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVJYX1VDVEwgICAgICAgICAgIDB4MDgwMDAwMDAgICAgLyogVW5zdXBwb3J0ZWQgUlggQ29udHJvbCBGcmFtZSBJbmRpY2F0b3IgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVJYX1RZUEUgICAgICAgICAgIDB4MTAwMDAwMDAgICAgLyogUlggVHlwZWQgRnJhbWUgSW5kaWNhdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVJYX1ZMQU4xICAgICAgICAgIDB4MjAwMDAwMDAgICAgLyogUlggVkxBTjEgRnJhbWUgSW5kaWNhdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVJYX1ZMQU4yICAgICAgICAgIDB4NDAwMDAwMDAgICAgLyogUlggVkxBTjIgRnJhbWUgSW5kaWNhdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVJYX0FDQ0VQVCAgICAgICAgIDB4ODAwMDAwMDAgICAgLyogUlggRnJhbWUgQWNjZXB0ZWQgSW5kaWNhdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKy8qICBFTUFDX1RYX1NUQVQsIEVNQUNfVFhfU1RLWSwgYW5kIEVNQUNfVFhfSVJRRSBNYXNrcyAgKi8KKworI2RlZmluZQlUWF9DT01QICAgICAgICAgICAweDAwMDAwMDAxICAgIC8qIFRYIEZyYW1lIENvbXBsZXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlUWF9PSyAgICAgICAgICAgICAweDAwMDAwMDAyICAgIC8qIFRYIEZyYW1lIFNlbnQgV2l0aCBObyBFcnJvcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlUWF9FQ09MTCAgICAgICAgICAweDAwMDAwMDA0ICAgIC8qIFRYIEZyYW1lIEV4Y2Vzc2l2ZSBDb2xsaXNpb24gRXJyb3IgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlUWF9MQVRFICAgICAgICAgICAweDAwMDAwMDA4ICAgIC8qIFRYIEZyYW1lIExhdGUgQ29sbGlzaW9uIEVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlUWF9ETUFVICAgICAgICAgICAweDAwMDAwMDEwICAgIC8qIFRYIEZyYW1lIERNQSBVbmRlcnJ1biBFcnJvciAoU1RBVCkgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlUWF9NQUNFICAgICAgICAgICAweDAwMDAwMDEwICAgIC8qIEludGVybmFsIE1BQyBFcnJvciBEZXRlY3RlZCAoU1RLWSBhbmQgSVJRRSkgICAgICAgICAgICAqLworI2RlZmluZQlUWF9FREVGRVIgICAgICAgICAweDAwMDAwMDIwICAgIC8qIFRYIEZyYW1lIEV4Y2Vzc2l2ZSBEZWZlcnJhbCBFcnJvciAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlUWF9CUk9BRCAgICAgICAgICAweDAwMDAwMDQwICAgIC8qIFRYIEJyb2FkY2FzdCBGcmFtZSBJbmRpY2F0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlUWF9NVUxUSSAgICAgICAgICAweDAwMDAwMDgwICAgIC8qIFRYIE11bHRpY2FzdCBGcmFtZSBJbmRpY2F0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlUWF9DQ05UICAgICAgICAgICAweDAwMDAwRjAwICAgIC8qIFRYIEZyYW1lIENvbGxpc2lvbiBDb3VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlUWF9ERUZFUiAgICAgICAgICAweDAwMDAxMDAwICAgIC8qIFRYIEZyYW1lIERlZmVycmVkIEluZGljYXRvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlUWF9DUlMgICAgICAgICAgICAweDAwMDAyMDAwICAgIC8qIFRYIEZyYW1lIENhcnJpZXIgU2Vuc2UgTm90IEFzc2VydGVkIEVycm9yICAgICAgICAgICAgICAqLworI2RlZmluZQlUWF9MT1NTICAgICAgICAgICAweDAwMDA0MDAwICAgIC8qIFRYIEZyYW1lIENhcnJpZXIgTG9zdCBEdXJpbmcgVFggRXJyb3IgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlUWF9SRVRSWSAgICAgICAgICAweDAwMDA4MDAwICAgIC8qIFRYIEZyYW1lIFN1Y2Nlc3NmdWwgQWZ0ZXIgUmV0cnkgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlUWF9GUkxFTiAgICAgICAgICAweDA3RkYwMDAwICAgIC8qIFRYIEZyYW1lIExlbmd0aCAoQnl0ZXMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisvKiBFTUFDX01NQ19DVEwgTWFza3MgKi8KKyNkZWZpbmUJUlNUQyAgICAgICAgICAgICAgMHgwMDAwMDAwMSAgICAvKiBSZXNldCBBbGwgQ291bnRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJQ1JPTEwgICAgICAgICAgICAgMHgwMDAwMDAwMiAgICAvKiBDb3VudGVyIFJvbGwtT3ZlciBFbmFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJQ0NPUiAgICAgICAgICAgICAgMHgwMDAwMDAwNCAgICAvKiBDb3VudGVyIENsZWFyLU9uLVJlYWQgTW9kZSBFbmFibGUgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJTU1DRSAgICAgICAgICAgICAgMHgwMDAwMDAwOCAgICAvKiBFbmFibGUgTU1DIENvdW50ZXIgT3BlcmF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworLyogRU1BQ19NTUNfUklSUVMgYW5kIEVNQUNfTU1DX1JJUlFFIE1hc2tzICovCisjZGVmaW5lCVJYX09LX0NOVCAgICAgICAgIDB4MDAwMDAwMDEgICAgLyogUlggRnJhbWVzIFJlY2VpdmVkIFdpdGggTm8gRXJyb3JzICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVJYX0ZDU19DTlQgICAgICAgIDB4MDAwMDAwMDIgICAgLyogUlggRnJhbWVzIFcvRnJhbWUgQ2hlY2sgU2VxdWVuY2UgRXJyb3JzICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVJYX0FMSUdOX0NOVCAgICAgIDB4MDAwMDAwMDQgICAgLyogUlggRnJhbWVzIFdpdGggQWxpZ25tZW50IEVycm9ycyAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVJYX09DVEVUX0NOVCAgICAgIDB4MDAwMDAwMDggICAgLyogUlggT2N0ZXRzIFJlY2VpdmVkIE9LICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVJYX0xPU1RfQ05UICAgICAgIDB4MDAwMDAwMTAgICAgLyogUlggRnJhbWVzIExvc3QgRHVlIFRvIEludGVybmFsIE1BQyBSWCBFcnJvciAgICAgICAgICAgICovCisjZGVmaW5lCVJYX1VOSV9DTlQgICAgICAgIDB4MDAwMDAwMjAgICAgLyogVW5pY2FzdCBSWCBGcmFtZXMgUmVjZWl2ZWQgT0sgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVJYX01VTFRJX0NOVCAgICAgIDB4MDAwMDAwNDAgICAgLyogTXVsdGljYXN0IFJYIEZyYW1lcyBSZWNlaXZlZCBPSyAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVJYX0JST0FEX0NOVCAgICAgIDB4MDAwMDAwODAgICAgLyogQnJvYWRjYXN0IFJYIEZyYW1lcyBSZWNlaXZlZCBPSyAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVJYX0lSTF9DTlQgICAgICAgIDB4MDAwMDAxMDAgICAgLyogUlggRnJhbWVzIFdpdGggSW4tUmFuZ2UgTGVuZ3RoIEVycm9ycyAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVJYX09STF9DTlQgICAgICAgIDB4MDAwMDAyMDAgICAgLyogUlggRnJhbWVzIFdpdGggT3V0LU9mLVJhbmdlIExlbmd0aCBFcnJvcnMgICAgICAgICAgICAgICovCisjZGVmaW5lCVJYX0xPTkdfQ05UICAgICAgIDB4MDAwMDA0MDAgICAgLyogUlggRnJhbWVzIFdpdGggRnJhbWUgVG9vIExvbmcgRXJyb3JzICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVJYX01BQ0NUTF9DTlQgICAgIDB4MDAwMDA4MDAgICAgLyogTUFDIENvbnRyb2wgUlggRnJhbWVzIFJlY2VpdmVkICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVJYX09QQ09ERV9DVEwgICAgIDB4MDAwMDEwMDAgICAgLyogVW5zdXBwb3J0ZWQgT3AtQ29kZSBSWCBGcmFtZXMgUmVjZWl2ZWQgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVJYX1BBVVNFX0NOVCAgICAgIDB4MDAwMDIwMDAgICAgLyogUEFVU0VNQUMgQ29udHJvbCBSWCBGcmFtZXMgUmVjZWl2ZWQgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVJYX0FMTEZfQ05UICAgICAgIDB4MDAwMDQwMDAgICAgLyogQWxsIFJYIEZyYW1lcyBSZWNlaXZlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVJYX0FMTE9fQ05UICAgICAgIDB4MDAwMDgwMDAgICAgLyogQWxsIFJYIE9jdGV0cyBSZWNlaXZlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVJYX1RZUEVEX0NOVCAgICAgIDB4MDAwMTAwMDAgICAgLyogVHlwZWQgUlggRnJhbWVzIFJlY2VpdmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVJYX1NIT1JUX0NOVCAgICAgIDB4MDAwMjAwMDAgICAgLyogUlggRnJhbWUgRnJhZ21lbnRzICg8IDY0IEJ5dGVzKSBSZWNlaXZlZCAgICAgICAgICAgICAgICovCisjZGVmaW5lCVJYX0VRNjRfQ05UICAgICAgIDB4MDAwNDAwMDAgICAgLyogNjQtQnl0ZSBSWCBGcmFtZXMgUmVjZWl2ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVJYX0xUMTI4X0NOVCAgICAgIDB4MDAwODAwMDAgICAgLyogNjUtMTI3LUJ5dGUgUlggRnJhbWVzIFJlY2VpdmVkICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVJYX0xUMjU2X0NOVCAgICAgIDB4MDAxMDAwMDAgICAgLyogMTI4LTI1NS1CeXRlIFJYIEZyYW1lcyBSZWNlaXZlZCAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVJYX0xUNTEyX0NOVCAgICAgIDB4MDAyMDAwMDAgICAgLyogMjU2LTUxMS1CeXRlIFJYIEZyYW1lcyBSZWNlaXZlZCAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVJYX0xUMTAyNF9DTlQgICAgIDB4MDA0MDAwMDAgICAgLyogNTEyLTEwMjMtQnl0ZSBSWCBGcmFtZXMgUmVjZWl2ZWQgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVJYX0dFMTAyNF9DTlQgICAgIDB4MDA4MDAwMDAgICAgLyogMTAyNC1NYXgtQnl0ZSBSWCBGcmFtZXMgUmVjZWl2ZWQgICAgICAgICAgICAgICAgICAgICAgICovCisKKy8qIEVNQUNfTU1DX1RJUlFTIGFuZCBFTUFDX01NQ19USVJRRSBNYXNrcyAgKi8KKworI2RlZmluZQlUWF9PS19DTlQgICAgICAgICAweDAwMDAwMDAxICAgIC8qIFRYIEZyYW1lcyBTZW50IE9LICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlUWF9TQ09MTF9DTlQgICAgICAweDAwMDAwMDAyICAgIC8qIFRYIEZyYW1lcyBXaXRoIFNpbmdsZSBDb2xsaXNpb25zICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlUWF9NQ09MTF9DTlQgICAgICAweDAwMDAwMDA0ICAgIC8qIFRYIEZyYW1lcyBXaXRoIE11bHRpcGxlIENvbGxpc2lvbnMgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlUWF9PQ1RFVF9DTlQgICAgICAweDAwMDAwMDA4ICAgIC8qIFRYIE9jdGV0cyBTZW50IE9LICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlUWF9ERUZFUl9DTlQgICAgICAweDAwMDAwMDEwICAgIC8qIFRYIEZyYW1lcyBXaXRoIERlZmVycmVkIFRyYW5zbWlzc2lvbiAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlUWF9MQVRFX0NOVCAgICAgICAweDAwMDAwMDIwICAgIC8qIFRYIEZyYW1lcyBXaXRoIExhdGUgQ29sbGlzaW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlUWF9BQk9SVENfQ05UICAgICAweDAwMDAwMDQwICAgIC8qIFRYIEZyYW1lcyBBYm9ydGVkIER1ZSBUbyBFeGNlc3MgQ29sbGlzaW9ucyAgICAgICAgICAgICAqLworI2RlZmluZQlUWF9MT1NUX0NOVCAgICAgICAweDAwMDAwMDgwICAgIC8qIFRYIEZyYW1lcyBMb3N0IER1ZSBUbyBJbnRlcm5hbCBNQUMgVFggRXJyb3IgICAgICAgICAgICAqLworI2RlZmluZQlUWF9DUlNfQ05UICAgICAgICAweDAwMDAwMTAwICAgIC8qIFRYIEZyYW1lcyBXaXRoIENhcnJpZXIgU2Vuc2UgRXJyb3JzICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlUWF9VTklfQ05UICAgICAgICAweDAwMDAwMjAwICAgIC8qIFVuaWNhc3QgVFggRnJhbWVzIFNlbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlUWF9NVUxUSV9DTlQgICAgICAweDAwMDAwNDAwICAgIC8qIE11bHRpY2FzdCBUWCBGcmFtZXMgU2VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlUWF9CUk9BRF9DTlQgICAgICAweDAwMDAwODAwICAgIC8qIEJyb2FkY2FzdCBUWCBGcmFtZXMgU2VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlUWF9FWERFRl9DVEwgICAgICAweDAwMDAxMDAwICAgIC8qIFRYIEZyYW1lcyBXaXRoIEV4Y2Vzc2l2ZSBEZWZlcnJhbCAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlUWF9NQUNDVExfQ05UICAgICAweDAwMDAyMDAwICAgIC8qIE1BQyBDb250cm9sIFRYIEZyYW1lcyBTZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlUWF9BTExGX0NOVCAgICAgICAweDAwMDA0MDAwICAgIC8qIEFsbCBUWCBGcmFtZXMgU2VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlUWF9BTExPX0NOVCAgICAgICAweDAwMDA4MDAwICAgIC8qIEFsbCBUWCBPY3RldHMgU2VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlUWF9FUTY0X0NOVCAgICAgICAweDAwMDEwMDAwICAgIC8qIDY0LUJ5dGUgVFggRnJhbWVzIFNlbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlUWF9MVDEyOF9DTlQgICAgICAweDAwMDIwMDAwICAgIC8qIDY1LTEyNy1CeXRlIFRYIEZyYW1lcyBTZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlUWF9MVDI1Nl9DTlQgICAgICAweDAwMDQwMDAwICAgIC8qIDEyOC0yNTUtQnl0ZSBUWCBGcmFtZXMgU2VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlUWF9MVDUxMl9DTlQgICAgICAweDAwMDgwMDAwICAgIC8qIDI1Ni01MTEtQnl0ZSBUWCBGcmFtZXMgU2VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlUWF9MVDEwMjRfQ05UICAgICAweDAwMTAwMDAwICAgIC8qIDUxMi0xMDIzLUJ5dGUgVFggRnJhbWVzIFNlbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlUWF9HRTEwMjRfQ05UICAgICAweDAwMjAwMDAwICAgIC8qIDEwMjQtTWF4LUJ5dGUgVFggRnJhbWVzIFNlbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlUWF9BQk9SVF9DTlQgICAgICAweDAwNDAwMDAwICAgIC8qIFRYIEZyYW1lcyBBYm9ydGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisvKiBTREggUmVnaXN0ZXJzICovCisKKyNkZWZpbmUgU0RIX1BXUl9DVEwgICAgICAgICAgICAgICAgICAgIDB4RkZDMDM5MDAgLyogU0RIIFBvd2VyIENvbnRyb2wgKi8KKyNkZWZpbmUgU0RIX0NMS19DVEwgICAgICAgICAgICAgICAgICAgIDB4RkZDMDM5MDQgLyogU0RIIENsb2NrIENvbnRyb2wgKi8KKyNkZWZpbmUgU0RIX0FSR1VNRU5UICAgICAgICAgICAgICAgICAgIDB4RkZDMDM5MDggLyogU0RIIEFyZ3VtZW50ICovCisjZGVmaW5lIFNESF9DT01NQU5EICAgICAgICAgICAgICAgICAgICAweEZGQzAzOTBDIC8qIFNESCBDb21tYW5kICovCisjZGVmaW5lIFNESF9SRVNQX0NNRCAgICAgICAgICAgICAgICAgICAweEZGQzAzOTEwIC8qIFNESCBSZXNwb25zZSBDb21tYW5kICovCisjZGVmaW5lIFNESF9SRVNQT05TRTAgICAgICAgICAgICAgICAgICAweEZGQzAzOTE0IC8qIFNESCBSZXNwb25zZTAgKi8KKyNkZWZpbmUgU0RIX1JFU1BPTlNFMSAgICAgICAgICAgICAgICAgIDB4RkZDMDM5MTggLyogU0RIIFJlc3BvbnNlMSAqLworI2RlZmluZSBTREhfUkVTUE9OU0UyICAgICAgICAgICAgICAgICAgMHhGRkMwMzkxQyAvKiBTREggUmVzcG9uc2UyICovCisjZGVmaW5lIFNESF9SRVNQT05TRTMgICAgICAgICAgICAgICAgICAweEZGQzAzOTIwIC8qIFNESCBSZXNwb25zZTMgKi8KKyNkZWZpbmUgU0RIX0RBVEFfVElNRVIgICAgICAgICAgICAgICAgIDB4RkZDMDM5MjQgLyogU0RIIERhdGEgVGltZXIgKi8KKyNkZWZpbmUgU0RIX0RBVEFfTEdUSCAgICAgICAgICAgICAgICAgIDB4RkZDMDM5MjggLyogU0RIIERhdGEgTGVuZ3RoICovCisjZGVmaW5lIFNESF9EQVRBX0NUTCAgICAgICAgICAgICAgICAgICAweEZGQzAzOTJDIC8qIFNESCBEYXRhIENvbnRyb2wgKi8KKyNkZWZpbmUgU0RIX0RBVEFfQ05UICAgICAgICAgICAgICAgICAgIDB4RkZDMDM5MzAgLyogU0RIIERhdGEgQ291bnRlciAqLworI2RlZmluZSBTREhfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgMHhGRkMwMzkzNCAvKiBTREggU3RhdHVzICovCisjZGVmaW5lIFNESF9TVEFUVVNfQ0xSICAgICAgICAgICAgICAgICAweEZGQzAzOTM4IC8qIFNESCBTdGF0dXMgQ2xlYXIgKi8KKyNkZWZpbmUgU0RIX01BU0swICAgICAgICAgICAgICAgICAgICAgIDB4RkZDMDM5M0MgLyogU0RIIEludGVycnVwdDAgTWFzayAqLworI2RlZmluZSBTREhfTUFTSzEgICAgICAgICAgICAgICAgICAgICAgMHhGRkMwMzk0MCAvKiBTREggSW50ZXJydXB0MSBNYXNrICovCisjZGVmaW5lIFNESF9GSUZPX0NOVCAgICAgICAgICAgICAgICAgICAweEZGQzAzOTQ4IC8qIFNESCBGSUZPIENvdW50ZXIgKi8KKyNkZWZpbmUgU0RIX0ZJRk8gICAgICAgICAgICAgICAgICAgICAgIDB4RkZDMDM5ODAgLyogU0RIIERhdGEgRklGTyAqLworI2RlZmluZSBTREhfRV9TVEFUVVMgICAgICAgICAgICAgICAgICAgMHhGRkMwMzlDMCAvKiBTREggRXhjZXB0aW9uIFN0YXR1cyAqLworI2RlZmluZSBTREhfRV9NQVNLICAgICAgICAgICAgICAgICAgICAgMHhGRkMwMzlDNCAvKiBTREggRXhjZXB0aW9uIE1hc2sgKi8KKyNkZWZpbmUgU0RIX0NGRyAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZDMDM5QzggLyogU0RIIENvbmZpZ3VyYXRpb24gKi8KKyNkZWZpbmUgU0RIX1JEX1dBSVRfRU4gICAgICAgICAgICAgICAgIDB4RkZDMDM5Q0MgLyogU0RIIFJlYWQgV2FpdCBFbmFibGUgKi8KKyNkZWZpbmUgU0RIX1BJRDAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZDMDM5RDAgLyogU0RIIFBlcmlwaGVyYWwgSWRlbnRpZmljYXRpb24wICovCisjZGVmaW5lIFNESF9QSUQxICAgICAgICAgICAgICAgICAgICAgICAweEZGQzAzOUQ0IC8qIFNESCBQZXJpcGhlcmFsIElkZW50aWZpY2F0aW9uMSAqLworI2RlZmluZSBTREhfUElEMiAgICAgICAgICAgICAgICAgICAgICAgMHhGRkMwMzlEOCAvKiBTREggUGVyaXBoZXJhbCBJZGVudGlmaWNhdGlvbjIgKi8KKyNkZWZpbmUgU0RIX1BJRDMgICAgICAgICAgICAgICAgICAgICAgIDB4RkZDMDM5REMgLyogU0RIIFBlcmlwaGVyYWwgSWRlbnRpZmljYXRpb24zICovCisjZGVmaW5lIFNESF9QSUQ0ICAgICAgICAgICAgICAgICAgICAgICAweEZGQzAzOUUwIC8qIFNESCBQZXJpcGhlcmFsIElkZW50aWZpY2F0aW9uNCAqLworI2RlZmluZSBTREhfUElENSAgICAgICAgICAgICAgICAgICAgICAgMHhGRkMwMzlFNCAvKiBTREggUGVyaXBoZXJhbCBJZGVudGlmaWNhdGlvbjUgKi8KKyNkZWZpbmUgU0RIX1BJRDYgICAgICAgICAgICAgICAgICAgICAgIDB4RkZDMDM5RTggLyogU0RIIFBlcmlwaGVyYWwgSWRlbnRpZmljYXRpb242ICovCisjZGVmaW5lIFNESF9QSUQ3ICAgICAgICAgICAgICAgICAgICAgICAweEZGQzAzOUVDIC8qIFNESCBQZXJpcGhlcmFsIElkZW50aWZpY2F0aW9uNyAqLworCisvKiBSZW1vdmFibGUgU3RvcmFnZSBJbnRlcmZhY2UgUmVnaXN0ZXJzICovCisKKyNkZWZpbmUgUlNJX1BXUl9DT05UUk9MICAgICAgICAgICAgICAgIDB4RkZDMDM4MDAgLyogUlNJIFBvd2VyIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUlNJX0NMS19DT05UUk9MICAgICAgICAgICAgICAgIDB4RkZDMDM4MDQgLyogUlNJIENsb2NrIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUlNJX0FSR1VNRU5UICAgICAgICAgICAgICAgICAgIDB4RkZDMDM4MDggLyogUlNJIEFyZ3VtZW50IFJlZ2lzdGVyICovCisjZGVmaW5lIFJTSV9DT01NQU5EICAgICAgICAgICAgICAgICAgICAweEZGQzAzODBDIC8qIFJTSSBDb21tYW5kIFJlZ2lzdGVyICovCisjZGVmaW5lIFJTSV9SRVNQX0NNRCAgICAgICAgICAgICAgICAgICAweEZGQzAzODEwIC8qIFJTSSBSZXNwb25zZSBDb21tYW5kIFJlZ2lzdGVyICovCisjZGVmaW5lIFJTSV9SRVNQT05TRTAgICAgICAgICAgICAgICAgICAweEZGQzAzODE0IC8qIFJTSSBSZXNwb25zZSBSZWdpc3RlciAqLworI2RlZmluZSBSU0lfUkVTUE9OU0UxICAgICAgICAgICAgICAgICAgMHhGRkMwMzgxOCAvKiBSU0kgUmVzcG9uc2UgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUlNJX1JFU1BPTlNFMiAgICAgICAgICAgICAgICAgIDB4RkZDMDM4MUMgLyogUlNJIFJlc3BvbnNlIFJlZ2lzdGVyICovCisjZGVmaW5lIFJTSV9SRVNQT05TRTMgICAgICAgICAgICAgICAgICAweEZGQzAzODIwIC8qIFJTSSBSZXNwb25zZSBSZWdpc3RlciAqLworI2RlZmluZSBSU0lfREFUQV9USU1FUiAgICAgICAgICAgICAgICAgMHhGRkMwMzgyNCAvKiBSU0kgRGF0YSBUaW1lciBSZWdpc3RlciAqLworI2RlZmluZSBSU0lfREFUQV9MR1RIICAgICAgICAgICAgICAgICAgMHhGRkMwMzgyOCAvKiBSU0kgRGF0YSBMZW5ndGggUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUlNJX0RBVEFfQ09OVFJPTCAgICAgICAgICAgICAgIDB4RkZDMDM4MkMgLyogUlNJIERhdGEgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSBSU0lfREFUQV9DTlQgICAgICAgICAgICAgICAgICAgMHhGRkMwMzgzMCAvKiBSU0kgRGF0YSBDb3VudGVyIFJlZ2lzdGVyICovCisjZGVmaW5lIFJTSV9TVEFUVVMgICAgICAgICAgICAgICAgICAgICAweEZGQzAzODM0IC8qIFJTSSBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUlNJX1NUQVRVU0NMICAgICAgICAgICAgICAgICAgIDB4RkZDMDM4MzggLyogUlNJIFN0YXR1cyBDbGVhciBSZWdpc3RlciAqLworI2RlZmluZSBSU0lfTUFTSzAgICAgICAgICAgICAgICAgICAgICAgMHhGRkMwMzgzQyAvKiBSU0kgSW50ZXJydXB0IDAgTWFzayBSZWdpc3RlciAqLworI2RlZmluZSBSU0lfTUFTSzEgICAgICAgICAgICAgICAgICAgICAgMHhGRkMwMzg0MCAvKiBSU0kgSW50ZXJydXB0IDEgTWFzayBSZWdpc3RlciAqLworI2RlZmluZSBSU0lfRklGT19DTlQgICAgICAgICAgICAgICAgICAgMHhGRkMwMzg0OCAvKiBSU0kgRklGTyBDb3VudGVyIFJlZ2lzdGVyICovCisjZGVmaW5lIFJTSV9DRUFUQV9DT05UUk9MICAgICAgICAgICAgICAweEZGQzAzODRDIC8qIFJTSSBDRUFUQSBSZWdpc3RlciAqLworI2RlZmluZSBSU0lfRklGTyAgICAgICAgICAgICAgICAgICAgICAgMHhGRkMwMzg4MCAvKiBSU0kgRGF0YSBGSUZPIFJlZ2lzdGVyICovCisjZGVmaW5lIFJTSV9FU1RBVCAgICAgICAgICAgICAgICAgICAgICAweEZGQzAzOEMwIC8qIFJTSSBFeGNlcHRpb24gU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lIFJTSV9FTUFTSyAgICAgICAgICAgICAgICAgICAgICAweEZGQzAzOEM0IC8qIFJTSSBFeGNlcHRpb24gTWFzayBSZWdpc3RlciAqLworI2RlZmluZSBSU0lfQ09ORklHICAgICAgICAgICAgICAgICAgICAgMHhGRkMwMzhDOCAvKiBSU0kgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAqLworI2RlZmluZSBSU0lfUkRfV0FJVF9FTiAgICAgICAgICAgICAgICAgMHhGRkMwMzhDQyAvKiBSU0kgUmVhZCBXYWl0IEVuYWJsZSBSZWdpc3RlciAqLworI2RlZmluZSBSU0lfUElEMCAgICAgICAgICAgICAgICAgICAgICAgMHhGRkMwM0ZFMCAvKiBSU0kgUGVyaXBoZXJhbCBJRCBSZWdpc3RlciAwICovCisjZGVmaW5lIFJTSV9QSUQxICAgICAgICAgICAgICAgICAgICAgICAweEZGQzAzRkU0IC8qIFJTSSBQZXJpcGhlcmFsIElEIFJlZ2lzdGVyIDEgKi8KKyNkZWZpbmUgUlNJX1BJRDIgICAgICAgICAgICAgICAgICAgICAgIDB4RkZDMDNGRTggLyogUlNJIFBlcmlwaGVyYWwgSUQgUmVnaXN0ZXIgMiAqLworI2RlZmluZSBSU0lfUElEMyAgICAgICAgICAgICAgICAgICAgICAgMHhGRkMwM0ZFQyAvKiBSU0kgUGVyaXBoZXJhbCBJRCBSZWdpc3RlciAzICovCisjZGVmaW5lIFJTSV9QSUQ0ICAgICAgICAgICAgICAgICAgICAgICAweEZGQzAzRkYwIC8qIFJTSSBQZXJpcGhlcmFsIElEIFJlZ2lzdGVyIDQgKi8KKyNkZWZpbmUgUlNJX1BJRDUgICAgICAgICAgICAgICAgICAgICAgIDB4RkZDMDNGRjQgLyogUlNJIFBlcmlwaGVyYWwgSUQgUmVnaXN0ZXIgNSAqLworI2RlZmluZSBSU0lfUElENiAgICAgICAgICAgICAgICAgICAgICAgMHhGRkMwM0ZGOCAvKiBSU0kgUGVyaXBoZXJhbCBJRCBSZWdpc3RlciA2ICovCisjZGVmaW5lIFJTSV9QSUQ3ICAgICAgICAgICAgICAgICAgICAgICAweEZGQzAzRkZDIC8qIFJTSSBQZXJpcGhlcmFsIElEIFJlZ2lzdGVyIDcgKi8KKworI2VuZGlmIC8qIF9ERUZfQkY1MTZfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2luY2x1ZGUvbWFjaC9kZWZCRjUxOC5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2luY2x1ZGUvbWFjaC9kZWZCRjUxOC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlOTgyYWIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvaW5jbHVkZS9tYWNoL2RlZkJGNTE4LmgKQEAgLTAsMCArMSw2NTEgQEAKKy8qCisgKiBGaWxlOiAgICAgICAgIGluY2x1ZGUvYXNtLWJsYWNrZmluL21hY2gtYmY1MTgvZGVmQkY1MTguaAorICogQmFzZWQgb246CisgKiBBdXRob3I6CisgKgorICogQ3JlYXRlZDoKKyAqIERlc2NyaXB0aW9uOgorICoKKyAqIFJldjoKKyAqCisgKiBNb2RpZmllZDoKKyAqCisgKiBCdWdzOiAgICAgICAgIEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLgorICogSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCisjaWZuZGVmIF9ERUZfQkY1MThfSAorI2RlZmluZSBfREVGX0JGNTE4X0gKKworLyogSW5jbHVkZSBhbGwgQ29yZSByZWdpc3RlcnMgYW5kIGJpdCBkZWZpbml0aW9ucyAqLworI2luY2x1ZGUgPGFzbS9kZWZfTFBCbGFja2Zpbi5oPgorCisvKiBTWVNURU0gJiBNTVIgQUREUkVTUyBERUZJTklUSU9OUyBGT1IgQURTUC1CRjUxOCAqLworCisvKiBJbmNsdWRlIGRlZkJGNTF4X2Jhc2UuaCBmb3IgdGhlIHNldCBvZiAjZGVmaW5lcyB0aGF0IGFyZSBjb21tb24gdG8gYWxsIEFEU1AtQkY1MXggcHJvY2Vzc29ycyAqLworI2luY2x1ZGUgImRlZkJGNTF4X2Jhc2UuaCIKKworLyogVGhlIGZvbGxvd2luZyBhcmUgdGhlICNkZWZpbmVzIG5lZWRlZCBieSBBRFNQLUJGNTE4IHRoYXQgYXJlIG5vdCBpbiB0aGUgY29tbW9uIGhlYWRlciAqLworLyogMTAvMTAwIEV0aGVybmV0IENvbnRyb2xsZXIJKDB4RkZDMDMwMDAgLSAweEZGQzAzMUZGKSAqLworCisjZGVmaW5lIEVNQUNfT1BNT0RFICAgICAgICAgICAgIDB4RkZDMDMwMDAgICAgICAgLyogT3BlcmF0aW5nIE1vZGUgUmVnaXN0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBFTUFDX0FERFJMTyAgICAgICAgICAgICAweEZGQzAzMDA0ICAgICAgIC8qIEFkZHJlc3MgTG93ICgzMiBMU0JzKSBSZWdpc3RlciAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19BRERSSEkgICAgICAgICAgICAgMHhGRkMwMzAwOCAgICAgICAvKiBBZGRyZXNzIEhpZ2ggKDE2IE1TQnMpIFJlZ2lzdGVyICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEVNQUNfSEFTSExPICAgICAgICAgICAgIDB4RkZDMDMwMEMgICAgICAgLyogTXVsdGljYXN0IEhhc2ggVGFibGUgTG93IChCaW5zIDMxLTApIFJlZ2lzdGVyICAgICAgICAqLworI2RlZmluZSBFTUFDX0hBU0hISSAgICAgICAgICAgICAweEZGQzAzMDEwICAgICAgIC8qIE11bHRpY2FzdCBIYXNoIFRhYmxlIEhpZ2ggKEJpbnMgNjMtMzIpIFJlZ2lzdGVyICAgICAgKi8KKyNkZWZpbmUgRU1BQ19TVEFBREQgICAgICAgICAgICAgMHhGRkMwMzAxNCAgICAgICAvKiBTdGF0aW9uIE1hbmFnZW1lbnQgQWRkcmVzcyBSZWdpc3RlciAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEVNQUNfU1RBREFUICAgICAgICAgICAgIDB4RkZDMDMwMTggICAgICAgLyogU3RhdGlvbiBNYW5hZ2VtZW50IERhdGEgUmVnaXN0ZXIgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBFTUFDX0ZMQyAgICAgICAgICAgICAgICAweEZGQzAzMDFDICAgICAgIC8qIEZsb3cgQ29udHJvbCBSZWdpc3RlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19WTEFOMSAgICAgICAgICAgICAgMHhGRkMwMzAyMCAgICAgICAvKiBWTEFOMSBUYWcgUmVnaXN0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEVNQUNfVkxBTjIgICAgICAgICAgICAgIDB4RkZDMDMwMjQgICAgICAgLyogVkxBTjIgVGFnIFJlZ2lzdGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBFTUFDX1dLVVBfQ1RMICAgICAgICAgICAweEZGQzAzMDJDICAgICAgIC8qIFdha2UtVXAgQ29udHJvbC9TdGF0dXMgUmVnaXN0ZXIgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19XS1VQX0ZGTVNLMCAgICAgICAgMHhGRkMwMzAzMCAgICAgICAvKiBXYWtlLVVwIEZyYW1lIEZpbHRlciAwIEJ5dGUgTWFzayBSZWdpc3RlciAgICAgICAgICAgICovCisjZGVmaW5lIEVNQUNfV0tVUF9GRk1TSzEgICAgICAgIDB4RkZDMDMwMzQgICAgICAgLyogV2FrZS1VcCBGcmFtZSBGaWx0ZXIgMSBCeXRlIE1hc2sgUmVnaXN0ZXIgICAgICAgICAgICAqLworI2RlZmluZSBFTUFDX1dLVVBfRkZNU0syICAgICAgICAweEZGQzAzMDM4ICAgICAgIC8qIFdha2UtVXAgRnJhbWUgRmlsdGVyIDIgQnl0ZSBNYXNrIFJlZ2lzdGVyICAgICAgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19XS1VQX0ZGTVNLMyAgICAgICAgMHhGRkMwMzAzQyAgICAgICAvKiBXYWtlLVVwIEZyYW1lIEZpbHRlciAzIEJ5dGUgTWFzayBSZWdpc3RlciAgICAgICAgICAgICovCisjZGVmaW5lIEVNQUNfV0tVUF9GRkNNRCAgICAgICAgIDB4RkZDMDMwNDAgICAgICAgLyogV2FrZS1VcCBGcmFtZSBGaWx0ZXIgQ29tbWFuZHMgUmVnaXN0ZXIgICAgICAgICAgICAgICAqLworI2RlZmluZSBFTUFDX1dLVVBfRkZPRkYgICAgICAgICAweEZGQzAzMDQ0ICAgICAgIC8qIFdha2UtVXAgRnJhbWUgRmlsdGVyIE9mZnNldHMgUmVnaXN0ZXIgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19XS1VQX0ZGQ1JDMCAgICAgICAgMHhGRkMwMzA0OCAgICAgICAvKiBXYWtlLVVwIEZyYW1lIEZpbHRlciAwLDEgQ1JDLTE2IFJlZ2lzdGVyICAgICAgICAgICAgICovCisjZGVmaW5lIEVNQUNfV0tVUF9GRkNSQzEgICAgICAgIDB4RkZDMDMwNEMgICAgICAgLyogV2FrZS1VcCBGcmFtZSBGaWx0ZXIgMiwzIENSQy0xNiBSZWdpc3RlciAgICAgICAgICAgICAqLworCisjZGVmaW5lIEVNQUNfU1lTQ1RMICAgICAgICAgICAgIDB4RkZDMDMwNjAgICAgICAgLyogRU1BQyBTeXN0ZW0gQ29udHJvbCBSZWdpc3RlciAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBFTUFDX1NZU1RBVCAgICAgICAgICAgICAweEZGQzAzMDY0ICAgICAgIC8qIEVNQUMgU3lzdGVtIFN0YXR1cyBSZWdpc3RlciAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19SWF9TVEFUICAgICAgICAgICAgMHhGRkMwMzA2OCAgICAgICAvKiBSWCBDdXJyZW50IEZyYW1lIFN0YXR1cyBSZWdpc3RlciAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEVNQUNfUlhfU1RLWSAgICAgICAgICAgIDB4RkZDMDMwNkMgICAgICAgLyogUlggU3RpY2t5IEZyYW1lIFN0YXR1cyBSZWdpc3RlciAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBFTUFDX1JYX0lSUUUgICAgICAgICAgICAweEZGQzAzMDcwICAgICAgIC8qIFJYIEZyYW1lIFN0YXR1cyBJbnRlcnJ1cHQgRW5hYmxlcyBSZWdpc3RlciAgICAgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19UWF9TVEFUICAgICAgICAgICAgMHhGRkMwMzA3NCAgICAgICAvKiBUWCBDdXJyZW50IEZyYW1lIFN0YXR1cyBSZWdpc3RlciAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEVNQUNfVFhfU1RLWSAgICAgICAgICAgIDB4RkZDMDMwNzggICAgICAgLyogVFggU3RpY2t5IEZyYW1lIFN0YXR1cyBSZWdpc3RlciAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBFTUFDX1RYX0lSUUUgICAgICAgICAgICAweEZGQzAzMDdDICAgICAgIC8qIFRYIEZyYW1lIFN0YXR1cyBJbnRlcnJ1cHQgRW5hYmxlcyBSZWdpc3RlciAgICAgICAgICAgKi8KKworI2RlZmluZSBFTUFDX01NQ19DVEwgICAgICAgICAgICAweEZGQzAzMDgwICAgICAgIC8qIE1NQyBDb3VudGVyIENvbnRyb2wgUmVnaXN0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19NTUNfUklSUVMgICAgICAgICAgMHhGRkMwMzA4NCAgICAgICAvKiBNTUMgUlggSW50ZXJydXB0IFN0YXR1cyBSZWdpc3RlciAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEVNQUNfTU1DX1JJUlFFICAgICAgICAgIDB4RkZDMDMwODggICAgICAgLyogTU1DIFJYIEludGVycnVwdCBFbmFibGVzIFJlZ2lzdGVyICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBFTUFDX01NQ19USVJRUyAgICAgICAgICAweEZGQzAzMDhDICAgICAgIC8qIE1NQyBUWCBJbnRlcnJ1cHQgU3RhdHVzIFJlZ2lzdGVyICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19NTUNfVElSUUUgICAgICAgICAgMHhGRkMwMzA5MCAgICAgICAvKiBNTUMgVFggSW50ZXJydXB0IEVuYWJsZXMgUmVnaXN0ZXIgICAgICAgICAgICAgICAgICAgICovCisKKyNkZWZpbmUgRU1BQ19SWENfT0sgICAgICAgICAgICAgMHhGRkMwMzEwMCAgICAgICAvKiBSWCBGcmFtZSBTdWNjZXNzZnVsIENvdW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEVNQUNfUlhDX0ZDUyAgICAgICAgICAgIDB4RkZDMDMxMDQgICAgICAgLyogUlggRnJhbWUgRkNTIEZhaWx1cmUgQ291bnQgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBFTUFDX1JYQ19BTElHTiAgICAgICAgICAweEZGQzAzMTA4ICAgICAgIC8qIFJYIEFsaWdubWVudCBFcnJvciBDb3VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19SWENfT0NURVQgICAgICAgICAgMHhGRkMwMzEwQyAgICAgICAvKiBSWCBPY3RldHMgU3VjY2Vzc2Z1bGx5IFJlY2VpdmVkIENvdW50ICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEVNQUNfUlhDX0RNQU9WRiAgICAgICAgIDB4RkZDMDMxMTAgICAgICAgLyogSW50ZXJuYWwgTUFDIFN1YmxheWVyIEVycm9yIFJYIEZyYW1lIENvdW50ICAgICAgICAgICAqLworI2RlZmluZSBFTUFDX1JYQ19VTklDU1QgICAgICAgICAweEZGQzAzMTE0ICAgICAgIC8qIFVuaWNhc3QgUlggRnJhbWUgQ291bnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19SWENfTVVMVEkgICAgICAgICAgMHhGRkMwMzExOCAgICAgICAvKiBNdWx0aWNhc3QgUlggRnJhbWUgQ291bnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEVNQUNfUlhDX0JST0FEICAgICAgICAgIDB4RkZDMDMxMUMgICAgICAgLyogQnJvYWRjYXN0IFJYIEZyYW1lIENvdW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBFTUFDX1JYQ19MTkVSUkkgICAgICAgICAweEZGQzAzMTIwICAgICAgIC8qIFJYIEZyYW1lIEluIFJhbmdlIEVycm9yIENvdW50ICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19SWENfTE5FUlJPICAgICAgICAgMHhGRkMwMzEyNCAgICAgICAvKiBSWCBGcmFtZSBPdXQgT2YgUmFuZ2UgRXJyb3IgQ291bnQgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEVNQUNfUlhDX0xPTkcgICAgICAgICAgIDB4RkZDMDMxMjggICAgICAgLyogUlggRnJhbWUgVG9vIExvbmcgQ291bnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBFTUFDX1JYQ19NQUNDVEwgICAgICAgICAweEZGQzAzMTJDICAgICAgIC8qIE1BQyBDb250cm9sIFJYIEZyYW1lIENvdW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19SWENfT1BDT0RFICAgICAgICAgMHhGRkMwMzEzMCAgICAgICAvKiBVbnN1cHBvcnRlZCBPcC1Db2RlIFJYIEZyYW1lIENvdW50ICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEVNQUNfUlhDX1BBVVNFICAgICAgICAgIDB4RkZDMDMxMzQgICAgICAgLyogTUFDIENvbnRyb2wgUGF1c2UgUlggRnJhbWUgQ291bnQgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBFTUFDX1JYQ19BTExGUk0gICAgICAgICAweEZGQzAzMTM4ICAgICAgIC8qIE92ZXJhbGwgUlggRnJhbWUgQ291bnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19SWENfQUxMT0NUICAgICAgICAgMHhGRkMwMzEzQyAgICAgICAvKiBPdmVyYWxsIFJYIE9jdGV0IENvdW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEVNQUNfUlhDX1RZUEVEICAgICAgICAgIDB4RkZDMDMxNDAgICAgICAgLyogVHlwZS9MZW5ndGggQ29uc2lzdGVudCBSWCBGcmFtZSBDb3VudCAgICAgICAgICAgICAgICAqLworI2RlZmluZSBFTUFDX1JYQ19TSE9SVCAgICAgICAgICAweEZGQzAzMTQ0ICAgICAgIC8qIFJYIEZyYW1lIEZyYWdtZW50IENvdW50IC0gQnl0ZSBDb3VudCB4IDwgNjQgICAgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19SWENfRVE2NCAgICAgICAgICAgMHhGRkMwMzE0OCAgICAgICAvKiBHb29kIFJYIEZyYW1lIENvdW50IC0gQnl0ZSBDb3VudCB4ID0gNjQgICAgICAgICAgICAgICovCisjZGVmaW5lIEVNQUNfUlhDX0xUMTI4ICAgICAgICAgIDB4RkZDMDMxNEMgICAgICAgLyogR29vZCBSWCBGcmFtZSBDb3VudCAtIEJ5dGUgQ291bnQgIDY0IDwgeCA8IDEyOCAgICAgICAqLworI2RlZmluZSBFTUFDX1JYQ19MVDI1NiAgICAgICAgICAweEZGQzAzMTUwICAgICAgIC8qIEdvb2QgUlggRnJhbWUgQ291bnQgLSBCeXRlIENvdW50IDEyOCA8PSB4IDwgMjU2ICAgICAgKi8KKyNkZWZpbmUgRU1BQ19SWENfTFQ1MTIgICAgICAgICAgMHhGRkMwMzE1NCAgICAgICAvKiBHb29kIFJYIEZyYW1lIENvdW50IC0gQnl0ZSBDb3VudCAyNTYgPD0geCA8IDUxMiAgICAgICovCisjZGVmaW5lIEVNQUNfUlhDX0xUMTAyNCAgICAgICAgIDB4RkZDMDMxNTggICAgICAgLyogR29vZCBSWCBGcmFtZSBDb3VudCAtIEJ5dGUgQ291bnQgNTEyIDw9IHggPCAxMDI0ICAgICAqLworI2RlZmluZSBFTUFDX1JYQ19HRTEwMjQgICAgICAgICAweEZGQzAzMTVDICAgICAgIC8qIEdvb2QgUlggRnJhbWUgQ291bnQgLSBCeXRlIENvdW50IHggPj0gMTAyNCAgICAgICAgICAgKi8KKworI2RlZmluZSBFTUFDX1RYQ19PSyAgICAgICAgICAgICAweEZGQzAzMTgwICAgICAgIC8qIFRYIEZyYW1lIFN1Y2Nlc3NmdWwgQ291bnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEVNQUNfVFhDXzFDT0wgICAgICAgICAgIDB4RkZDMDMxODQgICAgICAgLyogVFggRnJhbWVzIFN1Y2Nlc3NmdWwgQWZ0ZXIgU2luZ2xlIENvbGxpc2lvbiBDb3VudCAgICAgKi8KKyNkZWZpbmUgRU1BQ19UWENfR1QxQ09MICAgICAgICAgMHhGRkMwMzE4OCAgICAgICAvKiBUWCBGcmFtZXMgU3VjY2Vzc2Z1bCBBZnRlciBNdWx0aXBsZSBDb2xsaXNpb25zIENvdW50ICAqLworI2RlZmluZSBFTUFDX1RYQ19PQ1RFVCAgICAgICAgICAweEZGQzAzMThDICAgICAgIC8qIFRYIE9jdGV0cyBTdWNjZXNzZnVsbHkgUmVjZWl2ZWQgQ291bnQgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEVNQUNfVFhDX0RFRkVSICAgICAgICAgIDB4RkZDMDMxOTAgICAgICAgLyogVFggRnJhbWUgRGVsYXllZCBEdWUgVG8gQnVzeSBDb3VudCAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19UWENfTEFURUNMICAgICAgICAgMHhGRkMwMzE5NCAgICAgICAvKiBMYXRlIFRYIENvbGxpc2lvbnMgQ291bnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBFTUFDX1RYQ19YU19DT0wgICAgICAgICAweEZGQzAzMTk4ICAgICAgIC8qIFRYIEZyYW1lIEZhaWxlZCBEdWUgVG8gRXhjZXNzaXZlIENvbGxpc2lvbnMgQ291bnQgICAgICovCisjZGVmaW5lIEVNQUNfVFhDX0RNQVVORCAgICAgICAgIDB4RkZDMDMxOUMgICAgICAgLyogSW50ZXJuYWwgTUFDIFN1YmxheWVyIEVycm9yIFRYIEZyYW1lIENvdW50ICAgICAgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19UWENfQ1JTRVJSICAgICAgICAgMHhGRkMwMzFBMCAgICAgICAvKiBDYXJyaWVyIFNlbnNlIERlYXNzZXJ0ZWQgRHVyaW5nIFRYIEZyYW1lIENvdW50ICAgICAgICAqLworI2RlZmluZSBFTUFDX1RYQ19VTklDU1QgICAgICAgICAweEZGQzAzMUE0ICAgICAgIC8qIFVuaWNhc3QgVFggRnJhbWUgQ291bnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEVNQUNfVFhDX01VTFRJICAgICAgICAgIDB4RkZDMDMxQTggICAgICAgLyogTXVsdGljYXN0IFRYIEZyYW1lIENvdW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19UWENfQlJPQUQgICAgICAgICAgMHhGRkMwMzFBQyAgICAgICAvKiBCcm9hZGNhc3QgVFggRnJhbWUgQ291bnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBFTUFDX1RYQ19YU19ERlIgICAgICAgICAweEZGQzAzMUIwICAgICAgIC8qIFRYIEZyYW1lcyBXaXRoIEV4Y2Vzc2l2ZSBEZWZlcnJhbCBDb3VudCAgICAgICAgICAgICAgICovCisjZGVmaW5lIEVNQUNfVFhDX01BQ0NUTCAgICAgICAgIDB4RkZDMDMxQjQgICAgICAgLyogTUFDIENvbnRyb2wgVFggRnJhbWUgQ291bnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19UWENfQUxMRlJNICAgICAgICAgMHhGRkMwMzFCOCAgICAgICAvKiBPdmVyYWxsIFRYIEZyYW1lIENvdW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBFTUFDX1RYQ19BTExPQ1QgICAgICAgICAweEZGQzAzMUJDICAgICAgIC8qIE92ZXJhbGwgVFggT2N0ZXQgQ291bnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEVNQUNfVFhDX0VRNjQgICAgICAgICAgIDB4RkZDMDMxQzAgICAgICAgLyogR29vZCBUWCBGcmFtZSBDb3VudCAtIEJ5dGUgQ291bnQgeCA9IDY0ICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19UWENfTFQxMjggICAgICAgICAgMHhGRkMwMzFDNCAgICAgICAvKiBHb29kIFRYIEZyYW1lIENvdW50IC0gQnl0ZSBDb3VudCAgNjQgPCB4IDwgMTI4ICAgICAgICAqLworI2RlZmluZSBFTUFDX1RYQ19MVDI1NiAgICAgICAgICAweEZGQzAzMUM4ICAgICAgIC8qIEdvb2QgVFggRnJhbWUgQ291bnQgLSBCeXRlIENvdW50IDEyOCA8PSB4IDwgMjU2ICAgICAgICovCisjZGVmaW5lIEVNQUNfVFhDX0xUNTEyICAgICAgICAgIDB4RkZDMDMxQ0MgICAgICAgLyogR29vZCBUWCBGcmFtZSBDb3VudCAtIEJ5dGUgQ291bnQgMjU2IDw9IHggPCA1MTIgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19UWENfTFQxMDI0ICAgICAgICAgMHhGRkMwMzFEMCAgICAgICAvKiBHb29kIFRYIEZyYW1lIENvdW50IC0gQnl0ZSBDb3VudCA1MTIgPD0geCA8IDEwMjQgICAgICAqLworI2RlZmluZSBFTUFDX1RYQ19HRTEwMjQgICAgICAgICAweEZGQzAzMUQ0ICAgICAgIC8qIEdvb2QgVFggRnJhbWUgQ291bnQgLSBCeXRlIENvdW50IHggPj0gMTAyNCAgICAgICAgICAgICovCisjZGVmaW5lIEVNQUNfVFhDX0FCT1JUICAgICAgICAgIDB4RkZDMDMxRDggICAgICAgLyogVG90YWwgVFggRnJhbWVzIEFib3J0ZWQgQ291bnQgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworLyogTGlzdGluZyBmb3IgSUVFRS1TdXBwb3J0ZWQgQ291bnQgUmVnaXN0ZXJzICovCisKKyNkZWZpbmUgRnJhbWVzUmVjZWl2ZWRPSyAgICAgICAgICAgICAgICBFTUFDX1JYQ19PSyAgICAgICAgLyogUlggRnJhbWUgU3VjY2Vzc2Z1bCBDb3VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBGcmFtZUNoZWNrU2VxdWVuY2VFcnJvcnMgICAgICAgIEVNQUNfUlhDX0ZDUyAgICAgICAvKiBSWCBGcmFtZSBGQ1MgRmFpbHVyZSBDb3VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEFsaWdubWVudEVycm9ycyAgICAgICAgICAgICAgICAgRU1BQ19SWENfQUxJR04gICAgIC8qIFJYIEFsaWdubWVudCBFcnJvciBDb3VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgT2N0ZXRzUmVjZWl2ZWRPSyAgICAgICAgICAgICAgICBFTUFDX1JYQ19PQ1RFVCAgICAgLyogUlggT2N0ZXRzIFN1Y2Nlc3NmdWxseSBSZWNlaXZlZCBDb3VudCAgICAgICAgICAgICAgICAqLworI2RlZmluZSBGcmFtZXNMb3N0RHVlVG9JbnRNQUNSY3ZFcnJvciAgIEVNQUNfUlhDX0RNQU9WRiAgICAvKiBJbnRlcm5hbCBNQUMgU3VibGF5ZXIgRXJyb3IgUlggRnJhbWUgQ291bnQgICAgICAgICAgICovCisjZGVmaW5lIFVuaWNhc3RGcmFtZXNSZWNlaXZlZE9LICAgICAgICAgRU1BQ19SWENfVU5JQ1NUICAgIC8qIFVuaWNhc3QgUlggRnJhbWUgQ291bnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTXVsdGljYXN0RnJhbWVzUmVjZWl2ZWRPSyAgICAgICBFTUFDX1JYQ19NVUxUSSAgICAgLyogTXVsdGljYXN0IFJYIEZyYW1lIENvdW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBCcm9hZGNhc3RGcmFtZXNSZWNlaXZlZE9LICAgICAgIEVNQUNfUlhDX0JST0FEICAgICAvKiBCcm9hZGNhc3QgUlggRnJhbWUgQ291bnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEluUmFuZ2VMZW5ndGhFcnJvcnMgICAgICAgICAgICAgRU1BQ19SWENfTE5FUlJJICAgIC8qIFJYIEZyYW1lIEluIFJhbmdlIEVycm9yIENvdW50ICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgT3V0T2ZSYW5nZUxlbmd0aEZpZWxkICAgICAgICAgICBFTUFDX1JYQ19MTkVSUk8gICAgLyogUlggRnJhbWUgT3V0IE9mIFJhbmdlIEVycm9yIENvdW50ICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBGcmFtZVRvb0xvbmdFcnJvcnMgICAgICAgICAgICAgIEVNQUNfUlhDX0xPTkcgICAgICAvKiBSWCBGcmFtZSBUb28gTG9uZyBDb3VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE1BQ0NvbnRyb2xGcmFtZXNSZWNlaXZlZCAgICAgICAgRU1BQ19SWENfTUFDQ1RMICAgIC8qIE1BQyBDb250cm9sIFJYIEZyYW1lIENvdW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVW5zdXBwb3J0ZWRPcGNvZGVzUmVjZWl2ZWQgICAgICBFTUFDX1JYQ19PUENPREUgICAgLyogVW5zdXBwb3J0ZWQgT3AtQ29kZSBSWCBGcmFtZSBDb3VudCAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBQQVVTRU1BQ0N0cmxGcmFtZXNSZWNlaXZlZCAgICAgIEVNQUNfUlhDX1BBVVNFICAgICAvKiBNQUMgQ29udHJvbCBQYXVzZSBSWCBGcmFtZSBDb3VudCAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEZyYW1lc1JlY2VpdmVkQWxsICAgICAgICAgICAgICAgRU1BQ19SWENfQUxMRlJNICAgIC8qIE92ZXJhbGwgUlggRnJhbWUgQ291bnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgT2N0ZXRzUmVjZWl2ZWRBbGwgICAgICAgICAgICAgICBFTUFDX1JYQ19BTExPQ1QgICAgLyogT3ZlcmFsbCBSWCBPY3RldCBDb3VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBUeXBlZEZyYW1lc1JlY2VpdmVkICAgICAgICAgICAgIEVNQUNfUlhDX1RZUEVEICAgICAvKiBUeXBlL0xlbmd0aCBDb25zaXN0ZW50IFJYIEZyYW1lIENvdW50ICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEZyYW1lc0xlbkx0NjRSZWNlaXZlZCAgICAgICAgICAgRU1BQ19SWENfU0hPUlQgICAgIC8qIFJYIEZyYW1lIEZyYWdtZW50IENvdW50IC0gQnl0ZSBDb3VudCB4IDwgNjQgICAgICAgICAgKi8KKyNkZWZpbmUgRnJhbWVzTGVuRXE2NFJlY2VpdmVkICAgICAgICAgICBFTUFDX1JYQ19FUTY0ICAgICAgLyogR29vZCBSWCBGcmFtZSBDb3VudCAtIEJ5dGUgQ291bnQgeCA9IDY0ICAgICAgICAgICAgICAqLworI2RlZmluZSBGcmFtZXNMZW42NV8xMjdSZWNlaXZlZCAgICAgICAgIEVNQUNfUlhDX0xUMTI4ICAgICAvKiBHb29kIFJYIEZyYW1lIENvdW50IC0gQnl0ZSBDb3VudCAgNjQgPCB4IDwgMTI4ICAgICAgICovCisjZGVmaW5lIEZyYW1lc0xlbjEyOF8yNTVSZWNlaXZlZCAgICAgICAgRU1BQ19SWENfTFQyNTYgICAgIC8qIEdvb2QgUlggRnJhbWUgQ291bnQgLSBCeXRlIENvdW50IDEyOCA8PSB4IDwgMjU2ICAgICAgKi8KKyNkZWZpbmUgRnJhbWVzTGVuMjU2XzUxMVJlY2VpdmVkICAgICAgICBFTUFDX1JYQ19MVDUxMiAgICAgLyogR29vZCBSWCBGcmFtZSBDb3VudCAtIEJ5dGUgQ291bnQgMjU2IDw9IHggPCA1MTIgICAgICAqLworI2RlZmluZSBGcmFtZXNMZW41MTJfMTAyM1JlY2VpdmVkICAgICAgIEVNQUNfUlhDX0xUMTAyNCAgICAvKiBHb29kIFJYIEZyYW1lIENvdW50IC0gQnl0ZSBDb3VudCA1MTIgPD0geCA8IDEwMjQgICAgICovCisjZGVmaW5lIEZyYW1lc0xlbjEwMjRfTWF4UmVjZWl2ZWQgICAgICAgRU1BQ19SWENfR0UxMDI0ICAgIC8qIEdvb2QgUlggRnJhbWUgQ291bnQgLSBCeXRlIENvdW50IHggPj0gMTAyNCAgICAgICAgICAgKi8KKworI2RlZmluZSBGcmFtZXNUcmFuc21pdHRlZE9LICAgICAgICAgICAgIEVNQUNfVFhDX09LICAgICAgICAvKiBUWCBGcmFtZSBTdWNjZXNzZnVsIENvdW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFNpbmdsZUNvbGxpc2lvbkZyYW1lcyAgICAgICAgICAgRU1BQ19UWENfMUNPTCAgICAgIC8qIFRYIEZyYW1lcyBTdWNjZXNzZnVsIEFmdGVyIFNpbmdsZSBDb2xsaXNpb24gQ291bnQgICAgKi8KKyNkZWZpbmUgTXVsdGlwbGVDb2xsaXNpb25GcmFtZXMgICAgICAgICBFTUFDX1RYQ19HVDFDT0wgICAgLyogVFggRnJhbWVzIFN1Y2Nlc3NmdWwgQWZ0ZXIgTXVsdGlwbGUgQ29sbGlzaW9ucyBDb3VudCAqLworI2RlZmluZSBPY3RldHNUcmFuc21pdHRlZE9LICAgICAgICAgICAgIEVNQUNfVFhDX09DVEVUICAgICAvKiBUWCBPY3RldHMgU3VjY2Vzc2Z1bGx5IFJlY2VpdmVkIENvdW50ICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEZyYW1lc1dpdGhEZWZlcnJlZFhtaXNzaW9ucyAgICAgRU1BQ19UWENfREVGRVIgICAgIC8qIFRYIEZyYW1lIERlbGF5ZWQgRHVlIFRvIEJ1c3kgQ291bnQgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTGF0ZUNvbGxpc2lvbnMgICAgICAgICAgICAgICAgICBFTUFDX1RYQ19MQVRFQ0wgICAgLyogTGF0ZSBUWCBDb2xsaXNpb25zIENvdW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBGcmFtZXNBYm9ydGVkRHVlVG9YU0NvbGxzICAgICAgIEVNQUNfVFhDX1hTX0NPTCAgICAvKiBUWCBGcmFtZSBGYWlsZWQgRHVlIFRvIEV4Y2Vzc2l2ZSBDb2xsaXNpb25zIENvdW50ICAgICovCisjZGVmaW5lIEZyYW1lc0xvc3REdWVUb0ludE1hY1htaXRFcnJvciAgRU1BQ19UWENfRE1BVU5EICAgIC8qIEludGVybmFsIE1BQyBTdWJsYXllciBFcnJvciBUWCBGcmFtZSBDb3VudCAgICAgICAgICAgKi8KKyNkZWZpbmUgQ2FycmllclNlbnNlRXJyb3JzICAgICAgICAgICAgICBFTUFDX1RYQ19DUlNFUlIgICAgLyogQ2FycmllciBTZW5zZSBEZWFzc2VydGVkIER1cmluZyBUWCBGcmFtZSBDb3VudCAgICAgICAqLworI2RlZmluZSBVbmljYXN0RnJhbWVzWG1pdHRlZE9LICAgICAgICAgIEVNQUNfVFhDX1VOSUNTVCAgICAvKiBVbmljYXN0IFRYIEZyYW1lIENvdW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE11bHRpY2FzdEZyYW1lc1htaXR0ZWRPSyAgICAgICAgRU1BQ19UWENfTVVMVEkgICAgIC8qIE11bHRpY2FzdCBUWCBGcmFtZSBDb3VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQnJvYWRjYXN0RnJhbWVzWG1pdHRlZE9LICAgICAgICBFTUFDX1RYQ19CUk9BRCAgICAgLyogQnJvYWRjYXN0IFRYIEZyYW1lIENvdW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBGcmFtZXNXaXRoRXhjZXNzaXZlRGVmZXJyYWwgICAgIEVNQUNfVFhDX1hTX0RGUiAgICAvKiBUWCBGcmFtZXMgV2l0aCBFeGNlc3NpdmUgRGVmZXJyYWwgQ291bnQgICAgICAgICAgICAgICovCisjZGVmaW5lIE1BQ0NvbnRyb2xGcmFtZXNUcmFuc21pdHRlZCAgICAgRU1BQ19UWENfTUFDQ1RMICAgIC8qIE1BQyBDb250cm9sIFRYIEZyYW1lIENvdW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRnJhbWVzVHJhbnNtaXR0ZWRBbGwgICAgICAgICAgICBFTUFDX1RYQ19BTExGUk0gICAgLyogT3ZlcmFsbCBUWCBGcmFtZSBDb3VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBPY3RldHNUcmFuc21pdHRlZEFsbCAgICAgICAgICAgIEVNQUNfVFhDX0FMTE9DVCAgICAvKiBPdmVyYWxsIFRYIE9jdGV0IENvdW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEZyYW1lc0xlbkVxNjRUcmFuc21pdHRlZCAgICAgICAgRU1BQ19UWENfRVE2NCAgICAgIC8qIEdvb2QgVFggRnJhbWUgQ291bnQgLSBCeXRlIENvdW50IHggPSA2NCAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRnJhbWVzTGVuNjVfMTI3VHJhbnNtaXR0ZWQgICAgICBFTUFDX1RYQ19MVDEyOCAgICAgLyogR29vZCBUWCBGcmFtZSBDb3VudCAtIEJ5dGUgQ291bnQgIDY0IDwgeCA8IDEyOCAgICAgICAqLworI2RlZmluZSBGcmFtZXNMZW4xMjhfMjU1VHJhbnNtaXR0ZWQgICAgIEVNQUNfVFhDX0xUMjU2ICAgICAvKiBHb29kIFRYIEZyYW1lIENvdW50IC0gQnl0ZSBDb3VudCAxMjggPD0geCA8IDI1NiAgICAgICovCisjZGVmaW5lIEZyYW1lc0xlbjI1Nl81MTFUcmFuc21pdHRlZCAgICAgRU1BQ19UWENfTFQ1MTIgICAgIC8qIEdvb2QgVFggRnJhbWUgQ291bnQgLSBCeXRlIENvdW50IDI1NiA8PSB4IDwgNTEyICAgICAgKi8KKyNkZWZpbmUgRnJhbWVzTGVuNTEyXzEwMjNUcmFuc21pdHRlZCAgICBFTUFDX1RYQ19MVDEwMjQgICAgLyogR29vZCBUWCBGcmFtZSBDb3VudCAtIEJ5dGUgQ291bnQgNTEyIDw9IHggPCAxMDI0ICAgICAqLworI2RlZmluZSBGcmFtZXNMZW4xMDI0X01heFRyYW5zbWl0dGVkICAgIEVNQUNfVFhDX0dFMTAyNCAgICAvKiBHb29kIFRYIEZyYW1lIENvdW50IC0gQnl0ZSBDb3VudCB4ID49IDEwMjQgICAgICAgICAgICovCisjZGVmaW5lIFR4QWJvcnRlZEZyYW1lcyAgICAgICAgICAgICAgICAgRU1BQ19UWENfQUJPUlQgICAgIC8qIFRvdGFsIFRYIEZyYW1lcyBBYm9ydGVkIENvdW50ICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKiBTeXN0ZW0gTU1SIFJlZ2lzdGVyIEJpdHMgQW5kIE1hY3JvcworKioKKyoqIERpc2NsYWltZXI6CUFsbCBtYWNyb3MgYXJlIGludGVuZGVkIHRvIG1ha2UgQyBhbmQgQXNzZW1ibHkgY29kZSBtb3JlIHJlYWRhYmxlLgorKioJCQkJVXNlIHRoZXNlIG1hY3JvcyBjYXJlZnVsbHksIGFzIGFueSB0aGF0IGRvIGxlZnQgc2hpZnRzIGZvciBmaWVsZAorKioJCQkJZGVwb3NpdGluZyB3aWxsIHJlc3VsdCBpbiB0aGUgbG93ZXIgb3JkZXIgYml0cyBiZWluZyBkZXN0cm95ZWQuICBBbnkKKyoqCQkJCW1hY3JvIHRoYXQgc2hpZnRzIGxlZnQgdG8gcHJvcGVybHkgcG9zaXRpb24gdGhlIGJpdC1maWVsZCBzaG91bGQgYmUKKyoqCQkJCXVzZWQgYXMgcGFydCBvZiBhbiBPUiB0byBpbml0aWFsaXplIGEgcmVnaXN0ZXIgYW5kIE5PVCBhcyBhIGR5bmFtaWMKKyoqCQkJCW1vZGlmaWVyIFVOTEVTUyB0aGUgbG93ZXIgb3JkZXIgYml0cyBhcmUgc2F2ZWQgYW5kIE9SZWQgYmFjayBpbiB3aGVuCisqKgkJCQl0aGUgbWFjcm8gaXMgdXNlZC4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogIEVUSEVSTkVUIDEwLzEwMCBDT05UUk9MTEVSIE1BU0tTICAqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEVNQUNfT1BNT0RFIE1hc2tzICovCisKKyNkZWZpbmUJUkUgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEgICAgIC8qIFJlY2VpdmVyIEVuYWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCUFTVFAgICAgICAgICAgICAgICAweDAwMDAwMDAyICAgICAvKiBFbmFibGUgQXV0b21hdGljIFBhZCBTdHJpcHBpbmcgT24gUlggRnJhbWVzICAgICAgICAqLworI2RlZmluZQlIVSAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMCAgICAgLyogSGFzaCBGaWx0ZXIgVW5pY2FzdCBBZGRyZXNzICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJSE0gICAgICAgICAgICAgICAgIDB4MDAwMDAwMjAgICAgIC8qIEhhc2ggRmlsdGVyIE11bHRpY2FzdCBBZGRyZXNzICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVBBTSAgICAgICAgICAgICAgICAweDAwMDAwMDQwICAgICAvKiBQYXNzLUFsbC1NdWx0aWNhc3QgTW9kZSBFbmFibGUgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlQUiAgICAgICAgICAgICAgICAgMHgwMDAwMDA4MCAgICAgLyogUHJvbWlzY3VvdXMgTW9kZSBFbmFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJSUZFICAgICAgICAgICAgICAgIDB4MDAwMDAxMDAgICAgIC8qIEludmVyc2UgRmlsdGVyaW5nIEVuYWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCURCRiAgICAgICAgICAgICAgICAweDAwMDAwMjAwICAgICAvKiBEaXNhYmxlIEJyb2FkY2FzdCBGcmFtZSBSZWNlcHRpb24gICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlQQkYgICAgICAgICAgICAgICAgMHgwMDAwMDQwMCAgICAgLyogUGFzcyBCYWQgRnJhbWVzIEVuYWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJUFNGICAgICAgICAgICAgICAgIDB4MDAwMDA4MDAgICAgIC8qIFBhc3MgU2hvcnQgRnJhbWVzIEVuYWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVJBRiAgICAgICAgICAgICAgICAweDAwMDAxMDAwICAgICAvKiBSZWNlaXZlLUFsbCBNb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlURSAgICAgICAgICAgICAgICAgMHgwMDAxMDAwMCAgICAgLyogVHJhbnNtaXR0ZXIgRW5hYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJRFRYUEFEICAgICAgICAgICAgIDB4MDAwMjAwMDAgICAgIC8qIERpc2FibGUgQXV0b21hdGljIFRYIFBhZGRpbmcgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCURUWENSQyAgICAgICAgICAgICAweDAwMDQwMDAwICAgICAvKiBEaXNhYmxlIEF1dG9tYXRpYyBUWCBDUkMgR2VuZXJhdGlvbiAgICAgICAgICAgICAgICAqLworI2RlZmluZQlEQyAgICAgICAgICAgICAgICAgMHgwMDA4MDAwMCAgICAgLyogRGVmZXJyYWwgQ2hlY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJQk9MTVQgICAgICAgICAgICAgIDB4MDAzMDAwMDAgICAgIC8qIEJhY2stT2ZmIExpbWl0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCUJPTE1UXzEwICAgICAgICAgICAweDAwMDAwMDAwICAgICAvKgkJMTAtYml0IHJhbmdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCUJPTE1UXzggICAgICAgICAgICAweDAwMTAwMDAwICAgICAvKgkJOC1iaXQgcmFuZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCUJPTE1UXzQgICAgICAgICAgICAweDAwMjAwMDAwICAgICAvKgkJNC1iaXQgcmFuZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCUJPTE1UXzEgICAgICAgICAgICAweDAwMzAwMDAwICAgICAvKgkJMS1iaXQgcmFuZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCURSVFkgICAgICAgICAgICAgICAweDAwNDAwMDAwICAgICAvKiBEaXNhYmxlIFRYIFJldHJ5IE9uIENvbGxpc2lvbiAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlMQ1RSRSAgICAgICAgICAgICAgMHgwMDgwMDAwMCAgICAgLyogRW5hYmxlIFRYIFJldHJ5IE9uIExhdGUgQ29sbGlzaW9uICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJUk1JSSAgICAgICAgICAgICAgIDB4MDEwMDAwMDAgICAgIC8qIFJNSUkvTUlJKiBNb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVJNSUlfMTAgICAgICAgICAgICAweDAyMDAwMDAwICAgICAvKiBTcGVlZCBTZWxlY3QgZm9yIFJNSUkgUG9ydCAoMTBNQml0LzEwME1CaXQqKSAgICAgICAqLworI2RlZmluZQlGRE1PREUgICAgICAgICAgICAgMHgwNDAwMDAwMCAgICAgLyogRHVwbGV4IE1vZGUgRW5hYmxlIChGdWxsL0hhbGYqKSAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJTEIgICAgICAgICAgICAgICAgIDB4MDgwMDAwMDAgICAgIC8qIEludGVybmFsIExvb3BiYWNrIEVuYWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCURSTyAgICAgICAgICAgICAgICAweDEwMDAwMDAwICAgICAvKiBEaXNhYmxlIFJlY2VpdmUgT3duIEZyYW1lcyAoSGFsZi1EdXBsZXggTW9kZSkgICAgICAqLworCisvKiBFTUFDX1NUQUFERCBNYXNrcyAqLworCisjZGVmaW5lCVNUQUJVU1kgICAgICAgICAgICAweDAwMDAwMDAxICAgICAvKiBJbml0aWF0ZSBTdGF0aW9uIE1ndCBSZWcgQWNjZXNzIC8gU1RBIEJ1c3kgU3RhdCAgICAqLworI2RlZmluZQlTVEFPUCAgICAgICAgICAgICAgMHgwMDAwMDAwMiAgICAgLyogU3RhdGlvbiBNYW5hZ2VtZW50IE9wZXJhdGlvbiBDb2RlIChXcml0ZS9SZWFkKikgICAgKi8KKyNkZWZpbmUJU1RBRElTUFJFICAgICAgICAgIDB4MDAwMDAwMDQgICAgIC8qIERpc2FibGUgUHJlYW1ibGUgR2VuZXJhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVNUQUlFICAgICAgICAgICAgICAweDAwMDAwMDA4ICAgICAvKiBTdGF0aW9uIE1ndC4gVHJhbnNmZXIgRG9uZSBJbnRlcnJ1cHQgRW5hYmxlICAgICAgICAqLworI2RlZmluZQlSRUdBRCAgICAgICAgICAgICAgMHgwMDAwMDdDMCAgICAgLyogU1RBIFJlZ2lzdGVyIEFkZHJlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJUEhZQUQgICAgICAgICAgICAgIDB4MDAwMEY4MDAgICAgIC8qIFBIWSBEZXZpY2UgQWRkcmVzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyNkZWZpbmUJU0VUX1JFR0FEKHgpICgoKHgpJjB4MUYpPDwgIDYgKSAgIC8qIFNldCBTVEEgUmVnaXN0ZXIgQWRkcmVzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVNFVF9QSFlBRCh4KSAoKCh4KSYweDFGKTw8IDExICkgICAvKiBTZXQgUEhZIERldmljZSBBZGRyZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisvKiBFTUFDX1NUQURBVCBNYXNrICovCisKKyNkZWZpbmUJU1RBREFUQSAgICAgICAgICAgIDB4MDAwMEZGRkYgICAgIC8qIFN0YXRpb24gTWFuYWdlbWVudCBEYXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKy8qIEVNQUNfRkxDIE1hc2tzICovCisKKyNkZWZpbmUJRkxDQlVTWSAgICAgICAgICAgIDB4MDAwMDAwMDEgICAgIC8qIFNlbmQgRmxvdyBDdHJsIEZyYW1lIC8gRmxvdyBDdHJsIEJ1c3kgU3RhdHVzICAgICAgICovCisjZGVmaW5lCUZMQ0UgICAgICAgICAgICAgICAweDAwMDAwMDAyICAgICAvKiBGbG93IENvbnRyb2wgRW5hYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlQQ0YgICAgICAgICAgICAgICAgMHgwMDAwMDAwNCAgICAgLyogUGFzcyBDb250cm9sIEZyYW1lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJQktQUlNFTiAgICAgICAgICAgIDB4MDAwMDAwMDggICAgIC8qIEVuYWJsZSBCYWNrcHJlc3N1cmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCUZMQ1BBVVNFICAgICAgICAgICAweEZGRkYwMDAwICAgICAvKiBQYXVzZSBUaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisjZGVmaW5lCVNFVF9GTENQQVVTRSh4KSAoKCh4KSYweEZGRkYpPDwgMTYpIC8qIFNldCBQYXVzZSBUaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisvKiBFTUFDX1dLVVBfQ1RMIE1hc2tzICovCisKKyNkZWZpbmUJQ0FQV0tGUk0gICAgICAgICAgIDB4MDAwMDAwMDEgICAgLyogQ2FwdHVyZSBXYWtlLVVwIEZyYW1lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCU1QS0UgICAgICAgICAgICAgICAweDAwMDAwMDAyICAgIC8qIE1hZ2ljIFBhY2tldCBFbmFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlSV0tFICAgICAgICAgICAgICAgMHgwMDAwMDAwNCAgICAvKiBSZW1vdGUgV2FrZS1VcCBGcmFtZSBFbmFibGUgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJR1VXS0UgICAgICAgICAgICAgIDB4MDAwMDAwMDggICAgLyogR2xvYmFsIFVuaWNhc3QgV2FrZSBFbmFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCU1QS1MgICAgICAgICAgICAgICAweDAwMDAwMDIwICAgIC8qIE1hZ2ljIFBhY2tldCBSZWNlaXZlZCBTdGF0dXMgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlSV0tTICAgICAgICAgICAgICAgMHgwMDAwMEYwMCAgICAvKiBXYWtlLVVwIEZyYW1lIFJlY2VpdmVkIFN0YXR1cywgRmlsdGVycyAzOjAgICAgICAgICAgKi8KKworLyogRU1BQ19XS1VQX0ZGQ01EIE1hc2tzICovCisKKyNkZWZpbmUJV0YwX0UgICAgICAgICAgICAgIDB4MDAwMDAwMDEgICAgLyogRW5hYmxlIFdha2UtVXAgRmlsdGVyIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlXRjBfVCAgICAgICAgICAgICAgMHgwMDAwMDAwOCAgICAvKiBXYWtlLVVwIEZpbHRlciAwIEFkZHIgVHlwZSAoTXVsdGljYXN0L1VuaWNhc3QqKSAgICAgICovCisjZGVmaW5lCVdGMV9FICAgICAgICAgICAgICAweDAwMDAwMTAwICAgIC8qIEVuYWJsZSBXYWtlLVVwIEZpbHRlciAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJV0YxX1QgICAgICAgICAgICAgIDB4MDAwMDA4MDAgICAgLyogV2FrZS1VcCBGaWx0ZXIgMSBBZGRyIFR5cGUgKE11bHRpY2FzdC9VbmljYXN0KikgICAgICAqLworI2RlZmluZQlXRjJfRSAgICAgICAgICAgICAgMHgwMDAxMDAwMCAgICAvKiBFbmFibGUgV2FrZS1VcCBGaWx0ZXIgMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVdGMl9UICAgICAgICAgICAgICAweDAwMDgwMDAwICAgIC8qIFdha2UtVXAgRmlsdGVyIDIgQWRkciBUeXBlIChNdWx0aWNhc3QvVW5pY2FzdCopICAgICAgKi8KKyNkZWZpbmUJV0YzX0UgICAgICAgICAgICAgIDB4MDEwMDAwMDAgICAgLyogRW5hYmxlIFdha2UtVXAgRmlsdGVyIDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlXRjNfVCAgICAgICAgICAgICAgMHgwODAwMDAwMCAgICAvKiBXYWtlLVVwIEZpbHRlciAzIEFkZHIgVHlwZSAoTXVsdGljYXN0L1VuaWNhc3QqKSAgICAgICovCisKKy8qIEVNQUNfV0tVUF9GRk9GRiBNYXNrcyAqLworCisjZGVmaW5lCVdGMF9PRkYgICAgICAgICAgICAweDAwMDAwMEZGICAgIC8qIFdha2UtVXAgRmlsdGVyIDAgUGF0dGVybiBPZmZzZXQgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJV0YxX09GRiAgICAgICAgICAgIDB4MDAwMEZGMDAgICAgLyogV2FrZS1VcCBGaWx0ZXIgMSBQYXR0ZXJuIE9mZnNldCAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlXRjJfT0ZGICAgICAgICAgICAgMHgwMEZGMDAwMCAgICAvKiBXYWtlLVVwIEZpbHRlciAyIFBhdHRlcm4gT2Zmc2V0ICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVdGM19PRkYgICAgICAgICAgICAweEZGMDAwMDAwICAgIC8qIFdha2UtVXAgRmlsdGVyIDMgUGF0dGVybiBPZmZzZXQgICAgICAgICAgICAgICAgICAgICAgKi8KKworI2RlZmluZQlTRVRfV0YwX09GRih4KSAoKCh4KSYweEZGKTw8ICAwICkgLyogU2V0IFdha2UtVXAgRmlsdGVyIDAgQnl0ZSBPZmZzZXQgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVNFVF9XRjFfT0ZGKHgpICgoKHgpJjB4RkYpPDwgIDggKSAvKiBTZXQgV2FrZS1VcCBGaWx0ZXIgMSBCeXRlIE9mZnNldCAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJU0VUX1dGMl9PRkYoeCkgKCgoeCkmMHhGRik8PCAxNiApIC8qIFNldCBXYWtlLVVwIEZpbHRlciAyIEJ5dGUgT2Zmc2V0ICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlTRVRfV0YzX09GRih4KSAoKCh4KSYweEZGKTw8IDI0ICkgLyogU2V0IFdha2UtVXAgRmlsdGVyIDMgQnl0ZSBPZmZzZXQgICAgICAgICAgICAgICAgICAgICovCisvKiBTZXQgQUxMIE9mZnNldHMgKi8KKyNkZWZpbmUJU0VUX1dGX09GRlMoeDAseDEseDIseDMpIChTRVRfV0YwX09GRigoeDApKXxTRVRfV0YxX09GRigoeDEpKXxTRVRfV0YyX09GRigoeDIpKXxTRVRfV0YzX09GRigoeDMpKSkKKworLyogRU1BQ19XS1VQX0ZGQ1JDMCBNYXNrcyAqLworCisjZGVmaW5lCVdGMF9DUkMgICAgICAgICAgIDB4MDAwMEZGRkYgICAgLyogV2FrZS1VcCBGaWx0ZXIgMCBQYXR0ZXJuIENSQyAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVdGMV9DUkMgICAgICAgICAgIDB4RkZGRjAwMDAgICAgLyogV2FrZS1VcCBGaWx0ZXIgMSBQYXR0ZXJuIENSQyAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyNkZWZpbmUJU0VUX1dGMF9DUkMoeCkgKCgoeCkmMHhGRkZGKTw8ICAgMCApIC8qIFNldCBXYWtlLVVwIEZpbHRlciAwIFRhcmdldCBDUkMgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJU0VUX1dGMV9DUkMoeCkgKCgoeCkmMHhGRkZGKTw8ICAxNiApIC8qIFNldCBXYWtlLVVwIEZpbHRlciAxIFRhcmdldCBDUkMgICAgICAgICAgICAgICAgICAgKi8KKworLyogRU1BQ19XS1VQX0ZGQ1JDMSBNYXNrcyAqLworCisjZGVmaW5lCVdGMl9DUkMgICAgICAgICAgIDB4MDAwMEZGRkYgICAgLyogV2FrZS1VcCBGaWx0ZXIgMiBQYXR0ZXJuIENSQyAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVdGM19DUkMgICAgICAgICAgIDB4RkZGRjAwMDAgICAgLyogV2FrZS1VcCBGaWx0ZXIgMyBQYXR0ZXJuIENSQyAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyNkZWZpbmUJU0VUX1dGMl9DUkMoeCkgKCgoeCkmMHhGRkZGKTw8ICAgMCApIC8qIFNldCBXYWtlLVVwIEZpbHRlciAyIFRhcmdldCBDUkMgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJU0VUX1dGM19DUkMoeCkgKCgoeCkmMHhGRkZGKTw8ICAxNiApIC8qIFNldCBXYWtlLVVwIEZpbHRlciAzIFRhcmdldCBDUkMgICAgICAgICAgICAgICAgICAgKi8KKworLyogRU1BQ19TWVNDVEwgTWFza3MgKi8KKworI2RlZmluZQlQSFlJRSAgICAgICAgICAgICAweDAwMDAwMDAxICAgIC8qIFBIWV9JTlQgSW50ZXJydXB0IEVuYWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlSWERXQSAgICAgICAgICAgICAweDAwMDAwMDAyICAgIC8qIFJlY2VpdmUgRnJhbWUgRE1BIFdvcmQgQWxpZ25tZW50IChPZGQvRXZlbiopICAgICAgICAgICAqLworI2RlZmluZQlSWENLUyAgICAgICAgICAgICAweDAwMDAwMDA0ICAgIC8qIEVuYWJsZSBSWCBGcmFtZSBUQ1AvVURQIENoZWNrc3VtIENvbXB1dGF0aW9uICAgICAgICAgICAqLworI2RlZmluZQlUWERXQSAgICAgICAgICAgICAweDAwMDAwMDEwICAgIC8qIFRyYW5zbWl0IEZyYW1lIERNQSBXb3JkIEFsaWdubWVudCAoT2RkL0V2ZW4qKSAgICAgICAgICAqLworI2RlZmluZQlNRENESVYgICAgICAgICAgICAweDAwMDAzRjAwICAgIC8qIFNDTEs6TURDIENsb2NrIERpdmlzb3IgW01EQz1TQ0xLLygyKihOKzEpKV0gICAgICAgICAgICAqLworCisjZGVmaW5lCVNFVF9NRENESVYoeCkgKCgoeCkmMHgzRik8PCA4KSAgIC8qIFNldCBNREMgQ2xvY2sgRGl2aXNvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKy8qIEVNQUNfU1lTVEFUIE1hc2tzICovCisKKyNkZWZpbmUJUEhZSU5UICAgICAgICAgICAgMHgwMDAwMDAwMSAgICAvKiBQSFlfSU5UIEludGVycnVwdCBTdGF0dXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJTU1DSU5UICAgICAgICAgICAgMHgwMDAwMDAwMiAgICAvKiBNTUMgQ291bnRlciBJbnRlcnJ1cHQgU3RhdHVzICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJUlhGU0lOVCAgICAgICAgICAgMHgwMDAwMDAwNCAgICAvKiBSWCBGcmFtZS1TdGF0dXMgSW50ZXJydXB0IFN0YXR1cyAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJVFhGU0lOVCAgICAgICAgICAgMHgwMDAwMDAwOCAgICAvKiBUWCBGcmFtZS1TdGF0dXMgSW50ZXJydXB0IFN0YXR1cyAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJV0FLRURFVCAgICAgICAgICAgMHgwMDAwMDAxMCAgICAvKiBXYWtlLVVwIERldGVjdGVkIFN0YXR1cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJUlhETUFFUlIgICAgICAgICAgMHgwMDAwMDAyMCAgICAvKiBSWCBETUEgRGlyZWN0aW9uIEVycm9yIFN0YXR1cyAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJVFhETUFFUlIgICAgICAgICAgMHgwMDAwMDA0MCAgICAvKiBUWCBETUEgRGlyZWN0aW9uIEVycm9yIFN0YXR1cyAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJU1RNRE9ORSAgICAgICAgICAgMHgwMDAwMDA4MCAgICAvKiBTdGF0aW9uIE1ndC4gVHJhbnNmZXIgRG9uZSBJbnRlcnJ1cHQgU3RhdHVzICAgICAgICAgICAgKi8KKworLyogRU1BQ19SWF9TVEFULCBFTUFDX1JYX1NUS1ksIGFuZCBFTUFDX1JYX0lSUUUgTWFza3MgKi8KKworI2RlZmluZQlSWF9GUkxFTiAgICAgICAgICAweDAwMDAwN0ZGICAgIC8qIEZyYW1lIExlbmd0aCBJbiBCeXRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlSWF9DT01QICAgICAgICAgICAweDAwMDAxMDAwICAgIC8qIFJYIEZyYW1lIENvbXBsZXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlSWF9PSyAgICAgICAgICAgICAweDAwMDAyMDAwICAgIC8qIFJYIEZyYW1lIFJlY2VpdmVkIFdpdGggTm8gRXJyb3JzICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlSWF9MT05HICAgICAgICAgICAweDAwMDA0MDAwICAgIC8qIFJYIEZyYW1lIFRvbyBMb25nIEVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlSWF9BTElHTiAgICAgICAgICAweDAwMDA4MDAwICAgIC8qIFJYIEZyYW1lIEFsaWdubWVudCBFcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlSWF9DUkMgICAgICAgICAgICAweDAwMDEwMDAwICAgIC8qIFJYIEZyYW1lIENSQyBFcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlSWF9MRU4gICAgICAgICAgICAweDAwMDIwMDAwICAgIC8qIFJYIEZyYW1lIExlbmd0aCBFcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlSWF9GUkFHICAgICAgICAgICAweDAwMDQwMDAwICAgIC8qIFJYIEZyYW1lIEZyYWdtZW50IEVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlSWF9BRERSICAgICAgICAgICAweDAwMDgwMDAwICAgIC8qIFJYIEZyYW1lIEFkZHJlc3MgRmlsdGVyIEZhaWxlZCBFcnJvciAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlSWF9ETUFPICAgICAgICAgICAweDAwMTAwMDAwICAgIC8qIFJYIEZyYW1lIERNQSBPdmVycnVuIEVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlSWF9QSFkgICAgICAgICAgICAweDAwMjAwMDAwICAgIC8qIFJYIEZyYW1lIFBIWSBFcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlSWF9MQVRFICAgICAgICAgICAweDAwNDAwMDAwICAgIC8qIFJYIEZyYW1lIExhdGUgQ29sbGlzaW9uIEVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlSWF9SQU5HRSAgICAgICAgICAweDAwODAwMDAwICAgIC8qIFJYIEZyYW1lIExlbmd0aCBGaWVsZCBPdXQgb2YgUmFuZ2UgRXJyb3IgICAgICAgICAgICAgICAqLworI2RlZmluZQlSWF9NVUxUSSAgICAgICAgICAweDAxMDAwMDAwICAgIC8qIFJYIE11bHRpY2FzdCBGcmFtZSBJbmRpY2F0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlSWF9CUk9BRCAgICAgICAgICAweDAyMDAwMDAwICAgIC8qIFJYIEJyb2FkY2FzdCBGcmFtZSBJbmRpY2F0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlSWF9DVEwgICAgICAgICAgICAweDA0MDAwMDAwICAgIC8qIFJYIENvbnRyb2wgRnJhbWUgSW5kaWNhdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlSWF9VQ1RMICAgICAgICAgICAweDA4MDAwMDAwICAgIC8qIFVuc3VwcG9ydGVkIFJYIENvbnRyb2wgRnJhbWUgSW5kaWNhdG9yICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlSWF9UWVBFICAgICAgICAgICAweDEwMDAwMDAwICAgIC8qIFJYIFR5cGVkIEZyYW1lIEluZGljYXRvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlSWF9WTEFOMSAgICAgICAgICAweDIwMDAwMDAwICAgIC8qIFJYIFZMQU4xIEZyYW1lIEluZGljYXRvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlSWF9WTEFOMiAgICAgICAgICAweDQwMDAwMDAwICAgIC8qIFJYIFZMQU4yIEZyYW1lIEluZGljYXRvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlSWF9BQ0NFUFQgICAgICAgICAweDgwMDAwMDAwICAgIC8qIFJYIEZyYW1lIEFjY2VwdGVkIEluZGljYXRvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisvKiAgRU1BQ19UWF9TVEFULCBFTUFDX1RYX1NUS1ksIGFuZCBFTUFDX1RYX0lSUUUgTWFza3MgICovCisKKyNkZWZpbmUJVFhfQ09NUCAgICAgICAgICAgMHgwMDAwMDAwMSAgICAvKiBUWCBGcmFtZSBDb21wbGV0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJVFhfT0sgICAgICAgICAgICAgMHgwMDAwMDAwMiAgICAvKiBUWCBGcmFtZSBTZW50IFdpdGggTm8gRXJyb3JzICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJVFhfRUNPTEwgICAgICAgICAgMHgwMDAwMDAwNCAgICAvKiBUWCBGcmFtZSBFeGNlc3NpdmUgQ29sbGlzaW9uIEVycm9yICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJVFhfTEFURSAgICAgICAgICAgMHgwMDAwMDAwOCAgICAvKiBUWCBGcmFtZSBMYXRlIENvbGxpc2lvbiBFcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJVFhfRE1BVSAgICAgICAgICAgMHgwMDAwMDAxMCAgICAvKiBUWCBGcmFtZSBETUEgVW5kZXJydW4gRXJyb3IgKFNUQVQpICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJVFhfTUFDRSAgICAgICAgICAgMHgwMDAwMDAxMCAgICAvKiBJbnRlcm5hbCBNQUMgRXJyb3IgRGV0ZWN0ZWQgKFNUS1kgYW5kIElSUUUpICAgICAgICAgICAgKi8KKyNkZWZpbmUJVFhfRURFRkVSICAgICAgICAgMHgwMDAwMDAyMCAgICAvKiBUWCBGcmFtZSBFeGNlc3NpdmUgRGVmZXJyYWwgRXJyb3IgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJVFhfQlJPQUQgICAgICAgICAgMHgwMDAwMDA0MCAgICAvKiBUWCBCcm9hZGNhc3QgRnJhbWUgSW5kaWNhdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJVFhfTVVMVEkgICAgICAgICAgMHgwMDAwMDA4MCAgICAvKiBUWCBNdWx0aWNhc3QgRnJhbWUgSW5kaWNhdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJVFhfQ0NOVCAgICAgICAgICAgMHgwMDAwMEYwMCAgICAvKiBUWCBGcmFtZSBDb2xsaXNpb24gQ291bnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJVFhfREVGRVIgICAgICAgICAgMHgwMDAwMTAwMCAgICAvKiBUWCBGcmFtZSBEZWZlcnJlZCBJbmRpY2F0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJVFhfQ1JTICAgICAgICAgICAgMHgwMDAwMjAwMCAgICAvKiBUWCBGcmFtZSBDYXJyaWVyIFNlbnNlIE5vdCBBc3NlcnRlZCBFcnJvciAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJVFhfTE9TUyAgICAgICAgICAgMHgwMDAwNDAwMCAgICAvKiBUWCBGcmFtZSBDYXJyaWVyIExvc3QgRHVyaW5nIFRYIEVycm9yICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJVFhfUkVUUlkgICAgICAgICAgMHgwMDAwODAwMCAgICAvKiBUWCBGcmFtZSBTdWNjZXNzZnVsIEFmdGVyIFJldHJ5ICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJVFhfRlJMRU4gICAgICAgICAgMHgwN0ZGMDAwMCAgICAvKiBUWCBGcmFtZSBMZW5ndGggKEJ5dGVzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworLyogRU1BQ19NTUNfQ1RMIE1hc2tzICovCisjZGVmaW5lCVJTVEMgICAgICAgICAgICAgIDB4MDAwMDAwMDEgICAgLyogUmVzZXQgQWxsIENvdW50ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCUNST0xMICAgICAgICAgICAgIDB4MDAwMDAwMDIgICAgLyogQ291bnRlciBSb2xsLU92ZXIgRW5hYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCUNDT1IgICAgICAgICAgICAgIDB4MDAwMDAwMDQgICAgLyogQ291bnRlciBDbGVhci1Pbi1SZWFkIE1vZGUgRW5hYmxlICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCU1NQ0UgICAgICAgICAgICAgIDB4MDAwMDAwMDggICAgLyogRW5hYmxlIE1NQyBDb3VudGVyIE9wZXJhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKy8qIEVNQUNfTU1DX1JJUlFTIGFuZCBFTUFDX01NQ19SSVJRRSBNYXNrcyAqLworI2RlZmluZQlSWF9PS19DTlQgICAgICAgICAweDAwMDAwMDAxICAgIC8qIFJYIEZyYW1lcyBSZWNlaXZlZCBXaXRoIE5vIEVycm9ycyAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlSWF9GQ1NfQ05UICAgICAgICAweDAwMDAwMDAyICAgIC8qIFJYIEZyYW1lcyBXL0ZyYW1lIENoZWNrIFNlcXVlbmNlIEVycm9ycyAgICAgICAgICAgICAgICAqLworI2RlZmluZQlSWF9BTElHTl9DTlQgICAgICAweDAwMDAwMDA0ICAgIC8qIFJYIEZyYW1lcyBXaXRoIEFsaWdubWVudCBFcnJvcnMgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlSWF9PQ1RFVF9DTlQgICAgICAweDAwMDAwMDA4ICAgIC8qIFJYIE9jdGV0cyBSZWNlaXZlZCBPSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlSWF9MT1NUX0NOVCAgICAgICAweDAwMDAwMDEwICAgIC8qIFJYIEZyYW1lcyBMb3N0IER1ZSBUbyBJbnRlcm5hbCBNQUMgUlggRXJyb3IgICAgICAgICAgICAqLworI2RlZmluZQlSWF9VTklfQ05UICAgICAgICAweDAwMDAwMDIwICAgIC8qIFVuaWNhc3QgUlggRnJhbWVzIFJlY2VpdmVkIE9LICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlSWF9NVUxUSV9DTlQgICAgICAweDAwMDAwMDQwICAgIC8qIE11bHRpY2FzdCBSWCBGcmFtZXMgUmVjZWl2ZWQgT0sgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlSWF9CUk9BRF9DTlQgICAgICAweDAwMDAwMDgwICAgIC8qIEJyb2FkY2FzdCBSWCBGcmFtZXMgUmVjZWl2ZWQgT0sgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlSWF9JUkxfQ05UICAgICAgICAweDAwMDAwMTAwICAgIC8qIFJYIEZyYW1lcyBXaXRoIEluLVJhbmdlIExlbmd0aCBFcnJvcnMgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlSWF9PUkxfQ05UICAgICAgICAweDAwMDAwMjAwICAgIC8qIFJYIEZyYW1lcyBXaXRoIE91dC1PZi1SYW5nZSBMZW5ndGggRXJyb3JzICAgICAgICAgICAgICAqLworI2RlZmluZQlSWF9MT05HX0NOVCAgICAgICAweDAwMDAwNDAwICAgIC8qIFJYIEZyYW1lcyBXaXRoIEZyYW1lIFRvbyBMb25nIEVycm9ycyAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlSWF9NQUNDVExfQ05UICAgICAweDAwMDAwODAwICAgIC8qIE1BQyBDb250cm9sIFJYIEZyYW1lcyBSZWNlaXZlZCAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlSWF9PUENPREVfQ1RMICAgICAweDAwMDAxMDAwICAgIC8qIFVuc3VwcG9ydGVkIE9wLUNvZGUgUlggRnJhbWVzIFJlY2VpdmVkICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlSWF9QQVVTRV9DTlQgICAgICAweDAwMDAyMDAwICAgIC8qIFBBVVNFTUFDIENvbnRyb2wgUlggRnJhbWVzIFJlY2VpdmVkICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlSWF9BTExGX0NOVCAgICAgICAweDAwMDA0MDAwICAgIC8qIEFsbCBSWCBGcmFtZXMgUmVjZWl2ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlSWF9BTExPX0NOVCAgICAgICAweDAwMDA4MDAwICAgIC8qIEFsbCBSWCBPY3RldHMgUmVjZWl2ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlSWF9UWVBFRF9DTlQgICAgICAweDAwMDEwMDAwICAgIC8qIFR5cGVkIFJYIEZyYW1lcyBSZWNlaXZlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlSWF9TSE9SVF9DTlQgICAgICAweDAwMDIwMDAwICAgIC8qIFJYIEZyYW1lIEZyYWdtZW50cyAoPCA2NCBCeXRlcykgUmVjZWl2ZWQgICAgICAgICAgICAgICAqLworI2RlZmluZQlSWF9FUTY0X0NOVCAgICAgICAweDAwMDQwMDAwICAgIC8qIDY0LUJ5dGUgUlggRnJhbWVzIFJlY2VpdmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlSWF9MVDEyOF9DTlQgICAgICAweDAwMDgwMDAwICAgIC8qIDY1LTEyNy1CeXRlIFJYIEZyYW1lcyBSZWNlaXZlZCAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlSWF9MVDI1Nl9DTlQgICAgICAweDAwMTAwMDAwICAgIC8qIDEyOC0yNTUtQnl0ZSBSWCBGcmFtZXMgUmVjZWl2ZWQgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlSWF9MVDUxMl9DTlQgICAgICAweDAwMjAwMDAwICAgIC8qIDI1Ni01MTEtQnl0ZSBSWCBGcmFtZXMgUmVjZWl2ZWQgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlSWF9MVDEwMjRfQ05UICAgICAweDAwNDAwMDAwICAgIC8qIDUxMi0xMDIzLUJ5dGUgUlggRnJhbWVzIFJlY2VpdmVkICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlSWF9HRTEwMjRfQ05UICAgICAweDAwODAwMDAwICAgIC8qIDEwMjQtTWF4LUJ5dGUgUlggRnJhbWVzIFJlY2VpdmVkICAgICAgICAgICAgICAgICAgICAgICAqLworCisvKiBFTUFDX01NQ19USVJRUyBhbmQgRU1BQ19NTUNfVElSUUUgTWFza3MgICovCisKKyNkZWZpbmUJVFhfT0tfQ05UICAgICAgICAgMHgwMDAwMDAwMSAgICAvKiBUWCBGcmFtZXMgU2VudCBPSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJVFhfU0NPTExfQ05UICAgICAgMHgwMDAwMDAwMiAgICAvKiBUWCBGcmFtZXMgV2l0aCBTaW5nbGUgQ29sbGlzaW9ucyAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJVFhfTUNPTExfQ05UICAgICAgMHgwMDAwMDAwNCAgICAvKiBUWCBGcmFtZXMgV2l0aCBNdWx0aXBsZSBDb2xsaXNpb25zICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJVFhfT0NURVRfQ05UICAgICAgMHgwMDAwMDAwOCAgICAvKiBUWCBPY3RldHMgU2VudCBPSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJVFhfREVGRVJfQ05UICAgICAgMHgwMDAwMDAxMCAgICAvKiBUWCBGcmFtZXMgV2l0aCBEZWZlcnJlZCBUcmFuc21pc3Npb24gICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJVFhfTEFURV9DTlQgICAgICAgMHgwMDAwMDAyMCAgICAvKiBUWCBGcmFtZXMgV2l0aCBMYXRlIENvbGxpc2lvbnMgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJVFhfQUJPUlRDX0NOVCAgICAgMHgwMDAwMDA0MCAgICAvKiBUWCBGcmFtZXMgQWJvcnRlZCBEdWUgVG8gRXhjZXNzIENvbGxpc2lvbnMgICAgICAgICAgICAgKi8KKyNkZWZpbmUJVFhfTE9TVF9DTlQgICAgICAgMHgwMDAwMDA4MCAgICAvKiBUWCBGcmFtZXMgTG9zdCBEdWUgVG8gSW50ZXJuYWwgTUFDIFRYIEVycm9yICAgICAgICAgICAgKi8KKyNkZWZpbmUJVFhfQ1JTX0NOVCAgICAgICAgMHgwMDAwMDEwMCAgICAvKiBUWCBGcmFtZXMgV2l0aCBDYXJyaWVyIFNlbnNlIEVycm9ycyAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJVFhfVU5JX0NOVCAgICAgICAgMHgwMDAwMDIwMCAgICAvKiBVbmljYXN0IFRYIEZyYW1lcyBTZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJVFhfTVVMVElfQ05UICAgICAgMHgwMDAwMDQwMCAgICAvKiBNdWx0aWNhc3QgVFggRnJhbWVzIFNlbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJVFhfQlJPQURfQ05UICAgICAgMHgwMDAwMDgwMCAgICAvKiBCcm9hZGNhc3QgVFggRnJhbWVzIFNlbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJVFhfRVhERUZfQ1RMICAgICAgMHgwMDAwMTAwMCAgICAvKiBUWCBGcmFtZXMgV2l0aCBFeGNlc3NpdmUgRGVmZXJyYWwgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJVFhfTUFDQ1RMX0NOVCAgICAgMHgwMDAwMjAwMCAgICAvKiBNQUMgQ29udHJvbCBUWCBGcmFtZXMgU2VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJVFhfQUxMRl9DTlQgICAgICAgMHgwMDAwNDAwMCAgICAvKiBBbGwgVFggRnJhbWVzIFNlbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJVFhfQUxMT19DTlQgICAgICAgMHgwMDAwODAwMCAgICAvKiBBbGwgVFggT2N0ZXRzIFNlbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJVFhfRVE2NF9DTlQgICAgICAgMHgwMDAxMDAwMCAgICAvKiA2NC1CeXRlIFRYIEZyYW1lcyBTZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJVFhfTFQxMjhfQ05UICAgICAgMHgwMDAyMDAwMCAgICAvKiA2NS0xMjctQnl0ZSBUWCBGcmFtZXMgU2VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJVFhfTFQyNTZfQ05UICAgICAgMHgwMDA0MDAwMCAgICAvKiAxMjgtMjU1LUJ5dGUgVFggRnJhbWVzIFNlbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJVFhfTFQ1MTJfQ05UICAgICAgMHgwMDA4MDAwMCAgICAvKiAyNTYtNTExLUJ5dGUgVFggRnJhbWVzIFNlbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJVFhfTFQxMDI0X0NOVCAgICAgMHgwMDEwMDAwMCAgICAvKiA1MTItMTAyMy1CeXRlIFRYIEZyYW1lcyBTZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJVFhfR0UxMDI0X0NOVCAgICAgMHgwMDIwMDAwMCAgICAvKiAxMDI0LU1heC1CeXRlIFRYIEZyYW1lcyBTZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJVFhfQUJPUlRfQ05UICAgICAgMHgwMDQwMDAwMCAgICAvKiBUWCBGcmFtZXMgQWJvcnRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworLyogU0RIIFJlZ2lzdGVycyAqLworCisjZGVmaW5lIFNESF9QV1JfQ1RMICAgICAgICAgICAgICAgICAgICAweEZGQzAzOTAwIC8qIFNESCBQb3dlciBDb250cm9sICovCisjZGVmaW5lIFNESF9DTEtfQ1RMICAgICAgICAgICAgICAgICAgICAweEZGQzAzOTA0IC8qIFNESCBDbG9jayBDb250cm9sICovCisjZGVmaW5lIFNESF9BUkdVTUVOVCAgICAgICAgICAgICAgICAgICAweEZGQzAzOTA4IC8qIFNESCBBcmd1bWVudCAqLworI2RlZmluZSBTREhfQ09NTUFORCAgICAgICAgICAgICAgICAgICAgMHhGRkMwMzkwQyAvKiBTREggQ29tbWFuZCAqLworI2RlZmluZSBTREhfUkVTUF9DTUQgICAgICAgICAgICAgICAgICAgMHhGRkMwMzkxMCAvKiBTREggUmVzcG9uc2UgQ29tbWFuZCAqLworI2RlZmluZSBTREhfUkVTUE9OU0UwICAgICAgICAgICAgICAgICAgMHhGRkMwMzkxNCAvKiBTREggUmVzcG9uc2UwICovCisjZGVmaW5lIFNESF9SRVNQT05TRTEgICAgICAgICAgICAgICAgICAweEZGQzAzOTE4IC8qIFNESCBSZXNwb25zZTEgKi8KKyNkZWZpbmUgU0RIX1JFU1BPTlNFMiAgICAgICAgICAgICAgICAgIDB4RkZDMDM5MUMgLyogU0RIIFJlc3BvbnNlMiAqLworI2RlZmluZSBTREhfUkVTUE9OU0UzICAgICAgICAgICAgICAgICAgMHhGRkMwMzkyMCAvKiBTREggUmVzcG9uc2UzICovCisjZGVmaW5lIFNESF9EQVRBX1RJTUVSICAgICAgICAgICAgICAgICAweEZGQzAzOTI0IC8qIFNESCBEYXRhIFRpbWVyICovCisjZGVmaW5lIFNESF9EQVRBX0xHVEggICAgICAgICAgICAgICAgICAweEZGQzAzOTI4IC8qIFNESCBEYXRhIExlbmd0aCAqLworI2RlZmluZSBTREhfREFUQV9DVEwgICAgICAgICAgICAgICAgICAgMHhGRkMwMzkyQyAvKiBTREggRGF0YSBDb250cm9sICovCisjZGVmaW5lIFNESF9EQVRBX0NOVCAgICAgICAgICAgICAgICAgICAweEZGQzAzOTMwIC8qIFNESCBEYXRhIENvdW50ZXIgKi8KKyNkZWZpbmUgU0RIX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgIDB4RkZDMDM5MzQgLyogU0RIIFN0YXR1cyAqLworI2RlZmluZSBTREhfU1RBVFVTX0NMUiAgICAgICAgICAgICAgICAgMHhGRkMwMzkzOCAvKiBTREggU3RhdHVzIENsZWFyICovCisjZGVmaW5lIFNESF9NQVNLMCAgICAgICAgICAgICAgICAgICAgICAweEZGQzAzOTNDIC8qIFNESCBJbnRlcnJ1cHQwIE1hc2sgKi8KKyNkZWZpbmUgU0RIX01BU0sxICAgICAgICAgICAgICAgICAgICAgIDB4RkZDMDM5NDAgLyogU0RIIEludGVycnVwdDEgTWFzayAqLworI2RlZmluZSBTREhfRklGT19DTlQgICAgICAgICAgICAgICAgICAgMHhGRkMwMzk0OCAvKiBTREggRklGTyBDb3VudGVyICovCisjZGVmaW5lIFNESF9GSUZPICAgICAgICAgICAgICAgICAgICAgICAweEZGQzAzOTgwIC8qIFNESCBEYXRhIEZJRk8gKi8KKyNkZWZpbmUgU0RIX0VfU1RBVFVTICAgICAgICAgICAgICAgICAgIDB4RkZDMDM5QzAgLyogU0RIIEV4Y2VwdGlvbiBTdGF0dXMgKi8KKyNkZWZpbmUgU0RIX0VfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4RkZDMDM5QzQgLyogU0RIIEV4Y2VwdGlvbiBNYXNrICovCisjZGVmaW5lIFNESF9DRkcgICAgICAgICAgICAgICAgICAgICAgICAweEZGQzAzOUM4IC8qIFNESCBDb25maWd1cmF0aW9uICovCisjZGVmaW5lIFNESF9SRF9XQUlUX0VOICAgICAgICAgICAgICAgICAweEZGQzAzOUNDIC8qIFNESCBSZWFkIFdhaXQgRW5hYmxlICovCisjZGVmaW5lIFNESF9QSUQwICAgICAgICAgICAgICAgICAgICAgICAweEZGQzAzOUQwIC8qIFNESCBQZXJpcGhlcmFsIElkZW50aWZpY2F0aW9uMCAqLworI2RlZmluZSBTREhfUElEMSAgICAgICAgICAgICAgICAgICAgICAgMHhGRkMwMzlENCAvKiBTREggUGVyaXBoZXJhbCBJZGVudGlmaWNhdGlvbjEgKi8KKyNkZWZpbmUgU0RIX1BJRDIgICAgICAgICAgICAgICAgICAgICAgIDB4RkZDMDM5RDggLyogU0RIIFBlcmlwaGVyYWwgSWRlbnRpZmljYXRpb24yICovCisjZGVmaW5lIFNESF9QSUQzICAgICAgICAgICAgICAgICAgICAgICAweEZGQzAzOURDIC8qIFNESCBQZXJpcGhlcmFsIElkZW50aWZpY2F0aW9uMyAqLworI2RlZmluZSBTREhfUElENCAgICAgICAgICAgICAgICAgICAgICAgMHhGRkMwMzlFMCAvKiBTREggUGVyaXBoZXJhbCBJZGVudGlmaWNhdGlvbjQgKi8KKyNkZWZpbmUgU0RIX1BJRDUgICAgICAgICAgICAgICAgICAgICAgIDB4RkZDMDM5RTQgLyogU0RIIFBlcmlwaGVyYWwgSWRlbnRpZmljYXRpb241ICovCisjZGVmaW5lIFNESF9QSUQ2ICAgICAgICAgICAgICAgICAgICAgICAweEZGQzAzOUU4IC8qIFNESCBQZXJpcGhlcmFsIElkZW50aWZpY2F0aW9uNiAqLworI2RlZmluZSBTREhfUElENyAgICAgICAgICAgICAgICAgICAgICAgMHhGRkMwMzlFQyAvKiBTREggUGVyaXBoZXJhbCBJZGVudGlmaWNhdGlvbjcgKi8KKworLyogUmVtb3ZhYmxlIFN0b3JhZ2UgSW50ZXJmYWNlIFJlZ2lzdGVycyAqLworCisjZGVmaW5lIFJTSV9QV1JfQ09OVFJPTCAgICAgICAgICAgICAgICAweEZGQzAzODAwIC8qIFJTSSBQb3dlciBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIFJTSV9DTEtfQ09OVFJPTCAgICAgICAgICAgICAgICAweEZGQzAzODA0IC8qIFJTSSBDbG9jayBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIFJTSV9BUkdVTUVOVCAgICAgICAgICAgICAgICAgICAweEZGQzAzODA4IC8qIFJTSSBBcmd1bWVudCBSZWdpc3RlciAqLworI2RlZmluZSBSU0lfQ09NTUFORCAgICAgICAgICAgICAgICAgICAgMHhGRkMwMzgwQyAvKiBSU0kgQ29tbWFuZCBSZWdpc3RlciAqLworI2RlZmluZSBSU0lfUkVTUF9DTUQgICAgICAgICAgICAgICAgICAgMHhGRkMwMzgxMCAvKiBSU0kgUmVzcG9uc2UgQ29tbWFuZCBSZWdpc3RlciAqLworI2RlZmluZSBSU0lfUkVTUE9OU0UwICAgICAgICAgICAgICAgICAgMHhGRkMwMzgxNCAvKiBSU0kgUmVzcG9uc2UgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUlNJX1JFU1BPTlNFMSAgICAgICAgICAgICAgICAgIDB4RkZDMDM4MTggLyogUlNJIFJlc3BvbnNlIFJlZ2lzdGVyICovCisjZGVmaW5lIFJTSV9SRVNQT05TRTIgICAgICAgICAgICAgICAgICAweEZGQzAzODFDIC8qIFJTSSBSZXNwb25zZSBSZWdpc3RlciAqLworI2RlZmluZSBSU0lfUkVTUE9OU0UzICAgICAgICAgICAgICAgICAgMHhGRkMwMzgyMCAvKiBSU0kgUmVzcG9uc2UgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUlNJX0RBVEFfVElNRVIgICAgICAgICAgICAgICAgIDB4RkZDMDM4MjQgLyogUlNJIERhdGEgVGltZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUlNJX0RBVEFfTEdUSCAgICAgICAgICAgICAgICAgIDB4RkZDMDM4MjggLyogUlNJIERhdGEgTGVuZ3RoIFJlZ2lzdGVyICovCisjZGVmaW5lIFJTSV9EQVRBX0NPTlRST0wgICAgICAgICAgICAgICAweEZGQzAzODJDIC8qIFJTSSBEYXRhIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUlNJX0RBVEFfQ05UICAgICAgICAgICAgICAgICAgIDB4RkZDMDM4MzAgLyogUlNJIERhdGEgQ291bnRlciBSZWdpc3RlciAqLworI2RlZmluZSBSU0lfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgMHhGRkMwMzgzNCAvKiBSU0kgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lIFJTSV9TVEFUVVNDTCAgICAgICAgICAgICAgICAgICAweEZGQzAzODM4IC8qIFJTSSBTdGF0dXMgQ2xlYXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUlNJX01BU0swICAgICAgICAgICAgICAgICAgICAgIDB4RkZDMDM4M0MgLyogUlNJIEludGVycnVwdCAwIE1hc2sgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUlNJX01BU0sxICAgICAgICAgICAgICAgICAgICAgIDB4RkZDMDM4NDAgLyogUlNJIEludGVycnVwdCAxIE1hc2sgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUlNJX0ZJRk9fQ05UICAgICAgICAgICAgICAgICAgIDB4RkZDMDM4NDggLyogUlNJIEZJRk8gQ291bnRlciBSZWdpc3RlciAqLworI2RlZmluZSBSU0lfQ0VBVEFfQ09OVFJPTCAgICAgICAgICAgICAgMHhGRkMwMzg0QyAvKiBSU0kgQ0VBVEEgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUlNJX0ZJRk8gICAgICAgICAgICAgICAgICAgICAgIDB4RkZDMDM4ODAgLyogUlNJIERhdGEgRklGTyBSZWdpc3RlciAqLworI2RlZmluZSBSU0lfRVNUQVQgICAgICAgICAgICAgICAgICAgICAgMHhGRkMwMzhDMCAvKiBSU0kgRXhjZXB0aW9uIFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSBSU0lfRU1BU0sgICAgICAgICAgICAgICAgICAgICAgMHhGRkMwMzhDNCAvKiBSU0kgRXhjZXB0aW9uIE1hc2sgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUlNJX0NPTkZJRyAgICAgICAgICAgICAgICAgICAgIDB4RkZDMDM4QzggLyogUlNJIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUlNJX1JEX1dBSVRfRU4gICAgICAgICAgICAgICAgIDB4RkZDMDM4Q0MgLyogUlNJIFJlYWQgV2FpdCBFbmFibGUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUlNJX1BJRDAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZDMDNGRTAgLyogUlNJIFBlcmlwaGVyYWwgSUQgUmVnaXN0ZXIgMCAqLworI2RlZmluZSBSU0lfUElEMSAgICAgICAgICAgICAgICAgICAgICAgMHhGRkMwM0ZFNCAvKiBSU0kgUGVyaXBoZXJhbCBJRCBSZWdpc3RlciAxICovCisjZGVmaW5lIFJTSV9QSUQyICAgICAgICAgICAgICAgICAgICAgICAweEZGQzAzRkU4IC8qIFJTSSBQZXJpcGhlcmFsIElEIFJlZ2lzdGVyIDIgKi8KKyNkZWZpbmUgUlNJX1BJRDMgICAgICAgICAgICAgICAgICAgICAgIDB4RkZDMDNGRUMgLyogUlNJIFBlcmlwaGVyYWwgSUQgUmVnaXN0ZXIgMyAqLworI2RlZmluZSBSU0lfUElENCAgICAgICAgICAgICAgICAgICAgICAgMHhGRkMwM0ZGMCAvKiBSU0kgUGVyaXBoZXJhbCBJRCBSZWdpc3RlciA0ICovCisjZGVmaW5lIFJTSV9QSUQ1ICAgICAgICAgICAgICAgICAgICAgICAweEZGQzAzRkY0IC8qIFJTSSBQZXJpcGhlcmFsIElEIFJlZ2lzdGVyIDUgKi8KKyNkZWZpbmUgUlNJX1BJRDYgICAgICAgICAgICAgICAgICAgICAgIDB4RkZDMDNGRjggLyogUlNJIFBlcmlwaGVyYWwgSUQgUmVnaXN0ZXIgNiAqLworI2RlZmluZSBSU0lfUElENyAgICAgICAgICAgICAgICAgICAgICAgMHhGRkMwM0ZGQyAvKiBSU0kgUGVyaXBoZXJhbCBJRCBSZWdpc3RlciA3ICovCisKKy8qIFBUUCBUU1lOQyBSZWdpc3RlcnMgKi8KKworI2RlZmluZSBFTUFDX1BUUF9DVEwgICAgICAgICAgICAgICAgICAgMHhGRkMwMzBBMCAvKiBQVFAgQmxvY2sgQ29udHJvbCAqLworI2RlZmluZSBFTUFDX1BUUF9JRSAgICAgICAgICAgICAgICAgICAgMHhGRkMwMzBBNCAvKiBQVFAgQmxvY2sgSW50ZXJydXB0IEVuYWJsZSAqLworI2RlZmluZSBFTUFDX1BUUF9JU1RBVCAgICAgICAgICAgICAgICAgMHhGRkMwMzBBOCAvKiBQVFAgQmxvY2sgSW50ZXJydXB0IFN0YXR1cyAqLworI2RlZmluZSBFTUFDX1BUUF9GT0ZGICAgICAgICAgICAgICAgICAgMHhGRkMwMzBBQyAvKiBQVFAgRmlsdGVyIG9mZnNldCBSZWdpc3RlciAqLworI2RlZmluZSBFTUFDX1BUUF9GVjEgICAgICAgICAgICAgICAgICAgMHhGRkMwMzBCMCAvKiBQVFAgRmlsdGVyIFZhbHVlIFJlZ2lzdGVyIDEgKi8KKyNkZWZpbmUgRU1BQ19QVFBfRlYyICAgICAgICAgICAgICAgICAgIDB4RkZDMDMwQjQgLyogUFRQIEZpbHRlciBWYWx1ZSBSZWdpc3RlciAyICovCisjZGVmaW5lIEVNQUNfUFRQX0ZWMyAgICAgICAgICAgICAgICAgICAweEZGQzAzMEI4IC8qIFBUUCBGaWx0ZXIgVmFsdWUgUmVnaXN0ZXIgMyAqLworI2RlZmluZSBFTUFDX1BUUF9BRERFTkQgICAgICAgICAgICAgICAgMHhGRkMwMzBCQyAvKiBQVFAgQWRkZW5kIGZvciBGcmVxdWVuY3kgQ29tcGVuc2F0aW9uICovCisjZGVmaW5lIEVNQUNfUFRQX0FDQ1IgICAgICAgICAgICAgICAgICAweEZGQzAzMEMwIC8qIFBUUCBBY2N1bXVsYXRvciBmb3IgRnJlcXVlbmN5IENvbXBlbnNhdGlvbiAqLworI2RlZmluZSBFTUFDX1BUUF9PRkZTRVQgICAgICAgICAgICAgICAgMHhGRkMwMzBDNCAvKiBQVFAgVGltZSBPZmZzZXQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgRU1BQ19QVFBfVElNRUxPICAgICAgICAgICAgICAgIDB4RkZDMDMwQzggLyogUFRQIFByZWNpc2lvbiBDbG9jayBUaW1lIExvdyAqLworI2RlZmluZSBFTUFDX1BUUF9USU1FSEkgICAgICAgICAgICAgICAgMHhGRkMwMzBDQyAvKiBQVFAgUHJlY2lzaW9uIENsb2NrIFRpbWUgSGlnaCAqLworI2RlZmluZSBFTUFDX1BUUF9SWFNOQVBMTyAgICAgICAgICAgICAgMHhGRkMwMzBEMCAvKiBQVFAgUmVjZWl2ZSBTbmFwc2hvdCBSZWdpc3RlciBMb3cgKi8KKyNkZWZpbmUgRU1BQ19QVFBfUlhTTkFQSEkgICAgICAgICAgICAgIDB4RkZDMDMwRDQgLyogUFRQIFJlY2VpdmUgU25hcHNob3QgUmVnaXN0ZXIgSGlnaCAqLworI2RlZmluZSBFTUFDX1BUUF9UWFNOQVBMTyAgICAgICAgICAgICAgMHhGRkMwMzBEOCAvKiBQVFAgVHJhbnNtaXQgU25hcHNob3QgUmVnaXN0ZXIgTG93ICovCisjZGVmaW5lIEVNQUNfUFRQX1RYU05BUEhJICAgICAgICAgICAgICAweEZGQzAzMERDIC8qIFBUUCBUcmFuc21pdCBTbmFwc2hvdCBSZWdpc3RlciBIaWdoICovCisjZGVmaW5lIEVNQUNfUFRQX0FMQVJNTE8gICAgICAgICAgICAgICAweEZGQzAzMEUwIC8qIFBUUCBBbGFybSB0aW1lIExvdyAqLworI2RlZmluZSBFTUFDX1BUUF9BTEFSTUhJICAgICAgICAgICAgICAgMHhGRkMwMzBFNCAvKiBQVFAgQWxhcm0gdGltZSBIaWdoICovCisjZGVmaW5lIEVNQUNfUFRQX0lEX09GRiAgICAgICAgICAgICAgICAweEZGQzAzMEU4IC8qIFBUUCBDYXB0dXJlIElEIG9mZnNldCByZWdpc3RlciAqLworI2RlZmluZSBFTUFDX1BUUF9JRF9TTkFQICAgICAgICAgICAgICAgMHhGRkMwMzBFQyAvKiBQVFAgQ2FwdHVyZSBJRCByZWdpc3RlciAqLworI2RlZmluZSBFTUFDX1BUUF9QUFNfU1RBUlRMTyAgICAgICAgICAgMHhGRkMwMzBGMCAvKiBQUFMgU3RhcnQgVGltZSBMb3cgKi8KKyNkZWZpbmUgRU1BQ19QVFBfUFBTX1NUQVJUSEkgICAgICAgICAgIDB4RkZDMDMwRjQgLyogUFBTIFN0YXJ0IFRpbWUgSGlnaCAqLworI2RlZmluZSBFTUFDX1BUUF9QUFNfUEVSSU9EICAgICAgICAgICAgMHhGRkMwMzBGOCAvKiBQUFMgQ291bnQgUmVnaXN0ZXIgKi8KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogICAgIFNJTkdMRSBCSVQgTUFDUk8gUEFJUlMgKGJpdCBtYXNrIGFuZCBuZWdhdGVkIG9uZSkgICAgICAqLworLyogICAgIGFuZCBNVUxUSSBCSVQgUkVBRCBNQUNST1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisvKiBCaXQgbWFza3MgZm9yIFNESF9DT01NQU5EICovCisKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgQ01EX0lEWCAgMHgzZiAgICAgICAvKiBDb21tYW5kIEluZGV4ICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgIENNRF9SU1AgIDB4NDAgICAgICAgLyogUmVzcG9uc2UgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgIENNRF9MX1JTUCAgMHg4MCAgICAgICAvKiBMb25nIFJlc3BvbnNlICovCisjZGVmaW5lICAgICAgICAgICAgICAgICBDTURfSU5UX0UgIDB4MTAwICAgICAgLyogQ29tbWFuZCBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgQ01EX1BFTkRfRSAgMHgyMDAgICAgICAvKiBDb21tYW5kIFBlbmRpbmcgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICBDTURfRSAgMHg0MDAgICAgICAvKiBDb21tYW5kIEVuYWJsZSAqLworCisvKiBCaXQgbWFza3MgZm9yIFNESF9QV1JfQ1RMICovCisKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgIFBXUl9PTiAgMHgzICAgICAgICAvKiBQb3dlciBPbiAqLworI2lmIDAKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgIFRCRCAgMHgzYyAgICAgICAvKiBUQkQgKi8KKyNlbmRpZgorI2RlZmluZSAgICAgICAgICAgICAgICAgU0RfQ01EX09EICAweDQwICAgICAgIC8qIE9wZW4gRHJhaW4gT3V0cHV0ICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgIFJPRF9DVEwgIDB4ODAgICAgICAgLyogUm9kIENvbnRyb2wgKi8KKworLyogQml0IG1hc2tzIGZvciBTREhfQ0xLX0NUTCAqLworCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICBDTEtESVYgIDB4ZmYgICAgICAgLyogTUNfQ0xLIERpdmlzb3IgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICBDTEtfRSAgMHgxMDAgICAgICAvKiBNQ19DTEsgQnVzIENsb2NrIEVuYWJsZSAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgIFBXUl9TVl9FICAweDIwMCAgICAgIC8qIFBvd2VyIFNhdmUgRW5hYmxlICovCisjZGVmaW5lICAgICAgICAgICAgIENMS0RJVl9CWVBBU1MgIDB4NDAwICAgICAgLyogQnlwYXNzIERpdmlzb3IgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICBXSURFX0JVUyAgMHg4MDAgICAgICAvKiBXaWRlIEJ1cyBNb2RlIEVuYWJsZSAqLworCisvKiBCaXQgbWFza3MgZm9yIFNESF9SRVNQX0NNRCAqLworCisjZGVmaW5lICAgICAgICAgICAgICAgICAgUkVTUF9DTUQgIDB4M2YgICAgICAgLyogUmVzcG9uc2UgQ29tbWFuZCAqLworCisvKiBCaXQgbWFza3MgZm9yIFNESF9EQVRBX0NUTCAqLworCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgRFRYX0UgIDB4MSAgICAgICAgLyogRGF0YSBUcmFuc2ZlciBFbmFibGUgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgRFRYX0RJUiAgMHgyICAgICAgICAvKiBEYXRhIFRyYW5zZmVyIERpcmVjdGlvbiAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgIERUWF9NT0RFICAweDQgICAgICAgIC8qIERhdGEgVHJhbnNmZXIgTW9kZSAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgRFRYX0RNQV9FICAweDggICAgICAgIC8qIERhdGEgVHJhbnNmZXIgRE1BIEVuYWJsZSAqLworI2RlZmluZSAgICAgICAgICAgICAgRFRYX0JMS19MR1RIICAweGYwICAgICAgIC8qIERhdGEgVHJhbnNmZXIgQmxvY2sgTGVuZ3RoICovCisKKy8qIEJpdCBtYXNrcyBmb3IgU0RIX1NUQVRVUyAqLworCisjZGVmaW5lICAgICAgICAgICAgICBDTURfQ1JDX0ZBSUwgIDB4MSAgICAgICAgLyogQ01EIENSQyBGYWlsICovCisjZGVmaW5lICAgICAgICAgICAgICBEQVRfQ1JDX0ZBSUwgIDB4MiAgICAgICAgLyogRGF0YSBDUkMgRmFpbCAqLworI2RlZmluZSAgICAgICAgICAgICAgIENNRF9USU1FX09VVCAgMHg0ICAgICAgICAvKiBDTUQgVGltZSBPdXQgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICBEQVRfVElNRV9PVVQgIDB4OCAgICAgICAgLyogRGF0YSBUaW1lIE91dCAqLworI2RlZmluZSAgICAgICAgICAgICAgIFRYX1VOREVSUlVOICAweDEwICAgICAgIC8qIFRyYW5zbWl0IFVuZGVycnVuICovCisjZGVmaW5lICAgICAgICAgICAgICAgIFJYX09WRVJSVU4gIDB4MjAgICAgICAgLyogUmVjZWl2ZSBPdmVycnVuICovCisjZGVmaW5lICAgICAgICAgICAgICBDTURfUkVTUF9FTkQgIDB4NDAgICAgICAgLyogQ01EIFJlc3BvbnNlIEVuZCAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgIENNRF9TRU5UICAweDgwICAgICAgIC8qIENNRCBTZW50ICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgIERBVF9FTkQgIDB4MTAwICAgICAgLyogRGF0YSBFbmQgKi8KKyNkZWZpbmUgICAgICAgICAgICAgU1RBUlRfQklUX0VSUiAgMHgyMDAgICAgICAvKiBTdGFydCBCaXQgRXJyb3IgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICBEQVRfQkxLX0VORCAgMHg0MDAgICAgICAvKiBEYXRhIEJsb2NrIEVuZCAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICBDTURfQUNUICAweDgwMCAgICAgIC8qIENNRCBBY3RpdmUgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgIFRYX0FDVCAgMHgxMDAwICAgICAvKiBUcmFuc21pdCBBY3RpdmUgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgIFJYX0FDVCAgMHgyMDAwICAgICAvKiBSZWNlaXZlIEFjdGl2ZSAqLworI2RlZmluZSAgICAgICAgICAgICAgVFhfRklGT19TVEFUICAweDQwMDAgICAgIC8qIFRyYW5zbWl0IEZJRk8gU3RhdHVzICovCisjZGVmaW5lICAgICAgICAgICAgICBSWF9GSUZPX1NUQVQgIDB4ODAwMCAgICAgLyogUmVjZWl2ZSBGSUZPIFN0YXR1cyAqLworI2RlZmluZSAgICAgICAgICAgICAgVFhfRklGT19GVUxMICAweDEwMDAwICAgIC8qIFRyYW5zbWl0IEZJRk8gRnVsbCAqLworI2RlZmluZSAgICAgICAgICAgICAgUlhfRklGT19GVUxMICAweDIwMDAwICAgIC8qIFJlY2VpdmUgRklGTyBGdWxsICovCisjZGVmaW5lICAgICAgICAgICAgICBUWF9GSUZPX1pFUk8gIDB4NDAwMDAgICAgLyogVHJhbnNtaXQgRklGTyBFbXB0eSAqLworI2RlZmluZSAgICAgICAgICAgICAgIFJYX0RBVF9aRVJPICAweDgwMDAwICAgIC8qIFJlY2VpdmUgRklGTyBFbXB0eSAqLworI2RlZmluZSAgICAgICAgICAgICAgICBUWF9EQVRfUkRZICAweDEwMDAwMCAgIC8qIFRyYW5zbWl0IERhdGEgQXZhaWxhYmxlICovCisjZGVmaW5lICAgICAgICAgICAgICAgUlhfRklGT19SRFkgIDB4MjAwMDAwICAgLyogUmVjZWl2ZSBEYXRhIEF2YWlsYWJsZSAqLworCisvKiBCaXQgbWFza3MgZm9yIFNESF9TVEFUVVNfQ0xSICovCisKKyNkZWZpbmUgICAgICAgICBDTURfQ1JDX0ZBSUxfU1RBVCAgMHgxICAgICAgICAvKiBDTUQgQ1JDIEZhaWwgU3RhdHVzICovCisjZGVmaW5lICAgICAgICAgREFUX0NSQ19GQUlMX1NUQVQgIDB4MiAgICAgICAgLyogRGF0YSBDUkMgRmFpbCBTdGF0dXMgKi8KKyNkZWZpbmUgICAgICAgICAgQ01EX1RJTUVPVVRfU1RBVCAgMHg0ICAgICAgICAvKiBDTUQgVGltZSBPdXQgU3RhdHVzICovCisjZGVmaW5lICAgICAgICAgIERBVF9USU1FT1VUX1NUQVQgIDB4OCAgICAgICAgLyogRGF0YSBUaW1lIE91dCBzdGF0dXMgKi8KKyNkZWZpbmUgICAgICAgICAgVFhfVU5ERVJSVU5fU1RBVCAgMHgxMCAgICAgICAvKiBUcmFuc21pdCBVbmRlcnJ1biBTdGF0dXMgKi8KKyNkZWZpbmUgICAgICAgICAgIFJYX09WRVJSVU5fU1RBVCAgMHgyMCAgICAgICAvKiBSZWNlaXZlIE92ZXJydW4gU3RhdHVzICovCisjZGVmaW5lICAgICAgICAgQ01EX1JFU1BfRU5EX1NUQVQgIDB4NDAgICAgICAgLyogQ01EIFJlc3BvbnNlIEVuZCBTdGF0dXMgKi8KKyNkZWZpbmUgICAgICAgICAgICAgQ01EX1NFTlRfU1RBVCAgMHg4MCAgICAgICAvKiBDTUQgU2VudCBTdGF0dXMgKi8KKyNkZWZpbmUgICAgICAgICAgICAgIERBVF9FTkRfU1RBVCAgMHgxMDAgICAgICAvKiBEYXRhIEVuZCBTdGF0dXMgKi8KKyNkZWZpbmUgICAgICAgIFNUQVJUX0JJVF9FUlJfU1RBVCAgMHgyMDAgICAgICAvKiBTdGFydCBCaXQgRXJyb3IgU3RhdHVzICovCisjZGVmaW5lICAgICAgICAgIERBVF9CTEtfRU5EX1NUQVQgIDB4NDAwICAgICAgLyogRGF0YSBCbG9jayBFbmQgU3RhdHVzICovCisKKy8qIEJpdCBtYXNrcyBmb3IgU0RIX01BU0swICovCisKKyNkZWZpbmUgICAgICAgICBDTURfQ1JDX0ZBSUxfTUFTSyAgMHgxICAgICAgICAvKiBDTUQgQ1JDIEZhaWwgTWFzayAqLworI2RlZmluZSAgICAgICAgIERBVF9DUkNfRkFJTF9NQVNLICAweDIgICAgICAgIC8qIERhdGEgQ1JDIEZhaWwgTWFzayAqLworI2RlZmluZSAgICAgICAgICBDTURfVElNRU9VVF9NQVNLICAweDQgICAgICAgIC8qIENNRCBUaW1lIE91dCBNYXNrICovCisjZGVmaW5lICAgICAgICAgIERBVF9USU1FT1VUX01BU0sgIDB4OCAgICAgICAgLyogRGF0YSBUaW1lIE91dCBNYXNrICovCisjZGVmaW5lICAgICAgICAgIFRYX1VOREVSUlVOX01BU0sgIDB4MTAgICAgICAgLyogVHJhbnNtaXQgVW5kZXJydW4gTWFzayAqLworI2RlZmluZSAgICAgICAgICAgUlhfT1ZFUlJVTl9NQVNLICAweDIwICAgICAgIC8qIFJlY2VpdmUgT3ZlcnJ1biBNYXNrICovCisjZGVmaW5lICAgICAgICAgQ01EX1JFU1BfRU5EX01BU0sgIDB4NDAgICAgICAgLyogQ01EIFJlc3BvbnNlIEVuZCBNYXNrICovCisjZGVmaW5lICAgICAgICAgICAgIENNRF9TRU5UX01BU0sgIDB4ODAgICAgICAgLyogQ01EIFNlbnQgTWFzayAqLworI2RlZmluZSAgICAgICAgICAgICAgREFUX0VORF9NQVNLICAweDEwMCAgICAgIC8qIERhdGEgRW5kIE1hc2sgKi8KKyNkZWZpbmUgICAgICAgIFNUQVJUX0JJVF9FUlJfTUFTSyAgMHgyMDAgICAgICAvKiBTdGFydCBCaXQgRXJyb3IgTWFzayAqLworI2RlZmluZSAgICAgICAgICBEQVRfQkxLX0VORF9NQVNLICAweDQwMCAgICAgIC8qIERhdGEgQmxvY2sgRW5kIE1hc2sgKi8KKyNkZWZpbmUgICAgICAgICAgICAgIENNRF9BQ1RfTUFTSyAgMHg4MDAgICAgICAvKiBDTUQgQWN0aXZlIE1hc2sgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICBUWF9BQ1RfTUFTSyAgMHgxMDAwICAgICAvKiBUcmFuc21pdCBBY3RpdmUgTWFzayAqLworI2RlZmluZSAgICAgICAgICAgICAgIFJYX0FDVF9NQVNLICAweDIwMDAgICAgIC8qIFJlY2VpdmUgQWN0aXZlIE1hc2sgKi8KKyNkZWZpbmUgICAgICAgICBUWF9GSUZPX1NUQVRfTUFTSyAgMHg0MDAwICAgICAvKiBUcmFuc21pdCBGSUZPIFN0YXR1cyBNYXNrICovCisjZGVmaW5lICAgICAgICAgUlhfRklGT19TVEFUX01BU0sgIDB4ODAwMCAgICAgLyogUmVjZWl2ZSBGSUZPIFN0YXR1cyBNYXNrICovCisjZGVmaW5lICAgICAgICAgVFhfRklGT19GVUxMX01BU0sgIDB4MTAwMDAgICAgLyogVHJhbnNtaXQgRklGTyBGdWxsIE1hc2sgKi8KKyNkZWZpbmUgICAgICAgICBSWF9GSUZPX0ZVTExfTUFTSyAgMHgyMDAwMCAgICAvKiBSZWNlaXZlIEZJRk8gRnVsbCBNYXNrICovCisjZGVmaW5lICAgICAgICAgVFhfRklGT19aRVJPX01BU0sgIDB4NDAwMDAgICAgLyogVHJhbnNtaXQgRklGTyBFbXB0eSBNYXNrICovCisjZGVmaW5lICAgICAgICAgIFJYX0RBVF9aRVJPX01BU0sgIDB4ODAwMDAgICAgLyogUmVjZWl2ZSBGSUZPIEVtcHR5IE1hc2sgKi8KKyNkZWZpbmUgICAgICAgICAgIFRYX0RBVF9SRFlfTUFTSyAgMHgxMDAwMDAgICAvKiBUcmFuc21pdCBEYXRhIEF2YWlsYWJsZSBNYXNrICovCisjZGVmaW5lICAgICAgICAgIFJYX0ZJRk9fUkRZX01BU0sgIDB4MjAwMDAwICAgLyogUmVjZWl2ZSBEYXRhIEF2YWlsYWJsZSBNYXNrICovCisKKy8qIEJpdCBtYXNrcyBmb3IgU0RIX0ZJRk9fQ05UICovCisKKyNkZWZpbmUgICAgICAgICAgICAgICAgRklGT19DT1VOVCAgMHg3ZmZmICAgICAvKiBGSUZPIENvdW50ICovCisKKy8qIEJpdCBtYXNrcyBmb3IgU0RIX0VfU1RBVFVTICovCisKKyNkZWZpbmUgICAgICAgICAgICAgIFNESU9fSU5UX0RFVCAgMHgyICAgICAgICAvKiBTRElPIEludCBEZXRlY3RlZCAqLworI2RlZmluZSAgICAgICAgICAgICAgIFNEX0NBUkRfREVUICAweDEwICAgICAgIC8qIFNEIENhcmQgRGV0ZWN0ICovCisKKy8qIEJpdCBtYXNrcyBmb3IgU0RIX0VfTUFTSyAqLworCisjZGVmaW5lICAgICAgICAgICAgICAgICAgU0RJT19NU0sgIDB4MiAgICAgICAgLyogTWFzayBTRElPIEludCBEZXRlY3RlZCAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICBTQ0RfTVNLICAweDQwICAgICAgIC8qIE1hc2sgQ2FyZCBEZXRlY3QgKi8KKworLyogQml0IG1hc2tzIGZvciBTREhfQ0ZHICovCisKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgQ0xLU19FTiAgMHgxICAgICAgICAvKiBDbG9ja3MgRW5hYmxlICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgIFNENEUgIDB4NCAgICAgICAgLyogU0RJTyA0LUJpdCBFbmFibGUgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgIE1XRSAgMHg4ICAgICAgICAvKiBNb3ZpbmcgV2luZG93IEVuYWJsZSAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgU0RfUlNUICAweDEwICAgICAgIC8qIFNETU1DIFJlc2V0ICovCisjZGVmaW5lICAgICAgICAgICAgICAgICBQVVBfU0REQVQgIDB4MjAgICAgICAgLyogUHVsbC11cCBTRF9EQVQgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgUFVQX1NEREFUMyAgMHg0MCAgICAgICAvKiBQdWxsLXVwIFNEX0RBVDMgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgIFBEX1NEREFUMyAgMHg4MCAgICAgICAvKiBQdWxsLWRvd24gU0RfREFUMyAqLworCisvKiBCaXQgbWFza3MgZm9yIFNESF9SRF9XQUlUX0VOICovCisKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgIFJXUiAgMHgxICAgICAgICAvKiBSZWFkIFdhaXQgUmVxdWVzdCAqLworCisjZW5kaWYgLyogX0RFRl9CRjUxOF9IICovCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvaW5jbHVkZS9tYWNoL2RlZkJGNTF4X2Jhc2UuaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9pbmNsdWRlL21hY2gvZGVmQkY1MXhfYmFzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiZWM4ZDEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvaW5jbHVkZS9tYWNoL2RlZkJGNTF4X2Jhc2UuaApAQCAtMCwwICsxLDE5NDAgQEAKKy8qCisgKiBGaWxlOiAgICAgICAgIGluY2x1ZGUvYXNtLWJsYWNrZmluL21hY2gtYmY1MTgvZGVmQkY1MXhfYmFzZS5oCisgKiBCYXNlZCBvbjoKKyAqIEF1dGhvcjoKKyAqCisgKiBDcmVhdGVkOgorICogRGVzY3JpcHRpb246CisgKgorICogUmV2OgorICoKKyAqIE1vZGlmaWVkOgorICoKKyAqIEJ1Z3M6ICAgICAgICAgRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuCisgKiBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICovCisKKyNpZm5kZWYgX0RFRl9CRjUxWF9ICisjZGVmaW5lIF9ERUZfQkY1MVhfSAorCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiAgIFNZU1RFTSAmIE1NUiBBRERSRVNTIERFRklOSVRJT05TIENPTU1PTiBUTyBBTEwgQURTUC1CRjUxeCAgICAqLworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworLyogQ2xvY2sgYW5kIFN5c3RlbSBDb250cm9sCSgweEZGQzAwMDAwIC0gMHhGRkMwMDBGRikJCQkJCQkJCSovCisjZGVmaW5lIFBMTF9DVEwJCQkJMHhGRkMwMDAwMAkvKiBQTEwgQ29udHJvbCBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIFBMTF9ESVYJCQkJMHhGRkMwMDAwNAkvKiBQTEwgRGl2aWRlIFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgVlJfQ1RMCQkJCTB4RkZDMDAwMDgJLyogVm9sdGFnZSBSZWd1bGF0b3IgQ29udHJvbCBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBQTExfU1RBVAkJCTB4RkZDMDAwMEMJLyogUExMIFN0YXR1cyBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIFBMTF9MT0NLQ05UCQkJMHhGRkMwMDAxMAkvKiBQTEwgTG9jayBDb3VudCBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgQ0hJUElECQkJCTB4RkZDMDAwMTQJLyogRGV2aWNlIElEIFJlZ2lzdGVyICovCisKKy8qIFN5c3RlbSBJbnRlcnJ1cHQgQ29udHJvbGxlciAoMHhGRkMwMDEwMCAtIDB4RkZDMDAxRkYpCQkJCQkJCQkqLworI2RlZmluZSBTV1JTVAkJCQkweEZGQzAwMTAwCS8qIFNvZnR3YXJlIFJlc2V0IFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBTWVNDUgkJCQkweEZGQzAwMTA0CS8qIFN5c3RlbSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIFNJQ19SVkVDVAkJCTB4RkZDMDAxMDgJLyogSW50ZXJydXB0IFJlc2V0IFZlY3RvciBBZGRyZXNzIFJlZ2lzdGVyCQkJKi8KKworI2RlZmluZSBTSUNfSU1BU0swCQkJMHhGRkMwMDEwQwkvKiBJbnRlcnJ1cHQgTWFzayBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgU0lDX0lBUjAJCQkweEZGQzAwMTEwCS8qIEludGVycnVwdCBBc3NpZ25tZW50IFJlZ2lzdGVyIDAJCQkJKi8KKyNkZWZpbmUgU0lDX0lBUjEJCQkweEZGQzAwMTE0CS8qIEludGVycnVwdCBBc3NpZ25tZW50IFJlZ2lzdGVyIDEJCQkJKi8KKyNkZWZpbmUgU0lDX0lBUjIJCQkweEZGQzAwMTE4CS8qIEludGVycnVwdCBBc3NpZ25tZW50IFJlZ2lzdGVyIDIJCQkJKi8KKyNkZWZpbmUgU0lDX0lBUjMJCQkweEZGQzAwMTFDCS8qIEludGVycnVwdCBBc3NpZ25tZW50IFJlZ2lzdGVyIDMJCQkJKi8KKyNkZWZpbmUgU0lDX0lTUjAJCQkweEZGQzAwMTIwCS8qIEludGVycnVwdCBTdGF0dXMgUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIFNJQ19JV1IwCQkJMHhGRkMwMDEyNAkvKiBJbnRlcnJ1cHQgV2FrZXVwIFJlZ2lzdGVyCQkJCQkqLworCisvKiBTSUMgQWRkaXRpb25zIHRvIEFEU1AtQkY1MXggKDB4RkZDMDAxNEMgLSAweEZGQzAwMTYyKSAqLworI2RlZmluZSBTSUNfSU1BU0sxICAgICAgICAgICAgICAgICAgICAgIDB4RkZDMDAxNEMgICAgIC8qIEludGVycnVwdCBNYXNrIHJlZ2lzdGVyIG9mIFNJQzIgKi8KKyNkZWZpbmUgU0lDX0lBUjQgICAgICAgICAgICAgICAgICAgICAgICAweEZGQzAwMTUwICAgICAvKiBJbnRlcnJ1cHQgQXNzaWdubWVudCByZWdpc3RlcjQgKi8KKyNkZWZpbmUgU0lDX0lBUjUgICAgICAgICAgICAgICAgICAgICAgICAweEZGQzAwMTU0ICAgICAvKiBJbnRlcnJ1cHQgQXNzaWdubWVudCByZWdpc3RlcjUgKi8KKyNkZWZpbmUgU0lDX0lBUjYgICAgICAgICAgICAgICAgICAgICAgICAweEZGQzAwMTU4ICAgICAvKiBJbnRlcnJ1cHQgQXNzaWdubWVudCByZWdpc3RlcjYgKi8KKyNkZWZpbmUgU0lDX0lBUjcgICAgICAgICAgICAgICAgICAgICAgICAweEZGQzAwMTVDICAgICAvKiBJbnRlcnJ1cHQgQXNzaWdubWVudCByZWdpc3RlcjcgKi8KKyNkZWZpbmUgU0lDX0lTUjEgICAgICAgICAgICAgICAgICAgICAgICAweEZGQzAwMTYwICAgICAvKiBJbnRlcnJ1cHQgU3RhdHVyIHJlZ2lzdGVyICovCisjZGVmaW5lIFNJQ19JV1IxICAgICAgICAgICAgICAgICAgICAgICAgMHhGRkMwMDE2NCAgICAgLyogSW50ZXJydXB0IFdha2V1cCByZWdpc3RlciAqLworCisKKy8qIFdhdGNoZG9nIFRpbWVyCQkJKDB4RkZDMDAyMDAgLSAweEZGQzAwMkZGKQkJCQkJCQkJKi8KKyNkZWZpbmUgV0RPR19DVEwJCQkweEZGQzAwMjAwCS8qIFdhdGNoZG9nIENvbnRyb2wgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgV0RPR19DTlQJCQkweEZGQzAwMjA0CS8qIFdhdGNoZG9nIENvdW50IFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBXRE9HX1NUQVQJCQkweEZGQzAwMjA4CS8qIFdhdGNoZG9nIFN0YXR1cyBSZWdpc3RlcgkJCQkJKi8KKworCisvKiBSZWFsIFRpbWUgQ2xvY2sJCSgweEZGQzAwMzAwIC0gMHhGRkMwMDNGRikJCQkJCQkJCQkqLworI2RlZmluZSBSVENfU1RBVAkJCTB4RkZDMDAzMDAJLyogUlRDIFN0YXR1cyBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIFJUQ19JQ1RMCQkJMHhGRkMwMDMwNAkvKiBSVEMgSW50ZXJydXB0IENvbnRyb2wgUmVnaXN0ZXIJCQkqLworI2RlZmluZSBSVENfSVNUQVQJCQkweEZGQzAwMzA4CS8qIFJUQyBJbnRlcnJ1cHQgU3RhdHVzIFJlZ2lzdGVyCQkJKi8KKyNkZWZpbmUgUlRDX1NXQ05UCQkJMHhGRkMwMDMwQwkvKiBSVEMgU3RvcHdhdGNoIENvdW50IFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIFJUQ19BTEFSTQkJCTB4RkZDMDAzMTAJLyogUlRDIEFsYXJtIFRpbWUgUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIFJUQ19GQVNUCQkJMHhGRkMwMDMxNAkvKiBSVEMgUHJlc2NhbGVyIEVuYWJsZSBSZWdpc3RlcgkJCSovCisjZGVmaW5lIFJUQ19QUkVOCQkJMHhGRkMwMDMxNAkvKiBSVEMgUHJlc2NhbGVyIEVuYWJsZSBBbHRlcm5hdGUgTWFjcm8JCSovCisKKworLyogVUFSVDAgQ29udHJvbGxlcgkJKDB4RkZDMDA0MDAgLSAweEZGQzAwNEZGKQkJCQkJCQkJCSovCisjZGVmaW5lIFVBUlQwX1RIUgkJCTB4RkZDMDA0MDAJLyogVHJhbnNtaXQgSG9sZGluZyByZWdpc3RlcgkJCQkqLworI2RlZmluZSBVQVJUMF9SQlIJCQkweEZGQzAwNDAwCS8qIFJlY2VpdmUgQnVmZmVyIHJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBVQVJUMF9ETEwJCQkweEZGQzAwNDAwCS8qIERpdmlzb3IgTGF0Y2ggKExvdy1CeXRlKQkJCQkJKi8KKyNkZWZpbmUgVUFSVDBfSUVSCQkJMHhGRkMwMDQwNAkvKiBJbnRlcnJ1cHQgRW5hYmxlIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIFVBUlQwX0RMSAkJCTB4RkZDMDA0MDQJLyogRGl2aXNvciBMYXRjaCAoSGlnaC1CeXRlKQkJCQkqLworI2RlZmluZSBVQVJUMF9JSVIJCQkweEZGQzAwNDA4CS8qIEludGVycnVwdCBJZGVudGlmaWNhdGlvbiBSZWdpc3RlcgkJKi8KKyNkZWZpbmUgVUFSVDBfTENSCQkJMHhGRkMwMDQwQwkvKiBMaW5lIENvbnRyb2wgUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIFVBUlQwX01DUgkJCTB4RkZDMDA0MTAJLyogTW9kZW0gQ29udHJvbCBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgVUFSVDBfTFNSCQkJMHhGRkMwMDQxNAkvKiBMaW5lIFN0YXR1cyBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIFVBUlQwX01TUgkJCTB4RkZDMDA0MTgJLyogTW9kZW0gU3RhdHVzIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBVQVJUMF9TQ1IJCQkweEZGQzAwNDFDCS8qIFNDUiBTY3JhdGNoIFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgVUFSVDBfR0NUTAkJCTB4RkZDMDA0MjQJLyogR2xvYmFsIENvbnRyb2wgUmVnaXN0ZXIJCQkJCSovCisKKy8qIFNQSTAgQ29udHJvbGxlcgkJCSgweEZGQzAwNTAwIC0gMHhGRkMwMDVGRikJCQkJCQkJKi8KKyNkZWZpbmUgU1BJMF9SRUdCQVNFCQkJMHhGRkMwMDUwMAorI2RlZmluZSBTUEkwX0NUTAkJCTB4RkZDMDA1MDAJLyogU1BJIENvbnRyb2wgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBTUEkwX0ZMRwkJCTB4RkZDMDA1MDQJLyogU1BJIEZsYWcgcmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBTUEkwX1NUQVQJCQkweEZGQzAwNTA4CS8qIFNQSSBTdGF0dXMgcmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBTUEkwX1REQlIJCQkweEZGQzAwNTBDCS8qIFNQSSBUcmFuc21pdCBEYXRhIEJ1ZmZlciBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBTUEkwX1JEQlIJCQkweEZGQzAwNTEwCS8qIFNQSSBSZWNlaXZlIERhdGEgQnVmZmVyIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIFNQSTBfQkFVRAkJCTB4RkZDMDA1MTQJLyogU1BJIEJhdWQgcmF0ZSBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgU1BJMF9TSEFET1cJCQkweEZGQzAwNTE4CS8qIFNQSV9SREJSIFNoYWRvdyBSZWdpc3RlcgkJCQkJKi8KKworLyogU1BJMSBDb250cm9sbGVyCQkJKDB4RkZDMDM0MDAgLSAweEZGQzAzNEZGKQkJCQkJCQkqLworI2RlZmluZSBTUEkxX1JFR0JBU0UJCQkweEZGQzAzNDAwCisjZGVmaW5lIFNQSTFfQ1RMCQkJMHhGRkMwMzQwMAkvKiBTUEkgQ29udHJvbCBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIFNQSTFfRkxHCQkJMHhGRkMwMzQwNAkvKiBTUEkgRmxhZyByZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIFNQSTFfU1RBVAkJCTB4RkZDMDM0MDgJLyogU1BJIFN0YXR1cyByZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIFNQSTFfVERCUgkJCTB4RkZDMDM0MEMJLyogU1BJIFRyYW5zbWl0IERhdGEgQnVmZmVyIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIFNQSTFfUkRCUgkJCTB4RkZDMDM0MTAJLyogU1BJIFJlY2VpdmUgRGF0YSBCdWZmZXIgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgU1BJMV9CQVVECQkJMHhGRkMwMzQxNAkvKiBTUEkgQmF1ZCByYXRlIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBTUEkxX1NIQURPVwkJCTB4RkZDMDM0MTgJLyogU1BJX1JEQlIgU2hhZG93IFJlZ2lzdGVyCQkJCQkqLworCisvKiBUSU1FUjAtNyBSZWdpc3RlcnMJCSgweEZGQzAwNjAwIC0gMHhGRkMwMDZGRikJCQkJCQkJCSovCisjZGVmaW5lIFRJTUVSMF9DT05GSUcJCTB4RkZDMDA2MDAJLyogVGltZXIgMCBDb25maWd1cmF0aW9uIFJlZ2lzdGVyCQkJKi8KKyNkZWZpbmUgVElNRVIwX0NPVU5URVIJCTB4RkZDMDA2MDQJLyogVGltZXIgMCBDb3VudGVyIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBUSU1FUjBfUEVSSU9ECQkweEZGQzAwNjA4CS8qIFRpbWVyIDAgUGVyaW9kIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBUSU1FUjBfV0lEVEgJCTB4RkZDMDA2MEMJLyogVGltZXIgMCBXaWR0aCBSZWdpc3RlcgkJCQkJKi8KKworI2RlZmluZSBUSU1FUjFfQ09ORklHCQkweEZGQzAwNjEwCS8qIFRpbWVyIDEgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAgCQkJKi8KKyNkZWZpbmUgVElNRVIxX0NPVU5URVIJCTB4RkZDMDA2MTQJLyogVGltZXIgMSBDb3VudGVyIFJlZ2lzdGVyICAgICAgICAJCQkqLworI2RlZmluZSBUSU1FUjFfUEVSSU9ECQkweEZGQzAwNjE4CS8qIFRpbWVyIDEgUGVyaW9kIFJlZ2lzdGVyICAgICAgICAgCQkJKi8KKyNkZWZpbmUgVElNRVIxX1dJRFRICQkweEZGQzAwNjFDCS8qIFRpbWVyIDEgV2lkdGggUmVnaXN0ZXIgICAgICAgICAgCQkJKi8KKworI2RlZmluZSBUSU1FUjJfQ09ORklHCQkweEZGQzAwNjIwCS8qIFRpbWVyIDIgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAgCQkJKi8KKyNkZWZpbmUgVElNRVIyX0NPVU5URVIJCTB4RkZDMDA2MjQJLyogVGltZXIgMiBDb3VudGVyIFJlZ2lzdGVyICAgICAgICAJCQkqLworI2RlZmluZSBUSU1FUjJfUEVSSU9ECQkweEZGQzAwNjI4CS8qIFRpbWVyIDIgUGVyaW9kIFJlZ2lzdGVyICAgICAgICAgCQkJKi8KKyNkZWZpbmUgVElNRVIyX1dJRFRICQkweEZGQzAwNjJDCS8qIFRpbWVyIDIgV2lkdGggUmVnaXN0ZXIgICAgICAgICAgCQkJKi8KKworI2RlZmluZSBUSU1FUjNfQ09ORklHCQkweEZGQzAwNjMwCS8qIFRpbWVyIDMgQ29uZmlndXJhdGlvbiBSZWdpc3RlcgkJCSovCisjZGVmaW5lIFRJTUVSM19DT1VOVEVSCQkweEZGQzAwNjM0CS8qIFRpbWVyIDMgQ291bnRlciBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgVElNRVIzX1BFUklPRAkJMHhGRkMwMDYzOAkvKiBUaW1lciAzIFBlcmlvZCBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgVElNRVIzX1dJRFRICQkweEZGQzAwNjNDCS8qIFRpbWVyIDMgV2lkdGggUmVnaXN0ZXIJCQkJCSovCisKKyNkZWZpbmUgVElNRVI0X0NPTkZJRwkJMHhGRkMwMDY0MAkvKiBUaW1lciA0IENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgIAkJCSovCisjZGVmaW5lIFRJTUVSNF9DT1VOVEVSCQkweEZGQzAwNjQ0CS8qIFRpbWVyIDQgQ291bnRlciBSZWdpc3RlciAgICAgICAgCQkJKi8KKyNkZWZpbmUgVElNRVI0X1BFUklPRAkJMHhGRkMwMDY0OAkvKiBUaW1lciA0IFBlcmlvZCBSZWdpc3RlciAgICAgICAgIAkJCSovCisjZGVmaW5lIFRJTUVSNF9XSURUSAkJMHhGRkMwMDY0QwkvKiBUaW1lciA0IFdpZHRoIFJlZ2lzdGVyICAgICAgICAgIAkJCSovCisKKyNkZWZpbmUgVElNRVI1X0NPTkZJRwkJMHhGRkMwMDY1MAkvKiBUaW1lciA1IENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgIAkJCSovCisjZGVmaW5lIFRJTUVSNV9DT1VOVEVSCQkweEZGQzAwNjU0CS8qIFRpbWVyIDUgQ291bnRlciBSZWdpc3RlciAgICAgICAgCQkJKi8KKyNkZWZpbmUgVElNRVI1X1BFUklPRAkJMHhGRkMwMDY1OAkvKiBUaW1lciA1IFBlcmlvZCBSZWdpc3RlciAgICAgICAgIAkJCSovCisjZGVmaW5lIFRJTUVSNV9XSURUSAkJMHhGRkMwMDY1QwkvKiBUaW1lciA1IFdpZHRoIFJlZ2lzdGVyICAgICAgICAgIAkJCSovCisKKyNkZWZpbmUgVElNRVI2X0NPTkZJRwkJMHhGRkMwMDY2MAkvKiBUaW1lciA2IENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgIAkJCSovCisjZGVmaW5lIFRJTUVSNl9DT1VOVEVSCQkweEZGQzAwNjY0CS8qIFRpbWVyIDYgQ291bnRlciBSZWdpc3RlciAgICAgICAgCQkJKi8KKyNkZWZpbmUgVElNRVI2X1BFUklPRAkJMHhGRkMwMDY2OAkvKiBUaW1lciA2IFBlcmlvZCBSZWdpc3RlciAgICAgICAgIAkJCSovCisjZGVmaW5lIFRJTUVSNl9XSURUSAkJMHhGRkMwMDY2QwkvKiBUaW1lciA2IFdpZHRoIFJlZ2lzdGVyICAgICAgICAgIAkJCSovCisKKyNkZWZpbmUgVElNRVI3X0NPTkZJRwkJMHhGRkMwMDY3MAkvKiBUaW1lciA3IENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgIAkJCSovCisjZGVmaW5lIFRJTUVSN19DT1VOVEVSCQkweEZGQzAwNjc0CS8qIFRpbWVyIDcgQ291bnRlciBSZWdpc3RlciAgICAgICAgCQkJKi8KKyNkZWZpbmUgVElNRVI3X1BFUklPRAkJMHhGRkMwMDY3OAkvKiBUaW1lciA3IFBlcmlvZCBSZWdpc3RlciAgICAgICAgIAkJCSovCisjZGVmaW5lIFRJTUVSN19XSURUSAkJMHhGRkMwMDY3QwkvKiBUaW1lciA3IFdpZHRoIFJlZ2lzdGVyICAgICAgIAkJCSovCisKKyNkZWZpbmUgVElNRVJfRU5BQkxFCQkweEZGQzAwNjgwCS8qIFRpbWVyIEVuYWJsZSBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgVElNRVJfRElTQUJMRQkJMHhGRkMwMDY4NAkvKiBUaW1lciBEaXNhYmxlIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBUSU1FUl9TVEFUVVMJCTB4RkZDMDA2ODgJLyogVGltZXIgU3RhdHVzIFJlZ2lzdGVyCQkJCQkqLworCisvKiBHZW5lcmFsIFB1cnBvc2UgSS9PIFBvcnQgRiAoMHhGRkMwMDcwMCAtIDB4RkZDMDA3RkYpCQkJCQkJCQkJCQkJKi8KKyNkZWZpbmUgUE9SVEZJTwkJCQkJMHhGRkMwMDcwMAkvKiBQb3J0IEYgSS9PIFBpbiBTdGF0ZSBTcGVjaWZ5IFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIFBPUlRGSU9fQ0xFQVIJCQkweEZGQzAwNzA0CS8qIFBvcnQgRiBJL08gUGVyaXBoZXJhbCBJbnRlcnJ1cHQgQ2xlYXIgUmVnaXN0ZXIJCSovCisjZGVmaW5lIFBPUlRGSU9fU0VUCQkJCTB4RkZDMDA3MDgJLyogUG9ydCBGIEkvTyBQZXJpcGhlcmFsIEludGVycnVwdCBTZXQgUmVnaXN0ZXIJCQkqLworI2RlZmluZSBQT1JURklPX1RPR0dMRQkJCTB4RkZDMDA3MEMJLyogUG9ydCBGIEkvTyBQaW4gU3RhdGUgVG9nZ2xlIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBQT1JURklPX01BU0tBCQkJMHhGRkMwMDcxMAkvKiBQb3J0IEYgSS9PIE1hc2sgU3RhdGUgU3BlY2lmeSBJbnRlcnJ1cHQgQSBSZWdpc3RlcgkqLworI2RlZmluZSBQT1JURklPX01BU0tBX0NMRUFSCQkweEZGQzAwNzE0CS8qIFBvcnQgRiBJL08gTWFzayBEaXNhYmxlIEludGVycnVwdCBBIFJlZ2lzdGVyCQkJKi8KKyNkZWZpbmUgUE9SVEZJT19NQVNLQV9TRVQJCTB4RkZDMDA3MTgJLyogUG9ydCBGIEkvTyBNYXNrIEVuYWJsZSBJbnRlcnJ1cHQgQSBSZWdpc3RlcgkJCSovCisjZGVmaW5lIFBPUlRGSU9fTUFTS0FfVE9HR0xFCTB4RkZDMDA3MUMJLyogUG9ydCBGIEkvTyBNYXNrIFRvZ2dsZSBFbmFibGUgSW50ZXJydXB0IEEgUmVnaXN0ZXIJKi8KKyNkZWZpbmUgUE9SVEZJT19NQVNLQgkJCTB4RkZDMDA3MjAJLyogUG9ydCBGIEkvTyBNYXNrIFN0YXRlIFNwZWNpZnkgSW50ZXJydXB0IEIgUmVnaXN0ZXIJKi8KKyNkZWZpbmUgUE9SVEZJT19NQVNLQl9DTEVBUgkJMHhGRkMwMDcyNAkvKiBQb3J0IEYgSS9PIE1hc2sgRGlzYWJsZSBJbnRlcnJ1cHQgQiBSZWdpc3RlcgkJCSovCisjZGVmaW5lIFBPUlRGSU9fTUFTS0JfU0VUCQkweEZGQzAwNzI4CS8qIFBvcnQgRiBJL08gTWFzayBFbmFibGUgSW50ZXJydXB0IEIgUmVnaXN0ZXIJCQkqLworI2RlZmluZSBQT1JURklPX01BU0tCX1RPR0dMRQkweEZGQzAwNzJDCS8qIFBvcnQgRiBJL08gTWFzayBUb2dnbGUgRW5hYmxlIEludGVycnVwdCBCIFJlZ2lzdGVyCSovCisjZGVmaW5lIFBPUlRGSU9fRElSCQkJCTB4RkZDMDA3MzAJLyogUG9ydCBGIEkvTyBEaXJlY3Rpb24gUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBQT1JURklPX1BPTEFSCQkJMHhGRkMwMDczNAkvKiBQb3J0IEYgSS9PIFNvdXJjZSBQb2xhcml0eSBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgUE9SVEZJT19FREdFCQkJMHhGRkMwMDczOAkvKiBQb3J0IEYgSS9PIFNvdXJjZSBTZW5zaXRpdml0eSBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBQT1JURklPX0JPVEgJCQkweEZGQzAwNzNDCS8qIFBvcnQgRiBJL08gU2V0IG9uIEJPVEggRWRnZXMgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgUE9SVEZJT19JTkVOCQkJMHhGRkMwMDc0MAkvKiBQb3J0IEYgSS9PIElucHV0IEVuYWJsZSBSZWdpc3RlciAJCQkJCSovCisKKy8qIFNQT1JUMCBDb250cm9sbGVyCQkoMHhGRkMwMDgwMCAtIDB4RkZDMDA4RkYpCQkJCQkJCQkJCSovCisjZGVmaW5lIFNQT1JUMF9UQ1IxCQkJMHhGRkMwMDgwMAkvKiBTUE9SVDAgVHJhbnNtaXQgQ29uZmlndXJhdGlvbiAxIFJlZ2lzdGVyCQkJKi8KKyNkZWZpbmUgU1BPUlQwX1RDUjIJCQkweEZGQzAwODA0CS8qIFNQT1JUMCBUcmFuc21pdCBDb25maWd1cmF0aW9uIDIgUmVnaXN0ZXIJCQkqLworI2RlZmluZSBTUE9SVDBfVENMS0RJVgkJMHhGRkMwMDgwOAkvKiBTUE9SVDAgVHJhbnNtaXQgQ2xvY2sgRGl2aWRlcgkJCQkJKi8KKyNkZWZpbmUgU1BPUlQwX1RGU0RJVgkJMHhGRkMwMDgwQwkvKiBTUE9SVDAgVHJhbnNtaXQgRnJhbWUgU3luYyBEaXZpZGVyCQkJCSovCisjZGVmaW5lIFNQT1JUMF9UWAkJCTB4RkZDMDA4MTAJLyogU1BPUlQwIFRYIERhdGEgUmVnaXN0ZXIJCQkJCQkJKi8KKyNkZWZpbmUgU1BPUlQwX1JYCQkJMHhGRkMwMDgxOAkvKiBTUE9SVDAgUlggRGF0YSBSZWdpc3RlcgkJCQkJCQkqLworI2RlZmluZSBTUE9SVDBfUkNSMQkJCTB4RkZDMDA4MjAJLyogU1BPUlQwIFRyYW5zbWl0IENvbmZpZ3VyYXRpb24gMSBSZWdpc3RlcgkJCSovCisjZGVmaW5lIFNQT1JUMF9SQ1IyCQkJMHhGRkMwMDgyNAkvKiBTUE9SVDAgVHJhbnNtaXQgQ29uZmlndXJhdGlvbiAyIFJlZ2lzdGVyCQkJKi8KKyNkZWZpbmUgU1BPUlQwX1JDTEtESVYJCTB4RkZDMDA4MjgJLyogU1BPUlQwIFJlY2VpdmUgQ2xvY2sgRGl2aWRlcgkJCQkJCSovCisjZGVmaW5lIFNQT1JUMF9SRlNESVYJCTB4RkZDMDA4MkMJLyogU1BPUlQwIFJlY2VpdmUgRnJhbWUgU3luYyBEaXZpZGVyCQkJCSovCisjZGVmaW5lIFNQT1JUMF9TVEFUCQkJMHhGRkMwMDgzMAkvKiBTUE9SVDAgU3RhdHVzIFJlZ2lzdGVyCQkJCQkJCSovCisjZGVmaW5lIFNQT1JUMF9DSE5MCQkJMHhGRkMwMDgzNAkvKiBTUE9SVDAgQ3VycmVudCBDaGFubmVsIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBTUE9SVDBfTUNNQzEJCTB4RkZDMDA4MzgJLyogU1BPUlQwIE11bHRpLUNoYW5uZWwgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAxCSovCisjZGVmaW5lIFNQT1JUMF9NQ01DMgkJMHhGRkMwMDgzQwkvKiBTUE9SVDAgTXVsdGktQ2hhbm5lbCBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIDIJKi8KKyNkZWZpbmUgU1BPUlQwX01UQ1MwCQkweEZGQzAwODQwCS8qIFNQT1JUMCBNdWx0aS1DaGFubmVsIFRyYW5zbWl0IFNlbGVjdCBSZWdpc3RlciAwCSovCisjZGVmaW5lIFNQT1JUMF9NVENTMQkJMHhGRkMwMDg0NAkvKiBTUE9SVDAgTXVsdGktQ2hhbm5lbCBUcmFuc21pdCBTZWxlY3QgUmVnaXN0ZXIgMQkqLworI2RlZmluZSBTUE9SVDBfTVRDUzIJCTB4RkZDMDA4NDgJLyogU1BPUlQwIE11bHRpLUNoYW5uZWwgVHJhbnNtaXQgU2VsZWN0IFJlZ2lzdGVyIDIJKi8KKyNkZWZpbmUgU1BPUlQwX01UQ1MzCQkweEZGQzAwODRDCS8qIFNQT1JUMCBNdWx0aS1DaGFubmVsIFRyYW5zbWl0IFNlbGVjdCBSZWdpc3RlciAzCSovCisjZGVmaW5lIFNQT1JUMF9NUkNTMAkJMHhGRkMwMDg1MAkvKiBTUE9SVDAgTXVsdGktQ2hhbm5lbCBSZWNlaXZlIFNlbGVjdCBSZWdpc3RlciAwCSovCisjZGVmaW5lIFNQT1JUMF9NUkNTMQkJMHhGRkMwMDg1NAkvKiBTUE9SVDAgTXVsdGktQ2hhbm5lbCBSZWNlaXZlIFNlbGVjdCBSZWdpc3RlciAxCSovCisjZGVmaW5lIFNQT1JUMF9NUkNTMgkJMHhGRkMwMDg1OAkvKiBTUE9SVDAgTXVsdGktQ2hhbm5lbCBSZWNlaXZlIFNlbGVjdCBSZWdpc3RlciAyCSovCisjZGVmaW5lIFNQT1JUMF9NUkNTMwkJMHhGRkMwMDg1QwkvKiBTUE9SVDAgTXVsdGktQ2hhbm5lbCBSZWNlaXZlIFNlbGVjdCBSZWdpc3RlciAzCSovCisKKy8qIFNQT1JUMSBDb250cm9sbGVyCQkoMHhGRkMwMDkwMCAtIDB4RkZDMDA5RkYpCQkJCQkJCQkJCSovCisjZGVmaW5lIFNQT1JUMV9UQ1IxCQkJMHhGRkMwMDkwMAkvKiBTUE9SVDEgVHJhbnNtaXQgQ29uZmlndXJhdGlvbiAxIFJlZ2lzdGVyCQkJKi8KKyNkZWZpbmUgU1BPUlQxX1RDUjIJCQkweEZGQzAwOTA0CS8qIFNQT1JUMSBUcmFuc21pdCBDb25maWd1cmF0aW9uIDIgUmVnaXN0ZXIJCQkqLworI2RlZmluZSBTUE9SVDFfVENMS0RJVgkJMHhGRkMwMDkwOAkvKiBTUE9SVDEgVHJhbnNtaXQgQ2xvY2sgRGl2aWRlcgkJCQkJKi8KKyNkZWZpbmUgU1BPUlQxX1RGU0RJVgkJMHhGRkMwMDkwQwkvKiBTUE9SVDEgVHJhbnNtaXQgRnJhbWUgU3luYyBEaXZpZGVyCQkJCSovCisjZGVmaW5lIFNQT1JUMV9UWAkJCTB4RkZDMDA5MTAJLyogU1BPUlQxIFRYIERhdGEgUmVnaXN0ZXIJCQkJCQkJKi8KKyNkZWZpbmUgU1BPUlQxX1JYCQkJMHhGRkMwMDkxOAkvKiBTUE9SVDEgUlggRGF0YSBSZWdpc3RlcgkJCQkJCQkqLworI2RlZmluZSBTUE9SVDFfUkNSMQkJCTB4RkZDMDA5MjAJLyogU1BPUlQxIFRyYW5zbWl0IENvbmZpZ3VyYXRpb24gMSBSZWdpc3RlcgkJCSovCisjZGVmaW5lIFNQT1JUMV9SQ1IyCQkJMHhGRkMwMDkyNAkvKiBTUE9SVDEgVHJhbnNtaXQgQ29uZmlndXJhdGlvbiAyIFJlZ2lzdGVyCQkJKi8KKyNkZWZpbmUgU1BPUlQxX1JDTEtESVYJCTB4RkZDMDA5MjgJLyogU1BPUlQxIFJlY2VpdmUgQ2xvY2sgRGl2aWRlcgkJCQkJCSovCisjZGVmaW5lIFNQT1JUMV9SRlNESVYJCTB4RkZDMDA5MkMJLyogU1BPUlQxIFJlY2VpdmUgRnJhbWUgU3luYyBEaXZpZGVyCQkJCSovCisjZGVmaW5lIFNQT1JUMV9TVEFUCQkJMHhGRkMwMDkzMAkvKiBTUE9SVDEgU3RhdHVzIFJlZ2lzdGVyCQkJCQkJCSovCisjZGVmaW5lIFNQT1JUMV9DSE5MCQkJMHhGRkMwMDkzNAkvKiBTUE9SVDEgQ3VycmVudCBDaGFubmVsIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBTUE9SVDFfTUNNQzEJCTB4RkZDMDA5MzgJLyogU1BPUlQxIE11bHRpLUNoYW5uZWwgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAxCSovCisjZGVmaW5lIFNQT1JUMV9NQ01DMgkJMHhGRkMwMDkzQwkvKiBTUE9SVDEgTXVsdGktQ2hhbm5lbCBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIDIJKi8KKyNkZWZpbmUgU1BPUlQxX01UQ1MwCQkweEZGQzAwOTQwCS8qIFNQT1JUMSBNdWx0aS1DaGFubmVsIFRyYW5zbWl0IFNlbGVjdCBSZWdpc3RlciAwCSovCisjZGVmaW5lIFNQT1JUMV9NVENTMQkJMHhGRkMwMDk0NAkvKiBTUE9SVDEgTXVsdGktQ2hhbm5lbCBUcmFuc21pdCBTZWxlY3QgUmVnaXN0ZXIgMQkqLworI2RlZmluZSBTUE9SVDFfTVRDUzIJCTB4RkZDMDA5NDgJLyogU1BPUlQxIE11bHRpLUNoYW5uZWwgVHJhbnNtaXQgU2VsZWN0IFJlZ2lzdGVyIDIJKi8KKyNkZWZpbmUgU1BPUlQxX01UQ1MzCQkweEZGQzAwOTRDCS8qIFNQT1JUMSBNdWx0aS1DaGFubmVsIFRyYW5zbWl0IFNlbGVjdCBSZWdpc3RlciAzCSovCisjZGVmaW5lIFNQT1JUMV9NUkNTMAkJMHhGRkMwMDk1MAkvKiBTUE9SVDEgTXVsdGktQ2hhbm5lbCBSZWNlaXZlIFNlbGVjdCBSZWdpc3RlciAwCSovCisjZGVmaW5lIFNQT1JUMV9NUkNTMQkJMHhGRkMwMDk1NAkvKiBTUE9SVDEgTXVsdGktQ2hhbm5lbCBSZWNlaXZlIFNlbGVjdCBSZWdpc3RlciAxCSovCisjZGVmaW5lIFNQT1JUMV9NUkNTMgkJMHhGRkMwMDk1OAkvKiBTUE9SVDEgTXVsdGktQ2hhbm5lbCBSZWNlaXZlIFNlbGVjdCBSZWdpc3RlciAyCSovCisjZGVmaW5lIFNQT1JUMV9NUkNTMwkJMHhGRkMwMDk1QwkvKiBTUE9SVDEgTXVsdGktQ2hhbm5lbCBSZWNlaXZlIFNlbGVjdCBSZWdpc3RlciAzCSovCisKKy8qIEV4dGVybmFsIEJ1cyBJbnRlcmZhY2UgVW5pdCAoMHhGRkMwMEEwMCAtIDB4RkZDMDBBRkYpCQkJCQkJCQkqLworI2RlZmluZSBFQklVX0FNR0NUTAkJCTB4RkZDMDBBMDAJLyogQXN5bmNocm9ub3VzIE1lbW9yeSBHbG9iYWwgQ29udHJvbCBSZWdpc3RlcgkqLworI2RlZmluZSBFQklVX0FNQkNUTDAJCTB4RkZDMDBBMDQJLyogQXN5bmNocm9ub3VzIE1lbW9yeSBCYW5rIENvbnRyb2wgUmVnaXN0ZXIgMAkqLworI2RlZmluZSBFQklVX0FNQkNUTDEJCTB4RkZDMDBBMDgJLyogQXN5bmNocm9ub3VzIE1lbW9yeSBCYW5rIENvbnRyb2wgUmVnaXN0ZXIgMQkqLworI2RlZmluZSBFQklVX1NER0NUTAkJCTB4RkZDMDBBMTAJLyogU0RSQU0gR2xvYmFsIENvbnRyb2wgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgRUJJVV9TREJDVEwJCQkweEZGQzAwQTE0CS8qIFNEUkFNIEJhbmsgQ29udHJvbCBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgRUJJVV9TRFJSQwkJCTB4RkZDMDBBMTgJLyogU0RSQU0gUmVmcmVzaCBSYXRlIENvbnRyb2wgUmVnaXN0ZXIJCQkqLworI2RlZmluZSBFQklVX1NEU1RBVAkJCTB4RkZDMDBBMUMJLyogU0RSQU0gU3RhdHVzIFJlZ2lzdGVyCQkJCQkJKi8KKworLyogRE1BIFRyYWZmaWMgQ29udHJvbCBSZWdpc3RlcnMJCQkJCQkJCQkJCQkJKi8KKyNkZWZpbmUgRE1BX1RDX1BFUgkJCTB4RkZDMDBCMEMJLyogVHJhZmZpYyBDb250cm9sIFBlcmlvZHMgUmVnaXN0ZXIJCQkqLworI2RlZmluZSBETUFfVENfQ05UCQkJMHhGRkMwMEIxMAkvKiBUcmFmZmljIENvbnRyb2wgQ3VycmVudCBDb3VudHMgUmVnaXN0ZXIJKi8KKworLyogQWx0ZXJuYXRlIGRlcHJlY2F0ZWQgcmVnaXN0ZXIgbmFtZXMgKGJlbG93KSBwcm92aWRlZCBmb3IgYmFja3dhcmRzIGNvZGUgY29tcGF0aWJpbGl0eSAqLworI2RlZmluZSBETUFfVENQRVIJCQkweEZGQzAwQjBDCS8qIFRyYWZmaWMgQ29udHJvbCBQZXJpb2RzIFJlZ2lzdGVyCQkJKi8KKyNkZWZpbmUgRE1BX1RDQ05UCQkJMHhGRkMwMEIxMAkvKiBUcmFmZmljIENvbnRyb2wgQ3VycmVudCBDb3VudHMgUmVnaXN0ZXIJKi8KKworLyogRE1BIENvbnRyb2xsZXIgKDB4RkZDMDBDMDAgLSAweEZGQzAwRkZGKQkJCQkJCQkJCQkJCQkJCSovCisjZGVmaW5lIERNQTBfTkVYVF9ERVNDX1BUUgkJMHhGRkMwMEMwMAkvKiBETUEgQ2hhbm5lbCAwIE5leHQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyCQkqLworI2RlZmluZSBETUEwX1NUQVJUX0FERFIJCQkweEZGQzAwQzA0CS8qIERNQSBDaGFubmVsIDAgU3RhcnQgQWRkcmVzcyBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgRE1BMF9DT05GSUcJCQkJMHhGRkMwMEMwOAkvKiBETUEgQ2hhbm5lbCAwIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIERNQTBfWF9DT1VOVAkJCTB4RkZDMDBDMTAJLyogRE1BIENoYW5uZWwgMCBYIENvdW50IFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgRE1BMF9YX01PRElGWQkJCTB4RkZDMDBDMTQJLyogRE1BIENoYW5uZWwgMCBYIE1vZGlmeSBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIERNQTBfWV9DT1VOVAkJCTB4RkZDMDBDMTgJLyogRE1BIENoYW5uZWwgMCBZIENvdW50IFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgRE1BMF9ZX01PRElGWQkJCTB4RkZDMDBDMUMJLyogRE1BIENoYW5uZWwgMCBZIE1vZGlmeSBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIERNQTBfQ1VSUl9ERVNDX1BUUgkJMHhGRkMwMEMyMAkvKiBETUEgQ2hhbm5lbCAwIEN1cnJlbnQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyCSovCisjZGVmaW5lIERNQTBfQ1VSUl9BRERSCQkJMHhGRkMwMEMyNAkvKiBETUEgQ2hhbm5lbCAwIEN1cnJlbnQgQWRkcmVzcyBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBETUEwX0lSUV9TVEFUVVMJCQkweEZGQzAwQzI4CS8qIERNQSBDaGFubmVsIDAgSW50ZXJydXB0L1N0YXR1cyBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBETUEwX1BFUklQSEVSQUxfTUFQCQkweEZGQzAwQzJDCS8qIERNQSBDaGFubmVsIDAgUGVyaXBoZXJhbCBNYXAgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgRE1BMF9DVVJSX1hfQ09VTlQJCTB4RkZDMDBDMzAJLyogRE1BIENoYW5uZWwgMCBDdXJyZW50IFggQ291bnQgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgRE1BMF9DVVJSX1lfQ09VTlQJCTB4RkZDMDBDMzgJLyogRE1BIENoYW5uZWwgMCBDdXJyZW50IFkgQ291bnQgUmVnaXN0ZXIJCQkJKi8KKworI2RlZmluZSBETUExX05FWFRfREVTQ19QVFIJCTB4RkZDMDBDNDAJLyogRE1BIENoYW5uZWwgMSBOZXh0IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlcgkJKi8KKyNkZWZpbmUgRE1BMV9TVEFSVF9BRERSCQkJMHhGRkMwMEM0NAkvKiBETUEgQ2hhbm5lbCAxIFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIERNQTFfQ09ORklHCQkJCTB4RkZDMDBDNDgJLyogRE1BIENoYW5uZWwgMSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBETUExX1hfQ09VTlQJCQkweEZGQzAwQzUwCS8qIERNQSBDaGFubmVsIDEgWCBDb3VudCBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIERNQTFfWF9NT0RJRlkJCQkweEZGQzAwQzU0CS8qIERNQSBDaGFubmVsIDEgWCBNb2RpZnkgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBETUExX1lfQ09VTlQJCQkweEZGQzAwQzU4CS8qIERNQSBDaGFubmVsIDEgWSBDb3VudCBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIERNQTFfWV9NT0RJRlkJCQkweEZGQzAwQzVDCS8qIERNQSBDaGFubmVsIDEgWSBNb2RpZnkgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBETUExX0NVUlJfREVTQ19QVFIJCTB4RkZDMDBDNjAJLyogRE1BIENoYW5uZWwgMSBDdXJyZW50IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlcgkqLworI2RlZmluZSBETUExX0NVUlJfQUREUgkJCTB4RkZDMDBDNjQJLyogRE1BIENoYW5uZWwgMSBDdXJyZW50IEFkZHJlc3MgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgRE1BMV9JUlFfU1RBVFVTCQkJMHhGRkMwMEM2OAkvKiBETUEgQ2hhbm5lbCAxIEludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgRE1BMV9QRVJJUEhFUkFMX01BUAkJMHhGRkMwMEM2QwkvKiBETUEgQ2hhbm5lbCAxIFBlcmlwaGVyYWwgTWFwIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIERNQTFfQ1VSUl9YX0NPVU5UCQkweEZGQzAwQzcwCS8qIERNQSBDaGFubmVsIDEgQ3VycmVudCBYIENvdW50IFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIERNQTFfQ1VSUl9ZX0NPVU5UCQkweEZGQzAwQzc4CS8qIERNQSBDaGFubmVsIDEgQ3VycmVudCBZIENvdW50IFJlZ2lzdGVyCQkJCSovCisKKyNkZWZpbmUgRE1BMl9ORVhUX0RFU0NfUFRSCQkweEZGQzAwQzgwCS8qIERNQSBDaGFubmVsIDIgTmV4dCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIJCSovCisjZGVmaW5lIERNQTJfU1RBUlRfQUREUgkJCTB4RkZDMDBDODQJLyogRE1BIENoYW5uZWwgMiBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBETUEyX0NPTkZJRwkJCQkweEZGQzAwQzg4CS8qIERNQSBDaGFubmVsIDIgQ29uZmlndXJhdGlvbiBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgRE1BMl9YX0NPVU5UCQkJMHhGRkMwMEM5MAkvKiBETUEgQ2hhbm5lbCAyIFggQ291bnQgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBETUEyX1hfTU9ESUZZCQkJMHhGRkMwMEM5NAkvKiBETUEgQ2hhbm5lbCAyIFggTW9kaWZ5IFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgRE1BMl9ZX0NPVU5UCQkJMHhGRkMwMEM5OAkvKiBETUEgQ2hhbm5lbCAyIFkgQ291bnQgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBETUEyX1lfTU9ESUZZCQkJMHhGRkMwMEM5QwkvKiBETUEgQ2hhbm5lbCAyIFkgTW9kaWZ5IFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgRE1BMl9DVVJSX0RFU0NfUFRSCQkweEZGQzAwQ0EwCS8qIERNQSBDaGFubmVsIDIgQ3VycmVudCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIJKi8KKyNkZWZpbmUgRE1BMl9DVVJSX0FERFIJCQkweEZGQzAwQ0E0CS8qIERNQSBDaGFubmVsIDIgQ3VycmVudCBBZGRyZXNzIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIERNQTJfSVJRX1NUQVRVUwkJCTB4RkZDMDBDQTgJLyogRE1BIENoYW5uZWwgMiBJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIERNQTJfUEVSSVBIRVJBTF9NQVAJCTB4RkZDMDBDQUMJLyogRE1BIENoYW5uZWwgMiBQZXJpcGhlcmFsIE1hcCBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBETUEyX0NVUlJfWF9DT1VOVAkJMHhGRkMwMENCMAkvKiBETUEgQ2hhbm5lbCAyIEN1cnJlbnQgWCBDb3VudCBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBETUEyX0NVUlJfWV9DT1VOVAkJMHhGRkMwMENCOAkvKiBETUEgQ2hhbm5lbCAyIEN1cnJlbnQgWSBDb3VudCBSZWdpc3RlcgkJCQkqLworCisjZGVmaW5lIERNQTNfTkVYVF9ERVNDX1BUUgkJMHhGRkMwMENDMAkvKiBETUEgQ2hhbm5lbCAzIE5leHQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyCQkqLworI2RlZmluZSBETUEzX1NUQVJUX0FERFIJCQkweEZGQzAwQ0M0CS8qIERNQSBDaGFubmVsIDMgU3RhcnQgQWRkcmVzcyBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgRE1BM19DT05GSUcJCQkJMHhGRkMwMENDOAkvKiBETUEgQ2hhbm5lbCAzIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIERNQTNfWF9DT1VOVAkJCTB4RkZDMDBDRDAJLyogRE1BIENoYW5uZWwgMyBYIENvdW50IFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgRE1BM19YX01PRElGWQkJCTB4RkZDMDBDRDQJLyogRE1BIENoYW5uZWwgMyBYIE1vZGlmeSBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIERNQTNfWV9DT1VOVAkJCTB4RkZDMDBDRDgJLyogRE1BIENoYW5uZWwgMyBZIENvdW50IFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgRE1BM19ZX01PRElGWQkJCTB4RkZDMDBDREMJLyogRE1BIENoYW5uZWwgMyBZIE1vZGlmeSBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIERNQTNfQ1VSUl9ERVNDX1BUUgkJMHhGRkMwMENFMAkvKiBETUEgQ2hhbm5lbCAzIEN1cnJlbnQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyCSovCisjZGVmaW5lIERNQTNfQ1VSUl9BRERSCQkJMHhGRkMwMENFNAkvKiBETUEgQ2hhbm5lbCAzIEN1cnJlbnQgQWRkcmVzcyBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBETUEzX0lSUV9TVEFUVVMJCQkweEZGQzAwQ0U4CS8qIERNQSBDaGFubmVsIDMgSW50ZXJydXB0L1N0YXR1cyBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBETUEzX1BFUklQSEVSQUxfTUFQCQkweEZGQzAwQ0VDCS8qIERNQSBDaGFubmVsIDMgUGVyaXBoZXJhbCBNYXAgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgRE1BM19DVVJSX1hfQ09VTlQJCTB4RkZDMDBDRjAJLyogRE1BIENoYW5uZWwgMyBDdXJyZW50IFggQ291bnQgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgRE1BM19DVVJSX1lfQ09VTlQJCTB4RkZDMDBDRjgJLyogRE1BIENoYW5uZWwgMyBDdXJyZW50IFkgQ291bnQgUmVnaXN0ZXIJCQkJKi8KKworI2RlZmluZSBETUE0X05FWFRfREVTQ19QVFIJCTB4RkZDMDBEMDAJLyogRE1BIENoYW5uZWwgNCBOZXh0IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlcgkJKi8KKyNkZWZpbmUgRE1BNF9TVEFSVF9BRERSCQkJMHhGRkMwMEQwNAkvKiBETUEgQ2hhbm5lbCA0IFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIERNQTRfQ09ORklHCQkJCTB4RkZDMDBEMDgJLyogRE1BIENoYW5uZWwgNCBDb25maWd1cmF0aW9uIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBETUE0X1hfQ09VTlQJCQkweEZGQzAwRDEwCS8qIERNQSBDaGFubmVsIDQgWCBDb3VudCBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIERNQTRfWF9NT0RJRlkJCQkweEZGQzAwRDE0CS8qIERNQSBDaGFubmVsIDQgWCBNb2RpZnkgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBETUE0X1lfQ09VTlQJCQkweEZGQzAwRDE4CS8qIERNQSBDaGFubmVsIDQgWSBDb3VudCBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIERNQTRfWV9NT0RJRlkJCQkweEZGQzAwRDFDCS8qIERNQSBDaGFubmVsIDQgWSBNb2RpZnkgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBETUE0X0NVUlJfREVTQ19QVFIJCTB4RkZDMDBEMjAJLyogRE1BIENoYW5uZWwgNCBDdXJyZW50IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlcgkqLworI2RlZmluZSBETUE0X0NVUlJfQUREUgkJCTB4RkZDMDBEMjQJLyogRE1BIENoYW5uZWwgNCBDdXJyZW50IEFkZHJlc3MgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgRE1BNF9JUlFfU1RBVFVTCQkJMHhGRkMwMEQyOAkvKiBETUEgQ2hhbm5lbCA0IEludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgRE1BNF9QRVJJUEhFUkFMX01BUAkJMHhGRkMwMEQyQwkvKiBETUEgQ2hhbm5lbCA0IFBlcmlwaGVyYWwgTWFwIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIERNQTRfQ1VSUl9YX0NPVU5UCQkweEZGQzAwRDMwCS8qIERNQSBDaGFubmVsIDQgQ3VycmVudCBYIENvdW50IFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIERNQTRfQ1VSUl9ZX0NPVU5UCQkweEZGQzAwRDM4CS8qIERNQSBDaGFubmVsIDQgQ3VycmVudCBZIENvdW50IFJlZ2lzdGVyCQkJCSovCisKKyNkZWZpbmUgRE1BNV9ORVhUX0RFU0NfUFRSCQkweEZGQzAwRDQwCS8qIERNQSBDaGFubmVsIDUgTmV4dCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIJCSovCisjZGVmaW5lIERNQTVfU1RBUlRfQUREUgkJCTB4RkZDMDBENDQJLyogRE1BIENoYW5uZWwgNSBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBETUE1X0NPTkZJRwkJCQkweEZGQzAwRDQ4CS8qIERNQSBDaGFubmVsIDUgQ29uZmlndXJhdGlvbiBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgRE1BNV9YX0NPVU5UCQkJMHhGRkMwMEQ1MAkvKiBETUEgQ2hhbm5lbCA1IFggQ291bnQgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBETUE1X1hfTU9ESUZZCQkJMHhGRkMwMEQ1NAkvKiBETUEgQ2hhbm5lbCA1IFggTW9kaWZ5IFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgRE1BNV9ZX0NPVU5UCQkJMHhGRkMwMEQ1OAkvKiBETUEgQ2hhbm5lbCA1IFkgQ291bnQgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBETUE1X1lfTU9ESUZZCQkJMHhGRkMwMEQ1QwkvKiBETUEgQ2hhbm5lbCA1IFkgTW9kaWZ5IFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgRE1BNV9DVVJSX0RFU0NfUFRSCQkweEZGQzAwRDYwCS8qIERNQSBDaGFubmVsIDUgQ3VycmVudCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIJKi8KKyNkZWZpbmUgRE1BNV9DVVJSX0FERFIJCQkweEZGQzAwRDY0CS8qIERNQSBDaGFubmVsIDUgQ3VycmVudCBBZGRyZXNzIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIERNQTVfSVJRX1NUQVRVUwkJCTB4RkZDMDBENjgJLyogRE1BIENoYW5uZWwgNSBJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIERNQTVfUEVSSVBIRVJBTF9NQVAJCTB4RkZDMDBENkMJLyogRE1BIENoYW5uZWwgNSBQZXJpcGhlcmFsIE1hcCBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBETUE1X0NVUlJfWF9DT1VOVAkJMHhGRkMwMEQ3MAkvKiBETUEgQ2hhbm5lbCA1IEN1cnJlbnQgWCBDb3VudCBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBETUE1X0NVUlJfWV9DT1VOVAkJMHhGRkMwMEQ3OAkvKiBETUEgQ2hhbm5lbCA1IEN1cnJlbnQgWSBDb3VudCBSZWdpc3RlcgkJCQkqLworCisjZGVmaW5lIERNQTZfTkVYVF9ERVNDX1BUUgkJMHhGRkMwMEQ4MAkvKiBETUEgQ2hhbm5lbCA2IE5leHQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyCQkqLworI2RlZmluZSBETUE2X1NUQVJUX0FERFIJCQkweEZGQzAwRDg0CS8qIERNQSBDaGFubmVsIDYgU3RhcnQgQWRkcmVzcyBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgRE1BNl9DT05GSUcJCQkJMHhGRkMwMEQ4OAkvKiBETUEgQ2hhbm5lbCA2IENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIERNQTZfWF9DT1VOVAkJCTB4RkZDMDBEOTAJLyogRE1BIENoYW5uZWwgNiBYIENvdW50IFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgRE1BNl9YX01PRElGWQkJCTB4RkZDMDBEOTQJLyogRE1BIENoYW5uZWwgNiBYIE1vZGlmeSBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIERNQTZfWV9DT1VOVAkJCTB4RkZDMDBEOTgJLyogRE1BIENoYW5uZWwgNiBZIENvdW50IFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgRE1BNl9ZX01PRElGWQkJCTB4RkZDMDBEOUMJLyogRE1BIENoYW5uZWwgNiBZIE1vZGlmeSBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIERNQTZfQ1VSUl9ERVNDX1BUUgkJMHhGRkMwMERBMAkvKiBETUEgQ2hhbm5lbCA2IEN1cnJlbnQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyCSovCisjZGVmaW5lIERNQTZfQ1VSUl9BRERSCQkJMHhGRkMwMERBNAkvKiBETUEgQ2hhbm5lbCA2IEN1cnJlbnQgQWRkcmVzcyBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBETUE2X0lSUV9TVEFUVVMJCQkweEZGQzAwREE4CS8qIERNQSBDaGFubmVsIDYgSW50ZXJydXB0L1N0YXR1cyBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBETUE2X1BFUklQSEVSQUxfTUFQCQkweEZGQzAwREFDCS8qIERNQSBDaGFubmVsIDYgUGVyaXBoZXJhbCBNYXAgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgRE1BNl9DVVJSX1hfQ09VTlQJCTB4RkZDMDBEQjAJLyogRE1BIENoYW5uZWwgNiBDdXJyZW50IFggQ291bnQgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgRE1BNl9DVVJSX1lfQ09VTlQJCTB4RkZDMDBEQjgJLyogRE1BIENoYW5uZWwgNiBDdXJyZW50IFkgQ291bnQgUmVnaXN0ZXIJCQkJKi8KKworI2RlZmluZSBETUE3X05FWFRfREVTQ19QVFIJCTB4RkZDMDBEQzAJLyogRE1BIENoYW5uZWwgNyBOZXh0IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlcgkJKi8KKyNkZWZpbmUgRE1BN19TVEFSVF9BRERSCQkJMHhGRkMwMERDNAkvKiBETUEgQ2hhbm5lbCA3IFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIERNQTdfQ09ORklHCQkJCTB4RkZDMDBEQzgJLyogRE1BIENoYW5uZWwgNyBDb25maWd1cmF0aW9uIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBETUE3X1hfQ09VTlQJCQkweEZGQzAwREQwCS8qIERNQSBDaGFubmVsIDcgWCBDb3VudCBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIERNQTdfWF9NT0RJRlkJCQkweEZGQzAwREQ0CS8qIERNQSBDaGFubmVsIDcgWCBNb2RpZnkgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBETUE3X1lfQ09VTlQJCQkweEZGQzAwREQ4CS8qIERNQSBDaGFubmVsIDcgWSBDb3VudCBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIERNQTdfWV9NT0RJRlkJCQkweEZGQzAwRERDCS8qIERNQSBDaGFubmVsIDcgWSBNb2RpZnkgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBETUE3X0NVUlJfREVTQ19QVFIJCTB4RkZDMDBERTAJLyogRE1BIENoYW5uZWwgNyBDdXJyZW50IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlcgkqLworI2RlZmluZSBETUE3X0NVUlJfQUREUgkJCTB4RkZDMDBERTQJLyogRE1BIENoYW5uZWwgNyBDdXJyZW50IEFkZHJlc3MgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgRE1BN19JUlFfU1RBVFVTCQkJMHhGRkMwMERFOAkvKiBETUEgQ2hhbm5lbCA3IEludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgRE1BN19QRVJJUEhFUkFMX01BUAkJMHhGRkMwMERFQwkvKiBETUEgQ2hhbm5lbCA3IFBlcmlwaGVyYWwgTWFwIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIERNQTdfQ1VSUl9YX0NPVU5UCQkweEZGQzAwREYwCS8qIERNQSBDaGFubmVsIDcgQ3VycmVudCBYIENvdW50IFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIERNQTdfQ1VSUl9ZX0NPVU5UCQkweEZGQzAwREY4CS8qIERNQSBDaGFubmVsIDcgQ3VycmVudCBZIENvdW50IFJlZ2lzdGVyCQkJCSovCisKKyNkZWZpbmUgRE1BOF9ORVhUX0RFU0NfUFRSCQkweEZGQzAwRTAwCS8qIERNQSBDaGFubmVsIDggTmV4dCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIJCSovCisjZGVmaW5lIERNQThfU1RBUlRfQUREUgkJCTB4RkZDMDBFMDQJLyogRE1BIENoYW5uZWwgOCBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBETUE4X0NPTkZJRwkJCQkweEZGQzAwRTA4CS8qIERNQSBDaGFubmVsIDggQ29uZmlndXJhdGlvbiBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgRE1BOF9YX0NPVU5UCQkJMHhGRkMwMEUxMAkvKiBETUEgQ2hhbm5lbCA4IFggQ291bnQgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBETUE4X1hfTU9ESUZZCQkJMHhGRkMwMEUxNAkvKiBETUEgQ2hhbm5lbCA4IFggTW9kaWZ5IFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgRE1BOF9ZX0NPVU5UCQkJMHhGRkMwMEUxOAkvKiBETUEgQ2hhbm5lbCA4IFkgQ291bnQgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBETUE4X1lfTU9ESUZZCQkJMHhGRkMwMEUxQwkvKiBETUEgQ2hhbm5lbCA4IFkgTW9kaWZ5IFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgRE1BOF9DVVJSX0RFU0NfUFRSCQkweEZGQzAwRTIwCS8qIERNQSBDaGFubmVsIDggQ3VycmVudCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIJKi8KKyNkZWZpbmUgRE1BOF9DVVJSX0FERFIJCQkweEZGQzAwRTI0CS8qIERNQSBDaGFubmVsIDggQ3VycmVudCBBZGRyZXNzIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIERNQThfSVJRX1NUQVRVUwkJCTB4RkZDMDBFMjgJLyogRE1BIENoYW5uZWwgOCBJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIERNQThfUEVSSVBIRVJBTF9NQVAJCTB4RkZDMDBFMkMJLyogRE1BIENoYW5uZWwgOCBQZXJpcGhlcmFsIE1hcCBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBETUE4X0NVUlJfWF9DT1VOVAkJMHhGRkMwMEUzMAkvKiBETUEgQ2hhbm5lbCA4IEN1cnJlbnQgWCBDb3VudCBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBETUE4X0NVUlJfWV9DT1VOVAkJMHhGRkMwMEUzOAkvKiBETUEgQ2hhbm5lbCA4IEN1cnJlbnQgWSBDb3VudCBSZWdpc3RlcgkJCQkqLworCisjZGVmaW5lIERNQTlfTkVYVF9ERVNDX1BUUgkJMHhGRkMwMEU0MAkvKiBETUEgQ2hhbm5lbCA5IE5leHQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyCQkqLworI2RlZmluZSBETUE5X1NUQVJUX0FERFIJCQkweEZGQzAwRTQ0CS8qIERNQSBDaGFubmVsIDkgU3RhcnQgQWRkcmVzcyBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgRE1BOV9DT05GSUcJCQkJMHhGRkMwMEU0OAkvKiBETUEgQ2hhbm5lbCA5IENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIERNQTlfWF9DT1VOVAkJCTB4RkZDMDBFNTAJLyogRE1BIENoYW5uZWwgOSBYIENvdW50IFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgRE1BOV9YX01PRElGWQkJCTB4RkZDMDBFNTQJLyogRE1BIENoYW5uZWwgOSBYIE1vZGlmeSBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIERNQTlfWV9DT1VOVAkJCTB4RkZDMDBFNTgJLyogRE1BIENoYW5uZWwgOSBZIENvdW50IFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgRE1BOV9ZX01PRElGWQkJCTB4RkZDMDBFNUMJLyogRE1BIENoYW5uZWwgOSBZIE1vZGlmeSBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIERNQTlfQ1VSUl9ERVNDX1BUUgkJMHhGRkMwMEU2MAkvKiBETUEgQ2hhbm5lbCA5IEN1cnJlbnQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyCSovCisjZGVmaW5lIERNQTlfQ1VSUl9BRERSCQkJMHhGRkMwMEU2NAkvKiBETUEgQ2hhbm5lbCA5IEN1cnJlbnQgQWRkcmVzcyBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBETUE5X0lSUV9TVEFUVVMJCQkweEZGQzAwRTY4CS8qIERNQSBDaGFubmVsIDkgSW50ZXJydXB0L1N0YXR1cyBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBETUE5X1BFUklQSEVSQUxfTUFQCQkweEZGQzAwRTZDCS8qIERNQSBDaGFubmVsIDkgUGVyaXBoZXJhbCBNYXAgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgRE1BOV9DVVJSX1hfQ09VTlQJCTB4RkZDMDBFNzAJLyogRE1BIENoYW5uZWwgOSBDdXJyZW50IFggQ291bnQgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgRE1BOV9DVVJSX1lfQ09VTlQJCTB4RkZDMDBFNzgJLyogRE1BIENoYW5uZWwgOSBDdXJyZW50IFkgQ291bnQgUmVnaXN0ZXIJCQkJKi8KKworI2RlZmluZSBETUExMF9ORVhUX0RFU0NfUFRSCQkweEZGQzAwRTgwCS8qIERNQSBDaGFubmVsIDEwIE5leHQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyCQkqLworI2RlZmluZSBETUExMF9TVEFSVF9BRERSCQkweEZGQzAwRTg0CS8qIERNQSBDaGFubmVsIDEwIFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgRE1BMTBfQ09ORklHCQkJMHhGRkMwMEU4OAkvKiBETUEgQ2hhbm5lbCAxMCBDb25maWd1cmF0aW9uIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIERNQTEwX1hfQ09VTlQJCQkweEZGQzAwRTkwCS8qIERNQSBDaGFubmVsIDEwIFggQ291bnQgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBETUExMF9YX01PRElGWQkJCTB4RkZDMDBFOTQJLyogRE1BIENoYW5uZWwgMTAgWCBNb2RpZnkgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBETUExMF9ZX0NPVU5UCQkJMHhGRkMwMEU5OAkvKiBETUEgQ2hhbm5lbCAxMCBZIENvdW50IFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgRE1BMTBfWV9NT0RJRlkJCQkweEZGQzAwRTlDCS8qIERNQSBDaGFubmVsIDEwIFkgTW9kaWZ5IFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgRE1BMTBfQ1VSUl9ERVNDX1BUUgkJMHhGRkMwMEVBMAkvKiBETUEgQ2hhbm5lbCAxMCBDdXJyZW50IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlcgkqLworI2RlZmluZSBETUExMF9DVVJSX0FERFIJCQkweEZGQzAwRUE0CS8qIERNQSBDaGFubmVsIDEwIEN1cnJlbnQgQWRkcmVzcyBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBETUExMF9JUlFfU1RBVFVTCQkweEZGQzAwRUE4CS8qIERNQSBDaGFubmVsIDEwIEludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgRE1BMTBfUEVSSVBIRVJBTF9NQVAJMHhGRkMwMEVBQwkvKiBETUEgQ2hhbm5lbCAxMCBQZXJpcGhlcmFsIE1hcCBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBETUExMF9DVVJSX1hfQ09VTlQJCTB4RkZDMDBFQjAJLyogRE1BIENoYW5uZWwgMTAgQ3VycmVudCBYIENvdW50IFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIERNQTEwX0NVUlJfWV9DT1VOVAkJMHhGRkMwMEVCOAkvKiBETUEgQ2hhbm5lbCAxMCBDdXJyZW50IFkgQ291bnQgUmVnaXN0ZXIJCQkJKi8KKworI2RlZmluZSBETUExMV9ORVhUX0RFU0NfUFRSCQkweEZGQzAwRUMwCS8qIERNQSBDaGFubmVsIDExIE5leHQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyCQkqLworI2RlZmluZSBETUExMV9TVEFSVF9BRERSCQkweEZGQzAwRUM0CS8qIERNQSBDaGFubmVsIDExIFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgRE1BMTFfQ09ORklHCQkJMHhGRkMwMEVDOAkvKiBETUEgQ2hhbm5lbCAxMSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIERNQTExX1hfQ09VTlQJCQkweEZGQzAwRUQwCS8qIERNQSBDaGFubmVsIDExIFggQ291bnQgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBETUExMV9YX01PRElGWQkJCTB4RkZDMDBFRDQJLyogRE1BIENoYW5uZWwgMTEgWCBNb2RpZnkgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBETUExMV9ZX0NPVU5UCQkJMHhGRkMwMEVEOAkvKiBETUEgQ2hhbm5lbCAxMSBZIENvdW50IFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgRE1BMTFfWV9NT0RJRlkJCQkweEZGQzAwRURDCS8qIERNQSBDaGFubmVsIDExIFkgTW9kaWZ5IFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgRE1BMTFfQ1VSUl9ERVNDX1BUUgkJMHhGRkMwMEVFMAkvKiBETUEgQ2hhbm5lbCAxMSBDdXJyZW50IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlcgkqLworI2RlZmluZSBETUExMV9DVVJSX0FERFIJCQkweEZGQzAwRUU0CS8qIERNQSBDaGFubmVsIDExIEN1cnJlbnQgQWRkcmVzcyBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBETUExMV9JUlFfU1RBVFVTCQkweEZGQzAwRUU4CS8qIERNQSBDaGFubmVsIDExIEludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgRE1BMTFfUEVSSVBIRVJBTF9NQVAJMHhGRkMwMEVFQwkvKiBETUEgQ2hhbm5lbCAxMSBQZXJpcGhlcmFsIE1hcCBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBETUExMV9DVVJSX1hfQ09VTlQJCTB4RkZDMDBFRjAJLyogRE1BIENoYW5uZWwgMTEgQ3VycmVudCBYIENvdW50IFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIERNQTExX0NVUlJfWV9DT1VOVAkJMHhGRkMwMEVGOAkvKiBETUEgQ2hhbm5lbCAxMSBDdXJyZW50IFkgQ291bnQgUmVnaXN0ZXIJCQkJKi8KKworI2RlZmluZSBNRE1BX0QwX05FWFRfREVTQ19QVFIJMHhGRkMwMEYwMAkvKiBNZW1ETUEgU3RyZWFtIDAgRGVzdGluYXRpb24gTmV4dCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIJCSovCisjZGVmaW5lIE1ETUFfRDBfU1RBUlRfQUREUgkJMHhGRkMwMEYwNAkvKiBNZW1ETUEgU3RyZWFtIDAgRGVzdGluYXRpb24gU3RhcnQgQWRkcmVzcyBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBNRE1BX0QwX0NPTkZJRwkJCTB4RkZDMDBGMDgJLyogTWVtRE1BIFN0cmVhbSAwIERlc3RpbmF0aW9uIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgTURNQV9EMF9YX0NPVU5UCQkJMHhGRkMwMEYxMAkvKiBNZW1ETUEgU3RyZWFtIDAgRGVzdGluYXRpb24gWCBDb3VudCBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIE1ETUFfRDBfWF9NT0RJRlkJCTB4RkZDMDBGMTQJLyogTWVtRE1BIFN0cmVhbSAwIERlc3RpbmF0aW9uIFggTW9kaWZ5IFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBNRE1BX0QwX1lfQ09VTlQJCQkweEZGQzAwRjE4CS8qIE1lbURNQSBTdHJlYW0gMCBEZXN0aW5hdGlvbiBZIENvdW50IFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgTURNQV9EMF9ZX01PRElGWQkJMHhGRkMwMEYxQwkvKiBNZW1ETUEgU3RyZWFtIDAgRGVzdGluYXRpb24gWSBNb2RpZnkgUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIE1ETUFfRDBfQ1VSUl9ERVNDX1BUUgkweEZGQzAwRjIwCS8qIE1lbURNQSBTdHJlYW0gMCBEZXN0aW5hdGlvbiBDdXJyZW50IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlcgkqLworI2RlZmluZSBNRE1BX0QwX0NVUlJfQUREUgkJMHhGRkMwMEYyNAkvKiBNZW1ETUEgU3RyZWFtIDAgRGVzdGluYXRpb24gQ3VycmVudCBBZGRyZXNzIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIE1ETUFfRDBfSVJRX1NUQVRVUwkJMHhGRkMwMEYyOAkvKiBNZW1ETUEgU3RyZWFtIDAgRGVzdGluYXRpb24gSW50ZXJydXB0L1N0YXR1cyBSZWdpc3RlcgkJCSovCisjZGVmaW5lIE1ETUFfRDBfUEVSSVBIRVJBTF9NQVAJMHhGRkMwMEYyQwkvKiBNZW1ETUEgU3RyZWFtIDAgRGVzdGluYXRpb24gUGVyaXBoZXJhbCBNYXAgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgTURNQV9EMF9DVVJSX1hfQ09VTlQJMHhGRkMwMEYzMAkvKiBNZW1ETUEgU3RyZWFtIDAgRGVzdGluYXRpb24gQ3VycmVudCBYIENvdW50IFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIE1ETUFfRDBfQ1VSUl9ZX0NPVU5UCTB4RkZDMDBGMzgJLyogTWVtRE1BIFN0cmVhbSAwIERlc3RpbmF0aW9uIEN1cnJlbnQgWSBDb3VudCBSZWdpc3RlcgkJCQkqLworCisjZGVmaW5lIE1ETUFfUzBfTkVYVF9ERVNDX1BUUgkweEZGQzAwRjQwCS8qIE1lbURNQSBTdHJlYW0gMCBTb3VyY2UgTmV4dCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIJCQkqLworI2RlZmluZSBNRE1BX1MwX1NUQVJUX0FERFIJCTB4RkZDMDBGNDQJLyogTWVtRE1BIFN0cmVhbSAwIFNvdXJjZSBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBNRE1BX1MwX0NPTkZJRwkJCTB4RkZDMDBGNDgJLyogTWVtRE1BIFN0cmVhbSAwIFNvdXJjZSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBNRE1BX1MwX1hfQ09VTlQJCQkweEZGQzAwRjUwCS8qIE1lbURNQSBTdHJlYW0gMCBTb3VyY2UgWCBDb3VudCBSZWdpc3RlcgkJCQkJCQkqLworI2RlZmluZSBNRE1BX1MwX1hfTU9ESUZZCQkweEZGQzAwRjU0CS8qIE1lbURNQSBTdHJlYW0gMCBTb3VyY2UgWCBNb2RpZnkgUmVnaXN0ZXIJCQkJCQkJKi8KKyNkZWZpbmUgTURNQV9TMF9ZX0NPVU5UCQkJMHhGRkMwMEY1OAkvKiBNZW1ETUEgU3RyZWFtIDAgU291cmNlIFkgQ291bnQgUmVnaXN0ZXIJCQkJCQkJKi8KKyNkZWZpbmUgTURNQV9TMF9ZX01PRElGWQkJMHhGRkMwMEY1QwkvKiBNZW1ETUEgU3RyZWFtIDAgU291cmNlIFkgTW9kaWZ5IFJlZ2lzdGVyCQkJCQkJCSovCisjZGVmaW5lIE1ETUFfUzBfQ1VSUl9ERVNDX1BUUgkweEZGQzAwRjYwCS8qIE1lbURNQSBTdHJlYW0gMCBTb3VyY2UgQ3VycmVudCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIJCSovCisjZGVmaW5lIE1ETUFfUzBfQ1VSUl9BRERSCQkweEZGQzAwRjY0CS8qIE1lbURNQSBTdHJlYW0gMCBTb3VyY2UgQ3VycmVudCBBZGRyZXNzIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBNRE1BX1MwX0lSUV9TVEFUVVMJCTB4RkZDMDBGNjgJLyogTWVtRE1BIFN0cmVhbSAwIFNvdXJjZSBJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBNRE1BX1MwX1BFUklQSEVSQUxfTUFQCTB4RkZDMDBGNkMJLyogTWVtRE1BIFN0cmVhbSAwIFNvdXJjZSBQZXJpcGhlcmFsIE1hcCBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgTURNQV9TMF9DVVJSX1hfQ09VTlQJMHhGRkMwMEY3MAkvKiBNZW1ETUEgU3RyZWFtIDAgU291cmNlIEN1cnJlbnQgWCBDb3VudCBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgTURNQV9TMF9DVVJSX1lfQ09VTlQJMHhGRkMwMEY3OAkvKiBNZW1ETUEgU3RyZWFtIDAgU291cmNlIEN1cnJlbnQgWSBDb3VudCBSZWdpc3RlcgkJCQkJKi8KKworI2RlZmluZSBNRE1BX0QxX05FWFRfREVTQ19QVFIJMHhGRkMwMEY4MAkvKiBNZW1ETUEgU3RyZWFtIDEgRGVzdGluYXRpb24gTmV4dCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIJCSovCisjZGVmaW5lIE1ETUFfRDFfU1RBUlRfQUREUgkJMHhGRkMwMEY4NAkvKiBNZW1ETUEgU3RyZWFtIDEgRGVzdGluYXRpb24gU3RhcnQgQWRkcmVzcyBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBNRE1BX0QxX0NPTkZJRwkJCTB4RkZDMDBGODgJLyogTWVtRE1BIFN0cmVhbSAxIERlc3RpbmF0aW9uIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgTURNQV9EMV9YX0NPVU5UCQkJMHhGRkMwMEY5MAkvKiBNZW1ETUEgU3RyZWFtIDEgRGVzdGluYXRpb24gWCBDb3VudCBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIE1ETUFfRDFfWF9NT0RJRlkJCTB4RkZDMDBGOTQJLyogTWVtRE1BIFN0cmVhbSAxIERlc3RpbmF0aW9uIFggTW9kaWZ5IFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBNRE1BX0QxX1lfQ09VTlQJCQkweEZGQzAwRjk4CS8qIE1lbURNQSBTdHJlYW0gMSBEZXN0aW5hdGlvbiBZIENvdW50IFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgTURNQV9EMV9ZX01PRElGWQkJMHhGRkMwMEY5QwkvKiBNZW1ETUEgU3RyZWFtIDEgRGVzdGluYXRpb24gWSBNb2RpZnkgUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIE1ETUFfRDFfQ1VSUl9ERVNDX1BUUgkweEZGQzAwRkEwCS8qIE1lbURNQSBTdHJlYW0gMSBEZXN0aW5hdGlvbiBDdXJyZW50IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlcgkqLworI2RlZmluZSBNRE1BX0QxX0NVUlJfQUREUgkJMHhGRkMwMEZBNAkvKiBNZW1ETUEgU3RyZWFtIDEgRGVzdGluYXRpb24gQ3VycmVudCBBZGRyZXNzIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIE1ETUFfRDFfSVJRX1NUQVRVUwkJMHhGRkMwMEZBOAkvKiBNZW1ETUEgU3RyZWFtIDEgRGVzdGluYXRpb24gSW50ZXJydXB0L1N0YXR1cyBSZWdpc3RlcgkJCSovCisjZGVmaW5lIE1ETUFfRDFfUEVSSVBIRVJBTF9NQVAJMHhGRkMwMEZBQwkvKiBNZW1ETUEgU3RyZWFtIDEgRGVzdGluYXRpb24gUGVyaXBoZXJhbCBNYXAgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgTURNQV9EMV9DVVJSX1hfQ09VTlQJMHhGRkMwMEZCMAkvKiBNZW1ETUEgU3RyZWFtIDEgRGVzdGluYXRpb24gQ3VycmVudCBYIENvdW50IFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIE1ETUFfRDFfQ1VSUl9ZX0NPVU5UCTB4RkZDMDBGQjgJLyogTWVtRE1BIFN0cmVhbSAxIERlc3RpbmF0aW9uIEN1cnJlbnQgWSBDb3VudCBSZWdpc3RlcgkJCQkqLworCisjZGVmaW5lIE1ETUFfUzFfTkVYVF9ERVNDX1BUUgkweEZGQzAwRkMwCS8qIE1lbURNQSBTdHJlYW0gMSBTb3VyY2UgTmV4dCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIJCQkqLworI2RlZmluZSBNRE1BX1MxX1NUQVJUX0FERFIJCTB4RkZDMDBGQzQJLyogTWVtRE1BIFN0cmVhbSAxIFNvdXJjZSBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBNRE1BX1MxX0NPTkZJRwkJCTB4RkZDMDBGQzgJLyogTWVtRE1BIFN0cmVhbSAxIFNvdXJjZSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBNRE1BX1MxX1hfQ09VTlQJCQkweEZGQzAwRkQwCS8qIE1lbURNQSBTdHJlYW0gMSBTb3VyY2UgWCBDb3VudCBSZWdpc3RlcgkJCQkJCQkqLworI2RlZmluZSBNRE1BX1MxX1hfTU9ESUZZCQkweEZGQzAwRkQ0CS8qIE1lbURNQSBTdHJlYW0gMSBTb3VyY2UgWCBNb2RpZnkgUmVnaXN0ZXIJCQkJCQkJKi8KKyNkZWZpbmUgTURNQV9TMV9ZX0NPVU5UCQkJMHhGRkMwMEZEOAkvKiBNZW1ETUEgU3RyZWFtIDEgU291cmNlIFkgQ291bnQgUmVnaXN0ZXIJCQkJCQkJKi8KKyNkZWZpbmUgTURNQV9TMV9ZX01PRElGWQkJMHhGRkMwMEZEQwkvKiBNZW1ETUEgU3RyZWFtIDEgU291cmNlIFkgTW9kaWZ5IFJlZ2lzdGVyCQkJCQkJCSovCisjZGVmaW5lIE1ETUFfUzFfQ1VSUl9ERVNDX1BUUgkweEZGQzAwRkUwCS8qIE1lbURNQSBTdHJlYW0gMSBTb3VyY2UgQ3VycmVudCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIJCSovCisjZGVmaW5lIE1ETUFfUzFfQ1VSUl9BRERSCQkweEZGQzAwRkU0CS8qIE1lbURNQSBTdHJlYW0gMSBTb3VyY2UgQ3VycmVudCBBZGRyZXNzIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBNRE1BX1MxX0lSUV9TVEFUVVMJCTB4RkZDMDBGRTgJLyogTWVtRE1BIFN0cmVhbSAxIFNvdXJjZSBJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBNRE1BX1MxX1BFUklQSEVSQUxfTUFQCTB4RkZDMDBGRUMJLyogTWVtRE1BIFN0cmVhbSAxIFNvdXJjZSBQZXJpcGhlcmFsIE1hcCBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgTURNQV9TMV9DVVJSX1hfQ09VTlQJMHhGRkMwMEZGMAkvKiBNZW1ETUEgU3RyZWFtIDEgU291cmNlIEN1cnJlbnQgWCBDb3VudCBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgTURNQV9TMV9DVVJSX1lfQ09VTlQJMHhGRkMwMEZGOAkvKiBNZW1ETUEgU3RyZWFtIDEgU291cmNlIEN1cnJlbnQgWSBDb3VudCBSZWdpc3RlcgkJCQkJKi8KKworCisvKiBQYXJhbGxlbCBQZXJpcGhlcmFsIEludGVyZmFjZSAoMHhGRkMwMTAwMCAtIDB4RkZDMDEwRkYpCQkJCSovCisjZGVmaW5lIFBQSV9DT05UUk9MCQkJMHhGRkMwMTAwMAkvKiBQUEkgQ29udHJvbCBSZWdpc3RlcgkJCSovCisjZGVmaW5lIFBQSV9TVEFUVVMJCQkweEZGQzAxMDA0CS8qIFBQSSBTdGF0dXMgUmVnaXN0ZXIJCQkqLworI2RlZmluZSBQUElfQ09VTlQJCQkweEZGQzAxMDA4CS8qIFBQSSBUcmFuc2ZlciBDb3VudCBSZWdpc3RlcgkqLworI2RlZmluZSBQUElfREVMQVkJCQkweEZGQzAxMDBDCS8qIFBQSSBEZWxheSBDb3VudCBSZWdpc3RlcgkJKi8KKyNkZWZpbmUgUFBJX0ZSQU1FCQkJMHhGRkMwMTAxMAkvKiBQUEkgRnJhbWUgTGVuZ3RoIFJlZ2lzdGVyCSovCisKKworLyogVHdvLVdpcmUgSW50ZXJmYWNlCQkoMHhGRkMwMTQwMCAtIDB4RkZDMDE0RkYpCQkJCQkJCQkqLworI2RlZmluZSBUV0kwX1JFR0JBU0UJCQkweEZGQzAxNDAwCisjZGVmaW5lIFRXSV9DTEtESVYJCQkweEZGQzAxNDAwCS8qIFNlcmlhbCBDbG9jayBEaXZpZGVyIFJlZ2lzdGVyCQkJKi8KKyNkZWZpbmUgVFdJX0NPTlRST0wJCQkweEZGQzAxNDA0CS8qIFRXSSBDb250cm9sIFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgVFdJX1NMQVZFX0NUTAkJMHhGRkMwMTQwOAkvKiBTbGF2ZSBNb2RlIENvbnRyb2wgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgVFdJX1NMQVZFX1NUQVQJCTB4RkZDMDE0MEMJLyogU2xhdmUgTW9kZSBTdGF0dXMgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgVFdJX1NMQVZFX0FERFIJCTB4RkZDMDE0MTAJLyogU2xhdmUgTW9kZSBBZGRyZXNzIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIFRXSV9NQVNURVJfQ1RMCQkweEZGQzAxNDE0CS8qIE1hc3RlciBNb2RlIENvbnRyb2wgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgVFdJX01BU1RFUl9TVEFUCQkweEZGQzAxNDE4CS8qIE1hc3RlciBNb2RlIFN0YXR1cyBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBUV0lfTUFTVEVSX0FERFIJCTB4RkZDMDE0MUMJLyogTWFzdGVyIE1vZGUgQWRkcmVzcyBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBUV0lfSU5UX1NUQVQJCTB4RkZDMDE0MjAJLyogVFdJIEludGVycnVwdCBTdGF0dXMgUmVnaXN0ZXIJCQkqLworI2RlZmluZSBUV0lfSU5UX01BU0sJCTB4RkZDMDE0MjQJLyogVFdJIE1hc3RlciBJbnRlcnJ1cHQgTWFzayBSZWdpc3RlcgkJKi8KKyNkZWZpbmUgVFdJX0ZJRk9fQ1RMCQkweEZGQzAxNDI4CS8qIEZJRk8gQ29udHJvbCBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgVFdJX0ZJRk9fU1RBVAkJMHhGRkMwMTQyQwkvKiBGSUZPIFN0YXR1cyBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIFRXSV9YTVRfREFUQTgJCTB4RkZDMDE0ODAJLyogRklGTyBUcmFuc21pdCBEYXRhIFNpbmdsZSBCeXRlIFJlZ2lzdGVyCSovCisjZGVmaW5lIFRXSV9YTVRfREFUQTE2CQkweEZGQzAxNDg0CS8qIEZJRk8gVHJhbnNtaXQgRGF0YSBEb3VibGUgQnl0ZSBSZWdpc3RlcgkqLworI2RlZmluZSBUV0lfUkNWX0RBVEE4CQkweEZGQzAxNDg4CS8qIEZJRk8gUmVjZWl2ZSBEYXRhIFNpbmdsZSBCeXRlIFJlZ2lzdGVyCSovCisjZGVmaW5lIFRXSV9SQ1ZfREFUQTE2CQkweEZGQzAxNDhDCS8qIEZJRk8gUmVjZWl2ZSBEYXRhIERvdWJsZSBCeXRlIFJlZ2lzdGVyCSovCisKKworLyogR2VuZXJhbCBQdXJwb3NlIEkvTyBQb3J0IEcgKDB4RkZDMDE1MDAgLSAweEZGQzAxNUZGKQkJCQkJCQkJCQkJCSovCisjZGVmaW5lIFBPUlRHSU8JCQkJCTB4RkZDMDE1MDAJLyogUG9ydCBHIEkvTyBQaW4gU3RhdGUgU3BlY2lmeSBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBQT1JUR0lPX0NMRUFSCQkJMHhGRkMwMTUwNAkvKiBQb3J0IEcgSS9PIFBlcmlwaGVyYWwgSW50ZXJydXB0IENsZWFyIFJlZ2lzdGVyCQkqLworI2RlZmluZSBQT1JUR0lPX1NFVAkJCQkweEZGQzAxNTA4CS8qIFBvcnQgRyBJL08gUGVyaXBoZXJhbCBJbnRlcnJ1cHQgU2V0IFJlZ2lzdGVyCQkJKi8KKyNkZWZpbmUgUE9SVEdJT19UT0dHTEUJCQkweEZGQzAxNTBDCS8qIFBvcnQgRyBJL08gUGluIFN0YXRlIFRvZ2dsZSBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgUE9SVEdJT19NQVNLQQkJCTB4RkZDMDE1MTAJLyogUG9ydCBHIEkvTyBNYXNrIFN0YXRlIFNwZWNpZnkgSW50ZXJydXB0IEEgUmVnaXN0ZXIJKi8KKyNkZWZpbmUgUE9SVEdJT19NQVNLQV9DTEVBUgkJMHhGRkMwMTUxNAkvKiBQb3J0IEcgSS9PIE1hc2sgRGlzYWJsZSBJbnRlcnJ1cHQgQSBSZWdpc3RlcgkJCSovCisjZGVmaW5lIFBPUlRHSU9fTUFTS0FfU0VUCQkweEZGQzAxNTE4CS8qIFBvcnQgRyBJL08gTWFzayBFbmFibGUgSW50ZXJydXB0IEEgUmVnaXN0ZXIJCQkqLworI2RlZmluZSBQT1JUR0lPX01BU0tBX1RPR0dMRQkweEZGQzAxNTFDCS8qIFBvcnQgRyBJL08gTWFzayBUb2dnbGUgRW5hYmxlIEludGVycnVwdCBBIFJlZ2lzdGVyCSovCisjZGVmaW5lIFBPUlRHSU9fTUFTS0IJCQkweEZGQzAxNTIwCS8qIFBvcnQgRyBJL08gTWFzayBTdGF0ZSBTcGVjaWZ5IEludGVycnVwdCBCIFJlZ2lzdGVyCSovCisjZGVmaW5lIFBPUlRHSU9fTUFTS0JfQ0xFQVIJCTB4RkZDMDE1MjQJLyogUG9ydCBHIEkvTyBNYXNrIERpc2FibGUgSW50ZXJydXB0IEIgUmVnaXN0ZXIJCQkqLworI2RlZmluZSBQT1JUR0lPX01BU0tCX1NFVAkJMHhGRkMwMTUyOAkvKiBQb3J0IEcgSS9PIE1hc2sgRW5hYmxlIEludGVycnVwdCBCIFJlZ2lzdGVyCQkJKi8KKyNkZWZpbmUgUE9SVEdJT19NQVNLQl9UT0dHTEUJMHhGRkMwMTUyQwkvKiBQb3J0IEcgSS9PIE1hc2sgVG9nZ2xlIEVuYWJsZSBJbnRlcnJ1cHQgQiBSZWdpc3RlcgkqLworI2RlZmluZSBQT1JUR0lPX0RJUgkJCQkweEZGQzAxNTMwCS8qIFBvcnQgRyBJL08gRGlyZWN0aW9uIFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgUE9SVEdJT19QT0xBUgkJCTB4RkZDMDE1MzQJLyogUG9ydCBHIEkvTyBTb3VyY2UgUG9sYXJpdHkgUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIFBPUlRHSU9fRURHRQkJCTB4RkZDMDE1MzgJLyogUG9ydCBHIEkvTyBTb3VyY2UgU2Vuc2l0aXZpdHkgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgUE9SVEdJT19CT1RICQkJMHhGRkMwMTUzQwkvKiBQb3J0IEcgSS9PIFNldCBvbiBCT1RIIEVkZ2VzIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIFBPUlRHSU9fSU5FTgkJCTB4RkZDMDE1NDAJLyogUG9ydCBHIEkvTyBJbnB1dCBFbmFibGUgUmVnaXN0ZXIJCQkJCQkqLworCisKKy8qIEdlbmVyYWwgUHVycG9zZSBJL08gUG9ydCBIICgweEZGQzAxNzAwIC0gMHhGRkMwMTdGRikJCQkJCQkJCQkJCQkqLworI2RlZmluZSBQT1JUSElPCQkJCQkweEZGQzAxNzAwCS8qIFBvcnQgSCBJL08gUGluIFN0YXRlIFNwZWNpZnkgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgUE9SVEhJT19DTEVBUgkJCTB4RkZDMDE3MDQJLyogUG9ydCBIIEkvTyBQZXJpcGhlcmFsIEludGVycnVwdCBDbGVhciBSZWdpc3RlcgkJKi8KKyNkZWZpbmUgUE9SVEhJT19TRVQJCQkJMHhGRkMwMTcwOAkvKiBQb3J0IEggSS9PIFBlcmlwaGVyYWwgSW50ZXJydXB0IFNldCBSZWdpc3RlcgkJCSovCisjZGVmaW5lIFBPUlRISU9fVE9HR0xFCQkJMHhGRkMwMTcwQwkvKiBQb3J0IEggSS9PIFBpbiBTdGF0ZSBUb2dnbGUgUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIFBPUlRISU9fTUFTS0EJCQkweEZGQzAxNzEwCS8qIFBvcnQgSCBJL08gTWFzayBTdGF0ZSBTcGVjaWZ5IEludGVycnVwdCBBIFJlZ2lzdGVyCSovCisjZGVmaW5lIFBPUlRISU9fTUFTS0FfQ0xFQVIJCTB4RkZDMDE3MTQJLyogUG9ydCBIIEkvTyBNYXNrIERpc2FibGUgSW50ZXJydXB0IEEgUmVnaXN0ZXIJCQkqLworI2RlZmluZSBQT1JUSElPX01BU0tBX1NFVAkJMHhGRkMwMTcxOAkvKiBQb3J0IEggSS9PIE1hc2sgRW5hYmxlIEludGVycnVwdCBBIFJlZ2lzdGVyCQkJKi8KKyNkZWZpbmUgUE9SVEhJT19NQVNLQV9UT0dHTEUJMHhGRkMwMTcxQwkvKiBQb3J0IEggSS9PIE1hc2sgVG9nZ2xlIEVuYWJsZSBJbnRlcnJ1cHQgQSBSZWdpc3RlcgkqLworI2RlZmluZSBQT1JUSElPX01BU0tCCQkJMHhGRkMwMTcyMAkvKiBQb3J0IEggSS9PIE1hc2sgU3RhdGUgU3BlY2lmeSBJbnRlcnJ1cHQgQiBSZWdpc3RlcgkqLworI2RlZmluZSBQT1JUSElPX01BU0tCX0NMRUFSCQkweEZGQzAxNzI0CS8qIFBvcnQgSCBJL08gTWFzayBEaXNhYmxlIEludGVycnVwdCBCIFJlZ2lzdGVyCQkJKi8KKyNkZWZpbmUgUE9SVEhJT19NQVNLQl9TRVQJCTB4RkZDMDE3MjgJLyogUG9ydCBIIEkvTyBNYXNrIEVuYWJsZSBJbnRlcnJ1cHQgQiBSZWdpc3RlcgkJCSovCisjZGVmaW5lIFBPUlRISU9fTUFTS0JfVE9HR0xFCTB4RkZDMDE3MkMJLyogUG9ydCBIIEkvTyBNYXNrIFRvZ2dsZSBFbmFibGUgSW50ZXJydXB0IEIgUmVnaXN0ZXIJKi8KKyNkZWZpbmUgUE9SVEhJT19ESVIJCQkJMHhGRkMwMTczMAkvKiBQb3J0IEggSS9PIERpcmVjdGlvbiBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIFBPUlRISU9fUE9MQVIJCQkweEZGQzAxNzM0CS8qIFBvcnQgSCBJL08gU291cmNlIFBvbGFyaXR5IFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBQT1JUSElPX0VER0UJCQkweEZGQzAxNzM4CS8qIFBvcnQgSCBJL08gU291cmNlIFNlbnNpdGl2aXR5IFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIFBPUlRISU9fQk9USAkJCTB4RkZDMDE3M0MJLyogUG9ydCBIIEkvTyBTZXQgb24gQk9USCBFZGdlcyBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBQT1JUSElPX0lORU4JCQkweEZGQzAxNzQwCS8qIFBvcnQgSCBJL08gSW5wdXQgRW5hYmxlIFJlZ2lzdGVyCQkJCQkJKi8KKworCisvKiBVQVJUMSBDb250cm9sbGVyCQkoMHhGRkMwMjAwMCAtIDB4RkZDMDIwRkYpCQkJCQkJCQkqLworI2RlZmluZSBVQVJUMV9USFIJCQkweEZGQzAyMDAwCS8qIFRyYW5zbWl0IEhvbGRpbmcgcmVnaXN0ZXIJCQkqLworI2RlZmluZSBVQVJUMV9SQlIJCQkweEZGQzAyMDAwCS8qIFJlY2VpdmUgQnVmZmVyIHJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIFVBUlQxX0RMTAkJCTB4RkZDMDIwMDAJLyogRGl2aXNvciBMYXRjaCAoTG93LUJ5dGUpCQkJCSovCisjZGVmaW5lIFVBUlQxX0lFUgkJCTB4RkZDMDIwMDQJLyogSW50ZXJydXB0IEVuYWJsZSBSZWdpc3RlcgkJCSovCisjZGVmaW5lIFVBUlQxX0RMSAkJCTB4RkZDMDIwMDQJLyogRGl2aXNvciBMYXRjaCAoSGlnaC1CeXRlKQkJCSovCisjZGVmaW5lIFVBUlQxX0lJUgkJCTB4RkZDMDIwMDgJLyogSW50ZXJydXB0IElkZW50aWZpY2F0aW9uIFJlZ2lzdGVyCSovCisjZGVmaW5lIFVBUlQxX0xDUgkJCTB4RkZDMDIwMEMJLyogTGluZSBDb250cm9sIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIFVBUlQxX01DUgkJCTB4RkZDMDIwMTAJLyogTW9kZW0gQ29udHJvbCBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBVQVJUMV9MU1IJCQkweEZGQzAyMDE0CS8qIExpbmUgU3RhdHVzIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBVQVJUMV9NU1IJCQkweEZGQzAyMDE4CS8qIE1vZGVtIFN0YXR1cyBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBVQVJUMV9TQ1IJCQkweEZGQzAyMDFDCS8qIFNDUiBTY3JhdGNoIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBVQVJUMV9HQ1RMCQkJMHhGRkMwMjAyNAkvKiBHbG9iYWwgQ29udHJvbCBSZWdpc3RlcgkJCQkqLworCisKKy8qIFBpbiBDb250cm9sIFJlZ2lzdGVycwkoMHhGRkMwMzIwMCAtIDB4RkZDMDMyRkYpCQkJCQkJCQkJCQkqLworI2RlZmluZSBQT1JURl9GRVIJCQkweEZGQzAzMjAwCS8qIFBvcnQgRiBGdW5jdGlvbiBFbmFibGUgUmVnaXN0ZXIgKEFsdGVybmF0ZS9GbGFnKikJKi8KKyNkZWZpbmUgUE9SVEdfRkVSCQkJMHhGRkMwMzIwNAkvKiBQb3J0IEcgRnVuY3Rpb24gRW5hYmxlIFJlZ2lzdGVyIChBbHRlcm5hdGUvRmxhZyopCSovCisjZGVmaW5lIFBPUlRIX0ZFUgkJCTB4RkZDMDMyMDgJLyogUG9ydCBIIEZ1bmN0aW9uIEVuYWJsZSBSZWdpc3RlciAoQWx0ZXJuYXRlL0ZsYWcqKQkqLworI2RlZmluZSBCRklOX1BPUlRfTVVYCQkJMHhGRkMwMzIwQwkvKiBQb3J0IE11bHRpcGxleGVyIENvbnRyb2wgUmVnaXN0ZXIJCQkJCSovCisKKworLyogSGFuZHNoYWtlIE1ETUEgUmVnaXN0ZXJzCSgweEZGQzAzMzAwIC0gMHhGRkMwMzNGRikJCQkJCQkJCQkJKi8KKyNkZWZpbmUgSE1ETUEwX0NPTlRST0wJCTB4RkZDMDMzMDAJLyogSGFuZHNoYWtlIE1ETUEwIENvbnRyb2wgUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIEhNRE1BMF9FQ0lOSVQJCTB4RkZDMDMzMDQJLyogSE1ETUEwIEluaXRpYWwgRWRnZSBDb3VudCBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBITURNQTBfQkNJTklUCQkweEZGQzAzMzA4CS8qIEhNRE1BMCBJbml0aWFsIEJsb2NrIENvdW50IFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIEhNRE1BMF9FQ1VSR0VOVAkJMHhGRkMwMzMwQwkvKiBITURNQTAgVXJnZW50IEVkZ2UgQ291bnQgVGhyZXNoaG9sZCBSZWdpc3RlcgkJKi8KKyNkZWZpbmUgSE1ETUEwX0VDT1ZFUkZMT1cJMHhGRkMwMzMxMAkvKiBITURNQTAgRWRnZSBDb3VudCBPdmVyZmxvdyBJbnRlcnJ1cHQgUmVnaXN0ZXIJKi8KKyNkZWZpbmUgSE1ETUEwX0VDT1VOVAkJMHhGRkMwMzMxNAkvKiBITURNQTAgQ3VycmVudCBFZGdlIENvdW50IFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIEhNRE1BMF9CQ09VTlQJCTB4RkZDMDMzMTgJLyogSE1ETUEwIEN1cnJlbnQgQmxvY2sgQ291bnQgUmVnaXN0ZXIJCQkJKi8KKworI2RlZmluZSBITURNQTFfQ09OVFJPTAkJMHhGRkMwMzM0MAkvKiBIYW5kc2hha2UgTURNQTEgQ29udHJvbCBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgSE1ETUExX0VDSU5JVAkJMHhGRkMwMzM0NAkvKiBITURNQTEgSW5pdGlhbCBFZGdlIENvdW50IFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIEhNRE1BMV9CQ0lOSVQJCTB4RkZDMDMzNDgJLyogSE1ETUExIEluaXRpYWwgQmxvY2sgQ291bnQgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgSE1ETUExX0VDVVJHRU5UCQkweEZGQzAzMzRDCS8qIEhNRE1BMSBVcmdlbnQgRWRnZSBDb3VudCBUaHJlc2hob2xkIFJlZ2lzdGVyCQkqLworI2RlZmluZSBITURNQTFfRUNPVkVSRkxPVwkweEZGQzAzMzUwCS8qIEhNRE1BMSBFZGdlIENvdW50IE92ZXJmbG93IEludGVycnVwdCBSZWdpc3RlcgkqLworI2RlZmluZSBITURNQTFfRUNPVU5UCQkweEZGQzAzMzU0CS8qIEhNRE1BMSBDdXJyZW50IEVkZ2UgQ291bnQgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgSE1ETUExX0JDT1VOVAkJMHhGRkMwMzM1OAkvKiBITURNQTEgQ3VycmVudCBCbG9jayBDb3VudCBSZWdpc3RlcgkJCQkqLworCisKKy8qIEdQSU8gUElOIG11eCAoMHhGRkMwMzIxMCAtIE94RkZDMDMyODgpICovCisjZGVmaW5lIFBPUlRGX01VWCAgICAgICAgICAgICAgIDB4RkZDMDMyMTAgICAgICAvKiBQb3J0IEYgbXV4IGNvbnRyb2wgKi8KKyNkZWZpbmUgUE9SVEdfTVVYICAgICAgICAgICAgICAgMHhGRkMwMzIxNCAgICAgIC8qIFBvcnQgRyBtdXggY29udHJvbCAqLworI2RlZmluZSBQT1JUSF9NVVggICAgICAgICAgICAgICAweEZGQzAzMjE4ICAgICAgLyogUG9ydCBIIG11eCBjb250cm9sICovCisjZGVmaW5lIFBPUlRGX0RSSVZFICAgICAgICAgICAgIDB4RkZDMDMyMjAgICAgICAvKiBQb3J0IEYgZHJpdmUgc3RyZW5ndGggY29udHJvbCAqLworI2RlZmluZSBQT1JUR19EUklWRSAgICAgICAgICAgICAweEZGQzAzMjI0ICAgICAgLyogUG9ydCBHIGRyaXZlIHN0cmVuZ3RoIGNvbnRyb2wgKi8KKyNkZWZpbmUgUE9SVEhfRFJJVkUgICAgICAgICAgICAgMHhGRkMwMzIyOCAgICAgIC8qIFBvcnQgSCBkcml2ZSBzdHJlbmd0aCBjb250cm9sICovCisjZGVmaW5lIFBPUlRGX1NMRVcgICAgICAgICAgICAgIDB4RkZDMDMyMzAgICAgICAvKiBQb3J0IEYgc2xldyBjb250cm9sICovCisjZGVmaW5lIFBPUlRHX1NMRVcgICAgICAgICAgICAgIDB4RkZDMDMyMzQgICAgICAvKiBQb3J0IEcgc2xldyBjb250cm9sICovCisjZGVmaW5lIFBPUlRIX1NMRVcgICAgICAgICAgICAgIDB4RkZDMDMyMzggICAgICAvKiBQb3J0IEggc2xldyBjb250cm9sICovCisjZGVmaW5lIFBPUlRGX0hZU1RFUklTSVMgICAgICAgIDB4RkZDMDMyNDAgICAgICAvKiBQb3J0IEYgU2NobWl0dCB0cmlnZ2VyIGNvbnRyb2wgKi8KKyNkZWZpbmUgUE9SVEdfSFlTVEVSSVNJUyAgICAgICAgMHhGRkMwMzI0NCAgICAgIC8qIFBvcnQgRyBTY2htaXR0IHRyaWdnZXIgY29udHJvbCAqLworI2RlZmluZSBQT1JUSF9IWVNURVJJU0lTICAgICAgICAweEZGQzAzMjQ4ICAgICAgLyogUG9ydCBIIFNjaG1pdHQgdHJpZ2dlciBjb250cm9sICovCisjZGVmaW5lIE1JU0NQT1JUX0RSSVZFICAgICAgICAgIDB4RkZDMDMyODAgICAgICAvKiBNaXNjIFBvcnQgZHJpdmUgc3RyZW5ndGggY29udHJvbCAqLworI2RlZmluZSBNSVNDUE9SVF9TTEVXICAgICAgICAgICAweEZGQzAzMjg0ICAgICAgLyogTWlzYyBQb3J0IHNsZXcgY29udHJvbCAqLworI2RlZmluZSBNSVNDUE9SVF9IWVNURVJJU0lTICAgICAweEZGQzAzMjg4ICAgICAgLyogTWlzYyBQb3J0IFNjaG1pdHQgdHJpZ2dlciBjb250cm9sICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKiBTeXN0ZW0gTU1SIFJlZ2lzdGVyIEJpdHMgQW5kIE1hY3JvcworKioKKyoqIERpc2NsYWltZXI6CUFsbCBtYWNyb3MgYXJlIGludGVuZGVkIHRvIG1ha2UgQyBhbmQgQXNzZW1ibHkgY29kZSBtb3JlIHJlYWRhYmxlLgorKioJCQkJVXNlIHRoZXNlIG1hY3JvcyBjYXJlZnVsbHksIGFzIGFueSB0aGF0IGRvIGxlZnQgc2hpZnRzIGZvciBmaWVsZAorKioJCQkJZGVwb3NpdGluZyB3aWxsIHJlc3VsdCBpbiB0aGUgbG93ZXIgb3JkZXIgYml0cyBiZWluZyBkZXN0cm95ZWQuICBBbnkKKyoqCQkJCW1hY3JvIHRoYXQgc2hpZnRzIGxlZnQgdG8gcHJvcGVybHkgcG9zaXRpb24gdGhlIGJpdC1maWVsZCBzaG91bGQgYmUKKyoqCQkJCXVzZWQgYXMgcGFydCBvZiBhbiBPUiB0byBpbml0aWFsaXplIGEgcmVnaXN0ZXIgYW5kIE5PVCBhcyBhIGR5bmFtaWMKKyoqCQkJCW1vZGlmaWVyIFVOTEVTUyB0aGUgbG93ZXIgb3JkZXIgYml0cyBhcmUgc2F2ZWQgYW5kIE9SZWQgYmFjayBpbiB3aGVuCisqKgkJCQl0aGUgbWFjcm8gaXMgdXNlZC4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorKiogKioqKioqKioqKioqKioqKioqKioqIFBMTCBBTkQgUkVTRVQgTUFTS1MgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFBMTF9DVEwgTWFza3MJCQkJCQkJCQkJCQkJCQkJCSovCisjZGVmaW5lIERGCQkJCTB4MDAwMQkvKiAwOiBQTEwgPSBDTEtJTiwgMTogUExMID0gQ0xLSU4vMgkJCQkJKi8KKyNkZWZpbmUgUExMX09GRgkJCTB4MDAwMgkvKiBQTEwgTm90IFBvd2VyZWQJCQkJCQkJCQkqLworI2RlZmluZSBTVE9QQ0sJCQkweDAwMDgJLyogQ29yZSBDbG9jayBPZmYJCQkJCQkJCQkqLworI2RlZmluZSBQRFdOCQkJMHgwMDIwCS8qIEVudGVyIERlZXAgU2xlZXAgTW9kZQkJCQkJCQkqLworI2RlZmluZQlJTl9ERUxBWQkJMHgwMDQwCS8qIEFkZCAyMDBwcyBEZWxheSBUbyBFQklVIElucHV0IExhdGNoZXMJCQkqLworI2RlZmluZQlPVVRfREVMQVkJCTB4MDA4MAkvKiBBZGQgMjAwcHMgRGVsYXkgVG8gRUJJVSBPdXRwdXQgU2lnbmFscwkJCSovCisjZGVmaW5lIEJZUEFTUwkJCTB4MDEwMAkvKiBCeXBhc3MgdGhlIFBMTAkJCQkJCQkJCSovCisjZGVmaW5lCU1TRUwJCQkweDdFMDAJLyogTXVsdGlwbGllciBTZWxlY3QgRm9yIENDTEsvVkNPIEZhY3RvcnMJCQkqLworLyogUExMX0NUTCBNYWNyb3MgKE9ubHkgVXNlIFdpdGggTG9naWMgT1IgV2hpbGUgU2V0dGluZyBMb3dlciBPcmRlciBCaXRzKQkJCSovCisjZGVmaW5lCVNFVF9NU0VMKHgpCQkoKCh4KSYweDNGKSA8PCAweDkpCS8qIFNldCBNU0VMID0gMC02MyAtLT4gVkNPID0gQ0xLSU4qTVNFTAkJKi8KKworLyogUExMX0RJViBNYXNrcwkJCQkJCQkJCQkJCQkJKi8KKyNkZWZpbmUgU1NFTAkJCTB4MDAwRgkvKiBTeXN0ZW0gU2VsZWN0CQkJCQkJKi8KKyNkZWZpbmUJQ1NFTAkJCTB4MDAzMAkvKiBDb3JlIFNlbGVjdAkJCQkJCQkqLworI2RlZmluZSBDU0VMX0RJVjEJCTB4MDAwMAkvKiAJCUNDTEsgPSBWQ08gLyAxCQkJCQkqLworI2RlZmluZSBDU0VMX0RJVjIJCTB4MDAxMAkvKiAJCUNDTEsgPSBWQ08gLyAyCQkJCQkqLworI2RlZmluZQlDU0VMX0RJVjQJCTB4MDAyMAkvKiAJCUNDTEsgPSBWQ08gLyA0CQkJCQkqLworI2RlZmluZQlDU0VMX0RJVjgJCTB4MDAzMAkvKiAJCUNDTEsgPSBWQ08gLyA4CQkJCQkqLworLyogUExMX0RJViBNYWNyb3MJCQkJCQkJCQkJCQkJCSovCisjZGVmaW5lIFNFVF9TU0VMKHgpCQkoKHgpJjB4RikJCS8qIFNldCBTU0VMID0gMC0xNSAtLT4gU0NMSyA9IFZDTy9TU0VMCSovCisKKy8qIFZSX0NUTCBNYXNrcwkqLworI2RlZmluZQlGUkVRCQkJMHgzMDAwCS8qIFN3aXRjaGluZyBPc2NpbGxhdG9yIEZyZXF1ZW5jeSBGb3IgUmVndWxhdG9yCSovCisjZGVmaW5lCUhJQkVSTkFURQkJMHgwMDAwCS8qIAkJUG93ZXJkb3duL0J5cGFzcyBPbi1Cb2FyZCBSZWd1bGF0aW9uCSovCisKKyNkZWZpbmUJVkxFVgkJCTB4MDBGMAkvKiBJbnRlcm5hbCBWb2x0YWdlIExldmVsCQkJCQkqLworI2RlZmluZQlWTEVWXzA4NSAJCTB4MDA2MAkvKiAJCVZMRVYgPSAwLjg1IFYgKC01JSAtICsxMCUgQWNjdXJhY3kpCSovCisjZGVmaW5lCVZMRVZfMDkwCQkweDAwNzAJLyogCQlWTEVWID0gMC45MCBWICgtNSUgLSArMTAlIEFjY3VyYWN5KQkqLworI2RlZmluZQlWTEVWXzA5NQkJMHgwMDgwCS8qIAkJVkxFViA9IDAuOTUgViAoLTUlIC0gKzEwJSBBY2N1cmFjeSkJKi8KKyNkZWZpbmUJVkxFVl8xMDAJCTB4MDA5MAkvKiAJCVZMRVYgPSAxLjAwIFYgKC01JSAtICsxMCUgQWNjdXJhY3kpCSovCisjZGVmaW5lCVZMRVZfMTA1CQkweDAwQTAJLyogCQlWTEVWID0gMS4wNSBWICgtNSUgLSArMTAlIEFjY3VyYWN5KQkqLworI2RlZmluZQlWTEVWXzExMAkJMHgwMEIwCS8qIAkJVkxFViA9IDEuMTAgViAoLTUlIC0gKzEwJSBBY2N1cmFjeSkJKi8KKyNkZWZpbmUJVkxFVl8xMTUJCTB4MDBDMAkvKiAJCVZMRVYgPSAxLjE1IFYgKC01JSAtICsxMCUgQWNjdXJhY3kpCSovCisjZGVmaW5lCVZMRVZfMTIwCQkweDAwRDAJLyogCQlWTEVWID0gMS4yMCBWICgtNSUgLSArMTAlIEFjY3VyYWN5KQkqLworI2RlZmluZQlWTEVWXzEyNQkJMHgwMEUwCS8qIAkJVkxFViA9IDEuMjUgViAoLTUlIC0gKzEwJSBBY2N1cmFjeSkJKi8KKyNkZWZpbmUJVkxFVl8xMzAJCTB4MDBGMAkvKiAJCVZMRVYgPSAxLjMwIFYgKC01JSAtICsxMCUgQWNjdXJhY3kpCSovCisKKyNkZWZpbmUJV0FLRQkJCTB4MDEwMAkvKiBFbmFibGUgUlRDL1Jlc2V0IFdha2V1cCBGcm9tIEhpYmVybmF0ZQkqLworI2RlZmluZQlVU0JXRQkJCTB4MDIwMAkvKiBFbmFibGUgVVNCIFdha2V1cCBGcm9tIEhpYmVybmF0ZQkJCSovCisjZGVmaW5lCVBIWVdFCQkJMHgwNDAwCS8qIEVuYWJsZSBQSFkgV2FrZXVwIEZyb20gSGliZXJuYXRlCQkJKi8KKyNkZWZpbmUJQ0xLQlVGT0UJCTB4NDAwMAkvKiBDTEtJTiBCdWZmZXIgT3V0cHV0IEVuYWJsZSAqLworI2RlZmluZQlQSFlDTEtPRQkJQ0xLQlVGT0UJLyogQWx0ZXJuYXRpdmUgbGVnYWN5IG5hbWUgZm9yIHRoZSBhYm92ZSAqLworI2RlZmluZQlTQ0tFTE9XCQkweDgwMDAJLyogRW5hYmxlIERyaXZlIENLRSBMb3cgRHVyaW5nIFJlc2V0CQkqLworCisvKiBQTExfU1RBVCBNYXNrcwkJCQkJCQkJCQkJCQkJCQkJKi8KKyNkZWZpbmUgQUNUSVZFX1BMTEVOQUJMRUQJMHgwMDAxCS8qIFByb2Nlc3NvciBJbiBBY3RpdmUgTW9kZSBXaXRoIFBMTCBFbmFibGVkCSovCisjZGVmaW5lCUZVTExfT04JCQkJMHgwMDAyCS8qIFByb2Nlc3NvciBJbiBGdWxsIE9uIE1vZGUJCQkJCSovCisjZGVmaW5lIEFDVElWRV9QTExESVNBQkxFRAkweDAwMDQJLyogUHJvY2Vzc29yIEluIEFjdGl2ZSBNb2RlIFdpdGggUExMIERpc2FibGVkCSovCisjZGVmaW5lCVBMTF9MT0NLRUQJCQkweDAwMjAJLyogUExMX0xPQ0tDTlQgSGFzIEJlZW4gUmVhY2hlZAkJCQkJKi8KKworLyogQ0hJUElEIE1hc2tzICovCisjZGVmaW5lIENISVBJRF9WRVJTSU9OICAgICAgICAgMHhGMDAwMDAwMAorI2RlZmluZSBDSElQSURfRkFNSUxZICAgICAgICAgIDB4MEZGRkYwMDAKKyNkZWZpbmUgQ0hJUElEX01BTlVGQUNUVVJFICAgICAweDAwMDAwRkZFCisKKy8qIFNXUlNUIE1hc2tzCQkJCQkJCQkJCQkJCQkJCQkJKi8KKyNkZWZpbmUgU1lTVEVNX1JFU0VUCQkweDAwMDcJLyogSW5pdGlhdGVzIEEgU3lzdGVtIFNvZnR3YXJlIFJlc2V0CQkJKi8KKyNkZWZpbmUJRE9VQkxFX0ZBVUxUCQkweDAwMDgJLyogQ29yZSBEb3VibGUgRmF1bHQgQ2F1c2VzIFJlc2V0CQkJCSovCisjZGVmaW5lIFJFU0VUX0RPVUJMRQkJMHgyMDAwCS8qIFNXIFJlc2V0IEdlbmVyYXRlZCBCeSBDb3JlIERvdWJsZS1GYXVsdAkJKi8KKyNkZWZpbmUgUkVTRVRfV0RPRwkJCTB4NDAwMAkvKiBTVyBSZXNldCBHZW5lcmF0ZWQgQnkgV2F0Y2hkb2cgVGltZXIJCQkqLworI2RlZmluZSBSRVNFVF9TT0ZUV0FSRQkJMHg4MDAwCS8qIFNXIFJlc2V0IE9jY3VycmVkIFNpbmNlIExhc3QgUmVhZCBPZiBTV1JTVAkqLworCisvKiBTWVNDUiBNYXNrcwkJCQkJCQkJCQkJCQkJCQkJCQkJKi8KKyNkZWZpbmUgQk1PREUJCQkJMHgwMDA3CS8qIEJvb3QgTW9kZSAtIExhdGNoZWQgRHVyaW5nIEhXIFJlc2V0IEZyb20gTW9kZSBQaW5zCSovCisjZGVmaW5lCU5PQk9PVAkJCQkweDAwMTAJLyogRXhlY3V0ZSBGcm9tIEwxIG9yIEFTWU5DIEJhbmsgMCBXaGVuIEJNT0RFID0gMAkJKi8KKworCisvKiAqKioqKioqKioqKioqICBTWVNURU0gSU5URVJSVVBUIENPTlRST0xMRVIgTUFTS1MgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFBlcmlwaGVyYWwgTWFza3MgRm9yIFNJQ19JU1IsIFNJQ19JV1IsIFNJQ19JTUFTSwkJCQkJCQkJCQkqLworCisjaWYgMAorI2RlZmluZSBJUlFfUExMX1dBS0VVUAkweDAwMDAwMDAxCS8qIFBMTCBXYWtldXAgSW50ZXJydXB0CQkJIAkJCQkJKi8KKworI2RlZmluZSBJUlFfRVJST1IxICAgICAgMHgwMDAwMDAwMiAgLyogRXJyb3IgSW50ZXJydXB0IChETUEsIERNQVJ4IEJsb2NrLCBETUFSeCBPdmVyZmxvdykgKi8KKyNkZWZpbmUgSVJRX0VSUk9SMiAgICAgIDB4MDAwMDAwMDQgIC8qIEVycm9yIEludGVycnVwdCAoQ0FOLCBFdGhlcm5ldCwgU1BPUlR4LCBQUEksIFNQSSwgVUFSVHgpICovCisjZGVmaW5lIElSUV9SVEMJCQkweDAwMDAwMDA4CS8qIFJlYWwgVGltZSBDbG9jayBJbnRlcnJ1cHQgCQkJCQkJKi8KKyNkZWZpbmUgSVJRX0RNQTAJCTB4MDAwMDAwMTAJLyogRE1BIENoYW5uZWwgMCAoUFBJKSBJbnRlcnJ1cHQgCQkJCQkqLworI2RlZmluZSBJUlFfRE1BMwkJMHgwMDAwMDAyMAkvKiBETUEgQ2hhbm5lbCAzIChTUE9SVDAgUlgpIEludGVycnVwdCAJCQkJKi8KKyNkZWZpbmUgSVJRX0RNQTQJCTB4MDAwMDAwNDAJLyogRE1BIENoYW5uZWwgNCAoU1BPUlQwIFRYKSBJbnRlcnJ1cHQgCQkJCSovCisjZGVmaW5lIElSUV9ETUE1CQkweDAwMDAwMDgwCS8qIERNQSBDaGFubmVsIDUgKFNQT1JUMSBSWCkgSW50ZXJydXB0IAkJCQkqLworCisjZGVmaW5lIElSUV9ETUE2CQkweDAwMDAwMTAwCS8qIERNQSBDaGFubmVsIDYgKFNQT1JUMSBUWCkgSW50ZXJydXB0IAkJIAkJKi8KKyNkZWZpbmUgSVJRX1RXSQkJCTB4MDAwMDAyMDAJLyogVFdJIEludGVycnVwdAkJCQkJCQkJCSovCisjZGVmaW5lIElSUV9ETUE3CQkweDAwMDAwNDAwCS8qIERNQSBDaGFubmVsIDcgKFNQSSkgSW50ZXJydXB0IAkJCQkJKi8KKyNkZWZpbmUgSVJRX0RNQTgJCTB4MDAwMDA4MDAJLyogRE1BIENoYW5uZWwgOCAoVUFSVDAgUlgpIEludGVycnVwdCAJCQkJKi8KKyNkZWZpbmUgSVJRX0RNQTkJCTB4MDAwMDEwMDAJLyogRE1BIENoYW5uZWwgOSAoVUFSVDAgVFgpIEludGVycnVwdCAJCQkJKi8KKyNkZWZpbmUgSVJRX0RNQTEwCQkweDAwMDAyMDAwCS8qIERNQSBDaGFubmVsIDEwIChVQVJUMSBSWCkgSW50ZXJydXB0IAkJCQkqLworI2RlZmluZSBJUlFfRE1BMTEJCTB4MDAwMDQwMDAJLyogRE1BIENoYW5uZWwgMTEgKFVBUlQxIFRYKSBJbnRlcnJ1cHQgCQkJCSovCisjZGVmaW5lIElSUV9DQU5fUlgJCTB4MDAwMDgwMDAJLyogQ0FOIFJlY2VpdmUgSW50ZXJydXB0IAkJCQkJCQkqLworCisjZGVmaW5lIElSUV9DQU5fVFgJCTB4MDAwMTAwMDAJLyogQ0FOIFRyYW5zbWl0IEludGVycnVwdCAgCQkJCQkJCSovCisjZGVmaW5lIElSUV9ETUExCQkweDAwMDIwMDAwCS8qIERNQSBDaGFubmVsIDEgKEV0aGVybmV0IFJYKSBJbnRlcnJ1cHQgCQkJKi8KKyNkZWZpbmUgSVJRX1BGQV9QT1JUSAkweDAwMDIwMDAwCS8qIFBGIFBvcnQgSCAoUEY0NzozMikgSW50ZXJydXB0IEEgCQkJCQkqLworI2RlZmluZSBJUlFfRE1BMgkJMHgwMDA0MDAwMAkvKiBETUEgQ2hhbm5lbCAyIChFdGhlcm5ldCBUWCkgSW50ZXJydXB0IAkJCSovCisjZGVmaW5lIElSUV9QRkJfUE9SVEgJMHgwMDA0MDAwMAkvKiBQRiBQb3J0IEggKFBGNDc6MzIpIEludGVycnVwdCBCIAkJCQkJKi8KKyNkZWZpbmUgSVJRX1RJTUVSMAkJMHgwMDA4MDAwMAkvKiBUaW1lciAwIEludGVycnVwdAkJCQkJCQkJKi8KKyNkZWZpbmUgSVJRX1RJTUVSMQkJMHgwMDEwMDAwMAkvKiBUaW1lciAxIEludGVycnVwdCAJCQkJCQkJCSovCisjZGVmaW5lIElSUV9USU1FUjIJCTB4MDAyMDAwMDAJLyogVGltZXIgMiBJbnRlcnJ1cHQgCQkJCQkJCQkqLworI2RlZmluZSBJUlFfVElNRVIzCQkweDAwNDAwMDAwCS8qIFRpbWVyIDMgSW50ZXJydXB0IAkJCQkJCQkJKi8KKyNkZWZpbmUgSVJRX1RJTUVSNAkJMHgwMDgwMDAwMAkvKiBUaW1lciA0IEludGVycnVwdCAJCQkJCQkJCSovCisKKyNkZWZpbmUgSVJRX1RJTUVSNQkJMHgwMTAwMDAwMAkvKiBUaW1lciA1IEludGVycnVwdCAJCQkJCQkJCSovCisjZGVmaW5lIElSUV9USU1FUjYJCTB4MDIwMDAwMDAJLyogVGltZXIgNiBJbnRlcnJ1cHQgCQkJCQkJCQkqLworI2RlZmluZSBJUlFfVElNRVI3CQkweDA0MDAwMDAwCS8qIFRpbWVyIDcgSW50ZXJydXB0IAkJCQkJCQkJKi8KKyNkZWZpbmUgSVJRX1BGQV9QT1JURkcJMHgwODAwMDAwMAkvKiBQRiBQb3J0cyBGJkcgKFBGMzE6MCkgSW50ZXJydXB0IEEgCQkJCSovCisjZGVmaW5lIElSUV9QRkJfUE9SVEYJMHg4MDAwMDAwMAkvKiBQRiBQb3J0IEYgKFBGMTU6MCkgSW50ZXJydXB0IEIgCQkJCQkqLworI2RlZmluZSBJUlFfRE1BMTIJCTB4MjAwMDAwMDAJLyogRE1BIENoYW5uZWxzIDEyIChNRE1BMSBTb3VyY2UpIFJYIEludGVycnVwdCAJCSovCisjZGVmaW5lIElSUV9ETUExMwkJMHgyMDAwMDAwMAkvKiBETUEgQ2hhbm5lbHMgMTMgKE1ETUExIERlc3RpbmF0aW9uKSBUWCBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUgSVJRX0RNQTE0CQkweDQwMDAwMDAwCS8qIERNQSBDaGFubmVscyAxNCAoTURNQTAgU291cmNlKSBSWCBJbnRlcnJ1cHQgCQkqLworI2RlZmluZSBJUlFfRE1BMTUJCTB4NDAwMDAwMDAJLyogRE1BIENoYW5uZWxzIDE1IChNRE1BMCBEZXN0aW5hdGlvbikgVFggSW50ZXJydXB0ICovCisjZGVmaW5lIElSUV9XRE9HCQkweDgwMDAwMDAwCS8qIFNvZnR3YXJlIFdhdGNoZG9nIFRpbWVyIEludGVycnVwdCAJCQkJKi8KKyNkZWZpbmUgSVJRX1BGQl9QT1JURwkweDEwMDAwMDAwCS8qIFBGIFBvcnQgRyAoUEYzMToxNikgSW50ZXJydXB0IEIgCQkJCQkqLworI2VuZGlmCisKKy8qIFNJQ19JQVIwIE1hY3JvcwkJCQkJCQkJCQkJCQkJCSovCisjZGVmaW5lIFAwX0lWRyh4KQkJKCgoeCkmMHhGKS03KQkJCS8qIFBlcmlwaGVyYWwgIzAgYXNzaWduZWQgSVZHICN4IAkqLworI2RlZmluZSBQMV9JVkcoeCkJCSgoKHgpJjB4RiktNykgPDwgMHg0CS8qIFBlcmlwaGVyYWwgIzEgYXNzaWduZWQgSVZHICN4IAkqLworI2RlZmluZSBQMl9JVkcoeCkJCSgoKHgpJjB4RiktNykgPDwgMHg4CS8qIFBlcmlwaGVyYWwgIzIgYXNzaWduZWQgSVZHICN4IAkqLworI2RlZmluZSBQM19JVkcoeCkJCSgoKHgpJjB4RiktNykgPDwgMHhDCS8qIFBlcmlwaGVyYWwgIzMgYXNzaWduZWQgSVZHICN4CSovCisjZGVmaW5lIFA0X0lWRyh4KQkJKCgoeCkmMHhGKS03KSA8PCAweDEwCS8qIFBlcmlwaGVyYWwgIzQgYXNzaWduZWQgSVZHICN4CSovCisjZGVmaW5lIFA1X0lWRyh4KQkJKCgoeCkmMHhGKS03KSA8PCAweDE0CS8qIFBlcmlwaGVyYWwgIzUgYXNzaWduZWQgSVZHICN4CSovCisjZGVmaW5lIFA2X0lWRyh4KQkJKCgoeCkmMHhGKS03KSA8PCAweDE4CS8qIFBlcmlwaGVyYWwgIzYgYXNzaWduZWQgSVZHICN4CSovCisjZGVmaW5lIFA3X0lWRyh4KQkJKCgoeCkmMHhGKS03KSA8PCAweDFDCS8qIFBlcmlwaGVyYWwgIzcgYXNzaWduZWQgSVZHICN4CSovCisKKy8qIFNJQ19JQVIxIE1hY3JvcwkJCQkJCQkJCQkJCQkJCSovCisjZGVmaW5lIFA4X0lWRyh4KQkJKCgoeCkmMHhGKS03KQkJCS8qIFBlcmlwaGVyYWwgIzggYXNzaWduZWQgSVZHICN4IAkqLworI2RlZmluZSBQOV9JVkcoeCkJCSgoKHgpJjB4RiktNykgPDwgMHg0CS8qIFBlcmlwaGVyYWwgIzkgYXNzaWduZWQgSVZHICN4IAkqLworI2RlZmluZSBQMTBfSVZHKHgpCQkoKCh4KSYweEYpLTcpIDw8IDB4OAkvKiBQZXJpcGhlcmFsICMxMCBhc3NpZ25lZCBJVkcgI3gJKi8KKyNkZWZpbmUgUDExX0lWRyh4KQkJKCgoeCkmMHhGKS03KSA8PCAweEMJLyogUGVyaXBoZXJhbCAjMTEgYXNzaWduZWQgSVZHICN4IAkqLworI2RlZmluZSBQMTJfSVZHKHgpCQkoKCh4KSYweEYpLTcpIDw8IDB4MTAJLyogUGVyaXBoZXJhbCAjMTIgYXNzaWduZWQgSVZHICN4CSovCisjZGVmaW5lIFAxM19JVkcoeCkJCSgoKHgpJjB4RiktNykgPDwgMHgxNAkvKiBQZXJpcGhlcmFsICMxMyBhc3NpZ25lZCBJVkcgI3gJKi8KKyNkZWZpbmUgUDE0X0lWRyh4KQkJKCgoeCkmMHhGKS03KSA8PCAweDE4CS8qIFBlcmlwaGVyYWwgIzE0IGFzc2lnbmVkIElWRyAjeAkqLworI2RlZmluZSBQMTVfSVZHKHgpCQkoKCh4KSYweEYpLTcpIDw8IDB4MUMJLyogUGVyaXBoZXJhbCAjMTUgYXNzaWduZWQgSVZHICN4CSovCisKKy8qIFNJQ19JQVIyIE1hY3JvcwkJCQkJCQkJCQkJCQkJCSovCisjZGVmaW5lIFAxNl9JVkcoeCkJCSgoKHgpJjB4RiktNykJCQkvKiBQZXJpcGhlcmFsICMxNiBhc3NpZ25lZCBJVkcgI3gJKi8KKyNkZWZpbmUgUDE3X0lWRyh4KQkJKCgoeCkmMHhGKS03KSA8PCAweDQJLyogUGVyaXBoZXJhbCAjMTcgYXNzaWduZWQgSVZHICN4CSovCisjZGVmaW5lIFAxOF9JVkcoeCkJCSgoKHgpJjB4RiktNykgPDwgMHg4CS8qIFBlcmlwaGVyYWwgIzE4IGFzc2lnbmVkIElWRyAjeAkqLworI2RlZmluZSBQMTlfSVZHKHgpCQkoKCh4KSYweEYpLTcpIDw8IDB4QwkvKiBQZXJpcGhlcmFsICMxOSBhc3NpZ25lZCBJVkcgI3gJKi8KKyNkZWZpbmUgUDIwX0lWRyh4KQkJKCgoeCkmMHhGKS03KSA8PCAweDEwCS8qIFBlcmlwaGVyYWwgIzIwIGFzc2lnbmVkIElWRyAjeAkqLworI2RlZmluZSBQMjFfSVZHKHgpCQkoKCh4KSYweEYpLTcpIDw8IDB4MTQJLyogUGVyaXBoZXJhbCAjMjEgYXNzaWduZWQgSVZHICN4CSovCisjZGVmaW5lIFAyMl9JVkcoeCkJCSgoKHgpJjB4RiktNykgPDwgMHgxOAkvKiBQZXJpcGhlcmFsICMyMiBhc3NpZ25lZCBJVkcgI3gJKi8KKyNkZWZpbmUgUDIzX0lWRyh4KQkJKCgoeCkmMHhGKS03KSA8PCAweDFDCS8qIFBlcmlwaGVyYWwgIzIzIGFzc2lnbmVkIElWRyAjeAkqLworCisvKiBTSUNfSUFSMyBNYWNyb3MJCQkJCQkJCQkJCQkJCQkqLworI2RlZmluZSBQMjRfSVZHKHgpCQkoKCh4KSYweEYpLTcpCQkJLyogUGVyaXBoZXJhbCAjMjQgYXNzaWduZWQgSVZHICN4CSovCisjZGVmaW5lIFAyNV9JVkcoeCkJCSgoKHgpJjB4RiktNykgPDwgMHg0CS8qIFBlcmlwaGVyYWwgIzI1IGFzc2lnbmVkIElWRyAjeAkqLworI2RlZmluZSBQMjZfSVZHKHgpCQkoKCh4KSYweEYpLTcpIDw8IDB4OAkvKiBQZXJpcGhlcmFsICMyNiBhc3NpZ25lZCBJVkcgI3gJKi8KKyNkZWZpbmUgUDI3X0lWRyh4KQkJKCgoeCkmMHhGKS03KSA8PCAweEMJLyogUGVyaXBoZXJhbCAjMjcgYXNzaWduZWQgSVZHICN4CSovCisjZGVmaW5lIFAyOF9JVkcoeCkJCSgoKHgpJjB4RiktNykgPDwgMHgxMAkvKiBQZXJpcGhlcmFsICMyOCBhc3NpZ25lZCBJVkcgI3gJKi8KKyNkZWZpbmUgUDI5X0lWRyh4KQkJKCgoeCkmMHhGKS03KSA8PCAweDE0CS8qIFBlcmlwaGVyYWwgIzI5IGFzc2lnbmVkIElWRyAjeAkqLworI2RlZmluZSBQMzBfSVZHKHgpCQkoKCh4KSYweEYpLTcpIDw8IDB4MTgJLyogUGVyaXBoZXJhbCAjMzAgYXNzaWduZWQgSVZHICN4CSovCisjZGVmaW5lIFAzMV9JVkcoeCkJCSgoKHgpJjB4RiktNykgPDwgMHgxQwkvKiBQZXJpcGhlcmFsICMzMSBhc3NpZ25lZCBJVkcgI3gJKi8KKworCisvKiBTSUNfSU1BU0sgTWFza3MJCQkJCQkJCQkJCQkJCQkJCQkqLworI2RlZmluZSBTSUNfVU5NQVNLX0FMTAkweDAwMDAwMDAwCQkJCQkvKiBVbm1hc2sgYWxsIHBlcmlwaGVyYWwgaW50ZXJydXB0cwkqLworI2RlZmluZSBTSUNfTUFTS19BTEwJMHhGRkZGRkZGRgkJCQkJLyogTWFzayBhbGwgcGVyaXBoZXJhbCBpbnRlcnJ1cHRzCSovCisjZGVmaW5lIFNJQ19NQVNLKHgpCQkoMSA8PCAoKHgpJjB4MUYpKQkJCQkJLyogTWFzayBQZXJpcGhlcmFsICN4IGludGVycnVwdAkJKi8KKyNkZWZpbmUgU0lDX1VOTUFTSyh4KQkoMHhGRkZGRkZGRiBeICgxIDw8ICgoeCkmMHgxRikpKQkvKiBVbm1hc2sgUGVyaXBoZXJhbCAjeCBpbnRlcnJ1cHQJKi8KKworLyogU0lDX0lXUiBNYXNrcwkJCQkJCQkJCQkJCQkJCQkJCSovCisjZGVmaW5lIElXUl9ESVNBQkxFX0FMTAkweDAwMDAwMDAwCQkJCQkvKiBXYWtldXAgRGlzYWJsZSBhbGwgcGVyaXBoZXJhbHMJKi8KKyNkZWZpbmUgSVdSX0VOQUJMRV9BTEwJMHhGRkZGRkZGRgkJCQkJLyogV2FrZXVwIEVuYWJsZSBhbGwgcGVyaXBoZXJhbHMJKi8KKyNkZWZpbmUgSVdSX0VOQUJMRSh4KQkoMSA8PCAoKHgpJjB4MUYpKQkJCQkJLyogV2FrZXVwIEVuYWJsZSBQZXJpcGhlcmFsICN4CQkqLworI2RlZmluZSBJV1JfRElTQUJMRSh4KQkoMHhGRkZGRkZGRiBeICgxIDw8ICgoeCkmMHgxRikpKSAJLyogV2FrZXVwIERpc2FibGUgUGVyaXBoZXJhbCAjeAkJKi8KKworCisvKiAqKioqKioqKiogV0FUQ0hET0cgVElNRVIgTUFTS1MgKioqKioqKioqKioqKioqKioqKiogKi8KKworLyogV2F0Y2hkb2cgVGltZXIgV0RPR19DVEwgUmVnaXN0ZXIgTWFza3MgKi8KKworI2RlZmluZSBXREVWKHgpICgoKHgpPDwxKSAmIDB4MDAwNikgLyogZXZlbnQgZ2VuZXJhdGVkIG9uIHJvbGwgb3ZlciAqLworI2RlZmluZSBXREVWX1JFU0VUIDB4MDAwMCAvKiBnZW5lcmF0ZSByZXNldCBldmVudCBvbiByb2xsIG92ZXIgKi8KKyNkZWZpbmUgV0RFVl9OTUkgMHgwMDAyIC8qIGdlbmVyYXRlIE5NSSBldmVudCBvbiByb2xsIG92ZXIgKi8KKyNkZWZpbmUgV0RFVl9HUEkgMHgwMDA0IC8qIGdlbmVyYXRlIEdQIElSUSBvbiByb2xsIG92ZXIgKi8KKyNkZWZpbmUgV0RFVl9OT05FIDB4MDAwNiAvKiBubyBldmVudCBvbiByb2xsIG92ZXIgKi8KKyNkZWZpbmUgV0RFTiAweDBGRjAgLyogZW5hYmxlIHdhdGNoZG9nICovCisjZGVmaW5lIFdERElTIDB4MEFEMCAvKiBkaXNhYmxlIHdhdGNoZG9nICovCisjZGVmaW5lIFdEUk8gMHg4MDAwIC8qIHdhdGNoZG9nIHJvbGxlZCBvdmVyIGxhdGNoICovCisKKy8qIGRlcHJlY2lhdGVkIFdET0dfQ1RMIFJlZ2lzdGVyIE1hc2tzIGZvciBsZWdhY3kgY29kZSAqLworCisKKyNkZWZpbmUgSUNUTCBXREVWCisjZGVmaW5lIEVOQUJMRV9SRVNFVCBXREVWX1JFU0VUCisjZGVmaW5lIFdET0dfUkVTRVQgV0RFVl9SRVNFVAorI2RlZmluZSBFTkFCTEVfTk1JIFdERVZfTk1JCisjZGVmaW5lIFdET0dfTk1JIFdERVZfTk1JCisjZGVmaW5lIEVOQUJMRV9HUEkgV0RFVl9HUEkKKyNkZWZpbmUgV0RPR19HUEkgV0RFVl9HUEkKKyNkZWZpbmUgRElTQUJMRV9FVlQgV0RFVl9OT05FCisjZGVmaW5lIFdET0dfTk9ORSBXREVWX05PTkUKKworI2RlZmluZSBUTVJfRU4gV0RFTgorI2RlZmluZSBUTVJfRElTIFdERElTCisjZGVmaW5lIFRSTyBXRFJPCisjZGVmaW5lIElDVExfUDAgMHgwMQorICNkZWZpbmUgSUNUTF9QMSAweDAyCisjZGVmaW5lIFRST19QIDB4MEYKKworCisKKy8qICoqKioqKioqKioqKioqKiAgUkVBTCBUSU1FIENMT0NLIE1BU0tTICAqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFJUQ19TVEFUIGFuZCBSVENfQUxBUk0gTWFza3MJCQkJCQkJCQkJKi8KKyNkZWZpbmUJUlRDX1NFQwkJCQkweDAwMDAwMDNGCS8qIFJlYWwtVGltZSBDbG9jayBTZWNvbmRzCSovCisjZGVmaW5lCVJUQ19NSU4JCQkJMHgwMDAwMEZDMAkvKiBSZWFsLVRpbWUgQ2xvY2sgTWludXRlcwkqLworI2RlZmluZQlSVENfSFIJCQkJMHgwMDAxRjAwMAkvKiBSZWFsLVRpbWUgQ2xvY2sgSG91cnMJKi8KKyNkZWZpbmUJUlRDX0RBWQkJCQkweEZGRkUwMDAwCS8qIFJlYWwtVGltZSBDbG9jayBEYXlzCQkqLworCisvKiBSVENfQUxBUk0gTWFjcm8JCQl6PWRheQkJeT1ocgl4PW1pbgl3PXNlYwkJKi8KKyNkZWZpbmUgU0VUX0FMQVJNKHoseSx4LHcpCSgoKCh6KSYweDdGRkYpPDwweDExKXwoKCh5KSYweDFGKTw8MHhDKXwoKCh4KSYweDNGKTw8MHg2KXwoKHcpJjB4M0YpKQorCisvKiBSVENfSUNUTCBhbmQgUlRDX0lTVEFUIE1hc2tzCQkJCQkJCQkJCQkJCQkJCQkJKi8KKyNkZWZpbmUJU1RPUFdBVENICQkJMHgwMDAxCQkvKiBTdG9wd2F0Y2ggSW50ZXJydXB0IEVuYWJsZQkJCQkJCQkJKi8KKyNkZWZpbmUJQUxBUk0JCQkJMHgwMDAyCQkvKiBBbGFybSBJbnRlcnJ1cHQgRW5hYmxlCQkJCQkJCQkJKi8KKyNkZWZpbmUJU0VDT05ECQkJCTB4MDAwNAkJLyogU2Vjb25kcyAoMSBIeikgSW50ZXJydXB0IEVuYWJsZQkJCQkJCQkqLworI2RlZmluZQlNSU5VVEUJCQkJMHgwMDA4CQkvKiBNaW51dGVzIEludGVycnVwdCBFbmFibGUJCQkJCQkJCQkqLworI2RlZmluZQlIT1VSCQkJCTB4MDAxMAkJLyogSG91cnMgSW50ZXJydXB0IEVuYWJsZQkJCQkJCQkJCSovCisjZGVmaW5lCURBWQkJCQkJMHgwMDIwCQkvKiAyNCBIb3VycyAoRGF5cykgSW50ZXJydXB0IEVuYWJsZQkJCQkJCQkqLworI2RlZmluZQlEQVlfQUxBUk0JCQkweDAwNDAJCS8qIERheSBBbGFybSAoRGF5LCBIb3VyLCBNaW51dGUsIFNlY29uZCkgSW50ZXJydXB0IEVuYWJsZQkqLworI2RlZmluZQlXUklURV9QRU5ESU5HCQkweDQwMDAJCS8qIFdyaXRlIFBlbmRpbmcgU3RhdHVzCQkJCQkJCQkJCSovCisjZGVmaW5lCVdSSVRFX0NPTVBMRVRFCQkweDgwMDAJCS8qIFdyaXRlIENvbXBsZXRlIEludGVycnVwdCBFbmFibGUJCQkJCQkJKi8KKworLyogUlRDX0ZBU1QgLyBSVENfUFJFTiBNYXNrCQkJCQkJCQkJCQkJKi8KKyNkZWZpbmUgUFJFTgkJCQkweDAwMDEJLyogRW5hYmxlIFByZXNjYWxlciwgUlRDIFJ1bnMgQDEgSHoJKi8KKworCisvKiAqKioqKioqKioqKioqKiBVQVJUIENPTlRST0xMRVIgTUFTS1MgKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFVBUlR4X0xDUiBNYXNrcwkJCQkJCQkJCQkJCSovCisjZGVmaW5lIFdMUyh4KQkJKCgoeCktNSkgJiAweDAzKQkvKiBXb3JkIExlbmd0aCBTZWxlY3QgKi8KKyNkZWZpbmUgU1RCCQkJMHgwNAkJCQkvKiBTdG9wIEJpdHMJCQkqLworI2RlZmluZSBQRU4JCQkweDA4CQkJCS8qIFBhcml0eSBFbmFibGUJCSovCisjZGVmaW5lIEVQUwkJCTB4MTAJCQkJLyogRXZlbiBQYXJpdHkgU2VsZWN0CSovCisjZGVmaW5lIFNUUAkJCTB4MjAJCQkJLyogU3RpY2sgUGFyaXR5CQkJKi8KKyNkZWZpbmUgU0IJCQkweDQwCQkJCS8qIFNldCBCcmVhawkJCSovCisjZGVmaW5lIERMQUIJCTB4ODAJCQkJLyogRGl2aXNvciBMYXRjaCBBY2Nlc3MJKi8KKworLyogVUFSVHhfTUNSIE1hc2sJCQkJCQkJCQkJKi8KKyNkZWZpbmUgTE9PUF9FTkEJMHgxMAkvKiBMb29wYmFjayBNb2RlIEVuYWJsZSAqLworI2RlZmluZSBMT09QX0VOQV9QCTB4MDQKKworLyogVUFSVHhfTFNSIE1hc2tzCQkJCQkJCQkJCSovCisjZGVmaW5lIERSCQkJMHgwMQkvKiBEYXRhIFJlYWR5CQkJCSovCisjZGVmaW5lIE9FCQkJMHgwMgkvKiBPdmVycnVuIEVycm9yCQkJKi8KKyNkZWZpbmUgUEUJCQkweDA0CS8qIFBhcml0eSBFcnJvcgkJCQkqLworI2RlZmluZSBGRQkJCTB4MDgJLyogRnJhbWluZyBFcnJvcgkJCSovCisjZGVmaW5lIEJJCQkJMHgxMAkvKiBCcmVhayBJbnRlcnJ1cHQJCQkqLworI2RlZmluZSBUSFJFCQkweDIwCS8qIFRIUiBFbXB0eQkJCQkqLworI2RlZmluZSBURU1UCQkweDQwCS8qIFRTUiBhbmQgVUFSVF9USFIgRW1wdHkJKi8KKworLyogVUFSVHhfSUVSIE1hc2tzCQkJCQkJCQkJCQkJCQkJKi8KKyNkZWZpbmUgRVJCRkkJCTB4MDEJCS8qIEVuYWJsZSBSZWNlaXZlIEJ1ZmZlciBGdWxsIEludGVycnVwdAkJKi8KKyNkZWZpbmUgRVRCRUkJCTB4MDIJCS8qIEVuYWJsZSBUcmFuc21pdCBCdWZmZXIgRW1wdHkgSW50ZXJydXB0CSovCisjZGVmaW5lIEVMU0kJCTB4MDQJCS8qIEVuYWJsZSBSWCBTdGF0dXMgSW50ZXJydXB0CQkJCSovCisKKy8qIFVBUlR4X0lJUiBNYXNrcwkJCQkJCQkJCQkJCQkJKi8KKyNkZWZpbmUgTklOVAkJMHgwMQkJLyogUGVuZGluZyBJbnRlcnJ1cHQJCQkJCSovCisjZGVmaW5lIElJUl9UWF9SRUFEWSAgICAweDAyCQkvKiBVQVJUX1RIUiBlbXB0eSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBJSVJfUlhfUkVBRFkgICAgMHgwNAkJLyogUmVjZWl2ZSBkYXRhIHJlYWR5ICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSUlSX0xJTkVfQ0hBTkdFIDB4MDYJCS8qIFJlY2VpdmUgbGluZSBzdGF0dXMgICAgCQkJKi8KKyNkZWZpbmUgSUlSX1NUQVRVUwkweDA2CQkvKiBIaWdoZXN0IFByaW9yaXR5IFBlbmRpbmcgSW50ZXJydXB0CSovCisKKy8qIFVBUlR4X0dDVEwgTWFza3MJCQkJCQkJCQkJCQkJKi8KKyNkZWZpbmUgVUNFTgkJMHgwMQkJLyogRW5hYmxlIFVBUlR4IENsb2NrcwkJCQkqLworI2RlZmluZSBJUkVOCQkweDAyCQkvKiBFbmFibGUgSXJEQSBNb2RlCQkJCQkqLworI2RlZmluZSBUUE9MQwkJMHgwNAkJLyogSXJEQSBUWCBQb2xhcml0eSBDaGFuZ2UJCQkqLworI2RlZmluZSBSUE9MQwkJMHgwOAkJLyogSXJEQSBSWCBQb2xhcml0eSBDaGFuZ2UJCQkqLworI2RlZmluZSBGUEUJCQkweDEwCQkvKiBGb3JjZSBQYXJpdHkgRXJyb3IgT24gVHJhbnNtaXQJKi8KKyNkZWZpbmUgRkZFCQkJMHgyMAkJLyogRm9yY2UgRnJhbWluZyBFcnJvciBPbiBUcmFuc21pdAkqLworCisKKy8qICoqKioqKioqKioqICBTRVJJQUwgUEVSSVBIRVJBTCBJTlRFUkZBQ0UgKFNQSSkgTUFTS1MgICoqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBTUElfQ1RMIE1hc2tzCQkJCQkJCQkJCQkJCQkJCQkqLworI2RlZmluZQlUSU1PRAkJMHgwMDAzCQkvKiBUcmFuc2ZlciBJbml0aWF0ZSBNb2RlCQkJCQkJCSovCisjZGVmaW5lIFJEQlJfQ09SRQkweDAwMDAJCS8qIAkJUkRCUiBSZWFkIEluaXRpYXRlcywgSVJRIFdoZW4gUkRCUiBGdWxsCQkqLworI2RlZmluZQlUREJSX0NPUkUJMHgwMDAxCQkvKiAJCVREQlIgV3JpdGUgSW5pdGlhdGVzLCBJUlEgV2hlbiBUREJSIEVtcHR5CSovCisjZGVmaW5lIFJEQlJfRE1BCTB4MDAwMgkJLyogCQlETUEgUmVhZCwgRE1BIFVudGlsIEZJRk8gRW1wdHkJCQkJKi8KKyNkZWZpbmUgVERCUl9ETUEJMHgwMDAzCQkvKiAJCURNQSBXcml0ZSwgRE1BIFVudGlsIEZJRk8gRnVsbAkJCQkqLworI2RlZmluZSBTWgkJCTB4MDAwNAkJLyogU2VuZCBaZXJvIChXaGVuIFREQlIgRW1wdHksIFNlbmQgWmVyby9MYXN0KikJCSovCisjZGVmaW5lIEdNCQkJMHgwMDA4CQkvKiBHZXQgTW9yZSAoV2hlbiBSREJSIEZ1bGwsIE92ZXJ3cml0ZS9EaXNjYXJkKikJKi8KKyNkZWZpbmUgUFNTRQkJMHgwMDEwCQkvKiBTbGF2ZS1TZWxlY3QgSW5wdXQgRW5hYmxlCQkJCQkJKi8KKyNkZWZpbmUgRU1JU08JCTB4MDAyMAkJLyogRW5hYmxlIE1JU08gQXMgT3V0cHV0CQkJCQkJCSovCisjZGVmaW5lIFNJWkUJCTB4MDEwMAkJLyogU2l6ZSBvZiBXb3JkcyAoMTYvOCogQml0cykJCQkJCQkqLworI2RlZmluZSBMU0JGCQkweDAyMDAJCS8qIExTQiBGaXJzdAkJCQkJCQkJCQkqLworI2RlZmluZSBDUEhBCQkweDA0MDAJCS8qIENsb2NrIFBoYXNlCQkJCQkJCQkJCSovCisjZGVmaW5lIENQT0wJCTB4MDgwMAkJLyogQ2xvY2sgUG9sYXJpdHkJCQkJCQkJCQkqLworI2RlZmluZSBNU1RSCQkweDEwMDAJCS8qIE1hc3Rlci9TbGF2ZSoJCQkJCQkJCQkqLworI2RlZmluZSBXT00JCQkweDIwMDAJCS8qIFdyaXRlIE9wZW4gRHJhaW4gTWFzdGVyCQkJCQkJCSovCisjZGVmaW5lIFNQRQkJCTB4NDAwMAkJLyogU1BJIEVuYWJsZQkJCQkJCQkJCQkqLworCisvKiBTUElfRkxHIE1hc2tzCQkJCQkJCQkJCQkJCQkJCQkqLworI2RlZmluZSBGTFMxCQkweDAwMDIJCS8qIEVuYWJsZXMgU1BJX0ZMT1VUMSBhcyBTUEkgU2xhdmUtU2VsZWN0IE91dHB1dAkqLworI2RlZmluZSBGTFMyCQkweDAwMDQJCS8qIEVuYWJsZXMgU1BJX0ZMT1VUMiBhcyBTUEkgU2xhdmUtU2VsZWN0IE91dHB1dAkqLworI2RlZmluZSBGTFMzCQkweDAwMDgJCS8qIEVuYWJsZXMgU1BJX0ZMT1VUMyBhcyBTUEkgU2xhdmUtU2VsZWN0IE91dHB1dAkqLworI2RlZmluZSBGTFM0CQkweDAwMTAJCS8qIEVuYWJsZXMgU1BJX0ZMT1VUNCBhcyBTUEkgU2xhdmUtU2VsZWN0IE91dHB1dAkqLworI2RlZmluZSBGTFM1CQkweDAwMjAJCS8qIEVuYWJsZXMgU1BJX0ZMT1VUNSBhcyBTUEkgU2xhdmUtU2VsZWN0IE91dHB1dAkqLworI2RlZmluZSBGTFM2CQkweDAwNDAJCS8qIEVuYWJsZXMgU1BJX0ZMT1VUNiBhcyBTUEkgU2xhdmUtU2VsZWN0IE91dHB1dAkqLworI2RlZmluZSBGTFM3CQkweDAwODAJCS8qIEVuYWJsZXMgU1BJX0ZMT1VUNyBhcyBTUEkgU2xhdmUtU2VsZWN0IE91dHB1dAkqLworI2RlZmluZSBGTEcxCQkweEZERkYJCS8qIEFjdGl2YXRlcyBTUElfRkxPVVQxIAkJCQkJCQkqLworI2RlZmluZSBGTEcyCQkweEZCRkYJCS8qIEFjdGl2YXRlcyBTUElfRkxPVVQyCQkJCQkJCQkqLworI2RlZmluZSBGTEczCQkweEY3RkYJCS8qIEFjdGl2YXRlcyBTUElfRkxPVVQzCQkJCQkJCQkqLworI2RlZmluZSBGTEc0CQkweEVGRkYJCS8qIEFjdGl2YXRlcyBTUElfRkxPVVQ0CQkJCQkJCQkqLworI2RlZmluZSBGTEc1CQkweERGRkYJCS8qIEFjdGl2YXRlcyBTUElfRkxPVVQ1CQkJCQkJCQkqLworI2RlZmluZSBGTEc2CQkweEJGRkYJCS8qIEFjdGl2YXRlcyBTUElfRkxPVVQ2CQkJCQkJCQkqLworI2RlZmluZSBGTEc3CQkweDdGRkYJCS8qIEFjdGl2YXRlcyBTUElfRkxPVVQ3CQkJCQkJCQkqLworCisvKiBTUElfU1RBVCBNYXNrcwkJCQkJCQkJCQkJCQkJCQkJCQkJKi8KKyNkZWZpbmUgU1BJRgkJMHgwMDAxCQkvKiBTUEkgRmluaXNoZWQgKFNpbmdsZS1Xb3JkIFRyYW5zZmVyIENvbXBsZXRlKQkJCQkJKi8KKyNkZWZpbmUgTU9ERgkJMHgwMDAyCQkvKiBNb2RlIEZhdWx0IEVycm9yIChBbm90aGVyIERldmljZSBUcmllZCBUbyBCZWNvbWUgTWFzdGVyKQkJKi8KKyNkZWZpbmUgVFhFCQkJMHgwMDA0CQkvKiBUcmFuc21pc3Npb24gRXJyb3IgKERhdGEgU2VudCBXaXRoIE5vIE5ldyBEYXRhIEluIFREQlIpCQkqLworI2RlZmluZSBUWFMJCQkweDAwMDgJCS8qIFNQSV9UREJSIERhdGEgQnVmZmVyIFN0YXR1cyAoRnVsbC9FbXB0eSopCQkJCQkqLworI2RlZmluZSBSQlNZCQkweDAwMTAJCS8qIFJlY2VpdmUgRXJyb3IgKERhdGEgUmVjZWl2ZWQgV2l0aCBSREJSIEZ1bGwpCQkJCQkqLworI2RlZmluZSBSWFMJCQkweDAwMjAJCS8qIFNQSV9SREJSIERhdGEgQnVmZmVyIFN0YXR1cyAoRnVsbC9FbXB0eSopCQkJCQkqLworI2RlZmluZSBUWENPTAkJMHgwMDQwCQkvKiBUcmFuc21pdCBDb2xsaXNpb24gRXJyb3IgKENvcnJ1cHQgRGF0YSBNYXkgSGF2ZSBCZWVuIFNlbnQpCSovCisKKworLyogICoqKioqKioqKioqKioqKiogIEdFTkVSQUwgUFVSUE9TRSBUSU1FUiBNQVNLUyAgKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFRJTUVSX0VOQUJMRSBNYXNrcwkJCQkJCQkJCQkJCQkqLworI2RlZmluZSBUSU1FTjAJCQkweDAwMDEJCS8qIEVuYWJsZSBUaW1lciAwCQkJCQkqLworI2RlZmluZSBUSU1FTjEJCQkweDAwMDIJCS8qIEVuYWJsZSBUaW1lciAxCQkJCQkqLworI2RlZmluZSBUSU1FTjIJCQkweDAwMDQJCS8qIEVuYWJsZSBUaW1lciAyCQkJCQkqLworI2RlZmluZSBUSU1FTjMJCQkweDAwMDgJCS8qIEVuYWJsZSBUaW1lciAzCQkJCQkqLworI2RlZmluZSBUSU1FTjQJCQkweDAwMTAJCS8qIEVuYWJsZSBUaW1lciA0CQkJCQkqLworI2RlZmluZSBUSU1FTjUJCQkweDAwMjAJCS8qIEVuYWJsZSBUaW1lciA1CQkJCQkqLworI2RlZmluZSBUSU1FTjYJCQkweDAwNDAJCS8qIEVuYWJsZSBUaW1lciA2CQkJCQkqLworI2RlZmluZSBUSU1FTjcJCQkweDAwODAJCS8qIEVuYWJsZSBUaW1lciA3CQkJCQkqLworCisvKiBUSU1FUl9ESVNBQkxFIE1hc2tzCQkJCQkJCQkJCQkJCSovCisjZGVmaW5lIFRJTURJUzAJCQlUSU1FTjAJCS8qIERpc2FibGUgVGltZXIgMAkJCQkJKi8KKyNkZWZpbmUgVElNRElTMQkJCVRJTUVOMQkJLyogRGlzYWJsZSBUaW1lciAxCQkJCQkqLworI2RlZmluZSBUSU1ESVMyCQkJVElNRU4yCQkvKiBEaXNhYmxlIFRpbWVyIDIJCQkJCSovCisjZGVmaW5lIFRJTURJUzMJCQlUSU1FTjMJCS8qIERpc2FibGUgVGltZXIgMwkJCQkJKi8KKyNkZWZpbmUgVElNRElTNAkJCVRJTUVONAkJLyogRGlzYWJsZSBUaW1lciA0CQkJCQkqLworI2RlZmluZSBUSU1ESVM1CQkJVElNRU41CQkvKiBEaXNhYmxlIFRpbWVyIDUJCQkJCSovCisjZGVmaW5lIFRJTURJUzYJCQlUSU1FTjYJCS8qIERpc2FibGUgVGltZXIgNgkJCQkJKi8KKyNkZWZpbmUgVElNRElTNwkJCVRJTUVONwkJLyogRGlzYWJsZSBUaW1lciA3CQkJCQkqLworCisvKiBUSU1FUl9TVEFUVVMgTWFza3MJCQkJCQkJCQkJCQkJKi8KKyNkZWZpbmUgVElNSUwwCQkJMHgwMDAwMDAwMQkvKiBUaW1lciAwIEludGVycnVwdAkJCQkqLworI2RlZmluZSBUSU1JTDEJCQkweDAwMDAwMDAyCS8qIFRpbWVyIDEgSW50ZXJydXB0CQkJCSovCisjZGVmaW5lIFRJTUlMMgkJCTB4MDAwMDAwMDQJLyogVGltZXIgMiBJbnRlcnJ1cHQJCQkJKi8KKyNkZWZpbmUgVElNSUwzCQkJMHgwMDAwMDAwOAkvKiBUaW1lciAzIEludGVycnVwdAkJCQkqLworI2RlZmluZSBUT1ZGX0VSUjAJCTB4MDAwMDAwMTAJLyogVGltZXIgMCBDb3VudGVyIE92ZXJmbG93CQkJKi8KKyNkZWZpbmUgVE9WRl9FUlIxCQkweDAwMDAwMDIwCS8qIFRpbWVyIDEgQ291bnRlciBPdmVyZmxvdwkJCSovCisjZGVmaW5lIFRPVkZfRVJSMgkJMHgwMDAwMDA0MAkvKiBUaW1lciAyIENvdW50ZXIgT3ZlcmZsb3cJCQkqLworI2RlZmluZSBUT1ZGX0VSUjMJCTB4MDAwMDAwODAJLyogVGltZXIgMyBDb3VudGVyIE92ZXJmbG93CQkJKi8KKyNkZWZpbmUgVFJVTjAJCQkweDAwMDAxMDAwCS8qIFRpbWVyIDAgU2xhdmUgRW5hYmxlIFN0YXR1cwkJKi8KKyNkZWZpbmUgVFJVTjEJCQkweDAwMDAyMDAwCS8qIFRpbWVyIDEgU2xhdmUgRW5hYmxlIFN0YXR1cwkJKi8KKyNkZWZpbmUgVFJVTjIJCQkweDAwMDA0MDAwCS8qIFRpbWVyIDIgU2xhdmUgRW5hYmxlIFN0YXR1cwkJKi8KKyNkZWZpbmUgVFJVTjMJCQkweDAwMDA4MDAwCS8qIFRpbWVyIDMgU2xhdmUgRW5hYmxlIFN0YXR1cwkJKi8KKyNkZWZpbmUgVElNSUw0CQkJMHgwMDAxMDAwMAkvKiBUaW1lciA0IEludGVycnVwdAkJCQkqLworI2RlZmluZSBUSU1JTDUJCQkweDAwMDIwMDAwCS8qIFRpbWVyIDUgSW50ZXJydXB0CQkJCSovCisjZGVmaW5lIFRJTUlMNgkJCTB4MDAwNDAwMDAJLyogVGltZXIgNiBJbnRlcnJ1cHQJCQkJKi8KKyNkZWZpbmUgVElNSUw3CQkJMHgwMDA4MDAwMAkvKiBUaW1lciA3IEludGVycnVwdAkJCQkqLworI2RlZmluZSBUT1ZGX0VSUjQJCTB4MDAxMDAwMDAJLyogVGltZXIgNCBDb3VudGVyIE92ZXJmbG93CQkJKi8KKyNkZWZpbmUgVE9WRl9FUlI1CQkweDAwMjAwMDAwCS8qIFRpbWVyIDUgQ291bnRlciBPdmVyZmxvdwkJCSovCisjZGVmaW5lIFRPVkZfRVJSNgkJMHgwMDQwMDAwMAkvKiBUaW1lciA2IENvdW50ZXIgT3ZlcmZsb3cJCQkqLworI2RlZmluZSBUT1ZGX0VSUjcJCTB4MDA4MDAwMDAJLyogVGltZXIgNyBDb3VudGVyIE92ZXJmbG93CQkJKi8KKyNkZWZpbmUgVFJVTjQJCQkweDEwMDAwMDAwCS8qIFRpbWVyIDQgU2xhdmUgRW5hYmxlIFN0YXR1cwkJKi8KKyNkZWZpbmUgVFJVTjUJCQkweDIwMDAwMDAwCS8qIFRpbWVyIDUgU2xhdmUgRW5hYmxlIFN0YXR1cwkJKi8KKyNkZWZpbmUgVFJVTjYJCQkweDQwMDAwMDAwCS8qIFRpbWVyIDYgU2xhdmUgRW5hYmxlIFN0YXR1cwkJKi8KKyNkZWZpbmUgVFJVTjcJCQkweDgwMDAwMDAwCS8qIFRpbWVyIDcgU2xhdmUgRW5hYmxlIFN0YXR1cwkJKi8KKworLyogQWx0ZXJuYXRlIERlcHJlY2F0ZWQgTWFjcm9zIFByb3ZpZGVkIEZvciBCYWNrd2FyZHMgQ29kZSBDb21wYXRpYmlsaXR5ICovCisjZGVmaW5lIFRPVkxfRVJSMCBUT1ZGX0VSUjAKKyNkZWZpbmUgVE9WTF9FUlIxIFRPVkZfRVJSMQorI2RlZmluZSBUT1ZMX0VSUjIgVE9WRl9FUlIyCisjZGVmaW5lIFRPVkxfRVJSMyBUT1ZGX0VSUjMKKyNkZWZpbmUgVE9WTF9FUlI0IFRPVkZfRVJSNAorI2RlZmluZSBUT1ZMX0VSUjUgVE9WRl9FUlI1CisjZGVmaW5lIFRPVkxfRVJSNiBUT1ZGX0VSUjYKKyNkZWZpbmUgVE9WTF9FUlI3IFRPVkZfRVJSNworCisvKiBUSU1FUnhfQ09ORklHIE1hc2tzCQkJCQkJCQkJCQkJCSovCisjZGVmaW5lIFBXTV9PVVQJCQkweDAwMDEJLyogUHVsc2UtV2lkdGggTW9kdWxhdGlvbiBPdXRwdXQgTW9kZQkqLworI2RlZmluZSBXRFRIX0NBUAkJMHgwMDAyCS8qIFdpZHRoIENhcHR1cmUgSW5wdXQgTW9kZQkJCQkqLworI2RlZmluZSBFWFRfQ0xLCQkJMHgwMDAzCS8qIEV4dGVybmFsIENsb2NrIE1vZGUJCQkJCSovCisjZGVmaW5lIFBVTFNFX0hJCQkweDAwMDQJLyogQWN0aW9uIFB1bHNlIChQb3NpdGl2ZS9OZWdhdGl2ZSopCSovCisjZGVmaW5lIFBFUklPRF9DTlQJCTB4MDAwOAkvKiBQZXJpb2QgQ291bnQJCQkJCQkJKi8KKyNkZWZpbmUgSVJRX0VOQQkJCTB4MDAxMAkvKiBJbnRlcnJ1cHQgUmVxdWVzdCBFbmFibGUJCQkJKi8KKyNkZWZpbmUgVElOX1NFTAkJCTB4MDAyMAkvKiBUaW1lciBJbnB1dCBTZWxlY3QJCQkJCSovCisjZGVmaW5lIE9VVF9ESVMJCQkweDAwNDAJLyogT3V0cHV0IFBhZCBEaXNhYmxlCQkJCQkqLworI2RlZmluZSBDTEtfU0VMCQkJMHgwMDgwCS8qIFRpbWVyIENsb2NrIFNlbGVjdAkJCQkJKi8KKyNkZWZpbmUgVE9HR0xFX0hJCQkweDAxMDAJLyogUFdNX09VVCBQVUxTRV9ISSBUb2dnbGUgTW9kZQkJCSovCisjZGVmaW5lIEVNVV9SVU4JCQkweDAyMDAJLyogRW11bGF0aW9uIEJlaGF2aW9yIFNlbGVjdAkJCSovCisjZGVmaW5lIEVSUl9UWVAJCQkweEMwMDAJLyogRXJyb3IgVHlwZQkJCQkJCQkqLworCisKKy8qICoqKioqKioqKioqKioqKioqKiAgIEdQSU8gUE9SVFMgRiwgRywgSCBNQVNLUyAgKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgR2VuZXJhbCBQdXJwb3NlIElPICgweEZGQzAwNzAwIC0gMHhGRkMwMDdGRikgIE1hc2tzIAkJCQkqLworLyogUG9ydCBGIE1hc2tzIAkJCQkJCQkJCQkJCQkJKi8KKyNkZWZpbmUgUEYwCQkweDAwMDEKKyNkZWZpbmUgUEYxCQkweDAwMDIKKyNkZWZpbmUgUEYyCQkweDAwMDQKKyNkZWZpbmUgUEYzCQkweDAwMDgKKyNkZWZpbmUgUEY0CQkweDAwMTAKKyNkZWZpbmUgUEY1CQkweDAwMjAKKyNkZWZpbmUgUEY2CQkweDAwNDAKKyNkZWZpbmUgUEY3CQkweDAwODAKKyNkZWZpbmUgUEY4CQkweDAxMDAKKyNkZWZpbmUgUEY5CQkweDAyMDAKKyNkZWZpbmUgUEYxMAkweDA0MDAKKyNkZWZpbmUgUEYxMQkweDA4MDAKKyNkZWZpbmUgUEYxMgkweDEwMDAKKyNkZWZpbmUgUEYxMwkweDIwMDAKKyNkZWZpbmUgUEYxNAkweDQwMDAKKyNkZWZpbmUgUEYxNQkweDgwMDAKKworLyogUG9ydCBHIE1hc2tzCQkJCQkJCQkJCQkJCQkJKi8KKyNkZWZpbmUgUEcwCQkweDAwMDEKKyNkZWZpbmUgUEcxCQkweDAwMDIKKyNkZWZpbmUgUEcyCQkweDAwMDQKKyNkZWZpbmUgUEczCQkweDAwMDgKKyNkZWZpbmUgUEc0CQkweDAwMTAKKyNkZWZpbmUgUEc1CQkweDAwMjAKKyNkZWZpbmUgUEc2CQkweDAwNDAKKyNkZWZpbmUgUEc3CQkweDAwODAKKyNkZWZpbmUgUEc4CQkweDAxMDAKKyNkZWZpbmUgUEc5CQkweDAyMDAKKyNkZWZpbmUgUEcxMAkweDA0MDAKKyNkZWZpbmUgUEcxMQkweDA4MDAKKyNkZWZpbmUgUEcxMgkweDEwMDAKKyNkZWZpbmUgUEcxMwkweDIwMDAKKyNkZWZpbmUgUEcxNAkweDQwMDAKKyNkZWZpbmUgUEcxNQkweDgwMDAKKworLyogUG9ydCBIIE1hc2tzCQkJCQkJCQkJCQkJCQkJKi8KKyNkZWZpbmUgUEgwCQkweDAwMDEKKyNkZWZpbmUgUEgxCQkweDAwMDIKKyNkZWZpbmUgUEgyCQkweDAwMDQKKyNkZWZpbmUgUEgzCQkweDAwMDgKKyNkZWZpbmUgUEg0CQkweDAwMTAKKyNkZWZpbmUgUEg1CQkweDAwMjAKKyNkZWZpbmUgUEg2CQkweDAwNDAKKyNkZWZpbmUgUEg3CQkweDAwODAKKworCisvKiAqKioqKioqKioqKioqKioqKioqICBTRVJJQUwgUE9SVCBNQVNLUyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBTUE9SVHhfVENSMSBNYXNrcwkJCQkJCQkJCQkJCQkJCSovCisjZGVmaW5lIFRTUEVOCQkweDAwMDEJCS8qIFRyYW5zbWl0IEVuYWJsZQkJCQkJCQkJKi8KKyNkZWZpbmUgSVRDTEsJCTB4MDAwMgkJLyogSW50ZXJuYWwgVHJhbnNtaXQgQ2xvY2sgU2VsZWN0CQkJCSovCisjZGVmaW5lIERUWVBFX05PUk0JMHgwMDA0CQkvKiBEYXRhIEZvcm1hdCBOb3JtYWwJCQkJCQkJKi8KKyNkZWZpbmUgRFRZUEVfVUxBVwkweDAwMDgJCS8qIENvbXBhbmQgVXNpbmcgdS1MYXcJCQkJCQkJKi8KKyNkZWZpbmUgRFRZUEVfQUxBVwkweDAwMEMJCS8qIENvbXBhbmQgVXNpbmcgQS1MYXcJCQkJCQkJKi8KKyNkZWZpbmUgVExTQklUCQkweDAwMTAJCS8qIFRyYW5zbWl0IEJpdCBPcmRlcgkJCQkJCQkqLworI2RlZmluZSBJVEZTCQkweDAyMDAJCS8qIEludGVybmFsIFRyYW5zbWl0IEZyYW1lIFN5bmMgU2VsZWN0CQkJKi8KKyNkZWZpbmUgVEZTUgkJMHgwNDAwCQkvKiBUcmFuc21pdCBGcmFtZSBTeW5jIFJlcXVpcmVkIFNlbGVjdAkJCSovCisjZGVmaW5lIERJVEZTCQkweDA4MDAJCS8qIERhdGEtSW5kZXBlbmRlbnQgVHJhbnNtaXQgRnJhbWUgU3luYyBTZWxlY3QJKi8KKyNkZWZpbmUgTFRGUwkJMHgxMDAwCQkvKiBMb3cgVHJhbnNtaXQgRnJhbWUgU3luYyBTZWxlY3QJCQkJKi8KKyNkZWZpbmUgTEFURlMJCTB4MjAwMAkJLyogTGF0ZSBUcmFuc21pdCBGcmFtZSBTeW5jIFNlbGVjdAkJCQkqLworI2RlZmluZSBUQ0tGRQkJMHg0MDAwCQkvKiBDbG9jayBGYWxsaW5nIEVkZ2UgU2VsZWN0CQkJCQkqLworCisvKiBTUE9SVHhfVENSMiBNYXNrcyBhbmQgTWFjcm8JCQkJCQkJCQkJCQkJKi8KKyNkZWZpbmUgU0xFTih4KQkJKCh4KSYweDFGKQkvKiBTUE9SVCBUWCBXb3JkIExlbmd0aCAoMiAtIDMxKQkJCQkqLworI2RlZmluZSBUWFNFCQkweDAxMDAJCS8qIFRYIFNlY29uZGFyeSBFbmFibGUJCQkJCQkJKi8KKyNkZWZpbmUgVFNGU0UJCTB4MDIwMAkJLyogVHJhbnNtaXQgU3RlcmVvIEZyYW1lIFN5bmMgRW5hYmxlCQkJKi8KKyNkZWZpbmUgVFJGU1QJCTB4MDQwMAkJLyogTGVmdC9SaWdodCBPcmRlciAoMSA9IFJpZ2h0IENoYW5uZWwgMXN0KQkJKi8KKworLyogU1BPUlR4X1JDUjEgTWFza3MJCQkJCQkJCQkJCQkJCQkqLworI2RlZmluZSBSU1BFTgkJMHgwMDAxCQkvKiBSZWNlaXZlIEVuYWJsZSAJCQkJCQkJCSovCisjZGVmaW5lIElSQ0xLCQkweDAwMDIJCS8qIEludGVybmFsIFJlY2VpdmUgQ2xvY2sgU2VsZWN0IAkJCQkqLworI2RlZmluZSBEVFlQRV9OT1JNCTB4MDAwNAkJLyogRGF0YSBGb3JtYXQgTm9ybWFsCQkJCQkJCSovCisjZGVmaW5lIERUWVBFX1VMQVcJMHgwMDA4CQkvKiBDb21wYW5kIFVzaW5nIHUtTGF3CQkJCQkJCSovCisjZGVmaW5lIERUWVBFX0FMQVcJMHgwMDBDCQkvKiBDb21wYW5kIFVzaW5nIEEtTGF3CQkJCQkJCSovCisjZGVmaW5lIFJMU0JJVAkJMHgwMDEwCQkvKiBSZWNlaXZlIEJpdCBPcmRlcgkJCQkJCQkqLworI2RlZmluZSBJUkZTCQkweDAyMDAJCS8qIEludGVybmFsIFJlY2VpdmUgRnJhbWUgU3luYyBTZWxlY3QgCQkJKi8KKyNkZWZpbmUgUkZTUgkJMHgwNDAwCQkvKiBSZWNlaXZlIEZyYW1lIFN5bmMgUmVxdWlyZWQgU2VsZWN0IAkJCSovCisjZGVmaW5lIExSRlMJCTB4MTAwMAkJLyogTG93IFJlY2VpdmUgRnJhbWUgU3luYyBTZWxlY3QgCQkJCSovCisjZGVmaW5lIExBUkZTCQkweDIwMDAJCS8qIExhdGUgUmVjZWl2ZSBGcmFtZSBTeW5jIFNlbGVjdCAJCQkJKi8KKyNkZWZpbmUgUkNLRkUJCTB4NDAwMAkJLyogQ2xvY2sgRmFsbGluZyBFZGdlIFNlbGVjdCAJCQkJCSovCisKKy8qIFNQT1JUeF9SQ1IyIE1hc2tzCQkJCQkJCQkJCQkJCQkJKi8KKyNkZWZpbmUgU0xFTih4KQkJKCh4KSYweDFGKQkvKiBTUE9SVCBSWCBXb3JkIExlbmd0aCAoMiAtIDMxKQkJCQkqLworI2RlZmluZSBSWFNFCQkweDAxMDAJCS8qIFJYIFNlY29uZGFyeSBFbmFibGUJCQkJCQkJKi8KKyNkZWZpbmUgUlNGU0UJCTB4MDIwMAkJLyogUlggU3RlcmVvIEZyYW1lIFN5bmMgRW5hYmxlCQkJCQkqLworI2RlZmluZSBSUkZTVAkJMHgwNDAwCQkvKiBSaWdodC1GaXJzdCBEYXRhIE9yZGVyIAkJCQkJCSovCisKKy8qIFNQT1JUeF9TVEFUIE1hc2tzCQkJCQkJCQkJCQkJCQkJKi8KKyNkZWZpbmUgUlhORQkJMHgwMDAxCQkvKiBSZWNlaXZlIEZJRk8gTm90IEVtcHR5IFN0YXR1cwkJCQkqLworI2RlZmluZSBSVVZGCQkweDAwMDIJCS8qIFN0aWNreSBSZWNlaXZlIFVuZGVyZmxvdyBTdGF0dXMJCQkJKi8KKyNkZWZpbmUgUk9WRgkJMHgwMDA0CQkvKiBTdGlja3kgUmVjZWl2ZSBPdmVyZmxvdyBTdGF0dXMJCQkJKi8KKyNkZWZpbmUgVFhGCQkJMHgwMDA4CQkvKiBUcmFuc21pdCBGSUZPIEZ1bGwgU3RhdHVzCQkJCQkqLworI2RlZmluZSBUVVZGCQkweDAwMTAJCS8qIFN0aWNreSBUcmFuc21pdCBVbmRlcmZsb3cgU3RhdHVzCQkJCSovCisjZGVmaW5lIFRPVkYJCTB4MDAyMAkJLyogU3RpY2t5IFRyYW5zbWl0IE92ZXJmbG93IFN0YXR1cwkJCQkqLworI2RlZmluZSBUWEhSRQkJMHgwMDQwCQkvKiBUcmFuc21pdCBIb2xkIFJlZ2lzdGVyIEVtcHR5CQkJCQkqLworCisvKiBTUE9SVHhfTUNNQzEgTWFjcm9zCQkJCQkJCQkJCQkJCQkJKi8KKyNkZWZpbmUgU1BfV09GRih4KQkoKHgpICYgMHgzRkYpIAkvKiBNdWx0aWNoYW5uZWwgV2luZG93IE9mZnNldCBGaWVsZAkJCSovCisKKy8qIE9ubHkgdXNlIFdTSVpFIE1hY3JvIFdpdGggTG9naWMgT1IgV2hpbGUgU2V0dGluZyBMb3dlciBPcmRlciBCaXRzCQkJCQkJKi8KKyNkZWZpbmUgU1BfV1NJWkUoeCkJKCgoKCh4KT4+MHgzKS0xKSYweEYpIDw8IDB4QykJLyogTXVsdGljaGFubmVsIFdpbmRvdyBTaXplID0gKHgvOCktMQkqLworCisvKiBTUE9SVHhfTUNNQzIgTWFza3MJCQkJCQkJCQkJCQkJCQkqLworI2RlZmluZSBSRUNfQllQQVNTCTB4MDAwMAkJLyogQnlwYXNzIE1vZGUgKE5vIENsb2NrIFJlY292ZXJ5KQkJCQkqLworI2RlZmluZSBSRUNfMkZST000CTB4MDAwMgkJLyogUmVjb3ZlciAyIE1IeiBDbG9jayBmcm9tIDQgTUh6IENsb2NrCQkJKi8KKyNkZWZpbmUgUkVDXzhGUk9NMTYJMHgwMDAzCQkvKiBSZWNvdmVyIDggTUh6IENsb2NrIGZyb20gMTYgTUh6IENsb2NrCQkqLworI2RlZmluZSBNQ0RUWFBFCQkweDAwMDQgCQkvKiBNdWx0aWNoYW5uZWwgRE1BIFRyYW5zbWl0IFBhY2tpbmcJCQkqLworI2RlZmluZSBNQ0RSWFBFCQkweDAwMDggCQkvKiBNdWx0aWNoYW5uZWwgRE1BIFJlY2VpdmUgUGFja2luZwkJCQkqLworI2RlZmluZSBNQ01FTgkJMHgwMDEwIAkJLyogTXVsdGljaGFubmVsIEZyYW1lIE1vZGUgRW5hYmxlCQkJCSovCisjZGVmaW5lIEZTRFIJCTB4MDA4MCAJCS8qIE11bHRpY2hhbm5lbCBGcmFtZSBTeW5jIHRvIERhdGEgUmVsYXRpb25zaGlwCSovCisjZGVmaW5lIE1GRF8wCQkweDAwMDAJCS8qIE11bHRpY2hhbm5lbCBGcmFtZSBEZWxheSA9IDAJCQkJCSovCisjZGVmaW5lIE1GRF8xCQkweDEwMDAJCS8qIE11bHRpY2hhbm5lbCBGcmFtZSBEZWxheSA9IDEJCQkJCSovCisjZGVmaW5lIE1GRF8yCQkweDIwMDAJCS8qIE11bHRpY2hhbm5lbCBGcmFtZSBEZWxheSA9IDIJCQkJCSovCisjZGVmaW5lIE1GRF8zCQkweDMwMDAJCS8qIE11bHRpY2hhbm5lbCBGcmFtZSBEZWxheSA9IDMJCQkJCSovCisjZGVmaW5lIE1GRF80CQkweDQwMDAJCS8qIE11bHRpY2hhbm5lbCBGcmFtZSBEZWxheSA9IDQJCQkJCSovCisjZGVmaW5lIE1GRF81CQkweDUwMDAJCS8qIE11bHRpY2hhbm5lbCBGcmFtZSBEZWxheSA9IDUJCQkJCSovCisjZGVmaW5lIE1GRF82CQkweDYwMDAJCS8qIE11bHRpY2hhbm5lbCBGcmFtZSBEZWxheSA9IDYJCQkJCSovCisjZGVmaW5lIE1GRF83CQkweDcwMDAJCS8qIE11bHRpY2hhbm5lbCBGcmFtZSBEZWxheSA9IDcJCQkJCSovCisjZGVmaW5lIE1GRF84CQkweDgwMDAJCS8qIE11bHRpY2hhbm5lbCBGcmFtZSBEZWxheSA9IDgJCQkJCSovCisjZGVmaW5lIE1GRF85CQkweDkwMDAJCS8qIE11bHRpY2hhbm5lbCBGcmFtZSBEZWxheSA9IDkJCQkJCSovCisjZGVmaW5lIE1GRF8xMAkJMHhBMDAwCQkvKiBNdWx0aWNoYW5uZWwgRnJhbWUgRGVsYXkgPSAxMAkJCQkqLworI2RlZmluZSBNRkRfMTEJCTB4QjAwMAkJLyogTXVsdGljaGFubmVsIEZyYW1lIERlbGF5ID0gMTEJCQkJKi8KKyNkZWZpbmUgTUZEXzEyCQkweEMwMDAJCS8qIE11bHRpY2hhbm5lbCBGcmFtZSBEZWxheSA9IDEyCQkJCSovCisjZGVmaW5lIE1GRF8xMwkJMHhEMDAwCQkvKiBNdWx0aWNoYW5uZWwgRnJhbWUgRGVsYXkgPSAxMwkJCQkqLworI2RlZmluZSBNRkRfMTQJCTB4RTAwMAkJLyogTXVsdGljaGFubmVsIEZyYW1lIERlbGF5ID0gMTQJCQkJKi8KKyNkZWZpbmUgTUZEXzE1CQkweEYwMDAJCS8qIE11bHRpY2hhbm5lbCBGcmFtZSBEZWxheSA9IDE1CQkJCSovCisKKworLyogKioqKioqKioqKioqKioqKioqKioqICBBU1lOQ0hST05PVVMgTUVNT1JZIENPTlRST0xMRVIgTUFTS1MgICoqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBFQklVX0FNR0NUTCBNYXNrcwkJCQkJCQkJCQkJCQkJCQkJKi8KKyNkZWZpbmUgQU1DS0VOCQkJMHgwMDAxCQkvKiBFbmFibGUgQ0xLT1VUCQkJCQkJCQkJKi8KKyNkZWZpbmUJQU1CRU5fTk9ORQkJMHgwMDAwCQkvKiBBbGwgQmFua3MgRGlzYWJsZWQJCQkJCQkJCSovCisjZGVmaW5lIEFNQkVOX0IwCQkweDAwMDIJCS8qIEVuYWJsZSBBc3luYyBNZW1vcnkgQmFuayAwIG9ubHkJCQkJCSovCisjZGVmaW5lIEFNQkVOX0IwX0IxCQkweDAwMDQJCS8qIEVuYWJsZSBBc3luYyBNZW1vcnkgQmFua3MgMCAmIDEgb25seQkJCQkqLworI2RlZmluZSBBTUJFTl9CMF9CMV9CMgkweDAwMDYJCS8qIEVuYWJsZSBBc3luYyBNZW1vcnkgQmFua3MgMCwgMSwgYW5kIDIJCQkqLworI2RlZmluZSBBTUJFTl9BTEwJCTB4MDAwOAkJLyogRW5hYmxlIEFzeW5jIE1lbW9yeSBCYW5rcyAoYWxsKSAwLCAxLCAyLCBhbmQgMwkqLworCisvKiBFQklVX0FNQkNUTDAgTWFza3MJCQkJCQkJCQkJCQkJCQkJCSovCisjZGVmaW5lIEIwUkRZRU4JCQkweDAwMDAwMDAxICAvKiBCYW5rIDAgKEIwKSBSRFkgRW5hYmxlCQkJCQkJCSovCisjZGVmaW5lIEIwUkRZUE9MCQkweDAwMDAwMDAyICAvKiBCMCBSRFkgQWN0aXZlIEhpZ2gJCQkJCQkJCSovCisjZGVmaW5lIEIwVFRfMQkJCTB4MDAwMDAwMDQgIC8qIEIwIFRyYW5zaXRpb24gVGltZSAoUmVhZCB0byBXcml0ZSkgPSAxIGN5Y2xlCQkqLworI2RlZmluZSBCMFRUXzIJCQkweDAwMDAwMDA4ICAvKiBCMCBUcmFuc2l0aW9uIFRpbWUgKFJlYWQgdG8gV3JpdGUpID0gMiBjeWNsZXMJKi8KKyNkZWZpbmUgQjBUVF8zCQkJMHgwMDAwMDAwQyAgLyogQjAgVHJhbnNpdGlvbiBUaW1lIChSZWFkIHRvIFdyaXRlKSA9IDMgY3ljbGVzCSovCisjZGVmaW5lIEIwVFRfNAkJCTB4MDAwMDAwMDAgIC8qIEIwIFRyYW5zaXRpb24gVGltZSAoUmVhZCB0byBXcml0ZSkgPSA0IGN5Y2xlcwkqLworI2RlZmluZSBCMFNUXzEJCQkweDAwMDAwMDEwICAvKiBCMCBTZXR1cCBUaW1lIChBT0UgdG8gUmVhZC9Xcml0ZSkgPSAxIGN5Y2xlCQkqLworI2RlZmluZSBCMFNUXzIJCQkweDAwMDAwMDIwICAvKiBCMCBTZXR1cCBUaW1lIChBT0UgdG8gUmVhZC9Xcml0ZSkgPSAyIGN5Y2xlcwkJKi8KKyNkZWZpbmUgQjBTVF8zCQkJMHgwMDAwMDAzMCAgLyogQjAgU2V0dXAgVGltZSAoQU9FIHRvIFJlYWQvV3JpdGUpID0gMyBjeWNsZXMJCSovCisjZGVmaW5lIEIwU1RfNAkJCTB4MDAwMDAwMDAgIC8qIEIwIFNldHVwIFRpbWUgKEFPRSB0byBSZWFkL1dyaXRlKSA9IDQgY3ljbGVzCQkqLworI2RlZmluZSBCMEhUXzEJCQkweDAwMDAwMDQwICAvKiBCMCBIb2xkIFRpbWUgKH5SZWFkL1dyaXRlIHRvIH5BT0UpID0gMSBjeWNsZQkJKi8KKyNkZWZpbmUgQjBIVF8yCQkJMHgwMDAwMDA4MCAgLyogQjAgSG9sZCBUaW1lICh+UmVhZC9Xcml0ZSB0byB+QU9FKSA9IDIgY3ljbGVzCSovCisjZGVmaW5lIEIwSFRfMwkJCTB4MDAwMDAwQzAgIC8qIEIwIEhvbGQgVGltZSAoflJlYWQvV3JpdGUgdG8gfkFPRSkgPSAzIGN5Y2xlcwkqLworI2RlZmluZSBCMEhUXzAJCQkweDAwMDAwMDAwICAvKiBCMCBIb2xkIFRpbWUgKH5SZWFkL1dyaXRlIHRvIH5BT0UpID0gMCBjeWNsZXMJKi8KKyNkZWZpbmUgQjBSQVRfMQkJCTB4MDAwMDAxMDAgIC8qIEIwIFJlYWQgQWNjZXNzIFRpbWUgPSAxIGN5Y2xlCQkJCQkqLworI2RlZmluZSBCMFJBVF8yCQkJMHgwMDAwMDIwMCAgLyogQjAgUmVhZCBBY2Nlc3MgVGltZSA9IDIgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMFJBVF8zCQkJMHgwMDAwMDMwMCAgLyogQjAgUmVhZCBBY2Nlc3MgVGltZSA9IDMgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMFJBVF80CQkJMHgwMDAwMDQwMCAgLyogQjAgUmVhZCBBY2Nlc3MgVGltZSA9IDQgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMFJBVF81CQkJMHgwMDAwMDUwMCAgLyogQjAgUmVhZCBBY2Nlc3MgVGltZSA9IDUgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMFJBVF82CQkJMHgwMDAwMDYwMCAgLyogQjAgUmVhZCBBY2Nlc3MgVGltZSA9IDYgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMFJBVF83CQkJMHgwMDAwMDcwMCAgLyogQjAgUmVhZCBBY2Nlc3MgVGltZSA9IDcgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMFJBVF84CQkJMHgwMDAwMDgwMCAgLyogQjAgUmVhZCBBY2Nlc3MgVGltZSA9IDggY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMFJBVF85CQkJMHgwMDAwMDkwMCAgLyogQjAgUmVhZCBBY2Nlc3MgVGltZSA9IDkgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMFJBVF8xMAkJMHgwMDAwMEEwMCAgLyogQjAgUmVhZCBBY2Nlc3MgVGltZSA9IDEwIGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjBSQVRfMTEJCTB4MDAwMDBCMDAgIC8qIEIwIFJlYWQgQWNjZXNzIFRpbWUgPSAxMSBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIwUkFUXzEyCQkweDAwMDAwQzAwICAvKiBCMCBSZWFkIEFjY2VzcyBUaW1lID0gMTIgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMFJBVF8xMwkJMHgwMDAwMEQwMCAgLyogQjAgUmVhZCBBY2Nlc3MgVGltZSA9IDEzIGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjBSQVRfMTQJCTB4MDAwMDBFMDAgIC8qIEIwIFJlYWQgQWNjZXNzIFRpbWUgPSAxNCBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIwUkFUXzE1CQkweDAwMDAwRjAwICAvKiBCMCBSZWFkIEFjY2VzcyBUaW1lID0gMTUgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMFdBVF8xCQkJMHgwMDAwMTAwMCAgLyogQjAgV3JpdGUgQWNjZXNzIFRpbWUgPSAxIGN5Y2xlCQkJCQkqLworI2RlZmluZSBCMFdBVF8yCQkJMHgwMDAwMjAwMCAgLyogQjAgV3JpdGUgQWNjZXNzIFRpbWUgPSAyIGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjBXQVRfMwkJCTB4MDAwMDMwMDAgIC8qIEIwIFdyaXRlIEFjY2VzcyBUaW1lID0gMyBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIwV0FUXzQJCQkweDAwMDA0MDAwICAvKiBCMCBXcml0ZSBBY2Nlc3MgVGltZSA9IDQgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMFdBVF81CQkJMHgwMDAwNTAwMCAgLyogQjAgV3JpdGUgQWNjZXNzIFRpbWUgPSA1IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjBXQVRfNgkJCTB4MDAwMDYwMDAgIC8qIEIwIFdyaXRlIEFjY2VzcyBUaW1lID0gNiBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIwV0FUXzcJCQkweDAwMDA3MDAwICAvKiBCMCBXcml0ZSBBY2Nlc3MgVGltZSA9IDcgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMFdBVF84CQkJMHgwMDAwODAwMCAgLyogQjAgV3JpdGUgQWNjZXNzIFRpbWUgPSA4IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjBXQVRfOQkJCTB4MDAwMDkwMDAgIC8qIEIwIFdyaXRlIEFjY2VzcyBUaW1lID0gOSBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIwV0FUXzEwCQkweDAwMDBBMDAwICAvKiBCMCBXcml0ZSBBY2Nlc3MgVGltZSA9IDEwIGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjBXQVRfMTEJCTB4MDAwMEIwMDAgIC8qIEIwIFdyaXRlIEFjY2VzcyBUaW1lID0gMTEgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMFdBVF8xMgkJMHgwMDAwQzAwMCAgLyogQjAgV3JpdGUgQWNjZXNzIFRpbWUgPSAxMiBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIwV0FUXzEzCQkweDAwMDBEMDAwICAvKiBCMCBXcml0ZSBBY2Nlc3MgVGltZSA9IDEzIGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjBXQVRfMTQJCTB4MDAwMEUwMDAgIC8qIEIwIFdyaXRlIEFjY2VzcyBUaW1lID0gMTQgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMFdBVF8xNQkJMHgwMDAwRjAwMCAgLyogQjAgV3JpdGUgQWNjZXNzIFRpbWUgPSAxNSBjeWNsZXMJCQkJCSovCisKKyNkZWZpbmUgQjFSRFlFTgkJCTB4MDAwMTAwMDAgIC8qIEJhbmsgMSAoQjEpIFJEWSBFbmFibGUgICAgICAgICAgICAgICAgICAgICAgIAkqLworI2RlZmluZSBCMVJEWVBPTAkJMHgwMDAyMDAwMCAgLyogQjEgUkRZIEFjdGl2ZSBIaWdoICAgICAgICAgICAgICAgICAgICAgICAgICAgCSovCisjZGVmaW5lIEIxVFRfMQkJCTB4MDAwNDAwMDAgIC8qIEIxIFRyYW5zaXRpb24gVGltZSAoUmVhZCB0byBXcml0ZSkgPSAxIGN5Y2xlIAkqLworI2RlZmluZSBCMVRUXzIJCQkweDAwMDgwMDAwICAvKiBCMSBUcmFuc2l0aW9uIFRpbWUgKFJlYWQgdG8gV3JpdGUpID0gMiBjeWNsZXMJKi8KKyNkZWZpbmUgQjFUVF8zCQkJMHgwMDBDMDAwMCAgLyogQjEgVHJhbnNpdGlvbiBUaW1lIChSZWFkIHRvIFdyaXRlKSA9IDMgY3ljbGVzCSovCisjZGVmaW5lIEIxVFRfNAkJCTB4MDAwMDAwMDAgIC8qIEIxIFRyYW5zaXRpb24gVGltZSAoUmVhZCB0byBXcml0ZSkgPSA0IGN5Y2xlcwkqLworI2RlZmluZSBCMVNUXzEJCQkweDAwMTAwMDAwICAvKiBCMSBTZXR1cCBUaW1lIChBT0UgdG8gUmVhZC9Xcml0ZSkgPSAxIGN5Y2xlICAJKi8KKyNkZWZpbmUgQjFTVF8yCQkJMHgwMDIwMDAwMCAgLyogQjEgU2V0dXAgVGltZSAoQU9FIHRvIFJlYWQvV3JpdGUpID0gMiBjeWNsZXMgCSovCisjZGVmaW5lIEIxU1RfMwkJCTB4MDAzMDAwMDAgIC8qIEIxIFNldHVwIFRpbWUgKEFPRSB0byBSZWFkL1dyaXRlKSA9IDMgY3ljbGVzIAkqLworI2RlZmluZSBCMVNUXzQJCQkweDAwMDAwMDAwICAvKiBCMSBTZXR1cCBUaW1lIChBT0UgdG8gUmVhZC9Xcml0ZSkgPSA0IGN5Y2xlcyAJKi8KKyNkZWZpbmUgQjFIVF8xCQkJMHgwMDQwMDAwMCAgLyogQjEgSG9sZCBUaW1lICh+UmVhZC9Xcml0ZSB0byB+QU9FKSA9IDEgY3ljbGUgCSovCisjZGVmaW5lIEIxSFRfMgkJCTB4MDA4MDAwMDAgIC8qIEIxIEhvbGQgVGltZSAoflJlYWQvV3JpdGUgdG8gfkFPRSkgPSAyIGN5Y2xlcwkqLworI2RlZmluZSBCMUhUXzMJCQkweDAwQzAwMDAwICAvKiBCMSBIb2xkIFRpbWUgKH5SZWFkL1dyaXRlIHRvIH5BT0UpID0gMyBjeWNsZXMJKi8KKyNkZWZpbmUgQjFIVF8wCQkJMHgwMDAwMDAwMCAgLyogQjEgSG9sZCBUaW1lICh+UmVhZC9Xcml0ZSB0byB+QU9FKSA9IDAgY3ljbGVzCSovCisjZGVmaW5lIEIxUkFUXzEJCQkweDAxMDAwMDAwICAvKiBCMSBSZWFkIEFjY2VzcyBUaW1lID0gMSBjeWNsZQkJCQkJKi8KKyNkZWZpbmUgQjFSQVRfMgkJCTB4MDIwMDAwMDAgIC8qIEIxIFJlYWQgQWNjZXNzIFRpbWUgPSAyIGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjFSQVRfMwkJCTB4MDMwMDAwMDAgIC8qIEIxIFJlYWQgQWNjZXNzIFRpbWUgPSAzIGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjFSQVRfNAkJCTB4MDQwMDAwMDAgIC8qIEIxIFJlYWQgQWNjZXNzIFRpbWUgPSA0IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjFSQVRfNQkJCTB4MDUwMDAwMDAgIC8qIEIxIFJlYWQgQWNjZXNzIFRpbWUgPSA1IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjFSQVRfNgkJCTB4MDYwMDAwMDAgIC8qIEIxIFJlYWQgQWNjZXNzIFRpbWUgPSA2IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjFSQVRfNwkJCTB4MDcwMDAwMDAgIC8qIEIxIFJlYWQgQWNjZXNzIFRpbWUgPSA3IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjFSQVRfOAkJCTB4MDgwMDAwMDAgIC8qIEIxIFJlYWQgQWNjZXNzIFRpbWUgPSA4IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjFSQVRfOQkJCTB4MDkwMDAwMDAgIC8qIEIxIFJlYWQgQWNjZXNzIFRpbWUgPSA5IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjFSQVRfMTAJCTB4MEEwMDAwMDAgIC8qIEIxIFJlYWQgQWNjZXNzIFRpbWUgPSAxMCBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIxUkFUXzExCQkweDBCMDAwMDAwICAvKiBCMSBSZWFkIEFjY2VzcyBUaW1lID0gMTEgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMVJBVF8xMgkJMHgwQzAwMDAwMCAgLyogQjEgUmVhZCBBY2Nlc3MgVGltZSA9IDEyIGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjFSQVRfMTMJCTB4MEQwMDAwMDAgIC8qIEIxIFJlYWQgQWNjZXNzIFRpbWUgPSAxMyBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIxUkFUXzE0CQkweDBFMDAwMDAwICAvKiBCMSBSZWFkIEFjY2VzcyBUaW1lID0gMTQgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMVJBVF8xNQkJMHgwRjAwMDAwMCAgLyogQjEgUmVhZCBBY2Nlc3MgVGltZSA9IDE1IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjFXQVRfMQkJCTB4MTAwMDAwMDAgIC8qIEIxIFdyaXRlIEFjY2VzcyBUaW1lID0gMSBjeWNsZQkJCQkJKi8KKyNkZWZpbmUgQjFXQVRfMgkJCTB4MjAwMDAwMDAgIC8qIEIxIFdyaXRlIEFjY2VzcyBUaW1lID0gMiBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIxV0FUXzMJCQkweDMwMDAwMDAwICAvKiBCMSBXcml0ZSBBY2Nlc3MgVGltZSA9IDMgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMVdBVF80CQkJMHg0MDAwMDAwMCAgLyogQjEgV3JpdGUgQWNjZXNzIFRpbWUgPSA0IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjFXQVRfNQkJCTB4NTAwMDAwMDAgIC8qIEIxIFdyaXRlIEFjY2VzcyBUaW1lID0gNSBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIxV0FUXzYJCQkweDYwMDAwMDAwICAvKiBCMSBXcml0ZSBBY2Nlc3MgVGltZSA9IDYgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMVdBVF83CQkJMHg3MDAwMDAwMCAgLyogQjEgV3JpdGUgQWNjZXNzIFRpbWUgPSA3IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjFXQVRfOAkJCTB4ODAwMDAwMDAgIC8qIEIxIFdyaXRlIEFjY2VzcyBUaW1lID0gOCBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIxV0FUXzkJCQkweDkwMDAwMDAwICAvKiBCMSBXcml0ZSBBY2Nlc3MgVGltZSA9IDkgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMVdBVF8xMAkJMHhBMDAwMDAwMCAgLyogQjEgV3JpdGUgQWNjZXNzIFRpbWUgPSAxMCBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIxV0FUXzExCQkweEIwMDAwMDAwICAvKiBCMSBXcml0ZSBBY2Nlc3MgVGltZSA9IDExIGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjFXQVRfMTIJCTB4QzAwMDAwMDAgIC8qIEIxIFdyaXRlIEFjY2VzcyBUaW1lID0gMTIgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMVdBVF8xMwkJMHhEMDAwMDAwMCAgLyogQjEgV3JpdGUgQWNjZXNzIFRpbWUgPSAxMyBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIxV0FUXzE0CQkweEUwMDAwMDAwICAvKiBCMSBXcml0ZSBBY2Nlc3MgVGltZSA9IDE0IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjFXQVRfMTUJCTB4RjAwMDAwMDAgIC8qIEIxIFdyaXRlIEFjY2VzcyBUaW1lID0gMTUgY3ljbGVzCQkJCQkqLworCisvKiBFQklVX0FNQkNUTDEgTWFza3MJCQkJCQkJCQkJCQkJCQkJCSovCisjZGVmaW5lIEIyUkRZRU4JCQkweDAwMDAwMDAxICAvKiBCYW5rIDIgKEIyKSBSRFkgRW5hYmxlCQkJCQkJCSovCisjZGVmaW5lIEIyUkRZUE9MCQkweDAwMDAwMDAyICAvKiBCMiBSRFkgQWN0aXZlIEhpZ2gJCQkJCQkJCSovCisjZGVmaW5lIEIyVFRfMQkJCTB4MDAwMDAwMDQgIC8qIEIyIFRyYW5zaXRpb24gVGltZSAoUmVhZCB0byBXcml0ZSkgPSAxIGN5Y2xlCQkqLworI2RlZmluZSBCMlRUXzIJCQkweDAwMDAwMDA4ICAvKiBCMiBUcmFuc2l0aW9uIFRpbWUgKFJlYWQgdG8gV3JpdGUpID0gMiBjeWNsZXMJKi8KKyNkZWZpbmUgQjJUVF8zCQkJMHgwMDAwMDAwQyAgLyogQjIgVHJhbnNpdGlvbiBUaW1lIChSZWFkIHRvIFdyaXRlKSA9IDMgY3ljbGVzCSovCisjZGVmaW5lIEIyVFRfNAkJCTB4MDAwMDAwMDAgIC8qIEIyIFRyYW5zaXRpb24gVGltZSAoUmVhZCB0byBXcml0ZSkgPSA0IGN5Y2xlcwkqLworI2RlZmluZSBCMlNUXzEJCQkweDAwMDAwMDEwICAvKiBCMiBTZXR1cCBUaW1lIChBT0UgdG8gUmVhZC9Xcml0ZSkgPSAxIGN5Y2xlCQkqLworI2RlZmluZSBCMlNUXzIJCQkweDAwMDAwMDIwICAvKiBCMiBTZXR1cCBUaW1lIChBT0UgdG8gUmVhZC9Xcml0ZSkgPSAyIGN5Y2xlcwkJKi8KKyNkZWZpbmUgQjJTVF8zCQkJMHgwMDAwMDAzMCAgLyogQjIgU2V0dXAgVGltZSAoQU9FIHRvIFJlYWQvV3JpdGUpID0gMyBjeWNsZXMJCSovCisjZGVmaW5lIEIyU1RfNAkJCTB4MDAwMDAwMDAgIC8qIEIyIFNldHVwIFRpbWUgKEFPRSB0byBSZWFkL1dyaXRlKSA9IDQgY3ljbGVzCQkqLworI2RlZmluZSBCMkhUXzEJCQkweDAwMDAwMDQwICAvKiBCMiBIb2xkIFRpbWUgKH5SZWFkL1dyaXRlIHRvIH5BT0UpID0gMSBjeWNsZQkJKi8KKyNkZWZpbmUgQjJIVF8yCQkJMHgwMDAwMDA4MCAgLyogQjIgSG9sZCBUaW1lICh+UmVhZC9Xcml0ZSB0byB+QU9FKSA9IDIgY3ljbGVzCSovCisjZGVmaW5lIEIySFRfMwkJCTB4MDAwMDAwQzAgIC8qIEIyIEhvbGQgVGltZSAoflJlYWQvV3JpdGUgdG8gfkFPRSkgPSAzIGN5Y2xlcwkqLworI2RlZmluZSBCMkhUXzAJCQkweDAwMDAwMDAwICAvKiBCMiBIb2xkIFRpbWUgKH5SZWFkL1dyaXRlIHRvIH5BT0UpID0gMCBjeWNsZXMJKi8KKyNkZWZpbmUgQjJSQVRfMQkJCTB4MDAwMDAxMDAgIC8qIEIyIFJlYWQgQWNjZXNzIFRpbWUgPSAxIGN5Y2xlCQkJCQkqLworI2RlZmluZSBCMlJBVF8yCQkJMHgwMDAwMDIwMCAgLyogQjIgUmVhZCBBY2Nlc3MgVGltZSA9IDIgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMlJBVF8zCQkJMHgwMDAwMDMwMCAgLyogQjIgUmVhZCBBY2Nlc3MgVGltZSA9IDMgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMlJBVF80CQkJMHgwMDAwMDQwMCAgLyogQjIgUmVhZCBBY2Nlc3MgVGltZSA9IDQgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMlJBVF81CQkJMHgwMDAwMDUwMCAgLyogQjIgUmVhZCBBY2Nlc3MgVGltZSA9IDUgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMlJBVF82CQkJMHgwMDAwMDYwMCAgLyogQjIgUmVhZCBBY2Nlc3MgVGltZSA9IDYgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMlJBVF83CQkJMHgwMDAwMDcwMCAgLyogQjIgUmVhZCBBY2Nlc3MgVGltZSA9IDcgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMlJBVF84CQkJMHgwMDAwMDgwMCAgLyogQjIgUmVhZCBBY2Nlc3MgVGltZSA9IDggY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMlJBVF85CQkJMHgwMDAwMDkwMCAgLyogQjIgUmVhZCBBY2Nlc3MgVGltZSA9IDkgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMlJBVF8xMAkJMHgwMDAwMEEwMCAgLyogQjIgUmVhZCBBY2Nlc3MgVGltZSA9IDEwIGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjJSQVRfMTEJCTB4MDAwMDBCMDAgIC8qIEIyIFJlYWQgQWNjZXNzIFRpbWUgPSAxMSBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIyUkFUXzEyCQkweDAwMDAwQzAwICAvKiBCMiBSZWFkIEFjY2VzcyBUaW1lID0gMTIgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMlJBVF8xMwkJMHgwMDAwMEQwMCAgLyogQjIgUmVhZCBBY2Nlc3MgVGltZSA9IDEzIGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjJSQVRfMTQJCTB4MDAwMDBFMDAgIC8qIEIyIFJlYWQgQWNjZXNzIFRpbWUgPSAxNCBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIyUkFUXzE1CQkweDAwMDAwRjAwICAvKiBCMiBSZWFkIEFjY2VzcyBUaW1lID0gMTUgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMldBVF8xCQkJMHgwMDAwMTAwMCAgLyogQjIgV3JpdGUgQWNjZXNzIFRpbWUgPSAxIGN5Y2xlCQkJCQkqLworI2RlZmluZSBCMldBVF8yCQkJMHgwMDAwMjAwMCAgLyogQjIgV3JpdGUgQWNjZXNzIFRpbWUgPSAyIGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjJXQVRfMwkJCTB4MDAwMDMwMDAgIC8qIEIyIFdyaXRlIEFjY2VzcyBUaW1lID0gMyBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIyV0FUXzQJCQkweDAwMDA0MDAwICAvKiBCMiBXcml0ZSBBY2Nlc3MgVGltZSA9IDQgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMldBVF81CQkJMHgwMDAwNTAwMCAgLyogQjIgV3JpdGUgQWNjZXNzIFRpbWUgPSA1IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjJXQVRfNgkJCTB4MDAwMDYwMDAgIC8qIEIyIFdyaXRlIEFjY2VzcyBUaW1lID0gNiBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIyV0FUXzcJCQkweDAwMDA3MDAwICAvKiBCMiBXcml0ZSBBY2Nlc3MgVGltZSA9IDcgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMldBVF84CQkJMHgwMDAwODAwMCAgLyogQjIgV3JpdGUgQWNjZXNzIFRpbWUgPSA4IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjJXQVRfOQkJCTB4MDAwMDkwMDAgIC8qIEIyIFdyaXRlIEFjY2VzcyBUaW1lID0gOSBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIyV0FUXzEwCQkweDAwMDBBMDAwICAvKiBCMiBXcml0ZSBBY2Nlc3MgVGltZSA9IDEwIGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjJXQVRfMTEJCTB4MDAwMEIwMDAgIC8qIEIyIFdyaXRlIEFjY2VzcyBUaW1lID0gMTEgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMldBVF8xMgkJMHgwMDAwQzAwMCAgLyogQjIgV3JpdGUgQWNjZXNzIFRpbWUgPSAxMiBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIyV0FUXzEzCQkweDAwMDBEMDAwICAvKiBCMiBXcml0ZSBBY2Nlc3MgVGltZSA9IDEzIGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjJXQVRfMTQJCTB4MDAwMEUwMDAgIC8qIEIyIFdyaXRlIEFjY2VzcyBUaW1lID0gMTQgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMldBVF8xNQkJMHgwMDAwRjAwMCAgLyogQjIgV3JpdGUgQWNjZXNzIFRpbWUgPSAxNSBjeWNsZXMJCQkJCSovCisKKyNkZWZpbmUgQjNSRFlFTgkJCTB4MDAwMTAwMDAgIC8qIEJhbmsgMyAoQjMpIFJEWSBFbmFibGUJCQkJCQkJKi8KKyNkZWZpbmUgQjNSRFlQT0wJCTB4MDAwMjAwMDAgIC8qIEIzIFJEWSBBY3RpdmUgSGlnaAkJCQkJCQkJKi8KKyNkZWZpbmUgQjNUVF8xCQkJMHgwMDA0MDAwMCAgLyogQjMgVHJhbnNpdGlvbiBUaW1lIChSZWFkIHRvIFdyaXRlKSA9IDEgY3ljbGUJCSovCisjZGVmaW5lIEIzVFRfMgkJCTB4MDAwODAwMDAgIC8qIEIzIFRyYW5zaXRpb24gVGltZSAoUmVhZCB0byBXcml0ZSkgPSAyIGN5Y2xlcwkqLworI2RlZmluZSBCM1RUXzMJCQkweDAwMEMwMDAwICAvKiBCMyBUcmFuc2l0aW9uIFRpbWUgKFJlYWQgdG8gV3JpdGUpID0gMyBjeWNsZXMJKi8KKyNkZWZpbmUgQjNUVF80CQkJMHgwMDAwMDAwMCAgLyogQjMgVHJhbnNpdGlvbiBUaW1lIChSZWFkIHRvIFdyaXRlKSA9IDQgY3ljbGVzCSovCisjZGVmaW5lIEIzU1RfMQkJCTB4MDAxMDAwMDAgIC8qIEIzIFNldHVwIFRpbWUgKEFPRSB0byBSZWFkL1dyaXRlKSA9IDEgY3ljbGUJCSovCisjZGVmaW5lIEIzU1RfMgkJCTB4MDAyMDAwMDAgIC8qIEIzIFNldHVwIFRpbWUgKEFPRSB0byBSZWFkL1dyaXRlKSA9IDIgY3ljbGVzCQkqLworI2RlZmluZSBCM1NUXzMJCQkweDAwMzAwMDAwICAvKiBCMyBTZXR1cCBUaW1lIChBT0UgdG8gUmVhZC9Xcml0ZSkgPSAzIGN5Y2xlcwkJKi8KKyNkZWZpbmUgQjNTVF80CQkJMHgwMDAwMDAwMCAgLyogQjMgU2V0dXAgVGltZSAoQU9FIHRvIFJlYWQvV3JpdGUpID0gNCBjeWNsZXMJCSovCisjZGVmaW5lIEIzSFRfMQkJCTB4MDA0MDAwMDAgIC8qIEIzIEhvbGQgVGltZSAoflJlYWQvV3JpdGUgdG8gfkFPRSkgPSAxIGN5Y2xlCQkqLworI2RlZmluZSBCM0hUXzIJCQkweDAwODAwMDAwICAvKiBCMyBIb2xkIFRpbWUgKH5SZWFkL1dyaXRlIHRvIH5BT0UpID0gMiBjeWNsZXMJKi8KKyNkZWZpbmUgQjNIVF8zCQkJMHgwMEMwMDAwMCAgLyogQjMgSG9sZCBUaW1lICh+UmVhZC9Xcml0ZSB0byB+QU9FKSA9IDMgY3ljbGVzCSovCisjZGVmaW5lIEIzSFRfMAkJCTB4MDAwMDAwMDAgIC8qIEIzIEhvbGQgVGltZSAoflJlYWQvV3JpdGUgdG8gfkFPRSkgPSAwIGN5Y2xlcwkqLworI2RlZmluZSBCM1JBVF8xCQkJMHgwMTAwMDAwMCAgLyogQjMgUmVhZCBBY2Nlc3MgVGltZSA9IDEgY3ljbGUJCQkJCSovCisjZGVmaW5lIEIzUkFUXzIJCQkweDAyMDAwMDAwICAvKiBCMyBSZWFkIEFjY2VzcyBUaW1lID0gMiBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIzUkFUXzMJCQkweDAzMDAwMDAwICAvKiBCMyBSZWFkIEFjY2VzcyBUaW1lID0gMyBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIzUkFUXzQJCQkweDA0MDAwMDAwICAvKiBCMyBSZWFkIEFjY2VzcyBUaW1lID0gNCBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIzUkFUXzUJCQkweDA1MDAwMDAwICAvKiBCMyBSZWFkIEFjY2VzcyBUaW1lID0gNSBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIzUkFUXzYJCQkweDA2MDAwMDAwICAvKiBCMyBSZWFkIEFjY2VzcyBUaW1lID0gNiBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIzUkFUXzcJCQkweDA3MDAwMDAwICAvKiBCMyBSZWFkIEFjY2VzcyBUaW1lID0gNyBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIzUkFUXzgJCQkweDA4MDAwMDAwICAvKiBCMyBSZWFkIEFjY2VzcyBUaW1lID0gOCBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIzUkFUXzkJCQkweDA5MDAwMDAwICAvKiBCMyBSZWFkIEFjY2VzcyBUaW1lID0gOSBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIzUkFUXzEwCQkweDBBMDAwMDAwICAvKiBCMyBSZWFkIEFjY2VzcyBUaW1lID0gMTAgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCM1JBVF8xMQkJMHgwQjAwMDAwMCAgLyogQjMgUmVhZCBBY2Nlc3MgVGltZSA9IDExIGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjNSQVRfMTIJCTB4MEMwMDAwMDAgIC8qIEIzIFJlYWQgQWNjZXNzIFRpbWUgPSAxMiBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIzUkFUXzEzCQkweDBEMDAwMDAwICAvKiBCMyBSZWFkIEFjY2VzcyBUaW1lID0gMTMgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCM1JBVF8xNAkJMHgwRTAwMDAwMCAgLyogQjMgUmVhZCBBY2Nlc3MgVGltZSA9IDE0IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjNSQVRfMTUJCTB4MEYwMDAwMDAgIC8qIEIzIFJlYWQgQWNjZXNzIFRpbWUgPSAxNSBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIzV0FUXzEJCQkweDEwMDAwMDAwICAvKiBCMyBXcml0ZSBBY2Nlc3MgVGltZSA9IDEgY3ljbGUJCQkJCSovCisjZGVmaW5lIEIzV0FUXzIJCQkweDIwMDAwMDAwICAvKiBCMyBXcml0ZSBBY2Nlc3MgVGltZSA9IDIgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCM1dBVF8zCQkJMHgzMDAwMDAwMCAgLyogQjMgV3JpdGUgQWNjZXNzIFRpbWUgPSAzIGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjNXQVRfNAkJCTB4NDAwMDAwMDAgIC8qIEIzIFdyaXRlIEFjY2VzcyBUaW1lID0gNCBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIzV0FUXzUJCQkweDUwMDAwMDAwICAvKiBCMyBXcml0ZSBBY2Nlc3MgVGltZSA9IDUgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCM1dBVF82CQkJMHg2MDAwMDAwMCAgLyogQjMgV3JpdGUgQWNjZXNzIFRpbWUgPSA2IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjNXQVRfNwkJCTB4NzAwMDAwMDAgIC8qIEIzIFdyaXRlIEFjY2VzcyBUaW1lID0gNyBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIzV0FUXzgJCQkweDgwMDAwMDAwICAvKiBCMyBXcml0ZSBBY2Nlc3MgVGltZSA9IDggY3ljbGVzCQkJCQkqLworI2RlZmluZSBCM1dBVF85CQkJMHg5MDAwMDAwMCAgLyogQjMgV3JpdGUgQWNjZXNzIFRpbWUgPSA5IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjNXQVRfMTAJCTB4QTAwMDAwMDAgIC8qIEIzIFdyaXRlIEFjY2VzcyBUaW1lID0gMTAgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCM1dBVF8xMQkJMHhCMDAwMDAwMCAgLyogQjMgV3JpdGUgQWNjZXNzIFRpbWUgPSAxMSBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIzV0FUXzEyCQkweEMwMDAwMDAwICAvKiBCMyBXcml0ZSBBY2Nlc3MgVGltZSA9IDEyIGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjNXQVRfMTMJCTB4RDAwMDAwMDAgIC8qIEIzIFdyaXRlIEFjY2VzcyBUaW1lID0gMTMgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCM1dBVF8xNAkJMHhFMDAwMDAwMCAgLyogQjMgV3JpdGUgQWNjZXNzIFRpbWUgPSAxNCBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIzV0FUXzE1CQkweEYwMDAwMDAwICAvKiBCMyBXcml0ZSBBY2Nlc3MgVGltZSA9IDE1IGN5Y2xlcwkJCQkJKi8KKworCisvKiAqKioqKioqKioqKioqKioqKioqKioqICBTRFJBTSBDT05UUk9MTEVSIE1BU0tTICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogRUJJVV9TREdDVEwgTWFza3MJCQkJCQkJCQkJCQkJCQkJCQkJKi8KKyNkZWZpbmUgU0NUTEUJCQkweDAwMDAwMDAxCS8qIEVuYWJsZSBTRFJBTSBTaWduYWxzCQkJCQkJCQkJCSovCisjZGVmaW5lIENMXzIJCQkweDAwMDAwMDA4CS8qIFNEUkFNIENBUyBMYXRlbmN5ID0gMiBjeWNsZXMJCQkJCQkJCSovCisjZGVmaW5lIENMXzMJCQkweDAwMDAwMDBDCS8qIFNEUkFNIENBUyBMYXRlbmN5ID0gMyBjeWNsZXMJCQkJCQkJCSovCisjZGVmaW5lIFBBU1JfQUxMCQkweDAwMDAwMDAwCS8qIEFsbCA0IFNEUkFNIEJhbmtzIFJlZnJlc2hlZCBJbiBTZWxmLVJlZnJlc2gJCQkJKi8KKyNkZWZpbmUgUEFTUl9CMF9CMQkJMHgwMDAwMDAxMAkvKiBTRFJBTSBCYW5rcyAwIGFuZCAxIEFyZSBSZWZyZXNoZWQgSW4gU2VsZi1SZWZyZXNoCQkqLworI2RlZmluZSBQQVNSX0IwCQkJMHgwMDAwMDAyMAkvKiBPbmx5IFNEUkFNIEJhbmsgMCBJcyBSZWZyZXNoZWQgSW4gU2VsZi1SZWZyZXNoCQkJKi8KKyNkZWZpbmUgVFJBU18xCQkJMHgwMDAwMDA0MAkvKiBTRFJBTSB0UkFTID0gMSBjeWNsZQkJCQkJCQkJCQkqLworI2RlZmluZSBUUkFTXzIJCQkweDAwMDAwMDgwCS8qIFNEUkFNIHRSQVMgPSAyIGN5Y2xlcwkJCQkJCQkJCSovCisjZGVmaW5lIFRSQVNfMwkJCTB4MDAwMDAwQzAJLyogU0RSQU0gdFJBUyA9IDMgY3ljbGVzCQkJCQkJCQkJKi8KKyNkZWZpbmUgVFJBU180CQkJMHgwMDAwMDEwMAkvKiBTRFJBTSB0UkFTID0gNCBjeWNsZXMJCQkJCQkJCQkqLworI2RlZmluZSBUUkFTXzUJCQkweDAwMDAwMTQwCS8qIFNEUkFNIHRSQVMgPSA1IGN5Y2xlcwkJCQkJCQkJCSovCisjZGVmaW5lIFRSQVNfNgkJCTB4MDAwMDAxODAJLyogU0RSQU0gdFJBUyA9IDYgY3ljbGVzCQkJCQkJCQkJKi8KKyNkZWZpbmUgVFJBU183CQkJMHgwMDAwMDFDMAkvKiBTRFJBTSB0UkFTID0gNyBjeWNsZXMJCQkJCQkJCQkqLworI2RlZmluZSBUUkFTXzgJCQkweDAwMDAwMjAwCS8qIFNEUkFNIHRSQVMgPSA4IGN5Y2xlcwkJCQkJCQkJCSovCisjZGVmaW5lIFRSQVNfOQkJCTB4MDAwMDAyNDAJLyogU0RSQU0gdFJBUyA9IDkgY3ljbGVzCQkJCQkJCQkJKi8KKyNkZWZpbmUgVFJBU18xMAkJCTB4MDAwMDAyODAJLyogU0RSQU0gdFJBUyA9IDEwIGN5Y2xlcwkJCQkJCQkJCSovCisjZGVmaW5lIFRSQVNfMTEJCQkweDAwMDAwMkMwCS8qIFNEUkFNIHRSQVMgPSAxMSBjeWNsZXMJCQkJCQkJCQkqLworI2RlZmluZSBUUkFTXzEyCQkJMHgwMDAwMDMwMAkvKiBTRFJBTSB0UkFTID0gMTIgY3ljbGVzCQkJCQkJCQkJKi8KKyNkZWZpbmUgVFJBU18xMwkJCTB4MDAwMDAzNDAJLyogU0RSQU0gdFJBUyA9IDEzIGN5Y2xlcwkJCQkJCQkJCSovCisjZGVmaW5lIFRSQVNfMTQJCQkweDAwMDAwMzgwCS8qIFNEUkFNIHRSQVMgPSAxNCBjeWNsZXMJCQkJCQkJCQkqLworI2RlZmluZSBUUkFTXzE1CQkJMHgwMDAwMDNDMAkvKiBTRFJBTSB0UkFTID0gMTUgY3ljbGVzCQkJCQkJCQkJKi8KKyNkZWZpbmUgVFJQXzEJCQkweDAwMDAwODAwCS8qIFNEUkFNIHRSUCA9IDEgY3ljbGUJCQkJCQkJCQkJKi8KKyNkZWZpbmUgVFJQXzIJCQkweDAwMDAxMDAwCS8qIFNEUkFNIHRSUCA9IDIgY3ljbGVzCQkJCQkJCQkJCSovCisjZGVmaW5lIFRSUF8zCQkJMHgwMDAwMTgwMAkvKiBTRFJBTSB0UlAgPSAzIGN5Y2xlcwkJCQkJCQkJCQkqLworI2RlZmluZSBUUlBfNAkJCTB4MDAwMDIwMDAJLyogU0RSQU0gdFJQID0gNCBjeWNsZXMJCQkJCQkJCQkJKi8KKyNkZWZpbmUgVFJQXzUJCQkweDAwMDAyODAwCS8qIFNEUkFNIHRSUCA9IDUgY3ljbGVzCQkJCQkJCQkJCSovCisjZGVmaW5lIFRSUF82CQkJMHgwMDAwMzAwMAkvKiBTRFJBTSB0UlAgPSA2IGN5Y2xlcwkJCQkJCQkJCQkqLworI2RlZmluZSBUUlBfNwkJCTB4MDAwMDM4MDAJLyogU0RSQU0gdFJQID0gNyBjeWNsZXMJCQkJCQkJCQkJKi8KKyNkZWZpbmUgVFJDRF8xCQkJMHgwMDAwODAwMAkvKiBTRFJBTSB0UkNEID0gMSBjeWNsZQkJCQkJCQkJCQkqLworI2RlZmluZSBUUkNEXzIJCQkweDAwMDEwMDAwCS8qIFNEUkFNIHRSQ0QgPSAyIGN5Y2xlcwkJCQkJCQkJCSovCisjZGVmaW5lIFRSQ0RfMwkJCTB4MDAwMTgwMDAJLyogU0RSQU0gdFJDRCA9IDMgY3ljbGVzCQkJCQkJCQkJKi8KKyNkZWZpbmUgVFJDRF80CQkJMHgwMDAyMDAwMAkvKiBTRFJBTSB0UkNEID0gNCBjeWNsZXMJCQkJCQkJCQkqLworI2RlZmluZSBUUkNEXzUJCQkweDAwMDI4MDAwCS8qIFNEUkFNIHRSQ0QgPSA1IGN5Y2xlcwkJCQkJCQkJCSovCisjZGVmaW5lIFRSQ0RfNgkJCTB4MDAwMzAwMDAJLyogU0RSQU0gdFJDRCA9IDYgY3ljbGVzCQkJCQkJCQkJKi8KKyNkZWZpbmUgVFJDRF83CQkJMHgwMDAzODAwMAkvKiBTRFJBTSB0UkNEID0gNyBjeWNsZXMJCQkJCQkJCQkqLworI2RlZmluZSBUV1JfMQkJCTB4MDAwODAwMDAJLyogU0RSQU0gdFdSID0gMSBjeWNsZQkJCQkJCQkJCQkqLworI2RlZmluZSBUV1JfMgkJCTB4MDAxMDAwMDAJLyogU0RSQU0gdFdSID0gMiBjeWNsZXMJCQkJCQkJCQkJKi8KKyNkZWZpbmUgVFdSXzMJCQkweDAwMTgwMDAwCS8qIFNEUkFNIHRXUiA9IDMgY3ljbGVzCQkJCQkJCQkJCSovCisjZGVmaW5lIFBVUFNECQkJMHgwMDIwMDAwMAkvKiBQb3dlci1VcCBTdGFydCBEZWxheSAoMTUgU0NMSyBDeWNsZXMgRGVsYXkpCQkJCSovCisjZGVmaW5lIFBTTQkJCQkweDAwNDAwMDAwCS8qIFBvd2VyLVVwIFNlcXVlbmNlIChNb2RlIFJlZ2lzdGVyIEJlZm9yZS9BZnRlciogUmVmcmVzaCkJKi8KKyNkZWZpbmUgUFNTCQkJCTB4MDA4MDAwMDAJLyogRW5hYmxlIFBvd2VyLVVwIFNlcXVlbmNlIG9uIE5leHQgU0RSQU0gQWNjZXNzCQkJKi8KKyNkZWZpbmUgU1JGUwkJCTB4MDEwMDAwMDAJLyogRW5hYmxlIFNEUkFNIFNlbGYtUmVmcmVzaCBNb2RlCQkJCQkJCSovCisjZGVmaW5lIEVCVUZFCQkJMHgwMjAwMDAwMAkvKiBFbmFibGUgRXh0ZXJuYWwgQnVmZmVyaW5nIFRpbWluZwkJCQkJCQkqLworI2RlZmluZSBGQkJSVwkJCTB4MDQwMDAwMDAJLyogRW5hYmxlIEZhc3QgQmFjay1Uby1CYWNrIFJlYWQgVG8gV3JpdGUJCQkJCSovCisjZGVmaW5lIEVNUkVOCQkJMHgxMDAwMDAwMAkvKiBFeHRlbmRlZCBNb2RlIFJlZ2lzdGVyIEVuYWJsZQkJCQkJCQkqLworI2RlZmluZSBUQ1NSCQkJMHgyMDAwMDAwMAkvKiBUZW1wLUNvbXBlbnNhdGVkIFNlbGYtUmVmcmVzaCBWYWx1ZSAoODUvNDUqIERlZyBDKQkJKi8KKyNkZWZpbmUgQ0REQkcJCQkweDQwMDAwMDAwCS8qIFRyaXN0YXRlIFNEUkFNIENvbnRyb2xzIER1cmluZyBCdXMgR3JhbnQJCQkJCSovCisKKy8qIEVCSVVfU0RCQ1RMIE1hc2tzCQkJCQkJCQkJCQkJCQkJCQkJKi8KKyNkZWZpbmUgRUJFCQkJCTB4MDAwMQkJLyogRW5hYmxlIFNEUkFNIEV4dGVybmFsIEJhbmsJCQkJCQkJKi8KKyNkZWZpbmUgRUJTWl8xNgkJCTB4MDAwMAkJLyogU0RSQU0gRXh0ZXJuYWwgQmFuayBTaXplID0gMTZNQgkqLworI2RlZmluZSBFQlNaXzMyCQkJMHgwMDAyCQkvKiBTRFJBTSBFeHRlcm5hbCBCYW5rIFNpemUgPSAzMk1CCSovCisjZGVmaW5lIEVCU1pfNjQJCQkweDAwMDQJCS8qIFNEUkFNIEV4dGVybmFsIEJhbmsgU2l6ZSA9IDY0TUIJKi8KKyNkZWZpbmUgRUJTWl8xMjgJCTB4MDAwNgkJLyogU0RSQU0gRXh0ZXJuYWwgQmFuayBTaXplID0gMTI4TUIJCSovCisjZGVmaW5lIEVCU1pfMjU2CQkweDAwMDgJCS8qIFNEUkFNIEV4dGVybmFsIEJhbmsgU2l6ZSA9IDI1Nk1CIAkqLworI2RlZmluZSBFQlNaXzUxMgkJMHgwMDBBCQkvKiBTRFJBTSBFeHRlcm5hbCBCYW5rIFNpemUgPSA1MTJNQgkJKi8KKyNkZWZpbmUgRUJDQVdfOAkJCTB4MDAwMAkJLyogU0RSQU0gRXh0ZXJuYWwgQmFuayBDb2x1bW4gQWRkcmVzcyBXaWR0aCA9IDggQml0cwkqLworI2RlZmluZSBFQkNBV185CQkJMHgwMDEwCQkvKiBTRFJBTSBFeHRlcm5hbCBCYW5rIENvbHVtbiBBZGRyZXNzIFdpZHRoID0gOSBCaXRzCSovCisjZGVmaW5lIEVCQ0FXXzEwCQkweDAwMjAJCS8qIFNEUkFNIEV4dGVybmFsIEJhbmsgQ29sdW1uIEFkZHJlc3MgV2lkdGggPSAxMCBCaXRzCSovCisjZGVmaW5lIEVCQ0FXXzExCQkweDAwMzAJCS8qIFNEUkFNIEV4dGVybmFsIEJhbmsgQ29sdW1uIEFkZHJlc3MgV2lkdGggPSAxMSBCaXRzCSovCisKKy8qIEVCSVVfU0RTVEFUIE1hc2tzCQkJCQkJCQkJCQkJCQkqLworI2RlZmluZSBTRENJCQkJMHgwMDAxCQkvKiBTRFJBTSBDb250cm9sbGVyIElkbGUgCQkJCSovCisjZGVmaW5lIFNEU1JBCQkJMHgwMDAyCQkvKiBTRFJBTSBTZWxmLVJlZnJlc2ggQWN0aXZlCQkJKi8KKyNkZWZpbmUgU0RQVUEJCQkweDAwMDQJCS8qIFNEUkFNIFBvd2VyLVVwIEFjdGl2ZSAJCQkJKi8KKyNkZWZpbmUgU0RSUwkJCTB4MDAwOAkJLyogU0RSQU0gV2lsbCBQb3dlci1VcCBPbiBOZXh0IEFjY2VzcwkqLworI2RlZmluZSBTREVBU0UJCQkweDAwMTAJCS8qIFNEUkFNIEVBQiBTdGlja3kgRXJyb3IgU3RhdHVzCQkqLworI2RlZmluZSBCR1NUQVQJCQkweDAwMjAJCS8qIEJ1cyBHcmFudCBTdGF0dXMJCQkJCQkqLworCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqICBETUEgQ09OVFJPTExFUiBNQVNLUyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBETUF4X0NPTkZJRywgTURNQV95eV9DT05GSUcgTWFza3MJCQkJCQkJCQkJCQkqLworI2RlZmluZSBETUFFTgkJCTB4MDAwMQkJLyogRE1BIENoYW5uZWwgRW5hYmxlCQkJCQkJCSovCisjZGVmaW5lIFdOUgkJCQkweDAwMDIJCS8qIENoYW5uZWwgRGlyZWN0aW9uIChXL1IqKQkJCQkJCSovCisjZGVmaW5lIFdEU0laRV84CQkweDAwMDAJCS8qIFRyYW5zZmVyIFdvcmQgU2l6ZSA9IDgJCQkJCQkqLworI2RlZmluZSBXRFNJWkVfMTYJCTB4MDAwNAkJLyogVHJhbnNmZXIgV29yZCBTaXplID0gMTYJCQkJCQkqLworI2RlZmluZSBXRFNJWkVfMzIJCTB4MDAwOAkJLyogVHJhbnNmZXIgV29yZCBTaXplID0gMzIJCQkJCQkqLworI2RlZmluZSBETUEyRAkJCTB4MDAxMAkJLyogRE1BIE1vZGUgKDJELzFEKikJCQkJCQkJKi8KKyNkZWZpbmUgUkVTVEFSVAkJCTB4MDAyMAkJLyogRE1BIEJ1ZmZlciBDbGVhcgkJCQkJCQkJKi8KKyNkZWZpbmUgRElfU0VMCQkJMHgwMDQwCQkvKiBEYXRhIEludGVycnVwdCBUaW1pbmcgU2VsZWN0CQkJCQkqLworI2RlZmluZSBESV9FTgkJCTB4MDA4MAkJLyogRGF0YSBJbnRlcnJ1cHQgRW5hYmxlCQkJCQkJKi8KKyNkZWZpbmUgTkRTSVpFXzAJCTB4MDAwMAkJLyogTmV4dCBEZXNjcmlwdG9yIFNpemUgPSAwIChTdG9wL0F1dG9idWZmZXIpCSovCisjZGVmaW5lIE5EU0laRV8xCQkweDAxMDAJCS8qIE5leHQgRGVzY3JpcHRvciBTaXplID0gMQkJCQkJCSovCisjZGVmaW5lIE5EU0laRV8yCQkweDAyMDAJCS8qIE5leHQgRGVzY3JpcHRvciBTaXplID0gMgkJCQkJCSovCisjZGVmaW5lIE5EU0laRV8zCQkweDAzMDAJCS8qIE5leHQgRGVzY3JpcHRvciBTaXplID0gMwkJCQkJCSovCisjZGVmaW5lIE5EU0laRV80CQkweDA0MDAJCS8qIE5leHQgRGVzY3JpcHRvciBTaXplID0gNAkJCQkJCSovCisjZGVmaW5lIE5EU0laRV81CQkweDA1MDAJCS8qIE5leHQgRGVzY3JpcHRvciBTaXplID0gNQkJCQkJCSovCisjZGVmaW5lIE5EU0laRV82CQkweDA2MDAJCS8qIE5leHQgRGVzY3JpcHRvciBTaXplID0gNgkJCQkJCSovCisjZGVmaW5lIE5EU0laRV83CQkweDA3MDAJCS8qIE5leHQgRGVzY3JpcHRvciBTaXplID0gNwkJCQkJCSovCisjZGVmaW5lIE5EU0laRV84CQkweDA4MDAJCS8qIE5leHQgRGVzY3JpcHRvciBTaXplID0gOAkJCQkJCSovCisjZGVmaW5lIE5EU0laRV85CQkweDA5MDAJCS8qIE5leHQgRGVzY3JpcHRvciBTaXplID0gOQkJCQkJCSovCisjZGVmaW5lIE5EU0laRQkgICAgICAgIAkweDA5MDAJLyogTmV4dCBEZXNjcmlwdG9yIFNpemUgKi8KKyNkZWZpbmUgRE1BRkxPVwkgICAgICAgIAkweDcwMDAJLyogRmxvdyBDb250cm9sICovCisjZGVmaW5lIERNQUZMT1dfU1RPUAkJMHgwMDAwCQkvKiBTdG9wIE1vZGUJCQkJCQkJCQkqLworI2RlZmluZSBETUFGTE9XX0FVVE8JCTB4MTAwMAkJLyogQXV0b2J1ZmZlciBNb2RlCQkJCQkJCQkqLworI2RlZmluZSBETUFGTE9XX0FSUkFZCQkweDQwMDAJCS8qIERlc2NyaXB0b3IgQXJyYXkgTW9kZQkJCQkJCSovCisjZGVmaW5lIERNQUZMT1dfU01BTEwJCTB4NjAwMAkJLyogU21hbGwgTW9kZWwgRGVzY3JpcHRvciBMaXN0IE1vZGUJCQkJKi8KKyNkZWZpbmUgRE1BRkxPV19MQVJHRQkJMHg3MDAwCQkvKiBMYXJnZSBNb2RlbCBEZXNjcmlwdG9yIExpc3QgTW9kZQkJCQkqLworCisvKiBETUF4X1BFUklQSEVSQUxfTUFQLCBNRE1BX3l5X1BFUklQSEVSQUxfTUFQIE1hc2tzCQkJCQkJCQkqLworI2RlZmluZSBDVFlQRQkJCTB4MDA0MAkvKiBETUEgQ2hhbm5lbCBUeXBlIEluZGljYXRvciAoTWVtb3J5L1BlcmlwaGVyYWwqKQkqLworI2RlZmluZSBQTUFQCQkJMHhGMDAwCS8qIFBlcmlwaGVyYWwgTWFwcGVkIFRvIFRoaXMgQ2hhbm5lbAkJCQkqLworI2RlZmluZSBQTUFQX1BQSQkJMHgwMDAwCS8qIAkJUFBJIFBvcnQgRE1BCQkJCQkJCQkqLworI2RlZmluZQlQTUFQX0VNQUNSWAkJMHgxMDAwCS8qIAkJRXRoZXJuZXQgUmVjZWl2ZSBETUEJCQkJCQkqLworI2RlZmluZSBQTUFQX0VNQUNUWAkJMHgyMDAwCS8qIAkJRXRoZXJuZXQgVHJhbnNtaXQgRE1BCQkJCQkJKi8KKyNkZWZpbmUgUE1BUF9TUE9SVDBSWAkweDMwMDAJLyogCQlTUE9SVDAgUmVjZWl2ZSBETUEJCQkJCQkJKi8KKyNkZWZpbmUgUE1BUF9TUE9SVDBUWAkweDQwMDAJLyogCQlTUE9SVDAgVHJhbnNtaXQgRE1BCQkJCQkJCSovCisjZGVmaW5lIFBNQVBfU1BPUlQxUlgJMHg1MDAwCS8qIAkJU1BPUlQxIFJlY2VpdmUgRE1BCQkJCQkJCSovCisjZGVmaW5lIFBNQVBfU1BPUlQxVFgJMHg2MDAwCS8qIAkJU1BPUlQxIFRyYW5zbWl0IERNQQkJCQkJCQkqLworI2RlZmluZSBQTUFQX1NQSQkJMHg3MDAwCS8qIAkJU1BJIFBvcnQgRE1BCQkJCQkJCQkqLworI2RlZmluZSBQTUFQX1VBUlQwUlgJMHg4MDAwCS8qIAkJVUFSVDAgUG9ydCBSZWNlaXZlIERNQQkJCQkJCSovCisjZGVmaW5lIFBNQVBfVUFSVDBUWAkweDkwMDAJLyogCQlVQVJUMCBQb3J0IFRyYW5zbWl0IERNQQkJCQkJCSovCisjZGVmaW5lCVBNQVBfVUFSVDFSWAkweEEwMDAJLyogCQlVQVJUMSBQb3J0IFJlY2VpdmUgRE1BCQkJCQkJKi8KKyNkZWZpbmUJUE1BUF9VQVJUMVRYCTB4QjAwMAkvKiAJCVVBUlQxIFBvcnQgVHJhbnNtaXQgRE1BCQkJCQkJKi8KKworLyogRE1BeF9JUlFfU1RBVFVTLCBNRE1BX3l5X0lSUV9TVEFUVVMgTWFza3MJCQkJCQkqLworI2RlZmluZSBETUFfRE9ORQkJMHgwMDAxCS8qIERNQSBDb21wbGV0aW9uIEludGVycnVwdCBTdGF0dXMJKi8KKyNkZWZpbmUgRE1BX0VSUgkJCTB4MDAwMgkvKiBETUEgRXJyb3IgSW50ZXJydXB0IFN0YXR1cwkJKi8KKyNkZWZpbmUgREZFVENICQkJMHgwMDA0CS8qIERNQSBEZXNjcmlwdG9yIEZldGNoIEluZGljYXRvcgkqLworI2RlZmluZSBETUFfUlVOCQkJMHgwMDA4CS8qIERNQSBDaGFubmVsIFJ1bm5pbmcgSW5kaWNhdG9yCSovCisKKworLyogICoqKioqKioqKioqKiAgUEFSQUxMRUwgUEVSSVBIRVJBTCBJTlRFUkZBQ0UgKFBQSSkgTUFTS1MgKioqKioqKioqKioqKi8KKy8qICBQUElfQ09OVFJPTCBNYXNrcwkJCQkJCQkJCQkJCQkqLworI2RlZmluZSBQT1JUX0VOCQkJMHgwMDAxCQkvKiBQUEkgUG9ydCBFbmFibGUJCQkJCSovCisjZGVmaW5lIFBPUlRfRElSCQkweDAwMDIJCS8qIFBQSSBQb3J0IERpcmVjdGlvbgkJCQkqLworI2RlZmluZSBYRlJfVFlQRQkJMHgwMDBDCQkvKiBQUEkgVHJhbnNmZXIgVHlwZQkJCQkqLworI2RlZmluZSBQT1JUX0NGRwkJMHgwMDMwCQkvKiBQUEkgUG9ydCBDb25maWd1cmF0aW9uCQkJKi8KKyNkZWZpbmUgRkxEX1NFTAkJCTB4MDA0MAkJLyogUFBJIEFjdGl2ZSBGaWVsZCBTZWxlY3QJCQkqLworI2RlZmluZSBQQUNLX0VOCQkJMHgwMDgwCQkvKiBQUEkgUGFja2luZyBNb2RlCQkJCQkqLworI2RlZmluZSBETUEzMgkJCTB4MDEwMAkJLyogUFBJIDMyLWJpdCBETUEgRW5hYmxlCQkJKi8KKyNkZWZpbmUgU0tJUF9FTgkJCTB4MDIwMAkJLyogUFBJIFNraXAgRWxlbWVudCBFbmFibGUJCQkqLworI2RlZmluZSBTS0lQX0VPCQkJMHgwNDAwCQkvKiBQUEkgU2tpcCBFdmVuL09kZCBFbGVtZW50cwkJKi8KKyNkZWZpbmUgRExFTl84CQkJMHgwMDAwCQkvKiBEYXRhIExlbmd0aCA9IDggQml0cwkJCQkqLworI2RlZmluZSBETEVOXzEwCQkJMHgwODAwCQkvKiBEYXRhIExlbmd0aCA9IDEwIEJpdHMJCQkqLworI2RlZmluZSBETEVOXzExCQkJMHgxMDAwCQkvKiBEYXRhIExlbmd0aCA9IDExIEJpdHMJCQkqLworI2RlZmluZSBETEVOXzEyCQkJMHgxODAwCQkvKiBEYXRhIExlbmd0aCA9IDEyIEJpdHMJCQkqLworI2RlZmluZSBETEVOXzEzCQkJMHgyMDAwCQkvKiBEYXRhIExlbmd0aCA9IDEzIEJpdHMJCQkqLworI2RlZmluZSBETEVOXzE0CQkJMHgyODAwCQkvKiBEYXRhIExlbmd0aCA9IDE0IEJpdHMJCQkqLworI2RlZmluZSBETEVOXzE1CQkJMHgzMDAwCQkvKiBEYXRhIExlbmd0aCA9IDE1IEJpdHMJCQkqLworI2RlZmluZSBETEVOXzE2CQkJMHgzODAwCQkvKiBEYXRhIExlbmd0aCA9IDE2IEJpdHMJCQkqLworI2RlZmluZSBETEVOR1RICQkJMHgzODAwCQkvKiBQUEkgRGF0YSBMZW5ndGggICovCisjZGVmaW5lIFBPTEMJCQkweDQwMDAJCS8qIFBQSSBDbG9jayBQb2xhcml0eQkJCQkqLworI2RlZmluZSBQT0xTCQkJMHg4MDAwCQkvKiBQUEkgRnJhbWUgU3luYyBQb2xhcml0eQkJCSovCisKKy8qIFBQSV9TVEFUVVMgTWFza3MJCQkJCQkJCQkJCQkJCSovCisjZGVmaW5lIEZMRAkJCQkweDA0MDAJCS8qIEZpZWxkIEluZGljYXRvcgkJCQkJKi8KKyNkZWZpbmUgRlRfRVJSCQkJMHgwODAwCQkvKiBGcmFtZSBUcmFjayBFcnJvcgkJCQkqLworI2RlZmluZSBPVlIJCQkJMHgxMDAwCQkvKiBGSUZPIE92ZXJmbG93IEVycm9yCQkJCSovCisjZGVmaW5lIFVORFIJCQkweDIwMDAJCS8qIEZJRk8gVW5kZXJydW4gRXJyb3IJCQkJKi8KKyNkZWZpbmUgRVJSX0RFVAkJCTB4NDAwMAkJLyogRXJyb3IgRGV0ZWN0ZWQgSW5kaWNhdG9yCQkJKi8KKyNkZWZpbmUgRVJSX05DT1IJCTB4ODAwMAkJLyogRXJyb3IgTm90IENvcnJlY3RlZCBJbmRpY2F0b3IJKi8KKworCisvKiAgKioqKioqKioqKioqKioqKioqKiogIFRXTy1XSVJFIElOVEVSRkFDRSAoVFdJKSBNQVNLUyAgKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBUV0lfQ0xLRElWIE1hY3JvcyAoVXNlOiAqcFRXSV9DTEtESVYgPSBDTEtMT1coeCl8Q0xLSEkoeSk7ICApCQkJCSovCisjZGVmaW5lCUNMS0xPVyh4KQkoKHgpICYgMHhGRikJCS8qIFBlcmlvZHMgQ2xvY2sgSXMgSGVsZCBMb3cJCQkqLworI2RlZmluZSBDTEtISSh5KQkoKCh5KSYweEZGKTw8MHg4KQkvKiBQZXJpb2RzIEJlZm9yZSBOZXcgQ2xvY2sgTG93CQkJKi8KKworLyogVFdJX1BSRVNDQUxFIE1hc2tzCQkJCQkJCQkJCQkJCQkJKi8KKyNkZWZpbmUJUFJFU0NBTEUJMHgwMDdGCQkvKiBTQ0xLcyBQZXIgSW50ZXJuYWwgVGltZSBSZWZlcmVuY2UgKDEwTUh6KQkqLworI2RlZmluZQlUV0lfRU5BCQkweDAwODAJCS8qIFRXSSBFbmFibGUJCQkJCQkJCQkqLworI2RlZmluZQlTQ0NCCQkweDAyMDAJCS8qIFNDQ0IgQ29tcGF0aWJpbGl0eSBFbmFibGUJCQkJCSovCisKKy8qIFRXSV9TTEFWRV9DVFJMIE1hc2tzCQkJCQkJCQkJCQkJCQkJKi8KKyNkZWZpbmUJU0VOCQkJMHgwMDAxCQkvKiBTbGF2ZSBFbmFibGUJCQkJCQkJCQkqLworI2RlZmluZQlTQUREX0xFTgkweDAwMDIJCS8qIFNsYXZlIEFkZHJlc3MgTGVuZ3RoCQkJCQkJCSovCisjZGVmaW5lCVNURFZBTAkJMHgwMDA0CQkvKiBTbGF2ZSBUcmFuc21pdCBEYXRhIFZhbGlkCQkJCQkqLworI2RlZmluZQlOQUsJCQkweDAwMDgJCS8qIE5BSy9BQ0sqIEdlbmVyYXRlZCBBdCBDb25jbHVzaW9uIE9mIFRyYW5zZmVyICovCisjZGVmaW5lCUdFTgkJCTB4MDAxMAkJLyogR2VuZXJhbCBDYWxsIEFkcnJlc3MgTWF0Y2hpbmcgRW5hYmxlZAkJKi8KKworLyogVFdJX1NMQVZFX1NUQVQgTWFza3MJCQkJCQkJCQkJCQkJCQkqLworI2RlZmluZQlTRElSCQkweDAwMDEJCS8qIFNsYXZlIFRyYW5zZmVyIERpcmVjdGlvbiAoVHJhbnNtaXQvUmVjZWl2ZSopCSovCisjZGVmaW5lIEdDQUxMCQkweDAwMDIJCS8qIEdlbmVyYWwgQ2FsbCBJbmRpY2F0b3IJCQkJCQkqLworCisvKiBUV0lfTUFTVEVSX0NUUkwgTWFza3MJCQkJCQkJCQkJCQkJKi8KKyNkZWZpbmUJTUVOCQkJMHgwMDAxCQkvKiBNYXN0ZXIgTW9kZSBFbmFibGUJCQkJCQkqLworI2RlZmluZQlNQUREX0xFTgkweDAwMDIJCS8qIE1hc3RlciBBZGRyZXNzIExlbmd0aAkJCQkJKi8KKyNkZWZpbmUJTURJUgkJMHgwMDA0CQkvKiBNYXN0ZXIgVHJhbnNtaXQgRGlyZWN0aW9uIChSWC9UWCopCQkqLworI2RlZmluZQlGQVNUCQkweDAwMDgJCS8qIFVzZSBGYXN0IE1vZGUgVGltaW5nIFNwZWNzCQkJCSovCisjZGVmaW5lCVNUT1AJCTB4MDAxMAkJLyogSXNzdWUgU3RvcCBDb25kaXRpb24JCQkJCQkqLworI2RlZmluZQlSU1RBUlQJCTB4MDAyMAkJLyogUmVwZWF0IFN0YXJ0IG9yIFN0b3AqIEF0IEVuZCBPZiBUcmFuc2ZlcgkqLworI2RlZmluZQlEQ05UCQkweDNGQzAJCS8qIERhdGEgQnl0ZXMgVG8gVHJhbnNmZXIJCQkJCSovCisjZGVmaW5lCVNEQU9WUgkJMHg0MDAwCQkvKiBTZXJpYWwgRGF0YSBPdmVycmlkZQkJCQkJCSovCisjZGVmaW5lCVNDTE9WUgkJMHg4MDAwCQkvKiBTZXJpYWwgQ2xvY2sgT3ZlcnJpZGUJCQkJCSovCisKKy8qIFRXSV9NQVNURVJfU1RBVCBNYXNrcwkJCQkJCQkJCQkJCQkJKi8KKyNkZWZpbmUJTVBST0cJCTB4MDAwMQkJLyogTWFzdGVyIFRyYW5zZmVyIEluIFByb2dyZXNzCQkJCQkqLworI2RlZmluZQlMT1NUQVJCCQkweDAwMDIJCS8qIExvc3QgQXJiaXRyYXRpb24gSW5kaWNhdG9yIChYZmVyIEFib3J0ZWQpCSovCisjZGVmaW5lCUFOQUsJCTB4MDAwNAkJLyogQWRkcmVzcyBOb3QgQWNrbm93bGVkZ2VkCQkJCQkJKi8KKyNkZWZpbmUJRE5BSwkJMHgwMDA4CQkvKiBEYXRhIE5vdCBBY2tub3dsZWRnZWQJCQkJCQkqLworI2RlZmluZQlCVUZSREVSUgkweDAwMTAJCS8qIEJ1ZmZlciBSZWFkIEVycm9yCQkJCQkJCSovCisjZGVmaW5lCUJVRldSRVJSCTB4MDAyMAkJLyogQnVmZmVyIFdyaXRlIEVycm9yCQkJCQkJCSovCisjZGVmaW5lCVNEQVNFTgkJMHgwMDQwCQkvKiBTZXJpYWwgRGF0YSBTZW5zZQkJCQkJCQkqLworI2RlZmluZQlTQ0xTRU4JCTB4MDA4MAkJLyogU2VyaWFsIENsb2NrIFNlbnNlCQkJCQkJCSovCisjZGVmaW5lCUJVU0JVU1kJCTB4MDEwMAkJLyogQnVzIEJ1c3kgSW5kaWNhdG9yCQkJCQkJCSovCisKKy8qIFRXSV9JTlRfU1JDIGFuZCBUV0lfSU5UX0VOQUJMRSBNYXNrcwkJCQkJCSovCisjZGVmaW5lCVNJTklUCQkweDAwMDEJCS8qIFNsYXZlIFRyYW5zZmVyIEluaXRpYXRlZAkqLworI2RlZmluZQlTQ09NUAkJMHgwMDAyCQkvKiBTbGF2ZSBUcmFuc2ZlciBDb21wbGV0ZQkqLworI2RlZmluZQlTRVJSCQkweDAwMDQJCS8qIFNsYXZlIFRyYW5zZmVyIEVycm9yCQkqLworI2RlZmluZQlTT1ZGCQkweDAwMDgJCS8qIFNsYXZlIE92ZXJmbG93CQkJKi8KKyNkZWZpbmUJTUNPTVAJCTB4MDAxMAkJLyogTWFzdGVyIFRyYW5zZmVyIENvbXBsZXRlCSovCisjZGVmaW5lCU1FUlIJCTB4MDAyMAkJLyogTWFzdGVyIFRyYW5zZmVyIEVycm9yCSovCisjZGVmaW5lCVhNVFNFUlYJCTB4MDA0MAkJLyogVHJhbnNtaXQgRklGTyBTZXJ2aWNlCSovCisjZGVmaW5lCVJDVlNFUlYJCTB4MDA4MAkJLyogUmVjZWl2ZSBGSUZPIFNlcnZpY2UJCSovCisKKy8qIFRXSV9GSUZPX0NUUkwgTWFza3MJCQkJCQkJCQkJCQkqLworI2RlZmluZQlYTVRGTFVTSAkweDAwMDEJCS8qIFRyYW5zbWl0IEJ1ZmZlciBGbHVzaAkJCSovCisjZGVmaW5lCVJDVkZMVVNICTB4MDAwMgkJLyogUmVjZWl2ZSBCdWZmZXIgRmx1c2gJCQkJKi8KKyNkZWZpbmUJWE1USU5UTEVOCTB4MDAwNAkJLyogVHJhbnNtaXQgQnVmZmVyIEludGVycnVwdCBMZW5ndGgJKi8KKyNkZWZpbmUJUkNWSU5UTEVOCTB4MDAwOAkJLyogUmVjZWl2ZSBCdWZmZXIgSW50ZXJydXB0IExlbmd0aAkqLworCisvKiBUV0lfRklGT19TVEFUIE1hc2tzCQkJCQkJCQkJCQkJCQkJKi8KKyNkZWZpbmUJWE1UU1RBVAkJMHgwMDAzCQkvKiBUcmFuc21pdCBGSUZPIFN0YXR1cwkJCQkJCQkqLworI2RlZmluZQlYTVRfRU1QVFkJMHgwMDAwCQkvKiAJCVRyYW5zbWl0IEZJRk8gRW1wdHkJCQkJCQkqLworI2RlZmluZQlYTVRfSEFMRgkweDAwMDEJCS8qIAkJVHJhbnNtaXQgRklGTyBIYXMgMSBCeXRlIFRvIFdyaXRlCQkqLworI2RlZmluZQlYTVRfRlVMTAkweDAwMDMJCS8qIAkJVHJhbnNtaXQgRklGTyBGdWxsICgyIEJ5dGVzIFRvIFdyaXRlKQkqLworCisjZGVmaW5lCVJDVlNUQVQJCTB4MDAwQwkJLyogUmVjZWl2ZSBGSUZPIFN0YXR1cwkJCQkJCQkqLworI2RlZmluZQlSQ1ZfRU1QVFkJMHgwMDAwCQkvKiAJCVJlY2VpdmUgRklGTyBFbXB0eQkJCQkJCSovCisjZGVmaW5lCVJDVl9IQUxGCTB4MDAwNAkJLyogCQlSZWNlaXZlIEZJRk8gSGFzIDEgQnl0ZSBUbyBSZWFkCQkJKi8KKyNkZWZpbmUJUkNWX0ZVTEwJMHgwMDBDCQkvKiAJCVJlY2VpdmUgRklGTyBGdWxsICgyIEJ5dGVzIFRvIFJlYWQpCQkqLworCisKKy8qICAqKioqKioqKioqKioqKioqKioqICBQSU4gQ09OVFJPTCBSRUdJU1RFUiBNQVNLUyAgKioqKioqKioqKioqKioqKioqKioqKioqLworLyogUE9SVF9NVVggTWFza3MJCQkJCQkJCQkJCQkJCQkqLworI2RlZmluZQlQSlNFCQkJMHgwMDAxCQkJLyogUG9ydCBKIFNQSS9TUE9SVCBFbmFibGUJCQkqLworI2RlZmluZQlQSlNFX1NQT1JUCQkweDAwMDAJCQkvKiAJCUVuYWJsZSBURlMwL0RUMFBSSQkJCSovCisjZGVmaW5lCVBKU0VfU1BJCQkweDAwMDEJCQkvKiAJCUVuYWJsZSBTUElfU1NFTDM6MgkJCSovCisKKyNkZWZpbmUJUEpDRSh4KQkJCSgoKHgpJjB4Myk8PDEpCS8qIFBvcnQgSiBDQU4vU1BJL1NQT1JUIEVuYWJsZQkJKi8KKyNkZWZpbmUJUEpDRV9TUE9SVAkJMHgwMDAwCQkJLyogCQlFbmFibGUgRFIwU0VDL0RUMFNFQwkJKi8KKyNkZWZpbmUJUEpDRV9DQU4JCTB4MDAwMgkJCS8qIAkJRW5hYmxlIENBTiBSWC9UWAkJCSovCisjZGVmaW5lCVBKQ0VfU1BJCQkweDAwMDQJCQkvKiAJCUVuYWJsZSBTUElfU1NFTDcJCQkqLworCisjZGVmaW5lCVBGREUJCQkweDAwMDgJCQkvKiBQb3J0IEYgRE1BIFJlcXVlc3QgRW5hYmxlCQkqLworI2RlZmluZQlQRkRFX1VBUlQJCTB4MDAwMAkJCS8qIAkJRW5hYmxlIFVBUlQwIFJYL1RYCQkJKi8KKyNkZWZpbmUJUEZERV9ETUEJCTB4MDAwOAkJCS8qIAkJRW5hYmxlIERNQVIxOjAJCQkJKi8KKworI2RlZmluZQlQRlRFCQkJMHgwMDEwCQkJLyogUG9ydCBGIFRpbWVyIEVuYWJsZQkJCQkqLworI2RlZmluZQlQRlRFX1VBUlQJCTB4MDAwMAkJCS8qCQlFbmFibGUgVUFSVDEgUlgvVFgJCQkqLworI2RlZmluZQlQRlRFX1RJTUVSCQkweDAwMTAJCQkvKiAJCUVuYWJsZSBUTVI3OjYJCQkJKi8KKworI2RlZmluZQlQRlM2RQkJCTB4MDAyMAkJCS8qIFBvcnQgRiBTUEkgU1NFTCA2IEVuYWJsZQkJCSovCisjZGVmaW5lCVBGUzZFX1RJTUVSCQkweDAwMDAJCQkvKgkJRW5hYmxlIFRNUjUJCQkJCSovCisjZGVmaW5lCVBGUzZFX1NQSQkJMHgwMDIwCQkJLyogCQlFbmFibGUgU1BJX1NTRUw2CQkJKi8KKworI2RlZmluZQlQRlM1RQkJCTB4MDA0MAkJCS8qIFBvcnQgRiBTUEkgU1NFTCA1IEVuYWJsZQkJCSovCisjZGVmaW5lCVBGUzVFX1RJTUVSCQkweDAwMDAJCQkvKgkJRW5hYmxlIFRNUjQJCQkJCSovCisjZGVmaW5lCVBGUzVFX1NQSQkJMHgwMDQwCQkJLyogCQlFbmFibGUgU1BJX1NTRUw1CQkJKi8KKworI2RlZmluZQlQRlM0RQkJCTB4MDA4MAkJCS8qIFBvcnQgRiBTUEkgU1NFTCA0IEVuYWJsZQkJCSovCisjZGVmaW5lCVBGUzRFX1RJTUVSCQkweDAwMDAJCQkvKgkJRW5hYmxlIFRNUjMJCQkJCSovCisjZGVmaW5lCVBGUzRFX1NQSQkJMHgwMDgwCQkJLyogCQlFbmFibGUgU1BJX1NTRUw0CQkJKi8KKworI2RlZmluZQlQRkZFCQkJMHgwMTAwCQkJLyogUG9ydCBGIFBQSSBGcmFtZSBTeW5jIEVuYWJsZQkJKi8KKyNkZWZpbmUJUEZGRV9USU1FUgkJMHgwMDAwCQkJLyogCQlFbmFibGUgVE1SMgkJCQkJKi8KKyNkZWZpbmUJUEZGRV9QUEkJCTB4MDEwMAkJCS8qIAkJRW5hYmxlIFBQSSBGUzMJCQkJKi8KKworI2RlZmluZQlQR1NFCQkJMHgwMjAwCQkJLyogUG9ydCBHIFNQT1JUMSBTZWNvbmRhcnkgRW5hYmxlCSovCisjZGVmaW5lCVBHU0VfUFBJCQkweDAwMDAJCQkvKiAJCUVuYWJsZSBQUEkgRDk6OAkJCQkqLworI2RlZmluZQlQR1NFX1NQT1JUCQkweDAyMDAJCQkvKiAJCUVuYWJsZSBEUjFTRUMvRFQxU0VDCQkqLworCisjZGVmaW5lCVBHUkUJCQkweDA0MDAJCQkvKiBQb3J0IEcgU1BPUlQxIFJlY2VpdmUgRW5hYmxlCQkqLworI2RlZmluZQlQR1JFX1BQSQkJMHgwMDAwCQkJLyogCQlFbmFibGUgUFBJIEQxMjoxMAkJCSovCisjZGVmaW5lCVBHUkVfU1BPUlQJCTB4MDQwMAkJCS8qIAkJRW5hYmxlIERSMVBSSS9SRlMxL1JTQ0xLMQkqLworCisjZGVmaW5lCVBHVEUJCQkweDA4MDAJCQkvKiBQb3J0IEcgU1BPUlQxIFRyYW5zbWl0IEVuYWJsZQkqLworI2RlZmluZQlQR1RFX1BQSQkJMHgwMDAwCQkJLyogCQlFbmFibGUgUFBJIEQxNToxMwkJCSovCisjZGVmaW5lCVBHVEVfU1BPUlQJCTB4MDgwMAkJCS8qIAkJRW5hYmxlIERUMVBSSS9URlMxL1RTQ0xLMQkqLworCisKKy8qICAqKioqKioqKioqKioqKioqKiogIEhBTkRTSEFLRSBETUEgKEhETUEpIE1BU0tTICAqKioqKioqKioqKioqKioqKioqKiovCisvKiBIRE1BeF9DVEwgTWFza3MJCQkJCQkJCQkJCQkJCSovCisjZGVmaW5lCUhNRE1BRU4JCTB4MDAwMQkvKiBFbmFibGUgSGFuZHNoYWtlIERNQSAwLzEJCQkJCSovCisjZGVmaW5lCVJFUAkJCTB4MDAwMgkvKiBIRE1BIFJlcXVlc3QgUG9sYXJpdHkJCQkJCSovCisjZGVmaW5lCVVURQkJCTB4MDAwNAkvKiBVcmdlbmN5IFRocmVzaG9sZCBFbmFibGUJCQkJCSovCisjZGVmaW5lCU9JRQkJCTB4MDAxMAkvKiBPdmVyZmxvdyBJbnRlcnJ1cHQgRW5hYmxlCQkJCSovCisjZGVmaW5lCUJESUUJCTB4MDAyMAkvKiBCbG9jayBEb25lIEludGVycnVwdCBFbmFibGUJCQkJKi8KKyNkZWZpbmUJTUJESQkJMHgwMDQwCS8qIE1hc2sgQmxvY2sgRG9uZSBJUlEgSWYgUGVuZGluZyBFQ05UCQkqLworI2RlZmluZQlEUlEJCQkweDAzMDAJLyogSERNQSBSZXF1ZXN0IFR5cGUJCQkJCQkqLworI2RlZmluZQlEUlFfTk9ORQkweDAwMDAJLyogCQlObyBSZXF1ZXN0CQkJCQkJCSovCisjZGVmaW5lCURSUV9TSU5HTEUJMHgwMTAwCS8qIAkJQ2hhbm5lbHMgUmVxdWVzdCBTaW5nbGUJCQkJKi8KKyNkZWZpbmUJRFJRX01VTFRJCTB4MDIwMAkvKiAJCUNoYW5uZWxzIFJlcXVlc3QgTXVsdGkgKERlZmF1bHQpCSovCisjZGVmaW5lCURSUV9VUkdFTlQJMHgwMzAwCS8qIAkJQ2hhbm5lbHMgUmVxdWVzdCBNdWx0aSBVcmdlbnQJCSovCisjZGVmaW5lCVJCQwkJCTB4MTAwMAkvKiBSZWxvYWQgQkNOVCBXaXRoIElCQ05UCQkJCQkqLworI2RlZmluZQlQUwkJCTB4MjAwMAkvKiBIRE1BIFBpbiBTdGF0dXMJCQkJCQkJKi8KKyNkZWZpbmUJT0kJCQkweDQwMDAJLyogT3ZlcmZsb3cgSW50ZXJydXB0IEdlbmVyYXRlZAkJCQkqLworI2RlZmluZQlCREkJCQkweDgwMDAJLyogQmxvY2sgRG9uZSBJbnRlcnJ1cHQgR2VuZXJhdGVkCQkJKi8KKworLyogZW50cnkgYWRkcmVzc2VzIG9mIHRoZSB1c2VyLWNhbGxhYmxlIEJvb3QgUk9NIGZ1bmN0aW9ucyAqLworCisjZGVmaW5lIF9CT09UUk9NX1JFU0VUIDB4RUYwMDAwMDAKKyNkZWZpbmUgX0JPT1RST01fRklOQUxfSU5JVCAweEVGMDAwMDAyCisjZGVmaW5lIF9CT09UUk9NX0RPX01FTU9SWV9ETUEgMHhFRjAwMDAwNgorI2RlZmluZSBfQk9PVFJPTV9CT09UX0RYRV9GTEFTSCAweEVGMDAwMDA4CisjZGVmaW5lIF9CT09UUk9NX0JPT1RfRFhFX1NQSSAweEVGMDAwMDBBCisjZGVmaW5lIF9CT09UUk9NX0JPT1RfRFhFX1RXSSAweEVGMDAwMDBDCisjZGVmaW5lIF9CT09UUk9NX0dFVF9EWEVfQUREUkVTU19GTEFTSCAweEVGMDAwMDEwCisjZGVmaW5lIF9CT09UUk9NX0dFVF9EWEVfQUREUkVTU19TUEkgMHhFRjAwMDAxMgorI2RlZmluZSBfQk9PVFJPTV9HRVRfRFhFX0FERFJFU1NfVFdJIDB4RUYwMDAwMTQKKworLyogQWx0ZXJuYXRlIERlcHJlY2F0ZWQgTWFjcm9zIFByb3ZpZGVkIEZvciBCYWNrd2FyZHMgQ29kZSBDb21wYXRpYmlsaXR5ICovCisjZGVmaW5lCVBHREVfVUFSVCAgIFBGREVfVUFSVAorI2RlZmluZQlQR0RFX0RNQSAgICBQRkRFX0RNQQorI2RlZmluZQlDS0VMT1cJCVNDS0VMT1cKKworLyogSE9TVCBQb3J0IFJlZ2lzdGVycyAqLworCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgSE9TVF9DT05UUk9MICAweGZmYzAzNDAwICAgLyogSE9TVCBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgIEhPU1RfU1RBVFVTICAweGZmYzAzNDA0ICAgLyogSE9TVCBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICBIT1NUX1RJTUVPVVQgIDB4ZmZjMDM0MDggICAvKiBIT1NUIEFja25vd2xlZGdlIE1vZGUgVGltZW91dCBSZWdpc3RlciAqLworCisvKiBDb3VudGVyIFJlZ2lzdGVycyAqLworCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICBDTlRfQ09ORklHICAweGZmYzAzNTAwICAgLyogQ29uZmlndXJhdGlvbiBSZWdpc3RlciAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgIENOVF9JTUFTSyAgMHhmZmMwMzUwNCAgIC8qIEludGVycnVwdCBNYXNrIFJlZ2lzdGVyICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICBDTlRfU1RBVFVTICAweGZmYzAzNTA4ICAgLyogU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgIENOVF9DT01NQU5EICAweGZmYzAzNTBjICAgLyogQ29tbWFuZCBSZWdpc3RlciAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgIENOVF9ERUJPVU5DRSAgMHhmZmMwMzUxMCAgIC8qIERlYm91bmNlIFJlZ2lzdGVyICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgIENOVF9DT1VOVEVSICAweGZmYzAzNTE0ICAgLyogQ291bnRlciBSZWdpc3RlciAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgICAgQ05UX01BWCAgMHhmZmMwMzUxOCAgIC8qIE1heGltYWwgQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgICAgIENOVF9NSU4gIDB4ZmZjMDM1MWMgICAvKiBNaW5pbWFsIENvdW50IFJlZ2lzdGVyICovCisKKy8qIE9UUC9GVVNFIFJlZ2lzdGVycyAqLworCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgIE9UUF9DT05UUk9MICAweGZmYzAzNjAwICAgLyogT1RQL0Z1c2UgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgICAgT1RQX0JFTiAgMHhmZmMwMzYwNCAgIC8qIE9UUC9GdXNlIEJ5dGUgRW5hYmxlICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICBPVFBfU1RBVFVTICAweGZmYzAzNjA4ICAgLyogT1RQL0Z1c2UgU3RhdHVzICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICBPVFBfVElNSU5HICAweGZmYzAzNjBjICAgLyogT1RQL0Z1c2UgQWNjZXNzIFRpbWluZyAqLworCisvKiBTZWN1cml0eSBSZWdpc3RlcnMgKi8KKworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgU0VDVVJFX1NZU1NXVCAgMHhmZmMwMzYyMCAgIC8qIFNlY3VyZSBTeXN0ZW0gU3dpdGNoZXMgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgU0VDVVJFX0NPTlRST0wgIDB4ZmZjMDM2MjQgICAvKiBTZWN1cmUgQ29udHJvbCAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgU0VDVVJFX1NUQVRVUyAgMHhmZmMwMzYyOCAgIC8qIFNlY3VyZSBTdGF0dXMgKi8KKworLyogT1RQIFJlYWQvV3JpdGUgRGF0YSBCdWZmZXIgUmVnaXN0ZXJzICovCisKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgICBPVFBfREFUQTAgIDB4ZmZjMDM2ODAgICAvKiBPVFAvRnVzZSBEYXRhIChPVFBfREFUQTAtMykgYWNjZXNzZXMgdGhlIGZ1c2UgcmVhZCB3cml0ZSBidWZmZXIgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgICBPVFBfREFUQTEgIDB4ZmZjMDM2ODQgICAvKiBPVFAvRnVzZSBEYXRhIChPVFBfREFUQTAtMykgYWNjZXNzZXMgdGhlIGZ1c2UgcmVhZCB3cml0ZSBidWZmZXIgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgICBPVFBfREFUQTIgIDB4ZmZjMDM2ODggICAvKiBPVFAvRnVzZSBEYXRhIChPVFBfREFUQTAtMykgYWNjZXNzZXMgdGhlIGZ1c2UgcmVhZCB3cml0ZSBidWZmZXIgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgICBPVFBfREFUQTMgIDB4ZmZjMDM2OGMgICAvKiBPVFAvRnVzZSBEYXRhIChPVFBfREFUQTAtMykgYWNjZXNzZXMgdGhlIGZ1c2UgcmVhZCB3cml0ZSBidWZmZXIgKi8KKworLyogTW90b3IgQ29udHJvbCBQV00gUmVnaXN0ZXJzICovCisKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgICAgUFdNX0NUUkwgIDB4ZmZjMDM3MDAgICAvKiBQV00gQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgICBQV01fU1RBVCAgMHhmZmMwMzcwNCAgIC8qIFBXTSBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgICAgICBQV01fVE0gIDB4ZmZjMDM3MDggICAvKiBQV00gUGVyaW9kIFJlZ2lzdGVyICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgUFdNX0RUICAweGZmYzAzNzBjICAgLyogUFdNIERlYWQgVGltZSBSZWdpc3RlciAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgICBQV01fR0FURSAgMHhmZmMwMzcxMCAgIC8qIFBXTSBDaG9wcGluZyBDb250cm9sICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICAgICBQV01fQ0hBICAweGZmYzAzNzE0ICAgLyogUFdNIENoYW5uZWwgQSBEdXR5IENvbnRyb2wgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgICAgIFBXTV9DSEIgIDB4ZmZjMDM3MTggICAvKiBQV00gQ2hhbm5lbCBCIER1dHkgQ29udHJvbCAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgICAgUFdNX0NIQyAgMHhmZmMwMzcxYyAgIC8qIFBXTSBDaGFubmVsIEMgRHV0eSBDb250cm9sICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICAgICBQV01fU0VHICAweGZmYzAzNzIwICAgLyogUFdNIENyb3Nzb3ZlciBhbmQgT3V0cHV0IEVuYWJsZSAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgUFdNX1NZTkNXVCAgMHhmZmMwMzcyNCAgIC8qIFBXTSBTeW5jIFBsdXNlIFdpZHRoIENvbnRyb2wgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgICAgUFdNX0NIQUwgIDB4ZmZjMDM3MjggICAvKiBQV00gQ2hhbm5lbCBBTCBEdXR5IENvbnRyb2wgKFNSIG1vZGUgb25seSkgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgICAgUFdNX0NIQkwgIDB4ZmZjMDM3MmMgICAvKiBQV00gQ2hhbm5lbCBCTCBEdXR5IENvbnRyb2wgKFNSIG1vZGUgb25seSkgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgICAgUFdNX0NIQ0wgIDB4ZmZjMDM3MzAgICAvKiBQV00gQ2hhbm5lbCBDTCBEdXR5IENvbnRyb2wgKFNSIG1vZGUgb25seSkgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgICAgIFBXTV9MU0kgIDB4ZmZjMDM3MzQgICAvKiBQV00gTG93IFNpZGUgSW52ZXJ0IChTUiBtb2RlIG9ubHkpICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICAgUFdNX1NUQVQyICAweGZmYzAzNzM4ICAgLyogUFdNIFN0YXR1cyBSZWdpc3RlciAyICovCisKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogICAgIFNJTkdMRSBCSVQgTUFDUk8gUEFJUlMgKGJpdCBtYXNrIGFuZCBuZWdhdGVkIG9uZSkgICAgICAqLworLyogICAgIGFuZCBNVUxUSSBCSVQgUkVBRCBNQUNST1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisvKiBCaXQgbWFza3MgZm9yIEhPU1RfQ09OVFJPTCAqLworCisjZGVmaW5lICAgICAgICAgICAgICAgICAgIEhPU1RfQ05UUl9IT1NUX0VOICAweDEgICAgICAgIC8qIEhvc3QgRW5hYmxlICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgSE9TVF9DTlRSX25IT1NUX0VOICAweDAKKyNkZWZpbmUgICAgICAgICAgICAgICAgICBIT1NUX0NOVFJfSE9TVF9FTkQgIDB4MiAgICAgICAgLyogSG9zdCBFbmRpYW5lc3MgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgIEhPU1RfQ05UUl9uSE9TVF9FTkQgIDB4MAorI2RlZmluZSAgICAgICAgICAgICAgICAgSE9TVF9DTlRSX0RBVEFfU0laRSAgMHg0ICAgICAgICAvKiBEYXRhIFNpemUgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgSE9TVF9DTlRSX25EQVRBX1NJWkUgIDB4MAorI2RlZmluZSAgICAgICAgICAgICAgICAgIEhPU1RfQ05UUl9IT1NUX1JTVCAgMHg4ICAgICAgICAvKiBIb3N0IFJlc2V0ICovCisjZGVmaW5lICAgICAgICAgICAgICAgICBIT1NUX0NOVFJfbkhPU1RfUlNUICAweDAKKyNkZWZpbmUgICAgICAgICAgICAgICAgICBIT1NUX0NOVFJfSFJEWV9PVlIgIDB4MjAgICAgICAgLyogSG9zdCBSZWFkeSBPdmVycmlkZSAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgSE9TVF9DTlRSX25IUkRZX09WUiAgMHgwCisjZGVmaW5lICAgICAgICAgICAgICAgICAgSE9TVF9DTlRSX0lOVF9NT0RFICAweDQwICAgICAgIC8qIEludGVycnVwdCBNb2RlICovCisjZGVmaW5lICAgICAgICAgICAgICAgICBIT1NUX0NOVFJfbklOVF9NT0RFICAweDAKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICBIT1NUX0NOVFJfQlRfRU4gIDB4ODAgICAgICAgLyogQnVzIFRpbWVvdXQgRW5hYmxlICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgIEhPU1RfQ05UUl8gbkJUX0VOICAweDAKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgIEhPU1RfQ05UUl9FSFcgIDB4MTAwICAgICAgLyogRW5hYmxlIEhvc3QgV3JpdGUgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgSE9TVF9DTlRSX25FSFcgIDB4MAorI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgSE9TVF9DTlRSX0VIUiAgMHgyMDAgICAgICAvKiBFbmFibGUgSG9zdCBSZWFkICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgIEhPU1RfQ05UUl9uRUhSICAweDAKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgIEhPU1RfQ05UUl9CRFIgIDB4NDAwICAgICAgLyogQnVyc3QgRE1BIFJlcXVlc3RzICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgIEhPU1RfQ05UUl9uQkRSICAweDAKKworLyogQml0IG1hc2tzIGZvciBIT1NUX1NUQVRVUyAqLworCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgSE9TVF9TVEFUX1JFQURZICAweDEgICAgICAgIC8qIERNQSBSZWFkeSAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgSE9TVF9TVEFUX25SRUFEWSAgMHgwCisjZGVmaW5lICAgICAgICAgICAgICAgICAgSE9TVF9TVEFUX0ZJRk9GVUxMICAweDIgICAgICAgIC8qIEZJRk8gRnVsbCAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgSE9TVF9TVEFUX25GSUZPRlVMTCAgMHgwCisjZGVmaW5lICAgICAgICAgICAgICAgICBIT1NUX1NUQVRfRklGT0VNUFRZICAweDQgICAgICAgIC8qIEZJRk8gRW1wdHkgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgSE9TVF9TVEFUX25GSUZPRU1QVFkgIDB4MAorI2RlZmluZSAgICAgICAgICAgICAgICAgIEhPU1RfU1RBVF9DT01QTEVURSAgMHg4ICAgICAgICAvKiBETUEgQ29tcGxldGUgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgIEhPU1RfU1RBVF9uQ09NUExFVEUgIDB4MAorI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICBIT1NUX1NUQVRfSFNISyAgMHgxMCAgICAgICAvKiBIb3N0IEhhbmRzaGFrZSAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgIEhPU1RfU1RBVF9uSFNISyAgMHgwCisjZGVmaW5lICAgICAgICAgICAgICAgICAgIEhPU1RfU1RBVF9USU1FT1VUICAweDIwICAgICAgIC8qIEhvc3QgVGltZW91dCAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgIEhPU1RfU1RBVF9uVElNRU9VVCAgMHgwCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgIEhPU1RfU1RBVF9ISVJRICAweDQwICAgICAgIC8qIEhvc3QgSW50ZXJydXB0IFJlcXVlc3QgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICBIT1NUX1NUQVRfbkhJUlEgIDB4MAorI2RlZmluZSAgICAgICAgICAgICAgICBIT1NUX1NUQVRfQUxMT1dfQ05GRyAgMHg4MCAgICAgICAvKiBBbGxvdyBOZXcgQ29uZmlndXJhdGlvbiAqLworI2RlZmluZSAgICAgICAgICAgICAgIEhPU1RfU1RBVF9uQUxMT1dfQ05GRyAgMHgwCisjZGVmaW5lICAgICAgICAgICAgICAgICAgIEhPU1RfU1RBVF9ETUFfRElSICAweDEwMCAgICAgIC8qIERNQSBEaXJlY3Rpb24gKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICBIT1NUX1NUQVRfbkRNQV9ESVIgIDB4MAorI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgSE9TVF9TVEFUX0JURSAgMHgyMDAgICAgICAvKiBCdXMgVGltZW91dCBFbmFibGVkICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgIEhPU1RfU1RBVF9uQlRFICAweDAKKyNkZWZpbmUgICAgICAgICAgICAgICBIT1NUX1NUQVRfSE9TVFJEX0RPTkUgIDB4ODAwMCAgICAgLyogSG9zdCBSZWFkIENvbXBsZXRpb24gSW50ZXJydXB0ICovCisjZGVmaW5lICAgICAgICAgICAgICBIT1NUX1NUQVRfbkhPU1RSRF9ET05FICAweDAKKworLyogQml0IG1hc2tzIGZvciBIT1NUX1RJTUVPVVQgKi8KKworI2RlZmluZSAgICAgICAgICAgICBIT1NUX0NPVU5UX1RJTUVPVVQgIDB4N2ZmICAgICAgLyogSG9zdCBUaW1lb3V0IGNvdW50ICovCisKKy8qIEJpdCBtYXNrcyBmb3IgQ05UX0NPTkZJRyAqLworCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgIENOVEUgIDB4MSAgICAgICAgLyogQ291bnRlciBFbmFibGUgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICBuQ05URSAgMHgwCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgIERFQkUgIDB4MiAgICAgICAgLyogRGVib3VuY2UgRW5hYmxlICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgbkRFQkUgIDB4MAorI2RlZmluZSAgICAgICAgICAgICAgICAgICAgQ0RHSU5WICAweDEwICAgICAgIC8qIENERyBQaW4gUG9sYXJpdHkgSW52ZXJ0ICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgIG5DREdJTlYgIDB4MAorI2RlZmluZSAgICAgICAgICAgICAgICAgICAgQ1VESU5WICAweDIwICAgICAgIC8qIENVRCBQaW4gUG9sYXJpdHkgSW52ZXJ0ICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgIG5DVURJTlYgIDB4MAorI2RlZmluZSAgICAgICAgICAgICAgICAgICAgQ1pNSU5WICAweDQwICAgICAgIC8qIENaTSBQaW4gUG9sYXJpdHkgSW52ZXJ0ICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgIG5DWk1JTlYgIDB4MAorI2RlZmluZSAgICAgICAgICAgICAgICAgICBDTlRNT0RFICAweDcwMCAgICAgIC8qIENvdW50ZXIgT3BlcmF0aW5nIE1vZGUgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgWk1aQyAgMHg4MDAgICAgICAvKiBDWk0gWmVyb2VzIENvdW50ZXIgRW5hYmxlICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgblpNWkMgIDB4MAorI2RlZmluZSAgICAgICAgICAgICAgICAgICBCTkRNT0RFICAweDMwMDAgICAgIC8qIEJvdW5kYXJ5IHJlZ2lzdGVyIE1vZGUgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgIElOUERJUyAgMHg4MDAwICAgICAvKiBDVUcgYW5kIENERyBJbnB1dCBEaXNhYmxlICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgIG5JTlBESVMgIDB4MAorCisvKiBCaXQgbWFza3MgZm9yIENOVF9JTUFTSyAqLworCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgIElDSUUgIDB4MSAgICAgICAgLyogSWxsZWdhbCBHcmF5L0JpbmFyeSBDb2RlIEludGVycnVwdCBFbmFibGUgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICBuSUNJRSAgMHgwCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgIFVDSUUgIDB4MiAgICAgICAgLyogVXAgY291bnQgSW50ZXJydXB0IEVuYWJsZSAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgIG5VQ0lFICAweDAKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgRENJRSAgMHg0ICAgICAgICAvKiBEb3duIGNvdW50IEludGVycnVwdCBFbmFibGUgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICBuRENJRSAgMHgwCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICBNSU5DSUUgIDB4OCAgICAgICAgLyogTWluIENvdW50IEludGVycnVwdCBFbmFibGUgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgbk1JTkNJRSAgMHgwCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICBNQVhDSUUgIDB4MTAgICAgICAgLyogTWF4IENvdW50IEludGVycnVwdCBFbmFibGUgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgbk1BWENJRSAgMHgwCisjZGVmaW5lICAgICAgICAgICAgICAgICAgIENPVjMxSUUgIDB4MjAgICAgICAgLyogQml0IDMxIE92ZXJmbG93IEludGVycnVwdCBFbmFibGUgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICBuQ09WMzFJRSAgMHgwCisjZGVmaW5lICAgICAgICAgICAgICAgICAgIENPVjE1SUUgIDB4NDAgICAgICAgLyogQml0IDE1IE92ZXJmbG93IEludGVycnVwdCBFbmFibGUgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICBuQ09WMTVJRSAgMHgwCisjZGVmaW5lICAgICAgICAgICAgICAgICAgIENaRVJPSUUgIDB4ODAgICAgICAgLyogQ291bnQgdG8gWmVybyBJbnRlcnJ1cHQgRW5hYmxlICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgbkNaRVJPSUUgIDB4MAorI2RlZmluZSAgICAgICAgICAgICAgICAgICAgIENaTUlFICAweDEwMCAgICAgIC8qIENaTSBQaW4gSW50ZXJydXB0IEVuYWJsZSAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgbkNaTUlFICAweDAKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgIENaTUVJRSAgMHgyMDAgICAgICAvKiBDWk0gRXJyb3IgSW50ZXJydXB0IEVuYWJsZSAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICBuQ1pNRUlFICAweDAKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgIENaTVpJRSAgMHg0MDAgICAgICAvKiBDWk0gWmVyb2VzIENvdW50ZXIgSW50ZXJydXB0IEVuYWJsZSAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICBuQ1pNWklFICAweDAKKworLyogQml0IG1hc2tzIGZvciBDTlRfU1RBVFVTICovCisKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgSUNJSSAgMHgxICAgICAgICAvKiBJbGxlZ2FsIEdyYXkvQmluYXJ5IENvZGUgSW50ZXJydXB0IElkZW50aWZpZXIgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICBuSUNJSSAgMHgwCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgIFVDSUkgIDB4MiAgICAgICAgLyogVXAgY291bnQgSW50ZXJydXB0IElkZW50aWZpZXIgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICBuVUNJSSAgMHgwCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgIERDSUkgIDB4NCAgICAgICAgLyogRG93biBjb3VudCBJbnRlcnJ1cHQgSWRlbnRpZmllciAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgIG5EQ0lJICAweDAKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgIE1JTkNJSSAgMHg4ICAgICAgICAvKiBNaW4gQ291bnQgSW50ZXJydXB0IElkZW50aWZpZXIgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgbk1JTkNJSSAgMHgwCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICBNQVhDSUkgIDB4MTAgICAgICAgLyogTWF4IENvdW50IEludGVycnVwdCBJZGVudGlmaWVyICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgIG5NQVhDSUkgIDB4MAorI2RlZmluZSAgICAgICAgICAgICAgICAgICBDT1YzMUlJICAweDIwICAgICAgIC8qIEJpdCAzMSBPdmVyZmxvdyBJbnRlcnJ1cHQgSWRlbnRpZmllciAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgIG5DT1YzMUlJICAweDAKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgQ09WMTVJSSAgMHg0MCAgICAgICAvKiBCaXQgMTUgT3ZlcmZsb3cgSW50ZXJydXB0IElkZW50aWZpZXIgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICBuQ09WMTVJSSAgMHgwCisjZGVmaW5lICAgICAgICAgICAgICAgICAgIENaRVJPSUkgIDB4ODAgICAgICAgLyogQ291bnQgdG8gWmVybyBJbnRlcnJ1cHQgSWRlbnRpZmllciAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgIG5DWkVST0lJICAweDAKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICBDWk1JSSAgMHgxMDAgICAgICAvKiBDWk0gUGluIEludGVycnVwdCBJZGVudGlmaWVyICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICBuQ1pNSUkgIDB4MAorI2RlZmluZSAgICAgICAgICAgICAgICAgICAgQ1pNRUlJICAweDIwMCAgICAgIC8qIENaTSBFcnJvciBJbnRlcnJ1cHQgSWRlbnRpZmllciAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICBuQ1pNRUlJICAweDAKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgIENaTVpJSSAgMHg0MDAgICAgICAvKiBDWk0gWmVyb2VzIENvdW50ZXIgSW50ZXJydXB0IElkZW50aWZpZXIgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgbkNaTVpJSSAgMHgwCisKKy8qIEJpdCBtYXNrcyBmb3IgQ05UX0NPTU1BTkQgKi8KKworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgVzFMQ05UICAweGYgICAgICAgIC8qIExvYWQgQ291bnRlciBSZWdpc3RlciAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgVzFMTUlOICAweGYwICAgICAgIC8qIExvYWQgTWluIFJlZ2lzdGVyICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICBXMUxNQVggIDB4ZjAwICAgICAgLyogTG9hZCBNYXggUmVnaXN0ZXIgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICBXMVpNT05DRSAgMHgxMDAwICAgICAvKiBFbmFibGUgQ1pNIENsZWFyIENvdW50ZXIgT25jZSAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgblcxWk1PTkNFICAweDAKKworLyogQml0IG1hc2tzIGZvciBDTlRfREVCT1VOQ0UgKi8KKworI2RlZmluZSAgICAgICAgICAgICAgICAgRFBSRVNDQUxFICAweGYgICAgICAgIC8qIExvYWQgQ291bnRlciBSZWdpc3RlciAqLworCisvKiBDTlRfQ09NTUFORCBiaXQgZmllbGQgb3B0aW9ucyAqLworCisjZGVmaW5lIFcxTENOVF9aRVJPICAgMHgwMDAxICAgLyogd3JpdGUgMSB0byBsb2FkIENOVF9DT1VOVEVSIHdpdGggemVybyAqLworI2RlZmluZSBXMUxDTlRfTUlOICAgIDB4MDAwNCAgIC8qIHdyaXRlIDEgdG8gbG9hZCBDTlRfQ09VTlRFUiBmcm9tIENOVF9NSU4gKi8KKyNkZWZpbmUgVzFMQ05UX01BWCAgICAweDAwMDggICAvKiB3cml0ZSAxIHRvIGxvYWQgQ05UX0NPVU5URVIgZnJvbSBDTlRfTUFYICovCisKKyNkZWZpbmUgVzFMTUlOX1pFUk8gICAweDAwMTAgICAvKiB3cml0ZSAxIHRvIGxvYWQgQ05UX01JTiB3aXRoIHplcm8gKi8KKyNkZWZpbmUgVzFMTUlOX0NOVCAgICAweDAwMjAgICAvKiB3cml0ZSAxIHRvIGxvYWQgQ05UX01JTiBmcm9tIENOVF9DT1VOVEVSICovCisjZGVmaW5lIFcxTE1JTl9NQVggICAgMHgwMDgwICAgLyogd3JpdGUgMSB0byBsb2FkIENOVF9NSU4gZnJvbSBDTlRfTUFYICovCisKKyNkZWZpbmUgVzFMTUFYX1pFUk8gICAweDAxMDAgICAvKiB3cml0ZSAxIHRvIGxvYWQgQ05UX01BWCB3aXRoIHplcm8gKi8KKyNkZWZpbmUgVzFMTUFYX0NOVCAgICAweDAyMDAgICAvKiB3cml0ZSAxIHRvIGxvYWQgQ05UX01BWCBmcm9tIENOVF9DT1VOVEVSICovCisjZGVmaW5lIFcxTE1BWF9NSU4gICAgMHgwNDAwICAgLyogd3JpdGUgMSB0byBsb2FkIENOVF9NQVggZnJvbSBDTlRfTUlOICovCisKKy8qIENOVF9DT05GSUcgYml0IGZpZWxkIG9wdGlvbnMgKi8KKworI2RlZmluZSBDTlRNT0RFX1FVQURFTkMgIDB4MDAwMCAgLyogcXVhZHJhdHVyZSBlbmNvZGVyIG1vZGUgKi8KKyNkZWZpbmUgQ05UTU9ERV9CSU5FTkMgICAweDAxMDAgIC8qIGJpbmFyeSBlbmNvZGVyIG1vZGUgKi8KKyNkZWZpbmUgQ05UTU9ERV9VRENOVCAgICAweDAyMDAgIC8qIHVwL2Rvd24gY291bnRlciBtb2RlICovCisjZGVmaW5lIENOVE1PREVfRElSQ05UICAgMHgwNDAwICAvKiBkaXJlY3Rpb24gY291bnRlciBtb2RlICovCisjZGVmaW5lIENOVE1PREVfRElSVE1SICAgMHgwNTAwICAvKiBkaXJlY3Rpb24gdGltZXIgbW9kZSAqLworCisjZGVmaW5lIEJORE1PREVfQ09NUCAgICAgMHgwMDAwICAvKiBib3VuZGFyeSBjb21wYXJlIG1vZGUgKi8KKyNkZWZpbmUgQk5ETU9ERV9aRVJPICAgICAweDEwMDAgIC8qIGJvdW5kYXJ5IGNvbXBhcmUgYW5kIHplcm8gbW9kZSAqLworI2RlZmluZSBCTkRNT0RFX0NBUFQgICAgIDB4MjAwMCAgLyogYm91bmRhcnkgY2FwdHVyZSBtb2RlICovCisjZGVmaW5lIEJORE1PREVfQUVYVCAgICAgMHgzMDAwICAvKiBib3VuZGFyeSBhdXRvLWV4dGVuZCBtb2RlICovCisKKy8qIEJpdCBtYXNrcyBmb3IgT1RQX0NPTlRST0wgKi8KKworI2RlZmluZSAgICAgICAgICAgICAgICBGVVNFX0ZBRERSICAweDFmZiAgICAgIC8qIE9UUC9GdXNlIEFkZHJlc3MgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgRklFTiAgMHg4MDAgICAgICAvKiBPVFAvRnVzZSBJbnRlcnJ1cHQgRW5hYmxlICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgbkZJRU4gIDB4MAorI2RlZmluZSAgICAgICAgICAgICAgICAgIEZURVNUREVDICAweDEwMDAgICAgIC8qIE9UUC9GdXNlIFRlc3QgRGVjb2RlciAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgbkZURVNUREVDICAweDAKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgRldSVEVTVCAgMHgyMDAwICAgICAvKiBPVFAvRnVzZSBXcml0ZSBUZXN0ICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgbkZXUlRFU1QgIDB4MAorI2RlZmluZSAgICAgICAgICAgICAgICAgICAgIEZSREVOICAweDQwMDAgICAgIC8qIE9UUC9GdXNlIFJlYWQgRW5hYmxlICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICBuRlJERU4gIDB4MAorI2RlZmluZSAgICAgICAgICAgICAgICAgICAgIEZXUkVOICAweDgwMDAgICAgIC8qIE9UUC9GdXNlIFdyaXRlIEVuYWJsZSAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgbkZXUkVOICAweDAKKworLyogQml0IG1hc2tzIGZvciBPVFBfQkVOICovCisKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgRkJFTiAgMHhmZmZmICAgICAvKiBPVFAvRnVzZSBCeXRlIEVuYWJsZSAqLworCisvKiBCaXQgbWFza3MgZm9yIE9UUF9TVEFUVVMgKi8KKworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgIEZDT01QICAweDEgICAgICAgIC8qIE9UUC9GdXNlIEFjY2VzcyBDb21wbGV0ZSAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgbkZDT01QICAweDAKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgIEZFUlJPUiAgMHgyICAgICAgICAvKiBPVFAvRnVzZSBBY2Nlc3MgRXJyb3IgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgbkZFUlJPUiAgMHgwCisjZGVmaW5lICAgICAgICAgICAgICAgICAgTU1SR0xPQUQgIDB4MTAgICAgICAgLyogTWVtb3J5IE1hcHBlZCBSZWdpc3RlciBHYXNrZXQgTG9hZCAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgbk1NUkdMT0FEICAweDAKKyNkZWZpbmUgICAgICAgICAgICAgICAgICBNTVJHTE9DSyAgMHgyMCAgICAgICAvKiBNZW1vcnkgTWFwcGVkIFJlZ2lzdGVyIEdhc2tldCBMb2NrICovCisjZGVmaW5lICAgICAgICAgICAgICAgICBuTU1SR0xPQ0sgIDB4MAorI2RlZmluZSAgICAgICAgICAgICAgICAgICAgRlBHTUVOICAweDQwICAgICAgIC8qIE9UUC9GdXNlIFByb2dyYW0gRW5hYmxlICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgIG5GUEdNRU4gIDB4MAorCisvKiBCaXQgbWFza3MgZm9yIE9UUF9USU1JTkcgKi8KKworI2RlZmluZSAgICAgICAgICAgICAgICAgICBVU0VDRElWICAweGZmICAgICAgIC8qIE1pY3JvIFNlY29uZCBEaXZpZGVyICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgIFJFQURBQ0MgIDB4N2YwMCAgICAgLyogUmVhZCBBY2Nlc3MgVGltZSAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICBDUFVNUFJMICAweDM4MDAwICAgIC8qIENoYXJnZSBQdW1wIFJlbGVhc2UgVGltZSAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICBDUFVNUFNVICAweGMwMDAwICAgIC8qIENoYXJnZSBQdW1wIFNldHVwIFRpbWUgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgQ1BVTVBIRCAgMHhmMDAwMDAgICAvKiBDaGFyZ2UgUHVtcCBIb2xkIFRpbWUgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgUEdNVElNRSAgMHhmZjAwMDAwMCAvKiBQcm9ncmFtIFRpbWUgKi8KKworLyogQml0IG1hc2tzIGZvciBTRUNVUkVfU1lTU1dUICovCisKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgRU1VREFCTCAgMHgxICAgICAgICAvKiBFbXVsYXRpb24gRGlzYWJsZS4gKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICBuRU1VREFCTCAgMHgwCisjZGVmaW5lICAgICAgICAgICAgICAgICAgIFJTVERBQkwgIDB4MiAgICAgICAgLyogUmVzZXQgRGlzYWJsZSAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgIG5SU1REQUJMICAweDAKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgTDFJREFCTCAgMHgxYyAgICAgICAvKiBMMSBJbnN0cnVjdGlvbiBNZW1vcnkgRGlzYWJsZS4gKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICBMMURBREFCTCAgMHhlMCAgICAgICAvKiBMMSBEYXRhIEJhbmsgQSBNZW1vcnkgRGlzYWJsZS4gKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICBMMURCREFCTCAgMHg3MDAgICAgICAvKiBMMSBEYXRhIEJhbmsgQiBNZW1vcnkgRGlzYWJsZS4gKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgRE1BME9WUiAgMHg4MDAgICAgICAvKiBETUEwIE1lbW9yeSBBY2Nlc3MgT3ZlcnJpZGUgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICBuRE1BME9WUiAgMHgwCisjZGVmaW5lICAgICAgICAgICAgICAgICAgIERNQTFPVlIgIDB4MTAwMCAgICAgLyogRE1BMSBNZW1vcnkgQWNjZXNzIE92ZXJyaWRlICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgbkRNQTFPVlIgIDB4MAorI2RlZmluZSAgICAgICAgICAgICAgICAgICAgRU1VT1ZSICAweDQwMDAgICAgIC8qIEVtdWxhdGlvbiBPdmVycmlkZSAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICBuRU1VT1ZSICAweDAKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgIE9UUFNFTiAgMHg4MDAwICAgICAvKiBPVFAgU2VjcmV0cyBFbmFibGUuICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgIG5PVFBTRU4gIDB4MAorI2RlZmluZSAgICAgICAgICAgICAgICAgICAgTDJEQUJMICAweDcwMDAwICAgIC8qIEwyIE1lbW9yeSBEaXNhYmxlLiAqLworCisvKiBCaXQgbWFza3MgZm9yIFNFQ1VSRV9DT05UUk9MICovCisKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgU0VDVVJFMCAgMHgxICAgICAgICAvKiBTRUNVUkUgMCAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgIG5TRUNVUkUwICAweDAKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgU0VDVVJFMSAgMHgyICAgICAgICAvKiBTRUNVUkUgMSAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgIG5TRUNVUkUxICAweDAKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgU0VDVVJFMiAgMHg0ICAgICAgICAvKiBTRUNVUkUgMiAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgIG5TRUNVUkUyICAweDAKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgU0VDVVJFMyAgMHg4ICAgICAgICAvKiBTRUNVUkUgMyAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgIG5TRUNVUkUzICAweDAKKworLyogQml0IG1hc2tzIGZvciBTRUNVUkVfU1RBVFVTICovCisKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgU0VDTU9ERSAgMHgzICAgICAgICAvKiBTZWN1cmVkIE1vZGUgQ29udHJvbCBTdGF0ZSAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgTk1JICAweDQgICAgICAgIC8qIE5vbiBNYXNrYWJsZSBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgbk5NSSAgMHgwCisjZGVmaW5lICAgICAgICAgICAgICAgICAgIEFGVkFMSUQgIDB4OCAgICAgICAgLyogQXV0aGVudGljYXRpb24gRmlybXdhcmUgVmFsaWQgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICBuQUZWQUxJRCAgMHgwCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICBBRkVYSVQgIDB4MTAgICAgICAgLyogQXV0aGVudGljYXRpb24gRmlybXdhcmUgRXhpdCAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICBuQUZFWElUICAweDAKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgU0VDU1RBVCAgMHhlMCAgICAgICAvKiBTZWN1cmUgU3RhdHVzICovCisKKworCisjZW5kaWYgLyogX0RFRl9CRjUxWF9IICovCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvaW5jbHVkZS9tYWNoL2RtYS5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2luY2x1ZGUvbWFjaC9kbWEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYmQzM2MxCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2luY2x1ZGUvbWFjaC9kbWEuaApAQCAtMCwwICsxLDMzIEBACisvKiBtYWNoL2RtYS5oIC0gYXJjaC1zcGVjaWZpYyBETUEgZGVmaW5lcworICoKKyAqIENvcHlyaWdodCAyMDA0LTIwMDggQW5hbG9nIERldmljZXMgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KKyAqLworCisjaWZuZGVmIF9NQUNIX0RNQV9IXworI2RlZmluZSBfTUFDSF9ETUFfSF8KKworI2RlZmluZSBNQVhfRE1BX0NIQU5ORUxTIDE2CisKKyNkZWZpbmUgQ0hfUFBJIAkJCTAJLyogUFBJIHJlY2VpdmUvdHJhbnNtaXQgKi8KKyNkZWZpbmUgQ0hfRU1BQ19SWCAJCTEJLyogRXRoZXJuZXQgTUFDIHJlY2VpdmUgKi8KKyNkZWZpbmUgQ0hfRU1BQ19UWCAJCTIJLyogRXRoZXJuZXQgTUFDIHRyYW5zbWl0ICovCisjZGVmaW5lIENIX1NQT1JUMF9SWCAJCTMJLyogU1BPUlQwIHJlY2VpdmUgKi8KKyNkZWZpbmUgQ0hfU1BPUlQwX1RYIAkJNAkvKiBTUE9SVDAgdHJhbnNtaXQgKi8KKyNkZWZpbmUgQ0hfUlNJIAkJCTQJLyogUlNJICovCisjZGVmaW5lIENIX1NQT1JUMV9SWCAJCTUJLyogU1BPUlQxIHJlY2VpdmUgKi8KKyNkZWZpbmUgQ0hfU1BJMSAJCTUJLyogU1BJMSB0cmFuc21pdC9yZWNlaXZlICovCisjZGVmaW5lIENIX1NQT1JUMV9UWCAJCTYJLyogU1BPUlQxIHRyYW5zbWl0ICovCisjZGVmaW5lIENIX1NQSTAgCQk3CS8qIFNQSTAgdHJhbnNtaXQvcmVjZWl2ZSAqLworI2RlZmluZSBDSF9VQVJUMF9SWCAJCTgJLyogVUFSVDAgcmVjZWl2ZSAqLworI2RlZmluZSBDSF9VQVJUMF9UWCAJCTkJLyogVUFSVDAgdHJhbnNtaXQgKi8KKyNkZWZpbmUgQ0hfVUFSVDFfUlggCQkxMAkvKiBVQVJUMSByZWNlaXZlICovCisjZGVmaW5lIENIX1VBUlQxX1RYIAkJMTEJLyogVUFSVDEgdHJhbnNtaXQgKi8KKworI2RlZmluZSBDSF9NRU1fU1RSRUFNMF9TUkMgCTEyCS8qIFJYICovCisjZGVmaW5lIENIX01FTV9TVFJFQU0wX0RFU1QJMTMJLyogVFggKi8KKyNkZWZpbmUgQ0hfTUVNX1NUUkVBTTFfU1JDIAkxNAkvKiBSWCAqLworI2RlZmluZSBDSF9NRU1fU1RSRUFNMV9ERVNUCTE1CS8qIFRYICovCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2luY2x1ZGUvbWFjaC9ncGlvLmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvaW5jbHVkZS9tYWNoL2dwaW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzU3NjgzCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2luY2x1ZGUvbWFjaC9ncGlvLmgKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIEZpbGU6IGFyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9pbmNsdWRlL21hY2gvZ3Bpby5oCisgKiBCdWdzOiBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggQW5hbG9nIERldmljZXMgSW5jLgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgorICovCisKKworI2lmbmRlZiBfTUFDSF9HUElPX0hfCisjZGVmaW5lIF9NQUNIX0dQSU9fSF8KKworI2RlZmluZSBNQVhfQkxBQ0tGSU5fR1BJT1MgNDAKKworI2RlZmluZQlHUElPX1BGMAkwCisjZGVmaW5lCUdQSU9fUEYxCTEKKyNkZWZpbmUJR1BJT19QRjIJMgorI2RlZmluZQlHUElPX1BGMwkzCisjZGVmaW5lCUdQSU9fUEY0CTQKKyNkZWZpbmUJR1BJT19QRjUJNQorI2RlZmluZQlHUElPX1BGNgk2CisjZGVmaW5lCUdQSU9fUEY3CTcKKyNkZWZpbmUJR1BJT19QRjgJOAorI2RlZmluZQlHUElPX1BGOQk5CisjZGVmaW5lCUdQSU9fUEYxMAkxMAorI2RlZmluZQlHUElPX1BGMTEJMTEKKyNkZWZpbmUJR1BJT19QRjEyCTEyCisjZGVmaW5lCUdQSU9fUEYxMwkxMworI2RlZmluZQlHUElPX1BGMTQJMTQKKyNkZWZpbmUJR1BJT19QRjE1CTE1CisjZGVmaW5lCUdQSU9fUEcwCTE2CisjZGVmaW5lCUdQSU9fUEcxCTE3CisjZGVmaW5lCUdQSU9fUEcyCTE4CisjZGVmaW5lCUdQSU9fUEczCTE5CisjZGVmaW5lCUdQSU9fUEc0CTIwCisjZGVmaW5lCUdQSU9fUEc1CTIxCisjZGVmaW5lCUdQSU9fUEc2CTIyCisjZGVmaW5lCUdQSU9fUEc3CTIzCisjZGVmaW5lCUdQSU9fUEc4CTI0CisjZGVmaW5lCUdQSU9fUEc5CTI1CisjZGVmaW5lCUdQSU9fUEcxMCAgICAgIAkyNgorI2RlZmluZQlHUElPX1BHMTEgICAgICAJMjcKKyNkZWZpbmUJR1BJT19QRzEyICAgICAgCTI4CisjZGVmaW5lCUdQSU9fUEcxMyAgICAgIAkyOQorI2RlZmluZQlHUElPX1BHMTQgICAgICAJMzAKKyNkZWZpbmUJR1BJT19QRzE1ICAgICAgCTMxCisjZGVmaW5lCUdQSU9fUEgwCTMyCisjZGVmaW5lCUdQSU9fUEgxCTMzCisjZGVmaW5lCUdQSU9fUEgyCTM0CisjZGVmaW5lCUdQSU9fUEgzCTM1CisjZGVmaW5lCUdQSU9fUEg0CTM2CisjZGVmaW5lCUdQSU9fUEg1CTM3CisjZGVmaW5lCUdQSU9fUEg2CTM4CisjZGVmaW5lCUdQSU9fUEg3CTM5CisKKyNkZWZpbmUgUE9SVF9GIEdQSU9fUEYwCisjZGVmaW5lIFBPUlRfRyBHUElPX1BHMAorI2RlZmluZSBQT1JUX0ggR1BJT19QSDAKKworI2VuZGlmIC8qIF9NQUNIX0dQSU9fSF8gKi8KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9pbmNsdWRlL21hY2gvaXJxLmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvaW5jbHVkZS9tYWNoL2lycS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmZjBmMDkKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvaW5jbHVkZS9tYWNoL2lycS5oCkBAIC0wLDAgKzEsMjYwIEBACisvKgorICogZmlsZToJaW5jbHVkZS9hc20tYmxhY2tmaW4vbWFjaC1iZjUxOC9pcnEuaAorICogYmFzZWQgb246CWluY2x1ZGUvYXNtLWJsYWNrZmluL21hY2gtYmY1MjcvaXJxLmgKKyAqIGF1dGhvcjoJTWljaGFlbCBIZW5uZXJpY2ggKG1pY2hhZWwuaGVubmVyaWNoQGFuYWxvZy5jb20pCisgKgorICogY3JlYXRlZDoKKyAqIGRlc2NyaXB0aW9uOgorICoJc3lzdGVtIG1tciByZWdpc3RlciBtYXAKKyAqIHJldjoKKyAqCisgKiBtb2RpZmllZDoKKyAqCisgKgorICogYnVnczogICAgICAgICBlbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KKyAqCisgKiB0aGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBnbnUgZ2VuZXJhbCBwdWJsaWMgbGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBmcmVlIHNvZnR3YXJlIGZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIHRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IHdpdGhvdXQgYW55IHdhcnJhbnR5OyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIG1lcmNoYW50YWJpbGl0eSBvciBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gIHNlZSB0aGUKKyAqIGdudSBnZW5lcmFsIHB1YmxpYyBsaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogeW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgZ251IGdlbmVyYWwgcHVibGljIGxpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgY29weWluZy4KKyAqIGlmIG5vdCwgd3JpdGUgdG8gdGhlIGZyZWUgc29mdHdhcmUgZm91bmRhdGlvbiwKKyAqIDU5IHRlbXBsZSBwbGFjZSAtIHN1aXRlIDMzMCwgYm9zdG9uLCBtYSAwMjExMS0xMzA3LCB1c2EuCisgKi8KKworI2lmbmRlZiBfQkY1MThfSVJRX0hfCisjZGVmaW5lIF9CRjUxOF9JUlFfSF8KKworLyoKKyAqIEludGVycnVwdCBzb3VyY2UgZGVmaW5pdGlvbnMKKwlFdmVudCBTb3VyY2UgICAgQ29yZSBFdmVudCBOYW1lCisJQ29yZSAgICAgICAgRW11bGF0aW9uICAgICAgICAgICAgICAgKioKKwlFdmVudHMgICAgICAgICAoaGlnaGVzdCBwcmlvcml0eSkgIEVNVSAgICAgICAgIDAKKwlSZXNldCAgICAgICAgICAgICAgICAgICBSU1QgICAgICAgICAxCisJTk1JICAgICAgICAgICAgICAgICAgICAgTk1JICAgICAgICAgMgorCUV4Y2VwdGlvbiAgICAgICAgICAgICAgIEVWWCAgICAgICAgIDMKKwlSZXNlcnZlZCAgICAgICAgICAgICAgICAtLSAgICAgICAgICA0CisJSGFyZHdhcmUgRXJyb3IgICAgICAgICAgSVZIVyAgICAgICAgNQorCUNvcmUgVGltZXIgICAgICAgICAgICAgIElWVE1SICAgICAgIDYgKgorCisJLi4uLi4KKworCSBTb2Z0d2FyZSBJbnRlcnJ1cHQgMSAgICBJVkcxNCAgICAgICAzMQorCSBTb2Z0d2FyZSBJbnRlcnJ1cHQgMiAgICAtLQorCSAobG93ZXN0IHByaW9yaXR5KSAgSVZHMTUgICAgICAgMzIgKgorKi8KKworI2RlZmluZSBOUl9QRVJJX0lOVFMgICAgKDIgKiAzMikKKworLyogVGhlIEFCU1RSQUNUIElSUSBkZWZpbml0aW9ucyAqLworLyoqIHRoZSBmaXJzdCBzZXZlbiBvZiB0aGUgZm9sbG93aW5nIGFyZSBmaXhlZCwgdGhlIHJlc3QgeW91IGNoYW5nZSBpZiB5b3UgbmVlZCB0byAqKi8KKyNkZWZpbmUgSVJRX0VNVQkJCTAJLyogRW11bGF0aW9uICovCisjZGVmaW5lIElSUV9SU1QJCQkxCS8qIHJlc2V0ICovCisjZGVmaW5lIElSUV9OTUkJCQkyCS8qIE5vbiBNYXNrYWJsZSAqLworI2RlZmluZSBJUlFfRVZYCQkJMwkvKiBFeGNlcHRpb24gKi8KKyNkZWZpbmUgSVJRX1VOVVNFRAkJNAkvKiAtIHVudXNlZCBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgSVJRX0hXRVJSCQk1CS8qIEhhcmR3YXJlIEVycm9yICovCisjZGVmaW5lIElSUV9DT1JFVE1SCQk2CS8qIENvcmUgdGltZXIgKi8KKworI2RlZmluZSBCRklOX0lSUSh4KQkJKCh4KSArIDcpCisKKyNkZWZpbmUgSVJRX1BMTF9XQUtFVVAJCUJGSU5fSVJRKDApCS8qIFBMTCBXYWtldXAgSW50ZXJydXB0ICovCisjZGVmaW5lIElSUV9ETUEwX0VSUk9SCQlCRklOX0lSUSgxKQkvKiBETUEgRXJyb3IgMCAoZ2VuZXJpYykgKi8KKyNkZWZpbmUgSVJRX0RNQVIwX0JMSwkJQkZJTl9JUlEoMikJLyogRE1BUjAgQmxvY2sgSW50ZXJydXB0ICovCisjZGVmaW5lIElSUV9ETUFSMV9CTEsJCUJGSU5fSVJRKDMpCS8qIERNQVIxIEJsb2NrIEludGVycnVwdCAqLworI2RlZmluZSBJUlFfRE1BUjBfT1ZSCQlCRklOX0lSUSg0KQkvKiBETUFSMCBPdmVyZmxvdyBFcnJvciAqLworI2RlZmluZSBJUlFfRE1BUjFfT1ZSCQlCRklOX0lSUSg1KQkvKiBETUFSMSBPdmVyZmxvdyBFcnJvciAqLworI2RlZmluZSBJUlFfUFBJX0VSUk9SCQlCRklOX0lSUSg2KQkvKiBQUEkgRXJyb3IgKi8KKyNkZWZpbmUgSVJRX01BQ19FUlJPUgkJQkZJTl9JUlEoNykJLyogTUFDIFN0YXR1cyAqLworI2RlZmluZSBJUlFfU1BPUlQwX0VSUk9SCUJGSU5fSVJRKDgpCS8qIFNQT1JUMCBTdGF0dXMgKi8KKyNkZWZpbmUgSVJRX1NQT1JUMV9FUlJPUglCRklOX0lSUSg5KQkvKiBTUE9SVDEgU3RhdHVzICovCisjZGVmaW5lIElSUV9QVFBfRVJST1IJCUJGSU5fSVJRKDEwKQkvKiBQVFAgRXJyb3IgSW50ZXJydXB0ICovCisjZGVmaW5lIElSUV9VQVJUMF9FUlJPUgkJQkZJTl9JUlEoMTIpCS8qIFVBUlQwIFN0YXR1cyAqLworI2RlZmluZSBJUlFfVUFSVDFfRVJST1IJCUJGSU5fSVJRKDEzKQkvKiBVQVJUMSBTdGF0dXMgKi8KKyNkZWZpbmUgSVJRX1JUQwkJCUJGSU5fSVJRKDE0KQkvKiBSVEMgKi8KKyNkZWZpbmUgSVJRX1BQSSAgICAgIAkJQkZJTl9JUlEoMTUpCS8qIERNQSBDaGFubmVsIDAgKFBQSSkgKi8KKyNkZWZpbmUgSVJRX1NQT1JUMF9SWAkJQkZJTl9JUlEoMTYpCS8qIERNQSAzIENoYW5uZWwgKFNQT1JUMCBSWCkgKi8KKyNkZWZpbmUgSVJRX1NQT1JUMF9UWAkJQkZJTl9JUlEoMTcpCS8qIERNQSA0IENoYW5uZWwgKFNQT1JUMCBUWCkgKi8KKyNkZWZpbmUgSVJRX1JTSQkJCUJGSU5fSVJRKDE3KQkvKiBETUEgNCBDaGFubmVsIChSU0kpICovCisjZGVmaW5lIElSUV9TUE9SVDFfUlgJCUJGSU5fSVJRKDE4KQkvKiBETUEgNSBDaGFubmVsIChTUE9SVDEgUlgvU1BJKSAqLworI2RlZmluZSBJUlFfU1BJMQkJQkZJTl9JUlEoMTgpCS8qIERNQSA1IENoYW5uZWwgKFNQSTEpICovCisjZGVmaW5lIElSUV9TUE9SVDFfVFgJCUJGSU5fSVJRKDE5KQkvKiBETUEgNiBDaGFubmVsIChTUE9SVDEgVFgpICovCisjZGVmaW5lIElSUV9UV0kgICAgICAJCUJGSU5fSVJRKDIwKQkvKiBUV0kgKi8KKyNkZWZpbmUgSVJRX1NQSTAgICAgIAkJQkZJTl9JUlEoMjEpCS8qIERNQSA3IENoYW5uZWwgKFNQSTApICovCisjZGVmaW5lIElSUV9VQVJUMF9SWCAJCUJGSU5fSVJRKDIyKQkvKiBETUE4IENoYW5uZWwgKFVBUlQwIFJYKSAqLworI2RlZmluZSBJUlFfVUFSVDBfVFggCQlCRklOX0lSUSgyMykJLyogRE1BOSBDaGFubmVsIChVQVJUMCBUWCkgKi8KKyNkZWZpbmUgSVJRX1VBUlQxX1JYIAkJQkZJTl9JUlEoMjQpCS8qIERNQTEwIENoYW5uZWwgKFVBUlQxIFJYKSAqLworI2RlZmluZSBJUlFfVUFSVDFfVFggCQlCRklOX0lSUSgyNSkJLyogRE1BMTEgQ2hhbm5lbCAoVUFSVDEgVFgpICovCisjZGVmaW5lIElSUV9PUFRTRUMgICAJCUJGSU5fSVJRKDI2KQkvKiBPVFBTRUMgSW50ZXJydXB0ICovCisjZGVmaW5lIElSUV9DTlQgICAJCUJGSU5fSVJRKDI3KQkvKiBHUCBDb3VudGVyICovCisjZGVmaW5lIElSUV9NQUNfUlggICAJCUJGSU5fSVJRKDI4KQkvKiBETUExIENoYW5uZWwgKE1BQyBSWCkgKi8KKyNkZWZpbmUgSVJRX1BPUlRIX0lOVEEgICAJQkZJTl9JUlEoMjkpCS8qIFBvcnQgSCBJbnRlcnJ1cHQgQSAqLworI2RlZmluZSBJUlFfTUFDX1RYCQlCRklOX0lSUSgzMCkJLyogRE1BMiBDaGFubmVsIChNQUMgVFgpICovCisjZGVmaW5lIElSUV9QT1JUSF9JTlRCCQlCRklOX0lSUSgzMSkJLyogUG9ydCBIIEludGVycnVwdCBCICovCisjZGVmaW5lIElSUV9USU1FUjAJCUJGSU5fSVJRKDMyKQkvKiBUaW1lciAwICovCisjZGVmaW5lIElSUV9USU1FUjEJCUJGSU5fSVJRKDMzKQkvKiBUaW1lciAxICovCisjZGVmaW5lIElSUV9USU1FUjIJCUJGSU5fSVJRKDM0KQkvKiBUaW1lciAyICovCisjZGVmaW5lIElSUV9USU1FUjMJCUJGSU5fSVJRKDM1KQkvKiBUaW1lciAzICovCisjZGVmaW5lIElSUV9USU1FUjQJCUJGSU5fSVJRKDM2KQkvKiBUaW1lciA0ICovCisjZGVmaW5lIElSUV9USU1FUjUJCUJGSU5fSVJRKDM3KQkvKiBUaW1lciA1ICovCisjZGVmaW5lIElSUV9USU1FUjYJCUJGSU5fSVJRKDM4KQkvKiBUaW1lciA2ICovCisjZGVmaW5lIElSUV9USU1FUjcJCUJGSU5fSVJRKDM5KQkvKiBUaW1lciA3ICovCisjZGVmaW5lIElSUV9QT1JUR19JTlRBCQlCRklOX0lSUSg0MCkJLyogUG9ydCBHIEludGVycnVwdCBBICovCisjZGVmaW5lIElSUV9QT1JUR19JTlRCCQlCRklOX0lSUSg0MSkJLyogUG9ydCBHIEludGVycnVwdCBCICovCisjZGVmaW5lIElSUV9NRU1fRE1BMAkJQkZJTl9JUlEoNDIpCS8qIE1ETUEgU3RyZWFtIDAgKi8KKyNkZWZpbmUgSVJRX01FTV9ETUExCQlCRklOX0lSUSg0MykJLyogTURNQSBTdHJlYW0gMSAqLworI2RlZmluZSBJUlFfV0FUQ0gJCUJGSU5fSVJRKDQ0KQkvKiBTb2Z0d2FyZSBXYXRjaGRvZyBUaW1lciAqLworI2RlZmluZSBJUlFfUE9SVEZfSU5UQQkJQkZJTl9JUlEoNDUpCS8qIFBvcnQgRiBJbnRlcnJ1cHQgQSAqLworI2RlZmluZSBJUlFfUE9SVEZfSU5UQgkJQkZJTl9JUlEoNDYpCS8qIFBvcnQgRiBJbnRlcnJ1cHQgQiAqLworI2RlZmluZSBJUlFfU1BJMF9FUlJPUgkJQkZJTl9JUlEoNDcpCS8qIFNQSTAgU3RhdHVzICovCisjZGVmaW5lIElSUV9TUEkxX0VSUk9SCQlCRklOX0lSUSg0OCkJLyogU1BJMSBFcnJvciAqLworI2RlZmluZSBJUlFfUlNJX0lOVDAJCUJGSU5fSVJRKDUxKQkvKiBSU0kgSW50ZXJydXB0MCAqLworI2RlZmluZSBJUlFfUlNJX0lOVDEJCUJGSU5fSVJRKDUyKQkvKiBSU0kgSW50ZXJydXB0MSAqLworI2RlZmluZSBJUlFfUFdNX1RSSVAJCUJGSU5fSVJRKDUzKQkvKiBQV00gVHJpcCBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUgSVJRX1BXTV9TWU5DCQlCRklOX0lSUSg1NCkJLyogUFdNIFN5bmMgSW50ZXJydXB0ICovCisjZGVmaW5lIElSUV9QVFBfU1RBVAkJQkZJTl9JUlEoNTUpCS8qIFBUUCBTdGF0IEludGVycnVwdCAqLworCisjZGVmaW5lIFNZU19JUlFTICAgICAgICAJQkZJTl9JUlEoNjMpCS8qIDcwICovCisKKyNkZWZpbmUgSVJRX1BGMCAgICAgICAgIDcxCisjZGVmaW5lIElSUV9QRjEgICAgICAgICA3MgorI2RlZmluZSBJUlFfUEYyICAgICAgICAgNzMKKyNkZWZpbmUgSVJRX1BGMyAgICAgICAgIDc0CisjZGVmaW5lIElSUV9QRjQgICAgICAgICA3NQorI2RlZmluZSBJUlFfUEY1ICAgICAgICAgNzYKKyNkZWZpbmUgSVJRX1BGNiAgICAgICAgIDc3CisjZGVmaW5lIElSUV9QRjcgICAgICAgICA3OAorI2RlZmluZSBJUlFfUEY4ICAgICAgICAgNzkKKyNkZWZpbmUgSVJRX1BGOSAgICAgICAgIDgwCisjZGVmaW5lIElSUV9QRjEwICAgICAgICA4MQorI2RlZmluZSBJUlFfUEYxMSAgICAgICAgODIKKyNkZWZpbmUgSVJRX1BGMTIgICAgICAgIDgzCisjZGVmaW5lIElSUV9QRjEzICAgICAgICA4NAorI2RlZmluZSBJUlFfUEYxNCAgICAgICAgODUKKyNkZWZpbmUgSVJRX1BGMTUgICAgICAgIDg2CisKKyNkZWZpbmUgSVJRX1BHMCAgICAgICAgIDg3CisjZGVmaW5lIElSUV9QRzEgICAgICAgICA4OAorI2RlZmluZSBJUlFfUEcyICAgICAgICAgODkKKyNkZWZpbmUgSVJRX1BHMyAgICAgICAgIDkwCisjZGVmaW5lIElSUV9QRzQgICAgICAgICA5MQorI2RlZmluZSBJUlFfUEc1ICAgICAgICAgOTIKKyNkZWZpbmUgSVJRX1BHNiAgICAgICAgIDkzCisjZGVmaW5lIElSUV9QRzcgICAgICAgICA5NAorI2RlZmluZSBJUlFfUEc4ICAgICAgICAgOTUKKyNkZWZpbmUgSVJRX1BHOSAgICAgICAgIDk2CisjZGVmaW5lIElSUV9QRzEwICAgICAgICA5NworI2RlZmluZSBJUlFfUEcxMSAgICAgICAgOTgKKyNkZWZpbmUgSVJRX1BHMTIgICAgICAgIDk5CisjZGVmaW5lIElSUV9QRzEzICAgICAgICAxMDAKKyNkZWZpbmUgSVJRX1BHMTQgICAgICAgIDEwMQorI2RlZmluZSBJUlFfUEcxNSAgICAgICAgMTAyCisKKyNkZWZpbmUgSVJRX1BIMCAgICAgICAgIDEwMworI2RlZmluZSBJUlFfUEgxICAgICAgICAgMTA0CisjZGVmaW5lIElSUV9QSDIgICAgICAgICAxMDUKKyNkZWZpbmUgSVJRX1BIMyAgICAgICAgIDEwNgorI2RlZmluZSBJUlFfUEg0ICAgICAgICAgMTA3CisjZGVmaW5lIElSUV9QSDUgICAgICAgICAxMDgKKyNkZWZpbmUgSVJRX1BINiAgICAgICAgIDEwOQorI2RlZmluZSBJUlFfUEg3ICAgICAgICAgMTEwCisjZGVmaW5lIElSUV9QSDggICAgICAgICAxMTEKKyNkZWZpbmUgSVJRX1BIOSAgICAgICAgIDExMgorI2RlZmluZSBJUlFfUEgxMCAgICAgICAgMTEzCisjZGVmaW5lIElSUV9QSDExICAgICAgICAxMTQKKyNkZWZpbmUgSVJRX1BIMTIgICAgICAgIDExNQorI2RlZmluZSBJUlFfUEgxMyAgICAgICAgMTE2CisjZGVmaW5lIElSUV9QSDE0ICAgICAgICAxMTcKKyNkZWZpbmUgSVJRX1BIMTUgICAgICAgIDExOAorCisjZGVmaW5lIEdQSU9fSVJRX0JBU0UJSVJRX1BGMAorCisjZGVmaW5lIE5SX0lSUVMgICAgIChJUlFfUEgxNSArIDEpCisKKyNkZWZpbmUgSVZHNyAgICAgICAgICAgIDcKKyNkZWZpbmUgSVZHOCAgICAgICAgICAgIDgKKyNkZWZpbmUgSVZHOSAgICAgICAgICAgIDkKKyNkZWZpbmUgSVZHMTAgICAgICAgICAgIDEwCisjZGVmaW5lIElWRzExICAgICAgICAgICAxMQorI2RlZmluZSBJVkcxMiAgICAgICAgICAgMTIKKyNkZWZpbmUgSVZHMTMgICAgICAgICAgIDEzCisjZGVmaW5lIElWRzE0ICAgICAgICAgICAxNAorI2RlZmluZSBJVkcxNSAgICAgICAgICAgMTUKKworLyogSUFSMCBCSVQgRklFTERTICovCisjZGVmaW5lIElSUV9QTExfV0FLRVVQX1BPUwkwCisjZGVmaW5lIElSUV9ETUEwX0VSUk9SX1BPUwk0CisjZGVmaW5lIElSUV9ETUFSMF9CTEtfUE9TIAk4CisjZGVmaW5lIElSUV9ETUFSMV9CTEtfUE9TIAkxMgorI2RlZmluZSBJUlFfRE1BUjBfT1ZSX1BPUyAJMTYKKyNkZWZpbmUgSVJRX0RNQVIxX09WUl9QT1MgCTIwCisjZGVmaW5lIElSUV9QUElfRVJST1JfUE9TIAkyNAorI2RlZmluZSBJUlFfTUFDX0VSUk9SX1BPUyAJMjgKKworLyogSUFSMSBCSVQgRklFTERTICovCisjZGVmaW5lIElSUV9TUE9SVDBfRVJST1JfUE9TCTAKKyNkZWZpbmUgSVJRX1NQT1JUMV9FUlJPUl9QT1MJNAorI2RlZmluZSBJUlFfUFRQX0VSUk9SX1BPUwk4CisjZGVmaW5lIElSUV9VQVJUMF9FUlJPUl9QT1MgCTE2CisjZGVmaW5lIElSUV9VQVJUMV9FUlJPUl9QT1MgCTIwCisjZGVmaW5lIElSUV9SVENfUE9TICAgICAgICAgCTI0CisjZGVmaW5lIElSUV9QUElfUE9TICAgICAgICAgCTI4CisKKy8qIElBUjIgQklUIEZJRUxEUyAqLworI2RlZmluZSBJUlFfU1BPUlQwX1JYX1BPUwkwCisjZGVmaW5lIElSUV9TUE9SVDBfVFhfUE9TCTQKKyNkZWZpbmUgSVJRX1JTSV9QT1MJCTQKKyNkZWZpbmUgSVJRX1NQT1JUMV9SWF9QT1MJOAorI2RlZmluZSBJUlFfU1BJMV9QT1MJCTgKKyNkZWZpbmUgSVJRX1NQT1JUMV9UWF9QT1MJMTIKKyNkZWZpbmUgSVJRX1RXSV9QT1MgICAgICAJMTYKKyNkZWZpbmUgSVJRX1NQSTBfUE9TICAgICAgCTIwCisjZGVmaW5lIElSUV9VQVJUMF9SWF9QT1MgCTI0CisjZGVmaW5lIElSUV9VQVJUMF9UWF9QT1MgCTI4CisKKy8qIElBUjMgQklUIEZJRUxEUyAqLworI2RlZmluZSBJUlFfVUFSVDFfUlhfUE9TICAJMAorI2RlZmluZSBJUlFfVUFSVDFfVFhfUE9TICAJNAorI2RlZmluZSBJUlFfT1BUU0VDX1BPUyAgICAJOAorI2RlZmluZSBJUlFfQ05UX1BPUyAgICAgICAJMTIKKyNkZWZpbmUgSVJRX01BQ19SWF9QT1MgICAgCTE2CisjZGVmaW5lIElSUV9QT1JUSF9JTlRBX1BPUwkyMAorI2RlZmluZSBJUlFfTUFDX1RYX1BPUyAgICAJMjQKKyNkZWZpbmUgSVJRX1BPUlRIX0lOVEJfUE9TCTI4CisKKy8qIElBUjQgQklUIEZJRUxEUyAqLworI2RlZmluZSBJUlFfVElNRVIwX1BPUwkJMAorI2RlZmluZSBJUlFfVElNRVIxX1BPUwkJNAorI2RlZmluZSBJUlFfVElNRVIyX1BPUwkJOAorI2RlZmluZSBJUlFfVElNRVIzX1BPUwkJMTIKKyNkZWZpbmUgSVJRX1RJTUVSNF9QT1MJCTE2CisjZGVmaW5lIElSUV9USU1FUjVfUE9TCQkyMAorI2RlZmluZSBJUlFfVElNRVI2X1BPUwkJMjQKKyNkZWZpbmUgSVJRX1RJTUVSN19QT1MJCTI4CisKKy8qIElBUjUgQklUIEZJRUxEUyAqLworI2RlZmluZSBJUlFfUE9SVEdfSU5UQV9QT1MJMAorI2RlZmluZSBJUlFfUE9SVEdfSU5UQl9QT1MJNAorI2RlZmluZSBJUlFfTUVNX0RNQTBfUE9TICAJOAorI2RlZmluZSBJUlFfTUVNX0RNQTFfUE9TICAJMTIKKyNkZWZpbmUgSVJRX1dBVENIX1BPUyAgICAgCTE2CisjZGVmaW5lIElSUV9QT1JURl9JTlRBX1BPUwkyMAorI2RlZmluZSBJUlFfUE9SVEZfSU5UQl9QT1MJMjQKKyNkZWZpbmUgSVJRX1NQSTBfRVJST1JfUE9TIAkyOAorCisvKiBJQVI2IEJJVCBGSUVMRFMgKi8KKyNkZWZpbmUgSVJRX1NQSTFfRVJST1JfUE9TICAJMAorI2RlZmluZSBJUlFfUlNJX0lOVDBfUE9TICAgCTEyCisjZGVmaW5lIElSUV9SU0lfSU5UMV9QT1MgICAJMTYKKyNkZWZpbmUgSVJRX1BXTV9UUklQX1BPUyAgIAkyMAorI2RlZmluZSBJUlFfUFdNX1NZTkNfUE9TICAgCTI0CisjZGVmaW5lIElSUV9QVFBfU1RBVF9QT1MgICAgCTI4CisKKyNlbmRpZgkJCQkvKiBfQkY1MThfSVJRX0hfICovCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvaW5jbHVkZS9tYWNoL21lbV9tYXAuaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9pbmNsdWRlL21hY2gvbWVtX21hcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyYmNjNzgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvaW5jbHVkZS9tYWNoL21lbV9tYXAuaApAQCAtMCwwICsxLDEwOCBAQAorLyoKKyAqIGZpbGU6ICAgICAgICAgaW5jbHVkZS9hc20tYmxhY2tmaW4vbWFjaC1iZjUxOC9tZW1fbWFwLmgKKyAqIGJhc2VkIG9uOglpbmNsdWRlL2FzbS1ibGFja2Zpbi9tYWNoLWJmNTI3L21lbV9tYXAuaAorICogYXV0aG9yOglCcnlhbiBXdSA8Y29vbG9uZXlAa2VybmVsLm9yZz4KKyAqCisgKiBjcmVhdGVkOgorICogZGVzY3JpcHRpb246CisgKglNZW1vcnkgTUFQIENvbW1vbiBoZWFkZXIgZmlsZSBmb3IgYmxhY2tmaW4gQkY1MTgvNi80LzIgb2YgcHJvY2Vzc29ycy4KKyAqIHJldjoKKyAqCisgKiBtb2RpZmllZDoKKyAqCisgKiBidWdzOiAgICAgICAgIGVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLworICoKKyAqIHRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIGdudSBnZW5lcmFsIHB1YmxpYyBsaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIGZyZWUgc29mdHdhcmUgZm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogdGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgd2l0aG91dCBhbnkgd2FycmFudHk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogbWVyY2hhbnRhYmlsaXR5IG9yIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiAgc2VlIHRoZQorICogZ251IGdlbmVyYWwgcHVibGljIGxpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiB5b3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBnbnUgZ2VuZXJhbCBwdWJsaWMgbGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBjb3B5aW5nLgorICogaWYgbm90LCB3cml0ZSB0byB0aGUgZnJlZSBzb2Z0d2FyZSBmb3VuZGF0aW9uLAorICogNTkgdGVtcGxlIHBsYWNlIC0gc3VpdGUgMzMwLCBib3N0b24sIG1hIDAyMTExLTEzMDcsIHVzYS4KKyAqLworCisjaWZuZGVmIF9NRU1fTUFQXzUxOF9IXworI2RlZmluZSBfTUVNX01BUF81MThfSF8KKworI2RlZmluZSBDT1JFTU1SX0JBU0UgICAgICAgICAgIDB4RkZFMDAwMDAJLyogQ29yZSBNTVJzICovCisjZGVmaW5lIFNZU01NUl9CQVNFICAgICAgICAgICAgMHhGRkMwMDAwMAkvKiBTeXN0ZW0gTU1ScyAqLworCisvKiBBc3luYyBNZW1vcnkgQmFua3MgKi8KKyNkZWZpbmUgQVNZTkNfQkFOSzNfQkFTRQkweDIwMzAwMDAwCS8qIEFzeW5jIEJhbmsgMyAqLworI2RlZmluZSBBU1lOQ19CQU5LM19TSVpFCTB4MDAxMDAwMDAJLyogMU0gKi8KKyNkZWZpbmUgQVNZTkNfQkFOSzJfQkFTRQkweDIwMjAwMDAwCS8qIEFzeW5jIEJhbmsgMiAqLworI2RlZmluZSBBU1lOQ19CQU5LMl9TSVpFCTB4MDAxMDAwMDAJLyogMU0gKi8KKyNkZWZpbmUgQVNZTkNfQkFOSzFfQkFTRQkweDIwMTAwMDAwCS8qIEFzeW5jIEJhbmsgMSAqLworI2RlZmluZSBBU1lOQ19CQU5LMV9TSVpFCTB4MDAxMDAwMDAJLyogMU0gKi8KKyNkZWZpbmUgQVNZTkNfQkFOSzBfQkFTRQkweDIwMDAwMDAwCS8qIEFzeW5jIEJhbmsgMCAqLworI2RlZmluZSBBU1lOQ19CQU5LMF9TSVpFCTB4MDAxMDAwMDAJLyogMU0gKi8KKworLyogQm9vdCBST00gTWVtb3J5ICovCisKKyNkZWZpbmUgQk9PVF9ST01fU1RBUlQJCTB4RUYwMDAwMDAKKyNkZWZpbmUgQk9PVF9ST01fTEVOR1RICQkweDgwMDAKKworLyogTGV2ZWwgMSBNZW1vcnkgKi8KKworLyogTWVtb3J5IE1hcCBmb3IgQURTUC1CRjUxOC82LzQvMiBwcm9jZXNzb3JzICovCisKKyNpZmRlZiBDT05GSUdfQkZJTl9JQ0FDSEUKKyNkZWZpbmUgQkZJTl9JQ0FDSEVTSVpFCQkoMTYgKiAxMDI0KQorI2Vsc2UKKyNkZWZpbmUgQkZJTl9JQ0FDSEVTSVpFCQkoMCkKKyNlbmRpZgorCisjZGVmaW5lIEwxX0NPREVfU1RBUlQJCTB4RkZBMDAwMDAKKyNkZWZpbmUgTDFfREFUQV9BX1NUQVJUCQkweEZGODAwMDAwCisjZGVmaW5lIEwxX0RBVEFfQl9TVEFSVAkJMHhGRjkwMDAwMAorCisjZGVmaW5lIEwxX0NPREVfTEVOR1RICQkweEMwMDAKKworI2lmZGVmIENPTkZJR19CRklOX0RDQUNIRQorCisjaWZkZWYgQ09ORklHX0JGSU5fRENBQ0hFX0JBTktBCisjZGVmaW5lIERNRU1fQ05UUiAoQUNBQ0hFX0JTUkFNIHwgRU5EQ1BMQiB8IFBPUlRfUFJFRjApCisjZGVmaW5lIEwxX0RBVEFfQV9MRU5HVEgJKDB4ODAwMCAtIDB4NDAwMCkKKyNkZWZpbmUgTDFfREFUQV9CX0xFTkdUSAkweDgwMDAKKyNkZWZpbmUgQkZJTl9EQ0FDSEVTSVpFCQkoMTYgKiAxMDI0KQorI2RlZmluZSBCRklOX0RTVVBCQU5LUwkJMQorI2Vsc2UKKyNkZWZpbmUgRE1FTV9DTlRSIChBQ0FDSEVfQkNBQ0hFIHwgRU5EQ1BMQiB8IFBPUlRfUFJFRjApCisjZGVmaW5lIEwxX0RBVEFfQV9MRU5HVEgJKDB4ODAwMCAtIDB4NDAwMCkKKyNkZWZpbmUgTDFfREFUQV9CX0xFTkdUSAkoMHg4MDAwIC0gMHg0MDAwKQorI2RlZmluZSBCRklOX0RDQUNIRVNJWkUJCSgzMiAqIDEwMjQpCisjZGVmaW5lIEJGSU5fRFNVUEJBTktTCQkyCisjZW5kaWYKKworI2Vsc2UKKyNkZWZpbmUgRE1FTV9DTlRSIChBU1JBTV9CU1JBTSB8IEVORENQTEIgfCBQT1JUX1BSRUYwKQorI2RlZmluZSBMMV9EQVRBX0FfTEVOR1RICTB4ODAwMAorI2RlZmluZSBMMV9EQVRBX0JfTEVOR1RICTB4ODAwMAorI2RlZmluZSBCRklOX0RDQUNIRVNJWkUJCTAKKyNkZWZpbmUgQkZJTl9EU1VQQkFOS1MJCTAKKyNlbmRpZgkJCQkvKkNPTkZJR19CRklOX0RDQUNIRSAqLworCisvKiBMZXZlbCAyIE1lbW9yeSAtIG5vbmUgKi8KKworI2RlZmluZSBMMl9TVEFSVAkwCisjZGVmaW5lIEwyX0xFTkdUSAkwCisKKy8qIFNjcmF0Y2ggUGFkIE1lbW9yeSAqLworCisjZGVmaW5lIEwxX1NDUkFUQ0hfU1RBUlQJMHhGRkIwMDAwMAorI2RlZmluZSBMMV9TQ1JBVENIX0xFTkdUSAkweDEwMDAKKworI2RlZmluZSBHRVRfUERBX1NBRkUocHJlZykJCVwKKwlwcmVnLmwgPSBfY3B1X3BkYTsJCVwKKwlwcmVnLmggPSBfY3B1X3BkYTsKKworI2RlZmluZSBHRVRfUERBKHByZWcsIGRyZWcpCUdFVF9QREFfU0FGRShwcmVnKQorCisjZW5kaWYJCQkJLyogX01FTV9NQVBfNTE4X0hfICovCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvaW5jbHVkZS9tYWNoL3BvcnRtdXguaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9pbmNsdWRlL21hY2gvcG9ydG11eC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjMTZkNTQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvaW5jbHVkZS9tYWNoL3BvcnRtdXguaApAQCAtMCwwICsxLDE4OCBAQAorI2lmbmRlZiBfTUFDSF9QT1JUTVVYX0hfCisjZGVmaW5lIF9NQUNIX1BPUlRNVVhfSF8KKworI2RlZmluZSBNQVhfUkVTT1VSQ0VTIAlNQVhfQkxBQ0tGSU5fR1BJT1MKKworLyogRU1BQyBNSUkvUk1JSSBQb3J0IE11eCAqLworI2RlZmluZSBQX01JSTBfRVR4RDIJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRjApIHwgUF9GVU5DVCgwKSkKKyNkZWZpbmUgUF9NSUkwX0VSeEQyCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEYxKSB8IFBfRlVOQ1QoMCkpCisjZGVmaW5lIFBfTUlJMF9FVHhEMwkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BGMikgfCBQX0ZVTkNUKDApKQorI2RlZmluZSBQX01JSTBfRVJ4RDMJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRjMpIHwgUF9GVU5DVCgwKSkKKyNkZWZpbmUgUF9NSUkwX0VSeENMSwkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BGNCkgfCBQX0ZVTkNUKDApKQorI2RlZmluZSBQX01JSTBfRVJ4RFYJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRjUpIHwgUF9GVU5DVCgwKSkKKyNkZWZpbmUgUF9NSUkwX0NPTAkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BGNikgfCBQX0ZVTkNUKDApKQorCisjZGVmaW5lIFBfTUlJMF9NREMJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRjgpIHwgUF9GVU5DVCgwKSkKKyNkZWZpbmUgUF9NSUkwX01ESU8JKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRjkpIHwgUF9GVU5DVCgwKSkKKyNkZWZpbmUgUF9NSUkwX0VUeEQwCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEYxMCkgfCBQX0ZVTkNUKDApKQorI2RlZmluZSBQX01JSTBfRVJ4RDAJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRjExKSB8IFBfRlVOQ1QoMCkpCisjZGVmaW5lIFBfTUlJMF9FVHhEMQkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BGMTIpIHwgUF9GVU5DVCgwKSkKKyNkZWZpbmUgUF9NSUkwX0VSeEQxCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEYxMykgfCBQX0ZVTkNUKDApKQorI2RlZmluZSBQX01JSTBfRVR4RU4JKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRjE0KSB8IFBfRlVOQ1QoMCkpCisjZGVmaW5lIFBfTUlJMF9QSFlJTlQJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRjE1KSB8IFBfRlVOQ1QoMCkpCisjZGVmaW5lIFBfTUlJMF9DUlMJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRzApIHwgUF9GVU5DVCgwKSkKKyNkZWZpbmUgUF9NSUkwX0VSeEVSCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEcxKSB8IFBfRlVOQ1QoMCkpCisjZGVmaW5lIFBfTUlJMF9UeENMSwkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BHMikgfCBQX0ZVTkNUKDApKQorCisjZGVmaW5lIFBfTUlJMCB7XAorCVBfTUlJMF9FVHhEMCwgXAorCVBfTUlJMF9FVHhEMSwgXAorCVBfTUlJMF9FVHhEMiwgXAorCVBfTUlJMF9FVHhEMywgXAorCVBfTUlJMF9FVHhFTiwgXAorCVBfTUlJMF9UeENMSywgXAorCVBfTUlJMF9QSFlJTlQsIFwKKwlQX01JSTBfQ09MLCBcCisJUF9NSUkwX0VSeEQwLCBcCisJUF9NSUkwX0VSeEQxLCBcCisJUF9NSUkwX0VSeEQyLCBcCisJUF9NSUkwX0VSeEQzLCBcCisJUF9NSUkwX0VSeERWLCBcCisJUF9NSUkwX0VSeENMSywgXAorCVBfTUlJMF9FUnhFUiwgXAorCVBfTUlJMF9DUlMsIFwKKwlQX01JSTBfTURDLCBcCisJUF9NSUkwX01ESU8sIDB9CisKKyNkZWZpbmUgUF9STUlJMCB7XAorCVBfTUlJMF9FVHhEMCwgXAorCVBfTUlJMF9FVHhEMSwgXAorCVBfTUlJMF9FVHhFTiwgXAorCVBfTUlJMF9FUnhEMCwgXAorCVBfTUlJMF9FUnhEMSwgXAorCVBfTUlJMF9FUnhFUiwgXAorCVBfTUlJMF9UeENMSywgXAorCVBfTUlJMF9QSFlJTlQsIFwKKwlQX01JSTBfQ1JTLCBcCisJUF9NSUkwX01EQywgXAorCVBfTUlJMF9NRElPLCAwfQorCisvKiBQUEkgUG9ydCBNdXggKi8KKyNkZWZpbmUgUF9QUEkwX0QwCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEYwKSB8IFBfRlVOQ1QoMSkpCisjZGVmaW5lIFBfUFBJMF9EMQkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BGMSkgfCBQX0ZVTkNUKDEpKQorI2RlZmluZSBQX1BQSTBfRDIJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRjIpIHwgUF9GVU5DVCgxKSkKKyNkZWZpbmUgUF9QUEkwX0QzCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEYzKSB8IFBfRlVOQ1QoMSkpCisjZGVmaW5lIFBfUFBJMF9ENAkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BGNCkgfCBQX0ZVTkNUKDEpKQorI2RlZmluZSBQX1BQSTBfRDUJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRjUpIHwgUF9GVU5DVCgxKSkKKyNkZWZpbmUgUF9QUEkwX0Q2CShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEY2KSB8IFBfRlVOQ1QoMSkpCisjZGVmaW5lIFBfUFBJMF9ENwkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BGNykgfCBQX0ZVTkNUKDEpKQorI2RlZmluZSBQX1BQSTBfRDgJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRjgpIHwgUF9GVU5DVCgxKSkKKyNkZWZpbmUgUF9QUEkwX0Q5CShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEY5KSB8IFBfRlVOQ1QoMSkpCisjZGVmaW5lIFBfUFBJMF9EMTAJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRjEwKSB8IFBfRlVOQ1QoMSkpCisjZGVmaW5lIFBfUFBJMF9EMTEJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRjExKSB8IFBfRlVOQ1QoMSkpCisjZGVmaW5lIFBfUFBJMF9EMTIJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRjEyKSB8IFBfRlVOQ1QoMSkpCisjZGVmaW5lIFBfUFBJMF9EMTMJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRjEzKSB8IFBfRlVOQ1QoMSkpCisjZGVmaW5lIFBfUFBJMF9EMTQJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRjE0KSB8IFBfRlVOQ1QoMSkpCisjZGVmaW5lIFBfUFBJMF9EMTUJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRjE1KSB8IFBfRlVOQ1QoMSkpCisKKyNkZWZpbmUgUF9QUEkwX0NMSwkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BHMTIpIHwgUF9GVU5DVCgxKSkKKyNkZWZpbmUgUF9QUEkwX0ZTMQkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BHMTMpIHwgUF9GVU5DVCgxKSkKKyNkZWZpbmUgUF9QUEkwX0ZTMgkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BHMTQpIHwgUF9GVU5DVCgxKSkKKyNkZWZpbmUgUF9QUEkwX0ZTMwkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BHMTUpIHwgUF9GVU5DVCgxKSkKKworLyogU1BJIFBvcnQgTXV4ICovCisjZGVmaW5lIFBfU1BJMF9TUwkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BHMTEpIHwgUF9GVU5DVCgwKSkKKyNkZWZpbmUgUF9TUEkwX1NDSwkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BHMTIpIHwgUF9GVU5DVCgwKSkKKyNkZWZpbmUgUF9TUEkwX01JU08JKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRzEzKSB8IFBfRlVOQ1QoMCkpCisjZGVmaW5lIFBfU1BJMF9NT1NJCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEcxNCkgfCBQX0ZVTkNUKDApKQorCisjZGVmaW5lIFBfU1BJMF9TU0VMMQkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BGNykgfCBQX0ZVTkNUKDApKQorI2RlZmluZSBQX1NQSTBfU1NFTDIJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRzE1KSB8IFBfRlVOQ1QoMCkpCisjZGVmaW5lIFBfU1BJMF9TU0VMMwkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BINCkgfCBQX0ZVTkNUKDIpKQorI2RlZmluZSBQX1NQSTBfU1NFTDQJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRzEwKSB8IFBfRlVOQ1QoMikpCisjZGVmaW5lIFBfU1BJMF9TU0VMNQkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BHMykgfCBQX0ZVTkNUKDIpKQorCisjZGVmaW5lIFBfU1BJMV9TUwkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BIMCkgfCBQX0ZVTkNUKDEpKQorI2RlZmluZSBQX1NQSTFfU0NLCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEgxKSB8IFBfRlVOQ1QoMSkpCisjZGVmaW5lIFBfU1BJMV9NSVNPCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEgyKSB8IFBfRlVOQ1QoMSkpCisjZGVmaW5lIFBfU1BJMV9NT1NJCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEgzKSB8IFBfRlVOQ1QoMSkpCisKKyNkZWZpbmUgUF9TUEkxX1NTRUwxCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEg2KSB8IFBfRlVOQ1QoMikpCisjZGVmaW5lIFBfU1BJMV9TU0VMMgkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BGMCkgfCBQX0ZVTkNUKDIpKQorI2RlZmluZSBQX1NQSTFfU1NFTDMJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRzApIHwgUF9GVU5DVCgyKSkKKyNkZWZpbmUgUF9TUEkxX1NTRUw0CShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEY4KSB8IFBfRlVOQ1QoMikpCisjZGVmaW5lIFBfU1BJMV9TU0VMNQkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BHMTEpIHwgUF9GVU5DVCgyKSkKKworLyogU1BPUlQgUG9ydCBNdXggKi8KKyNkZWZpbmUgUF9TUE9SVDBfRFJQUkkJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRzMpIHwgUF9GVU5DVCgwKSkKKyNkZWZpbmUgUF9TUE9SVDBfUlNDTEsJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRzQpIHwgUF9GVU5DVCgwKSkKKyNkZWZpbmUgUF9TUE9SVDBfUkZTCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEc1KSB8IFBfRlVOQ1QoMCkpCisjZGVmaW5lIFBfU1BPUlQwX1RGUwkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BHNikgfCBQX0ZVTkNUKDApKQorI2RlZmluZSBQX1NQT1JUMF9EVFBSSQkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BHNykgfCBQX0ZVTkNUKDApKQorI2RlZmluZSBQX1NQT1JUMF9UU0NMSwkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BHOCkgfCBQX0ZVTkNUKDApKQorI2RlZmluZSBQX1NQT1JUMF9EVFNFQwkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BHOSkgfCBQX0ZVTkNUKDApKQorI2RlZmluZSBQX1NQT1JUMF9EUlNFQwkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BHMTApIHwgUF9GVU5DVCgwKSkKKworI2RlZmluZSBQX1NQT1JUMV9EUlBSSQkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BIMCkgfCBQX0ZVTkNUKDApKQorI2RlZmluZSBQX1NQT1JUMV9SRlMJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QSDEpIHwgUF9GVU5DVCgwKSkKKyNkZWZpbmUgUF9TUE9SVDFfUlNDTEsJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QSDIpIHwgUF9GVU5DVCgwKSkKKyNkZWZpbmUgUF9TUE9SVDFfRFRQUkkJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QSDMpIHwgUF9GVU5DVCgwKSkKKyNkZWZpbmUgUF9TUE9SVDFfVEZTCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEg0KSB8IFBfRlVOQ1QoMCkpCisjZGVmaW5lIFBfU1BPUlQxX1RTQ0xLCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEg1KSB8IFBfRlVOQ1QoMCkpCisjZGVmaW5lIFBfU1BPUlQxX0RUU0VDCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEg2KSB8IFBfRlVOQ1QoMCkpCisjZGVmaW5lIFBfU1BPUlQxX0RSU0VDCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEg3KSB8IFBfRlVOQ1QoMCkpCisKKy8qIFVBUlQgUG9ydCBNdXggKi8KKyNkZWZpbmUgUF9VQVJUMF9UWAkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BHOSkgfCBQX0ZVTkNUKDEpKQorI2RlZmluZSBQX1VBUlQwX1JYCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEcxMCkgfCBQX0ZVTkNUKDEpKQorCisjZGVmaW5lIFBfVUFSVDFfVFgJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QSDYpIHwgUF9GVU5DVCgxKSkKKyNkZWZpbmUgUF9VQVJUMV9SWAkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BINykgfCBQX0ZVTkNUKDEpKQorCisvKiBUaW1lciAqLworI2RlZmluZSBQX1RNUkNMSwkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BHNSkgfCBQX0ZVTkNUKDIpKQorI2RlZmluZSBQX1RNUjAJCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEc2KSB8IFBfRlVOQ1QoMikpCisjZGVmaW5lIFBfVE1SMQkJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRzcpIHwgUF9GVU5DVCgyKSkKKyNkZWZpbmUgUF9UTVIyCQkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BGOSkgfCBQX0ZVTkNUKDIpKQorI2RlZmluZSBQX1RNUjMJCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEYxMCkgfCBQX0ZVTkNUKDIpKQorI2RlZmluZSBQX1RNUjQJCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEc5KSB8IFBfRlVOQ1QoMikpCisjZGVmaW5lIFBfVE1SNQkJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRzQpIHwgUF9GVU5DVCgyKSkKKyNkZWZpbmUgUF9UTVI2CQkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BHOCkgfCBQX0ZVTkNUKDIpKQorI2RlZmluZSBQX1RNUjcJCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEg3KSB8IFBfRlVOQ1QoMikpCisKKy8qIERNQSAqLworI2RlZmluZSBQX0RNQVIxCQkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BHMSkgfCBQX0ZVTkNUKDEpKQorI2RlZmluZSBQX0RNQVIwCQkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BHMikgfCBQX0ZVTkNUKDEpKQorCisvKiBUV0kgKi8KKyNkZWZpbmUgUF9UV0kwX1NDTAkoUF9ET05UQ0FSRSkKKyNkZWZpbmUgUF9UV0kwX1NEQQkoUF9ET05UQ0FSRSkKKworLyogUFdNICovCisjZGVmaW5lIFBfUFdNMF9BSAkJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRjEpIHwgUF9GVU5DVCgyKSkKKyNkZWZpbmUgUF9QV00wX0FMCQkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BGMikgfCBQX0ZVTkNUKDIpKQorI2RlZmluZSBQX1BXTTBfQkgJCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEYzKSB8IFBfRlVOQ1QoMikpCisjZGVmaW5lIFBfUFdNMF9CTAkJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRjQpIHwgUF9GVU5DVCgyKSkKKyNkZWZpbmUgUF9QV00wX0NICQkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BGNSkgfCBQX0ZVTkNUKDIpKQorI2RlZmluZSBQX1BXTTBfQ0wJCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEY2KSB8IFBfRlVOQ1QoMikpCisjZGVmaW5lIFBfUFdNMF9TWU5DCQkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BGNykgfCBQX0ZVTkNUKDIpKQorCisjZGVmaW5lIFBfUFdNMV9BSAkJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRjExKSB8IFBfRlVOQ1QoMikpCisjZGVmaW5lIFBfUFdNMV9BTAkJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRjEyKSB8IFBfRlVOQ1QoMikpCisjZGVmaW5lIFBfUFdNMV9CSAkJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRjEzKSB8IFBfRlVOQ1QoMikpCisjZGVmaW5lIFBfUFdNMV9CTAkJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRjE0KSB8IFBfRlVOQ1QoMikpCisjZGVmaW5lIFBfUFdNMV9DSAkJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRzEpIHwgUF9GVU5DVCgyKSkKKyNkZWZpbmUgUF9QV00xX0NMCQkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BHMikgfCBQX0ZVTkNUKDIpKQorI2RlZmluZSBQX1BXTTFfU1lOQwkJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRjE1KSB8IFBfRlVOQ1QoMikpCisKKyNkZWZpbmUgUF9QV01fVFJJUEIJCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEcxNCkgfCBQX0ZVTkNUKDIpKQorCisvKiBSU0kgKi8KKyNkZWZpbmUgUF9SU0lfREFUQTAJCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEczKSB8IFBfRlVOQ1QoMSkpCisjZGVmaW5lIFBfUlNJX0RBVEExCQkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BHNCkgfCBQX0ZVTkNUKDEpKQorI2RlZmluZSBQX1JTSV9EQVRBMgkJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRzUpIHwgUF9GVU5DVCgxKSkKKyNkZWZpbmUgUF9SU0lfREFUQTMJCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEc2KSB8IFBfRlVOQ1QoMSkpCisjZGVmaW5lIFBfUlNJX0RBVEE0CQkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BIMCkgfCBQX0ZVTkNUKDIpKQorI2RlZmluZSBQX1JTSV9EQVRBNQkJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QSDEpIHwgUF9GVU5DVCgyKSkKKyNkZWZpbmUgUF9SU0lfREFUQTYJCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEgyKSB8IFBfRlVOQ1QoMikpCisjZGVmaW5lIFBfUlNJX0RBVEE3CQkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BIMykgfCBQX0ZVTkNUKDIpKQorI2RlZmluZSBQX1JTSV9DTUQJCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEc3KSB8IFBfRlVOQ1QoMSkpCisjZGVmaW5lIFBfUlNJX0NMSwkJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRzgpIHwgUF9GVU5DVCgxKSkKKworLyogUFRQICovCisjZGVmaW5lIFBfUFRQX1BQUwkJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRzEyKSB8IFBfRlVOQ1QoMikpCisjZGVmaW5lIFBfUFRQX0NMS09VVAkJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRzEzKSB8IFBfRlVOQ1QoMikpCisKKyNkZWZpbmUgUF9IV0FJVAkJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRzAwMDAwMDAwMCkgfCBQX0ZVTkNUKDEpKQorCisjZW5kaWYJCQkJLyogX01BQ0hfUE9SVE1VWF9IXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2ludHMtcHJpb3JpdHkuYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9pbnRzLXByaW9yaXR5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE1MWZkNQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9pbnRzLXByaW9yaXR5LmMKQEAgLTAsMCArMSw5OSBAQAorLyoKKyAqIEZpbGU6ICAgICAgICAgYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2ludHMtcHJpb3JpdHkuYworICogQmFzZWQgb246ICAgICBhcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvaW50cy1wcmlvcml0eS5jCisgKiBBdXRob3I6ICAgICAgIEJyeWFuIFd1IDxjb29sb25leUBrZXJuZWwub3JnPgorICoKKyAqIENyZWF0ZWQ6CisgKiBEZXNjcmlwdGlvbjogIFNldCB1cCB0aGUgaW50ZXJydXB0IHByaW9yaXRpZXMKKyAqCisgKiBNb2RpZmllZDoKKyAqICAgICAgICAgICAgICAgQ29weXJpZ2h0IDIwMDQtMjAwNyBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKgorICogQnVnczogICAgICAgICBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSB0aGUgZmlsZSBDT1BZSU5HLCBvciB3cml0ZQorICogdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGFzbS9ibGFja2Zpbi5oPgorCit2b2lkIF9faW5pdCBwcm9ncmFtX0lBUih2b2lkKQoreworCS8qIFByb2dyYW0gdGhlIElBUjAgUmVnaXN0ZXIgd2l0aCB0aGUgY29uZmlndXJlZCBwcmlvcml0eSAqLworCWJmaW5fd3JpdGVfU0lDX0lBUjAoKChDT05GSUdfSVJRX1BMTF9XQUtFVVAgLSA3KSA8PCBJUlFfUExMX1dBS0VVUF9QT1MpIHwKKwkJCSgoQ09ORklHX0lSUV9ETUEwX0VSUk9SIC0gNykgPDwgSVJRX0RNQTBfRVJST1JfUE9TKSB8CisJCQkoKENPTkZJR19JUlFfRE1BUjBfQkxLIC0gNykgPDwgSVJRX0RNQVIwX0JMS19QT1MpIHwKKwkJCSgoQ09ORklHX0lSUV9ETUFSMV9CTEsgLSA3KSA8PCBJUlFfRE1BUjFfQkxLX1BPUykgfAorCQkJKChDT05GSUdfSVJRX0RNQVIwX09WUiAtIDcpIDw8IElSUV9ETUFSMF9PVlJfUE9TKSB8CisJCQkoKENPTkZJR19JUlFfRE1BUjFfT1ZSIC0gNykgPDwgSVJRX0RNQVIxX09WUl9QT1MpIHwKKwkJCSgoQ09ORklHX0lSUV9QUElfRVJST1IgLSA3KSA8PCBJUlFfUFBJX0VSUk9SX1BPUykgfAorCQkJKChDT05GSUdfSVJRX01BQ19FUlJPUiAtIDcpIDw8IElSUV9NQUNfRVJST1JfUE9TKSk7CisKKworCWJmaW5fd3JpdGVfU0lDX0lBUjEoKChDT05GSUdfSVJRX1NQT1JUMF9FUlJPUiAtIDcpIDw8IElSUV9TUE9SVDBfRVJST1JfUE9TKSB8CisJCQkoKENPTkZJR19JUlFfU1BPUlQxX0VSUk9SIC0gNykgPDwgSVJRX1NQT1JUMV9FUlJPUl9QT1MpIHwKKwkJCSgoQ09ORklHX0lSUV9QVFBfRVJST1IgLSA3KSA8PCBJUlFfUFRQX0VSUk9SX1BPUykgfAorCQkJKChDT05GSUdfSVJRX1VBUlQwX0VSUk9SIC0gNykgPDwgSVJRX1VBUlQwX0VSUk9SX1BPUykgfAorCQkJKChDT05GSUdfSVJRX1VBUlQxX0VSUk9SIC0gNykgPDwgSVJRX1VBUlQxX0VSUk9SX1BPUykgfAorCQkJKChDT05GSUdfSVJRX1JUQyAtIDcpIDw8IElSUV9SVENfUE9TKSB8CisJCQkoKENPTkZJR19JUlFfUFBJIC0gNykgPDwgSVJRX1BQSV9QT1MpKTsKKworCWJmaW5fd3JpdGVfU0lDX0lBUjIoKChDT05GSUdfSVJRX1NQT1JUMF9SWCAtIDcpIDw8IElSUV9TUE9SVDBfUlhfUE9TKSB8CisJCQkoKENPTkZJR19JUlFfU1BPUlQwX1RYIC0gNykgPDwgSVJRX1NQT1JUMF9UWF9QT1MpIHwKKwkJCSgoQ09ORklHX0lSUV9TUE9SVDFfUlggLSA3KSA8PCBJUlFfU1BPUlQxX1JYX1BPUykgfAorCQkJKChDT05GSUdfSVJRX1NQT1JUMV9UWCAtIDcpIDw8IElSUV9TUE9SVDFfVFhfUE9TKSB8CisJCQkoKENPTkZJR19JUlFfVFdJIC0gNykgPDwgSVJRX1RXSV9QT1MpIHwKKwkJCSgoQ09ORklHX0lSUV9TUEkwIC0gNykgPDwgSVJRX1NQSTBfUE9TKSB8CisJCQkoKENPTkZJR19JUlFfVUFSVDBfUlggLSA3KSA8PCBJUlFfVUFSVDBfUlhfUE9TKSB8CisJCQkoKENPTkZJR19JUlFfVUFSVDBfVFggLSA3KSA8PCBJUlFfVUFSVDBfVFhfUE9TKSk7CisKKwliZmluX3dyaXRlX1NJQ19JQVIzKCgoQ09ORklHX0lSUV9VQVJUMV9SWCAtIDcpIDw8IElSUV9VQVJUMV9SWF9QT1MpIHwKKwkJCSgoQ09ORklHX0lSUV9VQVJUMV9UWCAtIDcpIDw8IElSUV9VQVJUMV9UWF9QT1MpIHwKKwkJCSgoQ09ORklHX0lSUV9PUFRTRUMgLSA3KSA8PCBJUlFfT1BUU0VDX1BPUykgfAorCQkJKChDT05GSUdfSVJRX0NOVCAtIDcpIDw8IElSUV9DTlRfUE9TKSB8CisJCQkoKENPTkZJR19JUlFfTUFDX1JYIC0gNykgPDwgSVJRX01BQ19SWF9QT1MpIHwKKwkJCSgoQ09ORklHX0lSUV9QT1JUSF9JTlRBIC0gNykgPDwgSVJRX1BPUlRIX0lOVEFfUE9TKSB8CisJCQkoKENPTkZJR19JUlFfTUFDX1RYIC0gNykgPDwgSVJRX01BQ19UWF9QT1MpIHwKKwkJCSgoQ09ORklHX0lSUV9QT1JUSF9JTlRCIC0gNykgPDwgSVJRX1BPUlRIX0lOVEJfUE9TKSk7CisKKwliZmluX3dyaXRlX1NJQ19JQVI0KCgoQ09ORklHX0lSUV9USU1FUjAgLSA3KSA8PCBJUlFfVElNRVIwX1BPUykgfAorCQkJKChDT05GSUdfSVJRX1RJTUVSMSAtIDcpIDw8IElSUV9USU1FUjFfUE9TKSB8CisJCQkoKENPTkZJR19JUlFfVElNRVIyIC0gNykgPDwgSVJRX1RJTUVSMl9QT1MpIHwKKwkJCSgoQ09ORklHX0lSUV9USU1FUjMgLSA3KSA8PCBJUlFfVElNRVIzX1BPUykgfAorCQkJKChDT05GSUdfSVJRX1RJTUVSNCAtIDcpIDw8IElSUV9USU1FUjRfUE9TKSB8CisJCQkoKENPTkZJR19JUlFfVElNRVI1IC0gNykgPDwgSVJRX1RJTUVSNV9QT1MpIHwKKwkJCSgoQ09ORklHX0lSUV9USU1FUjYgLSA3KSA8PCBJUlFfVElNRVI2X1BPUykgfAorCQkJKChDT05GSUdfSVJRX1RJTUVSNyAtIDcpIDw8IElSUV9USU1FUjdfUE9TKSk7CisKKwliZmluX3dyaXRlX1NJQ19JQVI1KCgoQ09ORklHX0lSUV9QT1JUR19JTlRBIC0gNykgPDwgSVJRX1BPUlRHX0lOVEFfUE9TKSB8CisJCQkoKENPTkZJR19JUlFfUE9SVEdfSU5UQiAtIDcpIDw8IElSUV9QT1JUR19JTlRCX1BPUykgfAorCQkJKChDT05GSUdfSVJRX01FTV9ETUEwIC0gNykgPDwgSVJRX01FTV9ETUEwX1BPUykgfAorCQkJKChDT05GSUdfSVJRX01FTV9ETUExIC0gNykgPDwgSVJRX01FTV9ETUExX1BPUykgfAorCQkJKChDT05GSUdfSVJRX1dBVENIIC0gNykgPDwgSVJRX1dBVENIX1BPUykgfAorCQkJKChDT05GSUdfSVJRX1BPUlRGX0lOVEEgLSA3KSA8PCBJUlFfUE9SVEZfSU5UQV9QT1MpIHwKKwkJCSgoQ09ORklHX0lSUV9QT1JURl9JTlRCIC0gNykgPDwgSVJRX1BPUlRGX0lOVEJfUE9TKSB8CisJCQkoKENPTkZJR19JUlFfU1BJMF9FUlJPUiAtIDcpIDw8IElSUV9TUEkwX0VSUk9SX1BPUykpOworCisJYmZpbl93cml0ZV9TSUNfSUFSNigoKENPTkZJR19JUlFfU1BJMV9FUlJPUiAtIDcpIDw8IElSUV9TUEkxX0VSUk9SX1BPUykgfAorCQkJKChDT05GSUdfSVJRX1JTSV9JTlQwIC0gNykgPDwgSVJRX1JTSV9JTlQwX1BPUykgfAorCQkJKChDT05GSUdfSVJRX1JTSV9JTlQxIC0gNykgPDwgSVJRX1JTSV9JTlQxX1BPUykgfAorCQkJKChDT05GSUdfSVJRX1BXTV9UUklQIC0gNykgPDwgSVJRX1BXTV9UUklQX1BPUykgfAorCQkJKChDT05GSUdfSVJRX1BXTV9TWU5DIC0gNykgPDwgSVJRX1BXTV9TWU5DX1BPUykgfAorCQkJKChDT05GSUdfSVJRX1BUUF9TVEFUIC0gNykgPDwgSVJRX1BUUF9TVEFUX1BPUykpOworCisJU1NZTkMoKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9LY29uZmlnIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L0tjb25maWcKaW5kZXggM2NkZTRiZS4uODQzOGVjNiAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L0tjb25maWcKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L0tjb25maWcKQEAgLTE2OCwyOSArMTY4LDI5IEBACiBjb25maWcgSVJRX1BPUlRIX0lOVEIKIAlpbnQgIklSUV9QT1JUSF9JTlRCIgogCWRlZmF1bHQgMTEKLWNvbmZpZyBJUlFfVE1SMAotCWludCAiSVJRX1RNUjAiCitjb25maWcgSVJRX1RJTUVSMAorCWludCAiSVJRX1RJTUVSMCIKKwlkZWZhdWx0IDgKK2NvbmZpZyBJUlFfVElNRVIxCisJaW50ICJJUlFfVElNRVIxIgogCWRlZmF1bHQgMTIKLWNvbmZpZyBJUlFfVE1SMQotCWludCAiSVJRX1RNUjEiCitjb25maWcgSVJRX1RJTUVSMgorCWludCAiSVJRX1RJTUVSMiIKIAlkZWZhdWx0IDEyCi1jb25maWcgSVJRX1RNUjIKLQlpbnQgIklSUV9UTVIyIgorY29uZmlnIElSUV9USU1FUjMKKwlpbnQgIklSUV9USU1FUjMiCiAJZGVmYXVsdCAxMgotY29uZmlnIElSUV9UTVIzCi0JaW50ICJJUlFfVE1SMyIKK2NvbmZpZyBJUlFfVElNRVI0CisJaW50ICJJUlFfVElNRVI0IgogCWRlZmF1bHQgMTIKLWNvbmZpZyBJUlFfVE1SNAotCWludCAiSVJRX1RNUjQiCitjb25maWcgSVJRX1RJTUVSNQorCWludCAiSVJRX1RJTUVSNSIKIAlkZWZhdWx0IDEyCi1jb25maWcgSVJRX1RNUjUKLQlpbnQgIklSUV9UTVI1IgorY29uZmlnIElSUV9USU1FUjYKKwlpbnQgIklSUV9USU1FUjYiCiAJZGVmYXVsdCAxMgotY29uZmlnIElSUV9UTVI2Ci0JaW50ICJJUlFfVE1SNiIKLQlkZWZhdWx0IDEyCi1jb25maWcgSVJRX1RNUjcKLQlpbnQgIklSUV9UTVI3IgorY29uZmlnIElSUV9USU1FUjcKKwlpbnQgIklSUV9USU1FUjciCiAJZGVmYXVsdCAxMgogY29uZmlnIElSUV9QT1JUR19JTlRBCiAJaW50ICJJUlFfUE9SVEdfSU5UQSIKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9NYWtlZmlsZSBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9NYWtlZmlsZQppbmRleCA0ZWRkYjU4Li40YTZjZGFmIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvTWFrZWZpbGUKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L01ha2VmaWxlCkBAIC0yLDYgKzIsNCBAQAogIyBhcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvTWFrZWZpbGUKICMKIAotZXh0cmEteSA6PSBoZWFkLm8KLQogb2JqLXkgOj0gaW50cy1wcmlvcml0eS5vIGRtYS5vCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvYm9hcmRzL2NtX2JmNTI3LmMgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvYm9hcmRzL2NtX2JmNTI3LmMKaW5kZXggOWVhNDQwYi4uYTJjMzU3OCAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2JvYXJkcy9jbV9iZjUyNy5jCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9ib2FyZHMvY21fYmY1MjcuYwpAQCAtNjEsNTEgKzYxLDQwIEBACiAgKiAgRHJpdmVyIG5lZWRzIHRvIGtub3cgYWRkcmVzcywgaXJxIGFuZCBmbGFnIHBpbi4KICAqLwogCi0jZGVmaW5lIElTUDE3NjFfQkFTRSAgICAgICAweDIwM0MwMDAwCi0jZGVmaW5lIElTUDE3NjFfSVJRICAgICAgICBJUlFfUEY3Ci0KICNpZiBkZWZpbmVkKENPTkZJR19VU0JfSVNQMTc2MF9IQ0QpIHx8IGRlZmluZWQoQ09ORklHX1VTQl9JU1AxNzYwX0hDRF9NT0RVTEUpCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIGJmaW5faXNwMTc2MV9yZXNvdXJjZXNbXSA9IHsKKyNpbmNsdWRlIDxsaW51eC91c2IvaXNwMTc2MC5oPgorc3RhdGljIHN0cnVjdCByZXNvdXJjZSBiZmluX2lzcDE3NjBfcmVzb3VyY2VzW10gPSB7CiAJWzBdID0gewotCQkubmFtZQk9ICJpc3AxNzYxLXJlZ3MiLAotCQkuc3RhcnQgID0gSVNQMTc2MV9CQVNFICsgMHgwMDAwMDAwMCwKLQkJLmVuZCAgICA9IElTUDE3NjFfQkFTRSArIDB4MDAwZmZmZmYsCisJCS5zdGFydCAgPSAweDIwM0MwMDAwLAorCQkuZW5kICAgID0gMHgyMDNDMDAwMCArIDB4MDAwZmZmZmYsCiAJCS5mbGFncyAgPSBJT1JFU09VUkNFX01FTSwKIAl9LAogCVsxXSA9IHsKLQkJLnN0YXJ0ICA9IElTUDE3NjFfSVJRLAotCQkuZW5kICAgID0gSVNQMTc2MV9JUlEsCisJCS5zdGFydCAgPSBJUlFfUEY3LAorCQkuZW5kICAgID0gSVJRX1BGNywKIAkJLmZsYWdzICA9IElPUkVTT1VSQ0VfSVJRLAogCX0sCiB9OwogCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX2lzcDE3NjFfZGV2aWNlID0gewotCS5uYW1lICAgICAgICAgICA9ICJpc3AxNzYxIiwKK3N0YXRpYyBzdHJ1Y3QgaXNwMTc2MF9wbGF0Zm9ybV9kYXRhIGlzcDE3NjBfcHJpdiA9IHsKKwkuaXNfaXNwMTc2MSA9IDAsCisJLnBvcnQxX2Rpc2FibGUgPSAwLAorCS5idXNfd2lkdGhfMTYgPSAxLAorCS5wb3J0MV9vdGcgPSAwLAorCS5hbmFsb2dfb2MgPSAwLAorCS5kYWNrX3BvbGFyaXR5X2hpZ2ggPSAwLAorCS5kcmVxX3BvbGFyaXR5X2hpZ2ggPSAwLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9pc3AxNzYwX2RldmljZSA9IHsKKwkubmFtZSAgICAgICAgICAgPSAiaXNwMTc2MC1oY2QiLAogCS5pZCAgICAgICAgICAgICA9IDAsCi0JLm51bV9yZXNvdXJjZXMgID0gQVJSQVlfU0laRShiZmluX2lzcDE3NjFfcmVzb3VyY2VzKSwKLQkucmVzb3VyY2UgICAgICAgPSBiZmluX2lzcDE3NjFfcmVzb3VyY2VzLAorCS5kZXYgPSB7CisJCS5wbGF0Zm9ybV9kYXRhID0gJmlzcDE3NjBfcHJpdiwKKwl9LAorCS5udW1fcmVzb3VyY2VzICA9IEFSUkFZX1NJWkUoYmZpbl9pc3AxNzYwX3Jlc291cmNlcyksCisJLnJlc291cmNlICAgICAgID0gYmZpbl9pc3AxNzYwX3Jlc291cmNlcywKIH07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpiZmluX2lzcDE3NjFfZGV2aWNlc1tdID0gewotCSZiZmluX2lzcDE3NjFfZGV2aWNlLAotfTsKLQotaW50IF9faW5pdCBiZmluX2lzcDE3NjFfaW5pdCh2b2lkKQotewotCXVuc2lnbmVkIGludCBudW1fZGV2aWNlcyA9IEFSUkFZX1NJWkUoYmZpbl9pc3AxNzYxX2RldmljZXMpOwotCi0JcHJpbnRrKEtFUk5fSU5GTyAiJXMoKTogcmVnaXN0ZXJpbmcgZGV2aWNlIHJlc291cmNlc1xuIiwgX19mdW5jX18pOwotCXNldF9pcnFfdHlwZShJU1AxNzYxX0lSUSwgSVJRRl9UUklHR0VSX0ZBTExJTkcpOwotCi0JcmV0dXJuIHBsYXRmb3JtX2FkZF9kZXZpY2VzKGJmaW5faXNwMTc2MV9kZXZpY2VzLCBudW1fZGV2aWNlcyk7Ci19Ci0KLXZvaWQgX19leGl0IGJmaW5faXNwMTc2MV9leGl0KHZvaWQpCi17Ci0JcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIoJmJmaW5faXNwMTc2MV9kZXZpY2UpOwotfQotCi1hcmNoX2luaXRjYWxsKGJmaW5faXNwMTc2MV9pbml0KTsKICNlbmRpZgogCiAjaWYgZGVmaW5lZChDT05GSUdfVVNCX01VU0JfSERSQykgfHwgZGVmaW5lZChDT05GSUdfVVNCX01VU0JfSERSQ19NT0RVTEUpCkBAIC0xMzIsOCArMTIxLDggQEAKIAkuZHluX2ZpZm8JPSAwLAogCS5zb2Z0X2Nvbgk9IDEsCiAJLmRtYQkJPSAxLAotCS5udW1fZXBzCT0gNywKLQkuZG1hX2NoYW5uZWxzCT0gNywKKwkubnVtX2Vwcwk9IDgsCisJLmRtYV9jaGFubmVscwk9IDgsCiAJLmdwaW9fdnJzZWwJPSBHUElPX1BGMTEsCiB9OwogCkBAIC03MjgsMzAgKzcxNyw1OSBAQAogI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19CRklOX1NJUikgfHwgZGVmaW5lZChDT05GSUdfQkZJTl9TSVJfTU9EVUxFKQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBiZmluX3Npcl9yZXNvdXJjZXNbXSA9IHsKICNpZmRlZiBDT05GSUdfQkZJTl9TSVIwCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGJmaW5fc2lyMF9yZXNvdXJjZXNbXSA9IHsKIAl7CiAJCS5zdGFydCA9IDB4RkZDMDA0MDAsCiAJCS5lbmQgPSAweEZGQzAwNEZGLAogCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKIAl9LAorCXsKKwkJLnN0YXJ0ID0gSVJRX1VBUlQwX1JYLAorCQkuZW5kID0gSVJRX1VBUlQwX1JYKzEsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJeworCQkuc3RhcnQgPSBDSF9VQVJUMF9SWCwKKwkJLmVuZCA9IENIX1VBUlQwX1JYKzEsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfRE1BLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX3NpcjBfZGV2aWNlID0geworCS5uYW1lID0gImJmaW5fc2lyIiwKKwkuaWQgPSAwLAorCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShiZmluX3NpcjBfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UgPSBiZmluX3NpcjBfcmVzb3VyY2VzLAorfTsKICNlbmRpZgogI2lmZGVmIENPTkZJR19CRklOX1NJUjEKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYmZpbl9zaXIxX3Jlc291cmNlc1tdID0gewogCXsKIAkJLnN0YXJ0ID0gMHhGRkMwMjAwMCwKIAkJLmVuZCA9IDB4RkZDMDIwRkYsCiAJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAogCX0sCi0jZW5kaWYKKwl7CisJCS5zdGFydCA9IElSUV9VQVJUMV9SWCwKKwkJLmVuZCA9IElSUV9VQVJUMV9SWCsxLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCXsKKwkJLnN0YXJ0ID0gQ0hfVUFSVDFfUlgsCisJCS5lbmQgPSBDSF9VQVJUMV9SWCsxLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0RNQSwKKwl9LAogfTsKIAotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9zaXJfZGV2aWNlID0geworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9zaXIxX2RldmljZSA9IHsKIAkubmFtZSA9ICJiZmluX3NpciIsCi0JLmlkID0gMCwKLQkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUoYmZpbl9zaXJfcmVzb3VyY2VzKSwKLQkucmVzb3VyY2UgPSBiZmluX3Npcl9yZXNvdXJjZXMsCisJLmlkID0gMSwKKwkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUoYmZpbl9zaXIxX3Jlc291cmNlcyksCisJLnJlc291cmNlID0gYmZpbl9zaXIxX3Jlc291cmNlcywKIH07CiAjZW5kaWYKKyNlbmRpZgogCiAjaWYgZGVmaW5lZChDT05GSUdfSTJDX0JMQUNLRklOX1RXSSkgfHwgZGVmaW5lZChDT05GSUdfSTJDX0JMQUNLRklOX1RXSV9NT0RVTEUpCiBzdGF0aWMgc3RydWN0IHJlc291cmNlIGJmaW5fdHdpMF9yZXNvdXJjZVtdID0gewpAQCAtODg1LDYgKzkwMywxMCBAQAogCSZpc3AxMzYyX2hjZF9kZXZpY2UsCiAjZW5kaWYKIAorI2lmIGRlZmluZWQoQ09ORklHX1VTQl9JU1AxNzYwX0hDRCkgfHwgZGVmaW5lZChDT05GSUdfVVNCX0lTUDE3NjBfSENEX01PRFVMRSkKKwkmYmZpbl9pc3AxNzYwX2RldmljZSwKKyNlbmRpZgorCiAjaWYgZGVmaW5lZChDT05GSUdfVVNCX01VU0JfSERSQykgfHwgZGVmaW5lZChDT05GSUdfVVNCX01VU0JfSERSQ19NT0RVTEUpCiAJJm11c2JfZGV2aWNlLAogI2VuZGlmCkBAIC05MTgsNyArOTQwLDEyIEBACiAjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX0JGSU5fU0lSKSB8fCBkZWZpbmVkKENPTkZJR19CRklOX1NJUl9NT0RVTEUpCi0JJmJmaW5fc2lyX2RldmljZSwKKyNpZmRlZiBDT05GSUdfQkZJTl9TSVIwCisJJmJmaW5fc2lyMF9kZXZpY2UsCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQkZJTl9TSVIxCisJJmJmaW5fc2lyMV9kZXZpY2UsCisjZW5kaWYKICNlbmRpZgogCiAjaWYgZGVmaW5lZChDT05GSUdfSTJDX0JMQUNLRklOX1RXSSkgfHwgZGVmaW5lZChDT05GSUdfSTJDX0JMQUNLRklOX1RXSV9NT0RVTEUpCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvYm9hcmRzL2V6YnJkLmMgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvYm9hcmRzL2V6YnJkLmMKaW5kZXggMzZjODdiNi4uMDMxNGJkMyAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2JvYXJkcy9lemJyZC5jCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9ib2FyZHMvZXpicmQuYwpAQCAtNTEsNyArNTEsNyBAQAogLyoKICAqIE5hbWUgdGhlIEJvYXJkIGZvciB0aGUgL3Byb2MvY3B1aW5mbwogICovCi1jb25zdCBjaGFyIGJmaW5fYm9hcmRfbmFtZVtdID0gIkJGNTI2LUVaQlJEIjsKK2NvbnN0IGNoYXIgYmZpbl9ib2FyZF9uYW1lW10gPSAiQURJIEJGNTI2LUVaQlJEIjsKIAogLyoKICAqICBEcml2ZXIgbmVlZHMgdG8ga25vdyBhZGRyZXNzLCBpcnEgYW5kIGZsYWcgcGluLgpAQCAtODEsOCArODEsOCBAQAogCS5keW5fZmlmbwk9IDAsCiAJLnNvZnRfY29uCT0gMSwKIAkuZG1hCQk9IDEsCi0JLm51bV9lcHMJPSA3LAotCS5kbWFfY2hhbm5lbHMJPSA3LAorCS5udW1fZXBzCT0gOCwKKwkuZG1hX2NoYW5uZWxzCT0gOCwKIAkuZ3Bpb192cnNlbAk9IEdQSU9fUEcxMywKIH07CiAKQEAgLTI4OCw2ICsyODgsMzAgQEAKIH07CiAjZW5kaWYKIAorI2lmIGRlZmluZWQoQ09ORklHX1RPVUNIU0NSRUVOX0FENzg3OSkgfHwgZGVmaW5lZChDT05GSUdfVE9VQ0hTQ1JFRU5fQUQ3ODc5X01PRFVMRSkKKyNpbmNsdWRlIDxsaW51eC9zcGkvYWQ3ODc5Lmg+CitzdGF0aWMgY29uc3Qgc3RydWN0IGFkNzg3OV9wbGF0Zm9ybV9kYXRhIGJmaW5fYWQ3ODc5X3RzX2luZm8gPSB7CisJLm1vZGVsCQkJPSA3ODc5LAkvKiBNb2RlbCA9IEFENzg3OSAqLworCS54X3BsYXRlX29obXMJCT0gNjIwLAkvKiA2MjAgT2htIGZyb20gdGhlIHRvdWNoIGRhdGFzaGVldCAqLworCS5wcmVzc3VyZV9tYXgJCT0gMTAwMDAsCisJLnByZXNzdXJlX21pbgkJPSAwLAorCS5maXJzdF9jb252ZXJzaW9uX2RlbGF5ID0gMywJLyogd2FpdCA1MTJ1cyBiZWZvcmUgZG8gYSBmaXJzdCBjb252ZXJzaW9uICovCisJLmFjcXVpc2l0aW9uX3RpbWUgCT0gMSwJLyogNHVzIGFjcXVpc2l0aW9uIHRpbWUgcGVyIHNhbXBsZSAqLworCS5tZWRpYW4JCQk9IDIsCS8qIGRvIDggbWVhc3VyZW1lbnRzICovCisJLmF2ZXJhZ2luZyAJCT0gMSwJLyogdGFrZSB0aGUgYXZlcmFnZSBvZiA0IG1pZGRsZSBzYW1wbGVzICovCisJLnBlbl9kb3duX2FjY19pbnRlcnZhbCAJPSAyNTUsCS8qIDkuNCBtcyAqLworCS5ncGlvX291dHB1dAkJPSAxLAkvKiBjb25maWd1cmUgQVVYL1ZCQVQvR1BJTyBhcyBHUElPIG91dHB1dCAqLworCS5ncGlvX2RlZmF1bHQgCQk9IDEsCS8qIER1cmluZyBpbml0aWFsaXphdGlvbiBzZXQgR1BJTyA9IEhJR0ggKi8KK307CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX1RPVUNIU0NSRUVOX0FENzg3OV9TUEkpIHx8IGRlZmluZWQoQ09ORklHX1RPVUNIU0NSRUVOX0FENzg3OV9TUElfTU9EVUxFKQorc3RhdGljIHN0cnVjdCBiZmluNXh4X3NwaV9jaGlwIHNwaV9hZDc4NzlfY2hpcF9pbmZvID0geworCS5lbmFibGVfZG1hID0gMCwKKwkuYml0c19wZXJfd29yZCA9IDE2LAorfTsKKyNlbmRpZgorCiAjaWYgZGVmaW5lZChDT05GSUdfU05EX1NPQ19XTTg3MzEpIHx8IGRlZmluZWQoQ09ORklHX1NORF9TT0NfV004NzMxX01PRFVMRSkgXAogCSAmJiBkZWZpbmVkKENPTkZJR19TTkRfU09DX1dNODczMV9TUEkpCiBzdGF0aWMgc3RydWN0IGJmaW41eHhfc3BpX2NoaXAgc3BpX3dtODczMV9jaGlwX2luZm8gPSB7CkBAIC0zODYsNiArNDEwLDE4IEBACiAJCS5jb250cm9sbGVyX2RhdGEgPSAmc3BpX2FkNzg3N19jaGlwX2luZm8sCiAJfSwKICNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX1RPVUNIU0NSRUVOX0FENzg3OV9TUEkpIHx8IGRlZmluZWQoQ09ORklHX1RPVUNIU0NSRUVOX0FENzg3OV9TUElfTU9EVUxFKQorCXsKKwkJLm1vZGFsaWFzID0gImFkNzg3OSIsCisJCS5wbGF0Zm9ybV9kYXRhID0gJmJmaW5fYWQ3ODc5X3RzX2luZm8sCisJCS5pcnEgPSBJUlFfUEcwLAorCQkubWF4X3NwZWVkX2h6ID0gNTAwMDAwMCwgICAgIC8qIG1heCBzcGkgY2xvY2sgKFNDSykgc3BlZWQgaW4gSFogKi8KKwkJLmJ1c19udW0gPSAwLAorCQkuY2hpcF9zZWxlY3QgPSA1LAorCQkuY29udHJvbGxlcl9kYXRhID0gJnNwaV9hZDc4NzlfY2hpcF9pbmZvLAorCQkubW9kZSA9IFNQSV9DUEhBIHwgU1BJX0NQT0wsCisJfSwKKyNlbmRpZgogI2lmIGRlZmluZWQoQ09ORklHX1NORF9TT0NfV004NzMxKSB8fCBkZWZpbmVkKENPTkZJR19TTkRfU09DX1dNODczMV9NT0RVTEUpIFwKIAkgJiYgZGVmaW5lZChDT05GSUdfU05EX1NPQ19XTTg3MzFfU1BJKQogCXsKQEAgLTQ3OCwzMCArNTE0LDU5IEBACiAjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX0JGSU5fU0lSKSB8fCBkZWZpbmVkKENPTkZJR19CRklOX1NJUl9NT0RVTEUpCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIGJmaW5fc2lyX3Jlc291cmNlc1tdID0gewogI2lmZGVmIENPTkZJR19CRklOX1NJUjAKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYmZpbl9zaXIwX3Jlc291cmNlc1tdID0gewogCXsKIAkJLnN0YXJ0ID0gMHhGRkMwMDQwMCwKIAkJLmVuZCA9IDB4RkZDMDA0RkYsCiAJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAogCX0sCisJeworCQkuc3RhcnQgPSBJUlFfVUFSVDBfUlgsCisJCS5lbmQgPSBJUlFfVUFSVDBfUlgrMSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwl7CisJCS5zdGFydCA9IENIX1VBUlQwX1JYLAorCQkuZW5kID0gQ0hfVUFSVDBfUlgrMSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9ETUEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmaW5fc2lyMF9kZXZpY2UgPSB7CisJLm5hbWUgPSAiYmZpbl9zaXIiLAorCS5pZCA9IDAsCisJLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKGJmaW5fc2lyMF9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZSA9IGJmaW5fc2lyMF9yZXNvdXJjZXMsCit9OwogI2VuZGlmCiAjaWZkZWYgQ09ORklHX0JGSU5fU0lSMQorc3RhdGljIHN0cnVjdCByZXNvdXJjZSBiZmluX3NpcjFfcmVzb3VyY2VzW10gPSB7CiAJewogCQkuc3RhcnQgPSAweEZGQzAyMDAwLAogCQkuZW5kID0gMHhGRkMwMjBGRiwKIAkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCiAJfSwKLSNlbmRpZgorCXsKKwkJLnN0YXJ0ID0gSVJRX1VBUlQxX1JYLAorCQkuZW5kID0gSVJRX1VBUlQxX1JYKzEsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJeworCQkuc3RhcnQgPSBDSF9VQVJUMV9SWCwKKwkJLmVuZCA9IENIX1VBUlQxX1JYKzEsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfRE1BLAorCX0sCiB9OwogCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX3Npcl9kZXZpY2UgPSB7CitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX3NpcjFfZGV2aWNlID0gewogCS5uYW1lID0gImJmaW5fc2lyIiwKLQkuaWQgPSAwLAotCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShiZmluX3Npcl9yZXNvdXJjZXMpLAotCS5yZXNvdXJjZSA9IGJmaW5fc2lyX3Jlc291cmNlcywKKwkuaWQgPSAxLAorCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShiZmluX3NpcjFfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UgPSBiZmluX3NpcjFfcmVzb3VyY2VzLAogfTsKICNlbmRpZgorI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19JMkNfQkxBQ0tGSU5fVFdJKSB8fCBkZWZpbmVkKENPTkZJR19JMkNfQkxBQ0tGSU5fVFdJX01PRFVMRSkKIHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYmZpbl90d2kwX3Jlc291cmNlW10gPSB7CkBAIC02NzEsNyArNzM2LDEyIEBACiAjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX0JGSU5fU0lSKSB8fCBkZWZpbmVkKENPTkZJR19CRklOX1NJUl9NT0RVTEUpCi0JJmJmaW5fc2lyX2RldmljZSwKKyNpZmRlZiBDT05GSUdfQkZJTl9TSVIwCisJJmJmaW5fc2lyMF9kZXZpY2UsCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQkZJTl9TSVIxCisJJmJmaW5fc2lyMV9kZXZpY2UsCisjZW5kaWYKICNlbmRpZgogCiAjaWYgZGVmaW5lZChDT05GSUdfSTJDX0JMQUNLRklOX1RXSSkgfHwgZGVmaW5lZChDT05GSUdfSTJDX0JMQUNLRklOX1RXSV9NT0RVTEUpCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvYm9hcmRzL2V6a2l0LmMgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvYm9hcmRzL2V6a2l0LmMKaW5kZXggOGVlMmI3NC4uOTQ1NGZiNyAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2JvYXJkcy9lemtpdC5jCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9ib2FyZHMvZXpraXQuYwpAQCAtNTQsNTcgKzU0LDQ2IEBACiAvKgogICogTmFtZSB0aGUgQm9hcmQgZm9yIHRoZSAvcHJvYy9jcHVpbmZvCiAgKi8KLWNvbnN0IGNoYXIgYmZpbl9ib2FyZF9uYW1lW10gPSAiQUREUy1CRjUyNy1FWktJVCI7Citjb25zdCBjaGFyIGJmaW5fYm9hcmRfbmFtZVtdID0gIkFESSBCRjUyNy1FWktJVCI7CiAKIC8qCiAgKiAgRHJpdmVyIG5lZWRzIHRvIGtub3cgYWRkcmVzcywgaXJxIGFuZCBmbGFnIHBpbi4KICAqLwogCi0jZGVmaW5lIElTUDE3NjFfQkFTRSAgICAgICAweDIwM0MwMDAwCi0jZGVmaW5lIElTUDE3NjFfSVJRICAgICAgICBJUlFfUEY3Ci0KICNpZiBkZWZpbmVkKENPTkZJR19VU0JfSVNQMTc2MF9IQ0QpIHx8IGRlZmluZWQoQ09ORklHX1VTQl9JU1AxNzYwX0hDRF9NT0RVTEUpCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIGJmaW5faXNwMTc2MV9yZXNvdXJjZXNbXSA9IHsKKyNpbmNsdWRlIDxsaW51eC91c2IvaXNwMTc2MC5oPgorc3RhdGljIHN0cnVjdCByZXNvdXJjZSBiZmluX2lzcDE3NjBfcmVzb3VyY2VzW10gPSB7CiAJWzBdID0gewotCQkubmFtZQk9ICJpc3AxNzYxLXJlZ3MiLAotCQkuc3RhcnQgID0gSVNQMTc2MV9CQVNFICsgMHgwMDAwMDAwMCwKLQkJLmVuZCAgICA9IElTUDE3NjFfQkFTRSArIDB4MDAwZmZmZmYsCisJCS5zdGFydCAgPSAweDIwM0MwMDAwLAorCQkuZW5kICAgID0gMHgyMDNDMDAwMCArIDB4MDAwZmZmZmYsCiAJCS5mbGFncyAgPSBJT1JFU09VUkNFX01FTSwKIAl9LAogCVsxXSA9IHsKLQkJLnN0YXJ0ICA9IElTUDE3NjFfSVJRLAotCQkuZW5kICAgID0gSVNQMTc2MV9JUlEsCisJCS5zdGFydCAgPSBJUlFfUEY3LAorCQkuZW5kICAgID0gSVJRX1BGNywKIAkJLmZsYWdzICA9IElPUkVTT1VSQ0VfSVJRLAogCX0sCiB9OwogCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX2lzcDE3NjFfZGV2aWNlID0gewotCS5uYW1lICAgICAgICAgICA9ICJpc3AxNzYxIiwKK3N0YXRpYyBzdHJ1Y3QgaXNwMTc2MF9wbGF0Zm9ybV9kYXRhIGlzcDE3NjBfcHJpdiA9IHsKKwkuaXNfaXNwMTc2MSA9IDAsCisJLnBvcnQxX2Rpc2FibGUgPSAwLAorCS5idXNfd2lkdGhfMTYgPSAxLAorCS5wb3J0MV9vdGcgPSAwLAorCS5hbmFsb2dfb2MgPSAwLAorCS5kYWNrX3BvbGFyaXR5X2hpZ2ggPSAwLAorCS5kcmVxX3BvbGFyaXR5X2hpZ2ggPSAwLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9pc3AxNzYwX2RldmljZSA9IHsKKwkubmFtZSAgICAgICAgICAgPSAiaXNwMTc2MC1oY2QiLAogCS5pZCAgICAgICAgICAgICA9IDAsCi0JLm51bV9yZXNvdXJjZXMgID0gQVJSQVlfU0laRShiZmluX2lzcDE3NjFfcmVzb3VyY2VzKSwKLQkucmVzb3VyY2UgICAgICAgPSBiZmluX2lzcDE3NjFfcmVzb3VyY2VzLAorCS5kZXYgPSB7CisJCS5wbGF0Zm9ybV9kYXRhID0gJmlzcDE3NjBfcHJpdiwKKwl9LAorCS5udW1fcmVzb3VyY2VzICA9IEFSUkFZX1NJWkUoYmZpbl9pc3AxNzYwX3Jlc291cmNlcyksCisJLnJlc291cmNlICAgICAgID0gYmZpbl9pc3AxNzYwX3Jlc291cmNlcywKIH07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpiZmluX2lzcDE3NjFfZGV2aWNlc1tdID0gewotCSZiZmluX2lzcDE3NjFfZGV2aWNlLAotfTsKLQotaW50IF9faW5pdCBiZmluX2lzcDE3NjFfaW5pdCh2b2lkKQotewotCXVuc2lnbmVkIGludCBudW1fZGV2aWNlcyA9IEFSUkFZX1NJWkUoYmZpbl9pc3AxNzYxX2RldmljZXMpOwotCi0JcHJpbnRrKEtFUk5fSU5GTyAiJXMoKTogcmVnaXN0ZXJpbmcgZGV2aWNlIHJlc291cmNlc1xuIiwgX19mdW5jX18pOwotCXNldF9pcnFfdHlwZShJU1AxNzYxX0lSUSwgSVJRRl9UUklHR0VSX0ZBTExJTkcpOwotCi0JcmV0dXJuIHBsYXRmb3JtX2FkZF9kZXZpY2VzKGJmaW5faXNwMTc2MV9kZXZpY2VzLCBudW1fZGV2aWNlcyk7Ci19Ci0KLXZvaWQgX19leGl0IGJmaW5faXNwMTc2MV9leGl0KHZvaWQpCi17Ci0JcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIoJmJmaW5faXNwMTc2MV9kZXZpY2UpOwotfQotCi1hcmNoX2luaXRjYWxsKGJmaW5faXNwMTc2MV9pbml0KTsKICNlbmRpZgogCiAjaWYgZGVmaW5lZChDT05GSUdfVVNCX01VU0JfSERSQykgfHwgZGVmaW5lZChDT05GSUdfVVNCX01VU0JfSERSQ19NT0RVTEUpCkBAIC0xMzEsOCArMTIwLDggQEAKIAkuZHluX2ZpZm8JPSAwLAogCS5zb2Z0X2Nvbgk9IDEsCiAJLmRtYQkJPSAxLAotCS5udW1fZXBzCT0gNywKLQkuZG1hX2NoYW5uZWxzCT0gNywKKwkubnVtX2Vwcwk9IDgsCisJLmRtYV9jaGFubmVscwk9IDgsCiAJLmdwaW9fdnJzZWwJPSBHUElPX1BHMTMsCiB9OwogCkBAIC01MTUsMTMgKzUwNCw2IEBACiB9OwogI2VuZGlmCiAKLSNpZiBkZWZpbmVkKENPTkZJR19TUElfTU1DKSB8fCBkZWZpbmVkKENPTkZJR19TUElfTU1DX01PRFVMRSkKLXN0YXRpYyBzdHJ1Y3QgYmZpbjV4eF9zcGlfY2hpcCBzcGlfbW1jX2NoaXBfaW5mbyA9IHsKLQkuZW5hYmxlX2RtYSA9IDEsCi0JLmJpdHNfcGVyX3dvcmQgPSA4LAotfTsKLSNlbmRpZgotCiAjaWYgZGVmaW5lZChDT05GSUdfUEJYKQogc3RhdGljIHN0cnVjdCBiZmluNXh4X3NwaV9jaGlwIHNwaV9zaTN4eHhfY2hpcF9pbmZvID0gewogCS5jdGxfcmVnCT0gMHg0LCAvKiBzZW5kIHplcm8gKi8KQEAgLTU1Miw2ICs1MzQsMzAgQEAKIH07CiAjZW5kaWYKIAorI2lmIGRlZmluZWQoQ09ORklHX1RPVUNIU0NSRUVOX0FENzg3OSkgfHwgZGVmaW5lZChDT05GSUdfVE9VQ0hTQ1JFRU5fQUQ3ODc5X01PRFVMRSkKKyNpbmNsdWRlIDxsaW51eC9zcGkvYWQ3ODc5Lmg+CitzdGF0aWMgY29uc3Qgc3RydWN0IGFkNzg3OV9wbGF0Zm9ybV9kYXRhIGJmaW5fYWQ3ODc5X3RzX2luZm8gPSB7CisJLm1vZGVsCQkJPSA3ODc5LAkvKiBNb2RlbCA9IEFENzg3OSAqLworCS54X3BsYXRlX29obXMJCT0gNjIwLAkvKiA2MjAgT2htIGZyb20gdGhlIHRvdWNoIGRhdGFzaGVldCAqLworCS5wcmVzc3VyZV9tYXgJCT0gMTAwMDAsCisJLnByZXNzdXJlX21pbgkJPSAwLAorCS5maXJzdF9jb252ZXJzaW9uX2RlbGF5ID0gMywJLyogd2FpdCA1MTJ1cyBiZWZvcmUgZG8gYSBmaXJzdCBjb252ZXJzaW9uICovCisJLmFjcXVpc2l0aW9uX3RpbWUgCT0gMSwJLyogNHVzIGFjcXVpc2l0aW9uIHRpbWUgcGVyIHNhbXBsZSAqLworCS5tZWRpYW4JCQk9IDIsCS8qIGRvIDggbWVhc3VyZW1lbnRzICovCisJLmF2ZXJhZ2luZyAJCT0gMSwJLyogdGFrZSB0aGUgYXZlcmFnZSBvZiA0IG1pZGRsZSBzYW1wbGVzICovCisJLnBlbl9kb3duX2FjY19pbnRlcnZhbCAJPSAyNTUsCS8qIDkuNCBtcyAqLworCS5ncGlvX291dHB1dAkJPSAxLAkvKiBjb25maWd1cmUgQVVYL1ZCQVQvR1BJTyBhcyBHUElPIG91dHB1dCAqLworCS5ncGlvX2RlZmF1bHQgCQk9IDEsCS8qIER1cmluZyBpbml0aWFsaXphdGlvbiBzZXQgR1BJTyA9IEhJR0ggKi8KK307CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX1RPVUNIU0NSRUVOX0FENzg3OV9TUEkpIHx8IGRlZmluZWQoQ09ORklHX1RPVUNIU0NSRUVOX0FENzg3OV9TUElfTU9EVUxFKQorc3RhdGljIHN0cnVjdCBiZmluNXh4X3NwaV9jaGlwIHNwaV9hZDc4NzlfY2hpcF9pbmZvID0geworCS5lbmFibGVfZG1hID0gMCwKKwkuYml0c19wZXJfd29yZCA9IDE2LAorfTsKKyNlbmRpZgorCiAjaWYgZGVmaW5lZChDT05GSUdfU05EX1NPQ19XTTg3MzEpIHx8IGRlZmluZWQoQ09ORklHX1NORF9TT0NfV004NzMxX01PRFVMRSkgXAogCSAmJiBkZWZpbmVkKENPTkZJR19TTkRfU09DX1dNODczMV9TUEkpCiBzdGF0aWMgc3RydWN0IGJmaW41eHhfc3BpX2NoaXAgc3BpX3dtODczMV9jaGlwX2luZm8gPSB7CkBAIC02MTMsMjYgKzYxOSw2IEBACiAJCS5jb250cm9sbGVyX2RhdGEgPSAmYWQ5OTYwX3NwaV9jaGlwX2luZm8sCiAJfSwKICNlbmRpZgotI2lmIGRlZmluZWQoQ09ORklHX1NQSV9NTUMpIHx8IGRlZmluZWQoQ09ORklHX1NQSV9NTUNfTU9EVUxFKQotCXsKLQkJLm1vZGFsaWFzID0gInNwaV9tbWNfZHVtbXkiLAotCQkubWF4X3NwZWVkX2h6ID0gMjUwMDAwMDAsICAgICAvKiBtYXggc3BpIGNsb2NrIChTQ0spIHNwZWVkIGluIEhaICovCi0JCS5idXNfbnVtID0gMCwKLQkJLmNoaXBfc2VsZWN0ID0gMCwKLQkJLnBsYXRmb3JtX2RhdGEgPSBOVUxMLAotCQkuY29udHJvbGxlcl9kYXRhID0gJnNwaV9tbWNfY2hpcF9pbmZvLAotCQkubW9kZSA9IFNQSV9NT0RFXzMsCi0JfSwKLQl7Ci0JCS5tb2RhbGlhcyA9ICJzcGlfbW1jIiwKLQkJLm1heF9zcGVlZF9oeiA9IDI1MDAwMDAwLCAgICAgLyogbWF4IHNwaSBjbG9jayAoU0NLKSBzcGVlZCBpbiBIWiAqLwotCQkuYnVzX251bSA9IDAsCi0JCS5jaGlwX3NlbGVjdCA9IENPTkZJR19TUElfTU1DX0NTX0NIQU4sCi0JCS5wbGF0Zm9ybV9kYXRhID0gTlVMTCwKLQkJLmNvbnRyb2xsZXJfZGF0YSA9ICZzcGlfbW1jX2NoaXBfaW5mbywKLQkJLm1vZGUgPSBTUElfTU9ERV8zLAotCX0sCi0jZW5kaWYKICNpZiBkZWZpbmVkKENPTkZJR19QQlgpCiAJewogCQkubW9kYWxpYXMgPSAiZnhzLXNwaSIsCkBAIC02NjIsNiArNjQ4LDE4IEBACiAJCS5jb250cm9sbGVyX2RhdGEgPSAmc3BpX2FkNzg3N19jaGlwX2luZm8sCiAJfSwKICNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX1RPVUNIU0NSRUVOX0FENzg3OV9TUEkpIHx8IGRlZmluZWQoQ09ORklHX1RPVUNIU0NSRUVOX0FENzg3OV9TUElfTU9EVUxFKQorCXsKKwkJLm1vZGFsaWFzID0gImFkNzg3OSIsCisJCS5wbGF0Zm9ybV9kYXRhID0gJmJmaW5fYWQ3ODc5X3RzX2luZm8sCisJCS5pcnEgPSBJUlFfUEY4LAorCQkubWF4X3NwZWVkX2h6ID0gNTAwMDAwMCwgICAgIC8qIG1heCBzcGkgY2xvY2sgKFNDSykgc3BlZWQgaW4gSFogKi8KKwkJLmJ1c19udW0gPSAwLAorCQkuY2hpcF9zZWxlY3QgPSAzLAorCQkuY29udHJvbGxlcl9kYXRhID0gJnNwaV9hZDc4NzlfY2hpcF9pbmZvLAorCQkubW9kZSA9IFNQSV9DUEhBIHwgU1BJX0NQT0wsCisJfSwKKyNlbmRpZgogI2lmIGRlZmluZWQoQ09ORklHX1NORF9TT0NfV004NzMxKSB8fCBkZWZpbmVkKENPTkZJR19TTkRfU09DX1dNODczMV9NT0RVTEUpIFwKIAkgJiYgZGVmaW5lZChDT05GSUdfU05EX1NPQ19XTTg3MzFfU1BJKQogCXsKQEAgLTc1NiwzMCArNzU0LDU5IEBACiAjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX0JGSU5fU0lSKSB8fCBkZWZpbmVkKENPTkZJR19CRklOX1NJUl9NT0RVTEUpCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIGJmaW5fc2lyX3Jlc291cmNlc1tdID0gewogI2lmZGVmIENPTkZJR19CRklOX1NJUjAKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYmZpbl9zaXIwX3Jlc291cmNlc1tdID0gewogCXsKIAkJLnN0YXJ0ID0gMHhGRkMwMDQwMCwKIAkJLmVuZCA9IDB4RkZDMDA0RkYsCiAJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAogCX0sCisJeworCQkuc3RhcnQgPSBJUlFfVUFSVDBfUlgsCisJCS5lbmQgPSBJUlFfVUFSVDBfUlgrMSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwl7CisJCS5zdGFydCA9IENIX1VBUlQwX1JYLAorCQkuZW5kID0gQ0hfVUFSVDBfUlgrMSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9ETUEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmaW5fc2lyMF9kZXZpY2UgPSB7CisJLm5hbWUgPSAiYmZpbl9zaXIiLAorCS5pZCA9IDAsCisJLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKGJmaW5fc2lyMF9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZSA9IGJmaW5fc2lyMF9yZXNvdXJjZXMsCit9OwogI2VuZGlmCiAjaWZkZWYgQ09ORklHX0JGSU5fU0lSMQorc3RhdGljIHN0cnVjdCByZXNvdXJjZSBiZmluX3NpcjFfcmVzb3VyY2VzW10gPSB7CiAJewogCQkuc3RhcnQgPSAweEZGQzAyMDAwLAogCQkuZW5kID0gMHhGRkMwMjBGRiwKIAkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCiAJfSwKLSNlbmRpZgorCXsKKwkJLnN0YXJ0ID0gSVJRX1VBUlQxX1JYLAorCQkuZW5kID0gSVJRX1VBUlQxX1JYKzEsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJeworCQkuc3RhcnQgPSBDSF9VQVJUMV9SWCwKKwkJLmVuZCA9IENIX1VBUlQxX1JYKzEsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfRE1BLAorCX0sCiB9OwogCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX3Npcl9kZXZpY2UgPSB7CitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX3NpcjFfZGV2aWNlID0gewogCS5uYW1lID0gImJmaW5fc2lyIiwKLQkuaWQgPSAwLAotCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShiZmluX3Npcl9yZXNvdXJjZXMpLAotCS5yZXNvdXJjZSA9IGJmaW5fc2lyX3Jlc291cmNlcywKKwkuaWQgPSAxLAorCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShiZmluX3NpcjFfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UgPSBiZmluX3NpcjFfcmVzb3VyY2VzLAogfTsKICNlbmRpZgorI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19JMkNfQkxBQ0tGSU5fVFdJKSB8fCBkZWZpbmVkKENPTkZJR19JMkNfQkxBQ0tGSU5fVFdJX01PRFVMRSkKIHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYmZpbl90d2kwX3Jlc291cmNlW10gPSB7CkBAIC05NDQsNiArOTcxLDEwIEBACiAJJmlzcDEzNjJfaGNkX2RldmljZSwKICNlbmRpZgogCisjaWYgZGVmaW5lZChDT05GSUdfVVNCX0lTUDE3NjBfSENEKSB8fCBkZWZpbmVkKENPTkZJR19VU0JfSVNQMTc2MF9IQ0RfTU9EVUxFKQorCSZiZmluX2lzcDE3NjBfZGV2aWNlLAorI2VuZGlmCisKICNpZiBkZWZpbmVkKENPTkZJR19VU0JfTVVTQl9IRFJDKSB8fCBkZWZpbmVkKENPTkZJR19VU0JfTVVTQl9IRFJDX01PRFVMRSkKIAkmbXVzYl9kZXZpY2UsCiAjZW5kaWYKQEAgLTk4NSw3ICsxMDE2LDEyIEBACiAjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX0JGSU5fU0lSKSB8fCBkZWZpbmVkKENPTkZJR19CRklOX1NJUl9NT0RVTEUpCi0JJmJmaW5fc2lyX2RldmljZSwKKyNpZmRlZiBDT05GSUdfQkZJTl9TSVIwCisJJmJmaW5fc2lyMF9kZXZpY2UsCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQkZJTl9TSVIxCisJJmJmaW5fc2lyMV9kZXZpY2UsCisjZW5kaWYKICNlbmRpZgogCiAjaWYgZGVmaW5lZChDT05GSUdfSTJDX0JMQUNLRklOX1RXSSkgfHwgZGVmaW5lZChDT05GSUdfSTJDX0JMQUNLRklOX1RXSV9NT0RVTEUpCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvZG1hLmMgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvZG1hLmMKaW5kZXggZGZkMDgwYy4uMjMxODc3NSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2RtYS5jCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9kbWEuYwpAQCAtMzEsNyArMzEsNyBAQAogI2luY2x1ZGUgPGFzbS9ibGFja2Zpbi5oPgogI2luY2x1ZGUgPGFzbS9kbWEuaD4KIAotc3RydWN0IGRtYV9yZWdpc3RlciAqZG1hX2lvX2Jhc2VfYWRkcltNQVhfQkxBQ0tGSU5fRE1BX0NIQU5ORUxdID0geworc3RydWN0IGRtYV9yZWdpc3RlciAqZG1hX2lvX2Jhc2VfYWRkcltNQVhfRE1BX0NIQU5ORUxTXSA9IHsKIAkoc3RydWN0IGRtYV9yZWdpc3RlciAqKSBETUEwX05FWFRfREVTQ19QVFIsCiAJKHN0cnVjdCBkbWFfcmVnaXN0ZXIgKikgRE1BMV9ORVhUX0RFU0NfUFRSLAogCShzdHJ1Y3QgZG1hX3JlZ2lzdGVyICopIERNQTJfTkVYVF9ERVNDX1BUUiwKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9oZWFkLlMgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvaGVhZC5TCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZWIxZGE4Li4wMDAwMDAwCi0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9oZWFkLlMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotLyoKLSAqIEZpbGU6ICAgICAgICAgYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2hlYWQuUwotICogQmFzZWQgb246ICAgICBhcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvaGVhZC5TCi0gKiBBdXRob3I6ICAgICAgIEplZmYgRGlvbm5lIDxqZWZmQHVjbGludXgub3JnPiBDT1BZUklHSFQgMTk5OCBELiBKZWZmIERpb25uZQotICoKLSAqIENyZWF0ZWQ6ICAgICAgMTk5OAotICogRGVzY3JpcHRpb246ICBTdGFydHVwIGNvZGUgZm9yIEJsYWNrZmluIEJGNTM3Ci0gKgotICogTW9kaWZpZWQ6Ci0gKiAgICAgICAgICAgICAgIENvcHlyaWdodCAyMDA0LTIwMDcgQW5hbG9nIERldmljZXMgSW5jLgotICoKLSAqIEJ1Z3M6ICAgICAgICAgRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgdGhlIGZpbGUgQ09QWUlORywgb3Igd3JpdGUKLSAqIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotICovCi0KLSNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGFzbS9ibGFja2Zpbi5oPgotI2lmZGVmIENPTkZJR19CRklOX0tFUk5FTF9DTE9DSwotI2luY2x1ZGUgPGFzbS9jbG9ja3MuaD4KLSNpbmNsdWRlIDxtYWNoL21lbV9pbml0Lmg+Ci0jZW5kaWYKLQotLnNlY3Rpb24gLmwxLnRleHQKLSNpZmRlZiBDT05GSUdfQkZJTl9LRVJORUxfQ0xPQ0sKLUVOVFJZKF9zdGFydF9kbWFfY29kZSkKLQotCS8qIEVuYWJsZSBQSFkgQ0xLIGJ1ZmZlciBvdXRwdXQgKi8KLQlwMC5oID0gaGkoVlJfQ1RMKTsKLQlwMC5sID0gbG8oVlJfQ1RMKTsKLQlyMC5sID0gd1twMF07Ci0JYml0c2V0KHIwLCAxNCk7Ci0Jd1twMF0gPSByMC5sOwotCXNzeW5jOwotCi0JcDAuaCA9IGhpKFNJQ19JV1IwKTsKLQlwMC5sID0gbG8oU0lDX0lXUjApOwotCXIwLmwgPSAweDE7Ci0JcjAuaCA9IDB4MDsKLQlbcDBdID0gcjA7Ci0JU1NZTkM7Ci0KLQkvKgotCSAqICBTZXQgUExMX0NUTAotCSAqICAgLSBbMTQ6MDldID0gTVNFTFs1OjBdIDogQ0xLSU4gLyBWQ08gbXVsdGlwbGljYXRpb24gZmFjdG9ycwotCSAqICAgLSBbOF0gICAgID0gQllQQVNTICAgIDogQllQQVNTIHRoZSBQTEwsIHJ1biBDTEtJTiBpbnRvIENDTEsvU0NMSwotCSAqICAgLSBbN10gICAgID0gb3V0cHV0IGRlbGF5IChhZGQgMjAwcHMgb2YgZGVsYXkgdG8gbWVtIHNpZ25hbHMpCi0JICogICAtIFs2XSAgICAgPSBpbnB1dCBkZWxheSAoYWRkIDIwMHBzIG9mIGlucHV0IGRlbGF5IHRvIG1lbSBzaWduYWxzKQotCSAqICAgLSBbNV0gICAgID0gUERXTiAgICAgIDogMT1BbGwgQ2xvY2tzIG9mZgotCSAqICAgLSBbM10gICAgID0gU1RPUENLICAgIDogMT1Db3JlIENsb2NrIG9mZgotCSAqICAgLSBbMV0gICAgID0gUExMX09GRiAgIDogMT1EaXNhYmxlIFBvd2VyIHRvIFBMTAotCSAqICAgLSBbMF0gICAgID0gREYgICAgICAgIDogMT1QYXNzIENMS0lOLzIgdG8gUExMIC8gMD1QYXNzIENMS0lOIHRvIFBMTAotCSAqICAgYWxsIG90aGVyIGJpdHMgc2V0IHRvIHplcm8KLQkgKi8KLQotCXAwLmggPSBoaShQTExfTE9DS0NOVCk7Ci0JcDAubCA9IGxvKFBMTF9MT0NLQ05UKTsKLQlyMCA9IDB4MzAwKFopOwotCXdbcDBdID0gcjAubDsKLQlzc3luYzsKLQotCVAyLkggPSBoaShFQklVX1NER0NUTCk7Ci0JUDIuTCA9IGxvKEVCSVVfU0RHQ1RMKTsKLQlSMCA9IFtQMl07Ci0JQklUU0VUIChSMCwgMjQpOwotCVtQMl0gPSBSMDsKLQlTU1lOQzsKLQotCXIwID0gQ09ORklHX1ZDT19NVUxUICYgNjM7ICAgICAgIC8qIExvYWQgdGhlIFZDTyBtdWx0aXBsaWVyICAgICAgICAgKi8KLQlyMCA9IHIwIDw8IDk7ICAgICAgICAgICAgICAgICAgICAvKiBTaGlmdCBpdCBvdmVyLCAgICAgICAgICAgICAgICAgICovCi0JcjEgPSBDTEtJTl9IQUxGOyAgICAgICAgICAgICAgICAgLyogRG8gd2UgbmVlZCB0byBkaXZpZGUgQ0xLSU4gYnkgMj8qLwotCXIwID0gcjEgfCByMDsKLQlyMSA9IFBMTF9CWVBBU1M7ICAgICAgICAgICAgICAgICAvKiBCeXBhc3MgdGhlIFBMTD8gICAgICAgICAgICAgICAgICovCi0JcjEgPSByMSA8PCA4OyAgICAgICAgICAgICAgICAgICAgLyogU2hpZnQgaXQgb3ZlciAgICAgICAgICAgICAgICAgICAqLwotCXIwID0gcjEgfCByMDsgICAgICAgICAgICAgICAgICAgIC8qIGFkZCB0aGVtIGFsbCB0b2dldGhlciAgICAgICAgICAgKi8KLSNpZmRlZiBBTk9NQUxZXzA1MDAwMjY1Ci0JQklUU0VUKHIwLCAxNSk7ICAgICAgICAgICAgICAgICAgLyogQWRkIDI1MCBtViBvZiBoeXN0ZXJlc2lzIHRvIFNQT1JUIGlucHV0IHBpbnMgKi8KLSNlbmRpZgotCi0JcDAuaCA9IGhpKFBMTF9DVEwpOwotCXAwLmwgPSBsbyhQTExfQ1RMKTsgICAgICAgICAgICAgIC8qIExvYWQgdGhlIGFkZHJlc3MgICAgICAgICAgICAgICAgKi8KLQljbGkgcjI7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEaXNhYmxlIGludGVycnVwdHMgICAgICAgICAgICAgICovCi0Jc3N5bmM7Ci0Jd1twMF0gPSByMC5sOyAgICAgICAgICAgICAgICAgICAgLyogU2V0IHRoZSB2YWx1ZSAgICAgICAgICAgICAgICAgICAqLwotCWlkbGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFdhaXQgZm9yIHRoZSBQTEwgdG8gc3RhYmxpemUgICAgKi8KLQlzdGkgcjI7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBFbmFibGUgaW50ZXJydXB0cyAgICAgICAgICAgICAgICovCi0KLS5MY2hlY2tfYWdhaW46Ci0JcDAuaCA9IGhpKFBMTF9TVEFUKTsKLQlwMC5sID0gbG8oUExMX1NUQVQpOwotCVIwID0gV1tQMF0oWik7Ci0JQ0MgPSBCSVRUU1QoUjAsNSk7Ci0JaWYgISBDQyBqdW1wIC5MY2hlY2tfYWdhaW47Ci0KLQkvKiBDb25maWd1cmUgU0NMSyAmIENDTEsgRGl2aWRlcnMgKi8KLQlyMCA9IChDT05GSUdfQ0NMS19BQ1RfRElWIHwgQ09ORklHX1NDTEtfRElWKTsKLQlwMC5oID0gaGkoUExMX0RJVik7Ci0JcDAubCA9IGxvKFBMTF9ESVYpOwotCXdbcDBdID0gcjAubDsKLQlzc3luYzsKLQotCXAwLmwgPSBsbyhFQklVX1NEUlJDKTsKLQlwMC5oID0gaGkoRUJJVV9TRFJSQyk7Ci0JcjAgPSBtZW1fU0RSUkM7Ci0Jd1twMF0gPSByMC5sOwotCXNzeW5jOwotCi0JUDIuSCA9IGhpKEVCSVVfU0RHQ1RMKTsKLQlQMi5MID0gbG8oRUJJVV9TREdDVEwpOwotCVIwID0gW1AyXTsKLQlCSVRDTFIgKFIwLCAyNCk7Ci0JcDAuaCA9IGhpKEVCSVVfU0RTVEFUKTsKLQlwMC5sID0gbG8oRUJJVV9TRFNUQVQpOwotCXIyLmwgPSB3W3AwXTsKLQljYyA9IGJpdHRzdChyMiwzKTsKLQlpZiAhY2MganVtcCAuTHNraXA7Ci0JTk9QOwotCUJJVFNFVCAoUjAsIDIzKTsKLS5Mc2tpcDoKLQlbUDJdID0gUjA7Ci0JU1NZTkM7Ci0KLQlSMC5MID0gbG8obWVtX1NER0NUTCk7Ci0JUjAuSCA9IGhpKG1lbV9TREdDVEwpOwotCVIxID0gW3AyXTsKLQlSMSA9IFIxIHwgUjA7Ci0JW1AyXSA9IFIxOwotCVNTWU5DOwotCi0JUlRTOwotRU5EUFJPQyhfc3RhcnRfZG1hX2NvZGUpCi0jZW5kaWYgLyogQ09ORklHX0JGSU5fS0VSTkVMX0NMT0NLICovCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvaW5jbHVkZS9tYWNoL2Fub21hbHkuaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9pbmNsdWRlL21hY2gvYW5vbWFseS5oCmluZGV4IDYyMzczZTYuLjAzNWU4ZDggMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9pbmNsdWRlL21hY2gvYW5vbWFseS5oCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9pbmNsdWRlL21hY2gvYW5vbWFseS5oCkBAIC0yOCw3ICsyOCw3IEBACiAvKiBNdWx0aS1Jc3N1ZSBJbnN0cnVjdGlvbiB3aXRoIGRzcDMyc2hpZnRpbW0gaW4gc2xvdDEgYW5kIFAtcmVnIFN0b3JlIGluIHNsb3QyIE5vdCBTdXBwb3J0ZWQgKi8KICNkZWZpbmUgQU5PTUFMWV8wNTAwMDA3NCAoMSkKIC8qIERNQV9SVU4gQml0IElzIE5vdCBWYWxpZCBhZnRlciBhIFBlcmlwaGVyYWwgUmVjZWl2ZSBDaGFubmVsIERNQSBTdG9wcyAqLwotI2RlZmluZSBBTk9NQUxZXzA1MDAwMTE5ICgxKQorI2RlZmluZSBBTk9NQUxZXzA1MDAwMTE5ICgxKQkvKiBub3RlOiBicm9rZW5uZXNzIGlzIG5vdGVkIGluIGRvY3VtZW50YXRpb24sIG5vdCBhbm9tYWx5IHNoZWV0ICovCiAvKiBSeC5IIENhbm5vdCBCZSBVc2VkIHRvIEFjY2VzcyAxNi1iaXQgU3lzdGVtIE1NUiBSZWdpc3RlcnMgKi8KICNkZWZpbmUgQU5PTUFMWV8wNTAwMDEyMiAoMSkKIC8qIFNwdXJpb3VzIEhhcmR3YXJlIEVycm9yIGZyb20gYW4gQWNjZXNzIGluIHRoZSBTaGFkb3cgb2YgYSBDb25kaXRpb25hbCBCcmFuY2ggKi8KQEAgLTM3LDggKzM3LDYgQEAKICNkZWZpbmUgQU5PTUFMWV8wNTAwMDI2NSAoMSkKIC8qIEZhbHNlIEhhcmR3YXJlIEVycm9ycyBDYXVzZWQgYnkgRmV0Y2hlcyBhdCB0aGUgQm91bmRhcnkgb2YgUmVzZXJ2ZWQgTWVtb3J5ICovCiAjZGVmaW5lIEFOT01BTFlfMDUwMDAzMTAgKDEpCi0vKiBFcnJvcnMgd2hlbiBTU1lOQywgQ1NZTkMsIG9yIExvYWRzIHRvIExULCBMQiBhbmQgTEMgUmVnaXN0ZXJzIEFyZSBJbnRlcnJ1cHRlZCAqLwotI2RlZmluZSBBTk9NQUxZXzA1MDAwMzEyIChBTk9NQUxZX0JGNTI3KQogLyogUFBJIElzIExldmVsLVNlbnNpdGl2ZSBvbiBGaXJzdCBUcmFuc2ZlciBJbiBTaW5nbGUgRnJhbWUgU3luYyBNb2RlcyAqLwogI2RlZmluZSBBTk9NQUxZXzA1MDAwMzEzIChfX1NJTElDT05fUkVWSVNJT05fXyA8IDIpCiAvKiBJbmNvcnJlY3QgQWNjZXNzIG9mIE9UUF9TVEFUVVMgRHVyaW5nIG90cF93cml0ZSgpIEZ1bmN0aW9uICovCkBAIC0xNTMsNiArMTUxLDEwIEBACiAjZGVmaW5lIEFOT01BTFlfMDUwMDA0MzAgKEFOT01BTFlfQkY1MjcgJiYgX19TSUxJQ09OX1JFVklTSU9OX18gPiAxKQogLyogYmZyb21fU3lzQ29udHJvbCgpIERvZXMgTm90IENsZWFyIFNJQ19JV1IxIEJlZm9yZSBFeGVjdXRpbmcgUExMIFByb2dyYW1taW5nIFNlcXVlbmNlICovCiAjZGVmaW5lIEFOT01BTFlfMDUwMDA0MzIgKEFOT01BTFlfQkY1MjYpCisvKiBDZXJ0YWluIFNJQyBSZWdpc3RlcnMgYXJlIG5vdCBSZXNldCBBZnRlciBTb2Z0IG9yIENvcmUgRG91YmxlIEZhdWx0IFJlc2V0ICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDA0MzUgKChBTk9NQUxZX0JGNTI2ICYmIF9fU0lMSUNPTl9SRVZJU0lPTl9fIDwgMSkgfHwgQU5PTUFMWV9CRjUyNykKKy8qIElGTFVTSCBJbnN0cnVjdGlvbiBhdCBFbmQgb2YgSGFyZHdhcmUgTG9vcCBDYXVzZXMgSW5maW5pdGUgU3RhbGwgKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDQ0MyAoMSkKIAogLyogQW5vbWFsaWVzIHRoYXQgZG9uJ3QgZXhpc3Qgb24gdGhpcyBwcm9jICovCiAjZGVmaW5lIEFOT01BTFlfMDUwMDAxMjUgKDApCkBAIC0xNjgsNyArMTcwLDkgQEAKICNkZWZpbmUgQU5PTUFMWV8wNTAwMDI4NSAoMCkKICNkZWZpbmUgQU5PTUFMWV8wNTAwMDMwNyAoMCkKICNkZWZpbmUgQU5PTUFMWV8wNTAwMDMxMSAoMCkKKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDMxMiAoMCkKICNkZWZpbmUgQU5PTUFMWV8wNTAwMDMyMyAoMCkKICNkZWZpbmUgQU5PTUFMWV8wNTAwMDM2MyAoMCkKKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDQxMiAoMCkKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvaW5jbHVkZS9tYWNoL2JmNTI3LmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvaW5jbHVkZS9tYWNoL2JmNTI3LmgKaW5kZXggMTQ0ZjA4ZC4uMzgzMmFhYiAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2luY2x1ZGUvbWFjaC9iZjUyNy5oCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9pbmNsdWRlL21hY2gvYmY1MjcuaApAQCAtMTEwLDcgKzExMCw3IEBACiAKICNpZmRlZiBDT05GSUdfQkY1MjcKICNkZWZpbmUgQ1BVICJCRjUyNyIKLSNkZWZpbmUgQ1BVSUQgMHgyN2U0CisjZGVmaW5lIENQVUlEIDB4MjdlMAogI2VuZGlmCiAjaWZkZWYgQ09ORklHX0JGNTI2CiAjZGVmaW5lIENQVSAiQkY1MjYiCkBAIC0xMTgsNyArMTE4LDcgQEAKICNlbmRpZgogI2lmZGVmIENPTkZJR19CRjUyNQogI2RlZmluZSBDUFUgIkJGNTI1IgotI2RlZmluZSBDUFVJRCAweDI3ZTQKKyNkZWZpbmUgQ1BVSUQgMHgyN2UwCiAjZW5kaWYKICNpZmRlZiBDT05GSUdfQkY1MjQKICNkZWZpbmUgQ1BVICJCRjUyNCIKQEAgLTEyNiw3ICsxMjYsNyBAQAogI2VuZGlmCiAjaWZkZWYgQ09ORklHX0JGNTIzCiAjZGVmaW5lIENQVSAiQkY1MjMiCi0jZGVmaW5lIENQVUlEIDB4MjdlNAorI2RlZmluZSBDUFVJRCAweDI3ZTAKICNlbmRpZgogI2lmZGVmIENPTkZJR19CRjUyMgogI2RlZmluZSBDUFUgIkJGNTIyIgpAQCAtMTM0LDcgKzEzNCw3IEBACiAjZW5kaWYKIAogI2lmbmRlZiBDUFUKLSNlcnJvciBVbmtub3duIENQVSB0eXBlIC0gVGhpcyBrZXJuZWwgZG9lc24ndCBzZWVtIHRvIGJlIGNvbmZpZ3VyZWQgcHJvcGVybHkKKyNlcnJvciAiVW5rbm93biBDUFUgdHlwZSAtIFRoaXMga2VybmVsIGRvZXNuJ3Qgc2VlbSB0byBiZSBjb25maWd1cmVkIHByb3Blcmx5IgogI2VuZGlmCiAKICNlbmRpZgkJCQkvKiBfX01BQ0hfQkY1MjdfSF9fICAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2luY2x1ZGUvbWFjaC9iZmluX3Npci5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2luY2x1ZGUvbWFjaC9iZmluX3Npci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZmQ4YWQ0Li4wMDAwMDAwCi0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9pbmNsdWRlL21hY2gvYmZpbl9zaXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDE0MiArMCwwIEBACi0vKgotICogQmxhY2tmaW4gSW5mcmEtcmVkIERyaXZlcgotICoKLSAqIENvcHlyaWdodCAyMDA2LTIwMDggQW5hbG9nIERldmljZXMgSW5jLgotICoKLSAqIEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLwotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgotI2luY2x1ZGUgPGFzbS9kbWEuaD4KLSNpbmNsdWRlIDxhc20vcG9ydG11eC5oPgotCi0jZGVmaW5lIFNJUl9VQVJUX0dFVF9DSEFSKHBvcnQpICAgYmZpbl9yZWFkMTYoKHBvcnQpLT5tZW1iYXNlICsgT0ZGU0VUX1JCUikKLSNkZWZpbmUgU0lSX1VBUlRfR0VUX0RMTChwb3J0KSAgICBiZmluX3JlYWQxNigocG9ydCktPm1lbWJhc2UgKyBPRkZTRVRfRExMKQotI2RlZmluZSBTSVJfVUFSVF9HRVRfSUVSKHBvcnQpICAgIGJmaW5fcmVhZDE2KChwb3J0KS0+bWVtYmFzZSArIE9GRlNFVF9JRVIpCi0jZGVmaW5lIFNJUl9VQVJUX0dFVF9ETEgocG9ydCkgICAgYmZpbl9yZWFkMTYoKHBvcnQpLT5tZW1iYXNlICsgT0ZGU0VUX0RMSCkKLSNkZWZpbmUgU0lSX1VBUlRfR0VUX0lJUihwb3J0KSAgICBiZmluX3JlYWQxNigocG9ydCktPm1lbWJhc2UgKyBPRkZTRVRfSUlSKQotI2RlZmluZSBTSVJfVUFSVF9HRVRfTENSKHBvcnQpICAgIGJmaW5fcmVhZDE2KChwb3J0KS0+bWVtYmFzZSArIE9GRlNFVF9MQ1IpCi0jZGVmaW5lIFNJUl9VQVJUX0dFVF9HQ1RMKHBvcnQpICAgYmZpbl9yZWFkMTYoKHBvcnQpLT5tZW1iYXNlICsgT0ZGU0VUX0dDVEwpCi0KLSNkZWZpbmUgU0lSX1VBUlRfUFVUX0NIQVIocG9ydCwgdikgYmZpbl93cml0ZTE2KCgocG9ydCktPm1lbWJhc2UgKyBPRkZTRVRfVEhSKSwgdikKLSNkZWZpbmUgU0lSX1VBUlRfUFVUX0RMTChwb3J0LCB2KSAgYmZpbl93cml0ZTE2KCgocG9ydCktPm1lbWJhc2UgKyBPRkZTRVRfRExMKSwgdikKLSNkZWZpbmUgU0lSX1VBUlRfUFVUX0lFUihwb3J0LCB2KSAgYmZpbl93cml0ZTE2KCgocG9ydCktPm1lbWJhc2UgKyBPRkZTRVRfSUVSKSwgdikKLSNkZWZpbmUgU0lSX1VBUlRfUFVUX0RMSChwb3J0LCB2KSAgYmZpbl93cml0ZTE2KCgocG9ydCktPm1lbWJhc2UgKyBPRkZTRVRfRExIKSwgdikKLSNkZWZpbmUgU0lSX1VBUlRfUFVUX0xDUihwb3J0LCB2KSAgYmZpbl93cml0ZTE2KCgocG9ydCktPm1lbWJhc2UgKyBPRkZTRVRfTENSKSwgdikKLSNkZWZpbmUgU0lSX1VBUlRfUFVUX0dDVEwocG9ydCwgdikgYmZpbl93cml0ZTE2KCgocG9ydCktPm1lbWJhc2UgKyBPRkZTRVRfR0NUTCksIHYpCi0KLSNpZmRlZiBDT05GSUdfU0lSX0JGSU5fRE1BCi1zdHJ1Y3QgZG1hX3J4X2J1ZiB7Ci0JY2hhciAqYnVmOwotCWludCBoZWFkOwotCWludCB0YWlsOwotCX07Ci0jZW5kaWYgLyogQ09ORklHX1NJUl9CRklOX0RNQSAqLwotCi1zdHJ1Y3QgYmZpbl9zaXJfcG9ydCB7Ci0JdW5zaWduZWQgY2hhciBfX2lvbWVtICAgKm1lbWJhc2U7Ci0JdW5zaWduZWQgaW50ICAgICAgICAgICAgaXJxOwotCXVuc2lnbmVkIGludCAgICAgICAgICAgIGxzcjsKLQl1bnNpZ25lZCBsb25nICAgICAgICAgICBjbGs7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgICAgICAgKmRldjsKLSNpZmRlZiBDT05GSUdfU0lSX0JGSU5fRE1BCi0JaW50ICAgICAgICAgICAgICAgICAgICAgdHhfZG9uZTsKLQlzdHJ1Y3QgZG1hX3J4X2J1ZiAgICAgICByeF9kbWFfYnVmOwotCXN0cnVjdCB0aW1lcl9saXN0ICAgICAgIHJ4X2RtYV90aW1lcjsKLQlpbnQgICAgICAgICAgICAgICAgICAgICByeF9kbWFfbnJvd3M7Ci0jZW5kaWYgLyogQ09ORklHX1NJUl9CRklOX0RNQSAqLwotCXVuc2lnbmVkIGludCAgICAgICAgICAgIHR4X2RtYV9jaGFubmVsOwotCXVuc2lnbmVkIGludCAgICAgICAgICAgIHJ4X2RtYV9jaGFubmVsOwotfTsKLQotc3RydWN0IGJmaW5fc2lyX3BvcnQgc2lyX3BvcnRzW0JGSU5fVUFSVF9OUl9QT1JUU107Ci0KLXN0cnVjdCBiZmluX3Npcl9wb3J0X3JlcyB7Ci0JdW5zaWduZWQgbG9uZyAgIGJhc2VfYWRkcjsKLQlpbnQgICAgICAgICAgICAgaXJxOwotCXVuc2lnbmVkIGludCAgICByeF9kbWFfY2hhbm5lbDsKLQl1bnNpZ25lZCBpbnQgICAgdHhfZG1hX2NoYW5uZWw7Ci19OwotCi1zdHJ1Y3QgYmZpbl9zaXJfcG9ydF9yZXMgYmZpbl9zaXJfcG9ydF9yZXNvdXJjZVtdID0gewotI2lmZGVmIENPTkZJR19CRklOX1NJUjAKLQl7Ci0JMHhGRkMwMDQwMCwKLQlJUlFfVUFSVDBfUlgsCi0JQ0hfVUFSVDBfUlgsCi0JQ0hfVUFSVDBfVFgsCi0JfSwKLSNlbmRpZgotI2lmZGVmIENPTkZJR19CRklOX1NJUjEKLQl7Ci0JMHhGRkMwMjAwMCwKLQlJUlFfVUFSVDFfUlgsCi0JQ0hfVUFSVDFfUlgsCi0JQ0hfVUFSVDFfVFgsCi0JfSwKLSNlbmRpZgotfTsKLQotaW50IG5yX3NpcnMgPSBBUlJBWV9TSVpFKGJmaW5fc2lyX3BvcnRfcmVzb3VyY2UpOwotCi1zdHJ1Y3QgYmZpbl9zaXJfc2VsZiB7Ci0Jc3RydWN0IGJmaW5fc2lyX3BvcnQgICAgKnNpcl9wb3J0OwotCXNwaW5sb2NrX3QgICAgICAgICAgICAgIGxvY2s7Ci0JdW5zaWduZWQgaW50ICAgICAgICAgICAgb3BlbjsKLQlpbnQgICAgICAgICAgICAgICAgICAgICBzcGVlZDsKLQlpbnQgICAgICAgICAgICAgICAgICAgICBuZXdzcGVlZDsKLQotCXN0cnVjdCBza19idWZmICAgICAgICAgICp0eHNrYjsKLQlzdHJ1Y3Qgc2tfYnVmZiAgICAgICAgICAqcnhza2I7Ci0Jc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7Ci0Jc3RydWN0IGRldmljZSAgICAgICAgICAgKmRldjsKLQlzdHJ1Y3QgaXJsYXBfY2IgICAgICAgICAqaXJsYXA7Ci0Jc3RydWN0IHFvc19pbmZvICAgICAgICAgcW9zOwotCi0JaW9idWZmX3QgICAgICAgICAgICAgICAgdHhfYnVmZjsKLQlpb2J1ZmZfdCAgICAgICAgICAgICAgICByeF9idWZmOwotCi0Jc3RydWN0IHdvcmtfc3RydWN0ICAgICAgd29yazsKLQlpbnQgICAgICAgICAgICAgICAgICAgICBtdHQ7Ci19OwotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBTSVJfVUFSVF9HRVRfTFNSKHN0cnVjdCBiZmluX3Npcl9wb3J0ICpwb3J0KQotewotCXVuc2lnbmVkIGludCBsc3IgPSBiZmluX3JlYWQxNihwb3J0LT5tZW1iYXNlICsgT0ZGU0VUX0xTUik7Ci0JcG9ydC0+bHNyIHw9IChsc3IgJiAoQkl8RkV8UEV8T0UpKTsKLQlyZXR1cm4gbHNyIHwgcG9ydC0+bHNyOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgU0lSX1VBUlRfQ0xFQVJfTFNSKHN0cnVjdCBiZmluX3Npcl9wb3J0ICpwb3J0KQotewotCXBvcnQtPmxzciA9IDA7Ci0JYmZpbl9yZWFkMTYocG9ydC0+bWVtYmFzZSArIE9GRlNFVF9MU1IpOwotfQotCi0jZGVmaW5lIERSSVZFUl9OQU1FICJiZmluX3NpciIKLQotc3RhdGljIGludCBiZmluX3Npcl9od19pbml0KHZvaWQpCi17Ci0JaW50IHJldCA9IC1FTk9ERVY7Ci0jaWZkZWYgQ09ORklHX0JGSU5fU0lSMAotCXJldCA9IHBlcmlwaGVyYWxfcmVxdWVzdChQX1VBUlQwX1RYLCBEUklWRVJfTkFNRSk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQlyZXQgPSBwZXJpcGhlcmFsX3JlcXVlc3QoUF9VQVJUMF9SWCwgRFJJVkVSX05BTUUpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19CRklOX1NJUjEKLQlyZXQgPSBwZXJpcGhlcmFsX3JlcXVlc3QoUF9VQVJUMV9UWCwgRFJJVkVSX05BTUUpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0JcmV0ID0gcGVyaXBoZXJhbF9yZXF1ZXN0KFBfVUFSVDFfUlgsIERSSVZFUl9OQU1FKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotI2VuZGlmCi0JcmV0dXJuIHJldDsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9pbmNsdWRlL21hY2gvY2RlZkJGNTJ4X2Jhc2UuaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9pbmNsdWRlL21hY2gvY2RlZkJGNTJ4X2Jhc2UuaAppbmRleCA5YTgxNGI5Li4xZmU3NmQ4IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvaW5jbHVkZS9tYWNoL2NkZWZCRjUyeF9iYXNlLmgKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2luY2x1ZGUvbWFjaC9jZGVmQkY1MnhfYmFzZS5oCkBAIC0zMSw3ICszMSw2IEBACiAjaWZuZGVmIF9DREVGX0JGNTJYX0gKICNkZWZpbmUgX0NERUZfQkY1MlhfSAogCi0jaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogI2luY2x1ZGUgPGFzbS9ibGFja2Zpbi5oPgogCiAjaW5jbHVkZSAiZGVmQkY1MnhfYmFzZS5oIgpAQCAtNDMsNTcgKzQyLDkgQEAKIAogLyogQ2xvY2sgYW5kIFN5c3RlbSBDb250cm9sCSgweEZGQzAwMDAwIC0gMHhGRkMwMDBGRikJCQkJCQkJCSovCiAjZGVmaW5lIGJmaW5fcmVhZF9QTExfQ1RMKCkJCQliZmluX3JlYWQxNihQTExfQ1RMKQotLyogV3JpdGluZyB0byBQTExfQ1RMIGluaXRpYXRlcyBhIFBMTCByZWxvY2sgc2VxdWVuY2UuICovCi1zdGF0aWMgX19pbmxpbmVfXyB2b2lkIGJmaW5fd3JpdGVfUExMX0NUTCh1bnNpZ25lZCBpbnQgdmFsKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIGl3cjAsIGl3cjE7Ci0KLQlpZiAodmFsID09IGJmaW5fcmVhZF9QTExfQ1RMKCkpCi0JCXJldHVybjsKLQotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQkvKiBFbmFibGUgdGhlIFBMTCBXYWtldXAgYml0IGluIFNJQyBJV1IgKi8KLQlpd3IwID0gYmZpbl9yZWFkMzIoU0lDX0lXUjApOwotCWl3cjEgPSBiZmluX3JlYWQzMihTSUNfSVdSMSk7Ci0JLyogT25seSBhbGxvdyBQUEwgV2FrZXVwKSAqLwotCWJmaW5fd3JpdGUzMihTSUNfSVdSMCwgSVdSX0VOQUJMRSgwKSk7Ci0JYmZpbl93cml0ZTMyKFNJQ19JV1IxLCAwKTsKLQotCWJmaW5fd3JpdGUxNihQTExfQ1RMLCB2YWwpOwotCVNTWU5DKCk7Ci0JYXNtKCJJRExFOyIpOwotCi0JYmZpbl93cml0ZTMyKFNJQ19JV1IwLCBpd3IwKTsKLQliZmluX3dyaXRlMzIoU0lDX0lXUjEsIGl3cjEpOwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLX0KICNkZWZpbmUgYmZpbl9yZWFkX1BMTF9ESVYoKQkJCWJmaW5fcmVhZDE2KFBMTF9ESVYpCiAjZGVmaW5lIGJmaW5fd3JpdGVfUExMX0RJVih2YWwpCQkJYmZpbl93cml0ZTE2KFBMTF9ESVYsIHZhbCkKICNkZWZpbmUgYmZpbl9yZWFkX1ZSX0NUTCgpCQkJYmZpbl9yZWFkMTYoVlJfQ1RMKQotLyogV3JpdGluZyB0byBWUl9DVEwgaW5pdGlhdGVzIGEgUExMIHJlbG9jayBzZXF1ZW5jZS4gKi8KLXN0YXRpYyBfX2lubGluZV9fIHZvaWQgYmZpbl93cml0ZV9WUl9DVEwodW5zaWduZWQgaW50IHZhbCkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzLCBpd3IwLCBpd3IxOwotCi0JaWYgKHZhbCA9PSBiZmluX3JlYWRfVlJfQ1RMKCkpCi0JCXJldHVybjsKLQotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQkvKiBFbmFibGUgdGhlIFBMTCBXYWtldXAgYml0IGluIFNJQyBJV1IgKi8KLQlpd3IwID0gYmZpbl9yZWFkMzIoU0lDX0lXUjApOwotCWl3cjEgPSBiZmluX3JlYWQzMihTSUNfSVdSMSk7Ci0JLyogT25seSBhbGxvdyBQUEwgV2FrZXVwKSAqLwotCWJmaW5fd3JpdGUzMihTSUNfSVdSMCwgSVdSX0VOQUJMRSgwKSk7Ci0JYmZpbl93cml0ZTMyKFNJQ19JV1IxLCAwKTsKLQotCWJmaW5fd3JpdGUxNihWUl9DVEwsIHZhbCk7Ci0JU1NZTkMoKTsKLQlhc20oIklETEU7Iik7Ci0KLQliZmluX3dyaXRlMzIoU0lDX0lXUjAsIGl3cjApOwotCWJmaW5fd3JpdGUzMihTSUNfSVdSMSwgaXdyMSk7Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotfQogI2RlZmluZSBiZmluX3JlYWRfUExMX1NUQVQoKQkJCWJmaW5fcmVhZDE2KFBMTF9TVEFUKQogI2RlZmluZSBiZmluX3dyaXRlX1BMTF9TVEFUKHZhbCkJCWJmaW5fd3JpdGUxNihQTExfU1RBVCwgdmFsKQogI2RlZmluZSBiZmluX3JlYWRfUExMX0xPQ0tDTlQoKQkJCWJmaW5fcmVhZDE2KFBMTF9MT0NLQ05UKQpAQCAtMTIwMSw0ICsxMTUyLDU3IEBACiAjZGVmaW5lIGJmaW5fcmVhZF9ORkNfREFUQV9SRCgpCQkJYmZpbl9yZWFkMTYoTkZDX0RBVEFfUkQpCiAjZGVmaW5lIGJmaW5fd3JpdGVfTkZDX0RBVEFfUkQodmFsKQkJYmZpbl93cml0ZTE2KE5GQ19EQVRBX1JELCB2YWwpCiAKKy8qIFRoZXNlIG5lZWQgdG8gYmUgbGFzdCBkdWUgdG8gdGhlIGNkZWYvbGludXggaW50ZXItZGVwZW5kZW5jaWVzICovCisjaW5jbHVkZSA8YXNtL2lycS5oPgorCisvKiBXcml0aW5nIHRvIFBMTF9DVEwgaW5pdGlhdGVzIGEgUExMIHJlbG9jayBzZXF1ZW5jZS4gKi8KK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgYmZpbl93cml0ZV9QTExfQ1RMKHVuc2lnbmVkIGludCB2YWwpCit7CisJdW5zaWduZWQgbG9uZyBmbGFncywgaXdyMCwgaXdyMTsKKworCWlmICh2YWwgPT0gYmZpbl9yZWFkX1BMTF9DVEwoKSkKKwkJcmV0dXJuOworCisJbG9jYWxfaXJxX3NhdmVfaHcoZmxhZ3MpOworCS8qIEVuYWJsZSB0aGUgUExMIFdha2V1cCBiaXQgaW4gU0lDIElXUiAqLworCWl3cjAgPSBiZmluX3JlYWQzMihTSUNfSVdSMCk7CisJaXdyMSA9IGJmaW5fcmVhZDMyKFNJQ19JV1IxKTsKKwkvKiBPbmx5IGFsbG93IFBQTCBXYWtldXApICovCisJYmZpbl93cml0ZTMyKFNJQ19JV1IwLCBJV1JfRU5BQkxFKDApKTsKKwliZmluX3dyaXRlMzIoU0lDX0lXUjEsIDApOworCisJYmZpbl93cml0ZTE2KFBMTF9DVEwsIHZhbCk7CisJU1NZTkMoKTsKKwlhc20oIklETEU7Iik7CisKKwliZmluX3dyaXRlMzIoU0lDX0lXUjAsIGl3cjApOworCWJmaW5fd3JpdGUzMihTSUNfSVdSMSwgaXdyMSk7CisJbG9jYWxfaXJxX3Jlc3RvcmVfaHcoZmxhZ3MpOworfQorCisvKiBXcml0aW5nIHRvIFZSX0NUTCBpbml0aWF0ZXMgYSBQTEwgcmVsb2NrIHNlcXVlbmNlLiAqLworc3RhdGljIF9faW5saW5lX18gdm9pZCBiZmluX3dyaXRlX1ZSX0NUTCh1bnNpZ25lZCBpbnQgdmFsKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIGl3cjAsIGl3cjE7CisKKwlpZiAodmFsID09IGJmaW5fcmVhZF9WUl9DVEwoKSkKKwkJcmV0dXJuOworCisJbG9jYWxfaXJxX3NhdmVfaHcoZmxhZ3MpOworCS8qIEVuYWJsZSB0aGUgUExMIFdha2V1cCBiaXQgaW4gU0lDIElXUiAqLworCWl3cjAgPSBiZmluX3JlYWQzMihTSUNfSVdSMCk7CisJaXdyMSA9IGJmaW5fcmVhZDMyKFNJQ19JV1IxKTsKKwkvKiBPbmx5IGFsbG93IFBQTCBXYWtldXApICovCisJYmZpbl93cml0ZTMyKFNJQ19JV1IwLCBJV1JfRU5BQkxFKDApKTsKKwliZmluX3dyaXRlMzIoU0lDX0lXUjEsIDApOworCisJYmZpbl93cml0ZTE2KFZSX0NUTCwgdmFsKTsKKwlTU1lOQygpOworCWFzbSgiSURMRTsiKTsKKworCWJmaW5fd3JpdGUzMihTSUNfSVdSMCwgaXdyMCk7CisJYmZpbl93cml0ZTMyKFNJQ19JV1IxLCBpd3IxKTsKKwlsb2NhbF9pcnFfcmVzdG9yZV9odyhmbGFncyk7Cit9CisKICNlbmRpZiAvKiBfQ0RFRl9CRjUyWF9IICovCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvaW5jbHVkZS9tYWNoL2RtYS5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2luY2x1ZGUvbWFjaC9kbWEuaAppbmRleCA0OWRkNjkzLi5lYjI4N2RhIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvaW5jbHVkZS9tYWNoL2RtYS5oCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9pbmNsdWRlL21hY2gvZG1hLmgKQEAgLTEsMzggKzEsMTQgQEAKLS8qCi0gKiBmaWxlOiAgICAgICAgaW5jbHVkZS9hc20tYmxhY2tmaW4vbWFjaC1iZjUyNy9kbWEuaAotICogYmFzZWQgb246CWluY2x1ZGUvYXNtLWJsYWNrZmluL21hY2gtYmY1MzcvZG1hLmgKLSAqIGF1dGhvcjoJTWljaGFlbCBIZW5uZXJpY2ggKG1pY2hhZWwuaGVubmVyaWNoQGFuYWxvZy5jb20pCisvKiBtYWNoL2RtYS5oIC0gYXJjaC1zcGVjaWZpYyBETUEgZGVmaW5lcwogICoKLSAqIGNyZWF0ZWQ6Ci0gKiBkZXNjcmlwdGlvbjoKLSAqCXN5c3RlbSBETUEgbWFwCi0gKiByZXY6CisgKiBDb3B5cmlnaHQgMjAwNC0yMDA4IEFuYWxvZyBEZXZpY2VzIEluYy4KICAqCi0gKiBtb2RpZmllZDoKLSAqCi0gKgotICogYnVnczogICAgICAgICBlbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KLSAqCi0gKiB0aGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBnbnUgZ2VuZXJhbCBwdWJsaWMgbGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBmcmVlIHNvZnR3YXJlIGZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAqIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIHRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IHdpdGhvdXQgYW55IHdhcnJhbnR5OyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIG1lcmNoYW50YWJpbGl0eSBvciBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gIHNlZSB0aGUKLSAqIGdudSBnZW5lcmFsIHB1YmxpYyBsaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogeW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgZ251IGdlbmVyYWwgcHVibGljIGxpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgY29weWluZy4KLSAqIGlmIG5vdCwgd3JpdGUgdG8gdGhlIGZyZWUgc29mdHdhcmUgZm91bmRhdGlvbiwKLSAqIDU5IHRlbXBsZSBwbGFjZSAtIHN1aXRlIDMzMCwgYm9zdG9uLCBtYSAwMjExMS0xMzA3LCB1c2EuCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCiAgKi8KIAogI2lmbmRlZiBfTUFDSF9ETUFfSF8KICNkZWZpbmUgX01BQ0hfRE1BX0hfCiAKLSNkZWZpbmUgTUFYX0JMQUNLRklOX0RNQV9DSEFOTkVMIDE2CisjZGVmaW5lIE1BWF9ETUFfQ0hBTk5FTFMgMTYKIAogI2RlZmluZSBDSF9QUEkgCQkJMAkvKiBQUEkgcmVjZWl2ZS90cmFuc21pdCBvciBORkMgKi8KICNkZWZpbmUgQ0hfRU1BQ19SWCAJCTEJLyogRXRoZXJuZXQgTUFDIHJlY2VpdmUgb3IgSE9TVERQICovCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvaW5jbHVkZS9tYWNoL2dwaW8uaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9pbmNsdWRlL21hY2gvZ3Bpby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2YjZlZWIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvaW5jbHVkZS9tYWNoL2dwaW8uaApAQCAtMCwwICsxLDY4IEBACisvKgorICogRmlsZTogYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2luY2x1ZGUvbWFjaC9ncGlvLmgKKyAqIEJ1Z3M6IEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLworICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCisgKi8KKworCisjaWZuZGVmIF9NQUNIX0dQSU9fSF8KKyNkZWZpbmUgX01BQ0hfR1BJT19IXworCisjZGVmaW5lIE1BWF9CTEFDS0ZJTl9HUElPUyA0OAorCisjZGVmaW5lCUdQSU9fUEYwCTAKKyNkZWZpbmUJR1BJT19QRjEJMQorI2RlZmluZQlHUElPX1BGMgkyCisjZGVmaW5lCUdQSU9fUEYzCTMKKyNkZWZpbmUJR1BJT19QRjQJNAorI2RlZmluZQlHUElPX1BGNQk1CisjZGVmaW5lCUdQSU9fUEY2CTYKKyNkZWZpbmUJR1BJT19QRjcJNworI2RlZmluZQlHUElPX1BGOAk4CisjZGVmaW5lCUdQSU9fUEY5CTkKKyNkZWZpbmUJR1BJT19QRjEwCTEwCisjZGVmaW5lCUdQSU9fUEYxMQkxMQorI2RlZmluZQlHUElPX1BGMTIJMTIKKyNkZWZpbmUJR1BJT19QRjEzCTEzCisjZGVmaW5lCUdQSU9fUEYxNAkxNAorI2RlZmluZQlHUElPX1BGMTUJMTUKKyNkZWZpbmUJR1BJT19QRzAJMTYKKyNkZWZpbmUJR1BJT19QRzEJMTcKKyNkZWZpbmUJR1BJT19QRzIJMTgKKyNkZWZpbmUJR1BJT19QRzMJMTkKKyNkZWZpbmUJR1BJT19QRzQJMjAKKyNkZWZpbmUJR1BJT19QRzUJMjEKKyNkZWZpbmUJR1BJT19QRzYJMjIKKyNkZWZpbmUJR1BJT19QRzcJMjMKKyNkZWZpbmUJR1BJT19QRzgJMjQKKyNkZWZpbmUJR1BJT19QRzkJMjUKKyNkZWZpbmUJR1BJT19QRzEwICAgICAgCTI2CisjZGVmaW5lCUdQSU9fUEcxMSAgICAgIAkyNworI2RlZmluZQlHUElPX1BHMTIgICAgICAJMjgKKyNkZWZpbmUJR1BJT19QRzEzICAgICAgCTI5CisjZGVmaW5lCUdQSU9fUEcxNCAgICAgIAkzMAorI2RlZmluZQlHUElPX1BHMTUgICAgICAJMzEKKyNkZWZpbmUJR1BJT19QSDAJMzIKKyNkZWZpbmUJR1BJT19QSDEJMzMKKyNkZWZpbmUJR1BJT19QSDIJMzQKKyNkZWZpbmUJR1BJT19QSDMJMzUKKyNkZWZpbmUJR1BJT19QSDQJMzYKKyNkZWZpbmUJR1BJT19QSDUJMzcKKyNkZWZpbmUJR1BJT19QSDYJMzgKKyNkZWZpbmUJR1BJT19QSDcJMzkKKyNkZWZpbmUJR1BJT19QSDgJNDAKKyNkZWZpbmUJR1BJT19QSDkJNDEKKyNkZWZpbmUJR1BJT19QSDEwICAgICAgCTQyCisjZGVmaW5lCUdQSU9fUEgxMSAgICAgIAk0MworI2RlZmluZQlHUElPX1BIMTIgICAgICAJNDQKKyNkZWZpbmUJR1BJT19QSDEzICAgICAgCTQ1CisjZGVmaW5lCUdQSU9fUEgxNCAgICAgIAk0NgorI2RlZmluZQlHUElPX1BIMTUgICAgICAJNDcKKworI2RlZmluZSBQT1JUX0YgR1BJT19QRjAKKyNkZWZpbmUgUE9SVF9HIEdQSU9fUEcwCisjZGVmaW5lIFBPUlRfSCBHUElPX1BIMAorCisjZW5kaWYgLyogX01BQ0hfR1BJT19IXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2luY2x1ZGUvbWFjaC9pcnEuaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9pbmNsdWRlL21hY2gvaXJxLmgKaW5kZXggNGUyYjNmMi4uOGVhNjYwZCAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2luY2x1ZGUvbWFjaC9pcnEuaAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvaW5jbHVkZS9tYWNoL2lycS5oCkBAIC05NiwxNCArOTYsMTQgQEAKICNkZWZpbmUgSVJRX01BQ19UWAkJQkZJTl9JUlEoMzApCS8qIERNQTIgQ2hhbm5lbCAoTUFDIFRYL05BTkQpICovCiAjZGVmaW5lIElSUV9ORkMJCQlCRklOX0lSUSgzMCkJLyogRE1BMiBDaGFubmVsIChNQUMgVFgvTkFORCkgKi8KICNkZWZpbmUgSVJRX1BPUlRIX0lOVEIJCUJGSU5fSVJRKDMxKQkvKiBQb3J0IEggSW50ZXJydXB0IEIgKi8KLSNkZWZpbmUgSVJRX1RNUjAJCUJGSU5fSVJRKDMyKQkvKiBUaW1lciAwICovCi0jZGVmaW5lIElSUV9UTVIxCQlCRklOX0lSUSgzMykJLyogVGltZXIgMSAqLwotI2RlZmluZSBJUlFfVE1SMgkJQkZJTl9JUlEoMzQpCS8qIFRpbWVyIDIgKi8KLSNkZWZpbmUgSVJRX1RNUjMJCUJGSU5fSVJRKDM1KQkvKiBUaW1lciAzICovCi0jZGVmaW5lIElSUV9UTVI0CQlCRklOX0lSUSgzNikJLyogVGltZXIgNCAqLwotI2RlZmluZSBJUlFfVE1SNQkJQkZJTl9JUlEoMzcpCS8qIFRpbWVyIDUgKi8KLSNkZWZpbmUgSVJRX1RNUjYJCUJGSU5fSVJRKDM4KQkvKiBUaW1lciA2ICovCi0jZGVmaW5lIElSUV9UTVI3CQlCRklOX0lSUSgzOSkJLyogVGltZXIgNyAqLworI2RlZmluZSBJUlFfVElNRVIwCQlCRklOX0lSUSgzMikJLyogVGltZXIgMCAqLworI2RlZmluZSBJUlFfVElNRVIxCQlCRklOX0lSUSgzMykJLyogVGltZXIgMSAqLworI2RlZmluZSBJUlFfVElNRVIyCQlCRklOX0lSUSgzNCkJLyogVGltZXIgMiAqLworI2RlZmluZSBJUlFfVElNRVIzCQlCRklOX0lSUSgzNSkJLyogVGltZXIgMyAqLworI2RlZmluZSBJUlFfVElNRVI0CQlCRklOX0lSUSgzNikJLyogVGltZXIgNCAqLworI2RlZmluZSBJUlFfVElNRVI1CQlCRklOX0lSUSgzNykJLyogVGltZXIgNSAqLworI2RlZmluZSBJUlFfVElNRVI2CQlCRklOX0lSUSgzOCkJLyogVGltZXIgNiAqLworI2RlZmluZSBJUlFfVElNRVI3CQlCRklOX0lSUSgzOSkJLyogVGltZXIgNyAqLwogI2RlZmluZSBJUlFfUE9SVEdfSU5UQQkJQkZJTl9JUlEoNDApCS8qIFBvcnQgRyBJbnRlcnJ1cHQgQSAqLwogI2RlZmluZSBJUlFfUE9SVEdfSU5UQgkJQkZJTl9JUlEoNDEpCS8qIFBvcnQgRyBJbnRlcnJ1cHQgQiAqLwogI2RlZmluZSBJUlFfTUVNX0RNQTAJCUJGSU5fSVJRKDQyKQkvKiBNRE1BIFN0cmVhbSAwICovCkBAIC0yMjcsMTQgKzIyNywxNCBAQAogI2RlZmluZSBJUlFfUE9SVEhfSU5UQl9QT1MJMjgKIAogLyogSUFSNCBCSVQgRklFTERTICovCi0jZGVmaW5lIElSUV9UTVIwX1BPUwkJMAotI2RlZmluZSBJUlFfVE1SMV9QT1MJCTQKLSNkZWZpbmUgSVJRX1RNUjJfUE9TCQk4Ci0jZGVmaW5lIElSUV9UTVIzX1BPUwkJMTIKLSNkZWZpbmUgSVJRX1RNUjRfUE9TCQkxNgotI2RlZmluZSBJUlFfVE1SNV9QT1MJCTIwCi0jZGVmaW5lIElSUV9UTVI2X1BPUwkJMjQKLSNkZWZpbmUgSVJRX1RNUjdfUE9TCQkyOAorI2RlZmluZSBJUlFfVElNRVIwX1BPUwkJMAorI2RlZmluZSBJUlFfVElNRVIxX1BPUwkJNAorI2RlZmluZSBJUlFfVElNRVIyX1BPUwkJOAorI2RlZmluZSBJUlFfVElNRVIzX1BPUwkJMTIKKyNkZWZpbmUgSVJRX1RJTUVSNF9QT1MJCTE2CisjZGVmaW5lIElSUV9USU1FUjVfUE9TCQkyMAorI2RlZmluZSBJUlFfVElNRVI2X1BPUwkJMjQKKyNkZWZpbmUgSVJRX1RJTUVSN19QT1MJCTI4CiAKIC8qIElBUjUgQklUIEZJRUxEUyAqLwogI2RlZmluZSBJUlFfUE9SVEdfSU5UQV9QT1MJMApkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2luY2x1ZGUvbWFjaC9tZW1faW5pdC5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2luY2x1ZGUvbWFjaC9tZW1faW5pdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYmUwM2Y0Li4wMDAwMDAwCi0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9pbmNsdWRlL21hY2gvbWVtX2luaXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDMxMCArMCwwIEBACi0vKgotICogRmlsZTogICAgICAgICBpbmNsdWRlL2FzbS1ibGFja2Zpbi9tYWNoLWJmNTI3L21lbV9pbml0LmgKLSAqIEJhc2VkIG9uOgotICogQXV0aG9yOgotICoKLSAqIENyZWF0ZWQ6Ci0gKiBEZXNjcmlwdGlvbjoKLSAqCi0gKiBSZXY6Ci0gKgotICogTW9kaWZpZWQ6Ci0gKiAgICAgICAgICAgICAgIENvcHlyaWdodCAyMDA0LTIwMDcgQW5hbG9nIERldmljZXMgSW5jLgotICoKLSAqIEJ1Z3M6ICAgICAgICAgRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gKiBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuCi0gKiBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotICovCi0KLSNpZiAoQ09ORklHX01FTV9NVDQ4TEMxNk0xNkEyVEdfNzUgfHwgQ09ORklHX01FTV9NVDQ4TEM2NE00QTJGQl83RSB8fCBDT05GSUdfTUVNX01UNDhMQzE2TThBMlRHXzc1IHx8IENPTkZJR19NRU1fR0VORVJJQ19CT0FSRCB8fCBDT05GSUdfTUVNX01UNDhMQzMyTThBMl83NSB8fCBDT05GSUdfTUVNX01UNDhMQzMyTTE2QTJUR183NSkKLSNpZiAoQ09ORklHX1NDTEtfSFogPiAxMTk0MDI5ODUpCi0jZGVmaW5lIFNEUkFNX3RSUCAgICAgICBUUlBfMgotI2RlZmluZSBTRFJBTV90UlBfbnVtICAgMgotI2RlZmluZSBTRFJBTV90UkFTICAgICAgVFJBU183Ci0jZGVmaW5lIFNEUkFNX3RSQVNfbnVtICA3Ci0jZGVmaW5lIFNEUkFNX3RSQ0QgICAgICBUUkNEXzIKLSNkZWZpbmUgU0RSQU1fdFdSICAgICAgIFRXUl8yCi0jZW5kaWYKLSNpZiAoQ09ORklHX1NDTEtfSFogPiAxMDQ0Nzc2MTIpICYmIChDT05GSUdfU0NMS19IWiA8PSAxMTk0MDI5ODUpCi0jZGVmaW5lIFNEUkFNX3RSUCAgICAgICBUUlBfMgotI2RlZmluZSBTRFJBTV90UlBfbnVtICAgMgotI2RlZmluZSBTRFJBTV90UkFTICAgICAgVFJBU182Ci0jZGVmaW5lIFNEUkFNX3RSQVNfbnVtICA2Ci0jZGVmaW5lIFNEUkFNX3RSQ0QgICAgICBUUkNEXzIKLSNkZWZpbmUgU0RSQU1fdFdSICAgICAgIFRXUl8yCi0jZW5kaWYKLSNpZiAoQ09ORklHX1NDTEtfSFogPiA4OTU1MjIzOSkgJiYgKENPTkZJR19TQ0xLX0haIDw9IDEwNDQ3NzYxMikKLSNkZWZpbmUgU0RSQU1fdFJQICAgICAgIFRSUF8yCi0jZGVmaW5lIFNEUkFNX3RSUF9udW0gICAyCi0jZGVmaW5lIFNEUkFNX3RSQVMgICAgICBUUkFTXzUKLSNkZWZpbmUgU0RSQU1fdFJBU19udW0gIDUKLSNkZWZpbmUgU0RSQU1fdFJDRCAgICAgIFRSQ0RfMgotI2RlZmluZSBTRFJBTV90V1IgICAgICAgVFdSXzIKLSNlbmRpZgotI2lmIChDT05GSUdfU0NMS19IWiA+IDc0NjI2ODY2KSAmJiAoQ09ORklHX1NDTEtfSFogPD0gODk1NTIyMzkpCi0jZGVmaW5lIFNEUkFNX3RSUCAgICAgICBUUlBfMgotI2RlZmluZSBTRFJBTV90UlBfbnVtICAgMgotI2RlZmluZSBTRFJBTV90UkFTICAgICAgVFJBU180Ci0jZGVmaW5lIFNEUkFNX3RSQVNfbnVtICA0Ci0jZGVmaW5lIFNEUkFNX3RSQ0QgICAgICBUUkNEXzIKLSNkZWZpbmUgU0RSQU1fdFdSICAgICAgIFRXUl8yCi0jZW5kaWYKLSNpZiAoQ09ORklHX1NDTEtfSFogPiA2NjY2NjY2NykgJiYgKENPTkZJR19TQ0xLX0haIDw9IDc0NjI2ODY2KQotI2RlZmluZSBTRFJBTV90UlAgICAgICAgVFJQXzIKLSNkZWZpbmUgU0RSQU1fdFJQX251bSAgIDIKLSNkZWZpbmUgU0RSQU1fdFJBUyAgICAgIFRSQVNfMwotI2RlZmluZSBTRFJBTV90UkFTX251bSAgMwotI2RlZmluZSBTRFJBTV90UkNEICAgICAgVFJDRF8yCi0jZGVmaW5lIFNEUkFNX3RXUiAgICAgICBUV1JfMgotI2VuZGlmCi0jaWYgKENPTkZJR19TQ0xLX0haID4gNTk3MDE0OTMpICYmIChDT05GSUdfU0NMS19IWiA8PSA2NjY2NjY2NykKLSNkZWZpbmUgU0RSQU1fdFJQICAgICAgIFRSUF8xCi0jZGVmaW5lIFNEUkFNX3RSUF9udW0gICAxCi0jZGVmaW5lIFNEUkFNX3RSQVMgICAgICBUUkFTXzQKLSNkZWZpbmUgU0RSQU1fdFJBU19udW0gIDMKLSNkZWZpbmUgU0RSQU1fdFJDRCAgICAgIFRSQ0RfMQotI2RlZmluZSBTRFJBTV90V1IgICAgICAgVFdSXzIKLSNlbmRpZgotI2lmIChDT05GSUdfU0NMS19IWiA+IDQ0Nzc2MTE5KSAmJiAoQ09ORklHX1NDTEtfSFogPD0gNTk3MDE0OTMpCi0jZGVmaW5lIFNEUkFNX3RSUCAgICAgICBUUlBfMQotI2RlZmluZSBTRFJBTV90UlBfbnVtICAgMQotI2RlZmluZSBTRFJBTV90UkFTICAgICAgVFJBU18zCi0jZGVmaW5lIFNEUkFNX3RSQVNfbnVtICAzCi0jZGVmaW5lIFNEUkFNX3RSQ0QgICAgICBUUkNEXzEKLSNkZWZpbmUgU0RSQU1fdFdSICAgICAgIFRXUl8yCi0jZW5kaWYKLSNpZiAoQ09ORklHX1NDTEtfSFogPiAyOTg1MDc0NikgJiYgKENPTkZJR19TQ0xLX0haIDw9IDQ0Nzc2MTE5KQotI2RlZmluZSBTRFJBTV90UlAgICAgICAgVFJQXzEKLSNkZWZpbmUgU0RSQU1fdFJQX251bSAgIDEKLSNkZWZpbmUgU0RSQU1fdFJBUyAgICAgIFRSQVNfMgotI2RlZmluZSBTRFJBTV90UkFTX251bSAgMgotI2RlZmluZSBTRFJBTV90UkNEICAgICAgVFJDRF8xCi0jZGVmaW5lIFNEUkFNX3RXUiAgICAgICBUV1JfMgotI2VuZGlmCi0jaWYgKENPTkZJR19TQ0xLX0haIDw9IDI5ODUwNzQ2KQotI2RlZmluZSBTRFJBTV90UlAgICAgICAgVFJQXzEKLSNkZWZpbmUgU0RSQU1fdFJQX251bSAgIDEKLSNkZWZpbmUgU0RSQU1fdFJBUyAgICAgIFRSQVNfMQotI2RlZmluZSBTRFJBTV90UkFTX251bSAgMQotI2RlZmluZSBTRFJBTV90UkNEICAgICAgVFJDRF8xCi0jZGVmaW5lIFNEUkFNX3RXUiAgICAgICBUV1JfMgotI2VuZGlmCi0jZW5kaWYKLQotI2lmIChDT05GSUdfTUVNX01UNDhMQzE2TTE2QTJUR183NSkKLSAgLypTRFJBTSBJTkZPUk1BVElPTjogKi8KLSNkZWZpbmUgU0RSQU1fVHJlZiAgNjQJCS8qIFJlZnJlc2ggcGVyaW9kIGluIG1pbGxpc2Vjb25kcyAgICovCi0jZGVmaW5lIFNEUkFNX05SQSAgIDgxOTIJLyogTnVtYmVyIG9mIHJvdyBhZGRyZXNzZXMgaW4gU0RSQU0gKi8KLSNkZWZpbmUgU0RSQU1fQ0wgICAgQ0xfMwotI2VuZGlmCi0KLSNpZiAoQ09ORklHX01FTV9NVDQ4TEMxNk04QTJUR183NSkKLSAgLypTRFJBTSBJTkZPUk1BVElPTjogKi8KLSNkZWZpbmUgU0RSQU1fVHJlZiAgNjQJCS8qIFJlZnJlc2ggcGVyaW9kIGluIG1pbGxpc2Vjb25kcyAgICovCi0jZGVmaW5lIFNEUkFNX05SQSAgIDQwOTYJLyogTnVtYmVyIG9mIHJvdyBhZGRyZXNzZXMgaW4gU0RSQU0gKi8KLSNkZWZpbmUgU0RSQU1fQ0wgICAgQ0xfMwotI2VuZGlmCi0KLSNpZiAoQ09ORklHX01FTV9NVDQ4TEMzMk04QTJfNzUpCi0gIC8qU0RSQU0gSU5GT1JNQVRJT046ICovCi0jZGVmaW5lIFNEUkFNX1RyZWYgIDY0CQkvKiBSZWZyZXNoIHBlcmlvZCBpbiBtaWxsaXNlY29uZHMgICAqLwotI2RlZmluZSBTRFJBTV9OUkEgICA4MTkyCS8qIE51bWJlciBvZiByb3cgYWRkcmVzc2VzIGluIFNEUkFNICovCi0jZGVmaW5lIFNEUkFNX0NMICAgIENMXzMKLSNlbmRpZgotCi0jaWYgKENPTkZJR19NRU1fTVQ0OExDNjRNNEEyRkJfN0UpCi0gIC8qU0RSQU0gSU5GT1JNQVRJT046ICovCi0jZGVmaW5lIFNEUkFNX1RyZWYgIDY0CQkvKiBSZWZyZXNoIHBlcmlvZCBpbiBtaWxsaXNlY29uZHMgICAqLwotI2RlZmluZSBTRFJBTV9OUkEgICA4MTkyCS8qIE51bWJlciBvZiByb3cgYWRkcmVzc2VzIGluIFNEUkFNICovCi0jZGVmaW5lIFNEUkFNX0NMICAgIENMXzMKLSNlbmRpZgotCi0jaWYgKENPTkZJR19NRU1fR0VORVJJQ19CT0FSRCkKLSAgLypTRFJBTSBJTkZPUk1BVElPTjogTW9kaWZ5IHRoaXMgZm9yIHlvdXIgYm9hcmQgKi8KLSNkZWZpbmUgU0RSQU1fVHJlZiAgNjQJCS8qIFJlZnJlc2ggcGVyaW9kIGluIG1pbGxpc2Vjb25kcyAgICovCi0jZGVmaW5lIFNEUkFNX05SQSAgIDgxOTIJLyogTnVtYmVyIG9mIHJvdyBhZGRyZXNzZXMgaW4gU0RSQU0gKi8KLSNkZWZpbmUgU0RSQU1fQ0wgICAgQ0xfMwotI2VuZGlmCi0KLSNpZiAoQ09ORklHX01FTV9NVDQ4TEMzMk0xNkEyVEdfNzUpCi0gIC8qU0RSQU0gSU5GT1JNQVRJT046ICovCi0jZGVmaW5lIFNEUkFNX1RyZWYgIDY0CQkvKiBSZWZyZXNoIHBlcmlvZCBpbiBtaWxsaXNlY29uZHMgICAqLwotI2RlZmluZSBTRFJBTV9OUkEgICA4MTkyCS8qIE51bWJlciBvZiByb3cgYWRkcmVzc2VzIGluIFNEUkFNICovCi0jZGVmaW5lIFNEUkFNX0NMICAgIENMXzMKLSNlbmRpZgotCi0vKiBFcXVhdGlvbiBmcm9tIHNlY3Rpb24gMTcgKHAxNy00Nikgb2YgQkY1MzMgSFJNICovCi0jZGVmaW5lIG1lbV9TRFJSQyAgICAgICAoKChDT05GSUdfU0NMS19IWiAvIDEwMDApICogU0RSQU1fVHJlZikgLyBTRFJBTV9OUkEpIC0gKFNEUkFNX3RSQVNfbnVtICsgU0RSQU1fdFJQX251bSkKLQotLyogRW5hYmxlIFNDTEsgT3V0ICovCi0jZGVmaW5lIG1lbV9TREdDVEwgICAgICAgIChTQ1RMRSB8IFNEUkFNX0NMIHwgU0RSQU1fdFJBUyB8IFNEUkFNX3RSUCB8IFNEUkFNX3RSQ0QgfCBTRFJBTV90V1IgfCBQU1MpCi0KLSNpZiBkZWZpbmVkIENPTkZJR19DTEtJTl9IQUxGCi0jZGVmaW5lIENMS0lOX0hBTEYgICAgICAgMQotI2Vsc2UKLSNkZWZpbmUgQ0xLSU5fSEFMRiAgICAgICAwCi0jZW5kaWYKLQotI2lmIGRlZmluZWQgQ09ORklHX1BMTF9CWVBBU1MKLSNkZWZpbmUgUExMX0JZUEFTUyAgICAgIDEKLSNlbHNlCi0jZGVmaW5lIFBMTF9CWVBBU1MgICAgICAgMAotI2VuZGlmCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipDdXJyZW50bHkgTm90IEJlaW5nIFVzZWQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTF9XQVQgICgoQ09ORklHX0ZMQVNIX1NQRUVEX0JXQVQgKiA0KSAvICg0MDAwMDAwMDAwIC8gQ09ORklHX1NDTEtfSFopKSArIDEKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVExfUkFUICAoKENPTkZJR19GTEFTSF9TUEVFRF9CUkFUICogNCkgLyAoNDAwMDAwMDAwMCAvIENPTkZJR19TQ0xLX0haKSkgKyAxCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMX0hUICAgKChDT05GSUdfRkxBU0hfU1BFRURfQkhUICAqIDQpIC8gKDQwMDAwMDAwMDAgLyBDT05GSUdfU0NMS19IWikpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMX1NUICAgKChDT05GSUdfRkxBU0hfU1BFRURfQlNUICAqIDQpIC8gKDQwMDAwMDAwMDAgLyBDT05GSUdfU0NMS19IWikpICsgMQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTF9UVCAgICgoQ09ORklHX0ZMQVNIX1NQRUVEX0JUVCAgKiA0KSAvICg0MDAwMDAwMDAwIC8gQ09ORklHX1NDTEtfSFopKSArIDEKLQotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9UVCA+IDMpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9UVCAgIEIwVFRfNAotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1RUID09IDMpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9UVCAgIEIwVFRfMwotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1RUID09IDIpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9UVCAgIEIwVFRfMgotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1RUIDwgMikKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1RUICAgQjBUVF8xCi0jZW5kaWYKLQotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9TVCA+IDMpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9TVCAgIEIwU1RfNAotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1NUID09IDMpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9TVCAgIEIwU1RfMwotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1NUID09IDIpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9TVCAgIEIwU1RfMgotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1NUIDwgMikKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1NUICAgQjBTVF8xCi0jZW5kaWYKLQotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9IVCA+IDIpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9IVCAgIEIwSFRfMwotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX0hUID09IDIpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9IVCAgIEIwSFRfMgotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX0hUID09IDEpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9IVCAgIEIwSFRfMQotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX0hUID09IDAgJiYgQ09ORklHX0ZMQVNIX1NQRUVEX0JIVCA9PSAwKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfSFQgICBCMEhUXzAKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9IVCA9PSAwICYmIENPTkZJR19GTEFTSF9TUEVFRF9CSFQgIT0gMCkKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX0hUICAgQjBIVF8xCi0jZW5kaWYKLQotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9XQVQgPiAxNCkKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1dBVCAgQjBXQVRfMTUKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9XQVQgPT0gMTQpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9XQVQgIEIwV0FUXzE0Ci0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfV0FUID09IDEzKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfV0FUICBCMFdBVF8xMwotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1dBVCA9PSAxMikKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1dBVCAgQjBXQVRfMTIKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9XQVQgPT0gMTEpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9XQVQgIEIwV0FUXzExCi0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfV0FUID09IDEwKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfV0FUICBCMFdBVF8xMAotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1dBVCA9PSA5KQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfV0FUICBCMFdBVF85Ci0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfV0FUID09IDgpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9XQVQgIEIwV0FUXzgKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9XQVQgPT0gNykKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1dBVCAgQjBXQVRfNwotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1dBVCA9PSA2KQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfV0FUICBCMFdBVF82Ci0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfV0FUID09IDUpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9XQVQgIEIwV0FUXzUKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9XQVQgPT0gNCkKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1dBVCAgQjBXQVRfNAotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1dBVCA9PSAzKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfV0FUICBCMFdBVF8zCi0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfV0FUID09IDIpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9XQVQgIEIwV0FUXzIKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9XQVQgPT0gMSkKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1dBVCAgQjBXQVRfMQotI2VuZGlmCi0KLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfUkFUID4gMTQpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9SQVQgIEIwUkFUXzE1Ci0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfUkFUID09IDE0KQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfUkFUICBCMFJBVF8xNAotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1JBVCA9PSAxMykKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1JBVCAgQjBSQVRfMTMKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9SQVQgPT0gMTIpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9SQVQgIEIwUkFUXzEyCi0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfUkFUID09IDExKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfUkFUICBCMFJBVF8xMQotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1JBVCA9PSAxMCkKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1JBVCAgQjBSQVRfMTAKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9SQVQgPT0gOSkKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1JBVCAgQjBSQVRfOQotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1JBVCA9PSA4KQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfUkFUICBCMFJBVF84Ci0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfUkFUID09IDcpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9SQVQgIEIwUkFUXzcKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9SQVQgPT0gNikKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1JBVCAgQjBSQVRfNgotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1JBVCA9PSA1KQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfUkFUICBCMFJBVF81Ci0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfUkFUID09IDQpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9SQVQgIEIwUkFUXzQKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9SQVQgPT0gMykKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1JBVCAgQjBSQVRfMwotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1JBVCA9PSAyKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfUkFUICBCMFJBVF8yCi0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfUkFUID09IDEpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9SQVQgIEIwUkFUXzEKLSNlbmRpZgotCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMCAgXAotCShmbGFzaF9FQklVX0FNQkNUTDBfV0FUIHwgZmxhc2hfRUJJVV9BTUJDVEwwX1JBVCB8IGZsYXNoX0VCSVVfQU1CQ1RMMF9IVCB8IFwKLQkgZmxhc2hfRUJJVV9BTUJDVEwwX1NUIHwgZmxhc2hfRUJJVV9BTUJDVEwwX1RUIHwgQ09ORklHX0ZMQVNIX1NQRUVEX1JEWUVOKQpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2luY2x1ZGUvbWFjaC9tZW1fbWFwLmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvaW5jbHVkZS9tYWNoL21lbV9tYXAuaAppbmRleCBlZjQ2ZGM5Li4wMTllMDAxIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvaW5jbHVkZS9tYWNoL21lbV9tYXAuaAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvaW5jbHVkZS9tYWNoL21lbV9tYXAuaApAQCAtOTksNCArOTksMTAgQEAKICNkZWZpbmUgTDFfU0NSQVRDSF9TVEFSVAkweEZGQjAwMDAwCiAjZGVmaW5lIEwxX1NDUkFUQ0hfTEVOR1RICTB4MTAwMAogCisjZGVmaW5lIEdFVF9QREFfU0FGRShwcmVnKQkJXAorCXByZWcubCA9IF9jcHVfcGRhOwkJXAorCXByZWcuaCA9IF9jcHVfcGRhOworCisjZGVmaW5lIEdFVF9QREEocHJlZywgZHJlZykJR0VUX1BEQV9TQUZFKHByZWcpCisKICNlbmRpZgkJCQkvKiBfTUVNX01BUF81MjdfSF8gKi8KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9pbnRzLXByaW9yaXR5LmMgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvaW50cy1wcmlvcml0eS5jCmluZGV4IDhhMjM2NzQuLmY4YzhhY2QgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9pbnRzLXByaW9yaXR5LmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2ludHMtcHJpb3JpdHkuYwpAQCAtNjksMTQgKzY5LDE0IEBACiAJCQkoKENPTkZJR19JUlFfTUFDX1RYIC0gNykgPDwgSVJRX01BQ19UWF9QT1MpIHwKIAkJCSgoQ09ORklHX0lSUV9QT1JUSF9JTlRCIC0gNykgPDwgSVJRX1BPUlRIX0lOVEJfUE9TKSk7CiAKLQliZmluX3dyaXRlX1NJQ19JQVI0KCgoQ09ORklHX0lSUV9UTVIwIC0gNykgPDwgSVJRX1RNUjBfUE9TKSB8Ci0JCQkoKENPTkZJR19JUlFfVE1SMSAtIDcpIDw8IElSUV9UTVIxX1BPUykgfAotCQkJKChDT05GSUdfSVJRX1RNUjIgLSA3KSA8PCBJUlFfVE1SMl9QT1MpIHwKLQkJCSgoQ09ORklHX0lSUV9UTVIzIC0gNykgPDwgSVJRX1RNUjNfUE9TKSB8Ci0JCQkoKENPTkZJR19JUlFfVE1SNCAtIDcpIDw8IElSUV9UTVI0X1BPUykgfAotCQkJKChDT05GSUdfSVJRX1RNUjUgLSA3KSA8PCBJUlFfVE1SNV9QT1MpIHwKLQkJCSgoQ09ORklHX0lSUV9UTVI2IC0gNykgPDwgSVJRX1RNUjZfUE9TKSB8Ci0JCQkoKENPTkZJR19JUlFfVE1SNyAtIDcpIDw8IElSUV9UTVI3X1BPUykpOworCWJmaW5fd3JpdGVfU0lDX0lBUjQoKChDT05GSUdfSVJRX1RJTUVSMCAtIDcpIDw8IElSUV9USU1FUjBfUE9TKSB8CisJCQkoKENPTkZJR19JUlFfVElNRVIxIC0gNykgPDwgSVJRX1RJTUVSMV9QT1MpIHwKKwkJCSgoQ09ORklHX0lSUV9USU1FUjIgLSA3KSA8PCBJUlFfVElNRVIyX1BPUykgfAorCQkJKChDT05GSUdfSVJRX1RJTUVSMyAtIDcpIDw8IElSUV9USU1FUjNfUE9TKSB8CisJCQkoKENPTkZJR19JUlFfVElNRVI0IC0gNykgPDwgSVJRX1RJTUVSNF9QT1MpIHwKKwkJCSgoQ09ORklHX0lSUV9USU1FUjUgLSA3KSA8PCBJUlFfVElNRVI1X1BPUykgfAorCQkJKChDT05GSUdfSVJRX1RJTUVSNiAtIDcpIDw8IElSUV9USU1FUjZfUE9TKSB8CisJCQkoKENPTkZJR19JUlFfVElNRVI3IC0gNykgPDwgSVJRX1RJTUVSN19QT1MpKTsKIAogCWJmaW5fd3JpdGVfU0lDX0lBUjUoKChDT05GSUdfSVJRX1BPUlRHX0lOVEEgLSA3KSA8PCBJUlFfUE9SVEdfSU5UQV9QT1MpIHwKIAkJCSgoQ09ORklHX0lSUV9QT1JUR19JTlRCIC0gNykgPDwgSVJRX1BPUlRHX0lOVEJfUE9TKSB8CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvS2NvbmZpZyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9LY29uZmlnCmluZGV4IDc2YmViNzUuLjE0NDI3ZGUgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9LY29uZmlnCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9LY29uZmlnCkBAIC01OSw3ICs1OSw3IEBACiAJZGVmYXVsdCAxMAogY29uZmlnIFRJTUVSMAogCWludCAiVElNRVIwIgotCWRlZmF1bHQgMTEKKwlkZWZhdWx0IDgKIGNvbmZpZyBUSU1FUjEKIAlpbnQgIlRJTUVSMSIKIAlkZWZhdWx0IDExCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvTWFrZWZpbGUgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvTWFrZWZpbGUKaW5kZXggYWE5ZjI2NC4uODc0ODQwZiAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL01ha2VmaWxlCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9NYWtlZmlsZQpAQCAtMiw2ICsyLDQgQEAKICMgYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL01ha2VmaWxlCiAjCiAKLWV4dHJhLXkgOj0gaGVhZC5vCi0KIG9iai15IDo9IGludHMtcHJpb3JpdHkubyBkbWEubwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2JvYXJkcy9IODYwNi5jIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2JvYXJkcy9IODYwNi5jCmluZGV4IDcyYWMzYWMuLjBjNjZiZjQgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9ib2FyZHMvSDg2MDYuYworKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvYm9hcmRzL0g4NjA2LmMKQEAgLTMxMywyMyArMzEzLDMzIEBACiAjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX0JGSU5fU0lSKSB8fCBkZWZpbmVkKENPTkZJR19CRklOX1NJUl9NT0RVTEUpCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIGJmaW5fc2lyX3Jlc291cmNlc1tdID0gewogI2lmZGVmIENPTkZJR19CRklOX1NJUjAKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYmZpbl9zaXIwX3Jlc291cmNlc1tdID0gewogCXsKIAkJLnN0YXJ0ID0gMHhGRkMwMDQwMCwKIAkJLmVuZCA9IDB4RkZDMDA0RkYsCiAJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAogCX0sCi0jZW5kaWYKKwl7CisJCS5zdGFydCA9IElSUV9VQVJUMF9SWCwKKwkJLmVuZCA9IElSUV9VQVJUMF9SWCsxLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCXsKKwkJLnN0YXJ0ID0gQ0hfVUFSVDBfUlgsCisJCS5lbmQgPSBDSF9VQVJUMF9SWCsxLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0RNQSwKKwl9LAogfTsKIAotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9zaXJfZGV2aWNlID0geworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9zaXIwX2RldmljZSA9IHsKIAkubmFtZSA9ICJiZmluX3NpciIsCiAJLmlkID0gMCwKLQkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUoYmZpbl9zaXJfcmVzb3VyY2VzKSwKLQkucmVzb3VyY2UgPSBiZmluX3Npcl9yZXNvdXJjZXMsCisJLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKGJmaW5fc2lyMF9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZSA9IGJmaW5fc2lyMF9yZXNvdXJjZXMsCiB9OwogI2VuZGlmCisjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX1NFUklBTF84MjUwKSB8fCBkZWZpbmVkKENPTkZJR19TRVJJQUxfODI1MF9NT0RVTEUpCiAKQEAgLTQzMSw3ICs0NDEsOSBAQAogI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19CRklOX1NJUikgfHwgZGVmaW5lZChDT05GSUdfQkZJTl9TSVJfTU9EVUxFKQotCSZiZmluX3Npcl9kZXZpY2UsCisjaWZkZWYgQ09ORklHX0JGSU5fU0lSMAorCSZiZmluX3NpcjBfZGV2aWNlLAorI2VuZGlmCiAjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX0tFWUJPQVJEX09QRU5DT1JFUykgfHwgZGVmaW5lZChDT05GSUdfS0VZQk9BUkRfT1BFTkNPUkVTX01PRFVMRSkKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9ib2FyZHMvYmxhY2tzdGFtcC5jIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2JvYXJkcy9ibGFja3N0YW1wLmMKaW5kZXggZDA2NGRlZC4uNmVlNjA3YyAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2JvYXJkcy9ibGFja3N0YW1wLmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2JvYXJkcy9ibGFja3N0YW1wLmMKQEAgLTIxMiwyMyArMjEyLDMzIEBACiAjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX0JGSU5fU0lSKSB8fCBkZWZpbmVkKENPTkZJR19CRklOX1NJUl9NT0RVTEUpCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIGJmaW5fc2lyX3Jlc291cmNlc1tdID0gewogI2lmZGVmIENPTkZJR19CRklOX1NJUjAKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYmZpbl9zaXIwX3Jlc291cmNlc1tdID0gewogCXsKIAkJLnN0YXJ0ID0gMHhGRkMwMDQwMCwKIAkJLmVuZCA9IDB4RkZDMDA0RkYsCiAJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAogCX0sCi0jZW5kaWYKKwl7CisJCS5zdGFydCA9IElSUV9VQVJUMF9SWCwKKwkJLmVuZCA9IElSUV9VQVJUMF9SWCsxLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCXsKKwkJLnN0YXJ0ID0gQ0hfVUFSVDBfUlgsCisJCS5lbmQgPSBDSF9VQVJUMF9SWCsxLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0RNQSwKKwl9LAogfTsKIAotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9zaXJfZGV2aWNlID0geworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9zaXIwX2RldmljZSA9IHsKIAkubmFtZSA9ICJiZmluX3NpciIsCiAJLmlkID0gMCwKLQkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUoYmZpbl9zaXJfcmVzb3VyY2VzKSwKLQkucmVzb3VyY2UgPSBiZmluX3Npcl9yZXNvdXJjZXMsCisJLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKGJmaW5fc2lyMF9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZSA9IGJmaW5fc2lyMF9yZXNvdXJjZXMsCiB9OwogI2VuZGlmCisjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX1NFUklBTF9CRklOX1NQT1JUKSB8fCBkZWZpbmVkKENPTkZJR19TRVJJQUxfQkZJTl9TUE9SVF9NT0RVTEUpCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX3Nwb3J0MF91YXJ0X2RldmljZSA9IHsKQEAgLTM1Myw3ICszNjMsOSBAQAogI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19CRklOX1NJUikgfHwgZGVmaW5lZChDT05GSUdfQkZJTl9TSVJfTU9EVUxFKQotCSZiZmluX3Npcl9kZXZpY2UsCisjaWZkZWYgQ09ORklHX0JGSU5fU0lSMAorCSZiZmluX3NpcjBfZGV2aWNlLAorI2VuZGlmCiAjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX1NFUklBTF9CRklOX1NQT1JUKSB8fCBkZWZpbmVkKENPTkZJR19TRVJJQUxfQkZJTl9TUE9SVF9NT0RVTEUpCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvYm9hcmRzL2NtX2JmNTMzLmMgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvYm9hcmRzL2NtX2JmNTMzLmMKaW5kZXggNTc1ODQzZi4uZTcwNjFjNyAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2JvYXJkcy9jbV9iZjUzMy5jCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9ib2FyZHMvY21fYmY1MzMuYwpAQCAtMjE5LDYgKzIxOSwxOSBAQAogfTsKICNlbmRpZgogCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGJmaW5fZ3Bpb3NfcmVzb3VyY2VzID0geworCS5zdGFydCA9IDAsCisJLmVuZCAgID0gTUFYX0JMQUNLRklOX0dQSU9TIC0gMSwKKwkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmaW5fZ3Bpb3NfZGV2aWNlID0geworCS5uYW1lID0gInNpbXBsZS1ncGlvIiwKKwkuaWQgPSAtMSwKKwkubnVtX3Jlc291cmNlcyA9IDEsCisJLnJlc291cmNlID0gJmJmaW5fZ3Bpb3NfcmVzb3VyY2VzLAorfTsKKwogI2lmIGRlZmluZWQoQ09ORklHX1NFUklBTF9CRklOKSB8fCBkZWZpbmVkKENPTkZJR19TRVJJQUxfQkZJTl9NT0RVTEUpCiBzdGF0aWMgc3RydWN0IHJlc291cmNlIGJmaW5fdWFydF9yZXNvdXJjZXNbXSA9IHsKIAl7CkBAIC0yMzcsMjMgKzI1MCwzMyBAQAogI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19CRklOX1NJUikgfHwgZGVmaW5lZChDT05GSUdfQkZJTl9TSVJfTU9EVUxFKQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBiZmluX3Npcl9yZXNvdXJjZXNbXSA9IHsKICNpZmRlZiBDT05GSUdfQkZJTl9TSVIwCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGJmaW5fc2lyMF9yZXNvdXJjZXNbXSA9IHsKIAl7CiAJCS5zdGFydCA9IDB4RkZDMDA0MDAsCiAJCS5lbmQgPSAweEZGQzAwNEZGLAogCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKIAl9LAotI2VuZGlmCisJeworCQkuc3RhcnQgPSBJUlFfVUFSVDBfUlgsCisJCS5lbmQgPSBJUlFfVUFSVDBfUlgrMSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwl7CisJCS5zdGFydCA9IENIX1VBUlQwX1JYLAorCQkuZW5kID0gQ0hfVUFSVDBfUlgrMSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9ETUEsCisJfSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmaW5fc2lyX2RldmljZSA9IHsKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmaW5fc2lyMF9kZXZpY2UgPSB7CiAJLm5hbWUgPSAiYmZpbl9zaXIiLAogCS5pZCA9IDAsCi0JLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKGJmaW5fc2lyX3Jlc291cmNlcyksCi0JLnJlc291cmNlID0gYmZpbl9zaXJfcmVzb3VyY2VzLAorCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShiZmluX3NpcjBfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UgPSBiZmluX3NpcjBfcmVzb3VyY2VzLAogfTsKICNlbmRpZgorI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19TRVJJQUxfQkZJTl9TUE9SVCkgfHwgZGVmaW5lZChDT05GSUdfU0VSSUFMX0JGSU5fU1BPUlRfTU9EVUxFKQogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9zcG9ydDBfdWFydF9kZXZpY2UgPSB7CkBAIC0zNDIsNyArMzY1LDkgQEAKICNlbmRpZgogCiAjaWYgZGVmaW5lZChDT05GSUdfQkZJTl9TSVIpIHx8IGRlZmluZWQoQ09ORklHX0JGSU5fU0lSX01PRFVMRSkKLQkmYmZpbl9zaXJfZGV2aWNlLAorI2lmZGVmIENPTkZJR19CRklOX1NJUjAKKwkmYmZpbl9zaXIwX2RldmljZSwKKyNlbmRpZgogI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19TRVJJQUxfQkZJTl9TUE9SVCkgfHwgZGVmaW5lZChDT05GSUdfU0VSSUFMX0JGSU5fU1BPUlRfTU9EVUxFKQpAQCAtMzY1LDYgKzM5MCw4IEBACiAjaWYgZGVmaW5lZChDT05GSUdfU1BJX0JGSU4pIHx8IGRlZmluZWQoQ09ORklHX1NQSV9CRklOX01PRFVMRSkKIAkmYmZpbl9zcGkwX2RldmljZSwKICNlbmRpZgorCisJJmJmaW5fZ3Bpb3NfZGV2aWNlLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgY21fYmY1MzNfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2JvYXJkcy9lemtpdC5jIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2JvYXJkcy9lemtpdC5jCmluZGV4IGNjMmU3ZWUuLjA4Y2QwOTYgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9ib2FyZHMvZXpraXQuYworKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvYm9hcmRzL2V6a2l0LmMKQEAgLTQ2LDcgKzQ2LDcgQEAKIC8qCiAgKiBOYW1lIHRoZSBCb2FyZCBmb3IgdGhlIC9wcm9jL2NwdWluZm8KICAqLwotY29uc3QgY2hhciBiZmluX2JvYXJkX25hbWVbXSA9ICJBRERTLUJGNTMzLUVaS0lUIjsKK2NvbnN0IGNoYXIgYmZpbl9ib2FyZF9uYW1lW10gPSAiQURJIEJGNTMzLUVaS0lUIjsKIAogI2lmIGRlZmluZWQoQ09ORklHX1JUQ19EUlZfQkZJTikgfHwgZGVmaW5lZChDT05GSUdfUlRDX0RSVl9CRklOX01PRFVMRSkKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHJ0Y19kZXZpY2UgPSB7CkBAIC0yMzYsMjMgKzIzNiwzMyBAQAogI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19CRklOX1NJUikgfHwgZGVmaW5lZChDT05GSUdfQkZJTl9TSVJfTU9EVUxFKQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBiZmluX3Npcl9yZXNvdXJjZXNbXSA9IHsKICNpZmRlZiBDT05GSUdfQkZJTl9TSVIwCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGJmaW5fc2lyMF9yZXNvdXJjZXNbXSA9IHsKIAl7CiAJCS5zdGFydCA9IDB4RkZDMDA0MDAsCiAJCS5lbmQgPSAweEZGQzAwNEZGLAogCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKIAl9LAotI2VuZGlmCisJeworCQkuc3RhcnQgPSBJUlFfVUFSVDBfUlgsCisJCS5lbmQgPSBJUlFfVUFSVDBfUlgrMSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwl7CisJCS5zdGFydCA9IENIX1VBUlQwX1JYLAorCQkuZW5kID0gQ0hfVUFSVDBfUlgrMSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9ETUEsCisJfSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmaW5fc2lyX2RldmljZSA9IHsKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmaW5fc2lyMF9kZXZpY2UgPSB7CiAJLm5hbWUgPSAiYmZpbl9zaXIiLAogCS5pZCA9IDAsCi0JLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKGJmaW5fc2lyX3Jlc291cmNlcyksCi0JLnJlc291cmNlID0gYmZpbl9zaXJfcmVzb3VyY2VzLAorCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShiZmluX3NpcjBfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UgPSBiZmluX3NpcjBfcmVzb3VyY2VzLAogfTsKICNlbmRpZgorI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19LRVlCT0FSRF9HUElPKSB8fCBkZWZpbmVkKENPTkZJR19LRVlCT0FSRF9HUElPX01PRFVMRSkKICNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgpAQCAtMzYzLDcgKzM3Myw5IEBACiAjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX0JGSU5fU0lSKSB8fCBkZWZpbmVkKENPTkZJR19CRklOX1NJUl9NT0RVTEUpCi0JJmJmaW5fc2lyX2RldmljZSwKKyNpZmRlZiBDT05GSUdfQkZJTl9TSVIwCisJJmJmaW5fc2lyMF9kZXZpY2UsCisjZW5kaWYKICNlbmRpZgogCiAjaWYgZGVmaW5lZChDT05GSUdfS0VZQk9BUkRfR1BJTykgfHwgZGVmaW5lZChDT05GSUdfS0VZQk9BUkRfR1BJT19NT0RVTEUpCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvYm9hcmRzL2dlbmVyaWNfYm9hcmQuYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9ib2FyZHMvZ2VuZXJpY19ib2FyZC5jCmluZGV4IDgyYjFmNmEuLjk4NmVlZWMgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9ib2FyZHMvZ2VuZXJpY19ib2FyZC5jCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9ib2FyZHMvZ2VuZXJpY19ib2FyZC5jCkBAIC03Miw2ICs3MiwzNSBAQAogfTsKICNlbmRpZgogCisjaWYgZGVmaW5lZChDT05GSUdfQkZJTl9TSVIpIHx8IGRlZmluZWQoQ09ORklHX0JGSU5fU0lSX01PRFVMRSkKKyNpZmRlZiBDT05GSUdfQkZJTl9TSVIwCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGJmaW5fc2lyMF9yZXNvdXJjZXNbXSA9IHsKKwl7CisJCS5zdGFydCA9IDB4RkZDMDA0MDAsCisJCS5lbmQgPSAweEZGQzAwNEZGLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCXsKKwkJLnN0YXJ0ID0gSVJRX1VBUlQwX1JYLAorCQkuZW5kID0gSVJRX1VBUlQwX1JYKzEsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJeworCQkuc3RhcnQgPSBDSF9VQVJUMF9SWCwKKwkJLmVuZCA9IENIX1VBUlQwX1JYKzEsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfRE1BLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX3NpcjBfZGV2aWNlID0geworCS5uYW1lID0gImJmaW5fc2lyIiwKKwkuaWQgPSAwLAorCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShiZmluX3NpcjBfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UgPSBiZmluX3NpcjBfcmVzb3VyY2VzLAorfTsKKyNlbmRpZgorI2VuZGlmCisKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpnZW5lcmljX2JvYXJkX2RldmljZXNbXSBfX2luaXRkYXRhID0gewogI2lmIGRlZmluZWQoQ09ORklHX1JUQ19EUlZfQkZJTikgfHwgZGVmaW5lZChDT05GSUdfUlRDX0RSVl9CRklOX01PRFVMRSkKIAkmcnRjX2RldmljZSwKQEAgLTgwLDYgKzEwOSwxMiBAQAogI2lmIGRlZmluZWQoQ09ORklHX1NNQzkxWCkgfHwgZGVmaW5lZChDT05GSUdfU01DOTFYX01PRFVMRSkKIAkmc21jOTF4X2RldmljZSwKICNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfQkZJTl9TSVIpIHx8IGRlZmluZWQoQ09ORklHX0JGSU5fU0lSX01PRFVMRSkKKyNpZmRlZiBDT05GSUdfQkZJTl9TSVIwCisJJmJmaW5fc2lyMF9kZXZpY2UsCisjZW5kaWYKKyNlbmRpZgogfTsKIAogc3RhdGljIGludCBfX2luaXQgZ2VuZXJpY19ib2FyZF9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvYm9hcmRzL2lwMHguYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9ib2FyZHMvaXAweC5jCmluZGV4IDU4NjQ4OTIuLmUzMGIxYjcgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9ib2FyZHMvaXAweC5jCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9ib2FyZHMvaXAweC5jCkBAIC0xOTcsMjMgKzE5NywzMyBAQAogI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19CRklOX1NJUikgfHwgZGVmaW5lZChDT05GSUdfQkZJTl9TSVJfTU9EVUxFKQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBiZmluX3Npcl9yZXNvdXJjZXNbXSA9IHsKICNpZmRlZiBDT05GSUdfQkZJTl9TSVIwCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGJmaW5fc2lyMF9yZXNvdXJjZXNbXSA9IHsKIAl7CiAJCS5zdGFydCA9IDB4RkZDMDA0MDAsCiAJCS5lbmQgPSAweEZGQzAwNEZGLAogCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKIAl9LAotI2VuZGlmCisJeworCQkuc3RhcnQgPSBJUlFfVUFSVDBfUlgsCisJCS5lbmQgPSBJUlFfVUFSVDBfUlgrMSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwl7CisJCS5zdGFydCA9IENIX1VBUlQwX1JYLAorCQkuZW5kID0gQ0hfVUFSVDBfUlgrMSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9ETUEsCisJfSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmaW5fc2lyX2RldmljZSA9IHsKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmaW5fc2lyMF9kZXZpY2UgPSB7CiAJLm5hbWUgPSAiYmZpbl9zaXIiLAogCS5pZCA9IDAsCi0JLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKGJmaW5fc2lyX3Jlc291cmNlcyksCi0JLnJlc291cmNlID0gYmZpbl9zaXJfcmVzb3VyY2VzLAorCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShiZmluX3NpcjBfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UgPSBiZmluX3NpcjBfcmVzb3VyY2VzLAogfTsKICNlbmRpZgorI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19VU0JfSVNQMTM2Ml9IQ0QpIHx8IGRlZmluZWQoQ09ORklHX1VTQl9JU1AxMzYyX0hDRF9NT0RVTEUpCiBzdGF0aWMgc3RydWN0IHJlc291cmNlIGlzcDEzNjJfaGNkX3Jlc291cmNlc1tdID0gewpAQCAtMjcyLDcgKzI4Miw5IEBACiAjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX0JGSU5fU0lSKSB8fCBkZWZpbmVkKENPTkZJR19CRklOX1NJUl9NT0RVTEUpCi0JJmJmaW5fc2lyX2RldmljZSwKKyNpZmRlZiBDT05GSUdfQkZJTl9TSVIwCisJJmJmaW5fc2lyMF9kZXZpY2UsCisjZW5kaWYKICNlbmRpZgogCiAjaWYgZGVmaW5lZChDT05GSUdfVVNCX0lTUDEzNjJfSENEKSB8fCBkZWZpbmVkKENPTkZJR19VU0JfSVNQMTM2Ml9IQ0RfTU9EVUxFKQpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2JvYXJkcy9zdGFtcC5jIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2JvYXJkcy9zdGFtcC5jCmluZGV4IDA1MGZmY2EuLjA3ZjlhZDEgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9ib2FyZHMvc3RhbXAuYworKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvYm9hcmRzL3N0YW1wLmMKQEAgLTQ5LDcgKzQ5LDcgQEAKIC8qCiAgKiBOYW1lIHRoZSBCb2FyZCBmb3IgdGhlIC9wcm9jL2NwdWluZm8KICAqLwotY29uc3QgY2hhciBiZmluX2JvYXJkX25hbWVbXSA9ICJBRERTLUJGNTMzLVNUQU1QIjsKK2NvbnN0IGNoYXIgYmZpbl9ib2FyZF9uYW1lW10gPSAiQURJIEJGNTMzLVNUQU1QIjsKIAogI2lmIGRlZmluZWQoQ09ORklHX1JUQ19EUlZfQkZJTikgfHwgZGVmaW5lZChDT05GSUdfUlRDX0RSVl9CRklOX01PRFVMRSkKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHJ0Y19kZXZpY2UgPSB7CkBAIC0xMTgsNyArMTE4LDcgQEAKIAkJLm9mZnNldCA9IDAsCiAJfSwgewogCQkubmFtZSAgID0gImxpbnV4IGtlcm5lbChub3IpIiwKLQkJLnNpemUgICA9IDB4RTAwMDAsCisJCS5zaXplICAgPSAweDE4MDAwMCwKIAkJLm9mZnNldCA9IE1URFBBUlRfT0ZTX0FQUEVORCwKIAl9LCB7CiAJCS5uYW1lICAgPSAiZmlsZSBzeXN0ZW0obm9yKSIsCkBAIC0xNjksNyArMTY5LDcgQEAKIAkJLm1hc2tfZmxhZ3MgPSBNVERfQ0FQX1JPTQogCX0sIHsKIAkJLm5hbWUgPSAibGludXgga2VybmVsKHNwaSkiLAotCQkuc2l6ZSA9IDB4ZTAwMDAsCisJCS5zaXplID0gMHgxODAwMDAsCiAJCS5vZmZzZXQgPSBNVERQQVJUX09GU19BUFBFTkQsCiAJfSwgewogCQkubmFtZSA9ICJmaWxlIHN5c3RlbShzcGkpIiwKQEAgLTIxNiwxMyArMjE2LDYgQEAKIH07CiAjZW5kaWYKIAotI2lmIGRlZmluZWQoQ09ORklHX1NQSV9NTUMpIHx8IGRlZmluZWQoQ09ORklHX1NQSV9NTUNfTU9EVUxFKQotc3RhdGljIHN0cnVjdCBiZmluNXh4X3NwaV9jaGlwIHNwaV9tbWNfY2hpcF9pbmZvID0gewotCS5lbmFibGVfZG1hID0gMSwKLQkuYml0c19wZXJfd29yZCA9IDgsCi19OwotI2VuZGlmCi0KICNpZiBkZWZpbmVkKENPTkZJR19TUElfU1BJREVWKSB8fCBkZWZpbmVkKENPTkZJR19TUElfU1BJREVWX01PRFVMRSkKIHN0YXRpYyBzdHJ1Y3QgYmZpbjV4eF9zcGlfY2hpcCBzcGlkZXZfY2hpcF9pbmZvID0gewogCS5lbmFibGVfZG1hID0gMCwKQEAgLTI2NSwyNyArMjU4LDYgQEAKIAl9LAogI2VuZGlmCiAKLSNpZiBkZWZpbmVkKENPTkZJR19TUElfTU1DKSB8fCBkZWZpbmVkKENPTkZJR19TUElfTU1DX01PRFVMRSkKLQl7Ci0JCS5tb2RhbGlhcyA9ICJzcGlfbW1jX2R1bW15IiwKLQkJLm1heF9zcGVlZF9oeiA9IDIwMDAwMDAwLCAgICAgLyogbWF4IHNwaSBjbG9jayAoU0NLKSBzcGVlZCBpbiBIWiAqLwotCQkuYnVzX251bSA9IDAsCi0JCS5jaGlwX3NlbGVjdCA9IDAsCi0JCS5wbGF0Zm9ybV9kYXRhID0gTlVMTCwKLQkJLmNvbnRyb2xsZXJfZGF0YSA9ICZzcGlfbW1jX2NoaXBfaW5mbywKLQkJLm1vZGUgPSBTUElfTU9ERV8zLAotCX0sCi0JewotCQkubW9kYWxpYXMgPSAic3BpX21tYyIsCi0JCS5tYXhfc3BlZWRfaHogPSAyMDAwMDAwMCwgICAgIC8qIG1heCBzcGkgY2xvY2sgKFNDSykgc3BlZWQgaW4gSFogKi8KLQkJLmJ1c19udW0gPSAwLAotCQkuY2hpcF9zZWxlY3QgPSBDT05GSUdfU1BJX01NQ19DU19DSEFOLAotCQkucGxhdGZvcm1fZGF0YSA9IE5VTEwsCi0JCS5jb250cm9sbGVyX2RhdGEgPSAmc3BpX21tY19jaGlwX2luZm8sCi0JCS5tb2RlID0gU1BJX01PREVfMywKLQl9LAotI2VuZGlmCi0KICNpZiBkZWZpbmVkKENPTkZJR19QQlgpCiAJewogCQkubW9kYWxpYXMgPSAiZnhzLXNwaSIsCkBAIC0zNzMsMjMgKzM0NSwzMyBAQAogI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19CRklOX1NJUikgfHwgZGVmaW5lZChDT05GSUdfQkZJTl9TSVJfTU9EVUxFKQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBiZmluX3Npcl9yZXNvdXJjZXNbXSA9IHsKICNpZmRlZiBDT05GSUdfQkZJTl9TSVIwCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGJmaW5fc2lyMF9yZXNvdXJjZXNbXSA9IHsKIAl7CiAJCS5zdGFydCA9IDB4RkZDMDA0MDAsCiAJCS5lbmQgPSAweEZGQzAwNEZGLAogCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKIAl9LAotI2VuZGlmCisJeworCQkuc3RhcnQgPSBJUlFfVUFSVDBfUlgsCisJCS5lbmQgPSBJUlFfVUFSVDBfUlgrMSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwl7CisJCS5zdGFydCA9IENIX1VBUlQwX1JYLAorCQkuZW5kID0gQ0hfVUFSVDBfUlgrMSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9ETUEsCisJfSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmaW5fc2lyX2RldmljZSA9IHsKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmaW5fc2lyMF9kZXZpY2UgPSB7CiAJLm5hbWUgPSAiYmZpbl9zaXIiLAogCS5pZCA9IDAsCi0JLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKGJmaW5fc2lyX3Jlc291cmNlcyksCi0JLnJlc291cmNlID0gYmZpbl9zaXJfcmVzb3VyY2VzLAorCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShiZmluX3NpcjBfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UgPSBiZmluX3NpcjBfcmVzb3VyY2VzLAogfTsKICNlbmRpZgorI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19TRVJJQUxfQkZJTl9TUE9SVCkgfHwgZGVmaW5lZChDT05GSUdfU0VSSUFMX0JGSU5fU1BPUlRfTU9EVUxFKQogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9zcG9ydDBfdWFydF9kZXZpY2UgPSB7CkBAIC01MzcsNyArNTE5LDkgQEAKICNlbmRpZgogCiAjaWYgZGVmaW5lZChDT05GSUdfQkZJTl9TSVIpIHx8IGRlZmluZWQoQ09ORklHX0JGSU5fU0lSX01PRFVMRSkKLQkmYmZpbl9zaXJfZGV2aWNlLAorI2lmZGVmIENPTkZJR19CRklOX1NJUjAKKwkmYmZpbl9zaXIwX2RldmljZSwKKyNlbmRpZgogI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19TRVJJQUxfQkZJTl9TUE9SVCkgfHwgZGVmaW5lZChDT05GSUdfU0VSSUFMX0JGSU5fU1BPUlRfTU9EVUxFKQpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2RtYS5jIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2RtYS5jCmluZGV4IDI4NjU1YzEuLjBhNmViOGYgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9kbWEuYworKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvZG1hLmMKQEAgLTMxLDcgKzMxLDcgQEAKICNpbmNsdWRlIDxhc20vYmxhY2tmaW4uaD4KICNpbmNsdWRlIDxhc20vZG1hLmg+CiAKLXN0cnVjdCBkbWFfcmVnaXN0ZXIgKmRtYV9pb19iYXNlX2FkZHJbTUFYX0JMQUNLRklOX0RNQV9DSEFOTkVMXSA9IHsKK3N0cnVjdCBkbWFfcmVnaXN0ZXIgKmRtYV9pb19iYXNlX2FkZHJbTUFYX0RNQV9DSEFOTkVMU10gPSB7CiAJKHN0cnVjdCBkbWFfcmVnaXN0ZXIgKikgRE1BMF9ORVhUX0RFU0NfUFRSLAogCShzdHJ1Y3QgZG1hX3JlZ2lzdGVyICopIERNQTFfTkVYVF9ERVNDX1BUUiwKIAkoc3RydWN0IGRtYV9yZWdpc3RlciAqKSBETUEyX05FWFRfREVTQ19QVFIsCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvaGVhZC5TIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2hlYWQuUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWZjOTVhYS4uMDAwMDAwMAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvaGVhZC5TCisrKyAvZGV2L251bGwKQEAgLTEsMTM3ICswLDAgQEAKLS8qCi0gKiBGaWxlOiAgICAgICAgIGFyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9oZWFkLlMKLSAqIEJhc2VkIG9uOgotICogQXV0aG9yOiAgICAgICBKZWZmIERpb25uZSA8amVmZkB1Y2xpbnV4Lm9yZz4gQ09QWVJJR0hUIDE5OTggRC4gSmVmZiBEaW9ubmUKLSAqCi0gKiBDcmVhdGVkOiAgICAgIDE5OTgKLSAqIERlc2NyaXB0aW9uOiAgYmY1MzMgc3RhcnR1cCBmaWxlCi0gKgotICogTW9kaWZpZWQ6Ci0gKiAgICAgICAgICAgICAgIENvcHlyaWdodCAyMDA0LTIwMDYgQW5hbG9nIERldmljZXMgSW5jLgotICoKLSAqIEJ1Z3M6ICAgICAgICAgRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgdGhlIGZpbGUgQ09QWUlORywgb3Igd3JpdGUKLSAqIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotICovCi0KLSNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGFzbS9ibGFja2Zpbi5oPgotI2lmZGVmIENPTkZJR19CRklOX0tFUk5FTF9DTE9DSwotI2luY2x1ZGUgPGFzbS9jbG9ja3MuaD4KLSNpbmNsdWRlIDxtYWNoL21lbV9pbml0Lmg+Ci0jZW5kaWYKLQotLnNlY3Rpb24gLmwxLnRleHQKLSNpZmRlZiBDT05GSUdfQkZJTl9LRVJORUxfQ0xPQ0sKLUVOVFJZKF9zdGFydF9kbWFfY29kZSkKLQlwMC5oID0gaGkoU0lDX0lXUik7Ci0JcDAubCA9IGxvKFNJQ19JV1IpOwotCXIwLmwgPSAweDE7Ci0JcjAuaCA9IDB4MDsKLQlbcDBdID0gcjA7Ci0JU1NZTkM7Ci0KLQkvKgotCSAqICBTZXQgUExMX0NUTAotCSAqICAgLSBbMTQ6MDldID0gTVNFTFs1OjBdIDogQ0xLSU4gLyBWQ08gbXVsdGlwbGljYXRpb24gZmFjdG9ycwotCSAqICAgLSBbOF0gICAgID0gQllQQVNTICAgIDogQllQQVNTIHRoZSBQTEwsIHJ1biBDTEtJTiBpbnRvIENDTEsvU0NMSwotCSAqICAgLSBbN10gICAgID0gb3V0cHV0IGRlbGF5IChhZGQgMjAwcHMgb2YgZGVsYXkgdG8gbWVtIHNpZ25hbHMpCi0JICogICAtIFs2XSAgICAgPSBpbnB1dCBkZWxheSAoYWRkIDIwMHBzIG9mIGlucHV0IGRlbGF5IHRvIG1lbSBzaWduYWxzKQotCSAqICAgLSBbNV0gICAgID0gUERXTiAgICAgIDogMT1BbGwgQ2xvY2tzIG9mZgotCSAqICAgLSBbM10gICAgID0gU1RPUENLICAgIDogMT1Db3JlIENsb2NrIG9mZgotCSAqICAgLSBbMV0gICAgID0gUExMX09GRiAgIDogMT1EaXNhYmxlIFBvd2VyIHRvIFBMTAotCSAqICAgLSBbMF0gICAgID0gREYgICAgICAgIDogMT1QYXNzIENMS0lOLzIgdG8gUExMIC8gMD1QYXNzIENMS0lOIHRvIFBMTAotCSAqICAgYWxsIG90aGVyIGJpdHMgc2V0IHRvIHplcm8KLQkgKi8KLQotCXAwLmggPSBoaShQTExfTE9DS0NOVCk7Ci0JcDAubCA9IGxvKFBMTF9MT0NLQ05UKTsKLQlyMCA9IDB4MzAwKFopOwotCXdbcDBdID0gcjAubDsKLQlzc3luYzsKLQotCVAyLkggPSBoaShFQklVX1NER0NUTCk7Ci0JUDIuTCA9IGxvKEVCSVVfU0RHQ1RMKTsKLQlSMCA9IFtQMl07Ci0JQklUU0VUIChSMCwgMjQpOwotCVtQMl0gPSBSMDsKLQlTU1lOQzsKLQotCXIwID0gQ09ORklHX1ZDT19NVUxUICYgNjM7ICAgICAgIC8qIExvYWQgdGhlIFZDTyBtdWx0aXBsaWVyICAgICAgICAgKi8KLQlyMCA9IHIwIDw8IDk7ICAgICAgICAgICAgICAgICAgICAvKiBTaGlmdCBpdCBvdmVyLCAgICAgICAgICAgICAgICAgICovCi0JcjEgPSBDTEtJTl9IQUxGOyAgICAgICAgICAgICAgICAgLyogRG8gd2UgbmVlZCB0byBkaXZpZGUgQ0xLSU4gYnkgMj8qLwotCXIwID0gcjEgfCByMDsKLQlyMSA9IFBMTF9CWVBBU1M7ICAgICAgICAgICAgICAgICAvKiBCeXBhc3MgdGhlIFBMTD8gICAgICAgICAgICAgICAgICovCi0JcjEgPSByMSA8PCA4OyAgICAgICAgICAgICAgICAgICAgLyogU2hpZnQgaXQgb3ZlciAgICAgICAgICAgICAgICAgICAqLwotCXIwID0gcjEgfCByMDsgICAgICAgICAgICAgICAgICAgIC8qIGFkZCB0aGVtIGFsbCB0b2dldGhlciAgICAgICAgICAgKi8KLSNpZmRlZiBBTk9NQUxZXzA1MDAwMjY1Ci0JQklUU0VUKHIwLCAxNSk7ICAgICAgICAgICAgICAgICAgLyogQWRkIDI1MCBtViBvZiBoeXN0ZXJlc2lzIHRvIFNQT1JUIGlucHV0IHBpbnMgKi8KLSNlbmRpZgotCi0JcDAuaCA9IGhpKFBMTF9DVEwpOwotCXAwLmwgPSBsbyhQTExfQ1RMKTsgICAgICAgICAgICAgIC8qIExvYWQgdGhlIGFkZHJlc3MgICAgICAgICAgICAgICAgKi8KLQljbGkgcjI7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEaXNhYmxlIGludGVycnVwdHMgICAgICAgICAgICAgICovCi0Jc3N5bmM7Ci0Jd1twMF0gPSByMC5sOyAgICAgICAgICAgICAgICAgICAgLyogU2V0IHRoZSB2YWx1ZSAgICAgICAgICAgICAgICAgICAqLwotCWlkbGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFdhaXQgZm9yIHRoZSBQTEwgdG8gc3RhYmxpemUgICAgKi8KLQlzdGkgcjI7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBFbmFibGUgaW50ZXJydXB0cyAgICAgICAgICAgICAgICovCi0KLS5MY2hlY2tfYWdhaW46Ci0JcDAuaCA9IGhpKFBMTF9TVEFUKTsKLQlwMC5sID0gbG8oUExMX1NUQVQpOwotCVIwID0gV1tQMF0oWik7Ci0JQ0MgPSBCSVRUU1QoUjAsNSk7Ci0JaWYgISBDQyBqdW1wIC5MY2hlY2tfYWdhaW47Ci0KLQkvKiBDb25maWd1cmUgU0NMSyAmIENDTEsgRGl2aWRlcnMgKi8KLQlyMCA9IChDT05GSUdfQ0NMS19BQ1RfRElWIHwgQ09ORklHX1NDTEtfRElWKTsKLQlwMC5oID0gaGkoUExMX0RJVik7Ci0JcDAubCA9IGxvKFBMTF9ESVYpOwotCXdbcDBdID0gcjAubDsKLQlzc3luYzsKLQotCXAwLmwgPSBsbyhFQklVX1NEUlJDKTsKLQlwMC5oID0gaGkoRUJJVV9TRFJSQyk7Ci0JcjAgPSBtZW1fU0RSUkM7Ci0Jd1twMF0gPSByMC5sOwotCXNzeW5jOwotCi0JUDIuSCA9IGhpKEVCSVVfU0RHQ1RMKTsKLQlQMi5MID0gbG8oRUJJVV9TREdDVEwpOwotCVIwID0gW1AyXTsKLQlCSVRDTFIgKFIwLCAyNCk7Ci0JcDAuaCA9IGhpKEVCSVVfU0RTVEFUKTsKLQlwMC5sID0gbG8oRUJJVV9TRFNUQVQpOwotCXIyLmwgPSB3W3AwXTsKLQljYyA9IGJpdHRzdChyMiwzKTsKLQlpZiAhY2MganVtcCAuTHNraXA7Ci0JTk9QOwotCUJJVFNFVCAoUjAsIDIzKTsKLS5Mc2tpcDoKLQlbUDJdID0gUjA7Ci0JU1NZTkM7Ci0KLQlSMC5MID0gbG8obWVtX1NER0NUTCk7Ci0JUjAuSCA9IGhpKG1lbV9TREdDVEwpOwotCVIxID0gW3AyXTsKLQlSMSA9IFIxIHwgUjA7Ci0JW1AyXSA9IFIxOwotCVNTWU5DOwotCi0JUlRTOwotRU5EUFJPQyhfc3RhcnRfZG1hX2NvZGUpCi0jZW5kaWYgLyogQ09ORklHX0JGSU5fS0VSTkVMX0NMT0NLICovCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvaW5jbHVkZS9tYWNoL2Fub21hbHkuaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9pbmNsdWRlL21hY2gvYW5vbWFseS5oCmluZGV4IGY1NDRmYzUuLjBkM2EwMzQgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9pbmNsdWRlL21hY2gvYW5vbWFseS5oCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9pbmNsdWRlL21hY2gvYW5vbWFseS5oCkBAIC03LDcgKzcsNyBAQAogICovCiAKIC8qIFRoaXMgZmlsZSBzaG91bGUgYmUgdXAgdG8gZGF0ZSB3aXRoOgotICogIC0gUmV2aXNpb24gRCwgMDYvMTgvMjAwODsgQURTUC1CRjUzMS9CRjUzMi9CRjUzMyBCbGFja2ZpbiBQcm9jZXNzb3IgQW5vbWFseSBMaXN0CisgKiAgLSBSZXZpc2lvbiBFLCAwOS8xOC8yMDA4OyBBRFNQLUJGNTMxL0JGNTMyL0JGNTMzIEJsYWNrZmluIFByb2Nlc3NvciBBbm9tYWx5IExpc3QKICAqLwogCiAjaWZuZGVmIF9NQUNIX0FOT01BTFlfSF8KQEAgLTE5NCw2ICsxOTQsMTIgQEAKICNkZWZpbmUgQU5PTUFMWV8wNTAwMDQwMyAoMSkKIC8qIFNwZWN1bGF0aXZlIEZldGNoZXMgQ2FuIENhdXNlIFVuZGVzaXJlZCBFeHRlcm5hbCBGSUZPIE9wZXJhdGlvbnMgKi8KICNkZWZpbmUgQU5PTUFMWV8wNTAwMDQxNiAoMSkKKy8qIE11bHRpY2hhbm5lbCBTUE9SVCBDaGFubmVsIE1pc2FsaWdubWVudCBVbmRlciBTcGVjaWZpYyBDb25maWd1cmF0aW9uICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDA0MjUgKDEpCisvKiBTcGVjdWxhdGl2ZSBGZXRjaGVzIG9mIEluZGlyZWN0LVBvaW50ZXIgSW5zdHJ1Y3Rpb25zIENhbiBDYXVzZSBGYWxzZSBIYXJkd2FyZSBFcnJvcnMgKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDQyNiAoMSkKKy8qIElGTFVTSCBJbnN0cnVjdGlvbiBhdCBFbmQgb2YgSGFyZHdhcmUgTG9vcCBDYXVzZXMgSW5maW5pdGUgU3RhbGwgKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDQ0MyAoMSkKIAogLyogVGhlc2UgYW5vbWFsaWVzIGhhdmUgYmVlbiAicGhhc2VkIiBvdXQgb2YgYW5hbG9nLmNvbSBhbm9tYWx5IHNoZWV0cyBhbmQgYXJlCiAgKiBoZXJlIHRvIHNob3cgcnVubmluZyBvbiBvbGRlciBzaWxpY29uIGp1c3QgaXNuJ3QgZmVhc2libGUuCkBAIC0yNzMsNSArMjc5LDggQEAKICNkZWZpbmUgQU5PTUFMWV8wNTAwMDMyMyAoMCkKICNkZWZpbmUgQU5PTUFMWV8wNTAwMDM1MyAoMSkKICNkZWZpbmUgQU5PTUFMWV8wNTAwMDM4NiAoMSkKKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDQxMiAoMCkKKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDQzMiAoMCkKKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDQzNSAoMCkKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvaW5jbHVkZS9tYWNoL2JmNTMzLmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvaW5jbHVkZS9tYWNoL2JmNTMzLmgKaW5kZXggZGZjOGMxYS4uY2Y0NDI3YyAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2luY2x1ZGUvbWFjaC9iZjUzMy5oCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9pbmNsdWRlL21hY2gvYmY1MzMuaApAQCAtMTQ1LDcgKzE0NSw3IEBACiAjZW5kaWYKICNpZmRlZiBDT05GSUdfQkY1MzIKICNkZWZpbmUgQ1BVICJCRjUzMiIKLSNkZWZpbmUgQ1BVSUQgMHgyNzVBCisjZGVmaW5lIENQVUlEIDB4MjdhNQogI2VuZGlmCiAjaWZkZWYgQ09ORklHX0JGNTMxCiAjZGVmaW5lIENQVSAiQkY1MzEiCkBAIC0xNTMsNyArMTUzLDcgQEAKICNlbmRpZgogCiAjaWZuZGVmIENQVQotI2Vycm9yIFVua25vd24gQ1BVIHR5cGUgLSBUaGlzIGtlcm5lbCBkb2Vzbid0IHNlZW0gdG8gYmUgY29uZmlndXJlZCBwcm9wZXJseQorI2Vycm9yICJVbmtub3duIENQVSB0eXBlIC0gVGhpcyBrZXJuZWwgZG9lc24ndCBzZWVtIHRvIGJlIGNvbmZpZ3VyZWQgcHJvcGVybHkiCiAjZW5kaWYKIAogI2VuZGlmCQkJCS8qIF9fTUFDSF9CRjUzM19IX18gICovCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvaW5jbHVkZS9tYWNoL2JmaW5fc2lyLmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvaW5jbHVkZS9tYWNoL2JmaW5fc2lyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliYjg3ZTkuLjAwMDAwMDAKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2luY2x1ZGUvbWFjaC9iZmluX3Npci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qCi0gKiBCbGFja2ZpbiBJbmZyYS1yZWQgRHJpdmVyCi0gKgotICogQ29weXJpZ2h0IDIwMDYtMjAwOCBBbmFsb2cgRGV2aWNlcyBJbmMuCi0gKgotICogRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgotICoKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvc2VyaWFsLmg+Ci0jaW5jbHVkZSA8YXNtL2RtYS5oPgotI2luY2x1ZGUgPGFzbS9wb3J0bXV4Lmg+Ci0KLSNkZWZpbmUgU0lSX1VBUlRfR0VUX0NIQVIocG9ydCkgICBiZmluX3JlYWQxNigocG9ydCktPm1lbWJhc2UgKyBPRkZTRVRfUkJSKQotI2RlZmluZSBTSVJfVUFSVF9HRVRfRExMKHBvcnQpICAgIGJmaW5fcmVhZDE2KChwb3J0KS0+bWVtYmFzZSArIE9GRlNFVF9ETEwpCi0jZGVmaW5lIFNJUl9VQVJUX0dFVF9JRVIocG9ydCkgICAgYmZpbl9yZWFkMTYoKHBvcnQpLT5tZW1iYXNlICsgT0ZGU0VUX0lFUikKLSNkZWZpbmUgU0lSX1VBUlRfR0VUX0RMSChwb3J0KSAgICBiZmluX3JlYWQxNigocG9ydCktPm1lbWJhc2UgKyBPRkZTRVRfRExIKQotI2RlZmluZSBTSVJfVUFSVF9HRVRfSUlSKHBvcnQpICAgIGJmaW5fcmVhZDE2KChwb3J0KS0+bWVtYmFzZSArIE9GRlNFVF9JSVIpCi0jZGVmaW5lIFNJUl9VQVJUX0dFVF9MQ1IocG9ydCkgICAgYmZpbl9yZWFkMTYoKHBvcnQpLT5tZW1iYXNlICsgT0ZGU0VUX0xDUikKLSNkZWZpbmUgU0lSX1VBUlRfR0VUX0dDVEwocG9ydCkgICBiZmluX3JlYWQxNigocG9ydCktPm1lbWJhc2UgKyBPRkZTRVRfR0NUTCkKLQotI2RlZmluZSBTSVJfVUFSVF9QVVRfQ0hBUihwb3J0LCB2KSBiZmluX3dyaXRlMTYoKChwb3J0KS0+bWVtYmFzZSArIE9GRlNFVF9USFIpLCB2KQotI2RlZmluZSBTSVJfVUFSVF9QVVRfRExMKHBvcnQsIHYpICBiZmluX3dyaXRlMTYoKChwb3J0KS0+bWVtYmFzZSArIE9GRlNFVF9ETEwpLCB2KQotI2RlZmluZSBTSVJfVUFSVF9QVVRfSUVSKHBvcnQsIHYpICBiZmluX3dyaXRlMTYoKChwb3J0KS0+bWVtYmFzZSArIE9GRlNFVF9JRVIpLCB2KQotI2RlZmluZSBTSVJfVUFSVF9QVVRfRExIKHBvcnQsIHYpICBiZmluX3dyaXRlMTYoKChwb3J0KS0+bWVtYmFzZSArIE9GRlNFVF9ETEgpLCB2KQotI2RlZmluZSBTSVJfVUFSVF9QVVRfTENSKHBvcnQsIHYpICBiZmluX3dyaXRlMTYoKChwb3J0KS0+bWVtYmFzZSArIE9GRlNFVF9MQ1IpLCB2KQotI2RlZmluZSBTSVJfVUFSVF9QVVRfR0NUTChwb3J0LCB2KSBiZmluX3dyaXRlMTYoKChwb3J0KS0+bWVtYmFzZSArIE9GRlNFVF9HQ1RMKSwgdikKLQotI2lmZGVmIENPTkZJR19TSVJfQkZJTl9ETUEKLXN0cnVjdCBkbWFfcnhfYnVmIHsKLQljaGFyICpidWY7Ci0JaW50IGhlYWQ7Ci0JaW50IHRhaWw7Ci0JfTsKLSNlbmRpZiAvKiBDT05GSUdfU0lSX0JGSU5fRE1BICovCi0KLXN0cnVjdCBiZmluX3Npcl9wb3J0IHsKLQl1bnNpZ25lZCBjaGFyIF9faW9tZW0gICAqbWVtYmFzZTsKLQl1bnNpZ25lZCBpbnQgICAgICAgICAgICBpcnE7Ci0JdW5zaWduZWQgaW50ICAgICAgICAgICAgbHNyOwotCXVuc2lnbmVkIGxvbmcgICAgICAgICAgIGNsazsKLQlzdHJ1Y3QgbmV0X2RldmljZSAgICAgICAqZGV2OwotI2lmZGVmIENPTkZJR19TSVJfQkZJTl9ETUEKLQlpbnQgICAgICAgICAgICAgICAgICAgICB0eF9kb25lOwotCXN0cnVjdCBkbWFfcnhfYnVmICAgICAgIHJ4X2RtYV9idWY7Ci0Jc3RydWN0IHRpbWVyX2xpc3QgICAgICAgcnhfZG1hX3RpbWVyOwotCWludCAgICAgICAgICAgICAgICAgICAgIHJ4X2RtYV9ucm93czsKLSNlbmRpZiAvKiBDT05GSUdfU0lSX0JGSU5fRE1BICovCi0JdW5zaWduZWQgaW50ICAgICAgICAgICAgdHhfZG1hX2NoYW5uZWw7Ci0JdW5zaWduZWQgaW50ICAgICAgICAgICAgcnhfZG1hX2NoYW5uZWw7Ci19OwotCi1zdHJ1Y3QgYmZpbl9zaXJfcG9ydCBzaXJfcG9ydHNbQkZJTl9VQVJUX05SX1BPUlRTXTsKLQotc3RydWN0IGJmaW5fc2lyX3BvcnRfcmVzIHsKLQl1bnNpZ25lZCBsb25nICAgYmFzZV9hZGRyOwotCWludCAgICAgICAgICAgICBpcnE7Ci0JdW5zaWduZWQgaW50ICAgIHJ4X2RtYV9jaGFubmVsOwotCXVuc2lnbmVkIGludCAgICB0eF9kbWFfY2hhbm5lbDsKLX07Ci0KLXN0cnVjdCBiZmluX3Npcl9wb3J0X3JlcyBiZmluX3Npcl9wb3J0X3Jlc291cmNlW10gPSB7Ci0jaWZkZWYgQ09ORklHX0JGSU5fU0lSMAotCXsKLQkweEZGQzAwNDAwLAotCUlSUV9VQVJUX1JYLAotCUNIX1VBUlRfUlgsCi0JQ0hfVUFSVF9UWCwKLQl9LAotI2VuZGlmCi19OwotCi1pbnQgbnJfc2lycyA9IEFSUkFZX1NJWkUoYmZpbl9zaXJfcG9ydF9yZXNvdXJjZSk7Ci0KLXN0cnVjdCBiZmluX3Npcl9zZWxmIHsKLQlzdHJ1Y3QgYmZpbl9zaXJfcG9ydCAgICAqc2lyX3BvcnQ7Ci0Jc3BpbmxvY2tfdCAgICAgICAgICAgICAgbG9jazsKLQl1bnNpZ25lZCBpbnQgICAgICAgICAgICBvcGVuOwotCWludCAgICAgICAgICAgICAgICAgICAgIHNwZWVkOwotCWludCAgICAgICAgICAgICAgICAgICAgIG5ld3NwZWVkOwotCi0Jc3RydWN0IHNrX2J1ZmYgICAgICAgICAgKnR4c2tiOwotCXN0cnVjdCBza19idWZmICAgICAgICAgICpyeHNrYjsKLQlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKLQlzdHJ1Y3QgZGV2aWNlICAgICAgICAgICAqZGV2OwotCXN0cnVjdCBpcmxhcF9jYiAgICAgICAgICppcmxhcDsKLQlzdHJ1Y3QgcW9zX2luZm8gICAgICAgICBxb3M7Ci0KLQlpb2J1ZmZfdCAgICAgICAgICAgICAgICB0eF9idWZmOwotCWlvYnVmZl90ICAgICAgICAgICAgICAgIHJ4X2J1ZmY7Ci0KLQlzdHJ1Y3Qgd29ya19zdHJ1Y3QgICAgICB3b3JrOwotCWludCAgICAgICAgICAgICAgICAgICAgIG10dDsKLX07Ci0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IFNJUl9VQVJUX0dFVF9MU1Ioc3RydWN0IGJmaW5fc2lyX3BvcnQgKnBvcnQpCi17Ci0JdW5zaWduZWQgaW50IGxzciA9IGJmaW5fcmVhZDE2KHBvcnQtPm1lbWJhc2UgKyBPRkZTRVRfTFNSKTsKLQlwb3J0LT5sc3IgfD0gKGxzciAmIChCSXxGRXxQRXxPRSkpOwotCXJldHVybiBsc3IgfCBwb3J0LT5sc3I7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBTSVJfVUFSVF9DTEVBUl9MU1Ioc3RydWN0IGJmaW5fc2lyX3BvcnQgKnBvcnQpCi17Ci0JcG9ydC0+bHNyID0gMDsKLQliZmluX3JlYWQxNihwb3J0LT5tZW1iYXNlICsgT0ZGU0VUX0xTUik7Ci19Ci0KLSNkZWZpbmUgRFJJVkVSX05BTUUgImJmaW5fc2lyIgotCi1zdGF0aWMgaW50IGJmaW5fc2lyX2h3X2luaXQodm9pZCkKLXsKLQlpbnQgcmV0ID0gLUVOT0RFVjsKLSNpZmRlZiBDT05GSUdfQkZJTl9TSVIwCi0JcmV0ID0gcGVyaXBoZXJhbF9yZXF1ZXN0KFBfVUFSVDBfVFgsIERSSVZFUl9OQU1FKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCXJldCA9IHBlcmlwaGVyYWxfcmVxdWVzdChQX1VBUlQwX1JYLCBEUklWRVJfTkFNRSk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLSNlbmRpZgotCXJldHVybiByZXQ7Ci19CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvaW5jbHVkZS9tYWNoL2JsYWNrZmluLmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvaW5jbHVkZS9tYWNoL2JsYWNrZmluLmgKaW5kZXggZDgwOTcxYi4uMDQ1MTg0ZiAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2luY2x1ZGUvbWFjaC9ibGFja2Zpbi5oCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9pbmNsdWRlL21hY2gvYmxhY2tmaW4uaApAQCAtNDQsNiArNDQsMTMgQEAKIAogI2RlZmluZSBCRklOX1VBUlRfTlJfUE9SVFMgICAgICAxCiAKKyNkZWZpbmUgQ0hfVUFSVF9SWCBDSF9VQVJUMF9SWAorI2RlZmluZSBDSF9VQVJUX1RYIENIX1VBUlQwX1RYCisKKyNkZWZpbmUgSVJRX1VBUlRfRVJST1IgSVJRX1VBUlQwX0VSUk9SCisjZGVmaW5lIElSUV9VQVJUX1JYICAgIElSUV9VQVJUMF9SWAorI2RlZmluZSBJUlFfVUFSVF9UWCAgICBJUlFfVUFSVDBfVFgKKwogI2RlZmluZSBPRkZTRVRfVEhSICAgICAgICAgICAgICAweDAwCS8qIFRyYW5zbWl0IEhvbGRpbmcgcmVnaXN0ZXIgICAgICAgICAgICAqLwogI2RlZmluZSBPRkZTRVRfUkJSICAgICAgICAgICAgICAweDAwCS8qIFJlY2VpdmUgQnVmZmVyIHJlZ2lzdGVyICAgICAgICAgICAgICAqLwogI2RlZmluZSBPRkZTRVRfRExMICAgICAgICAgICAgICAweDAwCS8qIERpdmlzb3IgTGF0Y2ggKExvdy1CeXRlKSAgICAgICAgICAgICAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2luY2x1ZGUvbWFjaC9jZGVmQkY1MzIuaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9pbmNsdWRlL21hY2gvY2RlZkJGNTMyLmgKaW5kZXggM2Q4OTc4YS4uYmJjM2M4MyAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2luY2x1ZGUvbWFjaC9jZGVmQkY1MzIuaAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvaW5jbHVkZS9tYWNoL2NkZWZCRjUzMi5oCkBAIC0zOSwzMSArMzksOCBAQAogLyppbmNsdWRlIGNvcmUgc3BlY2lmaWMgcmVnaXN0ZXIgcG9pbnRlciBkZWZpbml0aW9ucyovCiAjaW5jbHVkZSA8YXNtL2NkZWZfTFBCbGFja2Zpbi5oPgogCi0jaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgotCiAvKiBDbG9jayBhbmQgU3lzdGVtIENvbnRyb2wgKDB4RkZDMCAwNDAwLTB4RkZDMCAwN0ZGKSAqLwogI2RlZmluZSBiZmluX3JlYWRfUExMX0NUTCgpICAgICAgICAgICAgICAgICAgYmZpbl9yZWFkMTYoUExMX0NUTCkKLS8qIFdyaXRpbmcgdG8gUExMX0NUTCBpbml0aWF0ZXMgYSBQTEwgcmVsb2NrIHNlcXVlbmNlLiAqLwotc3RhdGljIF9faW5saW5lX18gdm9pZCBiZmluX3dyaXRlX1BMTF9DVEwodW5zaWduZWQgaW50IHZhbCkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzLCBpd3I7Ci0KLQlpZiAodmFsID09IGJmaW5fcmVhZF9QTExfQ1RMKCkpCi0JCXJldHVybjsKLQotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQkvKiBFbmFibGUgdGhlIFBMTCBXYWtldXAgYml0IGluIFNJQyBJV1IgKi8KLQlpd3IgPSBiZmluX3JlYWQzMihTSUNfSVdSKTsKLQkvKiBPbmx5IGFsbG93IFBQTCBXYWtldXApICovCi0JYmZpbl93cml0ZTMyKFNJQ19JV1IsIElXUl9FTkFCTEUoMCkpOwotCi0JYmZpbl93cml0ZTE2KFBMTF9DVEwsIHZhbCk7Ci0JU1NZTkMoKTsKLQlhc20oIklETEU7Iik7Ci0KLQliZmluX3dyaXRlMzIoU0lDX0lXUiwgaXdyKTsKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci19CiAjZGVmaW5lIGJmaW5fcmVhZF9QTExfU1RBVCgpICAgICAgICAgICAgICAgICBiZmluX3JlYWQxNihQTExfU1RBVCkKICNkZWZpbmUgYmZpbl93cml0ZV9QTExfU1RBVCh2YWwpICAgICAgICAgICAgIGJmaW5fd3JpdGUxNihQTExfU1RBVCx2YWwpCiAjZGVmaW5lIGJmaW5fcmVhZF9QTExfTE9DS0NOVCgpICAgICAgICAgICAgICBiZmluX3JlYWQxNihQTExfTE9DS0NOVCkKQEAgLTcyLDI3ICs0OSw2IEBACiAjZGVmaW5lIGJmaW5fcmVhZF9QTExfRElWKCkgICAgICAgICAgICAgICAgICBiZmluX3JlYWQxNihQTExfRElWKQogI2RlZmluZSBiZmluX3dyaXRlX1BMTF9ESVYodmFsKSAgICAgICAgICAgICAgYmZpbl93cml0ZTE2KFBMTF9ESVYsdmFsKQogI2RlZmluZSBiZmluX3JlYWRfVlJfQ1RMKCkgICAgICAgICAgICAgICAgICAgYmZpbl9yZWFkMTYoVlJfQ1RMKQotLyogV3JpdGluZyB0byBWUl9DVEwgaW5pdGlhdGVzIGEgUExMIHJlbG9jayBzZXF1ZW5jZS4gKi8KLXN0YXRpYyBfX2lubGluZV9fIHZvaWQgYmZpbl93cml0ZV9WUl9DVEwodW5zaWduZWQgaW50IHZhbCkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzLCBpd3I7Ci0KLQlpZiAodmFsID09IGJmaW5fcmVhZF9WUl9DVEwoKSkKLQkJcmV0dXJuOwotCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCS8qIEVuYWJsZSB0aGUgUExMIFdha2V1cCBiaXQgaW4gU0lDIElXUiAqLwotCWl3ciA9IGJmaW5fcmVhZDMyKFNJQ19JV1IpOwotCS8qIE9ubHkgYWxsb3cgUFBMIFdha2V1cCkgKi8KLQliZmluX3dyaXRlMzIoU0lDX0lXUiwgSVdSX0VOQUJMRSgwKSk7Ci0KLQliZmluX3dyaXRlMTYoVlJfQ1RMLCB2YWwpOwotCVNTWU5DKCk7Ci0JYXNtKCJJRExFOyIpOwotCi0JYmZpbl93cml0ZTMyKFNJQ19JV1IsIGl3cik7Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotfQogCiAvKiBTeXN0ZW0gSW50ZXJydXB0IENvbnRyb2xsZXIgKDB4RkZDMCAwQzAwLTB4RkZDMCAwRkZGKSAqLwogI2RlZmluZSBiZmluX3JlYWRfU1dSU1QoKSAgICAgICAgICAgICAgICAgICAgYmZpbl9yZWFkMTYoU1dSU1QpCkBAIC0xNzgsNTAgKzEzNCw2IEBACiAjZGVmaW5lIGJmaW5fcmVhZF9GSU9fTUFTS0JfVCgpICAgICAgICAgICAgICBiZmluX3JlYWQxNihGSU9fTUFTS0JfVCkKICNkZWZpbmUgYmZpbl93cml0ZV9GSU9fTUFTS0JfVCh2YWwpICAgICAgICAgIGJmaW5fd3JpdGUxNihGSU9fTUFTS0JfVCx2YWwpCiAKLQotI2lmIEFOT01BTFlfMDUwMDAzMTEKLSNkZWZpbmUgQkZJTl9XUklURV9GSU9fRkxBRyhuYW1lKSBcCi1zdGF0aWMgX19pbmxpbmVfXyB2b2lkIGJmaW5fd3JpdGVfRklPX0ZMQUdfICMjIG5hbWUgKHVuc2lnbmVkIHNob3J0IHZhbClcCi17XAotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7XAotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTtcCi0JYmZpbl93cml0ZTE2KEZJT19GTEFHXyAjIyBuYW1lLHZhbCk7XAotCWJmaW5fcmVhZF9DSElQSUQoKTtcCi0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpO1wKLX0KLUJGSU5fV1JJVEVfRklPX0ZMQUcoRCkKLUJGSU5fV1JJVEVfRklPX0ZMQUcoQykKLUJGSU5fV1JJVEVfRklPX0ZMQUcoUykKLUJGSU5fV1JJVEVfRklPX0ZMQUcoVCkKLQotI2RlZmluZSBCRklOX1JFQURfRklPX0ZMQUcobmFtZSkgXAotc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgc2hvcnQgYmZpbl9yZWFkX0ZJT19GTEFHXyAjIyBuYW1lICh2b2lkKVwKLXtcCi0JdW5zaWduZWQgbG9uZyBmbGFncztcCi0JdW5zaWduZWQgc2hvcnQgcmV0O1wKLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7XAotCXJldCA9IGJmaW5fcmVhZDE2KEZJT19GTEFHXyAjIyBuYW1lKTtcCi0JYmZpbl9yZWFkX0NISVBJRCgpO1wKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7XAotCXJldHVybiByZXQ7XAotfQotQkZJTl9SRUFEX0ZJT19GTEFHKEQpCi1CRklOX1JFQURfRklPX0ZMQUcoQykKLUJGSU5fUkVBRF9GSU9fRkxBRyhTKQotQkZJTl9SRUFEX0ZJT19GTEFHKFQpCi0KLSNlbHNlCi0jZGVmaW5lIGJmaW5fd3JpdGVfRklPX0ZMQUdfRCh2YWwpICAgICAgICAgICBiZmluX3dyaXRlMTYoRklPX0ZMQUdfRCx2YWwpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRklPX0ZMQUdfQyh2YWwpICAgICAgICAgICBiZmluX3dyaXRlMTYoRklPX0ZMQUdfQyx2YWwpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRklPX0ZMQUdfUyh2YWwpICAgICAgICAgICBiZmluX3dyaXRlMTYoRklPX0ZMQUdfUyx2YWwpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRklPX0ZMQUdfVCh2YWwpICAgICAgICAgICBiZmluX3dyaXRlMTYoRklPX0ZMQUdfVCx2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9GSU9fRkxBR19UKCkgICAgICAgICAgICAgICBiZmluX3JlYWQxNihGSU9fRkxBR19UKQotI2RlZmluZSBiZmluX3JlYWRfRklPX0ZMQUdfQygpICAgICAgICAgICAgICAgYmZpbl9yZWFkMTYoRklPX0ZMQUdfQykKLSNkZWZpbmUgYmZpbl9yZWFkX0ZJT19GTEFHX1MoKSAgICAgICAgICAgICAgIGJmaW5fcmVhZDE2KEZJT19GTEFHX1MpCi0jZGVmaW5lIGJmaW5fcmVhZF9GSU9fRkxBR19EKCkgICAgICAgICAgICAgICBiZmluX3JlYWQxNihGSU9fRkxBR19EKQotI2VuZGlmCi0KLQogLyogRE1BIENvbnRyb2xsZXIgKi8KICNkZWZpbmUgYmZpbl9yZWFkX0RNQTBfQ09ORklHKCkgICAgICAgICAgICAgIGJmaW5fcmVhZDE2KERNQTBfQ09ORklHKQogI2RlZmluZSBiZmluX3dyaXRlX0RNQTBfQ09ORklHKHZhbCkgICAgICAgICAgYmZpbl93cml0ZTE2KERNQTBfQ09ORklHLHZhbCkKQEAgLTc2NCw0ICs2NzYsOTMgQEAKICNkZWZpbmUgYmZpbl9yZWFkX1BQSV9GUkFNRSgpICAgICAgICAgICAgICAgIGJmaW5fcmVhZDE2KFBQSV9GUkFNRSkKICNkZWZpbmUgYmZpbl93cml0ZV9QUElfRlJBTUUodmFsKSAgICAgICAgICAgIGJmaW5fd3JpdGUxNihQUElfRlJBTUUsdmFsKQogCisvKiBUaGVzZSBuZWVkIHRvIGJlIGxhc3QgZHVlIHRvIHRoZSBjZGVmL2xpbnV4IGludGVyLWRlcGVuZGVuY2llcyAqLworI2luY2x1ZGUgPGFzbS9pcnEuaD4KKworI2lmIEFOT01BTFlfMDUwMDAzMTEKKyNkZWZpbmUgQkZJTl9XUklURV9GSU9fRkxBRyhuYW1lKSBcCitzdGF0aWMgaW5saW5lIHZvaWQgYmZpbl93cml0ZV9GSU9fRkxBR18jI25hbWUodW5zaWduZWQgc2hvcnQgdmFsKSBcCit7IFwKKwl1bnNpZ25lZCBsb25nIGZsYWdzOyBcCisJbG9jYWxfaXJxX3NhdmVfaHcoZmxhZ3MpOyBcCisJYmZpbl93cml0ZTE2KEZJT19GTEFHXyMjbmFtZSwgdmFsKTsgXAorCWJmaW5fcmVhZF9DSElQSUQoKTsgXAorCWxvY2FsX2lycV9yZXN0b3JlX2h3KGZsYWdzKTsgXAorfQorQkZJTl9XUklURV9GSU9fRkxBRyhEKQorQkZJTl9XUklURV9GSU9fRkxBRyhDKQorQkZJTl9XUklURV9GSU9fRkxBRyhTKQorQkZJTl9XUklURV9GSU9fRkxBRyhUKQorCisjZGVmaW5lIEJGSU5fUkVBRF9GSU9fRkxBRyhuYW1lKSBcCitzdGF0aWMgaW5saW5lIHUxNiBiZmluX3JlYWRfRklPX0ZMQUdfIyNuYW1lKHZvaWQpIFwKK3sgXAorCXVuc2lnbmVkIGxvbmcgZmxhZ3M7IFwKKwl1MTYgcmV0OyBcCisJbG9jYWxfaXJxX3NhdmVfaHcoZmxhZ3MpOyBcCisJcmV0ID0gYmZpbl9yZWFkMTYoRklPX0ZMQUdfIyNuYW1lKTsgXAorCWJmaW5fcmVhZF9DSElQSUQoKTsgXAorCWxvY2FsX2lycV9yZXN0b3JlX2h3KGZsYWdzKTsgXAorCXJldHVybiByZXQ7IFwKK30KK0JGSU5fUkVBRF9GSU9fRkxBRyhEKQorQkZJTl9SRUFEX0ZJT19GTEFHKEMpCitCRklOX1JFQURfRklPX0ZMQUcoUykKK0JGSU5fUkVBRF9GSU9fRkxBRyhUKQorCisjZWxzZQorI2RlZmluZSBiZmluX3dyaXRlX0ZJT19GTEFHX0QodmFsKSAgICAgICAgICAgYmZpbl93cml0ZTE2KEZJT19GTEFHX0QsIHZhbCkKKyNkZWZpbmUgYmZpbl93cml0ZV9GSU9fRkxBR19DKHZhbCkgICAgICAgICAgIGJmaW5fd3JpdGUxNihGSU9fRkxBR19DLCB2YWwpCisjZGVmaW5lIGJmaW5fd3JpdGVfRklPX0ZMQUdfUyh2YWwpICAgICAgICAgICBiZmluX3dyaXRlMTYoRklPX0ZMQUdfUywgdmFsKQorI2RlZmluZSBiZmluX3dyaXRlX0ZJT19GTEFHX1QodmFsKSAgICAgICAgICAgYmZpbl93cml0ZTE2KEZJT19GTEFHX1QsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0ZJT19GTEFHX1QoKSAgICAgICAgICAgICAgIGJmaW5fcmVhZDE2KEZJT19GTEFHX1QpCisjZGVmaW5lIGJmaW5fcmVhZF9GSU9fRkxBR19DKCkgICAgICAgICAgICAgICBiZmluX3JlYWQxNihGSU9fRkxBR19DKQorI2RlZmluZSBiZmluX3JlYWRfRklPX0ZMQUdfUygpICAgICAgICAgICAgICAgYmZpbl9yZWFkMTYoRklPX0ZMQUdfUykKKyNkZWZpbmUgYmZpbl9yZWFkX0ZJT19GTEFHX0QoKSAgICAgICAgICAgICAgIGJmaW5fcmVhZDE2KEZJT19GTEFHX0QpCisjZW5kaWYKKworLyogV3JpdGluZyB0byBQTExfQ1RMIGluaXRpYXRlcyBhIFBMTCByZWxvY2sgc2VxdWVuY2UuICovCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIGJmaW5fd3JpdGVfUExMX0NUTCh1bnNpZ25lZCBpbnQgdmFsKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIGl3cjsKKworCWlmICh2YWwgPT0gYmZpbl9yZWFkX1BMTF9DVEwoKSkKKwkJcmV0dXJuOworCisJbG9jYWxfaXJxX3NhdmVfaHcoZmxhZ3MpOworCS8qIEVuYWJsZSB0aGUgUExMIFdha2V1cCBiaXQgaW4gU0lDIElXUiAqLworCWl3ciA9IGJmaW5fcmVhZDMyKFNJQ19JV1IpOworCS8qIE9ubHkgYWxsb3cgUFBMIFdha2V1cCkgKi8KKwliZmluX3dyaXRlMzIoU0lDX0lXUiwgSVdSX0VOQUJMRSgwKSk7CisKKwliZmluX3dyaXRlMTYoUExMX0NUTCwgdmFsKTsKKwlTU1lOQygpOworCWFzbSgiSURMRTsiKTsKKworCWJmaW5fd3JpdGUzMihTSUNfSVdSLCBpd3IpOworCWxvY2FsX2lycV9yZXN0b3JlX2h3KGZsYWdzKTsKK30KKworLyogV3JpdGluZyB0byBWUl9DVEwgaW5pdGlhdGVzIGEgUExMIHJlbG9jayBzZXF1ZW5jZS4gKi8KK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgYmZpbl93cml0ZV9WUl9DVEwodW5zaWduZWQgaW50IHZhbCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzLCBpd3I7CisKKwlpZiAodmFsID09IGJmaW5fcmVhZF9WUl9DVEwoKSkKKwkJcmV0dXJuOworCisJbG9jYWxfaXJxX3NhdmVfaHcoZmxhZ3MpOworCS8qIEVuYWJsZSB0aGUgUExMIFdha2V1cCBiaXQgaW4gU0lDIElXUiAqLworCWl3ciA9IGJmaW5fcmVhZDMyKFNJQ19JV1IpOworCS8qIE9ubHkgYWxsb3cgUFBMIFdha2V1cCkgKi8KKwliZmluX3dyaXRlMzIoU0lDX0lXUiwgSVdSX0VOQUJMRSgwKSk7CisKKwliZmluX3dyaXRlMTYoVlJfQ1RMLCB2YWwpOworCVNTWU5DKCk7CisJYXNtKCJJRExFOyIpOworCisJYmZpbl93cml0ZTMyKFNJQ19JV1IsIGl3cik7CisJbG9jYWxfaXJxX3Jlc3RvcmVfaHcoZmxhZ3MpOworfQorCiAjZW5kaWYJCQkJLyogX0NERUZfQkY1MzJfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2luY2x1ZGUvbWFjaC9kbWEuaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9pbmNsdWRlL21hY2gvZG1hLmgKaW5kZXggYmQ5ZDVlOS4uZmIzNDkzNCAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2luY2x1ZGUvbWFjaC9kbWEuaAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvaW5jbHVkZS9tYWNoL2RtYS5oCkBAIC0xLDQyICsxLDE0IEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgIEJGLTUzMy8yLzEgU3BlY2lmaWMgRGVjbGFyYXRpb25zCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIEZpbGU6ICAgICAgICAgaW5jbHVkZS9hc20tYmxhY2tmaW4vbWFjaC1iZjUzMy9kbWEuaAotICogQmFzZWQgb246Ci0gKiBBdXRob3I6CisvKiBtYWNoL2RtYS5oIC0gYXJjaC1zcGVjaWZpYyBETUEgZGVmaW5lcwogICoKLSAqIENyZWF0ZWQ6Ci0gKiBEZXNjcmlwdGlvbjoKKyAqIENvcHlyaWdodCAyMDA0LTIwMDggQW5hbG9nIERldmljZXMgSW5jLgogICoKLSAqIFJldjoKLSAqCi0gKiBNb2RpZmllZDoKLSAqCi0gKiBCdWdzOiAgICAgICAgIEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLwotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICogYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLgotICogSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KICAqLwogCiAjaWZuZGVmIF9NQUNIX0RNQV9IXwogI2RlZmluZSBfTUFDSF9ETUFfSF8KIAotI2RlZmluZSBNQVhfQkxBQ0tGSU5fRE1BX0NIQU5ORUwgMTIKKyNkZWZpbmUgTUFYX0RNQV9DSEFOTkVMUyAxMgogCiAjZGVmaW5lIENIX1BQSSAgICAgICAgICAwCiAjZGVmaW5lIENIX1NQT1JUMF9SWCAgICAxCkBAIC00NCw4ICsxNiw4IEBACiAjZGVmaW5lIENIX1NQT1JUMV9SWCAgICAzCiAjZGVmaW5lIENIX1NQT1JUMV9UWCAgICA0CiAjZGVmaW5lIENIX1NQSSAgICAgICAgICA1Ci0jZGVmaW5lIENIX1VBUlRfUlggICAgICA2Ci0jZGVmaW5lIENIX1VBUlRfVFggICAgICA3CisjZGVmaW5lIENIX1VBUlQwX1JYICAgICA2CisjZGVmaW5lIENIX1VBUlQwX1RYICAgICA3CiAjZGVmaW5lIENIX01FTV9TVFJFQU0wX0RFU1QgICAgIDgJIC8qIFRYICovCiAjZGVmaW5lIENIX01FTV9TVFJFQU0wX1NSQyAgICAgIDkJIC8qIFJYICovCiAjZGVmaW5lIENIX01FTV9TVFJFQU0xX0RFU1QgICAgIDEwCSAvKiBUWCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2luY2x1ZGUvbWFjaC9ncGlvLmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvaW5jbHVkZS9tYWNoL2dwaW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDVjMTcwCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2luY2x1ZGUvbWFjaC9ncGlvLmgKQEAgLTAsMCArMSwzNCBAQAorLyoKKyAqIEZpbGU6IGFyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9pbmNsdWRlL21hY2gvZ3Bpby5oCisgKiBCdWdzOiBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggQW5hbG9nIERldmljZXMgSW5jLgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgorICovCisKKworI2lmbmRlZiBfTUFDSF9HUElPX0hfCisjZGVmaW5lIF9NQUNIX0dQSU9fSF8KKworI2RlZmluZSBNQVhfQkxBQ0tGSU5fR1BJT1MgMTYKKworI2RlZmluZQlHUElPX1BGMAkwCisjZGVmaW5lCUdQSU9fUEYxCTEKKyNkZWZpbmUJR1BJT19QRjIJMgorI2RlZmluZQlHUElPX1BGMwkzCisjZGVmaW5lCUdQSU9fUEY0CTQKKyNkZWZpbmUJR1BJT19QRjUJNQorI2RlZmluZQlHUElPX1BGNgk2CisjZGVmaW5lCUdQSU9fUEY3CTcKKyNkZWZpbmUJR1BJT19QRjgJOAorI2RlZmluZQlHUElPX1BGOQk5CisjZGVmaW5lCUdQSU9fUEYxMAkxMAorI2RlZmluZQlHUElPX1BGMTEJMTEKKyNkZWZpbmUJR1BJT19QRjEyCTEyCisjZGVmaW5lCUdQSU9fUEYxMwkxMworI2RlZmluZQlHUElPX1BGMTQJMTQKKyNkZWZpbmUJR1BJT19QRjE1CTE1CisKKyNkZWZpbmUgUE9SVF9GIEdQSU9fUEYwCisKKyNlbmRpZiAvKiBfTUFDSF9HUElPX0hfICovCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvaW5jbHVkZS9tYWNoL2lycS5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2luY2x1ZGUvbWFjaC9pcnEuaAppbmRleCA1YWEzOGU1Li5kYjFlMzQ2IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvaW5jbHVkZS9tYWNoL2lycS5oCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9pbmNsdWRlL21hY2gvaXJxLmgKQEAgLTkwLDE5ICs5MCwxOSBAQAogI2RlZmluZQlJUlFfU1BPUlQwX0VSUk9SCTEwCS8qU1BPUlQwIEVycm9yIEludGVycnVwdCAqLwogI2RlZmluZQlJUlFfU1BPUlQxX0VSUk9SCTExCS8qU1BPUlQxIEVycm9yIEludGVycnVwdCAqLwogI2RlZmluZQlJUlFfU1BJX0VSUk9SCQkxMgkvKlNQSSBFcnJvciBJbnRlcnJ1cHQgKi8KLSNkZWZpbmUJSVJRX1VBUlRfRVJST1IJCTEzCS8qVUFSVCBFcnJvciBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUJSVJRX1VBUlQwX0VSUk9SCQkxMwkvKlVBUlQgRXJyb3IgSW50ZXJydXB0ICovCiAjZGVmaW5lCUlSUV9SVEMJCQkxNAkvKlJUQyBJbnRlcnJ1cHQgKi8KICNkZWZpbmUJSVJRX1BQSQkJCTE1CS8qRE1BMCBJbnRlcnJ1cHQgKFBQSSkgKi8KICNkZWZpbmUJSVJRX1NQT1JUMF9SWAkJMTYJLypETUExIEludGVycnVwdCAoU1BPUlQwIFJYKSAqLwogI2RlZmluZQlJUlFfU1BPUlQwX1RYCQkxNwkvKkRNQTIgSW50ZXJydXB0IChTUE9SVDAgVFgpICovCiAjZGVmaW5lCUlSUV9TUE9SVDFfUlgJCTE4CS8qRE1BMyBJbnRlcnJ1cHQgKFNQT1JUMSBSWCkgKi8KICNkZWZpbmUJSVJRX1NQT1JUMV9UWAkJMTkJLypETUE0IEludGVycnVwdCAoU1BPUlQxIFRYKSAqLwotI2RlZmluZSAJSVJRX1NQSQkJCTIwCS8qRE1BNSBJbnRlcnJ1cHQgKFNQSSkgKi8KLSNkZWZpbmUJSVJRX1VBUlRfUlgJCTIxCS8qRE1BNiBJbnRlcnJ1cHQgKFVBUlQgUlgpICovCi0jZGVmaW5lCUlSUV9VQVJUX1RYCQkyMgkvKkRNQTcgSW50ZXJydXB0IChVQVJUIFRYKSAqLwotI2RlZmluZQlJUlFfVE1SMAkJMjMJLypUaW1lciAwICovCi0jZGVmaW5lCUlSUV9UTVIxCQkyNAkvKlRpbWVyIDEgKi8KLSNkZWZpbmUJSVJRX1RNUjIJCTI1CS8qVGltZXIgMiAqLworI2RlZmluZQlJUlFfU1BJCQkJMjAJLypETUE1IEludGVycnVwdCAoU1BJKSAqLworI2RlZmluZQlJUlFfVUFSVDBfUlgJCTIxCS8qRE1BNiBJbnRlcnJ1cHQgKFVBUlQgUlgpICovCisjZGVmaW5lCUlSUV9VQVJUMF9UWAkJMjIJLypETUE3IEludGVycnVwdCAoVUFSVCBUWCkgKi8KKyNkZWZpbmUJSVJRX1RJTUVSMAkJMjMJLypUaW1lciAwICovCisjZGVmaW5lCUlSUV9USU1FUjEJCTI0CS8qVGltZXIgMSAqLworI2RlZmluZQlJUlFfVElNRVIyCQkyNQkvKlRpbWVyIDIgKi8KICNkZWZpbmUJSVJRX1BST0dfSU5UQQkJMjYJLypQcm9ncmFtbWFibGUgRmxhZ3MgQSAoOCkgKi8KICNkZWZpbmUJSVJRX1BST0dfSU5UQgkJMjcJLypQcm9ncmFtbWFibGUgRmxhZ3MgQiAoOCkgKi8KICNkZWZpbmUJSVJRX01FTV9ETUEwCQkyOAkvKkRNQTgvOSBJbnRlcnJ1cHQgKE1lbW9yeSBETUEgU3RyZWFtIDApICovCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvaW5jbHVkZS9tYWNoL21lbV9pbml0LmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvaW5jbHVkZS9tYWNoL21lbV9pbml0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkMjAzNGIuLjAwMDAwMDAKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2luY2x1ZGUvbWFjaC9tZW1faW5pdC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjk3ICswLDAgQEAKLS8qCi0gKiBGaWxlOiAgICAgICAgIGluY2x1ZGUvYXNtLWJsYWNrZmluL21hY2gtYmY1MzMvbWVtX2luaXQuaAotICogQmFzZWQgb246Ci0gKiBBdXRob3I6Ci0gKgotICogQ3JlYXRlZDoKLSAqIERlc2NyaXB0aW9uOgotICoKLSAqIFJldjoKLSAqCi0gKiBNb2RpZmllZDoKLSAqICAgICAgICAgICAgICAgQ29weXJpZ2h0IDIwMDQtMjAwNiBBbmFsb2cgRGV2aWNlcyBJbmMuCi0gKgotICogQnVnczogICAgICAgICBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAqIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4KLSAqIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0gKi8KLQotI2lmIChDT05GSUdfTUVNX01UNDhMQzE2TTE2QTJUR183NSB8fCBDT05GSUdfTUVNX01UNDhMQzY0TTRBMkZCXzdFIHx8IFwKLSAgICAgQ09ORklHX01FTV9NVDQ4TEMzMk0xNkEyVEdfNzUgfHwgQ09ORklHX01FTV9HRU5FUklDX0JPQVJEKQotI2lmIChDT05GSUdfU0NMS19IWiA+IDExOTQwMjk4NSkKLSNkZWZpbmUgU0RSQU1fdFJQICAgICAgIFRSUF8yCi0jZGVmaW5lIFNEUkFNX3RSUF9udW0gICAyCi0jZGVmaW5lIFNEUkFNX3RSQVMgICAgICBUUkFTXzcKLSNkZWZpbmUgU0RSQU1fdFJBU19udW0gIDcKLSNkZWZpbmUgU0RSQU1fdFJDRCAgICAgIFRSQ0RfMgotI2RlZmluZSBTRFJBTV90V1IgICAgICAgVFdSXzIKLSNlbmRpZgotI2lmIChDT05GSUdfU0NMS19IWiA+IDEwNDQ3NzYxMikgJiYgKENPTkZJR19TQ0xLX0haIDw9IDExOTQwMjk4NSkKLSNkZWZpbmUgU0RSQU1fdFJQICAgICAgIFRSUF8yCi0jZGVmaW5lIFNEUkFNX3RSUF9udW0gICAyCi0jZGVmaW5lIFNEUkFNX3RSQVMgICAgICBUUkFTXzYKLSNkZWZpbmUgU0RSQU1fdFJBU19udW0gIDYKLSNkZWZpbmUgU0RSQU1fdFJDRCAgICAgIFRSQ0RfMgotI2RlZmluZSBTRFJBTV90V1IgICAgICAgVFdSXzIKLSNlbmRpZgotI2lmIChDT05GSUdfU0NMS19IWiA+IDg5NTUyMjM5KSAmJiAoQ09ORklHX1NDTEtfSFogPD0gMTA0NDc3NjEyKQotI2RlZmluZSBTRFJBTV90UlAgICAgICAgVFJQXzIKLSNkZWZpbmUgU0RSQU1fdFJQX251bSAgIDIKLSNkZWZpbmUgU0RSQU1fdFJBUyAgICAgIFRSQVNfNQotI2RlZmluZSBTRFJBTV90UkFTX251bSAgNQotI2RlZmluZSBTRFJBTV90UkNEICAgICAgVFJDRF8yCi0jZGVmaW5lIFNEUkFNX3RXUiAgICAgICBUV1JfMgotI2VuZGlmCi0jaWYgKENPTkZJR19TQ0xLX0haID4gNzQ2MjY4NjYpICYmIChDT05GSUdfU0NMS19IWiA8PSA4OTU1MjIzOSkKLSNkZWZpbmUgU0RSQU1fdFJQICAgICAgIFRSUF8yCi0jZGVmaW5lIFNEUkFNX3RSUF9udW0gICAyCi0jZGVmaW5lIFNEUkFNX3RSQVMgICAgICBUUkFTXzQKLSNkZWZpbmUgU0RSQU1fdFJBU19udW0gIDQKLSNkZWZpbmUgU0RSQU1fdFJDRCAgICAgIFRSQ0RfMgotI2RlZmluZSBTRFJBTV90V1IgICAgICAgVFdSXzIKLSNlbmRpZgotI2lmIChDT05GSUdfU0NMS19IWiA+IDY2NjY2NjY3KSAmJiAoQ09ORklHX1NDTEtfSFogPD0gNzQ2MjY4NjYpCi0jZGVmaW5lIFNEUkFNX3RSUCAgICAgICBUUlBfMgotI2RlZmluZSBTRFJBTV90UlBfbnVtICAgMgotI2RlZmluZSBTRFJBTV90UkFTICAgICAgVFJBU18zCi0jZGVmaW5lIFNEUkFNX3RSQVNfbnVtICAzCi0jZGVmaW5lIFNEUkFNX3RSQ0QgICAgICBUUkNEXzIKLSNkZWZpbmUgU0RSQU1fdFdSICAgICAgIFRXUl8yCi0jZW5kaWYKLSNpZiAoQ09ORklHX1NDTEtfSFogPiA1OTcwMTQ5MykgJiYgKENPTkZJR19TQ0xLX0haIDw9IDY2NjY2NjY3KQotI2RlZmluZSBTRFJBTV90UlAgICAgICAgVFJQXzEKLSNkZWZpbmUgU0RSQU1fdFJQX251bSAgIDEKLSNkZWZpbmUgU0RSQU1fdFJBUyAgICAgIFRSQVNfNAotI2RlZmluZSBTRFJBTV90UkFTX251bSAgMwotI2RlZmluZSBTRFJBTV90UkNEICAgICAgVFJDRF8xCi0jZGVmaW5lIFNEUkFNX3RXUiAgICAgICBUV1JfMgotI2VuZGlmCi0jaWYgKENPTkZJR19TQ0xLX0haID4gNDQ3NzYxMTkpICYmIChDT05GSUdfU0NMS19IWiA8PSA1OTcwMTQ5MykKLSNkZWZpbmUgU0RSQU1fdFJQICAgICAgIFRSUF8xCi0jZGVmaW5lIFNEUkFNX3RSUF9udW0gICAxCi0jZGVmaW5lIFNEUkFNX3RSQVMgICAgICBUUkFTXzMKLSNkZWZpbmUgU0RSQU1fdFJBU19udW0gIDMKLSNkZWZpbmUgU0RSQU1fdFJDRCAgICAgIFRSQ0RfMQotI2RlZmluZSBTRFJBTV90V1IgICAgICAgVFdSXzIKLSNlbmRpZgotI2lmIChDT05GSUdfU0NMS19IWiA+IDI5ODUwNzQ2KSAmJiAoQ09ORklHX1NDTEtfSFogPD0gNDQ3NzYxMTkpCi0jZGVmaW5lIFNEUkFNX3RSUCAgICAgICBUUlBfMQotI2RlZmluZSBTRFJBTV90UlBfbnVtICAgMQotI2RlZmluZSBTRFJBTV90UkFTICAgICAgVFJBU18yCi0jZGVmaW5lIFNEUkFNX3RSQVNfbnVtICAyCi0jZGVmaW5lIFNEUkFNX3RSQ0QgICAgICBUUkNEXzEKLSNkZWZpbmUgU0RSQU1fdFdSICAgICAgIFRXUl8yCi0jZW5kaWYKLSNpZiAoQ09ORklHX1NDTEtfSFogPD0gMjk4NTA3NDYpCi0jZGVmaW5lIFNEUkFNX3RSUCAgICAgICBUUlBfMQotI2RlZmluZSBTRFJBTV90UlBfbnVtICAgMQotI2RlZmluZSBTRFJBTV90UkFTICAgICAgVFJBU18xCi0jZGVmaW5lIFNEUkFNX3RSQVNfbnVtICAxCi0jZGVmaW5lIFNEUkFNX3RSQ0QgICAgICBUUkNEXzEKLSNkZWZpbmUgU0RSQU1fdFdSICAgICAgIFRXUl8yCi0jZW5kaWYKLSNlbmRpZgotCi0jaWYgKENPTkZJR19NRU1fTVQ0OExDMTZNMTZBMlRHXzc1KQotICAvKlNEUkFNIElORk9STUFUSU9OOiAqLwotI2RlZmluZSBTRFJBTV9UcmVmICA2NAkJLyogUmVmcmVzaCBwZXJpb2QgaW4gbWlsbGlzZWNvbmRzICAgKi8KLSNkZWZpbmUgU0RSQU1fTlJBICAgODE5MgkvKiBOdW1iZXIgb2Ygcm93IGFkZHJlc3NlcyBpbiBTRFJBTSAqLwotI2RlZmluZSBTRFJBTV9DTCAgICBDTF8zCi0jZW5kaWYKLQotI2lmIChDT05GSUdfTUVNX01UNDhMQzY0TTRBMkZCXzdFKQotICAvKlNEUkFNIElORk9STUFUSU9OOiAqLwotI2RlZmluZSBTRFJBTV9UcmVmICA2NAkJLyogUmVmcmVzaCBwZXJpb2QgaW4gbWlsbGlzZWNvbmRzICAgKi8KLSNkZWZpbmUgU0RSQU1fTlJBICAgODE5MgkvKiBOdW1iZXIgb2Ygcm93IGFkZHJlc3NlcyBpbiBTRFJBTSAqLwotI2RlZmluZSBTRFJBTV9DTCAgICBDTF8zCi0jZW5kaWYKLQotI2lmIChDT05GSUdfTUVNX01UNDhMQzMyTTE2QTJUR183NSkKLSAgLypTRFJBTSBJTkZPUk1BVElPTjogKi8KLSNkZWZpbmUgU0RSQU1fVHJlZiAgNjQJCS8qIFJlZnJlc2ggcGVyaW9kIGluIG1pbGxpc2Vjb25kcyAgICovCi0jZGVmaW5lIFNEUkFNX05SQSAgIDgxOTIJLyogTnVtYmVyIG9mIHJvdyBhZGRyZXNzZXMgaW4gU0RSQU0gKi8KLSNkZWZpbmUgU0RSQU1fQ0wgICAgQ0xfMwotI2VuZGlmCi0KLSNpZiAoQ09ORklHX01FTV9HRU5FUklDX0JPQVJEKQotICAvKlNEUkFNIElORk9STUFUSU9OOiBNb2RpZnkgdGhpcyBmb3IgeW91ciBib2FyZCAqLwotI2RlZmluZSBTRFJBTV9UcmVmICA2NAkJLyogUmVmcmVzaCBwZXJpb2QgaW4gbWlsbGlzZWNvbmRzICAgKi8KLSNkZWZpbmUgU0RSQU1fTlJBICAgODE5MgkvKiBOdW1iZXIgb2Ygcm93IGFkZHJlc3NlcyBpbiBTRFJBTSAqLwotI2RlZmluZSBTRFJBTV9DTCAgICBDTF8zCi0jZW5kaWYKLQotLyogRXF1YXRpb24gZnJvbSBzZWN0aW9uIDE3IChwMTctNDYpIG9mIEJGNTMzIEhSTSAqLwotI2RlZmluZSBtZW1fU0RSUkMgICAgICAgKCgoQ09ORklHX1NDTEtfSFogLyAxMDAwKSAqIFNEUkFNX1RyZWYpICAvIFNEUkFNX05SQSkgLSAoU0RSQU1fdFJBU19udW0gKyBTRFJBTV90UlBfbnVtKQotCi0vKiBFbmFibGUgU0NMSyBPdXQgKi8KLSNkZWZpbmUgbWVtX1NER0NUTCAgICAgICAgKFNDVExFIHwgU0RSQU1fQ0wgfCBTRFJBTV90UkFTIHwgU0RSQU1fdFJQIHwgU0RSQU1fdFJDRCB8IFNEUkFNX3RXUiB8IFBTUykKLQotI2lmIGRlZmluZWQgQ09ORklHX0NMS0lOX0hBTEYKLSNkZWZpbmUgQ0xLSU5fSEFMRiAgICAgICAxCi0jZWxzZQotI2RlZmluZSBDTEtJTl9IQUxGICAgICAgIDAKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCBDT05GSUdfUExMX0JZUEFTUwotI2RlZmluZSBQTExfQllQQVNTICAgICAgMQotI2Vsc2UKLSNkZWZpbmUgUExMX0JZUEFTUyAgICAgICAwCi0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKkN1cnJlbnRseSBOb3QgQmVpbmcgVXNlZCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMX1dBVCAgKChDT05GSUdfRkxBU0hfU1BFRURfQldBVCAqIDQpIC8gKDQwMDAwMDAwMDAgLyBDT05GSUdfU0NMS19IWikpICsgMQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTF9SQVQgICgoQ09ORklHX0ZMQVNIX1NQRUVEX0JSQVQgKiA0KSAvICg0MDAwMDAwMDAwIC8gQ09ORklHX1NDTEtfSFopKSArIDEKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVExfSFQgICAoKENPTkZJR19GTEFTSF9TUEVFRF9CSFQgICogNCkgLyAoNDAwMDAwMDAwMCAvIENPTkZJR19TQ0xLX0haKSkKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVExfU1QgICAoKENPTkZJR19GTEFTSF9TUEVFRF9CU1QgICogNCkgLyAoNDAwMDAwMDAwMCAvIENPTkZJR19TQ0xLX0haKSkgKyAxCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMX1RUICAgKChDT05GSUdfRkxBU0hfU1BFRURfQlRUICAqIDQpIC8gKDQwMDAwMDAwMDAgLyBDT05GSUdfU0NMS19IWikpICsgMQotCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1RUID4gMykKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1RUICAgQjBUVF80Ci0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfVFQgPT0gMykKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1RUICAgQjBUVF8zCi0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfVFQgPT0gMikKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1RUICAgQjBUVF8yCi0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfVFQgPCAyKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfVFQgICBCMFRUXzEKLSNlbmRpZgotCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1NUID4gMykKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1NUICAgQjBTVF80Ci0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfU1QgPT0gMykKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1NUICAgQjBTVF8zCi0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfU1QgPT0gMikKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1NUICAgQjBTVF8yCi0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfU1QgPCAyKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfU1QgICBCMFNUXzEKLSNlbmRpZgotCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX0hUID4gMikKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX0hUICAgQjBIVF8zCi0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfSFQgPT0gMikKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX0hUICAgQjBIVF8yCi0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfSFQgPT0gMSkKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX0hUICAgQjBIVF8xCi0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfSFQgPT0gMCAmJiBDT05GSUdfRkxBU0hfU1BFRURfQkhUID09IDApCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9IVCAgIEIwSFRfMAotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX0hUID09IDAgJiYgQ09ORklHX0ZMQVNIX1NQRUVEX0JIVCAhPSAwKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfSFQgICBCMEhUXzEKLSNlbmRpZgotCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1dBVCA+IDE0KQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfV0FUICBCMFdBVF8xNQotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1dBVCA9PSAxNCkKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1dBVCAgQjBXQVRfMTQKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9XQVQgPT0gMTMpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9XQVQgIEIwV0FUXzEzCi0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfV0FUID09IDEyKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfV0FUICBCMFdBVF8xMgotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1dBVCA9PSAxMSkKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1dBVCAgQjBXQVRfMTEKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9XQVQgPT0gMTApCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9XQVQgIEIwV0FUXzEwCi0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfV0FUID09IDkpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9XQVQgIEIwV0FUXzkKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9XQVQgPT0gOCkKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1dBVCAgQjBXQVRfOAotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1dBVCA9PSA3KQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfV0FUICBCMFdBVF83Ci0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfV0FUID09IDYpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9XQVQgIEIwV0FUXzYKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9XQVQgPT0gNSkKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1dBVCAgQjBXQVRfNQotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1dBVCA9PSA0KQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfV0FUICBCMFdBVF80Ci0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfV0FUID09IDMpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9XQVQgIEIwV0FUXzMKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9XQVQgPT0gMikKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1dBVCAgQjBXQVRfMgotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1dBVCA9PSAxKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfV0FUICBCMFdBVF8xCi0jZW5kaWYKLQotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9SQVQgPiAxNCkKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1JBVCAgQjBSQVRfMTUKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9SQVQgPT0gMTQpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9SQVQgIEIwUkFUXzE0Ci0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfUkFUID09IDEzKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfUkFUICBCMFJBVF8xMwotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1JBVCA9PSAxMikKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1JBVCAgQjBSQVRfMTIKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9SQVQgPT0gMTEpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9SQVQgIEIwUkFUXzExCi0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfUkFUID09IDEwKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfUkFUICBCMFJBVF8xMAotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1JBVCA9PSA5KQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfUkFUICBCMFJBVF85Ci0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfUkFUID09IDgpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9SQVQgIEIwUkFUXzgKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9SQVQgPT0gNykKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1JBVCAgQjBSQVRfNwotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1JBVCA9PSA2KQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfUkFUICBCMFJBVF82Ci0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfUkFUID09IDUpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9SQVQgIEIwUkFUXzUKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9SQVQgPT0gNCkKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1JBVCAgQjBSQVRfNAotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1JBVCA9PSAzKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfUkFUICBCMFJBVF8zCi0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfUkFUID09IDIpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9SQVQgIEIwUkFUXzIKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9SQVQgPT0gMSkKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1JBVCAgQjBSQVRfMQotI2VuZGlmCi0KLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwICBcCi0JKGZsYXNoX0VCSVVfQU1CQ1RMMF9XQVQgfCBmbGFzaF9FQklVX0FNQkNUTDBfUkFUIHwgZmxhc2hfRUJJVV9BTUJDVEwwX0hUIHwgXAotCSBmbGFzaF9FQklVX0FNQkNUTDBfU1QgfCBmbGFzaF9FQklVX0FNQkNUTDBfVFQgfCBDT05GSUdfRkxBU0hfU1BFRURfUkRZRU4pCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvaW5jbHVkZS9tYWNoL21lbV9tYXAuaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9pbmNsdWRlL21hY2gvbWVtX21hcC5oCmluZGV4IDU4MWZjNmUuLmZjMzNiN2MgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9pbmNsdWRlL21hY2gvbWVtX21hcC5oCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9pbmNsdWRlL21hY2gvbWVtX21hcC5oCkBAIC0xNjgsNCArMTY4LDEwIEBACiAjZGVmaW5lIEwxX1NDUkFUQ0hfU1RBUlQJMHhGRkIwMDAwMAogI2RlZmluZSBMMV9TQ1JBVENIX0xFTkdUSAkweDEwMDAKIAorI2RlZmluZSBHRVRfUERBX1NBRkUocHJlZykJCVwKKwlwcmVnLmwgPSBfY3B1X3BkYTsJCVwKKwlwcmVnLmggPSBfY3B1X3BkYTsKKworI2RlZmluZSBHRVRfUERBKHByZWcsIGRyZWcpCUdFVF9QREFfU0FGRShwcmVnKQorCiAjZW5kaWYJCQkJLyogX01FTV9NQVBfNTMzX0hfICovCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvS2NvbmZpZyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9LY29uZmlnCmluZGV4IDgyNTUzNzQuLmJiYzA4ZmQgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9LY29uZmlnCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9LY29uZmlnCkBAIC02NCwyOSArNjQsMjkgQEAKIGNvbmZpZyBJUlFfTUFDX1RYCiAJaW50ICJJUlFfTUFDX1RYIgogCWRlZmF1bHQgMTEKLWNvbmZpZyBJUlFfVE1SMAotCWludCAiSVJRX1RNUjAiCitjb25maWcgSVJRX1RJTUVSMAorCWludCAiSVJRX1RJTUVSMCIKKwlkZWZhdWx0IDgKK2NvbmZpZyBJUlFfVElNRVIxCisJaW50ICJJUlFfVElNRVIxIgogCWRlZmF1bHQgMTIKLWNvbmZpZyBJUlFfVE1SMQotCWludCAiSVJRX1RNUjEiCitjb25maWcgSVJRX1RJTUVSMgorCWludCAiSVJRX1RJTUVSMiIKIAlkZWZhdWx0IDEyCi1jb25maWcgSVJRX1RNUjIKLQlpbnQgIklSUV9UTVIyIgorY29uZmlnIElSUV9USU1FUjMKKwlpbnQgIklSUV9USU1FUjMiCiAJZGVmYXVsdCAxMgotY29uZmlnIElSUV9UTVIzCi0JaW50ICJJUlFfVE1SMyIKK2NvbmZpZyBJUlFfVElNRVI0CisJaW50ICJJUlFfVElNRVI0IgogCWRlZmF1bHQgMTIKLWNvbmZpZyBJUlFfVE1SNAotCWludCAiSVJRX1RNUjQiCitjb25maWcgSVJRX1RJTUVSNQorCWludCAiSVJRX1RJTUVSNSIKIAlkZWZhdWx0IDEyCi1jb25maWcgSVJRX1RNUjUKLQlpbnQgIklSUV9UTVI1IgorY29uZmlnIElSUV9USU1FUjYKKwlpbnQgIklSUV9USU1FUjYiCiAJZGVmYXVsdCAxMgotY29uZmlnIElSUV9UTVI2Ci0JaW50ICJJUlFfVE1SNiIKLQlkZWZhdWx0IDEyCi1jb25maWcgSVJRX1RNUjcKLQlpbnQgIklSUV9UTVI3IgorY29uZmlnIElSUV9USU1FUjcKKwlpbnQgIklSUV9USU1FUjciCiAJZGVmYXVsdCAxMgogY29uZmlnIElSUV9QUk9HX0lOVEEKIAlpbnQgIklSUV9QUk9HX0lOVEEiCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvTWFrZWZpbGUgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvTWFrZWZpbGUKaW5kZXggNjhlNTQ3OC4uNTY5OTRiNiAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L01ha2VmaWxlCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9NYWtlZmlsZQpAQCAtMiw2ICsyLDQgQEAKICMgYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L01ha2VmaWxlCiAjCiAKLWV4dHJhLXkgOj0gaGVhZC5vCi0KIG9iai15IDo9IGludHMtcHJpb3JpdHkubyBkbWEubwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2JvYXJkcy9jbV9iZjUzNy5jIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2JvYXJkcy9jbV9iZjUzNy5jCmluZGV4IGRkZTE0NzIuLjZhYzhlNGQgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9ib2FyZHMvY21fYmY1MzcuYworKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvYm9hcmRzL2NtX2JmNTM3LmMKQEAgLTMwOCw2ICszMDgsMTkgQEAKIH07CiAjZW5kaWYKIAorc3RhdGljIHN0cnVjdCByZXNvdXJjZSBiZmluX2dwaW9zX3Jlc291cmNlcyA9IHsKKwkuc3RhcnQgPSAwLAorCS5lbmQgICA9IE1BWF9CTEFDS0ZJTl9HUElPUyAtIDEsCisJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX2dwaW9zX2RldmljZSA9IHsKKwkubmFtZSA9ICJzaW1wbGUtZ3BpbyIsCisJLmlkID0gLTEsCisJLm51bV9yZXNvdXJjZXMgPSAxLAorCS5yZXNvdXJjZSA9ICZiZmluX2dwaW9zX3Jlc291cmNlcywKK307CisKICNpZiBkZWZpbmVkKENPTkZJR19NVERfR1BJT19BRERSKSB8fCBkZWZpbmVkKENPTkZJR19NVERfR1BJT19BRERSX01PRFVMRSkKIHN0YXRpYyBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiBjbV9wYXJ0aXRpb25zW10gPSB7CiAJewpAQCAtMzc5LDMwICszOTIsNTcgQEAKICNlbmRpZgogCiAjaWYgZGVmaW5lZChDT05GSUdfQkZJTl9TSVIpIHx8IGRlZmluZWQoQ09ORklHX0JGSU5fU0lSX01PRFVMRSkKLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYmZpbl9zaXJfcmVzb3VyY2VzW10gPSB7CiAjaWZkZWYgQ09ORklHX0JGSU5fU0lSMAorc3RhdGljIHN0cnVjdCByZXNvdXJjZSBiZmluX3NpcjBfcmVzb3VyY2VzW10gPSB7CiAJewogCQkuc3RhcnQgPSAweEZGQzAwNDAwLAogCQkuZW5kID0gMHhGRkMwMDRGRiwKIAkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCiAJfSwKKwl7CisJCS5zdGFydCA9IElSUV9VQVJUMF9SWCwKKwkJLmVuZCA9IElSUV9VQVJUMF9SWCsxLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCXsKKwkJLnN0YXJ0ID0gQ0hfVUFSVDBfUlgsCisJCS5lbmQgPSBDSF9VQVJUMF9SWCsxLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0RNQSwKKwl9LAorfTsKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmaW5fc2lyMF9kZXZpY2UgPSB7CisJLm5hbWUgPSAiYmZpbl9zaXIiLAorCS5pZCA9IDAsCisJLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKGJmaW5fc2lyMF9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZSA9IGJmaW5fc2lyMF9yZXNvdXJjZXMsCit9OwogI2VuZGlmCiAjaWZkZWYgQ09ORklHX0JGSU5fU0lSMQorc3RhdGljIHN0cnVjdCByZXNvdXJjZSBiZmluX3NpcjFfcmVzb3VyY2VzW10gPSB7CiAJewogCQkuc3RhcnQgPSAweEZGQzAyMDAwLAogCQkuZW5kID0gMHhGRkMwMjBGRiwKIAkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCiAJfSwKLSNlbmRpZgorCXsKKwkJLnN0YXJ0ID0gSVJRX1VBUlQxX1JYLAorCQkuZW5kID0gSVJRX1VBUlQxX1JYKzEsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJeworCQkuc3RhcnQgPSBDSF9VQVJUMV9SWCwKKwkJLmVuZCA9IENIX1VBUlQxX1JYKzEsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfRE1BLAorCX0sCiB9OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX3Npcl9kZXZpY2UgPSB7CitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX3NpcjFfZGV2aWNlID0gewogCS5uYW1lID0gImJmaW5fc2lyIiwKLQkuaWQgPSAwLAotCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShiZmluX3Npcl9yZXNvdXJjZXMpLAotCS5yZXNvdXJjZSA9IGJmaW5fc2lyX3Jlc291cmNlcywKKwkuaWQgPSAxLAorCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShiZmluX3NpcjFfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UgPSBiZmluX3NpcjFfcmVzb3VyY2VzLAogfTsKICNlbmRpZgorI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19JMkNfQkxBQ0tGSU5fVFdJKSB8fCBkZWZpbmVkKENPTkZJR19JMkNfQkxBQ0tGSU5fVFdJX01PRFVMRSkKIHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYmZpbl90d2kwX3Jlc291cmNlW10gPSB7CkBAIC01MjUsNyArNTY1LDEyIEBACiAjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX0JGSU5fU0lSKSB8fCBkZWZpbmVkKENPTkZJR19CRklOX1NJUl9NT0RVTEUpCi0JJmJmaW5fc2lyX2RldmljZSwKKyNpZmRlZiBDT05GSUdfQkZJTl9TSVIwCisJJmJmaW5fc2lyMF9kZXZpY2UsCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQkZJTl9TSVIxCisJJmJmaW5fc2lyMV9kZXZpY2UsCisjZW5kaWYKICNlbmRpZgogCiAjaWYgZGVmaW5lZChDT05GSUdfSTJDX0JMQUNLRklOX1RXSSkgfHwgZGVmaW5lZChDT05GSUdfSTJDX0JMQUNLRklOX1RXSV9NT0RVTEUpCkBAIC01NjQsNiArNjA5LDggQEAKICNpZiBkZWZpbmVkKENPTkZJR19NVERfR1BJT19BRERSKSB8fCBkZWZpbmVkKENPTkZJR19NVERfR1BJT19BRERSX01PRFVMRSkKIAkmY21fZmxhc2hfZGV2aWNlLAogI2VuZGlmCisKKwkmYmZpbl9ncGlvc19kZXZpY2UsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBjbV9iZjUzN19pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvYm9hcmRzL2dlbmVyaWNfYm9hcmQuYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9ib2FyZHMvZ2VuZXJpY19ib2FyZC5jCmluZGV4IDc4YTEzZDUuLmRkNmU2YmYgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9ib2FyZHMvZ2VuZXJpY19ib2FyZC5jCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9ib2FyZHMvZ2VuZXJpY19ib2FyZC5jCkBAIC01MCw1NyArNTAsNDYgQEAKIC8qCiAgKiBOYW1lIHRoZSBCb2FyZCBmb3IgdGhlIC9wcm9jL2NwdWluZm8KICAqLwotY29uc3QgY2hhciBiZmluX2JvYXJkX25hbWVbXSA9ICJHRU5FUklDIEJvYXJkIjsKK2NvbnN0IGNoYXIgYmZpbl9ib2FyZF9uYW1lW10gPSAiVU5LTk9XTiBCT0FSRCI7CiAKIC8qCiAgKiAgRHJpdmVyIG5lZWRzIHRvIGtub3cgYWRkcmVzcywgaXJxIGFuZCBmbGFnIHBpbi4KICAqLwogCi0jZGVmaW5lIElTUDE3NjFfQkFTRSAgICAgICAweDIwM0MwMDAwCi0jZGVmaW5lIElTUDE3NjFfSVJRICAgICAgICBJUlFfUEY3Ci0KICNpZiBkZWZpbmVkKENPTkZJR19VU0JfSVNQMTc2MF9IQ0QpIHx8IGRlZmluZWQoQ09ORklHX1VTQl9JU1AxNzYwX0hDRF9NT0RVTEUpCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIGJmaW5faXNwMTc2MV9yZXNvdXJjZXNbXSA9IHsKKyNpbmNsdWRlIDxsaW51eC91c2IvaXNwMTc2MC5oPgorc3RhdGljIHN0cnVjdCByZXNvdXJjZSBiZmluX2lzcDE3NjBfcmVzb3VyY2VzW10gPSB7CiAJWzBdID0gewotCQkubmFtZQk9ICJpc3AxNzYxLXJlZ3MiLAotCQkuc3RhcnQgID0gSVNQMTc2MV9CQVNFICsgMHgwMDAwMDAwMCwKLQkJLmVuZCAgICA9IElTUDE3NjFfQkFTRSArIDB4MDAwZmZmZmYsCisJCS5zdGFydCAgPSAweDIwM0MwMDAwLAorCQkuZW5kICAgID0gMHgyMDNDMDAwMCArIDB4MDAwZmZmZmYsCiAJCS5mbGFncyAgPSBJT1JFU09VUkNFX01FTSwKIAl9LAogCVsxXSA9IHsKLQkJLnN0YXJ0ICA9IElTUDE3NjFfSVJRLAotCQkuZW5kICAgID0gSVNQMTc2MV9JUlEsCisJCS5zdGFydCAgPSBJUlFfUEY3LAorCQkuZW5kICAgID0gSVJRX1BGNywKIAkJLmZsYWdzICA9IElPUkVTT1VSQ0VfSVJRLAogCX0sCiB9OwogCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX2lzcDE3NjFfZGV2aWNlID0gewotCS5uYW1lICAgICAgICAgICA9ICJpc3AxNzYxIiwKK3N0YXRpYyBzdHJ1Y3QgaXNwMTc2MF9wbGF0Zm9ybV9kYXRhIGlzcDE3NjBfcHJpdiA9IHsKKwkuaXNfaXNwMTc2MSA9IDAsCisJLnBvcnQxX2Rpc2FibGUgPSAwLAorCS5idXNfd2lkdGhfMTYgPSAxLAorCS5wb3J0MV9vdGcgPSAwLAorCS5hbmFsb2dfb2MgPSAwLAorCS5kYWNrX3BvbGFyaXR5X2hpZ2ggPSAwLAorCS5kcmVxX3BvbGFyaXR5X2hpZ2ggPSAwLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9pc3AxNzYwX2RldmljZSA9IHsKKwkubmFtZSAgICAgICAgICAgPSAiaXNwMTc2MC1oY2QiLAogCS5pZCAgICAgICAgICAgICA9IDAsCi0JLm51bV9yZXNvdXJjZXMgID0gQVJSQVlfU0laRShiZmluX2lzcDE3NjFfcmVzb3VyY2VzKSwKLQkucmVzb3VyY2UgICAgICAgPSBiZmluX2lzcDE3NjFfcmVzb3VyY2VzLAorCS5kZXYgPSB7CisJCS5wbGF0Zm9ybV9kYXRhID0gJmlzcDE3NjBfcHJpdiwKKwl9LAorCS5udW1fcmVzb3VyY2VzICA9IEFSUkFZX1NJWkUoYmZpbl9pc3AxNzYwX3Jlc291cmNlcyksCisJLnJlc291cmNlICAgICAgID0gYmZpbl9pc3AxNzYwX3Jlc291cmNlcywKIH07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpiZmluX2lzcDE3NjFfZGV2aWNlc1tdID0gewotCSZiZmluX2lzcDE3NjFfZGV2aWNlLAotfTsKLQotaW50IF9faW5pdCBiZmluX2lzcDE3NjFfaW5pdCh2b2lkKQotewotCXVuc2lnbmVkIGludCBudW1fZGV2aWNlcyA9IEFSUkFZX1NJWkUoYmZpbl9pc3AxNzYxX2RldmljZXMpOwotCi0JcHJpbnRrKEtFUk5fSU5GTyAiJXMoKTogcmVnaXN0ZXJpbmcgZGV2aWNlIHJlc291cmNlc1xuIiwgX19mdW5jX18pOwotCXNldF9pcnFfdHlwZShJU1AxNzYxX0lSUSwgSVJRRl9UUklHR0VSX0ZBTExJTkcpOwotCi0JcmV0dXJuIHBsYXRmb3JtX2FkZF9kZXZpY2VzKGJmaW5faXNwMTc2MV9kZXZpY2VzLCBudW1fZGV2aWNlcyk7Ci19Ci0KLXZvaWQgX19leGl0IGJmaW5faXNwMTc2MV9leGl0KHZvaWQpCi17Ci0JcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIoJmJmaW5faXNwMTc2MV9kZXZpY2UpOwotfQotCi1hcmNoX2luaXRjYWxsKGJmaW5faXNwMTc2MV9pbml0KTsKICNlbmRpZgogCiAjaWYgZGVmaW5lZChDT05GSUdfQkZJTl9DRlBDTUNJQSkgfHwgZGVmaW5lZChDT05GSUdfQkZJTl9DRlBDTUNJQV9NT0RVTEUpCkBAIC01NTksMzAgKzU0OCw1OSBAQAogI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19CRklOX1NJUikgfHwgZGVmaW5lZChDT05GSUdfQkZJTl9TSVJfTU9EVUxFKQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBiZmluX3Npcl9yZXNvdXJjZXNbXSA9IHsKICNpZmRlZiBDT05GSUdfQkZJTl9TSVIwCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGJmaW5fc2lyMF9yZXNvdXJjZXNbXSA9IHsKIAl7CiAJCS5zdGFydCA9IDB4RkZDMDA0MDAsCiAJCS5lbmQgPSAweEZGQzAwNEZGLAogCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKIAl9LAorCXsKKwkJLnN0YXJ0ID0gSVJRX1VBUlQwX1JYLAorCQkuZW5kID0gSVJRX1VBUlQwX1JYKzEsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJeworCQkuc3RhcnQgPSBDSF9VQVJUMF9SWCwKKwkJLmVuZCA9IENIX1VBUlQwX1JYKzEsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfRE1BLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX3NpcjBfZGV2aWNlID0geworCS5uYW1lID0gImJmaW5fc2lyIiwKKwkuaWQgPSAwLAorCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShiZmluX3NpcjBfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UgPSBiZmluX3NpcjBfcmVzb3VyY2VzLAorfTsKICNlbmRpZgogI2lmZGVmIENPTkZJR19CRklOX1NJUjEKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYmZpbl9zaXIxX3Jlc291cmNlc1tdID0gewogCXsKIAkJLnN0YXJ0ID0gMHhGRkMwMjAwMCwKIAkJLmVuZCA9IDB4RkZDMDIwRkYsCiAJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAogCX0sCi0jZW5kaWYKKwl7CisJCS5zdGFydCA9IElSUV9VQVJUMV9SWCwKKwkJLmVuZCA9IElSUV9VQVJUMV9SWCsxLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCXsKKwkJLnN0YXJ0ID0gQ0hfVUFSVDFfUlgsCisJCS5lbmQgPSBDSF9VQVJUMV9SWCsxLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0RNQSwKKwl9LAogfTsKIAotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9zaXJfZGV2aWNlID0geworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9zaXIxX2RldmljZSA9IHsKIAkubmFtZSA9ICJiZmluX3NpciIsCi0JLmlkID0gMCwKLQkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUoYmZpbl9zaXJfcmVzb3VyY2VzKSwKLQkucmVzb3VyY2UgPSBiZmluX3Npcl9yZXNvdXJjZXMsCisJLmlkID0gMSwKKwkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUoYmZpbl9zaXIxX3Jlc291cmNlcyksCisJLnJlc291cmNlID0gYmZpbl9zaXIxX3Jlc291cmNlcywKIH07CiAjZW5kaWYKKyNlbmRpZgogCiAjaWYgZGVmaW5lZChDT05GSUdfSTJDX0JMQUNLRklOX1RXSSkgfHwgZGVmaW5lZChDT05GSUdfSTJDX0JMQUNLRklOX1RXSV9NT0RVTEUpCiBzdGF0aWMgc3RydWN0IHJlc291cmNlIGJmaW5fdHdpMF9yZXNvdXJjZVtdID0gewpAQCAtNjUxLDYgKzY2OSwxMCBAQAogCSZuZXQyMjcyX2JmaW5fZGV2aWNlLAogI2VuZGlmCiAKKyNpZiBkZWZpbmVkKENPTkZJR19VU0JfSVNQMTc2MF9IQ0QpIHx8IGRlZmluZWQoQ09ORklHX1VTQl9JU1AxNzYwX0hDRF9NT0RVTEUpCisJJmJmaW5faXNwMTc2MF9kZXZpY2UsCisjZW5kaWYKKwogI2lmIGRlZmluZWQoQ09ORklHX1NQSV9CRklOKSB8fCBkZWZpbmVkKENPTkZJR19TUElfQkZJTl9NT0RVTEUpCiAJJmJmaW5fc3BpMF9kZXZpY2UsCiAjZW5kaWYKQEAgLTY2OCw3ICs2OTAsMTIgQEAKICNlbmRpZgogCiAjaWYgZGVmaW5lZChDT05GSUdfQkZJTl9TSVIpIHx8IGRlZmluZWQoQ09ORklHX0JGSU5fU0lSX01PRFVMRSkKLQkmYmZpbl9zaXJfZGV2aWNlLAorI2lmZGVmIENPTkZJR19CRklOX1NJUjAKKwkmYmZpbl9zaXIwX2RldmljZSwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19CRklOX1NJUjEKKwkmYmZpbl9zaXIxX2RldmljZSwKKyNlbmRpZgogI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19JMkNfQkxBQ0tGSU5fVFdJKSB8fCBkZWZpbmVkKENPTkZJR19JMkNfQkxBQ0tGSU5fVFdJX01PRFVMRSkKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9ib2FyZHMvbWlub3RhdXIuYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9ib2FyZHMvbWlub3RhdXIuYwppbmRleCA0OGM0Y2QyLi5iYjc5NTM0IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvYm9hcmRzL21pbm90YXVyLmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2JvYXJkcy9taW5vdGF1ci5jCkBAIC0yMjYsMzAgKzIyNiw1OSBAQAogI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19CRklOX1NJUikgfHwgZGVmaW5lZChDT05GSUdfQkZJTl9TSVJfTU9EVUxFKQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBiZmluX3Npcl9yZXNvdXJjZXNbXSA9IHsKICNpZmRlZiBDT05GSUdfQkZJTl9TSVIwCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGJmaW5fc2lyMF9yZXNvdXJjZXNbXSA9IHsKIAl7CiAJCS5zdGFydCA9IDB4RkZDMDA0MDAsCiAJCS5lbmQgPSAweEZGQzAwNEZGLAogCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKIAl9LAorCXsKKwkJLnN0YXJ0ID0gSVJRX1VBUlQwX1JYLAorCQkuZW5kID0gSVJRX1VBUlQwX1JYKzEsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJeworCQkuc3RhcnQgPSBDSF9VQVJUMF9SWCwKKwkJLmVuZCA9IENIX1VBUlQwX1JYKzEsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfRE1BLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX3NpcjBfZGV2aWNlID0geworCS5uYW1lID0gImJmaW5fc2lyIiwKKwkuaWQgPSAwLAorCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShiZmluX3NpcjBfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UgPSBiZmluX3NpcjBfcmVzb3VyY2VzLAorfTsKICNlbmRpZgogI2lmZGVmIENPTkZJR19CRklOX1NJUjEKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYmZpbl9zaXIxX3Jlc291cmNlc1tdID0gewogCXsKIAkJLnN0YXJ0ID0gMHhGRkMwMjAwMCwKIAkJLmVuZCA9IDB4RkZDMDIwRkYsCiAJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAogCX0sCi0jZW5kaWYKKwl7CisJCS5zdGFydCA9IElSUV9VQVJUMV9SWCwKKwkJLmVuZCA9IElSUV9VQVJUMV9SWCsxLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCXsKKwkJLnN0YXJ0ID0gQ0hfVUFSVDFfUlgsCisJCS5lbmQgPSBDSF9VQVJUMV9SWCsxLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0RNQSwKKwl9LAogfTsKIAotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9zaXJfZGV2aWNlID0geworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9zaXIxX2RldmljZSA9IHsKIAkubmFtZSA9ICJiZmluX3NpciIsCi0JLmlkID0gMCwKLQkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUoYmZpbl9zaXJfcmVzb3VyY2VzKSwKLQkucmVzb3VyY2UgPSBiZmluX3Npcl9yZXNvdXJjZXMsCisJLmlkID0gMSwKKwkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUoYmZpbl9zaXIxX3Jlc291cmNlcyksCisJLnJlc291cmNlID0gYmZpbl9zaXIxX3Jlc291cmNlcywKIH07CiAjZW5kaWYKKyNlbmRpZgogCiAjaWYgZGVmaW5lZChDT05GSUdfSTJDX0JMQUNLRklOX1RXSSkgfHwgZGVmaW5lZChDT05GSUdfSTJDX0JMQUNLRklOX1RXSV9NT0RVTEUpCiBzdGF0aWMgc3RydWN0IHJlc291cmNlIGJmaW5fdHdpMF9yZXNvdXJjZVtdID0gewpAQCAtMzExLDcgKzM0MCwxMiBAQAogI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19CRklOX1NJUikgfHwgZGVmaW5lZChDT05GSUdfQkZJTl9TSVJfTU9EVUxFKQotCSZiZmluX3Npcl9kZXZpY2UsCisjaWZkZWYgQ09ORklHX0JGSU5fU0lSMAorCSZiZmluX3NpcjBfZGV2aWNlLAorI2VuZGlmCisjaWZkZWYgQ09ORklHX0JGSU5fU0lSMQorCSZiZmluX3NpcjFfZGV2aWNlLAorI2VuZGlmCiAjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX0kyQ19CTEFDS0ZJTl9UV0kpIHx8IGRlZmluZWQoQ09ORklHX0kyQ19CTEFDS0ZJTl9UV0lfTU9EVUxFKQpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2JvYXJkcy9wbmF2MTAuYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9ib2FyZHMvcG5hdjEwLmMKaW5kZXggZjkxNzRjMS4uODlkZTk0ZiAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2JvYXJkcy9wbmF2MTAuYworKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvYm9hcmRzL3BuYXYxMC5jCkBAIC00OSw3ICs0OSw3IEBACiAvKgogICogTmFtZSB0aGUgQm9hcmQgZm9yIHRoZSAvcHJvYy9jcHVpbmZvCiAgKi8KLWNvbnN0IGNoYXIgYmZpbl9ib2FyZF9uYW1lW10gPSAiUE5BVi0xLjAiOworY29uc3QgY2hhciBiZmluX2JvYXJkX25hbWVbXSA9ICJBREkgUE5BVi0xLjAiOwogCiAvKgogICogIERyaXZlciBuZWVkcyB0byBrbm93IGFkZHJlc3MsIGlycSBhbmQgZmxhZyBwaW4uCkBAIC00NTMsMzAgKzQ1Myw1OSBAQAogI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19CRklOX1NJUikgfHwgZGVmaW5lZChDT05GSUdfQkZJTl9TSVJfTU9EVUxFKQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBiZmluX3Npcl9yZXNvdXJjZXNbXSA9IHsKICNpZmRlZiBDT05GSUdfQkZJTl9TSVIwCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGJmaW5fc2lyMF9yZXNvdXJjZXNbXSA9IHsKIAl7CiAJCS5zdGFydCA9IDB4RkZDMDA0MDAsCiAJCS5lbmQgPSAweEZGQzAwNEZGLAogCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKIAl9LAorCXsKKwkJLnN0YXJ0ID0gSVJRX1VBUlQwX1JYLAorCQkuZW5kID0gSVJRX1VBUlQwX1JYKzEsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJeworCQkuc3RhcnQgPSBDSF9VQVJUMF9SWCwKKwkJLmVuZCA9IENIX1VBUlQwX1JYKzEsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfRE1BLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX3NpcjBfZGV2aWNlID0geworCS5uYW1lID0gImJmaW5fc2lyIiwKKwkuaWQgPSAwLAorCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShiZmluX3NpcjBfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UgPSBiZmluX3NpcjBfcmVzb3VyY2VzLAorfTsKICNlbmRpZgogI2lmZGVmIENPTkZJR19CRklOX1NJUjEKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYmZpbl9zaXIxX3Jlc291cmNlc1tdID0gewogCXsKIAkJLnN0YXJ0ID0gMHhGRkMwMjAwMCwKIAkJLmVuZCA9IDB4RkZDMDIwRkYsCiAJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAogCX0sCi0jZW5kaWYKKwl7CisJCS5zdGFydCA9IElSUV9VQVJUMV9SWCwKKwkJLmVuZCA9IElSUV9VQVJUMV9SWCsxLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCXsKKwkJLnN0YXJ0ID0gQ0hfVUFSVDFfUlgsCisJCS5lbmQgPSBDSF9VQVJUMV9SWCsxLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0RNQSwKKwl9LAogfTsKIAotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9zaXJfZGV2aWNlID0geworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9zaXIxX2RldmljZSA9IHsKIAkubmFtZSA9ICJiZmluX3NpciIsCi0JLmlkID0gMCwKLQkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUoYmZpbl9zaXJfcmVzb3VyY2VzKSwKLQkucmVzb3VyY2UgPSBiZmluX3Npcl9yZXNvdXJjZXMsCisJLmlkID0gMSwKKwkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUoYmZpbl9zaXIxX3Jlc291cmNlcyksCisJLnJlc291cmNlID0gYmZpbl9zaXIxX3Jlc291cmNlcywKIH07CiAjZW5kaWYKKyNlbmRpZgogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqc3RhbXBfZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7CiAjaWYgZGVmaW5lZChDT05GSUdfQkZJTl9DRlBDTUNJQSkgfHwgZGVmaW5lZChDT05GSUdfQkZJTl9DRlBDTUNJQV9NT0RVTEUpCkBAIC01MjAsNyArNTQ5LDEyIEBACiAjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX0JGSU5fU0lSKSB8fCBkZWZpbmVkKENPTkZJR19CRklOX1NJUl9NT0RVTEUpCi0JJmJmaW5fc2lyX2RldmljZSwKKyNpZmRlZiBDT05GSUdfQkZJTl9TSVIwCisJJmJmaW5fc2lyMF9kZXZpY2UsCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQkZJTl9TSVIxCisJJmJmaW5fc2lyMV9kZXZpY2UsCisjZW5kaWYKICNlbmRpZgogfTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2JvYXJkcy9zdGFtcC5jIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2JvYXJkcy9zdGFtcC5jCmluZGV4IDhkMzk0MzkuLmQ4MTJlMjUgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9ib2FyZHMvc3RhbXAuYworKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvYm9hcmRzL3N0YW1wLmMKQEAgLTQ2LDYgKzQ2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC91c2Ivc2w4MTEuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvbW1jX3NwaS5oPgogI2luY2x1ZGUgPGFzbS9kbWEuaD4KICNpbmNsdWRlIDxhc20vYmZpbjV4eF9zcGkuaD4KICNpbmNsdWRlIDxhc20vcmVib290Lmg+CkBAIC01NSw1NyArNTYsNDYgQEAKIC8qCiAgKiBOYW1lIHRoZSBCb2FyZCBmb3IgdGhlIC9wcm9jL2NwdWluZm8KICAqLwotY29uc3QgY2hhciBiZmluX2JvYXJkX25hbWVbXSA9ICJBRERTLUJGNTM3LVNUQU1QIjsKK2NvbnN0IGNoYXIgYmZpbl9ib2FyZF9uYW1lW10gPSAiQURJIEJGNTM3LVNUQU1QIjsKIAogLyoKICAqICBEcml2ZXIgbmVlZHMgdG8ga25vdyBhZGRyZXNzLCBpcnEgYW5kIGZsYWcgcGluLgogICovCiAKLSNkZWZpbmUgSVNQMTc2MV9CQVNFICAgICAgIDB4MjAzQzAwMDAKLSNkZWZpbmUgSVNQMTc2MV9JUlEgICAgICAgIElSUV9QRjcKLQogI2lmIGRlZmluZWQoQ09ORklHX1VTQl9JU1AxNzYwX0hDRCkgfHwgZGVmaW5lZChDT05GSUdfVVNCX0lTUDE3NjBfSENEX01PRFVMRSkKLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYmZpbl9pc3AxNzYxX3Jlc291cmNlc1tdID0geworI2luY2x1ZGUgPGxpbnV4L3VzYi9pc3AxNzYwLmg+CitzdGF0aWMgc3RydWN0IHJlc291cmNlIGJmaW5faXNwMTc2MF9yZXNvdXJjZXNbXSA9IHsKIAlbMF0gPSB7Ci0JCS5uYW1lCT0gImlzcDE3NjEtcmVncyIsCi0JCS5zdGFydCAgPSBJU1AxNzYxX0JBU0UgKyAweDAwMDAwMDAwLAotCQkuZW5kICAgID0gSVNQMTc2MV9CQVNFICsgMHgwMDBmZmZmZiwKKwkJLnN0YXJ0ICA9IDB4MjAzQzAwMDAsCisJCS5lbmQgICAgPSAweDIwM0MwMDAwICsgMHgwMDBmZmZmZiwKIAkJLmZsYWdzICA9IElPUkVTT1VSQ0VfTUVNLAogCX0sCiAJWzFdID0gewotCQkuc3RhcnQgID0gSVNQMTc2MV9JUlEsCi0JCS5lbmQgICAgPSBJU1AxNzYxX0lSUSwKLQkJLmZsYWdzICA9IElPUkVTT1VSQ0VfSVJRLAorCQkuc3RhcnQgID0gSVJRX1BGNywKKwkJLmVuZCAgICA9IElSUV9QRjcsCisJCS5mbGFncyAgPSBJT1JFU09VUkNFX0lSUSB8IElPUkVTT1VSQ0VfSVJRX0xPV0xFVkVMLAogCX0sCiB9OwogCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX2lzcDE3NjFfZGV2aWNlID0gewotCS5uYW1lICAgICAgICAgICA9ICJpc3AxNzYxIiwKK3N0YXRpYyBzdHJ1Y3QgaXNwMTc2MF9wbGF0Zm9ybV9kYXRhIGlzcDE3NjBfcHJpdiA9IHsKKwkuaXNfaXNwMTc2MSA9IDAsCisJLnBvcnQxX2Rpc2FibGUgPSAwLAorCS5idXNfd2lkdGhfMTYgPSAxLAorCS5wb3J0MV9vdGcgPSAwLAorCS5hbmFsb2dfb2MgPSAwLAorCS5kYWNrX3BvbGFyaXR5X2hpZ2ggPSAwLAorCS5kcmVxX3BvbGFyaXR5X2hpZ2ggPSAwLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9pc3AxNzYwX2RldmljZSA9IHsKKwkubmFtZSAgICAgICAgICAgPSAiaXNwMTc2MC1oY2QiLAogCS5pZCAgICAgICAgICAgICA9IDAsCi0JLm51bV9yZXNvdXJjZXMgID0gQVJSQVlfU0laRShiZmluX2lzcDE3NjFfcmVzb3VyY2VzKSwKLQkucmVzb3VyY2UgICAgICAgPSBiZmluX2lzcDE3NjFfcmVzb3VyY2VzLAorCS5kZXYgPSB7CisJCS5wbGF0Zm9ybV9kYXRhID0gJmlzcDE3NjBfcHJpdiwKKwl9LAorCS5udW1fcmVzb3VyY2VzICA9IEFSUkFZX1NJWkUoYmZpbl9pc3AxNzYwX3Jlc291cmNlcyksCisJLnJlc291cmNlICAgICAgID0gYmZpbl9pc3AxNzYwX3Jlc291cmNlcywKIH07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpiZmluX2lzcDE3NjFfZGV2aWNlc1tdID0gewotCSZiZmluX2lzcDE3NjFfZGV2aWNlLAotfTsKLQotaW50IF9faW5pdCBiZmluX2lzcDE3NjFfaW5pdCh2b2lkKQotewotCXVuc2lnbmVkIGludCBudW1fZGV2aWNlcyA9IEFSUkFZX1NJWkUoYmZpbl9pc3AxNzYxX2RldmljZXMpOwotCi0JcHJpbnRrKEtFUk5fSU5GTyAiJXMoKTogcmVnaXN0ZXJpbmcgZGV2aWNlIHJlc291cmNlc1xuIiwgX19mdW5jX18pOwotCXNldF9pcnFfdHlwZShJU1AxNzYxX0lSUSwgSVJRRl9UUklHR0VSX0ZBTExJTkcpOwotCi0JcmV0dXJuIHBsYXRmb3JtX2FkZF9kZXZpY2VzKGJmaW5faXNwMTc2MV9kZXZpY2VzLCBudW1fZGV2aWNlcyk7Ci19Ci0KLXZvaWQgX19leGl0IGJmaW5faXNwMTc2MV9leGl0KHZvaWQpCi17Ci0JcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIoJmJmaW5faXNwMTc2MV9kZXZpY2UpOwotfQotCi1hcmNoX2luaXRjYWxsKGJmaW5faXNwMTc2MV9pbml0KTsKICNlbmRpZgogCiAjaWYgZGVmaW5lZChDT05GSUdfS0VZQk9BUkRfR1BJTykgfHwgZGVmaW5lZChDT05GSUdfS0VZQk9BUkRfR1BJT19NT0RVTEUpCkBAIC00NDMsMTEgKzQzMywxMSBAQAogCQkub2Zmc2V0ICAgICA9IDAsCiAJfSwgewogCQkubmFtZSAgICAgICA9ICJsaW51eCBrZXJuZWwobm9yKSIsCi0JCS5zaXplICAgICAgID0gMHhFMDAwMCwKKwkJLnNpemUgICAgICAgPSAweDE4MDAwMCwKIAkJLm9mZnNldCAgICAgPSBNVERQQVJUX09GU19BUFBFTkQsCiAJfSwgewogCQkubmFtZSAgICAgICA9ICJmaWxlIHN5c3RlbShub3IpIiwKLQkJLnNpemUgICAgICAgPSAweDQwMDAwMCAtIDB4NDAwMDAgLSAweEUwMDAwIC0gMHgxMDAwMCwKKwkJLnNpemUgICAgICAgPSAweDQwMDAwMCAtIDB4NDAwMDAgLSAweDE4MDAwMCAtIDB4MTAwMDAsCiAJCS5vZmZzZXQgICAgID0gTVREUEFSVF9PRlNfQVBQRU5ELAogCX0sIHsKIAkJLm5hbWUgICAgICAgPSAiTUFDIEFkZHJlc3Mobm9yKSIsCkBAIC00OTAsNyArNDgwLDcgQEAKIAkJLm1hc2tfZmxhZ3MgPSBNVERfQ0FQX1JPTQogCX0sIHsKIAkJLm5hbWUgPSAibGludXgga2VybmVsKHNwaSkiLAotCQkuc2l6ZSA9IDB4ZTAwMDAsCisJCS5zaXplID0gMHgxODAwMDAsCiAJCS5vZmZzZXQgPSBNVERQQVJUX09GU19BUFBFTkQsCiAJfSwgewogCQkubmFtZSA9ICJmaWxlIHN5c3RlbShzcGkpIiwKQEAgLTUwMyw3ICs0OTMsNyBAQAogCS5uYW1lID0gIm0yNXA4MCIsCiAJLnBhcnRzID0gYmZpbl9zcGlfZmxhc2hfcGFydGl0aW9ucywKIAkubnJfcGFydHMgPSBBUlJBWV9TSVpFKGJmaW5fc3BpX2ZsYXNoX3BhcnRpdGlvbnMpLAotCS50eXBlID0gIm0yNXA2NCIsCisJLyogLnR5cGUgPSAibTI1cDY0IiwgKi8KIH07CiAKIC8qIFNQSSBmbGFzaCBjaGlwIChtMjVwNjQpICovCkBAIC01MzcsOSArNTI3LDI5IEBACiB9OwogI2VuZGlmCiAKLSNpZiBkZWZpbmVkKENPTkZJR19TUElfTU1DKSB8fCBkZWZpbmVkKENPTkZJR19TUElfTU1DX01PRFVMRSkKLXN0YXRpYyBzdHJ1Y3QgYmZpbjV4eF9zcGlfY2hpcCBzcGlfbW1jX2NoaXBfaW5mbyA9IHsKLQkuZW5hYmxlX2RtYSA9IDEsCisjaWYgZGVmaW5lZChDT05GSUdfTU1DX1NQSSkgfHwgZGVmaW5lZChDT05GSUdfTU1DX1NQSV9NT0RVTEUpCisjZGVmaW5lIE1NQ19TUElfQ0FSRF9ERVRFQ1RfSU5UIElSUV9QRjUKKworc3RhdGljIGludCBiZmluX21tY19zcGlfaW5pdChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJaXJxcmV0dXJuX3QgKCpkZXRlY3RfaW50KShpbnQsIHZvaWQgKiksIHZvaWQgKmRhdGEpCit7CisJcmV0dXJuIHJlcXVlc3RfaXJxKE1NQ19TUElfQ0FSRF9ERVRFQ1RfSU5ULCBkZXRlY3RfaW50LAorCQlJUlFGX1RSSUdHRVJfRkFMTElORywgIm1tYy1zcGktZGV0ZWN0IiwgZGF0YSk7Cit9CisKK3N0YXRpYyB2b2lkIGJmaW5fbW1jX3NwaV9leGl0KHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqZGF0YSkKK3sKKwlmcmVlX2lycShNTUNfU1BJX0NBUkRfREVURUNUX0lOVCwgZGF0YSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbW1jX3NwaV9wbGF0Zm9ybV9kYXRhIGJmaW5fbW1jX3NwaV9wZGF0YSA9IHsKKwkuaW5pdCA9IGJmaW5fbW1jX3NwaV9pbml0LAorCS5leGl0ID0gYmZpbl9tbWNfc3BpX2V4aXQsCisJLmRldGVjdF9kZWxheSA9IDEwMCwgLyogbXNlY3MgKi8KK307CisKK3N0YXRpYyBzdHJ1Y3QgYmZpbjV4eF9zcGlfY2hpcCAgbW1jX3NwaV9jaGlwX2luZm8gPSB7CisJLmVuYWJsZV9kbWEgPSAwLAogCS5iaXRzX3Blcl93b3JkID0gOCwKIH07CiAjZW5kaWYKQEAgLTYxMyw2ICs2MjMsMTQgQEAKIH07CiAjZW5kaWYKIAorI2lmIGRlZmluZWQoQ09ORklHX0VOQzI4SjYwKSB8fCBkZWZpbmVkKENPTkZJR19FTkMyOEo2MF9NT0RVTEUpCitzdGF0aWMgc3RydWN0IGJmaW41eHhfc3BpX2NoaXAgZW5jMjhqNjBfc3BpX2NoaXBfaW5mbyA9IHsKKwkuZW5hYmxlX2RtYQk9IDEsCisJLmJpdHNfcGVyX3dvcmQJPSA4LAorCS5jc19ncGlvID0gR1BJT19QRjEwLAorfTsKKyNlbmRpZgorCiAjaWYgZGVmaW5lZChDT05GSUdfTVREX0RBVEFGTEFTSCkgXAogCXx8IGRlZmluZWQoQ09ORklHX01URF9EQVRBRkxBU0hfTU9EVUxFKQogCkBAIC02MjQsNyArNjQyLDcgQEAKIAkJLm1hc2tfZmxhZ3MgPSBNVERfQ0FQX1JPTQogCX0sIHsKIAkJLm5hbWUgPSAibGludXgga2VybmVsKHNwaSkiLAotCQkuc2l6ZSA9IDB4ZTAwMDAsCisJCS5zaXplID0gMHgxODAwMDAsCiAJCS5vZmZzZXQgPSBNVERQQVJUX09GU19BUFBFTkQsCiAJfSwgewogCQkubmFtZSA9ICJmaWxlIHN5c3RlbShzcGkpIiwKQEAgLTcwMywyMyArNzIxLDE0IEBACiAJCS5jb250cm9sbGVyX2RhdGEgPSAmYWQ5OTYwX3NwaV9jaGlwX2luZm8sCiAJfSwKICNlbmRpZgotI2lmIGRlZmluZWQoQ09ORklHX1NQSV9NTUMpIHx8IGRlZmluZWQoQ09ORklHX1NQSV9NTUNfTU9EVUxFKQorI2lmIGRlZmluZWQoQ09ORklHX01NQ19TUEkpIHx8IGRlZmluZWQoQ09ORklHX01NQ19TUElfTU9EVUxFKQogCXsKLQkJLm1vZGFsaWFzID0gInNwaV9tbWNfZHVtbXkiLAorCQkubW9kYWxpYXMgPSAibW1jX3NwaSIsCiAJCS5tYXhfc3BlZWRfaHogPSAyMDAwMDAwMCwgICAgIC8qIG1heCBzcGkgY2xvY2sgKFNDSykgc3BlZWQgaW4gSFogKi8KIAkJLmJ1c19udW0gPSAwLAotCQkuY2hpcF9zZWxlY3QgPSAwLAotCQkucGxhdGZvcm1fZGF0YSA9IE5VTEwsCi0JCS5jb250cm9sbGVyX2RhdGEgPSAmc3BpX21tY19jaGlwX2luZm8sCi0JCS5tb2RlID0gU1BJX01PREVfMywKLQl9LAotCXsKLQkJLm1vZGFsaWFzID0gInNwaV9tbWMiLAotCQkubWF4X3NwZWVkX2h6ID0gMjAwMDAwMDAsICAgICAvKiBtYXggc3BpIGNsb2NrIChTQ0spIHNwZWVkIGluIEhaICovCi0JCS5idXNfbnVtID0gMCwKLQkJLmNoaXBfc2VsZWN0ID0gQ09ORklHX1NQSV9NTUNfQ1NfQ0hBTiwKLQkJLnBsYXRmb3JtX2RhdGEgPSBOVUxMLAotCQkuY29udHJvbGxlcl9kYXRhID0gJnNwaV9tbWNfY2hpcF9pbmZvLAorCQkuY2hpcF9zZWxlY3QgPSA0LAorCQkucGxhdGZvcm1fZGF0YSA9ICZiZmluX21tY19zcGlfcGRhdGEsCisJCS5jb250cm9sbGVyX2RhdGEgPSAmbW1jX3NwaV9jaGlwX2luZm8sCiAJCS5tb2RlID0gU1BJX01PREVfMywKIAl9LAogI2VuZGlmCkBAIC03ODMsNiArNzkyLDE3IEBACiAJCS5tb2RlID0gU1BJX0NQSEEgfCBTUElfQ1BPTCwKIAl9LAogI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfRU5DMjhKNjApIHx8IGRlZmluZWQoQ09ORklHX0VOQzI4SjYwX01PRFVMRSkKKwl7CisJCS5tb2RhbGlhcyA9ICJlbmMyOGo2MCIsCisJCS5tYXhfc3BlZWRfaHogPSAyMDAwMDAwMCwgICAgIC8qIG1heCBzcGkgY2xvY2sgKFNDSykgc3BlZWQgaW4gSFogKi8KKwkJLmlycSA9IElSUV9QRjYsCisJCS5idXNfbnVtID0gMCwKKwkJLmNoaXBfc2VsZWN0ID0gMCwJLyogR1BJTyBjb250cm9sbGVkIFNTRUwgKi8KKwkJLmNvbnRyb2xsZXJfZGF0YSA9ICZlbmMyOGo2MF9zcGlfY2hpcF9pbmZvLAorCQkubW9kZSA9IFNQSV9NT0RFXzAsCisJfSwKKyNlbmRpZgogfTsKIAogI2lmIGRlZmluZWQoQ09ORklHX1NQSV9CRklOKSB8fCBkZWZpbmVkKENPTkZJR19TUElfQkZJTl9NT0RVTEUpCkBAIC04ODUsMzAgKzkwNSw1OSBAQAogI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19CRklOX1NJUikgfHwgZGVmaW5lZChDT05GSUdfQkZJTl9TSVJfTU9EVUxFKQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBiZmluX3Npcl9yZXNvdXJjZXNbXSA9IHsKICNpZmRlZiBDT05GSUdfQkZJTl9TSVIwCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGJmaW5fc2lyMF9yZXNvdXJjZXNbXSA9IHsKIAl7CiAJCS5zdGFydCA9IDB4RkZDMDA0MDAsCiAJCS5lbmQgPSAweEZGQzAwNEZGLAogCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKIAl9LAorCXsKKwkJLnN0YXJ0ID0gSVJRX1VBUlQwX1JYLAorCQkuZW5kID0gSVJRX1VBUlQwX1JYKzEsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJeworCQkuc3RhcnQgPSBDSF9VQVJUMF9SWCwKKwkJLmVuZCA9IENIX1VBUlQwX1JYKzEsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfRE1BLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX3NpcjBfZGV2aWNlID0geworCS5uYW1lID0gImJmaW5fc2lyIiwKKwkuaWQgPSAwLAorCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShiZmluX3NpcjBfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UgPSBiZmluX3NpcjBfcmVzb3VyY2VzLAorfTsKICNlbmRpZgogI2lmZGVmIENPTkZJR19CRklOX1NJUjEKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYmZpbl9zaXIxX3Jlc291cmNlc1tdID0gewogCXsKIAkJLnN0YXJ0ID0gMHhGRkMwMjAwMCwKIAkJLmVuZCA9IDB4RkZDMDIwRkYsCiAJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAogCX0sCi0jZW5kaWYKKwl7CisJCS5zdGFydCA9IElSUV9VQVJUMV9SWCwKKwkJLmVuZCA9IElSUV9VQVJUMV9SWCsxLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCXsKKwkJLnN0YXJ0ID0gQ0hfVUFSVDFfUlgsCisJCS5lbmQgPSBDSF9VQVJUMV9SWCsxLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0RNQSwKKwl9LAogfTsKIAotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9zaXJfZGV2aWNlID0geworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9zaXIxX2RldmljZSA9IHsKIAkubmFtZSA9ICJiZmluX3NpciIsCi0JLmlkID0gMCwKLQkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUoYmZpbl9zaXJfcmVzb3VyY2VzKSwKLQkucmVzb3VyY2UgPSBiZmluX3Npcl9yZXNvdXJjZXMsCisJLmlkID0gMSwKKwkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUoYmZpbl9zaXIxX3Jlc291cmNlcyksCisJLnJlc291cmNlID0gYmZpbl9zaXIxX3Jlc291cmNlcywKIH07CiAjZW5kaWYKKyNlbmRpZgogCiAjaWYgZGVmaW5lZChDT05GSUdfSTJDX0JMQUNLRklOX1RXSSkgfHwgZGVmaW5lZChDT05GSUdfSTJDX0JMQUNLRklOX1RXSV9NT0RVTEUpCiBzdGF0aWMgc3RydWN0IHJlc291cmNlIGJmaW5fdHdpMF9yZXNvdXJjZVtdID0gewpAQCAtOTMyLDYgKzk4MSw5MyBAQAogfTsKICNlbmRpZgogCisjaWYgZGVmaW5lZChDT05GSUdfS0VZQk9BUkRfQURQNTU4OCkgfHwgZGVmaW5lZChDT05GSUdfS0VZQk9BUkRfQURQNTU4OF9NT0RVTEUpCisjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMvYWRwNTU4OF9rZXlzLmg+CitzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgYWRwNTU4OF9rZXltYXBbQURQNTU4OF9LRVlNQVBTSVpFXSA9IHsKKwlbMF0JID0gS0VZX0dSQVZFLAorCVsxXQkgPSBLRVlfMSwKKwlbMl0JID0gS0VZXzIsCisJWzNdCSA9IEtFWV8zLAorCVs0XQkgPSBLRVlfNCwKKwlbNV0JID0gS0VZXzUsCisJWzZdCSA9IEtFWV82LAorCVs3XQkgPSBLRVlfNywKKwlbOF0JID0gS0VZXzgsCisJWzldCSA9IEtFWV85LAorCVsxMF0JID0gS0VZXzAsCisJWzExXQkgPSBLRVlfTUlOVVMsCisJWzEyXQkgPSBLRVlfRVFVQUwsCisJWzEzXQkgPSBLRVlfQkFDS1NMQVNILAorCVsxNV0JID0gS0VZX0tQMCwKKwlbMTZdCSA9IEtFWV9RLAorCVsxN10JID0gS0VZX1csCisJWzE4XQkgPSBLRVlfRSwKKwlbMTldCSA9IEtFWV9SLAorCVsyMF0JID0gS0VZX1QsCisJWzIxXQkgPSBLRVlfWSwKKwlbMjJdCSA9IEtFWV9VLAorCVsyM10JID0gS0VZX0ksCisJWzI0XQkgPSBLRVlfTywKKwlbMjVdCSA9IEtFWV9QLAorCVsyNl0JID0gS0VZX0xFRlRCUkFDRSwKKwlbMjddCSA9IEtFWV9SSUdIVEJSQUNFLAorCVsyOV0JID0gS0VZX0tQMSwKKwlbMzBdCSA9IEtFWV9LUDIsCisJWzMxXQkgPSBLRVlfS1AzLAorCVszMl0JID0gS0VZX0EsCisJWzMzXQkgPSBLRVlfUywKKwlbMzRdCSA9IEtFWV9ELAorCVszNV0JID0gS0VZX0YsCisJWzM2XQkgPSBLRVlfRywKKwlbMzddCSA9IEtFWV9ILAorCVszOF0JID0gS0VZX0osCisJWzM5XQkgPSBLRVlfSywKKwlbNDBdCSA9IEtFWV9MLAorCVs0MV0JID0gS0VZX1NFTUlDT0xPTiwKKwlbNDJdCSA9IEtFWV9BUE9TVFJPUEhFLAorCVs0M10JID0gS0VZX0JBQ0tTTEFTSCwKKwlbNDVdCSA9IEtFWV9LUDQsCisJWzQ2XQkgPSBLRVlfS1A1LAorCVs0N10JID0gS0VZX0tQNiwKKwlbNDhdCSA9IEtFWV8xMDJORCwKKwlbNDldCSA9IEtFWV9aLAorCVs1MF0JID0gS0VZX1gsCisJWzUxXQkgPSBLRVlfQywKKwlbNTJdCSA9IEtFWV9WLAorCVs1M10JID0gS0VZX0IsCisJWzU0XQkgPSBLRVlfTiwKKwlbNTVdCSA9IEtFWV9NLAorCVs1Nl0JID0gS0VZX0NPTU1BLAorCVs1N10JID0gS0VZX0RPVCwKKwlbNThdCSA9IEtFWV9TTEFTSCwKKwlbNjBdCSA9IEtFWV9LUERPVCwKKwlbNjFdCSA9IEtFWV9LUDcsCisJWzYyXQkgPSBLRVlfS1A4LAorCVs2M10JID0gS0VZX0tQOSwKKwlbNjRdCSA9IEtFWV9TUEFDRSwKKwlbNjVdCSA9IEtFWV9CQUNLU1BBQ0UsCisJWzY2XQkgPSBLRVlfVEFCLAorCVs2N10JID0gS0VZX0tQRU5URVIsCisJWzY4XQkgPSBLRVlfRU5URVIsCisJWzY5XQkgPSBLRVlfRVNDLAorCVs3MF0JID0gS0VZX0RFTEVURSwKKwlbNzRdCSA9IEtFWV9LUE1JTlVTLAorCVs3Nl0JID0gS0VZX1VQLAorCVs3N10JID0gS0VZX0RPV04sCisJWzc4XQkgPSBLRVlfUklHSFQsCisJWzc5XQkgPSBLRVlfTEVGVCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYWRwNTU4OF9rcGFkX3BsYXRmb3JtX2RhdGEgYWRwNTU4OF9rcGFkX2RhdGEgPSB7CisJLnJvd3MJCT0gOCwKKwkuY29scwkJPSAxMCwKKwkua2V5bWFwCQk9IGFkcDU1ODhfa2V5bWFwLAorCS5rZXltYXBzaXplCT0gQVJSQVlfU0laRShhZHA1NTg4X2tleW1hcCksCisJLnJlcGVhdAkJPSAwLAorfTsKKyNlbmRpZgorCiAjaWZkZWYgQ09ORklHX0kyQ19CT0FSRElORk8KIHN0YXRpYyBzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gX19pbml0ZGF0YSBiZmluX2kyY19ib2FyZF9pbmZvW10gPSB7CiAjaWYgZGVmaW5lZChDT05GSUdfSk9ZU1RJQ0tfQUQ3MTQyKSB8fCBkZWZpbmVkKENPTkZJR19KT1lTVElDS19BRDcxNDJfTU9EVUxFKQpAQCAtOTU4LDYgKzEwOTQsMTMgQEAKIAkJLnBsYXRmb3JtX2RhdGEgPSAodm9pZCAqKSZiZmluX2FkNzg3OV90c19pbmZvLAogCX0sCiAjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19LRVlCT0FSRF9BRFA1NTg4KSB8fCBkZWZpbmVkKENPTkZJR19LRVlCT0FSRF9BRFA1NTg4X01PRFVMRSkKKwl7CisJCUkyQ19CT0FSRF9JTkZPKCJhZHA1NTg4LWtleXMiLCAweDM0KSwKKwkJLmlycSA9IElSUV9QRzAsCisJCS5wbGF0Zm9ybV9kYXRhID0gKHZvaWQgKikmYWRwNTU4OF9rcGFkX2RhdGEsCisJfSwKKyNlbmRpZgogfTsKICNlbmRpZgogCkBAIC0xMDU3LDYgKzEyMDAsMTAgQEAKIAkmaXNwMTM2Ml9oY2RfZGV2aWNlLAogI2VuZGlmCiAKKyNpZiBkZWZpbmVkKENPTkZJR19VU0JfSVNQMTc2MF9IQ0QpIHx8IGRlZmluZWQoQ09ORklHX1VTQl9JU1AxNzYwX0hDRF9NT0RVTEUpCisJJmJmaW5faXNwMTc2MF9kZXZpY2UsCisjZW5kaWYKKwogI2lmIGRlZmluZWQoQ09ORklHX1NNQzkxWCkgfHwgZGVmaW5lZChDT05GSUdfU01DOTFYX01PRFVMRSkKIAkmc21jOTF4X2RldmljZSwKICNlbmRpZgpAQCAtMTA5OCw3ICsxMjQ1LDEyIEBACiAjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX0JGSU5fU0lSKSB8fCBkZWZpbmVkKENPTkZJR19CRklOX1NJUl9NT0RVTEUpCi0JJmJmaW5fc2lyX2RldmljZSwKKyNpZmRlZiBDT05GSUdfQkZJTl9TSVIwCisJJmJmaW5fc2lyMF9kZXZpY2UsCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQkZJTl9TSVIxCisJJmJmaW5fc2lyMV9kZXZpY2UsCisjZW5kaWYKICNlbmRpZgogCiAjaWYgZGVmaW5lZChDT05GSUdfSTJDX0JMQUNLRklOX1RXSSkgfHwgZGVmaW5lZChDT05GSUdfSTJDX0JMQUNLRklOX1RXSV9NT0RVTEUpCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvYm9hcmRzL3RjbV9iZjUzNy5jIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2JvYXJkcy90Y21fYmY1MzcuYwppbmRleCBkNWZmNzA1Li4yZjRiMDY2IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvYm9hcmRzL3RjbV9iZjUzNy5jCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9ib2FyZHMvdGNtX2JmNTM3LmMKQEAgLTMwOCw2ICszMDgsMTkgQEAKIH07CiAjZW5kaWYKIAorc3RhdGljIHN0cnVjdCByZXNvdXJjZSBiZmluX2dwaW9zX3Jlc291cmNlcyA9IHsKKwkuc3RhcnQgPSAwLAorCS5lbmQgICA9IE1BWF9CTEFDS0ZJTl9HUElPUyAtIDEsCisJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX2dwaW9zX2RldmljZSA9IHsKKwkubmFtZSA9ICJzaW1wbGUtZ3BpbyIsCisJLmlkID0gLTEsCisJLm51bV9yZXNvdXJjZXMgPSAxLAorCS5yZXNvdXJjZSA9ICZiZmluX2dwaW9zX3Jlc291cmNlcywKK307CisKICNpZiBkZWZpbmVkKENPTkZJR19NVERfR1BJT19BRERSKSB8fCBkZWZpbmVkKENPTkZJR19NVERfR1BJT19BRERSX01PRFVMRSkKIHN0YXRpYyBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiBjbV9wYXJ0aXRpb25zW10gPSB7CiAJewpAQCAtMzc5LDMwICszOTIsNTkgQEAKICNlbmRpZgogCiAjaWYgZGVmaW5lZChDT05GSUdfQkZJTl9TSVIpIHx8IGRlZmluZWQoQ09ORklHX0JGSU5fU0lSX01PRFVMRSkKLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYmZpbl9zaXJfcmVzb3VyY2VzW10gPSB7CiAjaWZkZWYgQ09ORklHX0JGSU5fU0lSMAorc3RhdGljIHN0cnVjdCByZXNvdXJjZSBiZmluX3NpcjBfcmVzb3VyY2VzW10gPSB7CiAJewogCQkuc3RhcnQgPSAweEZGQzAwNDAwLAogCQkuZW5kID0gMHhGRkMwMDRGRiwKIAkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCiAJfSwKKwl7CisJCS5zdGFydCA9IElSUV9VQVJUMF9SWCwKKwkJLmVuZCA9IElSUV9VQVJUMF9SWCsxLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCXsKKwkJLnN0YXJ0ID0gQ0hfVUFSVDBfUlgsCisJCS5lbmQgPSBDSF9VQVJUMF9SWCsxLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0RNQSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9zaXIwX2RldmljZSA9IHsKKwkubmFtZSA9ICJiZmluX3NpciIsCisJLmlkID0gMCwKKwkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUoYmZpbl9zaXIwX3Jlc291cmNlcyksCisJLnJlc291cmNlID0gYmZpbl9zaXIwX3Jlc291cmNlcywKK307CiAjZW5kaWYKICNpZmRlZiBDT05GSUdfQkZJTl9TSVIxCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGJmaW5fc2lyMV9yZXNvdXJjZXNbXSA9IHsKIAl7CiAJCS5zdGFydCA9IDB4RkZDMDIwMDAsCiAJCS5lbmQgPSAweEZGQzAyMEZGLAogCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKIAl9LAotI2VuZGlmCisJeworCQkuc3RhcnQgPSBJUlFfVUFSVDFfUlgsCisJCS5lbmQgPSBJUlFfVUFSVDFfUlgrMSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwl7CisJCS5zdGFydCA9IENIX1VBUlQxX1JYLAorCQkuZW5kID0gQ0hfVUFSVDFfUlgrMSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9ETUEsCisJfSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmaW5fc2lyX2RldmljZSA9IHsKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmaW5fc2lyMV9kZXZpY2UgPSB7CiAJLm5hbWUgPSAiYmZpbl9zaXIiLAotCS5pZCA9IDAsCi0JLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKGJmaW5fc2lyX3Jlc291cmNlcyksCi0JLnJlc291cmNlID0gYmZpbl9zaXJfcmVzb3VyY2VzLAorCS5pZCA9IDEsCisJLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKGJmaW5fc2lyMV9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZSA9IGJmaW5fc2lyMV9yZXNvdXJjZXMsCiB9OwogI2VuZGlmCisjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX0kyQ19CTEFDS0ZJTl9UV0kpIHx8IGRlZmluZWQoQ09ORklHX0kyQ19CTEFDS0ZJTl9UV0lfTU9EVUxFKQogc3RhdGljIHN0cnVjdCByZXNvdXJjZSBiZmluX3R3aTBfcmVzb3VyY2VbXSA9IHsKQEAgLTUyNSw3ICs1NjcsMTIgQEAKICNlbmRpZgogCiAjaWYgZGVmaW5lZChDT05GSUdfQkZJTl9TSVIpIHx8IGRlZmluZWQoQ09ORklHX0JGSU5fU0lSX01PRFVMRSkKLQkmYmZpbl9zaXJfZGV2aWNlLAorI2lmZGVmIENPTkZJR19CRklOX1NJUjAKKwkmYmZpbl9zaXIwX2RldmljZSwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19CRklOX1NJUjEKKwkmYmZpbl9zaXIxX2RldmljZSwKKyNlbmRpZgogI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19JMkNfQkxBQ0tGSU5fVFdJKSB8fCBkZWZpbmVkKENPTkZJR19JMkNfQkxBQ0tGSU5fVFdJX01PRFVMRSkKQEAgLTU2NCw2ICs2MTEsOCBAQAogI2lmIGRlZmluZWQoQ09ORklHX01URF9HUElPX0FERFIpIHx8IGRlZmluZWQoQ09ORklHX01URF9HUElPX0FERFJfTU9EVUxFKQogCSZjbV9mbGFzaF9kZXZpY2UsCiAjZW5kaWYKKworCSZiZmluX2dwaW9zX2RldmljZSwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IGNtX2JmNTM3X2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9kbWEuYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9kbWEuYwppbmRleCA0ZWRiMzYzLi44MTE4NTA1IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvZG1hLmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2RtYS5jCkBAIC0zMSw3ICszMSw3IEBACiAjaW5jbHVkZSA8YXNtL2JsYWNrZmluLmg+CiAjaW5jbHVkZSA8YXNtL2RtYS5oPgogCi1zdHJ1Y3QgZG1hX3JlZ2lzdGVyICpkbWFfaW9fYmFzZV9hZGRyW01BWF9CTEFDS0ZJTl9ETUFfQ0hBTk5FTF0gPSB7CitzdHJ1Y3QgZG1hX3JlZ2lzdGVyICpkbWFfaW9fYmFzZV9hZGRyW01BWF9ETUFfQ0hBTk5FTFNdID0gewogCShzdHJ1Y3QgZG1hX3JlZ2lzdGVyICopIERNQTBfTkVYVF9ERVNDX1BUUiwKIAkoc3RydWN0IGRtYV9yZWdpc3RlciAqKSBETUExX05FWFRfREVTQ19QVFIsCiAJKHN0cnVjdCBkbWFfcmVnaXN0ZXIgKikgRE1BMl9ORVhUX0RFU0NfUFRSLApkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2hlYWQuUyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9oZWFkLlMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1Yzk0YmYuLjAwMDAwMDAKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2hlYWQuUworKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi0vKgotICogRmlsZTogICAgICAgICBhcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvaGVhZC5TCi0gKiBCYXNlZCBvbjogICAgIGFyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9oZWFkLlMKLSAqIEF1dGhvcjogICAgICAgSmVmZiBEaW9ubmUgPGplZmZAdWNsaW51eC5vcmc+IENPUFlSSUdIVCAxOTk4IEQuIEplZmYgRGlvbm5lCi0gKgotICogQ3JlYXRlZDogICAgICAxOTk4Ci0gKiBEZXNjcmlwdGlvbjogIFN0YXJ0dXAgY29kZSBmb3IgQmxhY2tmaW4gQkY1MzcKLSAqCi0gKiBNb2RpZmllZDoKLSAqICAgICAgICAgICAgICAgQ29weXJpZ2h0IDIwMDQtMjAwNiBBbmFsb2cgRGV2aWNlcyBJbmMuCi0gKgotICogQnVnczogICAgICAgICBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSB0aGUgZmlsZSBDT1BZSU5HLCBvciB3cml0ZQotICogdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8YXNtL2JsYWNrZmluLmg+Ci0jaWZkZWYgQ09ORklHX0JGSU5fS0VSTkVMX0NMT0NLCi0jaW5jbHVkZSA8YXNtL2Nsb2Nrcy5oPgotI2luY2x1ZGUgPG1hY2gvbWVtX2luaXQuaD4KLSNlbmRpZgotCi0uc2VjdGlvbiAubDEudGV4dAotI2lmZGVmIENPTkZJR19CRklOX0tFUk5FTF9DTE9DSwotRU5UUlkoX3N0YXJ0X2RtYV9jb2RlKQotCi0JLyogRW5hYmxlIFBIWSBDTEsgYnVmZmVyIG91dHB1dCAqLwotCXAwLmggPSBoaShWUl9DVEwpOwotCXAwLmwgPSBsbyhWUl9DVEwpOwotCXIwLmwgPSB3W3AwXTsKLQliaXRzZXQocjAsIDE0KTsKLQl3W3AwXSA9IHIwLmw7Ci0Jc3N5bmM7Ci0KLQlwMC5oID0gaGkoU0lDX0lXUik7Ci0JcDAubCA9IGxvKFNJQ19JV1IpOwotCXIwLmwgPSAweDE7Ci0JcjAuaCA9IDB4MDsKLQlbcDBdID0gcjA7Ci0JU1NZTkM7Ci0KLQkvKgotCSAqICBTZXQgUExMX0NUTAotCSAqICAgLSBbMTQ6MDldID0gTVNFTFs1OjBdIDogQ0xLSU4gLyBWQ08gbXVsdGlwbGljYXRpb24gZmFjdG9ycwotCSAqICAgLSBbOF0gICAgID0gQllQQVNTICAgIDogQllQQVNTIHRoZSBQTEwsIHJ1biBDTEtJTiBpbnRvIENDTEsvU0NMSwotCSAqICAgLSBbN10gICAgID0gb3V0cHV0IGRlbGF5IChhZGQgMjAwcHMgb2YgZGVsYXkgdG8gbWVtIHNpZ25hbHMpCi0JICogICAtIFs2XSAgICAgPSBpbnB1dCBkZWxheSAoYWRkIDIwMHBzIG9mIGlucHV0IGRlbGF5IHRvIG1lbSBzaWduYWxzKQotCSAqICAgLSBbNV0gICAgID0gUERXTiAgICAgIDogMT1BbGwgQ2xvY2tzIG9mZgotCSAqICAgLSBbM10gICAgID0gU1RPUENLICAgIDogMT1Db3JlIENsb2NrIG9mZgotCSAqICAgLSBbMV0gICAgID0gUExMX09GRiAgIDogMT1EaXNhYmxlIFBvd2VyIHRvIFBMTAotCSAqICAgLSBbMF0gICAgID0gREYgICAgICAgIDogMT1QYXNzIENMS0lOLzIgdG8gUExMIC8gMD1QYXNzIENMS0lOIHRvIFBMTAotCSAqICAgYWxsIG90aGVyIGJpdHMgc2V0IHRvIHplcm8KLQkgKi8KLQotCXAwLmggPSBoaShQTExfTE9DS0NOVCk7Ci0JcDAubCA9IGxvKFBMTF9MT0NLQ05UKTsKLQlyMCA9IDB4MzAwKFopOwotCXdbcDBdID0gcjAubDsKLQlzc3luYzsKLQotCVAyLkggPSBoaShFQklVX1NER0NUTCk7Ci0JUDIuTCA9IGxvKEVCSVVfU0RHQ1RMKTsKLQlSMCA9IFtQMl07Ci0JQklUU0VUIChSMCwgMjQpOwotCVtQMl0gPSBSMDsKLQlTU1lOQzsKLQotCXIwID0gQ09ORklHX1ZDT19NVUxUICYgNjM7ICAgICAgIC8qIExvYWQgdGhlIFZDTyBtdWx0aXBsaWVyICAgICAgICAgKi8KLQlyMCA9IHIwIDw8IDk7ICAgICAgICAgICAgICAgICAgICAvKiBTaGlmdCBpdCBvdmVyLCAgICAgICAgICAgICAgICAgICovCi0JcjEgPSBDTEtJTl9IQUxGOyAgICAgICAgICAgICAgICAgLyogRG8gd2UgbmVlZCB0byBkaXZpZGUgQ0xLSU4gYnkgMj8qLwotCXIwID0gcjEgfCByMDsKLQlyMSA9IFBMTF9CWVBBU1M7ICAgICAgICAgICAgICAgICAvKiBCeXBhc3MgdGhlIFBMTD8gICAgICAgICAgICAgICAgICovCi0JcjEgPSByMSA8PCA4OyAgICAgICAgICAgICAgICAgICAgLyogU2hpZnQgaXQgb3ZlciAgICAgICAgICAgICAgICAgICAqLwotCXIwID0gcjEgfCByMDsgICAgICAgICAgICAgICAgICAgIC8qIGFkZCB0aGVtIGFsbCB0b2dldGhlciAgICAgICAgICAgKi8KLSNpZmRlZiBBTk9NQUxZXzA1MDAwMjY1Ci0JQklUU0VUKHIwLCAxNSk7ICAgICAgICAgICAgICAgICAgLyogQWRkIDI1MCBtViBvZiBoeXN0ZXJlc2lzIHRvIFNQT1JUIGlucHV0IHBpbnMgKi8KLSNlbmRpZgotCi0JcDAuaCA9IGhpKFBMTF9DVEwpOwotCXAwLmwgPSBsbyhQTExfQ1RMKTsgICAgICAgICAgICAgIC8qIExvYWQgdGhlIGFkZHJlc3MgICAgICAgICAgICAgICAgKi8KLQljbGkgcjI7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEaXNhYmxlIGludGVycnVwdHMgICAgICAgICAgICAgICovCi0Jc3N5bmM7Ci0Jd1twMF0gPSByMC5sOyAgICAgICAgICAgICAgICAgICAgLyogU2V0IHRoZSB2YWx1ZSAgICAgICAgICAgICAgICAgICAqLwotCWlkbGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFdhaXQgZm9yIHRoZSBQTEwgdG8gc3RhYmxpemUgICAgKi8KLQlzdGkgcjI7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBFbmFibGUgaW50ZXJydXB0cyAgICAgICAgICAgICAgICovCi0KLS5MY2hlY2tfYWdhaW46Ci0JcDAuaCA9IGhpKFBMTF9TVEFUKTsKLQlwMC5sID0gbG8oUExMX1NUQVQpOwotCVIwID0gV1tQMF0oWik7Ci0JQ0MgPSBCSVRUU1QoUjAsNSk7Ci0JaWYgISBDQyBqdW1wIC5MY2hlY2tfYWdhaW47Ci0KLQkvKiBDb25maWd1cmUgU0NMSyAmIENDTEsgRGl2aWRlcnMgKi8KLQlyMCA9IChDT05GSUdfQ0NMS19BQ1RfRElWIHwgQ09ORklHX1NDTEtfRElWKTsKLQlwMC5oID0gaGkoUExMX0RJVik7Ci0JcDAubCA9IGxvKFBMTF9ESVYpOwotCXdbcDBdID0gcjAubDsKLQlzc3luYzsKLQotCXAwLmwgPSBsbyhFQklVX1NEUlJDKTsKLQlwMC5oID0gaGkoRUJJVV9TRFJSQyk7Ci0JcjAgPSBtZW1fU0RSUkM7Ci0Jd1twMF0gPSByMC5sOwotCXNzeW5jOwotCi0JUDIuSCA9IGhpKEVCSVVfU0RHQ1RMKTsKLQlQMi5MID0gbG8oRUJJVV9TREdDVEwpOwotCVIwID0gW1AyXTsKLQlCSVRDTFIgKFIwLCAyNCk7Ci0JcDAuaCA9IGhpKEVCSVVfU0RTVEFUKTsKLQlwMC5sID0gbG8oRUJJVV9TRFNUQVQpOwotCXIyLmwgPSB3W3AwXTsKLQljYyA9IGJpdHRzdChyMiwzKTsKLQlpZiAhY2MganVtcCAuTHNraXA7Ci0JTk9QOwotCUJJVFNFVCAoUjAsIDIzKTsKLS5Mc2tpcDoKLQlbUDJdID0gUjA7Ci0JU1NZTkM7Ci0KLQlSMC5MID0gbG8obWVtX1NER0NUTCk7Ci0JUjAuSCA9IGhpKG1lbV9TREdDVEwpOwotCVIxID0gW3AyXTsKLQlSMSA9IFIxIHwgUjA7Ci0JW1AyXSA9IFIxOwotCVNTWU5DOwotCi0JUlRTOwotRU5EUFJPQyhfc3RhcnRfZG1hX2NvZGUpCi0jZW5kaWYgLyogQ09ORklHX0JGSU5fS0VSTkVMX0NMT0NLICovCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvaW5jbHVkZS9tYWNoL2Fub21hbHkuaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9pbmNsdWRlL21hY2gvYW5vbWFseS5oCmluZGV4IGM2ODk5MjQuLjljYjM5MTIgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9pbmNsdWRlL21hY2gvYW5vbWFseS5oCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9pbmNsdWRlL21hY2gvYW5vbWFseS5oCkBAIC03LDcgKzcsNyBAQAogICovCiAKIC8qIFRoaXMgZmlsZSBzaG91bGUgYmUgdXAgdG8gZGF0ZSB3aXRoOgotICogIC0gUmV2aXNpb24gQywgMDIvMDgvMjAwODsgQURTUC1CRjUzNC9BRFNQLUJGNTM2L0FEU1AtQkY1MzcgQmxhY2tmaW4gUHJvY2Vzc29yIEFub21hbHkgTGlzdAorICogIC0gUmV2aXNpb24gRCwgMDkvMTgvMjAwODsgQURTUC1CRjUzNC9BRFNQLUJGNTM2L0FEU1AtQkY1MzcgQmxhY2tmaW4gUHJvY2Vzc29yIEFub21hbHkgTGlzdAogICovCiAKICNpZm5kZWYgX01BQ0hfQU5PTUFMWV9IXwpAQCAtMTQ4LDYgKzE0OCwxNCBAQAogI2RlZmluZSBBTk9NQUxZXzA1MDAwNDAyIChfX1NJTElDT05fUkVWSVNJT05fXyA+PSA1KQogLyogTGV2ZWwtU2Vuc2l0aXZlIEV4dGVybmFsIEdQSU8gV2FrZXVwcyBNYXkgQ2F1c2UgSW5kZWZpbml0ZSBTdGFsbCAqLwogI2RlZmluZSBBTk9NQUxZXzA1MDAwNDAzICgxKQorLyogU3BlY3VsYXRpdmUgRmV0Y2hlcyBDYW4gQ2F1c2UgVW5kZXNpcmVkIEV4dGVybmFsIEZJRk8gT3BlcmF0aW9ucyAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwNDE2ICgxKQorLyogTXVsdGljaGFubmVsIFNQT1JUIENoYW5uZWwgTWlzYWxpZ25tZW50IFVuZGVyIFNwZWNpZmljIENvbmZpZ3VyYXRpb24gKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDQyNSAoMSkKKy8qIFNwZWN1bGF0aXZlIEZldGNoZXMgb2YgSW5kaXJlY3QtUG9pbnRlciBJbnN0cnVjdGlvbnMgQ2FuIENhdXNlIEZhbHNlIEhhcmR3YXJlIEVycm9ycyAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwNDI2ICgxKQorLyogSUZMVVNIIEluc3RydWN0aW9uIGF0IEVuZCBvZiBIYXJkd2FyZSBMb29wIENhdXNlcyBJbmZpbml0ZSBTdGFsbCAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwNDQzICgxKQogCiAvKiBBbm9tYWxpZXMgdGhhdCBkb24ndCBleGlzdCBvbiB0aGlzIHByb2MgKi8KICNkZWZpbmUgQU5PTUFMWV8wNTAwMDEyNSAoMCkKQEAgLTE2MSw1ICsxNjksOCBAQAogI2RlZmluZSBBTk9NQUxZXzA1MDAwMzUzICgxKQogI2RlZmluZSBBTk9NQUxZXzA1MDAwMzYzICgwKQogI2RlZmluZSBBTk9NQUxZXzA1MDAwMzg2ICgxKQorI2RlZmluZSBBTk9NQUxZXzA1MDAwNDEyICgwKQorI2RlZmluZSBBTk9NQUxZXzA1MDAwNDMyICgwKQorI2RlZmluZSBBTk9NQUxZXzA1MDAwNDM1ICgwKQogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9pbmNsdWRlL21hY2gvYmY1MzcuaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9pbmNsdWRlL21hY2gvYmY1MzcuaAppbmRleCAyNGQ1YzlkLi5mMTk0YTg0IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvaW5jbHVkZS9tYWNoL2JmNTM3LmgKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2luY2x1ZGUvbWFjaC9iZjUzNy5oCkBAIC0xMzMsNyArMTMzLDcgQEAKICNlbmRpZgogCiAjaWZuZGVmIENQVQotI2Vycm9yIFVua25vd24gQ1BVIHR5cGUgLSBUaGlzIGtlcm5lbCBkb2Vzbid0IHNlZW0gdG8gYmUgY29uZmlndXJlZCBwcm9wZXJseQorI2Vycm9yICJVbmtub3duIENQVSB0eXBlIC0gVGhpcyBrZXJuZWwgZG9lc24ndCBzZWVtIHRvIGJlIGNvbmZpZ3VyZWQgcHJvcGVybHkiCiAjZW5kaWYKIAogI2VuZGlmCQkJCS8qIF9fTUFDSF9CRjUzN19IX18gICovCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvaW5jbHVkZS9tYWNoL2JmaW5fc2lyLmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvaW5jbHVkZS9tYWNoL2JmaW5fc2lyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmZDhhZDQuLjAwMDAwMDAKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2luY2x1ZGUvbWFjaC9iZmluX3Npci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTQyICswLDAgQEAKLS8qCi0gKiBCbGFja2ZpbiBJbmZyYS1yZWQgRHJpdmVyCi0gKgotICogQ29weXJpZ2h0IDIwMDYtMjAwOCBBbmFsb2cgRGV2aWNlcyBJbmMuCi0gKgotICogRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgotICoKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvc2VyaWFsLmg+Ci0jaW5jbHVkZSA8YXNtL2RtYS5oPgotI2luY2x1ZGUgPGFzbS9wb3J0bXV4Lmg+Ci0KLSNkZWZpbmUgU0lSX1VBUlRfR0VUX0NIQVIocG9ydCkgICBiZmluX3JlYWQxNigocG9ydCktPm1lbWJhc2UgKyBPRkZTRVRfUkJSKQotI2RlZmluZSBTSVJfVUFSVF9HRVRfRExMKHBvcnQpICAgIGJmaW5fcmVhZDE2KChwb3J0KS0+bWVtYmFzZSArIE9GRlNFVF9ETEwpCi0jZGVmaW5lIFNJUl9VQVJUX0dFVF9JRVIocG9ydCkgICAgYmZpbl9yZWFkMTYoKHBvcnQpLT5tZW1iYXNlICsgT0ZGU0VUX0lFUikKLSNkZWZpbmUgU0lSX1VBUlRfR0VUX0RMSChwb3J0KSAgICBiZmluX3JlYWQxNigocG9ydCktPm1lbWJhc2UgKyBPRkZTRVRfRExIKQotI2RlZmluZSBTSVJfVUFSVF9HRVRfSUlSKHBvcnQpICAgIGJmaW5fcmVhZDE2KChwb3J0KS0+bWVtYmFzZSArIE9GRlNFVF9JSVIpCi0jZGVmaW5lIFNJUl9VQVJUX0dFVF9MQ1IocG9ydCkgICAgYmZpbl9yZWFkMTYoKHBvcnQpLT5tZW1iYXNlICsgT0ZGU0VUX0xDUikKLSNkZWZpbmUgU0lSX1VBUlRfR0VUX0dDVEwocG9ydCkgICBiZmluX3JlYWQxNigocG9ydCktPm1lbWJhc2UgKyBPRkZTRVRfR0NUTCkKLQotI2RlZmluZSBTSVJfVUFSVF9QVVRfQ0hBUihwb3J0LCB2KSBiZmluX3dyaXRlMTYoKChwb3J0KS0+bWVtYmFzZSArIE9GRlNFVF9USFIpLCB2KQotI2RlZmluZSBTSVJfVUFSVF9QVVRfRExMKHBvcnQsIHYpICBiZmluX3dyaXRlMTYoKChwb3J0KS0+bWVtYmFzZSArIE9GRlNFVF9ETEwpLCB2KQotI2RlZmluZSBTSVJfVUFSVF9QVVRfSUVSKHBvcnQsIHYpICBiZmluX3dyaXRlMTYoKChwb3J0KS0+bWVtYmFzZSArIE9GRlNFVF9JRVIpLCB2KQotI2RlZmluZSBTSVJfVUFSVF9QVVRfRExIKHBvcnQsIHYpICBiZmluX3dyaXRlMTYoKChwb3J0KS0+bWVtYmFzZSArIE9GRlNFVF9ETEgpLCB2KQotI2RlZmluZSBTSVJfVUFSVF9QVVRfTENSKHBvcnQsIHYpICBiZmluX3dyaXRlMTYoKChwb3J0KS0+bWVtYmFzZSArIE9GRlNFVF9MQ1IpLCB2KQotI2RlZmluZSBTSVJfVUFSVF9QVVRfR0NUTChwb3J0LCB2KSBiZmluX3dyaXRlMTYoKChwb3J0KS0+bWVtYmFzZSArIE9GRlNFVF9HQ1RMKSwgdikKLQotI2lmZGVmIENPTkZJR19TSVJfQkZJTl9ETUEKLXN0cnVjdCBkbWFfcnhfYnVmIHsKLQljaGFyICpidWY7Ci0JaW50IGhlYWQ7Ci0JaW50IHRhaWw7Ci0JfTsKLSNlbmRpZiAvKiBDT05GSUdfU0lSX0JGSU5fRE1BICovCi0KLXN0cnVjdCBiZmluX3Npcl9wb3J0IHsKLQl1bnNpZ25lZCBjaGFyIF9faW9tZW0gICAqbWVtYmFzZTsKLQl1bnNpZ25lZCBpbnQgICAgICAgICAgICBpcnE7Ci0JdW5zaWduZWQgaW50ICAgICAgICAgICAgbHNyOwotCXVuc2lnbmVkIGxvbmcgICAgICAgICAgIGNsazsKLQlzdHJ1Y3QgbmV0X2RldmljZSAgICAgICAqZGV2OwotI2lmZGVmIENPTkZJR19TSVJfQkZJTl9ETUEKLQlpbnQgICAgICAgICAgICAgICAgICAgICB0eF9kb25lOwotCXN0cnVjdCBkbWFfcnhfYnVmICAgICAgIHJ4X2RtYV9idWY7Ci0Jc3RydWN0IHRpbWVyX2xpc3QgICAgICAgcnhfZG1hX3RpbWVyOwotCWludCAgICAgICAgICAgICAgICAgICAgIHJ4X2RtYV9ucm93czsKLSNlbmRpZiAvKiBDT05GSUdfU0lSX0JGSU5fRE1BICovCi0JdW5zaWduZWQgaW50ICAgICAgICAgICAgdHhfZG1hX2NoYW5uZWw7Ci0JdW5zaWduZWQgaW50ICAgICAgICAgICAgcnhfZG1hX2NoYW5uZWw7Ci19OwotCi1zdHJ1Y3QgYmZpbl9zaXJfcG9ydCBzaXJfcG9ydHNbQkZJTl9VQVJUX05SX1BPUlRTXTsKLQotc3RydWN0IGJmaW5fc2lyX3BvcnRfcmVzIHsKLQl1bnNpZ25lZCBsb25nICAgYmFzZV9hZGRyOwotCWludCAgICAgICAgICAgICBpcnE7Ci0JdW5zaWduZWQgaW50ICAgIHJ4X2RtYV9jaGFubmVsOwotCXVuc2lnbmVkIGludCAgICB0eF9kbWFfY2hhbm5lbDsKLX07Ci0KLXN0cnVjdCBiZmluX3Npcl9wb3J0X3JlcyBiZmluX3Npcl9wb3J0X3Jlc291cmNlW10gPSB7Ci0jaWZkZWYgQ09ORklHX0JGSU5fU0lSMAotCXsKLQkweEZGQzAwNDAwLAotCUlSUV9VQVJUMF9SWCwKLQlDSF9VQVJUMF9SWCwKLQlDSF9VQVJUMF9UWCwKLQl9LAotI2VuZGlmCi0jaWZkZWYgQ09ORklHX0JGSU5fU0lSMQotCXsKLQkweEZGQzAyMDAwLAotCUlSUV9VQVJUMV9SWCwKLQlDSF9VQVJUMV9SWCwKLQlDSF9VQVJUMV9UWCwKLQl9LAotI2VuZGlmCi19OwotCi1pbnQgbnJfc2lycyA9IEFSUkFZX1NJWkUoYmZpbl9zaXJfcG9ydF9yZXNvdXJjZSk7Ci0KLXN0cnVjdCBiZmluX3Npcl9zZWxmIHsKLQlzdHJ1Y3QgYmZpbl9zaXJfcG9ydCAgICAqc2lyX3BvcnQ7Ci0Jc3BpbmxvY2tfdCAgICAgICAgICAgICAgbG9jazsKLQl1bnNpZ25lZCBpbnQgICAgICAgICAgICBvcGVuOwotCWludCAgICAgICAgICAgICAgICAgICAgIHNwZWVkOwotCWludCAgICAgICAgICAgICAgICAgICAgIG5ld3NwZWVkOwotCi0Jc3RydWN0IHNrX2J1ZmYgICAgICAgICAgKnR4c2tiOwotCXN0cnVjdCBza19idWZmICAgICAgICAgICpyeHNrYjsKLQlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKLQlzdHJ1Y3QgZGV2aWNlICAgICAgICAgICAqZGV2OwotCXN0cnVjdCBpcmxhcF9jYiAgICAgICAgICppcmxhcDsKLQlzdHJ1Y3QgcW9zX2luZm8gICAgICAgICBxb3M7Ci0KLQlpb2J1ZmZfdCAgICAgICAgICAgICAgICB0eF9idWZmOwotCWlvYnVmZl90ICAgICAgICAgICAgICAgIHJ4X2J1ZmY7Ci0KLQlzdHJ1Y3Qgd29ya19zdHJ1Y3QgICAgICB3b3JrOwotCWludCAgICAgICAgICAgICAgICAgICAgIG10dDsKLX07Ci0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IFNJUl9VQVJUX0dFVF9MU1Ioc3RydWN0IGJmaW5fc2lyX3BvcnQgKnBvcnQpCi17Ci0JdW5zaWduZWQgaW50IGxzciA9IGJmaW5fcmVhZDE2KHBvcnQtPm1lbWJhc2UgKyBPRkZTRVRfTFNSKTsKLQlwb3J0LT5sc3IgfD0gKGxzciAmIChCSXxGRXxQRXxPRSkpOwotCXJldHVybiBsc3IgfCBwb3J0LT5sc3I7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBTSVJfVUFSVF9DTEVBUl9MU1Ioc3RydWN0IGJmaW5fc2lyX3BvcnQgKnBvcnQpCi17Ci0JcG9ydC0+bHNyID0gMDsKLQliZmluX3JlYWQxNihwb3J0LT5tZW1iYXNlICsgT0ZGU0VUX0xTUik7Ci19Ci0KLSNkZWZpbmUgRFJJVkVSX05BTUUgImJmaW5fc2lyIgotCi1zdGF0aWMgaW50IGJmaW5fc2lyX2h3X2luaXQodm9pZCkKLXsKLQlpbnQgcmV0ID0gLUVOT0RFVjsKLSNpZmRlZiBDT05GSUdfQkZJTl9TSVIwCi0JcmV0ID0gcGVyaXBoZXJhbF9yZXF1ZXN0KFBfVUFSVDBfVFgsIERSSVZFUl9OQU1FKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCXJldCA9IHBlcmlwaGVyYWxfcmVxdWVzdChQX1VBUlQwX1JYLCBEUklWRVJfTkFNRSk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLSNlbmRpZgotCi0jaWZkZWYgQ09ORklHX0JGSU5fU0lSMQotCXJldCA9IHBlcmlwaGVyYWxfcmVxdWVzdChQX1VBUlQxX1RYLCBEUklWRVJfTkFNRSk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQlyZXQgPSBwZXJpcGhlcmFsX3JlcXVlc3QoUF9VQVJUMV9SWCwgRFJJVkVSX05BTUUpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0jZW5kaWYKLQlyZXR1cm4gcmV0OwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2luY2x1ZGUvbWFjaC9ibGFja2Zpbi5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2luY2x1ZGUvbWFjaC9ibGFja2Zpbi5oCmluZGV4IGNmZmM3ODYuLjdkNjA2OWMgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9pbmNsdWRlL21hY2gvYmxhY2tmaW4uaAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvaW5jbHVkZS9tYWNoL2JsYWNrZmluLmgKQEAgLTgyLDcgKzgyLDcgQEAKICNkZWZpbmUgU1RBVFVTX1AxCTB4MDIKICNkZWZpbmUgU1RBVFVTX1AwCTB4MDEKIAotLyogRE1BIENoYW5ubmVsICovCisvKiBETUEgQ2hhbm5lbCAqLwogI2RlZmluZSBiZmluX3JlYWRfQ0hfVUFSVF9SWCgpIGJmaW5fcmVhZF9DSF9VQVJUMF9SWCgpCiAjZGVmaW5lIGJmaW5fd3JpdGVfQ0hfVUFSVF9SWCh2YWwpIGJmaW5fd3JpdGVfQ0hfVUFSVDBfUlgodmFsKQogI2RlZmluZSBDSF9VQVJUX1JYIENIX1VBUlQwX1JYCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvaW5jbHVkZS9tYWNoL2NkZWZCRjUzNC5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2luY2x1ZGUvbWFjaC9jZGVmQkY1MzQuaAppbmRleCA4OGQ0OTFjLi41ZjhiNWY4IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvaW5jbHVkZS9tYWNoL2NkZWZCRjUzNC5oCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9pbmNsdWRlL21hY2gvY2RlZkJGNTM0LmgKQEAgLTQwLDU1ICs0MCwxMSBAQAogLyogSW5jbHVkZSBjb3JlIHNwZWNpZmljIHJlZ2lzdGVyIHBvaW50ZXIgZGVmaW5pdGlvbnMgCQkJCQkJCQkqLwogI2luY2x1ZGUgPGFzbS9jZGVmX0xQQmxhY2tmaW4uaD4KIAotI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KLQogLyogQ2xvY2sgYW5kIFN5c3RlbSBDb250cm9sCSgweEZGQzAwMDAwIC0gMHhGRkMwMDBGRikJCQkJCQkJCSovCiAjZGVmaW5lIGJmaW5fcmVhZF9QTExfQ1RMKCkgICAgICAgICAgICAgICAgICBiZmluX3JlYWQxNihQTExfQ1RMKQotLyogV3JpdGluZyB0byBQTExfQ1RMIGluaXRpYXRlcyBhIFBMTCByZWxvY2sgc2VxdWVuY2UuICovCi1zdGF0aWMgX19pbmxpbmVfXyB2b2lkIGJmaW5fd3JpdGVfUExMX0NUTCh1bnNpZ25lZCBpbnQgdmFsKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIGl3cjsKLQotCWlmICh2YWwgPT0gYmZpbl9yZWFkX1BMTF9DVEwoKSkKLQkJcmV0dXJuOwotCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCS8qIEVuYWJsZSB0aGUgUExMIFdha2V1cCBiaXQgaW4gU0lDIElXUiAqLwotCWl3ciA9IGJmaW5fcmVhZDMyKFNJQ19JV1IpOwotCS8qIE9ubHkgYWxsb3cgUFBMIFdha2V1cCkgKi8KLQliZmluX3dyaXRlMzIoU0lDX0lXUiwgSVdSX0VOQUJMRSgwKSk7Ci0KLQliZmluX3dyaXRlMTYoUExMX0NUTCwgdmFsKTsKLQlTU1lOQygpOwotCWFzbSgiSURMRTsiKTsKLQotCWJmaW5fd3JpdGUzMihTSUNfSVdSLCBpd3IpOwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLX0KICNkZWZpbmUgYmZpbl9yZWFkX1BMTF9ESVYoKSAgICAgICAgICAgICAgICAgIGJmaW5fcmVhZDE2KFBMTF9ESVYpCiAjZGVmaW5lIGJmaW5fd3JpdGVfUExMX0RJVih2YWwpICAgICAgICAgICAgICBiZmluX3dyaXRlMTYoUExMX0RJVix2YWwpCiAjZGVmaW5lIGJmaW5fcmVhZF9WUl9DVEwoKSAgICAgICAgICAgICAgICAgICBiZmluX3JlYWQxNihWUl9DVEwpCi0vKiBXcml0aW5nIHRvIFZSX0NUTCBpbml0aWF0ZXMgYSBQTEwgcmVsb2NrIHNlcXVlbmNlLiAqLwotc3RhdGljIF9faW5saW5lX18gdm9pZCBiZmluX3dyaXRlX1ZSX0NUTCh1bnNpZ25lZCBpbnQgdmFsKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIGl3cjsKLQotCWlmICh2YWwgPT0gYmZpbl9yZWFkX1ZSX0NUTCgpKQotCQlyZXR1cm47Ci0KLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0JLyogRW5hYmxlIHRoZSBQTEwgV2FrZXVwIGJpdCBpbiBTSUMgSVdSICovCi0JaXdyID0gYmZpbl9yZWFkMzIoU0lDX0lXUik7Ci0JLyogT25seSBhbGxvdyBQUEwgV2FrZXVwKSAqLwotCWJmaW5fd3JpdGUzMihTSUNfSVdSLCBJV1JfRU5BQkxFKDApKTsKLQotCWJmaW5fd3JpdGUxNihWUl9DVEwsIHZhbCk7Ci0JU1NZTkMoKTsKLQlhc20oIklETEU7Iik7Ci0KLQliZmluX3dyaXRlMzIoU0lDX0lXUiwgaXdyKTsKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci19CiAjZGVmaW5lIGJmaW5fcmVhZF9QTExfU1RBVCgpICAgICAgICAgICAgICAgICBiZmluX3JlYWQxNihQTExfU1RBVCkKICNkZWZpbmUgYmZpbl93cml0ZV9QTExfU1RBVCh2YWwpICAgICAgICAgICAgIGJmaW5fd3JpdGUxNihQTExfU1RBVCx2YWwpCiAjZGVmaW5lIGJmaW5fcmVhZF9QTExfTE9DS0NOVCgpICAgICAgICAgICAgICBiZmluX3JlYWQxNihQTExfTE9DS0NOVCkKQEAgLTE4MTYsNCArMTc3Miw1MSBAQAogI2RlZmluZSBiZmluX3JlYWRfSE1ETUExX0JDT1VOVCgpICAgICAgICAgICAgYmZpbl9yZWFkMTYoSE1ETUExX0JDT1VOVCkKICNkZWZpbmUgYmZpbl93cml0ZV9ITURNQTFfQkNPVU5UKHZhbCkgICAgICAgIGJmaW5fd3JpdGUxNihITURNQTFfQkNPVU5ULHZhbCkKIAorLyogVGhlc2UgbmVlZCB0byBiZSBsYXN0IGR1ZSB0byB0aGUgY2RlZi9saW51eCBpbnRlci1kZXBlbmRlbmNpZXMgKi8KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisKKy8qIFdyaXRpbmcgdG8gUExMX0NUTCBpbml0aWF0ZXMgYSBQTEwgcmVsb2NrIHNlcXVlbmNlLiAqLworc3RhdGljIF9faW5saW5lX18gdm9pZCBiZmluX3dyaXRlX1BMTF9DVEwodW5zaWduZWQgaW50IHZhbCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzLCBpd3I7CisKKwlpZiAodmFsID09IGJmaW5fcmVhZF9QTExfQ1RMKCkpCisJCXJldHVybjsKKworCWxvY2FsX2lycV9zYXZlX2h3KGZsYWdzKTsKKwkvKiBFbmFibGUgdGhlIFBMTCBXYWtldXAgYml0IGluIFNJQyBJV1IgKi8KKwlpd3IgPSBiZmluX3JlYWQzMihTSUNfSVdSKTsKKwkvKiBPbmx5IGFsbG93IFBQTCBXYWtldXApICovCisJYmZpbl93cml0ZTMyKFNJQ19JV1IsIElXUl9FTkFCTEUoMCkpOworCisJYmZpbl93cml0ZTE2KFBMTF9DVEwsIHZhbCk7CisJU1NZTkMoKTsKKwlhc20oIklETEU7Iik7CisKKwliZmluX3dyaXRlMzIoU0lDX0lXUiwgaXdyKTsKKwlsb2NhbF9pcnFfcmVzdG9yZV9odyhmbGFncyk7Cit9CisKKy8qIFdyaXRpbmcgdG8gVlJfQ1RMIGluaXRpYXRlcyBhIFBMTCByZWxvY2sgc2VxdWVuY2UuICovCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIGJmaW5fd3JpdGVfVlJfQ1RMKHVuc2lnbmVkIGludCB2YWwpCit7CisJdW5zaWduZWQgbG9uZyBmbGFncywgaXdyOworCisJaWYgKHZhbCA9PSBiZmluX3JlYWRfVlJfQ1RMKCkpCisJCXJldHVybjsKKworCWxvY2FsX2lycV9zYXZlX2h3KGZsYWdzKTsKKwkvKiBFbmFibGUgdGhlIFBMTCBXYWtldXAgYml0IGluIFNJQyBJV1IgKi8KKwlpd3IgPSBiZmluX3JlYWQzMihTSUNfSVdSKTsKKwkvKiBPbmx5IGFsbG93IFBQTCBXYWtldXApICovCisJYmZpbl93cml0ZTMyKFNJQ19JV1IsIElXUl9FTkFCTEUoMCkpOworCisJYmZpbl93cml0ZTE2KFZSX0NUTCwgdmFsKTsKKwlTU1lOQygpOworCWFzbSgiSURMRTsiKTsKKworCWJmaW5fd3JpdGUzMihTSUNfSVdSLCBpd3IpOworCWxvY2FsX2lycV9yZXN0b3JlX2h3KGZsYWdzKTsKK30KKwogI2VuZGlmCQkJCS8qIF9DREVGX0JGNTM0X0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9pbmNsdWRlL21hY2gvZG1hLmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvaW5jbHVkZS9tYWNoL2RtYS5oCmluZGV4IDdhOTY0MDQuLjVhZTgzYjEgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9pbmNsdWRlL21hY2gvZG1hLmgKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2luY2x1ZGUvbWFjaC9kbWEuaApAQCAtMSwzOCArMSwxNCBAQAotLyoKLSAqIGZpbGU6ICAgICAgICAgaW5jbHVkZS9hc20tYmxhY2tmaW4vbWFjaC1iZjUzNy9kbWEuaAotICogYmFzZWQgb246Ci0gKiBhdXRob3I6CisvKiBtYWNoL2RtYS5oIC0gYXJjaC1zcGVjaWZpYyBETUEgZGVmaW5lcwogICoKLSAqIGNyZWF0ZWQ6Ci0gKiBkZXNjcmlwdGlvbjoKLSAqCXN5c3RlbSBtbXIgcmVnaXN0ZXIgbWFwCi0gKiByZXY6CisgKiBDb3B5cmlnaHQgMjAwNC0yMDA4IEFuYWxvZyBEZXZpY2VzIEluYy4KICAqCi0gKiBtb2RpZmllZDoKLSAqCi0gKgotICogYnVnczogICAgICAgICBlbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KLSAqCi0gKiB0aGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBnbnUgZ2VuZXJhbCBwdWJsaWMgbGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBmcmVlIHNvZnR3YXJlIGZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAqIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIHRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IHdpdGhvdXQgYW55IHdhcnJhbnR5OyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIG1lcmNoYW50YWJpbGl0eSBvciBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gIHNlZSB0aGUKLSAqIGdudSBnZW5lcmFsIHB1YmxpYyBsaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogeW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgZ251IGdlbmVyYWwgcHVibGljIGxpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgY29weWluZy4KLSAqIGlmIG5vdCwgd3JpdGUgdG8gdGhlIGZyZWUgc29mdHdhcmUgZm91bmRhdGlvbiwKLSAqIDU5IHRlbXBsZSBwbGFjZSAtIHN1aXRlIDMzMCwgYm9zdG9uLCBtYSAwMjExMS0xMzA3LCB1c2EuCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCiAgKi8KIAogI2lmbmRlZiBfTUFDSF9ETUFfSF8KICNkZWZpbmUgX01BQ0hfRE1BX0hfCiAKLSNkZWZpbmUgTUFYX0JMQUNLRklOX0RNQV9DSEFOTkVMIDE2CisjZGVmaW5lIE1BWF9ETUFfQ0hBTk5FTFMgMTYKIAogI2RlZmluZSBDSF9QUEkgCQkJICAgIDAKICNkZWZpbmUgQ0hfRU1BQ19SWCAJCSAgICAxCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvaW5jbHVkZS9tYWNoL2dwaW8uaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9pbmNsdWRlL21hY2gvZ3Bpby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3N2EzMWUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvaW5jbHVkZS9tYWNoL2dwaW8uaApAQCAtMCwwICsxLDY4IEBACisvKgorICogRmlsZTogYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2luY2x1ZGUvbWFjaC9ncGlvLmgKKyAqIEJ1Z3M6IEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLworICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCisgKi8KKworCisjaWZuZGVmIF9NQUNIX0dQSU9fSF8KKyNkZWZpbmUgX01BQ0hfR1BJT19IXworCisjZGVmaW5lIE1BWF9CTEFDS0ZJTl9HUElPUyA0OAorCisjZGVmaW5lCUdQSU9fUEYwCTAKKyNkZWZpbmUJR1BJT19QRjEJMQorI2RlZmluZQlHUElPX1BGMgkyCisjZGVmaW5lCUdQSU9fUEYzCTMKKyNkZWZpbmUJR1BJT19QRjQJNAorI2RlZmluZQlHUElPX1BGNQk1CisjZGVmaW5lCUdQSU9fUEY2CTYKKyNkZWZpbmUJR1BJT19QRjcJNworI2RlZmluZQlHUElPX1BGOAk4CisjZGVmaW5lCUdQSU9fUEY5CTkKKyNkZWZpbmUJR1BJT19QRjEwCTEwCisjZGVmaW5lCUdQSU9fUEYxMQkxMQorI2RlZmluZQlHUElPX1BGMTIJMTIKKyNkZWZpbmUJR1BJT19QRjEzCTEzCisjZGVmaW5lCUdQSU9fUEYxNAkxNAorI2RlZmluZQlHUElPX1BGMTUJMTUKKyNkZWZpbmUJR1BJT19QRzAJMTYKKyNkZWZpbmUJR1BJT19QRzEJMTcKKyNkZWZpbmUJR1BJT19QRzIJMTgKKyNkZWZpbmUJR1BJT19QRzMJMTkKKyNkZWZpbmUJR1BJT19QRzQJMjAKKyNkZWZpbmUJR1BJT19QRzUJMjEKKyNkZWZpbmUJR1BJT19QRzYJMjIKKyNkZWZpbmUJR1BJT19QRzcJMjMKKyNkZWZpbmUJR1BJT19QRzgJMjQKKyNkZWZpbmUJR1BJT19QRzkJMjUKKyNkZWZpbmUJR1BJT19QRzEwICAgICAgCTI2CisjZGVmaW5lCUdQSU9fUEcxMSAgICAgIAkyNworI2RlZmluZQlHUElPX1BHMTIgICAgICAJMjgKKyNkZWZpbmUJR1BJT19QRzEzICAgICAgCTI5CisjZGVmaW5lCUdQSU9fUEcxNCAgICAgIAkzMAorI2RlZmluZQlHUElPX1BHMTUgICAgICAJMzEKKyNkZWZpbmUJR1BJT19QSDAJMzIKKyNkZWZpbmUJR1BJT19QSDEJMzMKKyNkZWZpbmUJR1BJT19QSDIJMzQKKyNkZWZpbmUJR1BJT19QSDMJMzUKKyNkZWZpbmUJR1BJT19QSDQJMzYKKyNkZWZpbmUJR1BJT19QSDUJMzcKKyNkZWZpbmUJR1BJT19QSDYJMzgKKyNkZWZpbmUJR1BJT19QSDcJMzkKKyNkZWZpbmUJR1BJT19QSDgJNDAKKyNkZWZpbmUJR1BJT19QSDkJNDEKKyNkZWZpbmUJR1BJT19QSDEwICAgICAgCTQyCisjZGVmaW5lCUdQSU9fUEgxMSAgICAgIAk0MworI2RlZmluZQlHUElPX1BIMTIgICAgICAJNDQKKyNkZWZpbmUJR1BJT19QSDEzICAgICAgCTQ1CisjZGVmaW5lCUdQSU9fUEgxNCAgICAgIAk0NgorI2RlZmluZQlHUElPX1BIMTUgICAgICAJNDcKKworI2RlZmluZSBQT1JUX0YgR1BJT19QRjAKKyNkZWZpbmUgUE9SVF9HIEdQSU9fUEcwCisjZGVmaW5lIFBPUlRfSCBHUElPX1BIMAorCisjZW5kaWYgLyogX01BQ0hfR1BJT19IXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2luY2x1ZGUvbWFjaC9pcnEuaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9pbmNsdWRlL21hY2gvaXJxLmgKaW5kZXggMmU2OGE4YS4uYjJhNzFkNSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2luY2x1ZGUvbWFjaC9pcnEuaAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvaW5jbHVkZS9tYWNoL2lycS5oCkBAIC04MiwxNCArODIsMTQgQEAKICNkZWZpbmUgSVJRX0NBTl9UWCAgICAgICAgICAyMwkvKkNBTiBUcmFuc21pdCBJbnRlcnJ1cHQgKi8KICNkZWZpbmUgSVJRX01BQ19SWCAgICAgICAgICAyNAkvKkRNQTEgKEV0aGVybmV0IFJYKSBJbnRlcnJ1cHQgKi8KICNkZWZpbmUgSVJRX01BQ19UWCAgICAgICAgICAyNQkvKkRNQTIgKEV0aGVybmV0IFRYKSBJbnRlcnJ1cHQgKi8KLSNkZWZpbmUgSVJRX1RNUjAgICAgICAgICAgICAyNgkvKlRpbWVyIDAgKi8KLSNkZWZpbmUgSVJRX1RNUjEgICAgICAgICAgICAyNwkvKlRpbWVyIDEgKi8KLSNkZWZpbmUgSVJRX1RNUjIgICAgICAgICAgICAyOAkvKlRpbWVyIDIgKi8KLSNkZWZpbmUgSVJRX1RNUjMgICAgICAgICAgICAyOQkvKlRpbWVyIDMgKi8KLSNkZWZpbmUgSVJRX1RNUjQgICAgICAgICAgICAzMAkvKlRpbWVyIDQgKi8KLSNkZWZpbmUgSVJRX1RNUjUgICAgICAgICAgICAzMQkvKlRpbWVyIDUgKi8KLSNkZWZpbmUgSVJRX1RNUjYgICAgICAgICAgICAzMgkvKlRpbWVyIDYgKi8KLSNkZWZpbmUgSVJRX1RNUjcgICAgICAgICAgICAzMwkvKlRpbWVyIDcgKi8KKyNkZWZpbmUgSVJRX1RJTUVSMCAgICAgICAgICAgIDI2CS8qVGltZXIgMCAqLworI2RlZmluZSBJUlFfVElNRVIxICAgICAgICAgICAgMjcJLypUaW1lciAxICovCisjZGVmaW5lIElSUV9USU1FUjIgICAgICAgICAgICAyOAkvKlRpbWVyIDIgKi8KKyNkZWZpbmUgSVJRX1RJTUVSMyAgICAgICAgICAgIDI5CS8qVGltZXIgMyAqLworI2RlZmluZSBJUlFfVElNRVI0ICAgICAgICAgICAgMzAJLypUaW1lciA0ICovCisjZGVmaW5lIElSUV9USU1FUjUgICAgICAgICAgICAzMQkvKlRpbWVyIDUgKi8KKyNkZWZpbmUgSVJRX1RJTUVSNiAgICAgICAgICAgIDMyCS8qVGltZXIgNiAqLworI2RlZmluZSBJUlFfVElNRVI3ICAgICAgICAgICAgMzMJLypUaW1lciA3ICovCiAjZGVmaW5lIElSUV9QUk9HX0lOVEEgICAgICAgMzQJLyogUEYgUG9ydHMgRiZHIChQRjE1OjApIEludGVycnVwdCBBICovCiAjZGVmaW5lIElSUV9QT1JUR19JTlRCICAgICAgMzUJLyogUEYgUG9ydCBHIChQRjE1OjApIEludGVycnVwdCBCICovCiAjZGVmaW5lIElSUV9NRU1fRE1BMCAgICAgICAgMzYJLyooTWVtb3J5IERNQSBTdHJlYW0gMCkgKi8KQEAgLTE5NSwxNiArMTk1LDE2IEBACiAjZGVmaW5lIElSUV9DQU5fVFhfUE9TICAgICAgMAogI2RlZmluZSBJUlFfTUFDX1JYX1BPUyAgICAgIDQKICNkZWZpbmUgSVJRX01BQ19UWF9QT1MgICAgICA4Ci0jZGVmaW5lIElSUV9UTVIwX1BPUyAgICAgICAgMTIKLSNkZWZpbmUgSVJRX1RNUjFfUE9TICAgICAgICAxNgotI2RlZmluZSBJUlFfVE1SMl9QT1MgICAgICAgIDIwCi0jZGVmaW5lIElSUV9UTVIzX1BPUyAgICAgICAgMjQKLSNkZWZpbmUgSVJRX1RNUjRfUE9TICAgICAgICAyOAorI2RlZmluZSBJUlFfVElNRVIwX1BPUyAgICAgICAgMTIKKyNkZWZpbmUgSVJRX1RJTUVSMV9QT1MgICAgICAgIDE2CisjZGVmaW5lIElSUV9USU1FUjJfUE9TICAgICAgICAyMAorI2RlZmluZSBJUlFfVElNRVIzX1BPUyAgICAgICAgMjQKKyNkZWZpbmUgSVJRX1RJTUVSNF9QT1MgICAgICAgIDI4CiAKIC8qIElBUjMgQklUIEZJRUxEUyovCi0jZGVmaW5lIElSUV9UTVI1X1BPUyAgICAgICAgMAotI2RlZmluZSBJUlFfVE1SNl9QT1MgICAgICAgIDQKLSNkZWZpbmUgSVJRX1RNUjdfUE9TICAgICAgICA4CisjZGVmaW5lIElSUV9USU1FUjVfUE9TICAgICAgICAwCisjZGVmaW5lIElSUV9USU1FUjZfUE9TICAgICAgICA0CisjZGVmaW5lIElSUV9USU1FUjdfUE9TICAgICAgICA4CiAjZGVmaW5lIElSUV9QUk9HX0lOVEFfUE9TICAgMTIKICNkZWZpbmUgSVJRX1BPUlRHX0lOVEJfUE9TICAgMTYKICNkZWZpbmUgSVJRX01FTV9ETUEwX1BPUyAgICAyMApkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2luY2x1ZGUvbWFjaC9tZW1faW5pdC5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2luY2x1ZGUvbWFjaC9tZW1faW5pdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjc2OThmLi4wMDAwMDAwCi0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9pbmNsdWRlL21hY2gvbWVtX2luaXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDMwMyArMCwwIEBACi0vKgotICogRmlsZTogICAgICAgICBpbmNsdWRlL2FzbS1ibGFja2Zpbi9tYWNoLWJmNTM3L21lbV9pbml0LmgKLSAqIEJhc2VkIG9uOgotICogQXV0aG9yOgotICoKLSAqIENyZWF0ZWQ6Ci0gKiBEZXNjcmlwdGlvbjoKLSAqCi0gKiBSZXY6Ci0gKgotICogTW9kaWZpZWQ6Ci0gKiAgICAgICAgICAgICAgIENvcHlyaWdodCAyMDA0LTIwMDYgQW5hbG9nIERldmljZXMgSW5jLgotICoKLSAqIEJ1Z3M6ICAgICAgICAgRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gKiBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuCi0gKiBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotICovCi0KLSNpZiAoQ09ORklHX01FTV9NVDQ4TEMxNk0xNkEyVEdfNzUgfHwgQ09ORklHX01FTV9NVDQ4TEM2NE00QTJGQl83RSB8fCBDT05GSUdfTUVNX01UNDhMQzE2TThBMlRHXzc1IHx8IENPTkZJR19NRU1fR0VORVJJQ19CT0FSRCB8fCBDT05GSUdfTUVNX01UNDhMQzMyTThBMl83NSkKLSNpZiAoQ09ORklHX1NDTEtfSFogPiAxMTk0MDI5ODUpCi0jZGVmaW5lIFNEUkFNX3RSUCAgICAgICBUUlBfMgotI2RlZmluZSBTRFJBTV90UlBfbnVtICAgMgotI2RlZmluZSBTRFJBTV90UkFTICAgICAgVFJBU183Ci0jZGVmaW5lIFNEUkFNX3RSQVNfbnVtICA3Ci0jZGVmaW5lIFNEUkFNX3RSQ0QgICAgICBUUkNEXzIKLSNkZWZpbmUgU0RSQU1fdFdSICAgICAgIFRXUl8yCi0jZW5kaWYKLSNpZiAoQ09ORklHX1NDTEtfSFogPiAxMDQ0Nzc2MTIpICYmIChDT05GSUdfU0NMS19IWiA8PSAxMTk0MDI5ODUpCi0jZGVmaW5lIFNEUkFNX3RSUCAgICAgICBUUlBfMgotI2RlZmluZSBTRFJBTV90UlBfbnVtICAgMgotI2RlZmluZSBTRFJBTV90UkFTICAgICAgVFJBU182Ci0jZGVmaW5lIFNEUkFNX3RSQVNfbnVtICA2Ci0jZGVmaW5lIFNEUkFNX3RSQ0QgICAgICBUUkNEXzIKLSNkZWZpbmUgU0RSQU1fdFdSICAgICAgIFRXUl8yCi0jZW5kaWYKLSNpZiAoQ09ORklHX1NDTEtfSFogPiA4OTU1MjIzOSkgJiYgKENPTkZJR19TQ0xLX0haIDw9IDEwNDQ3NzYxMikKLSNkZWZpbmUgU0RSQU1fdFJQICAgICAgIFRSUF8yCi0jZGVmaW5lIFNEUkFNX3RSUF9udW0gICAyCi0jZGVmaW5lIFNEUkFNX3RSQVMgICAgICBUUkFTXzUKLSNkZWZpbmUgU0RSQU1fdFJBU19udW0gIDUKLSNkZWZpbmUgU0RSQU1fdFJDRCAgICAgIFRSQ0RfMgotI2RlZmluZSBTRFJBTV90V1IgICAgICAgVFdSXzIKLSNlbmRpZgotI2lmIChDT05GSUdfU0NMS19IWiA+IDc0NjI2ODY2KSAmJiAoQ09ORklHX1NDTEtfSFogPD0gODk1NTIyMzkpCi0jZGVmaW5lIFNEUkFNX3RSUCAgICAgICBUUlBfMgotI2RlZmluZSBTRFJBTV90UlBfbnVtICAgMgotI2RlZmluZSBTRFJBTV90UkFTICAgICAgVFJBU180Ci0jZGVmaW5lIFNEUkFNX3RSQVNfbnVtICA0Ci0jZGVmaW5lIFNEUkFNX3RSQ0QgICAgICBUUkNEXzIKLSNkZWZpbmUgU0RSQU1fdFdSICAgICAgIFRXUl8yCi0jZW5kaWYKLSNpZiAoQ09ORklHX1NDTEtfSFogPiA2NjY2NjY2NykgJiYgKENPTkZJR19TQ0xLX0haIDw9IDc0NjI2ODY2KQotI2RlZmluZSBTRFJBTV90UlAgICAgICAgVFJQXzIKLSNkZWZpbmUgU0RSQU1fdFJQX251bSAgIDIKLSNkZWZpbmUgU0RSQU1fdFJBUyAgICAgIFRSQVNfMwotI2RlZmluZSBTRFJBTV90UkFTX251bSAgMwotI2RlZmluZSBTRFJBTV90UkNEICAgICAgVFJDRF8yCi0jZGVmaW5lIFNEUkFNX3RXUiAgICAgICBUV1JfMgotI2VuZGlmCi0jaWYgKENPTkZJR19TQ0xLX0haID4gNTk3MDE0OTMpICYmIChDT05GSUdfU0NMS19IWiA8PSA2NjY2NjY2NykKLSNkZWZpbmUgU0RSQU1fdFJQICAgICAgIFRSUF8xCi0jZGVmaW5lIFNEUkFNX3RSUF9udW0gICAxCi0jZGVmaW5lIFNEUkFNX3RSQVMgICAgICBUUkFTXzQKLSNkZWZpbmUgU0RSQU1fdFJBU19udW0gIDMKLSNkZWZpbmUgU0RSQU1fdFJDRCAgICAgIFRSQ0RfMQotI2RlZmluZSBTRFJBTV90V1IgICAgICAgVFdSXzIKLSNlbmRpZgotI2lmIChDT05GSUdfU0NMS19IWiA+IDQ0Nzc2MTE5KSAmJiAoQ09ORklHX1NDTEtfSFogPD0gNTk3MDE0OTMpCi0jZGVmaW5lIFNEUkFNX3RSUCAgICAgICBUUlBfMQotI2RlZmluZSBTRFJBTV90UlBfbnVtICAgMQotI2RlZmluZSBTRFJBTV90UkFTICAgICAgVFJBU18zCi0jZGVmaW5lIFNEUkFNX3RSQVNfbnVtICAzCi0jZGVmaW5lIFNEUkFNX3RSQ0QgICAgICBUUkNEXzEKLSNkZWZpbmUgU0RSQU1fdFdSICAgICAgIFRXUl8yCi0jZW5kaWYKLSNpZiAoQ09ORklHX1NDTEtfSFogPiAyOTg1MDc0NikgJiYgKENPTkZJR19TQ0xLX0haIDw9IDQ0Nzc2MTE5KQotI2RlZmluZSBTRFJBTV90UlAgICAgICAgVFJQXzEKLSNkZWZpbmUgU0RSQU1fdFJQX251bSAgIDEKLSNkZWZpbmUgU0RSQU1fdFJBUyAgICAgIFRSQVNfMgotI2RlZmluZSBTRFJBTV90UkFTX251bSAgMgotI2RlZmluZSBTRFJBTV90UkNEICAgICAgVFJDRF8xCi0jZGVmaW5lIFNEUkFNX3RXUiAgICAgICBUV1JfMgotI2VuZGlmCi0jaWYgKENPTkZJR19TQ0xLX0haIDw9IDI5ODUwNzQ2KQotI2RlZmluZSBTRFJBTV90UlAgICAgICAgVFJQXzEKLSNkZWZpbmUgU0RSQU1fdFJQX251bSAgIDEKLSNkZWZpbmUgU0RSQU1fdFJBUyAgICAgIFRSQVNfMQotI2RlZmluZSBTRFJBTV90UkFTX251bSAgMQotI2RlZmluZSBTRFJBTV90UkNEICAgICAgVFJDRF8xCi0jZGVmaW5lIFNEUkFNX3RXUiAgICAgICBUV1JfMgotI2VuZGlmCi0jZW5kaWYKLQotI2lmIChDT05GSUdfTUVNX01UNDhMQzE2TTE2QTJUR183NSkKLSAgLypTRFJBTSBJTkZPUk1BVElPTjogKi8KLSNkZWZpbmUgU0RSQU1fVHJlZiAgNjQJCS8qIFJlZnJlc2ggcGVyaW9kIGluIG1pbGxpc2Vjb25kcyAgICovCi0jZGVmaW5lIFNEUkFNX05SQSAgIDgxOTIJLyogTnVtYmVyIG9mIHJvdyBhZGRyZXNzZXMgaW4gU0RSQU0gKi8KLSNkZWZpbmUgU0RSQU1fQ0wgICAgQ0xfMwotI2VuZGlmCi0KLSNpZiAoQ09ORklHX01FTV9NVDQ4TEMxNk04QTJUR183NSkKLSAgLypTRFJBTSBJTkZPUk1BVElPTjogKi8KLSNkZWZpbmUgU0RSQU1fVHJlZiAgNjQJCS8qIFJlZnJlc2ggcGVyaW9kIGluIG1pbGxpc2Vjb25kcyAgICovCi0jZGVmaW5lIFNEUkFNX05SQSAgIDQwOTYJLyogTnVtYmVyIG9mIHJvdyBhZGRyZXNzZXMgaW4gU0RSQU0gKi8KLSNkZWZpbmUgU0RSQU1fQ0wgICAgQ0xfMwotI2VuZGlmCi0KLSNpZiAoQ09ORklHX01FTV9NVDQ4TEMzMk04QTJfNzUpCi0gIC8qU0RSQU0gSU5GT1JNQVRJT046ICovCi0jZGVmaW5lIFNEUkFNX1RyZWYgIDY0CQkvKiBSZWZyZXNoIHBlcmlvZCBpbiBtaWxsaXNlY29uZHMgICAqLwotI2RlZmluZSBTRFJBTV9OUkEgICA4MTkyCS8qIE51bWJlciBvZiByb3cgYWRkcmVzc2VzIGluIFNEUkFNICovCi0jZGVmaW5lIFNEUkFNX0NMICAgIENMXzMKLSNlbmRpZgotCi0jaWYgKENPTkZJR19NRU1fTVQ0OExDNjRNNEEyRkJfN0UpCi0gIC8qU0RSQU0gSU5GT1JNQVRJT046ICovCi0jZGVmaW5lIFNEUkFNX1RyZWYgIDY0CQkvKiBSZWZyZXNoIHBlcmlvZCBpbiBtaWxsaXNlY29uZHMgICAqLwotI2RlZmluZSBTRFJBTV9OUkEgICA4MTkyCS8qIE51bWJlciBvZiByb3cgYWRkcmVzc2VzIGluIFNEUkFNICovCi0jZGVmaW5lIFNEUkFNX0NMICAgIENMXzMKLSNlbmRpZgotCi0jaWYgKENPTkZJR19NRU1fR0VORVJJQ19CT0FSRCkKLSAgLypTRFJBTSBJTkZPUk1BVElPTjogTW9kaWZ5IHRoaXMgZm9yIHlvdXIgYm9hcmQgKi8KLSNkZWZpbmUgU0RSQU1fVHJlZiAgNjQJCS8qIFJlZnJlc2ggcGVyaW9kIGluIG1pbGxpc2Vjb25kcyAgICovCi0jZGVmaW5lIFNEUkFNX05SQSAgIDgxOTIJLyogTnVtYmVyIG9mIHJvdyBhZGRyZXNzZXMgaW4gU0RSQU0gKi8KLSNkZWZpbmUgU0RSQU1fQ0wgICAgQ0xfMwotI2VuZGlmCi0KLS8qIEVxdWF0aW9uIGZyb20gc2VjdGlvbiAxNyAocDE3LTQ2KSBvZiBCRjUzMyBIUk0gKi8KLSNkZWZpbmUgbWVtX1NEUlJDICAgICAgICgoKENPTkZJR19TQ0xLX0haIC8gMTAwMCkgKiBTRFJBTV9UcmVmKSAvIFNEUkFNX05SQSkgLSAoU0RSQU1fdFJBU19udW0gKyBTRFJBTV90UlBfbnVtKQotCi0vKiBFbmFibGUgU0NMSyBPdXQgKi8KLSNkZWZpbmUgbWVtX1NER0NUTCAgICAgICAgKFNDVExFIHwgU0RSQU1fQ0wgfCBTRFJBTV90UkFTIHwgU0RSQU1fdFJQIHwgU0RSQU1fdFJDRCB8IFNEUkFNX3RXUiB8IFBTUykKLQotI2lmIGRlZmluZWQgQ09ORklHX0NMS0lOX0hBTEYKLSNkZWZpbmUgQ0xLSU5fSEFMRiAgICAgICAxCi0jZWxzZQotI2RlZmluZSBDTEtJTl9IQUxGICAgICAgIDAKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCBDT05GSUdfUExMX0JZUEFTUwotI2RlZmluZSBQTExfQllQQVNTICAgICAgMQotI2Vsc2UKLSNkZWZpbmUgUExMX0JZUEFTUyAgICAgICAwCi0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKkN1cnJlbnRseSBOb3QgQmVpbmcgVXNlZCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMX1dBVCAgKChDT05GSUdfRkxBU0hfU1BFRURfQldBVCAqIDQpIC8gKDQwMDAwMDAwMDAgLyBDT05GSUdfU0NMS19IWikpICsgMQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTF9SQVQgICgoQ09ORklHX0ZMQVNIX1NQRUVEX0JSQVQgKiA0KSAvICg0MDAwMDAwMDAwIC8gQ09ORklHX1NDTEtfSFopKSArIDEKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVExfSFQgICAoKENPTkZJR19GTEFTSF9TUEVFRF9CSFQgICogNCkgLyAoNDAwMDAwMDAwMCAvIENPTkZJR19TQ0xLX0haKSkKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVExfU1QgICAoKENPTkZJR19GTEFTSF9TUEVFRF9CU1QgICogNCkgLyAoNDAwMDAwMDAwMCAvIENPTkZJR19TQ0xLX0haKSkgKyAxCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMX1RUICAgKChDT05GSUdfRkxBU0hfU1BFRURfQlRUICAqIDQpIC8gKDQwMDAwMDAwMDAgLyBDT05GSUdfU0NMS19IWikpICsgMQotCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1RUID4gMykKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1RUICAgQjBUVF80Ci0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfVFQgPT0gMykKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1RUICAgQjBUVF8zCi0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfVFQgPT0gMikKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1RUICAgQjBUVF8yCi0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfVFQgPCAyKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfVFQgICBCMFRUXzEKLSNlbmRpZgotCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1NUID4gMykKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1NUICAgQjBTVF80Ci0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfU1QgPT0gMykKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1NUICAgQjBTVF8zCi0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfU1QgPT0gMikKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1NUICAgQjBTVF8yCi0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfU1QgPCAyKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfU1QgICBCMFNUXzEKLSNlbmRpZgotCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX0hUID4gMikKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX0hUICAgQjBIVF8zCi0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfSFQgPT0gMikKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX0hUICAgQjBIVF8yCi0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfSFQgPT0gMSkKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX0hUICAgQjBIVF8xCi0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfSFQgPT0gMCAmJiBDT05GSUdfRkxBU0hfU1BFRURfQkhUID09IDApCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9IVCAgIEIwSFRfMAotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX0hUID09IDAgJiYgQ09ORklHX0ZMQVNIX1NQRUVEX0JIVCAhPSAwKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfSFQgICBCMEhUXzEKLSNlbmRpZgotCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1dBVCA+IDE0KQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfV0FUICBCMFdBVF8xNQotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1dBVCA9PSAxNCkKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1dBVCAgQjBXQVRfMTQKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9XQVQgPT0gMTMpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9XQVQgIEIwV0FUXzEzCi0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfV0FUID09IDEyKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfV0FUICBCMFdBVF8xMgotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1dBVCA9PSAxMSkKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1dBVCAgQjBXQVRfMTEKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9XQVQgPT0gMTApCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9XQVQgIEIwV0FUXzEwCi0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfV0FUID09IDkpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9XQVQgIEIwV0FUXzkKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9XQVQgPT0gOCkKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1dBVCAgQjBXQVRfOAotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1dBVCA9PSA3KQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfV0FUICBCMFdBVF83Ci0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfV0FUID09IDYpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9XQVQgIEIwV0FUXzYKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9XQVQgPT0gNSkKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1dBVCAgQjBXQVRfNQotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1dBVCA9PSA0KQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfV0FUICBCMFdBVF80Ci0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfV0FUID09IDMpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9XQVQgIEIwV0FUXzMKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9XQVQgPT0gMikKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1dBVCAgQjBXQVRfMgotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1dBVCA9PSAxKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfV0FUICBCMFdBVF8xCi0jZW5kaWYKLQotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9SQVQgPiAxNCkKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1JBVCAgQjBSQVRfMTUKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9SQVQgPT0gMTQpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9SQVQgIEIwUkFUXzE0Ci0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfUkFUID09IDEzKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfUkFUICBCMFJBVF8xMwotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1JBVCA9PSAxMikKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1JBVCAgQjBSQVRfMTIKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9SQVQgPT0gMTEpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9SQVQgIEIwUkFUXzExCi0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfUkFUID09IDEwKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfUkFUICBCMFJBVF8xMAotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1JBVCA9PSA5KQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfUkFUICBCMFJBVF85Ci0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfUkFUID09IDgpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9SQVQgIEIwUkFUXzgKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9SQVQgPT0gNykKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1JBVCAgQjBSQVRfNwotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1JBVCA9PSA2KQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfUkFUICBCMFJBVF82Ci0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfUkFUID09IDUpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9SQVQgIEIwUkFUXzUKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9SQVQgPT0gNCkKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1JBVCAgQjBSQVRfNAotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1JBVCA9PSAzKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfUkFUICBCMFJBVF8zCi0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfUkFUID09IDIpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9SQVQgIEIwUkFUXzIKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9SQVQgPT0gMSkKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1JBVCAgQjBSQVRfMQotI2VuZGlmCi0KLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwICBcCi0JKGZsYXNoX0VCSVVfQU1CQ1RMMF9XQVQgfCBmbGFzaF9FQklVX0FNQkNUTDBfUkFUIHwgZmxhc2hfRUJJVV9BTUJDVEwwX0hUIHwgXAotCSBmbGFzaF9FQklVX0FNQkNUTDBfU1QgfCBmbGFzaF9FQklVX0FNQkNUTDBfVFQgfCBDT05GSUdfRkxBU0hfU1BFRURfUkRZRU4pCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvaW5jbHVkZS9tYWNoL21lbV9tYXAuaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9pbmNsdWRlL21hY2gvbWVtX21hcC5oCmluZGV4IDUwNzhiNjYuLmY5MDEwYzQgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9pbmNsdWRlL21hY2gvbWVtX21hcC5oCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9pbmNsdWRlL21hY2gvbWVtX21hcC5oCkBAIC0xNzYsNCArMTc2LDEwIEBACiAjZGVmaW5lIEwxX1NDUkFUQ0hfU1RBUlQJMHhGRkIwMDAwMAogI2RlZmluZSBMMV9TQ1JBVENIX0xFTkdUSAkweDEwMDAKIAorI2RlZmluZSBHRVRfUERBX1NBRkUocHJlZykJCVwKKwlwcmVnLmwgPSBfY3B1X3BkYTsJCVwKKwlwcmVnLmggPSBfY3B1X3BkYTsKKworI2RlZmluZSBHRVRfUERBKHByZWcsIGRyZWcpCUdFVF9QREFfU0FGRShwcmVnKQorCiAjZW5kaWYJCQkJLyogX01FTV9NQVBfNTM3X0hfICovCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvaW50cy1wcmlvcml0eS5jIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2ludHMtcHJpb3JpdHkuYwppbmRleCBiMTMwMGIzLi41MWM0ODA4IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvaW50cy1wcmlvcml0eS5jCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9pbnRzLXByaW9yaXR5LmMKQEAgLTU1LDE1ICs1NSwxNSBAQAogCWJmaW5fd3JpdGVfU0lDX0lBUjIoKChDT05GSUdfSVJRX0NBTl9UWCAtIDcpIDw8IElSUV9DQU5fVFhfUE9TKSB8CiAJCQkgICAgKChDT05GSUdfSVJRX01BQ19SWCAtIDcpIDw8IElSUV9NQUNfUlhfUE9TKSB8CiAJCQkgICAgKChDT05GSUdfSVJRX01BQ19UWCAtIDcpIDw8IElSUV9NQUNfVFhfUE9TKSB8Ci0JCQkgICAgKChDT05GSUdfSVJRX1RNUjAgLSA3KSA8PCBJUlFfVE1SMF9QT1MpIHwKLQkJCSAgICAoKENPTkZJR19JUlFfVE1SMSAtIDcpIDw8IElSUV9UTVIxX1BPUykgfAotCQkJICAgICgoQ09ORklHX0lSUV9UTVIyIC0gNykgPDwgSVJRX1RNUjJfUE9TKSB8Ci0JCQkgICAgKChDT05GSUdfSVJRX1RNUjMgLSA3KSA8PCBJUlFfVE1SM19QT1MpIHwKLQkJCSAgICAoKENPTkZJR19JUlFfVE1SNCAtIDcpIDw8IElSUV9UTVI0X1BPUykpOworCQkJICAgICgoQ09ORklHX0lSUV9USU1FUjAgLSA3KSA8PCBJUlFfVElNRVIwX1BPUykgfAorCQkJICAgICgoQ09ORklHX0lSUV9USU1FUjEgLSA3KSA8PCBJUlFfVElNRVIxX1BPUykgfAorCQkJICAgICgoQ09ORklHX0lSUV9USU1FUjIgLSA3KSA8PCBJUlFfVElNRVIyX1BPUykgfAorCQkJICAgICgoQ09ORklHX0lSUV9USU1FUjMgLSA3KSA8PCBJUlFfVElNRVIzX1BPUykgfAorCQkJICAgICgoQ09ORklHX0lSUV9USU1FUjQgLSA3KSA8PCBJUlFfVElNRVI0X1BPUykpOwogCi0JYmZpbl93cml0ZV9TSUNfSUFSMygoKENPTkZJR19JUlFfVE1SNSAtIDcpIDw8IElSUV9UTVI1X1BPUykgfAotCQkJICAgICgoQ09ORklHX0lSUV9UTVI2IC0gNykgPDwgSVJRX1RNUjZfUE9TKSB8Ci0JCQkgICAgKChDT05GSUdfSVJRX1RNUjcgLSA3KSA8PCBJUlFfVE1SN19QT1MpIHwKKwliZmluX3dyaXRlX1NJQ19JQVIzKCgoQ09ORklHX0lSUV9USU1FUjUgLSA3KSA8PCBJUlFfVElNRVI1X1BPUykgfAorCQkJICAgICgoQ09ORklHX0lSUV9USU1FUjYgLSA3KSA8PCBJUlFfVElNRVI2X1BPUykgfAorCQkJICAgICgoQ09ORklHX0lSUV9USU1FUjcgLSA3KSA8PCBJUlFfVElNRVI3X1BPUykgfAogCQkJICAgICgoQ09ORklHX0lSUV9QUk9HX0lOVEEgLSA3KSA8PCBJUlFfUFJPR19JTlRBX1BPUykgfAogCQkJICAgICgoQ09ORklHX0lSUV9QT1JUR19JTlRCIC0gNykgPDwgSVJRX1BPUlRHX0lOVEJfUE9TKSB8CiAJCQkgICAgKChDT05GSUdfSVJRX01FTV9ETUEwIC0gNykgPDwgSVJRX01FTV9ETUEwX1BPUykgfApkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L0tjb25maWcgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzgvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDY4YzM1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L0tjb25maWcKQEAgLTAsMCArMSwxNjQgQEAKK2lmIChCRjUzOCB8fCBCRjUzOSkKKworc291cmNlICJhcmNoL2JsYWNrZmluL21hY2gtYmY1MzgvYm9hcmRzL0tjb25maWciCisKK21lbnUgIkJGNTM4IFNwZWNpZmljIENvbmZpZ3VyYXRpb24iCisKK2NvbW1lbnQgIkludGVycnVwdCBQcmlvcml0eSBBc3NpZ25tZW50IgorbWVudSAiUHJpb3JpdHkiCisKK2NvbmZpZyBJUlFfUExMX1dBS0VVUAorCWludCAiSVJRX1BMTF9XQUtFVVAiCisJZGVmYXVsdCA3Citjb25maWcgSVJRX0RNQTBfRVJST1IKKwlpbnQgIklSUV9ETUEwX0VSUk9SIgorCWRlZmF1bHQgNworY29uZmlnIElSUV9QUElfRVJST1IKKwlpbnQgIklSUV9QUElfRVJST1IiCisJZGVmYXVsdCA3Citjb25maWcgSVJRX1NQT1JUMF9FUlJPUgorCWludCAiSVJRX1NQT1JUMF9FUlJPUiIKKwlkZWZhdWx0IDcKK2NvbmZpZyBJUlFfU1BPUlQxX0VSUk9SCisJaW50ICJJUlFfU1BPUlQxX0VSUk9SIgorCWRlZmF1bHQgNworY29uZmlnIElSUV9TUEkwX0VSUk9SCisJaW50ICJJUlFfU1BJMF9FUlJPUiIKKwlkZWZhdWx0IDcKK2NvbmZpZyBJUlFfVUFSVDBfRVJST1IKKwlpbnQgIklSUV9VQVJUMF9FUlJPUiIKKwlkZWZhdWx0IDcKK2NvbmZpZyBJUlFfUlRDCisJaW50ICJJUlFfUlRDIgorCWRlZmF1bHQgOAorY29uZmlnIElSUV9QUEkKKwlpbnQgIklSUV9QUEkiCisJZGVmYXVsdCA4Citjb25maWcgSVJRX1NQT1JUMF9SWAorCWludCAiSVJRX1NQT1JUMF9SWCIKKwlkZWZhdWx0IDkKK2NvbmZpZyBJUlFfU1BPUlQwX1RYCisJaW50ICJJUlFfU1BPUlQwX1RYIgorCWRlZmF1bHQgOQorY29uZmlnIElSUV9TUE9SVDFfUlgKKwlpbnQgIklSUV9TUE9SVDFfUlgiCisJZGVmYXVsdCA5Citjb25maWcgSVJRX1NQT1JUMV9UWAorCWludCAiSVJRX1NQT1JUMV9UWCIKKwlkZWZhdWx0IDkKK2NvbmZpZyBJUlFfU1BJMAorCWludCAiSVJRX1NQSTAiCisJZGVmYXVsdCAxMAorY29uZmlnIElSUV9VQVJUMF9SWAorCWludCAiSVJRX1VBUlQwX1JYIgorCWRlZmF1bHQgMTAKK2NvbmZpZyBJUlFfVUFSVDBfVFgKKwlpbnQgIklSUV9VQVJUMF9UWCIKKwlkZWZhdWx0IDEwCitjb25maWcgSVJRX1RJTUVSMAorCWludCAiSVJRX1RJTUVSMCIKKwlkZWZhdWx0IDgKK2NvbmZpZyBJUlFfVElNRVIxCisJaW50ICJJUlFfVElNRVIxIgorCWRlZmF1bHQgMTEKK2NvbmZpZyBJUlFfVElNRVIyCisJaW50ICJJUlFfVElNRVIyIgorCWRlZmF1bHQgMTEKK2NvbmZpZyBJUlFfUE9SVEZfSU5UQQorCWludCAiSVJRX1BPUlRGX0lOVEEiCisJZGVmYXVsdCAxMgorY29uZmlnIElSUV9QT1JURl9JTlRCCisJaW50ICJJUlFfUE9SVEZfSU5UQiIKKwlkZWZhdWx0IDEyCitjb25maWcgSVJRX01FTTBfRE1BMAorCWludCAiSVJRX01FTTBfRE1BMCIKKwlkZWZhdWx0IDEzCitjb25maWcgSVJRX01FTTBfRE1BMQorCWludCAiSVJRX01FTTBfRE1BMSIKKwlkZWZhdWx0IDEzCitjb25maWcgSVJRX1dBVENICisJaW50ICJJUlFfV0FUQ0giCisJZGVmYXVsdCAxMworY29uZmlnIElSUV9ETUExX0VSUk9SCisJaW50ICJJUlFfRE1BMV9FUlJPUiIKKwlkZWZhdWx0IDcKK2NvbmZpZyBJUlFfU1BPUlQyX0VSUk9SCisJaW50ICJJUlFfU1BPUlQyX0VSUk9SIgorCWRlZmF1bHQgNworY29uZmlnIElSUV9TUE9SVDNfRVJST1IKKwlpbnQgIklSUV9TUE9SVDNfRVJST1IiCisJZGVmYXVsdCA3Citjb25maWcgSVJRX1NQSTFfRVJST1IKKwlpbnQgIklSUV9TUEkxX0VSUk9SIgorCWRlZmF1bHQgNworY29uZmlnIElSUV9TUEkyX0VSUk9SCisJaW50ICJJUlFfU1BJMl9FUlJPUiIKKwlkZWZhdWx0IDcKK2NvbmZpZyBJUlFfVUFSVDFfRVJST1IKKwlpbnQgIklSUV9VQVJUMV9FUlJPUiIKKwlkZWZhdWx0IDcKK2NvbmZpZyBJUlFfVUFSVDJfRVJST1IKKwlpbnQgIklSUV9VQVJUMl9FUlJPUiIKKwlkZWZhdWx0IDcKK2NvbmZpZyBJUlFfQ0FOX0VSUk9SCisJaW50ICJJUlFfQ0FOX0VSUk9SIgorCWRlZmF1bHQgNworY29uZmlnIElSUV9TUE9SVDJfUlgKKwlpbnQgIklSUV9TUE9SVDJfUlgiCisJZGVmYXVsdCA5Citjb25maWcgSVJRX1NQT1JUMl9UWAorCWludCAiSVJRX1NQT1JUMl9UWCIKKwlkZWZhdWx0IDkKK2NvbmZpZyBJUlFfU1BPUlQzX1JYCisJaW50ICJJUlFfU1BPUlQzX1JYIgorCWRlZmF1bHQgOQorY29uZmlnIElSUV9TUE9SVDNfVFgKKwlpbnQgIklSUV9TUE9SVDNfVFgiCisJZGVmYXVsdCA5Citjb25maWcgSVJRX1NQSTEKKwlpbnQgIklSUV9TUEkxIgorCWRlZmF1bHQgMTAKK2NvbmZpZyBJUlFfU1BJMgorCWludCAiSVJRX1NQSTIiCisJZGVmYXVsdCAxMAorY29uZmlnIElSUV9VQVJUMV9SWAorCWludCAiSVJRX1VBUlQxX1JYIgorCWRlZmF1bHQgMTAKK2NvbmZpZyBJUlFfVUFSVDFfVFgKKwlpbnQgIklSUV9VQVJUMV9UWCIKKwlkZWZhdWx0IDEwCitjb25maWcgSVJRX1VBUlQyX1JYCisJaW50ICJJUlFfVUFSVDJfUlgiCisJZGVmYXVsdCAxMAorY29uZmlnIElSUV9VQVJUMl9UWAorCWludCAiSVJRX1VBUlQyX1RYIgorCWRlZmF1bHQgMTAKK2NvbmZpZyBJUlFfVFdJMAorCWludCAiSVJRX1RXSTAiCisJZGVmYXVsdCAxMQorY29uZmlnIElSUV9UV0kxCisJaW50ICJJUlFfVFdJMSIKKwlkZWZhdWx0IDExCitjb25maWcgSVJRX0NBTl9SWAorCWludCAiSVJRX0NBTl9SWCIKKwlkZWZhdWx0IDExCitjb25maWcgSVJRX0NBTl9UWAorCWludCAiSVJRX0NBTl9UWCIKKwlkZWZhdWx0IDExCitjb25maWcgSVJRX01FTTFfRE1BMAorCWludCAiSVJRX01FTTFfRE1BMCIKKwlkZWZhdWx0IDEzCitjb25maWcgSVJRX01FTTFfRE1BMQorCWludCAiSVJRX01FTTFfRE1BMSIKKwlkZWZhdWx0IDEzCisKKwloZWxwCisJICBFbnRlciB0aGUgcHJpb3JpdHkgbnVtYmVycyBiZXR3ZWVuIDctMTMgT05MWS4gIE90aGVycyBhcmUgUmVzZXJ2ZWQuCisJICBUaGlzIGFwcGxpZXMgdG8gYWxsIHRoZSBhYm92ZS4gIEl0IGlzIG5vdCByZWNvbW1lbmRlZCB0byBhc3NpZ24gdGhlCisJICBoaWdoZXN0IHByaW9yaXR5IG51bWJlciA3IHRvIFVBUlQgb3IgYW55IG90aGVyIGRldmljZS4KKworZW5kbWVudQorCitlbmRtZW51CisKK2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzgvTWFrZWZpbGUgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzgvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGNkMjcxOQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzOC9NYWtlZmlsZQpAQCAtMCwwICsxLDUgQEAKKyMKKyMgYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L01ha2VmaWxlCisjCisKK29iai15IDo9IGludHMtcHJpb3JpdHkubyBkbWEubwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L2JvYXJkcy9LY29uZmlnIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L2JvYXJkcy9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxNTI0OWIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzgvYm9hcmRzL0tjb25maWcKQEAgLTAsMCArMSwxMiBAQAorY2hvaWNlCisJcHJvbXB0ICJTeXN0ZW0gdHlwZSIKKwlkZWZhdWx0IEJGSU41MzhfRVpLSVQKKwloZWxwCisJICBTZWxlY3QgeW91ciBib2FyZCEKKworY29uZmlnIEJGSU41MzhfRVpLSVQKKwlib29sICJCRjUzOC1FWktJVCIKKwloZWxwCisJICBCRjUzOC1FWktJVC1MSVRFIGJvYXJkIHN1cHBvcnQuCisKK2VuZGNob2ljZQpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L2JvYXJkcy9NYWtlZmlsZSBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzOC9ib2FyZHMvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjE0M2IzMgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzOC9ib2FyZHMvTWFrZWZpbGUKQEAgLTAsMCArMSw1IEBACisjCisjIGFyY2gvYmxhY2tmaW4vbWFjaC1iZjUzOC9ib2FyZHMvTWFrZWZpbGUKKyMKKworb2JqLSQoQ09ORklHX0JGSU41MzhfRVpLSVQpICAgICAgICAgICAgKz0gZXpraXQubwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L2JvYXJkcy9lemtpdC5jIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L2JvYXJkcy9lemtpdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzN2NiOTMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzgvYm9hcmRzL2V6a2l0LmMKQEAgLTAsMCArMSw2MDYgQEAKKy8qCisgKiBGaWxlOiAgICAgICAgIGFyY2gvYmxhY2tmaW4vbWFjaC1iZjUzOC9ib2FyZHMvZXpraXQuYworICogQmFzZWQgb246ICAgICBhcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvYm9hcmRzL2V6a2l0LmMKKyAqIEF1dGhvcjogICAgICAgQWlkYW4gV2lsbGlhbXMgPGFpZGFuQG5pY3RhLmNvbS5hdT4KKyAqCisgKiBDcmVhdGVkOgorICogRGVzY3JpcHRpb246CisgKgorICogTW9kaWZpZWQ6CisgKiAgICAgICAgICAgICAgIENvcHlyaWdodCAyMDA1IE5hdGlvbmFsIElDVCBBdXN0cmFsaWEgKE5JQ1RBKQorICogICAgICAgICAgICAgICBDb3B5cmlnaHQgMjAwNC0yMDA4IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBCdWdzOiAgICAgICAgIEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIHRoZSBmaWxlIENPUFlJTkcsIG9yIHdyaXRlCisgKiB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqLworCisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL210ZC5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9wYXJ0aXRpb25zLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9mbGFzaC5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGFzbS9iZmluNXh4X3NwaS5oPgorI2luY2x1ZGUgPGFzbS9kbWEuaD4KKyNpbmNsdWRlIDxhc20vZ3Bpby5oPgorI2luY2x1ZGUgPGFzbS9uYW5kLmg+CisjaW5jbHVkZSA8YXNtL3BvcnRtdXguaD4KKyNpbmNsdWRlIDxhc20vZHBtYy5oPgorI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CisKKy8qCisgKiBOYW1lIHRoZSBCb2FyZCBmb3IgdGhlIC9wcm9jL2NwdWluZm8KKyAqLworY29uc3QgY2hhciBiZmluX2JvYXJkX25hbWVbXSA9ICJBREkgQkY1MzgtRVpLSVQiOworCisvKgorICogIERyaXZlciBuZWVkcyB0byBrbm93IGFkZHJlc3MsIGlycSBhbmQgZmxhZyBwaW4uCisgKi8KKworCisjaWYgZGVmaW5lZChDT05GSUdfUlRDX0RSVl9CRklOKSB8fCBkZWZpbmVkKENPTkZJR19SVENfRFJWX0JGSU5fTU9EVUxFKQorc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgcnRjX2RldmljZSA9IHsKKwkubmFtZSA9ICJydGMtYmZpbiIsCisJLmlkICAgPSAtMSwKK307CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX1NFUklBTF9CRklOKSB8fCBkZWZpbmVkKENPTkZJR19TRVJJQUxfQkZJTl9NT0RVTEUpCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGJmaW5fdWFydF9yZXNvdXJjZXNbXSA9IHsKKyNpZmRlZiBDT05GSUdfU0VSSUFMX0JGSU5fVUFSVDAKKwl7CisJCS5zdGFydCA9IDB4RkZDMDA0MDAsCisJCS5lbmQgPSAweEZGQzAwNEZGLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKKwl9LAorI2VuZGlmCisjaWZkZWYgQ09ORklHX1NFUklBTF9CRklOX1VBUlQxCisJeworCQkuc3RhcnQgPSAweEZGQzAyMDAwLAorCQkuZW5kID0gMHhGRkMwMjBGRiwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19TRVJJQUxfQkZJTl9VQVJUMgorCXsKKwkJLnN0YXJ0ID0gMHhGRkMwMjEwMCwKKwkJLmVuZCA9IDB4RkZDMDIxRkYsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisjZW5kaWYKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmaW5fdWFydF9kZXZpY2UgPSB7CisJLm5hbWUgPSAiYmZpbi11YXJ0IiwKKwkuaWQgPSAxLAorCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShiZmluX3VhcnRfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UgPSBiZmluX3VhcnRfcmVzb3VyY2VzLAorfTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfQkZJTl9TSVIpIHx8IGRlZmluZWQoQ09ORklHX0JGSU5fU0lSX01PRFVMRSkKKyNpZmRlZiBDT05GSUdfQkZJTl9TSVIwCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGJmaW5fc2lyMF9yZXNvdXJjZXNbXSA9IHsKKwl7CisJCS5zdGFydCA9IDB4RkZDMDA0MDAsCisJCS5lbmQgPSAweEZGQzAwNEZGLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCXsKKwkJLnN0YXJ0ID0gSVJRX1VBUlQwX1JYLAorCQkuZW5kID0gSVJRX1VBUlQwX1JYKzEsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJeworCQkuc3RhcnQgPSBDSF9VQVJUMF9SWCwKKwkJLmVuZCA9IENIX1VBUlQwX1JYKzEsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfRE1BLAorCX0sCit9Oworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9zaXIwX2RldmljZSA9IHsKKwkubmFtZSA9ICJiZmluX3NpciIsCisJLmlkID0gMCwKKwkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUoYmZpbl9zaXIwX3Jlc291cmNlcyksCisJLnJlc291cmNlID0gYmZpbl9zaXIwX3Jlc291cmNlcywKK307CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQkZJTl9TSVIxCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGJmaW5fc2lyMV9yZXNvdXJjZXNbXSA9IHsKKwl7CisJCS5zdGFydCA9IDB4RkZDMDIwMDAsCisJCS5lbmQgPSAweEZGQzAyMEZGLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCXsKKwkJLnN0YXJ0ID0gSVJRX1VBUlQxX1JYLAorCQkuZW5kID0gSVJRX1VBUlQxX1JYKzEsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJeworCQkuc3RhcnQgPSBDSF9VQVJUMV9SWCwKKwkJLmVuZCA9IENIX1VBUlQxX1JYKzEsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfRE1BLAorCX0sCit9Oworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9zaXIxX2RldmljZSA9IHsKKwkubmFtZSA9ICJiZmluX3NpciIsCisJLmlkID0gMSwKKwkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUoYmZpbl9zaXIxX3Jlc291cmNlcyksCisJLnJlc291cmNlID0gYmZpbl9zaXIxX3Jlc291cmNlcywKK307CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQkZJTl9TSVIyCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGJmaW5fc2lyMl9yZXNvdXJjZXNbXSA9IHsKKwl7CisJCS5zdGFydCA9IDB4RkZDMDIxMDAsCisJCS5lbmQgPSAweEZGQzAyMUZGLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCXsKKwkJLnN0YXJ0ID0gSVJRX1VBUlQyX1JYLAorCQkuZW5kID0gSVJRX1VBUlQyX1JYKzEsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJeworCQkuc3RhcnQgPSBDSF9VQVJUMl9SWCwKKwkJLmVuZCA9IENIX1VBUlQyX1JYKzEsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfRE1BLAorCX0sCit9Oworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9zaXIyX2RldmljZSA9IHsKKwkubmFtZSA9ICJiZmluX3NpciIsCisJLmlkID0gMiwKKwkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUoYmZpbl9zaXIyX3Jlc291cmNlcyksCisJLnJlc291cmNlID0gYmZpbl9zaXIyX3Jlc291cmNlcywKK307CisjZW5kaWYKKyNlbmRpZgorCisvKgorICogIFVTQi1MQU4gRXpFeHRlbmRlciBib2FyZAorICogIERyaXZlciBuZWVkcyB0byBrbm93IGFkZHJlc3MsIGlycSBhbmQgZmxhZyBwaW4uCisgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19TTUM5MVgpIHx8IGRlZmluZWQoQ09ORklHX1NNQzkxWF9NT0RVTEUpCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHNtYzkxeF9yZXNvdXJjZXNbXSA9IHsKKwl7CisJCS5uYW1lID0gInNtYzkxeC1yZWdzIiwKKwkJLnN0YXJ0ID0gMHgyMDMxMDMwMCwKKwkJLmVuZCA9IDB4MjAzMTAzMDAgKyAxNiwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCisJfSwgeworCQkuc3RhcnQgPSBJUlFfUEYwLAorCQkuZW5kID0gSVJRX1BGMCwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEgfCBJT1JFU09VUkNFX0lSUV9ISUdITEVWRUwsCisJfSwKK307CitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBzbWM5MXhfZGV2aWNlID0geworCS5uYW1lID0gInNtYzkxeCIsCisJLmlkID0gMCwKKwkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUoc21jOTF4X3Jlc291cmNlcyksCisJLnJlc291cmNlID0gc21jOTF4X3Jlc291cmNlcywKK307CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX1NQSV9CRklOKSB8fCBkZWZpbmVkKENPTkZJR19TUElfQkZJTl9NT0RVTEUpCisvKiBhbGwgU1BJIHBlcmlwaGVyYWxzIGluZm8gZ29lcyBoZXJlICovCisjaWYgZGVmaW5lZChDT05GSUdfTVREX00yNVA4MCkgXAorCXx8IGRlZmluZWQoQ09ORklHX01URF9NMjVQODBfTU9EVUxFKQorLyogU1BJIGZsYXNoIGNoaXAgKG0yNXAxNikgKi8KK3N0YXRpYyBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiBiZmluX3NwaV9mbGFzaF9wYXJ0aXRpb25zW10gPSB7CisJeworCQkubmFtZSA9ICJib290bG9hZGVyKHNwaSkiLAorCQkuc2l6ZSA9IDB4MDAwNDAwMDAsCisJCS5vZmZzZXQgPSAwLAorCQkubWFza19mbGFncyA9IE1URF9DQVBfUk9NCisJfSwgeworCQkubmFtZSA9ICJsaW51eCBrZXJuZWwoc3BpKSIsCisJCS5zaXplID0gMHgxYzAwMDAsCisJCS5vZmZzZXQgPSAweDQwMDAwCisJfQorfTsKKworc3RhdGljIHN0cnVjdCBmbGFzaF9wbGF0Zm9ybV9kYXRhIGJmaW5fc3BpX2ZsYXNoX2RhdGEgPSB7CisJLm5hbWUgPSAibTI1cDgwIiwKKwkucGFydHMgPSBiZmluX3NwaV9mbGFzaF9wYXJ0aXRpb25zLAorCS5ucl9wYXJ0cyA9IEFSUkFZX1NJWkUoYmZpbl9zcGlfZmxhc2hfcGFydGl0aW9ucyksCisJLnR5cGUgPSAibTI1cDE2IiwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYmZpbjV4eF9zcGlfY2hpcCBzcGlfZmxhc2hfY2hpcF9pbmZvID0geworCS5lbmFibGVfZG1hID0gMCwgICAgICAgICAvKiB1c2UgZG1hIHRyYW5zZmVyIHdpdGggdGhpcyBjaGlwKi8KKwkuYml0c19wZXJfd29yZCA9IDgsCisJLmNzX2NoYW5nZV9wZXJfd29yZCA9IDAsCit9OworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19UT1VDSFNDUkVFTl9BRDc4NzkpIHx8IGRlZmluZWQoQ09ORklHX1RPVUNIU0NSRUVOX0FENzg3OV9NT0RVTEUpCisjaW5jbHVkZSA8bGludXgvc3BpL2FkNzg3OS5oPgorc3RhdGljIGNvbnN0IHN0cnVjdCBhZDc4NzlfcGxhdGZvcm1fZGF0YSBiZmluX2FkNzg3OV90c19pbmZvID0geworCS5tb2RlbAkJCT0gNzg3OSwJLyogTW9kZWwgPSBBRDc4NzkgKi8KKwkueF9wbGF0ZV9vaG1zCQk9IDYyMCwJLyogNjIwIE9obSBmcm9tIHRoZSB0b3VjaCBkYXRhc2hlZXQgKi8KKwkucHJlc3N1cmVfbWF4CQk9IDEwMDAwLAorCS5wcmVzc3VyZV9taW4JCT0gMCwKKwkuZmlyc3RfY29udmVyc2lvbl9kZWxheSA9IDMsCS8qIHdhaXQgNTEydXMgYmVmb3JlIGRvIGEgZmlyc3QgY29udmVyc2lvbiAqLworCS5hY3F1aXNpdGlvbl90aW1lIAk9IDEsCS8qIDR1cyBhY3F1aXNpdGlvbiB0aW1lIHBlciBzYW1wbGUgKi8KKwkubWVkaWFuCQkJPSAyLAkvKiBkbyA4IG1lYXN1cmVtZW50cyAqLworCS5hdmVyYWdpbmcgCQk9IDEsCS8qIHRha2UgdGhlIGF2ZXJhZ2Ugb2YgNCBtaWRkbGUgc2FtcGxlcyAqLworCS5wZW5fZG93bl9hY2NfaW50ZXJ2YWwgCT0gMjU1LAkvKiA5LjQgbXMgKi8KKwkuZ3Bpb19vdXRwdXQJCT0gMSwJLyogY29uZmlndXJlIEFVWC9WQkFUL0dQSU8gYXMgR1BJTyBvdXRwdXQgKi8KKwkuZ3Bpb19kZWZhdWx0IAkJPSAxLAkvKiBEdXJpbmcgaW5pdGlhbGl6YXRpb24gc2V0IEdQSU8gPSBISUdIICovCit9OworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19UT1VDSFNDUkVFTl9BRDc4NzlfU1BJKSB8fCBkZWZpbmVkKENPTkZJR19UT1VDSFNDUkVFTl9BRDc4NzlfU1BJX01PRFVMRSkKK3N0YXRpYyBzdHJ1Y3QgYmZpbjV4eF9zcGlfY2hpcCBzcGlfYWQ3ODc5X2NoaXBfaW5mbyA9IHsKKwkuZW5hYmxlX2RtYSA9IDAsCisJLmJpdHNfcGVyX3dvcmQgPSAxNiwKK307CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX0ZCX0JGSU5fTFEwMzVRMSkgfHwgZGVmaW5lZChDT05GSUdfRkJfQkZJTl9MUTAzNVExX01PRFVMRSkKKyNpbmNsdWRlIDxhc20vYmZpbi1scTAzNXExLmg+CisKK3N0YXRpYyBzdHJ1Y3QgYmZpbl9scTAzNXExZmJfZGlzcF9pbmZvIGJmaW5fbHEwMzVxMV9kYXRhID0geworCS5tb2RlID0gCUxRMDM1X05PUk0gfCBMUTAzNV9SR0IgfCBMUTAzNV9STCB8IExRMDM1X1RCLAorCS51c2VfYmwgPSAJMCwJLyogbGV0IHNvbWV0aGluZyBlbHNlIGNvbnRyb2wgdGhlIExDRCBCbGFja2xpZ2h0ICovCisJLmdwaW9fYmwgPQlHUElPX1BGNywKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYmZpbl9scTAzNXExX3Jlc291cmNlc1tdID0geworCXsKKwkJLnN0YXJ0ID0gSVJRX1BQSV9FUlJPUiwKKwkJLmVuZCA9IElSUV9QUElfRVJST1IsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX2xxMDM1cTFfZGV2aWNlID0geworCS5uYW1lCQk9ICJiZmluLWxxMDM1cTEiLAorCS5pZAkJPSAtMSwKKwkubnVtX3Jlc291cmNlcyAJPSBBUlJBWV9TSVpFKGJmaW5fbHEwMzVxMV9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZSAJPSBiZmluX2xxMDM1cTFfcmVzb3VyY2VzLAorCS5kZXYJCT0geworCQkucGxhdGZvcm1fZGF0YSA9ICZiZmluX2xxMDM1cTFfZGF0YSwKKwl9LAorfTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfU1BJX1NQSURFVikgfHwgZGVmaW5lZChDT05GSUdfU1BJX1NQSURFVl9NT0RVTEUpCitzdGF0aWMgc3RydWN0IGJmaW41eHhfc3BpX2NoaXAgc3BpZGV2X2NoaXBfaW5mbyA9IHsKKwkuZW5hYmxlX2RtYSA9IDAsCisJLmJpdHNfcGVyX3dvcmQgPSA4LAorfTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfRkJfQkZJTl9MUTAzNVExKSB8fCBkZWZpbmVkKENPTkZJR19GQl9CRklOX0xRMDM1UTFfTU9EVUxFKQorc3RhdGljIHN0cnVjdCBiZmluNXh4X3NwaV9jaGlwIGxxMDM1cTFfc3BpX2NoaXBfaW5mbyA9IHsKKwkuZW5hYmxlX2RtYQk9IDAsCisJLmJpdHNfcGVyX3dvcmQJPSA4LAorfTsKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IHNwaV9ib2FyZF9pbmZvIGJmNTM4X3NwaV9ib2FyZF9pbmZvW10gX19pbml0ZGF0YSA9IHsKKyNpZiBkZWZpbmVkKENPTkZJR19NVERfTTI1UDgwKSBcCisJfHwgZGVmaW5lZChDT05GSUdfTVREX00yNVA4MF9NT0RVTEUpCisJeworCQkvKiB0aGUgbW9kYWxpYXMgbXVzdCBiZSB0aGUgc2FtZSBhcyBzcGkgZGV2aWNlIGRyaXZlciBuYW1lICovCisJCS5tb2RhbGlhcyA9ICJtMjVwODAiLCAvKiBOYW1lIG9mIHNwaV9kcml2ZXIgZm9yIHRoaXMgZGV2aWNlICovCisJCS5tYXhfc3BlZWRfaHogPSAyNTAwMDAwMCwgICAgIC8qIG1heCBzcGkgY2xvY2sgKFNDSykgc3BlZWQgaW4gSFogKi8KKwkJLmJ1c19udW0gPSAwLCAvKiBGcmFtZXdvcmsgYnVzIG51bWJlciAqLworCQkuY2hpcF9zZWxlY3QgPSAxLCAvKiBTUElfU1NFTDEqLworCQkucGxhdGZvcm1fZGF0YSA9ICZiZmluX3NwaV9mbGFzaF9kYXRhLAorCQkuY29udHJvbGxlcl9kYXRhID0gJnNwaV9mbGFzaF9jaGlwX2luZm8sCisJCS5tb2RlID0gU1BJX01PREVfMywKKwl9LAorI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfVE9VQ0hTQ1JFRU5fQUQ3ODc5X1NQSSkgfHwgZGVmaW5lZChDT05GSUdfVE9VQ0hTQ1JFRU5fQUQ3ODc5X1NQSV9NT0RVTEUpCisJeworCQkubW9kYWxpYXMgPSAiYWQ3ODc5IiwKKwkJLnBsYXRmb3JtX2RhdGEgPSAmYmZpbl9hZDc4NzlfdHNfaW5mbywKKwkJLmlycSA9IElSUV9QRjMsCisJCS5tYXhfc3BlZWRfaHogPSA1MDAwMDAwLCAgICAgLyogbWF4IHNwaSBjbG9jayAoU0NLKSBzcGVlZCBpbiBIWiAqLworCQkuYnVzX251bSA9IDAsCisJCS5jaGlwX3NlbGVjdCA9IDEsCisJCS5jb250cm9sbGVyX2RhdGEgPSAmc3BpX2FkNzg3OV9jaGlwX2luZm8sCisJCS5tb2RlID0gU1BJX0NQSEEgfCBTUElfQ1BPTCwKKwl9LAorI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfRkJfQkZJTl9MUTAzNVExKSB8fCBkZWZpbmVkKENPTkZJR19GQl9CRklOX0xRMDM1UTFfTU9EVUxFKQorCXsKKwkJLm1vZGFsaWFzID0gImJmaW4tbHEwMzVxMS1zcGkiLAorCQkubWF4X3NwZWVkX2h6ID0gMjAwMDAwMDAsICAgICAvKiBtYXggc3BpIGNsb2NrIChTQ0spIHNwZWVkIGluIEhaICovCisJCS5idXNfbnVtID0gMCwKKwkJLmNoaXBfc2VsZWN0ID0gMiwKKwkJLmNvbnRyb2xsZXJfZGF0YSA9ICZscTAzNXExX3NwaV9jaGlwX2luZm8sCisJCS5tb2RlID0gU1BJX0NQSEEgfCBTUElfQ1BPTCwKKwl9LAorI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfU1BJX1NQSURFVikgfHwgZGVmaW5lZChDT05GSUdfU1BJX1NQSURFVl9NT0RVTEUpCisJeworCQkubW9kYWxpYXMgPSAic3BpZGV2IiwKKwkJLm1heF9zcGVlZF9oeiA9IDMxMjUwMDAsICAgICAvKiBtYXggc3BpIGNsb2NrIChTQ0spIHNwZWVkIGluIEhaICovCisJCS5idXNfbnVtID0gMCwKKwkJLmNoaXBfc2VsZWN0ID0gMSwKKwkJLmNvbnRyb2xsZXJfZGF0YSA9ICZzcGlkZXZfY2hpcF9pbmZvLAorCX0sCisjZW5kaWYKK307CisKKy8qIFNQSSAoMCkgKi8KK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYmZpbl9zcGkwX3Jlc291cmNlW10gPSB7CisJWzBdID0geworCQkuc3RhcnQgPSBTUEkwX1JFR0JBU0UsCisJCS5lbmQgICA9IFNQSTBfUkVHQkFTRSArIDB4RkYsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQgPSBDSF9TUEkwLAorCQkuZW5kICAgPSBDSF9TUEkwLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwl9Cit9OworCisvKiBTUEkgKDEpICovCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGJmaW5fc3BpMV9yZXNvdXJjZVtdID0geworCVswXSA9IHsKKwkJLnN0YXJ0ID0gU1BJMV9SRUdCQVNFLAorCQkuZW5kICAgPSBTUEkxX1JFR0JBU0UgKyAweEZGLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0ID0gQ0hfU1BJMSwKKwkJLmVuZCAgID0gQ0hfU1BJMSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfQorfTsKKworLyogU1BJICgyKSAqLworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBiZmluX3NwaTJfcmVzb3VyY2VbXSA9IHsKKwlbMF0gPSB7CisJCS5zdGFydCA9IFNQSTJfUkVHQkFTRSwKKwkJLmVuZCAgID0gU1BJMl9SRUdCQVNFICsgMHhGRiwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydCA9IENIX1NQSTIsCisJCS5lbmQgICA9IENIX1NQSTIsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0KK307CisKKy8qIFNQSSBjb250cm9sbGVyIGRhdGEgKi8KK3N0YXRpYyBzdHJ1Y3QgYmZpbjV4eF9zcGlfbWFzdGVyIGJmNTM4X3NwaV9tYXN0ZXJfaW5mbzAgPSB7CisJLm51bV9jaGlwc2VsZWN0ID0gOCwKKwkuZW5hYmxlX2RtYSA9IDEsICAvKiBtYXN0ZXIgaGFzIHRoZSBhYmlsaXR5IHRvIGRvIGRtYSB0cmFuc2ZlciAqLworCS5waW5fcmVxID0ge1BfU1BJMF9TQ0ssIFBfU1BJMF9NSVNPLCBQX1NQSTBfTU9TSSwgMH0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZjUzOF9zcGlfbWFzdGVyMCA9IHsKKwkubmFtZSA9ICJiZmluLXNwaSIsCisJLmlkID0gMCwgLyogQnVzIG51bWJlciAqLworCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShiZmluX3NwaTBfcmVzb3VyY2UpLAorCS5yZXNvdXJjZSA9IGJmaW5fc3BpMF9yZXNvdXJjZSwKKwkuZGV2ID0geworCQkucGxhdGZvcm1fZGF0YSA9ICZiZjUzOF9zcGlfbWFzdGVyX2luZm8wLCAvKiBQYXNzZWQgdG8gZHJpdmVyICovCisJCX0sCit9OworCitzdGF0aWMgc3RydWN0IGJmaW41eHhfc3BpX21hc3RlciBiZjUzOF9zcGlfbWFzdGVyX2luZm8xID0geworCS5udW1fY2hpcHNlbGVjdCA9IDgsCisJLmVuYWJsZV9kbWEgPSAxLCAgLyogbWFzdGVyIGhhcyB0aGUgYWJpbGl0eSB0byBkbyBkbWEgdHJhbnNmZXIgKi8KKwkucGluX3JlcSA9IHtQX1NQSTFfU0NLLCBQX1NQSTFfTUlTTywgUF9TUEkxX01PU0ksIDB9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmY1Mzhfc3BpX21hc3RlcjEgPSB7CisJLm5hbWUgPSAiYmZpbi1zcGkiLAorCS5pZCA9IDEsIC8qIEJ1cyBudW1iZXIgKi8KKwkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUoYmZpbl9zcGkxX3Jlc291cmNlKSwKKwkucmVzb3VyY2UgPSBiZmluX3NwaTFfcmVzb3VyY2UsCisJLmRldiA9IHsKKwkJLnBsYXRmb3JtX2RhdGEgPSAmYmY1Mzhfc3BpX21hc3Rlcl9pbmZvMSwgLyogUGFzc2VkIHRvIGRyaXZlciAqLworCQl9LAorfTsKKworc3RhdGljIHN0cnVjdCBiZmluNXh4X3NwaV9tYXN0ZXIgYmY1Mzhfc3BpX21hc3Rlcl9pbmZvMiA9IHsKKwkubnVtX2NoaXBzZWxlY3QgPSA4LAorCS5lbmFibGVfZG1hID0gMSwgIC8qIG1hc3RlciBoYXMgdGhlIGFiaWxpdHkgdG8gZG8gZG1hIHRyYW5zZmVyICovCisJLnBpbl9yZXEgPSB7UF9TUEkyX1NDSywgUF9TUEkyX01JU08sIFBfU1BJMl9NT1NJLCAwfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmNTM4X3NwaV9tYXN0ZXIyID0geworCS5uYW1lID0gImJmaW4tc3BpIiwKKwkuaWQgPSAyLCAvKiBCdXMgbnVtYmVyICovCisJLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKGJmaW5fc3BpMl9yZXNvdXJjZSksCisJLnJlc291cmNlID0gYmZpbl9zcGkyX3Jlc291cmNlLAorCS5kZXYgPSB7CisJCS5wbGF0Zm9ybV9kYXRhID0gJmJmNTM4X3NwaV9tYXN0ZXJfaW5mbzIsIC8qIFBhc3NlZCB0byBkcml2ZXIgKi8KKwkJfSwKK307CisKKyNlbmRpZiAgLyogc3BpIG1hc3RlciBhbmQgZGV2aWNlcyAqLworCisjaWYgZGVmaW5lZChDT05GSUdfSTJDX0JMQUNLRklOX1RXSSkgfHwgZGVmaW5lZChDT05GSUdfSTJDX0JMQUNLRklOX1RXSV9NT0RVTEUpCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGJmaW5fdHdpMF9yZXNvdXJjZVtdID0geworCVswXSA9IHsKKwkJLnN0YXJ0ID0gVFdJMF9SRUdCQVNFLAorCQkuZW5kICAgPSBUV0kwX1JFR0JBU0UgKyAweEZGLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0ID0gSVJRX1RXSTAsCisJCS5lbmQgICA9IElSUV9UV0kwLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgaTJjX2JmaW5fdHdpMF9kZXZpY2UgPSB7CisJLm5hbWUgPSAiaTJjLWJmaW4tdHdpIiwKKwkuaWQgPSAwLAorCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShiZmluX3R3aTBfcmVzb3VyY2UpLAorCS5yZXNvdXJjZSA9IGJmaW5fdHdpMF9yZXNvdXJjZSwKK307CisKKyNpZiAhZGVmaW5lZChDT05GSUdfQkY1NDIpCS8qIFRoZSBCRjU0MiBvbmx5IGhhcyAxIFRXSSAqLworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBiZmluX3R3aTFfcmVzb3VyY2VbXSA9IHsKKwlbMF0gPSB7CisJCS5zdGFydCA9IFRXSTFfUkVHQkFTRSwKKwkJLmVuZCAgID0gVFdJMV9SRUdCQVNFICsgMHhGRiwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydCA9IElSUV9UV0kxLAorCQkuZW5kICAgPSBJUlFfVFdJMSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGkyY19iZmluX3R3aTFfZGV2aWNlID0geworCS5uYW1lID0gImkyYy1iZmluLXR3aSIsCisJLmlkID0gMSwKKwkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUoYmZpbl90d2kxX3Jlc291cmNlKSwKKwkucmVzb3VyY2UgPSBiZmluX3R3aTFfcmVzb3VyY2UsCit9OworI2VuZGlmCisjZW5kaWYKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBiZmluX2dwaW9zX3Jlc291cmNlcyA9IHsKKwkuc3RhcnQgPSAwLAorCS5lbmQgICA9IE1BWF9CTEFDS0ZJTl9HUElPUyAtIDEsCisJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX2dwaW9zX2RldmljZSA9IHsKKwkubmFtZSA9ICJzaW1wbGUtZ3BpbyIsCisJLmlkID0gLTEsCisJLm51bV9yZXNvdXJjZXMgPSAxLAorCS5yZXNvdXJjZSA9ICZiZmluX2dwaW9zX3Jlc291cmNlcywKK307CisKKyNpZiBkZWZpbmVkKENPTkZJR19LRVlCT0FSRF9HUElPKSB8fCBkZWZpbmVkKENPTkZJR19LRVlCT0FSRF9HUElPX01PRFVMRSkKKyNpbmNsdWRlIDxsaW51eC9ncGlvX2tleXMuaD4KKworc3RhdGljIHN0cnVjdCBncGlvX2tleXNfYnV0dG9uIGJmaW5fZ3Bpb19rZXlzX3RhYmxlW10gPSB7CisJe0JUTl8wLCBHUElPX1BDNywgMSwgImdwaW8ta2V5czogQlROMCJ9LAorfTsKKworc3RhdGljIHN0cnVjdCBncGlvX2tleXNfcGxhdGZvcm1fZGF0YSBiZmluX2dwaW9fa2V5c19kYXRhID0geworCS5idXR0b25zICAgICAgICA9IGJmaW5fZ3Bpb19rZXlzX3RhYmxlLAorCS5uYnV0dG9ucyAgICAgICA9IEFSUkFZX1NJWkUoYmZpbl9ncGlvX2tleXNfdGFibGUpLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9kZXZpY2VfZ3Bpb2tleXMgPSB7CisJLm5hbWUgICAgICA9ICJncGlvLWtleXMiLAorCS5kZXYgPSB7CisJCS5wbGF0Zm9ybV9kYXRhID0gJmJmaW5fZ3Bpb19rZXlzX2RhdGEsCisJfSwKK307CisjZW5kaWYKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBjY2xrX3ZsZXZfZGF0YXNoZWV0W10gPQoreworLyoKKyAqIEludGVybmFsIFZMRVYgQkY1MzhTQkJDMTUzMworICoqKip0ZW1wb3JhcmlseSB1c2luZyB0aGVzZSB2YWx1ZXMgdW50aWwgZGF0YSBzaGVldCBpcyB1cGRhdGVkCisgKi8KKwlWUlBBSVIoVkxFVl8xMDAsIDE1MDAwMDAwMCksCisJVlJQQUlSKFZMRVZfMTAwLCAyNTAwMDAwMDApLAorCVZSUEFJUihWTEVWXzExMCwgMjc2MDAwMDAwKSwKKwlWUlBBSVIoVkxFVl8xMTUsIDMwMTAwMDAwMCksCisJVlJQQUlSKFZMRVZfMTIwLCA1MjUwMDAwMDApLAorCVZSUEFJUihWTEVWXzEyNSwgNTUwMDAwMDAwKSwKKwlWUlBBSVIoVkxFVl8xMzAsIDYwMDAwMDAwMCksCit9OworCitzdGF0aWMgc3RydWN0IGJmaW5fZHBtY19wbGF0Zm9ybV9kYXRhIGJmaW5fZG1wY192cmVnX2RhdGEgPSB7CisJLnR1cGxlX3RhYiA9IGNjbGtfdmxldl9kYXRhc2hlZXQsCisJLnRhYnNpemUgPSBBUlJBWV9TSVpFKGNjbGtfdmxldl9kYXRhc2hlZXQpLAorCS52cl9zZXR0bGluZ190aW1lID0gMjUgLyogdXMgKi8sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX2RwbWMgPSB7CisJLm5hbWUgPSAiYmZpbiBkcG1jIiwKKwkuZGV2ID0geworCQkucGxhdGZvcm1fZGF0YSA9ICZiZmluX2RtcGNfdnJlZ19kYXRhLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqY21fYmY1MzhfZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7CisKKwkmYmZpbl9kcG1jLAorCisjaWYgZGVmaW5lZChDT05GSUdfUlRDX0RSVl9CRklOKSB8fCBkZWZpbmVkKENPTkZJR19SVENfRFJWX0JGSU5fTU9EVUxFKQorCSZydGNfZGV2aWNlLAorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19TRVJJQUxfQkZJTikgfHwgZGVmaW5lZChDT05GSUdfU0VSSUFMX0JGSU5fTU9EVUxFKQorCSZiZmluX3VhcnRfZGV2aWNlLAorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19TUElfQkZJTikgfHwgZGVmaW5lZChDT05GSUdfU1BJX0JGSU5fTU9EVUxFKQorCSZiZjUzOF9zcGlfbWFzdGVyMCwKKwkmYmY1Mzhfc3BpX21hc3RlcjEsCisJJmJmNTM4X3NwaV9tYXN0ZXIyLAorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19JMkNfQkxBQ0tGSU5fVFdJKSB8fCBkZWZpbmVkKENPTkZJR19JMkNfQkxBQ0tGSU5fVFdJX01PRFVMRSkKKwkmaTJjX2JmaW5fdHdpMF9kZXZpY2UsCisJJmkyY19iZmluX3R3aTFfZGV2aWNlLAorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19CRklOX1NJUikgfHwgZGVmaW5lZChDT05GSUdfQkZJTl9TSVJfTU9EVUxFKQorI2lmZGVmIENPTkZJR19CRklOX1NJUjAKKwkmYmZpbl9zaXIwX2RldmljZSwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19CRklOX1NJUjEKKwkmYmZpbl9zaXIxX2RldmljZSwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19CRklOX1NJUjIKKwkmYmZpbl9zaXIyX2RldmljZSwKKyNlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19TTUM5MVgpIHx8IGRlZmluZWQoQ09ORklHX1NNQzkxWF9NT0RVTEUpCisJJnNtYzkxeF9kZXZpY2UsCisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX0ZCX0JGSU5fTFEwMzVRMSkgfHwgZGVmaW5lZChDT05GSUdfRkJfQkZJTl9MUTAzNVExX01PRFVMRSkKKwkmYmZpbl9scTAzNXExX2RldmljZSwKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfS0VZQk9BUkRfR1BJTykgfHwgZGVmaW5lZChDT05GSUdfS0VZQk9BUkRfR1BJT19NT0RVTEUpCisJJmJmaW5fZGV2aWNlX2dwaW9rZXlzLAorI2VuZGlmCisKKwkmYmZpbl9ncGlvc19kZXZpY2UsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBlemtpdF9pbml0KHZvaWQpCit7CisJcHJpbnRrKEtFUk5fSU5GTyAiJXMoKTogcmVnaXN0ZXJpbmcgZGV2aWNlIHJlc291cmNlc1xuIiwgX19mdW5jX18pOworCXBsYXRmb3JtX2FkZF9kZXZpY2VzKGNtX2JmNTM4X2RldmljZXMsIEFSUkFZX1NJWkUoY21fYmY1MzhfZGV2aWNlcykpOworCisjaWYgZGVmaW5lZChDT05GSUdfU1BJX0JGSU4pIHx8IGRlZmluZWQoQ09ORklHX1NQSV9CRklOX01PRFVMRSkKKwlzcGlfcmVnaXN0ZXJfYm9hcmRfaW5mbyhiZjUzOF9zcGlfYm9hcmRfaW5mbywKKwkJCUFSUkFZX1NJWkUoYmY1Mzhfc3BpX2JvYXJkX2luZm8pKTsKKyNlbmRpZgorCisJcmV0dXJuIDA7Cit9CisKK2FyY2hfaW5pdGNhbGwoZXpraXRfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzgvZG1hLmMgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzgvZG1hLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY4MzdmYgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzOC9kbWEuYwpAQCAtMCwwICsxLDE2MSBAQAorLyoKKyAqIEZpbGU6ICAgICAgICAgYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L2RtYS5jCisgKiBCYXNlZCBvbjoKKyAqIEF1dGhvcjoKKyAqCisgKiBDcmVhdGVkOgorICogRGVzY3JpcHRpb246ICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIHNpbXBsZSBETUEgSW1wbGVtZW50YXRpb24gZm9yIEJsYWNrZmluCisgKgorICogTW9kaWZpZWQ6CisgKiAgICAgICAgICAgICAgIENvcHlyaWdodCAyMDA4IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBCdWdzOiAgICAgICAgIEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIHRoZSBmaWxlIENPUFlJTkcsIG9yIHdyaXRlCisgKiB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8YXNtL2JsYWNrZmluLmg+CisjaW5jbHVkZSA8YXNtL2RtYS5oPgorCitzdHJ1Y3QgZG1hX3JlZ2lzdGVyICpkbWFfaW9fYmFzZV9hZGRyW01BWF9ETUFfQ0hBTk5FTFNdID0geworCShzdHJ1Y3QgZG1hX3JlZ2lzdGVyICopIERNQTBfTkVYVF9ERVNDX1BUUiwKKwkoc3RydWN0IGRtYV9yZWdpc3RlciAqKSBETUExX05FWFRfREVTQ19QVFIsCisJKHN0cnVjdCBkbWFfcmVnaXN0ZXIgKikgRE1BMl9ORVhUX0RFU0NfUFRSLAorCShzdHJ1Y3QgZG1hX3JlZ2lzdGVyICopIERNQTNfTkVYVF9ERVNDX1BUUiwKKwkoc3RydWN0IGRtYV9yZWdpc3RlciAqKSBETUE0X05FWFRfREVTQ19QVFIsCisJKHN0cnVjdCBkbWFfcmVnaXN0ZXIgKikgRE1BNV9ORVhUX0RFU0NfUFRSLAorCShzdHJ1Y3QgZG1hX3JlZ2lzdGVyICopIERNQTZfTkVYVF9ERVNDX1BUUiwKKwkoc3RydWN0IGRtYV9yZWdpc3RlciAqKSBETUE3X05FWFRfREVTQ19QVFIsCisJKHN0cnVjdCBkbWFfcmVnaXN0ZXIgKikgRE1BOF9ORVhUX0RFU0NfUFRSLAorCShzdHJ1Y3QgZG1hX3JlZ2lzdGVyICopIERNQTlfTkVYVF9ERVNDX1BUUiwKKwkoc3RydWN0IGRtYV9yZWdpc3RlciAqKSBETUExMF9ORVhUX0RFU0NfUFRSLAorCShzdHJ1Y3QgZG1hX3JlZ2lzdGVyICopIERNQTExX05FWFRfREVTQ19QVFIsCisJKHN0cnVjdCBkbWFfcmVnaXN0ZXIgKikgRE1BMTJfTkVYVF9ERVNDX1BUUiwKKwkoc3RydWN0IGRtYV9yZWdpc3RlciAqKSBETUExM19ORVhUX0RFU0NfUFRSLAorCShzdHJ1Y3QgZG1hX3JlZ2lzdGVyICopIERNQTE0X05FWFRfREVTQ19QVFIsCisJKHN0cnVjdCBkbWFfcmVnaXN0ZXIgKikgRE1BMTVfTkVYVF9ERVNDX1BUUiwKKwkoc3RydWN0IGRtYV9yZWdpc3RlciAqKSBETUExNl9ORVhUX0RFU0NfUFRSLAorCShzdHJ1Y3QgZG1hX3JlZ2lzdGVyICopIERNQTE3X05FWFRfREVTQ19QVFIsCisJKHN0cnVjdCBkbWFfcmVnaXN0ZXIgKikgRE1BMThfTkVYVF9ERVNDX1BUUiwKKwkoc3RydWN0IGRtYV9yZWdpc3RlciAqKSBETUExOV9ORVhUX0RFU0NfUFRSLAorCShzdHJ1Y3QgZG1hX3JlZ2lzdGVyICopIE1ETUEwX0QwX05FWFRfREVTQ19QVFIsCisJKHN0cnVjdCBkbWFfcmVnaXN0ZXIgKikgTURNQTBfUzBfTkVYVF9ERVNDX1BUUiwKKwkoc3RydWN0IGRtYV9yZWdpc3RlciAqKSBNRE1BMF9EMV9ORVhUX0RFU0NfUFRSLAorCShzdHJ1Y3QgZG1hX3JlZ2lzdGVyICopIE1ETUEwX1MxX05FWFRfREVTQ19QVFIsCisJKHN0cnVjdCBkbWFfcmVnaXN0ZXIgKikgTURNQTFfRDBfTkVYVF9ERVNDX1BUUiwKKwkoc3RydWN0IGRtYV9yZWdpc3RlciAqKSBNRE1BMV9TMF9ORVhUX0RFU0NfUFRSLAorCShzdHJ1Y3QgZG1hX3JlZ2lzdGVyICopIE1ETUExX0QxX05FWFRfREVTQ19QVFIsCisJKHN0cnVjdCBkbWFfcmVnaXN0ZXIgKikgTURNQTFfUzFfTkVYVF9ERVNDX1BUUiwKK307CitFWFBPUlRfU1lNQk9MKGRtYV9pb19iYXNlX2FkZHIpOworCitpbnQgY2hhbm5lbDJpcnEodW5zaWduZWQgaW50IGNoYW5uZWwpCit7CisJaW50IHJldF9pcnEgPSAtMTsKKworCXN3aXRjaCAoY2hhbm5lbCkgeworCWNhc2UgQ0hfUFBJOgorCQlyZXRfaXJxID0gSVJRX1BQSTsKKwkJYnJlYWs7CisKKwljYXNlIENIX1VBUlQwX1JYOgorCQlyZXRfaXJxID0gSVJRX1VBUlQwX1JYOworCQlicmVhazsKKworCWNhc2UgQ0hfVUFSVDBfVFg6CisJCXJldF9pcnEgPSBJUlFfVUFSVDBfVFg7CisJCWJyZWFrOworCisJY2FzZSBDSF9VQVJUMV9SWDoKKwkJcmV0X2lycSA9IElSUV9VQVJUMV9SWDsKKwkJYnJlYWs7CisKKwljYXNlIENIX1VBUlQxX1RYOgorCQlyZXRfaXJxID0gSVJRX1VBUlQxX1RYOworCQlicmVhazsKKworCWNhc2UgQ0hfVUFSVDJfUlg6CisJCXJldF9pcnEgPSBJUlFfVUFSVDJfUlg7CisJCWJyZWFrOworCisJY2FzZSBDSF9VQVJUMl9UWDoKKwkJcmV0X2lycSA9IElSUV9VQVJUMl9UWDsKKwkJYnJlYWs7CisKKwljYXNlIENIX1NQT1JUMF9SWDoKKwkJcmV0X2lycSA9IElSUV9TUE9SVDBfUlg7CisJCWJyZWFrOworCisJY2FzZSBDSF9TUE9SVDBfVFg6CisJCXJldF9pcnEgPSBJUlFfU1BPUlQwX1RYOworCQlicmVhazsKKworCWNhc2UgQ0hfU1BPUlQxX1JYOgorCQlyZXRfaXJxID0gSVJRX1NQT1JUMV9SWDsKKwkJYnJlYWs7CisKKwljYXNlIENIX1NQT1JUMV9UWDoKKwkJcmV0X2lycSA9IElSUV9TUE9SVDFfVFg7CisJCWJyZWFrOworCisJY2FzZSBDSF9TUE9SVDJfUlg6CisJCXJldF9pcnEgPSBJUlFfU1BPUlQyX1JYOworCQlicmVhazsKKworCWNhc2UgQ0hfU1BPUlQyX1RYOgorCQlyZXRfaXJxID0gSVJRX1NQT1JUMl9UWDsKKwkJYnJlYWs7CisKKwljYXNlIENIX1NQT1JUM19SWDoKKwkJcmV0X2lycSA9IElSUV9TUE9SVDNfUlg7CisJCWJyZWFrOworCisJY2FzZSBDSF9TUE9SVDNfVFg6CisJCXJldF9pcnEgPSBJUlFfU1BPUlQzX1RYOworCQlicmVhazsKKworCWNhc2UgQ0hfU1BJMDoKKwkJcmV0X2lycSA9IElSUV9TUEkwOworCQlicmVhazsKKworCWNhc2UgQ0hfU1BJMToKKwkJcmV0X2lycSA9IElSUV9TUEkxOworCQlicmVhazsKKworCWNhc2UgQ0hfU1BJMjoKKwkJcmV0X2lycSA9IElSUV9TUEkyOworCQlicmVhazsKKworCWNhc2UgQ0hfTUVNX1NUUkVBTTBfU1JDOgorCWNhc2UgQ0hfTUVNX1NUUkVBTTBfREVTVDoKKwkJcmV0X2lycSA9IElSUV9NRU0wX0RNQTA7CisJCWJyZWFrOworCWNhc2UgQ0hfTUVNX1NUUkVBTTFfU1JDOgorCWNhc2UgQ0hfTUVNX1NUUkVBTTFfREVTVDoKKwkJcmV0X2lycSA9IElSUV9NRU0wX0RNQTE7CisJCWJyZWFrOworCWNhc2UgQ0hfTUVNX1NUUkVBTTJfU1JDOgorCWNhc2UgQ0hfTUVNX1NUUkVBTTJfREVTVDoKKwkJcmV0X2lycSA9IElSUV9NRU0xX0RNQTA7CisJCWJyZWFrOworCWNhc2UgQ0hfTUVNX1NUUkVBTTNfU1JDOgorCWNhc2UgQ0hfTUVNX1NUUkVBTTNfREVTVDoKKwkJcmV0X2lycSA9IElSUV9NRU0xX0RNQTE7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gcmV0X2lycTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzOC9pbmNsdWRlL21hY2gvYW5vbWFseS5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L2luY2x1ZGUvbWFjaC9hbm9tYWx5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTEzMGI0ZgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzOC9pbmNsdWRlL21hY2gvYW5vbWFseS5oCkBAIC0wLDAgKzEsMTMyIEBACisvKgorICogRmlsZTogaW5jbHVkZS9hc20tYmxhY2tmaW4vbWFjaC1iZjUzOC9hbm9tYWx5LmgKKyAqIEJ1Z3M6IEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA4IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KKyAqLworCisvKiBUaGlzIGZpbGUgc2hvdWxlIGJlIHVwIHRvIGRhdGUgd2l0aDoKKyAqICAtIFJldmlzaW9uIEcsIDA5LzE4LzIwMDg7IEFEU1AtQkY1MzgvQkY1MzhGIEJsYWNrZmluIFByb2Nlc3NvciBBbm9tYWx5IExpc3QKKyAqICAtIFJldmlzaW9uIEwsIDA5LzE4LzIwMDg7IEFEU1AtQkY1MzkvQkY1MzlGIEJsYWNrZmluIFByb2Nlc3NvciBBbm9tYWx5IExpc3QKKyAqLworCisjaWZuZGVmIF9NQUNIX0FOT01BTFlfSF8KKyNkZWZpbmUgX01BQ0hfQU5PTUFMWV9IXworCisjaWYgX19TSUxJQ09OX1JFVklTSU9OX18gPCA0CisjIGVycm9yIHdpbGwgbm90IHdvcmsgb24gQkY1Mzggc2lsaWNvbiB2ZXJzaW9uIDAuMCwgMC4xLCAwLjIsIG9yIDAuMworI2VuZGlmCisKKy8qIE11bHRpLUlzc3VlIEluc3RydWN0aW9uIHdpdGggZHNwMzJzaGlmdGltbSBpbiBzbG90MSBhbmQgUC1yZWcgU3RvcmUgaW4gc2xvdDIgTm90IFN1cHBvcnRlZCAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwMDc0ICgxKQorLyogRE1BX1JVTiBCaXQgSXMgTm90IFZhbGlkIGFmdGVyIGEgUGVyaXBoZXJhbCBSZWNlaXZlIENoYW5uZWwgRE1BIFN0b3BzICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDAxMTkgKDEpCisvKiBSeC5IIENhbm5vdCBCZSBVc2VkIHRvIEFjY2VzcyAxNi1iaXQgU3lzdGVtIE1NUiBSZWdpc3RlcnMgKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDEyMiAoMSkKKy8qIFBQSSBEYXRhIExlbmd0aHMgYmV0d2VlbiA4IGFuZCAxNiBEbyBOb3QgWmVybyBPdXQgVXBwZXIgQml0cyAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwMTY2ICgxKQorLyogUFBJX0NPVU5UIENhbm5vdCBCZSBQcm9ncmFtbWVkIHRvIDAgaW4gR2VuZXJhbCBQdXJwb3NlIFRYIG9yIFJYIE1vZGVzICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDAxNzkgKDEpCisvKiBQUElfREVMQVkgTm90IEZ1bmN0aW9uYWwgaW4gUFBJIE1vZGVzIHdpdGggMCBGcmFtZSBTeW5jcyAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwMTgwICgxKQorLyogRmFsc2UgSS9PIFBpbiBJbnRlcnJ1cHRzIG9uIEVkZ2UtU2Vuc2l0aXZlIElucHV0cyBXaGVuIFBvbGFyaXR5IFNldHRpbmcgSXMgQ2hhbmdlZCAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwMTkzICgxKQorLyogQ3VycmVudCBETUEgQWRkcmVzcyBTaG93cyBXcm9uZyBWYWx1ZSBEdXJpbmcgQ2FycnkgRml4ICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDAxOTkgKF9fU0lMSUNPTl9SRVZJU0lPTl9fIDwgNCkKKy8qIE5NSSBFdmVudCBhdCBCb290IFRpbWUgUmVzdWx0cyBpbiBVbnByZWRpY3RhYmxlIFN0YXRlICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDAyMTkgKDEpCisvKiBTUEkgU2xhdmUgQm9vdCBNb2RlIE1vZGlmaWVzIFJlZ2lzdGVycyBmcm9tIFJlc2V0IFZhbHVlICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDAyMjkgKDEpCisvKiBQUElfRlMzIElzIE5vdCBEcml2ZW4gaW4gMiBvciAzIEludGVybmFsIEZyYW1lIFN5bmMgVHJhbnNtaXQgTW9kZXMgKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDIzMyAoMSkKKy8qIElmIGktY2FjaGUgaXMgb24sIENTWU5DL1NTWU5DL0lETEUgYXJvdW5kIENoYW5nZSBvZiBDb250cm9sIGNhdXNlcyBmYWlsdXJlcyAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwMjQ0IChfX1NJTElDT05fUkVWSVNJT05fXyA8IDMpCisvKiBTcHVyaW91cyBIYXJkd2FyZSBFcnJvciBmcm9tIGFuIEFjY2VzcyBpbiB0aGUgU2hhZG93IG9mIGEgQ29uZGl0aW9uYWwgQnJhbmNoICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDAyNDUgKDEpCisvKiBNYXhpbXVtIEV4dGVybmFsIENsb2NrIFNwZWVkIGZvciBUaW1lcnMgKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDI1MyAoMSkKKy8qIERDUExCX0ZBVUxUX0FERFIgTU1SIHJlZ2lzdGVyIG1heSBiZSBjb3JydXB0ZWQgKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDI2MSAoX19TSUxJQ09OX1JFVklTSU9OX18gPCAzKQorLyogSGlnaCBJL08gQWN0aXZpdHkgQ2F1c2VzIE91dHB1dCBWb2x0YWdlIG9mIEludGVybmFsIFZvbHRhZ2UgUmVndWxhdG9yIChWZGRpbnQpIHRvIERlY3JlYXNlICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDAyNzAgKF9fU0lMSUNPTl9SRVZJU0lPTl9fIDwgNCkKKy8qIENlcnRhaW4gRGF0YSBDYWNoZSBXcml0ZXRocm91Z2ggTW9kZXMgRmFpbCBmb3IgVmRkaW50IDw9IDAuOVYgKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDI3MiAoMSkKKy8qIFdyaXRlcyB0byBTeW5jaHJvbm91cyBTRFJBTSBNZW1vcnkgTWF5IEJlIExvc3QgKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDI3MyAoX19TSUxJQ09OX1JFVklTSU9OX18gPCA0KQorLyogV3JpdGVzIHRvIGFuIEkvTyBEYXRhIFJlZ2lzdGVyIE9uZSBTQ0xLIEN5Y2xlIGFmdGVyIGFuIEVkZ2UgSXMgRGV0ZWN0ZWQgTWF5IENsZWFyIEludGVycnVwdCAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwMjc3IChfX1NJTElDT05fUkVWSVNJT05fXyA8IDQpCisvKiBEaXNhYmxpbmcgUGVyaXBoZXJhbHMgd2l0aCBETUEgUnVubmluZyBNYXkgQ2F1c2UgRE1BIFN5c3RlbSBJbnN0YWJpbGl0eSAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwMjc4IChfX1NJTElDT05fUkVWSVNJT05fXyA8IDQpCisvKiBGYWxzZSBIYXJkd2FyZSBFcnJvciBFeGNlcHRpb24gd2hlbiBJU1IgQ29udGV4dCBJcyBOb3QgUmVzdG9yZWQgKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDI4MSAoX19TSUxJQ09OX1JFVklTSU9OX18gPCA0KQorLyogTWVtb3J5IERNQSBDb3JydXB0aW9uIHdpdGggMzItQml0IERhdGEgYW5kIFRyYWZmaWMgQ29udHJvbCAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwMjgyIChfX1NJTElDT05fUkVWSVNJT05fXyA8IDQpCisvKiBTeXN0ZW0gTU1SIFdyaXRlIElzIFN0YWxsZWQgSW5kZWZpbml0ZWx5IHdoZW4gS2lsbGVkIGluIGEgUGFydGljdWxhciBTdGFnZSAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwMjgzIChfX1NJTElDT05fUkVWSVNJT05fXyA8IDQpCisvKiBTUE9SVHMgTWF5IFJlY2VpdmUgQmFkIERhdGEgSWYgRklGT3MgRmlsbCBVcCAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwMjg4IChfX1NJTElDT05fUkVWSVNJT05fXyA8IDQpCisvKiBSZWFkcyBmcm9tIENBTiBNYWlsYm94IGFuZCBBY2NlcHRhbmNlIE1hc2sgQXJlYSBDYW4gRmFpbCAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwMjkxIChfX1NJTElDT05fUkVWSVNJT05fXyA8IDQpCisvKiBIaWJlcm5hdGUgTGVha2FnZSBDdXJyZW50IElzIEhpZ2hlciBUaGFuIFNwZWNpZmllZCAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwMjkzIChfX1NJTElDT05fUkVWSVNJT05fXyA8IDQpCisvKiBUaW1lciBQaW4gTGltaXRhdGlvbnMgZm9yIFBQSSBUWCBNb2RlcyB3aXRoIEV4dGVybmFsIEZyYW1lIFN5bmNzICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDAyOTQgKDEpCisvKiBNZW1vcnktVG8tTWVtb3J5IERNQSBTb3VyY2UvRGVzdGluYXRpb24gRGVzY3JpcHRvcnMgTXVzdCBCZSBpbiBTYW1lIE1lbW9yeSBTcGFjZSAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwMzAxIChfX1NJTElDT05fUkVWSVNJT05fXyA8IDQpCisvKiBTU1lOQ3MgQWZ0ZXIgV3JpdGVzIFRvIENBTi9ETUEgTU1SIFJlZ2lzdGVycyBBcmUgTm90IEFsd2F5cyBIYW5kbGVkIENvcnJlY3RseSAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwMzA0IChfX1NJTElDT05fUkVWSVNJT05fXyA8IDQpCisvKiBTQ0tFTE9XIEJpdCBEb2VzIE5vdCBNYWludGFpbiBTdGF0ZSBUaHJvdWdoIEhpYmVybmF0ZSAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwMzA3IChfX1NJTElDT05fUkVWSVNJT05fXyA8IDQpCisvKiBGYWxzZSBIYXJkd2FyZSBFcnJvcnMgQ2F1c2VkIGJ5IEZldGNoZXMgYXQgdGhlIEJvdW5kYXJ5IG9mIFJlc2VydmVkIE1lbW9yeSAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwMzEwICgxKQorLyogRXJyb3JzIHdoZW4gU1NZTkMsIENTWU5DLCBvciBMb2FkcyB0byBMVCwgTEIgYW5kIExDIFJlZ2lzdGVycyBBcmUgSW50ZXJydXB0ZWQgKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDMxMiAoX19TSUxJQ09OX1JFVklTSU9OX18gPCA1KQorLyogUFBJIElzIExldmVsLVNlbnNpdGl2ZSBvbiBGaXJzdCBUcmFuc2ZlciAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwMzEzIChfX1NJTElDT05fUkVWSVNJT05fXyA8IDQpCisvKiBLaWxsZWQgU3lzdGVtIE1NUiBXcml0ZSBDb21wbGV0ZXMgRXJyb25lb3VzbHkgb24gTmV4dCBTeXN0ZW0gTU1SIEFjY2VzcyAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwMzE1IChfX1NJTElDT05fUkVWSVNJT05fXyA8IDQpCisvKiBQRnggR2xpdGNoIG9uIFdyaXRlIHRvIEZJT19GTEFHX0Qgb3IgRklPX0ZMQUdfVCAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwMzE4IChfX1NJTElDT05fUkVWSVNJT05fXyA8IDQpCisvKiBSZWd1bGF0b3IgUHJvZ3JhbW1pbmcgQmxvY2tlZCB3aGVuIEhpYmVybmF0ZSBXYWtldXAgU291cmNlIFJlbWFpbnMgQWN0aXZlICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDAzNTUgKF9fU0lMSUNPTl9SRVZJU0lPTl9fIDwgNSkKKy8qIFNlcmlhbCBQb3J0IChTUE9SVCkgTXVsdGljaGFubmVsIFRyYW5zbWl0IEZhaWx1cmUgd2hlbiBDaGFubmVsIDAgSXMgRGlzYWJsZWQgKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDM1NyAoX19TSUxJQ09OX1JFVklTSU9OX18gPCA1KQorLyogUFBJIFVuZGVyZmxvdyBFcnJvciBHb2VzIFVuZGV0ZWN0ZWQgaW4gSVRVLVIgNjU2IE1vZGUgKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDM2NiAoMSkKKy8qIFBvc3NpYmxlIFJFVFMgUmVnaXN0ZXIgQ29ycnVwdGlvbiB3aGVuIFN1YnJvdXRpbmUgSXMgdW5kZXIgNSBDeWNsZXMgaW4gRHVyYXRpb24gKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDM3MSAoX19TSUxJQ09OX1JFVklTSU9OX18gPCA1KQorLyogRW50ZXJpbmcgSGliZXJuYXRlIFN0YXRlIHdpdGggUGVyaXBoZXJhbCBXYWtldXBzIEVuYWJsZWQgRHJhd3MgRXhjZXNzIEN1cnJlbnQgKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDM3NCAoX19TSUxJQ09OX1JFVklTSU9OX18gPT0gNCkKKy8qIE5ldyBGZWF0dXJlOiBPcGVuLURyYWluIEdQSU8gT3V0cHV0cyBvbiBQQzEgYW5kIFBDNCAoTm90IEF2YWlsYWJsZSBvbiBPbGRlciBTaWxpY29uKSAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwMzc1IChfX1NJTElDT05fUkVWSVNJT05fXyA8IDQpCisvKiBTU1lOQyBTdGFsbHMgUHJvY2Vzc29yIHdoZW4gRXhlY3V0ZWQgZnJvbSBOb24tQ2FjaGVhYmxlIE1lbW9yeSAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwNDAyIChfX1NJTElDT05fUkVWSVNJT05fXyA8IDQpCisvKiBMZXZlbC1TZW5zaXRpdmUgRXh0ZXJuYWwgR1BJTyBXYWtldXBzIE1heSBDYXVzZSBJbmRlZmluaXRlIFN0YWxsICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDA0MDMgKDEpCisvKiBTcGVjdWxhdGl2ZSBGZXRjaGVzIENhbiBDYXVzZSBVbmRlc2lyZWQgRXh0ZXJuYWwgRklGTyBPcGVyYXRpb25zICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDA0MTYgKDEpCisvKiBNdWx0aWNoYW5uZWwgU1BPUlQgQ2hhbm5lbCBNaXNhbGlnbm1lbnQgVW5kZXIgU3BlY2lmaWMgQ29uZmlndXJhdGlvbiAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwNDI1ICgxKQorLyogU3BlY3VsYXRpdmUgRmV0Y2hlcyBvZiBJbmRpcmVjdC1Qb2ludGVyIEluc3RydWN0aW9ucyBDYW4gQ2F1c2UgRmFsc2UgSGFyZHdhcmUgRXJyb3JzICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDA0MjYgKDEpCisvKiBTcGVjaWZpYyBHUElPIFBpbnMgTWF5IENoYW5nZSBTdGF0ZSB3aGVuIEVudGVyaW5nIEhpYmVybmF0ZSAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwNDM2IChfX1NJTElDT05fUkVWSVNJT05fXyA+IDMpCisvKiBJRkxVU0ggSW5zdHJ1Y3Rpb24gYXQgRW5kIG9mIEhhcmR3YXJlIExvb3AgQ2F1c2VzIEluZmluaXRlIFN0YWxsICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDA0NDMgKDEpCisKKy8qIEFub21hbGllcyB0aGF0IGRvbid0IGV4aXN0IG9uIHRoaXMgcHJvYyAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwMTU4ICgwKQorI2RlZmluZSBBTk9NQUxZXzA1MDAwMTk4ICgwKQorI2RlZmluZSBBTk9NQUxZXzA1MDAwMjMwICgwKQorI2RlZmluZSBBTk9NQUxZXzA1MDAwMjYzICgwKQorI2RlZmluZSBBTk9NQUxZXzA1MDAwMzExICgwKQorI2RlZmluZSBBTk9NQUxZXzA1MDAwMzIzICgwKQorI2RlZmluZSBBTk9NQUxZXzA1MDAwMzUzICgxKQorI2RlZmluZSBBTk9NQUxZXzA1MDAwMzYzICgwKQorI2RlZmluZSBBTk9NQUxZXzA1MDAwMzg2ICgxKQorI2RlZmluZSBBTk9NQUxZXzA1MDAwNDEyICgwKQorI2RlZmluZSBBTk9NQUxZXzA1MDAwNDMyICgwKQorI2RlZmluZSBBTk9NQUxZXzA1MDAwNDM1ICgwKQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzOC9pbmNsdWRlL21hY2gvYmY1MzguaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzOC9pbmNsdWRlL21hY2gvYmY1MzguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzhhYmIzCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L2luY2x1ZGUvbWFjaC9iZjUzOC5oCkBAIC0wLDAgKzEsMTI0IEBACisvKgorICogRmlsZTogICAgICAgICBpbmNsdWRlL2FzbS1ibGFja2Zpbi9tYWNoLWJmNTM4L2JmNTM4LmgKKyAqIEJhc2VkIG9uOglpbmNsdWRlL2FzbS1ibGFja2Zpbi9tYWNoLWJmNTM3L2JmNTM3LmgKKyAqIEF1dGhvcjoJTWljaGFlbCBIZW5uZXJpY2ggKG1pY2hhZWwuaGVubmVyaWNoQGFuYWxvZy5jb20pCisgKgorICogQ3JlYXRlZDoKKyAqIERlc2NyaXB0aW9uOiAgU1lTVEVNIE1NUiBSRUdJU1RFUiBBTkQgTUVNT1JZIE1BUCBGT1IgQURTUC1CRjUyNworICoKKyAqIE1vZGlmaWVkOgorICogICAgICAgICAgICAgICBDb3B5cmlnaHQgMjAwNC0yMDA3IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBCdWdzOiAgICAgICAgIEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIHRoZSBmaWxlIENPUFlJTkcsIG9yIHdyaXRlCisgKiB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqLworCisjaWZuZGVmIF9fTUFDSF9CRjUzOF9IX18KKyNkZWZpbmUgX19NQUNIX0JGNTM4X0hfXworCisjZGVmaW5lIE9GRlNFVF8oeCkgKCh4KSAmIDB4MDAwMEZGRkYpCisKKy8qc29tZSBtaXNjIGRlZmluZXMqLworI2RlZmluZSBJTUFTS19JVkcxNQkJMHg4MDAwCisjZGVmaW5lIElNQVNLX0lWRzE0CQkweDQwMDAKKyNkZWZpbmUgSU1BU0tfSVZHMTMJCTB4MjAwMAorI2RlZmluZSBJTUFTS19JVkcxMgkJMHgxMDAwCisKKyNkZWZpbmUgSU1BU0tfSVZHMTEJCTB4MDgwMAorI2RlZmluZSBJTUFTS19JVkcxMAkJMHgwNDAwCisjZGVmaW5lIElNQVNLX0lWRzkJCTB4MDIwMAorI2RlZmluZSBJTUFTS19JVkc4CQkweDAxMDAKKworI2RlZmluZSBJTUFTS19JVkc3CQkweDAwODAKKyNkZWZpbmUgSU1BU0tfSVZHVE1SCTB4MDA0MAorI2RlZmluZSBJTUFTS19JVkdIVwkJMHgwMDIwCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgQkZJTl9EU1VCQkFOS1MJNAorI2RlZmluZSBCRklOX0RXQVlTCQkyCisjZGVmaW5lIEJGSU5fRExJTkVTCQk2NAorI2RlZmluZSBCRklOX0lTVUJCQU5LUwk0CisjZGVmaW5lIEJGSU5fSVdBWVMJCTQKKyNkZWZpbmUgQkZJTl9JTElORVMJCTMyCisKKyNkZWZpbmUgV0FZMF9MCQkJMHgxCisjZGVmaW5lIFdBWTFfTAkJCTB4MgorI2RlZmluZSBXQVkwMV9MCQkJMHgzCisjZGVmaW5lIFdBWTJfTAkJCTB4NAorI2RlZmluZSBXQVkwMl9MCQkJMHg1CisjZGVmaW5lCVdBWTEyX0wJCQkweDYKKyNkZWZpbmUJV0FZMDEyX0wJCTB4NworCisjZGVmaW5lCVdBWTNfTAkJCTB4OAorI2RlZmluZQlXQVkwM19MCQkJMHg5CisjZGVmaW5lCVdBWTEzX0wJCQkweEEKKyNkZWZpbmUJV0FZMDEzX0wJCTB4QgorCisjZGVmaW5lCVdBWTMyX0wJCQkweEMKKyNkZWZpbmUJV0FZMzIwX0wJCTB4RAorI2RlZmluZQlXQVkzMjFfTAkJMHhFCisjZGVmaW5lCVdBWUFMTF9MCQkweEYKKworI2RlZmluZSBETUNfRU5BQkxFICgyPDwyKQkvKnllcywgMiwgbm90IDEgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBFQklVIFNldHRpbmdzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgQU1CQ1RMMFZBTAkoKENPTkZJR19CQU5LXzEgPDwgMTYpIHwgQ09ORklHX0JBTktfMCkKKyNkZWZpbmUgQU1CQ1RMMVZBTAkoKENPTkZJR19CQU5LXzMgPDwgMTYpIHwgQ09ORklHX0JBTktfMikKKworI2lmZGVmIENPTkZJR19DX0FNQkVOX0FMTAorI2RlZmluZSBWX0FNQkVOIEFNQkVOX0FMTAorI2VuZGlmCisjaWZkZWYgQ09ORklHX0NfQU1CRU4KKyNkZWZpbmUgVl9BTUJFTiAweDAKKyNlbmRpZgorI2lmZGVmIENPTkZJR19DX0FNQkVOX0IwCisjZGVmaW5lIFZfQU1CRU4gQU1CRU5fQjAKKyNlbmRpZgorI2lmZGVmIENPTkZJR19DX0FNQkVOX0IwX0IxCisjZGVmaW5lIFZfQU1CRU4gQU1CRU5fQjBfQjEKKyNlbmRpZgorI2lmZGVmIENPTkZJR19DX0FNQkVOX0IwX0IxX0IyCisjZGVmaW5lIFZfQU1CRU4gQU1CRU5fQjBfQjFfQjIKKyNlbmRpZgorI2lmZGVmIENPTkZJR19DX0FNQ0tFTgorI2RlZmluZSBWX0FNQ0tFTiBBTUNLRU4KKyNlbHNlCisjZGVmaW5lIFZfQU1DS0VOIDB4MAorI2VuZGlmCisjaWZkZWYgQ09ORklHX0NfQ0RQUklPCisjZGVmaW5lIFZfQ0RQUklPIDB4MTAwCisjZWxzZQorI2RlZmluZSBWX0NEUFJJTyAweDAKKyNlbmRpZgorCisjZGVmaW5lIEFNR0NUTFZBTAkoVl9BTUJFTiB8IFZfQU1DS0VOIHwgVl9DRFBSSU8pCisKKyNpZmRlZiBDT05GSUdfQkY1MzgKKyNkZWZpbmUgQ1BVICJCRjUzOCIKKyNkZWZpbmUgQ1BVSUQgMHgyN0M0CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQkY1MzkKKyNkZWZpbmUgQ1BVICJCRjUzOSIKKyNkZWZpbmUgQ1BVSUQgMHgyN0M0CS8qIEZYSU1FOj8gKi8KKyNlbmRpZgorCisjaWZuZGVmIENQVQorI2Vycm9yICJVbmtub3duIENQVSB0eXBlIC0gVGhpcyBrZXJuZWwgZG9lc24ndCBzZWVtIHRvIGJlIGNvbmZpZ3VyZWQgcHJvcGVybHkiCisjZW5kaWYKKworI2VuZGlmCQkJCS8qIF9fTUFDSF9CRjUzOF9IX18gICovCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzgvaW5jbHVkZS9tYWNoL2JmaW5fc2VyaWFsXzV4eC5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L2luY2x1ZGUvbWFjaC9iZmluX3NlcmlhbF81eHguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDUwM2I2Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L2luY2x1ZGUvbWFjaC9iZmluX3NlcmlhbF81eHguaApAQCAtMCwwICsxLDE4MyBAQAorLyoKKyAqIGZpbGU6ICAgICAgICAgaW5jbHVkZS9hc20tYmxhY2tmaW4vbWFjaC1iZjUzOC9iZmluX3NlcmlhbF81eHguaAorICogYmFzZWQgb246CisgKiBhdXRob3I6CisgKgorICogY3JlYXRlZDoKKyAqIGRlc2NyaXB0aW9uOgorICoJYmxhY2tmaW4gc2VyaWFsIGRyaXZlciBoZWFkZXIgZmlsZXMKKyAqIHJldjoKKyAqCisgKiBtb2RpZmllZDoKKyAqCisgKgorICogYnVnczogICAgICAgICBlbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KKyAqCisgKiB0aGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBnbnUgZ2VuZXJhbCBwdWJsaWMgbGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBmcmVlIHNvZnR3YXJlIGZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIHRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IHdpdGhvdXQgYW55IHdhcnJhbnR5OyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIG1lcmNoYW50YWJpbGl0eSBvciBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gIHNlZSB0aGUKKyAqIGdudSBnZW5lcmFsIHB1YmxpYyBsaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogeW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgZ251IGdlbmVyYWwgcHVibGljIGxpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgY29weWluZy4KKyAqIGlmIG5vdCwgd3JpdGUgdG8gdGhlIGZyZWUgc29mdHdhcmUgZm91bmRhdGlvbiwKKyAqIDU5IHRlbXBsZSBwbGFjZSAtIHN1aXRlIDMzMCwgYm9zdG9uLCBtYSAwMjExMS0xMzA3LCB1c2EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgorI2luY2x1ZGUgPGFzbS9kbWEuaD4KKyNpbmNsdWRlIDxhc20vcG9ydG11eC5oPgorCisjZGVmaW5lIFVBUlRfR0VUX0NIQVIodWFydCkgICAgIGJmaW5fcmVhZDE2KCgodWFydCktPnBvcnQubWVtYmFzZSArIE9GRlNFVF9SQlIpKQorI2RlZmluZSBVQVJUX0dFVF9ETEwodWFydCkJYmZpbl9yZWFkMTYoKCh1YXJ0KS0+cG9ydC5tZW1iYXNlICsgT0ZGU0VUX0RMTCkpCisjZGVmaW5lIFVBUlRfR0VUX0lFUih1YXJ0KSAgICAgIGJmaW5fcmVhZDE2KCgodWFydCktPnBvcnQubWVtYmFzZSArIE9GRlNFVF9JRVIpKQorI2RlZmluZSBVQVJUX0dFVF9ETEgodWFydCkJYmZpbl9yZWFkMTYoKCh1YXJ0KS0+cG9ydC5tZW1iYXNlICsgT0ZGU0VUX0RMSCkpCisjZGVmaW5lIFVBUlRfR0VUX0lJUih1YXJ0KSAgICAgIGJmaW5fcmVhZDE2KCgodWFydCktPnBvcnQubWVtYmFzZSArIE9GRlNFVF9JSVIpKQorI2RlZmluZSBVQVJUX0dFVF9MQ1IodWFydCkgICAgICBiZmluX3JlYWQxNigoKHVhcnQpLT5wb3J0Lm1lbWJhc2UgKyBPRkZTRVRfTENSKSkKKyNkZWZpbmUgVUFSVF9HRVRfR0NUTCh1YXJ0KSAgICAgYmZpbl9yZWFkMTYoKCh1YXJ0KS0+cG9ydC5tZW1iYXNlICsgT0ZGU0VUX0dDVEwpKQorCisjZGVmaW5lIFVBUlRfUFVUX0NIQVIodWFydCwgdikgICBiZmluX3dyaXRlMTYoKCh1YXJ0KS0+cG9ydC5tZW1iYXNlICsgT0ZGU0VUX1RIUiksIHYpCisjZGVmaW5lIFVBUlRfUFVUX0RMTCh1YXJ0LCB2KSAgICBiZmluX3dyaXRlMTYoKCh1YXJ0KS0+cG9ydC5tZW1iYXNlICsgT0ZGU0VUX0RMTCksIHYpCisjZGVmaW5lIFVBUlRfUFVUX0lFUih1YXJ0LCB2KSAgICBiZmluX3dyaXRlMTYoKCh1YXJ0KS0+cG9ydC5tZW1iYXNlICsgT0ZGU0VUX0lFUiksIHYpCisjZGVmaW5lIFVBUlRfU0VUX0lFUih1YXJ0LCB2KSAgICBVQVJUX1BVVF9JRVIodWFydCwgVUFSVF9HRVRfSUVSKHVhcnQpIHwgKHYpKQorI2RlZmluZSBVQVJUX0NMRUFSX0lFUih1YXJ0LCB2KSAgVUFSVF9QVVRfSUVSKHVhcnQsIFVBUlRfR0VUX0lFUih1YXJ0KSAmIH4odikpCisjZGVmaW5lIFVBUlRfUFVUX0RMSCh1YXJ0LCB2KSAgICBiZmluX3dyaXRlMTYoKCh1YXJ0KS0+cG9ydC5tZW1iYXNlICsgT0ZGU0VUX0RMSCksIHYpCisjZGVmaW5lIFVBUlRfUFVUX0xDUih1YXJ0LCB2KSAgICBiZmluX3dyaXRlMTYoKCh1YXJ0KS0+cG9ydC5tZW1iYXNlICsgT0ZGU0VUX0xDUiksIHYpCisjZGVmaW5lIFVBUlRfUFVUX0dDVEwodWFydCwgdikgICBiZmluX3dyaXRlMTYoKCh1YXJ0KS0+cG9ydC5tZW1iYXNlICsgT0ZGU0VUX0dDVEwpLCB2KQorCisjZGVmaW5lIFVBUlRfU0VUX0RMQUIodWFydCkgICAgIGRvIHsgVUFSVF9QVVRfTENSKHVhcnQsIFVBUlRfR0VUX0xDUih1YXJ0KSB8IERMQUIpOyBTU1lOQygpOyB9IHdoaWxlICgwKQorI2RlZmluZSBVQVJUX0NMRUFSX0RMQUIodWFydCkgICBkbyB7IFVBUlRfUFVUX0xDUih1YXJ0LCBVQVJUX0dFVF9MQ1IodWFydCkgJiB+RExBQik7IFNTWU5DKCk7IH0gd2hpbGUgKDApCisKKyNkZWZpbmUgVUFSVF9HRVRfQ1RTKHgpIGdwaW9fZ2V0X3ZhbHVlKHgtPmN0c19waW4pCisjZGVmaW5lIFVBUlRfU0VUX1JUUyh4KSBncGlvX3NldF92YWx1ZSh4LT5ydHNfcGluLCAxKQorI2RlZmluZSBVQVJUX0NMRUFSX1JUUyh4KSBncGlvX3NldF92YWx1ZSh4LT5ydHNfcGluLCAwKQorI2RlZmluZSBVQVJUX0VOQUJMRV9JTlRTKHgsIHYpIFVBUlRfUFVUX0lFUih4LCB2KQorI2RlZmluZSBVQVJUX0RJU0FCTEVfSU5UUyh4KSBVQVJUX1BVVF9JRVIoeCwgMCkKKworI2lmIGRlZmluZWQoQ09ORklHX0JGSU5fVUFSVDBfQ1RTUlRTKSB8fCBkZWZpbmVkKENPTkZJR19CRklOX1VBUlQxX0NUU1JUUykKKyMgZGVmaW5lIENPTkZJR19TRVJJQUxfQkZJTl9DVFNSVFMKKworIyBpZm5kZWYgQ09ORklHX1VBUlQwX0NUU19QSU4KKyMgIGRlZmluZSBDT05GSUdfVUFSVDBfQ1RTX1BJTiAtMQorIyBlbmRpZgorCisjIGlmbmRlZiBDT05GSUdfVUFSVDBfUlRTX1BJTgorIyAgZGVmaW5lIENPTkZJR19VQVJUMF9SVFNfUElOIC0xCisjIGVuZGlmCisKKyMgaWZuZGVmIENPTkZJR19VQVJUMV9DVFNfUElOCisjICBkZWZpbmUgQ09ORklHX1VBUlQxX0NUU19QSU4gLTEKKyMgZW5kaWYKKworIyBpZm5kZWYgQ09ORklHX1VBUlQxX1JUU19QSU4KKyMgIGRlZmluZSBDT05GSUdfVUFSVDFfUlRTX1BJTiAtMQorIyBlbmRpZgorI2VuZGlmCisKKyNkZWZpbmUgQkZJTl9VQVJUX1RYX0ZJRk9fU0laRQkyCisKKy8qCisgKiBUaGUgcGluIGNvbmZpZ3VyYXRpb24gaXMgZGlmZmVyZW50IGZyb20gc2NoZW1hdGljCisgKi8KK3N0cnVjdCBiZmluX3NlcmlhbF9wb3J0IHsKKwlzdHJ1Y3QgdWFydF9wb3J0CXBvcnQ7CisJdW5zaWduZWQgaW50CQlvbGRfc3RhdHVzOworCXVuc2lnbmVkIGludCBsc3I7CisjaWZkZWYgQ09ORklHX1NFUklBTF9CRklOX0RNQQorCWludAkJCXR4X2RvbmU7CisJaW50CQkJdHhfY291bnQ7CisJc3RydWN0IGNpcmNfYnVmCQlyeF9kbWFfYnVmOworCXN0cnVjdCB0aW1lcl9saXN0ICAgICAgIHJ4X2RtYV90aW1lcjsKKwlpbnQJCQlyeF9kbWFfbnJvd3M7CisJdW5zaWduZWQgaW50CQl0eF9kbWFfY2hhbm5lbDsKKwl1bnNpZ25lZCBpbnQJCXJ4X2RtYV9jaGFubmVsOworCXN0cnVjdCB3b3JrX3N0cnVjdAl0eF9kbWFfd29ya3F1ZXVlOworI2VuZGlmCisjaWZkZWYgQ09ORklHX1NFUklBTF9CRklOX0NUU1JUUworCXN0cnVjdCB0aW1lcl9saXN0CWN0c190aW1lcjsKKwlpbnQJCWN0c19waW47CisJaW50CQlydHNfcGluOworI2VuZGlmCit9OworCisvKiBUaGUgaGFyZHdhcmUgY2xlYXJzIHRoZSBMU1IgYml0cyB1cG9uIHJlYWQsIHNvIHdlIG5lZWQgdG8gY2FjaGUKKyAqIHNvbWUgb2YgdGhlIG1vcmUgZnVuIGJpdHMgaW4gc29mdHdhcmUgc28gdGhleSBkb24ndCBnZXQgbG9zdAorICogd2hlbiBjaGVja2luZyB0aGUgTFNSIGluIG90aGVyIGNvZGUgcGF0aHMgKFRYKS4KKyAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgVUFSVF9HRVRfTFNSKHN0cnVjdCBiZmluX3NlcmlhbF9wb3J0ICp1YXJ0KQoreworCXVuc2lnbmVkIGludCBsc3IgPSBiZmluX3JlYWQxNih1YXJ0LT5wb3J0Lm1lbWJhc2UgKyBPRkZTRVRfTFNSKTsKKwl1YXJ0LT5sc3IgfD0gKGxzciAmIChCSXxGRXxQRXxPRSkpOworCXJldHVybiBsc3IgfCB1YXJ0LT5sc3I7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBVQVJUX0NMRUFSX0xTUihzdHJ1Y3QgYmZpbl9zZXJpYWxfcG9ydCAqdWFydCkKK3sKKwl1YXJ0LT5sc3IgPSAwOworCWJmaW5fd3JpdGUxNih1YXJ0LT5wb3J0Lm1lbWJhc2UgKyBPRkZTRVRfTFNSLCAtMSk7Cit9CisKK3N0cnVjdCBiZmluX3NlcmlhbF9yZXMgeworCXVuc2lnbmVkIGxvbmcJdWFydF9iYXNlX2FkZHI7CisJaW50CQl1YXJ0X2lycTsKKyNpZmRlZiBDT05GSUdfU0VSSUFMX0JGSU5fRE1BCisJdW5zaWduZWQgaW50CXVhcnRfdHhfZG1hX2NoYW5uZWw7CisJdW5zaWduZWQgaW50CXVhcnRfcnhfZG1hX2NoYW5uZWw7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfU0VSSUFMX0JGSU5fQ1RTUlRTCisJaW50CXVhcnRfY3RzX3BpbjsKKwlpbnQJdWFydF9ydHNfcGluOworI2VuZGlmCit9OworCitzdHJ1Y3QgYmZpbl9zZXJpYWxfcmVzIGJmaW5fc2VyaWFsX3Jlc291cmNlW10gPSB7CisjaWZkZWYgQ09ORklHX1NFUklBTF9CRklOX1VBUlQwCisJeworCTB4RkZDMDA0MDAsCisJSVJRX1VBUlQwX1JYLAorI2lmZGVmIENPTkZJR19TRVJJQUxfQkZJTl9ETUEKKwlDSF9VQVJUMF9UWCwKKwlDSF9VQVJUMF9SWCwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19CRklOX1VBUlQwX0NUU1JUUworCUNPTkZJR19VQVJUMF9DVFNfUElOLAorCUNPTkZJR19VQVJUMF9SVFNfUElOLAorI2VuZGlmCisJfSwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19TRVJJQUxfQkZJTl9VQVJUMQorCXsKKwkweEZGQzAyMDAwLAorCUlSUV9VQVJUMV9SWCwKKyNpZmRlZiBDT05GSUdfU0VSSUFMX0JGSU5fRE1BCisJQ0hfVUFSVDFfVFgsCisJQ0hfVUFSVDFfUlgsCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQkZJTl9VQVJUMV9DVFNSVFMKKwlDT05GSUdfVUFSVDFfQ1RTX1BJTiwKKwlDT05GSUdfVUFSVDFfUlRTX1BJTiwKKyNlbmRpZgorCX0sCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfU0VSSUFMX0JGSU5fVUFSVDIKKwl7CisJMHhGRkMwMjEwMCwKKwlJUlFfVUFSVDJfUlgsCisjaWZkZWYgQ09ORklHX1NFUklBTF9CRklOX0RNQQorCUNIX1VBUlQyX1RYLAorCUNIX1VBUlQyX1JYLAorI2VuZGlmCisjaWZkZWYgQ09ORklHX0JGSU5fVUFSVDJfQ1RTUlRTCisJQ09ORklHX1VBUlQyX0NUU19QSU4sCisJQ09ORklHX1VBUlQyX1JUU19QSU4sCisjZW5kaWYKKwl9LAorI2VuZGlmCit9OworCisjZGVmaW5lIERSSVZFUl9OQU1FICJiZmluLXVhcnQiCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzgvaW5jbHVkZS9tYWNoL2JsYWNrZmluLmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzgvaW5jbHVkZS9tYWNoL2JsYWNrZmluLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWEyNTM3MWE5Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L2luY2x1ZGUvbWFjaC9ibGFja2Zpbi5oCkBAIC0wLDAgKzEsMTAxIEBACisvKgorICogRmlsZTogICAgICAgICBpbmNsdWRlL2FzbS1ibGFja2Zpbi9tYWNoLWJmNTM4L2JsYWNrZmluLmgKKyAqIEJhc2VkIG9uOgorICogQXV0aG9yOgorICoKKyAqIENyZWF0ZWQ6CisgKiBEZXNjcmlwdGlvbjoKKyAqCisgKiBSZXY6CisgKgorICogTW9kaWZpZWQ6CisgKgorICoKKyAqIEJ1Z3M6ICAgICAgICAgRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuCisgKiBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICovCisKKyNpZm5kZWYgX01BQ0hfQkxBQ0tGSU5fSF8KKyNkZWZpbmUgX01BQ0hfQkxBQ0tGSU5fSF8KKworI2RlZmluZSBCRjUzOF9GQU1JTFkKKworI2luY2x1ZGUgImJmNTM4LmgiCisjaW5jbHVkZSAibWVtX21hcC5oIgorI2luY2x1ZGUgImRlZkJGNTM5LmgiCisjaW5jbHVkZSAiYW5vbWFseS5oIgorCisKKyNpZiAhZGVmaW5lZChfX0FTU0VNQkxZX18pCisjaW5jbHVkZSAiY2RlZkJGNTM4LmgiCisKKyNpZiBkZWZpbmVkKENPTkZJR19CRjUzOSkKKyNpbmNsdWRlICJjZGVmQkY1MzkuaCIKKyNlbmRpZgorI2VuZGlmCisKKy8qIFVBUlRfSUlSIFJlZ2lzdGVyICovCisjZGVmaW5lIFNUQVRVUyh4KQkoKHggPDwgMSkgJiAweDA2KQorI2RlZmluZSBTVEFUVVNfUDEJMHgwMgorI2RlZmluZSBTVEFUVVNfUDAJMHgwMQorCisjZGVmaW5lIEJGSU5fVUFSVF9OUl9QT1JUUwkzCisKKyNkZWZpbmUgT0ZGU0VUX1RIUiAgICAgICAgICAgICAgMHgwMAkvKiBUcmFuc21pdCBIb2xkaW5nIHJlZ2lzdGVyICAgICAgICAgICAgKi8KKyNkZWZpbmUgT0ZGU0VUX1JCUiAgICAgICAgICAgICAgMHgwMAkvKiBSZWNlaXZlIEJ1ZmZlciByZWdpc3RlciAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgT0ZGU0VUX0RMTCAgICAgICAgICAgICAgMHgwMAkvKiBEaXZpc29yIExhdGNoIChMb3ctQnl0ZSkgICAgICAgICAgICAgKi8KKyNkZWZpbmUgT0ZGU0VUX0lFUiAgICAgICAgICAgICAgMHgwNAkvKiBJbnRlcnJ1cHQgRW5hYmxlIFJlZ2lzdGVyICAgICAgICAgICAgKi8KKyNkZWZpbmUgT0ZGU0VUX0RMSCAgICAgICAgICAgICAgMHgwNAkvKiBEaXZpc29yIExhdGNoIChIaWdoLUJ5dGUpICAgICAgICAgICAgKi8KKyNkZWZpbmUgT0ZGU0VUX0lJUiAgICAgICAgICAgICAgMHgwOAkvKiBJbnRlcnJ1cHQgSWRlbnRpZmljYXRpb24gUmVnaXN0ZXIgICAgKi8KKyNkZWZpbmUgT0ZGU0VUX0xDUiAgICAgICAgICAgICAgMHgwQwkvKiBMaW5lIENvbnRyb2wgUmVnaXN0ZXIgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgT0ZGU0VUX01DUiAgICAgICAgICAgICAgMHgxMAkvKiBNb2RlbSBDb250cm9sIFJlZ2lzdGVyICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgT0ZGU0VUX0xTUiAgICAgICAgICAgICAgMHgxNAkvKiBMaW5lIFN0YXR1cyBSZWdpc3RlciAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgT0ZGU0VUX01TUiAgICAgICAgICAgICAgMHgxOAkvKiBNb2RlbSBTdGF0dXMgUmVnaXN0ZXIgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgT0ZGU0VUX1NDUiAgICAgICAgICAgICAgMHgxQwkvKiBTQ1IgU2NyYXRjaCBSZWdpc3RlciAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgT0ZGU0VUX0dDVEwgICAgICAgICAgICAgMHgyNAkvKiBHbG9iYWwgQ29udHJvbCBSZWdpc3RlciAgICAgICAgICAgICAgKi8KKworCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMF9JUlFfU1RBVFVTCWJmaW5fd3JpdGVfTURNQTBfRDBfSVJRX1NUQVRVUworI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDBfU1RBUlRfQUREUiAgIGJmaW5fd3JpdGVfTURNQTBfRDBfU1RBUlRfQUREUgorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzBfU1RBUlRfQUREUiAgIGJmaW5fd3JpdGVfTURNQTBfUzBfU1RBUlRfQUREUgorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDBfWF9DT1VOVCAgICAgIGJmaW5fd3JpdGVfTURNQTBfRDBfWF9DT1VOVAorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzBfWF9DT1VOVCAgICAgIGJmaW5fd3JpdGVfTURNQTBfUzBfWF9DT1VOVAorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDBfWV9DT1VOVCAgICAgIGJmaW5fd3JpdGVfTURNQTBfRDBfWV9DT1VOVAorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzBfWV9DT1VOVCAgICAgIGJmaW5fd3JpdGVfTURNQTBfUzBfWV9DT1VOVAorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDBfWF9NT0RJRlkgICAgIGJmaW5fd3JpdGVfTURNQTBfRDBfWF9NT0RJRlkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MwX1hfTU9ESUZZICAgICBiZmluX3dyaXRlX01ETUEwX1MwX1hfTU9ESUZZCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMF9ZX01PRElGWSAgICAgYmZpbl93cml0ZV9NRE1BMF9EMF9ZX01PRElGWQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzBfWV9NT0RJRlkgICAgIGJmaW5fd3JpdGVfTURNQTBfUzBfWV9NT0RJRlkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MwX0NPTkZJRyAgICAgICBiZmluX3dyaXRlX01ETUEwX1MwX0NPTkZJRworI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDBfQ09ORklHICAgICAgIGJmaW5fd3JpdGVfTURNQTBfRDBfQ09ORklHCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MwX0NPTkZJRyAgICAgICAgYmZpbl9yZWFkX01ETUEwX1MwX0NPTkZJRworI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMF9JUlFfU1RBVFVTICAgIGJmaW5fcmVhZF9NRE1BMF9EMF9JUlFfU1RBVFVTCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMF9JUlFfU1RBVFVTICAgYmZpbl93cml0ZV9NRE1BMF9TMF9JUlFfU1RBVFVTCisKKworLyogRFBNQyovCisjZGVmaW5lIGJmaW5fcmVhZF9TVE9QQ0tfT0ZGKCkgYmZpbl9yZWFkX1NUT1BDSygpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1RPUENLX09GRih2YWwpIGJmaW5fd3JpdGVfU1RPUENLKHZhbCkKKyNkZWZpbmUgU1RPUENLX09GRiBTVE9QQ0sKKworLyogUExMX0RJViBNYXNrcwkJCQkJCQkJCQkJCQkqLworI2RlZmluZSBDQ0xLX0RJVjEgQ1NFTF9ESVYxCS8qICAgICAgICAgIENDTEsgPSBWQ08gLyAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENDTEtfRElWMiBDU0VMX0RJVjIJLyogICAgICAgICAgQ0NMSyA9IFZDTyAvIDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0NMS19ESVY0IENTRUxfRElWNAkvKiAgICAgICAgICBDQ0xLID0gVkNPIC8gNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDQ0xLX0RJVjggQ1NFTF9ESVY4CS8qICAgICAgICAgIENDTEsgPSBWQ08gLyA4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L2luY2x1ZGUvbWFjaC9jZGVmQkY1MzguaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzOC9pbmNsdWRlL21hY2gvY2RlZkJGNTM4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQxNzI1YgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzOC9pbmNsdWRlL21hY2gvY2RlZkJGNTM4LmgKQEAgLTAsMCArMSwyMTA4IEBACisvKgorICogRmlsZTogICAgICAgICBpbmNsdWRlL2FzbS1ibGFja2Zpbi9tYWNoLWJmNTM4L2NkZWZCRjUzOC5oCisgKiBCYXNlZCBvbjoKKyAqIEF1dGhvcjoKKyAqCisgKiBDcmVhdGVkOgorICogRGVzY3JpcHRpb246CisgKgorICogUmV2OgorICoKKyAqIE1vZGlmaWVkOgorICoKKyAqIEJ1Z3M6ICAgICAgICAgRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuCisgKiBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICovCisKKyNpZm5kZWYgX0NERUZfQkY1MzhfSAorI2RlZmluZSBfQ0RFRl9CRjUzOF9ICisKKyNpbmNsdWRlIDxhc20vYmxhY2tmaW4uaD4KKworLyppbmNsdWRlIGFsbCBDb3JlIHJlZ2lzdGVycyBhbmQgYml0IGRlZmluaXRpb25zKi8KKyNpbmNsdWRlICJkZWZCRjUzOS5oIgorCisvKmluY2x1ZGUgY29yZSBzcGVjaWZpYyByZWdpc3RlciBwb2ludGVyIGRlZmluaXRpb25zKi8KKyNpbmNsdWRlIDxhc20vY2RlZl9MUEJsYWNrZmluLmg+CisKKyNkZWZpbmUgYmZpbl93cml0ZVBUUihhZGRyLCB2YWwpIGJmaW5fd3JpdGUzMihhZGRyLCB2YWwpCisKKyNkZWZpbmUgYmZpbl9yZWFkX1BMTF9DVEwoKSAgICAgICAgICAgIGJmaW5fcmVhZDE2KFBMTF9DVEwpCisjZGVmaW5lIGJmaW5fcmVhZF9QTExfRElWKCkgICAgICAgICAgICBiZmluX3JlYWQxNihQTExfRElWKQorI2RlZmluZSBiZmluX3dyaXRlX1BMTF9ESVYodmFsKSAgICAgICAgYmZpbl93cml0ZTE2KFBMTF9ESVYsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1ZSX0NUTCgpICAgICAgICAgICAgIGJmaW5fcmVhZDE2KFZSX0NUTCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BMTF9TVEFUKCkgICAgICAgICAgIGJmaW5fcmVhZDE2KFBMTF9TVEFUKQorI2RlZmluZSBiZmluX3dyaXRlX1BMTF9TVEFUKHZhbCkgICAgICAgYmZpbl93cml0ZTE2KFBMTF9TVEFULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QTExfTE9DS0NOVCgpICAgICAgICBiZmluX3JlYWQxNihQTExfTE9DS0NOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9QTExfTE9DS0NOVCh2YWwpICAgIGJmaW5fd3JpdGUxNihQTExfTE9DS0NOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0hJUElEKCkgICAgICAgICAgICAgYmZpbl9yZWFkMzIoQ0hJUElEKQorI2RlZmluZSBiZmluX3dyaXRlX0NISVBJRCh2YWwpICAgICAgICAgYmZpbl93cml0ZTMyKENISVBJRCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1dSU1QoKSAgICAgICAgICAgICAgYmZpbl9yZWFkMTYoU1dSU1QpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1dSU1QodmFsKSAgICAgICAgICBiZmluX3dyaXRlMTYoU1dSU1QsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NZU0NSKCkgICAgICAgICAgICAgIGJmaW5fcmVhZDE2KFNZU0NSKQorI2RlZmluZSBiZmluX3dyaXRlX1NZU0NSKHZhbCkgICAgICAgICAgYmZpbl93cml0ZTE2KFNZU0NSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TSUNfUlZFQ1QoKSAgICAgICAgICBiZmluX3JlYWRQVFIoU0lDX1JWRUNUKQorI2RlZmluZSBiZmluX3dyaXRlX1NJQ19SVkVDVCh2YWwpICAgICAgYmZpbl93cml0ZVBUUihTSUNfUlZFQ1QsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NJQ19JTUFTSzAoKSAgICAgICAgIGJmaW5fcmVhZDMyKFNJQ19JTUFTSzApCisjZGVmaW5lIGJmaW5fd3JpdGVfU0lDX0lNQVNLMCh2YWwpICAgICBiZmluX3dyaXRlMzIoU0lDX0lNQVNLMCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU0lDX0lNQVNLMSgpICAgICAgICAgYmZpbl9yZWFkMzIoU0lDX0lNQVNLMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9TSUNfSU1BU0sxKHZhbCkgICAgIGJmaW5fd3JpdGUzMihTSUNfSU1BU0sxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TSUNfSU1BU0soeCkJICAgICAgIGJmaW5fcmVhZDMyKFNJQ19JTUFTSzAgKyB4ICogKFNJQ19JTUFTSzEgLSBTSUNfSU1BU0swKSkKKyNkZWZpbmUgYmZpbl93cml0ZV9TSUNfSU1BU0soeCwgdmFsKSAgIGJmaW5fd3JpdGUzMihTSUNfSU1BU0swICsgeCAqIChTSUNfSU1BU0sxIC0gU0lDX0lNQVNLMCksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NJQ19JU1IwKCkgICAgICAgICAgIGJmaW5fcmVhZDMyKFNJQ19JU1IwKQorI2RlZmluZSBiZmluX3dyaXRlX1NJQ19JU1IwKHZhbCkgICAgICAgYmZpbl93cml0ZTMyKFNJQ19JU1IwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TSUNfSVNSMSgpICAgICAgICAgICBiZmluX3JlYWQzMihTSUNfSVNSMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9TSUNfSVNSMSh2YWwpICAgICAgIGJmaW5fd3JpdGUzMihTSUNfSVNSMSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU0lDX0lTUih4KQkgICAgICAgYmZpbl9yZWFkMzIoU0lDX0lTUjAgKyB4ICogKFNJQ19JU1IxIC0gU0lDX0lTUjApKQorI2RlZmluZSBiZmluX3dyaXRlX1NJQ19JU1IoeCwgdmFsKSAgICAgYmZpbl93cml0ZTMyKFNJQ19JU1IwICsgeCAqIChTSUNfSVNSMSAtIFNJQ19JU1IwKSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU0lDX0lXUjAoKSAgICAgICAgICAgYmZpbl9yZWFkMzIoU0lDX0lXUjApCisjZGVmaW5lIGJmaW5fd3JpdGVfU0lDX0lXUjAodmFsKSAgICAgICBiZmluX3dyaXRlMzIoU0lDX0lXUjAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NJQ19JV1IxKCkgICAgICAgICAgIGJmaW5fcmVhZDMyKFNJQ19JV1IxKQorI2RlZmluZSBiZmluX3dyaXRlX1NJQ19JV1IxKHZhbCkgICAgICAgYmZpbl93cml0ZTMyKFNJQ19JV1IxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TSUNfSVdSKHgpCSAgICAgICBiZmluX3JlYWQzMihTSUNfSVdSMCArIHggKiAoU0lDX0lXUjEgLSBTSUNfSVdSMCkpCisjZGVmaW5lIGJmaW5fd3JpdGVfU0lDX0lXUih4LCB2YWwpICAgICBiZmluX3dyaXRlMzIoKFNJQ19JV1IwICsgeCAqIChTSUNfSVdSMSAtIFNJQ19JV1IwKSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU0lDX0lBUjAoKSAgICAgICAgICAgYmZpbl9yZWFkMzIoU0lDX0lBUjApCisjZGVmaW5lIGJmaW5fd3JpdGVfU0lDX0lBUjAodmFsKSAgICAgICBiZmluX3dyaXRlMzIoU0lDX0lBUjAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NJQ19JQVIxKCkgICAgICAgICAgIGJmaW5fcmVhZDMyKFNJQ19JQVIxKQorI2RlZmluZSBiZmluX3dyaXRlX1NJQ19JQVIxKHZhbCkgICAgICAgYmZpbl93cml0ZTMyKFNJQ19JQVIxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TSUNfSUFSMigpICAgICAgICAgICBiZmluX3JlYWQzMihTSUNfSUFSMikKKyNkZWZpbmUgYmZpbl93cml0ZV9TSUNfSUFSMih2YWwpICAgICAgIGJmaW5fd3JpdGUzMihTSUNfSUFSMiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU0lDX0lBUjMoKSAgICAgICAgICAgYmZpbl9yZWFkMzIoU0lDX0lBUjMpCisjZGVmaW5lIGJmaW5fd3JpdGVfU0lDX0lBUjModmFsKSAgICAgICBiZmluX3dyaXRlMzIoU0lDX0lBUjMsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NJQ19JQVI0KCkgICAgICAgICAgIGJmaW5fcmVhZDMyKFNJQ19JQVI0KQorI2RlZmluZSBiZmluX3dyaXRlX1NJQ19JQVI0KHZhbCkgICAgICAgYmZpbl93cml0ZTMyKFNJQ19JQVI0LCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TSUNfSUFSNSgpICAgICAgICAgICBiZmluX3JlYWQzMihTSUNfSUFSNSkKKyNkZWZpbmUgYmZpbl93cml0ZV9TSUNfSUFSNSh2YWwpICAgICAgIGJmaW5fd3JpdGUzMihTSUNfSUFSNSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU0lDX0lBUjYoKSAgICAgICAgICAgYmZpbl9yZWFkMzIoU0lDX0lBUjYpCisjZGVmaW5lIGJmaW5fd3JpdGVfU0lDX0lBUjYodmFsKSAgICAgICBiZmluX3dyaXRlMzIoU0lDX0lBUjYsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1dET0dfQ1RMKCkgICAgICAgICAgIGJmaW5fcmVhZDE2KFdET0dfQ1RMKQorI2RlZmluZSBiZmluX3dyaXRlX1dET0dfQ1RMKHZhbCkgICAgICAgYmZpbl93cml0ZTE2KFdET0dfQ1RMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9XRE9HX0NOVCgpICAgICAgICAgICBiZmluX3JlYWQzMihXRE9HX0NOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9XRE9HX0NOVCh2YWwpICAgICAgIGJmaW5fd3JpdGUzMihXRE9HX0NOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfV0RPR19TVEFUKCkgICAgICAgICAgYmZpbl9yZWFkMzIoV0RPR19TVEFUKQorI2RlZmluZSBiZmluX3dyaXRlX1dET0dfU1RBVCh2YWwpICAgICAgYmZpbl93cml0ZTMyKFdET0dfU1RBVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUlRDX1NUQVQoKSAgICAgICAgICAgYmZpbl9yZWFkMzIoUlRDX1NUQVQpCisjZGVmaW5lIGJmaW5fd3JpdGVfUlRDX1NUQVQodmFsKSAgICAgICBiZmluX3dyaXRlMzIoUlRDX1NUQVQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1JUQ19JQ1RMKCkgICAgICAgICAgIGJmaW5fcmVhZDE2KFJUQ19JQ1RMKQorI2RlZmluZSBiZmluX3dyaXRlX1JUQ19JQ1RMKHZhbCkgICAgICAgYmZpbl93cml0ZTE2KFJUQ19JQ1RMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9SVENfSVNUQVQoKSAgICAgICAgICBiZmluX3JlYWQxNihSVENfSVNUQVQpCisjZGVmaW5lIGJmaW5fd3JpdGVfUlRDX0lTVEFUKHZhbCkgICAgICBiZmluX3dyaXRlMTYoUlRDX0lTVEFULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9SVENfU1dDTlQoKSAgICAgICAgICBiZmluX3JlYWQxNihSVENfU1dDTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfUlRDX1NXQ05UKHZhbCkgICAgICBiZmluX3dyaXRlMTYoUlRDX1NXQ05ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9SVENfQUxBUk0oKSAgICAgICAgICBiZmluX3JlYWQzMihSVENfQUxBUk0pCisjZGVmaW5lIGJmaW5fd3JpdGVfUlRDX0FMQVJNKHZhbCkgICAgICBiZmluX3dyaXRlMzIoUlRDX0FMQVJNLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9SVENfUFJFTigpICAgICAgICAgICBiZmluX3JlYWQxNihSVENfUFJFTikKKyNkZWZpbmUgYmZpbl93cml0ZV9SVENfUFJFTih2YWwpICAgICAgIGJmaW5fd3JpdGUxNihSVENfUFJFTiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVUFSVDBfVEhSKCkgICAgICAgICAgYmZpbl9yZWFkMTYoVUFSVDBfVEhSKQorI2RlZmluZSBiZmluX3dyaXRlX1VBUlQwX1RIUih2YWwpICAgICAgYmZpbl93cml0ZTE2KFVBUlQwX1RIUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVUFSVDBfUkJSKCkgICAgICAgICAgYmZpbl9yZWFkMTYoVUFSVDBfUkJSKQorI2RlZmluZSBiZmluX3dyaXRlX1VBUlQwX1JCUih2YWwpICAgICAgYmZpbl93cml0ZTE2KFVBUlQwX1JCUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVUFSVDBfRExMKCkgICAgICAgICAgYmZpbl9yZWFkMTYoVUFSVDBfRExMKQorI2RlZmluZSBiZmluX3dyaXRlX1VBUlQwX0RMTCh2YWwpICAgICAgYmZpbl93cml0ZTE2KFVBUlQwX0RMTCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVUFSVDBfRExIKCkgICAgICAgICAgYmZpbl9yZWFkMTYoVUFSVDBfRExIKQorI2RlZmluZSBiZmluX3dyaXRlX1VBUlQwX0RMSCh2YWwpICAgICAgYmZpbl93cml0ZTE2KFVBUlQwX0RMSCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVUFSVDBfSUVSKCkgICAgICAgICAgYmZpbl9yZWFkMTYoVUFSVDBfSUVSKQorI2RlZmluZSBiZmluX3dyaXRlX1VBUlQwX0lFUih2YWwpICAgICAgYmZpbl93cml0ZTE2KFVBUlQwX0lFUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVUFSVDBfSUlSKCkgICAgICAgICAgYmZpbl9yZWFkMTYoVUFSVDBfSUlSKQorI2RlZmluZSBiZmluX3dyaXRlX1VBUlQwX0lJUih2YWwpICAgICAgYmZpbl93cml0ZTE2KFVBUlQwX0lJUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVUFSVDBfTENSKCkgICAgICAgICAgYmZpbl9yZWFkMTYoVUFSVDBfTENSKQorI2RlZmluZSBiZmluX3dyaXRlX1VBUlQwX0xDUih2YWwpICAgICAgYmZpbl93cml0ZTE2KFVBUlQwX0xDUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVUFSVDBfTUNSKCkgICAgICAgICAgYmZpbl9yZWFkMTYoVUFSVDBfTUNSKQorI2RlZmluZSBiZmluX3dyaXRlX1VBUlQwX01DUih2YWwpICAgICAgYmZpbl93cml0ZTE2KFVBUlQwX01DUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVUFSVDBfTFNSKCkgICAgICAgICAgYmZpbl9yZWFkMTYoVUFSVDBfTFNSKQorI2RlZmluZSBiZmluX3dyaXRlX1VBUlQwX0xTUih2YWwpICAgICAgYmZpbl93cml0ZTE2KFVBUlQwX0xTUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVUFSVDBfU0NSKCkgICAgICAgICAgYmZpbl9yZWFkMTYoVUFSVDBfU0NSKQorI2RlZmluZSBiZmluX3dyaXRlX1VBUlQwX1NDUih2YWwpICAgICAgYmZpbl93cml0ZTE2KFVBUlQwX1NDUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVUFSVDBfR0NUTCgpICAgICAgICAgYmZpbl9yZWFkMTYoVUFSVDBfR0NUTCkKKyNkZWZpbmUgYmZpbl93cml0ZV9VQVJUMF9HQ1RMKHZhbCkgICAgIGJmaW5fd3JpdGUxNihVQVJUMF9HQ1RMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VQVJUMV9USFIoKSAgICAgICAgICBiZmluX3JlYWQxNihVQVJUMV9USFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfVUFSVDFfVEhSKHZhbCkgICAgICBiZmluX3dyaXRlMTYoVUFSVDFfVEhSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VQVJUMV9SQlIoKSAgICAgICAgICBiZmluX3JlYWQxNihVQVJUMV9SQlIpCisjZGVmaW5lIGJmaW5fd3JpdGVfVUFSVDFfUkJSKHZhbCkgICAgICBiZmluX3dyaXRlMTYoVUFSVDFfUkJSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VQVJUMV9ETEwoKSAgICAgICAgICBiZmluX3JlYWQxNihVQVJUMV9ETEwpCisjZGVmaW5lIGJmaW5fd3JpdGVfVUFSVDFfRExMKHZhbCkgICAgICBiZmluX3dyaXRlMTYoVUFSVDFfRExMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VQVJUMV9ETEgoKSAgICAgICAgICBiZmluX3JlYWQxNihVQVJUMV9ETEgpCisjZGVmaW5lIGJmaW5fd3JpdGVfVUFSVDFfRExIKHZhbCkgICAgICBiZmluX3dyaXRlMTYoVUFSVDFfRExILCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VQVJUMV9JRVIoKSAgICAgICAgICBiZmluX3JlYWQxNihVQVJUMV9JRVIpCisjZGVmaW5lIGJmaW5fd3JpdGVfVUFSVDFfSUVSKHZhbCkgICAgICBiZmluX3dyaXRlMTYoVUFSVDFfSUVSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VQVJUMV9JSVIoKSAgICAgICAgICBiZmluX3JlYWQxNihVQVJUMV9JSVIpCisjZGVmaW5lIGJmaW5fd3JpdGVfVUFSVDFfSUlSKHZhbCkgICAgICBiZmluX3dyaXRlMTYoVUFSVDFfSUlSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VQVJUMV9MQ1IoKSAgICAgICAgICBiZmluX3JlYWQxNihVQVJUMV9MQ1IpCisjZGVmaW5lIGJmaW5fd3JpdGVfVUFSVDFfTENSKHZhbCkgICAgICBiZmluX3dyaXRlMTYoVUFSVDFfTENSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VQVJUMV9NQ1IoKSAgICAgICAgICBiZmluX3JlYWQxNihVQVJUMV9NQ1IpCisjZGVmaW5lIGJmaW5fd3JpdGVfVUFSVDFfTUNSKHZhbCkgICAgICBiZmluX3dyaXRlMTYoVUFSVDFfTUNSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VQVJUMV9MU1IoKSAgICAgICAgICBiZmluX3JlYWQxNihVQVJUMV9MU1IpCisjZGVmaW5lIGJmaW5fd3JpdGVfVUFSVDFfTFNSKHZhbCkgICAgICBiZmluX3dyaXRlMTYoVUFSVDFfTFNSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VQVJUMV9TQ1IoKSAgICAgICAgICBiZmluX3JlYWQxNihVQVJUMV9TQ1IpCisjZGVmaW5lIGJmaW5fd3JpdGVfVUFSVDFfU0NSKHZhbCkgICAgICBiZmluX3dyaXRlMTYoVUFSVDFfU0NSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VQVJUMV9HQ1RMKCkgICAgICAgICBiZmluX3JlYWQxNihVQVJUMV9HQ1RMKQorI2RlZmluZSBiZmluX3dyaXRlX1VBUlQxX0dDVEwodmFsKSAgICAgYmZpbl93cml0ZTE2KFVBUlQxX0dDVEwsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VBUlQyX1RIUigpICAgICAgICAgIGJmaW5fcmVhZDE2KFVBUlQyX1RIUikKKyNkZWZpbmUgYmZpbl93cml0ZV9VQVJUMl9USFIodmFsKSAgICAgIGJmaW5fd3JpdGUxNihVQVJUMl9USFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VBUlQyX1JCUigpICAgICAgICAgIGJmaW5fcmVhZDE2KFVBUlQyX1JCUikKKyNkZWZpbmUgYmZpbl93cml0ZV9VQVJUMl9SQlIodmFsKSAgICAgIGJmaW5fd3JpdGUxNihVQVJUMl9SQlIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VBUlQyX0RMTCgpICAgICAgICAgIGJmaW5fcmVhZDE2KFVBUlQyX0RMTCkKKyNkZWZpbmUgYmZpbl93cml0ZV9VQVJUMl9ETEwodmFsKSAgICAgIGJmaW5fd3JpdGUxNihVQVJUMl9ETEwsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VBUlQyX0RMSCgpICAgICAgICAgIGJmaW5fcmVhZDE2KFVBUlQyX0RMSCkKKyNkZWZpbmUgYmZpbl93cml0ZV9VQVJUMl9ETEgodmFsKSAgICAgIGJmaW5fd3JpdGUxNihVQVJUMl9ETEgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VBUlQyX0lFUigpICAgICAgICAgIGJmaW5fcmVhZDE2KFVBUlQyX0lFUikKKyNkZWZpbmUgYmZpbl93cml0ZV9VQVJUMl9JRVIodmFsKSAgICAgIGJmaW5fd3JpdGUxNihVQVJUMl9JRVIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VBUlQyX0lJUigpICAgICAgICAgIGJmaW5fcmVhZDE2KFVBUlQyX0lJUikKKyNkZWZpbmUgYmZpbl93cml0ZV9VQVJUMl9JSVIodmFsKSAgICAgIGJmaW5fd3JpdGUxNihVQVJUMl9JSVIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VBUlQyX0xDUigpICAgICAgICAgIGJmaW5fcmVhZDE2KFVBUlQyX0xDUikKKyNkZWZpbmUgYmZpbl93cml0ZV9VQVJUMl9MQ1IodmFsKSAgICAgIGJmaW5fd3JpdGUxNihVQVJUMl9MQ1IsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VBUlQyX01DUigpICAgICAgICAgIGJmaW5fcmVhZDE2KFVBUlQyX01DUikKKyNkZWZpbmUgYmZpbl93cml0ZV9VQVJUMl9NQ1IodmFsKSAgICAgIGJmaW5fd3JpdGUxNihVQVJUMl9NQ1IsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VBUlQyX0xTUigpICAgICAgICAgIGJmaW5fcmVhZDE2KFVBUlQyX0xTUikKKyNkZWZpbmUgYmZpbl93cml0ZV9VQVJUMl9MU1IodmFsKSAgICAgIGJmaW5fd3JpdGUxNihVQVJUMl9MU1IsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VBUlQyX1NDUigpICAgICAgICAgIGJmaW5fcmVhZDE2KFVBUlQyX1NDUikKKyNkZWZpbmUgYmZpbl93cml0ZV9VQVJUMl9TQ1IodmFsKSAgICAgIGJmaW5fd3JpdGUxNihVQVJUMl9TQ1IsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VBUlQyX0dDVEwoKSAgICAgICAgIGJmaW5fcmVhZDE2KFVBUlQyX0dDVEwpCisjZGVmaW5lIGJmaW5fd3JpdGVfVUFSVDJfR0NUTCh2YWwpICAgICBiZmluX3dyaXRlMTYoVUFSVDJfR0NUTCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BJMF9DVEwoKSAgICAgICAgICAgYmZpbl9yZWFkMTYoU1BJMF9DVEwpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BJMF9DVEwodmFsKSAgICAgICBiZmluX3dyaXRlMTYoU1BJMF9DVEwsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQSTBfRkxHKCkgICAgICAgICAgIGJmaW5fcmVhZDE2KFNQSTBfRkxHKQorI2RlZmluZSBiZmluX3dyaXRlX1NQSTBfRkxHKHZhbCkgICAgICAgYmZpbl93cml0ZTE2KFNQSTBfRkxHLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUEkwX1NUQVQoKSAgICAgICAgICBiZmluX3JlYWQxNihTUEkwX1NUQVQpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BJMF9TVEFUKHZhbCkgICAgICBiZmluX3dyaXRlMTYoU1BJMF9TVEFULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUEkwX1REQlIoKSAgICAgICAgICBiZmluX3JlYWQxNihTUEkwX1REQlIpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BJMF9UREJSKHZhbCkgICAgICBiZmluX3dyaXRlMTYoU1BJMF9UREJSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUEkwX1JEQlIoKSAgICAgICAgICBiZmluX3JlYWQxNihTUEkwX1JEQlIpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BJMF9SREJSKHZhbCkgICAgICBiZmluX3dyaXRlMTYoU1BJMF9SREJSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUEkwX0JBVUQoKSAgICAgICAgICBiZmluX3JlYWQxNihTUEkwX0JBVUQpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BJMF9CQVVEKHZhbCkgICAgICBiZmluX3dyaXRlMTYoU1BJMF9CQVVELCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUEkwX1NIQURPVygpICAgICAgICBiZmluX3JlYWQxNihTUEkwX1NIQURPVykKKyNkZWZpbmUgYmZpbl93cml0ZV9TUEkwX1NIQURPVyh2YWwpICAgIGJmaW5fd3JpdGUxNihTUEkwX1NIQURPVywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BJMV9DVEwoKSAgICAgICAgICAgYmZpbl9yZWFkMTYoU1BJMV9DVEwpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BJMV9DVEwodmFsKSAgICAgICBiZmluX3dyaXRlMTYoU1BJMV9DVEwsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQSTFfRkxHKCkgICAgICAgICAgIGJmaW5fcmVhZDE2KFNQSTFfRkxHKQorI2RlZmluZSBiZmluX3dyaXRlX1NQSTFfRkxHKHZhbCkgICAgICAgYmZpbl93cml0ZTE2KFNQSTFfRkxHLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUEkxX1NUQVQoKSAgICAgICAgICBiZmluX3JlYWQxNihTUEkxX1NUQVQpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BJMV9TVEFUKHZhbCkgICAgICBiZmluX3dyaXRlMTYoU1BJMV9TVEFULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUEkxX1REQlIoKSAgICAgICAgICBiZmluX3JlYWQxNihTUEkxX1REQlIpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BJMV9UREJSKHZhbCkgICAgICBiZmluX3dyaXRlMTYoU1BJMV9UREJSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUEkxX1JEQlIoKSAgICAgICAgICBiZmluX3JlYWQxNihTUEkxX1JEQlIpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BJMV9SREJSKHZhbCkgICAgICBiZmluX3dyaXRlMTYoU1BJMV9SREJSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUEkxX0JBVUQoKSAgICAgICAgICBiZmluX3JlYWQxNihTUEkxX0JBVUQpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BJMV9CQVVEKHZhbCkgICAgICBiZmluX3dyaXRlMTYoU1BJMV9CQVVELCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUEkxX1NIQURPVygpICAgICAgICBiZmluX3JlYWQxNihTUEkxX1NIQURPVykKKyNkZWZpbmUgYmZpbl93cml0ZV9TUEkxX1NIQURPVyh2YWwpICAgIGJmaW5fd3JpdGUxNihTUEkxX1NIQURPVywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BJMl9DVEwoKSAgICAgICAgICAgYmZpbl9yZWFkMTYoU1BJMl9DVEwpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BJMl9DVEwodmFsKSAgICAgICBiZmluX3dyaXRlMTYoU1BJMl9DVEwsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQSTJfRkxHKCkgICAgICAgICAgIGJmaW5fcmVhZDE2KFNQSTJfRkxHKQorI2RlZmluZSBiZmluX3dyaXRlX1NQSTJfRkxHKHZhbCkgICAgICAgYmZpbl93cml0ZTE2KFNQSTJfRkxHLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUEkyX1NUQVQoKSAgICAgICAgICBiZmluX3JlYWQxNihTUEkyX1NUQVQpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BJMl9TVEFUKHZhbCkgICAgICBiZmluX3dyaXRlMTYoU1BJMl9TVEFULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUEkyX1REQlIoKSAgICAgICAgICBiZmluX3JlYWQxNihTUEkyX1REQlIpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BJMl9UREJSKHZhbCkgICAgICBiZmluX3dyaXRlMTYoU1BJMl9UREJSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUEkyX1JEQlIoKSAgICAgICAgICBiZmluX3JlYWQxNihTUEkyX1JEQlIpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BJMl9SREJSKHZhbCkgICAgICBiZmluX3dyaXRlMTYoU1BJMl9SREJSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUEkyX0JBVUQoKSAgICAgICAgICBiZmluX3JlYWQxNihTUEkyX0JBVUQpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BJMl9CQVVEKHZhbCkgICAgICBiZmluX3dyaXRlMTYoU1BJMl9CQVVELCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUEkyX1NIQURPVygpICAgICAgICBiZmluX3JlYWQxNihTUEkyX1NIQURPVykKKyNkZWZpbmUgYmZpbl93cml0ZV9TUEkyX1NIQURPVyh2YWwpICAgIGJmaW5fd3JpdGUxNihTUEkyX1NIQURPVywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVElNRVIwX0NPTkZJRygpICAgICAgYmZpbl9yZWFkMTYoVElNRVIwX0NPTkZJRykKKyNkZWZpbmUgYmZpbl93cml0ZV9USU1FUjBfQ09ORklHKHZhbCkgIGJmaW5fd3JpdGUxNihUSU1FUjBfQ09ORklHLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9USU1FUjBfQ09VTlRFUigpICAgICBiZmluX3JlYWQzMihUSU1FUjBfQ09VTlRFUikKKyNkZWZpbmUgYmZpbl93cml0ZV9USU1FUjBfQ09VTlRFUih2YWwpIGJmaW5fd3JpdGUzMihUSU1FUjBfQ09VTlRFUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVElNRVIwX1BFUklPRCgpICAgICAgYmZpbl9yZWFkMzIoVElNRVIwX1BFUklPRCkKKyNkZWZpbmUgYmZpbl93cml0ZV9USU1FUjBfUEVSSU9EKHZhbCkgIGJmaW5fd3JpdGUzMihUSU1FUjBfUEVSSU9ELCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9USU1FUjBfV0lEVEgoKSAgICAgICBiZmluX3JlYWQzMihUSU1FUjBfV0lEVEgpCisjZGVmaW5lIGJmaW5fd3JpdGVfVElNRVIwX1dJRFRIKHZhbCkgICBiZmluX3dyaXRlMzIoVElNRVIwX1dJRFRILCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9USU1FUjFfQ09ORklHKCkgICAgICBiZmluX3JlYWQxNihUSU1FUjFfQ09ORklHKQorI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSMV9DT05GSUcodmFsKSAgYmZpbl93cml0ZTE2KFRJTUVSMV9DT05GSUcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSMV9DT1VOVEVSKCkgICAgIGJmaW5fcmVhZDMyKFRJTUVSMV9DT1VOVEVSKQorI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSMV9DT1VOVEVSKHZhbCkgYmZpbl93cml0ZTMyKFRJTUVSMV9DT1VOVEVSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9USU1FUjFfUEVSSU9EKCkgICAgICBiZmluX3JlYWQzMihUSU1FUjFfUEVSSU9EKQorI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSMV9QRVJJT0QodmFsKSAgYmZpbl93cml0ZTMyKFRJTUVSMV9QRVJJT0QsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSMV9XSURUSCgpICAgICAgIGJmaW5fcmVhZDMyKFRJTUVSMV9XSURUSCkKKyNkZWZpbmUgYmZpbl93cml0ZV9USU1FUjFfV0lEVEgodmFsKSAgIGJmaW5fd3JpdGUzMihUSU1FUjFfV0lEVEgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSMl9DT05GSUcoKSAgICAgIGJmaW5fcmVhZDE2KFRJTUVSMl9DT05GSUcpCisjZGVmaW5lIGJmaW5fd3JpdGVfVElNRVIyX0NPTkZJRyh2YWwpICBiZmluX3dyaXRlMTYoVElNRVIyX0NPTkZJRywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVElNRVIyX0NPVU5URVIoKSAgICAgYmZpbl9yZWFkMzIoVElNRVIyX0NPVU5URVIpCisjZGVmaW5lIGJmaW5fd3JpdGVfVElNRVIyX0NPVU5URVIodmFsKSBiZmluX3dyaXRlMzIoVElNRVIyX0NPVU5URVIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSMl9QRVJJT0QoKSAgICAgIGJmaW5fcmVhZDMyKFRJTUVSMl9QRVJJT0QpCisjZGVmaW5lIGJmaW5fd3JpdGVfVElNRVIyX1BFUklPRCh2YWwpICBiZmluX3dyaXRlMzIoVElNRVIyX1BFUklPRCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVElNRVIyX1dJRFRIKCkgICAgICAgYmZpbl9yZWFkMzIoVElNRVIyX1dJRFRIKQorI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSMl9XSURUSCh2YWwpICAgYmZpbl93cml0ZTMyKFRJTUVSMl9XSURUSCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVElNRVJfRU5BQkxFKCkgICAgICAgYmZpbl9yZWFkMTYoVElNRVJfRU5BQkxFKQorI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSX0VOQUJMRSh2YWwpICAgYmZpbl93cml0ZTE2KFRJTUVSX0VOQUJMRSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVElNRVJfRElTQUJMRSgpICAgICAgYmZpbl9yZWFkMTYoVElNRVJfRElTQUJMRSkKKyNkZWZpbmUgYmZpbl93cml0ZV9USU1FUl9ESVNBQkxFKHZhbCkgIGJmaW5fd3JpdGUxNihUSU1FUl9ESVNBQkxFLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9USU1FUl9TVEFUVVMoKSAgICAgICBiZmluX3JlYWQxNihUSU1FUl9TVEFUVVMpCisjZGVmaW5lIGJmaW5fd3JpdGVfVElNRVJfU1RBVFVTKHZhbCkgICBiZmluX3dyaXRlMTYoVElNRVJfU1RBVFVTLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfVENSMSgpICAgICAgICBiZmluX3JlYWQxNihTUE9SVDBfVENSMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDBfVENSMSh2YWwpICAgIGJmaW5fd3JpdGUxNihTUE9SVDBfVENSMSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQwX1RDUjIoKSAgICAgICAgYmZpbl9yZWFkMTYoU1BPUlQwX1RDUjIpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX1RDUjIodmFsKSAgICBiZmluX3dyaXRlMTYoU1BPUlQwX1RDUjIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMF9UQ0xLRElWKCkgICAgIGJmaW5fcmVhZDE2KFNQT1JUMF9UQ0xLRElWKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMF9UQ0xLRElWKHZhbCkgYmZpbl93cml0ZTE2KFNQT1JUMF9UQ0xLRElWLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfVEZTRElWKCkgICAgICBiZmluX3JlYWQxNihTUE9SVDBfVEZTRElWKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMF9URlNESVYodmFsKSAgYmZpbl93cml0ZTE2KFNQT1JUMF9URlNESVYsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMF9UWCgpICAgICAgICAgIGJmaW5fcmVhZDMyKFNQT1JUMF9UWCkKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDBfVFgodmFsKSAgICAgIGJmaW5fd3JpdGUzMihTUE9SVDBfVFgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMF9SWCgpICAgICAgICAgIGJmaW5fcmVhZDMyKFNQT1JUMF9SWCkKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDBfUlgodmFsKSAgICAgIGJmaW5fd3JpdGUzMihTUE9SVDBfUlgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMF9SQ1IxKCkgICAgICAgIGJmaW5fcmVhZDE2KFNQT1JUMF9SQ1IxKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMF9SQ1IxKHZhbCkgICAgYmZpbl93cml0ZTE2KFNQT1JUMF9SQ1IxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfUkNSMigpICAgICAgICBiZmluX3JlYWQxNihTUE9SVDBfUkNSMikKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDBfUkNSMih2YWwpICAgIGJmaW5fd3JpdGUxNihTUE9SVDBfUkNSMiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQwX1JDTEtESVYoKSAgICAgYmZpbl9yZWFkMTYoU1BPUlQwX1JDTEtESVYpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX1JDTEtESVYodmFsKSBiZmluX3dyaXRlMTYoU1BPUlQwX1JDTEtESVYsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMF9SRlNESVYoKSAgICAgIGJmaW5fcmVhZDE2KFNQT1JUMF9SRlNESVYpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX1JGU0RJVih2YWwpICBiZmluX3dyaXRlMTYoU1BPUlQwX1JGU0RJViwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQwX1NUQVQoKSAgICAgICAgYmZpbl9yZWFkMTYoU1BPUlQwX1NUQVQpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX1NUQVQodmFsKSAgICBiZmluX3dyaXRlMTYoU1BPUlQwX1NUQVQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMF9DSE5MKCkgICAgICAgIGJmaW5fcmVhZDE2KFNQT1JUMF9DSE5MKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMF9DSE5MKHZhbCkgICAgYmZpbl93cml0ZTE2KFNQT1JUMF9DSE5MLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfTUNNQzEoKSAgICAgICBiZmluX3JlYWQxNihTUE9SVDBfTUNNQzEpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX01DTUMxKHZhbCkgICBiZmluX3dyaXRlMTYoU1BPUlQwX01DTUMxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfTUNNQzIoKSAgICAgICBiZmluX3JlYWQxNihTUE9SVDBfTUNNQzIpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX01DTUMyKHZhbCkgICBiZmluX3dyaXRlMTYoU1BPUlQwX01DTUMyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfTVRDUzAoKSAgICAgICBiZmluX3JlYWQzMihTUE9SVDBfTVRDUzApCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX01UQ1MwKHZhbCkgICBiZmluX3dyaXRlMzIoU1BPUlQwX01UQ1MwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfTVRDUzEoKSAgICAgICBiZmluX3JlYWQzMihTUE9SVDBfTVRDUzEpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX01UQ1MxKHZhbCkgICBiZmluX3dyaXRlMzIoU1BPUlQwX01UQ1MxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfTVRDUzIoKSAgICAgICBiZmluX3JlYWQzMihTUE9SVDBfTVRDUzIpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX01UQ1MyKHZhbCkgICBiZmluX3dyaXRlMzIoU1BPUlQwX01UQ1MyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfTVRDUzMoKSAgICAgICBiZmluX3JlYWQzMihTUE9SVDBfTVRDUzMpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX01UQ1MzKHZhbCkgICBiZmluX3dyaXRlMzIoU1BPUlQwX01UQ1MzLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfTVJDUzAoKSAgICAgICBiZmluX3JlYWQzMihTUE9SVDBfTVJDUzApCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX01SQ1MwKHZhbCkgICBiZmluX3dyaXRlMzIoU1BPUlQwX01SQ1MwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfTVJDUzEoKSAgICAgICBiZmluX3JlYWQzMihTUE9SVDBfTVJDUzEpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX01SQ1MxKHZhbCkgICBiZmluX3dyaXRlMzIoU1BPUlQwX01SQ1MxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfTVJDUzIoKSAgICAgICBiZmluX3JlYWQzMihTUE9SVDBfTVJDUzIpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX01SQ1MyKHZhbCkgICBiZmluX3dyaXRlMzIoU1BPUlQwX01SQ1MyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfTVJDUzMoKSAgICAgICBiZmluX3JlYWQzMihTUE9SVDBfTVJDUzMpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX01SQ1MzKHZhbCkgICBiZmluX3dyaXRlMzIoU1BPUlQwX01SQ1MzLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDFfVENSMSgpICAgICAgICBiZmluX3JlYWQxNihTUE9SVDFfVENSMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDFfVENSMSh2YWwpICAgIGJmaW5fd3JpdGUxNihTUE9SVDFfVENSMSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQxX1RDUjIoKSAgICAgICAgYmZpbl9yZWFkMTYoU1BPUlQxX1RDUjIpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX1RDUjIodmFsKSAgICBiZmluX3dyaXRlMTYoU1BPUlQxX1RDUjIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMV9UQ0xLRElWKCkgICAgIGJmaW5fcmVhZDE2KFNQT1JUMV9UQ0xLRElWKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMV9UQ0xLRElWKHZhbCkgYmZpbl93cml0ZTE2KFNQT1JUMV9UQ0xLRElWLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDFfVEZTRElWKCkgICAgICBiZmluX3JlYWQxNihTUE9SVDFfVEZTRElWKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMV9URlNESVYodmFsKSAgYmZpbl93cml0ZTE2KFNQT1JUMV9URlNESVYsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMV9UWCgpICAgICAgICAgIGJmaW5fcmVhZDMyKFNQT1JUMV9UWCkKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDFfVFgodmFsKSAgICAgIGJmaW5fd3JpdGUzMihTUE9SVDFfVFgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMV9SWCgpICAgICAgICAgIGJmaW5fcmVhZDMyKFNQT1JUMV9SWCkKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDFfUlgodmFsKSAgICAgIGJmaW5fd3JpdGUzMihTUE9SVDFfUlgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMV9SQ1IxKCkgICAgICAgIGJmaW5fcmVhZDE2KFNQT1JUMV9SQ1IxKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMV9SQ1IxKHZhbCkgICAgYmZpbl93cml0ZTE2KFNQT1JUMV9SQ1IxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDFfUkNSMigpICAgICAgICBiZmluX3JlYWQxNihTUE9SVDFfUkNSMikKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDFfUkNSMih2YWwpICAgIGJmaW5fd3JpdGUxNihTUE9SVDFfUkNSMiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQxX1JDTEtESVYoKSAgICAgYmZpbl9yZWFkMTYoU1BPUlQxX1JDTEtESVYpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX1JDTEtESVYodmFsKSBiZmluX3dyaXRlMTYoU1BPUlQxX1JDTEtESVYsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMV9SRlNESVYoKSAgICAgIGJmaW5fcmVhZDE2KFNQT1JUMV9SRlNESVYpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX1JGU0RJVih2YWwpICBiZmluX3dyaXRlMTYoU1BPUlQxX1JGU0RJViwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQxX1NUQVQoKSAgICAgICAgYmZpbl9yZWFkMTYoU1BPUlQxX1NUQVQpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX1NUQVQodmFsKSAgICBiZmluX3dyaXRlMTYoU1BPUlQxX1NUQVQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMV9DSE5MKCkgICAgICAgIGJmaW5fcmVhZDE2KFNQT1JUMV9DSE5MKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMV9DSE5MKHZhbCkgICAgYmZpbl93cml0ZTE2KFNQT1JUMV9DSE5MLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDFfTUNNQzEoKSAgICAgICBiZmluX3JlYWQxNihTUE9SVDFfTUNNQzEpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX01DTUMxKHZhbCkgICBiZmluX3dyaXRlMTYoU1BPUlQxX01DTUMxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDFfTUNNQzIoKSAgICAgICBiZmluX3JlYWQxNihTUE9SVDFfTUNNQzIpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX01DTUMyKHZhbCkgICBiZmluX3dyaXRlMTYoU1BPUlQxX01DTUMyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDFfTVRDUzAoKSAgICAgICBiZmluX3JlYWQzMihTUE9SVDFfTVRDUzApCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX01UQ1MwKHZhbCkgICBiZmluX3dyaXRlMzIoU1BPUlQxX01UQ1MwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDFfTVRDUzEoKSAgICAgICBiZmluX3JlYWQzMihTUE9SVDFfTVRDUzEpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX01UQ1MxKHZhbCkgICBiZmluX3dyaXRlMzIoU1BPUlQxX01UQ1MxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDFfTVRDUzIoKSAgICAgICBiZmluX3JlYWQzMihTUE9SVDFfTVRDUzIpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX01UQ1MyKHZhbCkgICBiZmluX3dyaXRlMzIoU1BPUlQxX01UQ1MyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDFfTVRDUzMoKSAgICAgICBiZmluX3JlYWQzMihTUE9SVDFfTVRDUzMpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX01UQ1MzKHZhbCkgICBiZmluX3dyaXRlMzIoU1BPUlQxX01UQ1MzLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDFfTVJDUzAoKSAgICAgICBiZmluX3JlYWQzMihTUE9SVDFfTVJDUzApCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX01SQ1MwKHZhbCkgICBiZmluX3dyaXRlMzIoU1BPUlQxX01SQ1MwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDFfTVJDUzEoKSAgICAgICBiZmluX3JlYWQzMihTUE9SVDFfTVJDUzEpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX01SQ1MxKHZhbCkgICBiZmluX3dyaXRlMzIoU1BPUlQxX01SQ1MxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDFfTVJDUzIoKSAgICAgICBiZmluX3JlYWQzMihTUE9SVDFfTVJDUzIpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX01SQ1MyKHZhbCkgICBiZmluX3dyaXRlMzIoU1BPUlQxX01SQ1MyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDFfTVJDUzMoKSAgICAgICBiZmluX3JlYWQzMihTUE9SVDFfTVJDUzMpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX01SQ1MzKHZhbCkgICBiZmluX3dyaXRlMzIoU1BPUlQxX01SQ1MzLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDJfVENSMSgpICAgICAgICBiZmluX3JlYWQxNihTUE9SVDJfVENSMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDJfVENSMSh2YWwpICAgIGJmaW5fd3JpdGUxNihTUE9SVDJfVENSMSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQyX1RDUjIoKSAgICAgICAgYmZpbl9yZWFkMTYoU1BPUlQyX1RDUjIpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQyX1RDUjIodmFsKSAgICBiZmluX3dyaXRlMTYoU1BPUlQyX1RDUjIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMl9UQ0xLRElWKCkgICAgIGJmaW5fcmVhZDE2KFNQT1JUMl9UQ0xLRElWKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMl9UQ0xLRElWKHZhbCkgYmZpbl93cml0ZTE2KFNQT1JUMl9UQ0xLRElWLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDJfVEZTRElWKCkgICAgICBiZmluX3JlYWQxNihTUE9SVDJfVEZTRElWKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMl9URlNESVYodmFsKSAgYmZpbl93cml0ZTE2KFNQT1JUMl9URlNESVYsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMl9UWCgpICAgICAgICAgIGJmaW5fcmVhZDMyKFNQT1JUMl9UWCkKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDJfVFgodmFsKSAgICAgIGJmaW5fd3JpdGUzMihTUE9SVDJfVFgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMl9SWCgpICAgICAgICAgIGJmaW5fcmVhZDMyKFNQT1JUMl9SWCkKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDJfUlgodmFsKSAgICAgIGJmaW5fd3JpdGUzMihTUE9SVDJfUlgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMl9SQ1IxKCkgICAgICAgIGJmaW5fcmVhZDE2KFNQT1JUMl9SQ1IxKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMl9SQ1IxKHZhbCkgICAgYmZpbl93cml0ZTE2KFNQT1JUMl9SQ1IxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDJfUkNSMigpICAgICAgICBiZmluX3JlYWQxNihTUE9SVDJfUkNSMikKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDJfUkNSMih2YWwpICAgIGJmaW5fd3JpdGUxNihTUE9SVDJfUkNSMiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQyX1JDTEtESVYoKSAgICAgYmZpbl9yZWFkMTYoU1BPUlQyX1JDTEtESVYpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQyX1JDTEtESVYodmFsKSBiZmluX3dyaXRlMTYoU1BPUlQyX1JDTEtESVYsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMl9SRlNESVYoKSAgICAgIGJmaW5fcmVhZDE2KFNQT1JUMl9SRlNESVYpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQyX1JGU0RJVih2YWwpICBiZmluX3dyaXRlMTYoU1BPUlQyX1JGU0RJViwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQyX1NUQVQoKSAgICAgICAgYmZpbl9yZWFkMTYoU1BPUlQyX1NUQVQpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQyX1NUQVQodmFsKSAgICBiZmluX3dyaXRlMTYoU1BPUlQyX1NUQVQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMl9DSE5MKCkgICAgICAgIGJmaW5fcmVhZDE2KFNQT1JUMl9DSE5MKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMl9DSE5MKHZhbCkgICAgYmZpbl93cml0ZTE2KFNQT1JUMl9DSE5MLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDJfTUNNQzEoKSAgICAgICBiZmluX3JlYWQxNihTUE9SVDJfTUNNQzEpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQyX01DTUMxKHZhbCkgICBiZmluX3dyaXRlMTYoU1BPUlQyX01DTUMxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDJfTUNNQzIoKSAgICAgICBiZmluX3JlYWQxNihTUE9SVDJfTUNNQzIpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQyX01DTUMyKHZhbCkgICBiZmluX3dyaXRlMTYoU1BPUlQyX01DTUMyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDJfTVRDUzAoKSAgICAgICBiZmluX3JlYWQzMihTUE9SVDJfTVRDUzApCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQyX01UQ1MwKHZhbCkgICBiZmluX3dyaXRlMzIoU1BPUlQyX01UQ1MwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDJfTVRDUzEoKSAgICAgICBiZmluX3JlYWQzMihTUE9SVDJfTVRDUzEpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQyX01UQ1MxKHZhbCkgICBiZmluX3dyaXRlMzIoU1BPUlQyX01UQ1MxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDJfTVRDUzIoKSAgICAgICBiZmluX3JlYWQzMihTUE9SVDJfTVRDUzIpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQyX01UQ1MyKHZhbCkgICBiZmluX3dyaXRlMzIoU1BPUlQyX01UQ1MyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDJfTVRDUzMoKSAgICAgICBiZmluX3JlYWQzMihTUE9SVDJfTVRDUzMpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQyX01UQ1MzKHZhbCkgICBiZmluX3dyaXRlMzIoU1BPUlQyX01UQ1MzLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDJfTVJDUzAoKSAgICAgICBiZmluX3JlYWQzMihTUE9SVDJfTVJDUzApCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQyX01SQ1MwKHZhbCkgICBiZmluX3dyaXRlMzIoU1BPUlQyX01SQ1MwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDJfTVJDUzEoKSAgICAgICBiZmluX3JlYWQzMihTUE9SVDJfTVJDUzEpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQyX01SQ1MxKHZhbCkgICBiZmluX3dyaXRlMzIoU1BPUlQyX01SQ1MxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDJfTVJDUzIoKSAgICAgICBiZmluX3JlYWQzMihTUE9SVDJfTVJDUzIpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQyX01SQ1MyKHZhbCkgICBiZmluX3dyaXRlMzIoU1BPUlQyX01SQ1MyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDJfTVJDUzMoKSAgICAgICBiZmluX3JlYWQzMihTUE9SVDJfTVJDUzMpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQyX01SQ1MzKHZhbCkgICBiZmluX3dyaXRlMzIoU1BPUlQyX01SQ1MzLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDNfVENSMSgpICAgICAgICBiZmluX3JlYWQxNihTUE9SVDNfVENSMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDNfVENSMSh2YWwpICAgIGJmaW5fd3JpdGUxNihTUE9SVDNfVENSMSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQzX1RDUjIoKSAgICAgICAgYmZpbl9yZWFkMTYoU1BPUlQzX1RDUjIpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQzX1RDUjIodmFsKSAgICBiZmluX3dyaXRlMTYoU1BPUlQzX1RDUjIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUM19UQ0xLRElWKCkgICAgIGJmaW5fcmVhZDE2KFNQT1JUM19UQ0xLRElWKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUM19UQ0xLRElWKHZhbCkgYmZpbl93cml0ZTE2KFNQT1JUM19UQ0xLRElWLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDNfVEZTRElWKCkgICAgICBiZmluX3JlYWQxNihTUE9SVDNfVEZTRElWKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUM19URlNESVYodmFsKSAgYmZpbl93cml0ZTE2KFNQT1JUM19URlNESVYsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUM19UWCgpICAgICAgICAgIGJmaW5fcmVhZDMyKFNQT1JUM19UWCkKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDNfVFgodmFsKSAgICAgIGJmaW5fd3JpdGUzMihTUE9SVDNfVFgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUM19SWCgpICAgICAgICAgIGJmaW5fcmVhZDMyKFNQT1JUM19SWCkKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDNfUlgodmFsKSAgICAgIGJmaW5fd3JpdGUzMihTUE9SVDNfUlgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUM19SQ1IxKCkgICAgICAgIGJmaW5fcmVhZDE2KFNQT1JUM19SQ1IxKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUM19SQ1IxKHZhbCkgICAgYmZpbl93cml0ZTE2KFNQT1JUM19SQ1IxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDNfUkNSMigpICAgICAgICBiZmluX3JlYWQxNihTUE9SVDNfUkNSMikKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDNfUkNSMih2YWwpICAgIGJmaW5fd3JpdGUxNihTUE9SVDNfUkNSMiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQzX1JDTEtESVYoKSAgICAgYmZpbl9yZWFkMTYoU1BPUlQzX1JDTEtESVYpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQzX1JDTEtESVYodmFsKSBiZmluX3dyaXRlMTYoU1BPUlQzX1JDTEtESVYsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUM19SRlNESVYoKSAgICAgIGJmaW5fcmVhZDE2KFNQT1JUM19SRlNESVYpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQzX1JGU0RJVih2YWwpICBiZmluX3dyaXRlMTYoU1BPUlQzX1JGU0RJViwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQzX1NUQVQoKSAgICAgICAgYmZpbl9yZWFkMTYoU1BPUlQzX1NUQVQpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQzX1NUQVQodmFsKSAgICBiZmluX3dyaXRlMTYoU1BPUlQzX1NUQVQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUM19DSE5MKCkgICAgICAgIGJmaW5fcmVhZDE2KFNQT1JUM19DSE5MKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUM19DSE5MKHZhbCkgICAgYmZpbl93cml0ZTE2KFNQT1JUM19DSE5MLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDNfTUNNQzEoKSAgICAgICBiZmluX3JlYWQxNihTUE9SVDNfTUNNQzEpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQzX01DTUMxKHZhbCkgICBiZmluX3dyaXRlMTYoU1BPUlQzX01DTUMxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDNfTUNNQzIoKSAgICAgICBiZmluX3JlYWQxNihTUE9SVDNfTUNNQzIpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQzX01DTUMyKHZhbCkgICBiZmluX3dyaXRlMTYoU1BPUlQzX01DTUMyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDNfTVRDUzAoKSAgICAgICBiZmluX3JlYWQzMihTUE9SVDNfTVRDUzApCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQzX01UQ1MwKHZhbCkgICBiZmluX3dyaXRlMzIoU1BPUlQzX01UQ1MwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDNfTVRDUzEoKSAgICAgICBiZmluX3JlYWQzMihTUE9SVDNfTVRDUzEpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQzX01UQ1MxKHZhbCkgICBiZmluX3dyaXRlMzIoU1BPUlQzX01UQ1MxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDNfTVRDUzIoKSAgICAgICBiZmluX3JlYWQzMihTUE9SVDNfTVRDUzIpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQzX01UQ1MyKHZhbCkgICBiZmluX3dyaXRlMzIoU1BPUlQzX01UQ1MyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDNfTVRDUzMoKSAgICAgICBiZmluX3JlYWQzMihTUE9SVDNfTVRDUzMpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQzX01UQ1MzKHZhbCkgICBiZmluX3dyaXRlMzIoU1BPUlQzX01UQ1MzLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDNfTVJDUzAoKSAgICAgICBiZmluX3JlYWQzMihTUE9SVDNfTVJDUzApCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQzX01SQ1MwKHZhbCkgICBiZmluX3dyaXRlMzIoU1BPUlQzX01SQ1MwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDNfTVJDUzEoKSAgICAgICBiZmluX3JlYWQzMihTUE9SVDNfTVJDUzEpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQzX01SQ1MxKHZhbCkgICBiZmluX3dyaXRlMzIoU1BPUlQzX01SQ1MxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDNfTVJDUzIoKSAgICAgICBiZmluX3JlYWQzMihTUE9SVDNfTVJDUzIpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQzX01SQ1MyKHZhbCkgICBiZmluX3dyaXRlMzIoU1BPUlQzX01SQ1MyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDNfTVJDUzMoKSAgICAgICBiZmluX3JlYWQzMihTUE9SVDNfTVJDUzMpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQzX01SQ1MzKHZhbCkgICBiZmluX3dyaXRlMzIoU1BPUlQzX01SQ1MzLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JURklPKCkgICAgICAgICAgICBiZmluX3JlYWQxNihQT1JURklPKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRGSU8odmFsKSAgICAgICAgYmZpbl93cml0ZTE2KFBPUlRGSU8sIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRGSU9fQ0xFQVIoKSAgICAgIGJmaW5fcmVhZDE2KFBPUlRGSU9fQ0xFQVIpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEZJT19DTEVBUih2YWwpICBiZmluX3dyaXRlMTYoUE9SVEZJT19DTEVBUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEZJT19TRVQoKSAgICAgICAgYmZpbl9yZWFkMTYoUE9SVEZJT19TRVQpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEZJT19TRVQodmFsKSAgICBiZmluX3dyaXRlMTYoUE9SVEZJT19TRVQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRGSU9fVE9HR0xFKCkgICAgIGJmaW5fcmVhZDE2KFBPUlRGSU9fVE9HR0xFKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRGSU9fVE9HR0xFKHZhbCkgYmZpbl93cml0ZTE2KFBPUlRGSU9fVE9HR0xFLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JURklPX01BU0tBKCkgICAgICBiZmluX3JlYWQxNihQT1JURklPX01BU0tBKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRGSU9fTUFTS0EodmFsKSAgYmZpbl93cml0ZTE2KFBPUlRGSU9fTUFTS0EsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRGSU9fTUFTS0FfQ0xFQVIoKSBiZmluX3JlYWQxNihQT1JURklPX01BU0tBX0NMRUFSKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRGSU9fTUFTS0FfQ0xFQVIodmFsKSBiZmluX3dyaXRlMTYoUE9SVEZJT19NQVNLQV9DTEVBUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEZJT19NQVNLQV9TRVQoKSAgYmZpbl9yZWFkMTYoUE9SVEZJT19NQVNLQV9TRVQpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEZJT19NQVNLQV9TRVQodmFsKSBiZmluX3dyaXRlMTYoUE9SVEZJT19NQVNLQV9TRVQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRGSU9fTUFTS0FfVE9HR0xFKCkgYmZpbl9yZWFkMTYoUE9SVEZJT19NQVNLQV9UT0dHTEUpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEZJT19NQVNLQV9UT0dHTEUodmFsKSBiZmluX3dyaXRlMTYoUE9SVEZJT19NQVNLQV9UT0dHTEUsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRGSU9fTUFTS0IoKSAgICAgIGJmaW5fcmVhZDE2KFBPUlRGSU9fTUFTS0IpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEZJT19NQVNLQih2YWwpICBiZmluX3dyaXRlMTYoUE9SVEZJT19NQVNLQiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEZJT19NQVNLQl9DTEVBUigpIGJmaW5fcmVhZDE2KFBPUlRGSU9fTUFTS0JfQ0xFQVIpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEZJT19NQVNLQl9DTEVBUih2YWwpIGJmaW5fd3JpdGUxNihQT1JURklPX01BU0tCX0NMRUFSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JURklPX01BU0tCX1NFVCgpICBiZmluX3JlYWQxNihQT1JURklPX01BU0tCX1NFVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JURklPX01BU0tCX1NFVCh2YWwpIGJmaW5fd3JpdGUxNihQT1JURklPX01BU0tCX1NFVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEZJT19NQVNLQl9UT0dHTEUoKSBiZmluX3JlYWQxNihQT1JURklPX01BU0tCX1RPR0dMRSkKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JURklPX01BU0tCX1RPR0dMRSh2YWwpIGJmaW5fd3JpdGUxNihQT1JURklPX01BU0tCX1RPR0dMRSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEZJT19ESVIoKSAgICAgICAgYmZpbl9yZWFkMTYoUE9SVEZJT19ESVIpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEZJT19ESVIodmFsKSAgICBiZmluX3dyaXRlMTYoUE9SVEZJT19ESVIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRGSU9fUE9MQVIoKSAgICAgIGJmaW5fcmVhZDE2KFBPUlRGSU9fUE9MQVIpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEZJT19QT0xBUih2YWwpICBiZmluX3dyaXRlMTYoUE9SVEZJT19QT0xBUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEZJT19FREdFKCkgICAgICAgYmZpbl9yZWFkMTYoUE9SVEZJT19FREdFKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRGSU9fRURHRSh2YWwpICAgYmZpbl93cml0ZTE2KFBPUlRGSU9fRURHRSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEZJT19CT1RIKCkgICAgICAgYmZpbl9yZWFkMTYoUE9SVEZJT19CT1RIKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRGSU9fQk9USCh2YWwpICAgYmZpbl93cml0ZTE2KFBPUlRGSU9fQk9USCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEZJT19JTkVOKCkgICAgICAgYmZpbl9yZWFkMTYoUE9SVEZJT19JTkVOKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRGSU9fSU5FTih2YWwpICAgYmZpbl93cml0ZTE2KFBPUlRGSU9fSU5FTiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVENJT19GRVIoKSAgICAgICAgYmZpbl9yZWFkMTYoUE9SVENJT19GRVIpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVENJT19GRVIodmFsKSAgICBiZmluX3dyaXRlMTYoUE9SVENJT19GRVIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRDSU8oKSAgICAgICAgICAgIGJmaW5fcmVhZDE2KFBPUlRDSU8pCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVENJTyh2YWwpICAgICAgICBiZmluX3dyaXRlMTYoUE9SVENJTywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVENJT19DTEVBUigpICAgICAgYmZpbl9yZWFkMTYoUE9SVENJT19DTEVBUikKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JUQ0lPX0NMRUFSKHZhbCkgIGJmaW5fd3JpdGUxNihQT1JUQ0lPX0NMRUFSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JUQ0lPX1NFVCgpICAgICAgICBiZmluX3JlYWQxNihQT1JUQ0lPX1NFVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JUQ0lPX1NFVCh2YWwpICAgIGJmaW5fd3JpdGUxNihQT1JUQ0lPX1NFVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVENJT19UT0dHTEUoKSAgICAgYmZpbl9yZWFkMTYoUE9SVENJT19UT0dHTEUpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVENJT19UT0dHTEUodmFsKSBiZmluX3dyaXRlMTYoUE9SVENJT19UT0dHTEUsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRDSU9fRElSKCkgICAgICAgIGJmaW5fcmVhZDE2KFBPUlRDSU9fRElSKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRDSU9fRElSKHZhbCkgICAgYmZpbl93cml0ZTE2KFBPUlRDSU9fRElSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JUQ0lPX0lORU4oKSAgICAgICBiZmluX3JlYWQxNihQT1JUQ0lPX0lORU4pCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVENJT19JTkVOKHZhbCkgICBiZmluX3dyaXRlMTYoUE9SVENJT19JTkVOLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JURElPX0ZFUigpICAgICAgICBiZmluX3JlYWQxNihQT1JURElPX0ZFUikKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JURElPX0ZFUih2YWwpICAgIGJmaW5fd3JpdGUxNihQT1JURElPX0ZFUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVERJTygpICAgICAgICAgICAgYmZpbl9yZWFkMTYoUE9SVERJTykKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JURElPKHZhbCkgICAgICAgIGJmaW5fd3JpdGUxNihQT1JURElPLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JURElPX0NMRUFSKCkgICAgICBiZmluX3JlYWQxNihQT1JURElPX0NMRUFSKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRESU9fQ0xFQVIodmFsKSAgYmZpbl93cml0ZTE2KFBPUlRESU9fQ0xFQVIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRESU9fU0VUKCkgICAgICAgIGJmaW5fcmVhZDE2KFBPUlRESU9fU0VUKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRESU9fU0VUKHZhbCkgICAgYmZpbl93cml0ZTE2KFBPUlRESU9fU0VULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JURElPX1RPR0dMRSgpICAgICBiZmluX3JlYWQxNihQT1JURElPX1RPR0dMRSkKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JURElPX1RPR0dMRSh2YWwpIGJmaW5fd3JpdGUxNihQT1JURElPX1RPR0dMRSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVERJT19ESVIoKSAgICAgICAgYmZpbl9yZWFkMTYoUE9SVERJT19ESVIpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVERJT19ESVIodmFsKSAgICBiZmluX3dyaXRlMTYoUE9SVERJT19ESVIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRESU9fSU5FTigpICAgICAgIGJmaW5fcmVhZDE2KFBPUlRESU9fSU5FTikKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JURElPX0lORU4odmFsKSAgIGJmaW5fd3JpdGUxNihQT1JURElPX0lORU4sIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRFSU9fRkVSKCkgICAgICAgIGJmaW5fcmVhZDE2KFBPUlRFSU9fRkVSKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRFSU9fRkVSKHZhbCkgICAgYmZpbl93cml0ZTE2KFBPUlRFSU9fRkVSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JURUlPKCkgICAgICAgICAgICBiZmluX3JlYWQxNihQT1JURUlPKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRFSU8odmFsKSAgICAgICAgYmZpbl93cml0ZTE2KFBPUlRFSU8sIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRFSU9fQ0xFQVIoKSAgICAgIGJmaW5fcmVhZDE2KFBPUlRFSU9fQ0xFQVIpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEVJT19DTEVBUih2YWwpICBiZmluX3dyaXRlMTYoUE9SVEVJT19DTEVBUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEVJT19TRVQoKSAgICAgICAgYmZpbl9yZWFkMTYoUE9SVEVJT19TRVQpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEVJT19TRVQodmFsKSAgICBiZmluX3dyaXRlMTYoUE9SVEVJT19TRVQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRFSU9fVE9HR0xFKCkgICAgIGJmaW5fcmVhZDE2KFBPUlRFSU9fVE9HR0xFKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRFSU9fVE9HR0xFKHZhbCkgYmZpbl93cml0ZTE2KFBPUlRFSU9fVE9HR0xFLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JURUlPX0RJUigpICAgICAgICBiZmluX3JlYWQxNihQT1JURUlPX0RJUikKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JURUlPX0RJUih2YWwpICAgIGJmaW5fd3JpdGUxNihQT1JURUlPX0RJUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEVJT19JTkVOKCkgICAgICAgYmZpbl9yZWFkMTYoUE9SVEVJT19JTkVOKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRFSU9fSU5FTih2YWwpICAgYmZpbl93cml0ZTE2KFBPUlRFSU9fSU5FTiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRUJJVV9BTUdDVEwoKSAgICAgICAgYmZpbl9yZWFkMTYoRUJJVV9BTUdDVEwpCisjZGVmaW5lIGJmaW5fd3JpdGVfRUJJVV9BTUdDVEwodmFsKSAgICBiZmluX3dyaXRlMTYoRUJJVV9BTUdDVEwsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VCSVVfQU1CQ1RMMCgpICAgICAgIGJmaW5fcmVhZDMyKEVCSVVfQU1CQ1RMMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9FQklVX0FNQkNUTDAodmFsKSAgIGJmaW5fd3JpdGUzMihFQklVX0FNQkNUTDAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VCSVVfQU1CQ1RMMSgpICAgICAgIGJmaW5fcmVhZDMyKEVCSVVfQU1CQ1RMMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9FQklVX0FNQkNUTDEodmFsKSAgIGJmaW5fd3JpdGUzMihFQklVX0FNQkNUTDEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VCSVVfU0RHQ1RMKCkgICAgICAgIGJmaW5fcmVhZDMyKEVCSVVfU0RHQ1RMKQorI2RlZmluZSBiZmluX3dyaXRlX0VCSVVfU0RHQ1RMKHZhbCkgICAgYmZpbl93cml0ZTMyKEVCSVVfU0RHQ1RMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FQklVX1NEQkNUTCgpICAgICAgICBiZmluX3JlYWQxNihFQklVX1NEQkNUTCkKKyNkZWZpbmUgYmZpbl93cml0ZV9FQklVX1NEQkNUTCh2YWwpICAgIGJmaW5fd3JpdGUxNihFQklVX1NEQkNUTCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRUJJVV9TRFJSQygpICAgICAgICAgYmZpbl9yZWFkMTYoRUJJVV9TRFJSQykKKyNkZWZpbmUgYmZpbl93cml0ZV9FQklVX1NEUlJDKHZhbCkgICAgIGJmaW5fd3JpdGUxNihFQklVX1NEUlJDLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FQklVX1NEU1RBVCgpICAgICAgICBiZmluX3JlYWQxNihFQklVX1NEU1RBVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9FQklVX1NEU1RBVCh2YWwpICAgIGJmaW5fd3JpdGUxNihFQklVX1NEU1RBVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMF9UQ19QRVIoKSAgICAgICAgYmZpbl9yZWFkMTYoRE1BMF9UQ19QRVIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMF9UQ19QRVIodmFsKSAgICBiZmluX3dyaXRlMTYoRE1BMF9UQ19QRVIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTBfVENfQ05UKCkgICAgICAgIGJmaW5fcmVhZDE2KERNQTBfVENfQ05UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTBfVENfQ05UKHZhbCkgICAgYmZpbl93cml0ZTE2KERNQTBfVENfQ05ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUEwX05FWFRfREVTQ19QVFIoKSBiZmluX3JlYWRQVFIoRE1BMF9ORVhUX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTBfTkVYVF9ERVNDX1BUUih2YWwpIGJmaW5fd3JpdGVQVFIoRE1BMF9ORVhUX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUEwX1NUQVJUX0FERFIoKSAgICBiZmluX3JlYWRQVFIoRE1BMF9TVEFSVF9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTBfU1RBUlRfQUREUih2YWwpIGJmaW5fd3JpdGVQVFIoRE1BMF9TVEFSVF9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUEwX0NPTkZJRygpICAgICAgICBiZmluX3JlYWQxNihETUEwX0NPTkZJRykKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEwX0NPTkZJRyh2YWwpICAgIGJmaW5fd3JpdGUxNihETUEwX0NPTkZJRywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMF9YX0NPVU5UKCkgICAgICAgYmZpbl9yZWFkMTYoRE1BMF9YX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTBfWF9DT1VOVCh2YWwpICAgYmZpbl93cml0ZTE2KERNQTBfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMF9YX01PRElGWSgpICAgICAgYmZpbl9yZWFkMTYoRE1BMF9YX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEwX1hfTU9ESUZZKHZhbCkgIGJmaW5fd3JpdGUxNihETUEwX1hfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUEwX1lfQ09VTlQoKSAgICAgICBiZmluX3JlYWQxNihETUEwX1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMF9ZX0NPVU5UKHZhbCkgICBiZmluX3dyaXRlMTYoRE1BMF9ZX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUEwX1lfTU9ESUZZKCkgICAgICBiZmluX3JlYWQxNihETUEwX1lfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTBfWV9NT0RJRlkodmFsKSAgYmZpbl93cml0ZTE2KERNQTBfWV9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTBfQ1VSUl9ERVNDX1BUUigpIGJmaW5fcmVhZFBUUihETUEwX0NVUlJfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMF9DVVJSX0RFU0NfUFRSKHZhbCkgYmZpbl93cml0ZVBUUihETUEwX0NVUlJfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTBfQ1VSUl9BRERSKCkgICAgIGJmaW5fcmVhZFBUUihETUEwX0NVUlJfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEwX0NVUlJfQUREUih2YWwpIGJmaW5fd3JpdGVQVFIoRE1BMF9DVVJSX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTBfSVJRX1NUQVRVUygpICAgIGJmaW5fcmVhZDE2KERNQTBfSVJRX1NUQVRVUykKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEwX0lSUV9TVEFUVVModmFsKSBiZmluX3dyaXRlMTYoRE1BMF9JUlFfU1RBVFVTLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUEwX1BFUklQSEVSQUxfTUFQKCkgYmZpbl9yZWFkMTYoRE1BMF9QRVJJUEhFUkFMX01BUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEwX1BFUklQSEVSQUxfTUFQKHZhbCkgYmZpbl93cml0ZTE2KERNQTBfUEVSSVBIRVJBTF9NQVAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTBfQ1VSUl9YX0NPVU5UKCkgIGJmaW5fcmVhZDE2KERNQTBfQ1VSUl9YX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTBfQ1VSUl9YX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KERNQTBfQ1VSUl9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUEwX0NVUlJfWV9DT1VOVCgpICBiZmluX3JlYWQxNihETUEwX0NVUlJfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEwX0NVUlJfWV9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihETUEwX0NVUlJfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMV9ORVhUX0RFU0NfUFRSKCkgYmZpbl9yZWFkUFRSKERNQTFfTkVYVF9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExX05FWFRfREVTQ19QVFIodmFsKSBiZmluX3dyaXRlUFRSKERNQTFfTkVYVF9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMV9TVEFSVF9BRERSKCkgICAgYmZpbl9yZWFkUFRSKERNQTFfU1RBUlRfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExX1NUQVJUX0FERFIodmFsKSBiZmluX3dyaXRlUFRSKERNQTFfU1RBUlRfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMV9DT05GSUcoKSAgICAgICAgYmZpbl9yZWFkMTYoRE1BMV9DT05GSUcpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMV9DT05GSUcodmFsKSAgICBiZmluX3dyaXRlMTYoRE1BMV9DT05GSUcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTFfWF9DT1VOVCgpICAgICAgIGJmaW5fcmVhZDE2KERNQTFfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExX1hfQ09VTlQodmFsKSAgIGJmaW5fd3JpdGUxNihETUExX1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTFfWF9NT0RJRlkoKSAgICAgIGJmaW5fcmVhZDE2KERNQTFfWF9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMV9YX01PRElGWSh2YWwpICBiZmluX3dyaXRlMTYoRE1BMV9YX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMV9ZX0NPVU5UKCkgICAgICAgYmZpbl9yZWFkMTYoRE1BMV9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTFfWV9DT1VOVCh2YWwpICAgYmZpbl93cml0ZTE2KERNQTFfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMV9ZX01PRElGWSgpICAgICAgYmZpbl9yZWFkMTYoRE1BMV9ZX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExX1lfTU9ESUZZKHZhbCkgIGJmaW5fd3JpdGUxNihETUExX1lfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExX0NVUlJfREVTQ19QVFIoKSBiZmluX3JlYWRQVFIoRE1BMV9DVVJSX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTFfQ1VSUl9ERVNDX1BUUih2YWwpIGJmaW5fd3JpdGVQVFIoRE1BMV9DVVJSX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExX0NVUlJfQUREUigpICAgICBiZmluX3JlYWRQVFIoRE1BMV9DVVJSX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMV9DVVJSX0FERFIodmFsKSBiZmluX3dyaXRlUFRSKERNQTFfQ1VSUl9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExX0lSUV9TVEFUVVMoKSAgICBiZmluX3JlYWQxNihETUExX0lSUV9TVEFUVVMpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMV9JUlFfU1RBVFVTKHZhbCkgYmZpbl93cml0ZTE2KERNQTFfSVJRX1NUQVRVUywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMV9QRVJJUEhFUkFMX01BUCgpIGJmaW5fcmVhZDE2KERNQTFfUEVSSVBIRVJBTF9NQVApCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMV9QRVJJUEhFUkFMX01BUCh2YWwpIGJmaW5fd3JpdGUxNihETUExX1BFUklQSEVSQUxfTUFQLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExX0NVUlJfWF9DT1VOVCgpICBiZmluX3JlYWQxNihETUExX0NVUlJfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExX0NVUlJfWF9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihETUExX0NVUlJfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMV9DVVJSX1lfQ09VTlQoKSAgYmZpbl9yZWFkMTYoRE1BMV9DVVJSX1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMV9DVVJSX1lfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoRE1BMV9DVVJSX1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTJfTkVYVF9ERVNDX1BUUigpIGJmaW5fcmVhZFBUUihETUEyX05FWFRfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMl9ORVhUX0RFU0NfUFRSKHZhbCkgYmZpbl93cml0ZVBUUihETUEyX05FWFRfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTJfU1RBUlRfQUREUigpICAgIGJmaW5fcmVhZFBUUihETUEyX1NUQVJUX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMl9TVEFSVF9BRERSKHZhbCkgYmZpbl93cml0ZVBUUihETUEyX1NUQVJUX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTJfQ09ORklHKCkgICAgICAgIGJmaW5fcmVhZDE2KERNQTJfQ09ORklHKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTJfQ09ORklHKHZhbCkgICAgYmZpbl93cml0ZTE2KERNQTJfQ09ORklHLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUEyX1hfQ09VTlQoKSAgICAgICBiZmluX3JlYWQxNihETUEyX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMl9YX0NPVU5UKHZhbCkgICBiZmluX3dyaXRlMTYoRE1BMl9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUEyX1hfTU9ESUZZKCkgICAgICBiZmluX3JlYWQxNihETUEyX1hfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTJfWF9NT0RJRlkodmFsKSAgYmZpbl93cml0ZTE2KERNQTJfWF9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTJfWV9DT1VOVCgpICAgICAgIGJmaW5fcmVhZDE2KERNQTJfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEyX1lfQ09VTlQodmFsKSAgIGJmaW5fd3JpdGUxNihETUEyX1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTJfWV9NT0RJRlkoKSAgICAgIGJmaW5fcmVhZDE2KERNQTJfWV9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMl9ZX01PRElGWSh2YWwpICBiZmluX3dyaXRlMTYoRE1BMl9ZX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMl9DVVJSX0RFU0NfUFRSKCkgYmZpbl9yZWFkUFRSKERNQTJfQ1VSUl9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEyX0NVUlJfREVTQ19QVFIodmFsKSBiZmluX3dyaXRlUFRSKERNQTJfQ1VSUl9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMl9DVVJSX0FERFIoKSAgICAgYmZpbl9yZWFkUFRSKERNQTJfQ1VSUl9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTJfQ1VSUl9BRERSKHZhbCkgYmZpbl93cml0ZVBUUihETUEyX0NVUlJfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMl9JUlFfU1RBVFVTKCkgICAgYmZpbl9yZWFkMTYoRE1BMl9JUlFfU1RBVFVTKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTJfSVJRX1NUQVRVUyh2YWwpIGJmaW5fd3JpdGUxNihETUEyX0lSUV9TVEFUVVMsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTJfUEVSSVBIRVJBTF9NQVAoKSBiZmluX3JlYWQxNihETUEyX1BFUklQSEVSQUxfTUFQKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTJfUEVSSVBIRVJBTF9NQVAodmFsKSBiZmluX3dyaXRlMTYoRE1BMl9QRVJJUEhFUkFMX01BUCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMl9DVVJSX1hfQ09VTlQoKSAgYmZpbl9yZWFkMTYoRE1BMl9DVVJSX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMl9DVVJSX1hfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoRE1BMl9DVVJSX1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTJfQ1VSUl9ZX0NPVU5UKCkgIGJmaW5fcmVhZDE2KERNQTJfQ1VSUl9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTJfQ1VSUl9ZX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KERNQTJfQ1VSUl9ZX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUEzX05FWFRfREVTQ19QVFIoKSBiZmluX3JlYWRQVFIoRE1BM19ORVhUX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTNfTkVYVF9ERVNDX1BUUih2YWwpIGJmaW5fd3JpdGVQVFIoRE1BM19ORVhUX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUEzX1NUQVJUX0FERFIoKSAgICBiZmluX3JlYWRQVFIoRE1BM19TVEFSVF9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTNfU1RBUlRfQUREUih2YWwpIGJmaW5fd3JpdGVQVFIoRE1BM19TVEFSVF9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUEzX0NPTkZJRygpICAgICAgICBiZmluX3JlYWQxNihETUEzX0NPTkZJRykKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEzX0NPTkZJRyh2YWwpICAgIGJmaW5fd3JpdGUxNihETUEzX0NPTkZJRywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BM19YX0NPVU5UKCkgICAgICAgYmZpbl9yZWFkMTYoRE1BM19YX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTNfWF9DT1VOVCh2YWwpICAgYmZpbl93cml0ZTE2KERNQTNfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BM19YX01PRElGWSgpICAgICAgYmZpbl9yZWFkMTYoRE1BM19YX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEzX1hfTU9ESUZZKHZhbCkgIGJmaW5fd3JpdGUxNihETUEzX1hfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUEzX1lfQ09VTlQoKSAgICAgICBiZmluX3JlYWQxNihETUEzX1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BM19ZX0NPVU5UKHZhbCkgICBiZmluX3dyaXRlMTYoRE1BM19ZX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUEzX1lfTU9ESUZZKCkgICAgICBiZmluX3JlYWQxNihETUEzX1lfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTNfWV9NT0RJRlkodmFsKSAgYmZpbl93cml0ZTE2KERNQTNfWV9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTNfQ1VSUl9ERVNDX1BUUigpIGJmaW5fcmVhZFBUUihETUEzX0NVUlJfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BM19DVVJSX0RFU0NfUFRSKHZhbCkgYmZpbl93cml0ZVBUUihETUEzX0NVUlJfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTNfQ1VSUl9BRERSKCkgICAgIGJmaW5fcmVhZFBUUihETUEzX0NVUlJfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEzX0NVUlJfQUREUih2YWwpIGJmaW5fd3JpdGVQVFIoRE1BM19DVVJSX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTNfSVJRX1NUQVRVUygpICAgIGJmaW5fcmVhZDE2KERNQTNfSVJRX1NUQVRVUykKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEzX0lSUV9TVEFUVVModmFsKSBiZmluX3dyaXRlMTYoRE1BM19JUlFfU1RBVFVTLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUEzX1BFUklQSEVSQUxfTUFQKCkgYmZpbl9yZWFkMTYoRE1BM19QRVJJUEhFUkFMX01BUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEzX1BFUklQSEVSQUxfTUFQKHZhbCkgYmZpbl93cml0ZTE2KERNQTNfUEVSSVBIRVJBTF9NQVAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTNfQ1VSUl9YX0NPVU5UKCkgIGJmaW5fcmVhZDE2KERNQTNfQ1VSUl9YX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTNfQ1VSUl9YX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KERNQTNfQ1VSUl9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUEzX0NVUlJfWV9DT1VOVCgpICBiZmluX3JlYWQxNihETUEzX0NVUlJfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEzX0NVUlJfWV9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihETUEzX0NVUlJfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BNF9ORVhUX0RFU0NfUFRSKCkgYmZpbl9yZWFkUFRSKERNQTRfTkVYVF9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE0X05FWFRfREVTQ19QVFIodmFsKSBiZmluX3dyaXRlUFRSKERNQTRfTkVYVF9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BNF9TVEFSVF9BRERSKCkgICAgYmZpbl9yZWFkUFRSKERNQTRfU1RBUlRfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE0X1NUQVJUX0FERFIodmFsKSBiZmluX3dyaXRlUFRSKERNQTRfU1RBUlRfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BNF9DT05GSUcoKSAgICAgICAgYmZpbl9yZWFkMTYoRE1BNF9DT05GSUcpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BNF9DT05GSUcodmFsKSAgICBiZmluX3dyaXRlMTYoRE1BNF9DT05GSUcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTRfWF9DT1VOVCgpICAgICAgIGJmaW5fcmVhZDE2KERNQTRfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE0X1hfQ09VTlQodmFsKSAgIGJmaW5fd3JpdGUxNihETUE0X1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTRfWF9NT0RJRlkoKSAgICAgIGJmaW5fcmVhZDE2KERNQTRfWF9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BNF9YX01PRElGWSh2YWwpICBiZmluX3dyaXRlMTYoRE1BNF9YX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BNF9ZX0NPVU5UKCkgICAgICAgYmZpbl9yZWFkMTYoRE1BNF9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTRfWV9DT1VOVCh2YWwpICAgYmZpbl93cml0ZTE2KERNQTRfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BNF9ZX01PRElGWSgpICAgICAgYmZpbl9yZWFkMTYoRE1BNF9ZX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE0X1lfTU9ESUZZKHZhbCkgIGJmaW5fd3JpdGUxNihETUE0X1lfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE0X0NVUlJfREVTQ19QVFIoKSBiZmluX3JlYWRQVFIoRE1BNF9DVVJSX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTRfQ1VSUl9ERVNDX1BUUih2YWwpIGJmaW5fd3JpdGVQVFIoRE1BNF9DVVJSX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE0X0NVUlJfQUREUigpICAgICBiZmluX3JlYWRQVFIoRE1BNF9DVVJSX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BNF9DVVJSX0FERFIodmFsKSBiZmluX3dyaXRlUFRSKERNQTRfQ1VSUl9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE0X0lSUV9TVEFUVVMoKSAgICBiZmluX3JlYWQxNihETUE0X0lSUV9TVEFUVVMpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BNF9JUlFfU1RBVFVTKHZhbCkgYmZpbl93cml0ZTE2KERNQTRfSVJRX1NUQVRVUywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BNF9QRVJJUEhFUkFMX01BUCgpIGJmaW5fcmVhZDE2KERNQTRfUEVSSVBIRVJBTF9NQVApCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BNF9QRVJJUEhFUkFMX01BUCh2YWwpIGJmaW5fd3JpdGUxNihETUE0X1BFUklQSEVSQUxfTUFQLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE0X0NVUlJfWF9DT1VOVCgpICBiZmluX3JlYWQxNihETUE0X0NVUlJfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE0X0NVUlJfWF9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihETUE0X0NVUlJfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BNF9DVVJSX1lfQ09VTlQoKSAgYmZpbl9yZWFkMTYoRE1BNF9DVVJSX1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BNF9DVVJSX1lfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoRE1BNF9DVVJSX1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTVfTkVYVF9ERVNDX1BUUigpIGJmaW5fcmVhZFBUUihETUE1X05FWFRfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BNV9ORVhUX0RFU0NfUFRSKHZhbCkgYmZpbl93cml0ZVBUUihETUE1X05FWFRfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTVfU1RBUlRfQUREUigpICAgIGJmaW5fcmVhZFBUUihETUE1X1NUQVJUX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BNV9TVEFSVF9BRERSKHZhbCkgYmZpbl93cml0ZVBUUihETUE1X1NUQVJUX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTVfQ09ORklHKCkgICAgICAgIGJmaW5fcmVhZDE2KERNQTVfQ09ORklHKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTVfQ09ORklHKHZhbCkgICAgYmZpbl93cml0ZTE2KERNQTVfQ09ORklHLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE1X1hfQ09VTlQoKSAgICAgICBiZmluX3JlYWQxNihETUE1X1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BNV9YX0NPVU5UKHZhbCkgICBiZmluX3dyaXRlMTYoRE1BNV9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE1X1hfTU9ESUZZKCkgICAgICBiZmluX3JlYWQxNihETUE1X1hfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTVfWF9NT0RJRlkodmFsKSAgYmZpbl93cml0ZTE2KERNQTVfWF9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTVfWV9DT1VOVCgpICAgICAgIGJmaW5fcmVhZDE2KERNQTVfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE1X1lfQ09VTlQodmFsKSAgIGJmaW5fd3JpdGUxNihETUE1X1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTVfWV9NT0RJRlkoKSAgICAgIGJmaW5fcmVhZDE2KERNQTVfWV9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BNV9ZX01PRElGWSh2YWwpICBiZmluX3dyaXRlMTYoRE1BNV9ZX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BNV9DVVJSX0RFU0NfUFRSKCkgYmZpbl9yZWFkUFRSKERNQTVfQ1VSUl9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE1X0NVUlJfREVTQ19QVFIodmFsKSBiZmluX3dyaXRlUFRSKERNQTVfQ1VSUl9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BNV9DVVJSX0FERFIoKSAgICAgYmZpbl9yZWFkUFRSKERNQTVfQ1VSUl9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTVfQ1VSUl9BRERSKHZhbCkgYmZpbl93cml0ZVBUUihETUE1X0NVUlJfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BNV9JUlFfU1RBVFVTKCkgICAgYmZpbl9yZWFkMTYoRE1BNV9JUlFfU1RBVFVTKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTVfSVJRX1NUQVRVUyh2YWwpIGJmaW5fd3JpdGUxNihETUE1X0lSUV9TVEFUVVMsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTVfUEVSSVBIRVJBTF9NQVAoKSBiZmluX3JlYWQxNihETUE1X1BFUklQSEVSQUxfTUFQKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTVfUEVSSVBIRVJBTF9NQVAodmFsKSBiZmluX3dyaXRlMTYoRE1BNV9QRVJJUEhFUkFMX01BUCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BNV9DVVJSX1hfQ09VTlQoKSAgYmZpbl9yZWFkMTYoRE1BNV9DVVJSX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BNV9DVVJSX1hfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoRE1BNV9DVVJSX1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTVfQ1VSUl9ZX0NPVU5UKCkgIGJmaW5fcmVhZDE2KERNQTVfQ1VSUl9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTVfQ1VSUl9ZX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KERNQTVfQ1VSUl9ZX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE2X05FWFRfREVTQ19QVFIoKSBiZmluX3JlYWRQVFIoRE1BNl9ORVhUX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTZfTkVYVF9ERVNDX1BUUih2YWwpIGJmaW5fd3JpdGVQVFIoRE1BNl9ORVhUX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE2X1NUQVJUX0FERFIoKSAgICBiZmluX3JlYWRQVFIoRE1BNl9TVEFSVF9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTZfU1RBUlRfQUREUih2YWwpIGJmaW5fd3JpdGVQVFIoRE1BNl9TVEFSVF9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE2X0NPTkZJRygpICAgICAgICBiZmluX3JlYWQxNihETUE2X0NPTkZJRykKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE2X0NPTkZJRyh2YWwpICAgIGJmaW5fd3JpdGUxNihETUE2X0NPTkZJRywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BNl9YX0NPVU5UKCkgICAgICAgYmZpbl9yZWFkMTYoRE1BNl9YX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTZfWF9DT1VOVCh2YWwpICAgYmZpbl93cml0ZTE2KERNQTZfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BNl9YX01PRElGWSgpICAgICAgYmZpbl9yZWFkMTYoRE1BNl9YX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE2X1hfTU9ESUZZKHZhbCkgIGJmaW5fd3JpdGUxNihETUE2X1hfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE2X1lfQ09VTlQoKSAgICAgICBiZmluX3JlYWQxNihETUE2X1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BNl9ZX0NPVU5UKHZhbCkgICBiZmluX3dyaXRlMTYoRE1BNl9ZX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE2X1lfTU9ESUZZKCkgICAgICBiZmluX3JlYWQxNihETUE2X1lfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTZfWV9NT0RJRlkodmFsKSAgYmZpbl93cml0ZTE2KERNQTZfWV9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTZfQ1VSUl9ERVNDX1BUUigpIGJmaW5fcmVhZFBUUihETUE2X0NVUlJfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BNl9DVVJSX0RFU0NfUFRSKHZhbCkgYmZpbl93cml0ZVBUUihETUE2X0NVUlJfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTZfQ1VSUl9BRERSKCkgICAgIGJmaW5fcmVhZFBUUihETUE2X0NVUlJfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE2X0NVUlJfQUREUih2YWwpIGJmaW5fd3JpdGVQVFIoRE1BNl9DVVJSX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTZfSVJRX1NUQVRVUygpICAgIGJmaW5fcmVhZDE2KERNQTZfSVJRX1NUQVRVUykKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE2X0lSUV9TVEFUVVModmFsKSBiZmluX3dyaXRlMTYoRE1BNl9JUlFfU1RBVFVTLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE2X1BFUklQSEVSQUxfTUFQKCkgYmZpbl9yZWFkMTYoRE1BNl9QRVJJUEhFUkFMX01BUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE2X1BFUklQSEVSQUxfTUFQKHZhbCkgYmZpbl93cml0ZTE2KERNQTZfUEVSSVBIRVJBTF9NQVAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTZfQ1VSUl9YX0NPVU5UKCkgIGJmaW5fcmVhZDE2KERNQTZfQ1VSUl9YX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTZfQ1VSUl9YX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KERNQTZfQ1VSUl9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE2X0NVUlJfWV9DT1VOVCgpICBiZmluX3JlYWQxNihETUE2X0NVUlJfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE2X0NVUlJfWV9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihETUE2X0NVUlJfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BN19ORVhUX0RFU0NfUFRSKCkgYmZpbl9yZWFkUFRSKERNQTdfTkVYVF9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE3X05FWFRfREVTQ19QVFIodmFsKSBiZmluX3dyaXRlUFRSKERNQTdfTkVYVF9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BN19TVEFSVF9BRERSKCkgICAgYmZpbl9yZWFkUFRSKERNQTdfU1RBUlRfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE3X1NUQVJUX0FERFIodmFsKSBiZmluX3dyaXRlUFRSKERNQTdfU1RBUlRfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BN19DT05GSUcoKSAgICAgICAgYmZpbl9yZWFkMTYoRE1BN19DT05GSUcpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BN19DT05GSUcodmFsKSAgICBiZmluX3dyaXRlMTYoRE1BN19DT05GSUcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTdfWF9DT1VOVCgpICAgICAgIGJmaW5fcmVhZDE2KERNQTdfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE3X1hfQ09VTlQodmFsKSAgIGJmaW5fd3JpdGUxNihETUE3X1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTdfWF9NT0RJRlkoKSAgICAgIGJmaW5fcmVhZDE2KERNQTdfWF9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BN19YX01PRElGWSh2YWwpICBiZmluX3dyaXRlMTYoRE1BN19YX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BN19ZX0NPVU5UKCkgICAgICAgYmZpbl9yZWFkMTYoRE1BN19ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTdfWV9DT1VOVCh2YWwpICAgYmZpbl93cml0ZTE2KERNQTdfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BN19ZX01PRElGWSgpICAgICAgYmZpbl9yZWFkMTYoRE1BN19ZX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE3X1lfTU9ESUZZKHZhbCkgIGJmaW5fd3JpdGUxNihETUE3X1lfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE3X0NVUlJfREVTQ19QVFIoKSBiZmluX3JlYWRQVFIoRE1BN19DVVJSX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTdfQ1VSUl9ERVNDX1BUUih2YWwpIGJmaW5fd3JpdGVQVFIoRE1BN19DVVJSX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE3X0NVUlJfQUREUigpICAgICBiZmluX3JlYWRQVFIoRE1BN19DVVJSX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BN19DVVJSX0FERFIodmFsKSBiZmluX3dyaXRlUFRSKERNQTdfQ1VSUl9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE3X0lSUV9TVEFUVVMoKSAgICBiZmluX3JlYWQxNihETUE3X0lSUV9TVEFUVVMpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BN19JUlFfU1RBVFVTKHZhbCkgYmZpbl93cml0ZTE2KERNQTdfSVJRX1NUQVRVUywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BN19QRVJJUEhFUkFMX01BUCgpIGJmaW5fcmVhZDE2KERNQTdfUEVSSVBIRVJBTF9NQVApCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BN19QRVJJUEhFUkFMX01BUCh2YWwpIGJmaW5fd3JpdGUxNihETUE3X1BFUklQSEVSQUxfTUFQLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE3X0NVUlJfWF9DT1VOVCgpICBiZmluX3JlYWQxNihETUE3X0NVUlJfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE3X0NVUlJfWF9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihETUE3X0NVUlJfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BN19DVVJSX1lfQ09VTlQoKSAgYmZpbl9yZWFkMTYoRE1BN19DVVJSX1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BN19DVVJSX1lfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoRE1BN19DVVJSX1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTFfVENfUEVSKCkgICAgICAgIGJmaW5fcmVhZDE2KERNQTFfVENfUEVSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTFfVENfUEVSKHZhbCkgICAgYmZpbl93cml0ZTE2KERNQTFfVENfUEVSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExX1RDX0NOVCgpICAgICAgICBiZmluX3JlYWQxNihETUExX1RDX0NOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExX1RDX0NOVCh2YWwpICAgIGJmaW5fd3JpdGUxNihETUExX1RDX0NOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BOF9ORVhUX0RFU0NfUFRSKCkgYmZpbl9yZWFkUFRSKERNQThfTkVYVF9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE4X05FWFRfREVTQ19QVFIodmFsKSBiZmluX3dyaXRlUFRSKERNQThfTkVYVF9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BOF9TVEFSVF9BRERSKCkgICAgYmZpbl9yZWFkUFRSKERNQThfU1RBUlRfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE4X1NUQVJUX0FERFIodmFsKSBiZmluX3dyaXRlUFRSKERNQThfU1RBUlRfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BOF9DT05GSUcoKSAgICAgICAgYmZpbl9yZWFkMTYoRE1BOF9DT05GSUcpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BOF9DT05GSUcodmFsKSAgICBiZmluX3dyaXRlMTYoRE1BOF9DT05GSUcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQThfWF9DT1VOVCgpICAgICAgIGJmaW5fcmVhZDE2KERNQThfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE4X1hfQ09VTlQodmFsKSAgIGJmaW5fd3JpdGUxNihETUE4X1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQThfWF9NT0RJRlkoKSAgICAgIGJmaW5fcmVhZDE2KERNQThfWF9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BOF9YX01PRElGWSh2YWwpICBiZmluX3dyaXRlMTYoRE1BOF9YX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BOF9ZX0NPVU5UKCkgICAgICAgYmZpbl9yZWFkMTYoRE1BOF9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQThfWV9DT1VOVCh2YWwpICAgYmZpbl93cml0ZTE2KERNQThfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BOF9ZX01PRElGWSgpICAgICAgYmZpbl9yZWFkMTYoRE1BOF9ZX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE4X1lfTU9ESUZZKHZhbCkgIGJmaW5fd3JpdGUxNihETUE4X1lfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE4X0NVUlJfREVTQ19QVFIoKSBiZmluX3JlYWRQVFIoRE1BOF9DVVJSX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQThfQ1VSUl9ERVNDX1BUUih2YWwpIGJmaW5fd3JpdGVQVFIoRE1BOF9DVVJSX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE4X0NVUlJfQUREUigpICAgICBiZmluX3JlYWRQVFIoRE1BOF9DVVJSX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BOF9DVVJSX0FERFIodmFsKSBiZmluX3dyaXRlUFRSKERNQThfQ1VSUl9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE4X0lSUV9TVEFUVVMoKSAgICBiZmluX3JlYWQxNihETUE4X0lSUV9TVEFUVVMpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BOF9JUlFfU1RBVFVTKHZhbCkgYmZpbl93cml0ZTE2KERNQThfSVJRX1NUQVRVUywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BOF9QRVJJUEhFUkFMX01BUCgpIGJmaW5fcmVhZDE2KERNQThfUEVSSVBIRVJBTF9NQVApCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BOF9QRVJJUEhFUkFMX01BUCh2YWwpIGJmaW5fd3JpdGUxNihETUE4X1BFUklQSEVSQUxfTUFQLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE4X0NVUlJfWF9DT1VOVCgpICBiZmluX3JlYWQxNihETUE4X0NVUlJfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE4X0NVUlJfWF9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihETUE4X0NVUlJfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BOF9DVVJSX1lfQ09VTlQoKSAgYmZpbl9yZWFkMTYoRE1BOF9DVVJSX1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BOF9DVVJSX1lfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoRE1BOF9DVVJSX1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTlfTkVYVF9ERVNDX1BUUigpIGJmaW5fcmVhZFBUUihETUE5X05FWFRfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BOV9ORVhUX0RFU0NfUFRSKHZhbCkgYmZpbl93cml0ZVBUUihETUE5X05FWFRfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTlfU1RBUlRfQUREUigpICAgIGJmaW5fcmVhZFBUUihETUE5X1NUQVJUX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BOV9TVEFSVF9BRERSKHZhbCkgYmZpbl93cml0ZVBUUihETUE5X1NUQVJUX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTlfQ09ORklHKCkgICAgICAgIGJmaW5fcmVhZDE2KERNQTlfQ09ORklHKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTlfQ09ORklHKHZhbCkgICAgYmZpbl93cml0ZTE2KERNQTlfQ09ORklHLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE5X1hfQ09VTlQoKSAgICAgICBiZmluX3JlYWQxNihETUE5X1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BOV9YX0NPVU5UKHZhbCkgICBiZmluX3dyaXRlMTYoRE1BOV9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE5X1hfTU9ESUZZKCkgICAgICBiZmluX3JlYWQxNihETUE5X1hfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTlfWF9NT0RJRlkodmFsKSAgYmZpbl93cml0ZTE2KERNQTlfWF9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTlfWV9DT1VOVCgpICAgICAgIGJmaW5fcmVhZDE2KERNQTlfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE5X1lfQ09VTlQodmFsKSAgIGJmaW5fd3JpdGUxNihETUE5X1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTlfWV9NT0RJRlkoKSAgICAgIGJmaW5fcmVhZDE2KERNQTlfWV9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BOV9ZX01PRElGWSh2YWwpICBiZmluX3dyaXRlMTYoRE1BOV9ZX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BOV9DVVJSX0RFU0NfUFRSKCkgYmZpbl9yZWFkUFRSKERNQTlfQ1VSUl9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE5X0NVUlJfREVTQ19QVFIodmFsKSBiZmluX3dyaXRlUFRSKERNQTlfQ1VSUl9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BOV9DVVJSX0FERFIoKSAgICAgYmZpbl9yZWFkUFRSKERNQTlfQ1VSUl9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTlfQ1VSUl9BRERSKHZhbCkgYmZpbl93cml0ZVBUUihETUE5X0NVUlJfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BOV9JUlFfU1RBVFVTKCkgICAgYmZpbl9yZWFkMTYoRE1BOV9JUlFfU1RBVFVTKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTlfSVJRX1NUQVRVUyh2YWwpIGJmaW5fd3JpdGUxNihETUE5X0lSUV9TVEFUVVMsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTlfUEVSSVBIRVJBTF9NQVAoKSBiZmluX3JlYWQxNihETUE5X1BFUklQSEVSQUxfTUFQKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTlfUEVSSVBIRVJBTF9NQVAodmFsKSBiZmluX3dyaXRlMTYoRE1BOV9QRVJJUEhFUkFMX01BUCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BOV9DVVJSX1hfQ09VTlQoKSAgYmZpbl9yZWFkMTYoRE1BOV9DVVJSX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BOV9DVVJSX1hfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoRE1BOV9DVVJSX1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTlfQ1VSUl9ZX0NPVU5UKCkgIGJmaW5fcmVhZDE2KERNQTlfQ1VSUl9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTlfQ1VSUl9ZX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KERNQTlfQ1VSUl9ZX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExMF9ORVhUX0RFU0NfUFRSKCkgYmZpbl9yZWFkUFRSKERNQTEwX05FWFRfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTBfTkVYVF9ERVNDX1BUUih2YWwpIGJmaW5fd3JpdGVQVFIoRE1BMTBfTkVYVF9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTBfU1RBUlRfQUREUigpICAgYmZpbl9yZWFkUFRSKERNQTEwX1NUQVJUX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTBfU1RBUlRfQUREUih2YWwpIGJmaW5fd3JpdGVQVFIoRE1BMTBfU1RBUlRfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTBfQ09ORklHKCkgICAgICAgYmZpbl9yZWFkMTYoRE1BMTBfQ09ORklHKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTEwX0NPTkZJRyh2YWwpICAgYmZpbl93cml0ZTE2KERNQTEwX0NPTkZJRywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTBfWF9DT1VOVCgpICAgICAgYmZpbl9yZWFkMTYoRE1BMTBfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExMF9YX0NPVU5UKHZhbCkgIGJmaW5fd3JpdGUxNihETUExMF9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExMF9YX01PRElGWSgpICAgICBiZmluX3JlYWQxNihETUExMF9YX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExMF9YX01PRElGWSh2YWwpIGJmaW5fd3JpdGUxNihETUExMF9YX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTBfWV9DT1VOVCgpICAgICAgYmZpbl9yZWFkMTYoRE1BMTBfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExMF9ZX0NPVU5UKHZhbCkgIGJmaW5fd3JpdGUxNihETUExMF9ZX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExMF9ZX01PRElGWSgpICAgICBiZmluX3JlYWQxNihETUExMF9ZX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExMF9ZX01PRElGWSh2YWwpIGJmaW5fd3JpdGUxNihETUExMF9ZX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTBfQ1VSUl9ERVNDX1BUUigpIGJmaW5fcmVhZFBUUihETUExMF9DVVJSX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTEwX0NVUlJfREVTQ19QVFIodmFsKSBiZmluX3dyaXRlUFRSKERNQTEwX0NVUlJfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTEwX0NVUlJfQUREUigpICAgIGJmaW5fcmVhZFBUUihETUExMF9DVVJSX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTBfQ1VSUl9BRERSKHZhbCkgYmZpbl93cml0ZVBUUihETUExMF9DVVJSX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTEwX0lSUV9TVEFUVVMoKSAgIGJmaW5fcmVhZDE2KERNQTEwX0lSUV9TVEFUVVMpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTBfSVJRX1NUQVRVUyh2YWwpIGJmaW5fd3JpdGUxNihETUExMF9JUlFfU1RBVFVTLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExMF9QRVJJUEhFUkFMX01BUCgpIGJmaW5fcmVhZDE2KERNQTEwX1BFUklQSEVSQUxfTUFQKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTEwX1BFUklQSEVSQUxfTUFQKHZhbCkgYmZpbl93cml0ZTE2KERNQTEwX1BFUklQSEVSQUxfTUFQLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExMF9DVVJSX1hfQ09VTlQoKSBiZmluX3JlYWQxNihETUExMF9DVVJSX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTBfQ1VSUl9YX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KERNQTEwX0NVUlJfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTBfQ1VSUl9ZX0NPVU5UKCkgYmZpbl9yZWFkMTYoRE1BMTBfQ1VSUl9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTEwX0NVUlJfWV9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihETUExMF9DVVJSX1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTExX05FWFRfREVTQ19QVFIoKSBiZmluX3JlYWRQVFIoRE1BMTFfTkVYVF9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExMV9ORVhUX0RFU0NfUFRSKHZhbCkgYmZpbl93cml0ZVBUUihETUExMV9ORVhUX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExMV9TVEFSVF9BRERSKCkgICBiZmluX3JlYWRQVFIoRE1BMTFfU1RBUlRfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExMV9TVEFSVF9BRERSKHZhbCkgYmZpbl93cml0ZVBUUihETUExMV9TVEFSVF9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExMV9DT05GSUcoKSAgICAgICBiZmluX3JlYWQxNihETUExMV9DT05GSUcpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTFfQ09ORklHKHZhbCkgICBiZmluX3dyaXRlMTYoRE1BMTFfQ09ORklHLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExMV9YX0NPVU5UKCkgICAgICBiZmluX3JlYWQxNihETUExMV9YX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTExX1hfQ09VTlQodmFsKSAgYmZpbl93cml0ZTE2KERNQTExX1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTExX1hfTU9ESUZZKCkgICAgIGJmaW5fcmVhZDE2KERNQTExX1hfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTExX1hfTU9ESUZZKHZhbCkgYmZpbl93cml0ZTE2KERNQTExX1hfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExMV9ZX0NPVU5UKCkgICAgICBiZmluX3JlYWQxNihETUExMV9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTExX1lfQ09VTlQodmFsKSAgYmZpbl93cml0ZTE2KERNQTExX1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTExX1lfTU9ESUZZKCkgICAgIGJmaW5fcmVhZDE2KERNQTExX1lfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTExX1lfTU9ESUZZKHZhbCkgYmZpbl93cml0ZTE2KERNQTExX1lfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExMV9DVVJSX0RFU0NfUFRSKCkgYmZpbl9yZWFkUFRSKERNQTExX0NVUlJfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTFfQ1VSUl9ERVNDX1BUUih2YWwpIGJmaW5fd3JpdGVQVFIoRE1BMTFfQ1VSUl9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTFfQ1VSUl9BRERSKCkgICAgYmZpbl9yZWFkUFRSKERNQTExX0NVUlJfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExMV9DVVJSX0FERFIodmFsKSBiZmluX3dyaXRlUFRSKERNQTExX0NVUlJfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTFfSVJRX1NUQVRVUygpICAgYmZpbl9yZWFkMTYoRE1BMTFfSVJRX1NUQVRVUykKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExMV9JUlFfU1RBVFVTKHZhbCkgYmZpbl93cml0ZTE2KERNQTExX0lSUV9TVEFUVVMsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTExX1BFUklQSEVSQUxfTUFQKCkgYmZpbl9yZWFkMTYoRE1BMTFfUEVSSVBIRVJBTF9NQVApCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTFfUEVSSVBIRVJBTF9NQVAodmFsKSBiZmluX3dyaXRlMTYoRE1BMTFfUEVSSVBIRVJBTF9NQVAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTExX0NVUlJfWF9DT1VOVCgpIGJmaW5fcmVhZDE2KERNQTExX0NVUlJfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExMV9DVVJSX1hfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoRE1BMTFfQ1VSUl9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExMV9DVVJSX1lfQ09VTlQoKSBiZmluX3JlYWQxNihETUExMV9DVVJSX1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTFfQ1VSUl9ZX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KERNQTExX0NVUlJfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTJfTkVYVF9ERVNDX1BUUigpIGJmaW5fcmVhZFBUUihETUExMl9ORVhUX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTEyX05FWFRfREVTQ19QVFIodmFsKSBiZmluX3dyaXRlUFRSKERNQTEyX05FWFRfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTEyX1NUQVJUX0FERFIoKSAgIGJmaW5fcmVhZFBUUihETUExMl9TVEFSVF9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTEyX1NUQVJUX0FERFIodmFsKSBiZmluX3dyaXRlUFRSKERNQTEyX1NUQVJUX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTEyX0NPTkZJRygpICAgICAgIGJmaW5fcmVhZDE2KERNQTEyX0NPTkZJRykKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExMl9DT05GSUcodmFsKSAgIGJmaW5fd3JpdGUxNihETUExMl9DT05GSUcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTEyX1hfQ09VTlQoKSAgICAgIGJmaW5fcmVhZDE2KERNQTEyX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTJfWF9DT1VOVCh2YWwpICBiZmluX3dyaXRlMTYoRE1BMTJfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTJfWF9NT0RJRlkoKSAgICAgYmZpbl9yZWFkMTYoRE1BMTJfWF9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTJfWF9NT0RJRlkodmFsKSBiZmluX3dyaXRlMTYoRE1BMTJfWF9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTEyX1lfQ09VTlQoKSAgICAgIGJmaW5fcmVhZDE2KERNQTEyX1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTJfWV9DT1VOVCh2YWwpICBiZmluX3dyaXRlMTYoRE1BMTJfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTJfWV9NT0RJRlkoKSAgICAgYmZpbl9yZWFkMTYoRE1BMTJfWV9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTJfWV9NT0RJRlkodmFsKSBiZmluX3dyaXRlMTYoRE1BMTJfWV9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTEyX0NVUlJfREVTQ19QVFIoKSBiZmluX3JlYWRQVFIoRE1BMTJfQ1VSUl9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExMl9DVVJSX0RFU0NfUFRSKHZhbCkgYmZpbl93cml0ZVBUUihETUExMl9DVVJSX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExMl9DVVJSX0FERFIoKSAgICBiZmluX3JlYWRQVFIoRE1BMTJfQ1VSUl9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTEyX0NVUlJfQUREUih2YWwpIGJmaW5fd3JpdGVQVFIoRE1BMTJfQ1VSUl9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExMl9JUlFfU1RBVFVTKCkgICBiZmluX3JlYWQxNihETUExMl9JUlFfU1RBVFVTKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTEyX0lSUV9TVEFUVVModmFsKSBiZmluX3dyaXRlMTYoRE1BMTJfSVJRX1NUQVRVUywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTJfUEVSSVBIRVJBTF9NQVAoKSBiZmluX3JlYWQxNihETUExMl9QRVJJUEhFUkFMX01BUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExMl9QRVJJUEhFUkFMX01BUCh2YWwpIGJmaW5fd3JpdGUxNihETUExMl9QRVJJUEhFUkFMX01BUCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTJfQ1VSUl9YX0NPVU5UKCkgYmZpbl9yZWFkMTYoRE1BMTJfQ1VSUl9YX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTEyX0NVUlJfWF9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihETUExMl9DVVJSX1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTEyX0NVUlJfWV9DT1VOVCgpIGJmaW5fcmVhZDE2KERNQTEyX0NVUlJfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExMl9DVVJSX1lfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoRE1BMTJfQ1VSUl9ZX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExM19ORVhUX0RFU0NfUFRSKCkgYmZpbl9yZWFkUFRSKERNQTEzX05FWFRfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTNfTkVYVF9ERVNDX1BUUih2YWwpIGJmaW5fd3JpdGVQVFIoRE1BMTNfTkVYVF9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTNfU1RBUlRfQUREUigpICAgYmZpbl9yZWFkUFRSKERNQTEzX1NUQVJUX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTNfU1RBUlRfQUREUih2YWwpIGJmaW5fd3JpdGVQVFIoRE1BMTNfU1RBUlRfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTNfQ09ORklHKCkgICAgICAgYmZpbl9yZWFkMTYoRE1BMTNfQ09ORklHKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTEzX0NPTkZJRyh2YWwpICAgYmZpbl93cml0ZTE2KERNQTEzX0NPTkZJRywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTNfWF9DT1VOVCgpICAgICAgYmZpbl9yZWFkMTYoRE1BMTNfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExM19YX0NPVU5UKHZhbCkgIGJmaW5fd3JpdGUxNihETUExM19YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExM19YX01PRElGWSgpICAgICBiZmluX3JlYWQxNihETUExM19YX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExM19YX01PRElGWSh2YWwpIGJmaW5fd3JpdGUxNihETUExM19YX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTNfWV9DT1VOVCgpICAgICAgYmZpbl9yZWFkMTYoRE1BMTNfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExM19ZX0NPVU5UKHZhbCkgIGJmaW5fd3JpdGUxNihETUExM19ZX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExM19ZX01PRElGWSgpICAgICBiZmluX3JlYWQxNihETUExM19ZX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExM19ZX01PRElGWSh2YWwpIGJmaW5fd3JpdGUxNihETUExM19ZX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTNfQ1VSUl9ERVNDX1BUUigpIGJmaW5fcmVhZFBUUihETUExM19DVVJSX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTEzX0NVUlJfREVTQ19QVFIodmFsKSBiZmluX3dyaXRlUFRSKERNQTEzX0NVUlJfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTEzX0NVUlJfQUREUigpICAgIGJmaW5fcmVhZFBUUihETUExM19DVVJSX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTNfQ1VSUl9BRERSKHZhbCkgYmZpbl93cml0ZVBUUihETUExM19DVVJSX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTEzX0lSUV9TVEFUVVMoKSAgIGJmaW5fcmVhZDE2KERNQTEzX0lSUV9TVEFUVVMpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTNfSVJRX1NUQVRVUyh2YWwpIGJmaW5fd3JpdGUxNihETUExM19JUlFfU1RBVFVTLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExM19QRVJJUEhFUkFMX01BUCgpIGJmaW5fcmVhZDE2KERNQTEzX1BFUklQSEVSQUxfTUFQKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTEzX1BFUklQSEVSQUxfTUFQKHZhbCkgYmZpbl93cml0ZTE2KERNQTEzX1BFUklQSEVSQUxfTUFQLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExM19DVVJSX1hfQ09VTlQoKSBiZmluX3JlYWQxNihETUExM19DVVJSX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTNfQ1VSUl9YX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KERNQTEzX0NVUlJfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTNfQ1VSUl9ZX0NPVU5UKCkgYmZpbl9yZWFkMTYoRE1BMTNfQ1VSUl9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTEzX0NVUlJfWV9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihETUExM19DVVJSX1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTE0X05FWFRfREVTQ19QVFIoKSBiZmluX3JlYWRQVFIoRE1BMTRfTkVYVF9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExNF9ORVhUX0RFU0NfUFRSKHZhbCkgYmZpbl93cml0ZVBUUihETUExNF9ORVhUX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExNF9TVEFSVF9BRERSKCkgICBiZmluX3JlYWRQVFIoRE1BMTRfU1RBUlRfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExNF9TVEFSVF9BRERSKHZhbCkgYmZpbl93cml0ZVBUUihETUExNF9TVEFSVF9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExNF9DT05GSUcoKSAgICAgICBiZmluX3JlYWQxNihETUExNF9DT05GSUcpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTRfQ09ORklHKHZhbCkgICBiZmluX3dyaXRlMTYoRE1BMTRfQ09ORklHLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExNF9YX0NPVU5UKCkgICAgICBiZmluX3JlYWQxNihETUExNF9YX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTE0X1hfQ09VTlQodmFsKSAgYmZpbl93cml0ZTE2KERNQTE0X1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTE0X1hfTU9ESUZZKCkgICAgIGJmaW5fcmVhZDE2KERNQTE0X1hfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTE0X1hfTU9ESUZZKHZhbCkgYmZpbl93cml0ZTE2KERNQTE0X1hfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExNF9ZX0NPVU5UKCkgICAgICBiZmluX3JlYWQxNihETUExNF9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTE0X1lfQ09VTlQodmFsKSAgYmZpbl93cml0ZTE2KERNQTE0X1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTE0X1lfTU9ESUZZKCkgICAgIGJmaW5fcmVhZDE2KERNQTE0X1lfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTE0X1lfTU9ESUZZKHZhbCkgYmZpbl93cml0ZTE2KERNQTE0X1lfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExNF9DVVJSX0RFU0NfUFRSKCkgYmZpbl9yZWFkUFRSKERNQTE0X0NVUlJfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTRfQ1VSUl9ERVNDX1BUUih2YWwpIGJmaW5fd3JpdGVQVFIoRE1BMTRfQ1VSUl9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTRfQ1VSUl9BRERSKCkgICAgYmZpbl9yZWFkUFRSKERNQTE0X0NVUlJfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExNF9DVVJSX0FERFIodmFsKSBiZmluX3dyaXRlUFRSKERNQTE0X0NVUlJfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTRfSVJRX1NUQVRVUygpICAgYmZpbl9yZWFkMTYoRE1BMTRfSVJRX1NUQVRVUykKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExNF9JUlFfU1RBVFVTKHZhbCkgYmZpbl93cml0ZTE2KERNQTE0X0lSUV9TVEFUVVMsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTE0X1BFUklQSEVSQUxfTUFQKCkgYmZpbl9yZWFkMTYoRE1BMTRfUEVSSVBIRVJBTF9NQVApCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTRfUEVSSVBIRVJBTF9NQVAodmFsKSBiZmluX3dyaXRlMTYoRE1BMTRfUEVSSVBIRVJBTF9NQVAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTE0X0NVUlJfWF9DT1VOVCgpIGJmaW5fcmVhZDE2KERNQTE0X0NVUlJfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExNF9DVVJSX1hfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoRE1BMTRfQ1VSUl9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExNF9DVVJSX1lfQ09VTlQoKSBiZmluX3JlYWQxNihETUExNF9DVVJSX1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTRfQ1VSUl9ZX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KERNQTE0X0NVUlJfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTVfTkVYVF9ERVNDX1BUUigpIGJmaW5fcmVhZFBUUihETUExNV9ORVhUX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTE1X05FWFRfREVTQ19QVFIodmFsKSBiZmluX3dyaXRlUFRSKERNQTE1X05FWFRfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTE1X1NUQVJUX0FERFIoKSAgIGJmaW5fcmVhZFBUUihETUExNV9TVEFSVF9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTE1X1NUQVJUX0FERFIodmFsKSBiZmluX3dyaXRlUFRSKERNQTE1X1NUQVJUX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTE1X0NPTkZJRygpICAgICAgIGJmaW5fcmVhZDE2KERNQTE1X0NPTkZJRykKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExNV9DT05GSUcodmFsKSAgIGJmaW5fd3JpdGUxNihETUExNV9DT05GSUcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTE1X1hfQ09VTlQoKSAgICAgIGJmaW5fcmVhZDE2KERNQTE1X1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTVfWF9DT1VOVCh2YWwpICBiZmluX3dyaXRlMTYoRE1BMTVfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTVfWF9NT0RJRlkoKSAgICAgYmZpbl9yZWFkMTYoRE1BMTVfWF9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTVfWF9NT0RJRlkodmFsKSBiZmluX3dyaXRlMTYoRE1BMTVfWF9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTE1X1lfQ09VTlQoKSAgICAgIGJmaW5fcmVhZDE2KERNQTE1X1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTVfWV9DT1VOVCh2YWwpICBiZmluX3dyaXRlMTYoRE1BMTVfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTVfWV9NT0RJRlkoKSAgICAgYmZpbl9yZWFkMTYoRE1BMTVfWV9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTVfWV9NT0RJRlkodmFsKSBiZmluX3dyaXRlMTYoRE1BMTVfWV9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTE1X0NVUlJfREVTQ19QVFIoKSBiZmluX3JlYWRQVFIoRE1BMTVfQ1VSUl9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExNV9DVVJSX0RFU0NfUFRSKHZhbCkgYmZpbl93cml0ZVBUUihETUExNV9DVVJSX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExNV9DVVJSX0FERFIoKSAgICBiZmluX3JlYWRQVFIoRE1BMTVfQ1VSUl9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTE1X0NVUlJfQUREUih2YWwpIGJmaW5fd3JpdGVQVFIoRE1BMTVfQ1VSUl9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExNV9JUlFfU1RBVFVTKCkgICBiZmluX3JlYWQxNihETUExNV9JUlFfU1RBVFVTKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTE1X0lSUV9TVEFUVVModmFsKSBiZmluX3dyaXRlMTYoRE1BMTVfSVJRX1NUQVRVUywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTVfUEVSSVBIRVJBTF9NQVAoKSBiZmluX3JlYWQxNihETUExNV9QRVJJUEhFUkFMX01BUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExNV9QRVJJUEhFUkFMX01BUCh2YWwpIGJmaW5fd3JpdGUxNihETUExNV9QRVJJUEhFUkFMX01BUCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTVfQ1VSUl9YX0NPVU5UKCkgYmZpbl9yZWFkMTYoRE1BMTVfQ1VSUl9YX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTE1X0NVUlJfWF9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihETUExNV9DVVJSX1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTE1X0NVUlJfWV9DT1VOVCgpIGJmaW5fcmVhZDE2KERNQTE1X0NVUlJfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExNV9DVVJSX1lfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoRE1BMTVfQ1VSUl9ZX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExNl9ORVhUX0RFU0NfUFRSKCkgYmZpbl9yZWFkUFRSKERNQTE2X05FWFRfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTZfTkVYVF9ERVNDX1BUUih2YWwpIGJmaW5fd3JpdGVQVFIoRE1BMTZfTkVYVF9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTZfU1RBUlRfQUREUigpICAgYmZpbl9yZWFkUFRSKERNQTE2X1NUQVJUX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTZfU1RBUlRfQUREUih2YWwpIGJmaW5fd3JpdGVQVFIoRE1BMTZfU1RBUlRfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTZfQ09ORklHKCkgICAgICAgYmZpbl9yZWFkMTYoRE1BMTZfQ09ORklHKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTE2X0NPTkZJRyh2YWwpICAgYmZpbl93cml0ZTE2KERNQTE2X0NPTkZJRywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTZfWF9DT1VOVCgpICAgICAgYmZpbl9yZWFkMTYoRE1BMTZfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExNl9YX0NPVU5UKHZhbCkgIGJmaW5fd3JpdGUxNihETUExNl9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExNl9YX01PRElGWSgpICAgICBiZmluX3JlYWQxNihETUExNl9YX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExNl9YX01PRElGWSh2YWwpIGJmaW5fd3JpdGUxNihETUExNl9YX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTZfWV9DT1VOVCgpICAgICAgYmZpbl9yZWFkMTYoRE1BMTZfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExNl9ZX0NPVU5UKHZhbCkgIGJmaW5fd3JpdGUxNihETUExNl9ZX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExNl9ZX01PRElGWSgpICAgICBiZmluX3JlYWQxNihETUExNl9ZX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExNl9ZX01PRElGWSh2YWwpIGJmaW5fd3JpdGUxNihETUExNl9ZX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTZfQ1VSUl9ERVNDX1BUUigpIGJmaW5fcmVhZFBUUihETUExNl9DVVJSX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTE2X0NVUlJfREVTQ19QVFIodmFsKSBiZmluX3dyaXRlUFRSKERNQTE2X0NVUlJfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTE2X0NVUlJfQUREUigpICAgIGJmaW5fcmVhZFBUUihETUExNl9DVVJSX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTZfQ1VSUl9BRERSKHZhbCkgYmZpbl93cml0ZVBUUihETUExNl9DVVJSX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTE2X0lSUV9TVEFUVVMoKSAgIGJmaW5fcmVhZDE2KERNQTE2X0lSUV9TVEFUVVMpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTZfSVJRX1NUQVRVUyh2YWwpIGJmaW5fd3JpdGUxNihETUExNl9JUlFfU1RBVFVTLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExNl9QRVJJUEhFUkFMX01BUCgpIGJmaW5fcmVhZDE2KERNQTE2X1BFUklQSEVSQUxfTUFQKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTE2X1BFUklQSEVSQUxfTUFQKHZhbCkgYmZpbl93cml0ZTE2KERNQTE2X1BFUklQSEVSQUxfTUFQLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExNl9DVVJSX1hfQ09VTlQoKSBiZmluX3JlYWQxNihETUExNl9DVVJSX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTZfQ1VSUl9YX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KERNQTE2X0NVUlJfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTZfQ1VSUl9ZX0NPVU5UKCkgYmZpbl9yZWFkMTYoRE1BMTZfQ1VSUl9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTE2X0NVUlJfWV9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihETUExNl9DVVJSX1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTE3X05FWFRfREVTQ19QVFIoKSBiZmluX3JlYWRQVFIoRE1BMTdfTkVYVF9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExN19ORVhUX0RFU0NfUFRSKHZhbCkgYmZpbl93cml0ZVBUUihETUExN19ORVhUX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExN19TVEFSVF9BRERSKCkgICBiZmluX3JlYWRQVFIoRE1BMTdfU1RBUlRfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExN19TVEFSVF9BRERSKHZhbCkgYmZpbl93cml0ZVBUUihETUExN19TVEFSVF9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExN19DT05GSUcoKSAgICAgICBiZmluX3JlYWQxNihETUExN19DT05GSUcpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTdfQ09ORklHKHZhbCkgICBiZmluX3dyaXRlMTYoRE1BMTdfQ09ORklHLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExN19YX0NPVU5UKCkgICAgICBiZmluX3JlYWQxNihETUExN19YX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTE3X1hfQ09VTlQodmFsKSAgYmZpbl93cml0ZTE2KERNQTE3X1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTE3X1hfTU9ESUZZKCkgICAgIGJmaW5fcmVhZDE2KERNQTE3X1hfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTE3X1hfTU9ESUZZKHZhbCkgYmZpbl93cml0ZTE2KERNQTE3X1hfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExN19ZX0NPVU5UKCkgICAgICBiZmluX3JlYWQxNihETUExN19ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTE3X1lfQ09VTlQodmFsKSAgYmZpbl93cml0ZTE2KERNQTE3X1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTE3X1lfTU9ESUZZKCkgICAgIGJmaW5fcmVhZDE2KERNQTE3X1lfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTE3X1lfTU9ESUZZKHZhbCkgYmZpbl93cml0ZTE2KERNQTE3X1lfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExN19DVVJSX0RFU0NfUFRSKCkgYmZpbl9yZWFkUFRSKERNQTE3X0NVUlJfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTdfQ1VSUl9ERVNDX1BUUih2YWwpIGJmaW5fd3JpdGVQVFIoRE1BMTdfQ1VSUl9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTdfQ1VSUl9BRERSKCkgICAgYmZpbl9yZWFkUFRSKERNQTE3X0NVUlJfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExN19DVVJSX0FERFIodmFsKSBiZmluX3dyaXRlUFRSKERNQTE3X0NVUlJfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTdfSVJRX1NUQVRVUygpICAgYmZpbl9yZWFkMTYoRE1BMTdfSVJRX1NUQVRVUykKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExN19JUlFfU1RBVFVTKHZhbCkgYmZpbl93cml0ZTE2KERNQTE3X0lSUV9TVEFUVVMsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTE3X1BFUklQSEVSQUxfTUFQKCkgYmZpbl9yZWFkMTYoRE1BMTdfUEVSSVBIRVJBTF9NQVApCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTdfUEVSSVBIRVJBTF9NQVAodmFsKSBiZmluX3dyaXRlMTYoRE1BMTdfUEVSSVBIRVJBTF9NQVAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTE3X0NVUlJfWF9DT1VOVCgpIGJmaW5fcmVhZDE2KERNQTE3X0NVUlJfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExN19DVVJSX1hfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoRE1BMTdfQ1VSUl9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExN19DVVJSX1lfQ09VTlQoKSBiZmluX3JlYWQxNihETUExN19DVVJSX1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTdfQ1VSUl9ZX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KERNQTE3X0NVUlJfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMThfTkVYVF9ERVNDX1BUUigpIGJmaW5fcmVhZFBUUihETUExOF9ORVhUX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTE4X05FWFRfREVTQ19QVFIodmFsKSBiZmluX3dyaXRlUFRSKERNQTE4X05FWFRfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTE4X1NUQVJUX0FERFIoKSAgIGJmaW5fcmVhZFBUUihETUExOF9TVEFSVF9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTE4X1NUQVJUX0FERFIodmFsKSBiZmluX3dyaXRlUFRSKERNQTE4X1NUQVJUX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTE4X0NPTkZJRygpICAgICAgIGJmaW5fcmVhZDE2KERNQTE4X0NPTkZJRykKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExOF9DT05GSUcodmFsKSAgIGJmaW5fd3JpdGUxNihETUExOF9DT05GSUcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTE4X1hfQ09VTlQoKSAgICAgIGJmaW5fcmVhZDE2KERNQTE4X1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMThfWF9DT1VOVCh2YWwpICBiZmluX3dyaXRlMTYoRE1BMThfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMThfWF9NT0RJRlkoKSAgICAgYmZpbl9yZWFkMTYoRE1BMThfWF9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMThfWF9NT0RJRlkodmFsKSBiZmluX3dyaXRlMTYoRE1BMThfWF9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTE4X1lfQ09VTlQoKSAgICAgIGJmaW5fcmVhZDE2KERNQTE4X1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMThfWV9DT1VOVCh2YWwpICBiZmluX3dyaXRlMTYoRE1BMThfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMThfWV9NT0RJRlkoKSAgICAgYmZpbl9yZWFkMTYoRE1BMThfWV9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMThfWV9NT0RJRlkodmFsKSBiZmluX3dyaXRlMTYoRE1BMThfWV9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTE4X0NVUlJfREVTQ19QVFIoKSBiZmluX3JlYWRQVFIoRE1BMThfQ1VSUl9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExOF9DVVJSX0RFU0NfUFRSKHZhbCkgYmZpbl93cml0ZVBUUihETUExOF9DVVJSX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExOF9DVVJSX0FERFIoKSAgICBiZmluX3JlYWRQVFIoRE1BMThfQ1VSUl9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTE4X0NVUlJfQUREUih2YWwpIGJmaW5fd3JpdGVQVFIoRE1BMThfQ1VSUl9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExOF9JUlFfU1RBVFVTKCkgICBiZmluX3JlYWQxNihETUExOF9JUlFfU1RBVFVTKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTE4X0lSUV9TVEFUVVModmFsKSBiZmluX3dyaXRlMTYoRE1BMThfSVJRX1NUQVRVUywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMThfUEVSSVBIRVJBTF9NQVAoKSBiZmluX3JlYWQxNihETUExOF9QRVJJUEhFUkFMX01BUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExOF9QRVJJUEhFUkFMX01BUCh2YWwpIGJmaW5fd3JpdGUxNihETUExOF9QRVJJUEhFUkFMX01BUCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMThfQ1VSUl9YX0NPVU5UKCkgYmZpbl9yZWFkMTYoRE1BMThfQ1VSUl9YX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTE4X0NVUlJfWF9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihETUExOF9DVVJSX1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTE4X0NVUlJfWV9DT1VOVCgpIGJmaW5fcmVhZDE2KERNQTE4X0NVUlJfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExOF9DVVJSX1lfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoRE1BMThfQ1VSUl9ZX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExOV9ORVhUX0RFU0NfUFRSKCkgYmZpbl9yZWFkUFRSKERNQTE5X05FWFRfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTlfTkVYVF9ERVNDX1BUUih2YWwpIGJmaW5fd3JpdGVQVFIoRE1BMTlfTkVYVF9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTlfU1RBUlRfQUREUigpICAgYmZpbl9yZWFkUFRSKERNQTE5X1NUQVJUX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTlfU1RBUlRfQUREUih2YWwpIGJmaW5fd3JpdGVQVFIoRE1BMTlfU1RBUlRfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTlfQ09ORklHKCkgICAgICAgYmZpbl9yZWFkMTYoRE1BMTlfQ09ORklHKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTE5X0NPTkZJRyh2YWwpICAgYmZpbl93cml0ZTE2KERNQTE5X0NPTkZJRywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTlfWF9DT1VOVCgpICAgICAgYmZpbl9yZWFkMTYoRE1BMTlfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExOV9YX0NPVU5UKHZhbCkgIGJmaW5fd3JpdGUxNihETUExOV9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExOV9YX01PRElGWSgpICAgICBiZmluX3JlYWQxNihETUExOV9YX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExOV9YX01PRElGWSh2YWwpIGJmaW5fd3JpdGUxNihETUExOV9YX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTlfWV9DT1VOVCgpICAgICAgYmZpbl9yZWFkMTYoRE1BMTlfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExOV9ZX0NPVU5UKHZhbCkgIGJmaW5fd3JpdGUxNihETUExOV9ZX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExOV9ZX01PRElGWSgpICAgICBiZmluX3JlYWQxNihETUExOV9ZX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExOV9ZX01PRElGWSh2YWwpIGJmaW5fd3JpdGUxNihETUExOV9ZX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTlfQ1VSUl9ERVNDX1BUUigpIGJmaW5fcmVhZFBUUihETUExOV9DVVJSX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTE5X0NVUlJfREVTQ19QVFIodmFsKSBiZmluX3dyaXRlUFRSKERNQTE5X0NVUlJfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTE5X0NVUlJfQUREUigpICAgIGJmaW5fcmVhZFBUUihETUExOV9DVVJSX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTlfQ1VSUl9BRERSKHZhbCkgYmZpbl93cml0ZVBUUihETUExOV9DVVJSX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTE5X0lSUV9TVEFUVVMoKSAgIGJmaW5fcmVhZDE2KERNQTE5X0lSUV9TVEFUVVMpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTlfSVJRX1NUQVRVUyh2YWwpIGJmaW5fd3JpdGUxNihETUExOV9JUlFfU1RBVFVTLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExOV9QRVJJUEhFUkFMX01BUCgpIGJmaW5fcmVhZDE2KERNQTE5X1BFUklQSEVSQUxfTUFQKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTE5X1BFUklQSEVSQUxfTUFQKHZhbCkgYmZpbl93cml0ZTE2KERNQTE5X1BFUklQSEVSQUxfTUFQLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExOV9DVVJSX1hfQ09VTlQoKSBiZmluX3JlYWQxNihETUExOV9DVVJSX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTlfQ1VSUl9YX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KERNQTE5X0NVUlJfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTlfQ1VSUl9ZX0NPVU5UKCkgYmZpbl9yZWFkMTYoRE1BMTlfQ1VSUl9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTE5X0NVUlJfWV9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihETUExOV9DVVJSX1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUEwX0QwX05FWFRfREVTQ19QVFIoKSBiZmluX3JlYWRQVFIoTURNQTBfRDBfTkVYVF9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMF9EMF9ORVhUX0RFU0NfUFRSKHZhbCkgYmZpbl93cml0ZVBUUihNRE1BMF9EMF9ORVhUX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BMF9EMF9TVEFSVF9BRERSKCkgYmZpbl9yZWFkUFRSKE1ETUEwX0QwX1NUQVJUX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQTBfRDBfU1RBUlRfQUREUih2YWwpIGJmaW5fd3JpdGVQVFIoTURNQTBfRDBfU1RBUlRfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQTBfRDBfQ09ORklHKCkgICAgYmZpbl9yZWFkMTYoTURNQTBfRDBfQ09ORklHKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUEwX0QwX0NPTkZJRyh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMF9EMF9DT05GSUcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUEwX0QwX1hfQ09VTlQoKSAgIGJmaW5fcmVhZDE2KE1ETUEwX0QwX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQTBfRDBfWF9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMF9EMF9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BMF9EMF9YX01PRElGWSgpICBiZmluX3JlYWQxNihNRE1BMF9EMF9YX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMF9EMF9YX01PRElGWSh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMF9EMF9YX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQTBfRDBfWV9DT1VOVCgpICAgYmZpbl9yZWFkMTYoTURNQTBfRDBfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMF9EMF9ZX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KE1ETUEwX0QwX1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUEwX0QwX1lfTU9ESUZZKCkgIGJmaW5fcmVhZDE2KE1ETUEwX0QwX1lfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUEwX0QwX1lfTU9ESUZZKHZhbCkgYmZpbl93cml0ZTE2KE1ETUEwX0QwX1lfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BMF9EMF9DVVJSX0RFU0NfUFRSKCkgYmZpbl9yZWFkUFRSKE1ETUEwX0QwX0NVUlJfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQTBfRDBfQ1VSUl9ERVNDX1BUUih2YWwpIGJmaW5fd3JpdGVQVFIoTURNQTBfRDBfQ1VSUl9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQTBfRDBfQ1VSUl9BRERSKCkgYmZpbl9yZWFkUFRSKE1ETUEwX0QwX0NVUlJfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMF9EMF9DVVJSX0FERFIodmFsKSBiZmluX3dyaXRlUFRSKE1ETUEwX0QwX0NVUlJfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQTBfRDBfSVJRX1NUQVRVUygpIGJmaW5fcmVhZDE2KE1ETUEwX0QwX0lSUV9TVEFUVVMpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQTBfRDBfSVJRX1NUQVRVUyh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMF9EMF9JUlFfU1RBVFVTLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BMF9EMF9QRVJJUEhFUkFMX01BUCgpIGJmaW5fcmVhZDE2KE1ETUEwX0QwX1BFUklQSEVSQUxfTUFQKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUEwX0QwX1BFUklQSEVSQUxfTUFQKHZhbCkgYmZpbl93cml0ZTE2KE1ETUEwX0QwX1BFUklQSEVSQUxfTUFQLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BMF9EMF9DVVJSX1hfQ09VTlQoKSBiZmluX3JlYWQxNihNRE1BMF9EMF9DVVJSX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQTBfRDBfQ1VSUl9YX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KE1ETUEwX0QwX0NVUlJfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQTBfRDBfQ1VSUl9ZX0NPVU5UKCkgYmZpbl9yZWFkMTYoTURNQTBfRDBfQ1VSUl9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUEwX0QwX0NVUlJfWV9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMF9EMF9DVVJSX1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUEwX1MwX05FWFRfREVTQ19QVFIoKSBiZmluX3JlYWRQVFIoTURNQTBfUzBfTkVYVF9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMF9TMF9ORVhUX0RFU0NfUFRSKHZhbCkgYmZpbl93cml0ZVBUUihNRE1BMF9TMF9ORVhUX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BMF9TMF9TVEFSVF9BRERSKCkgYmZpbl9yZWFkUFRSKE1ETUEwX1MwX1NUQVJUX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQTBfUzBfU1RBUlRfQUREUih2YWwpIGJmaW5fd3JpdGVQVFIoTURNQTBfUzBfU1RBUlRfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQTBfUzBfQ09ORklHKCkgICAgYmZpbl9yZWFkMTYoTURNQTBfUzBfQ09ORklHKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUEwX1MwX0NPTkZJRyh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMF9TMF9DT05GSUcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUEwX1MwX1hfQ09VTlQoKSAgIGJmaW5fcmVhZDE2KE1ETUEwX1MwX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQTBfUzBfWF9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMF9TMF9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BMF9TMF9YX01PRElGWSgpICBiZmluX3JlYWQxNihNRE1BMF9TMF9YX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMF9TMF9YX01PRElGWSh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMF9TMF9YX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQTBfUzBfWV9DT1VOVCgpICAgYmZpbl9yZWFkMTYoTURNQTBfUzBfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMF9TMF9ZX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KE1ETUEwX1MwX1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUEwX1MwX1lfTU9ESUZZKCkgIGJmaW5fcmVhZDE2KE1ETUEwX1MwX1lfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUEwX1MwX1lfTU9ESUZZKHZhbCkgYmZpbl93cml0ZTE2KE1ETUEwX1MwX1lfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BMF9TMF9DVVJSX0RFU0NfUFRSKCkgYmZpbl9yZWFkUFRSKE1ETUEwX1MwX0NVUlJfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQTBfUzBfQ1VSUl9ERVNDX1BUUih2YWwpIGJmaW5fd3JpdGVQVFIoTURNQTBfUzBfQ1VSUl9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQTBfUzBfQ1VSUl9BRERSKCkgYmZpbl9yZWFkUFRSKE1ETUEwX1MwX0NVUlJfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMF9TMF9DVVJSX0FERFIodmFsKSBiZmluX3dyaXRlUFRSKE1ETUEwX1MwX0NVUlJfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQTBfUzBfSVJRX1NUQVRVUygpIGJmaW5fcmVhZDE2KE1ETUEwX1MwX0lSUV9TVEFUVVMpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQTBfUzBfSVJRX1NUQVRVUyh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMF9TMF9JUlFfU1RBVFVTLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BMF9TMF9QRVJJUEhFUkFMX01BUCgpIGJmaW5fcmVhZDE2KE1ETUEwX1MwX1BFUklQSEVSQUxfTUFQKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUEwX1MwX1BFUklQSEVSQUxfTUFQKHZhbCkgYmZpbl93cml0ZTE2KE1ETUEwX1MwX1BFUklQSEVSQUxfTUFQLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BMF9TMF9DVVJSX1hfQ09VTlQoKSBiZmluX3JlYWQxNihNRE1BMF9TMF9DVVJSX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQTBfUzBfQ1VSUl9YX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KE1ETUEwX1MwX0NVUlJfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQTBfUzBfQ1VSUl9ZX0NPVU5UKCkgYmZpbl9yZWFkMTYoTURNQTBfUzBfQ1VSUl9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUEwX1MwX0NVUlJfWV9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMF9TMF9DVVJSX1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUEwX0QxX05FWFRfREVTQ19QVFIoKSBiZmluX3JlYWRQVFIoTURNQTBfRDFfTkVYVF9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMF9EMV9ORVhUX0RFU0NfUFRSKHZhbCkgYmZpbl93cml0ZVBUUihNRE1BMF9EMV9ORVhUX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BMF9EMV9TVEFSVF9BRERSKCkgYmZpbl9yZWFkUFRSKE1ETUEwX0QxX1NUQVJUX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQTBfRDFfU1RBUlRfQUREUih2YWwpIGJmaW5fd3JpdGVQVFIoTURNQTBfRDFfU1RBUlRfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQTBfRDFfQ09ORklHKCkgICAgYmZpbl9yZWFkMTYoTURNQTBfRDFfQ09ORklHKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUEwX0QxX0NPTkZJRyh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMF9EMV9DT05GSUcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUEwX0QxX1hfQ09VTlQoKSAgIGJmaW5fcmVhZDE2KE1ETUEwX0QxX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQTBfRDFfWF9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMF9EMV9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BMF9EMV9YX01PRElGWSgpICBiZmluX3JlYWQxNihNRE1BMF9EMV9YX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMF9EMV9YX01PRElGWSh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMF9EMV9YX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQTBfRDFfWV9DT1VOVCgpICAgYmZpbl9yZWFkMTYoTURNQTBfRDFfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMF9EMV9ZX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KE1ETUEwX0QxX1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUEwX0QxX1lfTU9ESUZZKCkgIGJmaW5fcmVhZDE2KE1ETUEwX0QxX1lfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUEwX0QxX1lfTU9ESUZZKHZhbCkgYmZpbl93cml0ZTE2KE1ETUEwX0QxX1lfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BMF9EMV9DVVJSX0RFU0NfUFRSKCkgYmZpbl9yZWFkUFRSKE1ETUEwX0QxX0NVUlJfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQTBfRDFfQ1VSUl9ERVNDX1BUUih2YWwpIGJmaW5fd3JpdGVQVFIoTURNQTBfRDFfQ1VSUl9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQTBfRDFfQ1VSUl9BRERSKCkgYmZpbl9yZWFkUFRSKE1ETUEwX0QxX0NVUlJfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMF9EMV9DVVJSX0FERFIodmFsKSBiZmluX3dyaXRlUFRSKE1ETUEwX0QxX0NVUlJfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQTBfRDFfSVJRX1NUQVRVUygpIGJmaW5fcmVhZDE2KE1ETUEwX0QxX0lSUV9TVEFUVVMpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQTBfRDFfSVJRX1NUQVRVUyh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMF9EMV9JUlFfU1RBVFVTLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BMF9EMV9QRVJJUEhFUkFMX01BUCgpIGJmaW5fcmVhZDE2KE1ETUEwX0QxX1BFUklQSEVSQUxfTUFQKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUEwX0QxX1BFUklQSEVSQUxfTUFQKHZhbCkgYmZpbl93cml0ZTE2KE1ETUEwX0QxX1BFUklQSEVSQUxfTUFQLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BMF9EMV9DVVJSX1hfQ09VTlQoKSBiZmluX3JlYWQxNihNRE1BMF9EMV9DVVJSX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQTBfRDFfQ1VSUl9YX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KE1ETUEwX0QxX0NVUlJfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQTBfRDFfQ1VSUl9ZX0NPVU5UKCkgYmZpbl9yZWFkMTYoTURNQTBfRDFfQ1VSUl9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUEwX0QxX0NVUlJfWV9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMF9EMV9DVVJSX1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUEwX1MxX05FWFRfREVTQ19QVFIoKSBiZmluX3JlYWRQVFIoTURNQTBfUzFfTkVYVF9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMF9TMV9ORVhUX0RFU0NfUFRSKHZhbCkgYmZpbl93cml0ZVBUUihNRE1BMF9TMV9ORVhUX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BMF9TMV9TVEFSVF9BRERSKCkgYmZpbl9yZWFkUFRSKE1ETUEwX1MxX1NUQVJUX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQTBfUzFfU1RBUlRfQUREUih2YWwpIGJmaW5fd3JpdGVQVFIoTURNQTBfUzFfU1RBUlRfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQTBfUzFfQ09ORklHKCkgICAgYmZpbl9yZWFkMTYoTURNQTBfUzFfQ09ORklHKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUEwX1MxX0NPTkZJRyh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMF9TMV9DT05GSUcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUEwX1MxX1hfQ09VTlQoKSAgIGJmaW5fcmVhZDE2KE1ETUEwX1MxX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQTBfUzFfWF9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMF9TMV9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BMF9TMV9YX01PRElGWSgpICBiZmluX3JlYWQxNihNRE1BMF9TMV9YX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMF9TMV9YX01PRElGWSh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMF9TMV9YX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQTBfUzFfWV9DT1VOVCgpICAgYmZpbl9yZWFkMTYoTURNQTBfUzFfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMF9TMV9ZX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KE1ETUEwX1MxX1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUEwX1MxX1lfTU9ESUZZKCkgIGJmaW5fcmVhZDE2KE1ETUEwX1MxX1lfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUEwX1MxX1lfTU9ESUZZKHZhbCkgYmZpbl93cml0ZTE2KE1ETUEwX1MxX1lfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BMF9TMV9DVVJSX0RFU0NfUFRSKCkgYmZpbl9yZWFkUFRSKE1ETUEwX1MxX0NVUlJfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQTBfUzFfQ1VSUl9ERVNDX1BUUih2YWwpIGJmaW5fd3JpdGVQVFIoTURNQTBfUzFfQ1VSUl9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQTBfUzFfQ1VSUl9BRERSKCkgYmZpbl9yZWFkUFRSKE1ETUEwX1MxX0NVUlJfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMF9TMV9DVVJSX0FERFIodmFsKSBiZmluX3dyaXRlUFRSKE1ETUEwX1MxX0NVUlJfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQTBfUzFfSVJRX1NUQVRVUygpIGJmaW5fcmVhZDE2KE1ETUEwX1MxX0lSUV9TVEFUVVMpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQTBfUzFfSVJRX1NUQVRVUyh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMF9TMV9JUlFfU1RBVFVTLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BMF9TMV9QRVJJUEhFUkFMX01BUCgpIGJmaW5fcmVhZDE2KE1ETUEwX1MxX1BFUklQSEVSQUxfTUFQKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUEwX1MxX1BFUklQSEVSQUxfTUFQKHZhbCkgYmZpbl93cml0ZTE2KE1ETUEwX1MxX1BFUklQSEVSQUxfTUFQLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BMF9TMV9DVVJSX1hfQ09VTlQoKSBiZmluX3JlYWQxNihNRE1BMF9TMV9DVVJSX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQTBfUzFfQ1VSUl9YX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KE1ETUEwX1MxX0NVUlJfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQTBfUzFfQ1VSUl9ZX0NPVU5UKCkgYmZpbl9yZWFkMTYoTURNQTBfUzFfQ1VSUl9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUEwX1MxX0NVUlJfWV9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMF9TMV9DVVJSX1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUExX0QwX05FWFRfREVTQ19QVFIoKSBiZmluX3JlYWRQVFIoTURNQTFfRDBfTkVYVF9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMV9EMF9ORVhUX0RFU0NfUFRSKHZhbCkgYmZpbl93cml0ZVBUUihNRE1BMV9EMF9ORVhUX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BMV9EMF9TVEFSVF9BRERSKCkgYmZpbl9yZWFkUFRSKE1ETUExX0QwX1NUQVJUX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQTFfRDBfU1RBUlRfQUREUih2YWwpIGJmaW5fd3JpdGVQVFIoTURNQTFfRDBfU1RBUlRfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQTFfRDBfQ09ORklHKCkgICAgYmZpbl9yZWFkMTYoTURNQTFfRDBfQ09ORklHKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUExX0QwX0NPTkZJRyh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMV9EMF9DT05GSUcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUExX0QwX1hfQ09VTlQoKSAgIGJmaW5fcmVhZDE2KE1ETUExX0QwX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQTFfRDBfWF9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMV9EMF9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BMV9EMF9YX01PRElGWSgpICBiZmluX3JlYWQxNihNRE1BMV9EMF9YX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMV9EMF9YX01PRElGWSh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMV9EMF9YX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQTFfRDBfWV9DT1VOVCgpICAgYmZpbl9yZWFkMTYoTURNQTFfRDBfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMV9EMF9ZX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KE1ETUExX0QwX1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUExX0QwX1lfTU9ESUZZKCkgIGJmaW5fcmVhZDE2KE1ETUExX0QwX1lfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUExX0QwX1lfTU9ESUZZKHZhbCkgYmZpbl93cml0ZTE2KE1ETUExX0QwX1lfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BMV9EMF9DVVJSX0RFU0NfUFRSKCkgYmZpbl9yZWFkUFRSKE1ETUExX0QwX0NVUlJfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQTFfRDBfQ1VSUl9ERVNDX1BUUih2YWwpIGJmaW5fd3JpdGVQVFIoTURNQTFfRDBfQ1VSUl9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQTFfRDBfQ1VSUl9BRERSKCkgYmZpbl9yZWFkUFRSKE1ETUExX0QwX0NVUlJfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMV9EMF9DVVJSX0FERFIodmFsKSBiZmluX3dyaXRlUFRSKE1ETUExX0QwX0NVUlJfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQTFfRDBfSVJRX1NUQVRVUygpIGJmaW5fcmVhZDE2KE1ETUExX0QwX0lSUV9TVEFUVVMpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQTFfRDBfSVJRX1NUQVRVUyh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMV9EMF9JUlFfU1RBVFVTLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BMV9EMF9QRVJJUEhFUkFMX01BUCgpIGJmaW5fcmVhZDE2KE1ETUExX0QwX1BFUklQSEVSQUxfTUFQKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUExX0QwX1BFUklQSEVSQUxfTUFQKHZhbCkgYmZpbl93cml0ZTE2KE1ETUExX0QwX1BFUklQSEVSQUxfTUFQLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BMV9EMF9DVVJSX1hfQ09VTlQoKSBiZmluX3JlYWQxNihNRE1BMV9EMF9DVVJSX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQTFfRDBfQ1VSUl9YX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KE1ETUExX0QwX0NVUlJfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQTFfRDBfQ1VSUl9ZX0NPVU5UKCkgYmZpbl9yZWFkMTYoTURNQTFfRDBfQ1VSUl9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUExX0QwX0NVUlJfWV9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMV9EMF9DVVJSX1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUExX1MwX05FWFRfREVTQ19QVFIoKSBiZmluX3JlYWRQVFIoTURNQTFfUzBfTkVYVF9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMV9TMF9ORVhUX0RFU0NfUFRSKHZhbCkgYmZpbl93cml0ZVBUUihNRE1BMV9TMF9ORVhUX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BMV9TMF9TVEFSVF9BRERSKCkgYmZpbl9yZWFkUFRSKE1ETUExX1MwX1NUQVJUX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQTFfUzBfU1RBUlRfQUREUih2YWwpIGJmaW5fd3JpdGVQVFIoTURNQTFfUzBfU1RBUlRfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQTFfUzBfQ09ORklHKCkgICAgYmZpbl9yZWFkMTYoTURNQTFfUzBfQ09ORklHKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUExX1MwX0NPTkZJRyh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMV9TMF9DT05GSUcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUExX1MwX1hfQ09VTlQoKSAgIGJmaW5fcmVhZDE2KE1ETUExX1MwX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQTFfUzBfWF9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMV9TMF9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BMV9TMF9YX01PRElGWSgpICBiZmluX3JlYWQxNihNRE1BMV9TMF9YX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMV9TMF9YX01PRElGWSh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMV9TMF9YX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQTFfUzBfWV9DT1VOVCgpICAgYmZpbl9yZWFkMTYoTURNQTFfUzBfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMV9TMF9ZX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KE1ETUExX1MwX1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUExX1MwX1lfTU9ESUZZKCkgIGJmaW5fcmVhZDE2KE1ETUExX1MwX1lfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUExX1MwX1lfTU9ESUZZKHZhbCkgYmZpbl93cml0ZTE2KE1ETUExX1MwX1lfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BMV9TMF9DVVJSX0RFU0NfUFRSKCkgYmZpbl9yZWFkUFRSKE1ETUExX1MwX0NVUlJfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQTFfUzBfQ1VSUl9ERVNDX1BUUih2YWwpIGJmaW5fd3JpdGVQVFIoTURNQTFfUzBfQ1VSUl9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQTFfUzBfQ1VSUl9BRERSKCkgYmZpbl9yZWFkUFRSKE1ETUExX1MwX0NVUlJfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMV9TMF9DVVJSX0FERFIodmFsKSBiZmluX3dyaXRlUFRSKE1ETUExX1MwX0NVUlJfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQTFfUzBfSVJRX1NUQVRVUygpIGJmaW5fcmVhZDE2KE1ETUExX1MwX0lSUV9TVEFUVVMpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQTFfUzBfSVJRX1NUQVRVUyh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMV9TMF9JUlFfU1RBVFVTLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BMV9TMF9QRVJJUEhFUkFMX01BUCgpIGJmaW5fcmVhZDE2KE1ETUExX1MwX1BFUklQSEVSQUxfTUFQKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUExX1MwX1BFUklQSEVSQUxfTUFQKHZhbCkgYmZpbl93cml0ZTE2KE1ETUExX1MwX1BFUklQSEVSQUxfTUFQLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BMV9TMF9DVVJSX1hfQ09VTlQoKSBiZmluX3JlYWQxNihNRE1BMV9TMF9DVVJSX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQTFfUzBfQ1VSUl9YX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KE1ETUExX1MwX0NVUlJfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQTFfUzBfQ1VSUl9ZX0NPVU5UKCkgYmZpbl9yZWFkMTYoTURNQTFfUzBfQ1VSUl9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUExX1MwX0NVUlJfWV9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMV9TMF9DVVJSX1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUExX0QxX05FWFRfREVTQ19QVFIoKSBiZmluX3JlYWRQVFIoTURNQTFfRDFfTkVYVF9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMV9EMV9ORVhUX0RFU0NfUFRSKHZhbCkgYmZpbl93cml0ZVBUUihNRE1BMV9EMV9ORVhUX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BMV9EMV9TVEFSVF9BRERSKCkgYmZpbl9yZWFkUFRSKE1ETUExX0QxX1NUQVJUX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQTFfRDFfU1RBUlRfQUREUih2YWwpIGJmaW5fd3JpdGVQVFIoTURNQTFfRDFfU1RBUlRfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQTFfRDFfQ09ORklHKCkgICAgYmZpbl9yZWFkMTYoTURNQTFfRDFfQ09ORklHKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUExX0QxX0NPTkZJRyh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMV9EMV9DT05GSUcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUExX0QxX1hfQ09VTlQoKSAgIGJmaW5fcmVhZDE2KE1ETUExX0QxX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQTFfRDFfWF9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMV9EMV9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BMV9EMV9YX01PRElGWSgpICBiZmluX3JlYWQxNihNRE1BMV9EMV9YX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMV9EMV9YX01PRElGWSh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMV9EMV9YX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQTFfRDFfWV9DT1VOVCgpICAgYmZpbl9yZWFkMTYoTURNQTFfRDFfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMV9EMV9ZX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KE1ETUExX0QxX1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUExX0QxX1lfTU9ESUZZKCkgIGJmaW5fcmVhZDE2KE1ETUExX0QxX1lfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUExX0QxX1lfTU9ESUZZKHZhbCkgYmZpbl93cml0ZTE2KE1ETUExX0QxX1lfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BMV9EMV9DVVJSX0RFU0NfUFRSKCkgYmZpbl9yZWFkUFRSKE1ETUExX0QxX0NVUlJfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQTFfRDFfQ1VSUl9ERVNDX1BUUih2YWwpIGJmaW5fd3JpdGVQVFIoTURNQTFfRDFfQ1VSUl9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQTFfRDFfQ1VSUl9BRERSKCkgYmZpbl9yZWFkUFRSKE1ETUExX0QxX0NVUlJfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMV9EMV9DVVJSX0FERFIodmFsKSBiZmluX3dyaXRlUFRSKE1ETUExX0QxX0NVUlJfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQTFfRDFfSVJRX1NUQVRVUygpIGJmaW5fcmVhZDE2KE1ETUExX0QxX0lSUV9TVEFUVVMpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQTFfRDFfSVJRX1NUQVRVUyh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMV9EMV9JUlFfU1RBVFVTLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BMV9EMV9QRVJJUEhFUkFMX01BUCgpIGJmaW5fcmVhZDE2KE1ETUExX0QxX1BFUklQSEVSQUxfTUFQKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUExX0QxX1BFUklQSEVSQUxfTUFQKHZhbCkgYmZpbl93cml0ZTE2KE1ETUExX0QxX1BFUklQSEVSQUxfTUFQLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BMV9EMV9DVVJSX1hfQ09VTlQoKSBiZmluX3JlYWQxNihNRE1BMV9EMV9DVVJSX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQTFfRDFfQ1VSUl9YX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KE1ETUExX0QxX0NVUlJfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQTFfRDFfQ1VSUl9ZX0NPVU5UKCkgYmZpbl9yZWFkMTYoTURNQTFfRDFfQ1VSUl9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUExX0QxX0NVUlJfWV9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMV9EMV9DVVJSX1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUExX1MxX05FWFRfREVTQ19QVFIoKSBiZmluX3JlYWRQVFIoTURNQTFfUzFfTkVYVF9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMV9TMV9ORVhUX0RFU0NfUFRSKHZhbCkgYmZpbl93cml0ZVBUUihNRE1BMV9TMV9ORVhUX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BMV9TMV9TVEFSVF9BRERSKCkgYmZpbl9yZWFkUFRSKE1ETUExX1MxX1NUQVJUX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQTFfUzFfU1RBUlRfQUREUih2YWwpIGJmaW5fd3JpdGVQVFIoTURNQTFfUzFfU1RBUlRfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQTFfUzFfQ09ORklHKCkgICAgYmZpbl9yZWFkMTYoTURNQTFfUzFfQ09ORklHKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUExX1MxX0NPTkZJRyh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMV9TMV9DT05GSUcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUExX1MxX1hfQ09VTlQoKSAgIGJmaW5fcmVhZDE2KE1ETUExX1MxX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQTFfUzFfWF9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMV9TMV9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BMV9TMV9YX01PRElGWSgpICBiZmluX3JlYWQxNihNRE1BMV9TMV9YX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMV9TMV9YX01PRElGWSh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMV9TMV9YX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQTFfUzFfWV9DT1VOVCgpICAgYmZpbl9yZWFkMTYoTURNQTFfUzFfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMV9TMV9ZX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KE1ETUExX1MxX1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUExX1MxX1lfTU9ESUZZKCkgIGJmaW5fcmVhZDE2KE1ETUExX1MxX1lfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUExX1MxX1lfTU9ESUZZKHZhbCkgYmZpbl93cml0ZTE2KE1ETUExX1MxX1lfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BMV9TMV9DVVJSX0RFU0NfUFRSKCkgYmZpbl9yZWFkUFRSKE1ETUExX1MxX0NVUlJfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQTFfUzFfQ1VSUl9ERVNDX1BUUih2YWwpIGJmaW5fd3JpdGVQVFIoTURNQTFfUzFfQ1VSUl9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQTFfUzFfQ1VSUl9BRERSKCkgYmZpbl9yZWFkUFRSKE1ETUExX1MxX0NVUlJfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMV9TMV9DVVJSX0FERFIodmFsKSBiZmluX3dyaXRlUFRSKE1ETUExX1MxX0NVUlJfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQTFfUzFfSVJRX1NUQVRVUygpIGJmaW5fcmVhZDE2KE1ETUExX1MxX0lSUV9TVEFUVVMpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQTFfUzFfSVJRX1NUQVRVUyh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMV9TMV9JUlFfU1RBVFVTLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BMV9TMV9QRVJJUEhFUkFMX01BUCgpIGJmaW5fcmVhZDE2KE1ETUExX1MxX1BFUklQSEVSQUxfTUFQKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUExX1MxX1BFUklQSEVSQUxfTUFQKHZhbCkgYmZpbl93cml0ZTE2KE1ETUExX1MxX1BFUklQSEVSQUxfTUFQLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BMV9TMV9DVVJSX1hfQ09VTlQoKSBiZmluX3JlYWQxNihNRE1BMV9TMV9DVVJSX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQTFfUzFfQ1VSUl9YX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KE1ETUExX1MxX0NVUlJfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQTFfUzFfQ1VSUl9ZX0NPVU5UKCkgYmZpbl9yZWFkMTYoTURNQTFfUzFfQ1VSUl9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUExX1MxX0NVUlJfWV9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMV9TMV9DVVJSX1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BQSV9DT05UUk9MKCkgICAgICAgIGJmaW5fcmVhZDE2KFBQSV9DT05UUk9MKQorI2RlZmluZSBiZmluX3dyaXRlX1BQSV9DT05UUk9MKHZhbCkgICAgYmZpbl93cml0ZTE2KFBQSV9DT05UUk9MLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QUElfU1RBVFVTKCkgICAgICAgICBiZmluX3JlYWQxNihQUElfU1RBVFVTKQorI2RlZmluZSBiZmluX3dyaXRlX1BQSV9TVEFUVVModmFsKSAgICAgYmZpbl93cml0ZTE2KFBQSV9TVEFUVVMsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BQSV9ERUxBWSgpICAgICAgICAgIGJmaW5fcmVhZDE2KFBQSV9ERUxBWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9QUElfREVMQVkodmFsKSAgICAgIGJmaW5fd3JpdGUxNihQUElfREVMQVksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BQSV9DT1VOVCgpICAgICAgICAgIGJmaW5fcmVhZDE2KFBQSV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9QUElfQ09VTlQodmFsKSAgICAgIGJmaW5fd3JpdGUxNihQUElfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BQSV9GUkFNRSgpICAgICAgICAgIGJmaW5fcmVhZDE2KFBQSV9GUkFNRSkKKyNkZWZpbmUgYmZpbl93cml0ZV9QUElfRlJBTUUodmFsKSAgICAgIGJmaW5fd3JpdGUxNihQUElfRlJBTUUsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1RXSTBfQ0xLRElWKCkgICAgICAgIGJmaW5fcmVhZDE2KFRXSTBfQ0xLRElWKQorI2RlZmluZSBiZmluX3dyaXRlX1RXSTBfQ0xLRElWKHZhbCkgICAgYmZpbl93cml0ZTE2KFRXSTBfQ0xLRElWLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9UV0kwX0NPTlRST0woKSAgICAgICBiZmluX3JlYWQxNihUV0kwX0NPTlRST0wpCisjZGVmaW5lIGJmaW5fd3JpdGVfVFdJMF9DT05UUk9MKHZhbCkgICBiZmluX3dyaXRlMTYoVFdJMF9DT05UUk9MLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9UV0kwX1NMQVZFX0NUUkwoKSAgICBiZmluX3JlYWQxNihUV0kwX1NMQVZFX0NUUkwpCisjZGVmaW5lIGJmaW5fd3JpdGVfVFdJMF9TTEFWRV9DVFJMKHZhbCkgYmZpbl93cml0ZTE2KFRXSTBfU0xBVkVfQ1RSTCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVFdJMF9TTEFWRV9TVEFUKCkgICAgYmZpbl9yZWFkMTYoVFdJMF9TTEFWRV9TVEFUKQorI2RlZmluZSBiZmluX3dyaXRlX1RXSTBfU0xBVkVfU1RBVCh2YWwpIGJmaW5fd3JpdGUxNihUV0kwX1NMQVZFX1NUQVQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1RXSTBfU0xBVkVfQUREUigpICAgIGJmaW5fcmVhZDE2KFRXSTBfU0xBVkVfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9UV0kwX1NMQVZFX0FERFIodmFsKSBiZmluX3dyaXRlMTYoVFdJMF9TTEFWRV9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9UV0kwX01BU1RFUl9DVEwoKSAgICBiZmluX3JlYWQxNihUV0kwX01BU1RFUl9DVEwpCisjZGVmaW5lIGJmaW5fd3JpdGVfVFdJMF9NQVNURVJfQ1RMKHZhbCkgYmZpbl93cml0ZTE2KFRXSTBfTUFTVEVSX0NUTCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVFdJMF9NQVNURVJfU1RBVCgpICAgYmZpbl9yZWFkMTYoVFdJMF9NQVNURVJfU1RBVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9UV0kwX01BU1RFUl9TVEFUKHZhbCkgYmZpbl93cml0ZTE2KFRXSTBfTUFTVEVSX1NUQVQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1RXSTBfTUFTVEVSX0FERFIoKSAgIGJmaW5fcmVhZDE2KFRXSTBfTUFTVEVSX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfVFdJMF9NQVNURVJfQUREUih2YWwpIGJmaW5fd3JpdGUxNihUV0kwX01BU1RFUl9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9UV0kwX0lOVF9TVEFUKCkgICAgICBiZmluX3JlYWQxNihUV0kwX0lOVF9TVEFUKQorI2RlZmluZSBiZmluX3dyaXRlX1RXSTBfSU5UX1NUQVQodmFsKSAgYmZpbl93cml0ZTE2KFRXSTBfSU5UX1NUQVQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1RXSTBfSU5UX01BU0soKSAgICAgIGJmaW5fcmVhZDE2KFRXSTBfSU5UX01BU0spCisjZGVmaW5lIGJmaW5fd3JpdGVfVFdJMF9JTlRfTUFTSyh2YWwpICBiZmluX3dyaXRlMTYoVFdJMF9JTlRfTUFTSywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVFdJMF9GSUZPX0NUTCgpICAgICAgYmZpbl9yZWFkMTYoVFdJMF9GSUZPX0NUTCkKKyNkZWZpbmUgYmZpbl93cml0ZV9UV0kwX0ZJRk9fQ1RMKHZhbCkgIGJmaW5fd3JpdGUxNihUV0kwX0ZJRk9fQ1RMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9UV0kwX0ZJRk9fU1RBVCgpICAgICBiZmluX3JlYWQxNihUV0kwX0ZJRk9fU1RBVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9UV0kwX0ZJRk9fU1RBVCh2YWwpIGJmaW5fd3JpdGUxNihUV0kwX0ZJRk9fU1RBVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVFdJMF9YTVRfREFUQTgoKSAgICAgYmZpbl9yZWFkMTYoVFdJMF9YTVRfREFUQTgpCisjZGVmaW5lIGJmaW5fd3JpdGVfVFdJMF9YTVRfREFUQTgodmFsKSBiZmluX3dyaXRlMTYoVFdJMF9YTVRfREFUQTgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1RXSTBfWE1UX0RBVEExNigpICAgIGJmaW5fcmVhZDE2KFRXSTBfWE1UX0RBVEExNikKKyNkZWZpbmUgYmZpbl93cml0ZV9UV0kwX1hNVF9EQVRBMTYodmFsKSBiZmluX3dyaXRlMTYoVFdJMF9YTVRfREFUQTE2LCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9UV0kwX1JDVl9EQVRBOCgpICAgICBiZmluX3JlYWQxNihUV0kwX1JDVl9EQVRBOCkKKyNkZWZpbmUgYmZpbl93cml0ZV9UV0kwX1JDVl9EQVRBOCh2YWwpIGJmaW5fd3JpdGUxNihUV0kwX1JDVl9EQVRBOCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVFdJMF9SQ1ZfREFUQTE2KCkgICAgYmZpbl9yZWFkMTYoVFdJMF9SQ1ZfREFUQTE2KQorI2RlZmluZSBiZmluX3dyaXRlX1RXSTBfUkNWX0RBVEExNih2YWwpIGJmaW5fd3JpdGUxNihUV0kwX1JDVl9EQVRBMTYsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1RXSTFfQ0xLRElWKCkgICAgICAgIGJmaW5fcmVhZDE2KFRXSTFfQ0xLRElWKQorI2RlZmluZSBiZmluX3dyaXRlX1RXSTFfQ0xLRElWKHZhbCkgICAgYmZpbl93cml0ZTE2KFRXSTFfQ0xLRElWLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9UV0kxX0NPTlRST0woKSAgICAgICBiZmluX3JlYWQxNihUV0kxX0NPTlRST0wpCisjZGVmaW5lIGJmaW5fd3JpdGVfVFdJMV9DT05UUk9MKHZhbCkgICBiZmluX3dyaXRlMTYoVFdJMV9DT05UUk9MLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9UV0kxX1NMQVZFX0NUUkwoKSAgICBiZmluX3JlYWQxNihUV0kxX1NMQVZFX0NUUkwpCisjZGVmaW5lIGJmaW5fd3JpdGVfVFdJMV9TTEFWRV9DVFJMKHZhbCkgYmZpbl93cml0ZTE2KFRXSTFfU0xBVkVfQ1RSTCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVFdJMV9TTEFWRV9TVEFUKCkgICAgYmZpbl9yZWFkMTYoVFdJMV9TTEFWRV9TVEFUKQorI2RlZmluZSBiZmluX3dyaXRlX1RXSTFfU0xBVkVfU1RBVCh2YWwpIGJmaW5fd3JpdGUxNihUV0kxX1NMQVZFX1NUQVQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1RXSTFfU0xBVkVfQUREUigpICAgIGJmaW5fcmVhZDE2KFRXSTFfU0xBVkVfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9UV0kxX1NMQVZFX0FERFIodmFsKSBiZmluX3dyaXRlMTYoVFdJMV9TTEFWRV9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9UV0kxX01BU1RFUl9DVEwoKSAgICBiZmluX3JlYWQxNihUV0kxX01BU1RFUl9DVEwpCisjZGVmaW5lIGJmaW5fd3JpdGVfVFdJMV9NQVNURVJfQ1RMKHZhbCkgYmZpbl93cml0ZTE2KFRXSTFfTUFTVEVSX0NUTCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVFdJMV9NQVNURVJfU1RBVCgpICAgYmZpbl9yZWFkMTYoVFdJMV9NQVNURVJfU1RBVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9UV0kxX01BU1RFUl9TVEFUKHZhbCkgYmZpbl93cml0ZTE2KFRXSTFfTUFTVEVSX1NUQVQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1RXSTFfTUFTVEVSX0FERFIoKSAgIGJmaW5fcmVhZDE2KFRXSTFfTUFTVEVSX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfVFdJMV9NQVNURVJfQUREUih2YWwpIGJmaW5fd3JpdGUxNihUV0kxX01BU1RFUl9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9UV0kxX0lOVF9TVEFUKCkgICAgICBiZmluX3JlYWQxNihUV0kxX0lOVF9TVEFUKQorI2RlZmluZSBiZmluX3dyaXRlX1RXSTFfSU5UX1NUQVQodmFsKSAgYmZpbl93cml0ZTE2KFRXSTFfSU5UX1NUQVQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1RXSTFfSU5UX01BU0soKSAgICAgIGJmaW5fcmVhZDE2KFRXSTFfSU5UX01BU0spCisjZGVmaW5lIGJmaW5fd3JpdGVfVFdJMV9JTlRfTUFTSyh2YWwpICBiZmluX3dyaXRlMTYoVFdJMV9JTlRfTUFTSywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVFdJMV9GSUZPX0NUTCgpICAgICAgYmZpbl9yZWFkMTYoVFdJMV9GSUZPX0NUTCkKKyNkZWZpbmUgYmZpbl93cml0ZV9UV0kxX0ZJRk9fQ1RMKHZhbCkgIGJmaW5fd3JpdGUxNihUV0kxX0ZJRk9fQ1RMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9UV0kxX0ZJRk9fU1RBVCgpICAgICBiZmluX3JlYWQxNihUV0kxX0ZJRk9fU1RBVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9UV0kxX0ZJRk9fU1RBVCh2YWwpIGJmaW5fd3JpdGUxNihUV0kxX0ZJRk9fU1RBVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVFdJMV9YTVRfREFUQTgoKSAgICAgYmZpbl9yZWFkMTYoVFdJMV9YTVRfREFUQTgpCisjZGVmaW5lIGJmaW5fd3JpdGVfVFdJMV9YTVRfREFUQTgodmFsKSBiZmluX3dyaXRlMTYoVFdJMV9YTVRfREFUQTgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1RXSTFfWE1UX0RBVEExNigpICAgIGJmaW5fcmVhZDE2KFRXSTFfWE1UX0RBVEExNikKKyNkZWZpbmUgYmZpbl93cml0ZV9UV0kxX1hNVF9EQVRBMTYodmFsKSBiZmluX3dyaXRlMTYoVFdJMV9YTVRfREFUQTE2LCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9UV0kxX1JDVl9EQVRBOCgpICAgICBiZmluX3JlYWQxNihUV0kxX1JDVl9EQVRBOCkKKyNkZWZpbmUgYmZpbl93cml0ZV9UV0kxX1JDVl9EQVRBOCh2YWwpIGJmaW5fd3JpdGUxNihUV0kxX1JDVl9EQVRBOCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVFdJMV9SQ1ZfREFUQTE2KCkgICAgYmZpbl9yZWFkMTYoVFdJMV9SQ1ZfREFUQTE2KQorI2RlZmluZSBiZmluX3dyaXRlX1RXSTFfUkNWX0RBVEExNih2YWwpIGJmaW5fd3JpdGUxNihUV0kxX1JDVl9EQVRBMTYsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQzEoKSAgICAgICAgICAgIGJmaW5fcmVhZDE2KENBTl9NQzEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01DMSh2YWwpICAgICAgICBiZmluX3dyaXRlMTYoQ0FOX01DMSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01EMSgpICAgICAgICAgICAgYmZpbl9yZWFkMTYoQ0FOX01EMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUQxKHZhbCkgICAgICAgIGJmaW5fd3JpdGUxNihDQU5fTUQxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fVFJTMSgpICAgICAgICAgICBiZmluX3JlYWQxNihDQU5fVFJTMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fVFJTMSh2YWwpICAgICAgIGJmaW5fd3JpdGUxNihDQU5fVFJTMSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX1RSUjEoKSAgICAgICAgICAgYmZpbl9yZWFkMTYoQ0FOX1RSUjEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX1RSUjEodmFsKSAgICAgICBiZmluX3dyaXRlMTYoQ0FOX1RSUjEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9UQTEoKSAgICAgICAgICAgIGJmaW5fcmVhZDE2KENBTl9UQTEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX1RBMSh2YWwpICAgICAgICBiZmluX3dyaXRlMTYoQ0FOX1RBMSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX0FBMSgpICAgICAgICAgICAgYmZpbl9yZWFkMTYoQ0FOX0FBMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fQUExKHZhbCkgICAgICAgIGJmaW5fd3JpdGUxNihDQU5fQUExLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fUk1QMSgpICAgICAgICAgICBiZmluX3JlYWQxNihDQU5fUk1QMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fUk1QMSh2YWwpICAgICAgIGJmaW5fd3JpdGUxNihDQU5fUk1QMSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX1JNTDEoKSAgICAgICAgICAgYmZpbl9yZWFkMTYoQ0FOX1JNTDEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX1JNTDEodmFsKSAgICAgICBiZmluX3dyaXRlMTYoQ0FOX1JNTDEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQlRJRjEoKSAgICAgICAgIGJmaW5fcmVhZDE2KENBTl9NQlRJRjEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CVElGMSh2YWwpICAgICBiZmluX3dyaXRlMTYoQ0FOX01CVElGMSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CUklGMSgpICAgICAgICAgYmZpbl9yZWFkMTYoQ0FOX01CUklGMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUJSSUYxKHZhbCkgICAgIGJmaW5fd3JpdGUxNihDQU5fTUJSSUYxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUJJTTEoKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fTUJJTTEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CSU0xKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX01CSU0xLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fUkZIMSgpICAgICAgICAgICBiZmluX3JlYWQxNihDQU5fUkZIMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fUkZIMSh2YWwpICAgICAgIGJmaW5fd3JpdGUxNihDQU5fUkZIMSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX09QU1MxKCkgICAgICAgICAgYmZpbl9yZWFkMTYoQ0FOX09QU1MxKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9PUFNTMSh2YWwpICAgICAgYmZpbl93cml0ZTE2KENBTl9PUFNTMSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01DMigpICAgICAgICAgICAgYmZpbl9yZWFkMTYoQ0FOX01DMikKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUMyKHZhbCkgICAgICAgIGJmaW5fd3JpdGUxNihDQU5fTUMyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUQyKCkgICAgICAgICAgICBiZmluX3JlYWQxNihDQU5fTUQyKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NRDIodmFsKSAgICAgICAgYmZpbl93cml0ZTE2KENBTl9NRDIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9UUlMyKCkgICAgICAgICAgIGJmaW5fcmVhZDE2KENBTl9UUlMyKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9UUlMyKHZhbCkgICAgICAgYmZpbl93cml0ZTE2KENBTl9UUlMyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fVFJSMigpICAgICAgICAgICBiZmluX3JlYWQxNihDQU5fVFJSMikKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fVFJSMih2YWwpICAgICAgIGJmaW5fd3JpdGUxNihDQU5fVFJSMiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX1RBMigpICAgICAgICAgICAgYmZpbl9yZWFkMTYoQ0FOX1RBMikKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fVEEyKHZhbCkgICAgICAgIGJmaW5fd3JpdGUxNihDQU5fVEEyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQUEyKCkgICAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQUEyKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9BQTIodmFsKSAgICAgICAgYmZpbl93cml0ZTE2KENBTl9BQTIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9STVAyKCkgICAgICAgICAgIGJmaW5fcmVhZDE2KENBTl9STVAyKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9STVAyKHZhbCkgICAgICAgYmZpbl93cml0ZTE2KENBTl9STVAyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fUk1MMigpICAgICAgICAgICBiZmluX3JlYWQxNihDQU5fUk1MMikKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fUk1MMih2YWwpICAgICAgIGJmaW5fd3JpdGUxNihDQU5fUk1MMiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CVElGMigpICAgICAgICAgYmZpbl9yZWFkMTYoQ0FOX01CVElGMikKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUJUSUYyKHZhbCkgICAgIGJmaW5fd3JpdGUxNihDQU5fTUJUSUYyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUJSSUYyKCkgICAgICAgICBiZmluX3JlYWQxNihDQU5fTUJSSUYyKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQlJJRjIodmFsKSAgICAgYmZpbl93cml0ZTE2KENBTl9NQlJJRjIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQklNMigpICAgICAgICAgIGJmaW5fcmVhZDE2KENBTl9NQklNMikKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUJJTTIodmFsKSAgICAgIGJmaW5fd3JpdGUxNihDQU5fTUJJTTIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9SRkgyKCkgICAgICAgICAgIGJmaW5fcmVhZDE2KENBTl9SRkgyKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9SRkgyKHZhbCkgICAgICAgYmZpbl93cml0ZTE2KENBTl9SRkgyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fT1BTUzIoKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fT1BTUzIpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX09QU1MyKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX09QU1MyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQ0xPQ0soKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQ0xPQ0spCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0NMT0NLKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0NMT0NLLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fVElNSU5HKCkgICAgICAgICBiZmluX3JlYWQxNihDQU5fVElNSU5HKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9USU1JTkcodmFsKSAgICAgYmZpbl93cml0ZTE2KENBTl9USU1JTkcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9ERUJVRygpICAgICAgICAgIGJmaW5fcmVhZDE2KENBTl9ERUJVRykKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fREVCVUcodmFsKSAgICAgIGJmaW5fd3JpdGUxNihDQU5fREVCVUcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9TVEFUVVMoKSAgICAgICAgIGJmaW5fcmVhZDE2KENBTl9TVEFUVVMpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX1NUQVRVUyh2YWwpICAgICBiZmluX3dyaXRlMTYoQ0FOX1NUQVRVUywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX0NFQygpICAgICAgICAgICAgYmZpbl9yZWFkMTYoQ0FOX0NFQykKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fQ0VDKHZhbCkgICAgICAgIGJmaW5fd3JpdGUxNihDQU5fQ0VDLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fR0lTKCkgICAgICAgICAgICBiZmluX3JlYWQxNihDQU5fR0lTKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9HSVModmFsKSAgICAgICAgYmZpbl93cml0ZTE2KENBTl9HSVMsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9HSU0oKSAgICAgICAgICAgIGJmaW5fcmVhZDE2KENBTl9HSU0pCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0dJTSh2YWwpICAgICAgICBiZmluX3dyaXRlMTYoQ0FOX0dJTSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX0dJRigpICAgICAgICAgICAgYmZpbl9yZWFkMTYoQ0FOX0dJRikKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fR0lGKHZhbCkgICAgICAgIGJmaW5fd3JpdGUxNihDQU5fR0lGLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQ09OVFJPTCgpICAgICAgICBiZmluX3JlYWQxNihDQU5fQ09OVFJPTCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fQ09OVFJPTCh2YWwpICAgIGJmaW5fd3JpdGUxNihDQU5fQ09OVFJPTCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX0lOVFIoKSAgICAgICAgICAgYmZpbl9yZWFkMTYoQ0FOX0lOVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0lOVFIodmFsKSAgICAgICBiZmluX3dyaXRlMTYoQ0FOX0lOVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9WRVJTSU9OKCkgICAgICAgIGJmaW5fcmVhZDE2KENBTl9WRVJTSU9OKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9WRVJTSU9OKHZhbCkgICAgYmZpbl93cml0ZTE2KENBTl9WRVJTSU9OLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUJURCgpICAgICAgICAgICBiZmluX3JlYWQxNihDQU5fTUJURCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUJURCh2YWwpICAgICAgIGJmaW5fd3JpdGUxNihDQU5fTUJURCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX0VXUigpICAgICAgICAgICAgYmZpbl9yZWFkMTYoQ0FOX0VXUikKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fRVdSKHZhbCkgICAgICAgIGJmaW5fd3JpdGUxNihDQU5fRVdSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fRVNSKCkgICAgICAgICAgICBiZmluX3JlYWQxNihDQU5fRVNSKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9FU1IodmFsKSAgICAgICAgYmZpbl93cml0ZTE2KENBTl9FU1IsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9VQ1JFRygpICAgICAgICAgIGJmaW5fcmVhZDE2KENBTl9VQ1JFRykKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fVUNSRUcodmFsKSAgICAgIGJmaW5fd3JpdGUxNihDQU5fVUNSRUcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9VQ0NOVCgpICAgICAgICAgIGJmaW5fcmVhZDE2KENBTl9VQ0NOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fVUNDTlQodmFsKSAgICAgIGJmaW5fd3JpdGUxNihDQU5fVUNDTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9VQ1JDKCkgICAgICAgICAgIGJmaW5fcmVhZDE2KENBTl9VQ1JDKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9VQ1JDKHZhbCkgICAgICAgYmZpbl93cml0ZTE2KENBTl9VQ1JDLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fVUNDTkYoKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fVUNDTkYpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX1VDQ05GKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX1VDQ05GLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fVkVSU0lPTjIoKSAgICAgICBiZmluX3JlYWQxNihDQU5fVkVSU0lPTjIpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX1ZFUlNJT04yKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX1ZFUlNJT04yLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQU0wMEwoKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQU0wMEwpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0FNMDBMKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0FNMDBMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQU0wMEgoKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQU0wMEgpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0FNMDBIKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0FNMDBILCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQU0wMUwoKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQU0wMUwpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0FNMDFMKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0FNMDFMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQU0wMUgoKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQU0wMUgpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0FNMDFIKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0FNMDFILCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQU0wMkwoKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQU0wMkwpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0FNMDJMKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0FNMDJMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQU0wMkgoKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQU0wMkgpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0FNMDJIKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0FNMDJILCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQU0wM0woKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQU0wM0wpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0FNMDNMKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0FNMDNMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQU0wM0goKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQU0wM0gpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0FNMDNIKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0FNMDNILCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQU0wNEwoKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQU0wNEwpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0FNMDRMKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0FNMDRMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQU0wNEgoKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQU0wNEgpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0FNMDRIKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0FNMDRILCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQU0wNUwoKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQU0wNUwpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0FNMDVMKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0FNMDVMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQU0wNUgoKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQU0wNUgpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0FNMDVIKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0FNMDVILCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQU0wNkwoKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQU0wNkwpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0FNMDZMKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0FNMDZMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQU0wNkgoKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQU0wNkgpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0FNMDZIKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0FNMDZILCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQU0wN0woKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQU0wN0wpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0FNMDdMKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0FNMDdMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQU0wN0goKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQU0wN0gpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0FNMDdIKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0FNMDdILCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQU0wOEwoKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQU0wOEwpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0FNMDhMKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0FNMDhMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQU0wOEgoKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQU0wOEgpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0FNMDhIKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0FNMDhILCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQU0wOUwoKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQU0wOUwpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0FNMDlMKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0FNMDlMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQU0wOUgoKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQU0wOUgpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0FNMDlIKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0FNMDlILCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQU0xMEwoKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQU0xMEwpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0FNMTBMKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0FNMTBMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQU0xMEgoKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQU0xMEgpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0FNMTBIKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0FNMTBILCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQU0xMUwoKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQU0xMUwpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0FNMTFMKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0FNMTFMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQU0xMUgoKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQU0xMUgpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0FNMTFIKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0FNMTFILCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQU0xMkwoKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQU0xMkwpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0FNMTJMKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0FNMTJMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQU0xMkgoKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQU0xMkgpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0FNMTJIKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0FNMTJILCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQU0xM0woKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQU0xM0wpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0FNMTNMKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0FNMTNMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQU0xM0goKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQU0xM0gpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0FNMTNIKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0FNMTNILCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQU0xNEwoKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQU0xNEwpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0FNMTRMKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0FNMTRMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQU0xNEgoKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQU0xNEgpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0FNMTRIKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0FNMTRILCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQU0xNUwoKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQU0xNUwpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0FNMTVMKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0FNMTVMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQU0xNUgoKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQU0xNUgpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0FNMTVIKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0FNMTVILCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQU0xNkwoKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQU0xNkwpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0FNMTZMKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0FNMTZMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQU0xNkgoKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQU0xNkgpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0FNMTZIKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0FNMTZILCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQU0xN0woKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQU0xN0wpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0FNMTdMKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0FNMTdMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQU0xN0goKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQU0xN0gpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0FNMTdIKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0FNMTdILCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQU0xOEwoKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQU0xOEwpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0FNMThMKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0FNMThMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQU0xOEgoKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQU0xOEgpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0FNMThIKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0FNMThILCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQU0xOUwoKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQU0xOUwpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0FNMTlMKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0FNMTlMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQU0xOUgoKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQU0xOUgpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0FNMTlIKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0FNMTlILCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQU0yMEwoKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQU0yMEwpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0FNMjBMKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0FNMjBMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQU0yMEgoKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQU0yMEgpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0FNMjBIKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0FNMjBILCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQU0yMUwoKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQU0yMUwpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0FNMjFMKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0FNMjFMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQU0yMUgoKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQU0yMUgpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0FNMjFIKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0FNMjFILCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQU0yMkwoKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQU0yMkwpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0FNMjJMKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0FNMjJMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQU0yMkgoKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQU0yMkgpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0FNMjJIKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0FNMjJILCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQU0yM0woKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQU0yM0wpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0FNMjNMKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0FNMjNMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQU0yM0goKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQU0yM0gpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0FNMjNIKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0FNMjNILCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQU0yNEwoKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQU0yNEwpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0FNMjRMKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0FNMjRMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQU0yNEgoKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQU0yNEgpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0FNMjRIKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0FNMjRILCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQU0yNUwoKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQU0yNUwpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0FNMjVMKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0FNMjVMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQU0yNUgoKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQU0yNUgpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0FNMjVIKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0FNMjVILCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQU0yNkwoKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQU0yNkwpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0FNMjZMKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0FNMjZMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQU0yNkgoKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQU0yNkgpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0FNMjZIKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0FNMjZILCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQU0yN0woKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQU0yN0wpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0FNMjdMKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0FNMjdMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQU0yN0goKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQU0yN0gpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0FNMjdIKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0FNMjdILCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQU0yOEwoKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQU0yOEwpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0FNMjhMKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0FNMjhMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQU0yOEgoKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQU0yOEgpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0FNMjhIKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0FNMjhILCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQU0yOUwoKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQU0yOUwpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0FNMjlMKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0FNMjlMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQU0yOUgoKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQU0yOUgpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0FNMjlIKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0FNMjlILCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQU0zMEwoKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQU0zMEwpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0FNMzBMKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0FNMzBMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQU0zMEgoKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQU0zMEgpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0FNMzBIKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0FNMzBILCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQU0zMUwoKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQU0zMUwpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0FNMzFMKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0FNMzFMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQU0zMUgoKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQU0zMUgpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0FNMzFIKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0FNMzFILCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIwMF9EQVRBMCgpICAgICBiZmluX3JlYWQxNihDQU5fTUIwMF9EQVRBMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIwMF9EQVRBMCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIwMF9EQVRBMCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMDBfREFUQTEoKSAgICAgYmZpbl9yZWFkMTYoQ0FOX01CMDBfREFUQTEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMDBfREFUQTEodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMDBfREFUQTEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjAwX0RBVEEyKCkgICAgIGJmaW5fcmVhZDE2KENBTl9NQjAwX0RBVEEyKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjAwX0RBVEEyKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjAwX0RBVEEyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIwMF9EQVRBMygpICAgICBiZmluX3JlYWQxNihDQU5fTUIwMF9EQVRBMykKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIwMF9EQVRBMyh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIwMF9EQVRBMywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMDBfTEVOR1RIKCkgICAgYmZpbl9yZWFkMTYoQ0FOX01CMDBfTEVOR1RIKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjAwX0xFTkdUSCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIwMF9MRU5HVEgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjAwX1RJTUVTVEFNUCgpIGJmaW5fcmVhZDE2KENBTl9NQjAwX1RJTUVTVEFNUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIwMF9USU1FU1RBTVAodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMDBfVElNRVNUQU1QLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIwMF9JRDAoKSAgICAgICBiZmluX3JlYWQxNihDQU5fTUIwMF9JRDApCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMDBfSUQwKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX01CMDBfSUQwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIwMF9JRDEoKSAgICAgICBiZmluX3JlYWQxNihDQU5fTUIwMF9JRDEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMDBfSUQxKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX01CMDBfSUQxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIwMV9EQVRBMCgpICAgICBiZmluX3JlYWQxNihDQU5fTUIwMV9EQVRBMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIwMV9EQVRBMCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIwMV9EQVRBMCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMDFfREFUQTEoKSAgICAgYmZpbl9yZWFkMTYoQ0FOX01CMDFfREFUQTEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMDFfREFUQTEodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMDFfREFUQTEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjAxX0RBVEEyKCkgICAgIGJmaW5fcmVhZDE2KENBTl9NQjAxX0RBVEEyKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjAxX0RBVEEyKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjAxX0RBVEEyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIwMV9EQVRBMygpICAgICBiZmluX3JlYWQxNihDQU5fTUIwMV9EQVRBMykKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIwMV9EQVRBMyh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIwMV9EQVRBMywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMDFfTEVOR1RIKCkgICAgYmZpbl9yZWFkMTYoQ0FOX01CMDFfTEVOR1RIKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjAxX0xFTkdUSCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIwMV9MRU5HVEgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjAxX1RJTUVTVEFNUCgpIGJmaW5fcmVhZDE2KENBTl9NQjAxX1RJTUVTVEFNUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIwMV9USU1FU1RBTVAodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMDFfVElNRVNUQU1QLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIwMV9JRDAoKSAgICAgICBiZmluX3JlYWQxNihDQU5fTUIwMV9JRDApCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMDFfSUQwKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX01CMDFfSUQwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIwMV9JRDEoKSAgICAgICBiZmluX3JlYWQxNihDQU5fTUIwMV9JRDEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMDFfSUQxKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX01CMDFfSUQxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIwMl9EQVRBMCgpICAgICBiZmluX3JlYWQxNihDQU5fTUIwMl9EQVRBMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIwMl9EQVRBMCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIwMl9EQVRBMCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMDJfREFUQTEoKSAgICAgYmZpbl9yZWFkMTYoQ0FOX01CMDJfREFUQTEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMDJfREFUQTEodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMDJfREFUQTEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjAyX0RBVEEyKCkgICAgIGJmaW5fcmVhZDE2KENBTl9NQjAyX0RBVEEyKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjAyX0RBVEEyKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjAyX0RBVEEyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIwMl9EQVRBMygpICAgICBiZmluX3JlYWQxNihDQU5fTUIwMl9EQVRBMykKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIwMl9EQVRBMyh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIwMl9EQVRBMywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMDJfTEVOR1RIKCkgICAgYmZpbl9yZWFkMTYoQ0FOX01CMDJfTEVOR1RIKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjAyX0xFTkdUSCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIwMl9MRU5HVEgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjAyX1RJTUVTVEFNUCgpIGJmaW5fcmVhZDE2KENBTl9NQjAyX1RJTUVTVEFNUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIwMl9USU1FU1RBTVAodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMDJfVElNRVNUQU1QLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIwMl9JRDAoKSAgICAgICBiZmluX3JlYWQxNihDQU5fTUIwMl9JRDApCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMDJfSUQwKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX01CMDJfSUQwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIwMl9JRDEoKSAgICAgICBiZmluX3JlYWQxNihDQU5fTUIwMl9JRDEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMDJfSUQxKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX01CMDJfSUQxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIwM19EQVRBMCgpICAgICBiZmluX3JlYWQxNihDQU5fTUIwM19EQVRBMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIwM19EQVRBMCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIwM19EQVRBMCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMDNfREFUQTEoKSAgICAgYmZpbl9yZWFkMTYoQ0FOX01CMDNfREFUQTEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMDNfREFUQTEodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMDNfREFUQTEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjAzX0RBVEEyKCkgICAgIGJmaW5fcmVhZDE2KENBTl9NQjAzX0RBVEEyKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjAzX0RBVEEyKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjAzX0RBVEEyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIwM19EQVRBMygpICAgICBiZmluX3JlYWQxNihDQU5fTUIwM19EQVRBMykKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIwM19EQVRBMyh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIwM19EQVRBMywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMDNfTEVOR1RIKCkgICAgYmZpbl9yZWFkMTYoQ0FOX01CMDNfTEVOR1RIKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjAzX0xFTkdUSCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIwM19MRU5HVEgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjAzX1RJTUVTVEFNUCgpIGJmaW5fcmVhZDE2KENBTl9NQjAzX1RJTUVTVEFNUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIwM19USU1FU1RBTVAodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMDNfVElNRVNUQU1QLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIwM19JRDAoKSAgICAgICBiZmluX3JlYWQxNihDQU5fTUIwM19JRDApCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMDNfSUQwKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX01CMDNfSUQwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIwM19JRDEoKSAgICAgICBiZmluX3JlYWQxNihDQU5fTUIwM19JRDEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMDNfSUQxKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX01CMDNfSUQxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIwNF9EQVRBMCgpICAgICBiZmluX3JlYWQxNihDQU5fTUIwNF9EQVRBMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIwNF9EQVRBMCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIwNF9EQVRBMCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMDRfREFUQTEoKSAgICAgYmZpbl9yZWFkMTYoQ0FOX01CMDRfREFUQTEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMDRfREFUQTEodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMDRfREFUQTEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjA0X0RBVEEyKCkgICAgIGJmaW5fcmVhZDE2KENBTl9NQjA0X0RBVEEyKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjA0X0RBVEEyKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjA0X0RBVEEyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIwNF9EQVRBMygpICAgICBiZmluX3JlYWQxNihDQU5fTUIwNF9EQVRBMykKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIwNF9EQVRBMyh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIwNF9EQVRBMywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMDRfTEVOR1RIKCkgICAgYmZpbl9yZWFkMTYoQ0FOX01CMDRfTEVOR1RIKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjA0X0xFTkdUSCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIwNF9MRU5HVEgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjA0X1RJTUVTVEFNUCgpIGJmaW5fcmVhZDE2KENBTl9NQjA0X1RJTUVTVEFNUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIwNF9USU1FU1RBTVAodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMDRfVElNRVNUQU1QLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIwNF9JRDAoKSAgICAgICBiZmluX3JlYWQxNihDQU5fTUIwNF9JRDApCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMDRfSUQwKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX01CMDRfSUQwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIwNF9JRDEoKSAgICAgICBiZmluX3JlYWQxNihDQU5fTUIwNF9JRDEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMDRfSUQxKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX01CMDRfSUQxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIwNV9EQVRBMCgpICAgICBiZmluX3JlYWQxNihDQU5fTUIwNV9EQVRBMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIwNV9EQVRBMCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIwNV9EQVRBMCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMDVfREFUQTEoKSAgICAgYmZpbl9yZWFkMTYoQ0FOX01CMDVfREFUQTEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMDVfREFUQTEodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMDVfREFUQTEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjA1X0RBVEEyKCkgICAgIGJmaW5fcmVhZDE2KENBTl9NQjA1X0RBVEEyKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjA1X0RBVEEyKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjA1X0RBVEEyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIwNV9EQVRBMygpICAgICBiZmluX3JlYWQxNihDQU5fTUIwNV9EQVRBMykKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIwNV9EQVRBMyh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIwNV9EQVRBMywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMDVfTEVOR1RIKCkgICAgYmZpbl9yZWFkMTYoQ0FOX01CMDVfTEVOR1RIKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjA1X0xFTkdUSCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIwNV9MRU5HVEgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjA1X1RJTUVTVEFNUCgpIGJmaW5fcmVhZDE2KENBTl9NQjA1X1RJTUVTVEFNUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIwNV9USU1FU1RBTVAodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMDVfVElNRVNUQU1QLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIwNV9JRDAoKSAgICAgICBiZmluX3JlYWQxNihDQU5fTUIwNV9JRDApCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMDVfSUQwKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX01CMDVfSUQwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIwNV9JRDEoKSAgICAgICBiZmluX3JlYWQxNihDQU5fTUIwNV9JRDEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMDVfSUQxKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX01CMDVfSUQxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIwNl9EQVRBMCgpICAgICBiZmluX3JlYWQxNihDQU5fTUIwNl9EQVRBMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIwNl9EQVRBMCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIwNl9EQVRBMCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMDZfREFUQTEoKSAgICAgYmZpbl9yZWFkMTYoQ0FOX01CMDZfREFUQTEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMDZfREFUQTEodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMDZfREFUQTEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjA2X0RBVEEyKCkgICAgIGJmaW5fcmVhZDE2KENBTl9NQjA2X0RBVEEyKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjA2X0RBVEEyKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjA2X0RBVEEyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIwNl9EQVRBMygpICAgICBiZmluX3JlYWQxNihDQU5fTUIwNl9EQVRBMykKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIwNl9EQVRBMyh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIwNl9EQVRBMywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMDZfTEVOR1RIKCkgICAgYmZpbl9yZWFkMTYoQ0FOX01CMDZfTEVOR1RIKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjA2X0xFTkdUSCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIwNl9MRU5HVEgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjA2X1RJTUVTVEFNUCgpIGJmaW5fcmVhZDE2KENBTl9NQjA2X1RJTUVTVEFNUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIwNl9USU1FU1RBTVAodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMDZfVElNRVNUQU1QLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIwNl9JRDAoKSAgICAgICBiZmluX3JlYWQxNihDQU5fTUIwNl9JRDApCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMDZfSUQwKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX01CMDZfSUQwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIwNl9JRDEoKSAgICAgICBiZmluX3JlYWQxNihDQU5fTUIwNl9JRDEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMDZfSUQxKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX01CMDZfSUQxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIwN19EQVRBMCgpICAgICBiZmluX3JlYWQxNihDQU5fTUIwN19EQVRBMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIwN19EQVRBMCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIwN19EQVRBMCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMDdfREFUQTEoKSAgICAgYmZpbl9yZWFkMTYoQ0FOX01CMDdfREFUQTEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMDdfREFUQTEodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMDdfREFUQTEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjA3X0RBVEEyKCkgICAgIGJmaW5fcmVhZDE2KENBTl9NQjA3X0RBVEEyKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjA3X0RBVEEyKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjA3X0RBVEEyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIwN19EQVRBMygpICAgICBiZmluX3JlYWQxNihDQU5fTUIwN19EQVRBMykKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIwN19EQVRBMyh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIwN19EQVRBMywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMDdfTEVOR1RIKCkgICAgYmZpbl9yZWFkMTYoQ0FOX01CMDdfTEVOR1RIKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjA3X0xFTkdUSCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIwN19MRU5HVEgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjA3X1RJTUVTVEFNUCgpIGJmaW5fcmVhZDE2KENBTl9NQjA3X1RJTUVTVEFNUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIwN19USU1FU1RBTVAodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMDdfVElNRVNUQU1QLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIwN19JRDAoKSAgICAgICBiZmluX3JlYWQxNihDQU5fTUIwN19JRDApCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMDdfSUQwKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX01CMDdfSUQwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIwN19JRDEoKSAgICAgICBiZmluX3JlYWQxNihDQU5fTUIwN19JRDEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMDdfSUQxKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX01CMDdfSUQxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIwOF9EQVRBMCgpICAgICBiZmluX3JlYWQxNihDQU5fTUIwOF9EQVRBMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIwOF9EQVRBMCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIwOF9EQVRBMCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMDhfREFUQTEoKSAgICAgYmZpbl9yZWFkMTYoQ0FOX01CMDhfREFUQTEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMDhfREFUQTEodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMDhfREFUQTEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjA4X0RBVEEyKCkgICAgIGJmaW5fcmVhZDE2KENBTl9NQjA4X0RBVEEyKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjA4X0RBVEEyKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjA4X0RBVEEyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIwOF9EQVRBMygpICAgICBiZmluX3JlYWQxNihDQU5fTUIwOF9EQVRBMykKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIwOF9EQVRBMyh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIwOF9EQVRBMywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMDhfTEVOR1RIKCkgICAgYmZpbl9yZWFkMTYoQ0FOX01CMDhfTEVOR1RIKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjA4X0xFTkdUSCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIwOF9MRU5HVEgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjA4X1RJTUVTVEFNUCgpIGJmaW5fcmVhZDE2KENBTl9NQjA4X1RJTUVTVEFNUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIwOF9USU1FU1RBTVAodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMDhfVElNRVNUQU1QLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIwOF9JRDAoKSAgICAgICBiZmluX3JlYWQxNihDQU5fTUIwOF9JRDApCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMDhfSUQwKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX01CMDhfSUQwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIwOF9JRDEoKSAgICAgICBiZmluX3JlYWQxNihDQU5fTUIwOF9JRDEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMDhfSUQxKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX01CMDhfSUQxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIwOV9EQVRBMCgpICAgICBiZmluX3JlYWQxNihDQU5fTUIwOV9EQVRBMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIwOV9EQVRBMCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIwOV9EQVRBMCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMDlfREFUQTEoKSAgICAgYmZpbl9yZWFkMTYoQ0FOX01CMDlfREFUQTEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMDlfREFUQTEodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMDlfREFUQTEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjA5X0RBVEEyKCkgICAgIGJmaW5fcmVhZDE2KENBTl9NQjA5X0RBVEEyKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjA5X0RBVEEyKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjA5X0RBVEEyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIwOV9EQVRBMygpICAgICBiZmluX3JlYWQxNihDQU5fTUIwOV9EQVRBMykKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIwOV9EQVRBMyh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIwOV9EQVRBMywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMDlfTEVOR1RIKCkgICAgYmZpbl9yZWFkMTYoQ0FOX01CMDlfTEVOR1RIKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjA5X0xFTkdUSCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIwOV9MRU5HVEgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjA5X1RJTUVTVEFNUCgpIGJmaW5fcmVhZDE2KENBTl9NQjA5X1RJTUVTVEFNUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIwOV9USU1FU1RBTVAodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMDlfVElNRVNUQU1QLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIwOV9JRDAoKSAgICAgICBiZmluX3JlYWQxNihDQU5fTUIwOV9JRDApCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMDlfSUQwKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX01CMDlfSUQwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIwOV9JRDEoKSAgICAgICBiZmluX3JlYWQxNihDQU5fTUIwOV9JRDEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMDlfSUQxKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX01CMDlfSUQxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIxMF9EQVRBMCgpICAgICBiZmluX3JlYWQxNihDQU5fTUIxMF9EQVRBMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIxMF9EQVRBMCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIxMF9EQVRBMCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMTBfREFUQTEoKSAgICAgYmZpbl9yZWFkMTYoQ0FOX01CMTBfREFUQTEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMTBfREFUQTEodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMTBfREFUQTEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjEwX0RBVEEyKCkgICAgIGJmaW5fcmVhZDE2KENBTl9NQjEwX0RBVEEyKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjEwX0RBVEEyKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjEwX0RBVEEyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIxMF9EQVRBMygpICAgICBiZmluX3JlYWQxNihDQU5fTUIxMF9EQVRBMykKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIxMF9EQVRBMyh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIxMF9EQVRBMywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMTBfTEVOR1RIKCkgICAgYmZpbl9yZWFkMTYoQ0FOX01CMTBfTEVOR1RIKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjEwX0xFTkdUSCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIxMF9MRU5HVEgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjEwX1RJTUVTVEFNUCgpIGJmaW5fcmVhZDE2KENBTl9NQjEwX1RJTUVTVEFNUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIxMF9USU1FU1RBTVAodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMTBfVElNRVNUQU1QLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIxMF9JRDAoKSAgICAgICBiZmluX3JlYWQxNihDQU5fTUIxMF9JRDApCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMTBfSUQwKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX01CMTBfSUQwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIxMF9JRDEoKSAgICAgICBiZmluX3JlYWQxNihDQU5fTUIxMF9JRDEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMTBfSUQxKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX01CMTBfSUQxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIxMV9EQVRBMCgpICAgICBiZmluX3JlYWQxNihDQU5fTUIxMV9EQVRBMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIxMV9EQVRBMCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIxMV9EQVRBMCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMTFfREFUQTEoKSAgICAgYmZpbl9yZWFkMTYoQ0FOX01CMTFfREFUQTEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMTFfREFUQTEodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMTFfREFUQTEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjExX0RBVEEyKCkgICAgIGJmaW5fcmVhZDE2KENBTl9NQjExX0RBVEEyKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjExX0RBVEEyKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjExX0RBVEEyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIxMV9EQVRBMygpICAgICBiZmluX3JlYWQxNihDQU5fTUIxMV9EQVRBMykKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIxMV9EQVRBMyh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIxMV9EQVRBMywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMTFfTEVOR1RIKCkgICAgYmZpbl9yZWFkMTYoQ0FOX01CMTFfTEVOR1RIKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjExX0xFTkdUSCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIxMV9MRU5HVEgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjExX1RJTUVTVEFNUCgpIGJmaW5fcmVhZDE2KENBTl9NQjExX1RJTUVTVEFNUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIxMV9USU1FU1RBTVAodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMTFfVElNRVNUQU1QLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIxMV9JRDAoKSAgICAgICBiZmluX3JlYWQxNihDQU5fTUIxMV9JRDApCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMTFfSUQwKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX01CMTFfSUQwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIxMV9JRDEoKSAgICAgICBiZmluX3JlYWQxNihDQU5fTUIxMV9JRDEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMTFfSUQxKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX01CMTFfSUQxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIxMl9EQVRBMCgpICAgICBiZmluX3JlYWQxNihDQU5fTUIxMl9EQVRBMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIxMl9EQVRBMCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIxMl9EQVRBMCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMTJfREFUQTEoKSAgICAgYmZpbl9yZWFkMTYoQ0FOX01CMTJfREFUQTEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMTJfREFUQTEodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMTJfREFUQTEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjEyX0RBVEEyKCkgICAgIGJmaW5fcmVhZDE2KENBTl9NQjEyX0RBVEEyKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjEyX0RBVEEyKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjEyX0RBVEEyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIxMl9EQVRBMygpICAgICBiZmluX3JlYWQxNihDQU5fTUIxMl9EQVRBMykKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIxMl9EQVRBMyh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIxMl9EQVRBMywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMTJfTEVOR1RIKCkgICAgYmZpbl9yZWFkMTYoQ0FOX01CMTJfTEVOR1RIKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjEyX0xFTkdUSCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIxMl9MRU5HVEgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjEyX1RJTUVTVEFNUCgpIGJmaW5fcmVhZDE2KENBTl9NQjEyX1RJTUVTVEFNUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIxMl9USU1FU1RBTVAodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMTJfVElNRVNUQU1QLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIxMl9JRDAoKSAgICAgICBiZmluX3JlYWQxNihDQU5fTUIxMl9JRDApCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMTJfSUQwKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX01CMTJfSUQwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIxMl9JRDEoKSAgICAgICBiZmluX3JlYWQxNihDQU5fTUIxMl9JRDEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMTJfSUQxKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX01CMTJfSUQxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIxM19EQVRBMCgpICAgICBiZmluX3JlYWQxNihDQU5fTUIxM19EQVRBMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIxM19EQVRBMCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIxM19EQVRBMCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMTNfREFUQTEoKSAgICAgYmZpbl9yZWFkMTYoQ0FOX01CMTNfREFUQTEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMTNfREFUQTEodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMTNfREFUQTEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjEzX0RBVEEyKCkgICAgIGJmaW5fcmVhZDE2KENBTl9NQjEzX0RBVEEyKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjEzX0RBVEEyKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjEzX0RBVEEyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIxM19EQVRBMygpICAgICBiZmluX3JlYWQxNihDQU5fTUIxM19EQVRBMykKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIxM19EQVRBMyh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIxM19EQVRBMywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMTNfTEVOR1RIKCkgICAgYmZpbl9yZWFkMTYoQ0FOX01CMTNfTEVOR1RIKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjEzX0xFTkdUSCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIxM19MRU5HVEgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjEzX1RJTUVTVEFNUCgpIGJmaW5fcmVhZDE2KENBTl9NQjEzX1RJTUVTVEFNUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIxM19USU1FU1RBTVAodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMTNfVElNRVNUQU1QLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIxM19JRDAoKSAgICAgICBiZmluX3JlYWQxNihDQU5fTUIxM19JRDApCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMTNfSUQwKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX01CMTNfSUQwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIxM19JRDEoKSAgICAgICBiZmluX3JlYWQxNihDQU5fTUIxM19JRDEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMTNfSUQxKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX01CMTNfSUQxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIxNF9EQVRBMCgpICAgICBiZmluX3JlYWQxNihDQU5fTUIxNF9EQVRBMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIxNF9EQVRBMCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIxNF9EQVRBMCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMTRfREFUQTEoKSAgICAgYmZpbl9yZWFkMTYoQ0FOX01CMTRfREFUQTEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMTRfREFUQTEodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMTRfREFUQTEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjE0X0RBVEEyKCkgICAgIGJmaW5fcmVhZDE2KENBTl9NQjE0X0RBVEEyKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjE0X0RBVEEyKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjE0X0RBVEEyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIxNF9EQVRBMygpICAgICBiZmluX3JlYWQxNihDQU5fTUIxNF9EQVRBMykKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIxNF9EQVRBMyh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIxNF9EQVRBMywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMTRfTEVOR1RIKCkgICAgYmZpbl9yZWFkMTYoQ0FOX01CMTRfTEVOR1RIKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjE0X0xFTkdUSCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIxNF9MRU5HVEgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjE0X1RJTUVTVEFNUCgpIGJmaW5fcmVhZDE2KENBTl9NQjE0X1RJTUVTVEFNUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIxNF9USU1FU1RBTVAodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMTRfVElNRVNUQU1QLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIxNF9JRDAoKSAgICAgICBiZmluX3JlYWQxNihDQU5fTUIxNF9JRDApCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMTRfSUQwKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX01CMTRfSUQwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIxNF9JRDEoKSAgICAgICBiZmluX3JlYWQxNihDQU5fTUIxNF9JRDEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMTRfSUQxKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX01CMTRfSUQxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIxNV9EQVRBMCgpICAgICBiZmluX3JlYWQxNihDQU5fTUIxNV9EQVRBMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIxNV9EQVRBMCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIxNV9EQVRBMCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMTVfREFUQTEoKSAgICAgYmZpbl9yZWFkMTYoQ0FOX01CMTVfREFUQTEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMTVfREFUQTEodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMTVfREFUQTEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjE1X0RBVEEyKCkgICAgIGJmaW5fcmVhZDE2KENBTl9NQjE1X0RBVEEyKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjE1X0RBVEEyKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjE1X0RBVEEyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIxNV9EQVRBMygpICAgICBiZmluX3JlYWQxNihDQU5fTUIxNV9EQVRBMykKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIxNV9EQVRBMyh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIxNV9EQVRBMywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMTVfTEVOR1RIKCkgICAgYmZpbl9yZWFkMTYoQ0FOX01CMTVfTEVOR1RIKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjE1X0xFTkdUSCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIxNV9MRU5HVEgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjE1X1RJTUVTVEFNUCgpIGJmaW5fcmVhZDE2KENBTl9NQjE1X1RJTUVTVEFNUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIxNV9USU1FU1RBTVAodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMTVfVElNRVNUQU1QLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIxNV9JRDAoKSAgICAgICBiZmluX3JlYWQxNihDQU5fTUIxNV9JRDApCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMTVfSUQwKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX01CMTVfSUQwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIxNV9JRDEoKSAgICAgICBiZmluX3JlYWQxNihDQU5fTUIxNV9JRDEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMTVfSUQxKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX01CMTVfSUQxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIxNl9EQVRBMCgpICAgICBiZmluX3JlYWQxNihDQU5fTUIxNl9EQVRBMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIxNl9EQVRBMCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIxNl9EQVRBMCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMTZfREFUQTEoKSAgICAgYmZpbl9yZWFkMTYoQ0FOX01CMTZfREFUQTEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMTZfREFUQTEodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMTZfREFUQTEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjE2X0RBVEEyKCkgICAgIGJmaW5fcmVhZDE2KENBTl9NQjE2X0RBVEEyKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjE2X0RBVEEyKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjE2X0RBVEEyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIxNl9EQVRBMygpICAgICBiZmluX3JlYWQxNihDQU5fTUIxNl9EQVRBMykKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIxNl9EQVRBMyh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIxNl9EQVRBMywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMTZfTEVOR1RIKCkgICAgYmZpbl9yZWFkMTYoQ0FOX01CMTZfTEVOR1RIKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjE2X0xFTkdUSCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIxNl9MRU5HVEgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjE2X1RJTUVTVEFNUCgpIGJmaW5fcmVhZDE2KENBTl9NQjE2X1RJTUVTVEFNUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIxNl9USU1FU1RBTVAodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMTZfVElNRVNUQU1QLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIxNl9JRDAoKSAgICAgICBiZmluX3JlYWQxNihDQU5fTUIxNl9JRDApCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMTZfSUQwKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX01CMTZfSUQwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIxNl9JRDEoKSAgICAgICBiZmluX3JlYWQxNihDQU5fTUIxNl9JRDEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMTZfSUQxKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX01CMTZfSUQxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIxN19EQVRBMCgpICAgICBiZmluX3JlYWQxNihDQU5fTUIxN19EQVRBMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIxN19EQVRBMCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIxN19EQVRBMCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMTdfREFUQTEoKSAgICAgYmZpbl9yZWFkMTYoQ0FOX01CMTdfREFUQTEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMTdfREFUQTEodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMTdfREFUQTEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjE3X0RBVEEyKCkgICAgIGJmaW5fcmVhZDE2KENBTl9NQjE3X0RBVEEyKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjE3X0RBVEEyKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjE3X0RBVEEyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIxN19EQVRBMygpICAgICBiZmluX3JlYWQxNihDQU5fTUIxN19EQVRBMykKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIxN19EQVRBMyh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIxN19EQVRBMywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMTdfTEVOR1RIKCkgICAgYmZpbl9yZWFkMTYoQ0FOX01CMTdfTEVOR1RIKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjE3X0xFTkdUSCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIxN19MRU5HVEgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjE3X1RJTUVTVEFNUCgpIGJmaW5fcmVhZDE2KENBTl9NQjE3X1RJTUVTVEFNUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIxN19USU1FU1RBTVAodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMTdfVElNRVNUQU1QLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIxN19JRDAoKSAgICAgICBiZmluX3JlYWQxNihDQU5fTUIxN19JRDApCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMTdfSUQwKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX01CMTdfSUQwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIxN19JRDEoKSAgICAgICBiZmluX3JlYWQxNihDQU5fTUIxN19JRDEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMTdfSUQxKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX01CMTdfSUQxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIxOF9EQVRBMCgpICAgICBiZmluX3JlYWQxNihDQU5fTUIxOF9EQVRBMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIxOF9EQVRBMCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIxOF9EQVRBMCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMThfREFUQTEoKSAgICAgYmZpbl9yZWFkMTYoQ0FOX01CMThfREFUQTEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMThfREFUQTEodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMThfREFUQTEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjE4X0RBVEEyKCkgICAgIGJmaW5fcmVhZDE2KENBTl9NQjE4X0RBVEEyKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjE4X0RBVEEyKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjE4X0RBVEEyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIxOF9EQVRBMygpICAgICBiZmluX3JlYWQxNihDQU5fTUIxOF9EQVRBMykKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIxOF9EQVRBMyh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIxOF9EQVRBMywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMThfTEVOR1RIKCkgICAgYmZpbl9yZWFkMTYoQ0FOX01CMThfTEVOR1RIKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjE4X0xFTkdUSCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIxOF9MRU5HVEgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjE4X1RJTUVTVEFNUCgpIGJmaW5fcmVhZDE2KENBTl9NQjE4X1RJTUVTVEFNUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIxOF9USU1FU1RBTVAodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMThfVElNRVNUQU1QLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIxOF9JRDAoKSAgICAgICBiZmluX3JlYWQxNihDQU5fTUIxOF9JRDApCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMThfSUQwKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX01CMThfSUQwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIxOF9JRDEoKSAgICAgICBiZmluX3JlYWQxNihDQU5fTUIxOF9JRDEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMThfSUQxKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX01CMThfSUQxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIxOV9EQVRBMCgpICAgICBiZmluX3JlYWQxNihDQU5fTUIxOV9EQVRBMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIxOV9EQVRBMCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIxOV9EQVRBMCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMTlfREFUQTEoKSAgICAgYmZpbl9yZWFkMTYoQ0FOX01CMTlfREFUQTEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMTlfREFUQTEodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMTlfREFUQTEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjE5X0RBVEEyKCkgICAgIGJmaW5fcmVhZDE2KENBTl9NQjE5X0RBVEEyKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjE5X0RBVEEyKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjE5X0RBVEEyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIxOV9EQVRBMygpICAgICBiZmluX3JlYWQxNihDQU5fTUIxOV9EQVRBMykKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIxOV9EQVRBMyh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIxOV9EQVRBMywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMTlfTEVOR1RIKCkgICAgYmZpbl9yZWFkMTYoQ0FOX01CMTlfTEVOR1RIKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjE5X0xFTkdUSCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIxOV9MRU5HVEgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjE5X1RJTUVTVEFNUCgpIGJmaW5fcmVhZDE2KENBTl9NQjE5X1RJTUVTVEFNUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIxOV9USU1FU1RBTVAodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMTlfVElNRVNUQU1QLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIxOV9JRDAoKSAgICAgICBiZmluX3JlYWQxNihDQU5fTUIxOV9JRDApCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMTlfSUQwKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX01CMTlfSUQwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIxOV9JRDEoKSAgICAgICBiZmluX3JlYWQxNihDQU5fTUIxOV9JRDEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMTlfSUQxKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX01CMTlfSUQxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIyMF9EQVRBMCgpICAgICBiZmluX3JlYWQxNihDQU5fTUIyMF9EQVRBMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIyMF9EQVRBMCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIyMF9EQVRBMCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMjBfREFUQTEoKSAgICAgYmZpbl9yZWFkMTYoQ0FOX01CMjBfREFUQTEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMjBfREFUQTEodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMjBfREFUQTEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjIwX0RBVEEyKCkgICAgIGJmaW5fcmVhZDE2KENBTl9NQjIwX0RBVEEyKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjIwX0RBVEEyKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjIwX0RBVEEyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIyMF9EQVRBMygpICAgICBiZmluX3JlYWQxNihDQU5fTUIyMF9EQVRBMykKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIyMF9EQVRBMyh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIyMF9EQVRBMywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMjBfTEVOR1RIKCkgICAgYmZpbl9yZWFkMTYoQ0FOX01CMjBfTEVOR1RIKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjIwX0xFTkdUSCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIyMF9MRU5HVEgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjIwX1RJTUVTVEFNUCgpIGJmaW5fcmVhZDE2KENBTl9NQjIwX1RJTUVTVEFNUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIyMF9USU1FU1RBTVAodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMjBfVElNRVNUQU1QLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIyMF9JRDAoKSAgICAgICBiZmluX3JlYWQxNihDQU5fTUIyMF9JRDApCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMjBfSUQwKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX01CMjBfSUQwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIyMF9JRDEoKSAgICAgICBiZmluX3JlYWQxNihDQU5fTUIyMF9JRDEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMjBfSUQxKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX01CMjBfSUQxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIyMV9EQVRBMCgpICAgICBiZmluX3JlYWQxNihDQU5fTUIyMV9EQVRBMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIyMV9EQVRBMCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIyMV9EQVRBMCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMjFfREFUQTEoKSAgICAgYmZpbl9yZWFkMTYoQ0FOX01CMjFfREFUQTEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMjFfREFUQTEodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMjFfREFUQTEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjIxX0RBVEEyKCkgICAgIGJmaW5fcmVhZDE2KENBTl9NQjIxX0RBVEEyKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjIxX0RBVEEyKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjIxX0RBVEEyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIyMV9EQVRBMygpICAgICBiZmluX3JlYWQxNihDQU5fTUIyMV9EQVRBMykKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIyMV9EQVRBMyh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIyMV9EQVRBMywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMjFfTEVOR1RIKCkgICAgYmZpbl9yZWFkMTYoQ0FOX01CMjFfTEVOR1RIKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjIxX0xFTkdUSCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIyMV9MRU5HVEgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjIxX1RJTUVTVEFNUCgpIGJmaW5fcmVhZDE2KENBTl9NQjIxX1RJTUVTVEFNUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIyMV9USU1FU1RBTVAodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMjFfVElNRVNUQU1QLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIyMV9JRDAoKSAgICAgICBiZmluX3JlYWQxNihDQU5fTUIyMV9JRDApCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMjFfSUQwKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX01CMjFfSUQwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIyMV9JRDEoKSAgICAgICBiZmluX3JlYWQxNihDQU5fTUIyMV9JRDEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMjFfSUQxKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX01CMjFfSUQxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIyMl9EQVRBMCgpICAgICBiZmluX3JlYWQxNihDQU5fTUIyMl9EQVRBMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIyMl9EQVRBMCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIyMl9EQVRBMCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMjJfREFUQTEoKSAgICAgYmZpbl9yZWFkMTYoQ0FOX01CMjJfREFUQTEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMjJfREFUQTEodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMjJfREFUQTEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjIyX0RBVEEyKCkgICAgIGJmaW5fcmVhZDE2KENBTl9NQjIyX0RBVEEyKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjIyX0RBVEEyKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjIyX0RBVEEyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIyMl9EQVRBMygpICAgICBiZmluX3JlYWQxNihDQU5fTUIyMl9EQVRBMykKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIyMl9EQVRBMyh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIyMl9EQVRBMywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMjJfTEVOR1RIKCkgICAgYmZpbl9yZWFkMTYoQ0FOX01CMjJfTEVOR1RIKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjIyX0xFTkdUSCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIyMl9MRU5HVEgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjIyX1RJTUVTVEFNUCgpIGJmaW5fcmVhZDE2KENBTl9NQjIyX1RJTUVTVEFNUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIyMl9USU1FU1RBTVAodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMjJfVElNRVNUQU1QLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIyMl9JRDAoKSAgICAgICBiZmluX3JlYWQxNihDQU5fTUIyMl9JRDApCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMjJfSUQwKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX01CMjJfSUQwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIyMl9JRDEoKSAgICAgICBiZmluX3JlYWQxNihDQU5fTUIyMl9JRDEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMjJfSUQxKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX01CMjJfSUQxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIyM19EQVRBMCgpICAgICBiZmluX3JlYWQxNihDQU5fTUIyM19EQVRBMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIyM19EQVRBMCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIyM19EQVRBMCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMjNfREFUQTEoKSAgICAgYmZpbl9yZWFkMTYoQ0FOX01CMjNfREFUQTEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMjNfREFUQTEodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMjNfREFUQTEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjIzX0RBVEEyKCkgICAgIGJmaW5fcmVhZDE2KENBTl9NQjIzX0RBVEEyKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjIzX0RBVEEyKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjIzX0RBVEEyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIyM19EQVRBMygpICAgICBiZmluX3JlYWQxNihDQU5fTUIyM19EQVRBMykKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIyM19EQVRBMyh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIyM19EQVRBMywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMjNfTEVOR1RIKCkgICAgYmZpbl9yZWFkMTYoQ0FOX01CMjNfTEVOR1RIKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjIzX0xFTkdUSCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIyM19MRU5HVEgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjIzX1RJTUVTVEFNUCgpIGJmaW5fcmVhZDE2KENBTl9NQjIzX1RJTUVTVEFNUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIyM19USU1FU1RBTVAodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMjNfVElNRVNUQU1QLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIyM19JRDAoKSAgICAgICBiZmluX3JlYWQxNihDQU5fTUIyM19JRDApCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMjNfSUQwKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX01CMjNfSUQwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIyM19JRDEoKSAgICAgICBiZmluX3JlYWQxNihDQU5fTUIyM19JRDEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMjNfSUQxKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX01CMjNfSUQxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIyNF9EQVRBMCgpICAgICBiZmluX3JlYWQxNihDQU5fTUIyNF9EQVRBMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIyNF9EQVRBMCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIyNF9EQVRBMCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMjRfREFUQTEoKSAgICAgYmZpbl9yZWFkMTYoQ0FOX01CMjRfREFUQTEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMjRfREFUQTEodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMjRfREFUQTEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjI0X0RBVEEyKCkgICAgIGJmaW5fcmVhZDE2KENBTl9NQjI0X0RBVEEyKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjI0X0RBVEEyKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjI0X0RBVEEyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIyNF9EQVRBMygpICAgICBiZmluX3JlYWQxNihDQU5fTUIyNF9EQVRBMykKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIyNF9EQVRBMyh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIyNF9EQVRBMywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMjRfTEVOR1RIKCkgICAgYmZpbl9yZWFkMTYoQ0FOX01CMjRfTEVOR1RIKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjI0X0xFTkdUSCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIyNF9MRU5HVEgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjI0X1RJTUVTVEFNUCgpIGJmaW5fcmVhZDE2KENBTl9NQjI0X1RJTUVTVEFNUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIyNF9USU1FU1RBTVAodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMjRfVElNRVNUQU1QLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIyNF9JRDAoKSAgICAgICBiZmluX3JlYWQxNihDQU5fTUIyNF9JRDApCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMjRfSUQwKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX01CMjRfSUQwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIyNF9JRDEoKSAgICAgICBiZmluX3JlYWQxNihDQU5fTUIyNF9JRDEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMjRfSUQxKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX01CMjRfSUQxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIyNV9EQVRBMCgpICAgICBiZmluX3JlYWQxNihDQU5fTUIyNV9EQVRBMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIyNV9EQVRBMCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIyNV9EQVRBMCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMjVfREFUQTEoKSAgICAgYmZpbl9yZWFkMTYoQ0FOX01CMjVfREFUQTEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMjVfREFUQTEodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMjVfREFUQTEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjI1X0RBVEEyKCkgICAgIGJmaW5fcmVhZDE2KENBTl9NQjI1X0RBVEEyKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjI1X0RBVEEyKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjI1X0RBVEEyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIyNV9EQVRBMygpICAgICBiZmluX3JlYWQxNihDQU5fTUIyNV9EQVRBMykKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIyNV9EQVRBMyh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIyNV9EQVRBMywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMjVfTEVOR1RIKCkgICAgYmZpbl9yZWFkMTYoQ0FOX01CMjVfTEVOR1RIKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjI1X0xFTkdUSCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIyNV9MRU5HVEgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjI1X1RJTUVTVEFNUCgpIGJmaW5fcmVhZDE2KENBTl9NQjI1X1RJTUVTVEFNUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIyNV9USU1FU1RBTVAodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMjVfVElNRVNUQU1QLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIyNV9JRDAoKSAgICAgICBiZmluX3JlYWQxNihDQU5fTUIyNV9JRDApCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMjVfSUQwKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX01CMjVfSUQwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIyNV9JRDEoKSAgICAgICBiZmluX3JlYWQxNihDQU5fTUIyNV9JRDEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMjVfSUQxKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX01CMjVfSUQxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIyNl9EQVRBMCgpICAgICBiZmluX3JlYWQxNihDQU5fTUIyNl9EQVRBMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIyNl9EQVRBMCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIyNl9EQVRBMCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMjZfREFUQTEoKSAgICAgYmZpbl9yZWFkMTYoQ0FOX01CMjZfREFUQTEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMjZfREFUQTEodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMjZfREFUQTEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjI2X0RBVEEyKCkgICAgIGJmaW5fcmVhZDE2KENBTl9NQjI2X0RBVEEyKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjI2X0RBVEEyKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjI2X0RBVEEyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIyNl9EQVRBMygpICAgICBiZmluX3JlYWQxNihDQU5fTUIyNl9EQVRBMykKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIyNl9EQVRBMyh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIyNl9EQVRBMywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMjZfTEVOR1RIKCkgICAgYmZpbl9yZWFkMTYoQ0FOX01CMjZfTEVOR1RIKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjI2X0xFTkdUSCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIyNl9MRU5HVEgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjI2X1RJTUVTVEFNUCgpIGJmaW5fcmVhZDE2KENBTl9NQjI2X1RJTUVTVEFNUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIyNl9USU1FU1RBTVAodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMjZfVElNRVNUQU1QLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIyNl9JRDAoKSAgICAgICBiZmluX3JlYWQxNihDQU5fTUIyNl9JRDApCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMjZfSUQwKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX01CMjZfSUQwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIyNl9JRDEoKSAgICAgICBiZmluX3JlYWQxNihDQU5fTUIyNl9JRDEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMjZfSUQxKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX01CMjZfSUQxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIyN19EQVRBMCgpICAgICBiZmluX3JlYWQxNihDQU5fTUIyN19EQVRBMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIyN19EQVRBMCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIyN19EQVRBMCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMjdfREFUQTEoKSAgICAgYmZpbl9yZWFkMTYoQ0FOX01CMjdfREFUQTEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMjdfREFUQTEodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMjdfREFUQTEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjI3X0RBVEEyKCkgICAgIGJmaW5fcmVhZDE2KENBTl9NQjI3X0RBVEEyKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjI3X0RBVEEyKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjI3X0RBVEEyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIyN19EQVRBMygpICAgICBiZmluX3JlYWQxNihDQU5fTUIyN19EQVRBMykKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIyN19EQVRBMyh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIyN19EQVRBMywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMjdfTEVOR1RIKCkgICAgYmZpbl9yZWFkMTYoQ0FOX01CMjdfTEVOR1RIKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjI3X0xFTkdUSCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIyN19MRU5HVEgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjI3X1RJTUVTVEFNUCgpIGJmaW5fcmVhZDE2KENBTl9NQjI3X1RJTUVTVEFNUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIyN19USU1FU1RBTVAodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMjdfVElNRVNUQU1QLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIyN19JRDAoKSAgICAgICBiZmluX3JlYWQxNihDQU5fTUIyN19JRDApCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMjdfSUQwKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX01CMjdfSUQwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIyN19JRDEoKSAgICAgICBiZmluX3JlYWQxNihDQU5fTUIyN19JRDEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMjdfSUQxKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX01CMjdfSUQxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIyOF9EQVRBMCgpICAgICBiZmluX3JlYWQxNihDQU5fTUIyOF9EQVRBMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIyOF9EQVRBMCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIyOF9EQVRBMCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMjhfREFUQTEoKSAgICAgYmZpbl9yZWFkMTYoQ0FOX01CMjhfREFUQTEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMjhfREFUQTEodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMjhfREFUQTEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjI4X0RBVEEyKCkgICAgIGJmaW5fcmVhZDE2KENBTl9NQjI4X0RBVEEyKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjI4X0RBVEEyKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjI4X0RBVEEyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIyOF9EQVRBMygpICAgICBiZmluX3JlYWQxNihDQU5fTUIyOF9EQVRBMykKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIyOF9EQVRBMyh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIyOF9EQVRBMywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMjhfTEVOR1RIKCkgICAgYmZpbl9yZWFkMTYoQ0FOX01CMjhfTEVOR1RIKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjI4X0xFTkdUSCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIyOF9MRU5HVEgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjI4X1RJTUVTVEFNUCgpIGJmaW5fcmVhZDE2KENBTl9NQjI4X1RJTUVTVEFNUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIyOF9USU1FU1RBTVAodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMjhfVElNRVNUQU1QLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIyOF9JRDAoKSAgICAgICBiZmluX3JlYWQxNihDQU5fTUIyOF9JRDApCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMjhfSUQwKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX01CMjhfSUQwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIyOF9JRDEoKSAgICAgICBiZmluX3JlYWQxNihDQU5fTUIyOF9JRDEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMjhfSUQxKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX01CMjhfSUQxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIyOV9EQVRBMCgpICAgICBiZmluX3JlYWQxNihDQU5fTUIyOV9EQVRBMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIyOV9EQVRBMCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIyOV9EQVRBMCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMjlfREFUQTEoKSAgICAgYmZpbl9yZWFkMTYoQ0FOX01CMjlfREFUQTEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMjlfREFUQTEodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMjlfREFUQTEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjI5X0RBVEEyKCkgICAgIGJmaW5fcmVhZDE2KENBTl9NQjI5X0RBVEEyKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjI5X0RBVEEyKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjI5X0RBVEEyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIyOV9EQVRBMygpICAgICBiZmluX3JlYWQxNihDQU5fTUIyOV9EQVRBMykKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIyOV9EQVRBMyh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIyOV9EQVRBMywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMjlfTEVOR1RIKCkgICAgYmZpbl9yZWFkMTYoQ0FOX01CMjlfTEVOR1RIKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjI5X0xFTkdUSCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIyOV9MRU5HVEgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjI5X1RJTUVTVEFNUCgpIGJmaW5fcmVhZDE2KENBTl9NQjI5X1RJTUVTVEFNUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIyOV9USU1FU1RBTVAodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMjlfVElNRVNUQU1QLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIyOV9JRDAoKSAgICAgICBiZmluX3JlYWQxNihDQU5fTUIyOV9JRDApCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMjlfSUQwKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX01CMjlfSUQwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIyOV9JRDEoKSAgICAgICBiZmluX3JlYWQxNihDQU5fTUIyOV9JRDEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMjlfSUQxKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX01CMjlfSUQxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIzMF9EQVRBMCgpICAgICBiZmluX3JlYWQxNihDQU5fTUIzMF9EQVRBMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIzMF9EQVRBMCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIzMF9EQVRBMCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMzBfREFUQTEoKSAgICAgYmZpbl9yZWFkMTYoQ0FOX01CMzBfREFUQTEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMzBfREFUQTEodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMzBfREFUQTEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjMwX0RBVEEyKCkgICAgIGJmaW5fcmVhZDE2KENBTl9NQjMwX0RBVEEyKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjMwX0RBVEEyKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjMwX0RBVEEyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIzMF9EQVRBMygpICAgICBiZmluX3JlYWQxNihDQU5fTUIzMF9EQVRBMykKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIzMF9EQVRBMyh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIzMF9EQVRBMywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMzBfTEVOR1RIKCkgICAgYmZpbl9yZWFkMTYoQ0FOX01CMzBfTEVOR1RIKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjMwX0xFTkdUSCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIzMF9MRU5HVEgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjMwX1RJTUVTVEFNUCgpIGJmaW5fcmVhZDE2KENBTl9NQjMwX1RJTUVTVEFNUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIzMF9USU1FU1RBTVAodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMzBfVElNRVNUQU1QLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIzMF9JRDAoKSAgICAgICBiZmluX3JlYWQxNihDQU5fTUIzMF9JRDApCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMzBfSUQwKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX01CMzBfSUQwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIzMF9JRDEoKSAgICAgICBiZmluX3JlYWQxNihDQU5fTUIzMF9JRDEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMzBfSUQxKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX01CMzBfSUQxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIzMV9EQVRBMCgpICAgICBiZmluX3JlYWQxNihDQU5fTUIzMV9EQVRBMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIzMV9EQVRBMCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIzMV9EQVRBMCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMzFfREFUQTEoKSAgICAgYmZpbl9yZWFkMTYoQ0FOX01CMzFfREFUQTEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMzFfREFUQTEodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMzFfREFUQTEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjMxX0RBVEEyKCkgICAgIGJmaW5fcmVhZDE2KENBTl9NQjMxX0RBVEEyKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjMxX0RBVEEyKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjMxX0RBVEEyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIzMV9EQVRBMygpICAgICBiZmluX3JlYWQxNihDQU5fTUIzMV9EQVRBMykKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIzMV9EQVRBMyh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIzMV9EQVRBMywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMzFfTEVOR1RIKCkgICAgYmZpbl9yZWFkMTYoQ0FOX01CMzFfTEVOR1RIKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjMxX0xFTkdUSCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIzMV9MRU5HVEgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjMxX1RJTUVTVEFNUCgpIGJmaW5fcmVhZDE2KENBTl9NQjMxX1RJTUVTVEFNUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIzMV9USU1FU1RBTVAodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMzFfVElNRVNUQU1QLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIzMV9JRDAoKSAgICAgICBiZmluX3JlYWQxNihDQU5fTUIzMV9JRDApCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMzFfSUQwKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX01CMzFfSUQwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIzMV9JRDEoKSAgICAgICBiZmluX3JlYWQxNihDQU5fTUIzMV9JRDEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMzFfSUQxKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX01CMzFfSUQxLCB2YWwpCisKKy8qIFRoZXNlIG5lZWQgdG8gYmUgbGFzdCBkdWUgdG8gdGhlIGNkZWYvbGludXggaW50ZXItZGVwZW5kZW5jaWVzICovCisjaW5jbHVkZSA8YXNtL2lycS5oPgorCisvKiBXcml0aW5nIHRvIFBMTF9DVEwgaW5pdGlhdGVzIGEgUExMIHJlbG9jayBzZXF1ZW5jZS4gKi8KK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgYmZpbl93cml0ZV9QTExfQ1RMKHVuc2lnbmVkIGludCB2YWwpCit7CisJdW5zaWduZWQgbG9uZyBmbGFncywgaXdyMCwgaXdyMTsKKworCWlmICh2YWwgPT0gYmZpbl9yZWFkX1BMTF9DVEwoKSkKKwkJcmV0dXJuOworCisJbG9jYWxfaXJxX3NhdmVfaHcoZmxhZ3MpOworCS8qIEVuYWJsZSB0aGUgUExMIFdha2V1cCBiaXQgaW4gU0lDIElXUiAqLworCWl3cjAgPSBiZmluX3JlYWQzMihTSUNfSVdSMCk7CisJaXdyMSA9IGJmaW5fcmVhZDMyKFNJQ19JV1IxKTsKKwkvKiBPbmx5IGFsbG93IFBQTCBXYWtldXApICovCisJYmZpbl93cml0ZTMyKFNJQ19JV1IwLCBJV1JfRU5BQkxFKDApKTsKKwliZmluX3dyaXRlMzIoU0lDX0lXUjEsIDApOworCisJYmZpbl93cml0ZTE2KFBMTF9DVEwsIHZhbCk7CisJU1NZTkMoKTsKKwlhc20oIklETEU7Iik7CisKKwliZmluX3dyaXRlMzIoU0lDX0lXUjAsIGl3cjApOworCWJmaW5fd3JpdGUzMihTSUNfSVdSMSwgaXdyMSk7CisJbG9jYWxfaXJxX3Jlc3RvcmVfaHcoZmxhZ3MpOworfQorCisvKiBXcml0aW5nIHRvIFZSX0NUTCBpbml0aWF0ZXMgYSBQTEwgcmVsb2NrIHNlcXVlbmNlLiAqLworc3RhdGljIF9faW5saW5lX18gdm9pZCBiZmluX3dyaXRlX1ZSX0NUTCh1bnNpZ25lZCBpbnQgdmFsKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIGl3cjAsIGl3cjE7CisKKwlpZiAodmFsID09IGJmaW5fcmVhZF9WUl9DVEwoKSkKKwkJcmV0dXJuOworCisJbG9jYWxfaXJxX3NhdmVfaHcoZmxhZ3MpOworCS8qIEVuYWJsZSB0aGUgUExMIFdha2V1cCBiaXQgaW4gU0lDIElXUiAqLworCWl3cjAgPSBiZmluX3JlYWQzMihTSUNfSVdSMCk7CisJaXdyMSA9IGJmaW5fcmVhZDMyKFNJQ19JV1IxKTsKKwkvKiBPbmx5IGFsbG93IFBQTCBXYWtldXApICovCisJYmZpbl93cml0ZTMyKFNJQ19JV1IwLCBJV1JfRU5BQkxFKDApKTsKKwliZmluX3dyaXRlMzIoU0lDX0lXUjEsIDApOworCisJYmZpbl93cml0ZTE2KFZSX0NUTCwgdmFsKTsKKwlTU1lOQygpOworCWFzbSgiSURMRTsiKTsKKworCWJmaW5fd3JpdGUzMihTSUNfSVdSMCwgaXdyMCk7CisJYmZpbl93cml0ZTMyKFNJQ19JV1IxLCBpd3IxKTsKKwlsb2NhbF9pcnFfcmVzdG9yZV9odyhmbGFncyk7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L2luY2x1ZGUvbWFjaC9jZGVmQkY1MzkuaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzOC9pbmNsdWRlL21hY2gvY2RlZkJGNTM5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTk4YzRiYgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzOC9pbmNsdWRlL21hY2gvY2RlZkJGNTM5LmgKQEAgLTAsMCArMSwyNDAgQEAKKy8qIERPIE5PVCBFRElUIFRISVMgRklMRQorICogQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgZ2VuZXJhdGUtY2RlZi1oZWFkZXJzLnhzbAorICogRE8gTk9UIEVESVQgVEhJUyBGSUxFCisgKi8KKworI2lmbmRlZiBfQ0RFRl9CRjUzOV9ICisjZGVmaW5lIF9DREVGX0JGNTM5X0gKKworLyogSW5jbHVkZSBNTVJzIENvbW1vbiB0byBCRjUzOCAJCQkJCQkJCSovCisjaW5jbHVkZSAiY2RlZkJGNTM4LmgiCisKKworI2RlZmluZSBiZmluX3JlYWRfTVhWUl9DT05GSUcoKSAgICAgICAgYmZpbl9yZWFkMTYoTVhWUl9DT05GSUcpCisjZGVmaW5lIGJmaW5fd3JpdGVfTVhWUl9DT05GSUcodmFsKSAgICBiZmluX3dyaXRlMTYoTVhWUl9DT05GSUcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01YVlJfUExMX0NUTF8wKCkgICAgIGJmaW5fcmVhZDMyKE1YVlJfUExMX0NUTF8wKQorI2RlZmluZSBiZmluX3dyaXRlX01YVlJfUExMX0NUTF8wKHZhbCkgYmZpbl93cml0ZTMyKE1YVlJfUExMX0NUTF8wLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NWFZSX1NUQVRFXzAoKSAgICAgICBiZmluX3JlYWQzMihNWFZSX1NUQVRFXzApCisjZGVmaW5lIGJmaW5fd3JpdGVfTVhWUl9TVEFURV8wKHZhbCkgICBiZmluX3dyaXRlMzIoTVhWUl9TVEFURV8wLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NWFZSX1NUQVRFXzEoKSAgICAgICBiZmluX3JlYWQzMihNWFZSX1NUQVRFXzEpCisjZGVmaW5lIGJmaW5fd3JpdGVfTVhWUl9TVEFURV8xKHZhbCkgICBiZmluX3dyaXRlMzIoTVhWUl9TVEFURV8xLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NWFZSX0lOVF9TVEFUXzAoKSAgICBiZmluX3JlYWQzMihNWFZSX0lOVF9TVEFUXzApCisjZGVmaW5lIGJmaW5fd3JpdGVfTVhWUl9JTlRfU1RBVF8wKHZhbCkgYmZpbl93cml0ZTMyKE1YVlJfSU5UX1NUQVRfMCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTVhWUl9JTlRfU1RBVF8xKCkgICAgYmZpbl9yZWFkMzIoTVhWUl9JTlRfU1RBVF8xKQorI2RlZmluZSBiZmluX3dyaXRlX01YVlJfSU5UX1NUQVRfMSh2YWwpIGJmaW5fd3JpdGUzMihNWFZSX0lOVF9TVEFUXzEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01YVlJfSU5UX0VOXzAoKSAgICAgIGJmaW5fcmVhZDMyKE1YVlJfSU5UX0VOXzApCisjZGVmaW5lIGJmaW5fd3JpdGVfTVhWUl9JTlRfRU5fMCh2YWwpICBiZmluX3dyaXRlMzIoTVhWUl9JTlRfRU5fMCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTVhWUl9JTlRfRU5fMSgpICAgICAgYmZpbl9yZWFkMzIoTVhWUl9JTlRfRU5fMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9NWFZSX0lOVF9FTl8xKHZhbCkgIGJmaW5fd3JpdGUzMihNWFZSX0lOVF9FTl8xLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NWFZSX1BPU0lUSU9OKCkgICAgICBiZmluX3JlYWQxNihNWFZSX1BPU0lUSU9OKQorI2RlZmluZSBiZmluX3dyaXRlX01YVlJfUE9TSVRJT04odmFsKSAgYmZpbl93cml0ZTE2KE1YVlJfUE9TSVRJT04sIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01YVlJfTUFYX1BPU0lUSU9OKCkgIGJmaW5fcmVhZDE2KE1YVlJfTUFYX1BPU0lUSU9OKQorI2RlZmluZSBiZmluX3dyaXRlX01YVlJfTUFYX1BPU0lUSU9OKHZhbCkgYmZpbl93cml0ZTE2KE1YVlJfTUFYX1BPU0lUSU9OLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NWFZSX0RFTEFZKCkgICAgICAgICBiZmluX3JlYWQxNihNWFZSX0RFTEFZKQorI2RlZmluZSBiZmluX3dyaXRlX01YVlJfREVMQVkodmFsKSAgICAgYmZpbl93cml0ZTE2KE1YVlJfREVMQVksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01YVlJfTUFYX0RFTEFZKCkgICAgIGJmaW5fcmVhZDE2KE1YVlJfTUFYX0RFTEFZKQorI2RlZmluZSBiZmluX3dyaXRlX01YVlJfTUFYX0RFTEFZKHZhbCkgYmZpbl93cml0ZTE2KE1YVlJfTUFYX0RFTEFZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NWFZSX0xBRERSKCkgICAgICAgICBiZmluX3JlYWQzMihNWFZSX0xBRERSKQorI2RlZmluZSBiZmluX3dyaXRlX01YVlJfTEFERFIodmFsKSAgICAgYmZpbl93cml0ZTMyKE1YVlJfTEFERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01YVlJfR0FERFIoKSAgICAgICAgIGJmaW5fcmVhZDE2KE1YVlJfR0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTVhWUl9HQUREUih2YWwpICAgICBiZmluX3dyaXRlMTYoTVhWUl9HQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTVhWUl9BQUREUigpICAgICAgICAgYmZpbl9yZWFkMzIoTVhWUl9BQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NWFZSX0FBRERSKHZhbCkgICAgIGJmaW5fd3JpdGUzMihNWFZSX0FBRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NWFZSX0FMTE9DXzAoKSAgICAgICBiZmluX3JlYWQzMihNWFZSX0FMTE9DXzApCisjZGVmaW5lIGJmaW5fd3JpdGVfTVhWUl9BTExPQ18wKHZhbCkgICBiZmluX3dyaXRlMzIoTVhWUl9BTExPQ18wLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NWFZSX0FMTE9DXzEoKSAgICAgICBiZmluX3JlYWQzMihNWFZSX0FMTE9DXzEpCisjZGVmaW5lIGJmaW5fd3JpdGVfTVhWUl9BTExPQ18xKHZhbCkgICBiZmluX3dyaXRlMzIoTVhWUl9BTExPQ18xLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NWFZSX0FMTE9DXzIoKSAgICAgICBiZmluX3JlYWQzMihNWFZSX0FMTE9DXzIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTVhWUl9BTExPQ18yKHZhbCkgICBiZmluX3dyaXRlMzIoTVhWUl9BTExPQ18yLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NWFZSX0FMTE9DXzMoKSAgICAgICBiZmluX3JlYWQzMihNWFZSX0FMTE9DXzMpCisjZGVmaW5lIGJmaW5fd3JpdGVfTVhWUl9BTExPQ18zKHZhbCkgICBiZmluX3dyaXRlMzIoTVhWUl9BTExPQ18zLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NWFZSX0FMTE9DXzQoKSAgICAgICBiZmluX3JlYWQzMihNWFZSX0FMTE9DXzQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTVhWUl9BTExPQ180KHZhbCkgICBiZmluX3dyaXRlMzIoTVhWUl9BTExPQ180LCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NWFZSX0FMTE9DXzUoKSAgICAgICBiZmluX3JlYWQzMihNWFZSX0FMTE9DXzUpCisjZGVmaW5lIGJmaW5fd3JpdGVfTVhWUl9BTExPQ181KHZhbCkgICBiZmluX3dyaXRlMzIoTVhWUl9BTExPQ181LCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NWFZSX0FMTE9DXzYoKSAgICAgICBiZmluX3JlYWQzMihNWFZSX0FMTE9DXzYpCisjZGVmaW5lIGJmaW5fd3JpdGVfTVhWUl9BTExPQ182KHZhbCkgICBiZmluX3dyaXRlMzIoTVhWUl9BTExPQ182LCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NWFZSX0FMTE9DXzcoKSAgICAgICBiZmluX3JlYWQzMihNWFZSX0FMTE9DXzcpCisjZGVmaW5lIGJmaW5fd3JpdGVfTVhWUl9BTExPQ183KHZhbCkgICBiZmluX3dyaXRlMzIoTVhWUl9BTExPQ183LCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NWFZSX0FMTE9DXzgoKSAgICAgICBiZmluX3JlYWQzMihNWFZSX0FMTE9DXzgpCisjZGVmaW5lIGJmaW5fd3JpdGVfTVhWUl9BTExPQ184KHZhbCkgICBiZmluX3dyaXRlMzIoTVhWUl9BTExPQ184LCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NWFZSX0FMTE9DXzkoKSAgICAgICBiZmluX3JlYWQzMihNWFZSX0FMTE9DXzkpCisjZGVmaW5lIGJmaW5fd3JpdGVfTVhWUl9BTExPQ185KHZhbCkgICBiZmluX3dyaXRlMzIoTVhWUl9BTExPQ185LCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NWFZSX0FMTE9DXzEwKCkgICAgICBiZmluX3JlYWQzMihNWFZSX0FMTE9DXzEwKQorI2RlZmluZSBiZmluX3dyaXRlX01YVlJfQUxMT0NfMTAodmFsKSAgYmZpbl93cml0ZTMyKE1YVlJfQUxMT0NfMTAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01YVlJfQUxMT0NfMTEoKSAgICAgIGJmaW5fcmVhZDMyKE1YVlJfQUxMT0NfMTEpCisjZGVmaW5lIGJmaW5fd3JpdGVfTVhWUl9BTExPQ18xMSh2YWwpICBiZmluX3dyaXRlMzIoTVhWUl9BTExPQ18xMSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTVhWUl9BTExPQ18xMigpICAgICAgYmZpbl9yZWFkMzIoTVhWUl9BTExPQ18xMikKKyNkZWZpbmUgYmZpbl93cml0ZV9NWFZSX0FMTE9DXzEyKHZhbCkgIGJmaW5fd3JpdGUzMihNWFZSX0FMTE9DXzEyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NWFZSX0FMTE9DXzEzKCkgICAgICBiZmluX3JlYWQzMihNWFZSX0FMTE9DXzEzKQorI2RlZmluZSBiZmluX3dyaXRlX01YVlJfQUxMT0NfMTModmFsKSAgYmZpbl93cml0ZTMyKE1YVlJfQUxMT0NfMTMsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01YVlJfQUxMT0NfMTQoKSAgICAgIGJmaW5fcmVhZDMyKE1YVlJfQUxMT0NfMTQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTVhWUl9BTExPQ18xNCh2YWwpICBiZmluX3dyaXRlMzIoTVhWUl9BTExPQ18xNCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTVhWUl9TWU5DX0xDSEFOXzAoKSAgYmZpbl9yZWFkMzIoTVhWUl9TWU5DX0xDSEFOXzApCisjZGVmaW5lIGJmaW5fd3JpdGVfTVhWUl9TWU5DX0xDSEFOXzAodmFsKSBiZmluX3dyaXRlMzIoTVhWUl9TWU5DX0xDSEFOXzAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01YVlJfU1lOQ19MQ0hBTl8xKCkgIGJmaW5fcmVhZDMyKE1YVlJfU1lOQ19MQ0hBTl8xKQorI2RlZmluZSBiZmluX3dyaXRlX01YVlJfU1lOQ19MQ0hBTl8xKHZhbCkgYmZpbl93cml0ZTMyKE1YVlJfU1lOQ19MQ0hBTl8xLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NWFZSX1NZTkNfTENIQU5fMigpICBiZmluX3JlYWQzMihNWFZSX1NZTkNfTENIQU5fMikKKyNkZWZpbmUgYmZpbl93cml0ZV9NWFZSX1NZTkNfTENIQU5fMih2YWwpIGJmaW5fd3JpdGUzMihNWFZSX1NZTkNfTENIQU5fMiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTVhWUl9TWU5DX0xDSEFOXzMoKSAgYmZpbl9yZWFkMzIoTVhWUl9TWU5DX0xDSEFOXzMpCisjZGVmaW5lIGJmaW5fd3JpdGVfTVhWUl9TWU5DX0xDSEFOXzModmFsKSBiZmluX3dyaXRlMzIoTVhWUl9TWU5DX0xDSEFOXzMsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01YVlJfU1lOQ19MQ0hBTl80KCkgIGJmaW5fcmVhZDMyKE1YVlJfU1lOQ19MQ0hBTl80KQorI2RlZmluZSBiZmluX3dyaXRlX01YVlJfU1lOQ19MQ0hBTl80KHZhbCkgYmZpbl93cml0ZTMyKE1YVlJfU1lOQ19MQ0hBTl80LCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NWFZSX1NZTkNfTENIQU5fNSgpICBiZmluX3JlYWQzMihNWFZSX1NZTkNfTENIQU5fNSkKKyNkZWZpbmUgYmZpbl93cml0ZV9NWFZSX1NZTkNfTENIQU5fNSh2YWwpIGJmaW5fd3JpdGUzMihNWFZSX1NZTkNfTENIQU5fNSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTVhWUl9TWU5DX0xDSEFOXzYoKSAgYmZpbl9yZWFkMzIoTVhWUl9TWU5DX0xDSEFOXzYpCisjZGVmaW5lIGJmaW5fd3JpdGVfTVhWUl9TWU5DX0xDSEFOXzYodmFsKSBiZmluX3dyaXRlMzIoTVhWUl9TWU5DX0xDSEFOXzYsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01YVlJfU1lOQ19MQ0hBTl83KCkgIGJmaW5fcmVhZDMyKE1YVlJfU1lOQ19MQ0hBTl83KQorI2RlZmluZSBiZmluX3dyaXRlX01YVlJfU1lOQ19MQ0hBTl83KHZhbCkgYmZpbl93cml0ZTMyKE1YVlJfU1lOQ19MQ0hBTl83LCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NWFZSX0RNQTBfQ09ORklHKCkgICBiZmluX3JlYWQzMihNWFZSX0RNQTBfQ09ORklHKQorI2RlZmluZSBiZmluX3dyaXRlX01YVlJfRE1BMF9DT05GSUcodmFsKSBiZmluX3dyaXRlMzIoTVhWUl9ETUEwX0NPTkZJRywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTVhWUl9ETUEwX1NUQVJUX0FERFIoKSBiZmluX3JlYWRQVFIoTVhWUl9ETUEwX1NUQVJUX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTVhWUl9ETUEwX1NUQVJUX0FERFIodmFsKSBiZmluX3dyaXRlUFRSKE1YVlJfRE1BMF9TVEFSVF9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NWFZSX0RNQTBfQ09VTlQoKSAgICBiZmluX3JlYWQxNihNWFZSX0RNQTBfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTVhWUl9ETUEwX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KE1YVlJfRE1BMF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTVhWUl9ETUEwX0NVUlJfQUREUigpIGJmaW5fcmVhZFBUUihNWFZSX0RNQTBfQ1VSUl9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX01YVlJfRE1BMF9DVVJSX0FERFIodmFsKSBiZmluX3dyaXRlUFRSKE1YVlJfRE1BMF9DVVJSX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01YVlJfRE1BMF9DVVJSX0NPVU5UKCkgYmZpbl9yZWFkMTYoTVhWUl9ETUEwX0NVUlJfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTVhWUl9ETUEwX0NVUlJfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoTVhWUl9ETUEwX0NVUlJfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01YVlJfRE1BMV9DT05GSUcoKSAgIGJmaW5fcmVhZDMyKE1YVlJfRE1BMV9DT05GSUcpCisjZGVmaW5lIGJmaW5fd3JpdGVfTVhWUl9ETUExX0NPTkZJRyh2YWwpIGJmaW5fd3JpdGUzMihNWFZSX0RNQTFfQ09ORklHLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NWFZSX0RNQTFfU1RBUlRfQUREUigpIGJmaW5fcmVhZFBUUihNWFZSX0RNQTFfU1RBUlRfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NWFZSX0RNQTFfU1RBUlRfQUREUih2YWwpIGJmaW5fd3JpdGVQVFIoTVhWUl9ETUExX1NUQVJUX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01YVlJfRE1BMV9DT1VOVCgpICAgIGJmaW5fcmVhZDE2KE1YVlJfRE1BMV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NWFZSX0RNQTFfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoTVhWUl9ETUExX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NWFZSX0RNQTFfQ1VSUl9BRERSKCkgYmZpbl9yZWFkUFRSKE1YVlJfRE1BMV9DVVJSX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTVhWUl9ETUExX0NVUlJfQUREUih2YWwpIGJmaW5fd3JpdGVQVFIoTVhWUl9ETUExX0NVUlJfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTVhWUl9ETUExX0NVUlJfQ09VTlQoKSBiZmluX3JlYWQxNihNWFZSX0RNQTFfQ1VSUl9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NWFZSX0RNQTFfQ1VSUl9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihNWFZSX0RNQTFfQ1VSUl9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTVhWUl9ETUEyX0NPTkZJRygpICAgYmZpbl9yZWFkMzIoTVhWUl9ETUEyX0NPTkZJRykKKyNkZWZpbmUgYmZpbl93cml0ZV9NWFZSX0RNQTJfQ09ORklHKHZhbCkgYmZpbl93cml0ZTMyKE1YVlJfRE1BMl9DT05GSUcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01YVlJfRE1BMl9TVEFSVF9BRERSKCkgYmZpbl9yZWFkUFRSKE1YVlJfRE1BMl9TVEFSVF9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX01YVlJfRE1BMl9TVEFSVF9BRERSKHZhbCkgYmZpbl93cml0ZVBUUihNWFZSX0RNQTJfU1RBUlRfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTVhWUl9ETUEyX0NPVU5UKCkgICAgYmZpbl9yZWFkMTYoTVhWUl9ETUEyX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX01YVlJfRE1BMl9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihNWFZSX0RNQTJfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01YVlJfRE1BMl9DVVJSX0FERFIoKSBiZmluX3JlYWRQVFIoTVhWUl9ETUEyX0NVUlJfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NWFZSX0RNQTJfQ1VSUl9BRERSKHZhbCkgYmZpbl93cml0ZVBUUihNWFZSX0RNQTJfQ1VSUl9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NWFZSX0RNQTJfQ1VSUl9DT1VOVCgpIGJmaW5fcmVhZDE2KE1YVlJfRE1BMl9DVVJSX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX01YVlJfRE1BMl9DVVJSX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KE1YVlJfRE1BMl9DVVJSX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NWFZSX0RNQTNfQ09ORklHKCkgICBiZmluX3JlYWQzMihNWFZSX0RNQTNfQ09ORklHKQorI2RlZmluZSBiZmluX3dyaXRlX01YVlJfRE1BM19DT05GSUcodmFsKSBiZmluX3dyaXRlMzIoTVhWUl9ETUEzX0NPTkZJRywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTVhWUl9ETUEzX1NUQVJUX0FERFIoKSBiZmluX3JlYWRQVFIoTVhWUl9ETUEzX1NUQVJUX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTVhWUl9ETUEzX1NUQVJUX0FERFIodmFsKSBiZmluX3dyaXRlUFRSKE1YVlJfRE1BM19TVEFSVF9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NWFZSX0RNQTNfQ09VTlQoKSAgICBiZmluX3JlYWQxNihNWFZSX0RNQTNfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTVhWUl9ETUEzX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KE1YVlJfRE1BM19DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTVhWUl9ETUEzX0NVUlJfQUREUigpIGJmaW5fcmVhZFBUUihNWFZSX0RNQTNfQ1VSUl9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX01YVlJfRE1BM19DVVJSX0FERFIodmFsKSBiZmluX3dyaXRlUFRSKE1YVlJfRE1BM19DVVJSX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01YVlJfRE1BM19DVVJSX0NPVU5UKCkgYmZpbl9yZWFkMTYoTVhWUl9ETUEzX0NVUlJfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTVhWUl9ETUEzX0NVUlJfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoTVhWUl9ETUEzX0NVUlJfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01YVlJfRE1BNF9DT05GSUcoKSAgIGJmaW5fcmVhZDMyKE1YVlJfRE1BNF9DT05GSUcpCisjZGVmaW5lIGJmaW5fd3JpdGVfTVhWUl9ETUE0X0NPTkZJRyh2YWwpIGJmaW5fd3JpdGUzMihNWFZSX0RNQTRfQ09ORklHLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NWFZSX0RNQTRfU1RBUlRfQUREUigpIGJmaW5fcmVhZFBUUihNWFZSX0RNQTRfU1RBUlRfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NWFZSX0RNQTRfU1RBUlRfQUREUih2YWwpIGJmaW5fd3JpdGVQVFIoTVhWUl9ETUE0X1NUQVJUX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01YVlJfRE1BNF9DT1VOVCgpICAgIGJmaW5fcmVhZDE2KE1YVlJfRE1BNF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NWFZSX0RNQTRfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoTVhWUl9ETUE0X0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NWFZSX0RNQTRfQ1VSUl9BRERSKCkgYmZpbl9yZWFkUFRSKE1YVlJfRE1BNF9DVVJSX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTVhWUl9ETUE0X0NVUlJfQUREUih2YWwpIGJmaW5fd3JpdGVQVFIoTVhWUl9ETUE0X0NVUlJfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTVhWUl9ETUE0X0NVUlJfQ09VTlQoKSBiZmluX3JlYWQxNihNWFZSX0RNQTRfQ1VSUl9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NWFZSX0RNQTRfQ1VSUl9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihNWFZSX0RNQTRfQ1VSUl9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTVhWUl9ETUE1X0NPTkZJRygpICAgYmZpbl9yZWFkMzIoTVhWUl9ETUE1X0NPTkZJRykKKyNkZWZpbmUgYmZpbl93cml0ZV9NWFZSX0RNQTVfQ09ORklHKHZhbCkgYmZpbl93cml0ZTMyKE1YVlJfRE1BNV9DT05GSUcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01YVlJfRE1BNV9TVEFSVF9BRERSKCkgYmZpbl9yZWFkUFRSKE1YVlJfRE1BNV9TVEFSVF9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX01YVlJfRE1BNV9TVEFSVF9BRERSKHZhbCkgYmZpbl93cml0ZVBUUihNWFZSX0RNQTVfU1RBUlRfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTVhWUl9ETUE1X0NPVU5UKCkgICAgYmZpbl9yZWFkMTYoTVhWUl9ETUE1X0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX01YVlJfRE1BNV9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihNWFZSX0RNQTVfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01YVlJfRE1BNV9DVVJSX0FERFIoKSBiZmluX3JlYWRQVFIoTVhWUl9ETUE1X0NVUlJfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NWFZSX0RNQTVfQ1VSUl9BRERSKHZhbCkgYmZpbl93cml0ZVBUUihNWFZSX0RNQTVfQ1VSUl9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NWFZSX0RNQTVfQ1VSUl9DT1VOVCgpIGJmaW5fcmVhZDE2KE1YVlJfRE1BNV9DVVJSX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX01YVlJfRE1BNV9DVVJSX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KE1YVlJfRE1BNV9DVVJSX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NWFZSX0RNQTZfQ09ORklHKCkgICBiZmluX3JlYWQzMihNWFZSX0RNQTZfQ09ORklHKQorI2RlZmluZSBiZmluX3dyaXRlX01YVlJfRE1BNl9DT05GSUcodmFsKSBiZmluX3dyaXRlMzIoTVhWUl9ETUE2X0NPTkZJRywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTVhWUl9ETUE2X1NUQVJUX0FERFIoKSBiZmluX3JlYWRQVFIoTVhWUl9ETUE2X1NUQVJUX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTVhWUl9ETUE2X1NUQVJUX0FERFIodmFsKSBiZmluX3dyaXRlUFRSKE1YVlJfRE1BNl9TVEFSVF9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NWFZSX0RNQTZfQ09VTlQoKSAgICBiZmluX3JlYWQxNihNWFZSX0RNQTZfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTVhWUl9ETUE2X0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KE1YVlJfRE1BNl9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTVhWUl9ETUE2X0NVUlJfQUREUigpIGJmaW5fcmVhZFBUUihNWFZSX0RNQTZfQ1VSUl9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX01YVlJfRE1BNl9DVVJSX0FERFIodmFsKSBiZmluX3dyaXRlUFRSKE1YVlJfRE1BNl9DVVJSX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01YVlJfRE1BNl9DVVJSX0NPVU5UKCkgYmZpbl9yZWFkMTYoTVhWUl9ETUE2X0NVUlJfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTVhWUl9ETUE2X0NVUlJfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoTVhWUl9ETUE2X0NVUlJfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01YVlJfRE1BN19DT05GSUcoKSAgIGJmaW5fcmVhZDMyKE1YVlJfRE1BN19DT05GSUcpCisjZGVmaW5lIGJmaW5fd3JpdGVfTVhWUl9ETUE3X0NPTkZJRyh2YWwpIGJmaW5fd3JpdGUzMihNWFZSX0RNQTdfQ09ORklHLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NWFZSX0RNQTdfU1RBUlRfQUREUigpIGJmaW5fcmVhZFBUUihNWFZSX0RNQTdfU1RBUlRfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NWFZSX0RNQTdfU1RBUlRfQUREUih2YWwpIGJmaW5fd3JpdGVQVFIoTVhWUl9ETUE3X1NUQVJUX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01YVlJfRE1BN19DT1VOVCgpICAgIGJmaW5fcmVhZDE2KE1YVlJfRE1BN19DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NWFZSX0RNQTdfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoTVhWUl9ETUE3X0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NWFZSX0RNQTdfQ1VSUl9BRERSKCkgYmZpbl9yZWFkUFRSKE1YVlJfRE1BN19DVVJSX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTVhWUl9ETUE3X0NVUlJfQUREUih2YWwpIGJmaW5fd3JpdGVQVFIoTVhWUl9ETUE3X0NVUlJfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTVhWUl9ETUE3X0NVUlJfQ09VTlQoKSBiZmluX3JlYWQxNihNWFZSX0RNQTdfQ1VSUl9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NWFZSX0RNQTdfQ1VSUl9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihNWFZSX0RNQTdfQ1VSUl9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTVhWUl9BUF9DVEwoKSAgICAgICAgYmZpbl9yZWFkMTYoTVhWUl9BUF9DVEwpCisjZGVmaW5lIGJmaW5fd3JpdGVfTVhWUl9BUF9DVEwodmFsKSAgICBiZmluX3dyaXRlMTYoTVhWUl9BUF9DVEwsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01YVlJfQVBSQl9TVEFSVF9BRERSKCkgYmZpbl9yZWFkUFRSKE1YVlJfQVBSQl9TVEFSVF9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX01YVlJfQVBSQl9TVEFSVF9BRERSKHZhbCkgYmZpbl93cml0ZVBUUihNWFZSX0FQUkJfU1RBUlRfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTVhWUl9BUFJCX0NVUlJfQUREUigpIGJmaW5fcmVhZFBUUihNWFZSX0FQUkJfQ1VSUl9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX01YVlJfQVBSQl9DVVJSX0FERFIodmFsKSBiZmluX3dyaXRlUFRSKE1YVlJfQVBSQl9DVVJSX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01YVlJfQVBUQl9TVEFSVF9BRERSKCkgYmZpbl9yZWFkUFRSKE1YVlJfQVBUQl9TVEFSVF9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX01YVlJfQVBUQl9TVEFSVF9BRERSKHZhbCkgYmZpbl93cml0ZVBUUihNWFZSX0FQVEJfU1RBUlRfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTVhWUl9BUFRCX0NVUlJfQUREUigpIGJmaW5fcmVhZFBUUihNWFZSX0FQVEJfQ1VSUl9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX01YVlJfQVBUQl9DVVJSX0FERFIodmFsKSBiZmluX3dyaXRlUFRSKE1YVlJfQVBUQl9DVVJSX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01YVlJfQ01fQ1RMKCkgICAgICAgIGJmaW5fcmVhZDMyKE1YVlJfQ01fQ1RMKQorI2RlZmluZSBiZmluX3dyaXRlX01YVlJfQ01fQ1RMKHZhbCkgICAgYmZpbl93cml0ZTMyKE1YVlJfQ01fQ1RMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NWFZSX0NNUkJfU1RBUlRfQUREUigpIGJmaW5fcmVhZFBUUihNWFZSX0NNUkJfU1RBUlRfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NWFZSX0NNUkJfU1RBUlRfQUREUih2YWwpIGJmaW5fd3JpdGVQVFIoTVhWUl9DTVJCX1NUQVJUX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01YVlJfQ01SQl9DVVJSX0FERFIoKSBiZmluX3JlYWRQVFIoTVhWUl9DTVJCX0NVUlJfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NWFZSX0NNUkJfQ1VSUl9BRERSKHZhbCkgYmZpbl93cml0ZVBUUihNWFZSX0NNUkJfQ1VSUl9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NWFZSX0NNVEJfU1RBUlRfQUREUigpIGJmaW5fcmVhZFBUUihNWFZSX0NNVEJfU1RBUlRfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NWFZSX0NNVEJfU1RBUlRfQUREUih2YWwpIGJmaW5fd3JpdGVQVFIoTVhWUl9DTVRCX1NUQVJUX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01YVlJfQ01UQl9DVVJSX0FERFIoKSBiZmluX3JlYWRQVFIoTVhWUl9DTVRCX0NVUlJfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NWFZSX0NNVEJfQ1VSUl9BRERSKHZhbCkgYmZpbl93cml0ZVBUUihNWFZSX0NNVEJfQ1VSUl9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NWFZSX1JSREJfU1RBUlRfQUREUigpIGJmaW5fcmVhZFBUUihNWFZSX1JSREJfU1RBUlRfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NWFZSX1JSREJfU1RBUlRfQUREUih2YWwpIGJmaW5fd3JpdGVQVFIoTVhWUl9SUkRCX1NUQVJUX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01YVlJfUlJEQl9DVVJSX0FERFIoKSBiZmluX3JlYWRQVFIoTVhWUl9SUkRCX0NVUlJfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NWFZSX1JSREJfQ1VSUl9BRERSKHZhbCkgYmZpbl93cml0ZVBUUihNWFZSX1JSREJfQ1VSUl9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NWFZSX1BBVF9EQVRBXzAoKSAgICBiZmluX3JlYWQzMihNWFZSX1BBVF9EQVRBXzApCisjZGVmaW5lIGJmaW5fd3JpdGVfTVhWUl9QQVRfREFUQV8wKHZhbCkgYmZpbl93cml0ZTMyKE1YVlJfUEFUX0RBVEFfMCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTVhWUl9QQVRfRU5fMCgpICAgICAgYmZpbl9yZWFkMzIoTVhWUl9QQVRfRU5fMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NWFZSX1BBVF9FTl8wKHZhbCkgIGJmaW5fd3JpdGUzMihNWFZSX1BBVF9FTl8wLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NWFZSX1BBVF9EQVRBXzEoKSAgICBiZmluX3JlYWQzMihNWFZSX1BBVF9EQVRBXzEpCisjZGVmaW5lIGJmaW5fd3JpdGVfTVhWUl9QQVRfREFUQV8xKHZhbCkgYmZpbl93cml0ZTMyKE1YVlJfUEFUX0RBVEFfMSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTVhWUl9QQVRfRU5fMSgpICAgICAgYmZpbl9yZWFkMzIoTVhWUl9QQVRfRU5fMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9NWFZSX1BBVF9FTl8xKHZhbCkgIGJmaW5fd3JpdGUzMihNWFZSX1BBVF9FTl8xLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NWFZSX0ZSQU1FX0NOVF8wKCkgICBiZmluX3JlYWQxNihNWFZSX0ZSQU1FX0NOVF8wKQorI2RlZmluZSBiZmluX3dyaXRlX01YVlJfRlJBTUVfQ05UXzAodmFsKSBiZmluX3dyaXRlMTYoTVhWUl9GUkFNRV9DTlRfMCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTVhWUl9GUkFNRV9DTlRfMSgpICAgYmZpbl9yZWFkMTYoTVhWUl9GUkFNRV9DTlRfMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9NWFZSX0ZSQU1FX0NOVF8xKHZhbCkgYmZpbl93cml0ZTE2KE1YVlJfRlJBTUVfQ05UXzEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01YVlJfUk9VVElOR18wKCkgICAgIGJmaW5fcmVhZDMyKE1YVlJfUk9VVElOR18wKQorI2RlZmluZSBiZmluX3dyaXRlX01YVlJfUk9VVElOR18wKHZhbCkgYmZpbl93cml0ZTMyKE1YVlJfUk9VVElOR18wLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NWFZSX1JPVVRJTkdfMSgpICAgICBiZmluX3JlYWQzMihNWFZSX1JPVVRJTkdfMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9NWFZSX1JPVVRJTkdfMSh2YWwpIGJmaW5fd3JpdGUzMihNWFZSX1JPVVRJTkdfMSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTVhWUl9ST1VUSU5HXzIoKSAgICAgYmZpbl9yZWFkMzIoTVhWUl9ST1VUSU5HXzIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTVhWUl9ST1VUSU5HXzIodmFsKSBiZmluX3dyaXRlMzIoTVhWUl9ST1VUSU5HXzIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01YVlJfUk9VVElOR18zKCkgICAgIGJmaW5fcmVhZDMyKE1YVlJfUk9VVElOR18zKQorI2RlZmluZSBiZmluX3dyaXRlX01YVlJfUk9VVElOR18zKHZhbCkgYmZpbl93cml0ZTMyKE1YVlJfUk9VVElOR18zLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NWFZSX1JPVVRJTkdfNCgpICAgICBiZmluX3JlYWQzMihNWFZSX1JPVVRJTkdfNCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NWFZSX1JPVVRJTkdfNCh2YWwpIGJmaW5fd3JpdGUzMihNWFZSX1JPVVRJTkdfNCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTVhWUl9ST1VUSU5HXzUoKSAgICAgYmZpbl9yZWFkMzIoTVhWUl9ST1VUSU5HXzUpCisjZGVmaW5lIGJmaW5fd3JpdGVfTVhWUl9ST1VUSU5HXzUodmFsKSBiZmluX3dyaXRlMzIoTVhWUl9ST1VUSU5HXzUsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01YVlJfUk9VVElOR182KCkgICAgIGJmaW5fcmVhZDMyKE1YVlJfUk9VVElOR182KQorI2RlZmluZSBiZmluX3dyaXRlX01YVlJfUk9VVElOR182KHZhbCkgYmZpbl93cml0ZTMyKE1YVlJfUk9VVElOR182LCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NWFZSX1JPVVRJTkdfNygpICAgICBiZmluX3JlYWQzMihNWFZSX1JPVVRJTkdfNykKKyNkZWZpbmUgYmZpbl93cml0ZV9NWFZSX1JPVVRJTkdfNyh2YWwpIGJmaW5fd3JpdGUzMihNWFZSX1JPVVRJTkdfNywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTVhWUl9ST1VUSU5HXzgoKSAgICAgYmZpbl9yZWFkMzIoTVhWUl9ST1VUSU5HXzgpCisjZGVmaW5lIGJmaW5fd3JpdGVfTVhWUl9ST1VUSU5HXzgodmFsKSBiZmluX3dyaXRlMzIoTVhWUl9ST1VUSU5HXzgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01YVlJfUk9VVElOR185KCkgICAgIGJmaW5fcmVhZDMyKE1YVlJfUk9VVElOR185KQorI2RlZmluZSBiZmluX3dyaXRlX01YVlJfUk9VVElOR185KHZhbCkgYmZpbl93cml0ZTMyKE1YVlJfUk9VVElOR185LCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NWFZSX1JPVVRJTkdfMTAoKSAgICBiZmluX3JlYWQzMihNWFZSX1JPVVRJTkdfMTApCisjZGVmaW5lIGJmaW5fd3JpdGVfTVhWUl9ST1VUSU5HXzEwKHZhbCkgYmZpbl93cml0ZTMyKE1YVlJfUk9VVElOR18xMCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTVhWUl9ST1VUSU5HXzExKCkgICAgYmZpbl9yZWFkMzIoTVhWUl9ST1VUSU5HXzExKQorI2RlZmluZSBiZmluX3dyaXRlX01YVlJfUk9VVElOR18xMSh2YWwpIGJmaW5fd3JpdGUzMihNWFZSX1JPVVRJTkdfMTEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01YVlJfUk9VVElOR18xMigpICAgIGJmaW5fcmVhZDMyKE1YVlJfUk9VVElOR18xMikKKyNkZWZpbmUgYmZpbl93cml0ZV9NWFZSX1JPVVRJTkdfMTIodmFsKSBiZmluX3dyaXRlMzIoTVhWUl9ST1VUSU5HXzEyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NWFZSX1JPVVRJTkdfMTMoKSAgICBiZmluX3JlYWQzMihNWFZSX1JPVVRJTkdfMTMpCisjZGVmaW5lIGJmaW5fd3JpdGVfTVhWUl9ST1VUSU5HXzEzKHZhbCkgYmZpbl93cml0ZTMyKE1YVlJfUk9VVElOR18xMywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTVhWUl9ST1VUSU5HXzE0KCkgICAgYmZpbl9yZWFkMzIoTVhWUl9ST1VUSU5HXzE0KQorI2RlZmluZSBiZmluX3dyaXRlX01YVlJfUk9VVElOR18xNCh2YWwpIGJmaW5fd3JpdGUzMihNWFZSX1JPVVRJTkdfMTQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01YVlJfUExMX0NUTF8xKCkgICAgIGJmaW5fcmVhZDMyKE1YVlJfUExMX0NUTF8xKQorI2RlZmluZSBiZmluX3dyaXRlX01YVlJfUExMX0NUTF8xKHZhbCkgYmZpbl93cml0ZTMyKE1YVlJfUExMX0NUTF8xLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NWFZSX0JMT0NLX0NOVCgpICAgICBiZmluX3JlYWQxNihNWFZSX0JMT0NLX0NOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NWFZSX0JMT0NLX0NOVCh2YWwpIGJmaW5fd3JpdGUxNihNWFZSX0JMT0NLX0NOVCwgdmFsKQorCisjZW5kaWYgLyogX0NERUZfQkY1MzlfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L2luY2x1ZGUvbWFjaC9kZWZCRjUzOS5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L2luY2x1ZGUvbWFjaC9kZWZCRjUzOS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhZGJmY2MKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzgvaW5jbHVkZS9tYWNoL2RlZkJGNTM5LmgKQEAgLTAsMCArMSw0MjQzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgUHVibGljCisgKiBMaWNlbnNlLiBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogTm9uLUdQTCBMaWNlbnNlIGFsc28gYXZhaWxhYmxlIGFzIHBhcnQgb2YgVmlzdWFsRFNQKysKKyAqIGh0dHA6Ly93d3cuYW5hbG9nLmNvbS9wcm9jZXNzb3JzL3Jlc291cmNlcy9jcm9zc2NvcmUvdmlzdWFsRHNwRGV2U29mdHdhcmUuaHRtbAorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMS0yMDA1IEFuYWxvZyBEZXZpY2VzLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQKKyAqCisgKiBUaGlzIGZpbGUgdW5kZXIgc291cmNlIGNvZGUgY29udHJvbCwgcGxlYXNlIHNlbmQgYnVncyBvciBjaGFuZ2VzIHRvOgorICogZHNwdG9vbHMuc3VwcG9ydEBhbmFsb2cuY29tCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBGaWxlOiAgICAgICAgIGluY2x1ZGUvYXNtLWJsYWNrZmluL21hY2gtYmY1MzgvZGVmQkY1MzkuaAorICogQmFzZWQgb246CisgKiBBdXRob3I6CisgKgorICogQ3JlYXRlZDoKKyAqIERlc2NyaXB0aW9uOgorICoKKyAqIFJldjoKKyAqCisgKiBNb2RpZmllZDoKKyAqCisgKiBCdWdzOiAgICAgICAgIEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLgorICogSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqLworLyogU1lTVEVNICYgTU0gUkVHSVNURVIgQklUICYgQUREUkVTUyBERUZJTklUSU9OUyBGT1IgQURTUC1CRjUzOC85ICovCisKKyNpZm5kZWYgX0RFRl9CRjUzOV9ICisjZGVmaW5lIF9ERUZfQkY1MzlfSAorCisvKiBpbmNsdWRlIGFsbCBDb3JlIHJlZ2lzdGVycyBhbmQgYml0IGRlZmluaXRpb25zICovCisjaW5jbHVkZSA8YXNtL2RlZl9MUEJsYWNrZmluLmg+CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiBTeXN0ZW0gTU1SIFJlZ2lzdGVyIE1hcCAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiBDbG9jay9SZWd1bGF0b3IgQ29udHJvbCAoMHhGRkMwMDAwMCAtIDB4RkZDMDAwRkYpICovCisjZGVmaW5lCVBMTF9DVEwJCQkweEZGQzAwMDAwCS8qIFBMTCBDb250cm9sIHJlZ2lzdGVyICgxNi1iaXQpICovCisjZGVmaW5lCVBMTF9ESVYJCQkweEZGQzAwMDA0CS8qIFBMTCBEaXZpZGUgUmVnaXN0ZXIgKDE2LWJpdCkgKi8KKyNkZWZpbmUJVlJfQ1RMCQkJMHhGRkMwMDAwOAkvKiBWb2x0YWdlIFJlZ3VsYXRvciBDb250cm9sIFJlZ2lzdGVyICgxNi1iaXQpICovCisjZGVmaW5lCVBMTF9TVEFUCQkweEZGQzAwMDBDCS8qIFBMTCBTdGF0dXMgcmVnaXN0ZXIgKDE2LWJpdCkgKi8KKyNkZWZpbmUJUExMX0xPQ0tDTlQJCTB4RkZDMDAwMTAJLyogUExMIExvY2sJQ291bnQgcmVnaXN0ZXIgKDE2LWJpdCkgKi8KKyNkZWZpbmUJQ0hJUElECQkJMHhGRkMwMDAxNAkvKiBDaGlwCUlEIFJlZ2lzdGVyICovCisKKy8qIENISVBJRCBNYXNrcyAqLworI2RlZmluZSBDSElQSURfVkVSU0lPTiAgICAgICAgIDB4RjAwMDAwMDAKKyNkZWZpbmUgQ0hJUElEX0ZBTUlMWSAgICAgICAgICAweDBGRkZGMDAwCisjZGVmaW5lIENISVBJRF9NQU5VRkFDVFVSRSAgICAgMHgwMDAwMEZGRQorCisvKiBTeXN0ZW0gSW50ZXJydXB0IENvbnRyb2xsZXIgKDB4RkZDMDAxMDAgLSAweEZGQzAwMUZGKSAqLworI2RlZmluZQlTV1JTVAkJCTB4RkZDMDAxMDAgIC8qIFNvZnR3YXJlCVJlc2V0IFJlZ2lzdGVyICgxNi1iaXQpICovCisjZGVmaW5lCVNZU0NSCQkJMHhGRkMwMDEwNCAgLyogU3lzdGVtIENvbmZpZ3VyYXRpb24gcmVnaXN0ZSAqLworI2RlZmluZQlTSUNfSU1BU0swCQkweEZGQzAwMTBDICAvKiBJbnRlcnJ1cHQgTWFzayBSZWdpc3RlciAqLworI2RlZmluZQlTSUNfSUFSMAkJMHhGRkMwMDExMCAgLyogSW50ZXJydXB0IEFzc2lnbm1lbnQgUmVnaXN0ZXIgMCAqLworI2RlZmluZQlTSUNfSUFSMQkJMHhGRkMwMDExNCAgLyogSW50ZXJydXB0IEFzc2lnbm1lbnQgUmVnaXN0ZXIgMSAqLworI2RlZmluZQlTSUNfSUFSMgkJMHhGRkMwMDExOCAgLyogSW50ZXJydXB0IEFzc2lnbm1lbnQgUmVnaXN0ZXIgMiAqLworI2RlZmluZQlTSUNfSUFSMwkJCTB4RkZDMDAxMUMJLyogSW50ZXJydXB0IEFzc2lnbm1lbnQJUmVnaXN0ZXIgMyAqLworI2RlZmluZQlTSUNfSVNSMAkJCTB4RkZDMDAxMjAgIC8qIEludGVycnVwdCBTdGF0dXMJUmVnaXN0ZXIgKi8KKyNkZWZpbmUJU0lDX0lXUjAJCQkweEZGQzAwMTI0ICAvKiBJbnRlcnJ1cHQgV2FrZXVwCVJlZ2lzdGVyICovCisjZGVmaW5lCVNJQ19JTUFTSzEJCQkweEZGQzAwMTI4CS8qIEludGVycnVwdCBNYXNrIFJlZ2lzdGVyIDEgKi8KKyNkZWZpbmUJU0lDX0lTUjEJCQkweEZGQzAwMTJDCS8qIEludGVycnVwdCBTdGF0dXMgUmVnaXN0ZXIgMSAqLworI2RlZmluZQlTSUNfSVdSMQkJCTB4RkZDMDAxMzAJLyogSW50ZXJydXB0IFdha2V1cCBSZWdpc3RlciAxICovCisjZGVmaW5lCVNJQ19JQVI0CQkJMHhGRkMwMDEzNAkvKiBJbnRlcnJ1cHQgQXNzaWdubWVudAlSZWdpc3RlciA0ICovCisjZGVmaW5lCVNJQ19JQVI1CQkJMHhGRkMwMDEzOAkvKiBJbnRlcnJ1cHQgQXNzaWdubWVudAlSZWdpc3RlciA1ICovCisjZGVmaW5lCVNJQ19JQVI2CQkJMHhGRkMwMDEzQwkvKiBJbnRlcnJ1cHQgQXNzaWdubWVudAlSZWdpc3RlciA2ICovCisKKworLyogV2F0Y2hkb2cgVGltZXIgKDB4RkZDMDAyMDAgLQkweEZGQzAwMkZGKSAqLworI2RlZmluZQlXRE9HX0NUTAkweEZGQzAwMjAwICAvKiBXYXRjaGRvZwlDb250cm9sCVJlZ2lzdGVyICovCisjZGVmaW5lCVdET0dfQ05UCTB4RkZDMDAyMDQgIC8qIFdhdGNoZG9nCUNvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lCVdET0dfU1RBVAkweEZGQzAwMjA4ICAvKiBXYXRjaGRvZwlTdGF0dXMgUmVnaXN0ZXIgKi8KKworCisvKiBSZWFsCVRpbWUgQ2xvY2sgKDB4RkZDMDAzMDAgLSAweEZGQzAwM0ZGKSAqLworI2RlZmluZQlSVENfU1RBVAkweEZGQzAwMzAwICAvKiBSVEMgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lCVJUQ19JQ1RMCTB4RkZDMDAzMDQgIC8qIFJUQyBJbnRlcnJ1cHQgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZQlSVENfSVNUQVQJMHhGRkMwMDMwOCAgLyogUlRDIEludGVycnVwdCBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJUlRDX1NXQ05UCTB4RkZDMDAzMEMgIC8qIFJUQyBTdG9wd2F0Y2ggQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJUlRDX0FMQVJNCTB4RkZDMDAzMTAgIC8qIFJUQyBBbGFybSBUaW1lIFJlZ2lzdGVyICovCisjZGVmaW5lCVJUQ19GQVNUCTB4RkZDMDAzMTQgIC8qIFJUQyBQcmVzY2FsZXIgRW5hYmxlIFJlZ2lzdGVyICovCisjZGVmaW5lCVJUQ19QUkVOCQkweEZGQzAwMzE0ICAvKiBSVEMgUHJlc2NhbGVyIEVuYWJsZSBSZWdpc3RlciAoYWx0ZXJuYXRlCW1hY3JvKSAqLworCisKKy8qIFVBUlQwIENvbnRyb2xsZXIgKDB4RkZDMDA0MDAJLSAweEZGQzAwNEZGKSAqLworI2RlZmluZQlVQVJUMF9USFIJICAgICAgMHhGRkMwMDQwMCAgLyogVHJhbnNtaXQgSG9sZGluZyByZWdpc3RlciAqLworI2RlZmluZQlVQVJUMF9SQlIJICAgICAgMHhGRkMwMDQwMCAgLyogUmVjZWl2ZSBCdWZmZXIgcmVnaXN0ZXIgKi8KKyNkZWZpbmUJVUFSVDBfRExMCSAgICAgIDB4RkZDMDA0MDAgIC8qIERpdmlzb3IgTGF0Y2ggKExvdy1CeXRlKSAqLworI2RlZmluZQlVQVJUMF9JRVIJICAgICAgMHhGRkMwMDQwNCAgLyogSW50ZXJydXB0IEVuYWJsZSBSZWdpc3RlciAqLworI2RlZmluZQlVQVJUMF9ETEgJICAgICAgMHhGRkMwMDQwNCAgLyogRGl2aXNvciBMYXRjaCAoSGlnaC1CeXRlKSAqLworI2RlZmluZQlVQVJUMF9JSVIJICAgICAgMHhGRkMwMDQwOCAgLyogSW50ZXJydXB0IElkZW50aWZpY2F0aW9uIFJlZ2lzdGVyICovCisjZGVmaW5lCVVBUlQwX0xDUgkgICAgICAweEZGQzAwNDBDICAvKiBMaW5lIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJVUFSVDBfTUNSCQkJIDB4RkZDMDA0MTAgIC8qCU1vZGVtIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJVUFSVDBfTFNSCSAgICAgIDB4RkZDMDA0MTQgIC8qIExpbmUgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lCVVBUlQwX1NDUgkgICAgICAweEZGQzAwNDFDICAvKiBTQ1IgU2NyYXRjaCBSZWdpc3RlciAqLworI2RlZmluZQlVQVJUMF9HQ1RMCQkgICAgIDB4RkZDMDA0MjQJIC8qIEdsb2JhbCBDb250cm9sIFJlZ2lzdGVyICovCisKKworLyogU1BJMAlDb250cm9sbGVyICgweEZGQzAwNTAwIC0gMHhGRkMwMDVGRikgKi8KKworI2RlZmluZQlTUEkwX0NUTAkJCTB4RkZDMDA1MDAgIC8qIFNQSTAgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZQlTUEkwX0ZMRwkJCTB4RkZDMDA1MDQgIC8qIFNQSTAgRmxhZyByZWdpc3RlciAqLworI2RlZmluZQlTUEkwX1NUQVQJCQkweEZGQzAwNTA4ICAvKiBTUEkwIFN0YXR1cyByZWdpc3RlciAqLworI2RlZmluZQlTUEkwX1REQlIJCQkweEZGQzAwNTBDICAvKiBTUEkwIFRyYW5zbWl0IERhdGEgQnVmZmVyIFJlZ2lzdGVyICovCisjZGVmaW5lCVNQSTBfUkRCUgkJCTB4RkZDMDA1MTAgIC8qIFNQSTAgUmVjZWl2ZSBEYXRhIEJ1ZmZlcglSZWdpc3RlciAqLworI2RlZmluZQlTUEkwX0JBVUQJCQkweEZGQzAwNTE0ICAvKiBTUEkwIEJhdWQgcmF0ZSBSZWdpc3RlciAqLworI2RlZmluZQlTUEkwX1NIQURPVwkJCTB4RkZDMDA1MTggIC8qIFNQSTBfUkRCUiBTaGFkb3cJUmVnaXN0ZXIgKi8KKyNkZWZpbmUgU1BJMF9SRUdCQVNFCQkJU1BJMF9DVEwKKworCisvKiBUSU1FUiAwLCAxLCAyIFJlZ2lzdGVycyAoMHhGRkMwMDYwMCAtIDB4RkZDMDA2RkYpICovCisjZGVmaW5lCVRJTUVSMF9DT05GSUcJCQkweEZGQzAwNjAwICAgICAvKiBUaW1lcgkwIENvbmZpZ3VyYXRpb24JUmVnaXN0ZXIgKi8KKyNkZWZpbmUJVElNRVIwX0NPVU5URVIJCQkJMHhGRkMwMDYwNCAgICAgLyogVGltZXIJMCBDb3VudGVyIFJlZ2lzdGVyICovCisjZGVmaW5lCVRJTUVSMF9QRVJJT0QJCQkweEZGQzAwNjA4ICAgICAvKiBUaW1lcgkwIFBlcmlvZCBSZWdpc3RlciAqLworI2RlZmluZQlUSU1FUjBfV0lEVEgJCQkweEZGQzAwNjBDICAgICAvKiBUaW1lcgkwIFdpZHRoCVJlZ2lzdGVyICovCisKKyNkZWZpbmUJVElNRVIxX0NPTkZJRwkJCTB4RkZDMDA2MTAJLyogIFRpbWVyIDEgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAgICovCisjZGVmaW5lCVRJTUVSMV9DT1VOVEVSCQkJMHhGRkMwMDYxNAkvKiAgVGltZXIgMSBDb3VudGVyIFJlZ2lzdGVyCSAgICAgKi8KKyNkZWZpbmUJVElNRVIxX1BFUklPRAkJCTB4RkZDMDA2MTgJLyogIFRpbWVyIDEgUGVyaW9kIFJlZ2lzdGVyCSAgICAgKi8KKyNkZWZpbmUJVElNRVIxX1dJRFRICQkJMHhGRkMwMDYxQwkvKiAgVGltZXIgMSBXaWR0aCBSZWdpc3RlcgkgICAgICovCisKKyNkZWZpbmUJVElNRVIyX0NPTkZJRwkJCTB4RkZDMDA2MjAJLyogVGltZXIgMiBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICAgKi8KKyNkZWZpbmUJVElNRVIyX0NPVU5URVIJCQkweEZGQzAwNjI0CS8qIFRpbWVyIDIgQ291bnRlciBSZWdpc3RlcgkgICAgKi8KKyNkZWZpbmUJVElNRVIyX1BFUklPRAkJCTB4RkZDMDA2MjgJLyogVGltZXIgMiBQZXJpb2QgUmVnaXN0ZXIJICAgICovCisjZGVmaW5lCVRJTUVSMl9XSURUSAkJCTB4RkZDMDA2MkMJLyogVGltZXIgMiBXaWR0aCBSZWdpc3RlcgkgICAgKi8KKworI2RlZmluZQlUSU1FUl9FTkFCTEUJCQkJMHhGRkMwMDY0MAkvKiBUaW1lciBFbmFibGUJUmVnaXN0ZXIgKi8KKyNkZWZpbmUJVElNRVJfRElTQUJMRQkJCQkweEZGQzAwNjQ0CS8qIFRpbWVyIERpc2FibGUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJVElNRVJfU1RBVFVTCQkJCTB4RkZDMDA2NDgJLyogVGltZXIgU3RhdHVzCVJlZ2lzdGVyICovCisKKworLyogUHJvZ3JhbW1hYmxlCUZsYWdzICgweEZGQzAwNzAwIC0gMHhGRkMwMDdGRikgKi8KKyNkZWZpbmUJRklPX0ZMQUdfRAkJCQkweEZGQzAwNzAwICAvKiBGbGFnIE1hc2sgdG8gZGlyZWN0bHkgc3BlY2lmeSBzdGF0ZSBvZiBwaW5zICovCisjZGVmaW5lCUZJT19GTEFHX0MJCQkweEZGQzAwNzA0ICAvKiBQZXJpcGhlcmFsIEludGVycnVwdCBGbGFnIFJlZ2lzdGVyIChjbGVhcikgKi8KKyNkZWZpbmUJRklPX0ZMQUdfUwkJCTB4RkZDMDA3MDggIC8qIFBlcmlwaGVyYWwgSW50ZXJydXB0IEZsYWcgUmVnaXN0ZXIgKHNldCkgKi8KKyNkZWZpbmUJRklPX0ZMQUdfVAkJCQkJMHhGRkMwMDcwQyAgLyogRmxhZyBNYXNrIHRvIGRpcmVjdGx5IHRvZ2dsZSBzdGF0ZSBvZiBwaW5zICovCisjZGVmaW5lCUZJT19NQVNLQV9ECQkJMHhGRkMwMDcxMCAgLyogRmxhZyBNYXNrIEludGVycnVwdCBBIFJlZ2lzdGVyIChzZXQgZGlyZWN0bHkpICovCisjZGVmaW5lCUZJT19NQVNLQV9DCQkJMHhGRkMwMDcxNCAgLyogRmxhZyBNYXNrIEludGVycnVwdCBBIFJlZ2lzdGVyIChjbGVhcikgKi8KKyNkZWZpbmUJRklPX01BU0tBX1MJCQkweEZGQzAwNzE4ICAvKiBGbGFnIE1hc2sgSW50ZXJydXB0IEEgUmVnaXN0ZXIgKHNldCkgKi8KKyNkZWZpbmUJRklPX01BU0tBX1QJCQkweEZGQzAwNzFDICAvKiBGbGFnIE1hc2sgSW50ZXJydXB0IEEgUmVnaXN0ZXIgKHRvZ2dsZSkgKi8KKyNkZWZpbmUJRklPX01BU0tCX0QJCQkweEZGQzAwNzIwICAvKiBGbGFnIE1hc2sgSW50ZXJydXB0IEIgUmVnaXN0ZXIgKHNldCBkaXJlY3RseSkgKi8KKyNkZWZpbmUJRklPX01BU0tCX0MJCQkweEZGQzAwNzI0ICAvKiBGbGFnIE1hc2sgSW50ZXJydXB0IEIgUmVnaXN0ZXIgKGNsZWFyKSAqLworI2RlZmluZQlGSU9fTUFTS0JfUwkJCTB4RkZDMDA3MjggIC8qIEZsYWcgTWFzayBJbnRlcnJ1cHQgQiBSZWdpc3RlciAoc2V0KSAqLworI2RlZmluZQlGSU9fTUFTS0JfVAkJCTB4RkZDMDA3MkMgIC8qIEZsYWcgTWFzayBJbnRlcnJ1cHQgQiBSZWdpc3RlciAodG9nZ2xlKSAqLworI2RlZmluZQlGSU9fRElSCQkJCTB4RkZDMDA3MzAgIC8qIFBlcmlwaGVyYWwgRmxhZyBEaXJlY3Rpb24gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRklPX1BPTEFSCQkJMHhGRkMwMDczNCAgLyogRmxhZyBTb3VyY2UgUG9sYXJpdHkgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRklPX0VER0UJCQkweEZGQzAwNzM4ICAvKiBGbGFnIFNvdXJjZSBTZW5zaXRpdml0eSBSZWdpc3RlciAqLworI2RlZmluZQlGSU9fQk9USAkJCTB4RkZDMDA3M0MgIC8qIEZsYWcgU2V0CW9uIEJPVEgJRWRnZXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRklPX0lORU4JCQkJCTB4RkZDMDA3NDAgIC8qIEZsYWcgSW5wdXQgRW5hYmxlIFJlZ2lzdGVyICAqLworCisKKy8qIFNQT1JUMCBDb250cm9sbGVyICgweEZGQzAwODAwIC0gMHhGRkMwMDhGRikgKi8KKyNkZWZpbmUJU1BPUlQwX1RDUjEJCQkJMHhGRkMwMDgwMCAgLyogU1BPUlQwIFRyYW5zbWl0IENvbmZpZ3VyYXRpb24gMSBSZWdpc3RlciAqLworI2RlZmluZQlTUE9SVDBfVENSMgkJCQkweEZGQzAwODA0ICAvKiBTUE9SVDAgVHJhbnNtaXQgQ29uZmlndXJhdGlvbiAyIFJlZ2lzdGVyICovCisjZGVmaW5lCVNQT1JUMF9UQ0xLRElWCQkJMHhGRkMwMDgwOCAgLyogU1BPUlQwIFRyYW5zbWl0IENsb2NrIERpdmlkZXIgKi8KKyNkZWZpbmUJU1BPUlQwX1RGU0RJVgkJCTB4RkZDMDA4MEMgIC8qIFNQT1JUMCBUcmFuc21pdCBGcmFtZSBTeW5jIERpdmlkZXIgKi8KKyNkZWZpbmUJU1BPUlQwX1RYCQkJMHhGRkMwMDgxMCAgLyogU1BPUlQwIFRYIERhdGEgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJU1BPUlQwX1JYCQkJMHhGRkMwMDgxOCAgLyogU1BPUlQwIFJYIERhdGEgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJU1BPUlQwX1JDUjEJCQkJMHhGRkMwMDgyMCAgLyogU1BPUlQwIFRyYW5zbWl0IENvbmZpZ3VyYXRpb24gMSBSZWdpc3RlciAqLworI2RlZmluZQlTUE9SVDBfUkNSMgkJCQkweEZGQzAwODI0ICAvKiBTUE9SVDAgVHJhbnNtaXQgQ29uZmlndXJhdGlvbiAyIFJlZ2lzdGVyICovCisjZGVmaW5lCVNQT1JUMF9SQ0xLRElWCQkJMHhGRkMwMDgyOCAgLyogU1BPUlQwIFJlY2VpdmUgQ2xvY2sgRGl2aWRlciAqLworI2RlZmluZQlTUE9SVDBfUkZTRElWCQkJMHhGRkMwMDgyQyAgLyogU1BPUlQwIFJlY2VpdmUgRnJhbWUgU3luYyBEaXZpZGVyICovCisjZGVmaW5lCVNQT1JUMF9TVEFUCQkJMHhGRkMwMDgzMCAgLyogU1BPUlQwIFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZQlTUE9SVDBfQ0hOTAkJCTB4RkZDMDA4MzQgIC8qIFNQT1JUMCBDdXJyZW50IENoYW5uZWwgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJU1BPUlQwX01DTUMxCQkJMHhGRkMwMDgzOCAgLyogU1BPUlQwIE11bHRpLUNoYW5uZWwgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAxICovCisjZGVmaW5lCVNQT1JUMF9NQ01DMgkJCTB4RkZDMDA4M0MgIC8qIFNQT1JUMCBNdWx0aS1DaGFubmVsIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgMiAqLworI2RlZmluZQlTUE9SVDBfTVRDUzAJCQkweEZGQzAwODQwICAvKiBTUE9SVDAgTXVsdGktQ2hhbm5lbCBUcmFuc21pdCBTZWxlY3QgUmVnaXN0ZXIgMCAqLworI2RlZmluZQlTUE9SVDBfTVRDUzEJCQkweEZGQzAwODQ0ICAvKiBTUE9SVDAgTXVsdGktQ2hhbm5lbCBUcmFuc21pdCBTZWxlY3QgUmVnaXN0ZXIgMSAqLworI2RlZmluZQlTUE9SVDBfTVRDUzIJCQkweEZGQzAwODQ4ICAvKiBTUE9SVDAgTXVsdGktQ2hhbm5lbCBUcmFuc21pdCBTZWxlY3QgUmVnaXN0ZXIgMiAqLworI2RlZmluZQlTUE9SVDBfTVRDUzMJCQkweEZGQzAwODRDICAvKiBTUE9SVDAgTXVsdGktQ2hhbm5lbCBUcmFuc21pdCBTZWxlY3QgUmVnaXN0ZXIgMyAqLworI2RlZmluZQlTUE9SVDBfTVJDUzAJCQkweEZGQzAwODUwICAvKiBTUE9SVDAgTXVsdGktQ2hhbm5lbCBSZWNlaXZlIFNlbGVjdCBSZWdpc3RlciAwICovCisjZGVmaW5lCVNQT1JUMF9NUkNTMQkJCTB4RkZDMDA4NTQgIC8qIFNQT1JUMCBNdWx0aS1DaGFubmVsIFJlY2VpdmUgU2VsZWN0IFJlZ2lzdGVyIDEgKi8KKyNkZWZpbmUJU1BPUlQwX01SQ1MyCQkJMHhGRkMwMDg1OCAgLyogU1BPUlQwIE11bHRpLUNoYW5uZWwgUmVjZWl2ZSBTZWxlY3QgUmVnaXN0ZXIgMiAqLworI2RlZmluZQlTUE9SVDBfTVJDUzMJCQkweEZGQzAwODVDICAvKiBTUE9SVDAgTXVsdGktQ2hhbm5lbCBSZWNlaXZlIFNlbGVjdCBSZWdpc3RlciAzICovCisKKworLyogU1BPUlQxIENvbnRyb2xsZXIgKDB4RkZDMDA5MDAgLSAweEZGQzAwOUZGKSAqLworI2RlZmluZQlTUE9SVDFfVENSMQkJCQkweEZGQzAwOTAwICAvKiBTUE9SVDEgVHJhbnNtaXQgQ29uZmlndXJhdGlvbiAxIFJlZ2lzdGVyICovCisjZGVmaW5lCVNQT1JUMV9UQ1IyCQkJCTB4RkZDMDA5MDQgIC8qIFNQT1JUMSBUcmFuc21pdCBDb25maWd1cmF0aW9uIDIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJU1BPUlQxX1RDTEtESVYJCQkweEZGQzAwOTA4ICAvKiBTUE9SVDEgVHJhbnNtaXQgQ2xvY2sgRGl2aWRlciAqLworI2RlZmluZQlTUE9SVDFfVEZTRElWCQkJMHhGRkMwMDkwQyAgLyogU1BPUlQxIFRyYW5zbWl0IEZyYW1lIFN5bmMgRGl2aWRlciAqLworI2RlZmluZQlTUE9SVDFfVFgJCQkweEZGQzAwOTEwICAvKiBTUE9SVDEgVFggRGF0YSBSZWdpc3RlciAqLworI2RlZmluZQlTUE9SVDFfUlgJCQkweEZGQzAwOTE4ICAvKiBTUE9SVDEgUlggRGF0YSBSZWdpc3RlciAqLworI2RlZmluZQlTUE9SVDFfUkNSMQkJCQkweEZGQzAwOTIwICAvKiBTUE9SVDEgVHJhbnNtaXQgQ29uZmlndXJhdGlvbiAxIFJlZ2lzdGVyICovCisjZGVmaW5lCVNQT1JUMV9SQ1IyCQkJCTB4RkZDMDA5MjQgIC8qIFNQT1JUMSBUcmFuc21pdCBDb25maWd1cmF0aW9uIDIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJU1BPUlQxX1JDTEtESVYJCQkweEZGQzAwOTI4ICAvKiBTUE9SVDEgUmVjZWl2ZSBDbG9jayBEaXZpZGVyICovCisjZGVmaW5lCVNQT1JUMV9SRlNESVYJCQkweEZGQzAwOTJDICAvKiBTUE9SVDEgUmVjZWl2ZSBGcmFtZSBTeW5jIERpdmlkZXIgKi8KKyNkZWZpbmUJU1BPUlQxX1NUQVQJCQkweEZGQzAwOTMwICAvKiBTUE9SVDEgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lCVNQT1JUMV9DSE5MCQkJMHhGRkMwMDkzNCAgLyogU1BPUlQxIEN1cnJlbnQgQ2hhbm5lbCBSZWdpc3RlciAqLworI2RlZmluZQlTUE9SVDFfTUNNQzEJCQkweEZGQzAwOTM4ICAvKiBTUE9SVDEgTXVsdGktQ2hhbm5lbCBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIDEgKi8KKyNkZWZpbmUJU1BPUlQxX01DTUMyCQkJMHhGRkMwMDkzQyAgLyogU1BPUlQxIE11bHRpLUNoYW5uZWwgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAyICovCisjZGVmaW5lCVNQT1JUMV9NVENTMAkJCTB4RkZDMDA5NDAgIC8qIFNQT1JUMSBNdWx0aS1DaGFubmVsIFRyYW5zbWl0IFNlbGVjdCBSZWdpc3RlciAwICovCisjZGVmaW5lCVNQT1JUMV9NVENTMQkJCTB4RkZDMDA5NDQgIC8qIFNQT1JUMSBNdWx0aS1DaGFubmVsIFRyYW5zbWl0IFNlbGVjdCBSZWdpc3RlciAxICovCisjZGVmaW5lCVNQT1JUMV9NVENTMgkJCTB4RkZDMDA5NDggIC8qIFNQT1JUMSBNdWx0aS1DaGFubmVsIFRyYW5zbWl0IFNlbGVjdCBSZWdpc3RlciAyICovCisjZGVmaW5lCVNQT1JUMV9NVENTMwkJCTB4RkZDMDA5NEMgIC8qIFNQT1JUMSBNdWx0aS1DaGFubmVsIFRyYW5zbWl0IFNlbGVjdCBSZWdpc3RlciAzICovCisjZGVmaW5lCVNQT1JUMV9NUkNTMAkJCTB4RkZDMDA5NTAgIC8qIFNQT1JUMSBNdWx0aS1DaGFubmVsIFJlY2VpdmUgU2VsZWN0IFJlZ2lzdGVyIDAgKi8KKyNkZWZpbmUJU1BPUlQxX01SQ1MxCQkJMHhGRkMwMDk1NCAgLyogU1BPUlQxIE11bHRpLUNoYW5uZWwgUmVjZWl2ZSBTZWxlY3QgUmVnaXN0ZXIgMSAqLworI2RlZmluZQlTUE9SVDFfTVJDUzIJCQkweEZGQzAwOTU4ICAvKiBTUE9SVDEgTXVsdGktQ2hhbm5lbCBSZWNlaXZlIFNlbGVjdCBSZWdpc3RlciAyICovCisjZGVmaW5lCVNQT1JUMV9NUkNTMwkJCTB4RkZDMDA5NUMgIC8qIFNQT1JUMSBNdWx0aS1DaGFubmVsIFJlY2VpdmUgU2VsZWN0IFJlZ2lzdGVyIDMgKi8KKworCisvKiBFeHRlcm5hbCBCdXMJSW50ZXJmYWNlIFVuaXQgKDB4RkZDMDBBMDAgLSAweEZGQzAwQUZGKSAqLworLyogQXN5bmNocm9ub3VzCU1lbW9yeSBDb250cm9sbGVyICAqLworI2RlZmluZQlFQklVX0FNR0NUTAkJCTB4RkZDMDBBMDAgIC8qIEFzeW5jaHJvbm91cyBNZW1vcnkgR2xvYmFsIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRUJJVV9BTUJDVEwwCQkweEZGQzAwQTA0ICAvKiBBc3luY2hyb25vdXMgTWVtb3J5IEJhbmsJQ29udHJvbAlSZWdpc3RlciAwICovCisjZGVmaW5lCUVCSVVfQU1CQ1RMMQkJMHhGRkMwMEEwOCAgLyogQXN5bmNocm9ub3VzIE1lbW9yeSBCYW5rCUNvbnRyb2wJUmVnaXN0ZXIgMSAqLworCisvKiBTRFJBTSBDb250cm9sbGVyICovCisjZGVmaW5lCUVCSVVfU0RHQ1RMCQkJMHhGRkMwMEExMCAgLyogU0RSQU0gR2xvYmFsIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRUJJVV9TREJDVEwJCQkweEZGQzAwQTE0ICAvKiBTRFJBTSBCYW5rIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRUJJVV9TRFJSQwkJCTB4RkZDMDBBMTggIC8qIFNEUkFNIFJlZnJlc2ggUmF0ZSBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lCUVCSVVfU0RTVEFUCQkJMHhGRkMwMEExQyAgLyogU0RSQU0gU3RhdHVzIFJlZ2lzdGVyICovCisKKworCisvKiBETUEgQ29udHJvbGxlciAwIFRyYWZmaWMgQ29udHJvbCBSZWdpc3RlcnMgKDB4RkZDMDBCMDAgLSAweEZGQzAwQkZGKSAqLworCisjZGVmaW5lCURNQUMwX1RDX1BFUgkJCTB4RkZDMDBCMEMJLyogRE1BIENvbnRyb2xsZXIgMCBUcmFmZmljIENvbnRyb2wgUGVyaW9kcyBSZWdpc3RlciAqLworI2RlZmluZQlETUFDMF9UQ19DTlQJCQkweEZGQzAwQjEwCS8qIERNQSBDb250cm9sbGVyIDAgVHJhZmZpYyBDb250cm9sIEN1cnJlbnQgQ291bnRzIFJlZ2lzdGVyICovCisKKy8qIEFsdGVybmF0ZSBkZXByZWNhdGVkCXJlZ2lzdGVyIG5hbWVzIChiZWxvdykgcHJvdmlkZWQJZm9yIGJhY2t3YXJkcyBjb2RlIGNvbXBhdGliaWxpdHkgKi8KKyNkZWZpbmUJRE1BMF9UQ1BFUgkJCURNQUMwX1RDX1BFUgorI2RlZmluZQlETUEwX1RDQ05UCQkJRE1BQzBfVENfQ05UCisKKworLyogRE1BIENvbnRyb2xsZXIgMCAoMHhGRkMwMEMwMAktIDB4RkZDMDBGRkYpCQkJCQkJCSAqLworCisjZGVmaW5lCURNQTBfTkVYVF9ERVNDX1BUUgkJMHhGRkMwMEMwMAkvKiBETUEgQ2hhbm5lbCAwIE5leHQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTBfU1RBUlRfQUREUgkJCTB4RkZDMDBDMDQJLyogRE1BIENoYW5uZWwgMCBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTBfQ09ORklHCQkJCTB4RkZDMDBDMDgJLyogRE1BIENoYW5uZWwgMCBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTBfWF9DT1VOVAkJCTB4RkZDMDBDMTAJLyogRE1BIENoYW5uZWwgMCBYIENvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTBfWF9NT0RJRlkJCQkweEZGQzAwQzE0CS8qIERNQSBDaGFubmVsIDAgWCBNb2RpZnkgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMF9ZX0NPVU5UCQkJMHhGRkMwMEMxOAkvKiBETUEgQ2hhbm5lbCAwIFkgQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMF9ZX01PRElGWQkJCTB4RkZDMDBDMUMJLyogRE1BIENoYW5uZWwgMCBZIE1vZGlmeSBSZWdpc3RlciAqLworI2RlZmluZQlETUEwX0NVUlJfREVTQ19QVFIJCTB4RkZDMDBDMjAJLyogRE1BIENoYW5uZWwgMCBDdXJyZW50IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLworI2RlZmluZQlETUEwX0NVUlJfQUREUgkJCTB4RkZDMDBDMjQJLyogRE1BIENoYW5uZWwgMCBDdXJyZW50IEFkZHJlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMF9JUlFfU1RBVFVTCQkJMHhGRkMwMEMyOAkvKiBETUEgQ2hhbm5lbCAwIEludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMF9QRVJJUEhFUkFMX01BUAkJMHhGRkMwMEMyQwkvKiBETUEgQ2hhbm5lbCAwIFBlcmlwaGVyYWwgTWFwCVJlZ2lzdGVyICovCisjZGVmaW5lCURNQTBfQ1VSUl9YX0NPVU5UCQkweEZGQzAwQzMwCS8qIERNQSBDaGFubmVsIDAgQ3VycmVudCBYIENvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTBfQ1VSUl9ZX0NPVU5UCQkweEZGQzAwQzM4CS8qIERNQSBDaGFubmVsIDAgQ3VycmVudCBZIENvdW50IFJlZ2lzdGVyICovCisKKyNkZWZpbmUJRE1BMV9ORVhUX0RFU0NfUFRSCQkweEZGQzAwQzQwCS8qIERNQSBDaGFubmVsIDEgTmV4dCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMV9TVEFSVF9BRERSCQkJMHhGRkMwMEM0NAkvKiBETUEgQ2hhbm5lbCAxIFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMV9DT05GSUcJCQkJMHhGRkMwMEM0OAkvKiBETUEgQ2hhbm5lbCAxIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMV9YX0NPVU5UCQkJMHhGRkMwMEM1MAkvKiBETUEgQ2hhbm5lbCAxIFggQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMV9YX01PRElGWQkJCTB4RkZDMDBDNTQJLyogRE1BIENoYW5uZWwgMSBYIE1vZGlmeSBSZWdpc3RlciAqLworI2RlZmluZQlETUExX1lfQ09VTlQJCQkweEZGQzAwQzU4CS8qIERNQSBDaGFubmVsIDEgWSBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlETUExX1lfTU9ESUZZCQkJMHhGRkMwMEM1QwkvKiBETUEgQ2hhbm5lbCAxIFkgTW9kaWZ5IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTFfQ1VSUl9ERVNDX1BUUgkJMHhGRkMwMEM2MAkvKiBETUEgQ2hhbm5lbCAxIEN1cnJlbnQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTFfQ1VSUl9BRERSCQkJMHhGRkMwMEM2NAkvKiBETUEgQ2hhbm5lbCAxIEN1cnJlbnQgQWRkcmVzcyBSZWdpc3RlciAqLworI2RlZmluZQlETUExX0lSUV9TVEFUVVMJCQkweEZGQzAwQzY4CS8qIERNQSBDaGFubmVsIDEgSW50ZXJydXB0L1N0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZQlETUExX1BFUklQSEVSQUxfTUFQCQkweEZGQzAwQzZDCS8qIERNQSBDaGFubmVsIDEgUGVyaXBoZXJhbCBNYXAJUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMV9DVVJSX1hfQ09VTlQJCTB4RkZDMDBDNzAJLyogRE1BIENoYW5uZWwgMSBDdXJyZW50IFggQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMV9DVVJSX1lfQ09VTlQJCTB4RkZDMDBDNzgJLyogRE1BIENoYW5uZWwgMSBDdXJyZW50IFkgQ291bnQgUmVnaXN0ZXIgKi8KKworI2RlZmluZQlETUEyX05FWFRfREVTQ19QVFIJCTB4RkZDMDBDODAJLyogRE1BIENoYW5uZWwgMiBOZXh0IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLworI2RlZmluZQlETUEyX1NUQVJUX0FERFIJCQkweEZGQzAwQzg0CS8qIERNQSBDaGFubmVsIDIgU3RhcnQgQWRkcmVzcyBSZWdpc3RlciAqLworI2RlZmluZQlETUEyX0NPTkZJRwkJCQkweEZGQzAwQzg4CS8qIERNQSBDaGFubmVsIDIgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAqLworI2RlZmluZQlETUEyX1hfQ09VTlQJCQkweEZGQzAwQzkwCS8qIERNQSBDaGFubmVsIDIgWCBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlETUEyX1hfTU9ESUZZCQkJMHhGRkMwMEM5NAkvKiBETUEgQ2hhbm5lbCAyIFggTW9kaWZ5IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTJfWV9DT1VOVAkJCTB4RkZDMDBDOTgJLyogRE1BIENoYW5uZWwgMiBZIENvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTJfWV9NT0RJRlkJCQkweEZGQzAwQzlDCS8qIERNQSBDaGFubmVsIDIgWSBNb2RpZnkgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMl9DVVJSX0RFU0NfUFRSCQkweEZGQzAwQ0EwCS8qIERNQSBDaGFubmVsIDIgQ3VycmVudCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMl9DVVJSX0FERFIJCQkweEZGQzAwQ0E0CS8qIERNQSBDaGFubmVsIDIgQ3VycmVudCBBZGRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTJfSVJRX1NUQVRVUwkJCTB4RkZDMDBDQTgJLyogRE1BIENoYW5uZWwgMiBJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTJfUEVSSVBIRVJBTF9NQVAJCTB4RkZDMDBDQUMJLyogRE1BIENoYW5uZWwgMiBQZXJpcGhlcmFsIE1hcAlSZWdpc3RlciAqLworI2RlZmluZQlETUEyX0NVUlJfWF9DT1VOVAkJMHhGRkMwMENCMAkvKiBETUEgQ2hhbm5lbCAyIEN1cnJlbnQgWCBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlETUEyX0NVUlJfWV9DT1VOVAkJMHhGRkMwMENCOAkvKiBETUEgQ2hhbm5lbCAyIEN1cnJlbnQgWSBDb3VudCBSZWdpc3RlciAqLworCisjZGVmaW5lCURNQTNfTkVYVF9ERVNDX1BUUgkJMHhGRkMwMENDMAkvKiBETUEgQ2hhbm5lbCAzIE5leHQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTNfU1RBUlRfQUREUgkJCTB4RkZDMDBDQzQJLyogRE1BIENoYW5uZWwgMyBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTNfQ09ORklHCQkJCTB4RkZDMDBDQzgJLyogRE1BIENoYW5uZWwgMyBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTNfWF9DT1VOVAkJCTB4RkZDMDBDRDAJLyogRE1BIENoYW5uZWwgMyBYIENvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTNfWF9NT0RJRlkJCQkweEZGQzAwQ0Q0CS8qIERNQSBDaGFubmVsIDMgWCBNb2RpZnkgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BM19ZX0NPVU5UCQkJMHhGRkMwMENEOAkvKiBETUEgQ2hhbm5lbCAzIFkgQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BM19ZX01PRElGWQkJCTB4RkZDMDBDREMJLyogRE1BIENoYW5uZWwgMyBZIE1vZGlmeSBSZWdpc3RlciAqLworI2RlZmluZQlETUEzX0NVUlJfREVTQ19QVFIJCTB4RkZDMDBDRTAJLyogRE1BIENoYW5uZWwgMyBDdXJyZW50IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLworI2RlZmluZQlETUEzX0NVUlJfQUREUgkJCTB4RkZDMDBDRTQJLyogRE1BIENoYW5uZWwgMyBDdXJyZW50IEFkZHJlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BM19JUlFfU1RBVFVTCQkJMHhGRkMwMENFOAkvKiBETUEgQ2hhbm5lbCAzIEludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BM19QRVJJUEhFUkFMX01BUAkJMHhGRkMwMENFQwkvKiBETUEgQ2hhbm5lbCAzIFBlcmlwaGVyYWwgTWFwCVJlZ2lzdGVyICovCisjZGVmaW5lCURNQTNfQ1VSUl9YX0NPVU5UCQkweEZGQzAwQ0YwCS8qIERNQSBDaGFubmVsIDMgQ3VycmVudCBYIENvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTNfQ1VSUl9ZX0NPVU5UCQkweEZGQzAwQ0Y4CS8qIERNQSBDaGFubmVsIDMgQ3VycmVudCBZIENvdW50IFJlZ2lzdGVyICovCisKKyNkZWZpbmUJRE1BNF9ORVhUX0RFU0NfUFRSCQkweEZGQzAwRDAwCS8qIERNQSBDaGFubmVsIDQgTmV4dCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BNF9TVEFSVF9BRERSCQkJMHhGRkMwMEQwNAkvKiBETUEgQ2hhbm5lbCA0IFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BNF9DT05GSUcJCQkJMHhGRkMwMEQwOAkvKiBETUEgQ2hhbm5lbCA0IENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BNF9YX0NPVU5UCQkJMHhGRkMwMEQxMAkvKiBETUEgQ2hhbm5lbCA0IFggQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BNF9YX01PRElGWQkJCTB4RkZDMDBEMTQJLyogRE1BIENoYW5uZWwgNCBYIE1vZGlmeSBSZWdpc3RlciAqLworI2RlZmluZQlETUE0X1lfQ09VTlQJCQkweEZGQzAwRDE4CS8qIERNQSBDaGFubmVsIDQgWSBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlETUE0X1lfTU9ESUZZCQkJMHhGRkMwMEQxQwkvKiBETUEgQ2hhbm5lbCA0IFkgTW9kaWZ5IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTRfQ1VSUl9ERVNDX1BUUgkJMHhGRkMwMEQyMAkvKiBETUEgQ2hhbm5lbCA0IEN1cnJlbnQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTRfQ1VSUl9BRERSCQkJMHhGRkMwMEQyNAkvKiBETUEgQ2hhbm5lbCA0IEN1cnJlbnQgQWRkcmVzcyBSZWdpc3RlciAqLworI2RlZmluZQlETUE0X0lSUV9TVEFUVVMJCQkweEZGQzAwRDI4CS8qIERNQSBDaGFubmVsIDQgSW50ZXJydXB0L1N0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZQlETUE0X1BFUklQSEVSQUxfTUFQCQkweEZGQzAwRDJDCS8qIERNQSBDaGFubmVsIDQgUGVyaXBoZXJhbCBNYXAJUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BNF9DVVJSX1hfQ09VTlQJCTB4RkZDMDBEMzAJLyogRE1BIENoYW5uZWwgNCBDdXJyZW50IFggQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BNF9DVVJSX1lfQ09VTlQJCTB4RkZDMDBEMzgJLyogRE1BIENoYW5uZWwgNCBDdXJyZW50IFkgQ291bnQgUmVnaXN0ZXIgKi8KKworI2RlZmluZQlETUE1X05FWFRfREVTQ19QVFIJCTB4RkZDMDBENDAJLyogRE1BIENoYW5uZWwgNSBOZXh0IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLworI2RlZmluZQlETUE1X1NUQVJUX0FERFIJCQkweEZGQzAwRDQ0CS8qIERNQSBDaGFubmVsIDUgU3RhcnQgQWRkcmVzcyBSZWdpc3RlciAqLworI2RlZmluZQlETUE1X0NPTkZJRwkJCQkweEZGQzAwRDQ4CS8qIERNQSBDaGFubmVsIDUgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAqLworI2RlZmluZQlETUE1X1hfQ09VTlQJCQkweEZGQzAwRDUwCS8qIERNQSBDaGFubmVsIDUgWCBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlETUE1X1hfTU9ESUZZCQkJMHhGRkMwMEQ1NAkvKiBETUEgQ2hhbm5lbCA1IFggTW9kaWZ5IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTVfWV9DT1VOVAkJCTB4RkZDMDBENTgJLyogRE1BIENoYW5uZWwgNSBZIENvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTVfWV9NT0RJRlkJCQkweEZGQzAwRDVDCS8qIERNQSBDaGFubmVsIDUgWSBNb2RpZnkgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BNV9DVVJSX0RFU0NfUFRSCQkweEZGQzAwRDYwCS8qIERNQSBDaGFubmVsIDUgQ3VycmVudCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BNV9DVVJSX0FERFIJCQkweEZGQzAwRDY0CS8qIERNQSBDaGFubmVsIDUgQ3VycmVudCBBZGRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTVfSVJRX1NUQVRVUwkJCTB4RkZDMDBENjgJLyogRE1BIENoYW5uZWwgNSBJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTVfUEVSSVBIRVJBTF9NQVAJCTB4RkZDMDBENkMJLyogRE1BIENoYW5uZWwgNSBQZXJpcGhlcmFsIE1hcAlSZWdpc3RlciAqLworI2RlZmluZQlETUE1X0NVUlJfWF9DT1VOVAkJMHhGRkMwMEQ3MAkvKiBETUEgQ2hhbm5lbCA1IEN1cnJlbnQgWCBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlETUE1X0NVUlJfWV9DT1VOVAkJMHhGRkMwMEQ3OAkvKiBETUEgQ2hhbm5lbCA1IEN1cnJlbnQgWSBDb3VudCBSZWdpc3RlciAqLworCisjZGVmaW5lCURNQTZfTkVYVF9ERVNDX1BUUgkJMHhGRkMwMEQ4MAkvKiBETUEgQ2hhbm5lbCA2IE5leHQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTZfU1RBUlRfQUREUgkJCTB4RkZDMDBEODQJLyogRE1BIENoYW5uZWwgNiBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTZfQ09ORklHCQkJCTB4RkZDMDBEODgJLyogRE1BIENoYW5uZWwgNiBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTZfWF9DT1VOVAkJCTB4RkZDMDBEOTAJLyogRE1BIENoYW5uZWwgNiBYIENvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTZfWF9NT0RJRlkJCQkweEZGQzAwRDk0CS8qIERNQSBDaGFubmVsIDYgWCBNb2RpZnkgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BNl9ZX0NPVU5UCQkJMHhGRkMwMEQ5OAkvKiBETUEgQ2hhbm5lbCA2IFkgQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BNl9ZX01PRElGWQkJCTB4RkZDMDBEOUMJLyogRE1BIENoYW5uZWwgNiBZIE1vZGlmeSBSZWdpc3RlciAqLworI2RlZmluZQlETUE2X0NVUlJfREVTQ19QVFIJCTB4RkZDMDBEQTAJLyogRE1BIENoYW5uZWwgNiBDdXJyZW50IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLworI2RlZmluZQlETUE2X0NVUlJfQUREUgkJCTB4RkZDMDBEQTQJLyogRE1BIENoYW5uZWwgNiBDdXJyZW50IEFkZHJlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BNl9JUlFfU1RBVFVTCQkJMHhGRkMwMERBOAkvKiBETUEgQ2hhbm5lbCA2IEludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BNl9QRVJJUEhFUkFMX01BUAkJMHhGRkMwMERBQwkvKiBETUEgQ2hhbm5lbCA2IFBlcmlwaGVyYWwgTWFwCVJlZ2lzdGVyICovCisjZGVmaW5lCURNQTZfQ1VSUl9YX0NPVU5UCQkweEZGQzAwREIwCS8qIERNQSBDaGFubmVsIDYgQ3VycmVudCBYIENvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTZfQ1VSUl9ZX0NPVU5UCQkweEZGQzAwREI4CS8qIERNQSBDaGFubmVsIDYgQ3VycmVudCBZIENvdW50IFJlZ2lzdGVyICovCisKKyNkZWZpbmUJRE1BN19ORVhUX0RFU0NfUFRSCQkweEZGQzAwREMwCS8qIERNQSBDaGFubmVsIDcgTmV4dCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BN19TVEFSVF9BRERSCQkJMHhGRkMwMERDNAkvKiBETUEgQ2hhbm5lbCA3IFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BN19DT05GSUcJCQkJMHhGRkMwMERDOAkvKiBETUEgQ2hhbm5lbCA3IENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BN19YX0NPVU5UCQkJMHhGRkMwMEREMAkvKiBETUEgQ2hhbm5lbCA3IFggQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BN19YX01PRElGWQkJCTB4RkZDMDBERDQJLyogRE1BIENoYW5uZWwgNyBYIE1vZGlmeSBSZWdpc3RlciAqLworI2RlZmluZQlETUE3X1lfQ09VTlQJCQkweEZGQzAwREQ4CS8qIERNQSBDaGFubmVsIDcgWSBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlETUE3X1lfTU9ESUZZCQkJMHhGRkMwMEREQwkvKiBETUEgQ2hhbm5lbCA3IFkgTW9kaWZ5IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTdfQ1VSUl9ERVNDX1BUUgkJMHhGRkMwMERFMAkvKiBETUEgQ2hhbm5lbCA3IEN1cnJlbnQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTdfQ1VSUl9BRERSCQkJMHhGRkMwMERFNAkvKiBETUEgQ2hhbm5lbCA3IEN1cnJlbnQgQWRkcmVzcyBSZWdpc3RlciAqLworI2RlZmluZQlETUE3X0lSUV9TVEFUVVMJCQkweEZGQzAwREU4CS8qIERNQSBDaGFubmVsIDcgSW50ZXJydXB0L1N0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZQlETUE3X1BFUklQSEVSQUxfTUFQCQkweEZGQzAwREVDCS8qIERNQSBDaGFubmVsIDcgUGVyaXBoZXJhbCBNYXAJUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BN19DVVJSX1hfQ09VTlQJCTB4RkZDMDBERjAJLyogRE1BIENoYW5uZWwgNyBDdXJyZW50IFggQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BN19DVVJSX1lfQ09VTlQJCTB4RkZDMDBERjgJLyogRE1BIENoYW5uZWwgNyBDdXJyZW50IFkgQ291bnQgUmVnaXN0ZXIgKi8KKworI2RlZmluZQlNRE1BMF9EMF9ORVhUX0RFU0NfUFRSCTB4RkZDMDBFMDAJLyogTWVtRE1BMCBTdHJlYW0gMCBEZXN0aW5hdGlvbglOZXh0IERlc2NyaXB0b3IJUG9pbnRlcglSZWdpc3RlciAqLworI2RlZmluZQlNRE1BMF9EMF9TVEFSVF9BRERSCQkweEZGQzAwRTA0CS8qIE1lbURNQTAgU3RyZWFtIDAgRGVzdGluYXRpb24JU3RhcnQgQWRkcmVzcyBSZWdpc3RlciAqLworI2RlZmluZQlNRE1BMF9EMF9DT05GSUcJCQkweEZGQzAwRTA4CS8qIE1lbURNQTAgU3RyZWFtIDAgRGVzdGluYXRpb24JQ29uZmlndXJhdGlvbiBSZWdpc3RlciAqLworI2RlZmluZQlNRE1BMF9EMF9YX0NPVU5UCQkweEZGQzAwRTEwCS8qIE1lbURNQTAgU3RyZWFtIDAgRGVzdGluYXRpb24JWCBDb3VudAlSZWdpc3RlciAqLworI2RlZmluZQlNRE1BMF9EMF9YX01PRElGWQkJMHhGRkMwMEUxNAkvKiBNZW1ETUEwIFN0cmVhbSAwIERlc3RpbmF0aW9uCVggTW9kaWZ5IFJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUEwX0QwX1lfQ09VTlQJCTB4RkZDMDBFMTgJLyogTWVtRE1BMCBTdHJlYW0gMCBEZXN0aW5hdGlvbglZIENvdW50CVJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUEwX0QwX1lfTU9ESUZZCQkweEZGQzAwRTFDCS8qIE1lbURNQTAgU3RyZWFtIDAgRGVzdGluYXRpb24JWSBNb2RpZnkgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQTBfRDBfQ1VSUl9ERVNDX1BUUgkweEZGQzAwRTIwCS8qIE1lbURNQTAgU3RyZWFtIDAgRGVzdGluYXRpb24JQ3VycmVudAlEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQTBfRDBfQ1VSUl9BRERSCQkweEZGQzAwRTI0CS8qIE1lbURNQTAgU3RyZWFtIDAgRGVzdGluYXRpb24JQ3VycmVudAlBZGRyZXNzCVJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUEwX0QwX0lSUV9TVEFUVVMJCTB4RkZDMDBFMjgJLyogTWVtRE1BMCBTdHJlYW0gMCBEZXN0aW5hdGlvbglJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUEwX0QwX1BFUklQSEVSQUxfTUFQCTB4RkZDMDBFMkMJLyogTWVtRE1BMCBTdHJlYW0gMCBEZXN0aW5hdGlvbglQZXJpcGhlcmFsIE1hcCBSZWdpc3RlciAqLworI2RlZmluZQlNRE1BMF9EMF9DVVJSX1hfQ09VTlQJMHhGRkMwMEUzMAkvKiBNZW1ETUEwIFN0cmVhbSAwIERlc3RpbmF0aW9uCUN1cnJlbnQJWCBDb3VudAlSZWdpc3RlciAqLworI2RlZmluZQlNRE1BMF9EMF9DVVJSX1lfQ09VTlQJMHhGRkMwMEUzOAkvKiBNZW1ETUEwIFN0cmVhbSAwIERlc3RpbmF0aW9uCUN1cnJlbnQJWSBDb3VudAlSZWdpc3RlciAqLworCisjZGVmaW5lCU1ETUEwX1MwX05FWFRfREVTQ19QVFIJMHhGRkMwMEU0MAkvKiBNZW1ETUEwIFN0cmVhbSAwIFNvdXJjZSBOZXh0CURlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLworI2RlZmluZQlNRE1BMF9TMF9TVEFSVF9BRERSCQkweEZGQzAwRTQ0CS8qIE1lbURNQTAgU3RyZWFtIDAgU291cmNlIFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQTBfUzBfQ09ORklHCQkJMHhGRkMwMEU0OAkvKiBNZW1ETUEwIFN0cmVhbSAwIFNvdXJjZSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUEwX1MwX1hfQ09VTlQJCTB4RkZDMDBFNTAJLyogTWVtRE1BMCBTdHJlYW0gMCBTb3VyY2UgWCBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlNRE1BMF9TMF9YX01PRElGWQkJMHhGRkMwMEU1NAkvKiBNZW1ETUEwIFN0cmVhbSAwIFNvdXJjZSBYIE1vZGlmeSBSZWdpc3RlciAqLworI2RlZmluZQlNRE1BMF9TMF9ZX0NPVU5UCQkweEZGQzAwRTU4CS8qIE1lbURNQTAgU3RyZWFtIDAgU291cmNlIFkgQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQTBfUzBfWV9NT0RJRlkJCTB4RkZDMDBFNUMJLyogTWVtRE1BMCBTdHJlYW0gMCBTb3VyY2UgWSBNb2RpZnkgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQTBfUzBfQ1VSUl9ERVNDX1BUUgkweEZGQzAwRTYwCS8qIE1lbURNQTAgU3RyZWFtIDAgU291cmNlIEN1cnJlbnQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUEwX1MwX0NVUlJfQUREUgkJMHhGRkMwMEU2NAkvKiBNZW1ETUEwIFN0cmVhbSAwIFNvdXJjZSBDdXJyZW50IEFkZHJlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQTBfUzBfSVJRX1NUQVRVUwkJMHhGRkMwMEU2OAkvKiBNZW1ETUEwIFN0cmVhbSAwIFNvdXJjZSBJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUEwX1MwX1BFUklQSEVSQUxfTUFQCTB4RkZDMDBFNkMJLyogTWVtRE1BMCBTdHJlYW0gMCBTb3VyY2UgUGVyaXBoZXJhbCBNYXAgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQTBfUzBfQ1VSUl9YX0NPVU5UCTB4RkZDMDBFNzAJLyogTWVtRE1BMCBTdHJlYW0gMCBTb3VyY2UgQ3VycmVudCBYIENvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUEwX1MwX0NVUlJfWV9DT1VOVAkweEZGQzAwRTc4CS8qIE1lbURNQTAgU3RyZWFtIDAgU291cmNlIEN1cnJlbnQgWSBDb3VudCBSZWdpc3RlciAqLworCisjZGVmaW5lCU1ETUEwX0QxX05FWFRfREVTQ19QVFIJMHhGRkMwMEU4MAkvKiBNZW1ETUEwIFN0cmVhbSAxIERlc3RpbmF0aW9uCU5leHQgRGVzY3JpcHRvcglQb2ludGVyCVJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUEwX0QxX1NUQVJUX0FERFIJCTB4RkZDMDBFODQJLyogTWVtRE1BMCBTdHJlYW0gMSBEZXN0aW5hdGlvbglTdGFydCBBZGRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUEwX0QxX0NPTkZJRwkJCTB4RkZDMDBFODgJLyogTWVtRE1BMCBTdHJlYW0gMSBEZXN0aW5hdGlvbglDb25maWd1cmF0aW9uIFJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUEwX0QxX1hfQ09VTlQJCTB4RkZDMDBFOTAJLyogTWVtRE1BMCBTdHJlYW0gMSBEZXN0aW5hdGlvbglYIENvdW50CVJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUEwX0QxX1hfTU9ESUZZCQkweEZGQzAwRTk0CS8qIE1lbURNQTAgU3RyZWFtIDEgRGVzdGluYXRpb24JWCBNb2RpZnkgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQTBfRDFfWV9DT1VOVAkJMHhGRkMwMEU5OAkvKiBNZW1ETUEwIFN0cmVhbSAxIERlc3RpbmF0aW9uCVkgQ291bnQJUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQTBfRDFfWV9NT0RJRlkJCTB4RkZDMDBFOUMJLyogTWVtRE1BMCBTdHJlYW0gMSBEZXN0aW5hdGlvbglZIE1vZGlmeSBSZWdpc3RlciAqLworI2RlZmluZQlNRE1BMF9EMV9DVVJSX0RFU0NfUFRSCTB4RkZDMDBFQTAJLyogTWVtRE1BMCBTdHJlYW0gMSBEZXN0aW5hdGlvbglDdXJyZW50CURlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLworI2RlZmluZQlNRE1BMF9EMV9DVVJSX0FERFIJCTB4RkZDMDBFQTQJLyogTWVtRE1BMCBTdHJlYW0gMSBEZXN0aW5hdGlvbglDdXJyZW50CUFkZHJlc3MJUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQTBfRDFfSVJRX1NUQVRVUwkJMHhGRkMwMEVBOAkvKiBNZW1ETUEwIFN0cmVhbSAxIERlc3RpbmF0aW9uCUludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQTBfRDFfUEVSSVBIRVJBTF9NQVAJMHhGRkMwMEVBQwkvKiBNZW1ETUEwIFN0cmVhbSAxIERlc3RpbmF0aW9uCVBlcmlwaGVyYWwgTWFwIFJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUEwX0QxX0NVUlJfWF9DT1VOVAkweEZGQzAwRUIwCS8qIE1lbURNQTAgU3RyZWFtIDEgRGVzdGluYXRpb24JQ3VycmVudAlYIENvdW50CVJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUEwX0QxX0NVUlJfWV9DT1VOVAkweEZGQzAwRUI4CS8qIE1lbURNQTAgU3RyZWFtIDEgRGVzdGluYXRpb24JQ3VycmVudAlZIENvdW50CVJlZ2lzdGVyICovCisKKyNkZWZpbmUJTURNQTBfUzFfTkVYVF9ERVNDX1BUUgkweEZGQzAwRUMwCS8qIE1lbURNQTAgU3RyZWFtIDEgU291cmNlIE5leHQJRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUEwX1MxX1NUQVJUX0FERFIJCTB4RkZDMDBFQzQJLyogTWVtRE1BMCBTdHJlYW0gMSBTb3VyY2UgU3RhcnQgQWRkcmVzcyBSZWdpc3RlciAqLworI2RlZmluZQlNRE1BMF9TMV9DT05GSUcJCQkweEZGQzAwRUM4CS8qIE1lbURNQTAgU3RyZWFtIDEgU291cmNlIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQTBfUzFfWF9DT1VOVAkJMHhGRkMwMEVEMAkvKiBNZW1ETUEwIFN0cmVhbSAxIFNvdXJjZSBYIENvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUEwX1MxX1hfTU9ESUZZCQkweEZGQzAwRUQ0CS8qIE1lbURNQTAgU3RyZWFtIDEgU291cmNlIFggTW9kaWZ5IFJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUEwX1MxX1lfQ09VTlQJCTB4RkZDMDBFRDgJLyogTWVtRE1BMCBTdHJlYW0gMSBTb3VyY2UgWSBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlNRE1BMF9TMV9ZX01PRElGWQkJMHhGRkMwMEVEQwkvKiBNZW1ETUEwIFN0cmVhbSAxIFNvdXJjZSBZIE1vZGlmeSBSZWdpc3RlciAqLworI2RlZmluZQlNRE1BMF9TMV9DVVJSX0RFU0NfUFRSCTB4RkZDMDBFRTAJLyogTWVtRE1BMCBTdHJlYW0gMSBTb3VyY2UgQ3VycmVudCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQTBfUzFfQ1VSUl9BRERSCQkweEZGQzAwRUU0CS8qIE1lbURNQTAgU3RyZWFtIDEgU291cmNlIEN1cnJlbnQgQWRkcmVzcyBSZWdpc3RlciAqLworI2RlZmluZQlNRE1BMF9TMV9JUlFfU1RBVFVTCQkweEZGQzAwRUU4CS8qIE1lbURNQTAgU3RyZWFtIDEgU291cmNlIEludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQTBfUzFfUEVSSVBIRVJBTF9NQVAJMHhGRkMwMEVFQwkvKiBNZW1ETUEwIFN0cmVhbSAxIFNvdXJjZSBQZXJpcGhlcmFsIE1hcCBSZWdpc3RlciAqLworI2RlZmluZQlNRE1BMF9TMV9DVVJSX1hfQ09VTlQJMHhGRkMwMEVGMAkvKiBNZW1ETUEwIFN0cmVhbSAxIFNvdXJjZSBDdXJyZW50IFggQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQTBfUzFfQ1VSUl9ZX0NPVU5UCTB4RkZDMDBFRjgJLyogTWVtRE1BMCBTdHJlYW0gMSBTb3VyY2UgQ3VycmVudCBZIENvdW50IFJlZ2lzdGVyICovCisKKworLyogUGFyYWxsZWwgUGVyaXBoZXJhbCBJbnRlcmZhY2UgKFBQSSkgKDB4RkZDMDEwMDAgLSAweEZGQzAxMEZGKSAqLworI2RlZmluZQlQUElfQ09OVFJPTAkJCTB4RkZDMDEwMDAJLyogUFBJIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJUFBJX1NUQVRVUwkJCTB4RkZDMDEwMDQJLyogUFBJIFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZQlQUElfQ09VTlQJCQkweEZGQzAxMDA4CS8qIFBQSSBUcmFuc2ZlcglDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlQUElfREVMQVkJCQkweEZGQzAxMDBDCS8qIFBQSSBEZWxheSBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlQUElfRlJBTUUJCQkweEZGQzAxMDEwCS8qIFBQSSBGcmFtZSBMZW5ndGggUmVnaXN0ZXIgKi8KKworCisvKiBUd28tV2lyZSBJbnRlcmZhY2UgMAkoMHhGRkMwMTQwMCAtIDB4RkZDMDE0RkYpCQkJICovCisjZGVmaW5lCVRXSTBfQ0xLRElWCQkJMHhGRkMwMTQwMAkvKiBTZXJpYWwgQ2xvY2sJRGl2aWRlcglSZWdpc3RlciAqLworI2RlZmluZQlUV0kwX0NPTlRST0wJCTB4RkZDMDE0MDQJLyogVFdJMAlNYXN0ZXIgSW50ZXJuYWwJVGltZSBSZWZlcmVuY2UgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJVFdJMF9TTEFWRV9DVFJMCQkweEZGQzAxNDA4CS8qIFNsYXZlIE1vZGUgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZQlUV0kwX1NMQVZFX1NUQVQJCTB4RkZDMDE0MEMJLyogU2xhdmUgTW9kZSBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJVFdJMF9TTEFWRV9BRERSCQkweEZGQzAxNDEwCS8qIFNsYXZlIE1vZGUgQWRkcmVzcyBSZWdpc3RlciAqLworI2RlZmluZQlUV0kwX01BU1RFUl9DVFJMCTB4RkZDMDE0MTQJLyogTWFzdGVyIE1vZGUgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZQlUV0kwX01BU1RFUl9TVEFUCTB4RkZDMDE0MTgJLyogTWFzdGVyIE1vZGUgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lCVRXSTBfTUFTVEVSX0FERFIJMHhGRkMwMTQxQwkvKiBNYXN0ZXIgTW9kZSBBZGRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lCVRXSTBfSU5UX1NUQVQJCTB4RkZDMDE0MjAJLyogVFdJMAlNYXN0ZXIgSW50ZXJydXB0IFJlZ2lzdGVyICovCisjZGVmaW5lCVRXSTBfSU5UX01BU0sJCTB4RkZDMDE0MjQJLyogVFdJMAlNYXN0ZXIgSW50ZXJydXB0IE1hc2sgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJVFdJMF9GSUZPX0NUUkwJCTB4RkZDMDE0MjgJLyogRklGTwlDb250cm9sCVJlZ2lzdGVyICovCisjZGVmaW5lCVRXSTBfRklGT19TVEFUCQkweEZGQzAxNDJDCS8qIEZJRk8JU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lCVRXSTBfWE1UX0RBVEE4CQkweEZGQzAxNDgwCS8qIEZJRk8JVHJhbnNtaXQgRGF0YSBTaW5nbGUgQnl0ZSBSZWdpc3RlciAqLworI2RlZmluZQlUV0kwX1hNVF9EQVRBMTYJCTB4RkZDMDE0ODQJLyogRklGTwlUcmFuc21pdCBEYXRhIERvdWJsZSBCeXRlIFJlZ2lzdGVyICovCisjZGVmaW5lCVRXSTBfUkNWX0RBVEE4CQkweEZGQzAxNDg4CS8qIEZJRk8JUmVjZWl2ZQlEYXRhIFNpbmdsZSBCeXRlIFJlZ2lzdGVyICovCisjZGVmaW5lCVRXSTBfUkNWX0RBVEExNgkJMHhGRkMwMTQ4QwkvKiBGSUZPCVJlY2VpdmUJRGF0YSBEb3VibGUgQnl0ZSBSZWdpc3RlciAqLworCisjZGVmaW5lIFRXSTBfUkVHQkFTRQkJVFdJMF9DTEtESVYKKworLyogdGhlIGZvbGxvd2luZyBhcmUgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5ICovCisjZGVmaW5lCVRXSTBfUFJFU0NBTEUJIFRXSTBfQ09OVFJPTAorI2RlZmluZQlUV0kwX0lOVF9TUkMJIFRXSTBfSU5UX1NUQVQKKyNkZWZpbmUJVFdJMF9JTlRfRU5BQkxFCSBUV0kwX0lOVF9NQVNLCisKKworLyogR2VuZXJhbC1QdXJwb3NlIFBvcnRzICAoMHhGRkMwMTUwMCAtCTB4RkZDMDE1RkYpCSAqLworCisvKiBHUElPCVBvcnQgQyBSZWdpc3RlcglOYW1lcyAqLworI2RlZmluZQlHUElPX0NfQ05GRwkJCTB4RkZDMDE1MDAJLyogR1BJTwlQaW4gUG9ydCBDIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJR1BJT19DX0QJCQkweEZGQzAxNTEwCS8qIEdQSU8JUGluIFBvcnQgQyBEYXRhCVJlZ2lzdGVyICovCisjZGVmaW5lCUdQSU9fQ19DCQkJMHhGRkMwMTUyMAkvKiBDbGVhciBHUElPIFBpbiBQb3J0IEMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJR1BJT19DX1MJCQkweEZGQzAxNTMwCS8qIFNldCBHUElPIFBpbglQb3J0IEMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJR1BJT19DX1QJCQkweEZGQzAxNTQwCS8qIFRvZ2dsZSBHUElPIFBpbiBQb3J0CUMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJR1BJT19DX0RJUgkJCTB4RkZDMDE1NTAJLyogR1BJTwlQaW4gUG9ydCBDIERpcmVjdGlvbiBSZWdpc3RlciAqLworI2RlZmluZQlHUElPX0NfSU5FTgkJCTB4RkZDMDE1NjAJLyogR1BJTwlQaW4gUG9ydCBDIElucHV0IEVuYWJsZQlSZWdpc3RlciAqLworCisvKiBHUElPCVBvcnQgRCBSZWdpc3RlcglOYW1lcyAqLworI2RlZmluZQlHUElPX0RfQ05GRwkJCTB4RkZDMDE1MDQJLyogR1BJTwlQaW4gUG9ydCBEIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJR1BJT19EX0QJCQkweEZGQzAxNTE0CS8qIEdQSU8JUGluIFBvcnQgRCBEYXRhCVJlZ2lzdGVyICovCisjZGVmaW5lCUdQSU9fRF9DCQkJMHhGRkMwMTUyNAkvKiBDbGVhciBHUElPIFBpbiBQb3J0IEQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJR1BJT19EX1MJCQkweEZGQzAxNTM0CS8qIFNldCBHUElPIFBpbglQb3J0IEQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJR1BJT19EX1QJCQkweEZGQzAxNTQ0CS8qIFRvZ2dsZSBHUElPIFBpbiBQb3J0CUQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJR1BJT19EX0RJUgkJCTB4RkZDMDE1NTQJLyogR1BJTwlQaW4gUG9ydCBEIERpcmVjdGlvbiBSZWdpc3RlciAqLworI2RlZmluZQlHUElPX0RfSU5FTgkJCTB4RkZDMDE1NjQJLyogR1BJTwlQaW4gUG9ydCBEIElucHV0IEVuYWJsZQlSZWdpc3RlciAqLworCisvKiBHUElPCVBvcnQgRSBSZWdpc3RlcglOYW1lcyAqLworI2RlZmluZQlHUElPX0VfQ05GRwkJCTB4RkZDMDE1MDgJLyogR1BJTwlQaW4gUG9ydCBFIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJR1BJT19FX0QJCQkweEZGQzAxNTE4CS8qIEdQSU8JUGluIFBvcnQgRSBEYXRhCVJlZ2lzdGVyICovCisjZGVmaW5lCUdQSU9fRV9DCQkJMHhGRkMwMTUyOAkvKiBDbGVhciBHUElPIFBpbiBQb3J0IEUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJR1BJT19FX1MJCQkweEZGQzAxNTM4CS8qIFNldCBHUElPIFBpbglQb3J0IEUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJR1BJT19FX1QJCQkweEZGQzAxNTQ4CS8qIFRvZ2dsZSBHUElPIFBpbiBQb3J0CUUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJR1BJT19FX0RJUgkJCTB4RkZDMDE1NTgJLyogR1BJTwlQaW4gUG9ydCBFIERpcmVjdGlvbiBSZWdpc3RlciAqLworI2RlZmluZQlHUElPX0VfSU5FTgkJCTB4RkZDMDE1NjgJLyogR1BJTwlQaW4gUG9ydCBFIElucHV0IEVuYWJsZQlSZWdpc3RlciAqLworCisvKiBETUEgQ29udHJvbGxlciAxIFRyYWZmaWMgQ29udHJvbCBSZWdpc3RlcnMgKDB4RkZDMDFCMDAgLSAweEZGQzAxQkZGKSAqLworCisjZGVmaW5lCURNQUMxX1RDX1BFUgkJCTB4RkZDMDFCMEMJLyogRE1BIENvbnRyb2xsZXIgMSBUcmFmZmljIENvbnRyb2wgUGVyaW9kcyBSZWdpc3RlciAqLworI2RlZmluZQlETUFDMV9UQ19DTlQJCQkweEZGQzAxQjEwCS8qIERNQSBDb250cm9sbGVyIDEgVHJhZmZpYyBDb250cm9sIEN1cnJlbnQgQ291bnRzIFJlZ2lzdGVyICovCisKKy8qIEFsdGVybmF0ZSBkZXByZWNhdGVkCXJlZ2lzdGVyIG5hbWVzIChiZWxvdykgcHJvdmlkZWQJZm9yIGJhY2t3YXJkcyBjb2RlIGNvbXBhdGliaWxpdHkgKi8KKyNkZWZpbmUJRE1BMV9UQ1BFUgkJCURNQUMxX1RDX1BFUgorI2RlZmluZQlETUExX1RDQ05UCQkJRE1BQzFfVENfQ05UCisKKworLyogRE1BIENvbnRyb2xsZXIgMSAoMHhGRkMwMUMwMAktIDB4RkZDMDFGRkYpCQkJCQkJCSAqLworI2RlZmluZQlETUE4X05FWFRfREVTQ19QVFIJCTB4RkZDMDFDMDAJLyogRE1BIENoYW5uZWwgOCBOZXh0IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLworI2RlZmluZQlETUE4X1NUQVJUX0FERFIJCQkweEZGQzAxQzA0CS8qIERNQSBDaGFubmVsIDggU3RhcnQgQWRkcmVzcyBSZWdpc3RlciAqLworI2RlZmluZQlETUE4X0NPTkZJRwkJCQkweEZGQzAxQzA4CS8qIERNQSBDaGFubmVsIDggQ29uZmlndXJhdGlvbiBSZWdpc3RlciAqLworI2RlZmluZQlETUE4X1hfQ09VTlQJCQkweEZGQzAxQzEwCS8qIERNQSBDaGFubmVsIDggWCBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlETUE4X1hfTU9ESUZZCQkJMHhGRkMwMUMxNAkvKiBETUEgQ2hhbm5lbCA4IFggTW9kaWZ5IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQThfWV9DT1VOVAkJCTB4RkZDMDFDMTgJLyogRE1BIENoYW5uZWwgOCBZIENvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQThfWV9NT0RJRlkJCQkweEZGQzAxQzFDCS8qIERNQSBDaGFubmVsIDggWSBNb2RpZnkgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BOF9DVVJSX0RFU0NfUFRSCQkweEZGQzAxQzIwCS8qIERNQSBDaGFubmVsIDggQ3VycmVudCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BOF9DVVJSX0FERFIJCQkweEZGQzAxQzI0CS8qIERNQSBDaGFubmVsIDggQ3VycmVudCBBZGRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQThfSVJRX1NUQVRVUwkJCTB4RkZDMDFDMjgJLyogRE1BIENoYW5uZWwgOCBJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQThfUEVSSVBIRVJBTF9NQVAJCTB4RkZDMDFDMkMJLyogRE1BIENoYW5uZWwgOCBQZXJpcGhlcmFsIE1hcAlSZWdpc3RlciAqLworI2RlZmluZQlETUE4X0NVUlJfWF9DT1VOVAkJMHhGRkMwMUMzMAkvKiBETUEgQ2hhbm5lbCA4IEN1cnJlbnQgWCBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlETUE4X0NVUlJfWV9DT1VOVAkJMHhGRkMwMUMzOAkvKiBETUEgQ2hhbm5lbCA4IEN1cnJlbnQgWSBDb3VudCBSZWdpc3RlciAqLworCisjZGVmaW5lCURNQTlfTkVYVF9ERVNDX1BUUgkJMHhGRkMwMUM0MAkvKiBETUEgQ2hhbm5lbCA5IE5leHQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTlfU1RBUlRfQUREUgkJCTB4RkZDMDFDNDQJLyogRE1BIENoYW5uZWwgOSBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTlfQ09ORklHCQkJCTB4RkZDMDFDNDgJLyogRE1BIENoYW5uZWwgOSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTlfWF9DT1VOVAkJCTB4RkZDMDFDNTAJLyogRE1BIENoYW5uZWwgOSBYIENvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTlfWF9NT0RJRlkJCQkweEZGQzAxQzU0CS8qIERNQSBDaGFubmVsIDkgWCBNb2RpZnkgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BOV9ZX0NPVU5UCQkJMHhGRkMwMUM1OAkvKiBETUEgQ2hhbm5lbCA5IFkgQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BOV9ZX01PRElGWQkJCTB4RkZDMDFDNUMJLyogRE1BIENoYW5uZWwgOSBZIE1vZGlmeSBSZWdpc3RlciAqLworI2RlZmluZQlETUE5X0NVUlJfREVTQ19QVFIJCTB4RkZDMDFDNjAJLyogRE1BIENoYW5uZWwgOSBDdXJyZW50IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLworI2RlZmluZQlETUE5X0NVUlJfQUREUgkJCTB4RkZDMDFDNjQJLyogRE1BIENoYW5uZWwgOSBDdXJyZW50IEFkZHJlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BOV9JUlFfU1RBVFVTCQkJMHhGRkMwMUM2OAkvKiBETUEgQ2hhbm5lbCA5IEludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BOV9QRVJJUEhFUkFMX01BUAkJMHhGRkMwMUM2QwkvKiBETUEgQ2hhbm5lbCA5IFBlcmlwaGVyYWwgTWFwCVJlZ2lzdGVyICovCisjZGVmaW5lCURNQTlfQ1VSUl9YX0NPVU5UCQkweEZGQzAxQzcwCS8qIERNQSBDaGFubmVsIDkgQ3VycmVudCBYIENvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTlfQ1VSUl9ZX0NPVU5UCQkweEZGQzAxQzc4CS8qIERNQSBDaGFubmVsIDkgQ3VycmVudCBZIENvdW50IFJlZ2lzdGVyICovCisKKyNkZWZpbmUJRE1BMTBfTkVYVF9ERVNDX1BUUgkJMHhGRkMwMUM4MAkvKiBETUEgQ2hhbm5lbCAxMCBOZXh0IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLworI2RlZmluZQlETUExMF9TVEFSVF9BRERSCQkweEZGQzAxQzg0CS8qIERNQSBDaGFubmVsIDEwIFN0YXJ0CUFkZHJlc3MJUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTBfQ09ORklHCQkJMHhGRkMwMUM4OAkvKiBETUEgQ2hhbm5lbCAxMCBDb25maWd1cmF0aW9uCVJlZ2lzdGVyICovCisjZGVmaW5lCURNQTEwX1hfQ09VTlQJCQkweEZGQzAxQzkwCS8qIERNQSBDaGFubmVsIDEwIFggQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTBfWF9NT0RJRlkJCQkweEZGQzAxQzk0CS8qIERNQSBDaGFubmVsIDEwIFggTW9kaWZ5IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTEwX1lfQ09VTlQJCQkweEZGQzAxQzk4CS8qIERNQSBDaGFubmVsIDEwIFkgQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTBfWV9NT0RJRlkJCQkweEZGQzAxQzlDCS8qIERNQSBDaGFubmVsIDEwIFkgTW9kaWZ5IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTEwX0NVUlJfREVTQ19QVFIJCTB4RkZDMDFDQTAJLyogRE1BIENoYW5uZWwgMTAgQ3VycmVudCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTBfQ1VSUl9BRERSCQkJMHhGRkMwMUNBNAkvKiBETUEgQ2hhbm5lbCAxMCBDdXJyZW50IEFkZHJlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTBfSVJRX1NUQVRVUwkJMHhGRkMwMUNBOAkvKiBETUEgQ2hhbm5lbCAxMCBJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTEwX1BFUklQSEVSQUxfTUFQCTB4RkZDMDFDQUMJLyogRE1BIENoYW5uZWwgMTAgUGVyaXBoZXJhbCBNYXAgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTBfQ1VSUl9YX0NPVU5UCQkweEZGQzAxQ0IwCS8qIERNQSBDaGFubmVsIDEwIEN1cnJlbnQgWCBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlETUExMF9DVVJSX1lfQ09VTlQJCTB4RkZDMDFDQjgJLyogRE1BIENoYW5uZWwgMTAgQ3VycmVudCBZIENvdW50IFJlZ2lzdGVyICovCisKKyNkZWZpbmUJRE1BMTFfTkVYVF9ERVNDX1BUUgkJMHhGRkMwMUNDMAkvKiBETUEgQ2hhbm5lbCAxMSBOZXh0IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLworI2RlZmluZQlETUExMV9TVEFSVF9BRERSCQkweEZGQzAxQ0M0CS8qIERNQSBDaGFubmVsIDExIFN0YXJ0CUFkZHJlc3MJUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTFfQ09ORklHCQkJMHhGRkMwMUNDOAkvKiBETUEgQ2hhbm5lbCAxMSBDb25maWd1cmF0aW9uCVJlZ2lzdGVyICovCisjZGVmaW5lCURNQTExX1hfQ09VTlQJCQkweEZGQzAxQ0QwCS8qIERNQSBDaGFubmVsIDExIFggQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTFfWF9NT0RJRlkJCQkweEZGQzAxQ0Q0CS8qIERNQSBDaGFubmVsIDExIFggTW9kaWZ5IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTExX1lfQ09VTlQJCQkweEZGQzAxQ0Q4CS8qIERNQSBDaGFubmVsIDExIFkgQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTFfWV9NT0RJRlkJCQkweEZGQzAxQ0RDCS8qIERNQSBDaGFubmVsIDExIFkgTW9kaWZ5IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTExX0NVUlJfREVTQ19QVFIJCTB4RkZDMDFDRTAJLyogRE1BIENoYW5uZWwgMTEgQ3VycmVudCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTFfQ1VSUl9BRERSCQkJMHhGRkMwMUNFNAkvKiBETUEgQ2hhbm5lbCAxMSBDdXJyZW50IEFkZHJlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTFfSVJRX1NUQVRVUwkJMHhGRkMwMUNFOAkvKiBETUEgQ2hhbm5lbCAxMSBJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTExX1BFUklQSEVSQUxfTUFQCTB4RkZDMDFDRUMJLyogRE1BIENoYW5uZWwgMTEgUGVyaXBoZXJhbCBNYXAgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTFfQ1VSUl9YX0NPVU5UCQkweEZGQzAxQ0YwCS8qIERNQSBDaGFubmVsIDExIEN1cnJlbnQgWCBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlETUExMV9DVVJSX1lfQ09VTlQJCTB4RkZDMDFDRjgJLyogRE1BIENoYW5uZWwgMTEgQ3VycmVudCBZIENvdW50IFJlZ2lzdGVyICovCisKKyNkZWZpbmUJRE1BMTJfTkVYVF9ERVNDX1BUUgkJMHhGRkMwMUQwMAkvKiBETUEgQ2hhbm5lbCAxMiBOZXh0IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLworI2RlZmluZQlETUExMl9TVEFSVF9BRERSCQkweEZGQzAxRDA0CS8qIERNQSBDaGFubmVsIDEyIFN0YXJ0CUFkZHJlc3MJUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTJfQ09ORklHCQkJMHhGRkMwMUQwOAkvKiBETUEgQ2hhbm5lbCAxMiBDb25maWd1cmF0aW9uCVJlZ2lzdGVyICovCisjZGVmaW5lCURNQTEyX1hfQ09VTlQJCQkweEZGQzAxRDEwCS8qIERNQSBDaGFubmVsIDEyIFggQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTJfWF9NT0RJRlkJCQkweEZGQzAxRDE0CS8qIERNQSBDaGFubmVsIDEyIFggTW9kaWZ5IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTEyX1lfQ09VTlQJCQkweEZGQzAxRDE4CS8qIERNQSBDaGFubmVsIDEyIFkgQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTJfWV9NT0RJRlkJCQkweEZGQzAxRDFDCS8qIERNQSBDaGFubmVsIDEyIFkgTW9kaWZ5IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTEyX0NVUlJfREVTQ19QVFIJCTB4RkZDMDFEMjAJLyogRE1BIENoYW5uZWwgMTIgQ3VycmVudCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTJfQ1VSUl9BRERSCQkJMHhGRkMwMUQyNAkvKiBETUEgQ2hhbm5lbCAxMiBDdXJyZW50IEFkZHJlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTJfSVJRX1NUQVRVUwkJMHhGRkMwMUQyOAkvKiBETUEgQ2hhbm5lbCAxMiBJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTEyX1BFUklQSEVSQUxfTUFQCTB4RkZDMDFEMkMJLyogRE1BIENoYW5uZWwgMTIgUGVyaXBoZXJhbCBNYXAgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTJfQ1VSUl9YX0NPVU5UCQkweEZGQzAxRDMwCS8qIERNQSBDaGFubmVsIDEyIEN1cnJlbnQgWCBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlETUExMl9DVVJSX1lfQ09VTlQJCTB4RkZDMDFEMzgJLyogRE1BIENoYW5uZWwgMTIgQ3VycmVudCBZIENvdW50IFJlZ2lzdGVyICovCisKKyNkZWZpbmUJRE1BMTNfTkVYVF9ERVNDX1BUUgkJMHhGRkMwMUQ0MAkvKiBETUEgQ2hhbm5lbCAxMyBOZXh0IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLworI2RlZmluZQlETUExM19TVEFSVF9BRERSCQkweEZGQzAxRDQ0CS8qIERNQSBDaGFubmVsIDEzIFN0YXJ0CUFkZHJlc3MJUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTNfQ09ORklHCQkJMHhGRkMwMUQ0OAkvKiBETUEgQ2hhbm5lbCAxMyBDb25maWd1cmF0aW9uCVJlZ2lzdGVyICovCisjZGVmaW5lCURNQTEzX1hfQ09VTlQJCQkweEZGQzAxRDUwCS8qIERNQSBDaGFubmVsIDEzIFggQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTNfWF9NT0RJRlkJCQkweEZGQzAxRDU0CS8qIERNQSBDaGFubmVsIDEzIFggTW9kaWZ5IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTEzX1lfQ09VTlQJCQkweEZGQzAxRDU4CS8qIERNQSBDaGFubmVsIDEzIFkgQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTNfWV9NT0RJRlkJCQkweEZGQzAxRDVDCS8qIERNQSBDaGFubmVsIDEzIFkgTW9kaWZ5IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTEzX0NVUlJfREVTQ19QVFIJCTB4RkZDMDFENjAJLyogRE1BIENoYW5uZWwgMTMgQ3VycmVudCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTNfQ1VSUl9BRERSCQkJMHhGRkMwMUQ2NAkvKiBETUEgQ2hhbm5lbCAxMyBDdXJyZW50IEFkZHJlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTNfSVJRX1NUQVRVUwkJMHhGRkMwMUQ2OAkvKiBETUEgQ2hhbm5lbCAxMyBJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTEzX1BFUklQSEVSQUxfTUFQCTB4RkZDMDFENkMJLyogRE1BIENoYW5uZWwgMTMgUGVyaXBoZXJhbCBNYXAgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTNfQ1VSUl9YX0NPVU5UCQkweEZGQzAxRDcwCS8qIERNQSBDaGFubmVsIDEzIEN1cnJlbnQgWCBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlETUExM19DVVJSX1lfQ09VTlQJCTB4RkZDMDFENzgJLyogRE1BIENoYW5uZWwgMTMgQ3VycmVudCBZIENvdW50IFJlZ2lzdGVyICovCisKKyNkZWZpbmUJRE1BMTRfTkVYVF9ERVNDX1BUUgkJMHhGRkMwMUQ4MAkvKiBETUEgQ2hhbm5lbCAxNCBOZXh0IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLworI2RlZmluZQlETUExNF9TVEFSVF9BRERSCQkweEZGQzAxRDg0CS8qIERNQSBDaGFubmVsIDE0IFN0YXJ0CUFkZHJlc3MJUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTRfQ09ORklHCQkJMHhGRkMwMUQ4OAkvKiBETUEgQ2hhbm5lbCAxNCBDb25maWd1cmF0aW9uCVJlZ2lzdGVyICovCisjZGVmaW5lCURNQTE0X1hfQ09VTlQJCQkweEZGQzAxRDkwCS8qIERNQSBDaGFubmVsIDE0IFggQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTRfWF9NT0RJRlkJCQkweEZGQzAxRDk0CS8qIERNQSBDaGFubmVsIDE0IFggTW9kaWZ5IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTE0X1lfQ09VTlQJCQkweEZGQzAxRDk4CS8qIERNQSBDaGFubmVsIDE0IFkgQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTRfWV9NT0RJRlkJCQkweEZGQzAxRDlDCS8qIERNQSBDaGFubmVsIDE0IFkgTW9kaWZ5IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTE0X0NVUlJfREVTQ19QVFIJCTB4RkZDMDFEQTAJLyogRE1BIENoYW5uZWwgMTQgQ3VycmVudCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTRfQ1VSUl9BRERSCQkJMHhGRkMwMURBNAkvKiBETUEgQ2hhbm5lbCAxNCBDdXJyZW50IEFkZHJlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTRfSVJRX1NUQVRVUwkJMHhGRkMwMURBOAkvKiBETUEgQ2hhbm5lbCAxNCBJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTE0X1BFUklQSEVSQUxfTUFQCTB4RkZDMDFEQUMJLyogRE1BIENoYW5uZWwgMTQgUGVyaXBoZXJhbCBNYXAgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTRfQ1VSUl9YX0NPVU5UCQkweEZGQzAxREIwCS8qIERNQSBDaGFubmVsIDE0IEN1cnJlbnQgWCBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlETUExNF9DVVJSX1lfQ09VTlQJCTB4RkZDMDFEQjgJLyogRE1BIENoYW5uZWwgMTQgQ3VycmVudCBZIENvdW50IFJlZ2lzdGVyICovCisKKyNkZWZpbmUJRE1BMTVfTkVYVF9ERVNDX1BUUgkJMHhGRkMwMURDMAkvKiBETUEgQ2hhbm5lbCAxNSBOZXh0IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLworI2RlZmluZQlETUExNV9TVEFSVF9BRERSCQkweEZGQzAxREM0CS8qIERNQSBDaGFubmVsIDE1IFN0YXJ0CUFkZHJlc3MJUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTVfQ09ORklHCQkJMHhGRkMwMURDOAkvKiBETUEgQ2hhbm5lbCAxNSBDb25maWd1cmF0aW9uCVJlZ2lzdGVyICovCisjZGVmaW5lCURNQTE1X1hfQ09VTlQJCQkweEZGQzAxREQwCS8qIERNQSBDaGFubmVsIDE1IFggQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTVfWF9NT0RJRlkJCQkweEZGQzAxREQ0CS8qIERNQSBDaGFubmVsIDE1IFggTW9kaWZ5IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTE1X1lfQ09VTlQJCQkweEZGQzAxREQ4CS8qIERNQSBDaGFubmVsIDE1IFkgQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTVfWV9NT0RJRlkJCQkweEZGQzAxRERDCS8qIERNQSBDaGFubmVsIDE1IFkgTW9kaWZ5IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTE1X0NVUlJfREVTQ19QVFIJCTB4RkZDMDFERTAJLyogRE1BIENoYW5uZWwgMTUgQ3VycmVudCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTVfQ1VSUl9BRERSCQkJMHhGRkMwMURFNAkvKiBETUEgQ2hhbm5lbCAxNSBDdXJyZW50IEFkZHJlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTVfSVJRX1NUQVRVUwkJMHhGRkMwMURFOAkvKiBETUEgQ2hhbm5lbCAxNSBJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTE1X1BFUklQSEVSQUxfTUFQCTB4RkZDMDFERUMJLyogRE1BIENoYW5uZWwgMTUgUGVyaXBoZXJhbCBNYXAgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTVfQ1VSUl9YX0NPVU5UCQkweEZGQzAxREYwCS8qIERNQSBDaGFubmVsIDE1IEN1cnJlbnQgWCBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlETUExNV9DVVJSX1lfQ09VTlQJCTB4RkZDMDFERjgJLyogRE1BIENoYW5uZWwgMTUgQ3VycmVudCBZIENvdW50IFJlZ2lzdGVyICovCisKKyNkZWZpbmUJRE1BMTZfTkVYVF9ERVNDX1BUUgkJMHhGRkMwMUUwMAkvKiBETUEgQ2hhbm5lbCAxNiBOZXh0IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLworI2RlZmluZQlETUExNl9TVEFSVF9BRERSCQkweEZGQzAxRTA0CS8qIERNQSBDaGFubmVsIDE2IFN0YXJ0CUFkZHJlc3MJUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTZfQ09ORklHCQkJMHhGRkMwMUUwOAkvKiBETUEgQ2hhbm5lbCAxNiBDb25maWd1cmF0aW9uCVJlZ2lzdGVyICovCisjZGVmaW5lCURNQTE2X1hfQ09VTlQJCQkweEZGQzAxRTEwCS8qIERNQSBDaGFubmVsIDE2IFggQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTZfWF9NT0RJRlkJCQkweEZGQzAxRTE0CS8qIERNQSBDaGFubmVsIDE2IFggTW9kaWZ5IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTE2X1lfQ09VTlQJCQkweEZGQzAxRTE4CS8qIERNQSBDaGFubmVsIDE2IFkgQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTZfWV9NT0RJRlkJCQkweEZGQzAxRTFDCS8qIERNQSBDaGFubmVsIDE2IFkgTW9kaWZ5IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTE2X0NVUlJfREVTQ19QVFIJCTB4RkZDMDFFMjAJLyogRE1BIENoYW5uZWwgMTYgQ3VycmVudCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTZfQ1VSUl9BRERSCQkJMHhGRkMwMUUyNAkvKiBETUEgQ2hhbm5lbCAxNiBDdXJyZW50IEFkZHJlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTZfSVJRX1NUQVRVUwkJMHhGRkMwMUUyOAkvKiBETUEgQ2hhbm5lbCAxNiBJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTE2X1BFUklQSEVSQUxfTUFQCTB4RkZDMDFFMkMJLyogRE1BIENoYW5uZWwgMTYgUGVyaXBoZXJhbCBNYXAgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTZfQ1VSUl9YX0NPVU5UCQkweEZGQzAxRTMwCS8qIERNQSBDaGFubmVsIDE2IEN1cnJlbnQgWCBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlETUExNl9DVVJSX1lfQ09VTlQJCTB4RkZDMDFFMzgJLyogRE1BIENoYW5uZWwgMTYgQ3VycmVudCBZIENvdW50IFJlZ2lzdGVyICovCisKKyNkZWZpbmUJRE1BMTdfTkVYVF9ERVNDX1BUUgkJMHhGRkMwMUU0MAkvKiBETUEgQ2hhbm5lbCAxNyBOZXh0IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLworI2RlZmluZQlETUExN19TVEFSVF9BRERSCQkweEZGQzAxRTQ0CS8qIERNQSBDaGFubmVsIDE3IFN0YXJ0CUFkZHJlc3MJUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTdfQ09ORklHCQkJMHhGRkMwMUU0OAkvKiBETUEgQ2hhbm5lbCAxNyBDb25maWd1cmF0aW9uCVJlZ2lzdGVyICovCisjZGVmaW5lCURNQTE3X1hfQ09VTlQJCQkweEZGQzAxRTUwCS8qIERNQSBDaGFubmVsIDE3IFggQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTdfWF9NT0RJRlkJCQkweEZGQzAxRTU0CS8qIERNQSBDaGFubmVsIDE3IFggTW9kaWZ5IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTE3X1lfQ09VTlQJCQkweEZGQzAxRTU4CS8qIERNQSBDaGFubmVsIDE3IFkgQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTdfWV9NT0RJRlkJCQkweEZGQzAxRTVDCS8qIERNQSBDaGFubmVsIDE3IFkgTW9kaWZ5IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTE3X0NVUlJfREVTQ19QVFIJCTB4RkZDMDFFNjAJLyogRE1BIENoYW5uZWwgMTcgQ3VycmVudCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTdfQ1VSUl9BRERSCQkJMHhGRkMwMUU2NAkvKiBETUEgQ2hhbm5lbCAxNyBDdXJyZW50IEFkZHJlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTdfSVJRX1NUQVRVUwkJMHhGRkMwMUU2OAkvKiBETUEgQ2hhbm5lbCAxNyBJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTE3X1BFUklQSEVSQUxfTUFQCTB4RkZDMDFFNkMJLyogRE1BIENoYW5uZWwgMTcgUGVyaXBoZXJhbCBNYXAgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTdfQ1VSUl9YX0NPVU5UCQkweEZGQzAxRTcwCS8qIERNQSBDaGFubmVsIDE3IEN1cnJlbnQgWCBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlETUExN19DVVJSX1lfQ09VTlQJCTB4RkZDMDFFNzgJLyogRE1BIENoYW5uZWwgMTcgQ3VycmVudCBZIENvdW50IFJlZ2lzdGVyICovCisKKyNkZWZpbmUJRE1BMThfTkVYVF9ERVNDX1BUUgkJMHhGRkMwMUU4MAkvKiBETUEgQ2hhbm5lbCAxOCBOZXh0IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLworI2RlZmluZQlETUExOF9TVEFSVF9BRERSCQkweEZGQzAxRTg0CS8qIERNQSBDaGFubmVsIDE4IFN0YXJ0CUFkZHJlc3MJUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMThfQ09ORklHCQkJMHhGRkMwMUU4OAkvKiBETUEgQ2hhbm5lbCAxOCBDb25maWd1cmF0aW9uCVJlZ2lzdGVyICovCisjZGVmaW5lCURNQTE4X1hfQ09VTlQJCQkweEZGQzAxRTkwCS8qIERNQSBDaGFubmVsIDE4IFggQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMThfWF9NT0RJRlkJCQkweEZGQzAxRTk0CS8qIERNQSBDaGFubmVsIDE4IFggTW9kaWZ5IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTE4X1lfQ09VTlQJCQkweEZGQzAxRTk4CS8qIERNQSBDaGFubmVsIDE4IFkgQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMThfWV9NT0RJRlkJCQkweEZGQzAxRTlDCS8qIERNQSBDaGFubmVsIDE4IFkgTW9kaWZ5IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTE4X0NVUlJfREVTQ19QVFIJCTB4RkZDMDFFQTAJLyogRE1BIENoYW5uZWwgMTggQ3VycmVudCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMThfQ1VSUl9BRERSCQkJMHhGRkMwMUVBNAkvKiBETUEgQ2hhbm5lbCAxOCBDdXJyZW50IEFkZHJlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMThfSVJRX1NUQVRVUwkJMHhGRkMwMUVBOAkvKiBETUEgQ2hhbm5lbCAxOCBJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTE4X1BFUklQSEVSQUxfTUFQCTB4RkZDMDFFQUMJLyogRE1BIENoYW5uZWwgMTggUGVyaXBoZXJhbCBNYXAgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMThfQ1VSUl9YX0NPVU5UCQkweEZGQzAxRUIwCS8qIERNQSBDaGFubmVsIDE4IEN1cnJlbnQgWCBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlETUExOF9DVVJSX1lfQ09VTlQJCTB4RkZDMDFFQjgJLyogRE1BIENoYW5uZWwgMTggQ3VycmVudCBZIENvdW50IFJlZ2lzdGVyICovCisKKyNkZWZpbmUJRE1BMTlfTkVYVF9ERVNDX1BUUgkJMHhGRkMwMUVDMAkvKiBETUEgQ2hhbm5lbCAxOSBOZXh0IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLworI2RlZmluZQlETUExOV9TVEFSVF9BRERSCQkweEZGQzAxRUM0CS8qIERNQSBDaGFubmVsIDE5IFN0YXJ0CUFkZHJlc3MJUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTlfQ09ORklHCQkJMHhGRkMwMUVDOAkvKiBETUEgQ2hhbm5lbCAxOSBDb25maWd1cmF0aW9uCVJlZ2lzdGVyICovCisjZGVmaW5lCURNQTE5X1hfQ09VTlQJCQkweEZGQzAxRUQwCS8qIERNQSBDaGFubmVsIDE5IFggQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTlfWF9NT0RJRlkJCQkweEZGQzAxRUQ0CS8qIERNQSBDaGFubmVsIDE5IFggTW9kaWZ5IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTE5X1lfQ09VTlQJCQkweEZGQzAxRUQ4CS8qIERNQSBDaGFubmVsIDE5IFkgQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTlfWV9NT0RJRlkJCQkweEZGQzAxRURDCS8qIERNQSBDaGFubmVsIDE5IFkgTW9kaWZ5IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTE5X0NVUlJfREVTQ19QVFIJCTB4RkZDMDFFRTAJLyogRE1BIENoYW5uZWwgMTkgQ3VycmVudCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTlfQ1VSUl9BRERSCQkJMHhGRkMwMUVFNAkvKiBETUEgQ2hhbm5lbCAxOSBDdXJyZW50IEFkZHJlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTlfSVJRX1NUQVRVUwkJMHhGRkMwMUVFOAkvKiBETUEgQ2hhbm5lbCAxOSBJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTE5X1BFUklQSEVSQUxfTUFQCTB4RkZDMDFFRUMJLyogRE1BIENoYW5uZWwgMTkgUGVyaXBoZXJhbCBNYXAgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTlfQ1VSUl9YX0NPVU5UCQkweEZGQzAxRUYwCS8qIERNQSBDaGFubmVsIDE5IEN1cnJlbnQgWCBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlETUExOV9DVVJSX1lfQ09VTlQJCTB4RkZDMDFFRjgJLyogRE1BIENoYW5uZWwgMTkgQ3VycmVudCBZIENvdW50IFJlZ2lzdGVyICovCisKKyNkZWZpbmUJTURNQTFfRDBfTkVYVF9ERVNDX1BUUgkweEZGQzAxRjAwCS8qIE1lbURNQTEgU3RyZWFtIDAgRGVzdGluYXRpb24JTmV4dCBEZXNjcmlwdG9yCVBvaW50ZXIJUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQTFfRDBfU1RBUlRfQUREUgkJMHhGRkMwMUYwNAkvKiBNZW1ETUExIFN0cmVhbSAwIERlc3RpbmF0aW9uCVN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQTFfRDBfQ09ORklHCQkJMHhGRkMwMUYwOAkvKiBNZW1ETUExIFN0cmVhbSAwIERlc3RpbmF0aW9uCUNvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQTFfRDBfWF9DT1VOVAkJMHhGRkMwMUYxMAkvKiBNZW1ETUExIFN0cmVhbSAwIERlc3RpbmF0aW9uCVggQ291bnQJUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQTFfRDBfWF9NT0RJRlkJCTB4RkZDMDFGMTQJLyogTWVtRE1BMSBTdHJlYW0gMCBEZXN0aW5hdGlvbglYIE1vZGlmeSBSZWdpc3RlciAqLworI2RlZmluZQlNRE1BMV9EMF9ZX0NPVU5UCQkweEZGQzAxRjE4CS8qIE1lbURNQTEgU3RyZWFtIDAgRGVzdGluYXRpb24JWSBDb3VudAlSZWdpc3RlciAqLworI2RlZmluZQlNRE1BMV9EMF9ZX01PRElGWQkJMHhGRkMwMUYxQwkvKiBNZW1ETUExIFN0cmVhbSAwIERlc3RpbmF0aW9uCVkgTW9kaWZ5IFJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUExX0QwX0NVUlJfREVTQ19QVFIJMHhGRkMwMUYyMAkvKiBNZW1ETUExIFN0cmVhbSAwIERlc3RpbmF0aW9uCUN1cnJlbnQJRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUExX0QwX0NVUlJfQUREUgkJMHhGRkMwMUYyNAkvKiBNZW1ETUExIFN0cmVhbSAwIERlc3RpbmF0aW9uCUN1cnJlbnQJQWRkcmVzcwlSZWdpc3RlciAqLworI2RlZmluZQlNRE1BMV9EMF9JUlFfU1RBVFVTCQkweEZGQzAxRjI4CS8qIE1lbURNQTEgU3RyZWFtIDAgRGVzdGluYXRpb24JSW50ZXJydXB0L1N0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZQlNRE1BMV9EMF9QRVJJUEhFUkFMX01BUAkweEZGQzAxRjJDCS8qIE1lbURNQTEgU3RyZWFtIDAgRGVzdGluYXRpb24JUGVyaXBoZXJhbCBNYXAgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQTFfRDBfQ1VSUl9YX0NPVU5UCTB4RkZDMDFGMzAJLyogTWVtRE1BMSBTdHJlYW0gMCBEZXN0aW5hdGlvbglDdXJyZW50CVggQ291bnQJUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQTFfRDBfQ1VSUl9ZX0NPVU5UCTB4RkZDMDFGMzgJLyogTWVtRE1BMSBTdHJlYW0gMCBEZXN0aW5hdGlvbglDdXJyZW50CVkgQ291bnQJUmVnaXN0ZXIgKi8KKworI2RlZmluZQlNRE1BMV9TMF9ORVhUX0RFU0NfUFRSCTB4RkZDMDFGNDAJLyogTWVtRE1BMSBTdHJlYW0gMCBTb3VyY2UgTmV4dAlEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQTFfUzBfU1RBUlRfQUREUgkJMHhGRkMwMUY0NAkvKiBNZW1ETUExIFN0cmVhbSAwIFNvdXJjZSBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUExX1MwX0NPTkZJRwkJCTB4RkZDMDFGNDgJLyogTWVtRE1BMSBTdHJlYW0gMCBTb3VyY2UgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAqLworI2RlZmluZQlNRE1BMV9TMF9YX0NPVU5UCQkweEZGQzAxRjUwCS8qIE1lbURNQTEgU3RyZWFtIDAgU291cmNlIFggQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQTFfUzBfWF9NT0RJRlkJCTB4RkZDMDFGNTQJLyogTWVtRE1BMSBTdHJlYW0gMCBTb3VyY2UgWCBNb2RpZnkgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQTFfUzBfWV9DT1VOVAkJMHhGRkMwMUY1OAkvKiBNZW1ETUExIFN0cmVhbSAwIFNvdXJjZSBZIENvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUExX1MwX1lfTU9ESUZZCQkweEZGQzAxRjVDCS8qIE1lbURNQTEgU3RyZWFtIDAgU291cmNlIFkgTW9kaWZ5IFJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUExX1MwX0NVUlJfREVTQ19QVFIJMHhGRkMwMUY2MAkvKiBNZW1ETUExIFN0cmVhbSAwIFNvdXJjZSBDdXJyZW50IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLworI2RlZmluZQlNRE1BMV9TMF9DVVJSX0FERFIJCTB4RkZDMDFGNjQJLyogTWVtRE1BMSBTdHJlYW0gMCBTb3VyY2UgQ3VycmVudCBBZGRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUExX1MwX0lSUV9TVEFUVVMJCTB4RkZDMDFGNjgJLyogTWVtRE1BMSBTdHJlYW0gMCBTb3VyY2UgSW50ZXJydXB0L1N0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZQlNRE1BMV9TMF9QRVJJUEhFUkFMX01BUAkweEZGQzAxRjZDCS8qIE1lbURNQTEgU3RyZWFtIDAgU291cmNlIFBlcmlwaGVyYWwgTWFwIFJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUExX1MwX0NVUlJfWF9DT1VOVAkweEZGQzAxRjcwCS8qIE1lbURNQTEgU3RyZWFtIDAgU291cmNlIEN1cnJlbnQgWCBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlNRE1BMV9TMF9DVVJSX1lfQ09VTlQJMHhGRkMwMUY3OAkvKiBNZW1ETUExIFN0cmVhbSAwIFNvdXJjZSBDdXJyZW50IFkgQ291bnQgUmVnaXN0ZXIgKi8KKworI2RlZmluZQlNRE1BMV9EMV9ORVhUX0RFU0NfUFRSCTB4RkZDMDFGODAJLyogTWVtRE1BMSBTdHJlYW0gMSBEZXN0aW5hdGlvbglOZXh0IERlc2NyaXB0b3IJUG9pbnRlcglSZWdpc3RlciAqLworI2RlZmluZQlNRE1BMV9EMV9TVEFSVF9BRERSCQkweEZGQzAxRjg0CS8qIE1lbURNQTEgU3RyZWFtIDEgRGVzdGluYXRpb24JU3RhcnQgQWRkcmVzcyBSZWdpc3RlciAqLworI2RlZmluZQlNRE1BMV9EMV9DT05GSUcJCQkweEZGQzAxRjg4CS8qIE1lbURNQTEgU3RyZWFtIDEgRGVzdGluYXRpb24JQ29uZmlndXJhdGlvbiBSZWdpc3RlciAqLworI2RlZmluZQlNRE1BMV9EMV9YX0NPVU5UCQkweEZGQzAxRjkwCS8qIE1lbURNQTEgU3RyZWFtIDEgRGVzdGluYXRpb24JWCBDb3VudAlSZWdpc3RlciAqLworI2RlZmluZQlNRE1BMV9EMV9YX01PRElGWQkJMHhGRkMwMUY5NAkvKiBNZW1ETUExIFN0cmVhbSAxIERlc3RpbmF0aW9uCVggTW9kaWZ5IFJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUExX0QxX1lfQ09VTlQJCTB4RkZDMDFGOTgJLyogTWVtRE1BMSBTdHJlYW0gMSBEZXN0aW5hdGlvbglZIENvdW50CVJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUExX0QxX1lfTU9ESUZZCQkweEZGQzAxRjlDCS8qIE1lbURNQTEgU3RyZWFtIDEgRGVzdGluYXRpb24JWSBNb2RpZnkgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQTFfRDFfQ1VSUl9ERVNDX1BUUgkweEZGQzAxRkEwCS8qIE1lbURNQTEgU3RyZWFtIDEgRGVzdGluYXRpb24JQ3VycmVudAlEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQTFfRDFfQ1VSUl9BRERSCQkweEZGQzAxRkE0CS8qIE1lbURNQTEgU3RyZWFtIDEgRGVzdGluYXRpb24JQ3VycmVudAlBZGRyZXNzCVJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUExX0QxX0lSUV9TVEFUVVMJCTB4RkZDMDFGQTgJLyogTWVtRE1BMSBTdHJlYW0gMSBEZXN0aW5hdGlvbglJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUExX0QxX1BFUklQSEVSQUxfTUFQCTB4RkZDMDFGQUMJLyogTWVtRE1BMSBTdHJlYW0gMSBEZXN0aW5hdGlvbglQZXJpcGhlcmFsIE1hcCBSZWdpc3RlciAqLworI2RlZmluZQlNRE1BMV9EMV9DVVJSX1hfQ09VTlQJMHhGRkMwMUZCMAkvKiBNZW1ETUExIFN0cmVhbSAxIERlc3RpbmF0aW9uCUN1cnJlbnQJWCBDb3VudAlSZWdpc3RlciAqLworI2RlZmluZQlNRE1BMV9EMV9DVVJSX1lfQ09VTlQJMHhGRkMwMUZCOAkvKiBNZW1ETUExIFN0cmVhbSAxIERlc3RpbmF0aW9uCUN1cnJlbnQJWSBDb3VudAlSZWdpc3RlciAqLworCisjZGVmaW5lCU1ETUExX1MxX05FWFRfREVTQ19QVFIJMHhGRkMwMUZDMAkvKiBNZW1ETUExIFN0cmVhbSAxIFNvdXJjZSBOZXh0CURlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLworI2RlZmluZQlNRE1BMV9TMV9TVEFSVF9BRERSCQkweEZGQzAxRkM0CS8qIE1lbURNQTEgU3RyZWFtIDEgU291cmNlIFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQTFfUzFfQ09ORklHCQkJMHhGRkMwMUZDOAkvKiBNZW1ETUExIFN0cmVhbSAxIFNvdXJjZSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUExX1MxX1hfQ09VTlQJCTB4RkZDMDFGRDAJLyogTWVtRE1BMSBTdHJlYW0gMSBTb3VyY2UgWCBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlNRE1BMV9TMV9YX01PRElGWQkJMHhGRkMwMUZENAkvKiBNZW1ETUExIFN0cmVhbSAxIFNvdXJjZSBYIE1vZGlmeSBSZWdpc3RlciAqLworI2RlZmluZQlNRE1BMV9TMV9ZX0NPVU5UCQkweEZGQzAxRkQ4CS8qIE1lbURNQTEgU3RyZWFtIDEgU291cmNlIFkgQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQTFfUzFfWV9NT0RJRlkJCTB4RkZDMDFGREMJLyogTWVtRE1BMSBTdHJlYW0gMSBTb3VyY2UgWSBNb2RpZnkgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQTFfUzFfQ1VSUl9ERVNDX1BUUgkweEZGQzAxRkUwCS8qIE1lbURNQTEgU3RyZWFtIDEgU291cmNlIEN1cnJlbnQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUExX1MxX0NVUlJfQUREUgkJMHhGRkMwMUZFNAkvKiBNZW1ETUExIFN0cmVhbSAxIFNvdXJjZSBDdXJyZW50IEFkZHJlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQTFfUzFfSVJRX1NUQVRVUwkJMHhGRkMwMUZFOAkvKiBNZW1ETUExIFN0cmVhbSAxIFNvdXJjZSBJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUExX1MxX1BFUklQSEVSQUxfTUFQCTB4RkZDMDFGRUMJLyogTWVtRE1BMSBTdHJlYW0gMSBTb3VyY2UgUGVyaXBoZXJhbCBNYXAgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQTFfUzFfQ1VSUl9YX0NPVU5UCTB4RkZDMDFGRjAJLyogTWVtRE1BMSBTdHJlYW0gMSBTb3VyY2UgQ3VycmVudCBYIENvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUExX1MxX0NVUlJfWV9DT1VOVAkweEZGQzAxRkY4CS8qIE1lbURNQTEgU3RyZWFtIDEgU291cmNlIEN1cnJlbnQgWSBDb3VudCBSZWdpc3RlciAqLworCisKKy8qIFVBUlQxIENvbnRyb2xsZXIJCSgweEZGQzAyMDAwIC0gMHhGRkMwMjBGRikJICovCisjZGVmaW5lCVVBUlQxX1RIUgkJCTB4RkZDMDIwMDAJLyogVHJhbnNtaXQgSG9sZGluZyByZWdpc3RlciAqLworI2RlZmluZQlVQVJUMV9SQlIJCQkweEZGQzAyMDAwCS8qIFJlY2VpdmUgQnVmZmVyIHJlZ2lzdGVyICovCisjZGVmaW5lCVVBUlQxX0RMTAkJCTB4RkZDMDIwMDAJLyogRGl2aXNvciBMYXRjaCAoTG93LUJ5dGUpICovCisjZGVmaW5lCVVBUlQxX0lFUgkJCTB4RkZDMDIwMDQJLyogSW50ZXJydXB0IEVuYWJsZSBSZWdpc3RlciAqLworI2RlZmluZQlVQVJUMV9ETEgJCQkweEZGQzAyMDA0CS8qIERpdmlzb3IgTGF0Y2ggKEhpZ2gtQnl0ZSkgKi8KKyNkZWZpbmUJVUFSVDFfSUlSCQkJMHhGRkMwMjAwOAkvKiBJbnRlcnJ1cHQgSWRlbnRpZmljYXRpb24gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJVUFSVDFfTENSCQkJMHhGRkMwMjAwQwkvKiBMaW5lCUNvbnRyb2wJUmVnaXN0ZXIgKi8KKyNkZWZpbmUJVUFSVDFfTUNSCQkJMHhGRkMwMjAxMAkvKiBNb2RlbSBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lCVVBUlQxX0xTUgkJCTB4RkZDMDIwMTQJLyogTGluZQlTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJVUFSVDFfU0NSCQkJMHhGRkMwMjAxQwkvKiBTQ1IgU2NyYXRjaCBSZWdpc3RlciAqLworI2RlZmluZQlVQVJUMV9HQ1RMCQkJMHhGRkMwMjAyNAkvKiBHbG9iYWwgQ29udHJvbCBSZWdpc3RlciAqLworCisKKy8qIFVBUlQyIENvbnRyb2xsZXIJCSgweEZGQzAyMTAwIC0gMHhGRkMwMjFGRikJICovCisjZGVmaW5lCVVBUlQyX1RIUgkJCTB4RkZDMDIxMDAJLyogVHJhbnNtaXQgSG9sZGluZyByZWdpc3RlciAqLworI2RlZmluZQlVQVJUMl9SQlIJCQkweEZGQzAyMTAwCS8qIFJlY2VpdmUgQnVmZmVyIHJlZ2lzdGVyICovCisjZGVmaW5lCVVBUlQyX0RMTAkJCTB4RkZDMDIxMDAJLyogRGl2aXNvciBMYXRjaCAoTG93LUJ5dGUpICovCisjZGVmaW5lCVVBUlQyX0lFUgkJCTB4RkZDMDIxMDQJLyogSW50ZXJydXB0IEVuYWJsZSBSZWdpc3RlciAqLworI2RlZmluZQlVQVJUMl9ETEgJCQkweEZGQzAyMTA0CS8qIERpdmlzb3IgTGF0Y2ggKEhpZ2gtQnl0ZSkgKi8KKyNkZWZpbmUJVUFSVDJfSUlSCQkJMHhGRkMwMjEwOAkvKiBJbnRlcnJ1cHQgSWRlbnRpZmljYXRpb24gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJVUFSVDJfTENSCQkJMHhGRkMwMjEwQwkvKiBMaW5lCUNvbnRyb2wJUmVnaXN0ZXIgKi8KKyNkZWZpbmUJVUFSVDJfTUNSCQkJMHhGRkMwMjExMAkvKiBNb2RlbSBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lCVVBUlQyX0xTUgkJCTB4RkZDMDIxMTQJLyogTGluZQlTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJVUFSVDJfU0NSCQkJMHhGRkMwMjExQwkvKiBTQ1IgU2NyYXRjaCBSZWdpc3RlciAqLworI2RlZmluZQlVQVJUMl9HQ1RMCQkJMHhGRkMwMjEyNAkvKiBHbG9iYWwgQ29udHJvbCBSZWdpc3RlciAqLworCisKKy8qIFR3by1XaXJlIEludGVyZmFjZSAxCSgweEZGQzAyMjAwIC0gMHhGRkMwMjJGRikJCQkgKi8KKyNkZWZpbmUJVFdJMV9DTEtESVYJCQkweEZGQzAyMjAwCS8qIFNlcmlhbCBDbG9jawlEaXZpZGVyCVJlZ2lzdGVyICovCisjZGVmaW5lCVRXSTFfQ09OVFJPTAkJMHhGRkMwMjIwNAkvKiBUV0kxCU1hc3RlciBJbnRlcm5hbAlUaW1lIFJlZmVyZW5jZSBSZWdpc3RlciAqLworI2RlZmluZQlUV0kxX1NMQVZFX0NUUkwJCTB4RkZDMDIyMDgJLyogU2xhdmUgTW9kZSBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lCVRXSTFfU0xBVkVfU1RBVAkJMHhGRkMwMjIwQwkvKiBTbGF2ZSBNb2RlIFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZQlUV0kxX1NMQVZFX0FERFIJCTB4RkZDMDIyMTAJLyogU2xhdmUgTW9kZSBBZGRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lCVRXSTFfTUFTVEVSX0NUUkwJMHhGRkMwMjIxNAkvKiBNYXN0ZXIgTW9kZSBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lCVRXSTFfTUFTVEVSX1NUQVQJMHhGRkMwMjIxOAkvKiBNYXN0ZXIgTW9kZSBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJVFdJMV9NQVNURVJfQUREUgkweEZGQzAyMjFDCS8qIE1hc3RlciBNb2RlIEFkZHJlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJVFdJMV9JTlRfU1RBVAkJMHhGRkMwMjIyMAkvKiBUV0kxCU1hc3RlciBJbnRlcnJ1cHQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJVFdJMV9JTlRfTUFTSwkJMHhGRkMwMjIyNAkvKiBUV0kxCU1hc3RlciBJbnRlcnJ1cHQgTWFzayBSZWdpc3RlciAqLworI2RlZmluZQlUV0kxX0ZJRk9fQ1RSTAkJMHhGRkMwMjIyOAkvKiBGSUZPCUNvbnRyb2wJUmVnaXN0ZXIgKi8KKyNkZWZpbmUJVFdJMV9GSUZPX1NUQVQJCTB4RkZDMDIyMkMJLyogRklGTwlTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJVFdJMV9YTVRfREFUQTgJCTB4RkZDMDIyODAJLyogRklGTwlUcmFuc21pdCBEYXRhIFNpbmdsZSBCeXRlIFJlZ2lzdGVyICovCisjZGVmaW5lCVRXSTFfWE1UX0RBVEExNgkJMHhGRkMwMjI4NAkvKiBGSUZPCVRyYW5zbWl0IERhdGEgRG91YmxlIEJ5dGUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJVFdJMV9SQ1ZfREFUQTgJCTB4RkZDMDIyODgJLyogRklGTwlSZWNlaXZlCURhdGEgU2luZ2xlIEJ5dGUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJVFdJMV9SQ1ZfREFUQTE2CQkweEZGQzAyMjhDCS8qIEZJRk8JUmVjZWl2ZQlEYXRhIERvdWJsZSBCeXRlIFJlZ2lzdGVyICovCisjZGVmaW5lIFRXSTFfUkVHQkFTRQkJVFdJMV9DTEtESVYKKworCisvKiB0aGUgZm9sbG93aW5nIGFyZSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgKi8KKyNkZWZpbmUJVFdJMV9QUkVTQ0FMRQkgIFRXSTFfQ09OVFJPTAorI2RlZmluZQlUV0kxX0lOVF9TUkMJICBUV0kxX0lOVF9TVEFUCisjZGVmaW5lCVRXSTFfSU5UX0VOQUJMRQkgIFRXSTFfSU5UX01BU0sKKworCisvKiBTUEkxCUNvbnRyb2xsZXIJCSgweEZGQzAyMzAwIC0gMHhGRkMwMjNGRikJICovCisjZGVmaW5lCVNQSTFfQ1RMCQkJMHhGRkMwMjMwMCAgLyogU1BJMSBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lCVNQSTFfRkxHCQkJMHhGRkMwMjMwNCAgLyogU1BJMSBGbGFnIHJlZ2lzdGVyICovCisjZGVmaW5lCVNQSTFfU1RBVAkJCTB4RkZDMDIzMDggIC8qIFNQSTEgU3RhdHVzIHJlZ2lzdGVyICovCisjZGVmaW5lCVNQSTFfVERCUgkJCTB4RkZDMDIzMEMgIC8qIFNQSTEgVHJhbnNtaXQgRGF0YSBCdWZmZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJU1BJMV9SREJSCQkJMHhGRkMwMjMxMCAgLyogU1BJMSBSZWNlaXZlIERhdGEgQnVmZmVyCVJlZ2lzdGVyICovCisjZGVmaW5lCVNQSTFfQkFVRAkJCTB4RkZDMDIzMTQgIC8qIFNQSTEgQmF1ZCByYXRlIFJlZ2lzdGVyICovCisjZGVmaW5lCVNQSTFfU0hBRE9XCQkJMHhGRkMwMjMxOCAgLyogU1BJMV9SREJSIFNoYWRvdwlSZWdpc3RlciAqLworI2RlZmluZSBTUEkxX1JFR0JBU0UJCQlTUEkxX0NUTAorCisvKiBTUEkyCUNvbnRyb2xsZXIJCSgweEZGQzAyNDAwIC0gMHhGRkMwMjRGRikJICovCisjZGVmaW5lCVNQSTJfQ1RMCQkJMHhGRkMwMjQwMCAgLyogU1BJMiBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lCVNQSTJfRkxHCQkJMHhGRkMwMjQwNCAgLyogU1BJMiBGbGFnIHJlZ2lzdGVyICovCisjZGVmaW5lCVNQSTJfU1RBVAkJCTB4RkZDMDI0MDggIC8qIFNQSTIgU3RhdHVzIHJlZ2lzdGVyICovCisjZGVmaW5lCVNQSTJfVERCUgkJCTB4RkZDMDI0MEMgIC8qIFNQSTIgVHJhbnNtaXQgRGF0YSBCdWZmZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJU1BJMl9SREJSCQkJMHhGRkMwMjQxMCAgLyogU1BJMiBSZWNlaXZlIERhdGEgQnVmZmVyCVJlZ2lzdGVyICovCisjZGVmaW5lCVNQSTJfQkFVRAkJCTB4RkZDMDI0MTQgIC8qIFNQSTIgQmF1ZCByYXRlIFJlZ2lzdGVyICovCisjZGVmaW5lCVNQSTJfU0hBRE9XCQkJMHhGRkMwMjQxOCAgLyogU1BJMl9SREJSIFNoYWRvdwlSZWdpc3RlciAqLworI2RlZmluZSBTUEkyX1JFR0JBU0UJCQlTUEkyX0NUTAorCisvKiBTUE9SVDIgQ29udHJvbGxlcgkJKDB4RkZDMDI1MDAgLSAweEZGQzAyNUZGKQkJCSAqLworI2RlZmluZQlTUE9SVDJfVENSMQkJCTB4RkZDMDI1MDAJLyogU1BPUlQyIFRyYW5zbWl0IENvbmZpZ3VyYXRpb24gMSBSZWdpc3RlciAqLworI2RlZmluZQlTUE9SVDJfVENSMgkJCTB4RkZDMDI1MDQJLyogU1BPUlQyIFRyYW5zbWl0IENvbmZpZ3VyYXRpb24gMiBSZWdpc3RlciAqLworI2RlZmluZQlTUE9SVDJfVENMS0RJVgkJMHhGRkMwMjUwOAkvKiBTUE9SVDIgVHJhbnNtaXQgQ2xvY2sgRGl2aWRlciAqLworI2RlZmluZQlTUE9SVDJfVEZTRElWCQkweEZGQzAyNTBDCS8qIFNQT1JUMiBUcmFuc21pdCBGcmFtZSBTeW5jIERpdmlkZXIgKi8KKyNkZWZpbmUJU1BPUlQyX1RYCQkJMHhGRkMwMjUxMAkvKiBTUE9SVDIgVFggRGF0YSBSZWdpc3RlciAqLworI2RlZmluZQlTUE9SVDJfUlgJCQkweEZGQzAyNTE4CS8qIFNQT1JUMiBSWCBEYXRhIFJlZ2lzdGVyICovCisjZGVmaW5lCVNQT1JUMl9SQ1IxCQkJMHhGRkMwMjUyMAkvKiBTUE9SVDIgVHJhbnNtaXQgQ29uZmlndXJhdGlvbiAxIFJlZ2lzdGVyICovCisjZGVmaW5lCVNQT1JUMl9SQ1IyCQkJMHhGRkMwMjUyNAkvKiBTUE9SVDIgVHJhbnNtaXQgQ29uZmlndXJhdGlvbiAyIFJlZ2lzdGVyICovCisjZGVmaW5lCVNQT1JUMl9SQ0xLRElWCQkweEZGQzAyNTI4CS8qIFNQT1JUMiBSZWNlaXZlIENsb2NrCURpdmlkZXIgKi8KKyNkZWZpbmUJU1BPUlQyX1JGU0RJVgkJMHhGRkMwMjUyQwkvKiBTUE9SVDIgUmVjZWl2ZSBGcmFtZQlTeW5jIERpdmlkZXIgKi8KKyNkZWZpbmUJU1BPUlQyX1NUQVQJCQkweEZGQzAyNTMwCS8qIFNQT1JUMiBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJU1BPUlQyX0NITkwJCQkweEZGQzAyNTM0CS8qIFNQT1JUMiBDdXJyZW50IENoYW5uZWwgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJU1BPUlQyX01DTUMxCQkweEZGQzAyNTM4CS8qIFNQT1JUMiBNdWx0aS1DaGFubmVsCUNvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgMSAqLworI2RlZmluZQlTUE9SVDJfTUNNQzIJCTB4RkZDMDI1M0MJLyogU1BPUlQyIE11bHRpLUNoYW5uZWwJQ29uZmlndXJhdGlvbiBSZWdpc3RlciAyICovCisjZGVmaW5lCVNQT1JUMl9NVENTMAkJMHhGRkMwMjU0MAkvKiBTUE9SVDIgTXVsdGktQ2hhbm5lbAlUcmFuc21pdCBTZWxlY3QJUmVnaXN0ZXIgMCAqLworI2RlZmluZQlTUE9SVDJfTVRDUzEJCTB4RkZDMDI1NDQJLyogU1BPUlQyIE11bHRpLUNoYW5uZWwJVHJhbnNtaXQgU2VsZWN0CVJlZ2lzdGVyIDEgKi8KKyNkZWZpbmUJU1BPUlQyX01UQ1MyCQkweEZGQzAyNTQ4CS8qIFNQT1JUMiBNdWx0aS1DaGFubmVsCVRyYW5zbWl0IFNlbGVjdAlSZWdpc3RlciAyICovCisjZGVmaW5lCVNQT1JUMl9NVENTMwkJMHhGRkMwMjU0QwkvKiBTUE9SVDIgTXVsdGktQ2hhbm5lbAlUcmFuc21pdCBTZWxlY3QJUmVnaXN0ZXIgMyAqLworI2RlZmluZQlTUE9SVDJfTVJDUzAJCTB4RkZDMDI1NTAJLyogU1BPUlQyIE11bHRpLUNoYW5uZWwJUmVjZWl2ZQlTZWxlY3QgUmVnaXN0ZXIJMCAqLworI2RlZmluZQlTUE9SVDJfTVJDUzEJCTB4RkZDMDI1NTQJLyogU1BPUlQyIE11bHRpLUNoYW5uZWwJUmVjZWl2ZQlTZWxlY3QgUmVnaXN0ZXIJMSAqLworI2RlZmluZQlTUE9SVDJfTVJDUzIJCTB4RkZDMDI1NTgJLyogU1BPUlQyIE11bHRpLUNoYW5uZWwJUmVjZWl2ZQlTZWxlY3QgUmVnaXN0ZXIJMiAqLworI2RlZmluZQlTUE9SVDJfTVJDUzMJCTB4RkZDMDI1NUMJLyogU1BPUlQyIE11bHRpLUNoYW5uZWwJUmVjZWl2ZQlTZWxlY3QgUmVnaXN0ZXIJMyAqLworCisKKy8qIFNQT1JUMyBDb250cm9sbGVyCQkoMHhGRkMwMjYwMCAtIDB4RkZDMDI2RkYpCQkJICovCisjZGVmaW5lCVNQT1JUM19UQ1IxCQkJMHhGRkMwMjYwMAkvKiBTUE9SVDMgVHJhbnNtaXQgQ29uZmlndXJhdGlvbiAxIFJlZ2lzdGVyICovCisjZGVmaW5lCVNQT1JUM19UQ1IyCQkJMHhGRkMwMjYwNAkvKiBTUE9SVDMgVHJhbnNtaXQgQ29uZmlndXJhdGlvbiAyIFJlZ2lzdGVyICovCisjZGVmaW5lCVNQT1JUM19UQ0xLRElWCQkweEZGQzAyNjA4CS8qIFNQT1JUMyBUcmFuc21pdCBDbG9jayBEaXZpZGVyICovCisjZGVmaW5lCVNQT1JUM19URlNESVYJCTB4RkZDMDI2MEMJLyogU1BPUlQzIFRyYW5zbWl0IEZyYW1lIFN5bmMgRGl2aWRlciAqLworI2RlZmluZQlTUE9SVDNfVFgJCQkweEZGQzAyNjEwCS8qIFNQT1JUMyBUWCBEYXRhIFJlZ2lzdGVyICovCisjZGVmaW5lCVNQT1JUM19SWAkJCTB4RkZDMDI2MTgJLyogU1BPUlQzIFJYIERhdGEgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJU1BPUlQzX1JDUjEJCQkweEZGQzAyNjIwCS8qIFNQT1JUMyBUcmFuc21pdCBDb25maWd1cmF0aW9uIDEgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJU1BPUlQzX1JDUjIJCQkweEZGQzAyNjI0CS8qIFNQT1JUMyBUcmFuc21pdCBDb25maWd1cmF0aW9uIDIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJU1BPUlQzX1JDTEtESVYJCTB4RkZDMDI2MjgJLyogU1BPUlQzIFJlY2VpdmUgQ2xvY2sJRGl2aWRlciAqLworI2RlZmluZQlTUE9SVDNfUkZTRElWCQkweEZGQzAyNjJDCS8qIFNQT1JUMyBSZWNlaXZlIEZyYW1lCVN5bmMgRGl2aWRlciAqLworI2RlZmluZQlTUE9SVDNfU1RBVAkJCTB4RkZDMDI2MzAJLyogU1BPUlQzIFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZQlTUE9SVDNfQ0hOTAkJCTB4RkZDMDI2MzQJLyogU1BPUlQzIEN1cnJlbnQgQ2hhbm5lbCBSZWdpc3RlciAqLworI2RlZmluZQlTUE9SVDNfTUNNQzEJCTB4RkZDMDI2MzgJLyogU1BPUlQzIE11bHRpLUNoYW5uZWwJQ29uZmlndXJhdGlvbiBSZWdpc3RlciAxICovCisjZGVmaW5lCVNQT1JUM19NQ01DMgkJMHhGRkMwMjYzQwkvKiBTUE9SVDMgTXVsdGktQ2hhbm5lbAlDb25maWd1cmF0aW9uIFJlZ2lzdGVyIDIgKi8KKyNkZWZpbmUJU1BPUlQzX01UQ1MwCQkweEZGQzAyNjQwCS8qIFNQT1JUMyBNdWx0aS1DaGFubmVsCVRyYW5zbWl0IFNlbGVjdAlSZWdpc3RlciAwICovCisjZGVmaW5lCVNQT1JUM19NVENTMQkJMHhGRkMwMjY0NAkvKiBTUE9SVDMgTXVsdGktQ2hhbm5lbAlUcmFuc21pdCBTZWxlY3QJUmVnaXN0ZXIgMSAqLworI2RlZmluZQlTUE9SVDNfTVRDUzIJCTB4RkZDMDI2NDgJLyogU1BPUlQzIE11bHRpLUNoYW5uZWwJVHJhbnNtaXQgU2VsZWN0CVJlZ2lzdGVyIDIgKi8KKyNkZWZpbmUJU1BPUlQzX01UQ1MzCQkweEZGQzAyNjRDCS8qIFNQT1JUMyBNdWx0aS1DaGFubmVsCVRyYW5zbWl0IFNlbGVjdAlSZWdpc3RlciAzICovCisjZGVmaW5lCVNQT1JUM19NUkNTMAkJMHhGRkMwMjY1MAkvKiBTUE9SVDMgTXVsdGktQ2hhbm5lbAlSZWNlaXZlCVNlbGVjdCBSZWdpc3RlcgkwICovCisjZGVmaW5lCVNQT1JUM19NUkNTMQkJMHhGRkMwMjY1NAkvKiBTUE9SVDMgTXVsdGktQ2hhbm5lbAlSZWNlaXZlCVNlbGVjdCBSZWdpc3RlcgkxICovCisjZGVmaW5lCVNQT1JUM19NUkNTMgkJMHhGRkMwMjY1OAkvKiBTUE9SVDMgTXVsdGktQ2hhbm5lbAlSZWNlaXZlCVNlbGVjdCBSZWdpc3RlcgkyICovCisjZGVmaW5lCVNQT1JUM19NUkNTMwkJMHhGRkMwMjY1QwkvKiBTUE9SVDMgTXVsdGktQ2hhbm5lbAlSZWNlaXZlCVNlbGVjdCBSZWdpc3RlcgkzICovCisKKworLyogTWVkaWEgVHJhbnNjZWl2ZXIgKE1YVlIpICAgKDB4RkZDMDI3MDAgLSAweEZGQzAyOEZGKSAqLworCisjZGVmaW5lCU1YVlJfQ09ORklHCSAgICAgIDB4RkZDMDI3MDAgIC8qIE1YVlIgQ29uZmlndXJhdGlvbglSZWdpc3RlciAqLworI2RlZmluZQlNWFZSX1BMTF9DVExfMAkgICAgICAweEZGQzAyNzA0ICAvKiBNWFZSIFBoYXNlCUxvY2sgTG9vcCBDb250cm9sIFJlZ2lzdGVyIDAgKi8KKworI2RlZmluZQlNWFZSX1NUQVRFXzAJICAgICAgMHhGRkMwMjcwOCAgLyogTVhWUiBTdGF0ZQlSZWdpc3RlciAwICovCisjZGVmaW5lCU1YVlJfU1RBVEVfMQkgICAgICAweEZGQzAyNzBDICAvKiBNWFZSIFN0YXRlCVJlZ2lzdGVyIDEgKi8KKworI2RlZmluZQlNWFZSX0lOVF9TVEFUXzAJICAgICAgMHhGRkMwMjcxMCAgLyogTVhWUiBJbnRlcnJ1cHQgU3RhdHVzIFJlZ2lzdGVyIDAgKi8KKyNkZWZpbmUJTVhWUl9JTlRfU1RBVF8xCSAgICAgIDB4RkZDMDI3MTQgIC8qIE1YVlIgSW50ZXJydXB0IFN0YXR1cyBSZWdpc3RlciAxICovCisKKyNkZWZpbmUJTVhWUl9JTlRfRU5fMAkgICAgICAweEZGQzAyNzE4ICAvKiBNWFZSIEludGVycnVwdCBFbmFibGUgUmVnaXN0ZXIgMCAqLworI2RlZmluZQlNWFZSX0lOVF9FTl8xCSAgICAgIDB4RkZDMDI3MUMgIC8qIE1YVlIgSW50ZXJydXB0IEVuYWJsZSBSZWdpc3RlciAxICovCisKKyNkZWZpbmUJTVhWUl9QT1NJVElPTgkgICAgICAweEZGQzAyNzIwICAvKiBNWFZSIE5vZGUgUG9zaXRpb24JUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTVhWUl9NQVhfUE9TSVRJT04gICAgIDB4RkZDMDI3MjQgIC8qIE1YVlIgTWF4aW11bSBOb2RlIFBvc2l0aW9uCVJlZ2lzdGVyICovCisKKyNkZWZpbmUJTVhWUl9ERUxBWQkgICAgICAweEZGQzAyNzI4ICAvKiBNWFZSIE5vZGUgRnJhbWUgRGVsYXkgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTVhWUl9NQVhfREVMQVkJICAgICAgMHhGRkMwMjcyQyAgLyogTVhWUiBNYXhpbXVtIE5vZGUgRnJhbWUgRGVsYXkgUmVnaXN0ZXIgKi8KKworI2RlZmluZQlNWFZSX0xBRERSCSAgICAgIDB4RkZDMDI3MzAgIC8qIE1YVlIgTG9naWNhbCBBZGRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lCU1YVlJfR0FERFIJICAgICAgMHhGRkMwMjczNCAgLyogTVhWUiBHcm91cAlBZGRyZXNzCVJlZ2lzdGVyICovCisjZGVmaW5lCU1YVlJfQUFERFIJICAgICAgMHhGRkMwMjczOCAgLyogTVhWUiBBbHRlcm5hdGUgQWRkcmVzcyBSZWdpc3RlciAqLworCisjZGVmaW5lCU1YVlJfQUxMT0NfMAkgICAgICAweEZGQzAyNzNDICAvKiBNWFZSIEFsbG9jYXRpb24gVGFibGUgUmVnaXN0ZXIgMCAqLworI2RlZmluZQlNWFZSX0FMTE9DXzEJICAgICAgMHhGRkMwMjc0MCAgLyogTVhWUiBBbGxvY2F0aW9uIFRhYmxlIFJlZ2lzdGVyIDEgKi8KKyNkZWZpbmUJTVhWUl9BTExPQ18yCSAgICAgIDB4RkZDMDI3NDQgIC8qIE1YVlIgQWxsb2NhdGlvbiBUYWJsZSBSZWdpc3RlciAyICovCisjZGVmaW5lCU1YVlJfQUxMT0NfMwkgICAgICAweEZGQzAyNzQ4ICAvKiBNWFZSIEFsbG9jYXRpb24gVGFibGUgUmVnaXN0ZXIgMyAqLworI2RlZmluZQlNWFZSX0FMTE9DXzQJICAgICAgMHhGRkMwMjc0QyAgLyogTVhWUiBBbGxvY2F0aW9uIFRhYmxlIFJlZ2lzdGVyIDQgKi8KKyNkZWZpbmUJTVhWUl9BTExPQ181CSAgICAgIDB4RkZDMDI3NTAgIC8qIE1YVlIgQWxsb2NhdGlvbiBUYWJsZSBSZWdpc3RlciA1ICovCisjZGVmaW5lCU1YVlJfQUxMT0NfNgkgICAgICAweEZGQzAyNzU0ICAvKiBNWFZSIEFsbG9jYXRpb24gVGFibGUgUmVnaXN0ZXIgNiAqLworI2RlZmluZQlNWFZSX0FMTE9DXzcJICAgICAgMHhGRkMwMjc1OCAgLyogTVhWUiBBbGxvY2F0aW9uIFRhYmxlIFJlZ2lzdGVyIDcgKi8KKyNkZWZpbmUJTVhWUl9BTExPQ184CSAgICAgIDB4RkZDMDI3NUMgIC8qIE1YVlIgQWxsb2NhdGlvbiBUYWJsZSBSZWdpc3RlciA4ICovCisjZGVmaW5lCU1YVlJfQUxMT0NfOQkgICAgICAweEZGQzAyNzYwICAvKiBNWFZSIEFsbG9jYXRpb24gVGFibGUgUmVnaXN0ZXIgOSAqLworI2RlZmluZQlNWFZSX0FMTE9DXzEwCSAgICAgIDB4RkZDMDI3NjQgIC8qIE1YVlIgQWxsb2NhdGlvbiBUYWJsZSBSZWdpc3RlciAxMCAqLworI2RlZmluZQlNWFZSX0FMTE9DXzExCSAgICAgIDB4RkZDMDI3NjggIC8qIE1YVlIgQWxsb2NhdGlvbiBUYWJsZSBSZWdpc3RlciAxMSAqLworI2RlZmluZQlNWFZSX0FMTE9DXzEyCSAgICAgIDB4RkZDMDI3NkMgIC8qIE1YVlIgQWxsb2NhdGlvbiBUYWJsZSBSZWdpc3RlciAxMiAqLworI2RlZmluZQlNWFZSX0FMTE9DXzEzCSAgICAgIDB4RkZDMDI3NzAgIC8qIE1YVlIgQWxsb2NhdGlvbiBUYWJsZSBSZWdpc3RlciAxMyAqLworI2RlZmluZQlNWFZSX0FMTE9DXzE0CSAgICAgIDB4RkZDMDI3NzQgIC8qIE1YVlIgQWxsb2NhdGlvbiBUYWJsZSBSZWdpc3RlciAxNCAqLworCisjZGVmaW5lCU1YVlJfU1lOQ19MQ0hBTl8wICAgICAweEZGQzAyNzc4ICAvKiBNWFZSIFN5bmMgRGF0YSBMb2dpY2FsIENoYW5uZWwgQXNzaWduIFJlZ2lzdGVyIDAgKi8KKyNkZWZpbmUJTVhWUl9TWU5DX0xDSEFOXzEgICAgIDB4RkZDMDI3N0MgIC8qIE1YVlIgU3luYyBEYXRhIExvZ2ljYWwgQ2hhbm5lbCBBc3NpZ24gUmVnaXN0ZXIgMSAqLworI2RlZmluZQlNWFZSX1NZTkNfTENIQU5fMiAgICAgMHhGRkMwMjc4MCAgLyogTVhWUiBTeW5jIERhdGEgTG9naWNhbCBDaGFubmVsIEFzc2lnbiBSZWdpc3RlciAyICovCisjZGVmaW5lCU1YVlJfU1lOQ19MQ0hBTl8zICAgICAweEZGQzAyNzg0ICAvKiBNWFZSIFN5bmMgRGF0YSBMb2dpY2FsIENoYW5uZWwgQXNzaWduIFJlZ2lzdGVyIDMgKi8KKyNkZWZpbmUJTVhWUl9TWU5DX0xDSEFOXzQgICAgIDB4RkZDMDI3ODggIC8qIE1YVlIgU3luYyBEYXRhIExvZ2ljYWwgQ2hhbm5lbCBBc3NpZ24gUmVnaXN0ZXIgNCAqLworI2RlZmluZQlNWFZSX1NZTkNfTENIQU5fNSAgICAgMHhGRkMwMjc4QyAgLyogTVhWUiBTeW5jIERhdGEgTG9naWNhbCBDaGFubmVsIEFzc2lnbiBSZWdpc3RlciA1ICovCisjZGVmaW5lCU1YVlJfU1lOQ19MQ0hBTl82ICAgICAweEZGQzAyNzkwICAvKiBNWFZSIFN5bmMgRGF0YSBMb2dpY2FsIENoYW5uZWwgQXNzaWduIFJlZ2lzdGVyIDYgKi8KKyNkZWZpbmUJTVhWUl9TWU5DX0xDSEFOXzcgICAgIDB4RkZDMDI3OTQgIC8qIE1YVlIgU3luYyBEYXRhIExvZ2ljYWwgQ2hhbm5lbCBBc3NpZ24gUmVnaXN0ZXIgNyAqLworCisjZGVmaW5lCU1YVlJfRE1BMF9DT05GSUcgICAgICAweEZGQzAyNzk4ICAvKiBNWFZSIFN5bmMgRGF0YSBETUEwIENvbmZpZwlSZWdpc3RlciAqLworI2RlZmluZQlNWFZSX0RNQTBfU1RBUlRfQUREUiAgMHhGRkMwMjc5QyAgLyogTVhWUiBTeW5jIERhdGEgRE1BMCBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lCU1YVlJfRE1BMF9DT1VOVAkgICAgICAweEZGQzAyN0EwICAvKiBNWFZSIFN5bmMgRGF0YSBETUEwIExvb3AgQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTVhWUl9ETUEwX0NVUlJfQUREUiAgIDB4RkZDMDI3QTQgIC8qIE1YVlIgU3luYyBEYXRhIERNQTAgQ3VycmVudCBBZGRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lCU1YVlJfRE1BMF9DVVJSX0NPVU5UICAweEZGQzAyN0E4ICAvKiBNWFZSIFN5bmMgRGF0YSBETUEwIEN1cnJlbnQgTG9vcCBDb3VudCBSZWdpc3RlciAqLworCisjZGVmaW5lCU1YVlJfRE1BMV9DT05GSUcgICAgICAweEZGQzAyN0FDICAvKiBNWFZSIFN5bmMgRGF0YSBETUExIENvbmZpZwlSZWdpc3RlciAqLworI2RlZmluZQlNWFZSX0RNQTFfU1RBUlRfQUREUiAgMHhGRkMwMjdCMCAgLyogTVhWUiBTeW5jIERhdGEgRE1BMSBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lCU1YVlJfRE1BMV9DT1VOVAkgICAgICAweEZGQzAyN0I0ICAvKiBNWFZSIFN5bmMgRGF0YSBETUExIExvb3AgQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTVhWUl9ETUExX0NVUlJfQUREUiAgIDB4RkZDMDI3QjggIC8qIE1YVlIgU3luYyBEYXRhIERNQTEgQ3VycmVudCBBZGRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lCU1YVlJfRE1BMV9DVVJSX0NPVU5UICAweEZGQzAyN0JDICAvKiBNWFZSIFN5bmMgRGF0YSBETUExIEN1cnJlbnQgTG9vcCBDb3VudCBSZWdpc3RlciAqLworCisjZGVmaW5lCU1YVlJfRE1BMl9DT05GSUcgICAgICAweEZGQzAyN0MwICAvKiBNWFZSIFN5bmMgRGF0YSBETUEyIENvbmZpZwlSZWdpc3RlciAqLworI2RlZmluZQlNWFZSX0RNQTJfU1RBUlRfQUREUiAgMHhGRkMwMjdDNCAgLyogTVhWUiBTeW5jIERhdGEgRE1BMiBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lCU1YVlJfRE1BMl9DT1VOVAkgICAgICAweEZGQzAyN0M4ICAvKiBNWFZSIFN5bmMgRGF0YSBETUEyIExvb3AgQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTVhWUl9ETUEyX0NVUlJfQUREUiAgIDB4RkZDMDI3Q0MgIC8qIE1YVlIgU3luYyBEYXRhIERNQTIgQ3VycmVudCBBZGRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lCU1YVlJfRE1BMl9DVVJSX0NPVU5UICAweEZGQzAyN0QwICAvKiBNWFZSIFN5bmMgRGF0YSBETUEyIEN1cnJlbnQgTG9vcCBDb3VudCBSZWdpc3RlciAqLworCisjZGVmaW5lCU1YVlJfRE1BM19DT05GSUcgICAgICAweEZGQzAyN0Q0ICAvKiBNWFZSIFN5bmMgRGF0YSBETUEzIENvbmZpZwlSZWdpc3RlciAqLworI2RlZmluZQlNWFZSX0RNQTNfU1RBUlRfQUREUiAgMHhGRkMwMjdEOCAgLyogTVhWUiBTeW5jIERhdGEgRE1BMyBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lCU1YVlJfRE1BM19DT1VOVAkgICAgICAweEZGQzAyN0RDICAvKiBNWFZSIFN5bmMgRGF0YSBETUEzIExvb3AgQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTVhWUl9ETUEzX0NVUlJfQUREUiAgIDB4RkZDMDI3RTAgIC8qIE1YVlIgU3luYyBEYXRhIERNQTMgQ3VycmVudCBBZGRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lCU1YVlJfRE1BM19DVVJSX0NPVU5UICAweEZGQzAyN0U0ICAvKiBNWFZSIFN5bmMgRGF0YSBETUEzIEN1cnJlbnQgTG9vcCBDb3VudCBSZWdpc3RlciAqLworCisjZGVmaW5lCU1YVlJfRE1BNF9DT05GSUcgICAgICAweEZGQzAyN0U4ICAvKiBNWFZSIFN5bmMgRGF0YSBETUE0IENvbmZpZwlSZWdpc3RlciAqLworI2RlZmluZQlNWFZSX0RNQTRfU1RBUlRfQUREUiAgMHhGRkMwMjdFQyAgLyogTVhWUiBTeW5jIERhdGEgRE1BNCBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lCU1YVlJfRE1BNF9DT1VOVAkgICAgICAweEZGQzAyN0YwICAvKiBNWFZSIFN5bmMgRGF0YSBETUE0IExvb3AgQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTVhWUl9ETUE0X0NVUlJfQUREUiAgIDB4RkZDMDI3RjQgIC8qIE1YVlIgU3luYyBEYXRhIERNQTQgQ3VycmVudCBBZGRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lCU1YVlJfRE1BNF9DVVJSX0NPVU5UICAweEZGQzAyN0Y4ICAvKiBNWFZSIFN5bmMgRGF0YSBETUE0IEN1cnJlbnQgTG9vcCBDb3VudCBSZWdpc3RlciAqLworCisjZGVmaW5lCU1YVlJfRE1BNV9DT05GSUcgICAgICAweEZGQzAyN0ZDICAvKiBNWFZSIFN5bmMgRGF0YSBETUE1IENvbmZpZwlSZWdpc3RlciAqLworI2RlZmluZQlNWFZSX0RNQTVfU1RBUlRfQUREUiAgMHhGRkMwMjgwMCAgLyogTVhWUiBTeW5jIERhdGEgRE1BNSBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lCU1YVlJfRE1BNV9DT1VOVAkgICAgICAweEZGQzAyODA0ICAvKiBNWFZSIFN5bmMgRGF0YSBETUE1IExvb3AgQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTVhWUl9ETUE1X0NVUlJfQUREUiAgIDB4RkZDMDI4MDggIC8qIE1YVlIgU3luYyBEYXRhIERNQTUgQ3VycmVudCBBZGRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lCU1YVlJfRE1BNV9DVVJSX0NPVU5UICAweEZGQzAyODBDICAvKiBNWFZSIFN5bmMgRGF0YSBETUE1IEN1cnJlbnQgTG9vcCBDb3VudCBSZWdpc3RlciAqLworCisjZGVmaW5lCU1YVlJfRE1BNl9DT05GSUcgICAgICAweEZGQzAyODEwICAvKiBNWFZSIFN5bmMgRGF0YSBETUE2IENvbmZpZwlSZWdpc3RlciAqLworI2RlZmluZQlNWFZSX0RNQTZfU1RBUlRfQUREUiAgMHhGRkMwMjgxNCAgLyogTVhWUiBTeW5jIERhdGEgRE1BNiBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lCU1YVlJfRE1BNl9DT1VOVAkgICAgICAweEZGQzAyODE4ICAvKiBNWFZSIFN5bmMgRGF0YSBETUE2IExvb3AgQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTVhWUl9ETUE2X0NVUlJfQUREUiAgIDB4RkZDMDI4MUMgIC8qIE1YVlIgU3luYyBEYXRhIERNQTYgQ3VycmVudCBBZGRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lCU1YVlJfRE1BNl9DVVJSX0NPVU5UICAweEZGQzAyODIwICAvKiBNWFZSIFN5bmMgRGF0YSBETUE2IEN1cnJlbnQgTG9vcCBDb3VudCBSZWdpc3RlciAqLworCisjZGVmaW5lCU1YVlJfRE1BN19DT05GSUcgICAgICAweEZGQzAyODI0ICAvKiBNWFZSIFN5bmMgRGF0YSBETUE3IENvbmZpZwlSZWdpc3RlciAqLworI2RlZmluZQlNWFZSX0RNQTdfU1RBUlRfQUREUiAgMHhGRkMwMjgyOCAgLyogTVhWUiBTeW5jIERhdGEgRE1BNyBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lCU1YVlJfRE1BN19DT1VOVAkgICAgICAweEZGQzAyODJDICAvKiBNWFZSIFN5bmMgRGF0YSBETUE3IExvb3AgQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTVhWUl9ETUE3X0NVUlJfQUREUiAgIDB4RkZDMDI4MzAgIC8qIE1YVlIgU3luYyBEYXRhIERNQTcgQ3VycmVudCBBZGRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lCU1YVlJfRE1BN19DVVJSX0NPVU5UICAweEZGQzAyODM0ICAvKiBNWFZSIFN5bmMgRGF0YSBETUE3IEN1cnJlbnQgTG9vcCBDb3VudCBSZWdpc3RlciAqLworCisjZGVmaW5lCU1YVlJfQVBfQ1RMCSAgICAgIDB4RkZDMDI4MzggIC8qIE1YVlIgQXN5bmMJUGFja2V0IENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTVhWUl9BUFJCX1NUQVJUX0FERFIgIDB4RkZDMDI4M0MgIC8qIE1YVlIgQXN5bmMJUGFja2V0IFJYIEJ1ZmZlciBTdGFydCBBZGRyIFJlZ2lzdGVyICovCisjZGVmaW5lCU1YVlJfQVBSQl9DVVJSX0FERFIgICAweEZGQzAyODQwICAvKiBNWFZSIEFzeW5jCVBhY2tldCBSWCBCdWZmZXIgQ3VycmVudCBBZGRyIFJlZ2lzdGVyICovCisjZGVmaW5lCU1YVlJfQVBUQl9TVEFSVF9BRERSICAweEZGQzAyODQ0ICAvKiBNWFZSIEFzeW5jCVBhY2tldCBUWCBCdWZmZXIgU3RhcnQgQWRkciBSZWdpc3RlciAqLworI2RlZmluZQlNWFZSX0FQVEJfQ1VSUl9BRERSICAgMHhGRkMwMjg0OCAgLyogTVhWUiBBc3luYwlQYWNrZXQgVFggQnVmZmVyIEN1cnJlbnQgQWRkciBSZWdpc3RlciAqLworCisjZGVmaW5lCU1YVlJfQ01fQ1RMCSAgICAgIDB4RkZDMDI4NEMgIC8qIE1YVlIgQ29udHJvbCBNZXNzYWdlIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTVhWUl9DTVJCX1NUQVJUX0FERFIgIDB4RkZDMDI4NTAgIC8qIE1YVlIgQ29udHJvbCBNZXNzYWdlIFJYIEJ1ZmZlciBTdGFydCBBZGRyIFJlZ2lzdGVyICovCisjZGVmaW5lCU1YVlJfQ01SQl9DVVJSX0FERFIgICAweEZGQzAyODU0ICAvKiBNWFZSIENvbnRyb2wgTWVzc2FnZSBSWCBCdWZmZXIgQ3VycmVudCBBZGRyZXNzICovCisjZGVmaW5lCU1YVlJfQ01UQl9TVEFSVF9BRERSICAweEZGQzAyODU4ICAvKiBNWFZSIENvbnRyb2wgTWVzc2FnZSBUWCBCdWZmZXIgU3RhcnQgQWRkciBSZWdpc3RlciAqLworI2RlZmluZQlNWFZSX0NNVEJfQ1VSUl9BRERSICAgMHhGRkMwMjg1QyAgLyogTVhWUiBDb250cm9sIE1lc3NhZ2UgVFggQnVmZmVyIEN1cnJlbnQgQWRkcmVzcyAqLworCisjZGVmaW5lCU1YVlJfUlJEQl9TVEFSVF9BRERSICAweEZGQzAyODYwICAvKiBNWFZSIFJlbW90ZSBSZWFkIEJ1ZmZlciBTdGFydCBBZGRyCVJlZ2lzdGVyICovCisjZGVmaW5lCU1YVlJfUlJEQl9DVVJSX0FERFIgICAweEZGQzAyODY0ICAvKiBNWFZSIFJlbW90ZSBSZWFkIEJ1ZmZlciBDdXJyZW50IEFkZHIgUmVnaXN0ZXIgKi8KKworI2RlZmluZQlNWFZSX1BBVF9EQVRBXzAJICAgICAgMHhGRkMwMjg2OCAgLyogTVhWUiBQYXR0ZXJuIERhdGEgUmVnaXN0ZXIJMCAqLworI2RlZmluZQlNWFZSX1BBVF9FTl8wCSAgICAgIDB4RkZDMDI4NkMgIC8qIE1YVlIgUGF0dGVybiBFbmFibGUgUmVnaXN0ZXIgMCAqLworI2RlZmluZQlNWFZSX1BBVF9EQVRBXzEJICAgICAgMHhGRkMwMjg3MCAgLyogTVhWUiBQYXR0ZXJuIERhdGEgUmVnaXN0ZXIJMSAqLworI2RlZmluZQlNWFZSX1BBVF9FTl8xCSAgICAgIDB4RkZDMDI4NzQgIC8qIE1YVlIgUGF0dGVybiBFbmFibGUgUmVnaXN0ZXIgMSAqLworCisjZGVmaW5lCU1YVlJfRlJBTUVfQ05UXzAgICAgICAweEZGQzAyODc4ICAvKiBNWFZSIEZyYW1lCUNvdW50ZXIJMCAqLworI2RlZmluZQlNWFZSX0ZSQU1FX0NOVF8xICAgICAgMHhGRkMwMjg3QyAgLyogTVhWUiBGcmFtZQlDb3VudGVyCTEgKi8KKworI2RlZmluZQlNWFZSX1JPVVRJTkdfMAkgICAgICAweEZGQzAyODgwICAvKiBNWFZSIFJvdXRpbmcgVGFibGUJUmVnaXN0ZXIgMCAqLworI2RlZmluZQlNWFZSX1JPVVRJTkdfMQkgICAgICAweEZGQzAyODg0ICAvKiBNWFZSIFJvdXRpbmcgVGFibGUJUmVnaXN0ZXIgMSAqLworI2RlZmluZQlNWFZSX1JPVVRJTkdfMgkgICAgICAweEZGQzAyODg4ICAvKiBNWFZSIFJvdXRpbmcgVGFibGUJUmVnaXN0ZXIgMiAqLworI2RlZmluZQlNWFZSX1JPVVRJTkdfMwkgICAgICAweEZGQzAyODhDICAvKiBNWFZSIFJvdXRpbmcgVGFibGUJUmVnaXN0ZXIgMyAqLworI2RlZmluZQlNWFZSX1JPVVRJTkdfNAkgICAgICAweEZGQzAyODkwICAvKiBNWFZSIFJvdXRpbmcgVGFibGUJUmVnaXN0ZXIgNCAqLworI2RlZmluZQlNWFZSX1JPVVRJTkdfNQkgICAgICAweEZGQzAyODk0ICAvKiBNWFZSIFJvdXRpbmcgVGFibGUJUmVnaXN0ZXIgNSAqLworI2RlZmluZQlNWFZSX1JPVVRJTkdfNgkgICAgICAweEZGQzAyODk4ICAvKiBNWFZSIFJvdXRpbmcgVGFibGUJUmVnaXN0ZXIgNiAqLworI2RlZmluZQlNWFZSX1JPVVRJTkdfNwkgICAgICAweEZGQzAyODlDICAvKiBNWFZSIFJvdXRpbmcgVGFibGUJUmVnaXN0ZXIgNyAqLworI2RlZmluZQlNWFZSX1JPVVRJTkdfOAkgICAgICAweEZGQzAyOEEwICAvKiBNWFZSIFJvdXRpbmcgVGFibGUJUmVnaXN0ZXIgOCAqLworI2RlZmluZQlNWFZSX1JPVVRJTkdfOQkgICAgICAweEZGQzAyOEE0ICAvKiBNWFZSIFJvdXRpbmcgVGFibGUJUmVnaXN0ZXIgOSAqLworI2RlZmluZQlNWFZSX1JPVVRJTkdfMTAJICAgICAgMHhGRkMwMjhBOCAgLyogTVhWUiBSb3V0aW5nIFRhYmxlCVJlZ2lzdGVyIDEwICovCisjZGVmaW5lCU1YVlJfUk9VVElOR18xMQkgICAgICAweEZGQzAyOEFDICAvKiBNWFZSIFJvdXRpbmcgVGFibGUJUmVnaXN0ZXIgMTEgKi8KKyNkZWZpbmUJTVhWUl9ST1VUSU5HXzEyCSAgICAgIDB4RkZDMDI4QjAgIC8qIE1YVlIgUm91dGluZyBUYWJsZQlSZWdpc3RlciAxMiAqLworI2RlZmluZQlNWFZSX1JPVVRJTkdfMTMJICAgICAgMHhGRkMwMjhCNCAgLyogTVhWUiBSb3V0aW5nIFRhYmxlCVJlZ2lzdGVyIDEzICovCisjZGVmaW5lCU1YVlJfUk9VVElOR18xNAkgICAgICAweEZGQzAyOEI4ICAvKiBNWFZSIFJvdXRpbmcgVGFibGUJUmVnaXN0ZXIgMTQgKi8KKworI2RlZmluZQlNWFZSX1BMTF9DVExfMQkgICAgICAweEZGQzAyOEJDICAvKiBNWFZSIFBoYXNlCUxvY2sgTG9vcCBDb250cm9sIFJlZ2lzdGVyIDEgKi8KKyNkZWZpbmUJTVhWUl9CTE9DS19DTlQJICAgICAgMHhGRkMwMjhDMCAgLyogTVhWUiBCbG9jawlDb3VudGVyICovCisjZGVmaW5lCU1YVlJfUExMX0NUTF8yCSAgICAgIDB4RkZDMDI4QzQgIC8qIE1YVlIgUGhhc2UJTG9jayBMb29wIENvbnRyb2wgUmVnaXN0ZXIgMiAqLworCisKKy8qIENBTiBDb250cm9sbGVyCQkoMHhGRkMwMkEwMCAtIDB4RkZDMDJGRkYpCQkJCSAqLworLyogRm9yIE1haWxib3hlcyAwLTE1CQkJCQkJCQkJCQkgKi8KKyNkZWZpbmUJQ0FOX01DMQkJCQkweEZGQzAyQTAwCS8qIE1haWxib3ggY29uZmlnIHJlZyAxCSAqLworI2RlZmluZQlDQU5fTUQxCQkJCTB4RkZDMDJBMDQJLyogTWFpbGJveCBkaXJlY3Rpb24gcmVnIDEgKi8KKyNkZWZpbmUJQ0FOX1RSUzEJCQkweEZGQzAyQTA4CS8qIFRyYW5zbWl0IFJlcXVlc3QgU2V0CXJlZyAxICovCisjZGVmaW5lCUNBTl9UUlIxCQkJMHhGRkMwMkEwQwkvKiBUcmFuc21pdCBSZXF1ZXN0IFJlc2V0IHJlZyAxICovCisjZGVmaW5lCUNBTl9UQTEJCQkJMHhGRkMwMkExMAkvKiBUcmFuc21pdCBBY2tub3dsZWRnZQlyZWcgMSAqLworI2RlZmluZQlDQU5fQUExCQkJCTB4RkZDMDJBMTQJLyogVHJhbnNtaXQgQWJvcnQgQWNrbm93bGVkZ2UgcmVnIDEgKi8KKyNkZWZpbmUJQ0FOX1JNUDEJCQkweEZGQzAyQTE4CS8qIFJlY2VpdmUgTWVzc2FnZSBQZW5kaW5nIHJlZyAxICovCisjZGVmaW5lCUNBTl9STUwxCQkJMHhGRkMwMkExQwkvKiBSZWNlaXZlIE1lc3NhZ2UgTG9zdAlyZWcgMSAqLworI2RlZmluZQlDQU5fTUJUSUYxCQkJMHhGRkMwMkEyMAkvKiBNYWlsYm94IFRyYW5zbWl0IEludGVycnVwdCBGbGFnIHJlZyAxICovCisjZGVmaW5lCUNBTl9NQlJJRjEJCQkweEZGQzAyQTI0CS8qIE1haWxib3ggUmVjZWl2ZSAgSW50ZXJydXB0IEZsYWcgcmVnIDEgKi8KKyNkZWZpbmUJQ0FOX01CSU0xCQkJMHhGRkMwMkEyOAkvKiBNYWlsYm94IEludGVycnVwdCBNYXNrIHJlZyAxICovCisjZGVmaW5lCUNBTl9SRkgxCQkJMHhGRkMwMkEyQwkvKiBSZW1vdGUgRnJhbWUJSGFuZGxpbmcgcmVnIDEgKi8KKyNkZWZpbmUJQ0FOX09QU1MxCQkJMHhGRkMwMkEzMAkvKiBPdmVyd3JpdGUgUHJvdGVjdGlvbglTaW5nbGUgU2hvdCBYbWlzc2lvbiByZWcgMSAqLworCisvKiBGb3IgTWFpbGJveGVzIDE2LTMxCQkJCQkJCQkJCQkgKi8KKyNkZWZpbmUJQ0FOX01DMgkJCQkweEZGQzAyQTQwCS8qIE1haWxib3ggY29uZmlnIHJlZyAyCSAqLworI2RlZmluZQlDQU5fTUQyCQkJCTB4RkZDMDJBNDQJLyogTWFpbGJveCBkaXJlY3Rpb24gcmVnIDIgKi8KKyNkZWZpbmUJQ0FOX1RSUzIJCQkweEZGQzAyQTQ4CS8qIFRyYW5zbWl0IFJlcXVlc3QgU2V0CXJlZyAyICovCisjZGVmaW5lCUNBTl9UUlIyCQkJMHhGRkMwMkE0QwkvKiBUcmFuc21pdCBSZXF1ZXN0IFJlc2V0IHJlZyAyICovCisjZGVmaW5lCUNBTl9UQTIJCQkJMHhGRkMwMkE1MAkvKiBUcmFuc21pdCBBY2tub3dsZWRnZQlyZWcgMiAqLworI2RlZmluZQlDQU5fQUEyCQkJCTB4RkZDMDJBNTQJLyogVHJhbnNtaXQgQWJvcnQgQWNrbm93bGVkZ2UgcmVnIDIgKi8KKyNkZWZpbmUJQ0FOX1JNUDIJCQkweEZGQzAyQTU4CS8qIFJlY2VpdmUgTWVzc2FnZSBQZW5kaW5nIHJlZyAyICovCisjZGVmaW5lCUNBTl9STUwyCQkJMHhGRkMwMkE1QwkvKiBSZWNlaXZlIE1lc3NhZ2UgTG9zdAlyZWcgMiAqLworI2RlZmluZQlDQU5fTUJUSUYyCQkJMHhGRkMwMkE2MAkvKiBNYWlsYm94IFRyYW5zbWl0IEludGVycnVwdCBGbGFnIHJlZyAyICovCisjZGVmaW5lCUNBTl9NQlJJRjIJCQkweEZGQzAyQTY0CS8qIE1haWxib3ggUmVjZWl2ZSAgSW50ZXJydXB0IEZsYWcgcmVnIDIgKi8KKyNkZWZpbmUJQ0FOX01CSU0yCQkJMHhGRkMwMkE2OAkvKiBNYWlsYm94IEludGVycnVwdCBNYXNrIHJlZyAyICovCisjZGVmaW5lCUNBTl9SRkgyCQkJMHhGRkMwMkE2QwkvKiBSZW1vdGUgRnJhbWUJSGFuZGxpbmcgcmVnIDIgKi8KKyNkZWZpbmUJQ0FOX09QU1MyCQkJMHhGRkMwMkE3MAkvKiBPdmVyd3JpdGUgUHJvdGVjdGlvbglTaW5nbGUgU2hvdCBYbWlzc2lvbiByZWcgMiAqLworCisjZGVmaW5lCUNBTl9DTE9DSwkJCTB4RkZDMDJBODAJLyogQml0IFRpbWluZyBDb25maWd1cmF0aW9uIHJlZ2lzdGVyIDAgKi8KKyNkZWZpbmUJQ0FOX1RJTUlORwkJCTB4RkZDMDJBODQJLyogQml0IFRpbWluZyBDb25maWd1cmF0aW9uIHJlZ2lzdGVyIDEgKi8KKworI2RlZmluZQlDQU5fREVCVUcJCQkweEZGQzAyQTg4CS8qIERlYnVnIFJlZ2lzdGVyCQkgKi8KKy8qIHRoZSBmb2xsb3dpbmcgaXMgZm9yCWJhY2t3YXJkcyBjb21wYXRpYmlsaXR5ICovCisjZGVmaW5lCUNBTl9DTkYJCSBDQU5fREVCVUcKKworI2RlZmluZQlDQU5fU1RBVFVTCQkJMHhGRkMwMkE4QwkvKiBHbG9iYWwgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9DRUMJCQkJMHhGRkMwMkE5MAkvKiBFcnJvciBDb3VudGVyIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9HSVMJCQkJMHhGRkMwMkE5NAkvKiBHbG9iYWwgSW50ZXJydXB0IFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fR0lNCQkJCTB4RkZDMDJBOTgJLyogR2xvYmFsIEludGVycnVwdCBNYXNrIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9HSUYJCQkJMHhGRkMwMkE5QwkvKiBHbG9iYWwgSW50ZXJydXB0IEZsYWcgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX0NPTlRST0wJCQkweEZGQzAyQUEwCS8qIE1hc3RlciBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9JTlRSCQkJMHhGRkMwMkFBNAkvKiBJbnRlcnJ1cHQgUGVuZGluZyBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUJURAkJCTB4RkZDMDJBQUMJLyogTWFpbGJveCBUZW1wb3JhcnkgRGlzYWJsZSBGZWF0dXJlICovCisjZGVmaW5lCUNBTl9FV1IJCQkJMHhGRkMwMkFCMAkvKiBQcm9ncmFtbWFibGUJV2FybmluZwlMZXZlbCAqLworI2RlZmluZQlDQU5fRVNSCQkJCTB4RkZDMDJBQjQJLyogRXJyb3IgU3RhdHVzCVJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9VQ0NOVAkJCTB4RkZDMDJBQzQJLyogVW5pdmVyc2FsIENvdW50ZXIJICovCisjZGVmaW5lCUNBTl9VQ1JDCQkJMHhGRkMwMkFDOAkvKiBVbml2ZXJzYWwgQ291bnRlciBSZWxvYWQvQ2FwdHVyZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fVUNDTkYJCQkweEZGQzAyQUNDCS8qIFVuaXZlcnNhbCBDb3VudGVyIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKi8KKworLyogTWFpbGJveCBBY2NlcHRhbmNlIE1hc2tzCQkJCQkgKi8KKyNkZWZpbmUJQ0FOX0FNMDBMCQkJMHhGRkMwMkIwMAkvKiBNYWlsYm94IDAgTG93IEFjY2VwdGFuY2UgTWFzayAqLworI2RlZmluZQlDQU5fQU0wMEgJCQkweEZGQzAyQjA0CS8qIE1haWxib3ggMCBIaWdoIEFjY2VwdGFuY2UgTWFzayAqLworI2RlZmluZQlDQU5fQU0wMUwJCQkweEZGQzAyQjA4CS8qIE1haWxib3ggMSBMb3cgQWNjZXB0YW5jZSBNYXNrICovCisjZGVmaW5lCUNBTl9BTTAxSAkJCTB4RkZDMDJCMEMJLyogTWFpbGJveCAxIEhpZ2ggQWNjZXB0YW5jZSBNYXNrICovCisjZGVmaW5lCUNBTl9BTTAyTAkJCTB4RkZDMDJCMTAJLyogTWFpbGJveCAyIExvdyBBY2NlcHRhbmNlIE1hc2sgKi8KKyNkZWZpbmUJQ0FOX0FNMDJICQkJMHhGRkMwMkIxNAkvKiBNYWlsYm94IDIgSGlnaCBBY2NlcHRhbmNlIE1hc2sgKi8KKyNkZWZpbmUJQ0FOX0FNMDNMCQkJMHhGRkMwMkIxOAkvKiBNYWlsYm94IDMgTG93IEFjY2VwdGFuY2UgTWFzayAqLworI2RlZmluZQlDQU5fQU0wM0gJCQkweEZGQzAyQjFDCS8qIE1haWxib3ggMyBIaWdoIEFjY2VwdGFuY2UgTWFzayAqLworI2RlZmluZQlDQU5fQU0wNEwJCQkweEZGQzAyQjIwCS8qIE1haWxib3ggNCBMb3cgQWNjZXB0YW5jZSBNYXNrICovCisjZGVmaW5lCUNBTl9BTTA0SAkJCTB4RkZDMDJCMjQJLyogTWFpbGJveCA0IEhpZ2ggQWNjZXB0YW5jZSBNYXNrICovCisjZGVmaW5lCUNBTl9BTTA1TAkJCTB4RkZDMDJCMjgJLyogTWFpbGJveCA1IExvdyBBY2NlcHRhbmNlIE1hc2sgKi8KKyNkZWZpbmUJQ0FOX0FNMDVICQkJMHhGRkMwMkIyQwkvKiBNYWlsYm94IDUgSGlnaCBBY2NlcHRhbmNlIE1hc2sgKi8KKyNkZWZpbmUJQ0FOX0FNMDZMCQkJMHhGRkMwMkIzMAkvKiBNYWlsYm94IDYgTG93IEFjY2VwdGFuY2UgTWFzayAqLworI2RlZmluZQlDQU5fQU0wNkgJCQkweEZGQzAyQjM0CS8qIE1haWxib3ggNiBIaWdoIEFjY2VwdGFuY2UgTWFzayAqLworI2RlZmluZQlDQU5fQU0wN0wJCQkweEZGQzAyQjM4CS8qIE1haWxib3ggNyBMb3cgQWNjZXB0YW5jZSBNYXNrICovCisjZGVmaW5lCUNBTl9BTTA3SAkJCTB4RkZDMDJCM0MJLyogTWFpbGJveCA3IEhpZ2ggQWNjZXB0YW5jZSBNYXNrICovCisjZGVmaW5lCUNBTl9BTTA4TAkJCTB4RkZDMDJCNDAJLyogTWFpbGJveCA4IExvdyBBY2NlcHRhbmNlIE1hc2sgKi8KKyNkZWZpbmUJQ0FOX0FNMDhICQkJMHhGRkMwMkI0NAkvKiBNYWlsYm94IDggSGlnaCBBY2NlcHRhbmNlIE1hc2sgKi8KKyNkZWZpbmUJQ0FOX0FNMDlMCQkJMHhGRkMwMkI0OAkvKiBNYWlsYm94IDkgTG93IEFjY2VwdGFuY2UgTWFzayAqLworI2RlZmluZQlDQU5fQU0wOUgJCQkweEZGQzAyQjRDCS8qIE1haWxib3ggOSBIaWdoIEFjY2VwdGFuY2UgTWFzayAqLworI2RlZmluZQlDQU5fQU0xMEwJCQkweEZGQzAyQjUwCS8qIE1haWxib3ggMTAgTG93IEFjY2VwdGFuY2UgTWFzayAqLworI2RlZmluZQlDQU5fQU0xMEgJCQkweEZGQzAyQjU0CS8qIE1haWxib3ggMTAgSGlnaCBBY2NlcHRhbmNlIE1hc2sgKi8KKyNkZWZpbmUJQ0FOX0FNMTFMCQkJMHhGRkMwMkI1OAkvKiBNYWlsYm94IDExIExvdyBBY2NlcHRhbmNlIE1hc2sgKi8KKyNkZWZpbmUJQ0FOX0FNMTFICQkJMHhGRkMwMkI1QwkvKiBNYWlsYm94IDExIEhpZ2ggQWNjZXB0YW5jZSBNYXNrICovCisjZGVmaW5lCUNBTl9BTTEyTAkJCTB4RkZDMDJCNjAJLyogTWFpbGJveCAxMiBMb3cgQWNjZXB0YW5jZSBNYXNrICovCisjZGVmaW5lCUNBTl9BTTEySAkJCTB4RkZDMDJCNjQJLyogTWFpbGJveCAxMiBIaWdoIEFjY2VwdGFuY2UgTWFzayAqLworI2RlZmluZQlDQU5fQU0xM0wJCQkweEZGQzAyQjY4CS8qIE1haWxib3ggMTMgTG93IEFjY2VwdGFuY2UgTWFzayAqLworI2RlZmluZQlDQU5fQU0xM0gJCQkweEZGQzAyQjZDCS8qIE1haWxib3ggMTMgSGlnaCBBY2NlcHRhbmNlIE1hc2sgKi8KKyNkZWZpbmUJQ0FOX0FNMTRMCQkJMHhGRkMwMkI3MAkvKiBNYWlsYm94IDE0IExvdyBBY2NlcHRhbmNlIE1hc2sgKi8KKyNkZWZpbmUJQ0FOX0FNMTRICQkJMHhGRkMwMkI3NAkvKiBNYWlsYm94IDE0IEhpZ2ggQWNjZXB0YW5jZSBNYXNrICovCisjZGVmaW5lCUNBTl9BTTE1TAkJCTB4RkZDMDJCNzgJLyogTWFpbGJveCAxNSBMb3cgQWNjZXB0YW5jZSBNYXNrICovCisjZGVmaW5lCUNBTl9BTTE1SAkJCTB4RkZDMDJCN0MJLyogTWFpbGJveCAxNSBIaWdoIEFjY2VwdGFuY2UgTWFzayAqLworCisjZGVmaW5lCUNBTl9BTTE2TAkJCTB4RkZDMDJCODAJLyogTWFpbGJveCAxNiBMb3cgQWNjZXB0YW5jZSBNYXNrICovCisjZGVmaW5lCUNBTl9BTTE2SAkJCTB4RkZDMDJCODQJLyogTWFpbGJveCAxNiBIaWdoIEFjY2VwdGFuY2UgTWFzayAqLworI2RlZmluZQlDQU5fQU0xN0wJCQkweEZGQzAyQjg4CS8qIE1haWxib3ggMTcgTG93IEFjY2VwdGFuY2UgTWFzayAqLworI2RlZmluZQlDQU5fQU0xN0gJCQkweEZGQzAyQjhDCS8qIE1haWxib3ggMTcgSGlnaCBBY2NlcHRhbmNlIE1hc2sgKi8KKyNkZWZpbmUJQ0FOX0FNMThMCQkJMHhGRkMwMkI5MAkvKiBNYWlsYm94IDE4IExvdyBBY2NlcHRhbmNlIE1hc2sgKi8KKyNkZWZpbmUJQ0FOX0FNMThICQkJMHhGRkMwMkI5NAkvKiBNYWlsYm94IDE4IEhpZ2ggQWNjZXB0YW5jZSBNYXNrICovCisjZGVmaW5lCUNBTl9BTTE5TAkJCTB4RkZDMDJCOTgJLyogTWFpbGJveCAxOSBMb3cgQWNjZXB0YW5jZSBNYXNrICovCisjZGVmaW5lCUNBTl9BTTE5SAkJCTB4RkZDMDJCOUMJLyogTWFpbGJveCAxOSBIaWdoIEFjY2VwdGFuY2UgTWFzayAqLworI2RlZmluZQlDQU5fQU0yMEwJCQkweEZGQzAyQkEwCS8qIE1haWxib3ggMjAgTG93IEFjY2VwdGFuY2UgTWFzayAqLworI2RlZmluZQlDQU5fQU0yMEgJCQkweEZGQzAyQkE0CS8qIE1haWxib3ggMjAgSGlnaCBBY2NlcHRhbmNlIE1hc2sgKi8KKyNkZWZpbmUJQ0FOX0FNMjFMCQkJMHhGRkMwMkJBOAkvKiBNYWlsYm94IDIxIExvdyBBY2NlcHRhbmNlIE1hc2sgKi8KKyNkZWZpbmUJQ0FOX0FNMjFICQkJMHhGRkMwMkJBQwkvKiBNYWlsYm94IDIxIEhpZ2ggQWNjZXB0YW5jZSBNYXNrICovCisjZGVmaW5lCUNBTl9BTTIyTAkJCTB4RkZDMDJCQjAJLyogTWFpbGJveCAyMiBMb3cgQWNjZXB0YW5jZSBNYXNrICovCisjZGVmaW5lCUNBTl9BTTIySAkJCTB4RkZDMDJCQjQJLyogTWFpbGJveCAyMiBIaWdoIEFjY2VwdGFuY2UgTWFzayAqLworI2RlZmluZQlDQU5fQU0yM0wJCQkweEZGQzAyQkI4CS8qIE1haWxib3ggMjMgTG93IEFjY2VwdGFuY2UgTWFzayAqLworI2RlZmluZQlDQU5fQU0yM0gJCQkweEZGQzAyQkJDCS8qIE1haWxib3ggMjMgSGlnaCBBY2NlcHRhbmNlIE1hc2sgKi8KKyNkZWZpbmUJQ0FOX0FNMjRMCQkJMHhGRkMwMkJDMAkvKiBNYWlsYm94IDI0IExvdyBBY2NlcHRhbmNlIE1hc2sgKi8KKyNkZWZpbmUJQ0FOX0FNMjRICQkJMHhGRkMwMkJDNAkvKiBNYWlsYm94IDI0IEhpZ2ggQWNjZXB0YW5jZSBNYXNrICovCisjZGVmaW5lCUNBTl9BTTI1TAkJCTB4RkZDMDJCQzgJLyogTWFpbGJveCAyNSBMb3cgQWNjZXB0YW5jZSBNYXNrICovCisjZGVmaW5lCUNBTl9BTTI1SAkJCTB4RkZDMDJCQ0MJLyogTWFpbGJveCAyNSBIaWdoIEFjY2VwdGFuY2UgTWFzayAqLworI2RlZmluZQlDQU5fQU0yNkwJCQkweEZGQzAyQkQwCS8qIE1haWxib3ggMjYgTG93IEFjY2VwdGFuY2UgTWFzayAqLworI2RlZmluZQlDQU5fQU0yNkgJCQkweEZGQzAyQkQ0CS8qIE1haWxib3ggMjYgSGlnaCBBY2NlcHRhbmNlIE1hc2sgKi8KKyNkZWZpbmUJQ0FOX0FNMjdMCQkJMHhGRkMwMkJEOAkvKiBNYWlsYm94IDI3IExvdyBBY2NlcHRhbmNlIE1hc2sgKi8KKyNkZWZpbmUJQ0FOX0FNMjdICQkJMHhGRkMwMkJEQwkvKiBNYWlsYm94IDI3IEhpZ2ggQWNjZXB0YW5jZSBNYXNrICovCisjZGVmaW5lCUNBTl9BTTI4TAkJCTB4RkZDMDJCRTAJLyogTWFpbGJveCAyOCBMb3cgQWNjZXB0YW5jZSBNYXNrICovCisjZGVmaW5lCUNBTl9BTTI4SAkJCTB4RkZDMDJCRTQJLyogTWFpbGJveCAyOCBIaWdoIEFjY2VwdGFuY2UgTWFzayAqLworI2RlZmluZQlDQU5fQU0yOUwJCQkweEZGQzAyQkU4CS8qIE1haWxib3ggMjkgTG93IEFjY2VwdGFuY2UgTWFzayAqLworI2RlZmluZQlDQU5fQU0yOUgJCQkweEZGQzAyQkVDCS8qIE1haWxib3ggMjkgSGlnaCBBY2NlcHRhbmNlIE1hc2sgKi8KKyNkZWZpbmUJQ0FOX0FNMzBMCQkJMHhGRkMwMkJGMAkvKiBNYWlsYm94IDMwIExvdyBBY2NlcHRhbmNlIE1hc2sgKi8KKyNkZWZpbmUJQ0FOX0FNMzBICQkJMHhGRkMwMkJGNAkvKiBNYWlsYm94IDMwIEhpZ2ggQWNjZXB0YW5jZSBNYXNrICovCisjZGVmaW5lCUNBTl9BTTMxTAkJCTB4RkZDMDJCRjgJLyogTWFpbGJveCAzMSBMb3cgQWNjZXB0YW5jZSBNYXNrICovCisjZGVmaW5lCUNBTl9BTTMxSAkJCTB4RkZDMDJCRkMJLyogTWFpbGJveCAzMSBIaWdoIEFjY2VwdGFuY2UgTWFzayAqLworCisvKiBDQU4gQWNjZXB0YW5jZSBNYXNrIE1hY3JvcyAqLworI2RlZmluZQlDQU5fQU1fTCh4KQkJCShDQU5fQU0wMEwrKCh4KSoweDgpKQorI2RlZmluZQlDQU5fQU1fSCh4KQkJCShDQU5fQU0wMEgrKCh4KSoweDgpKQorCisvKiBNYWlsYm94IFJlZ2lzdGVycwkJCQkJCQkJCSAqLworI2RlZmluZQlDQU5fTUIwMF9EQVRBMAkJMHhGRkMwMkMwMAkvKiBNYWlsYm94IDAgRGF0YSBXb3JkIDAgWzE1OjBdCVJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjAwX0RBVEExCQkweEZGQzAyQzA0CS8qIE1haWxib3ggMCBEYXRhIFdvcmQgMSBbMzE6MTZdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjAwX0RBVEEyCQkweEZGQzAyQzA4CS8qIE1haWxib3ggMCBEYXRhIFdvcmQgMiBbNDc6MzJdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjAwX0RBVEEzCQkweEZGQzAyQzBDCS8qIE1haWxib3ggMCBEYXRhIFdvcmQgMyBbNjM6NDhdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjAwX0xFTkdUSAkJMHhGRkMwMkMxMAkvKiBNYWlsYm94IDAgRGF0YSBMZW5ndGggQ29kZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIwMF9USU1FU1RBTVAJMHhGRkMwMkMxNAkvKiBNYWlsYm94IDAgVGltZSBTdGFtcAlWYWx1ZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIwMF9JRDAJCTB4RkZDMDJDMTgJLyogTWFpbGJveCAwIElkZW50aWZpZXIJTG93IFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjAwX0lEMQkJMHhGRkMwMkMxQwkvKiBNYWlsYm94IDAgSWRlbnRpZmllcglIaWdoIFJlZ2lzdGVyICovCisKKyNkZWZpbmUJQ0FOX01CMDFfREFUQTAJCTB4RkZDMDJDMjAJLyogTWFpbGJveCAxIERhdGEgV29yZCAwIFsxNTowXQlSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIwMV9EQVRBMQkJMHhGRkMwMkMyNAkvKiBNYWlsYm94IDEgRGF0YSBXb3JkIDEgWzMxOjE2XSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIwMV9EQVRBMgkJMHhGRkMwMkMyOAkvKiBNYWlsYm94IDEgRGF0YSBXb3JkIDIgWzQ3OjMyXSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIwMV9EQVRBMwkJMHhGRkMwMkMyQwkvKiBNYWlsYm94IDEgRGF0YSBXb3JkIDMgWzYzOjQ4XSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIwMV9MRU5HVEgJCTB4RkZDMDJDMzAJLyogTWFpbGJveCAxIERhdGEgTGVuZ3RoIENvZGUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMDFfVElNRVNUQU1QCTB4RkZDMDJDMzQJLyogTWFpbGJveCAxIFRpbWUgU3RhbXAJVmFsdWUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMDFfSUQwCQkweEZGQzAyQzM4CS8qIE1haWxib3ggMSBJZGVudGlmaWVyCUxvdyBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIwMV9JRDEJCTB4RkZDMDJDM0MJLyogTWFpbGJveCAxIElkZW50aWZpZXIJSGlnaCBSZWdpc3RlciAqLworCisjZGVmaW5lCUNBTl9NQjAyX0RBVEEwCQkweEZGQzAyQzQwCS8qIE1haWxib3ggMiBEYXRhIFdvcmQgMCBbMTU6MF0JUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMDJfREFUQTEJCTB4RkZDMDJDNDQJLyogTWFpbGJveCAyIERhdGEgV29yZCAxIFszMToxNl0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMDJfREFUQTIJCTB4RkZDMDJDNDgJLyogTWFpbGJveCAyIERhdGEgV29yZCAyIFs0NzozMl0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMDJfREFUQTMJCTB4RkZDMDJDNEMJLyogTWFpbGJveCAyIERhdGEgV29yZCAzIFs2Mzo0OF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMDJfTEVOR1RICQkweEZGQzAyQzUwCS8qIE1haWxib3ggMiBEYXRhIExlbmd0aCBDb2RlIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjAyX1RJTUVTVEFNUAkweEZGQzAyQzU0CS8qIE1haWxib3ggMiBUaW1lIFN0YW1wCVZhbHVlIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjAyX0lEMAkJMHhGRkMwMkM1OAkvKiBNYWlsYm94IDIgSWRlbnRpZmllcglMb3cgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMDJfSUQxCQkweEZGQzAyQzVDCS8qIE1haWxib3ggMiBJZGVudGlmaWVyCUhpZ2ggUmVnaXN0ZXIgKi8KKworI2RlZmluZQlDQU5fTUIwM19EQVRBMAkJMHhGRkMwMkM2MAkvKiBNYWlsYm94IDMgRGF0YSBXb3JkIDAgWzE1OjBdCVJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjAzX0RBVEExCQkweEZGQzAyQzY0CS8qIE1haWxib3ggMyBEYXRhIFdvcmQgMSBbMzE6MTZdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjAzX0RBVEEyCQkweEZGQzAyQzY4CS8qIE1haWxib3ggMyBEYXRhIFdvcmQgMiBbNDc6MzJdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjAzX0RBVEEzCQkweEZGQzAyQzZDCS8qIE1haWxib3ggMyBEYXRhIFdvcmQgMyBbNjM6NDhdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjAzX0xFTkdUSAkJMHhGRkMwMkM3MAkvKiBNYWlsYm94IDMgRGF0YSBMZW5ndGggQ29kZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIwM19USU1FU1RBTVAJMHhGRkMwMkM3NAkvKiBNYWlsYm94IDMgVGltZSBTdGFtcAlWYWx1ZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIwM19JRDAJCTB4RkZDMDJDNzgJLyogTWFpbGJveCAzIElkZW50aWZpZXIJTG93IFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjAzX0lEMQkJMHhGRkMwMkM3QwkvKiBNYWlsYm94IDMgSWRlbnRpZmllcglIaWdoIFJlZ2lzdGVyICovCisKKyNkZWZpbmUJQ0FOX01CMDRfREFUQTAJCTB4RkZDMDJDODAJLyogTWFpbGJveCA0IERhdGEgV29yZCAwIFsxNTowXQlSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIwNF9EQVRBMQkJMHhGRkMwMkM4NAkvKiBNYWlsYm94IDQgRGF0YSBXb3JkIDEgWzMxOjE2XSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIwNF9EQVRBMgkJMHhGRkMwMkM4OAkvKiBNYWlsYm94IDQgRGF0YSBXb3JkIDIgWzQ3OjMyXSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIwNF9EQVRBMwkJMHhGRkMwMkM4QwkvKiBNYWlsYm94IDQgRGF0YSBXb3JkIDMgWzYzOjQ4XSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIwNF9MRU5HVEgJCTB4RkZDMDJDOTAJLyogTWFpbGJveCA0IERhdGEgTGVuZ3RoIENvZGUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMDRfVElNRVNUQU1QCTB4RkZDMDJDOTQJLyogTWFpbGJveCA0IFRpbWUgU3RhbXAJVmFsdWUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMDRfSUQwCQkweEZGQzAyQzk4CS8qIE1haWxib3ggNCBJZGVudGlmaWVyCUxvdyBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIwNF9JRDEJCTB4RkZDMDJDOUMJLyogTWFpbGJveCA0IElkZW50aWZpZXIJSGlnaCBSZWdpc3RlciAqLworCisjZGVmaW5lCUNBTl9NQjA1X0RBVEEwCQkweEZGQzAyQ0EwCS8qIE1haWxib3ggNSBEYXRhIFdvcmQgMCBbMTU6MF0JUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMDVfREFUQTEJCTB4RkZDMDJDQTQJLyogTWFpbGJveCA1IERhdGEgV29yZCAxIFszMToxNl0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMDVfREFUQTIJCTB4RkZDMDJDQTgJLyogTWFpbGJveCA1IERhdGEgV29yZCAyIFs0NzozMl0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMDVfREFUQTMJCTB4RkZDMDJDQUMJLyogTWFpbGJveCA1IERhdGEgV29yZCAzIFs2Mzo0OF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMDVfTEVOR1RICQkweEZGQzAyQ0IwCS8qIE1haWxib3ggNSBEYXRhIExlbmd0aCBDb2RlIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjA1X1RJTUVTVEFNUAkweEZGQzAyQ0I0CS8qIE1haWxib3ggNSBUaW1lIFN0YW1wCVZhbHVlIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjA1X0lEMAkJMHhGRkMwMkNCOAkvKiBNYWlsYm94IDUgSWRlbnRpZmllcglMb3cgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMDVfSUQxCQkweEZGQzAyQ0JDCS8qIE1haWxib3ggNSBJZGVudGlmaWVyCUhpZ2ggUmVnaXN0ZXIgKi8KKworI2RlZmluZQlDQU5fTUIwNl9EQVRBMAkJMHhGRkMwMkNDMAkvKiBNYWlsYm94IDYgRGF0YSBXb3JkIDAgWzE1OjBdCVJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjA2X0RBVEExCQkweEZGQzAyQ0M0CS8qIE1haWxib3ggNiBEYXRhIFdvcmQgMSBbMzE6MTZdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjA2X0RBVEEyCQkweEZGQzAyQ0M4CS8qIE1haWxib3ggNiBEYXRhIFdvcmQgMiBbNDc6MzJdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjA2X0RBVEEzCQkweEZGQzAyQ0NDCS8qIE1haWxib3ggNiBEYXRhIFdvcmQgMyBbNjM6NDhdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjA2X0xFTkdUSAkJMHhGRkMwMkNEMAkvKiBNYWlsYm94IDYgRGF0YSBMZW5ndGggQ29kZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIwNl9USU1FU1RBTVAJMHhGRkMwMkNENAkvKiBNYWlsYm94IDYgVGltZSBTdGFtcAlWYWx1ZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIwNl9JRDAJCTB4RkZDMDJDRDgJLyogTWFpbGJveCA2IElkZW50aWZpZXIJTG93IFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjA2X0lEMQkJMHhGRkMwMkNEQwkvKiBNYWlsYm94IDYgSWRlbnRpZmllcglIaWdoIFJlZ2lzdGVyICovCisKKyNkZWZpbmUJQ0FOX01CMDdfREFUQTAJCTB4RkZDMDJDRTAJLyogTWFpbGJveCA3IERhdGEgV29yZCAwIFsxNTowXQlSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIwN19EQVRBMQkJMHhGRkMwMkNFNAkvKiBNYWlsYm94IDcgRGF0YSBXb3JkIDEgWzMxOjE2XSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIwN19EQVRBMgkJMHhGRkMwMkNFOAkvKiBNYWlsYm94IDcgRGF0YSBXb3JkIDIgWzQ3OjMyXSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIwN19EQVRBMwkJMHhGRkMwMkNFQwkvKiBNYWlsYm94IDcgRGF0YSBXb3JkIDMgWzYzOjQ4XSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIwN19MRU5HVEgJCTB4RkZDMDJDRjAJLyogTWFpbGJveCA3IERhdGEgTGVuZ3RoIENvZGUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMDdfVElNRVNUQU1QCTB4RkZDMDJDRjQJLyogTWFpbGJveCA3IFRpbWUgU3RhbXAJVmFsdWUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMDdfSUQwCQkweEZGQzAyQ0Y4CS8qIE1haWxib3ggNyBJZGVudGlmaWVyCUxvdyBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIwN19JRDEJCTB4RkZDMDJDRkMJLyogTWFpbGJveCA3IElkZW50aWZpZXIJSGlnaCBSZWdpc3RlciAqLworCisjZGVmaW5lCUNBTl9NQjA4X0RBVEEwCQkweEZGQzAyRDAwCS8qIE1haWxib3ggOCBEYXRhIFdvcmQgMCBbMTU6MF0JUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMDhfREFUQTEJCTB4RkZDMDJEMDQJLyogTWFpbGJveCA4IERhdGEgV29yZCAxIFszMToxNl0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMDhfREFUQTIJCTB4RkZDMDJEMDgJLyogTWFpbGJveCA4IERhdGEgV29yZCAyIFs0NzozMl0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMDhfREFUQTMJCTB4RkZDMDJEMEMJLyogTWFpbGJveCA4IERhdGEgV29yZCAzIFs2Mzo0OF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMDhfTEVOR1RICQkweEZGQzAyRDEwCS8qIE1haWxib3ggOCBEYXRhIExlbmd0aCBDb2RlIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjA4X1RJTUVTVEFNUAkweEZGQzAyRDE0CS8qIE1haWxib3ggOCBUaW1lIFN0YW1wCVZhbHVlIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjA4X0lEMAkJMHhGRkMwMkQxOAkvKiBNYWlsYm94IDggSWRlbnRpZmllcglMb3cgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMDhfSUQxCQkweEZGQzAyRDFDCS8qIE1haWxib3ggOCBJZGVudGlmaWVyCUhpZ2ggUmVnaXN0ZXIgKi8KKworI2RlZmluZQlDQU5fTUIwOV9EQVRBMAkJMHhGRkMwMkQyMAkvKiBNYWlsYm94IDkgRGF0YSBXb3JkIDAgWzE1OjBdCVJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjA5X0RBVEExCQkweEZGQzAyRDI0CS8qIE1haWxib3ggOSBEYXRhIFdvcmQgMSBbMzE6MTZdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjA5X0RBVEEyCQkweEZGQzAyRDI4CS8qIE1haWxib3ggOSBEYXRhIFdvcmQgMiBbNDc6MzJdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjA5X0RBVEEzCQkweEZGQzAyRDJDCS8qIE1haWxib3ggOSBEYXRhIFdvcmQgMyBbNjM6NDhdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjA5X0xFTkdUSAkJMHhGRkMwMkQzMAkvKiBNYWlsYm94IDkgRGF0YSBMZW5ndGggQ29kZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIwOV9USU1FU1RBTVAJMHhGRkMwMkQzNAkvKiBNYWlsYm94IDkgVGltZSBTdGFtcAlWYWx1ZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIwOV9JRDAJCTB4RkZDMDJEMzgJLyogTWFpbGJveCA5IElkZW50aWZpZXIJTG93IFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjA5X0lEMQkJMHhGRkMwMkQzQwkvKiBNYWlsYm94IDkgSWRlbnRpZmllcglIaWdoIFJlZ2lzdGVyICovCisKKyNkZWZpbmUJQ0FOX01CMTBfREFUQTAJCTB4RkZDMDJENDAJLyogTWFpbGJveCAxMCBEYXRhIFdvcmQJMCBbMTU6MF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMTBfREFUQTEJCTB4RkZDMDJENDQJLyogTWFpbGJveCAxMCBEYXRhIFdvcmQJMSBbMzE6MTZdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjEwX0RBVEEyCQkweEZGQzAyRDQ4CS8qIE1haWxib3ggMTAgRGF0YSBXb3JkCTIgWzQ3OjMyXSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxMF9EQVRBMwkJMHhGRkMwMkQ0QwkvKiBNYWlsYm94IDEwIERhdGEgV29yZAkzIFs2Mzo0OF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMTBfTEVOR1RICQkweEZGQzAyRDUwCS8qIE1haWxib3ggMTAgRGF0YSBMZW5ndGggQ29kZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxMF9USU1FU1RBTVAJMHhGRkMwMkQ1NAkvKiBNYWlsYm94IDEwIFRpbWUgU3RhbXAgVmFsdWUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMTBfSUQwCQkweEZGQzAyRDU4CS8qIE1haWxib3ggMTAgSWRlbnRpZmllciBMb3cgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMTBfSUQxCQkweEZGQzAyRDVDCS8qIE1haWxib3ggMTAgSWRlbnRpZmllciBIaWdoIFJlZ2lzdGVyICovCisKKyNkZWZpbmUJQ0FOX01CMTFfREFUQTAJCTB4RkZDMDJENjAJLyogTWFpbGJveCAxMSBEYXRhIFdvcmQJMCBbMTU6MF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMTFfREFUQTEJCTB4RkZDMDJENjQJLyogTWFpbGJveCAxMSBEYXRhIFdvcmQJMSBbMzE6MTZdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjExX0RBVEEyCQkweEZGQzAyRDY4CS8qIE1haWxib3ggMTEgRGF0YSBXb3JkCTIgWzQ3OjMyXSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxMV9EQVRBMwkJMHhGRkMwMkQ2QwkvKiBNYWlsYm94IDExIERhdGEgV29yZAkzIFs2Mzo0OF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMTFfTEVOR1RICQkweEZGQzAyRDcwCS8qIE1haWxib3ggMTEgRGF0YSBMZW5ndGggQ29kZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxMV9USU1FU1RBTVAJMHhGRkMwMkQ3NAkvKiBNYWlsYm94IDExIFRpbWUgU3RhbXAgVmFsdWUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMTFfSUQwCQkweEZGQzAyRDc4CS8qIE1haWxib3ggMTEgSWRlbnRpZmllciBMb3cgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMTFfSUQxCQkweEZGQzAyRDdDCS8qIE1haWxib3ggMTEgSWRlbnRpZmllciBIaWdoIFJlZ2lzdGVyICovCisKKyNkZWZpbmUJQ0FOX01CMTJfREFUQTAJCTB4RkZDMDJEODAJLyogTWFpbGJveCAxMiBEYXRhIFdvcmQJMCBbMTU6MF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMTJfREFUQTEJCTB4RkZDMDJEODQJLyogTWFpbGJveCAxMiBEYXRhIFdvcmQJMSBbMzE6MTZdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjEyX0RBVEEyCQkweEZGQzAyRDg4CS8qIE1haWxib3ggMTIgRGF0YSBXb3JkCTIgWzQ3OjMyXSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxMl9EQVRBMwkJMHhGRkMwMkQ4QwkvKiBNYWlsYm94IDEyIERhdGEgV29yZAkzIFs2Mzo0OF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMTJfTEVOR1RICQkweEZGQzAyRDkwCS8qIE1haWxib3ggMTIgRGF0YSBMZW5ndGggQ29kZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxMl9USU1FU1RBTVAJMHhGRkMwMkQ5NAkvKiBNYWlsYm94IDEyIFRpbWUgU3RhbXAgVmFsdWUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMTJfSUQwCQkweEZGQzAyRDk4CS8qIE1haWxib3ggMTIgSWRlbnRpZmllciBMb3cgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMTJfSUQxCQkweEZGQzAyRDlDCS8qIE1haWxib3ggMTIgSWRlbnRpZmllciBIaWdoIFJlZ2lzdGVyICovCisKKyNkZWZpbmUJQ0FOX01CMTNfREFUQTAJCTB4RkZDMDJEQTAJLyogTWFpbGJveCAxMyBEYXRhIFdvcmQJMCBbMTU6MF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMTNfREFUQTEJCTB4RkZDMDJEQTQJLyogTWFpbGJveCAxMyBEYXRhIFdvcmQJMSBbMzE6MTZdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjEzX0RBVEEyCQkweEZGQzAyREE4CS8qIE1haWxib3ggMTMgRGF0YSBXb3JkCTIgWzQ3OjMyXSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxM19EQVRBMwkJMHhGRkMwMkRBQwkvKiBNYWlsYm94IDEzIERhdGEgV29yZAkzIFs2Mzo0OF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMTNfTEVOR1RICQkweEZGQzAyREIwCS8qIE1haWxib3ggMTMgRGF0YSBMZW5ndGggQ29kZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxM19USU1FU1RBTVAJMHhGRkMwMkRCNAkvKiBNYWlsYm94IDEzIFRpbWUgU3RhbXAgVmFsdWUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMTNfSUQwCQkweEZGQzAyREI4CS8qIE1haWxib3ggMTMgSWRlbnRpZmllciBMb3cgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMTNfSUQxCQkweEZGQzAyREJDCS8qIE1haWxib3ggMTMgSWRlbnRpZmllciBIaWdoIFJlZ2lzdGVyICovCisKKyNkZWZpbmUJQ0FOX01CMTRfREFUQTAJCTB4RkZDMDJEQzAJLyogTWFpbGJveCAxNCBEYXRhIFdvcmQJMCBbMTU6MF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMTRfREFUQTEJCTB4RkZDMDJEQzQJLyogTWFpbGJveCAxNCBEYXRhIFdvcmQJMSBbMzE6MTZdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjE0X0RBVEEyCQkweEZGQzAyREM4CS8qIE1haWxib3ggMTQgRGF0YSBXb3JkCTIgWzQ3OjMyXSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxNF9EQVRBMwkJMHhGRkMwMkRDQwkvKiBNYWlsYm94IDE0IERhdGEgV29yZAkzIFs2Mzo0OF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMTRfTEVOR1RICQkweEZGQzAyREQwCS8qIE1haWxib3ggMTQgRGF0YSBMZW5ndGggQ29kZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxNF9USU1FU1RBTVAJMHhGRkMwMkRENAkvKiBNYWlsYm94IDE0IFRpbWUgU3RhbXAgVmFsdWUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMTRfSUQwCQkweEZGQzAyREQ4CS8qIE1haWxib3ggMTQgSWRlbnRpZmllciBMb3cgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMTRfSUQxCQkweEZGQzAyRERDCS8qIE1haWxib3ggMTQgSWRlbnRpZmllciBIaWdoIFJlZ2lzdGVyICovCisKKyNkZWZpbmUJQ0FOX01CMTVfREFUQTAJCTB4RkZDMDJERTAJLyogTWFpbGJveCAxNSBEYXRhIFdvcmQJMCBbMTU6MF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMTVfREFUQTEJCTB4RkZDMDJERTQJLyogTWFpbGJveCAxNSBEYXRhIFdvcmQJMSBbMzE6MTZdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjE1X0RBVEEyCQkweEZGQzAyREU4CS8qIE1haWxib3ggMTUgRGF0YSBXb3JkCTIgWzQ3OjMyXSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxNV9EQVRBMwkJMHhGRkMwMkRFQwkvKiBNYWlsYm94IDE1IERhdGEgV29yZAkzIFs2Mzo0OF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMTVfTEVOR1RICQkweEZGQzAyREYwCS8qIE1haWxib3ggMTUgRGF0YSBMZW5ndGggQ29kZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxNV9USU1FU1RBTVAJMHhGRkMwMkRGNAkvKiBNYWlsYm94IDE1IFRpbWUgU3RhbXAgVmFsdWUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMTVfSUQwCQkweEZGQzAyREY4CS8qIE1haWxib3ggMTUgSWRlbnRpZmllciBMb3cgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMTVfSUQxCQkweEZGQzAyREZDCS8qIE1haWxib3ggMTUgSWRlbnRpZmllciBIaWdoIFJlZ2lzdGVyICovCisKKyNkZWZpbmUJQ0FOX01CMTZfREFUQTAJCTB4RkZDMDJFMDAJLyogTWFpbGJveCAxNiBEYXRhIFdvcmQJMCBbMTU6MF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMTZfREFUQTEJCTB4RkZDMDJFMDQJLyogTWFpbGJveCAxNiBEYXRhIFdvcmQJMSBbMzE6MTZdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjE2X0RBVEEyCQkweEZGQzAyRTA4CS8qIE1haWxib3ggMTYgRGF0YSBXb3JkCTIgWzQ3OjMyXSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxNl9EQVRBMwkJMHhGRkMwMkUwQwkvKiBNYWlsYm94IDE2IERhdGEgV29yZAkzIFs2Mzo0OF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMTZfTEVOR1RICQkweEZGQzAyRTEwCS8qIE1haWxib3ggMTYgRGF0YSBMZW5ndGggQ29kZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxNl9USU1FU1RBTVAJMHhGRkMwMkUxNAkvKiBNYWlsYm94IDE2IFRpbWUgU3RhbXAgVmFsdWUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMTZfSUQwCQkweEZGQzAyRTE4CS8qIE1haWxib3ggMTYgSWRlbnRpZmllciBMb3cgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMTZfSUQxCQkweEZGQzAyRTFDCS8qIE1haWxib3ggMTYgSWRlbnRpZmllciBIaWdoIFJlZ2lzdGVyICovCisKKyNkZWZpbmUJQ0FOX01CMTdfREFUQTAJCTB4RkZDMDJFMjAJLyogTWFpbGJveCAxNyBEYXRhIFdvcmQJMCBbMTU6MF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMTdfREFUQTEJCTB4RkZDMDJFMjQJLyogTWFpbGJveCAxNyBEYXRhIFdvcmQJMSBbMzE6MTZdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjE3X0RBVEEyCQkweEZGQzAyRTI4CS8qIE1haWxib3ggMTcgRGF0YSBXb3JkCTIgWzQ3OjMyXSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxN19EQVRBMwkJMHhGRkMwMkUyQwkvKiBNYWlsYm94IDE3IERhdGEgV29yZAkzIFs2Mzo0OF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMTdfTEVOR1RICQkweEZGQzAyRTMwCS8qIE1haWxib3ggMTcgRGF0YSBMZW5ndGggQ29kZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxN19USU1FU1RBTVAJMHhGRkMwMkUzNAkvKiBNYWlsYm94IDE3IFRpbWUgU3RhbXAgVmFsdWUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMTdfSUQwCQkweEZGQzAyRTM4CS8qIE1haWxib3ggMTcgSWRlbnRpZmllciBMb3cgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMTdfSUQxCQkweEZGQzAyRTNDCS8qIE1haWxib3ggMTcgSWRlbnRpZmllciBIaWdoIFJlZ2lzdGVyICovCisKKyNkZWZpbmUJQ0FOX01CMThfREFUQTAJCTB4RkZDMDJFNDAJLyogTWFpbGJveCAxOCBEYXRhIFdvcmQJMCBbMTU6MF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMThfREFUQTEJCTB4RkZDMDJFNDQJLyogTWFpbGJveCAxOCBEYXRhIFdvcmQJMSBbMzE6MTZdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjE4X0RBVEEyCQkweEZGQzAyRTQ4CS8qIE1haWxib3ggMTggRGF0YSBXb3JkCTIgWzQ3OjMyXSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxOF9EQVRBMwkJMHhGRkMwMkU0QwkvKiBNYWlsYm94IDE4IERhdGEgV29yZAkzIFs2Mzo0OF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMThfTEVOR1RICQkweEZGQzAyRTUwCS8qIE1haWxib3ggMTggRGF0YSBMZW5ndGggQ29kZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxOF9USU1FU1RBTVAJMHhGRkMwMkU1NAkvKiBNYWlsYm94IDE4IFRpbWUgU3RhbXAgVmFsdWUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMThfSUQwCQkweEZGQzAyRTU4CS8qIE1haWxib3ggMTggSWRlbnRpZmllciBMb3cgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMThfSUQxCQkweEZGQzAyRTVDCS8qIE1haWxib3ggMTggSWRlbnRpZmllciBIaWdoIFJlZ2lzdGVyICovCisKKyNkZWZpbmUJQ0FOX01CMTlfREFUQTAJCTB4RkZDMDJFNjAJLyogTWFpbGJveCAxOSBEYXRhIFdvcmQJMCBbMTU6MF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMTlfREFUQTEJCTB4RkZDMDJFNjQJLyogTWFpbGJveCAxOSBEYXRhIFdvcmQJMSBbMzE6MTZdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjE5X0RBVEEyCQkweEZGQzAyRTY4CS8qIE1haWxib3ggMTkgRGF0YSBXb3JkCTIgWzQ3OjMyXSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxOV9EQVRBMwkJMHhGRkMwMkU2QwkvKiBNYWlsYm94IDE5IERhdGEgV29yZAkzIFs2Mzo0OF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMTlfTEVOR1RICQkweEZGQzAyRTcwCS8qIE1haWxib3ggMTkgRGF0YSBMZW5ndGggQ29kZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxOV9USU1FU1RBTVAJMHhGRkMwMkU3NAkvKiBNYWlsYm94IDE5IFRpbWUgU3RhbXAgVmFsdWUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMTlfSUQwCQkweEZGQzAyRTc4CS8qIE1haWxib3ggMTkgSWRlbnRpZmllciBMb3cgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMTlfSUQxCQkweEZGQzAyRTdDCS8qIE1haWxib3ggMTkgSWRlbnRpZmllciBIaWdoIFJlZ2lzdGVyICovCisKKyNkZWZpbmUJQ0FOX01CMjBfREFUQTAJCTB4RkZDMDJFODAJLyogTWFpbGJveCAyMCBEYXRhIFdvcmQJMCBbMTU6MF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjBfREFUQTEJCTB4RkZDMDJFODQJLyogTWFpbGJveCAyMCBEYXRhIFdvcmQJMSBbMzE6MTZdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjIwX0RBVEEyCQkweEZGQzAyRTg4CS8qIE1haWxib3ggMjAgRGF0YSBXb3JkCTIgWzQ3OjMyXSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyMF9EQVRBMwkJMHhGRkMwMkU4QwkvKiBNYWlsYm94IDIwIERhdGEgV29yZAkzIFs2Mzo0OF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjBfTEVOR1RICQkweEZGQzAyRTkwCS8qIE1haWxib3ggMjAgRGF0YSBMZW5ndGggQ29kZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyMF9USU1FU1RBTVAJMHhGRkMwMkU5NAkvKiBNYWlsYm94IDIwIFRpbWUgU3RhbXAgVmFsdWUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjBfSUQwCQkweEZGQzAyRTk4CS8qIE1haWxib3ggMjAgSWRlbnRpZmllciBMb3cgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjBfSUQxCQkweEZGQzAyRTlDCS8qIE1haWxib3ggMjAgSWRlbnRpZmllciBIaWdoIFJlZ2lzdGVyICovCisKKyNkZWZpbmUJQ0FOX01CMjFfREFUQTAJCTB4RkZDMDJFQTAJLyogTWFpbGJveCAyMSBEYXRhIFdvcmQJMCBbMTU6MF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjFfREFUQTEJCTB4RkZDMDJFQTQJLyogTWFpbGJveCAyMSBEYXRhIFdvcmQJMSBbMzE6MTZdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjIxX0RBVEEyCQkweEZGQzAyRUE4CS8qIE1haWxib3ggMjEgRGF0YSBXb3JkCTIgWzQ3OjMyXSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyMV9EQVRBMwkJMHhGRkMwMkVBQwkvKiBNYWlsYm94IDIxIERhdGEgV29yZAkzIFs2Mzo0OF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjFfTEVOR1RICQkweEZGQzAyRUIwCS8qIE1haWxib3ggMjEgRGF0YSBMZW5ndGggQ29kZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyMV9USU1FU1RBTVAJMHhGRkMwMkVCNAkvKiBNYWlsYm94IDIxIFRpbWUgU3RhbXAgVmFsdWUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjFfSUQwCQkweEZGQzAyRUI4CS8qIE1haWxib3ggMjEgSWRlbnRpZmllciBMb3cgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjFfSUQxCQkweEZGQzAyRUJDCS8qIE1haWxib3ggMjEgSWRlbnRpZmllciBIaWdoIFJlZ2lzdGVyICovCisKKyNkZWZpbmUJQ0FOX01CMjJfREFUQTAJCTB4RkZDMDJFQzAJLyogTWFpbGJveCAyMiBEYXRhIFdvcmQJMCBbMTU6MF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjJfREFUQTEJCTB4RkZDMDJFQzQJLyogTWFpbGJveCAyMiBEYXRhIFdvcmQJMSBbMzE6MTZdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjIyX0RBVEEyCQkweEZGQzAyRUM4CS8qIE1haWxib3ggMjIgRGF0YSBXb3JkCTIgWzQ3OjMyXSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyMl9EQVRBMwkJMHhGRkMwMkVDQwkvKiBNYWlsYm94IDIyIERhdGEgV29yZAkzIFs2Mzo0OF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjJfTEVOR1RICQkweEZGQzAyRUQwCS8qIE1haWxib3ggMjIgRGF0YSBMZW5ndGggQ29kZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyMl9USU1FU1RBTVAJMHhGRkMwMkVENAkvKiBNYWlsYm94IDIyIFRpbWUgU3RhbXAgVmFsdWUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjJfSUQwCQkweEZGQzAyRUQ4CS8qIE1haWxib3ggMjIgSWRlbnRpZmllciBMb3cgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjJfSUQxCQkweEZGQzAyRURDCS8qIE1haWxib3ggMjIgSWRlbnRpZmllciBIaWdoIFJlZ2lzdGVyICovCisKKyNkZWZpbmUJQ0FOX01CMjNfREFUQTAJCTB4RkZDMDJFRTAJLyogTWFpbGJveCAyMyBEYXRhIFdvcmQJMCBbMTU6MF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjNfREFUQTEJCTB4RkZDMDJFRTQJLyogTWFpbGJveCAyMyBEYXRhIFdvcmQJMSBbMzE6MTZdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjIzX0RBVEEyCQkweEZGQzAyRUU4CS8qIE1haWxib3ggMjMgRGF0YSBXb3JkCTIgWzQ3OjMyXSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyM19EQVRBMwkJMHhGRkMwMkVFQwkvKiBNYWlsYm94IDIzIERhdGEgV29yZAkzIFs2Mzo0OF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjNfTEVOR1RICQkweEZGQzAyRUYwCS8qIE1haWxib3ggMjMgRGF0YSBMZW5ndGggQ29kZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyM19USU1FU1RBTVAJMHhGRkMwMkVGNAkvKiBNYWlsYm94IDIzIFRpbWUgU3RhbXAgVmFsdWUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjNfSUQwCQkweEZGQzAyRUY4CS8qIE1haWxib3ggMjMgSWRlbnRpZmllciBMb3cgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjNfSUQxCQkweEZGQzAyRUZDCS8qIE1haWxib3ggMjMgSWRlbnRpZmllciBIaWdoIFJlZ2lzdGVyICovCisKKyNkZWZpbmUJQ0FOX01CMjRfREFUQTAJCTB4RkZDMDJGMDAJLyogTWFpbGJveCAyNCBEYXRhIFdvcmQJMCBbMTU6MF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjRfREFUQTEJCTB4RkZDMDJGMDQJLyogTWFpbGJveCAyNCBEYXRhIFdvcmQJMSBbMzE6MTZdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjI0X0RBVEEyCQkweEZGQzAyRjA4CS8qIE1haWxib3ggMjQgRGF0YSBXb3JkCTIgWzQ3OjMyXSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyNF9EQVRBMwkJMHhGRkMwMkYwQwkvKiBNYWlsYm94IDI0IERhdGEgV29yZAkzIFs2Mzo0OF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjRfTEVOR1RICQkweEZGQzAyRjEwCS8qIE1haWxib3ggMjQgRGF0YSBMZW5ndGggQ29kZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyNF9USU1FU1RBTVAJMHhGRkMwMkYxNAkvKiBNYWlsYm94IDI0IFRpbWUgU3RhbXAgVmFsdWUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjRfSUQwCQkweEZGQzAyRjE4CS8qIE1haWxib3ggMjQgSWRlbnRpZmllciBMb3cgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjRfSUQxCQkweEZGQzAyRjFDCS8qIE1haWxib3ggMjQgSWRlbnRpZmllciBIaWdoIFJlZ2lzdGVyICovCisKKyNkZWZpbmUJQ0FOX01CMjVfREFUQTAJCTB4RkZDMDJGMjAJLyogTWFpbGJveCAyNSBEYXRhIFdvcmQJMCBbMTU6MF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjVfREFUQTEJCTB4RkZDMDJGMjQJLyogTWFpbGJveCAyNSBEYXRhIFdvcmQJMSBbMzE6MTZdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjI1X0RBVEEyCQkweEZGQzAyRjI4CS8qIE1haWxib3ggMjUgRGF0YSBXb3JkCTIgWzQ3OjMyXSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyNV9EQVRBMwkJMHhGRkMwMkYyQwkvKiBNYWlsYm94IDI1IERhdGEgV29yZAkzIFs2Mzo0OF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjVfTEVOR1RICQkweEZGQzAyRjMwCS8qIE1haWxib3ggMjUgRGF0YSBMZW5ndGggQ29kZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyNV9USU1FU1RBTVAJMHhGRkMwMkYzNAkvKiBNYWlsYm94IDI1IFRpbWUgU3RhbXAgVmFsdWUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjVfSUQwCQkweEZGQzAyRjM4CS8qIE1haWxib3ggMjUgSWRlbnRpZmllciBMb3cgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjVfSUQxCQkweEZGQzAyRjNDCS8qIE1haWxib3ggMjUgSWRlbnRpZmllciBIaWdoIFJlZ2lzdGVyICovCisKKyNkZWZpbmUJQ0FOX01CMjZfREFUQTAJCTB4RkZDMDJGNDAJLyogTWFpbGJveCAyNiBEYXRhIFdvcmQJMCBbMTU6MF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjZfREFUQTEJCTB4RkZDMDJGNDQJLyogTWFpbGJveCAyNiBEYXRhIFdvcmQJMSBbMzE6MTZdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjI2X0RBVEEyCQkweEZGQzAyRjQ4CS8qIE1haWxib3ggMjYgRGF0YSBXb3JkCTIgWzQ3OjMyXSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyNl9EQVRBMwkJMHhGRkMwMkY0QwkvKiBNYWlsYm94IDI2IERhdGEgV29yZAkzIFs2Mzo0OF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjZfTEVOR1RICQkweEZGQzAyRjUwCS8qIE1haWxib3ggMjYgRGF0YSBMZW5ndGggQ29kZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyNl9USU1FU1RBTVAJMHhGRkMwMkY1NAkvKiBNYWlsYm94IDI2IFRpbWUgU3RhbXAgVmFsdWUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjZfSUQwCQkweEZGQzAyRjU4CS8qIE1haWxib3ggMjYgSWRlbnRpZmllciBMb3cgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjZfSUQxCQkweEZGQzAyRjVDCS8qIE1haWxib3ggMjYgSWRlbnRpZmllciBIaWdoIFJlZ2lzdGVyICovCisKKyNkZWZpbmUJQ0FOX01CMjdfREFUQTAJCTB4RkZDMDJGNjAJLyogTWFpbGJveCAyNyBEYXRhIFdvcmQJMCBbMTU6MF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjdfREFUQTEJCTB4RkZDMDJGNjQJLyogTWFpbGJveCAyNyBEYXRhIFdvcmQJMSBbMzE6MTZdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjI3X0RBVEEyCQkweEZGQzAyRjY4CS8qIE1haWxib3ggMjcgRGF0YSBXb3JkCTIgWzQ3OjMyXSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyN19EQVRBMwkJMHhGRkMwMkY2QwkvKiBNYWlsYm94IDI3IERhdGEgV29yZAkzIFs2Mzo0OF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjdfTEVOR1RICQkweEZGQzAyRjcwCS8qIE1haWxib3ggMjcgRGF0YSBMZW5ndGggQ29kZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyN19USU1FU1RBTVAJMHhGRkMwMkY3NAkvKiBNYWlsYm94IDI3IFRpbWUgU3RhbXAgVmFsdWUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjdfSUQwCQkweEZGQzAyRjc4CS8qIE1haWxib3ggMjcgSWRlbnRpZmllciBMb3cgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjdfSUQxCQkweEZGQzAyRjdDCS8qIE1haWxib3ggMjcgSWRlbnRpZmllciBIaWdoIFJlZ2lzdGVyICovCisKKyNkZWZpbmUJQ0FOX01CMjhfREFUQTAJCTB4RkZDMDJGODAJLyogTWFpbGJveCAyOCBEYXRhIFdvcmQJMCBbMTU6MF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjhfREFUQTEJCTB4RkZDMDJGODQJLyogTWFpbGJveCAyOCBEYXRhIFdvcmQJMSBbMzE6MTZdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjI4X0RBVEEyCQkweEZGQzAyRjg4CS8qIE1haWxib3ggMjggRGF0YSBXb3JkCTIgWzQ3OjMyXSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyOF9EQVRBMwkJMHhGRkMwMkY4QwkvKiBNYWlsYm94IDI4IERhdGEgV29yZAkzIFs2Mzo0OF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjhfTEVOR1RICQkweEZGQzAyRjkwCS8qIE1haWxib3ggMjggRGF0YSBMZW5ndGggQ29kZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyOF9USU1FU1RBTVAJMHhGRkMwMkY5NAkvKiBNYWlsYm94IDI4IFRpbWUgU3RhbXAgVmFsdWUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjhfSUQwCQkweEZGQzAyRjk4CS8qIE1haWxib3ggMjggSWRlbnRpZmllciBMb3cgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjhfSUQxCQkweEZGQzAyRjlDCS8qIE1haWxib3ggMjggSWRlbnRpZmllciBIaWdoIFJlZ2lzdGVyICovCisKKyNkZWZpbmUJQ0FOX01CMjlfREFUQTAJCTB4RkZDMDJGQTAJLyogTWFpbGJveCAyOSBEYXRhIFdvcmQJMCBbMTU6MF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjlfREFUQTEJCTB4RkZDMDJGQTQJLyogTWFpbGJveCAyOSBEYXRhIFdvcmQJMSBbMzE6MTZdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjI5X0RBVEEyCQkweEZGQzAyRkE4CS8qIE1haWxib3ggMjkgRGF0YSBXb3JkCTIgWzQ3OjMyXSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyOV9EQVRBMwkJMHhGRkMwMkZBQwkvKiBNYWlsYm94IDI5IERhdGEgV29yZAkzIFs2Mzo0OF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjlfTEVOR1RICQkweEZGQzAyRkIwCS8qIE1haWxib3ggMjkgRGF0YSBMZW5ndGggQ29kZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyOV9USU1FU1RBTVAJMHhGRkMwMkZCNAkvKiBNYWlsYm94IDI5IFRpbWUgU3RhbXAgVmFsdWUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjlfSUQwCQkweEZGQzAyRkI4CS8qIE1haWxib3ggMjkgSWRlbnRpZmllciBMb3cgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjlfSUQxCQkweEZGQzAyRkJDCS8qIE1haWxib3ggMjkgSWRlbnRpZmllciBIaWdoIFJlZ2lzdGVyICovCisKKyNkZWZpbmUJQ0FOX01CMzBfREFUQTAJCTB4RkZDMDJGQzAJLyogTWFpbGJveCAzMCBEYXRhIFdvcmQJMCBbMTU6MF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMzBfREFUQTEJCTB4RkZDMDJGQzQJLyogTWFpbGJveCAzMCBEYXRhIFdvcmQJMSBbMzE6MTZdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjMwX0RBVEEyCQkweEZGQzAyRkM4CS8qIE1haWxib3ggMzAgRGF0YSBXb3JkCTIgWzQ3OjMyXSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIzMF9EQVRBMwkJMHhGRkMwMkZDQwkvKiBNYWlsYm94IDMwIERhdGEgV29yZAkzIFs2Mzo0OF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMzBfTEVOR1RICQkweEZGQzAyRkQwCS8qIE1haWxib3ggMzAgRGF0YSBMZW5ndGggQ29kZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIzMF9USU1FU1RBTVAJMHhGRkMwMkZENAkvKiBNYWlsYm94IDMwIFRpbWUgU3RhbXAgVmFsdWUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMzBfSUQwCQkweEZGQzAyRkQ4CS8qIE1haWxib3ggMzAgSWRlbnRpZmllciBMb3cgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMzBfSUQxCQkweEZGQzAyRkRDCS8qIE1haWxib3ggMzAgSWRlbnRpZmllciBIaWdoIFJlZ2lzdGVyICovCisKKyNkZWZpbmUJQ0FOX01CMzFfREFUQTAJCTB4RkZDMDJGRTAJLyogTWFpbGJveCAzMSBEYXRhIFdvcmQJMCBbMTU6MF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMzFfREFUQTEJCTB4RkZDMDJGRTQJLyogTWFpbGJveCAzMSBEYXRhIFdvcmQJMSBbMzE6MTZdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjMxX0RBVEEyCQkweEZGQzAyRkU4CS8qIE1haWxib3ggMzEgRGF0YSBXb3JkCTIgWzQ3OjMyXSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIzMV9EQVRBMwkJMHhGRkMwMkZFQwkvKiBNYWlsYm94IDMxIERhdGEgV29yZAkzIFs2Mzo0OF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMzFfTEVOR1RICQkweEZGQzAyRkYwCS8qIE1haWxib3ggMzEgRGF0YSBMZW5ndGggQ29kZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIzMV9USU1FU1RBTVAJMHhGRkMwMkZGNAkvKiBNYWlsYm94IDMxIFRpbWUgU3RhbXAgVmFsdWUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMzFfSUQwCQkweEZGQzAyRkY4CS8qIE1haWxib3ggMzEgSWRlbnRpZmllciBMb3cgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMzFfSUQxCQkweEZGQzAyRkZDCS8qIE1haWxib3ggMzEgSWRlbnRpZmllciBIaWdoIFJlZ2lzdGVyICovCisKKy8qIENBTiBNYWlsYm94IEFyZWEgTWFjcm9zICovCisjZGVmaW5lCUNBTl9NQl9JRDEoeCkJCShDQU5fTUIwMF9JRDErKCh4KSoweDIwKSkKKyNkZWZpbmUJQ0FOX01CX0lEMCh4KQkJKENBTl9NQjAwX0lEMCsoKHgpKjB4MjApKQorI2RlZmluZQlDQU5fTUJfVElNRVNUQU1QKHgpCShDQU5fTUIwMF9USU1FU1RBTVArKCh4KSoweDIwKSkKKyNkZWZpbmUJQ0FOX01CX0xFTkdUSCh4KQkoQ0FOX01CMDBfTEVOR1RIKygoeCkqMHgyMCkpCisjZGVmaW5lCUNBTl9NQl9EQVRBMyh4KQkJKENBTl9NQjAwX0RBVEEzKygoeCkqMHgyMCkpCisjZGVmaW5lCUNBTl9NQl9EQVRBMih4KQkJKENBTl9NQjAwX0RBVEEyKygoeCkqMHgyMCkpCisjZGVmaW5lCUNBTl9NQl9EQVRBMSh4KQkJKENBTl9NQjAwX0RBVEExKygoeCkqMHgyMCkpCisjZGVmaW5lCUNBTl9NQl9EQVRBMCh4KQkJKENBTl9NQjAwX0RBVEEwKygoeCkqMHgyMCkpCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiBTeXN0ZW0gTU1SIFJlZ2lzdGVyIEJpdHMgYW5kCU1hY3JvcyAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworLyogKioqKioqKioqKioqKioqKioqKioqIFBMTCBBTkQgUkVTRVQgTUFTS1MgKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiBQTExfQ1RMIE1hc2tzICovCisjZGVmaW5lCVBMTF9DTEtJTgkJCTB4MDAwMAkvKiBQYXNzCUNMS0lOIHRvIFBMTCAqLworI2RlZmluZQlQTExfQ0xLSU5fRElWMgkJMHgwMDAxCS8qIFBhc3MJQ0xLSU4vMgl0byBQTEwgKi8KKyNkZWZpbmUJREYJCQkJCTB4MDAwMQkgLyogMDogUExMID0gQ0xLSU4sIDE6IFBMTCA9IENMS0lOLzIgKi8KKyNkZWZpbmUJUExMX09GRgkJCQkweDAwMDIJLyogU2h1dAlvZmYgUExMCWNsb2NrcyAqLworCisjZGVmaW5lCVNUT1BDSwkJCQkweDAwMDgJLyogQ29yZQlDbG9jayBPZmYJCSAqLworI2RlZmluZQlQRFdOCQkJCTB4MDAyMAkvKiBQdXQgdGhlIFBMTCBpbiBhIERlZXAgU2xlZXAgc3RhdGUgKi8KKyNkZWZpbmUJSU5fREVMQVkJCQkweDAwMTQJLyogRUJJVQlJbnB1dCBEZWxheSBTZWxlY3QgKi8KKyNkZWZpbmUJT1VUX0RFTEFZCQkJMHgwMEMwCS8qIEVCSVUJT3V0cHV0IERlbGF5IFNlbGVjdCAqLworI2RlZmluZQlCWVBBU1MJCQkJMHgwMTAwCS8qIEJ5cGFzcyB0aGUgUExMICovCisjZGVmaW5lCU1TRUwJCQkweDdFMDAJLyogTXVsdGlwbGllciBTZWxlY3QgRm9yIENDTEsvVkNPIEZhY3RvcnMgKi8KKworLyogUExMX0NUTCBNYWNyb3MJCQkJICovCisjaWZkZWYgX01JU1JBX1JVTEVTCisjZGVmaW5lCVNFVF9NU0VMKHgpCQkoKCh4KSYweDNGdSkgPDwJMHg5KQkvKiBTZXQgTVNFTCA9IDAtNjMgLS0+IFZDTyA9IENMS0lOKk1TRUwgKi8KKyNkZWZpbmUJU0VUX09VVF9ERUxBWSh4KQkoKCh4KSYweDAzdSkgPDwJMHg2KQorI2RlZmluZQlTRVRfSU5fREVMQVkoeCkJCSgoKCh4KSYweDAydSkgPDwgMHgzKSB8CSgoKHgpJjB4MDF1KSA8PAkweDIpKQorI2Vsc2UKKyNkZWZpbmUJU0VUX01TRUwoeCkJCSgoKHgpJjB4M0YpIDw8IDB4OSkJLyogU2V0IE1TRUwgPSAwLTYzIC0tPiBWQ08gPSBDTEtJTipNU0VMICovCisjZGVmaW5lCVNFVF9PVVRfREVMQVkoeCkJKCgoeCkmMHgwMykgPDwgMHg2KQorI2RlZmluZQlTRVRfSU5fREVMQVkoeCkJCSgoKCh4KSYweDAyKSA8PAkweDMpIHwgKCgoeCkmMHgwMSkgPDwgMHgyKSkKKyNlbmRpZiAvKiBfTUlTUkFfUlVMRVMgKi8KKworLyogUExMX0RJViBNYXNrcyAqLworI2RlZmluZQlTU0VMCQkJCTB4MDAwRgkvKiBTeXN0ZW0gU2VsZWN0ICovCisjZGVmaW5lCUNTRUwJCQkJMHgwMDMwCS8qIENvcmUJU2VsZWN0ICovCisjZGVmaW5lCUNTRUxfRElWMQkJMHgwMDAwCS8qCQlDQ0xLID0gVkNPIC8gMSAqLworI2RlZmluZQlDU0VMX0RJVjIJCTB4MDAxMAkvKgkJQ0NMSyA9IFZDTyAvIDIgKi8KKyNkZWZpbmUJQ1NFTF9ESVY0CQkweDAwMjAJLyoJCUNDTEsgPSBWQ08gLyA0ICovCisjZGVmaW5lCUNTRUxfRElWOAkJMHgwMDMwCS8qCQlDQ0xLID0gVkNPIC8gOCAqLworCisjZGVmaW5lCVNDTEtfRElWKHgpCQkJKHgpCQkvKiBTQ0xLCT0gVkNPIC8JeCAqLworCisvKiBQTExfRElWIE1hY3JvcwkJCQkJCQkgKi8KKyNpZmRlZiBfTUlTUkFfUlVMRVMKKyNkZWZpbmUJU0VUX1NTRUwoeCkJCQkoKHgpJjB4RnUpCS8qIFNldCBTU0VMID0gMC0xNSAtLT4gU0NMSyA9IFZDTy9TU0VMICovCisjZWxzZQorI2RlZmluZQlTRVRfU1NFTCh4KQkJCSgoeCkmMHhGKQkvKiBTZXQgU1NFTCA9IDAtMTUgLS0+IFNDTEsgPSBWQ08vU1NFTCAqLworI2VuZGlmIC8qIF9NSVNSQV9SVUxFUyAqLworCisvKiBQTExfU1RBVCBNYXNrcwkJCQkJCQkJCQkgKi8KKyNkZWZpbmUJQUNUSVZFX1BMTEVOQUJMRUQJMHgwMDAxCS8qIFByb2Nlc3NvciBJbglBY3RpdmUgTW9kZSBXaXRoIFBMTCBFbmFibGVkICovCisjZGVmaW5lCUZVTExfT04JCQkJMHgwMDAyCS8qIFByb2Nlc3NvciBJbglGdWxsIE9uCU1vZGUgKi8KKyNkZWZpbmUJQUNUSVZFX1BMTERJU0FCTEVECTB4MDAwNAkvKiBQcm9jZXNzb3IgSW4JQWN0aXZlIE1vZGUgV2l0aCBQTEwgRGlzYWJsZWQgKi8KKyNkZWZpbmUJUExMX0xPQ0tFRAkJCTB4MDAyMAkvKiBQTExfTE9DS0NOVCBIYXMgQmVlbglSZWFjaGVkICovCisKKy8qIFZSX0NUTCBNYXNrcwkJCQkJCQkJCQkgKi8KKyNkZWZpbmUJRlJFUQkJCTB4MDAwMwkvKiBTd2l0Y2hpbmcgT3NjaWxsYXRvcglGcmVxdWVuY3kgRm9yIFJlZ3VsYXRvciAqLworI2RlZmluZQlISUJFUk5BVEUJCTB4MDAwMAkvKgkJUG93ZXJkb3duL0J5cGFzcyBPbi1Cb2FyZCBSZWd1bGF0aW9uICovCisjZGVmaW5lCUZSRVFfMzMzCQkweDAwMDEJLyoJCVN3aXRjaGluZyBGcmVxdWVuY3kgSXMgMzMzIGtIeiAqLworI2RlZmluZQlGUkVRXzY2NwkJMHgwMDAyCS8qCQlTd2l0Y2hpbmcgRnJlcXVlbmN5IElzIDY2NyBrSHogKi8KKyNkZWZpbmUJRlJFUV8xMDAwCQkweDAwMDMJLyoJCVN3aXRjaGluZyBGcmVxdWVuY3kgSXMgMSBNSHogKi8KKworI2RlZmluZQlHQUlOCQkJMHgwMDBDCS8qIFZvbHRhZ2UgTGV2ZWwgR2FpbiAqLworI2RlZmluZQlHQUlOXzUJCQkweDAwMDAJLyoJCUdBSU4gPSA1ICovCisjZGVmaW5lCUdBSU5fMTAJCQkweDAwMDQJLyoJCUdBSU4gPSAxMCAqLworI2RlZmluZQlHQUlOXzIwCQkJMHgwMDA4CS8qCQlHQUlOID0gMjAgKi8KKyNkZWZpbmUJR0FJTl81MAkJCTB4MDAwQwkvKgkJR0FJTiA9IDUwICovCisKKyNkZWZpbmUJVkxFVgkJCTB4MDBGMAkvKiBJbnRlcm5hbCBWb2x0YWdlIExldmVsIC0gT25seSBQcm9ncmFtIFZhbHVlcwlXaXRoaW4gU3BlY2lmaWNhdGlvbnMgKi8KKyNkZWZpbmUJVkxFVl8xMDAJCTB4MDA5MAkvKglWTEVWID0gMS4wMCBWIChTZWUgRGF0YXNoZWV0IGZvciBSZWd1bGF0b3IgVG9sZXJhbmNlKSAqLworI2RlZmluZQlWTEVWXzEwNQkJMHgwMEEwCS8qCVZMRVYgPSAxLjA1IFYgKFNlZSBEYXRhc2hlZXQgZm9yIFJlZ3VsYXRvciBUb2xlcmFuY2UpICovCisjZGVmaW5lCVZMRVZfMTEwCQkweDAwQjAJLyoJVkxFViA9IDEuMTAgViAoU2VlIERhdGFzaGVldCBmb3IgUmVndWxhdG9yIFRvbGVyYW5jZSkgKi8KKyNkZWZpbmUJVkxFVl8xMTUJCTB4MDBDMAkvKglWTEVWID0gMS4xNSBWIChTZWUgRGF0YXNoZWV0IGZvciBSZWd1bGF0b3IgVG9sZXJhbmNlKSAqLworI2RlZmluZQlWTEVWXzEyMAkJMHgwMEQwCS8qCVZMRVYgPSAxLjIwIFYgKFNlZSBEYXRhc2hlZXQgZm9yIFJlZ3VsYXRvciBUb2xlcmFuY2UpICovCisjZGVmaW5lCVZMRVZfMTI1CQkweDAwRTAJLyoJVkxFViA9IDEuMjUgViAoU2VlIERhdGFzaGVldCBmb3IgUmVndWxhdG9yIFRvbGVyYW5jZSkgKi8KKyNkZWZpbmUJVkxFVl8xMzAJCTB4MDBGMAkvKglWTEVWID0gMS4zMCBWIChTZWUgRGF0YXNoZWV0IGZvciBSZWd1bGF0b3IgVG9sZXJhbmNlKSAqLworCisjZGVmaW5lCVdBS0UJCQkweDAxMDAJLyogRW5hYmxlIFJUQy9SZXNldCBXYWtldXAgRnJvbQlIaWJlcm5hdGUgKi8KKyNkZWZpbmUJQ0FOV0UJCQkweDAyMDAJLyogRW5hYmxlIENBTiBXYWtldXAgRnJvbSBIaWJlcm5hdGUgKi8KKyNkZWZpbmUJTVhWUldFCQkJMHgwNDAwCS8qIEVuYWJsZSBNWFZSIFdha2V1cCBGcm9tIEhpYmVybmF0ZSAqLworI2RlZmluZQlTQ0tFTE9XCQkJMHg4MDAwCS8qIERvIE5vdCBEcml2ZQlTQ0tFIEhpZ2ggRHVyaW5nIFJlc2V0IEFmdGVyIEhpYmVybmF0ZSAqLworCisvKiBTV1JTVCBNYXNrICovCisjZGVmaW5lCVNZU1RFTV9SRVNFVAkweDAwMDcJLyogSW5pdGlhdGVzIEEgU3lzdGVtIFNvZnR3YXJlIFJlc2V0ICovCisjZGVmaW5lCURPVUJMRV9GQVVMVAkweDAwMDgJLyogQ29yZQlEb3VibGUgRmF1bHQgQ2F1c2VzIFJlc2V0ICovCisjZGVmaW5lCVJFU0VUX0RPVUJMRQkweDIwMDAJLyogU1cgUmVzZXQgR2VuZXJhdGVkIEJ5IENvcmUgRG91YmxlLUZhdWx0ICovCisjZGVmaW5lCVJFU0VUX1dET0cJCTB4NDAwMAkvKiBTVyBSZXNldCBHZW5lcmF0ZWQgQnkgV2F0Y2hkb2cgVGltZXIgKi8KKyNkZWZpbmUJUkVTRVRfU09GVFdBUkUJMHg4MDAwCS8qIFNXIFJlc2V0IE9jY3VycmVkIFNpbmNlIExhc3QJUmVhZCBPZglTV1JTVCAqLworCisvKiBTWVNDUiBNYXNrcwkJCQkJCQkJCQkJCQkgKi8KKyNkZWZpbmUJQk1PREUJCQkweDAwMDYJLyogQm9vdAlNb2RlIC0gTGF0Y2hlZCBEdXJpbmcgSFcgUmVzZXQgRnJvbSBNb2RlIFBpbnMgKi8KKyNkZWZpbmUJTk9CT09UCQkJMHgwMDEwCS8qIEV4ZWN1dGUgRnJvbQlMMSBvciBBU1lOQyBCYW5rIDAgV2hlbglCTU9ERSA9CTAgKi8KKworCisvKiAqKioqKioqKioqKioqICBTWVNURU0gSU5URVJSVVBUIENPTlRST0xMRVIgTUFTS1MgKioqKioqKioqKioqKioqKiogKi8KKworLyogUGVyaXBoZXJhbCBNYXNrcyBGb3IJU0lDMF9JU1IsIFNJQzBfSVdSLCBTSUMwX0lNQVNLICovCisjZGVmaW5lCVBMTF9XQUtFVVBfSVJRCQkweDAwMDAwMDAxCS8qIFBMTCBXYWtldXAgSW50ZXJydXB0CVJlcXVlc3QgKi8KKyNkZWZpbmUJRE1BQzBfRVJSX0lSUQkJMHgwMDAwMDAwMgkvKiBETUEgQ29udHJvbGxlciAwIEVycm9yIEludGVycnVwdCBSZXF1ZXN0ICovCisjZGVmaW5lCVBQSV9FUlJfSVJRCQkweDAwMDAwMDA0CS8qIFBQSSBFcnJvciBJbnRlcnJ1cHQgUmVxdWVzdCAqLworI2RlZmluZQlTUE9SVDBfRVJSX0lSUQkJMHgwMDAwMDAwOAkvKiBTUE9SVDAgRXJyb3IJSW50ZXJydXB0IFJlcXVlc3QgKi8KKyNkZWZpbmUJU1BPUlQxX0VSUl9JUlEJCTB4MDAwMDAwMTAJLyogU1BPUlQxIEVycm9yCUludGVycnVwdCBSZXF1ZXN0ICovCisjZGVmaW5lCVNQSTBfRVJSX0lSUQkJMHgwMDAwMDAyMAkvKiBTUEkwCUVycm9yIEludGVycnVwdAlSZXF1ZXN0ICovCisjZGVmaW5lCVVBUlQwX0VSUl9JUlEJCTB4MDAwMDAwNDAJLyogVUFSVDAgRXJyb3IgSW50ZXJydXB0IFJlcXVlc3QgKi8KKyNkZWZpbmUJUlRDX0lSUQkJCTB4MDAwMDAwODAJLyogUmVhbC1UaW1lIENsb2NrIEludGVycnVwdCBSZXF1ZXN0ICovCisjZGVmaW5lCURNQTBfSVJRCQkweDAwMDAwMTAwCS8qIERNQSBDaGFubmVsIDAgKFBQSSkgSW50ZXJydXB0IFJlcXVlc3QgKi8KKyNkZWZpbmUJRE1BMV9JUlEJCTB4MDAwMDAyMDAJLyogRE1BIENoYW5uZWwgMSAoU1BPUlQwIFJYKSBJbnRlcnJ1cHQgUmVxdWVzdCAqLworI2RlZmluZQlETUEyX0lSUQkJMHgwMDAwMDQwMAkvKiBETUEgQ2hhbm5lbCAyIChTUE9SVDAgVFgpIEludGVycnVwdCBSZXF1ZXN0ICovCisjZGVmaW5lCURNQTNfSVJRCQkweDAwMDAwODAwCS8qIERNQSBDaGFubmVsIDMgKFNQT1JUMSBSWCkgSW50ZXJydXB0IFJlcXVlc3QgKi8KKyNkZWZpbmUJRE1BNF9JUlEJCTB4MDAwMDEwMDAJLyogRE1BIENoYW5uZWwgNCAoU1BPUlQxIFRYKSBJbnRlcnJ1cHQgUmVxdWVzdCAqLworI2RlZmluZQlETUE1X0lSUQkJMHgwMDAwMjAwMAkvKiBETUEgQ2hhbm5lbCA1IChTUEkpIEludGVycnVwdCBSZXF1ZXN0ICovCisjZGVmaW5lCURNQTZfSVJRCQkweDAwMDA0MDAwCS8qIERNQSBDaGFubmVsIDYgKFVBUlQgUlgpIEludGVycnVwdCBSZXF1ZXN0ICovCisjZGVmaW5lCURNQTdfSVJRCQkweDAwMDA4MDAwCS8qIERNQSBDaGFubmVsIDcgKFVBUlQgVFgpIEludGVycnVwdCBSZXF1ZXN0ICovCisjZGVmaW5lCVRJTUVSMF9JUlEJCTB4MDAwMTAwMDAJLyogVGltZXIgMCBJbnRlcnJ1cHQgUmVxdWVzdCAqLworI2RlZmluZQlUSU1FUjFfSVJRCQkweDAwMDIwMDAwCS8qIFRpbWVyIDEgSW50ZXJydXB0IFJlcXVlc3QgKi8KKyNkZWZpbmUJVElNRVIyX0lSUQkJMHgwMDA0MDAwMAkvKiBUaW1lciAyIEludGVycnVwdCBSZXF1ZXN0ICovCisjZGVmaW5lCVBGQV9JUlEJCQkweDAwMDgwMDAwCS8qIFByb2dyYW1tYWJsZQlGbGFnIEludGVycnVwdCBSZXF1ZXN0IEEgKi8KKyNkZWZpbmUJUEZCX0lSUQkJCTB4MDAxMDAwMDAJLyogUHJvZ3JhbW1hYmxlCUZsYWcgSW50ZXJydXB0IFJlcXVlc3QgQiAqLworI2RlZmluZQlNRE1BMF8wX0lSUQkJMHgwMDIwMDAwMAkvKiBNZW1ETUEwIFN0cmVhbSAwIEludGVycnVwdCBSZXF1ZXN0ICovCisjZGVmaW5lCU1ETUEwXzFfSVJRCQkweDAwNDAwMDAwCS8qIE1lbURNQTAgU3RyZWFtIDEgSW50ZXJydXB0IFJlcXVlc3QgKi8KKyNkZWZpbmUJV0RPR19JUlEJCTB4MDA4MDAwMDAJLyogU29mdHdhcmUgV2F0Y2hkb2cgVGltZXIgSW50ZXJydXB0IFJlcXVlc3QgKi8KKyNkZWZpbmUJRE1BQzFfRVJSX0lSUQkJMHgwMTAwMDAwMAkvKiBETUEgQ29udHJvbGxlciAxIEVycm9yIEludGVycnVwdCBSZXF1ZXN0ICovCisjZGVmaW5lCVNQT1JUMl9FUlJfSVJRCQkweDAyMDAwMDAwCS8qIFNQT1JUMiBFcnJvcglJbnRlcnJ1cHQgUmVxdWVzdCAqLworI2RlZmluZQlTUE9SVDNfRVJSX0lSUQkJMHgwNDAwMDAwMAkvKiBTUE9SVDMgRXJyb3IJSW50ZXJydXB0IFJlcXVlc3QgKi8KKyNkZWZpbmUJTVhWUl9TRF9JUlEJCTB4MDgwMDAwMDAJLyogTVhWUglTeW5jaHJvbm91cyBEYXRhIEludGVycnVwdCBSZXF1ZXN0ICovCisjZGVmaW5lCVNQSTFfRVJSX0lSUQkJMHgxMDAwMDAwMAkvKiBTUEkxCUVycm9yIEludGVycnVwdAlSZXF1ZXN0ICovCisjZGVmaW5lCVNQSTJfRVJSX0lSUQkJMHgyMDAwMDAwMAkvKiBTUEkyCUVycm9yIEludGVycnVwdAlSZXF1ZXN0ICovCisjZGVmaW5lCVVBUlQxX0VSUl9JUlEJCTB4NDAwMDAwMDAJLyogVUFSVDEgRXJyb3IgSW50ZXJydXB0IFJlcXVlc3QgKi8KKyNkZWZpbmUJVUFSVDJfRVJSX0lSUQkJMHg4MDAwMDAwMAkvKiBVQVJUMiBFcnJvciBJbnRlcnJ1cHQgUmVxdWVzdCAqLworCisvKiB0aGUgZm9sbG93aW5nIGFyZSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgKi8KKyNkZWZpbmUJRE1BMF9FUlJfSVJRCQlETUFDMF9FUlJfSVJRCisjZGVmaW5lCURNQTFfRVJSX0lSUQkJRE1BQzFfRVJSX0lSUQorCisKKy8qIFBlcmlwaGVyYWwgTWFza3MgRm9yCVNJQ19JU1IxLCBTSUNfSVdSMSwgU0lDX0lNQVNLMQkgKi8KKyNkZWZpbmUJQ0FOX0VSUl9JUlEJCQkweDAwMDAwMDAxCS8qIENBTiBFcnJvciBJbnRlcnJ1cHQgUmVxdWVzdCAqLworI2RlZmluZQlETUE4X0lSUQkJCTB4MDAwMDAwMDIJLyogRE1BIENoYW5uZWwgOCAoU1BPUlQyIFJYKSBJbnRlcnJ1cHQgUmVxdWVzdCAqLworI2RlZmluZQlETUE5X0lSUQkJCTB4MDAwMDAwMDQJLyogRE1BIENoYW5uZWwgOSAoU1BPUlQyIFRYKSBJbnRlcnJ1cHQgUmVxdWVzdCAqLworI2RlZmluZQlETUExMF9JUlEJCQkweDAwMDAwMDA4CS8qIERNQSBDaGFubmVsIDEwIChTUE9SVDMgUlgpIEludGVycnVwdAlSZXF1ZXN0ICovCisjZGVmaW5lCURNQTExX0lSUQkJCTB4MDAwMDAwMTAJLyogRE1BIENoYW5uZWwgMTEgKFNQT1JUMyBUWCkgSW50ZXJydXB0CVJlcXVlc3QgKi8KKyNkZWZpbmUJRE1BMTJfSVJRCQkJMHgwMDAwMDAyMAkvKiBETUEgQ2hhbm5lbCAxMiBJbnRlcnJ1cHQgUmVxdWVzdCAqLworI2RlZmluZQlETUExM19JUlEJCQkweDAwMDAwMDQwCS8qIERNQSBDaGFubmVsIDEzIEludGVycnVwdCBSZXF1ZXN0ICovCisjZGVmaW5lCURNQTE0X0lSUQkJCTB4MDAwMDAwODAJLyogRE1BIENoYW5uZWwgMTQgKFNQSTEpIEludGVycnVwdCBSZXF1ZXN0ICovCisjZGVmaW5lCURNQTE1X0lSUQkJCTB4MDAwMDAxMDAJLyogRE1BIENoYW5uZWwgMTUgKFNQSTIpIEludGVycnVwdCBSZXF1ZXN0ICovCisjZGVmaW5lCURNQTE2X0lSUQkJCTB4MDAwMDAyMDAJLyogRE1BIENoYW5uZWwgMTYgKFVBUlQxIFJYKSBJbnRlcnJ1cHQgUmVxdWVzdCAqLworI2RlZmluZQlETUExN19JUlEJCQkweDAwMDAwNDAwCS8qIERNQSBDaGFubmVsIDE3IChVQVJUMSBUWCkgSW50ZXJydXB0IFJlcXVlc3QgKi8KKyNkZWZpbmUJRE1BMThfSVJRCQkJMHgwMDAwMDgwMAkvKiBETUEgQ2hhbm5lbCAxOCAoVUFSVDIgUlgpIEludGVycnVwdCBSZXF1ZXN0ICovCisjZGVmaW5lCURNQTE5X0lSUQkJCTB4MDAwMDEwMDAJLyogRE1BIENoYW5uZWwgMTkgKFVBUlQyIFRYKSBJbnRlcnJ1cHQgUmVxdWVzdCAqLworI2RlZmluZQlUV0kwX0lSUQkJCTB4MDAwMDIwMDAJLyogVFdJMAlJbnRlcnJ1cHQgUmVxdWVzdCAqLworI2RlZmluZQlUV0kxX0lSUQkJCTB4MDAwMDQwMDAJLyogVFdJMQlJbnRlcnJ1cHQgUmVxdWVzdCAqLworI2RlZmluZQlDQU5fUlhfSVJRCQkJMHgwMDAwODAwMAkvKiBDQU4gUmVjZWl2ZSBJbnRlcnJ1cHQgUmVxdWVzdCAqLworI2RlZmluZQlDQU5fVFhfSVJRCQkJMHgwMDAxMDAwMAkvKiBDQU4gVHJhbnNtaXQJSW50ZXJydXB0IFJlcXVlc3QgKi8KKyNkZWZpbmUJTURNQTFfMF9JUlEJCQkweDAwMDIwMDAwCS8qIE1lbURNQTEgU3RyZWFtIDAgSW50ZXJydXB0IFJlcXVlc3QgKi8KKyNkZWZpbmUJTURNQTFfMV9JUlEJCQkweDAwMDQwMDAwCS8qIE1lbURNQTEgU3RyZWFtIDEgSW50ZXJydXB0IFJlcXVlc3QgKi8KKyNkZWZpbmUJTVhWUl9TVEFUX0lSUQkJCTB4MDAwODAwMDAJLyogTVhWUglTdGF0dXMgSW50ZXJydXB0IFJlcXVlc3QgKi8KKyNkZWZpbmUJTVhWUl9DTV9JUlEJCQkweDAwMTAwMDAwCS8qIE1YVlIJQ29udHJvbAlNZXNzYWdlCUludGVycnVwdCBSZXF1ZXN0ICovCisjZGVmaW5lCU1YVlJfQVBfSVJRCQkJMHgwMDIwMDAwMAkvKiBNWFZSCUFzeW5jaHJvbm91cyBQYWNrZXQgSW50ZXJydXB0ICovCisKKy8qIHRoZSBmb2xsb3dpbmcgYXJlIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSAqLworI2RlZmluZQlNRE1BMF9JUlEJCU1ETUExXzBfSVJRCisjZGVmaW5lCU1ETUExX0lSUQkJTURNQTFfMV9JUlEKKworI2lmZGVmIF9NSVNSQV9SVUxFUworI2RlZmluZQlfTUYxNSAweEZ1CisjZGVmaW5lCV9NRjcgN3UKKyNlbHNlCisjZGVmaW5lCV9NRjE1IDB4RgorI2RlZmluZQlfTUY3IDcKKyNlbmRpZiAvKiBfTUlTUkFfUlVMRVMgKi8KKworLyogU0lDX0lNQVNLeCBNYXNrcwkJCQkJCQkJCQkJICovCisjZGVmaW5lCVNJQ19VTk1BU0tfQUxMCTB4MDAwMDAwMDAJCQkJCS8qIFVubWFzayBhbGwgcGVyaXBoZXJhbCBpbnRlcnJ1cHRzICovCisjZGVmaW5lCVNJQ19NQVNLX0FMTAkweEZGRkZGRkZGCQkJCQkvKiBNYXNrCWFsbCBwZXJpcGhlcmFsIGludGVycnVwdHMgKi8KKyNpZmRlZiBfTUlTUkFfUlVMRVMKKyNkZWZpbmUJU0lDX01BU0soeCkJCSgxIDw8ICgoeCkmMHgxRnUpKQkJCQkJLyogTWFzawlQZXJpcGhlcmFsICN4IGludGVycnVwdCAqLworI2RlZmluZQlTSUNfVU5NQVNLKHgpCSgweEZGRkZGRkZGdSBeICgxIDw8ICgoeCkmMHgxRnUpKSkJLyogVW5tYXNrIFBlcmlwaGVyYWwgI3gJaW50ZXJydXB0ICovCisjZWxzZQorI2RlZmluZQlTSUNfTUFTSyh4KQkJKDEgPDwgKCh4KSYweDFGKSkJCQkJCS8qIE1hc2sJUGVyaXBoZXJhbCAjeCBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUJU0lDX1VOTUFTSyh4KQkoMHhGRkZGRkZGRiBeICgxIDw8ICgoeCkmMHgxRikpKQkvKiBVbm1hc2sgUGVyaXBoZXJhbCAjeAlpbnRlcnJ1cHQgKi8KKyNlbmRpZiAvKiBfTUlTUkFfUlVMRVMgKi8KKworLyogU0lDX0lXUnggTWFza3MJCQkJCQkJCQkJCSAqLworI2RlZmluZQlJV1JfRElTQUJMRV9BTEwJMHgwMDAwMDAwMAkJCQkJLyogV2FrZXVwIERpc2FibGUgYWxsIHBlcmlwaGVyYWxzICovCisjZGVmaW5lCUlXUl9FTkFCTEVfQUxMCTB4RkZGRkZGRkYJCQkJCS8qIFdha2V1cCBFbmFibGUgYWxsIHBlcmlwaGVyYWxzICovCisjaWZkZWYgX01JU1JBX1JVTEVTCisjZGVmaW5lCUlXUl9FTkFCTEUoeCkJKDEgPDwgKCh4KSYweDFGdSkpCQkJCQkvKiBXYWtldXAgRW5hYmxlIFBlcmlwaGVyYWwgI3ggKi8KKyNkZWZpbmUJSVdSX0RJU0FCTEUoeCkJKDB4RkZGRkZGRkZ1IF4gKDEgPDwgKCh4KSYweDFGdSkpKQkvKiBXYWtldXAgRGlzYWJsZSBQZXJpcGhlcmFsICN4ICovCisjZWxzZQorI2RlZmluZQlJV1JfRU5BQkxFKHgpCSgxIDw8ICgoeCkmMHgxRikpCQkJCQkvKiBXYWtldXAgRW5hYmxlIFBlcmlwaGVyYWwgI3ggKi8KKyNkZWZpbmUJSVdSX0RJU0FCTEUoeCkJKDB4RkZGRkZGRkYgXiAoMSA8PCAoKHgpJjB4MUYpKSkJLyogV2FrZXVwIERpc2FibGUgUGVyaXBoZXJhbCAjeCAqLworI2VuZGlmIC8qIF9NSVNSQV9SVUxFUyAqLworCisKKy8qICoqKioqKioqKiBXQVRDSERPRyBUSU1FUiBNQVNLUyAqKioqKioqKioqKioqKioqKioqKiAqLworLyogV2F0Y2hkb2cgVGltZXIgV0RPR19DVEwgUmVnaXN0ZXIgTWFza3MgKi8KKyNpZmRlZiBfTUlTUkFfUlVMRVMKKyNkZWZpbmUJV0RFVih4KQkJCSgoKHgpPDwxKSAmIDB4MDAwNnUpCS8qIGV2ZW50IGdlbmVyYXRlZCBvbiByb2xsIG92ZXIgKi8KKyNlbHNlCisjZGVmaW5lCVdERVYoeCkJCQkoKCh4KTw8MSkgJiAweDAwMDYpCS8qIGV2ZW50IGdlbmVyYXRlZCBvbiByb2xsIG92ZXIgKi8KKyNlbmRpZiAvKiBfTUlTUkFfUlVMRVMgKi8KKyNkZWZpbmUJV0RFVl9SRVNFVAkJMHgwMDAwCQkJCS8qIGdlbmVyYXRlIHJlc2V0IGV2ZW50CW9uIHJvbGwJb3ZlciAqLworI2RlZmluZQlXREVWX05NSQkJMHgwMDAyCQkJCS8qIGdlbmVyYXRlIE5NSQlldmVudCBvbiByb2xsIG92ZXIgKi8KKyNkZWZpbmUJV0RFVl9HUEkJCTB4MDAwNAkJCQkvKiBnZW5lcmF0ZSBHUCBJUlEgb24gcm9sbCBvdmVyICovCisjZGVmaW5lCVdERVZfTk9ORQkJMHgwMDA2CQkJCS8qIG5vIGV2ZW50IG9uIHJvbGwgb3ZlciAqLworI2RlZmluZQlXREVOCQkJMHgwRkYwCQkJCS8qIGVuYWJsZSB3YXRjaGRvZyAqLworI2RlZmluZQlXRERJUwkJCTB4MEFEMAkJCQkvKiBkaXNhYmxlIHdhdGNoZG9nICovCisjZGVmaW5lCVdEUk8JCQkweDgwMDAJCQkJLyogd2F0Y2hkb2cgcm9sbGVkIG92ZXIJbGF0Y2ggKi8KKworLyogZGVwcmVjYXRlZCBXRE9HX0NUTCBSZWdpc3RlcglNYXNrcyBmb3IgbGVnYWN5IGNvZGUgKi8KKyNkZWZpbmUJSUNUTCBXREVWCisjZGVmaW5lCUVOQUJMRV9SRVNFVAlXREVWX1JFU0VUCisjZGVmaW5lCVdET0dfUkVTRVQJCVdERVZfUkVTRVQKKyNkZWZpbmUJRU5BQkxFX05NSQkJV0RFVl9OTUkKKyNkZWZpbmUJV0RPR19OTUkJCVdERVZfTk1JCisjZGVmaW5lCUVOQUJMRV9HUEkJCVdERVZfR1BJCisjZGVmaW5lCVdET0dfR1BJCQlXREVWX0dQSQorI2RlZmluZQlESVNBQkxFX0VWVAlXREVWX05PTkUKKyNkZWZpbmUJV0RPR19OT05FCQlXREVWX05PTkUKKworI2RlZmluZQlUTVJfRU4JCQlXREVOCisjZGVmaW5lCVdET0dfRElTQUJMRQkJV0RESVMKKyNkZWZpbmUJVFJPCQkJV0RSTworCisjZGVmaW5lCUlDVExfUDAJCQkweDAxCisjZGVmaW5lCUlDVExfUDEJCQkweDAyCisjZGVmaW5lCVRST19QCQkJMHgwRgorCisKKy8qICoqKioqKioqKioqKioqKiAgUkVBTCBUSU1FIENMT0NLIE1BU0tTICAqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFJUQ19TVEFUIGFuZAlSVENfQUxBUk0gcmVnaXN0ZXIgKi8KKyNkZWZpbmUJUlRTRUMJCTB4MDAwMDAwM0YJLyogUmVhbC1UaW1lIENsb2NrIFNlY29uZHMgKi8KKyNkZWZpbmUJUlRNSU4JCTB4MDAwMDBGQzAJLyogUmVhbC1UaW1lIENsb2NrIE1pbnV0ZXMgKi8KKyNkZWZpbmUJUlRIUgkJMHgwMDAxRjAwMAkvKiBSZWFsLVRpbWUgQ2xvY2sgSG91cnMgKi8KKyNkZWZpbmUJUlREQVkJCTB4RkZGRTAwMDAJLyogUmVhbC1UaW1lIENsb2NrIERheXMgKi8KKworLyogUlRDX0lDVEwgcmVnaXN0ZXIgKi8KKyNkZWZpbmUJU1dJRQkJMHgwMDAxCQkvKiBTdG9wd2F0Y2ggSW50ZXJydXB0IEVuYWJsZSAqLworI2RlZmluZQlBSUUJCQkweDAwMDIJCS8qIEFsYXJtIEludGVycnVwdCBFbmFibGUgKi8KKyNkZWZpbmUJU0lFCQkJMHgwMDA0CQkvKiBTZWNvbmRzICgxIEh6KSBJbnRlcnJ1cHQgRW5hYmxlICovCisjZGVmaW5lCU1JRQkJCTB4MDAwOAkJLyogTWludXRlcyBJbnRlcnJ1cHQgRW5hYmxlICovCisjZGVmaW5lCUhJRQkJCTB4MDAxMAkJLyogSG91cnMgSW50ZXJydXB0IEVuYWJsZSAqLworI2RlZmluZQlESUUJCQkweDAwMjAJCS8qIDI0IEhvdXJzIChEYXlzKSBJbnRlcnJ1cHQgRW5hYmxlICovCisjZGVmaW5lCURBSUUJCTB4MDA0MAkJLyogRGF5IEFsYXJtIChEYXksIEhvdXIsIE1pbnV0ZSwgU2Vjb25kKSBJbnRlcnJ1cHQgRW5hYmxlICovCisjZGVmaW5lCVdDSUUJCTB4ODAwMAkJLyogV3JpdGUgQ29tcGxldGUgSW50ZXJydXB0IEVuYWJsZSAqLworCisvKiBSVENfSVNUQVQgcmVnaXN0ZXIgKi8KKyNkZWZpbmUJU1dFRgkJMHgwMDAxCQkvKiBTdG9wd2F0Y2ggRXZlbnQgRmxhZyAqLworI2RlZmluZQlBRUYJCQkweDAwMDIJCS8qIEFsYXJtIEV2ZW50IEZsYWcgKi8KKyNkZWZpbmUJU0VGCQkJMHgwMDA0CQkvKiBTZWNvbmRzICgxIEh6KSBFdmVudAlGbGFnICovCisjZGVmaW5lCU1FRgkJCTB4MDAwOAkJLyogTWludXRlcyBFdmVudCBGbGFnICovCisjZGVmaW5lCUhFRgkJCTB4MDAxMAkJLyogSG91cnMgRXZlbnQgRmxhZyAqLworI2RlZmluZQlERUYJCQkweDAwMjAJCS8qIDI0IEhvdXJzIChEYXlzKSBFdmVudCBGbGFnICovCisjZGVmaW5lCURBRUYJCTB4MDA0MAkJLyogRGF5IEFsYXJtIChEYXksIEhvdXIsIE1pbnV0ZSwgU2Vjb25kKSBFdmVudCBGbGFnICovCisjZGVmaW5lCVdQUwkJCTB4NDAwMAkJLyogV3JpdGUgUGVuZGluZyBTdGF0dXMJKFJPKSAqLworI2RlZmluZQlXQ09NCQkweDgwMDAJCS8qIFdyaXRlIENvbXBsZXRlICovCisKKy8qIFJUQ19GQVNUIE1hc2sgKFJUQ19QUkVOIE1hc2spICovCisjZGVmaW5lCUVOQUJMRV9QUkVTQ0FMRQkgICAgIDB4MDAwMDAwMDEJIC8qIEVuYWJsZSBwcmVzY2FsZXIgc28JUlRDIHJ1bnMgYXQgMSBIeiAqLworI2RlZmluZQlQUkVOCQkgICAgIDB4MDAwMDAwMDEKKwkJLyogKiogTXVzdCBiZSBzZXQgYWZ0ZXIJcG93ZXItdXAgZm9yIHByb3BlciBvcGVyYXRpb24gb2YgUlRDICovCisKKy8qIERlcHJlY2F0ZWQgUlRDX1NUQVQgYW5kIFJUQ19BTEFSTSBNYXNrcwkJCSAqLworI2RlZmluZQlSVENfU0VDCQkJUlRTRUMJLyogUmVhbC1UaW1lIENsb2NrIFNlY29uZHMgKi8KKyNkZWZpbmUJUlRDX01JTgkJCVJUTUlOCS8qIFJlYWwtVGltZSBDbG9jayBNaW51dGVzICovCisjZGVmaW5lCVJUQ19IUgkJCVJUSFIJLyogUmVhbC1UaW1lIENsb2NrIEhvdXJzICovCisjZGVmaW5lCVJUQ19EQVkJCQlSVERBWQkvKiBSZWFsLVRpbWUgQ2xvY2sgRGF5cyAqLworCisvKiBEZXByZWNhdGVkIFJUQ19JQ1RML1JUQ19JU1RBVCBNYXNrcwkJCQkJCQkJCQkJICovCisjZGVmaW5lCVNUT1BXQVRDSAkJU1dJRQkJLyogU3RvcHdhdGNoIEludGVycnVwdCBFbmFibGUJICovCisjZGVmaW5lCUFMQVJNCQkJQUlFCQkvKiBBbGFybSBJbnRlcnJ1cHQgRW5hYmxlCQkgKi8KKyNkZWZpbmUJU0VDT05ECQkJU0lFCQkvKiBTZWNvbmRzICgxIEh6KSBJbnRlcnJ1cHQgRW5hYmxlICovCisjZGVmaW5lCU1JTlVURQkJCU1JRQkJLyogTWludXRlcyBJbnRlcnJ1cHQgRW5hYmxlCQkgKi8KKyNkZWZpbmUJSE9VUgkJCUhJRQkJLyogSG91cnMgSW50ZXJydXB0IEVuYWJsZQkJICovCisjZGVmaW5lCURBWQkJCQlESUUJCS8qIDI0IEhvdXJzIChEYXlzKSBJbnRlcnJ1cHQgRW5hYmxlICovCisjZGVmaW5lCURBWV9BTEFSTQkJREFJRQkJLyogRGF5IEFsYXJtIChEYXksIEhvdXIsIE1pbnV0ZSwgU2Vjb25kKSBJbnRlcnJ1cHQgRW5hYmxlICovCisjZGVmaW5lCVdSSVRFX0NPTVBMRVRFCVdDSUUJCS8qIFdyaXRlIENvbXBsZXRlIEludGVycnVwdCBFbmFibGUgKi8KKworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBVQVJUIENPTlRST0xMRVIgTUFTS1MgKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogVUFSVHhfTENSIFJlZ2lzdGVyICovCisjaWZkZWYgX01JU1JBX1JVTEVTCisjZGVmaW5lCVdMUyh4KQkJKCgoeCktNXUpICYgMHgwM3UpCS8qIFdvcmQJTGVuZ3RoIFNlbGVjdCAqLworI2Vsc2UKKyNkZWZpbmUJV0xTKHgpCQkoKCh4KS01KSAmIDB4MDMpCS8qIFdvcmQJTGVuZ3RoIFNlbGVjdCAqLworI2VuZGlmIC8qIF9NSVNSQV9SVUxFUyAqLworI2RlZmluZQlTVEIJCQkweDA0CQkJCS8qIFN0b3AJQml0cyAqLworI2RlZmluZQlQRU4JCQkweDA4CQkJCS8qIFBhcml0eSBFbmFibGUgKi8KKyNkZWZpbmUJRVBTCQkJMHgxMAkJCQkvKiBFdmVuCVBhcml0eSBTZWxlY3QgKi8KKyNkZWZpbmUJU1RQCQkJMHgyMAkJCQkvKiBTdGljayBQYXJpdHkgKi8KKyNkZWZpbmUJU0IJCQkweDQwCQkJCS8qIFNldCBCcmVhayAqLworI2RlZmluZQlETEFCCQkweDgwCQkJCS8qIERpdmlzb3IgTGF0Y2ggQWNjZXNzICovCisKKyNkZWZpbmUJRExBQl9QCQkweDA3CisjZGVmaW5lCVNCX1AJCTB4MDYKKyNkZWZpbmUJU1RQX1AJCTB4MDUKKyNkZWZpbmUJRVBTX1AJCTB4MDQKKyNkZWZpbmUJUEVOX1AJCTB4MDMKKyNkZWZpbmUJU1RCX1AJCTB4MDIKKyNkZWZpbmUJV0xTX1AxCQkweDAxCisjZGVmaW5lCVdMU19QMAkJMHgwMAorCisvKiBVQVJUeF9NQ1IgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTE9PUF9FTkEJMHgxMAkvKiBMb29wYmFjayBNb2RlIEVuYWJsZSAqLworI2RlZmluZQlMT09QX0VOQV9QCTB4MDQKKy8qIERlcHJlY2F0ZWQgVUFSVHhfTUNSCU1hc2sJCQkgKi8KKworLyogVUFSVHhfTFNSIFJlZ2lzdGVyICovCisjZGVmaW5lCURSCQkJMHgwMQkvKiBEYXRhCVJlYWR5ICovCisjZGVmaW5lCU9FCQkJMHgwMgkvKiBPdmVycnVuIEVycm9yICovCisjZGVmaW5lCVBFCQkJMHgwNAkvKiBQYXJpdHkgRXJyb3IgKi8KKyNkZWZpbmUJRkUJCQkweDA4CS8qIEZyYW1pbmcgRXJyb3IgKi8KKyNkZWZpbmUJQkkJCQkweDEwCS8qIEJyZWFrIEludGVycnVwdCAqLworI2RlZmluZQlUSFJFCQkweDIwCS8qIFRIUiBFbXB0eSAqLworI2RlZmluZQlURU1UCQkweDQwCS8qIFRTUiBhbmQgVUFSVF9USFIgRW1wdHkgKi8KKworI2RlZmluZQlURU1QX1AJCTB4MDYKKyNkZWZpbmUJVEhSRV9QCQkweDA1CisjZGVmaW5lCUJJX1AJCTB4MDQKKyNkZWZpbmUJRkVfUAkJMHgwMworI2RlZmluZQlQRV9QCQkweDAyCisjZGVmaW5lCU9FX1AJCTB4MDEKKyNkZWZpbmUJRFJfUAkJMHgwMAorCisvKiBVQVJUeF9JRVIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRVJCRkkJCTB4MDEJCS8qIEVuYWJsZSBSZWNlaXZlIEJ1ZmZlciBGdWxsIEludGVycnVwdCAqLworI2RlZmluZQlFVEJFSQkJMHgwMgkJLyogRW5hYmxlIFRyYW5zbWl0IEJ1ZmZlciBFbXB0eQlJbnRlcnJ1cHQgKi8KKyNkZWZpbmUJRUxTSQkJMHgwNAkJLyogRW5hYmxlIFJYIFN0YXR1cyBJbnRlcnJ1cHQgKi8KKworI2RlZmluZQlFTFNJX1AJCTB4MDIKKyNkZWZpbmUJRVRCRUlfUAkJMHgwMQorI2RlZmluZQlFUkJGSV9QCQkweDAwCisKKy8qIFVBUlR4X0lJUiBSZWdpc3RlciAqLworI2RlZmluZQlOSU5UCQkweDAxCisjZGVmaW5lCVNUQVRVU19QMQkweDAyCisjZGVmaW5lCVNUQVRVU19QMAkweDAxCisjZGVmaW5lCU5JTlRfUAkJMHgwMAorCisvKiBVQVJUeF9HQ1RMIFJlZ2lzdGVyICovCisjZGVmaW5lCVVDRU4JCTB4MDEJCS8qIEVuYWJsZSBVQVJUeAlDbG9ja3MgKi8KKyNkZWZpbmUJSVJFTgkJMHgwMgkJLyogRW5hYmxlIElyREEgTW9kZSAqLworI2RlZmluZQlUUE9MQwkJMHgwNAkJLyogSXJEQQlUWCBQb2xhcml0eSBDaGFuZ2UgKi8KKyNkZWZpbmUJUlBPTEMJCTB4MDgJCS8qIElyREEJUlggUG9sYXJpdHkgQ2hhbmdlICovCisjZGVmaW5lCUZQRQkJCTB4MTAJCS8qIEZvcmNlIFBhcml0eQlFcnJvciBPbiBUcmFuc21pdCAqLworI2RlZmluZQlGRkUJCQkweDIwCQkvKiBGb3JjZSBGcmFtaW5nIEVycm9yIE9uIFRyYW5zbWl0ICovCisKKyNkZWZpbmUJRkZFX1AJCTB4MDUKKyNkZWZpbmUJRlBFX1AJCTB4MDQKKyNkZWZpbmUJUlBPTENfUAkJMHgwMworI2RlZmluZQlUUE9MQ19QCQkweDAyCisjZGVmaW5lCUlSRU5fUAkJMHgwMQorI2RlZmluZQlVQ0VOX1AJCTB4MDAKKworCisvKiAqKioqKioqKioqICBTRVJJQUwgUE9SVCBNQVNLUyAgKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogU1BPUlR4X1RDUjEgTWFza3MgKi8KKyNkZWZpbmUJVFNQRU4JCTB4MDAwMQkvKiBUWCBlbmFibGUgICovCisjZGVmaW5lCUlUQ0xLCQkweDAwMDIJLyogSW50ZXJuYWwgVFggQ2xvY2sgU2VsZWN0ICAqLworI2RlZmluZQlURFRZUEUJCTB4MDAwQwkvKiBUWCBEYXRhIEZvcm1hdHRpbmcgU2VsZWN0ICovCisjZGVmaW5lCURUWVBFX05PUk0JMHgwMDAwCQkvKiBEYXRhCUZvcm1hdCBOb3JtYWwgKi8KKyNkZWZpbmUJRFRZUEVfVUxBVwkweDAwMDgJCS8qIENvbXBhbmQgVXNpbmcgdS1MYXcgKi8KKyNkZWZpbmUJRFRZUEVfQUxBVwkweDAwMEMJCS8qIENvbXBhbmQgVXNpbmcgQS1MYXcgKi8KKyNkZWZpbmUJVExTQklUCQkweDAwMTAJLyogVFggQml0IE9yZGVyICovCisjZGVmaW5lCUlURlMJCTB4MDIwMAkvKiBJbnRlcm5hbCBUWCBGcmFtZSBTeW5jIFNlbGVjdCAgKi8KKyNkZWZpbmUJVEZTUgkJMHgwNDAwCS8qIFRYIEZyYW1lIFN5bmMgUmVxdWlyZWQgU2VsZWN0ICAqLworI2RlZmluZQlESVRGUwkJMHgwODAwCS8qIERhdGEJSW5kZXBlbmRlbnQgVFggRnJhbWUgU3luYyBTZWxlY3QgICovCisjZGVmaW5lCUxURlMJCTB4MTAwMAkvKiBMb3cgVFggRnJhbWUJU3luYyBTZWxlY3QgICovCisjZGVmaW5lCUxBVEZTCQkweDIwMDAJLyogTGF0ZQlUWCBGcmFtZSBTeW5jIFNlbGVjdCAgKi8KKyNkZWZpbmUJVENLRkUJCTB4NDAwMAkvKiBUWCBDbG9jayBGYWxsaW5nIEVkZ2UgU2VsZWN0ICovCisvKiBTUE9SVHhfUkNSMSBEZXByZWNhdGVkIE1hc2tzCQkJCQkJCQkgKi8KKyNkZWZpbmUJVFVMQVcJCURUWVBFX1VMQVcJCS8qIENvbXBhbmQgVXNpbmcgdS1MYXcgKi8KKyNkZWZpbmUJVEFMQVcJCURUWVBFX0FMQVcJCQkvKiBDb21wYW5kIFVzaW5nIEEtTGF3ICovCisKKy8qIFNQT1JUeF9UQ1IyIE1hc2tzICovCisjaWZkZWYgX01JU1JBX1JVTEVTCisjZGVmaW5lCVNMRU4oeCkJCSgoeCkmMHgxRnUpCS8qIFNQT1JUIFRYIFdvcmQgTGVuZ3RoCSgyIC0gMzEpICovCisjZWxzZQorI2RlZmluZQlTTEVOKHgpCQkoKHgpJjB4MUYpCS8qIFNQT1JUIFRYIFdvcmQgTGVuZ3RoCSgyIC0gMzEpICovCisjZW5kaWYgLyogX01JU1JBX1JVTEVTICovCisjZGVmaW5lCVRYU0UJCTB4MDEwMAkvKlRYIFNlY29uZGFyeSBFbmFibGUgKi8KKyNkZWZpbmUJVFNGU0UJCTB4MDIwMAkvKlRYIFN0ZXJlbyBGcmFtZSBTeW5jIEVuYWJsZSAqLworI2RlZmluZQlUUkZTVAkJMHgwNDAwCS8qVFggUmlnaHQtRmlyc3QgRGF0YSBPcmRlciAgKi8KKworLyogU1BPUlR4X1JDUjEgTWFza3MgKi8KKyNkZWZpbmUJUlNQRU4JCTB4MDAwMQkvKiBSWCBlbmFibGUgICovCisjZGVmaW5lCUlSQ0xLCQkweDAwMDIJLyogSW50ZXJuYWwgUlggQ2xvY2sgU2VsZWN0ICAqLworI2RlZmluZQlSRFRZUEUJCTB4MDAwQwkvKiBSWCBEYXRhIEZvcm1hdHRpbmcgU2VsZWN0ICovCisjZGVmaW5lCURUWVBFX05PUk0JMHgwMDAwCQkvKiBubyBjb21wYW5kaW5nICovCisjZGVmaW5lCURUWVBFX1VMQVcJMHgwMDA4CQkvKiBDb21wYW5kIFVzaW5nIHUtTGF3ICovCisjZGVmaW5lCURUWVBFX0FMQVcJMHgwMDBDCQkvKiBDb21wYW5kIFVzaW5nIEEtTGF3ICovCisjZGVmaW5lCVJMU0JJVAkJMHgwMDEwCS8qIFJYIEJpdCBPcmRlciAqLworI2RlZmluZQlJUkZTCQkweDAyMDAJLyogSW50ZXJuYWwgUlggRnJhbWUgU3luYyBTZWxlY3QgICovCisjZGVmaW5lCVJGU1IJCTB4MDQwMAkvKiBSWCBGcmFtZSBTeW5jIFJlcXVpcmVkIFNlbGVjdCAgKi8KKyNkZWZpbmUJTFJGUwkJMHgxMDAwCS8qIExvdyBSWCBGcmFtZQlTeW5jIFNlbGVjdCAgKi8KKyNkZWZpbmUJTEFSRlMJCTB4MjAwMAkvKiBMYXRlCVJYIEZyYW1lIFN5bmMgU2VsZWN0ICAqLworI2RlZmluZQlSQ0tGRQkJMHg0MDAwCS8qIFJYIENsb2NrIEZhbGxpbmcgRWRnZSBTZWxlY3QgKi8KKy8qIFNQT1JUeF9SQ1IxIERlcHJlY2F0ZWQgTWFza3MJCQkJCQkJCSAqLworI2RlZmluZQlSVUxBVwkJRFRZUEVfVUxBVwkJLyogQ29tcGFuZCBVc2luZyB1LUxhdyAqLworI2RlZmluZQlSQUxBVwkJRFRZUEVfQUxBVwkJCS8qIENvbXBhbmQgVXNpbmcgQS1MYXcgKi8KKworLyogU1BPUlR4X1JDUjIgTWFza3MgKi8KKyNpZmRlZiBfTUlTUkFfUlVMRVMKKyNkZWZpbmUJU0xFTih4KQkJKCh4KSYweDFGdSkJLyogU1BPUlQgUlggV29yZCBMZW5ndGgJKDIgLSAzMSkgKi8KKyNlbHNlCisjZGVmaW5lCVNMRU4oeCkJCSgoeCkmMHgxRikJLyogU1BPUlQgUlggV29yZCBMZW5ndGgJKDIgLSAzMSkgKi8KKyNlbmRpZiAvKiBfTUlTUkFfUlVMRVMgKi8KKyNkZWZpbmUJUlhTRQkJMHgwMTAwCS8qUlggU2Vjb25kYXJ5IEVuYWJsZSAqLworI2RlZmluZQlSU0ZTRQkJMHgwMjAwCS8qUlggU3RlcmVvIEZyYW1lIFN5bmMgRW5hYmxlICovCisjZGVmaW5lCVJSRlNUCQkweDA0MDAJLypSaWdodC1GaXJzdCBEYXRhIE9yZGVyICAqLworCisvKlNQT1JUeF9TVEFUIE1hc2tzICovCisjZGVmaW5lCVJYTkUJCTB4MDAwMQkJLypSWCBGSUZPIE5vdCBFbXB0eSBTdGF0dXMgKi8KKyNkZWZpbmUJUlVWRgkJMHgwMDAyCQkvKlJYIFVuZGVyZmxvdyBTdGF0dXMgKi8KKyNkZWZpbmUJUk9WRgkJMHgwMDA0CQkvKlJYIE92ZXJmbG93IFN0YXR1cyAqLworI2RlZmluZQlUWEYJCQkweDAwMDgJCS8qVFggRklGTyBGdWxsIFN0YXR1cyAqLworI2RlZmluZQlUVVZGCQkweDAwMTAJCS8qVFggVW5kZXJmbG93IFN0YXR1cyAqLworI2RlZmluZQlUT1ZGCQkweDAwMjAJCS8qVFggT3ZlcmZsb3cgU3RhdHVzICovCisjZGVmaW5lCVRYSFJFCQkweDAwNDAJCS8qVFggSG9sZCBSZWdpc3RlciBFbXB0eSAqLworCisvKlNQT1JUeF9NQ01DMSBNYXNrcyAqLworI2RlZmluZQlXT0ZGCQkJMHgwMDAwMDNGRgkvKk11bHRpY2hhbm5lbCBXaW5kb3cgT2Zmc2V0IEZpZWxkICovCisvKiBTUE9SVHhfTUNNQzEJTWFjcm9zCQkJCQkJCQkgKi8KKyNpZmRlZiBfTUlTUkFfUlVMRVMKKyNkZWZpbmUJU0VUX1dPRkYoeCkJCSgoeCkgJiAweDNGRnUpCS8qIE11bHRpY2hhbm5lbAlXaW5kb3cgT2Zmc2V0IEZpZWxkICovCisvKiBPbmx5CXVzZSBTRVRfV1NJWkUgTWFjcm8gV2l0aCBMb2dpYyBPUiBXaGlsZQlTZXR0aW5nCUxvd2VyIE9yZGVyIEJpdHMgKi8KKyNkZWZpbmUJU0VUX1dTSVpFKHgpCSgoKCgoeCk+PjB4MyktMXUpJjB4RnUpCTw8IDB4QykJLyogTXVsdGljaGFubmVsCVdpbmRvdyBTaXplID0gKHgvOCktMSAqLworI2Vsc2UKKyNkZWZpbmUJU0VUX1dPRkYoeCkJCSgoeCkgJiAweDNGRikJLyogTXVsdGljaGFubmVsCVdpbmRvdyBPZmZzZXQgRmllbGQgKi8KKy8qIE9ubHkJdXNlIFNFVF9XU0laRSBNYWNybyBXaXRoIExvZ2ljIE9SIFdoaWxlCVNldHRpbmcJTG93ZXIgT3JkZXIgQml0cyAqLworI2RlZmluZQlTRVRfV1NJWkUoeCkJKCgoKCh4KT4+MHgzKS0xKSYweEYpIDw8IDB4QykJLyogTXVsdGljaGFubmVsCVdpbmRvdyBTaXplID0gKHgvOCktMSAqLworI2VuZGlmIC8qIF9NSVNSQV9SVUxFUyAqLworCisKKy8qU1BPUlR4X01DTUMyIE1hc2tzICovCisjZGVmaW5lCU1DQ1JNCQkweDAwMDMJLypNdWx0aWNoYW5uZWwgQ2xvY2sgUmVjb3ZlcnkgTW9kZSAqLworI2RlZmluZQlSRUNfQllQQVNTCTB4MDAwMAkJLyogQnlwYXNzIE1vZGUgKE5vIENsb2NrIFJlY292ZXJ5KSAqLworI2RlZmluZQlSRUNfMkZST000CTB4MDAwMgkJLyogUmVjb3ZlciAyIE1IeiBDbG9jayBmcm9tIDQgTUh6IENsb2NrICovCisjZGVmaW5lCVJFQ184RlJPTTE2CTB4MDAwMwkJLyogUmVjb3ZlciA4IE1IeiBDbG9jayBmcm9tIDE2IE1IeiBDbG9jayAqLworI2RlZmluZQlNQ0RUWFBFCQkweDAwMDQJLypNdWx0aWNoYW5uZWwgRE1BIFRyYW5zbWl0IFBhY2tpbmcgKi8KKyNkZWZpbmUJTUNEUlhQRQkJMHgwMDA4CS8qTXVsdGljaGFubmVsIERNQSBSZWNlaXZlIFBhY2tpbmcgKi8KKyNkZWZpbmUJTUNNRU4JCTB4MDAxMAkvKk11bHRpY2hhbm5lbCBGcmFtZSBNb2RlIEVuYWJsZSAqLworI2RlZmluZQlGU0RSCQkweDAwODAJLypNdWx0aWNoYW5uZWwgRnJhbWUgU3luYyB0byBEYXRhIFJlbGF0aW9uc2hpcCAqLworI2RlZmluZQlNRkQJCQkweEYwMDAJLypNdWx0aWNoYW5uZWwgRnJhbWUgRGVsYXkgICAgKi8KKyNkZWZpbmUJTUZEXzAJCTB4MDAwMAkJLyogTXVsdGljaGFubmVsCUZyYW1lIERlbGF5ID0gMCAqLworI2RlZmluZQlNRkRfMQkJMHgxMDAwCQkvKiBNdWx0aWNoYW5uZWwJRnJhbWUgRGVsYXkgPSAxICovCisjZGVmaW5lCU1GRF8yCQkweDIwMDAJCS8qIE11bHRpY2hhbm5lbAlGcmFtZSBEZWxheSA9IDIgKi8KKyNkZWZpbmUJTUZEXzMJCTB4MzAwMAkJLyogTXVsdGljaGFubmVsCUZyYW1lIERlbGF5ID0gMyAqLworI2RlZmluZQlNRkRfNAkJMHg0MDAwCQkvKiBNdWx0aWNoYW5uZWwJRnJhbWUgRGVsYXkgPSA0ICovCisjZGVmaW5lCU1GRF81CQkweDUwMDAJCS8qIE11bHRpY2hhbm5lbAlGcmFtZSBEZWxheSA9IDUgKi8KKyNkZWZpbmUJTUZEXzYJCTB4NjAwMAkJLyogTXVsdGljaGFubmVsCUZyYW1lIERlbGF5ID0gNiAqLworI2RlZmluZQlNRkRfNwkJMHg3MDAwCQkvKiBNdWx0aWNoYW5uZWwJRnJhbWUgRGVsYXkgPSA3ICovCisjZGVmaW5lCU1GRF84CQkweDgwMDAJCS8qIE11bHRpY2hhbm5lbAlGcmFtZSBEZWxheSA9IDggKi8KKyNkZWZpbmUJTUZEXzkJCTB4OTAwMAkJLyogTXVsdGljaGFubmVsCUZyYW1lIERlbGF5ID0gOSAqLworI2RlZmluZQlNRkRfMTAJCTB4QTAwMAkJLyogTXVsdGljaGFubmVsCUZyYW1lIERlbGF5ID0gMTAgKi8KKyNkZWZpbmUJTUZEXzExCQkweEIwMDAJCS8qIE11bHRpY2hhbm5lbAlGcmFtZSBEZWxheSA9IDExICovCisjZGVmaW5lCU1GRF8xMgkJMHhDMDAwCQkvKiBNdWx0aWNoYW5uZWwJRnJhbWUgRGVsYXkgPSAxMiAqLworI2RlZmluZQlNRkRfMTMJCTB4RDAwMAkJLyogTXVsdGljaGFubmVsCUZyYW1lIERlbGF5ID0gMTMgKi8KKyNkZWZpbmUJTUZEXzE0CQkweEUwMDAJCS8qIE11bHRpY2hhbm5lbAlGcmFtZSBEZWxheSA9IDE0ICovCisjZGVmaW5lCU1GRF8xNQkJMHhGMDAwCQkvKiBNdWx0aWNoYW5uZWwJRnJhbWUgRGVsYXkgPSAxNSAqLworCisKKy8qICAqKioqKioqKiogIFBBUkFMTEVMCVBFUklQSEVSQUwgSU5URVJGQUNFIChQUEkpIE1BU0tTICoqKioqKioqKioqKioqKiogICAqLworLyogIFBQSV9DT05UUk9MCU1hc2tzCSAgICAgICovCisjZGVmaW5lCVBPUlRfRU4JCTB4MDAwMQkvKiBQUEkgUG9ydCBFbmFibGUgICovCisjZGVmaW5lCVBPUlRfRElSCTB4MDAwMgkvKiBQUEkgUG9ydCBEaXJlY3Rpb24JICAgICovCisjZGVmaW5lCVhGUl9UWVBFCTB4MDAwQwkvKiBQUEkgVHJhbnNmZXIJVHlwZSAgKi8KKyNkZWZpbmUJUE9SVF9DRkcJMHgwMDMwCS8qIFBQSSBQb3J0IENvbmZpZ3VyYXRpb24gKi8KKyNkZWZpbmUJRkxEX1NFTAkJMHgwMDQwCS8qIFBQSSBBY3RpdmUgRmllbGQgU2VsZWN0ICovCisjZGVmaW5lCVBBQ0tfRU4JCTB4MDA4MAkvKiBQUEkgUGFja2luZyBNb2RlICovCisvKiBwcmV2aW91cyB2ZXJzaW9ucyBvZglkZWZCRjUzOS5oIGVycm9uZW91c2x5IGluY2x1ZGVkCURNQTMyIChQUEkgMzItYml0IERNQSBFbmFibGUpICovCisjZGVmaW5lCVNLSVBfRU4JCTB4MDIwMAkvKiBQUEkgU2tpcCBFbGVtZW50IEVuYWJsZSAqLworI2RlZmluZQlTS0lQX0VPCQkweDA0MDAJLyogUFBJIFNraXAgRXZlbi9PZGQgRWxlbWVudHMgKi8KKyNkZWZpbmUJRExFTkdUSAkJMHgzODAwCS8qIFBQSSBEYXRhIExlbmd0aCAgKi8KKyNkZWZpbmUJRExFTl84CQkweDAJICAgICAvKglQUEkgRGF0YSBMZW5ndGgJbWFzayBmb3IgRExFTj04ICovCisjZGVmaW5lCURMRU5fMTAJCTB4MDgwMAkJLyogRGF0YQlMZW5ndGggPSAxMCBCaXRzICovCisjZGVmaW5lCURMRU5fMTEJCTB4MTAwMAkJLyogRGF0YQlMZW5ndGggPSAxMSBCaXRzICovCisjZGVmaW5lCURMRU5fMTIJCTB4MTgwMAkJLyogRGF0YQlMZW5ndGggPSAxMiBCaXRzICovCisjZGVmaW5lCURMRU5fMTMJCTB4MjAwMAkJLyogRGF0YQlMZW5ndGggPSAxMyBCaXRzICovCisjZGVmaW5lCURMRU5fMTQJCTB4MjgwMAkJLyogRGF0YQlMZW5ndGggPSAxNCBCaXRzICovCisjZGVmaW5lCURMRU5fMTUJCTB4MzAwMAkJLyogRGF0YQlMZW5ndGggPSAxNSBCaXRzICovCisjZGVmaW5lCURMRU5fMTYJCTB4MzgwMAkJLyogRGF0YQlMZW5ndGggPSAxNiBCaXRzICovCisjaWZkZWYgX01JU1JBX1JVTEVTCisjZGVmaW5lCURMRU4oeCkJCSgoKCh4KS05dSkgJiAweDA3dSkgPDwgMTEpICAvKiBQUEkgRGF0YQlMZW5ndGggKG9ubHkgd29ya3MgZm9yIHg9MTAtLT54PTE2KSAqLworI2Vsc2UKKyNkZWZpbmUJRExFTih4KQkJKCgoKHgpLTkpICYgMHgwNykgPDwgMTEpICAvKiBQUEkgRGF0YSBMZW5ndGggKG9ubHkgd29ya3MgZm9yIHg9MTAtLT54PTE2KSAqLworI2VuZGlmIC8qIF9NSVNSQV9SVUxFUyAqLworI2RlZmluZQlQT0wJCQkweEMwMDAJLyogUFBJIFNpZ25hbCBQb2xhcml0aWVzICAgICAgICovCisjZGVmaW5lCVBPTEMJCTB4NDAwMAkJLyogUFBJIENsb2NrIFBvbGFyaXR5ICovCisjZGVmaW5lCVBPTFMJCTB4ODAwMAkJLyogUFBJIEZyYW1lIFN5bmMgUG9sYXJpdHkgKi8KKworCisvKiBQUElfU1RBVFVTIE1hc2tzCQkJCQkgICAgICovCisjZGVmaW5lCUZMRAkJCTB4MDQwMAkvKiBGaWVsZCBJbmRpY2F0b3IgICAqLworI2RlZmluZQlGVF9FUlIJCTB4MDgwMAkvKiBGcmFtZSBUcmFjayBFcnJvciAqLworI2RlZmluZQlPVlIJCQkweDEwMDAJLyogRklGTwlPdmVyZmxvdyBFcnJvciAqLworI2RlZmluZQlVTkRSCQkweDIwMDAJLyogRklGTwlVbmRlcnJ1biBFcnJvciAqLworI2RlZmluZQlFUlJfREVUCQkweDQwMDAJLyogRXJyb3IgRGV0ZWN0ZWQgSW5kaWNhdG9yICovCisjZGVmaW5lCUVSUl9OQ09SCTB4ODAwMAkvKiBFcnJvciBOb3QgQ29ycmVjdGVkIEluZGljYXRvciAqLworCisKKy8qICoqKioqKioqKiogIERNQSBDT05UUk9MTEVSIE1BU0tTICAqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIERNQXhfQ09ORklHLAlNRE1BX3l5X0NPTkZJRyBNYXNrcyAqLworI2RlZmluZQlETUFFTgkJMHgwMDAxCS8qIENoYW5uZWwgRW5hYmxlICovCisjZGVmaW5lCVdOUgkJCTB4MDAwMgkvKiBDaGFubmVsIERpcmVjdGlvbiAoVy9SKikgKi8KKyNkZWZpbmUJV0RTSVpFXzgJMHgwMDAwCS8qIFdvcmQJU2l6ZSA4IGJpdHMgKi8KKyNkZWZpbmUJV0RTSVpFXzE2CTB4MDAwNAkvKiBXb3JkCVNpemUgMTYJYml0cyAqLworI2RlZmluZQlXRFNJWkVfMzIJMHgwMDA4CS8qIFdvcmQJU2l6ZSAzMgliaXRzICovCisjZGVmaW5lCURNQTJECQkweDAwMTAJLyogMkQvMUQqIE1vZGUgKi8KKyNkZWZpbmUJUkVTVEFSVAkJMHgwMDIwCS8qIFJlc3RhcnQgKi8KKyNkZWZpbmUJRElfU0VMCQkweDAwNDAJLyogRGF0YQlJbnRlcnJ1cHQgU2VsZWN0ICovCisjZGVmaW5lCURJX0VOCQkweDAwODAJLyogRGF0YQlJbnRlcnJ1cHQgRW5hYmxlICovCisjZGVmaW5lCU5EU0laRQkJMHgwOTAwCS8qIE5leHQJRGVzY3JpcHRvciBTaXplICovCisjZGVmaW5lCU5EU0laRV8wCTB4MDAwMAkvKiBOZXh0CURlc2NyaXB0b3IgU2l6ZQk9IDAgKFN0b3AvQXV0b2J1ZmZlcikgKi8KKyNkZWZpbmUJTkRTSVpFXzEJMHgwMTAwCS8qIE5leHQJRGVzY3JpcHRvciBTaXplCT0gMSAqLworI2RlZmluZQlORFNJWkVfMgkweDAyMDAJLyogTmV4dAlEZXNjcmlwdG9yIFNpemUJPSAyICovCisjZGVmaW5lCU5EU0laRV8zCTB4MDMwMAkvKiBOZXh0CURlc2NyaXB0b3IgU2l6ZQk9IDMgKi8KKyNkZWZpbmUJTkRTSVpFXzQJMHgwNDAwCS8qIE5leHQJRGVzY3JpcHRvciBTaXplCT0gNCAqLworI2RlZmluZQlORFNJWkVfNQkweDA1MDAJLyogTmV4dAlEZXNjcmlwdG9yIFNpemUJPSA1ICovCisjZGVmaW5lCU5EU0laRV82CTB4MDYwMAkvKiBOZXh0CURlc2NyaXB0b3IgU2l6ZQk9IDYgKi8KKyNkZWZpbmUJTkRTSVpFXzcJMHgwNzAwCS8qIE5leHQJRGVzY3JpcHRvciBTaXplCT0gNyAqLworI2RlZmluZQlORFNJWkVfOAkweDA4MDAJLyogTmV4dAlEZXNjcmlwdG9yIFNpemUJPSA4ICovCisjZGVmaW5lCU5EU0laRV85CTB4MDkwMAkvKiBOZXh0CURlc2NyaXB0b3IgU2l6ZQk9IDkgKi8KKworI2RlZmluZSBETUFGTE9XCQkJMHg3MDAwCS8qIEZsb3cgQ29udHJvbCAqLworI2RlZmluZSBETUFGTE9XX1NUT1AJCTB4MDAwMAkvKiBTdG9wIE1vZGUgKi8KKyNkZWZpbmUgRE1BRkxPV19BVVRPCQkweDEwMDAJLyogQXV0b2J1ZmZlciBNb2RlICovCisjZGVmaW5lIERNQUZMT1dfQVJSQVkJCTB4NDAwMAkvKiBEZXNjcmlwdG9yIEFycmF5IE1vZGUgKi8KKyNkZWZpbmUgRE1BRkxPV19TTUFMTAkJMHg2MDAwCS8qIFNtYWxsIE1vZGVsIERlc2NyaXB0b3IgTGlzdCBNb2RlICovCisjZGVmaW5lIERNQUZMT1dfTEFSR0UJCTB4NzAwMAkvKiBMYXJnZSBNb2RlbCBEZXNjcmlwdG9yIExpc3QgTW9kZSAqLworCisjZGVmaW5lCURNQUVOX1AJCTB4MAkJLyogQ2hhbm5lbCBFbmFibGUgKi8KKyNkZWZpbmUJV05SX1AJCTB4MQkJLyogQ2hhbm5lbCBEaXJlY3Rpb24gKFcvUiopICovCisjZGVmaW5lCURNQTJEX1AJCTB4NAkJLyogMkQvMUQqIE1vZGUgKi8KKyNkZWZpbmUJUkVTVEFSVF9QCTB4NQkJLyogUmVzdGFydCAqLworI2RlZmluZQlESV9TRUxfUAkweDYJCS8qIERhdGEJSW50ZXJydXB0IFNlbGVjdCAqLworI2RlZmluZQlESV9FTl9QCQkweDcJCS8qIERhdGEJSW50ZXJydXB0IEVuYWJsZSAqLworCisvKiBETUF4X0lSUV9TVEFUVVMsIE1ETUFfeXlfSVJRX1NUQVRVUyBNYXNrcyAqLworI2RlZmluZQlETUFfRE9ORQkweDAwMDEJLyogRE1BIERvbmUgSW5kaWNhdG9yICovCisjZGVmaW5lCURNQV9FUlIJCTB4MDAwMgkvKiBETUEgRXJyb3IgSW5kaWNhdG9yICovCisjZGVmaW5lCURGRVRDSAkJMHgwMDA0CS8qIERlc2NyaXB0b3IgRmV0Y2ggSW5kaWNhdG9yICovCisjZGVmaW5lCURNQV9SVU4JCTB4MDAwOAkvKiBETUEgUnVubmluZyBJbmRpY2F0b3IgKi8KKworI2RlZmluZQlETUFfRE9ORV9QCTB4MAkJLyogRE1BIERvbmUgSW5kaWNhdG9yICovCisjZGVmaW5lCURNQV9FUlJfUAkweDEJCS8qIERNQSBFcnJvciBJbmRpY2F0b3IgKi8KKyNkZWZpbmUJREZFVENIX1AJMHgyCQkvKiBEZXNjcmlwdG9yIEZldGNoIEluZGljYXRvciAqLworI2RlZmluZQlETUFfUlVOX1AJMHgzCQkvKiBETUEgUnVubmluZyBJbmRpY2F0b3IgKi8KKworLyogRE1BeF9QRVJJUEhFUkFMX01BUCwJTURNQV95eV9QRVJJUEhFUkFMX01BUCBNYXNrcyAqLworCisjZGVmaW5lCUNUWVBFCQkJMHgwMDQwCS8qIERNQSBDaGFubmVsIFR5cGUgSW5kaWNhdG9yICovCisjZGVmaW5lCUNUWVBFX1AJCQkweDYJCS8qIERNQSBDaGFubmVsIFR5cGUgSW5kaWNhdG9yIEJJVCBQT1NJVElPTiAqLworI2RlZmluZQlQQ0FQOAkJCTB4MDA4MAkvKiBETUEgOC1iaXQgT3BlcmF0aW9uIEluZGljYXRvciAgICovCisjZGVmaW5lCVBDQVAxNgkJCTB4MDEwMAkvKiBETUEgMTYtYml0IE9wZXJhdGlvbglJbmRpY2F0b3IgKi8KKyNkZWZpbmUJUENBUDMyCQkJMHgwMjAwCS8qIERNQSAzMi1iaXQgT3BlcmF0aW9uCUluZGljYXRvciAqLworI2RlZmluZQlQQ0FQV1IJCQkweDA0MDAJLyogRE1BIFdyaXRlIE9wZXJhdGlvbiBJbmRpY2F0b3IgKi8KKyNkZWZpbmUJUENBUFJECQkJMHgwODAwCS8qIERNQSBSZWFkIE9wZXJhdGlvbiBJbmRpY2F0b3IgKi8KKyNkZWZpbmUJUE1BUAkJCTB4RjAwMAkvKiBETUEgUGVyaXBoZXJhbCBNYXAgRmllbGQgKi8KKworLyogUE1BUAlFbmNvZGluZ3MgRm9yIERNQSBDb250cm9sbGVyIDAgKi8KKyNkZWZpbmUJUE1BUF9QUEkJCTB4MDAwMAkvKiBQTUFQCVBQSSBQb3J0IERNQSAqLworI2RlZmluZQlQTUFQX1NQT1JUMFJYCTB4MTAwMAkvKiBQTUFQCVNQT1JUMCBSZWNlaXZlIERNQSAqLworI2RlZmluZQlQTUFQX1NQT1JUMFRYCTB4MjAwMAkvKiBQTUFQCVNQT1JUMCBUcmFuc21pdAlETUEgKi8KKyNkZWZpbmUJUE1BUF9TUE9SVDFSWAkweDMwMDAJLyogUE1BUAlTUE9SVDEgUmVjZWl2ZSBETUEgKi8KKyNkZWZpbmUJUE1BUF9TUE9SVDFUWAkweDQwMDAJLyogUE1BUAlTUE9SVDEgVHJhbnNtaXQJRE1BICovCisjZGVmaW5lCVBNQVBfU1BJMAkJMHg1MDAwCS8qIFBNQVAJU1BJIERNQSAqLworI2RlZmluZQlQTUFQX1VBUlQwUlgJCTB4NjAwMAkvKiBQTUFQCVVBUlQgUmVjZWl2ZSBETUEgKi8KKyNkZWZpbmUJUE1BUF9VQVJUMFRYCQkweDcwMDAJLyogUE1BUAlVQVJUIFRyYW5zbWl0IERNQSAqLworCisvKiBQTUFQCUVuY29kaW5ncyBGb3IgRE1BIENvbnRyb2xsZXIgMSAqLworI2RlZmluZQlQTUFQX1NQT1JUMlJYCSAgICAweDAwMDAgIC8qIFBNQVAgU1BPUlQyIFJlY2VpdmUgRE1BICovCisjZGVmaW5lCVBNQVBfU1BPUlQyVFgJICAgIDB4MTAwMCAgLyogUE1BUCBTUE9SVDIgVHJhbnNtaXQgRE1BICovCisjZGVmaW5lCVBNQVBfU1BPUlQzUlgJICAgIDB4MjAwMCAgLyogUE1BUCBTUE9SVDMgUmVjZWl2ZSBETUEgKi8KKyNkZWZpbmUJUE1BUF9TUE9SVDNUWAkgICAgMHgzMDAwICAvKiBQTUFQIFNQT1JUMyBUcmFuc21pdCBETUEgKi8KKyNkZWZpbmUJUE1BUF9TUEkxCSAgICAweDYwMDAgIC8qIFBNQVAgU1BJMSBETUEgKi8KKyNkZWZpbmUJUE1BUF9TUEkyCSAgICAweDcwMDAgIC8qIFBNQVAgU1BJMiBETUEgKi8KKyNkZWZpbmUJUE1BUF9VQVJUMVJYCSAgICAweDgwMDAgIC8qIFBNQVAgVUFSVDEgUmVjZWl2ZSBETUEgKi8KKyNkZWZpbmUJUE1BUF9VQVJUMVRYCSAgICAweDkwMDAgIC8qIFBNQVAgVUFSVDEgVHJhbnNtaXQgRE1BICovCisjZGVmaW5lCVBNQVBfVUFSVDJSWAkgICAgMHhBMDAwICAvKiBQTUFQIFVBUlQyIFJlY2VpdmUgRE1BICovCisjZGVmaW5lCVBNQVBfVUFSVDJUWAkgICAgMHhCMDAwICAvKiBQTUFQIFVBUlQyIFRyYW5zbWl0IERNQSAqLworCisKKy8qICAqKioqKioqKioqKioqICBHRU5FUkFMIFBVUlBPU0UgVElNRVIgTUFTS1MJKioqKioqKioqKioqKioqKioqKiogKi8KKy8qIFBXTSBUaW1lciBiaXQgZGVmaW5pdGlvbnMgKi8KKy8qIFRJTUVSX0VOQUJMRQlSZWdpc3RlciAqLworI2RlZmluZQlUSU1FTjAJCQkweDAwMDEJLyogRW5hYmxlIFRpbWVyCTAgKi8KKyNkZWZpbmUJVElNRU4xCQkJMHgwMDAyCS8qIEVuYWJsZSBUaW1lcgkxICovCisjZGVmaW5lCVRJTUVOMgkJCTB4MDAwNAkvKiBFbmFibGUgVGltZXIJMiAqLworCisjZGVmaW5lCVRJTUVOMF9QCQkweDAwCisjZGVmaW5lCVRJTUVOMV9QCQkweDAxCisjZGVmaW5lCVRJTUVOMl9QCQkweDAyCisKKy8qIFRJTUVSX0RJU0FCTEUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJVElNRElTMAkJCTB4MDAwMQkvKiBEaXNhYmxlIFRpbWVyIDAgKi8KKyNkZWZpbmUJVElNRElTMQkJCTB4MDAwMgkvKiBEaXNhYmxlIFRpbWVyIDEgKi8KKyNkZWZpbmUJVElNRElTMgkJCTB4MDAwNAkvKiBEaXNhYmxlIFRpbWVyIDIgKi8KKworI2RlZmluZQlUSU1ESVMwX1AJCTB4MDAKKyNkZWZpbmUJVElNRElTMV9QCQkweDAxCisjZGVmaW5lCVRJTURJUzJfUAkJMHgwMgorCisvKiBUSU1FUl9TVEFUVVMJUmVnaXN0ZXIgKi8KKyNkZWZpbmUJVElNSUwwCQkJMHgwMDAxCS8qIFRpbWVyIDAgSW50ZXJydXB0ICovCisjZGVmaW5lCVRJTUlMMQkJCTB4MDAwMgkvKiBUaW1lciAxIEludGVycnVwdCAqLworI2RlZmluZQlUSU1JTDIJCQkweDAwMDQJLyogVGltZXIgMiBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUJVE9WRl9FUlIwCQkweDAwMTAJLyogVGltZXIgMCBDb3VudGVyIE92ZXJmbG93ICovCisjZGVmaW5lCVRPVkZfRVJSMQkJMHgwMDIwCS8qIFRpbWVyIDEgQ291bnRlciBPdmVyZmxvdyAqLworI2RlZmluZQlUT1ZGX0VSUjIJCTB4MDA0MAkvKiBUaW1lciAyIENvdW50ZXIgT3ZlcmZsb3cgKi8KKyNkZWZpbmUJVFJVTjAJCQkweDEwMDAJLyogVGltZXIgMCBTbGF2ZSBFbmFibGUJU3RhdHVzICovCisjZGVmaW5lCVRSVU4xCQkJMHgyMDAwCS8qIFRpbWVyIDEgU2xhdmUgRW5hYmxlCVN0YXR1cyAqLworI2RlZmluZQlUUlVOMgkJCTB4NDAwMAkvKiBUaW1lciAyIFNsYXZlIEVuYWJsZQlTdGF0dXMgKi8KKworI2RlZmluZQlUSU1JTDBfUAkJMHgwMAorI2RlZmluZQlUSU1JTDFfUAkJMHgwMQorI2RlZmluZQlUSU1JTDJfUAkJMHgwMgorI2RlZmluZQlUT1ZGX0VSUjBfUAkJMHgwNAorI2RlZmluZQlUT1ZGX0VSUjFfUAkJMHgwNQorI2RlZmluZQlUT1ZGX0VSUjJfUAkJMHgwNgorI2RlZmluZQlUUlVOMF9QCQkJMHgwQworI2RlZmluZQlUUlVOMV9QCQkJMHgwRAorI2RlZmluZQlUUlVOMl9QCQkJMHgwRQorCisvKiBBbHRlcm5hdGUgRGVwcmVjYXRlZAlNYWNyb3MgUHJvdmlkZWQJRm9yIEJhY2t3YXJkcyBDb2RlIENvbXBhdGliaWxpdHkgKi8KKyNkZWZpbmUJVE9WTF9FUlIwCQlUT1ZGX0VSUjAKKyNkZWZpbmUJVE9WTF9FUlIxCQlUT1ZGX0VSUjEKKyNkZWZpbmUJVE9WTF9FUlIyCQlUT1ZGX0VSUjIKKyNkZWZpbmUJVE9WTF9FUlIwX1AJCVRPVkZfRVJSMF9QCisjZGVmaW5lCVRPVkxfRVJSMV9QCVRPVkZfRVJSMV9QCisjZGVmaW5lCVRPVkxfRVJSMl9QCVRPVkZfRVJSMl9QCisKKy8qIFRJTUVSeF9DT05GSUcgUmVnaXN0ZXJzICovCisjZGVmaW5lCVBXTV9PVVQJCQkweDAwMDEKKyNkZWZpbmUJV0RUSF9DQVAJCTB4MDAwMgorI2RlZmluZQlFWFRfQ0xLCQkJMHgwMDAzCisjZGVmaW5lCVBVTFNFX0hJCQkweDAwMDQKKyNkZWZpbmUJUEVSSU9EX0NOVAkJMHgwMDA4CisjZGVmaW5lCUlSUV9FTkEJCQkweDAwMTAKKyNkZWZpbmUJVElOX1NFTAkJCTB4MDAyMAorI2RlZmluZQlPVVRfRElTCQkJMHgwMDQwCisjZGVmaW5lCUNMS19TRUwJCQkweDAwODAKKyNkZWZpbmUJVE9HR0xFX0hJCQkweDAxMDAKKyNkZWZpbmUJRU1VX1JVTgkJCTB4MDIwMAorI2lmZGVmIF9NSVNSQV9SVUxFUworI2RlZmluZQlFUlJfVFlQKHgpCQkoKCh4KSAmCTB4MDN1KSA8PCAxNCkKKyNlbHNlCisjZGVmaW5lCUVSUl9UWVAoeCkJCSgoKHgpICYJMHgwMykgPDwgMTQpCisjZW5kaWYgLyogX01JU1JBX1JVTEVTICovCisKKyNkZWZpbmUJVE1PREVfUDAJCTB4MDAKKyNkZWZpbmUJVE1PREVfUDEJCTB4MDEKKyNkZWZpbmUJUFVMU0VfSElfUAkJMHgwMgorI2RlZmluZQlQRVJJT0RfQ05UX1AJMHgwMworI2RlZmluZQlJUlFfRU5BX1AJCTB4MDQKKyNkZWZpbmUJVElOX1NFTF9QCQkweDA1CisjZGVmaW5lCU9VVF9ESVNfUAkJMHgwNgorI2RlZmluZQlDTEtfU0VMX1AJCTB4MDcKKyNkZWZpbmUJVE9HR0xFX0hJX1AJCTB4MDgKKyNkZWZpbmUJRU1VX1JVTl9QCQkweDA5CisjZGVmaW5lCUVSUl9UWVBfUDAJCTB4MEUKKyNkZWZpbmUJRVJSX1RZUF9QMQkJMHgwRgorCisKKy8qLyAqKioqKioqKioqKioqKioqKioJIEdFTkVSQUwtUFVSUE9TRSBJL08gICoqKioqKioqKioqKioqKioqKioqKiAqLworLyogIEZsYWcgSS9PIChGSU9fKSBNYXNrcyAqLworI2RlZmluZQlQRjAJCQkweDAwMDEKKyNkZWZpbmUJUEYxCQkJMHgwMDAyCisjZGVmaW5lCVBGMgkJCTB4MDAwNAorI2RlZmluZQlQRjMJCQkweDAwMDgKKyNkZWZpbmUJUEY0CQkJMHgwMDEwCisjZGVmaW5lCVBGNQkJCTB4MDAyMAorI2RlZmluZQlQRjYJCQkweDAwNDAKKyNkZWZpbmUJUEY3CQkJMHgwMDgwCisjZGVmaW5lCVBGOAkJCTB4MDEwMAorI2RlZmluZQlQRjkJCQkweDAyMDAKKyNkZWZpbmUJUEYxMAkJMHgwNDAwCisjZGVmaW5lCVBGMTEJCTB4MDgwMAorI2RlZmluZQlQRjEyCQkweDEwMDAKKyNkZWZpbmUJUEYxMwkJMHgyMDAwCisjZGVmaW5lCVBGMTQJCTB4NDAwMAorI2RlZmluZQlQRjE1CQkweDgwMDAKKworLyogIFBPUlQgRiBCSVQgUE9TSVRJT05TICovCisjZGVmaW5lCVBGMF9QCQkweDAKKyNkZWZpbmUJUEYxX1AJCTB4MQorI2RlZmluZQlQRjJfUAkJMHgyCisjZGVmaW5lCVBGM19QCQkweDMKKyNkZWZpbmUJUEY0X1AJCTB4NAorI2RlZmluZQlQRjVfUAkJMHg1CisjZGVmaW5lCVBGNl9QCQkweDYKKyNkZWZpbmUJUEY3X1AJCTB4NworI2RlZmluZQlQRjhfUAkJMHg4CisjZGVmaW5lCVBGOV9QCQkweDkKKyNkZWZpbmUJUEYxMF9QCQkweEEKKyNkZWZpbmUJUEYxMV9QCQkweEIKKyNkZWZpbmUJUEYxMl9QCQkweEMKKyNkZWZpbmUJUEYxM19QCQkweEQKKyNkZWZpbmUJUEYxNF9QCQkweEUKKyNkZWZpbmUJUEYxNV9QCQkweEYKKworCisvKioqKioqKioqKioqKioqKioqKiAgIEdQSU8gTUFTS1MgICoqKioqKioqKioqKioqKioqKioqKi8KKy8qIFBvcnQJQyBNYXNrcyAqLworI2RlZmluZQlQQzAJCTB4MDAwMQorI2RlZmluZQlQQzEJCTB4MDAwMgorI2RlZmluZQlQQzQJCTB4MDAxMAorI2RlZmluZQlQQzUJCTB4MDAyMAorI2RlZmluZQlQQzYJCTB4MDA0MAorI2RlZmluZQlQQzcJCTB4MDA4MAorI2RlZmluZQlQQzgJCTB4MDEwMAorI2RlZmluZQlQQzkJCTB4MDIwMAorLyogUG9ydAlDIEJpdCBQb3NpdGlvbnMgKi8KKyNkZWZpbmUJUEMwX1AJMHgwCisjZGVmaW5lCVBDMV9QCTB4MQorI2RlZmluZQlQQzRfUAkweDQKKyNkZWZpbmUJUEM1X1AJMHg1CisjZGVmaW5lCVBDNl9QCTB4NgorI2RlZmluZQlQQzdfUAkweDcKKyNkZWZpbmUJUEM4X1AJMHg4CisjZGVmaW5lCVBDOV9QCTB4OQorCisvKiBQb3J0CUQgKi8KKyNkZWZpbmUJUEQwCQkweDAwMDEKKyNkZWZpbmUJUEQxCQkweDAwMDIKKyNkZWZpbmUJUEQyCQkweDAwMDQKKyNkZWZpbmUJUEQzCQkweDAwMDgKKyNkZWZpbmUJUEQ0CQkweDAwMTAKKyNkZWZpbmUJUEQ1CQkweDAwMjAKKyNkZWZpbmUJUEQ2CQkweDAwNDAKKyNkZWZpbmUJUEQ3CQkweDAwODAKKyNkZWZpbmUJUEQ4CQkweDAxMDAKKyNkZWZpbmUJUEQ5CQkweDAyMDAKKyNkZWZpbmUJUEQxMAkweDA0MDAKKyNkZWZpbmUJUEQxMQkweDA4MDAKKyNkZWZpbmUJUEQxMgkweDEwMDAKKyNkZWZpbmUJUEQxMwkweDIwMDAKKyNkZWZpbmUJUEQxNAkweDQwMDAKKyNkZWZpbmUJUEQxNQkweDgwMDAKKy8qIFBvcnQJRCBCaXQgUG9zaXRpb25zICovCisjZGVmaW5lCVBEMF9QCTB4MAorI2RlZmluZQlQRDFfUAkweDEKKyNkZWZpbmUJUEQyX1AJMHgyCisjZGVmaW5lCVBEM19QCTB4MworI2RlZmluZQlQRDRfUAkweDQKKyNkZWZpbmUJUEQ1X1AJMHg1CisjZGVmaW5lCVBENl9QCTB4NgorI2RlZmluZQlQRDdfUAkweDcKKyNkZWZpbmUJUEQ4X1AJMHg4CisjZGVmaW5lCVBEOV9QCTB4OQorI2RlZmluZQlQRDEwX1AJMHhBCisjZGVmaW5lCVBEMTFfUAkweEIKKyNkZWZpbmUJUEQxMl9QCTB4QworI2RlZmluZQlQRDEzX1AJMHhECisjZGVmaW5lCVBEMTRfUAkweEUKKyNkZWZpbmUJUEQxNV9QCTB4RgorCisvKiBQb3J0CUUgKi8KKyNkZWZpbmUJUEUwCQkweDAwMDEKKyNkZWZpbmUJUEUxCQkweDAwMDIKKyNkZWZpbmUJUEUyCQkweDAwMDQKKyNkZWZpbmUJUEUzCQkweDAwMDgKKyNkZWZpbmUJUEU0CQkweDAwMTAKKyNkZWZpbmUJUEU1CQkweDAwMjAKKyNkZWZpbmUJUEU2CQkweDAwNDAKKyNkZWZpbmUJUEU3CQkweDAwODAKKyNkZWZpbmUJUEU4CQkweDAxMDAKKyNkZWZpbmUJUEU5CQkweDAyMDAKKyNkZWZpbmUJUEUxMAkweDA0MDAKKyNkZWZpbmUJUEUxMQkweDA4MDAKKyNkZWZpbmUJUEUxMgkweDEwMDAKKyNkZWZpbmUJUEUxMwkweDIwMDAKKyNkZWZpbmUJUEUxNAkweDQwMDAKKyNkZWZpbmUJUEUxNQkweDgwMDAKKy8qIFBvcnQJRSBCaXQgUG9zaXRpb25zICovCisjZGVmaW5lCVBFMF9QCTB4MAorI2RlZmluZQlQRTFfUAkweDEKKyNkZWZpbmUJUEUyX1AJMHgyCisjZGVmaW5lCVBFM19QCTB4MworI2RlZmluZQlQRTRfUAkweDQKKyNkZWZpbmUJUEU1X1AJMHg1CisjZGVmaW5lCVBFNl9QCTB4NgorI2RlZmluZQlQRTdfUAkweDcKKyNkZWZpbmUJUEU4X1AJMHg4CisjZGVmaW5lCVBFOV9QCTB4OQorI2RlZmluZQlQRTEwX1AJMHhBCisjZGVmaW5lCVBFMTFfUAkweEIKKyNkZWZpbmUJUEUxMl9QCTB4QworI2RlZmluZQlQRTEzX1AJMHhECisjZGVmaW5lCVBFMTRfUAkweEUKKyNkZWZpbmUJUEUxNV9QCTB4RgorCisKKy8qICoqKioqKioqKioqCVNFUklBTCBQRVJJUEhFUkFMIElOVEVSRkFDRSAoU1BJKSBNQVNLUwkgKioqKioqKioqKioqKioqKiAqLworLyogU1BJeF9DVEwgTWFza3MgKi8KKyNkZWZpbmUJVElNT0QJCTB4MDAwMwkJLyogVHJhbnNmZXIgSW5pdGlhdGUgTW9kZSAqLworI2RlZmluZQlSREJSX0NPUkUJMHgwMDAwCQkvKgkJUkRCUiBSZWFkIEluaXRpYXRlcywgSVJRIFdoZW4gUkRCUiBGdWxsICovCisjZGVmaW5lCVREQlJfQ09SRQkweDAwMDEJCS8qCQlUREJSIFdyaXRlIEluaXRpYXRlcywgSVJRIFdoZW4gVERCUiBFbXB0eSAqLworI2RlZmluZQlSREJSX0RNQQkweDAwMDIJCS8qCQlETUEgUmVhZCwgRE1BIFVudGlsIEZJRk8gRW1wdHkgKi8KKyNkZWZpbmUJVERCUl9ETUEJMHgwMDAzCQkvKgkJRE1BIFdyaXRlLCBETUEgVW50aWwgRklGTyBGdWxsICovCisjZGVmaW5lCVNaCQkJMHgwMDA0CQkvKiBTZW5kCVplcm8gKFdoZW4gVERCUglFbXB0eSwgU2VuZCBaZXJvL0xhc3QqKSAqLworI2RlZmluZQlHTQkJCTB4MDAwOAkJLyogR2V0IE1vcmUgKFdoZW4gUkRCUiBGdWxsLCBPdmVyd3JpdGUvRGlzY2FyZCopICovCisjZGVmaW5lCVBTU0UJCTB4MDAxMAkJLyogU2xhdmUtU2VsZWN0CUlucHV0IEVuYWJsZSAqLworI2RlZmluZQlFTUlTTwkJMHgwMDIwCQkvKiBFbmFibGUgTUlTTyBBcyBPdXRwdXQgKi8KKyNkZWZpbmUJU0laRQkJMHgwMTAwCQkvKiBTaXplCW9mIFdvcmRzICgxNi84KglCaXRzKSAqLworI2RlZmluZQlMU0JGCQkweDAyMDAJCS8qIExTQiBGaXJzdAkJCSAqLworI2RlZmluZQlDUEhBCQkweDA0MDAJCS8qIENsb2NrIFBoYXNlCQkJICovCisjZGVmaW5lCUNQT0wJCTB4MDgwMAkJLyogQ2xvY2sgUG9sYXJpdHkJCSAqLworI2RlZmluZQlNU1RSCQkweDEwMDAJCS8qIE1hc3Rlci9TbGF2ZSoJCSAqLworI2RlZmluZQlXT00JCQkweDIwMDAJCS8qIFdyaXRlIE9wZW4gRHJhaW4gTWFzdGVyICovCisjZGVmaW5lCVNQRQkJCTB4NDAwMAkJLyogU1BJIEVuYWJsZQkJCSAqLworCisvKiBTUEl4X0ZMRyBNYXNrcyAqLworI2RlZmluZQlGTFMxCTB4MDAwMgkvKiBFbmFibGVzICg9MSkJU1BJX0ZMT1VUMSBhcyBmbGFnIG91dHB1dCBmb3IgU1BJIFNsYXZlLXNlbGVjdCAqLworI2RlZmluZQlGTFMyCTB4MDAwNAkvKiBFbmFibGVzICg9MSkJU1BJX0ZMT1VUMiBhcyBmbGFnIG91dHB1dCBmb3IgU1BJIFNsYXZlLXNlbGVjdCAqLworI2RlZmluZQlGTFMzCTB4MDAwOAkvKiBFbmFibGVzICg9MSkJU1BJX0ZMT1VUMyBhcyBmbGFnIG91dHB1dCBmb3IgU1BJIFNsYXZlLXNlbGVjdCAqLworI2RlZmluZQlGTFM0CTB4MDAxMAkvKiBFbmFibGVzICg9MSkJU1BJX0ZMT1VUNCBhcyBmbGFnIG91dHB1dCBmb3IgU1BJIFNsYXZlLXNlbGVjdCAqLworI2RlZmluZQlGTFM1CTB4MDAyMAkvKiBFbmFibGVzICg9MSkJU1BJX0ZMT1VUNSBhcyBmbGFnIG91dHB1dCBmb3IgU1BJIFNsYXZlLXNlbGVjdCAqLworI2RlZmluZQlGTFM2CTB4MDA0MAkvKiBFbmFibGVzICg9MSkJU1BJX0ZMT1VUNiBhcyBmbGFnIG91dHB1dCBmb3IgU1BJIFNsYXZlLXNlbGVjdCAqLworI2RlZmluZQlGTFM3CTB4MDA4MAkvKiBFbmFibGVzICg9MSkJU1BJX0ZMT1VUNyBhcyBmbGFnIG91dHB1dCBmb3IgU1BJIFNsYXZlLXNlbGVjdCAqLworCisjZGVmaW5lCUZMRzEJMHgwMjAwCS8qIEFjdGl2YXRlcyAoPTApIFNQSV9GTE9VVDEgYXMJZmxhZyBvdXRwdXQgZm9yCVNQSSBTbGF2ZS1zZWxlY3QgICovCisjZGVmaW5lCUZMRzIJMHgwNDAwCS8qIEFjdGl2YXRlcyAoPTApIFNQSV9GTE9VVDIgYXMJZmxhZyBvdXRwdXQgZm9yCVNQSSBTbGF2ZS1zZWxlY3QgKi8KKyNkZWZpbmUJRkxHMwkweDA4MDAJLyogQWN0aXZhdGVzICg9MCkgU1BJX0ZMT1VUMyBhcwlmbGFnIG91dHB1dCBmb3IJU1BJIFNsYXZlLXNlbGVjdCAgKi8KKyNkZWZpbmUJRkxHNAkweDEwMDAJLyogQWN0aXZhdGVzICg9MCkgU1BJX0ZMT1VUNCBhcwlmbGFnIG91dHB1dCBmb3IJU1BJIFNsYXZlLXNlbGVjdCAgKi8KKyNkZWZpbmUJRkxHNQkweDIwMDAJLyogQWN0aXZhdGVzICg9MCkgU1BJX0ZMT1VUNSBhcwlmbGFnIG91dHB1dCBmb3IJU1BJIFNsYXZlLXNlbGVjdCAgKi8KKyNkZWZpbmUJRkxHNgkweDQwMDAJLyogQWN0aXZhdGVzICg9MCkgU1BJX0ZMT1VUNiBhcwlmbGFnIG91dHB1dCBmb3IJU1BJIFNsYXZlLXNlbGVjdCAgKi8KKyNkZWZpbmUJRkxHNwkweDgwMDAJLyogQWN0aXZhdGVzICg9MCkgU1BJX0ZMT1VUNyBhcwlmbGFnIG91dHB1dCBmb3IJU1BJIFNsYXZlLXNlbGVjdCAqLworCisvKiBTUEl4X0ZMRyBCaXQJUG9zaXRpb25zICovCisjZGVmaW5lCUZMUzFfUAkweDAwMDEJLyogRW5hYmxlcyAoPTEpCVNQSV9GTE9VVDEgYXMgZmxhZyBvdXRwdXQgZm9yIFNQSSBTbGF2ZS1zZWxlY3QgKi8KKyNkZWZpbmUJRkxTMl9QCTB4MDAwMgkvKiBFbmFibGVzICg9MSkJU1BJX0ZMT1VUMiBhcyBmbGFnIG91dHB1dCBmb3IgU1BJIFNsYXZlLXNlbGVjdCAqLworI2RlZmluZQlGTFMzX1AJMHgwMDAzCS8qIEVuYWJsZXMgKD0xKQlTUElfRkxPVVQzIGFzIGZsYWcgb3V0cHV0IGZvciBTUEkgU2xhdmUtc2VsZWN0ICovCisjZGVmaW5lCUZMUzRfUAkweDAwMDQJLyogRW5hYmxlcyAoPTEpCVNQSV9GTE9VVDQgYXMgZmxhZyBvdXRwdXQgZm9yIFNQSSBTbGF2ZS1zZWxlY3QgKi8KKyNkZWZpbmUJRkxTNV9QCTB4MDAwNQkvKiBFbmFibGVzICg9MSkJU1BJX0ZMT1VUNSBhcyBmbGFnIG91dHB1dCBmb3IgU1BJIFNsYXZlLXNlbGVjdCAqLworI2RlZmluZQlGTFM2X1AJMHgwMDA2CS8qIEVuYWJsZXMgKD0xKQlTUElfRkxPVVQ2IGFzIGZsYWcgb3V0cHV0IGZvciBTUEkgU2xhdmUtc2VsZWN0ICovCisjZGVmaW5lCUZMUzdfUAkweDAwMDcJLyogRW5hYmxlcyAoPTEpCVNQSV9GTE9VVDcgYXMgZmxhZyBvdXRwdXQgZm9yIFNQSSBTbGF2ZS1zZWxlY3QgKi8KKyNkZWZpbmUJRkxHMV9QCTB4MDAwOQkvKiBBY3RpdmF0ZXMgKD0wKSBTUElfRkxPVVQxIGFzCWZsYWcgb3V0cHV0IGZvcglTUEkgU2xhdmUtc2VsZWN0ICAqLworI2RlZmluZQlGTEcyX1AJMHgwMDBBCS8qIEFjdGl2YXRlcyAoPTApIFNQSV9GTE9VVDIgYXMJZmxhZyBvdXRwdXQgZm9yCVNQSSBTbGF2ZS1zZWxlY3QgKi8KKyNkZWZpbmUJRkxHM19QCTB4MDAwQgkvKiBBY3RpdmF0ZXMgKD0wKSBTUElfRkxPVVQzIGFzCWZsYWcgb3V0cHV0IGZvcglTUEkgU2xhdmUtc2VsZWN0ICAqLworI2RlZmluZQlGTEc0X1AJMHgwMDBDCS8qIEFjdGl2YXRlcyAoPTApIFNQSV9GTE9VVDQgYXMJZmxhZyBvdXRwdXQgZm9yCVNQSSBTbGF2ZS1zZWxlY3QgICovCisjZGVmaW5lCUZMRzVfUAkweDAwMEQJLyogQWN0aXZhdGVzICg9MCkgU1BJX0ZMT1VUNSBhcwlmbGFnIG91dHB1dCBmb3IJU1BJIFNsYXZlLXNlbGVjdCAgKi8KKyNkZWZpbmUJRkxHNl9QCTB4MDAwRQkvKiBBY3RpdmF0ZXMgKD0wKSBTUElfRkxPVVQ2IGFzCWZsYWcgb3V0cHV0IGZvcglTUEkgU2xhdmUtc2VsZWN0ICAqLworI2RlZmluZQlGTEc3X1AJMHgwMDBGCS8qIEFjdGl2YXRlcyAoPTApIFNQSV9GTE9VVDcgYXMJZmxhZyBvdXRwdXQgZm9yCVNQSSBTbGF2ZS1zZWxlY3QgKi8KKworLyogU1BJeF9TVEFUIE1hc2tzICovCisjZGVmaW5lCVNQSUYJMHgwMDAxCS8qIFNldCAoPTEpIHdoZW4gU1BJIHNpbmdsZS13b3JkIHRyYW5zZmVyIGNvbXBsZXRlICovCisjZGVmaW5lCU1PREYJMHgwMDAyCS8qIFNldCAoPTEpIGluIGEgbWFzdGVyCWRldmljZSB3aGVuIHNvbWUgb3RoZXIgZGV2aWNlIHRyaWVzIHRvIGJlY29tZSBtYXN0ZXIgKi8KKyNkZWZpbmUJVFhFCQkweDAwMDQJLyogU2V0ICg9MSkgd2hlbiB0cmFuc21pc3Npb24gb2NjdXJzIHdpdGggbm8gbmV3IGRhdGEgaW4gU1BJX1REQlIgKi8KKyNkZWZpbmUJVFhTCQkweDAwMDgJLyogU1BJX1REQlIgRGF0YSBCdWZmZXIJU3RhdHVzICgwPUVtcHR5LCAxPUZ1bGwpICovCisjZGVmaW5lCVJCU1kJMHgwMDEwCS8qIFNldCAoPTEpIHdoZW4gZGF0YSBpcyByZWNlaXZlZCB3aXRoIFJEQlIgZnVsbCAqLworI2RlZmluZQlSWFMJCTB4MDAyMAkvKiBTUElfUkRCUiBEYXRhIEJ1ZmZlcglTdGF0dXMgKDA9RW1wdHksIDE9RnVsbCkgICovCisjZGVmaW5lCVRYQ09MCTB4MDA0MAkvKiBXaGVuCXNldCAoPTEpLCBjb3JydXB0IGRhdGEgbWF5IGhhdmUJYmVlbiB0cmFuc21pdHRlZCAgKi8KKworLyogU1BJeF9GTEcgTWFza3MJCQkJCQkJCQkJICovCisjZGVmaW5lCUZMRzFFCTB4RkRGRgkJLyogQWN0aXZhdGVzIFNQSV9GTE9VVDEJICovCisjZGVmaW5lCUZMRzJFCTB4RkJGRgkJLyogQWN0aXZhdGVzIFNQSV9GTE9VVDIJICovCisjZGVmaW5lCUZMRzNFCTB4RjdGRgkJLyogQWN0aXZhdGVzIFNQSV9GTE9VVDMJICovCisjZGVmaW5lCUZMRzRFCTB4RUZGRgkJLyogQWN0aXZhdGVzIFNQSV9GTE9VVDQJICovCisjZGVmaW5lCUZMRzVFCTB4REZGRgkJLyogQWN0aXZhdGVzIFNQSV9GTE9VVDUJICovCisjZGVmaW5lCUZMRzZFCTB4QkZGRgkJLyogQWN0aXZhdGVzIFNQSV9GTE9VVDYJICovCisjZGVmaW5lCUZMRzdFCTB4N0ZGRgkJLyogQWN0aXZhdGVzIFNQSV9GTE9VVDcJICovCisKKworLyogKioqKioqKioqKioqKioqKioqKioqICBBU1lOQ0hST05PVVMgTUVNT1JZIENPTlRST0xMRVIgTUFTS1MJKioqKioqKioqKioqKiAqLworLyogRUJJVV9BTUdDVEwgTWFza3MgKi8KKyNkZWZpbmUJQU1DS0VOCQkweDAwMDEJLyogRW5hYmxlIENMS09VVCAqLworI2RlZmluZQlBTUJFTl9OT05FCTB4MDAwMAkvKiBBbGwgQmFua3MgRGlzYWJsZWQgKi8KKyNkZWZpbmUJQU1CRU5fQjAJMHgwMDAyCS8qIEVuYWJsZSBBc3luY2hyb25vdXMgTWVtb3J5IEJhbmsgMCBvbmx5ICovCisjZGVmaW5lCUFNQkVOX0IwX0IxCTB4MDAwNAkvKiBFbmFibGUgQXN5bmNocm9ub3VzIE1lbW9yeSBCYW5rcyAwICYJMSBvbmx5ICovCisjZGVmaW5lCUFNQkVOX0IwX0IxX0IyCTB4MDAwNgkvKiBFbmFibGUgQXN5bmNocm9ub3VzIE1lbW9yeSBCYW5rcyAwLCAxLCBhbmQgMiAqLworI2RlZmluZQlBTUJFTl9BTEwJMHgwMDA4CS8qIEVuYWJsZSBBc3luY2hyb25vdXMgTWVtb3J5IEJhbmtzIChhbGwpIDAsIDEsCTIsIGFuZCAzICovCisjZGVmaW5lCUNEUFJJTwkJMHgwMTAwCS8qIERNQSBoYXMgcHJpb3JpdHkgb3ZlciBjb3JlIGZvciBmb3IgZXh0ZXJuYWwgYWNjZXNzZXMgKi8KKworLyogRUJJVV9BTUdDVEwgQml0IFBvc2l0aW9ucyAqLworI2RlZmluZQlBTUNLRU5fUAkJMHgwMDAwCS8qIEVuYWJsZSBDTEtPVVQgKi8KKyNkZWZpbmUJQU1CRU5fUDAJCTB4MDAwMQkvKiBBc3luY2hyb25vdXMJTWVtb3J5IEVuYWJsZSwgMDAwIC0gYmFua3MgMC0zIGRpc2FibGVkLCAwMDEgLSBCYW5rIDAgZW5hYmxlZCAqLworI2RlZmluZQlBTUJFTl9QMQkJMHgwMDAyCS8qIEFzeW5jaHJvbm91cwlNZW1vcnkgRW5hYmxlLCAwMTAgLSBiYW5rcyAwJjEgZW5hYmxlZCwJIDAxMSAtIGJhbmtzIDAtMyBlbmFibGVkICovCisjZGVmaW5lCUFNQkVOX1AyCQkweDAwMDMJLyogQXN5bmNocm9ub3VzCU1lbW9yeSBFbmFibGUsIDF4eCAtIEFsbCBiYW5rcyAoYmFuayAwLAkxLCAyLCBhbmQgMykgZW5hYmxlZCAqLworCisvKiBFQklVX0FNQkNUTDAJTWFza3MgKi8KKyNkZWZpbmUJQjBSRFlFTgkJCTB4MDAwMDAwMDEgIC8qIEJhbmsgMCBSRFkgRW5hYmxlLCAwPWRpc2FibGUsIDE9ZW5hYmxlICovCisjZGVmaW5lCUIwUkRZUE9MCQkweDAwMDAwMDAyICAvKiBCYW5rIDAgUkRZIEFjdGl2ZSBoaWdoLCAwPWFjdGl2ZQlsb3csIDE9YWN0aXZlIGhpZ2ggKi8KKyNkZWZpbmUJQjBUVF8xCQkJMHgwMDAwMDAwNCAgLyogQmFuayAwIFRyYW5zaXRpb24gVGltZSBmcm9tIFJlYWQJdG8gV3JpdGUgPSAxIGN5Y2xlICovCisjZGVmaW5lCUIwVFRfMgkJCTB4MDAwMDAwMDggIC8qIEJhbmsgMCBUcmFuc2l0aW9uIFRpbWUgZnJvbSBSZWFkCXRvIFdyaXRlID0gMiBjeWNsZXMgKi8KKyNkZWZpbmUJQjBUVF8zCQkJMHgwMDAwMDAwQyAgLyogQmFuayAwIFRyYW5zaXRpb24gVGltZSBmcm9tIFJlYWQJdG8gV3JpdGUgPSAzIGN5Y2xlcyAqLworI2RlZmluZQlCMFRUXzQJCQkweDAwMDAwMDAwICAvKiBCYW5rIDAgVHJhbnNpdGlvbiBUaW1lIGZyb20gUmVhZAl0byBXcml0ZSA9IDQgY3ljbGVzICovCisjZGVmaW5lCUIwU1RfMQkJCTB4MDAwMDAwMTAgIC8qIEJhbmsgMCBTZXR1cCBUaW1lIGZyb20gQU9FIGFzc2VydGVkIHRvIFJlYWQvV3JpdGUgYXNzZXJ0ZWQ9MSBjeWNsZSAqLworI2RlZmluZQlCMFNUXzIJCQkweDAwMDAwMDIwICAvKiBCYW5rIDAgU2V0dXAgVGltZSBmcm9tIEFPRSBhc3NlcnRlZCB0byBSZWFkL1dyaXRlIGFzc2VydGVkPTIgY3ljbGVzICovCisjZGVmaW5lCUIwU1RfMwkJCTB4MDAwMDAwMzAgIC8qIEJhbmsgMCBTZXR1cCBUaW1lIGZyb20gQU9FIGFzc2VydGVkIHRvIFJlYWQvV3JpdGUgYXNzZXJ0ZWQ9MyBjeWNsZXMgKi8KKyNkZWZpbmUJQjBTVF80CQkJMHgwMDAwMDAwMCAgLyogQmFuayAwIFNldHVwIFRpbWUgZnJvbSBBT0UgYXNzZXJ0ZWQgdG8gUmVhZC9Xcml0ZSBhc3NlcnRlZD00IGN5Y2xlcyAqLworI2RlZmluZQlCMEhUXzEJCQkweDAwMDAwMDQwICAvKiBCYW5rIDAgSG9sZCBUaW1lCWZyb20gUmVhZC9Xcml0ZQlkZWFzc2VydGVkIHRvIEFPRSBkZWFzc2VydGVkID0gMSBjeWNsZSAqLworI2RlZmluZQlCMEhUXzIJCQkweDAwMDAwMDgwICAvKiBCYW5rIDAgSG9sZCBUaW1lCWZyb20gUmVhZC9Xcml0ZQlkZWFzc2VydGVkIHRvIEFPRSBkZWFzc2VydGVkID0gMiBjeWNsZXMgKi8KKyNkZWZpbmUJQjBIVF8zCQkJMHgwMDAwMDBDMCAgLyogQmFuayAwIEhvbGQgVGltZQlmcm9tIFJlYWQvV3JpdGUJZGVhc3NlcnRlZCB0byBBT0UgZGVhc3NlcnRlZCA9IDMgY3ljbGVzICovCisjZGVmaW5lCUIwSFRfMAkJCTB4MDAwMDAwMDAgIC8qIEJhbmsgMCBIb2xkIFRpbWUJZnJvbSBSZWFkL1dyaXRlCWRlYXNzZXJ0ZWQgdG8gQU9FIGRlYXNzZXJ0ZWQgPSAwIGN5Y2xlcyAqLworI2RlZmluZQlCMFJBVF8xCQkJMHgwMDAwMDEwMCAgLyogQmFuayAwIFJlYWQgQWNjZXNzIFRpbWUgPSAxIGN5Y2xlICovCisjZGVmaW5lCUIwUkFUXzIJCQkweDAwMDAwMjAwICAvKiBCYW5rIDAgUmVhZCBBY2Nlc3MgVGltZSA9IDIgY3ljbGVzICovCisjZGVmaW5lCUIwUkFUXzMJCQkweDAwMDAwMzAwICAvKiBCYW5rIDAgUmVhZCBBY2Nlc3MgVGltZSA9IDMgY3ljbGVzICovCisjZGVmaW5lCUIwUkFUXzQJCQkweDAwMDAwNDAwICAvKiBCYW5rIDAgUmVhZCBBY2Nlc3MgVGltZSA9IDQgY3ljbGVzICovCisjZGVmaW5lCUIwUkFUXzUJCQkweDAwMDAwNTAwICAvKiBCYW5rIDAgUmVhZCBBY2Nlc3MgVGltZSA9IDUgY3ljbGVzICovCisjZGVmaW5lCUIwUkFUXzYJCQkweDAwMDAwNjAwICAvKiBCYW5rIDAgUmVhZCBBY2Nlc3MgVGltZSA9IDYgY3ljbGVzICovCisjZGVmaW5lCUIwUkFUXzcJCQkweDAwMDAwNzAwICAvKiBCYW5rIDAgUmVhZCBBY2Nlc3MgVGltZSA9IDcgY3ljbGVzICovCisjZGVmaW5lCUIwUkFUXzgJCQkweDAwMDAwODAwICAvKiBCYW5rIDAgUmVhZCBBY2Nlc3MgVGltZSA9IDggY3ljbGVzICovCisjZGVmaW5lCUIwUkFUXzkJCQkweDAwMDAwOTAwICAvKiBCYW5rIDAgUmVhZCBBY2Nlc3MgVGltZSA9IDkgY3ljbGVzICovCisjZGVmaW5lCUIwUkFUXzEwCQkweDAwMDAwQTAwICAvKiBCYW5rIDAgUmVhZCBBY2Nlc3MgVGltZSA9IDEwIGN5Y2xlcyAqLworI2RlZmluZQlCMFJBVF8xMQkJMHgwMDAwMEIwMCAgLyogQmFuayAwIFJlYWQgQWNjZXNzIFRpbWUgPSAxMSBjeWNsZXMgKi8KKyNkZWZpbmUJQjBSQVRfMTIJCTB4MDAwMDBDMDAgIC8qIEJhbmsgMCBSZWFkIEFjY2VzcyBUaW1lID0gMTIgY3ljbGVzICovCisjZGVmaW5lCUIwUkFUXzEzCQkweDAwMDAwRDAwICAvKiBCYW5rIDAgUmVhZCBBY2Nlc3MgVGltZSA9IDEzIGN5Y2xlcyAqLworI2RlZmluZQlCMFJBVF8xNAkJMHgwMDAwMEUwMCAgLyogQmFuayAwIFJlYWQgQWNjZXNzIFRpbWUgPSAxNCBjeWNsZXMgKi8KKyNkZWZpbmUJQjBSQVRfMTUJCTB4MDAwMDBGMDAgIC8qIEJhbmsgMCBSZWFkIEFjY2VzcyBUaW1lID0gMTUgY3ljbGVzICovCisjZGVmaW5lCUIwV0FUXzEJCQkweDAwMDAxMDAwICAvKiBCYW5rIDAgV3JpdGUgQWNjZXNzIFRpbWUJPSAxIGN5Y2xlICovCisjZGVmaW5lCUIwV0FUXzIJCQkweDAwMDAyMDAwICAvKiBCYW5rIDAgV3JpdGUgQWNjZXNzIFRpbWUJPSAyIGN5Y2xlcyAqLworI2RlZmluZQlCMFdBVF8zCQkJMHgwMDAwMzAwMCAgLyogQmFuayAwIFdyaXRlIEFjY2VzcyBUaW1lCT0gMyBjeWNsZXMgKi8KKyNkZWZpbmUJQjBXQVRfNAkJCTB4MDAwMDQwMDAgIC8qIEJhbmsgMCBXcml0ZSBBY2Nlc3MgVGltZQk9IDQgY3ljbGVzICovCisjZGVmaW5lCUIwV0FUXzUJCQkweDAwMDA1MDAwICAvKiBCYW5rIDAgV3JpdGUgQWNjZXNzIFRpbWUJPSA1IGN5Y2xlcyAqLworI2RlZmluZQlCMFdBVF82CQkJMHgwMDAwNjAwMCAgLyogQmFuayAwIFdyaXRlIEFjY2VzcyBUaW1lCT0gNiBjeWNsZXMgKi8KKyNkZWZpbmUJQjBXQVRfNwkJCTB4MDAwMDcwMDAgIC8qIEJhbmsgMCBXcml0ZSBBY2Nlc3MgVGltZQk9IDcgY3ljbGVzICovCisjZGVmaW5lCUIwV0FUXzgJCQkweDAwMDA4MDAwICAvKiBCYW5rIDAgV3JpdGUgQWNjZXNzIFRpbWUJPSA4IGN5Y2xlcyAqLworI2RlZmluZQlCMFdBVF85CQkJMHgwMDAwOTAwMCAgLyogQmFuayAwIFdyaXRlIEFjY2VzcyBUaW1lCT0gOSBjeWNsZXMgKi8KKyNkZWZpbmUJQjBXQVRfMTAJCTB4MDAwMEEwMDAgIC8qIEJhbmsgMCBXcml0ZSBBY2Nlc3MgVGltZQk9IDEwIGN5Y2xlcyAqLworI2RlZmluZQlCMFdBVF8xMQkJMHgwMDAwQjAwMCAgLyogQmFuayAwIFdyaXRlIEFjY2VzcyBUaW1lCT0gMTEgY3ljbGVzICovCisjZGVmaW5lCUIwV0FUXzEyCQkweDAwMDBDMDAwICAvKiBCYW5rIDAgV3JpdGUgQWNjZXNzIFRpbWUJPSAxMiBjeWNsZXMgKi8KKyNkZWZpbmUJQjBXQVRfMTMJCTB4MDAwMEQwMDAgIC8qIEJhbmsgMCBXcml0ZSBBY2Nlc3MgVGltZQk9IDEzIGN5Y2xlcyAqLworI2RlZmluZQlCMFdBVF8xNAkJMHgwMDAwRTAwMCAgLyogQmFuayAwIFdyaXRlIEFjY2VzcyBUaW1lCT0gMTQgY3ljbGVzICovCisjZGVmaW5lCUIwV0FUXzE1CQkweDAwMDBGMDAwICAvKiBCYW5rIDAgV3JpdGUgQWNjZXNzIFRpbWUJPSAxNSBjeWNsZXMgKi8KKyNkZWZpbmUJQjFSRFlFTgkJCTB4MDAwMTAwMDAgIC8qIEJhbmsgMSBSRFkgZW5hYmxlLCAwPWRpc2FibGUsIDE9ZW5hYmxlICovCisjZGVmaW5lCUIxUkRZUE9MCQkweDAwMDIwMDAwICAvKiBCYW5rIDEgUkRZIEFjdGl2ZSBoaWdoLCAwPWFjdGl2ZQlsb3csIDE9YWN0aXZlIGhpZ2ggKi8KKyNkZWZpbmUJQjFUVF8xCQkJMHgwMDA0MDAwMCAgLyogQmFuayAxIFRyYW5zaXRpb24gVGltZSBmcm9tIFJlYWQJdG8gV3JpdGUgPSAxIGN5Y2xlICovCisjZGVmaW5lCUIxVFRfMgkJCTB4MDAwODAwMDAgIC8qIEJhbmsgMSBUcmFuc2l0aW9uIFRpbWUgZnJvbSBSZWFkCXRvIFdyaXRlID0gMiBjeWNsZXMgKi8KKyNkZWZpbmUJQjFUVF8zCQkJMHgwMDBDMDAwMCAgLyogQmFuayAxIFRyYW5zaXRpb24gVGltZSBmcm9tIFJlYWQJdG8gV3JpdGUgPSAzIGN5Y2xlcyAqLworI2RlZmluZQlCMVRUXzQJCQkweDAwMDAwMDAwICAvKiBCYW5rIDEgVHJhbnNpdGlvbiBUaW1lIGZyb20gUmVhZAl0byBXcml0ZSA9IDQgY3ljbGVzICovCisjZGVmaW5lCUIxU1RfMQkJCTB4MDAxMDAwMDAgIC8qIEJhbmsgMSBTZXR1cCBUaW1lIGZyb20gQU9FIGFzc2VydGVkIHRvIFJlYWQgb3IgV3JpdGUgYXNzZXJ0ZWQgPSAxIGN5Y2xlICovCisjZGVmaW5lCUIxU1RfMgkJCTB4MDAyMDAwMDAgIC8qIEJhbmsgMSBTZXR1cCBUaW1lIGZyb20gQU9FIGFzc2VydGVkIHRvIFJlYWQgb3IgV3JpdGUgYXNzZXJ0ZWQgPSAyIGN5Y2xlcyAqLworI2RlZmluZQlCMVNUXzMJCQkweDAwMzAwMDAwICAvKiBCYW5rIDEgU2V0dXAgVGltZSBmcm9tIEFPRSBhc3NlcnRlZCB0byBSZWFkIG9yIFdyaXRlIGFzc2VydGVkID0gMyBjeWNsZXMgKi8KKyNkZWZpbmUJQjFTVF80CQkJMHgwMDAwMDAwMCAgLyogQmFuayAxIFNldHVwIFRpbWUgZnJvbSBBT0UgYXNzZXJ0ZWQgdG8gUmVhZCBvciBXcml0ZSBhc3NlcnRlZCA9IDQgY3ljbGVzICovCisjZGVmaW5lCUIxSFRfMQkJCTB4MDA0MDAwMDAgIC8qIEJhbmsgMSBIb2xkIFRpbWUJZnJvbSBSZWFkIG9yIFdyaXRlIGRlYXNzZXJ0ZWQgdG8gQU9FIGRlYXNzZXJ0ZWQJPSAxIGN5Y2xlICovCisjZGVmaW5lCUIxSFRfMgkJCTB4MDA4MDAwMDAgIC8qIEJhbmsgMSBIb2xkIFRpbWUJZnJvbSBSZWFkIG9yIFdyaXRlIGRlYXNzZXJ0ZWQgdG8gQU9FIGRlYXNzZXJ0ZWQJPSAyIGN5Y2xlcyAqLworI2RlZmluZQlCMUhUXzMJCQkweDAwQzAwMDAwICAvKiBCYW5rIDEgSG9sZCBUaW1lCWZyb20gUmVhZCBvciBXcml0ZSBkZWFzc2VydGVkIHRvIEFPRSBkZWFzc2VydGVkCT0gMyBjeWNsZXMgKi8KKyNkZWZpbmUJQjFIVF8wCQkJMHgwMDAwMDAwMCAgLyogQmFuayAxIEhvbGQgVGltZQlmcm9tIFJlYWQgb3IgV3JpdGUgZGVhc3NlcnRlZCB0byBBT0UgZGVhc3NlcnRlZAk9IDAgY3ljbGVzICovCisjZGVmaW5lCUIxUkFUXzEJCQkweDAxMDAwMDAwICAvKiBCYW5rIDEgUmVhZCBBY2Nlc3MgVGltZSA9IDEgY3ljbGUgKi8KKyNkZWZpbmUJQjFSQVRfMgkJCTB4MDIwMDAwMDAgIC8qIEJhbmsgMSBSZWFkIEFjY2VzcyBUaW1lID0gMiBjeWNsZXMgKi8KKyNkZWZpbmUJQjFSQVRfMwkJCTB4MDMwMDAwMDAgIC8qIEJhbmsgMSBSZWFkIEFjY2VzcyBUaW1lID0gMyBjeWNsZXMgKi8KKyNkZWZpbmUJQjFSQVRfNAkJCTB4MDQwMDAwMDAgIC8qIEJhbmsgMSBSZWFkIEFjY2VzcyBUaW1lID0gNCBjeWNsZXMgKi8KKyNkZWZpbmUJQjFSQVRfNQkJCTB4MDUwMDAwMDAgIC8qIEJhbmsgMSBSZWFkIEFjY2VzcyBUaW1lID0gNSBjeWNsZXMgKi8KKyNkZWZpbmUJQjFSQVRfNgkJCTB4MDYwMDAwMDAgIC8qIEJhbmsgMSBSZWFkIEFjY2VzcyBUaW1lID0gNiBjeWNsZXMgKi8KKyNkZWZpbmUJQjFSQVRfNwkJCTB4MDcwMDAwMDAgIC8qIEJhbmsgMSBSZWFkIEFjY2VzcyBUaW1lID0gNyBjeWNsZXMgKi8KKyNkZWZpbmUJQjFSQVRfOAkJCTB4MDgwMDAwMDAgIC8qIEJhbmsgMSBSZWFkIEFjY2VzcyBUaW1lID0gOCBjeWNsZXMgKi8KKyNkZWZpbmUJQjFSQVRfOQkJCTB4MDkwMDAwMDAgIC8qIEJhbmsgMSBSZWFkIEFjY2VzcyBUaW1lID0gOSBjeWNsZXMgKi8KKyNkZWZpbmUJQjFSQVRfMTAJCTB4MEEwMDAwMDAgIC8qIEJhbmsgMSBSZWFkIEFjY2VzcyBUaW1lID0gMTAgY3ljbGVzICovCisjZGVmaW5lCUIxUkFUXzExCQkweDBCMDAwMDAwICAvKiBCYW5rIDEgUmVhZCBBY2Nlc3MgVGltZSA9IDExIGN5Y2xlcyAqLworI2RlZmluZQlCMVJBVF8xMgkJMHgwQzAwMDAwMCAgLyogQmFuayAxIFJlYWQgQWNjZXNzIFRpbWUgPSAxMiBjeWNsZXMgKi8KKyNkZWZpbmUJQjFSQVRfMTMJCTB4MEQwMDAwMDAgIC8qIEJhbmsgMSBSZWFkIEFjY2VzcyBUaW1lID0gMTMgY3ljbGVzICovCisjZGVmaW5lCUIxUkFUXzE0CQkweDBFMDAwMDAwICAvKiBCYW5rIDEgUmVhZCBBY2Nlc3MgVGltZSA9IDE0IGN5Y2xlcyAqLworI2RlZmluZQlCMVJBVF8xNQkJMHgwRjAwMDAwMCAgLyogQmFuayAxIFJlYWQgQWNjZXNzIFRpbWUgPSAxNSBjeWNsZXMgKi8KKyNkZWZpbmUJQjFXQVRfMQkJCTB4MTAwMDAwMDAgLyogQmFuayAxIFdyaXRlIEFjY2VzcyBUaW1lID0gMSBjeWNsZSAqLworI2RlZmluZQlCMVdBVF8yCQkJMHgyMDAwMDAwMCAgLyogQmFuayAxIFdyaXRlIEFjY2VzcyBUaW1lCT0gMiBjeWNsZXMgKi8KKyNkZWZpbmUJQjFXQVRfMwkJCTB4MzAwMDAwMDAgIC8qIEJhbmsgMSBXcml0ZSBBY2Nlc3MgVGltZQk9IDMgY3ljbGVzICovCisjZGVmaW5lCUIxV0FUXzQJCQkweDQwMDAwMDAwICAvKiBCYW5rIDEgV3JpdGUgQWNjZXNzIFRpbWUJPSA0IGN5Y2xlcyAqLworI2RlZmluZQlCMVdBVF81CQkJMHg1MDAwMDAwMCAgLyogQmFuayAxIFdyaXRlIEFjY2VzcyBUaW1lCT0gNSBjeWNsZXMgKi8KKyNkZWZpbmUJQjFXQVRfNgkJCTB4NjAwMDAwMDAgIC8qIEJhbmsgMSBXcml0ZSBBY2Nlc3MgVGltZQk9IDYgY3ljbGVzICovCisjZGVmaW5lCUIxV0FUXzcJCQkweDcwMDAwMDAwICAvKiBCYW5rIDEgV3JpdGUgQWNjZXNzIFRpbWUJPSA3IGN5Y2xlcyAqLworI2RlZmluZQlCMVdBVF84CQkJMHg4MDAwMDAwMCAgLyogQmFuayAxIFdyaXRlIEFjY2VzcyBUaW1lCT0gOCBjeWNsZXMgKi8KKyNkZWZpbmUJQjFXQVRfOQkJCTB4OTAwMDAwMDAgIC8qIEJhbmsgMSBXcml0ZSBBY2Nlc3MgVGltZQk9IDkgY3ljbGVzICovCisjZGVmaW5lCUIxV0FUXzEwCQkweEEwMDAwMDAwICAvKiBCYW5rIDEgV3JpdGUgQWNjZXNzIFRpbWUJPSAxMCBjeWNsZXMgKi8KKyNkZWZpbmUJQjFXQVRfMTEJCTB4QjAwMDAwMDAgIC8qIEJhbmsgMSBXcml0ZSBBY2Nlc3MgVGltZQk9IDExIGN5Y2xlcyAqLworI2RlZmluZQlCMVdBVF8xMgkJMHhDMDAwMDAwMCAgLyogQmFuayAxIFdyaXRlIEFjY2VzcyBUaW1lCT0gMTIgY3ljbGVzICovCisjZGVmaW5lCUIxV0FUXzEzCQkweEQwMDAwMDAwICAvKiBCYW5rIDEgV3JpdGUgQWNjZXNzIFRpbWUJPSAxMyBjeWNsZXMgKi8KKyNkZWZpbmUJQjFXQVRfMTQJCTB4RTAwMDAwMDAgIC8qIEJhbmsgMSBXcml0ZSBBY2Nlc3MgVGltZQk9IDE0IGN5Y2xlcyAqLworI2RlZmluZQlCMVdBVF8xNQkJMHhGMDAwMDAwMCAgLyogQmFuayAxIFdyaXRlIEFjY2VzcyBUaW1lCT0gMTUgY3ljbGVzICovCisKKy8qIEVCSVVfQU1CQ1RMMQlNYXNrcyAqLworI2RlZmluZQlCMlJEWUVOCQkJMHgwMDAwMDAwMSAgLyogQmFuayAyIFJEWSBFbmFibGUsIDA9ZGlzYWJsZSwgMT1lbmFibGUgKi8KKyNkZWZpbmUJQjJSRFlQT0wJCTB4MDAwMDAwMDIgIC8qIEJhbmsgMiBSRFkgQWN0aXZlIGhpZ2gsIDA9YWN0aXZlCWxvdywgMT1hY3RpdmUgaGlnaCAqLworI2RlZmluZQlCMlRUXzEJCQkweDAwMDAwMDA0ICAvKiBCYW5rIDIgVHJhbnNpdGlvbiBUaW1lIGZyb20gUmVhZAl0byBXcml0ZSA9IDEgY3ljbGUgKi8KKyNkZWZpbmUJQjJUVF8yCQkJMHgwMDAwMDAwOCAgLyogQmFuayAyIFRyYW5zaXRpb24gVGltZSBmcm9tIFJlYWQJdG8gV3JpdGUgPSAyIGN5Y2xlcyAqLworI2RlZmluZQlCMlRUXzMJCQkweDAwMDAwMDBDICAvKiBCYW5rIDIgVHJhbnNpdGlvbiBUaW1lIGZyb20gUmVhZAl0byBXcml0ZSA9IDMgY3ljbGVzICovCisjZGVmaW5lCUIyVFRfNAkJCTB4MDAwMDAwMDAgIC8qIEJhbmsgMiBUcmFuc2l0aW9uIFRpbWUgZnJvbSBSZWFkCXRvIFdyaXRlID0gNCBjeWNsZXMgKi8KKyNkZWZpbmUJQjJTVF8xCQkJMHgwMDAwMDAxMCAgLyogQmFuayAyIFNldHVwIFRpbWUgZnJvbSBBT0UgYXNzZXJ0ZWQgdG8gUmVhZCBvciBXcml0ZSBhc3NlcnRlZCA9IDEgY3ljbGUgKi8KKyNkZWZpbmUJQjJTVF8yCQkJMHgwMDAwMDAyMCAgLyogQmFuayAyIFNldHVwIFRpbWUgZnJvbSBBT0UgYXNzZXJ0ZWQgdG8gUmVhZCBvciBXcml0ZSBhc3NlcnRlZCA9IDIgY3ljbGVzICovCisjZGVmaW5lCUIyU1RfMwkJCTB4MDAwMDAwMzAgIC8qIEJhbmsgMiBTZXR1cCBUaW1lIGZyb20gQU9FIGFzc2VydGVkIHRvIFJlYWQgb3IgV3JpdGUgYXNzZXJ0ZWQgPSAzIGN5Y2xlcyAqLworI2RlZmluZQlCMlNUXzQJCQkweDAwMDAwMDAwICAvKiBCYW5rIDIgU2V0dXAgVGltZSBmcm9tIEFPRSBhc3NlcnRlZCB0byBSZWFkIG9yIFdyaXRlIGFzc2VydGVkID0gNCBjeWNsZXMgKi8KKyNkZWZpbmUJQjJIVF8xCQkJMHgwMDAwMDA0MCAgLyogQmFuayAyIEhvbGQgVGltZQlmcm9tIFJlYWQgb3IgV3JpdGUgZGVhc3NlcnRlZCB0byBBT0UgZGVhc3NlcnRlZAk9IDEgY3ljbGUgKi8KKyNkZWZpbmUJQjJIVF8yCQkJMHgwMDAwMDA4MCAgLyogQmFuayAyIEhvbGQgVGltZQlmcm9tIFJlYWQgb3IgV3JpdGUgZGVhc3NlcnRlZCB0byBBT0UgZGVhc3NlcnRlZAk9IDIgY3ljbGVzICovCisjZGVmaW5lCUIySFRfMwkJCTB4MDAwMDAwQzAgIC8qIEJhbmsgMiBIb2xkIFRpbWUJZnJvbSBSZWFkIG9yIFdyaXRlIGRlYXNzZXJ0ZWQgdG8gQU9FIGRlYXNzZXJ0ZWQJPSAzIGN5Y2xlcyAqLworI2RlZmluZQlCMkhUXzAJCQkweDAwMDAwMDAwICAvKiBCYW5rIDIgSG9sZCBUaW1lCWZyb20gUmVhZCBvciBXcml0ZSBkZWFzc2VydGVkIHRvIEFPRSBkZWFzc2VydGVkCT0gMCBjeWNsZXMgKi8KKyNkZWZpbmUJQjJSQVRfMQkJCTB4MDAwMDAxMDAgIC8qIEJhbmsgMiBSZWFkIEFjY2VzcyBUaW1lID0gMSBjeWNsZSAqLworI2RlZmluZQlCMlJBVF8yCQkJMHgwMDAwMDIwMCAgLyogQmFuayAyIFJlYWQgQWNjZXNzIFRpbWUgPSAyIGN5Y2xlcyAqLworI2RlZmluZQlCMlJBVF8zCQkJMHgwMDAwMDMwMCAgLyogQmFuayAyIFJlYWQgQWNjZXNzIFRpbWUgPSAzIGN5Y2xlcyAqLworI2RlZmluZQlCMlJBVF80CQkJMHgwMDAwMDQwMCAgLyogQmFuayAyIFJlYWQgQWNjZXNzIFRpbWUgPSA0IGN5Y2xlcyAqLworI2RlZmluZQlCMlJBVF81CQkJMHgwMDAwMDUwMCAgLyogQmFuayAyIFJlYWQgQWNjZXNzIFRpbWUgPSA1IGN5Y2xlcyAqLworI2RlZmluZQlCMlJBVF82CQkJMHgwMDAwMDYwMCAgLyogQmFuayAyIFJlYWQgQWNjZXNzIFRpbWUgPSA2IGN5Y2xlcyAqLworI2RlZmluZQlCMlJBVF83CQkJMHgwMDAwMDcwMCAgLyogQmFuayAyIFJlYWQgQWNjZXNzIFRpbWUgPSA3IGN5Y2xlcyAqLworI2RlZmluZQlCMlJBVF84CQkJMHgwMDAwMDgwMCAgLyogQmFuayAyIFJlYWQgQWNjZXNzIFRpbWUgPSA4IGN5Y2xlcyAqLworI2RlZmluZQlCMlJBVF85CQkJMHgwMDAwMDkwMCAgLyogQmFuayAyIFJlYWQgQWNjZXNzIFRpbWUgPSA5IGN5Y2xlcyAqLworI2RlZmluZQlCMlJBVF8xMAkJMHgwMDAwMEEwMCAgLyogQmFuayAyIFJlYWQgQWNjZXNzIFRpbWUgPSAxMCBjeWNsZXMgKi8KKyNkZWZpbmUJQjJSQVRfMTEJCTB4MDAwMDBCMDAgIC8qIEJhbmsgMiBSZWFkIEFjY2VzcyBUaW1lID0gMTEgY3ljbGVzICovCisjZGVmaW5lCUIyUkFUXzEyCQkweDAwMDAwQzAwICAvKiBCYW5rIDIgUmVhZCBBY2Nlc3MgVGltZSA9IDEyIGN5Y2xlcyAqLworI2RlZmluZQlCMlJBVF8xMwkJMHgwMDAwMEQwMCAgLyogQmFuayAyIFJlYWQgQWNjZXNzIFRpbWUgPSAxMyBjeWNsZXMgKi8KKyNkZWZpbmUJQjJSQVRfMTQJCTB4MDAwMDBFMDAgIC8qIEJhbmsgMiBSZWFkIEFjY2VzcyBUaW1lID0gMTQgY3ljbGVzICovCisjZGVmaW5lCUIyUkFUXzE1CQkweDAwMDAwRjAwICAvKiBCYW5rIDIgUmVhZCBBY2Nlc3MgVGltZSA9IDE1IGN5Y2xlcyAqLworI2RlZmluZQlCMldBVF8xCQkJMHgwMDAwMTAwMCAgLyogQmFuayAyIFdyaXRlIEFjY2VzcyBUaW1lCT0gMSBjeWNsZSAqLworI2RlZmluZQlCMldBVF8yCQkJMHgwMDAwMjAwMCAgLyogQmFuayAyIFdyaXRlIEFjY2VzcyBUaW1lCT0gMiBjeWNsZXMgKi8KKyNkZWZpbmUJQjJXQVRfMwkJCTB4MDAwMDMwMDAgIC8qIEJhbmsgMiBXcml0ZSBBY2Nlc3MgVGltZQk9IDMgY3ljbGVzICovCisjZGVmaW5lCUIyV0FUXzQJCQkweDAwMDA0MDAwICAvKiBCYW5rIDIgV3JpdGUgQWNjZXNzIFRpbWUJPSA0IGN5Y2xlcyAqLworI2RlZmluZQlCMldBVF81CQkJMHgwMDAwNTAwMCAgLyogQmFuayAyIFdyaXRlIEFjY2VzcyBUaW1lCT0gNSBjeWNsZXMgKi8KKyNkZWZpbmUJQjJXQVRfNgkJCTB4MDAwMDYwMDAgIC8qIEJhbmsgMiBXcml0ZSBBY2Nlc3MgVGltZQk9IDYgY3ljbGVzICovCisjZGVmaW5lCUIyV0FUXzcJCQkweDAwMDA3MDAwICAvKiBCYW5rIDIgV3JpdGUgQWNjZXNzIFRpbWUJPSA3IGN5Y2xlcyAqLworI2RlZmluZQlCMldBVF84CQkJMHgwMDAwODAwMCAgLyogQmFuayAyIFdyaXRlIEFjY2VzcyBUaW1lCT0gOCBjeWNsZXMgKi8KKyNkZWZpbmUJQjJXQVRfOQkJCTB4MDAwMDkwMDAgIC8qIEJhbmsgMiBXcml0ZSBBY2Nlc3MgVGltZQk9IDkgY3ljbGVzICovCisjZGVmaW5lCUIyV0FUXzEwCQkweDAwMDBBMDAwICAvKiBCYW5rIDIgV3JpdGUgQWNjZXNzIFRpbWUJPSAxMCBjeWNsZXMgKi8KKyNkZWZpbmUJQjJXQVRfMTEJCTB4MDAwMEIwMDAgIC8qIEJhbmsgMiBXcml0ZSBBY2Nlc3MgVGltZQk9IDExIGN5Y2xlcyAqLworI2RlZmluZQlCMldBVF8xMgkJMHgwMDAwQzAwMCAgLyogQmFuayAyIFdyaXRlIEFjY2VzcyBUaW1lCT0gMTIgY3ljbGVzICovCisjZGVmaW5lCUIyV0FUXzEzCQkweDAwMDBEMDAwICAvKiBCYW5rIDIgV3JpdGUgQWNjZXNzIFRpbWUJPSAxMyBjeWNsZXMgKi8KKyNkZWZpbmUJQjJXQVRfMTQJCTB4MDAwMEUwMDAgIC8qIEJhbmsgMiBXcml0ZSBBY2Nlc3MgVGltZQk9IDE0IGN5Y2xlcyAqLworI2RlZmluZQlCMldBVF8xNQkJMHgwMDAwRjAwMCAgLyogQmFuayAyIFdyaXRlIEFjY2VzcyBUaW1lCT0gMTUgY3ljbGVzICovCisjZGVmaW5lCUIzUkRZRU4JCQkweDAwMDEwMDAwICAvKiBCYW5rIDMgUkRZIGVuYWJsZSwgMD1kaXNhYmxlLCAxPWVuYWJsZSAqLworI2RlZmluZQlCM1JEWVBPTAkJMHgwMDAyMDAwMCAgLyogQmFuayAzIFJEWSBBY3RpdmUgaGlnaCwgMD1hY3RpdmUJbG93LCAxPWFjdGl2ZSBoaWdoICovCisjZGVmaW5lCUIzVFRfMQkJCTB4MDAwNDAwMDAgIC8qIEJhbmsgMyBUcmFuc2l0aW9uIFRpbWUgZnJvbSBSZWFkCXRvIFdyaXRlID0gMSBjeWNsZSAqLworI2RlZmluZQlCM1RUXzIJCQkweDAwMDgwMDAwICAvKiBCYW5rIDMgVHJhbnNpdGlvbiBUaW1lIGZyb20gUmVhZAl0byBXcml0ZSA9IDIgY3ljbGVzICovCisjZGVmaW5lCUIzVFRfMwkJCTB4MDAwQzAwMDAgIC8qIEJhbmsgMyBUcmFuc2l0aW9uIFRpbWUgZnJvbSBSZWFkCXRvIFdyaXRlID0gMyBjeWNsZXMgKi8KKyNkZWZpbmUJQjNUVF80CQkJMHgwMDAwMDAwMCAgLyogQmFuayAzIFRyYW5zaXRpb24gVGltZSBmcm9tIFJlYWQJdG8gV3JpdGUgPSA0IGN5Y2xlcyAqLworI2RlZmluZQlCM1NUXzEJCQkweDAwMTAwMDAwICAvKiBCYW5rIDMgU2V0dXAgVGltZSBmcm9tIEFPRSBhc3NlcnRlZCB0byBSZWFkIG9yIFdyaXRlIGFzc2VydGVkID0gMSBjeWNsZSAqLworI2RlZmluZQlCM1NUXzIJCQkweDAwMjAwMDAwICAvKiBCYW5rIDMgU2V0dXAgVGltZSBmcm9tIEFPRSBhc3NlcnRlZCB0byBSZWFkIG9yIFdyaXRlIGFzc2VydGVkID0gMiBjeWNsZXMgKi8KKyNkZWZpbmUJQjNTVF8zCQkJMHgwMDMwMDAwMCAgLyogQmFuayAzIFNldHVwIFRpbWUgZnJvbSBBT0UgYXNzZXJ0ZWQgdG8gUmVhZCBvciBXcml0ZSBhc3NlcnRlZCA9IDMgY3ljbGVzICovCisjZGVmaW5lCUIzU1RfNAkJCTB4MDAwMDAwMDAgIC8qIEJhbmsgMyBTZXR1cCBUaW1lIGZyb20gQU9FIGFzc2VydGVkIHRvIFJlYWQgb3IgV3JpdGUgYXNzZXJ0ZWQgPSA0IGN5Y2xlcyAqLworI2RlZmluZQlCM0hUXzEJCQkweDAwNDAwMDAwICAvKiBCYW5rIDMgSG9sZCBUaW1lCWZyb20gUmVhZCBvciBXcml0ZSBkZWFzc2VydGVkIHRvIEFPRSBkZWFzc2VydGVkCT0gMSBjeWNsZSAqLworI2RlZmluZQlCM0hUXzIJCQkweDAwODAwMDAwICAvKiBCYW5rIDMgSG9sZCBUaW1lCWZyb20gUmVhZCBvciBXcml0ZSBkZWFzc2VydGVkIHRvIEFPRSBkZWFzc2VydGVkCT0gMiBjeWNsZXMgKi8KKyNkZWZpbmUJQjNIVF8zCQkJMHgwMEMwMDAwMCAgLyogQmFuayAzIEhvbGQgVGltZQlmcm9tIFJlYWQgb3IgV3JpdGUgZGVhc3NlcnRlZCB0byBBT0UgZGVhc3NlcnRlZAk9IDMgY3ljbGVzICovCisjZGVmaW5lCUIzSFRfMAkJCTB4MDAwMDAwMDAgIC8qIEJhbmsgMyBIb2xkIFRpbWUJZnJvbSBSZWFkIG9yIFdyaXRlIGRlYXNzZXJ0ZWQgdG8gQU9FIGRlYXNzZXJ0ZWQJPSAwIGN5Y2xlcyAqLworI2RlZmluZQlCM1JBVF8xCQkJMHgwMTAwMDAwMCAvKiBCYW5rIDMgUmVhZCBBY2Nlc3MgVGltZSA9CTEgY3ljbGUgKi8KKyNkZWZpbmUJQjNSQVRfMgkJCTB4MDIwMDAwMDAgIC8qIEJhbmsgMyBSZWFkIEFjY2VzcyBUaW1lID0gMiBjeWNsZXMgKi8KKyNkZWZpbmUJQjNSQVRfMwkJCTB4MDMwMDAwMDAgIC8qIEJhbmsgMyBSZWFkIEFjY2VzcyBUaW1lID0gMyBjeWNsZXMgKi8KKyNkZWZpbmUJQjNSQVRfNAkJCTB4MDQwMDAwMDAgIC8qIEJhbmsgMyBSZWFkIEFjY2VzcyBUaW1lID0gNCBjeWNsZXMgKi8KKyNkZWZpbmUJQjNSQVRfNQkJCTB4MDUwMDAwMDAgIC8qIEJhbmsgMyBSZWFkIEFjY2VzcyBUaW1lID0gNSBjeWNsZXMgKi8KKyNkZWZpbmUJQjNSQVRfNgkJCTB4MDYwMDAwMDAgIC8qIEJhbmsgMyBSZWFkIEFjY2VzcyBUaW1lID0gNiBjeWNsZXMgKi8KKyNkZWZpbmUJQjNSQVRfNwkJCTB4MDcwMDAwMDAgIC8qIEJhbmsgMyBSZWFkIEFjY2VzcyBUaW1lID0gNyBjeWNsZXMgKi8KKyNkZWZpbmUJQjNSQVRfOAkJCTB4MDgwMDAwMDAgIC8qIEJhbmsgMyBSZWFkIEFjY2VzcyBUaW1lID0gOCBjeWNsZXMgKi8KKyNkZWZpbmUJQjNSQVRfOQkJCTB4MDkwMDAwMDAgIC8qIEJhbmsgMyBSZWFkIEFjY2VzcyBUaW1lID0gOSBjeWNsZXMgKi8KKyNkZWZpbmUJQjNSQVRfMTAJCTB4MEEwMDAwMDAgIC8qIEJhbmsgMyBSZWFkIEFjY2VzcyBUaW1lID0gMTAgY3ljbGVzICovCisjZGVmaW5lCUIzUkFUXzExCQkweDBCMDAwMDAwICAvKiBCYW5rIDMgUmVhZCBBY2Nlc3MgVGltZSA9IDExIGN5Y2xlcyAqLworI2RlZmluZQlCM1JBVF8xMgkJMHgwQzAwMDAwMCAgLyogQmFuayAzIFJlYWQgQWNjZXNzIFRpbWUgPSAxMiBjeWNsZXMgKi8KKyNkZWZpbmUJQjNSQVRfMTMJCTB4MEQwMDAwMDAgIC8qIEJhbmsgMyBSZWFkIEFjY2VzcyBUaW1lID0gMTMgY3ljbGVzICovCisjZGVmaW5lCUIzUkFUXzE0CQkweDBFMDAwMDAwICAvKiBCYW5rIDMgUmVhZCBBY2Nlc3MgVGltZSA9IDE0IGN5Y2xlcyAqLworI2RlZmluZQlCM1JBVF8xNQkJMHgwRjAwMDAwMCAgLyogQmFuayAzIFJlYWQgQWNjZXNzIFRpbWUgPSAxNSBjeWNsZXMgKi8KKyNkZWZpbmUJQjNXQVRfMQkJCTB4MTAwMDAwMDAgLyogQmFuayAzIFdyaXRlIEFjY2VzcyBUaW1lID0gMSBjeWNsZSAqLworI2RlZmluZQlCM1dBVF8yCQkJMHgyMDAwMDAwMCAgLyogQmFuayAzIFdyaXRlIEFjY2VzcyBUaW1lCT0gMiBjeWNsZXMgKi8KKyNkZWZpbmUJQjNXQVRfMwkJCTB4MzAwMDAwMDAgIC8qIEJhbmsgMyBXcml0ZSBBY2Nlc3MgVGltZQk9IDMgY3ljbGVzICovCisjZGVmaW5lCUIzV0FUXzQJCQkweDQwMDAwMDAwICAvKiBCYW5rIDMgV3JpdGUgQWNjZXNzIFRpbWUJPSA0IGN5Y2xlcyAqLworI2RlZmluZQlCM1dBVF81CQkJMHg1MDAwMDAwMCAgLyogQmFuayAzIFdyaXRlIEFjY2VzcyBUaW1lCT0gNSBjeWNsZXMgKi8KKyNkZWZpbmUJQjNXQVRfNgkJCTB4NjAwMDAwMDAgIC8qIEJhbmsgMyBXcml0ZSBBY2Nlc3MgVGltZQk9IDYgY3ljbGVzICovCisjZGVmaW5lCUIzV0FUXzcJCQkweDcwMDAwMDAwICAvKiBCYW5rIDMgV3JpdGUgQWNjZXNzIFRpbWUJPSA3IGN5Y2xlcyAqLworI2RlZmluZQlCM1dBVF84CQkJMHg4MDAwMDAwMCAgLyogQmFuayAzIFdyaXRlIEFjY2VzcyBUaW1lCT0gOCBjeWNsZXMgKi8KKyNkZWZpbmUJQjNXQVRfOQkJCTB4OTAwMDAwMDAgIC8qIEJhbmsgMyBXcml0ZSBBY2Nlc3MgVGltZQk9IDkgY3ljbGVzICovCisjZGVmaW5lCUIzV0FUXzEwCQkweEEwMDAwMDAwICAvKiBCYW5rIDMgV3JpdGUgQWNjZXNzIFRpbWUJPSAxMCBjeWNsZXMgKi8KKyNkZWZpbmUJQjNXQVRfMTEJCTB4QjAwMDAwMDAgIC8qIEJhbmsgMyBXcml0ZSBBY2Nlc3MgVGltZQk9IDExIGN5Y2xlcyAqLworI2RlZmluZQlCM1dBVF8xMgkJMHhDMDAwMDAwMCAgLyogQmFuayAzIFdyaXRlIEFjY2VzcyBUaW1lCT0gMTIgY3ljbGVzICovCisjZGVmaW5lCUIzV0FUXzEzCQkweEQwMDAwMDAwICAvKiBCYW5rIDMgV3JpdGUgQWNjZXNzIFRpbWUJPSAxMyBjeWNsZXMgKi8KKyNkZWZpbmUJQjNXQVRfMTQJCTB4RTAwMDAwMDAgIC8qIEJhbmsgMyBXcml0ZSBBY2Nlc3MgVGltZQk9IDE0IGN5Y2xlcyAqLworI2RlZmluZQlCM1dBVF8xNQkJMHhGMDAwMDAwMCAgLyogQmFuayAzIFdyaXRlIEFjY2VzcyBUaW1lCT0gMTUgY3ljbGVzICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKiogIFNEUkFNIENPTlRST0xMRVIgTUFTS1MgICoqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogRUJJVV9TREdDVEwgTWFza3MgKi8KKyNkZWZpbmUJU0NUTEUJCQkweDAwMDAwMDAxIC8qIEVuYWJsZSBTQ0xLWzBdLCAvU1JBUywgL1NDQVMsIC9TV0UsIFNEUU1bMzowXSAqLworI2RlZmluZQlDTF8yCQkJMHgwMDAwMDAwOCAvKiBTRFJBTSBDQVMJbGF0ZW5jeQk9IDIgY3ljbGVzICovCisjZGVmaW5lCUNMXzMJCQkweDAwMDAwMDBDIC8qIFNEUkFNIENBUwlsYXRlbmN5CT0gMyBjeWNsZXMgKi8KKyNkZWZpbmUJUEZFCQkJCTB4MDAwMDAwMTAgLyogRW5hYmxlIFNEUkFNIHByZWZldGNoICovCisjZGVmaW5lCVBGUAkJCQkweDAwMDAwMDIwIC8qIFByZWZldGNoIGhhcyBwcmlvcml0eSBvdmVyIEFNQyByZXF1ZXN0cyAqLworI2RlZmluZQlQQVNSX0FMTAkJMHgwMDAwMDAwMAkvKiBBbGwgNCBTRFJBTSBCYW5rcyBSZWZyZXNoZWQgSW4gU2VsZi1SZWZyZXNoICovCisjZGVmaW5lCVBBU1JfQjBfQjEJCTB4MDAwMDAwMTAJLyogU0RSQU0gQmFua3MgMCBhbmQgMSBBcmUgUmVmcmVzaGVkIEluCVNlbGYtUmVmcmVzaCAqLworI2RlZmluZQlQQVNSX0IwCQkJMHgwMDAwMDAyMAkvKiBPbmx5CVNEUkFNIEJhbmsgMCBJcwlSZWZyZXNoZWQgSW4gU2VsZi1SZWZyZXNoICovCisjZGVmaW5lCVRSQVNfMQkJCTB4MDAwMDAwNDAgLyogU0RSQU0gdFJBUyA9IDEgY3ljbGUgKi8KKyNkZWZpbmUJVFJBU18yCQkJMHgwMDAwMDA4MCAvKiBTRFJBTSB0UkFTID0gMiBjeWNsZXMgKi8KKyNkZWZpbmUJVFJBU18zCQkJMHgwMDAwMDBDMCAvKiBTRFJBTSB0UkFTID0gMyBjeWNsZXMgKi8KKyNkZWZpbmUJVFJBU180CQkJMHgwMDAwMDEwMCAvKiBTRFJBTSB0UkFTID0gNCBjeWNsZXMgKi8KKyNkZWZpbmUJVFJBU181CQkJMHgwMDAwMDE0MCAvKiBTRFJBTSB0UkFTID0gNSBjeWNsZXMgKi8KKyNkZWZpbmUJVFJBU182CQkJMHgwMDAwMDE4MCAvKiBTRFJBTSB0UkFTID0gNiBjeWNsZXMgKi8KKyNkZWZpbmUJVFJBU183CQkJMHgwMDAwMDFDMCAvKiBTRFJBTSB0UkFTID0gNyBjeWNsZXMgKi8KKyNkZWZpbmUJVFJBU184CQkJMHgwMDAwMDIwMCAvKiBTRFJBTSB0UkFTID0gOCBjeWNsZXMgKi8KKyNkZWZpbmUJVFJBU185CQkJMHgwMDAwMDI0MCAvKiBTRFJBTSB0UkFTID0gOSBjeWNsZXMgKi8KKyNkZWZpbmUJVFJBU18xMAkJCTB4MDAwMDAyODAgLyogU0RSQU0gdFJBUyA9IDEwIGN5Y2xlcyAqLworI2RlZmluZQlUUkFTXzExCQkJMHgwMDAwMDJDMCAvKiBTRFJBTSB0UkFTID0gMTEgY3ljbGVzICovCisjZGVmaW5lCVRSQVNfMTIJCQkweDAwMDAwMzAwIC8qIFNEUkFNIHRSQVMgPSAxMiBjeWNsZXMgKi8KKyNkZWZpbmUJVFJBU18xMwkJCTB4MDAwMDAzNDAgLyogU0RSQU0gdFJBUyA9IDEzIGN5Y2xlcyAqLworI2RlZmluZQlUUkFTXzE0CQkJMHgwMDAwMDM4MCAvKiBTRFJBTSB0UkFTID0gMTQgY3ljbGVzICovCisjZGVmaW5lCVRSQVNfMTUJCQkweDAwMDAwM0MwIC8qIFNEUkFNIHRSQVMgPSAxNSBjeWNsZXMgKi8KKyNkZWZpbmUJVFJQXzEJCQkweDAwMDAwODAwIC8qIFNEUkFNIHRSUAk9IDEgY3ljbGUgKi8KKyNkZWZpbmUJVFJQXzIJCQkweDAwMDAxMDAwIC8qIFNEUkFNIHRSUAk9IDIgY3ljbGVzICovCisjZGVmaW5lCVRSUF8zCQkJMHgwMDAwMTgwMCAvKiBTRFJBTSB0UlAJPSAzIGN5Y2xlcyAqLworI2RlZmluZQlUUlBfNAkJCTB4MDAwMDIwMDAgLyogU0RSQU0gdFJQCT0gNCBjeWNsZXMgKi8KKyNkZWZpbmUJVFJQXzUJCQkweDAwMDAyODAwIC8qIFNEUkFNIHRSUAk9IDUgY3ljbGVzICovCisjZGVmaW5lCVRSUF82CQkJMHgwMDAwMzAwMCAvKiBTRFJBTSB0UlAJPSA2IGN5Y2xlcyAqLworI2RlZmluZQlUUlBfNwkJCTB4MDAwMDM4MDAgLyogU0RSQU0gdFJQCT0gNyBjeWNsZXMgKi8KKyNkZWZpbmUJVFJDRF8xCQkJMHgwMDAwODAwMCAvKiBTRFJBTSB0UkNEID0gMSBjeWNsZSAqLworI2RlZmluZQlUUkNEXzIJCQkweDAwMDEwMDAwIC8qIFNEUkFNIHRSQ0QgPSAyIGN5Y2xlcyAqLworI2RlZmluZQlUUkNEXzMJCQkweDAwMDE4MDAwIC8qIFNEUkFNIHRSQ0QgPSAzIGN5Y2xlcyAqLworI2RlZmluZQlUUkNEXzQJCQkweDAwMDIwMDAwIC8qIFNEUkFNIHRSQ0QgPSA0IGN5Y2xlcyAqLworI2RlZmluZQlUUkNEXzUJCQkweDAwMDI4MDAwIC8qIFNEUkFNIHRSQ0QgPSA1IGN5Y2xlcyAqLworI2RlZmluZQlUUkNEXzYJCQkweDAwMDMwMDAwIC8qIFNEUkFNIHRSQ0QgPSA2IGN5Y2xlcyAqLworI2RlZmluZQlUUkNEXzcJCQkweDAwMDM4MDAwIC8qIFNEUkFNIHRSQ0QgPSA3IGN5Y2xlcyAqLworI2RlZmluZQlUV1JfMQkJCTB4MDAwODAwMDAgLyogU0RSQU0gdFdSCT0gMSBjeWNsZSAqLworI2RlZmluZQlUV1JfMgkJCTB4MDAxMDAwMDAgLyogU0RSQU0gdFdSCT0gMiBjeWNsZXMgKi8KKyNkZWZpbmUJVFdSXzMJCQkweDAwMTgwMDAwIC8qIFNEUkFNIHRXUgk9IDMgY3ljbGVzICovCisjZGVmaW5lCVBVUFNECQkJMHgwMDIwMDAwMCAvKlBvd2VyLXVwIHN0YXJ0IGRlbGF5ICovCisjZGVmaW5lCVBTTQkJCQkweDAwNDAwMDAwIC8qIFNEUkFNIHBvd2VyLXVwIHNlcXVlbmNlID0JUHJlY2hhcmdlLCBtb2RlCXJlZ2lzdGVyIHNldCwgOAlDQlIgcmVmcmVzaCBjeWNsZXMgKi8KKyNkZWZpbmUJUFNTCQkJCTB4MDA4MDAwMDAgLyogZW5hYmxlIFNEUkFNIHBvd2VyLXVwIHNlcXVlbmNlIG9uCW5leHQgU0RSQU0gYWNjZXNzICovCisjZGVmaW5lCVNSRlMJCQkweDAxMDAwMDAwIC8qIFN0YXJ0IFNEUkFNIHNlbGYtcmVmcmVzaCBtb2RlICovCisjZGVmaW5lCUVCVUZFCQkJMHgwMjAwMDAwMCAvKiBFbmFibGUgZXh0ZXJuYWwgYnVmZmVyaW5nCXRpbWluZyAqLworI2RlZmluZQlGQkJSVwkJCTB4MDQwMDAwMDAgLyogRmFzdCBiYWNrLXRvLWJhY2sJcmVhZCB3cml0ZSBlbmFibGUgKi8KKyNkZWZpbmUJRU1SRU4JCQkweDEwMDAwMDAwIC8qIEV4dGVuZGVkIG1vZGUgcmVnaXN0ZXIgZW5hYmxlICovCisjZGVmaW5lCVRDU1IJCQkweDIwMDAwMDAwIC8qIFRlbXAgY29tcGVuc2F0ZWQgc2VsZiByZWZyZXNoIHZhbHVlIDg1IGRlZyBDICovCisjZGVmaW5lCUNEREJHCQkJMHg0MDAwMDAwMCAvKiBUcmlzdGF0ZSBTRFJBTSBjb250cm9scyBkdXJpbmcgYnVzIGdyYW50ICovCisKKy8qIEVCSVVfU0RCQ1RMIE1hc2tzICovCisjZGVmaW5lCUVCRQkJCQkweDAwMDAwMDAxIC8qIEVuYWJsZSBTRFJBTSBleHRlcm5hbCBiYW5rICovCisjZGVmaW5lCUVCU1pfMTYJCQkweDAwMDAwMDAwIC8qIFNEUkFNIGV4dGVybmFsIGJhbmsgc2l6ZSA9IDE2TUIgKi8KKyNkZWZpbmUJRUJTWl8zMgkJCTB4MDAwMDAwMDIgLyogU0RSQU0gZXh0ZXJuYWwgYmFuayBzaXplID0gMzJNQiAqLworI2RlZmluZQlFQlNaXzY0CQkJMHgwMDAwMDAwNCAvKiBTRFJBTSBleHRlcm5hbCBiYW5rIHNpemUgPSA2NE1CICovCisjZGVmaW5lCUVCU1pfMTI4CQkweDAwMDAwMDA2IC8qIFNEUkFNIGV4dGVybmFsIGJhbmsgc2l6ZSA9IDEyOE1CICovCisjZGVmaW5lCUVCU1pfMjU2CQkweDAwMDAwMDA4IC8qIFNEUkFNIEV4dGVybmFsIEJhbmsgU2l6ZSA9IDI1Nk1CICovCisjZGVmaW5lCUVCU1pfNTEyCQkweDAwMDAwMDBBIC8qIFNEUkFNIEV4dGVybmFsIEJhbmsgU2l6ZSA9IDUxMk1CICovCisjZGVmaW5lCUVCQ0FXXzgJCQkweDAwMDAwMDAwIC8qIFNEUkFNIGV4dGVybmFsIGJhbmsgY29sdW1uIGFkZHJlc3Mgd2lkdGggPSA4IGJpdHMgKi8KKyNkZWZpbmUJRUJDQVdfOQkJCTB4MDAwMDAwMTAgLyogU0RSQU0gZXh0ZXJuYWwgYmFuayBjb2x1bW4gYWRkcmVzcyB3aWR0aCA9IDkgYml0cyAqLworI2RlZmluZQlFQkNBV18xMAkJMHgwMDAwMDAyMCAvKiBTRFJBTSBleHRlcm5hbCBiYW5rIGNvbHVtbiBhZGRyZXNzIHdpZHRoID0gOSBiaXRzICovCisjZGVmaW5lCUVCQ0FXXzExCQkweDAwMDAwMDMwIC8qIFNEUkFNIGV4dGVybmFsIGJhbmsgY29sdW1uIGFkZHJlc3Mgd2lkdGggPSA5IGJpdHMgKi8KKworLyogRUJJVV9TRFNUQVQgTWFza3MgKi8KKyNkZWZpbmUJU0RDSQkJCTB4MDAwMDAwMDEgLyogU0RSQU0gY29udHJvbGxlciBpcyBpZGxlICovCisjZGVmaW5lCVNEU1JBCQkJMHgwMDAwMDAwMiAvKiBTRFJBTSBTRFJBTSBzZWxmIHJlZnJlc2ggaXMgYWN0aXZlICovCisjZGVmaW5lCVNEUFVBCQkJMHgwMDAwMDAwNCAvKiBTRFJBTSBwb3dlciB1cCBhY3RpdmUgICovCisjZGVmaW5lCVNEUlMJCQkweDAwMDAwMDA4IC8qIFNEUkFNIGlzIGluIHJlc2V0CXN0YXRlICovCisjZGVmaW5lCVNERUFTRQkJCTB4MDAwMDAwMTAgLyogU0RSQU0gRUFCCXN0aWNreSBlcnJvciBzdGF0dXMgLSBXMUMgKi8KKyNkZWZpbmUJQkdTVEFUCQkJMHgwMDAwMDAyMCAvKiBCdXMgZ3JhbnRlZCAqLworCisKKy8qICAqKioqKioqKioqKioqKioqKioqKiAgVFdPLVdJUkUgSU5URVJGQUNFIChUV0l4KSBNQVNLUyAgKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBUV0l4X0NMS0RJViBNYWNyb3MgKFVzZTogKnBUV0l4X0NMS0RJViA9IENMS0xPVyh4KXxDTEtISSh5KTsJICkgKi8KKyNpZmRlZiBfTUlTUkFfUlVMRVMKKyNkZWZpbmUJQ0xLTE9XKHgpCSgoeCkgJiAweEZGdSkJCS8qIFBlcmlvZHMgQ2xvY2sgSXMgSGVsZCBMb3cgKi8KKyNkZWZpbmUJQ0xLSEkoeSkJKCgoeSkmMHhGRnUpPDwweDgpCS8qIFBlcmlvZHMgQmVmb3JlIE5ldyBDbG9jayBMb3cgKi8KKyNlbHNlCisjZGVmaW5lCUNMS0xPVyh4KQkoKHgpICYgMHhGRikJCS8qIFBlcmlvZHMgQ2xvY2sgSXMgSGVsZCBMb3cgKi8KKyNkZWZpbmUJQ0xLSEkoeSkJKCgoeSkmMHhGRik8PDB4OCkJLyogUGVyaW9kcyBCZWZvcmUgTmV3IENsb2NrIExvdyAqLworI2VuZGlmIC8qIF9NSVNSQV9SVUxFUyAqLworCisvKiBUV0l4X1BSRVNDQUxFIE1hc2tzCQkJCQkJCQkgKi8KKyNkZWZpbmUJUFJFU0NBTEUJMHgwMDdGCQkvKiBTQ0xLcyBQZXIgSW50ZXJuYWwgVGltZSBSZWZlcmVuY2UgKDEwTUh6KSAqLworI2RlZmluZQlUV0lfRU5BCQkweDAwODAJCS8qIFRXSSBFbmFibGUJCSAqLworI2RlZmluZQlTQ0NCCQkweDAyMDAJCS8qIFNDQ0IJQ29tcGF0aWJpbGl0eSBFbmFibGUgKi8KKworLyogVFdJeF9TTEFWRV9DVFJMIE1hc2tzCQkJCQkJCQkgKi8KKyNkZWZpbmUJU0VOCQkJMHgwMDAxCQkvKiBTbGF2ZSBFbmFibGUJCSAqLworI2RlZmluZQlTQUREX0xFTgkweDAwMDIJCS8qIFNsYXZlIEFkZHJlc3MgTGVuZ3RoICovCisjZGVmaW5lCVNURFZBTAkJMHgwMDA0CQkvKiBTbGF2ZSBUcmFuc21pdCBEYXRhIFZhbGlkICovCisjZGVmaW5lCU5BSwkJCTB4MDAwOAkJLyogTkFLL0FDSyogR2VuZXJhdGVkIEF0IENvbmNsdXNpb24gT2YgVHJhbnNmZXIgKi8KKyNkZWZpbmUJR0VOCQkJMHgwMDEwCQkvKiBHZW5lcmFsIENhbGwJQWRycmVzcwlNYXRjaGluZyBFbmFibGVkICovCisKKy8qIFRXSXhfU0xBVkVfU1RBVCBNYXNrcwkJCQkJCQkJICovCisjZGVmaW5lCVNESVIJCTB4MDAwMQkJLyogU2xhdmUgVHJhbnNmZXIgRGlyZWN0aW9uIChUcmFuc21pdC9SZWNlaXZlKikgKi8KKyNkZWZpbmUJR0NBTEwJCTB4MDAwMgkJLyogR2VuZXJhbCBDYWxsCUluZGljYXRvciAqLworCisvKiBUV0l4X01BU1RFUl9DVFJMIE1hc2tzCQkJCQkJICovCisjZGVmaW5lCU1FTgkJCTB4MDAwMQkJLyogTWFzdGVyIE1vZGUgRW5hYmxlICovCisjZGVmaW5lCU1BRERfTEVOCTB4MDAwMgkJLyogTWFzdGVyIEFkZHJlc3MgTGVuZ3RoICovCisjZGVmaW5lCU1ESVIJCTB4MDAwNAkJLyogTWFzdGVyIFRyYW5zbWl0IERpcmVjdGlvbiAoUlgvVFgqKSAqLworI2RlZmluZQlGQVNUCQkweDAwMDgJCS8qIFVzZSBGYXN0IE1vZGUgVGltaW5nCVNwZWNzICovCisjZGVmaW5lCVNUT1AJCTB4MDAxMAkJLyogSXNzdWUgU3RvcCBDb25kaXRpb24gKi8KKyNkZWZpbmUJUlNUQVJUCQkweDAwMjAJCS8qIFJlcGVhdCBTdGFydAlvciBTdG9wKiBBdCBFbmQJT2YgVHJhbnNmZXIgKi8KKyNkZWZpbmUJRENOVAkJMHgzRkMwCQkvKiBEYXRhCUJ5dGVzIFRvIFRyYW5zZmVyICovCisjZGVmaW5lCVNEQU9WUgkJMHg0MDAwCQkvKiBTZXJpYWwgRGF0YSBPdmVycmlkZSAqLworI2RlZmluZQlTQ0xPVlIJCTB4ODAwMAkJLyogU2VyaWFsIENsb2NrCU92ZXJyaWRlICovCisKKy8qIFRXSXhfTUFTVEVSX1NUQVQgTWFza3MJCQkJCQkJICovCisjZGVmaW5lCU1QUk9HCQkweDAwMDEJCS8qIE1hc3RlciBUcmFuc2ZlciBJbiBQcm9ncmVzcyAqLworI2RlZmluZQlMT1NUQVJCCQkweDAwMDIJCS8qIExvc3QJQXJiaXRyYXRpb24gSW5kaWNhdG9yIChYZmVyIEFib3J0ZWQpICovCisjZGVmaW5lCUFOQUsJCTB4MDAwNAkJLyogQWRkcmVzcyBOb3QgQWNrbm93bGVkZ2VkICovCisjZGVmaW5lCUROQUsJCTB4MDAwOAkJLyogRGF0YQlOb3QgQWNrbm93bGVkZ2VkICovCisjZGVmaW5lCUJVRlJERVJSCTB4MDAxMAkJLyogQnVmZmVyIFJlYWQgRXJyb3IgKi8KKyNkZWZpbmUJQlVGV1JFUlIJMHgwMDIwCQkvKiBCdWZmZXIgV3JpdGUJRXJyb3IgKi8KKyNkZWZpbmUJU0RBU0VOCQkweDAwNDAJCS8qIFNlcmlhbCBEYXRhIFNlbnNlICovCisjZGVmaW5lCVNDTFNFTgkJMHgwMDgwCQkvKiBTZXJpYWwgQ2xvY2sJU2Vuc2UgKi8KKyNkZWZpbmUJQlVTQlVTWQkJMHgwMTAwCQkvKiBCdXMgQnVzeSBJbmRpY2F0b3IgKi8KKworLyogVFdJeF9JTlRfU1JDCWFuZCBUV0l4X0lOVF9FTkFCTEUgTWFza3MgKi8KKyNkZWZpbmUJU0lOSVQJCTB4MDAwMQkJLyogU2xhdmUgVHJhbnNmZXIgSW5pdGlhdGVkICovCisjZGVmaW5lCVNDT01QCQkweDAwMDIJCS8qIFNsYXZlIFRyYW5zZmVyIENvbXBsZXRlICovCisjZGVmaW5lCVNFUlIJCTB4MDAwNAkJLyogU2xhdmUgVHJhbnNmZXIgRXJyb3IgKi8KKyNkZWZpbmUJU09WRgkJMHgwMDA4CQkvKiBTbGF2ZSBPdmVyZmxvdyAqLworI2RlZmluZQlNQ09NUAkJMHgwMDEwCQkvKiBNYXN0ZXIgVHJhbnNmZXIgQ29tcGxldGUgKi8KKyNkZWZpbmUJTUVSUgkJMHgwMDIwCQkvKiBNYXN0ZXIgVHJhbnNmZXIgRXJyb3IgKi8KKyNkZWZpbmUJWE1UU0VSVgkJMHgwMDQwCQkvKiBUcmFuc21pdCBGSUZPIFNlcnZpY2UgKi8KKyNkZWZpbmUJUkNWU0VSVgkJMHgwMDgwCQkvKiBSZWNlaXZlIEZJRk8JU2VydmljZSAqLworCisvKiBUV0l4X0ZJRk9fQ1RSTCBNYXNrcwkJCQkJICovCisjZGVmaW5lCVhNVEZMVVNICTB4MDAwMQkJLyogVHJhbnNtaXQgQnVmZmVyIEZsdXNoICovCisjZGVmaW5lCVJDVkZMVVNICTB4MDAwMgkJLyogUmVjZWl2ZSBCdWZmZXIgRmx1c2ggKi8KKyNkZWZpbmUJWE1USU5UTEVOCTB4MDAwNAkJLyogVHJhbnNtaXQgQnVmZmVyIEludGVycnVwdCBMZW5ndGggKi8KKyNkZWZpbmUJUkNWSU5UTEVOCTB4MDAwOAkJLyogUmVjZWl2ZSBCdWZmZXIgSW50ZXJydXB0IExlbmd0aCAqLworCisvKiBUV0l4X0ZJRk9fU1RBVCBNYXNrcwkJCQkJCQkJICovCisjZGVmaW5lCVhNVFNUQVQJCTB4MDAwMwkJLyogVHJhbnNtaXQgRklGTyBTdGF0dXMgKi8KKyNkZWZpbmUJWE1UX0VNUFRZCTB4MDAwMAkJLyoJCVRyYW5zbWl0IEZJRk8gRW1wdHkgKi8KKyNkZWZpbmUJWE1UX0hBTEYJMHgwMDAxCQkvKgkJVHJhbnNtaXQgRklGTyBIYXMgMSBCeXRlIFRvIFdyaXRlICovCisjZGVmaW5lCVhNVF9GVUxMCTB4MDAwMwkJLyoJCVRyYW5zbWl0IEZJRk8gRnVsbCAoMiBCeXRlcyBUbyBXcml0ZSkgKi8KKworI2RlZmluZQlSQ1ZTVEFUCQkweDAwMEMJCS8qIFJlY2VpdmUgRklGTwlTdGF0dXMgKi8KKyNkZWZpbmUJUkNWX0VNUFRZCTB4MDAwMAkJLyoJCVJlY2VpdmUJRklGTyBFbXB0eSAqLworI2RlZmluZQlSQ1ZfSEFMRgkweDAwMDQJCS8qCQlSZWNlaXZlCUZJRk8gSGFzIDEgQnl0ZQlUbyBSZWFkICovCisjZGVmaW5lCVJDVl9GVUxMCTB4MDAwQwkJLyoJCVJlY2VpdmUJRklGTyBGdWxsICgyIEJ5dGVzIFRvIFJlYWQpICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBNWFZSCU1BU0tTICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIE1YVlJfQ09ORklHIE1hc2tzICovCisKKyNkZWZpbmUJTVhWUkVOCSAgMHgwMDAwMDAwMWx1CisjZGVmaW5lCU1NU00JICAweDAwMDAwMDAybHUKKyNkZWZpbmUJQUNUSVZFCSAgMHgwMDAwMDAwNGx1CisjZGVmaW5lCVNERUxBWQkgIDB4MDAwMDAwMDhsdQorI2RlZmluZQlOQ01SWEVOCSAgMHgwMDAwMDAxMGx1CisjZGVmaW5lCVJXUlJYRU4JICAweDAwMDAwMDIwbHUKKyNkZWZpbmUJTVRYRU4JICAweDAwMDAwMDQwbHUKKyNkZWZpbmUJTVRYT04JICAweDAwMDAwMDgwbHUgLypsZWdhY3kqLworI2RlZmluZQlNVFhPTkIJICAweDAwMDAwMDgwbHUKKyNkZWZpbmUJRVBBUklUWQkgIDB4MDAwMDAxMDBsdQorI2RlZmluZQlNU0IJICAweDAwMDAxRTAwbHUKKyNkZWZpbmUJQVBSWEVOCSAgMHgwMDAwMjAwMGx1CisjZGVmaW5lCVdBS0VVUAkgIDB4MDAwMDQwMDBsdQorI2RlZmluZQlMTUVDSAkgIDB4MDAwMDgwMDBsdQorCisjaWZkZWYgX01JU1JBX1JVTEVTCisjZGVmaW5lCVNFVF9NU0IoeCkgICAgICgoKHgpJjB4RnUpIDw8IDB4OSkKKyNlbHNlCisjZGVmaW5lCVNFVF9NU0IoeCkgICAgICgoKHgpJjB4RikgPDwgMHg5KQorI2VuZGlmIC8qIF9NSVNSQV9SVUxFUyAqLworCisKKy8qIE1YVlJfUExMX0NUTF8wIE1hc2tzICovCisKKyNkZWZpbmUJTVhUQUxDRU4gIDB4MDAwMDAwMDFsdQorI2RlZmluZQlNWFRBTEZFTiAgMHgwMDAwMDAwMmx1CisjZGVmaW5lCU1QTExNUwkgIDB4MDAwMDAwMDhsdQorI2RlZmluZQlNWFRBTE1VTCAgMHgwMDAwMDAzMGx1CisjZGVmaW5lCU1QTExFTgkgIDB4MDAwMDAwNDBsdQorI2RlZmluZQlNUExMRU4wCSAgMHgwMDAwMDA0MGx1IC8qIGxlZ2FjeSAqLworI2RlZmluZQlNUExMRU4xCSAgMHgwMDAwMDA4MGx1IC8qIGxlZ2FjeSAqLworI2RlZmluZQlNTUNMS0VOCSAgMHgwMDAwMDEwMGx1CisjZGVmaW5lCU1NQ0xLTVVMICAweDAwMDAxRTAwbHUKKyNkZWZpbmUJTVBMTFJTVEIgIDB4MDAwMDIwMDBsdQorI2RlZmluZQlNUExMUlNUQjAgMHgwMDAwMjAwMGx1IC8qIGxlZ2FjeSAqLworI2RlZmluZQlNUExMUlNUQjEgMHgwMDAwNDAwMGx1IC8qIGxlZ2FjeSAqLworI2RlZmluZQlNQkNMS0VOCSAgMHgwMDAxMDAwMGx1CisjZGVmaW5lCU1CQ0xLRElWICAweDAwMUUwMDAwbHUKKyNkZWZpbmUJTVBMTENEUgkgIDB4MDAyMDAwMDBsdQorI2RlZmluZQlNUExMQ0RSMCAgMHgwMDIwMDAwMGx1IC8qIGxlZ2FjeSAqLworI2RlZmluZQlNUExMQ0RSMSAgMHgwMDQwMDAwMGx1IC8qIGxlZ2FjeSAqLworI2RlZmluZQlJTlZSWAkgIDB4MDA4MDAwMDBsdQorI2RlZmluZQlNRlNFTgkgIDB4MDEwMDAwMDBsdQorI2RlZmluZQlNRlNESVYJICAweDFFMDAwMDAwbHUKKyNkZWZpbmUJTUZTU0VMCSAgMHg2MDAwMDAwMGx1CisjZGVmaW5lCU1GU1NZTkMJICAweDgwMDAwMDAwbHUKKworI2RlZmluZQlNWFRBTE1VTF8yNTZGUwkgMHgwMDAwMDAwMGx1IC8qIGxlZ2FjeSAqLworI2RlZmluZQlNWFRBTE1VTF8zODRGUwkgMHgwMDAwMDAxMGx1IC8qIGxlZ2FjeSAqLworI2RlZmluZQlNWFRBTE1VTF81MTJGUwkgMHgwMDAwMDAyMGx1IC8qIGxlZ2FjeSAqLworI2RlZmluZQlNWFRBTE1VTF8xMDI0RlMJIDB4MDAwMDAwMzBsdQorCisjZGVmaW5lCU1NQ0xLTVVMXzEwMjRGUwkgMHgwMDAwMDAwMGx1CisjZGVmaW5lCU1NQ0xLTVVMXzUxMkZTCSAweDAwMDAwMjAwbHUKKyNkZWZpbmUJTU1DTEtNVUxfMjU2RlMJIDB4MDAwMDA0MDBsdQorI2RlZmluZQlNTUNMS01VTF8xMjhGUwkgMHgwMDAwMDYwMGx1CisjZGVmaW5lCU1NQ0xLTVVMXzY0RlMJIDB4MDAwMDA4MDBsdQorI2RlZmluZQlNTUNMS01VTF8zMkZTCSAweDAwMDAwQTAwbHUKKyNkZWZpbmUJTU1DTEtNVUxfMTZGUwkgMHgwMDAwMEMwMGx1CisjZGVmaW5lCU1NQ0xLTVVMXzhGUwkgMHgwMDAwMEUwMGx1CisjZGVmaW5lCU1NQ0xLTVVMXzRGUwkgMHgwMDAwMTAwMGx1CisjZGVmaW5lCU1NQ0xLTVVMXzJGUwkgMHgwMDAwMTIwMGx1CisjZGVmaW5lCU1NQ0xLTVVMXzFGUwkgMHgwMDAwMTQwMGx1CisjZGVmaW5lCU1NQ0xLTVVMXzE1MzZGUwkgMHgwMDAwMUEwMGx1CisjZGVmaW5lCU1NQ0xLTVVMXzc2OEZTCSAweDAwMDAxQzAwbHUKKyNkZWZpbmUJTU1DTEtNVUxfMzg0RlMJIDB4MDAwMDFFMDBsdQorCisjZGVmaW5lCU1CQ0xLRElWX0RJVjIJIDB4MDAwMjAwMDBsdQorI2RlZmluZQlNQkNMS0RJVl9ESVY0CSAweDAwMDQwMDAwbHUKKyNkZWZpbmUJTUJDTEtESVZfRElWOAkgMHgwMDA2MDAwMGx1CisjZGVmaW5lCU1CQ0xLRElWX0RJVjE2CSAweDAwMDgwMDAwbHUKKyNkZWZpbmUJTUJDTEtESVZfRElWMzIJIDB4MDAwQTAwMDBsdQorI2RlZmluZQlNQkNMS0RJVl9ESVY2NAkgMHgwMDBDMDAwMGx1CisjZGVmaW5lCU1CQ0xLRElWX0RJVjEyOAkgMHgwMDBFMDAwMGx1CisjZGVmaW5lCU1CQ0xLRElWX0RJVjI1NgkgMHgwMDEwMDAwMGx1CisjZGVmaW5lCU1CQ0xLRElWX0RJVjUxMgkgMHgwMDEyMDAwMGx1CisjZGVmaW5lCU1CQ0xLRElWX0RJVjEwMjQgMHgwMDE0MDAwMGx1CisKKyNkZWZpbmUJTUZTRElWX0RJVjIJIDB4MDIwMDAwMDBsdQorI2RlZmluZQlNRlNESVZfRElWNAkgMHgwNDAwMDAwMGx1CisjZGVmaW5lCU1GU0RJVl9ESVY4CSAweDA2MDAwMDAwbHUKKyNkZWZpbmUJTUZTRElWX0RJVjE2CSAweDA4MDAwMDAwbHUKKyNkZWZpbmUJTUZTRElWX0RJVjMyCSAweDBBMDAwMDAwbHUKKyNkZWZpbmUJTUZTRElWX0RJVjY0CSAweDBDMDAwMDAwbHUKKyNkZWZpbmUJTUZTRElWX0RJVjEyOAkgMHgwRTAwMDAwMGx1CisjZGVmaW5lCU1GU0RJVl9ESVYyNTYJIDB4MTAwMDAwMDBsdQorI2RlZmluZQlNRlNESVZfRElWNTEyCSAweDEyMDAwMDAwbHUKKyNkZWZpbmUJTUZTRElWX0RJVjEwMjQJIDB4MTQwMDAwMDBsdQorCisjZGVmaW5lCU1GU1NFTF9DTE9DSwkgMHgwMDAwMDAwMGx1CisjZGVmaW5lCU1GU1NFTF9QVUxTRV9ISQkgMHgyMDAwMDAwMGx1CisjZGVmaW5lCU1GU1NFTF9QVUxTRV9MTwkgMHg0MDAwMDAwMGx1CisKKworLyogTVhWUl9QTExfQ1RMXzEgTWFza3MgKi8KKworI2RlZmluZQlNU1RPCSAgIDB4MDAwMDAwMDFsdQorI2RlZmluZQlNU1RPMAkgICAweDAwMDAwMDAxbHUJLyogbGVnYWN5ICovCisjZGVmaW5lCU1IT0dHRAkgICAweDAwMDAwMDA0bHUKKyNkZWZpbmUJTUhPR0dEMAkgICAweDAwMDAwMDA0bHUJLyogbGVnYWN5ICovCisjZGVmaW5lCU1IT0dHRDEJICAgMHgwMDAwMDAwOGx1CS8qIGxlZ2FjeSAqLworI2RlZmluZQlNU0hBUEVSRU4gIDB4MDAwMDAwMTBsdQorI2RlZmluZQlNU0hBUEVSRU4wIDB4MDAwMDAwMTBsdQkvKiBsZWdhY3kgKi8KKyNkZWZpbmUJTVNIQVBFUkVOMSAweDAwMDAwMDIwbHUJLyogbGVnYWN5ICovCisjZGVmaW5lCU1QTExDTlRFTiAgMHgwMDAwODAwMGx1CisjZGVmaW5lCU1QTExDTlQJICAgMHhGRkZGMDAwMGx1CisKKyNpZmRlZiBfTUlTUkFfUlVMRVMKKyNkZWZpbmUJU0VUX01QTExDTlQoeCkJICAgKCgoeCkmMHhGRkZGdSkgPDwgMHgxMCkKKyNlbHNlCisjZGVmaW5lCVNFVF9NUExMQ05UKHgpCSAgICgoKHgpJjB4RkZGRikgPDwgMHgxMCkKKyNlbmRpZiAvKiBfTUlTUkFfUlVMRVMgKi8KKworCisvKiBNWFZSX1BMTF9DVExfMiBNYXNrcyAqLworCisjZGVmaW5lCU1TSEFQRVJTRUwgMHgwMDAwMDAwN2x1CisjZGVmaW5lCU1DUFNFTAkgICAweDAwMDAwMEUwbHUKKworLyogTVhWUl9JTlRfU1RBVF8wIE1hc2tzICovCisKKyNkZWZpbmUJTkkyQSAgMHgwMDAwMDAwMWx1CisjZGVmaW5lCU5BMkkgIDB4MDAwMDAwMDJsdQorI2RlZmluZQlTQlUyTCAweDAwMDAwMDA0bHUKKyNkZWZpbmUJU0JMMlUgMHgwMDAwMDAwOGx1CisjZGVmaW5lCVBSVSAgIDB4MDAwMDAwMTBsdQorI2RlZmluZQlNUFJVICAweDAwMDAwMDIwbHUKKyNkZWZpbmUJRFJVICAgMHgwMDAwMDA0MGx1CisjZGVmaW5lCU1EUlUgIDB4MDAwMDAwODBsdQorI2RlZmluZQlTQlUgICAweDAwMDAwMTAwbHUKKyNkZWZpbmUJQVRVICAgMHgwMDAwMDIwMGx1CisjZGVmaW5lCUZDWjAgIDB4MDAwMDA0MDBsdQorI2RlZmluZQlGQ1oxICAweDAwMDAwODAwbHUKKyNkZWZpbmUJUEVSUiAgMHgwMDAwMTAwMGx1CisjZGVmaW5lCU1IMkwgIDB4MDAwMDIwMDBsdQorI2RlZmluZQlNTDJIICAweDAwMDA0MDAwbHUKKyNkZWZpbmUJV1VQICAgMHgwMDAwODAwMGx1CisjZGVmaW5lCUZVMkwgIDB4MDAwMTAwMDBsdQorI2RlZmluZQlGTDJVICAweDAwMDIwMDAwbHUKKyNkZWZpbmUJQlUyTCAgMHgwMDA0MDAwMGx1CisjZGVmaW5lCUJMMlUgIDB4MDAwODAwMDBsdQorI2RlZmluZQlQQ1ogICAweDAwNDAwMDAwbHUKKyNkZWZpbmUJRkVSUiAgMHgwMDgwMDAwMGx1CisjZGVmaW5lCUNNUiAgIDB4MDEwMDAwMDBsdQorI2RlZmluZQlDTVJPRiAweDAyMDAwMDAwbHUKKyNkZWZpbmUJQ01UUyAgMHgwNDAwMDAwMGx1CisjZGVmaW5lCUNNVEMgIDB4MDgwMDAwMDBsdQorI2RlZmluZQlSV1JDICAweDEwMDAwMDAwbHUKKyNkZWZpbmUJQkNaICAgMHgyMDAwMDAwMGx1CisjZGVmaW5lCUJNRVJSIDB4NDAwMDAwMDBsdQorI2RlZmluZQlERVJSICAweDgwMDAwMDAwbHUKKworCisvKiBNWFZSX0lOVF9FTl8wIE1hc2tzICovCisKKyNkZWZpbmUJTkkyQUVOCU5JMkEKKyNkZWZpbmUJTkEySUVOCU5BMkkKKyNkZWZpbmUJU0JVMkxFTglTQlUyTAorI2RlZmluZQlTQkwyVUVOCVNCTDJVCisjZGVmaW5lCVBSVUVOCVBSVQorI2RlZmluZQlNUFJVRU4JTVBSVQorI2RlZmluZQlEUlVFTglEUlUKKyNkZWZpbmUJTURSVUVOCU1EUlUKKyNkZWZpbmUJU0JVRU4JU0JVCisjZGVmaW5lCUFUVUVOCUFUVQorI2RlZmluZQlGQ1owRU4JRkNaMAorI2RlZmluZQlGQ1oxRU4JRkNaMQorI2RlZmluZQlQRVJSRU4JUEVSUgorI2RlZmluZQlNSDJMRU4JTUgyTAorI2RlZmluZQlNTDJIRU4JTUwySAorI2RlZmluZQlXVVBFTglXVVAKKyNkZWZpbmUJRlUyTEVOCUZVMkwKKyNkZWZpbmUJRkwyVUVOCUZMMlUKKyNkZWZpbmUJQlUyTEVOCUJVMkwKKyNkZWZpbmUJQkwyVUVOCUJMMlUKKyNkZWZpbmUJUENaRU4JUENaCisjZGVmaW5lCUZFUlJFTglGRVJSCisjZGVmaW5lCUNNUkVOCUNNUgorI2RlZmluZQlDTVJPRkVOCUNNUk9GCisjZGVmaW5lCUNNVFNFTglDTVRTCisjZGVmaW5lCUNNVENFTglDTVRDCisjZGVmaW5lCVJXUkNFTglSV1JDCisjZGVmaW5lCUJDWkVOCUJDWgorI2RlZmluZQlCTUVSUkVOCUJNRVJSCisjZGVmaW5lCURFUlJFTglERVJSCisKKworLyogTVhWUl9JTlRfU1RBVF8xIE1hc2tzICovCisKKyNkZWZpbmUJQVBSICAgMHgwMDAwMDAwNGx1CisjZGVmaW5lCUFQUk9GIDB4MDAwMDAwMDhsdQorI2RlZmluZQlBUFRTICAweDAwMDAwMDQwbHUKKyNkZWZpbmUJQVBUQyAgMHgwMDAwMDA4MGx1CisjZGVmaW5lCUFQUkNFIDB4MDAwMDA0MDBsdQorI2RlZmluZQlBUFJQRSAweDAwMDAwODAwbHUKKworI2RlZmluZQlIRE9ORTAgMHgwMDAwMDAwMWx1CisjZGVmaW5lCURPTkUwICAweDAwMDAwMDAybHUKKyNkZWZpbmUJSERPTkUxIDB4MDAwMDAwMTBsdQorI2RlZmluZQlET05FMSAgMHgwMDAwMDAyMGx1CisjZGVmaW5lCUhET05FMiAweDAwMDAwMTAwbHUKKyNkZWZpbmUJRE9ORTIgIDB4MDAwMDAyMDBsdQorI2RlZmluZQlIRE9ORTMgMHgwMDAwMTAwMGx1CisjZGVmaW5lCURPTkUzICAweDAwMDAyMDAwbHUKKyNkZWZpbmUJSERPTkU0IDB4MDAwMTAwMDBsdQorI2RlZmluZQlET05FNCAgMHgwMDAyMDAwMGx1CisjZGVmaW5lCUhET05FNSAweDAwMTAwMDAwbHUKKyNkZWZpbmUJRE9ORTUgIDB4MDAyMDAwMDBsdQorI2RlZmluZQlIRE9ORTYgMHgwMTAwMDAwMGx1CisjZGVmaW5lCURPTkU2ICAweDAyMDAwMDAwbHUKKyNkZWZpbmUJSERPTkU3IDB4MTAwMDAwMDBsdQorI2RlZmluZQlET05FNyAgMHgyMDAwMDAwMGx1CisKKyNkZWZpbmUJRE9ORVgoeCkgKDB4MDAwMDAwMDIgPDwJKDQgKiAoeCkpKQorI2RlZmluZQlIRE9ORVgoeCkgKDB4MDAwMDAwMDEgPDwgKDQgKiAoeCkpKQorCisKKy8qIE1YVlJfSU5UX0VOXzEgTWFza3MgKi8KKworI2RlZmluZQlBUFJFTglBUFIKKyNkZWZpbmUJQVBST0ZFTglBUFJPRgorI2RlZmluZQlBUFRTRU4JQVBUUworI2RlZmluZQlBUFRDRU4JQVBUQworI2RlZmluZQlBUFJDRUVOCUFQUkNFCisjZGVmaW5lCUFQUlBFRU4JQVBSUEUKKworI2RlZmluZQlIRE9ORUVOMCBIRE9ORTAKKyNkZWZpbmUJRE9ORUVOMAkgRE9ORTAKKyNkZWZpbmUJSERPTkVFTjEgSERPTkUxCisjZGVmaW5lCURPTkVFTjEJIERPTkUxCisjZGVmaW5lCUhET05FRU4yIEhET05FMgorI2RlZmluZQlET05FRU4yCSBET05FMgorI2RlZmluZQlIRE9ORUVOMyBIRE9ORTMKKyNkZWZpbmUJRE9ORUVOMwkgRE9ORTMKKyNkZWZpbmUJSERPTkVFTjQgSERPTkU0CisjZGVmaW5lCURPTkVFTjQJIERPTkU0CisjZGVmaW5lCUhET05FRU41IEhET05FNQorI2RlZmluZQlET05FRU41CSBET05FNQorI2RlZmluZQlIRE9ORUVONiBIRE9ORTYKKyNkZWZpbmUJRE9ORUVONgkgRE9ORTYKKyNkZWZpbmUJSERPTkVFTjcgSERPTkU3CisjZGVmaW5lCURPTkVFTjcJIERPTkU3CisKKyNkZWZpbmUJRE9ORUVOWCh4KSAoMHgwMDAwMDAwMiA8PCAoNCAqICh4KSkpCisjZGVmaW5lCUhET05FRU5YKHgpICgweDAwMDAwMDAxCTw8ICg0ICoJKHgpKSkKKworCisvKiBNWFZSX1NUQVRFXzAJTWFza3MgKi8KKworI2RlZmluZQlOQUNUCSAweDAwMDAwMDAxbHUKKyNkZWZpbmUJU0JMT0NLCSAweDAwMDAwMDAybHUKKyNkZWZpbmUJUEZETE9DSwkgMHgwMDAwMDAwNGx1CisjZGVmaW5lCVBGRExPQ0swIDB4MDAwMDAwMDRsdSAvKiBsZWdhY3kgKi8KKyNkZWZpbmUJUERECSAweDAwMDAwMDA4bHUKKyNkZWZpbmUJUEREMAkgMHgwMDAwMDAwOGx1IC8qIGxlZ2FjeSAqLworI2RlZmluZQlQVkNPCSAweDAwMDAwMDEwbHUKKyNkZWZpbmUJUFZDTzAJIDB4MDAwMDAwMTBsdSAvKiBsZWdhY3kgKi8KKyNkZWZpbmUJUEZETE9DSzEgMHgwMDAwMDAyMGx1IC8qIGxlZ2FjeSAqLworI2RlZmluZQlQREQxCSAweDAwMDAwMDQwbHUgLyogbGVnYWN5ICovCisjZGVmaW5lCVBWQ08xCSAweDAwMDAwMDgwbHUgLyogbGVnYWN5ICovCisjZGVmaW5lCUFQQlNZCSAweDAwMDAwMTAwbHUKKyNkZWZpbmUJQVBBUkIJIDB4MDAwMDAyMDBsdQorI2RlZmluZQlBUFRYCSAweDAwMDAwNDAwbHUKKyNkZWZpbmUJQVBSWAkgMHgwMDAwMDgwMGx1CisjZGVmaW5lCUNNQlNZCSAweDAwMDAxMDAwbHUKKyNkZWZpbmUJQ01BUkIJIDB4MDAwMDIwMDBsdQorI2RlZmluZQlDTVRYCSAweDAwMDA0MDAwbHUKKyNkZWZpbmUJQ01SWAkgMHgwMDAwODAwMGx1CisjZGVmaW5lCU1SWE9OQgkgMHgwMDAxMDAwMGx1CisjZGVmaW5lCVJHU0lQCSAweDAwMDIwMDAwbHUKKyNkZWZpbmUJREFMSVAJIDB4MDAwNDAwMDBsdQorI2RlZmluZQlBTElQCSAweDAwMDgwMDAwbHUKKyNkZWZpbmUJUlJESVAJIDB4MDAxMDAwMDBsdQorI2RlZmluZQlSV1JJUAkgMHgwMDIwMDAwMGx1CisjZGVmaW5lCUZMT0NLCSAweDAwNDAwMDAwbHUKKyNkZWZpbmUJQkxPQ0sJIDB4MDA4MDAwMDBsdQorI2RlZmluZQlSU0IJIDB4MEYwMDAwMDBsdQorI2RlZmluZQlERVJSTlVNCSAweEYwMDAwMDAwbHUKKworCisvKiBNWFZSX1NUQVRFXzEJTWFza3MgKi8KKworI2RlZmluZQlTVFhOVU1CCSAgICAweDAwMDAwMDBGbHUKKyNkZWZpbmUJU1JYTlVNQgkgICAgMHgwMDAwMDBGMGx1CisjZGVmaW5lCUFQQ09OVAkgICAgMHgwMDAwMDEwMGx1CisjZGVmaW5lCURNQUFDVElWRVggIDB4MDBGRjAwMDBsdQorI2RlZmluZQlETUFBQ1RJVkUwICAweDAwMDEwMDAwbHUKKyNkZWZpbmUJRE1BQUNUSVZFMSAgMHgwMDAyMDAwMGx1CisjZGVmaW5lCURNQUFDVElWRTIgIDB4MDAwNDAwMDBsdQorI2RlZmluZQlETUFBQ1RJVkUzICAweDAwMDgwMDAwbHUKKyNkZWZpbmUJRE1BQUNUSVZFNCAgMHgwMDEwMDAwMGx1CisjZGVmaW5lCURNQUFDVElWRTUgIDB4MDAyMDAwMDBsdQorI2RlZmluZQlETUFBQ1RJVkU2ICAweDAwNDAwMDAwbHUKKyNkZWZpbmUJRE1BQUNUSVZFNyAgMHgwMDgwMDAwMGx1CisjZGVmaW5lCURNQVBNRU5YICAgIDB4RkYwMDAwMDBsdQorI2RlZmluZQlETUFQTUVOMCAgICAweDAxMDAwMDAwbHUKKyNkZWZpbmUJRE1BUE1FTjEgICAgMHgwMjAwMDAwMGx1CisjZGVmaW5lCURNQVBNRU4yICAgIDB4MDQwMDAwMDBsdQorI2RlZmluZQlETUFQTUVOMyAgICAweDA4MDAwMDAwbHUKKyNkZWZpbmUJRE1BUE1FTjQgICAgMHgxMDAwMDAwMGx1CisjZGVmaW5lCURNQVBNRU41ICAgIDB4MjAwMDAwMDBsdQorI2RlZmluZQlETUFQTUVONiAgICAweDQwMDAwMDAwbHUKKyNkZWZpbmUJRE1BUE1FTjcgICAgMHg4MDAwMDAwMGx1CisKKworLyogTVhWUl9QT1NJVElPTiBNYXNrcyAqLworCisjZGVmaW5lCVBWQUxJRAkgICAgIDB4ODAwMAorI2RlZmluZQlQT1NJVElPTiAgICAgMHgwMDNGCisKKworLyogTVhWUl9NQVhfUE9TSVRJT04gTWFza3MgKi8KKworI2RlZmluZQlNUFZBTElECSAgICAgMHg4MDAwCisjZGVmaW5lCU1QT1NJVElPTiAgICAweDAwM0YKKworCisvKiBNWFZSX0RFTEFZIE1hc2tzICovCisKKyNkZWZpbmUJRFZBTElECSAgICAgMHg4MDAwCisjZGVmaW5lCURFTEFZCSAgICAgMHgwMDNGCisKKworLyogTVhWUl9NQVhfREVMQVkgTWFza3MgKi8KKworI2RlZmluZQlNRFZBTElECSAgICAgMHg4MDAwCisjZGVmaW5lCU1ERUxBWQkgICAgIDB4MDAzRgorCisKKy8qIE1YVlJfTEFERFIgTWFza3MgKi8KKworI2RlZmluZQlMVkFMSUQJICAgICAweDgwMDAwMDAwbHUKKyNkZWZpbmUJTEFERFIJICAgICAweDAwMDBGRkZGbHUKKworCisvKiBNWFZSX0dBRERSIE1hc2tzICovCisKKyNkZWZpbmUJR1ZBTElECSAgICAgMHg4MDAwCisjZGVmaW5lCUdBRERSTAkgICAgIDB4MDBGRgorCisKKy8qIE1YVlJfQUFERFIgTWFza3MgKi8KKworI2RlZmluZQlBVkFMSUQJICAgICAweDgwMDAwMDAwbHUKKyNkZWZpbmUJQUFERFIJICAgICAweDAwMDBGRkZGbHUKKworCisvKiBNWFZSX0FMTE9DXzAJTWFza3MgKi8KKworI2RlZmluZQlDSVUwCSAgICAgMHgwMDAwMDA4MGx1CisjZGVmaW5lCUNJVTEJICAgICAweDAwMDA4MDAwbHUKKyNkZWZpbmUJQ0lVMgkgICAgIDB4MDA4MDAwMDBsdQorI2RlZmluZQlDSVUzCSAgICAgMHg4MDAwMDAwMGx1CisKKyNkZWZpbmUJQ0wwCSAgICAgMHgwMDAwMDA3Rmx1CisjZGVmaW5lCUNMMQkgICAgIDB4MDAwMDdGMDBsdQorI2RlZmluZQlDTDIJICAgICAweDAwN0YwMDAwbHUKKyNkZWZpbmUJQ0wzCSAgICAgMHg3RjAwMDAwMGx1CisKKworLyogTVhWUl9BTExPQ18xCU1hc2tzICovCisKKyNkZWZpbmUJQ0lVNAkgICAgIDB4MDAwMDAwODBsdQorI2RlZmluZQlDSVU1CSAgICAgMHgwMDAwODAwMGx1CisjZGVmaW5lCUNJVTYJICAgICAweDAwODAwMDAwbHUKKyNkZWZpbmUJQ0lVNwkgICAgIDB4ODAwMDAwMDBsdQorCisjZGVmaW5lCUNMNAkgICAgIDB4MDAwMDAwN0ZsdQorI2RlZmluZQlDTDUJICAgICAweDAwMDA3RjAwbHUKKyNkZWZpbmUJQ0w2CSAgICAgMHgwMDdGMDAwMGx1CisjZGVmaW5lCUNMNwkgICAgIDB4N0YwMDAwMDBsdQorCisKKy8qIE1YVlJfQUxMT0NfMglNYXNrcyAqLworCisjZGVmaW5lCUNJVTgJICAgICAweDAwMDAwMDgwbHUKKyNkZWZpbmUJQ0lVOQkgICAgIDB4MDAwMDgwMDBsdQorI2RlZmluZQlDSVUxMAkgICAgIDB4MDA4MDAwMDBsdQorI2RlZmluZQlDSVUxMQkgICAgIDB4ODAwMDAwMDBsdQorCisjZGVmaW5lCUNMOAkgICAgIDB4MDAwMDAwN0ZsdQorI2RlZmluZQlDTDkJICAgICAweDAwMDA3RjAwbHUKKyNkZWZpbmUJQ0wxMAkgICAgIDB4MDA3RjAwMDBsdQorI2RlZmluZQlDTDExCSAgICAgMHg3RjAwMDAwMGx1CisKKworLyogTVhWUl9BTExPQ18zCU1hc2tzICovCisKKyNkZWZpbmUJQ0lVMTIJICAgICAweDAwMDAwMDgwbHUKKyNkZWZpbmUJQ0lVMTMJICAgICAweDAwMDA4MDAwbHUKKyNkZWZpbmUJQ0lVMTQJICAgICAweDAwODAwMDAwbHUKKyNkZWZpbmUJQ0lVMTUJICAgICAweDgwMDAwMDAwbHUKKworI2RlZmluZQlDTDEyCSAgICAgMHgwMDAwMDA3Rmx1CisjZGVmaW5lCUNMMTMJICAgICAweDAwMDA3RjAwbHUKKyNkZWZpbmUJQ0wxNAkgICAgIDB4MDA3RjAwMDBsdQorI2RlZmluZQlDTDE1CSAgICAgMHg3RjAwMDAwMGx1CisKKworLyogTVhWUl9BTExPQ180CU1hc2tzICovCisKKyNkZWZpbmUJQ0lVMTYJICAgICAweDAwMDAwMDgwbHUKKyNkZWZpbmUJQ0lVMTcJICAgICAweDAwMDA4MDAwbHUKKyNkZWZpbmUJQ0lVMTgJICAgICAweDAwODAwMDAwbHUKKyNkZWZpbmUJQ0lVMTkJICAgICAweDgwMDAwMDAwbHUKKworI2RlZmluZQlDTDE2CSAgICAgMHgwMDAwMDA3Rmx1CisjZGVmaW5lCUNMMTcJICAgICAweDAwMDA3RjAwbHUKKyNkZWZpbmUJQ0wxOAkgICAgIDB4MDA3RjAwMDBsdQorI2RlZmluZQlDTDE5CSAgICAgMHg3RjAwMDAwMGx1CisKKworLyogTVhWUl9BTExPQ181CU1hc2tzICovCisKKyNkZWZpbmUJQ0lVMjAJICAgICAweDAwMDAwMDgwbHUKKyNkZWZpbmUJQ0lVMjEJICAgICAweDAwMDA4MDAwbHUKKyNkZWZpbmUJQ0lVMjIJICAgICAweDAwODAwMDAwbHUKKyNkZWZpbmUJQ0lVMjMJICAgICAweDgwMDAwMDAwbHUKKworI2RlZmluZQlDTDIwCSAgICAgMHgwMDAwMDA3Rmx1CisjZGVmaW5lCUNMMjEJICAgICAweDAwMDA3RjAwbHUKKyNkZWZpbmUJQ0wyMgkgICAgIDB4MDA3RjAwMDBsdQorI2RlZmluZQlDTDIzCSAgICAgMHg3RjAwMDAwMGx1CisKKworLyogTVhWUl9BTExPQ182CU1hc2tzICovCisKKyNkZWZpbmUJQ0lVMjQJICAgICAweDAwMDAwMDgwbHUKKyNkZWZpbmUJQ0lVMjUJICAgICAweDAwMDA4MDAwbHUKKyNkZWZpbmUJQ0lVMjYJICAgICAweDAwODAwMDAwbHUKKyNkZWZpbmUJQ0lVMjcJICAgICAweDgwMDAwMDAwbHUKKworI2RlZmluZQlDTDI0CSAgICAgMHgwMDAwMDA3Rmx1CisjZGVmaW5lCUNMMjUJICAgICAweDAwMDA3RjAwbHUKKyNkZWZpbmUJQ0wyNgkgICAgIDB4MDA3RjAwMDBsdQorI2RlZmluZQlDTDI3CSAgICAgMHg3RjAwMDAwMGx1CisKKworLyogTVhWUl9BTExPQ183CU1hc2tzICovCisKKyNkZWZpbmUJQ0lVMjgJICAgICAweDAwMDAwMDgwbHUKKyNkZWZpbmUJQ0lVMjkJICAgICAweDAwMDA4MDAwbHUKKyNkZWZpbmUJQ0lVMzAJICAgICAweDAwODAwMDAwbHUKKyNkZWZpbmUJQ0lVMzEJICAgICAweDgwMDAwMDAwbHUKKworI2RlZmluZQlDTDI4CSAgICAgMHgwMDAwMDA3Rmx1CisjZGVmaW5lCUNMMjkJICAgICAweDAwMDA3RjAwbHUKKyNkZWZpbmUJQ0wzMAkgICAgIDB4MDA3RjAwMDBsdQorI2RlZmluZQlDTDMxCSAgICAgMHg3RjAwMDAwMGx1CisKKworLyogTVhWUl9BTExPQ184CU1hc2tzICovCisKKyNkZWZpbmUJQ0lVMzIJICAgICAweDAwMDAwMDgwbHUKKyNkZWZpbmUJQ0lVMzMJICAgICAweDAwMDA4MDAwbHUKKyNkZWZpbmUJQ0lVMzQJICAgICAweDAwODAwMDAwbHUKKyNkZWZpbmUJQ0lVMzUJICAgICAweDgwMDAwMDAwbHUKKworI2RlZmluZQlDTDMyCSAgICAgMHgwMDAwMDA3Rmx1CisjZGVmaW5lCUNMMzMJICAgICAweDAwMDA3RjAwbHUKKyNkZWZpbmUJQ0wzNAkgICAgIDB4MDA3RjAwMDBsdQorI2RlZmluZQlDTDM1CSAgICAgMHg3RjAwMDAwMGx1CisKKworLyogTVhWUl9BTExPQ185CU1hc2tzICovCisKKyNkZWZpbmUJQ0lVMzYJICAgICAweDAwMDAwMDgwbHUKKyNkZWZpbmUJQ0lVMzcJICAgICAweDAwMDA4MDAwbHUKKyNkZWZpbmUJQ0lVMzgJICAgICAweDAwODAwMDAwbHUKKyNkZWZpbmUJQ0lVMzkJICAgICAweDgwMDAwMDAwbHUKKworI2RlZmluZQlDTDM2CSAgICAgMHgwMDAwMDA3Rmx1CisjZGVmaW5lCUNMMzcJICAgICAweDAwMDA3RjAwbHUKKyNkZWZpbmUJQ0wzOAkgICAgIDB4MDA3RjAwMDBsdQorI2RlZmluZQlDTDM5CSAgICAgMHg3RjAwMDAwMGx1CisKKworLyogTVhWUl9BTExPQ18xMCBNYXNrcyAqLworCisjZGVmaW5lCUNJVTQwCSAgICAgMHgwMDAwMDA4MGx1CisjZGVmaW5lCUNJVTQxCSAgICAgMHgwMDAwODAwMGx1CisjZGVmaW5lCUNJVTQyCSAgICAgMHgwMDgwMDAwMGx1CisjZGVmaW5lCUNJVTQzCSAgICAgMHg4MDAwMDAwMGx1CisKKyNkZWZpbmUJQ0w0MAkgICAgIDB4MDAwMDAwN0ZsdQorI2RlZmluZQlDTDQxCSAgICAgMHgwMDAwN0YwMGx1CisjZGVmaW5lCUNMNDIJICAgICAweDAwN0YwMDAwbHUKKyNkZWZpbmUJQ0w0MwkgICAgIDB4N0YwMDAwMDBsdQorCisKKy8qIE1YVlJfQUxMT0NfMTEgTWFza3MgKi8KKworI2RlZmluZQlDSVU0NAkgICAgIDB4MDAwMDAwODBsdQorI2RlZmluZQlDSVU0NQkgICAgIDB4MDAwMDgwMDBsdQorI2RlZmluZQlDSVU0NgkgICAgIDB4MDA4MDAwMDBsdQorI2RlZmluZQlDSVU0NwkgICAgIDB4ODAwMDAwMDBsdQorCisjZGVmaW5lCUNMNDQJICAgICAweDAwMDAwMDdGbHUKKyNkZWZpbmUJQ0w0NQkgICAgIDB4MDAwMDdGMDBsdQorI2RlZmluZQlDTDQ2CSAgICAgMHgwMDdGMDAwMGx1CisjZGVmaW5lCUNMNDcJICAgICAweDdGMDAwMDAwbHUKKworCisvKiBNWFZSX0FMTE9DXzEyIE1hc2tzICovCisKKyNkZWZpbmUJQ0lVNDgJICAgICAweDAwMDAwMDgwbHUKKyNkZWZpbmUJQ0lVNDkJICAgICAweDAwMDA4MDAwbHUKKyNkZWZpbmUJQ0lVNTAJICAgICAweDAwODAwMDAwbHUKKyNkZWZpbmUJQ0lVNTEJICAgICAweDgwMDAwMDAwbHUKKworI2RlZmluZQlDTDQ4CSAgICAgMHgwMDAwMDA3Rmx1CisjZGVmaW5lCUNMNDkJICAgICAweDAwMDA3RjAwbHUKKyNkZWZpbmUJQ0w1MAkgICAgIDB4MDA3RjAwMDBsdQorI2RlZmluZQlDTDUxCSAgICAgMHg3RjAwMDAwMGx1CisKKworLyogTVhWUl9BTExPQ18xMyBNYXNrcyAqLworCisjZGVmaW5lCUNJVTUyCSAgICAgMHgwMDAwMDA4MGx1CisjZGVmaW5lCUNJVTUzCSAgICAgMHgwMDAwODAwMGx1CisjZGVmaW5lCUNJVTU0CSAgICAgMHgwMDgwMDAwMGx1CisjZGVmaW5lCUNJVTU1CSAgICAgMHg4MDAwMDAwMGx1CisKKyNkZWZpbmUJQ0w1MgkgICAgIDB4MDAwMDAwN0ZsdQorI2RlZmluZQlDTDUzCSAgICAgMHgwMDAwN0YwMGx1CisjZGVmaW5lCUNMNTQJICAgICAweDAwN0YwMDAwbHUKKyNkZWZpbmUJQ0w1NQkgICAgIDB4N0YwMDAwMDBsdQorCisKKy8qIE1YVlJfQUxMT0NfMTQgTWFza3MgKi8KKworI2RlZmluZQlDSVU1NgkgICAgIDB4MDAwMDAwODBsdQorI2RlZmluZQlDSVU1NwkgICAgIDB4MDAwMDgwMDBsdQorI2RlZmluZQlDSVU1OAkgICAgIDB4MDA4MDAwMDBsdQorI2RlZmluZQlDSVU1OQkgICAgIDB4ODAwMDAwMDBsdQorCisjZGVmaW5lCUNMNTYJICAgICAweDAwMDAwMDdGbHUKKyNkZWZpbmUJQ0w1NwkgICAgIDB4MDAwMDdGMDBsdQorI2RlZmluZQlDTDU4CSAgICAgMHgwMDdGMDAwMGx1CisjZGVmaW5lCUNMNTkJICAgICAweDdGMDAwMDAwbHUKKworCisvKiBNWFZSX1NZTkNfTENIQU5fMCBNYXNrcyAqLworCisjZGVmaW5lCUxDSEFOUEMwICAgICAweDAwMDAwMDBGbHUKKyNkZWZpbmUJTENIQU5QQzEgICAgIDB4MDAwMDAwRjBsdQorI2RlZmluZQlMQ0hBTlBDMiAgICAgMHgwMDAwMEYwMGx1CisjZGVmaW5lCUxDSEFOUEMzICAgICAweDAwMDBGMDAwbHUKKyNkZWZpbmUJTENIQU5QQzQgICAgIDB4MDAwRjAwMDBsdQorI2RlZmluZQlMQ0hBTlBDNSAgICAgMHgwMEYwMDAwMGx1CisjZGVmaW5lCUxDSEFOUEM2ICAgICAweDBGMDAwMDAwbHUKKyNkZWZpbmUJTENIQU5QQzcgICAgIDB4RjAwMDAwMDBsdQorCisKKy8qIE1YVlJfU1lOQ19MQ0hBTl8xIE1hc2tzICovCisKKyNkZWZpbmUJTENIQU5QQzggICAgIDB4MDAwMDAwMEZsdQorI2RlZmluZQlMQ0hBTlBDOSAgICAgMHgwMDAwMDBGMGx1CisjZGVmaW5lCUxDSEFOUEMxMCAgICAweDAwMDAwRjAwbHUKKyNkZWZpbmUJTENIQU5QQzExICAgIDB4MDAwMEYwMDBsdQorI2RlZmluZQlMQ0hBTlBDMTIgICAgMHgwMDBGMDAwMGx1CisjZGVmaW5lCUxDSEFOUEMxMyAgICAweDAwRjAwMDAwbHUKKyNkZWZpbmUJTENIQU5QQzE0ICAgIDB4MEYwMDAwMDBsdQorI2RlZmluZQlMQ0hBTlBDMTUgICAgMHhGMDAwMDAwMGx1CisKKworLyogTVhWUl9TWU5DX0xDSEFOXzIgTWFza3MgKi8KKworI2RlZmluZQlMQ0hBTlBDMTYgICAgMHgwMDAwMDAwRmx1CisjZGVmaW5lCUxDSEFOUEMxNyAgICAweDAwMDAwMEYwbHUKKyNkZWZpbmUJTENIQU5QQzE4ICAgIDB4MDAwMDBGMDBsdQorI2RlZmluZQlMQ0hBTlBDMTkgICAgMHgwMDAwRjAwMGx1CisjZGVmaW5lCUxDSEFOUEMyMCAgICAweDAwMEYwMDAwbHUKKyNkZWZpbmUJTENIQU5QQzIxICAgIDB4MDBGMDAwMDBsdQorI2RlZmluZQlMQ0hBTlBDMjIgICAgMHgwRjAwMDAwMGx1CisjZGVmaW5lCUxDSEFOUEMyMyAgICAweEYwMDAwMDAwbHUKKworCisvKiBNWFZSX1NZTkNfTENIQU5fMyBNYXNrcyAqLworCisjZGVmaW5lCUxDSEFOUEMyNCAgICAweDAwMDAwMDBGbHUKKyNkZWZpbmUJTENIQU5QQzI1ICAgIDB4MDAwMDAwRjBsdQorI2RlZmluZQlMQ0hBTlBDMjYgICAgMHgwMDAwMEYwMGx1CisjZGVmaW5lCUxDSEFOUEMyNyAgICAweDAwMDBGMDAwbHUKKyNkZWZpbmUJTENIQU5QQzI4ICAgIDB4MDAwRjAwMDBsdQorI2RlZmluZQlMQ0hBTlBDMjkgICAgMHgwMEYwMDAwMGx1CisjZGVmaW5lCUxDSEFOUEMzMCAgICAweDBGMDAwMDAwbHUKKyNkZWZpbmUJTENIQU5QQzMxICAgIDB4RjAwMDAwMDBsdQorCisKKy8qIE1YVlJfU1lOQ19MQ0hBTl80IE1hc2tzICovCisKKyNkZWZpbmUJTENIQU5QQzMyICAgIDB4MDAwMDAwMEZsdQorI2RlZmluZQlMQ0hBTlBDMzMgICAgMHgwMDAwMDBGMGx1CisjZGVmaW5lCUxDSEFOUEMzNCAgICAweDAwMDAwRjAwbHUKKyNkZWZpbmUJTENIQU5QQzM1ICAgIDB4MDAwMEYwMDBsdQorI2RlZmluZQlMQ0hBTlBDMzYgICAgMHgwMDBGMDAwMGx1CisjZGVmaW5lCUxDSEFOUEMzNyAgICAweDAwRjAwMDAwbHUKKyNkZWZpbmUJTENIQU5QQzM4ICAgIDB4MEYwMDAwMDBsdQorI2RlZmluZQlMQ0hBTlBDMzkgICAgMHhGMDAwMDAwMGx1CisKKworLyogTVhWUl9TWU5DX0xDSEFOXzUgTWFza3MgKi8KKworI2RlZmluZQlMQ0hBTlBDNDAgICAgMHgwMDAwMDAwRmx1CisjZGVmaW5lCUxDSEFOUEM0MSAgICAweDAwMDAwMEYwbHUKKyNkZWZpbmUJTENIQU5QQzQyICAgIDB4MDAwMDBGMDBsdQorI2RlZmluZQlMQ0hBTlBDNDMgICAgMHgwMDAwRjAwMGx1CisjZGVmaW5lCUxDSEFOUEM0NCAgICAweDAwMEYwMDAwbHUKKyNkZWZpbmUJTENIQU5QQzQ1ICAgIDB4MDBGMDAwMDBsdQorI2RlZmluZQlMQ0hBTlBDNDYgICAgMHgwRjAwMDAwMGx1CisjZGVmaW5lCUxDSEFOUEM0NyAgICAweEYwMDAwMDAwbHUKKworCisvKiBNWFZSX1NZTkNfTENIQU5fNiBNYXNrcyAqLworCisjZGVmaW5lCUxDSEFOUEM0OCAgICAweDAwMDAwMDBGbHUKKyNkZWZpbmUJTENIQU5QQzQ5ICAgIDB4MDAwMDAwRjBsdQorI2RlZmluZQlMQ0hBTlBDNTAgICAgMHgwMDAwMEYwMGx1CisjZGVmaW5lCUxDSEFOUEM1MSAgICAweDAwMDBGMDAwbHUKKyNkZWZpbmUJTENIQU5QQzUyICAgIDB4MDAwRjAwMDBsdQorI2RlZmluZQlMQ0hBTlBDNTMgICAgMHgwMEYwMDAwMGx1CisjZGVmaW5lCUxDSEFOUEM1NCAgICAweDBGMDAwMDAwbHUKKyNkZWZpbmUJTENIQU5QQzU1ICAgIDB4RjAwMDAwMDBsdQorCisKKy8qIE1YVlJfU1lOQ19MQ0hBTl83IE1hc2tzICovCisKKyNkZWZpbmUJTENIQU5QQzU2ICAgIDB4MDAwMDAwMEZsdQorI2RlZmluZQlMQ0hBTlBDNTcgICAgMHgwMDAwMDBGMGx1CisjZGVmaW5lCUxDSEFOUEM1OCAgICAweDAwMDAwRjAwbHUKKyNkZWZpbmUJTENIQU5QQzU5ICAgIDB4MDAwMEYwMDBsdQorCisKKy8qIE1YVlJfRE1BeF9DT05GSUcgTWFza3MgKi8KKworI2RlZmluZQlNRE1BRU4JICAgIDB4MDAwMDAwMDFsdQorI2RlZmluZQlERAkgICAgMHgwMDAwMDAwMmx1CisjZGVmaW5lCUxDSEFOCSAgICAweDAwMDAwM0MwbHUKKyNkZWZpbmUJQklUU1dBUEVOICAgMHgwMDAwMDQwMGx1CisjZGVmaW5lCUJZU1dBUEVOICAgIDB4MDAwMDA4MDBsdQorI2RlZmluZQlNRkxPVwkgICAgMHgwMDAwNzAwMGx1CisjZGVmaW5lCUZJWEVEUE0JICAgIDB4MDAwODAwMDBsdQorI2RlZmluZQlTVEFSVFBBVCAgICAweDAwMzAwMDAwbHUKKyNkZWZpbmUJU1RPUFBBVAkgICAgMHgwMEMwMDAwMGx1CisjZGVmaW5lCUNPVU5UUE9TICAgIDB4MUMwMDAwMDBsdQorCisjZGVmaW5lCUREX1RYCSAgICAweDAwMDAwMDAwbHUKKyNkZWZpbmUJRERfUlgJICAgIDB4MDAwMDAwMDJsdQorCisjZGVmaW5lCUxDSEFOXzAJICAgIDB4MDAwMDAwMDBsdQorI2RlZmluZQlMQ0hBTl8xCSAgICAweDAwMDAwMDQwbHUKKyNkZWZpbmUJTENIQU5fMgkgICAgMHgwMDAwMDA4MGx1CisjZGVmaW5lCUxDSEFOXzMJICAgIDB4MDAwMDAwQzBsdQorI2RlZmluZQlMQ0hBTl80CSAgICAweDAwMDAwMTAwbHUKKyNkZWZpbmUJTENIQU5fNQkgICAgMHgwMDAwMDE0MGx1CisjZGVmaW5lCUxDSEFOXzYJICAgIDB4MDAwMDAxODBsdQorI2RlZmluZQlMQ0hBTl83CSAgICAweDAwMDAwMUMwbHUKKworI2RlZmluZQlNRkxPV19TVE9QICAweDAwMDAwMDAwbHUKKyNkZWZpbmUJTUZMT1dfQVVUTyAgMHgwMDAwMTAwMGx1CisjZGVmaW5lCU1GTE9XX1BWQyAgIDB4MDAwMDIwMDBsdQorI2RlZmluZQlNRkxPV19QU1MgICAweDAwMDAzMDAwbHUKKyNkZWZpbmUJTUZMT1dfUEZDICAgMHgwMDAwNDAwMGx1CisKKyNkZWZpbmUJU1RBUlRQQVRfMCAgMHgwMDAwMDAwMGx1CisjZGVmaW5lCVNUQVJUUEFUXzEgIDB4MDAxMDAwMDBsdQorCisjZGVmaW5lCVNUT1BQQVRfMCAgIDB4MDAwMDAwMDBsdQorI2RlZmluZQlTVE9QUEFUXzEgICAweDAwNDAwMDAwbHUKKworI2RlZmluZQlDT1VOVFBPU18wICAweDAwMDAwMDAwbHUKKyNkZWZpbmUJQ09VTlRQT1NfMSAgMHgwNDAwMDAwMGx1CisjZGVmaW5lCUNPVU5UUE9TXzIgIDB4MDgwMDAwMDBsdQorI2RlZmluZQlDT1VOVFBPU18zICAweDBDMDAwMDAwbHUKKyNkZWZpbmUJQ09VTlRQT1NfNCAgMHgxMDAwMDAwMGx1CisjZGVmaW5lCUNPVU5UUE9TXzUgIDB4MTQwMDAwMDBsdQorI2RlZmluZQlDT1VOVFBPU182ICAweDE4MDAwMDAwbHUKKyNkZWZpbmUJQ09VTlRQT1NfNyAgMHgxQzAwMDAwMGx1CisKKworLyogTVhWUl9BUF9DVEwgTWFza3MgKi8KKworI2RlZmluZQlTVEFSVEFQCSAgIDB4MDAwMDAwMDFsdQorI2RlZmluZQlDQU5DRUxBUCAgIDB4MDAwMDAwMDJsdQorI2RlZmluZQlSRVNFVEFQCSAgIDB4MDAwMDAwMDRsdQorI2RlZmluZQlBUFJCRTAJICAgMHgwMDAwNDAwMGx1CisjZGVmaW5lCUFQUkJFMQkgICAweDAwMDA4MDAwbHUKKyNkZWZpbmUJQVBSQkVYCSAgIDB4MDAwMEMwMDBsdQorCisKKy8qIE1YVlJfQ01fQ1RMIE1hc2tzICovCisKKyNkZWZpbmUJU1RBUlRDTQkgICAweDAwMDAwMDAxbHUKKyNkZWZpbmUJQ0FOQ0VMQ00gICAweDAwMDAwMDAybHUKKyNkZWZpbmUJQ01SQkVYCSAgIDB4RkZGRjAwMDBsdQorI2RlZmluZQlDTVJCRTAJICAgMHgwMDAxMDAwMGx1CisjZGVmaW5lCUNNUkJFMQkgICAweDAwMDIwMDAwbHUKKyNkZWZpbmUJQ01SQkUyCSAgIDB4MDAwNDAwMDBsdQorI2RlZmluZQlDTVJCRTMJICAgMHgwMDA4MDAwMGx1CisjZGVmaW5lCUNNUkJFNAkgICAweDAwMTAwMDAwbHUKKyNkZWZpbmUJQ01SQkU1CSAgIDB4MDAyMDAwMDBsdQorI2RlZmluZQlDTVJCRTYJICAgMHgwMDQwMDAwMGx1CisjZGVmaW5lCUNNUkJFNwkgICAweDAwODAwMDAwbHUKKyNkZWZpbmUJQ01SQkU4CSAgIDB4MDEwMDAwMDBsdQorI2RlZmluZQlDTVJCRTkJICAgMHgwMjAwMDAwMGx1CisjZGVmaW5lCUNNUkJFMTAJICAgMHgwNDAwMDAwMGx1CisjZGVmaW5lCUNNUkJFMTEJICAgMHgwODAwMDAwMGx1CisjZGVmaW5lCUNNUkJFMTIJICAgMHgxMDAwMDAwMGx1CisjZGVmaW5lCUNNUkJFMTMJICAgMHgyMDAwMDAwMGx1CisjZGVmaW5lCUNNUkJFMTQJICAgMHg0MDAwMDAwMGx1CisjZGVmaW5lCUNNUkJFMTUJICAgMHg4MDAwMDAwMGx1CisKKworLyogTVhWUl9QQVRfREFUQV94IE1hc2tzICovCisKKyNkZWZpbmUJTUFUQ0hfREFUQV8wIDB4MDAwMDAwRkZsdQorI2RlZmluZQlNQVRDSF9EQVRBXzEgMHgwMDAwRkYwMGx1CisjZGVmaW5lCU1BVENIX0RBVEFfMiAweDAwRkYwMDAwbHUKKyNkZWZpbmUJTUFUQ0hfREFUQV8zIDB4RkYwMDAwMDBsdQorCisKKworLyogTVhWUl9QQVRfRU5feCBNYXNrcyAqLworCisjZGVmaW5lCU1BVENIX0VOXzBfMCAweDAwMDAwMDAxbHUKKyNkZWZpbmUJTUFUQ0hfRU5fMF8xIDB4MDAwMDAwMDJsdQorI2RlZmluZQlNQVRDSF9FTl8wXzIgMHgwMDAwMDAwNGx1CisjZGVmaW5lCU1BVENIX0VOXzBfMyAweDAwMDAwMDA4bHUKKyNkZWZpbmUJTUFUQ0hfRU5fMF80IDB4MDAwMDAwMTBsdQorI2RlZmluZQlNQVRDSF9FTl8wXzUgMHgwMDAwMDAyMGx1CisjZGVmaW5lCU1BVENIX0VOXzBfNiAweDAwMDAwMDQwbHUKKyNkZWZpbmUJTUFUQ0hfRU5fMF83IDB4MDAwMDAwODBsdQorCisjZGVmaW5lCU1BVENIX0VOXzFfMCAweDAwMDAwMTAwbHUKKyNkZWZpbmUJTUFUQ0hfRU5fMV8xIDB4MDAwMDAyMDBsdQorI2RlZmluZQlNQVRDSF9FTl8xXzIgMHgwMDAwMDQwMGx1CisjZGVmaW5lCU1BVENIX0VOXzFfMyAweDAwMDAwODAwbHUKKyNkZWZpbmUJTUFUQ0hfRU5fMV80IDB4MDAwMDEwMDBsdQorI2RlZmluZQlNQVRDSF9FTl8xXzUgMHgwMDAwMjAwMGx1CisjZGVmaW5lCU1BVENIX0VOXzFfNiAweDAwMDA0MDAwbHUKKyNkZWZpbmUJTUFUQ0hfRU5fMV83IDB4MDAwMDgwMDBsdQorCisjZGVmaW5lCU1BVENIX0VOXzJfMCAweDAwMDEwMDAwbHUKKyNkZWZpbmUJTUFUQ0hfRU5fMl8xIDB4MDAwMjAwMDBsdQorI2RlZmluZQlNQVRDSF9FTl8yXzIgMHgwMDA0MDAwMGx1CisjZGVmaW5lCU1BVENIX0VOXzJfMyAweDAwMDgwMDAwbHUKKyNkZWZpbmUJTUFUQ0hfRU5fMl80IDB4MDAxMDAwMDBsdQorI2RlZmluZQlNQVRDSF9FTl8yXzUgMHgwMDIwMDAwMGx1CisjZGVmaW5lCU1BVENIX0VOXzJfNiAweDAwNDAwMDAwbHUKKyNkZWZpbmUJTUFUQ0hfRU5fMl83IDB4MDA4MDAwMDBsdQorCisjZGVmaW5lCU1BVENIX0VOXzNfMCAweDAxMDAwMDAwbHUKKyNkZWZpbmUJTUFUQ0hfRU5fM18xIDB4MDIwMDAwMDBsdQorI2RlZmluZQlNQVRDSF9FTl8zXzIgMHgwNDAwMDAwMGx1CisjZGVmaW5lCU1BVENIX0VOXzNfMyAweDA4MDAwMDAwbHUKKyNkZWZpbmUJTUFUQ0hfRU5fM180IDB4MTAwMDAwMDBsdQorI2RlZmluZQlNQVRDSF9FTl8zXzUgMHgyMDAwMDAwMGx1CisjZGVmaW5lCU1BVENIX0VOXzNfNiAweDQwMDAwMDAwbHUKKyNkZWZpbmUJTUFUQ0hfRU5fM183IDB4ODAwMDAwMDBsdQorCisKKy8qIE1YVlJfUk9VVElOR18wIE1hc2tzICovCisKKyNkZWZpbmUJTVVURV9DSDAJMHgwMDAwMDA4MGx1CisjZGVmaW5lCU1VVEVfQ0gxCTB4MDAwMDgwMDBsdQorI2RlZmluZQlNVVRFX0NIMgkweDAwODAwMDAwbHUKKyNkZWZpbmUJTVVURV9DSDMJMHg4MDAwMDAwMGx1CisKKyNkZWZpbmUJVFhfQ0gwCQkweDAwMDAwMDdGbHUKKyNkZWZpbmUJVFhfQ0gxCQkweDAwMDA3RjAwbHUKKyNkZWZpbmUJVFhfQ0gyCQkweDAwN0YwMDAwbHUKKyNkZWZpbmUJVFhfQ0gzCQkweDdGMDAwMDAwbHUKKworCisvKiBNWFZSX1JPVVRJTkdfMSBNYXNrcyAqLworCisjZGVmaW5lCU1VVEVfQ0g0CTB4MDAwMDAwODBsdQorI2RlZmluZQlNVVRFX0NINQkweDAwMDA4MDAwbHUKKyNkZWZpbmUJTVVURV9DSDYJMHgwMDgwMDAwMGx1CisjZGVmaW5lCU1VVEVfQ0g3CTB4ODAwMDAwMDBsdQorCisjZGVmaW5lCVRYX0NINAkJMHgwMDAwMDA3Rmx1CisjZGVmaW5lCVRYX0NINQkJMHgwMDAwN0YwMGx1CisjZGVmaW5lCVRYX0NINgkJMHgwMDdGMDAwMGx1CisjZGVmaW5lCVRYX0NINwkJMHg3RjAwMDAwMGx1CisKKworLyogTVhWUl9ST1VUSU5HXzIgTWFza3MgKi8KKworI2RlZmluZQlNVVRFX0NIOAkweDAwMDAwMDgwbHUKKyNkZWZpbmUJTVVURV9DSDkJMHgwMDAwODAwMGx1CisjZGVmaW5lCU1VVEVfQ0gxMAkweDAwODAwMDAwbHUKKyNkZWZpbmUJTVVURV9DSDExCTB4ODAwMDAwMDBsdQorCisjZGVmaW5lCVRYX0NIOAkJMHgwMDAwMDA3Rmx1CisjZGVmaW5lCVRYX0NIOQkJMHgwMDAwN0YwMGx1CisjZGVmaW5lCVRYX0NIMTAJCTB4MDA3RjAwMDBsdQorI2RlZmluZQlUWF9DSDExCQkweDdGMDAwMDAwbHUKKworLyogTVhWUl9ST1VUSU5HXzMgTWFza3MgKi8KKworI2RlZmluZQlNVVRFX0NIMTIJMHgwMDAwMDA4MGx1CisjZGVmaW5lCU1VVEVfQ0gxMwkweDAwMDA4MDAwbHUKKyNkZWZpbmUJTVVURV9DSDE0CTB4MDA4MDAwMDBsdQorI2RlZmluZQlNVVRFX0NIMTUJMHg4MDAwMDAwMGx1CisKKyNkZWZpbmUJVFhfQ0gxMgkJMHgwMDAwMDA3Rmx1CisjZGVmaW5lCVRYX0NIMTMJCTB4MDAwMDdGMDBsdQorI2RlZmluZQlUWF9DSDE0CQkweDAwN0YwMDAwbHUKKyNkZWZpbmUJVFhfQ0gxNQkJMHg3RjAwMDAwMGx1CisKKworLyogTVhWUl9ST1VUSU5HXzQgTWFza3MgKi8KKworI2RlZmluZQlNVVRFX0NIMTYJMHgwMDAwMDA4MGx1CisjZGVmaW5lCU1VVEVfQ0gxNwkweDAwMDA4MDAwbHUKKyNkZWZpbmUJTVVURV9DSDE4CTB4MDA4MDAwMDBsdQorI2RlZmluZQlNVVRFX0NIMTkJMHg4MDAwMDAwMGx1CisKKyNkZWZpbmUJVFhfQ0gxNgkJMHgwMDAwMDA3Rmx1CisjZGVmaW5lCVRYX0NIMTcJCTB4MDAwMDdGMDBsdQorI2RlZmluZQlUWF9DSDE4CQkweDAwN0YwMDAwbHUKKyNkZWZpbmUJVFhfQ0gxOQkJMHg3RjAwMDAwMGx1CisKKworLyogTVhWUl9ST1VUSU5HXzUgTWFza3MgKi8KKworI2RlZmluZQlNVVRFX0NIMjAJMHgwMDAwMDA4MGx1CisjZGVmaW5lCU1VVEVfQ0gyMQkweDAwMDA4MDAwbHUKKyNkZWZpbmUJTVVURV9DSDIyCTB4MDA4MDAwMDBsdQorI2RlZmluZQlNVVRFX0NIMjMJMHg4MDAwMDAwMGx1CisKKyNkZWZpbmUJVFhfQ0gyMAkJMHgwMDAwMDA3Rmx1CisjZGVmaW5lCVRYX0NIMjEJCTB4MDAwMDdGMDBsdQorI2RlZmluZQlUWF9DSDIyCQkweDAwN0YwMDAwbHUKKyNkZWZpbmUJVFhfQ0gyMwkJMHg3RjAwMDAwMGx1CisKKworLyogTVhWUl9ST1VUSU5HXzYgTWFza3MgKi8KKworI2RlZmluZQlNVVRFX0NIMjQJMHgwMDAwMDA4MGx1CisjZGVmaW5lCU1VVEVfQ0gyNQkweDAwMDA4MDAwbHUKKyNkZWZpbmUJTVVURV9DSDI2CTB4MDA4MDAwMDBsdQorI2RlZmluZQlNVVRFX0NIMjcJMHg4MDAwMDAwMGx1CisKKyNkZWZpbmUJVFhfQ0gyNAkJMHgwMDAwMDA3Rmx1CisjZGVmaW5lCVRYX0NIMjUJCTB4MDAwMDdGMDBsdQorI2RlZmluZQlUWF9DSDI2CQkweDAwN0YwMDAwbHUKKyNkZWZpbmUJVFhfQ0gyNwkJMHg3RjAwMDAwMGx1CisKKworLyogTVhWUl9ST1VUSU5HXzcgTWFza3MgKi8KKworI2RlZmluZQlNVVRFX0NIMjgJMHgwMDAwMDA4MGx1CisjZGVmaW5lCU1VVEVfQ0gyOQkweDAwMDA4MDAwbHUKKyNkZWZpbmUJTVVURV9DSDMwCTB4MDA4MDAwMDBsdQorI2RlZmluZQlNVVRFX0NIMzEJMHg4MDAwMDAwMGx1CisKKyNkZWZpbmUJVFhfQ0gyOAkJMHgwMDAwMDA3Rmx1CisjZGVmaW5lCVRYX0NIMjkJCTB4MDAwMDdGMDBsdQorI2RlZmluZQlUWF9DSDMwCQkweDAwN0YwMDAwbHUKKyNkZWZpbmUJVFhfQ0gzMQkJMHg3RjAwMDAwMGx1CisKKworLyogTVhWUl9ST1VUSU5HXzggTWFza3MgKi8KKworI2RlZmluZQlNVVRFX0NIMzIJMHgwMDAwMDA4MGx1CisjZGVmaW5lCU1VVEVfQ0gzMwkweDAwMDA4MDAwbHUKKyNkZWZpbmUJTVVURV9DSDM0CTB4MDA4MDAwMDBsdQorI2RlZmluZQlNVVRFX0NIMzUJMHg4MDAwMDAwMGx1CisKKyNkZWZpbmUJVFhfQ0gzMgkJMHgwMDAwMDA3Rmx1CisjZGVmaW5lCVRYX0NIMzMJCTB4MDAwMDdGMDBsdQorI2RlZmluZQlUWF9DSDM0CQkweDAwN0YwMDAwbHUKKyNkZWZpbmUJVFhfQ0gzNQkJMHg3RjAwMDAwMGx1CisKKworLyogTVhWUl9ST1VUSU5HXzkgTWFza3MgKi8KKworI2RlZmluZQlNVVRFX0NIMzYJMHgwMDAwMDA4MGx1CisjZGVmaW5lCU1VVEVfQ0gzNwkweDAwMDA4MDAwbHUKKyNkZWZpbmUJTVVURV9DSDM4CTB4MDA4MDAwMDBsdQorI2RlZmluZQlNVVRFX0NIMzkJMHg4MDAwMDAwMGx1CisKKyNkZWZpbmUJVFhfQ0gzNgkJMHgwMDAwMDA3Rmx1CisjZGVmaW5lCVRYX0NIMzcJCTB4MDAwMDdGMDBsdQorI2RlZmluZQlUWF9DSDM4CQkweDAwN0YwMDAwbHUKKyNkZWZpbmUJVFhfQ0gzOQkJMHg3RjAwMDAwMGx1CisKKworLyogTVhWUl9ST1VUSU5HXzEwIE1hc2tzICovCisKKyNkZWZpbmUJTVVURV9DSDQwCTB4MDAwMDAwODBsdQorI2RlZmluZQlNVVRFX0NINDEJMHgwMDAwODAwMGx1CisjZGVmaW5lCU1VVEVfQ0g0MgkweDAwODAwMDAwbHUKKyNkZWZpbmUJTVVURV9DSDQzCTB4ODAwMDAwMDBsdQorCisjZGVmaW5lCVRYX0NINDAJCTB4MDAwMDAwN0ZsdQorI2RlZmluZQlUWF9DSDQxCQkweDAwMDA3RjAwbHUKKyNkZWZpbmUJVFhfQ0g0MgkJMHgwMDdGMDAwMGx1CisjZGVmaW5lCVRYX0NINDMJCTB4N0YwMDAwMDBsdQorCisKKy8qIE1YVlJfUk9VVElOR18xMSBNYXNrcyAqLworCisjZGVmaW5lCU1VVEVfQ0g0NAkweDAwMDAwMDgwbHUKKyNkZWZpbmUJTVVURV9DSDQ1CTB4MDAwMDgwMDBsdQorI2RlZmluZQlNVVRFX0NINDYJMHgwMDgwMDAwMGx1CisjZGVmaW5lCU1VVEVfQ0g0NwkweDgwMDAwMDAwbHUKKworI2RlZmluZQlUWF9DSDQ0CQkweDAwMDAwMDdGbHUKKyNkZWZpbmUJVFhfQ0g0NQkJMHgwMDAwN0YwMGx1CisjZGVmaW5lCVRYX0NINDYJCTB4MDA3RjAwMDBsdQorI2RlZmluZQlUWF9DSDQ3CQkweDdGMDAwMDAwbHUKKworCisvKiBNWFZSX1JPVVRJTkdfMTIgTWFza3MgKi8KKworI2RlZmluZQlNVVRFX0NINDgJMHgwMDAwMDA4MGx1CisjZGVmaW5lCU1VVEVfQ0g0OQkweDAwMDA4MDAwbHUKKyNkZWZpbmUJTVVURV9DSDUwCTB4MDA4MDAwMDBsdQorI2RlZmluZQlNVVRFX0NINTEJMHg4MDAwMDAwMGx1CisKKyNkZWZpbmUJVFhfQ0g0OAkJMHgwMDAwMDA3Rmx1CisjZGVmaW5lCVRYX0NINDkJCTB4MDAwMDdGMDBsdQorI2RlZmluZQlUWF9DSDUwCQkweDAwN0YwMDAwbHUKKyNkZWZpbmUJVFhfQ0g1MQkJMHg3RjAwMDAwMGx1CisKKworLyogTVhWUl9ST1VUSU5HXzEzIE1hc2tzICovCisKKyNkZWZpbmUJTVVURV9DSDUyCTB4MDAwMDAwODBsdQorI2RlZmluZQlNVVRFX0NINTMJMHgwMDAwODAwMGx1CisjZGVmaW5lCU1VVEVfQ0g1NAkweDAwODAwMDAwbHUKKyNkZWZpbmUJTVVURV9DSDU1CTB4ODAwMDAwMDBsdQorCisjZGVmaW5lCVRYX0NINTIJCTB4MDAwMDAwN0ZsdQorI2RlZmluZQlUWF9DSDUzCQkweDAwMDA3RjAwbHUKKyNkZWZpbmUJVFhfQ0g1NAkJMHgwMDdGMDAwMGx1CisjZGVmaW5lCVRYX0NINTUJCTB4N0YwMDAwMDBsdQorCisKKy8qIE1YVlJfUk9VVElOR18xNCBNYXNrcyAqLworCisjZGVmaW5lCU1VVEVfQ0g1NgkweDAwMDAwMDgwbHUKKyNkZWZpbmUJTVVURV9DSDU3CTB4MDAwMDgwMDBsdQorI2RlZmluZQlNVVRFX0NINTgJMHgwMDgwMDAwMGx1CisjZGVmaW5lCU1VVEVfQ0g1OQkweDgwMDAwMDAwbHUKKworI2RlZmluZQlUWF9DSDU2CQkweDAwMDAwMDdGbHUKKyNkZWZpbmUJVFhfQ0g1NwkJMHgwMDAwN0YwMGx1CisjZGVmaW5lCVRYX0NINTgJCTB4MDA3RjAwMDBsdQorI2RlZmluZQlUWF9DSDU5CQkweDdGMDAwMDAwbHUKKworCisvKiBDb250cm9sIE1lc3NhZ2UgUmVjZWl2ZSBCdWZmZXIgKENNUkIpIEFkZHJlc3MgT2Zmc2V0cyAqLworCisjZGVmaW5lCUNNUkJfU1RSSURFCSAgMHgwMDAwMDAxNmx1CisKKyNkZWZpbmUJQ01SQl9EU1RfT0ZGU0VUCSAgMHgwMDAwMDAwMGx1CisjZGVmaW5lCUNNUkJfU1JDX09GRlNFVAkgIDB4MDAwMDAwMDJsdQorI2RlZmluZQlDTVJCX0RBVEFfT0ZGU0VUICAweDAwMDAwMDA1bHUKKworCisvKiBDb250cm9sIE1lc3NhZ2UgVHJhbnNtaXQgQnVmZmVyIChDTVRCKSBBZGRyZXNzIE9mZnNldHMgKi8KKworI2RlZmluZQlDTVRCX1BSSU9fT0ZGU0VUICAgIDB4MDAwMDAwMDBsdQorI2RlZmluZQlDTVRCX0RTVF9PRkZTRVQJICAgIDB4MDAwMDAwMDJsdQorI2RlZmluZQlDTVRCX1NSQ19PRkZTRVQJICAgIDB4MDAwMDAwMDRsdQorI2RlZmluZQlDTVRCX1RZUEVfT0ZGU0VUICAgIDB4MDAwMDAwMDZsdQorI2RlZmluZQlDTVRCX0RBVEFfT0ZGU0VUICAgIDB4MDAwMDAwMDdsdQorCisjZGVmaW5lCUNNVEJfQU5TV0VSX09GRlNFVCAgMHgwMDAwMDAwQWx1CisKKyNkZWZpbmUJQ01UQl9TVEFUX05fT0ZGU0VUICAweDAwMDAwMDE4bHUKKyNkZWZpbmUJQ01UQl9TVEFUX0FfT0ZGU0VUICAweDAwMDAwMDE2bHUKKyNkZWZpbmUJQ01UQl9TVEFUX0RfT0ZGU0VUICAweDAwMDAwMDBFbHUKKyNkZWZpbmUJQ01UQl9TVEFUX1JfT0ZGU0VUICAweDAwMDAwMDE0bHUKKyNkZWZpbmUJQ01UQl9TVEFUX1dfT0ZGU0VUICAweDAwMDAwMDE0bHUKKyNkZWZpbmUJQ01UQl9TVEFUX0dfT0ZGU0VUICAweDAwMDAwMDE0bHUKKworCisvKiBBc3luY2hyb25vdXMJUGFja2V0IFJlY2VpdmUgQnVmZmVyIChBUFJCKSBBZGRyZXNzIE9mZnNldHMgKi8KKworI2RlZmluZQlBUFJCX1NUUklERQkgIDB4MDAwMDA0MDBsdQorCisjZGVmaW5lCUFQUkJfRFNUX09GRlNFVAkgIDB4MDAwMDAwMDBsdQorI2RlZmluZQlBUFJCX0xFTl9PRkZTRVQJICAweDAwMDAwMDAybHUKKyNkZWZpbmUJQVBSQl9TUkNfT0ZGU0VUCSAgMHgwMDAwMDAwNGx1CisjZGVmaW5lCUFQUkJfREFUQV9PRkZTRVQgIDB4MDAwMDAwMDZsdQorCisKKy8qIEFzeW5jaHJvbm91cwlQYWNrZXQgVHJhbnNtaXQJQnVmZmVyIChBUFRCKSBBZGRyZXNzIE9mZnNldHMgKi8KKworI2RlZmluZQlBUFRCX1BSSU9fT0ZGU0VUICAweDAwMDAwMDAwbHUKKyNkZWZpbmUJQVBUQl9EU1RfT0ZGU0VUCSAgMHgwMDAwMDAwMmx1CisjZGVmaW5lCUFQVEJfTEVOX09GRlNFVAkgIDB4MDAwMDAwMDRsdQorI2RlZmluZQlBUFRCX1NSQ19PRkZTRVQJICAweDAwMDAwMDA2bHUKKyNkZWZpbmUJQVBUQl9EQVRBX09GRlNFVCAgMHgwMDAwMDAwOGx1CisKKworLyogUmVtb3RlIFJlYWQgQnVmZmVyIChSUkRCKSBBZGRyZXNzIE9mZnNldHMgKi8KKworI2RlZmluZQlSUkRCX1dBRERSX09GRlNFVCAweDAwMDAwMTAwbHUKKyNkZWZpbmUJUlJEQl9XTEVOX09GRlNFVCAgMHgwMDAwMDEwMWx1CisKKworCisvKiAqKioqKioqKioqKioJIENPTlRST0xMRVIgQVJFQSBORVRXT1JLIChDQU4pIE1BU0tTICAqKioqKioqKioqKioqKiovCisvKiBDQU5fQ09OVFJPTCBNYXNrcwkJCQkJICovCisjZGVmaW5lCVNSUwkJCTB4MDAwMQkvKiBTb2Z0d2FyZSBSZXNldCAqLworI2RlZmluZQlETk0JCQkweDAwMDIJLyogRGV2aWNlIE5ldCBNb2RlICovCisjZGVmaW5lCUFCTwkJCTB4MDAwNAkvKiBBdXRvLUJ1cyBPbiBFbmFibGUgKi8KKyNkZWZpbmUJV0JBCQkJMHgwMDEwCS8qIFdha2UtVXAgT24gQ0FOIEJ1cyBBY3Rpdml0eSBFbmFibGUgKi8KKyNkZWZpbmUJU01SCQkJMHgwMDIwCS8qIFNsZWVwIE1vZGUgUmVxdWVzdCAqLworI2RlZmluZQlDU1IJCQkweDAwNDAJLyogQ0FOIFN1c3BlbmQgTW9kZSBSZXF1ZXN0ICovCisjZGVmaW5lCUNDUgkJCTB4MDA4MAkvKiBDQU4gQ29uZmlndXJhdGlvbiBNb2RlIFJlcXVlc3QgKi8KKworLyogQ0FOX1NUQVRVUyBNYXNrcwkJCQkJICovCisjZGVmaW5lCVdUCQkJMHgwMDAxCS8qIFRYIFdhcm5pbmcgRmxhZyAqLworI2RlZmluZQlXUgkJCTB4MDAwMgkvKiBSWCBXYXJuaW5nIEZsYWcgKi8KKyNkZWZpbmUJRVAJCQkweDAwMDQJLyogRXJyb3IgUGFzc2l2ZSBNb2RlICovCisjZGVmaW5lCUVCTwkJCTB4MDAwOAkvKiBFcnJvciBCdXMgT2ZmIE1vZGUgKi8KKyNkZWZpbmUJQ1NBCQkJMHgwMDQwCS8qIFN1c3BlbmQgTW9kZQlBY2tub3dsZWRnZSAqLworI2RlZmluZQlDQ0EJCQkweDAwODAJLyogQ29uZmlndXJhdGlvbiBNb2RlIEFja25vd2xlZGdlICovCisjZGVmaW5lCU1CUFRSCQkweDFGMDAJLyogTWFpbGJveCBQb2ludGVyICovCisjZGVmaW5lCVRSTQkJCTB4NDAwMAkvKiBUcmFuc21pdCBNb2RlICovCisjZGVmaW5lCVJFQwkJCTB4ODAwMAkvKiBSZWNlaXZlIE1vZGUgKi8KKworLyogQ0FOX0NMT0NLIE1hc2tzCQkgKi8KKyNkZWZpbmUJQlJQCQkJMHgwM0ZGCS8qIEJpdC1SYXRlIFByZS1TY2FsZXIgKi8KKworLyogQ0FOX1RJTUlORyBNYXNrcwkJCQkgKi8KKyNkZWZpbmUJVFNFRzEJCTB4MDAwRgkvKiBUaW1lCVNlZ21lbnQJMSAqLworI2RlZmluZQlUU0VHMgkJMHgwMDcwCS8qIFRpbWUJU2VnbWVudAkyICovCisjZGVmaW5lCVNBTQkJCTB4MDA4MAkvKiBTYW1wbGluZyAqLworI2RlZmluZQlTSlcJCQkweDAzMDAJLyogU3luY2hyb25pemF0aW9uIEp1bXAJV2lkdGggKi8KKworLyogQ0FOX0RFQlVHIE1hc2tzCQkJCSAqLworI2RlZmluZQlERUMJCQkweDAwMDEJLyogRGlzYWJsZSBDQU4gRXJyb3IgQ291bnRlcnMgKi8KKyNkZWZpbmUJRFJJCQkJMHgwMDAyCS8qIERpc2FibGUgQ0FOIFJYIElucHV0ICovCisjZGVmaW5lCURUTwkJCTB4MDAwNAkvKiBEaXNhYmxlIENBTiBUWCBPdXRwdXQgKi8KKyNkZWZpbmUJRElMCQkJMHgwMDA4CS8qIERpc2FibGUgQ0FOIEludGVybmFsCUxvb3AgKi8KKyNkZWZpbmUJTUFBCQkJMHgwMDEwCS8qIE1vZGUJQXV0by1BY2tub3dsZWRnZSBFbmFibGUgKi8KKyNkZWZpbmUJTVJCCQkJMHgwMDIwCS8qIE1vZGUJUmVhZCBCYWNrIEVuYWJsZSAqLworI2RlZmluZQlDREUJCQkweDgwMDAJLyogQ0FOIERlYnVnIEVuYWJsZSAqLworCisvKiBDQU5fQ0VDIE1hc2tzCQkJICovCisjZGVmaW5lCVJYRUNOVAkJMHgwMEZGCS8qIFJlY2VpdmUgRXJyb3IgQ291bnRlciAqLworI2RlZmluZQlUWEVDTlQJCTB4RkYwMAkvKiBUcmFuc21pdCBFcnJvciBDb3VudGVyICovCisKKy8qIENBTl9JTlRSIE1hc2tzCQkJCSAqLworI2RlZmluZQlNQlJJUlEJMHgwMDAxCS8qIE1haWxib3ggUmVjZWl2ZSBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUJTUJSSUYJCU1CUklSUQkvKiBsZWdhY3kgKi8KKyNkZWZpbmUJTUJUSVJRCTB4MDAwMgkvKiBNYWlsYm94IFRyYW5zbWl0IEludGVycnVwdCAqLworI2RlZmluZQlNQlRJRgkJTUJUSVJRCS8qIGxlZ2FjeSAqLworI2RlZmluZQlHSVJRCQkweDAwMDQJLyogR2xvYmFsIEludGVycnVwdCAqLworI2RlZmluZQlTTUFDSwkJMHgwMDA4CS8qIFNsZWVwIE1vZGUgQWNrbm93bGVkZ2UgKi8KKyNkZWZpbmUJQ0FOVFgJCTB4MDA0MAkvKiBDQU4gVFggQnVzIFZhbHVlICovCisjZGVmaW5lCUNBTlJYCQkweDAwODAJLyogQ0FOIFJYIEJ1cyBWYWx1ZSAqLworCisvKiBDQU5fTUJ4eF9JRDEJYW5kIENBTl9NQnh4X0lEMCBNYXNrcwkJCSAqLworI2RlZmluZQlERkMJCQkweEZGRkYJLyogRGF0YQlGaWx0ZXJpbmcgQ29kZSAoSWYgRW5hYmxlZCkgKElEMCkgKi8KKyNkZWZpbmUJRVhUSURfTE8JMHhGRkZGCS8qIExvd2VyIDE2IEJpdHMgb2YgRXh0ZW5kZWQgSWRlbnRpZmllcgkoSUQwKSAqLworI2RlZmluZQlFWFRJRF9ISQkweDAwMDMJLyogVXBwZXIgMiBCaXRzCW9mIEV4dGVuZGVkIElkZW50aWZpZXIgKElEMSkgKi8KKyNkZWZpbmUJQkFTRUlECQkweDFGRkMJLyogQmFzZQlJZGVudGlmaWVyCSAqLworI2RlZmluZQlJREUJCQkweDIwMDAJLyogSWRlbnRpZmllciBFeHRlbnNpb24gKi8KKyNkZWZpbmUJUlRSCQkJMHg0MDAwCS8qIFJlbW90ZSBGcmFtZQlUcmFuc21pc3Npb24gUmVxdWVzdCAqLworI2RlZmluZQlBTUUJCQkweDgwMDAJLyogQWNjZXB0YW5jZSBNYXNrIEVuYWJsZSAqLworCisvKiBDQU5fTUJ4eF9USU1FU1RBTVAgTWFza3MgKi8KKyNkZWZpbmUJVFNWCQkJMHhGRkZGCS8qIFRpbWVzdGFtcCAqLworCisvKiBDQU5fTUJ4eF9MRU5HVEggTWFza3MgKi8KKyNkZWZpbmUJRExDCQkJMHgwMDBGCS8qIERhdGEJTGVuZ3RoIENvZGUgKi8KKworLyogQ0FOX0FNeHhIIGFuZCBDQU5fQU14eEwgTWFza3MJCQkJCSAqLworI2RlZmluZQlERk0JCQkweEZGRkYJLyogRGF0YQlGaWVsZCBNYXNrIChJZiBFbmFibGVkKQkoQ0FOX0FNeHhMKSAqLworI2RlZmluZQlFWFRJRF9MTwkweEZGRkYJLyogTG93ZXIgMTYgQml0cyBvZiBFeHRlbmRlZCBJZGVudGlmaWVyCShDQU5fQU14eEwpICovCisjZGVmaW5lCUVYVElEX0hJCTB4MDAwMwkvKiBVcHBlciAyIEJpdHMJb2YgRXh0ZW5kZWQgSWRlbnRpZmllciAoQ0FOX0FNeHhIKSAqLworI2RlZmluZQlCQVNFSUQJCTB4MUZGQwkvKiBCYXNlCUlkZW50aWZpZXIJCSAqLworI2RlZmluZQlBTUlERQkJMHgyMDAwCS8qIEFjY2VwdGFuY2UgTWFzayBJRCBFeHRlbnNpb24JRW5hYmxlICovCisjZGVmaW5lCUZNRAkJCTB4NDAwMAkvKiBGdWxsCU1hc2sgRGF0YSBGaWVsZAlFbmFibGUgKi8KKyNkZWZpbmUJRkRGCQkJMHg4MDAwCS8qIEZpbHRlciBPbiBEYXRhIEZpZWxkCUVuYWJsZSAqLworCisvKiBDQU5fTUMxIE1hc2tzCQkgKi8KKyNkZWZpbmUJTUMwCQkJMHgwMDAxCS8qIEVuYWJsZSBNYWlsYm94IDAgKi8KKyNkZWZpbmUJTUMxCQkJMHgwMDAyCS8qIEVuYWJsZSBNYWlsYm94IDEgKi8KKyNkZWZpbmUJTUMyCQkJMHgwMDA0CS8qIEVuYWJsZSBNYWlsYm94IDIgKi8KKyNkZWZpbmUJTUMzCQkJMHgwMDA4CS8qIEVuYWJsZSBNYWlsYm94IDMgKi8KKyNkZWZpbmUJTUM0CQkJMHgwMDEwCS8qIEVuYWJsZSBNYWlsYm94IDQgKi8KKyNkZWZpbmUJTUM1CQkJMHgwMDIwCS8qIEVuYWJsZSBNYWlsYm94IDUgKi8KKyNkZWZpbmUJTUM2CQkJMHgwMDQwCS8qIEVuYWJsZSBNYWlsYm94IDYgKi8KKyNkZWZpbmUJTUM3CQkJMHgwMDgwCS8qIEVuYWJsZSBNYWlsYm94IDcgKi8KKyNkZWZpbmUJTUM4CQkJMHgwMTAwCS8qIEVuYWJsZSBNYWlsYm94IDggKi8KKyNkZWZpbmUJTUM5CQkJMHgwMjAwCS8qIEVuYWJsZSBNYWlsYm94IDkgKi8KKyNkZWZpbmUJTUMxMAkJMHgwNDAwCS8qIEVuYWJsZSBNYWlsYm94IDEwICovCisjZGVmaW5lCU1DMTEJCTB4MDgwMAkvKiBFbmFibGUgTWFpbGJveCAxMSAqLworI2RlZmluZQlNQzEyCQkweDEwMDAJLyogRW5hYmxlIE1haWxib3ggMTIgKi8KKyNkZWZpbmUJTUMxMwkJMHgyMDAwCS8qIEVuYWJsZSBNYWlsYm94IDEzICovCisjZGVmaW5lCU1DMTQJCTB4NDAwMAkvKiBFbmFibGUgTWFpbGJveCAxNCAqLworI2RlZmluZQlNQzE1CQkweDgwMDAJLyogRW5hYmxlIE1haWxib3ggMTUgKi8KKworLyogQ0FOX01DMiBNYXNrcwkJICovCisjZGVmaW5lCU1DMTYJCTB4MDAwMQkvKiBFbmFibGUgTWFpbGJveCAxNiAqLworI2RlZmluZQlNQzE3CQkweDAwMDIJLyogRW5hYmxlIE1haWxib3ggMTcgKi8KKyNkZWZpbmUJTUMxOAkJMHgwMDA0CS8qIEVuYWJsZSBNYWlsYm94IDE4ICovCisjZGVmaW5lCU1DMTkJCTB4MDAwOAkvKiBFbmFibGUgTWFpbGJveCAxOSAqLworI2RlZmluZQlNQzIwCQkweDAwMTAJLyogRW5hYmxlIE1haWxib3ggMjAgKi8KKyNkZWZpbmUJTUMyMQkJMHgwMDIwCS8qIEVuYWJsZSBNYWlsYm94IDIxICovCisjZGVmaW5lCU1DMjIJCTB4MDA0MAkvKiBFbmFibGUgTWFpbGJveCAyMiAqLworI2RlZmluZQlNQzIzCQkweDAwODAJLyogRW5hYmxlIE1haWxib3ggMjMgKi8KKyNkZWZpbmUJTUMyNAkJMHgwMTAwCS8qIEVuYWJsZSBNYWlsYm94IDI0ICovCisjZGVmaW5lCU1DMjUJCTB4MDIwMAkvKiBFbmFibGUgTWFpbGJveCAyNSAqLworI2RlZmluZQlNQzI2CQkweDA0MDAJLyogRW5hYmxlIE1haWxib3ggMjYgKi8KKyNkZWZpbmUJTUMyNwkJMHgwODAwCS8qIEVuYWJsZSBNYWlsYm94IDI3ICovCisjZGVmaW5lCU1DMjgJCTB4MTAwMAkvKiBFbmFibGUgTWFpbGJveCAyOCAqLworI2RlZmluZQlNQzI5CQkweDIwMDAJLyogRW5hYmxlIE1haWxib3ggMjkgKi8KKyNkZWZpbmUJTUMzMAkJMHg0MDAwCS8qIEVuYWJsZSBNYWlsYm94IDMwICovCisjZGVmaW5lCU1DMzEJCTB4ODAwMAkvKiBFbmFibGUgTWFpbGJveCAzMSAqLworCisvKiBDQU5fTUQxIE1hc2tzCQkJCQkgKi8KKyNkZWZpbmUJTUQwCQkJMHgwMDAxCS8qIEVuYWJsZSBNYWlsYm94IDAgRm9yCVJlY2VpdmUgKi8KKyNkZWZpbmUJTUQxCQkJMHgwMDAyCS8qIEVuYWJsZSBNYWlsYm94IDEgRm9yCVJlY2VpdmUgKi8KKyNkZWZpbmUJTUQyCQkJMHgwMDA0CS8qIEVuYWJsZSBNYWlsYm94IDIgRm9yCVJlY2VpdmUgKi8KKyNkZWZpbmUJTUQzCQkJMHgwMDA4CS8qIEVuYWJsZSBNYWlsYm94IDMgRm9yCVJlY2VpdmUgKi8KKyNkZWZpbmUJTUQ0CQkJMHgwMDEwCS8qIEVuYWJsZSBNYWlsYm94IDQgRm9yCVJlY2VpdmUgKi8KKyNkZWZpbmUJTUQ1CQkJMHgwMDIwCS8qIEVuYWJsZSBNYWlsYm94IDUgRm9yCVJlY2VpdmUgKi8KKyNkZWZpbmUJTUQ2CQkJMHgwMDQwCS8qIEVuYWJsZSBNYWlsYm94IDYgRm9yCVJlY2VpdmUgKi8KKyNkZWZpbmUJTUQ3CQkJMHgwMDgwCS8qIEVuYWJsZSBNYWlsYm94IDcgRm9yCVJlY2VpdmUgKi8KKyNkZWZpbmUJTUQ4CQkJMHgwMTAwCS8qIEVuYWJsZSBNYWlsYm94IDggRm9yCVJlY2VpdmUgKi8KKyNkZWZpbmUJTUQ5CQkJMHgwMjAwCS8qIEVuYWJsZSBNYWlsYm94IDkgRm9yCVJlY2VpdmUgKi8KKyNkZWZpbmUJTUQxMAkJMHgwNDAwCS8qIEVuYWJsZSBNYWlsYm94IDEwIEZvciBSZWNlaXZlICovCisjZGVmaW5lCU1EMTEJCTB4MDgwMAkvKiBFbmFibGUgTWFpbGJveCAxMSBGb3IgUmVjZWl2ZSAqLworI2RlZmluZQlNRDEyCQkweDEwMDAJLyogRW5hYmxlIE1haWxib3ggMTIgRm9yIFJlY2VpdmUgKi8KKyNkZWZpbmUJTUQxMwkJMHgyMDAwCS8qIEVuYWJsZSBNYWlsYm94IDEzIEZvciBSZWNlaXZlICovCisjZGVmaW5lCU1EMTQJCTB4NDAwMAkvKiBFbmFibGUgTWFpbGJveCAxNCBGb3IgUmVjZWl2ZSAqLworI2RlZmluZQlNRDE1CQkweDgwMDAJLyogRW5hYmxlIE1haWxib3ggMTUgRm9yIFJlY2VpdmUgKi8KKworLyogQ0FOX01EMiBNYXNrcwkJCQkJICovCisjZGVmaW5lCU1EMTYJCTB4MDAwMQkvKiBFbmFibGUgTWFpbGJveCAxNiBGb3IgUmVjZWl2ZSAqLworI2RlZmluZQlNRDE3CQkweDAwMDIJLyogRW5hYmxlIE1haWxib3ggMTcgRm9yIFJlY2VpdmUgKi8KKyNkZWZpbmUJTUQxOAkJMHgwMDA0CS8qIEVuYWJsZSBNYWlsYm94IDE4IEZvciBSZWNlaXZlICovCisjZGVmaW5lCU1EMTkJCTB4MDAwOAkvKiBFbmFibGUgTWFpbGJveCAxOSBGb3IgUmVjZWl2ZSAqLworI2RlZmluZQlNRDIwCQkweDAwMTAJLyogRW5hYmxlIE1haWxib3ggMjAgRm9yIFJlY2VpdmUgKi8KKyNkZWZpbmUJTUQyMQkJMHgwMDIwCS8qIEVuYWJsZSBNYWlsYm94IDIxIEZvciBSZWNlaXZlICovCisjZGVmaW5lCU1EMjIJCTB4MDA0MAkvKiBFbmFibGUgTWFpbGJveCAyMiBGb3IgUmVjZWl2ZSAqLworI2RlZmluZQlNRDIzCQkweDAwODAJLyogRW5hYmxlIE1haWxib3ggMjMgRm9yIFJlY2VpdmUgKi8KKyNkZWZpbmUJTUQyNAkJMHgwMTAwCS8qIEVuYWJsZSBNYWlsYm94IDI0IEZvciBSZWNlaXZlICovCisjZGVmaW5lCU1EMjUJCTB4MDIwMAkvKiBFbmFibGUgTWFpbGJveCAyNSBGb3IgUmVjZWl2ZSAqLworI2RlZmluZQlNRDI2CQkweDA0MDAJLyogRW5hYmxlIE1haWxib3ggMjYgRm9yIFJlY2VpdmUgKi8KKyNkZWZpbmUJTUQyNwkJMHgwODAwCS8qIEVuYWJsZSBNYWlsYm94IDI3IEZvciBSZWNlaXZlICovCisjZGVmaW5lCU1EMjgJCTB4MTAwMAkvKiBFbmFibGUgTWFpbGJveCAyOCBGb3IgUmVjZWl2ZSAqLworI2RlZmluZQlNRDI5CQkweDIwMDAJLyogRW5hYmxlIE1haWxib3ggMjkgRm9yIFJlY2VpdmUgKi8KKyNkZWZpbmUJTUQzMAkJMHg0MDAwCS8qIEVuYWJsZSBNYWlsYm94IDMwIEZvciBSZWNlaXZlICovCisjZGVmaW5lCU1EMzEJCTB4ODAwMAkvKiBFbmFibGUgTWFpbGJveCAzMSBGb3IgUmVjZWl2ZSAqLworCisvKiBDQU5fUk1QMSBNYXNrcwkJCQkJICovCisjZGVmaW5lCVJNUDAJCTB4MDAwMQkvKiBSWCBNZXNzYWdlIFBlbmRpbmcgSW4gTWFpbGJveCAwICovCisjZGVmaW5lCVJNUDEJCTB4MDAwMgkvKiBSWCBNZXNzYWdlIFBlbmRpbmcgSW4gTWFpbGJveCAxICovCisjZGVmaW5lCVJNUDIJCTB4MDAwNAkvKiBSWCBNZXNzYWdlIFBlbmRpbmcgSW4gTWFpbGJveCAyICovCisjZGVmaW5lCVJNUDMJCTB4MDAwOAkvKiBSWCBNZXNzYWdlIFBlbmRpbmcgSW4gTWFpbGJveCAzICovCisjZGVmaW5lCVJNUDQJCTB4MDAxMAkvKiBSWCBNZXNzYWdlIFBlbmRpbmcgSW4gTWFpbGJveCA0ICovCisjZGVmaW5lCVJNUDUJCTB4MDAyMAkvKiBSWCBNZXNzYWdlIFBlbmRpbmcgSW4gTWFpbGJveCA1ICovCisjZGVmaW5lCVJNUDYJCTB4MDA0MAkvKiBSWCBNZXNzYWdlIFBlbmRpbmcgSW4gTWFpbGJveCA2ICovCisjZGVmaW5lCVJNUDcJCTB4MDA4MAkvKiBSWCBNZXNzYWdlIFBlbmRpbmcgSW4gTWFpbGJveCA3ICovCisjZGVmaW5lCVJNUDgJCTB4MDEwMAkvKiBSWCBNZXNzYWdlIFBlbmRpbmcgSW4gTWFpbGJveCA4ICovCisjZGVmaW5lCVJNUDkJCTB4MDIwMAkvKiBSWCBNZXNzYWdlIFBlbmRpbmcgSW4gTWFpbGJveCA5ICovCisjZGVmaW5lCVJNUDEwCQkweDA0MDAJLyogUlggTWVzc2FnZSBQZW5kaW5nIEluIE1haWxib3ggMTAgKi8KKyNkZWZpbmUJUk1QMTEJCTB4MDgwMAkvKiBSWCBNZXNzYWdlIFBlbmRpbmcgSW4gTWFpbGJveCAxMSAqLworI2RlZmluZQlSTVAxMgkJMHgxMDAwCS8qIFJYIE1lc3NhZ2UgUGVuZGluZyBJbiBNYWlsYm94IDEyICovCisjZGVmaW5lCVJNUDEzCQkweDIwMDAJLyogUlggTWVzc2FnZSBQZW5kaW5nIEluIE1haWxib3ggMTMgKi8KKyNkZWZpbmUJUk1QMTQJCTB4NDAwMAkvKiBSWCBNZXNzYWdlIFBlbmRpbmcgSW4gTWFpbGJveCAxNCAqLworI2RlZmluZQlSTVAxNQkJMHg4MDAwCS8qIFJYIE1lc3NhZ2UgUGVuZGluZyBJbiBNYWlsYm94IDE1ICovCisKKy8qIENBTl9STVAyIE1hc2tzCQkJCQkgKi8KKyNkZWZpbmUJUk1QMTYJCTB4MDAwMQkvKiBSWCBNZXNzYWdlIFBlbmRpbmcgSW4gTWFpbGJveCAxNiAqLworI2RlZmluZQlSTVAxNwkJMHgwMDAyCS8qIFJYIE1lc3NhZ2UgUGVuZGluZyBJbiBNYWlsYm94IDE3ICovCisjZGVmaW5lCVJNUDE4CQkweDAwMDQJLyogUlggTWVzc2FnZSBQZW5kaW5nIEluIE1haWxib3ggMTggKi8KKyNkZWZpbmUJUk1QMTkJCTB4MDAwOAkvKiBSWCBNZXNzYWdlIFBlbmRpbmcgSW4gTWFpbGJveCAxOSAqLworI2RlZmluZQlSTVAyMAkJMHgwMDEwCS8qIFJYIE1lc3NhZ2UgUGVuZGluZyBJbiBNYWlsYm94IDIwICovCisjZGVmaW5lCVJNUDIxCQkweDAwMjAJLyogUlggTWVzc2FnZSBQZW5kaW5nIEluIE1haWxib3ggMjEgKi8KKyNkZWZpbmUJUk1QMjIJCTB4MDA0MAkvKiBSWCBNZXNzYWdlIFBlbmRpbmcgSW4gTWFpbGJveCAyMiAqLworI2RlZmluZQlSTVAyMwkJMHgwMDgwCS8qIFJYIE1lc3NhZ2UgUGVuZGluZyBJbiBNYWlsYm94IDIzICovCisjZGVmaW5lCVJNUDI0CQkweDAxMDAJLyogUlggTWVzc2FnZSBQZW5kaW5nIEluIE1haWxib3ggMjQgKi8KKyNkZWZpbmUJUk1QMjUJCTB4MDIwMAkvKiBSWCBNZXNzYWdlIFBlbmRpbmcgSW4gTWFpbGJveCAyNSAqLworI2RlZmluZQlSTVAyNgkJMHgwNDAwCS8qIFJYIE1lc3NhZ2UgUGVuZGluZyBJbiBNYWlsYm94IDI2ICovCisjZGVmaW5lCVJNUDI3CQkweDA4MDAJLyogUlggTWVzc2FnZSBQZW5kaW5nIEluIE1haWxib3ggMjcgKi8KKyNkZWZpbmUJUk1QMjgJCTB4MTAwMAkvKiBSWCBNZXNzYWdlIFBlbmRpbmcgSW4gTWFpbGJveCAyOCAqLworI2RlZmluZQlSTVAyOQkJMHgyMDAwCS8qIFJYIE1lc3NhZ2UgUGVuZGluZyBJbiBNYWlsYm94IDI5ICovCisjZGVmaW5lCVJNUDMwCQkweDQwMDAJLyogUlggTWVzc2FnZSBQZW5kaW5nIEluIE1haWxib3ggMzAgKi8KKyNkZWZpbmUJUk1QMzEJCTB4ODAwMAkvKiBSWCBNZXNzYWdlIFBlbmRpbmcgSW4gTWFpbGJveCAzMSAqLworCisvKiBDQU5fUk1MMSBNYXNrcwkJCQkJICovCisjZGVmaW5lCVJNTDAJCTB4MDAwMQkvKiBSWCBNZXNzYWdlIExvc3QgSW4gTWFpbGJveCAwICovCisjZGVmaW5lCVJNTDEJCTB4MDAwMgkvKiBSWCBNZXNzYWdlIExvc3QgSW4gTWFpbGJveCAxICovCisjZGVmaW5lCVJNTDIJCTB4MDAwNAkvKiBSWCBNZXNzYWdlIExvc3QgSW4gTWFpbGJveCAyICovCisjZGVmaW5lCVJNTDMJCTB4MDAwOAkvKiBSWCBNZXNzYWdlIExvc3QgSW4gTWFpbGJveCAzICovCisjZGVmaW5lCVJNTDQJCTB4MDAxMAkvKiBSWCBNZXNzYWdlIExvc3QgSW4gTWFpbGJveCA0ICovCisjZGVmaW5lCVJNTDUJCTB4MDAyMAkvKiBSWCBNZXNzYWdlIExvc3QgSW4gTWFpbGJveCA1ICovCisjZGVmaW5lCVJNTDYJCTB4MDA0MAkvKiBSWCBNZXNzYWdlIExvc3QgSW4gTWFpbGJveCA2ICovCisjZGVmaW5lCVJNTDcJCTB4MDA4MAkvKiBSWCBNZXNzYWdlIExvc3QgSW4gTWFpbGJveCA3ICovCisjZGVmaW5lCVJNTDgJCTB4MDEwMAkvKiBSWCBNZXNzYWdlIExvc3QgSW4gTWFpbGJveCA4ICovCisjZGVmaW5lCVJNTDkJCTB4MDIwMAkvKiBSWCBNZXNzYWdlIExvc3QgSW4gTWFpbGJveCA5ICovCisjZGVmaW5lCVJNTDEwCQkweDA0MDAJLyogUlggTWVzc2FnZSBMb3N0IEluIE1haWxib3ggMTAgKi8KKyNkZWZpbmUJUk1MMTEJCTB4MDgwMAkvKiBSWCBNZXNzYWdlIExvc3QgSW4gTWFpbGJveCAxMSAqLworI2RlZmluZQlSTUwxMgkJMHgxMDAwCS8qIFJYIE1lc3NhZ2UgTG9zdCBJbiBNYWlsYm94IDEyICovCisjZGVmaW5lCVJNTDEzCQkweDIwMDAJLyogUlggTWVzc2FnZSBMb3N0IEluIE1haWxib3ggMTMgKi8KKyNkZWZpbmUJUk1MMTQJCTB4NDAwMAkvKiBSWCBNZXNzYWdlIExvc3QgSW4gTWFpbGJveCAxNCAqLworI2RlZmluZQlSTUwxNQkJMHg4MDAwCS8qIFJYIE1lc3NhZ2UgTG9zdCBJbiBNYWlsYm94IDE1ICovCisKKy8qIENBTl9STUwyIE1hc2tzCQkJCQkgKi8KKyNkZWZpbmUJUk1MMTYJCTB4MDAwMQkvKiBSWCBNZXNzYWdlIExvc3QgSW4gTWFpbGJveCAxNiAqLworI2RlZmluZQlSTUwxNwkJMHgwMDAyCS8qIFJYIE1lc3NhZ2UgTG9zdCBJbiBNYWlsYm94IDE3ICovCisjZGVmaW5lCVJNTDE4CQkweDAwMDQJLyogUlggTWVzc2FnZSBMb3N0IEluIE1haWxib3ggMTggKi8KKyNkZWZpbmUJUk1MMTkJCTB4MDAwOAkvKiBSWCBNZXNzYWdlIExvc3QgSW4gTWFpbGJveCAxOSAqLworI2RlZmluZQlSTUwyMAkJMHgwMDEwCS8qIFJYIE1lc3NhZ2UgTG9zdCBJbiBNYWlsYm94IDIwICovCisjZGVmaW5lCVJNTDIxCQkweDAwMjAJLyogUlggTWVzc2FnZSBMb3N0IEluIE1haWxib3ggMjEgKi8KKyNkZWZpbmUJUk1MMjIJCTB4MDA0MAkvKiBSWCBNZXNzYWdlIExvc3QgSW4gTWFpbGJveCAyMiAqLworI2RlZmluZQlSTUwyMwkJMHgwMDgwCS8qIFJYIE1lc3NhZ2UgTG9zdCBJbiBNYWlsYm94IDIzICovCisjZGVmaW5lCVJNTDI0CQkweDAxMDAJLyogUlggTWVzc2FnZSBMb3N0IEluIE1haWxib3ggMjQgKi8KKyNkZWZpbmUJUk1MMjUJCTB4MDIwMAkvKiBSWCBNZXNzYWdlIExvc3QgSW4gTWFpbGJveCAyNSAqLworI2RlZmluZQlSTUwyNgkJMHgwNDAwCS8qIFJYIE1lc3NhZ2UgTG9zdCBJbiBNYWlsYm94IDI2ICovCisjZGVmaW5lCVJNTDI3CQkweDA4MDAJLyogUlggTWVzc2FnZSBMb3N0IEluIE1haWxib3ggMjcgKi8KKyNkZWZpbmUJUk1MMjgJCTB4MTAwMAkvKiBSWCBNZXNzYWdlIExvc3QgSW4gTWFpbGJveCAyOCAqLworI2RlZmluZQlSTUwyOQkJMHgyMDAwCS8qIFJYIE1lc3NhZ2UgTG9zdCBJbiBNYWlsYm94IDI5ICovCisjZGVmaW5lCVJNTDMwCQkweDQwMDAJLyogUlggTWVzc2FnZSBMb3N0IEluIE1haWxib3ggMzAgKi8KKyNkZWZpbmUJUk1MMzEJCTB4ODAwMAkvKiBSWCBNZXNzYWdlIExvc3QgSW4gTWFpbGJveCAzMSAqLworCisvKiBDQU5fT1BTUzEgTWFza3MJCQkJCQkJCQkJCQkJICovCisjZGVmaW5lCU9QU1MwCQkweDAwMDEJLyogRW5hYmxlIFJYIE92ZXJ3cml0ZSBQcm90ZWN0aW9uIG9yIFRYCVNpbmdsZS1TaG90IEZvcglNYWlsYm94CTAgKi8KKyNkZWZpbmUJT1BTUzEJCTB4MDAwMgkvKiBFbmFibGUgUlggT3ZlcndyaXRlIFByb3RlY3Rpb24gb3IgVFgJU2luZ2xlLVNob3QgRm9yCU1haWxib3gJMSAqLworI2RlZmluZQlPUFNTMgkJMHgwMDA0CS8qIEVuYWJsZSBSWCBPdmVyd3JpdGUgUHJvdGVjdGlvbiBvciBUWAlTaW5nbGUtU2hvdCBGb3IJTWFpbGJveAkyICovCisjZGVmaW5lCU9QU1MzCQkweDAwMDgJLyogRW5hYmxlIFJYIE92ZXJ3cml0ZSBQcm90ZWN0aW9uIG9yIFRYCVNpbmdsZS1TaG90IEZvcglNYWlsYm94CTMgKi8KKyNkZWZpbmUJT1BTUzQJCTB4MDAxMAkvKiBFbmFibGUgUlggT3ZlcndyaXRlIFByb3RlY3Rpb24gb3IgVFgJU2luZ2xlLVNob3QgRm9yCU1haWxib3gJNCAqLworI2RlZmluZQlPUFNTNQkJMHgwMDIwCS8qIEVuYWJsZSBSWCBPdmVyd3JpdGUgUHJvdGVjdGlvbiBvciBUWAlTaW5nbGUtU2hvdCBGb3IJTWFpbGJveAk1ICovCisjZGVmaW5lCU9QU1M2CQkweDAwNDAJLyogRW5hYmxlIFJYIE92ZXJ3cml0ZSBQcm90ZWN0aW9uIG9yIFRYCVNpbmdsZS1TaG90IEZvcglNYWlsYm94CTYgKi8KKyNkZWZpbmUJT1BTUzcJCTB4MDA4MAkvKiBFbmFibGUgUlggT3ZlcndyaXRlIFByb3RlY3Rpb24gb3IgVFgJU2luZ2xlLVNob3QgRm9yCU1haWxib3gJNyAqLworI2RlZmluZQlPUFNTOAkJMHgwMTAwCS8qIEVuYWJsZSBSWCBPdmVyd3JpdGUgUHJvdGVjdGlvbiBvciBUWAlTaW5nbGUtU2hvdCBGb3IJTWFpbGJveAk4ICovCisjZGVmaW5lCU9QU1M5CQkweDAyMDAJLyogRW5hYmxlIFJYIE92ZXJ3cml0ZSBQcm90ZWN0aW9uIG9yIFRYCVNpbmdsZS1TaG90IEZvcglNYWlsYm94CTkgKi8KKyNkZWZpbmUJT1BTUzEwCQkweDA0MDAJLyogRW5hYmxlIFJYIE92ZXJ3cml0ZSBQcm90ZWN0aW9uIG9yIFRYCVNpbmdsZS1TaG90IEZvcglNYWlsYm94CTEwICovCisjZGVmaW5lCU9QU1MxMQkJMHgwODAwCS8qIEVuYWJsZSBSWCBPdmVyd3JpdGUgUHJvdGVjdGlvbiBvciBUWAlTaW5nbGUtU2hvdCBGb3IJTWFpbGJveAkxMSAqLworI2RlZmluZQlPUFNTMTIJCTB4MTAwMAkvKiBFbmFibGUgUlggT3ZlcndyaXRlIFByb3RlY3Rpb24gb3IgVFgJU2luZ2xlLVNob3QgRm9yCU1haWxib3gJMTIgKi8KKyNkZWZpbmUJT1BTUzEzCQkweDIwMDAJLyogRW5hYmxlIFJYIE92ZXJ3cml0ZSBQcm90ZWN0aW9uIG9yIFRYCVNpbmdsZS1TaG90IEZvcglNYWlsYm94CTEzICovCisjZGVmaW5lCU9QU1MxNAkJMHg0MDAwCS8qIEVuYWJsZSBSWCBPdmVyd3JpdGUgUHJvdGVjdGlvbiBvciBUWAlTaW5nbGUtU2hvdCBGb3IJTWFpbGJveAkxNCAqLworI2RlZmluZQlPUFNTMTUJCTB4ODAwMAkvKiBFbmFibGUgUlggT3ZlcndyaXRlIFByb3RlY3Rpb24gb3IgVFgJU2luZ2xlLVNob3QgRm9yCU1haWxib3gJMTUgKi8KKworLyogQ0FOX09QU1MyIE1hc2tzCQkJCQkJCQkJCQkJCSAqLworI2RlZmluZQlPUFNTMTYJCTB4MDAwMQkvKiBFbmFibGUgUlggT3ZlcndyaXRlIFByb3RlY3Rpb24gb3IgVFgJU2luZ2xlLVNob3QgRm9yCU1haWxib3gJMTYgKi8KKyNkZWZpbmUJT1BTUzE3CQkweDAwMDIJLyogRW5hYmxlIFJYIE92ZXJ3cml0ZSBQcm90ZWN0aW9uIG9yIFRYCVNpbmdsZS1TaG90IEZvcglNYWlsYm94CTE3ICovCisjZGVmaW5lCU9QU1MxOAkJMHgwMDA0CS8qIEVuYWJsZSBSWCBPdmVyd3JpdGUgUHJvdGVjdGlvbiBvciBUWAlTaW5nbGUtU2hvdCBGb3IJTWFpbGJveAkxOCAqLworI2RlZmluZQlPUFNTMTkJCTB4MDAwOAkvKiBFbmFibGUgUlggT3ZlcndyaXRlIFByb3RlY3Rpb24gb3IgVFgJU2luZ2xlLVNob3QgRm9yCU1haWxib3gJMTkgKi8KKyNkZWZpbmUJT1BTUzIwCQkweDAwMTAJLyogRW5hYmxlIFJYIE92ZXJ3cml0ZSBQcm90ZWN0aW9uIG9yIFRYCVNpbmdsZS1TaG90IEZvcglNYWlsYm94CTIwICovCisjZGVmaW5lCU9QU1MyMQkJMHgwMDIwCS8qIEVuYWJsZSBSWCBPdmVyd3JpdGUgUHJvdGVjdGlvbiBvciBUWAlTaW5nbGUtU2hvdCBGb3IJTWFpbGJveAkyMSAqLworI2RlZmluZQlPUFNTMjIJCTB4MDA0MAkvKiBFbmFibGUgUlggT3ZlcndyaXRlIFByb3RlY3Rpb24gb3IgVFgJU2luZ2xlLVNob3QgRm9yCU1haWxib3gJMjIgKi8KKyNkZWZpbmUJT1BTUzIzCQkweDAwODAJLyogRW5hYmxlIFJYIE92ZXJ3cml0ZSBQcm90ZWN0aW9uIG9yIFRYCVNpbmdsZS1TaG90IEZvcglNYWlsYm94CTIzICovCisjZGVmaW5lCU9QU1MyNAkJMHgwMTAwCS8qIEVuYWJsZSBSWCBPdmVyd3JpdGUgUHJvdGVjdGlvbiBvciBUWAlTaW5nbGUtU2hvdCBGb3IJTWFpbGJveAkyNCAqLworI2RlZmluZQlPUFNTMjUJCTB4MDIwMAkvKiBFbmFibGUgUlggT3ZlcndyaXRlIFByb3RlY3Rpb24gb3IgVFgJU2luZ2xlLVNob3QgRm9yCU1haWxib3gJMjUgKi8KKyNkZWZpbmUJT1BTUzI2CQkweDA0MDAJLyogRW5hYmxlIFJYIE92ZXJ3cml0ZSBQcm90ZWN0aW9uIG9yIFRYCVNpbmdsZS1TaG90IEZvcglNYWlsYm94CTI2ICovCisjZGVmaW5lCU9QU1MyNwkJMHgwODAwCS8qIEVuYWJsZSBSWCBPdmVyd3JpdGUgUHJvdGVjdGlvbiBvciBUWAlTaW5nbGUtU2hvdCBGb3IJTWFpbGJveAkyNyAqLworI2RlZmluZQlPUFNTMjgJCTB4MTAwMAkvKiBFbmFibGUgUlggT3ZlcndyaXRlIFByb3RlY3Rpb24gb3IgVFgJU2luZ2xlLVNob3QgRm9yCU1haWxib3gJMjggKi8KKyNkZWZpbmUJT1BTUzI5CQkweDIwMDAJLyogRW5hYmxlIFJYIE92ZXJ3cml0ZSBQcm90ZWN0aW9uIG9yIFRYCVNpbmdsZS1TaG90IEZvcglNYWlsYm94CTI5ICovCisjZGVmaW5lCU9QU1MzMAkJMHg0MDAwCS8qIEVuYWJsZSBSWCBPdmVyd3JpdGUgUHJvdGVjdGlvbiBvciBUWAlTaW5nbGUtU2hvdCBGb3IJTWFpbGJveAkzMCAqLworI2RlZmluZQlPUFNTMzEJCTB4ODAwMAkvKiBFbmFibGUgUlggT3ZlcndyaXRlIFByb3RlY3Rpb24gb3IgVFgJU2luZ2xlLVNob3QgRm9yCU1haWxib3gJMzEgKi8KKworLyogQ0FOX1RSUjEgTWFza3MJCQkJCQkJICovCisjZGVmaW5lCVRSUjAJCTB4MDAwMQkvKiBEZW55CUJ1dCBEb24ndCBMb2NrIEFjY2VzcyBUbyBNYWlsYm94IDAgKi8KKyNkZWZpbmUJVFJSMQkJMHgwMDAyCS8qIERlbnkJQnV0IERvbid0IExvY2sgQWNjZXNzIFRvIE1haWxib3ggMSAqLworI2RlZmluZQlUUlIyCQkweDAwMDQJLyogRGVueQlCdXQgRG9uJ3QgTG9jayBBY2Nlc3MgVG8gTWFpbGJveCAyICovCisjZGVmaW5lCVRSUjMJCTB4MDAwOAkvKiBEZW55CUJ1dCBEb24ndCBMb2NrIEFjY2VzcyBUbyBNYWlsYm94IDMgKi8KKyNkZWZpbmUJVFJSNAkJMHgwMDEwCS8qIERlbnkJQnV0IERvbid0IExvY2sgQWNjZXNzIFRvIE1haWxib3ggNCAqLworI2RlZmluZQlUUlI1CQkweDAwMjAJLyogRGVueQlCdXQgRG9uJ3QgTG9jayBBY2Nlc3MgVG8gTWFpbGJveCA1ICovCisjZGVmaW5lCVRSUjYJCTB4MDA0MAkvKiBEZW55CUJ1dCBEb24ndCBMb2NrIEFjY2VzcyBUbyBNYWlsYm94IDYgKi8KKyNkZWZpbmUJVFJSNwkJMHgwMDgwCS8qIERlbnkJQnV0IERvbid0IExvY2sgQWNjZXNzIFRvIE1haWxib3ggNyAqLworI2RlZmluZQlUUlI4CQkweDAxMDAJLyogRGVueQlCdXQgRG9uJ3QgTG9jayBBY2Nlc3MgVG8gTWFpbGJveCA4ICovCisjZGVmaW5lCVRSUjkJCTB4MDIwMAkvKiBEZW55CUJ1dCBEb24ndCBMb2NrIEFjY2VzcyBUbyBNYWlsYm94IDkgKi8KKyNkZWZpbmUJVFJSMTAJCTB4MDQwMAkvKiBEZW55CUJ1dCBEb24ndCBMb2NrIEFjY2VzcyBUbyBNYWlsYm94IDEwICovCisjZGVmaW5lCVRSUjExCQkweDA4MDAJLyogRGVueQlCdXQgRG9uJ3QgTG9jayBBY2Nlc3MgVG8gTWFpbGJveCAxMSAqLworI2RlZmluZQlUUlIxMgkJMHgxMDAwCS8qIERlbnkJQnV0IERvbid0IExvY2sgQWNjZXNzIFRvIE1haWxib3ggMTIgKi8KKyNkZWZpbmUJVFJSMTMJCTB4MjAwMAkvKiBEZW55CUJ1dCBEb24ndCBMb2NrIEFjY2VzcyBUbyBNYWlsYm94IDEzICovCisjZGVmaW5lCVRSUjE0CQkweDQwMDAJLyogRGVueQlCdXQgRG9uJ3QgTG9jayBBY2Nlc3MgVG8gTWFpbGJveCAxNCAqLworI2RlZmluZQlUUlIxNQkJMHg4MDAwCS8qIERlbnkJQnV0IERvbid0IExvY2sgQWNjZXNzIFRvIE1haWxib3ggMTUgKi8KKworLyogQ0FOX1RSUjIgTWFza3MJCQkJCQkJICovCisjZGVmaW5lCVRSUjE2CQkweDAwMDEJLyogRGVueQlCdXQgRG9uJ3QgTG9jayBBY2Nlc3MgVG8gTWFpbGJveCAxNiAqLworI2RlZmluZQlUUlIxNwkJMHgwMDAyCS8qIERlbnkJQnV0IERvbid0IExvY2sgQWNjZXNzIFRvIE1haWxib3ggMTcgKi8KKyNkZWZpbmUJVFJSMTgJCTB4MDAwNAkvKiBEZW55CUJ1dCBEb24ndCBMb2NrIEFjY2VzcyBUbyBNYWlsYm94IDE4ICovCisjZGVmaW5lCVRSUjE5CQkweDAwMDgJLyogRGVueQlCdXQgRG9uJ3QgTG9jayBBY2Nlc3MgVG8gTWFpbGJveCAxOSAqLworI2RlZmluZQlUUlIyMAkJMHgwMDEwCS8qIERlbnkJQnV0IERvbid0IExvY2sgQWNjZXNzIFRvIE1haWxib3ggMjAgKi8KKyNkZWZpbmUJVFJSMjEJCTB4MDAyMAkvKiBEZW55CUJ1dCBEb24ndCBMb2NrIEFjY2VzcyBUbyBNYWlsYm94IDIxICovCisjZGVmaW5lCVRSUjIyCQkweDAwNDAJLyogRGVueQlCdXQgRG9uJ3QgTG9jayBBY2Nlc3MgVG8gTWFpbGJveCAyMiAqLworI2RlZmluZQlUUlIyMwkJMHgwMDgwCS8qIERlbnkJQnV0IERvbid0IExvY2sgQWNjZXNzIFRvIE1haWxib3ggMjMgKi8KKyNkZWZpbmUJVFJSMjQJCTB4MDEwMAkvKiBEZW55CUJ1dCBEb24ndCBMb2NrIEFjY2VzcyBUbyBNYWlsYm94IDI0ICovCisjZGVmaW5lCVRSUjI1CQkweDAyMDAJLyogRGVueQlCdXQgRG9uJ3QgTG9jayBBY2Nlc3MgVG8gTWFpbGJveCAyNSAqLworI2RlZmluZQlUUlIyNgkJMHgwNDAwCS8qIERlbnkJQnV0IERvbid0IExvY2sgQWNjZXNzIFRvIE1haWxib3ggMjYgKi8KKyNkZWZpbmUJVFJSMjcJCTB4MDgwMAkvKiBEZW55CUJ1dCBEb24ndCBMb2NrIEFjY2VzcyBUbyBNYWlsYm94IDI3ICovCisjZGVmaW5lCVRSUjI4CQkweDEwMDAJLyogRGVueQlCdXQgRG9uJ3QgTG9jayBBY2Nlc3MgVG8gTWFpbGJveCAyOCAqLworI2RlZmluZQlUUlIyOQkJMHgyMDAwCS8qIERlbnkJQnV0IERvbid0IExvY2sgQWNjZXNzIFRvIE1haWxib3ggMjkgKi8KKyNkZWZpbmUJVFJSMzAJCTB4NDAwMAkvKiBEZW55CUJ1dCBEb24ndCBMb2NrIEFjY2VzcyBUbyBNYWlsYm94IDMwICovCisjZGVmaW5lCVRSUjMxCQkweDgwMDAJLyogRGVueQlCdXQgRG9uJ3QgTG9jayBBY2Nlc3MgVG8gTWFpbGJveCAzMSAqLworCisvKiBDQU5fVFJTMSBNYXNrcwkJCQkJCSAqLworI2RlZmluZQlUUlMwCQkweDAwMDEJLyogUmVtb3RlIEZyYW1lCVJlcXVlc3QJRm9yIE1haWxib3ggMCAqLworI2RlZmluZQlUUlMxCQkweDAwMDIJLyogUmVtb3RlIEZyYW1lCVJlcXVlc3QJRm9yIE1haWxib3ggMSAqLworI2RlZmluZQlUUlMyCQkweDAwMDQJLyogUmVtb3RlIEZyYW1lCVJlcXVlc3QJRm9yIE1haWxib3ggMiAqLworI2RlZmluZQlUUlMzCQkweDAwMDgJLyogUmVtb3RlIEZyYW1lCVJlcXVlc3QJRm9yIE1haWxib3ggMyAqLworI2RlZmluZQlUUlM0CQkweDAwMTAJLyogUmVtb3RlIEZyYW1lCVJlcXVlc3QJRm9yIE1haWxib3ggNCAqLworI2RlZmluZQlUUlM1CQkweDAwMjAJLyogUmVtb3RlIEZyYW1lCVJlcXVlc3QJRm9yIE1haWxib3ggNSAqLworI2RlZmluZQlUUlM2CQkweDAwNDAJLyogUmVtb3RlIEZyYW1lCVJlcXVlc3QJRm9yIE1haWxib3ggNiAqLworI2RlZmluZQlUUlM3CQkweDAwODAJLyogUmVtb3RlIEZyYW1lCVJlcXVlc3QJRm9yIE1haWxib3ggNyAqLworI2RlZmluZQlUUlM4CQkweDAxMDAJLyogUmVtb3RlIEZyYW1lCVJlcXVlc3QJRm9yIE1haWxib3ggOCAqLworI2RlZmluZQlUUlM5CQkweDAyMDAJLyogUmVtb3RlIEZyYW1lCVJlcXVlc3QJRm9yIE1haWxib3ggOSAqLworI2RlZmluZQlUUlMxMAkJMHgwNDAwCS8qIFJlbW90ZSBGcmFtZQlSZXF1ZXN0CUZvciBNYWlsYm94IDEwICovCisjZGVmaW5lCVRSUzExCQkweDA4MDAJLyogUmVtb3RlIEZyYW1lCVJlcXVlc3QJRm9yIE1haWxib3ggMTEgKi8KKyNkZWZpbmUJVFJTMTIJCTB4MTAwMAkvKiBSZW1vdGUgRnJhbWUJUmVxdWVzdAlGb3IgTWFpbGJveCAxMiAqLworI2RlZmluZQlUUlMxMwkJMHgyMDAwCS8qIFJlbW90ZSBGcmFtZQlSZXF1ZXN0CUZvciBNYWlsYm94IDEzICovCisjZGVmaW5lCVRSUzE0CQkweDQwMDAJLyogUmVtb3RlIEZyYW1lCVJlcXVlc3QJRm9yIE1haWxib3ggMTQgKi8KKyNkZWZpbmUJVFJTMTUJCTB4ODAwMAkvKiBSZW1vdGUgRnJhbWUJUmVxdWVzdAlGb3IgTWFpbGJveCAxNSAqLworCisvKiBDQU5fVFJTMiBNYXNrcwkJCQkJCSAqLworI2RlZmluZQlUUlMxNgkJMHgwMDAxCS8qIFJlbW90ZSBGcmFtZQlSZXF1ZXN0CUZvciBNYWlsYm94IDE2ICovCisjZGVmaW5lCVRSUzE3CQkweDAwMDIJLyogUmVtb3RlIEZyYW1lCVJlcXVlc3QJRm9yIE1haWxib3ggMTcgKi8KKyNkZWZpbmUJVFJTMTgJCTB4MDAwNAkvKiBSZW1vdGUgRnJhbWUJUmVxdWVzdAlGb3IgTWFpbGJveCAxOCAqLworI2RlZmluZQlUUlMxOQkJMHgwMDA4CS8qIFJlbW90ZSBGcmFtZQlSZXF1ZXN0CUZvciBNYWlsYm94IDE5ICovCisjZGVmaW5lCVRSUzIwCQkweDAwMTAJLyogUmVtb3RlIEZyYW1lCVJlcXVlc3QJRm9yIE1haWxib3ggMjAgKi8KKyNkZWZpbmUJVFJTMjEJCTB4MDAyMAkvKiBSZW1vdGUgRnJhbWUJUmVxdWVzdAlGb3IgTWFpbGJveCAyMSAqLworI2RlZmluZQlUUlMyMgkJMHgwMDQwCS8qIFJlbW90ZSBGcmFtZQlSZXF1ZXN0CUZvciBNYWlsYm94IDIyICovCisjZGVmaW5lCVRSUzIzCQkweDAwODAJLyogUmVtb3RlIEZyYW1lCVJlcXVlc3QJRm9yIE1haWxib3ggMjMgKi8KKyNkZWZpbmUJVFJTMjQJCTB4MDEwMAkvKiBSZW1vdGUgRnJhbWUJUmVxdWVzdAlGb3IgTWFpbGJveCAyNCAqLworI2RlZmluZQlUUlMyNQkJMHgwMjAwCS8qIFJlbW90ZSBGcmFtZQlSZXF1ZXN0CUZvciBNYWlsYm94IDI1ICovCisjZGVmaW5lCVRSUzI2CQkweDA0MDAJLyogUmVtb3RlIEZyYW1lCVJlcXVlc3QJRm9yIE1haWxib3ggMjYgKi8KKyNkZWZpbmUJVFJTMjcJCTB4MDgwMAkvKiBSZW1vdGUgRnJhbWUJUmVxdWVzdAlGb3IgTWFpbGJveCAyNyAqLworI2RlZmluZQlUUlMyOAkJMHgxMDAwCS8qIFJlbW90ZSBGcmFtZQlSZXF1ZXN0CUZvciBNYWlsYm94IDI4ICovCisjZGVmaW5lCVRSUzI5CQkweDIwMDAJLyogUmVtb3RlIEZyYW1lCVJlcXVlc3QJRm9yIE1haWxib3ggMjkgKi8KKyNkZWZpbmUJVFJTMzAJCTB4NDAwMAkvKiBSZW1vdGUgRnJhbWUJUmVxdWVzdAlGb3IgTWFpbGJveCAzMCAqLworI2RlZmluZQlUUlMzMQkJMHg4MDAwCS8qIFJlbW90ZSBGcmFtZQlSZXF1ZXN0CUZvciBNYWlsYm94IDMxICovCisKKy8qIENBTl9BQTEgTWFza3MJCQkJCSAqLworI2RlZmluZQlBQTAJCQkweDAwMDEJLyogQWJvcnRlZCBNZXNzYWdlIEluIE1haWxib3ggMCAqLworI2RlZmluZQlBQTEJCQkweDAwMDIJLyogQWJvcnRlZCBNZXNzYWdlIEluIE1haWxib3ggMSAqLworI2RlZmluZQlBQTIJCQkweDAwMDQJLyogQWJvcnRlZCBNZXNzYWdlIEluIE1haWxib3ggMiAqLworI2RlZmluZQlBQTMJCQkweDAwMDgJLyogQWJvcnRlZCBNZXNzYWdlIEluIE1haWxib3ggMyAqLworI2RlZmluZQlBQTQJCQkweDAwMTAJLyogQWJvcnRlZCBNZXNzYWdlIEluIE1haWxib3ggNCAqLworI2RlZmluZQlBQTUJCQkweDAwMjAJLyogQWJvcnRlZCBNZXNzYWdlIEluIE1haWxib3ggNSAqLworI2RlZmluZQlBQTYJCQkweDAwNDAJLyogQWJvcnRlZCBNZXNzYWdlIEluIE1haWxib3ggNiAqLworI2RlZmluZQlBQTcJCQkweDAwODAJLyogQWJvcnRlZCBNZXNzYWdlIEluIE1haWxib3ggNyAqLworI2RlZmluZQlBQTgJCQkweDAxMDAJLyogQWJvcnRlZCBNZXNzYWdlIEluIE1haWxib3ggOCAqLworI2RlZmluZQlBQTkJCQkweDAyMDAJLyogQWJvcnRlZCBNZXNzYWdlIEluIE1haWxib3ggOSAqLworI2RlZmluZQlBQTEwCQkweDA0MDAJLyogQWJvcnRlZCBNZXNzYWdlIEluIE1haWxib3ggMTAgKi8KKyNkZWZpbmUJQUExMQkJMHgwODAwCS8qIEFib3J0ZWQgTWVzc2FnZSBJbiBNYWlsYm94IDExICovCisjZGVmaW5lCUFBMTIJCTB4MTAwMAkvKiBBYm9ydGVkIE1lc3NhZ2UgSW4gTWFpbGJveCAxMiAqLworI2RlZmluZQlBQTEzCQkweDIwMDAJLyogQWJvcnRlZCBNZXNzYWdlIEluIE1haWxib3ggMTMgKi8KKyNkZWZpbmUJQUExNAkJMHg0MDAwCS8qIEFib3J0ZWQgTWVzc2FnZSBJbiBNYWlsYm94IDE0ICovCisjZGVmaW5lCUFBMTUJCTB4ODAwMAkvKiBBYm9ydGVkIE1lc3NhZ2UgSW4gTWFpbGJveCAxNSAqLworCisvKiBDQU5fQUEyIE1hc2tzCQkJCQkgKi8KKyNkZWZpbmUJQUExNgkJMHgwMDAxCS8qIEFib3J0ZWQgTWVzc2FnZSBJbiBNYWlsYm94IDE2ICovCisjZGVmaW5lCUFBMTcJCTB4MDAwMgkvKiBBYm9ydGVkIE1lc3NhZ2UgSW4gTWFpbGJveCAxNyAqLworI2RlZmluZQlBQTE4CQkweDAwMDQJLyogQWJvcnRlZCBNZXNzYWdlIEluIE1haWxib3ggMTggKi8KKyNkZWZpbmUJQUExOQkJMHgwMDA4CS8qIEFib3J0ZWQgTWVzc2FnZSBJbiBNYWlsYm94IDE5ICovCisjZGVmaW5lCUFBMjAJCTB4MDAxMAkvKiBBYm9ydGVkIE1lc3NhZ2UgSW4gTWFpbGJveCAyMCAqLworI2RlZmluZQlBQTIxCQkweDAwMjAJLyogQWJvcnRlZCBNZXNzYWdlIEluIE1haWxib3ggMjEgKi8KKyNkZWZpbmUJQUEyMgkJMHgwMDQwCS8qIEFib3J0ZWQgTWVzc2FnZSBJbiBNYWlsYm94IDIyICovCisjZGVmaW5lCUFBMjMJCTB4MDA4MAkvKiBBYm9ydGVkIE1lc3NhZ2UgSW4gTWFpbGJveCAyMyAqLworI2RlZmluZQlBQTI0CQkweDAxMDAJLyogQWJvcnRlZCBNZXNzYWdlIEluIE1haWxib3ggMjQgKi8KKyNkZWZpbmUJQUEyNQkJMHgwMjAwCS8qIEFib3J0ZWQgTWVzc2FnZSBJbiBNYWlsYm94IDI1ICovCisjZGVmaW5lCUFBMjYJCTB4MDQwMAkvKiBBYm9ydGVkIE1lc3NhZ2UgSW4gTWFpbGJveCAyNiAqLworI2RlZmluZQlBQTI3CQkweDA4MDAJLyogQWJvcnRlZCBNZXNzYWdlIEluIE1haWxib3ggMjcgKi8KKyNkZWZpbmUJQUEyOAkJMHgxMDAwCS8qIEFib3J0ZWQgTWVzc2FnZSBJbiBNYWlsYm94IDI4ICovCisjZGVmaW5lCUFBMjkJCTB4MjAwMAkvKiBBYm9ydGVkIE1lc3NhZ2UgSW4gTWFpbGJveCAyOSAqLworI2RlZmluZQlBQTMwCQkweDQwMDAJLyogQWJvcnRlZCBNZXNzYWdlIEluIE1haWxib3ggMzAgKi8KKyNkZWZpbmUJQUEzMQkJMHg4MDAwCS8qIEFib3J0ZWQgTWVzc2FnZSBJbiBNYWlsYm94IDMxICovCisKKy8qIENBTl9UQTEgTWFza3MJCQkJCQkgKi8KKyNkZWZpbmUJVEEwCQkJMHgwMDAxCS8qIFRyYW5zbWl0IFN1Y2Nlc3NmdWwgRnJvbSBNYWlsYm94IDAgKi8KKyNkZWZpbmUJVEExCQkJMHgwMDAyCS8qIFRyYW5zbWl0IFN1Y2Nlc3NmdWwgRnJvbSBNYWlsYm94IDEgKi8KKyNkZWZpbmUJVEEyCQkJMHgwMDA0CS8qIFRyYW5zbWl0IFN1Y2Nlc3NmdWwgRnJvbSBNYWlsYm94IDIgKi8KKyNkZWZpbmUJVEEzCQkJMHgwMDA4CS8qIFRyYW5zbWl0IFN1Y2Nlc3NmdWwgRnJvbSBNYWlsYm94IDMgKi8KKyNkZWZpbmUJVEE0CQkJMHgwMDEwCS8qIFRyYW5zbWl0IFN1Y2Nlc3NmdWwgRnJvbSBNYWlsYm94IDQgKi8KKyNkZWZpbmUJVEE1CQkJMHgwMDIwCS8qIFRyYW5zbWl0IFN1Y2Nlc3NmdWwgRnJvbSBNYWlsYm94IDUgKi8KKyNkZWZpbmUJVEE2CQkJMHgwMDQwCS8qIFRyYW5zbWl0IFN1Y2Nlc3NmdWwgRnJvbSBNYWlsYm94IDYgKi8KKyNkZWZpbmUJVEE3CQkJMHgwMDgwCS8qIFRyYW5zbWl0IFN1Y2Nlc3NmdWwgRnJvbSBNYWlsYm94IDcgKi8KKyNkZWZpbmUJVEE4CQkJMHgwMTAwCS8qIFRyYW5zbWl0IFN1Y2Nlc3NmdWwgRnJvbSBNYWlsYm94IDggKi8KKyNkZWZpbmUJVEE5CQkJMHgwMjAwCS8qIFRyYW5zbWl0IFN1Y2Nlc3NmdWwgRnJvbSBNYWlsYm94IDkgKi8KKyNkZWZpbmUJVEExMAkJMHgwNDAwCS8qIFRyYW5zbWl0IFN1Y2Nlc3NmdWwgRnJvbSBNYWlsYm94IDEwICovCisjZGVmaW5lCVRBMTEJCTB4MDgwMAkvKiBUcmFuc21pdCBTdWNjZXNzZnVsIEZyb20gTWFpbGJveCAxMSAqLworI2RlZmluZQlUQTEyCQkweDEwMDAJLyogVHJhbnNtaXQgU3VjY2Vzc2Z1bCBGcm9tIE1haWxib3ggMTIgKi8KKyNkZWZpbmUJVEExMwkJMHgyMDAwCS8qIFRyYW5zbWl0IFN1Y2Nlc3NmdWwgRnJvbSBNYWlsYm94IDEzICovCisjZGVmaW5lCVRBMTQJCTB4NDAwMAkvKiBUcmFuc21pdCBTdWNjZXNzZnVsIEZyb20gTWFpbGJveCAxNCAqLworI2RlZmluZQlUQTE1CQkweDgwMDAJLyogVHJhbnNtaXQgU3VjY2Vzc2Z1bCBGcm9tIE1haWxib3ggMTUgKi8KKworLyogQ0FOX1RBMiBNYXNrcwkJCQkJCSAqLworI2RlZmluZQlUQTE2CQkweDAwMDEJLyogVHJhbnNtaXQgU3VjY2Vzc2Z1bCBGcm9tIE1haWxib3ggMTYgKi8KKyNkZWZpbmUJVEExNwkJMHgwMDAyCS8qIFRyYW5zbWl0IFN1Y2Nlc3NmdWwgRnJvbSBNYWlsYm94IDE3ICovCisjZGVmaW5lCVRBMTgJCTB4MDAwNAkvKiBUcmFuc21pdCBTdWNjZXNzZnVsIEZyb20gTWFpbGJveCAxOCAqLworI2RlZmluZQlUQTE5CQkweDAwMDgJLyogVHJhbnNtaXQgU3VjY2Vzc2Z1bCBGcm9tIE1haWxib3ggMTkgKi8KKyNkZWZpbmUJVEEyMAkJMHgwMDEwCS8qIFRyYW5zbWl0IFN1Y2Nlc3NmdWwgRnJvbSBNYWlsYm94IDIwICovCisjZGVmaW5lCVRBMjEJCTB4MDAyMAkvKiBUcmFuc21pdCBTdWNjZXNzZnVsIEZyb20gTWFpbGJveCAyMSAqLworI2RlZmluZQlUQTIyCQkweDAwNDAJLyogVHJhbnNtaXQgU3VjY2Vzc2Z1bCBGcm9tIE1haWxib3ggMjIgKi8KKyNkZWZpbmUJVEEyMwkJMHgwMDgwCS8qIFRyYW5zbWl0IFN1Y2Nlc3NmdWwgRnJvbSBNYWlsYm94IDIzICovCisjZGVmaW5lCVRBMjQJCTB4MDEwMAkvKiBUcmFuc21pdCBTdWNjZXNzZnVsIEZyb20gTWFpbGJveCAyNCAqLworI2RlZmluZQlUQTI1CQkweDAyMDAJLyogVHJhbnNtaXQgU3VjY2Vzc2Z1bCBGcm9tIE1haWxib3ggMjUgKi8KKyNkZWZpbmUJVEEyNgkJMHgwNDAwCS8qIFRyYW5zbWl0IFN1Y2Nlc3NmdWwgRnJvbSBNYWlsYm94IDI2ICovCisjZGVmaW5lCVRBMjcJCTB4MDgwMAkvKiBUcmFuc21pdCBTdWNjZXNzZnVsIEZyb20gTWFpbGJveCAyNyAqLworI2RlZmluZQlUQTI4CQkweDEwMDAJLyogVHJhbnNtaXQgU3VjY2Vzc2Z1bCBGcm9tIE1haWxib3ggMjggKi8KKyNkZWZpbmUJVEEyOQkJMHgyMDAwCS8qIFRyYW5zbWl0IFN1Y2Nlc3NmdWwgRnJvbSBNYWlsYm94IDI5ICovCisjZGVmaW5lCVRBMzAJCTB4NDAwMAkvKiBUcmFuc21pdCBTdWNjZXNzZnVsIEZyb20gTWFpbGJveCAzMCAqLworI2RlZmluZQlUQTMxCQkweDgwMDAJLyogVHJhbnNtaXQgU3VjY2Vzc2Z1bCBGcm9tIE1haWxib3ggMzEgKi8KKworLyogQ0FOX01CVEQgTWFza3MJCQkJCSAqLworI2RlZmluZQlURFBUUgkJMHgwMDFGCS8qIE1haWxib3ggVG8gVGVtcG9yYXJpbHkgRGlzYWJsZSAqLworI2RlZmluZQlUREEJCQkweDAwNDAJLyogVGVtcG9yYXJ5IERpc2FibGUgQWNrbm93bGVkZ2UgKi8KKyNkZWZpbmUJVERSCQkJMHgwMDgwCS8qIFRlbXBvcmFyeSBEaXNhYmxlIFJlcXVlc3QgKi8KKworLyogQ0FOX1JGSDEgTWFza3MJCQkJCQkJCQkJCSAqLworI2RlZmluZQlSRkgwCQkweDAwMDEJLyogRW5hYmxlIEF1dG9tYXRpYyBSZW1vdGUgRnJhbWUgSGFuZGxpbmcgRm9yIE1haWxib3ggMCAqLworI2RlZmluZQlSRkgxCQkweDAwMDIJLyogRW5hYmxlIEF1dG9tYXRpYyBSZW1vdGUgRnJhbWUgSGFuZGxpbmcgRm9yIE1haWxib3ggMSAqLworI2RlZmluZQlSRkgyCQkweDAwMDQJLyogRW5hYmxlIEF1dG9tYXRpYyBSZW1vdGUgRnJhbWUgSGFuZGxpbmcgRm9yIE1haWxib3ggMiAqLworI2RlZmluZQlSRkgzCQkweDAwMDgJLyogRW5hYmxlIEF1dG9tYXRpYyBSZW1vdGUgRnJhbWUgSGFuZGxpbmcgRm9yIE1haWxib3ggMyAqLworI2RlZmluZQlSRkg0CQkweDAwMTAJLyogRW5hYmxlIEF1dG9tYXRpYyBSZW1vdGUgRnJhbWUgSGFuZGxpbmcgRm9yIE1haWxib3ggNCAqLworI2RlZmluZQlSRkg1CQkweDAwMjAJLyogRW5hYmxlIEF1dG9tYXRpYyBSZW1vdGUgRnJhbWUgSGFuZGxpbmcgRm9yIE1haWxib3ggNSAqLworI2RlZmluZQlSRkg2CQkweDAwNDAJLyogRW5hYmxlIEF1dG9tYXRpYyBSZW1vdGUgRnJhbWUgSGFuZGxpbmcgRm9yIE1haWxib3ggNiAqLworI2RlZmluZQlSRkg3CQkweDAwODAJLyogRW5hYmxlIEF1dG9tYXRpYyBSZW1vdGUgRnJhbWUgSGFuZGxpbmcgRm9yIE1haWxib3ggNyAqLworI2RlZmluZQlSRkg4CQkweDAxMDAJLyogRW5hYmxlIEF1dG9tYXRpYyBSZW1vdGUgRnJhbWUgSGFuZGxpbmcgRm9yIE1haWxib3ggOCAqLworI2RlZmluZQlSRkg5CQkweDAyMDAJLyogRW5hYmxlIEF1dG9tYXRpYyBSZW1vdGUgRnJhbWUgSGFuZGxpbmcgRm9yIE1haWxib3ggOSAqLworI2RlZmluZQlSRkgxMAkJMHgwNDAwCS8qIEVuYWJsZSBBdXRvbWF0aWMgUmVtb3RlIEZyYW1lIEhhbmRsaW5nIEZvciBNYWlsYm94IDEwICovCisjZGVmaW5lCVJGSDExCQkweDA4MDAJLyogRW5hYmxlIEF1dG9tYXRpYyBSZW1vdGUgRnJhbWUgSGFuZGxpbmcgRm9yIE1haWxib3ggMTEgKi8KKyNkZWZpbmUJUkZIMTIJCTB4MTAwMAkvKiBFbmFibGUgQXV0b21hdGljIFJlbW90ZSBGcmFtZSBIYW5kbGluZyBGb3IgTWFpbGJveCAxMiAqLworI2RlZmluZQlSRkgxMwkJMHgyMDAwCS8qIEVuYWJsZSBBdXRvbWF0aWMgUmVtb3RlIEZyYW1lIEhhbmRsaW5nIEZvciBNYWlsYm94IDEzICovCisjZGVmaW5lCVJGSDE0CQkweDQwMDAJLyogRW5hYmxlIEF1dG9tYXRpYyBSZW1vdGUgRnJhbWUgSGFuZGxpbmcgRm9yIE1haWxib3ggMTQgKi8KKyNkZWZpbmUJUkZIMTUJCTB4ODAwMAkvKiBFbmFibGUgQXV0b21hdGljIFJlbW90ZSBGcmFtZSBIYW5kbGluZyBGb3IgTWFpbGJveCAxNSAqLworCisvKiBDQU5fUkZIMiBNYXNrcwkJCQkJCQkJCQkJICovCisjZGVmaW5lCVJGSDE2CQkweDAwMDEJLyogRW5hYmxlIEF1dG9tYXRpYyBSZW1vdGUgRnJhbWUgSGFuZGxpbmcgRm9yIE1haWxib3ggMTYgKi8KKyNkZWZpbmUJUkZIMTcJCTB4MDAwMgkvKiBFbmFibGUgQXV0b21hdGljIFJlbW90ZSBGcmFtZSBIYW5kbGluZyBGb3IgTWFpbGJveCAxNyAqLworI2RlZmluZQlSRkgxOAkJMHgwMDA0CS8qIEVuYWJsZSBBdXRvbWF0aWMgUmVtb3RlIEZyYW1lIEhhbmRsaW5nIEZvciBNYWlsYm94IDE4ICovCisjZGVmaW5lCVJGSDE5CQkweDAwMDgJLyogRW5hYmxlIEF1dG9tYXRpYyBSZW1vdGUgRnJhbWUgSGFuZGxpbmcgRm9yIE1haWxib3ggMTkgKi8KKyNkZWZpbmUJUkZIMjAJCTB4MDAxMAkvKiBFbmFibGUgQXV0b21hdGljIFJlbW90ZSBGcmFtZSBIYW5kbGluZyBGb3IgTWFpbGJveCAyMCAqLworI2RlZmluZQlSRkgyMQkJMHgwMDIwCS8qIEVuYWJsZSBBdXRvbWF0aWMgUmVtb3RlIEZyYW1lIEhhbmRsaW5nIEZvciBNYWlsYm94IDIxICovCisjZGVmaW5lCVJGSDIyCQkweDAwNDAJLyogRW5hYmxlIEF1dG9tYXRpYyBSZW1vdGUgRnJhbWUgSGFuZGxpbmcgRm9yIE1haWxib3ggMjIgKi8KKyNkZWZpbmUJUkZIMjMJCTB4MDA4MAkvKiBFbmFibGUgQXV0b21hdGljIFJlbW90ZSBGcmFtZSBIYW5kbGluZyBGb3IgTWFpbGJveCAyMyAqLworI2RlZmluZQlSRkgyNAkJMHgwMTAwCS8qIEVuYWJsZSBBdXRvbWF0aWMgUmVtb3RlIEZyYW1lIEhhbmRsaW5nIEZvciBNYWlsYm94IDI0ICovCisjZGVmaW5lCVJGSDI1CQkweDAyMDAJLyogRW5hYmxlIEF1dG9tYXRpYyBSZW1vdGUgRnJhbWUgSGFuZGxpbmcgRm9yIE1haWxib3ggMjUgKi8KKyNkZWZpbmUJUkZIMjYJCTB4MDQwMAkvKiBFbmFibGUgQXV0b21hdGljIFJlbW90ZSBGcmFtZSBIYW5kbGluZyBGb3IgTWFpbGJveCAyNiAqLworI2RlZmluZQlSRkgyNwkJMHgwODAwCS8qIEVuYWJsZSBBdXRvbWF0aWMgUmVtb3RlIEZyYW1lIEhhbmRsaW5nIEZvciBNYWlsYm94IDI3ICovCisjZGVmaW5lCVJGSDI4CQkweDEwMDAJLyogRW5hYmxlIEF1dG9tYXRpYyBSZW1vdGUgRnJhbWUgSGFuZGxpbmcgRm9yIE1haWxib3ggMjggKi8KKyNkZWZpbmUJUkZIMjkJCTB4MjAwMAkvKiBFbmFibGUgQXV0b21hdGljIFJlbW90ZSBGcmFtZSBIYW5kbGluZyBGb3IgTWFpbGJveCAyOSAqLworI2RlZmluZQlSRkgzMAkJMHg0MDAwCS8qIEVuYWJsZSBBdXRvbWF0aWMgUmVtb3RlIEZyYW1lIEhhbmRsaW5nIEZvciBNYWlsYm94IDMwICovCisjZGVmaW5lCVJGSDMxCQkweDgwMDAJLyogRW5hYmxlIEF1dG9tYXRpYyBSZW1vdGUgRnJhbWUgSGFuZGxpbmcgRm9yIE1haWxib3ggMzEgKi8KKworLyogQ0FOX01CVElGMSBNYXNrcwkJCQkJCSAqLworI2RlZmluZQlNQlRJRjAJCTB4MDAwMQkvKiBUWCBJbnRlcnJ1cHQJQWN0aXZlIEluIE1haWxib3ggMCAqLworI2RlZmluZQlNQlRJRjEJCTB4MDAwMgkvKiBUWCBJbnRlcnJ1cHQJQWN0aXZlIEluIE1haWxib3ggMSAqLworI2RlZmluZQlNQlRJRjIJCTB4MDAwNAkvKiBUWCBJbnRlcnJ1cHQJQWN0aXZlIEluIE1haWxib3ggMiAqLworI2RlZmluZQlNQlRJRjMJCTB4MDAwOAkvKiBUWCBJbnRlcnJ1cHQJQWN0aXZlIEluIE1haWxib3ggMyAqLworI2RlZmluZQlNQlRJRjQJCTB4MDAxMAkvKiBUWCBJbnRlcnJ1cHQJQWN0aXZlIEluIE1haWxib3ggNCAqLworI2RlZmluZQlNQlRJRjUJCTB4MDAyMAkvKiBUWCBJbnRlcnJ1cHQJQWN0aXZlIEluIE1haWxib3ggNSAqLworI2RlZmluZQlNQlRJRjYJCTB4MDA0MAkvKiBUWCBJbnRlcnJ1cHQJQWN0aXZlIEluIE1haWxib3ggNiAqLworI2RlZmluZQlNQlRJRjcJCTB4MDA4MAkvKiBUWCBJbnRlcnJ1cHQJQWN0aXZlIEluIE1haWxib3ggNyAqLworI2RlZmluZQlNQlRJRjgJCTB4MDEwMAkvKiBUWCBJbnRlcnJ1cHQJQWN0aXZlIEluIE1haWxib3ggOCAqLworI2RlZmluZQlNQlRJRjkJCTB4MDIwMAkvKiBUWCBJbnRlcnJ1cHQJQWN0aXZlIEluIE1haWxib3ggOSAqLworI2RlZmluZQlNQlRJRjEwCQkweDA0MDAJLyogVFggSW50ZXJydXB0CUFjdGl2ZSBJbiBNYWlsYm94IDEwICovCisjZGVmaW5lCU1CVElGMTEJCTB4MDgwMAkvKiBUWCBJbnRlcnJ1cHQJQWN0aXZlIEluIE1haWxib3ggMTEgKi8KKyNkZWZpbmUJTUJUSUYxMgkJMHgxMDAwCS8qIFRYIEludGVycnVwdAlBY3RpdmUgSW4gTWFpbGJveCAxMiAqLworI2RlZmluZQlNQlRJRjEzCQkweDIwMDAJLyogVFggSW50ZXJydXB0CUFjdGl2ZSBJbiBNYWlsYm94IDEzICovCisjZGVmaW5lCU1CVElGMTQJCTB4NDAwMAkvKiBUWCBJbnRlcnJ1cHQJQWN0aXZlIEluIE1haWxib3ggMTQgKi8KKyNkZWZpbmUJTUJUSUYxNQkJMHg4MDAwCS8qIFRYIEludGVycnVwdAlBY3RpdmUgSW4gTWFpbGJveCAxNSAqLworCisvKiBDQU5fTUJUSUYyIE1hc2tzCQkJCQkJICovCisjZGVmaW5lCU1CVElGMTYJCTB4MDAwMQkvKiBUWCBJbnRlcnJ1cHQJQWN0aXZlIEluIE1haWxib3ggMTYgKi8KKyNkZWZpbmUJTUJUSUYxNwkJMHgwMDAyCS8qIFRYIEludGVycnVwdAlBY3RpdmUgSW4gTWFpbGJveCAxNyAqLworI2RlZmluZQlNQlRJRjE4CQkweDAwMDQJLyogVFggSW50ZXJydXB0CUFjdGl2ZSBJbiBNYWlsYm94IDE4ICovCisjZGVmaW5lCU1CVElGMTkJCTB4MDAwOAkvKiBUWCBJbnRlcnJ1cHQJQWN0aXZlIEluIE1haWxib3ggMTkgKi8KKyNkZWZpbmUJTUJUSUYyMAkJMHgwMDEwCS8qIFRYIEludGVycnVwdAlBY3RpdmUgSW4gTWFpbGJveCAyMCAqLworI2RlZmluZQlNQlRJRjIxCQkweDAwMjAJLyogVFggSW50ZXJydXB0CUFjdGl2ZSBJbiBNYWlsYm94IDIxICovCisjZGVmaW5lCU1CVElGMjIJCTB4MDA0MAkvKiBUWCBJbnRlcnJ1cHQJQWN0aXZlIEluIE1haWxib3ggMjIgKi8KKyNkZWZpbmUJTUJUSUYyMwkJMHgwMDgwCS8qIFRYIEludGVycnVwdAlBY3RpdmUgSW4gTWFpbGJveCAyMyAqLworI2RlZmluZQlNQlRJRjI0CQkweDAxMDAJLyogVFggSW50ZXJydXB0CUFjdGl2ZSBJbiBNYWlsYm94IDI0ICovCisjZGVmaW5lCU1CVElGMjUJCTB4MDIwMAkvKiBUWCBJbnRlcnJ1cHQJQWN0aXZlIEluIE1haWxib3ggMjUgKi8KKyNkZWZpbmUJTUJUSUYyNgkJMHgwNDAwCS8qIFRYIEludGVycnVwdAlBY3RpdmUgSW4gTWFpbGJveCAyNiAqLworI2RlZmluZQlNQlRJRjI3CQkweDA4MDAJLyogVFggSW50ZXJydXB0CUFjdGl2ZSBJbiBNYWlsYm94IDI3ICovCisjZGVmaW5lCU1CVElGMjgJCTB4MTAwMAkvKiBUWCBJbnRlcnJ1cHQJQWN0aXZlIEluIE1haWxib3ggMjggKi8KKyNkZWZpbmUJTUJUSUYyOQkJMHgyMDAwCS8qIFRYIEludGVycnVwdAlBY3RpdmUgSW4gTWFpbGJveCAyOSAqLworI2RlZmluZQlNQlRJRjMwCQkweDQwMDAJLyogVFggSW50ZXJydXB0CUFjdGl2ZSBJbiBNYWlsYm94IDMwICovCisjZGVmaW5lCU1CVElGMzEJCTB4ODAwMAkvKiBUWCBJbnRlcnJ1cHQJQWN0aXZlIEluIE1haWxib3ggMzEgKi8KKworLyogQ0FOX01CUklGMSBNYXNrcwkJCQkJCSAqLworI2RlZmluZQlNQlJJRjAJCTB4MDAwMQkvKiBSWCBJbnRlcnJ1cHQJQWN0aXZlIEluIE1haWxib3ggMCAqLworI2RlZmluZQlNQlJJRjEJCTB4MDAwMgkvKiBSWCBJbnRlcnJ1cHQJQWN0aXZlIEluIE1haWxib3ggMSAqLworI2RlZmluZQlNQlJJRjIJCTB4MDAwNAkvKiBSWCBJbnRlcnJ1cHQJQWN0aXZlIEluIE1haWxib3ggMiAqLworI2RlZmluZQlNQlJJRjMJCTB4MDAwOAkvKiBSWCBJbnRlcnJ1cHQJQWN0aXZlIEluIE1haWxib3ggMyAqLworI2RlZmluZQlNQlJJRjQJCTB4MDAxMAkvKiBSWCBJbnRlcnJ1cHQJQWN0aXZlIEluIE1haWxib3ggNCAqLworI2RlZmluZQlNQlJJRjUJCTB4MDAyMAkvKiBSWCBJbnRlcnJ1cHQJQWN0aXZlIEluIE1haWxib3ggNSAqLworI2RlZmluZQlNQlJJRjYJCTB4MDA0MAkvKiBSWCBJbnRlcnJ1cHQJQWN0aXZlIEluIE1haWxib3ggNiAqLworI2RlZmluZQlNQlJJRjcJCTB4MDA4MAkvKiBSWCBJbnRlcnJ1cHQJQWN0aXZlIEluIE1haWxib3ggNyAqLworI2RlZmluZQlNQlJJRjgJCTB4MDEwMAkvKiBSWCBJbnRlcnJ1cHQJQWN0aXZlIEluIE1haWxib3ggOCAqLworI2RlZmluZQlNQlJJRjkJCTB4MDIwMAkvKiBSWCBJbnRlcnJ1cHQJQWN0aXZlIEluIE1haWxib3ggOSAqLworI2RlZmluZQlNQlJJRjEwCQkweDA0MDAJLyogUlggSW50ZXJydXB0CUFjdGl2ZSBJbiBNYWlsYm94IDEwICovCisjZGVmaW5lCU1CUklGMTEJCTB4MDgwMAkvKiBSWCBJbnRlcnJ1cHQJQWN0aXZlIEluIE1haWxib3ggMTEgKi8KKyNkZWZpbmUJTUJSSUYxMgkJMHgxMDAwCS8qIFJYIEludGVycnVwdAlBY3RpdmUgSW4gTWFpbGJveCAxMiAqLworI2RlZmluZQlNQlJJRjEzCQkweDIwMDAJLyogUlggSW50ZXJydXB0CUFjdGl2ZSBJbiBNYWlsYm94IDEzICovCisjZGVmaW5lCU1CUklGMTQJCTB4NDAwMAkvKiBSWCBJbnRlcnJ1cHQJQWN0aXZlIEluIE1haWxib3ggMTQgKi8KKyNkZWZpbmUJTUJSSUYxNQkJMHg4MDAwCS8qIFJYIEludGVycnVwdAlBY3RpdmUgSW4gTWFpbGJveCAxNSAqLworCisvKiBDQU5fTUJSSUYyIE1hc2tzCQkJCQkJICovCisjZGVmaW5lCU1CUklGMTYJCTB4MDAwMQkvKiBSWCBJbnRlcnJ1cHQJQWN0aXZlIEluIE1haWxib3ggMTYgKi8KKyNkZWZpbmUJTUJSSUYxNwkJMHgwMDAyCS8qIFJYIEludGVycnVwdAlBY3RpdmUgSW4gTWFpbGJveCAxNyAqLworI2RlZmluZQlNQlJJRjE4CQkweDAwMDQJLyogUlggSW50ZXJydXB0CUFjdGl2ZSBJbiBNYWlsYm94IDE4ICovCisjZGVmaW5lCU1CUklGMTkJCTB4MDAwOAkvKiBSWCBJbnRlcnJ1cHQJQWN0aXZlIEluIE1haWxib3ggMTkgKi8KKyNkZWZpbmUJTUJSSUYyMAkJMHgwMDEwCS8qIFJYIEludGVycnVwdAlBY3RpdmUgSW4gTWFpbGJveCAyMCAqLworI2RlZmluZQlNQlJJRjIxCQkweDAwMjAJLyogUlggSW50ZXJydXB0CUFjdGl2ZSBJbiBNYWlsYm94IDIxICovCisjZGVmaW5lCU1CUklGMjIJCTB4MDA0MAkvKiBSWCBJbnRlcnJ1cHQJQWN0aXZlIEluIE1haWxib3ggMjIgKi8KKyNkZWZpbmUJTUJSSUYyMwkJMHgwMDgwCS8qIFJYIEludGVycnVwdAlBY3RpdmUgSW4gTWFpbGJveCAyMyAqLworI2RlZmluZQlNQlJJRjI0CQkweDAxMDAJLyogUlggSW50ZXJydXB0CUFjdGl2ZSBJbiBNYWlsYm94IDI0ICovCisjZGVmaW5lCU1CUklGMjUJCTB4MDIwMAkvKiBSWCBJbnRlcnJ1cHQJQWN0aXZlIEluIE1haWxib3ggMjUgKi8KKyNkZWZpbmUJTUJSSUYyNgkJMHgwNDAwCS8qIFJYIEludGVycnVwdAlBY3RpdmUgSW4gTWFpbGJveCAyNiAqLworI2RlZmluZQlNQlJJRjI3CQkweDA4MDAJLyogUlggSW50ZXJydXB0CUFjdGl2ZSBJbiBNYWlsYm94IDI3ICovCisjZGVmaW5lCU1CUklGMjgJCTB4MTAwMAkvKiBSWCBJbnRlcnJ1cHQJQWN0aXZlIEluIE1haWxib3ggMjggKi8KKyNkZWZpbmUJTUJSSUYyOQkJMHgyMDAwCS8qIFJYIEludGVycnVwdAlBY3RpdmUgSW4gTWFpbGJveCAyOSAqLworI2RlZmluZQlNQlJJRjMwCQkweDQwMDAJLyogUlggSW50ZXJydXB0CUFjdGl2ZSBJbiBNYWlsYm94IDMwICovCisjZGVmaW5lCU1CUklGMzEJCTB4ODAwMAkvKiBSWCBJbnRlcnJ1cHQJQWN0aXZlIEluIE1haWxib3ggMzEgKi8KKworLyogQ0FOX01CSU0xIE1hc2tzCQkJCQkgKi8KKyNkZWZpbmUJTUJJTTAJCTB4MDAwMQkvKiBFbmFibGUgSW50ZXJydXB0IEZvcglNYWlsYm94CTAgKi8KKyNkZWZpbmUJTUJJTTEJCTB4MDAwMgkvKiBFbmFibGUgSW50ZXJydXB0IEZvcglNYWlsYm94CTEgKi8KKyNkZWZpbmUJTUJJTTIJCTB4MDAwNAkvKiBFbmFibGUgSW50ZXJydXB0IEZvcglNYWlsYm94CTIgKi8KKyNkZWZpbmUJTUJJTTMJCTB4MDAwOAkvKiBFbmFibGUgSW50ZXJydXB0IEZvcglNYWlsYm94CTMgKi8KKyNkZWZpbmUJTUJJTTQJCTB4MDAxMAkvKiBFbmFibGUgSW50ZXJydXB0IEZvcglNYWlsYm94CTQgKi8KKyNkZWZpbmUJTUJJTTUJCTB4MDAyMAkvKiBFbmFibGUgSW50ZXJydXB0IEZvcglNYWlsYm94CTUgKi8KKyNkZWZpbmUJTUJJTTYJCTB4MDA0MAkvKiBFbmFibGUgSW50ZXJydXB0IEZvcglNYWlsYm94CTYgKi8KKyNkZWZpbmUJTUJJTTcJCTB4MDA4MAkvKiBFbmFibGUgSW50ZXJydXB0IEZvcglNYWlsYm94CTcgKi8KKyNkZWZpbmUJTUJJTTgJCTB4MDEwMAkvKiBFbmFibGUgSW50ZXJydXB0IEZvcglNYWlsYm94CTggKi8KKyNkZWZpbmUJTUJJTTkJCTB4MDIwMAkvKiBFbmFibGUgSW50ZXJydXB0IEZvcglNYWlsYm94CTkgKi8KKyNkZWZpbmUJTUJJTTEwCQkweDA0MDAJLyogRW5hYmxlIEludGVycnVwdCBGb3IJTWFpbGJveAkxMCAqLworI2RlZmluZQlNQklNMTEJCTB4MDgwMAkvKiBFbmFibGUgSW50ZXJydXB0IEZvcglNYWlsYm94CTExICovCisjZGVmaW5lCU1CSU0xMgkJMHgxMDAwCS8qIEVuYWJsZSBJbnRlcnJ1cHQgRm9yCU1haWxib3gJMTIgKi8KKyNkZWZpbmUJTUJJTTEzCQkweDIwMDAJLyogRW5hYmxlIEludGVycnVwdCBGb3IJTWFpbGJveAkxMyAqLworI2RlZmluZQlNQklNMTQJCTB4NDAwMAkvKiBFbmFibGUgSW50ZXJydXB0IEZvcglNYWlsYm94CTE0ICovCisjZGVmaW5lCU1CSU0xNQkJMHg4MDAwCS8qIEVuYWJsZSBJbnRlcnJ1cHQgRm9yCU1haWxib3gJMTUgKi8KKworLyogQ0FOX01CSU0yIE1hc2tzCQkJCQkgKi8KKyNkZWZpbmUJTUJJTTE2CQkweDAwMDEJLyogRW5hYmxlIEludGVycnVwdCBGb3IJTWFpbGJveAkxNiAqLworI2RlZmluZQlNQklNMTcJCTB4MDAwMgkvKiBFbmFibGUgSW50ZXJydXB0IEZvcglNYWlsYm94CTE3ICovCisjZGVmaW5lCU1CSU0xOAkJMHgwMDA0CS8qIEVuYWJsZSBJbnRlcnJ1cHQgRm9yCU1haWxib3gJMTggKi8KKyNkZWZpbmUJTUJJTTE5CQkweDAwMDgJLyogRW5hYmxlIEludGVycnVwdCBGb3IJTWFpbGJveAkxOSAqLworI2RlZmluZQlNQklNMjAJCTB4MDAxMAkvKiBFbmFibGUgSW50ZXJydXB0IEZvcglNYWlsYm94CTIwICovCisjZGVmaW5lCU1CSU0yMQkJMHgwMDIwCS8qIEVuYWJsZSBJbnRlcnJ1cHQgRm9yCU1haWxib3gJMjEgKi8KKyNkZWZpbmUJTUJJTTIyCQkweDAwNDAJLyogRW5hYmxlIEludGVycnVwdCBGb3IJTWFpbGJveAkyMiAqLworI2RlZmluZQlNQklNMjMJCTB4MDA4MAkvKiBFbmFibGUgSW50ZXJydXB0IEZvcglNYWlsYm94CTIzICovCisjZGVmaW5lCU1CSU0yNAkJMHgwMTAwCS8qIEVuYWJsZSBJbnRlcnJ1cHQgRm9yCU1haWxib3gJMjQgKi8KKyNkZWZpbmUJTUJJTTI1CQkweDAyMDAJLyogRW5hYmxlIEludGVycnVwdCBGb3IJTWFpbGJveAkyNSAqLworI2RlZmluZQlNQklNMjYJCTB4MDQwMAkvKiBFbmFibGUgSW50ZXJydXB0IEZvcglNYWlsYm94CTI2ICovCisjZGVmaW5lCU1CSU0yNwkJMHgwODAwCS8qIEVuYWJsZSBJbnRlcnJ1cHQgRm9yCU1haWxib3gJMjcgKi8KKyNkZWZpbmUJTUJJTTI4CQkweDEwMDAJLyogRW5hYmxlIEludGVycnVwdCBGb3IJTWFpbGJveAkyOCAqLworI2RlZmluZQlNQklNMjkJCTB4MjAwMAkvKiBFbmFibGUgSW50ZXJydXB0IEZvcglNYWlsYm94CTI5ICovCisjZGVmaW5lCU1CSU0zMAkJMHg0MDAwCS8qIEVuYWJsZSBJbnRlcnJ1cHQgRm9yCU1haWxib3gJMzAgKi8KKyNkZWZpbmUJTUJJTTMxCQkweDgwMDAJLyogRW5hYmxlIEludGVycnVwdCBGb3IJTWFpbGJveAkzMSAqLworCisvKiBDQU5fR0lNIE1hc2tzCQkJCQkJCQkJICovCisjZGVmaW5lCUVXVElNCQkweDAwMDEJLyogRW5hYmxlIFRYIEVycm9yIENvdW50IEludGVycnVwdCAqLworI2RlZmluZQlFV1JJTQkJMHgwMDAyCS8qIEVuYWJsZSBSWCBFcnJvciBDb3VudCBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUJRVBJTQkJMHgwMDA0CS8qIEVuYWJsZSBFcnJvci1QYXNzaXZlCU1vZGUgSW50ZXJydXB0ICovCisjZGVmaW5lCUJPSU0JCTB4MDAwOAkvKiBFbmFibGUgQnVzIE9mZiBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUJV1VJTQkJMHgwMDEwCS8qIEVuYWJsZSBXYWtlLVVwIEludGVycnVwdCAqLworI2RlZmluZQlVSUFJTQkJMHgwMDIwCS8qIEVuYWJsZSBBY2Nlc3MgVG8gVW5pbXBsZW1lbnRlZCBBZGRyZXNzIEludGVycnVwdCAqLworI2RlZmluZQlBQUlNCQkweDAwNDAJLyogRW5hYmxlIEFib3J0CUFja25vd2xlZGdlIEludGVycnVwdCAqLworI2RlZmluZQlSTUxJTQkJMHgwMDgwCS8qIEVuYWJsZSBSWCBNZXNzYWdlIExvc3QgSW50ZXJydXB0ICovCisjZGVmaW5lCVVDRUlNCQkweDAxMDAJLyogRW5hYmxlIFVuaXZlcnNhbCBDb3VudGVyIE92ZXJmbG93IEludGVycnVwdCAqLworI2RlZmluZQlFWFRJTQkJMHgwMjAwCS8qIEVuYWJsZSBFeHRlcm5hbCBUcmlnZ2VyIE91dHB1dCBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUJQURJTQkJMHgwNDAwCS8qIEVuYWJsZSBBY2Nlc3MgRGVuaWVkCUludGVycnVwdCAqLworCisvKiBDQU5fR0lTIE1hc2tzCQkJCQkJCQkgKi8KKyNkZWZpbmUJRVdUSVMJCTB4MDAwMQkvKiBUWCBFcnJvciBDb3VudCBJUlEgU3RhdHVzICovCisjZGVmaW5lCUVXUklTCQkweDAwMDIJLyogUlggRXJyb3IgQ291bnQgSVJRIFN0YXR1cyAqLworI2RlZmluZQlFUElTCQkweDAwMDQJLyogRXJyb3ItUGFzc2l2ZSBNb2RlIElSUSBTdGF0dXMgKi8KKyNkZWZpbmUJQk9JUwkJMHgwMDA4CS8qIEJ1cyBPZmYgSVJRIFN0YXR1cyAqLworI2RlZmluZQlXVUlTCQkweDAwMTAJLyogV2FrZS1VcCBJUlEgU3RhdHVzICovCisjZGVmaW5lCVVJQUlTCQkweDAwMjAJLyogQWNjZXNzIFRvIFVuaW1wbGVtZW50ZWQgQWRkcmVzcyBJUlEgU3RhdHVzICovCisjZGVmaW5lCUFBSVMJCTB4MDA0MAkvKiBBYm9ydCBBY2tub3dsZWRnZSBJUlEgU3RhdHVzICovCisjZGVmaW5lCVJNTElTCQkweDAwODAJLyogUlggTWVzc2FnZSBMb3N0IElSUSBTdGF0dXMgKi8KKyNkZWZpbmUJVUNFSVMJCTB4MDEwMAkvKiBVbml2ZXJzYWwgQ291bnRlciBPdmVyZmxvdyBJUlEgU3RhdHVzICovCisjZGVmaW5lCUVYVElTCQkweDAyMDAJLyogRXh0ZXJuYWwgVHJpZ2dlciBPdXRwdXQgSVJRIFN0YXR1cyAqLworI2RlZmluZQlBRElTCQkweDA0MDAJLyogQWNjZXNzIERlbmllZCBJUlEgU3RhdHVzICovCisKKy8qIENBTl9HSUYgTWFza3MJCQkJCQkJCSAqLworI2RlZmluZQlFV1RJRgkJMHgwMDAxCS8qIFRYIEVycm9yIENvdW50IElSUSBGbGFnICovCisjZGVmaW5lCUVXUklGCQkweDAwMDIJLyogUlggRXJyb3IgQ291bnQgSVJRIEZsYWcgKi8KKyNkZWZpbmUJRVBJRgkJMHgwMDA0CS8qIEVycm9yLVBhc3NpdmUgTW9kZSBJUlEgRmxhZyAqLworI2RlZmluZQlCT0lGCQkweDAwMDgJLyogQnVzIE9mZiBJUlEgRmxhZwkgKi8KKyNkZWZpbmUJV1VJRgkJMHgwMDEwCS8qIFdha2UtVXAgSVJRIEZsYWcJICovCisjZGVmaW5lCVVJQUlGCQkweDAwMjAJLyogQWNjZXNzIFRvIFVuaW1wbGVtZW50ZWQgQWRkcmVzcyBJUlEgRmxhZyAqLworI2RlZmluZQlBQUlGCQkweDAwNDAJLyogQWJvcnQgQWNrbm93bGVkZ2UgSVJRIEZsYWcgKi8KKyNkZWZpbmUJUk1MSUYJCTB4MDA4MAkvKiBSWCBNZXNzYWdlIExvc3QgSVJRIEZsYWcgKi8KKyNkZWZpbmUJVUNFSUYJCTB4MDEwMAkvKiBVbml2ZXJzYWwgQ291bnRlciBPdmVyZmxvdyBJUlEgRmxhZyAqLworI2RlZmluZQlFWFRJRgkJMHgwMjAwCS8qIEV4dGVybmFsIFRyaWdnZXIgT3V0cHV0IElSUSBGbGFnICovCisjZGVmaW5lCUFESUYJCTB4MDQwMAkvKiBBY2Nlc3MgRGVuaWVkIElSUSBGbGFnICovCisKKy8qIENBTl9VQ0NORiBNYXNrcwkJCQkJCQkJICovCisjZGVmaW5lCVVDQ05GCQkweDAwMEYJLyogVW5pdmVyc2FsIENvdW50ZXIgTW9kZSAqLworI2RlZmluZQlVQ19TVEFNUAkweDAwMDEJLyoJCVRpbWVzdGFtcCBNb2RlICovCisjZGVmaW5lCVVDX1dET0cJCTB4MDAwMgkvKgkJV2F0Y2hkb2cgTW9kZSAqLworI2RlZmluZQlVQ19BVVRPVFgJMHgwMDAzCS8qCQlBdXRvLVRyYW5zbWl0IE1vZGUgKi8KKyNkZWZpbmUJVUNfRVJST1IJMHgwMDA2CS8qCQlDQU4gRXJyb3IgRnJhbWUJQ291bnQgKi8KKyNkZWZpbmUJVUNfT1ZFUgkJMHgwMDA3CS8qCQlDQU4gT3ZlcmxvYWQgRnJhbWUgQ291bnQgKi8KKyNkZWZpbmUJVUNfTE9TVAkJMHgwMDA4CS8qCQlBcmJpdHJhdGlvbiBMb3N0IER1cmluZwlUWCBDb3VudCAqLworI2RlZmluZQlVQ19BQQkJMHgwMDA5CS8qCQlUWCBBYm9ydCBDb3VudCAqLworI2RlZmluZQlVQ19UQQkJMHgwMDBBCS8qCQlUWCBTdWNjZXNzZnVsIENvdW50ICovCisjZGVmaW5lCVVDX1JFSkVDVAkweDAwMEIJLyoJCVJYIE1lc3NhZ2UgUmVqZWN0ZWQgQ291bnQgKi8KKyNkZWZpbmUJVUNfUk1MCQkweDAwMEMJLyoJCVJYIE1lc3NhZ2UgTG9zdAlDb3VudCAqLworI2RlZmluZQlVQ19SWAkJMHgwMDBECS8qCQlUb3RhbCBTdWNjZXNzZnVsIFJYIE1lc3NhZ2VzIENvdW50ICovCisjZGVmaW5lCVVDX1JNUAkJMHgwMDBFCS8qCQlTdWNjZXNzZnVsIFJYIFcvTWF0Y2hpbmcgSUQgQ291bnQgKi8KKyNkZWZpbmUJVUNfQUxMCQkweDAwMEYJLyoJCUNvcnJlY3QJTWVzc2FnZQlPbiBDQU4gQnVzIExpbmUJQ291bnQgKi8KKyNkZWZpbmUJVUNSQwkJMHgwMDIwCS8qIFVuaXZlcnNhbCBDb3VudGVyIFJlbG9hZC9DbGVhciAqLworI2RlZmluZQlVQ0NUCQkweDAwNDAJLyogVW5pdmVyc2FsIENvdW50ZXIgQ0FOIFRyaWdnZXIgKi8KKyNkZWZpbmUJVUNFCQkJMHgwMDgwCS8qIFVuaXZlcnNhbCBDb3VudGVyIEVuYWJsZSAqLworCisvKiBDQU5fRVNSIE1hc2tzCQkJICovCisjZGVmaW5lCUFDS0UJCTB4MDAwNAkvKiBBY2tub3dsZWRnZSBFcnJvciAqLworI2RlZmluZQlTRVIJCQkweDAwMDgJLyogU3R1ZmYgRXJyb3IgKi8KKyNkZWZpbmUJQ1JDRQkJMHgwMDEwCS8qIENSQyBFcnJvciAqLworI2RlZmluZQlTQTAJCQkweDAwMjAJLyogU3R1Y2sgQXQgRG9taW5hbnQgRXJyb3IgKi8KKyNkZWZpbmUJQkVGCQkJMHgwMDQwCS8qIEJpdCBFcnJvciBGbGFnICovCisjZGVmaW5lCUZFUgkJCTB4MDA4MAkvKiBGb3JtCUVycm9yIEZsYWcgKi8KKworLyogQ0FOX0VXUiBNYXNrcwkJCQkJICovCisjZGVmaW5lCUVXTFJFQwkJMHgwMEZGCS8qIFJYIEVycm9yIENvdW50IExpbWl0CShGb3IgRVdSSVMpICovCisjZGVmaW5lCUVXTFRFQwkJMHhGRjAwCS8qIFRYIEVycm9yIENvdW50IExpbWl0CShGb3IgRVdUSVMpICovCisKKyNlbmRpZiAvKiBfREVGX0JGNTM5X0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzOC9pbmNsdWRlL21hY2gvZG1hLmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzgvaW5jbHVkZS9tYWNoL2RtYS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViMDVjYWMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzgvaW5jbHVkZS9tYWNoL2RtYS5oCkBAIC0wLDAgKzEsNDEgQEAKKy8qIG1hY2gvZG1hLmggLSBhcmNoLXNwZWNpZmljIERNQSBkZWZpbmVzCisgKgorICogQ29weXJpZ2h0IDIwMDQtMjAwOCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgorICovCisKKyNpZm5kZWYgX01BQ0hfRE1BX0hfCisjZGVmaW5lIF9NQUNIX0RNQV9IXworCisjZGVmaW5lIENIX1BQSQkJCTAKKyNkZWZpbmUgQ0hfU1BPUlQwX1JYCQkxCisjZGVmaW5lIENIX1NQT1JUMF9UWAkJMgorI2RlZmluZSBDSF9TUE9SVDFfUlgJCTMKKyNkZWZpbmUgQ0hfU1BPUlQxX1RYCQk0CisjZGVmaW5lIENIX1NQSTAJCQk1CisjZGVmaW5lIENIX1VBUlQwX1JYCQk2CisjZGVmaW5lIENIX1VBUlQwX1RYCQk3CisjZGVmaW5lIENIX1NQT1JUMl9SWAkJOAorI2RlZmluZSBDSF9TUE9SVDJfVFgJCTkKKyNkZWZpbmUgQ0hfU1BPUlQzX1JYCQkxMAorI2RlZmluZSBDSF9TUE9SVDNfVFgJCTExCisjZGVmaW5lIENIX1NQSTEJCQkxNAorI2RlZmluZSBDSF9TUEkyCQkJMTUKKyNkZWZpbmUgQ0hfVUFSVDFfUlgJCTE2CisjZGVmaW5lIENIX1VBUlQxX1RYCQkxNworI2RlZmluZSBDSF9VQVJUMl9SWAkJMTgKKyNkZWZpbmUgQ0hfVUFSVDJfVFgJCTE5CisKKyNkZWZpbmUgQ0hfTUVNX1NUUkVBTTBfREVTVAkyMAorI2RlZmluZSBDSF9NRU1fU1RSRUFNMF9TUkMJMjEKKyNkZWZpbmUgQ0hfTUVNX1NUUkVBTTFfREVTVAkyMgorI2RlZmluZSBDSF9NRU1fU1RSRUFNMV9TUkMJMjMKKyNkZWZpbmUgQ0hfTUVNX1NUUkVBTTJfREVTVAkyNAorI2RlZmluZSBDSF9NRU1fU1RSRUFNMl9TUkMJMjUKKyNkZWZpbmUgQ0hfTUVNX1NUUkVBTTNfREVTVAkyNgorI2RlZmluZSBDSF9NRU1fU1RSRUFNM19TUkMJMjcKKworI2RlZmluZSBNQVhfRE1BX0NIQU5ORUxTIDI4CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L2luY2x1ZGUvbWFjaC9ncGlvLmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzgvaW5jbHVkZS9tYWNoL2dwaW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMGY0ZjcyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L2luY2x1ZGUvbWFjaC9ncGlvLmgKQEAgLTAsMCArMSw3OSBAQAorLyoKKyAqIEZpbGU6IGFyY2gvYmxhY2tmaW4vbWFjaC1iZjUzOC9pbmNsdWRlL21hY2gvZ3Bpby5oCisgKiBCdWdzOiBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggQW5hbG9nIERldmljZXMgSW5jLgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgorICovCisKKworI2lmbmRlZiBfTUFDSF9HUElPX0hfCisjZGVmaW5lIF9NQUNIX0dQSU9fSF8KKworCS8qIEZJWE1FOgorCSAqIEZvciBub3cgb25seSBzdXBwb3J0IFBPUlRGIEdQSU9zLgorCSAqIFBPUlQgQyxEIGFuZCBFIGFyZSBmb3IgcGVyaXBoZXJhbCB1c2FnZSBvbmx5CisJICovCisjZGVmaW5lIE1BWF9CTEFDS0ZJTl9HUElPUyAxNgorCisjZGVmaW5lCUdQSU9fUEYwCTAJLyogUEYgKi8KKyNkZWZpbmUJR1BJT19QRjEJMQorI2RlZmluZQlHUElPX1BGMgkyCisjZGVmaW5lCUdQSU9fUEYzCTMKKyNkZWZpbmUJR1BJT19QRjQJNAorI2RlZmluZQlHUElPX1BGNQk1CisjZGVmaW5lCUdQSU9fUEY2CTYKKyNkZWZpbmUJR1BJT19QRjcJNworI2RlZmluZQlHUElPX1BGOAk4CisjZGVmaW5lCUdQSU9fUEY5CTkKKyNkZWZpbmUJR1BJT19QRjEwCTEwCisjZGVmaW5lCUdQSU9fUEYxMQkxMQorI2RlZmluZQlHUElPX1BGMTIJMTIKKyNkZWZpbmUJR1BJT19QRjEzCTEzCisjZGVmaW5lCUdQSU9fUEYxNAkxNAorI2RlZmluZQlHUElPX1BGMTUJMTUKKyNkZWZpbmUJR1BJT19QQzAJMTYJLyogUEMgKi8KKyNkZWZpbmUJR1BJT19QQzEJMTcKKyNkZWZpbmUJR1BJT19QQzQJMjAKKyNkZWZpbmUJR1BJT19QQzUJMjEKKyNkZWZpbmUJR1BJT19QQzYJMjIKKyNkZWZpbmUJR1BJT19QQzcJMjMKKyNkZWZpbmUJR1BJT19QQzgJMjQKKyNkZWZpbmUJR1BJT19QQzkJMjUKKyNkZWZpbmUJR1BJT19QRDAJMzIJLyogUEQgKi8KKyNkZWZpbmUJR1BJT19QRDEJMzMKKyNkZWZpbmUJR1BJT19QRDIJMzQKKyNkZWZpbmUJR1BJT19QRDMJMzUKKyNkZWZpbmUJR1BJT19QRDQJMzYKKyNkZWZpbmUJR1BJT19QRDUJMzcKKyNkZWZpbmUJR1BJT19QRDYJMzgKKyNkZWZpbmUJR1BJT19QRDcJMzkKKyNkZWZpbmUJR1BJT19QRDgJNDAKKyNkZWZpbmUJR1BJT19QRDkJNDEKKyNkZWZpbmUJR1BJT19QRDEwICAgICAgCTQyCisjZGVmaW5lCUdQSU9fUEQxMSAgICAgIAk0MworI2RlZmluZQlHUElPX1BEMTIgICAgICAJNDQKKyNkZWZpbmUJR1BJT19QRDEzICAgICAgCTQ1CisjZGVmaW5lCUdQSU9fUEUwCTQ4CS8qIFBFICovCisjZGVmaW5lCUdQSU9fUEUxCTQ5CisjZGVmaW5lCUdQSU9fUEUyCTUwCisjZGVmaW5lCUdQSU9fUEUzCTUxCisjZGVmaW5lCUdQSU9fUEU0CTUyCisjZGVmaW5lCUdQSU9fUEU1CTUzCisjZGVmaW5lCUdQSU9fUEU2CTU0CisjZGVmaW5lCUdQSU9fUEU3CTU1CisjZGVmaW5lCUdQSU9fUEU4CTU2CisjZGVmaW5lCUdQSU9fUEU5CTU3CisjZGVmaW5lCUdQSU9fUEUxMCAgICAgIAk1OAorI2RlZmluZQlHUElPX1BFMTEgICAgICAJNTkKKyNkZWZpbmUJR1BJT19QRTEyICAgICAgCTYwCisjZGVmaW5lCUdQSU9fUEUxMyAgICAgIAk2MQorI2RlZmluZQlHUElPX1BFMTQgICAgICAJNjIKKyNkZWZpbmUJR1BJT19QRTE1ICAgICAgCTYzCisKKyNkZWZpbmUgUE9SVF9GIEdQSU9fUEYwCisjZGVmaW5lIFBPUlRfQyBHUElPX1BDMAorI2RlZmluZSBQT1JUX0QgR1BJT19QRDAKKyNkZWZpbmUgUE9SVF9FIEdQSU9fUEUwCisKKyNlbmRpZiAvKiBfTUFDSF9HUElPX0hfICovCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzgvaW5jbHVkZS9tYWNoL2lycS5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L2luY2x1ZGUvbWFjaC9pcnEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZGM4N2ZlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L2luY2x1ZGUvbWFjaC9pcnEuaApAQCAtMCwwICsxLDIxMSBAQAorLyoKKyAqIGZpbGU6CWluY2x1ZGUvYXNtLWJsYWNrZmluL21hY2gtYmY1MzgvaXJxLmgKKyAqIGJhc2VkIG9uOglpbmNsdWRlL2FzbS1ibGFja2Zpbi9tYWNoLWJmNTM3L2lycS5oCisgKiBhdXRob3I6CU1pY2hhZWwgSGVubmVyaWNoIChtaWNoYWVsLmhlbm5lcmljaEBhbmFsb2cuY29tKQorICoKKyAqIGNyZWF0ZWQ6CisgKiBkZXNjcmlwdGlvbjoKKyAqCXN5c3RlbSBtbXIgcmVnaXN0ZXIgbWFwCisgKiByZXY6CisgKgorICogbW9kaWZpZWQ6CisgKgorICoKKyAqIGJ1Z3M6ICAgICAgICAgZW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCisgKgorICogdGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgZ251IGdlbmVyYWwgcHVibGljIGxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgZnJlZSBzb2Z0d2FyZSBmb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiB0aGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCB3aXRob3V0IGFueSB3YXJyYW50eTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBtZXJjaGFudGFiaWxpdHkgb3IgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuICBzZWUgdGhlCisgKiBnbnUgZ2VuZXJhbCBwdWJsaWMgbGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIHlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIGdudSBnZW5lcmFsIHB1YmxpYyBsaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIGNvcHlpbmcuCisgKiBpZiBub3QsIHdyaXRlIHRvIHRoZSBmcmVlIHNvZnR3YXJlIGZvdW5kYXRpb24sCisgKiA1OSB0ZW1wbGUgcGxhY2UgLSBzdWl0ZSAzMzAsIGJvc3RvbiwgbWEgMDIxMTEtMTMwNywgdXNhLgorICovCisKKyNpZm5kZWYgX0JGNTM4X0lSUV9IXworI2RlZmluZSBfQkY1MzhfSVJRX0hfCisKKy8qCisgKiBJbnRlcnJ1cHQgc291cmNlIGRlZmluaXRpb25zCisJRXZlbnQgU291cmNlICAgIENvcmUgRXZlbnQgTmFtZQorCUNvcmUgICAgICAgIEVtdWxhdGlvbiAgICAgICAgICAgICAgICoqCisJRXZlbnRzICAgICAgICAgKGhpZ2hlc3QgcHJpb3JpdHkpICBFTVUgICAgICAgICAwCisJUmVzZXQgICAgICAgICAgICAgICAgICAgUlNUICAgICAgICAgMQorCU5NSSAgICAgICAgICAgICAgICAgICAgIE5NSSAgICAgICAgIDIKKwlFeGNlcHRpb24gICAgICAgICAgICAgICBFVlggICAgICAgICAzCisJUmVzZXJ2ZWQgICAgICAgICAgICAgICAgLS0gICAgICAgICAgNAorCUhhcmR3YXJlIEVycm9yICAgICAgICAgIElWSFcgICAgICAgIDUKKwlDb3JlIFRpbWVyICAgICAgICAgICAgICBJVlRNUiAgICAgICA2ICoKKworCS4uLi4uCisKKwkgU29mdHdhcmUgSW50ZXJydXB0IDEgICAgSVZHMTQgICAgICAgMzEKKwkgU29mdHdhcmUgSW50ZXJydXB0IDIgICAgLS0KKwkgKGxvd2VzdCBwcmlvcml0eSkgIElWRzE1ICAgICAgIDMyICoKKyovCisKKyNkZWZpbmUgTlJfUEVSSV9JTlRTICAgICgyICogMzIpCisKKy8qIFRoZSBBQlNUUkFDVCBJUlEgZGVmaW5pdGlvbnMgKi8KKy8qKiB0aGUgZmlyc3Qgc2V2ZW4gb2YgdGhlIGZvbGxvd2luZyBhcmUgZml4ZWQsIHRoZSByZXN0IHlvdSBjaGFuZ2UgaWYgeW91IG5lZWQgdG8gKiovCisjZGVmaW5lIElSUV9FTVUJCQkwCS8qIEVtdWxhdGlvbiAqLworI2RlZmluZSBJUlFfUlNUCQkJMQkvKiByZXNldCAqLworI2RlZmluZSBJUlFfTk1JCQkJMgkvKiBOb24gTWFza2FibGUgKi8KKyNkZWZpbmUgSVJRX0VWWAkJCTMJLyogRXhjZXB0aW9uICovCisjZGVmaW5lIElSUV9VTlVTRUQJCTQJLyogLSB1bnVzZWQgaW50ZXJydXB0ICovCisjZGVmaW5lIElSUV9IV0VSUgkJNQkvKiBIYXJkd2FyZSBFcnJvciAqLworI2RlZmluZSBJUlFfQ09SRVRNUgkJNgkvKiBDb3JlIHRpbWVyICovCisKKyNkZWZpbmUgQkZJTl9JUlEoeCkJCSgoeCkgKyA3KQorCisjZGVmaW5lIElSUV9QTExfV0FLRVVQCQlCRklOX0lSUSgwKQkvKiBQTEwgV2FrZXVwIEludGVycnVwdCAqLworI2RlZmluZSBJUlFfRE1BMF9FUlJPUgkJQkZJTl9JUlEoMSkJLyogRE1BIEVycm9yIDAgKGdlbmVyaWMpICovCisjZGVmaW5lIElSUV9QUElfRVJST1IJCUJGSU5fSVJRKDIpCS8qIFBQSSBFcnJvciAqLworI2RlZmluZSBJUlFfU1BPUlQwX0VSUk9SCUJGSU5fSVJRKDMpCS8qIFNQT1JUMCBTdGF0dXMgKi8KKyNkZWZpbmUgSVJRX1NQT1JUMV9FUlJPUglCRklOX0lSUSg0KQkvKiBTUE9SVDEgU3RhdHVzICovCisjZGVmaW5lIElSUV9TUEkwX0VSUk9SCQlCRklOX0lSUSg1KQkvKiBTUEkwIFN0YXR1cyAqLworI2RlZmluZSBJUlFfVUFSVDBfRVJST1IJCUJGSU5fSVJRKDYpCS8qIFVBUlQwIFN0YXR1cyAqLworI2RlZmluZSBJUlFfUlRDCQkJQkZJTl9JUlEoNykJLyogUlRDICovCisjZGVmaW5lIElSUV9QUEkJCQlCRklOX0lSUSg4KQkvKiBETUEgQ2hhbm5lbCAwIChQUEkpICovCisjZGVmaW5lIElSUV9TUE9SVDBfUlgJCUJGSU5fSVJRKDkpCS8qIERNQSAxIENoYW5uZWwgKFNQT1JUMCBSWCkgKi8KKyNkZWZpbmUgSVJRX1NQT1JUMF9UWAkJQkZJTl9JUlEoMTApCS8qIERNQSAyIENoYW5uZWwgKFNQT1JUMCBUWCkgKi8KKyNkZWZpbmUgSVJRX1NQT1JUMV9SWAkJQkZJTl9JUlEoMTEpCS8qIERNQSAzIENoYW5uZWwgKFNQT1JUMSBSWCkgKi8KKyNkZWZpbmUgSVJRX1NQT1JUMV9UWAkJQkZJTl9JUlEoMTIpCS8qIERNQSA0IENoYW5uZWwgKFNQT1JUMSBUWCkgKi8KKyNkZWZpbmUgSVJRX1NQSTAJCUJGSU5fSVJRKDEzKQkvKiBETUEgNSBDaGFubmVsIChTUEkwKSAqLworI2RlZmluZSBJUlFfVUFSVDBfUlgJCUJGSU5fSVJRKDE0KQkvKiBETUEgNiBDaGFubmVsIChVQVJUMCBSWCkgKi8KKyNkZWZpbmUgSVJRX1VBUlQwX1RYCQlCRklOX0lSUSgxNSkJLyogRE1BIDcgQ2hhbm5lbCAoVUFSVDAgVFgpICovCisjZGVmaW5lIElSUV9USU1FUjAJCUJGSU5fSVJRKDE2KQkvKiBUaW1lciAwICovCisjZGVmaW5lIElSUV9USU1FUjEJCUJGSU5fSVJRKDE3KQkvKiBUaW1lciAxICovCisjZGVmaW5lIElSUV9USU1FUjIJCUJGSU5fSVJRKDE4KQkvKiBUaW1lciAyICovCisjZGVmaW5lIElSUV9QT1JURl9JTlRBCQlCRklOX0lSUSgxOSkJLyogUG9ydCBGIEludGVycnVwdCBBICovCisjZGVmaW5lIElSUV9QT1JURl9JTlRCCQlCRklOX0lSUSgyMCkJLyogUG9ydCBGIEludGVycnVwdCBCICovCisjZGVmaW5lIElSUV9NRU0wX0RNQTAJCUJGSU5fSVJRKDIxKQkvKiBNRE1BMCBTdHJlYW0gMCAqLworI2RlZmluZSBJUlFfTUVNMF9ETUExCQlCRklOX0lSUSgyMikJLyogTURNQTAgU3RyZWFtIDEgKi8KKyNkZWZpbmUgSVJRX1dBVENICQlCRklOX0lSUSgyMykJLyogU29mdHdhcmUgV2F0Y2hkb2cgVGltZXIgKi8KKyNkZWZpbmUgSVJRX0RNQTFfRVJST1IJCUJGSU5fSVJRKDI0KQkvKiBETUEgRXJyb3IgMSAoZ2VuZXJpYykgKi8KKyNkZWZpbmUgSVJRX1NQT1JUMl9FUlJPUglCRklOX0lSUSgyNSkJLyogU1BPUlQyIFN0YXR1cyAqLworI2RlZmluZSBJUlFfU1BPUlQzX0VSUk9SCUJGSU5fSVJRKDI2KQkvKiBTUE9SVDMgU3RhdHVzICovCisjZGVmaW5lIElSUV9TUEkxX0VSUk9SCQlCRklOX0lSUSgyOCkJLyogU1BJMSBTdGF0dXMgKi8KKyNkZWZpbmUgSVJRX1NQSTJfRVJST1IJCUJGSU5fSVJRKDI5KQkvKiBTUEkyIFN0YXR1cyAqLworI2RlZmluZSBJUlFfVUFSVDFfRVJST1IJCUJGSU5fSVJRKDMwKQkvKiBVQVJUMSBTdGF0dXMgKi8KKyNkZWZpbmUgSVJRX1VBUlQyX0VSUk9SCQlCRklOX0lSUSgzMSkJLyogVUFSVDIgU3RhdHVzICovCisjZGVmaW5lIElSUV9DQU5fRVJST1IJCUJGSU5fSVJRKDMyKQkvKiBDQU4gU3RhdHVzIChFcnJvcikgSW50ZXJydXB0ICovCisjZGVmaW5lIElSUV9TUE9SVDJfUlgJCUJGSU5fSVJRKDMzKQkvKiBETUEgOCBDaGFubmVsIChTUE9SVDIgUlgpICovCisjZGVmaW5lIElSUV9TUE9SVDJfVFgJCUJGSU5fSVJRKDM0KQkvKiBETUEgOSBDaGFubmVsIChTUE9SVDIgVFgpICovCisjZGVmaW5lIElSUV9TUE9SVDNfUlgJCUJGSU5fSVJRKDM1KQkvKiBETUEgMTAgQ2hhbm5lbCAoU1BPUlQzIFJYKSAqLworI2RlZmluZSBJUlFfU1BPUlQzX1RYCQlCRklOX0lSUSgzNikJLyogRE1BIDExIENoYW5uZWwgKFNQT1JUMyBUWCkgKi8KKyNkZWZpbmUgSVJRX1NQSTEJCUJGSU5fSVJRKDM5KQkvKiBETUEgMTQgQ2hhbm5lbCAoU1BJMSkgKi8KKyNkZWZpbmUgSVJRX1NQSTIJCUJGSU5fSVJRKDQwKQkvKiBETUEgMTUgQ2hhbm5lbCAoU1BJMikgKi8KKyNkZWZpbmUgSVJRX1VBUlQxX1JYCQlCRklOX0lSUSg0MSkJLyogRE1BIDE2IENoYW5uZWwgKFVBUlQxIFJYKSAqLworI2RlZmluZSBJUlFfVUFSVDFfVFgJCUJGSU5fSVJRKDQyKQkvKiBETUEgMTcgQ2hhbm5lbCAoVUFSVDEgVFgpICovCisjZGVmaW5lIElSUV9VQVJUMl9SWAkJQkZJTl9JUlEoNDMpCS8qIERNQSAxOCBDaGFubmVsIChVQVJUMiBSWCkgKi8KKyNkZWZpbmUgSVJRX1VBUlQyX1RYCQlCRklOX0lSUSg0NCkJLyogRE1BIDE5IENoYW5uZWwgKFVBUlQyIFRYKSAqLworI2RlZmluZSBJUlFfVFdJMAkJQkZJTl9JUlEoNDUpCS8qIFRXSTAgKi8KKyNkZWZpbmUgSVJRX1RXSTEJCUJGSU5fSVJRKDQ2KQkvKiBUV0kxICovCisjZGVmaW5lIElSUV9DQU5fUlgJCUJGSU5fSVJRKDQ3KQkvKiBDQU4gUmVjZWl2ZSBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUgSVJRX0NBTl9UWAkJQkZJTl9JUlEoNDgpCS8qIENBTiBUcmFuc21pdCBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUgSVJRX01FTTFfRE1BMAkJQkZJTl9JUlEoNDkpCS8qIE1ETUExIFN0cmVhbSAwICovCisjZGVmaW5lIElSUV9NRU0xX0RNQTEJCUJGSU5fSVJRKDUwKQkvKiBNRE1BMSBTdHJlYW0gMSAqLworCisjZGVmaW5lIFNZU19JUlFTCQlCRklOX0lSUSg2MykJLyogNzAgKi8KKworI2RlZmluZSBJUlFfUEYwICAgICAgICAgNzEKKyNkZWZpbmUgSVJRX1BGMSAgICAgICAgIDcyCisjZGVmaW5lIElSUV9QRjIgICAgICAgICA3MworI2RlZmluZSBJUlFfUEYzICAgICAgICAgNzQKKyNkZWZpbmUgSVJRX1BGNCAgICAgICAgIDc1CisjZGVmaW5lIElSUV9QRjUgICAgICAgICA3NgorI2RlZmluZSBJUlFfUEY2ICAgICAgICAgNzcKKyNkZWZpbmUgSVJRX1BGNyAgICAgICAgIDc4CisjZGVmaW5lIElSUV9QRjggICAgICAgICA3OQorI2RlZmluZSBJUlFfUEY5ICAgICAgICAgODAKKyNkZWZpbmUgSVJRX1BGMTAgICAgICAgIDgxCisjZGVmaW5lIElSUV9QRjExICAgICAgICA4MgorI2RlZmluZSBJUlFfUEYxMiAgICAgICAgODMKKyNkZWZpbmUgSVJRX1BGMTMgICAgICAgIDg0CisjZGVmaW5lIElSUV9QRjE0ICAgICAgICA4NQorI2RlZmluZSBJUlFfUEYxNSAgICAgICAgODYKKworI2RlZmluZSBHUElPX0lSUV9CQVNFCUlSUV9QRjAKKworI2RlZmluZSBOUl9JUlFTICAgICAoSVJRX1BGMTUrMSkKKworI2RlZmluZSBJVkc3ICAgICAgICAgICAgNworI2RlZmluZSBJVkc4ICAgICAgICAgICAgOAorI2RlZmluZSBJVkc5ICAgICAgICAgICAgOQorI2RlZmluZSBJVkcxMCAgICAgICAgICAgMTAKKyNkZWZpbmUgSVZHMTEgICAgICAgICAgIDExCisjZGVmaW5lIElWRzEyICAgICAgICAgICAxMgorI2RlZmluZSBJVkcxMyAgICAgICAgICAgMTMKKyNkZWZpbmUgSVZHMTQgICAgICAgICAgIDE0CisjZGVmaW5lIElWRzE1ICAgICAgICAgICAxNQorCisvKiBJQVIwIEJJVCBGSUVMRFMgKi8KKyNkZWZpbmUgSVJRX1BMTF9XQUtFVVBfUE9TCTAKKyNkZWZpbmUgSVJRX0RNQTBfRVJST1JfUE9TCTQKKyNkZWZpbmUgSVJRX1BQSV9FUlJPUl9QT1MJOAorI2RlZmluZSBJUlFfU1BPUlQwX0VSUk9SX1BPUwkxMgorI2RlZmluZSBJUlFfU1BPUlQxX0VSUk9SX1BPUwkxNgorI2RlZmluZSBJUlFfU1BJMF9FUlJPUl9QT1MJMjAKKyNkZWZpbmUgSVJRX1VBUlQwX0VSUk9SX1BPUwkyNAorI2RlZmluZSBJUlFfUlRDX1BPUwkJMjgKKworLyogSUFSMSBCSVQgRklFTERTICovCisjZGVmaW5lIElSUV9QUElfUE9TCQkwCisjZGVmaW5lIElSUV9TUE9SVDBfUlhfUE9TCTQKKyNkZWZpbmUgSVJRX1NQT1JUMF9UWF9QT1MJOAorI2RlZmluZSBJUlFfU1BPUlQxX1JYX1BPUwkxMgorI2RlZmluZSBJUlFfU1BPUlQxX1RYX1BPUwkxNgorI2RlZmluZSBJUlFfU1BJMF9QT1MJCTIwCisjZGVmaW5lIElSUV9VQVJUMF9SWF9QT1MJMjQKKyNkZWZpbmUgSVJRX1VBUlQwX1RYX1BPUwkyOAorCisvKiBJQVIyIEJJVCBGSUVMRFMgKi8KKyNkZWZpbmUgSVJRX1RJTUVSMF9QT1MJCTAKKyNkZWZpbmUgSVJRX1RJTUVSMV9QT1MJCTQKKyNkZWZpbmUgSVJRX1RJTUVSMl9QT1MJCTgKKyNkZWZpbmUgSVJRX1BPUlRGX0lOVEFfUE9TCTEyCisjZGVmaW5lIElSUV9QT1JURl9JTlRCX1BPUwkxNgorI2RlZmluZSBJUlFfTUVNMF9ETUEwX1BPUwkyMAorI2RlZmluZSBJUlFfTUVNMF9ETUExX1BPUwkyNAorI2RlZmluZSBJUlFfV0FUQ0hfUE9TCQkyOAorCisvKiBJQVIzIEJJVCBGSUVMRFMgKi8KKyNkZWZpbmUgSVJRX0RNQTFfRVJST1JfUE9TCTAKKyNkZWZpbmUgSVJRX1NQT1JUMl9FUlJPUl9QT1MJNAorI2RlZmluZSBJUlFfU1BPUlQzX0VSUk9SX1BPUwk4CisjZGVmaW5lIElSUV9TUEkxX0VSUk9SX1BPUwkxNgorI2RlZmluZSBJUlFfU1BJMl9FUlJPUl9QT1MJMjAKKyNkZWZpbmUgSVJRX1VBUlQxX0VSUk9SX1BPUwkyNAorI2RlZmluZSBJUlFfVUFSVDJfRVJST1JfUE9TCTI4CisKKy8qIElBUjQgQklUIEZJRUxEUyAqLworI2RlZmluZSBJUlFfQ0FOX0VSUk9SX1BPUwkwCisjZGVmaW5lIElSUV9TUE9SVDJfUlhfUE9TCTQKKyNkZWZpbmUgSVJRX1NQT1JUMl9UWF9QT1MJOAorI2RlZmluZSBJUlFfU1BPUlQzX1JYX1BPUwkxMgorI2RlZmluZSBJUlFfU1BPUlQzX1RYX1BPUwkxNgorI2RlZmluZSBJUlFfU1BJMV9QT1MJCTI4CisKKy8qIElBUjUgQklUIEZJRUxEUyAqLworI2RlZmluZSBJUlFfU1BJMl9QT1MJCTAKKyNkZWZpbmUgSVJRX1VBUlQxX1JYX1BPUwk0CisjZGVmaW5lIElSUV9VQVJUMV9UWF9QT1MJOAorI2RlZmluZSBJUlFfVUFSVDJfUlhfUE9TCTEyCisjZGVmaW5lIElSUV9VQVJUMl9UWF9QT1MJMTYKKyNkZWZpbmUgSVJRX1RXSTBfUE9TCQkyMAorI2RlZmluZSBJUlFfVFdJMV9QT1MJCTI0CisjZGVmaW5lIElSUV9DQU5fUlhfUE9TCQkyOAorCisvKiBJQVI2IEJJVCBGSUVMRFMgKi8KKyNkZWZpbmUgSVJRX0NBTl9UWF9QT1MJCTAKKyNkZWZpbmUgSVJRX01FTTFfRE1BMF9QT1MJNAorI2RlZmluZSBJUlFfTUVNMV9ETUExX1BPUwk4CisjZW5kaWYJCQkJLyogX0JGNTM4X0lSUV9IXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L2luY2x1ZGUvbWFjaC9tZW1fbWFwLmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzgvaW5jbHVkZS9tYWNoL21lbV9tYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjgxMTk2Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L2luY2x1ZGUvbWFjaC9tZW1fbWFwLmgKQEAgLTAsMCArMSwxMTMgQEAKKy8qCisgKiBGaWxlOiAgICAgICAgIGluY2x1ZGUvYXNtLWJsYWNrZmluL21hY2gtYmY1MzgvbWVtX21hcC5oCisgKiBCYXNlZCBvbjoKKyAqIEF1dGhvcjoKKyAqCisgKiBDcmVhdGVkOgorICogRGVzY3JpcHRpb246CisgKgorICogUmV2OgorICoKKyAqIE1vZGlmaWVkOgorICoKKyAqIEJ1Z3M6ICAgICAgICAgRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuCisgKiBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICovCisKKyNpZm5kZWYgX01FTV9NQVBfNTM4X0hfCisjZGVmaW5lIF9NRU1fTUFQXzUzOF9IXworCisjZGVmaW5lIENPUkVNTVJfQkFTRSAgICAgICAgICAgMHhGRkUwMDAwMAkgLyogQ29yZSBNTVJzICovCisjZGVmaW5lIFNZU01NUl9CQVNFICAgICAgICAgICAgMHhGRkMwMDAwMAkgLyogU3lzdGVtIE1NUnMgKi8KKworLyogQXN5bmMgTWVtb3J5IEJhbmtzICovCisjZGVmaW5lIEFTWU5DX0JBTkszX0JBU0UJMHgyMDMwMDAwMAkgLyogQXN5bmMgQmFuayAzICovCisjZGVmaW5lIEFTWU5DX0JBTkszX1NJWkUJMHgwMDEwMDAwMAkvKiAxTSAqLworI2RlZmluZSBBU1lOQ19CQU5LMl9CQVNFCTB4MjAyMDAwMDAJIC8qIEFzeW5jIEJhbmsgMiAqLworI2RlZmluZSBBU1lOQ19CQU5LMl9TSVpFCTB4MDAxMDAwMDAJLyogMU0gKi8KKyNkZWZpbmUgQVNZTkNfQkFOSzFfQkFTRQkweDIwMTAwMDAwCSAvKiBBc3luYyBCYW5rIDEgKi8KKyNkZWZpbmUgQVNZTkNfQkFOSzFfU0laRQkweDAwMTAwMDAwCS8qIDFNICovCisjZGVmaW5lIEFTWU5DX0JBTkswX0JBU0UJMHgyMDAwMDAwMAkgLyogQXN5bmMgQmFuayAwICovCisjZGVmaW5lIEFTWU5DX0JBTkswX1NJWkUJMHgwMDEwMDAwMAkvKiAxTSAqLworCisvKiBCb290IFJPTSBNZW1vcnkgKi8KKworI2RlZmluZSBCT09UX1JPTV9TVEFSVAkJMHhFRjAwMDAwMAorI2RlZmluZSBCT09UX1JPTV9MRU5HVEgJCTB4NDAwCisKKy8qIExldmVsIDEgTWVtb3J5ICovCisKKyNpZmRlZiBDT05GSUdfQkZJTl9JQ0FDSEUKKyNkZWZpbmUgQkZJTl9JQ0FDSEVTSVpFCSgxNioxMDI0KQorI2Vsc2UKKyNkZWZpbmUgQkZJTl9JQ0FDSEVTSVpFCSgwKjEwMjQpCisjZW5kaWYKKworLyogTWVtb3J5IE1hcCBmb3IgQURTUC1CRjUzOC85IHByb2Nlc3NvcnMgKi8KKworI2RlZmluZSBMMV9DT0RFX1NUQVJUICAgICAgIDB4RkZBMDAwMDAKKyNkZWZpbmUgTDFfREFUQV9BX1NUQVJUICAgICAweEZGODAwMDAwCisjZGVmaW5lIEwxX0RBVEFfQl9TVEFSVCAgICAgMHhGRjkwMDAwMAorCisjaWZkZWYgQ09ORklHX0JGSU5fSUNBQ0hFCisjZGVmaW5lIEwxX0NPREVfTEVOR1RIICAgICAgKDB4MTQwMDAgLSAweDQwMDApCisjZWxzZQorI2RlZmluZSBMMV9DT0RFX0xFTkdUSCAgICAgIDB4MTQwMDAKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0JGSU5fRENBQ0hFCisKKyNpZmRlZiBDT05GSUdfQkZJTl9EQ0FDSEVfQkFOS0EKKyNkZWZpbmUgRE1FTV9DTlRSIChBQ0FDSEVfQlNSQU0gfCBFTkRDUExCIHwgUE9SVF9QUkVGMCkKKyNkZWZpbmUgTDFfREFUQV9BX0xFTkdUSCAgICAgICgweDgwMDAgLSAweDQwMDApCisjZGVmaW5lIEwxX0RBVEFfQl9MRU5HVEggICAgICAweDgwMDAKKyNkZWZpbmUgQkZJTl9EQ0FDSEVTSVpFCSgxNioxMDI0KQorI2RlZmluZSBCRklOX0RTVVBCQU5LUwkxCisjZWxzZQorI2RlZmluZSBETUVNX0NOVFIgKEFDQUNIRV9CQ0FDSEUgfCBFTkRDUExCIHwgUE9SVF9QUkVGMCkKKyNkZWZpbmUgTDFfREFUQV9BX0xFTkdUSCAgICAgICgweDgwMDAgLSAweDQwMDApCisjZGVmaW5lIEwxX0RBVEFfQl9MRU5HVEggICAgICAoMHg4MDAwIC0gMHg0MDAwKQorI2RlZmluZSBCRklOX0RDQUNIRVNJWkUJKDMyKjEwMjQpCisjZGVmaW5lIEJGSU5fRFNVUEJBTktTCTIKKyNlbmRpZgorCisjZWxzZQorI2RlZmluZSBETUVNX0NOVFIgKEFTUkFNX0JTUkFNIHwgRU5EQ1BMQiB8IFBPUlRfUFJFRjApCisjZGVmaW5lIEwxX0RBVEFfQV9MRU5HVEggICAgICAweDgwMDAKKyNkZWZpbmUgTDFfREFUQV9CX0xFTkdUSCAgICAgIDB4ODAwMAorI2RlZmluZSBCRklOX0RDQUNIRVNJWkUJKDAqMTAyNCkKKyNkZWZpbmUgQkZJTl9EU1VQQkFOS1MJMAorI2VuZGlmIC8qQ09ORklHX0JGSU5fRENBQ0hFKi8KKworCisvKiBMZXZlbCAyIE1lbW9yeSAtIG5vbmUgKi8KKworI2RlZmluZSBMMl9TVEFSVAkwCisjZGVmaW5lIEwyX0xFTkdUSAkwCisKKy8qIFNjcmF0Y2ggUGFkIE1lbW9yeSAqLworCisjZGVmaW5lIEwxX1NDUkFUQ0hfU1RBUlQJMHhGRkIwMDAwMAorI2RlZmluZSBMMV9TQ1JBVENIX0xFTkdUSAkweDEwMDAKKworI2RlZmluZSBHRVRfUERBX1NBRkUocHJlZykJCVwKKwlwcmVnLmwgPSBfY3B1X3BkYTsJCVwKKwlwcmVnLmggPSBfY3B1X3BkYTsKKworI2RlZmluZSBHRVRfUERBKHByZWcsIGRyZWcpCUdFVF9QREFfU0FGRShwcmVnKQorCisjZW5kaWYJCQkJLyogX01FTV9NQVBfNTM4X0hfICovCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzgvaW5jbHVkZS9tYWNoL3BvcnRtdXguaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzOC9pbmNsdWRlL21hY2gvcG9ydG11eC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlMDMxYjUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzgvaW5jbHVkZS9tYWNoL3BvcnRtdXguaApAQCAtMCwwICsxLDEwNiBAQAorI2lmbmRlZiBfTUFDSF9QT1JUTVVYX0hfCisjZGVmaW5lIF9NQUNIX1BPUlRNVVhfSF8KKworI2RlZmluZSBNQVhfUkVTT1VSQ0VTCU1BWF9CTEFDS0ZJTl9HUElPUworCisjZGVmaW5lIFBfVE1SMgkJKFBfRE9OVENBUkUpCisjZGVmaW5lIFBfVE1SMQkJKFBfRE9OVENBUkUpCisjZGVmaW5lIFBfVE1SMAkJKFBfRE9OVENBUkUpCisjZGVmaW5lIFBfVE1SQ0xLCShQX0RPTlRDQVJFKQorI2RlZmluZSBQX1BQSTBfQ0xLCShQX0RPTlRDQVJFKQorI2RlZmluZSBQX1BQSTBfRlMxCShQX0RPTlRDQVJFKQorI2RlZmluZSBQX1BQSTBfRlMyCShQX0RPTlRDQVJFKQorCisjZGVmaW5lIFBfVFdJMF9TQ0wJKFBfRE9OVENBUkUpCisjZGVmaW5lIFBfVFdJMF9TREEJKFBfRE9OVENBUkUpCisjZGVmaW5lIFBfVFdJMV9TQ0wJKFBfRE9OVENBUkUpCisjZGVmaW5lIFBfVFdJMV9TREEJKFBfRE9OVENBUkUpCisKKyNkZWZpbmUgUF9TUE9SVDFfVFNDTEsJKFBfRE9OVENBUkUpCisjZGVmaW5lIFBfU1BPUlQxX1JTQ0xLCShQX0RPTlRDQVJFKQorI2RlZmluZSBQX1NQT1JUMF9UU0NMSwkoUF9ET05UQ0FSRSkKKyNkZWZpbmUgUF9TUE9SVDBfUlNDTEsJKFBfRE9OVENBUkUpCisjZGVmaW5lIFBfU1BPUlQxX0RSU0VDCShQX0RPTlRDQVJFKQorI2RlZmluZSBQX1NQT1JUMV9SRlMJKFBfRE9OVENBUkUpCisjZGVmaW5lIFBfU1BPUlQxX0RUUFJJCShQX0RPTlRDQVJFKQorI2RlZmluZSBQX1NQT1JUMV9EVFNFQwkoUF9ET05UQ0FSRSkKKyNkZWZpbmUgUF9TUE9SVDFfVEZTCShQX0RPTlRDQVJFKQorI2RlZmluZSBQX1NQT1JUMV9EUlBSSQkoUF9ET05UQ0FSRSkKKyNkZWZpbmUgUF9TUE9SVDBfRFJTRUMJKFBfRE9OVENBUkUpCisjZGVmaW5lIFBfU1BPUlQwX1JGUwkoUF9ET05UQ0FSRSkKKyNkZWZpbmUgUF9TUE9SVDBfRFRQUkkJKFBfRE9OVENBUkUpCisjZGVmaW5lIFBfU1BPUlQwX0RUU0VDCShQX0RPTlRDQVJFKQorI2RlZmluZSBQX1NQT1JUMF9URlMJKFBfRE9OVENBUkUpCisjZGVmaW5lIFBfU1BPUlQwX0RSUFJJCShQX0RPTlRDQVJFKQorCisjZGVmaW5lIFBfVUFSVDBfUlgJKFBfRE9OVENBUkUpCisjZGVmaW5lIFBfVUFSVDBfVFgJKFBfRE9OVENBUkUpCisKKyNkZWZpbmUgUF9TUEkwX01PU0kJKFBfRE9OVENBUkUpCisjZGVmaW5lIFBfU1BJMF9NSVNPCShQX0RPTlRDQVJFKQorI2RlZmluZSBQX1NQSTBfU0NLCShQX0RPTlRDQVJFKQorCisjZGVmaW5lIFBfUFBJMF9EMAkoUF9ET05UQ0FSRSkKKyNkZWZpbmUgUF9QUEkwX0QxCShQX0RPTlRDQVJFKQorI2RlZmluZSBQX1BQSTBfRDIJKFBfRE9OVENBUkUpCisjZGVmaW5lIFBfUFBJMF9EMwkoUF9ET05UQ0FSRSkKKworI2RlZmluZSBQX0NBTjBfVFgJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QQzApKQorI2RlZmluZSBQX0NBTjBfUlgJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QQzEpKQorCisjZGVmaW5lIFBfU1BJMV9NT1NJCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEQwKSkKKyNkZWZpbmUgUF9TUEkxX01JU08JKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRDEpKQorI2RlZmluZSBQX1NQSTFfU0NLCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEQyKSkKKyNkZWZpbmUgUF9TUEkxX1NTCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEQzKSkKKyNkZWZpbmUgUF9TUEkxX1NTRUwxCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEQ0KSkKKyNkZWZpbmUgUF9TUEkyX01PU0kJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRDUpKQorI2RlZmluZSBQX1NQSTJfTUlTTwkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BENikpCisjZGVmaW5lIFBfU1BJMl9TQ0sJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRDcpKQorI2RlZmluZSBQX1NQSTJfU1MJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRDgpKQorI2RlZmluZSBQX1NQSTJfU1NFTDEJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRDkpKQorI2RlZmluZSBQX1VBUlQxX1JYCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEQxMCkpCisjZGVmaW5lIFBfVUFSVDFfVFgJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRDExKSkKKyNkZWZpbmUgUF9VQVJUMl9SWAkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BEMTIpKQorI2RlZmluZSBQX1VBUlQyX1RYCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEQxMykpCisKKyNkZWZpbmUgUF9TUE9SVDJfUlNDTEsJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRTApKQorI2RlZmluZSBQX1NQT1JUMl9SRlMJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRTEpKQorI2RlZmluZSBQX1NQT1JUMl9EUlBSSQkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BFMikpCisjZGVmaW5lIFBfU1BPUlQyX0RSU0VDCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEUzKSkKKyNkZWZpbmUgUF9TUE9SVDJfVFNDTEsJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRTQpKQorI2RlZmluZSBQX1NQT1JUMl9URlMJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRTUpKQorI2RlZmluZSBQX1NQT1JUMl9EVFBSSQkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BFNikpCisjZGVmaW5lIFBfU1BPUlQyX0RUU0VDCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEU3KSkKKyNkZWZpbmUgUF9TUE9SVDNfUlNDTEsJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRTgpKQorI2RlZmluZSBQX1NQT1JUM19SRlMJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRTkpKQorI2RlZmluZSBQX1NQT1JUM19EUlBSSQkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BFMTApKQorI2RlZmluZSBQX1NQT1JUM19EUlNFQwkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BFMTEpKQorI2RlZmluZSBQX1NQT1JUM19UU0NMSwkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BFMTIpKQorI2RlZmluZSBQX1NQT1JUM19URlMJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRTEzKSkKKyNkZWZpbmUgUF9TUE9SVDNfRFRQUkkJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRTE0KSkKKyNkZWZpbmUgUF9TUE9SVDNfRFRTRUMJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRTE1KSkKKworI2RlZmluZSBQX1BQSTBfRlMzCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEYzKSkKKyNkZWZpbmUgUF9QUEkwX0QxNQkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BGNCkpCisjZGVmaW5lIFBfUFBJMF9EMTQJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRjUpKQorI2RlZmluZSBQX1BQSTBfRDEzCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEY2KSkKKyNkZWZpbmUgUF9QUEkwX0QxMgkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BGNykpCisjZGVmaW5lIFBfUFBJMF9EMTEJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRjgpKQorI2RlZmluZSBQX1BQSTBfRDEwCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEY5KSkKKyNkZWZpbmUgUF9QUEkwX0Q5CShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEYxMCkpCisjZGVmaW5lIFBfUFBJMF9EOAkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BGMTEpKQorCisjZGVmaW5lIFBfUFBJMF9ENAkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BGMTUpKQorI2RlZmluZSBQX1BQSTBfRDUJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRjE0KSkKKyNkZWZpbmUgUF9QUEkwX0Q2CShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEYxMykpCisjZGVmaW5lIFBfUFBJMF9ENwkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BGMTIpKQorI2RlZmluZSBQX1NQSTBfU1NFTDcJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRjcpKQorI2RlZmluZSBQX1NQSTBfU1NFTDYJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRjYpKQorI2RlZmluZSBQX1NQSTBfU1NFTDUJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRjUpKQorI2RlZmluZSBQX1NQSTBfU1NFTDQJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRjQpKQorI2RlZmluZSBQX1NQSTBfU1NFTDMJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRjMpKQorI2RlZmluZSBQX1NQSTBfU1NFTDIJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRjIpKQorI2RlZmluZSBQX1NQSTBfU1NFTDEJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRjEpKQorI2RlZmluZSBQX1NQSTBfU1MJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRjApKQorCisjZW5kaWYgLyogX01BQ0hfUE9SVE1VWF9IXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L2ludHMtcHJpb3JpdHkuYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzOC9pbnRzLXByaW9yaXR5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzBkMTdlNQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzOC9pbnRzLXByaW9yaXR5LmMKQEAgLTAsMCArMSw5NCBAQAorLyoKKyAqIEZpbGU6ICAgICAgICAgYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L2ludHMtcHJpb3JpdHkuYworICogQmFzZWQgb246ICAgICBhcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvaW50cy1wcmlvcml0eS5jCisgKiBBdXRob3I6ICAgICAgIE1pY2hhZWwgSGVubmVyaWNoCisgKgorICogQ3JlYXRlZDoKKyAqIERlc2NyaXB0aW9uOiAgU2V0IHVwIHRoZSBpbnRlcnJ1cHQgcHJpb3JpdGllcworICoKKyAqIE1vZGlmaWVkOgorICogICAgICAgICAgICAgICBDb3B5cmlnaHQgMjAwOCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKgorICogQnVnczogICAgICAgICBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSB0aGUgZmlsZSBDT1BZSU5HLCBvciB3cml0ZQorICogdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGFzbS9ibGFja2Zpbi5oPgorCit2b2lkIF9faW5pdCBwcm9ncmFtX0lBUih2b2lkKQoreworCisJLyogUHJvZ3JhbSB0aGUgSUFSMCBSZWdpc3RlciB3aXRoIHRoZSBjb25maWd1cmVkIHByaW9yaXR5ICovCisJYmZpbl93cml0ZV9TSUNfSUFSMCgoKENPTkZJR19JUlFfUExMX1dBS0VVUCAtIDcpIDw8IElSUV9QTExfV0FLRVVQX1BPUykgfAorCQkJKChDT05GSUdfSVJRX0RNQTBfRVJST1IgLSA3KSA8PCBJUlFfRE1BMF9FUlJPUl9QT1MpIHwKKwkJCSgoQ09ORklHX0lSUV9QUElfRVJST1IgLSA3KSA8PCBJUlFfUFBJX0VSUk9SX1BPUykgfAorCQkJKChDT05GSUdfSVJRX1NQT1JUMF9FUlJPUiAtIDcpIDw8IElSUV9TUE9SVDBfRVJST1JfUE9TKSB8CisJCQkoKENPTkZJR19JUlFfU1BPUlQxX0VSUk9SIC0gNykgPDwgSVJRX1NQT1JUMV9FUlJPUl9QT1MpIHwKKwkJCSgoQ09ORklHX0lSUV9TUEkwX0VSUk9SIC0gNykgPDwgSVJRX1NQSTBfRVJST1JfUE9TKSB8CisJCQkoKENPTkZJR19JUlFfVUFSVDBfRVJST1IgLSA3KSA8PCBJUlFfVUFSVDBfRVJST1JfUE9TKSB8CisJCQkoKENPTkZJR19JUlFfUlRDIC0gNykgPDwgSVJRX1JUQ19QT1MpKTsKKworCWJmaW5fd3JpdGVfU0lDX0lBUjEoKChDT05GSUdfSVJRX1BQSSAtIDcpIDw8IElSUV9QUElfUE9TKSB8CisJCQkoKENPTkZJR19JUlFfU1BPUlQwX1JYIC0gNykgPDwgSVJRX1NQT1JUMF9SWF9QT1MpIHwKKwkJCSgoQ09ORklHX0lSUV9TUE9SVDBfVFggLSA3KSA8PCBJUlFfU1BPUlQwX1RYX1BPUykgfAorCQkJKChDT05GSUdfSVJRX1NQT1JUMV9SWCAtIDcpIDw8IElSUV9TUE9SVDFfUlhfUE9TKSB8CisJCQkoKENPTkZJR19JUlFfU1BPUlQxX1RYIC0gNykgPDwgSVJRX1NQT1JUMV9UWF9QT1MpIHwKKwkJCSgoQ09ORklHX0lSUV9TUEkwIC0gNykgPDwgSVJRX1NQSTBfUE9TKSB8CisJCQkoKENPTkZJR19JUlFfVUFSVDBfUlggLSA3KSA8PCBJUlFfVUFSVDBfUlhfUE9TKSB8CisJCQkoKENPTkZJR19JUlFfVUFSVDBfVFggLSA3KSA8PCBJUlFfVUFSVDBfVFhfUE9TKSk7CisKKwliZmluX3dyaXRlX1NJQ19JQVIyKCgoQ09ORklHX0lSUV9USU1FUjAgLSA3KSA8PCBJUlFfVElNRVIwX1BPUykgfAorCQkJKChDT05GSUdfSVJRX1RJTUVSMSAtIDcpIDw8IElSUV9USU1FUjFfUE9TKSB8CisJCQkoKENPTkZJR19JUlFfVElNRVIyIC0gNykgPDwgSVJRX1RJTUVSMl9QT1MpIHwKKwkJCSgoQ09ORklHX0lSUV9QT1JURl9JTlRBIC0gNykgPDwgSVJRX1BPUlRGX0lOVEFfUE9TKSB8CisJCQkoKENPTkZJR19JUlFfUE9SVEZfSU5UQiAtIDcpIDw8IElSUV9QT1JURl9JTlRCX1BPUykgfAorCQkJKChDT05GSUdfSVJRX01FTTBfRE1BMCAtIDcpIDw8IElSUV9NRU0wX0RNQTBfUE9TKSB8CisJCQkoKENPTkZJR19JUlFfTUVNMF9ETUExIC0gNykgPDwgSVJRX01FTTBfRE1BMV9QT1MpIHwKKwkJCSgoQ09ORklHX0lSUV9XQVRDSCAtIDcpIDw8IElSUV9XQVRDSF9QT1MpKTsKKworCWJmaW5fd3JpdGVfU0lDX0lBUjMoKChDT05GSUdfSVJRX0RNQTFfRVJST1IgLSA3KSA8PCBJUlFfRE1BMV9FUlJPUl9QT1MpIHwKKwkJCSgoQ09ORklHX0lSUV9TUE9SVDJfRVJST1IgLSA3KSA8PCBJUlFfU1BPUlQyX0VSUk9SX1BPUykgfAorCQkJKChDT05GSUdfSVJRX1NQT1JUM19FUlJPUiAtIDcpIDw8IElSUV9TUE9SVDNfRVJST1JfUE9TKSB8CisJCQkoKENPTkZJR19JUlFfU1BJMV9FUlJPUiAtIDcpIDw8IElSUV9TUEkxX0VSUk9SX1BPUykgfAorCQkJKChDT05GSUdfSVJRX1NQSTJfRVJST1IgLSA3KSA8PCBJUlFfU1BJMl9FUlJPUl9QT1MpIHwKKwkJCSgoQ09ORklHX0lSUV9VQVJUMV9FUlJPUiAtIDcpIDw8IElSUV9VQVJUMV9FUlJPUl9QT1MpIHwKKwkJCSgoQ09ORklHX0lSUV9VQVJUMl9FUlJPUiAtIDcpIDw8IElSUV9VQVJUMl9FUlJPUl9QT1MpKTsKKworCWJmaW5fd3JpdGVfU0lDX0lBUjQoKChDT05GSUdfSVJRX0NBTl9FUlJPUiAtIDcpIDw8IElSUV9DQU5fRVJST1JfUE9TKSB8CisJCQkoKENPTkZJR19JUlFfU1BPUlQyX1JYIC0gNykgPDwgSVJRX1NQT1JUMl9SWF9QT1MpIHwKKwkJCSgoQ09ORklHX0lSUV9TUE9SVDJfVFggLSA3KSA8PCBJUlFfU1BPUlQyX1RYX1BPUykgfAorCQkJKChDT05GSUdfSVJRX1NQT1JUM19SWCAtIDcpIDw8IElSUV9TUE9SVDNfUlhfUE9TKSB8CisJCQkoKENPTkZJR19JUlFfU1BPUlQzX1RYIC0gNykgPDwgSVJRX1NQT1JUM19UWF9QT1MpIHwKKwkJCSgoQ09ORklHX0lSUV9TUEkxIC0gNykgPDwgSVJRX1NQSTFfUE9TKSk7CisKKwliZmluX3dyaXRlX1NJQ19JQVI1KCgoQ09ORklHX0lSUV9TUEkyIC0gNykgPDwgSVJRX1NQSTJfUE9TKSB8CisJCQkoKENPTkZJR19JUlFfVUFSVDFfUlggLSA3KSA8PCBJUlFfVUFSVDFfUlhfUE9TKSB8CisJCQkoKENPTkZJR19JUlFfVUFSVDFfVFggLSA3KSA8PCBJUlFfVUFSVDFfVFhfUE9TKSB8CisJCQkoKENPTkZJR19JUlFfVUFSVDJfUlggLSA3KSA8PCBJUlFfVUFSVDJfUlhfUE9TKSB8CisJCQkoKENPTkZJR19JUlFfVUFSVDJfVFggLSA3KSA8PCBJUlFfVUFSVDJfVFhfUE9TKSB8CisJCQkoKENPTkZJR19JUlFfVFdJMCAtIDcpIDw8IElSUV9UV0kwX1BPUykgfAorCQkJKChDT05GSUdfSVJRX1RXSTEgLSA3KSA8PCBJUlFfVFdJMV9QT1MpIHwKKwkJCSgoQ09ORklHX0lSUV9DQU5fUlggLSA3KSA8PCBJUlFfQ0FOX1JYX1BPUykpOworCisJYmZpbl93cml0ZV9TSUNfSUFSNigoKENPTkZJR19JUlFfQ0FOX1RYIC0gNykgPDwgSVJRX0NBTl9UWF9QT1MpIHwKKwkJCSgoQ09ORklHX0lSUV9NRU0xX0RNQTAgLSA3KSA8PCBJUlFfTUVNMV9ETUEwX1BPUykgfAorCQkJKChDT05GSUdfSVJRX01FTTFfRE1BMSAtIDcpIDw8IElSUV9NRU0xX0RNQTFfUE9TKSk7CisKKwlTU1lOQygpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L0tjb25maWcgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvS2NvbmZpZwppbmRleCAxYmZjZDhmLi5kY2Y2NTcxIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvS2NvbmZpZworKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvS2NvbmZpZwpAQCAtMjUwLDcgKzI1MCw3IEBACiAJZGVmYXVsdCAxMQogY29uZmlnIElSUV9USU1FUjAKIAlpbnQgIklSUV9USU1FUjAiCi0JZGVmYXVsdCAxMQorCWRlZmF1bHQgOAogY29uZmlnIElSUV9USU1FUjEKIAlpbnQgIklSUV9USU1FUjEiCiAJZGVmYXVsdCAxMQpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L01ha2VmaWxlIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L01ha2VmaWxlCmluZGV4IDY4ZTU0NzguLjU2OTk0YjYgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9NYWtlZmlsZQorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvTWFrZWZpbGUKQEAgLTIsNiArMiw0IEBACiAjIGFyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9NYWtlZmlsZQogIwogCi1leHRyYS15IDo9IGhlYWQubwotCiBvYmoteSA6PSBpbnRzLXByaW9yaXR5Lm8gZG1hLm8KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9ib2FyZHMvY21fYmY1NDguYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9ib2FyZHMvY21fYmY1NDguYwppbmRleCAyNDE5MmFhLi5mNTNhZDY4IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvYm9hcmRzL2NtX2JmNTQ4LmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2JvYXJkcy9jbV9iZjU0OC5jCkBAIC0zMiw2ICszMiw3IEBACiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvbXRkL210ZC5oPgogI2luY2x1ZGUgPGxpbnV4L210ZC9wYXJ0aXRpb25zLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL3BoeXNtYXAuaD4KICNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpL2ZsYXNoLmg+CiAjaW5jbHVkZSA8bGludXgvaXJxLmg+CkBAIC00Miw2ICs0Myw3IEBACiAjaW5jbHVkZSA8YXNtL2dwaW8uaD4KICNpbmNsdWRlIDxhc20vbmFuZC5oPgogI2luY2x1ZGUgPGFzbS9wb3J0bXV4Lmg+CisjaW5jbHVkZSA8YXNtL2JmaW5fc2RoLmg+CiAjaW5jbHVkZSA8bWFjaC9iZjU0eF9rZXlzLmg+CiAjaW5jbHVkZSA8YXNtL2RwbWMuaD4KICNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgpAQCAtMTg2LDQ0ICsxODgsMTA3IEBACiAjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX0JGSU5fU0lSKSB8fCBkZWZpbmVkKENPTkZJR19CRklOX1NJUl9NT0RVTEUpCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIGJmaW5fc2lyX3Jlc291cmNlc1tdID0gewogI2lmZGVmIENPTkZJR19CRklOX1NJUjAKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYmZpbl9zaXIwX3Jlc291cmNlc1tdID0gewogCXsKIAkJLnN0YXJ0ID0gMHhGRkMwMDQwMCwKIAkJLmVuZCA9IDB4RkZDMDA0RkYsCiAJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAogCX0sCisJeworCQkuc3RhcnQgPSBJUlFfVUFSVDBfUlgsCisJCS5lbmQgPSBJUlFfVUFSVDBfUlgrMSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwl7CisJCS5zdGFydCA9IENIX1VBUlQwX1JYLAorCQkuZW5kID0gQ0hfVUFSVDBfUlgrMSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9ETUEsCisJfSwKK307CitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX3NpcjBfZGV2aWNlID0geworCS5uYW1lID0gImJmaW5fc2lyIiwKKwkuaWQgPSAwLAorCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShiZmluX3NpcjBfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UgPSBiZmluX3NpcjBfcmVzb3VyY2VzLAorfTsKICNlbmRpZgogI2lmZGVmIENPTkZJR19CRklOX1NJUjEKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYmZpbl9zaXIxX3Jlc291cmNlc1tdID0gewogCXsKIAkJLnN0YXJ0ID0gMHhGRkMwMjAwMCwKIAkJLmVuZCA9IDB4RkZDMDIwRkYsCiAJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAogCX0sCisJeworCQkuc3RhcnQgPSBJUlFfVUFSVDFfUlgsCisJCS5lbmQgPSBJUlFfVUFSVDFfUlgrMSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwl7CisJCS5zdGFydCA9IENIX1VBUlQxX1JYLAorCQkuZW5kID0gQ0hfVUFSVDFfUlgrMSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9ETUEsCisJfSwKK307CitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX3NpcjFfZGV2aWNlID0geworCS5uYW1lID0gImJmaW5fc2lyIiwKKwkuaWQgPSAxLAorCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShiZmluX3NpcjFfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UgPSBiZmluX3NpcjFfcmVzb3VyY2VzLAorfTsKICNlbmRpZgogI2lmZGVmIENPTkZJR19CRklOX1NJUjIKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYmZpbl9zaXIyX3Jlc291cmNlc1tdID0gewogCXsKIAkJLnN0YXJ0ID0gMHhGRkMwMjEwMCwKIAkJLmVuZCA9IDB4RkZDMDIxRkYsCiAJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAogCX0sCisJeworCQkuc3RhcnQgPSBJUlFfVUFSVDJfUlgsCisJCS5lbmQgPSBJUlFfVUFSVDJfUlgrMSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwl7CisJCS5zdGFydCA9IENIX1VBUlQyX1JYLAorCQkuZW5kID0gQ0hfVUFSVDJfUlgrMSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9ETUEsCisJfSwKK307CitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX3NpcjJfZGV2aWNlID0geworCS5uYW1lID0gImJmaW5fc2lyIiwKKwkuaWQgPSAyLAorCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShiZmluX3NpcjJfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UgPSBiZmluX3NpcjJfcmVzb3VyY2VzLAorfTsKICNlbmRpZgogI2lmZGVmIENPTkZJR19CRklOX1NJUjMKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYmZpbl9zaXIzX3Jlc291cmNlc1tdID0gewogCXsKIAkJLnN0YXJ0ID0gMHhGRkMwMzEwMCwKIAkJLmVuZCA9IDB4RkZDMDMxRkYsCiAJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAogCX0sCi0jZW5kaWYKKwl7CisJCS5zdGFydCA9IElSUV9VQVJUM19SWCwKKwkJLmVuZCA9IElSUV9VQVJUM19SWCsxLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCXsKKwkJLnN0YXJ0ID0gQ0hfVUFSVDNfUlgsCisJCS5lbmQgPSBDSF9VQVJUM19SWCsxLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0RNQSwKKwl9LAogfTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9zaXJfZGV2aWNlID0geworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9zaXIzX2RldmljZSA9IHsKIAkubmFtZSA9ICJiZmluX3NpciIsCi0JLmlkID0gMCwKLQkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUoYmZpbl9zaXJfcmVzb3VyY2VzKSwKLQkucmVzb3VyY2UgPSBiZmluX3Npcl9yZXNvdXJjZXMsCisJLmlkID0gMywKKwkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUoYmZpbl9zaXIzX3Jlc291cmNlcyksCisJLnJlc291cmNlID0gYmZpbl9zaXIzX3Jlc291cmNlcywKIH07CiAjZW5kaWYKKyNlbmRpZgogCiAjaWYgZGVmaW5lZChDT05GSUdfU01TQzkxMVgpIHx8IGRlZmluZWQoQ09ORklHX1NNU0M5MTFYX01PRFVMRSkKIHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2Ugc21zYzkxMXhfcmVzb3VyY2VzW10gPSB7CkBAIC0yNzEsOCArMzM2LDggQEAKIAkuZHluX2ZpZm8JPSAwLAogCS5zb2Z0X2Nvbgk9IDEsCiAJLmRtYQkJPSAxLAotCS5udW1fZXBzCT0gNywKLQkuZG1hX2NoYW5uZWxzCT0gNywKKwkubnVtX2Vwcwk9IDgsCisJLmRtYV9jaGFubmVscwk9IDgsCiAJLmdwaW9fdnJzZWwJPSBHUElPX1BINiwKIH07CiAKQEAgLTMwMiw2ICszNjcsMTkgQEAKIH07CiAjZW5kaWYKIAorc3RhdGljIHN0cnVjdCByZXNvdXJjZSBiZmluX2dwaW9zX3Jlc291cmNlcyA9IHsKKwkuc3RhcnQgPSAwLAorCS5lbmQgICA9IE1BWF9CTEFDS0ZJTl9HUElPUyAtIDEsCisJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX2dwaW9zX2RldmljZSA9IHsKKwkubmFtZSA9ICJzaW1wbGUtZ3BpbyIsCisJLmlkID0gLTEsCisJLm51bV9yZXNvdXJjZXMgPSAxLAorCS5yZXNvdXJjZSA9ICZiZmluX2dwaW9zX3Jlc291cmNlcywKK307CisKICNpZiBkZWZpbmVkKENPTkZJR19QQVRBX0JGNTRYKSB8fCBkZWZpbmVkKENPTkZJR19QQVRBX0JGNTRYX01PRFVMRSkKIHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYmZpbl9hdGFwaV9yZXNvdXJjZXNbXSA9IHsKIAl7CkBAIC0zNzIsOSArNDUwLDU4IEBACiAjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX1NESF9CRklOKSB8fCBkZWZpbmVkKENPTkZJR19TREhfQkZJTl9NT0RVTEUpCitzdGF0aWMgc3RydWN0IGJmaW5fc2RfaG9zdCBiZmluX3NkaF9kYXRhID0geworCS5kbWFfY2hhbiA9IENIX1NESCwKKwkuaXJxX2ludDAgPSBJUlFfU0RIX01BU0swLAorCS5waW5fcmVxID0ge1BfU0RfRDAsIFBfU0RfRDEsIFBfU0RfRDIsIFBfU0RfRDMsIFBfU0RfQ0xLLCBQX1NEX0NNRCwgMH0sCit9OworCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZjU0eF9zZGhfZGV2aWNlID0gewogCS5uYW1lID0gImJmaW4tc2RoIiwKIAkuaWQgPSAwLAorCS5kZXYgPSB7CisJCS5wbGF0Zm9ybV9kYXRhID0gJmJmaW5fc2RoX2RhdGEsCisJfSwKK307CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX01URF9QSFlTTUFQKSB8fCBkZWZpbmVkKENPTkZJR19NVERfUEhZU01BUF9NT0RVTEUpCitzdGF0aWMgc3RydWN0IG10ZF9wYXJ0aXRpb24gcGFyYV9wYXJ0aXRpb25zW10gPSB7CisJeworCQkubmFtZSAgICAgICA9ICJib290bG9hZGVyKG5vcikiLAorCQkuc2l6ZSAgICAgICA9IDB4NDAwMDAsCisJCS5vZmZzZXQgICAgID0gMCwKKwl9LCB7CisJCS5uYW1lICAgICAgID0gImxpbnV4IGtlcm5lbChub3IpIiwKKwkJLnNpemUgICAgICAgPSAweDQwMDAwMCwKKwkJLm9mZnNldCAgICAgPSBNVERQQVJUX09GU19BUFBFTkQsCisJfSwgeworCQkubmFtZSAgICAgICA9ICJmaWxlIHN5c3RlbShub3IpIiwKKwkJLnNpemUgICAgICAgPSBNVERQQVJUX1NJWl9GVUxMLAorCQkub2Zmc2V0ICAgICA9IE1URFBBUlRfT0ZTX0FQUEVORCwKKwl9Cit9OworCitzdGF0aWMgc3RydWN0IHBoeXNtYXBfZmxhc2hfZGF0YSBwYXJhX2ZsYXNoX2RhdGEgPSB7CisJLndpZHRoICAgICAgPSAyLAorCS5wYXJ0cyAgICAgID0gcGFyYV9wYXJ0aXRpb25zLAorCS5ucl9wYXJ0cyAgID0gQVJSQVlfU0laRShwYXJhX3BhcnRpdGlvbnMpLAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBwYXJhX2ZsYXNoX3Jlc291cmNlID0geworCS5zdGFydCA9IDB4MjAwMDAwMDAsCisJLmVuZCAgID0gMHgyMDdmZmZmZiwKKwkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHBhcmFfZmxhc2hfZGV2aWNlID0geworCS5uYW1lICAgICAgICAgID0gInBoeXNtYXAtZmxhc2giLAorCS5pZCAgICAgICAgICAgID0gMCwKKwkuZGV2ID0geworCQkucGxhdGZvcm1fZGF0YSA9ICZwYXJhX2ZsYXNoX2RhdGEsCisJfSwKKwkubnVtX3Jlc291cmNlcyA9IDEsCisJLnJlc291cmNlICAgICAgPSAmcGFyYV9mbGFzaF9yZXNvdXJjZSwKIH07CiAjZW5kaWYKIApAQCAtNjQyLDcgKzc2OSwxOCBAQAogI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19CRklOX1NJUikgfHwgZGVmaW5lZChDT05GSUdfQkZJTl9TSVJfTU9EVUxFKQotCSZiZmluX3Npcl9kZXZpY2UsCisjaWZkZWYgQ09ORklHX0JGSU5fU0lSMAorCSZiZmluX3NpcjBfZGV2aWNlLAorI2VuZGlmCisjaWZkZWYgQ09ORklHX0JGSU5fU0lSMQorCSZiZmluX3NpcjFfZGV2aWNlLAorI2VuZGlmCisjaWZkZWYgQ09ORklHX0JGSU5fU0lSMgorCSZiZmluX3NpcjJfZGV2aWNlLAorI2VuZGlmCisjaWZkZWYgQ09ORklHX0JGSU5fU0lSMworCSZiZmluX3NpcjNfZGV2aWNlLAorI2VuZGlmCiAjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX0ZCX0JGNTRYX0xRMDQzKSB8fCBkZWZpbmVkKENPTkZJR19GQl9CRjU0WF9MUTA0M19NT0RVTEUpCkBAIC02NzksNyArODE3LDcgQEAKICNlbmRpZgogCiAjaWYgZGVmaW5lZChDT05GSUdfSTJDX0JMQUNLRklOX1RXSSkgfHwgZGVmaW5lZChDT05GSUdfSTJDX0JMQUNLRklOX1RXSV9NT0RVTEUpCi0vKgkmaTJjX2JmaW5fdHdpMF9kZXZpY2UsICovCisJJmkyY19iZmluX3R3aTBfZGV2aWNlLAogI2lmICFkZWZpbmVkKENPTkZJR19CRjU0MikKIAkmaTJjX2JmaW5fdHdpMV9kZXZpY2UsCiAjZW5kaWYKQEAgLTY4OCw2ICs4MjYsMTIgQEAKICNpZiBkZWZpbmVkKENPTkZJR19LRVlCT0FSRF9HUElPKSB8fCBkZWZpbmVkKENPTkZJR19LRVlCT0FSRF9HUElPX01PRFVMRSkKIAkmYmZpbl9kZXZpY2VfZ3Bpb2tleXMsCiAjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX01URF9QSFlTTUFQKSB8fCBkZWZpbmVkKENPTkZJR19NVERfUEhZU01BUF9NT0RVTEUpCisJJnBhcmFfZmxhc2hfZGV2aWNlLAorI2VuZGlmCisKKwkmYmZpbl9ncGlvc19kZXZpY2UsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBjbV9iZjU0OF9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvYm9hcmRzL2V6a2l0LmMgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvYm9hcmRzL2V6a2l0LmMKaW5kZXggNTI4ODE4Ny4uMzA5YzE2MCAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2JvYXJkcy9lemtpdC5jCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9ib2FyZHMvZXpraXQuYwpAQCAtNDUsNiArNDUsNyBAQAogI2luY2x1ZGUgPGFzbS9uYW5kLmg+CiAjaW5jbHVkZSA8YXNtL2RwbWMuaD4KICNpbmNsdWRlIDxhc20vcG9ydG11eC5oPgorI2luY2x1ZGUgPGFzbS9iZmluX3NkaC5oPgogI2luY2x1ZGUgPG1hY2gvYmY1NHhfa2V5cy5oPgogI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3BpL2FkNzg3Ny5oPgpAQCAtNTIsMTYgKzUzLDE2IEBACiAvKgogICogTmFtZSB0aGUgQm9hcmQgZm9yIHRoZSAvcHJvYy9jcHVpbmZvCiAgKi8KLWNvbnN0IGNoYXIgYmZpbl9ib2FyZF9uYW1lW10gPSAiQURTUC1CRjU0OC1FWktJVCI7Citjb25zdCBjaGFyIGJmaW5fYm9hcmRfbmFtZVtdID0gIkFESSBCRjU0OC1FWktJVCI7CiAKIC8qCiAgKiAgRHJpdmVyIG5lZWRzIHRvIGtub3cgYWRkcmVzcywgaXJxIGFuZCBmbGFnIHBpbi4KICAqLwogCiAjaWYgZGVmaW5lZChDT05GSUdfVVNCX0lTUDE3NjBfSENEKSB8fCBkZWZpbmVkKENPTkZJR19VU0JfSVNQMTc2MF9IQ0RfTU9EVUxFKQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBiZmluX2lzcDE3NjFfcmVzb3VyY2VzW10gPSB7CisjaW5jbHVkZSA8bGludXgvdXNiL2lzcDE3NjAuaD4KK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYmZpbl9pc3AxNzYwX3Jlc291cmNlc1tdID0gewogCVswXSA9IHsKLQkJLm5hbWUJPSAiaXNwMTc2MS1yZWdzIiwKIAkJLnN0YXJ0ICA9IDB4MkMwQzAwMDAsCiAJCS5lbmQgICAgPSAweDJDMEMwMDAwICsgMHhmZmZmZiwKIAkJLmZsYWdzICA9IElPUkVTT1VSQ0VfTUVNLApAQCAtNzMsMzIgKzc0LDI1IEBACiAJfSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmaW5faXNwMTc2MV9kZXZpY2UgPSB7Ci0JLm5hbWUgICAgICAgICAgID0gImlzcDE3NjEiLAorc3RhdGljIHN0cnVjdCBpc3AxNzYwX3BsYXRmb3JtX2RhdGEgaXNwMTc2MF9wcml2ID0geworCS5pc19pc3AxNzYxID0gMCwKKwkucG9ydDFfZGlzYWJsZSA9IDAsCisJLmJ1c193aWR0aF8xNiA9IDEsCisJLnBvcnQxX290ZyA9IDAsCisJLmFuYWxvZ19vYyA9IDAsCisJLmRhY2tfcG9sYXJpdHlfaGlnaCA9IDAsCisJLmRyZXFfcG9sYXJpdHlfaGlnaCA9IDAsCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX2lzcDE3NjBfZGV2aWNlID0geworCS5uYW1lICAgICAgICAgICA9ICJpc3AxNzYwLWhjZCIsCiAJLmlkICAgICAgICAgICAgID0gMCwKLQkubnVtX3Jlc291cmNlcyAgPSBBUlJBWV9TSVpFKGJmaW5faXNwMTc2MV9yZXNvdXJjZXMpLAotCS5yZXNvdXJjZSAgICAgICA9IGJmaW5faXNwMTc2MV9yZXNvdXJjZXMsCisJLmRldiA9IHsKKwkJLnBsYXRmb3JtX2RhdGEgPSAmaXNwMTc2MF9wcml2LAorCX0sCisJLm51bV9yZXNvdXJjZXMgID0gQVJSQVlfU0laRShiZmluX2lzcDE3NjBfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UgICAgICAgPSBiZmluX2lzcDE3NjBfcmVzb3VyY2VzLAogfTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmJmaW5faXNwMTc2MV9kZXZpY2VzW10gPSB7Ci0JJmJmaW5faXNwMTc2MV9kZXZpY2UsCi19OwotCi1pbnQgX19pbml0IGJmaW5faXNwMTc2MV9pbml0KHZvaWQpCi17Ci0JdW5zaWduZWQgaW50IG51bV9kZXZpY2VzID0gQVJSQVlfU0laRShiZmluX2lzcDE3NjFfZGV2aWNlcyk7Ci0KLQlwcmludGsoS0VSTl9JTkZPICIlcygpOiByZWdpc3RlcmluZyBkZXZpY2UgcmVzb3VyY2VzXG4iLCBfX2Z1bmNfXyk7Ci0Jc2V0X2lycV90eXBlKGJmaW5faXNwMTc2MV9yZXNvdXJjZXNbMV0uc3RhcnQsIElSUUZfVFJJR0dFUl9GQUxMSU5HKTsKLQotCXJldHVybiBwbGF0Zm9ybV9hZGRfZGV2aWNlcyhiZmluX2lzcDE3NjFfZGV2aWNlcywgbnVtX2RldmljZXMpOwotfQotCi12b2lkIF9fZXhpdCBiZmluX2lzcDE3NjFfZXhpdCh2b2lkKQotewotCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKCZiZmluX2lzcDE3NjFfZGV2aWNlKTsKLX0KLWFyY2hfaW5pdGNhbGwoYmZpbl9pc3AxNzYxX2luaXQpOwogI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19GQl9CRjU0WF9MUTA0MykgfHwgZGVmaW5lZChDT05GSUdfRkJfQkY1NFhfTFEwNDNfTU9EVUxFKQpAQCAtMjYyLDQ0ICsyNTYsMTA3IEBACiAjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX0JGSU5fU0lSKSB8fCBkZWZpbmVkKENPTkZJR19CRklOX1NJUl9NT0RVTEUpCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIGJmaW5fc2lyX3Jlc291cmNlc1tdID0gewogI2lmZGVmIENPTkZJR19CRklOX1NJUjAKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYmZpbl9zaXIwX3Jlc291cmNlc1tdID0gewogCXsKIAkJLnN0YXJ0ID0gMHhGRkMwMDQwMCwKIAkJLmVuZCA9IDB4RkZDMDA0RkYsCiAJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAogCX0sCisJeworCQkuc3RhcnQgPSBJUlFfVUFSVDBfUlgsCisJCS5lbmQgPSBJUlFfVUFSVDBfUlgrMSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwl7CisJCS5zdGFydCA9IENIX1VBUlQwX1JYLAorCQkuZW5kID0gQ0hfVUFSVDBfUlgrMSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9ETUEsCisJfSwKK307CitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX3NpcjBfZGV2aWNlID0geworCS5uYW1lID0gImJmaW5fc2lyIiwKKwkuaWQgPSAwLAorCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShiZmluX3NpcjBfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UgPSBiZmluX3NpcjBfcmVzb3VyY2VzLAorfTsKICNlbmRpZgogI2lmZGVmIENPTkZJR19CRklOX1NJUjEKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYmZpbl9zaXIxX3Jlc291cmNlc1tdID0gewogCXsKIAkJLnN0YXJ0ID0gMHhGRkMwMjAwMCwKIAkJLmVuZCA9IDB4RkZDMDIwRkYsCiAJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAogCX0sCisJeworCQkuc3RhcnQgPSBJUlFfVUFSVDFfUlgsCisJCS5lbmQgPSBJUlFfVUFSVDFfUlgrMSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwl7CisJCS5zdGFydCA9IENIX1VBUlQxX1JYLAorCQkuZW5kID0gQ0hfVUFSVDFfUlgrMSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9ETUEsCisJfSwKK307CitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX3NpcjFfZGV2aWNlID0geworCS5uYW1lID0gImJmaW5fc2lyIiwKKwkuaWQgPSAxLAorCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShiZmluX3NpcjFfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UgPSBiZmluX3NpcjFfcmVzb3VyY2VzLAorfTsKICNlbmRpZgogI2lmZGVmIENPTkZJR19CRklOX1NJUjIKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYmZpbl9zaXIyX3Jlc291cmNlc1tdID0gewogCXsKIAkJLnN0YXJ0ID0gMHhGRkMwMjEwMCwKIAkJLmVuZCA9IDB4RkZDMDIxRkYsCiAJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAogCX0sCisJeworCQkuc3RhcnQgPSBJUlFfVUFSVDJfUlgsCisJCS5lbmQgPSBJUlFfVUFSVDJfUlgrMSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwl7CisJCS5zdGFydCA9IENIX1VBUlQyX1JYLAorCQkuZW5kID0gQ0hfVUFSVDJfUlgrMSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9ETUEsCisJfSwKK307CitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX3NpcjJfZGV2aWNlID0geworCS5uYW1lID0gImJmaW5fc2lyIiwKKwkuaWQgPSAyLAorCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShiZmluX3NpcjJfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UgPSBiZmluX3NpcjJfcmVzb3VyY2VzLAorfTsKICNlbmRpZgogI2lmZGVmIENPTkZJR19CRklOX1NJUjMKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYmZpbl9zaXIzX3Jlc291cmNlc1tdID0gewogCXsKIAkJLnN0YXJ0ID0gMHhGRkMwMzEwMCwKIAkJLmVuZCA9IDB4RkZDMDMxRkYsCiAJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAogCX0sCi0jZW5kaWYKKwl7CisJCS5zdGFydCA9IElSUV9VQVJUM19SWCwKKwkJLmVuZCA9IElSUV9VQVJUM19SWCsxLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCXsKKwkJLnN0YXJ0ID0gQ0hfVUFSVDNfUlgsCisJCS5lbmQgPSBDSF9VQVJUM19SWCsxLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0RNQSwKKwl9LAogfTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9zaXJfZGV2aWNlID0geworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9zaXIzX2RldmljZSA9IHsKIAkubmFtZSA9ICJiZmluX3NpciIsCi0JLmlkID0gMCwKLQkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUoYmZpbl9zaXJfcmVzb3VyY2VzKSwKLQkucmVzb3VyY2UgPSBiZmluX3Npcl9yZXNvdXJjZXMsCisJLmlkID0gMywKKwkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUoYmZpbl9zaXIzX3Jlc291cmNlcyksCisJLnJlc291cmNlID0gYmZpbl9zaXIzX3Jlc291cmNlcywKIH07CiAjZW5kaWYKKyNlbmRpZgogCiAjaWYgZGVmaW5lZChDT05GSUdfU01TQzkxMVgpIHx8IGRlZmluZWQoQ09ORklHX1NNU0M5MTFYX01PRFVMRSkKIHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2Ugc21zYzkxMXhfcmVzb3VyY2VzW10gPSB7CkBAIC0zNDcsOCArNDA0LDggQEAKIAkuZHluX2ZpZm8JPSAwLAogCS5zb2Z0X2Nvbgk9IDEsCiAJLmRtYQkJPSAxLAotCS5udW1fZXBzCT0gNywKLQkuZG1hX2NoYW5uZWxzCT0gNywKKwkubnVtX2Vwcwk9IDgsCisJLmRtYV9jaGFubmVscwk9IDgsCiAJLmdwaW9fdnJzZWwJPSBHUElPX1BFNywKIH07CiAKQEAgLTQ0OCw5ICs1MDUsMTkgQEAKICNlbmRpZgogCiAjaWYgZGVmaW5lZChDT05GSUdfU0RIX0JGSU4pIHx8IGRlZmluZWQoQ09ORklHX1NESF9CRklOX01PRFVMRSkKKworc3RhdGljIHN0cnVjdCBiZmluX3NkX2hvc3QgYmZpbl9zZGhfZGF0YSA9IHsKKwkuZG1hX2NoYW4gPSBDSF9TREgsCisJLmlycV9pbnQwID0gSVJRX1NESF9NQVNLMCwKKwkucGluX3JlcSA9IHtQX1NEX0QwLCBQX1NEX0QxLCBQX1NEX0QyLCBQX1NEX0QzLCBQX1NEX0NMSywgUF9TRF9DTUQsIDB9LAorfTsKKwogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmY1NHhfc2RoX2RldmljZSA9IHsKIAkubmFtZSA9ICJiZmluLXNkaCIsCiAJLmlkID0gMCwKKwkuZGV2ID0geworCQkucGxhdGZvcm1fZGF0YSA9ICZiZmluX3NkaF9kYXRhLAorCX0sCiB9OwogI2VuZGlmCiAKQEAgLTU4OSw3ICs2NTYsNyBAQAogewogCS5tb2RhbGlhcwkJPSAiYWQ3ODc3IiwKIAkucGxhdGZvcm1fZGF0YQkJPSAmYmZpbl9hZDc4NzdfdHNfaW5mbywKLQkuaXJxCQkJPSBJUlFfUEoxMSwJLyogbmV3ZXIgYm9hcmRzIChSZXYgMS40KykgdXNlIElSUV9QQjQgKi8KKwkuaXJxCQkJPSBJUlFfUEI0LAkvKiBvbGQgYm9hcmRzICg8PVJldiAxLjMpIHVzZSBJUlFfUEoxMSAqLwogCS5tYXhfc3BlZWRfaHoJCT0gMTI1MDAwMDAsICAgICAvKiBtYXggc3BpIGNsb2NrIChTQ0spIHNwZWVkIGluIEhaICovCiAJLmJ1c19udW0JCT0gMCwKIAkuY2hpcF9zZWxlY3QgIAkJPSAyLApAQCAtODEyLDcgKzg3OSwxOCBAQAogI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19CRklOX1NJUikgfHwgZGVmaW5lZChDT05GSUdfQkZJTl9TSVJfTU9EVUxFKQotCSZiZmluX3Npcl9kZXZpY2UsCisjaWZkZWYgQ09ORklHX0JGSU5fU0lSMAorCSZiZmluX3NpcjBfZGV2aWNlLAorI2VuZGlmCisjaWZkZWYgQ09ORklHX0JGSU5fU0lSMQorCSZiZmluX3NpcjFfZGV2aWNlLAorI2VuZGlmCisjaWZkZWYgQ09ORklHX0JGSU5fU0lSMgorCSZiZmluX3NpcjJfZGV2aWNlLAorI2VuZGlmCisjaWZkZWYgQ09ORklHX0JGSU5fU0lSMworCSZiZmluX3NpcjNfZGV2aWNlLAorI2VuZGlmCiAjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX0ZCX0JGNTRYX0xRMDQzKSB8fCBkZWZpbmVkKENPTkZJR19GQl9CRjU0WF9MUTA0M19NT0RVTEUpCkBAIC04MjcsNiArOTA1LDEwIEBACiAJJm11c2JfZGV2aWNlLAogI2VuZGlmCiAKKyNpZiBkZWZpbmVkKENPTkZJR19VU0JfSVNQMTc2MF9IQ0QpIHx8IGRlZmluZWQoQ09ORklHX1VTQl9JU1AxNzYwX0hDRF9NT0RVTEUpCisJJmJmaW5faXNwMTc2MF9kZXZpY2UsCisjZW5kaWYKKwogI2lmIGRlZmluZWQoQ09ORklHX1BBVEFfQkY1NFgpIHx8IGRlZmluZWQoQ09ORklHX1BBVEFfQkY1NFhfTU9EVUxFKQogCSZiZmluX2F0YXBpX2RldmljZSwKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2RtYS5jIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2RtYS5jCmluZGV4IDc0NzMwZWIuLjUzNTk4MDYgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9kbWEuYworKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvZG1hLmMKQEAgLTMyLDcgKzMyLDcgQEAKICNpbmNsdWRlIDxhc20vYmxhY2tmaW4uaD4KICNpbmNsdWRlIDxhc20vZG1hLmg+CiAKLXN0cnVjdCBkbWFfcmVnaXN0ZXIgKmRtYV9pb19iYXNlX2FkZHJbTUFYX0JMQUNLRklOX0RNQV9DSEFOTkVMXSA9IHsKK3N0cnVjdCBkbWFfcmVnaXN0ZXIgKmRtYV9pb19iYXNlX2FkZHJbTUFYX0RNQV9DSEFOTkVMU10gPSB7CiAJKHN0cnVjdCBkbWFfcmVnaXN0ZXIgKikgRE1BMF9ORVhUX0RFU0NfUFRSLAogCShzdHJ1Y3QgZG1hX3JlZ2lzdGVyICopIERNQTFfTkVYVF9ERVNDX1BUUiwKIAkoc3RydWN0IGRtYV9yZWdpc3RlciAqKSBETUEyX05FWFRfREVTQ19QVFIsCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaGVhZC5TIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2hlYWQuUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTNiMzYxZC4uMDAwMDAwMAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaGVhZC5TCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLS8qCi0gKiBGaWxlOiAgICAgICAgIGFyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9oZWFkLlMKLSAqIEJhc2VkIG9uOiAgICAgYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2hlYWQuUwotICogQXV0aG9yOiAgICAgICBKZWZmIERpb25uZSA8amVmZkB1Y2xpbnV4Lm9yZz4gQ09QWVJJR0hUIDE5OTggRC4gSmVmZiBEaW9ubmUKLSAqCi0gKiBDcmVhdGVkOiAgICAgIDE5OTgKLSAqIERlc2NyaXB0aW9uOiAgU3RhcnR1cCBjb2RlIGZvciBCbGFja2ZpbiBCRjU0OAotICoKLSAqIE1vZGlmaWVkOgotICogICAgICAgICAgICAgICBDb3B5cmlnaHQgMjAwNC0yMDA3IEFuYWxvZyBEZXZpY2VzIEluYy4KLSAqCi0gKiBCdWdzOiAgICAgICAgIEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLwotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIHRoZSBmaWxlIENPUFlJTkcsIG9yIHdyaXRlCi0gKiB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxhc20vYmxhY2tmaW4uaD4KLSNpZmRlZiBDT05GSUdfQkZJTl9LRVJORUxfQ0xPQ0sKLSNpbmNsdWRlIDxhc20vY2xvY2tzLmg+Ci0jaW5jbHVkZSA8bWFjaC9tZW1faW5pdC5oPgotI2VuZGlmCi0KLS5zZWN0aW9uIC5sMS50ZXh0Ci0jaWZkZWYgQ09ORklHX0JGSU5fS0VSTkVMX0NMT0NLCi1FTlRSWShfc3RhcnRfZG1hX2NvZGUpCi0KLQkvKiBFbmFibGUgUEhZIENMSyBidWZmZXIgb3V0cHV0ICovCi0JcDAuaCA9IGhpKFZSX0NUTCk7Ci0JcDAubCA9IGxvKFZSX0NUTCk7Ci0JcjAubCA9IHdbcDBdOwotCWJpdHNldChyMCwgMTQpOwotCXdbcDBdID0gcjAubDsKLQlzc3luYzsKLQotCXAwLmggPSBoaShTSUNfSVdSMCk7Ci0JcDAubCA9IGxvKFNJQ19JV1IwKTsKLQlyMC5sID0gMHgxOwotCXIwLmggPSAweDA7Ci0JW3AwXSA9IHIwOwotCVNTWU5DOwotCi0JLyoKLQkgKiAgU2V0IFBMTF9DVEwKLQkgKiAgIC0gWzE0OjA5XSA9IE1TRUxbNTowXSA6IENMS0lOIC8gVkNPIG11bHRpcGxpY2F0aW9uIGZhY3RvcnMKLQkgKiAgIC0gWzhdICAgICA9IEJZUEFTUyAgICA6IEJZUEFTUyB0aGUgUExMLCBydW4gQ0xLSU4gaW50byBDQ0xLL1NDTEsKLQkgKiAgIC0gWzddICAgICA9IG91dHB1dCBkZWxheSAoYWRkIDIwMHBzIG9mIGRlbGF5IHRvIG1lbSBzaWduYWxzKQotCSAqICAgLSBbNl0gICAgID0gaW5wdXQgZGVsYXkgKGFkZCAyMDBwcyBvZiBpbnB1dCBkZWxheSB0byBtZW0gc2lnbmFscykKLQkgKiAgIC0gWzVdICAgICA9IFBEV04gICAgICA6IDE9QWxsIENsb2NrcyBvZmYKLQkgKiAgIC0gWzNdICAgICA9IFNUT1BDSyAgICA6IDE9Q29yZSBDbG9jayBvZmYKLQkgKiAgIC0gWzFdICAgICA9IFBMTF9PRkYgICA6IDE9RGlzYWJsZSBQb3dlciB0byBQTEwKLQkgKiAgIC0gWzBdICAgICA9IERGICAgICAgICA6IDE9UGFzcyBDTEtJTi8yIHRvIFBMTCAvIDA9UGFzcyBDTEtJTiB0byBQTEwKLQkgKiAgIGFsbCBvdGhlciBiaXRzIHNldCB0byB6ZXJvCi0JICovCi0KLQlwMC5oID0gaGkoUExMX0xPQ0tDTlQpOwotCXAwLmwgPSBsbyhQTExfTE9DS0NOVCk7Ci0JcjAgPSAweDMwMChaKTsKLQl3W3AwXSA9IHIwLmw7Ci0Jc3N5bmM7Ci0KLQkvKiBlbmFibGUgc2VsZiByZWZyZXNoIHZpYSBTUlJFUSAqLwotCVAyLkggPSBoaShFQklVX1JTVENUTCk7Ci0JUDIuTCA9IGxvKEVCSVVfUlNUQ1RMKTsKLQlSMCA9IFtQMl07Ci0JQklUU0VUIChSMCwgMyk7Ci0JW1AyXSA9IFIwOwotCVNTWU5DOwotCi0JLyogd2FpdCBmb3IgU1JBQ0sgYml0IHRvIGJlIHNldCAqLwotLkxTUlJfTU9ERToKLQlSMCA9IFtQMl07Ci0JQ0MgPSBCSVRUU1QoUjAsIDQpOwotCWlmICFDQyBKVU1QIC5MU1JSX01PREU7Ci0KLQlyMCA9IENPTkZJR19WQ09fTVVMVCAmIDYzOyAgICAgICAvKiBMb2FkIHRoZSBWQ08gbXVsdGlwbGllciAgICAgICAgICovCi0JcjAgPSByMCA8PCA5OyAgICAgICAgICAgICAgICAgICAgLyogU2hpZnQgaXQgb3ZlciwgICAgICAgICAgICAgICAgICAqLwotCXIxID0gQ0xLSU5fSEFMRjsgICAgICAgICAgICAgICAgIC8qIERvIHdlIG5lZWQgdG8gZGl2aWRlIENMS0lOIGJ5IDI/Ki8KLQlyMCA9IHIxIHwgcjA7Ci0JcjEgPSBQTExfQllQQVNTOyAgICAgICAgICAgICAgICAgLyogQnlwYXNzIHRoZSBQTEw/ICAgICAgICAgICAgICAgICAqLwotCXIxID0gcjEgPDwgODsgICAgICAgICAgICAgICAgICAgIC8qIFNoaWZ0IGl0IG92ZXIgICAgICAgICAgICAgICAgICAgKi8KLQlyMCA9IHIxIHwgcjA7ICAgICAgICAgICAgICAgICAgICAvKiBhZGQgdGhlbSBhbGwgdG9nZXRoZXIgICAgICAgICAgICovCi0jaWZkZWYgQU5PTUFMWV8wNTAwMDI2NQotCUJJVFNFVChyMCwgMTUpOyAgICAgICAgICAgICAgICAgIC8qIEFkZCAyNTAgbVYgb2YgaHlzdGVyZXNpcyB0byBTUE9SVCBpbnB1dCBwaW5zICovCi0jZW5kaWYKLQotCXAwLmggPSBoaShQTExfQ1RMKTsKLQlwMC5sID0gbG8oUExMX0NUTCk7ICAgICAgICAgICAgICAvKiBMb2FkIHRoZSBhZGRyZXNzICAgICAgICAgICAgICAgICovCi0JY2xpIHIyOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGlzYWJsZSBpbnRlcnJ1cHRzICAgICAgICAgICAgICAqLwotCXNzeW5jOwotCXdbcDBdID0gcjAubDsgICAgICAgICAgICAgICAgICAgIC8qIFNldCB0aGUgdmFsdWUgICAgICAgICAgICAgICAgICAgKi8KLQlpZGxlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBXYWl0IGZvciB0aGUgUExMIHRvIHN0YWJsaXplICAgICovCi0Jc3RpIHIyOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRW5hYmxlIGludGVycnVwdHMgICAgICAgICAgICAgICAqLwotCi0uTGNoZWNrX2FnYWluOgotCXAwLmggPSBoaShQTExfU1RBVCk7Ci0JcDAubCA9IGxvKFBMTF9TVEFUKTsKLQlSMCA9IFdbUDBdKFopOwotCUNDID0gQklUVFNUKFIwLDUpOwotCWlmICEgQ0MganVtcCAuTGNoZWNrX2FnYWluOwotCi0JLyogQ29uZmlndXJlIFNDTEsgJiBDQ0xLIERpdmlkZXJzICovCi0JcjAgPSAoQ09ORklHX0NDTEtfQUNUX0RJViB8IENPTkZJR19TQ0xLX0RJVik7Ci0JcDAuaCA9IGhpKFBMTF9ESVYpOwotCXAwLmwgPSBsbyhQTExfRElWKTsKLQl3W3AwXSA9IHIwLmw7Ci0Jc3N5bmM7Ci0KLQkvKiBkaXNhYmxlIHNlbGYgcmVmcmVzaCBieSBjbGVhcmluZyBTUlJFUSAqLwotCVAyLkggPSBoaShFQklVX1JTVENUTCk7Ci0JUDIuTCA9IGxvKEVCSVVfUlNUQ1RMKTsKLQlSMCA9IFtQMl07Ci0JQ0MgPSBCSVRUU1QoUjAsIDApOwotCWlmIENDIGp1bXAgLkxza2lwZGRycnN0OwotCUJJVFNFVCAoUjAsIDApOwotLkxza2lwZGRycnN0OgotCUJJVENMUiAoUjAsIDMpOwotCVtQMl0gPSBSMDsKLQlTU1lOQzsKLQotCXAwLmwgPSBsbyhFQklVX0REUkNUTDApOwotCXAwLmggPSBoaShFQklVX0REUkNUTDApOwotCXIwLmwgPSBsbyhtZW1fRERSQ1RMMCk7Ci0JcjAuaCA9IGhpKG1lbV9ERFJDVEwwKTsKLQlbcDBdID0gcjA7Ci0Jc3N5bmM7Ci0KLQlwMC5sID0gbG8oRUJJVV9ERFJDVEwxKTsKLQlwMC5oID0gaGkoRUJJVV9ERFJDVEwxKTsKLQlyMC5sID0gbG8obWVtX0REUkNUTDEpOwotCXIwLmggPSBoaShtZW1fRERSQ1RMMSk7Ci0JW3AwXSA9IHIwOwotCXNzeW5jOwotCi0JcDAubCA9IGxvKEVCSVVfRERSQ1RMMik7Ci0JcDAuaCA9IGhpKEVCSVVfRERSQ1RMMik7Ci0JcjAubCA9IGxvKG1lbV9ERFJDVEwyKTsKLQlyMC5oID0gaGkobWVtX0REUkNUTDIpOwotCVtwMF0gPSByMDsKLQlzc3luYzsKLQotCVJUUzsKLUVORFBST0MoX3N0YXJ0X2RtYV9jb2RlKQotI2VuZGlmIC8qIENPTkZJR19CRklOX0tFUk5FTF9DTE9DSyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2luY2x1ZGUvbWFjaC9hbm9tYWx5LmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaW5jbHVkZS9tYWNoL2Fub21hbHkuaAppbmRleCA4MTZiMDkyLi4zYjU0MzA5IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaW5jbHVkZS9tYWNoL2Fub21hbHkuaAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaW5jbHVkZS9tYWNoL2Fub21hbHkuaApAQCAtMTU3LDYgKzE1Nyw4IEBACiAjZGVmaW5lIEFOT01BTFlfMDUwMDA0MjkgKF9fU0lMSUNPTl9SRVZJU0lPTl9fIDwgMikKIC8qIFNvZnR3YXJlIFN5c3RlbSBSZXNldCBDb3JydXB0cyBQTExfTE9DS0NOVCBSZWdpc3RlciAqLwogI2RlZmluZSBBTk9NQUxZXzA1MDAwNDMwIChfX1NJTElDT05fUkVWSVNJT05fXyA+PSAyKQorLyogSUZMVVNIIEluc3RydWN0aW9uIGF0IEVuZCBvZiBIYXJkd2FyZSBMb29wIENhdXNlcyBJbmZpbml0ZSBTdGFsbCAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwNDQzICgxKQogCiAvKiBBbm9tYWxpZXMgdGhhdCBkb24ndCBleGlzdCBvbiB0aGlzIHByb2MgKi8KICNkZWZpbmUgQU5PTUFMWV8wNTAwMDEyNSAoMCkKQEAgLTE3Myw1ICsxNzUsOCBAQAogI2RlZmluZSBBTk9NQUxZXzA1MDAwMzExICgwKQogI2RlZmluZSBBTk9NQUxZXzA1MDAwMzIzICgwKQogI2RlZmluZSBBTk9NQUxZXzA1MDAwMzYzICgwKQorI2RlZmluZSBBTk9NQUxZXzA1MDAwNDEyICgwKQorI2RlZmluZSBBTk9NQUxZXzA1MDAwNDMyICgwKQorI2RlZmluZSBBTk9NQUxZXzA1MDAwNDM1ICgwKQogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbmNsdWRlL21hY2gvYmY1NDguaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbmNsdWRlL21hY2gvYmY1NDguaAppbmRleCA0OWY5YjQwLi5mMGU1Njk5IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaW5jbHVkZS9tYWNoL2JmNTQ4LmgKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2luY2x1ZGUvbWFjaC9iZjU0OC5oCkBAIC0xMjIsNyArMTIyLDcgQEAKICNlbmRpZgogCiAjaWZuZGVmIENQVQotI2Vycm9yIFVua25vd24gQ1BVIHR5cGUgLSBUaGlzIGtlcm5lbCBkb2Vzbid0IHNlZW0gdG8gYmUgY29uZmlndXJlZCBwcm9wZXJseQorI2Vycm9yICJVbmtub3duIENQVSB0eXBlIC0gVGhpcyBrZXJuZWwgZG9lc24ndCBzZWVtIHRvIGJlIGNvbmZpZ3VyZWQgcHJvcGVybHkiCiAjZW5kaWYKIAogI2VuZGlmCS8qIF9fTUFDSF9CRjQ4X0hfXyAgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbmNsdWRlL21hY2gvYmZpbl9zaXIuaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbmNsdWRlL21hY2gvYmZpbl9zaXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQxZjljZi4uMDAwMDAwMAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaW5jbHVkZS9tYWNoL2JmaW5fc2lyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotLyoKLSAqIEJsYWNrZmluIEluZnJhLXJlZCBEcml2ZXIKLSAqCi0gKiBDb3B5cmlnaHQgMjAwNi0yMDA4IEFuYWxvZyBEZXZpY2VzIEluYy4KLSAqCi0gKiBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCi0gKgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KLSNpbmNsdWRlIDxhc20vZG1hLmg+Ci0jaW5jbHVkZSA8YXNtL3BvcnRtdXguaD4KLQotI2RlZmluZSBTSVJfVUFSVF9HRVRfQ0hBUihwb3J0KSAgIGJmaW5fcmVhZDE2KChwb3J0KS0+bWVtYmFzZSArIE9GRlNFVF9SQlIpCi0jZGVmaW5lIFNJUl9VQVJUX0dFVF9ETEwocG9ydCkgICAgYmZpbl9yZWFkMTYoKHBvcnQpLT5tZW1iYXNlICsgT0ZGU0VUX0RMTCkKLSNkZWZpbmUgU0lSX1VBUlRfR0VUX0lFUihwb3J0KSAgICBiZmluX3JlYWQxNigocG9ydCktPm1lbWJhc2UgKyBPRkZTRVRfSUVSX1NFVCkKLSNkZWZpbmUgU0lSX1VBUlRfR0VUX0RMSChwb3J0KSAgICBiZmluX3JlYWQxNigocG9ydCktPm1lbWJhc2UgKyBPRkZTRVRfRExIKQotI2RlZmluZSBTSVJfVUFSVF9HRVRfTENSKHBvcnQpICAgIGJmaW5fcmVhZDE2KChwb3J0KS0+bWVtYmFzZSArIE9GRlNFVF9MQ1IpCi0jZGVmaW5lIFNJUl9VQVJUX0dFVF9MU1IocG9ydCkgICAgYmZpbl9yZWFkMTYoKHBvcnQpLT5tZW1iYXNlICsgT0ZGU0VUX0xTUikKLSNkZWZpbmUgU0lSX1VBUlRfR0VUX0dDVEwocG9ydCkgICBiZmluX3JlYWQxNigocG9ydCktPm1lbWJhc2UgKyBPRkZTRVRfR0NUTCkKLQotI2RlZmluZSBTSVJfVUFSVF9QVVRfQ0hBUihwb3J0LCB2KSBiZmluX3dyaXRlMTYoKChwb3J0KS0+bWVtYmFzZSArIE9GRlNFVF9USFIpLCB2KQotI2RlZmluZSBTSVJfVUFSVF9QVVRfRExMKHBvcnQsIHYpICBiZmluX3dyaXRlMTYoKChwb3J0KS0+bWVtYmFzZSArIE9GRlNFVF9ETEwpLCB2KQotI2RlZmluZSBTSVJfVUFSVF9TRVRfSUVSKHBvcnQsIHYpICBiZmluX3dyaXRlMTYoKChwb3J0KS0+bWVtYmFzZSArIE9GRlNFVF9JRVJfU0VUKSwgdikKLSNkZWZpbmUgU0lSX1VBUlRfQ0xFQVJfSUVSKHBvcnQsIHYpICBiZmluX3dyaXRlMTYoKChwb3J0KS0+bWVtYmFzZSArIE9GRlNFVF9JRVJfQ0xFQVIpLCB2KQotI2RlZmluZSBTSVJfVUFSVF9QVVRfRExIKHBvcnQsIHYpICBiZmluX3dyaXRlMTYoKChwb3J0KS0+bWVtYmFzZSArIE9GRlNFVF9ETEgpLCB2KQotI2RlZmluZSBTSVJfVUFSVF9QVVRfTFNSKHBvcnQsIHYpICBiZmluX3dyaXRlMTYoKChwb3J0KS0+bWVtYmFzZSArIE9GRlNFVF9MU1IpLCB2KQotI2RlZmluZSBTSVJfVUFSVF9QVVRfTENSKHBvcnQsIHYpICBiZmluX3dyaXRlMTYoKChwb3J0KS0+bWVtYmFzZSArIE9GRlNFVF9MQ1IpLCB2KQotI2RlZmluZSBTSVJfVUFSVF9DTEVBUl9MU1IocG9ydCkgIGJmaW5fd3JpdGUxNigoKHBvcnQpLT5tZW1iYXNlICsgT0ZGU0VUX0xTUiksIC0xKQotI2RlZmluZSBTSVJfVUFSVF9QVVRfR0NUTChwb3J0LCB2KSBiZmluX3dyaXRlMTYoKChwb3J0KS0+bWVtYmFzZSArIE9GRlNFVF9HQ1RMKSwgdikKLQotI2lmZGVmIENPTkZJR19TSVJfQkZJTl9ETUEKLXN0cnVjdCBkbWFfcnhfYnVmIHsKLQljaGFyICpidWY7Ci0JaW50IGhlYWQ7Ci0JaW50IHRhaWw7Ci0JfTsKLSNlbmRpZiAvKiBDT05GSUdfU0lSX0JGSU5fRE1BICovCi0KLXN0cnVjdCBiZmluX3Npcl9wb3J0IHsKLQl1bnNpZ25lZCBjaGFyIF9faW9tZW0gICAqbWVtYmFzZTsKLQl1bnNpZ25lZCBpbnQgICAgICAgICAgICBpcnE7Ci0JdW5zaWduZWQgaW50ICAgICAgICAgICAgbHNyOwotCXVuc2lnbmVkIGxvbmcgICAgICAgICAgIGNsazsKLQlzdHJ1Y3QgbmV0X2RldmljZSAgICAgICAqZGV2OwotI2lmZGVmIENPTkZJR19TSVJfQkZJTl9ETUEKLQlpbnQgICAgICAgICAgICAgICAgICAgICB0eF9kb25lOwotCXN0cnVjdCBkbWFfcnhfYnVmICAgICAgIHJ4X2RtYV9idWY7Ci0Jc3RydWN0IHRpbWVyX2xpc3QgICAgICAgcnhfZG1hX3RpbWVyOwotCWludCAgICAgICAgICAgICAgICAgICAgIHJ4X2RtYV9ucm93czsKLSNlbmRpZiAvKiBDT05GSUdfU0lSX0JGSU5fRE1BICovCi0JdW5zaWduZWQgaW50ICAgICAgICAgICAgdHhfZG1hX2NoYW5uZWw7Ci0JdW5zaWduZWQgaW50ICAgICAgICAgICAgcnhfZG1hX2NoYW5uZWw7Ci19OwotCi1zdHJ1Y3QgYmZpbl9zaXJfcG9ydCBzaXJfcG9ydHNbQkZJTl9VQVJUX05SX1BPUlRTXTsKLQotc3RydWN0IGJmaW5fc2lyX3BvcnRfcmVzIHsKLQl1bnNpZ25lZCBsb25nICAgYmFzZV9hZGRyOwotCWludCAgICAgICAgICAgICBpcnE7Ci0JdW5zaWduZWQgaW50ICAgIHJ4X2RtYV9jaGFubmVsOwotCXVuc2lnbmVkIGludCAgICB0eF9kbWFfY2hhbm5lbDsKLX07Ci0KLXN0cnVjdCBiZmluX3Npcl9wb3J0X3JlcyBiZmluX3Npcl9wb3J0X3Jlc291cmNlW10gPSB7Ci0jaWZkZWYgQ09ORklHX0JGSU5fU0lSMAotCXsKLQkweEZGQzAwNDAwLAotCUlSUV9VQVJUMF9SWCwKLQlDSF9VQVJUMF9SWCwKLQlDSF9VQVJUMF9UWCwKLQl9LAotI2VuZGlmCi0jaWZkZWYgQ09ORklHX0JGSU5fU0lSMQotCXsKLQkweEZGQzAyMDAwLAotCUlSUV9VQVJUMV9SWCwKLQlDSF9VQVJUMV9SWCwKLQlDSF9VQVJUMV9UWCwKLQl9LAotI2VuZGlmCi0jaWZkZWYgQ09ORklHX0JGSU5fU0lSMgotCXsKLQkweEZGQzAyMTAwLAotCUlSUV9VQVJUMl9SWCwKLQlDSF9VQVJUMl9SWCwKLQlDSF9VQVJUMl9UWCwKLQl9LAotI2VuZGlmCi0jaWZkZWYgQ09ORklHX0JGSU5fU0lSMwotCXsKLQkweEZGQzAzMTAwLAotCUlSUV9VQVJUM19SWCwKLQlDSF9VQVJUM19SWCwKLQlDSF9VQVJUM19UWCwKLQl9LAotI2VuZGlmCi19OwotCi1pbnQgbnJfc2lycyA9IEFSUkFZX1NJWkUoYmZpbl9zaXJfcG9ydF9yZXNvdXJjZSk7Ci0KLXN0cnVjdCBiZmluX3Npcl9zZWxmIHsKLQlzdHJ1Y3QgYmZpbl9zaXJfcG9ydCAgICAqc2lyX3BvcnQ7Ci0Jc3BpbmxvY2tfdCAgICAgICAgICAgICAgbG9jazsKLQl1bnNpZ25lZCBpbnQgICAgICAgICAgICBvcGVuOwotCWludCAgICAgICAgICAgICAgICAgICAgIHNwZWVkOwotCWludCAgICAgICAgICAgICAgICAgICAgIG5ld3NwZWVkOwotCi0Jc3RydWN0IHNrX2J1ZmYgICAgICAgICAgKnR4c2tiOwotCXN0cnVjdCBza19idWZmICAgICAgICAgICpyeHNrYjsKLQlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKLQlzdHJ1Y3QgZGV2aWNlICAgICAgICAgICAqZGV2OwotCXN0cnVjdCBpcmxhcF9jYiAgICAgICAgICppcmxhcDsKLQlzdHJ1Y3QgcW9zX2luZm8gICAgICAgICBxb3M7Ci0KLQlpb2J1ZmZfdCAgICAgICAgICAgICAgICB0eF9idWZmOwotCWlvYnVmZl90ICAgICAgICAgICAgICAgIHJ4X2J1ZmY7Ci0KLQlzdHJ1Y3Qgd29ya19zdHJ1Y3QgICAgICB3b3JrOwotCWludCAgICAgICAgICAgICAgICAgICAgIG10dDsKLX07Ci0KLSNkZWZpbmUgRFJJVkVSX05BTUUgImJmaW5fc2lyIgotCi1zdGF0aWMgaW50IGJmaW5fc2lyX2h3X2luaXQodm9pZCkKLXsKLQlpbnQgcmV0ID0gLUVOT0RFVjsKLSNpZmRlZiBDT05GSUdfQkZJTl9TSVIwCi0JcmV0ID0gcGVyaXBoZXJhbF9yZXF1ZXN0KFBfVUFSVDBfVFgsIERSSVZFUl9OQU1FKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCXJldCA9IHBlcmlwaGVyYWxfcmVxdWVzdChQX1VBUlQwX1JYLCBEUklWRVJfTkFNRSk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLSNlbmRpZgotCi0jaWZkZWYgQ09ORklHX0JGSU5fU0lSMQotCXJldCA9IHBlcmlwaGVyYWxfcmVxdWVzdChQX1VBUlQxX1RYLCBEUklWRVJfTkFNRSk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQlyZXQgPSBwZXJpcGhlcmFsX3JlcXVlc3QoUF9VQVJUMV9SWCwgRFJJVkVSX05BTUUpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19CRklOX1NJUjIKLQlyZXQgPSBwZXJpcGhlcmFsX3JlcXVlc3QoUF9VQVJUMl9UWCwgRFJJVkVSX05BTUUpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0JcmV0ID0gcGVyaXBoZXJhbF9yZXF1ZXN0KFBfVUFSVDJfUlgsIERSSVZFUl9OQU1FKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotI2VuZGlmCi0KLSNpZmRlZiBDT05GSUdfQkZJTl9TSVIzCi0JcmV0ID0gcGVyaXBoZXJhbF9yZXF1ZXN0KFBfVUFSVDNfVFgsIERSSVZFUl9OQU1FKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCXJldCA9IHBlcmlwaGVyYWxfcmVxdWVzdChQX1VBUlQzX1JYLCBEUklWRVJfTkFNRSk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLSNlbmRpZgotCXJldHVybiByZXQ7Ci19CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaW5jbHVkZS9tYWNoL2JsYWNrZmluLmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaW5jbHVkZS9tYWNoL2JsYWNrZmluLmgKaW5kZXggZDZlZTc0YS4uMGMwZTNlMiAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2luY2x1ZGUvbWFjaC9ibGFja2Zpbi5oCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbmNsdWRlL21hY2gvYmxhY2tmaW4uaApAQCAtMTExLDcgKzExMSw3IEBACiAKIC8qIFVBUlQgMCovCiAKLS8qIERNQSBDaGFubm5lbCAqLworLyogRE1BIENoYW5uZWwgKi8KICNkZWZpbmUgYmZpbl9yZWFkX0NIX1VBUlRfUlgoKQkJYmZpbl9yZWFkX0NIX1VBUlQxX1JYKCkKICNkZWZpbmUgYmZpbl93cml0ZV9DSF9VQVJUX1JYKHZhbCkJYmZpbl93cml0ZV9DSF9VQVJUMV9SWCh2YWwpCiAjZGVmaW5lIGJmaW5fcmVhZF9DSF9VQVJUX1RYKCkJCWJmaW5fcmVhZF9DSF9VQVJUMV9UWCgpCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaW5jbHVkZS9tYWNoL2NkZWZCRjU0eF9iYXNlLmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaW5jbHVkZS9tYWNoL2NkZWZCRjU0eF9iYXNlLmgKaW5kZXggNTdhYzhjYi4uNmU2MzZjNCAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2luY2x1ZGUvbWFjaC9jZGVmQkY1NHhfYmFzZS5oCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbmNsdWRlL21hY2gvY2RlZkJGNTR4X2Jhc2UuaApAQCAtMzQsNyArMzQsNiBAQAogI2luY2x1ZGUgPGFzbS9ibGFja2Zpbi5oPgogCiAjaW5jbHVkZSAiZGVmQkY1NHhfYmFzZS5oIgotI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KIAogLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KIC8qIFNZU1RFTSAmIE1NUiBBRERSRVNTIERFRklOSVRJT05TIENPTU1PTiBUTyBBTEwgQURTUC1CRjU0eCAgICAqLwpAQCAtNDMsNjMgKzQyLDkgQEAKIC8qIFBMTCBSZWdpc3RlcnMgKi8KIAogI2RlZmluZSBiZmluX3JlYWRfUExMX0NUTCgpCQliZmluX3JlYWQxNihQTExfQ1RMKQotLyogV3JpdGluZyB0byBQTExfQ1RMIGluaXRpYXRlcyBhIFBMTCByZWxvY2sgc2VxdWVuY2UuICovCi1zdGF0aWMgX19pbmxpbmVfXyB2b2lkIGJmaW5fd3JpdGVfUExMX0NUTCh1bnNpZ25lZCBpbnQgdmFsKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIGl3cjAsIGl3cjEsIGl3cjI7Ci0KLQlpZiAodmFsID09IGJmaW5fcmVhZF9QTExfQ1RMKCkpCi0JCXJldHVybjsKLQotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQkvKiBFbmFibGUgdGhlIFBMTCBXYWtldXAgYml0IGluIFNJQyBJV1IgKi8KLQlpd3IwID0gYmZpbl9yZWFkMzIoU0lDX0lXUjApOwotCWl3cjEgPSBiZmluX3JlYWQzMihTSUNfSVdSMSk7Ci0JaXdyMiA9IGJmaW5fcmVhZDMyKFNJQ19JV1IyKTsKLQkvKiBPbmx5IGFsbG93IFBQTCBXYWtldXApICovCi0JYmZpbl93cml0ZTMyKFNJQ19JV1IwLCBJV1JfRU5BQkxFKDApKTsKLQliZmluX3dyaXRlMzIoU0lDX0lXUjEsIDApOwotCWJmaW5fd3JpdGUzMihTSUNfSVdSMiwgMCk7Ci0KLQliZmluX3dyaXRlMTYoUExMX0NUTCwgdmFsKTsKLQlTU1lOQygpOwotCWFzbSgiSURMRTsiKTsKLQotCWJmaW5fd3JpdGUzMihTSUNfSVdSMCwgaXdyMCk7Ci0JYmZpbl93cml0ZTMyKFNJQ19JV1IxLCBpd3IxKTsKLQliZmluX3dyaXRlMzIoU0lDX0lXUjIsIGl3cjIpOwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLX0KICNkZWZpbmUgYmZpbl9yZWFkX1BMTF9ESVYoKQkJYmZpbl9yZWFkMTYoUExMX0RJVikKICNkZWZpbmUgYmZpbl93cml0ZV9QTExfRElWKHZhbCkJCWJmaW5fd3JpdGUxNihQTExfRElWLCB2YWwpCiAjZGVmaW5lIGJmaW5fcmVhZF9WUl9DVEwoKQkJYmZpbl9yZWFkMTYoVlJfQ1RMKQotLyogV3JpdGluZyB0byBWUl9DVEwgaW5pdGlhdGVzIGEgUExMIHJlbG9jayBzZXF1ZW5jZS4gKi8KLXN0YXRpYyBfX2lubGluZV9fIHZvaWQgYmZpbl93cml0ZV9WUl9DVEwodW5zaWduZWQgaW50IHZhbCkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzLCBpd3IwLCBpd3IxLCBpd3IyOwotCi0JaWYgKHZhbCA9PSBiZmluX3JlYWRfVlJfQ1RMKCkpCi0JCXJldHVybjsKLQotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQkvKiBFbmFibGUgdGhlIFBMTCBXYWtldXAgYml0IGluIFNJQyBJV1IgKi8KLQlpd3IwID0gYmZpbl9yZWFkMzIoU0lDX0lXUjApOwotCWl3cjEgPSBiZmluX3JlYWQzMihTSUNfSVdSMSk7Ci0JaXdyMiA9IGJmaW5fcmVhZDMyKFNJQ19JV1IyKTsKLQkvKiBPbmx5IGFsbG93IFBQTCBXYWtldXApICovCi0JYmZpbl93cml0ZTMyKFNJQ19JV1IwLCBJV1JfRU5BQkxFKDApKTsKLQliZmluX3dyaXRlMzIoU0lDX0lXUjEsIDApOwotCWJmaW5fd3JpdGUzMihTSUNfSVdSMiwgMCk7Ci0KLQliZmluX3dyaXRlMTYoVlJfQ1RMLCB2YWwpOwotCVNTWU5DKCk7Ci0JYXNtKCJJRExFOyIpOwotCi0JYmZpbl93cml0ZTMyKFNJQ19JV1IwLCBpd3IwKTsKLQliZmluX3dyaXRlMzIoU0lDX0lXUjEsIGl3cjEpOwotCWJmaW5fd3JpdGUzMihTSUNfSVdSMiwgaXdyMik7Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotfQogI2RlZmluZSBiZmluX3JlYWRfUExMX1NUQVQoKQkJYmZpbl9yZWFkMTYoUExMX1NUQVQpCiAjZGVmaW5lIGJmaW5fd3JpdGVfUExMX1NUQVQodmFsKQliZmluX3dyaXRlMTYoUExMX1NUQVQsIHZhbCkKICNkZWZpbmUgYmZpbl9yZWFkX1BMTF9MT0NLQ05UKCkJCWJmaW5fcmVhZDE2KFBMTF9MT0NLQ05UKQpAQCAtMjc0Niw1ICsyNjkxLDY0IEBACiAjZGVmaW5lIGJmaW5fcmVhZF9QSU5UM19JUlEJCWJmaW5fcmVhZF9QSU5UM19SRVFVRVNUCiAjZGVmaW5lIGJmaW5fd3JpdGVfUElOVDNfSVJRCQliZmluX3dyaXRlX1BJTlQzX1JFUVVFU1QKIAorLyogVGhlc2UgbmVlZCB0byBiZSBsYXN0IGR1ZSB0byB0aGUgY2RlZi9saW51eCBpbnRlci1kZXBlbmRlbmNpZXMgKi8KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisKKy8qIFdyaXRpbmcgdG8gUExMX0NUTCBpbml0aWF0ZXMgYSBQTEwgcmVsb2NrIHNlcXVlbmNlLiAqLworc3RhdGljIF9faW5saW5lX18gdm9pZCBiZmluX3dyaXRlX1BMTF9DVEwodW5zaWduZWQgaW50IHZhbCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzLCBpd3IwLCBpd3IxLCBpd3IyOworCisJaWYgKHZhbCA9PSBiZmluX3JlYWRfUExMX0NUTCgpKQorCQlyZXR1cm47CisKKwlsb2NhbF9pcnFfc2F2ZV9odyhmbGFncyk7CisJLyogRW5hYmxlIHRoZSBQTEwgV2FrZXVwIGJpdCBpbiBTSUMgSVdSICovCisJaXdyMCA9IGJmaW5fcmVhZDMyKFNJQ19JV1IwKTsKKwlpd3IxID0gYmZpbl9yZWFkMzIoU0lDX0lXUjEpOworCWl3cjIgPSBiZmluX3JlYWQzMihTSUNfSVdSMik7CisJLyogT25seSBhbGxvdyBQUEwgV2FrZXVwKSAqLworCWJmaW5fd3JpdGUzMihTSUNfSVdSMCwgSVdSX0VOQUJMRSgwKSk7CisJYmZpbl93cml0ZTMyKFNJQ19JV1IxLCAwKTsKKwliZmluX3dyaXRlMzIoU0lDX0lXUjIsIDApOworCisJYmZpbl93cml0ZTE2KFBMTF9DVEwsIHZhbCk7CisJU1NZTkMoKTsKKwlhc20oIklETEU7Iik7CisKKwliZmluX3dyaXRlMzIoU0lDX0lXUjAsIGl3cjApOworCWJmaW5fd3JpdGUzMihTSUNfSVdSMSwgaXdyMSk7CisJYmZpbl93cml0ZTMyKFNJQ19JV1IyLCBpd3IyKTsKKwlsb2NhbF9pcnFfcmVzdG9yZV9odyhmbGFncyk7Cit9CisKKy8qIFdyaXRpbmcgdG8gVlJfQ1RMIGluaXRpYXRlcyBhIFBMTCByZWxvY2sgc2VxdWVuY2UuICovCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIGJmaW5fd3JpdGVfVlJfQ1RMKHVuc2lnbmVkIGludCB2YWwpCit7CisJdW5zaWduZWQgbG9uZyBmbGFncywgaXdyMCwgaXdyMSwgaXdyMjsKKworCWlmICh2YWwgPT0gYmZpbl9yZWFkX1ZSX0NUTCgpKQorCQlyZXR1cm47CisKKwlsb2NhbF9pcnFfc2F2ZV9odyhmbGFncyk7CisJLyogRW5hYmxlIHRoZSBQTEwgV2FrZXVwIGJpdCBpbiBTSUMgSVdSICovCisJaXdyMCA9IGJmaW5fcmVhZDMyKFNJQ19JV1IwKTsKKwlpd3IxID0gYmZpbl9yZWFkMzIoU0lDX0lXUjEpOworCWl3cjIgPSBiZmluX3JlYWQzMihTSUNfSVdSMik7CisJLyogT25seSBhbGxvdyBQUEwgV2FrZXVwKSAqLworCWJmaW5fd3JpdGUzMihTSUNfSVdSMCwgSVdSX0VOQUJMRSgwKSk7CisJYmZpbl93cml0ZTMyKFNJQ19JV1IxLCAwKTsKKwliZmluX3dyaXRlMzIoU0lDX0lXUjIsIDApOworCisJYmZpbl93cml0ZTE2KFZSX0NUTCwgdmFsKTsKKwlTU1lOQygpOworCWFzbSgiSURMRTsiKTsKKworCWJmaW5fd3JpdGUzMihTSUNfSVdSMCwgaXdyMCk7CisJYmZpbl93cml0ZTMyKFNJQ19JV1IxLCBpd3IxKTsKKwliZmluX3dyaXRlMzIoU0lDX0lXUjIsIGl3cjIpOworCWxvY2FsX2lycV9yZXN0b3JlX2h3KGZsYWdzKTsKK30KKwogI2VuZGlmIC8qIF9DREVGX0JGNTRYX0ggKi8KIApkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2luY2x1ZGUvbWFjaC9kbWEuaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbmNsdWRlL21hY2gvZG1hLmgKaW5kZXggMzZhMmVmNy4uYTMwZDI0MiAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2luY2x1ZGUvbWFjaC9kbWEuaAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaW5jbHVkZS9tYWNoL2RtYS5oCkBAIC0xLDMyICsxLDggQEAKLS8qCi0gKiBmaWxlOiAgICAgICAgIGluY2x1ZGUvYXNtLWJsYWNrZmluL21hY2gtYmY1NDgvZG1hLmgKLSAqIGJhc2VkIG9uOgotICogYXV0aG9yOgorLyogbWFjaC9kbWEuaCAtIGFyY2gtc3BlY2lmaWMgRE1BIGRlZmluZXMKICAqCi0gKiBjcmVhdGVkOgotICogZGVzY3JpcHRpb246Ci0gKglzeXN0ZW0gbW1yIHJlZ2lzdGVyIG1hcAotICogcmV2OgorICogQ29weXJpZ2h0IDIwMDQtMjAwOCBBbmFsb2cgRGV2aWNlcyBJbmMuCiAgKgotICogbW9kaWZpZWQ6Ci0gKgotICoKLSAqIGJ1Z3M6ICAgICAgICAgZW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCi0gKgotICogdGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgZ251IGdlbmVyYWwgcHVibGljIGxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgZnJlZSBzb2Z0d2FyZSBmb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gKiBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiB0aGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCB3aXRob3V0IGFueSB3YXJyYW50eTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBtZXJjaGFudGFiaWxpdHkgb3IgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuICBzZWUgdGhlCi0gKiBnbnUgZ2VuZXJhbCBwdWJsaWMgbGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIHlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIGdudSBnZW5lcmFsIHB1YmxpYyBsaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIGNvcHlpbmcuCi0gKiBpZiBub3QsIHdyaXRlIHRvIHRoZSBmcmVlIHNvZnR3YXJlIGZvdW5kYXRpb24sCi0gKiA1OSB0ZW1wbGUgcGxhY2UgLSBzdWl0ZSAzMzAsIGJvc3RvbiwgbWEgMDIxMTEtMTMwNywgdXNhLgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgogICovCiAKICNpZm5kZWYgX01BQ0hfRE1BX0hfCkBAIC03MSw2ICs0Nyw2IEBACiAjZGVmaW5lIENIX01FTV9TVFJFQU0zX0RFU1QJMzAKICNkZWZpbmUgQ0hfTUVNX1NUUkVBTTNfU1JDCTMxCiAKLSNkZWZpbmUgTUFYX0JMQUNLRklOX0RNQV9DSEFOTkVMIDMyCisjZGVmaW5lIE1BWF9ETUFfQ0hBTk5FTFMgMzIKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaW5jbHVkZS9tYWNoL2lycS5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2luY2x1ZGUvbWFjaC9pcnEuaAppbmRleCBhZDM4MGQxLi42MDI5OWE3IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaW5jbHVkZS9tYWNoL2lycS5oCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbmNsdWRlL21hY2gvaXJxLmgKQEAgLTE1OCw3ICsxNTgsNyBAQAogI2RlZmluZSBJUlFfUElOVDIJCUJGSU5fSVJRKDk0KQkvKiBQSU5UMiBJbnRlcnJ1cHQgKi8KICNkZWZpbmUgSVJRX1BJTlQzCQlCRklOX0lSUSg5NSkJLyogUElOVDMgSW50ZXJydXB0ICovCiAKLSNkZWZpbmUgU1lTX0lSUVMgICAgICAgIAlJUlFfUElOVDMKKyNkZWZpbmUgU1lTX0lSUVMJCUlSUV9QSU5UMwogCiAjZGVmaW5lIEJGSU5fUEFfSVJRKHgpCQkoKHgpICsgU1lTX0lSUVMgKyAxKQogI2RlZmluZSBJUlFfUEEwCQkJQkZJTl9QQV9JUlEoMCkKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbmNsdWRlL21hY2gvbWVtX2luaXQuaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbmNsdWRlL21hY2gvbWVtX2luaXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWIwYjg2My4uMDAwMDAwMAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaW5jbHVkZS9tYWNoL21lbV9pbml0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNTUgKzAsMCBAQAotLyoKLSAqIEZpbGU6ICAgICAgICAgaW5jbHVkZS9hc20tYmxhY2tmaW4vbWFjaC1iZjU0OC9tZW1faW5pdC5oCi0gKiBCYXNlZCBvbjoKLSAqIEF1dGhvcjoKLSAqCi0gKiBDcmVhdGVkOgotICogRGVzY3JpcHRpb246Ci0gKgotICogUmV2OgotICoKLSAqIE1vZGlmaWVkOgotICogICAgICAgICAgICAgICBDb3B5cmlnaHQgMjAwNC0yMDA2IEFuYWxvZyBEZXZpY2VzIEluYy4KLSAqCi0gKiBCdWdzOiAgICAgICAgIEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLwotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICogYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLgotICogSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAqLwotI2RlZmluZSBNSU5fRERSX1NDTEsoeCkJKHgqKENPTkZJR19TQ0xLX0haLzEwMDAvMTAwMCkvMTAwMCArIDEpCi0jZGVmaW5lIE1BWF9ERFJfU0NMSyh4KQkoeCooQ09ORklHX1NDTEtfSFovMTAwMC8xMDAwKS8xMDAwKQotI2RlZmluZSBERFJfQ0xLX0haKHgpCSgxMDAwKjEwMDAqMTAwMC94KQotCi0jaWYgKENPTkZJR19NRU1fTVQ0NlYzMk0xNl82VCkKLSNkZWZpbmUgRERSX1NJWkUJREVWU1pfNTEyCi0jZGVmaW5lIEREUl9XSURUSAlERVZXRF8xNgotI2RlZmluZSBERFJfTUFYX3RDSwkxMwotCi0jZGVmaW5lIEREUl90UkMJCUREUl9UUkMoTUlOX0REUl9TQ0xLKDYwKSkKLSNkZWZpbmUgRERSX3RSQVMJRERSX1RSQVMoTUlOX0REUl9TQ0xLKDQyKSkKLSNkZWZpbmUgRERSX3RSUAkJRERSX1RSUChNSU5fRERSX1NDTEsoMTUpKQotI2RlZmluZSBERFJfdFJGQwlERFJfVFJGQyhNSU5fRERSX1NDTEsoNzIpKQotI2RlZmluZSBERFJfdFJFRkkJRERSX1RSRUZJKE1BWF9ERFJfU0NMSyg3ODAwKSkKLQotI2RlZmluZSBERFJfdFJDRAlERFJfVFJDRChNSU5fRERSX1NDTEsoMTUpKQotI2RlZmluZSBERFJfdFdUUglERFJfVFdUUigxKQotI2RlZmluZSBERFJfdE1SRAlERFJfVE1SRChNSU5fRERSX1NDTEsoMTIpKQotI2RlZmluZSBERFJfdFdSCQlERFJfVFdSKE1JTl9ERFJfU0NMSygxNSkpCi0jZW5kaWYKLQotI2lmIChDT05GSUdfTUVNX01UNDZWMzJNMTZfNUIpCi0jZGVmaW5lIEREUl9TSVpFCURFVlNaXzUxMgotI2RlZmluZSBERFJfV0lEVEgJREVWV0RfMTYKLSNkZWZpbmUgRERSX01BWF90Q0sJMTMKLQotI2RlZmluZSBERFJfdFJDCQlERFJfVFJDKE1JTl9ERFJfU0NMSyg1NSkpCi0jZGVmaW5lIEREUl90UkFTCUREUl9UUkFTKE1JTl9ERFJfU0NMSyg0MCkpCi0jZGVmaW5lIEREUl90UlAJCUREUl9UUlAoTUlOX0REUl9TQ0xLKDE1KSkKLSNkZWZpbmUgRERSX3RSRkMJRERSX1RSRkMoTUlOX0REUl9TQ0xLKDcwKSkKLSNkZWZpbmUgRERSX3RSRUZJCUREUl9UUkVGSShNQVhfRERSX1NDTEsoNzgwMCkpCi0KLSNkZWZpbmUgRERSX3RSQ0QJRERSX1RSQ0QoTUlOX0REUl9TQ0xLKDE1KSkKLSNkZWZpbmUgRERSX3RXVFIJRERSX1RXVFIoMikKLSNkZWZpbmUgRERSX3RNUkQJRERSX1RNUkQoTUlOX0REUl9TQ0xLKDEwKSkKLSNkZWZpbmUgRERSX3RXUgkJRERSX1RXUihNSU5fRERSX1NDTEsoMTUpKQotI2VuZGlmCi0KLSNpZiAoQ09ORklHX01FTV9HRU5FUklDX0JPQVJEKQotI2RlZmluZSBERFJfU0laRQlERVZTWl81MTIKLSNkZWZpbmUgRERSX1dJRFRICURFVldEXzE2Ci0jZGVmaW5lIEREUl9NQVhfdENLCTEzCi0KLSNkZWZpbmUgRERSX3RSQ0QJRERSX1RSQ0QoMykKLSNkZWZpbmUgRERSX3RXVFIJRERSX1RXVFIoMikKLSNkZWZpbmUgRERSX3RXUgkJRERSX1RXUigyKQotI2RlZmluZSBERFJfdE1SRAlERFJfVE1SRCgyKQotI2RlZmluZSBERFJfdFJQCQlERFJfVFJQKDMpCi0jZGVmaW5lIEREUl90UkFTCUREUl9UUkFTKDcpCi0jZGVmaW5lIEREUl90UkMJCUREUl9UUkMoMTApCi0jZGVmaW5lIEREUl90UkZDCUREUl9UUkZDKDEyKQotI2RlZmluZSBERFJfdFJFRkkJRERSX1RSRUZJKDEyODgpCi0jZW5kaWYKLQotI2lmIChDT05GSUdfU0NMS19IWiA8IEREUl9DTEtfSFooRERSX01BWF90Q0spKQotIyBlcnJvciAiQ09ORklHX1NDTEtfSFogaXMgdG9vIHNtYWxsICg8RERSX0NMS19IWihERFJfTUFYX3RDSykgSHopLiIKLSNlbGlmKENPTkZJR19TQ0xLX0haIDw9IDEzMzMzMzMzMykKLSMgZGVmaW5lCUREUl9DTAkJQ0xfMgotI2Vsc2UKLSMgZXJyb3IgIkNPTkZJR19TQ0xLX0haIGlzIHRvbyBsYXJnZSAoPjEzMzMzMzMzMyBIeikuIgotI2VuZGlmCi0KLQotI2RlZmluZSBtZW1fRERSQ1RMMAkoRERSX3RSUCB8IEREUl90UkFTIHwgRERSX3RSQyB8IEREUl90UkZDIHwgRERSX3RSRUZJKQotI2RlZmluZSBtZW1fRERSQ1RMMQkoRERSX0RBVFdJRFRIIHwgRVhUQkFOS18xIHwgRERSX1NJWkUgfCBERFJfV0lEVEggfCBERFJfdFdUUiBcCi0JCQl8IEREUl90TVJEIHwgRERSX3RXUiB8IEREUl90UkNEKQotI2RlZmluZSBtZW1fRERSQ1RMMglERFJfQ0wKLQotCi0jaWYgZGVmaW5lZCBDT05GSUdfQ0xLSU5fSEFMRgotI2RlZmluZSBDTEtJTl9IQUxGICAgICAgIDEKLSNlbHNlCi0jZGVmaW5lIENMS0lOX0hBTEYgICAgICAgMAotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIENPTkZJR19QTExfQllQQVNTCi0jZGVmaW5lIFBMTF9CWVBBU1MgICAgICAxCi0jZWxzZQotI2RlZmluZSBQTExfQllQQVNTICAgICAgIDAKLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqQ3VycmVudGx5IE5vdCBCZWluZyBVc2VkICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVExfV0FUICAoKENPTkZJR19GTEFTSF9TUEVFRF9CV0FUICogNCkgLyAoNDAwMDAwMDAwMCAvIENPTkZJR19TQ0xLX0haKSkgKyAxCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMX1JBVCAgKChDT05GSUdfRkxBU0hfU1BFRURfQlJBVCAqIDQpIC8gKDQwMDAwMDAwMDAgLyBDT05GSUdfU0NMS19IWikpICsgMQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTF9IVCAgICgoQ09ORklHX0ZMQVNIX1NQRUVEX0JIVCAgKiA0KSAvICg0MDAwMDAwMDAwIC8gQ09ORklHX1NDTEtfSFopKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTF9TVCAgICgoQ09ORklHX0ZMQVNIX1NQRUVEX0JTVCAgKiA0KSAvICg0MDAwMDAwMDAwIC8gQ09ORklHX1NDTEtfSFopKSArIDEKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVExfVFQgICAoKENPTkZJR19GTEFTSF9TUEVFRF9CVFQgICogNCkgLyAoNDAwMDAwMDAwMCAvIENPTkZJR19TQ0xLX0haKSkgKyAxCi0KLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfVFQgPiAzKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfVFQgICBCMFRUXzQKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9UVCA9PSAzKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfVFQgICBCMFRUXzMKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9UVCA9PSAyKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfVFQgICBCMFRUXzIKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9UVCA8IDIpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9UVCAgIEIwVFRfMQotI2VuZGlmCi0KLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfU1QgPiAzKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfU1QgICBCMFNUXzQKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9TVCA9PSAzKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfU1QgICBCMFNUXzMKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9TVCA9PSAyKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfU1QgICBCMFNUXzIKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9TVCA8IDIpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9TVCAgIEIwU1RfMQotI2VuZGlmCi0KLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfSFQgPiAyKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfSFQgICBCMEhUXzMKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9IVCA9PSAyKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfSFQgICBCMEhUXzIKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9IVCA9PSAxKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfSFQgICBCMEhUXzEKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9IVCA9PSAwICYmIENPTkZJR19GTEFTSF9TUEVFRF9CSFQgPT0gMCkKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX0hUICAgQjBIVF8wCi0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfSFQgPT0gMCAmJiBDT05GSUdfRkxBU0hfU1BFRURfQkhUICE9IDApCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9IVCAgIEIwSFRfMQotI2VuZGlmCi0KLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfV0FUID4gMTQpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9XQVQgIEIwV0FUXzE1Ci0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfV0FUID09IDE0KQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfV0FUICBCMFdBVF8xNAotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1dBVCA9PSAxMykKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1dBVCAgQjBXQVRfMTMKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9XQVQgPT0gMTIpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9XQVQgIEIwV0FUXzEyCi0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfV0FUID09IDExKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfV0FUICBCMFdBVF8xMQotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1dBVCA9PSAxMCkKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1dBVCAgQjBXQVRfMTAKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9XQVQgPT0gOSkKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1dBVCAgQjBXQVRfOQotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1dBVCA9PSA4KQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfV0FUICBCMFdBVF84Ci0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfV0FUID09IDcpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9XQVQgIEIwV0FUXzcKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9XQVQgPT0gNikKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1dBVCAgQjBXQVRfNgotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1dBVCA9PSA1KQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfV0FUICBCMFdBVF81Ci0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfV0FUID09IDQpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9XQVQgIEIwV0FUXzQKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9XQVQgPT0gMykKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1dBVCAgQjBXQVRfMwotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1dBVCA9PSAyKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfV0FUICBCMFdBVF8yCi0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfV0FUID09IDEpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9XQVQgIEIwV0FUXzEKLSNlbmRpZgotCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1JBVCA+IDE0KQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfUkFUICBCMFJBVF8xNQotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1JBVCA9PSAxNCkKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1JBVCAgQjBSQVRfMTQKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9SQVQgPT0gMTMpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9SQVQgIEIwUkFUXzEzCi0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfUkFUID09IDEyKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfUkFUICBCMFJBVF8xMgotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1JBVCA9PSAxMSkKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1JBVCAgQjBSQVRfMTEKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9SQVQgPT0gMTApCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9SQVQgIEIwUkFUXzEwCi0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfUkFUID09IDkpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9SQVQgIEIwUkFUXzkKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9SQVQgPT0gOCkKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1JBVCAgQjBSQVRfOAotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1JBVCA9PSA3KQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfUkFUICBCMFJBVF83Ci0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfUkFUID09IDYpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9SQVQgIEIwUkFUXzYKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9SQVQgPT0gNSkKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1JBVCAgQjBSQVRfNQotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1JBVCA9PSA0KQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfUkFUICBCMFJBVF80Ci0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfUkFUID09IDMpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9SQVQgIEIwUkFUXzMKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9SQVQgPT0gMikKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1JBVCAgQjBSQVRfMgotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1JBVCA9PSAxKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfUkFUICBCMFJBVF8xCi0jZW5kaWYKLQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDAgIFwKLQkoZmxhc2hfRUJJVV9BTUJDVEwwX1dBVCB8IGZsYXNoX0VCSVVfQU1CQ1RMMF9SQVQgfCBmbGFzaF9FQklVX0FNQkNUTDBfSFQgfCBcCi0JIGZsYXNoX0VCSVVfQU1CQ1RMMF9TVCB8IGZsYXNoX0VCSVVfQU1CQ1RMMF9UVCB8IENPTkZJR19GTEFTSF9TUEVFRF9SRFlFTikKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbmNsdWRlL21hY2gvbWVtX21hcC5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2luY2x1ZGUvbWFjaC9tZW1fbWFwLmgKaW5kZXggYTIyMjg0Mi4uNzBiOWMxMSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2luY2x1ZGUvbWFjaC9tZW1fbWFwLmgKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2luY2x1ZGUvbWFjaC9tZW1fbWFwLmgKQEAgLTEwOCw0ICsxMDgsMTAgQEAKICNkZWZpbmUgTDFfU0NSQVRDSF9TVEFSVAkweEZGQjAwMDAwCiAjZGVmaW5lIEwxX1NDUkFUQ0hfTEVOR1RICTB4MTAwMAogCisjZGVmaW5lIEdFVF9QREFfU0FGRShwcmVnKQkJXAorCXByZWcubCA9IF9jcHVfcGRhOwkJXAorCXByZWcuaCA9IF9jcHVfcGRhOworCisjZGVmaW5lIEdFVF9QREEocHJlZywgZHJlZykJR0VUX1BEQV9TQUZFKHByZWcpCisKICNlbmRpZi8qIF9NRU1fTUFQXzU0OF9IXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL0tjb25maWcgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvS2NvbmZpZwppbmRleCAzZjQ4OTU0Li42MzhlYzM4IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvS2NvbmZpZworKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvS2NvbmZpZwpAQCAtNCw5ICs0LDkgQEAKIAogbWVudSAiQkY1NjEgU3BlY2lmaWMgQ29uZmlndXJhdGlvbiIKIAotY29tbWVudCAiQ29yZSBCIFN1cHBvcnQiCitpZiAoIVNNUCkKIAotbWVudSAiQ29yZSBCIFN1cHBvcnQiCitjb21tZW50ICJDb3JlIEIgU3VwcG9ydCIKIAogY29uZmlnIEJGNTYxX0NPUkVCCiAJYm9vbCAiRW5hYmxlIENvcmUgQiBzdXBwb3J0IgpAQCAtMjUsNyArMjUsNyBAQAogCSAgMCBpcyBzZXQsIGFuZCB3aWxsIHJlc2V0IFBDIHRvIDB4ZmY2MDAwMDAgd2hlbgogCSAgQ09SRUJfU1JBTV9JTklUIGlzIGNsZWFyZWQuCiAKLWVuZG1lbnUKK2VuZGlmCiAKIGNvbW1lbnQgIkludGVycnVwdCBQcmlvcml0eSBBc3NpZ25tZW50IgogCkBAIC0xMzgsNyArMTM4LDcgQEAKIAlkZWZhdWx0IDkKIGNvbmZpZyBJUlFfVElNRVIwCiAJaW50ICJUSU1FUiAwICBJbnRlcnJ1cHQiCi0JZGVmYXVsdCAxMAorCWRlZmF1bHQgOAogY29uZmlnIElSUV9USU1FUjEKIAlpbnQgIlRJTUVSIDEgIEludGVycnVwdCIKIAlkZWZhdWx0IDEwCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvTWFrZWZpbGUgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvTWFrZWZpbGUKaW5kZXggZjM5MjM1YS4uNTllMThhZiAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL01ha2VmaWxlCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9NYWtlZmlsZQpAQCAtMiw4ICsyLDcgQEAKICMgYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL01ha2VmaWxlCiAjCiAKLWV4dHJhLXkgOj0gaGVhZC5vCi0KIG9iai15IDo9IGludHMtcHJpb3JpdHkubyBkbWEubwogCiBvYmotJChDT05GSUdfQkY1NjFfQ09SRUIpICs9IGNvcmViLm8KK29iai0kKENPTkZJR19TTVApICArPSBzbXAubyBzZWNvbmRhcnkubyBhdG9taWMubwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2F0b21pYy5TIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2F0b21pYy5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0MzliYzYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvYXRvbWljLlMKQEAgLTAsMCArMSw5MTkgQEAKKy8qCisgKiBGaWxlOiAgICAgICAgIGFyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9hdG9taWMuUworICogQXV0aG9yOiAgICAgICBQaGlsaXBwZSBHZXJ1bSA8cnBtQHhlbm9tYWkub3JnPgorICoKKyAqICAgICAgICAgICAgICAgQ29weXJpZ2h0IDIwMDcgQW5hbG9nIERldmljZXMgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIHRoZSBmaWxlIENPUFlJTkcsIG9yIHdyaXRlCisgKiB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqLworCisjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgorI2luY2x1ZGUgPGFzbS9ibGFja2Zpbi5oPgorI2luY2x1ZGUgPGFzbS9jYWNoZS5oPgorI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgorI2luY2x1ZGUgPGFzbS9yd2xvY2suaD4KKyNpbmNsdWRlIDxhc20vY3BsYi5oPgorCisudGV4dAorCisubWFjcm8gY29yZXNsb3RfbG9hZGFkZHIgcmVnOnJlcQorCVxyZWdcKCkubCA9IF9jb3JlbG9jazsKKwlccmVnXCgpLmggPSBfY29yZWxvY2s7CisuZW5kbQorCisvKgorICogcjAgPSBhZGRyZXNzIG9mIGF0b21pYyBkYXRhIHRvIGZsdXNoIGFuZCBpbnZhbGlkYXRlICgzMmJpdCkuCisgKgorICogQ2xlYXIgaW50ZXJydXB0cyBhbmQgcmV0dXJuIHRoZSBvbGQgbWFzay4KKyAqIFdlIGFzc3VtZSB0aGF0IG5vIGF0b21pYyBkYXRhIGNhbiBzcGFuIGNhY2hlbGluZXMuCisgKgorICogQ2xvYmJlcnM6IHIyOjAsIHAwCisgKi8KK0VOVFJZKF9nZXRfY29yZV9sb2NrKQorCXIxID0gLUwxX0NBQ0hFX0JZVEVTOworCXIxID0gcjAgJiByMTsKKwljbGkgcjA7CisJY29yZXNsb3RfbG9hZGFkZHIgcDA7CisuTHJldHJ5X2NvcmVsb2NrOgorCXRlc3RzZXQgKHAwKTsKKwlpZiBjYyBqdW1wIC5MZG9uZV9jb3JlbG9jazsKKwlTU1lOQyhyMik7CisJanVtcCAuTHJldHJ5X2NvcmVsb2NrCisuTGRvbmVfY29yZWxvY2s6CisJcDAgPSByMTsKKwlDU1lOQyhyMik7CisJZmx1c2hpbnZbcDBdOworCVNTWU5DKHIyKTsKKwlydHM7CitFTkRQUk9DKF9nZXRfY29yZV9sb2NrKQorCisvKgorICogcjAgPSBhZGRyZXNzIG9mIGF0b21pYyBkYXRhIGluIHVuY2FjaGVhYmxlIG1lbW9yeSByZWdpb24gKDMyYml0KS4KKyAqCisgKiBDbGVhciBpbnRlcnJ1cHRzIGFuZCByZXR1cm4gdGhlIG9sZCBtYXNrLgorICoKKyAqIENsb2JiZXJzOiByMCwgcDAKKyAqLworRU5UUlkoX2dldF9jb3JlX2xvY2tfbm9mbHVzaCkKKwljbGkgcjA7CisJY29yZXNsb3RfbG9hZGFkZHIgcDA7CisuTHJldHJ5X2NvcmVsb2NrX25vZmx1c2g6CisJdGVzdHNldCAocDApOworCWlmIGNjIGp1bXAgLkxkb25lX2NvcmVsb2NrX25vZmx1c2g7CisJU1NZTkMocjIpOworCWp1bXAgLkxyZXRyeV9jb3JlbG9ja19ub2ZsdXNoCisuTGRvbmVfY29yZWxvY2tfbm9mbHVzaDoKKwlydHM7CitFTkRQUk9DKF9nZXRfY29yZV9sb2NrX25vZmx1c2gpCisKKy8qCisgKiByMCA9IGludGVycnVwdCBtYXNrIHRvIHJlc3RvcmUuCisgKiByMSA9IGFkZHJlc3Mgb2YgYXRvbWljIGRhdGEgdG8gZmx1c2ggYW5kIGludmFsaWRhdGUgKDMyYml0KS4KKyAqCisgKiBJbnRlcnJ1cHRzIGFyZSBtYXNrZWQgb24gZW50cnkgKHNlZSBfZ2V0X2NvcmVfbG9jaykuCisgKiBDbG9iYmVyczogcjI6MCwgcDAKKyAqLworRU5UUlkoX3B1dF9jb3JlX2xvY2spCisJLyogV3JpdGUtdGhyb3VnaCBjYWNoZSBhc3N1bWVkLCBzbyBubyBmbHVzaCBuZWVkZWQgaGVyZS4gKi8KKwljb3Jlc2xvdF9sb2FkYWRkciBwMDsKKwlyMSA9IDA7CisJW3AwXSA9IHIxOworCVNTWU5DKHIyKTsKKwlzdGkgcjA7CisJcnRzOworRU5EUFJPQyhfcHV0X2NvcmVfbG9jaykKKworI2lmZGVmIF9fQVJDSF9TWU5DX0NPUkVfRENBQ0hFCisKK0VOVFJZKF9fX3Jhd19zbXBfbWFya19iYXJyaWVyX2FzbSkKKwlbLS1zcF0gPSByZXRzOworCVstLXNwXSA9ICggcjc6NSApOworCVstLXNwXSA9IHIwOworCVstLXNwXSA9IHAxOworCVstLXNwXSA9IHAwOworCWNhbGwgX2dldF9jb3JlX2xvY2tfbm9mbHVzaDsKKworCS8qCisJICogQ2FsY3VsYXRlIGN1cnJlbnQgY29yZSBtYXNrCisJICovCisJR0VUX0NQVUlEKHAxLCByNyk7CisJcjYgPSAxOworCXI2IDw8PSByNzsKKworCS8qCisJICogU2V0IGJpdCBvZiBvdGhlciBjb3JlcyBpbiBiYXJyaWVyIG1hc2suIERvbid0IGNoYW5nZSBjdXJyZW50IGNvcmUgYml0LgorCSAqLworCXAxLmwgPSBfYmFycmllcl9tYXNrOworCXAxLmggPSBfYmFycmllcl9tYXNrOworCXI3ID0gW3AxXTsKKwlyNSA9IHI3ICYgcjY7CisJcjcgPSB+cjY7CisJY2MgPSByNSA9PSAwOworCWlmIGNjIGp1bXAgMWY7CisJcjcgPSByNyB8IHI2OworMToKKwlbcDFdID0gcjc7CisJU1NZTkMocjIpOworCisJY2FsbCBfcHV0X2NvcmVfbG9jazsKKwlwMCA9IFtzcCsrXTsKKwlwMSA9IFtzcCsrXTsKKwlyMCA9IFtzcCsrXTsKKwkoIHI3OjUgKSA9IFtzcCsrXTsKKwlyZXRzID0gW3NwKytdOworCXJ0czsKK0VORFBST0MoX19fcmF3X3NtcF9tYXJrX2JhcnJpZXJfYXNtKQorCitFTlRSWShfX19yYXdfc21wX2NoZWNrX2JhcnJpZXJfYXNtKQorCVstLXNwXSA9IHJldHM7CisJWy0tc3BdID0gKCByNzo1ICk7CisJWy0tc3BdID0gcjA7CisJWy0tc3BdID0gcDE7CisJWy0tc3BdID0gcDA7CisJY2FsbCBfZ2V0X2NvcmVfbG9ja19ub2ZsdXNoOworCisJLyoKKwkgKiBDYWxjdWxhdGUgY3VycmVudCBjb3JlIG1hc2sKKwkgKi8KKwlHRVRfQ1BVSUQocDEsIHI3KTsKKwlyNiA9IDE7CisJcjYgPDw9IHI3OworCisJLyoKKwkgKiBDbGVhciBjdXJyZW50IGNvcmUgYml0IGluIGJhcnJpZXIgbWFzayBpZiBpdCBpcyBzZXQuCisJICovCisJcDEubCA9IF9iYXJyaWVyX21hc2s7CisJcDEuaCA9IF9iYXJyaWVyX21hc2s7CisJcjcgPSBbcDFdOworCXI1ID0gcjcgJiByNjsKKwljYyA9IHI1ID09IDA7CisJaWYgY2MganVtcCAxZjsKKwlyNiA9IH5yNjsKKwlyNyA9IHI3ICYgcjY7CisJW3AxXSA9IHI3OworCVNTWU5DKHIyKTsKKworCWNhbGwgX3B1dF9jb3JlX2xvY2s7CisKKwkvKgorCSAqIEludmFsaWRhdGUgdGhlIGVudGlyZSBELWNhY2hlIG9mIGN1cnJlbnQgY29yZS4KKwkgKi8KKwlzcCArPSAtMTI7CisJY2FsbCBfcmVzeW5jX2NvcmVfZGNhY2hlCisJc3AgKz0gMTI7CisJanVtcCAyZjsKKzE6CisJY2FsbCBfcHV0X2NvcmVfbG9jazsKKzI6CisJcDAgPSBbc3ArK107CisJcDEgPSBbc3ArK107CisJcjAgPSBbc3ArK107CisJKCByNzo1ICkgPSBbc3ArK107CisJcmV0cyA9IFtzcCsrXTsKKwlydHM7CitFTkRQUk9DKF9fX3Jhd19zbXBfY2hlY2tfYmFycmllcl9hc20pCisKKy8qCisgKiByMCA9IGlycWZsYWdzCisgKiByMSA9IGFkZHJlc3Mgb2YgYXRvbWljIGRhdGEKKyAqCisgKiBDbG9iYmVyczogcjI6MCwgcDE6MAorICovCitfc3RhcnRfbG9ja19jb2hlcmVudDoKKworCVstLXNwXSA9IHJldHM7CisJWy0tc3BdID0gKCByNzo2ICk7CisJcjcgPSByMDsKKwlwMSA9IHIxOworCisJLyoKKwkgKiBEZXRlcm1pbmUgd2hldGhlciB0aGUgYXRvbWljIGRhdGEgd2FzIHByZXZpb3VzbHkKKwkgKiBvd25lZCBieSBhbm90aGVyIENQVSAoPXI2KS4KKwkgKi8KKwlHRVRfQ1BVSUQocDAsIHIyKTsKKwlyMSA9IDE7CisJcjEgPDw9IHIyOworCXIyID0gfnIxOworCisJcjEgPSBbcDFdOworCXIxID4+PSAyODsgICAvKiBDUFUgZmluZ2VycHJpbnRzIGFyZSBzdG9yZWQgaW4gdGhlIGhpZ2ggbmliYmxlLiAqLworCXI2ID0gcjEgJiByMjsKKwlyMSA9IFtwMV07CisJcjEgPDw9IDQ7CisJcjEgPj49IDQ7CisJW3AxXSA9IHIxOworCisJLyoKKwkgKiBSZWxlYXNlIHRoZSBjb3JlIGxvY2sgbm93LCBidXQga2VlcCBJUlFzIGRpc2FibGVkIHdoaWxlIHdlIGFyZQorCSAqIHBlcmZvcm1pbmcgdGhlIHJlbWFpbmluZyBob3VzZWtlZXBpbmcgY2hvcmVzIGZvciB0aGUgY3VycmVudCBDUFUuCisJICovCisJY29yZXNsb3RfbG9hZGFkZHIgcDA7CisJcjEgPSAwOworCVtwMF0gPSByMTsKKworCS8qCisJICogSWYgYW5vdGhlciBDUFUgaGFzIG93bmVkIHRoZSBzYW1lIGF0b21pYyBzZWN0aW9uIGJlZm9yZSB1cywKKwkgKiB0aGVuIG91ciBELWNhY2hlZCBjb3B5IG9mIHRoZSBzaGFyZWQgZGF0YSBwcm90ZWN0ZWQgYnkgdGhlCisJICogY3VycmVudCBzcGluL3dyaXRlX2xvY2sgbWF5IGJlIG9ic29sZXRlLgorCSAqLworCWNjID0gcjYgPT0gMDsKKwlpZiBjYyBqdW1wIC5MY2FjaGVfc3luY2VkCisKKwkvKgorCSAqIEludmFsaWRhdGUgdGhlIGVudGlyZSBELWNhY2hlIG9mIHRoZSBjdXJyZW50IGNvcmUuCisJICovCisJc3AgKz0gLTEyOworCWNhbGwgX3Jlc3luY19jb3JlX2RjYWNoZQorCXNwICs9IDEyOworCisuTGNhY2hlX3N5bmNlZDoKKwlTU1lOQyhyMik7CisJc3RpIHI3OworCSggcjc6NiApID0gW3NwKytdOworCXJldHMgPSBbc3ArK107CisJcnRzCisKKy8qCisgKiByMCA9IGlycWZsYWdzCisgKiByMSA9IGFkZHJlc3Mgb2YgYXRvbWljIGRhdGEKKyAqCisgKiBDbG9iYmVyczogcjI6MCwgcDE6MAorICovCitfZW5kX2xvY2tfY29oZXJlbnQ6CisKKwlwMSA9IHIxOworCUdFVF9DUFVJRChwMCwgcjIpOworCXIyICs9IDI4OworCXIxID0gMTsKKwlyMSA8PD0gcjI7CisJcjIgPSBbcDFdOworCXIyID0gcjEgfCByMjsKKwlbcDFdID0gcjI7CisJcjEgPSBwMTsKKwlqdW1wIF9wdXRfY29yZV9sb2NrOworCisjZW5kaWYgLyogX19BUkNIX1NZTkNfQ09SRV9EQ0FDSEUgKi8KKworLyoKKyAqIHIwID0gJnNwaW5sb2NrLT5sb2NrCisgKgorICogQ2xvYmJlcnM6IHIzOjAsIHAxOjAKKyAqLworRU5UUlkoX19fcmF3X3NwaW5faXNfbG9ja2VkX2FzbSkKKwlwMSA9IHIwOworCVstLXNwXSA9IHJldHM7CisJY2FsbCBfZ2V0X2NvcmVfbG9jazsKKwlyMyA9IFtwMV07CisJY2MgPSBiaXR0c3QoIHIzLCAwICk7CisJcjMgPSBjYzsKKwlyMSA9IHAxOworCWNhbGwgX3B1dF9jb3JlX2xvY2s7CisJcmV0cyA9IFtzcCsrXTsKKwlyMCA9IHIzOworCXJ0czsKK0VORFBST0MoX19fcmF3X3NwaW5faXNfbG9ja2VkX2FzbSkKKworLyoKKyAqIHIwID0gJnNwaW5sb2NrLT5sb2NrCisgKgorICogQ2xvYmJlcnM6IHIzOjAsIHAxOjAKKyAqLworRU5UUlkoX19fcmF3X3NwaW5fbG9ja19hc20pCisJcDEgPSByMDsKKwlbLS1zcF0gPSByZXRzOworLkxyZXRyeV9zcGlubG9jazoKKwljYWxsIF9nZXRfY29yZV9sb2NrOworCXIxID0gcDE7CisJcjIgPSBbcDFdOworCWNjID0gYml0dHN0KCByMiwgMCApOworCWlmIGNjIGp1bXAgLkxidXN5X3NwaW5sb2NrCisjaWZkZWYgX19BUkNIX1NZTkNfQ09SRV9EQ0FDSEUKKwlyMyA9IHAxOworCWJpdHNldCAoIHIyLCAwICk7IC8qIFJhaXNlIHRoZSBsb2NrIGJpdC4gKi8KKwlbcDFdID0gcjI7CisJY2FsbCBfc3RhcnRfbG9ja19jb2hlcmVudAorI2Vsc2UKKwlyMiA9IDE7CisJW3AxXSA9IHIyOworCWNhbGwgX3B1dF9jb3JlX2xvY2s7CisjZW5kaWYKKwlyZXRzID0gW3NwKytdOworCXJ0czsKKworLkxidXN5X3NwaW5sb2NrOgorCS8qIFdlIGRvbid0IHRvdWNoIHRoZSBhdG9taWMgYXJlYSBpZiBidXN5LCBzbyB0aGF0IGZsdXNoCisJICAgd2lsbCBiZWhhdmUgbGlrZSBub3AgaW4gX3B1dF9jb3JlX2xvY2suICovCisJY2FsbCBfcHV0X2NvcmVfbG9jazsKKwlTU1lOQyhyMik7CisJcjAgPSBwMTsKKwlqdW1wIC5McmV0cnlfc3BpbmxvY2sKK0VORFBST0MoX19fcmF3X3NwaW5fbG9ja19hc20pCisKKy8qCisgKiByMCA9ICZzcGlubG9jay0+bG9jaworICoKKyAqIENsb2JiZXJzOiByMzowLCBwMTowCisgKi8KK0VOVFJZKF9fX3Jhd19zcGluX3RyeWxvY2tfYXNtKQorCXAxID0gcjA7CisJWy0tc3BdID0gcmV0czsKKwljYWxsIF9nZXRfY29yZV9sb2NrOworCXIxID0gcDE7CisJcjMgPSBbcDFdOworCWNjID0gYml0dHN0KCByMywgMCApOworCWlmIGNjIGp1bXAgLkxmYWlsZWRfdHJ5bG9jaworI2lmZGVmIF9fQVJDSF9TWU5DX0NPUkVfRENBQ0hFCisJYml0c2V0ICggcjMsIDAgKTsgLyogUmFpc2UgdGhlIGxvY2sgYml0LiAqLworCVtwMV0gPSByMzsKKwljYWxsIF9zdGFydF9sb2NrX2NvaGVyZW50CisjZWxzZQorCXIyID0gMTsKKwlbcDFdID0gcjI7CisJY2FsbCBfcHV0X2NvcmVfbG9jazsKKyNlbmRpZgorCXIwID0gMTsKKwlyZXRzID0gW3NwKytdOworCXJ0czsKKy5MZmFpbGVkX3RyeWxvY2s6CisJY2FsbCBfcHV0X2NvcmVfbG9jazsKKwlyMCA9IDA7CisJcmV0cyA9IFtzcCsrXTsKKwlydHM7CitFTkRQUk9DKF9fX3Jhd19zcGluX3RyeWxvY2tfYXNtKQorCisvKgorICogcjAgPSAmc3BpbmxvY2stPmxvY2sKKyAqCisgKiBDbG9iYmVyczogcjI6MCwgcDE6MAorICovCitFTlRSWShfX19yYXdfc3Bpbl91bmxvY2tfYXNtKQorCXAxID0gcjA7CisJWy0tc3BdID0gcmV0czsKKwljYWxsIF9nZXRfY29yZV9sb2NrOworCXIyID0gW3AxXTsKKwliaXRjbHIgKCByMiwgMCApOworCVtwMV0gPSByMjsKKwlyMSA9IHAxOworI2lmZGVmIF9fQVJDSF9TWU5DX0NPUkVfRENBQ0hFCisJY2FsbCBfZW5kX2xvY2tfY29oZXJlbnQKKyNlbHNlCisJY2FsbCBfcHV0X2NvcmVfbG9jazsKKyNlbmRpZgorCXJldHMgPSBbc3ArK107CisJcnRzOworRU5EUFJPQyhfX19yYXdfc3Bpbl91bmxvY2tfYXNtKQorCisvKgorICogcjAgPSAmcndsb2NrLT5sb2NrCisgKgorICogQ2xvYmJlcnM6IHIyOjAsIHAxOjAKKyAqLworRU5UUlkoX19fcmF3X3JlYWRfbG9ja19hc20pCisJcDEgPSByMDsKKwlbLS1zcF0gPSByZXRzOworCWNhbGwgX2dldF9jb3JlX2xvY2s7CisuTHJkbG9ja190cnk6CisJcjEgPSBbcDFdOworCXIxICs9IC0xOworCVtwMV0gPSByMTsKKwljYyA9IHIxIDwgMDsKKwlpZiBjYyBqdW1wIC5McmRsb2NrX2ZhaWxlZAorCXIxID0gcDE7CisjaWZkZWYgX19BUkNIX1NZTkNfQ09SRV9EQ0FDSEUKKwljYWxsIF9zdGFydF9sb2NrX2NvaGVyZW50CisjZWxzZQorCWNhbGwgX3B1dF9jb3JlX2xvY2s7CisjZW5kaWYKKwlyZXRzID0gW3NwKytdOworCXJ0czsKKworLkxyZGxvY2tfZmFpbGVkOgorCXIxICs9IDE7CisJW3AxXSA9IHIxOworLkxyZGxvY2tfd2FpdDoKKwlyMSA9IHAxOworCWNhbGwgX3B1dF9jb3JlX2xvY2s7CisJU1NZTkMocjIpOworCXIwID0gcDE7CisJY2FsbCBfZ2V0X2NvcmVfbG9jazsKKwlyMSA9IFtwMV07CisJY2MgPSByMSA8IDI7CisJaWYgY2MganVtcCAuTHJkbG9ja193YWl0OworCWp1bXAgLkxyZGxvY2tfdHJ5CitFTkRQUk9DKF9fX3Jhd19yZWFkX2xvY2tfYXNtKQorCisvKgorICogcjAgPSAmcndsb2NrLT5sb2NrCisgKgorICogQ2xvYmJlcnM6IHIzOjAsIHAxOjAKKyAqLworRU5UUlkoX19fcmF3X3JlYWRfdHJ5bG9ja19hc20pCisJcDEgPSByMDsKKwlbLS1zcF0gPSByZXRzOworCWNhbGwgX2dldF9jb3JlX2xvY2s7CisJcjEgPSBbcDFdOworCWNjID0gcjEgPD0gMDsKKwlpZiBjYyBqdW1wIC5MZmFpbGVkX3RyeXJkbG9jazsKKwlyMSArPSAtMTsKKwlbcDFdID0gcjE7CisJcjEgPSBwMTsKKyNpZmRlZiBfX0FSQ0hfU1lOQ19DT1JFX0RDQUNIRQorCWNhbGwgX3N0YXJ0X2xvY2tfY29oZXJlbnQKKyNlbHNlCisJY2FsbCBfcHV0X2NvcmVfbG9jazsKKyNlbmRpZgorCXJldHMgPSBbc3ArK107CisJcjAgPSAxOworCXJ0czsKKy5MZmFpbGVkX3RyeXJkbG9jazoKKwlyMSA9IHAxOworCWNhbGwgX3B1dF9jb3JlX2xvY2s7CisJcmV0cyA9IFtzcCsrXTsKKwlyMCA9IDA7CisJcnRzOworRU5EUFJPQyhfX19yYXdfcmVhZF90cnlsb2NrX2FzbSkKKworLyoKKyAqIHIwID0gJnJ3bG9jay0+bG9jaworICoKKyAqIE5vdGU6IFByb2Nlc3NpbmcgY29udHJvbGxlZCBieSBhIHJlYWRlciBsb2NrIHNob3VsZCBub3QgaGF2ZQorICogYW55IHNpZGUtZWZmZWN0IG9uIGNhY2hlIGlzc3VlcyB3aXRoIHRoZSBvdGhlciBjb3JlLCBzbyB3ZQorICoganVzdCByZWxlYXNlIHRoZSBjb3JlIGxvY2sgYW5kIGV4aXQgKG5vIF9lbmRfbG9ja19jb2hlcmVudCkuCisgKgorICogQ2xvYmJlcnM6IHIzOjAsIHAxOjAKKyAqLworRU5UUlkoX19fcmF3X3JlYWRfdW5sb2NrX2FzbSkKKwlwMSA9IHIwOworCVstLXNwXSA9IHJldHM7CisJY2FsbCBfZ2V0X2NvcmVfbG9jazsKKwlyMSA9IFtwMV07CisJcjEgKz0gMTsKKwlbcDFdID0gcjE7CisJcjEgPSBwMTsKKwljYWxsIF9wdXRfY29yZV9sb2NrOworCXJldHMgPSBbc3ArK107CisJcnRzOworRU5EUFJPQyhfX19yYXdfcmVhZF91bmxvY2tfYXNtKQorCisvKgorICogcjAgPSAmcndsb2NrLT5sb2NrCisgKgorICogQ2xvYmJlcnM6IHIzOjAsIHAxOjAKKyAqLworRU5UUlkoX19fcmF3X3dyaXRlX2xvY2tfYXNtKQorCXAxID0gcjA7CisJcjMubCA9IGxvKFJXX0xPQ0tfQklBUyk7CisJcjMuaCA9IGhpKFJXX0xPQ0tfQklBUyk7CisJWy0tc3BdID0gcmV0czsKKwljYWxsIF9nZXRfY29yZV9sb2NrOworLkx3cmxvY2tfdHJ5OgorCXIxID0gW3AxXTsKKwlyMSA9IHIxIC0gcjM7CisjaWZkZWYgX19BUkNIX1NZTkNfQ09SRV9EQ0FDSEUKKwlyMiA9IHIxOworCXIyIDw8PSA0OworCXIyID4+PSA0OworCWNjID0gcjIgPT0gMDsKKyNlbHNlCisJY2MgPSByMSA9PSAwOworI2VuZGlmCisJaWYgIWNjIGp1bXAgLkx3cmxvY2tfd2FpdAorCVtwMV0gPSByMTsKKwlyMSA9IHAxOworI2lmZGVmIF9fQVJDSF9TWU5DX0NPUkVfRENBQ0hFCisJY2FsbCBfc3RhcnRfbG9ja19jb2hlcmVudAorI2Vsc2UKKwljYWxsIF9wdXRfY29yZV9sb2NrOworI2VuZGlmCisJcmV0cyA9IFtzcCsrXTsKKwlydHM7CisKKy5Md3Jsb2NrX3dhaXQ6CisJcjEgPSBwMTsKKwljYWxsIF9wdXRfY29yZV9sb2NrOworCVNTWU5DKHIyKTsKKwlyMCA9IHAxOworCWNhbGwgX2dldF9jb3JlX2xvY2s7CisJcjEgPSBbcDFdOworI2lmZGVmIF9fQVJDSF9TWU5DX0NPUkVfRENBQ0hFCisJcjEgPDw9IDQ7CisJcjEgPj49IDQ7CisjZW5kaWYKKwljYyA9IHIxID09IHIzOworCWlmICFjYyBqdW1wIC5Md3Jsb2NrX3dhaXQ7CisJanVtcCAuTHdybG9ja190cnkKK0VORFBST0MoX19fcmF3X3dyaXRlX2xvY2tfYXNtKQorCisvKgorICogcjAgPSAmcndsb2NrLT5sb2NrCisgKgorICogQ2xvYmJlcnM6IHIzOjAsIHAxOjAKKyAqLworRU5UUlkoX19fcmF3X3dyaXRlX3RyeWxvY2tfYXNtKQorCXAxID0gcjA7CisJWy0tc3BdID0gcmV0czsKKwljYWxsIF9nZXRfY29yZV9sb2NrOworCXIxID0gW3AxXTsKKwlyMi5sID0gbG8oUldfTE9DS19CSUFTKTsKKwlyMi5oID0gaGkoUldfTE9DS19CSUFTKTsKKwljYyA9IHIxID09IHIyOworCWlmICFjYyBqdW1wIC5MZmFpbGVkX3RyeXdybG9jazsKKyNpZmRlZiBfX0FSQ0hfU1lOQ19DT1JFX0RDQUNIRQorCXIxID4+PSAyODsKKwlyMSA8PD0gMjg7CisjZWxzZQorCXIxID0gMDsKKyNlbmRpZgorCVtwMV0gPSByMTsKKwlyMSA9IHAxOworI2lmZGVmIF9fQVJDSF9TWU5DX0NPUkVfRENBQ0hFCisJY2FsbCBfc3RhcnRfbG9ja19jb2hlcmVudAorI2Vsc2UKKwljYWxsIF9wdXRfY29yZV9sb2NrOworI2VuZGlmCisJcmV0cyA9IFtzcCsrXTsKKwlyMCA9IDE7CisJcnRzOworCisuTGZhaWxlZF90cnl3cmxvY2s6CisJcjEgPSBwMTsKKwljYWxsIF9wdXRfY29yZV9sb2NrOworCXJldHMgPSBbc3ArK107CisJcjAgPSAwOworCXJ0czsKK0VORFBST0MoX19fcmF3X3dyaXRlX3RyeWxvY2tfYXNtKQorCisvKgorICogcjAgPSAmcndsb2NrLT5sb2NrCisgKgorICogQ2xvYmJlcnM6IHIzOjAsIHAxOjAKKyAqLworRU5UUlkoX19fcmF3X3dyaXRlX3VubG9ja19hc20pCisJcDEgPSByMDsKKwlyMy5sID0gbG8oUldfTE9DS19CSUFTKTsKKwlyMy5oID0gaGkoUldfTE9DS19CSUFTKTsKKwlbLS1zcF0gPSByZXRzOworCWNhbGwgX2dldF9jb3JlX2xvY2s7CisJcjEgPSBbcDFdOworCXIxID0gcjEgKyByMzsKKwlbcDFdID0gcjE7CisJcjEgPSBwMTsKKyNpZmRlZiBfX0FSQ0hfU1lOQ19DT1JFX0RDQUNIRQorCWNhbGwgX2VuZF9sb2NrX2NvaGVyZW50CisjZWxzZQorCWNhbGwgX3B1dF9jb3JlX2xvY2s7CisjZW5kaWYKKwlyZXRzID0gW3NwKytdOworCXJ0czsKK0VORFBST0MoX19fcmF3X3dyaXRlX3VubG9ja19hc20pCisKKy8qCisgKiByMCA9IHB0cgorICogcjEgPSB2YWx1ZQorICoKKyAqIEFkZCBhIHNpZ25lZCB2YWx1ZSB0byBhIDMyYml0IHdvcmQgYW5kIHJldHVybiB0aGUgbmV3IHZhbHVlIGF0b21pY2FsbHkuCisgKiBDbG9iYmVyczogcjM6MCwgcDE6MAorICovCitFTlRSWShfX19yYXdfYXRvbWljX3VwZGF0ZV9hc20pCisJcDEgPSByMDsKKwlyMyA9IHIxOworCVstLXNwXSA9IHJldHM7CisJY2FsbCBfZ2V0X2NvcmVfbG9jazsKKwlyMiA9IFtwMV07CisJcjMgPSByMyArIHIyOworCVtwMV0gPSByMzsKKwlyMSA9IHAxOworCWNhbGwgX3B1dF9jb3JlX2xvY2s7CisJcjAgPSByMzsKKwlyZXRzID0gW3NwKytdOworCXJ0czsKK0VORFBST0MoX19fcmF3X2F0b21pY191cGRhdGVfYXNtKQorCisvKgorICogcjAgPSBwdHIKKyAqIHIxID0gbWFzaworICoKKyAqIENsZWFyIHRoZSBtYXNrIGJpdHMgZnJvbSBhIDMyYml0IHdvcmQgYW5kIHJldHVybiB0aGUgb2xkIDMyYml0IHZhbHVlCisgKiBhdG9taWNhbGx5LgorICogQ2xvYmJlcnM6IHIzOjAsIHAxOjAKKyAqLworRU5UUlkoX19fcmF3X2F0b21pY19jbGVhcl9hc20pCisJcDEgPSByMDsKKwlyMyA9IH5yMTsKKwlbLS1zcF0gPSByZXRzOworCWNhbGwgX2dldF9jb3JlX2xvY2s7CisJcjIgPSBbcDFdOworCXIzID0gcjIgJiByMzsKKwlbcDFdID0gcjM7CisJcjMgPSByMjsKKwlyMSA9IHAxOworCWNhbGwgX3B1dF9jb3JlX2xvY2s7CisJcjAgPSByMzsKKwlyZXRzID0gW3NwKytdOworCXJ0czsKK0VORFBST0MoX19fcmF3X2F0b21pY19jbGVhcl9hc20pCisKKy8qCisgKiByMCA9IHB0cgorICogcjEgPSBtYXNrCisgKgorICogU2V0IHRoZSBtYXNrIGJpdHMgaW50byBhIDMyYml0IHdvcmQgYW5kIHJldHVybiB0aGUgb2xkIDMyYml0IHZhbHVlCisgKiBhdG9taWNhbGx5LgorICogQ2xvYmJlcnM6IHIzOjAsIHAxOjAKKyAqLworRU5UUlkoX19fcmF3X2F0b21pY19zZXRfYXNtKQorCXAxID0gcjA7CisJcjMgPSByMTsKKwlbLS1zcF0gPSByZXRzOworCWNhbGwgX2dldF9jb3JlX2xvY2s7CisJcjIgPSBbcDFdOworCXIzID0gcjIgfCByMzsKKwlbcDFdID0gcjM7CisJcjMgPSByMjsKKwlyMSA9IHAxOworCWNhbGwgX3B1dF9jb3JlX2xvY2s7CisJcjAgPSByMzsKKwlyZXRzID0gW3NwKytdOworCXJ0czsKK0VORFBST0MoX19fcmF3X2F0b21pY19zZXRfYXNtKQorCisvKgorICogcjAgPSBwdHIKKyAqIHIxID0gbWFzaworICoKKyAqIFhPUiB0aGUgbWFzayBiaXRzIHdpdGggYSAzMmJpdCB3b3JkIGFuZCByZXR1cm4gdGhlIG9sZCAzMmJpdCB2YWx1ZQorICogYXRvbWljYWxseS4KKyAqIENsb2JiZXJzOiByMzowLCBwMTowCisgKi8KK0VOVFJZKF9fX3Jhd19hdG9taWNfeG9yX2FzbSkKKwlwMSA9IHIwOworCXIzID0gcjE7CisJWy0tc3BdID0gcmV0czsKKwljYWxsIF9nZXRfY29yZV9sb2NrOworCXIyID0gW3AxXTsKKwlyMyA9IHIyIF4gcjM7CisJW3AxXSA9IHIzOworCXIzID0gcjI7CisJcjEgPSBwMTsKKwljYWxsIF9wdXRfY29yZV9sb2NrOworCXIwID0gcjM7CisJcmV0cyA9IFtzcCsrXTsKKwlydHM7CitFTkRQUk9DKF9fX3Jhd19hdG9taWNfeG9yX2FzbSkKKworLyoKKyAqIHIwID0gcHRyCisgKiByMSA9IG1hc2sKKyAqCisgKiBQZXJmb3JtIGEgbG9naWNhbCBBTkQgYmV0d2VlbiB0aGUgbWFzayBiaXRzIGFuZCBhIDMyYml0IHdvcmQsIGFuZAorICogcmV0dXJuIHRoZSBtYXNrZWQgdmFsdWUuIFdlIG5lZWQgdGhpcyBvbiB0aGlzIGFyY2hpdGVjdHVyZSBpbgorICogb3JkZXIgdG8gaW52YWxpZGF0ZSB0aGUgbG9jYWwgY2FjaGUgYmVmb3JlIHRlc3RpbmcuCisgKgorICogQ2xvYmJlcnM6IHIzOjAsIHAxOjAKKyAqLworRU5UUlkoX19fcmF3X2F0b21pY190ZXN0X2FzbSkKKwlwMSA9IHIwOworCXIzID0gcjE7CisJcjEgPSAtTDFfQ0FDSEVfQllURVM7CisJcjEgPSByMCAmIHIxOworCXAwID0gcjE7CisJZmx1c2hpbnZbcDBdOworCVNTWU5DKHIyKTsKKwlyMCA9IFtwMV07CisJcjAgPSByMCAmIHIzOworCXJ0czsKK0VORFBST0MoX19fcmF3X2F0b21pY190ZXN0X2FzbSkKKworLyoKKyAqIHIwID0gcHRyCisgKiByMSA9IHZhbHVlCisgKgorICogU3dhcCAqcHRyIHdpdGggdmFsdWUgYW5kIHJldHVybiB0aGUgb2xkIDMyYml0IHZhbHVlIGF0b21pY2FsbHkuCisgKiBDbG9iYmVyczogcjM6MCwgcDE6MAorICovCisjZGVmaW5lCV9fZG9feGNoZyhzcmMsIGRzdCkgCQlcCisJcDEgPSByMDsJCQlcCisJcjMgPSByMTsJCQlcCisJWy0tc3BdID0gcmV0czsJCQlcCisJY2FsbCBfZ2V0X2NvcmVfbG9jazsJCVwKKwlyMiA9IHNyYzsJCQlcCisJZHN0ID0gcjM7CQkJXAorCXIzID0gcjI7CQkJXAorCXIxID0gcDE7CQkJXAorCWNhbGwgX3B1dF9jb3JlX2xvY2s7CQlcCisJcjAgPSByMzsJCQlcCisJcmV0cyA9IFtzcCsrXTsJCQlcCisJcnRzOworCitFTlRSWShfX19yYXdfeGNoZ18xX2FzbSkKKwlfX2RvX3hjaGcoYltwMV0gKHopLCBiW3AxXSkKK0VORFBST0MoX19fcmF3X3hjaGdfMV9hc20pCisKK0VOVFJZKF9fX3Jhd194Y2hnXzJfYXNtKQorCV9fZG9feGNoZyh3W3AxXSAoeiksIHdbcDFdKQorRU5EUFJPQyhfX19yYXdfeGNoZ18yX2FzbSkKKworRU5UUlkoX19fcmF3X3hjaGdfNF9hc20pCisJX19kb194Y2hnKFtwMV0sIFtwMV0pCitFTkRQUk9DKF9fX3Jhd194Y2hnXzRfYXNtKQorCisvKgorICogcjAgPSBwdHIKKyAqIHIxID0gbmV3CisgKiByMiA9IG9sZAorICoKKyAqIFN3YXAgKnB0ciB3aXRoIG5ldyBpZiAqcHRyID09IG9sZCBhbmQgcmV0dXJuIHRoZSBwcmV2aW91cyAqcHRyCisgKiB2YWx1ZSBhdG9taWNhbGx5LgorICoKKyAqIENsb2JiZXJzOiByMzowLCBwMTowCisgKi8KKyNkZWZpbmUJX19kb19jbXB4Y2hnKHNyYywgZHN0KSAJCVwKKwlbLS1zcF0gPSByZXRzOwkJCVwKKwlbLS1zcF0gPSByNDsJCQlcCisJcDEgPSByMDsJCQlcCisJcjMgPSByMTsJCQlcCisJcjQgPSByMjsJCQlcCisJY2FsbCBfZ2V0X2NvcmVfbG9jazsJCVwKKwlyMiA9IHNyYzsJCQlcCisJY2MgPSByMiA9PSByNDsJCQlcCisJaWYgIWNjIGp1bXAgMWY7CQkJXAorCWRzdCA9IHIzOwkJCVwKKyAgICAgMTogcjMgPSByMjsJCQlcCisJcjEgPSBwMTsJCQlcCisJY2FsbCBfcHV0X2NvcmVfbG9jazsJCVwKKwlyMCA9IHIzOwkJCVwKKwlyNCA9IFtzcCsrXTsJCQlcCisJcmV0cyA9IFtzcCsrXTsJCQlcCisJcnRzOworCitFTlRSWShfX19yYXdfY21weGNoZ18xX2FzbSkKKwlfX2RvX2NtcHhjaGcoYltwMV0gKHopLCBiW3AxXSkKK0VORFBST0MoX19fcmF3X2NtcHhjaGdfMV9hc20pCisKK0VOVFJZKF9fX3Jhd19jbXB4Y2hnXzJfYXNtKQorCV9fZG9fY21weGNoZyh3W3AxXSAoeiksIHdbcDFdKQorRU5EUFJPQyhfX19yYXdfY21weGNoZ18yX2FzbSkKKworRU5UUlkoX19fcmF3X2NtcHhjaGdfNF9hc20pCisJX19kb19jbXB4Y2hnKFtwMV0sIFtwMV0pCitFTkRQUk9DKF9fX3Jhd19jbXB4Y2hnXzRfYXNtKQorCisvKgorICogcjAgPSBwdHIKKyAqIHIxID0gYml0bnIKKyAqCisgKiBTZXQgYSBiaXQgaW4gYSAzMmJpdCB3b3JkIGFuZCByZXR1cm4gdGhlIG9sZCAzMmJpdCB2YWx1ZSBhdG9taWNhbGx5LgorICogQ2xvYmJlcnM6IHIzOjAsIHAxOjAKKyAqLworRU5UUlkoX19fcmF3X2JpdF9zZXRfYXNtKQorCXIyID0gcjE7CisJcjEgPSAxOworCXIxIDw8PSByMjsKKwlqdW1wIF9fX3Jhd19hdG9taWNfc2V0X2FzbQorRU5EUFJPQyhfX19yYXdfYml0X3NldF9hc20pCisKKy8qCisgKiByMCA9IHB0cgorICogcjEgPSBiaXRucgorICoKKyAqIENsZWFyIGEgYml0IGluIGEgMzJiaXQgd29yZCBhbmQgcmV0dXJuIHRoZSBvbGQgMzJiaXQgdmFsdWUgYXRvbWljYWxseS4KKyAqIENsb2JiZXJzOiByMzowLCBwMTowCisgKi8KK0VOVFJZKF9fX3Jhd19iaXRfY2xlYXJfYXNtKQorCXIyID0gcjE7CisJcjEgPSAxOworCXIxIDw8PSByMjsKKwlqdW1wIF9fX3Jhd19hdG9taWNfY2xlYXJfYXNtCitFTkRQUk9DKF9fX3Jhd19iaXRfY2xlYXJfYXNtKQorCisvKgorICogcjAgPSBwdHIKKyAqIHIxID0gYml0bnIKKyAqCisgKiBUb2dnbGUgYSBiaXQgaW4gYSAzMmJpdCB3b3JkIGFuZCByZXR1cm4gdGhlIG9sZCAzMmJpdCB2YWx1ZSBhdG9taWNhbGx5LgorICogQ2xvYmJlcnM6IHIzOjAsIHAxOjAKKyAqLworRU5UUlkoX19fcmF3X2JpdF90b2dnbGVfYXNtKQorCXIyID0gcjE7CisJcjEgPSAxOworCXIxIDw8PSByMjsKKwlqdW1wIF9fX3Jhd19hdG9taWNfeG9yX2FzbQorRU5EUFJPQyhfX19yYXdfYml0X3RvZ2dsZV9hc20pCisKKy8qCisgKiByMCA9IHB0cgorICogcjEgPSBiaXRucgorICoKKyAqIFRlc3QtYW5kLXNldCBhIGJpdCBpbiBhIDMyYml0IHdvcmQgYW5kIHJldHVybiB0aGUgb2xkIGJpdCB2YWx1ZSBhdG9taWNhbGx5LgorICogQ2xvYmJlcnM6IHIzOjAsIHAxOjAKKyAqLworRU5UUlkoX19fcmF3X2JpdF90ZXN0X3NldF9hc20pCisJWy0tc3BdID0gcmV0czsKKwlbLS1zcF0gPSByMTsKKwljYWxsIF9fX3Jhd19iaXRfc2V0X2FzbQorCXIxID0gW3NwKytdOworCXIyID0gMTsKKwlyMiA8PD0gcjE7CisJcjAgPSByMCAmIHIyOworCWNjID0gcjAgPT0gMDsKKwlpZiBjYyBqdW1wIDFmCisJcjAgPSAxOworMToKKwlyZXRzID0gW3NwKytdOworCXJ0czsKK0VORFBST0MoX19fcmF3X2JpdF90ZXN0X3NldF9hc20pCisKKy8qCisgKiByMCA9IHB0cgorICogcjEgPSBiaXRucgorICoKKyAqIFRlc3QtYW5kLWNsZWFyIGEgYml0IGluIGEgMzJiaXQgd29yZCBhbmQgcmV0dXJuIHRoZSBvbGQgYml0IHZhbHVlIGF0b21pY2FsbHkuCisgKiBDbG9iYmVyczogcjM6MCwgcDE6MAorICovCitFTlRSWShfX19yYXdfYml0X3Rlc3RfY2xlYXJfYXNtKQorCVstLXNwXSA9IHJldHM7CisJWy0tc3BdID0gcjE7CisJY2FsbCBfX19yYXdfYml0X2NsZWFyX2FzbQorCXIxID0gW3NwKytdOworCXIyID0gMTsKKwlyMiA8PD0gcjE7CisJcjAgPSByMCAmIHIyOworCWNjID0gcjAgPT0gMDsKKwlpZiBjYyBqdW1wIDFmCisJcjAgPSAxOworMToKKwlyZXRzID0gW3NwKytdOworCXJ0czsKK0VORFBST0MoX19fcmF3X2JpdF90ZXN0X2NsZWFyX2FzbSkKKworLyoKKyAqIHIwID0gcHRyCisgKiByMSA9IGJpdG5yCisgKgorICogVGVzdC1hbmQtdG9nZ2xlIGEgYml0IGluIGEgMzJiaXQgd29yZCwKKyAqIGFuZCByZXR1cm4gdGhlIG9sZCBiaXQgdmFsdWUgYXRvbWljYWxseS4KKyAqIENsb2JiZXJzOiByMzowLCBwMTowCisgKi8KK0VOVFJZKF9fX3Jhd19iaXRfdGVzdF90b2dnbGVfYXNtKQorCVstLXNwXSA9IHJldHM7CisJWy0tc3BdID0gcjE7CisJY2FsbCBfX19yYXdfYml0X3RvZ2dsZV9hc20KKwlyMSA9IFtzcCsrXTsKKwlyMiA9IDE7CisJcjIgPDw9IHIxOworCXIwID0gcjAgJiByMjsKKwljYyA9IHIwID09IDA7CisJaWYgY2MganVtcCAxZgorCXIwID0gMTsKKzE6CisJcmV0cyA9IFtzcCsrXTsKKwlydHM7CitFTkRQUk9DKF9fX3Jhd19iaXRfdGVzdF90b2dnbGVfYXNtKQorCisvKgorICogcjAgPSBwdHIKKyAqIHIxID0gYml0bnIKKyAqCisgKiBUZXN0IGEgYml0IGluIGEgMzJiaXQgd29yZCBhbmQgcmV0dXJuIGl0cyB2YWx1ZS4KKyAqIFdlIG5lZWQgdGhpcyBvbiB0aGlzIGFyY2hpdGVjdHVyZSBpbiBvcmRlciB0byBpbnZhbGlkYXRlCisgKiB0aGUgbG9jYWwgY2FjaGUgYmVmb3JlIHRlc3RpbmcuCisgKgorICogQ2xvYmJlcnM6IHIzOjAsIHAxOjAKKyAqLworRU5UUlkoX19fcmF3X2JpdF90ZXN0X2FzbSkKKwlyMiA9IHIxOworCXIxID0gMTsKKwlyMSA8PD0gcjI7CisJanVtcCBfX19yYXdfYXRvbWljX3Rlc3RfYXNtCitFTkRQUk9DKF9fX3Jhd19iaXRfdGVzdF9hc20pCisKKy8qCisgKiByMCA9IHB0cgorICoKKyAqIEZldGNoIGFuZCByZXR1cm4gYW4gdW5jYWNoZWQgMzJiaXQgdmFsdWUuCisgKgorICogQ2xvYmJlcnM6IHIyOjAsIHAxOjAKKyAqLworRU5UUlkoX19fcmF3X3VuY2FjaGVkX2ZldGNoX2FzbSkKKwlwMSA9IHIwOworCXIxID0gLUwxX0NBQ0hFX0JZVEVTOworCXIxID0gcjAgJiByMTsKKwlwMCA9IHIxOworCWZsdXNoaW52W3AwXTsKKwlTU1lOQyhyMik7CisJcjAgPSBbcDFdOworCXJ0czsKK0VORFBST0MoX19fcmF3X3VuY2FjaGVkX2ZldGNoX2FzbSkKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9ib2FyZHMvY21fYmY1NjEuYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9ib2FyZHMvY21fYmY1NjEuYwppbmRleCA4ZjQwOTkwLi42ODgwZDFlIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvYm9hcmRzL2NtX2JmNTYxLmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2JvYXJkcy9jbV9iZjU2MS5jCkBAIC0yMzAsNiArMjMwLDE5IEBACiB9OwogI2VuZGlmCiAKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYmZpbl9ncGlvc19yZXNvdXJjZXMgPSB7CisJLnN0YXJ0ID0gMCwKKwkuZW5kICAgPSBNQVhfQkxBQ0tGSU5fR1BJT1MgLSAxLAorCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9ncGlvc19kZXZpY2UgPSB7CisJLm5hbWUgPSAic2ltcGxlLWdwaW8iLAorCS5pZCA9IC0xLAorCS5udW1fcmVzb3VyY2VzID0gMSwKKwkucmVzb3VyY2UgPSAmYmZpbl9ncGlvc19yZXNvdXJjZXMsCit9OworCiAjaWYgZGVmaW5lZChDT05GSUdfVVNCX0lTUDEzNjJfSENEKSB8fCBkZWZpbmVkKENPTkZJR19VU0JfSVNQMTM2Ml9IQ0RfTU9EVUxFKQogc3RhdGljIHN0cnVjdCByZXNvdXJjZSBpc3AxMzYyX2hjZF9yZXNvdXJjZXNbXSA9IHsKIAl7CkBAIC0yODcsMjMgKzMwMCwzMyBAQAogI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19CRklOX1NJUikgfHwgZGVmaW5lZChDT05GSUdfQkZJTl9TSVJfTU9EVUxFKQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBiZmluX3Npcl9yZXNvdXJjZXNbXSA9IHsKICNpZmRlZiBDT05GSUdfQkZJTl9TSVIwCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGJmaW5fc2lyMF9yZXNvdXJjZXNbXSA9IHsKIAl7CiAJCS5zdGFydCA9IDB4RkZDMDA0MDAsCiAJCS5lbmQgPSAweEZGQzAwNEZGLAogCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKIAl9LAotI2VuZGlmCisJeworCQkuc3RhcnQgPSBJUlFfVUFSVDBfUlgsCisJCS5lbmQgPSBJUlFfVUFSVDBfUlgrMSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwl7CisJCS5zdGFydCA9IENIX1VBUlQwX1JYLAorCQkuZW5kID0gQ0hfVUFSVDBfUlgrMSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9ETUEsCisJfSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmaW5fc2lyX2RldmljZSA9IHsKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmaW5fc2lyMF9kZXZpY2UgPSB7CiAJLm5hbWUgPSAiYmZpbl9zaXIiLAogCS5pZCA9IDAsCi0JLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKGJmaW5fc2lyX3Jlc291cmNlcyksCi0JLnJlc291cmNlID0gYmZpbl9zaXJfcmVzb3VyY2VzLAorCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShiZmluX3NpcjBfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UgPSBiZmluX3NpcjBfcmVzb3VyY2VzLAogfTsKICNlbmRpZgorI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19QQVRBX1BMQVRGT1JNKSB8fCBkZWZpbmVkKENPTkZJR19QQVRBX1BMQVRGT1JNX01PRFVMRSkKICNkZWZpbmUgUEFUQV9JTlQJSVJRX1BGNDYKQEAgLTM4Miw3ICs0MDUsOSBAQAogI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19CRklOX1NJUikgfHwgZGVmaW5lZChDT05GSUdfQkZJTl9TSVJfTU9EVUxFKQotCSZiZmluX3Npcl9kZXZpY2UsCisjaWZkZWYgQ09ORklHX0JGSU5fU0lSMAorCSZiZmluX3NpcjBfZGV2aWNlLAorI2VuZGlmCiAjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX1VTQl9JU1AxMzYyX0hDRCkgfHwgZGVmaW5lZChDT05GSUdfVVNCX0lTUDEzNjJfSENEX01PRFVMRSkKQEAgLTQwMCw2ICs0MjUsOCBAQAogI2lmIGRlZmluZWQoQ09ORklHX1BBVEFfUExBVEZPUk0pIHx8IGRlZmluZWQoQ09ORklHX1BBVEFfUExBVEZPUk1fTU9EVUxFKQogCSZiZmluX3BhdGFfZGV2aWNlLAogI2VuZGlmCisKKwkmYmZpbl9ncGlvc19kZXZpY2UsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBjbV9iZjU2MV9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvYm9hcmRzL2V6a2l0LmMgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvYm9hcmRzL2V6a2l0LmMKaW5kZXggNTBiNGNkYy4uMGUyMTc4YSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2JvYXJkcy9lemtpdC5jCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9ib2FyZHMvZXpraXQuYwpAQCAtNDMsNTMgKzQzLDQyIEBACiAvKgogICogTmFtZSB0aGUgQm9hcmQgZm9yIHRoZSAvcHJvYy9jcHVpbmZvCiAgKi8KLWNvbnN0IGNoYXIgYmZpbl9ib2FyZF9uYW1lW10gPSAiQUREUy1CRjU2MS1FWktJVCI7Ci0KLSNkZWZpbmUgSVNQMTc2MV9CQVNFICAgICAgIDB4MkMwRjAwMDAKLSNkZWZpbmUgSVNQMTc2MV9JUlEgICAgICAgIElSUV9QRjEwCitjb25zdCBjaGFyIGJmaW5fYm9hcmRfbmFtZVtdID0gIkFESSBCRjU2MS1FWktJVCI7CiAKICNpZiBkZWZpbmVkKENPTkZJR19VU0JfSVNQMTc2MF9IQ0QpIHx8IGRlZmluZWQoQ09ORklHX1VTQl9JU1AxNzYwX0hDRF9NT0RVTEUpCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIGJmaW5faXNwMTc2MV9yZXNvdXJjZXNbXSA9IHsKLQl7Ci0JCS5uYW1lCT0gImlzcDE3NjEtcmVncyIsCi0JCS5zdGFydCAgPSBJU1AxNzYxX0JBU0UgKyAweDAwMDAwMDAwLAotCQkuZW5kICAgID0gSVNQMTc2MV9CQVNFICsgMHgwMDBmZmZmZiwKKyNpbmNsdWRlIDxsaW51eC91c2IvaXNwMTc2MC5oPgorc3RhdGljIHN0cnVjdCByZXNvdXJjZSBiZmluX2lzcDE3NjBfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkuc3RhcnQgID0gMHgyQzBGMDAwMCwKKwkJLmVuZCAgICA9IDB4MjAzQzAwMDAgKyAweGZmZmZmLAogCQkuZmxhZ3MgID0gSU9SRVNPVVJDRV9NRU0sCiAJfSwKLQl7Ci0JCS5zdGFydCAgPSBJU1AxNzYxX0lSUSwKLQkJLmVuZCAgICA9IElTUDE3NjFfSVJRLAorCVsxXSA9IHsKKwkJLnN0YXJ0ICA9IElSUV9QRjEwLAorCQkuZW5kICAgID0gSVJRX1BGMTAsCiAJCS5mbGFncyAgPSBJT1JFU09VUkNFX0lSUSwKIAl9LAogfTsKIAotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9pc3AxNzYxX2RldmljZSA9IHsKLQkubmFtZSAgICAgICAgICAgPSAiaXNwMTc2MSIsCitzdGF0aWMgc3RydWN0IGlzcDE3NjBfcGxhdGZvcm1fZGF0YSBpc3AxNzYwX3ByaXYgPSB7CisJLmlzX2lzcDE3NjEgPSAwLAorCS5wb3J0MV9kaXNhYmxlID0gMCwKKwkuYnVzX3dpZHRoXzE2ID0gMSwKKwkucG9ydDFfb3RnID0gMCwKKwkuYW5hbG9nX29jID0gMCwKKwkuZGFja19wb2xhcml0eV9oaWdoID0gMCwKKwkuZHJlcV9wb2xhcml0eV9oaWdoID0gMCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmaW5faXNwMTc2MF9kZXZpY2UgPSB7CisJLm5hbWUgICAgICAgICAgID0gImlzcDE3NjAtaGNkIiwKIAkuaWQgICAgICAgICAgICAgPSAwLAotCS5udW1fcmVzb3VyY2VzICA9IEFSUkFZX1NJWkUoYmZpbl9pc3AxNzYxX3Jlc291cmNlcyksCi0JLnJlc291cmNlICAgICAgID0gYmZpbl9pc3AxNzYxX3Jlc291cmNlcywKKwkuZGV2ID0geworCQkucGxhdGZvcm1fZGF0YSA9ICZpc3AxNzYwX3ByaXYsCisJfSwKKwkubnVtX3Jlc291cmNlcyAgPSBBUlJBWV9TSVpFKGJmaW5faXNwMTc2MF9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZSAgICAgICA9IGJmaW5faXNwMTc2MF9yZXNvdXJjZXMsCiB9OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqYmZpbl9pc3AxNzYxX2RldmljZXNbXSA9IHsKLQkmYmZpbl9pc3AxNzYxX2RldmljZSwKLX07Ci0KLWludCBfX2luaXQgYmZpbl9pc3AxNzYxX2luaXQodm9pZCkKLXsKLQl1bnNpZ25lZCBpbnQgbnVtX2RldmljZXMgPSBBUlJBWV9TSVpFKGJmaW5faXNwMTc2MV9kZXZpY2VzKTsKLQotCXByaW50ayhLRVJOX0lORk8gIiVzKCk6IHJlZ2lzdGVyaW5nIGRldmljZSByZXNvdXJjZXNcbiIsIF9fZnVuY19fKTsKLQlzZXRfaXJxX3R5cGUoSVNQMTc2MV9JUlEsIElSUUZfVFJJR0dFUl9GQUxMSU5HKTsKLQotCXJldHVybiBwbGF0Zm9ybV9hZGRfZGV2aWNlcyhiZmluX2lzcDE3NjFfZGV2aWNlcywgbnVtX2RldmljZXMpOwotfQotCi12b2lkIF9fZXhpdCBiZmluX2lzcDE3NjFfZXhpdCh2b2lkKQotewotCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKCZiZmluX2lzcDE3NjFfZGV2aWNlKTsKLX0KLQotYXJjaF9pbml0Y2FsbChiZmluX2lzcDE3NjFfaW5pdCk7CiAjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX1VTQl9JU1AxMzYyX0hDRCkgfHwgZGVmaW5lZChDT05GSUdfVVNCX0lTUDEzNjJfSENEX01PRFVMRSkKQEAgLTIyMSwyMyArMjEwLDMzIEBACiAjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX0JGSU5fU0lSKSB8fCBkZWZpbmVkKENPTkZJR19CRklOX1NJUl9NT0RVTEUpCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIGJmaW5fc2lyX3Jlc291cmNlc1tdID0gewogI2lmZGVmIENPTkZJR19CRklOX1NJUjAKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYmZpbl9zaXIwX3Jlc291cmNlc1tdID0gewogCXsKIAkJLnN0YXJ0ID0gMHhGRkMwMDQwMCwKIAkJLmVuZCA9IDB4RkZDMDA0RkYsCiAJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAogCX0sCi0jZW5kaWYKKwl7CisJCS5zdGFydCA9IElSUV9VQVJUMF9SWCwKKwkJLmVuZCA9IElSUV9VQVJUMF9SWCsxLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCXsKKwkJLnN0YXJ0ID0gQ0hfVUFSVDBfUlgsCisJCS5lbmQgPSBDSF9VQVJUMF9SWCsxLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0RNQSwKKwl9LAogfTsKIAotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9zaXJfZGV2aWNlID0geworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9zaXIwX2RldmljZSA9IHsKIAkubmFtZSA9ICJiZmluX3NpciIsCiAJLmlkID0gMCwKLQkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUoYmZpbl9zaXJfcmVzb3VyY2VzKSwKLQkucmVzb3VyY2UgPSBiZmluX3Npcl9yZXNvdXJjZXMsCisJLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKGJmaW5fc2lyMF9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZSA9IGJmaW5fc2lyMF9yZXNvdXJjZXMsCiB9OwogI2VuZGlmCisjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX01URF9QSFlTTUFQKSB8fCBkZWZpbmVkKENPTkZJR19NVERfUEhZU01BUF9NT0RVTEUpCiBzdGF0aWMgc3RydWN0IG10ZF9wYXJ0aXRpb24gZXpraXRfcGFydGl0aW9uc1tdID0gewpAQCAtNDQ5LDYgKzQ0OCwxMCBAQAogCSZuZXQyMjcyX2JmaW5fZGV2aWNlLAogI2VuZGlmCiAKKyNpZiBkZWZpbmVkKENPTkZJR19VU0JfSVNQMTc2MF9IQ0QpIHx8IGRlZmluZWQoQ09ORklHX1VTQl9JU1AxNzYwX0hDRF9NT0RVTEUpCisJJmJmaW5faXNwMTc2MF9kZXZpY2UsCisjZW5kaWYKKwogI2lmIGRlZmluZWQoQ09ORklHX1NQSV9CRklOKSB8fCBkZWZpbmVkKENPTkZJR19TUElfQkZJTl9NT0RVTEUpCiAJJmJmaW5fc3BpMF9kZXZpY2UsCiAjZW5kaWYKQEAgLTQ1OCw3ICs0NjEsOSBAQAogI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19CRklOX1NJUikgfHwgZGVmaW5lZChDT05GSUdfQkZJTl9TSVJfTU9EVUxFKQotCSZiZmluX3Npcl9kZXZpY2UsCisjaWZkZWYgQ09ORklHX0JGSU5fU0lSMAorCSZiZmluX3NpcjBfZGV2aWNlLAorI2VuZGlmCiAjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX0tFWUJPQVJEX0dQSU8pIHx8IGRlZmluZWQoQ09ORklHX0tFWUJPQVJEX0dQSU9fTU9EVUxFKQpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2JvYXJkcy9nZW5lcmljX2JvYXJkLmMgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvYm9hcmRzL2dlbmVyaWNfYm9hcmQuYwppbmRleCAyZmFhMDA3Li4wYmEzNjZhIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvYm9hcmRzL2dlbmVyaWNfYm9hcmQuYworKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvYm9hcmRzL2dlbmVyaWNfYm9hcmQuYwpAQCAtNjIsMTAgKzYyLDQ1IEBACiB9OwogI2VuZGlmCiAKKyNpZiBkZWZpbmVkKENPTkZJR19CRklOX1NJUikgfHwgZGVmaW5lZChDT05GSUdfQkZJTl9TSVJfTU9EVUxFKQorI2lmZGVmIENPTkZJR19CRklOX1NJUjAKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYmZpbl9zaXIwX3Jlc291cmNlc1tdID0geworCXsKKwkJLnN0YXJ0ID0gMHhGRkMwMDQwMCwKKwkJLmVuZCA9IDB4RkZDMDA0RkYsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJeworCQkuc3RhcnQgPSBJUlFfVUFSVDBfUlgsCisJCS5lbmQgPSBJUlFfVUFSVDBfUlgrMSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwl7CisJCS5zdGFydCA9IENIX1VBUlQwX1JYLAorCQkuZW5kID0gQ0hfVUFSVDBfUlgrMSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9ETUEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmaW5fc2lyMF9kZXZpY2UgPSB7CisJLm5hbWUgPSAiYmZpbl9zaXIiLAorCS5pZCA9IDAsCisJLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKGJmaW5fc2lyMF9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZSA9IGJmaW5fc2lyMF9yZXNvdXJjZXMsCit9OworI2VuZGlmCisjZW5kaWYKKwogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmdlbmVyaWNfYm9hcmRfZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7CiAjaWYgZGVmaW5lZChDT05GSUdfU01DOTFYKSB8fCBkZWZpbmVkKENPTkZJR19TTUM5MVhfTU9EVUxFKQogCSZzbWM5MXhfZGV2aWNlLAogI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19CRklOX1NJUikgfHwgZGVmaW5lZChDT05GSUdfQkZJTl9TSVJfTU9EVUxFKQorI2lmZGVmIENPTkZJR19CRklOX1NJUjAKKwkmYmZpbl9zaXIwX2RldmljZSwKKyNlbmRpZgorI2VuZGlmCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBnZW5lcmljX2JvYXJkX2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9ib2FyZHMvdGVwbGEuYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9ib2FyZHMvdGVwbGEuYwppbmRleCBjOTE3NGIzLi42Zjc3ZGJlIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvYm9hcmRzL3RlcGxhLmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2JvYXJkcy90ZXBsYS5jCkBAIC00NCw4ICs0NCw0MiBAQAogCS5yZXNvdXJjZSAgICAgID0gc21jOTF4X3Jlc291cmNlcywKIH07CiAKKyNpZiBkZWZpbmVkKENPTkZJR19CRklOX1NJUikgfHwgZGVmaW5lZChDT05GSUdfQkZJTl9TSVJfTU9EVUxFKQorI2lmZGVmIENPTkZJR19CRklOX1NJUjAKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYmZpbl9zaXIwX3Jlc291cmNlc1tdID0geworCXsKKwkJLnN0YXJ0ID0gMHhGRkMwMDQwMCwKKwkJLmVuZCA9IDB4RkZDMDA0RkYsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJeworCQkuc3RhcnQgPSBJUlFfVUFSVDBfUlgsCisJCS5lbmQgPSBJUlFfVUFSVDBfUlgrMSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwl7CisJCS5zdGFydCA9IENIX1VBUlQwX1JYLAorCQkuZW5kID0gQ0hfVUFSVDBfUlgrMSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9ETUEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmaW5fc2lyMF9kZXZpY2UgPSB7CisJLm5hbWUgPSAiYmZpbl9zaXIiLAorCS5pZCA9IDAsCisJLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKGJmaW5fc2lyMF9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZSA9IGJmaW5fc2lyMF9yZXNvdXJjZXMsCit9OworI2VuZGlmCisjZW5kaWYKKwogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnRlcGxhX2RldmljZXNbXSBfX2luaXRkYXRhID0gewogCSZzbWM5MXhfZGV2aWNlLAorI2lmIGRlZmluZWQoQ09ORklHX0JGSU5fU0lSKSB8fCBkZWZpbmVkKENPTkZJR19CRklOX1NJUl9NT0RVTEUpCisjaWZkZWYgQ09ORklHX0JGSU5fU0lSMAorCSZiZmluX3NpcjBfZGV2aWNlLAorI2VuZGlmCisjZW5kaWYKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IHRlcGxhX2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9kbWEuYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9kbWEuYwppbmRleCAyNDQxNWViLi40MmIwMDM3IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvZG1hLmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2RtYS5jCkBAIC0zMSw3ICszMSw3IEBACiAjaW5jbHVkZSA8YXNtL2JsYWNrZmluLmg+CiAjaW5jbHVkZSA8YXNtL2RtYS5oPgogCi1zdHJ1Y3QgZG1hX3JlZ2lzdGVyICpkbWFfaW9fYmFzZV9hZGRyW01BWF9CTEFDS0ZJTl9ETUFfQ0hBTk5FTF0gPSB7CitzdHJ1Y3QgZG1hX3JlZ2lzdGVyICpkbWFfaW9fYmFzZV9hZGRyW01BWF9ETUFfQ0hBTk5FTFNdID0gewogCShzdHJ1Y3QgZG1hX3JlZ2lzdGVyICopIERNQTFfMF9ORVhUX0RFU0NfUFRSLAogCShzdHJ1Y3QgZG1hX3JlZ2lzdGVyICopIERNQTFfMV9ORVhUX0RFU0NfUFRSLAogCShzdHJ1Y3QgZG1hX3JlZ2lzdGVyICopIERNQTFfMl9ORVhUX0RFU0NfUFRSLApkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2hlYWQuUyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9oZWFkLlMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxYTc3N2EuLjAwMDAwMDAKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2hlYWQuUworKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi0vKgotICogRmlsZTogICAgICAgICBhcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvaGVhZC5TCi0gKiBCYXNlZCBvbjogICAgIGFyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9oZWFkLlMKLSAqIEF1dGhvcjoKLSAqCi0gKiBDcmVhdGVkOgotICogRGVzY3JpcHRpb246ICBCRjU2MSBzdGFydHVwIGZpbGUKLSAqCi0gKiBNb2RpZmllZDoKLSAqICAgICAgICAgICAgICAgQ29weXJpZ2h0IDIwMDQtMjAwNiBBbmFsb2cgRGV2aWNlcyBJbmMuCi0gKgotICogQnVnczogICAgICAgICBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSB0aGUgZmlsZSBDT1BZSU5HLCBvciB3cml0ZQotICogdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8YXNtL2JsYWNrZmluLmg+Ci0jaWZkZWYgQ09ORklHX0JGSU5fS0VSTkVMX0NMT0NLCi0jaW5jbHVkZSA8YXNtL2Nsb2Nrcy5oPgotI2luY2x1ZGUgPG1hY2gvbWVtX2luaXQuaD4KLSNlbmRpZgotCi0uc2VjdGlvbiAubDEudGV4dAotI2lmZGVmIENPTkZJR19CRklOX0tFUk5FTF9DTE9DSwotRU5UUlkoX3N0YXJ0X2RtYV9jb2RlKQotCXAwLmggPSBoaShTSUNBX0lXUjApOwotCXAwLmwgPSBsbyhTSUNBX0lXUjApOwotCXIwLmwgPSAweDE7Ci0JW3AwXSA9IHIwOwotCVNTWU5DOwotCi0JLyoKLQkgKiAgU2V0IFBMTF9DVEwKLQkgKiAgIC0gWzE0OjA5XSA9IE1TRUxbNTowXSA6IENMS0lOIC8gVkNPIG11bHRpcGxpY2F0aW9uIGZhY3RvcnMKLQkgKiAgIC0gWzhdICAgICA9IEJZUEFTUyAgICA6IEJZUEFTUyB0aGUgUExMLCBydW4gQ0xLSU4gaW50byBDQ0xLL1NDTEsKLQkgKiAgIC0gWzddICAgICA9IG91dHB1dCBkZWxheSAoYWRkIDIwMHBzIG9mIGRlbGF5IHRvIG1lbSBzaWduYWxzKQotCSAqICAgLSBbNl0gICAgID0gaW5wdXQgZGVsYXkgKGFkZCAyMDBwcyBvZiBpbnB1dCBkZWxheSB0byBtZW0gc2lnbmFscykKLQkgKiAgIC0gWzVdICAgICA9IFBEV04gICAgICA6IDE9QWxsIENsb2NrcyBvZmYKLQkgKiAgIC0gWzNdICAgICA9IFNUT1BDSyAgICA6IDE9Q29yZSBDbG9jayBvZmYKLQkgKiAgIC0gWzFdICAgICA9IFBMTF9PRkYgICA6IDE9RGlzYWJsZSBQb3dlciB0byBQTEwKLQkgKiAgIC0gWzBdICAgICA9IERGICAgICAgICA6IDE9UGFzcyBDTEtJTi8yIHRvIFBMTCAvIDA9UGFzcyBDTEtJTiB0byBQTEwKLQkgKiAgIGFsbCBvdGhlciBiaXRzIHNldCB0byB6ZXJvCi0JICovCi0KLQlwMC5oID0gaGkoUExMX0xPQ0tDTlQpOwotCXAwLmwgPSBsbyhQTExfTE9DS0NOVCk7Ci0JcjAgPSAweDMwMChaKTsKLQl3W3AwXSA9IHIwLmw7Ci0Jc3N5bmM7Ci0KLQlQMi5IID0gaGkoRUJJVV9TREdDVEwpOwotCVAyLkwgPSBsbyhFQklVX1NER0NUTCk7Ci0JUjAgPSBbUDJdOwotCUJJVFNFVCAoUjAsIDI0KTsKLQlbUDJdID0gUjA7Ci0JU1NZTkM7Ci0KLQlyMCA9IENPTkZJR19WQ09fTVVMVCAmIDYzOyAgICAgICAvKiBMb2FkIHRoZSBWQ08gbXVsdGlwbGllciAgICAgICAgICovCi0JcjAgPSByMCA8PCA5OyAgICAgICAgICAgICAgICAgICAgLyogU2hpZnQgaXQgb3ZlciwgICAgICAgICAgICAgICAgICAqLwotCXIxID0gQ0xLSU5fSEFMRjsgICAgICAgICAgICAgICAgIC8qIERvIHdlIG5lZWQgdG8gZGl2aWRlIENMS0lOIGJ5IDI/Ki8KLQlyMCA9IHIxIHwgcjA7Ci0JcjEgPSBQTExfQllQQVNTOyAgICAgICAgICAgICAgICAgLyogQnlwYXNzIHRoZSBQTEw/ICAgICAgICAgICAgICAgICAqLwotCXIxID0gcjEgPDwgODsgICAgICAgICAgICAgICAgICAgIC8qIFNoaWZ0IGl0IG92ZXIgICAgICAgICAgICAgICAgICAgKi8KLQlyMCA9IHIxIHwgcjA7ICAgICAgICAgICAgICAgICAgICAvKiBhZGQgdGhlbSBhbGwgdG9nZXRoZXIgICAgICAgICAgICovCi0jaWZkZWYgQU5PTUFMWV8wNTAwMDI2NQotCUJJVFNFVChyMCwgMTUpOyAgICAgICAgICAgICAgICAgIC8qIEFkZCAyNTAgbVYgb2YgaHlzdGVyZXNpcyB0byBTUE9SVCBpbnB1dCBwaW5zICovCi0jZW5kaWYKLQotCXAwLmggPSBoaShQTExfQ1RMKTsKLQlwMC5sID0gbG8oUExMX0NUTCk7ICAgICAgICAgICAgICAvKiBMb2FkIHRoZSBhZGRyZXNzICAgICAgICAgICAgICAgICovCi0JY2xpIHIyOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGlzYWJsZSBpbnRlcnJ1cHRzICAgICAgICAgICAgICAqLwotCXNzeW5jOwotCXdbcDBdID0gcjAubDsgICAgICAgICAgICAgICAgICAgIC8qIFNldCB0aGUgdmFsdWUgICAgICAgICAgICAgICAgICAgKi8KLQlpZGxlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBXYWl0IGZvciB0aGUgUExMIHRvIHN0YWJsaXplICAgICovCi0Jc3RpIHIyOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRW5hYmxlIGludGVycnVwdHMgICAgICAgICAgICAgICAqLwotCi0uTGNoZWNrX2FnYWluOgotCXAwLmggPSBoaShQTExfU1RBVCk7Ci0JcDAubCA9IGxvKFBMTF9TVEFUKTsKLQlSMCA9IFdbUDBdKFopOwotCUNDID0gQklUVFNUKFIwLDUpOwotCWlmICEgQ0MganVtcCAuTGNoZWNrX2FnYWluOwotCi0JLyogQ29uZmlndXJlIFNDTEsgJiBDQ0xLIERpdmlkZXJzICovCi0JcjAgPSAoQ09ORklHX0NDTEtfQUNUX0RJViB8IENPTkZJR19TQ0xLX0RJVik7Ci0JcDAuaCA9IGhpKFBMTF9ESVYpOwotCXAwLmwgPSBsbyhQTExfRElWKTsKLQl3W3AwXSA9IHIwLmw7Ci0Jc3N5bmM7Ci0KLQlwMC5sID0gbG8oRUJJVV9TRFJSQyk7Ci0JcDAuaCA9IGhpKEVCSVVfU0RSUkMpOwotCXIwID0gbWVtX1NEUlJDOwotCXdbcDBdID0gcjAubDsKLQlzc3luYzsKLQotCVAyLkggPSBoaShFQklVX1NER0NUTCk7Ci0JUDIuTCA9IGxvKEVCSVVfU0RHQ1RMKTsKLQlSMCA9IFtQMl07Ci0JQklUQ0xSIChSMCwgMjQpOwotCXAwLmggPSBoaShFQklVX1NEU1RBVCk7Ci0JcDAubCA9IGxvKEVCSVVfU0RTVEFUKTsKLQlyMi5sID0gd1twMF07Ci0JY2MgPSBiaXR0c3QocjIsMyk7Ci0JaWYgIWNjIGp1bXAgLkxza2lwOwotCU5PUDsKLQlCSVRTRVQgKFIwLCAyMyk7Ci0uTHNraXA6Ci0JW1AyXSA9IFIwOwotCVNTWU5DOwotCi0JUjAuTCA9IGxvKG1lbV9TREdDVEwpOwotCVIwLkggPSBoaShtZW1fU0RHQ1RMKTsKLQlSMSA9IFtwMl07Ci0JUjEgPSBSMSB8IFIwOwotCVtQMl0gPSBSMTsKLQlTU1lOQzsKLQotCVJUUzsKLUVORFBST0MoX3N0YXJ0X2RtYV9jb2RlKQotI2VuZGlmIC8qIENPTkZJR19CRklOX0tFUk5FTF9DTE9DSyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2luY2x1ZGUvbWFjaC9hbm9tYWx5LmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvaW5jbHVkZS9tYWNoL2Fub21hbHkuaAppbmRleCAyMjk5MGRmLi4xYTllMTc1IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvaW5jbHVkZS9tYWNoL2Fub21hbHkuaAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvaW5jbHVkZS9tYWNoL2Fub21hbHkuaApAQCAtNyw3ICs3LDcgQEAKICAqLwogCiAvKiBUaGlzIGZpbGUgc2hvdWxlIGJlIHVwIHRvIGRhdGUgd2l0aDoKLSAqICAtIFJldmlzaW9uIFAsIDAyLzA4LzIwMDg7IEFEU1AtQkY1NjEgQmxhY2tmaW4gUHJvY2Vzc29yIEFub21hbHkgTGlzdAorICogIC0gUmV2aXNpb24gUSwgMTEvMDcvMjAwODsgQURTUC1CRjU2MSBCbGFja2ZpbiBQcm9jZXNzb3IgQW5vbWFseSBMaXN0CiAgKi8KIAogI2lmbmRlZiBfTUFDSF9BTk9NQUxZX0hfCkBAIC0yNjQsNiArMjY0LDE4IEBACiAjZGVmaW5lIEFOT01BTFlfMDUwMDAzNzEgKDEpCiAvKiBMZXZlbC1TZW5zaXRpdmUgRXh0ZXJuYWwgR1BJTyBXYWtldXBzIE1heSBDYXVzZSBJbmRlZmluaXRlIFN0YWxsICovCiAjZGVmaW5lIEFOT01BTFlfMDUwMDA0MDMgKDEpCisvKiBURVNUU0VUIEluc3RydWN0aW9uIENhdXNlcyBEYXRhIENvcnJ1cHRpb24gd2l0aCBXcml0ZWJhY2sgRGF0YSBDYWNoZSBFbmFibGVkICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDA0MTIgKDEpCisvKiBTcGVjdWxhdGl2ZSBGZXRjaGVzIENhbiBDYXVzZSBVbmRlc2lyZWQgRXh0ZXJuYWwgRklGTyBPcGVyYXRpb25zICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDA0MTYgKDEpCisvKiBNdWx0aWNoYW5uZWwgU1BPUlQgQ2hhbm5lbCBNaXNhbGlnbm1lbnQgVW5kZXIgU3BlY2lmaWMgQ29uZmlndXJhdGlvbiAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwNDI1ICgxKQorLyogU3BlY3VsYXRpdmUgRmV0Y2hlcyBvZiBJbmRpcmVjdC1Qb2ludGVyIEluc3RydWN0aW9ucyBDYW4gQ2F1c2UgRmFsc2UgSGFyZHdhcmUgRXJyb3JzICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDA0MjYgKDEpCisvKiBMb3N0L0NvcnJ1cHRlZCBMMi9MMyBNZW1vcnkgV3JpdGUgYWZ0ZXIgU3BlY3VsYXRpdmUgTDIgTWVtb3J5IFJlYWQgYnkgQ29yZSBCICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDA0MjggKF9fU0lMSUNPTl9SRVZJU0lPTl9fID4gMykKKy8qIElGTFVTSCBJbnN0cnVjdGlvbiBhdCBFbmQgb2YgSGFyZHdhcmUgTG9vcCBDYXVzZXMgSW5maW5pdGUgU3RhbGwgKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDQ0MyAoMSkKIAogLyogQW5vbWFsaWVzIHRoYXQgZG9uJ3QgZXhpc3Qgb24gdGhpcyBwcm9jICovCiAjZGVmaW5lIEFOT01BTFlfMDUwMDAxNTggKDApCkBAIC0yNzIsNSArMjg0LDcgQEAKICNkZWZpbmUgQU5PTUFMWV8wNTAwMDMxMSAoMCkKICNkZWZpbmUgQU5PTUFMWV8wNTAwMDM1MyAoMSkKICNkZWZpbmUgQU5PTUFMWV8wNTAwMDM4NiAoMSkKKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDQzMiAoMCkKKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDQzNSAoMCkKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvaW5jbHVkZS9tYWNoL2JmNTYxLmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvaW5jbHVkZS9tYWNoL2JmNTYxLmgKaW5kZXggMThiMWIzYS4uOTk2ODM2MiAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2luY2x1ZGUvbWFjaC9iZjU2MS5oCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9pbmNsdWRlL21hY2gvYmY1NjEuaApAQCAtMjE1LDcgKzIxNSw3IEBACiAjZW5kaWYKIAogI2lmbmRlZiBDUFUKLSNlcnJvciBVbmtub3duIENQVSB0eXBlIC0gVGhpcyBrZXJuZWwgZG9lc24ndCBzZWVtIHRvIGJlIGNvbmZpZ3VyZWQgcHJvcGVybHkKKyNlcnJvciAiVW5rbm93biBDUFUgdHlwZSAtIFRoaXMga2VybmVsIGRvZXNuJ3Qgc2VlbSB0byBiZSBjb25maWd1cmVkIHByb3Blcmx5IgogI2VuZGlmCiAKICNlbmRpZgkJCQkvKiBfX01BQ0hfQkY1NjFfSF9fICAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2luY2x1ZGUvbWFjaC9iZmluX3Npci5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2luY2x1ZGUvbWFjaC9iZmluX3Npci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YmI4N2U5Li4wMDAwMDAwCi0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9pbmNsdWRlL21hY2gvYmZpbl9zaXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0vKgotICogQmxhY2tmaW4gSW5mcmEtcmVkIERyaXZlcgotICoKLSAqIENvcHlyaWdodCAyMDA2LTIwMDggQW5hbG9nIERldmljZXMgSW5jLgotICoKLSAqIEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLwotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgotI2luY2x1ZGUgPGFzbS9kbWEuaD4KLSNpbmNsdWRlIDxhc20vcG9ydG11eC5oPgotCi0jZGVmaW5lIFNJUl9VQVJUX0dFVF9DSEFSKHBvcnQpICAgYmZpbl9yZWFkMTYoKHBvcnQpLT5tZW1iYXNlICsgT0ZGU0VUX1JCUikKLSNkZWZpbmUgU0lSX1VBUlRfR0VUX0RMTChwb3J0KSAgICBiZmluX3JlYWQxNigocG9ydCktPm1lbWJhc2UgKyBPRkZTRVRfRExMKQotI2RlZmluZSBTSVJfVUFSVF9HRVRfSUVSKHBvcnQpICAgIGJmaW5fcmVhZDE2KChwb3J0KS0+bWVtYmFzZSArIE9GRlNFVF9JRVIpCi0jZGVmaW5lIFNJUl9VQVJUX0dFVF9ETEgocG9ydCkgICAgYmZpbl9yZWFkMTYoKHBvcnQpLT5tZW1iYXNlICsgT0ZGU0VUX0RMSCkKLSNkZWZpbmUgU0lSX1VBUlRfR0VUX0lJUihwb3J0KSAgICBiZmluX3JlYWQxNigocG9ydCktPm1lbWJhc2UgKyBPRkZTRVRfSUlSKQotI2RlZmluZSBTSVJfVUFSVF9HRVRfTENSKHBvcnQpICAgIGJmaW5fcmVhZDE2KChwb3J0KS0+bWVtYmFzZSArIE9GRlNFVF9MQ1IpCi0jZGVmaW5lIFNJUl9VQVJUX0dFVF9HQ1RMKHBvcnQpICAgYmZpbl9yZWFkMTYoKHBvcnQpLT5tZW1iYXNlICsgT0ZGU0VUX0dDVEwpCi0KLSNkZWZpbmUgU0lSX1VBUlRfUFVUX0NIQVIocG9ydCwgdikgYmZpbl93cml0ZTE2KCgocG9ydCktPm1lbWJhc2UgKyBPRkZTRVRfVEhSKSwgdikKLSNkZWZpbmUgU0lSX1VBUlRfUFVUX0RMTChwb3J0LCB2KSAgYmZpbl93cml0ZTE2KCgocG9ydCktPm1lbWJhc2UgKyBPRkZTRVRfRExMKSwgdikKLSNkZWZpbmUgU0lSX1VBUlRfUFVUX0lFUihwb3J0LCB2KSAgYmZpbl93cml0ZTE2KCgocG9ydCktPm1lbWJhc2UgKyBPRkZTRVRfSUVSKSwgdikKLSNkZWZpbmUgU0lSX1VBUlRfUFVUX0RMSChwb3J0LCB2KSAgYmZpbl93cml0ZTE2KCgocG9ydCktPm1lbWJhc2UgKyBPRkZTRVRfRExIKSwgdikKLSNkZWZpbmUgU0lSX1VBUlRfUFVUX0xDUihwb3J0LCB2KSAgYmZpbl93cml0ZTE2KCgocG9ydCktPm1lbWJhc2UgKyBPRkZTRVRfTENSKSwgdikKLSNkZWZpbmUgU0lSX1VBUlRfUFVUX0dDVEwocG9ydCwgdikgYmZpbl93cml0ZTE2KCgocG9ydCktPm1lbWJhc2UgKyBPRkZTRVRfR0NUTCksIHYpCi0KLSNpZmRlZiBDT05GSUdfU0lSX0JGSU5fRE1BCi1zdHJ1Y3QgZG1hX3J4X2J1ZiB7Ci0JY2hhciAqYnVmOwotCWludCBoZWFkOwotCWludCB0YWlsOwotCX07Ci0jZW5kaWYgLyogQ09ORklHX1NJUl9CRklOX0RNQSAqLwotCi1zdHJ1Y3QgYmZpbl9zaXJfcG9ydCB7Ci0JdW5zaWduZWQgY2hhciBfX2lvbWVtICAgKm1lbWJhc2U7Ci0JdW5zaWduZWQgaW50ICAgICAgICAgICAgaXJxOwotCXVuc2lnbmVkIGludCAgICAgICAgICAgIGxzcjsKLQl1bnNpZ25lZCBsb25nICAgICAgICAgICBjbGs7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgICAgICAgKmRldjsKLSNpZmRlZiBDT05GSUdfU0lSX0JGSU5fRE1BCi0JaW50ICAgICAgICAgICAgICAgICAgICAgdHhfZG9uZTsKLQlzdHJ1Y3QgZG1hX3J4X2J1ZiAgICAgICByeF9kbWFfYnVmOwotCXN0cnVjdCB0aW1lcl9saXN0ICAgICAgIHJ4X2RtYV90aW1lcjsKLQlpbnQgICAgICAgICAgICAgICAgICAgICByeF9kbWFfbnJvd3M7Ci0jZW5kaWYgLyogQ09ORklHX1NJUl9CRklOX0RNQSAqLwotCXVuc2lnbmVkIGludCAgICAgICAgICAgIHR4X2RtYV9jaGFubmVsOwotCXVuc2lnbmVkIGludCAgICAgICAgICAgIHJ4X2RtYV9jaGFubmVsOwotfTsKLQotc3RydWN0IGJmaW5fc2lyX3BvcnQgc2lyX3BvcnRzW0JGSU5fVUFSVF9OUl9QT1JUU107Ci0KLXN0cnVjdCBiZmluX3Npcl9wb3J0X3JlcyB7Ci0JdW5zaWduZWQgbG9uZyAgIGJhc2VfYWRkcjsKLQlpbnQgICAgICAgICAgICAgaXJxOwotCXVuc2lnbmVkIGludCAgICByeF9kbWFfY2hhbm5lbDsKLQl1bnNpZ25lZCBpbnQgICAgdHhfZG1hX2NoYW5uZWw7Ci19OwotCi1zdHJ1Y3QgYmZpbl9zaXJfcG9ydF9yZXMgYmZpbl9zaXJfcG9ydF9yZXNvdXJjZVtdID0gewotI2lmZGVmIENPTkZJR19CRklOX1NJUjAKLQl7Ci0JMHhGRkMwMDQwMCwKLQlJUlFfVUFSVF9SWCwKLQlDSF9VQVJUX1JYLAotCUNIX1VBUlRfVFgsCi0JfSwKLSNlbmRpZgotfTsKLQotaW50IG5yX3NpcnMgPSBBUlJBWV9TSVpFKGJmaW5fc2lyX3BvcnRfcmVzb3VyY2UpOwotCi1zdHJ1Y3QgYmZpbl9zaXJfc2VsZiB7Ci0Jc3RydWN0IGJmaW5fc2lyX3BvcnQgICAgKnNpcl9wb3J0OwotCXNwaW5sb2NrX3QgICAgICAgICAgICAgIGxvY2s7Ci0JdW5zaWduZWQgaW50ICAgICAgICAgICAgb3BlbjsKLQlpbnQgICAgICAgICAgICAgICAgICAgICBzcGVlZDsKLQlpbnQgICAgICAgICAgICAgICAgICAgICBuZXdzcGVlZDsKLQotCXN0cnVjdCBza19idWZmICAgICAgICAgICp0eHNrYjsKLQlzdHJ1Y3Qgc2tfYnVmZiAgICAgICAgICAqcnhza2I7Ci0Jc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7Ci0Jc3RydWN0IGRldmljZSAgICAgICAgICAgKmRldjsKLQlzdHJ1Y3QgaXJsYXBfY2IgICAgICAgICAqaXJsYXA7Ci0Jc3RydWN0IHFvc19pbmZvICAgICAgICAgcW9zOwotCi0JaW9idWZmX3QgICAgICAgICAgICAgICAgdHhfYnVmZjsKLQlpb2J1ZmZfdCAgICAgICAgICAgICAgICByeF9idWZmOwotCi0Jc3RydWN0IHdvcmtfc3RydWN0ICAgICAgd29yazsKLQlpbnQgICAgICAgICAgICAgICAgICAgICBtdHQ7Ci19OwotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBTSVJfVUFSVF9HRVRfTFNSKHN0cnVjdCBiZmluX3Npcl9wb3J0ICpwb3J0KQotewotCXVuc2lnbmVkIGludCBsc3IgPSBiZmluX3JlYWQxNihwb3J0LT5tZW1iYXNlICsgT0ZGU0VUX0xTUik7Ci0JcG9ydC0+bHNyIHw9IChsc3IgJiAoQkl8RkV8UEV8T0UpKTsKLQlyZXR1cm4gbHNyIHwgcG9ydC0+bHNyOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgU0lSX1VBUlRfQ0xFQVJfTFNSKHN0cnVjdCBiZmluX3Npcl9wb3J0ICpwb3J0KQotewotCXBvcnQtPmxzciA9IDA7Ci0JYmZpbl9yZWFkMTYocG9ydC0+bWVtYmFzZSArIE9GRlNFVF9MU1IpOwotfQotCi0jZGVmaW5lIERSSVZFUl9OQU1FICJiZmluX3NpciIKLQotc3RhdGljIGludCBiZmluX3Npcl9od19pbml0KHZvaWQpCi17Ci0JaW50IHJldCA9IC1FTk9ERVY7Ci0jaWZkZWYgQ09ORklHX0JGSU5fU0lSMAotCXJldCA9IHBlcmlwaGVyYWxfcmVxdWVzdChQX1VBUlQwX1RYLCBEUklWRVJfTkFNRSk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQlyZXQgPSBwZXJpcGhlcmFsX3JlcXVlc3QoUF9VQVJUMF9SWCwgRFJJVkVSX05BTUUpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0jZW5kaWYKLQlyZXR1cm4gcmV0OwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2luY2x1ZGUvbWFjaC9ibGFja2Zpbi5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2luY2x1ZGUvbWFjaC9ibGFja2Zpbi5oCmluZGV4IDBlYTg2NjYuLmY3OWY2NjI2IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvaW5jbHVkZS9tYWNoL2JsYWNrZmluLmgKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2luY2x1ZGUvbWFjaC9ibGFja2Zpbi5oCkBAIC02Niw4ICs2NiwxMiBAQAogCiAjZGVmaW5lIGJmaW5fcmVhZF9TSUNfSU1BU0soeCkJCWJmaW5fcmVhZDMyKFNJQ0FfSU1BU0swICsgKHggPDwgMikpCiAjZGVmaW5lIGJmaW5fd3JpdGVfU0lDX0lNQVNLKHgsIHZhbCkJYmZpbl93cml0ZTMyKChTSUNBX0lNQVNLMCArICh4IDw8IDIpKSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU0lDQl9JTUFTSyh4KQkJYmZpbl9yZWFkMzIoU0lDQl9JTUFTSzAgKyAoeCA8PCAyKSkKKyNkZWZpbmUgYmZpbl93cml0ZV9TSUNCX0lNQVNLKHgsIHZhbCkJYmZpbl93cml0ZTMyKChTSUNCX0lNQVNLMCArICh4IDw8IDIpKSwgdmFsKQogI2RlZmluZSBiZmluX3JlYWRfU0lDX0lTUih4KQkJYmZpbl9yZWFkMzIoU0lDQV9JU1IwICsgKHggPDwgMikpCiAjZGVmaW5lIGJmaW5fd3JpdGVfU0lDX0lTUih4LCB2YWwpCWJmaW5fd3JpdGUzMigoU0lDQV9JU1IwICsgKHggPDwgMikpLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TSUNCX0lTUih4KQkJYmZpbl9yZWFkMzIoU0lDQl9JU1IwICsgKHggPDwgMikpCisjZGVmaW5lIGJmaW5fd3JpdGVfU0lDQl9JU1IoeCwgdmFsKQliZmluX3dyaXRlMzIoKFNJQ0JfSVNSMCArICh4IDw8IDIpKSwgdmFsKQogCiAjZGVmaW5lIEJGSU5fVUFSVF9OUl9QT1JUUyAgICAgIDEKIApkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2luY2x1ZGUvbWFjaC9jZGVmQkY1NjEuaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9pbmNsdWRlL21hY2gvY2RlZkJGNTYxLmgKaW5kZXggYzE0ZDYzNC4uOTVkNjA5ZiAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2luY2x1ZGUvbWFjaC9jZGVmQkY1NjEuaAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvaW5jbHVkZS9tYWNoL2NkZWZCRjU2MS5oCkBAIC0zOSw2NSArMzksMTUgQEAKIC8qaW5jbHVkZSBjb3JlIHNwZWNpZmljIHJlZ2lzdGVyIHBvaW50ZXIgZGVmaW5pdGlvbnMqLwogI2luY2x1ZGUgPGFzbS9jZGVmX0xQQmxhY2tmaW4uaD4KIAotI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCiAvKiBTeXN0ZW0gTU1SIFJlZ2lzdGVyIE1hcCAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCiAKIC8qIENsb2NrIGFuZCBTeXN0ZW0gQ29udHJvbCAoMHhGRkMwMDAwMCAtIDB4RkZDMDAwRkYpICovCiAjZGVmaW5lIGJmaW5fcmVhZF9QTExfQ1RMKCkgICAgICAgICAgICAgICAgICBiZmluX3JlYWQxNihQTExfQ1RMKQotLyogV3JpdGluZyB0byBQTExfQ1RMIGluaXRpYXRlcyBhIFBMTCByZWxvY2sgc2VxdWVuY2UuICovCi1zdGF0aWMgX19pbmxpbmVfXyB2b2lkIGJmaW5fd3JpdGVfUExMX0NUTCh1bnNpZ25lZCBpbnQgdmFsKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIGl3cjAsIGl3cjE7Ci0KLQlpZiAodmFsID09IGJmaW5fcmVhZF9QTExfQ1RMKCkpCi0JCXJldHVybjsKLQotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQkvKiBFbmFibGUgdGhlIFBMTCBXYWtldXAgYml0IGluIFNJQyBJV1IgKi8KLQlpd3IwID0gYmZpbl9yZWFkMzIoU0lDQV9JV1IwKTsKLQlpd3IxID0gYmZpbl9yZWFkMzIoU0lDQV9JV1IxKTsKLQkvKiBPbmx5IGFsbG93IFBQTCBXYWtldXApICovCi0JYmZpbl93cml0ZTMyKFNJQ0FfSVdSMCwgSVdSX0VOQUJMRSgwKSk7Ci0JYmZpbl93cml0ZTMyKFNJQ0FfSVdSMSwgMCk7Ci0KLQliZmluX3dyaXRlMTYoUExMX0NUTCwgdmFsKTsKLQlTU1lOQygpOwotCWFzbSgiSURMRTsiKTsKLQotCWJmaW5fd3JpdGUzMihTSUNBX0lXUjAsIGl3cjApOwotCWJmaW5fd3JpdGUzMihTSUNBX0lXUjEsIGl3cjEpOwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLX0KICNkZWZpbmUgYmZpbl9yZWFkX1BMTF9ESVYoKSAgICAgICAgICAgICAgICAgIGJmaW5fcmVhZDE2KFBMTF9ESVYpCiAjZGVmaW5lIGJmaW5fd3JpdGVfUExMX0RJVih2YWwpICAgICAgICAgICAgICBiZmluX3dyaXRlMTYoUExMX0RJVix2YWwpCiAjZGVmaW5lIGJmaW5fcmVhZF9WUl9DVEwoKSAgICAgICAgICAgICAgICAgICBiZmluX3JlYWQxNihWUl9DVEwpCi0vKiBXcml0aW5nIHRvIFZSX0NUTCBpbml0aWF0ZXMgYSBQTEwgcmVsb2NrIHNlcXVlbmNlLiAqLwotc3RhdGljIF9faW5saW5lX18gdm9pZCBiZmluX3dyaXRlX1ZSX0NUTCh1bnNpZ25lZCBpbnQgdmFsKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIGl3cjAsIGl3cjE7Ci0KLQlpZiAodmFsID09IGJmaW5fcmVhZF9WUl9DVEwoKSkKLQkJcmV0dXJuOwotCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCS8qIEVuYWJsZSB0aGUgUExMIFdha2V1cCBiaXQgaW4gU0lDIElXUiAqLwotCWl3cjAgPSBiZmluX3JlYWQzMihTSUNBX0lXUjApOwotCWl3cjEgPSBiZmluX3JlYWQzMihTSUNBX0lXUjEpOwotCS8qIE9ubHkgYWxsb3cgUFBMIFdha2V1cCkgKi8KLQliZmluX3dyaXRlMzIoU0lDQV9JV1IwLCBJV1JfRU5BQkxFKDApKTsKLQliZmluX3dyaXRlMzIoU0lDQV9JV1IxLCAwKTsKLQotCWJmaW5fd3JpdGUxNihWUl9DVEwsIHZhbCk7Ci0JU1NZTkMoKTsKLQlhc20oIklETEU7Iik7Ci0KLQliZmluX3dyaXRlMzIoU0lDQV9JV1IwLCBpd3IwKTsKLQliZmluX3dyaXRlMzIoU0lDQV9JV1IxLCBpd3IxKTsKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci19CiAjZGVmaW5lIGJmaW5fcmVhZF9QTExfU1RBVCgpICAgICAgICAgICAgICAgICBiZmluX3JlYWQxNihQTExfU1RBVCkKICNkZWZpbmUgYmZpbl93cml0ZV9QTExfU1RBVCh2YWwpICAgICAgICAgICAgIGJmaW5fd3JpdGUxNihQTExfU1RBVCx2YWwpCiAjZGVmaW5lIGJmaW5fcmVhZF9QTExfTE9DS0NOVCgpICAgICAgICAgICAgICBiZmluX3JlYWQxNihQTExfTE9DS0NOVCkKQEAgLTE1NzYsNCArMTUyNiw1NyBAQAogI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMF9TVEFSVF9BRERSKCkgIGJmaW5fcmVhZF9NRE1BMV9EMF9TVEFSVF9BRERSKCkKICNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QwX1NUQVJUX0FERFIodmFsKSBiZmluX3dyaXRlX01ETUExX0QwX1NUQVJUX0FERFIodmFsKQogCisvKiBUaGVzZSBuZWVkIHRvIGJlIGxhc3QgZHVlIHRvIHRoZSBjZGVmL2xpbnV4IGludGVyLWRlcGVuZGVuY2llcyAqLworI2luY2x1ZGUgPGFzbS9pcnEuaD4KKworLyogV3JpdGluZyB0byBQTExfQ1RMIGluaXRpYXRlcyBhIFBMTCByZWxvY2sgc2VxdWVuY2UuICovCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIGJmaW5fd3JpdGVfUExMX0NUTCh1bnNpZ25lZCBpbnQgdmFsKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIGl3cjAsIGl3cjE7CisKKwlpZiAodmFsID09IGJmaW5fcmVhZF9QTExfQ1RMKCkpCisJCXJldHVybjsKKworCWxvY2FsX2lycV9zYXZlX2h3KGZsYWdzKTsKKwkvKiBFbmFibGUgdGhlIFBMTCBXYWtldXAgYml0IGluIFNJQyBJV1IgKi8KKwlpd3IwID0gYmZpbl9yZWFkMzIoU0lDQV9JV1IwKTsKKwlpd3IxID0gYmZpbl9yZWFkMzIoU0lDQV9JV1IxKTsKKwkvKiBPbmx5IGFsbG93IFBQTCBXYWtldXApICovCisJYmZpbl93cml0ZTMyKFNJQ0FfSVdSMCwgSVdSX0VOQUJMRSgwKSk7CisJYmZpbl93cml0ZTMyKFNJQ0FfSVdSMSwgMCk7CisKKwliZmluX3dyaXRlMTYoUExMX0NUTCwgdmFsKTsKKwlTU1lOQygpOworCWFzbSgiSURMRTsiKTsKKworCWJmaW5fd3JpdGUzMihTSUNBX0lXUjAsIGl3cjApOworCWJmaW5fd3JpdGUzMihTSUNBX0lXUjEsIGl3cjEpOworCWxvY2FsX2lycV9yZXN0b3JlX2h3KGZsYWdzKTsKK30KKworLyogV3JpdGluZyB0byBWUl9DVEwgaW5pdGlhdGVzIGEgUExMIHJlbG9jayBzZXF1ZW5jZS4gKi8KK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgYmZpbl93cml0ZV9WUl9DVEwodW5zaWduZWQgaW50IHZhbCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzLCBpd3IwLCBpd3IxOworCisJaWYgKHZhbCA9PSBiZmluX3JlYWRfVlJfQ1RMKCkpCisJCXJldHVybjsKKworCWxvY2FsX2lycV9zYXZlX2h3KGZsYWdzKTsKKwkvKiBFbmFibGUgdGhlIFBMTCBXYWtldXAgYml0IGluIFNJQyBJV1IgKi8KKwlpd3IwID0gYmZpbl9yZWFkMzIoU0lDQV9JV1IwKTsKKwlpd3IxID0gYmZpbl9yZWFkMzIoU0lDQV9JV1IxKTsKKwkvKiBPbmx5IGFsbG93IFBQTCBXYWtldXApICovCisJYmZpbl93cml0ZTMyKFNJQ0FfSVdSMCwgSVdSX0VOQUJMRSgwKSk7CisJYmZpbl93cml0ZTMyKFNJQ0FfSVdSMSwgMCk7CisKKwliZmluX3dyaXRlMTYoVlJfQ1RMLCB2YWwpOworCVNTWU5DKCk7CisJYXNtKCJJRExFOyIpOworCisJYmZpbl93cml0ZTMyKFNJQ0FfSVdSMCwgaXdyMCk7CisJYmZpbl93cml0ZTMyKFNJQ0FfSVdSMSwgaXdyMSk7CisJbG9jYWxfaXJxX3Jlc3RvcmVfaHcoZmxhZ3MpOworfQorCiAjZW5kaWYJCQkJLyogX0NERUZfQkY1NjFfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2luY2x1ZGUvbWFjaC9kZWZCRjU2MS5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2luY2x1ZGUvbWFjaC9kZWZCRjU2MS5oCmluZGV4IDRlY2EyMDIuLmQ3YzUwOTcgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9pbmNsdWRlL21hY2gvZGVmQkY1NjEuaAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvaW5jbHVkZS9tYWNoL2RlZkJGNTYxLmgKQEAgLTkxMiw2ICs5MTIsOSBAQAogI2RlZmluZSBBQ1RJVkVfUExMRElTQUJMRUQJMHgwMDA0CS8qIFByb2Nlc3NvciBJbiBBY3RpdmUgTW9kZSBXaXRoIFBMTCBEaXNhYmxlZCAgICovCiAjZGVmaW5lCVBMTF9MT0NLRUQJCQkweDAwMjAJLyogUExMX0xPQ0tDTlQgSGFzIEJlZW4gUmVhY2hlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAKKy8qIFNJQ0FfU1lTQ1IgTWFza3MgKi8KKyNkZWZpbmUgQ09SRUJfU1JBTV9JTklUCQkweDAwMjAKKwogLyogU1dSU1QgTWFzayAqLwogI2RlZmluZSBTWVNURU1fUkVTRVQgICAgICAgICAgIDB4MDAwNwkvKiBJbml0aWF0ZXMgYSBzeXN0ZW0gc29mdHdhcmUgcmVzZXQgKi8KICNkZWZpbmUgRE9VQkxFX0ZBVUxUX0EgICAgICAgICAweDAwMDgJLyogQ29yZSBBIERvdWJsZSBGYXVsdCBDYXVzZXMgUmVzZXQgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9pbmNsdWRlL21hY2gvZG1hLmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvaW5jbHVkZS9tYWNoL2RtYS5oCmluZGV4IDhiYzQ2Y2QuLjEzNjQ3YzcgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9pbmNsdWRlL21hY2gvZG1hLmgKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2luY2x1ZGUvbWFjaC9kbWEuaApAQCAtMSwxMyArMSwxNyBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICBCRi01MzMvMi8xIFNwZWNpZmljIERlY2xhcmF0aW9ucwotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIG1hY2gvZG1hLmggLSBhcmNoLXNwZWNpZmljIERNQSBkZWZpbmVzCisgKgorICogQ29weXJpZ2h0IDIwMDQtMjAwOCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgorICovCiAKICNpZm5kZWYgX01BQ0hfRE1BX0hfCiAjZGVmaW5lIF9NQUNIX0RNQV9IXwogCi0jZGVmaW5lIE1BWF9CTEFDS0ZJTl9ETUFfQ0hBTk5FTCAzNgorI2RlZmluZSBNQVhfRE1BX0NIQU5ORUxTIDM2CisKKy8qIFsjNDI2N10gSU1ETUEgY2hhbm5lbHMgaGF2ZSBubyBQRVJJUEhFUkFMX01BUCBNTVIgKi8KKyNkZWZpbmUgTUFYX0RNQV9TVVNQRU5EX0NIQU5ORUxTIDMyCiAKICNkZWZpbmUgQ0hfUFBJMAkJCTAKICNkZWZpbmUgQ0hfUFBJCQkJKENIX1BQSTApCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvaW5jbHVkZS9tYWNoL2dwaW8uaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9pbmNsdWRlL21hY2gvZ3Bpby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4ODJmNzkKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvaW5jbHVkZS9tYWNoL2dwaW8uaApAQCAtMCwwICsxLDY4IEBACisvKgorICogRmlsZTogYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2luY2x1ZGUvbWFjaC9ncGlvLmgKKyAqIEJ1Z3M6IEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLworICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCisgKi8KKworCisjaWZuZGVmIF9NQUNIX0dQSU9fSF8KKyNkZWZpbmUgX01BQ0hfR1BJT19IXworCisjZGVmaW5lIE1BWF9CTEFDS0ZJTl9HUElPUyA0OAorCisjZGVmaW5lCUdQSU9fUEYwCTAKKyNkZWZpbmUJR1BJT19QRjEJMQorI2RlZmluZQlHUElPX1BGMgkyCisjZGVmaW5lCUdQSU9fUEYzCTMKKyNkZWZpbmUJR1BJT19QRjQJNAorI2RlZmluZQlHUElPX1BGNQk1CisjZGVmaW5lCUdQSU9fUEY2CTYKKyNkZWZpbmUJR1BJT19QRjcJNworI2RlZmluZQlHUElPX1BGOAk4CisjZGVmaW5lCUdQSU9fUEY5CTkKKyNkZWZpbmUJR1BJT19QRjEwCTEwCisjZGVmaW5lCUdQSU9fUEYxMQkxMQorI2RlZmluZQlHUElPX1BGMTIJMTIKKyNkZWZpbmUJR1BJT19QRjEzCTEzCisjZGVmaW5lCUdQSU9fUEYxNAkxNAorI2RlZmluZQlHUElPX1BGMTUJMTUKKyNkZWZpbmUJR1BJT19QRjE2CTE2CisjZGVmaW5lCUdQSU9fUEYxNwkxNworI2RlZmluZQlHUElPX1BGMTgJMTgKKyNkZWZpbmUJR1BJT19QRjE5CTE5CisjZGVmaW5lCUdQSU9fUEYyMAkyMAorI2RlZmluZQlHUElPX1BGMjEJMjEKKyNkZWZpbmUJR1BJT19QRjIyCTIyCisjZGVmaW5lCUdQSU9fUEYyMwkyMworI2RlZmluZQlHUElPX1BGMjQJMjQKKyNkZWZpbmUJR1BJT19QRjI1CTI1CisjZGVmaW5lCUdQSU9fUEYyNgkyNgorI2RlZmluZQlHUElPX1BGMjcJMjcKKyNkZWZpbmUJR1BJT19QRjI4CTI4CisjZGVmaW5lCUdQSU9fUEYyOQkyOQorI2RlZmluZQlHUElPX1BGMzAJMzAKKyNkZWZpbmUJR1BJT19QRjMxCTMxCisjZGVmaW5lCUdQSU9fUEYzMgkzMgorI2RlZmluZQlHUElPX1BGMzMJMzMKKyNkZWZpbmUJR1BJT19QRjM0CTM0CisjZGVmaW5lCUdQSU9fUEYzNQkzNQorI2RlZmluZQlHUElPX1BGMzYJMzYKKyNkZWZpbmUJR1BJT19QRjM3CTM3CisjZGVmaW5lCUdQSU9fUEYzOAkzOAorI2RlZmluZQlHUElPX1BGMzkJMzkKKyNkZWZpbmUJR1BJT19QRjQwCTQwCisjZGVmaW5lCUdQSU9fUEY0MQk0MQorI2RlZmluZQlHUElPX1BGNDIJNDIKKyNkZWZpbmUJR1BJT19QRjQzCTQzCisjZGVmaW5lCUdQSU9fUEY0NAk0NAorI2RlZmluZQlHUElPX1BGNDUJNDUKKyNkZWZpbmUJR1BJT19QRjQ2CTQ2CisjZGVmaW5lCUdQSU9fUEY0Nwk0NworCisjZGVmaW5lIFBPUlRfRklPMCBHUElPXzAKKyNkZWZpbmUgUE9SVF9GSU8xIEdQSU9fMTYKKyNkZWZpbmUgUE9SVF9GSU8yIEdQSU9fMzIKKworI2VuZGlmIC8qIF9NQUNIX0dQSU9fSF8gKi8KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9pbmNsdWRlL21hY2gvbWVtX2luaXQuaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9pbmNsdWRlL21hY2gvbWVtX2luaXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTE2MzI2MC4uMDAwMDAwMAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvaW5jbHVkZS9tYWNoL21lbV9pbml0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyOTUgKzAsMCBAQAotLyoKLSAqIEZpbGU6ICAgICAgICAgaW5jbHVkZS9hc20tYmxhY2tmaW4vbWFjaC1iZjU2MS9tZW1faW5pdC5oCi0gKiBCYXNlZCBvbjoKLSAqIEF1dGhvcjoKLSAqCi0gKiBDcmVhdGVkOgotICogRGVzY3JpcHRpb246Ci0gKgotICogUmV2OgotICoKLSAqIE1vZGlmaWVkOgotICoKLSAqIEJ1Z3M6ICAgICAgICAgRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gKiBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuCi0gKiBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotICovCi0KLSNpZiAoQ09ORklHX01FTV9NVDQ4TEMxNk0xNkEyVEdfNzUgfHwgQ09ORklHX01FTV9NVDQ4TEM2NE00QTJGQl83RSB8fCBDT05GSUdfTUVNX0dFTkVSSUNfQk9BUkQgfHwgQ09ORklHX01FTV9NVDQ4TEM4TTMyQjJCNV83KQotI2lmIChDT05GSUdfU0NMS19IWiA+IDExOTQwMjk4NSkKLSNkZWZpbmUgU0RSQU1fdFJQICAgICAgIFRSUF8yCi0jZGVmaW5lIFNEUkFNX3RSUF9udW0gICAyCi0jZGVmaW5lIFNEUkFNX3RSQVMgICAgICBUUkFTXzcKLSNkZWZpbmUgU0RSQU1fdFJBU19udW0gIDcKLSNkZWZpbmUgU0RSQU1fdFJDRCAgICAgIFRSQ0RfMgotI2RlZmluZSBTRFJBTV90V1IgICAgICAgVFdSXzIKLSNlbmRpZgotI2lmIChDT05GSUdfU0NMS19IWiA+IDEwNDQ3NzYxMikgJiYgKENPTkZJR19TQ0xLX0haIDw9IDExOTQwMjk4NSkKLSNkZWZpbmUgU0RSQU1fdFJQICAgICAgIFRSUF8yCi0jZGVmaW5lIFNEUkFNX3RSUF9udW0gICAyCi0jZGVmaW5lIFNEUkFNX3RSQVMgICAgICBUUkFTXzYKLSNkZWZpbmUgU0RSQU1fdFJBU19udW0gIDYKLSNkZWZpbmUgU0RSQU1fdFJDRCAgICAgIFRSQ0RfMgotI2RlZmluZSBTRFJBTV90V1IgICAgICAgVFdSXzIKLSNlbmRpZgotI2lmIChDT05GSUdfU0NMS19IWiA+IDg5NTUyMjM5KSAmJiAoQ09ORklHX1NDTEtfSFogPD0gMTA0NDc3NjEyKQotI2RlZmluZSBTRFJBTV90UlAgICAgICAgVFJQXzIKLSNkZWZpbmUgU0RSQU1fdFJQX251bSAgIDIKLSNkZWZpbmUgU0RSQU1fdFJBUyAgICAgIFRSQVNfNQotI2RlZmluZSBTRFJBTV90UkFTX251bSAgNQotI2RlZmluZSBTRFJBTV90UkNEICAgICAgVFJDRF8yCi0jZGVmaW5lIFNEUkFNX3RXUiAgICAgICBUV1JfMgotI2VuZGlmCi0jaWYgKENPTkZJR19TQ0xLX0haID4gNzQ2MjY4NjYpICYmIChDT05GSUdfU0NMS19IWiA8PSA4OTU1MjIzOSkKLSNkZWZpbmUgU0RSQU1fdFJQICAgICAgIFRSUF8yCi0jZGVmaW5lIFNEUkFNX3RSUF9udW0gICAyCi0jZGVmaW5lIFNEUkFNX3RSQVMgICAgICBUUkFTXzQKLSNkZWZpbmUgU0RSQU1fdFJBU19udW0gIDQKLSNkZWZpbmUgU0RSQU1fdFJDRCAgICAgIFRSQ0RfMgotI2RlZmluZSBTRFJBTV90V1IgICAgICAgVFdSXzIKLSNlbmRpZgotI2lmIChDT05GSUdfU0NMS19IWiA+IDY2NjY2NjY3KSAmJiAoQ09ORklHX1NDTEtfSFogPD0gNzQ2MjY4NjYpCi0jZGVmaW5lIFNEUkFNX3RSUCAgICAgICBUUlBfMgotI2RlZmluZSBTRFJBTV90UlBfbnVtICAgMgotI2RlZmluZSBTRFJBTV90UkFTICAgICAgVFJBU18zCi0jZGVmaW5lIFNEUkFNX3RSQVNfbnVtICAzCi0jZGVmaW5lIFNEUkFNX3RSQ0QgICAgICBUUkNEXzIKLSNkZWZpbmUgU0RSQU1fdFdSICAgICAgIFRXUl8yCi0jZW5kaWYKLSNpZiAoQ09ORklHX1NDTEtfSFogPiA1OTcwMTQ5MykgJiYgKENPTkZJR19TQ0xLX0haIDw9IDY2NjY2NjY3KQotI2RlZmluZSBTRFJBTV90UlAgICAgICAgVFJQXzEKLSNkZWZpbmUgU0RSQU1fdFJQX251bSAgIDEKLSNkZWZpbmUgU0RSQU1fdFJBUyAgICAgIFRSQVNfNAotI2RlZmluZSBTRFJBTV90UkFTX251bSAgMwotI2RlZmluZSBTRFJBTV90UkNEICAgICAgVFJDRF8xCi0jZGVmaW5lIFNEUkFNX3RXUiAgICAgICBUV1JfMgotI2VuZGlmCi0jaWYgKENPTkZJR19TQ0xLX0haID4gNDQ3NzYxMTkpICYmIChDT05GSUdfU0NMS19IWiA8PSA1OTcwMTQ5MykKLSNkZWZpbmUgU0RSQU1fdFJQICAgICAgIFRSUF8xCi0jZGVmaW5lIFNEUkFNX3RSUF9udW0gICAxCi0jZGVmaW5lIFNEUkFNX3RSQVMgICAgICBUUkFTXzMKLSNkZWZpbmUgU0RSQU1fdFJBU19udW0gIDMKLSNkZWZpbmUgU0RSQU1fdFJDRCAgICAgIFRSQ0RfMQotI2RlZmluZSBTRFJBTV90V1IgICAgICAgVFdSXzIKLSNlbmRpZgotI2lmIChDT05GSUdfU0NMS19IWiA+IDI5ODUwNzQ2KSAmJiAoQ09ORklHX1NDTEtfSFogPD0gNDQ3NzYxMTkpCi0jZGVmaW5lIFNEUkFNX3RSUCAgICAgICBUUlBfMQotI2RlZmluZSBTRFJBTV90UlBfbnVtICAgMQotI2RlZmluZSBTRFJBTV90UkFTICAgICAgVFJBU18yCi0jZGVmaW5lIFNEUkFNX3RSQVNfbnVtICAyCi0jZGVmaW5lIFNEUkFNX3RSQ0QgICAgICBUUkNEXzEKLSNkZWZpbmUgU0RSQU1fdFdSICAgICAgIFRXUl8yCi0jZW5kaWYKLSNpZiAoQ09ORklHX1NDTEtfSFogPD0gMjk4NTA3NDYpCi0jZGVmaW5lIFNEUkFNX3RSUCAgICAgICBUUlBfMQotI2RlZmluZSBTRFJBTV90UlBfbnVtICAgMQotI2RlZmluZSBTRFJBTV90UkFTICAgICAgVFJBU18xCi0jZGVmaW5lIFNEUkFNX3RSQVNfbnVtICAxCi0jZGVmaW5lIFNEUkFNX3RSQ0QgICAgICBUUkNEXzEKLSNkZWZpbmUgU0RSQU1fdFdSICAgICAgIFRXUl8yCi0jZW5kaWYKLSNlbmRpZgotCi0jaWYgKENPTkZJR19NRU1fTVQ0OExDMTZNMTZBMlRHXzc1KQotICAvKlNEUkFNIElORk9STUFUSU9OOiAqLwotI2RlZmluZSBTRFJBTV9UcmVmICA2NAkJLyogUmVmcmVzaCBwZXJpb2QgaW4gbWlsbGlzZWNvbmRzICAgKi8KLSNkZWZpbmUgU0RSQU1fTlJBICAgODE5MgkvKiBOdW1iZXIgb2Ygcm93IGFkZHJlc3NlcyBpbiBTRFJBTSAqLwotI2RlZmluZSBTRFJBTV9DTCAgICBDTF8zCi0jZW5kaWYKLQotI2lmIChDT05GSUdfTUVNX01UNDhMQzY0TTRBMkZCXzdFKQotICAvKlNEUkFNIElORk9STUFUSU9OOiAqLwotI2RlZmluZSBTRFJBTV9UcmVmICA2NAkJLyogUmVmcmVzaCBwZXJpb2QgaW4gbWlsbGlzZWNvbmRzICAgKi8KLSNkZWZpbmUgU0RSQU1fTlJBICAgODE5MgkvKiBOdW1iZXIgb2Ygcm93IGFkZHJlc3NlcyBpbiBTRFJBTSAqLwotI2RlZmluZSBTRFJBTV9DTCAgICBDTF8zCi0jZW5kaWYKLQotI2lmIChDT05GSUdfTUVNX01UNDhMQzhNMzJCMkI1XzcpCi0gIC8qU0RSQU0gSU5GT1JNQVRJT046ICovCi0jZGVmaW5lIFNEUkFNX1RyZWYgIDY0CQkvKiBSZWZyZXNoIHBlcmlvZCBpbiBtaWxsaXNlY29uZHMgICAqLwotI2RlZmluZSBTRFJBTV9OUkEgICA0MDk2CS8qIE51bWJlciBvZiByb3cgYWRkcmVzc2VzIGluIFNEUkFNICovCi0jZGVmaW5lIFNEUkFNX0NMICAgIENMXzMKLSNlbmRpZgotCi0jaWYgKENPTkZJR19NRU1fR0VORVJJQ19CT0FSRCkKLSAgLypTRFJBTSBJTkZPUk1BVElPTjogTW9kaWZ5IHRoaXMgZm9yIHlvdXIgYm9hcmQgKi8KLSNkZWZpbmUgU0RSQU1fVHJlZiAgNjQJCS8qIFJlZnJlc2ggcGVyaW9kIGluIG1pbGxpc2Vjb25kcyAgICovCi0jZGVmaW5lIFNEUkFNX05SQSAgIDgxOTIJLyogTnVtYmVyIG9mIHJvdyBhZGRyZXNzZXMgaW4gU0RSQU0gKi8KLSNkZWZpbmUgU0RSQU1fQ0wgICAgQ0xfMwotI2VuZGlmCi0KLS8qIEVxdWF0aW9uIGZyb20gc2VjdGlvbiAxNyAocDE3LTQ2KSBvZiBCRjUzMyBIUk0gKi8KLSNkZWZpbmUgbWVtX1NEUlJDICAgICAgICgoKENPTkZJR19TQ0xLX0haIC8gMTAwMCkgKiBTRFJBTV9UcmVmKSAvIFNEUkFNX05SQSkgLSAoU0RSQU1fdFJBU19udW0gKyBTRFJBTV90UlBfbnVtKQotCi0vKiBFbmFibGUgU0NMSyBPdXQgKi8KLSNkZWZpbmUgbWVtX1NER0NUTCAgICAgICAgKFNDVExFIHwgU0RSQU1fQ0wgfCBTRFJBTV90UkFTIHwgU0RSQU1fdFJQIHwgU0RSQU1fdFJDRCB8IFNEUkFNX3RXUiB8IFBTUykKLQotI2lmIGRlZmluZWQgQ09ORklHX0NMS0lOX0hBTEYKLSNkZWZpbmUgQ0xLSU5fSEFMRiAgICAgICAxCi0jZWxzZQotI2RlZmluZSBDTEtJTl9IQUxGICAgICAgIDAKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCBDT05GSUdfUExMX0JZUEFTUwotI2RlZmluZSBQTExfQllQQVNTICAgICAgMQotI2Vsc2UKLSNkZWZpbmUgUExMX0JZUEFTUyAgICAgICAwCi0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKkN1cnJlbnRseSBOb3QgQmVpbmcgVXNlZCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMX1dBVCAgKChDT05GSUdfRkxBU0hfU1BFRURfQldBVCAqIDQpIC8gKDQwMDAwMDAwMDAgLyBDT05GSUdfU0NMS19IWikpICsgMQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTF9SQVQgICgoQ09ORklHX0ZMQVNIX1NQRUVEX0JSQVQgKiA0KSAvICg0MDAwMDAwMDAwIC8gQ09ORklHX1NDTEtfSFopKSArIDEKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVExfSFQgICAoKENPTkZJR19GTEFTSF9TUEVFRF9CSFQgICogNCkgLyAoNDAwMDAwMDAwMCAvIENPTkZJR19TQ0xLX0haKSkKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVExfU1QgICAoKENPTkZJR19GTEFTSF9TUEVFRF9CU1QgICogNCkgLyAoNDAwMDAwMDAwMCAvIENPTkZJR19TQ0xLX0haKSkgKyAxCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMX1RUICAgKChDT05GSUdfRkxBU0hfU1BFRURfQlRUICAqIDQpIC8gKDQwMDAwMDAwMDAgLyBDT05GSUdfU0NMS19IWikpICsgMQotCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1RUID4gMykKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1RUICAgQjBUVF80Ci0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfVFQgPT0gMykKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1RUICAgQjBUVF8zCi0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfVFQgPT0gMikKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1RUICAgQjBUVF8yCi0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfVFQgPCAyKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfVFQgICBCMFRUXzEKLSNlbmRpZgotCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1NUID4gMykKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1NUICAgQjBTVF80Ci0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfU1QgPT0gMykKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1NUICAgQjBTVF8zCi0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfU1QgPT0gMikKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1NUICAgQjBTVF8yCi0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfU1QgPCAyKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfU1QgICBCMFNUXzEKLSNlbmRpZgotCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX0hUID4gMikKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX0hUICAgQjBIVF8zCi0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfSFQgPT0gMikKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX0hUICAgQjBIVF8yCi0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfSFQgPT0gMSkKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX0hUICAgQjBIVF8xCi0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfSFQgPT0gMCAmJiBDT05GSUdfRkxBU0hfU1BFRURfQkhUID09IDApCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9IVCAgIEIwSFRfMAotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX0hUID09IDAgJiYgQ09ORklHX0ZMQVNIX1NQRUVEX0JIVCAhPSAwKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfSFQgICBCMEhUXzEKLSNlbmRpZgotCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1dBVCA+IDE0KQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfV0FUICBCMFdBVF8xNQotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1dBVCA9PSAxNCkKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1dBVCAgQjBXQVRfMTQKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9XQVQgPT0gMTMpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9XQVQgIEIwV0FUXzEzCi0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfV0FUID09IDEyKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfV0FUICBCMFdBVF8xMgotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1dBVCA9PSAxMSkKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1dBVCAgQjBXQVRfMTEKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9XQVQgPT0gMTApCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9XQVQgIEIwV0FUXzEwCi0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfV0FUID09IDkpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9XQVQgIEIwV0FUXzkKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9XQVQgPT0gOCkKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1dBVCAgQjBXQVRfOAotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1dBVCA9PSA3KQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfV0FUICBCMFdBVF83Ci0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfV0FUID09IDYpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9XQVQgIEIwV0FUXzYKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9XQVQgPT0gNSkKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1dBVCAgQjBXQVRfNQotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1dBVCA9PSA0KQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfV0FUICBCMFdBVF80Ci0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfV0FUID09IDMpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9XQVQgIEIwV0FUXzMKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9XQVQgPT0gMikKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1dBVCAgQjBXQVRfMgotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1dBVCA9PSAxKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfV0FUICBCMFdBVF8xCi0jZW5kaWYKLQotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9SQVQgPiAxNCkKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1JBVCAgQjBSQVRfMTUKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9SQVQgPT0gMTQpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9SQVQgIEIwUkFUXzE0Ci0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfUkFUID09IDEzKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfUkFUICBCMFJBVF8xMwotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1JBVCA9PSAxMikKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1JBVCAgQjBSQVRfMTIKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9SQVQgPT0gMTEpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9SQVQgIEIwUkFUXzExCi0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfUkFUID09IDEwKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfUkFUICBCMFJBVF8xMAotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1JBVCA9PSA5KQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfUkFUICBCMFJBVF85Ci0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfUkFUID09IDgpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9SQVQgIEIwUkFUXzgKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9SQVQgPT0gNykKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1JBVCAgQjBSQVRfNwotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1JBVCA9PSA2KQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfUkFUICBCMFJBVF82Ci0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfUkFUID09IDUpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9SQVQgIEIwUkFUXzUKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9SQVQgPT0gNCkKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1JBVCAgQjBSQVRfNAotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1JBVCA9PSAzKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfUkFUICBCMFJBVF8zCi0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfUkFUID09IDIpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9SQVQgIEIwUkFUXzIKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9SQVQgPT0gMSkKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1JBVCAgQjBSQVRfMQotI2VuZGlmCi0KLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwICBcCi0JKGZsYXNoX0VCSVVfQU1CQ1RMMF9XQVQgfCBmbGFzaF9FQklVX0FNQkNUTDBfUkFUIHwgZmxhc2hfRUJJVV9BTUJDVEwwX0hUIHwgXAotCSBmbGFzaF9FQklVX0FNQkNUTDBfU1QgfCBmbGFzaF9FQklVX0FNQkNUTDBfVFQgfCBDT05GSUdfRkxBU0hfU1BFRURfUkRZRU4pCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvaW5jbHVkZS9tYWNoL21lbV9tYXAuaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9pbmNsdWRlL21hY2gvbWVtX21hcC5oCmluZGV4IGYxZDRjMDYuLjQxOWRmZmQgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9pbmNsdWRlL21hY2gvbWVtX21hcC5oCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9pbmNsdWRlL21hY2gvbWVtX21hcC5oCkBAIC04NSw0ICs4NSw4NCBAQAogI2RlZmluZSBMMV9TQ1JBVENIX1NUQVJUCUNPUkVBX0wxX1NDUkFUQ0hfU1RBUlQKICNkZWZpbmUgTDFfU0NSQVRDSF9MRU5HVEgJMHgxMDAwCiAKKyNpZmRlZiBfX0FTU0VNQkxZX18KKworLyoKKyAqIFRoZSBmb2xsb3dpbmcgbWFjcm9zIGJvdGggcmV0dXJuIHRoZSBhZGRyZXNzIG9mIHRoZSBQREEgZm9yIHRoZQorICogY3VycmVudCBjb3JlLgorICoKKyAqIEluIGl0cyBmaXJzdCBzYWZlIChhbmQgaGFpcnkpIGZvcm0sIHRoZSBtYWNybyBuZWl0aGVyIGNsb2JiZXJzIGFueQorICogcmVnaXN0ZXIgYXNpZGUgb2YgdGhlIG91dHB1dCBQcmVnLCBub3IgdXNlcyB0aGUgc3RhY2ssIHNpbmNlIGl0CisgKiBjb3VsZCBiZSBjYWxsZWQgd2l0aCBhbiBpbnZhbGlkIHN0YWNrIHBvaW50ZXIsIG9yIHRoZSBjdXJyZW50IHN0YWNrCisgKiBzcGFjZSBiZWluZyB1bmNvdmVyZWQgYnkgYW55IENQTEIgKGUuZy4gZWFybHkgZXhjZXB0aW9uIGhhbmRsaW5nKS4KKyAqCisgKiBUaGUgY29uc3RyYWludHMgb24gdGhlIHNlY29uZCBmb3JtIGFyZSBhIGJpdCByZWxheGVkLCBhbmQgdGhlIGNvZGUKKyAqIGlzIGFsbG93ZWQgdG8gdXNlIHRoZSBzcGVjaWZpZWQgRHJlZyBmb3IgZGV0ZXJtaW5pbmcgdGhlIFBEQQorICogYWRkcmVzcyB0byBiZSByZXR1cm5lZCBpbnRvIFByZWcuCisgKi8KKyNpZmRlZiBDT05GSUdfU01QCisjZGVmaW5lIEdFVF9QREFfU0FGRShwcmVnKQkJXAorCXByZWcubCA9IGxvKERTUElEKTsJCVwKKwlwcmVnLmggPSBoaShEU1BJRCk7CQlcCisJcHJlZyA9IFtwcmVnXTsJCQlcCisJcHJlZyA9IHByZWcgPDwgMjsJCVwKKwlwcmVnID0gcHJlZyA8PCAyOwkJXAorCXByZWcgPSBwcmVnIDw8IDI7CQlcCisJcHJlZyA9IHByZWcgPDwgMjsJCVwKKwlwcmVnID0gcHJlZyA8PCAyOwkJXAorCXByZWcgPSBwcmVnIDw8IDI7CQlcCisJcHJlZyA9IHByZWcgPDwgMjsJCVwKKwlwcmVnID0gcHJlZyA8PCAyOwkJXAorCXByZWcgPSBwcmVnIDw8IDI7CQlcCisJcHJlZyA9IHByZWcgPDwgMjsJCVwKKwlwcmVnID0gcHJlZyA8PCAyOwkJXAorCXByZWcgPSBwcmVnIDw8IDI7CQlcCisJaWYgY2MganVtcCAyZjsJCQlcCisJY2MgPSBwcmVnID09IDB4MDsJCVwKKwlwcmVnLmwgPSBfY3B1X3BkYTsJCVwKKwlwcmVnLmggPSBfY3B1X3BkYTsJCVwKKwlpZiAhY2MganVtcCAzZjsJCQlcCisxOgkJCQkJXAorCS8qIHByZWcgPSAweDA7ICovCQlcCisJY2MgPSAhY2M7IC8qIHJlc3RvcmUgY2MgdG8gMCAqLwlcCisJanVtcCA0ZjsJCQlcCisyOgkJCQkJXAorCWNjID0gcHJlZyA9PSAweDA7CQlcCisJcHJlZy5sID0gX2NwdV9wZGE7CQlcCisJcHJlZy5oID0gX2NwdV9wZGE7CQlcCisJaWYgY2MganVtcCA0ZjsJCQlcCisJLyogcHJlZyA9IDB4MTAwMDAwMDsgKi8JCVwKKwljYyA9ICFjYzsgLyogcmVzdG9yZSBjYyB0byAxICovCVwKKzM6CQkJCQlcCisJcHJlZyA9IFtwcmVnXTsJCQlcCis0OgorCisjZGVmaW5lIEdFVF9QREEocHJlZywgZHJlZykJCVwKKwlwcmVnLmwgPSBsbyhEU1BJRCk7CQlcCisJcHJlZy5oID0gaGkoRFNQSUQpOwkJXAorCWRyZWcgPSBbcHJlZ107CQkJXAorCXByZWcubCA9IF9jcHVfcGRhOwkJXAorCXByZWcuaCA9IF9jcHVfcGRhOwkJXAorCWNjID0gYml0dHN0KGRyZWcsIDApOwkJXAorCWlmICFjYyBqdW1wIDFmOwkJCVwKKwlwcmVnID0gW3ByZWddOwkJCVwKKzE6CQkJCQlcCisKKyNkZWZpbmUgR0VUX0NQVUlEKHByZWcsIGRyZWcpCQlcCisJcHJlZy5sID0gbG8oRFNQSUQpOwkJXAorCXByZWcuaCA9IGhpKERTUElEKTsJCVwKKwlkcmVnID0gW3ByZWddOwkJCVwKKwlkcmVnID0gUk9UIGRyZWcgQlkgLTE7CQlcCisJZHJlZyA9IENDOworCisjZWxzZQorI2RlZmluZSBHRVRfUERBX1NBRkUocHJlZykJCVwKKwlwcmVnLmwgPSBfY3B1X3BkYTsJCVwKKwlwcmVnLmggPSBfY3B1X3BkYTsKKworI2RlZmluZSBHRVRfUERBKHByZWcsIGRyZWcpCUdFVF9QREFfU0FGRShwcmVnKQorI2VuZGlmIC8qIENPTkZJR19TTVAgKi8KKworI2VuZGlmIC8qIF9fQVNTRU1CTFlfXyAqLworCiAjZW5kaWYJCQkJLyogX01FTV9NQVBfNTMzX0hfICovCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvaW5jbHVkZS9tYWNoL3NtcC5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2luY2x1ZGUvbWFjaC9zbXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOWU2NWViCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2luY2x1ZGUvbWFjaC9zbXAuaApAQCAtMCwwICsxLDIyIEBACisjaWZuZGVmIF9NQUNIX0JGNTYxX1NNUAorI2RlZmluZSBfTUFDSF9CRjU2MV9TTVAKKworc3RydWN0IHRhc2tfc3RydWN0OworCit2b2lkIHBsYXRmb3JtX2luaXRfY3B1cyh2b2lkKTsKKwordm9pZCBwbGF0Zm9ybV9wcmVwYXJlX2NwdXModW5zaWduZWQgaW50IG1heF9jcHVzKTsKKworaW50IHBsYXRmb3JtX2Jvb3Rfc2Vjb25kYXJ5KHVuc2lnbmVkIGludCBjcHUsIHN0cnVjdCB0YXNrX3N0cnVjdCAqaWRsZSk7CisKK3ZvaWQgcGxhdGZvcm1fc2Vjb25kYXJ5X2luaXQodW5zaWduZWQgaW50IGNwdSk7CisKK3ZvaWQgcGxhdGZvcm1fcmVxdWVzdF9pcGkoaW50ICgqaGFuZGxlcikoaW50LCB2b2lkICopKTsKKwordm9pZCBwbGF0Zm9ybV9zZW5kX2lwaShjcHVtYXNrX3QgY2FsbG1hcCk7CisKK3ZvaWQgcGxhdGZvcm1fc2VuZF9pcGlfY3B1KHVuc2lnbmVkIGludCBjcHUpOworCit2b2lkIHBsYXRmb3JtX2NsZWFyX2lwaSh1bnNpZ25lZCBpbnQgY3B1KTsKKworI2VuZGlmIC8qICFfTUFDSF9CRjU2MV9TTVAgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9zZWNvbmRhcnkuUyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9zZWNvbmRhcnkuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTI4MGYwCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL3NlY29uZGFyeS5TCkBAIC0wLDAgKzEsMjE1IEBACisvKgorICogRmlsZTogICAgICAgICBhcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvc2Vjb25kYXJ5LlMKKyAqIEJhc2VkIG9uOiAgICAgYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2hlYWQuUworICogQXV0aG9yOiAgICAgICBQaGlsaXBwZSBHZXJ1bSA8cnBtQHhlbm9tYWkub3JnPgorICoKKyAqICAgICAgICAgICAgICAgQ29weXJpZ2h0IDIwMDcgQW5hbG9nIERldmljZXMgSW5jLgorICoKKyAqIERlc2NyaXB0aW9uOiAgQkY1NjEgY29yZUIgYm9vdHN0cmFwIGZpbGUKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSB0aGUgZmlsZSBDT1BZSU5HLCBvciB3cml0ZQorICogdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8YXNtL2JsYWNrZmluLmg+CisjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CisKK19fSU5JVAorCisvKiBMYXkgdGhlIGluaXRpYWwgc3RhY2sgaW50byB0aGUgTDEgc2NyYXRjaCBhcmVhIG9mIENvcmUgQiAqLworI2RlZmluZSBJTklUSUFMX1NUQUNLCShDT1JFQl9MMV9TQ1JBVENIX1NUQVJUICsgTDFfU0NSQVRDSF9MRU5HVEggLSAxMikKKworRU5UUlkoX2NvcmViX3RyYW1wb2xpbmVfc3RhcnQpCisJLyogU2V0IHRoZSBTWVNDRkcgcmVnaXN0ZXIgKi8KKwlSMCA9IDB4MzY7CisJU1lTQ0ZHID0gUjA7IC8qRW5hYmxlIEN5Y2xlIENvdW50ZXIgYW5kIE5lc3RpbmcgT2YgSW50ZXJydXB0cygzcmQgQml0KSovCisJUjAgPSAwOworCisJLypDbGVhciBPdXQgQWxsIHRoZSBkYXRhIGFuZCBwb2ludGVyICBSZWdpc3RlcnMqLworCVIxID0gUjA7CisJUjIgPSBSMDsKKwlSMyA9IFIwOworCVI0ID0gUjA7CisJUjUgPSBSMDsKKwlSNiA9IFIwOworCVI3ID0gUjA7CisKKwlQMCA9IFIwOworCVAxID0gUjA7CisJUDIgPSBSMDsKKwlQMyA9IFIwOworCVA0ID0gUjA7CisJUDUgPSBSMDsKKworCUxDMCA9IHIwOworCUxDMSA9IHIwOworCUwwID0gcjA7CisJTDEgPSByMDsKKwlMMiA9IHIwOworCUwzID0gcjA7CisKKwkvKiBDbGVhciBPdXQgQWxsIHRoZSBEQUcgUmVnaXN0ZXJzKi8KKwlCMCA9IHIwOworCUIxID0gcjA7CisJQjIgPSByMDsKKwlCMyA9IHIwOworCisJSTAgPSByMDsKKwlJMSA9IHIwOworCUkyID0gcjA7CisJSTMgPSByMDsKKworCU0wID0gcjA7CisJTTEgPSByMDsKKwlNMiA9IHIwOworCU0zID0gcjA7CisKKwkvKiBUdXJuIG9mZiB0aGUgaWNhY2hlICovCisJcDAubCA9IExPKElNRU1fQ09OVFJPTCk7CisJcDAuaCA9IEhJKElNRU1fQ09OVFJPTCk7CisJUjEgPSBbcDBdOworCVIwID0gfkVOSUNQTEI7CisJUjAgPSBSMCAmIFIxOworCisJLyogQW5vbWFseSAwNTAwMDEyNSAqLworI2lmZGVmIEFOT01BTFlfMDUwMDAxMjUKKwlDTEkgUjI7CisJU1NZTkM7CisjZW5kaWYKKwlbcDBdID0gUjA7CisJU1NZTkM7CisjaWZkZWYgQU5PTUFMWV8wNTAwMDEyNQorCVNUSSBSMjsKKyNlbmRpZgorCisJLyogVHVybiBvZmYgdGhlIGRjYWNoZSAqLworCXAwLmwgPSBMTyhETUVNX0NPTlRST0wpOworCXAwLmggPSBISShETUVNX0NPTlRST0wpOworCVIxID0gW3AwXTsKKwlSMCA9IH5FTkRDUExCOworCVIwID0gUjAgJiBSMTsKKworCS8qIEFub21hbHkgMDUwMDAxMjUgKi8KKyNpZmRlZiBBTk9NQUxZXzA1MDAwMTI1CisJQ0xJIFIyOworCVNTWU5DOworI2VuZGlmCisJW3AwXSA9IFIwOworCVNTWU5DOworI2lmZGVmIEFOT01BTFlfMDUwMDAxMjUKKwlTVEkgUjI7CisjZW5kaWYKKworCS8qIGluIGNhc2Ugb2YgZG91YmxlIGZhdWx0cywgc2F2ZSBhIGZldyB0aGluZ3MgKi8KKwlwMC5sID0gX2luaXRfcmV0eF9jb3JlYjsKKwlwMC5oID0gX2luaXRfcmV0eF9jb3JlYjsKKwlSMCA9IFJFVFg7CisJW1AwXSA9IFIwOworCisjaWZkZWYgQ09ORklHX0RFQlVHX0RPVUJMRUZBVUxUCisJLyogT25seSBzYXZlIHRoZXNlIGlmIHdlIGFyZSBzdG9yaW5nIHRoZW0sCisJICogVGhpcyBoYXBwZW5zIGhlcmUsIHNpbmNlIEwxIGdldHMgY2xvYmJlcmVkCisJICogYmVsb3cKKwkgKi8KKwlHRVRfUERBKHAwLCByMCk7CisJcjcgPSBbcDAgKyBQREFfUkVUWF07CisJcDEubCA9IF9pbml0X3NhdmVkX3JldHhfY29yZWI7CisJcDEuaCA9IF9pbml0X3NhdmVkX3JldHhfY29yZWI7CisJW3AxXSA9IHI3OworCisJcjcgPSBbcDAgKyBQREFfRENQTEJdOworCXAxLmwgPSBfaW5pdF9zYXZlZF9kY3BsYl9mYXVsdF9hZGRyX2NvcmViOworCXAxLmggPSBfaW5pdF9zYXZlZF9kY3BsYl9mYXVsdF9hZGRyX2NvcmViOworCVtwMV0gPSByNzsKKworCXI3ID0gW3AwICsgUERBX0lDUExCXTsKKwlwMS5sID0gX2luaXRfc2F2ZWRfaWNwbGJfZmF1bHRfYWRkcl9jb3JlYjsKKwlwMS5oID0gX2luaXRfc2F2ZWRfaWNwbGJfZmF1bHRfYWRkcl9jb3JlYjsKKwlbcDFdID0gcjc7CisKKwlyNyA9IFtwMCArIFBEQV9TRVFTVEFUXTsKKwlwMS5sID0gX2luaXRfc2F2ZWRfc2Vxc3RhdF9jb3JlYjsKKwlwMS5oID0gX2luaXRfc2F2ZWRfc2Vxc3RhdF9jb3JlYjsKKwlbcDFdID0gcjc7CisjZW5kaWYKKworCS8qIEluaXRpYWxpemUgc3RhY2sgcG9pbnRlciAqLworCXNwLmwgPSBsbyhJTklUSUFMX1NUQUNLKTsKKwlzcC5oID0gaGkoSU5JVElBTF9TVEFDSyk7CisJZnAgPSBzcDsKKwl1c3AgPSBzcDsKKworCS8qIFRoaXMgc2VjdGlvbiBrZWVwcyB0aGUgcHJvY2Vzc29yIGluIHN1cGVydmlzb3IgbW9kZQorCSAqIGR1cmluZyBjb3JlIEIgc3RhcnR1cC4gIEJyYW5jaGVzIHRvIHRoZSBpZGxlIHRhc2suCisJICovCisKKwkvKiBFVlQxNSA9IF9yZWFsX3N0YXJ0ICovCisKKwlwMC5sID0gbG8oRVZUMTUpOworCXAwLmggPSBoaShFVlQxNSk7CisJcDEubCA9IF9jb3JlYl9zdGFydDsKKwlwMS5oID0gX2NvcmViX3N0YXJ0OworCVtwMF0gPSBwMTsKKwljc3luYzsKKworCXAwLmwgPSBsbyhJTUFTSyk7CisJcDAuaCA9IGhpKElNQVNLKTsKKwlwMS5sID0gSU1BU0tfSVZHMTU7CisJcDEuaCA9IDB4MDsKKwlbcDBdID0gcDE7CisJY3N5bmM7CisKKwlyYWlzZSAxNTsKKwlwMC5sID0gLkxXQUlUX0hFUkU7CisJcDAuaCA9IC5MV0FJVF9IRVJFOworCXJldGkgPSBwMDsKKyNpZiBkZWZpbmVkKEFOT01BTFlfMDUwMDAyODEpCisJbm9wOyBub3A7IG5vcDsKKyNlbmRpZgorCXJ0aTsKKworLkxXQUlUX0hFUkU6CisJanVtcCAuTFdBSVRfSEVSRTsKK0VORFBST0MoX2NvcmViX3RyYW1wb2xpbmVfc3RhcnQpCitFTlRSWShfY29yZWJfdHJhbXBvbGluZV9lbmQpCisKK0VOVFJZKF9jb3JlYl9zdGFydCkKKwlbLS1zcF0gPSByZXRpOworCisJcDAubCA9IGxvKFdET0dCX0NUTCk7CisJcDAuaCA9IGhpKFdET0dCX0NUTCk7CisJcjAgPSAweEFENih6KTsKKwl3W3AwXSA9IHIwOwkvKiBDbGVhciB0aGUgd2F0Y2hkb2cuICovCisJc3N5bmM7CisKKwkvKgorCSAqIHN3aXRjaCB0byBJRExFIHN0YWNrLgorCSAqLworCXAwLmwgPSBfc2Vjb25kYXJ5X3N0YWNrOworCXAwLmggPSBfc2Vjb25kYXJ5X3N0YWNrOworCXNwID0gW3AwXTsKKwl1c3AgPSBzcDsKKwlmcCA9IHNwOworCXNwICs9IC0xMjsKKwljYWxsIF9pbml0X3BkYQorCXNwICs9IDEyOworCWNhbGwgX3NlY29uZGFyeV9zdGFydF9rZXJuZWw7CisuTF9leGl0OgorCWp1bXAucwkuTF9leGl0OworRU5EUFJPQyhfY29yZWJfc3RhcnQpCisKK19fRklOSVQKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9zbXAuYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9zbXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjI3ZTY5Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL3NtcC5jCkBAIC0wLDAgKzEsMTY3IEBACisvKgorICogRmlsZTogICAgICAgICBhcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvc21wLmMKKyAqIEF1dGhvcjogICAgICAgUGhpbGlwcGUgR2VydW0gPHJwbUB4ZW5vbWFpLm9yZz4KKyAqCisgKiAgICAgICAgICAgICAgIENvcHlyaWdodCAyMDA3IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSB0aGUgZmlsZSBDT1BZSU5HLCBvciB3cml0ZQorICogdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8YXNtL3NtcC5oPgorI2luY2x1ZGUgPGFzbS9kbWEuaD4KKworc3RhdGljIERFRklORV9TUElOTE9DSyhib290X2xvY2spOworCitzdGF0aWMgY3B1bWFza190IGNwdV9jYWxsaW5fbWFwOworCisvKgorICogcGxhdGZvcm1faW5pdF9jcHVzKCkgLSBUZWxsIHRoZSB3b3JsZCBhYm91dCBob3cgbWFueSBjb3JlcyB3ZQorICogaGF2ZS4gVGhpcyBpcyBjYWxsZWQgd2hpbGUgc2V0dGluZyB1cCB0aGUgYXJjaGl0ZWN0dXJlIHN1cHBvcnQKKyAqIChzZXR1cF9hcmNoKCkpLCBzbyBkb24ndCBiZSB0b28gZGVtYW5kaW5nIGhlcmUgd2l0aCByZXNwZWN0IHRvCisgKiBhdmFpbGFibGUga2VybmVsIHNlcnZpY2VzLgorICovCisKK3ZvaWQgX19pbml0IHBsYXRmb3JtX2luaXRfY3B1cyh2b2lkKQoreworCWNwdV9zZXQoMCwgY3B1X3Bvc3NpYmxlX21hcCk7IC8qIENvcmVBICovCisJY3B1X3NldCgxLCBjcHVfcG9zc2libGVfbWFwKTsgLyogQ29yZUIgKi8KK30KKwordm9pZCBfX2luaXQgcGxhdGZvcm1fcHJlcGFyZV9jcHVzKHVuc2lnbmVkIGludCBtYXhfY3B1cykKK3sKKwlpbnQgbGVuOworCisJbGVuID0gJmNvcmViX3RyYW1wb2xpbmVfZW5kIC0gJmNvcmViX3RyYW1wb2xpbmVfc3RhcnQgKyAxOworCUJVR19PTihsZW4gPiBMMV9DT0RFX0xFTkdUSCk7CisKKwlkbWFfbWVtY3B5KCh2b2lkICopQ09SRUJfTDFfQ09ERV9TVEFSVCwgJmNvcmViX3RyYW1wb2xpbmVfc3RhcnQsIGxlbik7CisKKwkvKiBCb3RoIGNvcmVzIG91Z2h0IHRvIGJlIHByZXNlbnQgb24gYSBiZjU2MSEgKi8KKwljcHVfc2V0KDAsIGNwdV9wcmVzZW50X21hcCk7IC8qIENvcmVBICovCisJY3B1X3NldCgxLCBjcHVfcHJlc2VudF9tYXApOyAvKiBDb3JlQiAqLworCisJcHJpbnRrKEtFUk5fSU5GTyAiQ29yZUIgYm9vdHN0cmFwIGNvZGUgdG8gU1JBTSAlcCB2aWEgRE1BLlxuIiwgKHZvaWQgKilDT1JFQl9MMV9DT0RFX1NUQVJUKTsKK30KKworaW50IF9faW5pdCBzZXR1cF9wcm9maWxpbmdfdGltZXIodW5zaWduZWQgaW50IG11bHRpcGxpZXIpIC8qIG5vdCBzdXBwb3J0ZWQgKi8KK3sKKwlyZXR1cm4gLUVJTlZBTDsKK30KKwordm9pZCBfX2NwdWluaXQgcGxhdGZvcm1fc2Vjb25kYXJ5X2luaXQodW5zaWduZWQgaW50IGNwdSkKK3sKKwlsb2NhbF9pcnFfZGlzYWJsZSgpOworCisJLyogQ2xvbmUgc2V0dXAgZm9yIHBlcmlwaGVyYWwgaW50ZXJydXB0IHNvdXJjZXMgZnJvbSBDb3JlQS4gKi8KKwliZmluX3dyaXRlX1NJQ0JfSU1BU0swKGJmaW5fcmVhZF9TSUNBX0lNQVNLMCgpKTsKKwliZmluX3dyaXRlX1NJQ0JfSU1BU0sxKGJmaW5fcmVhZF9TSUNBX0lNQVNLMSgpKTsKKwlTU1lOQygpOworCisJLyogQ2xvbmUgc2V0dXAgZm9yIElBUnMgZnJvbSBDb3JlQS4gKi8KKwliZmluX3dyaXRlX1NJQ0JfSUFSMChiZmluX3JlYWRfU0lDQV9JQVIwKCkpOworCWJmaW5fd3JpdGVfU0lDQl9JQVIxKGJmaW5fcmVhZF9TSUNBX0lBUjEoKSk7CisJYmZpbl93cml0ZV9TSUNCX0lBUjIoYmZpbl9yZWFkX1NJQ0FfSUFSMigpKTsKKwliZmluX3dyaXRlX1NJQ0JfSUFSMyhiZmluX3JlYWRfU0lDQV9JQVIzKCkpOworCWJmaW5fd3JpdGVfU0lDQl9JQVI0KGJmaW5fcmVhZF9TSUNBX0lBUjQoKSk7CisJYmZpbl93cml0ZV9TSUNCX0lBUjUoYmZpbl9yZWFkX1NJQ0FfSUFSNSgpKTsKKwliZmluX3dyaXRlX1NJQ0JfSUFSNihiZmluX3JlYWRfU0lDQV9JQVI2KCkpOworCWJmaW5fd3JpdGVfU0lDQl9JQVI3KGJmaW5fcmVhZF9TSUNBX0lBUjcoKSk7CisJU1NZTkMoKTsKKworCWxvY2FsX2lycV9lbmFibGUoKTsKKworCS8qIENhbGlicmF0ZSBsb29wcyBwZXIgamlmZnkgdmFsdWUuICovCisJY2FsaWJyYXRlX2RlbGF5KCk7CisKKwkvKiBTdG9yZSBDUFUtcHJpdmF0ZSBpbmZvcm1hdGlvbiB0byB0aGUgY3B1X2RhdGEgYXJyYXkuICovCisJYmZpbl9zZXR1cF9jcHVkYXRhKGNwdSk7CisKKwkvKiBXZSBhcmUgZG9uZSB3aXRoIGxvY2FsIENQVSBpbml0cywgdW5ibG9jayB0aGUgYm9vdCBDUFUuICovCisJY3B1X3NldChjcHUsIGNwdV9jYWxsaW5fbWFwKTsKKwlzcGluX2xvY2soJmJvb3RfbG9jayk7CisJc3Bpbl91bmxvY2soJmJvb3RfbG9jayk7Cit9CisKK2ludCBfX2NwdWluaXQgcGxhdGZvcm1fYm9vdF9zZWNvbmRhcnkodW5zaWduZWQgaW50IGNwdSwgc3RydWN0IHRhc2tfc3RydWN0ICppZGxlKQoreworCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKKworCS8qIENvcmVCIGFscmVhZHkgcnVubmluZz8hICovCisJQlVHX09OKChiZmluX3JlYWRfU0lDQV9TWVNDUigpICYgQ09SRUJfU1JBTV9JTklUKSA9PSAwKTsKKworCXByaW50ayhLRVJOX0lORk8gIkJvb3RpbmcgQ29yZSBCLlxuIik7CisKKwlzcGluX2xvY2soJmJvb3RfbG9jayk7CisKKwkvKiBLaWNrIENvcmVCLCB3aGljaCBzaG91bGQgc3RhcnQgZXhlY3V0aW9uIGZyb20gQ09SRV9TUkFNX0JBU0UuICovCisJU1NZTkMoKTsKKwliZmluX3dyaXRlX1NJQ0FfU1lTQ1IoYmZpbl9yZWFkX1NJQ0FfU1lTQ1IoKSAmIH5DT1JFQl9TUkFNX0lOSVQpOworCVNTWU5DKCk7CisKKwl0aW1lb3V0ID0gamlmZmllcyArIDEgKiBIWjsKKwl3aGlsZSAodGltZV9iZWZvcmUoamlmZmllcywgdGltZW91dCkpIHsKKwkJaWYgKGNwdV9pc3NldChjcHUsIGNwdV9jYWxsaW5fbWFwKSkKKwkJCWJyZWFrOworCQl1ZGVsYXkoMTAwKTsKKwkJYmFycmllcigpOworCX0KKworCXNwaW5fdW5sb2NrKCZib290X2xvY2spOworCisJcmV0dXJuIGNwdV9pc3NldChjcHUsIGNwdV9jYWxsaW5fbWFwKSA/IDAgOiAtRU5PU1lTOworfQorCit2b2lkIF9faW5pdCBwbGF0Zm9ybV9yZXF1ZXN0X2lwaShpcnFfaGFuZGxlcl90IGhhbmRsZXIpCit7CisJaW50IHJldDsKKworCXJldCA9IHJlcXVlc3RfaXJxKElSUV9TVVBQTEVfMCwgaGFuZGxlciwgSVJRRl9ESVNBQkxFRCwKKwkJCSAgIlNNUCBpbnRlcnJ1cHQiLCBoYW5kbGVyKTsKKwlpZiAocmV0KQorCQlwYW5pYygiQ2Fubm90IHJlcXVlc3Qgc3VwcGxlbWVudGFsIGludGVycnVwdCAwIGZvciBJUEkgc2VydmljZVxuIik7Cit9CisKK3ZvaWQgcGxhdGZvcm1fc2VuZF9pcGkoY3B1bWFza190IGNhbGxtYXApCit7CisJdW5zaWduZWQgaW50IGNwdTsKKworCWZvcl9lYWNoX2NwdV9tYXNrKGNwdSwgY2FsbG1hcCkgeworCQlCVUdfT04oY3B1ID49IDIpOworCQlTU1lOQygpOworCQliZmluX3dyaXRlX1NJQ0JfU1lTQ1IoYmZpbl9yZWFkX1NJQ0JfU1lTQ1IoKSB8ICgxIDw8ICg2ICsgY3B1KSkpOworCQlTU1lOQygpOworCX0KK30KKwordm9pZCBwbGF0Zm9ybV9zZW5kX2lwaV9jcHUodW5zaWduZWQgaW50IGNwdSkKK3sKKwlCVUdfT04oY3B1ID49IDIpOworCVNTWU5DKCk7CisJYmZpbl93cml0ZV9TSUNCX1NZU0NSKGJmaW5fcmVhZF9TSUNCX1NZU0NSKCkgfCAoMSA8PCAoNiArIGNwdSkpKTsKKwlTU1lOQygpOworfQorCit2b2lkIHBsYXRmb3JtX2NsZWFyX2lwaSh1bnNpZ25lZCBpbnQgY3B1KQoreworCUJVR19PTihjcHUgPj0gMik7CisJU1NZTkMoKTsKKwliZmluX3dyaXRlX1NJQ0JfU1lTQ1IoYmZpbl9yZWFkX1NJQ0JfU1lTQ1IoKSB8ICgxIDw8ICgxMCArIGNwdSkpKTsKKwlTU1lOQygpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9NYWtlZmlsZSBiL2FyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vTWFrZWZpbGUKaW5kZXggZTZlZDU3Yy4uMWYzMjI4ZSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9NYWtlZmlsZQorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtY29tbW9uL01ha2VmaWxlCkBAIC0zLDEwICszLDEyIEBACiAjCiAKIG9iai15IDo9IFwKLQljYWNoZS5vIGVudHJ5Lm8gaGVhZC5vIFwKKwljYWNoZS5vIGNhY2hlLWMubyBlbnRyeS5vIGhlYWQubyBcCiAJaW50ZXJydXB0Lm8gaXJxcGFuaWMubyBhcmNoX2NoZWNrcy5vIGludHMtcHJpb3JpdHkubwogCiBvYmotJChDT05GSUdfQkZJTl9JQ0FDSEVfTE9DSykgKz0gbG9jay5vCiBvYmotJChDT05GSUdfUE0pICAgICAgICAgICs9IHBtLm8gZHBtY19tb2Rlcy5vCiBvYmotJChDT05GSUdfQ1BVX0ZSRVEpICAgICs9IGNwdWZyZXEubwogb2JqLSQoQ09ORklHX0NQVV9WT0xUQUdFKSArPSBkcG1jLm8KK29iai0kKENPTkZJR19TTVApICAgICAgICAgKz0gc21wLm8KK29iai0kKENPTkZJR19CRklOX0tFUk5FTF9DTE9DSykgKz0gY2xvY2tzLWluaXQubwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9jYWNoZS1jLmMgYi9hcmNoL2JsYWNrZmluL21hY2gtY29tbW9uL2NhY2hlLWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmFiMWY4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9jYWNoZS1jLmMKQEAgLTAsMCArMSwyNCBAQAorLyoKKyAqIEJsYWNrZmluIGNhY2hlIGNvbnRyb2wgY29kZSAoc2ltcGxlciBjb250cm9sLXN0eWxlIGZ1bmN0aW9ucykKKyAqCisgKiBDb3B5cmlnaHQgMjAwNC0yMDA4IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCisgKi8KKworI2luY2x1ZGUgPGFzbS9ibGFja2Zpbi5oPgorCisvKiBJbnZhbGlkYXRlIHRoZSBFbnRpcmUgRGF0YSBjYWNoZSBieQorICogY2xlYXJpbmcgRE1DWzE6MF0gYml0cworICovCit2b2lkIGJsYWNrZmluX2ludmFsaWRhdGVfZW50aXJlX2RjYWNoZSh2b2lkKQoreworCXUzMiBkbWVtID0gYmZpbl9yZWFkX0RNRU1fQ09OVFJPTCgpOworCVNTWU5DKCk7CisJYmZpbl93cml0ZV9ETUVNX0NPTlRST0woZG1lbSAmIH4weGMpOworCVNTWU5DKCk7CisJYmZpbl93cml0ZV9ETUVNX0NPTlRST0woZG1lbSk7CisJU1NZTkMoKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vY2FjaGUuUyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vY2FjaGUuUwppbmRleCBhMDI4ZTk0Li4zYzk4ZGFjIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtY29tbW9uL2NhY2hlLlMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9jYWNoZS5TCkBAIC00OSwxMyArNDksMTcgQEAKIC5pZm5iIFxvcHRmbHVzaGlucwogCVxvcHRmbHVzaGlucyBbUDBdOwogLmVuZGlmCisjaWYgQU5PTUFMWV8wNTAwMDQ0MwogLmlmYiBcb3B0bm9waW5zCiAyOgogLmVuZGlmCiAJXGZsdXNoaW5zIFtQMCsrXTsKIC5pZm5iIFxvcHRub3BpbnMKLTI6IFxvcHRub3BpbnM7CisyOglcb3B0bm9waW5zOwogLmVuZGlmCisjZWxzZQorMjoJXGZsdXNoaW5zIFtQMCsrXTsKKyNlbmRpZgogCiAJUlRTOwogLmVuZG0KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vY2xvY2tzLWluaXQuYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vY2xvY2tzLWluaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDE4MmFiCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9jbG9ja3MtaW5pdC5jCkBAIC0wLDAgKzEsOTMgQEAKKy8qCisgKiBhcmNoL2JsYWNrZmluL21hY2gtY29tbW9uL2Nsb2Nrcy1pbml0LmMgLSByZXByb2dyYW0gY2xvY2tzIC8gbWVtb3J5CisgKgorICogQ29weXJpZ2h0IDIwMDQtMjAwOCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGFzbS9ibGFja2Zpbi5oPgorCisjaW5jbHVkZSA8YXNtL2RtYS5oPgorI2luY2x1ZGUgPGFzbS9jbG9ja3MuaD4KKyNpbmNsdWRlIDxhc20vbWVtX2luaXQuaD4KKworI2RlZmluZSBQTExfQ1RMX1ZBTCBcCisJKCgoQ09ORklHX1ZDT19NVUxUICYgNjMpIDw8IDkpIHwgQ0xLSU5fSEFMRiB8IFwKKwkgKFBMTF9CWVBBU1MgPDwgOCkgfCAoQU5PTUFMWV8wNTAwMDI2NSA/IDB4ODAwMCA6IDApKQorCitfX2F0dHJpYnV0ZV9fKChsMV90ZXh0KSkKK3N0YXRpYyB2b2lkIGRvX3N5bmModm9pZCkKK3sKKwlfX2J1aWx0aW5fYmZpbl9zc3luYygpOworfQorCitfX2F0dHJpYnV0ZV9fKChsMV90ZXh0KSkKK3ZvaWQgaW5pdF9jbG9ja3Modm9pZCkKK3sKKwkvKiBLaWxsIGFueSBhY3RpdmUgRE1BcyBhcyB0aGV5IG1heSB0cmlnZ2VyIGV4dGVybmFsIG1lbW9yeSBhY2Nlc3NlcworCSAqIGluIHRoZSBtaWRkbGUgb2YgcmVwcm9ncmFtbWluZyB0aGluZ3MsIGFuZCB0aGF0J2xsIHNjcmV3IHVzIHVwLgorCSAqIEZvciBleGFtcGxlLCBhbnkgYXV0b21hdGljIERNQXMgbGVmdCBieSBVLUJvb3QgZm9yIHNwbGFzaCBzY3JlZW5zLgorCSAqLworCXNpemVfdCBpOworCWZvciAoaSA9IDA7IGkgPCBNQVhfRE1BX0NIQU5ORUxTOyArK2kpIHsKKwkJc3RydWN0IGRtYV9yZWdpc3RlciAqZG1hID0gZG1hX2lvX2Jhc2VfYWRkcltpXTsKKwkJZG1hLT5jZmcgPSAwOworCX0KKworCWRvX3N5bmMoKTsKKworI2lmZGVmIFNJQ19JV1IwCisJYmZpbl93cml0ZV9TSUNfSVdSMChJV1JfRU5BQkxFKDApKTsKKyMgaWZkZWYgU0lDX0lXUjEKKwkvKiBCRjUyeCBzeXN0ZW0gcmVzZXQgZG9lcyBub3QgcHJvcGVybHkgcmVzZXQgU0lDX0lXUjEgd2hpY2gKKwkgKiB3aWxsIHNjcmV3IHVwIHRoZSBib290cm9tIGFzIGl0IHJlbGllcyBvbiBNRE1BMC8xIHdha2luZyBpdAorCSAqIHVwIGZyb20gSURMRSBpbnN0cnVjdGlvbnMuICBTZWUgdGhpcyByZXBvcnQgZm9yIG1vcmUgaW5mbzoKKwkgKiBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvZ2YvdHJhY2tlci80MzIzCisJICovCisJaWYgKEFOT01BTFlfMDUwMDA0MzUpCisJCWJmaW5fd3JpdGVfU0lDX0lXUjEoSVdSX0VOQUJMRSgxMCkgfCBJV1JfRU5BQkxFKDExKSk7CisJZWxzZQorCQliZmluX3dyaXRlX1NJQ19JV1IxKElXUl9ESVNBQkxFX0FMTCk7CisjIGVuZGlmCisjIGlmZGVmIFNJQ19JV1IyCisJYmZpbl93cml0ZV9TSUNfSVdSMihJV1JfRElTQUJMRV9BTEwpOworIyBlbmRpZgorI2Vsc2UKKwliZmluX3dyaXRlX1NJQ19JV1IoSVdSX0VOQUJMRSgwKSk7CisjZW5kaWYKKwlkb19zeW5jKCk7CisjaWZkZWYgRUJJVV9TREdDVEwKKwliZmluX3dyaXRlX0VCSVVfU0RHQ1RMKGJmaW5fcmVhZF9FQklVX1NER0NUTCgpIHwgU1JGUyk7CisJZG9fc3luYygpOworI2VuZGlmCisKKyNpZmRlZiBDTEtCVUZPRQorCWJmaW5fd3JpdGUxNihWUl9DVEwsIGJmaW5fcmVhZF9WUl9DVEwoKSB8IENMS0JVRk9FKTsKKwlkb19zeW5jKCk7CisJX19hc21fXyBfX3ZvbGF0aWxlX18oIklETEU7Iik7CisjZW5kaWYKKwliZmluX3dyaXRlX1BMTF9MT0NLQ05UKDB4MzAwKTsKKwlkb19zeW5jKCk7CisJYmZpbl93cml0ZTE2KFBMTF9DVEwsIFBMTF9DVExfVkFMKTsKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygiSURMRTsiKTsKKwliZmluX3dyaXRlX1BMTF9ESVYoQ09ORklHX0NDTEtfQUNUX0RJViB8IENPTkZJR19TQ0xLX0RJVik7CisjaWZkZWYgRUJJVV9TREdDVEwKKwliZmluX3dyaXRlX0VCSVVfU0RSUkMobWVtX1NEUlJDKTsKKwliZmluX3dyaXRlX0VCSVVfU0RHQ1RMKG1lbV9TREdDVEwpOworI2Vsc2UKKwliZmluX3dyaXRlX0VCSVVfUlNUQ1RMKGJmaW5fcmVhZF9FQklVX1JTVENUTCgpICYgfihTUlJFUSkpOworCWRvX3N5bmMoKTsKKwliZmluX3dyaXRlX0VCSVVfUlNUQ1RMKGJmaW5fcmVhZF9FQklVX1JTVENUTCgpIHwgMHgxKTsKKwliZmluX3dyaXRlX0VCSVVfRERSQ1RMMChtZW1fRERSQ1RMMCk7CisJYmZpbl93cml0ZV9FQklVX0REUkNUTDEobWVtX0REUkNUTDEpOworCWJmaW5fd3JpdGVfRUJJVV9ERFJDVEwyKG1lbV9ERFJDVEwyKTsKKyNpZmRlZiBDT05GSUdfTUVNX0VCSVVfRERSUVVFCisJYmZpbl93cml0ZV9FQklVX0REUlFVRShDT05GSUdfTUVNX0VCSVVfRERSUVVFKTsKKyNlbmRpZgorI2VuZGlmCisJZG9fc3luYygpOworCWJmaW5fcmVhZDE2KDApOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9jcHVmcmVxLmMgYi9hcmNoL2JsYWNrZmluL21hY2gtY29tbW9uL2NwdWZyZXEuYwppbmRleCBkZGE1NDQzLi43MmUxNjYwIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtY29tbW9uL2NwdWZyZXEuYworKysgYi9hcmNoL2JsYWNrZmluL21hY2gtY29tbW9uL2NwdWZyZXEuYwpAQCAtMTA0LDcgKzEwNCw3IEBACiAJCSBjY2xrX2h6LCB0YXJnZXRfZnJlcSwgZnJlcXMub2xkKTsKIAogCWNwdWZyZXFfbm90aWZ5X3RyYW5zaXRpb24oJmZyZXFzLCBDUFVGUkVRX1BSRUNIQU5HRSk7Ci0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCWxvY2FsX2lycV9zYXZlX2h3KGZsYWdzKTsKIAkJcGxsZGl2ID0gKGJmaW5fcmVhZF9QTExfRElWKCkgJiBTU0VMKSB8IGRwbV9zdGF0ZV90YWJsZVtpbmRleF0uY3NlbDsKIAkJdHNjYWxlID0gZHBtX3N0YXRlX3RhYmxlW2luZGV4XS50c2NhbGU7CiAJCWJmaW5fd3JpdGVfUExMX0RJVihwbGxkaXYpOwpAQCAtMTEyLDEwICsxMTIsMTAgQEAKIAkJYmZpbl93cml0ZV9UU0NBTEUodHNjYWxlKTsKIAkJY3ljbGVzID0gZ2V0X2N5Y2xlcygpOwogCQlTU1lOQygpOwotCWN5Y2xlcyArPSAxMDsgLyogfjEwIGN5Y2xlcyB3ZSBsb29zZSBhZnRlciBnZXRfY3ljbGVzKCkgKi8KKwljeWNsZXMgKz0gMTA7IC8qIH4xMCBjeWNsZXMgd2UgbG9zZSBhZnRlciBnZXRfY3ljbGVzKCkgKi8KIAlfX2JmaW5fY3ljbGVzX29mZiArPSAoY3ljbGVzIDw8IF9fYmZpbl9jeWNsZXNfbW9kKSAtIChjeWNsZXMgPDwgaW5kZXgpOwogCV9fYmZpbl9jeWNsZXNfbW9kID0gaW5kZXg7Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCWxvY2FsX2lycV9yZXN0b3JlX2h3KGZsYWdzKTsKIAkvKiBUT0RPOiBqdXN0IHRlc3QgY2FzZSBmb3IgY3ljbGVzIGNsb2NrIHNvdXJjZSwgcmVtb3ZlIGxhdGVyICovCiAJcHJfZGVidWcoImNwdWZyZXE6IGRvbmVcbiIpOwogCWNwdWZyZXFfbm90aWZ5X3RyYW5zaXRpb24oJmZyZXFzLCBDUFVGUkVRX1BPU1RDSEFOR0UpOwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9kcG1jX21vZGVzLlMgYi9hcmNoL2JsYWNrZmluL21hY2gtY29tbW9uL2RwbWNfbW9kZXMuUwppbmRleCBhZDU0MzFlLi40ZGE1MGJjIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtY29tbW9uL2RwbWNfbW9kZXMuUworKysgYi9hcmNoL2JsYWNrZmluL21hY2gtY29tbW9uL2RwbWNfbW9kZXMuUwpAQCAtMjQ3LDcgKzI0Nyw4IEBACiBFTkRQUk9DKF91bnNldF9kcmFtX3NyZnMpCiAKIEVOVFJZKF9zZXRfc2ljX2l3cikKLSNpZiBkZWZpbmVkKENPTkZJR19CRjU0eCkgfHwgZGVmaW5lZChDT05GSUdfQkY1MngpICB8fCBkZWZpbmVkKENPTkZJR19CRjU2MSkKKyNpZiBkZWZpbmVkKENPTkZJR19CRjU0eCkgfHwgZGVmaW5lZChDT05GSUdfQkY1MngpIHx8IGRlZmluZWQoQ09ORklHX0JGNTYxKSB8fCBcCisJZGVmaW5lZChDT05GSUdfQkY1MzgpIHx8IGRlZmluZWQoQ09ORklHX0JGNTM5KSB8fCBkZWZpbmVkKENPTkZJR19CRjUxeCkKIAlQMC5IID0gaGkoU0lDX0lXUjApOwogCVAwLkwgPSBsbyhTSUNfSVdSMCk7CiAJUDEuSCA9IGhpKFNJQ19JV1IxKTsKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vZW50cnkuUyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vZW50cnkuUwppbmRleCBiZGU2ZGM0Li5mYWU3NzQ2IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtY29tbW9uL2VudHJ5LlMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9lbnRyeS5TCkBAIC0zNiw2ICszNiw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KICNpbmNsdWRlIDxsaW51eC91bmlzdGQuaD4KKyNpbmNsdWRlIDxsaW51eC90aHJlYWRzLmg+CiAjaW5jbHVkZSA8YXNtL2JsYWNrZmluLmg+CiAjaW5jbHVkZSA8YXNtL2Vycm5vLmg+CiAjaW5jbHVkZSA8YXNtL2ZpeGVkX2NvZGUuaD4KQEAgLTc1LDExICs3NiwxMSBAQAogCSAqIGhhbmRsZSBpdC4KIAkgKi8KIAlQNCA9IFI3OwkvKiBTdG9yZSBFWENBVVNFICovCi0JcDUubCA9IF9sYXN0X2NwbGJfZmF1bHRfcmV0eDsKLQlwNS5oID0gX2xhc3RfY3BsYl9mYXVsdF9yZXR4OwotCXI3ID0gW3A1XTsKKworCUdFVF9QREEocDUsIHI3KTsKKwlyNyA9IFtwNSArIFBEQV9MRlJFVFhdOwogCXI2ID0gcmV0eDsKLQlbcDVdID0gcjY7CisJW3A1ICsgUERBX0xGUkVUWF0gPSByNjsKIAljYyA9IHI2ID09IHI3OwogCWlmICFjYyBqdW1wIF9iZmluX3JldHVybl9mcm9tX2V4Y2VwdGlvbjsKIAkvKiBmYWxsIHRocm91Z2ggKi8KQEAgLTExMSwyNCArMTEyLDIxIEBACiBFTlRSWShfZXhfZGNwbGJfbWlzcykKIEVOVFJZKF9leF9pY3BsYl9taXNzKQogCShSNzo2LFA1OjQpID0gW3NwKytdOwotCUFTVEFUID0gW3NwKytdOwotCVNBVkVfQUxMX1NZUwotI2lmZGVmIENPTkZJR19NUFUKKwkvKiBXZSBsZWF2ZSB0aGUgcHJldmlvdXNseSBwdXNoZWQgQVNUQVQgb24gdGhlIHN0YWNrLiAgKi8KKwlTQVZFX0NPTlRFWFRfQ1BMQgorCiAJLyogV2UgbXVzdCBsb2FkIFIxIGhlcmUsIF9iZWZvcmVfIERFQlVHX0hXVFJBQ0VfU0FWRSwgc2luY2UgdGhhdAogCSAqIHdpbGwgY2hhbmdlIHRoZSBzdGFjayBwb2ludGVyLiAgKi8KIAlSMCA9IFNFUVNUQVQ7CiAJUjEgPSBTUDsKLSNlbmRpZgorCiAJREVCVUdfSFdUUkFDRV9TQVZFKHA1LCByNykKLSNpZmRlZiBDT05GSUdfTVBVCisKIAlzcCArPSAtMTI7CiAJY2FsbCBfY3BsYl9oZHI7CiAJc3AgKz0gMTI7CiAJQ0MgPSBSMCA9PSAwOwogCUlGICFDQyBKVU1QIF9oYW5kbGVfYmFkX2NwbGI7Ci0jZWxzZQotCWNhbGwgX19jcGxiX2hkcjsKLSNlbmRpZgogCiAjaWZkZWYgQ09ORklHX0RFQlVHX0RPVUJMRUZBVUxUCiAJLyogV2hpbGUgd2Ugd2VyZSBwcm9jZXNzaW5nIHRoaXMsIGRpZCB3ZSBkb3VibGUgZmF1bHQ/ICovCkBAIC0xNDIsNyArMTQwLDggQEAKICNlbmRpZgogCiAJREVCVUdfSFdUUkFDRV9SRVNUT1JFKHA1LCByNykKLQlSRVNUT1JFX0FMTF9TWVMKKwlSRVNUT1JFX0NPTlRFWFRfQ1BMQgorCUFTVEFUID0gW1NQKytdOwogCVNQID0gRVhfU0NSQVRDSF9SRUc7CiAJcnR4OwogRU5EUFJPQyhfZXhfaWNwbGJfbWlzcykKQEAgLTI5Nyw5ICsyOTYsOCBAQAogCSAqIHRoZSBzdGFjayB0byBnZXQgcmVhZHkgc28sIHdlIGNhbiBmYWxsIHRocm91Z2ggLSB3ZQogCSAqIG5lZWQgdG8gbWFrZSBhIENQTEIgZXhjZXB0aW9uIGxvb2sgbGlrZSBhIG5vcm1hbCBleGNlcHRpb24KIAkgKi8KLQotCVJFU1RPUkVfQUxMX1NZUwotCVstLXNwXSA9IEFTVEFUOworCVJFU1RPUkVfQ09OVEVYVF9DUExCCisJLyogQVNUQVQgaXMgc3RpbGwgb24gdGhlIHN0YWNrLCB3aGVyZSBpdCBpcyBuZWVkZWQuICAqLwogCVstLXNwXSA9IChSNzo2LFA1OjQpOwogCiBFTlRSWShfZXhfcmVwbGFjZWFibGUpCkBAIC0zMjQsNyArMzIyLDkgQEAKIAlbcDRdID0gcDU7CiAJY3N5bmM7CiAKKwlHRVRfUERBKHA1LCByNik7CiAjaWZuZGVmIENPTkZJR19ERUJVR19ET1VCTEVGQVVMVAorCiAJLyoKIAkgKiBTYXZlIHRoZXNlIHJlZ2lzdGVycywgYXMgdGhleSBhcmUgb25seSB2YWxpZCBpbiBleGNlcHRpb24gY29udGV4dAogCSAqICAod2hlcmUgd2UgYXJlIG5vdyAtIGFzIHNvb24gYXMgd2UgZGVmZXIgdG8gSVJRNSwgdGhleSBjYW4gY2hhbmdlKQpAQCAtMzM1LDI5ICszMzUsMjUgQEAKIAlwNC5sID0gbG8oRENQTEJfRkFVTFRfQUREUik7CiAJcDQuaCA9IGhpKERDUExCX0ZBVUxUX0FERFIpOwogCXI3ID0gW3A0XTsKLQlwNS5oID0gX3NhdmVkX2RjcGxiX2ZhdWx0X2FkZHI7Ci0JcDUubCA9IF9zYXZlZF9kY3BsYl9mYXVsdF9hZGRyOwotCVtwNV0gPSByNzsKKwlbcDUgKyBQREFfRENQTEJdID0gcjc7CiAKLQlyNyA9IFtwNCArIChJQ1BMQl9GQVVMVF9BRERSIC0gRENQTEJfRkFVTFRfQUREUildOwotCXA1LmggPSBfc2F2ZWRfaWNwbGJfZmF1bHRfYWRkcjsKLQlwNS5sID0gX3NhdmVkX2ljcGxiX2ZhdWx0X2FkZHI7Ci0JW3A1XSA9IHI3OworCXA0LmwgPSBsbyhJQ1BMQl9GQVVMVF9BRERSKTsKKwlwNC5oID0gaGkoSUNQTEJfRkFVTFRfQUREUik7CisJcjYgPSBbcDRdOworCVtwNSArIFBEQV9JQ1BMQl0gPSByNjsKIAogCXI2ID0gcmV0eDsKLQlwNC5sID0gX3NhdmVkX3JldHg7Ci0JcDQuaCA9IF9zYXZlZF9yZXR4OwotCVtwNF0gPSByNjsKKwlbcDUgKyBQREFfUkVUWF0gPSByNjsKICNlbmRpZgogCXI2ID0gU1lTQ0ZHOwotCVtwNCArIDRdID0gcjY7CisJW3A1ICsgUERBX1NZU0NGR10gPSByNjsKIAlCSVRDTFIocjYsIDApOwogCVNZU0NGRyA9IHI2OwogCiAJLyogRGlzYWJsZSBhbGwgaW50ZXJydXB0cywgYnV0IG1ha2Ugc3VyZSBsZXZlbCA1IGlzIGVuYWJsZWQgc28KIAkgKiB3ZSBjYW4gc3dpdGNoIHRvIHRoYXQgbGV2ZWwuICBTYXZlIHRoZSBvbGQgbWFzay4gICovCiAJY2xpIHI2OwotCVtwNCArIDhdID0gcjY7CisJW3A1ICsgUERBX0VYSU1BU0tdID0gcjY7CiAKIAlwNC5sID0gbG8oU0FGRV9VU0VSX0lOU1RSVUNUSU9OKTsKIAlwNC5oID0gaGkoU0FGRV9VU0VSX0lOU1RSVUNUSU9OKTsKQEAgLTM3MSw5ICszNjcsMTAgQEAKIEVORFBST0MoX2V4X3RyYXBfYykKIAogLyogV2UganVzdCByZWFsaXplZCB3ZSBnb3QgYW4gZXhjZXB0aW9uLCB3aGlsZSB3ZSB3ZXJlIHByb2Nlc3NpbmcgYSBkaWZmZXJlbnQKLSAqIGV4Y2VwdGlvbi4gVGhpcyBpcyBhIHVucmVjb3ZlcmFibGUgZXZlbnQsIHNvIGNyYXNoCisgKiBleGNlcHRpb24uIFRoaXMgaXMgYSB1bnJlY292ZXJhYmxlIGV2ZW50LCBzbyBjcmFzaC4KKyAqIE5vdGU6IHRoaXMgY2Fubm90IGJlIEVOVFJZKCkgYXMgd2UganVtcCBoZXJlIHdpdGggImlmIGNjIGp1bXAiIC4uLgogICovCi1FTlRSWShfZG91YmxlX2ZhdWx0KQorX2RvdWJsZV9mYXVsdDoKIAkvKiBUdXJuIGNhY2hlcyAmIHByb3RlY3Rpb24gb2ZmLCB0byBlbnN1cmUgd2UgZG9uJ3QgZ2V0IGFueSBtb3JlCiAJICogZG91YmxlIGV4Y2VwdGlvbnMKIAkgKi8KQEAgLTQyNCwxNyArNDIxLDE2IEBACiBFTlRSWShfZXhjZXB0aW9uX3RvX2xldmVsNSkKIAlTQVZFX0FMTF9TWVMKIAotCXA0LmwgPSBfc2F2ZWRfcmV0eDsKLQlwNC5oID0gX3NhdmVkX3JldHg7Ci0JcjYgPSBbcDRdOworCUdFVF9QREEocDQsIHI3KTsgICAgICAgIC8qIEZldGNoIGN1cnJlbnQgUERBICovCisJcjYgPSBbcDQgKyBQREFfUkVUWF07CiAJW3NwICsgUFRfUENdID0gcjY7CiAKLQlyNiA9IFtwNCArIDRdOworCXI2ID0gW3A0ICsgUERBX1NZU0NGR107CiAJW3NwICsgUFRfU1lTQ0ZHXSA9IHI2OwogCiAJLyogUmVzdG9yZSBpbnRlcnJ1cHQgbWFzay4gIFdlIGhhdmVuJ3QgcHVzaGVkIFJFVEksIHNvIHRoaXMKIAkgKiBkb2Vzbid0IGVuYWJsZSBpbnRlcnJ1cHRzIHVudGlsIHdlIHJldHVybiBmcm9tIHRoaXMgaGFuZGxlci4gICovCi0JcjYgPSBbcDQgKyA4XTsKKwlyNiA9IFtwNCArIFBEQV9FWElNQVNLXTsKIAlzdGkgcjY7CiAKIAkvKiBSZXN0b3JlIHRoZSBoYXJkd2FyZSBlcnJvciB2ZWN0b3IuICAqLwpAQCAtNDc4LDggKzQ3NCw4IEBACiAJICogc2NyYXRjaCByZWdpc3RlciAoZm9yIHdhbnQgb2YgYSBiZXR0ZXIgb3B0aW9uKS4KIAkgKi8KIAlFWF9TQ1JBVENIX1JFRyA9IHNwOwotCXNwLmwgPSBfZXhjZXB0aW9uX3N0YWNrX3RvcDsKLQlzcC5oID0gX2V4Y2VwdGlvbl9zdGFja190b3A7CisJR0VUX1BEQV9TQUZFKHNwKTsKKwlzcCA9IFtzcCArIFBEQV9FWFNUQUNLXQogCS8qIFRyeSB0byBkZWFsIHdpdGggc3lzY2FsbHMgcXVpY2tseS4gICovCiAJWy0tc3BdID0gQVNUQVQ7CiAJWy0tc3BdID0gKFI3OjYsUDU6NCk7CkBAIC01MDEsMjcgKzQ5NywyMiBAQAogCSAqIGJ1dCB0aGV5IGFyZSBub3QgdmVyeSBpbnRlcmVzdGluZywgc28gZG9uJ3Qgc2F2ZSB0aGVtCiAJICovCiAKKwlHRVRfUERBKHA1LCByNyk7CiAJcDQubCA9IGxvKERDUExCX0ZBVUxUX0FERFIpOwogCXA0LmggPSBoaShEQ1BMQl9GQVVMVF9BRERSKTsKIAlyNyA9IFtwNF07Ci0JcDUuaCA9IF9zYXZlZF9kY3BsYl9mYXVsdF9hZGRyOwotCXA1LmwgPSBfc2F2ZWRfZGNwbGJfZmF1bHRfYWRkcjsKLQlbcDVdID0gcjc7CisJW3A1ICsgUERBX0RDUExCXSA9IHI3OwogCi0JcjcgPSBbcDQgKyAoSUNQTEJfRkFVTFRfQUREUiAtIERDUExCX0ZBVUxUX0FERFIpXTsKLQlwNS5oID0gX3NhdmVkX2ljcGxiX2ZhdWx0X2FkZHI7Ci0JcDUubCA9IF9zYXZlZF9pY3BsYl9mYXVsdF9hZGRyOwotCVtwNV0gPSByNzsKKwlwNC5sID0gbG8oSUNQTEJfRkFVTFRfQUREUik7CisJcDQuaCA9IGhpKElDUExCX0ZBVUxUX0FERFIpOworCXI3ID0gW3A0XTsKKwlbcDUgKyBQREFfSUNQTEJdID0gcjc7CiAKLQlwNC5sID0gX3NhdmVkX3JldHg7Ci0JcDQuaCA9IF9zYXZlZF9yZXR4OwogCXI2ID0gcmV0eDsKLQlbcDRdID0gcjY7CisJW3A1ICsgUERBX1JFVFhdID0gcjY7CiAKIAlyNyA9IFNFUVNUQVQ7CQkvKiByZWFzb24gY29kZSBpcyBpbiBiaXQgNTowICovCi0JcDQubCA9IF9zYXZlZF9zZXFzdGF0OwotCXA0LmggPSBfc2F2ZWRfc2Vxc3RhdDsKLQlbcDRdID0gcjc7CisJW3A1ICsgUERBX1NFUVNUQVRdID0gcjc7CiAjZWxzZQogCXI3ID0gU0VRU1RBVDsgICAgICAgICAgIC8qIHJlYXNvbiBjb2RlIGlzIGluIGJpdCA1OjAgKi8KICNlbmRpZgpAQCAtNTQ2LDExICs1MzcsMTEgQEAKIAlwMCA9IHNwOwogCXIzID0gU0laRU9GX1BUUkVHUyAvIDQ7CiAJcjQgPSAwKHgpOwotMDoKKy5MY2xlYXJfcmVnczoKIAlbcDArK10gPSByNDsKIAlyMyArPSAtMTsKIAljYyA9IHIzID09IDA7Ci0JaWYgIWNjIGp1bXAgMGIgKGJwKTsKKwlpZiAhY2MganVtcCAuTGNsZWFyX3JlZ3MgKGJwKTsKIAogCXAwID0gc3A7CiAJc3AgKz0gLTE2OwpAQCAtNTU4LDcgKzU0OSw3IEBACiAJY2FsbCBfZG9fZXhlY3ZlOwogCVNQICs9IDE2OwogCWNjID0gcjAgPT0gMDsKLQlpZiAhIGNjIGp1bXAgMWY7CisJaWYgISBjYyBqdW1wIC5MZXhlY3ZlX2ZhaWxlZDsKIAkvKiBTdWNjZXNzLiAgQ29weSBvdXIgdGVtcG9yYXJ5IHB0X3JlZ3MgdG8gdGhlIHRvcCBvZiB0aGUga2VybmVsCiAJICogc3RhY2sgYW5kIGRvIGEgbm9ybWFsIGV4Y2VwdGlvbiByZXR1cm4uCiAJICovCkBAIC01NzQsMTIgKzU2NSwxMiBAQAogCXAwID0gZnA7CiAJcjQgPSBbcDAtLV07CiAJcjMgPSBTSVpFT0ZfUFRSRUdTIC8gNDsKLTA6CisuTGNvcHlfcmVnczoKIAlyNCA9IFtwMC0tXTsKIAlbcDEtLV0gPSByNDsKIAlyMyArPSAtMTsKIAljYyA9IHIzID09IDA7Ci0JaWYgISBjYyBqdW1wIDBiIChicCk7CisJaWYgISBjYyBqdW1wIC5MY29weV9yZWdzIChicCk7CiAKIAlyMCA9IChLRVJORUxfU1RBQ0tfU0laRSAtIFNJWkVPRl9QVFJFR1MpICh6KTsKIAlwMSA9IHIwOwpAQCAtNTkxLDcgKzU4Miw3IEBACiAKIAlSRVNUT1JFX0NPTlRFWFQ7CiAJcnRpOwotMToKKy5MZXhlY3ZlX2ZhaWxlZDoKIAl1bmxpbms7CiAJcnRzOwogRU5EUFJPQyhfa2VybmVsX2V4ZWN2ZSkKQEAgLTkyNSw5ICs5MTYsMTQgQEAKIAlwMSA9IHJldHM7CiAJW3NwICsgUFRfUkVTRVJWRURdID0gcDE7CiAKLQlwMC5sID0gX2lycV9mbGFnczsKLQlwMC5oID0gX2lycV9mbGFnczsKKyNpZmRlZiBDT05GSUdfU01QCisJR0VUX1BEQShwMCwgcjApOyAJLyogRmV0Y2ggY3VycmVudCBQREEgKGNhbid0IG1pZ3JhdGUgdG8gb3RoZXIgQ1BVIGhlcmUpICovCisJcjAgPSBbcDAgKyBQREFfSVJRRkxBR1NdOworI2Vsc2UKKwlwMC5sID0gX2JmaW5faXJxX2ZsYWdzOworCXAwLmggPSBfYmZpbl9pcnFfZmxhZ3M7CiAJcjAgPSBbcDBdOworI2VuZGlmCiAJc3RpIHIwOwogCiAJcjAgPSBzcDsKQEAgLTE1MzksMTQgKzE1MzUsMTggQEAKIAkuZW5kcgogRU5EKF9zeXNfY2FsbF90YWJsZSkKIAotX2V4Y2VwdGlvbl9zdGFjazoKLQkucmVwdCAxMDI0Ci0JLmxvbmcgMDsKKyNpZmRlZiBDT05GSUdfRVhDRVBUSU9OX0wxX1NDUkFUQ0gKKy8qIC5zZWN0aW9uIC5sMS5ic3Muc2NyYXRjaCAqLworLnNldCBfZXhjZXB0aW9uX3N0YWNrX3RvcCwgTDFfU0NSQVRDSF9TVEFSVCArIEwxX1NDUkFUQ0hfTEVOR1RICisjZWxzZQorI2lmZGVmIENPTkZJR19TWVNDQUxMX1RBQl9MMQorLnNlY3Rpb24gLmwxLmJzcworI2Vsc2UKKy5ic3MKKyNlbmRpZgorRU5UUlkoX2V4Y2VwdGlvbl9zdGFjaykKKwkucmVwdCAxMDI0ICogTlJfQ1BVUworCS5sb25nIDAKIAkuZW5kcgogX2V4Y2VwdGlvbl9zdGFja190b3A6Ci0KLSNpZiBBTk9NQUxZXzA1MDAwMjYxCi0vKiBVc2VkIGJ5IHRoZSBhc3NlbWJseSBlbnRyeSBwb2ludCB0byB3b3JrIGFyb3VuZCBhbiBhbm9tYWx5LiAgKi8KLV9sYXN0X2NwbGJfZmF1bHRfcmV0eDoKLQkubG9uZyAwOwogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtY29tbW9uL2hlYWQuUyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vaGVhZC5TCmluZGV4IGYxMjNhNjIuLmUxZTQyYzAgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vaGVhZC5TCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vaGVhZC5TCkBAIC0xMyw2ICsxMyw3IEBACiAjaW5jbHVkZSA8YXNtL2JsYWNrZmluLmg+CiAjaW5jbHVkZSA8YXNtL3RocmVhZF9pbmZvLmg+CiAjaW5jbHVkZSA8YXNtL3RyYWNlLmg+CisjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CiAKIF9fSU5JVAogCkBAIC0xMTEsMzMgKzExMiwyNiBAQAogCSAqIFRoaXMgaGFwcGVucyBoZXJlLCBzaW5jZSBMMSBnZXRzIGNsb2JiZXJlZAogCSAqIGJlbG93CiAJICovCi0JcDAubCA9IF9zYXZlZF9yZXR4OwotCXAwLmggPSBfc2F2ZWRfcmV0eDsKKwlHRVRfUERBKHAwLCByMCk7CisJcjcgPSBbcDAgKyBQREFfUkVUWF07CiAJcDEubCA9IF9pbml0X3NhdmVkX3JldHg7CiAJcDEuaCA9IF9pbml0X3NhdmVkX3JldHg7Ci0JcjAgPSBbcDBdOwotCVtwMV0gPSByMDsKKwlbcDFdID0gcjc7CiAKLQlwMC5sID0gX3NhdmVkX2RjcGxiX2ZhdWx0X2FkZHI7Ci0JcDAuaCA9IF9zYXZlZF9kY3BsYl9mYXVsdF9hZGRyOworCXI3ID0gW3AwICsgUERBX0RDUExCXTsKIAlwMS5sID0gX2luaXRfc2F2ZWRfZGNwbGJfZmF1bHRfYWRkcjsKIAlwMS5oID0gX2luaXRfc2F2ZWRfZGNwbGJfZmF1bHRfYWRkcjsKLQlyMCA9IFtwMF07Ci0JW3AxXSA9IHIwOworCVtwMV0gPSByNzsKIAotCXAwLmwgPSBfc2F2ZWRfaWNwbGJfZmF1bHRfYWRkcjsKLQlwMC5oID0gX3NhdmVkX2ljcGxiX2ZhdWx0X2FkZHI7CisJcjcgPSBbcDAgKyBQREFfSUNQTEJdOwogCXAxLmwgPSBfaW5pdF9zYXZlZF9pY3BsYl9mYXVsdF9hZGRyOwogCXAxLmggPSBfaW5pdF9zYXZlZF9pY3BsYl9mYXVsdF9hZGRyOwotCXIwID0gW3AwXTsKLQlbcDFdID0gcjA7CisJW3AxXSA9IHI3OwogCi0JcDAubCA9IF9zYXZlZF9zZXFzdGF0OwotCXAwLmggPSBfc2F2ZWRfc2Vxc3RhdDsKKwlyNyA9IFtwMCArIFBEQV9TRVFTVEFUXTsKIAlwMS5sID0gX2luaXRfc2F2ZWRfc2Vxc3RhdDsKIAlwMS5oID0gX2luaXRfc2F2ZWRfc2Vxc3RhdDsKLQlyMCA9IFtwMF07Ci0JW3AxXSA9IHIwOworCVtwMV0gPSByNzsKICNlbmRpZgogCiAJLyogSW5pdGlhbGl6ZSBzdGFjayBwb2ludGVyICovCkBAIC0xNTMsNyArMTQ3LDcgQEAKIAkvKiBQdXQgVGhlIENvZGUgZm9yIFBMTCBQcm9ncmFtbWluZyBhbmQgU0RSQU0gUHJvZ3JhbW1pbmcgaW4gTDEgSVNSQU0gKi8KIAljYWxsIF9iZmluX3JlbG9jYXRlX2wxX21lbTsKICNpZmRlZiBDT05GSUdfQkZJTl9LRVJORUxfQ0xPQ0sKLQljYWxsIF9zdGFydF9kbWFfY29kZTsKKwljYWxsIF9pbml0X2Nsb2NrczsKICNlbmRpZgogCiAJLyogVGhpcyBzZWN0aW9uIGtlZXBzIHRoZSBwcm9jZXNzb3IgaW4gc3VwZXJ2aXNvciBtb2RlCkBAIC0xNzAsMTIgKzE2NCw4IEBACiAJW3AwXSA9IHAxOwogCWNzeW5jOwogCi0JcDAubCA9IGxvKElNQVNLKTsKLQlwMC5oID0gaGkoSU1BU0spOwotCXAxLmwgPSBJTUFTS19JVkcxNTsKLQlwMS5oID0gMHgwOwotCVtwMF0gPSBwMTsKLQljc3luYzsKKwlyMCA9IEVWVF9JVkcxNSAoeik7CisJc3RpIHIwOwogCiAJcmFpc2UgMTU7CiAJcDAubCA9IC5MV0FJVF9IRVJFOwpAQCAtMTk1LDYgKzE4NSwxOSBAQAogIyBkZWZpbmUgV0RPR19DVEwgV0RPR0FfQ1RMCiAjZW5kaWYKIAorRU5UUlkoX19pbml0X2NsZWFyX2JzcykKKwlyMiA9IHIyIC0gcjE7CisJY2MgPSByMiA9PSAwOworCWlmIGNjIGp1bXAgLkxfYnNzX2RvbmU7CisJcjIgPj49IDI7CisJcDEgPSByMTsKKwlwMiA9IHIyOworCWxzZXR1cCAoMWYsIDFmKSBsYzAgPSBwMjsKKzE6CVtwMSsrXSA9IHIwOworLkxfYnNzX2RvbmU6CisJcnRzOworRU5EUFJPQyhfX2luaXRfY2xlYXJfYnNzKQorCiBFTlRSWShfcmVhbF9zdGFydCkKIAkvKiBFbmFibGUgbmVzdGVkIGludGVycnVwdHMgKi8KIAlbLS1zcF0gPSByZXRpOwpAQCAtMjA2LDg3ICsyMDksMzQgQEAKIAl3W3AwXSA9IHIwOwogCXNzeW5jOwogCisJcjAgPSAwICh4KTsKKwkvKiBaZXJvIG91dCBhbGwgb2YgdGhlIGZ1biBic3MgcmVnaW9ucyAqLwogI2lmIEwxX0RBVEFfQV9MRU5HVEggPiAwCiAJcjEubCA9IF9fc2Jzc19sMTsKIAlyMS5oID0gX19zYnNzX2wxOwogCXIyLmwgPSBfX2Vic3NfbDE7CiAJcjIuaCA9IF9fZWJzc19sMTsKLQlyMCA9IDAgKHopOwotCXIyID0gcjIgLSByMTsKLQljYyA9IHIyID09IDA7Ci0JaWYgY2MganVtcCAuTF9hX2wxX2RvbmU7Ci0JcjIgPj49IDI7Ci0JcDEgPSByMTsKLQlwMiA9IHIyOwotCWxzZXR1cCAoLkxfY2xlYXJfYV9sMSwgLkxfY2xlYXJfYV9sMSApIGxjMCA9IHAyOwotLkxfY2xlYXJfYV9sMToKLQlbcDErK10gPSByMDsKLS5MX2FfbDFfZG9uZToKKwljYWxsIF9faW5pdF9jbGVhcl9ic3MKICNlbmRpZgotCiAjaWYgTDFfREFUQV9CX0xFTkdUSCA+IDAKIAlyMS5sID0gX19zYnNzX2JfbDE7CiAJcjEuaCA9IF9fc2Jzc19iX2wxOwogCXIyLmwgPSBfX2Vic3NfYl9sMTsKIAlyMi5oID0gX19lYnNzX2JfbDE7Ci0JcjAgPSAwICh6KTsKLQlyMiA9IHIyIC0gcjE7Ci0JY2MgPSByMiA9PSAwOwotCWlmIGNjIGp1bXAgLkxfYl9sMV9kb25lOwotCXIyID4+PSAyOwotCXAxID0gcjE7Ci0JcDIgPSByMjsKLQlsc2V0dXAgKC5MX2NsZWFyX2JfbDEsIC5MX2NsZWFyX2JfbDEgKSBsYzAgPSBwMjsKLS5MX2NsZWFyX2JfbDE6Ci0JW3AxKytdID0gcjA7Ci0uTF9iX2wxX2RvbmU6CisJY2FsbCBfX2luaXRfY2xlYXJfYnNzCiAjZW5kaWYKLQogI2lmIEwyX0xFTkdUSCA+IDAKIAlyMS5sID0gX19zYnNzX2wyOwogCXIxLmggPSBfX3Nic3NfbDI7CiAJcjIubCA9IF9fZWJzc19sMjsKIAlyMi5oID0gX19lYnNzX2wyOwotCXIwID0gMCAoeik7Ci0JcjIgPSByMiAtIHIxOwotCWNjID0gcjIgPT0gMDsKLQlpZiBjYyBqdW1wIC5MX2wyX2RvbmU7Ci0JcjIgPj49IDI7Ci0JcDEgPSByMTsKLQlwMiA9IHIyOwotCWxzZXR1cCAoLkxfY2xlYXJfbDIsIC5MX2NsZWFyX2wyICkgbGMwID0gcDI7Ci0uTF9jbGVhcl9sMjoKLQlbcDErK10gPSByMDsKLS5MX2wyX2RvbmU6CisJY2FsbCBfX2luaXRfY2xlYXJfYnNzCiAjZW5kaWYKLQotCS8qIFplcm8gb3V0IHRoZSBic3MgcmVnaW9uCi0JICogTm90ZTogdGhpcyB3aWxsIGZhaWwgaWYgYnNzIGlzIDAgYnl0ZXMgLi4uCi0JICovCi0JcjAgPSAwICh6KTsKIAlyMS5sID0gX19fYnNzX3N0YXJ0OwogCXIxLmggPSBfX19ic3Nfc3RhcnQ7CiAJcjIubCA9IF9fX2Jzc19zdG9wOwogCXIyLmggPSBfX19ic3Nfc3RvcDsKLQlyMiA9IHIyIC0gcjE7Ci0JcjIgPj49IDI7Ci0JcDEgPSByMTsKLQlwMiA9IHIyOwotCWxzZXR1cCAoLkxfY2xlYXJfYnNzLCAuTF9jbGVhcl9ic3MpIGxjMCA9IHAyOwotLkxfY2xlYXJfYnNzOgotCVtwMSsrXSA9IHIwOwotCi0JLyogSW4gY2FzZSB0aGVyZSBpcyBhIE5VTEwgcG9pbnRlciByZWZlcmVuY2UsCi0JICogemVybyBvdXQgcmVnaW9uIGJlZm9yZSBzdGV4dAotCSAqLwotCXAxID0gcjA7Ci0JcjIubCA9IF9fc3RleHQ7Ci0JcjIuaCA9IF9fc3RleHQ7Ci0JcjIgPj49IDI7Ci0JcDIgPSByMjsKLQlsc2V0dXAgKC5MX2NsZWFyX3plcm8sIC5MX2NsZWFyX3plcm8pIGxjMCA9IHAyOwotLkxfY2xlYXJfemVybzoKLQlbcDErK10gPSByMDsKKwljYWxsIF9faW5pdF9jbGVhcl9ic3MKIAogCS8qIFBhc3MgdGhlIHUtYm9vdCBhcmd1bWVudHMgdG8gdGhlIGdsb2JhbCB2YWx1ZSBjb21tYW5kIGxpbmUgKi8KIAlSMCA9IFI3OwpAQCAtMjk5LDYgKzI0OSw5IEBACiAJc3AgPSBzcCArIHAxOwogCXVzcCA9IHNwOwogCWZwID0gc3A7CisJc3AgKz0gLTEyOworCWNhbGwgX2luaXRfcGRhCisJc3AgKz0gMTI7CiAJanVtcC5sIF9zdGFydF9rZXJuZWw7CiBFTkRQUk9DKF9yZWFsX3N0YXJ0KQogCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtY29tbW9uL2ludGVycnVwdC5TIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9pbnRlcnJ1cHQuUwppbmRleCA0YTJlYzdhLi40NzNkZjBmIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtY29tbW9uL2ludGVycnVwdC5TCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vaW50ZXJydXB0LlMKQEAgLTEyOSw4ICsxMjksMTUgQEAKICNlbmRpZgogCXIxID0gIHNwOwogCVNQICs9IC0xMjsKKyNpZmRlZiBDT05GSUdfSVBJUEUKKwljYWxsIF9fX2lwaXBlX2dyYWJfaXJxCisJU1AgKz0gMTI7CisJY2MgPSByMCA9PSAwOworCWlmIGNjIGp1bXAgLkxjb21tb25fcmVzdG9yZV9jb250ZXh0OworI2Vsc2UgLyogQ09ORklHX0lQSVBFICovCiAJY2FsbCBfZG9faXJxOwogCVNQICs9IDEyOworI2VuZGlmIC8qIENPTkZJR19JUElQRSAqLwogCWNhbGwgX3JldHVybl9mcm9tX2ludDsKIC5MY29tbW9uX3Jlc3RvcmVfY29udGV4dDoKIAlSRVNUT1JFX0NPTlRFWFQKQEAgLTE1MiwxNSArMTU5LDYgQEAKIDE6CiAjZW5kaWYKIAotI2lmZGVmIENPTkZJR19IQVJEV0FSRV9QTQotCXI3ID0gW3NwICsgUFRfU0VRU1RBVF07Ci0JcjcgPSByNyA+Pj4gMHhlOwotCXI2ID0gMHgxRjsKLQlyNyA9IHI3ICYgcjY7Ci0JcjUgPSAweDEyOwotCWNjID0gcjcgPT0gcjU7Ci0JaWYgY2MganVtcCAuTGNhbGxfZG9fb3ZmOyAvKiBkZWFsIHdpdGggcGVyZm9ybWFuY2UgY291bnRlciBvdmVyZmxvdyAqLwotI2VuZGlmCiAJIyBXZSBhcmUgZ29pbmcgdG8gZHVtcCBzb21ldGhpbmcgb3V0LCBzbyBtYWtlIHN1cmUgd2UgcHJpbnQgSVBFTkQgcHJvcGVybHkKIAlwMi5sID0gbG8oSVBFTkQpOwogCXAyLmggPSBoaShJUEVORCk7CkBAIC0xOTIsMTcgKzE5MCw2IEBACiAuTGNvbW1vbl9yZXN0b3JlX2FsbF9zeXM6CiAJUkVTVE9SRV9BTExfU1lTCiAJcnRpOwotCi0jaWZkZWYgQ09ORklHX0hBUkRXQVJFX1BNCi0uTGNhbGxfZG9fb3ZmOgotCi0JU1AgKz0gLTEyOwotCWNhbGwgX3BtX292ZXJmbG93OwotCVNQICs9IDEyOwotCi0JanVtcCAuTGNvbW1vbl9yZXN0b3JlX2FsbF9zeXM7Ci0jZW5kaWYKLQogRU5EUFJPQyhfZXZ0X2l2aHcpCiAKIC8qIEludGVycnVwdCByb3V0aW5lIGZvciBldnQyIChOTUkpLgpAQCAtMjQ1LDMgKzIzMiw1NiBAQAogCWNhbGwgX3N5c3RlbV9jYWxsOwogCWp1bXAgLkxjb21tb25fcmVzdG9yZV9jb250ZXh0OwogRU5EUFJPQyhfZXZ0X3N5c3RlbV9jYWxsKQorCisjaWZkZWYgQ09ORklHX0lQSVBFCitFTlRSWShfX19pcGlwZV9jYWxsX2lycXRhaWwpCisJcjAubCA9IDFmOworCXIwLmggPSAxZjsKKwlyZXRpID0gcjA7CisJcnRpOworMToKKwlbLS1zcF0gPSByZXRzOworCVstLXNwXSA9ICggcjc6NCwgcDU6MyApOworCXAwLmwgPSBfX19pcGlwZV9pcnFfdGFpbF9ob29rOworCXAwLmggPSBfX19pcGlwZV9pcnFfdGFpbF9ob29rOworCXAwID0gW3AwXTsKKwlzcCArPSAtMTI7CisJY2FsbCAocDApOworCXNwICs9IDEyOworCSggcjc6NCwgcDU6MyApID0gW3NwKytdOworCXJldHMgPSBbc3ArK107CisKKwlbLS1zcF0gPSByZXRpOworCXJldGkgPSBbc3ArK107ICAgICAgICAgIC8qIElSUXMgYXJlIG9mZi4gKi8KKwlyMC5oID0gM2Y7CisJcjAubCA9IDNmOworCXAwLmwgPSBsbyhFVlQxNCk7CisJcDAuaCA9IGhpKEVWVDE0KTsKKwlbcDBdID0gcjA7CisJY3N5bmM7CisJcjAgPSAweDQwMWY7CisJc3RpIHIwOworCXJhaXNlIDE0OworCVstLXNwXSA9IHJldGk7ICAgICAgICAgIC8qIElSUXMgb24uICovCisyOgorCWp1bXAgMmI7ICAgICAgICAgICAgICAgIC8qIExpa2VseSBwYXJhbm9pZC4gKi8KKzM6CisJc3AgKz0gNDsgICAgICAgICAgICAgICAgLyogRGlzY2FyZCBzYXZlZCBSRVRJICovCisJcjAuaCA9IF9ldnQxNF9zb2Z0aXJxOworCXIwLmwgPSBfZXZ0MTRfc29mdGlycTsKKwlwMC5sID0gbG8oRVZUMTQpOworCXAwLmggPSBoaShFVlQxNCk7CisJW3AwXSA9IHIwOworCWNzeW5jOworCXAwLmwgPSBfYmZpbl9pcnFfZmxhZ3M7CisJcDAuaCA9IF9iZmluX2lycV9mbGFnczsKKwlyMCA9IFtwMF07CisJc3RpIHIwOworI2lmIDAgLyogRklYTUU6IHRoaXMgYWN0dWFsbHkgcmFpc2VzIHNjaGVkdWxpbmcgbGF0ZW5jaWVzICovCisJLyogUmVlbmFibGUgaW50ZXJydXB0cyAqLworCVstLXNwXSA9IHJldGk7CisJcjAgPSBbc3ArK107CisjZW5kaWYKKwlydHM7CitFTkRQUk9DKF9fX2lwaXBlX2NhbGxfaXJxdGFpbCkKKyNlbmRpZiAvKiBDT05GSUdfSVBJUEUgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vaW50cy1wcmlvcml0eS5jIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9pbnRzLXByaW9yaXR5LmMKaW5kZXggMzRlOGE3Mi4uMWJiYTYwMyAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9pbnRzLXByaW9yaXR5LmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9pbnRzLXByaW9yaXR5LmMKQEAgLTEsOSArMSw2IEBACiAvKgogICogRmlsZTogICAgICAgICBhcmNoL2JsYWNrZmluL21hY2gtY29tbW9uL2ludHMtcHJpb3JpdHkuYwotICogQmFzZWQgb246Ci0gKiBBdXRob3I6CiAgKgotICogQ3JlYXRlZDogICAgICA/CiAgKiBEZXNjcmlwdGlvbjogIFNldCB1cCB0aGUgaW50ZXJydXB0IHByaW9yaXRpZXMKICAqCiAgKiBNb2RpZmllZDoKQEAgLTM3LDYgKzM0LDkgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWxfc3RhdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaWZkZWYgQ09ORklHX0lQSVBFCisjaW5jbHVkZSA8bGludXgvaXBpcGUuaD4KKyNlbmRpZgogI2lmZGVmIENPTkZJR19LR0RCCiAjaW5jbHVkZSA8bGludXgva2dkYi5oPgogI2VuZGlmCkBAIC00NSw2ICs0NSw4IEBACiAjaW5jbHVkZSA8YXNtL2dwaW8uaD4KICNpbmNsdWRlIDxhc20vaXJxX2hhbmRsZXIuaD4KIAorI2RlZmluZSBTSUNfU1lTSVJRKGlycSkJKGlycSAtIChJUlFfQ09SRVRNUiArIDEpKQorCiAjaWZkZWYgQkY1MzdfRkFNSUxZCiAjIGRlZmluZSBCRjUzN19HRU5FUklDX0VSUk9SX0lOVF9ERU1VWAogI2Vsc2UKQEAgLTU4LDEzICs2MCwxNiBAQAogICogLQogICovCiAKKyNpZm5kZWYgQ09ORklHX1NNUAogLyogSW5pdGlhbGl6ZSB0aGlzIHRvIGFuIGFjdHVhbCB2YWx1ZSB0byBmb3JjZSBpdCBpbnRvIHRoZSAuZGF0YQogICogc2VjdGlvbiBzbyB0aGF0IHdlIGtub3cgaXQgaXMgcHJvcGVybHkgaW5pdGlhbGl6ZWQgYXQgZW50cnkgaW50bwogICogdGhlIGtlcm5lbCBidXQgYmVmb3JlIGJzcyBpcyBpbml0aWFsaXplZCB0byB6ZXJvICh3aGljaCBpcyB3aGVyZQogICogaXQgd291bGQgbGl2ZSBvdGhlcndpc2UpLiAgVGhlIDB4MWYgbWFnaWMgcmVwcmVzZW50cyB0aGUgSVJRcyB3ZQogICogY2Fubm90IGFjdHVhbGx5IG1hc2sgb3V0IGluIGhhcmR3YXJlLgogICovCi11bnNpZ25lZCBsb25nIGlycV9mbGFncyA9IDB4MWY7Cit1bnNpZ25lZCBsb25nIGJmaW5faXJxX2ZsYWdzID0gMHgxZjsKK0VYUE9SVF9TWU1CT0woYmZpbl9pcnFfZmxhZ3MpOworI2VuZGlmCiAKIC8qIFRoZSBudW1iZXIgb2Ygc3B1cmlvdXMgaW50ZXJydXB0cyAqLwogYXRvbWljX3QgbnVtX3NwdXJpb3VzOwpAQCAtMTAzLDEyICsxMDgsMTQgQEAKIAkJZm9yIChpcnFuID0gMDsgaXJxbiA8IE5SX1BFUklfSU5UUzsgaXJxbisrKSB7CiAJCQlpbnQgaWFyX3NoaWZ0ID0gKGlycW4gJiA3KSAqIDQ7CiAJCQkJaWYgKGl2ZyA9PSAoMHhmICYKLSNpZm5kZWYgQ09ORklHX0JGNTJ4CisjaWYgZGVmaW5lZChDT05GSUdfQkY1MngpIHx8IGRlZmluZWQoQ09ORklHX0JGNTM4KSBcCisJfHwgZGVmaW5lZChDT05GSUdfQkY1MzkpIHx8IGRlZmluZWQoQ09ORklHX0JGNTF4KQogCQkJICAgICBiZmluX3JlYWQzMigodW5zaWduZWQgbG9uZyAqKVNJQ19JQVIwICsKLQkJCQkJIChpcnFuID4+IDMpKSA+PiBpYXJfc2hpZnQpKSB7CisJCQkJCSAoKGlycW4gJSAzMikgPj4gMykgKyAoKGlycW4gLyAzMikgKgorCQkJCQkgKChTSUNfSUFSNCAtIFNJQ19JQVIwKSAvIDQpKSkgPj4gaWFyX3NoaWZ0KSkgewogI2Vsc2UKIAkJCSAgICAgYmZpbl9yZWFkMzIoKHVuc2lnbmVkIGxvbmcgKilTSUNfSUFSMCArCi0JCQkJCSAoKGlycW4lMzIpID4+IDMpICsgKChpcnFuIC8gMzIpICogMTYpKSA+PiBpYXJfc2hpZnQpKSB7CisJCQkJCSAoaXJxbiA+PiAzKSkgPj4gaWFyX3NoaWZ0KSkgewogI2VuZGlmCiAJCQkJaXZnX3RhYmxlW2lycV9wb3NdLmlycW5vID0gSVZHNyArIGlycW47CiAJCQkJaXZnX3RhYmxlW2lycV9wb3NdLmlzcmZsYWcgPSAxIDw8IChpcnFuICUgMzIpOwpAQCAtMTMwLDI1ICsxMzcsMjUgQEAKIAogc3RhdGljIHZvaWQgYmZpbl9jb3JlX21hc2tfaXJxKHVuc2lnbmVkIGludCBpcnEpCiB7Ci0JaXJxX2ZsYWdzICY9IH4oMSA8PCBpcnEpOwotCWlmICghaXJxc19kaXNhYmxlZCgpKQotCQlsb2NhbF9pcnFfZW5hYmxlKCk7CisJYmZpbl9pcnFfZmxhZ3MgJj0gfigxIDw8IGlycSk7CisJaWYgKCFpcnFzX2Rpc2FibGVkX2h3KCkpCisJCWxvY2FsX2lycV9lbmFibGVfaHcoKTsKIH0KIAogc3RhdGljIHZvaWQgYmZpbl9jb3JlX3VubWFza19pcnEodW5zaWduZWQgaW50IGlycSkKIHsKLQlpcnFfZmxhZ3MgfD0gMSA8PCBpcnE7CisJYmZpbl9pcnFfZmxhZ3MgfD0gMSA8PCBpcnE7CiAJLyoKIAkgKiBJZiBpbnRlcnJ1cHRzIGFyZSBlbmFibGVkLCBJTUFTSyBtdXN0IGNvbnRhaW4gdGhlIHNhbWUgdmFsdWUKLQkgKiBhcyBpcnFfZmxhZ3MuICBNYWtlIHN1cmUgdGhhdCBpbnZhcmlhbnQgaG9sZHMuICBJZiBpbnRlcnJ1cHRzCisJICogYXMgYmZpbl9pcnFfZmxhZ3MuICBNYWtlIHN1cmUgdGhhdCBpbnZhcmlhbnQgaG9sZHMuICBJZiBpbnRlcnJ1cHRzCiAJICogYXJlIGN1cnJlbnRseSBkaXNhYmxlZCB3ZSBuZWVkIG5vdCBkbyBhbnl0aGluZzsgb25lIG9mIHRoZQogCSAqIGNhbGxlcnMgd2lsbCB0YWtlIGNhcmUgb2Ygc2V0dGluZyBJTUFTSyB0byB0aGUgcHJvcGVyIHZhbHVlCiAJICogd2hlbiByZWVuYWJsaW5nIGludGVycnVwdHMuCi0JICogbG9jYWxfaXJxX2VuYWJsZSBqdXN0IGRvZXMgIlNUSSBpcnFfZmxhZ3MiLCBzbyBpdCdzIGV4YWN0bHkKKwkgKiBsb2NhbF9pcnFfZW5hYmxlIGp1c3QgZG9lcyAiU1RJIGJmaW5faXJxX2ZsYWdzIiwgc28gaXQncyBleGFjdGx5CiAJICogd2hhdCB3ZSBuZWVkLgogCSAqLwotCWlmICghaXJxc19kaXNhYmxlZCgpKQotCQlsb2NhbF9pcnFfZW5hYmxlKCk7CisJaWYgKCFpcnFzX2Rpc2FibGVkX2h3KCkpCisJCWxvY2FsX2lycV9lbmFibGVfaHcoKTsKIAlyZXR1cm47CiB9CiAKQEAgLTE2Myw4ICsxNzAsMTEgQEAKIAltYXNrX2JpdCA9IFNJQ19TWVNJUlEoaXJxKSAlIDMyOwogCWJmaW5fd3JpdGVfU0lDX0lNQVNLKG1hc2tfYmFuaywgYmZpbl9yZWFkX1NJQ19JTUFTSyhtYXNrX2JhbmspICYKIAkJCSAgICAgfigxIDw8IG1hc2tfYml0KSk7CisjaWZkZWYgQ09ORklHX1NNUAorCWJmaW5fd3JpdGVfU0lDQl9JTUFTSyhtYXNrX2JhbmssIGJmaW5fcmVhZF9TSUNCX0lNQVNLKG1hc2tfYmFuaykgJgorCQkJICAgICB+KDEgPDwgbWFza19iaXQpKTsKICNlbmRpZgotCVNTWU5DKCk7CisjZW5kaWYKIH0KIAogc3RhdGljIHZvaWQgYmZpbl9pbnRlcm5hbF91bm1hc2tfaXJxKHVuc2lnbmVkIGludCBpcnEpCkBAIC0xNzgsMTQgKzE4OCwxNyBAQAogCW1hc2tfYml0ID0gU0lDX1NZU0lSUShpcnEpICUgMzI7CiAJYmZpbl93cml0ZV9TSUNfSU1BU0sobWFza19iYW5rLCBiZmluX3JlYWRfU0lDX0lNQVNLKG1hc2tfYmFuaykgfAogCQkJICAgICAoMSA8PCBtYXNrX2JpdCkpOworI2lmZGVmIENPTkZJR19TTVAKKwliZmluX3dyaXRlX1NJQ0JfSU1BU0sobWFza19iYW5rLCBiZmluX3JlYWRfU0lDQl9JTUFTSyhtYXNrX2JhbmspIHwKKwkJCSAgICAgKDEgPDwgbWFza19iaXQpKTsKICNlbmRpZgotCVNTWU5DKCk7CisjZW5kaWYKIH0KIAogI2lmZGVmIENPTkZJR19QTQogaW50IGJmaW5faW50ZXJuYWxfc2V0X3dha2UodW5zaWduZWQgaW50IGlycSwgdW5zaWduZWQgaW50IHN0YXRlKQogewotCXVuc2lnbmVkIGJhbmssIGJpdCwgd2FrZXVwID0gMDsKKwl1MzIgYmFuaywgYml0LCB3YWtldXAgPSAwOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJYmFuayA9IFNJQ19TWVNJUlEoaXJxKSAvIDMyOwogCWJpdCA9IFNJQ19TWVNJUlEoaXJxKSAlIDMyOwpAQCAtMjI1LDcgKzIzOCw3IEBACiAJYnJlYWs7CiAJfQogCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCWxvY2FsX2lycV9zYXZlX2h3KGZsYWdzKTsKIAogCWlmIChzdGF0ZSkgewogCQliZmluX3NpY19pd3JbYmFua10gfD0gKDEgPDwgYml0KTsKQEAgLTIzNiw3ICsyNDksNyBAQAogCQl2cl93YWtldXAgICY9IH53YWtldXA7CiAJfQogCi0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCWxvY2FsX2lycV9yZXN0b3JlX2h3KGZsYWdzKTsKIAogCXJldHVybiAwOwogfQpAQCAtMjYyLDYgKzI3NSwxOSBAQAogI2VuZGlmCiB9OwogCitzdGF0aWMgdm9pZCBiZmluX2hhbmRsZV9pcnEodW5zaWduZWQgaXJxKQoreworI2lmZGVmIENPTkZJR19JUElQRQorCXN0cnVjdCBwdF9yZWdzIHJlZ3M7ICAgIC8qIENvbnRlbnRzIG5vdCB1c2VkLiAqLworCWlwaXBlX3RyYWNlX2lycV9lbnRyeShpcnEpOworCV9faXBpcGVfaGFuZGxlX2lycShpcnEsICZyZWdzKTsKKwlpcGlwZV90cmFjZV9pcnFfZXhpdChpcnEpOworI2Vsc2UgLyogIUNPTkZJR19JUElQRSAqLworCXN0cnVjdCBpcnFfZGVzYyAqZGVzYyA9IGlycV9kZXNjICsgaXJxOworCWRlc2MtPmhhbmRsZV9pcnEoaXJxLCBkZXNjKTsKKyNlbmRpZiAgLyogIUNPTkZJR19JUElQRSAqLworfQorCiAjaWZkZWYgQkY1MzdfR0VORVJJQ19FUlJPUl9JTlRfREVNVVgKIHN0YXRpYyBpbnQgZXJyb3JfaW50X21hc2s7CiAKQEAgLTI5Miw4ICszMTgsNiBAQAogewogCWludCBpcnEgPSAwOwogCi0JU1NZTkMoKTsKLQogI2lmIChkZWZpbmVkKENPTkZJR19CRjUzNykgfHwgZGVmaW5lZChDT05GSUdfQkY1MzYpKQogCWlmIChiZmluX3JlYWRfRU1BQ19TWVNUQVQoKSAmIEVNQUNfRVJSX01BU0spCiAJCWlycSA9IElSUV9NQUNfRVJST1I7CkBAIC0zMTcsMTAgKzM0MSw5IEBACiAJCWlycSA9IElSUV9VQVJUMV9FUlJPUjsKIAogCWlmIChpcnEpIHsKLQkJaWYgKGVycm9yX2ludF9tYXNrICYgKDFMIDw8IChpcnEgLSBJUlFfUFBJX0VSUk9SKSkpIHsKLQkJCXN0cnVjdCBpcnFfZGVzYyAqZGVzYyA9IGlycV9kZXNjICsgaXJxOwotCQkJZGVzYy0+aGFuZGxlX2lycShpcnEsIGRlc2MpOwotCQl9IGVsc2UgeworCQlpZiAoZXJyb3JfaW50X21hc2sgJiAoMUwgPDwgKGlycSAtIElSUV9QUElfRVJST1IpKSkKKwkJCWJmaW5faGFuZGxlX2lycShpcnEpOworCQllbHNlIHsKIAogCQkJc3dpdGNoIChpcnEpIHsKIAkJCWNhc2UgSVJRX1BQSV9FUlJPUjoKQEAgLTM2Niw2MiArMzg5LDU3IEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBiZmluX3NldF9pcnFfaGFuZGxlcih1bnNpZ25lZCBpcnEsIGlycV9mbG93X2hhbmRsZXJfdCBoYW5kbGUpCiB7CisjaWZkZWYgQ09ORklHX0lQSVBFCisJX3NldF9pcnFfaGFuZGxlcihpcnEsIGhhbmRsZV9lZGdlX2lycSk7CisjZWxzZQogCXN0cnVjdCBpcnFfZGVzYyAqZGVzYyA9IGlycV9kZXNjICsgaXJxOwogCS8qIE1heSBub3QgY2FsbCBnZW5lcmljIHNldF9pcnFfaGFuZGxlcigpIGR1ZSB0byBzcGlubG9jawogCSAgIHJlY3Vyc2lvbi4gKi8KIAlkZXNjLT5oYW5kbGVfaXJxID0gaGFuZGxlOworI2VuZGlmCiB9CiAKK3N0YXRpYyBERUNMQVJFX0JJVE1BUChncGlvX2VuYWJsZWQsIE1BWF9CTEFDS0ZJTl9HUElPUyk7CitleHRlcm4gdm9pZCBiZmluX2dwaW9faXJxX3ByZXBhcmUodW5zaWduZWQgZ3Bpbyk7CisKICNpZiAhZGVmaW5lZChDT05GSUdfQkY1NHgpCiAKLXN0YXRpYyB1bnNpZ25lZCBzaG9ydCBncGlvX2VuYWJsZWRbZ3Bpb19iYW5rKE1BWF9CTEFDS0ZJTl9HUElPUyldOwotc3RhdGljIHVuc2lnbmVkIHNob3J0IGdwaW9fZWRnZV90cmlnZ2VyZWRbZ3Bpb19iYW5rKE1BWF9CTEFDS0ZJTl9HUElPUyldOwotCi1leHRlcm4gdm9pZCBiZmluX2dwaW9faXJxX3ByZXBhcmUodW5zaWduZWQgZ3Bpbyk7Ci0KIHN0YXRpYyB2b2lkIGJmaW5fZ3Bpb19hY2tfaXJxKHVuc2lnbmVkIGludCBpcnEpCiB7Ci0JdTE2IGdwaW9uciA9IGlycSAtIElSUV9QRjA7Ci0KLQlpZiAoZ3Bpb19lZGdlX3RyaWdnZXJlZFtncGlvX2JhbmsoZ3Bpb25yKV0gJiBncGlvX2JpdChncGlvbnIpKSB7Ci0JCXNldF9ncGlvX2RhdGEoZ3Bpb25yLCAwKTsKLQkJU1NZTkMoKTsKLQl9CisJLyogQUZBSUsgYWNrX2lycSBpbiBjYXNlIG1hc2tfYWNrIGlzIHByb3ZpZGVkCisJICogZ2V0J3Mgb25seSBjYWxsZWQgZm9yIGVkZ2Ugc2Vuc2UgaXJxcworCSAqLworCXNldF9ncGlvX2RhdGEoaXJxX3RvX2dwaW8oaXJxKSwgMCk7CiB9CiAKIHN0YXRpYyB2b2lkIGJmaW5fZ3Bpb19tYXNrX2Fja19pcnEodW5zaWduZWQgaW50IGlycSkKIHsKLQl1MTYgZ3Bpb25yID0gaXJxIC0gSVJRX1BGMDsKKwlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MgPSBpcnFfZGVzYyArIGlycTsKKwl1MzIgZ3Bpb25yID0gaXJxX3RvX2dwaW8oaXJxKTsKIAotCWlmIChncGlvX2VkZ2VfdHJpZ2dlcmVkW2dwaW9fYmFuayhncGlvbnIpXSAmIGdwaW9fYml0KGdwaW9ucikpIHsKKwlpZiAoZGVzYy0+aGFuZGxlX2lycSA9PSBoYW5kbGVfZWRnZV9pcnEpCiAJCXNldF9ncGlvX2RhdGEoZ3Bpb25yLCAwKTsKLQkJU1NZTkMoKTsKLQl9CiAKIAlzZXRfZ3Bpb19tYXNrYShncGlvbnIsIDApOwotCVNTWU5DKCk7CiB9CiAKIHN0YXRpYyB2b2lkIGJmaW5fZ3Bpb19tYXNrX2lycSh1bnNpZ25lZCBpbnQgaXJxKQogewotCXNldF9ncGlvX21hc2thKGlycSAtIElSUV9QRjAsIDApOwotCVNTWU5DKCk7CisJc2V0X2dwaW9fbWFza2EoaXJxX3RvX2dwaW8oaXJxKSwgMCk7CiB9CiAKIHN0YXRpYyB2b2lkIGJmaW5fZ3Bpb191bm1hc2tfaXJxKHVuc2lnbmVkIGludCBpcnEpCiB7Ci0Jc2V0X2dwaW9fbWFza2EoaXJxIC0gSVJRX1BGMCwgMSk7Ci0JU1NZTkMoKTsKKwlzZXRfZ3Bpb19tYXNrYShpcnFfdG9fZ3BpbyhpcnEpLCAxKTsKIH0KIAogc3RhdGljIHVuc2lnbmVkIGludCBiZmluX2dwaW9faXJxX3N0YXJ0dXAodW5zaWduZWQgaW50IGlycSkKIHsKLQl1MTYgZ3Bpb25yID0gaXJxIC0gSVJRX1BGMDsKKwl1MzIgZ3Bpb25yID0gaXJxX3RvX2dwaW8oaXJxKTsKIAotCWlmICghKGdwaW9fZW5hYmxlZFtncGlvX2JhbmsoZ3Bpb25yKV0gJiBncGlvX2JpdChncGlvbnIpKSkKKwlpZiAoX190ZXN0X2FuZF9zZXRfYml0KGdwaW9uciwgZ3Bpb19lbmFibGVkKSkKIAkJYmZpbl9ncGlvX2lycV9wcmVwYXJlKGdwaW9ucik7CiAKLQlncGlvX2VuYWJsZWRbZ3Bpb19iYW5rKGdwaW9ucildIHw9IGdwaW9fYml0KGdwaW9ucik7CiAJYmZpbl9ncGlvX3VubWFza19pcnEoaXJxKTsKIAogCXJldHVybiAwOwpAQCAtNDI5LDI5ICs0NDcsMzkgQEAKIAogc3RhdGljIHZvaWQgYmZpbl9ncGlvX2lycV9zaHV0ZG93bih1bnNpZ25lZCBpbnQgaXJxKQogeworCXUzMiBncGlvbnIgPSBpcnFfdG9fZ3BpbyhpcnEpOworCiAJYmZpbl9ncGlvX21hc2tfaXJxKGlycSk7Ci0JZ3Bpb19lbmFibGVkW2dwaW9fYmFuayhpcnEgLSBJUlFfUEYwKV0gJj0gfmdwaW9fYml0KGlycSAtIElSUV9QRjApOworCV9fY2xlYXJfYml0KGdwaW9uciwgZ3Bpb19lbmFibGVkKTsKKwliZmluX2dwaW9faXJxX2ZyZWUoZ3Bpb25yKTsKIH0KIAogc3RhdGljIGludCBiZmluX2dwaW9faXJxX3R5cGUodW5zaWduZWQgaW50IGlycSwgdW5zaWduZWQgaW50IHR5cGUpCiB7Ci0JdTE2IGdwaW9uciA9IGlycSAtIElSUV9QRjA7CisJaW50IHJldDsKKwljaGFyIGJ1ZlsxNl07CisJdTMyIGdwaW9uciA9IGlycV90b19ncGlvKGlycSk7CiAKIAlpZiAodHlwZSA9PSBJUlFfVFlQRV9QUk9CRSkgewogCQkvKiBvbmx5IHByb2JlIHVuZW5hYmxlZCBHUElPIGludGVycnVwdCBsaW5lcyAqLwotCQlpZiAoZ3Bpb19lbmFibGVkW2dwaW9fYmFuayhncGlvbnIpXSAmIGdwaW9fYml0KGdwaW9ucikpCisJCWlmIChfX3Rlc3RfYml0KGdwaW9uciwgZ3Bpb19lbmFibGVkKSkKIAkJCXJldHVybiAwOwogCQl0eXBlID0gSVJRX1RZUEVfRURHRV9SSVNJTkcgfCBJUlFfVFlQRV9FREdFX0ZBTExJTkc7CiAJfQogCiAJaWYgKHR5cGUgJiAoSVJRX1RZUEVfRURHRV9SSVNJTkcgfCBJUlFfVFlQRV9FREdFX0ZBTExJTkcgfAogCQkgICAgSVJRX1RZUEVfTEVWRUxfSElHSCB8IElSUV9UWVBFX0xFVkVMX0xPVykpIHsKLQkJaWYgKCEoZ3Bpb19lbmFibGVkW2dwaW9fYmFuayhncGlvbnIpXSAmIGdwaW9fYml0KGdwaW9ucikpKQorCisJCXNucHJpbnRmKGJ1ZiwgMTYsICJncGlvLWlycSVkIiwgaXJxKTsKKwkJcmV0ID0gYmZpbl9ncGlvX2lycV9yZXF1ZXN0KGdwaW9uciwgYnVmKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKKwkJaWYgKF9fdGVzdF9hbmRfc2V0X2JpdChncGlvbnIsIGdwaW9fZW5hYmxlZCkpCiAJCQliZmluX2dwaW9faXJxX3ByZXBhcmUoZ3Bpb25yKTsKIAotCQlncGlvX2VuYWJsZWRbZ3Bpb19iYW5rKGdwaW9ucildIHw9IGdwaW9fYml0KGdwaW9ucik7CiAJfSBlbHNlIHsKLQkJZ3Bpb19lbmFibGVkW2dwaW9fYmFuayhncGlvbnIpXSAmPSB+Z3Bpb19iaXQoZ3Bpb25yKTsKKwkJX19jbGVhcl9iaXQoZ3Bpb25yLCBncGlvX2VuYWJsZWQpOwogCQlyZXR1cm4gMDsKIAl9CiAKQEAgLTQ3MiwxNyArNTAwLDEzIEBACiAJaWYgKHR5cGUgJiAoSVJRX1RZUEVfRURHRV9SSVNJTkcgfCBJUlFfVFlQRV9FREdFX0ZBTExJTkcpKSB7CiAJCXNldF9ncGlvX2VkZ2UoZ3Bpb25yLCAxKTsKIAkJc2V0X2dwaW9faW5lbihncGlvbnIsIDEpOwotCQlncGlvX2VkZ2VfdHJpZ2dlcmVkW2dwaW9fYmFuayhncGlvbnIpXSB8PSBncGlvX2JpdChncGlvbnIpOwogCQlzZXRfZ3Bpb19kYXRhKGdwaW9uciwgMCk7CiAKIAl9IGVsc2UgewogCQlzZXRfZ3Bpb19lZGdlKGdwaW9uciwgMCk7Ci0JCWdwaW9fZWRnZV90cmlnZ2VyZWRbZ3Bpb19iYW5rKGdwaW9ucildICY9IH5ncGlvX2JpdChncGlvbnIpOwogCQlzZXRfZ3Bpb19pbmVuKGdwaW9uciwgMSk7CiAJfQogCi0JU1NZTkMoKTsKLQogCWlmICh0eXBlICYgKElSUV9UWVBFX0VER0VfUklTSU5HIHwgSVJRX1RZUEVfRURHRV9GQUxMSU5HKSkKIAkJYmZpbl9zZXRfaXJxX2hhbmRsZXIoaXJxLCBoYW5kbGVfZWRnZV9pcnEpOwogCWVsc2UKQEAgLTUwNSwyMiArNTI5LDYgQEAKIH0KICNlbmRpZgogCi1zdGF0aWMgc3RydWN0IGlycV9jaGlwIGJmaW5fZ3Bpb19pcnFjaGlwID0gewotCS5uYW1lID0gIkdQSU8iLAotCS5hY2sgPSBiZmluX2dwaW9fYWNrX2lycSwKLQkubWFzayA9IGJmaW5fZ3Bpb19tYXNrX2lycSwKLQkubWFza19hY2sgPSBiZmluX2dwaW9fbWFza19hY2tfaXJxLAotCS51bm1hc2sgPSBiZmluX2dwaW9fdW5tYXNrX2lycSwKLQkuZGlzYWJsZSA9IGJmaW5fZ3Bpb19tYXNrX2lycSwKLQkuZW5hYmxlID0gYmZpbl9ncGlvX3VubWFza19pcnEsCi0JLnNldF90eXBlID0gYmZpbl9ncGlvX2lycV90eXBlLAotCS5zdGFydHVwID0gYmZpbl9ncGlvX2lycV9zdGFydHVwLAotCS5zaHV0ZG93biA9IGJmaW5fZ3Bpb19pcnFfc2h1dGRvd24sCi0jaWZkZWYgQ09ORklHX1BNCi0JLnNldF93YWtlID0gYmZpbl9ncGlvX3NldF93YWtlLAotI2VuZGlmCi19OwotCiBzdGF0aWMgdm9pZCBiZmluX2RlbXV4X2dwaW9faXJxKHVuc2lnbmVkIGludCBpbnRhX2lycSwKIAkJCQlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpCiB7CkBAIC01MzcsNyArNTQ1LDExIEBACiAJCWlycSA9IElSUV9QSDA7CiAJCWJyZWFrOwogIyBlbmRpZgotI2VsaWYgZGVmaW5lZChDT05GSUdfQkY1MngpCisjZWxpZiBkZWZpbmVkKENPTkZJR19CRjUzOCkgfHwgZGVmaW5lZChDT05GSUdfQkY1MzkpCisJY2FzZSBJUlFfUE9SVEZfSU5UQToKKwkJaXJxID0gSVJRX1BGMDsKKwkJYnJlYWs7CisjZWxpZiBkZWZpbmVkKENPTkZJR19CRjUyeCkgfHwgZGVmaW5lZChDT05GSUdfQkY1MXgpCiAJY2FzZSBJUlFfUE9SVEZfSU5UQToKIAkJaXJxID0gSVJRX1BGMDsKIAkJYnJlYWs7CkBAIC01NjcsMzAgKzU3OSwyMiBAQAogCQlmb3IgKGkgPSAwOyBpIDwgTUFYX0JMQUNLRklOX0dQSU9TOyBpICs9IEdQSU9fQkFOS1NJWkUpIHsKIAkJCWlycSArPSBpOwogCi0JCQltYXNrID0gZ2V0X2dwaW9wX2RhdGEoaSkgJgotCQkJCShncGlvX2VuYWJsZWRbZ3Bpb19iYW5rKGkpXSAmCi0JCQkJZ2V0X2dwaW9wX21hc2thKGkpKTsKKwkJCW1hc2sgPSBnZXRfZ3Bpb3BfZGF0YShpKSAmIGdldF9ncGlvcF9tYXNrYShpKTsKIAogCQkJd2hpbGUgKG1hc2spIHsKLQkJCQlpZiAobWFzayAmIDEpIHsKLQkJCQkJZGVzYyA9IGlycV9kZXNjICsgaXJxOwotCQkJCQlkZXNjLT5oYW5kbGVfaXJxKGlycSwgZGVzYyk7Ci0JCQkJfQorCQkJCWlmIChtYXNrICYgMSkKKwkJCQkJYmZpbl9oYW5kbGVfaXJxKGlycSk7CiAJCQkJaXJxKys7CiAJCQkJbWFzayA+Pj0gMTsKIAkJCX0KIAkJfQogCX0gZWxzZSB7CiAJCQlncGlvID0gaXJxX3RvX2dwaW8oaXJxKTsKLQkJCW1hc2sgPSBnZXRfZ3Bpb3BfZGF0YShncGlvKSAmCi0JCQkJKGdwaW9fZW5hYmxlZFtncGlvX2JhbmsoZ3BpbyldICYKLQkJCQlnZXRfZ3Bpb3BfbWFza2EoZ3BpbykpOworCQkJbWFzayA9IGdldF9ncGlvcF9kYXRhKGdwaW8pICYgZ2V0X2dwaW9wX21hc2thKGdwaW8pOwogCiAJCQlkbyB7Ci0JCQkJaWYgKG1hc2sgJiAxKSB7Ci0JCQkJCWRlc2MgPSBpcnFfZGVzYyArIGlycTsKLQkJCQkJZGVzYy0+aGFuZGxlX2lycShpcnEsIGRlc2MpOwotCQkJCX0KKwkJCQlpZiAobWFzayAmIDEpCisJCQkJCWJmaW5faGFuZGxlX2lycShpcnEpOwogCQkJCWlycSsrOwogCQkJCW1hc2sgPj49IDE7CiAJCQl9IHdoaWxlIChtYXNrKTsKQEAgLTYxMiwxMCArNjE2LDYgQEAKIHN0YXRpYyB1bnNpZ25lZCBjaGFyIGlycTJwaW50X2x1dFtOUl9QSU5UU107CiBzdGF0aWMgdW5zaWduZWQgY2hhciBwaW50MmlycV9sdXRbTlJfUElOVF9TWVNfSVJRUyAqIE5SX1BJTlRfQklUU107CiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgZ3Bpb19ib3RoX2VkZ2VfdHJpZ2dlcmVkW05SX1BJTlRfU1lTX0lSUVNdOwotc3RhdGljIHVuc2lnbmVkIHNob3J0IGdwaW9fZW5hYmxlZFtncGlvX2JhbmsoTUFYX0JMQUNLRklOX0dQSU9TKV07Ci0KLQogc3RydWN0IHBpbl9pbnRfdCB7CiAJdW5zaWduZWQgaW50IG1hc2tfc2V0OwogCXVuc2lnbmVkIGludCBtYXNrX2NsZWFyOwpAQCAtNjM2LDEyICs2MzYsOSBAQAogCShzdHJ1Y3QgcGluX2ludF90ICopUElOVDNfTUFTS19TRVQsCiB9OwogCi1leHRlcm4gdm9pZCBiZmluX2dwaW9faXJxX3ByZXBhcmUodW5zaWduZWQgZ3Bpbyk7Ci0KLWlubGluZSB1bnNpZ25lZCBzaG9ydCBnZXRfaXJxX2Jhc2UodTggYmFuaywgdTggYm1hcCkKK2lubGluZSB1bnNpZ25lZCBpbnQgZ2V0X2lycV9iYXNlKHUzMiBiYW5rLCB1OCBibWFwKQogewotCi0JdTE2IGlycV9iYXNlOworCXVuc2lnbmVkIGludCBpcnFfYmFzZTsKIAogCWlmIChiYW5rIDwgMikgewkJLypQQS1QQiAqLwogCQlpcnFfYmFzZSA9IElSUV9QQTAgKyBibWFwICogMTY7CkBAIC02NTAsNyArNjQ3LDYgQEAKIAl9CiAKIAlyZXR1cm4gaXJxX2Jhc2U7Ci0KIH0KIAogCS8qIFdoZW5ldmVyIFBJTlR4X0FTU0lHTiBpcyBhbHRlcmVkIGluaXRfcGludF9sdXQoKSBtdXN0IGJlIGV4ZWN1dGVkISAqLwpAQCAtNjc3LDIwICs2NzMsMTggQEAKIAogCQkJcGludDJpcnFfbHV0W2JpdF9wb3NdID0gaXJxX2Jhc2UgLSBTWVNfSVJRUzsKIAkJCWlycTJwaW50X2x1dFtpcnFfYmFzZSAtIFNZU19JUlFTXSA9IGJpdF9wb3M7Ci0KIAkJfQotCiAJfQotCiB9CiAKIHN0YXRpYyB2b2lkIGJmaW5fZ3Bpb19hY2tfaXJxKHVuc2lnbmVkIGludCBpcnEpCiB7Ci0JdTggcGludF92YWwgPSBpcnEycGludF9sdXRbaXJxIC0gU1lTX0lSUVNdOworCXN0cnVjdCBpcnFfZGVzYyAqZGVzYyA9IGlycV9kZXNjICsgaXJxOworCXUzMiBwaW50X3ZhbCA9IGlycTJwaW50X2x1dFtpcnEgLSBTWVNfSVJRU107CiAJdTMyIHBpbnRiaXQgPSBQSU5UX0JJVChwaW50X3ZhbCk7Ci0JdTggYmFuayA9IFBJTlRfMl9CQU5LKHBpbnRfdmFsKTsKKwl1MzIgYmFuayA9IFBJTlRfMl9CQU5LKHBpbnRfdmFsKTsKIAotCWlmICh1bmxpa2VseShncGlvX2JvdGhfZWRnZV90cmlnZ2VyZWRbYmFua10gJiBwaW50Yml0KSkgeworCWlmICgoZGVzYy0+c3RhdHVzICYgSVJRX1RZUEVfU0VOU0VfTUFTSykgPT0gSVJRX1RZUEVfRURHRV9CT1RIKSB7CiAJCWlmIChwaW50W2JhbmtdLT5pbnZlcnRfc2V0ICYgcGludGJpdCkKIAkJCXBpbnRbYmFua10tPmludmVydF9jbGVhciA9IHBpbnRiaXQ7CiAJCWVsc2UKQEAgLTY5OCwxNiArNjkyLDE2IEBACiAJfQogCXBpbnRbYmFua10tPnJlcXVlc3QgPSBwaW50Yml0OwogCi0JU1NZTkMoKTsKIH0KIAogc3RhdGljIHZvaWQgYmZpbl9ncGlvX21hc2tfYWNrX2lycSh1bnNpZ25lZCBpbnQgaXJxKQogewotCXU4IHBpbnRfdmFsID0gaXJxMnBpbnRfbHV0W2lycSAtIFNZU19JUlFTXTsKKwlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MgPSBpcnFfZGVzYyArIGlycTsKKwl1MzIgcGludF92YWwgPSBpcnEycGludF9sdXRbaXJxIC0gU1lTX0lSUVNdOwogCXUzMiBwaW50Yml0ID0gUElOVF9CSVQocGludF92YWwpOwotCXU4IGJhbmsgPSBQSU5UXzJfQkFOSyhwaW50X3ZhbCk7CisJdTMyIGJhbmsgPSBQSU5UXzJfQkFOSyhwaW50X3ZhbCk7CiAKLQlpZiAodW5saWtlbHkoZ3Bpb19ib3RoX2VkZ2VfdHJpZ2dlcmVkW2JhbmtdICYgcGludGJpdCkpIHsKKwlpZiAoKGRlc2MtPnN0YXR1cyAmIElSUV9UWVBFX1NFTlNFX01BU0spID09IElSUV9UWVBFX0VER0VfQk9USCkgewogCQlpZiAocGludFtiYW5rXS0+aW52ZXJ0X3NldCAmIHBpbnRiaXQpCiAJCQlwaW50W2JhbmtdLT5pbnZlcnRfY2xlYXIgPSBwaW50Yml0OwogCQllbHNlCkBAIC03MTYsMzIgKzcxMCwyOSBAQAogCiAJcGludFtiYW5rXS0+cmVxdWVzdCA9IHBpbnRiaXQ7CiAJcGludFtiYW5rXS0+bWFza19jbGVhciA9IHBpbnRiaXQ7Ci0JU1NZTkMoKTsKIH0KIAogc3RhdGljIHZvaWQgYmZpbl9ncGlvX21hc2tfaXJxKHVuc2lnbmVkIGludCBpcnEpCiB7Ci0JdTggcGludF92YWwgPSBpcnEycGludF9sdXRbaXJxIC0gU1lTX0lSUVNdOworCXUzMiBwaW50X3ZhbCA9IGlycTJwaW50X2x1dFtpcnEgLSBTWVNfSVJRU107CiAKIAlwaW50W1BJTlRfMl9CQU5LKHBpbnRfdmFsKV0tPm1hc2tfY2xlYXIgPSBQSU5UX0JJVChwaW50X3ZhbCk7Ci0JU1NZTkMoKTsKIH0KIAogc3RhdGljIHZvaWQgYmZpbl9ncGlvX3VubWFza19pcnEodW5zaWduZWQgaW50IGlycSkKIHsKLQl1OCBwaW50X3ZhbCA9IGlycTJwaW50X2x1dFtpcnEgLSBTWVNfSVJRU107CisJdTMyIHBpbnRfdmFsID0gaXJxMnBpbnRfbHV0W2lycSAtIFNZU19JUlFTXTsKIAl1MzIgcGludGJpdCA9IFBJTlRfQklUKHBpbnRfdmFsKTsKLQl1OCBiYW5rID0gUElOVF8yX0JBTksocGludF92YWwpOworCXUzMiBiYW5rID0gUElOVF8yX0JBTksocGludF92YWwpOwogCiAJcGludFtiYW5rXS0+cmVxdWVzdCA9IHBpbnRiaXQ7CiAJcGludFtiYW5rXS0+bWFza19zZXQgPSBwaW50Yml0OwotCVNTWU5DKCk7CiB9CiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgYmZpbl9ncGlvX2lycV9zdGFydHVwKHVuc2lnbmVkIGludCBpcnEpCiB7Ci0JdTE2IGdwaW9uciA9IGlycV90b19ncGlvKGlycSk7Ci0JdTggcGludF92YWwgPSBpcnEycGludF9sdXRbaXJxIC0gU1lTX0lSUVNdOworCXUzMiBncGlvbnIgPSBpcnFfdG9fZ3BpbyhpcnEpOworCXUzMiBwaW50X3ZhbCA9IGlycTJwaW50X2x1dFtpcnEgLSBTWVNfSVJRU107CiAKIAlpZiAocGludF92YWwgPT0gSVJRX05PVF9BVkFJTCkgewogCQlwcmludGsoS0VSTl9FUlIKQEAgLTc1MCwxMCArNzQxLDkgQEAKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCi0JaWYgKCEoZ3Bpb19lbmFibGVkW2dwaW9fYmFuayhncGlvbnIpXSAmIGdwaW9fYml0KGdwaW9ucikpKQorCWlmIChfX3Rlc3RfYW5kX3NldF9iaXQoZ3Bpb25yLCBncGlvX2VuYWJsZWQpKQogCQliZmluX2dwaW9faXJxX3ByZXBhcmUoZ3Bpb25yKTsKIAotCWdwaW9fZW5hYmxlZFtncGlvX2JhbmsoZ3Bpb25yKV0gfD0gZ3Bpb19iaXQoZ3Bpb25yKTsKIAliZmluX2dwaW9fdW5tYXNrX2lycShpcnEpOwogCiAJcmV0dXJuIDA7CkBAIC03NjEsMzggKzc1MSw0NSBAQAogCiBzdGF0aWMgdm9pZCBiZmluX2dwaW9faXJxX3NodXRkb3duKHVuc2lnbmVkIGludCBpcnEpCiB7Ci0JdTE2IGdwaW9uciA9IGlycV90b19ncGlvKGlycSk7CisJdTMyIGdwaW9uciA9IGlycV90b19ncGlvKGlycSk7CiAKIAliZmluX2dwaW9fbWFza19pcnEoaXJxKTsKLQlncGlvX2VuYWJsZWRbZ3Bpb19iYW5rKGdwaW9ucildICY9IH5ncGlvX2JpdChncGlvbnIpOworCV9fY2xlYXJfYml0KGdwaW9uciwgZ3Bpb19lbmFibGVkKTsKKwliZmluX2dwaW9faXJxX2ZyZWUoZ3Bpb25yKTsKIH0KIAogc3RhdGljIGludCBiZmluX2dwaW9faXJxX3R5cGUodW5zaWduZWQgaW50IGlycSwgdW5zaWduZWQgaW50IHR5cGUpCiB7Ci0KLQl1MTYgZ3Bpb25yID0gaXJxX3RvX2dwaW8oaXJxKTsKLQl1OCBwaW50X3ZhbCA9IGlycTJwaW50X2x1dFtpcnEgLSBTWVNfSVJRU107CisJaW50IHJldDsKKwljaGFyIGJ1ZlsxNl07CisJdTMyIGdwaW9uciA9IGlycV90b19ncGlvKGlycSk7CisJdTMyIHBpbnRfdmFsID0gaXJxMnBpbnRfbHV0W2lycSAtIFNZU19JUlFTXTsKIAl1MzIgcGludGJpdCA9IFBJTlRfQklUKHBpbnRfdmFsKTsKLQl1OCBiYW5rID0gUElOVF8yX0JBTksocGludF92YWwpOworCXUzMiBiYW5rID0gUElOVF8yX0JBTksocGludF92YWwpOwogCiAJaWYgKHBpbnRfdmFsID09IElSUV9OT1RfQVZBSUwpCiAJCXJldHVybiAtRU5PREVWOwogCiAJaWYgKHR5cGUgPT0gSVJRX1RZUEVfUFJPQkUpIHsKIAkJLyogb25seSBwcm9iZSB1bmVuYWJsZWQgR1BJTyBpbnRlcnJ1cHQgbGluZXMgKi8KLQkJaWYgKGdwaW9fZW5hYmxlZFtncGlvX2JhbmsoZ3Bpb25yKV0gJiBncGlvX2JpdChncGlvbnIpKQorCQlpZiAoX190ZXN0X2JpdChncGlvbnIsIGdwaW9fZW5hYmxlZCkpCiAJCQlyZXR1cm4gMDsKIAkJdHlwZSA9IElSUV9UWVBFX0VER0VfUklTSU5HIHwgSVJRX1RZUEVfRURHRV9GQUxMSU5HOwogCX0KIAogCWlmICh0eXBlICYgKElSUV9UWVBFX0VER0VfUklTSU5HIHwgSVJRX1RZUEVfRURHRV9GQUxMSU5HIHwKIAkJICAgIElSUV9UWVBFX0xFVkVMX0hJR0ggfCBJUlFfVFlQRV9MRVZFTF9MT1cpKSB7Ci0JCWlmICghKGdwaW9fZW5hYmxlZFtncGlvX2JhbmsoZ3Bpb25yKV0gJiBncGlvX2JpdChncGlvbnIpKSkKKworCQlzbnByaW50ZihidWYsIDE2LCAiZ3Bpby1pcnElZCIsIGlycSk7CisJCXJldCA9IGJmaW5fZ3Bpb19pcnFfcmVxdWVzdChncGlvbnIsIGJ1Zik7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCisJCWlmIChfX3Rlc3RfYW5kX3NldF9iaXQoZ3Bpb25yLCBncGlvX2VuYWJsZWQpKQogCQkJYmZpbl9ncGlvX2lycV9wcmVwYXJlKGdwaW9ucik7CiAKLQkJZ3Bpb19lbmFibGVkW2dwaW9fYmFuayhncGlvbnIpXSB8PSBncGlvX2JpdChncGlvbnIpOwogCX0gZWxzZSB7Ci0JCWdwaW9fZW5hYmxlZFtncGlvX2JhbmsoZ3Bpb25yKV0gJj0gfmdwaW9fYml0KGdwaW9ucik7CisJCV9fY2xlYXJfYml0KGdwaW9uciwgZ3Bpb19lbmFibGVkKTsKIAkJcmV0dXJuIDA7CiAJfQogCkBAIC04MDMsMTUgKzgwMCwxMCBAQAogCiAJaWYgKCh0eXBlICYgKElSUV9UWVBFX0VER0VfUklTSU5HIHwgSVJRX1RZUEVfRURHRV9GQUxMSU5HKSkKIAkgICAgPT0gKElSUV9UWVBFX0VER0VfUklTSU5HIHwgSVJRX1RZUEVfRURHRV9GQUxMSU5HKSkgewotCi0JCWdwaW9fYm90aF9lZGdlX3RyaWdnZXJlZFtiYW5rXSB8PSBwaW50Yml0OwotCiAJCWlmIChncGlvX2dldF92YWx1ZShncGlvbnIpKQogCQkJcGludFtiYW5rXS0+aW52ZXJ0X3NldCA9IHBpbnRiaXQ7CiAJCWVsc2UKIAkJCXBpbnRbYmFua10tPmludmVydF9jbGVhciA9IHBpbnRiaXQ7Ci0JfSBlbHNlIHsKLQkJZ3Bpb19ib3RoX2VkZ2VfdHJpZ2dlcmVkW2JhbmtdICY9IH5waW50Yml0OwogCX0KIAogCWlmICh0eXBlICYgKElSUV9UWVBFX0VER0VfUklTSU5HIHwgSVJRX1RZUEVfRURHRV9GQUxMSU5HKSkgewpAQCAtODIyLDggKzgxNCw2IEBACiAJCWJmaW5fc2V0X2lycV9oYW5kbGVyKGlycSwgaGFuZGxlX2xldmVsX2lycSk7CiAJfQogCi0JU1NZTkMoKTsKLQogCXJldHVybiAwOwogfQogCkBAIC04MzQsNyArODI0LDcgQEAKIGludCBiZmluX2dwaW9fc2V0X3dha2UodW5zaWduZWQgaW50IGlycSwgdW5zaWduZWQgaW50IHN0YXRlKQogewogCXUzMiBwaW50X2lycTsKLQl1OCBwaW50X3ZhbCA9IGlycTJwaW50X2x1dFtpcnEgLSBTWVNfSVJRU107CisJdTMyIHBpbnRfdmFsID0gaXJxMnBpbnRfbHV0W2lycSAtIFNZU19JUlFTXTsKIAl1MzIgYmFuayA9IFBJTlRfMl9CQU5LKHBpbnRfdmFsKTsKIAl1MzIgcGludGJpdCA9IFBJTlRfQklUKHBpbnRfdmFsKTsKIApAQCAtODk1LDI2ICs4ODUsMTAgQEAKIH0KICNlbmRpZgogCi1zdGF0aWMgc3RydWN0IGlycV9jaGlwIGJmaW5fZ3Bpb19pcnFjaGlwID0gewotCS5uYW1lID0gIkdQSU8iLAotCS5hY2sgPSBiZmluX2dwaW9fYWNrX2lycSwKLQkubWFzayA9IGJmaW5fZ3Bpb19tYXNrX2lycSwKLQkubWFza19hY2sgPSBiZmluX2dwaW9fbWFza19hY2tfaXJxLAotCS51bm1hc2sgPSBiZmluX2dwaW9fdW5tYXNrX2lycSwKLQkuZGlzYWJsZSA9IGJmaW5fZ3Bpb19tYXNrX2lycSwKLQkuZW5hYmxlID0gYmZpbl9ncGlvX3VubWFza19pcnEsCi0JLnNldF90eXBlID0gYmZpbl9ncGlvX2lycV90eXBlLAotCS5zdGFydHVwID0gYmZpbl9ncGlvX2lycV9zdGFydHVwLAotCS5zaHV0ZG93biA9IGJmaW5fZ3Bpb19pcnFfc2h1dGRvd24sCi0jaWZkZWYgQ09ORklHX1BNCi0JLnNldF93YWtlID0gYmZpbl9ncGlvX3NldF93YWtlLAotI2VuZGlmCi19OwotCiBzdGF0aWMgdm9pZCBiZmluX2RlbXV4X2dwaW9faXJxKHVuc2lnbmVkIGludCBpbnRhX2lycSwKIAkJCQlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpCiB7Ci0JdTggYmFuaywgcGludF92YWw7CisJdTMyIGJhbmssIHBpbnRfdmFsOwogCXUzMiByZXF1ZXN0LCBpcnE7CiAKIAlzd2l0Y2ggKGludGFfaXJxKSB7CkBAIC05NDEsOCArOTE1LDcgQEAKIAl3aGlsZSAocmVxdWVzdCkgewogCQlpZiAocmVxdWVzdCAmIDEpIHsKIAkJCWlycSA9IHBpbnQyaXJxX2x1dFtwaW50X3ZhbF0gKyBTWVNfSVJRUzsKLQkJCWRlc2MgPSBpcnFfZGVzYyArIGlycTsKLQkJCWRlc2MtPmhhbmRsZV9pcnEoaXJxLCBkZXNjKTsKKwkJCWJmaW5faGFuZGxlX2lycShpcnEpOwogCQl9CiAJCXBpbnRfdmFsKys7CiAJCXJlcXVlc3QgPj49IDE7CkBAIC05NTEsMTAgKzkyNCwyNCBAQAogfQogI2VuZGlmCiAKLXZvaWQgX19pbml0IGluaXRfZXhjZXB0aW9uX3ZlY3RvcnModm9pZCkKLXsKLQlTU1lOQygpOworc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBiZmluX2dwaW9faXJxY2hpcCA9IHsKKwkubmFtZSA9ICJHUElPIiwKKwkuYWNrID0gYmZpbl9ncGlvX2Fja19pcnEsCisJLm1hc2sgPSBiZmluX2dwaW9fbWFza19pcnEsCisJLm1hc2tfYWNrID0gYmZpbl9ncGlvX21hc2tfYWNrX2lycSwKKwkudW5tYXNrID0gYmZpbl9ncGlvX3VubWFza19pcnEsCisJLmRpc2FibGUgPSBiZmluX2dwaW9fbWFza19pcnEsCisJLmVuYWJsZSA9IGJmaW5fZ3Bpb191bm1hc2tfaXJxLAorCS5zZXRfdHlwZSA9IGJmaW5fZ3Bpb19pcnFfdHlwZSwKKwkuc3RhcnR1cCA9IGJmaW5fZ3Bpb19pcnFfc3RhcnR1cCwKKwkuc2h1dGRvd24gPSBiZmluX2dwaW9faXJxX3NodXRkb3duLAorI2lmZGVmIENPTkZJR19QTQorCS5zZXRfd2FrZSA9IGJmaW5fZ3Bpb19zZXRfd2FrZSwKKyNlbmRpZgorfTsKIAordm9pZCBfX2NwdWluaXQgaW5pdF9leGNlcHRpb25fdmVjdG9ycyh2b2lkKQorewogCS8qIGNhbm5vdCBwcm9ncmFtIGluIHNvZnR3YXJlOgogCSAqIGV2dDAgLSBlbXVsYXRpb24gKGp0YWcpCiAJICogZXZ0MSAtIHJlc2V0CkBAIC05NzksMTcgKzk2NiwyMyBAQAogICogVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGR1cmluZyBrZXJuZWwgc3RhcnR1cCB0byBpbml0aWFsaXplCiAgKiB0aGUgQkZpbiBJUlEgaGFuZGxpbmcgcm91dGluZXMuCiAgKi8KKwogaW50IF9faW5pdCBpbml0X2FyY2hfaXJxKHZvaWQpCiB7CiAJaW50IGlycTsKIAl1bnNpZ25lZCBsb25nIGlsYXQgPSAwOwogCS8qICBEaXNhYmxlIGFsbCB0aGUgcGVyaXBoZXJhbCBpbnRycyAgLSBwYWdlIDQtMjkgSFcgUmVmIG1hbnVhbCAqLwotI2lmIGRlZmluZWQoQ09ORklHX0JGNTR4KSB8fCBkZWZpbmVkKENPTkZJR19CRjUyeCkgfHwgZGVmaW5lZChDT05GSUdfQkY1NjEpCisjaWYgZGVmaW5lZChDT05GSUdfQkY1NHgpIHx8IGRlZmluZWQoQ09ORklHX0JGNTJ4KSB8fCBkZWZpbmVkKENPTkZJR19CRjU2MSkgXAorCXx8IGRlZmluZWQoQkY1MzhfRkFNSUxZKSB8fCBkZWZpbmVkKENPTkZJR19CRjUxeCkKIAliZmluX3dyaXRlX1NJQ19JTUFTSzAoU0lDX1VOTUFTS19BTEwpOwogCWJmaW5fd3JpdGVfU0lDX0lNQVNLMShTSUNfVU5NQVNLX0FMTCk7CiAjIGlmZGVmIENPTkZJR19CRjU0eAogCWJmaW5fd3JpdGVfU0lDX0lNQVNLMihTSUNfVU5NQVNLX0FMTCk7CiAjIGVuZGlmCisjIGlmZGVmIENPTkZJR19TTVAKKwliZmluX3dyaXRlX1NJQ0JfSU1BU0swKFNJQ19VTk1BU0tfQUxMKTsKKwliZmluX3dyaXRlX1NJQ0JfSU1BU0sxKFNJQ19VTk1BU0tfQUxMKTsKKyMgZW5kaWYKICNlbHNlCiAJYmZpbl93cml0ZV9TSUNfSU1BU0soU0lDX1VOTUFTS19BTEwpOwogI2VuZGlmCkBAIC0xMDI5LDcgKzEwMjIsNyBAQAogCQljYXNlIElSUV9QSU5UMToKIAkJY2FzZSBJUlFfUElOVDI6CiAJCWNhc2UgSVJRX1BJTlQzOgotI2VsaWYgZGVmaW5lZChDT05GSUdfQkY1MngpCisjZWxpZiBkZWZpbmVkKENPTkZJR19CRjUyeCkgfHwgZGVmaW5lZChDT05GSUdfQkY1MXgpCiAJCWNhc2UgSVJRX1BPUlRGX0lOVEE6CiAJCWNhc2UgSVJRX1BPUlRHX0lOVEE6CiAJCWNhc2UgSVJRX1BPUlRIX0lOVEE6CkBAIC0xMDM3LDE4ICsxMDMwLDQxIEBACiAJCWNhc2UgSVJRX1BST0cwX0lOVEE6CiAJCWNhc2UgSVJRX1BST0cxX0lOVEE6CiAJCWNhc2UgSVJRX1BST0cyX0lOVEE6CisjZWxpZiBkZWZpbmVkKENPTkZJR19CRjUzOCkgfHwgZGVmaW5lZChDT05GSUdfQkY1MzkpCisJCWNhc2UgSVJRX1BPUlRGX0lOVEE6CiAjZW5kaWYKKwogCQkJc2V0X2lycV9jaGFpbmVkX2hhbmRsZXIoaXJxLAogCQkJCQkJYmZpbl9kZW11eF9ncGlvX2lycSk7CiAJCQlicmVhazsKICNpZmRlZiBCRjUzN19HRU5FUklDX0VSUk9SX0lOVF9ERU1VWAogCQljYXNlIElSUV9HRU5FUklDX0VSUk9SOgotCQkJc2V0X2lycV9oYW5kbGVyKGlycSwgYmZpbl9kZW11eF9lcnJvcl9pcnEpOwotCisJCQlzZXRfaXJxX2NoYWluZWRfaGFuZGxlcihpcnEsIGJmaW5fZGVtdXhfZXJyb3JfaXJxKTsKKwkJCWJyZWFrOworI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfVElDS19TT1VSQ0VfU1lTVE1SMCkgfHwgZGVmaW5lZChDT05GSUdfSVBJUEUpCisJCWNhc2UgSVJRX1RJTUVSMDoKKwkJCXNldF9pcnFfaGFuZGxlcihpcnEsIGhhbmRsZV9wZXJjcHVfaXJxKTsKKwkJCWJyZWFrOworI2VuZGlmCisjaWZkZWYgQ09ORklHX1NNUAorCQljYXNlIElSUV9TVVBQTEVfMDoKKwkJY2FzZSBJUlFfU1VQUExFXzE6CisJCQlzZXRfaXJxX2hhbmRsZXIoaXJxLCBoYW5kbGVfcGVyY3B1X2lycSk7CiAJCQlicmVhazsKICNlbmRpZgogCQlkZWZhdWx0OgorI2lmZGVmIENPTkZJR19JUElQRQorCS8qCisJICogV2Ugd2FudCBpbnRlcm5hbCBpbnRlcnJ1cHQgc291cmNlcyB0byBiZSBtYXNrZWQsIGJlY2F1c2UKKwkgKiBJU1JzIG1heSB0cmlnZ2VyIGludGVycnVwdHMgcmVjdXJzaXZlbHkgKGUuZy4gRE1BKSwgYnV0CisJICogaW50ZXJydXB0cyBhcmUgX25vdF8gbWFza2VkIGF0IENQVSBsZXZlbC4gU28gbGV0J3MgaGFuZGxlCisJICogdGhlbSBhcyBsZXZlbCBpbnRlcnJ1cHRzLgorCSAqLworCQkJc2V0X2lycV9oYW5kbGVyKGlycSwgaGFuZGxlX2xldmVsX2lycSk7CisjZWxzZSAvKiAhQ09ORklHX0lQSVBFICovCiAJCQlzZXRfaXJxX2hhbmRsZXIoaXJxLCBoYW5kbGVfc2ltcGxlX2lycSk7CisjZW5kaWYgLyogIUNPTkZJR19JUElQRSAqLwogCQkJYnJlYWs7CiAJCX0KIAl9CkBAIC0xMDczLDcgKzEwODksNyBAQAogCUNTWU5DKCk7CiAKIAlwcmludGsoS0VSTl9JTkZPICJDb25maWd1cmluZyBCbGFja2ZpbiBQcmlvcml0eSBEcml2ZW4gSW50ZXJydXB0c1xuIik7Ci0JLyogSU1BU0s9eHh4IGlzIGVxdWl2YWxlbnQgdG8gU1RJIHh4IG9yIGlycV9mbGFncz14eCwKKwkvKiBJTUFTSz14eHggaXMgZXF1aXZhbGVudCB0byBTVEkgeHggb3IgYmZpbl9pcnFfZmxhZ3M9eHgsCiAJICogbG9jYWxfaXJxX2VuYWJsZSgpCiAJICovCiAJcHJvZ3JhbV9JQVIoKTsKQEAgLTEwODEsMTkgKzEwOTcsMjMgQEAKIAlzZWFyY2hfSUFSKCk7CiAKIAkvKiBFbmFibGUgaW50ZXJydXB0cyBJVkc3LTE1ICovCi0JaXJxX2ZsYWdzID0gaXJxX2ZsYWdzIHwgSU1BU0tfSVZHMTUgfAorCWJmaW5faXJxX2ZsYWdzIHw9IElNQVNLX0lWRzE1IHwKIAkgICAgSU1BU0tfSVZHMTQgfCBJTUFTS19JVkcxMyB8IElNQVNLX0lWRzEyIHwgSU1BU0tfSVZHMTEgfAogCSAgICBJTUFTS19JVkcxMCB8IElNQVNLX0lWRzkgfCBJTUFTS19JVkc4IHwgSU1BU0tfSVZHNyB8IElNQVNLX0lWR0hXOwogCi0jaWYgZGVmaW5lZChDT05GSUdfQkY1NHgpIHx8IGRlZmluZWQoQ09ORklHX0JGNTJ4KSB8fCBkZWZpbmVkKENPTkZJR19CRjU2MSkKKyNpZiBkZWZpbmVkKENPTkZJR19CRjU0eCkgfHwgZGVmaW5lZChDT05GSUdfQkY1MngpIHx8IGRlZmluZWQoQ09ORklHX0JGNTYxKSBcCisJfHwgZGVmaW5lZChCRjUzOF9GQU1JTFkpIHx8IGRlZmluZWQoQ09ORklHX0JGNTF4KQogCWJmaW5fd3JpdGVfU0lDX0lXUjAoSVdSX0RJU0FCTEVfQUxMKTsKLSNpZiBkZWZpbmVkKENPTkZJR19CRjUyeCkKLQkvKiBCRjUyeCBzeXN0ZW0gcmVzZXQgZG9lcyBub3QgcHJvcGVybHkgcmVzZXQgU0lDX0lXUjEgd2hpY2gKKyNpZiBkZWZpbmVkKENPTkZJR19CRjUyeCkgfHwgZGVmaW5lZChDT05GSUdfQkY1MXgpCisJLyogQkY1MngvQkY1MXggc3lzdGVtIHJlc2V0IGRvZXMgbm90IHByb3Blcmx5IHJlc2V0IFNJQ19JV1IxIHdoaWNoCiAJICogd2lsbCBzY3JldyB1cCB0aGUgYm9vdHJvbSBhcyBpdCByZWxpZXMgb24gTURNQTAvMSB3YWtpbmcgaXQKIAkgKiB1cCBmcm9tIElETEUgaW5zdHJ1Y3Rpb25zLiAgU2VlIHRoaXMgcmVwb3J0IGZvciBtb3JlIGluZm86CiAJICogaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnL2dmL3RyYWNrZXIvNDMyMwogCSAqLwotCWJmaW5fd3JpdGVfU0lDX0lXUjEoSVdSX0VOQUJMRSgxMCkgfCBJV1JfRU5BQkxFKDExKSk7CisJaWYgKEFOT01BTFlfMDUwMDA0MzUpCisJCWJmaW5fd3JpdGVfU0lDX0lXUjEoSVdSX0VOQUJMRSgxMCkgfCBJV1JfRU5BQkxFKDExKSk7CisJZWxzZQorCQliZmluX3dyaXRlX1NJQ19JV1IxKElXUl9ESVNBQkxFX0FMTCk7CiAjZWxzZQogCWJmaW5fd3JpdGVfU0lDX0lXUjEoSVdSX0RJU0FCTEVfQUxMKTsKICNlbmRpZgpAQCAtMTEwNCw2ICsxMTI0LDE0IEBACiAJYmZpbl93cml0ZV9TSUNfSVdSKElXUl9ESVNBQkxFX0FMTCk7CiAjZW5kaWYKIAorI2lmZGVmIENPTkZJR19JUElQRQorCWZvciAoaXJxID0gMDsgaXJxIDwgTlJfSVJRUzsgaXJxKyspIHsKKwkJc3RydWN0IGlycV9kZXNjICpkZXNjID0gaXJxX2Rlc2MgKyBpcnE7CisJCWRlc2MtPmljX3ByaW8gPSBfX2lwaXBlX2dldF9pcnFfcHJpb3JpdHkoaXJxKTsKKwkJZGVzYy0+dGhyX3ByaW8gPSBfX2lwaXBlX2dldF9pcnF0aHJlYWRfcHJpb3JpdHkoaXJxKTsKKwl9CisjZW5kaWYgLyogQ09ORklHX0lQSVBFICovCisKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTExNywxMSArMTE0NSwyMCBAQAogCX0gZWxzZSB7CiAJCXN0cnVjdCBpdmd4ICppdmcgPSBpdmc3XzEzW3ZlYyAtIElWRzddLmlmaXJzdDsKIAkJc3RydWN0IGl2Z3ggKml2Z19zdG9wID0gaXZnN18xM1t2ZWMgLSBJVkc3XS5pc3RvcDsKLSNpZiBkZWZpbmVkKENPTkZJR19CRjU0eCkgfHwgZGVmaW5lZChDT05GSUdfQkY1MngpIHx8IGRlZmluZWQoQ09ORklHX0JGNTYxKQorI2lmIGRlZmluZWQoQ09ORklHX0JGNTR4KSB8fCBkZWZpbmVkKENPTkZJR19CRjUyeCkgfHwgZGVmaW5lZChDT05GSUdfQkY1NjEpIFwKKwl8fCBkZWZpbmVkKEJGNTM4X0ZBTUlMWSkgfHwgZGVmaW5lZChDT05GSUdfQkY1MXgpCiAJCXVuc2lnbmVkIGxvbmcgc2ljX3N0YXR1c1szXTsKIAotCQlzaWNfc3RhdHVzWzBdID0gYmZpbl9yZWFkX1NJQ19JU1IwKCkgJiBiZmluX3JlYWRfU0lDX0lNQVNLMCgpOwotCQlzaWNfc3RhdHVzWzFdID0gYmZpbl9yZWFkX1NJQ19JU1IxKCkgJiBiZmluX3JlYWRfU0lDX0lNQVNLMSgpOworCQlpZiAoc21wX3Byb2Nlc3Nvcl9pZCgpKSB7CisjaWZkZWYgQ09ORklHX1NNUAorCQkJLyogVGhpcyB3aWxsIGJlIG9wdGltaXplZCBvdXQgaW4gVVAgbW9kZS4gKi8KKwkJCXNpY19zdGF0dXNbMF0gPSBiZmluX3JlYWRfU0lDQl9JU1IwKCkgJiBiZmluX3JlYWRfU0lDQl9JTUFTSzAoKTsKKwkJCXNpY19zdGF0dXNbMV0gPSBiZmluX3JlYWRfU0lDQl9JU1IxKCkgJiBiZmluX3JlYWRfU0lDQl9JTUFTSzEoKTsKKyNlbmRpZgorCQl9IGVsc2UgeworCQkJc2ljX3N0YXR1c1swXSA9IGJmaW5fcmVhZF9TSUNfSVNSMCgpICYgYmZpbl9yZWFkX1NJQ19JTUFTSzAoKTsKKwkJCXNpY19zdGF0dXNbMV0gPSBiZmluX3JlYWRfU0lDX0lTUjEoKSAmIGJmaW5fcmVhZF9TSUNfSU1BU0sxKCk7CisJCX0KICNpZmRlZiBDT05GSUdfQkY1NHgKIAkJc2ljX3N0YXR1c1syXSA9IGJmaW5fcmVhZF9TSUNfSVNSMigpICYgYmZpbl9yZWFkX1NJQ19JTUFTSzIoKTsKICNlbmRpZgpAQCAtMTE1MCwzICsxMTg3LDE2MSBAQAogCX0KIAlhc21fZG9fSVJRKHZlYywgZnApOwogfQorCisjaWZkZWYgQ09ORklHX0lQSVBFCisKK2ludCBfX2lwaXBlX2dldF9pcnFfcHJpb3JpdHkodW5zaWduZWQgaXJxKQoreworCWludCBpZW50LCBwcmlvOworCisJaWYgKGlycSA8PSBJUlFfQ09SRVRNUikKKwkJcmV0dXJuIGlycTsKKworCWZvciAoaWVudCA9IDA7IGllbnQgPCBOUl9QRVJJX0lOVFM7IGllbnQrKykgeworCQlzdHJ1Y3QgaXZneCAqaXZnID0gaXZnX3RhYmxlICsgaWVudDsKKwkJaWYgKGl2Zy0+aXJxbm8gPT0gaXJxKSB7CisJCQlmb3IgKHByaW8gPSAwOyBwcmlvIDw9IElWRzEzLUlWRzc7IHByaW8rKykgeworCQkJCWlmIChpdmc3XzEzW3ByaW9dLmlmaXJzdCA8PSBpdmcgJiYKKwkJCQkgICAgaXZnN18xM1twcmlvXS5pc3RvcCA+IGl2ZykKKwkJCQkJcmV0dXJuIElWRzcgKyBwcmlvOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIElWRzE1OworfQorCitpbnQgX19pcGlwZV9nZXRfaXJxdGhyZWFkX3ByaW9yaXR5KHVuc2lnbmVkIGlycSkKK3sKKwlpbnQgaWVudCwgcHJpbzsKKwlpbnQgZGVtdXhfaXJxOworCisJLyogVGhlIHJldHVybmVkIHByaW9yaXR5IHZhbHVlIGlzIHJlc2NhbGVkIHRvIFswLi5JVkcxMysxXQorCSAqIHdpdGggMCBiZWluZyB0aGUgbG93ZXN0IGVmZmVjdGl2ZSBwcmlvcml0eSBsZXZlbC4gKi8KKworCWlmIChpcnEgPD0gSVJRX0NPUkVUTVIpCisJCXJldHVybiBJVkcxMyAtIGlycSArIDE7CisKKwkvKiBHUElPIElSUXMgYXJlIGdpdmVuIHRoZSBwcmlvcml0eSBvZiB0aGUgZGVtdXgKKwkgKiBpbnRlcnJ1cHQuICovCisJaWYgKElTX0dQSU9JUlEoaXJxKSkgeworI2lmIGRlZmluZWQoQ09ORklHX0JGNTR4KQorCQl1MzIgYmFuayA9IFBJTlRfMl9CQU5LKGlycTJwaW50X2x1dFtpcnEgLSBTWVNfSVJRU10pOworCQlkZW11eF9pcnEgPSAoYmFuayA9PSAwID8gSVJRX1BJTlQwIDoKKwkJCQliYW5rID09IDEgPyBJUlFfUElOVDEgOgorCQkJCWJhbmsgPT0gMiA/IElSUV9QSU5UMiA6CisJCQkJSVJRX1BJTlQzKTsKKyNlbGlmIGRlZmluZWQoQ09ORklHX0JGNTYxKQorCQlkZW11eF9pcnEgPSAoaXJxID49IElSUV9QRjMyID8gSVJRX1BST0cyX0lOVEEgOgorCQkJCWlycSA+PSBJUlFfUEYxNiA/IElSUV9QUk9HMV9JTlRBIDoKKwkJCQlJUlFfUFJPRzBfSU5UQSk7CisjZWxpZiBkZWZpbmVkKENPTkZJR19CRjUyeCkKKwkJZGVtdXhfaXJxID0gKGlycSA+PSBJUlFfUEgwID8gSVJRX1BPUlRIX0lOVEEgOgorCQkJCWlycSA+PSBJUlFfUEcwID8gSVJRX1BPUlRHX0lOVEEgOgorCQkJCUlSUV9QT1JURl9JTlRBKTsKKyNlbHNlCisJCWRlbXV4X2lycSA9IGlycTsKKyNlbmRpZgorCQlyZXR1cm4gSVZHMTMgLSBQUklPX0dQSU9ERU1VWChkZW11eF9pcnEpICsgMTsKKwl9CisKKwkvKiBUaGUgR1BJTyBkZW11eCBpbnRlcnJ1cHQgaXMgZ2l2ZW4gYSBsb3dlciBwcmlvcml0eQorCSAqIHRoYW4gdGhlIEdQSU8gSVJRcywgc28gdGhhdCBpdHMgdGhyZWFkZWQgaGFuZGxlcgorCSAqIHVubWFza3MgdGhlIGludGVycnVwdCBsaW5lIGFmdGVyIHRoZSBkZWNvZGVkIElSUXMKKwkgKiBoYXZlIGJlZW4gcHJvY2Vzc2VkLiAqLworCXByaW8gPSBQUklPX0dQSU9ERU1VWChpcnEpOworCS8qIGRlbXV4IGlycT8gKi8KKwlpZiAocHJpbyAhPSAtMSkKKwkJcmV0dXJuIElWRzEzIC0gcHJpbzsKKworCWZvciAoaWVudCA9IDA7IGllbnQgPCBOUl9QRVJJX0lOVFM7IGllbnQrKykgeworCQlzdHJ1Y3QgaXZneCAqaXZnID0gaXZnX3RhYmxlICsgaWVudDsKKwkJaWYgKGl2Zy0+aXJxbm8gPT0gaXJxKSB7CisJCQlmb3IgKHByaW8gPSAwOyBwcmlvIDw9IElWRzEzLUlWRzc7IHByaW8rKykgeworCQkJCWlmIChpdmc3XzEzW3ByaW9dLmlmaXJzdCA8PSBpdmcgJiYKKwkJCQkgICAgaXZnN18xM1twcmlvXS5pc3RvcCA+IGl2ZykKKwkJCQkJcmV0dXJuIElWRzcgLSBwcmlvOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIEh3IGludGVycnVwdHMgYXJlIGRpc2FibGVkIG9uIGVudHJ5IChjaGVjayBTQVZFX0NPTlRFWFQpLiAqLworI2lmZGVmIENPTkZJR19ET19JUlFfTDEKK19fYXR0cmlidXRlX18oKGwxX3RleHQpKQorI2VuZGlmCithc21saW5rYWdlIGludCBfX2lwaXBlX2dyYWJfaXJxKGludCB2ZWMsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBpdmd4ICppdmdfc3RvcCA9IGl2ZzdfMTNbdmVjLUlWRzddLmlzdG9wOworCXN0cnVjdCBpdmd4ICppdmcgPSBpdmc3XzEzW3ZlYy1JVkc3XS5pZmlyc3Q7CisJaW50IGlycTsKKworCWlmIChsaWtlbHkodmVjID09IEVWVF9JVlRNUl9QKSkgeworCQlpcnEgPSBJUlFfQ09SRVRNUjsKKwkJZ290byBoYW5kbGVfaXJxOworCX0KKworCVNTWU5DKCk7CisKKyNpZiBkZWZpbmVkKENPTkZJR19CRjU0eCkgfHwgZGVmaW5lZChDT05GSUdfQkY1MngpIHx8IGRlZmluZWQoQ09ORklHX0JGNTYxKQorCXsKKwkJdW5zaWduZWQgbG9uZyBzaWNfc3RhdHVzWzNdOworCisJCXNpY19zdGF0dXNbMF0gPSBiZmluX3JlYWRfU0lDX0lTUjAoKSAmIGJmaW5fcmVhZF9TSUNfSU1BU0swKCk7CisJCXNpY19zdGF0dXNbMV0gPSBiZmluX3JlYWRfU0lDX0lTUjEoKSAmIGJmaW5fcmVhZF9TSUNfSU1BU0sxKCk7CisjaWZkZWYgQ09ORklHX0JGNTR4CisJCXNpY19zdGF0dXNbMl0gPSBiZmluX3JlYWRfU0lDX0lTUjIoKSAmIGJmaW5fcmVhZF9TSUNfSU1BU0syKCk7CisjZW5kaWYKKwkJZm9yICg7OyBpdmcrKykgeworCQkJaWYgKGl2ZyA+PSBpdmdfc3RvcCkgeworCQkJCWF0b21pY19pbmMoJm51bV9zcHVyaW91cyk7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQlpZiAoc2ljX3N0YXR1c1soaXZnLT5pcnFubyAtIElWRzcpIC8gMzJdICYgaXZnLT5pc3JmbGFnKQorCQkJCWJyZWFrOworCQl9CisJfQorI2Vsc2UKKwl7CisJCXVuc2lnbmVkIGxvbmcgc2ljX3N0YXR1czsKKworCQlzaWNfc3RhdHVzID0gYmZpbl9yZWFkX1NJQ19JTUFTSygpICYgYmZpbl9yZWFkX1NJQ19JU1IoKTsKKworCQlmb3IgKDs7IGl2ZysrKSB7CisJCQlpZiAoaXZnID49IGl2Z19zdG9wKSB7CisJCQkJYXRvbWljX2luYygmbnVtX3NwdXJpb3VzKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0gZWxzZSBpZiAoc2ljX3N0YXR1cyAmIGl2Zy0+aXNyZmxhZykKKwkJCQlicmVhazsKKwkJfQorCX0KKyNlbmRpZgorCisJaXJxID0gaXZnLT5pcnFubzsKKworCWlmIChpcnEgPT0gSVJRX1NZU1RNUikgeworCQliZmluX3dyaXRlX1RJTUVSX1NUQVRVUygxKTsgLyogTGF0Y2ggVElNSUwwICovCisJCS8qIFRoaXMgaXMgYmFzaWNhbGx5IHdoYXQgd2UgbmVlZCBmcm9tIHRoZSByZWdpc3RlciBmcmFtZS4gKi8KKwkJX19yYXdfZ2V0X2NwdV92YXIoX19pcGlwZV90aWNrX3JlZ3MpLmlwZW5kID0gcmVncy0+aXBlbmQ7CisJCV9fcmF3X2dldF9jcHVfdmFyKF9faXBpcGVfdGlja19yZWdzKS5wYyA9IHJlZ3MtPnBjOworCQlpZiAoIWlwaXBlX3Jvb3RfZG9tYWluX3ApCisJCQlfX3Jhd19nZXRfY3B1X3ZhcihfX2lwaXBlX3RpY2tfcmVncykuaXBlbmQgfD0gMHgxMDsKKwkJZWxzZQorCQkJX19yYXdfZ2V0X2NwdV92YXIoX19pcGlwZV90aWNrX3JlZ3MpLmlwZW5kICY9IH4weDEwOworCX0KKworaGFuZGxlX2lycToKKworCWlwaXBlX3RyYWNlX2lycV9lbnRyeShpcnEpOworCV9faXBpcGVfaGFuZGxlX2lycShpcnEsIHJlZ3MpOworICAgICAgIGlwaXBlX3RyYWNlX2lycV9leGl0KGlycSk7CisKKyAgICAgICBpZiAoaXBpcGVfcm9vdF9kb21haW5fcCkKKwkJcmV0dXJuICF0ZXN0X2JpdChJUElQRV9TVEFMTF9GTEFHLCAmaXBpcGVfcm9vdF9jcHVkb21fdmFyKHN0YXR1cykpOworCisgICAgICAgcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAvKiBDT05GSUdfSVBJUEUgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vaXJxcGFuaWMuYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vaXJxcGFuaWMuYwppbmRleCA2MDZkZWQ5Li4wNTAwNGRmIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtY29tbW9uL2lycXBhbmljLmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9pcnFwYW5pYy5jCkBAIC0zMyw4ICszMyw2IEBACiAjaW5jbHVkZSA8YXNtL3RyYXBzLmg+CiAjaW5jbHVkZSA8YXNtL2JsYWNrZmluLmg+CiAKLSNpbmNsdWRlICIuLi9vcHJvZmlsZS9vcF9ibGFja2Zpbi5oIgotCiAjaWZkZWYgQ09ORklHX0RFQlVHX0lDQUNIRV9DSEVDSwogI2RlZmluZSBMMV9JQ0FDSEVfU1RBUlQgMHhmZmExMDAwMAogI2RlZmluZSBMMV9JQ0FDSEVfRU5EICAgMHhmZmExM2ZmZgpAQCAtMTM0LDEzICsxMzIsMyBAQAogI2VuZGlmCiAKIH0KLQotI2lmZGVmIENPTkZJR19IQVJEV0FSRV9QTQotLyoKLSAqIGNhbGwgdGhlIGhhbmRsZXIgb2YgUGVyZm9ybWFuY2Ugb3ZlcmZsb3cKLSAqLwotYXNtbGlua2FnZSB2b2lkIHBtX292ZXJmbG93KGludCBpcnEsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQotewotCXBtX292ZXJmbG93X2hhbmRsZXIoaXJxLCByZWdzKTsKLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9sb2NrLlMgYi9hcmNoL2JsYWNrZmluL21hY2gtY29tbW9uL2xvY2suUwppbmRleCA5ZGFmMDEyLi42YzVmNWYwIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtY29tbW9uL2xvY2suUworKysgYi9hcmNoL2JsYWNrZmluL21hY2gtY29tbW9uL2xvY2suUwpAQCAtMTYwLDcgKzE2MCw3IEBACiAgKiBSMCAtIFdoaWNoIHdheSB0byBiZSBsb2NrZWQKICAqLwogCi1FTlRSWShfY2FjaGVfbG9jaykKK0VOVFJZKF9iZmluX2NhY2hlX2xvY2spCiAKIAlbLS1TUF09KCBSNzowLFA1OjAgKTsKIApAQCAtMTg0LDcgKzE4NCw3IEBACiAKIAkoIFI3OjAsUDU6MCApID0gW1NQKytdOwogCVJUUzsKLUVORFBST0MoX2NhY2hlX2xvY2spCitFTkRQUk9DKF9iZmluX2NhY2hlX2xvY2spCiAKIC8qIEludmFsaWRhdGUgdGhlIEVudGlyZSBJbnN0cnVjdGlvbiBjYWNoZSBieQogICogZGlzYWJsaW5nIElNQyBiaXQKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vcG0uYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vcG0uYwppbmRleCBlMjhjNmFmLi5kM2Q3MGZkIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtY29tbW9uL3BtLmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9wbS5jCkBAIC03MSw3ICs3MSw3IEBACiAJZ3Bpb19wbV93YWtldXBfcmVxdWVzdChDT05GSUdfUE1fV0FLRVVQX0dQSU9fTlVNQkVSLCBXQUtFVVBfVFlQRSk7CiAjZW5kaWYKIAotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlsb2NhbF9pcnFfc2F2ZV9odyhmbGFncyk7CiAJYmZpbl9wbV9zdGFuZGJ5X3NldHVwKCk7CiAKICNpZmRlZiBDT05GSUdfUE1fQkZJTl9TTEVFUF9ERUVQRVIKQEAgLTgyLDE1ICs4MiwxOSBAQAogCiAJYmZpbl9wbV9zdGFuZGJ5X3Jlc3RvcmUoKTsKIAotI2lmIGRlZmluZWQoQ09ORklHX0JGNTR4KSB8fCBkZWZpbmVkKENPTkZJR19CRjUyeCkgIHx8IGRlZmluZWQoQ09ORklHX0JGNTYxKQorI2lmIGRlZmluZWQoQ09ORklHX0JGNTR4KSB8fCBkZWZpbmVkKENPTkZJR19CRjUyeCkgIHx8IGRlZmluZWQoQ09ORklHX0JGNTYxKSB8fCBcCisJZGVmaW5lZChDT05GSUdfQkY1MzgpIHx8IGRlZmluZWQoQ09ORklHX0JGNTM5KSB8fCBkZWZpbmVkKENPTkZJR19CRjUxeCkKIAliZmluX3dyaXRlX1NJQ19JV1IwKElXUl9ESVNBQkxFX0FMTCk7Ci0jaWYgZGVmaW5lZChDT05GSUdfQkY1MngpCisjaWYgZGVmaW5lZChDT05GSUdfQkY1MngpIHx8IGRlZmluZWQoQ09ORklHX0JGNTF4KQogCS8qIEJGNTJ4IHN5c3RlbSByZXNldCBkb2VzIG5vdCBwcm9wZXJseSByZXNldCBTSUNfSVdSMSB3aGljaAogCSAqIHdpbGwgc2NyZXcgdXAgdGhlIGJvb3Ryb20gYXMgaXQgcmVsaWVzIG9uIE1ETUEwLzEgd2FraW5nIGl0CiAJICogdXAgZnJvbSBJRExFIGluc3RydWN0aW9ucy4gIFNlZSB0aGlzIHJlcG9ydCBmb3IgbW9yZSBpbmZvOgogCSAqIGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy9nZi90cmFja2VyLzQzMjMKIAkgKi8KLQliZmluX3dyaXRlX1NJQ19JV1IxKElXUl9FTkFCTEUoMTApIHwgSVdSX0VOQUJMRSgxMSkpOworCWlmIChBTk9NQUxZXzA1MDAwNDM1KQorCQliZmluX3dyaXRlX1NJQ19JV1IxKElXUl9FTkFCTEUoMTApIHwgSVdSX0VOQUJMRSgxMSkpOworCWVsc2UKKwkJYmZpbl93cml0ZV9TSUNfSVdSMShJV1JfRElTQUJMRV9BTEwpOwogI2Vsc2UKIAliZmluX3dyaXRlX1NJQ19JV1IxKElXUl9ESVNBQkxFX0FMTCk7CiAjZW5kaWYKQEAgLTEwMSw3ICsxMDUsNyBAQAogCWJmaW5fd3JpdGVfU0lDX0lXUihJV1JfRElTQUJMRV9BTEwpOwogI2VuZGlmCiAKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJbG9jYWxfaXJxX3Jlc3RvcmVfaHcoZmxhZ3MpOwogfQogCiBpbnQgYmY1M3hfc3VzcGVuZF9sMV9tZW0odW5zaWduZWQgY2hhciAqbWVtcHRyKQpAQCAtMjQ1LDEyICsyNDksMTIgQEAKIAl3YWtldXAgfD0gR1BXRTsKICNlbmRpZgogCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCWxvY2FsX2lycV9zYXZlX2h3KGZsYWdzKTsKIAogCXJldCA9IGJsYWNrZmluX2RtYV9zdXNwZW5kKCk7CiAKIAlpZiAocmV0KSB7Ci0JCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwkJbG9jYWxfaXJxX3Jlc3RvcmVfaHcoZmxhZ3MpOwogCQlrZnJlZShtZW1wdHIpOwogCQlyZXR1cm4gcmV0OwogCX0KQEAgLTI3MSw3ICsyNzUsNyBAQAogCWJmaW5fZ3Bpb19wbV9oaWJlcm5hdGVfcmVzdG9yZSgpOwogCWJsYWNrZmluX2RtYV9yZXN1bWUoKTsKIAotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwlsb2NhbF9pcnFfcmVzdG9yZV9odyhmbGFncyk7CiAJa2ZyZWUobWVtcHRyKTsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9zbXAuYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vc21wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzdjOTkyOAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vc21wLmMKQEAgLTAsMCArMSw0NzYgQEAKKy8qCisgKiBGaWxlOiAgICAgICAgIGFyY2gvYmxhY2tmaW4va2VybmVsL3NtcC5jCisgKiBBdXRob3I6ICAgICAgIFBoaWxpcHBlIEdlcnVtIDxycG1AeGVub21haS5vcmc+CisgKiBJUEkgbWFuYWdlbWVudCBiYXNlZCBvbiBhcmNoL2FybS9rZXJuZWwvc21wLmMuCisgKgorICogICAgICAgICAgICAgICBDb3B5cmlnaHQgMjAwNyBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgdGhlIGZpbGUgQ09QWUlORywgb3Igd3JpdGUKKyAqIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvY2FjaGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgorI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CisjaW5jbHVkZSA8YXNtL21tdV9jb250ZXh0Lmg+CisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KKyNpbmNsdWRlIDxhc20vcGdhbGxvYy5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CisjaW5jbHVkZSA8YXNtL2NwdS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorCitzdHJ1Y3QgY29yZWxvY2tfc2xvdCBjb3JlbG9jayBfX2F0dHJpYnV0ZV9fICgoX19zZWN0aW9uX18oIi5sMi5ic3MiKSkpOworCit2b2lkIF9fY3B1aW5pdGRhdGEgKmluaXRfcmV0eF9jb3JlYiwgKmluaXRfc2F2ZWRfcmV0eF9jb3JlYiwKKwkqaW5pdF9zYXZlZF9zZXFzdGF0X2NvcmViLCAqaW5pdF9zYXZlZF9pY3BsYl9mYXVsdF9hZGRyX2NvcmViLAorCSppbml0X3NhdmVkX2RjcGxiX2ZhdWx0X2FkZHJfY29yZWI7CisKK2NwdW1hc2tfdCBjcHVfcG9zc2libGVfbWFwOworRVhQT1JUX1NZTUJPTChjcHVfcG9zc2libGVfbWFwKTsKKworY3B1bWFza190IGNwdV9vbmxpbmVfbWFwOworRVhQT1JUX1NZTUJPTChjcHVfb25saW5lX21hcCk7CisKKyNkZWZpbmUgQkZJTl9JUElfUkVTQ0hFRFVMRSAgIDAKKyNkZWZpbmUgQkZJTl9JUElfQ0FMTF9GVU5DICAgIDEKKyNkZWZpbmUgQkZJTl9JUElfQ1BVX1NUT1AgICAgIDIKKworc3RydWN0IGJsYWNrZmluX2ZsdXNoX2RhdGEgeworCXVuc2lnbmVkIGxvbmcgc3RhcnQ7CisJdW5zaWduZWQgbG9uZyBlbmQ7Cit9OworCit2b2lkICpzZWNvbmRhcnlfc3RhY2s7CisKKworc3RydWN0IHNtcF9jYWxsX3N0cnVjdCB7CisJdm9pZCAoKmZ1bmMpKHZvaWQgKmluZm8pOworCXZvaWQgKmluZm87CisJaW50IHdhaXQ7CisJY3B1bWFza190IHBlbmRpbmc7CisJY3B1bWFza190IHdhaXRtYXNrOworfTsKKworc3RhdGljIHN0cnVjdCBibGFja2Zpbl9mbHVzaF9kYXRhIHNtcF9mbHVzaF9kYXRhOworCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHN0b3BfbG9jayk7CisKK3N0cnVjdCBpcGlfbWVzc2FnZSB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXVuc2lnbmVkIGxvbmcgdHlwZTsKKwlzdHJ1Y3Qgc21wX2NhbGxfc3RydWN0IGNhbGxfc3RydWN0OworfTsKKworc3RydWN0IGlwaV9tZXNzYWdlX3F1ZXVlIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGhlYWQ7CisJc3BpbmxvY2tfdCBsb2NrOworCXVuc2lnbmVkIGxvbmcgY291bnQ7Cit9OworCitzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IGlwaV9tZXNzYWdlX3F1ZXVlLCBpcGlfbXNnX3F1ZXVlKTsKKworc3RhdGljIHZvaWQgaXBpX2NwdV9zdG9wKHVuc2lnbmVkIGludCBjcHUpCit7CisJc3Bpbl9sb2NrKCZzdG9wX2xvY2spOworCXByaW50ayhLRVJOX0NSSVQgIkNQVSV1OiBzdG9wcGluZ1xuIiwgY3B1KTsKKwlkdW1wX3N0YWNrKCk7CisJc3Bpbl91bmxvY2soJnN0b3BfbG9jayk7CisKKwljcHVfY2xlYXIoY3B1LCBjcHVfb25saW5lX21hcCk7CisKKwlsb2NhbF9pcnFfZGlzYWJsZSgpOworCisJd2hpbGUgKDEpCisJCVNTWU5DKCk7Cit9CisKK3N0YXRpYyB2b2lkIGlwaV9mbHVzaF9pY2FjaGUodm9pZCAqaW5mbykKK3sKKwlzdHJ1Y3QgYmxhY2tmaW5fZmx1c2hfZGF0YSAqZmRhdGEgPSBpbmZvOworCisJLyogSW52YWxpZGF0ZSB0aGUgbWVtb3J5IGhvbGRpbmcgdGhlIGJvdW5kcyBvZiB0aGUgZmx1c2hlZCByZWdpb24uICovCisJYmxhY2tmaW5fZGNhY2hlX2ludmFsaWRhdGVfcmFuZ2UoKHVuc2lnbmVkIGxvbmcpZmRhdGEsCisJCQkJCSAodW5zaWduZWQgbG9uZylmZGF0YSArIHNpemVvZigqZmRhdGEpKTsKKworCWJsYWNrZmluX2ljYWNoZV9mbHVzaF9yYW5nZShmZGF0YS0+c3RhcnQsIGZkYXRhLT5lbmQpOworfQorCitzdGF0aWMgdm9pZCBpcGlfY2FsbF9mdW5jdGlvbih1bnNpZ25lZCBpbnQgY3B1LCBzdHJ1Y3QgaXBpX21lc3NhZ2UgKm1zZykKK3sKKwlpbnQgd2FpdDsKKwl2b2lkICgqZnVuYykodm9pZCAqaW5mbyk7CisJdm9pZCAqaW5mbzsKKwlmdW5jID0gbXNnLT5jYWxsX3N0cnVjdC5mdW5jOworCWluZm8gPSBtc2ctPmNhbGxfc3RydWN0LmluZm87CisJd2FpdCA9IG1zZy0+Y2FsbF9zdHJ1Y3Qud2FpdDsKKwljcHVfY2xlYXIoY3B1LCBtc2ctPmNhbGxfc3RydWN0LnBlbmRpbmcpOworCWZ1bmMoaW5mbyk7CisJaWYgKHdhaXQpCisJCWNwdV9jbGVhcihjcHUsIG1zZy0+Y2FsbF9zdHJ1Y3Qud2FpdG1hc2spOworCWVsc2UKKwkJa2ZyZWUobXNnKTsKK30KKworc3RhdGljIGlycXJldHVybl90IGlwaV9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldl9pbnN0YW5jZSkKK3sKKwlzdHJ1Y3QgaXBpX21lc3NhZ2UgKm1zZywgKm1nOworCXN0cnVjdCBpcGlfbWVzc2FnZV9xdWV1ZSAqbXNnX3F1ZXVlOworCXVuc2lnbmVkIGludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisKKwlwbGF0Zm9ybV9jbGVhcl9pcGkoY3B1KTsKKworCW1zZ19xdWV1ZSA9ICZfX2dldF9jcHVfdmFyKGlwaV9tc2dfcXVldWUpOworCW1zZ19xdWV1ZS0+Y291bnQrKzsKKworCXNwaW5fbG9jaygmbXNnX3F1ZXVlLT5sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobXNnLCBtZywgJm1zZ19xdWV1ZS0+aGVhZCwgbGlzdCkgeworCQlsaXN0X2RlbCgmbXNnLT5saXN0KTsKKwkJc3dpdGNoIChtc2ctPnR5cGUpIHsKKwkJY2FzZSBCRklOX0lQSV9SRVNDSEVEVUxFOgorCQkJLyogVGhhdCdzIHRoZSBlYXNpZXN0IG9uZTsgbGVhdmUgaXQgdG8KKwkJCSAqIHJldHVybl9mcm9tX2ludC4gKi8KKwkJCWtmcmVlKG1zZyk7CisJCQlicmVhazsKKwkJY2FzZSBCRklOX0lQSV9DQUxMX0ZVTkM6CisJCQlpcGlfY2FsbF9mdW5jdGlvbihjcHUsIG1zZyk7CisJCQlicmVhazsKKwkJY2FzZSBCRklOX0lQSV9DUFVfU1RPUDoKKwkJCWlwaV9jcHVfc3RvcChjcHUpOworCQkJa2ZyZWUobXNnKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcHJpbnRrKEtFUk5fQ1JJVCAiQ1BVJXU6IFVua25vd24gSVBJIG1lc3NhZ2UgXAorCQkJMHglbHhcbiIsIGNwdSwgbXNnLT50eXBlKTsKKwkJCWtmcmVlKG1zZyk7CisJCQlicmVhazsKKwkJfQorCX0KKwlzcGluX3VubG9jaygmbXNnX3F1ZXVlLT5sb2NrKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyB2b2lkIGlwaV9xdWV1ZV9pbml0KHZvaWQpCit7CisJdW5zaWduZWQgaW50IGNwdTsKKwlzdHJ1Y3QgaXBpX21lc3NhZ2VfcXVldWUgKm1zZ19xdWV1ZTsKKwlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoY3B1KSB7CisJCW1zZ19xdWV1ZSA9ICZwZXJfY3B1KGlwaV9tc2dfcXVldWUsIGNwdSk7CisJCUlOSVRfTElTVF9IRUFEKCZtc2dfcXVldWUtPmhlYWQpOworCQlzcGluX2xvY2tfaW5pdCgmbXNnX3F1ZXVlLT5sb2NrKTsKKwkJbXNnX3F1ZXVlLT5jb3VudCA9IDA7CisJfQorfQorCitpbnQgc21wX2NhbGxfZnVuY3Rpb24odm9pZCAoKmZ1bmMpKHZvaWQgKmluZm8pLCB2b2lkICppbmZvLCBpbnQgd2FpdCkKK3sKKwl1bnNpZ25lZCBpbnQgY3B1OworCWNwdW1hc2tfdCBjYWxsbWFwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGlwaV9tZXNzYWdlX3F1ZXVlICptc2dfcXVldWU7CisJc3RydWN0IGlwaV9tZXNzYWdlICptc2c7CisKKwljYWxsbWFwID0gY3B1X29ubGluZV9tYXA7CisJY3B1X2NsZWFyKHNtcF9wcm9jZXNzb3JfaWQoKSwgY2FsbG1hcCk7CisJaWYgKGNwdXNfZW1wdHkoY2FsbG1hcCkpCisJCXJldHVybiAwOworCisJbXNnID0ga21hbGxvYyhzaXplb2YoKm1zZyksIEdGUF9BVE9NSUMpOworCUlOSVRfTElTVF9IRUFEKCZtc2ctPmxpc3QpOworCW1zZy0+Y2FsbF9zdHJ1Y3QuZnVuYyA9IGZ1bmM7CisJbXNnLT5jYWxsX3N0cnVjdC5pbmZvID0gaW5mbzsKKwltc2ctPmNhbGxfc3RydWN0LndhaXQgPSB3YWl0OworCW1zZy0+Y2FsbF9zdHJ1Y3QucGVuZGluZyA9IGNhbGxtYXA7CisJbXNnLT5jYWxsX3N0cnVjdC53YWl0bWFzayA9IGNhbGxtYXA7CisJbXNnLT50eXBlID0gQkZJTl9JUElfQ0FMTF9GVU5DOworCisJZm9yX2VhY2hfY3B1X21hc2soY3B1LCBjYWxsbWFwKSB7CisJCW1zZ19xdWV1ZSA9ICZwZXJfY3B1KGlwaV9tc2dfcXVldWUsIGNwdSk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZtc2dfcXVldWUtPmxvY2ssIGZsYWdzKTsKKwkJbGlzdF9hZGQoJm1zZy0+bGlzdCwgJm1zZ19xdWV1ZS0+aGVhZCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1zZ19xdWV1ZS0+bG9jaywgZmxhZ3MpOworCQlwbGF0Zm9ybV9zZW5kX2lwaV9jcHUoY3B1KTsKKwl9CisJaWYgKHdhaXQpIHsKKwkJd2hpbGUgKCFjcHVzX2VtcHR5KG1zZy0+Y2FsbF9zdHJ1Y3Qud2FpdG1hc2spKQorCQkJYmxhY2tmaW5fZGNhY2hlX2ludmFsaWRhdGVfcmFuZ2UoCisJCQkJKHVuc2lnbmVkIGxvbmcpKCZtc2ctPmNhbGxfc3RydWN0LndhaXRtYXNrKSwKKwkJCQkodW5zaWduZWQgbG9uZykoJm1zZy0+Y2FsbF9zdHJ1Y3Qud2FpdG1hc2spKTsKKwkJa2ZyZWUobXNnKTsKKwl9CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzbXBfY2FsbF9mdW5jdGlvbik7CisKK2ludCBzbXBfY2FsbF9mdW5jdGlvbl9zaW5nbGUoaW50IGNwdWlkLCB2b2lkICgqZnVuYykgKHZvaWQgKmluZm8pLCB2b2lkICppbmZvLAorCQkJCWludCB3YWl0KQoreworCXVuc2lnbmVkIGludCBjcHUgPSBjcHVpZDsKKwljcHVtYXNrX3QgY2FsbG1hcDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBpcGlfbWVzc2FnZV9xdWV1ZSAqbXNnX3F1ZXVlOworCXN0cnVjdCBpcGlfbWVzc2FnZSAqbXNnOworCisJaWYgKGNwdV9pc19vZmZsaW5lKGNwdSkpCisJCXJldHVybiAwOworCWNwdXNfY2xlYXIoY2FsbG1hcCk7CisJY3B1X3NldChjcHUsIGNhbGxtYXApOworCisJbXNnID0ga21hbGxvYyhzaXplb2YoKm1zZyksIEdGUF9BVE9NSUMpOworCUlOSVRfTElTVF9IRUFEKCZtc2ctPmxpc3QpOworCW1zZy0+Y2FsbF9zdHJ1Y3QuZnVuYyA9IGZ1bmM7CisJbXNnLT5jYWxsX3N0cnVjdC5pbmZvID0gaW5mbzsKKwltc2ctPmNhbGxfc3RydWN0LndhaXQgPSB3YWl0OworCW1zZy0+Y2FsbF9zdHJ1Y3QucGVuZGluZyA9IGNhbGxtYXA7CisJbXNnLT5jYWxsX3N0cnVjdC53YWl0bWFzayA9IGNhbGxtYXA7CisJbXNnLT50eXBlID0gQkZJTl9JUElfQ0FMTF9GVU5DOworCisJbXNnX3F1ZXVlID0gJnBlcl9jcHUoaXBpX21zZ19xdWV1ZSwgY3B1KTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbXNnX3F1ZXVlLT5sb2NrLCBmbGFncyk7CisJbGlzdF9hZGQoJm1zZy0+bGlzdCwgJm1zZ19xdWV1ZS0+aGVhZCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbXNnX3F1ZXVlLT5sb2NrLCBmbGFncyk7CisJcGxhdGZvcm1fc2VuZF9pcGlfY3B1KGNwdSk7CisKKwlpZiAod2FpdCkgeworCQl3aGlsZSAoIWNwdXNfZW1wdHkobXNnLT5jYWxsX3N0cnVjdC53YWl0bWFzaykpCisJCQlibGFja2Zpbl9kY2FjaGVfaW52YWxpZGF0ZV9yYW5nZSgKKwkJCQkodW5zaWduZWQgbG9uZykoJm1zZy0+Y2FsbF9zdHJ1Y3Qud2FpdG1hc2spLAorCQkJCSh1bnNpZ25lZCBsb25nKSgmbXNnLT5jYWxsX3N0cnVjdC53YWl0bWFzaykpOworCQlrZnJlZShtc2cpOworCX0KKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNtcF9jYWxsX2Z1bmN0aW9uX3NpbmdsZSk7CisKK3ZvaWQgc21wX3NlbmRfcmVzY2hlZHVsZShpbnQgY3B1KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGlwaV9tZXNzYWdlX3F1ZXVlICptc2dfcXVldWU7CisJc3RydWN0IGlwaV9tZXNzYWdlICptc2c7CisKKwlpZiAoY3B1X2lzX29mZmxpbmUoY3B1KSkKKwkJcmV0dXJuOworCisJbXNnID0ga21hbGxvYyhzaXplb2YoKm1zZyksIEdGUF9BVE9NSUMpOworCW1lbXNldChtc2csIDAsIHNpemVvZihtc2cpKTsKKwlJTklUX0xJU1RfSEVBRCgmbXNnLT5saXN0KTsKKwltc2ctPnR5cGUgPSBCRklOX0lQSV9SRVNDSEVEVUxFOworCisJbXNnX3F1ZXVlID0gJnBlcl9jcHUoaXBpX21zZ19xdWV1ZSwgY3B1KTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbXNnX3F1ZXVlLT5sb2NrLCBmbGFncyk7CisJbGlzdF9hZGQoJm1zZy0+bGlzdCwgJm1zZ19xdWV1ZS0+aGVhZCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbXNnX3F1ZXVlLT5sb2NrLCBmbGFncyk7CisJcGxhdGZvcm1fc2VuZF9pcGlfY3B1KGNwdSk7CisKKwlyZXR1cm47Cit9CisKK3ZvaWQgc21wX3NlbmRfc3RvcCh2b2lkKQoreworCXVuc2lnbmVkIGludCBjcHU7CisJY3B1bWFza190IGNhbGxtYXA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgaXBpX21lc3NhZ2VfcXVldWUgKm1zZ19xdWV1ZTsKKwlzdHJ1Y3QgaXBpX21lc3NhZ2UgKm1zZzsKKworCWNhbGxtYXAgPSBjcHVfb25saW5lX21hcDsKKwljcHVfY2xlYXIoc21wX3Byb2Nlc3Nvcl9pZCgpLCBjYWxsbWFwKTsKKwlpZiAoY3B1c19lbXB0eShjYWxsbWFwKSkKKwkJcmV0dXJuOworCisJbXNnID0ga21hbGxvYyhzaXplb2YoKm1zZyksIEdGUF9BVE9NSUMpOworCW1lbXNldChtc2csIDAsIHNpemVvZihtc2cpKTsKKwlJTklUX0xJU1RfSEVBRCgmbXNnLT5saXN0KTsKKwltc2ctPnR5cGUgPSBCRklOX0lQSV9DUFVfU1RPUDsKKworCWZvcl9lYWNoX2NwdV9tYXNrKGNwdSwgY2FsbG1hcCkgeworCQltc2dfcXVldWUgPSAmcGVyX2NwdShpcGlfbXNnX3F1ZXVlLCBjcHUpOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmbXNnX3F1ZXVlLT5sb2NrLCBmbGFncyk7CisJCWxpc3RfYWRkKCZtc2ctPmxpc3QsICZtc2dfcXVldWUtPmhlYWQpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtc2dfcXVldWUtPmxvY2ssIGZsYWdzKTsKKwkJcGxhdGZvcm1fc2VuZF9pcGlfY3B1KGNwdSk7CisJfQorCXJldHVybjsKK30KKworaW50IF9fY3B1aW5pdCBfX2NwdV91cCh1bnNpZ25lZCBpbnQgY3B1KQoreworCXN0cnVjdCB0YXNrX3N0cnVjdCAqaWRsZTsKKwlpbnQgcmV0OworCisJaWRsZSA9IGZvcmtfaWRsZShjcHUpOworCWlmIChJU19FUlIoaWRsZSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJDUFUldTogZm9yaygpIGZhaWxlZFxuIiwgY3B1KTsKKwkJcmV0dXJuIFBUUl9FUlIoaWRsZSk7CisJfQorCisJc2Vjb25kYXJ5X3N0YWNrID0gdGFza19zdGFja19wYWdlKGlkbGUpICsgVEhSRUFEX1NJWkU7CisJc21wX3dtYigpOworCisJcmV0ID0gcGxhdGZvcm1fYm9vdF9zZWNvbmRhcnkoY3B1LCBpZGxlKTsKKworCWlmIChyZXQpIHsKKwkJY3B1X2NsZWFyKGNwdSwgY3B1X3ByZXNlbnRfbWFwKTsKKwkJcHJpbnRrKEtFUk5fQ1JJVCAiQ1BVJXU6IHByb2Nlc3NvciBmYWlsZWQgdG8gYm9vdCAoJWQpXG4iLCBjcHUsIHJldCk7CisJCWZyZWVfdGFzayhpZGxlKTsKKwl9IGVsc2UKKwkJY3B1X3NldChjcHUsIGNwdV9vbmxpbmVfbWFwKTsKKworCXNlY29uZGFyeV9zdGFjayA9IE5VTEw7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBfX2NwdWluaXQgc2V0dXBfc2Vjb25kYXJ5KHVuc2lnbmVkIGludCBjcHUpCit7CisjaWYgIShkZWZpbmVkKENPTkZJR19USUNLX1NPVVJDRV9TWVNUTVIwKSB8fCBkZWZpbmVkKENPTkZJR19JUElQRSkpCisJc3RydWN0IGlycV9kZXNjICp0aW1lcl9kZXNjOworI2VuZGlmCisJdW5zaWduZWQgbG9uZyBpbGF0OworCisJYmZpbl93cml0ZV9JTUFTSygwKTsKKwlDU1lOQygpOworCWlsYXQgPSBiZmluX3JlYWRfSUxBVCgpOworCUNTWU5DKCk7CisJYmZpbl93cml0ZV9JTEFUKGlsYXQpOworCUNTWU5DKCk7CisKKwkvKiBSZXNlcnZlIHRoZSBQREEgc3BhY2UgZm9yIHRoZSBzZWNvbmRhcnkgQ1BVLiAqLworCXJlc2VydmVfcGRhKCk7CisKKwkvKiBFbmFibGUgaW50ZXJydXB0IGxldmVscyBJVkc3LTE1LiBJQVJzIGhhdmUgYmVlbiBhbHJlYWR5CisJICogcHJvZ3JhbW1lZCBieSB0aGUgYm9vdCBDUFUuICAqLworCWJmaW5faXJxX2ZsYWdzIHw9IElNQVNLX0lWRzE1IHwKKwkgICAgSU1BU0tfSVZHMTQgfCBJTUFTS19JVkcxMyB8IElNQVNLX0lWRzEyIHwgSU1BU0tfSVZHMTEgfAorCSAgICBJTUFTS19JVkcxMCB8IElNQVNLX0lWRzkgfCBJTUFTS19JVkc4IHwgSU1BU0tfSVZHNyB8IElNQVNLX0lWR0hXOworCisjaWYgZGVmaW5lZChDT05GSUdfVElDS19TT1VSQ0VfU1lTVE1SMCkgfHwgZGVmaW5lZChDT05GSUdfSVBJUEUpCisJLyogUG93ZXIgZG93biB0aGUgY29yZSB0aW1lciwganVzdCB0byBwbGF5IHNhZmUuICovCisJYmZpbl93cml0ZV9UQ05UTCgwKTsKKworCS8qIHN5c3RlbSB0aW1lcjAgaGFzIGJlZW4gc2V0dXAgYnkgQ29yZUEuICovCisjZWxzZQorCXRpbWVyX2Rlc2MgPSBpcnFfZGVzYyArIElSUV9DT1JFVE1SOworCXNldHVwX2NvcmVfdGltZXIoKTsKKwl0aW1lcl9kZXNjLT5jaGlwLT5lbmFibGUoSVJRX0NPUkVUTVIpOworI2VuZGlmCit9CisKK3ZvaWQgX19jcHVpbml0IHNlY29uZGFyeV9zdGFydF9rZXJuZWwodm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gJmluaXRfbW07CisKKwlpZiAoX2JmaW5fc3dyc3QgJiBTV1JTVF9EQkxfRkFVTFRfQikgeworCQlwcmludGsoS0VSTl9FTUVSRyAiQ29yZUIgUmVjb3ZlcmluZyBmcm9tIERPVUJMRSBGQVVMVCBldmVudFxuIik7CisjaWZkZWYgQ09ORklHX0RFQlVHX0RPVUJMRUZBVUxUCisJCXByaW50ayhLRVJOX0VNRVJHICIgV2hpbGUgaGFuZGxpbmcgZXhjZXB0aW9uIChFWENBVVNFID0gMHgleCkgYXQgJXBGXG4iLAorCQkJKGludClpbml0X3NhdmVkX3NlcXN0YXRfY29yZWIgJiBTRVFTVEFUX0VYQ0FVU0UsIGluaXRfc2F2ZWRfcmV0eF9jb3JlYik7CisJCXByaW50ayhLRVJOX05PVElDRSAiICAgRENQTEJfRkFVTFRfQUREUjogJXBGXG4iLCBpbml0X3NhdmVkX2RjcGxiX2ZhdWx0X2FkZHJfY29yZWIpOworCQlwcmludGsoS0VSTl9OT1RJQ0UgIiAgIElDUExCX0ZBVUxUX0FERFI6ICVwRlxuIiwgaW5pdF9zYXZlZF9pY3BsYl9mYXVsdF9hZGRyX2NvcmViKTsKKyNlbmRpZgorCQlwcmludGsoS0VSTl9OT1RJQ0UgIiBUaGUgaW5zdHJ1Y3Rpb24gYXQgJXBGIGNhdXNlZCBhIGRvdWJsZSBleGNlcHRpb25cbiIsCisJCQlpbml0X3JldHhfY29yZWIpOworCX0KKworCS8qCisJICogV2Ugd2FudCB0aGUgRC1jYWNoZSB0byBiZSBlbmFibGVkIGVhcmx5LCBpbiBjYXNlIHRoZSBhdG9taWMKKwkgKiBzdXBwb3J0IGNvZGUgZW11bGF0ZXMgY2FjaGUgY29oZXJlbmNlIChzZWUKKwkgKiBfX0FSQ0hfU1lOQ19DT1JFX0RDQUNIRSkuCisJICovCisJaW5pdF9leGNlcHRpb25fdmVjdG9ycygpOworCisJYmZpbl9zZXR1cF9jYWNoZXMoY3B1KTsKKworCWxvY2FsX2lycV9kaXNhYmxlKCk7CisKKwkvKiBBdHRhY2ggdGhlIG5ldyBpZGxlIHRhc2sgdG8gdGhlIGdsb2JhbCBtbS4gKi8KKwlhdG9taWNfaW5jKCZtbS0+bW1fdXNlcnMpOworCWF0b21pY19pbmMoJm1tLT5tbV9jb3VudCk7CisJY3VycmVudC0+YWN0aXZlX21tID0gbW07CisJQlVHX09OKGN1cnJlbnQtPm1tKTsJLyogQ2FuJ3QgYmUsIGJ1dCBiZXR0ZXIgYmUgc2FmZSB0aGFuIHNvcnJ5LiAqLworCisJcHJlZW1wdF9kaXNhYmxlKCk7CisKKwlzZXR1cF9zZWNvbmRhcnkoY3B1KTsKKworCWxvY2FsX2lycV9lbmFibGUoKTsKKworCXBsYXRmb3JtX3NlY29uZGFyeV9pbml0KGNwdSk7CisKKwljcHVfaWRsZSgpOworfQorCit2b2lkIF9faW5pdCBzbXBfcHJlcGFyZV9ib290X2NwdSh2b2lkKQoreworfQorCit2b2lkIF9faW5pdCBzbXBfcHJlcGFyZV9jcHVzKHVuc2lnbmVkIGludCBtYXhfY3B1cykKK3sKKwlwbGF0Zm9ybV9wcmVwYXJlX2NwdXMobWF4X2NwdXMpOworCWlwaV9xdWV1ZV9pbml0KCk7CisJcGxhdGZvcm1fcmVxdWVzdF9pcGkoJmlwaV9oYW5kbGVyKTsKK30KKwordm9pZCBfX2luaXQgc21wX2NwdXNfZG9uZSh1bnNpZ25lZCBpbnQgbWF4X2NwdXMpCit7CisJdW5zaWduZWQgbG9uZyBib2dvc3VtID0gMDsKKwl1bnNpZ25lZCBpbnQgY3B1OworCisJZm9yX2VhY2hfb25saW5lX2NwdShjcHUpCisJCWJvZ29zdW0gKz0gcGVyX2NwdShjcHVfZGF0YSwgY3B1KS5sb29wc19wZXJfamlmZnk7CisKKwlwcmludGsoS0VSTl9JTkZPICJTTVA6IFRvdGFsIG9mICVkIHByb2Nlc3NvcnMgYWN0aXZhdGVkICIKKwkgICAgICAgIiglbHUuJTAybHUgQm9nb01JUFMpLlxuIiwKKwkgICAgICAgbnVtX29ubGluZV9jcHVzKCksCisJICAgICAgIGJvZ29zdW0gLyAoNTAwMDAwL0haKSwKKwkgICAgICAgKGJvZ29zdW0gLyAoNTAwMC9IWikpICUgMTAwKTsKK30KKwordm9pZCBzbXBfaWNhY2hlX2ZsdXNoX3JhbmdlX290aGVycyh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCkKK3sKKwlzbXBfZmx1c2hfZGF0YS5zdGFydCA9IHN0YXJ0OworCXNtcF9mbHVzaF9kYXRhLmVuZCA9IGVuZDsKKworCWlmIChzbXBfY2FsbF9mdW5jdGlvbigmaXBpX2ZsdXNoX2ljYWNoZSwgJnNtcF9mbHVzaF9kYXRhLCAxKSkKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiU01QOiBmYWlsZWQgdG8gcnVuIEktY2FjaGUgZmx1c2ggcmVxdWVzdCBvbiBvdGhlciBDUFVzXG4iKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNtcF9pY2FjaGVfZmx1c2hfcmFuZ2Vfb3RoZXJzKTsKKworI2lmZGVmIF9fQVJDSF9TWU5DX0NPUkVfRENBQ0hFCit1bnNpZ25lZCBsb25nIGJhcnJpZXJfbWFzayBfX2F0dHJpYnV0ZV9fICgoX19zZWN0aW9uX18oIi5sMi5ic3MiKSkpOworCit2b2lkIHJlc3luY19jb3JlX2RjYWNoZSh2b2lkKQoreworCXVuc2lnbmVkIGludCBjcHUgPSBnZXRfY3B1KCk7CisJYmxhY2tmaW5faW52YWxpZGF0ZV9lbnRpcmVfZGNhY2hlKCk7CisJKytwZXJfY3B1KGNwdV9kYXRhLCBjcHUpLmRjYWNoZV9pbnZsZF9jb3VudDsKKwlwdXRfY3B1KCk7Cit9CitFWFBPUlRfU1lNQk9MKHJlc3luY19jb3JlX2RjYWNoZSk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbW0vaW5pdC5jIGIvYXJjaC9ibGFja2Zpbi9tbS9pbml0LmMKaW5kZXggYmMyNDBhYi4uZDA1MzJiNyAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tbS9pbml0LmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tbS9pbml0LmMKQEAgLTMxLDcgKzMxLDggQEAKICNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CiAjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9iZmluLWdsb2JhbC5oPgotI2luY2x1ZGUgPGFzbS9sMWxheW91dC5oPgorI2luY2x1ZGUgPGFzbS9wZGEuaD4KKyNpbmNsdWRlIDxhc20vY3BsYmluaXQuaD4KICNpbmNsdWRlICJibGFja2Zpbl9zcmFtLmgiCiAKIC8qCkBAIC01Myw2ICs1NCwxMSBAQAogCiB1bnNpZ25lZCBsb25nIGVtcHR5X3plcm9fcGFnZTsKIAorZXh0ZXJuIHVuc2lnbmVkIGxvbmcgZXhjZXB0aW9uX3N0YWNrW05SX0NQVVNdWzEwMjRdOworCitzdHJ1Y3QgYmxhY2tmaW5fcGRhIGNwdV9wZGFbTlJfQ1BVU107CitFWFBPUlRfU1lNQk9MKGNwdV9wZGEpOworCiAvKgogICogcGFnaW5nX2luaXQoKSBjb250aW51ZXMgdGhlIHZpcnR1YWwgbWVtb3J5IGVudmlyb25tZW50IHNldHVwIHdoaWNoCiAgKiB3YXMgYmVndW4gYnkgdGhlIGNvZGUgaW4gYXJjaC9oZWFkLlMuCkBAIC05OCw2ICsxMDQsMzIgQEAKIAl9CiB9CiAKK2FzbWxpbmthZ2Ugdm9pZCBpbml0X3BkYSh2b2lkKQoreworCXVuc2lnbmVkIGludCBjcHUgPSByYXdfc21wX3Byb2Nlc3Nvcl9pZCgpOworCisJLyogSW5pdGlhbGl6ZSB0aGUgUERBIGZpZWxkcyBob2xkaW5nIHJlZmVyZW5jZXMgdG8gb3RoZXIgcGFydHMKKwkgICBvZiB0aGUgbWVtb3J5LiBUaGUgY29udGVudCBvZiBzdWNoIG1lbW9yeSBpcyBzdGlsbAorCSAgIHVuZGVmaW5lZCBhdCB0aGUgdGltZSBvZiB0aGUgY2FsbCwgd2UgYXJlIG9ubHkgc2V0dGluZyB1cAorCSAgIHZhbGlkIHBvaW50ZXJzIHRvIGl0LiAqLworCW1lbXNldCgmY3B1X3BkYVtjcHVdLCAwLCBzaXplb2YoY3B1X3BkYVtjcHVdKSk7CisKKwljcHVfcGRhWzBdLm5leHQgPSAmY3B1X3BkYVsxXTsKKwljcHVfcGRhWzFdLm5leHQgPSAmY3B1X3BkYVswXTsKKworCWNwdV9wZGFbY3B1XS5leF9zdGFjayA9IGV4Y2VwdGlvbl9zdGFja1tjcHUgKyAxXTsKKworI2lmZGVmIENPTkZJR19TTVAKKwljcHVfcGRhW2NwdV0uaW1hc2sgPSAweDFmOworI2VuZGlmCit9CisKK3ZvaWQgX19jcHVpbml0IHJlc2VydmVfcGRhKHZvaWQpCit7CisJcHJpbnRrKEtFUk5fSU5GTyAiUERBIGZvciBDUFUldSByZXNlcnZlZCBhdCAlcFxuIiwgc21wX3Byb2Nlc3Nvcl9pZCgpLAorCQkJCQkmY3B1X3BkYVtzbXBfcHJvY2Vzc29yX2lkKCldKTsKK30KKwogdm9pZCBfX2luaXQgbWVtX2luaXQodm9pZCkKIHsKIAl1bnNpZ25lZCBpbnQgY29kZWsgPSAwLCBkYXRhayA9IDAsIGluaXRrID0gMDsKQEAgLTE0MSwyMSArMTczLDEzIEBACiAKIHN0YXRpYyBpbnQgX19pbml0IHNyYW1faW5pdCh2b2lkKQogewotCXVuc2lnbmVkIGxvbmcgdG1wOwotCiAJLyogSW5pdGlhbGl6ZSB0aGUgYmxhY2tmaW4gTDEgTWVtb3J5LiAqLwogCWJmaW5fc3JhbV9pbml0KCk7CiAKLQkvKiBBbGxvY2F0ZSB0aGlzIG9uY2U7IG5ldmVyIGZyZWUgaXQuICBXZSBhc3N1bWUgdGhpcyBnaXZlcyB1cyBhCi0JICAgcG9pbnRlciB0byB0aGUgc3RhcnQgb2YgTDEgc2NyYXRjaHBhZCBtZW1vcnk7IHBhbmljIGlmIGl0Ci0JICAgZG9lc24ndC4gICovCi0JdG1wID0gKHVuc2lnbmVkIGxvbmcpbDFzcmFtX2FsbG9jKHNpemVvZihzdHJ1Y3QgbDFfc2NyYXRjaF90YXNrX2luZm8pKTsKLQlpZiAodG1wICE9ICh1bnNpZ25lZCBsb25nKUwxX1NDUkFUQ0hfVEFTS19JTkZPKSB7Ci0JCXByaW50ayhLRVJOX0VNRVJHICJtZW1faW5pdCgpOiBEaWQgbm90IGdldCB0aGUgcmlnaHQgYWRkcmVzcyBmcm9tIGwxc3JhbV9hbGxvYzogJTA4bHggIT0gJTA4bHhcbiIsCi0JCQl0bXAsICh1bnNpZ25lZCBsb25nKUwxX1NDUkFUQ0hfVEFTS19JTkZPKTsKLQkJcGFuaWMoIk5vIEwxLCB0aW1lIHRvIGdpdmUgdXBcbiIpOwotCX0KLQorCS8qIFJlc2VydmUgdGhlIFBEQSBzcGFjZSBmb3IgdGhlIGJvb3QgQ1BVIHJpZ2h0IGFmdGVyIHdlCisJICogaW5pdGlhbGl6ZWQgdGhlIHNjcmF0Y2ggbWVtb3J5IGFsbG9jYXRvci4KKwkgKi8KKwlyZXNlcnZlX3BkYSgpOwogCXJldHVybiAwOwogfQogcHVyZV9pbml0Y2FsbChzcmFtX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tbS9zcmFtLWFsbG9jLmMgYi9hcmNoL2JsYWNrZmluL21tL3NyYW0tYWxsb2MuYwppbmRleCBjYzZmMzM2Li44MzRjYWI3IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21tL3NyYW0tYWxsb2MuYworKysgYi9hcmNoL2JsYWNrZmluL21tL3NyYW0tYWxsb2MuYwpAQCAtMzksMTAgKzM5LDEzIEBACiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9ydGMuaD4KICNpbmNsdWRlIDxhc20vYmxhY2tmaW4uaD4KKyNpbmNsdWRlIDxhc20vbWVtX21hcC5oPgogI2luY2x1ZGUgImJsYWNrZmluX3NyYW0uaCIKIAotc3RhdGljIHNwaW5sb2NrX3QgbDFzcmFtX2xvY2ssIGwxX2RhdGFfc3JhbV9sb2NrLCBsMV9pbnN0X3NyYW1fbG9jazsKLXN0YXRpYyBzcGlubG9ja190IGwyX3NyYW1fbG9jazsKK3N0YXRpYyBERUZJTkVfUEVSX0NQVShzcGlubG9ja190LCBsMXNyYW1fbG9jaykgX19fX2NhY2hlbGluZV9hbGlnbmVkX2luX3NtcDsKK3N0YXRpYyBERUZJTkVfUEVSX0NQVShzcGlubG9ja190LCBsMV9kYXRhX3NyYW1fbG9jaykgX19fX2NhY2hlbGluZV9hbGlnbmVkX2luX3NtcDsKK3N0YXRpYyBERUZJTkVfUEVSX0NQVShzcGlubG9ja190LCBsMV9pbnN0X3NyYW1fbG9jaykgX19fX2NhY2hlbGluZV9hbGlnbmVkX2luX3NtcDsKK3N0YXRpYyBzcGlubG9ja190IGwyX3NyYW1fbG9jayBfX19fY2FjaGVsaW5lX2FsaWduZWRfaW5fc21wOwogCiAvKiB0aGUgZGF0YSBzdHJ1Y3R1cmUgZm9yIEwxIHNjcmF0Y2hwYWQgYW5kIERBVEEgU1JBTSAqLwogc3RydWN0IHNyYW1fcGllY2UgewpAQCAtNTIsMTggKzU1LDIyIEBACiAJc3RydWN0IHNyYW1fcGllY2UgKm5leHQ7CiB9OwogCi1zdGF0aWMgc3RydWN0IHNyYW1fcGllY2UgZnJlZV9sMV9zc3JhbV9oZWFkLCB1c2VkX2wxX3NzcmFtX2hlYWQ7CitzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IHNyYW1fcGllY2UsIGZyZWVfbDFfc3NyYW1faGVhZCk7CitzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IHNyYW1fcGllY2UsIHVzZWRfbDFfc3NyYW1faGVhZCk7CiAKICNpZiBMMV9EQVRBX0FfTEVOR1RIICE9IDAKLXN0YXRpYyBzdHJ1Y3Qgc3JhbV9waWVjZSBmcmVlX2wxX2RhdGFfQV9zcmFtX2hlYWQsIHVzZWRfbDFfZGF0YV9BX3NyYW1faGVhZDsKK3N0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3Qgc3JhbV9waWVjZSwgZnJlZV9sMV9kYXRhX0Ffc3JhbV9oZWFkKTsKK3N0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3Qgc3JhbV9waWVjZSwgdXNlZF9sMV9kYXRhX0Ffc3JhbV9oZWFkKTsKICNlbmRpZgogCiAjaWYgTDFfREFUQV9CX0xFTkdUSCAhPSAwCi1zdGF0aWMgc3RydWN0IHNyYW1fcGllY2UgZnJlZV9sMV9kYXRhX0Jfc3JhbV9oZWFkLCB1c2VkX2wxX2RhdGFfQl9zcmFtX2hlYWQ7CitzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IHNyYW1fcGllY2UsIGZyZWVfbDFfZGF0YV9CX3NyYW1faGVhZCk7CitzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IHNyYW1fcGllY2UsIHVzZWRfbDFfZGF0YV9CX3NyYW1faGVhZCk7CiAjZW5kaWYKIAogI2lmIEwxX0NPREVfTEVOR1RIICE9IDAKLXN0YXRpYyBzdHJ1Y3Qgc3JhbV9waWVjZSBmcmVlX2wxX2luc3Rfc3JhbV9oZWFkLCB1c2VkX2wxX2luc3Rfc3JhbV9oZWFkOworc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBzcmFtX3BpZWNlLCBmcmVlX2wxX2luc3Rfc3JhbV9oZWFkKTsKK3N0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3Qgc3JhbV9waWVjZSwgdXNlZF9sMV9pbnN0X3NyYW1faGVhZCk7CiAjZW5kaWYKIAogI2lmIEwyX0xFTkdUSCAhPSAwCkBAIC03NSwxMDIgKzgyLDExNyBAQAogLyogTDEgU2NyYXRjaHBhZCBTUkFNIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uICovCiBzdGF0aWMgdm9pZCBfX2luaXQgbDFzcmFtX2luaXQodm9pZCkKIHsKLQlmcmVlX2wxX3NzcmFtX2hlYWQubmV4dCA9Ci0JCWttZW1fY2FjaGVfYWxsb2Moc3JhbV9waWVjZV9jYWNoZSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFmcmVlX2wxX3NzcmFtX2hlYWQubmV4dCkgewotCQlwcmludGsoS0VSTl9JTkZPICJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBTY3JhdGNocGFkIGRhdGEgU1JBTVxuIik7Ci0JCXJldHVybjsKKwl1bnNpZ25lZCBpbnQgY3B1OworCWZvciAoY3B1ID0gMDsgY3B1IDwgbnVtX3Bvc3NpYmxlX2NwdXMoKTsgKytjcHUpIHsKKwkJcGVyX2NwdShmcmVlX2wxX3NzcmFtX2hlYWQsIGNwdSkubmV4dCA9CisJCQlrbWVtX2NhY2hlX2FsbG9jKHNyYW1fcGllY2VfY2FjaGUsIEdGUF9LRVJORUwpOworCQlpZiAoIXBlcl9jcHUoZnJlZV9sMV9zc3JhbV9oZWFkLCBjcHUpLm5leHQpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIkZhaWwgdG8gaW5pdGlhbGl6ZSBTY3JhdGNocGFkIGRhdGEgU1JBTS5cbiIpOworCQkJcmV0dXJuOworCQl9CisKKwkJcGVyX2NwdShmcmVlX2wxX3NzcmFtX2hlYWQsIGNwdSkubmV4dC0+cGFkZHIgPSAodm9pZCAqKWdldF9sMV9zY3JhdGNoX3N0YXJ0X2NwdShjcHUpOworCQlwZXJfY3B1KGZyZWVfbDFfc3NyYW1faGVhZCwgY3B1KS5uZXh0LT5zaXplID0gTDFfU0NSQVRDSF9MRU5HVEg7CisJCXBlcl9jcHUoZnJlZV9sMV9zc3JhbV9oZWFkLCBjcHUpLm5leHQtPnBpZCA9IDA7CisJCXBlcl9jcHUoZnJlZV9sMV9zc3JhbV9oZWFkLCBjcHUpLm5leHQtPm5leHQgPSBOVUxMOworCisJCXBlcl9jcHUodXNlZF9sMV9zc3JhbV9oZWFkLCBjcHUpLm5leHQgPSBOVUxMOworCisJCS8qIG11dGV4IGluaXRpYWxpemUgKi8KKwkJc3Bpbl9sb2NrX2luaXQoJnBlcl9jcHUobDFzcmFtX2xvY2ssIGNwdSkpOworCQlwcmludGsoS0VSTl9JTkZPICJCbGFja2ZpbiBTY3JhdGNocGFkIGRhdGEgU1JBTTogJWQgS0JcbiIsCisJCQlMMV9TQ1JBVENIX0xFTkdUSCA+PiAxMCk7CiAJfQotCi0JZnJlZV9sMV9zc3JhbV9oZWFkLm5leHQtPnBhZGRyID0gKHZvaWQgKilMMV9TQ1JBVENIX1NUQVJUOwotCWZyZWVfbDFfc3NyYW1faGVhZC5uZXh0LT5zaXplID0gTDFfU0NSQVRDSF9MRU5HVEg7Ci0JZnJlZV9sMV9zc3JhbV9oZWFkLm5leHQtPnBpZCA9IDA7Ci0JZnJlZV9sMV9zc3JhbV9oZWFkLm5leHQtPm5leHQgPSBOVUxMOwotCi0JdXNlZF9sMV9zc3JhbV9oZWFkLm5leHQgPSBOVUxMOwotCi0JLyogbXV0ZXggaW5pdGlhbGl6ZSAqLwotCXNwaW5fbG9ja19pbml0KCZsMXNyYW1fbG9jayk7Ci0KLQlwcmludGsoS0VSTl9JTkZPICJCbGFja2ZpbiBTY3JhdGNocGFkIGRhdGEgU1JBTTogJWQgS0JcbiIsCi0JICAgICAgIEwxX1NDUkFUQ0hfTEVOR1RIID4+IDEwKTsKIH0KIAogc3RhdGljIHZvaWQgX19pbml0IGwxX2RhdGFfc3JhbV9pbml0KHZvaWQpCiB7CisjaWYgTDFfREFUQV9BX0xFTkdUSCAhPSAwIHx8IEwxX0RBVEFfQl9MRU5HVEggIT0gMAorCXVuc2lnbmVkIGludCBjcHU7CisjZW5kaWYKICNpZiBMMV9EQVRBX0FfTEVOR1RIICE9IDAKLQlmcmVlX2wxX2RhdGFfQV9zcmFtX2hlYWQubmV4dCA9Ci0JCWttZW1fY2FjaGVfYWxsb2Moc3JhbV9waWVjZV9jYWNoZSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFmcmVlX2wxX2RhdGFfQV9zcmFtX2hlYWQubmV4dCkgewotCQlwcmludGsoS0VSTl9JTkZPICJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBMMSBEYXRhIEEgU1JBTVxuIik7Ci0JCXJldHVybjsKKwlmb3IgKGNwdSA9IDA7IGNwdSA8IG51bV9wb3NzaWJsZV9jcHVzKCk7ICsrY3B1KSB7CisJCXBlcl9jcHUoZnJlZV9sMV9kYXRhX0Ffc3JhbV9oZWFkLCBjcHUpLm5leHQgPQorCQkJa21lbV9jYWNoZV9hbGxvYyhzcmFtX3BpZWNlX2NhY2hlLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFwZXJfY3B1KGZyZWVfbDFfZGF0YV9BX3NyYW1faGVhZCwgY3B1KS5uZXh0KSB7CisJCQlwcmludGsoS0VSTl9JTkZPICJGYWlsIHRvIGluaXRpYWxpemUgTDEgRGF0YSBBIFNSQU0uXG4iKTsKKwkJCXJldHVybjsKKwkJfQorCisJCXBlcl9jcHUoZnJlZV9sMV9kYXRhX0Ffc3JhbV9oZWFkLCBjcHUpLm5leHQtPnBhZGRyID0KKwkJCSh2b2lkICopZ2V0X2wxX2RhdGFfYV9zdGFydF9jcHUoY3B1KSArIChfZWJzc19sMSAtIF9zZGF0YV9sMSk7CisJCXBlcl9jcHUoZnJlZV9sMV9kYXRhX0Ffc3JhbV9oZWFkLCBjcHUpLm5leHQtPnNpemUgPQorCQkJTDFfREFUQV9BX0xFTkdUSCAtIChfZWJzc19sMSAtIF9zZGF0YV9sMSk7CisJCXBlcl9jcHUoZnJlZV9sMV9kYXRhX0Ffc3JhbV9oZWFkLCBjcHUpLm5leHQtPnBpZCA9IDA7CisJCXBlcl9jcHUoZnJlZV9sMV9kYXRhX0Ffc3JhbV9oZWFkLCBjcHUpLm5leHQtPm5leHQgPSBOVUxMOworCisJCXBlcl9jcHUodXNlZF9sMV9kYXRhX0Ffc3JhbV9oZWFkLCBjcHUpLm5leHQgPSBOVUxMOworCisJCXByaW50ayhLRVJOX0lORk8gIkJsYWNrZmluIEwxIERhdGEgQSBTUkFNOiAlZCBLQiAoJWQgS0IgZnJlZSlcbiIsCisJCQlMMV9EQVRBX0FfTEVOR1RIID4+IDEwLAorCQkJcGVyX2NwdShmcmVlX2wxX2RhdGFfQV9zcmFtX2hlYWQsIGNwdSkubmV4dC0+c2l6ZSA+PiAxMCk7CiAJfQotCi0JZnJlZV9sMV9kYXRhX0Ffc3JhbV9oZWFkLm5leHQtPnBhZGRyID0KLQkJKHZvaWQgKilMMV9EQVRBX0FfU1RBUlQgKyAoX2Vic3NfbDEgLSBfc2RhdGFfbDEpOwotCWZyZWVfbDFfZGF0YV9BX3NyYW1faGVhZC5uZXh0LT5zaXplID0KLQkJTDFfREFUQV9BX0xFTkdUSCAtIChfZWJzc19sMSAtIF9zZGF0YV9sMSk7Ci0JZnJlZV9sMV9kYXRhX0Ffc3JhbV9oZWFkLm5leHQtPnBpZCA9IDA7Ci0JZnJlZV9sMV9kYXRhX0Ffc3JhbV9oZWFkLm5leHQtPm5leHQgPSBOVUxMOwotCi0JdXNlZF9sMV9kYXRhX0Ffc3JhbV9oZWFkLm5leHQgPSBOVUxMOwotCi0JcHJpbnRrKEtFUk5fSU5GTyAiQmxhY2tmaW4gTDEgRGF0YSBBIFNSQU06ICVkIEtCICglZCBLQiBmcmVlKVxuIiwKLQkJTDFfREFUQV9BX0xFTkdUSCA+PiAxMCwKLQkJZnJlZV9sMV9kYXRhX0Ffc3JhbV9oZWFkLm5leHQtPnNpemUgPj4gMTApOwogI2VuZGlmCiAjaWYgTDFfREFUQV9CX0xFTkdUSCAhPSAwCi0JZnJlZV9sMV9kYXRhX0Jfc3JhbV9oZWFkLm5leHQgPQotCQlrbWVtX2NhY2hlX2FsbG9jKHNyYW1fcGllY2VfY2FjaGUsIEdGUF9LRVJORUwpOwotCWlmICghZnJlZV9sMV9kYXRhX0Jfc3JhbV9oZWFkLm5leHQpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiRmFpbGVkIHRvIGluaXRpYWxpemUgTDEgRGF0YSBCIFNSQU1cbiIpOwotCQlyZXR1cm47CisJZm9yIChjcHUgPSAwOyBjcHUgPCBudW1fcG9zc2libGVfY3B1cygpOyArK2NwdSkgeworCQlwZXJfY3B1KGZyZWVfbDFfZGF0YV9CX3NyYW1faGVhZCwgY3B1KS5uZXh0ID0KKwkJCWttZW1fY2FjaGVfYWxsb2Moc3JhbV9waWVjZV9jYWNoZSwgR0ZQX0tFUk5FTCk7CisJCWlmICghcGVyX2NwdShmcmVlX2wxX2RhdGFfQl9zcmFtX2hlYWQsIGNwdSkubmV4dCkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiRmFpbCB0byBpbml0aWFsaXplIEwxIERhdGEgQiBTUkFNLlxuIik7CisJCQlyZXR1cm47CisJCX0KKworCQlwZXJfY3B1KGZyZWVfbDFfZGF0YV9CX3NyYW1faGVhZCwgY3B1KS5uZXh0LT5wYWRkciA9CisJCQkodm9pZCAqKWdldF9sMV9kYXRhX2Jfc3RhcnRfY3B1KGNwdSkgKyAoX2Vic3NfYl9sMSAtIF9zZGF0YV9iX2wxKTsKKwkJcGVyX2NwdShmcmVlX2wxX2RhdGFfQl9zcmFtX2hlYWQsIGNwdSkubmV4dC0+c2l6ZSA9CisJCQlMMV9EQVRBX0JfTEVOR1RIIC0gKF9lYnNzX2JfbDEgLSBfc2RhdGFfYl9sMSk7CisJCXBlcl9jcHUoZnJlZV9sMV9kYXRhX0Jfc3JhbV9oZWFkLCBjcHUpLm5leHQtPnBpZCA9IDA7CisJCXBlcl9jcHUoZnJlZV9sMV9kYXRhX0Jfc3JhbV9oZWFkLCBjcHUpLm5leHQtPm5leHQgPSBOVUxMOworCisJCXBlcl9jcHUodXNlZF9sMV9kYXRhX0Jfc3JhbV9oZWFkLCBjcHUpLm5leHQgPSBOVUxMOworCisJCXByaW50ayhLRVJOX0lORk8gIkJsYWNrZmluIEwxIERhdGEgQiBTUkFNOiAlZCBLQiAoJWQgS0IgZnJlZSlcbiIsCisJCQlMMV9EQVRBX0JfTEVOR1RIID4+IDEwLAorCQkJcGVyX2NwdShmcmVlX2wxX2RhdGFfQl9zcmFtX2hlYWQsIGNwdSkubmV4dC0+c2l6ZSA+PiAxMCk7CisJCS8qIG11dGV4IGluaXRpYWxpemUgKi8KIAl9Ci0KLQlmcmVlX2wxX2RhdGFfQl9zcmFtX2hlYWQubmV4dC0+cGFkZHIgPQotCQkodm9pZCAqKUwxX0RBVEFfQl9TVEFSVCArIChfZWJzc19iX2wxIC0gX3NkYXRhX2JfbDEpOwotCWZyZWVfbDFfZGF0YV9CX3NyYW1faGVhZC5uZXh0LT5zaXplID0KLQkJTDFfREFUQV9CX0xFTkdUSCAtIChfZWJzc19iX2wxIC0gX3NkYXRhX2JfbDEpOwotCWZyZWVfbDFfZGF0YV9CX3NyYW1faGVhZC5uZXh0LT5waWQgPSAwOwotCWZyZWVfbDFfZGF0YV9CX3NyYW1faGVhZC5uZXh0LT5uZXh0ID0gTlVMTDsKLQotCXVzZWRfbDFfZGF0YV9CX3NyYW1faGVhZC5uZXh0ID0gTlVMTDsKLQotCXByaW50ayhLRVJOX0lORk8gIkJsYWNrZmluIEwxIERhdGEgQiBTUkFNOiAlZCBLQiAoJWQgS0IgZnJlZSlcbiIsCi0JCUwxX0RBVEFfQl9MRU5HVEggPj4gMTAsCi0JCWZyZWVfbDFfZGF0YV9CX3NyYW1faGVhZC5uZXh0LT5zaXplID4+IDEwKTsKICNlbmRpZgogCi0JLyogbXV0ZXggaW5pdGlhbGl6ZSAqLwotCXNwaW5fbG9ja19pbml0KCZsMV9kYXRhX3NyYW1fbG9jayk7CisjaWYgTDFfREFUQV9BX0xFTkdUSCAhPSAwIHx8IEwxX0RBVEFfQl9MRU5HVEggIT0gMAorCWZvciAoY3B1ID0gMDsgY3B1IDwgbnVtX3Bvc3NpYmxlX2NwdXMoKTsgKytjcHUpCisJCXNwaW5fbG9ja19pbml0KCZwZXJfY3B1KGwxX2RhdGFfc3JhbV9sb2NrLCBjcHUpKTsKKyNlbmRpZgogfQogCiBzdGF0aWMgdm9pZCBfX2luaXQgbDFfaW5zdF9zcmFtX2luaXQodm9pZCkKIHsKICNpZiBMMV9DT0RFX0xFTkdUSCAhPSAwCi0JZnJlZV9sMV9pbnN0X3NyYW1faGVhZC5uZXh0ID0KLQkJa21lbV9jYWNoZV9hbGxvYyhzcmFtX3BpZWNlX2NhY2hlLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWZyZWVfbDFfaW5zdF9zcmFtX2hlYWQubmV4dCkgewotCQlwcmludGsoS0VSTl9JTkZPICJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBMMSBJbnN0cnVjdGlvbiBTUkFNXG4iKTsKLQkJcmV0dXJuOworCXVuc2lnbmVkIGludCBjcHU7CisJZm9yIChjcHUgPSAwOyBjcHUgPCBudW1fcG9zc2libGVfY3B1cygpOyArK2NwdSkgeworCQlwZXJfY3B1KGZyZWVfbDFfaW5zdF9zcmFtX2hlYWQsIGNwdSkubmV4dCA9CisJCQlrbWVtX2NhY2hlX2FsbG9jKHNyYW1fcGllY2VfY2FjaGUsIEdGUF9LRVJORUwpOworCQlpZiAoIXBlcl9jcHUoZnJlZV9sMV9pbnN0X3NyYW1faGVhZCwgY3B1KS5uZXh0KSB7CisJCQlwcmludGsoS0VSTl9JTkZPICJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBMMSBJbnN0cnVjdGlvbiBTUkFNXG4iKTsKKwkJCXJldHVybjsKKwkJfQorCisJCXBlcl9jcHUoZnJlZV9sMV9pbnN0X3NyYW1faGVhZCwgY3B1KS5uZXh0LT5wYWRkciA9CisJCQkodm9pZCAqKWdldF9sMV9jb2RlX3N0YXJ0X2NwdShjcHUpICsgKF9ldGV4dF9sMSAtIF9zdGV4dF9sMSk7CisJCXBlcl9jcHUoZnJlZV9sMV9pbnN0X3NyYW1faGVhZCwgY3B1KS5uZXh0LT5zaXplID0KKwkJCUwxX0NPREVfTEVOR1RIIC0gKF9ldGV4dF9sMSAtIF9zdGV4dF9sMSk7CisJCXBlcl9jcHUoZnJlZV9sMV9pbnN0X3NyYW1faGVhZCwgY3B1KS5uZXh0LT5waWQgPSAwOworCQlwZXJfY3B1KGZyZWVfbDFfaW5zdF9zcmFtX2hlYWQsIGNwdSkubmV4dC0+bmV4dCA9IE5VTEw7CisKKwkJcGVyX2NwdSh1c2VkX2wxX2luc3Rfc3JhbV9oZWFkLCBjcHUpLm5leHQgPSBOVUxMOworCisJCXByaW50ayhLRVJOX0lORk8gIkJsYWNrZmluIEwxIEluc3RydWN0aW9uIFNSQU06ICVkIEtCICglZCBLQiBmcmVlKVxuIiwKKwkJCUwxX0NPREVfTEVOR1RIID4+IDEwLAorCQkJcGVyX2NwdShmcmVlX2wxX2luc3Rfc3JhbV9oZWFkLCBjcHUpLm5leHQtPnNpemUgPj4gMTApOworCisJCS8qIG11dGV4IGluaXRpYWxpemUgKi8KKwkJc3Bpbl9sb2NrX2luaXQoJnBlcl9jcHUobDFfaW5zdF9zcmFtX2xvY2ssIGNwdSkpOwogCX0KLQotCWZyZWVfbDFfaW5zdF9zcmFtX2hlYWQubmV4dC0+cGFkZHIgPQotCQkodm9pZCAqKUwxX0NPREVfU1RBUlQgKyAoX2V0ZXh0X2wxIC0gX3N0ZXh0X2wxKTsKLQlmcmVlX2wxX2luc3Rfc3JhbV9oZWFkLm5leHQtPnNpemUgPQotCQlMMV9DT0RFX0xFTkdUSCAtIChfZXRleHRfbDEgLSBfc3RleHRfbDEpOwotCWZyZWVfbDFfaW5zdF9zcmFtX2hlYWQubmV4dC0+cGlkID0gMDsKLQlmcmVlX2wxX2luc3Rfc3JhbV9oZWFkLm5leHQtPm5leHQgPSBOVUxMOwotCi0JdXNlZF9sMV9pbnN0X3NyYW1faGVhZC5uZXh0ID0gTlVMTDsKLQotCXByaW50ayhLRVJOX0lORk8gIkJsYWNrZmluIEwxIEluc3RydWN0aW9uIFNSQU06ICVkIEtCICglZCBLQiBmcmVlKVxuIiwKLQkJTDFfQ09ERV9MRU5HVEggPj4gMTAsCi0JCWZyZWVfbDFfaW5zdF9zcmFtX2hlYWQubmV4dC0+c2l6ZSA+PiAxMCk7CiAjZW5kaWYKLQotCS8qIG11dGV4IGluaXRpYWxpemUgKi8KLQlzcGluX2xvY2tfaW5pdCgmbDFfaW5zdF9zcmFtX2xvY2spOwogfQogCiBzdGF0aWMgdm9pZCBfX2luaXQgbDJfc3JhbV9pbml0KHZvaWQpCkBAIC0xNzksNyArMjAxLDcgQEAKIAlmcmVlX2wyX3NyYW1faGVhZC5uZXh0ID0KIAkJa21lbV9jYWNoZV9hbGxvYyhzcmFtX3BpZWNlX2NhY2hlLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWZyZWVfbDJfc3JhbV9oZWFkLm5leHQpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiRmFpbGVkIHRvIGluaXRpYWxpemUgTDIgU1JBTVxuIik7CisJCXByaW50ayhLRVJOX0lORk8gIkZhaWwgdG8gaW5pdGlhbGl6ZSBMMiBTUkFNLlxuIik7CiAJCXJldHVybjsKIAl9CiAKQEAgLTIwMCw2ICsyMjIsNyBAQAogCS8qIG11dGV4IGluaXRpYWxpemUgKi8KIAlzcGluX2xvY2tfaW5pdCgmbDJfc3JhbV9sb2NrKTsKIH0KKwogdm9pZCBfX2luaXQgYmZpbl9zcmFtX2luaXQodm9pZCkKIHsKIAlzcmFtX3BpZWNlX2NhY2hlID0ga21lbV9jYWNoZV9jcmVhdGUoInNyYW1fcGllY2VfY2FjaGUiLApAQCAtMzUzLDIwICszNzYsMjAgQEAKIHsKIAogI2lmIEwxX0NPREVfTEVOR1RIICE9IDAKLQlpZiAoYWRkciA+PSAodm9pZCAqKUwxX0NPREVfU1RBUlQKLQkJICYmIGFkZHIgPCAodm9pZCAqKShMMV9DT0RFX1NUQVJUICsgTDFfQ09ERV9MRU5HVEgpKQorCWlmIChhZGRyID49ICh2b2lkICopZ2V0X2wxX2NvZGVfc3RhcnQoKQorCQkgJiYgYWRkciA8ICh2b2lkICopKGdldF9sMV9jb2RlX3N0YXJ0KCkgKyBMMV9DT0RFX0xFTkdUSCkpCiAJCXJldHVybiBsMV9pbnN0X3NyYW1fZnJlZShhZGRyKTsKIAllbHNlCiAjZW5kaWYKICNpZiBMMV9EQVRBX0FfTEVOR1RIICE9IDAKLQlpZiAoYWRkciA+PSAodm9pZCAqKUwxX0RBVEFfQV9TVEFSVAotCQkgJiYgYWRkciA8ICh2b2lkICopKEwxX0RBVEFfQV9TVEFSVCArIEwxX0RBVEFfQV9MRU5HVEgpKQorCWlmIChhZGRyID49ICh2b2lkICopZ2V0X2wxX2RhdGFfYV9zdGFydCgpCisJCSAmJiBhZGRyIDwgKHZvaWQgKikoZ2V0X2wxX2RhdGFfYV9zdGFydCgpICsgTDFfREFUQV9BX0xFTkdUSCkpCiAJCXJldHVybiBsMV9kYXRhX0Ffc3JhbV9mcmVlKGFkZHIpOwogCWVsc2UKICNlbmRpZgogI2lmIEwxX0RBVEFfQl9MRU5HVEggIT0gMAotCWlmIChhZGRyID49ICh2b2lkICopTDFfREFUQV9CX1NUQVJUCi0JCSAmJiBhZGRyIDwgKHZvaWQgKikoTDFfREFUQV9CX1NUQVJUICsgTDFfREFUQV9CX0xFTkdUSCkpCisJaWYgKGFkZHIgPj0gKHZvaWQgKilnZXRfbDFfZGF0YV9iX3N0YXJ0KCkKKwkJICYmIGFkZHIgPCAodm9pZCAqKShnZXRfbDFfZGF0YV9iX3N0YXJ0KCkgKyBMMV9EQVRBX0JfTEVOR1RIKSkKIAkJcmV0dXJuIGwxX2RhdGFfQl9zcmFtX2ZyZWUoYWRkcik7CiAJZWxzZQogI2VuZGlmCkBAIC0zODQsMTcgKzQwNywyMCBAQAogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdm9pZCAqYWRkciA9IE5VTEw7CisJdW5zaWduZWQgaW50IGNwdTsKIAorCWNwdSA9IGdldF9jcHUoKTsKIAkvKiBhZGQgbXV0ZXggb3BlcmF0aW9uICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmwxX2RhdGFfc3JhbV9sb2NrLCBmbGFncyk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnBlcl9jcHUobDFfZGF0YV9zcmFtX2xvY2ssIGNwdSksIGZsYWdzKTsKIAogI2lmIEwxX0RBVEFfQV9MRU5HVEggIT0gMAotCWFkZHIgPSBfc3JhbV9hbGxvYyhzaXplLCAmZnJlZV9sMV9kYXRhX0Ffc3JhbV9oZWFkLAotCQkJJnVzZWRfbDFfZGF0YV9BX3NyYW1faGVhZCk7CisJYWRkciA9IF9zcmFtX2FsbG9jKHNpemUsICZwZXJfY3B1KGZyZWVfbDFfZGF0YV9BX3NyYW1faGVhZCwgY3B1KSwKKwkJCSZwZXJfY3B1KHVzZWRfbDFfZGF0YV9BX3NyYW1faGVhZCwgY3B1KSk7CiAjZW5kaWYKIAogCS8qIGFkZCBtdXRleCBvcGVyYXRpb24gKi8KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsMV9kYXRhX3NyYW1fbG9jaywgZmxhZ3MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBlcl9jcHUobDFfZGF0YV9zcmFtX2xvY2ssIGNwdSksIGZsYWdzKTsKKwlwdXRfY3B1KCk7CiAKIAlwcl9kZWJ1ZygiQWxsb2NhdGVkIGFkZHJlc3MgaW4gbDFfZGF0YV9BX3NyYW1fYWxsb2MgaXMgMHglbHgrMHglbHhcbiIsCiAJCSAobG9uZyB1bnNpZ25lZCBpbnQpYWRkciwgc2l6ZSk7CkBAIC00MDcsMTkgKzQzMywyMiBAQAogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IHJldDsKKwl1bnNpZ25lZCBpbnQgY3B1OwogCisJY3B1ID0gZ2V0X2NwdSgpOwogCS8qIGFkZCBtdXRleCBvcGVyYXRpb24gKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSgmbDFfZGF0YV9zcmFtX2xvY2ssIGZsYWdzKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcGVyX2NwdShsMV9kYXRhX3NyYW1fbG9jaywgY3B1KSwgZmxhZ3MpOwogCiAjaWYgTDFfREFUQV9BX0xFTkdUSCAhPSAwCi0JcmV0ID0gX3NyYW1fZnJlZShhZGRyLCAmZnJlZV9sMV9kYXRhX0Ffc3JhbV9oZWFkLAotCQkJJnVzZWRfbDFfZGF0YV9BX3NyYW1faGVhZCk7CisJcmV0ID0gX3NyYW1fZnJlZShhZGRyLCAmcGVyX2NwdShmcmVlX2wxX2RhdGFfQV9zcmFtX2hlYWQsIGNwdSksCisJCQkmcGVyX2NwdSh1c2VkX2wxX2RhdGFfQV9zcmFtX2hlYWQsIGNwdSkpOwogI2Vsc2UKIAlyZXQgPSAtMTsKICNlbmRpZgogCiAJLyogYWRkIG11dGV4IG9wZXJhdGlvbiAqLwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmwxX2RhdGFfc3JhbV9sb2NrLCBmbGFncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGVyX2NwdShsMV9kYXRhX3NyYW1fbG9jaywgY3B1KSwgZmxhZ3MpOworCXB1dF9jcHUoKTsKIAogCXJldHVybiByZXQ7CiB9CkBAIC00MzAsMTUgKzQ1OSwxOCBAQAogI2lmIEwxX0RBVEFfQl9MRU5HVEggIT0gMAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdm9pZCAqYWRkcjsKKwl1bnNpZ25lZCBpbnQgY3B1OworCisJY3B1ID0gZ2V0X2NwdSgpOworCS8qIGFkZCBtdXRleCBvcGVyYXRpb24gKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmcGVyX2NwdShsMV9kYXRhX3NyYW1fbG9jaywgY3B1KSwgZmxhZ3MpOworCisJYWRkciA9IF9zcmFtX2FsbG9jKHNpemUsICZwZXJfY3B1KGZyZWVfbDFfZGF0YV9CX3NyYW1faGVhZCwgY3B1KSwKKwkJCSZwZXJfY3B1KHVzZWRfbDFfZGF0YV9CX3NyYW1faGVhZCwgY3B1KSk7CiAKIAkvKiBhZGQgbXV0ZXggb3BlcmF0aW9uICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmwxX2RhdGFfc3JhbV9sb2NrLCBmbGFncyk7Ci0KLQlhZGRyID0gX3NyYW1fYWxsb2Moc2l6ZSwgJmZyZWVfbDFfZGF0YV9CX3NyYW1faGVhZCwKLQkJCSZ1c2VkX2wxX2RhdGFfQl9zcmFtX2hlYWQpOwotCi0JLyogYWRkIG11dGV4IG9wZXJhdGlvbiAqLwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmwxX2RhdGFfc3JhbV9sb2NrLCBmbGFncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGVyX2NwdShsMV9kYXRhX3NyYW1fbG9jaywgY3B1KSwgZmxhZ3MpOworCXB1dF9jcHUoKTsKIAogCXByX2RlYnVnKCJBbGxvY2F0ZWQgYWRkcmVzcyBpbiBsMV9kYXRhX0Jfc3JhbV9hbGxvYyBpcyAweCVseCsweCVseFxuIiwKIAkJIChsb25nIHVuc2lnbmVkIGludClhZGRyLCBzaXplKTsKQEAgLTQ1NSwxNSArNDg3LDE4IEBACiAjaWYgTDFfREFUQV9CX0xFTkdUSCAhPSAwCiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgcmV0OworCXVuc2lnbmVkIGludCBjcHU7CisKKwljcHUgPSBnZXRfY3B1KCk7CisJLyogYWRkIG11dGV4IG9wZXJhdGlvbiAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZwZXJfY3B1KGwxX2RhdGFfc3JhbV9sb2NrLCBjcHUpLCBmbGFncyk7CisKKwlyZXQgPSBfc3JhbV9mcmVlKGFkZHIsICZwZXJfY3B1KGZyZWVfbDFfZGF0YV9CX3NyYW1faGVhZCwgY3B1KSwKKwkJCSZwZXJfY3B1KHVzZWRfbDFfZGF0YV9CX3NyYW1faGVhZCwgY3B1KSk7CiAKIAkvKiBhZGQgbXV0ZXggb3BlcmF0aW9uICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmwxX2RhdGFfc3JhbV9sb2NrLCBmbGFncyk7Ci0KLQlyZXQgPSBfc3JhbV9mcmVlKGFkZHIsICZmcmVlX2wxX2RhdGFfQl9zcmFtX2hlYWQsCi0JCQkmdXNlZF9sMV9kYXRhX0Jfc3JhbV9oZWFkKTsKLQotCS8qIGFkZCBtdXRleCBvcGVyYXRpb24gKi8KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsMV9kYXRhX3NyYW1fbG9jaywgZmxhZ3MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBlcl9jcHUobDFfZGF0YV9zcmFtX2xvY2ssIGNwdSksIGZsYWdzKTsKKwlwdXRfY3B1KCk7CiAKIAlyZXR1cm4gcmV0OwogI2Vsc2UKQEAgLTUwOSwxNSArNTQ0LDE4IEBACiAjaWYgTDFfQ09ERV9MRU5HVEggIT0gMAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdm9pZCAqYWRkcjsKKwl1bnNpZ25lZCBpbnQgY3B1OworCisJY3B1ID0gZ2V0X2NwdSgpOworCS8qIGFkZCBtdXRleCBvcGVyYXRpb24gKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmcGVyX2NwdShsMV9pbnN0X3NyYW1fbG9jaywgY3B1KSwgZmxhZ3MpOworCisJYWRkciA9IF9zcmFtX2FsbG9jKHNpemUsICZwZXJfY3B1KGZyZWVfbDFfaW5zdF9zcmFtX2hlYWQsIGNwdSksCisJCQkmcGVyX2NwdSh1c2VkX2wxX2luc3Rfc3JhbV9oZWFkLCBjcHUpKTsKIAogCS8qIGFkZCBtdXRleCBvcGVyYXRpb24gKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSgmbDFfaW5zdF9zcmFtX2xvY2ssIGZsYWdzKTsKLQotCWFkZHIgPSBfc3JhbV9hbGxvYyhzaXplLCAmZnJlZV9sMV9pbnN0X3NyYW1faGVhZCwKLQkJCSZ1c2VkX2wxX2luc3Rfc3JhbV9oZWFkKTsKLQotCS8qIGFkZCBtdXRleCBvcGVyYXRpb24gKi8KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsMV9pbnN0X3NyYW1fbG9jaywgZmxhZ3MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBlcl9jcHUobDFfaW5zdF9zcmFtX2xvY2ssIGNwdSksIGZsYWdzKTsKKwlwdXRfY3B1KCk7CiAKIAlwcl9kZWJ1ZygiQWxsb2NhdGVkIGFkZHJlc3MgaW4gbDFfaW5zdF9zcmFtX2FsbG9jIGlzIDB4JWx4KzB4JWx4XG4iLAogCQkgKGxvbmcgdW5zaWduZWQgaW50KWFkZHIsIHNpemUpOwpAQCAtNTM0LDE1ICs1NzIsMTggQEAKICNpZiBMMV9DT0RFX0xFTkdUSCAhPSAwCiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgcmV0OworCXVuc2lnbmVkIGludCBjcHU7CisKKwljcHUgPSBnZXRfY3B1KCk7CisJLyogYWRkIG11dGV4IG9wZXJhdGlvbiAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZwZXJfY3B1KGwxX2luc3Rfc3JhbV9sb2NrLCBjcHUpLCBmbGFncyk7CisKKwlyZXQgPSBfc3JhbV9mcmVlKGFkZHIsICZwZXJfY3B1KGZyZWVfbDFfaW5zdF9zcmFtX2hlYWQsIGNwdSksCisJCQkmcGVyX2NwdSh1c2VkX2wxX2luc3Rfc3JhbV9oZWFkLCBjcHUpKTsKIAogCS8qIGFkZCBtdXRleCBvcGVyYXRpb24gKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSgmbDFfaW5zdF9zcmFtX2xvY2ssIGZsYWdzKTsKLQotCXJldCA9IF9zcmFtX2ZyZWUoYWRkciwgJmZyZWVfbDFfaW5zdF9zcmFtX2hlYWQsCi0JCQkmdXNlZF9sMV9pbnN0X3NyYW1faGVhZCk7Ci0KLQkvKiBhZGQgbXV0ZXggb3BlcmF0aW9uICovCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbDFfaW5zdF9zcmFtX2xvY2ssIGZsYWdzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwZXJfY3B1KGwxX2luc3Rfc3JhbV9sb2NrLCBjcHUpLCBmbGFncyk7CisJcHV0X2NwdSgpOwogCiAJcmV0dXJuIHJldDsKICNlbHNlCkBAIC01NTYsMTUgKzU5NywxOCBAQAogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdm9pZCAqYWRkcjsKKwl1bnNpZ25lZCBpbnQgY3B1OworCisJY3B1ID0gZ2V0X2NwdSgpOworCS8qIGFkZCBtdXRleCBvcGVyYXRpb24gKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmcGVyX2NwdShsMXNyYW1fbG9jaywgY3B1KSwgZmxhZ3MpOworCisJYWRkciA9IF9zcmFtX2FsbG9jKHNpemUsICZwZXJfY3B1KGZyZWVfbDFfc3NyYW1faGVhZCwgY3B1KSwKKwkJCSZwZXJfY3B1KHVzZWRfbDFfc3NyYW1faGVhZCwgY3B1KSk7CiAKIAkvKiBhZGQgbXV0ZXggb3BlcmF0aW9uICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmwxc3JhbV9sb2NrLCBmbGFncyk7Ci0KLQlhZGRyID0gX3NyYW1fYWxsb2Moc2l6ZSwgJmZyZWVfbDFfc3NyYW1faGVhZCwKLQkJCSZ1c2VkX2wxX3NzcmFtX2hlYWQpOwotCi0JLyogYWRkIG11dGV4IG9wZXJhdGlvbiAqLwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmwxc3JhbV9sb2NrLCBmbGFncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGVyX2NwdShsMXNyYW1fbG9jaywgY3B1KSwgZmxhZ3MpOworCXB1dF9jcHUoKTsKIAogCXJldHVybiBhZGRyOwogfQpAQCAtNTc0LDE1ICs2MTgsMTggQEAKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXZvaWQgKmFkZHI7CisJdW5zaWduZWQgaW50IGNwdTsKKworCWNwdSA9IGdldF9jcHUoKTsKKwkvKiBhZGQgbXV0ZXggb3BlcmF0aW9uICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBlcl9jcHUobDFzcmFtX2xvY2ssIGNwdSksIGZsYWdzKTsKKworCWFkZHIgPSBfc3JhbV9hbGxvY19tYXgoJnBlcl9jcHUoZnJlZV9sMV9zc3JhbV9oZWFkLCBjcHUpLAorCQkJJnBlcl9jcHUodXNlZF9sMV9zc3JhbV9oZWFkLCBjcHUpLCBwc2l6ZSk7CiAKIAkvKiBhZGQgbXV0ZXggb3BlcmF0aW9uICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmwxc3JhbV9sb2NrLCBmbGFncyk7Ci0KLQlhZGRyID0gX3NyYW1fYWxsb2NfbWF4KCZmcmVlX2wxX3NzcmFtX2hlYWQsCi0JCQkmdXNlZF9sMV9zc3JhbV9oZWFkLCBwc2l6ZSk7Ci0KLQkvKiBhZGQgbXV0ZXggb3BlcmF0aW9uICovCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbDFzcmFtX2xvY2ssIGZsYWdzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwZXJfY3B1KGwxc3JhbV9sb2NrLCBjcHUpLCBmbGFncyk7CisJcHV0X2NwdSgpOwogCiAJcmV0dXJuIGFkZHI7CiB9CkBAIC01OTIsMTUgKzYzOSwxOCBAQAogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IHJldDsKKwl1bnNpZ25lZCBpbnQgY3B1OworCisJY3B1ID0gZ2V0X2NwdSgpOworCS8qIGFkZCBtdXRleCBvcGVyYXRpb24gKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmcGVyX2NwdShsMXNyYW1fbG9jaywgY3B1KSwgZmxhZ3MpOworCisJcmV0ID0gX3NyYW1fZnJlZShhZGRyLCAmcGVyX2NwdShmcmVlX2wxX3NzcmFtX2hlYWQsIGNwdSksCisJCQkmcGVyX2NwdSh1c2VkX2wxX3NzcmFtX2hlYWQsIGNwdSkpOwogCiAJLyogYWRkIG11dGV4IG9wZXJhdGlvbiAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCZsMXNyYW1fbG9jaywgZmxhZ3MpOwotCi0JcmV0ID0gX3NyYW1fZnJlZShhZGRyLCAmZnJlZV9sMV9zc3JhbV9oZWFkLAotCQkJJnVzZWRfbDFfc3NyYW1faGVhZCk7Ci0KLQkvKiBhZGQgbXV0ZXggb3BlcmF0aW9uICovCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbDFzcmFtX2xvY2ssIGZsYWdzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwZXJfY3B1KGwxc3JhbV9sb2NrLCBjcHUpLCBmbGFncyk7CisJcHV0X2NwdSgpOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTc2MSwzMyArODExLDM2IEBACiAJCWludCAqZW9mLCB2b2lkICpkYXRhKQogewogCWludCBsZW4gPSAwOworCXVuc2lnbmVkIGludCBjcHU7CiAKLQlpZiAoX3NyYW1fcHJvY19yZWFkKGJ1ZiwgJmxlbiwgY291bnQsICJTY3JhdGNocGFkIiwKLQkJCSZmcmVlX2wxX3NzcmFtX2hlYWQsICZ1c2VkX2wxX3NzcmFtX2hlYWQpKQotCQlnb3RvIG5vdF9kb25lOworCWZvciAoY3B1ID0gMDsgY3B1IDwgbnVtX3Bvc3NpYmxlX2NwdXMoKTsgKytjcHUpIHsKKwkJaWYgKF9zcmFtX3Byb2NfcmVhZChidWYsICZsZW4sIGNvdW50LCAiU2NyYXRjaHBhZCIsCisJCQkmcGVyX2NwdShmcmVlX2wxX3NzcmFtX2hlYWQsIGNwdSksICZwZXJfY3B1KHVzZWRfbDFfc3NyYW1faGVhZCwgY3B1KSkpCisJCQlnb3RvIG5vdF9kb25lOwogI2lmIEwxX0RBVEFfQV9MRU5HVEggIT0gMAotCWlmIChfc3JhbV9wcm9jX3JlYWQoYnVmLCAmbGVuLCBjb3VudCwgIkwxIERhdGEgQSIsCi0JCQkmZnJlZV9sMV9kYXRhX0Ffc3JhbV9oZWFkLAotCQkJJnVzZWRfbDFfZGF0YV9BX3NyYW1faGVhZCkpCi0JCWdvdG8gbm90X2RvbmU7CisJCWlmIChfc3JhbV9wcm9jX3JlYWQoYnVmLCAmbGVuLCBjb3VudCwgIkwxIERhdGEgQSIsCisJCQkmcGVyX2NwdShmcmVlX2wxX2RhdGFfQV9zcmFtX2hlYWQsIGNwdSksCisJCQkmcGVyX2NwdSh1c2VkX2wxX2RhdGFfQV9zcmFtX2hlYWQsIGNwdSkpKQorCQkJZ290byBub3RfZG9uZTsKICNlbmRpZgogI2lmIEwxX0RBVEFfQl9MRU5HVEggIT0gMAotCWlmIChfc3JhbV9wcm9jX3JlYWQoYnVmLCAmbGVuLCBjb3VudCwgIkwxIERhdGEgQiIsCi0JCQkmZnJlZV9sMV9kYXRhX0Jfc3JhbV9oZWFkLAotCQkJJnVzZWRfbDFfZGF0YV9CX3NyYW1faGVhZCkpCi0JCWdvdG8gbm90X2RvbmU7CisJCWlmIChfc3JhbV9wcm9jX3JlYWQoYnVmLCAmbGVuLCBjb3VudCwgIkwxIERhdGEgQiIsCisJCQkmcGVyX2NwdShmcmVlX2wxX2RhdGFfQl9zcmFtX2hlYWQsIGNwdSksCisJCQkmcGVyX2NwdSh1c2VkX2wxX2RhdGFfQl9zcmFtX2hlYWQsIGNwdSkpKQorCQkJZ290byBub3RfZG9uZTsKICNlbmRpZgogI2lmIEwxX0NPREVfTEVOR1RIICE9IDAKLQlpZiAoX3NyYW1fcHJvY19yZWFkKGJ1ZiwgJmxlbiwgY291bnQsICJMMSBJbnN0cnVjdGlvbiIsCi0JCQkmZnJlZV9sMV9pbnN0X3NyYW1faGVhZCwgJnVzZWRfbDFfaW5zdF9zcmFtX2hlYWQpKQotCQlnb3RvIG5vdF9kb25lOworCQlpZiAoX3NyYW1fcHJvY19yZWFkKGJ1ZiwgJmxlbiwgY291bnQsICJMMSBJbnN0cnVjdGlvbiIsCisJCQkmcGVyX2NwdShmcmVlX2wxX2luc3Rfc3JhbV9oZWFkLCBjcHUpLAorCQkJJnBlcl9jcHUodXNlZF9sMV9pbnN0X3NyYW1faGVhZCwgY3B1KSkpCisJCQlnb3RvIG5vdF9kb25lOwogI2VuZGlmCisJfQogI2lmIEwyX0xFTkdUSCAhPSAwCi0JaWYgKF9zcmFtX3Byb2NfcmVhZChidWYsICZsZW4sIGNvdW50LCAiTDIiLAotCQkJJmZyZWVfbDJfc3JhbV9oZWFkLCAmdXNlZF9sMl9zcmFtX2hlYWQpKQorCWlmIChfc3JhbV9wcm9jX3JlYWQoYnVmLCAmbGVuLCBjb3VudCwgIkwyIiwgJmZyZWVfbDJfc3JhbV9oZWFkLAorCQkmdXNlZF9sMl9zcmFtX2hlYWQpKQogCQlnb3RvIG5vdF9kb25lOwogI2VuZGlmCi0KIAkqZW9mID0gMTsKICBub3RfZG9uZToKIAlyZXR1cm4gbGVuOwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9vcHJvZmlsZS9NYWtlZmlsZSBiL2FyY2gvYmxhY2tmaW4vb3Byb2ZpbGUvTWFrZWZpbGUKaW5kZXggNjM0ZTMwMC4uYzcwYWYzYSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9vcHJvZmlsZS9NYWtlZmlsZQorKysgYi9hcmNoL2JsYWNrZmluL29wcm9maWxlL01ha2VmaWxlCkBAIC0xMCw1ICsxMCw0IEBACiAJCW9wcm9maWxlZnMubyBvcHJvZmlsZV9zdGF0cy5vIFwKIAkJdGltZXJfaW50Lm8gKQogCi1vcHJvZmlsZS15IDo9ICQoRFJJVkVSX09CSlMpIGNvbW1vbi5vCi1vcHJvZmlsZS0kKENPTkZJR19IQVJEV0FSRV9QTSkgKz0gb3BfbW9kZWxfYmY1MzMubworb3Byb2ZpbGUteSA6PSAkKERSSVZFUl9PQkpTKSBiZmluX29wcm9maWxlLm8KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vb3Byb2ZpbGUvYmZpbl9vcHJvZmlsZS5jIGIvYXJjaC9ibGFja2Zpbi9vcHJvZmlsZS9iZmluX29wcm9maWxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzNiOTcxMwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYmxhY2tmaW4vb3Byb2ZpbGUvYmZpbl9vcHJvZmlsZS5jCkBAIC0wLDAgKzEsMTggQEAKKy8qCisgKiBiZmluX29wcm9maWxlLmMgLSBCbGFja2ZpbiBvcHJvZmlsZSBjb2RlCisgKgorICogQ29weXJpZ2h0IDIwMDQtMjAwOCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L29wcm9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCitpbnQgX19pbml0IG9wcm9maWxlX2FyY2hfaW5pdChzdHJ1Y3Qgb3Byb2ZpbGVfb3BlcmF0aW9ucyAqb3BzKQoreworCXJldHVybiAtMTsKK30KKwordm9pZCBvcHJvZmlsZV9hcmNoX2V4aXQodm9pZCkKK3sKK30KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vb3Byb2ZpbGUvY29tbW9uLmMgYi9hcmNoL2JsYWNrZmluL29wcm9maWxlL2NvbW1vbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjZkMzAzLi4wMDAwMDAwCi0tLSBhL2FyY2gvYmxhY2tmaW4vb3Byb2ZpbGUvY29tbW9uLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjggKzAsMCBAQAotLyoKLSAqIEZpbGU6ICAgICAgICAgYXJjaC9ibGFja2Zpbi9vcHJvZmlsZS9jb21tb24uYwotICogQmFzZWQgb246ICAgICBhcmNoL2FscGhhL29wcm9maWxlL2NvbW1vbi5jCi0gKiBBdXRob3I6ICAgICAgIEFudG9uIEJsYW5jaGFyZCA8YW50b25AYXUuaWJtLmNvbT4KLSAqCi0gKiBDcmVhdGVkOgotICogRGVzY3JpcHRpb246Ci0gKgotICogTW9kaWZpZWQ6Ci0gKiAgICAgICAgICAgICAgIENvcHlyaWdodCAoQykgMjAwNCBBbnRvbiBCbGFuY2hhcmQgPGFudG9uQGF1LmlibS5jb20+LCBJQk0KLSAqICAgICAgICAgICAgICAgQ29weXJpZ2h0IDIwMDQtMjAwNiBBbmFsb2cgRGV2aWNlcyBJbmMuCi0gKgotICogQnVnczogICAgICAgICBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSB0aGUgZmlsZSBDT1BZSU5HLCBvciB3cml0ZQotICogdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L29wcm9maWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgotI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Ci0jaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KLSNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9pcnEuaD4KLSNpbmNsdWRlIDxsaW51eC9pby5oPgotCi0jaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgotI2luY2x1ZGUgPGFzbS9ibGFja2Zpbi5oPgotCi0jaW5jbHVkZSAib3BfYmxhY2tmaW4uaCIKLQotI2RlZmluZSBCRklOXzUzM19JRCAgMHhFNTA0MDAwMwotI2RlZmluZSBCRklOXzUzN19JRCAgMHhFNTA0MDAwMgotCi1zdGF0aWMgaW50IHBmbW9uX2VuYWJsZWQ7Ci1zdGF0aWMgc3RydWN0IG11dGV4IHBmbW9uX2xvY2s7Ci0KLXN0cnVjdCBvcF9iZmluNTMzX21vZGVsICptb2RlbDsKLQotc3RydWN0IG9wX2NvdW50ZXJfY29uZmlnIGN0cltPUF9NQVhfQ09VTlRFUl07Ci0KLXN0YXRpYyBpbnQgb3BfYmZpbl9zZXR1cCh2b2lkKQotewotCWludCByZXQ7Ci0KLQkvKiBQcmUtY29tcHV0ZSB0aGUgdmFsdWVzIHRvIHN0dWZmIGluIHRoZSBoYXJkd2FyZSByZWdpc3RlcnMuICAqLwotCXNwaW5fbG9jaygmb3Byb2ZpbGVmc19sb2NrKTsKLQlyZXQgPSBtb2RlbC0+cmVnX3NldHVwKGN0cik7Ci0Jc3Bpbl91bmxvY2soJm9wcm9maWxlZnNfbG9jayk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZCBvcF9iZmluX3NodXRkb3duKHZvaWQpCi17Ci0jaWYgMAotCS8qIHdoYXQgaXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBzaHV0ZG93biBhbmQgc3RvcD8gKi8KLSNlbmRpZgotfQotCi1zdGF0aWMgaW50IG9wX2JmaW5fc3RhcnQodm9pZCkKLXsKLQlpbnQgcmV0ID0gLUVCVVNZOwotCi0JcHJpbnRrKEtFUk5fSU5GTyAiS1NEQkc6aW4gJXNcbiIsIF9fZnVuY19fKTsKLQltdXRleF9sb2NrKCZwZm1vbl9sb2NrKTsKLQlpZiAoIXBmbW9uX2VuYWJsZWQpIHsKLQkJcmV0ID0gbW9kZWwtPnN0YXJ0KGN0cik7Ci0JCXBmbW9uX2VuYWJsZWQgPSAhcmV0OwotCX0KLQltdXRleF91bmxvY2soJnBmbW9uX2xvY2spOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQgb3BfYmZpbl9zdG9wKHZvaWQpCi17Ci0JbXV0ZXhfbG9jaygmcGZtb25fbG9jayk7Ci0JaWYgKHBmbW9uX2VuYWJsZWQpIHsKLQkJbW9kZWwtPnN0b3AoKTsKLQkJcGZtb25fZW5hYmxlZCA9IDA7Ci0JfQotCW11dGV4X3VubG9jaygmcGZtb25fbG9jayk7Ci19Ci0KLXN0YXRpYyBpbnQgb3BfYmZpbl9jcmVhdGVfZmlsZXMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGRlbnRyeSAqcm9vdCkKLXsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBtb2RlbC0+bnVtX2NvdW50ZXJzOyArK2kpIHsKLQkJc3RydWN0IGRlbnRyeSAqZGlyOwotCQljaGFyIGJ1ZlszXTsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiT3Byb2ZpbGU6IGNyZWF0aW5nIGZpbGVzLi4uIFxuIik7Ci0KLQkJc25wcmludGYoYnVmLCBzaXplb2YgYnVmLCAiJWQiLCBpKTsKLQkJZGlyID0gb3Byb2ZpbGVmc19ta2RpcihzYiwgcm9vdCwgYnVmKTsKLQotCQlvcHJvZmlsZWZzX2NyZWF0ZV91bG9uZyhzYiwgZGlyLCAiZW5hYmxlZCIsICZjdHJbaV0uZW5hYmxlZCk7Ci0JCW9wcm9maWxlZnNfY3JlYXRlX3Vsb25nKHNiLCBkaXIsICJldmVudCIsICZjdHJbaV0uZXZlbnQpOwotCQlvcHJvZmlsZWZzX2NyZWF0ZV91bG9uZyhzYiwgZGlyLCAiY291bnQiLCAmY3RyW2ldLmNvdW50KTsKLQkJLyoKLQkJICogV2UgZG9udCBzdXBwb3J0IHBlciBjb3VudGVyIHVzZXIva2VybmVsIHNlbGVjdGlvbiwgYnV0Ci0JCSAqIHdlIGxlYXZlIHRoZSBlbnRyaWVzIGJlY2F1c2UgdXNlcnNwYWNlIGV4cGVjdHMgdGhlbQotCQkgKi8KLQkJb3Byb2ZpbGVmc19jcmVhdGVfdWxvbmcoc2IsIGRpciwgImtlcm5lbCIsICZjdHJbaV0ua2VybmVsKTsKLQkJb3Byb2ZpbGVmc19jcmVhdGVfdWxvbmcoc2IsIGRpciwgInVzZXIiLCAmY3RyW2ldLnVzZXIpOwotCQlvcHJvZmlsZWZzX2NyZWF0ZV91bG9uZyhzYiwgZGlyLCAidW5pdF9tYXNrIiwKLQkJCQkJJmN0cltpXS51bml0X21hc2spOwotCX0KLQotCXJldHVybiAwOwotfQotaW50IF9faW5pdCBvcHJvZmlsZV9hcmNoX2luaXQoc3RydWN0IG9wcm9maWxlX29wZXJhdGlvbnMgKm9wcykKLXsKLSNpZmRlZiBDT05GSUdfSEFSRFdBUkVfUE0KLQl1bnNpZ25lZCBpbnQgZHNwaWQ7Ci0KLQltdXRleF9pbml0KCZwZm1vbl9sb2NrKTsKLQotCWRzcGlkID0gYmZpbl9yZWFkX0RTUElEKCk7Ci0KLQlwcmludGsoS0VSTl9JTkZPICJPcHJvZmlsZSBnb3QgdGhlIGNwdSBpZCBpcyAweCV4LiBcbiIsIGRzcGlkKTsKLQotCXN3aXRjaCAoZHNwaWQpIHsKLQljYXNlIEJGSU5fNTMzX0lEOgotCQltb2RlbCA9ICZvcF9tb2RlbF9iZmluNTMzOwotCQltb2RlbC0+bnVtX2NvdW50ZXJzID0gMjsKLQkJYnJlYWs7Ci0JY2FzZSBCRklOXzUzN19JRDoKLQkJbW9kZWwgPSAmb3BfbW9kZWxfYmZpbjUzMzsKLQkJbW9kZWwtPm51bV9jb3VudGVycyA9IDI7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQotCW9wcy0+Y3B1X3R5cGUgPSBtb2RlbC0+bmFtZTsKLQlvcHMtPmNyZWF0ZV9maWxlcyA9IG9wX2JmaW5fY3JlYXRlX2ZpbGVzOwotCW9wcy0+c2V0dXAgPSBvcF9iZmluX3NldHVwOwotCW9wcy0+c2h1dGRvd24gPSBvcF9iZmluX3NodXRkb3duOwotCW9wcy0+c3RhcnQgPSBvcF9iZmluX3N0YXJ0OwotCW9wcy0+c3RvcCA9IG9wX2JmaW5fc3RvcDsKLQotCXByaW50ayhLRVJOX0lORk8gIm9wcm9maWxlOiB1c2luZyAlcyBwZXJmb3JtYW5jZSBtb25pdG9yaW5nLlxuIiwKLQkgICAgICAgb3BzLT5jcHVfdHlwZSk7Ci0KLQlyZXR1cm4gMDsKLSNlbHNlCi0JcmV0dXJuIC0xOwotI2VuZGlmCi19Ci0KLXZvaWQgb3Byb2ZpbGVfYXJjaF9leGl0KHZvaWQpCi17Ci19CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL29wcm9maWxlL29wX2JsYWNrZmluLmggYi9hcmNoL2JsYWNrZmluL29wcm9maWxlL29wX2JsYWNrZmluLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1ZGQwOGMuLjAwMDAwMDAKLS0tIGEvYXJjaC9ibGFja2Zpbi9vcHJvZmlsZS9vcF9ibGFja2Zpbi5oCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoKLSAqIEZpbGU6ICAgICAgICAgYXJjaC9ibGFja2Zpbi9vcHJvZmlsZS9vcF9ibGFja2Zpbi5oCi0gKiBCYXNlZCBvbjoKLSAqIEF1dGhvcjogICAgICAgQW50b24gQmxhbmNoYXJkIDxhbnRvbkBhdS5pYm0uY29tPgotICoKLSAqIENyZWF0ZWQ6Ci0gKiBEZXNjcmlwdGlvbjoKLSAqCi0gKiBNb2RpZmllZDoKLSAqICAgICAgICAgICAgICAgQ29weXJpZ2h0IChDKSAyMDA0IEFudG9uIEJsYW5jaGFyZCA8YW50b25AYXUuaWJtLmNvbT4sIElCTQotICogICAgICAgICAgICAgICBDb3B5cmlnaHQgMjAwNC0yMDA2IEFuYWxvZyBEZXZpY2VzIEluYy4KLSAqCi0gKiBCdWdzOiAgICAgICAgIEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLwotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIHRoZSBmaWxlIENPUFlJTkcsIG9yIHdyaXRlCi0gKiB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLSAqLwotCi0jaWZuZGVmIE9QX0JMQUNLRklOX0gKLSNkZWZpbmUgT1BfQkxBQ0tGSU5fSCAxCi0KLSNkZWZpbmUgT1BfTUFYX0NPVU5URVIgMgotCi0jaW5jbHVkZSA8YXNtL2JsYWNrZmluLmg+Ci0KLS8qIFBlci1jb3VudGVyIGNvbmZpZ3VyYXRpb24gYXMgc2V0IHZpYSBvcHJvZmlsZWZzLiAgKi8KLXN0cnVjdCBvcF9jb3VudGVyX2NvbmZpZyB7Ci0JdW5zaWduZWQgbG9uZyB2YWxpZDsKLQl1bnNpZ25lZCBsb25nIGVuYWJsZWQ7Ci0JdW5zaWduZWQgbG9uZyBldmVudDsKLQl1bnNpZ25lZCBsb25nIGNvdW50OwotCXVuc2lnbmVkIGxvbmcga2VybmVsOwotCXVuc2lnbmVkIGxvbmcgdXNlcjsKLQl1bnNpZ25lZCBsb25nIHVuaXRfbWFzazsKLX07Ci0KLS8qIFN5c3RlbS13aWRlIGNvbmZpZ3VyYXRpb24gYXMgc2V0IHZpYSBvcHJvZmlsZWZzLiAgKi8KLXN0cnVjdCBvcF9zeXN0ZW1fY29uZmlnIHsKLQl1bnNpZ25lZCBsb25nIGVuYWJsZV9rZXJuZWw7Ci0JdW5zaWduZWQgbG9uZyBlbmFibGVfdXNlcjsKLX07Ci0KLS8qIFBlci1hcmNoIGNvbmZpZ3VyYXRpb24gKi8KLXN0cnVjdCBvcF9iZmluNTMzX21vZGVsIHsKLQlpbnQgKCpyZWdfc2V0dXApIChzdHJ1Y3Qgb3BfY291bnRlcl9jb25maWcgKik7Ci0JaW50ICgqc3RhcnQpIChzdHJ1Y3Qgb3BfY291bnRlcl9jb25maWcgKik7Ci0Jdm9pZCAoKnN0b3ApICh2b2lkKTsKLQlpbnQgbnVtX2NvdW50ZXJzOwotCWNoYXIgKm5hbWU7Ci19OwotCi1leHRlcm4gc3RydWN0IG9wX2JmaW41MzNfbW9kZWwgb3BfbW9kZWxfYmZpbjUzMzsKLQotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgY3RyX3JlYWQodm9pZCkKLXsKLQl1bnNpZ25lZCBpbnQgdG1wOwotCi0JdG1wID0gYmZpbl9yZWFkX1BGQ1RMKCk7Ci0JQ1NZTkMoKTsKLQotCXJldHVybiB0bXA7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBjdHJfd3JpdGUodW5zaWduZWQgaW50IHZhbCkKLXsKLQliZmluX3dyaXRlX1BGQ1RMKHZhbCk7Ci0JQ1NZTkMoKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGNvdW50X3JlYWQodW5zaWduZWQgaW50ICpjb3VudCkKLXsKLQljb3VudFswXSA9IGJmaW5fcmVhZF9QRkNOVFIwKCk7Ci0JY291bnRbMV0gPSBiZmluX3JlYWRfUEZDTlRSMSgpOwotCUNTWU5DKCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBjb3VudF93cml0ZSh1bnNpZ25lZCBpbnQgKmNvdW50KQotewotCWJmaW5fd3JpdGVfUEZDTlRSMChjb3VudFswXSk7Ci0JYmZpbl93cml0ZV9QRkNOVFIxKGNvdW50WzFdKTsKLQlDU1lOQygpOwotfQotCi1leHRlcm4gaW50IHBtX292ZXJmbG93X2hhbmRsZXIoaW50IGlycSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vb3Byb2ZpbGUvb3BfbW9kZWxfYmY1MzMuYyBiL2FyY2gvYmxhY2tmaW4vb3Byb2ZpbGUvb3BfbW9kZWxfYmY1MzMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDFjNjk4Yi4uMDAwMDAwMAotLS0gYS9hcmNoL2JsYWNrZmluL29wcm9maWxlL29wX21vZGVsX2JmNTMzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjEgKzAsMCBAQAotLyoKLSAqIEZpbGU6ICAgICAgICAgYXJjaC9ibGFja2Zpbi9vcHJvZmlsZS9vcF9tb2RlbF9iZjUzMy5jCi0gKiBCYXNlZCBvbjoKLSAqIEF1dGhvcjogICAgICAgQW50b24gQmxhbmNoYXJkIDxhbnRvbkBhdS5pYm0uY29tPgotICoKLSAqIENyZWF0ZWQ6Ci0gKiBEZXNjcmlwdGlvbjoKLSAqCi0gKiBNb2RpZmllZDoKLSAqICAgICAgICAgICAgICAgQ29weXJpZ2h0IChDKSAyMDA0IEFudG9uIEJsYW5jaGFyZCA8YW50b25AYXUuaWJtLmNvbT4sIElCTQotICogICAgICAgICAgICAgICBDb3B5cmlnaHQgMjAwNC0yMDA2IEFuYWxvZyBEZXZpY2VzIEluYy4KLSAqCi0gKiBCdWdzOiAgICAgICAgIEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLwotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIHRoZSBmaWxlIENPUFlJTkcsIG9yIHdyaXRlCi0gKiB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvb3Byb2ZpbGUuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc21wLmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvaXJxLmg+Ci0jaW5jbHVkZSA8bGludXgvaW8uaD4KLSNpbmNsdWRlIDxhc20vc3lzdGVtLmg+Ci0jaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgotI2luY2x1ZGUgPGFzbS9ibGFja2Zpbi5oPgotCi0jaW5jbHVkZSAib3BfYmxhY2tmaW4uaCIKLQotI2RlZmluZSBQTV9FTkFCTEUgMHgwMTsKLSNkZWZpbmUgUE1fQ1RMMV9FTkFCTEUgIDB4MTgKLSNkZWZpbmUgUE1fQ1RMMF9FTkFCTEUgIDB4QzAwMAotI2RlZmluZSBDT1VOVF9FREdFX09OTFkgMHgzMDAwMDAwCi0KLXN0YXRpYyBpbnQgb3Byb2ZpbGVfcnVubmluZzsKLQotc3RhdGljIHVuc2lnbmVkIGN1cnJfcGZjdGwsIGN1cnJfY291bnRbMl07Ci0KLXN0YXRpYyBpbnQgYmZpbjUzM19yZWdfc2V0dXAoc3RydWN0IG9wX2NvdW50ZXJfY29uZmlnICpjdHIpCi17Ci0JdW5zaWduZWQgaW50IHBmY3RsID0gY3RyX3JlYWQoKTsKLQl1bnNpZ25lZCBpbnQgY291bnRbMl07Ci0KLQkvKiBzZXQgQmxhY2tmaW4gcGVyZiBtb25pdG9yIHJlZ3Mgd2l0aCBjdHIgKi8KLQlpZiAoY3RyWzBdLmVuYWJsZWQpIHsKLQkJcGZjdGwgfD0gKFBNX0NUTDBfRU5BQkxFIHwgKChjaGFyKWN0clswXS5ldmVudCA8PCA1KSk7Ci0JCWNvdW50WzBdID0gMHhGRkZGRkZGRiAtIGN0clswXS5jb3VudDsKLQkJY3Vycl9jb3VudFswXSA9IGNvdW50WzBdOwotCX0KLQlpZiAoY3RyWzFdLmVuYWJsZWQpIHsKLQkJcGZjdGwgfD0gKFBNX0NUTDFfRU5BQkxFIHwgKChjaGFyKWN0clsxXS5ldmVudCA8PCAxNikpOwotCQljb3VudFsxXSA9IDB4RkZGRkZGRkYgLSBjdHJbMV0uY291bnQ7Ci0JCWN1cnJfY291bnRbMV0gPSBjb3VudFsxXTsKLQl9Ci0KLQlwcl9kZWJ1ZygiY3RyWzBdLmVuYWJsZWQ9JWQsY3RyWzFdLmVuYWJsZWQ9JWQsY3RyWzBdLmV2ZW50PDw1PTB4JXgsY3RyWzFdLmV2ZW50PDwxNj0weCV4XG4iLCBjdHJbMF0uZW5hYmxlZCwgY3RyWzFdLmVuYWJsZWQsIGN0clswXS5ldmVudCA8PCA1LCBjdHJbMV0uZXZlbnQgPDwgMTYpOwotCXBmY3RsIHw9IENPVU5UX0VER0VfT05MWTsKLQljdXJyX3BmY3RsID0gcGZjdGw7Ci0KLQlwcl9kZWJ1Zygid3JpdGUgMHgleCB0byBwZmN0bFxuIiwgcGZjdGwpOwotCWN0cl93cml0ZShwZmN0bCk7Ci0JY291bnRfd3JpdGUoY291bnQpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgYmZpbjUzM19zdGFydChzdHJ1Y3Qgb3BfY291bnRlcl9jb25maWcgKmN0cikKLXsKLQl1bnNpZ25lZCBpbnQgcGZjdGwgPSBjdHJfcmVhZCgpOwotCi0JcGZjdGwgfD0gUE1fRU5BQkxFOwotCWN1cnJfcGZjdGwgPSBwZmN0bDsKLQotCWN0cl93cml0ZShwZmN0bCk7Ci0KLQlvcHJvZmlsZV9ydW5uaW5nID0gMTsKLQlwcl9kZWJ1Zygic3RhcnQgb3Byb2ZpbGUgY291bnRlciBcbiIpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGJmaW41MzNfc3RvcCh2b2lkKQotewotCWludCBwZmN0bDsKLQotCXBmY3RsID0gY3RyX3JlYWQoKTsKLQlwZmN0bCAmPSB+UE1fRU5BQkxFOwotCS8qIGZyZWV6ZSBjb3VudGVycyAqLwotCWN0cl93cml0ZShwZmN0bCk7Ci0KLQlvcHJvZmlsZV9ydW5uaW5nID0gMDsKLQlwcl9kZWJ1Zygic3RvcCBvcHJvZmlsZSBjb3VudGVyIFxuIik7Ci19Ci0KLXN0YXRpYyBpbnQgZ2V0X2tlcm5lbCh2b2lkKQotewotCWludCBpcGVuZCwgaXNfa2VybmVsOwotCi0JaXBlbmQgPSBiZmluX3JlYWRfSVBFTkQoKTsKLQotCS8qIHRlc3QgYml0IDE1ICovCi0JaXNfa2VybmVsID0gKChpcGVuZCAmIDB4ODAwMCkgIT0gMCk7Ci0KLQlyZXR1cm4gaXNfa2VybmVsOwotfQotCi1pbnQgcG1fb3ZlcmZsb3dfaGFuZGxlcihpbnQgaXJxLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKLXsKLQlpbnQgaXNfa2VybmVsOwotCWludCBpLCBjcHU7Ci0JdW5zaWduZWQgaW50IHBjLCBwZmN0bDsKLQl1bnNpZ25lZCBpbnQgY291bnRbMl07Ci0KLQlwcl9kZWJ1ZygiZ2V0IGludGVycnVwdCBpbiAlc1xuIiwgX19mdW5jX18pOwotCWlmIChvcHJvZmlsZV9ydW5uaW5nID09IDApIHsKLQkJcHJfZGVidWcoImVycm9yOiBlbnRlcmluZyBpbnRlcnJ1cHQgd2hlbiBvcHJvZmlsZSBpcyBzdG9wcGVkLlxuXHIiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCWlzX2tlcm5lbCA9IGdldF9rZXJuZWwoKTsKLQljcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7Ci0JcGMgPSByZWdzLT5wYzsKLQlwZmN0bCA9IGN0cl9yZWFkKCk7Ci0KLQkvKiByZWFkIHRoZSB0d28gZXZlbnQgY291bnRlciByZWdzICovCi0JY291bnRfcmVhZChjb3VudCk7Ci0KLQkvKiBpZiB0aGUgY291bnRlciBvdmVyZmxvd3MsIGFkZCBzYW1wbGUgdG8gb3Byb2ZpbGUgYnVmZmVyICovCi0JZm9yIChpID0gMDsgaSA8IDI7ICsraSkgewotCQlpZiAob3Byb2ZpbGVfcnVubmluZykgewotCQkJb3Byb2ZpbGVfYWRkX3NhbXBsZShyZWdzLCBpKTsKLQkJfQotCX0KLQotCS8qIHJlc2V0IHRoZSBwZXJmbW9uIGNvdW50ZXIgKi8KLQljdHJfd3JpdGUoY3Vycl9wZmN0bCk7Ci0JY291bnRfd3JpdGUoY3Vycl9jb3VudCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0cnVjdCBvcF9iZmluNTMzX21vZGVsIG9wX21vZGVsX2JmaW41MzMgPSB7Ci0JLnJlZ19zZXR1cCA9IGJmaW41MzNfcmVnX3NldHVwLAotCS5zdGFydCA9IGJmaW41MzNfc3RhcnQsCi0JLnN0b3AgPSBiZmluNTMzX3N0b3AsCi0JLm51bV9jb3VudGVycyA9IDIsCi0JLm5hbWUgPSAiYmxhY2tmaW4vYmY1MzMiCi19OwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9vcHJvZmlsZS90aW1lcl9pbnQuYyBiL2FyY2gvYmxhY2tmaW4vb3Byb2ZpbGUvdGltZXJfaW50LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjNmY4NjAuLjAwMDAwMDAKLS0tIGEvYXJjaC9ibGFja2Zpbi9vcHJvZmlsZS90aW1lcl9pbnQuYworKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qCi0gKiBGaWxlOiAgICAgICAgIGFyY2gvYmxhY2tmaW4vb3Byb2ZpbGUvdGltZXJfaW50LmMKLSAqIEJhc2VkIG9uOgotICogQXV0aG9yOiAgICAgICBNaWNoYWVsIEthbmcKLSAqCi0gKiBDcmVhdGVkOgotICogRGVzY3JpcHRpb246Ci0gKgotICogTW9kaWZpZWQ6Ci0gKiAgICAgICAgICAgICAgIENvcHlyaWdodCAyMDA0LTIwMDYgQW5hbG9nIERldmljZXMgSW5jLgotICoKLSAqIEJ1Z3M6ICAgICAgICAgRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgdGhlIGZpbGUgQ09QWUlORywgb3Igd3JpdGUKLSAqIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotICovCi0KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc21wLmg+Ci0jaW5jbHVkZSA8bGludXgvaXJxLmg+Ci0jaW5jbHVkZSA8bGludXgvb3Byb2ZpbGUuaD4KLSNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KLQotc3RhdGljIHZvaWQgZW5hYmxlX3N5c190aW1lcjAoKQotewotfQotc3RhdGljIHZvaWQgZGlzYWJsZV9zeXNfdGltZXIwKCkKLXsKLX0KLQotc3RhdGljIGlycXJldHVybl90IHN5c190aW1lcjBfaW50X2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGV2X2lkLAotCQkJCQkgIHN0cnVjdCBwdF9yZWdzICpyZWdzKQotewotCW9wcm9maWxlX2FkZF9zYW1wbGUocmVncywgMCk7Ci0JcmV0dXJuIElSUV9IQU5ETEVEOwotfQotCi1zdGF0aWMgaW50IHN5c190aW1lcjBfc3RhcnQodm9pZCkKLXsKLQllbmFibGVfc3lzX3RpbWVyMCgpOwotCXJldHVybiByZXF1ZXN0X2lycShJVkcxMSwgc3lzX3RpbWVyMF9pbnRfaGFuZGxlciwgMCwgInN5c190aW1lcjAiLCBOVUxMKTsKLX0KLQotc3RhdGljIHZvaWQgc3lzX3RpbWVyMF9zdG9wKHZvaWQpCi17Ci0JZGlzYWJsZV9zeXNfdGltZXIoKTsKLX0KLQotaW50IF9faW5pdCBzeXNfdGltZXIwX2luaXQoc3RydWN0IG9wcm9maWxlX29wZXJhdGlvbnMgKm9wcykKLXsKLQlleHRlcm4gaW50IG5taV9hY3RpdmU7Ci0KLQlpZiAobm1pX2FjdGl2ZSA8PSAwKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCW9wcy0+c3RhcnQgPSB0aW1lcl9zdGFydDsKLQlvcHMtPnN0b3AgPSB0aW1lcl9zdG9wOwotCW9wcy0+Y3B1X3R5cGUgPSAidGltZXIiOwotCXByaW50ayhLRVJOX0lORk8gIm9wcm9maWxlOiB1c2luZyBOTUkgdGltZXIgaW50ZXJydXB0LlxuIik7Ci0JcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9hcmNoL2NyaXMvS2NvbmZpZyBiL2FyY2gvY3Jpcy9LY29uZmlnCmluZGV4IGIxN2FlZWEuLjM0NjIyNDUgMTAwNjQ0Ci0tLSBhL2FyY2gvY3Jpcy9LY29uZmlnCisrKyBiL2FyY2gvY3Jpcy9LY29uZmlnCkBAIC02ODEsNiArNjgxLDggQEAKIAogc291cmNlICJkcml2ZXJzL3V3Yi9LY29uZmlnIgogCitzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9LY29uZmlnIgorCiBzb3VyY2UgImFyY2gvY3Jpcy9LY29uZmlnLmRlYnVnIgogCiBzb3VyY2UgInNlY3VyaXR5L0tjb25maWciCmRpZmYgLS1naXQgYS9hcmNoL2NyaXMvYXJjaC12MzIvZHJpdmVycy9pb3BfZndfbG9hZC5jIGIvYXJjaC9jcmlzL2FyY2gtdjMyL2RyaXZlcnMvaW9wX2Z3X2xvYWQuYwppbmRleCAzYjM4NTdlLi4yZjhlYTBmIDEwMDY0NAotLS0gYS9hcmNoL2NyaXMvYXJjaC12MzIvZHJpdmVycy9pb3BfZndfbG9hZC5jCisrKyBiL2FyY2gvY3Jpcy9hcmNoLXYzMi9kcml2ZXJzL2lvcF9md19sb2FkLmMKQEAgLTI0LDEyICsyNCwxMiBAQAogI2Vycm9yICJQbGVhc2UgY29udGFjdCA8Z3JlZ0Brcm9haC5jb20+IGZvciBkZXRhaWxzIG9uIGhvdyB0byBmaXggaXQgcHJvcGVybHkuIgogCiBzdGF0aWMgc3RydWN0IGRldmljZSBpb3Bfc3B1X2RldmljZVsyXSA9IHsKLQl7IC5idXNfaWQgPSAgICAgImlvcC1zcHUwIiwgfSwKLQl7IC5idXNfaWQgPSAgICAgImlvcC1zcHUxIiwgfSwKKwl7IC5pbml0X25hbWUgPSAgICAgImlvcC1zcHUwIiwgfSwKKwl7IC5pbml0X25hbWUgPSAgICAgImlvcC1zcHUxIiwgfSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgZGV2aWNlIGlvcF9tcHVfZGV2aWNlID0gewotCS5idXNfaWQgPSAgICAgICAiaW9wLW1wdSIsCisJLmluaXRfbmFtZSA9ICAgICAgICJpb3AtbXB1IiwKIH07CiAKIHN0YXRpYyBpbnQgd2FpdF9tcHVfaWRsZSh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC9jcmlzL2FyY2gtdjMyL2tlcm5lbC9zaWduYWwuYyBiL2FyY2gvY3Jpcy9hcmNoLXYzMi9rZXJuZWwvc2lnbmFsLmMKaW5kZXggZGE3ZDJiZS4uMzcyZDBjYSAxMDA2NDQKLS0tIGEvYXJjaC9jcmlzL2FyY2gtdjMyL2tlcm5lbC9zaWduYWwuYworKysgYi9hcmNoL2NyaXMvYXJjaC12MzIva2VybmVsL3NpZ25hbC5jCkBAIC00NTYsNyArNDU2LDcgQEAKIAlyZXR1cm4gLUVGQVVMVDsKIH0KIAotLyogSW52b2tlIGEgc2luZ2FsIGhhbmRsZXIgdG8sIHdlbGwsIGhhbmRsZSB0aGUgc2lnbmFsLiAqLworLyogSW52b2tlIGEgc2lnbmFsIGhhbmRsZXIgdG8sIHdlbGwsIGhhbmRsZSB0aGUgc2lnbmFsLiAqLwogc3RhdGljIGlubGluZSBpbnQKIGhhbmRsZV9zaWduYWwoaW50IGNhbnJlc3RhcnQsIHVuc2lnbmVkIGxvbmcgc2lnLAogCSAgICAgIHNpZ2luZm9fdCAqaW5mbywgc3RydWN0IGtfc2lnYWN0aW9uICprYSwKZGlmZiAtLWdpdCBhL2FyY2gvY3Jpcy9pbmNsdWRlL2FzbS9hdG9taWMuaCBiL2FyY2gvY3Jpcy9pbmNsdWRlL2FzbS9hdG9taWMuaAppbmRleCBmNzFlYTY4Li41NzE4ZGQ4IDEwMDY0NAotLS0gYS9hcmNoL2NyaXMvaW5jbHVkZS9hc20vYXRvbWljLmgKKysrIGIvYXJjaC9jcmlzL2luY2x1ZGUvYXNtL2F0b21pYy5oCkBAIC00LDcgKzQsNyBAQAogI2RlZmluZSBfX0FTTV9DUklTX0FUT01JQ19fCiAKICNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgotCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjaW5jbHVkZSA8YXJjaC9hdG9taWMuaD4KIApAQCAtMTMsOCArMTMsNiBAQAogICogcmVzb3VyY2UgY291bnRpbmcgZXRjLi4KICAqLwogCi10eXBlZGVmIHN0cnVjdCB7IHZvbGF0aWxlIGludCBjb3VudGVyOyB9IGF0b21pY190OwotCiAjZGVmaW5lIEFUT01JQ19JTklUKGkpICB7IChpKSB9CiAKICNkZWZpbmUgYXRvbWljX3JlYWQodikgKCh2KS0+Y291bnRlcikKZGlmZiAtLWdpdCBhL2FyY2gvaDgzMDAvS2NvbmZpZyBiL2FyY2gvaDgzMDAvS2NvbmZpZwppbmRleCAyOGYwNmZkLi45NDIwNjQ4IDEwMDY0NAotLS0gYS9hcmNoL2g4MzAwL0tjb25maWcKKysrIGIvYXJjaC9oODMwMC9LY29uZmlnCkBAIC0yMjAsNiArMjIwLDggQEAKIAogZW5kbWVudQogCitzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9LY29uZmlnIgorCiBzb3VyY2UgImZzL0tjb25maWciCiAKIHNvdXJjZSAiYXJjaC9oODMwMC9LY29uZmlnLmRlYnVnIgpkaWZmIC0tZ2l0IGEvYXJjaC9oODMwMC9pbmNsdWRlL2FzbS9LYnVpbGQgYi9hcmNoL2g4MzAwL2luY2x1ZGUvYXNtL0tidWlsZAppbmRleCBjNjhlMTY4Li4yN2IxMDhhIDEwMDY0NAotLS0gYS9hcmNoL2g4MzAwL2luY2x1ZGUvYXNtL0tidWlsZAorKysgYi9hcmNoL2g4MzAwL2luY2x1ZGUvYXNtL0tidWlsZApAQCAtMSArMSwyIEBACiBpbmNsdWRlIGluY2x1ZGUvYXNtLWdlbmVyaWMvS2J1aWxkLmFzbQordW5pZmRlZi15ICs9IHN3YWIuaApkaWZmIC0tZ2l0IGEvYXJjaC9oODMwMC9pbmNsdWRlL2FzbS9hdG9taWMuaCBiL2FyY2gvaDgzMDAvaW5jbHVkZS9hc20vYXRvbWljLmgKaW5kZXggYjRjZjBlYS4uODMzMTg2YyAxMDA2NDQKLS0tIGEvYXJjaC9oODMwMC9pbmNsdWRlL2FzbS9hdG9taWMuaAorKysgYi9hcmNoL2g4MzAwL2luY2x1ZGUvYXNtL2F0b21pYy5oCkBAIC0xLDEyICsxLDEzIEBACiAjaWZuZGVmIF9fQVJDSF9IODMwMF9BVE9NSUNfXwogI2RlZmluZSBfX0FSQ0hfSDgzMDBfQVRPTUlDX18KIAorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKIC8qCiAgKiBBdG9taWMgb3BlcmF0aW9ucyB0aGF0IEMgY2FuJ3QgZ3VhcmFudGVlIHVzLiAgVXNlZnVsIGZvcgogICogcmVzb3VyY2UgY291bnRpbmcgZXRjLi4KICAqLwogCi10eXBlZGVmIHN0cnVjdCB7IGludCBjb3VudGVyOyB9IGF0b21pY190OwogI2RlZmluZSBBVE9NSUNfSU5JVChpKQl7IChpKSB9CiAKICNkZWZpbmUgYXRvbWljX3JlYWQodikJCSgodiktPmNvdW50ZXIpCmRpZmYgLS1naXQgYS9hcmNoL2g4MzAwL2luY2x1ZGUvYXNtL2J5dGVvcmRlci5oIGIvYXJjaC9oODMwMC9pbmNsdWRlL2FzbS9ieXRlb3JkZXIuaAppbmRleCAzNmU1OTdkLi5jMzZiODBhIDEwMDY0NAotLS0gYS9hcmNoL2g4MzAwL2luY2x1ZGUvYXNtL2J5dGVvcmRlci5oCisrKyBiL2FyY2gvaDgzMDAvaW5jbHVkZS9hc20vYnl0ZW9yZGVyLmgKQEAgLTEsMTMgKzEsNyBAQAogI2lmbmRlZiBfSDgzMDBfQllURU9SREVSX0gKICNkZWZpbmUgX0g4MzAwX0JZVEVPUkRFUl9ICiAKLSNpbmNsdWRlIDxhc20vdHlwZXMuaD4KLQotI2lmIGRlZmluZWQoX19HTlVDX18pICYmICFkZWZpbmVkKF9fU1RSSUNUX0FOU0lfXykgfHwgZGVmaW5lZChfX0tFUk5FTF9fKQotIyAgZGVmaW5lIF9fQllURU9SREVSX0hBU19VNjRfXwotIyAgZGVmaW5lIF9fU1dBQl82NF9USFJVXzMyX18KLSNlbmRpZgotCisjaW5jbHVkZSA8YXNtL3N3YWIuaD4KICNpbmNsdWRlIDxsaW51eC9ieXRlb3JkZXIvYmlnX2VuZGlhbi5oPgogCiAjZW5kaWYgLyogX0g4MzAwX0JZVEVPUkRFUl9IICovCmRpZmYgLS1naXQgYS9hcmNoL2g4MzAwL2luY2x1ZGUvYXNtL3N3YWIuaCBiL2FyY2gvaDgzMDAvaW5jbHVkZS9hc20vc3dhYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxMDhmMzkKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2g4MzAwL2luY2x1ZGUvYXNtL3N3YWIuaApAQCAtMCwwICsxLDEwIEBACisjaWZuZGVmIF9IODMwMF9TV0FCX0gKKyNkZWZpbmUgX0g4MzAwX1NXQUJfSAorCisjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CisKKyNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAhZGVmaW5lZChfX1NUUklDVF9BTlNJX18pIHx8IGRlZmluZWQoX19LRVJORUxfXykKKyMgIGRlZmluZSBfX1NXQUJfNjRfVEhSVV8zMl9fCisjZW5kaWYKKworI2VuZGlmIC8qIF9IODMwMF9TV0FCX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9pbmNsdWRlL2FzbS9LYnVpbGQgYi9hcmNoL2lhNjQvaW5jbHVkZS9hc20vS2J1aWxkCmluZGV4IGNjYmU4YWUuLjNiMjViZDkgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9pbmNsdWRlL2FzbS9LYnVpbGQKKysrIGIvYXJjaC9pYTY0L2luY2x1ZGUvYXNtL0tidWlsZApAQCAtMTQsMyArMTQsNCBAQAogdW5pZmRlZi15ICs9IGludHJpbnNpY3MuaAogdW5pZmRlZi15ICs9IHBlcmZtb24uaAogdW5pZmRlZi15ICs9IHVzdGFjay5oCit1bmlmZGVmLXkgKz0gc3dhYi5oCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvaW5jbHVkZS9hc20vYXRvbWljLmggYi9hcmNoL2lhNjQvaW5jbHVkZS9hc20vYXRvbWljLmgKaW5kZXggNTBjMmI4My4uZDM3MjkyYiAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2luY2x1ZGUvYXNtL2F0b21pYy5oCisrKyBiL2FyY2gvaWE2NC9pbmNsdWRlL2FzbS9hdG9taWMuaApAQCAtMTcsMTIgKzE3LDYgQEAKICNpbmNsdWRlIDxhc20vaW50cmluc2ljcy5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KIAotLyoKLSAqIE9uIElBLTY0LCBjb3VudGVyIG11c3QgYWx3YXlzIGJlIHZvbGF0aWxlIHRvIGVuc3VyZSB0aGF0IHRoYXQgdGhlCi0gKiBtZW1vcnkgYWNjZXNzZXMgYXJlIG9yZGVyZWQuCi0gKi8KLXR5cGVkZWYgc3RydWN0IHsgdm9sYXRpbGUgX19zMzIgY291bnRlcjsgfSBhdG9taWNfdDsKLXR5cGVkZWYgc3RydWN0IHsgdm9sYXRpbGUgX19zNjQgY291bnRlcjsgfSBhdG9taWM2NF90OwogCiAjZGVmaW5lIEFUT01JQ19JTklUKGkpCQkoKGF0b21pY190KSB7IChpKSB9KQogI2RlZmluZSBBVE9NSUM2NF9JTklUKGkpCSgoYXRvbWljNjRfdCkgeyAoaSkgfSkKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9pbmNsdWRlL2FzbS9ieXRlb3JkZXIuaCBiL2FyY2gvaWE2NC9pbmNsdWRlL2FzbS9ieXRlb3JkZXIuaAppbmRleCA2OWJkNDFkLi4wZjg0YzVjIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvaW5jbHVkZS9hc20vYnl0ZW9yZGVyLmgKKysrIGIvYXJjaC9pYTY0L2luY2x1ZGUvYXNtL2J5dGVvcmRlci5oCkBAIC0xLDQyICsxLDcgQEAKICNpZm5kZWYgX0FTTV9JQTY0X0JZVEVPUkRFUl9ICiAjZGVmaW5lIF9BU01fSUE2NF9CWVRFT1JERVJfSAogCi0vKgotICogTW9kaWZpZWQgMTk5OCwgMTk5OQotICoJRGF2aWQgTW9zYmVyZ2VyLVRhbmcgPGRhdmlkbUBocGwuaHAuY29tPiwgSGV3bGV0dC1QYWNrYXJkIENvLgotICovCi0KLSNpbmNsdWRlIDxhc20vdHlwZXMuaD4KLSNpbmNsdWRlIDxhc20vaW50cmluc2ljcy5oPgotI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+Ci0KLXN0YXRpYyBfX2lubGluZV9fIF9fYXR0cmlidXRlX2NvbnN0X18gX191NjQKLV9faWE2NF9zd2FiNjQgKF9fdTY0IHgpCi17Ci0JX191NjQgcmVzdWx0OwotCi0JcmVzdWx0ID0gaWE2NF9tdXgxKHgsIGlhNjRfbXV4MV9yZXYpOwotCXJldHVybiByZXN1bHQ7Ci19Ci0KLXN0YXRpYyBfX2lubGluZV9fIF9fYXR0cmlidXRlX2NvbnN0X18gX191MzIKLV9faWE2NF9zd2FiMzIgKF9fdTMyIHgpCi17Ci0JcmV0dXJuIF9faWE2NF9zd2FiNjQoeCkgPj4gMzI7Ci19Ci0KLXN0YXRpYyBfX2lubGluZV9fIF9fYXR0cmlidXRlX2NvbnN0X18gX191MTYKLV9faWE2NF9zd2FiMTYoX191MTYgeCkKLXsKLQlyZXR1cm4gX19pYTY0X3N3YWI2NCh4KSA+PiA0ODsKLX0KLQotI2RlZmluZSBfX2FyY2hfX3N3YWI2NCh4KSBfX2lhNjRfc3dhYjY0KHgpCi0jZGVmaW5lIF9fYXJjaF9fc3dhYjMyKHgpIF9faWE2NF9zd2FiMzIoeCkKLSNkZWZpbmUgX19hcmNoX19zd2FiMTYoeCkgX19pYTY0X3N3YWIxNih4KQotCi0jZGVmaW5lIF9fQllURU9SREVSX0hBU19VNjRfXwotCisjaW5jbHVkZSA8YXNtL3N3YWIuaD4KICNpbmNsdWRlIDxsaW51eC9ieXRlb3JkZXIvbGl0dGxlX2VuZGlhbi5oPgogCiAjZW5kaWYgLyogX0FTTV9JQTY0X0JZVEVPUkRFUl9IICovCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvaW5jbHVkZS9hc20vc3dhYi5oIGIvYXJjaC9pYTY0L2luY2x1ZGUvYXNtL3N3YWIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YWE1OGI2Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pYTY0L2luY2x1ZGUvYXNtL3N3YWIuaApAQCAtMCwwICsxLDM0IEBACisjaWZuZGVmIF9BU01fSUE2NF9TV0FCX0gKKyNkZWZpbmUgX0FTTV9JQTY0X1NXQUJfSAorCisvKgorICogTW9kaWZpZWQgMTk5OCwgMTk5OQorICoJRGF2aWQgTW9zYmVyZ2VyLVRhbmcgPGRhdmlkbUBocGwuaHAuY29tPiwgSGV3bGV0dC1QYWNrYXJkIENvLgorICovCisKKyNpbmNsdWRlIDxhc20vdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vaW50cmluc2ljcy5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CisKK3N0YXRpYyBfX2lubGluZV9fIF9fYXR0cmlidXRlX2NvbnN0X18gX191NjQgX19hcmNoX3N3YWI2NChfX3U2NCB4KQoreworCV9fdTY0IHJlc3VsdDsKKworCXJlc3VsdCA9IGlhNjRfbXV4MSh4LCBpYTY0X211eDFfcmV2KTsKKwlyZXR1cm4gcmVzdWx0OworfQorI2RlZmluZSBfX2FyY2hfc3dhYjY0IF9fYXJjaF9zd2FiNjQKKworc3RhdGljIF9faW5saW5lX18gX19hdHRyaWJ1dGVfY29uc3RfXyBfX3UzMiBfX2FyY2hfc3dhYjMyKF9fdTMyIHgpCit7CisJcmV0dXJuIF9fYXJjaF9zd2FiNjQoeCkgPj4gMzI7Cit9CisjZGVmaW5lIF9fYXJjaF9zd2FiMzIgX19hcmNoX3N3YWIzMgorCitzdGF0aWMgX19pbmxpbmVfXyBfX2F0dHJpYnV0ZV9jb25zdF9fIF9fdTE2IF9fYXJjaF9zd2FiMTYoX191MTYgeCkKK3sKKwlyZXR1cm4gX19hcmNoX3N3YWI2NCh4KSA+PiA0ODsKK30KKyNkZWZpbmUgX19hcmNoX3N3YWIxNiBfX2FyY2hfc3dhYjE2CisKKyNlbmRpZiAvKiBfQVNNX0lBNjRfU1dBQl9IICovCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvaW5jbHVkZS9hc20vc3dpb3RsYi5oIGIvYXJjaC9pYTY0L2luY2x1ZGUvYXNtL3N3aW90bGIuaAppbmRleCBmYjc5NDIzLi5kY2JhZWE3IDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvaW5jbHVkZS9hc20vc3dpb3RsYi5oCisrKyBiL2FyY2gvaWE2NC9pbmNsdWRlL2FzbS9zd2lvdGxiLmgKQEAgLTIsNDQgKzIsNyBAQAogI2RlZmluZSBBU01fSUE2NF9fU1dJT1RMQl9ICiAKICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgotCi0vKiBTV0lPVExCIGludGVyZmFjZSAqLwotCi1leHRlcm4gZG1hX2FkZHJfdCBzd2lvdGxiX21hcF9zaW5nbGUoc3RydWN0IGRldmljZSAqaHdkZXYsIHZvaWQgKnB0ciwKLQkJCQkgICAgIHNpemVfdCBzaXplLCBpbnQgZGlyKTsKLWV4dGVybiB2b2lkICpzd2lvdGxiX2FsbG9jX2NvaGVyZW50KHN0cnVjdCBkZXZpY2UgKmh3ZGV2LCBzaXplX3Qgc2l6ZSwKLQkJCQkgICAgZG1hX2FkZHJfdCAqZG1hX2hhbmRsZSwgZ2ZwX3QgZmxhZ3MpOwotZXh0ZXJuIHZvaWQgc3dpb3RsYl91bm1hcF9zaW5nbGUoc3RydWN0IGRldmljZSAqaHdkZXYsIGRtYV9hZGRyX3QgZGV2X2FkZHIsCi0JCQkJIHNpemVfdCBzaXplLCBpbnQgZGlyKTsKLWV4dGVybiB2b2lkIHN3aW90bGJfc3luY19zaW5nbGVfZm9yX2NwdShzdHJ1Y3QgZGV2aWNlICpod2RldiwKLQkJCQkJZG1hX2FkZHJfdCBkZXZfYWRkciwKLQkJCQkJc2l6ZV90IHNpemUsIGludCBkaXIpOwotZXh0ZXJuIHZvaWQgc3dpb3RsYl9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmh3ZGV2LAotCQkJCQkgICBkbWFfYWRkcl90IGRldl9hZGRyLAotCQkJCQkgICBzaXplX3Qgc2l6ZSwgaW50IGRpcik7Ci1leHRlcm4gdm9pZCBzd2lvdGxiX3N5bmNfc2luZ2xlX3JhbmdlX2Zvcl9jcHUoc3RydWN0IGRldmljZSAqaHdkZXYsCi0JCQkJCSAgICAgIGRtYV9hZGRyX3QgZGV2X2FkZHIsCi0JCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LAotCQkJCQkgICAgICBzaXplX3Qgc2l6ZSwgaW50IGRpcik7Ci1leHRlcm4gdm9pZCBzd2lvdGxiX3N5bmNfc2luZ2xlX3JhbmdlX2Zvcl9kZXZpY2Uoc3RydWN0IGRldmljZSAqaHdkZXYsCi0JCQkJCQkgZG1hX2FkZHJfdCBkZXZfYWRkciwKLQkJCQkJCSB1bnNpZ25lZCBsb25nIG9mZnNldCwKLQkJCQkJCSBzaXplX3Qgc2l6ZSwgaW50IGRpcik7Ci1leHRlcm4gdm9pZCBzd2lvdGxiX3N5bmNfc2dfZm9yX2NwdShzdHJ1Y3QgZGV2aWNlICpod2RldiwKLQkJCQkgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywgaW50IG5lbGVtcywKLQkJCQkgICAgaW50IGRpcik7Ci1leHRlcm4gdm9pZCBzd2lvdGxiX3N5bmNfc2dfZm9yX2RldmljZShzdHJ1Y3QgZGV2aWNlICpod2RldiwKLQkJCQkgICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywgaW50IG5lbGVtcywKLQkJCQkgICAgICAgaW50IGRpcik7Ci1leHRlcm4gaW50IHN3aW90bGJfbWFwX3NnKHN0cnVjdCBkZXZpY2UgKmh3ZGV2LCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLAotCQkJICBpbnQgbmVudHMsIGludCBkaXJlY3Rpb24pOwotZXh0ZXJuIHZvaWQgc3dpb3RsYl91bm1hcF9zZyhzdHJ1Y3QgZGV2aWNlICpod2Rldiwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywKLQkJCSAgICAgaW50IG5lbnRzLCBpbnQgZGlyZWN0aW9uKTsKLWV4dGVybiBpbnQgc3dpb3RsYl9kbWFfbWFwcGluZ19lcnJvcihzdHJ1Y3QgZGV2aWNlICpod2RldiwgZG1hX2FkZHJfdCBkbWFfYWRkcik7Ci1leHRlcm4gdm9pZCBzd2lvdGxiX2ZyZWVfY29oZXJlbnQoc3RydWN0IGRldmljZSAqaHdkZXYsIHNpemVfdCBzaXplLAotCQkJCSAgdm9pZCAqdmFkZHIsIGRtYV9hZGRyX3QgZG1hX2hhbmRsZSk7Ci1leHRlcm4gaW50IHN3aW90bGJfZG1hX3N1cHBvcnRlZChzdHJ1Y3QgZGV2aWNlICpod2RldiwgdTY0IG1hc2spOwotZXh0ZXJuIHZvaWQgc3dpb3RsYl9pbml0KHZvaWQpOworI2luY2x1ZGUgPGxpbnV4L3N3aW90bGIuaD4KIAogZXh0ZXJuIGludCBzd2lvdGxiX2ZvcmNlOwogCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQva2VybmVsL2twcm9iZXMuYyBiL2FyY2gvaWE2NC9rZXJuZWwva3Byb2Jlcy5jCmluZGV4IGYwNzY4OGQuLmY5MGJlNTEgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rZXJuZWwva3Byb2Jlcy5jCisrKyBiL2FyY2gvaWE2NC9rZXJuZWwva3Byb2Jlcy5jCkBAIC00MzQsNyArNDM0LDcgQEAKIAkvKgogCSAqIEl0IGlzIHBvc3NpYmxlIHRvIGhhdmUgbXVsdGlwbGUgaW5zdGFuY2VzIGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuCiAJICogdGFzayBlaXRoZXIgYmVjYXVzZSBhbiBtdWx0aXBsZSBmdW5jdGlvbnMgaW4gdGhlIGNhbGwgcGF0aAotCSAqIGhhdmUgYSByZXR1cm4gcHJvYmUgaW5zdGFsbGVkIG9uIHRoZW0sIGFuZC9vciBtb3JlIHRoZW4gb25lIHJldHVybgorCSAqIGhhdmUgYSByZXR1cm4gcHJvYmUgaW5zdGFsbGVkIG9uIHRoZW0sIGFuZC9vciBtb3JlIHRoYW4gb25lIHJldHVybgogCSAqIHJldHVybiBwcm9iZSB3YXMgcmVnaXN0ZXJlZCBmb3IgYSB0YXJnZXQgZnVuY3Rpb24uCiAJICoKIAkgKiBXZSBjYW4gaGFuZGxlIHRoaXMgYmVjYXVzZToKQEAgLTY3MCw5ICs2NzAsMTEgQEAKIAogdm9pZCBfX2twcm9iZXMgYXJjaF9yZW1vdmVfa3Byb2JlKHN0cnVjdCBrcHJvYmUgKnApCiB7Ci0JbXV0ZXhfbG9jaygma3Byb2JlX211dGV4KTsKLQlmcmVlX2luc25fc2xvdChwLT5haW5zbi5pbnNuLCBwLT5haW5zbi5pbnN0X2ZsYWcgJiBJTlNUX0ZMQUdfQk9PU1RBQkxFKTsKLQltdXRleF91bmxvY2soJmtwcm9iZV9tdXRleCk7CisJaWYgKHAtPmFpbnNuLmluc24pIHsKKwkJZnJlZV9pbnNuX3Nsb3QocC0+YWluc24uaW5zbiwKKwkJCSAgICAgICBwLT5haW5zbi5pbnN0X2ZsYWcgJiBJTlNUX0ZMQUdfQk9PU1RBQkxFKTsKKwkJcC0+YWluc24uaW5zbiA9IE5VTEw7CisJfQogfQogLyoKICAqIFdlIGFyZSByZXN1bWluZyBleGVjdXRpb24gYWZ0ZXIgYSBzaW5nbGUgc3RlcCBmYXVsdCwgc28gdGhlIHB0X3JlZ3MKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvcGNpLWRtYS5jIGIvYXJjaC9pYTY0L2tlcm5lbC9wY2ktZG1hLmMKaW5kZXggMmE5MmY2My4uZDBhZGEwNiAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2tlcm5lbC9wY2ktZG1hLmMKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC9wY2ktZG1hLmMKQEAgLTM5LDcgKzM5LDcgQEAKICAgIGJlIHByb2JhYmx5IGEgc21hbGxlciBETUEgbWFzaywgYnV0IHRoaXMgaXMgYnVnLXRvLWJ1ZyBjb21wYXRpYmxlCiAgICB0byBpMzg2LiAqLwogc3RydWN0IGRldmljZSBmYWxsYmFja19kZXYgPSB7Ci0JLmJ1c19pZCA9ICJmYWxsYmFjayBkZXZpY2UiLAorCS5pbml0X25hbWUgPSAiZmFsbGJhY2sgZGV2aWNlIiwKIAkuY29oZXJlbnRfZG1hX21hc2sgPSBETUFfMzJCSVRfTUFTSywKIAkuZG1hX21hc2sgPSAmZmFsbGJhY2tfZGV2LmNvaGVyZW50X2RtYV9tYXNrLAogfTsKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9tbS9pbml0LmMgYi9hcmNoL2lhNjQvbW0vaW5pdC5jCmluZGV4IDA1NGJjZDkuLjU2ZTEyOTAgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9tbS9pbml0LmMKKysrIGIvYXJjaC9pYTY0L21tL2luaXQuYwpAQCAtNjkyLDcgKzY5Miw3IEBACiAJcGdkYXQgPSBOT0RFX0RBVEEobmlkKTsKIAogCXpvbmUgPSBwZ2RhdC0+bm9kZV96b25lcyArIFpPTkVfTk9STUFMOwotCXJldCA9IF9fYWRkX3BhZ2VzKHpvbmUsIHN0YXJ0X3BmbiwgbnJfcGFnZXMpOworCXJldCA9IF9fYWRkX3BhZ2VzKG5pZCwgem9uZSwgc3RhcnRfcGZuLCBucl9wYWdlcyk7CiAKIAlpZiAocmV0KQogCQlwcmludGsoIiVzOiBQcm9ibGVtIGVuY291bnRlcmVkIGluIF9fYWRkX3BhZ2VzKCkgYXMgcmV0PSVkXG4iLApkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L3NuL2tlcm5lbC90aW9jeC5jIGIvYXJjaC9pYTY0L3NuL2tlcm5lbC90aW9jeC5jCmluZGV4IGE4OGViYTMuLjNmODY0MjMgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9zbi9rZXJuZWwvdGlvY3guYworKysgYi9hcmNoL2lhNjQvc24va2VybmVsL3Rpb2N4LmMKQEAgLTIwNiw4ICsyMDYsNyBAQAogCWN4X2Rldi0+ZGV2LnBhcmVudCA9IE5VTEw7CiAJY3hfZGV2LT5kZXYuYnVzID0gJnRpb2N4X2J1c190eXBlOwogCWN4X2Rldi0+ZGV2LnJlbGVhc2UgPSB0aW9jeF9idXNfcmVsZWFzZTsKLQlzbnByaW50ZihjeF9kZXYtPmRldi5idXNfaWQsIEJVU19JRF9TSVpFLCAiJWQiLAotCQkgY3hfZGV2LT5jeF9pZC5uYXNpZCk7CisJZGV2X3NldF9uYW1lKCZjeF9kZXYtPmRldiwgIiVkIiwgY3hfZGV2LT5jeF9pZC5uYXNpZCk7CiAJZGV2aWNlX3JlZ2lzdGVyKCZjeF9kZXYtPmRldik7CiAJZ2V0X2RldmljZSgmY3hfZGV2LT5kZXYpOwogCmRpZmYgLS1naXQgYS9hcmNoL202OGsvS2NvbmZpZyBiL2FyY2gvbTY4ay9LY29uZmlnCmluZGV4IGM4MjViZGUuLmZiODdjMDggMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9LY29uZmlnCisrKyBiL2FyY2gvbTY4ay9LY29uZmlnCkBAIC0zMDMsNyArMzAzLDcgQEAKIAkgIGNvcnJlY3Qgcm91bmRpbmcsIHRoZSBlbXVsYXRvciBjYW4gKG9mdGVuKSBkbyB0aGUgc2FtZSBidXQgdGhpcwogCSAgZXh0cmEgY2FsY3VsYXRpb24gY2FuIGNvc3QgcXVpdGUgc29tZSB0aW1lLCBzbyB5b3UgY2FuIGRpc2FibGUKIAkgIGl0IGhlcmUuIFRoZSBlbXVsYXRvciB3aWxsIHRoZW4gIm9ubHkiIGNhbGN1bGF0ZSB3aXRoIGEgNjQgYml0Ci0JICBtYW50aXNzYSBhbmQgcm91bmQgc2xpZ2h0bHkgaW5jb3JyZWN0LCB3aGF0IGlzIG1vcmUgdGhlbiBlbm91Z2gKKwkgIG1hbnRpc3NhIGFuZCByb3VuZCBzbGlnaHRseSBpbmNvcnJlY3QsIHdoYXQgaXMgbW9yZSB0aGFuIGVub3VnaAogCSAgZm9yIG5vcm1hbCB1c2FnZS4KIAogY29uZmlnIE02OEtGUFVfRU1VX09OTFkKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9rZXJuZWwvdHJhcHMuYyBiL2FyY2gvbTY4ay9rZXJuZWwvdHJhcHMuYwppbmRleCA2ZDgxM2RlLi4xODRhY2M5IDEwMDY0NAotLS0gYS9hcmNoL202OGsva2VybmVsL3RyYXBzLmMKKysrIGIvYXJjaC9tNjhrL2tlcm5lbC90cmFwcy5jCkBAIC00MDEsNyArNDAxLDcgQEAKICAqIGNhbGxlZCBmcm9tIHNpZ3JldHVybigpLCBtdXN0IGVuc3VyZSB1c2Vyc3BhY2UgY29kZSBkaWRuJ3QKICAqIG1hbmlwdWxhdGUgZXhjZXB0aW9uIGZyYW1lIHRvIGNpcmN1bXZlbnQgcHJvdGVjdGlvbiwgdGhlbiBjb21wbGV0ZQogICogcGVuZGluZyB3cml0ZWJhY2tzCi0gKiB3ZSBqdXN0IGNsZWFyIFRNMiB0byB0dXJuIGl0IGludG8gYW4gdXNlcnNwYWNlIGFjY2VzcworICogd2UganVzdCBjbGVhciBUTTIgdG8gdHVybiBpdCBpbnRvIGEgdXNlcnNwYWNlIGFjY2VzcwogICovCiBhc21saW5rYWdlIHZvaWQgYmVycl8wNDBjbGVhbnVwKHN0cnVjdCBmcmFtZSAqZnApCiB7CmRpZmYgLS1naXQgYS9hcmNoL202OGtub21tdS9pbmNsdWRlL2FzbS9LYnVpbGQgYi9hcmNoL202OGtub21tdS9pbmNsdWRlL2FzbS9LYnVpbGQKaW5kZXggYzY4ZTE2OC4uNThjMDJhNCAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrbm9tbXUvaW5jbHVkZS9hc20vS2J1aWxkCisrKyBiL2FyY2gvbTY4a25vbW11L2luY2x1ZGUvYXNtL0tidWlsZApAQCAtMSArMSwzIEBACiBpbmNsdWRlIGluY2x1ZGUvYXNtLWdlbmVyaWMvS2J1aWxkLmFzbQorCit1bmlmZGVmLXkgKz0gc3dhYi5oCmRpZmYgLS1naXQgYS9hcmNoL202OGtub21tdS9pbmNsdWRlL2FzbS9hdG9taWMuaCBiL2FyY2gvbTY4a25vbW11L2luY2x1ZGUvYXNtL2F0b21pYy5oCmluZGV4IGQ1NjMyYTMuLjZiYjY3NDggMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4a25vbW11L2luY2x1ZGUvYXNtL2F0b21pYy5oCisrKyBiL2FyY2gvbTY4a25vbW11L2luY2x1ZGUvYXNtL2F0b21pYy5oCkBAIC0xLDYgKzEsNyBAQAogI2lmbmRlZiBfX0FSQ0hfTTY4S05PTU1VX0FUT01JQ19fCiAjZGVmaW5lIF9fQVJDSF9NNjhLTk9NTVVfQVRPTUlDX18KIAorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogCiAvKgpAQCAtMTIsNyArMTMsNiBAQAogICogV2UgZG8gbm90IGhhdmUgU01QIG02OGsgc3lzdGVtcywgc28gd2UgZG9uJ3QgaGF2ZSB0byBkZWFsIHdpdGggdGhhdC4KICAqLwogCi10eXBlZGVmIHN0cnVjdCB7IGludCBjb3VudGVyOyB9IGF0b21pY190OwogI2RlZmluZSBBVE9NSUNfSU5JVChpKQl7IChpKSB9CiAKICNkZWZpbmUgYXRvbWljX3JlYWQodikJCSgodiktPmNvdW50ZXIpCmRpZmYgLS1naXQgYS9hcmNoL202OGtub21tdS9pbmNsdWRlL2FzbS9ieXRlb3JkZXIuaCBiL2FyY2gvbTY4a25vbW11L2luY2x1ZGUvYXNtL2J5dGVvcmRlci5oCmluZGV4IDIwYmI0NDIuLmE2ZjBiOGYgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4a25vbW11L2luY2x1ZGUvYXNtL2J5dGVvcmRlci5oCisrKyBiL2FyY2gvbTY4a25vbW11L2luY2x1ZGUvYXNtL2J5dGVvcmRlci5oCkBAIC0xLDI3ICsxLDcgQEAKICNpZm5kZWYgX002OEtOT01NVV9CWVRFT1JERVJfSAogI2RlZmluZSBfTTY4S05PTU1VX0JZVEVPUkRFUl9ICiAKLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotCi0jaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgIWRlZmluZWQoX19TVFJJQ1RfQU5TSV9fKSB8fCBkZWZpbmVkKF9fS0VSTkVMX18pCi0jICBkZWZpbmUgX19CWVRFT1JERVJfSEFTX1U2NF9fCi0jICBkZWZpbmUgX19TV0FCXzY0X1RIUlVfMzJfXwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChfX21jZmlzYWFwbHVzX18pIHx8IGRlZmluZWQgKF9fbWNmaXNhY19fKQotc3RhdGljIGlubGluZSBfX2F0dHJpYnV0ZV9jb25zdF9fIF9fdTMyIF9fX2FyY2hfX3N3YWIzMihfX3UzMiB2YWwpCi17Ci0JYXNtKAotCQkJImJ5dGVyZXYgJTAiCi0JCQk6ICI9ZCIgKHZhbCkKLQkJCTogIjAiICh2YWwpCi0JICAgKTsKLQlyZXR1cm4gdmFsOwotfQotCi0jZGVmaW5lIF9fYXJjaF9fc3dhYjMyKHgpIF9fX2FyY2hfX3N3YWIzMih4KQotI2VuZGlmCi0KKyNpbmNsdWRlIDxhc20vc3dhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2J5dGVvcmRlci9iaWdfZW5kaWFuLmg+CiAKICNlbmRpZiAvKiBfTTY4S05PTU1VX0JZVEVPUkRFUl9IICovCmRpZmYgLS1naXQgYS9hcmNoL202OGtub21tdS9pbmNsdWRlL2FzbS9zd2FiLmggYi9hcmNoL202OGtub21tdS9pbmNsdWRlL2FzbS9zd2FiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTU4MjI1NwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbTY4a25vbW11L2luY2x1ZGUvYXNtL3N3YWIuaApAQCAtMCwwICsxLDI0IEBACisjaWZuZGVmIF9NNjhLTk9NTVVfU1dBQl9ICisjZGVmaW5lIF9NNjhLTk9NTVVfU1dBQl9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgIWRlZmluZWQoX19TVFJJQ1RfQU5TSV9fKSB8fCBkZWZpbmVkKF9fS0VSTkVMX18pCisjICBkZWZpbmUgX19TV0FCXzY0X1RIUlVfMzJfXworI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfX21jZmlzYWFwbHVzX18pIHx8IGRlZmluZWQgKF9fbWNmaXNhY19fKQorc3RhdGljIGlubGluZSBfX2F0dHJpYnV0ZV9jb25zdF9fIF9fdTMyIF9fYXJjaF9zd2FiMzIoX191MzIgdmFsKQoreworCWFzbSgKKwkJCSJieXRlcmV2ICUwIgorCQkJOiAiPWQiICh2YWwpCisJCQk6ICIwIiAodmFsKQorCSAgICk7CisJcmV0dXJuIHZhbDsKK30KKworI2RlZmluZSBfX2FyY2hfc3dhYjMyIF9fYXJjaF9zd2FiMzIKKyNlbmRpZgorCisjZW5kaWYgLyogX002OEtOT01NVV9TV0FCX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9LYnVpbGQgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vS2J1aWxkCmluZGV4IDc4OTdmMDUuLjAyMzg2NmMgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9LYnVpbGQKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL0tidWlsZApAQCAtMSwzICsxLDQgQEAKIGluY2x1ZGUgaW5jbHVkZS9hc20tZ2VuZXJpYy9LYnVpbGQuYXNtCiAKIGhlYWRlci15ICs9IGNhY2hlY3RsLmggc2dpZGVmcy5oIHN5c21pcHMuaAoraGVhZGVyLXkgKz0gc3dhYi5oCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vYXRvbWljLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vYXRvbWljLmgKaW5kZXggMTIzMmJlMy4uYzk5NmMzYiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2F0b21pYy5oCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9hdG9taWMuaApAQCAtMTUsMTMgKzE1LDEyIEBACiAjZGVmaW5lIF9BU01fQVRPTUlDX0gKIAogI2luY2x1ZGUgPGxpbnV4L2lycWZsYWdzLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vYmFycmllci5oPgogI2luY2x1ZGUgPGFzbS9jcHUtZmVhdHVyZXMuaD4KICNpbmNsdWRlIDxhc20vd2FyLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogCi10eXBlZGVmIHN0cnVjdCB7IHZvbGF0aWxlIGludCBjb3VudGVyOyB9IGF0b21pY190OwotCiAjZGVmaW5lIEFUT01JQ19JTklUKGkpICAgIHsgKGkpIH0KIAogLyoKQEAgLTQwNCw4ICs0MDMsNiBAQAogCiAjaWZkZWYgQ09ORklHXzY0QklUCiAKLXR5cGVkZWYgc3RydWN0IHsgdm9sYXRpbGUgbG9uZyBjb3VudGVyOyB9IGF0b21pYzY0X3Q7Ci0KICNkZWZpbmUgQVRPTUlDNjRfSU5JVChpKSAgICB7IChpKSB9CiAKIC8qCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vYnl0ZW9yZGVyLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vYnl0ZW9yZGVyLmgKaW5kZXggMzM3OTBiOS4uNjA3YjcxOCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2J5dGVvcmRlci5oCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9ieXRlb3JkZXIuaApAQCAtOCw2MCArOCwxNCBAQAogI2lmbmRlZiBfQVNNX0JZVEVPUkRFUl9ICiAjZGVmaW5lIF9BU01fQllURU9SREVSX0gKIAotI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+Ci0jaW5jbHVkZSA8YXNtL3R5cGVzLmg+CisjaW5jbHVkZSA8YXNtL3N3YWIuaD4KIAogI2lmIGRlZmluZWQoX19NSVBTRUJfXykKLSMgZGVmaW5lIF9fQklHX0VORElBTgorI2luY2x1ZGUgPGxpbnV4L2J5dGVvcmRlci9iaWdfZW5kaWFuLmg+CiAjZWxpZiBkZWZpbmVkKF9fTUlQU0VMX18pCi0jIGRlZmluZSBfX0xJVFRMRV9FTkRJQU4KKyNpbmNsdWRlIDxsaW51eC9ieXRlb3JkZXIvbGl0dGxlX2VuZGlhbi5oPgogI2Vsc2UKICMgZXJyb3IgIk1JUFMsIGJ1dCBuZWl0aGVyIF9fTUlQU0VCX18sIG5vciBfX01JUFNFTF9fPz8/IgogI2VuZGlmCiAKLSNkZWZpbmUgX19TV0FCXzY0X1RIUlVfMzJfXwotCi0jaWZkZWYgQ09ORklHX0NQVV9NSVBTUjIKLQotc3RhdGljIGlubGluZSBfX2F0dHJpYnV0ZV9jb25zdF9fIF9fdTE2IF9fYXJjaF9zd2FiMTYoX191MTYgeCkKLXsKLQlfX2FzbV9fKAotCSIJd3NiaAklMCwgJTEJCQlcbiIKLQk6ICI9ciIgKHgpCi0JOiAiciIgKHgpKTsKLQotCXJldHVybiB4OwotfQotI2RlZmluZSBfX2FyY2hfc3dhYjE2IF9fYXJjaF9zd2FiMTYKLQotc3RhdGljIGlubGluZSBfX2F0dHJpYnV0ZV9jb25zdF9fIF9fdTMyIF9fYXJjaF9zd2FiMzIoX191MzIgeCkKLXsKLQlfX2FzbV9fKAotCSIJd3NiaAklMCwgJTEJCQlcbiIKLQkiCXJvdHIJJTAsICUwLCAxNgkJXG4iCi0JOiAiPXIiICh4KQotCTogInIiICh4KSk7Ci0KLQlyZXR1cm4geDsKLX0KLSNkZWZpbmUgX19hcmNoX3N3YWIzMiBfX2FyY2hfc3dhYjMyCi0KLSNpZmRlZiBDT05GSUdfQ1BVX01JUFM2NF9SMgotc3RhdGljIGlubGluZSBfX2F0dHJpYnV0ZV9jb25zdF9fIF9fdTY0IF9fYXJjaF9zd2FiNjQoX191NjQgeCkKLXsKLQlfX2FzbV9fKAotCSIJZHNiaAklMCwgJTFcbiIKLQkiCWRzaGQJJTAsICUwIgotCTogIj1yIiAoeCkKLQk6ICJyIiAoeCkpOwotCi0JcmV0dXJuIHg7Ci19Ci0jZGVmaW5lIF9fYXJjaF9zd2FiNjQgX19hcmNoX3N3YWI2NAotI2VuZGlmIC8qIENPTkZJR19DUFVfTUlQUzY0X1IyICovCi0KLSNlbmRpZiAvKiBDT05GSUdfQ1BVX01JUFNSMiAqLwotCi0jaW5jbHVkZSA8bGludXgvYnl0ZW9yZGVyLmg+Ci0KICNlbmRpZiAvKiBfQVNNX0JZVEVPUkRFUl9IICovCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vc3dhYi5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3N3YWIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OGYxZjdkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3N3YWIuaApAQCAtMCwwICsxLDU1IEBACisvKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk2LCA5OSwgMjAwMyBieSBSYWxmIEJhZWNobGUKKyAqLworI2lmbmRlZiBfQVNNX1NXQUJfSAorI2RlZmluZSBfQVNNX1NXQUJfSAorCisjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KKyNpbmNsdWRlIDxhc20vdHlwZXMuaD4KKworI2RlZmluZSBfX1NXQUJfNjRfVEhSVV8zMl9fCisKKyNpZmRlZiBDT05GSUdfQ1BVX01JUFNSMgorCitzdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX2NvbnN0X18gX191MTYgX19hcmNoX3N3YWIxNihfX3UxNiB4KQoreworCV9fYXNtX18oCisJIgl3c2JoCSUwLCAlMQkJCVxuIgorCTogIj1yIiAoeCkKKwk6ICJyIiAoeCkpOworCisJcmV0dXJuIHg7Cit9CisjZGVmaW5lIF9fYXJjaF9zd2FiMTYgX19hcmNoX3N3YWIxNgorCitzdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX2NvbnN0X18gX191MzIgX19hcmNoX3N3YWIzMihfX3UzMiB4KQoreworCV9fYXNtX18oCisJIgl3c2JoCSUwLCAlMQkJCVxuIgorCSIJcm90cgklMCwgJTAsIDE2CQlcbiIKKwk6ICI9ciIgKHgpCisJOiAiciIgKHgpKTsKKworCXJldHVybiB4OworfQorI2RlZmluZSBfX2FyY2hfc3dhYjMyIF9fYXJjaF9zd2FiMzIKKworI2lmZGVmIENPTkZJR19DUFVfTUlQUzY0X1IyCitzdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX2NvbnN0X18gX191NjQgX19hcmNoX3N3YWI2NChfX3U2NCB4KQoreworCV9fYXNtX18oCisJIglkc2JoCSUwLCAlMVxuIgorCSIJZHNoZAklMCwgJTAiCisJOiAiPXIiICh4KQorCTogInIiICh4KSk7CisKKwlyZXR1cm4geDsKK30KKyNkZWZpbmUgX19hcmNoX3N3YWI2NCBfX2FyY2hfc3dhYjY0CisjZW5kaWYgLyogQ09ORklHX0NQVV9NSVBTNjRfUjIgKi8KKyNlbmRpZiAvKiBDT05GSUdfQ1BVX01JUFNSMiAqLworI2VuZGlmIC8qIF9BU01fU1dBQl9IICovCmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL3N0YWNrdHJhY2UuYyBiL2FyY2gvbWlwcy9rZXJuZWwvc3RhY2t0cmFjZS5jCmluZGV4IDA2MzJlMmEuLjU4ZjVjZDcgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvc3RhY2t0cmFjZS5jCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvc3RhY2t0cmFjZS5jCkBAIC0zMiw3ICszMiw4IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBzYXZlX2NvbnRleHRfc3RhY2soc3RydWN0IHN0YWNrX3RyYWNlICp0cmFjZSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCitzdGF0aWMgdm9pZCBzYXZlX2NvbnRleHRfc3RhY2soc3RydWN0IHN0YWNrX3RyYWNlICp0cmFjZSwKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJdW5zaWduZWQgbG9uZyBzcCA9IHJlZ3MtPnJlZ3NbMjldOwogI2lmZGVmIENPTkZJR19LQUxMU1lNUwpAQCAtNDEsNyArNDIsNyBAQAogCiAJaWYgKHJhd19zaG93X3RyYWNlIHx8ICFfX2tlcm5lbF90ZXh0X2FkZHJlc3MocGMpKSB7CiAJCXVuc2lnbmVkIGxvbmcgc3RhY2tfcGFnZSA9Ci0JCQkodW5zaWduZWQgbG9uZyl0YXNrX3N0YWNrX3BhZ2UoY3VycmVudCk7CisJCQkodW5zaWduZWQgbG9uZyl0YXNrX3N0YWNrX3BhZ2UodHNrKTsKIAkJaWYgKHN0YWNrX3BhZ2UgJiYgc3AgPj0gc3RhY2tfcGFnZSAmJgogCQkgICAgc3AgPD0gc3RhY2tfcGFnZSArIFRIUkVBRF9TSVpFIC0gMzIpCiAJCQlzYXZlX3Jhd19jb250ZXh0X3N0YWNrKHRyYWNlLCBzcCk7CkBAIC01NCw3ICs1NSw3IEBACiAJCQl0cmFjZS0+ZW50cmllc1t0cmFjZS0+bnJfZW50cmllcysrXSA9IHBjOwogCQlpZiAodHJhY2UtPm5yX2VudHJpZXMgPj0gdHJhY2UtPm1heF9lbnRyaWVzKQogCQkJYnJlYWs7Ci0JCXBjID0gdW53aW5kX3N0YWNrKGN1cnJlbnQsICZzcCwgcGMsICZyYSk7CisJCXBjID0gdW53aW5kX3N0YWNrKHRzaywgJnNwLCBwYywgJnJhKTsKIAl9IHdoaWxlIChwYyk7CiAjZWxzZQogCXNhdmVfcmF3X2NvbnRleHRfc3RhY2sodHJhY2UsIHNwKTsKQEAgLTY2LDEyICs2NywyMyBAQAogICovCiB2b2lkIHNhdmVfc3RhY2tfdHJhY2Uoc3RydWN0IHN0YWNrX3RyYWNlICp0cmFjZSkKIHsKKwlzYXZlX3N0YWNrX3RyYWNlX3RzayhjdXJyZW50LCB0cmFjZSk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzYXZlX3N0YWNrX3RyYWNlKTsKKwordm9pZCBzYXZlX3N0YWNrX3RyYWNlX3RzayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgc3RydWN0IHN0YWNrX3RyYWNlICp0cmFjZSkKK3sKIAlzdHJ1Y3QgcHRfcmVncyBkdW1teXJlZ3M7CiAJc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSAmZHVtbXlyZWdzOwogCiAJV0FSTl9PTih0cmFjZS0+bnJfZW50cmllcyB8fCAhdHJhY2UtPm1heF9lbnRyaWVzKTsKIAotCXByZXBhcmVfZnJhbWV0cmFjZShyZWdzKTsKLQlzYXZlX2NvbnRleHRfc3RhY2sodHJhY2UsIHJlZ3MpOworCWlmICh0c2sgIT0gY3VycmVudCkgeworCQlyZWdzLT5yZWdzWzI5XSA9IHRzay0+dGhyZWFkLnJlZzI5OworCQlyZWdzLT5yZWdzWzMxXSA9IDA7CisJCXJlZ3MtPmNwMF9lcGMgPSB0c2stPnRocmVhZC5yZWczMTsKKwl9IGVsc2UKKwkJcHJlcGFyZV9mcmFtZXRyYWNlKHJlZ3MpOworCXNhdmVfY29udGV4dF9zdGFjayh0cmFjZSwgdHNrLCByZWdzKTsKIH0KLUVYUE9SVF9TWU1CT0xfR1BMKHNhdmVfc3RhY2tfdHJhY2UpOworRVhQT1JUX1NZTUJPTF9HUEwoc2F2ZV9zdGFja190cmFjZV90c2spOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC92cGUuYyBiL2FyY2gvbWlwcy9rZXJuZWwvdnBlLmMKaW5kZXggMDEwYjI3ZS4uM2NhNWY0MiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC92cGUuYworKysgYi9hcmNoL21pcHMva2VybmVsL3ZwZS5jCkBAIC0xNDU0LDcgKzE0NTQsNyBAQAogCWRldmljZV9pbml0aWFsaXplKCZ2cGVfZGV2aWNlKTsKIAl2cGVfZGV2aWNlLmNsYXNzCT0gJnZwZV9jbGFzcywKIAl2cGVfZGV2aWNlLnBhcmVudAk9IE5VTEwsCi0Jc3RybGNweSh2cGVfZGV2aWNlLmJ1c19pZCwgInZwZTEiLCBCVVNfSURfU0laRSk7CisJZGV2X3NldF9uYW1lKCZ2cGVfZGV2aWNlLCAidnBlMSIpOwogCXZwZV9kZXZpY2UuZGV2dCA9IE1LREVWKG1ham9yLCBtaW5vcik7CiAJZXJyID0gZGV2aWNlX2FkZCgmdnBlX2RldmljZSk7CiAJaWYgKGVycikgewpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3BjaS9wY2ktaXAyNy5jIGIvYXJjaC9taXBzL3BjaS9wY2ktaXAyNy5jCmluZGV4IGY5N2FiMTQuLmRkYTZmMjAgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9wY2kvcGNpLWlwMjcuYworKysgYi9hcmNoL21pcHMvcGNpL3BjaS1pcDI3LmMKQEAgLTE0NiwxMiArMTQ2LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotLyogTW9zdCBNSVBTIHN5c3RlbXMgaGF2ZSBzdHJhaWdodC1mb3J3YXJkIHN3aXp6bGluZyBuZWVkcy4gICovCi1zdGF0aWMgaW5saW5lIHU4IGJyaWRnZV9zd2l6emxlKHU4IHBpbiwgdTggc2xvdCkKLXsKLQlyZXR1cm4gKCgocGluIC0gMSkgKyBzbG90KSAlIDQpICsgMTsKLX0KLQogc3RhdGljIGlubGluZSBzdHJ1Y3QgcGNpX2RldiAqYnJpZGdlX3Jvb3RfZGV2KHN0cnVjdCBwY2lfZGV2ICpkZXYpCiB7CiAJd2hpbGUgKGRldi0+YnVzLT5wYXJlbnQpIHsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9wY2kvcGNpLmMgYi9hcmNoL21pcHMvcGNpL3BjaS5jCmluZGV4IDYyY2FlNzQuLmIwZWI5ZTcgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9wY2kvcGNpLmMKKysrIGIvYXJjaC9taXBzL3BjaS9wY2kuYwpAQCAtMTQ5LDI4ICsxNDksNiBAQAogCSAgICAgICAiU2tpcHBpbmcgUENJIGJ1cyBzY2FuIGR1ZSB0byByZXNvdXJjZSBjb25mbGljdFxuIik7CiB9CiAKLS8qIE1vc3QgTUlQUyBzeXN0ZW1zIGhhdmUgc3RyYWlnaHQtZm9yd2FyZCBzd2l6emxpbmcgbmVlZHMuICAqLwotCi1zdGF0aWMgaW5saW5lIHU4IGJyaWRnZV9zd2l6emxlKHU4IHBpbiwgdTggc2xvdCkKLXsKLQlyZXR1cm4gKCgocGluIC0gMSkgKyBzbG90KSAlIDQpICsgMTsKLX0KLQotc3RhdGljIHU4IF9faW5pdCBjb21tb25fc3dpenpsZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCAqcGlucCkKLXsKLQl1OCBwaW4gPSAqcGlucDsKLQotCXdoaWxlIChkZXYtPmJ1cy0+cGFyZW50KSB7Ci0JCXBpbiA9IGJyaWRnZV9zd2l6emxlKHBpbiwgUENJX1NMT1QoZGV2LT5kZXZmbikpOwotCQkvKiBNb3ZlIHVwIHRoZSBjaGFpbiBvZiBicmlkZ2VzLiAqLwotCQlkZXYgPSBkZXYtPmJ1cy0+c2VsZjsKLSAgICAgICAgfQotCSpwaW5wID0gcGluOwotCi0JLyogVGhlIHNsb3QgaXMgdGhlIHNsb3Qgb2YgdGhlIGxhc3QgYnJpZGdlLiAqLwotCXJldHVybiBQQ0lfU0xPVChkZXYtPmRldmZuKTsKLX0KLQogc3RhdGljIGludCBfX2luaXQgcGNpYmlvc19pbml0KHZvaWQpCiB7CiAJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlOwpAQCAtMTc5LDcgKzE1Nyw3IEBACiAJZm9yIChob3NlID0gaG9zZV9oZWFkOyBob3NlOyBob3NlID0gaG9zZS0+bmV4dCkKIAkJcGNpYmlvc19zY2FuYnVzKGhvc2UpOwogCi0JcGNpX2ZpeHVwX2lycXMoY29tbW9uX3N3aXp6bGUsIHBjaWJpb3NfbWFwX2lycSk7CisJcGNpX2ZpeHVwX2lycXMocGNpX2NvbW1vbl9zd2l6emxlLCBwY2liaW9zX21hcF9pcnEpOwogCiAJcGNpX2luaXRpYWxpemVkID0gMTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3BtYy1zaWVycmEveW9zZW1pdGUvYXRtZWxfcmVhZF9lZXByb20uYyBiL2FyY2gvbWlwcy9wbWMtc2llcnJhL3lvc2VtaXRlL2F0bWVsX3JlYWRfZWVwcm9tLmMKaW5kZXggOTc4NjJmNC4uY2FmNWU5YSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3BtYy1zaWVycmEveW9zZW1pdGUvYXRtZWxfcmVhZF9lZXByb20uYworKysgYi9hcmNoL21pcHMvcG1jLXNpZXJyYS95b3NlbWl0ZS9hdG1lbF9yZWFkX2VlcHJvbS5jCkBAIC0xNDgsNyArMTQ4LDcgQEAKIAlzZW5kX2J5dGUoV19IRUFERVIpOwogCXJlY3ZfYWNrKCk7CiAKLQkvKiBFRVBST00gd2l0aCBzaXplIG9mIG1vcmUgdGhlbiAySyBuZWVkIHR3byBieXRlIGFkZHJlc3NpbmcgKi8KKwkvKiBFRVBST00gd2l0aCBzaXplIG9mIG1vcmUgdGhhbiAySyBuZWVkIHR3byBieXRlIGFkZHJlc3NpbmcgKi8KIAlpZiAoZWVwcm9tX3NpemUgPiAyMDQ4KSB7CiAJCXNlbmRfYnl0ZSgweDAwKTsKIAkJcmVjdl9hY2soKTsKZGlmZiAtLWdpdCBhL2FyY2gvcGFyaXNjL2luY2x1ZGUvYXNtL2F0b21pYy5oIGIvYXJjaC9wYXJpc2MvaW5jbHVkZS9hc20vYXRvbWljLmgKaW5kZXggNTdmY2M0YS4uZWRiZmUyNSAxMDA2NDQKLS0tIGEvYXJjaC9wYXJpc2MvaW5jbHVkZS9hc20vYXRvbWljLmgKKysrIGIvYXJjaC9wYXJpc2MvaW5jbHVkZS9hc20vYXRvbWljLmgKQEAgLTE1NSwxNCArMTU1LDExIEBACiAjZGVmaW5lIGNtcHhjaGc2NF9sb2NhbChwdHIsIG8sIG4pIF9fY21weGNoZzY0X2xvY2FsX2dlbmVyaWMoKHB0ciksIChvKSwgKG4pKQogI2VuZGlmCiAKLS8qIE5vdGUgdGhhdCB3ZSBuZWVkIG5vdCBsb2NrIHJlYWQgYWNjZXNzZXMgLSBhbGlnbmVkIHdvcmQgd3JpdGVzL3JlYWRzCi0gKiBhcmUgYXRvbWljLCBzbyBhIHJlYWRlciBuZXZlciBzZWVzIHVuY29uc2lzdGVudCB2YWx1ZXMuCi0gKgotICogQ2FjaGUtbGluZSBhbGlnbm1lbnQgd291bGQgY29uZmxpY3Qgd2l0aCwgZm9yIGV4YW1wbGUsIGxpbnV4L21vZHVsZS5oCisvKgorICogTm90ZSB0aGF0IHdlIG5lZWQgbm90IGxvY2sgcmVhZCBhY2Nlc3NlcyAtIGFsaWduZWQgd29yZCB3cml0ZXMvcmVhZHMKKyAqIGFyZSBhdG9taWMsIHNvIGEgcmVhZGVyIG5ldmVyIHNlZXMgaW5jb25zaXN0ZW50IHZhbHVlcy4KICAqLwogCi10eXBlZGVmIHN0cnVjdCB7IHZvbGF0aWxlIGludCBjb3VudGVyOyB9IGF0b21pY190OwotCiAvKiBJdCdzIHBvc3NpYmxlIHRvIHJlZHVjZSBhbGwgYXRvbWljIG9wZXJhdGlvbnMgdG8gZWl0aGVyCiAgKiBfX2F0b21pY19hZGRfcmV0dXJuLCBhdG9taWNfc2V0IGFuZCBhdG9taWNfcmVhZCAodGhlIGxhdHRlcgogICogaXMgdGhlcmUgb25seSBmb3IgY29uc2lzdGVuY3kpLgpAQCAtMjYwLDggKzI1Nyw2IEBACiAKICNpZmRlZiBDT05GSUdfNjRCSVQKIAotdHlwZWRlZiBzdHJ1Y3QgeyB2b2xhdGlsZSBzNjQgY291bnRlcjsgfSBhdG9taWM2NF90OwotCiAjZGVmaW5lIEFUT01JQzY0X0lOSVQoaSkgKChhdG9taWM2NF90KSB7IChpKSB9KQogCiBzdGF0aWMgX19pbmxpbmVfXyBpbnQKZGlmZiAtLWdpdCBhL2FyY2gvcGFyaXNjL2luY2x1ZGUvYXNtL21vZHVsZS5oIGIvYXJjaC9wYXJpc2MvaW5jbHVkZS9hc20vbW9kdWxlLmgKaW5kZXggYzJjYjQ5ZS4uMWY0MTIzNCAxMDA2NDQKLS0tIGEvYXJjaC9wYXJpc2MvaW5jbHVkZS9hc20vbW9kdWxlLmgKKysrIGIvYXJjaC9wYXJpc2MvaW5jbHVkZS9hc20vbW9kdWxlLmgKQEAgLTIzLDggKzIzLDEwIEBACiB7CiAJdW5zaWduZWQgbG9uZyBnb3Rfb2Zmc2V0LCBnb3RfY291bnQsIGdvdF9tYXg7CiAJdW5zaWduZWQgbG9uZyBmZGVzY19vZmZzZXQsIGZkZXNjX2NvdW50LCBmZGVzY19tYXg7Ci0JdW5zaWduZWQgbG9uZyBzdHViX29mZnNldCwgc3R1Yl9jb3VudCwgc3R1Yl9tYXg7Ci0JdW5zaWduZWQgbG9uZyBpbml0X3N0dWJfb2Zmc2V0LCBpbml0X3N0dWJfY291bnQsIGluaXRfc3R1Yl9tYXg7CisJc3RydWN0IHsKKwkJdW5zaWduZWQgbG9uZyBzdHViX29mZnNldDsKKwkJdW5zaWduZWQgaW50IHN0dWJfZW50cmllczsKKwkJfSAqc2VjdGlvbjsKIAlpbnQgdW53aW5kX3NlY3Rpb247CiAJc3RydWN0IHVud2luZF90YWJsZSAqdW53aW5kOwogfTsKZGlmZiAtLWdpdCBhL2FyY2gvcGFyaXNjL2tlcm5lbC9tb2R1bGUuYyBiL2FyY2gvcGFyaXNjL2tlcm5lbC9tb2R1bGUuYwppbmRleCA0NDEzOGMzLi45MDEzMjQzIDEwMDY0NAotLS0gYS9hcmNoL3BhcmlzYy9rZXJuZWwvbW9kdWxlLmMKKysrIGIvYXJjaC9wYXJpc2Mva2VybmVsL21vZHVsZS5jCkBAIC02LDYgKzYsNyBAQAogICoKICAqICAgIExpbnV4L1BBLVJJU0MgUHJvamVjdCAoaHR0cDovL3d3dy5wYXJpc2MtbGludXgub3JnLykKICAqICAgIENvcHlyaWdodCAoQykgMjAwMyBSYW5kb2xwaCBDaHVuZyA8dGF1c3EgYXQgZGViaWFuIC4gb3JnPgorICogICAgQ29weXJpZ2h0IChDKSAyMDA4IEhlbGdlIERlbGxlciA8ZGVsbGVyQGdteC5kZT4KICAqCiAgKgogICogICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKQEAgLTI0LDYgKzI1LDE5IEBACiAgKgogICoKICAqICAgIE5vdGVzOgorICogICAgLSBQTFQgc3R1YiBoYW5kbGluZworICogICAgICBPbiAzMmJpdCAoYW5kIHNvbWV0aW1lcyA2NGJpdCkgYW5kIHdpdGggYmlnIGtlcm5lbCBtb2R1bGVzIGxpa2UgeGZzIG9yCisgKiAgICAgIGlwdjYgdGhlIHJlbG9jYXRpb24gdHlwZXMgUl9QQVJJU0NfUENSRUwxN0YgYW5kIFJfUEFSSVNDX1BDUkVMMjJGIG1heQorICogICAgICBmYWlsIHRvIHJlYWNoIHRoZWlyIFBMVCBzdHViIGlmIHdlIG9ubHkgY3JlYXRlIG9uZSBiaWcgc3R1YiBhcnJheSBmb3IKKyAqICAgICAgYWxsIHNlY3Rpb25zIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGNvcmUgb3IgaW5pdCBzZWN0aW9uLgorICogICAgICBJbnN0ZWFkIHdlIG5vdyBpbnNlcnQgaW5kaXZpZHVhbCBQTFQgc3R1YiBlbnRyaWVzIGRpcmVjdGx5IGluIGZyb250IG9mCisgKiAgICAgIG9mIHRoZSBjb2RlIHNlY3Rpb25zIHdoZXJlIHRoZSBzdHVicyBhcmUgYWN0dWFsbHkgY2FsbGVkLgorICogICAgICBUaGlzIHJlZHVjZXMgdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhlIFBDUkVMIGxvY2F0aW9uIGFuZCB0aGUgc3R1YiBlbnRyeQorICogICAgICBzbyB0aGF0IHRoZSByZWxvY2F0aW9ucyBjYW4gYmUgZnVsZmlsbGVkLgorICogICAgICBXaGlsZSBjYWxjdWxhdGluZyB0aGUgZmluYWwgbGF5b3V0IG9mIHRoZSBrZXJuZWwgbW9kdWxlIGluIG1lbW9yeSwgdGhlCisgKiAgICAgIGtlcm5lbCBtb2R1bGUgbG9hZGVyIGNhbGxzIGFyY2hfbW9kX3NlY3Rpb25fcHJlcGVuZCgpIHRvIHJlcXVlc3QgdGhlCisgKiAgICAgIHRvIGJlIHJlc2VydmVkIGFtb3VudCBvZiBtZW1vcnkgaW4gZnJvbnQgb2YgZWFjaCBpbmRpdmlkdWFsIHNlY3Rpb24uCisgKgogICogICAgLSBTRUdSRUwzMiBoYW5kbGluZwogICogICAgICBXZSBhcmUgbm90IGRvaW5nIFNFR1JFTDMyIGhhbmRsaW5nIGNvcnJlY3RseS4gQWNjb3JkaW5nIHRvIHRoZSBBQkksIHdlCiAgKiAgICAgIHNob3VsZCBkbyBhIHZhbHVlIG9mZnNldCwgbGlrZSB0aGlzOgpAQCAtNTgsOSArNzIsMTMgQEAKICNkZWZpbmUgREVCVUdQKGZtdC4uLikKICNlbmRpZgogCisjZGVmaW5lIFJFTE9DX1JFQUNIQUJMRSh2YWwsIGJpdHMpIFwKKwkoKCAoICEoKHZhbCkgJiAoMTw8KChiaXRzKS0xKSkpICYmICgodmFsKT4+KGJpdHMpKSAhPSAwICkgIHx8CVwKKwkgICAgICggKCh2YWwpICYgKDE8PCgoYml0cyktMSkpKSAmJiAoKHZhbCk+PihiaXRzKSkgIT0gKCgoX190eXBlb2ZfXyh2YWwpKSh+MCkpPj4oKGJpdHMpKzIpKSkpID8gXAorCTAgOiAxKQorCiAjZGVmaW5lIENIRUNLX1JFTE9DKHZhbCwgYml0cykgXAotCWlmICggKCAhKCh2YWwpICYgKDE8PCgoYml0cyktMSkpKSAmJiAoKHZhbCk+PihiaXRzKSkgIT0gMCApICB8fAlcCi0JICAgICAoICgodmFsKSAmICgxPDwoKGJpdHMpLTEpKSkgJiYgKCh2YWwpPj4oYml0cykpICE9ICgoKF9fdHlwZW9mX18odmFsKSkofjApKT4+KChiaXRzKSsyKSkpKSB7IFwKKwlpZiAoIVJFTE9DX1JFQUNIQUJMRSh2YWwsIGJpdHMpKSB7IFwKIAkJcHJpbnRrKEtFUk5fRVJSICJtb2R1bGUgJXMgcmVsb2NhdGlvbiBvZiBzeW1ib2wgJXMgaXMgb3V0IG9mIHJhbmdlICgweCVseCBpbiAlZCBiaXRzKVxuIiwgXAogCQltZS0+bmFtZSwgc3RydGFiICsgc3ltLT5zdF9uYW1lLCAodW5zaWduZWQgbG9uZyl2YWwsIGJpdHMpOyBcCiAJCXJldHVybiAtRU5PRVhFQzsJCQlcCkBAIC05MiwxMyArMTEwLDYgQEAKIAlyZXR1cm4gaW5faW5pdChtZSwgbG9jKSB8fCBpbl9jb3JlKG1lLCBsb2MpOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBpbl9sb2NhbF9zZWN0aW9uKHN0cnVjdCBtb2R1bGUgKm1lLCB2b2lkICpsb2MsIHZvaWQgKmRvdCkKLXsKLQlyZXR1cm4gKGluX2luaXQobWUsIGxvYykgJiYgaW5faW5pdChtZSwgZG90KSkgfHwKLQkJKGluX2NvcmUobWUsIGxvYykgJiYgaW5fY29yZShtZSwgZG90KSk7Ci19Ci0KLQogI2lmbmRlZiBDT05GSUdfNjRCSVQKIHN0cnVjdCBnb3RfZW50cnkgewogCUVsZjMyX0FkZHIgYWRkcjsKQEAgLTI1OCwyMyArMjY5LDQyIEBACiAvKiBGcmVlIG1lbW9yeSByZXR1cm5lZCBmcm9tIG1vZHVsZV9hbGxvYyAqLwogdm9pZCBtb2R1bGVfZnJlZShzdHJ1Y3QgbW9kdWxlICptb2QsIHZvaWQgKm1vZHVsZV9yZWdpb24pCiB7CisJa2ZyZWUobW9kLT5hcmNoLnNlY3Rpb24pOworCW1vZC0+YXJjaC5zZWN0aW9uID0gTlVMTDsKKwogCXZmcmVlKG1vZHVsZV9yZWdpb24pOwogCS8qIEZJWE1FOiBJZiBtb2R1bGVfcmVnaW9uID09IG1vZC0+aW5pdF9yZWdpb24sIHRyaW0gZXhjZXB0aW9uCiAgICAgICAgICAgIHRhYmxlIGVudHJpZXMuICovCiB9CiAKKy8qIEFkZGl0aW9uYWwgYnl0ZXMgbmVlZGVkIGluIGZyb250IG9mIGluZGl2aWR1YWwgc2VjdGlvbnMgKi8KK3Vuc2lnbmVkIGludCBhcmNoX21vZF9zZWN0aW9uX3ByZXBlbmQoc3RydWN0IG1vZHVsZSAqbW9kLAorCQkJCSAgICAgIHVuc2lnbmVkIGludCBzZWN0aW9uKQoreworCS8qIHNpemUgbmVlZGVkIGZvciBhbGwgc3R1YnMgb2YgdGhpcyBzZWN0aW9uIChpbmNsdWRpbmcKKwkgKiBvbmUgYWRkaXRpb25hbCBmb3IgY29ycmVjdCBhbGlnbm1lbnQgb2YgdGhlIHN0dWJzKSAqLworCXJldHVybiAobW9kLT5hcmNoLnNlY3Rpb25bc2VjdGlvbl0uc3R1Yl9lbnRyaWVzICsgMSkKKwkJKiBzaXplb2Yoc3RydWN0IHN0dWJfZW50cnkpOworfQorCiAjZGVmaW5lIENPTlNUIAogaW50IG1vZHVsZV9mcm9iX2FyY2hfc2VjdGlvbnMoQ09OU1QgRWxmX0VoZHIgKmhkciwKIAkJCSAgICAgIENPTlNUIEVsZl9TaGRyICpzZWNoZHJzLAogCQkJICAgICAgQ09OU1QgY2hhciAqc2Vjc3RyaW5ncywKIAkJCSAgICAgIHN0cnVjdCBtb2R1bGUgKm1lKQogewotCXVuc2lnbmVkIGxvbmcgZ290cyA9IDAsIGZkZXNjcyA9IDAsIHN0dWJzID0gMCwgaW5pdF9zdHVicyA9IDA7CisJdW5zaWduZWQgbG9uZyBnb3RzID0gMCwgZmRlc2NzID0gMCwgbGVuOwogCXVuc2lnbmVkIGludCBpOwogCisJbGVuID0gaGRyLT5lX3NobnVtICogc2l6ZW9mKG1lLT5hcmNoLnNlY3Rpb25bMF0pOworCW1lLT5hcmNoLnNlY3Rpb24gPSBremFsbG9jKGxlbiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFtZS0+YXJjaC5zZWN0aW9uKQorCQlyZXR1cm4gLUVOT01FTTsKKwogCWZvciAoaSA9IDE7IGkgPCBoZHItPmVfc2hudW07IGkrKykgewotCQljb25zdCBFbGZfUmVsYSAqcmVscyA9ICh2b2lkICopaGRyICsgc2VjaGRyc1tpXS5zaF9vZmZzZXQ7CisJCWNvbnN0IEVsZl9SZWxhICpyZWxzID0gKHZvaWQgKilzZWNoZHJzW2ldLnNoX2FkZHI7CiAJCXVuc2lnbmVkIGxvbmcgbnJlbHMgPSBzZWNoZHJzW2ldLnNoX3NpemUgLyBzaXplb2YoKnJlbHMpOworCQl1bnNpZ25lZCBpbnQgY291bnQsIHM7CiAKIAkJaWYgKHN0cm5jbXAoc2Vjc3RyaW5ncyArIHNlY2hkcnNbaV0uc2hfbmFtZSwKIAkJCSAgICAiLlBBUklTQy51bndpbmQiLCAxNCkgPT0gMCkKQEAgLTI5MCwxMSArMzIwLDIzIEBACiAJCSAqLwogCQlnb3RzICs9IGNvdW50X2dvdHMocmVscywgbnJlbHMpOwogCQlmZGVzY3MgKz0gY291bnRfZmRlc2NzKHJlbHMsIG5yZWxzKTsKLQkJaWYoc3RybmNtcChzZWNzdHJpbmdzICsgc2VjaGRyc1tpXS5zaF9uYW1lLAotCQkJICAgIi5yZWxhLmluaXQiLCAxMCkgPT0gMCkKLQkJCWluaXRfc3R1YnMgKz0gY291bnRfc3R1YnMocmVscywgbnJlbHMpOwotCQllbHNlCi0JCQlzdHVicyArPSBjb3VudF9zdHVicyhyZWxzLCBucmVscyk7CisKKwkJLyogWFhYOiBCeSBzb3J0aW5nIHRoZSByZWxvY3MgYW5kIGZpbmRpbmcgZHVwbGljYXRlIGVudHJpZXMKKwkJICogIHdlIGNvdWxkIHJlZHVjZSB0aGUgbnVtYmVyIG9mIG5lY2Vzc2FyeSBzdHVicyBhbmQgc2F2ZQorCQkgKiAgc29tZSBtZW1vcnkuICovCisJCWNvdW50ID0gY291bnRfc3R1YnMocmVscywgbnJlbHMpOworCQlpZiAoIWNvdW50KQorCQkJY29udGludWU7CisKKwkJLyogc28gd2UgbmVlZCByZWxvY2F0aW9uIHN0dWJzLiByZXNlcnZlIG5lY2Vzc2FyeSBtZW1vcnkuICovCisJCS8qIHNoX2luZm8gZ2l2ZXMgdGhlIHNlY3Rpb24gZm9yIHdoaWNoIHdlIG5lZWQgdG8gYWRkIHN0dWJzLiAqLworCQlzID0gc2VjaGRyc1tpXS5zaF9pbmZvOworCisJCS8qIGVhY2ggY29kZSBzZWN0aW9uIHNob3VsZCBvbmx5IGhhdmUgb25lIHJlbG9jYXRpb24gc2VjdGlvbiAqLworCQlXQVJOX09OKG1lLT5hcmNoLnNlY3Rpb25bc10uc3R1Yl9lbnRyaWVzKTsKKworCQkvKiBzdG9yZSBudW1iZXIgb2Ygc3R1YnMgd2UgbmVlZCBmb3IgdGhpcyBzZWN0aW9uICovCisJCW1lLT5hcmNoLnNlY3Rpb25bc10uc3R1Yl9lbnRyaWVzICs9IGNvdW50OwogCX0KIAogCS8qIGFsaWduIHRoaW5ncyBhIGJpdCAqLwpAQCAtMzA2LDE4ICszNDgsOCBAQAogCW1lLT5hcmNoLmZkZXNjX29mZnNldCA9IG1lLT5jb3JlX3NpemU7CiAJbWUtPmNvcmVfc2l6ZSArPSBmZGVzY3MgKiBzaXplb2YoRWxmX0ZkZXNjKTsKIAotCW1lLT5jb3JlX3NpemUgPSBBTElHTihtZS0+Y29yZV9zaXplLCAxNik7Ci0JbWUtPmFyY2guc3R1Yl9vZmZzZXQgPSBtZS0+Y29yZV9zaXplOwotCW1lLT5jb3JlX3NpemUgKz0gc3R1YnMgKiBzaXplb2Yoc3RydWN0IHN0dWJfZW50cnkpOwotCi0JbWUtPmluaXRfc2l6ZSA9IEFMSUdOKG1lLT5pbml0X3NpemUsIDE2KTsKLQltZS0+YXJjaC5pbml0X3N0dWJfb2Zmc2V0ID0gbWUtPmluaXRfc2l6ZTsKLQltZS0+aW5pdF9zaXplICs9IGluaXRfc3R1YnMgKiBzaXplb2Yoc3RydWN0IHN0dWJfZW50cnkpOwotCiAJbWUtPmFyY2guZ290X21heCA9IGdvdHM7CiAJbWUtPmFyY2guZmRlc2NfbWF4ID0gZmRlc2NzOwotCW1lLT5hcmNoLnN0dWJfbWF4ID0gc3R1YnM7Ci0JbWUtPmFyY2guaW5pdF9zdHViX21heCA9IGluaXRfc3R1YnM7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTM4MCwyMyArNDEyLDI3IEBACiB9OwogCiBzdGF0aWMgRWxmX0FkZHIgZ2V0X3N0dWIoc3RydWN0IG1vZHVsZSAqbWUsIHVuc2lnbmVkIGxvbmcgdmFsdWUsIGxvbmcgYWRkZW5kLAotCWVudW0gZWxmX3N0dWJfdHlwZSBzdHViX3R5cGUsIGludCBpbml0X3NlY3Rpb24pCisJZW51bSBlbGZfc3R1Yl90eXBlIHN0dWJfdHlwZSwgRWxmX0FkZHIgbG9jMCwgdW5zaWduZWQgaW50IHRhcmdldHNlYykKIHsKLQl1bnNpZ25lZCBsb25nIGk7CiAJc3RydWN0IHN0dWJfZW50cnkgKnN0dWI7CiAKLQlpZihpbml0X3NlY3Rpb24pIHsKLQkJaSA9IG1lLT5hcmNoLmluaXRfc3R1Yl9jb3VudCsrOwotCQlCVUdfT04obWUtPmFyY2guaW5pdF9zdHViX2NvdW50ID4gbWUtPmFyY2guaW5pdF9zdHViX21heCk7Ci0JCXN0dWIgPSBtZS0+bW9kdWxlX2luaXQgKyBtZS0+YXJjaC5pbml0X3N0dWJfb2Zmc2V0ICsgCi0JCQlpICogc2l6ZW9mKHN0cnVjdCBzdHViX2VudHJ5KTsKLQl9IGVsc2UgewotCQlpID0gbWUtPmFyY2guc3R1Yl9jb3VudCsrOwotCQlCVUdfT04obWUtPmFyY2guc3R1Yl9jb3VudCA+IG1lLT5hcmNoLnN0dWJfbWF4KTsKLQkJc3R1YiA9IG1lLT5tb2R1bGVfY29yZSArIG1lLT5hcmNoLnN0dWJfb2Zmc2V0ICsgCi0JCQlpICogc2l6ZW9mKHN0cnVjdCBzdHViX2VudHJ5KTsKKwkvKiBpbml0aWFsaXplIHN0dWJfb2Zmc2V0IHRvIHBvaW50IGluIGZyb250IG9mIHRoZSBzZWN0aW9uICovCisJaWYgKCFtZS0+YXJjaC5zZWN0aW9uW3RhcmdldHNlY10uc3R1Yl9vZmZzZXQpIHsKKwkJbG9jMCAtPSAobWUtPmFyY2guc2VjdGlvblt0YXJnZXRzZWNdLnN0dWJfZW50cmllcyArIDEpICoKKwkJCQlzaXplb2Yoc3RydWN0IHN0dWJfZW50cnkpOworCQkvKiBnZXQgY29ycmVjdCBhbGlnbm1lbnQgZm9yIHRoZSBzdHVicyAqLworCQlsb2MwID0gQUxJR04obG9jMCwgc2l6ZW9mKHN0cnVjdCBzdHViX2VudHJ5KSk7CisJCW1lLT5hcmNoLnNlY3Rpb25bdGFyZ2V0c2VjXS5zdHViX29mZnNldCA9IGxvYzA7CiAJfQogCisJLyogZ2V0IGFkZHJlc3Mgb2Ygc3R1YiBlbnRyeSAqLworCXN0dWIgPSAodm9pZCAqKSBtZS0+YXJjaC5zZWN0aW9uW3RhcmdldHNlY10uc3R1Yl9vZmZzZXQ7CisJbWUtPmFyY2guc2VjdGlvblt0YXJnZXRzZWNdLnN0dWJfb2Zmc2V0ICs9IHNpemVvZihzdHJ1Y3Qgc3R1Yl9lbnRyeSk7CisKKwkvKiBkbyBub3Qgd3JpdGUgb3V0c2lkZSBhdmFpbGFibGUgc3R1YiBhcmVhICovCisJQlVHX09OKDAgPT0gbWUtPmFyY2guc2VjdGlvblt0YXJnZXRzZWNdLnN0dWJfZW50cmllcy0tKTsKKworCiAjaWZuZGVmIENPTkZJR182NEJJVAogLyogZm9yIDMyLWJpdCB0aGUgc3R1YiBsb29rcyBsaWtlIHRoaXM6CiAgKiAJbGRpbCBMJ1hYWCwlcjEKQEAgLTQ4OSwxNSArNTI1LDE5IEBACiAJRWxmMzJfQWRkciB2YWw7CiAJRWxmMzJfU3dvcmQgYWRkZW5kOwogCUVsZjMyX0FkZHIgZG90OworCUVsZl9BZGRyIGxvYzA7CisJdW5zaWduZWQgaW50IHRhcmdldHNlYyA9IHNlY2hkcnNbcmVsc2VjXS5zaF9pbmZvOwogCS8vdW5zaWduZWQgbG9uZyBkcCA9ICh1bnNpZ25lZCBsb25nKSRnbG9iYWwkOwogCXJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgZHAgYXNtICgicjI3Iik7CiAKIAlERUJVR1AoIkFwcGx5aW5nIHJlbG9jYXRlIHNlY3Rpb24gJXUgdG8gJXVcbiIsIHJlbHNlYywKLQkgICAgICAgc2VjaGRyc1tyZWxzZWNdLnNoX2luZm8pOworCSAgICAgICB0YXJnZXRzZWMpOwogCWZvciAoaSA9IDA7IGkgPCBzZWNoZHJzW3JlbHNlY10uc2hfc2l6ZSAvIHNpemVvZigqcmVsKTsgaSsrKSB7CiAJCS8qIFRoaXMgaXMgd2hlcmUgdG8gbWFrZSB0aGUgY2hhbmdlICovCi0JCWxvYyA9ICh2b2lkICopc2VjaGRyc1tzZWNoZHJzW3JlbHNlY10uc2hfaW5mb10uc2hfYWRkcgorCQlsb2MgPSAodm9pZCAqKXNlY2hkcnNbdGFyZ2V0c2VjXS5zaF9hZGRyCiAJCSAgICAgICsgcmVsW2ldLnJfb2Zmc2V0OworCQkvKiBUaGlzIGlzIHRoZSBzdGFydCBvZiB0aGUgdGFyZ2V0IHNlY3Rpb24gKi8KKwkJbG9jMCA9IHNlY2hkcnNbdGFyZ2V0c2VjXS5zaF9hZGRyOwogCQkvKiBUaGlzIGlzIHRoZSBzeW1ib2wgaXQgaXMgcmVmZXJyaW5nIHRvICovCiAJCXN5bSA9IChFbGYzMl9TeW0gKilzZWNoZHJzW3N5bWluZGV4XS5zaF9hZGRyCiAJCQkrIEVMRjMyX1JfU1lNKHJlbFtpXS5yX2luZm8pOwpAQCAtNTY5LDE5ICs2MDksMzIgQEAKIAkJCWJyZWFrOwogCQljYXNlIFJfUEFSSVNDX1BDUkVMMTdGOgogCQkJLyogMTctYml0IFBDIHJlbGF0aXZlIGFkZHJlc3MgKi8KLQkJCXZhbCA9IGdldF9zdHViKG1lLCB2YWwsIGFkZGVuZCwgRUxGX1NUVUJfR09ULCBpbl9pbml0KG1lLCBsb2MpKTsKKwkJCS8qIGNhbGN1bGF0ZSBkaXJlY3QgY2FsbCBvZmZzZXQgKi8KKwkJCXZhbCArPSBhZGRlbmQ7CiAJCQl2YWwgPSAodmFsIC0gZG90IC0gOCkvNDsKLQkJCUNIRUNLX1JFTE9DKHZhbCwgMTcpCisJCQlpZiAoIVJFTE9DX1JFQUNIQUJMRSh2YWwsIDE3KSkgeworCQkJCS8qIGRpcmVjdCBkaXN0YW5jZSB0b28gZmFyLCBjcmVhdGUKKwkJCQkgKiBzdHViIGVudHJ5IGluc3RlYWQgKi8KKwkJCQl2YWwgPSBnZXRfc3R1YihtZSwgc3ltLT5zdF92YWx1ZSwgYWRkZW5kLAorCQkJCQlFTEZfU1RVQl9ESVJFQ1QsIGxvYzAsIHRhcmdldHNlYyk7CisJCQkJdmFsID0gKHZhbCAtIGRvdCAtIDgpLzQ7CisJCQkJQ0hFQ0tfUkVMT0ModmFsLCAxNyk7CisJCQl9CiAJCQkqbG9jID0gKCpsb2MgJiB+MHgxZjFmZmQpIHwgcmVhc3NlbWJsZV8xNyh2YWwpOwogCQkJYnJlYWs7CiAJCWNhc2UgUl9QQVJJU0NfUENSRUwyMkY6CiAJCQkvKiAyMi1iaXQgUEMgcmVsYXRpdmUgYWRkcmVzczsgb25seSBkZWZpbmVkIGZvciBwYTIwICovCi0JCQl2YWwgPSBnZXRfc3R1YihtZSwgdmFsLCBhZGRlbmQsIEVMRl9TVFVCX0dPVCwgaW5faW5pdChtZSwgbG9jKSk7Ci0JCQlERUJVR1AoIlNUVUIgRk9SICVzIGxvYyAlbHgrJWx4IGF0ICVseFxuIiwgCi0JCQkgICAgICAgc3RydGFiICsgc3ltLT5zdF9uYW1lLCAodW5zaWduZWQgbG9uZylsb2MsIGFkZGVuZCwgCi0JCQkgICAgICAgdmFsKQorCQkJLyogY2FsY3VsYXRlIGRpcmVjdCBjYWxsIG9mZnNldCAqLworCQkJdmFsICs9IGFkZGVuZDsKIAkJCXZhbCA9ICh2YWwgLSBkb3QgLSA4KS80OwotCQkJQ0hFQ0tfUkVMT0ModmFsLCAyMik7CisJCQlpZiAoIVJFTE9DX1JFQUNIQUJMRSh2YWwsIDIyKSkgeworCQkJCS8qIGRpcmVjdCBkaXN0YW5jZSB0b28gZmFyLCBjcmVhdGUKKwkJCQkgKiBzdHViIGVudHJ5IGluc3RlYWQgKi8KKwkJCQl2YWwgPSBnZXRfc3R1YihtZSwgc3ltLT5zdF92YWx1ZSwgYWRkZW5kLAorCQkJCQlFTEZfU1RVQl9ESVJFQ1QsIGxvYzAsIHRhcmdldHNlYyk7CisJCQkJdmFsID0gKHZhbCAtIGRvdCAtIDgpLzQ7CisJCQkJQ0hFQ0tfUkVMT0ModmFsLCAyMik7CisJCQl9CiAJCQkqbG9jID0gKCpsb2MgJiB+MHgzZmYxZmZkKSB8IHJlYXNzZW1ibGVfMjIodmFsKTsKIAkJCWJyZWFrOwogCkBAIC02MTAsMTMgKzY2MywxNyBAQAogCUVsZjY0X0FkZHIgdmFsOwogCUVsZjY0X1N4d29yZCBhZGRlbmQ7CiAJRWxmNjRfQWRkciBkb3Q7CisJRWxmX0FkZHIgbG9jMDsKKwl1bnNpZ25lZCBpbnQgdGFyZ2V0c2VjID0gc2VjaGRyc1tyZWxzZWNdLnNoX2luZm87CiAKIAlERUJVR1AoIkFwcGx5aW5nIHJlbG9jYXRlIHNlY3Rpb24gJXUgdG8gJXVcbiIsIHJlbHNlYywKLQkgICAgICAgc2VjaGRyc1tyZWxzZWNdLnNoX2luZm8pOworCSAgICAgICB0YXJnZXRzZWMpOwogCWZvciAoaSA9IDA7IGkgPCBzZWNoZHJzW3JlbHNlY10uc2hfc2l6ZSAvIHNpemVvZigqcmVsKTsgaSsrKSB7CiAJCS8qIFRoaXMgaXMgd2hlcmUgdG8gbWFrZSB0aGUgY2hhbmdlICovCi0JCWxvYyA9ICh2b2lkICopc2VjaGRyc1tzZWNoZHJzW3JlbHNlY10uc2hfaW5mb10uc2hfYWRkcgorCQlsb2MgPSAodm9pZCAqKXNlY2hkcnNbdGFyZ2V0c2VjXS5zaF9hZGRyCiAJCSAgICAgICsgcmVsW2ldLnJfb2Zmc2V0OworCQkvKiBUaGlzIGlzIHRoZSBzdGFydCBvZiB0aGUgdGFyZ2V0IHNlY3Rpb24gKi8KKwkJbG9jMCA9IHNlY2hkcnNbdGFyZ2V0c2VjXS5zaF9hZGRyOwogCQkvKiBUaGlzIGlzIHRoZSBzeW1ib2wgaXQgaXMgcmVmZXJyaW5nIHRvICovCiAJCXN5bSA9IChFbGY2NF9TeW0gKilzZWNoZHJzW3N5bWluZGV4XS5zaF9hZGRyCiAJCQkrIEVMRjY0X1JfU1lNKHJlbFtpXS5yX2luZm8pOwpAQCAtNjcyLDQyICs3MjksNDAgQEAKIAkJCURFQlVHUCgiUENSRUwyMkYgU3ltYm9sICVzIGxvYyAlcCB2YWwgJWx4XG4iLAogCQkJICAgICAgIHN0cnRhYiArIHN5bS0+c3RfbmFtZSwKIAkJCSAgICAgICBsb2MsIHZhbCk7CisJCQl2YWwgKz0gYWRkZW5kOwogCQkJLyogY2FuIHdlIHJlYWNoIGl0IGxvY2FsbHk/ICovCi0JCQlpZighaW5fbG9jYWxfc2VjdGlvbihtZSwgKHZvaWQgKil2YWwsICh2b2lkICopZG90KSkgewotCi0JCQkJaWYgKGluX2xvY2FsKG1lLCAodm9pZCAqKXZhbCkpCi0JCQkJCS8qIHRoaXMgaXMgdGhlIGNhc2Ugd2hlcmUgdGhlCi0JCQkJCSAqIHN5bWJvbCBpcyBsb2NhbCB0byB0aGUKLQkJCQkJICogbW9kdWxlLCBidXQgaW4gYSBkaWZmZXJlbnQKLQkJCQkJICogc2VjdGlvbiwgc28gc3R1YiB0aGUganVtcAotCQkJCQkgKiBpbiBjYXNlIGl0J3MgbW9yZSB0aGFuIDIyCi0JCQkJCSAqIGJpdHMgYXdheSAqLwotCQkJCQl2YWwgPSBnZXRfc3R1YihtZSwgdmFsLCBhZGRlbmQsIEVMRl9TVFVCX0RJUkVDVCwKLQkJCQkJCSAgICAgICBpbl9pbml0KG1lLCBsb2MpKTsKLQkJCQllbHNlIGlmIChzdHJuY21wKHN0cnRhYiArIHN5bS0+c3RfbmFtZSwgIiQkIiwgMikKKwkJCWlmIChpbl9sb2NhbChtZSwgKHZvaWQgKil2YWwpKSB7CisJCQkJLyogdGhpcyBpcyB0aGUgY2FzZSB3aGVyZSB0aGUgc3ltYm9sIGlzIGxvY2FsCisJCQkJICogdG8gdGhlIG1vZHVsZSwgYnV0IGluIGEgZGlmZmVyZW50IHNlY3Rpb24sCisJCQkJICogc28gc3R1YiB0aGUganVtcCBpbiBjYXNlIGl0J3MgbW9yZSB0aGFuIDIyCisJCQkJICogYml0cyBhd2F5ICovCisJCQkJdmFsID0gKHZhbCAtIGRvdCAtIDgpLzQ7CisJCQkJaWYgKCFSRUxPQ19SRUFDSEFCTEUodmFsLCAyMikpIHsKKwkJCQkJLyogZGlyZWN0IGRpc3RhbmNlIHRvbyBmYXIsIGNyZWF0ZQorCQkJCQkgKiBzdHViIGVudHJ5IGluc3RlYWQgKi8KKwkJCQkJdmFsID0gZ2V0X3N0dWIobWUsIHN5bS0+c3RfdmFsdWUsCisJCQkJCQlhZGRlbmQsIEVMRl9TVFVCX0RJUkVDVCwKKwkJCQkJCWxvYzAsIHRhcmdldHNlYyk7CisJCQkJfSBlbHNlIHsKKwkJCQkJLyogT2ssIHdlIGNhbiByZWFjaCBpdCBkaXJlY3RseS4gKi8KKwkJCQkJdmFsID0gc3ltLT5zdF92YWx1ZTsKKwkJCQkJdmFsICs9IGFkZGVuZDsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCXZhbCA9IHN5bS0+c3RfdmFsdWU7CisJCQkJaWYgKHN0cm5jbXAoc3RydGFiICsgc3ltLT5zdF9uYW1lLCAiJCQiLCAyKQogCQkJCSAgICA9PSAwKQogCQkJCQl2YWwgPSBnZXRfc3R1YihtZSwgdmFsLCBhZGRlbmQsIEVMRl9TVFVCX01JTExJLAotCQkJCQkJICAgICAgIGluX2luaXQobWUsIGxvYykpOworCQkJCQkJICAgICAgIGxvYzAsIHRhcmdldHNlYyk7CiAJCQkJZWxzZQogCQkJCQl2YWwgPSBnZXRfc3R1YihtZSwgdmFsLCBhZGRlbmQsIEVMRl9TVFVCX0dPVCwKLQkJCQkJCSAgICAgICBpbl9pbml0KG1lLCBsb2MpKTsKKwkJCQkJCSAgICAgICBsb2MwLCB0YXJnZXRzZWMpOwogCQkJfQogCQkJREVCVUdQKCJTVFVCIEZPUiAlcyBsb2MgJWx4LCB2YWwgJWx4KyVseCBhdCAlbHhcbiIsIAogCQkJICAgICAgIHN0cnRhYiArIHN5bS0+c3RfbmFtZSwgbG9jLCBzeW0tPnN0X3ZhbHVlLAogCQkJICAgICAgIGFkZGVuZCwgdmFsKTsKLQkJCS8qIEZJWE1FOiBsb2NhbCBzeW1ib2xzIHdvcmsgYXMgbG9uZyBhcyB0aGUKLQkJCSAqIGNvcmUgYW5kIGluaXQgcGllY2VzIGFyZW4ndCBzZXBhcmF0ZWQgdG9vCi0JCQkgKiBmYXIuICBJZiB0aGlzIGlzIGV2ZXIgYnJva2VuLCB5b3Ugd2lsbCB0cmlwCi0JCQkgKiB0aGUgY2hlY2sgYmVsb3cuICBUaGUgd2F5IHRvIGZpeCBpdCB3b3VsZAotCQkJICogYmUgdG8gZ2VuZXJhdGUgbG9jYWwgc3R1YnMgdG8gZ28gYmV0d2VlbiBpbml0Ci0JCQkgKiBhbmQgY29yZSAqLwotCQkJaWYoKEVsZjY0X1N4d29yZCkodmFsIC0gZG90IC0gOCkgPiAweDgwMDAwMCAtMSB8fAotCQkJICAgKEVsZjY0X1N4d29yZCkodmFsIC0gZG90IC0gOCkgPCAtMHg4MDAwMDApIHsKLQkJCQlwcmludGsoS0VSTl9FUlIgIk1vZHVsZSAlcywgc3ltYm9sICVzIGlzIG91dCBvZiByYW5nZSBmb3IgUENSRUwyMkYgcmVsb2NhdGlvblxuIiwKLQkJCQkgICAgICAgbWUtPm5hbWUsIHN0cnRhYiArIHN5bS0+c3RfbmFtZSk7Ci0JCQkJcmV0dXJuIC1FTk9FWEVDOwotCQkJfQogCQkJdmFsID0gKHZhbCAtIGRvdCAtIDgpLzQ7CisJCQlDSEVDS19SRUxPQyh2YWwsIDIyKTsKIAkJCSpsb2MgPSAoKmxvYyAmIH4weDNmZjFmZmQpIHwgcmVhc3NlbWJsZV8yMih2YWwpOwogCQkJYnJlYWs7CiAJCWNhc2UgUl9QQVJJU0NfRElSNjQ6CkBAIC03OTQsMTIgKzg0OSw4IEBACiAJYWRkciA9ICh1MzIgKillbnRyeS0+YWRkcjsKIAlwcmludGsoIklOU05TOiAleCAleCAleCAleFxuIiwKIAkgICAgICAgYWRkclswXSwgYWRkclsxXSwgYWRkclsyXSwgYWRkclszXSk7Ci0JcHJpbnRrKCJzdHVicyB1c2VkICVsZCwgc3R1YnMgbWF4ICVsZFxuIgotCSAgICAgICAiaW5pdF9zdHVicyB1c2VkICVsZCwgaW5pdCBzdHVicyBtYXggJWxkXG4iCi0JICAgICAgICJnb3QgZW50cmllcyB1c2VkICVsZCwgZ290cyBtYXggJWxkXG4iCisJcHJpbnRrKCJnb3QgZW50cmllcyB1c2VkICVsZCwgZ290cyBtYXggJWxkXG4iCiAJICAgICAgICJmZGVzY3MgdXNlZCAlbGQsIGZkZXNjcyBtYXggJWxkXG4iLAotCSAgICAgICBtZS0+YXJjaC5zdHViX2NvdW50LCBtZS0+YXJjaC5zdHViX21heCwKLQkgICAgICAgbWUtPmFyY2guaW5pdF9zdHViX2NvdW50LCBtZS0+YXJjaC5pbml0X3N0dWJfbWF4LAogCSAgICAgICBtZS0+YXJjaC5nb3RfY291bnQsIG1lLT5hcmNoLmdvdF9tYXgsCiAJICAgICAgIG1lLT5hcmNoLmZkZXNjX2NvdW50LCBtZS0+YXJjaC5mZGVzY19tYXgpOwogI2VuZGlmCkBAIC04MjksNyArODgwLDEwIEBACiAJCQkJbWUtPm5hbWUsIG1lLT5hcmNoLmdvdF9jb3VudCwgTUFYX0dPVFMpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9Ci0JCisKKwlrZnJlZShtZS0+YXJjaC5zZWN0aW9uKTsKKwltZS0+YXJjaC5zZWN0aW9uID0gTlVMTDsKKwogCS8qIG5vIHN5bWJvbCB0YWJsZSAqLwogCWlmKHN5bWhkciA9PSBOVUxMKQogCQlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9LY29uZmlnIGIvYXJjaC9wb3dlcnBjL0tjb25maWcKaW5kZXggNzlmMjVjZS4uODRiODYxMyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL0tjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL0tjb25maWcKQEAgLTEwOCw2ICsxMDgsOCBAQAogY29uZmlnIFBQQwogCWJvb2wKIAlkZWZhdWx0IHkKKwlzZWxlY3QgSEFWRV9GVFJBQ0VfTUNPVU5UX1JFQ09SRAorCXNlbGVjdCBIQVZFX0RZTkFNSUNfRlRSQUNFCiAJc2VsZWN0IEhBVkVfRlVOQ1RJT05fVFJBQ0VSCiAJc2VsZWN0IEFSQ0hfV0FOVF9PUFRJT05BTF9HUElPTElCCiAJc2VsZWN0IEhBVkVfSURFCkBAIC0zMjYsNyArMzI4LDggQEAKIAogY29uZmlnIENSQVNIX0RVTVAKIAlib29sICJCdWlsZCBhIGtkdW1wIGNyYXNoIGtlcm5lbCIKLQlkZXBlbmRzIG9uIChQUEM2NCAmJiBSRUxPQ0FUQUJMRSkgfHwgNnh4CisJZGVwZW5kcyBvbiBQUEM2NCB8fCA2eHgKKwlzZWxlY3QgUkVMT0NBVEFCTEUgaWYgUFBDNjQKIAloZWxwCiAJICBCdWlsZCBhIGtlcm5lbCBzdWl0YWJsZSBmb3IgdXNlIGFzIGEga2R1bXAgY2FwdHVyZSBrZXJuZWwuCiAJICBUaGUgc2FtZSBrZXJuZWwgYmluYXJ5IGNhbiBiZSB1c2VkIGFzIHByb2R1Y3Rpb24ga2VybmVsIGFuZCBkdW1wCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9NYWtlZmlsZSBiL2FyY2gvcG93ZXJwYy9ib290L01ha2VmaWxlCmluZGV4IGYzMjgyOTkuLmU4NGRmMzMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L01ha2VmaWxlCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L01ha2VmaWxlCkBAIC0yMDgsNyArMjA4LDcgQEAKICMKICMgVGhlc2VzIGFyZSBkZWZhdWx0IHRhcmdldHMgdG8gYnVpbGQgaW1hZ2VzIHdoaWNoIGVtYmVkIGRldmljZSB0cmVlIGJsb2JzLgogIyBUaGV5IGFyZSBvbmx5IHJlcXVpcmVkIG9uIGJvYXJkcyB3aGljaCBkbyBub3QgaGF2ZSBGRFQgc3VwcG9ydCBpbiBmaXJtd2FyZS4KLSMgQm9hcmRzIHdpdGggbmV3aXNoIHUtYm9vdCBmaXJtYXJlIGNhbiB1c2UgdGhlIHVJbWFnZSB0YXJnZXQgYWJvdmUKKyMgQm9hcmRzIHdpdGggbmV3aXNoIHUtYm9vdCBmaXJtd2FyZSBjYW4gdXNlIHRoZSB1SW1hZ2UgdGFyZ2V0IGFib3ZlCiAjCiAKICMgQm9hcmQgcG9ydHMgaW4gYXJjaC9wb3dlcnBjL3BsYXRmb3JtLzQweC9LY29uZmlnCkBAIC0zNTYsNyArMzU2LDcgQEAKIAlAcm0gLWYgJEA7IGxuICQ8ICRACiAKIGluc3RhbGw6ICQoQ09ORklHVVJFKSAkKGFkZHByZWZpeCAkKG9iaikvLCAkKGltYWdlLXkpKQotCXNoIC14ICQoc3JjdHJlZSkvJChzcmMpL2luc3RhbGwuc2ggIiQoS0VSTkVMUkVMRUFTRSkiIHZtbGludXggU3lzdGVtLm1hcCAiJChJTlNUQUxMX1BBVEgpIiAkPAorCXNoIC14ICQoc3JjdHJlZSkvJChzcmMpL2luc3RhbGwuc2ggIiQoS0VSTkVMUkVMRUFTRSkiIHZtbGludXggU3lzdGVtLm1hcCAiJChJTlNUQUxMX1BBVEgpIiAkXgogCiAjIGFueXRoaW5nIG5vdCBpbiAkKHRhcmdldHMpCiBjbGVhbi1maWxlcyArPSAkKGltYWdlLSkgJChpbml0cmQtKSBjdUltYWdlLiogZHRiSW1hZ2UuKiB0cmVlSW1hZ2UuKiBcCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODM2eF9tZHMuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgzNnhfbWRzLmR0cwppbmRleCAxNDUzNGQwLi42ZTM0ZjE3IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODM2eF9tZHMuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4MzZ4X21kcy5kdHMKQEAgLTY5LDggKzY5LDE4IEBACiAJCX07CiAKIAkJYmNzckAxLDAgeworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwxPjsKICAJCQljb21wYXRpYmxlID0gImZzbCxtcGM4MzYwbWRzLWJjc3IiOwogCQkJcmVnID0gPDEgMCAweDgwMDA+OworCQkJcmFuZ2VzID0gPDAgMSAwIDB4ODAwMD47CisKKwkJCWJjc3IxMzogZ3Bpby1jb250cm9sbGVyQGQgeworCQkJCSNncGlvLWNlbGxzID0gPDI+OworCQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzgzNjBtZHMtYmNzci1ncGlvIjsKKwkJCQlyZWcgPSA8MHhkIDE+OworCQkJCWdwaW8tY29udHJvbGxlcjsKKwkJCX07CiAJCX07CiAJfTsKIApAQCAtMTk1LDEwICsyMDUsMjEgQEAKIAkJfTsKIAogCQlwYXJfaW9AMTQwMCB7CisJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCSNzaXplLWNlbGxzID0gPDE+OwogCQkJcmVnID0gPDB4MTQwMCAweDEwMD47CisJCQlyYW5nZXMgPSA8MCAweDE0MDAgMHgxMDA+OwogCQkJZGV2aWNlX3R5cGUgPSAicGFyX2lvIjsKIAkJCW51bS1wb3J0cyA9IDw3PjsKIAorCQkJcWVfcGlvX2I6IGdwaW8tY29udHJvbGxlckAxOCB7CisJCQkJI2dwaW8tY2VsbHMgPSA8Mj47CisJCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODM2MC1xZS1wYXJpby1iYW5rIiwKKwkJCQkJICAgICAiZnNsLG1wYzgzMjMtcWUtcGFyaW8tYmFuayI7CisJCQkJcmVnID0gPDB4MTggMHgxOD47CisJCQkJZ3Bpby1jb250cm9sbGVyOworCQkJfTsKKwogCQkJcGlvMTogdWNjX3BpbkAwMSB7CiAJCQkJcGlvLW1hcCA9IDwKIAkJCS8qIHBvcnQgIHBpbiAgZGlyICBvcGVuX2RyYWluICBhc3NpZ25tZW50ICBoYXNfaXJxICovCkBAIC0yODIsNiArMzAzLDE1IEBACiAJCQl9OwogCQl9OwogCisJCXRpbWVyQDQ0MCB7CisJCQljb21wYXRpYmxlID0gImZzbCxtcGM4MzYwLXFlLWd0bSIsCisJCQkJICAgICAiZnNsLHFlLWd0bSIsICJmc2wsZ3RtIjsKKwkJCXJlZyA9IDwweDQ0MCAweDQwPjsKKwkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwxMzIwMDAwMDA+OworCQkJaW50ZXJydXB0cyA9IDwxMiAxMyAxNCAxNT47CisJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZxZWljPjsKKwkJfTsKKwogCQlzcGlANGMwIHsKIAkJCWNlbGwtaW5kZXggPSA8MD47CiAJCQljb21wYXRpYmxlID0gImZzbCxzcGkiOwpAQCAtMzAxLDExICszMzEsMjAgQEAKIAkJfTsKIAogCQl1c2JANmMwIHsKLQkJCWNvbXBhdGlibGUgPSAicWVfdWRjIjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzgzNjAtcWUtdXNiIiwKKwkJCQkgICAgICJmc2wsbXBjODMyMy1xZS11c2IiOwogCQkJcmVnID0gPDB4NmMwIDB4NDAgMHg4YjAwIDB4MTAwPjsKIAkJCWludGVycnVwdHMgPSA8MTE+OwogCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmcWVpYz47Ci0JCQltb2RlID0gInNsYXZlIjsKKwkJCWZzbCxmdWxsc3BlZWQtY2xvY2sgPSAiY2xrMjEiOworCQkJZnNsLGxvd3NwZWVkLWNsb2NrID0gImJyZzkiOworCQkJZ3Bpb3MgPSA8JnFlX3Bpb19iICAyIDAgICAvKiBVU0JPRSAqLworCQkJCSAmcWVfcGlvX2IgIDMgMCAgIC8qIFVTQlRQICovCisJCQkJICZxZV9waW9fYiAgOCAwICAgLyogVVNCVE4gKi8KKwkJCQkgJnFlX3Bpb19iICA5IDAgICAvKiBVU0JSUCAqLworCQkJCSAmcWVfcGlvX2IgMTEgMCAgIC8qIFVTQlJOICovCisJCQkJICZiY3NyMTMgICAgNSAwICAgLyogU1BFRUQgKi8KKwkJCQkgJmJjc3IxMyAgICA0IDE+OyAvKiBQT1dFUiAqLwogCQl9OwogCiAJCWVuZXQwOiB1Y2NAMjAwMCB7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODM2eF9yZGsuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgzNnhfcmRrLmR0cwppbmRleCBkZWNhZGYzLi4zN2I3ODk1IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODM2eF9yZGsuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4MzZ4X3Jkay5kdHMKQEAgLTIxOCw4ICsyMTgsMjMgQEAKIAkJCQlyZWcgPSA8MHg0NDAgMHg0MD47CiAJCQkJaW50ZXJydXB0cyA9IDwxMiAxMyAxNCAxNT47CiAJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmcWVpYz47Ci0JCQkJLyogZmlsbGVkIGJ5IHUtYm9vdCAqLwotCQkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsKKwkJCQljbG9jay1mcmVxdWVuY3kgPSA8MTY2NjY2NjY2PjsKKwkJCX07CisKKwkJCXVzYkA2YzAgeworCQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzgzNjAtcWUtdXNiIiwKKwkJCQkJICAgICAiZnNsLG1wYzgzMjMtcWUtdXNiIjsKKwkJCQlyZWcgPSA8MHg2YzAgMHg0MCAweDhiMDAgMHgxMDA+OworCQkJCWludGVycnVwdHMgPSA8MTE+OworCQkJCWludGVycnVwdC1wYXJlbnQgPSA8JnFlaWM+OworCQkJCWZzbCxmdWxsc3BlZWQtY2xvY2sgPSAiY2xrMjEiOworCQkJCWdwaW9zID0gPCZxZV9waW9fYiAgMiAwIC8qIFVTQk9FICovCisJCQkJCSAmcWVfcGlvX2IgIDMgMCAvKiBVU0JUUCAqLworCQkJCQkgJnFlX3Bpb19iICA4IDAgLyogVVNCVE4gKi8KKwkJCQkJICZxZV9waW9fYiAgOSAwIC8qIFVTQlJQICovCisJCQkJCSAmcWVfcGlvX2IgMTEgMCAvKiBVU0JSTiAqLworCQkJCQkgJnFlX3Bpb19lIDIwIDAgLyogU1BFRUQgKi8KKwkJCQkJICZxZV9waW9fZSAyMSAxIC8qIFBPV0VSICovPjsKIAkJCX07CiAKIAkJCXNwaUA0YzAgewpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg2NDFfaHBjbi5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODY0MV9ocGNuLmR0cwppbmRleCAzNWQ1ZTI0Li40NDgxNTMyIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODY0MV9ocGNuLmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODY0MV9ocGNuLmR0cwpAQCAtMjYsNyArMjYsMTMgQEAKIAkJc2VyaWFsMSA9ICZzZXJpYWwxOwogCQlwY2kwID0gJnBjaTA7CiAJCXBjaTEgPSAmcGNpMTsKLQkJcmFwaWRpbzAgPSAmcmFwaWRpbzA7CisvKgorICogT25seSBvbmUgb2YgUmFwaWQgSU8gb3IgUENJIGNhbiBiZSBwcmVzZW50IGR1ZSB0byBIVyBsaW1pdGF0aW9ucyBhbmQKKyAqIGR1ZSB0byB0aGUgZmFjdCB0aGF0IHRoZSAyIG5vdyBzaGFyZSBhZGRyZXNzIHNwYWNlIGluIHRoZSBuZXcgbWVtb3J5CisgKiBtYXAuICBUaGUgbW9zdCBsaWtlbHkgY2FzZSBpcyB0aGF0IHdlIGhhdmUgUENJLCBzbyBjb21tZW50IG91dCB0aGUKKyAqIHJhcGlkaW8gbm9kZS4gIExlYXZlIGl0IGhlcmUgZm9yIHJlZmVyZW5jZS4KKyAqLworCQkvKiByYXBpZGlvMCA9ICZyYXBpZGlvMDsgKi8KIAl9OwogCiAJY3B1cyB7CkBAIC02MiwxOCArNjgsMTcgQEAKIAkJcmVnID0gPDB4MDAwMDAwMDAgMHg0MDAwMDAwMD47CS8vIDFHIGF0IDB4MAogCX07CiAKLQlsb2NhbGJ1c0BmODAwNTAwMCB7CisJbG9jYWxidXNAZmZlMDUwMDAgewogCQkjYWRkcmVzcy1jZWxscyA9IDwyPjsKIAkJI3NpemUtY2VsbHMgPSA8MT47CiAJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg2NDEtbG9jYWxidXMiLCAic2ltcGxlLWJ1cyI7Ci0JCXJlZyA9IDwweGY4MDA1MDAwIDB4MTAwMD47CisJCXJlZyA9IDwweGZmZTA1MDAwIDB4MTAwMD47CiAJCWludGVycnVwdHMgPSA8MTkgMj47CiAJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwogCi0JCXJhbmdlcyA9IDwwIDAgMHhmZjgwMDAwMCAweDAwODAwMDAwCi0JCQkgIDEgMCAweGZlMDAwMDAwIDB4MDEwMDAwMDAKLQkJCSAgMiAwIDB4ZjgyMDAwMDAgMHgwMDEwMDAwMAotCQkJICAzIDAgMHhmODEwMDAwMCAweDAwMTAwMDAwPjsKKwkJcmFuZ2VzID0gPDAgMCAweGVmODAwMDAwIDB4MDA4MDAwMDAKKwkJCSAgMiAwIDB4ZmZkZjgwMDAgMHgwMDAwODAwMAorCQkJICAzIDAgMHhmZmRmMDAwMCAweDAwMDA4MDAwPjsKIAogCQlmbGFzaEAwLDAgewogCQkJY29tcGF0aWJsZSA9ICJjZmktZmxhc2giOwpAQCAtMTAzLDEzICsxMDgsMTMgQEAKIAkJfTsKIAl9OwogCi0Jc29jODY0MUBmODAwMDAwMCB7CisJc29jODY0MUBmZmUwMDAwMCB7CiAJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwogCQkjc2l6ZS1jZWxscyA9IDwxPjsKIAkJZGV2aWNlX3R5cGUgPSAic29jIjsKIAkJY29tcGF0aWJsZSA9ICJzaW1wbGUtYnVzIjsKLQkJcmFuZ2VzID0gPDB4MDAwMDAwMDAgMHhmODAwMDAwMCAweDAwMTAwMDAwPjsKLQkJcmVnID0gPDB4ZjgwMDAwMDAgMHgwMDAwMTAwMD47CS8vIENDU1JCQVIKKwkJcmFuZ2VzID0gPDB4MDAwMDAwMDAgMHhmZmUwMDAwMCAweDAwMTAwMDAwPjsKKwkJcmVnID0gPDB4ZmZlMDAwMDAgMHgwMDAwMTAwMD47CS8vIENDU1JCQVIKIAkJYnVzLWZyZXF1ZW5jeSA9IDwwPjsKIAogCQlpMmNAMzAwMCB7CkBAIC0zNDAsMTcgKzM0NSwxNyBAQAogCQl9OwogCX07CiAKLQlwY2kwOiBwY2llQGY4MDA4MDAwIHsKKwlwY2kwOiBwY2llQGZmZTA4MDAwIHsKIAkJY2VsbC1pbmRleCA9IDwwPjsKIAkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODY0MS1wY2llIjsKIAkJZGV2aWNlX3R5cGUgPSAicGNpIjsKIAkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKIAkJI3NpemUtY2VsbHMgPSA8Mj47CiAJCSNhZGRyZXNzLWNlbGxzID0gPDM+OwotCQlyZWcgPSA8MHhmODAwODAwMCAweDEwMDA+OworCQlyZWcgPSA8MHhmZmUwODAwMCAweDEwMDA+OwogCQlidXMtcmFuZ2UgPSA8MHgwIDB4ZmY+OwogCQlyYW5nZXMgPSA8MHgwMjAwMDAwMCAweDAgMHg4MDAwMDAwMCAweDgwMDAwMDAwIDB4MCAweDIwMDAwMDAwCi0JCQkgIDB4MDEwMDAwMDAgMHgwIDB4MDAwMDAwMDAgMHhlMjAwMDAwMCAweDAgMHgwMDEwMDAwMD47CisJCQkgIDB4MDEwMDAwMDAgMHgwIDB4MDAwMDAwMDAgMHhmZmMwMDAwMCAweDAgMHgwMDAxMDAwMD47CiAJCWNsb2NrLWZyZXF1ZW5jeSA9IDwzMzMzMzMzMz47CiAJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwogCQlpbnRlcnJ1cHRzID0gPDI0IDI+OwpAQCAtNDgxLDcgKzQ4Niw3IEBACiAKIAkJCQkgIDB4MDEwMDAwMDAgMHgwIDB4MDAwMDAwMDAKIAkJCQkgIDB4MDEwMDAwMDAgMHgwIDB4MDAwMDAwMDAKLQkJCQkgIDB4MCAweDAwMTAwMDAwPjsKKwkJCQkgIDB4MCAweDAwMDEwMDAwPjsKIAkJCXVsaTE1NzVAMCB7CiAJCQkJcmVnID0gPDAgMCAwIDAgMD47CiAJCQkJI3NpemUtY2VsbHMgPSA8Mj47CkBAIC00OTEsNyArNDk2LDcgQEAKIAkJCQkJICAweDAgMHgyMDAwMDAwMAogCQkJCQkgIDB4MDEwMDAwMDAgMHgwIDB4MDAwMDAwMDAKIAkJCQkJICAweDAxMDAwMDAwIDB4MCAweDAwMDAwMDAwCi0JCQkJCSAgMHgwIDB4MDAxMDAwMDA+OworCQkJCQkgIDB4MCAweDAwMDEwMDAwPjsKIAkJCQlpc2FAMWUgewogCQkJCQlkZXZpY2VfdHlwZSA9ICJpc2EiOwogCQkJCQkjaW50ZXJydXB0LWNlbGxzID0gPDI+OwpAQCAtNTQ5LDE3ICs1NTQsMTcgQEAKIAogCX07CiAKLQlwY2kxOiBwY2llQGY4MDA5MDAwIHsKKwlwY2kxOiBwY2llQGZmZTA5MDAwIHsKIAkJY2VsbC1pbmRleCA9IDwxPjsKIAkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODY0MS1wY2llIjsKIAkJZGV2aWNlX3R5cGUgPSAicGNpIjsKIAkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKIAkJI3NpemUtY2VsbHMgPSA8Mj47CiAJCSNhZGRyZXNzLWNlbGxzID0gPDM+OwotCQlyZWcgPSA8MHhmODAwOTAwMCAweDEwMDA+OworCQlyZWcgPSA8MHhmZmUwOTAwMCAweDEwMDA+OwogCQlidXMtcmFuZ2UgPSA8MCAweGZmPjsKIAkJcmFuZ2VzID0gPDB4MDIwMDAwMDAgMHgwIDB4YTAwMDAwMDAgMHhhMDAwMDAwMCAweDAgMHgyMDAwMDAwMAotCQkJICAweDAxMDAwMDAwIDB4MCAweDAwMDAwMDAwIDB4ZTMwMDAwMDAgMHgwIDB4MDAxMDAwMDA+OworCQkJICAweDAxMDAwMDAwIDB4MCAweDAwMDAwMDAwIDB4ZmZjMTAwMDAgMHgwIDB4MDAwMTAwMDA+OwogCQljbG9jay1mcmVxdWVuY3kgPSA8MzMzMzMzMzM+OwogCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKIAkJaW50ZXJydXB0cyA9IDwyNSAyPjsKQEAgLTU4MiwxOCArNTg3LDIxIEBACiAKIAkJCQkgIDB4MDEwMDAwMDAgMHgwIDB4MDAwMDAwMDAKIAkJCQkgIDB4MDEwMDAwMDAgMHgwIDB4MDAwMDAwMDAKLQkJCQkgIDB4MCAweDAwMTAwMDAwPjsKKwkJCQkgIDB4MCAweDAwMDEwMDAwPjsKIAkJfTsKIAl9OwotCXJhcGlkaW8wOiByYXBpZGlvQGY4MGMwMDAwIHsKKy8qCisJcmFwaWRpbzA6IHJhcGlkaW9AZmZlYzAwMDAgewogCQkjYWRkcmVzcy1jZWxscyA9IDwyPjsKIAkJI3NpemUtY2VsbHMgPSA8Mj47CiAJCWNvbXBhdGlibGUgPSAiZnNsLHJhcGlkaW8tZGVsdGEiOwotCQlyZWcgPSA8MHhmODBjMDAwMCAweDIwMDAwPjsKLQkJcmFuZ2VzID0gPDAgMCAweGMwMDAwMDAwIDAgMHgyMDAwMDAwMD47CisJCXJlZyA9IDwweGZmZWMwMDAwIDB4MjAwMDA+OworCQlyYW5nZXMgPSA8MCAwIDB4ODAwMDAwMDAgMCAweDIwMDAwMDAwPjsKIAkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCS8qIGVycl9pcnEgYmVsbF9vdXRiX2lycSBiZWxsX2luYl9pcnEKLQkJCW1zZzFfdHhfaXJxIG1zZzFfcnhfaXJxCW1zZzJfdHhfaXJxIG1zZzJfcnhfaXJxICovCisJCS8vIGVycl9pcnEgYmVsbF9vdXRiX2lycSBiZWxsX2luYl9pcnEKKwkJLy8JbXNnMV90eF9pcnEgbXNnMV9yeF9pcnEJbXNnMl90eF9pcnEgbXNnMl9yeF9pcnEKIAkJaW50ZXJydXB0cyA9IDw0OCAyIDQ5IDIgNTAgMiA1MyAyIDU0IDIgNTUgMiA1NiAyPjsKIAl9OworKi8KKwogfTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9zZXF1b2lhLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9zZXF1b2lhLmR0cwppbmRleCAzYjI5NWU4Li40M2NjNjhiIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvc2VxdW9pYS5kdHMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3NlcXVvaWEuZHRzCkBAIC0xMzQsNyArMTM0LDcgQEAKIAkJfTsKIAogCQlVU0IxOiB1c2JAZTAwMDA0MDAgewotCQkJY29tcGF0aWJsZSA9ICJvaGNpLWJlIjsKKwkJCWNvbXBhdGlibGUgPSAiaWJtLHVzYi1vaGNpLTQ0MGVweCIsICJvaGNpLWJlIjsKIAkJCXJlZyA9IDwweDAwMDAwMDAwIDB4ZTAwMDA0MDAgMHgwMDAwMDA2MD47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZVSUMwPjsKIAkJCWludGVycnVwdHMgPSA8MHgxNSAweDg+OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvaW5zdGFsbC5zaCBiL2FyY2gvcG93ZXJwYy9ib290L2luc3RhbGwuc2gKaW5kZXggYjAwMmJmZC4uNTFiMjM4NyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvaW5zdGFsbC5zaAorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9pbnN0YWxsLnNoCkBAIC0xNSw3ICsxNSw3IEBACiAjICAgJDIgLSBrZXJuZWwgaW1hZ2UgZmlsZQogIyAgICQzIC0ga2VybmVsIG1hcCBmaWxlCiAjICAgJDQgLSBkZWZhdWx0IGluc3RhbGwgcGF0aCAoYmxhbmsgaWYgcm9vdCBkaXJlY3RvcnkpCi0jICAgJDUgLSBrZXJuZWwgYm9vdCBmaWxlLCB0aGUgekltYWdlCisjICAgJDUgYW5kIG1vcmUgLSBrZXJuZWwgYm9vdCBmaWxlczsgekltYWdlKiwgdUltYWdlLCBjdUltYWdlLiosIGV0Yy4KICMKIAogIyBVc2VyIG1heSBoYXZlIGEgY3VzdG9tIGluc3RhbGwgc2NyaXB0CkBAIC0zOCwzICszOCwxNSBAQAogCiBjYXQgJDIgPiAkNC8kaW1hZ2VfbmFtZQogY3AgJDMgJDQvU3lzdGVtLm1hcAorCisjIENvcHkgYWxsIHRoZSBib290YWJsZSBpbWFnZSBmaWxlcworcGF0aD0kNAorc2hpZnQgNAord2hpbGUgWyAkIyAtbmUgMCBdOyBkbworCWltYWdlX25hbWU9YGJhc2VuYW1lICQxYAorCWlmIFsgLWYgJHBhdGgvJGltYWdlX25hbWUgXTsgdGhlbgorCQltdiAkcGF0aC8kaW1hZ2VfbmFtZSAkcGF0aC8kaW1hZ2VfbmFtZS5vbGQKKwlmaQorCWNhdCAkMSA+ICRwYXRoLyRpbWFnZV9uYW1lCisJc2hpZnQKK2RvbmU7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY29uZmlncy84NXh4L21wYzg1NzJfZHNfZGVmY29uZmlnIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvODV4eC9tcGM4NTcyX2RzX2RlZmNvbmZpZwppbmRleCA2MzU1ODgzLi4zMmFlYjc5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvY29uZmlncy84NXh4L21wYzg1NzJfZHNfZGVmY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9jb25maWdzLzg1eHgvbXBjODU3Ml9kc19kZWZjb25maWcKQEAgLTEsNyArMSw3IEBACiAjCiAjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0Ci0jIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMjgtcmMzCi0jIFNhdCBOb3YgIDggMTI6NDA6MTMgMjAwOAorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjI4LXJjOAorIyBUdWUgRGVjIDMwIDExOjE3OjQ2IDIwMDgKICMKICMgQ09ORklHX1BQQzY0IGlzIG5vdCBzZXQKIApAQCAtMjEsNyArMjEsMTAgQEAKIENPTkZJR19GU0xfRU1CX1BFUkZNT049eQogIyBDT05GSUdfUEhZU182NEJJVCBpcyBub3Qgc2V0CiBDT05GSUdfU1BFPXkKK0NPTkZJR19QUENfTU1VX05PSEFTSD15CiAjIENPTkZJR19QUENfTU1fU0xJQ0VTIGlzIG5vdCBzZXQKK0NPTkZJR19TTVA9eQorQ09ORklHX05SX0NQVVM9MgogQ09ORklHX1BQQzMyPXkKIENPTkZJR19XT1JEX1NJWkU9MzIKICMgQ09ORklHX0FSQ0hfUEhZU19BRERSX1RfNjRCSVQgaXMgbm90IHNldApAQCAtNTAsNyArNTMsNyBAQAogQ09ORklHX1BQQ19PRj15CiBDT05GSUdfT0Y9eQogQ09ORklHX1BQQ19VREJHXzE2NTUwPXkKLSMgQ09ORklHX0dFTkVSSUNfVEJTWU5DIGlzIG5vdCBzZXQKK0NPTkZJR19HRU5FUklDX1RCU1lOQz15CiBDT05GSUdfQVVESVRfQVJDSD15CiBDT05GSUdfR0VORVJJQ19CVUc9eQogQ09ORklHX0RFRkFVTFRfVUlNQUdFPXkKQEAgLTYyLDcgKzY1LDcgQEAKICMgR2VuZXJhbCBzZXR1cAogIwogQ09ORklHX0VYUEVSSU1FTlRBTD15Ci1DT05GSUdfQlJPS0VOX09OX1NNUD15CitDT05GSUdfTE9DS19LRVJORUw9eQogQ09ORklHX0lOSVRfRU5WX0FSR19MSU1JVD0zMgogQ09ORklHX0xPQ0FMVkVSU0lPTj0iIgogQ09ORklHX0xPQ0FMVkVSU0lPTl9BVVRPPXkKQEAgLTEyNiw2ICsxMjksNyBAQAogQ09ORklHX0hBVkVfS1BST0JFUz15CiBDT05GSUdfSEFWRV9LUkVUUFJPQkVTPXkKIENPTkZJR19IQVZFX0FSQ0hfVFJBQ0VIT09LPXkKK0NPTkZJR19VU0VfR0VORVJJQ19TTVBfSEVMUEVSUz15CiAjIENPTkZJR19IQVZFX0dFTkVSSUNfRE1BX0NPSEVSRU5UIGlzIG5vdCBzZXQKIENPTkZJR19TTEFCSU5GTz15CiBDT05GSUdfUlRfTVVURVhFUz15CkBAIC0xMzgsNiArMTQyLDcgQEAKIENPTkZJR19NT0RWRVJTSU9OUz15CiAjIENPTkZJR19NT0RVTEVfU1JDVkVSU0lPTl9BTEwgaXMgbm90IHNldAogQ09ORklHX0tNT0Q9eQorQ09ORklHX1NUT1BfTUFDSElORT15CiBDT05GSUdfQkxPQ0s9eQogQ09ORklHX0xCRD15CiAjIENPTkZJR19CTEtfREVWX0lPX1RSQUNFIGlzIG5vdCBzZXQKQEAgLTE5Nyw2ICsyMDIsNyBAQAogIyBDT05GSUdfQ1BNMiBpcyBub3Qgc2V0CiBDT05GSUdfRlNMX1VMSTE1NzU9eQogIyBDT05GSUdfTVBDOHh4eF9HUElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NJTVBMRV9HUElPIGlzIG5vdCBzZXQKIAogIwogIyBLZXJuZWwgb3B0aW9ucwpAQCAtMjI0LDYgKzIzMCw3IEBACiBDT05GSUdfQVJDSF9FTkFCTEVfTUVNT1JZX0hPVFBMVUc9eQogQ09ORklHX0FSQ0hfSEFTX1dBTEtfTUVNT1JZPXkKIENPTkZJR19BUkNIX0VOQUJMRV9NRU1PUllfSE9UUkVNT1ZFPXkKKyMgQ09ORklHX0lSUV9BTExfQ1BVUyBpcyBub3Qgc2V0CiBDT05GSUdfQVJDSF9GTEFUTUVNX0VOQUJMRT15CiBDT05GSUdfQVJDSF9QT1BVTEFURVNfTk9ERV9NQVA9eQogQ09ORklHX1NFTEVDVF9NRU1PUllfTU9ERUw9eQpAQCAtMjQxLDYgKzI0OCw5IEBACiBDT05GSUdfQk9VTkNFPXkKIENPTkZJR19WSVJUX1RPX0JVUz15CiBDT05GSUdfVU5FVklDVEFCTEVfTFJVPXkKK0NPTkZJR19QUENfNEtfUEFHRVM9eQorIyBDT05GSUdfUFBDXzE2S19QQUdFUyBpcyBub3Qgc2V0CisjIENPTkZJR19QUENfNjRLX1BBR0VTIGlzIG5vdCBzZXQKIENPTkZJR19GT1JDRV9NQVhfWk9ORU9SREVSPTExCiBDT05GSUdfUFJPQ19ERVZJQ0VUUkVFPXkKICMgQ09ORklHX0NNRExJTkVfQk9PTCBpcyBub3Qgc2V0CkBAIC00NDMsOCArNDUzLDEwIEBACiAjIENPTkZJR19FRVBST01fOTNDWDYgaXMgbm90IHNldAogIyBDT05GSUdfU0dJX0lPQzQgaXMgbm90IHNldAogIyBDT05GSUdfVElGTV9DT1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lDUzkzMlM0MDEgaXMgbm90IHNldAogIyBDT05GSUdfRU5DTE9TVVJFX1NFUlZJQ0VTIGlzIG5vdCBzZXQKICMgQ09ORklHX0hQX0lMTyBpcyBub3Qgc2V0CisjIENPTkZJR19DMlBPUlQgaXMgbm90IHNldAogQ09ORklHX0hBVkVfSURFPXkKICMgQ09ORklHX0lERSBpcyBub3Qgc2V0CiAKQEAgLTc4NCw2ICs3OTYsNyBAQAogQ09ORklHX1VOSVg5OF9QVFlTPXkKIENPTkZJR19MRUdBQ1lfUFRZUz15CiBDT05GSUdfTEVHQUNZX1BUWV9DT1VOVD0yNTYKKyMgQ09ORklHX0hWQ19VREJHIGlzIG5vdCBzZXQKICMgQ09ORklHX0lQTUlfSEFORExFUiBpcyBub3Qgc2V0CiBDT05GSUdfSFdfUkFORE9NPXkKIENPTkZJR19OVlJBTT15CkBAIC04NjksMTEgKzg4MiwxMSBAQAogIyBDT05GSUdfVEhFUk1BTCBpcyBub3Qgc2V0CiAjIENPTkZJR19USEVSTUFMX0hXTU9OIGlzIG5vdCBzZXQKICMgQ09ORklHX1dBVENIRE9HIGlzIG5vdCBzZXQKK0NPTkZJR19TU0JfUE9TU0lCTEU9eQogCiAjCiAjIFNvbmljcyBTaWxpY29uIEJhY2twbGFuZQogIwotQ09ORklHX1NTQl9QT1NTSUJMRT15CiAjIENPTkZJR19TU0IgaXMgbm90IHNldAogCiAjCkBAIC04ODYsMTQgKzg5OSw3IEBACiAjIENPTkZJR19QTUlDX0RBOTAzWCBpcyBub3Qgc2V0CiAjIENPTkZJR19NRkRfV004NDAwIGlzIG5vdCBzZXQKICMgQ09ORklHX01GRF9XTTgzNTBfSTJDIGlzIG5vdCBzZXQKLQotIwotIyBWb2x0YWdlIGFuZCBDdXJyZW50IHJlZ3VsYXRvcnMKLSMKICMgQ09ORklHX1JFR1VMQVRPUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19SRUdVTEFUT1JfRklYRURfVk9MVEFHRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19SRUdVTEFUT1JfVklSVFVBTF9DT05TVU1FUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19SRUdVTEFUT1JfQlEyNDAyMiBpcyBub3Qgc2V0CiAKICMKICMgTXVsdGltZWRpYSBkZXZpY2VzCkBAIC0xMjUyLDExICsxMjU4LDExIEBACiAjIENPTkZJR19VU0JfVE1DIGlzIG5vdCBzZXQKIAogIwotIyBOT1RFOiBVU0JfU1RPUkFHRSBlbmFibGVzIFNDU0ksIGFuZCAnU0NTSSBkaXNrIHN1cHBvcnQnCisjIE5PVEU6IFVTQl9TVE9SQUdFIGRlcGVuZHMgb24gU0NTSSBidXQgQkxLX0RFVl9TRCBtYXkgYWxzbyBiZSBuZWVkZWQ7CiAjCiAKICMKLSMgbWF5IGFsc28gYmUgbmVlZGVkOyBzZWUgVVNCX1NUT1JBR0UgSGVscCBmb3IgbW9yZSBpbmZvcm1hdGlvbgorIyBzZWUgVVNCX1NUT1JBR0UgSGVscCBmb3IgbW9yZSBpbmZvcm1hdGlvbgogIwogQ09ORklHX1VTQl9TVE9SQUdFPXkKICMgQ09ORklHX1VTQl9TVE9SQUdFX0RFQlVHIGlzIG5vdCBzZXQKQEAgLTEzNDgsNiArMTM1NCw3IEBACiAjIENPTkZJR19SVENfRFJWX000MVQ4MCBpcyBub3Qgc2V0CiAjIENPTkZJR19SVENfRFJWX1MzNTM5MEEgaXMgbm90IHNldAogIyBDT05GSUdfUlRDX0RSVl9GTTMxMzAgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9SWDg1ODEgaXMgbm90IHNldAogCiAjCiAjIFNQSSBSVEMgZHJpdmVycwpAQCAtMTYyNCw2ICsxNjMxLDcgQEAKICMgQ09ORklHX1NBTVBMRVMgaXMgbm90IHNldAogQ09ORklHX0hBVkVfQVJDSF9LR0RCPXkKICMgQ09ORklHX0tHREIgaXMgbm90IHNldAorQ09ORklHX1BSSU5UX1NUQUNLX0RFUFRIPTY0CiAjIENPTkZJR19ERUJVR19TVEFDS09WRVJGTE9XIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX1NUQUNLX1VTQUdFIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX1BBR0VBTExPQyBpcyBub3Qgc2V0CkBAIC0xNjQ5LDExICsxNjU3LDE2IEBACiAjCiAjIENPTkZJR19DUllQVE9fRklQUyBpcyBub3Qgc2V0CiBDT05GSUdfQ1JZUFRPX0FMR0FQST15CitDT05GSUdfQ1JZUFRPX0FMR0FQSTI9eQogQ09ORklHX0NSWVBUT19BRUFEPXkKK0NPTkZJR19DUllQVE9fQUVBRDI9eQogQ09ORklHX0NSWVBUT19CTEtDSVBIRVI9eQorQ09ORklHX0NSWVBUT19CTEtDSVBIRVIyPXkKIENPTkZJR19DUllQVE9fSEFTSD15Ci1DT05GSUdfQ1JZUFRPX1JORz15CitDT05GSUdfQ1JZUFRPX0hBU0gyPXkKK0NPTkZJR19DUllQVE9fUk5HMj15CiBDT05GSUdfQ1JZUFRPX01BTkFHRVI9eQorQ09ORklHX0NSWVBUT19NQU5BR0VSMj15CiAjIENPTkZJR19DUllQVE9fR0YxMjhNVUwgaXMgbm90IHNldAogIyBDT05GSUdfQ1JZUFRPX05VTEwgaXMgbm90IHNldAogIyBDT05GSUdfQ1JZUFRPX0NSWVBURCBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vS2J1aWxkIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL0tidWlsZAppbmRleCA1YWI3ZDdmLi45MjY4NjAyIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vS2J1aWxkCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9LYnVpbGQKQEAgLTM1LDMgKzM1LDQgQEAKIHVuaWZkZWYteSArPSB0ZXJtaW9zLmgKIHVuaWZkZWYteSArPSB0eXBlcy5oCiB1bmlmZGVmLXkgKz0gdW5pc3RkLmgKK3VuaWZkZWYteSArPSBzd2FiLmgKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9hdG9taWMuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9hdG9taWMuaAppbmRleCA0OTliZTViLi5iNDAxOTUwIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vYXRvbWljLmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2F0b21pYy5oCkBAIC01LDcgKzUsNyBAQAogICogUG93ZXJQQyBhdG9taWMgb3BlcmF0aW9ucwogICovCiAKLXR5cGVkZWYgc3RydWN0IHsgaW50IGNvdW50ZXI7IH0gYXRvbWljX3Q7CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KIAogI2lmZGVmIF9fS0VSTkVMX18KICNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgpAQCAtMjUxLDggKzI1MSw2IEBACiAKICNpZmRlZiBfX3Bvd2VycGM2NF9fCiAKLXR5cGVkZWYgc3RydWN0IHsgbG9uZyBjb3VudGVyOyB9IGF0b21pYzY0X3Q7Ci0KICNkZWZpbmUgQVRPTUlDNjRfSU5JVChpKQl7IChpKSB9CiAKIHN0YXRpYyBfX2lubGluZV9fIGxvbmcgYXRvbWljNjRfcmVhZChjb25zdCBhdG9taWM2NF90ICp2KQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2J5dGVvcmRlci5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2J5dGVvcmRlci5oCmluZGV4IGQ1ZGUzMjUuLjVjY2EyN2EgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9ieXRlb3JkZXIuaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vYnl0ZW9yZGVyLmgKQEAgLTgsODYgKzgsNyBAQAogICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICAqLwogCi0jaW5jbHVkZSA8YXNtL3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KLQotI2RlZmluZSBfX0JJR19FTkRJQU4KLQotI2lmZGVmIF9fR05VQ19fCi0jaWZkZWYgX19LRVJORUxfXwotCi1zdGF0aWMgX19pbmxpbmVfXyBfX3UxNiBsZF9sZTE2KGNvbnN0IHZvbGF0aWxlIF9fdTE2ICphZGRyKQotewotCV9fdTE2IHZhbDsKLQotCV9fYXNtX18gX192b2xhdGlsZV9fICgibGhicnggJTAsMCwlMSIgOiAiPXIiICh2YWwpIDogInIiIChhZGRyKSwgIm0iICgqYWRkcikpOwotCXJldHVybiB2YWw7Ci19Ci0jZGVmaW5lIF9fYXJjaF9zd2FiMTZwIGxkX2xlMTYKLQotc3RhdGljIF9faW5saW5lX18gdm9pZCBzdF9sZTE2KHZvbGF0aWxlIF9fdTE2ICphZGRyLCBjb25zdCBfX3UxNiB2YWwpCi17Ci0JX19hc21fXyBfX3ZvbGF0aWxlX18gKCJzdGhicnggJTEsMCwlMiIgOiAiPW0iICgqYWRkcikgOiAiciIgKHZhbCksICJyIiAoYWRkcikpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgX19hcmNoX3N3YWIxNnMoX191MTYgKmFkZHIpCi17Ci0Jc3RfbGUxNihhZGRyLCAqYWRkcik7Ci19Ci0jZGVmaW5lIF9fYXJjaF9zd2FiMTZzIF9fYXJjaF9zd2FiMTZzCi0KLXN0YXRpYyBfX2lubGluZV9fIF9fdTMyIGxkX2xlMzIoY29uc3Qgdm9sYXRpbGUgX191MzIgKmFkZHIpCi17Ci0JX191MzIgdmFsOwotCi0JX19hc21fXyBfX3ZvbGF0aWxlX18gKCJsd2JyeCAlMCwwLCUxIiA6ICI9ciIgKHZhbCkgOiAiciIgKGFkZHIpLCAibSIgKCphZGRyKSk7Ci0JcmV0dXJuIHZhbDsKLX0KLSNkZWZpbmUgX19hcmNoX3N3YWIzMnAgbGRfbGUzMgotCi1zdGF0aWMgX19pbmxpbmVfXyB2b2lkIHN0X2xlMzIodm9sYXRpbGUgX191MzIgKmFkZHIsIGNvbnN0IF9fdTMyIHZhbCkKLXsKLQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoInN0d2JyeCAlMSwwLCUyIiA6ICI9bSIgKCphZGRyKSA6ICJyIiAodmFsKSwgInIiIChhZGRyKSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBfX2FyY2hfc3dhYjMycyhfX3UzMiAqYWRkcikKLXsKLQlzdF9sZTMyKGFkZHIsICphZGRyKTsKLX0KLSNkZWZpbmUgX19hcmNoX3N3YWIzMnMgX19hcmNoX3N3YWIzMnMKLQotc3RhdGljIGlubGluZSBfX2F0dHJpYnV0ZV9jb25zdF9fIF9fdTE2IF9fYXJjaF9zd2FiMTYoX191MTYgdmFsdWUpCi17Ci0JX191MTYgcmVzdWx0OwotCi0JX19hc21fXygicmx3aW1pICUwLCUxLDgsMTYsMjMiCi0JICAgIDogIj1yIiAocmVzdWx0KQotCSAgICA6ICJyIiAodmFsdWUpLCAiMCIgKHZhbHVlID4+IDgpKTsKLQlyZXR1cm4gcmVzdWx0OwotfQotI2RlZmluZSBfX2FyY2hfc3dhYjE2IF9fYXJjaF9zd2FiMTYKLQotc3RhdGljIGlubGluZSBfX2F0dHJpYnV0ZV9jb25zdF9fIF9fdTMyIF9fYXJjaF9zd2FiMzIoX191MzIgdmFsdWUpCi17Ci0JX191MzIgcmVzdWx0OwotCi0JX19hc21fXygicmx3aW1pICUwLCUxLDI0LDE2LDIzXG5cdCIKLQkgICAgInJsd2ltaSAlMCwlMSw4LDgsMTVcblx0IgotCSAgICAicmx3aW1pICUwLCUxLDI0LDAsNyIKLQkgICAgOiAiPXIiIChyZXN1bHQpCi0JICAgIDogInIiICh2YWx1ZSksICIwIiAodmFsdWUgPj4gMjQpKTsKLQlyZXR1cm4gcmVzdWx0OwotfQotI2RlZmluZSBfX2FyY2hfc3dhYjMyIF9fYXJjaF9zd2FiMzIKLQotI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KLQotI2lmbmRlZiBfX3Bvd2VycGM2NF9fCi0jZGVmaW5lIF9fU1dBQl82NF9USFJVXzMyX18KLSNlbmRpZiAvKiBfX3Bvd2VycGM2NF9fICovCi0KLSNlbmRpZiAvKiBfX0dOVUNfXyAqLwotCi0jaW5jbHVkZSA8bGludXgvYnl0ZW9yZGVyLmg+CisjaW5jbHVkZSA8YXNtL3N3YWIuaD4KKyNpbmNsdWRlIDxsaW51eC9ieXRlb3JkZXIvYmlnX2VuZGlhbi5oPgogCiAjZW5kaWYgLyogX0FTTV9QT1dFUlBDX0JZVEVPUkRFUl9IICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vaHVnZXRsYi5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2h1Z2V0bGIuaAppbmRleCAyNmYwZDBhLi5iMWRhZmI2IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vaHVnZXRsYi5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9odWdldGxiLmgKQEAgLTE4LDYgKzE4LDEyIEBACiAJCQkgICAgICBwdGVfdCAqcHRlcCk7CiAKIC8qCisgKiBUaGUgdmVyc2lvbiBvZiB2bWFfbW11X3BhZ2VzaXplKCkgaW4gYXJjaC9wb3dlcnBjL21tL2h1Z2V0bGJwYWdlLmMgbmVlZHMKKyAqIHRvIG92ZXJyaWRlIHRoZSB2ZXJzaW9uIGluIG1tL2h1Z2V0bGIuYworICovCisjZGVmaW5lIHZtYV9tbXVfcGFnZXNpemUgdm1hX21tdV9wYWdlc2l6ZQorCisvKgogICogSWYgdGhlIGFyY2ggZG9lc24ndCBzdXBwbHkgc29tZXRoaW5nIGVsc2UsIGFzc3VtZSB0aGF0IGh1Z2VwYWdlCiAgKiBzaXplIGFsaWduZWQgcmVnaW9ucyBhcmUgb2sgd2l0aG91dCBmdXJ0aGVyIHByZXBhcmF0aW9uLgogICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vaW9jdGxzLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vaW9jdGxzLmgKaW5kZXggMjc5YTYyMi4uMTg0MjE4NiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2lvY3Rscy5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9pb2N0bHMuaApAQCAtODksNiArODksOCBAQAogI2RlZmluZSBUSU9DU0JSSwkweDU0MjcgIC8qIEJTRCBjb21wYXRpYmlsaXR5ICovCiAjZGVmaW5lIFRJT0NDQlJLCTB4NTQyOCAgLyogQlNEIGNvbXBhdGliaWxpdHkgKi8KICNkZWZpbmUgVElPQ0dTSUQJMHg1NDI5ICAvKiBSZXR1cm4gdGhlIHNlc3Npb24gSUQgb2YgRkQgKi8KKyNkZWZpbmUgVElPQ0dSUzQ4NQkweDU0MmUKKyNkZWZpbmUgVElPQ1NSUzQ4NQkweDU0MmYKICNkZWZpbmUgVElPQ0dQVE4JX0lPUignVCcsMHgzMCwgdW5zaWduZWQgaW50KSAvKiBHZXQgUHR5IE51bWJlciAob2YgcHR5LW11eCBkZXZpY2UpICovCiAjZGVmaW5lIFRJT0NTUFRMQ0sJX0lPVygnVCcsMHgzMSwgaW50KSAgLyogTG9jay91bmxvY2sgUHR5ICovCiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9rZXhlYy5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2tleGVjLmgKaW5kZXggNmRiZmZjOS4uN2UwNmI0MyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2tleGVjLmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2tleGVjLmgKQEAgLTQ4LDYzICs0OCw4IEBACiB7CiAJaWYgKG9sZHJlZ3MpCiAJCW1lbWNweShuZXdyZWdzLCBvbGRyZWdzLCBzaXplb2YoKm5ld3JlZ3MpKTsKLSNpZmRlZiBfX3Bvd2VycGM2NF9fCi0JZWxzZSB7Ci0JCS8qIEZJWE1FIE1lcmdlIHRoaXMgd2l0aCB4bW9uX3NhdmVfcmVncyA/PyAqLwotCQl1bnNpZ25lZCBsb25nIHRtcDEsIHRtcDI7Ci0JCV9fYXNtX18gX192b2xhdGlsZV9fICgKLQkJCSJzdGQgICAgMCwwKCUyKVxuIgotCQkJInN0ZCAgICAxLDgoJTIpXG4iCi0JCQkic3RkICAgIDIsMTYoJTIpXG4iCi0JCQkic3RkICAgIDMsMjQoJTIpXG4iCi0JCQkic3RkICAgIDQsMzIoJTIpXG4iCi0JCQkic3RkICAgIDUsNDAoJTIpXG4iCi0JCQkic3RkICAgIDYsNDgoJTIpXG4iCi0JCQkic3RkICAgIDcsNTYoJTIpXG4iCi0JCQkic3RkICAgIDgsNjQoJTIpXG4iCi0JCQkic3RkICAgIDksNzIoJTIpXG4iCi0JCQkic3RkICAgIDEwLDgwKCUyKVxuIgotCQkJInN0ZCAgICAxMSw4OCglMilcbiIKLQkJCSJzdGQgICAgMTIsOTYoJTIpXG4iCi0JCQkic3RkICAgIDEzLDEwNCglMilcbiIKLQkJCSJzdGQgICAgMTQsMTEyKCUyKVxuIgotCQkJInN0ZCAgICAxNSwxMjAoJTIpXG4iCi0JCQkic3RkICAgIDE2LDEyOCglMilcbiIKLQkJCSJzdGQgICAgMTcsMTM2KCUyKVxuIgotCQkJInN0ZCAgICAxOCwxNDQoJTIpXG4iCi0JCQkic3RkICAgIDE5LDE1MiglMilcbiIKLQkJCSJzdGQgICAgMjAsMTYwKCUyKVxuIgotCQkJInN0ZCAgICAyMSwxNjgoJTIpXG4iCi0JCQkic3RkICAgIDIyLDE3NiglMilcbiIKLQkJCSJzdGQgICAgMjMsMTg0KCUyKVxuIgotCQkJInN0ZCAgICAyNCwxOTIoJTIpXG4iCi0JCQkic3RkICAgIDI1LDIwMCglMilcbiIKLQkJCSJzdGQgICAgMjYsMjA4KCUyKVxuIgotCQkJInN0ZCAgICAyNywyMTYoJTIpXG4iCi0JCQkic3RkICAgIDI4LDIyNCglMilcbiIKLQkJCSJzdGQgICAgMjksMjMyKCUyKVxuIgotCQkJInN0ZCAgICAzMCwyNDAoJTIpXG4iCi0JCQkic3RkICAgIDMxLDI0OCglMilcbiIKLQkJCSJtZm1zciAgJTBcbiIKLQkJCSJzdGQgICAgJTAsIDI2NCglMilcbiIKLQkJCSJtZmN0ciAgJTBcbiIKLQkJCSJzdGQgICAgJTAsIDI4MCglMilcbiIKLQkJCSJtZmxyICAgJTBcbiIKLQkJCSJzdGQgICAgJTAsIDI4OCglMilcbiIKLQkJCSJibCAgICAgMWZcbiIKLQkJIjE6ICAgICBtZmxyICAgJTFcbiIKLQkJCSJzdGQgICAgJTEsIDI1NiglMilcbiIKLQkJCSJtdGxyICAgJTBcbiIKLQkJCSJtZnhlciAgJTBcbiIKLQkJCSJzdGQgICAgJTAsIDI5NiglMilcbiIKLQkJCTogIj0mciIgKHRtcDEpLCAiPSZyIiAodG1wMikKLQkJCTogImIiIChuZXdyZWdzKQotCQkJOiAibWVtb3J5Iik7Ci0JfQotI2Vsc2UKIAllbHNlCiAJCXBwY19zYXZlX3JlZ3MobmV3cmVncyk7Ci0jZW5kaWYgLyogX19wb3dlcnBjNjRfXyAqLwogfQogCiBleHRlcm4gdm9pZCBrZXhlY19zbXBfd2FpdCh2b2lkKTsJLyogZ2V0IGFuZCBjbGVhciBuYWNhIHBoeXNpZCwgd2FpdCBmb3IKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9wczMuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9wczMuaAppbmRleCBjZmYzMGMwLi5lZWFkNWM2IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcHMzLmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3BzMy5oCkBAIC0zMjAsNiArMzIwLDcgQEAKIAogZW51bSBwczNfbWF0Y2hfc3ViX2lkIHsKIAlQUzNfTUFUQ0hfU1VCX0lEX0dQVV9GQgkJPSAxLAorCVBTM19NQVRDSF9TVUJfSURfR1BVX1JBTURJU0sJPSAyLAogfTsKIAogI2RlZmluZSBQUzNfTU9EVUxFX0FMSUFTX0VIQ0kJCSJwczM6MTowIgpAQCAtMzMyLDYgKzMzMyw3IEBACiAjZGVmaW5lIFBTM19NT0RVTEVfQUxJQVNfU1RPUl9GTEFTSAkicHMzOjg6MCIKICNkZWZpbmUgUFMzX01PRFVMRV9BTElBU19TT1VORAkJInBzMzo5OjAiCiAjZGVmaW5lIFBTM19NT0RVTEVfQUxJQVNfR1BVX0ZCCQkicHMzOjEwOjEiCisjZGVmaW5lIFBTM19NT0RVTEVfQUxJQVNfR1BVX1JBTURJU0sJInBzMzoxMDoyIgogI2RlZmluZSBQUzNfTU9EVUxFX0FMSUFTX0xQTQkJInBzMzoxMTowIgogCiBlbnVtIHBzM19zeXN0ZW1fYnVzX2RldmljZV90eXBlIHsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9xZS5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3FlLmgKaW5kZXggZWRlZTE1ZC4uYTBhMTUzMSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3FlLmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3FlLmgKQEAgLTE3LDYgKzE3LDggQEAKICNpZmRlZiBfX0tFUk5FTF9fCiAKICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8YXNtL2NwbS5oPgogI2luY2x1ZGUgPGFzbS9pbW1hcF9xZS5oPgogCkBAIC04NCw3ICs4NiwxMSBAQAogZXh0ZXJuIHNwaW5sb2NrX3QgY214Z2NyX2xvY2s7CiAKIC8qIEV4cG9ydCBRRSBjb21tb24gb3BlcmF0aW9ucyAqLworI2lmZGVmIENPTkZJR19RVUlDQ19FTkdJTkUKIGV4dGVybiB2b2lkIF9faW5pdCBxZV9yZXNldCh2b2lkKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgcWVfcmVzZXQodm9pZCkge30KKyNlbmRpZgogCiAvKiBRRSBQSU8gKi8KICNkZWZpbmUgUUVfUElPX1BJTlMgMzIKQEAgLTEwMSwxNiArMTA3LDQzIEBACiAjZW5kaWYKIH07CiAKLWV4dGVybiBpbnQgcGFyX2lvX2luaXQoc3RydWN0IGRldmljZV9ub2RlICpucCk7Ci1leHRlcm4gaW50IHBhcl9pb19vZl9jb25maWcoc3RydWN0IGRldmljZV9ub2RlICpucCk7CiAjZGVmaW5lIFFFX1BJT19ESVJfSU4JMgogI2RlZmluZSBRRV9QSU9fRElSX09VVAkxCiBleHRlcm4gdm9pZCBfX3Bhcl9pb19jb25maWdfcGluKHN0cnVjdCBxZV9waW9fcmVncyBfX2lvbWVtICpwYXJfaW8sIHU4IHBpbiwKIAkJCQlpbnQgZGlyLCBpbnQgb3Blbl9kcmFpbiwgaW50IGFzc2lnbm1lbnQsCiAJCQkJaW50IGhhc19pcnEpOworI2lmZGVmIENPTkZJR19RVUlDQ19FTkdJTkUKK2V4dGVybiBpbnQgcGFyX2lvX2luaXQoc3RydWN0IGRldmljZV9ub2RlICpucCk7CitleHRlcm4gaW50IHBhcl9pb19vZl9jb25maWcoc3RydWN0IGRldmljZV9ub2RlICpucCk7CiBleHRlcm4gaW50IHBhcl9pb19jb25maWdfcGluKHU4IHBvcnQsIHU4IHBpbiwgaW50IGRpciwgaW50IG9wZW5fZHJhaW4sCiAJCQkgICAgIGludCBhc3NpZ25tZW50LCBpbnQgaGFzX2lycSk7CiBleHRlcm4gaW50IHBhcl9pb19kYXRhX3NldCh1OCBwb3J0LCB1OCBwaW4sIHU4IHZhbCk7CisjZWxzZQorc3RhdGljIGlubGluZSBpbnQgcGFyX2lvX2luaXQoc3RydWN0IGRldmljZV9ub2RlICpucCkgeyByZXR1cm4gLUVOT1NZUzsgfQorc3RhdGljIGlubGluZSBpbnQgcGFyX2lvX29mX2NvbmZpZyhzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKSB7IHJldHVybiAtRU5PU1lTOyB9CitzdGF0aWMgaW5saW5lIGludCBwYXJfaW9fY29uZmlnX3Bpbih1OCBwb3J0LCB1OCBwaW4sIGludCBkaXIsIGludCBvcGVuX2RyYWluLAorCQlpbnQgYXNzaWdubWVudCwgaW50IGhhc19pcnEpIHsgcmV0dXJuIC1FTk9TWVM7IH0KK3N0YXRpYyBpbmxpbmUgaW50IHBhcl9pb19kYXRhX3NldCh1OCBwb3J0LCB1OCBwaW4sIHU4IHZhbCkgeyByZXR1cm4gLUVOT1NZUzsgfQorI2VuZGlmIC8qIENPTkZJR19RVUlDQ19FTkdJTkUgKi8KKworLyoKKyAqIFBpbiBtdWx0aXBsZXhpbmcgZnVuY3Rpb25zLgorICovCitzdHJ1Y3QgcWVfcGluOworI2lmZGVmIENPTkZJR19RRV9HUElPCitleHRlcm4gc3RydWN0IHFlX3BpbiAqcWVfcGluX3JlcXVlc3Qoc3RydWN0IGRldmljZV9ub2RlICpucCwgaW50IGluZGV4KTsKK2V4dGVybiB2b2lkIHFlX3Bpbl9mcmVlKHN0cnVjdCBxZV9waW4gKnFlX3Bpbik7CitleHRlcm4gdm9pZCBxZV9waW5fc2V0X2dwaW8oc3RydWN0IHFlX3BpbiAqcWVfcGluKTsKK2V4dGVybiB2b2lkIHFlX3Bpbl9zZXRfZGVkaWNhdGVkKHN0cnVjdCBxZV9waW4gKnBpbik7CisjZWxzZQorc3RhdGljIGlubGluZSBzdHJ1Y3QgcWVfcGluICpxZV9waW5fcmVxdWVzdChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLCBpbnQgaW5kZXgpCit7CisJcmV0dXJuIEVSUl9QVFIoLUVOT1NZUyk7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgcWVfcGluX2ZyZWUoc3RydWN0IHFlX3BpbiAqcWVfcGluKSB7fQorc3RhdGljIGlubGluZSB2b2lkIHFlX3Bpbl9zZXRfZ3BpbyhzdHJ1Y3QgcWVfcGluICpxZV9waW4pIHt9CitzdGF0aWMgaW5saW5lIHZvaWQgcWVfcGluX3NldF9kZWRpY2F0ZWQoc3RydWN0IHFlX3BpbiAqcGluKSB7fQorI2VuZGlmIC8qIENPTkZJR19RRV9HUElPICovCiAKIC8qIFFFIGludGVybmFsIEFQSSAqLwogaW50IHFlX2lzc3VlX2NtZCh1MzIgY21kLCB1MzIgZGV2aWNlLCB1OCBtY25fcHJvdG9jb2wsIHUzMiBjbWRfaW5wdXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3FlX2ljLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcWVfaWMuaAppbmRleCA1NmE3NzQ1Li5jZjUxOTY2IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcWVfaWMuaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcWVfaWMuaApAQCAtMTcsNiArMTcsOSBAQAogCiAjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAKK3N0cnVjdCBkZXZpY2Vfbm9kZTsKK3N0cnVjdCBxZV9pYzsKKwogI2RlZmluZSBOVU1fT0ZfUUVfSUNfR1JPVVBTCTYKIAogLyogRmxhZ3Mgd2hlbiB3ZSBpbml0IHRoZSBRRSBJQyAqLwpAQCAtNTQsMTcgKzU3LDI3IEBACiAJUUVfSUNfR1JQX1JJU0NCCQkvKiBRRSBpbnRlcnJ1cHQgY29udHJvbGxlciBSSVNDIGdyb3VwIEIgKi8KIH07CiAKKyNpZmRlZiBDT05GSUdfUVVJQ0NfRU5HSU5FCiB2b2lkIHFlX2ljX2luaXQoc3RydWN0IGRldmljZV9ub2RlICpub2RlLCB1bnNpZ25lZCBpbnQgZmxhZ3MsCiAJCXZvaWQgKCpsb3dfaGFuZGxlcikodW5zaWduZWQgaW50IGlycSwgc3RydWN0IGlycV9kZXNjICpkZXNjKSwKIAkJdm9pZCAoKmhpZ2hfaGFuZGxlcikodW5zaWduZWQgaW50IGlycSwgc3RydWN0IGlycV9kZXNjICpkZXNjKSk7Cit1bnNpZ25lZCBpbnQgcWVfaWNfZ2V0X2xvd19pcnEoc3RydWN0IHFlX2ljICpxZV9pYyk7Cit1bnNpZ25lZCBpbnQgcWVfaWNfZ2V0X2hpZ2hfaXJxKHN0cnVjdCBxZV9pYyAqcWVfaWMpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBxZV9pY19pbml0KHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSwgdW5zaWduZWQgaW50IGZsYWdzLAorCQl2b2lkICgqbG93X2hhbmRsZXIpKHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBpcnFfZGVzYyAqZGVzYyksCisJCXZvaWQgKCpoaWdoX2hhbmRsZXIpKHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBpcnFfZGVzYyAqZGVzYykpCit7fQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgcWVfaWNfZ2V0X2xvd19pcnEoc3RydWN0IHFlX2ljICpxZV9pYykKK3sgcmV0dXJuIDA7IH0KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHFlX2ljX2dldF9oaWdoX2lycShzdHJ1Y3QgcWVfaWMgKnFlX2ljKQoreyByZXR1cm4gMDsgfQorI2VuZGlmIC8qIENPTkZJR19RVUlDQ19FTkdJTkUgKi8KKwogdm9pZCBxZV9pY19zZXRfaGlnaGVzdF9wcmlvcml0eSh1bnNpZ25lZCBpbnQgdmlycSwgaW50IGhpZ2gpOwogaW50IHFlX2ljX3NldF9wcmlvcml0eSh1bnNpZ25lZCBpbnQgdmlycSwgdW5zaWduZWQgaW50IHByaW9yaXR5KTsKIGludCBxZV9pY19zZXRfaGlnaF9wcmlvcml0eSh1bnNpZ25lZCBpbnQgdmlycSwgdW5zaWduZWQgaW50IHByaW9yaXR5LCBpbnQgaGlnaCk7CiAKLXN0cnVjdCBxZV9pYzsKLXVuc2lnbmVkIGludCBxZV9pY19nZXRfbG93X2lycShzdHJ1Y3QgcWVfaWMgKnFlX2ljKTsKLXVuc2lnbmVkIGludCBxZV9pY19nZXRfaGlnaF9pcnEoc3RydWN0IHFlX2ljICpxZV9pYyk7Ci0KIHN0YXRpYyBpbmxpbmUgdm9pZCBxZV9pY19jYXNjYWRlX2xvd19pcGljKHVuc2lnbmVkIGludCBpcnEsCiAJCQkJCSAgc3RydWN0IGlycV9kZXNjICpkZXNjKQogewpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3NwdS5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3NwdS5oCmluZGV4IDhiMmViMDQuLjBhYjhkODY5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vc3B1LmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3NwdS5oCkBAIC0xMjgsNyArMTI4LDcgQEAKIAlpbnQgbnVtYmVyOwogCXVuc2lnbmVkIGludCBpcnFzWzNdOwogCXUzMiBub2RlOwotCXU2NCBmbGFnczsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXU2NCBjbGFzc18wX3BlbmRpbmc7CiAJdTY0IGNsYXNzXzBfZGFyOwogCXU2NCBjbGFzc18xX2RhcjsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9zd2FiLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vc3dhYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmODI0YWUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vc3dhYi5oCkBAIC0wLDAgKzEsOTAgQEAKKyNpZm5kZWYgX0FTTV9QT1dFUlBDX1NXQUJfSAorI2RlZmluZSBfQVNNX1BPV0VSUENfU1dBQl9ICisKKy8qCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxhc20vdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgorCisjaWZkZWYgX19HTlVDX18KKworI2lmbmRlZiBfX3Bvd2VycGM2NF9fCisjZGVmaW5lIF9fU1dBQl82NF9USFJVXzMyX18KKyNlbmRpZiAvKiBfX3Bvd2VycGM2NF9fICovCisKKyNpZmRlZiBfX0tFUk5FTF9fCisKK3N0YXRpYyBfX2lubGluZV9fIF9fdTE2IGxkX2xlMTYoY29uc3Qgdm9sYXRpbGUgX191MTYgKmFkZHIpCit7CisJX191MTYgdmFsOworCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJsaGJyeCAlMCwwLCUxIiA6ICI9ciIgKHZhbCkgOiAiciIgKGFkZHIpLCAibSIgKCphZGRyKSk7CisJcmV0dXJuIHZhbDsKK30KKyNkZWZpbmUgX19hcmNoX3N3YWIxNnAgbGRfbGUxNgorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIHN0X2xlMTYodm9sYXRpbGUgX191MTYgKmFkZHIsIGNvbnN0IF9fdTE2IHZhbCkKK3sKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoInN0aGJyeCAlMSwwLCUyIiA6ICI9bSIgKCphZGRyKSA6ICJyIiAodmFsKSwgInIiIChhZGRyKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2FyY2hfc3dhYjE2cyhfX3UxNiAqYWRkcikKK3sKKwlzdF9sZTE2KGFkZHIsICphZGRyKTsKK30KKyNkZWZpbmUgX19hcmNoX3N3YWIxNnMgX19hcmNoX3N3YWIxNnMKKworc3RhdGljIF9faW5saW5lX18gX191MzIgbGRfbGUzMihjb25zdCB2b2xhdGlsZSBfX3UzMiAqYWRkcikKK3sKKwlfX3UzMiB2YWw7CisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImx3YnJ4ICUwLDAsJTEiIDogIj1yIiAodmFsKSA6ICJyIiAoYWRkciksICJtIiAoKmFkZHIpKTsKKwlyZXR1cm4gdmFsOworfQorI2RlZmluZSBfX2FyY2hfc3dhYjMycCBsZF9sZTMyCisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgc3RfbGUzMih2b2xhdGlsZSBfX3UzMiAqYWRkciwgY29uc3QgX191MzIgdmFsKQoreworCV9fYXNtX18gX192b2xhdGlsZV9fICgic3R3YnJ4ICUxLDAsJTIiIDogIj1tIiAoKmFkZHIpIDogInIiICh2YWwpLCAiciIgKGFkZHIpKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIF9fYXJjaF9zd2FiMzJzKF9fdTMyICphZGRyKQoreworCXN0X2xlMzIoYWRkciwgKmFkZHIpOworfQorI2RlZmluZSBfX2FyY2hfc3dhYjMycyBfX2FyY2hfc3dhYjMycworCitzdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX2NvbnN0X18gX191MTYgX19hcmNoX3N3YWIxNihfX3UxNiB2YWx1ZSkKK3sKKwlfX3UxNiByZXN1bHQ7CisKKwlfX2FzbV9fKCJybHdpbWkgJTAsJTEsOCwxNiwyMyIKKwkgICAgOiAiPXIiIChyZXN1bHQpCisJICAgIDogInIiICh2YWx1ZSksICIwIiAodmFsdWUgPj4gOCkpOworCXJldHVybiByZXN1bHQ7Cit9CisjZGVmaW5lIF9fYXJjaF9zd2FiMTYgX19hcmNoX3N3YWIxNgorCitzdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX2NvbnN0X18gX191MzIgX19hcmNoX3N3YWIzMihfX3UzMiB2YWx1ZSkKK3sKKwlfX3UzMiByZXN1bHQ7CisKKwlfX2FzbV9fKCJybHdpbWkgJTAsJTEsMjQsMTYsMjNcblx0IgorCSAgICAicmx3aW1pICUwLCUxLDgsOCwxNVxuXHQiCisJICAgICJybHdpbWkgJTAsJTEsMjQsMCw3IgorCSAgICA6ICI9ciIgKHJlc3VsdCkKKwkgICAgOiAiciIgKHZhbHVlKSwgIjAiICh2YWx1ZSA+PiAyNCkpOworCXJldHVybiByZXN1bHQ7Cit9CisjZGVmaW5lIF9fYXJjaF9zd2FiMzIgX19hcmNoX3N3YWIzMgorCisjZW5kaWYgLyogX19LRVJORUxfXyAqLworCisjZW5kaWYgLyogX19HTlVDX18gKi8KKworI2VuZGlmIC8qIF9BU01fUE9XRVJQQ19TV0FCX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvTWFrZWZpbGUgYi9hcmNoL3Bvd2VycGMva2VybmVsL01ha2VmaWxlCmluZGV4IDEzMDhhODYuLjhkMWE0MTkgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvTWFrZWZpbGUKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9NYWtlZmlsZQpAQCAtMjksNyArMjksNyBAQAogb2JqLXkJCQkJOj0gY3B1dGFibGUubyBwdHJhY2UubyBzeXNjYWxscy5vIFwKIAkJCQkgICBpcnEubyBhbGlnbi5vIHNpZ25hbF8zMi5vIHBtYy5vIHZkc28ubyBcCiAJCQkJICAgaW5pdF90YXNrLm8gcHJvY2Vzcy5vIHN5c3RibC5vIGlkbGUubyBcCi0JCQkJICAgc2lnbmFsLm8gc3lzZnMubworCQkJCSAgIHNpZ25hbC5vIHN5c2ZzLm8gY2FjaGVpbmZvLm8KIG9iai15CQkJCSs9IHZkc28zMi8KIG9iai0kKENPTkZJR19QUEM2NCkJCSs9IHNldHVwXzY0Lm8gc3lzX3BwYzMyLm8gXAogCQkJCSAgIHNpZ25hbF82NC5vIHB0cmFjZTMyLm8gXApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9jYWNoZWluZm8uYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvY2FjaGVpbmZvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjMzZjA0MQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvY2FjaGVpbmZvLmMKQEAgLTAsMCArMSw4MzcgQEAKKy8qCisgKiBQcm9jZXNzb3IgY2FjaGUgaW5mb3JtYXRpb24gbWFkZSBhdmFpbGFibGUgdG8gdXNlcnNwYWNlIHZpYSBzeXNmczsKKyAqIGludGVuZGVkIHRvIGJlIGNvbXBhdGlibGUgd2l0aCB4ODYgaW50ZWxfY2FjaGVpbmZvIGltcGxlbWVudGF0aW9uLgorICoKKyAqIENvcHlyaWdodCAyMDA4IElCTSBDb3Jwb3JhdGlvbgorICogQXV0aG9yOiBOYXRoYW4gTHluY2gKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jcHUuaD4KKyNpbmNsdWRlIDxsaW51eC9jcHVtYXNrLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2tvYmplY3QuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L3BlcmNwdS5oPgorI2luY2x1ZGUgPGFzbS9wcm9tLmg+CisKKyNpbmNsdWRlICJjYWNoZWluZm8uaCIKKworLyogcGVyLWNwdSBvYmplY3QgZm9yIHRyYWNraW5nOgorICogLSBhICJjYWNoZSIga29iamVjdCBmb3IgdGhlIHRvcC1sZXZlbCBkaXJlY3RvcnkKKyAqIC0gYSBsaXN0IG9mICJpbmRleCIgb2JqZWN0cyByZXByZXNlbnRpbmcgdGhlIGNwdSdzIGxvY2FsIGNhY2hlIGhpZXJhcmNoeQorICovCitzdHJ1Y3QgY2FjaGVfZGlyIHsKKwlzdHJ1Y3Qga29iamVjdCAqa29iajsgLyogYmFyZSAobm90IGVtYmVkZGVkKSBrb2JqZWN0IGZvciBjYWNoZQorCQkJICAgICAgICogZGlyZWN0b3J5ICovCisJc3RydWN0IGNhY2hlX2luZGV4X2RpciAqaW5kZXg7IC8qIGxpc3Qgb2YgaW5kZXggb2JqZWN0cyAqLworfTsKKworLyogImluZGV4IiBvYmplY3Q6IGVhY2ggY3B1J3MgY2FjaGUgZGlyZWN0b3J5IGhhcyBhbiBpbmRleAorICogc3ViZGlyZWN0b3J5IGNvcnJlc3BvbmRpbmcgdG8gYSBjYWNoZSBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoZQorICogY3B1LiAgVGhpcyBvYmplY3QncyBsaWZldGltZSBpcyBtYW5hZ2VkIHZpYSB0aGUgZW1iZWRkZWQga29iamVjdC4KKyAqLworc3RydWN0IGNhY2hlX2luZGV4X2RpciB7CisJc3RydWN0IGtvYmplY3Qga29iajsKKwlzdHJ1Y3QgY2FjaGVfaW5kZXhfZGlyICpuZXh0OyAvKiBuZXh0IGluZGV4IGluIHBhcmVudCBkaXJlY3RvcnkgKi8KKwlzdHJ1Y3QgY2FjaGUgKmNhY2hlOworfTsKKworLyogVGVtcGxhdGUgZm9yIGRldGVybWluaW5nIHdoaWNoIE9GIHByb3BlcnRpZXMgdG8gcXVlcnkgZm9yIGEgZ2l2ZW4KKyAqIGNhY2hlIHR5cGUgKi8KK3N0cnVjdCBjYWNoZV90eXBlX2luZm8geworCWNvbnN0IGNoYXIgKm5hbWU7CisJY29uc3QgY2hhciAqc2l6ZV9wcm9wOworCisJLyogQWxsb3cgZm9yIGJvdGggW2RpXS1jYWNoZS1saW5lLXNpemUgYW5kCisJICogW2RpXS1jYWNoZS1ibG9jay1zaXplIHByb3BlcnRpZXMuICBBY2NvcmRpbmcgdG8gdGhlIFBvd2VyUEMKKwkgKiBQcm9jZXNzb3IgYmluZGluZywgLWxpbmUtc2l6ZSBzaG91bGQgYmUgcHJvdmlkZWQgaWYgaXQKKwkgKiBkaWZmZXJzIGZyb20gdGhlIGNhY2hlIGJsb2NrIHNpemUgKHRoYXQgd2hpY2ggaXMgb3BlcmF0ZWQKKwkgKiBvbiBieSBjYWNoZSBpbnN0cnVjdGlvbnMpLCBzbyB3ZSBsb29rIGZvciAtbGluZS1zaXplIGZpcnN0LgorCSAqIFNlZSBjYWNoZV9nZXRfbGluZV9zaXplKCkuICovCisKKwljb25zdCBjaGFyICpsaW5lX3NpemVfcHJvcHNbMl07CisJY29uc3QgY2hhciAqbnJfc2V0c19wcm9wOworfTsKKworLyogVGhlc2UgYXJlIHVzZWQgdG8gaW5kZXggdGhlIGNhY2hlX3R5cGVfaW5mbyBhcnJheS4gKi8KKyNkZWZpbmUgQ0FDSEVfVFlQRV9VTklGSUVEICAgICAwCisjZGVmaW5lIENBQ0hFX1RZUEVfSU5TVFJVQ1RJT04gMQorI2RlZmluZSBDQUNIRV9UWVBFX0RBVEEgICAgICAgIDIKKworc3RhdGljIGNvbnN0IHN0cnVjdCBjYWNoZV90eXBlX2luZm8gY2FjaGVfdHlwZV9pbmZvW10gPSB7CisJeworCQkvKiBQb3dlclBDIFByb2Nlc3NvciBiaW5kaW5nIHNheXMgdGhlIFtkaV0tY2FjaGUtKgorCQkgKiBtdXN0IGJlIGVxdWFsIG9uIHVuaWZpZWQgY2FjaGVzLCBzbyBqdXN0IHVzZQorCQkgKiBkLWNhY2hlIHByb3BlcnRpZXMuICovCisJCS5uYW1lICAgICAgICAgICAgPSAiVW5pZmllZCIsCisJCS5zaXplX3Byb3AgICAgICAgPSAiZC1jYWNoZS1zaXplIiwKKwkJLmxpbmVfc2l6ZV9wcm9wcyA9IHsgImQtY2FjaGUtbGluZS1zaXplIiwKKwkJCQkgICAgICJkLWNhY2hlLWJsb2NrLXNpemUiLCB9LAorCQkubnJfc2V0c19wcm9wICAgID0gImQtY2FjaGUtc2V0cyIsCisJfSwKKwl7CisJCS5uYW1lICAgICAgICAgICAgPSAiSW5zdHJ1Y3Rpb24iLAorCQkuc2l6ZV9wcm9wICAgICAgID0gImktY2FjaGUtc2l6ZSIsCisJCS5saW5lX3NpemVfcHJvcHMgPSB7ICJpLWNhY2hlLWxpbmUtc2l6ZSIsCisJCQkJICAgICAiaS1jYWNoZS1ibG9jay1zaXplIiwgfSwKKwkJLm5yX3NldHNfcHJvcCAgICA9ICJpLWNhY2hlLXNldHMiLAorCX0sCisJeworCQkubmFtZSAgICAgICAgICAgID0gIkRhdGEiLAorCQkuc2l6ZV9wcm9wICAgICAgID0gImQtY2FjaGUtc2l6ZSIsCisJCS5saW5lX3NpemVfcHJvcHMgPSB7ICJkLWNhY2hlLWxpbmUtc2l6ZSIsCisJCQkJICAgICAiZC1jYWNoZS1ibG9jay1zaXplIiwgfSwKKwkJLm5yX3NldHNfcHJvcCAgICA9ICJkLWNhY2hlLXNldHMiLAorCX0sCit9OworCisvKiBDYWNoZSBvYmplY3Q6IGVhY2ggaW5zdGFuY2Ugb2YgdGhpcyBjb3JyZXNwb25kcyB0byBhIGRpc3RpbmN0IGNhY2hlCisgKiBpbiB0aGUgc3lzdGVtLiAgVGhlcmUgYXJlIHNlcGFyYXRlIG9iamVjdHMgZm9yIEhhcnZhcmQgY2FjaGVzOiBvbmUKKyAqIGVhY2ggZm9yIGluc3RydWN0aW9uIGFuZCBkYXRhLCBhbmQgZWFjaCByZWZlcnMgdG8gdGhlIHNhbWUgT0Ygbm9kZS4KKyAqIFRoZSByZWZjb3VudCBvZiB0aGUgT0Ygbm9kZSBpcyBlbGV2YXRlZCBmb3IgdGhlIGxpZmV0aW1lIG9mIHRoZQorICogY2FjaGUgb2JqZWN0LiAgQSBjYWNoZSBvYmplY3QgaXMgcmVsZWFzZWQgd2hlbiBpdHMgc2hhcmVkX2NwdV9tYXAKKyAqIGlzIGNsZWFyZWQgKHNlZSBjYWNoZV9jcHVfY2xlYXIpLgorICoKKyAqIEEgY2FjaGUgb2JqZWN0IGlzIG9uIHR3byBsaXN0czogYW4gdW5zb3J0ZWQgZ2xvYmFsIGxpc3QKKyAqIChjYWNoZV9saXN0KSBvZiBjYWNoZSBvYmplY3RzOyBhbmQgYSBzaW5nbHktbGlua2VkIGxpc3QKKyAqIHJlcHJlc2VudGluZyB0aGUgbG9jYWwgY2FjaGUgaGllcmFyY2h5LCB3aGljaCBpcyBvcmRlcmVkIGJ5IGxldmVsCisgKiAoZS5nLiBMMWQgLT4gTDFpIC0+IEwyIC0+IEwzKS4KKyAqLworc3RydWN0IGNhY2hlIHsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm9mbm9kZTsgICAgLyogT0Ygbm9kZSBmb3IgdGhpcyBjYWNoZSwgbWF5IGJlIGNwdSAqLworCXN0cnVjdCBjcHVtYXNrIHNoYXJlZF9jcHVfbWFwOyAvKiBvbmxpbmUgQ1BVcyB1c2luZyB0aGlzIGNhY2hlICovCisJaW50IHR5cGU7ICAgICAgICAgICAgICAgICAgICAgIC8qIHNwbGl0IGNhY2hlIGRpc2FtYmlndWF0aW9uICovCisJaW50IGxldmVsOyAgICAgICAgICAgICAgICAgICAgIC8qIGxldmVsIG5vdCBleHBsaWNpdCBpbiBkZXZpY2UgdHJlZSAqLworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsgICAgICAgICAvKiBnbG9iYWwgbGlzdCBvZiBjYWNoZSBvYmplY3RzICovCisJc3RydWN0IGNhY2hlICpuZXh0X2xvY2FsOyAgICAgIC8qIG5leHQgY2FjaGUgb2YgPj0gbGV2ZWwgKi8KK307CisKK3N0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgY2FjaGVfZGlyICosIGNhY2hlX2Rpcik7CisKKy8qIHRyYXZlcnNhbC9tb2RpZmljYXRpb24gb2YgdGhpcyBsaXN0IG9jY3VycyBvbmx5IGF0IGNwdSBob3RwbHVnIHRpbWU7CisgKiBhY2Nlc3MgaXMgc2VyaWFsaXplZCBieSBjcHUgaG90cGx1ZyBsb2NraW5nCisgKi8KK3N0YXRpYyBMSVNUX0hFQUQoY2FjaGVfbGlzdCk7CisKK3N0YXRpYyBzdHJ1Y3QgY2FjaGVfaW5kZXhfZGlyICprb2JqX3RvX2NhY2hlX2luZGV4X2RpcihzdHJ1Y3Qga29iamVjdCAqaykKK3sKKwlyZXR1cm4gY29udGFpbmVyX29mKGssIHN0cnVjdCBjYWNoZV9pbmRleF9kaXIsIGtvYmopOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqY2FjaGVfdHlwZV9zdHJpbmcoY29uc3Qgc3RydWN0IGNhY2hlICpjYWNoZSkKK3sKKwlyZXR1cm4gY2FjaGVfdHlwZV9pbmZvW2NhY2hlLT50eXBlXS5uYW1lOworfQorCitzdGF0aWMgdm9pZCBfX2NwdWluaXQgY2FjaGVfaW5pdChzdHJ1Y3QgY2FjaGUgKmNhY2hlLCBpbnQgdHlwZSwgaW50IGxldmVsLCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm9mbm9kZSkKK3sKKwljYWNoZS0+dHlwZSA9IHR5cGU7CisJY2FjaGUtPmxldmVsID0gbGV2ZWw7CisJY2FjaGUtPm9mbm9kZSA9IG9mX25vZGVfZ2V0KG9mbm9kZSk7CisJSU5JVF9MSVNUX0hFQUQoJmNhY2hlLT5saXN0KTsKKwlsaXN0X2FkZCgmY2FjaGUtPmxpc3QsICZjYWNoZV9saXN0KTsKK30KKworc3RhdGljIHN0cnVjdCBjYWNoZSAqX19jcHVpbml0IG5ld19jYWNoZShpbnQgdHlwZSwgaW50IGxldmVsLCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm9mbm9kZSkKK3sKKwlzdHJ1Y3QgY2FjaGUgKmNhY2hlOworCisJY2FjaGUgPSBremFsbG9jKHNpemVvZigqY2FjaGUpLCBHRlBfS0VSTkVMKTsKKwlpZiAoY2FjaGUpCisJCWNhY2hlX2luaXQoY2FjaGUsIHR5cGUsIGxldmVsLCBvZm5vZGUpOworCisJcmV0dXJuIGNhY2hlOworfQorCitzdGF0aWMgdm9pZCByZWxlYXNlX2NhY2hlX2RlYnVnY2hlY2soc3RydWN0IGNhY2hlICpjYWNoZSkKK3sKKwlzdHJ1Y3QgY2FjaGUgKml0ZXI7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGl0ZXIsICZjYWNoZV9saXN0LCBsaXN0KQorCQlXQVJOX09OQ0UoaXRlci0+bmV4dF9sb2NhbCA9PSBjYWNoZSwKKwkJCSAgImNhY2hlIGZvciAlcyglcykgcmVmZXJzIHRvIGNhY2hlIGZvciAlcyglcylcbiIsCisJCQkgIGl0ZXItPm9mbm9kZS0+ZnVsbF9uYW1lLAorCQkJICBjYWNoZV90eXBlX3N0cmluZyhpdGVyKSwKKwkJCSAgY2FjaGUtPm9mbm9kZS0+ZnVsbF9uYW1lLAorCQkJICBjYWNoZV90eXBlX3N0cmluZyhjYWNoZSkpOworfQorCitzdGF0aWMgdm9pZCByZWxlYXNlX2NhY2hlKHN0cnVjdCBjYWNoZSAqY2FjaGUpCit7CisJaWYgKCFjYWNoZSkKKwkJcmV0dXJuOworCisJcHJfZGVidWcoImZyZWVpbmcgTCVkICVzIGNhY2hlIGZvciAlc1xuIiwgY2FjaGUtPmxldmVsLAorCQkgY2FjaGVfdHlwZV9zdHJpbmcoY2FjaGUpLCBjYWNoZS0+b2Zub2RlLT5mdWxsX25hbWUpOworCisJcmVsZWFzZV9jYWNoZV9kZWJ1Z2NoZWNrKGNhY2hlKTsKKwlsaXN0X2RlbCgmY2FjaGUtPmxpc3QpOworCW9mX25vZGVfcHV0KGNhY2hlLT5vZm5vZGUpOworCWtmcmVlKGNhY2hlKTsKK30KKworc3RhdGljIHZvaWQgY2FjaGVfY3B1X3NldChzdHJ1Y3QgY2FjaGUgKmNhY2hlLCBpbnQgY3B1KQoreworCXN0cnVjdCBjYWNoZSAqbmV4dCA9IGNhY2hlOworCisJd2hpbGUgKG5leHQpIHsKKwkJV0FSTl9PTkNFKGNwdW1hc2tfdGVzdF9jcHUoY3B1LCAmbmV4dC0+c2hhcmVkX2NwdV9tYXApLAorCQkJICAiQ1BVICVpIGFscmVhZHkgYWNjb3VudGVkIGluICVzKCVzKVxuIiwKKwkJCSAgY3B1LCBuZXh0LT5vZm5vZGUtPmZ1bGxfbmFtZSwKKwkJCSAgY2FjaGVfdHlwZV9zdHJpbmcobmV4dCkpOworCQljcHVtYXNrX3NldF9jcHUoY3B1LCAmbmV4dC0+c2hhcmVkX2NwdV9tYXApOworCQluZXh0ID0gbmV4dC0+bmV4dF9sb2NhbDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgY2FjaGVfc2l6ZShjb25zdCBzdHJ1Y3QgY2FjaGUgKmNhY2hlLCB1bnNpZ25lZCBpbnQgKnJldCkKK3sKKwljb25zdCBjaGFyICpwcm9wbmFtZTsKKwljb25zdCB1MzIgKmNhY2hlX3NpemU7CisKKwlwcm9wbmFtZSA9IGNhY2hlX3R5cGVfaW5mb1tjYWNoZS0+dHlwZV0uc2l6ZV9wcm9wOworCisJY2FjaGVfc2l6ZSA9IG9mX2dldF9wcm9wZXJ0eShjYWNoZS0+b2Zub2RlLCBwcm9wbmFtZSwgTlVMTCk7CisJaWYgKCFjYWNoZV9zaXplKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCSpyZXQgPSAqY2FjaGVfc2l6ZTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjYWNoZV9zaXplX2tiKGNvbnN0IHN0cnVjdCBjYWNoZSAqY2FjaGUsIHVuc2lnbmVkIGludCAqcmV0KQoreworCXVuc2lnbmVkIGludCBzaXplOworCisJaWYgKGNhY2hlX3NpemUoY2FjaGUsICZzaXplKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwkqcmV0ID0gc2l6ZSAvIDEwMjQ7CisJcmV0dXJuIDA7Cit9CisKKy8qIG5vdCBjYWNoZV9saW5lX3NpemUoKSBiZWNhdXNlIHRoYXQncyBhIG1hY3JvIGluIGluY2x1ZGUvbGludXgvY2FjaGUuaCAqLworc3RhdGljIGludCBjYWNoZV9nZXRfbGluZV9zaXplKGNvbnN0IHN0cnVjdCBjYWNoZSAqY2FjaGUsIHVuc2lnbmVkIGludCAqcmV0KQoreworCWNvbnN0IHUzMiAqbGluZV9zaXplOworCWludCBpLCBsaW07CisKKwlsaW0gPSBBUlJBWV9TSVpFKGNhY2hlX3R5cGVfaW5mb1tjYWNoZS0+dHlwZV0ubGluZV9zaXplX3Byb3BzKTsKKworCWZvciAoaSA9IDA7IGkgPCBsaW07IGkrKykgeworCQljb25zdCBjaGFyICpwcm9wbmFtZTsKKworCQlwcm9wbmFtZSA9IGNhY2hlX3R5cGVfaW5mb1tjYWNoZS0+dHlwZV0ubGluZV9zaXplX3Byb3BzW2ldOworCQlsaW5lX3NpemUgPSBvZl9nZXRfcHJvcGVydHkoY2FjaGUtPm9mbm9kZSwgcHJvcG5hbWUsIE5VTEwpOworCQlpZiAobGluZV9zaXplKQorCQkJYnJlYWs7CisJfQorCisJaWYgKCFsaW5lX3NpemUpCisJCXJldHVybiAtRU5PREVWOworCisJKnJldCA9ICpsaW5lX3NpemU7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2FjaGVfbnJfc2V0cyhjb25zdCBzdHJ1Y3QgY2FjaGUgKmNhY2hlLCB1bnNpZ25lZCBpbnQgKnJldCkKK3sKKwljb25zdCBjaGFyICpwcm9wbmFtZTsKKwljb25zdCB1MzIgKm5yX3NldHM7CisKKwlwcm9wbmFtZSA9IGNhY2hlX3R5cGVfaW5mb1tjYWNoZS0+dHlwZV0ubnJfc2V0c19wcm9wOworCisJbnJfc2V0cyA9IG9mX2dldF9wcm9wZXJ0eShjYWNoZS0+b2Zub2RlLCBwcm9wbmFtZSwgTlVMTCk7CisJaWYgKCFucl9zZXRzKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCSpyZXQgPSAqbnJfc2V0czsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjYWNoZV9hc3NvY2lhdGl2aXR5KGNvbnN0IHN0cnVjdCBjYWNoZSAqY2FjaGUsIHVuc2lnbmVkIGludCAqcmV0KQoreworCXVuc2lnbmVkIGludCBsaW5lX3NpemU7CisJdW5zaWduZWQgaW50IG5yX3NldHM7CisJdW5zaWduZWQgaW50IHNpemU7CisKKwlpZiAoY2FjaGVfbnJfc2V0cyhjYWNoZSwgJm5yX3NldHMpKQorCQlnb3RvIGVycjsKKworCS8qIElmIHRoZSBjYWNoZSBpcyBmdWxseSBhc3NvY2lhdGl2ZSwgdGhlcmUgaXMgbm8gbmVlZCB0bworCSAqIGNoZWNrIHRoZSBvdGhlciBwcm9wZXJ0aWVzLgorCSAqLworCWlmIChucl9zZXRzID09IDEpIHsKKwkJKnJldCA9IDA7CisJCXJldHVybiAwOworCX0KKworCWlmIChjYWNoZV9nZXRfbGluZV9zaXplKGNhY2hlLCAmbGluZV9zaXplKSkKKwkJZ290byBlcnI7CisJaWYgKGNhY2hlX3NpemUoY2FjaGUsICZzaXplKSkKKwkJZ290byBlcnI7CisKKwlpZiAoIShucl9zZXRzID4gMCAmJiBzaXplID4gMCAmJiBsaW5lX3NpemUgPiAwKSkKKwkJZ290byBlcnI7CisKKwkqcmV0ID0gKHNpemUgLyBucl9zZXRzKSAvIGxpbmVfc2l6ZTsKKwlyZXR1cm4gMDsKK2VycjoKKwlyZXR1cm4gLUVOT0RFVjsKK30KKworLyogaGVscGVyIGZvciBkZWFsaW5nIHdpdGggc3BsaXQgY2FjaGVzICovCitzdGF0aWMgc3RydWN0IGNhY2hlICpjYWNoZV9maW5kX2ZpcnN0X3NpYmxpbmcoc3RydWN0IGNhY2hlICpjYWNoZSkKK3sKKwlzdHJ1Y3QgY2FjaGUgKml0ZXI7CisKKwlpZiAoY2FjaGUtPnR5cGUgPT0gQ0FDSEVfVFlQRV9VTklGSUVEKQorCQlyZXR1cm4gY2FjaGU7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGl0ZXIsICZjYWNoZV9saXN0LCBsaXN0KQorCQlpZiAoaXRlci0+b2Zub2RlID09IGNhY2hlLT5vZm5vZGUgJiYgaXRlci0+bmV4dF9sb2NhbCA9PSBjYWNoZSkKKwkJCXJldHVybiBpdGVyOworCisJcmV0dXJuIGNhY2hlOworfQorCisvKiByZXR1cm4gdGhlIGZpcnN0IGNhY2hlIG9uIGEgbG9jYWwgbGlzdCBtYXRjaGluZyBub2RlICovCitzdGF0aWMgc3RydWN0IGNhY2hlICpjYWNoZV9sb29rdXBfYnlfbm9kZShjb25zdCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUpCit7CisJc3RydWN0IGNhY2hlICpjYWNoZSA9IE5VTEw7CisJc3RydWN0IGNhY2hlICppdGVyOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShpdGVyLCAmY2FjaGVfbGlzdCwgbGlzdCkgeworCQlpZiAoaXRlci0+b2Zub2RlICE9IG5vZGUpCisJCQljb250aW51ZTsKKwkJY2FjaGUgPSBjYWNoZV9maW5kX2ZpcnN0X3NpYmxpbmcoaXRlcik7CisJCWJyZWFrOworCX0KKworCXJldHVybiBjYWNoZTsKK30KKworc3RhdGljIGJvb2wgY2FjaGVfbm9kZV9pc191bmlmaWVkKGNvbnN0IHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCit7CisJcmV0dXJuIG9mX2dldF9wcm9wZXJ0eShucCwgImNhY2hlLXVuaWZpZWQiLCBOVUxMKTsKK30KKworc3RhdGljIHN0cnVjdCBjYWNoZSAqX19jcHVpbml0IGNhY2hlX2RvX29uZV9kZXZub2RlX3VuaWZpZWQoc3RydWN0IGRldmljZV9ub2RlICpub2RlLCBpbnQgbGV2ZWwpCit7CisJc3RydWN0IGNhY2hlICpjYWNoZTsKKworCXByX2RlYnVnKCJjcmVhdGluZyBMJWQgdWNhY2hlIGZvciAlc1xuIiwgbGV2ZWwsIG5vZGUtPmZ1bGxfbmFtZSk7CisKKwljYWNoZSA9IG5ld19jYWNoZShDQUNIRV9UWVBFX1VOSUZJRUQsIGxldmVsLCBub2RlKTsKKworCXJldHVybiBjYWNoZTsKK30KKworc3RhdGljIHN0cnVjdCBjYWNoZSAqX19jcHVpbml0IGNhY2hlX2RvX29uZV9kZXZub2RlX3NwbGl0KHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSwgaW50IGxldmVsKQoreworCXN0cnVjdCBjYWNoZSAqZGNhY2hlLCAqaWNhY2hlOworCisJcHJfZGVidWcoImNyZWF0aW5nIEwlZCBkY2FjaGUgYW5kIGljYWNoZSBmb3IgJXNcbiIsIGxldmVsLAorCQkgbm9kZS0+ZnVsbF9uYW1lKTsKKworCWRjYWNoZSA9IG5ld19jYWNoZShDQUNIRV9UWVBFX0RBVEEsIGxldmVsLCBub2RlKTsKKwlpY2FjaGUgPSBuZXdfY2FjaGUoQ0FDSEVfVFlQRV9JTlNUUlVDVElPTiwgbGV2ZWwsIG5vZGUpOworCisJaWYgKCFkY2FjaGUgfHwgIWljYWNoZSkKKwkJZ290byBlcnI7CisKKwlkY2FjaGUtPm5leHRfbG9jYWwgPSBpY2FjaGU7CisKKwlyZXR1cm4gZGNhY2hlOworZXJyOgorCXJlbGVhc2VfY2FjaGUoZGNhY2hlKTsKKwlyZWxlYXNlX2NhY2hlKGljYWNoZSk7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY2FjaGUgKl9fY3B1aW5pdCBjYWNoZV9kb19vbmVfZGV2bm9kZShzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUsIGludCBsZXZlbCkKK3sKKwlzdHJ1Y3QgY2FjaGUgKmNhY2hlOworCisJaWYgKGNhY2hlX25vZGVfaXNfdW5pZmllZChub2RlKSkKKwkJY2FjaGUgPSBjYWNoZV9kb19vbmVfZGV2bm9kZV91bmlmaWVkKG5vZGUsIGxldmVsKTsKKwllbHNlCisJCWNhY2hlID0gY2FjaGVfZG9fb25lX2Rldm5vZGVfc3BsaXQobm9kZSwgbGV2ZWwpOworCisJcmV0dXJuIGNhY2hlOworfQorCitzdGF0aWMgc3RydWN0IGNhY2hlICpfX2NwdWluaXQgY2FjaGVfbG9va3VwX29yX2luc3RhbnRpYXRlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSwgaW50IGxldmVsKQoreworCXN0cnVjdCBjYWNoZSAqY2FjaGU7CisKKwljYWNoZSA9IGNhY2hlX2xvb2t1cF9ieV9ub2RlKG5vZGUpOworCisJV0FSTl9PTkNFKGNhY2hlICYmIGNhY2hlLT5sZXZlbCAhPSBsZXZlbCwKKwkJICAiY2FjaGUgbGV2ZWwgbWlzbWF0Y2ggb24gbG9va3VwIChnb3QgJWQsIGV4cGVjdGVkICVkKVxuIiwKKwkJICBjYWNoZS0+bGV2ZWwsIGxldmVsKTsKKworCWlmICghY2FjaGUpCisJCWNhY2hlID0gY2FjaGVfZG9fb25lX2Rldm5vZGUobm9kZSwgbGV2ZWwpOworCisJcmV0dXJuIGNhY2hlOworfQorCitzdGF0aWMgdm9pZCBfX2NwdWluaXQgbGlua19jYWNoZV9saXN0cyhzdHJ1Y3QgY2FjaGUgKnNtYWxsZXIsIHN0cnVjdCBjYWNoZSAqYmlnZ2VyKQoreworCXdoaWxlIChzbWFsbGVyLT5uZXh0X2xvY2FsKSB7CisJCWlmIChzbWFsbGVyLT5uZXh0X2xvY2FsID09IGJpZ2dlcikKKwkJCXJldHVybjsgLyogYWxyZWFkeSBsaW5rZWQgKi8KKwkJc21hbGxlciA9IHNtYWxsZXItPm5leHRfbG9jYWw7CisJfQorCisJc21hbGxlci0+bmV4dF9sb2NhbCA9IGJpZ2dlcjsKK30KKworc3RhdGljIHZvaWQgX19jcHVpbml0IGRvX3N1YnNpZGlhcnlfY2FjaGVzX2RlYnVnY2hlY2soc3RydWN0IGNhY2hlICpjYWNoZSkKK3sKKwlXQVJOX09OX09OQ0UoY2FjaGUtPmxldmVsICE9IDEpOworCVdBUk5fT05fT05DRShzdHJjbXAoY2FjaGUtPm9mbm9kZS0+dHlwZSwgImNwdSIpKTsKK30KKworc3RhdGljIHZvaWQgX19jcHVpbml0IGRvX3N1YnNpZGlhcnlfY2FjaGVzKHN0cnVjdCBjYWNoZSAqY2FjaGUpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpzdWJjYWNoZV9ub2RlOworCWludCBsZXZlbCA9IGNhY2hlLT5sZXZlbDsKKworCWRvX3N1YnNpZGlhcnlfY2FjaGVzX2RlYnVnY2hlY2soY2FjaGUpOworCisJd2hpbGUgKChzdWJjYWNoZV9ub2RlID0gb2ZfZmluZF9uZXh0X2NhY2hlX25vZGUoY2FjaGUtPm9mbm9kZSkpKSB7CisJCXN0cnVjdCBjYWNoZSAqc3ViY2FjaGU7CisKKwkJbGV2ZWwrKzsKKwkJc3ViY2FjaGUgPSBjYWNoZV9sb29rdXBfb3JfaW5zdGFudGlhdGUoc3ViY2FjaGVfbm9kZSwgbGV2ZWwpOworCQlvZl9ub2RlX3B1dChzdWJjYWNoZV9ub2RlKTsKKwkJaWYgKCFzdWJjYWNoZSkKKwkJCWJyZWFrOworCisJCWxpbmtfY2FjaGVfbGlzdHMoY2FjaGUsIHN1YmNhY2hlKTsKKwkJY2FjaGUgPSBzdWJjYWNoZTsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY2FjaGUgKl9fY3B1aW5pdCBjYWNoZV9jaGFpbl9pbnN0YW50aWF0ZSh1bnNpZ25lZCBpbnQgY3B1X2lkKQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqY3B1X25vZGU7CisJc3RydWN0IGNhY2hlICpjcHVfY2FjaGUgPSBOVUxMOworCisJcHJfZGVidWcoImNyZWF0aW5nIGNhY2hlIG9iamVjdChzKSBmb3IgQ1BVICVpXG4iLCBjcHVfaWQpOworCisJY3B1X25vZGUgPSBvZl9nZXRfY3B1X25vZGUoY3B1X2lkLCBOVUxMKTsKKwlXQVJOX09OQ0UoIWNwdV9ub2RlLCAibm8gT0Ygbm9kZSBmb3VuZCBmb3IgQ1BVICVpXG4iLCBjcHVfaWQpOworCWlmICghY3B1X25vZGUpCisJCWdvdG8gb3V0OworCisJY3B1X2NhY2hlID0gY2FjaGVfbG9va3VwX29yX2luc3RhbnRpYXRlKGNwdV9ub2RlLCAxKTsKKwlpZiAoIWNwdV9jYWNoZSkKKwkJZ290byBvdXQ7CisKKwlkb19zdWJzaWRpYXJ5X2NhY2hlcyhjcHVfY2FjaGUpOworCisJY2FjaGVfY3B1X3NldChjcHVfY2FjaGUsIGNwdV9pZCk7CitvdXQ6CisJb2Zfbm9kZV9wdXQoY3B1X25vZGUpOworCisJcmV0dXJuIGNwdV9jYWNoZTsKK30KKworc3RhdGljIHN0cnVjdCBjYWNoZV9kaXIgKl9fY3B1aW5pdCBjYWNoZWluZm9fY3JlYXRlX2NhY2hlX2Rpcih1bnNpZ25lZCBpbnQgY3B1X2lkKQoreworCXN0cnVjdCBjYWNoZV9kaXIgKmNhY2hlX2RpcjsKKwlzdHJ1Y3Qgc3lzX2RldmljZSAqc3lzZGV2OworCXN0cnVjdCBrb2JqZWN0ICprb2JqID0gTlVMTDsKKworCXN5c2RldiA9IGdldF9jcHVfc3lzZGV2KGNwdV9pZCk7CisJV0FSTl9PTkNFKCFzeXNkZXYsICJubyBzeXNkZXYgZm9yIENQVSAlaVxuIiwgY3B1X2lkKTsKKwlpZiAoIXN5c2RldikKKwkJZ290byBlcnI7CisKKwlrb2JqID0ga29iamVjdF9jcmVhdGVfYW5kX2FkZCgiY2FjaGUiLCAmc3lzZGV2LT5rb2JqKTsKKwlpZiAoIWtvYmopCisJCWdvdG8gZXJyOworCisJY2FjaGVfZGlyID0ga3phbGxvYyhzaXplb2YoKmNhY2hlX2RpciksIEdGUF9LRVJORUwpOworCWlmICghY2FjaGVfZGlyKQorCQlnb3RvIGVycjsKKworCWNhY2hlX2Rpci0+a29iaiA9IGtvYmo7CisKKwlXQVJOX09OX09OQ0UocGVyX2NwdShjYWNoZV9kaXIsIGNwdV9pZCkgIT0gTlVMTCk7CisKKwlwZXJfY3B1KGNhY2hlX2RpciwgY3B1X2lkKSA9IGNhY2hlX2RpcjsKKworCXJldHVybiBjYWNoZV9kaXI7CitlcnI6CisJa29iamVjdF9wdXQoa29iaik7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIGNhY2hlX2luZGV4X3JlbGVhc2Uoc3RydWN0IGtvYmplY3QgKmtvYmopCit7CisJc3RydWN0IGNhY2hlX2luZGV4X2RpciAqaW5kZXg7CisKKwlpbmRleCA9IGtvYmpfdG9fY2FjaGVfaW5kZXhfZGlyKGtvYmopOworCisJcHJfZGVidWcoImZyZWVpbmcgaW5kZXggZGlyZWN0b3J5IGZvciBMJWQgJXMgY2FjaGVcbiIsCisJCSBpbmRleC0+Y2FjaGUtPmxldmVsLCBjYWNoZV90eXBlX3N0cmluZyhpbmRleC0+Y2FjaGUpKTsKKworCWtmcmVlKGluZGV4KTsKK30KKworc3RhdGljIHNzaXplX3QgY2FjaGVfaW5kZXhfc2hvdyhzdHJ1Y3Qga29iamVjdCAqaywgc3RydWN0IGF0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBrb2JqX2F0dHJpYnV0ZSAqa29ial9hdHRyOworCisJa29ial9hdHRyID0gY29udGFpbmVyX29mKGF0dHIsIHN0cnVjdCBrb2JqX2F0dHJpYnV0ZSwgYXR0cik7CisKKwlyZXR1cm4ga29ial9hdHRyLT5zaG93KGssIGtvYmpfYXR0ciwgYnVmKTsKK30KKworc3RhdGljIHN0cnVjdCBjYWNoZSAqaW5kZXhfa29ial90b19jYWNoZShzdHJ1Y3Qga29iamVjdCAqaykKK3sKKwlzdHJ1Y3QgY2FjaGVfaW5kZXhfZGlyICppbmRleDsKKworCWluZGV4ID0ga29ial90b19jYWNoZV9pbmRleF9kaXIoayk7CisKKwlyZXR1cm4gaW5kZXgtPmNhY2hlOworfQorCitzdGF0aWMgc3NpemVfdCBzaXplX3Nob3coc3RydWN0IGtvYmplY3QgKmssIHN0cnVjdCBrb2JqX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXVuc2lnbmVkIGludCBzaXplX2tiOworCXN0cnVjdCBjYWNoZSAqY2FjaGU7CisKKwljYWNoZSA9IGluZGV4X2tvYmpfdG9fY2FjaGUoayk7CisKKwlpZiAoY2FjaGVfc2l6ZV9rYihjYWNoZSwgJnNpemVfa2IpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1S1xuIiwgc2l6ZV9rYik7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgY2FjaGVfc2l6ZV9hdHRyID0KKwlfX0FUVFIoc2l6ZSwgMDQ0NCwgc2l6ZV9zaG93LCBOVUxMKTsKKworCitzdGF0aWMgc3NpemVfdCBsaW5lX3NpemVfc2hvdyhzdHJ1Y3Qga29iamVjdCAqaywgc3RydWN0IGtvYmpfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJdW5zaWduZWQgaW50IGxpbmVfc2l6ZTsKKwlzdHJ1Y3QgY2FjaGUgKmNhY2hlOworCisJY2FjaGUgPSBpbmRleF9rb2JqX3RvX2NhY2hlKGspOworCisJaWYgKGNhY2hlX2dldF9saW5lX3NpemUoY2FjaGUsICZsaW5lX3NpemUpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCBsaW5lX3NpemUpOworfQorCitzdGF0aWMgc3RydWN0IGtvYmpfYXR0cmlidXRlIGNhY2hlX2xpbmVfc2l6ZV9hdHRyID0KKwlfX0FUVFIoY29oZXJlbmN5X2xpbmVfc2l6ZSwgMDQ0NCwgbGluZV9zaXplX3Nob3csIE5VTEwpOworCitzdGF0aWMgc3NpemVfdCBucl9zZXRzX3Nob3coc3RydWN0IGtvYmplY3QgKmssIHN0cnVjdCBrb2JqX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXVuc2lnbmVkIGludCBucl9zZXRzOworCXN0cnVjdCBjYWNoZSAqY2FjaGU7CisKKwljYWNoZSA9IGluZGV4X2tvYmpfdG9fY2FjaGUoayk7CisKKwlpZiAoY2FjaGVfbnJfc2V0cyhjYWNoZSwgJm5yX3NldHMpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCBucl9zZXRzKTsKK30KKworc3RhdGljIHN0cnVjdCBrb2JqX2F0dHJpYnV0ZSBjYWNoZV9ucl9zZXRzX2F0dHIgPQorCV9fQVRUUihudW1iZXJfb2Zfc2V0cywgMDQ0NCwgbnJfc2V0c19zaG93LCBOVUxMKTsKKworc3RhdGljIHNzaXplX3QgYXNzb2NpYXRpdml0eV9zaG93KHN0cnVjdCBrb2JqZWN0ICprLCBzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwl1bnNpZ25lZCBpbnQgYXNzb2NpYXRpdml0eTsKKwlzdHJ1Y3QgY2FjaGUgKmNhY2hlOworCisJY2FjaGUgPSBpbmRleF9rb2JqX3RvX2NhY2hlKGspOworCisJaWYgKGNhY2hlX2Fzc29jaWF0aXZpdHkoY2FjaGUsICZhc3NvY2lhdGl2aXR5KSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgYXNzb2NpYXRpdml0eSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgY2FjaGVfYXNzb2NfYXR0ciA9CisJX19BVFRSKHdheXNfb2ZfYXNzb2NpYXRpdml0eSwgMDQ0NCwgYXNzb2NpYXRpdml0eV9zaG93LCBOVUxMKTsKKworc3RhdGljIHNzaXplX3QgdHlwZV9zaG93KHN0cnVjdCBrb2JqZWN0ICprLCBzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgY2FjaGUgKmNhY2hlOworCisJY2FjaGUgPSBpbmRleF9rb2JqX3RvX2NhY2hlKGspOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXNcbiIsIGNhY2hlX3R5cGVfc3RyaW5nKGNhY2hlKSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgY2FjaGVfdHlwZV9hdHRyID0KKwlfX0FUVFIodHlwZSwgMDQ0NCwgdHlwZV9zaG93LCBOVUxMKTsKKworc3RhdGljIHNzaXplX3QgbGV2ZWxfc2hvdyhzdHJ1Y3Qga29iamVjdCAqaywgc3RydWN0IGtvYmpfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IGNhY2hlX2luZGV4X2RpciAqaW5kZXg7CisJc3RydWN0IGNhY2hlICpjYWNoZTsKKworCWluZGV4ID0ga29ial90b19jYWNoZV9pbmRleF9kaXIoayk7CisJY2FjaGUgPSBpbmRleC0+Y2FjaGU7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgY2FjaGUtPmxldmVsKTsKK30KKworc3RhdGljIHN0cnVjdCBrb2JqX2F0dHJpYnV0ZSBjYWNoZV9sZXZlbF9hdHRyID0KKwlfX0FUVFIobGV2ZWwsIDA0NDQsIGxldmVsX3Nob3csIE5VTEwpOworCitzdGF0aWMgc3NpemVfdCBzaGFyZWRfY3B1X21hcF9zaG93KHN0cnVjdCBrb2JqZWN0ICprLCBzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgY2FjaGVfaW5kZXhfZGlyICppbmRleDsKKwlzdHJ1Y3QgY2FjaGUgKmNhY2hlOworCWludCBsZW47CisJaW50IG4gPSAwOworCisJaW5kZXggPSBrb2JqX3RvX2NhY2hlX2luZGV4X2RpcihrKTsKKwljYWNoZSA9IGluZGV4LT5jYWNoZTsKKwlsZW4gPSBQQUdFX1NJWkUgLSAyOworCisJaWYgKGxlbiA+IDEpIHsKKwkJbiA9IGNwdW1hc2tfc2NucHJpbnRmKGJ1ZiwgbGVuLCAmY2FjaGUtPnNoYXJlZF9jcHVfbWFwKTsKKwkJYnVmW24rK10gPSAnXG4nOworCQlidWZbbl0gPSAnXDAnOworCX0KKwlyZXR1cm4gbjsKK30KKworc3RhdGljIHN0cnVjdCBrb2JqX2F0dHJpYnV0ZSBjYWNoZV9zaGFyZWRfY3B1X21hcF9hdHRyID0KKwlfX0FUVFIoc2hhcmVkX2NwdV9tYXAsIDA0NDQsIHNoYXJlZF9jcHVfbWFwX3Nob3csIE5VTEwpOworCisvKiBBdHRyaWJ1dGVzIHdoaWNoIHNob3VsZCBhbHdheXMgYmUgY3JlYXRlZCAtLSB0aGUga29iamVjdC9zeXNmcyBjb3JlCisgKiBkb2VzIHRoaXMgYXV0b21hdGljYWxseSB2aWEga29ial90eXBlLT5kZWZhdWx0X2F0dHJzLiAgVGhpcyBpcyB0aGUKKyAqIG1pbmltdW0gZGF0YSByZXF1aXJlZCB0byB1bmlxdWVseSBpZGVudGlmeSBhIGNhY2hlLgorICovCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqY2FjaGVfaW5kZXhfZGVmYXVsdF9hdHRyc1tdID0geworCSZjYWNoZV90eXBlX2F0dHIuYXR0ciwKKwkmY2FjaGVfbGV2ZWxfYXR0ci5hdHRyLAorCSZjYWNoZV9zaGFyZWRfY3B1X21hcF9hdHRyLmF0dHIsCisJTlVMTCwKK307CisKKy8qIEF0dHJpYnV0ZXMgd2hpY2ggc2hvdWxkIGJlIGNyZWF0ZWQgaWYgdGhlIGNhY2hlIGRldmljZSBub2RlIGhhcyB0aGUKKyAqIHJpZ2h0IHByb3BlcnRpZXMgLS0gc2VlIGNhY2hlaW5mb19jcmVhdGVfaW5kZXhfb3B0X2F0dHJzCisgKi8KK3N0YXRpYyBzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgKmNhY2hlX2luZGV4X29wdF9hdHRyc1tdID0geworCSZjYWNoZV9zaXplX2F0dHIsCisJJmNhY2hlX2xpbmVfc2l6ZV9hdHRyLAorCSZjYWNoZV9ucl9zZXRzX2F0dHIsCisJJmNhY2hlX2Fzc29jX2F0dHIsCit9OworCitzdGF0aWMgc3RydWN0IHN5c2ZzX29wcyBjYWNoZV9pbmRleF9vcHMgPSB7CisJLnNob3cgPSBjYWNoZV9pbmRleF9zaG93LAorfTsKKworc3RhdGljIHN0cnVjdCBrb2JqX3R5cGUgY2FjaGVfaW5kZXhfdHlwZSA9IHsKKwkucmVsZWFzZSA9IGNhY2hlX2luZGV4X3JlbGVhc2UsCisJLnN5c2ZzX29wcyA9ICZjYWNoZV9pbmRleF9vcHMsCisJLmRlZmF1bHRfYXR0cnMgPSBjYWNoZV9pbmRleF9kZWZhdWx0X2F0dHJzLAorfTsKKworc3RhdGljIHZvaWQgX19jcHVpbml0IGNhY2hlaW5mb19jcmVhdGVfaW5kZXhfb3B0X2F0dHJzKHN0cnVjdCBjYWNoZV9pbmRleF9kaXIgKmRpcikKK3sKKwljb25zdCBjaGFyICpjYWNoZV9uYW1lOworCWNvbnN0IGNoYXIgKmNhY2hlX3R5cGU7CisJc3RydWN0IGNhY2hlICpjYWNoZTsKKwljaGFyICpidWY7CisJaW50IGk7CisKKwlidWYgPSBrbWFsbG9jKFBBR0VfU0laRSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFidWYpCisJCXJldHVybjsKKworCWNhY2hlID0gZGlyLT5jYWNoZTsKKwljYWNoZV9uYW1lID0gY2FjaGUtPm9mbm9kZS0+ZnVsbF9uYW1lOworCWNhY2hlX3R5cGUgPSBjYWNoZV90eXBlX3N0cmluZyhjYWNoZSk7CisKKwkvKiBXZSBkb24ndCB3YW50IHRvIGNyZWF0ZSBhbiBhdHRyaWJ1dGUgdGhhdCBjYW4ndCBwcm92aWRlIGEKKwkgKiBtZWFuaW5nZnVsIHZhbHVlLiAgQ2hlY2sgdGhlIHJldHVybiB2YWx1ZSBvZiBlYWNoIG9wdGlvbmFsCisJICogYXR0cmlidXRlJ3MgLT5zaG93IG1ldGhvZCBiZWZvcmUgcmVnaXN0ZXJpbmcgdGhlCisJICogYXR0cmlidXRlLgorCSAqLworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGNhY2hlX2luZGV4X29wdF9hdHRycyk7IGkrKykgeworCQlzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgKmF0dHI7CisJCXNzaXplX3QgcmM7CisKKwkJYXR0ciA9IGNhY2hlX2luZGV4X29wdF9hdHRyc1tpXTsKKworCQlyYyA9IGF0dHItPnNob3coJmRpci0+a29iaiwgYXR0ciwgYnVmKTsKKwkJaWYgKHJjIDw9IDApIHsKKwkJCXByX2RlYnVnKCJub3QgY3JlYXRpbmcgJXMgYXR0cmlidXRlIGZvciAiCisJCQkJICIlcyglcykgKHJjID0gJXpkKVxuIiwKKwkJCQkgYXR0ci0+YXR0ci5uYW1lLCBjYWNoZV9uYW1lLAorCQkJCSBjYWNoZV90eXBlLCByYyk7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoc3lzZnNfY3JlYXRlX2ZpbGUoJmRpci0+a29iaiwgJmF0dHItPmF0dHIpKQorCQkJcHJfZGVidWcoImNvdWxkIG5vdCBjcmVhdGUgJXMgYXR0cmlidXRlIGZvciAlcyglcylcbiIsCisJCQkJIGF0dHItPmF0dHIubmFtZSwgY2FjaGVfbmFtZSwgY2FjaGVfdHlwZSk7CisJfQorCisJa2ZyZWUoYnVmKTsKK30KKworc3RhdGljIHZvaWQgX19jcHVpbml0IGNhY2hlaW5mb19jcmVhdGVfaW5kZXhfZGlyKHN0cnVjdCBjYWNoZSAqY2FjaGUsIGludCBpbmRleCwgc3RydWN0IGNhY2hlX2RpciAqY2FjaGVfZGlyKQoreworCXN0cnVjdCBjYWNoZV9pbmRleF9kaXIgKmluZGV4X2RpcjsKKwlpbnQgcmM7CisKKwlpbmRleF9kaXIgPSBremFsbG9jKHNpemVvZigqaW5kZXhfZGlyKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFpbmRleF9kaXIpCisJCWdvdG8gZXJyOworCisJaW5kZXhfZGlyLT5jYWNoZSA9IGNhY2hlOworCisJcmMgPSBrb2JqZWN0X2luaXRfYW5kX2FkZCgmaW5kZXhfZGlyLT5rb2JqLCAmY2FjaGVfaW5kZXhfdHlwZSwKKwkJCQkgIGNhY2hlX2Rpci0+a29iaiwgImluZGV4JWQiLCBpbmRleCk7CisJaWYgKHJjKQorCQlnb3RvIGVycjsKKworCWluZGV4X2Rpci0+bmV4dCA9IGNhY2hlX2Rpci0+aW5kZXg7CisJY2FjaGVfZGlyLT5pbmRleCA9IGluZGV4X2RpcjsKKworCWNhY2hlaW5mb19jcmVhdGVfaW5kZXhfb3B0X2F0dHJzKGluZGV4X2Rpcik7CisKKwlyZXR1cm47CitlcnI6CisJa2ZyZWUoaW5kZXhfZGlyKTsKK30KKworc3RhdGljIHZvaWQgX19jcHVpbml0IGNhY2hlaW5mb19zeXNmc19wb3B1bGF0ZSh1bnNpZ25lZCBpbnQgY3B1X2lkLCBzdHJ1Y3QgY2FjaGUgKmNhY2hlX2xpc3QpCit7CisJc3RydWN0IGNhY2hlX2RpciAqY2FjaGVfZGlyOworCXN0cnVjdCBjYWNoZSAqY2FjaGU7CisJaW50IGluZGV4ID0gMDsKKworCWNhY2hlX2RpciA9IGNhY2hlaW5mb19jcmVhdGVfY2FjaGVfZGlyKGNwdV9pZCk7CisJaWYgKCFjYWNoZV9kaXIpCisJCXJldHVybjsKKworCWNhY2hlID0gY2FjaGVfbGlzdDsKKwl3aGlsZSAoY2FjaGUpIHsKKwkJY2FjaGVpbmZvX2NyZWF0ZV9pbmRleF9kaXIoY2FjaGUsIGluZGV4LCBjYWNoZV9kaXIpOworCQlpbmRleCsrOworCQljYWNoZSA9IGNhY2hlLT5uZXh0X2xvY2FsOworCX0KK30KKwordm9pZCBfX2NwdWluaXQgY2FjaGVpbmZvX2NwdV9vbmxpbmUodW5zaWduZWQgaW50IGNwdV9pZCkKK3sKKwlzdHJ1Y3QgY2FjaGUgKmNhY2hlOworCisJY2FjaGUgPSBjYWNoZV9jaGFpbl9pbnN0YW50aWF0ZShjcHVfaWQpOworCWlmICghY2FjaGUpCisJCXJldHVybjsKKworCWNhY2hlaW5mb19zeXNmc19wb3B1bGF0ZShjcHVfaWQsIGNhY2hlKTsKK30KKworI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVSAvKiBmdW5jdGlvbnMgbmVlZGVkIGZvciBjcHUgb2ZmbGluZSAqLworCitzdGF0aWMgc3RydWN0IGNhY2hlICpjYWNoZV9sb29rdXBfYnlfY3B1KHVuc2lnbmVkIGludCBjcHVfaWQpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpjcHVfbm9kZTsKKwlzdHJ1Y3QgY2FjaGUgKmNhY2hlOworCisJY3B1X25vZGUgPSBvZl9nZXRfY3B1X25vZGUoY3B1X2lkLCBOVUxMKTsKKwlXQVJOX09OQ0UoIWNwdV9ub2RlLCAibm8gT0Ygbm9kZSBmb3VuZCBmb3IgQ1BVICVpXG4iLCBjcHVfaWQpOworCWlmICghY3B1X25vZGUpCisJCXJldHVybiBOVUxMOworCisJY2FjaGUgPSBjYWNoZV9sb29rdXBfYnlfbm9kZShjcHVfbm9kZSk7CisJb2Zfbm9kZV9wdXQoY3B1X25vZGUpOworCisJcmV0dXJuIGNhY2hlOworfQorCitzdGF0aWMgdm9pZCByZW1vdmVfaW5kZXhfZGlycyhzdHJ1Y3QgY2FjaGVfZGlyICpjYWNoZV9kaXIpCit7CisJc3RydWN0IGNhY2hlX2luZGV4X2RpciAqaW5kZXg7CisKKwlpbmRleCA9IGNhY2hlX2Rpci0+aW5kZXg7CisKKwl3aGlsZSAoaW5kZXgpIHsKKwkJc3RydWN0IGNhY2hlX2luZGV4X2RpciAqbmV4dDsKKworCQluZXh0ID0gaW5kZXgtPm5leHQ7CisJCWtvYmplY3RfcHV0KCZpbmRleC0+a29iaik7CisJCWluZGV4ID0gbmV4dDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHJlbW92ZV9jYWNoZV9kaXIoc3RydWN0IGNhY2hlX2RpciAqY2FjaGVfZGlyKQoreworCXJlbW92ZV9pbmRleF9kaXJzKGNhY2hlX2Rpcik7CisKKwlrb2JqZWN0X3B1dChjYWNoZV9kaXItPmtvYmopOworCisJa2ZyZWUoY2FjaGVfZGlyKTsKK30KKworc3RhdGljIHZvaWQgY2FjaGVfY3B1X2NsZWFyKHN0cnVjdCBjYWNoZSAqY2FjaGUsIGludCBjcHUpCit7CisJd2hpbGUgKGNhY2hlKSB7CisJCXN0cnVjdCBjYWNoZSAqbmV4dCA9IGNhY2hlLT5uZXh0X2xvY2FsOworCisJCVdBUk5fT05DRSghY3B1bWFza190ZXN0X2NwdShjcHUsICZjYWNoZS0+c2hhcmVkX2NwdV9tYXApLAorCQkJICAiQ1BVICVpIG5vdCBhY2NvdW50ZWQgaW4gJXMoJXMpXG4iLAorCQkJICBjcHUsIGNhY2hlLT5vZm5vZGUtPmZ1bGxfbmFtZSwKKwkJCSAgY2FjaGVfdHlwZV9zdHJpbmcoY2FjaGUpKTsKKworCQljcHVtYXNrX2NsZWFyX2NwdShjcHUsICZjYWNoZS0+c2hhcmVkX2NwdV9tYXApOworCisJCS8qIFJlbGVhc2UgdGhlIGNhY2hlIG9iamVjdCBpZiBhbGwgdGhlIGNwdXMgdXNpbmcgaXQKKwkJICogYXJlIG9mZmxpbmUgKi8KKwkJaWYgKGNwdW1hc2tfZW1wdHkoJmNhY2hlLT5zaGFyZWRfY3B1X21hcCkpCisJCQlyZWxlYXNlX2NhY2hlKGNhY2hlKTsKKworCQljYWNoZSA9IG5leHQ7CisJfQorfQorCit2b2lkIGNhY2hlaW5mb19jcHVfb2ZmbGluZSh1bnNpZ25lZCBpbnQgY3B1X2lkKQoreworCXN0cnVjdCBjYWNoZV9kaXIgKmNhY2hlX2RpcjsKKwlzdHJ1Y3QgY2FjaGUgKmNhY2hlOworCisJLyogUHJldmVudCB1c2Vyc3BhY2UgZnJvbSBzZWVpbmcgaW5jb25zaXN0ZW50IHN0YXRlIC0gcmVtb3ZlCisJICogdGhlIHN5c2ZzIGhpZXJhcmNoeSBmaXJzdCAqLworCWNhY2hlX2RpciA9IHBlcl9jcHUoY2FjaGVfZGlyLCBjcHVfaWQpOworCisJLyogY2FyZWZ1bCwgc3lzZnMgcG9wdWxhdGlvbiBtYXkgaGF2ZSBmYWlsZWQgKi8KKwlpZiAoY2FjaGVfZGlyKQorCQlyZW1vdmVfY2FjaGVfZGlyKGNhY2hlX2Rpcik7CisKKwlwZXJfY3B1KGNhY2hlX2RpciwgY3B1X2lkKSA9IE5VTEw7CisKKwkvKiBjbGVhciB0aGUgQ1BVJ3MgYml0IGluIGl0cyBjYWNoZSBjaGFpbiwgcG9zc2libHkgZnJlZWluZworCSAqIGNhY2hlIG9iamVjdHMgKi8KKwljYWNoZSA9IGNhY2hlX2xvb2t1cF9ieV9jcHUoY3B1X2lkKTsKKwlpZiAoY2FjaGUpCisJCWNhY2hlX2NwdV9jbGVhcihjYWNoZSwgY3B1X2lkKTsKK30KKyNlbmRpZiAvKiBDT05GSUdfSE9UUExVR19DUFUgKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvY2FjaGVpbmZvLmggYi9hcmNoL3Bvd2VycGMva2VybmVsL2NhY2hlaW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3Yjc0ZDMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2NhY2hlaW5mby5oCkBAIC0wLDAgKzEsOCBAQAorI2lmbmRlZiBfUFBDX0NBQ0hFSU5GT19ICisjZGVmaW5lIF9QUENfQ0FDSEVJTkZPX0gKKworLyogVGhlc2UgYXJlIGp1c3QgaG9va3MgZm9yIHN5c2ZzLmMgdG8gdXNlLiAqLworZXh0ZXJuIHZvaWQgY2FjaGVpbmZvX2NwdV9vbmxpbmUodW5zaWduZWQgaW50IGNwdV9pZCk7CitleHRlcm4gdm9pZCBjYWNoZWluZm9fY3B1X29mZmxpbmUodW5zaWduZWQgaW50IGNwdV9pZCk7CisKKyNlbmRpZiAvKiBfUFBDX0NBQ0hFSU5GT19IICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2twcm9iZXMuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwva3Byb2Jlcy5jCmluZGV4IGRlNzk5MTUuLmM5MzI5NzggMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwva3Byb2Jlcy5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwva3Byb2Jlcy5jCkBAIC05Niw5ICs5NiwxMCBAQAogCiB2b2lkIF9fa3Byb2JlcyBhcmNoX3JlbW92ZV9rcHJvYmUoc3RydWN0IGtwcm9iZSAqcCkKIHsKLQltdXRleF9sb2NrKCZrcHJvYmVfbXV0ZXgpOwotCWZyZWVfaW5zbl9zbG90KHAtPmFpbnNuLmluc24sIDApOwotCW11dGV4X3VubG9jaygma3Byb2JlX211dGV4KTsKKwlpZiAocC0+YWluc24uaW5zbikgeworCQlmcmVlX2luc25fc2xvdChwLT5haW5zbi5pbnNuLCAwKTsKKwkJcC0+YWluc24uaW5zbiA9IE5VTEw7CisJfQogfQogCiBzdGF0aWMgdm9pZCBfX2twcm9iZXMgcHJlcGFyZV9zaW5nbGVzdGVwKHN0cnVjdCBrcHJvYmUgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQpAQCAtMzE2LDcgKzMxNyw3IEBACiAJLyoKIAkgKiBJdCBpcyBwb3NzaWJsZSB0byBoYXZlIG11bHRpcGxlIGluc3RhbmNlcyBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbgogCSAqIHRhc2sgZWl0aGVyIGJlY2F1c2UgYW4gbXVsdGlwbGUgZnVuY3Rpb25zIGluIHRoZSBjYWxsIHBhdGgKLQkgKiBoYXZlIGEgcmV0dXJuIHByb2JlIGluc3RhbGxlZCBvbiB0aGVtLCBhbmQvb3IgbW9yZSB0aGVuIG9uZSByZXR1cm4KKwkgKiBoYXZlIGEgcmV0dXJuIHByb2JlIGluc3RhbGxlZCBvbiB0aGVtLCBhbmQvb3IgbW9yZSB0aGFuIG9uZSByZXR1cm4KIAkgKiByZXR1cm4gcHJvYmUgd2FzIHJlZ2lzdGVyZWQgZm9yIGEgdGFyZ2V0IGZ1bmN0aW9uLgogCSAqCiAJICogV2UgY2FuIGhhbmRsZSB0aGlzIGJlY2F1c2U6CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3BjaS1jb21tb24uYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcGNpLWNvbW1vbi5jCmluZGV4IDI1MzgwMzAuLmRhNWEzODUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcGNpLWNvbW1vbi5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcGNpLWNvbW1vbi5jCkBAIC0xNiw3ICsxNiw3IEBACiAgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogICovCiAKLSN1bmRlZiBERUJVRworI2RlZmluZSBERUJVRwogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CkBAIC0xMzU2LDYgKzEzNTYsNjMgQEAKIAl9CiB9CiAKK3N0YXRpYyB2b2lkIF9faW5pdCBwY2liaW9zX3Jlc2VydmVfbGVnYWN5X3JlZ2lvbnMoc3RydWN0IHBjaV9idXMgKmJ1cykKK3sKKwlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UgPSBwY2lfYnVzX3RvX2hvc3QoYnVzKTsKKwlyZXNvdXJjZV9zaXplX3QJb2Zmc2V0OworCXN0cnVjdCByZXNvdXJjZSAqcmVzLCAqcHJlczsKKwlpbnQgaTsKKworCXByX2RlYnVnKCJSZXNlcnZpbmcgbGVnYWN5IHJhbmdlcyBmb3IgZG9tYWluICUwNHhcbiIsIHBjaV9kb21haW5fbnIoYnVzKSk7CisKKwkvKiBDaGVjayBmb3IgSU8gKi8KKwlpZiAoIShob3NlLT5pb19yZXNvdXJjZS5mbGFncyAmIElPUkVTT1VSQ0VfSU8pKQorCQlnb3RvIG5vX2lvOworCW9mZnNldCA9ICh1bnNpZ25lZCBsb25nKWhvc2UtPmlvX2Jhc2VfdmlydCAtIF9JT19CQVNFOworCXJlcyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCByZXNvdXJjZSksIEdGUF9LRVJORUwpOworCUJVR19PTihyZXMgPT0gTlVMTCk7CisJcmVzLT5uYW1lID0gIkxlZ2FjeSBJTyI7CisJcmVzLT5mbGFncyA9IElPUkVTT1VSQ0VfSU87CisJcmVzLT5zdGFydCA9IG9mZnNldDsKKwlyZXMtPmVuZCA9IChvZmZzZXQgKyAweGZmZikgJiAweGZmZmZmZmZmdWw7CisJcHJfZGVidWcoIkNhbmRpZGF0ZSBsZWdhY3kgSU86ICVwUlxuIiwgcmVzKTsKKwlpZiAocmVxdWVzdF9yZXNvdXJjZSgmaG9zZS0+aW9fcmVzb3VyY2UsIHJlcykpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcKKwkJICAgICAgICJQQ0kgJTA0eDolMDJ4IENhbm5vdCByZXNlcnZlIExlZ2FjeSBJTyAlcFJcbiIsCisJCSAgICAgICBwY2lfZG9tYWluX25yKGJ1cyksIGJ1cy0+bnVtYmVyLCByZXMpOworCQlrZnJlZShyZXMpOworCX0KKworIG5vX2lvOgorCS8qIENoZWNrIGZvciBtZW1vcnkgKi8KKwlvZmZzZXQgPSBob3NlLT5wY2lfbWVtX29mZnNldDsKKwlwcl9kZWJ1ZygiaG9zZSBtZW0gb2Zmc2V0OiAlMDE2bGx4XG4iLCAodW5zaWduZWQgbG9uZyBsb25nKW9mZnNldCk7CisJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworCQlwcmVzID0gJmhvc2UtPm1lbV9yZXNvdXJjZXNbaV07CisJCWlmICghKHByZXMtPmZsYWdzICYgSU9SRVNPVVJDRV9NRU0pKQorCQkJY29udGludWU7CisJCXByX2RlYnVnKCJob3NlIG1lbSByZXM6ICVwUlxuIiwgcHJlcyk7CisJCWlmICgocHJlcy0+c3RhcnQgLSBvZmZzZXQpIDw9IDB4YTAwMDAgJiYKKwkJICAgIChwcmVzLT5lbmQgLSBvZmZzZXQpID49IDB4YmZmZmYpCisJCQlicmVhazsKKwl9CisJaWYgKGkgPj0gMykKKwkJcmV0dXJuOworCXJlcyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCByZXNvdXJjZSksIEdGUF9LRVJORUwpOworCUJVR19PTihyZXMgPT0gTlVMTCk7CisJcmVzLT5uYW1lID0gIkxlZ2FjeSBWR0EgbWVtb3J5IjsKKwlyZXMtPmZsYWdzID0gSU9SRVNPVVJDRV9NRU07CisJcmVzLT5zdGFydCA9IDB4YTAwMDAgKyBvZmZzZXQ7CisJcmVzLT5lbmQgPSAweGJmZmZmICsgb2Zmc2V0OworCXByX2RlYnVnKCJDYW5kaWRhdGUgVkdBIG1lbW9yeTogJXBSXG4iLCByZXMpOworCWlmIChyZXF1ZXN0X3Jlc291cmNlKHByZXMsIHJlcykpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcKKwkJICAgICAgICJQQ0kgJTA0eDolMDJ4IENhbm5vdCByZXNlcnZlIFZHQSBtZW1vcnkgJXBSXG4iLAorCQkgICAgICAgcGNpX2RvbWFpbl9ucihidXMpLCBidXMtPm51bWJlciwgcmVzKTsKKwkJa2ZyZWUocmVzKTsKKwl9Cit9CisKIHZvaWQgX19pbml0IHBjaWJpb3NfcmVzb3VyY2Vfc3VydmV5KHZvaWQpCiB7CiAJc3RydWN0IHBjaV9idXMgKmI7CkBAIC0xMzcxLDYgKzE0MjgsMTggQEAKIAkJcGNpYmlvc19hbGxvY2F0ZV9yZXNvdXJjZXMoMSk7CiAJfQogCisJLyogQmVmb3JlIHdlIHN0YXJ0IGFzc2lnbmluZyB1bmFzc2lnbmVkIHJlc291cmNlLCB3ZSB0cnkgdG8gcmVzZXJ2ZQorCSAqIHRoZSBsb3cgSU8gYXJlYSBhbmQgdGhlIFZHQSBtZW1vcnkgYXJlYSBpZiB0aGV5IGludGVyc2VjdCB0aGUKKwkgKiBidXMgYXZhaWxhYmxlIHJlc291cmNlcyB0byBhdm9pZCBhbGxvY2F0aW5nIHRoaW5ncyBvbiB0b3Agb2YgdGhlbQorCSAqLworCWlmICghKHBwY19wY2lfZmxhZ3MgJiBQUENfUENJX1BST0JFX09OTFkpKSB7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkoYiwgJnBjaV9yb290X2J1c2VzLCBub2RlKQorCQkJcGNpYmlvc19yZXNlcnZlX2xlZ2FjeV9yZWdpb25zKGIpOworCX0KKworCS8qIE5vdywgaWYgdGhlIHBsYXRmb3JtIGRpZG4ndCBkZWNpZGUgdG8gYmxpbmRseSB0cnVzdCB0aGUgZmlybXdhcmUsCisJICogd2UgcHJvY2VlZCB0byBhc3NpZ25pbmcgdGhpbmdzIHRoYXQgd2VyZSBsZWZ0IHVuYXNzaWduZWQKKwkgKi8KIAlpZiAoIShwcGNfcGNpX2ZsYWdzICYgUFBDX1BDSV9QUk9CRV9PTkxZKSkgewogCQlwcl9kZWJ1ZygiUENJOiBBc3NpZ25pbmcgdW5hc3NpZ25lZCByZXNvdWNlcy4uLlxuIik7CiAJCXBjaV9hc3NpZ25fdW5hc3NpZ25lZF9yZXNvdXJjZXMoKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcGNpXzY0LmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3BjaV82NC5jCmluZGV4IDM5ZmFkYzYuLjU4Njk2MmYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcGNpXzY0LmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wY2lfNjQuYwpAQCAtNTYwLDkgKzU2MCwxNCBAQAogCSAqIEc1IG1hY2hpbmVzLi4uIFNvIHdoZW4gc29tZXRoaW5nIGFza3MgZm9yIGJ1cyAwIGlvIGJhc2UKIAkgKiAoYnVzIDAgaXMgSFQgcm9vdCksIHdlIHJldHVybiB0aGUgQUdQIG9uZSBpbnN0ZWFkLgogCSAqLwotCWlmIChtYWNoaW5lX2lzX2NvbXBhdGlibGUoIk1hY1JJU0M0IikpCi0JCWlmIChpbl9idXMgPT0gMCkKKwlpZiAoaW5fYnVzID09IDAgJiYgbWFjaGluZV9pc19jb21wYXRpYmxlKCJNYWNSSVNDNCIpKSB7CisJCXN0cnVjdCBkZXZpY2Vfbm9kZSAqYWdwOworCisJCWFncCA9IG9mX2ZpbmRfY29tcGF0aWJsZV9ub2RlKE5VTEwsIE5VTEwsICJ1My1hZ3AiKTsKKwkJaWYgKGFncCkKIAkJCWluX2J1cyA9IDB4ZjA7CisJCW9mX25vZGVfcHV0KGFncCk7CisJfQogCiAJLyogVGhhdCBzeXNjYWxsIGlzbid0IHF1aXRlIGNvbXBhdGlibGUgd2l0aCBQQ0kgZG9tYWlucywgYnV0IGl0J3MKIAkgKiB1c2VkIG9uIHByZS1kb21haW5zIHNldHVwLiBXZSByZXR1cm4gdGhlIGZpcnN0IG1hdGNoCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3BwY19rc3ltcy5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcGNfa3N5bXMuYwppbmRleCBkY2VjMTMyLi5jOGIyN2JiIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3BwY19rc3ltcy5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHBjX2tzeW1zLmMKQEAgLTE2NSw2ICsxNjUsNyBAQAogRVhQT1JUX1NZTUJPTChpcnFfZGVzYyk7CiBFWFBPUlRfU1lNQk9MKHRiX3RpY2tzX3Blcl9qaWZmeSk7CiBFWFBPUlRfU1lNQk9MKGNhY2hlYWJsZV9tZW1jcHkpOworRVhQT1JUX1NZTUJPTChjYWNoZWFibGVfbWVtemVybyk7CiAjZW5kaWYKIAogI2lmZGVmIENPTkZJR19QUEMzMgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcm9tLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3Byb20uYwppbmRleCA2ZjczYzczLi5jMDljZmZhIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3Byb20uYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3Byb20uYwpAQCAtODI0LDExICs4MjQsMTEgQEAKICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX0tFWEVDCi0JbHByb3AgPSAodTY0KilvZl9nZXRfZmxhdF9kdF9wcm9wKG5vZGUsICJsaW51eCxjcmFzaGtlcm5lbC1iYXNlIiwgTlVMTCk7CisJbHByb3AgPSBvZl9nZXRfZmxhdF9kdF9wcm9wKG5vZGUsICJsaW51eCxjcmFzaGtlcm5lbC1iYXNlIiwgTlVMTCk7CiAJaWYgKGxwcm9wKQogCQljcmFzaGtfcmVzLnN0YXJ0ID0gKmxwcm9wOwogCi0JbHByb3AgPSAodTY0KilvZl9nZXRfZmxhdF9kdF9wcm9wKG5vZGUsICJsaW51eCxjcmFzaGtlcm5lbC1zaXplIiwgTlVMTCk7CisJbHByb3AgPSBvZl9nZXRfZmxhdF9kdF9wcm9wKG5vZGUsICJsaW51eCxjcmFzaGtlcm5lbC1zaXplIiwgTlVMTCk7CiAJaWYgKGxwcm9wKQogCQljcmFzaGtfcmVzLmVuZCA9IGNyYXNoa19yZXMuc3RhcnQgKyAqbHByb3AgLSAxOwogI2VuZGlmCkBAIC04OTMsMTIgKzg5MywxMiBAQAogCXU2NCBiYXNlLCBzaXplLCBsbWJfc2l6ZTsKIAl1bnNpZ25lZCBpbnQgaXNfa2V4ZWNfa2R1bXAgPSAwLCBybmdzOwogCi0JbHMgPSAoY2VsbF90ICopb2ZfZ2V0X2ZsYXRfZHRfcHJvcChub2RlLCAiaWJtLGxtYi1zaXplIiwgJmwpOworCWxzID0gb2ZfZ2V0X2ZsYXRfZHRfcHJvcChub2RlLCAiaWJtLGxtYi1zaXplIiwgJmwpOwogCWlmIChscyA9PSBOVUxMIHx8IGwgPCBkdF9yb290X3NpemVfY2VsbHMgKiBzaXplb2YoY2VsbF90KSkKIAkJcmV0dXJuIDA7CiAJbG1iX3NpemUgPSBkdF9tZW1fbmV4dF9jZWxsKGR0X3Jvb3Rfc2l6ZV9jZWxscywgJmxzKTsKIAotCWRtID0gKGNlbGxfdCAqKW9mX2dldF9mbGF0X2R0X3Byb3Aobm9kZSwgImlibSxkeW5hbWljLW1lbW9yeSIsICZsKTsKKwlkbSA9IG9mX2dldF9mbGF0X2R0X3Byb3Aobm9kZSwgImlibSxkeW5hbWljLW1lbW9yeSIsICZsKTsKIAlpZiAoZG0gPT0gTlVMTCB8fCBsIDwgc2l6ZW9mKGNlbGxfdCkpCiAJCXJldHVybiAwOwogCkBAIC05MDcsNyArOTA3LDcgQEAKIAkJcmV0dXJuIDA7CiAKIAkvKiBjaGVjayBpZiB0aGlzIGlzIGEga2V4ZWMva2R1bXAga2VybmVsLiAqLwotCXVzbSA9IChjZWxsX3QgKilvZl9nZXRfZmxhdF9kdF9wcm9wKG5vZGUsICJsaW51eCxkcmNvbmYtdXNhYmxlLW1lbW9yeSIsCisJdXNtID0gb2ZfZ2V0X2ZsYXRfZHRfcHJvcChub2RlLCAibGludXgsZHJjb25mLXVzYWJsZS1tZW1vcnkiLAogCQkJCQkJICZsKTsKIAlpZiAodXNtICE9IE5VTEwpCiAJCWlzX2tleGVjX2tkdW1wID0gMTsKQEAgLTk4MSw5ICs5ODEsOSBAQAogCX0gZWxzZSBpZiAoc3RyY21wKHR5cGUsICJtZW1vcnkiKSAhPSAwKQogCQlyZXR1cm4gMDsKIAotCXJlZyA9IChjZWxsX3QgKilvZl9nZXRfZmxhdF9kdF9wcm9wKG5vZGUsICJsaW51eCx1c2FibGUtbWVtb3J5IiwgJmwpOworCXJlZyA9IG9mX2dldF9mbGF0X2R0X3Byb3Aobm9kZSwgImxpbnV4LHVzYWJsZS1tZW1vcnkiLCAmbCk7CiAJaWYgKHJlZyA9PSBOVUxMKQotCQlyZWcgPSAoY2VsbF90ICopb2ZfZ2V0X2ZsYXRfZHRfcHJvcChub2RlLCAicmVnIiwgJmwpOworCQlyZWcgPSBvZl9nZXRfZmxhdF9kdF9wcm9wKG5vZGUsICJyZWciLCAmbCk7CiAJaWYgKHJlZyA9PSBOVUxMKQogCQlyZXR1cm4gMDsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcm9tX2luaXQuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvbV9pbml0LmMKaW5kZXggMjQ0NTk0NS4uN2YxYjMzZCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcm9tX2luaXQuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3Byb21faW5pdC5jCkBAIC0xMjEwLDcgKzEyMTAsNyBAQAogCQkvKiBJbml0aWFsaXplIHRoZSB0YWJsZSB0byBoYXZlIGEgb25lLXRvLW9uZSBtYXBwaW5nCiAJCSAqIG92ZXIgdGhlIGFsbG9jYXRlZCBzaXplLgogCQkgKi8KLQkJdGNlX2VudHJ5cCA9ICh1bnNpZ25lZCBsb25nICopYmFzZTsKKwkJdGNlX2VudHJ5cCA9ICh1NjQgKiliYXNlOwogCQlmb3IgKGkgPSAwOyBpIDwgKG1pbnNpemUgPj4gMykgO3RjZV9lbnRyeXArKywgaSsrKSB7CiAJCQl0Y2VfZW50cnkgPSAoaSA8PCBQQUdFX1NISUZUKTsKIAkJCXRjZV9lbnRyeSB8PSAweDM7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3Byb21fcGFyc2UuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvbV9wYXJzZS5jCmluZGV4IDhjMTMzNTUuLjhmMDg1NmYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvbV9wYXJzZS5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvbV9wYXJzZS5jCkBAIC0yMzIsMTEgKzIzMiw2IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChvZl9wY2lfYWRkcmVzc190b19yZXNvdXJjZSk7CiAKLXN0YXRpYyB1OCBvZl9pcnFfcGNpX3N3aXp6bGUodTggc2xvdCwgdTggcGluKQotewotCXJldHVybiAoKChwaW4gLSAxKSArIHNsb3QpICUgNCkgKyAxOwotfQotCiBpbnQgb2ZfaXJxX21hcF9wY2koc3RydWN0IHBjaV9kZXYgKnBkZXYsIHN0cnVjdCBvZl9pcnEgKm91dF9pcnEpCiB7CiAJc3RydWN0IGRldmljZV9ub2RlICpkbiwgKnBwbm9kZTsKQEAgLTMwNiw3ICszMDEsNyBAQAogCQkvKiBXZSBjYW4gb25seSBnZXQgaGVyZSBpZiB3ZSBoaXQgYSBQMlAgYnJpZGdlIHdpdGggbm8gbm9kZSwKIAkJICogbGV0J3MgZG8gc3RhbmRhcmQgc3dpenpsaW5nIGFuZCB0cnkgYWdhaW4KIAkJICovCi0JCWxzcGVjID0gb2ZfaXJxX3BjaV9zd2l6emxlKFBDSV9TTE9UKHBkZXYtPmRldmZuKSwgbHNwZWMpOworCQlsc3BlYyA9IHBjaV9zd2l6emxlX2ludGVycnVwdF9waW4ocGRldiwgbHNwZWMpOwogCQlwZGV2ID0gcHBkZXY7CiAJfQogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3N5c2ZzLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3N5c2ZzLmMKaW5kZXggMGM2NGYxMC4uNGEyZWUwOCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9zeXNmcy5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvc3lzZnMuYwpAQCAtMTgsNiArMTgsOCBAQAogI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+CiAjaW5jbHVkZSA8YXNtL3NtcC5oPgogCisjaW5jbHVkZSAiY2FjaGVpbmZvLmgiCisKICNpZmRlZiBDT05GSUdfUFBDNjQKICNpbmNsdWRlIDxhc20vcGFjYS5oPgogI2luY2x1ZGUgPGFzbS9scHBhY2EuaD4KQEAgLTI1LDggKzI3LDYgQEAKIAogc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBjcHUsIGNwdV9kZXZpY2VzKTsKIAotc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBrb2JqZWN0ICosIGNhY2hlX3RvcGxldmVsKTsKLQogLyoKICAqIFNNVCBzbm9vemUgZGVsYXkgc3R1ZmYsIDY0LWJpdCBvbmx5IGZvciBub3cKICAqLwpAQCAtMzQzLDI4MyArMzQzLDYgQEAKICNlbmRpZiAvKiBIQVNfUFBDX1BNQ19QQTZUICovCiAjZW5kaWYgLyogSEFTX1BQQ19QTUNfQ0xBU1NJQyAqLwogCi1zdHJ1Y3QgY2FjaGVfZGVzYyB7Ci0Jc3RydWN0IGtvYmplY3Qga29iajsKLQlzdHJ1Y3QgY2FjaGVfZGVzYyAqbmV4dDsKLQljb25zdCBjaGFyICp0eXBlOwkvKiBJbnN0cnVjdGlvbiwgRGF0YSwgb3IgVW5pZmllZCAqLwotCXUzMiBzaXplOwkJLyogdG90YWwgY2FjaGUgc2l6ZSBpbiBLQiAqLwotCXUzMiBsaW5lX3NpemU7CQkvKiBpbiBieXRlcyAqLwotCXUzMiBucl9zZXRzOwkJLyogbnVtYmVyIG9mIHNldHMgKi8KLQl1MzIgbGV2ZWw7CQkvKiBlLmcuIDEsIDIsIDMuLi4gKi8KLQl1MzIgYXNzb2NpYXRpdml0eTsJLyogZS5nLiA4LXdheS4uLiAwIGlzIGZ1bGx5IGFzc29jaWF0aXZlICovCi19OwotCi1ERUZJTkVfUEVSX0NQVShzdHJ1Y3QgY2FjaGVfZGVzYyAqLCBjYWNoZV9kZXNjKTsKLQotc3RhdGljIHN0cnVjdCBjYWNoZV9kZXNjICprb2JqX3RvX2NhY2hlX2Rlc2Moc3RydWN0IGtvYmplY3QgKmspCi17Ci0JcmV0dXJuIGNvbnRhaW5lcl9vZihrLCBzdHJ1Y3QgY2FjaGVfZGVzYywga29iaik7Ci19Ci0KLXN0YXRpYyB2b2lkIGNhY2hlX2Rlc2NfcmVsZWFzZShzdHJ1Y3Qga29iamVjdCAqaykKLXsKLQlzdHJ1Y3QgY2FjaGVfZGVzYyAqZGVzYyA9IGtvYmpfdG9fY2FjaGVfZGVzYyhrKTsKLQotCXByX2RlYnVnKCIlczogcmVsZWFzaW5nICVzXG4iLCBfX2Z1bmNfXywga29iamVjdF9uYW1lKGspKTsKLQotCWlmIChkZXNjLT5uZXh0KQotCQlrb2JqZWN0X3B1dCgmZGVzYy0+bmV4dC0+a29iaik7Ci0KLQlrZnJlZShrb2JqX3RvX2NhY2hlX2Rlc2MoaykpOwotfQotCi1zdGF0aWMgc3NpemVfdCBjYWNoZV9kZXNjX3Nob3coc3RydWN0IGtvYmplY3QgKmssIHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgKmtvYmpfYXR0cjsKLQotCWtvYmpfYXR0ciA9IGNvbnRhaW5lcl9vZihhdHRyLCBzdHJ1Y3Qga29ial9hdHRyaWJ1dGUsIGF0dHIpOwotCi0JcmV0dXJuIGtvYmpfYXR0ci0+c2hvdyhrLCBrb2JqX2F0dHIsIGJ1Zik7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgc3lzZnNfb3BzIGNhY2hlX2Rlc2Nfc3lzZnNfb3BzID0gewotCS5zaG93ID0gY2FjaGVfZGVzY19zaG93LAotfTsKLQotc3RhdGljIHN0cnVjdCBrb2JqX3R5cGUgY2FjaGVfZGVzY190eXBlID0gewotCS5yZWxlYXNlID0gY2FjaGVfZGVzY19yZWxlYXNlLAotCS5zeXNmc19vcHMgPSAmY2FjaGVfZGVzY19zeXNmc19vcHMsCi19OwotCi1zdGF0aWMgc3NpemVfdCBjYWNoZV9zaXplX3Nob3coc3RydWN0IGtvYmplY3QgKmssIHN0cnVjdCBrb2JqX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQotewotCXN0cnVjdCBjYWNoZV9kZXNjICpjYWNoZSA9IGtvYmpfdG9fY2FjaGVfZGVzYyhrKTsKLQotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1S1xuIiwgY2FjaGUtPnNpemUpOwotfQotCi1zdGF0aWMgc3RydWN0IGtvYmpfYXR0cmlidXRlIGNhY2hlX3NpemVfYXR0ciA9Ci0JX19BVFRSKHNpemUsIDA0NDQsIGNhY2hlX3NpemVfc2hvdywgTlVMTCk7Ci0KLXN0YXRpYyBzc2l6ZV90IGNhY2hlX2xpbmVfc2l6ZV9zaG93KHN0cnVjdCBrb2JqZWN0ICprLCBzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgY2FjaGVfZGVzYyAqY2FjaGUgPSBrb2JqX3RvX2NhY2hlX2Rlc2Moayk7Ci0KLQlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgY2FjaGUtPmxpbmVfc2l6ZSk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgY2FjaGVfbGluZV9zaXplX2F0dHIgPQotCV9fQVRUUihjb2hlcmVuY3lfbGluZV9zaXplLCAwNDQ0LCBjYWNoZV9saW5lX3NpemVfc2hvdywgTlVMTCk7Ci0KLXN0YXRpYyBzc2l6ZV90IGNhY2hlX25yX3NldHNfc2hvdyhzdHJ1Y3Qga29iamVjdCAqaywgc3RydWN0IGtvYmpfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCi17Ci0Jc3RydWN0IGNhY2hlX2Rlc2MgKmNhY2hlID0ga29ial90b19jYWNoZV9kZXNjKGspOwotCi0JcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIGNhY2hlLT5ucl9zZXRzKTsKLX0KLQotc3RhdGljIHN0cnVjdCBrb2JqX2F0dHJpYnV0ZSBjYWNoZV9ucl9zZXRzX2F0dHIgPQotCV9fQVRUUihudW1iZXJfb2Zfc2V0cywgMDQ0NCwgY2FjaGVfbnJfc2V0c19zaG93LCBOVUxMKTsKLQotc3RhdGljIHNzaXplX3QgY2FjaGVfdHlwZV9zaG93KHN0cnVjdCBrb2JqZWN0ICprLCBzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgY2FjaGVfZGVzYyAqY2FjaGUgPSBrb2JqX3RvX2NhY2hlX2Rlc2Moayk7Ci0KLQlyZXR1cm4gc3ByaW50ZihidWYsICIlc1xuIiwgY2FjaGUtPnR5cGUpOwotfQotCi1zdGF0aWMgc3RydWN0IGtvYmpfYXR0cmlidXRlIGNhY2hlX3R5cGVfYXR0ciA9Ci0JX19BVFRSKHR5cGUsIDA0NDQsIGNhY2hlX3R5cGVfc2hvdywgTlVMTCk7Ci0KLXN0YXRpYyBzc2l6ZV90IGNhY2hlX2xldmVsX3Nob3coc3RydWN0IGtvYmplY3QgKmssIHN0cnVjdCBrb2JqX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQotewotCXN0cnVjdCBjYWNoZV9kZXNjICpjYWNoZSA9IGtvYmpfdG9fY2FjaGVfZGVzYyhrKTsKLQotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCBjYWNoZS0+bGV2ZWwpOwotfQotCi1zdGF0aWMgc3RydWN0IGtvYmpfYXR0cmlidXRlIGNhY2hlX2xldmVsX2F0dHIgPQotCV9fQVRUUihsZXZlbCwgMDQ0NCwgY2FjaGVfbGV2ZWxfc2hvdywgTlVMTCk7Ci0KLXN0YXRpYyBzc2l6ZV90IGNhY2hlX2Fzc29jX3Nob3coc3RydWN0IGtvYmplY3QgKmssIHN0cnVjdCBrb2JqX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQotewotCXN0cnVjdCBjYWNoZV9kZXNjICpjYWNoZSA9IGtvYmpfdG9fY2FjaGVfZGVzYyhrKTsKLQotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCBjYWNoZS0+YXNzb2NpYXRpdml0eSk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgY2FjaGVfYXNzb2NfYXR0ciA9Ci0JX19BVFRSKHdheXNfb2ZfYXNzb2NpYXRpdml0eSwgMDQ0NCwgY2FjaGVfYXNzb2Nfc2hvdywgTlVMTCk7Ci0KLXN0cnVjdCBjYWNoZV9kZXNjX2luZm8gewotCWNvbnN0IGNoYXIgKnR5cGU7Ci0JY29uc3QgY2hhciAqc2l6ZV9wcm9wOwotCWNvbnN0IGNoYXIgKmxpbmVfc2l6ZV9wcm9wOwotCWNvbnN0IGNoYXIgKm5yX3NldHNfcHJvcDsKLX07Ci0KLS8qIFBvd2VyUEMgUHJvY2Vzc29yIGJpbmRpbmcgc2F5cyB0aGUgW2RpXS1jYWNoZS0qIG11c3QgYmUgZXF1YWwgb24KLSAqIHVuaWZpZWQgY2FjaGVzLCBzbyBqdXN0IHVzZSBkLWNhY2hlIHByb3BlcnRpZXMuICovCi1zdGF0aWMgc3RydWN0IGNhY2hlX2Rlc2NfaW5mbyB1Y2FjaGVfaW5mbyA9IHsKLQkudHlwZSA9ICJVbmlmaWVkIiwKLQkuc2l6ZV9wcm9wID0gImQtY2FjaGUtc2l6ZSIsCi0JLmxpbmVfc2l6ZV9wcm9wID0gImQtY2FjaGUtbGluZS1zaXplIiwKLQkubnJfc2V0c19wcm9wID0gImQtY2FjaGUtc2V0cyIsCi19OwotCi1zdGF0aWMgc3RydWN0IGNhY2hlX2Rlc2NfaW5mbyBkY2FjaGVfaW5mbyA9IHsKLQkudHlwZSA9ICJEYXRhIiwKLQkuc2l6ZV9wcm9wID0gImQtY2FjaGUtc2l6ZSIsCi0JLmxpbmVfc2l6ZV9wcm9wID0gImQtY2FjaGUtbGluZS1zaXplIiwKLQkubnJfc2V0c19wcm9wID0gImQtY2FjaGUtc2V0cyIsCi19OwotCi1zdGF0aWMgc3RydWN0IGNhY2hlX2Rlc2NfaW5mbyBpY2FjaGVfaW5mbyA9IHsKLQkudHlwZSA9ICJJbnN0cnVjdGlvbiIsCi0JLnNpemVfcHJvcCA9ICJpLWNhY2hlLXNpemUiLAotCS5saW5lX3NpemVfcHJvcCA9ICJpLWNhY2hlLWxpbmUtc2l6ZSIsCi0JLm5yX3NldHNfcHJvcCA9ICJpLWNhY2hlLXNldHMiLAotfTsKLQotc3RhdGljIHN0cnVjdCBjYWNoZV9kZXNjICogX19jcHVpbml0IGNyZWF0ZV9jYWNoZV9kZXNjKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsIHN0cnVjdCBrb2JqZWN0ICpwYXJlbnQsIGludCBpbmRleCwgaW50IGxldmVsLCBzdHJ1Y3QgY2FjaGVfZGVzY19pbmZvICppbmZvKQotewotCWNvbnN0IHUzMiAqY2FjaGVfbGluZV9zaXplOwotCXN0cnVjdCBjYWNoZV9kZXNjICpuZXc7Ci0JY29uc3QgdTMyICpjYWNoZV9zaXplOwotCWNvbnN0IHUzMiAqbnJfc2V0czsKLQlpbnQgcmM7Ci0KLQluZXcgPSBremFsbG9jKHNpemVvZigqbmV3KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFuZXcpCi0JCXJldHVybiBOVUxMOwotCi0JcmMgPSBrb2JqZWN0X2luaXRfYW5kX2FkZCgmbmV3LT5rb2JqLCAmY2FjaGVfZGVzY190eXBlLCBwYXJlbnQsCi0JCQkJICAiaW5kZXglZCIsIGluZGV4KTsKLQlpZiAocmMpCi0JCWdvdG8gZXJyOwotCi0JLyogdHlwZSAqLwotCW5ldy0+dHlwZSA9IGluZm8tPnR5cGU7Ci0JcmMgPSBzeXNmc19jcmVhdGVfZmlsZSgmbmV3LT5rb2JqLCAmY2FjaGVfdHlwZV9hdHRyLmF0dHIpOwotCVdBUk5fT04ocmMpOwotCi0JLyogbGV2ZWwgKi8KLQluZXctPmxldmVsID0gbGV2ZWw7Ci0JcmMgPSBzeXNmc19jcmVhdGVfZmlsZSgmbmV3LT5rb2JqLCAmY2FjaGVfbGV2ZWxfYXR0ci5hdHRyKTsKLQlXQVJOX09OKHJjKTsKLQotCS8qIHNpemUgKi8KLQljYWNoZV9zaXplID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCBpbmZvLT5zaXplX3Byb3AsIE5VTEwpOwotCWlmIChjYWNoZV9zaXplKSB7Ci0JCW5ldy0+c2l6ZSA9ICpjYWNoZV9zaXplIC8gMTAyNDsKLQkJcmMgPSBzeXNmc19jcmVhdGVfZmlsZSgmbmV3LT5rb2JqLAotCQkJCSAgICAgICAmY2FjaGVfc2l6ZV9hdHRyLmF0dHIpOwotCQlXQVJOX09OKHJjKTsKLQl9Ci0KLQkvKiBjb2hlcmVuY3lfbGluZV9zaXplICovCi0JY2FjaGVfbGluZV9zaXplID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCBpbmZvLT5saW5lX3NpemVfcHJvcCwgTlVMTCk7Ci0JaWYgKGNhY2hlX2xpbmVfc2l6ZSkgewotCQluZXctPmxpbmVfc2l6ZSA9ICpjYWNoZV9saW5lX3NpemU7Ci0JCXJjID0gc3lzZnNfY3JlYXRlX2ZpbGUoJm5ldy0+a29iaiwKLQkJCQkgICAgICAgJmNhY2hlX2xpbmVfc2l6ZV9hdHRyLmF0dHIpOwotCQlXQVJOX09OKHJjKTsKLQl9Ci0KLQkvKiBudW1iZXJfb2Zfc2V0cyAqLwotCW5yX3NldHMgPSBvZl9nZXRfcHJvcGVydHkobnAsIGluZm8tPm5yX3NldHNfcHJvcCwgTlVMTCk7Ci0JaWYgKG5yX3NldHMpIHsKLQkJbmV3LT5ucl9zZXRzID0gKm5yX3NldHM7Ci0JCXJjID0gc3lzZnNfY3JlYXRlX2ZpbGUoJm5ldy0+a29iaiwKLQkJCQkgICAgICAgJmNhY2hlX25yX3NldHNfYXR0ci5hdHRyKTsKLQkJV0FSTl9PTihyYyk7Ci0JfQotCi0JLyogd2F5c19vZl9hc3NvY2lhdGl2aXR5ICovCi0JaWYgKG5ldy0+bnJfc2V0cyA9PSAxKSB7Ci0JCS8qIGZ1bGx5IGFzc29jaWF0aXZlICovCi0JCW5ldy0+YXNzb2NpYXRpdml0eSA9IDA7Ci0JCWdvdG8gY3JlYXRlX2Fzc29jOwotCX0KLQotCWlmIChuZXctPm5yX3NldHMgJiYgbmV3LT5zaXplICYmIG5ldy0+bGluZV9zaXplKSB7Ci0JCS8qIElmIHdlIGhhdmUgdmFsdWVzIGZvciBhbGwgb2YgdGhlc2Ugd2UgY2FuIGRlcml2ZQotCQkgKiB0aGUgYXNzb2NpYXRpdml0eS4gKi8KLQkJbmV3LT5hc3NvY2lhdGl2aXR5ID0KLQkJCSgobmV3LT5zaXplICogMTAyNCkgLyBuZXctPm5yX3NldHMpIC8gbmV3LT5saW5lX3NpemU7Ci1jcmVhdGVfYXNzb2M6Ci0JCXJjID0gc3lzZnNfY3JlYXRlX2ZpbGUoJm5ldy0+a29iaiwKLQkJCQkgICAgICAgJmNhY2hlX2Fzc29jX2F0dHIuYXR0cik7Ci0JCVdBUk5fT04ocmMpOwotCX0KLQotCXJldHVybiBuZXc7Ci1lcnI6Ci0Ja2ZyZWUobmV3KTsKLQlyZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGJvb2wgY2FjaGVfaXNfdW5pZmllZChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKQotewotCXJldHVybiBvZl9nZXRfcHJvcGVydHkobnAsICJjYWNoZS11bmlmaWVkIiwgTlVMTCk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgY2FjaGVfZGVzYyAqIF9fY3B1aW5pdCBjcmVhdGVfY2FjaGVfaW5kZXhfaW5mbyhzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLCBzdHJ1Y3Qga29iamVjdCAqcGFyZW50LCBpbnQgaW5kZXgsIGludCBsZXZlbCkKLXsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5leHRfY2FjaGU7Ci0Jc3RydWN0IGNhY2hlX2Rlc2MgKm5ldywgKiplbmQ7Ci0KLQlwcl9kZWJ1ZygiJXMobm9kZSA9ICVzLCBpbmRleCA9ICVkKVxuIiwgX19mdW5jX18sIG5wLT5mdWxsX25hbWUsIGluZGV4KTsKLQotCWlmIChjYWNoZV9pc191bmlmaWVkKG5wKSkgewotCQluZXcgPSBjcmVhdGVfY2FjaGVfZGVzYyhucCwgcGFyZW50LCBpbmRleCwgbGV2ZWwsCi0JCQkJCSZ1Y2FjaGVfaW5mbyk7Ci0JfSBlbHNlIHsKLQkJbmV3ID0gY3JlYXRlX2NhY2hlX2Rlc2MobnAsIHBhcmVudCwgaW5kZXgsIGxldmVsLAotCQkJCQkmZGNhY2hlX2luZm8pOwotCQlpZiAobmV3KSB7Ci0JCQlpbmRleCsrOwotCQkJbmV3LT5uZXh0ID0gY3JlYXRlX2NhY2hlX2Rlc2MobnAsIHBhcmVudCwgaW5kZXgsIGxldmVsLAotCQkJCQkJICAgICAgJmljYWNoZV9pbmZvKTsKLQkJfQotCX0KLQlpZiAoIW5ldykKLQkJcmV0dXJuIE5VTEw7Ci0KLQllbmQgPSAmbmV3LT5uZXh0OwotCXdoaWxlICgqZW5kKQotCQllbmQgPSAmKCplbmQpLT5uZXh0OwotCi0JbmV4dF9jYWNoZSA9IG9mX2ZpbmRfbmV4dF9jYWNoZV9ub2RlKG5wKTsKLQlpZiAoIW5leHRfY2FjaGUpCi0JCWdvdG8gb3V0OwotCi0JKmVuZCA9IGNyZWF0ZV9jYWNoZV9pbmRleF9pbmZvKG5leHRfY2FjaGUsIHBhcmVudCwgKytpbmRleCwgKytsZXZlbCk7Ci0KLQlvZl9ub2RlX3B1dChuZXh0X2NhY2hlKTsKLW91dDoKLQlyZXR1cm4gbmV3OwotfQotCi1zdGF0aWMgdm9pZCBfX2NwdWluaXQgY3JlYXRlX2NhY2hlX2luZm8oc3RydWN0IHN5c19kZXZpY2UgKnN5c2RldikKLXsKLQlzdHJ1Y3Qga29iamVjdCAqY2FjaGVfdG9wbGV2ZWw7Ci0Jc3RydWN0IGRldmljZV9ub2RlICpucCA9IE5VTEw7Ci0JaW50IGNwdSA9IHN5c2Rldi0+aWQ7Ci0KLQljYWNoZV90b3BsZXZlbCA9IGtvYmplY3RfY3JlYXRlX2FuZF9hZGQoImNhY2hlIiwgJnN5c2Rldi0+a29iaik7Ci0JaWYgKCFjYWNoZV90b3BsZXZlbCkKLQkJcmV0dXJuOwotCXBlcl9jcHUoY2FjaGVfdG9wbGV2ZWwsIGNwdSkgPSBjYWNoZV90b3BsZXZlbDsKLQlucCA9IG9mX2dldF9jcHVfbm9kZShjcHUsIE5VTEwpOwotCWlmIChucCAhPSBOVUxMKSB7Ci0JCXBlcl9jcHUoY2FjaGVfZGVzYywgY3B1KSA9Ci0JCQljcmVhdGVfY2FjaGVfaW5kZXhfaW5mbyhucCwgY2FjaGVfdG9wbGV2ZWwsIDAsIDEpOwotCQlvZl9ub2RlX3B1dChucCk7Ci0JfQotCXJldHVybjsKLX0KLQogc3RhdGljIHZvaWQgX19jcHVpbml0IHJlZ2lzdGVyX2NwdV9vbmxpbmUodW5zaWduZWQgaW50IGNwdSkKIHsKIAlzdHJ1Y3QgY3B1ICpjID0gJnBlcl9jcHUoY3B1X2RldmljZXMsIGNwdSk7CkBAIC02ODQsMjUgKzQwNywxMCBAQAogCQlzeXNkZXZfY3JlYXRlX2ZpbGUocywgJmF0dHJfZHNjcik7CiAjZW5kaWYgLyogQ09ORklHX1BQQzY0ICovCiAKLQljcmVhdGVfY2FjaGVfaW5mbyhzKTsKKwljYWNoZWluZm9fY3B1X29ubGluZShjcHUpOwogfQogCiAjaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCi1zdGF0aWMgdm9pZCByZW1vdmVfY2FjaGVfaW5mbyhzdHJ1Y3Qgc3lzX2RldmljZSAqc3lzZGV2KQotewotCXN0cnVjdCBrb2JqZWN0ICpjYWNoZV90b3BsZXZlbDsKLQlzdHJ1Y3QgY2FjaGVfZGVzYyAqY2FjaGVfZGVzYzsKLQlpbnQgY3B1ID0gc3lzZGV2LT5pZDsKLQotCWNhY2hlX2Rlc2MgPSBwZXJfY3B1KGNhY2hlX2Rlc2MsIGNwdSk7Ci0JaWYgKGNhY2hlX2Rlc2MgIT0gTlVMTCkKLQkJa29iamVjdF9wdXQoJmNhY2hlX2Rlc2MtPmtvYmopOwotCi0JY2FjaGVfdG9wbGV2ZWwgPSBwZXJfY3B1KGNhY2hlX3RvcGxldmVsLCBjcHUpOwotCWlmIChjYWNoZV90b3BsZXZlbCAhPSBOVUxMKQotCQlrb2JqZWN0X3B1dChjYWNoZV90b3BsZXZlbCk7Ci19Ci0KIHN0YXRpYyB2b2lkIHVucmVnaXN0ZXJfY3B1X29ubGluZSh1bnNpZ25lZCBpbnQgY3B1KQogewogCXN0cnVjdCBjcHUgKmMgPSAmcGVyX2NwdShjcHVfZGV2aWNlcywgY3B1KTsKQEAgLTc2OSw3ICs0NzcsNyBAQAogCQlzeXNkZXZfcmVtb3ZlX2ZpbGUocywgJmF0dHJfZHNjcik7CiAjZW5kaWYgLyogQ09ORklHX1BQQzY0ICovCiAKLQlyZW1vdmVfY2FjaGVfaW5mbyhzKTsKKwljYWNoZWluZm9fY3B1X29mZmxpbmUoY3B1KTsKIH0KICNlbmRpZiAvKiBDT05GSUdfSE9UUExVR19DUFUgKi8KIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL21tL2h1Z2V0bGJwYWdlLmMgYi9hcmNoL3Bvd2VycGMvbW0vaHVnZXRsYnBhZ2UuYwppbmRleCAyMDFjN2E1Li45OTIwZDZhIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbW0vaHVnZXRsYnBhZ2UuYworKysgYi9hcmNoL3Bvd2VycGMvbW0vaHVnZXRsYnBhZ2UuYwpAQCAtNTEyLDYgKzUxMiwxMyBAQAogCXJldHVybiBzbGljZV9nZXRfdW5tYXBwZWRfYXJlYShhZGRyLCBsZW4sIGZsYWdzLCBtbXVfcHNpemUsIDEsIDApOwogfQogCit1bnNpZ25lZCBsb25nIHZtYV9tbXVfcGFnZXNpemUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJdW5zaWduZWQgaW50IHBzaXplID0gZ2V0X3NsaWNlX3BzaXplKHZtYS0+dm1fbW0sIHZtYS0+dm1fc3RhcnQpOworCisJcmV0dXJuIDFVTCA8PCBtbXVfcHNpemVfdG9fc2hpZnQocHNpemUpOworfQorCiAvKgogICogQ2FsbGVkIGJ5IGFzbSBoYXNodGFibGUuUyBmb3IgZG9pbmcgbGF6eSBpY2FjaGUgZmx1c2gKICAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL21tL21lbS5jIGIvYXJjaC9wb3dlcnBjL21tL21lbS5jCmluZGV4IDUzYjA2ZWIuLmYwMGYwOWEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9tbS9tZW0uYworKysgYi9hcmNoL3Bvd2VycGMvbW0vbWVtLmMKQEAgLTEzMiw3ICsxMzIsNyBAQAogCS8qIHRoaXMgc2hvdWxkIHdvcmsgZm9yIG1vc3Qgbm9uLWhpZ2htZW0gcGxhdGZvcm1zICovCiAJem9uZSA9IHBnZGF0YS0+bm9kZV96b25lczsKIAotCXJldHVybiBfX2FkZF9wYWdlcyh6b25lLCBzdGFydF9wZm4sIG5yX3BhZ2VzKTsKKwlyZXR1cm4gX19hZGRfcGFnZXMobmlkLCB6b25lLCBzdGFydF9wZm4sIG5yX3BhZ2VzKTsKIH0KICNlbmRpZiAvKiBDT05GSUdfTUVNT1JZX0hPVFBMVUcgKi8KIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL21tL21tdV9kZWNsLmggYi9hcmNoL3Bvd2VycGMvbW0vbW11X2RlY2wuaAppbmRleCA0MzE0YjM5Li5hZDEyM2JjIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbW0vbW11X2RlY2wuaAorKysgYi9hcmNoL3Bvd2VycGMvbW0vbW11X2RlY2wuaApAQCAtMzAsMTEgKzMwLDExIEBACiAjaWYgZGVmaW5lZChDT05GSUdfNDB4KSB8fCBkZWZpbmVkKENPTkZJR184eHgpCiBzdGF0aWMgaW5saW5lIHZvaWQgX3RsYmlsX2FsbCh2b2lkKQogewotCWFzbSB2b2xhdGlsZSAoInN5bmM7IHRsYmlhOyBpc3luYyIgOiA6IDogIm1lbW9yeSIpCisJYXNtIHZvbGF0aWxlICgic3luYzsgdGxiaWE7IGlzeW5jIiA6IDogOiAibWVtb3J5Iik7CiB9CiBzdGF0aWMgaW5saW5lIHZvaWQgX3RsYmlsX3BpZCh1bnNpZ25lZCBpbnQgcGlkKQogewotCWFzbSB2b2xhdGlsZSAoInN5bmM7IHRsYmlhOyBpc3luYyIgOiA6IDogIm1lbW9yeSIpCisJYXNtIHZvbGF0aWxlICgic3luYzsgdGxiaWE7IGlzeW5jIiA6IDogOiAibWVtb3J5Iik7CiB9CiAjZWxzZSAvKiBDT05GSUdfNDB4IHx8IENPTkZJR184eHggKi8KIGV4dGVybiB2b2lkIF90bGJpbF9hbGwodm9pZCk7CkBAIC00Nyw3ICs0Nyw3IEBACiAjaWZkZWYgQ09ORklHXzh4eAogc3RhdGljIGlubGluZSB2b2lkIF90bGJpbF92YSh1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHVuc2lnbmVkIGludCBwaWQpCiB7Ci0JYXNtIHZvbGF0aWxlICgidGxiaWUgJTA7IHN5bmMiIDogOiAiciIgKGFkZHJlc3MpIDogIm1lbW9yeSIpCisJYXNtIHZvbGF0aWxlICgidGxiaWUgJTA7IHN5bmMiIDogOiAiciIgKGFkZHJlc3MpIDogIm1lbW9yeSIpOwogfQogI2Vsc2UgLyogQ09ORklHXzh4eCAqLwogZXh0ZXJuIHZvaWQgX3RsYmlsX3ZhKHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgdW5zaWduZWQgaW50IHBpZCk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbW0vbnVtYS5jIGIvYXJjaC9wb3dlcnBjL21tL251bWEuYwppbmRleCBjZjgxMDQ5Li43MzkzYmQ3IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbW0vbnVtYS5jCisrKyBiL2FyY2gvcG93ZXJwYy9tbS9udW1hLmMKQEAgLTgyMiw0MiArODIyLDUwIEBACiAgKiByZXF1aXJlZC4gbmlkIGlzIHRoZSBwcmVmZXJyZWQgbm9kZSBhbmQgZW5kIGlzIHRoZSBwaHlzaWNhbCBhZGRyZXNzIG9mCiAgKiB0aGUgaGlnaGVzdCBhZGRyZXNzIGluIHRoZSBub2RlLgogICoKLSAqIFJldHVybnMgdGhlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIG1lbW9yeS4KKyAqIFJldHVybnMgdGhlIHZpcnR1YWwgYWRkcmVzcyBvZiB0aGUgbWVtb3J5LgogICovCi1zdGF0aWMgdm9pZCBfX2luaXQgKmNhcmVmdWxfYWxsb2NhdGlvbihpbnQgbmlkLCB1bnNpZ25lZCBsb25nIHNpemUsCitzdGF0aWMgdm9pZCBfX2luaXQgKmNhcmVmdWxfemFsbG9jYXRpb24oaW50IG5pZCwgdW5zaWduZWQgbG9uZyBzaXplLAogCQkJCSAgICAgICB1bnNpZ25lZCBsb25nIGFsaWduLAogCQkJCSAgICAgICB1bnNpZ25lZCBsb25nIGVuZF9wZm4pCiB7CisJdm9pZCAqcmV0OwogCWludCBuZXdfbmlkOwotCXVuc2lnbmVkIGxvbmcgcmV0ID0gX19sbWJfYWxsb2NfYmFzZShzaXplLCBhbGlnbiwgZW5kX3BmbiA8PCBQQUdFX1NISUZUKTsKKwl1bnNpZ25lZCBsb25nIHJldF9wYWRkcjsKKworCXJldF9wYWRkciA9IF9fbG1iX2FsbG9jX2Jhc2Uoc2l6ZSwgYWxpZ24sIGVuZF9wZm4gPDwgUEFHRV9TSElGVCk7CiAKIAkvKiByZXRyeSBvdmVyIGFsbCBtZW1vcnkgKi8KLQlpZiAoIXJldCkKLQkJcmV0ID0gX19sbWJfYWxsb2NfYmFzZShzaXplLCBhbGlnbiwgbG1iX2VuZF9vZl9EUkFNKCkpOworCWlmICghcmV0X3BhZGRyKQorCQlyZXRfcGFkZHIgPSBfX2xtYl9hbGxvY19iYXNlKHNpemUsIGFsaWduLCBsbWJfZW5kX29mX0RSQU0oKSk7CiAKLQlpZiAoIXJldCkKLQkJcGFuaWMoIm51bWEuYzogY2Fubm90IGFsbG9jYXRlICVsdSBieXRlcyBvbiBub2RlICVkIiwKKwlpZiAoIXJldF9wYWRkcikKKwkJcGFuaWMoIm51bWEuYzogY2Fubm90IGFsbG9jYXRlICVsdSBieXRlcyBmb3Igbm9kZSAlZCIsCiAJCSAgICAgIHNpemUsIG5pZCk7CiAKKwlyZXQgPSBfX3ZhKHJldF9wYWRkcik7CisKIAkvKgotCSAqIElmIHRoZSBtZW1vcnkgY2FtZSBmcm9tIGEgcHJldmlvdXNseSBhbGxvY2F0ZWQgbm9kZSwgd2UgbXVzdAotCSAqIHJldHJ5IHdpdGggdGhlIGJvb3RtZW0gYWxsb2NhdG9yLgorCSAqIFdlIGluaXRpYWxpemUgdGhlIG5vZGVzIGluIG51bWVyaWMgb3JkZXI6IDAsIDEsIDIuLi4KKwkgKiBhbmQgaGFuZCBvdmVyIGNvbnRyb2wgZnJvbSB0aGUgTE1CIGFsbG9jYXRvciB0byB0aGUKKwkgKiBib290bWVtIGFsbG9jYXRvci4gIElmIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZvcgorCSAqIG5vZGUgNSwgdGhlbiB3ZSBrbm93IHRoYXQgYWxsIG5vZGVzIDw1IGFyZSB1c2luZyB0aGUKKwkgKiBib290bWVtIGFsbG9jYXRvciBpbnN0ZWFkIG9mIHRoZSBMTUIgYWxsb2NhdG9yLgorCSAqCisJICogU28sIGNoZWNrIHRoZSBuaWQgZnJvbSB3aGljaCB0aGlzIGFsbG9jYXRpb24gY2FtZQorCSAqIGFuZCBkb3VibGUgY2hlY2sgdG8gc2VlIGlmIHdlIG5lZWQgdG8gdXNlIGJvb3RtZW0KKwkgKiBpbnN0ZWFkIG9mIHRoZSBMTUIuICBXZSBkb24ndCBmcmVlIHRoZSBMTUIgbWVtb3J5CisJICogc2luY2UgaXQgd291bGQgYmUgdXNlbGVzcy4KIAkgKi8KLQluZXdfbmlkID0gZWFybHlfcGZuX3RvX25pZChyZXQgPj4gUEFHRV9TSElGVCk7CisJbmV3X25pZCA9IGVhcmx5X3Bmbl90b19uaWQocmV0X3BhZGRyID4+IFBBR0VfU0hJRlQpOwogCWlmIChuZXdfbmlkIDwgbmlkKSB7Ci0JCXJldCA9ICh1bnNpZ25lZCBsb25nKV9fYWxsb2NfYm9vdG1lbV9ub2RlKE5PREVfREFUQShuZXdfbmlkKSwKKwkJcmV0ID0gX19hbGxvY19ib290bWVtX25vZGUoTk9ERV9EQVRBKG5ld19uaWQpLAogCQkJCXNpemUsIGFsaWduLCAwKTsKIAotCQlpZiAoIXJldCkKLQkJCXBhbmljKCJudW1hLmM6IGNhbm5vdCBhbGxvY2F0ZSAlbHUgYnl0ZXMgb24gbm9kZSAlZCIsCi0JCQkgICAgICBzaXplLCBuZXdfbmlkKTsKLQotCQlyZXQgPSBfX3BhKHJldCk7Ci0KLQkJZGJnKCJhbGxvY19ib290bWVtICVseCAlbHhcbiIsIHJldCwgc2l6ZSk7CisJCWRiZygiYWxsb2NfYm9vdG1lbSAlcCAlbHhcbiIsIHJldCwgc2l6ZSk7CiAJfQogCi0JcmV0dXJuICh2b2lkICopcmV0OworCW1lbXNldChyZXQsIDAsIHNpemUpOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgX19jcHVpbml0ZGF0YSBwcGM2NF9udW1hX25iID0gewpAQCAtOTUyLDcgKzk2MCw3IEBACiAKIAlmb3JfZWFjaF9vbmxpbmVfbm9kZShuaWQpIHsKIAkJdW5zaWduZWQgbG9uZyBzdGFydF9wZm4sIGVuZF9wZm47Ci0JCXVuc2lnbmVkIGxvbmcgYm9vdG1lbV9wYWRkcjsKKwkJdm9pZCAqYm9vdG1lbV92YWRkcjsKIAkJdW5zaWduZWQgbG9uZyBib290bWFwX3BhZ2VzOwogCiAJCWdldF9wZm5fcmFuZ2VfZm9yX25pZChuaWQsICZzdGFydF9wZm4sICZlbmRfcGZuKTsKQEAgLTk2NCwxMSArOTcyLDkgQEAKIAkJICogcHJldmlvdXMgbm9kZXMnIGJvb3RtZW0gdG8gYmUgaW5pdGlhbGl6ZWQgYW5kIGhhdmUKIAkJICogYWxsIHJlc2VydmVkIGFyZWFzIG1hcmtlZC4KIAkJICovCi0JCU5PREVfREFUQShuaWQpID0gY2FyZWZ1bF9hbGxvY2F0aW9uKG5pZCwKKwkJTk9ERV9EQVRBKG5pZCkgPSBjYXJlZnVsX3phbGxvY2F0aW9uKG5pZCwKIAkJCQkJc2l6ZW9mKHN0cnVjdCBwZ2xpc3RfZGF0YSksCiAJCQkJCVNNUF9DQUNIRV9CWVRFUywgZW5kX3Bmbik7Ci0JCU5PREVfREFUQShuaWQpID0gX192YShOT0RFX0RBVEEobmlkKSk7Ci0JCW1lbXNldChOT0RFX0RBVEEobmlkKSwgMCwgc2l6ZW9mKHN0cnVjdCBwZ2xpc3RfZGF0YSkpOwogCiAgIAkJZGJnKCJub2RlICVkXG4iLCBuaWQpOwogCQlkYmcoIk5PREVfREFUQSgpID0gJXBcbiIsIE5PREVfREFUQShuaWQpKTsKQEAgLTk4NCwyMCArOTkwLDIwIEBACiAgIAkJZGJnKCJlbmRfcGFkZHIgPSAlbHhcbiIsIGVuZF9wZm4gPDwgUEFHRV9TSElGVCk7CiAKIAkJYm9vdG1hcF9wYWdlcyA9IGJvb3RtZW1fYm9vdG1hcF9wYWdlcyhlbmRfcGZuIC0gc3RhcnRfcGZuKTsKLQkJYm9vdG1lbV9wYWRkciA9ICh1bnNpZ25lZCBsb25nKWNhcmVmdWxfYWxsb2NhdGlvbihuaWQsCisJCWJvb3RtZW1fdmFkZHIgPSBjYXJlZnVsX3phbGxvY2F0aW9uKG5pZCwKIAkJCQkJYm9vdG1hcF9wYWdlcyA8PCBQQUdFX1NISUZULAogCQkJCQlQQUdFX1NJWkUsIGVuZF9wZm4pOwotCQltZW1zZXQoX192YShib290bWVtX3BhZGRyKSwgMCwgYm9vdG1hcF9wYWdlcyA8PCBQQUdFX1NISUZUKTsKIAotCQlkYmcoImJvb3RtYXBfcGFkZHIgPSAlbHhcbiIsIGJvb3RtZW1fcGFkZHIpOworCQlkYmcoImJvb3RtYXBfdmFkZHIgPSAlcFxuIiwgYm9vdG1lbV92YWRkcik7CiAKLQkJaW5pdF9ib290bWVtX25vZGUoTk9ERV9EQVRBKG5pZCksIGJvb3RtZW1fcGFkZHIgPj4gUEFHRV9TSElGVCwKKwkJaW5pdF9ib290bWVtX25vZGUoTk9ERV9EQVRBKG5pZCksCisJCQkJICBfX3BhKGJvb3RtZW1fdmFkZHIpID4+IFBBR0VfU0hJRlQsCiAJCQkJICBzdGFydF9wZm4sIGVuZF9wZm4pOwogCiAJCWZyZWVfYm9vdG1lbV93aXRoX2FjdGl2ZV9yZWdpb25zKG5pZCwgZW5kX3Bmbik7CiAJCS8qCiAJCSAqIEJlIHZlcnkgY2FyZWZ1bCBhYm91dCBtb3ZpbmcgdGhpcyBhcm91bmQuICBGdXR1cmUKLQkJICogY2FsbHMgdG8gY2FyZWZ1bF9hbGxvY2F0aW9uKCkgZGVwZW5kIG9uIHRoaXMgZ2V0dGluZworCQkgKiBjYWxscyB0byBjYXJlZnVsX3phbGxvY2F0aW9uKCkgZGVwZW5kIG9uIHRoaXMgZ2V0dGluZwogCQkgKiBkb25lIGNvcnJlY3RseS4KIAkJICovCiAJCW1hcmtfcmVzZXJ2ZWRfcmVnaW9uc19mb3JfbmlkKG5pZCk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbW0vcGd0YWJsZV8zMi5jIGIvYXJjaC9wb3dlcnBjL21tL3BndGFibGVfMzIuYwppbmRleCAzOGZmMzVmLi4yMjk3MmNkIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbW0vcGd0YWJsZV8zMi5jCisrKyBiL2FyY2gvcG93ZXJwYy9tbS9wZ3RhYmxlXzMyLmMKQEAgLTI2Niw3ICsyNjYsOCBAQAogCQkvKiBUaGUgUFRFIHNob3VsZCBuZXZlciBiZSBhbHJlYWR5IHNldCBub3IgcHJlc2VudCBpbiB0aGUKIAkJICogaGFzaCB0YWJsZQogCQkgKi8KLQkJQlVHX09OKHB0ZV92YWwoKnBnKSAmIChfUEFHRV9QUkVTRU5UIHwgX1BBR0VfSEFTSFBURSkpOworCQlCVUdfT04oKHB0ZV92YWwoKnBnKSAmIChfUEFHRV9QUkVTRU5UIHwgX1BBR0VfSEFTSFBURSkpICYmCisJCSAgICAgICBmbGFncyk7CiAJCXNldF9wdGVfYXQoJmluaXRfbW0sIHZhLCBwZywgcGZuX3B0ZShwYSA+PiBQQUdFX1NISUZULAogCQkJCQkJICAgICBfX3BncHJvdChmbGFncykpKTsKIAl9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbW0vdGxiX25vaGFzaC5jIGIvYXJjaC9wb3dlcnBjL21tL3RsYl9ub2hhc2guYwppbmRleCA4MDNhNjRjLi4zOWFjMjJiIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbW0vdGxiX25vaGFzaC5jCisrKyBiL2FyY2gvcG93ZXJwYy9tbS90bGJfbm9oYXNoLmMKQEAgLTE4OSw4ICsxODksOSBAQAogCXNtcF9jYWxsX2Z1bmN0aW9uKGRvX2ZsdXNoX3RsYl9tbV9pcGksIE5VTEwsIDEpOwogCV90bGJpbF9waWQoMCk7CiAJcHJlZW1wdF9lbmFibGUoKTsKLSNlbmRpZgorI2Vsc2UKIAlfdGxiaWxfcGlkKDApOworI2VuZGlmCiB9CiBFWFBPUlRfU1lNQk9MKGZsdXNoX3RsYl9rZXJuZWxfcmFuZ2UpOwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvb3Byb2ZpbGUvY2VsbC9wcl91dGlsLmggYi9hcmNoL3Bvd2VycGMvb3Byb2ZpbGUvY2VsbC9wcl91dGlsLmgKaW5kZXggNjI4MDA5Yy4uZGZkYmZmYSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL29wcm9maWxlL2NlbGwvcHJfdXRpbC5oCisrKyBiL2FyY2gvcG93ZXJwYy9vcHJvZmlsZS9jZWxsL3ByX3V0aWwuaApAQCAtNzksNyArNzksNyBAQAogICogdGhlIHZtYS10by1maWxlb2Zmc2V0IG1hcC4KICAqLwogc3RydWN0IHZtYV90b19maWxlb2Zmc2V0X21hcCAqY3JlYXRlX3ZtYV9tYXAoY29uc3Qgc3RydWN0IHNwdSAqc3B1LAotCQkJCQkgICAgIHU2NCBvYmplY3RpZCk7CisJCQkJCSAgICAgdW5zaWduZWQgbG9uZyBvYmplY3RpZCk7CiB1bnNpZ25lZCBpbnQgdm1hX21hcF9sb29rdXAoc3RydWN0IHZtYV90b19maWxlb2Zmc2V0X21hcCAqbWFwLAogCQkJICAgIHVuc2lnbmVkIGludCB2bWEsIGNvbnN0IHN0cnVjdCBzcHUgKmFTcHUsCiAJCQkgICAgaW50ICpncmRfdmFsKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9vcHJvZmlsZS9jZWxsL3NwdV9wcm9maWxlci5jIGIvYXJjaC9wb3dlcnBjL29wcm9maWxlL2NlbGwvc3B1X3Byb2ZpbGVyLmMKaW5kZXggZGQ0OTljMy4uODNmYWE5NSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL29wcm9maWxlL2NlbGwvc3B1X3Byb2ZpbGVyLmMKKysrIGIvYXJjaC9wb3dlcnBjL29wcm9maWxlL2NlbGwvc3B1X3Byb2ZpbGVyLmMKQEAgLTQ5LDcgKzQ5LDcgQEAKIAkgKiBvZiBwcmVjaXNpb24uICBUaGlzIGlzIGNsb3NlIGVub3VnaCBmb3IgdGhlIHB1cnBvc2UgYXQgaGFuZC4KIAkgKgogCSAqIFRoZSB2YWx1ZSBvZiB0aGUgdGltZW91dCBzaG91bGQgYmUgc21hbGwgZW5vdWdoIHRoYXQgdGhlIGh3Ci0JICogdHJhY2UgYnVmZmVyIHdpbGwgbm90IGdldCBtb3JlIHRoZW4gYWJvdXQgMS8zIGZ1bGwgZm9yIHRoZQorCSAqIHRyYWNlIGJ1ZmZlciB3aWxsIG5vdCBnZXQgbW9yZSB0aGFuIGFib3V0IDEvMyBmdWxsIGZvciB0aGUKIAkgKiBtYXhpbXVtIHVzZXIgc3BlY2lmaWVkICh0aGUgTEZTUiB2YWx1ZSkgaHcgc2FtcGxpbmcgZnJlcXVlbmN5LgogCSAqIFRoaXMgaXMgdG8gZW5zdXJlIHRoZSB0cmFjZSBidWZmZXIgd2lsbCBuZXZlciBmaWxsIGV2ZW4gaWYgdGhlCiAJICoga2VybmVsIHRocmVhZCBzY2hlZHVsaW5nIHZhcmllcyB1bmRlciBhIGhlYXZ5IHN5c3RlbSBsb2FkLgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81Mnh4L21wYzUyeHhfY29tbW9uLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUyeHgvbXBjNTJ4eF9jb21tb24uYwppbmRleCBhZTdjMzRmLi45ODM2N2EwIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUyeHgvbXBjNTJ4eF9jb21tb24uYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUyeHgvbXBjNTJ4eF9jb21tb24uYwpAQCAtNDIsNyArNDIsNyBAQAogICogZnJvbSBpbnRlcnJ1cHQgY29udGV4dCB3aGlsZSBub2RlIG1hcHBpbmcgKHdoaWNoIGNhbGxzIGlvcmVtYXAoKSkKICAqIGNhbm5vdCBiZSB1c2VkIGF0IHN1Y2ggcG9pbnQuCiAgKi8KLXN0YXRpYyBzcGlubG9ja190IG1wYzUyeHhfbG9jayA9IFNQSU5fTE9DS19VTkxPQ0tFRDsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0sobXBjNTJ4eF9sb2NrKTsKIHN0YXRpYyBzdHJ1Y3QgbXBjNTJ4eF9ncHQgX19pb21lbSAqbXBjNTJ4eF93ZHQ7CiBzdGF0aWMgc3RydWN0IG1wYzUyeHhfY2RtIF9faW9tZW0gKm1wYzUyeHhfY2RtOwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODMxeF9yZGIuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4MzF4X3JkYi5jCmluZGV4IGE0MjhmOGQuLjUxNzdiZGQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4MzF4X3JkYi5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4MzF4X3JkYi5jCkBAIC00Miw3ICs0Miw3IEBACiAJbXBjODMxeF91c2JfY2ZnKCk7CiB9CiAKLXZvaWQgX19pbml0IG1wYzgzMXhfcmRiX2luaXRfSVJRKHZvaWQpCitzdGF0aWMgdm9pZCBfX2luaXQgbXBjODMxeF9yZGJfaW5pdF9JUlEodm9pZCkKIHsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODMyeF9tZHMuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4MzJ4X21kcy5jCmluZGV4IGVjNDM0NzcuLmVjMGI0MDFiIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODMyeF9tZHMuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODMyeF9tZHMuYwpAQCAtNDksOCArNDksNiBAQAogI2RlZmluZSBEQkcoZm10Li4uKQogI2VuZGlmCiAKLXN0YXRpYyB1OCAqYmNzcl9yZWdzID0gTlVMTDsKLQogLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogU2V0dXAgdGhlIGFyY2hpdGVjdHVyZQpAQCAtNTksMTMgKzU3LDE0IEBACiBzdGF0aWMgdm9pZCBfX2luaXQgbXBjODMyeF9zeXNfc2V0dXBfYXJjaCh2b2lkKQogewogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7CisJdTggX19pb21lbSAqYmNzcl9yZWdzID0gTlVMTDsKIAogCWlmIChwcGNfbWQucHJvZ3Jlc3MpCiAJCXBwY19tZC5wcm9ncmVzcygibXBjODMyeF9zeXNfc2V0dXBfYXJjaCgpIiwgMCk7CiAKIAkvKiBNYXAgQkNTUiBhcmVhICovCiAJbnAgPSBvZl9maW5kX25vZGVfYnlfbmFtZShOVUxMLCAiYmNzciIpOwotCWlmIChucCAhPSAwKSB7CisJaWYgKG5wKSB7CiAJCXN0cnVjdCByZXNvdXJjZSByZXM7CiAKIAkJb2ZfYWRkcmVzc190b19yZXNvdXJjZShucCwgMCwgJnJlcyk7CkBAIC05Myw5ICs5Miw5IEBACiAJCQkhPSBOVUxMKXsKIAkJLyogUmVzZXQgdGhlIEV0aGVybmV0IFBIWXMgKi8KICNkZWZpbmUgQkNTUjhfRkVUSF9SU1QgMHg1MAotCQliY3NyX3JlZ3NbOF0gJj0gfkJDU1I4X0ZFVEhfUlNUOworCQljbHJiaXRzOCgmYmNzcl9yZWdzWzhdLCBCQ1NSOF9GRVRIX1JTVCk7CiAJCXVkZWxheSgxMDAwKTsKLQkJYmNzcl9yZWdzWzhdIHw9IEJDU1I4X0ZFVEhfUlNUOworCQlzZXRiaXRzOCgmYmNzcl9yZWdzWzhdLCBCQ1NSOF9GRVRIX1JTVCk7CiAJCWlvdW5tYXAoYmNzcl9yZWdzKTsKIAkJb2Zfbm9kZV9wdXQobnApOwogCX0KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4MzJ4X3JkYi5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzMnhfcmRiLmMKaW5kZXggMDMwMDI2OC4uMmExMjk1ZiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzMnhfcmRiLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzMnhfcmRiLmMKQEAgLTM4LDYgKzM4LDcgQEAKICNkZWZpbmUgREJHKGZtdC4uLikKICNlbmRpZgogCisjaWZkZWYgQ09ORklHX1FVSUNDX0VOR0lORQogc3RhdGljIHZvaWQgbXBjODN4eF9zcGlfYWN0aXZhdGVfY3ModTggY3MsIHU4IHBvbGFyaXR5KQogewogCXByX2RlYnVnKCIlcyAlZCAlZFxuIiwgX19mdW5jX18sIGNzLCBwb2xhcml0eSk7CkBAIC03Nyw4ICs3OCw4IEBACiAJCQkgICAgbXBjODN4eF9zcGlfYWN0aXZhdGVfY3MsCiAJCQkgICAgbXBjODN4eF9zcGlfZGVhY3RpdmF0ZV9jcyk7CiB9Ci0KIG1hY2hpbmVfZGV2aWNlX2luaXRjYWxsKG1wYzgzMnhfcmRiLCBtcGM4MzJ4X3NwaV9pbml0KTsKKyNlbmRpZiAvKiBDT05GSUdfUVVJQ0NfRU5HSU5FICovCiAKIC8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTEzMCw3ICsxMzEsNyBAQAogfQogbWFjaGluZV9kZXZpY2VfaW5pdGNhbGwobXBjODMyeF9yZGIsIG1wYzgzMnhfZGVjbGFyZV9vZl9wbGF0Zm9ybV9kZXZpY2VzKTsKIAotdm9pZCBfX2luaXQgbXBjODMyeF9yZGJfaW5pdF9JUlEodm9pZCkKK3N0YXRpYyB2b2lkIF9faW5pdCBtcGM4MzJ4X3JkYl9pbml0X0lSUSh2b2lkKQogewogCiAJc3RydWN0IGRldmljZV9ub2RlICpucDsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4MzZ4X21kcy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzNnhfbWRzLmMKaW5kZXggOWQ0NmU1Yi4uMDllOWQ2ZiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzNnhfbWRzLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzNnhfbWRzLmMKQEAgLTE4LDYgKzE4LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvcmVib290Lmg+CkBAIC00Myw2ICs0NCw3IEBACiAjaW5jbHVkZSA8YXNtL3VkYmcuaD4KICNpbmNsdWRlIDxzeXNkZXYvZnNsX3NvYy5oPgogI2luY2x1ZGUgPHN5c2Rldi9mc2xfcGNpLmg+CisjaW5jbHVkZSA8c3lzZGV2L3NpbXBsZV9ncGlvLmg+CiAjaW5jbHVkZSA8YXNtL3FlLmg+CiAjaW5jbHVkZSA8YXNtL3FlX2ljLmg+CiAKQEAgLTU1LDggKzU3LDYgQEAKICNkZWZpbmUgREJHKGZtdC4uLikKICNlbmRpZgogCi1zdGF0aWMgdTggKmJjc3JfcmVncyA9IE5VTEw7Ci0KIC8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIFNldHVwIHRoZSBhcmNoaXRlY3R1cmUKQEAgLTY1LDEzICs2NSwxNCBAQAogc3RhdGljIHZvaWQgX19pbml0IG1wYzgzNnhfbWRzX3NldHVwX2FyY2godm9pZCkKIHsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOworCXU4IF9faW9tZW0gKmJjc3JfcmVncyA9IE5VTEw7CiAKIAlpZiAocHBjX21kLnByb2dyZXNzKQogCQlwcGNfbWQucHJvZ3Jlc3MoIm1wYzgzNnhfbWRzX3NldHVwX2FyY2goKSIsIDApOwogCiAJLyogTWFwIEJDU1IgYXJlYSAqLwogCW5wID0gb2ZfZmluZF9ub2RlX2J5X25hbWUoTlVMTCwgImJjc3IiKTsKLQlpZiAobnAgIT0gMCkgeworCWlmIChucCkgewogCQlzdHJ1Y3QgcmVzb3VyY2UgcmVzOwogCiAJCW9mX2FkZHJlc3NfdG9fcmVzb3VyY2UobnAsIDAsICZyZXMpOwpAQCAtOTMsNiArOTQsMTYgQEAKIAogCQlmb3IgKG5wID0gTlVMTDsgKG5wID0gb2ZfZmluZF9ub2RlX2J5X25hbWUobnAsICJ1Y2MiKSkgIT0gTlVMTDspCiAJCQlwYXJfaW9fb2ZfY29uZmlnKG5wKTsKKyNpZmRlZiBDT05GSUdfUUVfVVNCCisJCS8qIE11c3QgZml4dXAgUGFyIElPIGJlZm9yZSBRRSBHUElPIGNoaXBzIGFyZSByZWdpc3RlcmVkLiAqLworCQlwYXJfaW9fY29uZmlnX3BpbigxLCAgMiwgMSwgMCwgMywgMCk7IC8qIFVTQk9FICAqLworCQlwYXJfaW9fY29uZmlnX3BpbigxLCAgMywgMSwgMCwgMywgMCk7IC8qIFVTQlRQICAqLworCQlwYXJfaW9fY29uZmlnX3BpbigxLCAgOCwgMSwgMCwgMSwgMCk7IC8qIFVTQlROICAqLworCQlwYXJfaW9fY29uZmlnX3BpbigxLCAxMCwgMiwgMCwgMywgMCk7IC8qIFVTQlJYRCAqLworCQlwYXJfaW9fY29uZmlnX3BpbigxLCAgOSwgMiwgMSwgMywgMCk7IC8qIFVTQlJQICAqLworCQlwYXJfaW9fY29uZmlnX3BpbigxLCAxMSwgMiwgMSwgMywgMCk7IC8qIFVTQlJOICAqLworCQlwYXJfaW9fY29uZmlnX3BpbigyLCAyMCwgMiwgMCwgMSwgMCk7IC8qIENMSzIxICAqLworI2VuZGlmIC8qIENPTkZJR19RRV9VU0IgKi8KIAl9CiAKIAlpZiAoKG5wID0gb2ZfZmluZF9jb21wYXRpYmxlX25vZGUoTlVMTCwgIm5ldHdvcmsiLCAidWNjX2dldGgiKSkKQEAgLTE1MSw2ICsxNjIsNzAgQEAKIH0KIG1hY2hpbmVfZGV2aWNlX2luaXRjYWxsKG1wYzgzNnhfbWRzLCBtcGM4MzZ4X2RlY2xhcmVfb2ZfcGxhdGZvcm1fZGV2aWNlcyk7CiAKKyNpZmRlZiBDT05GSUdfUUVfVVNCCitzdGF0aWMgaW50IF9faW5pdCBtcGM4MzZ4X3VzYl9jZmcodm9pZCkKK3sKKwl1OCBfX2lvbWVtICpiY3NyOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7CisJY29uc3QgY2hhciAqbW9kZTsKKwlpbnQgcmV0ID0gMDsKKworCW5wID0gb2ZfZmluZF9jb21wYXRpYmxlX25vZGUoTlVMTCwgTlVMTCwgImZzbCxtcGM4MzYwbWRzLWJjc3IiKTsKKwlpZiAoIW5wKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWJjc3IgPSBvZl9pb21hcChucCwgMCk7CisJb2Zfbm9kZV9wdXQobnApOworCWlmICghYmNzcikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlucCA9IG9mX2ZpbmRfY29tcGF0aWJsZV9ub2RlKE5VTEwsIE5VTEwsICJmc2wsbXBjODMyMy1xZS11c2IiKTsKKwlpZiAoIW5wKSB7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gZXJyOworCX0KKworI2RlZmluZSBCQ1NSOF9UU0VDMU1fTUFTSwkoMHgzIDw8IDYpCisjZGVmaW5lIEJDU1I4X1RTRUMxTV9SR01JSQkoMHgwIDw8IDYpCisjZGVmaW5lIEJDU1I4X1RTRUMyTV9NQVNLCSgweDMgPDwgNCkKKyNkZWZpbmUgQkNTUjhfVFNFQzJNX1JHTUlJCSgweDAgPDwgNCkKKwkvKgorCSAqIERlZmF1bHQgaXMgR01JSSAoMiksIGJ1dCB3ZSBzaG91bGQgc2V0IGl0IHRvIFJHTUlJICgwKSBpZiB3ZSB1c2UKKwkgKiBVU0IgKEV0aCBQSFkgaXMgaW4gUkdNSUkgbW9kZSBhbnl3YXkpLgorCSAqLworCWNscnNldGJpdHNfOCgmYmNzcls4XSwgQkNTUjhfVFNFQzFNX01BU0sgfCBCQ1NSOF9UU0VDMk1fTUFTSywKKwkJCSAgICAgICBCQ1NSOF9UU0VDMU1fUkdNSUkgfCBCQ1NSOF9UU0VDMk1fUkdNSUkpOworCisjZGVmaW5lIEJDU1IxM19VU0JNQVNLCTB4MGYKKyNkZWZpbmUgQkNTUjEzX25VU0JFTgkweDA4IC8qIDEgLSBEaXNhYmxlLCAwIC0gRW5hYmxlCQkJKi8KKyNkZWZpbmUgQkNTUjEzX1VTQlNQRUVECTB4MDQgLyogMSAtIEZ1bGwsIDAgLSBMb3cJCQkqLworI2RlZmluZSBCQ1NSMTNfVVNCTU9ERQkweDAyIC8qIDEgLSBIb3N0LCAwIC0gRnVuY3Rpb24JCQkqLworI2RlZmluZSBCQ1NSMTNfblVTQlZDQwkweDAxIC8qIDEgLSBnZXRzIFZCVVMsIDAgLSBzdXBwbGllcyBWQlVTIAkqLworCisJY2xyc2V0Yml0c184KCZiY3NyWzEzXSwgQkNTUjEzX1VTQk1BU0ssIEJDU1IxM19VU0JTUEVFRCk7CisKKwltb2RlID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCAibW9kZSIsIE5VTEwpOworCWlmIChtb2RlICYmICFzdHJjbXAobW9kZSwgInBlcmlwaGVyYWwiKSkgeworCQlzZXRiaXRzOCgmYmNzclsxM10sIEJDU1IxM19uVVNCVkNDKTsKKwkJcWVfdXNiX2Nsb2NrX3NldChRRV9DTEsyMSwgNDgwMDAwMDApOworCX0gZWxzZSB7CisJCXNldGJpdHM4KCZiY3NyWzEzXSwgQkNTUjEzX1VTQk1PREUpOworCQkvKgorCQkgKiBUaGUgQkNTUiBHUElPcyBhcmUgdXNlZCB0byBjb250cm9sIHBvd2VyIGFuZAorCQkgKiBzcGVlZCBvZiB0aGUgVVNCIHRyYW5zY2VpdmVyLiBUaGlzIGlzIG5lZWRlZCBmb3IKKwkJICogdGhlIFVTQiBIb3N0IG9ubHkuCisJCSAqLworCQlzaW1wbGVfZ3Bpb2NoaXBfaW5pdCgiZnNsLG1wYzgzNjBtZHMtYmNzci1ncGlvIik7CisJfQorCisJb2Zfbm9kZV9wdXQobnApOworZXJyOgorCWlvdW5tYXAoYmNzcik7CisJcmV0dXJuIHJldDsKK30KK21hY2hpbmVfYXJjaF9pbml0Y2FsbChtcGM4MzZ4X21kcywgbXBjODM2eF91c2JfY2ZnKTsKKyNlbmRpZiAvKiBDT05GSUdfUUVfVVNCICovCisKIHN0YXRpYyB2b2lkIF9faW5pdCBtcGM4MzZ4X21kc19pbml0X0lSUSh2b2lkKQogewogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODM2eF9yZGsuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4MzZ4X3Jkay5jCmluZGV4IGE1MjczYmIuLmIwMDkwYWEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4MzZ4X3Jkay5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4MzZ4X3Jkay5jCkBAIC01MSw4ICs1MSw5IEBACiAJZm9yX2VhY2hfY29tcGF0aWJsZV9ub2RlKG5wLCAicGNpIiwgImZzbCxtcGM4MzQ5LXBjaSIpCiAJCW1wYzgzeHhfYWRkX2JyaWRnZShucCk7CiAjZW5kaWYKLQorI2lmZGVmIENPTkZJR19RVUlDQ19FTkdJTkUKIAlxZV9yZXNldCgpOworI2VuZGlmCiB9CiAKIHN0YXRpYyB2b2lkIF9faW5pdCBtcGM4MzZ4X3Jka19pbml0X0lSUSh2b2lkKQpAQCAtNzEsMTMgKzcyLDE0IEBACiAJICovCiAJaXBpY19zZXRfZGVmYXVsdF9wcmlvcml0eSgpOwogCW9mX25vZGVfcHV0KG5wKTsKLQorI2lmZGVmIENPTkZJR19RVUlDQ19FTkdJTkUKIAlucCA9IG9mX2ZpbmRfY29tcGF0aWJsZV9ub2RlKE5VTEwsIE5VTEwsICJmc2wscWUtaWMiKTsKIAlpZiAoIW5wKQogCQlyZXR1cm47CiAKIAlxZV9pY19pbml0KG5wLCAwLCBxZV9pY19jYXNjYWRlX2xvd19pcGljLCBxZV9pY19jYXNjYWRlX2hpZ2hfaXBpYyk7CiAJb2Zfbm9kZV9wdXQobnApOworI2VuZGlmCiB9CiAKIC8qCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODM3eF9tZHMuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4Mzd4X21kcy5jCmluZGV4IDhiYjEzYzguLjUzMGVmOTkgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4Mzd4X21kcy5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4Mzd4X21kcy5jCkBAIC0yNiw3ICsyNiw2IEBACiAjZGVmaW5lIEJDU1IxMl9VU0JfU0VSX01BU0sJMHg4YQogI2RlZmluZSBCQ1NSMTJfVVNCX1NFUl9QSU4JMHg4MAogI2RlZmluZSBCQ1NSMTJfVVNCX1NFUl9ERVZJQ0UJMHgwMgotZXh0ZXJuIGludCBtcGM4Mzd4X3VzYl9jZmcodm9pZCk7CiAKIHN0YXRpYyBpbnQgbXBjODM3eG1kc191c2JfY2ZnKHZvaWQpCiB7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODM3eF9yZGIuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4Mzd4X3JkYi5jCmluZGV4IGRhMDMwYWYuLjFkMDk2NTQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4Mzd4X3JkYi5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4Mzd4X3JkYi5jCkBAIC0yMSw4ICsyMSw2IEBACiAKICNpbmNsdWRlICJtcGM4M3h4LmgiCiAKLWV4dGVybiBpbnQgbXBjODM3eF91c2JfY2ZnKHZvaWQpOwotCiAvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBTZXR1cCB0aGUgYXJjaGl0ZWN0dXJlCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODN4eC5oIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzeHguaAppbmRleCAyYTdjYmFiLi44M2NmZTUxIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODN4eC5oCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4M3h4LmgKQEAgLTYxLDYgKzYxLDcgQEAKIAogZXh0ZXJuIHZvaWQgbXBjODN4eF9yZXN0YXJ0KGNoYXIgKmNtZCk7CiBleHRlcm4gbG9uZyBtcGM4M3h4X3RpbWVfaW5pdCh2b2lkKTsKK2V4dGVybiBpbnQgbXBjODM3eF91c2JfY2ZnKHZvaWQpOwogZXh0ZXJuIGludCBtcGM4MzR4X3VzYl9jZmcodm9pZCk7CiBleHRlcm4gaW50IG1wYzgzMXhfdXNiX2NmZyh2b2lkKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L21wYzg1eHhfZHMuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9tcGM4NXh4X2RzLmMKaW5kZXggYTgzMDFjOC4uNzMyNmQ5MCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L21wYzg1eHhfZHMuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvbXBjODV4eF9kcy5jCkBAIC0xNDgsNiArMTQ4LDkgQEAKIC8qCiAgKiBTZXR1cCB0aGUgYXJjaGl0ZWN0dXJlCiAgKi8KKyNpZmRlZiBDT05GSUdfU01QCitleHRlcm4gdm9pZCBfX2luaXQgbXBjODV4eF9zbXBfaW5pdCh2b2lkKTsKKyNlbmRpZgogc3RhdGljIHZvaWQgX19pbml0IG1wYzg1eHhfZHNfc2V0dXBfYXJjaCh2b2lkKQogewogI2lmZGVmIENPTkZJR19QQ0kKQEAgLTE3Myw2ICsxNzYsMTAgQEAKIAlwcGNfbWQucGNpX2V4Y2x1ZGVfZGV2aWNlID0gbXBjODV4eF9leGNsdWRlX2RldmljZTsKICNlbmRpZgogCisjaWZkZWYgQ09ORklHX1NNUAorCW1wYzg1eHhfc21wX2luaXQoKTsKKyNlbmRpZgorCiAJcHJpbnRrKCJNUEM4NXh4IERTIGJvYXJkIGZyb20gRnJlZXNjYWxlIFNlbWljb25kdWN0b3JcbiIpOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvc21wLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvc21wLmMKaW5kZXggZDY1MmM3MS4uNzlhMGRmMSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L3NtcC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9zbXAuYwpAQCAtNTgsNiArNTgsNyBAQAogCiAJaWYgKGNwdV9yZWxfYWRkciA9PSBOVUxMKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiTm8gY3B1LXJlbGVhc2UtYWRkciBmb3IgY3B1ICVkXG4iLCBucik7CisJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIAkJcmV0dXJuOwogCX0KIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9LY29uZmlnIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9LY29uZmlnCmluZGV4IDQ3ZTk1NmMuLjQ3ZmUyYmUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvS2NvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL0tjb25maWcKQEAgLTMxMiw0ICszMTIsMTUgQEAKIAkgIFNheSBZIGhlcmUgaWYgeW91J3JlIGdvaW5nIHRvIHVzZSBoYXJkd2FyZSB0aGF0IGNvbm5lY3RzIHRvIHRoZQogCSAgTVBDODMxeC84MzR4LzgzN3gvODU3Mi84NjEwIEdQSU9zLgogCitjb25maWcgU0lNUExFX0dQSU8KKwlib29sICJTdXBwb3J0IGZvciBzaW1wbGUsIG1lbW9yeS1tYXBwZWQgR1BJTyBjb250cm9sbGVycyIKKwlkZXBlbmRzIG9uIFBQQworCXNlbGVjdCBHRU5FUklDX0dQSU8KKwlzZWxlY3QgQVJDSF9SRVFVSVJFX0dQSU9MSUIKKwloZWxwCisJICBTYXkgWSBoZXJlIHRvIHN1cHBvcnQgc2ltcGxlLCBtZW1vcnktbWFwcGVkIEdQSU8gY29udHJvbGxlcnMuCisJICBUaGVzZSBhcmUgdXN1YWxseSBCQ1NScyB1c2VkIHRvIGNvbnRyb2wgYm9hcmQncyBzd2l0Y2hlcywgTEVEcywKKwkgIGNoaXAtc2VsZWN0cywgRXRoZXJuZXQvVVNCIFBIWSdzIHBvd2VyIGFuZCB2YXJpb3VzIG90aGVyIHNtYWxsCisJICBvbi1ib2FyZCBwZXJpcGhlcmFscy4KKwogZW5kbWVudQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9LY29uZmlnLmNwdXR5cGUgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL0tjb25maWcuY3B1dHlwZQppbmRleCAzZDBjNzc2Li5lODY4YjVjIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL0tjb25maWcuY3B1dHlwZQorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL0tjb25maWcuY3B1dHlwZQpAQCAtMjMxLDcgKzIzMSw3IEBACiAJICBJZiBpbiBkb3VidCwgc2F5IFkgaGVyZS4KIAogY29uZmlnIFNNUAotCWRlcGVuZHMgb24gUFBDX1NURF9NTVUKKwlkZXBlbmRzIG9uIFBQQ19TVERfTU1VIHx8IEZTTF9CT09LRQogCWJvb2wgIlN5bW1ldHJpYyBtdWx0aS1wcm9jZXNzaW5nIHN1cHBvcnQiCiAJLS0taGVscC0tLQogCSAgVGhpcyBlbmFibGVzIHN1cHBvcnQgZm9yIHN5c3RlbXMgd2l0aCBtb3JlIHRoYW4gb25lIENQVS4gSWYgeW91IGhhdmUKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9iZWF0X2h0YWIuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9iZWF0X2h0YWIuYwppbmRleCAyZTY3YmQ4Li4zNWIxZWM0IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvYmVhdF9odGFiLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2JlYXRfaHRhYi5jCkBAIC00NCw4ICs0NCw4IEBACiAKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGJlYXRfcmVhZF9tYXNrKHVuc2lnbmVkIGhwdGVfZ3JvdXApCiB7Ci0JdW5zaWduZWQgbG9uZyBocHRlX3ZbNV07CiAJdW5zaWduZWQgbG9uZyBybWFzayA9IDA7CisJdTY0IGhwdGVfdls1XTsKIAogCWJlYXRfcmVhZF9odGFiX2VudHJpZXMoMCwgaHB0ZV9ncm91cCArIDAsIGhwdGVfdik7CiAJaWYgKCEoaHB0ZV92WzBdICYgSFBURV9WX0JPTFRFRCkpCkBAIC05Myw4ICs5Myw3IEBACiAJCQkJICBpbnQgcHNpemUsIGludCBzc2l6ZSkKIHsKIAl1bnNpZ25lZCBsb25nIGxwYXJfcmM7Ci0JdW5zaWduZWQgbG9uZyBzbG90OwotCXVuc2lnbmVkIGxvbmcgaHB0ZV92LCBocHRlX3I7CisJdTY0IGhwdGVfdiwgaHB0ZV9yLCBzbG90OwogCiAJLyogc2FtZSBhcyBpc2VyaWVzICovCiAJaWYgKHZmbGFncyAmIEhQVEVfVl9TRUNPTkRBUlkpCkBAIC0xNTMsOCArMTUyLDkgQEAKIAogc3RhdGljIHVuc2lnbmVkIGxvbmcgYmVhdF9scGFyX2hwdGVfZ2V0d29yZDAodW5zaWduZWQgbG9uZyBzbG90KQogewotCXVuc2lnbmVkIGxvbmcgZHdvcmQwLCBkd29yZFs1XTsKKwl1bnNpZ25lZCBsb25nIGR3b3JkMDsKIAl1bnNpZ25lZCBsb25nIGxwYXJfcmM7CisJdTY0IGR3b3JkWzVdOwogCiAJbHBhcl9yYyA9IGJlYXRfcmVhZF9odGFiX2VudHJpZXMoMCwgc2xvdCAmIH4zVUwsIGR3b3JkKTsKIApAQCAtMTcwLDcgKzE3MCw3IEBACiAJdW5zaWduZWQgbG9uZyBzaXplX2J5dGVzID0gMVVMIDw8IHBwYzY0X3BmdF9zaXplOwogCXVuc2lnbmVkIGxvbmcgaHB0ZV9jb3VudCA9IHNpemVfYnl0ZXMgPj4gNDsKIAlpbnQgaTsKLQl1bnNpZ25lZCBsb25nIGR1bW15MCwgZHVtbXkxOworCXU2NCBkdW1teTAsIGR1bW15MTsKIAogCS8qIFRPRE86IFVzZSBidWxrIGNhbGwgKi8KIAlmb3IgKGkgPSAwOyBpIDwgaHB0ZV9jb3VudDsgaSsrKQpAQCAtMTg5LDcgKzE4OSw4IEBACiAJCQkJICAgIGludCBwc2l6ZSwgaW50IHNzaXplLCBpbnQgbG9jYWwpCiB7CiAJdW5zaWduZWQgbG9uZyBscGFyX3JjOwotCXVuc2lnbmVkIGxvbmcgZHVtbXkwLCBkdW1teTEsIHdhbnRfdjsKKwl1NjQgZHVtbXkwLCBkdW1teTE7CisJdW5zaWduZWQgbG9uZyB3YW50X3Y7CiAKIAl3YW50X3YgPSBocHRlX2VuY29kZV92KHZhLCBwc2l6ZSwgTU1VX1NFR1NJWkVfMjU2TSk7CiAKQEAgLTI1NSw3ICsyNTYsOCBAQAogCQkJCQkgIHVuc2lnbmVkIGxvbmcgZWEsCiAJCQkJCSAgaW50IHBzaXplLCBpbnQgc3NpemUpCiB7Ci0JdW5zaWduZWQgbG9uZyBscGFyX3JjLCBzbG90LCB2c2lkLCB2YSwgZHVtbXkwLCBkdW1teTE7CisJdW5zaWduZWQgbG9uZyBscGFyX3JjLCBzbG90LCB2c2lkLCB2YTsKKwl1NjQgZHVtbXkwLCBkdW1teTE7CiAKIAl2c2lkID0gZ2V0X2tlcm5lbF92c2lkKGVhLCBNTVVfU0VHU0laRV8yNTZNKTsKIAl2YSA9ICh2c2lkIDw8IDI4KSB8IChlYSAmIDB4MGZmZmZmZmYpOwpAQCAtMjc2LDcgKzI3OCw3IEBACiB7CiAJdW5zaWduZWQgbG9uZyB3YW50X3Y7CiAJdW5zaWduZWQgbG9uZyBscGFyX3JjOwotCXVuc2lnbmVkIGxvbmcgZHVtbXkxLCBkdW1teTI7CisJdTY0IGR1bW15MSwgZHVtbXkyOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlEQkdfTE9XKCIgICAgaW52YWwgOiBzbG90PSVseCwgdmE9JTAxNmx4LCBwc2l6ZTogJWQsIGxvY2FsOiAlZFxuIiwKQEAgLTMxNSw4ICszMTcsNyBAQAogCQkJCSAgaW50IHBzaXplLCBpbnQgc3NpemUpCiB7CiAJdW5zaWduZWQgbG9uZyBscGFyX3JjOwotCXVuc2lnbmVkIGxvbmcgc2xvdDsKLQl1bnNpZ25lZCBsb25nIGhwdGVfdiwgaHB0ZV9yOworCXU2NCBocHRlX3YsIGhwdGVfciwgc2xvdDsKIAogCS8qIHNhbWUgYXMgaXNlcmllcyAqLwogCWlmICh2ZmxhZ3MgJiBIUFRFX1ZfU0VDT05EQVJZKQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2JlYXRfdWRiZy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2JlYXRfdWRiZy5jCmluZGV4IDZiNDE4ZjYuLjM1MDczNWIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9iZWF0X3VkYmcuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvYmVhdF91ZGJnLmMKQEAgLTQwLDggKzQwLDggQEAKIH0KIAogLyogQnVmZmVyZWQgY2hhcnMgZ2V0YyAqLwotc3RhdGljIGxvbmcgaW5idWZsZW47Ci1zdGF0aWMgbG9uZyBpbmJ1ZlsyXTsJLyogbXVzdCBiZSAyIGxvbmdzICovCitzdGF0aWMgdTY0IGluYnVmbGVuOworc3RhdGljIHU2NCBpbmJ1ZlsyXTsJLyogbXVzdCBiZSAyIHU2NHMgKi8KIAogc3RhdGljIGludCB1ZGJnX2dldGNfcG9sbF9iZWF0KHZvaWQpCiB7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvY2JlX2NwdWZyZXFfcGVydmFzaXZlLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvY2JlX2NwdWZyZXFfcGVydmFzaXZlLmMKaW5kZXggNzBmYTdhZS4uMjA0NzJlNCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2NiZV9jcHVmcmVxX3BlcnZhc2l2ZS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9jYmVfY3B1ZnJlcV9wZXJ2YXNpdmUuYwpAQCAtNTQsNyArNTQsNyBAQAogewogCXN0cnVjdCBjYmVfcG1kX3JlZ3MgX19pb21lbSAqcG1kX3JlZ3M7CiAJc3RydWN0IGNiZV9taWNfdG1fcmVncyBfX2lvbWVtICptaWNfdG1fcmVnczsKLQl1NjQgZmxhZ3M7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1NjQgdmFsdWU7CiAjaWZkZWYgREVCVUcKIAlsb25nIHRpbWU7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvaW50ZXJydXB0LmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvaW50ZXJydXB0LmMKaW5kZXggMmQ1YmIyMi4uMjhjMDRkYSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2ludGVycnVwdC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9pbnRlcnJ1cHQuYwpAQCAtMTQ4LDcgKzE0OCw3IEBACiAKIAlpaWMgPSAmX19nZXRfY3B1X3ZhcihpaWMpOwogCSoodW5zaWduZWQgbG9uZyAqKSAmcGVuZGluZyA9Ci0JCWluX2JlNjQoKHVuc2lnbmVkIGxvbmcgX19pb21lbSAqKSAmaWljLT5yZWdzLT5wZW5kaW5nX2Rlc3RyKTsKKwkJaW5fYmU2NCgodTY0IF9faW9tZW0gKikgJmlpYy0+cmVncy0+cGVuZGluZ19kZXN0cik7CiAJaWYgKCEocGVuZGluZy5mbGFncyAmIENCRV9JSUNfSVJRX1ZBTElEKSkKIAkJcmV0dXJuIE5PX0lSUTsKIAl2aXJxID0gaXJxX2xpbmVhcl9yZXZtYXAoaWljX2hvc3QsIGlpY19wZW5kaW5nX3RvX2h3bnVtKHBlbmRpbmcpKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9pby13b3JrYXJvdW5kcy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2lvLXdvcmthcm91bmRzLmMKaW5kZXggYjVmODRlOC4uMDU5Y2FkNiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2lvLXdvcmthcm91bmRzLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2lvLXdvcmthcm91bmRzLmMKQEAgLTEzMCwxNCArMTMwLDE0IEBACiAKIH07CiAKLXN0YXRpYyB2b2lkIF9faW9tZW0gKmlvd2FfaW9yZW1hcCh1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSwKK3N0YXRpYyB2b2lkIF9faW9tZW0gKmlvd2FfaW9yZW1hcChwaHlzX2FkZHJfdCBhZGRyLCB1bnNpZ25lZCBsb25nIHNpemUsCiAJCQkJCQl1bnNpZ25lZCBsb25nIGZsYWdzKQogewogCXN0cnVjdCBpb3dhX2J1cyAqYnVzOwogCXZvaWQgX19pb21lbSAqcmVzID0gX19pb3JlbWFwKGFkZHIsIHNpemUsIGZsYWdzKTsKIAlpbnQgYnVzbm87CiAKLQlidXMgPSBpb3dhX3BjaV9maW5kKDAsIGFkZHIpOworCWJ1cyA9IGlvd2FfcGNpX2ZpbmQoMCwgKHVuc2lnbmVkIGxvbmcpYWRkcik7CiAJaWYgKGJ1cyAhPSBOVUxMKSB7CiAJCWJ1c25vID0gYnVzIC0gaW93YV9idXNzZXM7CiAJCVBDSV9TRVRfQUREUl9UT0tFTihyZXMsIGJ1c25vICsgMSk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvaW9tbXUuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9pb21tdS5jCmluZGV4IDg2ZGI0ZGQuLjg4ZDk0YjUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9pb21tdS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9pb21tdS5jCkBAIC0xNTAsOCArMTUwLDggQEAKIHN0YXRpYyB2b2lkIGludmFsaWRhdGVfdGNlX2NhY2hlKHN0cnVjdCBjYmVfaW9tbXUgKmlvbW11LCB1bnNpZ25lZCBsb25nICpwdGUsCiAJCWxvbmcgbl9wdGVzKQogewotCXVuc2lnbmVkIGxvbmcgX19pb21lbSAqcmVnOwotCXVuc2lnbmVkIGxvbmcgdmFsOworCXU2NCBfX2lvbWVtICpyZWc7CisJdTY0IHZhbDsKIAlsb25nIG47CiAKIAlyZWcgPSBpb21tdS0+eGxhdGVfcmVncyArIElPQ19JT1BUX0NhY2hlSW52ZDsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9pbm9kZS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL2lub2RlLmMKaW5kZXggNjI5NmJmZC4uZTMwOWVmNyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL2lub2RlLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL2lub2RlLmMKQEAgLTk3LDcgKzk3LDYgQEAKIAlpbm9kZS0+aV9tb2RlID0gbW9kZTsKIAlpbm9kZS0+aV91aWQgPSBjdXJyZW50X2ZzdWlkKCk7CiAJaW5vZGUtPmlfZ2lkID0gY3VycmVudF9mc2dpZCgpOwotCWlub2RlLT5pX2Jsb2NrcyA9IDA7CiAJaW5vZGUtPmlfYXRpbWUgPSBpbm9kZS0+aV9tdGltZSA9IGlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FOwogb3V0OgogCXJldHVybiBpbm9kZTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9zcHVmcy5oIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL3NwdWZzLmgKaW5kZXggMTVjNjJkMy4uM2JmOTA4ZSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL3NwdWZzLmgKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL3NwdWZzLmgKQEAgLTMxNCw3ICszMTQsNyBAQAogICoJd2UgbmVlZCB0byBjYWxsIHNwdV9yZWxlYXNlKGN0eCkgYmVmb3JlIHNsZWVwaW5nLCBhbmQKICAqCXRoZW4gc3B1X2FjcXVpcmUoY3R4KSB3aGVuIGF3b2tlbi4KICAqCi0gKiAJUmV0dXJucyB3aXRoIHN0YXRlX211dGV4IHJlLWFjcXVpcmVkIHdoZW4gc3VjY2Vzc2Z1bGwgb3IKKyAqIAlSZXR1cm5zIHdpdGggc3RhdGVfbXV0ZXggcmUtYWNxdWlyZWQgd2hlbiBzdWNjZXNzZnVsIG9yCiAgKiAJd2l0aCAtRVJFU1RBUlRTWVMgYW5kIHRoZSBzdGF0ZV9tdXRleCBkcm9wcGVkIHdoZW4gaW50ZXJydXB0ZWQuCiAgKi8KIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL0tjb25maWcgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvS2NvbmZpZwppbmRleCBlZDM3NTNkLi43ZGRkMGEyIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvS2NvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvS2NvbmZpZwpAQCAtMTAsMTggKzEwLDIxIEBACiBjb25maWcgVklPREFTRAogCXRyaXN0YXRlICJpU2VyaWVzIFZpcnR1YWwgSS9PIGRpc2sgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIEJMT0NLCisJc2VsZWN0IFZJT1BBVEgKIAloZWxwCiAJICBJZiB5b3UgYXJlIHJ1bm5pbmcgb24gYW4gaVNlcmllcyBzeXN0ZW0gYW5kIHlvdSB3YW50IHRvIHVzZQogCSAgdmlydHVhbCBkaXNrcyBjcmVhdGVkIGFuZCBtYW5hZ2VkIGJ5IE9TLzQwMCwgc2F5IFkuCiAKIGNvbmZpZyBWSU9DRAogCXRyaXN0YXRlICJpU2VyaWVzIFZpcnR1YWwgSS9PIENEIHN1cHBvcnQiCisJc2VsZWN0IFZJT1BBVEgKIAloZWxwCiAJICBJZiB5b3UgYXJlIHJ1bm5pbmcgTGludXggb24gYW4gSUJNIGlTZXJpZXMgc3lzdGVtIGFuZCB5b3Ugd2FudCB0bwogCSAgcmVhZCBhIENEIGRyaXZlIG93bmVkIGJ5IE9TLzQwMCwgc2F5IFkgaGVyZS4KIAogY29uZmlnIFZJT1RBUEUKIAl0cmlzdGF0ZSAiaVNlcmllcyBWaXJ0dWFsIFRhcGUgU3VwcG9ydCIKKwlzZWxlY3QgVklPUEFUSAogCWhlbHAKIAkgIElmIHlvdSBhcmUgcnVubmluZyBMaW51eCBvbiBhbiBpU2VyaWVzIHN5c3RlbSBhbmQgeW91IHdhbnQgTGludXgKIAkgIHRvIHJlYWQgYW5kL29yIHdyaXRlIGEgdGFwZSBkcml2ZSBvd25lZCBieSBPUy80MDAsIHNheSBZIGhlcmUuCkBAIC0zMCw1ICszMywzIEBACiAKIGNvbmZpZyBWSU9QQVRICiAJYm9vbAotCWRlcGVuZHMgb24gVklPREFTRCB8fCBWSU9DRCB8fCBWSU9UQVBFIHx8IElTRVJJRVNfVkVUSAotCWRlZmF1bHQgeQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL3NldHVwLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvc2V0dXAuYwppbmRleCA3MGI2ODhjLi4yNDUxOWI5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvc2V0dXAuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvc2V0dXAuYwpAQCAtMjMsNiArMjMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgva2Rldl90Lmg+CisjaW5jbHVkZSA8bGludXgva2V4ZWMuaD4KICNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgogI2luY2x1ZGUgPGxpbnV4L3Jvb3RfZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CkBAIC02MzgsNiArNjM5LDEzIEBACiAJcmV0dXJuIDE7CiB9CiAKKyNpZmRlZiBDT05GSUdfS0VYRUMKK3N0YXRpYyBpbnQgaXNlcmllc19rZXhlY19wcmVwYXJlKHN0cnVjdCBraW1hZ2UgKmltYWdlKQoreworCXJldHVybiAtRU5PU1lTOworfQorI2VuZGlmCisKIGRlZmluZV9tYWNoaW5lKGlzZXJpZXMpIHsKIAkubmFtZQkJCT0gImlTZXJpZXMiLAogCS5zZXR1cF9hcmNoCQk9IGlTZXJpZXNfc2V0dXBfYXJjaCwKQEAgLTY1OCw2ICs2NjYsOSBAQAogCS5wcm9iZQkJCT0gaXNlcmllc19wcm9iZSwKIAkuaW9yZW1hcAkJPSBpc2VyaWVzX2lvcmVtYXAsCiAJLmlvdW5tYXAJCT0gaXNlcmllc19pb3VubWFwLAorI2lmZGVmIENPTkZJR19LRVhFQworCS5tYWNoaW5lX2tleGVjX3ByZXBhcmUJPSBpc2VyaWVzX2tleGVjX3ByZXBhcmUsCisjZW5kaWYKIAkvKiBYWFggSW1wbGVtZW50IGVuYWJsZV9wbWNzIGZvciBpU2VyaWVzICovCiB9OwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bhc2VtaS9jcHVmcmVxLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bhc2VtaS9jcHVmcmVxLmMKaW5kZXggNTg1NTZiMC4uODZkYjQ3YyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wYXNlbWkvY3B1ZnJlcS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcGFzZW1pL2NwdWZyZXEuYwpAQCAtMTEyLDcgKzExMiw3IEBACiAKIHN0YXRpYyB2b2lkIHNldF9hc3RhdGUoaW50IGNwdSwgdW5zaWduZWQgaW50IGFzdGF0ZSkKIHsKLQl1NjQgZmxhZ3M7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCS8qIFJldHVybiBpZiBjYWxsZWQgYmVmb3JlIGluaXQgaGFzIHJ1biAqLwogCWlmICh1bmxpa2VseSghc2RjYXNyX21hcGJhc2UpKQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wYXNlbWkvZG1hX2xpYi5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wYXNlbWkvZG1hX2xpYi5jCmluZGV4IDIxN2FmMzIuLmE2MTUyZDkgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcGFzZW1pL2RtYV9saWIuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bhc2VtaS9kbWFfbGliLmMKQEAgLTUwOSw3ICs1MDksNyBAQAogICovCiBpbnQgcGFzZW1pX2RtYV9pbml0KHZvaWQpCiB7Ci0Jc3RhdGljIHNwaW5sb2NrX3QgaW5pdF9sb2NrID0gU1BJTl9MT0NLX1VOTE9DS0VEOworCXN0YXRpYyBERUZJTkVfU1BJTkxPQ0soaW5pdF9sb2NrKTsKIAlzdHJ1Y3QgcGNpX2RldiAqaW9iX3BkZXY7CiAJc3RydWN0IHBjaV9kZXYgKnBkZXY7CiAJc3RydWN0IHJlc291cmNlIHJlczsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvcGNpLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL3BjaS5jCmluZGV4IDU0YjdiNzYuLjA0Y2RkMzIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvcGNpLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9wY2kuYwpAQCAtNjYxLDYgKzY2MSw3IEBACiAJCQlwY2lfZmluZF9ob3NlX2Zvcl9PRl9kZXZpY2UobnApOwogCQlpZiAoIWhvc2UpIHsKIAkJCXByaW50ayhLRVJOX0VSUiAiQ2FuJ3QgZmluZCBQQ0kgaG9zZSBmb3IgT0hhcmUyICFcbiIpOworCQkJb2Zfbm9kZV9wdXQobnApOwogCQkJcmV0dXJuOwogCQl9CiAJCWVhcmx5X3JlYWRfY29uZmlnX3dvcmQoaG9zZSwgYnVzLCBkZXZmbiwgUENJX0NPTU1BTkQsICZjbWQpOwpAQCAtNjY5LDYgKzY3MCw3IEBACiAJCWVhcmx5X3dyaXRlX2NvbmZpZ193b3JkKGhvc2UsIGJ1cywgZGV2Zm4sIFBDSV9DT01NQU5ELCBjbWQpOwogCX0KIAloYXNfc2Vjb25kX29oYXJlID0gMTsKKwlvZl9ub2RlX3B1dChucCk7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL3RpbWUuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvdGltZS5jCmluZGV4IDU5ZWI4NDAuLjE4MTBlNDIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvdGltZS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvdGltZS5jCkBAIC0yNjUsMTIgKzI2NSwxNSBAQAogCXN0cnVjdCByZXNvdXJjZSByc3JjOwogCiAJdmlhcyA9IG9mX2ZpbmRfbm9kZV9ieV9uYW1lKE5VTEwsICJ2aWEtY3VkYSIpOwotCWlmICh2aWFzID09IDApCisJaWYgKHZpYXMgPT0gTlVMTCkKIAkJdmlhcyA9IG9mX2ZpbmRfbm9kZV9ieV9uYW1lKE5VTEwsICJ2aWEtcG11Iik7Ci0JaWYgKHZpYXMgPT0gMCkKKwlpZiAodmlhcyA9PSBOVUxMKQogCQl2aWFzID0gb2ZfZmluZF9ub2RlX2J5X25hbWUoTlVMTCwgInZpYSIpOwotCWlmICh2aWFzID09IDAgfHwgb2ZfYWRkcmVzc190b19yZXNvdXJjZSh2aWFzLCAwLCAmcnNyYykpCisJaWYgKHZpYXMgPT0gTlVMTCB8fCBvZl9hZGRyZXNzX3RvX3Jlc291cmNlKHZpYXMsIDAsICZyc3JjKSkgeworCSAgICAgICAgb2Zfbm9kZV9wdXQodmlhcyk7CiAJCXJldHVybiAwOworCX0KKwlvZl9ub2RlX3B1dCh2aWFzKTsKIAl2aWEgPSBpb3JlbWFwKHJzcmMuc3RhcnQsIHJzcmMuZW5kIC0gcnNyYy5zdGFydCArIDEpOwogCWlmICh2aWEgPT0gTlVMTCkgewogCQlwcmludGsoS0VSTl9FUlIgIkZhaWxlZCB0byBtYXAgVklBIGZvciB0aW1lciBjYWxpYnJhdGlvbiAhXG4iKTsKQEAgLTI5Nyw3ICszMDAsNyBAQAogCXBwY190Yl9mcmVxID0gKGRzdGFydCAtIGRlbmQpICogMTAwIC8gNjsKIAogCWlvdW5tYXAodmlhKTsKLQkKKwogCXJldHVybiAxOwogfQogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9kZXZpY2UtaW5pdC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvZGV2aWNlLWluaXQuYwppbmRleCBkYmMxMjRlLi5jYTcxYTEyIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9kZXZpY2UtaW5pdC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL2RldmljZS1pbml0LmMKQEAgLTUxOCw2ICs1MTgsNDEgQEAKIAlyZXR1cm4gcmVzdWx0OwogfQogCitzdGF0aWMgaW50IF9faW5pdCBwczNfcmVnaXN0ZXJfcmFtZGlza19kZXZpY2Uodm9pZCkKK3sKKwlpbnQgcmVzdWx0OworCXN0cnVjdCBsYXlvdXQgeworCQlzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlIGRldjsKKwl9ICpwOworCisJcHJfZGVidWcoIiAtPiAlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKworCXAgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbGF5b3V0KSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIXApCisJCXJldHVybiAtRU5PTUVNOworCisJcC0+ZGV2Lm1hdGNoX2lkID0gUFMzX01BVENIX0lEX0dQVTsKKwlwLT5kZXYubWF0Y2hfc3ViX2lkID0gUFMzX01BVENIX1NVQl9JRF9HUFVfUkFNRElTSzsKKwlwLT5kZXYuZGV2X3R5cGUgPSBQUzNfREVWSUNFX1RZUEVfSU9DMDsKKworCXJlc3VsdCA9IHBzM19zeXN0ZW1fYnVzX2RldmljZV9yZWdpc3RlcigmcC0+ZGV2KTsKKworCWlmIChyZXN1bHQpIHsKKwkJcHJfZGVidWcoIiVzOiVkIHBzM19zeXN0ZW1fYnVzX2RldmljZV9yZWdpc3RlciBmYWlsZWRcbiIsCisJCQlfX2Z1bmNfXywgX19MSU5FX18pOworCQlnb3RvIGZhaWxfZGV2aWNlX3JlZ2lzdGVyOworCX0KKworCXByX2RlYnVnKCIgPC0gJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisJcmV0dXJuIDA7CisKK2ZhaWxfZGV2aWNlX3JlZ2lzdGVyOgorCWtmcmVlKHApOworCXByX2RlYnVnKCIgPC0gJXM6JWQgZmFpbGVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCXJldHVybiByZXN1bHQ7Cit9CisKIC8qKgogICogcHMzX3NldHVwX2R5bmFtaWNfZGV2aWNlIC0gU2V0dXAgYSBkeW5hbWljIGRldmljZSBmcm9tIHRoZSByZXBvc2l0b3J5CiAgKi8KQEAgLTk0Niw2ICs5ODEsOCBAQAogCiAJcHMzX3JlZ2lzdGVyX2xwbV9kZXZpY2VzKCk7CiAKKwlwczNfcmVnaXN0ZXJfcmFtZGlza19kZXZpY2UoKTsKKwogCXByX2RlYnVnKCIgPC0gJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L01ha2VmaWxlIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9NYWtlZmlsZQppbmRleCA1YWZjZTExLi5iMzNiMjhhIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvc3lzZGV2L01ha2VmaWxlCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvTWFrZWZpbGUKQEAgLTE3LDYgKzE3LDcgQEAKIG9iai0kKENPTkZJR19GU0xfTEJDKQkJKz0gZnNsX2xiYy5vCiBvYmotJChDT05GSUdfRlNMX0dUTSkJCSs9IGZzbF9ndG0ubwogb2JqLSQoQ09ORklHX01QQzh4eHhfR1BJTykJKz0gbXBjOHh4eF9ncGlvLm8KK29iai0kKENPTkZJR19TSU1QTEVfR1BJTykJKz0gc2ltcGxlX2dwaW8ubwogb2JqLSQoQ09ORklHX1JBUElESU8pCQkrPSBmc2xfcmlvLm8KIG9iai0kKENPTkZJR19UU0kxMDhfQlJJREdFKQkrPSB0c2kxMDhfcGNpLm8gdHNpMTA4X2Rldi5vCiBvYmotJChDT05GSUdfUVVJQ0NfRU5HSU5FKQkrPSBxZV9saWIvCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9wY2kuYyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvZnNsX3BjaS5jCmluZGV4IGQ1ZjlhZTAuLmY2MTFkMDMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvZnNsX3BjaS5jCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvZnNsX3BjaS5jCkBAIC0yOSw3ICsyOSw4IEBACiAKICNpZiBkZWZpbmVkKENPTkZJR19QUENfODV4eCkgfHwgZGVmaW5lZChDT05GSUdfUFBDXzg2eHgpCiAvKiBhdG11IHNldHVwIGZvciBmc2wgcGNpL3BjaWUgY29udHJvbGxlciAqLwotdm9pZCBfX2luaXQgc2V0dXBfcGNpX2F0bXUoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlLCBzdHJ1Y3QgcmVzb3VyY2UgKnJzcmMpCitzdGF0aWMgdm9pZCBfX2luaXQgc2V0dXBfcGNpX2F0bXUoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlLAorCQkJCSAgc3RydWN0IHJlc291cmNlICpyc3JjKQogewogCXN0cnVjdCBjY3NyX3BjaSBfX2lvbWVtICpwY2k7CiAJaW50IGk7CkBAIC04Niw3ICs4Nyw3IEBACiAJb3V0X2JlMzIoJnBjaS0+cGl3WzJdLnBpd2FyLCBQSVdBUl8yRyk7CiB9CiAKLXZvaWQgX19pbml0IHNldHVwX3BjaV9jbWQoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlKQorc3RhdGljIHZvaWQgX19pbml0IHNldHVwX3BjaV9jbWQoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlKQogewogCXUxNiBjbWQ7CiAJaW50IGNhcF94OwpAQCAtMTMwLDcgKzEzMSw3IEBACiAJcmV0dXJuIDsKIH0KIAotaW50IF9faW5pdCBmc2xfcGNpZV9jaGVja19saW5rKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSkKK3N0YXRpYyBpbnQgX19pbml0IGZzbF9wY2llX2NoZWNrX2xpbmsoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlKQogewogCXUzMiB2YWw7CiAJZWFybHlfcmVhZF9jb25maWdfZHdvcmQoaG9zZSwgMCwgMCwgUENJRV9MVFNTTSwgJnZhbCk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9zb2MuaCBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvZnNsX3NvYy5oCmluZGV4IDYwZjdmMjIuLjljNzQ0ZTQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvZnNsX3NvYy5oCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvZnNsX3NvYy5oCkBAIC01LDggKzUsMTMgQEAKICNpbmNsdWRlIDxhc20vbW11Lmg+CiAKIGV4dGVybiBwaHlzX2FkZHJfdCBnZXRfaW1tcmJhc2Uodm9pZCk7CisjaWYgZGVmaW5lZChDT05GSUdfQ1BNMikgfHwgZGVmaW5lZChDT05GSUdfUVVJQ0NfRU5HSU5FKSB8fCBkZWZpbmVkKENPTkZJR184eHgpCiBleHRlcm4gdTMyIGdldF9icmdmcmVxKHZvaWQpOwogZXh0ZXJuIHUzMiBnZXRfYmF1ZHJhdGUodm9pZCk7CisjZWxzZQorc3RhdGljIGlubGluZSB1MzIgZ2V0X2JyZ2ZyZXEodm9pZCkgeyByZXR1cm4gLTE7IH0KK3N0YXRpYyBpbmxpbmUgdTMyIGdldF9iYXVkcmF0ZSh2b2lkKSB7IHJldHVybiAtMTsgfQorI2VuZGlmCiBleHRlcm4gdTMyIGZzbF9nZXRfc3lzX2ZyZXEodm9pZCk7CiAKIHN0cnVjdCBzcGlfYm9hcmRfaW5mbzsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvcWVfbGliL0tjb25maWcgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L3FlX2xpYi9LY29uZmlnCmluZGV4IDc2ZmZiYzQuLjQxYWMzZGYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvcWVfbGliL0tjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9xZV9saWIvS2NvbmZpZwpAQCAtMjIsNSArMjIsNiBAQAogCiBjb25maWcgUUVfVVNCCiAJYm9vbAorCWRlZmF1bHQgeSBpZiBVU0JfR0FER0VUX0ZTTF9RRQogCWhlbHAKLQkgIFFFIFVTQiBIb3N0IENvbnRyb2xsZXIgc3VwcG9ydAorCSAgUUUgVVNCIENvbnRyb2xsZXIgc3VwcG9ydApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9xZV9saWIvZ3Bpby5jIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9xZV9saWIvZ3Bpby5jCmluZGV4IDhlNWEwYmMuLjM0ODUyODggMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvcWVfbGliL2dwaW8uYworKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L3FlX2xpYi9ncGlvLmMKQEAgLTE0LDYgKzE0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L29mLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfZ3Bpby5oPgpAQCAtMjQsOCArMjUsMTQgQEAKIAlzdHJ1Y3Qgb2ZfbW1fZ3Bpb19jaGlwIG1tX2djOwogCXNwaW5sb2NrX3QgbG9jazsKIAorCXVuc2lnbmVkIGxvbmcgcGluX2ZsYWdzW1FFX1BJT19QSU5TXTsKKyNkZWZpbmUgUUVfUElOX1JFUVVFU1RFRCAwCisKIAkvKiBzaGFkb3dlZCBkYXRhIHJlZ2lzdGVyIHRvIGNsZWFyL3NldCBiaXRzIHNhZmVseSAqLwogCXUzMiBjcGRhdGE7CisKKwkvKiBzYXZlZF9yZWdzIHVzZWQgdG8gcmVzdG9yZSBkZWRpY2F0ZWQgZnVuY3Rpb25zICovCisJc3RydWN0IHFlX3Bpb19yZWdzIHNhdmVkX3JlZ3M7CiB9OwogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBxZV9ncGlvX2NoaXAgKgpAQCAtNDAsNiArNDcsMTIgQEAKIAlzdHJ1Y3QgcWVfcGlvX3JlZ3MgX19pb21lbSAqcmVncyA9IG1tX2djLT5yZWdzOwogCiAJcWVfZ2MtPmNwZGF0YSA9IGluX2JlMzIoJnJlZ3MtPmNwZGF0YSk7CisJcWVfZ2MtPnNhdmVkX3JlZ3MuY3BkYXRhID0gcWVfZ2MtPmNwZGF0YTsKKwlxZV9nYy0+c2F2ZWRfcmVncy5jcGRpcjEgPSBpbl9iZTMyKCZyZWdzLT5jcGRpcjEpOworCXFlX2djLT5zYXZlZF9yZWdzLmNwZGlyMiA9IGluX2JlMzIoJnJlZ3MtPmNwZGlyMik7CisJcWVfZ2MtPnNhdmVkX3JlZ3MuY3BwYXIxID0gaW5fYmUzMigmcmVncy0+Y3BwYXIxKTsKKwlxZV9nYy0+c2F2ZWRfcmVncy5jcHBhcjIgPSBpbl9iZTMyKCZyZWdzLT5jcHBhcjIpOworCXFlX2djLT5zYXZlZF9yZWdzLmNwb2RyID0gaW5fYmUzMigmcmVncy0+Y3BvZHIpOwogfQogCiBzdGF0aWMgaW50IHFlX2dwaW9fZ2V0KHN0cnVjdCBncGlvX2NoaXAgKmdjLCB1bnNpZ25lZCBpbnQgZ3BpbykKQEAgLTEwMyw2ICsxMTYsMTg4IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0cnVjdCBxZV9waW4geworCS8qCisJICogVGhlIHFlX2dwaW9fY2hpcCBuYW1lIGlzIHVuZm9ydHVuYXRlLCB3ZSBzaG91bGQgY2hhbmdlIHRoYXQgdG8KKwkgKiBzb21ldGhpbmcgbGlrZSBxZV9waW9fY29udHJvbGxlci4gU29tZWRheS4KKwkgKi8KKwlzdHJ1Y3QgcWVfZ3Bpb19jaGlwICpjb250cm9sbGVyOworCWludCBudW07Cit9OworCisvKioKKyAqIHFlX3Bpbl9yZXF1ZXN0IC0gUmVxdWVzdCBhIFFFIHBpbgorICogQG5wOgkJZGV2aWNlIG5vZGUgdG8gZ2V0IGEgcGluIGZyb20KKyAqIEBpbmRleDoJaW5kZXggb2YgYSBwaW4gaW4gdGhlIGRldmljZSB0cmVlCisgKiBDb250ZXh0Oglub24tYXRvbWljCisgKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm4gcWVfcGluIHNvIHRoYXQgeW91IGNvdWxkIHVzZSBpdCB3aXRoIHRoZSByZXN0IG9mCisgKiB0aGUgUUUgUGluIE11bHRpcGxleGluZyBBUEkuCisgKi8KK3N0cnVjdCBxZV9waW4gKnFlX3Bpbl9yZXF1ZXN0KHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsIGludCBpbmRleCkKK3sKKwlzdHJ1Y3QgcWVfcGluICpxZV9waW47CisJc3RydWN0IGRldmljZV9ub2RlICpnYzsKKwlzdHJ1Y3Qgb2ZfZ3Bpb19jaGlwICpvZl9nYyA9IE5VTEw7CisJc3RydWN0IG9mX21tX2dwaW9fY2hpcCAqbW1fZ2M7CisJc3RydWN0IHFlX2dwaW9fY2hpcCAqcWVfZ2M7CisJaW50IGVycjsKKwlpbnQgc2l6ZTsKKwljb25zdCB2b2lkICpncGlvX3NwZWM7CisJY29uc3QgdTMyICpncGlvX2NlbGxzOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlxZV9waW4gPSBremFsbG9jKHNpemVvZigqcWVfcGluKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFxZV9waW4pIHsKKwkJcHJfZGVidWcoIiVzOiBjYW4ndCBhbGxvY2F0ZSBtZW1vcnlcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisJfQorCisJZXJyID0gb2ZfcGFyc2VfcGhhbmRsZXNfd2l0aF9hcmdzKG5wLCAiZ3Bpb3MiLCAiI2dwaW8tY2VsbHMiLCBpbmRleCwKKwkJCQkJICAmZ2MsICZncGlvX3NwZWMpOworCWlmIChlcnIpIHsKKwkJcHJfZGVidWcoIiVzOiBjYW4ndCBwYXJzZSBncGlvcyBwcm9wZXJ0eVxuIiwgX19mdW5jX18pOworCQlnb3RvIGVycjA7CisJfQorCisJaWYgKCFvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShnYywgImZzbCxtcGM4MzIzLXFlLXBhcmlvLWJhbmsiKSkgeworCQlwcl9kZWJ1ZygiJXM6IHRyaWVkIHRvIGdldCBhIG5vbi1xZSBwaW5cbiIsIF9fZnVuY19fKTsKKwkJZXJyID0gLUVJTlZBTDsKKwkJZ290byBlcnIxOworCX0KKworCW9mX2djID0gZ2MtPmRhdGE7CisJaWYgKCFvZl9nYykgeworCQlwcl9kZWJ1ZygiJXM6IGdwaW8gY29udHJvbGxlciAlcyBpc24ndCByZWdpc3RlcmVkXG4iLAorCQkJIG5wLT5mdWxsX25hbWUsIGdjLT5mdWxsX25hbWUpOworCQllcnIgPSAtRU5PREVWOworCQlnb3RvIGVycjE7CisJfQorCisJZ3Bpb19jZWxscyA9IG9mX2dldF9wcm9wZXJ0eShnYywgIiNncGlvLWNlbGxzIiwgJnNpemUpOworCWlmICghZ3Bpb19jZWxscyB8fCBzaXplICE9IHNpemVvZigqZ3Bpb19jZWxscykgfHwKKwkJCSpncGlvX2NlbGxzICE9IG9mX2djLT5ncGlvX2NlbGxzKSB7CisJCXByX2RlYnVnKCIlczogd3JvbmcgI2dwaW8tY2VsbHMgZm9yICVzXG4iLAorCQkJIG5wLT5mdWxsX25hbWUsIGdjLT5mdWxsX25hbWUpOworCQllcnIgPSAtRUlOVkFMOworCQlnb3RvIGVycjE7CisJfQorCisJZXJyID0gb2ZfZ2MtPnhsYXRlKG9mX2djLCBucCwgZ3Bpb19zcGVjLCBOVUxMKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBlcnIxOworCisJbW1fZ2MgPSB0b19vZl9tbV9ncGlvX2NoaXAoJm9mX2djLT5nYyk7CisJcWVfZ2MgPSB0b19xZV9ncGlvX2NoaXAobW1fZ2MpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnFlX2djLT5sb2NrLCBmbGFncyk7CisKKwlpZiAodGVzdF9hbmRfc2V0X2JpdChRRV9QSU5fUkVRVUVTVEVELCAmcWVfZ2MtPnBpbl9mbGFnc1tlcnJdKSA9PSAwKSB7CisJCXFlX3Bpbi0+Y29udHJvbGxlciA9IHFlX2djOworCQlxZV9waW4tPm51bSA9IGVycjsKKwkJZXJyID0gMDsKKwl9IGVsc2UgeworCQllcnIgPSAtRUJVU1k7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcWVfZ2MtPmxvY2ssIGZsYWdzKTsKKworCWlmICghZXJyKQorCQlyZXR1cm4gcWVfcGluOworZXJyMToKKwlvZl9ub2RlX3B1dChnYyk7CitlcnIwOgorCWtmcmVlKHFlX3Bpbik7CisJcHJfZGVidWcoIiVzIGZhaWxlZCB3aXRoIHN0YXR1cyAlZFxuIiwgX19mdW5jX18sIGVycik7CisJcmV0dXJuIEVSUl9QVFIoZXJyKTsKK30KK0VYUE9SVF9TWU1CT0wocWVfcGluX3JlcXVlc3QpOworCisvKioKKyAqIHFlX3Bpbl9mcmVlIC0gRnJlZSBhIHBpbgorICogQHFlX3BpbjoJcG9pbnRlciB0byB0aGUgcWVfcGluIHN0cnVjdHVyZQorICogQ29udGV4dDoJYW55CisgKgorICogVGhpcyBmdW5jdGlvbiBmcmVlcyB0aGUgcWVfcGluIHN0cnVjdHVyZSBhbmQgbWFrZXMgYSBwaW4gYXZhaWxhYmxlCisgKiBmb3IgZnVydGhlciBxZV9waW5fcmVxdWVzdCgpIGNhbGxzLgorICovCit2b2lkIHFlX3Bpbl9mcmVlKHN0cnVjdCBxZV9waW4gKnFlX3BpbikKK3sKKwlzdHJ1Y3QgcWVfZ3Bpb19jaGlwICpxZV9nYyA9IHFlX3Bpbi0+Y29udHJvbGxlcjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWNvbnN0IGludCBwaW4gPSBxZV9waW4tPm51bTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZxZV9nYy0+bG9jaywgZmxhZ3MpOworCXRlc3RfYW5kX2NsZWFyX2JpdChRRV9QSU5fUkVRVUVTVEVELCAmcWVfZ2MtPnBpbl9mbGFnc1twaW5dKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZxZV9nYy0+bG9jaywgZmxhZ3MpOworCisJa2ZyZWUocWVfcGluKTsKK30KK0VYUE9SVF9TWU1CT0wocWVfcGluX2ZyZWUpOworCisvKioKKyAqIHFlX3Bpbl9zZXRfZGVkaWNhdGVkIC0gUmV2ZXJ0IGEgcGluIHRvIGEgZGVkaWNhdGVkIHBlcmlwaGVyYWwgZnVuY3Rpb24gbW9kZQorICogQHFlX3BpbjoJcG9pbnRlciB0byB0aGUgcWVfcGluIHN0cnVjdHVyZQorICogQ29udGV4dDoJYW55CisgKgorICogVGhpcyBmdW5jdGlvbiByZXNldHMgYSBwaW4gdG8gYSBkZWRpY2F0ZWQgcGVyaXBoZXJhbCBmdW5jdGlvbiB0aGF0CisgKiBoYXMgYmVlbiBzZXQgdXAgYnkgdGhlIGZpcm13YXJlLgorICovCit2b2lkIHFlX3Bpbl9zZXRfZGVkaWNhdGVkKHN0cnVjdCBxZV9waW4gKnFlX3BpbikKK3sKKwlzdHJ1Y3QgcWVfZ3Bpb19jaGlwICpxZV9nYyA9IHFlX3Bpbi0+Y29udHJvbGxlcjsKKwlzdHJ1Y3QgcWVfcGlvX3JlZ3MgX19pb21lbSAqcmVncyA9IHFlX2djLT5tbV9nYy5yZWdzOworCXN0cnVjdCBxZV9waW9fcmVncyAqc3JlZ3MgPSAmcWVfZ2MtPnNhdmVkX3JlZ3M7CisJaW50IHBpbiA9IHFlX3Bpbi0+bnVtOworCXUzMiBtYXNrMSA9IDEgPDwgKFFFX1BJT19QSU5TIC0gKHBpbiArIDEpKTsKKwl1MzIgbWFzazIgPSAweDMgPDwgKFFFX1BJT19QSU5TIC0gKHBpbiAlIChRRV9QSU9fUElOUyAvIDIpICsgMSkgKiAyKTsKKwlib29sIHNlY29uZF9yZWcgPSBwaW4gPiAoUUVfUElPX1BJTlMgLyAyKSAtIDE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZxZV9nYy0+bG9jaywgZmxhZ3MpOworCisJaWYgKHNlY29uZF9yZWcpIHsKKwkJY2xyc2V0Yml0c19iZTMyKCZyZWdzLT5jcGRpcjIsIG1hc2syLCBzcmVncy0+Y3BkaXIyICYgbWFzazIpOworCQljbHJzZXRiaXRzX2JlMzIoJnJlZ3MtPmNwcGFyMiwgbWFzazIsIHNyZWdzLT5jcHBhcjIgJiBtYXNrMik7CisJfSBlbHNlIHsKKwkJY2xyc2V0Yml0c19iZTMyKCZyZWdzLT5jcGRpcjEsIG1hc2syLCBzcmVncy0+Y3BkaXIxICYgbWFzazIpOworCQljbHJzZXRiaXRzX2JlMzIoJnJlZ3MtPmNwcGFyMSwgbWFzazIsIHNyZWdzLT5jcHBhcjEgJiBtYXNrMik7CisJfQorCisJaWYgKHNyZWdzLT5jcGRhdGEgJiBtYXNrMSkKKwkJcWVfZ2MtPmNwZGF0YSB8PSBtYXNrMTsKKwllbHNlCisJCXFlX2djLT5jcGRhdGEgJj0gfm1hc2sxOworCisJb3V0X2JlMzIoJnJlZ3MtPmNwZGF0YSwgcWVfZ2MtPmNwZGF0YSk7CisJY2xyc2V0Yml0c19iZTMyKCZyZWdzLT5jcG9kciwgbWFzazEsIHNyZWdzLT5jcG9kciAmIG1hc2sxKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnFlX2djLT5sb2NrLCBmbGFncyk7Cit9CitFWFBPUlRfU1lNQk9MKHFlX3Bpbl9zZXRfZGVkaWNhdGVkKTsKKworLyoqCisgKiBxZV9waW5fc2V0X2dwaW8gLSBTZXQgYSBwaW4gdG8gdGhlIEdQSU8gbW9kZQorICogQHFlX3BpbjoJcG9pbnRlciB0byB0aGUgcWVfcGluIHN0cnVjdHVyZQorICogQ29udGV4dDoJYW55CisgKgorICogVGhpcyBmdW5jdGlvbiBzZXRzIGEgcGluIHRvIHRoZSBHUElPIG1vZGUuCisgKi8KK3ZvaWQgcWVfcGluX3NldF9ncGlvKHN0cnVjdCBxZV9waW4gKnFlX3BpbikKK3sKKwlzdHJ1Y3QgcWVfZ3Bpb19jaGlwICpxZV9nYyA9IHFlX3Bpbi0+Y29udHJvbGxlcjsKKwlzdHJ1Y3QgcWVfcGlvX3JlZ3MgX19pb21lbSAqcmVncyA9IHFlX2djLT5tbV9nYy5yZWdzOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcWVfZ2MtPmxvY2ssIGZsYWdzKTsKKworCS8qIExldCdzIG1ha2UgaXQgaW5wdXQgYnkgZGVmYXVsdCwgR1BJTyBBUEkgaXMgYWJsZSB0byBjaGFuZ2UgdGhhdC4gKi8KKwlfX3Bhcl9pb19jb25maWdfcGluKHJlZ3MsIHFlX3Bpbi0+bnVtLCBRRV9QSU9fRElSX0lOLCAwLCAwLCAwKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnFlX2djLT5sb2NrLCBmbGFncyk7Cit9CitFWFBPUlRfU1lNQk9MKHFlX3Bpbl9zZXRfZ3Bpbyk7CisKIHN0YXRpYyBpbnQgX19pbml0IHFlX2FkZF9ncGlvY2hpcHModm9pZCkKIHsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9zaW1wbGVfZ3Bpby5jIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9zaW1wbGVfZ3Bpby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzYzQ1NjkKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L3NpbXBsZV9ncGlvLmMKQEAgLTAsMCArMSwxNTUgQEAKKy8qCisgKiBTaW1wbGUgTWVtb3J5LU1hcHBlZCBHUElPcworICoKKyAqIENvcHlyaWdodCAoYykgTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLiAyMDA4LgorICoKKyAqIEF1dGhvcjogQW50b24gVm9yb250c292IDxhdm9yb250c292QHJ1Lm12aXN0YS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxhc20vcHJvbS5oPgorI2luY2x1ZGUgInNpbXBsZV9ncGlvLmgiCisKK3N0cnVjdCB1OF9ncGlvX2NoaXAgeworCXN0cnVjdCBvZl9tbV9ncGlvX2NoaXAgbW1fZ2M7CisJc3BpbmxvY2tfdCBsb2NrOworCisJLyogc2hhZG93ZWQgZGF0YSByZWdpc3RlciB0byBjbGVhci9zZXQgYml0cyBzYWZlbHkgKi8KKwl1OCBkYXRhOworfTsKKworc3RhdGljIHN0cnVjdCB1OF9ncGlvX2NoaXAgKnRvX3U4X2dwaW9fY2hpcChzdHJ1Y3Qgb2ZfbW1fZ3Bpb19jaGlwICptbV9nYykKK3sKKwlyZXR1cm4gY29udGFpbmVyX29mKG1tX2djLCBzdHJ1Y3QgdThfZ3Bpb19jaGlwLCBtbV9nYyk7Cit9CisKK3N0YXRpYyB1OCB1OF9waW4ybWFzayh1bnNpZ25lZCBpbnQgcGluKQoreworCXJldHVybiAxIDw8ICg4IC0gMSAtIHBpbik7Cit9CisKK3N0YXRpYyBpbnQgdThfZ3Bpb19nZXQoc3RydWN0IGdwaW9fY2hpcCAqZ2MsIHVuc2lnbmVkIGludCBncGlvKQoreworCXN0cnVjdCBvZl9tbV9ncGlvX2NoaXAgKm1tX2djID0gdG9fb2ZfbW1fZ3Bpb19jaGlwKGdjKTsKKworCXJldHVybiBpbl84KG1tX2djLT5yZWdzKSAmIHU4X3BpbjJtYXNrKGdwaW8pOworfQorCitzdGF0aWMgdm9pZCB1OF9ncGlvX3NldChzdHJ1Y3QgZ3Bpb19jaGlwICpnYywgdW5zaWduZWQgaW50IGdwaW8sIGludCB2YWwpCit7CisJc3RydWN0IG9mX21tX2dwaW9fY2hpcCAqbW1fZ2MgPSB0b19vZl9tbV9ncGlvX2NoaXAoZ2MpOworCXN0cnVjdCB1OF9ncGlvX2NoaXAgKnU4X2djID0gdG9fdThfZ3Bpb19jaGlwKG1tX2djKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnU4X2djLT5sb2NrLCBmbGFncyk7CisKKwlpZiAodmFsKQorCQl1OF9nYy0+ZGF0YSB8PSB1OF9waW4ybWFzayhncGlvKTsKKwllbHNlCisJCXU4X2djLT5kYXRhICY9IH51OF9waW4ybWFzayhncGlvKTsKKworCW91dF84KG1tX2djLT5yZWdzLCB1OF9nYy0+ZGF0YSk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ1OF9nYy0+bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgaW50IHU4X2dwaW9fZGlyX2luKHN0cnVjdCBncGlvX2NoaXAgKmdjLCB1bnNpZ25lZCBpbnQgZ3BpbykKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB1OF9ncGlvX2Rpcl9vdXQoc3RydWN0IGdwaW9fY2hpcCAqZ2MsIHVuc2lnbmVkIGludCBncGlvLCBpbnQgdmFsKQoreworCXU4X2dwaW9fc2V0KGdjLCBncGlvLCB2YWwpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB1OF9ncGlvX3NhdmVfcmVncyhzdHJ1Y3Qgb2ZfbW1fZ3Bpb19jaGlwICptbV9nYykKK3sKKwlzdHJ1Y3QgdThfZ3Bpb19jaGlwICp1OF9nYyA9IHRvX3U4X2dwaW9fY2hpcChtbV9nYyk7CisKKwl1OF9nYy0+ZGF0YSA9IGluXzgobW1fZ2MtPnJlZ3MpOworfQorCitzdGF0aWMgaW50IF9faW5pdCB1OF9zaW1wbGVfZ3Bpb2NoaXBfYWRkKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgdThfZ3Bpb19jaGlwICp1OF9nYzsKKwlzdHJ1Y3Qgb2ZfbW1fZ3Bpb19jaGlwICptbV9nYzsKKwlzdHJ1Y3Qgb2ZfZ3Bpb19jaGlwICpvZl9nYzsKKwlzdHJ1Y3QgZ3Bpb19jaGlwICpnYzsKKworCXU4X2djID0ga3phbGxvYyhzaXplb2YoKnU4X2djKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCF1OF9nYykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlzcGluX2xvY2tfaW5pdCgmdThfZ2MtPmxvY2spOworCisJbW1fZ2MgPSAmdThfZ2MtPm1tX2djOworCW9mX2djID0gJm1tX2djLT5vZl9nYzsKKwlnYyA9ICZvZl9nYy0+Z2M7CisKKwltbV9nYy0+c2F2ZV9yZWdzID0gdThfZ3Bpb19zYXZlX3JlZ3M7CisJb2ZfZ2MtPmdwaW9fY2VsbHMgPSAyOworCWdjLT5uZ3BpbyA9IDg7CisJZ2MtPmRpcmVjdGlvbl9pbnB1dCA9IHU4X2dwaW9fZGlyX2luOworCWdjLT5kaXJlY3Rpb25fb3V0cHV0ID0gdThfZ3Bpb19kaXJfb3V0OworCWdjLT5nZXQgPSB1OF9ncGlvX2dldDsKKwlnYy0+c2V0ID0gdThfZ3Bpb19zZXQ7CisKKwlyZXQgPSBvZl9tbV9ncGlvY2hpcF9hZGQobnAsIG1tX2djKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycjsKKwlyZXR1cm4gMDsKK2VycjoKKwlrZnJlZSh1OF9nYyk7CisJcmV0dXJuIHJldDsKK30KKwordm9pZCBfX2luaXQgc2ltcGxlX2dwaW9jaGlwX2luaXQoY29uc3QgY2hhciAqY29tcGF0aWJsZSkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOworCisJZm9yX2VhY2hfY29tcGF0aWJsZV9ub2RlKG5wLCBOVUxMLCBjb21wYXRpYmxlKSB7CisJCWludCByZXQ7CisJCXN0cnVjdCByZXNvdXJjZSByOworCisJCXJldCA9IG9mX2FkZHJlc3NfdG9fcmVzb3VyY2UobnAsIDAsICZyKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyOworCisJCXN3aXRjaCAocmVzb3VyY2Vfc2l6ZSgmcikpIHsKKwkJY2FzZSAxOgorCQkJcmV0ID0gdThfc2ltcGxlX2dwaW9jaGlwX2FkZChucCk7CisJCQlpZiAocmV0KQorCQkJCWdvdG8gZXJyOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQkvKgorCQkJICogV2hlbmV2ZXIgeW91IG5lZWQgc3VwcG9ydCBmb3IgR1BJTyBiYW5rIHdpZHRoID4gMSwKKwkJCSAqIHBsZWFzZSBqdXN0IHR1cm4gdThfIGNvZGUgaW50byBodWdlIG1hY3JvcywgYW5kCisJCQkgKiBjb25zdHJ1Y3QgbmVlZGVkIHVYXyBjb2RlIHdpdGggaXQuCisJCQkgKi8KKwkJCXJldCA9IC1FTk9TWVM7CisJCQlnb3RvIGVycjsKKwkJfQorCQljb250aW51ZTsKK2VycjoKKwkJcHJfZXJyKCIlczogcmVnaXN0cmF0aW9uIGZhaWxlZCwgc3RhdHVzICVkXG4iLAorCQkgICAgICAgbnAtPmZ1bGxfbmFtZSwgcmV0KTsKKwl9Cit9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L3NpbXBsZV9ncGlvLmggYi9hcmNoL3Bvd2VycGMvc3lzZGV2L3NpbXBsZV9ncGlvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2E3YjBjNQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvc2ltcGxlX2dwaW8uaApAQCAtMCwwICsxLDEyIEBACisjaWZuZGVmIF9fU1lTREVWX1NJTVBMRV9HUElPX0gKKyNkZWZpbmUgX19TWVNERVZfU0lNUExFX0dQSU9fSAorCisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKworI2lmZGVmIENPTkZJR19TSU1QTEVfR1BJTworZXh0ZXJuIHZvaWQgc2ltcGxlX2dwaW9jaGlwX2luaXQoY29uc3QgY2hhciAqY29tcGF0aWJsZSk7CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIHNpbXBsZV9ncGlvY2hpcF9pbml0KGNvbnN0IGNoYXIgKmNvbXBhdGlibGUpIHt9CisjZW5kaWYgLyogQ09ORklHX1NJTVBMRV9HUElPICovCisKKyNlbmRpZiAvKiBfX1NZU0RFVl9TSU1QTEVfR1BJT19IICovCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvS2NvbmZpZyBiL2FyY2gvczM5MC9LY29uZmlnCmluZGV4IDE5NTc3YWUuLmE5NGEzYzMgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9LY29uZmlnCisrKyBiL2FyY2gvczM5MC9LY29uZmlnCkBAIC0yOTksNyArMjk5LDcgQEAKIAkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgdGhlIGNvbXBpbGVyIG9wdGlvbnMgLW13YXJuLWZyYW1lc2l6ZSBhbmQKIAkgIC1td2Fybi1keW5hbWljc3RhY2suIElmIHRoZSBjb21waWxlciBzdXBwb3J0cyB0aGVzZSBvcHRpb25zIGl0CiAJICB3aWxsIGdlbmVyYXRlIHdhcm5pbmdzIGZvciBmdW5jdGlvbiB3aGljaCBlaXRoZXIgdXNlIGFsbG9jYSBvcgotCSAgY3JlYXRlIGEgc3RhY2sgZnJhbWUgYmlnZ2VyIHRoZW4gQ09ORklHX1dBUk5fU1RBQ0tfU0laRS4KKwkgIGNyZWF0ZSBhIHN0YWNrIGZyYW1lIGJpZ2dlciB0aGFuIENPTkZJR19XQVJOX1NUQUNLX1NJWkUuCiAKIAkgIFNheSBOIGlmIHlvdSBhcmUgdW5zdXJlLgogCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvaHlwZnMvaW5vZGUuYyBiL2FyY2gvczM5MC9oeXBmcy9pbm9kZS5jCmluZGV4IDlkNGY4ZTYuLjVhODA1ZGYgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9oeXBmcy9pbm9kZS5jCisrKyBiL2FyY2gvczM5MC9oeXBmcy9pbm9kZS5jCkBAIC0xMDYsNyArMTA2LDYgQEAKIAkJcmV0LT5pX21vZGUgPSBtb2RlOwogCQlyZXQtPmlfdWlkID0gaHlwZnNfaW5mby0+dWlkOwogCQlyZXQtPmlfZ2lkID0gaHlwZnNfaW5mby0+Z2lkOwotCQlyZXQtPmlfYmxvY2tzID0gMDsKIAkJcmV0LT5pX2F0aW1lID0gcmV0LT5pX210aW1lID0gcmV0LT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FOwogCQlpZiAobW9kZSAmIFNfSUZESVIpCiAJCQlyZXQtPmlfbmxpbmsgPSAyOwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL0tidWlsZCBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9LYnVpbGQKaW5kZXggNjNhMjM0MS4uZjJhZjQxNiAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL0tidWlsZAorKysgYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vS2J1aWxkCkBAIC0xMywzICsxMyw0IEBACiB1bmlmZGVmLXkgKz0gZGVidWcuaAogdW5pZmRlZi15ICs9IGNocGlkLmgKIHVuaWZkZWYteSArPSBzY2hpZC5oCit1bmlmZGVmLXkgKz0gc3dhYi5oCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vYXRvbWljLmggYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vYXRvbWljLmgKaW5kZXggMmQxODQ2NS4uZGU0MzJmMiAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2F0b21pYy5oCisrKyBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9hdG9taWMuaApAQCAtMiw2ICsyLDcgQEAKICNkZWZpbmUgX19BUkNIX1MzOTBfQVRPTUlDX18KIAogI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KIAogLyoKICAqICBpbmNsdWRlL2FzbS1zMzkwL2F0b21pYy5oCkBAIC0yMyw5ICsyNCw2IEBACiAgKiBTMzkwIHVzZXMgJ0NvbXBhcmUgQW5kIFN3YXAnIGZvciBhdG9taWNpdHkgaW4gU01QIGVudmlyb21lbnQKICAqLwogCi10eXBlZGVmIHN0cnVjdCB7Ci0JaW50IGNvdW50ZXI7Ci19IF9fYXR0cmlidXRlX18gKChhbGlnbmVkICg0KSkpIGF0b21pY190OwogI2RlZmluZSBBVE9NSUNfSU5JVChpKSAgeyAoaSkgfQogCiAjaWZkZWYgX19LRVJORUxfXwpAQCAtMTQ5LDkgKzE0Nyw2IEBACiAjdW5kZWYgX19DU19MT09QCiAKICNpZmRlZiBfX3MzOTB4X18KLXR5cGVkZWYgc3RydWN0IHsKLQlsb25nIGxvbmcgY291bnRlcjsKLX0gX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQgKDgpKSkgYXRvbWljNjRfdDsKICNkZWZpbmUgQVRPTUlDNjRfSU5JVChpKSAgeyAoaSkgfQogCiAjaWYgX19HTlVDX18gPiAzIHx8IChfX0dOVUNfXyA9PSAzICYmIF9fR05VQ19NSU5PUl9fID4gMikKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9ieXRlb3JkZXIuaCBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9ieXRlb3JkZXIuaAppbmRleCA4YmNmMjc3Li5iOTVhMmIyIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vYnl0ZW9yZGVyLmgKKysrIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2J5dGVvcmRlci5oCkBAIC0xLDk1ICsxLDcgQEAKICNpZm5kZWYgX1MzOTBfQllURU9SREVSX0gKICNkZWZpbmUgX1MzOTBfQllURU9SREVSX0gKIAotLyoKLSAqICBpbmNsdWRlL2FzbS1zMzkwL2J5dGVvcmRlci5oCi0gKgotICogIFMzOTAgdmVyc2lvbgotICogICAgQ29weXJpZ2h0IChDKSAxOTk5IElCTSBEZXV0c2NobGFuZCBFbnR3aWNrbHVuZyBHbWJILCBJQk0gQ29ycG9yYXRpb24KLSAqICAgIEF1dGhvcihzKTogTWFydGluIFNjaHdpZGVmc2t5IChzY2h3aWRlZnNreUBkZS5pYm0uY29tKQotICovCi0KLSNpbmNsdWRlIDxhc20vdHlwZXMuaD4KLQotI2RlZmluZSBfX0JJR19FTkRJQU4KLQotI2lmbmRlZiBfX3MzOTB4X18KLSMgZGVmaW5lIF9fU1dBQl82NF9USFJVXzMyX18KLSNlbmRpZgotCi0jaWZkZWYgX19zMzkweF9fCi1zdGF0aWMgaW5saW5lIF9fdTY0IF9fYXJjaF9zd2FiNjRwKGNvbnN0IF9fdTY0ICp4KQotewotCV9fdTY0IHJlc3VsdDsKLQotCWFzbSB2b2xhdGlsZSgibHJ2ZyAlMCwlMSIgOiAiPWQiIChyZXN1bHQpIDogIm0iICgqeCkpOwotCXJldHVybiByZXN1bHQ7Ci19Ci0jZGVmaW5lIF9fYXJjaF9zd2FiNjRwIF9fYXJjaF9zd2FiNjRwCi0KLXN0YXRpYyBpbmxpbmUgX191NjQgX19hcmNoX3N3YWI2NChfX3U2NCB4KQotewotCV9fdTY0IHJlc3VsdDsKLQotCWFzbSB2b2xhdGlsZSgibHJ2Z3IgJTAsJTEiIDogIj1kIiAocmVzdWx0KSA6ICJkIiAoeCkpOwotCXJldHVybiByZXN1bHQ7Ci19Ci0jZGVmaW5lIF9fYXJjaF9zd2FiNjQgX19hcmNoX3N3YWI2NAotCi1zdGF0aWMgaW5saW5lIHZvaWQgX19hcmNoX3N3YWI2NHMoX191NjQgKngpCi17Ci0JKnggPSBfX2FyY2hfc3dhYjY0cCh4KTsKLX0KLSNkZWZpbmUgX19hcmNoX3N3YWI2NHMgX19hcmNoX3N3YWI2NHMKLSNlbmRpZiAvKiBfX3MzOTB4X18gKi8KLQotc3RhdGljIGlubGluZSBfX3UzMiBfX2FyY2hfc3dhYjMycChjb25zdCBfX3UzMiAqeCkKLXsKLQlfX3UzMiByZXN1bHQ7Ci0JCi0JYXNtIHZvbGF0aWxlKAotI2lmbmRlZiBfX3MzOTB4X18KLQkJIglpY20JJTAsOCwzKCUxKVxuIgotCQkiCWljbQklMCw0LDIoJTEpXG4iCi0JCSIJaWNtCSUwLDIsMSglMSlcbiIKLQkJIglpYwklMCwwKCUxKSIKLQkJOiAiPSZkIiAocmVzdWx0KSA6ICJhIiAoeCksICJtIiAoKngpIDogImNjIik7Ci0jZWxzZSAvKiBfX3MzOTB4X18gKi8KLQkJIglscnYJJTAsJTEiCi0JCTogIj1kIiAocmVzdWx0KSA6ICJtIiAoKngpKTsKLSNlbmRpZiAvKiBfX3MzOTB4X18gKi8KLQlyZXR1cm4gcmVzdWx0OwotfQotI2RlZmluZSBfX2FyY2hfc3dhYjMycCBfX2FyY2hfc3dhYjMycAotCi0jaWZkZWYgX19zMzkweF9fCi1zdGF0aWMgaW5saW5lIF9fdTMyIF9fYXJjaF9zd2FiMzIoX191MzIgeCkKLXsKLQlfX3UzMiByZXN1bHQ7Ci0JCi0JYXNtIHZvbGF0aWxlKCJscnZyICAlMCwlMSIgOiAiPWQiIChyZXN1bHQpIDogImQiICh4KSk7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLSNkZWZpbmUgX19hcmNoX3N3YWIzMiBfX2FyY2hfc3dhYjMyCi0jZW5kaWYgLyogX19zMzkweF9fICovCi0KLXN0YXRpYyBpbmxpbmUgX191MTYgX19hcmNoX3N3YWIxNnAoY29uc3QgX191MTYgKngpCi17Ci0JX191MTYgcmVzdWx0OwotCQotCWFzbSB2b2xhdGlsZSgKLSNpZm5kZWYgX19zMzkweF9fCi0JCSIJaWNtCSUwLDIsMSglMSlcbiIKLQkJIglpYwklMCwwKCUxKVxuIgotCQk6ICI9JmQiIChyZXN1bHQpIDogImEiICh4KSwgIm0iICgqeCkgOiAiY2MiKTsKLSNlbHNlIC8qIF9fczM5MHhfXyAqLwotCQkiCWxydmgJJTAsJTEiCi0JCTogIj1kIiAocmVzdWx0KSA6ICJtIiAoKngpKTsKLSNlbmRpZiAvKiBfX3MzOTB4X18gKi8KLQlyZXR1cm4gcmVzdWx0OwotfQotI2RlZmluZSBfX2FyY2hfc3dhYjE2cCBfX2FyY2hfc3dhYjE2cAotCi0jaW5jbHVkZSA8bGludXgvYnl0ZW9yZGVyLmg+CisjaW5jbHVkZSA8YXNtL3N3YWIuaD4KKyNpbmNsdWRlIDxsaW51eC9ieXRlb3JkZXIvYmlnX2VuZGlhbi5oPgogCiAjZW5kaWYgLyogX1MzOTBfQllURU9SREVSX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9zMzkwX3JkZXYuaCBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9zMzkwX3JkZXYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmZhMjA0NC4uMDAwMDAwMAotLS0gYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vczM5MF9yZGV2LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0vKgotICogIGluY2x1ZGUvYXNtLXMzOTAvY2N3ZGV2LmgKLSAqCi0gKiAgICBDb3B5cmlnaHQgKEMpIDIwMDIsMjAwNSBJQk0gRGV1dHNjaGxhbmQgRW50d2lja2x1bmcgR21iSCwgSUJNIENvcnBvcmF0aW9uCi0gKiAgICBBdXRob3Iocyk6IENvcm5lbGlhIEh1Y2sgPGNvcm5lbGlhLmh1Y2tAZGUuaWJtLmNvbT4KLSAqICAgICAgICAgICAgICAgQ2Fyc3RlbiBPdHRlICA8Y290dGVAZGUuaWJtLmNvbT4KLSAqCi0gKiAgSW50ZXJmYWNlIGZvciBzMzkwIHJvb3QgZGV2aWNlCi0gKi8KLQotI2lmbmRlZiBfUzM5MF9SREVWX0hfCi0jZGVmaW5lIF9TMzkwX1JERVZfSF8KLWV4dGVybiBzdHJ1Y3QgZGV2aWNlICpzMzkwX3Jvb3RfZGV2X3JlZ2lzdGVyKGNvbnN0IGNoYXIgKik7Ci1leHRlcm4gdm9pZCBzMzkwX3Jvb3RfZGV2X3VucmVnaXN0ZXIoc3RydWN0IGRldmljZSAqKTsKLSNlbmRpZiAvKiBfUzM5MF9SREVWX0hfICovCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vc3dhYi5oIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3N3YWIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDkzMjFhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3N3YWIuaApAQCAtMCwwICsxLDkxIEBACisjaWZuZGVmIF9TMzkwX1NXQUJfSAorI2RlZmluZSBfUzM5MF9TV0FCX0gKKworLyoKKyAqICBpbmNsdWRlL2FzbS1zMzkwL3N3YWIuaAorICoKKyAqICBTMzkwIHZlcnNpb24KKyAqICAgIENvcHlyaWdodCAoQykgMTk5OSBJQk0gRGV1dHNjaGxhbmQgRW50d2lja2x1bmcgR21iSCwgSUJNIENvcnBvcmF0aW9uCisgKiAgICBBdXRob3Iocyk6IE1hcnRpbiBTY2h3aWRlZnNreSAoc2Nod2lkZWZza3lAZGUuaWJtLmNvbSkKKyAqLworCisjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CisKKyNpZm5kZWYgX19zMzkweF9fCisjIGRlZmluZSBfX1NXQUJfNjRfVEhSVV8zMl9fCisjZW5kaWYKKworI2lmZGVmIF9fczM5MHhfXworc3RhdGljIGlubGluZSBfX3U2NCBfX2FyY2hfc3dhYjY0cChjb25zdCBfX3U2NCAqeCkKK3sKKwlfX3U2NCByZXN1bHQ7CisKKwlhc20gdm9sYXRpbGUoImxydmcgJTAsJTEiIDogIj1kIiAocmVzdWx0KSA6ICJtIiAoKngpKTsKKwlyZXR1cm4gcmVzdWx0OworfQorI2RlZmluZSBfX2FyY2hfc3dhYjY0cCBfX2FyY2hfc3dhYjY0cAorCitzdGF0aWMgaW5saW5lIF9fdTY0IF9fYXJjaF9zd2FiNjQoX191NjQgeCkKK3sKKwlfX3U2NCByZXN1bHQ7CisKKwlhc20gdm9sYXRpbGUoImxydmdyICUwLCUxIiA6ICI9ZCIgKHJlc3VsdCkgOiAiZCIgKHgpKTsKKwlyZXR1cm4gcmVzdWx0OworfQorI2RlZmluZSBfX2FyY2hfc3dhYjY0IF9fYXJjaF9zd2FiNjQKKworc3RhdGljIGlubGluZSB2b2lkIF9fYXJjaF9zd2FiNjRzKF9fdTY0ICp4KQoreworCSp4ID0gX19hcmNoX3N3YWI2NHAoeCk7Cit9CisjZGVmaW5lIF9fYXJjaF9zd2FiNjRzIF9fYXJjaF9zd2FiNjRzCisjZW5kaWYgLyogX19zMzkweF9fICovCisKK3N0YXRpYyBpbmxpbmUgX191MzIgX19hcmNoX3N3YWIzMnAoY29uc3QgX191MzIgKngpCit7CisJX191MzIgcmVzdWx0OworCQorCWFzbSB2b2xhdGlsZSgKKyNpZm5kZWYgX19zMzkweF9fCisJCSIJaWNtCSUwLDgsMyglMSlcbiIKKwkJIglpY20JJTAsNCwyKCUxKVxuIgorCQkiCWljbQklMCwyLDEoJTEpXG4iCisJCSIJaWMJJTAsMCglMSkiCisJCTogIj0mZCIgKHJlc3VsdCkgOiAiYSIgKHgpLCAibSIgKCp4KSA6ICJjYyIpOworI2Vsc2UgLyogX19zMzkweF9fICovCisJCSIJbHJ2CSUwLCUxIgorCQk6ICI9ZCIgKHJlc3VsdCkgOiAibSIgKCp4KSk7CisjZW5kaWYgLyogX19zMzkweF9fICovCisJcmV0dXJuIHJlc3VsdDsKK30KKyNkZWZpbmUgX19hcmNoX3N3YWIzMnAgX19hcmNoX3N3YWIzMnAKKworI2lmZGVmIF9fczM5MHhfXworc3RhdGljIGlubGluZSBfX3UzMiBfX2FyY2hfc3dhYjMyKF9fdTMyIHgpCit7CisJX191MzIgcmVzdWx0OworCQorCWFzbSB2b2xhdGlsZSgibHJ2ciAgJTAsJTEiIDogIj1kIiAocmVzdWx0KSA6ICJkIiAoeCkpOworCXJldHVybiByZXN1bHQ7Cit9CisjZGVmaW5lIF9fYXJjaF9zd2FiMzIgX19hcmNoX3N3YWIzMgorI2VuZGlmIC8qIF9fczM5MHhfXyAqLworCitzdGF0aWMgaW5saW5lIF9fdTE2IF9fYXJjaF9zd2FiMTZwKGNvbnN0IF9fdTE2ICp4KQoreworCV9fdTE2IHJlc3VsdDsKKwkKKwlhc20gdm9sYXRpbGUoCisjaWZuZGVmIF9fczM5MHhfXworCQkiCWljbQklMCwyLDEoJTEpXG4iCisJCSIJaWMJJTAsMCglMSlcbiIKKwkJOiAiPSZkIiAocmVzdWx0KSA6ICJhIiAoeCksICJtIiAoKngpIDogImNjIik7CisjZWxzZSAvKiBfX3MzOTB4X18gKi8KKwkJIglscnZoCSUwLCUxIgorCQk6ICI9ZCIgKHJlc3VsdCkgOiAibSIgKCp4KSk7CisjZW5kaWYgLyogX19zMzkweF9fICovCisJcmV0dXJuIHJlc3VsdDsKK30KKyNkZWZpbmUgX19hcmNoX3N3YWIxNnAgX19hcmNoX3N3YWIxNnAKKworI2VuZGlmIC8qIF9TMzkwX1NXQUJfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9rcHJvYmVzLmMgYi9hcmNoL3MzOTAva2VybmVsL2twcm9iZXMuYwppbmRleCA1NjkwNzllLi5hMDFjZjAyIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL2twcm9iZXMuYworKysgYi9hcmNoL3MzOTAva2VybmVsL2twcm9iZXMuYwpAQCAtMjE4LDkgKzIxOCwxMCBAQAogCiB2b2lkIF9fa3Byb2JlcyBhcmNoX3JlbW92ZV9rcHJvYmUoc3RydWN0IGtwcm9iZSAqcCkKIHsKLQltdXRleF9sb2NrKCZrcHJvYmVfbXV0ZXgpOwotCWZyZWVfaW5zbl9zbG90KHAtPmFpbnNuLmluc24sIDApOwotCW11dGV4X3VubG9jaygma3Byb2JlX211dGV4KTsKKwlpZiAocC0+YWluc24uaW5zbikgeworCQlmcmVlX2luc25fc2xvdChwLT5haW5zbi5pbnNuLCAwKTsKKwkJcC0+YWluc24uaW5zbiA9IE5VTEw7CisJfQogfQogCiBzdGF0aWMgdm9pZCBfX2twcm9iZXMgcHJlcGFyZV9zaW5nbGVzdGVwKHN0cnVjdCBrcHJvYmUgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQpAQCAtMzgxLDcgKzM4Miw3IEBACiAJLyoKIAkgKiBJdCBpcyBwb3NzaWJsZSB0byBoYXZlIG11bHRpcGxlIGluc3RhbmNlcyBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbgogCSAqIHRhc2sgZWl0aGVyIGJlY2F1c2UgYW4gbXVsdGlwbGUgZnVuY3Rpb25zIGluIHRoZSBjYWxsIHBhdGgKLQkgKiBoYXZlIGEgcmV0dXJuIHByb2JlIGluc3RhbGxlZCBvbiB0aGVtLCBhbmQvb3IgbW9yZSB0aGVuIG9uZSByZXR1cm4KKwkgKiBoYXZlIGEgcmV0dXJuIHByb2JlIGluc3RhbGxlZCBvbiB0aGVtLCBhbmQvb3IgbW9yZSB0aGFuIG9uZSByZXR1cm4KIAkgKiByZXR1cm4gcHJvYmUgd2FzIHJlZ2lzdGVyZWQgZm9yIGEgdGFyZ2V0IGZ1bmN0aW9uLgogCSAqCiAJICogV2UgY2FuIGhhbmRsZSB0aGlzIGJlY2F1c2U6CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvbW0vaW5pdC5jIGIvYXJjaC9zMzkwL21tL2luaXQuYwppbmRleCAxNThiMGQ2Li5mMDI1OGNhIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvbW0vaW5pdC5jCisrKyBiL2FyY2gvczM5MC9tbS9pbml0LmMKQEAgLTE4Myw3ICsxODMsNyBAQAogCXJjID0gdm1lbV9hZGRfbWFwcGluZyhzdGFydCwgc2l6ZSk7CiAJaWYgKHJjKQogCQlyZXR1cm4gcmM7Ci0JcmMgPSBfX2FkZF9wYWdlcyh6b25lLCBQRk5fRE9XTihzdGFydCksIFBGTl9ET1dOKHNpemUpKTsKKwlyYyA9IF9fYWRkX3BhZ2VzKG5pZCwgem9uZSwgUEZOX0RPV04oc3RhcnQpLCBQRk5fRE9XTihzaXplKSk7CiAJaWYgKHJjKQogCQl2bWVtX3JlbW92ZV9tYXBwaW5nKHN0YXJ0LCBzaXplKTsKIAlyZXR1cm4gcmM7CmRpZmYgLS1naXQgYS9hcmNoL3NoL2RyaXZlcnMvcGNpL29wcy1jYXltYW4uYyBiL2FyY2gvc2gvZHJpdmVycy9wY2kvb3BzLWNheW1hbi5jCmluZGV4IDVjY2Y5ZWEuLjM4ZWY3NjIgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvZHJpdmVycy9wY2kvb3BzLWNheW1hbi5jCisrKyBiL2FyY2gvc2gvZHJpdmVycy9wY2kvb3BzLWNheW1hbi5jCkBAIC01LDExICs1LDYgQEAKICNpbmNsdWRlIDxjcHUvaXJxLmg+CiAjaW5jbHVkZSAicGNpLXNoNS5oIgogCi1zdGF0aWMgaW5saW5lIHU4IGJyaWRnZV9zd2l6emxlKHU4IHBpbiwgdTggc2xvdCkKLXsKLQlyZXR1cm4gKCgocGluIC0gMSkgKyBzbG90KSAlIDQpICsgMTsKLX0KLQogaW50IF9faW5pdCBwY2liaW9zX21hcF9wbGF0Zm9ybV9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQogewogCWludCByZXN1bHQgPSAtMTsKQEAgLTQyLDcgKzM3LDcgQEAKIAl3aGlsZSAoZGV2LT5idXMtPm51bWJlciA+IDApIHsKIAogCQlzbG90ID0gcGF0aFtpXS5zbG90ID0gUENJX1NMT1QoZGV2LT5kZXZmbik7Ci0JCXBpbiA9IHBhdGhbaV0ucGluID0gYnJpZGdlX3N3aXp6bGUocGluLCBzbG90KTsKKwkJcGluID0gcGF0aFtpXS5waW4gPSBwY2lfc3dpenpsZV9pbnRlcnJ1cHRfcGluKGRldiwgcGluKTsKIAkJZGV2ID0gZGV2LT5idXMtPnNlbGY7CiAJCWkrKzsKIAkJaWYgKGkgPiAzKSBwYW5pYygiUENJIHBhdGggdG8gcm9vdCBidXMgdG9vIGxvbmchXG4iKTsKQEAgLTU2LDcgKzUxLDcgQEAKIAlpZiAoKHNsb3QgPCAzKSB8fCAoaSA9PSAwKSkgewogCQkvKiBCdXMgMCAoaW5jbC4gUENJLVBDSSBicmlkZ2UgaXRzZWxmKSA6IHBlcmZvcm0gdGhlIGZpbmFsCiAJCSAgIHN3aXp6bGUgbm93LiAqLwotCQlyZXN1bHQgPSBJUlFfSU5UQSArIGJyaWRnZV9zd2l6emxlKHBpbiwgc2xvdCkgLSAxOworCQlyZXN1bHQgPSBJUlFfSU5UQSArIHBjaV9zd2l6emxlX2ludGVycnVwdF9waW4oZGV2LCBwaW4pIC0gMTsKIAl9IGVsc2UgewogCQlpLS07CiAJCXNsb3QgPSBwYXRoW2ldLnNsb3Q7CmRpZmYgLS1naXQgYS9hcmNoL3NoL2RyaXZlcnMvcGNpL3BjaS5jIGIvYXJjaC9zaC9kcml2ZXJzL3BjaS9wY2kuYwppbmRleCBkMzgzOWU2Li5lMzZjN2I4IDEwMDY0NAotLS0gYS9hcmNoL3NoL2RyaXZlcnMvcGNpL3BjaS5jCisrKyBiL2FyY2gvc2gvZHJpdmVycy9wY2kvcGNpLmMKQEAgLTIxLDI2ICsyMSw2IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogCi1zdGF0aWMgaW5saW5lIHU4IGJyaWRnZV9zd2l6emxlKHU4IHBpbiwgdTggc2xvdCkKLXsKLQlyZXR1cm4gKCgocGluIC0gMSkgKyBzbG90KSAlIDQpICsgMTsKLX0KLQotc3RhdGljIHU4IF9faW5pdCBzaW1wbGVfc3dpenpsZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCAqcGlucCkKLXsKLQl1OCBwaW4gPSAqcGlucDsKLQotCXdoaWxlIChkZXYtPmJ1cy0+cGFyZW50KSB7Ci0JCXBpbiA9IGJyaWRnZV9zd2l6emxlKHBpbiwgUENJX1NMT1QoZGV2LT5kZXZmbikpOwotCQkvKiBNb3ZlIHVwIHRoZSBjaGFpbiBvZiBicmlkZ2VzLiAqLwotCQlkZXYgPSBkZXYtPmJ1cy0+c2VsZjsKLQl9Ci0JKnBpbnAgPSBwaW47Ci0KLQkvKiBUaGUgc2xvdCBpcyB0aGUgc2xvdCBvZiB0aGUgbGFzdCBicmlkZ2UuICovCi0JcmV0dXJuIFBDSV9TTE9UKGRldi0+ZGV2Zm4pOwotfQotCiBzdGF0aWMgaW50IF9faW5pdCBwY2liaW9zX2luaXQodm9pZCkKIHsKIAlzdHJ1Y3QgcGNpX2NoYW5uZWwgKnA7CkBAIC02MSw3ICs0MSw3IEBACiAJCWJ1c25vID0gYnVzLT5zdWJvcmRpbmF0ZSArIDE7CiAJfQogCi0JcGNpX2ZpeHVwX2lycXMoc2ltcGxlX3N3aXp6bGUsIHBjaWJpb3NfbWFwX3BsYXRmb3JtX2lycSk7CisJcGNpX2ZpeHVwX2lycXMocGNpX2NvbW1vbl9zd2l6emxlLCBwY2liaW9zX21hcF9wbGF0Zm9ybV9pcnEpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3NoL2luY2x1ZGUvYXNtL0tidWlsZCBiL2FyY2gvc2gvaW5jbHVkZS9hc20vS2J1aWxkCmluZGV4IDQzOTEwY2QuLmYxYTJhMGQgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvaW5jbHVkZS9hc20vS2J1aWxkCisrKyBiL2FyY2gvc2gvaW5jbHVkZS9hc20vS2J1aWxkCkBAIC02LDMgKzYsNCBAQAogdW5pZmRlZi15ICs9IHVuaXN0ZF82NC5oCiB1bmlmZGVmLXkgKz0gcG9zaXhfdHlwZXNfMzIuaAogdW5pZmRlZi15ICs9IHBvc2l4X3R5cGVzXzY0LmgKK3VuaWZkZWYteSArPSBzd2FiLmgKZGlmZiAtLWdpdCBhL2FyY2gvc2gvaW5jbHVkZS9hc20vYXRvbWljLmggYi9hcmNoL3NoL2luY2x1ZGUvYXNtL2F0b21pYy5oCmluZGV4IGMwNDNlZjAuLjYzMjdmZmIgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvaW5jbHVkZS9hc20vYXRvbWljLmgKKysrIGIvYXJjaC9zaC9pbmNsdWRlL2FzbS9hdG9taWMuaApAQCAtNywxNiArNywxNSBAQAogICoKICAqLwogCi10eXBlZGVmIHN0cnVjdCB7IHZvbGF0aWxlIGludCBjb3VudGVyOyB9IGF0b21pY190OworI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAKICNkZWZpbmUgQVRPTUlDX0lOSVQoaSkJKCAoYXRvbWljX3QpIHsgKGkpIH0gKQogCiAjZGVmaW5lIGF0b21pY19yZWFkKHYpCQkoKHYpLT5jb3VudGVyKQogI2RlZmluZSBhdG9taWNfc2V0KHYsaSkJCSgodiktPmNvdW50ZXIgPSAoaSkpCiAKLSNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgotI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KLQogI2lmIGRlZmluZWQoQ09ORklHX0dVU0FfUkIpCiAjaW5jbHVkZSA8YXNtL2F0b21pYy1ncmIuaD4KICNlbGlmIGRlZmluZWQoQ09ORklHX0NQVV9TSDRBKQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9pbmNsdWRlL2FzbS9ieXRlb3JkZXIuaCBiL2FyY2gvc2gvaW5jbHVkZS9hc20vYnl0ZW9yZGVyLmgKaW5kZXggZjVmYTA2NS4uZTk1YzQxYSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9pbmNsdWRlL2FzbS9ieXRlb3JkZXIuaAorKysgYi9hcmNoL3NoL2luY2x1ZGUvYXNtL2J5dGVvcmRlci5oCkBAIC0xLDY4ICsxLDEyIEBACiAjaWZuZGVmIF9fQVNNX1NIX0JZVEVPUkRFUl9ICiAjZGVmaW5lIF9fQVNNX1NIX0JZVEVPUkRFUl9ICiAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTkgIE5paWJlIFl1dGFrYQotICogQ29weXJpZ2h0IChDKSAyMDAwLCAyMDAxICBQYW9sbyBBbGJlcmVsbGkKLSAqLwotI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+Ci0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vc3dhYi5oPgogCiAjaWZkZWYgX19MSVRUTEVfRU5ESUFOX18KLSMgZGVmaW5lIF9fTElUVExFX0VORElBTgorI2luY2x1ZGUgPGxpbnV4L2J5dGVvcmRlci9saXR0bGVfZW5kaWFuLmg+CiAjZWxzZQotIyBkZWZpbmUgX19CSUdfRU5ESUFOCisjaW5jbHVkZSA8bGludXgvYnl0ZW9yZGVyL2JpZ19lbmRpYW4uaD4KICNlbmRpZgogCi0jZGVmaW5lIF9fU1dBQl82NF9USFJVXzMyX18KLQotc3RhdGljIGlubGluZSBfX2F0dHJpYnV0ZV9jb25zdF9fIF9fdTMyIF9fYXJjaF9zd2FiMzIoX191MzIgeCkKLXsKLQlfX2FzbV9fKAotI2lmZGVmIF9fU0g1X18KLQkJImJ5dGVyZXYJJTAsICUwXG5cdCIKLQkJInNoYXJpCQklMCwgMzIsICUwIgotI2Vsc2UKLQkJInN3YXAuYgkJJTAsICUwXG5cdCIKLQkJInN3YXAudwkJJTAsICUwXG5cdCIKLQkJInN3YXAuYgkJJTAsICUwIgotI2VuZGlmCi0JCTogIj1yIiAoeCkKLQkJOiAiMCIgKHgpKTsKLQotCXJldHVybiB4OwotfQotI2RlZmluZSBfX2FyY2hfc3dhYjMyIF9fYXJjaF9zd2FiMzIKLQotc3RhdGljIGlubGluZSBfX2F0dHJpYnV0ZV9jb25zdF9fIF9fdTE2IF9fYXJjaF9zd2FiMTYoX191MTYgeCkKLXsKLQlfX2FzbV9fKAotI2lmZGVmIF9fU0g1X18KLQkJImJ5dGVyZXYJJTAsICUwXG5cdCIKLQkJInNoYXJpCQklMCwgMzIsICUwIgotI2Vsc2UKLQkJInN3YXAuYgkJJTAsICUwIgotI2VuZGlmCi0JCTogIj1yIiAoeCkKLQkJOiAgIjAiICh4KSk7Ci0KLQlyZXR1cm4geDsKLX0KLSNkZWZpbmUgX19hcmNoX3N3YWIxNiBfX2FyY2hfc3dhYjE2Ci0KLXN0YXRpYyBpbmxpbmUgX191NjQgX19hcmNoX3N3YWI2NChfX3U2NCB2YWwpCi17Ci0JdW5pb24gewotCQlzdHJ1Y3QgeyBfX3UzMiBhLGI7IH0gczsKLQkJX191NjQgdTsKLQl9IHYsIHc7Ci0Jdi51ID0gdmFsOwotCXcucy5iID0gX19hcmNoX3N3YWIzMih2LnMuYSk7Ci0Jdy5zLmEgPSBfX2FyY2hfc3dhYjMyKHYucy5iKTsKLQlyZXR1cm4gdy51OwotfQotI2RlZmluZSBfX2FyY2hfc3dhYjY0IF9fYXJjaF9zd2FiNjQKLQotI2luY2x1ZGUgPGxpbnV4L2J5dGVvcmRlci5oPgotCiAjZW5kaWYgLyogX19BU01fU0hfQllURU9SREVSX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvc2gvaW5jbHVkZS9hc20vc3dhYi5oIGIvYXJjaC9zaC9pbmNsdWRlL2FzbS9zd2FiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5MzE1OQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvc2gvaW5jbHVkZS9hc20vc3dhYi5oCkBAIC0wLDAgKzEsNjAgQEAKKyNpZm5kZWYgX19BU01fU0hfU1dBQl9ICisjZGVmaW5lIF9fQVNNX1NIX1NXQUJfSAorCisvKgorICogQ29weXJpZ2h0IChDKSAxOTk5ICBOaWliZSBZdXRha2EKKyAqIENvcHlyaWdodCAoQykgMjAwMCwgMjAwMSAgUGFvbG8gQWxiZXJlbGxpCisgKi8KKyNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNkZWZpbmUgX19TV0FCXzY0X1RIUlVfMzJfXworCitzdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX2NvbnN0X18gX191MzIgX19hcmNoX3N3YWIzMihfX3UzMiB4KQoreworCV9fYXNtX18oCisjaWZkZWYgX19TSDVfXworCQkiYnl0ZXJldgklMCwgJTBcblx0IgorCQkic2hhcmkJCSUwLCAzMiwgJTAiCisjZWxzZQorCQkic3dhcC5iCQklMCwgJTBcblx0IgorCQkic3dhcC53CQklMCwgJTBcblx0IgorCQkic3dhcC5iCQklMCwgJTAiCisjZW5kaWYKKwkJOiAiPXIiICh4KQorCQk6ICIwIiAoeCkpOworCisJcmV0dXJuIHg7Cit9CisjZGVmaW5lIF9fYXJjaF9zd2FiMzIgX19hcmNoX3N3YWIzMgorCitzdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX2NvbnN0X18gX191MTYgX19hcmNoX3N3YWIxNihfX3UxNiB4KQoreworCV9fYXNtX18oCisjaWZkZWYgX19TSDVfXworCQkiYnl0ZXJldgklMCwgJTBcblx0IgorCQkic2hhcmkJCSUwLCAzMiwgJTAiCisjZWxzZQorCQkic3dhcC5iCQklMCwgJTAiCisjZW5kaWYKKwkJOiAiPXIiICh4KQorCQk6ICAiMCIgKHgpKTsKKworCXJldHVybiB4OworfQorI2RlZmluZSBfX2FyY2hfc3dhYjE2IF9fYXJjaF9zd2FiMTYKKworc3RhdGljIGlubGluZSBfX3U2NCBfX2FyY2hfc3dhYjY0KF9fdTY0IHZhbCkKK3sKKwl1bmlvbiB7CisJCXN0cnVjdCB7IF9fdTMyIGEsYjsgfSBzOworCQlfX3U2NCB1OworCX0gdiwgdzsKKwl2LnUgPSB2YWw7CisJdy5zLmIgPSBfX2FyY2hfc3dhYjMyKHYucy5hKTsKKwl3LnMuYSA9IF9fYXJjaF9zd2FiMzIodi5zLmIpOworCXJldHVybiB3LnU7Cit9CisjZGVmaW5lIF9fYXJjaF9zd2FiNjQgX19hcmNoX3N3YWI2NAorCisjZW5kaWYgLyogX19BU01fU0hfU1dBQl9IICovCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC90cmFwc18zMi5jIGIvYXJjaC9zaC9rZXJuZWwvdHJhcHNfMzIuYwppbmRleCA4ODgwN2EyLi5jMGFhM2Q4IDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC90cmFwc18zMi5jCisrKyBiL2FyY2gvc2gva2VybmVsL3RyYXBzXzMyLmMKQEAgLTEzLDYgKzEzLDcgQEAKICAqLwogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L2hhcmRpcnEuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KZGlmZiAtLWdpdCBhL2FyY2gvc2gvbW0vaW5pdC5jIGIvYXJjaC9zaC9tbS9pbml0LmMKaW5kZXggNmNiZWY4Yy4uM2VkZjI5NyAxMDA2NDQKLS0tIGEvYXJjaC9zaC9tbS9pbml0LmMKKysrIGIvYXJjaC9zaC9tbS9pbml0LmMKQEAgLTMxMSw3ICszMTEsOCBAQAogCXBnZGF0ID0gTk9ERV9EQVRBKG5pZCk7CiAKIAkvKiBXZSBvbmx5IGhhdmUgWk9ORV9OT1JNQUwsIHNvIHRoaXMgaXMgZWFzeS4uICovCi0JcmV0ID0gX19hZGRfcGFnZXMocGdkYXQtPm5vZGVfem9uZXMgKyBaT05FX05PUk1BTCwgc3RhcnRfcGZuLCBucl9wYWdlcyk7CisJcmV0ID0gX19hZGRfcGFnZXMobmlkLCBwZ2RhdC0+bm9kZV96b25lcyArIFpPTkVfTk9STUFMLAorCQkJCXN0YXJ0X3BmbiwgbnJfcGFnZXMpOwogCWlmICh1bmxpa2VseShyZXQpKQogCQlwcmludGsoIiVzOiBGYWlsZWQsIF9fYWRkX3BhZ2VzKCkgPT0gJWRcbiIsIF9fZnVuY19fLCByZXQpOwogCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL0tjb25maWcgYi9hcmNoL3NwYXJjL0tjb25maWcKaW5kZXggMGE5NGQ5Yy4uZGU1OGMwMiAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9LY29uZmlnCisrKyBiL2FyY2gvc3BhcmMvS2NvbmZpZwpAQCAtNCw2ICs0LDE3IEBACiAKIG1haW5tZW51ICJMaW51eC9TUEFSQyBLZXJuZWwgQ29uZmlndXJhdGlvbiIKIAorY29uZmlnIDY0QklUCisJYm9vbCAiNjQtYml0IGtlcm5lbCIgaWYgQVJDSCA9ICJzcGFyYyIKKwlkZWZhdWx0IEFSQ0ggPSAic3BhcmM2NCIKKwloZWxwCisJICBTUEFSQyBpcyBhIGZhbWlseSBvZiBSSVNDIG1pY3JvcHJvY2Vzc29ycyBkZXNpZ25lZCBhbmQgbWFya2V0ZWQgYnkKKwkgIFN1biBNaWNyb3N5c3RlbXMsIGluY29ycG9yYXRlZC4gIFRoZXkgYXJlIHZlcnkgd2lkZWx5IGZvdW5kIGluIFN1bgorCSAgd29ya3N0YXRpb25zIGFuZCBjbG9uZXMuCisKKwkgIFNheSB5ZXMgdG8gYnVpbGQgYSA2NC1iaXQga2VybmVsIC0gZm9ybWVybHkga25vd24gYXMgc3BhcmM2NAorCSAgU2F5IG5vIHRvIGJ1aWxkIGEgMzItYml0IGtlcm5lbCAtIGZvcm1lcmx5IGtub3duIGFzIHNwYXJjCisKIGNvbmZpZyBTUEFSQwogCWJvb2wKIAlkZWZhdWx0IHkKQEAgLTE1LDIyICsyNiwxMSBAQAogCXNlbGVjdCBSVENfQ0xBU1MKIAlzZWxlY3QgUlRDX0RSVl9NNDhUNTkKIAotIyBJZGVudGlmeSB0aGlzIGFzIGEgU3BhcmMzMiBidWlsZAogY29uZmlnIFNQQVJDMzIKLQlib29sCi0JZGVmYXVsdCB5IGlmIEFSQ0ggPSAic3BhcmMiCi0JaGVscAotCSAgU1BBUkMgaXMgYSBmYW1pbHkgb2YgUklTQyBtaWNyb3Byb2Nlc3NvcnMgZGVzaWduZWQgYW5kIG1hcmtldGVkIGJ5Ci0JICBTdW4gTWljcm9zeXN0ZW1zLCBpbmNvcnBvcmF0ZWQuICBUaGV5IGFyZSB2ZXJ5IHdpZGVseSBmb3VuZCBpbiBTdW4KLQkgIHdvcmtzdGF0aW9ucyBhbmQgY2xvbmVzLiBUaGlzIHBvcnQgY292ZXJzIHRoZSBvcmlnaW5hbCAzMi1iaXQgU1BBUkM7Ci0JICBpdCBpcyBvbGQgYW5kIHN0YWJsZSBhbmQgdXN1YWxseSBjb25zaWRlcmVkIG9uZSBvZiB0aGUgImJpZyB0aHJlZSIKLQkgIGFsb25nIHdpdGggdGhlIEludGVsIGFuZCBBbHBoYSBwb3J0cy4gIFRoZSBVbHRyYUxpbnV4IHByb2plY3QKLQkgIG1haW50YWlucyBib3RoIHRoZSBTUEFSQzMyIGFuZCBTUEFSQzY0IHBvcnRzOyBpdHMgd2ViIHBhZ2UgaXMKLQkgIGF2YWlsYWJsZSBhdCA8aHR0cDovL3d3dy51bHRyYWxpbnV4Lm9yZy8+LgorCWRlZl9ib29sICE2NEJJVAogCiBjb25maWcgU1BBUkM2NAotCWJvb2wKLQlkZWZhdWx0IHkgaWYgQVJDSCA9ICJzcGFyYzY0IgorCWRlZl9ib29sIDY0QklUCiAJc2VsZWN0IEFSQ0hfU1VQUE9SVFNfTVNJCiAJc2VsZWN0IEhBVkVfRlVOQ1RJT05fVFJBQ0VSCiAJc2VsZWN0IEhBVkVfS1JFVFBST0JFUwpAQCAtNTMsOSArNTMsNiBAQAogCWRlZmF1bHQgMzIgaWYgU1BBUkMzMgogCWRlZmF1bHQgNjQgaWYgU1BBUkM2NAogCi1jb25maWcgNjRCSVQKLQlkZWZfYm9vbCB5IGlmIFNQQVJDNjQKLQogY29uZmlnIEdFTkVSSUNfVElNRQogCWJvb2wKIAlkZWZhdWx0IHkgaWYgU1BBUkM2NApAQCAtMTg4LDE0ICsxODUsNiBAQAogCWJvb2wKIAlkZWZhdWx0IHkKIAotY29uZmlnIEFSQ0hfSEFTX0lMT0cyX1UzMgotCWJvb2wKLQlkZWZhdWx0IG4KLQotY29uZmlnIEFSQ0hfSEFTX0lMT0cyX1U2NAotCWJvb2wKLQlkZWZhdWx0IG4KLQogY29uZmlnIEVNVUxBVEVEX0NNUFhDSEcKIAlib29sCiAJZGVmYXVsdCB5IGlmIFNQQVJDMzIKQEAgLTQ0MiwyNiArNDMxLDYgQEAKIGVuZG1lbnUKIAogbWVudSAiQnVzIG9wdGlvbnMgKFBDSSBldGMuKSIKLWNvbmZpZyBJU0EKLQlib29sCi0JaGVscAotCSAgSVNBIGlzIGZvdW5kIG9uIEVzcHJlc3NvIG9ubHkgYW5kIGlzIG5vdCBzdXBwb3J0ZWQgY3VycmVudGx5LgotCi1jb25maWcgSVNBUE5QCi0JYm9vbAotCWhlbHAKLQkgIElTQVBOUCBpcyBub3Qgc3VwcG9ydGVkCi0KLWNvbmZpZyBFSVNBCi0JYm9vbAotCWhlbHAKLQkgIEVJU0EgaXMgbm90IHN1cHBvcnRlZC4KLQotY29uZmlnIE1DQQotCWJvb2wKLQloZWxwCi0JICBNQ0EgaXMgbm90IHN1cHBvcnRlZC4KLQogY29uZmlnIFNCVVMKIAlib29sCiAJZGVmYXVsdCB5CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2NvbmZpZ3Mvc3BhcmM2NF9kZWZjb25maWcgYi9hcmNoL3NwYXJjL2NvbmZpZ3Mvc3BhcmM2NF9kZWZjb25maWcKaW5kZXggMDVkMTlhM2UuLmNkZTE5YWUgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvY29uZmlncy9zcGFyYzY0X2RlZmNvbmZpZworKysgYi9hcmNoL3NwYXJjL2NvbmZpZ3Mvc3BhcmM2NF9kZWZjb25maWcKQEAgLTEsMjcgKzEsMjcgQEAKICMKICMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKLSMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4yOC1yYzQKLSMgTW9uIE5vdiAxMCAxMjozNTowOSAyMDA4CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMjgKKyMgRnJpIEphbiAgMiAxODoxNDoyNiAyMDA5CiAjCiBDT05GSUdfU1BBUkM9eQogQ09ORklHX1NQQVJDNjQ9eQorQ09ORklHX0FSQ0hfREVGQ09ORklHPSJhcmNoL3NwYXJjL2NvbmZpZ3Mvc3BhcmM2NF9kZWZjb25maWciCitDT05GSUdfQklUUz02NAorQ09ORklHXzY0QklUPXkKIENPTkZJR19HRU5FUklDX1RJTUU9eQogQ09ORklHX0dFTkVSSUNfQ01PU19VUERBVEU9eQogQ09ORklHX0dFTkVSSUNfQ0xPQ0tFVkVOVFM9eQotQ09ORklHXzY0QklUPXkKLUNPTkZJR19NTVU9eQogQ09ORklHX0lPTU1VX0hFTFBFUj15CiBDT05GSUdfUVVJQ0tMSVNUPXkKIENPTkZJR19TVEFDS1RSQUNFX1NVUFBPUlQ9eQogQ09ORklHX0xPQ0tERVBfU1VQUE9SVD15Ci1DT05GSUdfQVJDSF9NQVlfSEFWRV9QQ19GREM9eQotIyBDT05GSUdfQVJDSF9IQVNfSUxPRzJfVTMyIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfSEFTX0lMT0cyX1U2NCBpcyBub3Qgc2V0CitDT05GSUdfSEFWRV9MQVRFTkNZVE9QX1NVUFBPUlQ9eQogQ09ORklHX0FVRElUX0FSQ0g9eQogQ09ORklHX0hBVkVfU0VUVVBfUEVSX0NQVV9BUkVBPXkKK0NPTkZJR19HRU5FUklDX0hBUkRJUlFTX05PX19ET19JUlE9eQorQ09ORklHX01NVT15CiBDT05GSUdfQVJDSF9OT19WSVJUX1RPX0JVUz15CiBDT05GSUdfT0Y9eQotQ09ORklHX0dFTkVSSUNfSEFSRElSUVNfTk9fX0RPX0lSUT15CiBDT05GSUdfREVGQ09ORklHX0xJU1Q9Ii9saWIvbW9kdWxlcy8kVU5BTUVfUkVMRUFTRS8uY29uZmlnIgogCiAjCkBAIC04Niw2ICs4Niw3IEBACiBDT05GSUdfU0xVQj15CiAjIENPTkZJR19TTE9CIGlzIG5vdCBzZXQKIENPTkZJR19QUk9GSUxJTkc9eQorQ09ORklHX1RSQUNFUE9JTlRTPXkKICMgQ09ORklHX01BUktFUlMgaXMgbm90IHNldAogQ09ORklHX09QUk9GSUxFPW0KIENPTkZJR19IQVZFX09QUk9GSUxFPXkKQEAgLTEyNywzNCArMTI4LDQwIEBACiAjIENPTkZJR19ERUZBVUxUX05PT1AgaXMgbm90IHNldAogQ09ORklHX0RFRkFVTFRfSU9TQ0hFRD0iYW50aWNpcGF0b3J5IgogQ09ORklHX0NMQVNTSUNfUkNVPXkKKyMgQ09ORklHX1RSRUVfUkNVIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BSRUVNUFRfUkNVIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RSRUVfUkNVX1RSQUNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BSRUVNUFRfUkNVX1RSQUNFIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZSRUVaRVIgaXMgbm90IHNldAogCiAjCiAjIFByb2Nlc3NvciB0eXBlIGFuZCBmZWF0dXJlcwogIwotQ09ORklHX1NQQVJDNjRfUEFHRV9TSVpFXzhLQj15Ci0jIENPTkZJR19TUEFSQzY0X1BBR0VfU0laRV82NEtCIGlzIG5vdCBzZXQKLUNPTkZJR19TRUNDT01QPXkKK0NPTkZJR19TTVA9eQorQ09ORklHX05SX0NQVVM9NjQKIENPTkZJR19IWl8xMDA9eQogIyBDT05GSUdfSFpfMjUwIGlzIG5vdCBzZXQKICMgQ09ORklHX0haXzMwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19IWl8xMDAwIGlzIG5vdCBzZXQKIENPTkZJR19IWj0xMDAKIENPTkZJR19TQ0hFRF9IUlRJQ0s9eQorQ09ORklHX1JXU0VNX1hDSEdBRERfQUxHT1JJVEhNPXkKK0NPTkZJR19HRU5FUklDX0ZJTkRfTkVYVF9CSVQ9eQorQ09ORklHX0dFTkVSSUNfSFdFSUdIVD15CitDT05GSUdfR0VORVJJQ19DQUxJQlJBVEVfREVMQVk9eQorQ09ORklHX0FSQ0hfTUFZX0hBVkVfUENfRkRDPXkKK0NPTkZJR19TUEFSQzY0X1NNUD15CitDT05GSUdfU1BBUkM2NF9QQUdFX1NJWkVfOEtCPXkKKyMgQ09ORklHX1NQQVJDNjRfUEFHRV9TSVpFXzY0S0IgaXMgbm90IHNldAorQ09ORklHX1NFQ0NPTVA9eQogQ09ORklHX0hPVFBMVUdfQ1BVPXkKIENPTkZJR19HRU5FUklDX0hBUkRJUlFTPXkKIENPTkZJR19USUNLX09ORVNIT1Q9eQogQ09ORklHX05PX0haPXkKIENPTkZJR19ISUdIX1JFU19USU1FUlM9eQogQ09ORklHX0dFTkVSSUNfQ0xPQ0tFVkVOVFNfQlVJTEQ9eQotQ09ORklHX1NNUD15Ci1DT05GSUdfTlJfQ1BVUz02NAogIyBDT05GSUdfQ1BVX0ZSRVEgaXMgbm90IHNldAogQ09ORklHX1VTM19NQz15Ci1DT05GSUdfUldTRU1fWENIR0FERF9BTEdPUklUSE09eQotQ09ORklHX0dFTkVSSUNfRklORF9ORVhUX0JJVD15Ci1DT05GSUdfR0VORVJJQ19IV0VJR0hUPXkKLUNPTkZJR19HRU5FUklDX0NBTElCUkFURV9ERUxBWT15CiBDT05GSUdfSFVHRVRMQl9QQUdFX1NJWkVfNE1CPXkKICMgQ09ORklHX0hVR0VUTEJfUEFHRV9TSVpFXzUxMksgaXMgbm90IHNldAogIyBDT05GSUdfSFVHRVRMQl9QQUdFX1NJWkVfNjRLIGlzIG5vdCBzZXQKQEAgLTE4MywxMCArMTkwLDE4IEBACiBDT05GSUdfWk9ORV9ETUFfRkxBRz0wCiBDT05GSUdfTlJfUVVJQ0s9MQogQ09ORklHX1VORVZJQ1RBQkxFX0xSVT15CitDT05GSUdfU0NIRURfU01UPXkKK0NPTkZJR19TQ0hFRF9NQz15CisjIENPTkZJR19QUkVFTVBUX05PTkUgaXMgbm90IHNldAorQ09ORklHX1BSRUVNUFRfVk9MVU5UQVJZPXkKKyMgQ09ORklHX1BSRUVNUFQgaXMgbm90IHNldAorIyBDT05GSUdfQ01ETElORV9CT09MIGlzIG5vdCBzZXQKKworIworIyBCdXMgb3B0aW9ucyAoUENJIGV0Yy4pCisjCiBDT05GSUdfU0JVUz15CiBDT05GSUdfU0JVU0NIQVI9eQotQ09ORklHX1NVTl9BVVhJTz15Ci1DT05GSUdfU1VOX0lPPXkKIENPTkZJR19TVU5fTERPTVM9eQogQ09ORklHX1BDST15CiBDT05GSUdfUENJX0RPTUFJTlM9eQpAQCAtMTk1LDcgKzIxMCw5IEBACiBDT05GSUdfUENJX01TST15CiAjIENPTkZJR19QQ0lfTEVHQUNZIGlzIG5vdCBzZXQKICMgQ09ORklHX1BDSV9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19QQ0NBUkQgaXMgbm90IHNldAogQ09ORklHX1NVTl9PUEVOUFJPTUZTPW0KK0NPTkZJR19TUEFSQzY0X1BDST15CiAKICMKICMgRXhlY3V0YWJsZSBmaWxlIGZvcm1hdHMKQEAgLTIwNywxNyArMjI0LDEzIEBACiBDT05GSUdfQklORk1UX01JU0M9bQogQ09ORklHX0NPTVBBVD15CiBDT05GSUdfU1lTVklQQ19DT01QQVQ9eQotQ09ORklHX1NDSEVEX1NNVD15Ci1DT05GSUdfU0NIRURfTUM9eQotIyBDT05GSUdfUFJFRU1QVF9OT05FIGlzIG5vdCBzZXQKLUNPTkZJR19QUkVFTVBUX1ZPTFVOVEFSWT15Ci0jIENPTkZJR19QUkVFTVBUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NNRExJTkVfQk9PTCBpcyBub3Qgc2V0CiBDT05GSUdfTkVUPXkKIAogIwogIyBOZXR3b3JraW5nIG9wdGlvbnMKICMKKyMgQ09ORklHX05FVF9OUyBpcyBub3Qgc2V0CitDT05GSUdfQ09NUEFUX05FVF9ERVZfT1BTPXkKIENPTkZJR19QQUNLRVQ9eQogQ09ORklHX1BBQ0tFVF9NTUFQPXkKIENPTkZJR19VTklYPXkKQEAgLTMxNCw2ICszMjcsNyBAQAogIyBDT05GSUdfRUNPTkVUIGlzIG5vdCBzZXQKICMgQ09ORklHX1dBTl9ST1VURVIgaXMgbm90IHNldAogIyBDT05GSUdfTkVUX1NDSEVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RDQiBpcyBub3Qgc2V0CiAKICMKICMgTmV0d29yayB0ZXN0aW5nCkBAIC0zMzAsOCArMzQ0LDggQEAKICMgQ09ORklHX0NGRzgwMjExIGlzIG5vdCBzZXQKIENPTkZJR19XSVJFTEVTU19PTERfUkVHVUxBVE9SWT15CiAjIENPTkZJR19XSVJFTEVTU19FWFQgaXMgbm90IHNldAorIyBDT05GSUdfTElCODAyMTEgaXMgbm90IHNldAogIyBDT05GSUdfTUFDODAyMTEgaXMgbm90IHNldAotIyBDT05GSUdfSUVFRTgwMjExIGlzIG5vdCBzZXQKICMgQ09ORklHX1JGS0lMTCBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRfOVAgaXMgbm90IHNldAogCkBAIC0zNzgsOCArMzkyLDEwIEBACiAjIENPTkZJR19FRVBST01fOTNDWDYgaXMgbm90IHNldAogIyBDT05GSUdfU0dJX0lPQzQgaXMgbm90IHNldAogIyBDT05GSUdfVElGTV9DT1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lDUzkzMlM0MDEgaXMgbm90IHNldAogIyBDT05GSUdfRU5DTE9TVVJFX1NFUlZJQ0VTIGlzIG5vdCBzZXQKICMgQ09ORklHX0hQX0lMTyBpcyBub3Qgc2V0CisjIENPTkZJR19DMlBPUlQgaXMgbm90IHNldAogQ09ORklHX0hBVkVfSURFPXkKIENPTkZJR19JREU9eQogCkBAIC0zODcsNiArNDAzLDcgQEAKICMgUGxlYXNlIHNlZSBEb2N1bWVudGF0aW9uL2lkZS9pZGUudHh0IGZvciBoZWxwL2luZm8gb24gSURFIGRyaXZlcwogIwogQ09ORklHX0lERV9USU1JTkdTPXkKK0NPTkZJR19JREVfQVRBUEk9eQogIyBDT05GSUdfQkxLX0RFVl9JREVfU0FUQSBpcyBub3Qgc2V0CiBDT05GSUdfSURFX0dEPXkKIENPTkZJR19JREVfR0RfQVRBPXkKQEAgLTM5NCw3ICs0MTEsNiBAQAogQ09ORklHX0JMS19ERVZfSURFQ0Q9eQogQ09ORklHX0JMS19ERVZfSURFQ0RfVkVSQk9TRV9FUlJPUlM9eQogIyBDT05GSUdfQkxLX0RFVl9JREVUQVBFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfSURFU0NTSSBpcyBub3Qgc2V0CiAjIENPTkZJR19JREVfVEFTS19JT0NUTCBpcyBub3Qgc2V0CiBDT05GSUdfSURFX1BST0NfRlM9eQogCkBAIC00NzcsNiArNDkzLDcgQEAKICMgQ09ORklHX1NDU0lfU1JQX0FUVFJTIGlzIG5vdCBzZXQKIENPTkZJR19TQ1NJX0xPV0xFVkVMPXkKICMgQ09ORklHX0lTQ1NJX1RDUCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0NYR0IzX0lTQ1NJIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfM1dfWFhYWF9SQUlEIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfM1dfOVhYWCBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX0FDQVJEIGlzIG5vdCBzZXQKQEAgLTQ5MCw2ICs1MDcsOCBAQAogIyBDT05GSUdfTUVHQVJBSURfTEVHQUNZIGlzIG5vdCBzZXQKICMgQ09ORklHX01FR0FSQUlEX1NBUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX0hQVElPUCBpcyBub3Qgc2V0CisjIENPTkZJR19MSUJGQyBpcyBub3Qgc2V0CisjIENPTkZJR19GQ09FIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfRE1YMzE5MUQgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9GVVRVUkVfRE9NQUlOIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfSVBTIGlzIG5vdCBzZXQKQEAgLTU2NCw2ICs1ODMsOSBAQAogIyBDT05GSUdfQlJPQURDT01fUEhZIGlzIG5vdCBzZXQKICMgQ09ORklHX0lDUExVU19QSFkgaXMgbm90IHNldAogIyBDT05GSUdfUkVBTFRFS19QSFkgaXMgbm90IHNldAorIyBDT05GSUdfTkFUSU9OQUxfUEhZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NURTEwWFAgaXMgbm90IHNldAorIyBDT05GSUdfTFNJX0VUMTAxMUNfUEhZIGlzIG5vdCBzZXQKICMgQ09ORklHX01ESU9fQklUQkFORyBpcyBub3Qgc2V0CiBDT05GSUdfTkVUX0VUSEVSTkVUPXkKIENPTkZJR19NSUk9bQpAQCAtNTkwLDcgKzYxMiw2IEBACiAjIENPTkZJR19BREFQVEVDX1NUQVJGSVJFIGlzIG5vdCBzZXQKICMgQ09ORklHX0I0NCBpcyBub3Qgc2V0CiAjIENPTkZJR19GT1JDRURFVEggaXMgbm90IHNldAotIyBDT05GSUdfRUVQUk8xMDAgaXMgbm90IHNldAogIyBDT05GSUdfRTEwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19GRUFMTlggaXMgbm90IHNldAogIyBDT05GSUdfTkFUU0VNSSBpcyBub3Qgc2V0CkBAIC02MDAsNiArNjIxLDcgQEAKICMgQ09ORklHX1I2MDQwIGlzIG5vdCBzZXQKICMgQ09ORklHX1NJUzkwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19FUElDMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NNU0M5NDIwIGlzIG5vdCBzZXQKICMgQ09ORklHX1NVTkRBTkNFIGlzIG5vdCBzZXQKICMgQ09ORklHX1RMQU4gaXMgbm90IHNldAogIyBDT05GSUdfVklBX1JISU5FIGlzIG5vdCBzZXQKQEAgLTYyOSw2ICs2NTEsNyBAQAogIyBDT05GSUdfSk1FIGlzIG5vdCBzZXQKIENPTkZJR19ORVRERVZfMTAwMDA9eQogIyBDT05GSUdfQ0hFTFNJT19UMSBpcyBub3Qgc2V0CitDT05GSUdfQ0hFTFNJT19UM19ERVBFTkRTPXkKICMgQ09ORklHX0NIRUxTSU9fVDMgaXMgbm90IHNldAogIyBDT05GSUdfRU5JQyBpcyBub3Qgc2V0CiAjIENPTkZJR19JWEdCRSBpcyBub3Qgc2V0CkBAIC03NzgsNiArODAxLDcgQEAKIENPTkZJR19TRVJJQUxfQ09SRV9DT05TT0xFPXkKICMgQ09ORklHX1NFUklBTF9KU00gaXMgbm90IHNldAogQ09ORklHX1VOSVg5OF9QVFlTPXkKKyMgQ09ORklHX0RFVlBUU19NVUxUSVBMRV9JTlNUQU5DRVMgaXMgbm90IHNldAogIyBDT05GSUdfTEVHQUNZX1BUWVMgaXMgbm90IHNldAogIyBDT05GSUdfSVBNSV9IQU5ETEVSIGlzIG5vdCBzZXQKIENPTkZJR19IV19SQU5ET009bQpAQCAtODcwLDYgKzg5NCw3IEBACiAjIENPTkZJR19TRU5TT1JTX0FETTEwMjkgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19BRE0xMDMxIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfQURNOTI0MCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FEVDc0NjIgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19BRFQ3NDcwIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfQURUNzQ3MyBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0FUWFAxIGlzIG5vdCBzZXQKQEAgLTkxOSwxMSArOTQ0LDExIEBACiAjIENPTkZJR19USEVSTUFMIGlzIG5vdCBzZXQKICMgQ09ORklHX1RIRVJNQUxfSFdNT04gaXMgbm90IHNldAogIyBDT05GSUdfV0FUQ0hET0cgaXMgbm90IHNldAorQ09ORklHX1NTQl9QT1NTSUJMRT15CiAKICMKICMgU29uaWNzIFNpbGljb24gQmFja3BsYW5lCiAjCi1DT05GSUdfU1NCX1BPU1NJQkxFPXkKICMgQ09ORklHX1NTQiBpcyBub3Qgc2V0CiAKICMKQEAgLTEwNzEsNiArMTA5Niw3IEBACiBDT05GSUdfU05EX1BDTV9PU1M9bQogQ09ORklHX1NORF9QQ01fT1NTX1BMVUdJTlM9eQogQ09ORklHX1NORF9TRVFVRU5DRVJfT1NTPXkKKyMgQ09ORklHX1NORF9IUlRJTUVSIGlzIG5vdCBzZXQKICMgQ09ORklHX1NORF9EWU5BTUlDX01JTk9SUyBpcyBub3Qgc2V0CiBDT05GSUdfU05EX1NVUFBPUlRfT0xEX0FQST15CiBDT05GSUdfU05EX1ZFUkJPU0VfUFJPQ0ZTPXkKQEAgLTEyNDIsMTEgKzEyNjgsMTEgQEAKICMgQ09ORklHX1VTQl9UTUMgaXMgbm90IHNldAogCiAjCi0jIE5PVEU6IFVTQl9TVE9SQUdFIGVuYWJsZXMgU0NTSSwgYW5kICdTQ1NJIGRpc2sgc3VwcG9ydCcKKyMgTk9URTogVVNCX1NUT1JBR0UgZGVwZW5kcyBvbiBTQ1NJIGJ1dCBCTEtfREVWX1NEIG1heSBhbHNvIGJlIG5lZWRlZDsKICMKIAogIwotIyBtYXkgYWxzbyBiZSBuZWVkZWQ7IHNlZSBVU0JfU1RPUkFHRSBIZWxwIGZvciBtb3JlIGluZm9ybWF0aW9uCisjIHNlZSBVU0JfU1RPUkFHRSBIZWxwIGZvciBtb3JlIGluZm9ybWF0aW9uCiAjCiBDT05GSUdfVVNCX1NUT1JBR0U9bQogIyBDT05GSUdfVVNCX1NUT1JBR0VfREVCVUcgaXMgbm90IHNldApAQCAtMTMzNyw2ICsxMzYzLDcgQEAKICMgQ09ORklHX1JUQ19EUlZfTTQxVDgwIGlzIG5vdCBzZXQKICMgQ09ORklHX1JUQ19EUlZfUzM1MzkwQSBpcyBub3Qgc2V0CiAjIENPTkZJR19SVENfRFJWX0ZNMzEzMCBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1JYODU4MSBpcyBub3Qgc2V0CiAKICMKICMgU1BJIFJUQyBkcml2ZXJzCkBAIC0xMzY1LDcgKzEzOTIsNiBAQAogIyBDT05GSUdfRE1BREVWSUNFUyBpcyBub3Qgc2V0CiAjIENPTkZJR19VSU8gaXMgbm90IHNldAogIyBDT05GSUdfU1RBR0lORyBpcyBub3Qgc2V0Ci1DT05GSUdfU1RBR0lOR19FWENMVURFX0JVSUxEPXkKIAogIwogIyBNaXNjIExpbnV4L1NQQVJDIGRyaXZlcnMKQEAgLTE1NDQsNiArMTU3MCw3IEBACiAjIENPTkZJR19MT0NLX1NUQVQgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfU1BJTkxPQ0tfU0xFRVAgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfTE9DS0lOR19BUElfU0VMRlRFU1RTIGlzIG5vdCBzZXQKK0NPTkZJR19TVEFDS1RSQUNFPXkKICMgQ09ORklHX0RFQlVHX0tPQkpFQ1QgaXMgbm90IHNldAogQ09ORklHX0RFQlVHX0JVR1ZFUkJPU0U9eQogIyBDT05GSUdfREVCVUdfSU5GTyBpcyBub3Qgc2V0CkBAIC0xNTUyLDYgKzE1NzksNyBAQAogQ09ORklHX0RFQlVHX01FTU9SWV9JTklUPXkKICMgQ09ORklHX0RFQlVHX0xJU1QgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfU0cgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfTk9USUZJRVJTIGlzIG5vdCBzZXQKICMgQ09ORklHX0JPT1RfUFJJTlRLX0RFTEFZIGlzIG5vdCBzZXQKICMgQ09ORklHX1JDVV9UT1JUVVJFX1RFU1QgaXMgbm90IHNldAogIyBDT05GSUdfUkNVX0NQVV9TVEFMTF9ERVRFQ1RPUiBpcyBub3Qgc2V0CkBAIC0xNTYwLDggKzE1ODgsMTIgQEAKICMgQ09ORklHX0RFQlVHX0JMT0NLX0VYVF9ERVZUIGlzIG5vdCBzZXQKICMgQ09ORklHX0xLRFRNIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZBVUxUX0lOSkVDVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19MQVRFTkNZVE9QIGlzIG5vdCBzZXQKIENPTkZJR19TWVNDVExfU1lTQ0FMTF9DSEVDSz15CitDT05GSUdfTk9QX1RSQUNFUj15CiBDT05GSUdfSEFWRV9GVU5DVElPTl9UUkFDRVI9eQorQ09ORklHX1JJTkdfQlVGRkVSPXkKK0NPTkZJR19UUkFDSU5HPXkKIAogIwogIyBUcmFjZXJzCkBAIC0xNTcxLDcgKzE2MDMsOSBAQAogIyBDT05GSUdfU0NIRURfVFJBQ0VSIGlzIG5vdCBzZXQKICMgQ09ORklHX0NPTlRFWFRfU1dJVENIX1RSQUNFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19CT09UX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19UUkFDRV9CUkFOQ0hfUFJPRklMSU5HIGlzIG5vdCBzZXQKICMgQ09ORklHX1NUQUNLX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19GVFJBQ0VfU1RBUlRVUF9URVNUIGlzIG5vdCBzZXQKICMgQ09ORklHX0RZTkFNSUNfUFJJTlRLX0RFQlVHIGlzIG5vdCBzZXQKICMgQ09ORklHX1NBTVBMRVMgaXMgbm90IHNldAogQ09ORklHX0hBVkVfQVJDSF9LR0RCPXkKQEAgLTE2MDAsMTEgKzE2MzQsMTYgQEAKICMKICMgQ09ORklHX0NSWVBUT19GSVBTIGlzIG5vdCBzZXQKIENPTkZJR19DUllQVE9fQUxHQVBJPXkKK0NPTkZJR19DUllQVE9fQUxHQVBJMj15CiBDT05GSUdfQ1JZUFRPX0FFQUQ9eQorQ09ORklHX0NSWVBUT19BRUFEMj15CiBDT05GSUdfQ1JZUFRPX0JMS0NJUEhFUj15CitDT05GSUdfQ1JZUFRPX0JMS0NJUEhFUjI9eQogQ09ORklHX0NSWVBUT19IQVNIPXkKLUNPTkZJR19DUllQVE9fUk5HPXkKK0NPTkZJR19DUllQVE9fSEFTSDI9eQorQ09ORklHX0NSWVBUT19STkcyPXkKIENPTkZJR19DUllQVE9fTUFOQUdFUj15CitDT05GSUdfQ1JZUFRPX01BTkFHRVIyPXkKIENPTkZJR19DUllQVE9fR0YxMjhNVUw9bQogQ09ORklHX0NSWVBUT19OVUxMPW0KICMgQ09ORklHX0NSWVBUT19DUllQVEQgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9LYnVpbGQgYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL0tidWlsZAppbmRleCA4OWMyNjBhLi45NWUzOGE0IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL0tidWlsZAorKysgYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL0tidWlsZApAQCAtMSwyMSArMSw2IEBACiAjIFVzZXIgZXhwb3J0ZWQgc3BhcmMgaGVhZGVyIGZpbGVzCiBpbmNsdWRlIGluY2x1ZGUvYXNtLWdlbmVyaWMvS2J1aWxkLmFzbQogCi1oZWFkZXIteSArPSBpcGNidWZfMzIuaAotaGVhZGVyLXkgKz0gaXBjYnVmXzY0LmgKLWhlYWRlci15ICs9IHBvc2l4X3R5cGVzXzMyLmgKLWhlYWRlci15ICs9IHBvc2l4X3R5cGVzXzY0LmgKLWhlYWRlci15ICs9IHB0cmFjZV8zMi5oCi1oZWFkZXIteSArPSBwdHJhY2VfNjQuaAotaGVhZGVyLXkgKz0gc2lnY29udGV4dF8zMi5oCi1oZWFkZXIteSArPSBzaWdjb250ZXh0XzY0LmgKLWhlYWRlci15ICs9IHNpZ2luZm9fMzIuaAotaGVhZGVyLXkgKz0gc2lnaW5mb182NC5oCi1oZWFkZXIteSArPSBzaWduYWxfMzIuaAotaGVhZGVyLXkgKz0gc2lnbmFsXzY0LmgKLWhlYWRlci15ICs9IHN0YXRfMzIuaAotaGVhZGVyLXkgKz0gc3RhdF82NC5oCi0KIGhlYWRlci15ICs9IGFwYy5oCiBoZWFkZXIteSArPSBhc2kuaAogaGVhZGVyLXkgKz0gZGlzcGxheTdzZWcuaApAQCAtMjMsMTcgKzgsMTMgQEAKIGhlYWRlci15ICs9IGZiaW8uaAogaGVhZGVyLXkgKz0ganNmbGFzaC5oCiBoZWFkZXIteSArPSBvcGVucHJvbS5oCi1oZWFkZXIteSArPSBvcGVucHJvbV8zMi5oCi1oZWFkZXIteSArPSBvcGVucHJvbV82NC5oCiBoZWFkZXIteSArPSBvcGVucHJvbWlvLmgKIGhlYWRlci15ICs9IHBlcmZjdHIuaAogaGVhZGVyLXkgKz0gcHNyY29tcGF0LmgKIGhlYWRlci15ICs9IHBzci5oCiBoZWFkZXIteSArPSBwc3RhdGUuaAotaGVhZGVyLXkgKz0gcmVnLmgKLWhlYWRlci15ICs9IHJlZ18zMi5oCi1oZWFkZXIteSArPSByZWdfNjQuaAogaGVhZGVyLXkgKz0gdHJhcHMuaAogaGVhZGVyLXkgKz0gdWN0eC5oCiBoZWFkZXIteSArPSB1dHJhcC5oCiBoZWFkZXIteSArPSB3YXRjaGRvZy5oCitoZWFkZXIteSArPSBzd2FiLmgKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vYXRvbWljXzMyLmggYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL2F0b21pY18zMi5oCmluZGV4IDVjOTQ0YjUuLmNlNDY1OTcgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vYXRvbWljXzMyLmgKKysrIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9hdG9taWNfMzIuaApAQCAtMTMsOCArMTMsNiBAQAogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KIAotdHlwZWRlZiBzdHJ1Y3QgeyB2b2xhdGlsZSBpbnQgY291bnRlcjsgfSBhdG9taWNfdDsKLQogI2lmZGVmIF9fS0VSTkVMX18KIAogI2RlZmluZSBBVE9NSUNfSU5JVChpKSAgeyAoaSkgfQpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9hdG9taWNfNjQuaCBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vYXRvbWljXzY0LmgKaW5kZXggNTk4MmM1YS4uYTBhNzA2NCAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9hdG9taWNfNjQuaAorKysgYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL2F0b21pY182NC5oCkBAIC0xMCw5ICsxMCw2IEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAKLXR5cGVkZWYgc3RydWN0IHsgdm9sYXRpbGUgaW50IGNvdW50ZXI7IH0gYXRvbWljX3Q7Ci10eXBlZGVmIHN0cnVjdCB7IHZvbGF0aWxlIF9fczY0IGNvdW50ZXI7IH0gYXRvbWljNjRfdDsKLQogI2RlZmluZSBBVE9NSUNfSU5JVChpKQkJeyAoaSkgfQogI2RlZmluZSBBVE9NSUM2NF9JTklUKGkpCXsgKGkpIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9ieXRlb3JkZXIuaCBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vYnl0ZW9yZGVyLmgKaW5kZXggNWE3MGYxMy4uNDhhMDQ3YyAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9ieXRlb3JkZXIuaAorKysgYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL2J5dGVvcmRlci5oCkBAIC0xLDUxICsxLDcgQEAKICNpZm5kZWYgX1NQQVJDX0JZVEVPUkRFUl9ICiAjZGVmaW5lIF9TUEFSQ19CWVRFT1JERVJfSAogCi0jaW5jbHVkZSA8YXNtL3R5cGVzLmg+Ci0jaW5jbHVkZSA8YXNtL2FzaS5oPgotCi0jZGVmaW5lIF9fQklHX0VORElBTgotCi0jaWZkZWYgQ09ORklHX1NQQVJDMzIKLSNkZWZpbmUgX19TV0FCXzY0X1RIUlVfMzJfXwotI2VuZGlmCi0KLSNpZmRlZiBDT05GSUdfU1BBUkM2NAotc3RhdGljIGlubGluZSBfX3UxNiBfX2FyY2hfc3dhYjE2cChjb25zdCBfX3UxNiAqYWRkcikKLXsKLQlfX3UxNiByZXQ7Ci0KLQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImxkdWhhIFslMV0gJTIsICUwIgotCQkJICAgICAgOiAiPXIiIChyZXQpCi0JCQkgICAgICA6ICJyIiAoYWRkciksICJpIiAoQVNJX1BMKSk7Ci0JcmV0dXJuIHJldDsKLX0KLSNkZWZpbmUgX19hcmNoX3N3YWIxNnAgX19hcmNoX3N3YWIxNnAKLQotc3RhdGljIGlubGluZSBfX3UzMiBfX2FyY2hfc3dhYjMycChjb25zdCBfX3UzMiAqYWRkcikKLXsKLQlfX3UzMiByZXQ7Ci0KLQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImxkdXdhIFslMV0gJTIsICUwIgotCQkJICAgICAgOiAiPXIiIChyZXQpCi0JCQkgICAgICA6ICJyIiAoYWRkciksICJpIiAoQVNJX1BMKSk7Ci0JcmV0dXJuIHJldDsKLX0KLSNkZWZpbmUgX19hcmNoX3N3YWIzMnAgX19hcmNoX3N3YWIzMnAKLQotc3RhdGljIGlubGluZSBfX3U2NCBfX2FyY2hfc3dhYjY0cChjb25zdCBfX3U2NCAqYWRkcikKLXsKLQlfX3U2NCByZXQ7Ci0KLQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImxkeGEgWyUxXSAlMiwgJTAiCi0JCQkgICAgICA6ICI9ciIgKHJldCkKLQkJCSAgICAgIDogInIiIChhZGRyKSwgImkiIChBU0lfUEwpKTsKLQlyZXR1cm4gcmV0OwotfQotI2RlZmluZSBfX2FyY2hfc3dhYjY0cCBfX2FyY2hfc3dhYjY0cAotCi0jZW5kaWYgLyogQ09ORklHX1NQQVJDNjQgKi8KLQotI2luY2x1ZGUgPGxpbnV4L2J5dGVvcmRlci5oPgorI2luY2x1ZGUgPGFzbS9zd2FiLmg+CisjaW5jbHVkZSA8bGludXgvYnl0ZW9yZGVyL2JpZ19lbmRpYW4uaD4KIAogI2VuZGlmIC8qIF9TUEFSQ19CWVRFT1JERVJfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9pcGNidWYuaCBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vaXBjYnVmLmgKaW5kZXggMTdkNmVmNy4uNjYwMTNiNCAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9pcGNidWYuaAorKysgYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL2lwY2J1Zi5oCkBAIC0xLDggKzEsMzIgQEAKLSNpZm5kZWYgX19fQVNNX1NQQVJDX0lQQ0JVRl9ICi0jZGVmaW5lIF9fX0FTTV9TUEFSQ19JUENCVUZfSAotI2lmIGRlZmluZWQoX19zcGFyY19fKSAmJiBkZWZpbmVkKF9fYXJjaDY0X18pCi0jaW5jbHVkZSA8YXNtL2lwY2J1Zl82NC5oPgotI2Vsc2UKLSNpbmNsdWRlIDxhc20vaXBjYnVmXzMyLmg+CisjaWZuZGVmIF9fU1BBUkNfSVBDQlVGX0gKKyNkZWZpbmUgX19TUEFSQ19JUENCVUZfSAorCisvKgorICogVGhlIGlwYzY0X3Blcm0gc3RydWN0dXJlIGZvciBzcGFyYy9zcGFyYzY0IGFyY2hpdGVjdHVyZS4KKyAqIE5vdGUgZXh0cmEgcGFkZGluZyBiZWNhdXNlIHRoaXMgc3RydWN0dXJlIGlzIHBhc3NlZCBiYWNrIGFuZCBmb3J0aAorICogYmV0d2VlbiBrZXJuZWwgYW5kIHVzZXIgc3BhY2UuCisgKgorICogUGFkIHNwYWNlIGlzIGxlZnQgZm9yOgorICogLSAzMi1iaXQgc2VxCisgKiAtIG9uIHNwYXJjIGZvciAzMiBiaXQgbW9kZSAoaXQgaXMgMzIgYml0IG9uIHNwYXJjNjQpCisgKiAtIDIgbWlzY2VsbGFuZW91cyA2NC1iaXQgdmFsdWVzCisgKi8KKworc3RydWN0IGlwYzY0X3Blcm0KK3sKKwlfX2tlcm5lbF9rZXlfdAlrZXk7CisJX19rZXJuZWxfdWlkX3QJdWlkOworCV9fa2VybmVsX2dpZF90CWdpZDsKKwlfX2tlcm5lbF91aWRfdAljdWlkOworCV9fa2VybmVsX2dpZF90CWNnaWQ7CisjaWZuZGVmIF9fYXJjaDY0X18KKwl1bnNpZ25lZCBzaG9ydAlfX3BhZDA7CiAjZW5kaWYKLSNlbmRpZgorCV9fa2VybmVsX21vZGVfdAltb2RlOworCXVuc2lnbmVkIHNob3J0CV9fcGFkMTsKKwl1bnNpZ25lZCBzaG9ydAlzZXE7CisJdW5zaWduZWQgbG9uZyBsb25nIF9fdW51c2VkMTsKKwl1bnNpZ25lZCBsb25nIGxvbmcgX191bnVzZWQyOworfTsKKworI2VuZGlmIC8qIF9fU1BBUkNfSVBDQlVGX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vaXBjYnVmXzMyLmggYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL2lwY2J1Zl8zMi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Mzg3MjA5Li4wMDAwMDAwCi0tLSBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vaXBjYnVmXzMyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0jaWZuZGVmIF9TUEFSQ19JUENCVUZfSAotI2RlZmluZSBfU1BBUkNfSVBDQlVGX0gKLQotLyoKLSAqIFRoZSBpcGM2NF9wZXJtIHN0cnVjdHVyZSBmb3Igc3BhcmMgYXJjaGl0ZWN0dXJlLgotICogTm90ZSBleHRyYSBwYWRkaW5nIGJlY2F1c2UgdGhpcyBzdHJ1Y3R1cmUgaXMgcGFzc2VkIGJhY2sgYW5kIGZvcnRoCi0gKiBiZXR3ZWVuIGtlcm5lbCBhbmQgdXNlciBzcGFjZS4KLSAqCi0gKiBQYWQgc3BhY2UgaXMgbGVmdCBmb3I6Ci0gKiAtIDMyLWJpdCBtb2RlCi0gKiAtIDMyLWJpdCBzZXEKLSAqIC0gMiBtaXNjZWxsYW5lb3VzIDY0LWJpdCB2YWx1ZXMgKHNvIHRoYXQgdGhpcyBzdHJ1Y3R1cmUgbWF0Y2hlcwotICoJCQkJICAgIHNwYXJjNjQgaXBjNjRfcGVybSkKLSAqLwotCi1zdHJ1Y3QgaXBjNjRfcGVybQotewotCV9fa2VybmVsX2tleV90CQlrZXk7Ci0JX19rZXJuZWxfdWlkMzJfdAl1aWQ7Ci0JX19rZXJuZWxfZ2lkMzJfdAlnaWQ7Ci0JX19rZXJuZWxfdWlkMzJfdAljdWlkOwotCV9fa2VybmVsX2dpZDMyX3QJY2dpZDsKLQl1bnNpZ25lZCBzaG9ydAkJX19wYWQxOwotCV9fa2VybmVsX21vZGVfdAkJbW9kZTsKLQl1bnNpZ25lZCBzaG9ydAkJX19wYWQyOwotCXVuc2lnbmVkIHNob3J0CQlzZXE7Ci0JdW5zaWduZWQgbG9uZyBsb25nCV9fdW51c2VkMTsKLQl1bnNpZ25lZCBsb25nIGxvbmcJX191bnVzZWQyOwotfTsKLQotI2VuZGlmIC8qIF9TUEFSQ19JUENCVUZfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9pcGNidWZfNjQuaCBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vaXBjYnVmXzY0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0NGI4NTUuLjAwMDAwMDAKLS0tIGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9pcGNidWZfNjQuaAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLSNpZm5kZWYgX1NQQVJDNjRfSVBDQlVGX0gKLSNkZWZpbmUgX1NQQVJDNjRfSVBDQlVGX0gKLQotLyoKLSAqIFRoZSBpcGM2NF9wZXJtIHN0cnVjdHVyZSBmb3Igc3BhcmM2NCBhcmNoaXRlY3R1cmUuCi0gKiBOb3RlIGV4dHJhIHBhZGRpbmcgYmVjYXVzZSB0aGlzIHN0cnVjdHVyZSBpcyBwYXNzZWQgYmFjayBhbmQgZm9ydGgKLSAqIGJldHdlZW4ga2VybmVsIGFuZCB1c2VyIHNwYWNlLgotICoKLSAqIFBhZCBzcGFjZSBpcyBsZWZ0IGZvcjoKLSAqIC0gMzItYml0IHNlcQotICogLSAyIG1pc2NlbGxhbmVvdXMgNjQtYml0IHZhbHVlcwotICovCi0KLXN0cnVjdCBpcGM2NF9wZXJtCi17Ci0JX19rZXJuZWxfa2V5X3QJa2V5OwotCV9fa2VybmVsX3VpZF90CXVpZDsKLQlfX2tlcm5lbF9naWRfdAlnaWQ7Ci0JX19rZXJuZWxfdWlkX3QJY3VpZDsKLQlfX2tlcm5lbF9naWRfdAljZ2lkOwotCV9fa2VybmVsX21vZGVfdAltb2RlOwotCXVuc2lnbmVkIHNob3J0CV9fcGFkMTsKLQl1bnNpZ25lZCBzaG9ydAlzZXE7Ci0JdW5zaWduZWQgbG9uZwlfX3VudXNlZDE7Ci0JdW5zaWduZWQgbG9uZwlfX3VudXNlZDI7Ci19OwotCi0jZW5kaWYgLyogX1NQQVJDNjRfSVBDQlVGX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vanNmbGFzaC5oIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9qc2ZsYXNoLmgKaW5kZXggMzQ1N2YyOS4uMDcxN2Q5ZSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9qc2ZsYXNoLmgKKysrIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9qc2ZsYXNoLmgKQEAgLTgsNyArOCw3IEBACiAjZGVmaW5lIF9TUEFSQ19KU0ZMQVNIX0gKIAogI2lmbmRlZiBfU1BBUkNfVFlQRVNfSAotI2luY2x1ZGUgPGFzbS90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjZW5kaWYKIAogLyoKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vb3BlbnByb20uaCBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vb3BlbnByb20uaAppbmRleCBhYWVhZTkwNS4uOTYzZTFhNCAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9vcGVucHJvbS5oCisrKyBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vb3BlbnByb20uaApAQCAtMSw4ICsxLDI3NyBAQAotI2lmbmRlZiBfX19BU01fU1BBUkNfT1BFTlBST01fSAotI2RlZmluZSBfX19BU01fU1BBUkNfT1BFTlBST01fSAorI2lmbmRlZiBfX1NQQVJDX09QRU5QUk9NX0gKKyNkZWZpbmUgX19TUEFSQ19PUEVOUFJPTV9ICisKKy8qIG9wZW5wcm9tLmg6ICBQcm9tIHN0cnVjdHVyZXMgYW5kIGRlZmluZXMgZm9yIGFjY2VzcyB0byB0aGUgT1BFTkJPT1QKKyAqICAgICAgICAgICAgICBwcm9tIHJvdXRpbmVzIGFuZCBkYXRhIGFyZWFzLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NSwxOTk2IERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AY2FpcC5ydXRnZXJzLmVkdSkKKyAqLworCisvKiBFbXBpcmljYWwgY29uc3RhbnRzLi4uICovCisjZGVmaW5lIExJTlVYX09QUFJPTV9NQUdJQyAgICAgIDB4MTAwMTA0MDcKKworI2lmbmRlZiBfX0FTU0VNQkxZX18KKy8qIFYwIHByb20gZGV2aWNlIG9wZXJhdGlvbnMuICovCitzdHJ1Y3QgbGludXhfZGV2X3YwX2Z1bmNzIHsKKwlpbnQgKCp2MF9kZXZvcGVuKShjaGFyICpkZXZpY2Vfc3RyKTsKKwlpbnQgKCp2MF9kZXZjbG9zZSkoaW50IGRldl9kZXNjKTsKKwlpbnQgKCp2MF9yZGJsa2RldikoaW50IGRldl9kZXNjLCBpbnQgbnVtX2Jsa3MsIGludCBibGtfc3QsIGNoYXIgKmJ1Zik7CisJaW50ICgqdjBfd3JibGtkZXYpKGludCBkZXZfZGVzYywgaW50IG51bV9ibGtzLCBpbnQgYmxrX3N0LCBjaGFyICpidWYpOworCWludCAoKnYwX3dybmV0ZGV2KShpbnQgZGV2X2Rlc2MsIGludCBudW1fYnl0ZXMsIGNoYXIgKmJ1Zik7CisJaW50ICgqdjBfcmRuZXRkZXYpKGludCBkZXZfZGVzYywgaW50IG51bV9ieXRlcywgY2hhciAqYnVmKTsKKwlpbnQgKCp2MF9yZGNoYXJkZXYpKGludCBkZXZfZGVzYywgaW50IG51bV9ieXRlcywgaW50IGR1bW15LCBjaGFyICpidWYpOworCWludCAoKnYwX3dyY2hhcmRldikoaW50IGRldl9kZXNjLCBpbnQgbnVtX2J5dGVzLCBpbnQgZHVtbXksIGNoYXIgKmJ1Zik7CisJaW50ICgqdjBfc2Vla2RldikoaW50IGRldl9kZXNjLCBsb25nIGxvZ2ljYWxfb2Zmc3QsIGludCBmcm9tKTsKK307CisKKy8qIFYyIGFuZCBsYXRlciBwcm9tIGRldmljZSBvcGVyYXRpb25zLiAqLworc3RydWN0IGxpbnV4X2Rldl92Ml9mdW5jcyB7CisJaW50ICgqdjJfaW5zdDJwa2cpKGludCBkKTsJLyogQ29udmVydCBpaGFuZGxlIHRvIHBoYW5kbGUgKi8KKwljaGFyICogKCp2Ml9kdW1iX21lbV9hbGxvYykoY2hhciAqdmEsIHVuc2lnbmVkIHN6KTsKKwl2b2lkICgqdjJfZHVtYl9tZW1fZnJlZSkoY2hhciAqdmEsIHVuc2lnbmVkIHN6KTsKKworCS8qIFRvIG1hcCBkZXZpY2VzIGludG8gdmlydHVhbCBJL08gc3BhY2UuICovCisJY2hhciAqICgqdjJfZHVtYl9tbWFwKShjaGFyICp2aXJ0YSwgaW50IHdoaWNoX2lvLCB1bnNpZ25lZCBwYWRkciwgdW5zaWduZWQgc3opOworCXZvaWQgKCp2Ml9kdW1iX211bm1hcCkoY2hhciAqdmlydGEsIHVuc2lnbmVkIHNpemUpOworCisJaW50ICgqdjJfZGV2X29wZW4pKGNoYXIgKmRldnBhdGgpOworCXZvaWQgKCp2Ml9kZXZfY2xvc2UpKGludCBkKTsKKwlpbnQgKCp2Ml9kZXZfcmVhZCkoaW50IGQsIGNoYXIgKmJ1ZiwgaW50IG5ieXRlcyk7CisJaW50ICgqdjJfZGV2X3dyaXRlKShpbnQgZCwgY2hhciAqYnVmLCBpbnQgbmJ5dGVzKTsKKwlpbnQgKCp2Ml9kZXZfc2VlaykoaW50IGQsIGludCBoaSwgaW50IGxvKTsKKworCS8qIE5ldmVyIGlzc3VlZCAobXVsdGlzdGFnZSBsb2FkIHN1cHBvcnQpICovCisJdm9pZCAoKnYyX3doZWVlMikodm9pZCk7CisJdm9pZCAoKnYyX3doZWVlMykodm9pZCk7Cit9OworCitzdHJ1Y3QgbGludXhfbWxpc3RfdjAgeworCXN0cnVjdCBsaW51eF9tbGlzdF92MCAqdGhlcmVzX21vcmU7CisJdW5zaWduZWQgaW50IHN0YXJ0X2FkcjsKKwl1bnNpZ25lZCBudW1fYnl0ZXM7Cit9OworCitzdHJ1Y3QgbGludXhfbWVtX3YwIHsKKwlzdHJ1Y3QgbGludXhfbWxpc3RfdjAgKip2MF90b3RwaHlzOworCXN0cnVjdCBsaW51eF9tbGlzdF92MCAqKnYwX3Byb21tYXA7CisJc3RydWN0IGxpbnV4X21saXN0X3YwICoqdjBfYXZhaWxhYmxlOyAvKiBXaGF0IHdlIGNhbiB1c2UgKi8KK307CisKKy8qIEFyZ3VtZW50cyBzZW50IHRvIHRoZSBrZXJuZWwgZnJvbSB0aGUgYm9vdCBwcm9tcHQuICovCitzdHJ1Y3QgbGludXhfYXJndW1lbnRzX3YwIHsKKwljaGFyICphcmd2WzhdOworCWNoYXIgYXJnc1sxMDBdOworCWNoYXIgYm9vdF9kZXZbMl07CisJaW50IGJvb3RfZGV2X2N0cmw7CisJaW50IGJvb3RfZGV2X3VuaXQ7CisJaW50IGRldl9wYXJ0aXRpb247CisJY2hhciAqa2VybmVsX2ZpbGVfbmFtZTsKKwl2b2lkICphaWVlZTE7ICAgICAgICAgICAvKiBYWFggKi8KK307CisKKy8qIFYyIGFuZCB1cCBib290IHRoaW5ncy4gKi8KK3N0cnVjdCBsaW51eF9ib290YXJnc192MiB7CisJY2hhciAqKmJvb3RwYXRoOworCWNoYXIgKipib290YXJnczsKKwlpbnQgKmZkX3N0ZGluOworCWludCAqZmRfc3Rkb3V0OworfTsKKworLyogVGhlIHRvcCBsZXZlbCBQUk9NIHZlY3Rvci4gKi8KK3N0cnVjdCBsaW51eF9yb212ZWMgeworCS8qIFZlcnNpb24gbnVtYmVycy4gKi8KKwl1bnNpZ25lZCBpbnQgcHZfbWFnaWNfY29va2llOworCXVuc2lnbmVkIGludCBwdl9yb212ZXJzOworCXVuc2lnbmVkIGludCBwdl9wbHVnaW5fcmV2aXNpb247CisJdW5zaWduZWQgaW50IHB2X3ByaW50cmV2OworCisJLyogVmVyc2lvbiAwIG1lbW9yeSBkZXNjcmlwdG9ycy4gKi8KKwlzdHJ1Y3QgbGludXhfbWVtX3YwIHB2X3YwbWVtOworCisJLyogTm9kZSBvcGVyYXRpb25zLiAqLworCXN0cnVjdCBsaW51eF9ub2Rlb3BzICpwdl9ub2Rlb3BzOworCisJY2hhciAqKnB2X2Jvb3RzdHI7CisJc3RydWN0IGxpbnV4X2Rldl92MF9mdW5jcyBwdl92MGRldm9wczsKKworCWNoYXIgKnB2X3N0ZGluOworCWNoYXIgKnB2X3N0ZG91dDsKKyNkZWZpbmUJUFJPTURFVl9LQkQJMAkJLyogaW5wdXQgZnJvbSBrZXlib2FyZCAqLworI2RlZmluZQlQUk9NREVWX1NDUkVFTgkwCQkvKiBvdXRwdXQgdG8gc2NyZWVuICovCisjZGVmaW5lCVBST01ERVZfVFRZQQkxCQkvKiBpbi9vdXQgdG8gdHR5YSAqLworI2RlZmluZQlQUk9NREVWX1RUWUIJMgkJLyogaW4vb3V0IHRvIHR0eWIgKi8KKworCS8qIEJsb2NraW5nIGdldGNoYXIvcHV0Y2hhci4gIE5PVCBSRUVOVFJBTlQhIChncnIpICovCisJaW50ICgqcHZfZ2V0Y2hhcikodm9pZCk7CisJdm9pZCAoKnB2X3B1dGNoYXIpKGludCBjaCk7CisKKwkvKiBOb24tYmxvY2tpbmcgdmFyaWFudHMuICovCisJaW50ICgqcHZfbmJnZXRjaGFyKSh2b2lkKTsKKwlpbnQgKCpwdl9uYnB1dGNoYXIpKGludCBjaCk7CisKKwl2b2lkICgqcHZfcHV0c3RyKShjaGFyICpzdHIsIGludCBsZW4pOworCisJLyogTWlzY2VsbGFueS4gKi8KKwl2b2lkICgqcHZfcmVib290KShjaGFyICpib290c3RyKTsKKwl2b2lkICgqcHZfcHJpbnRmKShfX2NvbnN0X18gY2hhciAqZm10LCAuLi4pOworCXZvaWQgKCpwdl9hYm9ydCkodm9pZCk7CisJX192b2xhdGlsZV9fIGludCAqcHZfdGlja3M7CisJdm9pZCAoKnB2X2hhbHQpKHZvaWQpOworCXZvaWQgKCoqcHZfc3luY2hvb2spKHZvaWQpOworCisJLyogRXZhbHVhdGUgYSBmb3J0aCBzdHJpbmcsIG5vdCBkaWZmZXJlbnQgcHJvdG8gZm9yIFYwIGFuZCBWMi0+dXAuICovCisJdW5pb24geworCQl2b2lkICgqdjBfZXZhbCkoaW50IGxlbiwgY2hhciAqc3RyKTsKKwkJdm9pZCAoKnYyX2V2YWwpKGNoYXIgKnN0cik7CisJfSBwdl9mb3J0aGV2YWw7CisKKwlzdHJ1Y3QgbGludXhfYXJndW1lbnRzX3YwICoqcHZfdjBib290YXJnczsKKworCS8qIEdldCBldGhlciBhZGRyZXNzLiAqLworCXVuc2lnbmVkIGludCAoKnB2X2VuYWRkcikoaW50IGQsIGNoYXIgKmVuYWRkcik7CisKKwlzdHJ1Y3QgbGludXhfYm9vdGFyZ3NfdjIgcHZfdjJib290YXJnczsKKwlzdHJ1Y3QgbGludXhfZGV2X3YyX2Z1bmNzIHB2X3YyZGV2b3BzOworCisJaW50IGZpbGxlclsxNV07CisKKwkvKiBUaGlzIG9uZSBpcyBzdW40Yy9zdW40IG9ubHkuICovCisJdm9pZCAoKnB2X3NldGN0eHQpKGludCBjdHh0LCBjaGFyICp2YSwgaW50IHBtZWcpOworCisJLyogUHJvbSB2ZXJzaW9uIDMgTXVsdGlwcm9jZXNzb3Igcm91dGluZXMuIFRoaXMgc3R1ZmYgaXMgY3JhenkuCisJICogTm8gam9rZS4gQ2FsbGluZyB0aGVzZSB3aGVuIHRoZXJlIGlzIG9ubHkgb25lIGNwdSBwcm9iYWJseQorCSAqIGNyYXNoZXMgdGhlIG1hY2hpbmUsIGhhdmUgdG8gdGVzdCB0aGlzLiA6LSkKKwkgKi8KKworCS8qIHYzX2NwdXN0YXJ0KCkgd2lsbCBzdGFydCB0aGUgY3B1ICd3aGljaGNwdScgaW4gbW11LWNvbnRleHQKKwkgKiAndGhpc2NvbnRleHQnIGV4ZWN1dGluZyBhdCBhZGRyZXNzICdwcm9nX2NvdW50ZXInCisJICovCisJaW50ICgqdjNfY3B1c3RhcnQpKHVuc2lnbmVkIGludCB3aGljaGNwdSwgaW50IGN0eHRibF9wdHIsCisJCQkgICBpbnQgdGhpc2NvbnRleHQsIGNoYXIgKnByb2dfY291bnRlcik7CisKKwkvKiB2M19jcHVzdG9wKCkgd2lsbCBjYXVzZSBjcHUgJ3doaWNoY3B1JyB0byBzdG9wIGV4ZWN1dGluZworCSAqIHVudGlsIGEgcmVzdW1lIGNwdSBjYWxsIGlzIG1hZGUuCisJICovCisJaW50ICgqdjNfY3B1c3RvcCkodW5zaWduZWQgaW50IHdoaWNoY3B1KTsKKworCS8qIHYzX2NwdWlkbGUoKSB3aWxsIGlkbGUgY3B1ICd3aGljaGNwdScgdW50aWwgYSBzdG9wIG9yCisJICogcmVzdW1lIGNwdSBjYWxsIGlzIG1hZGUuCisJICovCisJaW50ICgqdjNfY3B1aWRsZSkodW5zaWduZWQgaW50IHdoaWNoY3B1KTsKKworCS8qIHYzX2NwdXJlc3VtZSgpIHdpbGwgcmVzdW1lIHByb2Nlc3NvciAnd2hpY2hjcHUnIGV4ZWN1dGluZworCSAqIHN0YXJ0aW5nIHdpdGggd2hhdGV2ZXIgJ3BjJyBhbmQgJ25wYycgd2VyZSBsZWZ0IGF0IHRoZQorCSAqIGxhc3QgJ2lkbGUnIG9yICdzdG9wJyBjYWxsLgorCSAqLworCWludCAoKnYzX2NwdXJlc3VtZSkodW5zaWduZWQgaW50IHdoaWNoY3B1KTsKK307CisKKy8qIFJvdXRpbmVzIGZvciB0cmF2ZXJzaW5nIHRoZSBwcm9tIGRldmljZSB0cmVlLiAqLworc3RydWN0IGxpbnV4X25vZGVvcHMgeworCWludCAoKm5vX25leHRub2RlKShpbnQgbm9kZSk7CisJaW50ICgqbm9fY2hpbGQpKGludCBub2RlKTsKKwlpbnQgKCpub19wcm9wbGVuKShpbnQgbm9kZSwgY29uc3QgY2hhciAqbmFtZSk7CisJaW50ICgqbm9fZ2V0cHJvcCkoaW50IG5vZGUsIGNvbnN0IGNoYXIgKm5hbWUsIGNoYXIgKnZhbCk7CisJaW50ICgqbm9fc2V0cHJvcCkoaW50IG5vZGUsIGNvbnN0IGNoYXIgKm5hbWUsIGNoYXIgKnZhbCwgaW50IGxlbik7CisJY2hhciAqICgqbm9fbmV4dHByb3ApKGludCBub2RlLCBjaGFyICpuYW1lKTsKK307CisKKy8qIE1vcmUgZnVuIFBST00gc3RydWN0dXJlcyBmb3IgZGV2aWNlIHByb2JpbmcuICovCiAjaWYgZGVmaW5lZChfX3NwYXJjX18pICYmIGRlZmluZWQoX19hcmNoNjRfXykKLSNpbmNsdWRlIDxhc20vb3BlbnByb21fNjQuaD4KKyNkZWZpbmUgUFJPTVJFR19NQVggICAgIDI0CisjZGVmaW5lIFBST01WQUREUl9NQVggICAxNgorI2RlZmluZSBQUk9NSU5UUl9NQVggICAgMzIKICNlbHNlCi0jaW5jbHVkZSA8YXNtL29wZW5wcm9tXzMyLmg+CisjZGVmaW5lIFBST01SRUdfTUFYICAgICAxNgorI2RlZmluZSBQUk9NVkFERFJfTUFYICAgMTYKKyNkZWZpbmUgUFJPTUlOVFJfTUFYICAgIDE1CiAjZW5kaWYKKworc3RydWN0IGxpbnV4X3Byb21fcmVnaXN0ZXJzIHsKKwl1bnNpZ25lZCBpbnQgd2hpY2hfaW87CS8qIGhpIHBhcnQgb2YgcGh5c2ljYWwgYWRkcmVzcyAqLworCXVuc2lnbmVkIGludCBwaHlzX2FkZHI7CS8qIFRoZSBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoaXMgcmVnaXN0ZXIgKi8KKwl1bnNpZ25lZCBpbnQgcmVnX3NpemU7CS8qIEhvdyBtYW55IGJ5dGVzIGRvZXMgdGhpcyByZWdpc3RlciB0YWtlIHVwPyAqLworfTsKKworc3RydWN0IGxpbnV4X3Byb202NF9yZWdpc3RlcnMgeworCXVuc2lnbmVkIGxvbmcgcGh5c19hZGRyOworCXVuc2lnbmVkIGxvbmcgcmVnX3NpemU7Cit9OworCitzdHJ1Y3QgbGludXhfcHJvbV9pcnFzIHsKKwlpbnQgcHJpOyAgICAvKiBJUlEgcHJpb3JpdHkgKi8KKwlpbnQgdmVjdG9yOyAvKiBUaGlzIGlzIGZvb2Jhciwgd2hhdCBkb2VzIGl0IGRvPyAqLworfTsKKworLyogRWxlbWVudCBvZiB0aGUgInJhbmdlcyIgdmVjdG9yICovCitzdHJ1Y3QgbGludXhfcHJvbV9yYW5nZXMgeworCXVuc2lnbmVkIGludCBvdF9jaGlsZF9zcGFjZTsKKwl1bnNpZ25lZCBpbnQgb3RfY2hpbGRfYmFzZTsJCS8qIEJ1cyBmZWVscyB0aGlzICovCisJdW5zaWduZWQgaW50IG90X3BhcmVudF9zcGFjZTsKKwl1bnNpZ25lZCBpbnQgb3RfcGFyZW50X2Jhc2U7CQkvKiBDUFUgbG9va3MgZnJvbSBoZXJlICovCisJdW5zaWduZWQgaW50IG9yX3NpemU7Cit9OworCisvKgorICogUmFuZ2VzIGFuZCByZWcgcHJvcGVydGllcyBhcmUgYSBiaXQgZGlmZmVyZW50IGZvciBQQ0kuCisgKi8KKyNpZiBkZWZpbmVkKF9fc3BhcmNfXykgJiYgZGVmaW5lZChfX2FyY2g2NF9fKQorc3RydWN0IGxpbnV4X3Byb21fcGNpX3JlZ2lzdGVycyB7CisJdW5zaWduZWQgaW50IHBoeXNfaGk7CisJdW5zaWduZWQgaW50IHBoeXNfbWlkOworCXVuc2lnbmVkIGludCBwaHlzX2xvOworCisJdW5zaWduZWQgaW50IHNpemVfaGk7CisJdW5zaWduZWQgaW50IHNpemVfbG87Cit9OworI2Vsc2UKK3N0cnVjdCBsaW51eF9wcm9tX3BjaV9yZWdpc3RlcnMgeworCS8qCisJICogV2UgZG9uJ3Qga25vdyB3aGF0IGluZm9ybWF0aW9uIHRoaXMgZmllbGQgY29udGFpbi4KKwkgKiBXZSBndWVzcywgUENJIGRldmljZSBmdW5jdGlvbiBpcyBpbiBiaXRzIDE1OjgKKwkgKiBTbywgLi4uCisJICovCisJdW5zaWduZWQgaW50IHdoaWNoX2lvOyAgLyogTGV0IGl0IGJlIHdoaWNoX2lvICovCisKKwl1bnNpZ25lZCBpbnQgcGh5c19oaTsKKwl1bnNpZ25lZCBpbnQgcGh5c19sbzsKKworCXVuc2lnbmVkIGludCBzaXplX2hpOworCXVuc2lnbmVkIGludCBzaXplX2xvOworfTsKKwogI2VuZGlmCisKK3N0cnVjdCBsaW51eF9wcm9tX3BjaV9yYW5nZXMgeworCXVuc2lnbmVkIGludCBjaGlsZF9waHlzX2hpOwkvKiBPbmx5IGNlcnRhaW4gYml0cyBhcmUgZW5jb2RlZCBoZXJlLiAqLworCXVuc2lnbmVkIGludCBjaGlsZF9waHlzX21pZDsKKwl1bnNpZ25lZCBpbnQgY2hpbGRfcGh5c19sbzsKKworCXVuc2lnbmVkIGludCBwYXJlbnRfcGh5c19oaTsKKwl1bnNpZ25lZCBpbnQgcGFyZW50X3BoeXNfbG87CisKKwl1bnNpZ25lZCBpbnQgc2l6ZV9oaTsKKwl1bnNpZ25lZCBpbnQgc2l6ZV9sbzsKK307CisKK3N0cnVjdCBsaW51eF9wcm9tX3BjaV9pbnRtYXAgeworCXVuc2lnbmVkIGludCBwaHlzX2hpOworCXVuc2lnbmVkIGludCBwaHlzX21pZDsKKwl1bnNpZ25lZCBpbnQgcGh5c19sbzsKKworCXVuc2lnbmVkIGludCBpbnRlcnJ1cHQ7CisKKwlpbnQgICAgICAgICAgY25vZGU7CisJdW5zaWduZWQgaW50IGNpbnRlcnJ1cHQ7Cit9OworCitzdHJ1Y3QgbGludXhfcHJvbV9wY2lfaW50bWFzayB7CisJdW5zaWduZWQgaW50IHBoeXNfaGk7CisJdW5zaWduZWQgaW50IHBoeXNfbWlkOworCXVuc2lnbmVkIGludCBwaHlzX2xvOworCXVuc2lnbmVkIGludCBpbnRlcnJ1cHQ7Cit9OworCisjZW5kaWYgLyogIShfX0FTU0VNQkxZX18pICovCisKKyNlbmRpZiAvKiAhKF9fU1BBUkNfT1BFTlBST01fSCkgKi8KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vb3BlbnByb21fMzIuaCBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vb3BlbnByb21fMzIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODc1ZGEzNS4uMDAwMDAwMAotLS0gYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL29wZW5wcm9tXzMyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNTUgKzAsMCBAQAotI2lmbmRlZiBfX1NQQVJDX09QRU5QUk9NX0gKLSNkZWZpbmUgX19TUEFSQ19PUEVOUFJPTV9ICi0KLS8qIG9wZW5wcm9tLmg6ICBQcm9tIHN0cnVjdHVyZXMgYW5kIGRlZmluZXMgZm9yIGFjY2VzcyB0byB0aGUgT1BFTkJPT1QKLSAqICAgICAgICAgICAgICBwcm9tIHJvdXRpbmVzIGFuZCBkYXRhIGFyZWFzLgotICoKLSAqIENvcHlyaWdodCAoQykgMTk5NSBEYXZpZCBTLiBNaWxsZXIgKGRhdmVtQGNhaXAucnV0Z2Vycy5lZHUpCi0gKi8KLQotLyogRW1waXJpY2FsIGNvbnN0YW50cy4uLiAqLwotI2RlZmluZQlMSU5VWF9PUFBST01fTUFHSUMgICAgICAweDEwMDEwNDA3Ci0KLSNpZm5kZWYgX19BU1NFTUJMWV9fCi0vKiBWMCBwcm9tIGRldmljZSBvcGVyYXRpb25zLiAqLwotc3RydWN0IGxpbnV4X2Rldl92MF9mdW5jcyB7Ci0JaW50ICgqdjBfZGV2b3BlbikoY2hhciAqZGV2aWNlX3N0cik7Ci0JaW50ICgqdjBfZGV2Y2xvc2UpKGludCBkZXZfZGVzYyk7Ci0JaW50ICgqdjBfcmRibGtkZXYpKGludCBkZXZfZGVzYywgaW50IG51bV9ibGtzLCBpbnQgYmxrX3N0LCBjaGFyICpidWYpOwotCWludCAoKnYwX3dyYmxrZGV2KShpbnQgZGV2X2Rlc2MsIGludCBudW1fYmxrcywgaW50IGJsa19zdCwgY2hhciAqYnVmKTsKLQlpbnQgKCp2MF93cm5ldGRldikoaW50IGRldl9kZXNjLCBpbnQgbnVtX2J5dGVzLCBjaGFyICpidWYpOwotCWludCAoKnYwX3JkbmV0ZGV2KShpbnQgZGV2X2Rlc2MsIGludCBudW1fYnl0ZXMsIGNoYXIgKmJ1Zik7Ci0JaW50ICgqdjBfcmRjaGFyZGV2KShpbnQgZGV2X2Rlc2MsIGludCBudW1fYnl0ZXMsIGludCBkdW1teSwgY2hhciAqYnVmKTsKLQlpbnQgKCp2MF93cmNoYXJkZXYpKGludCBkZXZfZGVzYywgaW50IG51bV9ieXRlcywgaW50IGR1bW15LCBjaGFyICpidWYpOwotCWludCAoKnYwX3NlZWtkZXYpKGludCBkZXZfZGVzYywgbG9uZyBsb2dpY2FsX29mZnN0LCBpbnQgZnJvbSk7Ci19OwotCi0vKiBWMiBhbmQgbGF0ZXIgcHJvbSBkZXZpY2Ugb3BlcmF0aW9ucy4gKi8KLXN0cnVjdCBsaW51eF9kZXZfdjJfZnVuY3MgewotCWludCAoKnYyX2luc3QycGtnKShpbnQgZCk7CS8qIENvbnZlcnQgaWhhbmRsZSB0byBwaGFuZGxlICovCi0JY2hhciAqICgqdjJfZHVtYl9tZW1fYWxsb2MpKGNoYXIgKnZhLCB1bnNpZ25lZCBzeik7Ci0Jdm9pZCAoKnYyX2R1bWJfbWVtX2ZyZWUpKGNoYXIgKnZhLCB1bnNpZ25lZCBzeik7Ci0KLQkvKiBUbyBtYXAgZGV2aWNlcyBpbnRvIHZpcnR1YWwgSS9PIHNwYWNlLiAqLwotCWNoYXIgKiAoKnYyX2R1bWJfbW1hcCkoY2hhciAqdmlydGEsIGludCB3aGljaF9pbywgdW5zaWduZWQgcGFkZHIsIHVuc2lnbmVkIHN6KTsKLQl2b2lkICgqdjJfZHVtYl9tdW5tYXApKGNoYXIgKnZpcnRhLCB1bnNpZ25lZCBzaXplKTsKLQotCWludCAoKnYyX2Rldl9vcGVuKShjaGFyICpkZXZwYXRoKTsKLQl2b2lkICgqdjJfZGV2X2Nsb3NlKShpbnQgZCk7Ci0JaW50ICgqdjJfZGV2X3JlYWQpKGludCBkLCBjaGFyICpidWYsIGludCBuYnl0ZXMpOwotCWludCAoKnYyX2Rldl93cml0ZSkoaW50IGQsIGNoYXIgKmJ1ZiwgaW50IG5ieXRlcyk7Ci0JaW50ICgqdjJfZGV2X3NlZWspKGludCBkLCBpbnQgaGksIGludCBsbyk7Ci0KLQkvKiBOZXZlciBpc3N1ZWQgKG11bHRpc3RhZ2UgbG9hZCBzdXBwb3J0KSAqLwotCXZvaWQgKCp2Ml93aGVlZTIpKHZvaWQpOwotCXZvaWQgKCp2Ml93aGVlZTMpKHZvaWQpOwotfTsKLQotc3RydWN0IGxpbnV4X21saXN0X3YwIHsKLQlzdHJ1Y3QgbGludXhfbWxpc3RfdjAgKnRoZXJlc19tb3JlOwotCWNoYXIgKnN0YXJ0X2FkcjsKLQl1bnNpZ25lZCBudW1fYnl0ZXM7Ci19OwotCi1zdHJ1Y3QgbGludXhfbWVtX3YwIHsKLQlzdHJ1Y3QgbGludXhfbWxpc3RfdjAgKip2MF90b3RwaHlzOwotCXN0cnVjdCBsaW51eF9tbGlzdF92MCAqKnYwX3Byb21tYXA7Ci0Jc3RydWN0IGxpbnV4X21saXN0X3YwICoqdjBfYXZhaWxhYmxlOyAvKiBXaGF0IHdlIGNhbiB1c2UgKi8KLX07Ci0KLS8qIEFyZ3VtZW50cyBzZW50IHRvIHRoZSBrZXJuZWwgZnJvbSB0aGUgYm9vdCBwcm9tcHQuICovCi1zdHJ1Y3QgbGludXhfYXJndW1lbnRzX3YwIHsKLQljaGFyICphcmd2WzhdOwotCWNoYXIgYXJnc1sxMDBdOwotCWNoYXIgYm9vdF9kZXZbMl07Ci0JaW50IGJvb3RfZGV2X2N0cmw7Ci0JaW50IGJvb3RfZGV2X3VuaXQ7Ci0JaW50IGRldl9wYXJ0aXRpb247Ci0JY2hhciAqa2VybmVsX2ZpbGVfbmFtZTsKLQl2b2lkICphaWVlZTE7ICAgICAgICAgICAvKiBYWFggKi8KLX07Ci0KLS8qIFYyIGFuZCB1cCBib290IHRoaW5ncy4gKi8KLXN0cnVjdCBsaW51eF9ib290YXJnc192MiB7Ci0JY2hhciAqKmJvb3RwYXRoOwotCWNoYXIgKipib290YXJnczsKLQlpbnQgKmZkX3N0ZGluOwotCWludCAqZmRfc3Rkb3V0OwotfTsKLQotLyogVGhlIHRvcCBsZXZlbCBQUk9NIHZlY3Rvci4gKi8KLXN0cnVjdCBsaW51eF9yb212ZWMgewotCS8qIFZlcnNpb24gbnVtYmVycy4gKi8KLQl1bnNpZ25lZCBpbnQgcHZfbWFnaWNfY29va2llOwotCXVuc2lnbmVkIGludCBwdl9yb212ZXJzOwotCXVuc2lnbmVkIGludCBwdl9wbHVnaW5fcmV2aXNpb247Ci0JdW5zaWduZWQgaW50IHB2X3ByaW50cmV2OwotCi0JLyogVmVyc2lvbiAwIG1lbW9yeSBkZXNjcmlwdG9ycy4gKi8KLQlzdHJ1Y3QgbGludXhfbWVtX3YwIHB2X3YwbWVtOwotCi0JLyogTm9kZSBvcGVyYXRpb25zLiAqLwotCXN0cnVjdCBsaW51eF9ub2Rlb3BzICpwdl9ub2Rlb3BzOwotCi0JY2hhciAqKnB2X2Jvb3RzdHI7Ci0Jc3RydWN0IGxpbnV4X2Rldl92MF9mdW5jcyBwdl92MGRldm9wczsKLQotCWNoYXIgKnB2X3N0ZGluOwotCWNoYXIgKnB2X3N0ZG91dDsKLSNkZWZpbmUJUFJPTURFVl9LQkQJMAkJLyogaW5wdXQgZnJvbSBrZXlib2FyZCAqLwotI2RlZmluZQlQUk9NREVWX1NDUkVFTgkwCQkvKiBvdXRwdXQgdG8gc2NyZWVuICovCi0jZGVmaW5lCVBST01ERVZfVFRZQQkxCQkvKiBpbi9vdXQgdG8gdHR5YSAqLwotI2RlZmluZQlQUk9NREVWX1RUWUIJMgkJLyogaW4vb3V0IHRvIHR0eWIgKi8KLQotCS8qIEJsb2NraW5nIGdldGNoYXIvcHV0Y2hhci4gIE5PVCBSRUVOVFJBTlQhIChncnIpICovCi0JaW50ICgqcHZfZ2V0Y2hhcikodm9pZCk7Ci0Jdm9pZCAoKnB2X3B1dGNoYXIpKGludCBjaCk7Ci0KLQkvKiBOb24tYmxvY2tpbmcgdmFyaWFudHMuICovCi0JaW50ICgqcHZfbmJnZXRjaGFyKSh2b2lkKTsKLQlpbnQgKCpwdl9uYnB1dGNoYXIpKGludCBjaCk7Ci0KLQl2b2lkICgqcHZfcHV0c3RyKShjaGFyICpzdHIsIGludCBsZW4pOwotCi0JLyogTWlzY2VsbGFueS4gKi8KLQl2b2lkICgqcHZfcmVib290KShjaGFyICpib290c3RyKTsKLQl2b2lkICgqcHZfcHJpbnRmKShfX2NvbnN0X18gY2hhciAqZm10LCAuLi4pOwotCXZvaWQgKCpwdl9hYm9ydCkodm9pZCk7Ci0JX192b2xhdGlsZV9fIGludCAqcHZfdGlja3M7Ci0Jdm9pZCAoKnB2X2hhbHQpKHZvaWQpOwotCXZvaWQgKCoqcHZfc3luY2hvb2spKHZvaWQpOwotCi0JLyogRXZhbHVhdGUgYSBmb3J0aCBzdHJpbmcsIG5vdCBkaWZmZXJlbnQgcHJvdG8gZm9yIFYwIGFuZCBWMi0+dXAuICovCi0JdW5pb24gewotCQl2b2lkICgqdjBfZXZhbCkoaW50IGxlbiwgY2hhciAqc3RyKTsKLQkJdm9pZCAoKnYyX2V2YWwpKGNoYXIgKnN0cik7Ci0JfSBwdl9mb3J0aGV2YWw7Ci0KLQlzdHJ1Y3QgbGludXhfYXJndW1lbnRzX3YwICoqcHZfdjBib290YXJnczsKLQotCS8qIEdldCBldGhlciBhZGRyZXNzLiAqLwotCXVuc2lnbmVkIGludCAoKnB2X2VuYWRkcikoaW50IGQsIGNoYXIgKmVuYWRkcik7Ci0KLQlzdHJ1Y3QgbGludXhfYm9vdGFyZ3NfdjIgcHZfdjJib290YXJnczsKLQlzdHJ1Y3QgbGludXhfZGV2X3YyX2Z1bmNzIHB2X3YyZGV2b3BzOwotCi0JaW50IGZpbGxlclsxNV07Ci0KLQkvKiBUaGlzIG9uZSBpcyBzdW40Yy9zdW40IG9ubHkuICovCi0Jdm9pZCAoKnB2X3NldGN0eHQpKGludCBjdHh0LCBjaGFyICp2YSwgaW50IHBtZWcpOwotCi0JLyogUHJvbSB2ZXJzaW9uIDMgTXVsdGlwcm9jZXNzb3Igcm91dGluZXMuIFRoaXMgc3R1ZmYgaXMgY3JhenkuCi0JICogTm8gam9rZS4gQ2FsbGluZyB0aGVzZSB3aGVuIHRoZXJlIGlzIG9ubHkgb25lIGNwdSBwcm9iYWJseQotCSAqIGNyYXNoZXMgdGhlIG1hY2hpbmUsIGhhdmUgdG8gdGVzdCB0aGlzLiA6LSkKLQkgKi8KLQotCS8qIHYzX2NwdXN0YXJ0KCkgd2lsbCBzdGFydCB0aGUgY3B1ICd3aGljaGNwdScgaW4gbW11LWNvbnRleHQKLQkgKiAndGhpc2NvbnRleHQnIGV4ZWN1dGluZyBhdCBhZGRyZXNzICdwcm9nX2NvdW50ZXInCi0JICovCi0JaW50ICgqdjNfY3B1c3RhcnQpKHVuc2lnbmVkIGludCB3aGljaGNwdSwgaW50IGN0eHRibF9wdHIsCi0JCQkgICBpbnQgdGhpc2NvbnRleHQsIGNoYXIgKnByb2dfY291bnRlcik7Ci0KLQkvKiB2M19jcHVzdG9wKCkgd2lsbCBjYXVzZSBjcHUgJ3doaWNoY3B1JyB0byBzdG9wIGV4ZWN1dGluZwotCSAqIHVudGlsIGEgcmVzdW1lIGNwdSBjYWxsIGlzIG1hZGUuCi0JICovCi0JaW50ICgqdjNfY3B1c3RvcCkodW5zaWduZWQgaW50IHdoaWNoY3B1KTsKLQotCS8qIHYzX2NwdWlkbGUoKSB3aWxsIGlkbGUgY3B1ICd3aGljaGNwdScgdW50aWwgYSBzdG9wIG9yCi0JICogcmVzdW1lIGNwdSBjYWxsIGlzIG1hZGUuCi0JICovCi0JaW50ICgqdjNfY3B1aWRsZSkodW5zaWduZWQgaW50IHdoaWNoY3B1KTsKLQotCS8qIHYzX2NwdXJlc3VtZSgpIHdpbGwgcmVzdW1lIHByb2Nlc3NvciAnd2hpY2hjcHUnIGV4ZWN1dGluZwotCSAqIHN0YXJ0aW5nIHdpdGggd2hhdGV2ZXIgJ3BjJyBhbmQgJ25wYycgd2VyZSBsZWZ0IGF0IHRoZQotCSAqIGxhc3QgJ2lkbGUnIG9yICdzdG9wJyBjYWxsLgotCSAqLwotCWludCAoKnYzX2NwdXJlc3VtZSkodW5zaWduZWQgaW50IHdoaWNoY3B1KTsKLX07Ci0KLS8qIFJvdXRpbmVzIGZvciB0cmF2ZXJzaW5nIHRoZSBwcm9tIGRldmljZSB0cmVlLiAqLwotc3RydWN0IGxpbnV4X25vZGVvcHMgewotCWludCAoKm5vX25leHRub2RlKShpbnQgbm9kZSk7Ci0JaW50ICgqbm9fY2hpbGQpKGludCBub2RlKTsKLQlpbnQgKCpub19wcm9wbGVuKShpbnQgbm9kZSwgY29uc3QgY2hhciAqbmFtZSk7Ci0JaW50ICgqbm9fZ2V0cHJvcCkoaW50IG5vZGUsIGNvbnN0IGNoYXIgKm5hbWUsIGNoYXIgKnZhbCk7Ci0JaW50ICgqbm9fc2V0cHJvcCkoaW50IG5vZGUsIGNvbnN0IGNoYXIgKm5hbWUsIGNoYXIgKnZhbCwgaW50IGxlbik7Ci0JY2hhciAqICgqbm9fbmV4dHByb3ApKGludCBub2RlLCBjaGFyICpuYW1lKTsKLX07Ci0KLS8qIE1vcmUgZnVuIFBST00gc3RydWN0dXJlcyBmb3IgZGV2aWNlIHByb2JpbmcuICovCi0jZGVmaW5lIFBST01SRUdfTUFYICAgICAxNgotI2RlZmluZSBQUk9NVkFERFJfTUFYICAgMTYKLSNkZWZpbmUgUFJPTUlOVFJfTUFYICAgIDE1Ci0KLXN0cnVjdCBsaW51eF9wcm9tX3JlZ2lzdGVycyB7Ci0JdW5zaWduZWQgaW50IHdoaWNoX2lvOyAgICAgICAgIC8qIGlzIHRoaXMgaW4gT0JJTyBzcGFjZT8gKi8KLQl1bnNpZ25lZCBpbnQgcGh5c19hZGRyOyAgICAgICAgLyogVGhlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhpcyByZWdpc3RlciAqLwotCXVuc2lnbmVkIGludCByZWdfc2l6ZTsgICAgICAgICAvKiBIb3cgbWFueSBieXRlcyBkb2VzIHRoaXMgcmVnaXN0ZXIgdGFrZSB1cD8gKi8KLX07Ci0KLXN0cnVjdCBsaW51eF9wcm9tX2lycXMgewotCWludCBwcmk7ICAgIC8qIElSUSBwcmlvcml0eSAqLwotCWludCB2ZWN0b3I7IC8qIFRoaXMgaXMgZm9vYmFyLCB3aGF0IGRvZXMgaXQgZG8/ICovCi19OwotCi0vKiBFbGVtZW50IG9mIHRoZSAicmFuZ2VzIiB2ZWN0b3IgKi8KLXN0cnVjdCBsaW51eF9wcm9tX3JhbmdlcyB7Ci0JdW5zaWduZWQgaW50IG90X2NoaWxkX3NwYWNlOwotCXVuc2lnbmVkIGludCBvdF9jaGlsZF9iYXNlOwkJLyogQnVzIGZlZWxzIHRoaXMgKi8KLQl1bnNpZ25lZCBpbnQgb3RfcGFyZW50X3NwYWNlOwotCXVuc2lnbmVkIGludCBvdF9wYXJlbnRfYmFzZTsJCS8qIENQVSBsb29rcyBmcm9tIGhlcmUgKi8KLQl1bnNpZ25lZCBpbnQgb3Jfc2l6ZTsKLX07Ci0KLS8qIFJhbmdlcyBhbmQgcmVnIHByb3BlcnRpZXMgYXJlIGEgYml0IGRpZmZlcmVudCBmb3IgUENJLiAqLwotc3RydWN0IGxpbnV4X3Byb21fcGNpX3JlZ2lzdGVycyB7Ci0JLyoKLQkgKiBXZSBkb24ndCBrbm93IHdoYXQgaW5mb3JtYXRpb24gdGhpcyBmaWVsZCBjb250YWluLgotCSAqIFdlIGd1ZXNzLCBQQ0kgZGV2aWNlIGZ1bmN0aW9uIGlzIGluIGJpdHMgMTU6OAotCSAqIFNvLCAuLi4KLQkgKi8KLQl1bnNpZ25lZCBpbnQgd2hpY2hfaW87ICAvKiBMZXQgaXQgYmUgd2hpY2hfaW8gKi8KLQotCXVuc2lnbmVkIGludCBwaHlzX2hpOwotCXVuc2lnbmVkIGludCBwaHlzX2xvOwotCi0JdW5zaWduZWQgaW50IHNpemVfaGk7Ci0JdW5zaWduZWQgaW50IHNpemVfbG87Ci19OwotCi1zdHJ1Y3QgbGludXhfcHJvbV9wY2lfcmFuZ2VzIHsKLQl1bnNpZ25lZCBpbnQgY2hpbGRfcGh5c19oaTsJLyogT25seSBjZXJ0YWluIGJpdHMgYXJlIGVuY29kZWQgaGVyZS4gKi8KLQl1bnNpZ25lZCBpbnQgY2hpbGRfcGh5c19taWQ7Ci0JdW5zaWduZWQgaW50IGNoaWxkX3BoeXNfbG87Ci0KLQl1bnNpZ25lZCBpbnQgcGFyZW50X3BoeXNfaGk7Ci0JdW5zaWduZWQgaW50IHBhcmVudF9waHlzX2xvOwotCi0JdW5zaWduZWQgaW50IHNpemVfaGk7Ci0JdW5zaWduZWQgaW50IHNpemVfbG87Ci19OwotCi1zdHJ1Y3QgbGludXhfcHJvbV9wY2lfYXNzaWduZWRfYWRkcmVzc2VzIHsKLQl1bnNpZ25lZCBpbnQgd2hpY2hfaW87Ci0KLQl1bnNpZ25lZCBpbnQgcGh5c19oaTsKLQl1bnNpZ25lZCBpbnQgcGh5c19sbzsKLQotCXVuc2lnbmVkIGludCBzaXplX2hpOwotCXVuc2lnbmVkIGludCBzaXplX2xvOwotfTsKLQotc3RydWN0IGxpbnV4X3Byb21fZWJ1c19yYW5nZXMgewotCXVuc2lnbmVkIGludCBjaGlsZF9waHlzX2hpOwotCXVuc2lnbmVkIGludCBjaGlsZF9waHlzX2xvOwotCi0JdW5zaWduZWQgaW50IHBhcmVudF9waHlzX2hpOwotCXVuc2lnbmVkIGludCBwYXJlbnRfcGh5c19taWQ7Ci0JdW5zaWduZWQgaW50IHBhcmVudF9waHlzX2xvOwotCi0JdW5zaWduZWQgaW50IHNpemU7Ci19OwotCi0jZW5kaWYgLyogIShfX0FTU0VNQkxZX18pICovCi0KLSNlbmRpZiAvKiAhKF9fU1BBUkNfT1BFTlBST01fSCkgKi8KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vb3BlbnByb21fNjQuaCBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vb3BlbnByb21fNjQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjY5ZTRhOC4uMDAwMDAwMAotLS0gYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL29wZW5wcm9tXzY0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyODAgKzAsMCBAQAotI2lmbmRlZiBfX1NQQVJDNjRfT1BFTlBST01fSAotI2RlZmluZSBfX1NQQVJDNjRfT1BFTlBST01fSAotCi0vKiBvcGVucHJvbS5oOiAgUHJvbSBzdHJ1Y3R1cmVzIGFuZCBkZWZpbmVzIGZvciBhY2Nlc3MgdG8gdGhlIE9QRU5CT09UCi0gKiAgICAgICAgICAgICAgcHJvbSByb3V0aW5lcyBhbmQgZGF0YSBhcmVhcy4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTYgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUBjYWlwLnJ1dGdlcnMuZWR1KQotICovCi0KLSNpZm5kZWYgX19BU1NFTUJMWV9fCi0vKiBWMCBwcm9tIGRldmljZSBvcGVyYXRpb25zLiAqLwotc3RydWN0IGxpbnV4X2Rldl92MF9mdW5jcyB7Ci0JaW50ICgqdjBfZGV2b3BlbikoY2hhciAqZGV2aWNlX3N0cik7Ci0JaW50ICgqdjBfZGV2Y2xvc2UpKGludCBkZXZfZGVzYyk7Ci0JaW50ICgqdjBfcmRibGtkZXYpKGludCBkZXZfZGVzYywgaW50IG51bV9ibGtzLCBpbnQgYmxrX3N0LCBjaGFyICpidWYpOwotCWludCAoKnYwX3dyYmxrZGV2KShpbnQgZGV2X2Rlc2MsIGludCBudW1fYmxrcywgaW50IGJsa19zdCwgY2hhciAqYnVmKTsKLQlpbnQgKCp2MF93cm5ldGRldikoaW50IGRldl9kZXNjLCBpbnQgbnVtX2J5dGVzLCBjaGFyICpidWYpOwotCWludCAoKnYwX3JkbmV0ZGV2KShpbnQgZGV2X2Rlc2MsIGludCBudW1fYnl0ZXMsIGNoYXIgKmJ1Zik7Ci0JaW50ICgqdjBfcmRjaGFyZGV2KShpbnQgZGV2X2Rlc2MsIGludCBudW1fYnl0ZXMsIGludCBkdW1teSwgY2hhciAqYnVmKTsKLQlpbnQgKCp2MF93cmNoYXJkZXYpKGludCBkZXZfZGVzYywgaW50IG51bV9ieXRlcywgaW50IGR1bW15LCBjaGFyICpidWYpOwotCWludCAoKnYwX3NlZWtkZXYpKGludCBkZXZfZGVzYywgbG9uZyBsb2dpY2FsX29mZnN0LCBpbnQgZnJvbSk7Ci19OwotCi0vKiBWMiBhbmQgbGF0ZXIgcHJvbSBkZXZpY2Ugb3BlcmF0aW9ucy4gKi8KLXN0cnVjdCBsaW51eF9kZXZfdjJfZnVuY3MgewotCWludCAoKnYyX2luc3QycGtnKShpbnQgZCk7CS8qIENvbnZlcnQgaWhhbmRsZSB0byBwaGFuZGxlICovCi0JY2hhciAqICgqdjJfZHVtYl9tZW1fYWxsb2MpKGNoYXIgKnZhLCB1bnNpZ25lZCBzeik7Ci0Jdm9pZCAoKnYyX2R1bWJfbWVtX2ZyZWUpKGNoYXIgKnZhLCB1bnNpZ25lZCBzeik7Ci0KLQkvKiBUbyBtYXAgZGV2aWNlcyBpbnRvIHZpcnR1YWwgSS9PIHNwYWNlLiAqLwotCWNoYXIgKiAoKnYyX2R1bWJfbW1hcCkoY2hhciAqdmlydGEsIGludCB3aGljaF9pbywgdW5zaWduZWQgcGFkZHIsIHVuc2lnbmVkIHN6KTsKLQl2b2lkICgqdjJfZHVtYl9tdW5tYXApKGNoYXIgKnZpcnRhLCB1bnNpZ25lZCBzaXplKTsKLQotCWludCAoKnYyX2Rldl9vcGVuKShjaGFyICpkZXZwYXRoKTsKLQl2b2lkICgqdjJfZGV2X2Nsb3NlKShpbnQgZCk7Ci0JaW50ICgqdjJfZGV2X3JlYWQpKGludCBkLCBjaGFyICpidWYsIGludCBuYnl0ZXMpOwotCWludCAoKnYyX2Rldl93cml0ZSkoaW50IGQsIGNoYXIgKmJ1ZiwgaW50IG5ieXRlcyk7Ci0JaW50ICgqdjJfZGV2X3NlZWspKGludCBkLCBpbnQgaGksIGludCBsbyk7Ci0KLQkvKiBOZXZlciBpc3N1ZWQgKG11bHRpc3RhZ2UgbG9hZCBzdXBwb3J0KSAqLwotCXZvaWQgKCp2Ml93aGVlZTIpKHZvaWQpOwotCXZvaWQgKCp2Ml93aGVlZTMpKHZvaWQpOwotfTsKLQotc3RydWN0IGxpbnV4X21saXN0X3YwIHsKLQlzdHJ1Y3QgbGludXhfbWxpc3RfdjAgKnRoZXJlc19tb3JlOwotCXVuc2lnbmVkIHN0YXJ0X2FkcjsKLQl1bnNpZ25lZCBudW1fYnl0ZXM7Ci19OwotCi1zdHJ1Y3QgbGludXhfbWVtX3YwIHsKLQlzdHJ1Y3QgbGludXhfbWxpc3RfdjAgKip2MF90b3RwaHlzOwotCXN0cnVjdCBsaW51eF9tbGlzdF92MCAqKnYwX3Byb21tYXA7Ci0Jc3RydWN0IGxpbnV4X21saXN0X3YwICoqdjBfYXZhaWxhYmxlOyAvKiBXaGF0IHdlIGNhbiB1c2UgKi8KLX07Ci0KLS8qIEFyZ3VtZW50cyBzZW50IHRvIHRoZSBrZXJuZWwgZnJvbSB0aGUgYm9vdCBwcm9tcHQuICovCi1zdHJ1Y3QgbGludXhfYXJndW1lbnRzX3YwIHsKLQljaGFyICphcmd2WzhdOwotCWNoYXIgYXJnc1sxMDBdOwotCWNoYXIgYm9vdF9kZXZbMl07Ci0JaW50IGJvb3RfZGV2X2N0cmw7Ci0JaW50IGJvb3RfZGV2X3VuaXQ7Ci0JaW50IGRldl9wYXJ0aXRpb247Ci0JY2hhciAqa2VybmVsX2ZpbGVfbmFtZTsKLQl2b2lkICphaWVlZTE7ICAgICAgICAgICAvKiBYWFggKi8KLX07Ci0KLS8qIFYyIGFuZCB1cCBib290IHRoaW5ncy4gKi8KLXN0cnVjdCBsaW51eF9ib290YXJnc192MiB7Ci0JY2hhciAqKmJvb3RwYXRoOwotCWNoYXIgKipib290YXJnczsKLQlpbnQgKmZkX3N0ZGluOwotCWludCAqZmRfc3Rkb3V0OwotfTsKLQotLyogVGhlIHRvcCBsZXZlbCBQUk9NIHZlY3Rvci4gKi8KLXN0cnVjdCBsaW51eF9yb212ZWMgewotCS8qIFZlcnNpb24gbnVtYmVycy4gKi8KLQl1bnNpZ25lZCBpbnQgcHZfbWFnaWNfY29va2llOwotCXVuc2lnbmVkIGludCBwdl9yb212ZXJzOwotCXVuc2lnbmVkIGludCBwdl9wbHVnaW5fcmV2aXNpb247Ci0JdW5zaWduZWQgaW50IHB2X3ByaW50cmV2OwotCi0JLyogVmVyc2lvbiAwIG1lbW9yeSBkZXNjcmlwdG9ycy4gKi8KLQlzdHJ1Y3QgbGludXhfbWVtX3YwIHB2X3YwbWVtOwotCi0JLyogTm9kZSBvcGVyYXRpb25zLiAqLwotCXN0cnVjdCBsaW51eF9ub2Rlb3BzICpwdl9ub2Rlb3BzOwotCi0JY2hhciAqKnB2X2Jvb3RzdHI7Ci0Jc3RydWN0IGxpbnV4X2Rldl92MF9mdW5jcyBwdl92MGRldm9wczsKLQotCWNoYXIgKnB2X3N0ZGluOwotCWNoYXIgKnB2X3N0ZG91dDsKLSNkZWZpbmUJUFJPTURFVl9LQkQJMAkJLyogaW5wdXQgZnJvbSBrZXlib2FyZCAqLwotI2RlZmluZQlQUk9NREVWX1NDUkVFTgkwCQkvKiBvdXRwdXQgdG8gc2NyZWVuICovCi0jZGVmaW5lCVBST01ERVZfVFRZQQkxCQkvKiBpbi9vdXQgdG8gdHR5YSAqLwotI2RlZmluZQlQUk9NREVWX1RUWUIJMgkJLyogaW4vb3V0IHRvIHR0eWIgKi8KLQotCS8qIEJsb2NraW5nIGdldGNoYXIvcHV0Y2hhci4gIE5PVCBSRUVOVFJBTlQhIChncnIpICovCi0JaW50ICgqcHZfZ2V0Y2hhcikodm9pZCk7Ci0Jdm9pZCAoKnB2X3B1dGNoYXIpKGludCBjaCk7Ci0KLQkvKiBOb24tYmxvY2tpbmcgdmFyaWFudHMuICovCi0JaW50ICgqcHZfbmJnZXRjaGFyKSh2b2lkKTsKLQlpbnQgKCpwdl9uYnB1dGNoYXIpKGludCBjaCk7Ci0KLQl2b2lkICgqcHZfcHV0c3RyKShjaGFyICpzdHIsIGludCBsZW4pOwotCi0JLyogTWlzY2VsbGFueS4gKi8KLQl2b2lkICgqcHZfcmVib290KShjaGFyICpib290c3RyKTsKLQl2b2lkICgqcHZfcHJpbnRmKShfX2NvbnN0X18gY2hhciAqZm10LCAuLi4pOwotCXZvaWQgKCpwdl9hYm9ydCkodm9pZCk7Ci0JX192b2xhdGlsZV9fIGludCAqcHZfdGlja3M7Ci0Jdm9pZCAoKnB2X2hhbHQpKHZvaWQpOwotCXZvaWQgKCoqcHZfc3luY2hvb2spKHZvaWQpOwotCi0JLyogRXZhbHVhdGUgYSBmb3J0aCBzdHJpbmcsIG5vdCBkaWZmZXJlbnQgcHJvdG8gZm9yIFYwIGFuZCBWMi0+dXAuICovCi0JdW5pb24gewotCQl2b2lkICgqdjBfZXZhbCkoaW50IGxlbiwgY2hhciAqc3RyKTsKLQkJdm9pZCAoKnYyX2V2YWwpKGNoYXIgKnN0cik7Ci0JfSBwdl9mb3J0aGV2YWw7Ci0KLQlzdHJ1Y3QgbGludXhfYXJndW1lbnRzX3YwICoqcHZfdjBib290YXJnczsKLQotCS8qIEdldCBldGhlciBhZGRyZXNzLiAqLwotCXVuc2lnbmVkIGludCAoKnB2X2VuYWRkcikoaW50IGQsIGNoYXIgKmVuYWRkcik7Ci0KLQlzdHJ1Y3QgbGludXhfYm9vdGFyZ3NfdjIgcHZfdjJib290YXJnczsKLQlzdHJ1Y3QgbGludXhfZGV2X3YyX2Z1bmNzIHB2X3YyZGV2b3BzOwotCi0JaW50IGZpbGxlclsxNV07Ci0KLQkvKiBUaGlzIG9uZSBpcyBzdW40Yy9zdW40IG9ubHkuICovCi0Jdm9pZCAoKnB2X3NldGN0eHQpKGludCBjdHh0LCBjaGFyICp2YSwgaW50IHBtZWcpOwotCi0JLyogUHJvbSB2ZXJzaW9uIDMgTXVsdGlwcm9jZXNzb3Igcm91dGluZXMuIFRoaXMgc3R1ZmYgaXMgY3JhenkuCi0JICogTm8gam9rZS4gQ2FsbGluZyB0aGVzZSB3aGVuIHRoZXJlIGlzIG9ubHkgb25lIGNwdSBwcm9iYWJseQotCSAqIGNyYXNoZXMgdGhlIG1hY2hpbmUsIGhhdmUgdG8gdGVzdCB0aGlzLiA6LSkKLQkgKi8KLQotCS8qIHYzX2NwdXN0YXJ0KCkgd2lsbCBzdGFydCB0aGUgY3B1ICd3aGljaGNwdScgaW4gbW11LWNvbnRleHQKLQkgKiAndGhpc2NvbnRleHQnIGV4ZWN1dGluZyBhdCBhZGRyZXNzICdwcm9nX2NvdW50ZXInCi0JICovCi0JaW50ICgqdjNfY3B1c3RhcnQpKHVuc2lnbmVkIGludCB3aGljaGNwdSwgaW50IGN0eHRibF9wdHIsCi0JCQkgICBpbnQgdGhpc2NvbnRleHQsIGNoYXIgKnByb2dfY291bnRlcik7Ci0KLQkvKiB2M19jcHVzdG9wKCkgd2lsbCBjYXVzZSBjcHUgJ3doaWNoY3B1JyB0byBzdG9wIGV4ZWN1dGluZwotCSAqIHVudGlsIGEgcmVzdW1lIGNwdSBjYWxsIGlzIG1hZGUuCi0JICovCi0JaW50ICgqdjNfY3B1c3RvcCkodW5zaWduZWQgaW50IHdoaWNoY3B1KTsKLQotCS8qIHYzX2NwdWlkbGUoKSB3aWxsIGlkbGUgY3B1ICd3aGljaGNwdScgdW50aWwgYSBzdG9wIG9yCi0JICogcmVzdW1lIGNwdSBjYWxsIGlzIG1hZGUuCi0JICovCi0JaW50ICgqdjNfY3B1aWRsZSkodW5zaWduZWQgaW50IHdoaWNoY3B1KTsKLQotCS8qIHYzX2NwdXJlc3VtZSgpIHdpbGwgcmVzdW1lIHByb2Nlc3NvciAnd2hpY2hjcHUnIGV4ZWN1dGluZwotCSAqIHN0YXJ0aW5nIHdpdGggd2hhdGV2ZXIgJ3BjJyBhbmQgJ25wYycgd2VyZSBsZWZ0IGF0IHRoZQotCSAqIGxhc3QgJ2lkbGUnIG9yICdzdG9wJyBjYWxsLgotCSAqLwotCWludCAoKnYzX2NwdXJlc3VtZSkodW5zaWduZWQgaW50IHdoaWNoY3B1KTsKLX07Ci0KLS8qIFJvdXRpbmVzIGZvciB0cmF2ZXJzaW5nIHRoZSBwcm9tIGRldmljZSB0cmVlLiAqLwotc3RydWN0IGxpbnV4X25vZGVvcHMgewotCWludCAoKm5vX25leHRub2RlKShpbnQgbm9kZSk7Ci0JaW50ICgqbm9fY2hpbGQpKGludCBub2RlKTsKLQlpbnQgKCpub19wcm9wbGVuKShpbnQgbm9kZSwgY2hhciAqbmFtZSk7Ci0JaW50ICgqbm9fZ2V0cHJvcCkoaW50IG5vZGUsIGNoYXIgKm5hbWUsIGNoYXIgKnZhbCk7Ci0JaW50ICgqbm9fc2V0cHJvcCkoaW50IG5vZGUsIGNoYXIgKm5hbWUsIGNoYXIgKnZhbCwgaW50IGxlbik7Ci0JY2hhciAqICgqbm9fbmV4dHByb3ApKGludCBub2RlLCBjaGFyICpuYW1lKTsKLX07Ci0KLS8qIE1vcmUgZnVuIFBST00gc3RydWN0dXJlcyBmb3IgZGV2aWNlIHByb2JpbmcuICovCi0jZGVmaW5lIFBST01SRUdfTUFYICAgICAyNAotI2RlZmluZSBQUk9NVkFERFJfTUFYICAgMTYKLSNkZWZpbmUgUFJPTUlOVFJfTUFYICAgIDMyCi0KLXN0cnVjdCBsaW51eF9wcm9tX3JlZ2lzdGVycyB7Ci0JdW5zaWduZWQgd2hpY2hfaW87CS8qIGhpIHBhcnQgb2YgcGh5c2ljYWwgYWRkcmVzcwkJCSovCi0JdW5zaWduZWQgcGh5c19hZGRyOwkvKiBUaGUgcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGlzIHJlZ2lzdGVyCSovCi0JaW50IHJlZ19zaXplOwkJLyogSG93IG1hbnkgYnl0ZXMgZG9lcyB0aGlzIHJlZ2lzdGVyIHRha2UgdXA/CSovCi19OwotCi1zdHJ1Y3QgbGludXhfcHJvbTY0X3JlZ2lzdGVycyB7Ci0JdW5zaWduZWQgbG9uZyBwaHlzX2FkZHI7Ci0JdW5zaWduZWQgbG9uZyByZWdfc2l6ZTsKLX07Ci0KLXN0cnVjdCBsaW51eF9wcm9tX2lycXMgewotCWludCBwcmk7ICAgIC8qIElSUSBwcmlvcml0eSAqLwotCWludCB2ZWN0b3I7IC8qIFRoaXMgaXMgZm9vYmFyLCB3aGF0IGRvZXMgaXQgZG8/ICovCi19OwotCi0vKiBFbGVtZW50IG9mIHRoZSAicmFuZ2VzIiB2ZWN0b3IgKi8KLXN0cnVjdCBsaW51eF9wcm9tX3JhbmdlcyB7Ci0JdW5zaWduZWQgaW50IG90X2NoaWxkX3NwYWNlOwotCXVuc2lnbmVkIGludCBvdF9jaGlsZF9iYXNlOwkJLyogQnVzIGZlZWxzIHRoaXMgKi8KLQl1bnNpZ25lZCBpbnQgb3RfcGFyZW50X3NwYWNlOwotCXVuc2lnbmVkIGludCBvdF9wYXJlbnRfYmFzZTsJCS8qIENQVSBsb29rcyBmcm9tIGhlcmUgKi8KLQl1bnNpZ25lZCBpbnQgb3Jfc2l6ZTsKLX07Ci0KLXN0cnVjdCBsaW51eF9wcm9tNjRfcmFuZ2VzIHsKLQl1bnNpZ25lZCBsb25nIG90X2NoaWxkX2Jhc2U7CQkvKiBCdXMgZmVlbHMgdGhpcyAqLwotCXVuc2lnbmVkIGxvbmcgb3RfcGFyZW50X2Jhc2U7CQkvKiBDUFUgbG9va3MgZnJvbSBoZXJlICovCi0JdW5zaWduZWQgbG9uZyBvcl9zaXplOwotfTsKLQotLyogUmFuZ2VzIGFuZCByZWcgcHJvcGVydGllcyBhcmUgYSBiaXQgZGlmZmVyZW50IGZvciBQQ0kuICovCi1zdHJ1Y3QgbGludXhfcHJvbV9wY2lfcmVnaXN0ZXJzIHsKLQl1bnNpZ25lZCBpbnQgcGh5c19oaTsKLQl1bnNpZ25lZCBpbnQgcGh5c19taWQ7Ci0JdW5zaWduZWQgaW50IHBoeXNfbG87Ci0KLQl1bnNpZ25lZCBpbnQgc2l6ZV9oaTsKLQl1bnNpZ25lZCBpbnQgc2l6ZV9sbzsKLX07Ci0KLXN0cnVjdCBsaW51eF9wcm9tX3BjaV9yYW5nZXMgewotCXVuc2lnbmVkIGludCBjaGlsZF9waHlzX2hpOwkvKiBPbmx5IGNlcnRhaW4gYml0cyBhcmUgZW5jb2RlZCBoZXJlLiAqLwotCXVuc2lnbmVkIGludCBjaGlsZF9waHlzX21pZDsKLQl1bnNpZ25lZCBpbnQgY2hpbGRfcGh5c19sbzsKLQotCXVuc2lnbmVkIGludCBwYXJlbnRfcGh5c19oaTsKLQl1bnNpZ25lZCBpbnQgcGFyZW50X3BoeXNfbG87Ci0KLQl1bnNpZ25lZCBpbnQgc2l6ZV9oaTsKLQl1bnNpZ25lZCBpbnQgc2l6ZV9sbzsKLX07Ci0KLXN0cnVjdCBsaW51eF9wcm9tX3BjaV9pbnRtYXAgewotCXVuc2lnbmVkIGludCBwaHlzX2hpOwotCXVuc2lnbmVkIGludCBwaHlzX21pZDsKLQl1bnNpZ25lZCBpbnQgcGh5c19sbzsKLQotCXVuc2lnbmVkIGludCBpbnRlcnJ1cHQ7Ci0KLQlpbnQgICAgICAgICAgY25vZGU7Ci0JdW5zaWduZWQgaW50IGNpbnRlcnJ1cHQ7Ci19OwotCi1zdHJ1Y3QgbGludXhfcHJvbV9wY2lfaW50bWFzayB7Ci0JdW5zaWduZWQgaW50IHBoeXNfaGk7Ci0JdW5zaWduZWQgaW50IHBoeXNfbWlkOwotCXVuc2lnbmVkIGludCBwaHlzX2xvOwotCXVuc2lnbmVkIGludCBpbnRlcnJ1cHQ7Ci19OwotCi1zdHJ1Y3QgbGludXhfcHJvbV9lYnVzX3JhbmdlcyB7Ci0JdW5zaWduZWQgaW50IGNoaWxkX3BoeXNfaGk7Ci0JdW5zaWduZWQgaW50IGNoaWxkX3BoeXNfbG87Ci0KLQl1bnNpZ25lZCBpbnQgcGFyZW50X3BoeXNfaGk7Ci0JdW5zaWduZWQgaW50IHBhcmVudF9waHlzX21pZDsKLQl1bnNpZ25lZCBpbnQgcGFyZW50X3BoeXNfbG87Ci0KLQl1bnNpZ25lZCBpbnQgc2l6ZTsKLX07Ci0KLXN0cnVjdCBsaW51eF9wcm9tX2VidXNfaW50bWFwIHsKLQl1bnNpZ25lZCBpbnQgcGh5c19oaTsKLQl1bnNpZ25lZCBpbnQgcGh5c19sbzsKLQotCXVuc2lnbmVkIGludCBpbnRlcnJ1cHQ7Ci0KLQlpbnQgICAgICAgICAgY25vZGU7Ci0JdW5zaWduZWQgaW50IGNpbnRlcnJ1cHQ7Ci19OwotCi1zdHJ1Y3QgbGludXhfcHJvbV9lYnVzX2ludG1hc2sgewotCXVuc2lnbmVkIGludCBwaHlzX2hpOwotCXVuc2lnbmVkIGludCBwaHlzX2xvOwotCXVuc2lnbmVkIGludCBpbnRlcnJ1cHQ7Ci19OwotI2VuZGlmIC8qICEoX19BU1NFTUJMWV9fKSAqLwotCi0jZW5kaWYgLyogIShfX1NQQVJDNjRfT1BFTlBST01fSCkgKi8KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vcG9zaXhfdHlwZXMuaCBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vcG9zaXhfdHlwZXMuaAppbmRleCAwM2EwZTA5Li45OGQ2ZWJiIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3Bvc2l4X3R5cGVzLmgKKysrIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9wb3NpeF90eXBlcy5oCkBAIC0xLDggKzEsMTU1IEBACi0jaWZuZGVmIF9fX0FTTV9TUEFSQ19QT1NJWF9UWVBFU19ICi0jZGVmaW5lIF9fX0FTTV9TUEFSQ19QT1NJWF9UWVBFU19ICisvKgorICogVGhpcyBmaWxlIGlzIGdlbmVyYWxseSB1c2VkIGJ5IHVzZXItbGV2ZWwgc29mdHdhcmUsIHNvIHlvdSBuZWVkIHRvCisgKiBiZSBhIGxpdHRsZSBjYXJlZnVsIGFib3V0IG5hbWVzcGFjZSBwb2xsdXRpb24gZXRjLiAgQWxzbywgd2UgY2Fubm90CisgKiBhc3N1bWUgR0NDIGlzIGJlaW5nIHVzZWQuCisgKi8KKworI2lmbmRlZiBfX1NQQVJDX1BPU0lYX1RZUEVTX0gKKyNkZWZpbmUgX19TUEFSQ19QT1NJWF9UWVBFU19ICisKICNpZiBkZWZpbmVkKF9fc3BhcmNfXykgJiYgZGVmaW5lZChfX2FyY2g2NF9fKQotI2luY2x1ZGUgPGFzbS9wb3NpeF90eXBlc182NC5oPgorLyogc3BhcmMgNjQgYml0ICovCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgICAgICAgICAgX19rZXJuZWxfc2l6ZV90OwordHlwZWRlZiBsb25nICAgICAgICAgICAgICAgICAgIF9fa2VybmVsX3NzaXplX3Q7Cit0eXBlZGVmIGxvbmcgICAgICAgICAgICAgICAgICAgX19rZXJuZWxfcHRyZGlmZl90OwordHlwZWRlZiBsb25nICAgICAgICAgICAgICAgICAgIF9fa2VybmVsX3RpbWVfdDsKK3R5cGVkZWYgbG9uZyAgICAgICAgICAgICAgICAgICBfX2tlcm5lbF9jbG9ja190OwordHlwZWRlZiBpbnQgICAgICAgICAgICAgICAgICAgIF9fa2VybmVsX3BpZF90OwordHlwZWRlZiBpbnQgICAgICAgICAgICAgICAgICAgIF9fa2VybmVsX2lwY19waWRfdDsKK3R5cGVkZWYgdW5zaWduZWQgaW50ICAgICAgICAgICBfX2tlcm5lbF91aWRfdDsKK3R5cGVkZWYgdW5zaWduZWQgaW50ICAgICAgICAgICBfX2tlcm5lbF9naWRfdDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyAgICAgICAgICBfX2tlcm5lbF9pbm9fdDsKK3R5cGVkZWYgdW5zaWduZWQgaW50ICAgICAgICAgICBfX2tlcm5lbF9tb2RlX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0ICAgICAgICAgX19rZXJuZWxfdW1vZGVfdDsKK3R5cGVkZWYgdW5zaWduZWQgaW50ICAgICAgICAgICBfX2tlcm5lbF9ubGlua190OwordHlwZWRlZiBpbnQgICAgICAgICAgICAgICAgICAgIF9fa2VybmVsX2RhZGRyX3Q7Cit0eXBlZGVmIGxvbmcgICAgICAgICAgICAgICAgICAgX19rZXJuZWxfb2ZmX3Q7Cit0eXBlZGVmIGNoYXIgKiAgICAgICAgICAgICAgICAgX19rZXJuZWxfY2FkZHJfdDsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQJICAgICAgIF9fa2VybmVsX3VpZDE2X3Q7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0CSAgICAgICBfX2tlcm5lbF9naWQxNl90OwordHlwZWRlZiBpbnQgICAgICAgICAgICAgICAgICAgIF9fa2VybmVsX2Nsb2NraWRfdDsKK3R5cGVkZWYgaW50ICAgICAgICAgICAgICAgICAgICBfX2tlcm5lbF90aW1lcl90OworCit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IAkgICAgICAgX19rZXJuZWxfb2xkX3VpZF90OwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCAgICAgICAgIF9fa2VybmVsX29sZF9naWRfdDsKK3R5cGVkZWYgX19rZXJuZWxfdWlkX3QJICAgICAgIF9fa2VybmVsX3VpZDMyX3Q7Cit0eXBlZGVmIF9fa2VybmVsX2dpZF90CSAgICAgICBfX2tlcm5lbF9naWQzMl90OworCit0eXBlZGVmIHVuc2lnbmVkIGludAkgICAgICAgX19rZXJuZWxfb2xkX2Rldl90OworCisvKiBOb3RlIHRoaXMgcGllY2Ugb2YgYXN5bW1ldHJ5IGZyb20gdGhlIHY5IEFCSS4gICovCit0eXBlZGVmIGludAkJICAgICAgIF9fa2VybmVsX3N1c2Vjb25kc190OworCiAjZWxzZQotI2luY2x1ZGUgPGFzbS9wb3NpeF90eXBlc18zMi5oPgorLyogc3BhcmMgMzIgYml0ICovCisKK3R5cGVkZWYgdW5zaWduZWQgaW50ICAgICAgICAgICBfX2tlcm5lbF9zaXplX3Q7Cit0eXBlZGVmIGludCAgICAgICAgICAgICAgICAgICAgX19rZXJuZWxfc3NpemVfdDsKK3R5cGVkZWYgbG9uZyBpbnQgICAgICAgICAgICAgICBfX2tlcm5lbF9wdHJkaWZmX3Q7Cit0eXBlZGVmIGxvbmcgICAgICAgICAgICAgICAgICAgX19rZXJuZWxfdGltZV90OwordHlwZWRlZiBsb25nCQkgICAgICAgX19rZXJuZWxfc3VzZWNvbmRzX3Q7Cit0eXBlZGVmIGxvbmcgICAgICAgICAgICAgICAgICAgX19rZXJuZWxfY2xvY2tfdDsKK3R5cGVkZWYgaW50ICAgICAgICAgICAgICAgICAgICBfX2tlcm5lbF9waWRfdDsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgICAgICAgICBfX2tlcm5lbF9pcGNfcGlkX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0ICAgICAgICAgX19rZXJuZWxfdWlkX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0ICAgICAgICAgX19rZXJuZWxfZ2lkX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgICAgICAgICAgX19rZXJuZWxfaW5vX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0ICAgICAgICAgX19rZXJuZWxfbW9kZV90OwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCAgICAgICAgIF9fa2VybmVsX3Vtb2RlX3Q7Cit0eXBlZGVmIHNob3J0ICAgICAgICAgICAgICAgICAgX19rZXJuZWxfbmxpbmtfdDsKK3R5cGVkZWYgbG9uZyAgICAgICAgICAgICAgICAgICBfX2tlcm5lbF9kYWRkcl90OwordHlwZWRlZiBsb25nICAgICAgICAgICAgICAgICAgIF9fa2VybmVsX29mZl90OwordHlwZWRlZiBjaGFyICogICAgICAgICAgICAgICAgIF9fa2VybmVsX2NhZGRyX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0CSAgICAgICBfX2tlcm5lbF91aWQxNl90OwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydAkgICAgICAgX19rZXJuZWxfZ2lkMTZfdDsKK3R5cGVkZWYgdW5zaWduZWQgaW50CSAgICAgICBfX2tlcm5lbF91aWQzMl90OwordHlwZWRlZiB1bnNpZ25lZCBpbnQJICAgICAgIF9fa2VybmVsX2dpZDMyX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0CSAgICAgICBfX2tlcm5lbF9vbGRfdWlkX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0CSAgICAgICBfX2tlcm5lbF9vbGRfZ2lkX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0CSAgICAgICBfX2tlcm5lbF9vbGRfZGV2X3Q7Cit0eXBlZGVmIGludCAgICAgICAgICAgICAgICAgICAgX19rZXJuZWxfY2xvY2tpZF90OwordHlwZWRlZiBpbnQgICAgICAgICAgICAgICAgICAgIF9fa2VybmVsX3RpbWVyX3Q7CisKKyNlbmRpZiAvKiBkZWZpbmVkKF9fc3BhcmNfXykgJiYgZGVmaW5lZChfX2FyY2g2NF9fKSAqLworCisjaWZkZWYgX19HTlVDX18KK3R5cGVkZWYgbG9uZyBsb25nICAgICAgICAgICAgICBfX2tlcm5lbF9sb2ZmX3Q7CiAjZW5kaWYKLSNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCB7CisJaW50CXZhbFsyXTsKK30gX19rZXJuZWxfZnNpZF90OworCisjaWZkZWYgX19LRVJORUxfXworCisjdW5kZWYgX19GRF9TRVQKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX0ZEX1NFVCh1bnNpZ25lZCBsb25nIGZkLCBfX2tlcm5lbF9mZF9zZXQgKmZkc2V0cCkKK3sKKwl1bnNpZ25lZCBsb25nIF90bXAgPSBmZCAvIF9fTkZEQklUUzsKKwl1bnNpZ25lZCBsb25nIF9yZW0gPSBmZCAlIF9fTkZEQklUUzsKKwlmZHNldHAtPmZkc19iaXRzW190bXBdIHw9ICgxVUw8PF9yZW0pOworfQorCisjdW5kZWYgX19GRF9DTFIKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX0ZEX0NMUih1bnNpZ25lZCBsb25nIGZkLCBfX2tlcm5lbF9mZF9zZXQgKmZkc2V0cCkKK3sKKwl1bnNpZ25lZCBsb25nIF90bXAgPSBmZCAvIF9fTkZEQklUUzsKKwl1bnNpZ25lZCBsb25nIF9yZW0gPSBmZCAlIF9fTkZEQklUUzsKKwlmZHNldHAtPmZkc19iaXRzW190bXBdICY9IH4oMVVMPDxfcmVtKTsKK30KKworI3VuZGVmIF9fRkRfSVNTRVQKK3N0YXRpYyBpbmxpbmUgaW50IF9fRkRfSVNTRVQodW5zaWduZWQgbG9uZyBmZCwgX19jb25zdF9fIF9fa2VybmVsX2ZkX3NldCAqcCkKK3sKKwl1bnNpZ25lZCBsb25nIF90bXAgPSBmZCAvIF9fTkZEQklUUzsKKwl1bnNpZ25lZCBsb25nIF9yZW0gPSBmZCAlIF9fTkZEQklUUzsKKwlyZXR1cm4gKHAtPmZkc19iaXRzW190bXBdICYgKDFVTDw8X3JlbSkpICE9IDA7Cit9CisKKy8qCisgKiBUaGlzIHdpbGwgdW5yb2xsIHRoZSBsb29wIGZvciB0aGUgbm9ybWFsIGNvbnN0YW50IGNhc2VzICg4IG9yIDMyIGxvbmdzLAorICogZm9yIDI1NiBhbmQgMTAyNC1iaXQgZmRfc2V0cyByZXNwZWN0aXZlbHkpCisgKi8KKyN1bmRlZiBfX0ZEX1pFUk8KK3N0YXRpYyBpbmxpbmUgdm9pZCBfX0ZEX1pFUk8oX19rZXJuZWxfZmRfc2V0ICpwKQoreworCXVuc2lnbmVkIGxvbmcgKnRtcCA9IHAtPmZkc19iaXRzOworCWludCBpOworCisJaWYgKF9fYnVpbHRpbl9jb25zdGFudF9wKF9fRkRTRVRfTE9OR1MpKSB7CisJCXN3aXRjaCAoX19GRFNFVF9MT05HUykgeworCQkJY2FzZSAzMjoKKwkJCSAgdG1wWyAwXSA9IDA7IHRtcFsgMV0gPSAwOyB0bXBbIDJdID0gMDsgdG1wWyAzXSA9IDA7CisJCQkgIHRtcFsgNF0gPSAwOyB0bXBbIDVdID0gMDsgdG1wWyA2XSA9IDA7IHRtcFsgN10gPSAwOworCQkJICB0bXBbIDhdID0gMDsgdG1wWyA5XSA9IDA7IHRtcFsxMF0gPSAwOyB0bXBbMTFdID0gMDsKKwkJCSAgdG1wWzEyXSA9IDA7IHRtcFsxM10gPSAwOyB0bXBbMTRdID0gMDsgdG1wWzE1XSA9IDA7CisJCQkgIHRtcFsxNl0gPSAwOyB0bXBbMTddID0gMDsgdG1wWzE4XSA9IDA7IHRtcFsxOV0gPSAwOworCQkJICB0bXBbMjBdID0gMDsgdG1wWzIxXSA9IDA7IHRtcFsyMl0gPSAwOyB0bXBbMjNdID0gMDsKKwkJCSAgdG1wWzI0XSA9IDA7IHRtcFsyNV0gPSAwOyB0bXBbMjZdID0gMDsgdG1wWzI3XSA9IDA7CisJCQkgIHRtcFsyOF0gPSAwOyB0bXBbMjldID0gMDsgdG1wWzMwXSA9IDA7IHRtcFszMV0gPSAwOworCQkJICByZXR1cm47CisJCQljYXNlIDE2OgorCQkJICB0bXBbIDBdID0gMDsgdG1wWyAxXSA9IDA7IHRtcFsgMl0gPSAwOyB0bXBbIDNdID0gMDsKKwkJCSAgdG1wWyA0XSA9IDA7IHRtcFsgNV0gPSAwOyB0bXBbIDZdID0gMDsgdG1wWyA3XSA9IDA7CisJCQkgIHRtcFsgOF0gPSAwOyB0bXBbIDldID0gMDsgdG1wWzEwXSA9IDA7IHRtcFsxMV0gPSAwOworCQkJICB0bXBbMTJdID0gMDsgdG1wWzEzXSA9IDA7IHRtcFsxNF0gPSAwOyB0bXBbMTVdID0gMDsKKwkJCSAgcmV0dXJuOworCQkJY2FzZSA4OgorCQkJICB0bXBbIDBdID0gMDsgdG1wWyAxXSA9IDA7IHRtcFsgMl0gPSAwOyB0bXBbIDNdID0gMDsKKwkJCSAgdG1wWyA0XSA9IDA7IHRtcFsgNV0gPSAwOyB0bXBbIDZdID0gMDsgdG1wWyA3XSA9IDA7CisJCQkgIHJldHVybjsKKwkJCWNhc2UgNDoKKwkJCSAgdG1wWyAwXSA9IDA7IHRtcFsgMV0gPSAwOyB0bXBbIDJdID0gMDsgdG1wWyAzXSA9IDA7CisJCQkgIHJldHVybjsKKwkJfQorCX0KKwlpID0gX19GRFNFVF9MT05HUzsKKwl3aGlsZSAoaSkgeworCQlpLS07CisJCSp0bXAgPSAwOworCQl0bXArKzsKKwl9Cit9CisKKyNlbmRpZiAvKiBfX0tFUk5FTF9fICovCisjZW5kaWYgLyogX19TUEFSQ19QT1NJWF9UWVBFU19IICovCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3Bvc2l4X3R5cGVzXzMyLmggYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3Bvc2l4X3R5cGVzXzMyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiYjZlYjEuLjAwMDAwMDAKLS0tIGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9wb3NpeF90eXBlc18zMi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLSNpZm5kZWYgX19BUkNIX1NQQVJDX1BPU0lYX1RZUEVTX0gKLSNkZWZpbmUgX19BUkNIX1NQQVJDX1BPU0lYX1RZUEVTX0gKLQotLyoKLSAqIFRoaXMgZmlsZSBpcyBnZW5lcmFsbHkgdXNlZCBieSB1c2VyLWxldmVsIHNvZnR3YXJlLCBzbyB5b3UgbmVlZCB0bwotICogYmUgYSBsaXR0bGUgY2FyZWZ1bCBhYm91dCBuYW1lc3BhY2UgcG9sbHV0aW9uIGV0Yy4gIEFsc28sIHdlIGNhbm5vdAotICogYXNzdW1lIEdDQyBpcyBiZWluZyB1c2VkLgotICovCi0KLXR5cGVkZWYgdW5zaWduZWQgaW50ICAgICAgICAgICBfX2tlcm5lbF9zaXplX3Q7Ci10eXBlZGVmIGludCAgICAgICAgICAgICAgICAgICAgX19rZXJuZWxfc3NpemVfdDsKLXR5cGVkZWYgbG9uZyBpbnQgICAgICAgICAgICAgICBfX2tlcm5lbF9wdHJkaWZmX3Q7Ci10eXBlZGVmIGxvbmcgICAgICAgICAgICAgICAgICAgX19rZXJuZWxfdGltZV90OwotdHlwZWRlZiBsb25nCQkgICAgICAgX19rZXJuZWxfc3VzZWNvbmRzX3Q7Ci10eXBlZGVmIGxvbmcgICAgICAgICAgICAgICAgICAgX19rZXJuZWxfY2xvY2tfdDsKLXR5cGVkZWYgaW50ICAgICAgICAgICAgICAgICAgICBfX2tlcm5lbF9waWRfdDsKLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQgICAgICAgICBfX2tlcm5lbF9pcGNfcGlkX3Q7Ci10eXBlZGVmIHVuc2lnbmVkIHNob3J0ICAgICAgICAgX19rZXJuZWxfdWlkX3Q7Ci10eXBlZGVmIHVuc2lnbmVkIHNob3J0ICAgICAgICAgX19rZXJuZWxfZ2lkX3Q7Ci10eXBlZGVmIHVuc2lnbmVkIGxvbmcgICAgICAgICAgX19rZXJuZWxfaW5vX3Q7Ci10eXBlZGVmIHVuc2lnbmVkIHNob3J0ICAgICAgICAgX19rZXJuZWxfbW9kZV90OwotdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCAgICAgICAgIF9fa2VybmVsX3Vtb2RlX3Q7Ci10eXBlZGVmIHNob3J0ICAgICAgICAgICAgICAgICAgX19rZXJuZWxfbmxpbmtfdDsKLXR5cGVkZWYgbG9uZyAgICAgICAgICAgICAgICAgICBfX2tlcm5lbF9kYWRkcl90OwotdHlwZWRlZiBsb25nICAgICAgICAgICAgICAgICAgIF9fa2VybmVsX29mZl90OwotdHlwZWRlZiBjaGFyICogICAgICAgICAgICAgICAgIF9fa2VybmVsX2NhZGRyX3Q7Ci10eXBlZGVmIHVuc2lnbmVkIHNob3J0CSAgICAgICBfX2tlcm5lbF91aWQxNl90OwotdHlwZWRlZiB1bnNpZ25lZCBzaG9ydAkgICAgICAgX19rZXJuZWxfZ2lkMTZfdDsKLXR5cGVkZWYgdW5zaWduZWQgaW50CSAgICAgICBfX2tlcm5lbF91aWQzMl90OwotdHlwZWRlZiB1bnNpZ25lZCBpbnQJICAgICAgIF9fa2VybmVsX2dpZDMyX3Q7Ci10eXBlZGVmIHVuc2lnbmVkIHNob3J0CSAgICAgICBfX2tlcm5lbF9vbGRfdWlkX3Q7Ci10eXBlZGVmIHVuc2lnbmVkIHNob3J0CSAgICAgICBfX2tlcm5lbF9vbGRfZ2lkX3Q7Ci10eXBlZGVmIHVuc2lnbmVkIHNob3J0CSAgICAgICBfX2tlcm5lbF9vbGRfZGV2X3Q7Ci10eXBlZGVmIGludCAgICAgICAgICAgICAgICAgICAgX19rZXJuZWxfY2xvY2tpZF90OwotdHlwZWRlZiBpbnQgICAgICAgICAgICAgICAgICAgIF9fa2VybmVsX3RpbWVyX3Q7Ci0KLSNpZmRlZiBfX0dOVUNfXwotdHlwZWRlZiBsb25nIGxvbmcJX19rZXJuZWxfbG9mZl90OwotI2VuZGlmCi0KLXR5cGVkZWYgc3RydWN0IHsKLQlpbnQJdmFsWzJdOwotfSBfX2tlcm5lbF9mc2lkX3Q7Ci0KLSNpZiBkZWZpbmVkKF9fS0VSTkVMX18pCi0KLSN1bmRlZiBfX0ZEX1NFVAotc3RhdGljIGlubGluZSB2b2lkIF9fRkRfU0VUKHVuc2lnbmVkIGxvbmcgZmQsIF9fa2VybmVsX2ZkX3NldCAqZmRzZXRwKQotewotCXVuc2lnbmVkIGxvbmcgX3RtcCA9IGZkIC8gX19ORkRCSVRTOwotCXVuc2lnbmVkIGxvbmcgX3JlbSA9IGZkICUgX19ORkRCSVRTOwotCWZkc2V0cC0+ZmRzX2JpdHNbX3RtcF0gfD0gKDFVTDw8X3JlbSk7Ci19Ci0KLSN1bmRlZiBfX0ZEX0NMUgotc3RhdGljIGlubGluZSB2b2lkIF9fRkRfQ0xSKHVuc2lnbmVkIGxvbmcgZmQsIF9fa2VybmVsX2ZkX3NldCAqZmRzZXRwKQotewotCXVuc2lnbmVkIGxvbmcgX3RtcCA9IGZkIC8gX19ORkRCSVRTOwotCXVuc2lnbmVkIGxvbmcgX3JlbSA9IGZkICUgX19ORkRCSVRTOwotCWZkc2V0cC0+ZmRzX2JpdHNbX3RtcF0gJj0gfigxVUw8PF9yZW0pOwotfQotCi0jdW5kZWYgX19GRF9JU1NFVAotc3RhdGljIGlubGluZSBpbnQgX19GRF9JU1NFVCh1bnNpZ25lZCBsb25nIGZkLCBfX2NvbnN0X18gX19rZXJuZWxfZmRfc2V0ICpwKQotewotCXVuc2lnbmVkIGxvbmcgX3RtcCA9IGZkIC8gX19ORkRCSVRTOwotCXVuc2lnbmVkIGxvbmcgX3JlbSA9IGZkICUgX19ORkRCSVRTOwotCXJldHVybiAocC0+ZmRzX2JpdHNbX3RtcF0gJiAoMVVMPDxfcmVtKSkgIT0gMDsKLX0KLQotLyoKLSAqIFRoaXMgd2lsbCB1bnJvbGwgdGhlIGxvb3AgZm9yIHRoZSBub3JtYWwgY29uc3RhbnQgY2FzZXMgKDggb3IgMzIgbG9uZ3MsCi0gKiBmb3IgMjU2IGFuZCAxMDI0LWJpdCBmZF9zZXRzIHJlc3BlY3RpdmVseSkKLSAqLwotI3VuZGVmIF9fRkRfWkVSTwotc3RhdGljIGlubGluZSB2b2lkIF9fRkRfWkVSTyhfX2tlcm5lbF9mZF9zZXQgKnApCi17Ci0JdW5zaWduZWQgbG9uZyAqdG1wID0gcC0+ZmRzX2JpdHM7Ci0JaW50IGk7Ci0KLQlpZiAoX19idWlsdGluX2NvbnN0YW50X3AoX19GRFNFVF9MT05HUykpIHsKLQkJc3dpdGNoIChfX0ZEU0VUX0xPTkdTKSB7Ci0JCQljYXNlIDMyOgotCQkJICB0bXBbIDBdID0gMDsgdG1wWyAxXSA9IDA7IHRtcFsgMl0gPSAwOyB0bXBbIDNdID0gMDsKLQkJCSAgdG1wWyA0XSA9IDA7IHRtcFsgNV0gPSAwOyB0bXBbIDZdID0gMDsgdG1wWyA3XSA9IDA7Ci0JCQkgIHRtcFsgOF0gPSAwOyB0bXBbIDldID0gMDsgdG1wWzEwXSA9IDA7IHRtcFsxMV0gPSAwOwotCQkJICB0bXBbMTJdID0gMDsgdG1wWzEzXSA9IDA7IHRtcFsxNF0gPSAwOyB0bXBbMTVdID0gMDsKLQkJCSAgdG1wWzE2XSA9IDA7IHRtcFsxN10gPSAwOyB0bXBbMThdID0gMDsgdG1wWzE5XSA9IDA7Ci0JCQkgIHRtcFsyMF0gPSAwOyB0bXBbMjFdID0gMDsgdG1wWzIyXSA9IDA7IHRtcFsyM10gPSAwOwotCQkJICB0bXBbMjRdID0gMDsgdG1wWzI1XSA9IDA7IHRtcFsyNl0gPSAwOyB0bXBbMjddID0gMDsKLQkJCSAgdG1wWzI4XSA9IDA7IHRtcFsyOV0gPSAwOyB0bXBbMzBdID0gMDsgdG1wWzMxXSA9IDA7Ci0JCQkgIHJldHVybjsKLQkJCWNhc2UgMTY6Ci0JCQkgIHRtcFsgMF0gPSAwOyB0bXBbIDFdID0gMDsgdG1wWyAyXSA9IDA7IHRtcFsgM10gPSAwOwotCQkJICB0bXBbIDRdID0gMDsgdG1wWyA1XSA9IDA7IHRtcFsgNl0gPSAwOyB0bXBbIDddID0gMDsKLQkJCSAgdG1wWyA4XSA9IDA7IHRtcFsgOV0gPSAwOyB0bXBbMTBdID0gMDsgdG1wWzExXSA9IDA7Ci0JCQkgIHRtcFsxMl0gPSAwOyB0bXBbMTNdID0gMDsgdG1wWzE0XSA9IDA7IHRtcFsxNV0gPSAwOwotCQkJICByZXR1cm47Ci0JCQljYXNlIDg6Ci0JCQkgIHRtcFsgMF0gPSAwOyB0bXBbIDFdID0gMDsgdG1wWyAyXSA9IDA7IHRtcFsgM10gPSAwOwotCQkJICB0bXBbIDRdID0gMDsgdG1wWyA1XSA9IDA7IHRtcFsgNl0gPSAwOyB0bXBbIDddID0gMDsKLQkJCSAgcmV0dXJuOwotCQkJY2FzZSA0OgotCQkJICB0bXBbIDBdID0gMDsgdG1wWyAxXSA9IDA7IHRtcFsgMl0gPSAwOyB0bXBbIDNdID0gMDsKLQkJCSAgcmV0dXJuOwotCQl9Ci0JfQotCWkgPSBfX0ZEU0VUX0xPTkdTOwotCXdoaWxlIChpKSB7Ci0JCWktLTsKLQkJKnRtcCA9IDA7Ci0JCXRtcCsrOwotCX0KLX0KLQotI2VuZGlmIC8qIGRlZmluZWQoX19LRVJORUxfXykgKi8KLQotI2VuZGlmIC8qICEoX19BUkNIX1NQQVJDX1BPU0lYX1RZUEVTX0gpICovCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3Bvc2l4X3R5cGVzXzY0LmggYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3Bvc2l4X3R5cGVzXzY0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhOGY5MzIuLjAwMDAwMDAKLS0tIGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9wb3NpeF90eXBlc182NC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLSNpZm5kZWYgX19BUkNIX1NQQVJDNjRfUE9TSVhfVFlQRVNfSAotI2RlZmluZSBfX0FSQ0hfU1BBUkM2NF9QT1NJWF9UWVBFU19ICi0KLS8qCi0gKiBUaGlzIGZpbGUgaXMgZ2VuZXJhbGx5IHVzZWQgYnkgdXNlci1sZXZlbCBzb2Z0d2FyZSwgc28geW91IG5lZWQgdG8KLSAqIGJlIGEgbGl0dGxlIGNhcmVmdWwgYWJvdXQgbmFtZXNwYWNlIHBvbGx1dGlvbiBldGMuICBBbHNvLCB3ZSBjYW5ub3QKLSAqIGFzc3VtZSBHQ0MgaXMgYmVpbmcgdXNlZC4KLSAqLwotCi10eXBlZGVmIHVuc2lnbmVkIGxvbmcgICAgICAgICAgX19rZXJuZWxfc2l6ZV90OwotdHlwZWRlZiBsb25nICAgICAgICAgICAgICAgICAgIF9fa2VybmVsX3NzaXplX3Q7Ci10eXBlZGVmIGxvbmcgICAgICAgICAgICAgICAgICAgX19rZXJuZWxfcHRyZGlmZl90OwotdHlwZWRlZiBsb25nICAgICAgICAgICAgICAgICAgIF9fa2VybmVsX3RpbWVfdDsKLXR5cGVkZWYgbG9uZyAgICAgICAgICAgICAgICAgICBfX2tlcm5lbF9jbG9ja190OwotdHlwZWRlZiBpbnQgICAgICAgICAgICAgICAgICAgIF9fa2VybmVsX3BpZF90OwotdHlwZWRlZiBpbnQgICAgICAgICAgICAgICAgICAgIF9fa2VybmVsX2lwY19waWRfdDsKLXR5cGVkZWYgdW5zaWduZWQgaW50ICAgICAgICAgICBfX2tlcm5lbF91aWRfdDsKLXR5cGVkZWYgdW5zaWduZWQgaW50ICAgICAgICAgICBfX2tlcm5lbF9naWRfdDsKLXR5cGVkZWYgdW5zaWduZWQgbG9uZyAgICAgICAgICBfX2tlcm5lbF9pbm9fdDsKLXR5cGVkZWYgdW5zaWduZWQgaW50ICAgICAgICAgICBfX2tlcm5lbF9tb2RlX3Q7Ci10eXBlZGVmIHVuc2lnbmVkIHNob3J0ICAgICAgICAgX19rZXJuZWxfdW1vZGVfdDsKLXR5cGVkZWYgdW5zaWduZWQgaW50ICAgICAgICAgICBfX2tlcm5lbF9ubGlua190OwotdHlwZWRlZiBpbnQgICAgICAgICAgICAgICAgICAgIF9fa2VybmVsX2RhZGRyX3Q7Ci10eXBlZGVmIGxvbmcgICAgICAgICAgICAgICAgICAgX19rZXJuZWxfb2ZmX3Q7Ci10eXBlZGVmIGNoYXIgKiAgICAgICAgICAgICAgICAgX19rZXJuZWxfY2FkZHJfdDsKLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQJICAgICAgIF9fa2VybmVsX3VpZDE2X3Q7Ci10eXBlZGVmIHVuc2lnbmVkIHNob3J0CSAgICAgICBfX2tlcm5lbF9naWQxNl90OwotdHlwZWRlZiBpbnQgICAgICAgICAgICAgICAgICAgIF9fa2VybmVsX2Nsb2NraWRfdDsKLXR5cGVkZWYgaW50ICAgICAgICAgICAgICAgICAgICBfX2tlcm5lbF90aW1lcl90OwotCi10eXBlZGVmIHVuc2lnbmVkIHNob3J0IAkgICAgICAgX19rZXJuZWxfb2xkX3VpZF90OwotdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCAgICAgICAgIF9fa2VybmVsX29sZF9naWRfdDsKLXR5cGVkZWYgX19rZXJuZWxfdWlkX3QJICAgICAgIF9fa2VybmVsX3VpZDMyX3Q7Ci10eXBlZGVmIF9fa2VybmVsX2dpZF90CSAgICAgICBfX2tlcm5lbF9naWQzMl90OwotCi10eXBlZGVmIHVuc2lnbmVkIGludAkgICAgICAgX19rZXJuZWxfb2xkX2Rldl90OwotCi0vKiBOb3RlIHRoaXMgcGllY2Ugb2YgYXN5bW1ldHJ5IGZyb20gdGhlIHY5IEFCSS4gICovCi10eXBlZGVmIGludAkJICAgICAgIF9fa2VybmVsX3N1c2Vjb25kc190OwotCi0jaWZkZWYgX19HTlVDX18KLXR5cGVkZWYgbG9uZyBsb25nICAgICAgICAgICAgICBfX2tlcm5lbF9sb2ZmX3Q7Ci0jZW5kaWYKLQotdHlwZWRlZiBzdHJ1Y3QgewotCWludAl2YWxbMl07Ci19IF9fa2VybmVsX2ZzaWRfdDsKLQotI2lmIGRlZmluZWQoX19LRVJORUxfXykKLQotI3VuZGVmIF9fRkRfU0VUCi1zdGF0aWMgaW5saW5lIHZvaWQgX19GRF9TRVQodW5zaWduZWQgbG9uZyBmZCwgX19rZXJuZWxfZmRfc2V0ICpmZHNldHApCi17Ci0JdW5zaWduZWQgbG9uZyBfdG1wID0gZmQgLyBfX05GREJJVFM7Ci0JdW5zaWduZWQgbG9uZyBfcmVtID0gZmQgJSBfX05GREJJVFM7Ci0JZmRzZXRwLT5mZHNfYml0c1tfdG1wXSB8PSAoMVVMPDxfcmVtKTsKLX0KLQotI3VuZGVmIF9fRkRfQ0xSCi1zdGF0aWMgaW5saW5lIHZvaWQgX19GRF9DTFIodW5zaWduZWQgbG9uZyBmZCwgX19rZXJuZWxfZmRfc2V0ICpmZHNldHApCi17Ci0JdW5zaWduZWQgbG9uZyBfdG1wID0gZmQgLyBfX05GREJJVFM7Ci0JdW5zaWduZWQgbG9uZyBfcmVtID0gZmQgJSBfX05GREJJVFM7Ci0JZmRzZXRwLT5mZHNfYml0c1tfdG1wXSAmPSB+KDFVTDw8X3JlbSk7Ci19Ci0KLSN1bmRlZiBfX0ZEX0lTU0VUCi1zdGF0aWMgaW5saW5lIGludCBfX0ZEX0lTU0VUKHVuc2lnbmVkIGxvbmcgZmQsIF9fY29uc3RfXyBfX2tlcm5lbF9mZF9zZXQgKnApCi17Ci0JdW5zaWduZWQgbG9uZyBfdG1wID0gZmQgLyBfX05GREJJVFM7Ci0JdW5zaWduZWQgbG9uZyBfcmVtID0gZmQgJSBfX05GREJJVFM7Ci0JcmV0dXJuIChwLT5mZHNfYml0c1tfdG1wXSAmICgxVUw8PF9yZW0pKSAhPSAwOwotfQotCi0vKgotICogVGhpcyB3aWxsIHVucm9sbCB0aGUgbG9vcCBmb3IgdGhlIG5vcm1hbCBjb25zdGFudCBjYXNlcyAoOCBvciAzMiBsb25ncywKLSAqIGZvciAyNTYgYW5kIDEwMjQtYml0IGZkX3NldHMgcmVzcGVjdGl2ZWx5KQotICovCi0jdW5kZWYgX19GRF9aRVJPCi1zdGF0aWMgaW5saW5lIHZvaWQgX19GRF9aRVJPKF9fa2VybmVsX2ZkX3NldCAqcCkKLXsKLQl1bnNpZ25lZCBsb25nICp0bXAgPSBwLT5mZHNfYml0czsKLQlpbnQgaTsKLQotCWlmIChfX2J1aWx0aW5fY29uc3RhbnRfcChfX0ZEU0VUX0xPTkdTKSkgewotCQlzd2l0Y2ggKF9fRkRTRVRfTE9OR1MpIHsKLQkJCWNhc2UgMzI6Ci0JCQkgIHRtcFsgMF0gPSAwOyB0bXBbIDFdID0gMDsgdG1wWyAyXSA9IDA7IHRtcFsgM10gPSAwOwotCQkJICB0bXBbIDRdID0gMDsgdG1wWyA1XSA9IDA7IHRtcFsgNl0gPSAwOyB0bXBbIDddID0gMDsKLQkJCSAgdG1wWyA4XSA9IDA7IHRtcFsgOV0gPSAwOyB0bXBbMTBdID0gMDsgdG1wWzExXSA9IDA7Ci0JCQkgIHRtcFsxMl0gPSAwOyB0bXBbMTNdID0gMDsgdG1wWzE0XSA9IDA7IHRtcFsxNV0gPSAwOwotCQkJICB0bXBbMTZdID0gMDsgdG1wWzE3XSA9IDA7IHRtcFsxOF0gPSAwOyB0bXBbMTldID0gMDsKLQkJCSAgdG1wWzIwXSA9IDA7IHRtcFsyMV0gPSAwOyB0bXBbMjJdID0gMDsgdG1wWzIzXSA9IDA7Ci0JCQkgIHRtcFsyNF0gPSAwOyB0bXBbMjVdID0gMDsgdG1wWzI2XSA9IDA7IHRtcFsyN10gPSAwOwotCQkJICB0bXBbMjhdID0gMDsgdG1wWzI5XSA9IDA7IHRtcFszMF0gPSAwOyB0bXBbMzFdID0gMDsKLQkJCSAgcmV0dXJuOwotCQkJY2FzZSAxNjoKLQkJCSAgdG1wWyAwXSA9IDA7IHRtcFsgMV0gPSAwOyB0bXBbIDJdID0gMDsgdG1wWyAzXSA9IDA7Ci0JCQkgIHRtcFsgNF0gPSAwOyB0bXBbIDVdID0gMDsgdG1wWyA2XSA9IDA7IHRtcFsgN10gPSAwOwotCQkJICB0bXBbIDhdID0gMDsgdG1wWyA5XSA9IDA7IHRtcFsxMF0gPSAwOyB0bXBbMTFdID0gMDsKLQkJCSAgdG1wWzEyXSA9IDA7IHRtcFsxM10gPSAwOyB0bXBbMTRdID0gMDsgdG1wWzE1XSA9IDA7Ci0JCQkgIHJldHVybjsKLQkJCWNhc2UgODoKLQkJCSAgdG1wWyAwXSA9IDA7IHRtcFsgMV0gPSAwOyB0bXBbIDJdID0gMDsgdG1wWyAzXSA9IDA7Ci0JCQkgIHRtcFsgNF0gPSAwOyB0bXBbIDVdID0gMDsgdG1wWyA2XSA9IDA7IHRtcFsgN10gPSAwOwotCQkJICByZXR1cm47Ci0JCQljYXNlIDQ6Ci0JCQkgIHRtcFsgMF0gPSAwOyB0bXBbIDFdID0gMDsgdG1wWyAyXSA9IDA7IHRtcFsgM10gPSAwOwotCQkJICByZXR1cm47Ci0JCX0KLQl9Ci0JaSA9IF9fRkRTRVRfTE9OR1M7Ci0Jd2hpbGUgKGkpIHsKLQkJaS0tOwotCQkqdG1wID0gMDsKLQkJdG1wKys7Ci0JfQotfQotCi0jZW5kaWYgLyogZGVmaW5lZChfX0tFUk5FTF9fKSAqLwotCi0jZW5kaWYgLyogIShfX0FSQ0hfU1BBUkM2NF9QT1NJWF9UWVBFU19IKSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9wcm9jZXNzb3JfMzIuaCBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vcHJvY2Vzc29yXzMyLmgKaW5kZXggMmFlNjdhMi4uMDk1MjFjNiAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9wcm9jZXNzb3JfMzIuaAorKysgYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3Byb2Nlc3Nvcl8zMi5oCkBAIC05OSw3ICs5OSw3IEBACiAJCQkgICAgICJzdFx0JSVnMCwgWyUwICsgJTMgKyAweDNjXSIKIAkJCSAgICAgOiAvKiBubyBvdXRwdXRzICovCiAJCQkgICAgIDogInIiIChyZWdzKSwKLQkJCSAgICAgICAiciIgKHNwIC0gc2l6ZW9mKHN0cnVjdCByZWdfd2luZG93KSksCisJCQkgICAgICAgInIiIChzcCAtIHNpemVvZihzdHJ1Y3QgcmVnX3dpbmRvdzMyKSksCiAJCQkgICAgICAgInIiICh6ZXJvKSwKIAkJCSAgICAgICAiaSIgKChjb25zdCB1bnNpZ25lZCBsb25nKSgmKChzdHJ1Y3QgcHRfcmVncyAqKTApLT51X3JlZ3NbMF0pKQogCQkJICAgICA6ICJtZW1vcnkiKTsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vcHRyYWNlLmggYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3B0cmFjZS5oCmluZGV4IDZkY2JlMmUuLjMwYjBiNzkgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vcHRyYWNlLmgKKysrIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9wdHJhY2UuaApAQCAtMSw4ICsxLDQ0OCBAQAotI2lmbmRlZiBfX19BU01fU1BBUkNfUFRSQUNFX0gKLSNkZWZpbmUgX19fQVNNX1NQQVJDX1BUUkFDRV9ICisjaWZuZGVmIF9fU1BBUkNfUFRSQUNFX0gKKyNkZWZpbmUgX19TUEFSQ19QVFJBQ0VfSAorCiAjaWYgZGVmaW5lZChfX3NwYXJjX18pICYmIGRlZmluZWQoX19hcmNoNjRfXykKLSNpbmNsdWRlIDxhc20vcHRyYWNlXzY0Lmg+CisvKiA2NCBiaXQgc3BhcmMgKi8KKyNpbmNsdWRlIDxhc20vcHN0YXRlLmg+CisKKy8qIFRoaXMgc3RydWN0IGRlZmluZXMgdGhlIHdheSB0aGUgcmVnaXN0ZXJzIGFyZSBzdG9yZWQgb24gdGhlCisgKiBzdGFjayBkdXJpbmcgYSBzeXN0ZW0gY2FsbCBhbmQgYmFzaWNhbGx5IGFsbCB0cmFwcy4KKyAqLworCisvKiBUaGlzIG1hZ2ljIHZhbHVlIG11c3QgaGF2ZSB0aGUgbG93IDkgYml0cyBjbGVhciwKKyAqIGFzIHRoYXQgaXMgd2hlcmUgd2UgZW5jb2RlIHRoZSAldHQgdmFsdWUsIHNlZSBiZWxvdy4KKyAqLworI2RlZmluZSBQVF9SRUdTX01BR0lDIDB4NTdhYzZjMDAKKworI2lmbmRlZiBfX0FTU0VNQkxZX18KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKK3N0cnVjdCBwdF9yZWdzIHsKKwl1bnNpZ25lZCBsb25nIHVfcmVnc1sxNl07IC8qIGdsb2JhbHMgYW5kIGlucyAqLworCXVuc2lnbmVkIGxvbmcgdHN0YXRlOworCXVuc2lnbmVkIGxvbmcgdHBjOworCXVuc2lnbmVkIGxvbmcgdG5wYzsKKwl1bnNpZ25lZCBpbnQgeTsKKworCS8qIFdlIGVuY29kZSBhIG1hZ2ljIG51bWJlciwgUFRfUkVHU19NQUdJQywgYWxvbmcKKwkgKiB3aXRoIHRoZSAldHQgKHRyYXAgdHlwZSkgcmVnaXN0ZXIgdmFsdWUgYXQgdHJhcAorCSAqIGVudHJ5IHRpbWUuICBUaGUgbWFnaWMgbnVtYmVyIGFsbG93cyB1cyB0byBpZGVudGlmeQorCSAqIGFjY3VyYXRlbHkgYSB0cmFwIHN0YWNrIGZyYW1lIGluIHRoZSBzdGFjaworCSAqIHVud2luZGVyLCBhbmQgdGhlICV0dCB2YWx1ZSBhbGxvd3MgdXMgdG8gdGVzdAorCSAqIHRoaW5ncyBsaWtlICJpbiBhIHN5c3RlbSBjYWxsIiBldGMuIGZvciBhbiBhcmJpdHJheQorCSAqIHByb2Nlc3MuCisJICoKKwkgKiBUaGUgUFRfUkVHU19NQUdJQyBpcyBjaG9vc2VuIHN1Y2ggdGhhdCBpdCBjYW4gYmUKKwkgKiBsb2FkZWQgY29tcGxldGVseSB1c2luZyBqdXN0IGEgc2V0aGkgaW5zdHJ1Y3Rpb24uCisJICovCisJdW5zaWduZWQgaW50IG1hZ2ljOworfTsKKworc3RydWN0IHB0X3JlZ3MzMiB7CisJdW5zaWduZWQgaW50IHBzcjsKKwl1bnNpZ25lZCBpbnQgcGM7CisJdW5zaWduZWQgaW50IG5wYzsKKwl1bnNpZ25lZCBpbnQgeTsKKwl1bnNpZ25lZCBpbnQgdV9yZWdzWzE2XTsgLyogZ2xvYmFscyBhbmQgaW5zICovCit9OworCisvKiBBIFY5IHJlZ2lzdGVyIHdpbmRvdyAqLworc3RydWN0IHJlZ193aW5kb3cgeworCXVuc2lnbmVkIGxvbmcgbG9jYWxzWzhdOworCXVuc2lnbmVkIGxvbmcgaW5zWzhdOworfTsKKworLyogQSAzMi1iaXQgcmVnaXN0ZXIgd2luZG93LiAqLworc3RydWN0IHJlZ193aW5kb3czMiB7CisJdW5zaWduZWQgaW50IGxvY2Fsc1s4XTsKKwl1bnNpZ25lZCBpbnQgaW5zWzhdOworfTsKKworLyogQSBWOSBTcGFyYyBzdGFjayBmcmFtZSAqLworc3RydWN0IHNwYXJjX3N0YWNrZiB7CisJdW5zaWduZWQgbG9uZyBsb2NhbHNbOF07CisgICAgICAgIHVuc2lnbmVkIGxvbmcgaW5zWzZdOworCXN0cnVjdCBzcGFyY19zdGFja2YgKmZwOworCXVuc2lnbmVkIGxvbmcgY2FsbGVyc19wYzsKKwljaGFyICpzdHJ1Y3RwdHI7CisJdW5zaWduZWQgbG9uZyB4YXJnc1s2XTsKKwl1bnNpZ25lZCBsb25nIHh4YXJnc1sxXTsKK307CisKKy8qIEEgMzItYml0IFNwYXJjIHN0YWNrIGZyYW1lICovCitzdHJ1Y3Qgc3BhcmNfc3RhY2tmMzIgeworCXVuc2lnbmVkIGludCBsb2NhbHNbOF07CisgICAgICAgIHVuc2lnbmVkIGludCBpbnNbNl07CisJdW5zaWduZWQgaW50IGZwOworCXVuc2lnbmVkIGludCBjYWxsZXJzX3BjOworCXVuc2lnbmVkIGludCBzdHJ1Y3RwdHI7CisJdW5zaWduZWQgaW50IHhhcmdzWzZdOworCXVuc2lnbmVkIGludCB4eGFyZ3NbMV07Cit9OworCitzdHJ1Y3Qgc3BhcmNfdHJhcGYgeworCXVuc2lnbmVkIGxvbmcgbG9jYWxzWzhdOworCXVuc2lnbmVkIGxvbmcgaW5zWzhdOworCXVuc2lnbmVkIGxvbmcgX3VudXNlZDsKKwlzdHJ1Y3QgcHRfcmVncyAqcmVnczsKK307CisjZW5kaWYgLyogKCFfX0FTU0VNQkxZX18pICovCiAjZWxzZQotI2luY2x1ZGUgPGFzbS9wdHJhY2VfMzIuaD4KKy8qIDMyIGJpdCBzcGFyYyAqLworCisjaW5jbHVkZSA8YXNtL3Bzci5oPgorCisvKiBUaGlzIHN0cnVjdCBkZWZpbmVzIHRoZSB3YXkgdGhlIHJlZ2lzdGVycyBhcmUgc3RvcmVkIG9uIHRoZQorICogc3RhY2sgZHVyaW5nIGEgc3lzdGVtIGNhbGwgYW5kIGJhc2ljYWxseSBhbGwgdHJhcHMuCisgKi8KKyNpZm5kZWYgX19BU1NFTUJMWV9fCisKK3N0cnVjdCBwdF9yZWdzIHsKKwl1bnNpZ25lZCBsb25nIHBzcjsKKwl1bnNpZ25lZCBsb25nIHBjOworCXVuc2lnbmVkIGxvbmcgbnBjOworCXVuc2lnbmVkIGxvbmcgeTsKKwl1bnNpZ25lZCBsb25nIHVfcmVnc1sxNl07IC8qIGdsb2JhbHMgYW5kIGlucyAqLworfTsKKworLyogQSAzMi1iaXQgcmVnaXN0ZXIgd2luZG93LiAqLworc3RydWN0IHJlZ193aW5kb3czMiB7CisJdW5zaWduZWQgbG9uZyBsb2NhbHNbOF07CisJdW5zaWduZWQgbG9uZyBpbnNbOF07Cit9OworCisvKiBBIFNwYXJjIHN0YWNrIGZyYW1lICovCitzdHJ1Y3Qgc3BhcmNfc3RhY2tmIHsKKwl1bnNpZ25lZCBsb25nIGxvY2Fsc1s4XTsKKyAgICAgICAgdW5zaWduZWQgbG9uZyBpbnNbNl07CisJc3RydWN0IHNwYXJjX3N0YWNrZiAqZnA7CisJdW5zaWduZWQgbG9uZyBjYWxsZXJzX3BjOworCWNoYXIgKnN0cnVjdHB0cjsKKwl1bnNpZ25lZCBsb25nIHhhcmdzWzZdOworCXVuc2lnbmVkIGxvbmcgeHhhcmdzWzFdOworfTsKKyNlbmRpZiAvKiAoIV9fQVNTRU1CTFlfXykgKi8KKworI2VuZGlmIC8qIChkZWZpbmVkKF9fc3BhcmNfXykgJiYgZGVmaW5lZChfX2FyY2g2NF9fKSkqLworCisjaWZuZGVmIF9fQVNTRU1CTFlfXworCisjZGVmaW5lIFRSQUNFUkVHX1NaCXNpemVvZihzdHJ1Y3QgcHRfcmVncykKKyNkZWZpbmUgU1RBQ0tGUkFNRV9TWglzaXplb2Yoc3RydWN0IHNwYXJjX3N0YWNrZikKKworI2RlZmluZSBUUkFDRVJFRzMyX1NaCXNpemVvZihzdHJ1Y3QgcHRfcmVnczMyKQorI2RlZmluZSBTVEFDS0ZSQU1FMzJfU1oJc2l6ZW9mKHN0cnVjdCBzcGFyY19zdGFja2YzMikKKworI2VuZGlmIC8qICghX19BU1NFTUJMWV9fKSAqLworCisjZGVmaW5lIFVSRUdfRzAgICAgICAgIDAKKyNkZWZpbmUgVVJFR19HMSAgICAgICAgMQorI2RlZmluZSBVUkVHX0cyICAgICAgICAyCisjZGVmaW5lIFVSRUdfRzMgICAgICAgIDMKKyNkZWZpbmUgVVJFR19HNCAgICAgICAgNAorI2RlZmluZSBVUkVHX0c1ICAgICAgICA1CisjZGVmaW5lIFVSRUdfRzYgICAgICAgIDYKKyNkZWZpbmUgVVJFR19HNyAgICAgICAgNworI2RlZmluZSBVUkVHX0kwICAgICAgICA4CisjZGVmaW5lIFVSRUdfSTEgICAgICAgIDkKKyNkZWZpbmUgVVJFR19JMiAgICAgICAgMTAKKyNkZWZpbmUgVVJFR19JMyAgICAgICAgMTEKKyNkZWZpbmUgVVJFR19JNCAgICAgICAgMTIKKyNkZWZpbmUgVVJFR19JNSAgICAgICAgMTMKKyNkZWZpbmUgVVJFR19JNiAgICAgICAgMTQKKyNkZWZpbmUgVVJFR19JNyAgICAgICAgMTUKKyNkZWZpbmUgVVJFR19GUCAgICAgICAgVVJFR19JNgorI2RlZmluZSBVUkVHX1JFVFBDICAgICBVUkVHX0k3CisKKyNpZiBkZWZpbmVkKF9fc3BhcmNfXykgJiYgZGVmaW5lZChfX2FyY2g2NF9fKQorLyogNjQgYml0IHNwYXJjICovCisKKyNpZm5kZWYgX19BU1NFTUJMWV9fCisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKyNpbmNsdWRlIDxsaW51eC90aHJlYWRzLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorCitzdGF0aWMgaW5saW5lIGludCBwdF9yZWdzX3RyYXBfdHlwZShzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlyZXR1cm4gcmVncy0+bWFnaWMgJiAweDFmZjsKK30KKworc3RhdGljIGlubGluZSBib29sIHB0X3JlZ3NfaXNfc3lzY2FsbChzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlyZXR1cm4gKHJlZ3MtPnRzdGF0ZSAmIFRTVEFURV9TWVNDQUxMKTsKK30KKworc3RhdGljIGlubGluZSBib29sIHB0X3JlZ3NfY2xlYXJfc3lzY2FsbChzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlyZXR1cm4gKHJlZ3MtPnRzdGF0ZSAmPSB+VFNUQVRFX1NZU0NBTEwpOworfQorCisjZGVmaW5lIGFyY2hfcHRyYWNlX3N0b3BfbmVlZGVkKGV4aXRfY29kZSwgaW5mbykgXAorKHsJZmx1c2hfdXNlcl93aW5kb3dzKCk7IFwKKwlnZXRfdGhyZWFkX3dzYXZlZCgpICE9IDA7IFwKK30pCisKKyNkZWZpbmUgYXJjaF9wdHJhY2Vfc3RvcChleGl0X2NvZGUsIGluZm8pIFwKKwlzeW5jaHJvbml6ZV91c2VyX3N0YWNrKCkKKworc3RydWN0IGdsb2JhbF9yZWdfc25hcHNob3QgeworCXVuc2lnbmVkIGxvbmcJCXRzdGF0ZTsKKwl1bnNpZ25lZCBsb25nCQl0cGM7CisJdW5zaWduZWQgbG9uZwkJdG5wYzsKKwl1bnNpZ25lZCBsb25nCQlvNzsKKwl1bnNpZ25lZCBsb25nCQlpNzsKKwl1bnNpZ25lZCBsb25nCQlycGM7CisJc3RydWN0IHRocmVhZF9pbmZvCSp0aHJlYWQ7CisJdW5zaWduZWQgbG9uZwkJcGFkMTsKK307CitleHRlcm4gc3RydWN0IGdsb2JhbF9yZWdfc25hcHNob3QgZ2xvYmFsX3JlZ19zbmFwc2hvdFtOUl9DUFVTXTsKKworI2RlZmluZSBmb3JjZV9zdWNjZXNzZnVsX3N5c2NhbGxfcmV0dXJuKCkJICAgIFwKK2RvIHsJY3VycmVudF90aHJlYWRfaW5mbygpLT5zeXNjYWxsX25vZXJyb3IgPSAxOyBcCit9IHdoaWxlICgwKQorI2RlZmluZSB1c2VyX21vZGUocmVncykgKCEoKHJlZ3MpLT50c3RhdGUgJiBUU1RBVEVfUFJJVikpCisjZGVmaW5lIGluc3RydWN0aW9uX3BvaW50ZXIocmVncykgKChyZWdzKS0+dHBjKQorI2RlZmluZSB1c2VyX3N0YWNrX3BvaW50ZXIocmVncykgKChyZWdzKS0+dV9yZWdzW1VSRUdfRlBdKQorI2RlZmluZSByZWdzX3JldHVybl92YWx1ZShyZWdzKSAoKHJlZ3MpLT51X3JlZ3NbVVJFR19JMF0pCisjaWZkZWYgQ09ORklHX1NNUAorZXh0ZXJuIHVuc2lnbmVkIGxvbmcgcHJvZmlsZV9wYyhzdHJ1Y3QgcHRfcmVncyAqKTsKKyNlbHNlCisjZGVmaW5lIHByb2ZpbGVfcGMocmVncykgaW5zdHJ1Y3Rpb25fcG9pbnRlcihyZWdzKQogI2VuZGlmCitleHRlcm4gdm9pZCBzaG93X3JlZ3Moc3RydWN0IHB0X3JlZ3MgKik7CisjZW5kaWYgLyogKF9fS0VSTkVMX18pICovCisKKyNlbHNlIC8qIF9fQVNTRU1CTFlfXyAqLworLyogRm9yIGFzc2VtYmx5IGNvZGUuICovCisjZGVmaW5lIFRSQUNFUkVHX1NaCQkweGEwCisjZGVmaW5lIFNUQUNLRlJBTUVfU1oJCTB4YzAKKworI2RlZmluZSBUUkFDRVJFRzMyX1NaCQkweDUwCisjZGVmaW5lIFNUQUNLRlJBTUUzMl9TWgkJMHg2MAorI2VuZGlmIC8qIF9fQVNTRU1CTFlfXyAqLworCisjZWxzZSAvKiAoZGVmaW5lZChfX3NwYXJjX18pICYmIGRlZmluZWQoX19hcmNoNjRfXykpICovCisKKy8qIDMyIGJpdCBzcGFyYyAqLworCisjaWZuZGVmIF9fQVNTRU1CTFlfXworCisjaWZkZWYgX19LRVJORUxfXworCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorCitzdGF0aWMgaW5saW5lIGJvb2wgcHRfcmVnc19pc19zeXNjYWxsKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXJldHVybiAocmVncy0+cHNyICYgUFNSX1NZU0NBTEwpOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgcHRfcmVnc19jbGVhcl9zeXNjYWxsKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXJldHVybiAocmVncy0+cHNyICY9IH5QU1JfU1lTQ0FMTCk7Cit9CisKKyNkZWZpbmUgYXJjaF9wdHJhY2Vfc3RvcF9uZWVkZWQoZXhpdF9jb2RlLCBpbmZvKSBcCisoewlmbHVzaF91c2VyX3dpbmRvd3MoKTsgXAorCWN1cnJlbnRfdGhyZWFkX2luZm8oKS0+d19zYXZlZCAhPSAwOwlcCit9KQorCisjZGVmaW5lIGFyY2hfcHRyYWNlX3N0b3AoZXhpdF9jb2RlLCBpbmZvKSBcCisJc3luY2hyb25pemVfdXNlcl9zdGFjaygpCisKKyNkZWZpbmUgdXNlcl9tb2RlKHJlZ3MpICghKChyZWdzKS0+cHNyICYgUFNSX1BTKSkKKyNkZWZpbmUgaW5zdHJ1Y3Rpb25fcG9pbnRlcihyZWdzKSAoKHJlZ3MpLT5wYykKKyNkZWZpbmUgdXNlcl9zdGFja19wb2ludGVyKHJlZ3MpICgocmVncyktPnVfcmVnc1tVUkVHX0ZQXSkKK3Vuc2lnbmVkIGxvbmcgcHJvZmlsZV9wYyhzdHJ1Y3QgcHRfcmVncyAqKTsKK2V4dGVybiB2b2lkIHNob3dfcmVncyhzdHJ1Y3QgcHRfcmVncyAqKTsKKyNlbmRpZiAvKiAoX19LRVJORUxfXykgKi8KKworI2Vsc2UgLyogKCFfX0FTU0VNQkxZX18pICovCisvKiBGb3IgYXNzZW1ibHkgY29kZS4gKi8KKyNkZWZpbmUgVFJBQ0VSRUdfU1ogICAgICAgMHg1MAorI2RlZmluZSBTVEFDS0ZSQU1FX1NaICAgICAweDYwCisjZW5kaWYgLyogKCFfX0FTU0VNQkxZX18pICovCisKKyNlbmRpZiAvKiAoZGVmaW5lZChfX3NwYXJjX18pICYmIGRlZmluZWQoX19hcmNoNjRfXykpICovCisKKyNpZmRlZiBfX0tFUk5FTF9fCisjZGVmaW5lIFNUQUNLX0JJQVMJCTIwNDcKICNlbmRpZgorCisvKiBUaGVzZSBhcmUgZm9yIHB0X3JlZ3MuICovCisjZGVmaW5lIFBUX1Y5X0cwICAgICAweDAwCisjZGVmaW5lIFBUX1Y5X0cxICAgICAweDA4CisjZGVmaW5lIFBUX1Y5X0cyICAgICAweDEwCisjZGVmaW5lIFBUX1Y5X0czICAgICAweDE4CisjZGVmaW5lIFBUX1Y5X0c0ICAgICAweDIwCisjZGVmaW5lIFBUX1Y5X0c1ICAgICAweDI4CisjZGVmaW5lIFBUX1Y5X0c2ICAgICAweDMwCisjZGVmaW5lIFBUX1Y5X0c3ICAgICAweDM4CisjZGVmaW5lIFBUX1Y5X0kwICAgICAweDQwCisjZGVmaW5lIFBUX1Y5X0kxICAgICAweDQ4CisjZGVmaW5lIFBUX1Y5X0kyICAgICAweDUwCisjZGVmaW5lIFBUX1Y5X0kzICAgICAweDU4CisjZGVmaW5lIFBUX1Y5X0k0ICAgICAweDYwCisjZGVmaW5lIFBUX1Y5X0k1ICAgICAweDY4CisjZGVmaW5lIFBUX1Y5X0k2ICAgICAweDcwCisjZGVmaW5lIFBUX1Y5X0ZQICAgICBQVF9WOV9JNgorI2RlZmluZSBQVF9WOV9JNyAgICAgMHg3OAorI2RlZmluZSBQVF9WOV9UU1RBVEUgMHg4MAorI2RlZmluZSBQVF9WOV9UUEMgICAgMHg4OAorI2RlZmluZSBQVF9WOV9UTlBDICAgMHg5MAorI2RlZmluZSBQVF9WOV9ZICAgICAgMHg5OAorI2RlZmluZSBQVF9WOV9NQUdJQyAgMHg5YworI2RlZmluZSBQVF9UU1RBVEUJUFRfVjlfVFNUQVRFCisjZGVmaW5lIFBUX1RQQwkJUFRfVjlfVFBDCisjZGVmaW5lIFBUX1ROUEMJCVBUX1Y5X1ROUEMKKworLyogVGhlc2UgZm9yIHB0X3JlZ3MzMi4gKi8KKyNkZWZpbmUgUFRfUFNSICAgIDB4MAorI2RlZmluZSBQVF9QQyAgICAgMHg0CisjZGVmaW5lIFBUX05QQyAgICAweDgKKyNkZWZpbmUgUFRfWSAgICAgIDB4YworI2RlZmluZSBQVF9HMCAgICAgMHgxMAorI2RlZmluZSBQVF9XSU0gICAgUFRfRzAKKyNkZWZpbmUgUFRfRzEgICAgIDB4MTQKKyNkZWZpbmUgUFRfRzIgICAgIDB4MTgKKyNkZWZpbmUgUFRfRzMgICAgIDB4MWMKKyNkZWZpbmUgUFRfRzQgICAgIDB4MjAKKyNkZWZpbmUgUFRfRzUgICAgIDB4MjQKKyNkZWZpbmUgUFRfRzYgICAgIDB4MjgKKyNkZWZpbmUgUFRfRzcgICAgIDB4MmMKKyNkZWZpbmUgUFRfSTAgICAgIDB4MzAKKyNkZWZpbmUgUFRfSTEgICAgIDB4MzQKKyNkZWZpbmUgUFRfSTIgICAgIDB4MzgKKyNkZWZpbmUgUFRfSTMgICAgIDB4M2MKKyNkZWZpbmUgUFRfSTQgICAgIDB4NDAKKyNkZWZpbmUgUFRfSTUgICAgIDB4NDQKKyNkZWZpbmUgUFRfSTYgICAgIDB4NDgKKyNkZWZpbmUgUFRfRlAgICAgIFBUX0k2CisjZGVmaW5lIFBUX0k3ICAgICAweDRjCisKKy8qIFJlZ193aW5kb3cgb2Zmc2V0cyAqLworI2RlZmluZSBSV19WOV9MMCAgICAgMHgwMAorI2RlZmluZSBSV19WOV9MMSAgICAgMHgwOAorI2RlZmluZSBSV19WOV9MMiAgICAgMHgxMAorI2RlZmluZSBSV19WOV9MMyAgICAgMHgxOAorI2RlZmluZSBSV19WOV9MNCAgICAgMHgyMAorI2RlZmluZSBSV19WOV9MNSAgICAgMHgyOAorI2RlZmluZSBSV19WOV9MNiAgICAgMHgzMAorI2RlZmluZSBSV19WOV9MNyAgICAgMHgzOAorI2RlZmluZSBSV19WOV9JMCAgICAgMHg0MAorI2RlZmluZSBSV19WOV9JMSAgICAgMHg0OAorI2RlZmluZSBSV19WOV9JMiAgICAgMHg1MAorI2RlZmluZSBSV19WOV9JMyAgICAgMHg1OAorI2RlZmluZSBSV19WOV9JNCAgICAgMHg2MAorI2RlZmluZSBSV19WOV9JNSAgICAgMHg2OAorI2RlZmluZSBSV19WOV9JNiAgICAgMHg3MAorI2RlZmluZSBSV19WOV9JNyAgICAgMHg3OAorCisjZGVmaW5lIFJXX0wwICAgICAweDAwCisjZGVmaW5lIFJXX0wxICAgICAweDA0CisjZGVmaW5lIFJXX0wyICAgICAweDA4CisjZGVmaW5lIFJXX0wzICAgICAweDBjCisjZGVmaW5lIFJXX0w0ICAgICAweDEwCisjZGVmaW5lIFJXX0w1ICAgICAweDE0CisjZGVmaW5lIFJXX0w2ICAgICAweDE4CisjZGVmaW5lIFJXX0w3ICAgICAweDFjCisjZGVmaW5lIFJXX0kwICAgICAweDIwCisjZGVmaW5lIFJXX0kxICAgICAweDI0CisjZGVmaW5lIFJXX0kyICAgICAweDI4CisjZGVmaW5lIFJXX0kzICAgICAweDJjCisjZGVmaW5lIFJXX0k0ICAgICAweDMwCisjZGVmaW5lIFJXX0k1ICAgICAweDM0CisjZGVmaW5lIFJXX0k2ICAgICAweDM4CisjZGVmaW5lIFJXX0k3ICAgICAweDNjCisKKy8qIFN0YWNrX2ZyYW1lIG9mZnNldHMgKi8KKyNkZWZpbmUgU0ZfVjlfTDAgICAgIDB4MDAKKyNkZWZpbmUgU0ZfVjlfTDEgICAgIDB4MDgKKyNkZWZpbmUgU0ZfVjlfTDIgICAgIDB4MTAKKyNkZWZpbmUgU0ZfVjlfTDMgICAgIDB4MTgKKyNkZWZpbmUgU0ZfVjlfTDQgICAgIDB4MjAKKyNkZWZpbmUgU0ZfVjlfTDUgICAgIDB4MjgKKyNkZWZpbmUgU0ZfVjlfTDYgICAgIDB4MzAKKyNkZWZpbmUgU0ZfVjlfTDcgICAgIDB4MzgKKyNkZWZpbmUgU0ZfVjlfSTAgICAgIDB4NDAKKyNkZWZpbmUgU0ZfVjlfSTEgICAgIDB4NDgKKyNkZWZpbmUgU0ZfVjlfSTIgICAgIDB4NTAKKyNkZWZpbmUgU0ZfVjlfSTMgICAgIDB4NTgKKyNkZWZpbmUgU0ZfVjlfSTQgICAgIDB4NjAKKyNkZWZpbmUgU0ZfVjlfSTUgICAgIDB4NjgKKyNkZWZpbmUgU0ZfVjlfRlAgICAgIDB4NzAKKyNkZWZpbmUgU0ZfVjlfUEMgICAgIDB4NzgKKyNkZWZpbmUgU0ZfVjlfUkVUUCAgIDB4ODAKKyNkZWZpbmUgU0ZfVjlfWEFSRzAgIDB4ODgKKyNkZWZpbmUgU0ZfVjlfWEFSRzEgIDB4OTAKKyNkZWZpbmUgU0ZfVjlfWEFSRzIgIDB4OTgKKyNkZWZpbmUgU0ZfVjlfWEFSRzMgIDB4YTAKKyNkZWZpbmUgU0ZfVjlfWEFSRzQgIDB4YTgKKyNkZWZpbmUgU0ZfVjlfWEFSRzUgIDB4YjAKKyNkZWZpbmUgU0ZfVjlfWFhBUkcgIDB4YjgKKworI2RlZmluZSBTRl9MMCAgICAgMHgwMAorI2RlZmluZSBTRl9MMSAgICAgMHgwNAorI2RlZmluZSBTRl9MMiAgICAgMHgwOAorI2RlZmluZSBTRl9MMyAgICAgMHgwYworI2RlZmluZSBTRl9MNCAgICAgMHgxMAorI2RlZmluZSBTRl9MNSAgICAgMHgxNAorI2RlZmluZSBTRl9MNiAgICAgMHgxOAorI2RlZmluZSBTRl9MNyAgICAgMHgxYworI2RlZmluZSBTRl9JMCAgICAgMHgyMAorI2RlZmluZSBTRl9JMSAgICAgMHgyNAorI2RlZmluZSBTRl9JMiAgICAgMHgyOAorI2RlZmluZSBTRl9JMyAgICAgMHgyYworI2RlZmluZSBTRl9JNCAgICAgMHgzMAorI2RlZmluZSBTRl9JNSAgICAgMHgzNAorI2RlZmluZSBTRl9GUCAgICAgMHgzOAorI2RlZmluZSBTRl9QQyAgICAgMHgzYworI2RlZmluZSBTRl9SRVRQICAgMHg0MAorI2RlZmluZSBTRl9YQVJHMCAgMHg0NAorI2RlZmluZSBTRl9YQVJHMSAgMHg0OAorI2RlZmluZSBTRl9YQVJHMiAgMHg0YworI2RlZmluZSBTRl9YQVJHMyAgMHg1MAorI2RlZmluZSBTRl9YQVJHNCAgMHg1NAorI2RlZmluZSBTRl9YQVJHNSAgMHg1OAorI2RlZmluZSBTRl9YWEFSRyAgMHg1YworCisjaWZkZWYgX19LRVJORUxfXworCisvKiBnbG9iYWxfcmVnX3NuYXBzaG90IG9mZnNldHMgKi8KKyNkZWZpbmUgR1JfU05BUF9UU1RBVEUJMHgwMAorI2RlZmluZSBHUl9TTkFQX1RQQwkweDA4CisjZGVmaW5lIEdSX1NOQVBfVE5QQwkweDEwCisjZGVmaW5lIEdSX1NOQVBfTzcJMHgxOAorI2RlZmluZSBHUl9TTkFQX0k3CTB4MjAKKyNkZWZpbmUgR1JfU05BUF9SUEMJMHgyOAorI2RlZmluZSBHUl9TTkFQX1RIUkVBRAkweDMwCisjZGVmaW5lIEdSX1NOQVBfUEFEMQkweDM4CisKKyNlbmRpZiAgLyogIF9fS0VSTkVMX18gICovCisKKy8qIFN0dWZmIGZvciB0aGUgcHRyYWNlIHN5c3RlbSBjYWxsICovCisjZGVmaW5lIFBUUkFDRV9TUEFSQ19ERVRBQ0ggICAgICAgMTEKKyNkZWZpbmUgUFRSQUNFX0dFVFJFR1MgICAgICAgICAgICAxMgorI2RlZmluZSBQVFJBQ0VfU0VUUkVHUyAgICAgICAgICAgIDEzCisjZGVmaW5lIFBUUkFDRV9HRVRGUFJFR1MgICAgICAgICAgMTQKKyNkZWZpbmUgUFRSQUNFX1NFVEZQUkVHUyAgICAgICAgICAxNQorI2RlZmluZSBQVFJBQ0VfUkVBRERBVEEgICAgICAgICAgIDE2CisjZGVmaW5lIFBUUkFDRV9XUklURURBVEEgICAgICAgICAgMTcKKyNkZWZpbmUgUFRSQUNFX1JFQURURVhUICAgICAgICAgICAxOAorI2RlZmluZSBQVFJBQ0VfV1JJVEVURVhUICAgICAgICAgIDE5CisjZGVmaW5lIFBUUkFDRV9HRVRGUEFSRUdTICAgICAgICAgMjAKKyNkZWZpbmUgUFRSQUNFX1NFVEZQQVJFR1MgICAgICAgICAyMQorCisvKiBUaGVyZSBhcmUgZm9yIGRlYnVnZ2luZyA2NC1iaXQgcHJvY2Vzc2VzLCBlaXRoZXIgZnJvbSBhIDMyIG9yIDY0IGJpdAorICogcGFyZW50LiAgVGh1cyB0aGVpciBjb21wbGVtZW50cyBhcmUgZm9yIGRlYnVnZ2luZyAzMi1iaXQgcHJvY2Vzc2VzIG9ubHkuCisgKi8KKworI2RlZmluZSBQVFJBQ0VfR0VUUkVHUzY0CSAgMjIKKyNkZWZpbmUgUFRSQUNFX1NFVFJFR1M2NAkgIDIzCisvKiBQVFJBQ0VfU1lTQ0FMTCBpcyAyNCAqLworI2RlZmluZSBQVFJBQ0VfR0VURlBSRUdTNjQJICAyNQorI2RlZmluZSBQVFJBQ0VfU0VURlBSRUdTNjQJICAyNgorCisjZW5kaWYgLyogIShfX1NQQVJDX1BUUkFDRV9IKSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9wdHJhY2VfMzIuaCBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vcHRyYWNlXzMyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjZWY0NTAuLjAwMDAwMDAKLS0tIGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9wdHJhY2VfMzIuaAorKysgL2Rldi9udWxsCkBAIC0xLDE4NiArMCwwIEBACi0jaWZuZGVmIF9TUEFSQ19QVFJBQ0VfSAotI2RlZmluZSBfU1BBUkNfUFRSQUNFX0gKLQotI2luY2x1ZGUgPGFzbS9wc3IuaD4KLQotLyogVGhpcyBzdHJ1Y3QgZGVmaW5lcyB0aGUgd2F5IHRoZSByZWdpc3RlcnMgYXJlIHN0b3JlZCBvbiB0aGUKLSAqIHN0YWNrIGR1cmluZyBhIHN5c3RlbSBjYWxsIGFuZCBiYXNpY2FsbHkgYWxsIHRyYXBzLgotICovCi0KLSNpZm5kZWYgX19BU1NFTUJMWV9fCi0KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotCi1zdHJ1Y3QgcHRfcmVncyB7Ci0JdW5zaWduZWQgbG9uZyBwc3I7Ci0JdW5zaWduZWQgbG9uZyBwYzsKLQl1bnNpZ25lZCBsb25nIG5wYzsKLQl1bnNpZ25lZCBsb25nIHk7Ci0JdW5zaWduZWQgbG9uZyB1X3JlZ3NbMTZdOyAvKiBnbG9iYWxzIGFuZCBpbnMgKi8KLX07Ci0KLSNkZWZpbmUgVVJFR19HMCAgICAgICAgMAotI2RlZmluZSBVUkVHX0cxICAgICAgICAxCi0jZGVmaW5lIFVSRUdfRzIgICAgICAgIDIKLSNkZWZpbmUgVVJFR19HMyAgICAgICAgMwotI2RlZmluZSBVUkVHX0c0ICAgICAgICA0Ci0jZGVmaW5lIFVSRUdfRzUgICAgICAgIDUKLSNkZWZpbmUgVVJFR19HNiAgICAgICAgNgotI2RlZmluZSBVUkVHX0c3ICAgICAgICA3Ci0jZGVmaW5lIFVSRUdfSTAgICAgICAgIDgKLSNkZWZpbmUgVVJFR19JMSAgICAgICAgOQotI2RlZmluZSBVUkVHX0kyICAgICAgICAxMAotI2RlZmluZSBVUkVHX0kzICAgICAgICAxMQotI2RlZmluZSBVUkVHX0k0ICAgICAgICAxMgotI2RlZmluZSBVUkVHX0k1ICAgICAgICAxMwotI2RlZmluZSBVUkVHX0k2ICAgICAgICAxNAotI2RlZmluZSBVUkVHX0k3ICAgICAgICAxNQotI2RlZmluZSBVUkVHX1dJTSAgICAgICBVUkVHX0cwCi0jZGVmaW5lIFVSRUdfRkFERFIgICAgIFVSRUdfRzAKLSNkZWZpbmUgVVJFR19GUCAgICAgICAgVVJFR19JNgotI2RlZmluZSBVUkVHX1JFVFBDICAgICBVUkVHX0k3Ci0KLS8qIEEgcmVnaXN0ZXIgd2luZG93ICovCi1zdHJ1Y3QgcmVnX3dpbmRvdyB7Ci0JdW5zaWduZWQgbG9uZyBsb2NhbHNbOF07Ci0JdW5zaWduZWQgbG9uZyBpbnNbOF07Ci19OwotCi0vKiBBIFNwYXJjIHN0YWNrIGZyYW1lICovCi1zdHJ1Y3Qgc3BhcmNfc3RhY2tmIHsKLQl1bnNpZ25lZCBsb25nIGxvY2Fsc1s4XTsKLSAgICAgICAgdW5zaWduZWQgbG9uZyBpbnNbNl07Ci0Jc3RydWN0IHNwYXJjX3N0YWNrZiAqZnA7Ci0JdW5zaWduZWQgbG9uZyBjYWxsZXJzX3BjOwotCWNoYXIgKnN0cnVjdHB0cjsKLQl1bnNpZ25lZCBsb25nIHhhcmdzWzZdOwotCXVuc2lnbmVkIGxvbmcgeHhhcmdzWzFdOwotfTsKLQotI2RlZmluZSBUUkFDRVJFR19TWiAgIHNpemVvZihzdHJ1Y3QgcHRfcmVncykKLSNkZWZpbmUgU1RBQ0tGUkFNRV9TWiBzaXplb2Yoc3RydWN0IHNwYXJjX3N0YWNrZikKLQotI2lmZGVmIF9fS0VSTkVMX18KLQotI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KLQotc3RhdGljIGlubGluZSBib29sIHB0X3JlZ3NfaXNfc3lzY2FsbChzdHJ1Y3QgcHRfcmVncyAqcmVncykKLXsKLQlyZXR1cm4gKHJlZ3MtPnBzciAmIFBTUl9TWVNDQUxMKTsKLX0KLQotc3RhdGljIGlubGluZSBib29sIHB0X3JlZ3NfY2xlYXJfc3lzY2FsbChzdHJ1Y3QgcHRfcmVncyAqcmVncykKLXsKLQlyZXR1cm4gKHJlZ3MtPnBzciAmPSB+UFNSX1NZU0NBTEwpOwotfQotCi0jZGVmaW5lIGFyY2hfcHRyYWNlX3N0b3BfbmVlZGVkKGV4aXRfY29kZSwgaW5mbykgXAotKHsJZmx1c2hfdXNlcl93aW5kb3dzKCk7IFwKLQljdXJyZW50X3RocmVhZF9pbmZvKCktPndfc2F2ZWQgIT0gMDsJXAotfSkKLQotI2RlZmluZSBhcmNoX3B0cmFjZV9zdG9wKGV4aXRfY29kZSwgaW5mbykgXAotCXN5bmNocm9uaXplX3VzZXJfc3RhY2soKQotCi0jZGVmaW5lIHVzZXJfbW9kZShyZWdzKSAoISgocmVncyktPnBzciAmIFBTUl9QUykpCi0jZGVmaW5lIGluc3RydWN0aW9uX3BvaW50ZXIocmVncykgKChyZWdzKS0+cGMpCi0jZGVmaW5lIHVzZXJfc3RhY2tfcG9pbnRlcihyZWdzKSAoKHJlZ3MpLT51X3JlZ3NbVVJFR19GUF0pCi11bnNpZ25lZCBsb25nIHByb2ZpbGVfcGMoc3RydWN0IHB0X3JlZ3MgKik7Ci1leHRlcm4gdm9pZCBzaG93X3JlZ3Moc3RydWN0IHB0X3JlZ3MgKik7Ci0jZW5kaWYKLQotI2Vsc2UgLyogX19BU1NFTUJMWV9fICovCi0vKiBGb3IgYXNzZW1ibHkgY29kZS4gKi8KLSNkZWZpbmUgVFJBQ0VSRUdfU1ogICAgICAgMHg1MAotI2RlZmluZSBTVEFDS0ZSQU1FX1NaICAgICAweDYwCi0jZW5kaWYKLQotLyoKLSAqIFRoZSBhc20tb2Zmc2V0cy5oIGlzIGEgZ2VuZXJhdGVkIGZpbGUsIHNvIHdlIGNhbm5vdCBpbmNsdWRlIGl0LgotICogSXQgbWF5IGJlIE9LIGZvciBnbGliYyBoZWFkZXJzLCBidXQgaXQncyB1dHRlcmx5IHBvaW50bGVzcyBmb3IgQyBjb2RlLgotICogVGhlIGFzc2VtYmx5IGNvZGUgdXNpbmcgdGhvc2Ugb2Zmc2V0cyBoYXMgdG8gaW5jbHVkZSBpdCBleHBsaWNpdGx5LgotICovCi0vKiAjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+ICovCi0KLS8qIFRoZXNlIGFyZSBmb3IgcHRfcmVncy4gKi8KLSNkZWZpbmUgUFRfUFNSICAgIDB4MAotI2RlZmluZSBQVF9QQyAgICAgMHg0Ci0jZGVmaW5lIFBUX05QQyAgICAweDgKLSNkZWZpbmUgUFRfWSAgICAgIDB4YwotI2RlZmluZSBQVF9HMCAgICAgMHgxMAotI2RlZmluZSBQVF9XSU0gICAgUFRfRzAKLSNkZWZpbmUgUFRfRzEgICAgIDB4MTQKLSNkZWZpbmUgUFRfRzIgICAgIDB4MTgKLSNkZWZpbmUgUFRfRzMgICAgIDB4MWMKLSNkZWZpbmUgUFRfRzQgICAgIDB4MjAKLSNkZWZpbmUgUFRfRzUgICAgIDB4MjQKLSNkZWZpbmUgUFRfRzYgICAgIDB4MjgKLSNkZWZpbmUgUFRfRzcgICAgIDB4MmMKLSNkZWZpbmUgUFRfSTAgICAgIDB4MzAKLSNkZWZpbmUgUFRfSTEgICAgIDB4MzQKLSNkZWZpbmUgUFRfSTIgICAgIDB4MzgKLSNkZWZpbmUgUFRfSTMgICAgIDB4M2MKLSNkZWZpbmUgUFRfSTQgICAgIDB4NDAKLSNkZWZpbmUgUFRfSTUgICAgIDB4NDQKLSNkZWZpbmUgUFRfSTYgICAgIDB4NDgKLSNkZWZpbmUgUFRfRlAgICAgIFBUX0k2Ci0jZGVmaW5lIFBUX0k3ICAgICAweDRjCi0KLS8qIFJlZ193aW5kb3cgb2Zmc2V0cyAqLwotI2RlZmluZSBSV19MMCAgICAgMHgwMAotI2RlZmluZSBSV19MMSAgICAgMHgwNAotI2RlZmluZSBSV19MMiAgICAgMHgwOAotI2RlZmluZSBSV19MMyAgICAgMHgwYwotI2RlZmluZSBSV19MNCAgICAgMHgxMAotI2RlZmluZSBSV19MNSAgICAgMHgxNAotI2RlZmluZSBSV19MNiAgICAgMHgxOAotI2RlZmluZSBSV19MNyAgICAgMHgxYwotI2RlZmluZSBSV19JMCAgICAgMHgyMAotI2RlZmluZSBSV19JMSAgICAgMHgyNAotI2RlZmluZSBSV19JMiAgICAgMHgyOAotI2RlZmluZSBSV19JMyAgICAgMHgyYwotI2RlZmluZSBSV19JNCAgICAgMHgzMAotI2RlZmluZSBSV19JNSAgICAgMHgzNAotI2RlZmluZSBSV19JNiAgICAgMHgzOAotI2RlZmluZSBSV19JNyAgICAgMHgzYwotCi0vKiBTdGFja19mcmFtZSBvZmZzZXRzICovCi0jZGVmaW5lIFNGX0wwICAgICAweDAwCi0jZGVmaW5lIFNGX0wxICAgICAweDA0Ci0jZGVmaW5lIFNGX0wyICAgICAweDA4Ci0jZGVmaW5lIFNGX0wzICAgICAweDBjCi0jZGVmaW5lIFNGX0w0ICAgICAweDEwCi0jZGVmaW5lIFNGX0w1ICAgICAweDE0Ci0jZGVmaW5lIFNGX0w2ICAgICAweDE4Ci0jZGVmaW5lIFNGX0w3ICAgICAweDFjCi0jZGVmaW5lIFNGX0kwICAgICAweDIwCi0jZGVmaW5lIFNGX0kxICAgICAweDI0Ci0jZGVmaW5lIFNGX0kyICAgICAweDI4Ci0jZGVmaW5lIFNGX0kzICAgICAweDJjCi0jZGVmaW5lIFNGX0k0ICAgICAweDMwCi0jZGVmaW5lIFNGX0k1ICAgICAweDM0Ci0jZGVmaW5lIFNGX0ZQICAgICAweDM4Ci0jZGVmaW5lIFNGX1BDICAgICAweDNjCi0jZGVmaW5lIFNGX1JFVFAgICAweDQwCi0jZGVmaW5lIFNGX1hBUkcwICAweDQ0Ci0jZGVmaW5lIFNGX1hBUkcxICAweDQ4Ci0jZGVmaW5lIFNGX1hBUkcyICAweDRjCi0jZGVmaW5lIFNGX1hBUkczICAweDUwCi0jZGVmaW5lIFNGX1hBUkc0ICAweDU0Ci0jZGVmaW5lIFNGX1hBUkc1ICAweDU4Ci0jZGVmaW5lIFNGX1hYQVJHICAweDVjCi0KLS8qIFN0dWZmIGZvciB0aGUgcHRyYWNlIHN5c3RlbSBjYWxsICovCi0jZGVmaW5lIFBUUkFDRV9TUEFSQ19ERVRBQ0ggICAgICAgMTEKLSNkZWZpbmUgUFRSQUNFX0dFVFJFR1MgICAgICAgICAgICAxMgotI2RlZmluZSBQVFJBQ0VfU0VUUkVHUyAgICAgICAgICAgIDEzCi0jZGVmaW5lIFBUUkFDRV9HRVRGUFJFR1MgICAgICAgICAgMTQKLSNkZWZpbmUgUFRSQUNFX1NFVEZQUkVHUyAgICAgICAgICAxNQotI2RlZmluZSBQVFJBQ0VfUkVBRERBVEEgICAgICAgICAgIDE2Ci0jZGVmaW5lIFBUUkFDRV9XUklURURBVEEgICAgICAgICAgMTcKLSNkZWZpbmUgUFRSQUNFX1JFQURURVhUICAgICAgICAgICAxOAotI2RlZmluZSBQVFJBQ0VfV1JJVEVURVhUICAgICAgICAgIDE5Ci0jZGVmaW5lIFBUUkFDRV9HRVRGUEFSRUdTICAgICAgICAgMjAKLSNkZWZpbmUgUFRSQUNFX1NFVEZQQVJFR1MgICAgICAgICAyMQotCi0jZW5kaWYgLyogIShfU1BBUkNfUFRSQUNFX0gpICovCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3B0cmFjZV82NC5oIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9wdHJhY2VfNjQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Q2ZmJmYy4uMDAwMDAwMAotLS0gYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3B0cmFjZV82NC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzU2ICswLDAgQEAKLSNpZm5kZWYgX1NQQVJDNjRfUFRSQUNFX0gKLSNkZWZpbmUgX1NQQVJDNjRfUFRSQUNFX0gKLQotI2luY2x1ZGUgPGFzbS9wc3RhdGUuaD4KLQotLyogVGhpcyBzdHJ1Y3QgZGVmaW5lcyB0aGUgd2F5IHRoZSByZWdpc3RlcnMgYXJlIHN0b3JlZCBvbiB0aGUKLSAqIHN0YWNrIGR1cmluZyBhIHN5c3RlbSBjYWxsIGFuZCBiYXNpY2FsbHkgYWxsIHRyYXBzLgotICovCi0KLS8qIFRoaXMgbWFnaWMgdmFsdWUgbXVzdCBoYXZlIHRoZSBsb3cgOSBiaXRzIGNsZWFyLAotICogYXMgdGhhdCBpcyB3aGVyZSB3ZSBlbmNvZGUgdGhlICV0dCB2YWx1ZSwgc2VlIGJlbG93LgotICovCi0jZGVmaW5lIFBUX1JFR1NfTUFHSUMgMHg1N2FjNmMwMAotCi0jaWZuZGVmIF9fQVNTRU1CTFlfXwotCi0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLQotc3RydWN0IHB0X3JlZ3MgewotCXVuc2lnbmVkIGxvbmcgdV9yZWdzWzE2XTsgLyogZ2xvYmFscyBhbmQgaW5zICovCi0JdW5zaWduZWQgbG9uZyB0c3RhdGU7Ci0JdW5zaWduZWQgbG9uZyB0cGM7Ci0JdW5zaWduZWQgbG9uZyB0bnBjOwotCXVuc2lnbmVkIGludCB5OwotCi0JLyogV2UgZW5jb2RlIGEgbWFnaWMgbnVtYmVyLCBQVF9SRUdTX01BR0lDLCBhbG9uZwotCSAqIHdpdGggdGhlICV0dCAodHJhcCB0eXBlKSByZWdpc3RlciB2YWx1ZSBhdCB0cmFwCi0JICogZW50cnkgdGltZS4gIFRoZSBtYWdpYyBudW1iZXIgYWxsb3dzIHVzIHRvIGlkZW50aWZ5Ci0JICogYWNjdXJhdGVseSBhIHRyYXAgc3RhY2sgZnJhbWUgaW4gdGhlIHN0YWNrCi0JICogdW53aW5kZXIsIGFuZCB0aGUgJXR0IHZhbHVlIGFsbG93cyB1cyB0byB0ZXN0Ci0JICogdGhpbmdzIGxpa2UgImluIGEgc3lzdGVtIGNhbGwiIGV0Yy4gZm9yIGFuIGFyYml0cmF5Ci0JICogcHJvY2Vzcy4KLQkgKgotCSAqIFRoZSBQVF9SRUdTX01BR0lDIGlzIGNob29zZW4gc3VjaCB0aGF0IGl0IGNhbiBiZQotCSAqIGxvYWRlZCBjb21wbGV0ZWx5IHVzaW5nIGp1c3QgYSBzZXRoaSBpbnN0cnVjdGlvbi4KLQkgKi8KLQl1bnNpZ25lZCBpbnQgbWFnaWM7Ci19OwotCi1zdHJ1Y3QgcHRfcmVnczMyIHsKLQl1bnNpZ25lZCBpbnQgcHNyOwotCXVuc2lnbmVkIGludCBwYzsKLQl1bnNpZ25lZCBpbnQgbnBjOwotCXVuc2lnbmVkIGludCB5OwotCXVuc2lnbmVkIGludCB1X3JlZ3NbMTZdOyAvKiBnbG9iYWxzIGFuZCBpbnMgKi8KLX07Ci0KLSNkZWZpbmUgVVJFR19HMCAgICAgICAgMAotI2RlZmluZSBVUkVHX0cxICAgICAgICAxCi0jZGVmaW5lIFVSRUdfRzIgICAgICAgIDIKLSNkZWZpbmUgVVJFR19HMyAgICAgICAgMwotI2RlZmluZSBVUkVHX0c0ICAgICAgICA0Ci0jZGVmaW5lIFVSRUdfRzUgICAgICAgIDUKLSNkZWZpbmUgVVJFR19HNiAgICAgICAgNgotI2RlZmluZSBVUkVHX0c3ICAgICAgICA3Ci0jZGVmaW5lIFVSRUdfSTAgICAgICAgIDgKLSNkZWZpbmUgVVJFR19JMSAgICAgICAgOQotI2RlZmluZSBVUkVHX0kyICAgICAgICAxMAotI2RlZmluZSBVUkVHX0kzICAgICAgICAxMQotI2RlZmluZSBVUkVHX0k0ICAgICAgICAxMgotI2RlZmluZSBVUkVHX0k1ICAgICAgICAxMwotI2RlZmluZSBVUkVHX0k2ICAgICAgICAxNAotI2RlZmluZSBVUkVHX0k3ICAgICAgICAxNQotI2RlZmluZSBVUkVHX0ZQICAgICAgICBVUkVHX0k2Ci0jZGVmaW5lIFVSRUdfUkVUUEMgICAgIFVSRUdfSTcKLQotLyogQSBWOSByZWdpc3RlciB3aW5kb3cgKi8KLXN0cnVjdCByZWdfd2luZG93IHsKLQl1bnNpZ25lZCBsb25nIGxvY2Fsc1s4XTsKLQl1bnNpZ25lZCBsb25nIGluc1s4XTsKLX07Ci0KLS8qIEEgMzItYml0IHJlZ2lzdGVyIHdpbmRvdy4gKi8KLXN0cnVjdCByZWdfd2luZG93MzIgewotCXVuc2lnbmVkIGludCBsb2NhbHNbOF07Ci0JdW5zaWduZWQgaW50IGluc1s4XTsKLX07Ci0KLS8qIEEgVjkgU3BhcmMgc3RhY2sgZnJhbWUgKi8KLXN0cnVjdCBzcGFyY19zdGFja2YgewotCXVuc2lnbmVkIGxvbmcgbG9jYWxzWzhdOwotICAgICAgICB1bnNpZ25lZCBsb25nIGluc1s2XTsKLQlzdHJ1Y3Qgc3BhcmNfc3RhY2tmICpmcDsKLQl1bnNpZ25lZCBsb25nIGNhbGxlcnNfcGM7Ci0JY2hhciAqc3RydWN0cHRyOwotCXVuc2lnbmVkIGxvbmcgeGFyZ3NbNl07Ci0JdW5zaWduZWQgbG9uZyB4eGFyZ3NbMV07Ci19OwotCi0vKiBBIDMyLWJpdCBTcGFyYyBzdGFjayBmcmFtZSAqLwotc3RydWN0IHNwYXJjX3N0YWNrZjMyIHsKLQl1bnNpZ25lZCBpbnQgbG9jYWxzWzhdOwotICAgICAgICB1bnNpZ25lZCBpbnQgaW5zWzZdOwotCXVuc2lnbmVkIGludCBmcDsKLQl1bnNpZ25lZCBpbnQgY2FsbGVyc19wYzsKLQl1bnNpZ25lZCBpbnQgc3RydWN0cHRyOwotCXVuc2lnbmVkIGludCB4YXJnc1s2XTsKLQl1bnNpZ25lZCBpbnQgeHhhcmdzWzFdOwotfTsKLQotc3RydWN0IHNwYXJjX3RyYXBmIHsKLQl1bnNpZ25lZCBsb25nIGxvY2Fsc1s4XTsKLQl1bnNpZ25lZCBsb25nIGluc1s4XTsKLQl1bnNpZ25lZCBsb25nIF91bnVzZWQ7Ci0Jc3RydWN0IHB0X3JlZ3MgKnJlZ3M7Ci19OwotCi0jZGVmaW5lIFRSQUNFUkVHX1NaCXNpemVvZihzdHJ1Y3QgcHRfcmVncykKLSNkZWZpbmUgU1RBQ0tGUkFNRV9TWglzaXplb2Yoc3RydWN0IHNwYXJjX3N0YWNrZikKLQotI2RlZmluZSBUUkFDRVJFRzMyX1NaCXNpemVvZihzdHJ1Y3QgcHRfcmVnczMyKQotI2RlZmluZSBTVEFDS0ZSQU1FMzJfU1oJc2l6ZW9mKHN0cnVjdCBzcGFyY19zdGFja2YzMikKLQotI2lmZGVmIF9fS0VSTkVMX18KLQotI2luY2x1ZGUgPGxpbnV4L3RocmVhZHMuaD4KLSNpbmNsdWRlIDxhc20vc3lzdGVtLmg+Ci0KLXN0YXRpYyBpbmxpbmUgaW50IHB0X3JlZ3NfdHJhcF90eXBlKHN0cnVjdCBwdF9yZWdzICpyZWdzKQotewotCXJldHVybiByZWdzLT5tYWdpYyAmIDB4MWZmOwotfQotCi1zdGF0aWMgaW5saW5lIGJvb2wgcHRfcmVnc19pc19zeXNjYWxsKHN0cnVjdCBwdF9yZWdzICpyZWdzKQotewotCXJldHVybiAocmVncy0+dHN0YXRlICYgVFNUQVRFX1NZU0NBTEwpOwotfQotCi1zdGF0aWMgaW5saW5lIGJvb2wgcHRfcmVnc19jbGVhcl9zeXNjYWxsKHN0cnVjdCBwdF9yZWdzICpyZWdzKQotewotCXJldHVybiAocmVncy0+dHN0YXRlICY9IH5UU1RBVEVfU1lTQ0FMTCk7Ci19Ci0KLSNkZWZpbmUgYXJjaF9wdHJhY2Vfc3RvcF9uZWVkZWQoZXhpdF9jb2RlLCBpbmZvKSBcCi0oewlmbHVzaF91c2VyX3dpbmRvd3MoKTsgXAotCWdldF90aHJlYWRfd3NhdmVkKCkgIT0gMDsgXAotfSkKLQotI2RlZmluZSBhcmNoX3B0cmFjZV9zdG9wKGV4aXRfY29kZSwgaW5mbykgXAotCXN5bmNocm9uaXplX3VzZXJfc3RhY2soKQotCi1zdHJ1Y3QgZ2xvYmFsX3JlZ19zbmFwc2hvdCB7Ci0JdW5zaWduZWQgbG9uZwkJdHN0YXRlOwotCXVuc2lnbmVkIGxvbmcJCXRwYzsKLQl1bnNpZ25lZCBsb25nCQl0bnBjOwotCXVuc2lnbmVkIGxvbmcJCW83OwotCXVuc2lnbmVkIGxvbmcJCWk3OwotCXVuc2lnbmVkIGxvbmcJCXJwYzsKLQlzdHJ1Y3QgdGhyZWFkX2luZm8JKnRocmVhZDsKLQl1bnNpZ25lZCBsb25nCQlwYWQxOwotfTsKLWV4dGVybiBzdHJ1Y3QgZ2xvYmFsX3JlZ19zbmFwc2hvdCBnbG9iYWxfcmVnX3NuYXBzaG90W05SX0NQVVNdOwotCi0jZGVmaW5lIGZvcmNlX3N1Y2Nlc3NmdWxfc3lzY2FsbF9yZXR1cm4oKQkgICAgXAotZG8gewljdXJyZW50X3RocmVhZF9pbmZvKCktPnN5c2NhbGxfbm9lcnJvciA9IDE7IFwKLX0gd2hpbGUgKDApCi0jZGVmaW5lIHVzZXJfbW9kZShyZWdzKSAoISgocmVncyktPnRzdGF0ZSAmIFRTVEFURV9QUklWKSkKLSNkZWZpbmUgaW5zdHJ1Y3Rpb25fcG9pbnRlcihyZWdzKSAoKHJlZ3MpLT50cGMpCi0jZGVmaW5lIHVzZXJfc3RhY2tfcG9pbnRlcihyZWdzKSAoKHJlZ3MpLT51X3JlZ3NbVVJFR19GUF0pCi0jZGVmaW5lIHJlZ3NfcmV0dXJuX3ZhbHVlKHJlZ3MpICgocmVncyktPnVfcmVnc1tVUkVHX0kwXSkKLSNpZmRlZiBDT05GSUdfU01QCi1leHRlcm4gdW5zaWduZWQgbG9uZyBwcm9maWxlX3BjKHN0cnVjdCBwdF9yZWdzICopOwotI2Vsc2UKLSNkZWZpbmUgcHJvZmlsZV9wYyhyZWdzKSBpbnN0cnVjdGlvbl9wb2ludGVyKHJlZ3MpCi0jZW5kaWYKLWV4dGVybiB2b2lkIHNob3dfcmVncyhzdHJ1Y3QgcHRfcmVncyAqKTsKLSNlbmRpZgotCi0jZWxzZSAvKiBfX0FTU0VNQkxZX18gKi8KLS8qIEZvciBhc3NlbWJseSBjb2RlLiAqLwotI2RlZmluZSBUUkFDRVJFR19TWgkJMHhhMAotI2RlZmluZSBTVEFDS0ZSQU1FX1NaCQkweGMwCi0KLSNkZWZpbmUgVFJBQ0VSRUczMl9TWgkJMHg1MAotI2RlZmluZSBTVEFDS0ZSQU1FMzJfU1oJCTB4NjAKLSNlbmRpZgotCi0jaWZkZWYgX19LRVJORUxfXwotI2RlZmluZSBTVEFDS19CSUFTCQkyMDQ3Ci0jZW5kaWYKLQotLyogVGhlc2UgYXJlIGZvciBwdF9yZWdzLiAqLwotI2RlZmluZSBQVF9WOV9HMCAgICAgMHgwMAotI2RlZmluZSBQVF9WOV9HMSAgICAgMHgwOAotI2RlZmluZSBQVF9WOV9HMiAgICAgMHgxMAotI2RlZmluZSBQVF9WOV9HMyAgICAgMHgxOAotI2RlZmluZSBQVF9WOV9HNCAgICAgMHgyMAotI2RlZmluZSBQVF9WOV9HNSAgICAgMHgyOAotI2RlZmluZSBQVF9WOV9HNiAgICAgMHgzMAotI2RlZmluZSBQVF9WOV9HNyAgICAgMHgzOAotI2RlZmluZSBQVF9WOV9JMCAgICAgMHg0MAotI2RlZmluZSBQVF9WOV9JMSAgICAgMHg0OAotI2RlZmluZSBQVF9WOV9JMiAgICAgMHg1MAotI2RlZmluZSBQVF9WOV9JMyAgICAgMHg1OAotI2RlZmluZSBQVF9WOV9JNCAgICAgMHg2MAotI2RlZmluZSBQVF9WOV9JNSAgICAgMHg2OAotI2RlZmluZSBQVF9WOV9JNiAgICAgMHg3MAotI2RlZmluZSBQVF9WOV9GUCAgICAgUFRfVjlfSTYKLSNkZWZpbmUgUFRfVjlfSTcgICAgIDB4NzgKLSNkZWZpbmUgUFRfVjlfVFNUQVRFIDB4ODAKLSNkZWZpbmUgUFRfVjlfVFBDICAgIDB4ODgKLSNkZWZpbmUgUFRfVjlfVE5QQyAgIDB4OTAKLSNkZWZpbmUgUFRfVjlfWSAgICAgIDB4OTgKLSNkZWZpbmUgUFRfVjlfTUFHSUMgIDB4OWMKLSNkZWZpbmUgUFRfVFNUQVRFCVBUX1Y5X1RTVEFURQotI2RlZmluZSBQVF9UUEMJCVBUX1Y5X1RQQwotI2RlZmluZSBQVF9UTlBDCQlQVF9WOV9UTlBDCi0KLS8qIFRoZXNlIGZvciBwdF9yZWdzMzIuICovCi0jZGVmaW5lIFBUX1BTUiAgICAweDAKLSNkZWZpbmUgUFRfUEMgICAgIDB4NAotI2RlZmluZSBQVF9OUEMgICAgMHg4Ci0jZGVmaW5lIFBUX1kgICAgICAweGMKLSNkZWZpbmUgUFRfRzAgICAgIDB4MTAKLSNkZWZpbmUgUFRfV0lNICAgIFBUX0cwCi0jZGVmaW5lIFBUX0cxICAgICAweDE0Ci0jZGVmaW5lIFBUX0cyICAgICAweDE4Ci0jZGVmaW5lIFBUX0czICAgICAweDFjCi0jZGVmaW5lIFBUX0c0ICAgICAweDIwCi0jZGVmaW5lIFBUX0c1ICAgICAweDI0Ci0jZGVmaW5lIFBUX0c2ICAgICAweDI4Ci0jZGVmaW5lIFBUX0c3ICAgICAweDJjCi0jZGVmaW5lIFBUX0kwICAgICAweDMwCi0jZGVmaW5lIFBUX0kxICAgICAweDM0Ci0jZGVmaW5lIFBUX0kyICAgICAweDM4Ci0jZGVmaW5lIFBUX0kzICAgICAweDNjCi0jZGVmaW5lIFBUX0k0ICAgICAweDQwCi0jZGVmaW5lIFBUX0k1ICAgICAweDQ0Ci0jZGVmaW5lIFBUX0k2ICAgICAweDQ4Ci0jZGVmaW5lIFBUX0ZQICAgICBQVF9JNgotI2RlZmluZSBQVF9JNyAgICAgMHg0YwotCi0vKiBSZWdfd2luZG93IG9mZnNldHMgKi8KLSNkZWZpbmUgUldfVjlfTDAgICAgIDB4MDAKLSNkZWZpbmUgUldfVjlfTDEgICAgIDB4MDgKLSNkZWZpbmUgUldfVjlfTDIgICAgIDB4MTAKLSNkZWZpbmUgUldfVjlfTDMgICAgIDB4MTgKLSNkZWZpbmUgUldfVjlfTDQgICAgIDB4MjAKLSNkZWZpbmUgUldfVjlfTDUgICAgIDB4MjgKLSNkZWZpbmUgUldfVjlfTDYgICAgIDB4MzAKLSNkZWZpbmUgUldfVjlfTDcgICAgIDB4MzgKLSNkZWZpbmUgUldfVjlfSTAgICAgIDB4NDAKLSNkZWZpbmUgUldfVjlfSTEgICAgIDB4NDgKLSNkZWZpbmUgUldfVjlfSTIgICAgIDB4NTAKLSNkZWZpbmUgUldfVjlfSTMgICAgIDB4NTgKLSNkZWZpbmUgUldfVjlfSTQgICAgIDB4NjAKLSNkZWZpbmUgUldfVjlfSTUgICAgIDB4NjgKLSNkZWZpbmUgUldfVjlfSTYgICAgIDB4NzAKLSNkZWZpbmUgUldfVjlfSTcgICAgIDB4NzgKLQotI2RlZmluZSBSV19MMCAgICAgMHgwMAotI2RlZmluZSBSV19MMSAgICAgMHgwNAotI2RlZmluZSBSV19MMiAgICAgMHgwOAotI2RlZmluZSBSV19MMyAgICAgMHgwYwotI2RlZmluZSBSV19MNCAgICAgMHgxMAotI2RlZmluZSBSV19MNSAgICAgMHgxNAotI2RlZmluZSBSV19MNiAgICAgMHgxOAotI2RlZmluZSBSV19MNyAgICAgMHgxYwotI2RlZmluZSBSV19JMCAgICAgMHgyMAotI2RlZmluZSBSV19JMSAgICAgMHgyNAotI2RlZmluZSBSV19JMiAgICAgMHgyOAotI2RlZmluZSBSV19JMyAgICAgMHgyYwotI2RlZmluZSBSV19JNCAgICAgMHgzMAotI2RlZmluZSBSV19JNSAgICAgMHgzNAotI2RlZmluZSBSV19JNiAgICAgMHgzOAotI2RlZmluZSBSV19JNyAgICAgMHgzYwotCi0vKiBTdGFja19mcmFtZSBvZmZzZXRzICovCi0jZGVmaW5lIFNGX1Y5X0wwICAgICAweDAwCi0jZGVmaW5lIFNGX1Y5X0wxICAgICAweDA4Ci0jZGVmaW5lIFNGX1Y5X0wyICAgICAweDEwCi0jZGVmaW5lIFNGX1Y5X0wzICAgICAweDE4Ci0jZGVmaW5lIFNGX1Y5X0w0ICAgICAweDIwCi0jZGVmaW5lIFNGX1Y5X0w1ICAgICAweDI4Ci0jZGVmaW5lIFNGX1Y5X0w2ICAgICAweDMwCi0jZGVmaW5lIFNGX1Y5X0w3ICAgICAweDM4Ci0jZGVmaW5lIFNGX1Y5X0kwICAgICAweDQwCi0jZGVmaW5lIFNGX1Y5X0kxICAgICAweDQ4Ci0jZGVmaW5lIFNGX1Y5X0kyICAgICAweDUwCi0jZGVmaW5lIFNGX1Y5X0kzICAgICAweDU4Ci0jZGVmaW5lIFNGX1Y5X0k0ICAgICAweDYwCi0jZGVmaW5lIFNGX1Y5X0k1ICAgICAweDY4Ci0jZGVmaW5lIFNGX1Y5X0ZQICAgICAweDcwCi0jZGVmaW5lIFNGX1Y5X1BDICAgICAweDc4Ci0jZGVmaW5lIFNGX1Y5X1JFVFAgICAweDgwCi0jZGVmaW5lIFNGX1Y5X1hBUkcwICAweDg4Ci0jZGVmaW5lIFNGX1Y5X1hBUkcxICAweDkwCi0jZGVmaW5lIFNGX1Y5X1hBUkcyICAweDk4Ci0jZGVmaW5lIFNGX1Y5X1hBUkczICAweGEwCi0jZGVmaW5lIFNGX1Y5X1hBUkc0ICAweGE4Ci0jZGVmaW5lIFNGX1Y5X1hBUkc1ICAweGIwCi0jZGVmaW5lIFNGX1Y5X1hYQVJHICAweGI4Ci0KLSNkZWZpbmUgU0ZfTDAgICAgIDB4MDAKLSNkZWZpbmUgU0ZfTDEgICAgIDB4MDQKLSNkZWZpbmUgU0ZfTDIgICAgIDB4MDgKLSNkZWZpbmUgU0ZfTDMgICAgIDB4MGMKLSNkZWZpbmUgU0ZfTDQgICAgIDB4MTAKLSNkZWZpbmUgU0ZfTDUgICAgIDB4MTQKLSNkZWZpbmUgU0ZfTDYgICAgIDB4MTgKLSNkZWZpbmUgU0ZfTDcgICAgIDB4MWMKLSNkZWZpbmUgU0ZfSTAgICAgIDB4MjAKLSNkZWZpbmUgU0ZfSTEgICAgIDB4MjQKLSNkZWZpbmUgU0ZfSTIgICAgIDB4MjgKLSNkZWZpbmUgU0ZfSTMgICAgIDB4MmMKLSNkZWZpbmUgU0ZfSTQgICAgIDB4MzAKLSNkZWZpbmUgU0ZfSTUgICAgIDB4MzQKLSNkZWZpbmUgU0ZfRlAgICAgIDB4MzgKLSNkZWZpbmUgU0ZfUEMgICAgIDB4M2MKLSNkZWZpbmUgU0ZfUkVUUCAgIDB4NDAKLSNkZWZpbmUgU0ZfWEFSRzAgIDB4NDQKLSNkZWZpbmUgU0ZfWEFSRzEgIDB4NDgKLSNkZWZpbmUgU0ZfWEFSRzIgIDB4NGMKLSNkZWZpbmUgU0ZfWEFSRzMgIDB4NTAKLSNkZWZpbmUgU0ZfWEFSRzQgIDB4NTQKLSNkZWZpbmUgU0ZfWEFSRzUgIDB4NTgKLSNkZWZpbmUgU0ZfWFhBUkcgIDB4NWMKLQotI2lmZGVmIF9fS0VSTkVMX18KLQotLyogZ2xvYmFsX3JlZ19zbmFwc2hvdCBvZmZzZXRzICovCi0jZGVmaW5lIEdSX1NOQVBfVFNUQVRFCTB4MDAKLSNkZWZpbmUgR1JfU05BUF9UUEMJMHgwOAotI2RlZmluZSBHUl9TTkFQX1ROUEMJMHgxMAotI2RlZmluZSBHUl9TTkFQX083CTB4MTgKLSNkZWZpbmUgR1JfU05BUF9JNwkweDIwCi0jZGVmaW5lIEdSX1NOQVBfUlBDCTB4MjgKLSNkZWZpbmUgR1JfU05BUF9USFJFQUQJMHgzMAotI2RlZmluZSBHUl9TTkFQX1BBRDEJMHgzOAotCi0jZW5kaWYgIC8qICBfX0tFUk5FTF9fICAqLwotCi0vKiBTdHVmZiBmb3IgdGhlIHB0cmFjZSBzeXN0ZW0gY2FsbCAqLwotI2RlZmluZSBQVFJBQ0VfU1BBUkNfREVUQUNIICAgICAgIDExCi0jZGVmaW5lIFBUUkFDRV9HRVRSRUdTICAgICAgICAgICAgMTIKLSNkZWZpbmUgUFRSQUNFX1NFVFJFR1MgICAgICAgICAgICAxMwotI2RlZmluZSBQVFJBQ0VfR0VURlBSRUdTICAgICAgICAgIDE0Ci0jZGVmaW5lIFBUUkFDRV9TRVRGUFJFR1MgICAgICAgICAgMTUKLSNkZWZpbmUgUFRSQUNFX1JFQUREQVRBICAgICAgICAgICAxNgotI2RlZmluZSBQVFJBQ0VfV1JJVEVEQVRBICAgICAgICAgIDE3Ci0jZGVmaW5lIFBUUkFDRV9SRUFEVEVYVCAgICAgICAgICAgMTgKLSNkZWZpbmUgUFRSQUNFX1dSSVRFVEVYVCAgICAgICAgICAxOQotI2RlZmluZSBQVFJBQ0VfR0VURlBBUkVHUyAgICAgICAgIDIwCi0jZGVmaW5lIFBUUkFDRV9TRVRGUEFSRUdTICAgICAgICAgMjEKLQotLyogVGhlcmUgYXJlIGZvciBkZWJ1Z2dpbmcgNjQtYml0IHByb2Nlc3NlcywgZWl0aGVyIGZyb20gYSAzMiBvciA2NCBiaXQKLSAqIHBhcmVudC4gIFRodXMgdGhlaXIgY29tcGxlbWVudHMgYXJlIGZvciBkZWJ1Z2dpbmcgMzItYml0IHByb2Nlc3NlcyBvbmx5LgotICovCi0KLSNkZWZpbmUgUFRSQUNFX0dFVFJFR1M2NAkgIDIyCi0jZGVmaW5lIFBUUkFDRV9TRVRSRUdTNjQJICAyMwotLyogUFRSQUNFX1NZU0NBTEwgaXMgMjQgKi8KLSNkZWZpbmUgUFRSQUNFX0dFVEZQUkVHUzY0CSAgMjUKLSNkZWZpbmUgUFRSQUNFX1NFVEZQUkVHUzY0CSAgMjYKLQotI2VuZGlmIC8qICEoX1NQQVJDNjRfUFRSQUNFX0gpICovCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3JlZy5oIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9yZWcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGMxNmUxOS4uMDAwMDAwMAotLS0gYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3JlZy5oCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0jaWZuZGVmIF9fX0FTTV9TUEFSQ19SRUdfSAotI2RlZmluZSBfX19BU01fU1BBUkNfUkVHX0gKLSNpZiBkZWZpbmVkKF9fc3BhcmNfXykgJiYgZGVmaW5lZChfX2FyY2g2NF9fKQotI2luY2x1ZGUgPGFzbS9yZWdfNjQuaD4KLSNlbHNlCi0jaW5jbHVkZSA8YXNtL3JlZ18zMi5oPgotI2VuZGlmCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vcmVnXzMyLmggYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3JlZ18zMi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWZiMDU2Li4wMDAwMDAwCi0tLSBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vcmVnXzMyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKgotICogbGludXgvaW5jbHVkZS9hc20vcmVnLmgKLSAqIExheW91dCBvZiB0aGUgcmVnaXN0ZXJzIGFzIGV4cGVjdGVkIGJ5IGdkYiBvbiB0aGUgU3BhcmMKLSAqIHdlIHNob3VsZCByZXBsYWNlIHRoZSB1c2VyLmggZGVmaW5pdGlvbnMgd2l0aCB0aG9zZSBpbgotICogdGhpcyBmaWxlLCB3ZSBkb24ndCBldmVuIHVzZSB0aGUgb3RoZXIKLSAqIC1taWd1ZWwKLSAqCi0gKiBUaGUgbmFtZXMgb2YgdGhlIHN0cnVjdHVyZXMsIGNvbnN0YW50cyBhbmQgYWxpYXNlcyBpbiB0aGlzIGZpbGUKLSAqIGhhdmUgdGhlIHNhbWUgbmFtZXMgYXMgdGhlIHN1bm9zIG9uZXMsIHNvbWUgcHJvZ3JhbXMgcmVseSBvbiB0aGVzZQotICogbmFtZXMgKGdkYiBmb3IgZXhhbXBsZSkuCi0gKgotICovCi0KLSNpZm5kZWYgX19TUEFSQ19SRUdfSAotI2RlZmluZSBfX1NQQVJDX1JFR19ICi0KLXN0cnVjdCByZWdzIHsKLQlpbnQgICAgIHJfcHNyOwotI2RlZmluZSByX3BzIHJfcHNyCi0gICAgICAgIGludCAgICAgcl9wYzsKLSAgICAgICAgaW50ICAgICByX25wYzsKLSAgICAgICAgaW50ICAgICByX3k7Ci0gICAgICAgIGludCAgICAgcl9nMTsKLSAgICAgICAgaW50ICAgICByX2cyOwotICAgICAgICBpbnQgICAgIHJfZzM7Ci0gICAgICAgIGludCAgICAgcl9nNDsKLSAgICAgICAgaW50ICAgICByX2c1OwotICAgICAgICBpbnQgICAgIHJfZzY7Ci0gICAgICAgIGludCAgICAgcl9nNzsKLSAgICAgICAgaW50ICAgICByX28wOwotICAgICAgICBpbnQgICAgIHJfbzE7Ci0gICAgICAgIGludCAgICAgcl9vMjsKLSAgICAgICAgaW50ICAgICByX28zOwotICAgICAgICBpbnQgICAgIHJfbzQ7Ci0gICAgICAgIGludCAgICAgcl9vNTsKLSAgICAgICAgaW50ICAgICByX282OwotICAgICAgICBpbnQgICAgIHJfbzc7Ci19OwotCi1zdHJ1Y3QgZnBxIHsKLSAgICAgICAgdW5zaWduZWQgbG9uZyAqYWRkcjsKLSAgICAgICAgdW5zaWduZWQgbG9uZyBpbnN0cjsKLX07Ci0KLXN0cnVjdCAgZnEgewotICAgICAgICB1bmlvbiB7Ci0gICAgICAgICAgICAgICAgZG91YmxlICB3aG9sZTsKLSAgICAgICAgICAgICAgICBzdHJ1Y3QgIGZwcSBmcHE7Ci0gICAgICAgIH0gRlF1OwotfTsKLQotI2RlZmluZSBGUFVfUkVHU19UWVBFIHVuc2lnbmVkIGludAotI2RlZmluZSBGUFVfRlNSX1RZUEUgdW5zaWduZWQKLQotc3RydWN0IGZwX3N0YXR1cyB7Ci0gICAgICAgIHVuaW9uIHsKLSAgICAgICAgICAgICAgICBGUFVfUkVHU19UWVBFIEZwdV9yZWdzWzMyXTsKLSAgICAgICAgICAgICAgICBkb3VibGUgIEZwdV9kcmVnc1sxNl07Ci0gICAgICAgIH0gZnB1X2ZyOwotICAgICAgICBGUFVfRlNSX1RZUEUgRnB1X2ZzcjsKLSAgICAgICAgdW5zaWduZWQgRnB1X2ZsYWdzOwotICAgICAgICB1bnNpZ25lZCBGcHVfZXh0cmE7Ci0gICAgICAgIHVuc2lnbmVkIEZwdV9xY250OwotICAgICAgICBzdHJ1Y3QgZnEgRnB1X3FbMTZdOwotfTsKLQotI2RlZmluZSBmcHVfcmVncyAgZl9mcHN0YXR1cy5mcHVfZnIuRnB1X3JlZ3MKLSNkZWZpbmUgZnB1X2RyZWdzIGZfZnBzdGF0dXMuZnB1X2ZyLkZwdV9kcmVncwotI2RlZmluZSBmcHVfZnNyICAgZl9mcHN0YXR1cy5GcHVfZnNyCi0jZGVmaW5lIGZwdV9mbGFncyBmX2Zwc3RhdHVzLkZwdV9mbGFncwotI2RlZmluZSBmcHVfZXh0cmEgZl9mcHN0YXR1cy5GcHVfZXh0cmEKLSNkZWZpbmUgZnB1X3EgICAgIGZfZnBzdGF0dXMuRnB1X3EKLSNkZWZpbmUgZnB1X3FjbnQgIGZfZnBzdGF0dXMuRnB1X3FjbnQKLQotc3RydWN0IGZwdSB7Ci0gICAgICAgIHN0cnVjdCBmcF9zdGF0dXMgZl9mcHN0YXR1czsKLX07Ci0KLSNlbmRpZiAvKiBfX1NQQVJDX1JFR19IICovCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3JlZ182NC5oIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9yZWdfNjQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmYyNzdkNy4uMDAwMDAwMAotLS0gYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3JlZ182NC5oCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoKLSAqIGxpbnV4L2FzbS9yZWcuaAotICogTGF5b3V0IG9mIHRoZSByZWdpc3RlcnMgYXMgZXhwZWN0ZWQgYnkgZ2RiIG9uIHRoZSBTcGFyYwotICogd2Ugc2hvdWxkIHJlcGxhY2UgdGhlIHVzZXIuaCBkZWZpbml0aW9ucyB3aXRoIHRob3NlIGluCi0gKiB0aGlzIGZpbGUsIHdlIGRvbid0IGV2ZW4gdXNlIHRoZSBvdGhlcgotICogLW1pZ3VlbAotICoKLSAqIFRoZSBuYW1lcyBvZiB0aGUgc3RydWN0dXJlcywgY29uc3RhbnRzIGFuZCBhbGlhc2VzIGluIHRoaXMgZmlsZQotICogaGF2ZSB0aGUgc2FtZSBuYW1lcyBhcyB0aGUgc3Vub3Mgb25lcywgc29tZSBwcm9ncmFtcyByZWx5IG9uIHRoZXNlCi0gKiBuYW1lcyAoZ2RiIGZvciBleGFtcGxlKS4KLSAqCi0gKi8KLQotI2lmbmRlZiBfX1NQQVJDNjRfUkVHX0gKLSNkZWZpbmUgX19TUEFSQzY0X1JFR19ICi0KLXN0cnVjdCByZWdzIHsKLSAgICAgICAgdW5zaWduZWQgbG9uZyByX2cxOwotICAgICAgICB1bnNpZ25lZCBsb25nIHJfZzI7Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgcl9nMzsKLSAgICAgICAgdW5zaWduZWQgbG9uZyByX2c0OwotICAgICAgICB1bnNpZ25lZCBsb25nIHJfZzU7Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgcl9nNjsKLSAgICAgICAgdW5zaWduZWQgbG9uZyByX2c3OwotICAgICAgICB1bnNpZ25lZCBsb25nIHJfbzA7Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgcl9vMTsKLSAgICAgICAgdW5zaWduZWQgbG9uZyByX28yOwotICAgICAgICB1bnNpZ25lZCBsb25nIHJfbzM7Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgcl9vNDsKLSAgICAgICAgdW5zaWduZWQgbG9uZyByX281OwotICAgICAgICB1bnNpZ25lZCBsb25nIHJfbzY7Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgcl9vNzsKLSAgICAgICAgdW5zaWduZWQgbG9uZyBfX3BhZDsKLSAgICAgICAgdW5zaWduZWQgbG9uZyByX3RzdGF0ZTsKLSAgICAgICAgdW5zaWduZWQgbG9uZyByX3RwYzsKLSAgICAgICAgdW5zaWduZWQgbG9uZyByX3RucGM7Ci0gICAgICAgIHVuc2lnbmVkIGludCAgcl95OwotICAgICAgICB1bnNpZ25lZCBpbnQgIHJfZnByczsKLX07Ci0KLSNkZWZpbmUgRlBVX1JFR1NfVFlQRSB1bnNpZ25lZCBpbnQKLSNkZWZpbmUgRlBVX0ZTUl9UWVBFIHVuc2lnbmVkIGxvbmcKLQotc3RydWN0IGZwX3N0YXR1cyB7Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgZnB1X2ZyWzMyXTsKLSAgICAgICAgdW5zaWduZWQgbG9uZyBGcHVfZnNyOwotfTsKLQotc3RydWN0IGZwdSB7Ci0Jc3RydWN0IGZwX3N0YXR1cyBmX2Zwc3RhdHVzOwotfTsKLQotI2RlZmluZSBmcHVfcmVncyAgZl9mcHN0YXR1cy5mcHVfZnIKLSNkZWZpbmUgZnB1X2ZzciAgIGZfZnBzdGF0dXMuRnB1X2ZzcgotCi0jZW5kaWYgLyogX19TUEFSQzY0X1JFR19IICovCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3NpZ2NvbnRleHQuaCBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vc2lnY29udGV4dC5oCmluZGV4IGU5MmRlN2UuLmExNjA3ZDEgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vc2lnY29udGV4dC5oCisrKyBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vc2lnY29udGV4dC5oCkBAIC0xLDggKzEsOTYgQEAKLSNpZm5kZWYgX19fQVNNX1NQQVJDX1NJR0NPTlRFWFRfSAotI2RlZmluZSBfX19BU01fU1BBUkNfU0lHQ09OVEVYVF9ICi0jaWYgZGVmaW5lZChfX3NwYXJjX18pICYmIGRlZmluZWQoX19hcmNoNjRfXykKLSNpbmNsdWRlIDxhc20vc2lnY29udGV4dF82NC5oPgorI2lmbmRlZiBfX1NQQVJDX1NJR0NPTlRFWFRfSAorI2RlZmluZSBfX1NQQVJDX1NJR0NPTlRFWFRfSAorCisjaWZkZWYgX19LRVJORUxfXworI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KKworI2lmbmRlZiBfX0FTU0VNQkxZX18KKworI2RlZmluZSBfX1NVTk9TX01BWFdJTiAgIDMxCisKKy8qIFRoaXMgaXMgd2hhdCBTdW5PUyBkb2VzLCBzbyBzaGFsbCBJIHVubGVzcyB3ZSB1c2UgbmV3IDMyYml0IHNpZ25hbHMgb3IgcnQgc2lnbmFscy4gKi8KK3N0cnVjdCBzaWdjb250ZXh0MzIgeworCWludCBzaWdjX29uc3RhY2s7ICAgICAgLyogc3RhdGUgdG8gcmVzdG9yZSAqLworCWludCBzaWdjX21hc2s7ICAgICAgICAgLyogc2lnbWFzayB0byByZXN0b3JlICovCisJaW50IHNpZ2Nfc3A7ICAgICAgICAgICAvKiBzdGFjayBwb2ludGVyICovCisJaW50IHNpZ2NfcGM7ICAgICAgICAgICAvKiBwcm9ncmFtIGNvdW50ZXIgKi8KKwlpbnQgc2lnY19ucGM7ICAgICAgICAgIC8qIG5leHQgcHJvZ3JhbSBjb3VudGVyICovCisJaW50IHNpZ2NfcHNyOyAgICAgICAgICAvKiBmb3IgY29uZGl0aW9uIGNvZGVzIGV0YyAqLworCWludCBzaWdjX2cxOyAgICAgICAgICAgLyogVXNlciB1c2VzIHRoZXNlIHR3byByZWdpc3RlcnMgKi8KKwlpbnQgc2lnY19vMDsgICAgICAgICAgIC8qIHdpdGhpbiB0aGUgdHJhbXBvbGluZSBjb2RlLiAqLworCisJLyogTm93IGNvbWVzIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGUgdXNlcnMgd2luZG93IHNldAorCSAqIGF0IHRoZSB0aW1lIG9mIHRoZSBzaWduYWwuCisJICovCisJaW50IHNpZ2Nfb3N3aW5zOyAgICAgICAvKiBvdXRzdGFuZGluZyB3aW5kb3dzICovCisKKwkvKiBzdGFjayBwdHJzIGZvciBlYWNoIHJlZ3dpbiBidWYgKi8KKwl1bnNpZ25lZCBzaWdjX3NwYnVmW19fU1VOT1NfTUFYV0lOXTsKKworCS8qIFdpbmRvd3MgdG8gcmVzdG9yZSBhZnRlciBzaWduYWwgKi8KKwlzdHJ1Y3QgcmVnX3dpbmRvdzMyIHNpZ2Nfd2J1ZltfX1NVTk9TX01BWFdJTl07Cit9OworCisKKy8qIFRoaXMgaXMgd2hhdCB3ZSB1c2UgZm9yIDMyYml0IG5ldyBub24tcnQgc2lnbmFscy4gKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworCXN0cnVjdCB7CisJCXVuc2lnbmVkIGludCBwc3I7CisJCXVuc2lnbmVkIGludCBwYzsKKwkJdW5zaWduZWQgaW50IG5wYzsKKwkJdW5zaWduZWQgaW50IHk7CisJCXVuc2lnbmVkIGludCB1X3JlZ3NbMTZdOyAvKiBnbG9iYWxzIGFuZCBpbnMgKi8KKwl9CQkJc2lfcmVnczsKKwlpbnQJCQlzaV9tYXNrOworfSBfX3NpZ2luZm8zMl90OworCisjaWZkZWYgQ09ORklHX1NQQVJDNjQKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCAgIGludCBzaV9mbG9hdF9yZWdzIFs2NF07CisJdW5zaWduZWQgICBsb25nIHNpX2ZzcjsKKwl1bnNpZ25lZCAgIGxvbmcgc2lfZ3NyOworCXVuc2lnbmVkICAgbG9uZyBzaV9mcHJzOworfSBfX3NpZ2luZm9fZnB1X3Q7CisKKy8qIFRoaXMgaXMgd2hhdCBTdW5PUyBkb2Vzbid0LCBzbyB3ZSBoYXZlIHRvIHdyaXRlIHRoaXMgYWxvbmUKKyAgIGFuZCBkbyBpdCBwcm9wZXJseS4gKi8KK3N0cnVjdCBzaWdjb250ZXh0IHsKKwkvKiBUaGUgc2l6ZSBvZiB0aGlzIGFycmF5IGhhcyB0byBtYXRjaCBTSV9NQVhfU0laRSBmcm9tIHNpZ2luZm8uaCAqLworCWNoYXIJCQlzaWdjX2luZm9bMTI4XTsKKwlzdHJ1Y3QgeworCQl1bnNpZ25lZCBsb25nCXVfcmVnc1sxNl07IC8qIGdsb2JhbHMgYW5kIGlucyAqLworCQl1bnNpZ25lZCBsb25nCXRzdGF0ZTsKKwkJdW5zaWduZWQgbG9uZwl0cGM7CisJCXVuc2lnbmVkIGxvbmcJdG5wYzsKKwkJdW5zaWduZWQgaW50CXk7CisJCXVuc2lnbmVkIGludAlmcHJzOworCX0JCQlzaWdjX3JlZ3M7CisJX19zaWdpbmZvX2ZwdV90ICoJc2lnY19mcHVfc2F2ZTsKKwlzdHJ1Y3QgeworCQl2b2lkCSoJc3Nfc3A7CisJCWludAkJc3NfZmxhZ3M7CisJCXVuc2lnbmVkIGxvbmcJc3Nfc2l6ZTsKKwl9CQkJc2lnY19zdGFjazsKKwl1bnNpZ25lZCBsb25nCQlzaWdjX21hc2s7Cit9OworCiAjZWxzZQotI2luY2x1ZGUgPGFzbS9zaWdjb250ZXh0XzMyLmg+Ci0jZW5kaWYKLSNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgbG9uZyBzaV9mbG9hdF9yZWdzIFszMl07CisJdW5zaWduZWQgbG9uZyBzaV9mc3I7CisJdW5zaWduZWQgbG9uZyBzaV9mcHFkZXB0aDsKKwlzdHJ1Y3QgeworCQl1bnNpZ25lZCBsb25nICppbnNuX2FkZHI7CisJCXVuc2lnbmVkIGxvbmcgaW5zbjsKKwl9IHNpX2ZwcXVldWUgWzE2XTsKK30gX19zaWdpbmZvX2ZwdV90OworI2VuZGlmIC8qIChDT05GSUdfU1BBUkM2NCkgKi8KKworCisjZW5kaWYgLyogIShfX0FTU0VNQkxZX18pICovCisKKyNlbmRpZiAvKiAoX19LRVJORUxfXykgKi8KKworI2VuZGlmIC8qICEoX19TUEFSQ19TSUdDT05URVhUX0gpICovCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3NpZ2NvbnRleHRfMzIuaCBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vc2lnY29udGV4dF8zMi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWZiNjBkLi4wMDAwMDAwCi0tLSBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vc2lnY29udGV4dF8zMi5oCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotI2lmbmRlZiBfX1NQQVJDX1NJR0NPTlRFWFRfSAotI2RlZmluZSBfX1NQQVJDX1NJR0NPTlRFWFRfSAotCi0jaWZkZWYgX19LRVJORUxfXwotI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KLQotI2lmbmRlZiBfX0FTU0VNQkxZX18KLQotI2RlZmluZSBfX1NVTk9TX01BWFdJTiAgIDMxCi0KLS8qIFRoaXMgaXMgd2hhdCBTdW5PUyBkb2VzLCBzbyBzaGFsbCBJLiAqLwotc3RydWN0IHNpZ2NvbnRleHQgewotCWludCBzaWdjX29uc3RhY2s7ICAgICAgLyogc3RhdGUgdG8gcmVzdG9yZSAqLwotCWludCBzaWdjX21hc2s7ICAgICAgICAgLyogc2lnbWFzayB0byByZXN0b3JlICovCi0JaW50IHNpZ2Nfc3A7ICAgICAgICAgICAvKiBzdGFjayBwb2ludGVyICovCi0JaW50IHNpZ2NfcGM7ICAgICAgICAgICAvKiBwcm9ncmFtIGNvdW50ZXIgKi8KLQlpbnQgc2lnY19ucGM7ICAgICAgICAgIC8qIG5leHQgcHJvZ3JhbSBjb3VudGVyICovCi0JaW50IHNpZ2NfcHNyOyAgICAgICAgICAvKiBmb3IgY29uZGl0aW9uIGNvZGVzIGV0YyAqLwotCWludCBzaWdjX2cxOyAgICAgICAgICAgLyogVXNlciB1c2VzIHRoZXNlIHR3byByZWdpc3RlcnMgKi8KLQlpbnQgc2lnY19vMDsgICAgICAgICAgIC8qIHdpdGhpbiB0aGUgdHJhbXBvbGluZSBjb2RlLiAqLwotCi0JLyogTm93IGNvbWVzIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGUgdXNlcnMgd2luZG93IHNldAotCSAqIGF0IHRoZSB0aW1lIG9mIHRoZSBzaWduYWwuCi0JICovCi0JaW50IHNpZ2Nfb3N3aW5zOyAgICAgICAvKiBvdXRzdGFuZGluZyB3aW5kb3dzICovCi0KLQkvKiBzdGFjayBwdHJzIGZvciBlYWNoIHJlZ3dpbiBidWYgKi8KLQljaGFyICpzaWdjX3NwYnVmW19fU1VOT1NfTUFYV0lOXTsKLQotCS8qIFdpbmRvd3MgdG8gcmVzdG9yZSBhZnRlciBzaWduYWwgKi8KLQlzdHJ1Y3QgewotCQl1bnNpZ25lZCBsb25nCWxvY2Fsc1s4XTsKLQkJdW5zaWduZWQgbG9uZwlpbnNbOF07Ci0JfSBzaWdjX3didWZbX19TVU5PU19NQVhXSU5dOwotfTsKLQotdHlwZWRlZiBzdHJ1Y3QgewotCXN0cnVjdCB7Ci0JCXVuc2lnbmVkIGxvbmcgcHNyOwotCQl1bnNpZ25lZCBsb25nIHBjOwotCQl1bnNpZ25lZCBsb25nIG5wYzsKLQkJdW5zaWduZWQgbG9uZyB5OwotCQl1bnNpZ25lZCBsb25nIHVfcmVnc1sxNl07IC8qIGdsb2JhbHMgYW5kIGlucyAqLwotCX0JCXNpX3JlZ3M7Ci0JaW50CQlzaV9tYXNrOwotfSBfX3NpZ2luZm9fdDsKLQotdHlwZWRlZiBzdHJ1Y3QgewotCXVuc2lnbmVkICAgbG9uZyBzaV9mbG9hdF9yZWdzIFszMl07Ci0JdW5zaWduZWQgICBsb25nIHNpX2ZzcjsKLQl1bnNpZ25lZCAgIGxvbmcgc2lfZnBxZGVwdGg7Ci0Jc3RydWN0IHsKLQkJdW5zaWduZWQgbG9uZyAqaW5zbl9hZGRyOwotCQl1bnNpZ25lZCBsb25nIGluc247Ci0JfSBzaV9mcHF1ZXVlIFsxNl07Ci19IF9fc2lnaW5mb19mcHVfdDsKLQotI2VuZGlmIC8qICEoX19BU1NFTUJMWV9fKSAqLwotCi0jZW5kaWYgLyogKF9fS0VSTkVMX18pICovCi0KLSNlbmRpZiAvKiAhKF9fU1BBUkNfU0lHQ09OVEVYVF9IKSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9zaWdjb250ZXh0XzY0LmggYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3NpZ2NvbnRleHRfNjQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWM4NjhkNi4uMDAwMDAwMAotLS0gYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3NpZ2NvbnRleHRfNjQuaAorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLSNpZm5kZWYgX19TUEFSQzY0X1NJR0NPTlRFWFRfSAotI2RlZmluZSBfX1NQQVJDNjRfU0lHQ09OVEVYVF9ICi0KLSNpZmRlZiBfX0tFUk5FTF9fCi0jaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgotI2VuZGlmCi0KLSNpZm5kZWYgX19BU1NFTUJMWV9fCi0KLSNpZmRlZiBfX0tFUk5FTF9fCi0KLSNkZWZpbmUgX19TVU5PU19NQVhXSU4gICAzMQotCi0vKiBUaGlzIGlzIHdoYXQgU3VuT1MgZG9lcywgc28gc2hhbGwgSSB1bmxlc3Mgd2UgdXNlIG5ldyAzMmJpdCBzaWduYWxzIG9yIHJ0IHNpZ25hbHMuICovCi1zdHJ1Y3Qgc2lnY29udGV4dDMyIHsKLQlpbnQgc2lnY19vbnN0YWNrOyAgICAgIC8qIHN0YXRlIHRvIHJlc3RvcmUgKi8KLQlpbnQgc2lnY19tYXNrOyAgICAgICAgIC8qIHNpZ21hc2sgdG8gcmVzdG9yZSAqLwotCWludCBzaWdjX3NwOyAgICAgICAgICAgLyogc3RhY2sgcG9pbnRlciAqLwotCWludCBzaWdjX3BjOyAgICAgICAgICAgLyogcHJvZ3JhbSBjb3VudGVyICovCi0JaW50IHNpZ2NfbnBjOyAgICAgICAgICAvKiBuZXh0IHByb2dyYW0gY291bnRlciAqLwotCWludCBzaWdjX3BzcjsgICAgICAgICAgLyogZm9yIGNvbmRpdGlvbiBjb2RlcyBldGMgKi8KLQlpbnQgc2lnY19nMTsgICAgICAgICAgIC8qIFVzZXIgdXNlcyB0aGVzZSB0d28gcmVnaXN0ZXJzICovCi0JaW50IHNpZ2NfbzA7ICAgICAgICAgICAvKiB3aXRoaW4gdGhlIHRyYW1wb2xpbmUgY29kZS4gKi8KLQotCS8qIE5vdyBjb21lcyBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhlIHVzZXJzIHdpbmRvdyBzZXQKLQkgKiBhdCB0aGUgdGltZSBvZiB0aGUgc2lnbmFsLgotCSAqLwotCWludCBzaWdjX29zd2luczsgICAgICAgLyogb3V0c3RhbmRpbmcgd2luZG93cyAqLwotCi0JLyogc3RhY2sgcHRycyBmb3IgZWFjaCByZWd3aW4gYnVmICovCi0JdW5zaWduZWQgc2lnY19zcGJ1ZltfX1NVTk9TX01BWFdJTl07Ci0KLQkvKiBXaW5kb3dzIHRvIHJlc3RvcmUgYWZ0ZXIgc2lnbmFsICovCi0Jc3RydWN0IHJlZ193aW5kb3czMiBzaWdjX3didWZbX19TVU5PU19NQVhXSU5dOwotfTsKLQotI2VuZGlmCi0KLSNpZmRlZiBfX0tFUk5FTF9fCi0KLS8qIFRoaXMgaXMgd2hhdCB3ZSB1c2UgZm9yIDMyYml0IG5ldyBub24tcnQgc2lnbmFscy4gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotCXN0cnVjdCB7Ci0JCXVuc2lnbmVkIGludCBwc3I7Ci0JCXVuc2lnbmVkIGludCBwYzsKLQkJdW5zaWduZWQgaW50IG5wYzsKLQkJdW5zaWduZWQgaW50IHk7Ci0JCXVuc2lnbmVkIGludCB1X3JlZ3NbMTZdOyAvKiBnbG9iYWxzIGFuZCBpbnMgKi8KLQl9CQkJc2lfcmVnczsKLQlpbnQJCQlzaV9tYXNrOwotfSBfX3NpZ2luZm8zMl90OwotCi0jZW5kaWYKLQotdHlwZWRlZiBzdHJ1Y3QgewotCXVuc2lnbmVkICAgaW50IHNpX2Zsb2F0X3JlZ3MgWzY0XTsKLQl1bnNpZ25lZCAgIGxvbmcgc2lfZnNyOwotCXVuc2lnbmVkICAgbG9uZyBzaV9nc3I7Ci0JdW5zaWduZWQgICBsb25nIHNpX2ZwcnM7Ci19IF9fc2lnaW5mb19mcHVfdDsKLQotLyogVGhpcyBpcyB3aGF0IFN1bk9TIGRvZXNuJ3QsIHNvIHdlIGhhdmUgdG8gd3JpdGUgdGhpcyBhbG9uZQotICAgYW5kIGRvIGl0IHByb3Blcmx5LiAqLwotc3RydWN0IHNpZ2NvbnRleHQgewotCS8qIFRoZSBzaXplIG9mIHRoaXMgYXJyYXkgaGFzIHRvIG1hdGNoIFNJX01BWF9TSVpFIGZyb20gc2lnaW5mby5oICovCi0JY2hhcgkJCXNpZ2NfaW5mb1sxMjhdOwotCXN0cnVjdCB7Ci0JCXVuc2lnbmVkIGxvbmcJdV9yZWdzWzE2XTsgLyogZ2xvYmFscyBhbmQgaW5zICovCi0JCXVuc2lnbmVkIGxvbmcJdHN0YXRlOwotCQl1bnNpZ25lZCBsb25nCXRwYzsKLQkJdW5zaWduZWQgbG9uZwl0bnBjOwotCQl1bnNpZ25lZCBpbnQJeTsKLQkJdW5zaWduZWQgaW50CWZwcnM7Ci0JfQkJCXNpZ2NfcmVnczsKLQlfX3NpZ2luZm9fZnB1X3QgKglzaWdjX2ZwdV9zYXZlOwotCXN0cnVjdCB7Ci0JCXZvaWQJKglzc19zcDsKLQkJaW50CQlzc19mbGFnczsKLQkJdW5zaWduZWQgbG9uZwlzc19zaXplOwotCX0JCQlzaWdjX3N0YWNrOwotCXVuc2lnbmVkIGxvbmcJCXNpZ2NfbWFzazsKLX07Ci0KLSNlbmRpZiAvKiAhKF9fQVNTRU1CTFlfXykgKi8KLQotI2VuZGlmIC8qICEoX19TUEFSQzY0X1NJR0NPTlRFWFRfSCkgKi8KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vc2lnaW5mby5oIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9zaWdpbmZvLmgKaW5kZXggYmQ4MWY4ZC4uOTg4ZTVkOCAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9zaWdpbmZvLmgKKysrIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9zaWdpbmZvLmgKQEAgLTEsOCArMSwzNyBAQAotI2lmbmRlZiBfX19BU01fU1BBUkNfU0lHSU5GT19ICi0jZGVmaW5lIF9fX0FTTV9TUEFSQ19TSUdJTkZPX0gKKyNpZm5kZWYgX19TUEFSQ19TSUdJTkZPX0gKKyNkZWZpbmUgX19TUEFSQ19TSUdJTkZPX0gKKwogI2lmIGRlZmluZWQoX19zcGFyY19fKSAmJiBkZWZpbmVkKF9fYXJjaDY0X18pCi0jaW5jbHVkZSA8YXNtL3NpZ2luZm9fNjQuaD4KLSNlbHNlCi0jaW5jbHVkZSA8YXNtL3NpZ2luZm9fMzIuaD4KLSNlbmRpZgotI2VuZGlmCisKKyNkZWZpbmUgU0lfUEFEX1NJWkUzMgkoKFNJX01BWF9TSVpFL3NpemVvZihpbnQpKSAtIDMpCisjZGVmaW5lIF9fQVJDSF9TSV9QUkVBTUJMRV9TSVpFCSg0ICogc2l6ZW9mKGludCkpCisjZGVmaW5lIF9fQVJDSF9TSV9CQU5EX1QgaW50CisKKyNlbmRpZiAvKiBkZWZpbmVkKF9fc3BhcmNfXykgJiYgZGVmaW5lZChfX2FyY2g2NF9fKSAqLworCisKKyNkZWZpbmUgX19BUkNIX1NJX1RSQVBOTworCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvc2lnaW5mby5oPgorCisjaWZkZWYgX19LRVJORUxfXworCisjaW5jbHVkZSA8bGludXgvY29tcGF0Lmg+CisKKyNpZmRlZiBDT05GSUdfQ09NUEFUCisKK3N0cnVjdCBjb21wYXRfc2lnaW5mbzsKKworI2VuZGlmIC8qIENPTkZJR19DT01QQVQgKi8KKworI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KKworI2RlZmluZSBTSV9OT0lORk8JMzI3NjcJCS8qIG5vIGluZm9ybWF0aW9uIGluIHNpZ2luZm9fdCAqLworCisvKgorICogU0lHRU1UIHNpX2NvZGVzCisgKi8KKyNkZWZpbmUgRU1UX1RBR09WRgkoX19TSV9GQVVMVHwxKQkvKiB0YWcgb3ZlcmZsb3cgKi8KKyNkZWZpbmUgTlNJR0VNVAkJMQorCisjZW5kaWYgLyogIShfX1NQQVJDX1NJR0lORk9fSCkgKi8KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vc2lnaW5mb18zMi5oIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9zaWdpbmZvXzMyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjNzFhZjEuLjAwMDAwMDAKLS0tIGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9zaWdpbmZvXzMyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0jaWZuZGVmIF9TUEFSQ19TSUdJTkZPX0gKLSNkZWZpbmUgX1NQQVJDX1NJR0lORk9fSAotCi0jZGVmaW5lIF9fQVJDSF9TSV9VSURfVAkJdW5zaWduZWQgaW50Ci0jZGVmaW5lIF9fQVJDSF9TSV9UUkFQTk8KLQotI2luY2x1ZGUgPGFzbS1nZW5lcmljL3NpZ2luZm8uaD4KLQotI2RlZmluZSBTSV9OT0lORk8JMzI3NjcJCS8qIG5vIGluZm9ybWF0aW9uIGluIHNpZ2luZm9fdCAqLwotCi0vKgotICogU0lHRU1UIHNpX2NvZGVzCi0gKi8KLSNkZWZpbmUgRU1UX1RBR09WRgkoX19TSV9GQVVMVHwxKQkvKiB0YWcgb3ZlcmZsb3cgKi8KLSNkZWZpbmUgTlNJR0VNVAkJMQotCi0jZW5kaWYgLyogIShfU1BBUkNfU0lHSU5GT19IKSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9zaWdpbmZvXzY0LmggYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3NpZ2luZm9fNjQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzk2ZTZjMy4uMDAwMDAwMAotLS0gYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3NpZ2luZm9fNjQuaAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLSNpZm5kZWYgX1NQQVJDNjRfU0lHSU5GT19ICi0jZGVmaW5lIF9TUEFSQzY0X1NJR0lORk9fSAotCi0jZGVmaW5lIFNJX1BBRF9TSVpFMzIJKChTSV9NQVhfU0laRS9zaXplb2YoaW50KSkgLSAzKQotCi0jZGVmaW5lIF9fQVJDSF9TSV9QUkVBTUJMRV9TSVpFCSg0ICogc2l6ZW9mKGludCkpCi0jZGVmaW5lIF9fQVJDSF9TSV9UUkFQTk8KLSNkZWZpbmUgX19BUkNIX1NJX0JBTkRfVCBpbnQKLQotI2luY2x1ZGUgPGFzbS1nZW5lcmljL3NpZ2luZm8uaD4KLQotI2lmZGVmIF9fS0VSTkVMX18KLQotI2luY2x1ZGUgPGxpbnV4L2NvbXBhdC5oPgotCi0jaWZkZWYgQ09ORklHX0NPTVBBVAotCi1zdHJ1Y3QgY29tcGF0X3NpZ2luZm87Ci0KLSNlbmRpZiAvKiBDT05GSUdfQ09NUEFUICovCi0KLSNlbmRpZiAvKiBfX0tFUk5FTF9fICovCi0KLSNkZWZpbmUgU0lfTk9JTkZPCTMyNzY3CQkvKiBubyBpbmZvcm1hdGlvbiBpbiBzaWdpbmZvX3QgKi8KLQotLyoKLSAqIFNJR0VNVCBzaV9jb2RlcwotICovCi0jZGVmaW5lIEVNVF9UQUdPVkYJKF9fU0lfRkFVTFR8MSkJLyogdGFnIG92ZXJmbG93ICovCi0jZGVmaW5lIE5TSUdFTVQJCTEKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3NpZ25hbC5oIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9zaWduYWwuaAppbmRleCAyN2FiMDVkLi40MTUzNWU3IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3NpZ25hbC5oCisrKyBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vc2lnbmFsLmgKQEAgLTEsOCArMSwyMTAgQEAKLSNpZm5kZWYgX19fQVNNX1NQQVJDX1NJR05BTF9ICi0jZGVmaW5lIF9fX0FTTV9TUEFSQ19TSUdOQUxfSAotI2lmIGRlZmluZWQoX19zcGFyY19fKSAmJiBkZWZpbmVkKF9fYXJjaDY0X18pCi0jaW5jbHVkZSA8YXNtL3NpZ25hbF82NC5oPgorI2lmbmRlZiBfX1NQQVJDX1NJR05BTF9ICisjZGVmaW5lIF9fU1BBUkNfU0lHTkFMX0gKKworI2luY2x1ZGUgPGFzbS9zaWdjb250ZXh0Lmg+CisjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KKworI2lmZGVmIF9fS0VSTkVMX18KKyNpZm5kZWYgX19BU1NFTUJMWV9fCisjaW5jbHVkZSA8bGludXgvcGVyc29uYWxpdHkuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2VuZGlmCisjZW5kaWYKKworLyogT24gdGhlIFNwYXJjIHRoZSBzaWduYWwgaGFuZGxlcnMgZ2V0IHBhc3NlZCBhICdzdWItc2lnbmFsJyBjb2RlCisgKiBmb3IgY2VydGFpbiBzaWduYWwgdHlwZXMsIHdoaWNoIHdlIGRvY3VtZW50IGhlcmUuCisgKi8KKyNkZWZpbmUgU0lHSFVQCQkgMQorI2RlZmluZSBTSUdJTlQJCSAyCisjZGVmaW5lIFNJR1FVSVQJCSAzCisjZGVmaW5lIFNJR0lMTAkJIDQKKyNkZWZpbmUgICAgU1VCU0lHX1NUQUNLICAgICAgIDAKKyNkZWZpbmUgICAgU1VCU0lHX0lMTElOU1QgICAgIDIKKyNkZWZpbmUgICAgU1VCU0lHX1BSSVZJTlNUICAgIDMKKyNkZWZpbmUgICAgU1VCU0lHX0JBRFRSQVAodCkgICgweDgwICsgKHQpKQorCisjZGVmaW5lIFNJR1RSQVAJCSA1CisjZGVmaW5lIFNJR0FCUlQJCSA2CisjZGVmaW5lIFNJR0lPVAkJIDYKKworI2RlZmluZSBTSUdFTVQgICAgICAgICAgIDcKKyNkZWZpbmUgICAgU1VCU0lHX1RBRyAgICAxMAorCisjZGVmaW5lIFNJR0ZQRQkJIDgKKyNkZWZpbmUgICAgU1VCU0lHX0ZQRElTQUJMRUQgICAgIDB4NDAwCisjZGVmaW5lICAgIFNVQlNJR19GUEVSUk9SICAgICAgICAweDQwNAorI2RlZmluZSAgICBTVUJTSUdfRlBJTlRPVkZMICAgICAgMHgwMDEKKyNkZWZpbmUgICAgU1VCU0lHX0ZQU1RTSUcgICAgICAgIDB4MDAyCisjZGVmaW5lICAgIFNVQlNJR19JRElWWkVSTyAgICAgICAweDAxNAorI2RlZmluZSAgICBTVUJTSUdfRlBJTkVYQUNUICAgICAgMHgwYzQKKyNkZWZpbmUgICAgU1VCU0lHX0ZQRElWWkVSTyAgICAgIDB4MGM4CisjZGVmaW5lICAgIFNVQlNJR19GUFVORkxPVyAgICAgICAweDBjYworI2RlZmluZSAgICBTVUJTSUdfRlBPUEVSUk9SICAgICAgMHgwZDAKKyNkZWZpbmUgICAgU1VCU0lHX0ZQT1ZGTE9XICAgICAgIDB4MGQ0CisKKyNkZWZpbmUgU0lHS0lMTAkJIDkKKyNkZWZpbmUgU0lHQlVTICAgICAgICAgIDEwCisjZGVmaW5lICAgIFNVQlNJR19CVVNUSU1FT1VUICAgIDEKKyNkZWZpbmUgICAgU1VCU0lHX0FMSUdOTUVOVCAgICAgMgorI2RlZmluZSAgICBTVUJTSUdfTUlTQ0VSUk9SICAgICA1CisKKyNkZWZpbmUgU0lHU0VHVgkJMTEKKyNkZWZpbmUgICAgU1VCU0lHX05PTUFQUElORyAgICAgMworI2RlZmluZSAgICBTVUJTSUdfUFJPVEVDVElPTiAgICA0CisjZGVmaW5lICAgIFNVQlNJR19TRUdFUlJPUiAgICAgIDUKKworI2RlZmluZSBTSUdTWVMJCTEyCisKKyNkZWZpbmUgU0lHUElQRQkJMTMKKyNkZWZpbmUgU0lHQUxSTQkJMTQKKyNkZWZpbmUgU0lHVEVSTQkJMTUKKyNkZWZpbmUgU0lHVVJHICAgICAgICAgIDE2CisKKy8qIFN1bk9TIHZhbHVlcyB3aGljaCBkZXZpYXRlIGZyb20gdGhlIExpbnV4L2kzODYgb25lcyAqLworI2RlZmluZSBTSUdTVE9QCQkxNworI2RlZmluZSBTSUdUU1RQCQkxOAorI2RlZmluZSBTSUdDT05UCQkxOQorI2RlZmluZSBTSUdDSExECQkyMAorI2RlZmluZSBTSUdUVElOCQkyMQorI2RlZmluZSBTSUdUVE9VCQkyMgorI2RlZmluZSBTSUdJTwkJMjMKKyNkZWZpbmUgU0lHUE9MTAkJU0lHSU8gICAvKiBTeXNWIG5hbWUgZm9yIFNJR0lPICovCisjZGVmaW5lIFNJR1hDUFUJCTI0CisjZGVmaW5lIFNJR1hGU1oJCTI1CisjZGVmaW5lIFNJR1ZUQUxSTQkyNgorI2RlZmluZSBTSUdQUk9GCQkyNworI2RlZmluZSBTSUdXSU5DSAkyOAorI2RlZmluZSBTSUdMT1NUCQkyOQorI2RlZmluZSBTSUdQV1IJCVNJR0xPU1QKKyNkZWZpbmUgU0lHVVNSMQkJMzAKKyNkZWZpbmUgU0lHVVNSMgkJMzEKKworLyogTW9zdCB0aGluZ3Mgc2hvdWxkIGJlIGNsZWFuIGVub3VnaCB0byByZWRlZmluZSB0aGlzIGF0IHdpbGwsIGlmIGNhcmUKKyAgIGlzIHRha2VuIHRvIG1ha2UgbGliYyBtYXRjaC4gICovCisKKyNkZWZpbmUgX19PTERfTlNJRwkzMgorI2RlZmluZSBfX05FV19OU0lHICAgICAgNjQKKyNkZWZpbmUgX05TSUdfQlBXICAgICAgIDY0CisjZGVmaW5lIF9OU0lHX1dPUkRTICAgICAoX19ORVdfTlNJRyAvIF9OU0lHX0JQVykKKworI2RlZmluZSBTSUdSVE1JTiAgICAgICAzMgorI2RlZmluZSBTSUdSVE1BWCAgICAgICBfX05FV19OU0lHCisKKyNpZiBkZWZpbmVkKF9fS0VSTkVMX18pIHx8IGRlZmluZWQoX19XQU5UX1BPU0lYMUJfU0lHTkFMU19fKQorI2RlZmluZSBfTlNJRwkJCV9fTkVXX05TSUcKKyNkZWZpbmUgX19uZXdfc2lnc2V0X3QJCXNpZ3NldF90CisjZGVmaW5lIF9fbmV3X3NpZ2FjdGlvbgkJc2lnYWN0aW9uCisjZGVmaW5lIF9fbmV3X3NpZ2FjdGlvbjMyCXNpZ2FjdGlvbjMyCisjZGVmaW5lIF9fb2xkX3NpZ3NldF90CQlvbGRfc2lnc2V0X3QKKyNkZWZpbmUgX19vbGRfc2lnYWN0aW9uCQlvbGRfc2lnYWN0aW9uCisjZGVmaW5lIF9fb2xkX3NpZ2FjdGlvbjMyCW9sZF9zaWdhY3Rpb24zMgogI2Vsc2UKLSNpbmNsdWRlIDxhc20vc2lnbmFsXzMyLmg+CisjZGVmaW5lIF9OU0lHCQkJX19PTERfTlNJRworI2RlZmluZSBOU0lHCQkJX05TSUcKKyNkZWZpbmUgX19vbGRfc2lnc2V0X3QJCXNpZ3NldF90CisjZGVmaW5lIF9fb2xkX3NpZ2FjdGlvbgkJc2lnYWN0aW9uCisjZGVmaW5lIF9fb2xkX3NpZ2FjdGlvbjMyCXNpZ2FjdGlvbjMyCiAjZW5kaWYKKworI2lmbmRlZiBfX0FTU0VNQkxZX18KKwordHlwZWRlZiB1bnNpZ25lZCBsb25nIF9fb2xkX3NpZ3NldF90OyAgICAgICAgICAgIC8qIGF0IGxlYXN0IDMyIGJpdHMgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgICAgIHVuc2lnbmVkIGxvbmcgc2lnW19OU0lHX1dPUkRTXTsKK30gX19uZXdfc2lnc2V0X3Q7CisKKy8qIEEgU3VuT1Mgc2lnc3RhY2sgKi8KK3N0cnVjdCBzaWdzdGFjayB7CisJLyogWFhYIDMyLWJpdCBwb2ludGVycyBwaW5oZWFkIFhYWCAqLworCWNoYXIgKnRoZV9zdGFjazsKKwlpbnQgICBjdXJfc3RhdHVzOworfTsKKworLyogU2lndmVjIGZsYWdzICovCisjZGVmaW5lIF9TVl9TU1RBQ0sgICAgMXUgICAgLyogVGhpcyBzaWduYWwgaGFuZGxlciBzaG91bGQgdXNlIHNpZy1zdGFjayAqLworI2RlZmluZSBfU1ZfSU5UUiAgICAgIDJ1ICAgIC8qIFNpZyByZXR1cm4gc2hvdWxkIG5vdCByZXN0YXJ0IHN5c3RlbSBjYWxsICovCisjZGVmaW5lIF9TVl9SRVNFVCAgICAgNHUgICAgLyogU2V0IGhhbmRsZXIgdG8gU0lHX0RGTCB1cG9uIHRha2VuIHNpZ25hbCAqLworI2RlZmluZSBfU1ZfSUdOQ0hJTEQgIDh1ICAgIC8qIERvIG5vdCBzZW5kIFNJR0NITEQgKi8KKworLyoKKyAqIHNhX2ZsYWdzIHZhbHVlczogU0FfU1RBQ0sgaXMgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQsIGJ1dCB3aWxsIGFsbG93IHRoZQorICogdXNhZ2Ugb2Ygc2lnbmFsIHN0YWNrcyBieSB1c2luZyB0aGUgKG5vdyBvYnNvbGV0ZSkgc2FfcmVzdG9yZXIgZmllbGQgaW4KKyAqIHRoZSBzaWdhY3Rpb24gc3RydWN0dXJlIGFzIGEgc3RhY2sgcG9pbnRlci4gVGhpcyBpcyBub3cgcG9zc2libGUgZHVlIHRvCisgKiB0aGUgY2hhbmdlcyBpbiBzaWduYWwgaGFuZGxpbmcuIExCVCAwMTA0OTMuCisgKiBTQV9SRVNUQVJUIGZsYWcgdG8gZ2V0IHJlc3RhcnRpbmcgc2lnbmFscyAod2hpY2ggd2VyZSB0aGUgZGVmYXVsdCBsb25nIGFnbykKKyAqLworI2RlZmluZSBTQV9OT0NMRFNUT1AJX1NWX0lHTkNISUxECisjZGVmaW5lIFNBX1NUQUNLCV9TVl9TU1RBQ0sKKyNkZWZpbmUgU0FfT05TVEFDSwlfU1ZfU1NUQUNLCisjZGVmaW5lIFNBX1JFU1RBUlQJX1NWX0lOVFIKKyNkZWZpbmUgU0FfT05FU0hPVAlfU1ZfUkVTRVQKKyNkZWZpbmUgU0FfTk9NQVNLCTB4MjB1CisjZGVmaW5lIFNBX05PQ0xEV0FJVCAgICAweDEwMHUKKyNkZWZpbmUgU0FfU0lHSU5GTyAgICAgIDB4MjAwdQorCisKKyNkZWZpbmUgU0lHX0JMT0NLICAgICAgICAgIDB4MDEJLyogZm9yIGJsb2NraW5nIHNpZ25hbHMgKi8KKyNkZWZpbmUgU0lHX1VOQkxPQ0sgICAgICAgIDB4MDIJLyogZm9yIHVuYmxvY2tpbmcgc2lnbmFscyAqLworI2RlZmluZSBTSUdfU0VUTUFTSyAgICAgICAgMHgwNAkvKiBmb3Igc2V0dGluZyB0aGUgc2lnbmFsIG1hc2sgKi8KKworLyoKKyAqIHNpZ2FsdHN0YWNrIGNvbnRyb2xzCisgKi8KKyNkZWZpbmUgU1NfT05TVEFDSwkxCisjZGVmaW5lIFNTX0RJU0FCTEUJMgorCisjZGVmaW5lIE1JTlNJR1NUS1NaCTQwOTYKKyNkZWZpbmUgU0lHU1RLU1oJMTYzODQKKworI2lmZGVmIF9fS0VSTkVMX18KKy8qCisgKiBESkhSCisgKiBTQV9TVEFUSUNfQUxMT0MgaXMgdXNlZCBmb3IgdGhlIHNwYXJjMzIgc3lzdGVtIHRvIGluZGljYXRlIHRoYXQgdGhpcworICogaW50ZXJydXB0IGhhbmRsZXIncyBpcnEgc3RydWN0dXJlIHNob3VsZCBiZSBzdGF0aWNhbGx5IGFsbG9jYXRlZAorICogYnkgdGhlIHJlcXVlc3RfaXJxIHJvdXRpbmUuCisgKiBUaGUgYWx0ZXJuYXRpdmUgaXMgdGhhdCBhcmNoL3NwYXJjL2tlcm5lbC9pcnEuYyBoYXMgY2FybmFsIGtub3dsZWRnZQorICogb2YgaW50ZXJydXB0IHVzYWdlIGFuZCB0aGF0IHN1Y2tzLiBBbHNvIHdpdGhvdXQgYSBmbGFnIGxpa2UgdGhpcworICogaXQgbWF5IGJlIHBvc3NpYmxlIGZvciB0aGUgZnJlZV9pcnEgcm91dGluZSB0byBhdHRlbXB0IHRvIGZyZWUKKyAqIHN0YXRpY2FsbHkgYWxsb2NhdGVkIGRhdGEuLiB3aGljaCBpcyBOT1QgR09PRC4KKyAqCisgKi8KKyNkZWZpbmUgU0FfU1RBVElDX0FMTE9DICAgICAgICAgMHg4MDAwCiAjZW5kaWYKKworI2luY2x1ZGUgPGFzbS1nZW5lcmljL3NpZ25hbC5oPgorCitzdHJ1Y3QgX19uZXdfc2lnYWN0aW9uIHsKKwlfX3NpZ2hhbmRsZXJfdAkJc2FfaGFuZGxlcjsKKwl1bnNpZ25lZCBsb25nCQlzYV9mbGFnczsKKwlfX3NpZ3Jlc3RvcmVfdAkJc2FfcmVzdG9yZXI7ICAvKiBub3QgdXNlZCBieSBMaW51eC9TUEFSQyB5ZXQgKi8KKwlfX25ld19zaWdzZXRfdAkJc2FfbWFzazsKK307CisKK3N0cnVjdCBfX29sZF9zaWdhY3Rpb24geworCV9fc2lnaGFuZGxlcl90CQlzYV9oYW5kbGVyOworCV9fb2xkX3NpZ3NldF90CQlzYV9tYXNrOworCXVuc2lnbmVkIGxvbmcJCXNhX2ZsYWdzOworCXZvaWQJCQkoKnNhX3Jlc3RvcmVyKSh2b2lkKTsgIC8qIG5vdCB1c2VkIGJ5IExpbnV4L1NQQVJDIHlldCAqLworfTsKKwordHlwZWRlZiBzdHJ1Y3Qgc2lnYWx0c3RhY2sgeworCXZvaWQJCQlfX3VzZXIgKnNzX3NwOworCWludAkJCXNzX2ZsYWdzOworCXNpemVfdAkJCXNzX3NpemU7Cit9IHN0YWNrX3Q7CisKKyNpZmRlZiBfX0tFUk5FTF9fCisKK3N0cnVjdCBrX3NpZ2FjdGlvbiB7CisJc3RydWN0CQkJX19uZXdfc2lnYWN0aW9uIHNhOworCXZvaWQJCQlfX3VzZXIgKmthX3Jlc3RvcmVyOworfTsKKworI2RlZmluZSBwdHJhY2Vfc2lnbmFsX2RlbGl2ZXIocmVncywgY29va2llKSBkbyB7IH0gd2hpbGUgKDApCisKKyNlbmRpZiAvKiAhKF9fS0VSTkVMX18pICovCisKKyNlbmRpZiAvKiAhKF9fQVNTRU1CTFlfXykgKi8KKworI2VuZGlmIC8qICEoX19TUEFSQ19TSUdOQUxfSCkgKi8KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vc2lnbmFsXzMyLmggYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3NpZ25hbF8zMi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NmE2MGFiLi4wMDAwMDAwCi0tLSBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vc2lnbmFsXzMyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMDcgKzAsMCBAQAotI2lmbmRlZiBfQVNNU1BBUkNfU0lHTkFMX0gKLSNkZWZpbmUgX0FTTVNQQVJDX1NJR05BTF9ICi0KLSNpbmNsdWRlIDxhc20vc2lnY29udGV4dC5oPgotI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+Ci0KLSNpZmRlZiBfX0tFUk5FTF9fCi0jaWZuZGVmIF9fQVNTRU1CTFlfXwotI2luY2x1ZGUgPGxpbnV4L3BlcnNvbmFsaXR5Lmg+Ci0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNlbmRpZgotI2VuZGlmCi0KLS8qIE9uIHRoZSBTcGFyYyB0aGUgc2lnbmFsIGhhbmRsZXJzIGdldCBwYXNzZWQgYSAnc3ViLXNpZ25hbCcgY29kZQotICogZm9yIGNlcnRhaW4gc2lnbmFsIHR5cGVzLCB3aGljaCB3ZSBkb2N1bWVudCBoZXJlLgotICovCi0jZGVmaW5lIFNJR0hVUAkJIDEKLSNkZWZpbmUgU0lHSU5UCQkgMgotI2RlZmluZSBTSUdRVUlUCQkgMwotI2RlZmluZSBTSUdJTEwJCSA0Ci0jZGVmaW5lICAgIFNVQlNJR19TVEFDSyAgICAgICAwCi0jZGVmaW5lICAgIFNVQlNJR19JTExJTlNUICAgICAyCi0jZGVmaW5lICAgIFNVQlNJR19QUklWSU5TVCAgICAzCi0jZGVmaW5lICAgIFNVQlNJR19CQURUUkFQKHQpICAoMHg4MCArICh0KSkKLQotI2RlZmluZSBTSUdUUkFQCQkgNQotI2RlZmluZSBTSUdBQlJUCQkgNgotI2RlZmluZSBTSUdJT1QJCSA2Ci0KLSNkZWZpbmUgU0lHRU1UICAgICAgICAgICA3Ci0jZGVmaW5lICAgIFNVQlNJR19UQUcgICAgMTAKLQotI2RlZmluZSBTSUdGUEUJCSA4Ci0jZGVmaW5lICAgIFNVQlNJR19GUERJU0FCTEVEICAgICAweDQwMAotI2RlZmluZSAgICBTVUJTSUdfRlBFUlJPUiAgICAgICAgMHg0MDQKLSNkZWZpbmUgICAgU1VCU0lHX0ZQSU5UT1ZGTCAgICAgIDB4MDAxCi0jZGVmaW5lICAgIFNVQlNJR19GUFNUU0lHICAgICAgICAweDAwMgotI2RlZmluZSAgICBTVUJTSUdfSURJVlpFUk8gICAgICAgMHgwMTQKLSNkZWZpbmUgICAgU1VCU0lHX0ZQSU5FWEFDVCAgICAgIDB4MGM0Ci0jZGVmaW5lICAgIFNVQlNJR19GUERJVlpFUk8gICAgICAweDBjOAotI2RlZmluZSAgICBTVUJTSUdfRlBVTkZMT1cgICAgICAgMHgwY2MKLSNkZWZpbmUgICAgU1VCU0lHX0ZQT1BFUlJPUiAgICAgIDB4MGQwCi0jZGVmaW5lICAgIFNVQlNJR19GUE9WRkxPVyAgICAgICAweDBkNAotCi0jZGVmaW5lIFNJR0tJTEwJCSA5Ci0jZGVmaW5lIFNJR0JVUyAgICAgICAgICAxMAotI2RlZmluZSAgICBTVUJTSUdfQlVTVElNRU9VVCAgICAxCi0jZGVmaW5lICAgIFNVQlNJR19BTElHTk1FTlQgICAgIDIKLSNkZWZpbmUgICAgU1VCU0lHX01JU0NFUlJPUiAgICAgNQotCi0jZGVmaW5lIFNJR1NFR1YJCTExCi0jZGVmaW5lICAgIFNVQlNJR19OT01BUFBJTkcgICAgIDMKLSNkZWZpbmUgICAgU1VCU0lHX1BST1RFQ1RJT04gICAgNAotI2RlZmluZSAgICBTVUJTSUdfU0VHRVJST1IgICAgICA1Ci0KLSNkZWZpbmUgU0lHU1lTCQkxMgotCi0jZGVmaW5lIFNJR1BJUEUJCTEzCi0jZGVmaW5lIFNJR0FMUk0JCTE0Ci0jZGVmaW5lIFNJR1RFUk0JCTE1Ci0jZGVmaW5lIFNJR1VSRyAgICAgICAgICAxNgotCi0vKiBTdW5PUyB2YWx1ZXMgd2hpY2ggZGV2aWF0ZSBmcm9tIHRoZSBMaW51eC9pMzg2IG9uZXMgKi8KLSNkZWZpbmUgU0lHU1RPUAkJMTcKLSNkZWZpbmUgU0lHVFNUUAkJMTgKLSNkZWZpbmUgU0lHQ09OVAkJMTkKLSNkZWZpbmUgU0lHQ0hMRAkJMjAKLSNkZWZpbmUgU0lHVFRJTgkJMjEKLSNkZWZpbmUgU0lHVFRPVQkJMjIKLSNkZWZpbmUgU0lHSU8JCTIzCi0jZGVmaW5lIFNJR1BPTEwJCVNJR0lPICAgLyogU3lzViBuYW1lIGZvciBTSUdJTyAqLwotI2RlZmluZSBTSUdYQ1BVCQkyNAotI2RlZmluZSBTSUdYRlNaCQkyNQotI2RlZmluZSBTSUdWVEFMUk0JMjYKLSNkZWZpbmUgU0lHUFJPRgkJMjcKLSNkZWZpbmUgU0lHV0lOQ0gJMjgKLSNkZWZpbmUgU0lHTE9TVAkJMjkKLSNkZWZpbmUgU0lHUFdSCQlTSUdMT1NUCi0jZGVmaW5lIFNJR1VTUjEJCTMwCi0jZGVmaW5lIFNJR1VTUjIJCTMxCi0KLS8qIE1vc3QgdGhpbmdzIHNob3VsZCBiZSBjbGVhbiBlbm91Z2ggdG8gcmVkZWZpbmUgdGhpcyBhdCB3aWxsLCBpZiBjYXJlCi0gKiBpcyB0YWtlbiB0byBtYWtlIGxpYmMgbWF0Y2guCi0gKi8KLQotI2RlZmluZSBfX09MRF9OU0lHCTMyCi0jZGVmaW5lIF9fTkVXX05TSUcJNjQKLSNkZWZpbmUgX05TSUdfQlBXCTMyCi0jZGVmaW5lIF9OU0lHX1dPUkRTCShfX05FV19OU0lHIC8gX05TSUdfQlBXKQotCi0jZGVmaW5lIFNJR1JUTUlOCTMyCi0jZGVmaW5lIFNJR1JUTUFYCV9fTkVXX05TSUcKLQotI2lmIGRlZmluZWQoX19LRVJORUxfXykgfHwgZGVmaW5lZChfX1dBTlRfUE9TSVgxQl9TSUdOQUxTX18pCi0jZGVmaW5lCV9OU0lHCQlfX05FV19OU0lHCi0jZGVmaW5lIF9fbmV3X3NpZ3NldF90CXNpZ3NldF90Ci0jZGVmaW5lIF9fbmV3X3NpZ2FjdGlvbglzaWdhY3Rpb24KLSNkZWZpbmUgX19vbGRfc2lnc2V0X3QJb2xkX3NpZ3NldF90Ci0jZGVmaW5lIF9fb2xkX3NpZ2FjdGlvbglvbGRfc2lnYWN0aW9uCi0jZWxzZQotI2RlZmluZSBfTlNJRwkJX19PTERfTlNJRwotI2RlZmluZSBfX29sZF9zaWdzZXRfdAlzaWdzZXRfdAotI2RlZmluZSBfX29sZF9zaWdhY3Rpb24Jc2lnYWN0aW9uCi0jZW5kaWYKLQotI2lmbmRlZiBfX0FTU0VNQkxZX18KLQotdHlwZWRlZiB1bnNpZ25lZCBsb25nIF9fb2xkX3NpZ3NldF90OwotCi10eXBlZGVmIHN0cnVjdCB7Ci0JdW5zaWduZWQgbG9uZwlzaWdbX05TSUdfV09SRFNdOwotfSBfX25ld19zaWdzZXRfdDsKLQotCi0jaWZkZWYgX19LRVJORUxfXwotLyogQSBTdW5PUyBzaWdzdGFjayAqLwotc3RydWN0IHNpZ3N0YWNrIHsKLQljaGFyICp0aGVfc3RhY2s7Ci0JaW50ICAgY3VyX3N0YXR1czsKLX07Ci0jZW5kaWYKLQotLyogU2lndmVjIGZsYWdzICovCi0jZGVmaW5lIF9TVl9TU1RBQ0sgICAgMXUgICAgLyogVGhpcyBzaWduYWwgaGFuZGxlciBzaG91bGQgdXNlIHNpZy1zdGFjayAqLwotI2RlZmluZSBfU1ZfSU5UUiAgICAgIDJ1ICAgIC8qIFNpZyByZXR1cm4gc2hvdWxkIG5vdCByZXN0YXJ0IHN5c3RlbSBjYWxsICovCi0jZGVmaW5lIF9TVl9SRVNFVCAgICAgNHUgICAgLyogU2V0IGhhbmRsZXIgdG8gU0lHX0RGTCB1cG9uIHRha2VuIHNpZ25hbCAqLwotI2RlZmluZSBfU1ZfSUdOQ0hJTEQgIDh1ICAgIC8qIERvIG5vdCBzZW5kIFNJR0NITEQgKi8KLQotLyoKLSAqIHNhX2ZsYWdzIHZhbHVlczogU0FfU1RBQ0sgaXMgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQsIGJ1dCB3aWxsIGFsbG93IHRoZQotICogdXNhZ2Ugb2Ygc2lnbmFsIHN0YWNrcyBieSB1c2luZyB0aGUgKG5vdyBvYnNvbGV0ZSkgc2FfcmVzdG9yZXIgZmllbGQgaW4KLSAqIHRoZSBzaWdhY3Rpb24gc3RydWN0dXJlIGFzIGEgc3RhY2sgcG9pbnRlci4gVGhpcyBpcyBub3cgcG9zc2libGUgZHVlIHRvCi0gKiB0aGUgY2hhbmdlcyBpbiBzaWduYWwgaGFuZGxpbmcuIExCVCAwMTA0OTMuCi0gKiBTQV9SRVNUQVJUIGZsYWcgdG8gZ2V0IHJlc3RhcnRpbmcgc2lnbmFscyAod2hpY2ggd2VyZSB0aGUgZGVmYXVsdCBsb25nIGFnbykKLSAqLwotI2RlZmluZSBTQV9OT0NMRFNUT1AJX1NWX0lHTkNISUxECi0jZGVmaW5lIFNBX1NUQUNLCV9TVl9TU1RBQ0sKLSNkZWZpbmUgU0FfT05TVEFDSwlfU1ZfU1NUQUNLCi0jZGVmaW5lIFNBX1JFU1RBUlQJX1NWX0lOVFIKLSNkZWZpbmUgU0FfT05FU0hPVAlfU1ZfUkVTRVQKLSNkZWZpbmUgU0FfTk9NQVNLCTB4MjB1Ci0jZGVmaW5lIFNBX05PQ0xEV0FJVAkweDEwMHUKLSNkZWZpbmUgU0FfU0lHSU5GTwkweDIwMHUKLQotI2RlZmluZSBTSUdfQkxPQ0sgICAgICAgICAgMHgwMQkvKiBmb3IgYmxvY2tpbmcgc2lnbmFscyAqLwotI2RlZmluZSBTSUdfVU5CTE9DSyAgICAgICAgMHgwMgkvKiBmb3IgdW5ibG9ja2luZyBzaWduYWxzICovCi0jZGVmaW5lIFNJR19TRVRNQVNLICAgICAgICAweDA0CS8qIGZvciBzZXR0aW5nIHRoZSBzaWduYWwgbWFzayAqLwotCi0vKgotICogc2lnYWx0c3RhY2sgY29udHJvbHMKLSAqLwotI2RlZmluZSBTU19PTlNUQUNLCTEKLSNkZWZpbmUgU1NfRElTQUJMRQkyCi0KLSNkZWZpbmUgTUlOU0lHU1RLU1oJNDA5NgotI2RlZmluZSBTSUdTVEtTWgkxNjM4NAotCi0jaWZkZWYgX19LRVJORUxfXwotLyoKLSAqIERKSFIKLSAqIFNBX1NUQVRJQ19BTExPQyBpcyB1c2VkIGZvciB0aGUgU1BBUkMgc3lzdGVtIHRvIGluZGljYXRlIHRoYXQgdGhpcwotICogaW50ZXJydXB0IGhhbmRsZXIncyBpcnEgc3RydWN0dXJlIHNob3VsZCBiZSBzdGF0aWNhbGx5IGFsbG9jYXRlZAotICogYnkgdGhlIHJlcXVlc3RfaXJxIHJvdXRpbmUuCi0gKiBUaGUgYWx0ZXJuYXRpdmUgaXMgdGhhdCBhcmNoL3NwYXJjL2tlcm5lbC9pcnEuYyBoYXMgY2FybmFsIGtub3dsZWRnZQotICogb2YgaW50ZXJydXB0IHVzYWdlIGFuZCB0aGF0IHN1Y2tzLiBBbHNvIHdpdGhvdXQgYSBmbGFnIGxpa2UgdGhpcwotICogaXQgbWF5IGJlIHBvc3NpYmxlIGZvciB0aGUgZnJlZV9pcnEgcm91dGluZSB0byBhdHRlbXB0IHRvIGZyZWUKLSAqIHN0YXRpY2FsbHkgYWxsb2NhdGVkIGRhdGEuLiB3aGljaCBpcyBOT1QgR09PRC4KLSAqCi0gKi8KLSNkZWZpbmUgU0FfU1RBVElDX0FMTE9DCQkweDgwMDAKLSNlbmRpZgotCi0jaW5jbHVkZSA8YXNtLWdlbmVyaWMvc2lnbmFsLmg+Ci0KLSNpZmRlZiBfX0tFUk5FTF9fCi1zdHJ1Y3QgX19uZXdfc2lnYWN0aW9uIHsKLQlfX3NpZ2hhbmRsZXJfdAlzYV9oYW5kbGVyOwotCXVuc2lnbmVkIGxvbmcJc2FfZmxhZ3M7Ci0Jdm9pZAkJKCpzYV9yZXN0b3Jlcikodm9pZCk7CS8qIE5vdCB1c2VkIGJ5IExpbnV4L1NQQVJDICovCi0JX19uZXdfc2lnc2V0X3QJc2FfbWFzazsKLX07Ci0KLXN0cnVjdCBrX3NpZ2FjdGlvbiB7Ci0Jc3RydWN0IF9fbmV3X3NpZ2FjdGlvbglzYTsKLQl2b2lkCQkJX191c2VyICprYV9yZXN0b3JlcjsKLX07Ci0KLXN0cnVjdCBfX29sZF9zaWdhY3Rpb24gewotCV9fc2lnaGFuZGxlcl90CXNhX2hhbmRsZXI7Ci0JX19vbGRfc2lnc2V0X3QJc2FfbWFzazsKLQl1bnNpZ25lZCBsb25nCXNhX2ZsYWdzOwotCXZvaWQJCSgqc2FfcmVzdG9yZXIpICh2b2lkKTsJLyogbm90IHVzZWQgYnkgTGludXgvU1BBUkMgKi8KLX07Ci0KLXR5cGVkZWYgc3RydWN0IHNpZ2FsdHN0YWNrIHsKLQl2b2lkCQlfX3VzZXIgKnNzX3NwOwotCWludAkJc3NfZmxhZ3M7Ci0Jc2l6ZV90CQlzc19zaXplOwotfSBzdGFja190OwotCi0jZGVmaW5lIHB0cmFjZV9zaWduYWxfZGVsaXZlcihyZWdzLCBjb29raWUpIGRvIHsgfSB3aGlsZSAoMCkKLQotI2VuZGlmIC8qICEoX19LRVJORUxfXykgKi8KLQotI2VuZGlmIC8qICEoX19BU1NFTUJMWV9fKSAqLwotCi0jZW5kaWYgLyogIShfQVNNU1BBUkNfU0lHTkFMX0gpICovCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3NpZ25hbF82NC5oIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9zaWduYWxfNjQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWIxNTA5YS4uMDAwMDAwMAotLS0gYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3NpZ25hbF82NC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTk0ICswLDAgQEAKLSNpZm5kZWYgX0FTTVNQQVJDNjRfU0lHTkFMX0gKLSNkZWZpbmUgX0FTTVNQQVJDNjRfU0lHTkFMX0gKLQotI2luY2x1ZGUgPGFzbS9zaWdjb250ZXh0Lmg+Ci0KLSNpZmRlZiBfX0tFUk5FTF9fCi0jaWZuZGVmIF9fQVNTRU1CTFlfXwotI2luY2x1ZGUgPGxpbnV4L3BlcnNvbmFsaXR5Lmg+Ci0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNlbmRpZgotI2VuZGlmCi0KLS8qIE9uIHRoZSBTcGFyYyB0aGUgc2lnbmFsIGhhbmRsZXJzIGdldCBwYXNzZWQgYSAnc3ViLXNpZ25hbCcgY29kZQotICogZm9yIGNlcnRhaW4gc2lnbmFsIHR5cGVzLCB3aGljaCB3ZSBkb2N1bWVudCBoZXJlLgotICovCi0jZGVmaW5lIFNJR0hVUAkJIDEKLSNkZWZpbmUgU0lHSU5UCQkgMgotI2RlZmluZSBTSUdRVUlUCQkgMwotI2RlZmluZSBTSUdJTEwJCSA0Ci0jZGVmaW5lICAgIFNVQlNJR19TVEFDSyAgICAgICAwCi0jZGVmaW5lICAgIFNVQlNJR19JTExJTlNUICAgICAyCi0jZGVmaW5lICAgIFNVQlNJR19QUklWSU5TVCAgICAzCi0jZGVmaW5lICAgIFNVQlNJR19CQURUUkFQKHQpICAoMHg4MCArICh0KSkKLQotI2RlZmluZSBTSUdUUkFQCQkgNQotI2RlZmluZSBTSUdBQlJUCQkgNgotI2RlZmluZSBTSUdJT1QJCSA2Ci0KLSNkZWZpbmUgU0lHRU1UICAgICAgICAgICA3Ci0jZGVmaW5lICAgIFNVQlNJR19UQUcgICAgMTAKLQotI2RlZmluZSBTSUdGUEUJCSA4Ci0jZGVmaW5lICAgIFNVQlNJR19GUERJU0FCTEVEICAgICAweDQwMAotI2RlZmluZSAgICBTVUJTSUdfRlBFUlJPUiAgICAgICAgMHg0MDQKLSNkZWZpbmUgICAgU1VCU0lHX0ZQSU5UT1ZGTCAgICAgIDB4MDAxCi0jZGVmaW5lICAgIFNVQlNJR19GUFNUU0lHICAgICAgICAweDAwMgotI2RlZmluZSAgICBTVUJTSUdfSURJVlpFUk8gICAgICAgMHgwMTQKLSNkZWZpbmUgICAgU1VCU0lHX0ZQSU5FWEFDVCAgICAgIDB4MGM0Ci0jZGVmaW5lICAgIFNVQlNJR19GUERJVlpFUk8gICAgICAweDBjOAotI2RlZmluZSAgICBTVUJTSUdfRlBVTkZMT1cgICAgICAgMHgwY2MKLSNkZWZpbmUgICAgU1VCU0lHX0ZQT1BFUlJPUiAgICAgIDB4MGQwCi0jZGVmaW5lICAgIFNVQlNJR19GUE9WRkxPVyAgICAgICAweDBkNAotCi0jZGVmaW5lIFNJR0tJTEwJCSA5Ci0jZGVmaW5lIFNJR0JVUyAgICAgICAgICAxMAotI2RlZmluZSAgICBTVUJTSUdfQlVTVElNRU9VVCAgICAxCi0jZGVmaW5lICAgIFNVQlNJR19BTElHTk1FTlQgICAgIDIKLSNkZWZpbmUgICAgU1VCU0lHX01JU0NFUlJPUiAgICAgNQotCi0jZGVmaW5lIFNJR1NFR1YJCTExCi0jZGVmaW5lICAgIFNVQlNJR19OT01BUFBJTkcgICAgIDMKLSNkZWZpbmUgICAgU1VCU0lHX1BST1RFQ1RJT04gICAgNAotI2RlZmluZSAgICBTVUJTSUdfU0VHRVJST1IgICAgICA1Ci0KLSNkZWZpbmUgU0lHU1lTCQkxMgotCi0jZGVmaW5lIFNJR1BJUEUJCTEzCi0jZGVmaW5lIFNJR0FMUk0JCTE0Ci0jZGVmaW5lIFNJR1RFUk0JCTE1Ci0jZGVmaW5lIFNJR1VSRyAgICAgICAgICAxNgotCi0vKiBTdW5PUyB2YWx1ZXMgd2hpY2ggZGV2aWF0ZSBmcm9tIHRoZSBMaW51eC9pMzg2IG9uZXMgKi8KLSNkZWZpbmUgU0lHU1RPUAkJMTcKLSNkZWZpbmUgU0lHVFNUUAkJMTgKLSNkZWZpbmUgU0lHQ09OVAkJMTkKLSNkZWZpbmUgU0lHQ0hMRAkJMjAKLSNkZWZpbmUgU0lHVFRJTgkJMjEKLSNkZWZpbmUgU0lHVFRPVQkJMjIKLSNkZWZpbmUgU0lHSU8JCTIzCi0jZGVmaW5lIFNJR1BPTEwJCVNJR0lPICAgLyogU3lzViBuYW1lIGZvciBTSUdJTyAqLwotI2RlZmluZSBTSUdYQ1BVCQkyNAotI2RlZmluZSBTSUdYRlNaCQkyNQotI2RlZmluZSBTSUdWVEFMUk0JMjYKLSNkZWZpbmUgU0lHUFJPRgkJMjcKLSNkZWZpbmUgU0lHV0lOQ0gJMjgKLSNkZWZpbmUgU0lHTE9TVAkJMjkKLSNkZWZpbmUgU0lHUFdSCQlTSUdMT1NUCi0jZGVmaW5lIFNJR1VTUjEJCTMwCi0jZGVmaW5lIFNJR1VTUjIJCTMxCi0KLS8qIE1vc3QgdGhpbmdzIHNob3VsZCBiZSBjbGVhbiBlbm91Z2ggdG8gcmVkZWZpbmUgdGhpcyBhdCB3aWxsLCBpZiBjYXJlCi0gICBpcyB0YWtlbiB0byBtYWtlIGxpYmMgbWF0Y2guICAqLwotCi0jZGVmaW5lIF9fT0xEX05TSUcJMzIKLSNkZWZpbmUgX19ORVdfTlNJRyAgICAgIDY0Ci0jZGVmaW5lIF9OU0lHX0JQVyAgICAgCTY0Ci0jZGVmaW5lIF9OU0lHX1dPUkRTICAgCShfX05FV19OU0lHIC8gX05TSUdfQlBXKQotCi0jZGVmaW5lIFNJR1JUTUlOICAgICAgIDMyCi0jZGVmaW5lIFNJR1JUTUFYICAgICAgIF9fTkVXX05TSUcKLQotI2lmIGRlZmluZWQoX19LRVJORUxfXykgfHwgZGVmaW5lZChfX1dBTlRfUE9TSVgxQl9TSUdOQUxTX18pCi0jZGVmaW5lIF9OU0lHCQkJX19ORVdfTlNJRwotI2RlZmluZSBfX25ld19zaWdzZXRfdAkJc2lnc2V0X3QKLSNkZWZpbmUgX19uZXdfc2lnYWN0aW9uCQlzaWdhY3Rpb24KLSNkZWZpbmUgX19uZXdfc2lnYWN0aW9uMzIJc2lnYWN0aW9uMzIKLSNkZWZpbmUgX19vbGRfc2lnc2V0X3QJCW9sZF9zaWdzZXRfdAotI2RlZmluZSBfX29sZF9zaWdhY3Rpb24JCW9sZF9zaWdhY3Rpb24KLSNkZWZpbmUgX19vbGRfc2lnYWN0aW9uMzIJb2xkX3NpZ2FjdGlvbjMyCi0jZWxzZQotI2RlZmluZSBfTlNJRwkJCV9fT0xEX05TSUcKLSNkZWZpbmUgTlNJRwkJCV9OU0lHCi0jZGVmaW5lIF9fb2xkX3NpZ3NldF90CQlzaWdzZXRfdAotI2RlZmluZSBfX29sZF9zaWdhY3Rpb24JCXNpZ2FjdGlvbgotI2RlZmluZSBfX29sZF9zaWdhY3Rpb24zMglzaWdhY3Rpb24zMgotI2VuZGlmCi0KLSNpZm5kZWYgX19BU1NFTUJMWV9fCi0KLXR5cGVkZWYgdW5zaWduZWQgbG9uZyBfX29sZF9zaWdzZXRfdDsgICAgICAgICAgICAvKiBhdCBsZWFzdCAzMiBiaXRzICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICAgICB1bnNpZ25lZCBsb25nIHNpZ1tfTlNJR19XT1JEU107Ci19IF9fbmV3X3NpZ3NldF90OwotCi0vKiBBIFN1bk9TIHNpZ3N0YWNrICovCi1zdHJ1Y3Qgc2lnc3RhY2sgewotCS8qIFhYWCAzMi1iaXQgcG9pbnRlcnMgcGluaGVhZCBYWFggKi8KLQljaGFyICp0aGVfc3RhY2s7Ci0JaW50ICAgY3VyX3N0YXR1czsKLX07Ci0KLS8qIFNpZ3ZlYyBmbGFncyAqLwotI2RlZmluZSBfU1ZfU1NUQUNLICAgIDF1ICAgIC8qIFRoaXMgc2lnbmFsIGhhbmRsZXIgc2hvdWxkIHVzZSBzaWctc3RhY2sgKi8KLSNkZWZpbmUgX1NWX0lOVFIgICAgICAydSAgICAvKiBTaWcgcmV0dXJuIHNob3VsZCBub3QgcmVzdGFydCBzeXN0ZW0gY2FsbCAqLwotI2RlZmluZSBfU1ZfUkVTRVQgICAgIDR1ICAgIC8qIFNldCBoYW5kbGVyIHRvIFNJR19ERkwgdXBvbiB0YWtlbiBzaWduYWwgKi8KLSNkZWZpbmUgX1NWX0lHTkNISUxEICA4dSAgICAvKiBEbyBub3Qgc2VuZCBTSUdDSExEICovCi0KLS8qCi0gKiBzYV9mbGFncyB2YWx1ZXM6IFNBX1NUQUNLIGlzIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkLCBidXQgd2lsbCBhbGxvdyB0aGUKLSAqIHVzYWdlIG9mIHNpZ25hbCBzdGFja3MgYnkgdXNpbmcgdGhlIChub3cgb2Jzb2xldGUpIHNhX3Jlc3RvcmVyIGZpZWxkIGluCi0gKiB0aGUgc2lnYWN0aW9uIHN0cnVjdHVyZSBhcyBhIHN0YWNrIHBvaW50ZXIuIFRoaXMgaXMgbm93IHBvc3NpYmxlIGR1ZSB0bwotICogdGhlIGNoYW5nZXMgaW4gc2lnbmFsIGhhbmRsaW5nLiBMQlQgMDEwNDkzLgotICogU0FfUkVTVEFSVCBmbGFnIHRvIGdldCByZXN0YXJ0aW5nIHNpZ25hbHMgKHdoaWNoIHdlcmUgdGhlIGRlZmF1bHQgbG9uZyBhZ28pCi0gKi8KLSNkZWZpbmUgU0FfTk9DTERTVE9QCV9TVl9JR05DSElMRAotI2RlZmluZSBTQV9TVEFDSwlfU1ZfU1NUQUNLCi0jZGVmaW5lIFNBX09OU1RBQ0sJX1NWX1NTVEFDSwotI2RlZmluZSBTQV9SRVNUQVJUCV9TVl9JTlRSCi0jZGVmaW5lIFNBX09ORVNIT1QJX1NWX1JFU0VUCi0jZGVmaW5lIFNBX05PTUFTSwkweDIwdQotI2RlZmluZSBTQV9OT0NMRFdBSVQgICAgMHgxMDB1Ci0jZGVmaW5lIFNBX1NJR0lORk8gICAgICAweDIwMHUKLQotCi0jZGVmaW5lIFNJR19CTE9DSyAgICAgICAgICAweDAxCS8qIGZvciBibG9ja2luZyBzaWduYWxzICovCi0jZGVmaW5lIFNJR19VTkJMT0NLICAgICAgICAweDAyCS8qIGZvciB1bmJsb2NraW5nIHNpZ25hbHMgKi8KLSNkZWZpbmUgU0lHX1NFVE1BU0sgICAgICAgIDB4MDQJLyogZm9yIHNldHRpbmcgdGhlIHNpZ25hbCBtYXNrICovCi0KLS8qCi0gKiBzaWdhbHRzdGFjayBjb250cm9scwotICovCi0jZGVmaW5lIFNTX09OU1RBQ0sJMQotI2RlZmluZSBTU19ESVNBQkxFCTIKLQotI2RlZmluZSBNSU5TSUdTVEtTWgk0MDk2Ci0jZGVmaW5lIFNJR1NUS1NaCTE2Mzg0Ci0KLSNpbmNsdWRlIDxhc20tZ2VuZXJpYy9zaWduYWwuaD4KLQotc3RydWN0IF9fbmV3X3NpZ2FjdGlvbiB7Ci0JX19zaWdoYW5kbGVyX3QJCXNhX2hhbmRsZXI7Ci0JdW5zaWduZWQgbG9uZwkJc2FfZmxhZ3M7Ci0JX19zaWdyZXN0b3JlX3QgCQlzYV9yZXN0b3JlcjsgIC8qIG5vdCB1c2VkIGJ5IExpbnV4L1NQQVJDIHlldCAqLwotCV9fbmV3X3NpZ3NldF90CQlzYV9tYXNrOwotfTsKLQotc3RydWN0IF9fb2xkX3NpZ2FjdGlvbiB7Ci0JX19zaWdoYW5kbGVyX3QgIAlzYV9oYW5kbGVyOwotCV9fb2xkX3NpZ3NldF90ICAJc2FfbWFzazsKLQl1bnNpZ25lZCBsb25nICAgCXNhX2ZsYWdzOwotCXZvaWQgCQkJKCpzYV9yZXN0b3Jlcikodm9pZCk7ICAgICAvKiBub3QgdXNlZCBieSBMaW51eC9TUEFSQyB5ZXQgKi8KLX07Ci0KLXR5cGVkZWYgc3RydWN0IHNpZ2FsdHN0YWNrIHsKLQl2b2lkCQkJX191c2VyICpzc19zcDsKLQlpbnQJCQlzc19mbGFnczsKLQlzaXplX3QJCQlzc19zaXplOwotfSBzdGFja190OwotCi0jaWZkZWYgX19LRVJORUxfXwotCi1zdHJ1Y3Qga19zaWdhY3Rpb24gewotCXN0cnVjdCBfX25ld19zaWdhY3Rpb24gCXNhOwotCXZvaWQgX191c2VyCQkqa2FfcmVzdG9yZXI7Ci19OwotCi0jZGVmaW5lIHB0cmFjZV9zaWduYWxfZGVsaXZlcihyZWdzLCBjb29raWUpIGRvIHsgfSB3aGlsZSAoMCkKLQotI2VuZGlmIC8qICEoX19LRVJORUxfXykgKi8KLQotI2VuZGlmIC8qICEoX19BU1NFTUJMWV9fKSAqLwotCi0jZW5kaWYgLyogIShfQVNNU1BBUkM2NF9TSUdOQUxfSCkgKi8KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vc21wXzMyLmggYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3NtcF8zMi5oCmluZGV4IDg0MDhkOWQuLjU4MTAxZGMgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vc21wXzMyLmgKKysrIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9zbXBfMzIuaApAQCAtMTcwLDcgKzE3MCw0IEBACiAjZGVmaW5lIHNtcF9zZXR1cF9jcHVfcG9zc2libGVfbWFwKCkgZG8geyB9IHdoaWxlICgwKQogCiAjZW5kaWYgLyogIShTTVApICovCi0KLSNkZWZpbmUgTk9fUFJPQ19JRCAgICAgICAgICAgIDB4RkYKLQogI2VuZGlmIC8qICEoX1NQQVJDX1NNUF9IKSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9zdGF0LmggYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3N0YXQuaAppbmRleCBkODE1MzAxLi41NWRiNWVjIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3N0YXQuaAorKysgYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3N0YXQuaApAQCAtMSw4ICsxLDEwNyBAQAotI2lmbmRlZiBfX19BU01fU1BBUkNfU1RBVF9ICi0jZGVmaW5lIF9fX0FTTV9TUEFSQ19TVEFUX0gKKyNpZm5kZWYgX19TUEFSQ19TVEFUX0gKKyNkZWZpbmUgX19TUEFSQ19TVEFUX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKICNpZiBkZWZpbmVkKF9fc3BhcmNfXykgJiYgZGVmaW5lZChfX2FyY2g2NF9fKQotI2luY2x1ZGUgPGFzbS9zdGF0XzY0Lmg+CisvKiA2NCBiaXQgc3BhcmMgKi8KK3N0cnVjdCBzdGF0IHsKKwl1bnNpZ25lZCAgIHN0X2RldjsKKwlpbm9fdCAgIHN0X2lubzsKKwltb2RlX3QgIHN0X21vZGU7CisJc2hvcnQgICBzdF9ubGluazsKKwl1aWRfdCAgIHN0X3VpZDsKKwlnaWRfdCAgIHN0X2dpZDsKKwl1bnNpZ25lZCAgIHN0X3JkZXY7CisJb2ZmX3QgICBzdF9zaXplOworCXRpbWVfdCAgc3RfYXRpbWU7CisJdGltZV90ICBzdF9tdGltZTsKKwl0aW1lX3QgIHN0X2N0aW1lOworCW9mZl90ICAgc3RfYmxrc2l6ZTsKKwlvZmZfdCAgIHN0X2Jsb2NrczsKKwl1bnNpZ25lZCBsb25nICBfX3VudXNlZDRbMl07Cit9OworCitzdHJ1Y3Qgc3RhdDY0IHsKKwl1bnNpZ25lZCBsb25nCXN0X2RldjsKKwl1bnNpZ25lZCBsb25nCXN0X2lubzsKKwl1bnNpZ25lZCBsb25nCXN0X25saW5rOworCisJdW5zaWduZWQgaW50CXN0X21vZGU7CisJdW5zaWduZWQgaW50CXN0X3VpZDsKKwl1bnNpZ25lZCBpbnQJc3RfZ2lkOworCXVuc2lnbmVkIGludAlfX3BhZDA7CisKKwl1bnNpZ25lZCBsb25nCXN0X3JkZXY7CisJbG9uZwkJc3Rfc2l6ZTsKKwlsb25nCQlzdF9ibGtzaXplOworCWxvbmcJCXN0X2Jsb2NrczsKKworCXVuc2lnbmVkIGxvbmcJc3RfYXRpbWU7CisJdW5zaWduZWQgbG9uZwlzdF9hdGltZV9uc2VjOworCXVuc2lnbmVkIGxvbmcJc3RfbXRpbWU7CisJdW5zaWduZWQgbG9uZwlzdF9tdGltZV9uc2VjOworCXVuc2lnbmVkIGxvbmcJc3RfY3RpbWU7CisJdW5zaWduZWQgbG9uZwlzdF9jdGltZV9uc2VjOworCWxvbmcJCV9fdW51c2VkWzNdOworfTsKKwogI2Vsc2UKLSNpbmNsdWRlIDxhc20vc3RhdF8zMi5oPgotI2VuZGlmCi0jZW5kaWYKKy8qIDMyIGJpdCBzcGFyYyAqLworc3RydWN0IHN0YXQgeworCXVuc2lnbmVkIHNob3J0CXN0X2RldjsKKwlpbm9fdAkJc3RfaW5vOworCW1vZGVfdAkJc3RfbW9kZTsKKwlzaG9ydAkJc3Rfbmxpbms7CisJdWlkX3QJCXN0X3VpZDsKKwlnaWRfdAkJc3RfZ2lkOworCXVuc2lnbmVkIHNob3J0CXN0X3JkZXY7CisJb2ZmX3QJCXN0X3NpemU7CisJdGltZV90CQlzdF9hdGltZTsKKwl1bnNpZ25lZCBsb25nCXN0X2F0aW1lX25zZWM7CisJdGltZV90CQlzdF9tdGltZTsKKwl1bnNpZ25lZCBsb25nCXN0X210aW1lX25zZWM7CisJdGltZV90CQlzdF9jdGltZTsKKwl1bnNpZ25lZCBsb25nCXN0X2N0aW1lX25zZWM7CisJb2ZmX3QJCXN0X2Jsa3NpemU7CisJb2ZmX3QJCXN0X2Jsb2NrczsKKwl1bnNpZ25lZCBsb25nCV9fdW51c2VkNFsyXTsKK307CisKKyNkZWZpbmUgU1RBVF9IQVZFX05TRUMgMQorCitzdHJ1Y3Qgc3RhdDY0IHsKKwl1bnNpZ25lZCBsb25nIGxvbmcgc3RfZGV2OworCisJdW5zaWduZWQgbG9uZyBsb25nIHN0X2lubzsKKworCXVuc2lnbmVkIGludAlzdF9tb2RlOworCXVuc2lnbmVkIGludAlzdF9ubGluazsKKworCXVuc2lnbmVkIGludAlzdF91aWQ7CisJdW5zaWduZWQgaW50CXN0X2dpZDsKKworCXVuc2lnbmVkIGxvbmcgbG9uZyBzdF9yZGV2OworCisJdW5zaWduZWQgY2hhcglfX3BhZDNbOF07CisKKwlsb25nIGxvbmcJc3Rfc2l6ZTsKKwl1bnNpZ25lZCBpbnQJc3RfYmxrc2l6ZTsKKworCXVuc2lnbmVkIGNoYXIJX19wYWQ0WzhdOworCXVuc2lnbmVkIGludAlzdF9ibG9ja3M7CisKKwl1bnNpZ25lZCBpbnQJc3RfYXRpbWU7CisJdW5zaWduZWQgaW50CXN0X2F0aW1lX25zZWM7CisKKwl1bnNpZ25lZCBpbnQJc3RfbXRpbWU7CisJdW5zaWduZWQgaW50CXN0X210aW1lX25zZWM7CisKKwl1bnNpZ25lZCBpbnQJc3RfY3RpbWU7CisJdW5zaWduZWQgaW50CXN0X2N0aW1lX25zZWM7CisKKwl1bnNpZ25lZCBpbnQJX191bnVzZWQ0OworCXVuc2lnbmVkIGludAlfX3VudXNlZDU7Cit9OworI2VuZGlmIC8qIGRlZmluZWQoX19zcGFyY19fKSAmJiBkZWZpbmVkKF9fYXJjaDY0X18pICovCisjZW5kaWYgLyogX19TUEFSQ19TVEFUX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vc3RhdF8zMi5oIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9zdGF0XzMyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyOTllMWQ1Li4wMDAwMDAwCi0tLSBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vc3RhdF8zMi5oCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotI2lmbmRlZiBfU1BBUkNfU1RBVF9ICi0jZGVmaW5lIF9TUEFSQ19TVEFUX0gKLQotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0KLXN0cnVjdCBfX29sZF9rZXJuZWxfc3RhdCB7Ci0JdW5zaWduZWQgc2hvcnQgc3RfZGV2OwotCXVuc2lnbmVkIHNob3J0IHN0X2lubzsKLQl1bnNpZ25lZCBzaG9ydCBzdF9tb2RlOwotCXVuc2lnbmVkIHNob3J0IHN0X25saW5rOwotCXVuc2lnbmVkIHNob3J0IHN0X3VpZDsKLQl1bnNpZ25lZCBzaG9ydCBzdF9naWQ7Ci0JdW5zaWduZWQgc2hvcnQgc3RfcmRldjsKLQl1bnNpZ25lZCBsb25nICBzdF9zaXplOwotCXVuc2lnbmVkIGxvbmcgIHN0X2F0aW1lOwotCXVuc2lnbmVkIGxvbmcgIHN0X210aW1lOwotCXVuc2lnbmVkIGxvbmcgIHN0X2N0aW1lOwotfTsKLQotc3RydWN0IHN0YXQgewotCXVuc2lnbmVkIHNob3J0CXN0X2RldjsKLQl1bnNpZ25lZCBsb25nCXN0X2lubzsKLQl1bnNpZ25lZCBzaG9ydAlzdF9tb2RlOwotCXNob3J0CQlzdF9ubGluazsKLQl1bnNpZ25lZCBzaG9ydAlzdF91aWQ7Ci0JdW5zaWduZWQgc2hvcnQJc3RfZ2lkOwotCXVuc2lnbmVkIHNob3J0CXN0X3JkZXY7Ci0JbG9uZwkJc3Rfc2l6ZTsKLQlsb25nCQlzdF9hdGltZTsKLQl1bnNpZ25lZCBsb25nCXN0X2F0aW1lX25zZWM7Ci0JbG9uZwkJc3RfbXRpbWU7Ci0JdW5zaWduZWQgbG9uZwlzdF9tdGltZV9uc2VjOwotCWxvbmcJCXN0X2N0aW1lOwotCXVuc2lnbmVkIGxvbmcJc3RfY3RpbWVfbnNlYzsKLQlsb25nCQlzdF9ibGtzaXplOwotCWxvbmcJCXN0X2Jsb2NrczsKLQl1bnNpZ25lZCBsb25nCV9fdW51c2VkNFsyXTsKLX07Ci0KLSNkZWZpbmUgU1RBVF9IQVZFX05TRUMgMQotCi1zdHJ1Y3Qgc3RhdDY0IHsKLQl1bnNpZ25lZCBsb25nIGxvbmcgc3RfZGV2OwotCi0JdW5zaWduZWQgbG9uZyBsb25nIHN0X2lubzsKLQotCXVuc2lnbmVkIGludAlzdF9tb2RlOwotCXVuc2lnbmVkIGludAlzdF9ubGluazsKLQotCXVuc2lnbmVkIGludAlzdF91aWQ7Ci0JdW5zaWduZWQgaW50CXN0X2dpZDsKLQotCXVuc2lnbmVkIGxvbmcgbG9uZyBzdF9yZGV2OwotCi0JdW5zaWduZWQgY2hhcglfX3BhZDNbOF07Ci0KLQlsb25nIGxvbmcJc3Rfc2l6ZTsKLQl1bnNpZ25lZCBpbnQJc3RfYmxrc2l6ZTsKLQotCXVuc2lnbmVkIGNoYXIJX19wYWQ0WzhdOwotCXVuc2lnbmVkIGludAlzdF9ibG9ja3M7Ci0KLQl1bnNpZ25lZCBpbnQJc3RfYXRpbWU7Ci0JdW5zaWduZWQgaW50CXN0X2F0aW1lX25zZWM7Ci0KLQl1bnNpZ25lZCBpbnQJc3RfbXRpbWU7Ci0JdW5zaWduZWQgaW50CXN0X210aW1lX25zZWM7Ci0KLQl1bnNpZ25lZCBpbnQJc3RfY3RpbWU7Ci0JdW5zaWduZWQgaW50CXN0X2N0aW1lX25zZWM7Ci0KLQl1bnNpZ25lZCBpbnQJX191bnVzZWQ0OwotCXVuc2lnbmVkIGludAlfX3VudXNlZDU7Ci19OwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vc3RhdF82NC5oIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9zdGF0XzY0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2NTBmZGUuLjAwMDAwMDAKLS0tIGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9zdGF0XzY0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0jaWZuZGVmIF9TUEFSQzY0X1NUQVRfSAotI2RlZmluZSBfU1BBUkM2NF9TVEFUX0gKLQotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0KLXN0cnVjdCBzdGF0IHsKLQl1bnNpZ25lZCAgIHN0X2RldjsKLQlpbm9fdCAgIHN0X2lubzsKLQltb2RlX3QgIHN0X21vZGU7Ci0Jc2hvcnQgICBzdF9ubGluazsKLQl1aWRfdCAgIHN0X3VpZDsKLQlnaWRfdCAgIHN0X2dpZDsKLQl1bnNpZ25lZCAgIHN0X3JkZXY7Ci0Jb2ZmX3QgICBzdF9zaXplOwotCXRpbWVfdCAgc3RfYXRpbWU7Ci0JdGltZV90ICBzdF9tdGltZTsKLQl0aW1lX3QgIHN0X2N0aW1lOwotCW9mZl90ICAgc3RfYmxrc2l6ZTsKLQlvZmZfdCAgIHN0X2Jsb2NrczsKLQl1bnNpZ25lZCBsb25nICBfX3VudXNlZDRbMl07Ci19OwotCi1zdHJ1Y3Qgc3RhdDY0IHsKLQl1bnNpZ25lZCBsb25nCXN0X2RldjsKLQl1bnNpZ25lZCBsb25nCXN0X2lubzsKLQl1bnNpZ25lZCBsb25nCXN0X25saW5rOwotCi0JdW5zaWduZWQgaW50CXN0X21vZGU7Ci0JdW5zaWduZWQgaW50CXN0X3VpZDsKLQl1bnNpZ25lZCBpbnQJc3RfZ2lkOwotCXVuc2lnbmVkIGludAlfX3BhZDA7Ci0KLQl1bnNpZ25lZCBsb25nCXN0X3JkZXY7Ci0JbG9uZwkJc3Rfc2l6ZTsKLQlsb25nCQlzdF9ibGtzaXplOwotCWxvbmcJCXN0X2Jsb2NrczsKLQotCXVuc2lnbmVkIGxvbmcJc3RfYXRpbWU7Ci0JdW5zaWduZWQgbG9uZwlzdF9hdGltZV9uc2VjOwotCXVuc2lnbmVkIGxvbmcJc3RfbXRpbWU7Ci0JdW5zaWduZWQgbG9uZwlzdF9tdGltZV9uc2VjOwotCXVuc2lnbmVkIGxvbmcJc3RfY3RpbWU7Ci0JdW5zaWduZWQgbG9uZwlzdF9jdGltZV9uc2VjOwotCWxvbmcJCV9fdW51c2VkWzNdOwotfTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3N3YWIuaCBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vc3dhYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzNGFkMDcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3N3YWIuaApAQCAtMCwwICsxLDQ1IEBACisjaWZuZGVmIF9TUEFSQ19TV0FCX0gKKyNkZWZpbmUgX1NQQVJDX1NXQUJfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vYXNpLmg+CisKKyNpZiBkZWZpbmVkKF9fc3BhcmNfXykgJiYgZGVmaW5lZChfX2FyY2g2NF9fKQorc3RhdGljIGlubGluZSBfX3UxNiBfX2FyY2hfc3dhYjE2cChjb25zdCBfX3UxNiAqYWRkcikKK3sKKwlfX3UxNiByZXQ7CisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImxkdWhhIFslMV0gJTIsICUwIgorCQkJICAgICAgOiAiPXIiIChyZXQpCisJCQkgICAgICA6ICJyIiAoYWRkciksICJpIiAoQVNJX1BMKSk7CisJcmV0dXJuIHJldDsKK30KKyNkZWZpbmUgX19hcmNoX3N3YWIxNnAgX19hcmNoX3N3YWIxNnAKKworc3RhdGljIGlubGluZSBfX3UzMiBfX2FyY2hfc3dhYjMycChjb25zdCBfX3UzMiAqYWRkcikKK3sKKwlfX3UzMiByZXQ7CisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImxkdXdhIFslMV0gJTIsICUwIgorCQkJICAgICAgOiAiPXIiIChyZXQpCisJCQkgICAgICA6ICJyIiAoYWRkciksICJpIiAoQVNJX1BMKSk7CisJcmV0dXJuIHJldDsKK30KKyNkZWZpbmUgX19hcmNoX3N3YWIzMnAgX19hcmNoX3N3YWIzMnAKKworc3RhdGljIGlubGluZSBfX3U2NCBfX2FyY2hfc3dhYjY0cChjb25zdCBfX3U2NCAqYWRkcikKK3sKKwlfX3U2NCByZXQ7CisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImxkeGEgWyUxXSAlMiwgJTAiCisJCQkgICAgICA6ICI9ciIgKHJldCkKKwkJCSAgICAgIDogInIiIChhZGRyKSwgImkiIChBU0lfUEwpKTsKKwlyZXR1cm4gcmV0OworfQorI2RlZmluZSBfX2FyY2hfc3dhYjY0cCBfX2FyY2hfc3dhYjY0cAorCisjZWxzZQorI2RlZmluZSBfX1NXQUJfNjRfVEhSVV8zMl9fCisjZW5kaWYgLyogZGVmaW5lZChfX3NwYXJjX18pICYmIGRlZmluZWQoX19hcmNoNjRfXykgKi8KKworI2VuZGlmIC8qIF9TUEFSQ19TV0FCX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vdGhyZWFkX2luZm9fMzIuaCBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vdGhyZWFkX2luZm9fMzIuaAppbmRleCA4MGZlNTQ3Li4wZjdiMGU1IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3RocmVhZF9pbmZvXzMyLmgKKysrIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS90aHJlYWRfaW5mb18zMi5oCkBAIC00NSw3ICs0NSw3IEBACiAJLyogQSBwbGFjZSB0byBzdG9yZSB1c2VyIHdpbmRvd3MgYW5kIHN0YWNrIHBvaW50ZXJzCiAJICogd2hlbiB0aGUgc3RhY2sgbmVlZHMgaW5zcGVjdGlvbi4KIAkgKi8KLQlzdHJ1Y3QgcmVnX3dpbmRvdwlyZWdfd2luZG93W05TV0lOU107CS8qIGFsaWduIGZvciBsZGQhICovCisJc3RydWN0IHJlZ193aW5kb3czMglyZWdfd2luZG93W05TV0lOU107CS8qIGFsaWduIGZvciBsZGQhICovCiAJdW5zaWduZWQgbG9uZwkJcndidWZfc3RrcHRyc1tOU1dJTlNdOwogCXVuc2lnbmVkIGxvbmcJCXdfc2F2ZWQ7CiAKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vdGltZXJfNjQuaCBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vdGltZXJfNjQuaAppbmRleCA1Yjc3OWZkLi5lZjNjMzY4IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3RpbWVyXzY0LmgKKysrIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS90aW1lcl82NC5oCkBAIC0xMCw3ICsxMCw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogCiBzdHJ1Y3Qgc3BhcmM2NF90aWNrX29wcyB7Ci0JdW5zaWduZWQgbG9uZyAoKmdldF90aWNrKSh2b2lkKTsKKwl1bnNpZ25lZCBsb25nIGxvbmcgKCpnZXRfdGljaykodm9pZCk7CiAJaW50ICgqYWRkX2NvbXBhcmUpKHVuc2lnbmVkIGxvbmcpOwogCXVuc2lnbmVkIGxvbmcgc29mdGludF9tYXNrOwogCXZvaWQgKCpkaXNhYmxlX2lycSkodm9pZCk7CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3RyYXBzLmggYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3RyYXBzLmgKaW5kZXggYmViZGJmOC4uM2FhNjJkZCAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS90cmFwcy5oCisrKyBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vdHJhcHMuaApAQCAtMTAsNyArMTAsNyBAQAogI2RlZmluZSBOVU1fU1BBUkNfVFJBUFMgIDI1NQogCiAjaWZuZGVmIF9fQVNTRU1CTFlfXwotCisjaWZkZWYgX19LRVJORUxfXwogLyogVGhpcyBpcyBmb3IgVjggY29tcGxpYW50IFNwYXJjIENQVVMgKi8KIHN0cnVjdCB0dF9lbnRyeSB7CiAJdW5zaWduZWQgbG9uZyBpbnN0X29uZTsKQEAgLTIyLDE0ICsyMiw3IEBACiAvKiBXZSBzZXQgdGhpcyB0byBfc3RhcnQgaW4gc3lzdGVtIHNldHVwLiAqLwogZXh0ZXJuIHN0cnVjdCB0dF9lbnRyeSAqc3BhcmNfdHRhYmxlOwogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgZ2V0X3Ricih2b2lkKQotewotCXVuc2lnbmVkIGxvbmcgdGJyOwotCi0JX19hc21fXyBfX3ZvbGF0aWxlX18oInJkICUldGJyLCAlMFxuXHQiIDogIj1yIiAodGJyKSk7Ci0JcmV0dXJuIHRicjsKLX0KLQorI2VuZGlmIC8qIChfX0tFUk5FTF9fKSAqLwogI2VuZGlmIC8qICEoX19BU1NFTUJMWV9fKSAqLwogCiAvKiBGb3IgcGF0Y2hpbmcgdGhlIHRyYXAgdGFibGUgYXQgYm9vdCB0aW1lLCB3ZSBuZWVkIHRvIGtub3cgaG93IHRvCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3R5cGVzLmggYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3R5cGVzLmgKaW5kZXggOGMyOGZkZS4uMjIzNzExODggMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vdHlwZXMuaAorKysgYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3R5cGVzLmgKQEAgLTExLDcgKzExLDcgQEAKICNpZiBkZWZpbmVkKF9fc3BhcmNfXykgJiYgZGVmaW5lZChfX2FyY2g2NF9fKQogCiAvKioqIFNQQVJDIDY0IGJpdCAqKiovCi0jaW5jbHVkZSA8YXNtLWdlbmVyaWMvaW50LWw2NC5oPgorI2luY2x1ZGUgPGFzbS1nZW5lcmljL2ludC1sbDY0Lmg+CiAKICNpZm5kZWYgX19BU1NFTUJMWV9fCiAKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL2RzLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9kcy5jCmluZGV4IGY1MmUwNTMuLjU3YzM5ODQgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL2RzLmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvZHMuYwpAQCAtMjg2LDcgKzI4Niw3IEBACiAKIAlycCA9IChzdHJ1Y3QgZHNfbWRfdXBkYXRlX3JlcSAqKSAoZHBrdCArIDEpOwogCi0JcHJpbnRrKEtFUk5fSU5GTyAiZHMtJWx1OiBNYWNoaW5lIGRlc2NyaXB0aW9uIHVwZGF0ZS5cbiIsIGRwLT5pZCk7CisJcHJpbnRrKEtFUk5fSU5GTyAiZHMtJWxsdTogTWFjaGluZSBkZXNjcmlwdGlvbiB1cGRhdGUuXG4iLCBkcC0+aWQpOwogCiAJbWRlc2NfdXBkYXRlKCk7CiAKQEAgLTMyNSw3ICszMjUsNyBAQAogCiAJcnAgPSAoc3RydWN0IGRzX3NodXRkb3duX3JlcSAqKSAoZHBrdCArIDEpOwogCi0JcHJpbnRrKEtFUk5fQUxFUlQgImRzLSVsdTogU2h1dGRvd24gcmVxdWVzdCBmcm9tICIKKwlwcmludGsoS0VSTl9BTEVSVCAiZHMtJWxsdTogU2h1dGRvd24gcmVxdWVzdCBmcm9tICIKIAkgICAgICAgIkxET00gbWFuYWdlciByZWNlaXZlZC5cbiIsIGRwLT5pZCk7CiAKIAltZW1zZXQoJnBrdCwgMCwgc2l6ZW9mKHBrdCkpOwpAQCAtMzY1LDcgKzM2NSw3IEBACiAKIAlycCA9IChzdHJ1Y3QgZHNfcGFuaWNfcmVxICopIChkcGt0ICsgMSk7CiAKLQlwcmludGsoS0VSTl9BTEVSVCAiZHMtJWx1OiBQYW5pYyByZXF1ZXN0IGZyb20gIgorCXByaW50ayhLRVJOX0FMRVJUICJkcy0lbGx1OiBQYW5pYyByZXF1ZXN0IGZyb20gIgogCSAgICAgICAiTERPTSBtYW5hZ2VyIHJlY2VpdmVkLlxuIiwgZHAtPmlkKTsKIAogCW1lbXNldCgmcGt0LCAwLCBzaXplb2YocGt0KSk7CkBAIC01NDksNyArNTQ5LDcgQEAKIAlmb3JfZWFjaF9jcHVfbWFzayhjcHUsICptYXNrKSB7CiAJCWludCBlcnI7CiAKLQkJcHJpbnRrKEtFUk5fSU5GTyAiZHMtJWx1OiBTdGFydGluZyBjcHUgJWQuLi5cbiIsCisJCXByaW50ayhLRVJOX0lORk8gImRzLSVsbHU6IFN0YXJ0aW5nIGNwdSAlZC4uLlxuIiwKIAkJICAgICAgIGRwLT5pZCwgY3B1KTsKIAkJZXJyID0gY3B1X3VwKGNwdSk7CiAJCWlmIChlcnIpIHsKQEAgLTU2NSw3ICs1NjUsNyBAQAogCQkJCXJlcyA9IERSX0NQVV9SRVNfQ1BVX05PVF9SRVNQT05ESU5HOwogCQkJfQogCi0JCQlwcmludGsoS0VSTl9JTkZPICJkcy0lbHU6IENQVSBzdGFydHVwIGZhaWxlZCBlcnI9JWRcbiIsCisJCQlwcmludGsoS0VSTl9JTkZPICJkcy0lbGx1OiBDUFUgc3RhcnR1cCBmYWlsZWQgZXJyPSVkXG4iLAogCQkJICAgICAgIGRwLT5pZCwgZXJyKTsKIAkJCWRyX2NwdV9tYXJrKHJlc3AsIGNwdSwgbmNwdXMsIHJlcywgc3RhdCk7CiAJCX0KQEAgLTYwNSw3ICs2MDUsNyBAQAogCWZvcl9lYWNoX2NwdV9tYXNrKGNwdSwgKm1hc2spIHsKIAkJaW50IGVycjsKIAotCQlwcmludGsoS0VSTl9JTkZPICJkcy0lbHU6IFNodXR0aW5nIGRvd24gY3B1ICVkLi4uXG4iLAorCQlwcmludGsoS0VSTl9JTkZPICJkcy0lbGx1OiBTaHV0dGluZyBkb3duIGNwdSAlZC4uLlxuIiwKIAkJICAgICAgIGRwLT5pZCwgY3B1KTsKIAkJZXJyID0gY3B1X2Rvd24oY3B1KTsKIAkJaWYgKGVycikKQEAgLTY4NCw3ICs2ODQsNyBAQAogCiAJcnAgPSAoc3RydWN0IGRzX3ByaV9tc2cgKikgKGRwa3QgKyAxKTsKIAotCXByaW50ayhLRVJOX0lORk8gImRzLSVsdTogUFJJIFJFUSBbJWx4OiVseF0sIGxlbj0lZFxuIiwKKwlwcmludGsoS0VSTl9JTkZPICJkcy0lbGx1OiBQUkkgUkVRIFslbGx4OiVsbHhdLCBsZW49JWRcbiIsCiAJICAgICAgIGRwLT5pZCwgcnAtPnJlcV9udW0sIHJwLT50eXBlLCBsZW4pOwogfQogCkBAIC04MTYsNyArODE2LDcgQEAKIAogCQlpZiAoZHNfdmFyX2Rvb3JiZWxsID09IDAgfHwKIAkJICAgIGRzX3Zhcl9yZXNwb25zZSAhPSBEU19WQVJfU1VDQ0VTUykKLQkJCXByaW50ayhLRVJOX0VSUiAiZHMtJWx1OiB2YXItY29uZmlnIFslczolc10gIgorCQkJcHJpbnRrKEtFUk5fRVJSICJkcy0lbGx1OiB2YXItY29uZmlnIFslczolc10gIgogCQkJICAgICAgICJmYWlsZWQsIHJlc3BvbnNlKCVkKS5cbiIsCiAJCQkgICAgICAgZHAtPmlkLCB2YXIsIHZhbHVlLAogCQkJICAgICAgIGRzX3Zhcl9yZXNwb25zZSk7CkBAIC04NTAsNyArODUwLDcgQEAKIAogc3RhdGljIHZvaWQgZHNfY29ubl9yZXNldChzdHJ1Y3QgZHNfaW5mbyAqZHApCiB7Ci0JcHJpbnRrKEtFUk5fRVJSICJkcy0lbHU6IGRzX2Nvbm5fcmVzZXQoKSBmcm9tICVwXG4iLAorCXByaW50ayhLRVJOX0VSUiAiZHMtJWxsdTogZHNfY29ubl9yZXNldCgpIGZyb20gJXBcbiIsCiAJICAgICAgIGRwLT5pZCwgX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApKTsKIH0KIApAQCAtOTEyLDExICs5MTIsMTEgQEAKIAkJc3RydWN0IGRzX2NhcF9zdGF0ZSAqY3AgPSBmaW5kX2NhcChkcCwgYXAtPmhhbmRsZSk7CiAKIAkJaWYgKCFjcCkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJkcy0lbHU6IFJFRyBBQ0sgZm9yIHVua25vd24gIgotCQkJICAgICAgICJoYW5kbGUgJWx4XG4iLCBkcC0+aWQsIGFwLT5oYW5kbGUpOworCQkJcHJpbnRrKEtFUk5fRVJSICJkcy0lbGx1OiBSRUcgQUNLIGZvciB1bmtub3duICIKKwkJCSAgICAgICAiaGFuZGxlICVsbHhcbiIsIGRwLT5pZCwgYXAtPmhhbmRsZSk7CiAJCQlyZXR1cm4gMDsKIAkJfQotCQlwcmludGsoS0VSTl9JTkZPICJkcy0lbHU6IFJlZ2lzdGVyZWQgJXMgc2VydmljZS5cbiIsCisJCXByaW50ayhLRVJOX0lORk8gImRzLSVsbHU6IFJlZ2lzdGVyZWQgJXMgc2VydmljZS5cbiIsCiAJCSAgICAgICBkcC0+aWQsIGNwLT5zZXJ2aWNlX2lkKTsKIAkJY3AtPnN0YXRlID0gQ0FQX1NUQVRFX1JFR0lTVEVSRUQ7CiAJfSBlbHNlIGlmIChwa3QtPnR5cGUgPT0gRFNfUkVHX05BQ0spIHsKQEAgLTkyNCw4ICs5MjQsOCBAQAogCQlzdHJ1Y3QgZHNfY2FwX3N0YXRlICpjcCA9IGZpbmRfY2FwKGRwLCBucC0+aGFuZGxlKTsKIAogCQlpZiAoIWNwKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgImRzLSVsdTogUkVHIE5BQ0sgZm9yICIKLQkJCSAgICAgICAidW5rbm93biBoYW5kbGUgJWx4XG4iLAorCQkJcHJpbnRrKEtFUk5fRVJSICJkcy0lbGx1OiBSRUcgTkFDSyBmb3IgIgorCQkJICAgICAgICJ1bmtub3duIGhhbmRsZSAlbGx4XG4iLAogCQkJICAgICAgIGRwLT5pZCwgbnAtPmhhbmRsZSk7CiAJCQlyZXR1cm4gMDsKIAkJfQpAQCAtOTgyLDggKzk4Miw4IEBACiAJCWludCByZXFfbGVuID0gcXAtPnJlcV9sZW47CiAKIAkJaWYgKCFjcCkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJkcy0lbHU6IERhdGEgZm9yIHVua25vd24gIgotCQkJICAgICAgICJoYW5kbGUgJWx1XG4iLAorCQkJcHJpbnRrKEtFUk5fRVJSICJkcy0lbGx1OiBEYXRhIGZvciB1bmtub3duICIKKwkJCSAgICAgICAiaGFuZGxlICVsbHVcbiIsCiAJCQkgICAgICAgZHAtPmlkLCBkcGt0LT5oYW5kbGUpOwogCiAJCQlzcGluX2xvY2tfaXJxc2F2ZSgmZHNfbG9jaywgZmxhZ3MpOwpAQCAtMTA4NSw3ICsxMDg1LDcgQEAKIAl9CiAKIAlpZiAoZXZlbnQgIT0gTERDX0VWRU5UX0RBVEFfUkVBRFkpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiZHMtJWx1OiBVbmV4cGVjdGVkIExEQyBldmVudCAlZFxuIiwKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiZHMtJWxsdTogVW5leHBlY3RlZCBMREMgZXZlbnQgJWRcbiIsCiAJCSAgICAgICBkcC0+aWQsIGV2ZW50KTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZHNfbG9jaywgZmxhZ3MpOwogCQlyZXR1cm47CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9pb21tdS5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvaW9tbXUuYwppbmRleCAxY2MxOTk1Li5kODkwMGUxIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9pb21tdS5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL2lvbW11LmMKQEAgLTQzNCw3ICs0MzQsNyBAQAogCQl2YWwgPSBpb21tdV9yZWFkKG1hdGNocmVnKTsKIAkJaWYgKHVubGlrZWx5KHZhbCkpIHsKIAkJCXByaW50ayhLRVJOX1dBUk5JTkcgInN0cmJ1Zl9mbHVzaDogY3R4IGZsdXNoICIKLQkJCSAgICAgICAidGltZW91dCBtYXRjaHJlZ1slbHhdIGN0eFslbHhdXG4iLAorCQkJICAgICAgICJ0aW1lb3V0IG1hdGNocmVnWyVsbHhdIGN0eFslbHhdXG4iLAogCQkJICAgICAgIHZhbCwgY3R4KTsKIAkJCWdvdG8gZG9fcGFnZV9mbHVzaDsKIAkJfQpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvaXJxXzMyLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9pcnFfMzIuYwppbmRleCBmMzQ4OGM0Li4xZWZmOTQyIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9pcnFfMzIuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9pcnFfMzIuYwpAQCAtNjY5LDcgKzY2OSw5IEBACiAJYnRmaXh1cCgpOwogfQogCisjaWZkZWYgQ09ORklHX1BST0NfRlMKIHZvaWQgaW5pdF9pcnFfcHJvYyh2b2lkKQogewogCS8qIEZvciBub3csIG5vdGhpbmcuLi4gKi8KIH0KKyNlbmRpZiAvKiBDT05GSUdfUFJPQ19GUyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwva2dkYl8zMi5jIGIvYXJjaC9zcGFyYy9rZXJuZWwva2dkYl8zMi5jCmluZGV4IDc1NzgwNWMuLjA0ZGY0ZWQgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL2tnZGJfMzIuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9rZ2RiXzMyLmMKQEAgLTE0LDE0ICsxNCwxNCBAQAogCiB2b2lkIHB0X3JlZ3NfdG9fZ2RiX3JlZ3ModW5zaWduZWQgbG9uZyAqZ2RiX3JlZ3MsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotCXN0cnVjdCByZWdfd2luZG93ICp3aW47CisJc3RydWN0IHJlZ193aW5kb3czMiAqd2luOwogCWludCBpOwogCiAJZ2RiX3JlZ3NbR0RCX0cwXSA9IDA7CiAJZm9yIChpID0gMDsgaSA8IDE1OyBpKyspCiAJCWdkYl9yZWdzW0dEQl9HMSArIGldID0gcmVncy0+dV9yZWdzW1VSRUdfRzEgKyBpXTsKIAotCXdpbiA9IChzdHJ1Y3QgcmVnX3dpbmRvdyAqKSByZWdzLT51X3JlZ3NbVVJFR19GUF07CisJd2luID0gKHN0cnVjdCByZWdfd2luZG93MzIgKikgcmVncy0+dV9yZWdzW1VSRUdfRlBdOwogCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCiAJCWdkYl9yZWdzW0dEQl9MMCArIGldID0gd2luLT5sb2NhbHNbaV07CiAJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKQEAgLTQzLDcgKzQzLDcgQEAKIHZvaWQgc2xlZXBpbmdfdGhyZWFkX3RvX2dkYl9yZWdzKHVuc2lnbmVkIGxvbmcgKmdkYl9yZWdzLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCiB7CiAJc3RydWN0IHRocmVhZF9pbmZvICp0ID0gdGFza190aHJlYWRfaW5mbyhwKTsKLQlzdHJ1Y3QgcmVnX3dpbmRvdyAqd2luOworCXN0cnVjdCByZWdfd2luZG93MzIgKndpbjsKIAlpbnQgaTsKIAogCWZvciAoaSA9IEdEQl9HMDsgaSA8IEdEQl9HNjsgaSsrKQpAQCAtNTUsNyArNTUsNyBAQAogCWdkYl9yZWdzW0dEQl9TUF0gPSB0LT5rc3A7CiAJZ2RiX3JlZ3NbR0RCX083XSA9IDA7CiAKLQl3aW4gPSAoc3RydWN0IHJlZ193aW5kb3cgKikgdC0+a3NwOworCXdpbiA9IChzdHJ1Y3QgcmVnX3dpbmRvdzMyICopIHQtPmtzcDsKIAlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQogCQlnZGJfcmVnc1tHREJfTDAgKyBpXSA9IHdpbi0+bG9jYWxzW2ldOwogCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCkBAIC03Nyw3ICs3Nyw3IEBACiAKIHZvaWQgZ2RiX3JlZ3NfdG9fcHRfcmVncyh1bnNpZ25lZCBsb25nICpnZGJfcmVncywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7Ci0Jc3RydWN0IHJlZ193aW5kb3cgKndpbjsKKwlzdHJ1Y3QgcmVnX3dpbmRvdzMyICp3aW47CiAJaW50IGk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgMTU7IGkrKykKQEAgLTk2LDcgKzk2LDcgQEAKIAlyZWdzLT5ucGMgPSBnZGJfcmVnc1tHREJfTlBDXTsKIAlyZWdzLT55ID0gZ2RiX3JlZ3NbR0RCX1ldOwogCi0Jd2luID0gKHN0cnVjdCByZWdfd2luZG93ICopIHJlZ3MtPnVfcmVnc1tVUkVHX0ZQXTsKKwl3aW4gPSAoc3RydWN0IHJlZ193aW5kb3czMiAqKSByZWdzLT51X3JlZ3NbVVJFR19GUF07CiAJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKIAkJd2luLT5sb2NhbHNbaV0gPSBnZGJfcmVnc1tHREJfTDAgKyBpXTsKIAlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwva3Byb2Jlcy5jIGIvYXJjaC9zcGFyYy9rZXJuZWwva3Byb2Jlcy5jCmluZGV4IDIwMWE2ZTUuLjNiYzY1MjcgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL2twcm9iZXMuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9rcHJvYmVzLmMKQEAgLTUxNyw3ICs1MTcsNyBAQAogCS8qCiAJICogSXQgaXMgcG9zc2libGUgdG8gaGF2ZSBtdWx0aXBsZSBpbnN0YW5jZXMgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4KIAkgKiB0YXNrIGVpdGhlciBiZWNhdXNlIGFuIG11bHRpcGxlIGZ1bmN0aW9ucyBpbiB0aGUgY2FsbCBwYXRoCi0JICogaGF2ZSBhIHJldHVybiBwcm9iZSBpbnN0YWxsZWQgb24gdGhlbSwgYW5kL29yIG1vcmUgdGhlbiBvbmUgcmV0dXJuCisJICogaGF2ZSBhIHJldHVybiBwcm9iZSBpbnN0YWxsZWQgb24gdGhlbSwgYW5kL29yIG1vcmUgdGhhbiBvbmUgcmV0dXJuCiAJICogcmV0dXJuIHByb2JlIHdhcyByZWdpc3RlcmVkIGZvciBhIHRhcmdldCBmdW5jdGlvbi4KIAkgKgogCSAqIFdlIGNhbiBoYW5kbGUgdGhpcyBiZWNhdXNlOgpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvbGRjLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9sZGMuYwppbmRleCBkNjg5ODIzMy4uNmNlNWQyNSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvbGRjLmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvbGRjLmMKQEAgLTYyNSwyMiArNjI1LDIzIEBACiBzdGF0aWMgaW50IHByb2Nlc3NfdmVyX25hY2soc3RydWN0IGxkY19jaGFubmVsICpscCwgc3RydWN0IGxkY192ZXJzaW9uICp2cCkKIHsKIAlzdHJ1Y3QgbGRjX3ZlcnNpb24gKnZhcDsKKwlzdHJ1Y3QgbGRjX3BhY2tldCAqcDsKKwl1bnNpZ25lZCBsb25nIG5ld190YWlsOwogCi0JaWYgKCh2cC0+bWFqb3IgPT0gMCAmJiB2cC0+bWlub3IgPT0gMCkgfHwKLQkgICAgISh2YXAgPSBmaW5kX2J5X21ham9yKHZwLT5tYWpvcikpKSB7CisJaWYgKHZwLT5tYWpvciA9PSAwICYmIHZwLT5taW5vciA9PSAwKQogCQlyZXR1cm4gbGRjX2Fib3J0KGxwKTsKLQl9IGVsc2UgewotCQlzdHJ1Y3QgbGRjX3BhY2tldCAqcDsKLQkJdW5zaWduZWQgbG9uZyBuZXdfdGFpbDsKIAotCQlwID0gaGFuZHNoYWtlX2NvbXBvc2VfY3RybChscCwgTERDX0lORk8sIExEQ19WRVJTLAorCXZhcCA9IGZpbmRfYnlfbWFqb3IodnAtPm1ham9yKTsKKwlpZiAoIXZhcCkKKwkJcmV0dXJuIGxkY19hYm9ydChscCk7CisKKwlwID0gaGFuZHNoYWtlX2NvbXBvc2VfY3RybChscCwgTERDX0lORk8sIExEQ19WRVJTLAogCQkJCQkgICB2YXAsIHNpemVvZigqdmFwKSwKIAkJCQkJICAgJm5ld190YWlsKTsKLQkJaWYgKHApCi0JCQlyZXR1cm4gc2VuZF90eF9wYWNrZXQobHAsIHAsIG5ld190YWlsKTsKLQkJZWxzZQotCQkJcmV0dXJuIGxkY19hYm9ydChscCk7Ci0JfQorCWlmICghcCkKKwkJcmV0dXJuIGxkY19hYm9ydChscCk7CisKKwlyZXR1cm4gc2VuZF90eF9wYWNrZXQobHAsIHAsIG5ld190YWlsKTsKIH0KIAogc3RhdGljIGludCBwcm9jZXNzX3ZlcnNpb24oc3RydWN0IGxkY19jaGFubmVsICpscCwKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL21kZXNjLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9tZGVzYy5jCmluZGV4IDNjNTM5YTYuLjNmNzlmMGMgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL21kZXNjLmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvbWRlc2MuYwpAQCAtNTM2LDI0ICs1MzYsMjQgQEAKIAogCXYgPSBtZGVzY19nZXRfcHJvcGVydHkoaHAsIHBuLCAiaG9zdGlkIiwgTlVMTCk7CiAJaWYgKHYpCi0JCXByaW50aygiUExBVEZPUk06IGhvc3RpZCBbJTA4bHhdXG4iLCAqdik7CisJCXByaW50aygiUExBVEZPUk06IGhvc3RpZCBbJTA4bGx4XVxuIiwgKnYpOwogCXYgPSBtZGVzY19nZXRfcHJvcGVydHkoaHAsIHBuLCAic2VyaWFsIyIsIE5VTEwpOwogCWlmICh2KQotCQlwcmludGsoIlBMQVRGT1JNOiBzZXJpYWwjIFslMDhseF1cbiIsICp2KTsKKwkJcHJpbnRrKCJQTEFURk9STTogc2VyaWFsIyBbJTA4bGx4XVxuIiwgKnYpOwogCXYgPSBtZGVzY19nZXRfcHJvcGVydHkoaHAsIHBuLCAic3RpY2stZnJlcXVlbmN5IiwgTlVMTCk7Ci0JcHJpbnRrKCJQTEFURk9STTogc3RpY2stZnJlcXVlbmN5IFslMDhseF1cbiIsICp2KTsKKwlwcmludGsoIlBMQVRGT1JNOiBzdGljay1mcmVxdWVuY3kgWyUwOGxseF1cbiIsICp2KTsKIAl2ID0gbWRlc2NfZ2V0X3Byb3BlcnR5KGhwLCBwbiwgIm1hYy1hZGRyZXNzIiwgTlVMTCk7CiAJaWYgKHYpCi0JCXByaW50aygiUExBVEZPUk06IG1hYy1hZGRyZXNzIFslbHhdXG4iLCAqdik7CisJCXByaW50aygiUExBVEZPUk06IG1hYy1hZGRyZXNzIFslbGx4XVxuIiwgKnYpOwogCXYgPSBtZGVzY19nZXRfcHJvcGVydHkoaHAsIHBuLCAid2F0Y2hkb2ctcmVzb2x1dGlvbiIsIE5VTEwpOwogCWlmICh2KQotCQlwcmludGsoIlBMQVRGT1JNOiB3YXRjaGRvZy1yZXNvbHV0aW9uIFslbHUgbXNdXG4iLCAqdik7CisJCXByaW50aygiUExBVEZPUk06IHdhdGNoZG9nLXJlc29sdXRpb24gWyVsbHUgbXNdXG4iLCAqdik7CiAJdiA9IG1kZXNjX2dldF9wcm9wZXJ0eShocCwgcG4sICJ3YXRjaGRvZy1tYXgtdGltZW91dCIsIE5VTEwpOwogCWlmICh2KQotCQlwcmludGsoIlBMQVRGT1JNOiB3YXRjaGRvZy1tYXgtdGltZW91dCBbJWx1IG1zXVxuIiwgKnYpOworCQlwcmludGsoIlBMQVRGT1JNOiB3YXRjaGRvZy1tYXgtdGltZW91dCBbJWxsdSBtc11cbiIsICp2KTsKIAl2ID0gbWRlc2NfZ2V0X3Byb3BlcnR5KGhwLCBwbiwgIm1heC1jcHVzIiwgTlVMTCk7CiAJaWYgKHYpCi0JCXByaW50aygiUExBVEZPUk06IG1heC1jcHVzIFslbHVdXG4iLCAqdik7CisJCXByaW50aygiUExBVEZPUk06IG1heC1jcHVzIFslbGx1XVxuIiwgKnYpOwogCiAjaWZkZWYgQ09ORklHX1NNUAogCXsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL211bGRpdi5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvbXVsZGl2LmMKaW5kZXggYmE5NjBjMC4uNmNlMTAyMSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvbXVsZGl2LmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvbXVsZGl2LmMKQEAgLTYwLDcgKzYwLDcgQEAKIH0KIAogI2RlZmluZSBmZXRjaF9yZWcocmVnLCByZWdzKSAoewkJCQkJCVwKLQlzdHJ1Y3QgcmVnX3dpbmRvdyBfX3VzZXIgKndpbjsJCQkJCVwKKwlzdHJ1Y3QgcmVnX3dpbmRvdzMyIF9fdXNlciAqd2luOwkJCQkJXAogCXJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgcmV0OwkJCQkJXAogCQkJCQkJCQkJXAogCWlmICghKHJlZykpIHJldCA9IDA7CQkJCQkJXApAQCAtNjgsNyArNjgsNyBAQAogCQlyZXQgPSByZWdzLT51X3JlZ3NbKHJlZyldOwkJCQlcCiAJfSBlbHNlIHsJCQkJCQkJXAogCQkvKiBIbyBodW0sIHRoZSBzbGlnaHRseSBjb21wbGljYXRlZCBjYXNlLiAqLwkJXAotCQl3aW4gPSAoc3RydWN0IHJlZ193aW5kb3cgX191c2VyICopcmVncy0+dV9yZWdzW1VSRUdfRlBdO1wKKwkJd2luID0gKHN0cnVjdCByZWdfd2luZG93MzIgX191c2VyICopcmVncy0+dV9yZWdzW1VSRUdfRlBdO1wKIAkJaWYgKGdldF91c2VyIChyZXQsICZ3aW4tPmxvY2Fsc1socmVnKSAtIDE2XSkpIHJldHVybiAtMTtcCiAJfQkJCQkJCQkJXAogCXJldDsJCQkJCQkJCVwKQEAgLTc3LDcgKzc3LDcgQEAKIHN0YXRpYyBpbmxpbmUgaW50CiBzdG9yZV9yZWcodW5zaWduZWQgaW50IHJlc3VsdCwgdW5zaWduZWQgaW50IHJlZywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7Ci0Jc3RydWN0IHJlZ193aW5kb3cgX191c2VyICp3aW47CisJc3RydWN0IHJlZ193aW5kb3czMiBfX3VzZXIgKndpbjsKIAogCWlmICghcmVnKQogCQlyZXR1cm4gMDsKQEAgLTg2LDcgKzg2LDcgQEAKIAkJcmV0dXJuIDA7CiAJfSBlbHNlIHsKIAkJLyogbmVlZCB0byB1c2UgcHV0X3VzZXIoKSBpbiB0aGlzIGNhc2U6ICovCi0JCXdpbiA9IChzdHJ1Y3QgcmVnX3dpbmRvdyBfX3VzZXIgKikgcmVncy0+dV9yZWdzW1VSRUdfRlBdOworCQl3aW4gPSAoc3RydWN0IHJlZ193aW5kb3czMiBfX3VzZXIgKikgcmVncy0+dV9yZWdzW1VSRUdfRlBdOwogCQlyZXR1cm4gKHB1dF91c2VyKHJlc3VsdCwgJndpbi0+bG9jYWxzW3JlZyAtIDE2XSkpOwogCX0KIH0KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL29mX2RldmljZV82NC5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvb2ZfZGV2aWNlXzY0LmMKaW5kZXggNDg3M2YyOC4uYjRhMTJjOSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvb2ZfZGV2aWNlXzY0LmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvb2ZfZGV2aWNlXzY0LmMKQEAgLTU1NCw3ICs1NTQsNyBAQAogCQltZW1zZXQociwgMCwgc2l6ZW9mKCpyKSk7CiAKIAkJaWYgKG9mX3Jlc291cmNlX3ZlcmJvc2UpCi0JCQlwcmludGsoIiVzIHJlZ1slZF0gLT4gJWx4XG4iLAorCQkJcHJpbnRrKCIlcyByZWdbJWRdIC0+ICVsbHhcbiIsCiAJCQkgICAgICAgb3AtPm5vZGUtPmZ1bGxfbmFtZSwgaW5kZXgsCiAJCQkgICAgICAgcmVzdWx0KTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvcGNpLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9wY2kuYwppbmRleCBiZGI3YzBhLi45MjNlOWJiIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9wY2kuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9wY2kuYwpAQCAtMjIzLDcgKzIyMyw3IEBACiAJCQljb250aW51ZTsKIAkJaSA9IGFkZHJzWzBdICYgMHhmZjsKIAkJaWYgKG9mcGNpX3ZlcmJvc2UpCi0JCQlwcmludGsoIiAgc3RhcnQ6ICVseCwgZW5kOiAlbHgsIGk6ICV4XG4iLAorCQkJcHJpbnRrKCIgIHN0YXJ0OiAlbGx4LCBlbmQ6ICVsbHgsIGk6ICV4XG4iLAogCQkJICAgICAgIG9wX3Jlcy0+c3RhcnQsIG9wX3Jlcy0+ZW5kLCBpKTsKIAogCQlpZiAoUENJX0JBU0VfQUREUkVTU18wIDw9IGkgJiYgaSA8PSBQQ0lfQkFTRV9BRERSRVNTXzUpIHsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL3BjaV9jb21tb24uYyBiL2FyY2gvc3BhcmMva2VybmVsL3BjaV9jb21tb24uYwppbmRleCAyM2I4ODA4Li42NGU2ZWRmIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9wY2lfY29tbW9uLmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvcGNpX2NvbW1vbi5jCkBAIC00NTcsNyArNDU3LDcgQEAKIAkJcHJvbV9oYWx0KCk7CiAJfQogCi0JcHJpbnRrKCIlczogUENJIElPWyVseF0gTUVNWyVseF1cbiIsCisJcHJpbnRrKCIlczogUENJIElPWyVsbHhdIE1FTVslbGx4XVxuIiwKIAkgICAgICAgcGJtLT5uYW1lLAogCSAgICAgICBwYm0tPmlvX3NwYWNlLnN0YXJ0LAogCSAgICAgICBwYm0tPm1lbV9zcGFjZS5zdGFydCk7CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9wY2lfbXNpLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9wY2lfbXNpLmMKaW5kZXggNGVmMjgyZS4uZjFiZTM3YSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvcGNpX21zaS5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL3BjaV9tc2kuYwpAQCAtNDI2LDggKzQyNiw4IEBACiAJCSAgICAgICBwYm0tPm5hbWUsCiAJCSAgICAgICBwYm0tPm1zaV9maXJzdCwgcGJtLT5tc2lfbnVtLCBwYm0tPm1zaV9kYXRhX21hc2ssCiAJCSAgICAgICBwYm0tPm1zaXhfZGF0YV93aWR0aCk7Ci0JCXByaW50ayhLRVJOX0lORk8gIiVzOiBNU0kgYWRkcjMyWzB4JWx4OjB4JXhdICIKLQkJICAgICAgICJhZGRyNjRbMHglbHg6MHgleF1cbiIsCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBNU0kgYWRkcjMyWzB4JWxseDoweCV4XSAiCisJCSAgICAgICAiYWRkcjY0WzB4JWxseDoweCV4XVxuIiwKIAkJICAgICAgIHBibS0+bmFtZSwKIAkJICAgICAgIHBibS0+bXNpMzJfc3RhcnQsIHBibS0+bXNpMzJfbGVuLAogCQkgICAgICAgcGJtLT5tc2k2NF9zdGFydCwgcGJtLT5tc2k2NF9sZW4pOwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvcGNpX3BzeWNoby5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvcGNpX3BzeWNoby5jCmluZGV4IGRmYjNlYzguLjNiMzQzNDQgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL3BjaV9wc3ljaG8uYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9wY2lfcHN5Y2hvLmMKQEAgLTMwNywxMCArMzA3LDcgQEAKIAogCS8qIFdlIHJlYWxseSBtZWFuIHRvIGlnbm9yZSB0aGUgcmV0dXJuIHJlc3VsdCBoZXJlLiAgVHdvCiAJICogUENJIGNvbnRyb2xsZXIgc2hhcmUgdGhlIHNhbWUgaW50ZXJydXB0IG51bWJlcnMgYW5kCi0JICogZHJpdmUgdGhlIHNhbWUgZnJvbnQtZW5kIGhhcmR3YXJlLiAgV2hpY2hldmVyIG9mIHRoZQotCSAqIHR3byBnZXQgaW4gaGVyZSBmaXJzdCB3aWxsIHJlZ2lzdGVyIHRoZSBJUlEgaGFuZGxlcgotCSAqIHRoZSBzZWNvbmQgd2lsbCBqdXN0IGVycm9yIG91dCBzaW5jZSB3ZSBkbyBub3QgcGFzcyBpbgotCSAqIElSUUZfU0hBUkVELgorCSAqIGRyaXZlIHRoZSBzYW1lIGZyb250LWVuZCBoYXJkd2FyZS4KIAkgKi8KIAllcnIgPSByZXF1ZXN0X2lycShvcC0+aXJxc1sxXSwgcHN5Y2hvX3VlX2ludHIsIElSUUZfU0hBUkVELAogCQkJICAiUFNZQ0hPX1VFIiwgcGJtKTsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL3BjaV9zY2hpem8uYyBiL2FyY2gvc3BhcmMva2VybmVsL3BjaV9zY2hpem8uYwppbmRleCA0NWQ5ZGJhLi4yYjVjZGRlIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9wY2lfc2NoaXpvLmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvcGNpX3NjaGl6by5jCkBAIC03OTQsNyArNzk0LDcgQEAKIAkJICAgcGJtLT5jb250cm9sbGVyX3JlZ3MgKyBTQ0hJWk9fU0FGQVJJX0VSUkxPRyk7CiAKIAlpZiAoIShlcnJsb2cgJiBCVVNfRVJST1JfVU5NQVApKSB7Ci0JCXByaW50aygiJXM6IFVuZXhwZWN0ZWQgU2FmYXJpL0pCVVMgZXJyb3IgaW50ZXJydXB0LCBlcnJsb2dbJTAxNmx4XVxuIiwKKwkJcHJpbnRrKCIlczogVW5leHBlY3RlZCBTYWZhcmkvSkJVUyBlcnJvciBpbnRlcnJ1cHQsIGVycmxvZ1slMDE2bGx4XVxuIiwKIAkJICAgICAgIHBibS0+bmFtZSwgZXJybG9nKTsKIAogCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9wY2lfc3VuNHYuYyBiL2FyY2gvc3BhcmMva2VybmVsL3BjaV9zdW40di5jCmluZGV4IDM0YTFmZGUuLjBlZjBhYjMgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL3BjaV9zdW40di5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL3BjaV9zdW40di5jCkBAIC03Myw3ICs3Myw3IEBACiAJCWlmICh1bmxpa2VseShudW0gPCAwKSkgewogCQkJaWYgKHByaW50a19yYXRlbGltaXQoKSkKIAkJCQlwcmludGsoImlvbW11X2JhdGNoX2ZsdXNoOiBJT01NVSBtYXAgb2YgIgotCQkJCSAgICAgICAiWyUwOGx4OiUwOGx4OiVseDolbHg6JWx4XSBmYWlsZWQgd2l0aCAiCisJCQkJICAgICAgICJbJTA4bHg6JTA4bGx4OiVseDolbHg6JWx4XSBmYWlsZWQgd2l0aCAiCiAJCQkJICAgICAgICJzdGF0dXMgJWxkXG4iLAogCQkJCSAgICAgICBkZXZoYW5kbGUsIEhWX1BDSV9UU0JJRCgwLCBlbnRyeSksCiAJCQkJICAgICAgIG5wYWdlcywgcHJvdCwgX19wYShwZ2xpc3QpLCBudW0pOwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvcG93ZXIuYyBiL2FyY2gvc3BhcmMva2VybmVsL3Bvd2VyLmMKaW5kZXggMDc2Y2FkNy4uYWU4OGYwNiAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvcG93ZXIuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9wb3dlci5jCkBAIC00MCw3ICs0MCw3IEBACiAKIAlwb3dlcl9yZWcgPSBvZl9pb3JlbWFwKHJlcywgMCwgMHg0LCAicG93ZXIiKTsKIAotCXByaW50ayhLRVJOX0lORk8gIiVzOiBDb250cm9sIHJlZyBhdCAlbHhcbiIsCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IENvbnRyb2wgcmVnIGF0ICVsbHhcbiIsCiAJICAgICAgIG9wLT5ub2RlLT5uYW1lLCByZXMtPnN0YXJ0KTsKIAogCWlmIChoYXNfYnV0dG9uX2ludGVycnVwdChpcnEsIG9wLT5ub2RlKSkgewpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvcHJvY2Vzc18zMi5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvcHJvY2Vzc18zMi5jCmluZGV4IDY5ZDkzMTUuLjVhOGQ4Y2UgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL3Byb2Nlc3NfMzIuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9wcm9jZXNzXzMyLmMKQEAgLTE4MCwxMyArMTgwLDEzIEBACiAKIHZvaWQgX19zaG93X2JhY2t0cmFjZSh1bnNpZ25lZCBsb25nIGZwKQogewotCXN0cnVjdCByZWdfd2luZG93ICpydzsKKwlzdHJ1Y3QgcmVnX3dpbmRvdzMyICpydzsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmc3BhcmNfYmFja3RyYWNlX2xvY2ssIGZsYWdzKTsKIAotCXJ3ID0gKHN0cnVjdCByZWdfd2luZG93ICopZnA7CisJcncgPSAoc3RydWN0IHJlZ193aW5kb3czMiAqKWZwOwogICAgICAgICB3aGlsZShydyAmJiAoKCh1bnNpZ25lZCBsb25nKSBydykgPj0gUEFHRV9PRkZTRVQpICYmCiAgICAgICAgICAgICAhKCgodW5zaWduZWQgbG9uZykgcncpICYgMHg3KSkgewogCQlwcmludGsoIkNQVVslZF06IEFSR1NbJTA4bHgsJTA4bHgsJTA4bHgsJTA4bHgsJTA4bHgsJTA4bHhdICIKQEAgLTE5Niw3ICsxOTYsNyBAQAogCQkgICAgICAgcnctPmluc1s2XSwKIAkJICAgICAgIHJ3LT5pbnNbN10pOwogCQlwcmludGsoIiVwU1xuIiwgKHZvaWQgKikgcnctPmluc1s3XSk7Ci0JCXJ3ID0gKHN0cnVjdCByZWdfd2luZG93ICopIHJ3LT5pbnNbNl07CisJCXJ3ID0gKHN0cnVjdCByZWdfd2luZG93MzIgKikgcnctPmluc1s2XTsKIAl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3BhcmNfYmFja3RyYWNlX2xvY2ssIGZsYWdzKTsKIH0KQEAgLTI1OCw3ICsyNTgsNyBAQAogCiB2b2lkIHNob3dfcmVncyhzdHJ1Y3QgcHRfcmVncyAqcikKIHsKLQlzdHJ1Y3QgcmVnX3dpbmRvdyAqcncgPSAoc3RydWN0IHJlZ193aW5kb3cgKikgci0+dV9yZWdzWzE0XTsKKwlzdHJ1Y3QgcmVnX3dpbmRvdzMyICpydyA9IChzdHJ1Y3QgcmVnX3dpbmRvdzMyICopIHItPnVfcmVnc1sxNF07CiAKICAgICAgICAgcHJpbnRrKCJQU1I6ICUwOGx4IFBDOiAlMDhseCBOUEM6ICUwOGx4IFk6ICUwOGx4ICAgICVzXG4iLAogCSAgICAgICByLT5wc3IsIHItPnBjLCByLT5ucGMsIHItPnksIHByaW50X3RhaW50ZWQoKSk7CkBAIC0yODcsNyArMjg3LDcgQEAKIHsKIAl1bnNpZ25lZCBsb25nIHBjLCBmcDsKIAl1bnNpZ25lZCBsb25nIHRhc2tfYmFzZTsKLQlzdHJ1Y3QgcmVnX3dpbmRvdyAqcnc7CisJc3RydWN0IHJlZ193aW5kb3czMiAqcnc7CiAJaW50IGNvdW50ID0gMDsKIAogCWlmICh0c2sgIT0gTlVMTCkKQEAgLTMwMSw3ICszMDEsNyBAQAogCQlpZiAoZnAgPCAodGFza19iYXNlICsgc2l6ZW9mKHN0cnVjdCB0aHJlYWRfaW5mbykpIHx8CiAJCSAgICBmcCA+PSAodGFza19iYXNlICsgKFBBR0VfU0laRSA8PCAxKSkpCiAJCQlicmVhazsKLQkJcncgPSAoc3RydWN0IHJlZ193aW5kb3cgKikgZnA7CisJCXJ3ID0gKHN0cnVjdCByZWdfd2luZG93MzIgKikgZnA7CiAJCXBjID0gcnctPmluc1s3XTsKIAkJcHJpbnRrKCJbJTA4bHggOiAiLCBwYyk7CiAJCXByaW50aygiJXBTIF0gIiwgKHZvaWQgKikgcGMpOwpAQCAtNjc5LDcgKzY3OSw3IEBACiAJdW5zaWduZWQgbG9uZyBwYywgZnAsIGJpYXMgPSAwOwogCXVuc2lnbmVkIGxvbmcgdGFza19iYXNlID0gKHVuc2lnbmVkIGxvbmcpIHRhc2s7CiAgICAgICAgIHVuc2lnbmVkIGxvbmcgcmV0ID0gMDsKLQlzdHJ1Y3QgcmVnX3dpbmRvdyAqcnc7CisJc3RydWN0IHJlZ193aW5kb3czMiAqcnc7CiAJaW50IGNvdW50ID0gMDsKIAogCWlmICghdGFzayB8fCB0YXNrID09IGN1cnJlbnQgfHwKQEAgLTY5Miw3ICs2OTIsNyBAQAogCQlpZiAoZnAgPCAodGFza19iYXNlICsgc2l6ZW9mKHN0cnVjdCB0aHJlYWRfaW5mbykpIHx8CiAJCSAgICBmcCA+PSAodGFza19iYXNlICsgKDIgKiBQQUdFX1NJWkUpKSkKIAkJCWJyZWFrOwotCQlydyA9IChzdHJ1Y3QgcmVnX3dpbmRvdyAqKSBmcDsKKwkJcncgPSAoc3RydWN0IHJlZ193aW5kb3czMiAqKSBmcDsKIAkJcGMgPSBydy0+aW5zWzddOwogCQlpZiAoIWluX3NjaGVkX2Z1bmN0aW9ucyhwYykpIHsKIAkJCXJldCA9IHBjOwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvcHJvbV9jb21tb24uYyBiL2FyY2gvc3BhcmMva2VybmVsL3Byb21fY29tbW9uLmMKaW5kZXggNGU5YWY1OS4uZmY3YjU5MSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvcHJvbV9jb21tb24uYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9wcm9tX2NvbW1vbi5jCkBAIC0xNTUsMjAgKzE1NSwxMiBAQAogCQlwLT52YWx1ZSA9IHByb21fZWFybHlfYWxsb2Moc3BlY2lhbF9sZW4pOwogCQltZW1jcHkocC0+dmFsdWUsIHNwZWNpYWxfdmFsLCBzcGVjaWFsX2xlbik7CiAJfSBlbHNlIHsKLSNpZmRlZiBDT05GSUdfU1BBUkMzMgogCQlpZiAocHJldiA9PSBOVUxMKSB7Ci0JCQluYW1lID0gcHJvbV9maXJzdHByb3Aobm9kZSwgTlVMTCk7CisJCQluYW1lID0gcHJvbV9maXJzdHByb3Aobm9kZSwgcC0+bmFtZSk7CiAJCX0gZWxzZSB7Ci0JCQluYW1lID0gcHJvbV9uZXh0cHJvcChub2RlLCBwcmV2LCBOVUxMKTsKKwkJCW5hbWUgPSBwcm9tX25leHRwcm9wKG5vZGUsIHByZXYsIHAtPm5hbWUpOwogCQl9Ci0jZWxzZQotCQlpZiAocHJldiA9PSBOVUxMKSB7Ci0JCQlwcm9tX2ZpcnN0cHJvcChub2RlLCBwLT5uYW1lKTsKLQkJfSBlbHNlIHsKLQkJCXByb21fbmV4dHByb3Aobm9kZSwgcHJldiwgcC0+bmFtZSk7Ci0JCX0KLQkJbmFtZSA9IHAtPm5hbWU7Ci0jZW5kaWYKKwogCQlpZiAoc3RybGVuKG5hbWUpID09IDApIHsKIAkJCXRtcCA9IHA7CiAJCQlyZXR1cm4gTlVMTDsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL3Byb21faXJxdHJhbnMuYyBiL2FyY2gvc3BhcmMva2VybmVsL3Byb21faXJxdHJhbnMuYwppbmRleCA5Njk1OGM0Li41NzAyYWQ0IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9wcm9tX2lycXRyYW5zLmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvcHJvbV9pcnF0cmFucy5jCkBAIC0zNDYsNyArMzQ2LDcgQEAKIAkJCWJyZWFrOwogCX0KIAlpZiAobGltaXQgPD0gMCkgewotCQlwcmludGsoInRvbWF0aWxsb193c3luY19oYW5kbGVyOiBETUEgd29uJ3Qgc3luYyBbJWx4OiVseF1cbiIsCisJCXByaW50aygidG9tYXRpbGxvX3dzeW5jX2hhbmRsZXI6IERNQSB3b24ndCBzeW5jIFslbGx4OiVsbHhdXG4iLAogCQkgICAgICAgdmFsLCBtYXNrKTsKIAl9CiAKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL3BzeWNob19jb21tb24uYyBiL2FyY2gvc3BhcmMva2VybmVsL3BzeWNob19jb21tb24uYwppbmRleCA3OTA5OTY0Li40MDY4OWFlIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9wc3ljaG9fY29tbW9uLmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvcHN5Y2hvX2NvbW1vbi5jCkBAIC05NCw3ICs5NCw3IEBACiAJCWlmIChzYXdfZXJyb3IgIT0gMCkgewogCQkJdTY0IHRhZ3ZhbCA9IHN0Y190YWdfYnVmW2ldOwogCQkJdTY0IGxpbmV2YWwgPSBzdGNfbGluZV9idWZbaV07Ci0JCQlwcmludGsoS0VSTl9FUlIgIiVzOiBTVENfVEFHKCVkKVtQQSglMDE2bHgpVkEoJTA4bHgpIgorCQkJcHJpbnRrKEtFUk5fRVJSICIlczogU1RDX1RBRyglZClbUEEoJTAxNmxseClWQSglMDhsbHgpIgogCQkJICAgICAgICJWKCVkKVcoJWQpXVxuIiwKIAkJCSAgICAgICBwYm0tPm5hbWUsCiAJCQkgICAgICAgaSwKQEAgLTEwMiw4ICsxMDIsOCBAQAogCQkJICAgICAgICh0YWd2YWwgJiBQU1lDSE9fU1RDVEFHX1ZQTiksCiAJCQkgICAgICAgKCh0YWd2YWwgJiBQU1lDSE9fU1RDVEFHX1ZBTElEKSA/IDEgOiAwKSwKIAkJCSAgICAgICAoKHRhZ3ZhbCAmIFBTWUNIT19TVENUQUdfV1JJVEUpID8gMSA6IDApKTsKLQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IFNUQ19MSU5FKCVkKVtMSURYKCVseClTUCglbHgpIgotCQkJICAgICAgICJMQUREUiglbHgpRVAoJWx4KVYoJWQpRk9GTiglZCldXG4iLAorCQkJcHJpbnRrKEtFUk5fRVJSICIlczogU1RDX0xJTkUoJWQpW0xJRFgoJWxseClTUCglbGx4KSIKKwkJCSAgICAgICAiTEFERFIoJWxseClFUCglbGx4KVYoJWQpRk9GTiglZCldXG4iLAogCQkJICAgICAgIHBibS0+bmFtZSwKIAkJCSAgICAgICBpLAogCQkJICAgICAgICgobGluZXZhbCAmIFBTWUNIT19TVENMSU5FX0xJTkRYKSA+PiAyMVVMKSwKQEAgLTE3OSwxNCArMTc5LDE0IEBACiAJCX0KIAogCQlwcmludGsoS0VSTl9FUlIgIiVzOiBJT01NVSBUQUcoJWQpW2Vycm9yKCVzKSB3ciglZCkgIgotCQkgICAgICAgInN0ciglZCkgc3ooJWRLKSB2cGcoJTA4bHgpXVxuIiwKKwkJICAgICAgICJzdHIoJWQpIHN6KCVkSykgdnBnKCUwOGxseCldXG4iLAogCQkgICAgICAgcGJtLT5uYW1lLCBpLCB0eXBlX3N0ciwKIAkJICAgICAgICgodGFnX3ZhbCAmIFBTWUNIT19JT01NVV9UQUdfV1JJVEUpID8gMSA6IDApLAogCQkgICAgICAgKCh0YWdfdmFsICYgUFNZQ0hPX0lPTU1VX1RBR19TVFJFQU0pID8gMSA6IDApLAogCQkgICAgICAgKCh0YWdfdmFsICYgUFNZQ0hPX0lPTU1VX1RBR19TSVpFKSA/IDY0IDogOCksCiAJCSAgICAgICAodGFnX3ZhbCAmIFBTWUNIT19JT01NVV9UQUdfVlBBR0UpIDw8IElPTU1VX1BBR0VfU0hJRlQpOwogCQlwcmludGsoS0VSTl9FUlIgIiVzOiBJT01NVSBEQVRBKCVkKVt2YWxpZCglZCkgY2FjaGUoJWQpICIKLQkJICAgICAgICJwcGcoJTAxNmx4KV1cbiIsCisJCSAgICAgICAicHBnKCUwMTZsbHgpXVxuIiwKIAkJICAgICAgIHBibS0+bmFtZSwgaSwKIAkJICAgICAgICgoZGF0YV92YWwgJiBQU1lDSE9fSU9NTVVfREFUQV9WQUxJRCkgPyAxIDogMCksCiAJCSAgICAgICAoKGRhdGFfdmFsICYgUFNZQ0hPX0lPTU1VX0RBVEFfQ0FDSEUpID8gMSA6IDApLApAQCAtMzI2LDEyICszMjYsMTIgQEAKIAkJICAgIkV4Y2Vzc2l2ZSBSZXRyaWVzIiA6CiAJCSAgICgoZXJyb3JfYml0cyAmIFBTWUNIT19QQ0lBRlNSX1BQRVJSKSA/CiAJCSAgICAiUGFyaXR5IEVycm9yIiA6ICI/Pz8iKSkpKSkpOwotCXByaW50ayhLRVJOX0VSUiAiJXM6IGJ5dGVtYXNrWyUwNGx4XSBVUEFfTUlEWyUwMmx4XSB3YXNfYmxvY2soJWQpXG4iLAorCXByaW50ayhLRVJOX0VSUiAiJXM6IGJ5dGVtYXNrWyUwNGxseF0gVVBBX01JRFslMDJsbHhdIHdhc19ibG9jayglZClcbiIsCiAJICAgICAgIHBibS0+bmFtZSwKIAkgICAgICAgKGFmc3IgJiBQU1lDSE9fUENJQUZTUl9CTVNLKSA+PiAzMlVMLAogCSAgICAgICAoYWZzciAmIFBTWUNIT19QQ0lBRlNSX01JRCkgPj4gMjVVTCwKIAkgICAgICAgKGFmc3IgJiBQU1lDSE9fUENJQUZTUl9CTEspID8gMSA6IDApOwotCXByaW50ayhLRVJOX0VSUiAiJXM6IFBDSSBBRkFSIFslMDE2bHhdXG4iLCBwYm0tPm5hbWUsIGFmYXIpOworCXByaW50ayhLRVJOX0VSUiAiJXM6IFBDSSBBRkFSIFslMDE2bGx4XVxuIiwgcGJtLT5uYW1lLCBhZmFyKTsKIAlwcmludGsoS0VSTl9FUlIgIiVzOiBQQ0kgU2Vjb25kYXJ5IGVycm9ycyBbIiwgcGJtLT5uYW1lKTsKIAlyZXBvcnRlZCA9IDA7CiAJaWYgKGFmc3IgJiBQU1lDSE9fUENJQUZTUl9TTUEpIHsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL3NpZ25hbF8zMi5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvc2lnbmFsXzMyLmMKaW5kZXggYzk0ZjkxYy4uMTgxZDA2OSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvc2lnbmFsXzMyLmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvc2lnbmFsXzMyLmMKQEAgLTM0LDcgKzM0LDcgQEAKIAogc3RydWN0IHNpZ25hbF9mcmFtZSB7CiAJc3RydWN0IHNwYXJjX3N0YWNrZglzczsKLQlfX3NpZ2luZm9fdAkJaW5mbzsKKwlfX3NpZ2luZm8zMl90CQlpbmZvOwogCV9fc2lnaW5mb19mcHVfdCBfX3VzZXIJKmZwdV9zYXZlOwogCXVuc2lnbmVkIGxvbmcJCWluc25zWzJdIF9fYXR0cmlidXRlX18gKChhbGlnbmVkICg4KSkpOwogCXVuc2lnbmVkIGludAkJZXh0cmFtYXNrW19OU0lHX1dPUkRTIC0gMV07CkBAIC0zNTEsNyArMzUxLDcgQEAKIAllcnIgfD0gX19jb3B5X3RvX3VzZXIoc2YtPmV4dHJhbWFzaywgJm9sZHNldC0+c2lnWzFdLAogCQkJICAgICAgKF9OU0lHX1dPUkRTIC0gMSkgKiBzaXplb2YodW5zaWduZWQgaW50KSk7CiAJZXJyIHw9IF9fY29weV90b191c2VyKHNmLCAoY2hhciAqKSByZWdzLT51X3JlZ3NbVVJFR19GUF0sCi0JCQkgICAgICBzaXplb2Yoc3RydWN0IHJlZ193aW5kb3cpKTsKKwkJCSAgICAgIHNpemVvZihzdHJ1Y3QgcmVnX3dpbmRvdzMyKSk7CiAJaWYgKGVycikKIAkJZ290byBzaWdzZWd2OwogCQpAQCAtNDMzLDcgKzQzMyw3IEBACiAJZXJyIHw9IF9fcHV0X3VzZXIoY3VycmVudC0+c2FzX3NzX3NpemUsICZzZi0+c3RhY2suc3Nfc2l6ZSk7CiAJCiAJZXJyIHw9IF9fY29weV90b191c2VyKHNmLCAoY2hhciAqKSByZWdzLT51X3JlZ3NbVVJFR19GUF0sCi0JCQkgICAgICBzaXplb2Yoc3RydWN0IHJlZ193aW5kb3cpKTsJCisJCQkgICAgICBzaXplb2Yoc3RydWN0IHJlZ193aW5kb3czMikpOwogCiAJZXJyIHw9IGNvcHlfc2lnaW5mb190b191c2VyKCZzZi0+aW5mbywgaW5mbyk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL3NtcF82NC5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvc21wXzY0LmMKaW5kZXggNDYzMjk3OS4uNmNkMWE1YiAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvc21wXzY0LmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvc21wXzY0LmMKQEAgLTQ0OSw3ICs0NDksNyBAQAogCV9fYXNtX18gX192b2xhdGlsZV9fKCJ3cnByICUwLCAweDAsICUlcHN0YXRlIgogCQkJICAgICA6IDogInIiIChwc3RhdGUpKTsKIAlpZiAoc3R1Y2sgPT0gMCkgewotCQlwcmludGsoIkNQVVslZF06IG1vbmRvIHN0dWNrYWdlIHJlc3VsdFslMDE2bHhdXG4iLAorCQlwcmludGsoIkNQVVslZF06IG1vbmRvIHN0dWNrYWdlIHJlc3VsdFslMDE2bGx4XVxuIiwKIAkJICAgICAgIHNtcF9wcm9jZXNzb3JfaWQoKSwgcmVzdWx0KTsKIAl9IGVsc2UgewogCQl1ZGVsYXkoMik7CkBAIC01ODQsNyArNTg0LDcgQEAKIAkJCS8qIEJ1c3kgYml0cyB3aWxsIG5vdCBjbGVhciwgY29udGludWUgaW5zdGVhZAogCQkJICogb2YgZnJlZXppbmcgdXAgb24gdGhpcyBjcHUuCiAJCQkgKi8KLQkJCXByaW50aygiQ1BVWyVkXTogbW9uZG8gc3R1Y2thZ2UgcmVzdWx0WyUwMTZseF1cbiIsCisJCQlwcmludGsoIkNQVVslZF06IG1vbmRvIHN0dWNrYWdlIHJlc3VsdFslMDE2bGx4XVxuIiwKIAkJCSAgICAgICBzbXBfcHJvY2Vzc29yX2lkKCksIGRpc3BhdGNoX3N0YXQpOwogCQl9IGVsc2UgewogCQkJaW50IGksIHRoaXNfYnVzeV9uYWNrID0gMDsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL3N1bjRtX3NtcC5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvc3VuNG1fc21wLmMKaW5kZXggNGY4ZDYwNS4uODA0MDM3NiAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvc3VuNG1fc21wLmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvc3VuNG1fc21wLmMKQEAgLTU0LDcgKzU0LDggQEAKICNkZWZpbmUgU01QX1BSSU5USyh4KQogI2VuZGlmCiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBzd2FwKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKnB0ciwgdW5zaWduZWQgbG9uZyB2YWwpCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcKK3N3YXBfdWxvbmcodm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqcHRyLCB1bnNpZ25lZCBsb25nIHZhbCkKIHsKIAlfX2FzbV9fIF9fdm9sYXRpbGVfXygic3dhcCBbJTFdLCAlMFxuXHQiIDoKIAkJCSAgICAgIj0mciIgKHZhbCksICI9JnIiIChwdHIpIDoKQEAgLTkwLDcgKzkxLDcgQEAKIAkgKiB0byBjYWxsIHRoZSBzY2hlZHVsZXIgY29kZS4KIAkgKi8KIAkvKiBBbGxvdyBtYXN0ZXIgdG8gY29udGludWUuICovCi0Jc3dhcCgmY3B1X2NhbGxpbl9tYXBbY3B1aWRdLCAxKTsKKwlzd2FwX3Vsb25nKCZjcHVfY2FsbGluX21hcFtjcHVpZF0sIDEpOwogCiAJLyogWFhYOiBXaGF0J3MgdXAgd2l0aCBhbGwgdGhlIGZsdXNoZXM/ICovCiAJbG9jYWxfZmx1c2hfY2FjaGVfYWxsKCk7CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC90aW1lXzY0LmMgYi9hcmNoL3NwYXJjL2tlcm5lbC90aW1lXzY0LmMKaW5kZXggOWRmOGYwOS4uNTQ0MDVkMyAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvdGltZV82NC5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL3RpbWVfNjQuYwpAQCAtMTA2LDcgKzEwNiw3IEBACiAJdGlja19kaXNhYmxlX2lycSgpOwogfQogCi1zdGF0aWMgdW5zaWduZWQgbG9uZyB0aWNrX2dldF90aWNrKHZvaWQpCitzdGF0aWMgdW5zaWduZWQgbG9uZyBsb25nIHRpY2tfZ2V0X3RpY2sodm9pZCkKIHsKIAl1bnNpZ25lZCBsb25nIHJldDsKIApAQCAtMjA4LDcgKzIwOCw3IEBACiAJc3RpY2tfZGlzYWJsZV9pcnEoKTsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGxvbmcgc3RpY2tfZ2V0X3RpY2sodm9pZCkKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGxvbmcgc3RpY2tfZ2V0X3RpY2sodm9pZCkKIHsKIAl1bnNpZ25lZCBsb25nIHJldDsKIApAQCAtMzUyLDcgKzM1Miw3IEBACiAJaGJ0aWNrX2Rpc2FibGVfaXJxKCk7CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGhidGlja19nZXRfdGljayh2b2lkKQorc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9uZyBoYnRpY2tfZ2V0X3RpY2sodm9pZCkKIHsKIAlyZXR1cm4gX19oYmlyZF9yZWFkX3N0aWNrKCkgJiB+VElDS19QUklWX0JJVDsKIH0KQEAgLTQyMiw3ICs0MjIsNyBAQAogewogCXN0cnVjdCByZXNvdXJjZSAqcjsKIAotCXByaW50ayhLRVJOX0lORk8gIiVzOiBSVEMgcmVncyBhdCAweCVseFxuIiwKKwlwcmludGsoS0VSTl9JTkZPICIlczogUlRDIHJlZ3MgYXQgMHglbGx4XG4iLAogCSAgICAgICBvcC0+bm9kZS0+ZnVsbF9uYW1lLCBvcC0+cmVzb3VyY2VbMF0uc3RhcnQpOwogCiAJLyogVGhlIENNT1MgUlRDIGRyaXZlciBvbmx5IGFjY2VwdHMgSU9SRVNPVVJDRV9JTywgc28gY29ucwpAQCAtNDc4LDcgKzQ3OCw3IEBACiBzdGF0aWMgaW50IF9fZGV2aW5pdCBicTQ4MDJfcHJvYmUoc3RydWN0IG9mX2RldmljZSAqb3AsIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoKQogewogCi0JcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEJRNDgwMiByZWdzIGF0IDB4JWx4XG4iLAorCXByaW50ayhLRVJOX0lORk8gIiVzOiBCUTQ4MDIgcmVncyBhdCAweCVsbHhcbiIsCiAJICAgICAgIG9wLT5ub2RlLT5mdWxsX25hbWUsIG9wLT5yZXNvdXJjZVswXS5zdGFydCk7CiAKIAlydGNfYnE0ODAyX2RldmljZS5yZXNvdXJjZSA9ICZvcC0+cmVzb3VyY2VbMF07CkBAIC01NDIsNyArNTQyLDcgQEAKIAkgICAgc3RyY21wKGRwLT5wYXJlbnQtPnBhcmVudC0+bmFtZSwgImNlbnRyYWwiKSAhPSAwKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCXByaW50ayhLRVJOX0lORk8gIiVzOiBNb3N0ZWsgcmVncyBhdCAweCVseFxuIiwKKwlwcmludGsoS0VSTl9JTkZPICIlczogTW9zdGVrIHJlZ3MgYXQgMHglbGx4XG4iLAogCSAgICAgICBkcC0+ZnVsbF9uYW1lLCBvcC0+cmVzb3VyY2VbMF0uc3RhcnQpOwogCiAJbTQ4dDU5X3J0Yy5yZXNvdXJjZSA9ICZvcC0+cmVzb3VyY2VbMF07CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC90cmFwc18zMi5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvdHJhcHNfMzIuYwppbmRleCA3MTZmMzk0Li4yMTM2NDViIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC90cmFwc18zMi5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL3RyYXBzXzMyLmMKQEAgLTY3LDcgKzY3LDcgQEAKIAlfX1JFU1RPUkU7IF9fUkVTVE9SRTsgX19SRVNUT1JFOyBfX1JFU1RPUkU7CiAKIAl7Ci0JCXN0cnVjdCByZWdfd2luZG93ICpydyA9IChzdHJ1Y3QgcmVnX3dpbmRvdyAqKXJlZ3MtPnVfcmVnc1tVUkVHX0ZQXTsKKwkJc3RydWN0IHJlZ193aW5kb3czMiAqcncgPSAoc3RydWN0IHJlZ193aW5kb3czMiAqKXJlZ3MtPnVfcmVnc1tVUkVHX0ZQXTsKIAogCQkvKiBTdG9wIHRoZSBiYWNrIHRyYWNlIHdoZW4gd2UgaGl0IHVzZXJsYW5kIG9yIHdlCiAJCSAqIGZpbmQgc29tZSBiYWRseSBhbGlnbmVkIGtlcm5lbCBzdGFjay4gU2V0IGFuIHVwcGVyCkBAIC03OSw3ICs3OSw3IEBACiAJCSAgICAgICEoKCh1bnNpZ25lZCBsb25nKSBydykgJiAweDcpKSB7CiAJCQlwcmludGsoIkNhbGxlclslMDhseF06ICVwU1xuIiwgcnctPmluc1s3XSwKIAkJCSAgICAgICAodm9pZCAqKSBydy0+aW5zWzddKTsKLQkJCXJ3ID0gKHN0cnVjdCByZWdfd2luZG93ICopcnctPmluc1s2XTsKKwkJCXJ3ID0gKHN0cnVjdCByZWdfd2luZG93MzIgKilydy0+aW5zWzZdOwogCQl9CiAJfQogCXByaW50aygiSW5zdHJ1Y3Rpb24gRFVNUDoiKTsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL3RyYXBzXzY0LmMgYi9hcmNoL3NwYXJjL2tlcm5lbC90cmFwc182NC5jCmluZGV4IDQ2MzhhZjIuLmJjYTNiNGUgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL3RyYXBzXzY0LmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvdHJhcHNfNjQuYwpAQCAtMTE2OCwyMCArMTE2OCwyMCBAQAogCX0KIAogCS8qIE5vdyBkdW1wIHRoZSBjYWNoZSBzbmFwc2hvdHMuICovCi0JcHJpbnRrKCIlcyIgIkVSUk9SKCVkKTogRC1jYWNoZSBpZHhbJXhdIHRhZ1slMDE2bHhdIHV0YWdbJTAxNmx4XSBzdGFnWyUwMTZseF1cbiIsCisJcHJpbnRrKCIlcyIgIkVSUk9SKCVkKTogRC1jYWNoZSBpZHhbJXhdIHRhZ1slMDE2bGx4XSB1dGFnWyUwMTZsbHhdIHN0YWdbJTAxNmxseF1cbiIsCiAJICAgICAgIChyZWNvdmVyYWJsZSA/IEtFUk5fV0FSTklORyA6IEtFUk5fQ1JJVCksIHNtcF9wcm9jZXNzb3JfaWQoKSwKIAkgICAgICAgKGludCkgaW5mby0+ZGNhY2hlX2luZGV4LAogCSAgICAgICBpbmZvLT5kY2FjaGVfdGFnLAogCSAgICAgICBpbmZvLT5kY2FjaGVfdXRhZywKIAkgICAgICAgaW5mby0+ZGNhY2hlX3N0YWcpOwotCXByaW50aygiJXMiICJFUlJPUiglZCk6IEQtY2FjaGUgZGF0YTBbJTAxNmx4XSBkYXRhMVslMDE2bHhdIGRhdGEyWyUwMTZseF0gZGF0YTNbJTAxNmx4XVxuIiwKKwlwcmludGsoIiVzIiAiRVJST1IoJWQpOiBELWNhY2hlIGRhdGEwWyUwMTZsbHhdIGRhdGExWyUwMTZsbHhdIGRhdGEyWyUwMTZsbHhdIGRhdGEzWyUwMTZsbHhdXG4iLAogCSAgICAgICAocmVjb3ZlcmFibGUgPyBLRVJOX1dBUk5JTkcgOiBLRVJOX0NSSVQpLCBzbXBfcHJvY2Vzc29yX2lkKCksCiAJICAgICAgIGluZm8tPmRjYWNoZV9kYXRhWzBdLAogCSAgICAgICBpbmZvLT5kY2FjaGVfZGF0YVsxXSwKIAkgICAgICAgaW5mby0+ZGNhY2hlX2RhdGFbMl0sCiAJICAgICAgIGluZm8tPmRjYWNoZV9kYXRhWzNdKTsKLQlwcmludGsoIiVzIiAiRVJST1IoJWQpOiBJLWNhY2hlIGlkeFsleF0gdGFnWyUwMTZseF0gdXRhZ1slMDE2bHhdIHN0YWdbJTAxNmx4XSAiCi0JICAgICAgICJ1WyUwMTZseF0gbFslMDE2bHhdXG4iLAorCXByaW50aygiJXMiICJFUlJPUiglZCk6IEktY2FjaGUgaWR4WyV4XSB0YWdbJTAxNmxseF0gdXRhZ1slMDE2bGx4XSBzdGFnWyUwMTZsbHhdICIKKwkgICAgICAgInVbJTAxNmxseF0gbFslMDE2bGx4XVxuIiwKIAkgICAgICAgKHJlY292ZXJhYmxlID8gS0VSTl9XQVJOSU5HIDogS0VSTl9DUklUKSwgc21wX3Byb2Nlc3Nvcl9pZCgpLAogCSAgICAgICAoaW50KSBpbmZvLT5pY2FjaGVfaW5kZXgsCiAJICAgICAgIGluZm8tPmljYWNoZV90YWcsCkBAIC0xMTg5LDIyICsxMTg5LDIyIEBACiAJICAgICAgIGluZm8tPmljYWNoZV9zdGFnLAogCSAgICAgICBpbmZvLT5pY2FjaGVfdXBwZXIsCiAJICAgICAgIGluZm8tPmljYWNoZV9sb3dlcik7Ci0JcHJpbnRrKCIlcyIgIkVSUk9SKCVkKTogSS1jYWNoZSBJTlNOMFslMDE2bHhdIElOU04xWyUwMTZseF0gSU5TTjJbJTAxNmx4XSBJTlNOM1slMDE2bHhdXG4iLAorCXByaW50aygiJXMiICJFUlJPUiglZCk6IEktY2FjaGUgSU5TTjBbJTAxNmxseF0gSU5TTjFbJTAxNmxseF0gSU5TTjJbJTAxNmxseF0gSU5TTjNbJTAxNmxseF1cbiIsCiAJICAgICAgIChyZWNvdmVyYWJsZSA/IEtFUk5fV0FSTklORyA6IEtFUk5fQ1JJVCksIHNtcF9wcm9jZXNzb3JfaWQoKSwKIAkgICAgICAgaW5mby0+aWNhY2hlX2RhdGFbMF0sCiAJICAgICAgIGluZm8tPmljYWNoZV9kYXRhWzFdLAogCSAgICAgICBpbmZvLT5pY2FjaGVfZGF0YVsyXSwKIAkgICAgICAgaW5mby0+aWNhY2hlX2RhdGFbM10pOwotCXByaW50aygiJXMiICJFUlJPUiglZCk6IEktY2FjaGUgSU5TTjRbJTAxNmx4XSBJTlNONVslMDE2bHhdIElOU042WyUwMTZseF0gSU5TTjdbJTAxNmx4XVxuIiwKKwlwcmludGsoIiVzIiAiRVJST1IoJWQpOiBJLWNhY2hlIElOU040WyUwMTZsbHhdIElOU041WyUwMTZsbHhdIElOU042WyUwMTZsbHhdIElOU043WyUwMTZsbHhdXG4iLAogCSAgICAgICAocmVjb3ZlcmFibGUgPyBLRVJOX1dBUk5JTkcgOiBLRVJOX0NSSVQpLCBzbXBfcHJvY2Vzc29yX2lkKCksCiAJICAgICAgIGluZm8tPmljYWNoZV9kYXRhWzRdLAogCSAgICAgICBpbmZvLT5pY2FjaGVfZGF0YVs1XSwKIAkgICAgICAgaW5mby0+aWNhY2hlX2RhdGFbNl0sCiAJICAgICAgIGluZm8tPmljYWNoZV9kYXRhWzddKTsKLQlwcmludGsoIiVzIiAiRVJST1IoJWQpOiBFLWNhY2hlIGlkeFsleF0gdGFnWyUwMTZseF1cbiIsCisJcHJpbnRrKCIlcyIgIkVSUk9SKCVkKTogRS1jYWNoZSBpZHhbJXhdIHRhZ1slMDE2bGx4XVxuIiwKIAkgICAgICAgKHJlY292ZXJhYmxlID8gS0VSTl9XQVJOSU5HIDogS0VSTl9DUklUKSwgc21wX3Byb2Nlc3Nvcl9pZCgpLAogCSAgICAgICAoaW50KSBpbmZvLT5lY2FjaGVfaW5kZXgsIGluZm8tPmVjYWNoZV90YWcpOwotCXByaW50aygiJXMiICJFUlJPUiglZCk6IEUtY2FjaGUgZGF0YTBbJTAxNmx4XSBkYXRhMVslMDE2bHhdIGRhdGEyWyUwMTZseF0gZGF0YTNbJTAxNmx4XVxuIiwKKwlwcmludGsoIiVzIiAiRVJST1IoJWQpOiBFLWNhY2hlIGRhdGEwWyUwMTZsbHhdIGRhdGExWyUwMTZsbHhdIGRhdGEyWyUwMTZsbHhdIGRhdGEzWyUwMTZsbHhdXG4iLAogCSAgICAgICAocmVjb3ZlcmFibGUgPyBLRVJOX1dBUk5JTkcgOiBLRVJOX0NSSVQpLCBzbXBfcHJvY2Vzc29yX2lkKCksCiAJICAgICAgIGluZm8tPmVjYWNoZV9kYXRhWzBdLAogCSAgICAgICBpbmZvLT5lY2FjaGVfZGF0YVsxXSwKQEAgLTE3OTQsNyArMTc5NCw3IEBACiAJaW50IGNudDsKIAogCXByaW50aygiJXM6IFJlcG9ydGluZyBvbiBjcHUgJWRcbiIsIHBmeCwgY3B1KTsKLQlwcmludGsoIiVzOiBlcnJfaGFuZGxlWyVseF0gZXJyX3N0aWNrWyVseF0gZXJyX3R5cGVbJTA4eDolc11cbiIsCisJcHJpbnRrKCIlczogZXJyX2hhbmRsZVslbGx4XSBlcnJfc3RpY2tbJWxseF0gZXJyX3R5cGVbJTA4eDolc11cbiIsCiAJICAgICAgIHBmeCwKIAkgICAgICAgZW50LT5lcnJfaGFuZGxlLCBlbnQtPmVycl9zdGljaywKIAkgICAgICAgZW50LT5lcnJfdHlwZSwKQEAgLTE4MTgsNyArMTgxOCw3IEBACiAJCSJwcml2aWxlZ2VkIiA6ICIiKSwKIAkgICAgICAgKChlbnQtPmVycl9hdHRycyAmIFNVTjRWX0VSUl9BVFRSU19SRVNfUVVFVUVfRlVMTCkgPwogCQkicXVldWUtZnVsbCIgOiAiIikpOwotCXByaW50aygiJXM6IGVycl9yYWRkclslMDE2bHhdIGVycl9zaXplWyV1XSBlcnJfY3B1WyV1XVxuIiwKKwlwcmludGsoIiVzOiBlcnJfcmFkZHJbJTAxNmxseF0gZXJyX3NpemVbJXVdIGVycl9jcHVbJXVdXG4iLAogCSAgICAgICBwZngsCiAJICAgICAgIGVudC0+ZXJyX3JhZGRyLCBlbnQtPmVycl9zaXplLCBlbnQtPmVycl9jcHUpOwogCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC91bmFsaWduZWRfMzIuYyBiL2FyY2gvc3BhcmMva2VybmVsL3VuYWxpZ25lZF8zMi5jCmluZGV4IGMyYTI4YzUuLjZiMWU2Y2QgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL3VuYWxpZ25lZF8zMi5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL3VuYWxpZ25lZF8zMi5jCkBAIC05NywyNiArOTcsMjYgQEAKIAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGZldGNoX3JlZyh1bnNpZ25lZCBpbnQgcmVnLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKLQlzdHJ1Y3QgcmVnX3dpbmRvdyAqd2luOworCXN0cnVjdCByZWdfd2luZG93MzIgKndpbjsKIAogCWlmKHJlZyA8IDE2KQogCQlyZXR1cm4gKCFyZWcgPyAwIDogcmVncy0+dV9yZWdzW3JlZ10pOwogCiAJLyogSG8gaHVtLCB0aGUgc2xpZ2h0bHkgY29tcGxpY2F0ZWQgY2FzZS4gKi8KLQl3aW4gPSAoc3RydWN0IHJlZ193aW5kb3cgKikgcmVncy0+dV9yZWdzW1VSRUdfRlBdOworCXdpbiA9IChzdHJ1Y3QgcmVnX3dpbmRvdzMyICopIHJlZ3MtPnVfcmVnc1tVUkVHX0ZQXTsKIAlyZXR1cm4gd2luLT5sb2NhbHNbcmVnIC0gMTZdOyAvKiB5ZXMsIEkga25vdyB3aGF0IHRoaXMgZG9lcy4uLiAqLwogfQogCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgc2FmZV9mZXRjaF9yZWcodW5zaWduZWQgaW50IHJlZywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7Ci0Jc3RydWN0IHJlZ193aW5kb3cgX191c2VyICp3aW47CisJc3RydWN0IHJlZ193aW5kb3czMiBfX3VzZXIgKndpbjsKIAl1bnNpZ25lZCBsb25nIHJldDsKIAogCWlmIChyZWcgPCAxNikKIAkJcmV0dXJuICghcmVnID8gMCA6IHJlZ3MtPnVfcmVnc1tyZWddKTsKIAogCS8qIEhvIGh1bSwgdGhlIHNsaWdodGx5IGNvbXBsaWNhdGVkIGNhc2UuICovCi0Jd2luID0gKHN0cnVjdCByZWdfd2luZG93IF9fdXNlciAqKSByZWdzLT51X3JlZ3NbVVJFR19GUF07CisJd2luID0gKHN0cnVjdCByZWdfd2luZG93MzIgX191c2VyICopIHJlZ3MtPnVfcmVnc1tVUkVHX0ZQXTsKIAogCWlmICgodW5zaWduZWQgbG9uZyl3aW4gJiAzKQogCQlyZXR1cm4gLTE7CkBAIC0xMjksMTEgKzEyOSwxMSBAQAogCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgKmZldGNoX3JlZ19hZGRyKHVuc2lnbmVkIGludCByZWcsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotCXN0cnVjdCByZWdfd2luZG93ICp3aW47CisJc3RydWN0IHJlZ193aW5kb3czMiAqd2luOwogCiAJaWYocmVnIDwgMTYpCiAJCXJldHVybiAmcmVncy0+dV9yZWdzW3JlZ107Ci0Jd2luID0gKHN0cnVjdCByZWdfd2luZG93ICopIHJlZ3MtPnVfcmVnc1tVUkVHX0ZQXTsKKwl3aW4gPSAoc3RydWN0IHJlZ193aW5kb3czMiAqKSByZWdzLT51X3JlZ3NbVVJFR19GUF07CiAJcmV0dXJuICZ3aW4tPmxvY2Fsc1tyZWcgLSAxNl07CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL3VuYWxpZ25lZF82NC5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvdW5hbGlnbmVkXzY0LmMKaW5kZXggMjAzZGRmYS4uZjE2NGQ1YSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvdW5hbGlnbmVkXzY0LmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvdW5hbGlnbmVkXzY0LmMKQEAgLTYwMSwxMSArNjAxLDE1IEBACiAJCXBjID0gKHUzMilwYzsKIAlpZiAoZ2V0X3VzZXIoaW5zbiwgKHUzMiBfX3VzZXIgKikgcGMpICE9IC1FRkFVTFQpIHsKIAkJaW50IGFzaSA9IGRlY29kZV9hc2koaW5zbiwgcmVncyk7CisJCWludCBlcnI7CisKIAkJaWYgKChhc2kgPiBBU0lfU05GTCkgfHwKIAkJICAgIChhc2kgPCBBU0lfUCkpCiAJCQlnb3RvIGRhZXg7Ci0JCWlmIChnZXRfdXNlcihmaXJzdCwgKHUzMiBfX3VzZXIgKilzZmFyKSB8fAotCQkgICAgIGdldF91c2VyKHNlY29uZCwgKHUzMiBfX3VzZXIgKikoc2ZhciArIDQpKSkgeworCQllcnIgPSBnZXRfdXNlcihmaXJzdCwgKHUzMiBfX3VzZXIgKilzZmFyKTsKKwkJaWYgKCFlcnIpCisJCQllcnIgPSBnZXRfdXNlcihzZWNvbmQsICh1MzIgX191c2VyICopKHNmYXIgKyA0KSk7CisJCWlmIChlcnIpIHsKIAkJCWlmIChhc2kgJiAweDIpIC8qIE5GICovIHsKIAkJCQlmaXJzdCA9IDA7IHNlY29uZCA9IDA7CiAJCQl9IGVsc2UKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL3Zpby5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvdmlvLmMKaW5kZXggOTJiMWY4ZS4uNzUzZDEyOCAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvdmlvLmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvdmlvLmMKQEAgLTI2MywxMCArMjYzLDEwIEBACiAJCWRldl9zZXRfbmFtZSgmdmRldi0+ZGV2LCAiJXMiLCBidXNfaWRfbmFtZSk7CiAJCXZkZXYtPmRldl9ubyA9IH4odTY0KTA7CiAJfSBlbHNlIGlmICghY2ZnX2hhbmRsZSkgewotCQlkZXZfc2V0X25hbWUoJnZkZXYtPmRldiwgIiVzLSVsdSIsIGJ1c19pZF9uYW1lLCAqaWQpOworCQlkZXZfc2V0X25hbWUoJnZkZXYtPmRldiwgIiVzLSVsbHUiLCBidXNfaWRfbmFtZSwgKmlkKTsKIAkJdmRldi0+ZGV2X25vID0gKmlkOwogCX0gZWxzZSB7Ci0JCWRldl9zZXRfbmFtZSgmdmRldi0+ZGV2LCAiJXMtJWx1LSVsdSIsIGJ1c19pZF9uYW1lLAorCQlkZXZfc2V0X25hbWUoJnZkZXYtPmRldiwgIiVzLSVsbHUtJWxsdSIsIGJ1c19pZF9uYW1lLAogCQkJICAgICAqY2ZnX2hhbmRsZSwgKmlkKTsKIAkJdmRldi0+ZGV2X25vID0gKmNmZ19oYW5kbGU7CiAJfQpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvdmlvaHMuYyBiL2FyY2gvc3BhcmMva2VybmVsL3Zpb2hzLmMKaW5kZXggNzA4ZmExNy4uYWE2YWM3MCAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvdmlvaHMuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC92aW9ocy5jCkBAIC0zMzcsOCArMzM3LDEwIEBACiAJdmlvZGJnKEhTLCAiR09UIFZFUlNJT04gTkFDSyBtYWpbJXVdIG1pblsldV0gZGV2Y2xhc3NbJXVdXG4iLAogCSAgICAgICBwa3QtPm1ham9yLCBwa3QtPm1pbm9yLCBwa3QtPmRldl9jbGFzcyk7CiAKLQlpZiAoKHBrdC0+bWFqb3IgPT0gMCAmJiBwa3QtPm1pbm9yID09IDApIHx8Ci0JICAgICEobnZlciA9IGZpbmRfYnlfbWFqb3IodmlvLCBwa3QtPm1ham9yKSkpCisJaWYgKHBrdC0+bWFqb3IgPT0gMCAmJiBwa3QtPm1pbm9yID09IDApCisJCXJldHVybiBoYW5kc2hha2VfZmFpbHVyZSh2aW8pOworCW52ZXIgPSBmaW5kX2J5X21ham9yKHZpbywgcGt0LT5tYWpvcik7CisJaWYgKCFudmVyKQogCQlyZXR1cm4gaGFuZHNoYWtlX2ZhaWx1cmUodmlvKTsKIAogCWlmIChzZW5kX3ZlcnNpb24odmlvLCBudmVyLT5tYWpvciwgbnZlci0+bWlub3IpIDwgMCkKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL3dpbmRvd3MuYyBiL2FyY2gvc3BhcmMva2VybmVsL3dpbmRvd3MuYwppbmRleCA5Y2M5M2VhLi5mMjRkMjk4IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC93aW5kb3dzLmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvd2luZG93cy5jCkBAIC00Miw3ICs0Miw3IEBACiAKIAlmb3IoaSA9IGZpcnN0X3dpbjsgaSA8IGxhc3Rfd2luOyBpKyspIHsKIAkJdHAtPnJ3YnVmX3N0a3B0cnNbaV0gPSB0cC0+cndidWZfc3RrcHRyc1tpKzFdOwotCQltZW1jcHkoJnRwLT5yZWdfd2luZG93W2ldLCAmdHAtPnJlZ193aW5kb3dbaSsxXSwgc2l6ZW9mKHN0cnVjdCByZWdfd2luZG93KSk7CisJCW1lbWNweSgmdHAtPnJlZ193aW5kb3dbaV0sICZ0cC0+cmVnX3dpbmRvd1tpKzFdLCBzaXplb2Yoc3RydWN0IHJlZ193aW5kb3czMikpOwogCX0KIH0KIApAQCAtNzAsNyArNzAsNyBAQAogCiAJCS8qIE9rLCBsZXQgaXQgcmlwLiAqLwogCQlpZiAoY29weV90b191c2VyKChjaGFyIF9fdXNlciAqKSBzcCwgJnRwLT5yZWdfd2luZG93W3dpbmRvd10sCi0JCQkJIHNpemVvZihzdHJ1Y3QgcmVnX3dpbmRvdykpKQorCQkJCSBzaXplb2Yoc3RydWN0IHJlZ193aW5kb3czMikpKQogCQkJY29udGludWU7CiAKIAkJc2hpZnRfd2luZG93X2J1ZmZlcih3aW5kb3csIHRwLT53X3NhdmVkIC0gMSwgdHApOwpAQCAtMTE5LDcgKzExOSw3IEBACiAKIAkJaWYgKChzcCAmIDcpIHx8CiAJCSAgICBjb3B5X3RvX3VzZXIoKGNoYXIgX191c2VyICopIHNwLCAmdHAtPnJlZ193aW5kb3dbd2luZG93XSwKLQkJCQkgc2l6ZW9mKHN0cnVjdCByZWdfd2luZG93KSkpCisJCQkJIHNpemVvZihzdHJ1Y3QgcmVnX3dpbmRvdzMyKSkpCiAJCQlkb19leGl0KFNJR0lMTCk7CiAJfQogCXRwLT53X3NhdmVkID0gMDsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvbW0vZmF1bHRfMzIuYyBiL2FyY2gvc3BhcmMvbW0vZmF1bHRfMzIuYwppbmRleCBhNTA3ZTExLi4xMmU0NDdmIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL21tL2ZhdWx0XzMyLmMKKysrIGIvYXJjaC9zcGFyYy9tbS9mYXVsdF8zMi5jCkBAIC0yODMsNyArMjgzLDggQEAKIAkvKiBJcyB0aGlzIGluIGV4X3RhYmxlPyAqLwogbm9fY29udGV4dDoKIAlnMiA9IHJlZ3MtPnVfcmVnc1tVUkVHX0cyXTsKLQlpZiAoIWZyb21fdXNlciAmJiAoZml4dXAgPSBzZWFyY2hfZXh0YWJsZXNfcmFuZ2UocmVncy0+cGMsICZnMikpKSB7CisJaWYgKCFmcm9tX3VzZXIpIHsKKwkJZml4dXAgPSBzZWFyY2hfZXh0YWJsZXNfcmFuZ2UocmVncy0+cGMsICZnMik7CiAJCWlmIChmaXh1cCA+IDEwKSB7IC8qIFZhbHVlcyBiZWxvdyBhcmUgcmVzZXJ2ZWQgZm9yIG90aGVyIHRoaW5ncyAqLwogCQkJZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIF9fbWVtc2V0X3N0YXJ0W107CiAJCQlleHRlcm4gY29uc3QgdW5zaWduZWQgX19tZW1zZXRfZW5kW107CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL21tL2luaXRfNjQuYyBiL2FyY2gvc3BhcmMvbW0vaW5pdF82NC5jCmluZGV4IDZlYTczZGEuLmM3N2M3ZWYgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvbW0vaW5pdF82NC5jCisrKyBiL2FyY2gvc3BhcmMvbW0vaW5pdF82NC5jCkBAIC0yNTgsMjEgKzI1OCwxNiBAQAogdW5zaWduZWQgbG9uZyBfUEFHRV9BTExfU1pfQklUUyBfX3JlYWRfbW9zdGx5OwogdW5zaWduZWQgbG9uZyBfUEFHRV9TWkJJVFMgX19yZWFkX21vc3RseTsKIAotdm9pZCB1cGRhdGVfbW11X2NhY2hlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHB0ZV90IHB0ZSkKK3N0YXRpYyB2b2lkIGZsdXNoX2RjYWNoZSh1bnNpZ25lZCBsb25nIHBmbikKIHsKLQlzdHJ1Y3QgbW1fc3RydWN0ICptbTsKLQlzdHJ1Y3QgdHNiICp0c2I7Ci0JdW5zaWduZWQgbG9uZyB0YWcsIGZsYWdzOwotCXVuc2lnbmVkIGxvbmcgdHNiX2luZGV4LCB0c2JfaGFzaF9zaGlmdDsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKIAotCWlmICh0bGJfdHlwZSAhPSBoeXBlcnZpc29yKSB7Ci0JCXVuc2lnbmVkIGxvbmcgcGZuID0gcHRlX3BmbihwdGUpOworCXBhZ2UgPSBwZm5fdG9fcGFnZShwZm4pOworCWlmIChwYWdlICYmIHBhZ2VfbWFwcGluZyhwYWdlKSkgewogCQl1bnNpZ25lZCBsb25nIHBnX2ZsYWdzOwotCQlzdHJ1Y3QgcGFnZSAqcGFnZTsKIAotCQlpZiAocGZuX3ZhbGlkKHBmbikgJiYKLQkJICAgIChwYWdlID0gcGZuX3RvX3BhZ2UocGZuKSwgcGFnZV9tYXBwaW5nKHBhZ2UpKSAmJgotCQkgICAgKChwZ19mbGFncyA9IHBhZ2UtPmZsYWdzKSAmICgxVUwgPDwgUEdfZGNhY2hlX2RpcnR5KSkpIHsKKwkJcGdfZmxhZ3MgPSBwYWdlLT5mbGFnczsKKwkJaWYgKHBnX2ZsYWdzICYgKDFVTCA8PCBQR19kY2FjaGVfZGlydHkpKSB7CiAJCQlpbnQgY3B1ID0gKChwZ19mbGFncyA+PiBQR19kY2FjaGVfY3B1X3NoaWZ0KSAmCiAJCQkJICAgUEdfZGNhY2hlX2NwdV9tYXNrKTsKIAkJCWludCB0aGlzX2NwdSA9IGdldF9jcHUoKTsKQEAgLTI5MCw2ICsyODUsMjEgQEAKIAkJCXB1dF9jcHUoKTsKIAkJfQogCX0KK30KKwordm9pZCB1cGRhdGVfbW11X2NhY2hlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHB0ZV90IHB0ZSkKK3sKKwlzdHJ1Y3QgbW1fc3RydWN0ICptbTsKKwlzdHJ1Y3QgdHNiICp0c2I7CisJdW5zaWduZWQgbG9uZyB0YWcsIGZsYWdzOworCXVuc2lnbmVkIGxvbmcgdHNiX2luZGV4LCB0c2JfaGFzaF9zaGlmdDsKKworCWlmICh0bGJfdHlwZSAhPSBoeXBlcnZpc29yKSB7CisJCXVuc2lnbmVkIGxvbmcgcGZuID0gcHRlX3BmbihwdGUpOworCisJCWlmIChwZm5fdmFsaWQocGZuKSkKKwkJCWZsdXNoX2RjYWNoZShwZm4pOworCX0KIAogCW1tID0gdm1hLT52bV9tbTsKIApAQCAtNzY5LDggKzc3OSw4IEBACiAJcmV0dXJuIC0xOwogfQogCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBuaWRfcmFuZ2UodW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQsCi0JCQkgICAgICAgaW50ICpuaWQpCitzdGF0aWMgdW5zaWduZWQgbG9uZyBsb25nIG5pZF9yYW5nZSh1bnNpZ25lZCBsb25nIGxvbmcgc3RhcnQsCisJCQkJICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBlbmQsIGludCAqbmlkKQogewogCSpuaWQgPSBmaW5kX25vZGUoc3RhcnQpOwogCXN0YXJ0ICs9IFBBR0VfU0laRTsKQEAgLTc4OCw4ICs3OTgsOCBAQAogCXJldHVybiBzdGFydDsKIH0KICNlbHNlCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBuaWRfcmFuZ2UodW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQsCi0JCQkgICAgICAgaW50ICpuaWQpCitzdGF0aWMgdW5zaWduZWQgbG9uZyBsb25nIG5pZF9yYW5nZSh1bnNpZ25lZCBsb25nIGxvbmcgc3RhcnQsCisJCQkJICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBlbmQsIGludCAqbmlkKQogewogCSpuaWQgPSAwOwogCXJldHVybiBlbmQ7CkBAIC0xMDE2LDggKzEwMjYsOCBAQAogCQl2YWwgPSBtZGVzY19nZXRfcHJvcGVydHkobWQsIG5vZGUsICJhZGRyZXNzLW1hc2siLCBOVUxMKTsKIAkJbS0+bWFzayA9ICp2YWw7CiAKLQkJbnVtYWRiZygiTUxHUk9VUFslZF06IG5vZGVbJWx4XSBsYXRlbmN5WyVseF0gIgotCQkJIm1hdGNoWyVseF0gbWFza1slbHhdXG4iLAorCQludW1hZGJnKCJNTEdST1VQWyVkXTogbm9kZVslbGx4XSBsYXRlbmN5WyVsbHhdICIKKwkJCSJtYXRjaFslbGx4XSBtYXNrWyVsbHhdXG4iLAogCQkJY291bnQgLSAxLCBtLT5ub2RlLCBtLT5sYXRlbmN5LCBtLT5tYXRjaCwgbS0+bWFzayk7CiAJfQogCkBAIC0xMDU2LDcgKzEwNjYsNyBAQAogCQkJCQkgImFkZHJlc3MtY29uZ3J1ZW5jZS1vZmZzZXQiLCBOVUxMKTsKIAkJbS0+b2Zmc2V0ID0gKnZhbDsKIAotCQludW1hZGJnKCJNQkxPQ0tbJWRdOiBiYXNlWyVseF0gc2l6ZVslbHhdIG9mZnNldFslbHhdXG4iLAorCQludW1hZGJnKCJNQkxPQ0tbJWRdOiBiYXNlWyVsbHhdIHNpemVbJWxseF0gb2Zmc2V0WyVsbHhdXG4iLAogCQkJY291bnQgLSAxLCBtLT5iYXNlLCBtLT5zaXplLCBtLT5vZmZzZXQpOwogCX0KIApAQCAtMTEyNyw3ICsxMTM3LDcgQEAKIAluLT5tYXNrID0gY2FuZGlkYXRlLT5tYXNrOwogCW4tPnZhbCA9IGNhbmRpZGF0ZS0+bWF0Y2g7CiAKLQludW1hZGJnKCJOVU1BIE5PREVbJWRdOiBtYXNrWyVseF0gdmFsWyVseF0gKGxhdGVuY3lbJWx4XSlcbiIsCisJbnVtYWRiZygiTlVNQSBOT0RFWyVkXTogbWFza1slbHhdIHZhbFslbHhdIChsYXRlbmN5WyVsbHhdKVxuIiwKIAkJaW5kZXgsIG4tPm1hc2ssIG4tPnZhbCwgY2FuZGlkYXRlLT5sYXRlbmN5KTsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9NYWtlZmlsZSBiL2FyY2gvdW0vTWFrZWZpbGUKaW5kZXggZDk0NGMzNC4uMDcyOGRlZiAxMDA2NDQKLS0tIGEvYXJjaC91bS9NYWtlZmlsZQorKysgYi9hcmNoL3VtL01ha2VmaWxlCkBAIC0yMiwxMCArMjIsMTEgQEAKIAogaW5jbHVkZSAkKHNyY3RyZWUpLyQoQVJDSF9ESVIpL01ha2VmaWxlLXNrYXMKIAotQVJDSF9JTkNMVURFCTo9IC1JJChzcmN0cmVlKS8kKEFSQ0hfRElSKS9pbmNsdWRlL3NoYXJlZAorU0hBUkVEX0hFQURFUlMJOj0gJChBUkNIX0RJUikvaW5jbHVkZS9zaGFyZWQKK0FSQ0hfSU5DTFVERQk6PSAtSSQoc3JjdHJlZSkvJChTSEFSRURfSEVBREVSUykKIEFSQ0hfSU5DTFVERQkrPSAtSSQoc3JjdHJlZSkvJChBUkNIX0RJUikvc3lzLSQoU1VCQVJDSCkvc2hhcmVkCiBpZm5lcSAoJChLQlVJTERfU1JDKSwpCi1BUkNIX0lOQ0xVREUJKz0gLUkkKEFSQ0hfRElSKS9pbmNsdWRlL3NoYXJlZCAjIGZvciB0d28gZ2VuZXJhdGVkIGZpbGVzCitBUkNIX0lOQ0xVREUJKz0gLUkkKFNIQVJFRF9IRUFERVJTKQogZW5kaWYKIEtCVUlMRF9DUFBGTEFHUyArPSAtSSQoc3JjdHJlZSkvJChBUkNIX0RJUikvc3lzLSQoU1VCQVJDSCkKIApAQCAtODUsOCArODYsOCBAQAogCiBLQlVJTERfS0NPTkZJRyA6PSBhcmNoL3VtL0tjb25maWcuJChIRUFERVJfQVJDSCkKIAotYXJjaHByZXBhcmU6ICQoQVJDSF9ESVIpL2luY2x1ZGUvc2hhcmVkL3VzZXJfY29uc3RhbnRzLmgKLXByZXBhcmU6ICQoQVJDSF9ESVIpL2luY2x1ZGUvc2hhcmVkL2tlcm5fY29uc3RhbnRzLmgKK2FyY2hwcmVwYXJlOiAkKFNIQVJFRF9IRUFERVJTKS91c2VyX2NvbnN0YW50cy5oCithcmNocHJlcGFyZTogJChTSEFSRURfSEVBREVSUykva2Vybl9jb25zdGFudHMuaAogCiBMSU5LLSQoQ09ORklHX0xEX1NDUklQVF9TVEFUSUMpICs9IC1zdGF0aWMKIExJTkstJChDT05GSUdfTERfU0NSSVBUX0RZTikgKz0gLVdsLC1ycGF0aCwvbGliCkBAIC0xMTksMTcgKzEyMCwxMyBAQAogIyBXaGVuIGNsZWFuaW5nIHdlIGRvbid0IGluY2x1ZGUgLmNvbmZpZywgc28gd2UgZG9uJ3QgaW5jbHVkZQogIyBUVCBvciBza2FzIG1ha2VmaWxlcyBhbmQgZG9uJ3QgY2xlYW4gc2thc19wdHJlZ3MuaC4KIENMRUFOX0ZJTEVTICs9IGxpbnV4IHguaSBnbW9uLm91dCBcCi0JJChBUkNIX0RJUikvaW5jbHVkZS9zaGFyZWQvdXNlcl9jb25zdGFudHMuaCBcCi0JJChBUkNIX0RJUikvaW5jbHVkZS9zaGFyZWQva2Vybl9jb25zdGFudHMuaAorCSQoU0hBUkVEX0hFQURFUlMpL3VzZXJfY29uc3RhbnRzLmggXAorCSQoU0hBUkVEX0hFQURFUlMpL2tlcm5fY29uc3RhbnRzLmgKIAogYXJjaGNsZWFuOgogCUBmaW5kIC4gXCggLW5hbWUgJyouYmInIC1vIC1uYW1lICcqLmJiZycgLW8gLW5hbWUgJyouZGEnIFwKIAkJLW8gLW5hbWUgJyouZ2NvdicgXCkgLXR5cGUgZiAtcHJpbnQgfCB4YXJncyBybSAtZgogCi0kKG9ianRyZWUpLyQoQVJDSF9ESVIpL2luY2x1ZGUvc2hhcmVkOgotCUBlY2hvICcgIE1LRElSICRAJwotCSQoUSlta2RpciAtcCAkQAotCiAjIEdlbmVyYXRlZCBmaWxlcwogCiAkKEFSQ0hfRElSKS9zeXMtJChTVUJBUkNIKS91c2VyLW9mZnNldHMuczogRk9SQ0UKQEAgLTE0OCwxMSArMTQ1LDExIEBACiAgICAgICAgICBlY2hvICIiOyApCiBlbmRlZgogCi0kKEFSQ0hfRElSKS9pbmNsdWRlL3NoYXJlZC91c2VyX2NvbnN0YW50cy5oOiAkKEFSQ0hfRElSKS9zeXMtJChTVUJBUkNIKS91c2VyLW9mZnNldHMucworJChTSEFSRURfSEVBREVSUykvdXNlcl9jb25zdGFudHMuaDogJChBUkNIX0RJUikvc3lzLSQoU1VCQVJDSCkvdXNlci1vZmZzZXRzLnMKIAkkKGNhbGwgZmlsZWNoayxnZW4tYXNtLW9mZnNldHMpCiAKLSQoQVJDSF9ESVIpL2luY2x1ZGUvc2hhcmVkL2tlcm5fY29uc3RhbnRzLmg6ICQob2JqdHJlZSkvJChBUkNIX0RJUikvaW5jbHVkZS9zaGFyZWQKLQlAZWNobyAnICBTWU1MSU5LICRAJwotCSQoUSlsbiAtc2YgLi4vLi4vLi4vLi4vaW5jbHVkZS9hc20vYXNtLW9mZnNldHMuaCAkQAorJChTSEFSRURfSEVBREVSUykva2Vybl9jb25zdGFudHMuaDoKKwkkKFEpbWtkaXIgLXAgJChkaXIgJEApCisJJChRKWVjaG8gJyNpbmNsdWRlICIuLi8uLi8uLi8uLi9pbmNsdWRlL2FzbS9hc20tb2Zmc2V0cy5oIicgPiRACiAKIGV4cG9ydCBTVUJBUkNIIFVTRVJfQ0ZMQUdTIENGTEFHU19OT19IQVJERU5JTkcgT1MgSEVBREVSX0FSQ0ggREVWX05VTExfUEFUSApkaWZmIC0tZ2l0IGEvYXJjaC91bS9pbmNsdWRlL2FzbS9zeXN0ZW0uaCBiL2FyY2gvdW0vaW5jbHVkZS9hc20vc3lzdGVtLmgKaW5kZXggYWU1Zjk0ZC4uNzUzMzQ2ZSAxMDA2NDQKLS0tIGEvYXJjaC91bS9pbmNsdWRlL2FzbS9zeXN0ZW0uaAorKysgYi9hcmNoL3VtL2luY2x1ZGUvYXNtL3N5c3RlbS5oCkBAIC0xMSwyMSArMTEsMjEgQEAKIGV4dGVybiB2b2lkIGJsb2NrX3NpZ25hbHModm9pZCk7CiBleHRlcm4gdm9pZCB1bmJsb2NrX3NpZ25hbHModm9pZCk7CiAKLSNkZWZpbmUgcmF3X2xvY2FsX3NhdmVfZmxhZ3MoZmxhZ3MpIGRvIHsgdHlwZWNoZWNrKHVuc2lnbmVkIGxvbmcsIGZsYWdzKTsgXAorI2RlZmluZSBsb2NhbF9zYXZlX2ZsYWdzKGZsYWdzKSBkbyB7IHR5cGVjaGVjayh1bnNpZ25lZCBsb25nLCBmbGFncyk7IFwKIAkJCQkgICAgIChmbGFncykgPSBnZXRfc2lnbmFscygpOyB9IHdoaWxlKDApCi0jZGVmaW5lIHJhd19sb2NhbF9pcnFfcmVzdG9yZShmbGFncykgZG8geyB0eXBlY2hlY2sodW5zaWduZWQgbG9uZywgZmxhZ3MpOyBcCisjZGVmaW5lIGxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKSBkbyB7IHR5cGVjaGVjayh1bnNpZ25lZCBsb25nLCBmbGFncyk7IFwKIAkJCQkgICAgICBzZXRfc2lnbmFscyhmbGFncyk7IH0gd2hpbGUoMCkKIAotI2RlZmluZSByYXdfbG9jYWxfaXJxX3NhdmUoZmxhZ3MpIGRvIHsgcmF3X2xvY2FsX3NhdmVfZmxhZ3MoZmxhZ3MpOyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19sb2NhbF9pcnFfZGlzYWJsZSgpOyB9IHdoaWxlKDApCisjZGVmaW5lIGxvY2FsX2lycV9zYXZlKGZsYWdzKSBkbyB7IGxvY2FsX3NhdmVfZmxhZ3MoZmxhZ3MpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsX2lycV9kaXNhYmxlKCk7IH0gd2hpbGUoMCkKIAotI2RlZmluZSByYXdfbG9jYWxfaXJxX2VuYWJsZSgpIHVuYmxvY2tfc2lnbmFscygpCi0jZGVmaW5lIHJhd19sb2NhbF9pcnFfZGlzYWJsZSgpIGJsb2NrX3NpZ25hbHMoKQorI2RlZmluZSBsb2NhbF9pcnFfZW5hYmxlKCkgdW5ibG9ja19zaWduYWxzKCkKKyNkZWZpbmUgbG9jYWxfaXJxX2Rpc2FibGUoKSBibG9ja19zaWduYWxzKCkKIAogI2RlZmluZSBpcnFzX2Rpc2FibGVkKCkgICAgICAgICAgICAgICAgIFwKICh7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7ICAgICAgICAgICAgXAotICAgICAgICByYXdfbG9jYWxfc2F2ZV9mbGFncyhmbGFncyk7ICAgICAgICBcCisgICAgICAgIGxvY2FsX3NhdmVfZmxhZ3MoZmxhZ3MpOyAgICAgICAgXAogICAgICAgICAoZmxhZ3MgPT0gMCk7ICAgICAgICAgICAgICAgICAgIFwKIH0pCiAKZGlmZiAtLWdpdCBhL2FyY2gvdW0va2VybmVsL3RyYXAuYyBiL2FyY2gvdW0va2VybmVsL3RyYXAuYwppbmRleCA0NGU0OTA0Li43Mzg0ZDhhIDEwMDY0NAotLS0gYS9hcmNoL3VtL2tlcm5lbC90cmFwLmMKKysrIGIvYXJjaC91bS9rZXJuZWwvdHJhcC5jCkBAIC02NCwxMSArNjQsMTAgQEAKIAogCWRvIHsKIAkJaW50IGZhdWx0Owotc3Vydml2ZToKKwogCQlmYXVsdCA9IGhhbmRsZV9tbV9mYXVsdChtbSwgdm1hLCBhZGRyZXNzLCBpc193cml0ZSk7CiAJCWlmICh1bmxpa2VseShmYXVsdCAmIFZNX0ZBVUxUX0VSUk9SKSkgewogCQkJaWYgKGZhdWx0ICYgVk1fRkFVTFRfT09NKSB7Ci0JCQkJZXJyID0gLUVOT01FTTsKIAkJCQlnb3RvIG91dF9vZl9tZW1vcnk7CiAJCQl9IGVsc2UgaWYgKGZhdWx0ICYgVk1fRkFVTFRfU0lHQlVTKSB7CiAJCQkJZXJyID0gLUVBQ0NFUzsKQEAgLTEwNCwxOCArMTAzLDE0IEBACiBvdXRfbm9zZW1hcGhvcmU6CiAJcmV0dXJuIGVycjsKIAotLyoKLSAqIFdlIHJhbiBvdXQgb2YgbWVtb3J5LCBvciBzb21lIG90aGVyIHRoaW5nIGhhcHBlbmVkIHRvIHVzIHRoYXQgbWFkZQotICogdXMgdW5hYmxlIHRvIGhhbmRsZSB0aGUgcGFnZSBmYXVsdCBncmFjZWZ1bGx5LgotICovCiBvdXRfb2ZfbWVtb3J5OgotCWlmIChpc19nbG9iYWxfaW5pdChjdXJyZW50KSkgewotCQl1cF9yZWFkKCZtbS0+bW1hcF9zZW0pOwotCQl5aWVsZCgpOwotCQlkb3duX3JlYWQoJm1tLT5tbWFwX3NlbSk7Ci0JCWdvdG8gc3Vydml2ZTsKLQl9Ci0JZ290byBvdXQ7CisJLyoKKwkgKiBXZSByYW4gb3V0IG9mIG1lbW9yeSwgY2FsbCB0aGUgT09NIGtpbGxlciwgYW5kIHJldHVybiB0aGUgdXNlcnNwYWNlCisJICogKHdoaWNoIHdpbGwgcmV0cnkgdGhlIGZhdWx0LCBvciBraWxsIHVzIGlmIHdlIGdvdCBvb20ta2lsbGVkKS4KKwkgKi8KKwl1cF9yZWFkKCZtbS0+bW1hcF9zZW0pOworCXBhZ2VmYXVsdF9vdXRfb2ZfbWVtb3J5KCk7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIGJhZF9zZWd2KHN0cnVjdCBmYXVsdGluZm8gZmksIHVuc2lnbmVkIGxvbmcgaXApCkBAIC0yMTQsOSArMjA5LDYgQEAKIAkJc2kuc2lfYWRkciA9ICh2b2lkIF9fdXNlciAqKWFkZHJlc3M7CiAJCWN1cnJlbnQtPnRocmVhZC5hcmNoLmZhdWx0aW5mbyA9IGZpOwogCQlmb3JjZV9zaWdfaW5mbyhTSUdCVVMsICZzaSwgY3VycmVudCk7Ci0JfSBlbHNlIGlmIChlcnIgPT0gLUVOT01FTSkgewotCQlwcmludGsoS0VSTl9JTkZPICJWTToga2lsbGluZyBwcm9jZXNzICVzXG4iLCBjdXJyZW50LT5jb21tKTsKLQkJZG9fZXhpdChTSUdLSUxMKTsKIAl9IGVsc2UgewogCQlCVUdfT04oZXJyICE9IC1FRkFVTFQpOwogCQlzaS5zaV9zaWdubyA9IFNJR1NFR1Y7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9LY29uZmlnLmNwdSBiL2FyY2gveDg2L0tjb25maWcuY3B1CmluZGV4IDg1YTc4NTcuLjgwNzg5NTUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L0tjb25maWcuY3B1CisrKyBiL2FyY2gveDg2L0tjb25maWcuY3B1CkBAIC00MDgsNyArNDA4LDcgQEAKIAogY29uZmlnIFg4Nl9ERUJVR0NUTE1TUgogCWRlZl9ib29sIHkKLQlkZXBlbmRzIG9uICEoTUs2IHx8IE1XSU5DSElQQzYgfHwgTVdJTkNISVAzRCB8fCBNQ1lSSVhJSUkgfHwgTTU4Nk1NWCB8fCBNNTg2VFNDIHx8IE01ODYgfHwgTTQ4NiB8fCBNMzg2KQorCWRlcGVuZHMgb24gIShNSzYgfHwgTVdJTkNISVBDNiB8fCBNV0lOQ0hJUDNEIHx8IE1DWVJJWElJSSB8fCBNNTg2TU1YIHx8IE01ODZUU0MgfHwgTTU4NiB8fCBNNDg2IHx8IE0zODYpICYmICFVTUwKIAogbWVudWNvbmZpZyBQUk9DRVNTT1JfU0VMRUNUCiAJYm9vbCAiU3VwcG9ydGVkIHByb2Nlc3NvciB2ZW5kb3JzIiBpZiBFTUJFRERFRApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vS2J1aWxkIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vS2J1aWxkCmluZGV4IDRhOGU4MGMuLmE5ZjhhODEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL0tidWlsZAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9LYnVpbGQKQEAgLTIyLDMgKzIyLDQgQEAKIHVuaWZkZWYteSArPSB1bmlzdGRfNjQuaAogdW5pZmRlZi15ICs9IHZtODYuaAogdW5pZmRlZi15ICs9IHZzeXNjYWxsLmgKK3VuaWZkZWYteSArPSBzd2FiLmgKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2F0b21pY18zMi5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vYXRvbWljXzMyLmgKaW5kZXggYWQ1YjlmNi4uODViNDZmYiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vYXRvbWljXzMyLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vYXRvbWljXzMyLmgKQEAgLTIsNiArMiw3IEBACiAjZGVmaW5lIF9BU01fWDg2X0FUT01JQ18zMl9ICiAKICNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgogI2luY2x1ZGUgPGFzbS9jbXB4Y2hnLmg+CiAKQEAgLTEwLDE1ICsxMSw2IEBACiAgKiByZXNvdXJjZSBjb3VudGluZyBldGMuLgogICovCiAKLS8qCi0gKiBNYWtlIHN1cmUgZ2NjIGRvZXNuJ3QgdHJ5IHRvIGJlIGNsZXZlciBhbmQgbW92ZSB0aGluZ3MgYXJvdW5kCi0gKiBvbiB1cy4gV2UgbmVlZCB0byB1c2UgX2V4YWN0bHlfIHRoZSBhZGRyZXNzIHRoZSB1c2VyIGdhdmUgdXMsCi0gKiBub3Qgc29tZSBhbGlhcyB0aGF0IGNvbnRhaW5zIHRoZSBzYW1lIGluZm9ybWF0aW9uLgotICovCi10eXBlZGVmIHN0cnVjdCB7Ci0JaW50IGNvdW50ZXI7Ci19IGF0b21pY190OwotCiAjZGVmaW5lIEFUT01JQ19JTklUKGkpCXsgKGkpIH0KIAogLyoqCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9hdG9taWNfNjQuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2F0b21pY182NC5oCmluZGV4IDI3OWQyYTcuLjhjMjE3MzEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2F0b21pY182NC5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2F0b21pY182NC5oCkBAIC0xLDI1ICsxLDE1IEBACiAjaWZuZGVmIF9BU01fWDg2X0FUT01JQ182NF9ICiAjZGVmaW5lIF9BU01fWDg2X0FUT01JQ182NF9ICiAKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9hbHRlcm5hdGl2ZS5oPgogI2luY2x1ZGUgPGFzbS9jbXB4Y2hnLmg+CiAKLS8qIGF0b21pY190IHNob3VsZCBiZSAzMiBiaXQgc2lnbmVkIHR5cGUgKi8KLQogLyoKICAqIEF0b21pYyBvcGVyYXRpb25zIHRoYXQgQyBjYW4ndCBndWFyYW50ZWUgdXMuICBVc2VmdWwgZm9yCiAgKiByZXNvdXJjZSBjb3VudGluZyBldGMuLgogICovCiAKLS8qCi0gKiBNYWtlIHN1cmUgZ2NjIGRvZXNuJ3QgdHJ5IHRvIGJlIGNsZXZlciBhbmQgbW92ZSB0aGluZ3MgYXJvdW5kCi0gKiBvbiB1cy4gV2UgbmVlZCB0byB1c2UgX2V4YWN0bHlfIHRoZSBhZGRyZXNzIHRoZSB1c2VyIGdhdmUgdXMsCi0gKiBub3Qgc29tZSBhbGlhcyB0aGF0IGNvbnRhaW5zIHRoZSBzYW1lIGluZm9ybWF0aW9uLgotICovCi10eXBlZGVmIHN0cnVjdCB7Ci0JaW50IGNvdW50ZXI7Ci19IGF0b21pY190OwotCiAjZGVmaW5lIEFUT01JQ19JTklUKGkpCXsgKGkpIH0KIAogLyoqCkBAIC0xOTEsMTEgKzE4MSw3IEBACiAjZGVmaW5lIGF0b21pY19pbmNfcmV0dXJuKHYpICAoYXRvbWljX2FkZF9yZXR1cm4oMSwgdikpCiAjZGVmaW5lIGF0b21pY19kZWNfcmV0dXJuKHYpICAoYXRvbWljX3N1Yl9yZXR1cm4oMSwgdikpCiAKLS8qIEFuIDY0Yml0IGF0b21pYyB0eXBlICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLQlsb25nIGNvdW50ZXI7Ci19IGF0b21pYzY0X3Q7CisvKiBUaGUgNjQtYml0IGF0b21pYyB0eXBlICovCiAKICNkZWZpbmUgQVRPTUlDNjRfSU5JVChpKQl7IChpKSB9CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2J5dGVvcmRlci5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vYnl0ZW9yZGVyLmgKaW5kZXggZjExMGFkNC4uN2M0OTkxNyAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vYnl0ZW9yZGVyLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vYnl0ZW9yZGVyLmgKQEAgLTEsNjUgKzEsNyBAQAogI2lmbmRlZiBfQVNNX1g4Nl9CWVRFT1JERVJfSAogI2RlZmluZSBfQVNNX1g4Nl9CWVRFT1JERVJfSAogCi0jaW5jbHVkZSA8YXNtL3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KLQotI2RlZmluZSBfX0xJVFRMRV9FTkRJQU4KLQotc3RhdGljIGlubGluZSBfX2F0dHJpYnV0ZV9jb25zdF9fIF9fdTMyIF9fYXJjaF9zd2FiMzIoX191MzIgdmFsKQotewotI2lmZGVmIF9faTM4Nl9fCi0jIGlmZGVmIENPTkZJR19YODZfQlNXQVAKLQlhc20oImJzd2FwICUwIiA6ICI9ciIgKHZhbCkgOiAiMCIgKHZhbCkpOwotIyBlbHNlCi0JYXNtKCJ4Y2hnYiAlYjAsJWgwXG5cdCIJLyogc3dhcCBsb3dlciBieXRlcwkqLwotCSAgICAicm9ybCAkMTYsJTBcblx0IgkvKiBzd2FwIHdvcmRzCQkqLwotCSAgICAieGNoZ2IgJWIwLCVoMCIJLyogc3dhcCBoaWdoZXIgYnl0ZXMJKi8KLQkgICAgOiAiPXEiICh2YWwpCi0JICAgIDogIjAiICh2YWwpKTsKLSMgZW5kaWYKLQotI2Vsc2UgLyogX19pMzg2X18gKi8KLQlhc20oImJzd2FwbCAlMCIKLQkgICAgOiAiPXIiICh2YWwpCi0JICAgIDogIjAiICh2YWwpKTsKLSNlbmRpZgotCXJldHVybiB2YWw7Ci19Ci0jZGVmaW5lIF9fYXJjaF9zd2FiMzIgX19hcmNoX3N3YWIzMgotCi1zdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX2NvbnN0X18gX191NjQgX19hcmNoX3N3YWI2NChfX3U2NCB2YWwpCi17Ci0jaWZkZWYgX19pMzg2X18KLQl1bmlvbiB7Ci0JCXN0cnVjdCB7Ci0JCQlfX3UzMiBhOwotCQkJX191MzIgYjsKLQkJfSBzOwotCQlfX3U2NCB1OwotCX0gdjsKLQl2LnUgPSB2YWw7Ci0jIGlmZGVmIENPTkZJR19YODZfQlNXQVAKLQlhc20oImJzd2FwbCAlMCA7IGJzd2FwbCAlMSA7IHhjaGdsICUwLCUxIgotCSAgICA6ICI9ciIgKHYucy5hKSwgIj1yIiAodi5zLmIpCi0JICAgIDogIjAiICh2LnMuYSksICIxIiAodi5zLmIpKTsKLSMgZWxzZQotCXYucy5hID0gX19hcmNoX3N3YWIzMih2LnMuYSk7Ci0Jdi5zLmIgPSBfX2FyY2hfc3dhYjMyKHYucy5iKTsKLQlhc20oInhjaGdsICUwLCUxIgotCSAgICA6ICI9ciIgKHYucy5hKSwgIj1yIiAodi5zLmIpCi0JICAgIDogIjAiICh2LnMuYSksICIxIiAodi5zLmIpKTsKLSMgZW5kaWYKLQlyZXR1cm4gdi51OwotI2Vsc2UgLyogX19pMzg2X18gKi8KLQlhc20oImJzd2FwcSAlMCIKLQkgICAgOiAiPXIiICh2YWwpCi0JICAgIDogIjAiICh2YWwpKTsKLQlyZXR1cm4gdmFsOwotI2VuZGlmCi19Ci0jZGVmaW5lIF9fYXJjaF9zd2FiNjQgX19hcmNoX3N3YWI2NAotCi0jaW5jbHVkZSA8bGludXgvYnl0ZW9yZGVyLmg+CisjaW5jbHVkZSA8YXNtL3N3YWIuaD4KKyNpbmNsdWRlIDxsaW51eC9ieXRlb3JkZXIvbGl0dGxlX2VuZGlhbi5oPgogCiAjZW5kaWYgLyogX0FTTV9YODZfQllURU9SREVSX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3N3YWIuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3N3YWIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDZkNDE3Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vc3dhYi5oCkBAIC0wLDAgKzEsNjEgQEAKKyNpZm5kZWYgX0FTTV9YODZfU1dBQl9ICisjZGVmaW5lIF9BU01fWDg2X1NXQUJfSAorCisjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KKworc3RhdGljIGlubGluZSBfX2F0dHJpYnV0ZV9jb25zdF9fIF9fdTMyIF9fYXJjaF9zd2FiMzIoX191MzIgdmFsKQoreworI2lmZGVmIF9faTM4Nl9fCisjIGlmZGVmIENPTkZJR19YODZfQlNXQVAKKwlhc20oImJzd2FwICUwIiA6ICI9ciIgKHZhbCkgOiAiMCIgKHZhbCkpOworIyBlbHNlCisJYXNtKCJ4Y2hnYiAlYjAsJWgwXG5cdCIJLyogc3dhcCBsb3dlciBieXRlcwkqLworCSAgICAicm9ybCAkMTYsJTBcblx0IgkvKiBzd2FwIHdvcmRzCQkqLworCSAgICAieGNoZ2IgJWIwLCVoMCIJLyogc3dhcCBoaWdoZXIgYnl0ZXMJKi8KKwkgICAgOiAiPXEiICh2YWwpCisJICAgIDogIjAiICh2YWwpKTsKKyMgZW5kaWYKKworI2Vsc2UgLyogX19pMzg2X18gKi8KKwlhc20oImJzd2FwbCAlMCIKKwkgICAgOiAiPXIiICh2YWwpCisJICAgIDogIjAiICh2YWwpKTsKKyNlbmRpZgorCXJldHVybiB2YWw7Cit9CisjZGVmaW5lIF9fYXJjaF9zd2FiMzIgX19hcmNoX3N3YWIzMgorCitzdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX2NvbnN0X18gX191NjQgX19hcmNoX3N3YWI2NChfX3U2NCB2YWwpCit7CisjaWZkZWYgX19pMzg2X18KKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQlfX3UzMiBhOworCQkJX191MzIgYjsKKwkJfSBzOworCQlfX3U2NCB1OworCX0gdjsKKwl2LnUgPSB2YWw7CisjIGlmZGVmIENPTkZJR19YODZfQlNXQVAKKwlhc20oImJzd2FwbCAlMCA7IGJzd2FwbCAlMSA7IHhjaGdsICUwLCUxIgorCSAgICA6ICI9ciIgKHYucy5hKSwgIj1yIiAodi5zLmIpCisJICAgIDogIjAiICh2LnMuYSksICIxIiAodi5zLmIpKTsKKyMgZWxzZQorCXYucy5hID0gX19hcmNoX3N3YWIzMih2LnMuYSk7CisJdi5zLmIgPSBfX2FyY2hfc3dhYjMyKHYucy5iKTsKKwlhc20oInhjaGdsICUwLCUxIgorCSAgICA6ICI9ciIgKHYucy5hKSwgIj1yIiAodi5zLmIpCisJICAgIDogIjAiICh2LnMuYSksICIxIiAodi5zLmIpKTsKKyMgZW5kaWYKKwlyZXR1cm4gdi51OworI2Vsc2UgLyogX19pMzg2X18gKi8KKwlhc20oImJzd2FwcSAlMCIKKwkgICAgOiAiPXIiICh2YWwpCisJICAgIDogIjAiICh2YWwpKTsKKwlyZXR1cm4gdmFsOworI2VuZGlmCit9CisjZGVmaW5lIF9fYXJjaF9zd2FiNjQgX19hcmNoX3N3YWI2NAorCisjZW5kaWYgLyogX0FTTV9YODZfU1dBQl9IICovCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9zd2lvdGxiLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9zd2lvdGxiLmgKaW5kZXggNTFmYjJjNy4uYjllNGUyMCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vc3dpb3RsYi5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3N3aW90bGIuaApAQCAtMSw0NiArMSwxMCBAQAogI2lmbmRlZiBfQVNNX1g4Nl9TV0lPVExCX0gKICNkZWZpbmUgX0FTTV9YODZfU1dJT1RMQl9ICiAKLSNpbmNsdWRlIDxhc20vZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zd2lvdGxiLmg+CiAKIC8qIFNXSU9UTEIgaW50ZXJmYWNlICovCiAKLWV4dGVybiBkbWFfYWRkcl90IHN3aW90bGJfbWFwX3NpbmdsZShzdHJ1Y3QgZGV2aWNlICpod2Rldiwgdm9pZCAqcHRyLAotCQkJCSAgICAgc2l6ZV90IHNpemUsIGludCBkaXIpOwotZXh0ZXJuIHZvaWQgKnN3aW90bGJfYWxsb2NfY29oZXJlbnQoc3RydWN0IGRldmljZSAqaHdkZXYsIHNpemVfdCBzaXplLAotCQkJCSAgICBkbWFfYWRkcl90ICpkbWFfaGFuZGxlLCBnZnBfdCBmbGFncyk7Ci1leHRlcm4gdm9pZCBzd2lvdGxiX3VubWFwX3NpbmdsZShzdHJ1Y3QgZGV2aWNlICpod2RldiwgZG1hX2FkZHJfdCBkZXZfYWRkciwKLQkJCQkgc2l6ZV90IHNpemUsIGludCBkaXIpOwotZXh0ZXJuIHZvaWQgc3dpb3RsYl9zeW5jX3NpbmdsZV9mb3JfY3B1KHN0cnVjdCBkZXZpY2UgKmh3ZGV2LAotCQkJCQlkbWFfYWRkcl90IGRldl9hZGRyLAotCQkJCQlzaXplX3Qgc2l6ZSwgaW50IGRpcik7Ci1leHRlcm4gdm9pZCBzd2lvdGxiX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2Uoc3RydWN0IGRldmljZSAqaHdkZXYsCi0JCQkJCSAgIGRtYV9hZGRyX3QgZGV2X2FkZHIsCi0JCQkJCSAgIHNpemVfdCBzaXplLCBpbnQgZGlyKTsKLWV4dGVybiB2b2lkIHN3aW90bGJfc3luY19zaW5nbGVfcmFuZ2VfZm9yX2NwdShzdHJ1Y3QgZGV2aWNlICpod2RldiwKLQkJCQkJICAgICAgZG1hX2FkZHJfdCBkZXZfYWRkciwKLQkJCQkJICAgICAgdW5zaWduZWQgbG9uZyBvZmZzZXQsCi0JCQkJCSAgICAgIHNpemVfdCBzaXplLCBpbnQgZGlyKTsKLWV4dGVybiB2b2lkIHN3aW90bGJfc3luY19zaW5nbGVfcmFuZ2VfZm9yX2RldmljZShzdHJ1Y3QgZGV2aWNlICpod2RldiwKLQkJCQkJCSBkbWFfYWRkcl90IGRldl9hZGRyLAotCQkJCQkJIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LAotCQkJCQkJIHNpemVfdCBzaXplLCBpbnQgZGlyKTsKLWV4dGVybiB2b2lkIHN3aW90bGJfc3luY19zZ19mb3JfY3B1KHN0cnVjdCBkZXZpY2UgKmh3ZGV2LAotCQkJCSAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLCBpbnQgbmVsZW1zLAotCQkJCSAgICBpbnQgZGlyKTsKLWV4dGVybiB2b2lkIHN3aW90bGJfc3luY19zZ19mb3JfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmh3ZGV2LAotCQkJCSAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLCBpbnQgbmVsZW1zLAotCQkJCSAgICAgICBpbnQgZGlyKTsKLWV4dGVybiBpbnQgc3dpb3RsYl9tYXBfc2coc3RydWN0IGRldmljZSAqaHdkZXYsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csCi0JCQkgIGludCBuZW50cywgaW50IGRpcmVjdGlvbik7Ci1leHRlcm4gdm9pZCBzd2lvdGxiX3VubWFwX3NnKHN0cnVjdCBkZXZpY2UgKmh3ZGV2LCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLAotCQkJICAgICBpbnQgbmVudHMsIGludCBkaXJlY3Rpb24pOwotZXh0ZXJuIGludCBzd2lvdGxiX2RtYV9tYXBwaW5nX2Vycm9yKHN0cnVjdCBkZXZpY2UgKmh3ZGV2LCBkbWFfYWRkcl90IGRtYV9hZGRyKTsKLWV4dGVybiB2b2lkIHN3aW90bGJfZnJlZV9jb2hlcmVudChzdHJ1Y3QgZGV2aWNlICpod2Rldiwgc2l6ZV90IHNpemUsCi0JCQkJICB2b2lkICp2YWRkciwgZG1hX2FkZHJfdCBkbWFfaGFuZGxlKTsKLWV4dGVybiBpbnQgc3dpb3RsYl9kbWFfc3VwcG9ydGVkKHN0cnVjdCBkZXZpY2UgKmh3ZGV2LCB1NjQgbWFzayk7Ci1leHRlcm4gdm9pZCBzd2lvdGxiX2luaXQodm9pZCk7Ci0KIGV4dGVybiBpbnQgc3dpb3RsYl9mb3JjZTsKIAogI2lmZGVmIENPTkZJR19TV0lPVExCCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS91bndpbmQuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3Vud2luZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjA2NGJkLi4wMDAwMDAwCi0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3Vud2luZC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotI2lmbmRlZiBfQVNNX1g4Nl9VTldJTkRfSAotI2RlZmluZSBfQVNNX1g4Nl9VTldJTkRfSAotCi0jZGVmaW5lIFVOV19QQyhmcmFtZSkgKCh2b2lkKShmcmFtZSksIDBVTCkKLSNkZWZpbmUgVU5XX1NQKGZyYW1lKSAoKHZvaWQpKGZyYW1lKSwgMFVMKQotI2RlZmluZSBVTldfRlAoZnJhbWUpICgodm9pZCkoZnJhbWUpLCAwVUwpCi0KLXN0YXRpYyBpbmxpbmUgaW50IGFyY2hfdW53X3VzZXJfbW9kZShjb25zdCB2b2lkICppbmZvKQotewotCXJldHVybiAwOwotfQotCi0jZW5kaWYgLyogX0FTTV9YODZfVU5XSU5EX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9sb25naGF1bC5jIGIvYXJjaC94ODYva2VybmVsL2NwdS9jcHVmcmVxL2xvbmdoYXVsLmMKaW5kZXggYjA0NjE4NS4uYTRjZmY1ZCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2NwdS9jcHVmcmVxL2xvbmdoYXVsLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2NwdS9jcHVmcmVxL2xvbmdoYXVsLmMKQEAgLTk4Miw3ICs5ODIsNyBAQAogCWNhc2UgMTA6CiAJCXByaW50ayhLRVJOX0VSUiBQRlggIlVzZSBhY3BpLWNwdWZyZXEgZHJpdmVyIGZvciBWSUEgQzdcbiIpOwogCWRlZmF1bHQ6Ci0JCTs7CisJCTsKIAl9CiAKIAlyZXR1cm4gLUVOT0RFVjsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9wNC1jbG9ja21vZC5jIGIvYXJjaC94ODYva2VybmVsL2NwdS9jcHVmcmVxL3A0LWNsb2NrbW9kLmMKaW5kZXggYjhlMDVlZS4uYmVlYTQ0NiAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2NwdS9jcHVmcmVxL3A0LWNsb2NrbW9kLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2NwdS9jcHVmcmVxL3A0LWNsb2NrbW9kLmMKQEAgLTE2MCw2ICsxNjAsNyBAQAogCQlzd2l0Y2ggKGMtPng4Nl9tb2RlbCkgewogCQljYXNlIDB4MEU6IC8qIENvcmUgKi8KIAkJY2FzZSAweDBGOiAvKiBDb3JlIER1byAqLworCQljYXNlIDB4MTY6IC8qIENlbGVyb24gQ29yZSAqLwogCQkJcDRjbG9ja21vZF9kcml2ZXIuZmxhZ3MgfD0gQ1BVRlJFUV9DT05TVF9MT09QUzsKIAkJCXJldHVybiBzcGVlZHN0ZXBfZ2V0X3Byb2Nlc3Nvcl9mcmVxdWVuY3koU1BFRURTVEVQX1BST0NFU1NPUl9QQ09SRSk7CiAJCWNhc2UgMHgwRDogLyogUGVudGl1bSBNIChEb3RoYW4pICovCkBAIC0xNzEsNyArMTcyLDkgQEAKIAl9CiAKIAlpZiAoYy0+eDg2ICE9IDB4RikgewotCQlwcmludGsoS0VSTl9XQVJOSU5HIFBGWCAiVW5rbm93biBwNC1jbG9ja21vZC1jYXBhYmxlIENQVS4gUGxlYXNlIHNlbmQgYW4gZS1tYWlsIHRvIDxjcHVmcmVxQHZnZXIua2VybmVsLm9yZz5cbiIpOworCQlpZiAoIWNwdV9oYXMoYywgWDg2X0ZFQVRVUkVfRVNUKSkKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgUEZYICJVbmtub3duIHA0LWNsb2NrbW9kLWNhcGFibGUgQ1BVLiAiCisJCQkJIlBsZWFzZSBzZW5kIGFuIGUtbWFpbCB0byA8Y3B1ZnJlcUB2Z2VyLmtlcm5lbC5vcmc+XG4iKTsKIAkJcmV0dXJuIDA7CiAJfQogCkBAIC0yNzQsNiArMjc3LDcgQEAKIAkubmFtZQkJPSAicDQtY2xvY2ttb2QiLAogCS5vd25lcgkJPSBUSElTX01PRFVMRSwKIAkuYXR0cgkJPSBwNGNsb2NrbW9kX2F0dHIsCisJLmhpZGVfaW50ZXJmYWNlCT0gMSwKIH07CiAKIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2NwdS9jcHVmcmVxL3NwZWVkc3RlcC1jZW50cmluby5jIGIvYXJjaC94ODYva2VybmVsL2NwdS9jcHVmcmVxL3NwZWVkc3RlcC1jZW50cmluby5jCmluZGV4IDNiNWYwNjQuLmYwZWE2ZmEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9zcGVlZHN0ZXAtY2VudHJpbm8uYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvc3BlZWRzdGVwLWNlbnRyaW5vLmMKQEAgLTQ1OSw5ICs0NTksNyBAQAogICogU2V0cyBhIG5ldyBDUFVGcmVxIHBvbGljeS4KICAqLwogc3RydWN0IGFsbG1hc2tzIHsKLQljcHVtYXNrX3QJCW9ubGluZV9wb2xpY3lfY3B1czsKIAljcHVtYXNrX3QJCXNhdmVkX21hc2s7Ci0JY3B1bWFza190CQlzZXRfbWFzazsKIAljcHVtYXNrX3QJCWNvdmVyZWRfY3B1czsKIH07CiAKQEAgLTQ3NSw5ICs0NzMsNyBAQAogCWludAkJCXJldHZhbCA9IDA7CiAJdW5zaWduZWQgaW50CQlqLCBrLCBmaXJzdF9jcHUsIHRtcDsKIAlDUFVNQVNLX0FMTE9DKGFsbG1hc2tzKTsKLQlDUFVNQVNLX1BUUihvbmxpbmVfcG9saWN5X2NwdXMsIGFsbG1hc2tzKTsKIAlDUFVNQVNLX1BUUihzYXZlZF9tYXNrLCBhbGxtYXNrcyk7Ci0JQ1BVTUFTS19QVFIoc2V0X21hc2ssIGFsbG1hc2tzKTsKIAlDUFVNQVNLX1BUUihjb3ZlcmVkX2NwdXMsIGFsbG1hc2tzKTsKIAogCWlmICh1bmxpa2VseShhbGxtYXNrcyA9PSBOVUxMKSkKQEAgLTQ5NywzMCArNDkzLDI4IEBACiAJCWdvdG8gb3V0OwogCX0KIAotI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQotCS8qIGNwdWZyZXEgaG9sZHMgdGhlIGhvdHBsdWcgbG9jaywgc28gd2UgYXJlIHNhZmUgZnJvbSBoZXJlIG9uICovCi0JY3B1c19hbmQoKm9ubGluZV9wb2xpY3lfY3B1cywgY3B1X29ubGluZV9tYXAsIHBvbGljeS0+Y3B1cyk7Ci0jZWxzZQotCSpvbmxpbmVfcG9saWN5X2NwdXMgPSBwb2xpY3ktPmNwdXM7Ci0jZW5kaWYKLQogCSpzYXZlZF9tYXNrID0gY3VycmVudC0+Y3B1c19hbGxvd2VkOwogCWZpcnN0X2NwdSA9IDE7CiAJY3B1c19jbGVhcigqY292ZXJlZF9jcHVzKTsKLQlmb3JfZWFjaF9jcHVfbWFza19ucihqLCAqb25saW5lX3BvbGljeV9jcHVzKSB7CisJZm9yX2VhY2hfY3B1X21hc2tfbnIoaiwgcG9saWN5LT5jcHVzKSB7CisJCWNvbnN0IGNwdW1hc2tfdCAqbWFzazsKKworCQkvKiBjcHVmcmVxIGhvbGRzIHRoZSBob3RwbHVnIGxvY2ssIHNvIHdlIGFyZSBzYWZlIGhlcmUgKi8KKwkJaWYgKCFjcHVfb25saW5lKGopKQorCQkJY29udGludWU7CisKIAkJLyoKIAkJICogU3VwcG9ydCBmb3IgU01QIHN5c3RlbXMuCiAJCSAqIE1ha2Ugc3VyZSB3ZSBhcmUgcnVubmluZyBvbiBDUFUgdGhhdCB3YW50cyB0byBjaGFuZ2UgZnJlcQogCQkgKi8KLQkJY3B1c19jbGVhcigqc2V0X21hc2spOwogCQlpZiAocG9saWN5LT5zaGFyZWRfdHlwZSA9PSBDUFVGUkVRX1NIQVJFRF9UWVBFX0FOWSkKLQkJCWNwdXNfb3IoKnNldF9tYXNrLCAqc2V0X21hc2ssICpvbmxpbmVfcG9saWN5X2NwdXMpOworCQkJbWFzayA9ICZwb2xpY3ktPmNwdXM7CiAJCWVsc2UKLQkJCWNwdV9zZXQoaiwgKnNldF9tYXNrKTsKKwkJCW1hc2sgPSAmY3B1bWFza19vZl9jcHUoaik7CiAKLQkJc2V0X2NwdXNfYWxsb3dlZF9wdHIoY3VycmVudCwgc2V0X21hc2spOworCQlzZXRfY3B1c19hbGxvd2VkX3B0cihjdXJyZW50LCBtYXNrKTsKIAkJcHJlZW1wdF9kaXNhYmxlKCk7Ci0JCWlmICh1bmxpa2VseSghY3B1X2lzc2V0KHNtcF9wcm9jZXNzb3JfaWQoKSwgKnNldF9tYXNrKSkpIHsKKwkJaWYgKHVubGlrZWx5KCFjcHVfaXNzZXQoc21wX3Byb2Nlc3Nvcl9pZCgpLCAqbWFzaykpKSB7CiAJCQlkcHJpbnRrKCJjb3VsZG4ndCBsaW1pdCB0byBDUFVzIGluIHRoaXMgZG9tYWluXG4iKTsKIAkJCXJldHZhbCA9IC1FQUdBSU47CiAJCQlpZiAoZmlyc3RfY3B1KSB7CkBAIC01NDgsNyArNTQyLDkgQEAKIAkJCWRwcmludGsoInRhcmdldD0lZGtIeiBvbGQ9JWQgbmV3PSVkIG1zcj0lMDR4XG4iLAogCQkJCXRhcmdldF9mcmVxLCBmcmVxcy5vbGQsIGZyZXFzLm5ldywgbXNyKTsKIAotCQkJZm9yX2VhY2hfY3B1X21hc2tfbnIoaywgKm9ubGluZV9wb2xpY3lfY3B1cykgeworCQkJZm9yX2VhY2hfY3B1X21hc2tfbnIoaywgcG9saWN5LT5jcHVzKSB7CisJCQkJaWYgKCFjcHVfb25saW5lKGspKQorCQkJCQljb250aW51ZTsKIAkJCQlmcmVxcy5jcHUgPSBrOwogCQkJCWNwdWZyZXFfbm90aWZ5X3RyYW5zaXRpb24oJmZyZXFzLAogCQkJCQlDUFVGUkVRX1BSRUNIQU5HRSk7CkBAIC01NzEsNyArNTY3LDkgQEAKIAkJcHJlZW1wdF9lbmFibGUoKTsKIAl9CiAKLQlmb3JfZWFjaF9jcHVfbWFza19ucihrLCAqb25saW5lX3BvbGljeV9jcHVzKSB7CisJZm9yX2VhY2hfY3B1X21hc2tfbnIoaywgcG9saWN5LT5jcHVzKSB7CisJCWlmICghY3B1X29ubGluZShrKSkKKwkJCWNvbnRpbnVlOwogCQlmcmVxcy5jcHUgPSBrOwogCQljcHVmcmVxX25vdGlmeV90cmFuc2l0aW9uKCZmcmVxcywgQ1BVRlJFUV9QT1NUQ0hBTkdFKTsKIAl9CkBAIC01ODQsMTggKzU4MiwxNyBAQAogCQkgKiBCZXN0IGVmZm9ydCB1bmRvLi4KIAkJICovCiAKLQkJaWYgKCFjcHVzX2VtcHR5KCpjb3ZlcmVkX2NwdXMpKQotCQkJZm9yX2VhY2hfY3B1X21hc2tfbnIoaiwgKmNvdmVyZWRfY3B1cykgewotCQkJCXNldF9jcHVzX2FsbG93ZWRfcHRyKGN1cnJlbnQsCi0JCQkJCQkgICAgICZjcHVtYXNrX29mX2NwdShqKSk7Ci0JCQkJd3Jtc3IoTVNSX0lBMzJfUEVSRl9DVEwsIG9sZG1zciwgaCk7Ci0JCQl9CisJCWZvcl9lYWNoX2NwdV9tYXNrX25yKGosICpjb3ZlcmVkX2NwdXMpIHsKKwkJCXNldF9jcHVzX2FsbG93ZWRfcHRyKGN1cnJlbnQsICZjcHVtYXNrX29mX2NwdShqKSk7CisJCQl3cm1zcihNU1JfSUEzMl9QRVJGX0NUTCwgb2xkbXNyLCBoKTsKKwkJfQogCiAJCXRtcCA9IGZyZXFzLm5ldzsKIAkJZnJlcXMubmV3ID0gZnJlcXMub2xkOwogCQlmcmVxcy5vbGQgPSB0bXA7Ci0JCWZvcl9lYWNoX2NwdV9tYXNrX25yKGosICpvbmxpbmVfcG9saWN5X2NwdXMpIHsKLQkJCWZyZXFzLmNwdSA9IGo7CisJCWZvcl9lYWNoX2NwdV9tYXNrX25yKGosIHBvbGljeS0+Y3B1cykgeworCQkJaWYgKCFjcHVfb25saW5lKGopKQorCQkJCWNvbnRpbnVlOwogCQkJY3B1ZnJlcV9ub3RpZnlfdHJhbnNpdGlvbigmZnJlcXMsIENQVUZSRVFfUFJFQ0hBTkdFKTsKIAkJCWNwdWZyZXFfbm90aWZ5X3RyYW5zaXRpb24oJmZyZXFzLCBDUFVGUkVRX1BPU1RDSEFOR0UpOwogCQl9CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvc3BlZWRzdGVwLWxpYi5jIGIvYXJjaC94ODYva2VybmVsL2NwdS9jcHVmcmVxL3NwZWVkc3RlcC1saWIuYwppbmRleCA5OGQ0ZmRiLi5jZGFjN2Q2IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvc3BlZWRzdGVwLWxpYi5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9zcGVlZHN0ZXAtbGliLmMKQEAgLTEzOSw2ICsxMzksMTUgQEAKIAljYXNlIDM6CiAJCWZzYiA9IDE2NjY2NzsKIAkJYnJlYWs7CisJY2FzZSAyOgorCQlmc2IgPSAyMDAwMDA7CisJCWJyZWFrOworCWNhc2UgMDoKKwkJZnNiID0gMjY2NjY3OworCQlicmVhazsKKwljYXNlIDQ6CisJCWZzYiA9IDMzMzMzMzsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcHJpbnRrKEtFUk5fRVJSICJQQ09SRSAtIE1TUl9GU0JfRlJFUSB1bmRlZmluZWQgdmFsdWUiKTsKIAl9CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwva3Byb2Jlcy5jIGIvYXJjaC94ODYva2VybmVsL2twcm9iZXMuYwppbmRleCA2YzI3Njc5Li44ODRkOTg1IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwva3Byb2Jlcy5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9rcHJvYmVzLmMKQEAgLTM3Niw5ICszNzYsMTAgQEAKIAogdm9pZCBfX2twcm9iZXMgYXJjaF9yZW1vdmVfa3Byb2JlKHN0cnVjdCBrcHJvYmUgKnApCiB7Ci0JbXV0ZXhfbG9jaygma3Byb2JlX211dGV4KTsKLQlmcmVlX2luc25fc2xvdChwLT5haW5zbi5pbnNuLCAocC0+YWluc24uYm9vc3RhYmxlID09IDEpKTsKLQltdXRleF91bmxvY2soJmtwcm9iZV9tdXRleCk7CisJaWYgKHAtPmFpbnNuLmluc24pIHsKKwkJZnJlZV9pbnNuX3Nsb3QocC0+YWluc24uaW5zbiwgKHAtPmFpbnNuLmJvb3N0YWJsZSA9PSAxKSk7CisJCXAtPmFpbnNuLmluc24gPSBOVUxMOworCX0KIH0KIAogc3RhdGljIHZvaWQgX19rcHJvYmVzIHNhdmVfcHJldmlvdXNfa3Byb2JlKHN0cnVjdCBrcHJvYmVfY3RsYmxrICprY2IpCkBAIC02OTQsNyArNjk1LDcgQEAKIAkvKgogCSAqIEl0IGlzIHBvc3NpYmxlIHRvIGhhdmUgbXVsdGlwbGUgaW5zdGFuY2VzIGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuCiAJICogdGFzayBlaXRoZXIgYmVjYXVzZSBtdWx0aXBsZSBmdW5jdGlvbnMgaW4gdGhlIGNhbGwgcGF0aCBoYXZlCi0JICogcmV0dXJuIHByb2JlcyBpbnN0YWxsZWQgb24gdGhlbSwgYW5kL29yIG1vcmUgdGhlbiBvbmUKKwkgKiByZXR1cm4gcHJvYmVzIGluc3RhbGxlZCBvbiB0aGVtLCBhbmQvb3IgbW9yZSB0aGFuIG9uZQogCSAqIHJldHVybiBwcm9iZSB3YXMgcmVnaXN0ZXJlZCBmb3IgYSB0YXJnZXQgZnVuY3Rpb24uCiAJICoKIAkgKiBXZSBjYW4gaGFuZGxlIHRoaXMgYmVjYXVzZToKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9tZmdwdF8zMi5jIGIvYXJjaC94ODYva2VybmVsL21mZ3B0XzMyLmMKaW5kZXggYzEyMzE0Yy4uODgxNWYzYyAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL21mZ3B0XzMyLmMKKysrIGIvYXJjaC94ODYva2VybmVsL21mZ3B0XzMyLmMKQEAgLTI1Miw3ICsyNTIsNyBAQAogLyoKICAqIFRoZSBNRlBHVCB0aW1lcnMgb24gdGhlIENTNTUzNiBwcm92aWRlIHVzIHdpdGggc3VpdGFibGUgdGltZXJzIHRvIHVzZQogICogYXMgY2xvY2sgZXZlbnQgc291cmNlcyAtIG5vdCBhcyBnb29kIGFzIGEgSFBFVCBvciBBUElDLCBidXQgY2VydGFpbmx5Ci0gKiBiZXR0ZXIgdGhlbiB0aGUgUElULiAgVGhpcyBpc24ndCBhIGdlbmVyYWwgcHVycG9zZSBNRkdQVCBkcml2ZXIsIGJ1dAorICogYmV0dGVyIHRoYW4gdGhlIFBJVC4gIFRoaXMgaXNuJ3QgYSBnZW5lcmFsIHB1cnBvc2UgTUZHUFQgZHJpdmVyLCBidXQKICAqIGEgc2ltcGxpZmllZCBvbmUgZGVzaWduZWQgc3BlY2lmaWNhbGx5IHRvIGFjdCBhcyBhIGNsb2NrIGV2ZW50IHNvdXJjZS4KICAqIEZvciBmdWxsIGRldGFpbHMgYWJvdXQgdGhlIE1GR1BULCBwbGVhc2UgY29uc3VsdCB0aGUgQ1M1NTM2IGRhdGEgc2hlZXQuCiAgKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9wY2ktZG1hLmMgYi9hcmNoL3g4Ni9rZXJuZWwvcGNpLWRtYS5jCmluZGV4IDE5YTEwNDQuLmIyNTQyODUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9wY2ktZG1hLmMKKysrIGIvYXJjaC94ODYva2VybmVsL3BjaS1kbWEuYwpAQCAtMzgsNyArMzgsNyBAQAogICAgYmUgcHJvYmFibHkgYSBzbWFsbGVyIERNQSBtYXNrLCBidXQgdGhpcyBpcyBidWctdG8tYnVnIGNvbXBhdGlibGUKICAgIHRvIG9sZGVyIGkzODYuICovCiBzdHJ1Y3QgZGV2aWNlIHg4Nl9kbWFfZmFsbGJhY2tfZGV2ID0gewotCS5idXNfaWQgPSAiZmFsbGJhY2sgZGV2aWNlIiwKKwkuaW5pdF9uYW1lID0gImZhbGxiYWNrIGRldmljZSIsCiAJLmNvaGVyZW50X2RtYV9tYXNrID0gRE1BXzMyQklUX01BU0ssCiAJLmRtYV9tYXNrID0gJng4Nl9kbWFfZmFsbGJhY2tfZGV2LmNvaGVyZW50X2RtYV9tYXNrLAogfTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9wY2ktc3dpb3RsYl82NC5jIGIvYXJjaC94ODYva2VybmVsL3BjaS1zd2lvdGxiXzY0LmMKaW5kZXggMjQyYzM0NC4uZDU5YzkxNyAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL3BjaS1zd2lvdGxiXzY0LmMKKysrIGIvYXJjaC94ODYva2VybmVsL3BjaS1zd2lvdGxiXzY0LmMKQEAgLTEzLDcgKzEzLDcgQEAKIAogaW50IHN3aW90bGIgX19yZWFkX21vc3RseTsKIAotdm9pZCAqc3dpb3RsYl9hbGxvY19ib290KHNpemVfdCBzaXplLCB1bnNpZ25lZCBsb25nIG5zbGFicykKK3ZvaWQgKiBfX2luaXQgc3dpb3RsYl9hbGxvY19ib290KHNpemVfdCBzaXplLCB1bnNpZ25lZCBsb25nIG5zbGFicykKIHsKIAlyZXR1cm4gYWxsb2NfYm9vdG1lbV9sb3dfcGFnZXMoc2l6ZSk7CiB9CkBAIC0yMyw3ICsyMyw3IEBACiAJcmV0dXJuICh2b2lkICopX19nZXRfZnJlZV9wYWdlcyhHRlBfRE1BIHwgX19HRlBfTk9XQVJOLCBvcmRlcik7CiB9CiAKLWRtYV9hZGRyX3Qgc3dpb3RsYl9waHlzX3RvX2J1cyhwaHlzX2FkZHJfdCBwYWRkcikKK2RtYV9hZGRyX3Qgc3dpb3RsYl9waHlzX3RvX2J1cyhzdHJ1Y3QgZGV2aWNlICpod2RldiwgcGh5c19hZGRyX3QgcGFkZHIpCiB7CiAJcmV0dXJuIHBhZGRyOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3RyYXBzLmMgYi9hcmNoL3g4Ni9rZXJuZWwvdHJhcHMuYwppbmRleCBjZTY2NTBlLi5jOWE2NjZjIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvdHJhcHMuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvdHJhcHMuYwpAQCAtMjAsNyArMjAsNiBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotI2luY2x1ZGUgPGxpbnV4L3Vud2luZC5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9rZXhlYy5oPgpAQCAtNTEsNyArNTAsNiBAQAogI2luY2x1ZGUgPGFzbS9kZWJ1Z3JlZy5oPgogI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+Ci0jaW5jbHVkZSA8YXNtL3Vud2luZC5oPgogI2luY2x1ZGUgPGFzbS90cmFwcy5oPgogI2luY2x1ZGUgPGFzbS9kZXNjLmg+CiAjaW5jbHVkZSA8YXNtL2kzODcuaD4KZGlmZiAtLWdpdCBhL2FyY2gveDg2L21tL2ZhdWx0LmMgYi9hcmNoL3g4Ni9tbS9mYXVsdC5jCmluZGV4IDU3ZWM4YzguLjllMjY4YjZiIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9tbS9mYXVsdC5jCisrKyBiL2FyY2gveDg2L21tL2ZhdWx0LmMKQEAgLTY2Nyw3ICs2NjcsNiBAQAogCWlmICh1bmxpa2VseShpbl9hdG9taWMoKSB8fCAhbW0pKQogCQlnb3RvIGJhZF9hcmVhX25vc2VtYXBob3JlOwogCi1hZ2FpbjoKIAkvKgogCSAqIFdoZW4gcnVubmluZyBpbiB0aGUga2VybmVsIHdlIGV4cGVjdCBmYXVsdHMgdG8gb2NjdXIgb25seSB0bwogCSAqIGFkZHJlc3NlcyBpbiB1c2VyIHNwYWNlLiAgQWxsIG90aGVyIGZhdWx0cyByZXByZXNlbnQgZXJyb3JzIGluIHRoZQpAQCAtODU5LDI1ICs4NTgsMTQgQEAKIAlvb3BzX2VuZChmbGFncywgcmVncywgc2lnKTsKICNlbmRpZgogCi0vKgotICogV2UgcmFuIG91dCBvZiBtZW1vcnksIG9yIHNvbWUgb3RoZXIgdGhpbmcgaGFwcGVuZWQgdG8gdXMgdGhhdCBtYWRlCi0gKiB1cyB1bmFibGUgdG8gaGFuZGxlIHRoZSBwYWdlIGZhdWx0IGdyYWNlZnVsbHkuCi0gKi8KIG91dF9vZl9tZW1vcnk6CisJLyoKKwkgKiBXZSByYW4gb3V0IG9mIG1lbW9yeSwgY2FsbCB0aGUgT09NIGtpbGxlciwgYW5kIHJldHVybiB0aGUgdXNlcnNwYWNlCisJICogKHdoaWNoIHdpbGwgcmV0cnkgdGhlIGZhdWx0LCBvciBraWxsIHVzIGlmIHdlIGdvdCBvb20ta2lsbGVkKS4KKwkgKi8KIAl1cF9yZWFkKCZtbS0+bW1hcF9zZW0pOwotCWlmIChpc19nbG9iYWxfaW5pdCh0c2spKSB7Ci0JCXlpZWxkKCk7Ci0JCS8qCi0JCSAqIFJlLWxvb2t1cCB0aGUgdm1hIC0gaW4gdGhlb3J5IHRoZSB2bWEgdHJlZSBtaWdodAotCQkgKiBoYXZlIGNoYW5nZWQ6Ci0JCSAqLwotCQlnb3RvIGFnYWluOwotCX0KLQotCXByaW50aygiVk06IGtpbGxpbmcgcHJvY2VzcyAlc1xuIiwgdHNrLT5jb21tKTsKLQlpZiAoZXJyb3JfY29kZSAmIFBGX1VTRVIpCi0JCWRvX2dyb3VwX2V4aXQoU0lHS0lMTCk7Ci0JZ290byBub19jb250ZXh0OworCXBhZ2VmYXVsdF9vdXRfb2ZfbWVtb3J5KCk7CisJcmV0dXJuOwogCiBkb19zaWdidXM6CiAJdXBfcmVhZCgmbW0tPm1tYXBfc2VtKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L21tL2luaXRfMzIuYyBiL2FyY2gveDg2L21tL2luaXRfMzIuYwppbmRleCBmOTlhNmM2Li44OGYxYjEwIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9tbS9pbml0XzMyLmMKKysrIGIvYXJjaC94ODYvbW0vaW5pdF8zMi5jCkBAIC0zMjgsNiArMzI4LDggQEAKIHsKIAlpZiAocGFnZW5yIDw9IDI1NikKIAkJcmV0dXJuIDE7CisJaWYgKGlvbWVtX2lzX2V4Y2x1c2l2ZShwYWdlbnIgPDwgUEFHRV9TSElGVCkpCisJCXJldHVybiAwOwogCWlmICghcGFnZV9pc19yYW0ocGFnZW5yKSkKIAkJcmV0dXJuIDE7CiAJcmV0dXJuIDA7CkBAIC0xMDc5LDcgKzEwODEsNyBAQAogCXVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuID0gc3RhcnQgPj4gUEFHRV9TSElGVDsKIAl1bnNpZ25lZCBsb25nIG5yX3BhZ2VzID0gc2l6ZSA+PiBQQUdFX1NISUZUOwogCi0JcmV0dXJuIF9fYWRkX3BhZ2VzKHpvbmUsIHN0YXJ0X3BmbiwgbnJfcGFnZXMpOworCXJldHVybiBfX2FkZF9wYWdlcyhuaWQsIHpvbmUsIHN0YXJ0X3BmbiwgbnJfcGFnZXMpOwogfQogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L21tL2luaXRfNjQuYyBiL2FyY2gveDg2L21tL2luaXRfNjQuYwppbmRleCA5ZjdhMGQyLi4yM2Y2OGU3IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9tbS9pbml0XzY0LmMKKysrIGIvYXJjaC94ODYvbW0vaW5pdF82NC5jCkBAIC04NTcsNyArODU3LDcgQEAKIAlpZiAobGFzdF9tYXBwZWRfcGZuID4gbWF4X3Bmbl9tYXBwZWQpCiAJCW1heF9wZm5fbWFwcGVkID0gbGFzdF9tYXBwZWRfcGZuOwogCi0JcmV0ID0gX19hZGRfcGFnZXMoem9uZSwgc3RhcnRfcGZuLCBucl9wYWdlcyk7CisJcmV0ID0gX19hZGRfcGFnZXMobmlkLCB6b25lLCBzdGFydF9wZm4sIG5yX3BhZ2VzKTsKIAlXQVJOX09OX09OQ0UocmV0KTsKIAogCXJldHVybiByZXQ7CkBAIC04ODgsNiArODg4LDggQEAKIHsKIAlpZiAocGFnZW5yIDw9IDI1NikKIAkJcmV0dXJuIDE7CisJaWYgKGlvbWVtX2lzX2V4Y2x1c2l2ZShwYWdlbnIgPDwgUEFHRV9TSElGVCkpCisJCXJldHVybiAwOwogCWlmICghcGFnZV9pc19yYW0ocGFnZW5yKSkKIAkJcmV0dXJuIDE7CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9tbS9udW1hXzMyLmMgYi9hcmNoL3g4Ni9tbS9udW1hXzMyLmMKaW5kZXggODUxOGM2Ny4uZDFmNzQzOSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvbW0vbnVtYV8zMi5jCisrKyBiL2FyY2gveDg2L21tL251bWFfMzIuYwpAQCAtMjM5LDcgKzIzOSw3IEBACiAJCXN0YXJ0X3BmbiA9IG5vZGVfcmVtYXBfc3RhcnRfcGZuW25vZGVdOwogCQlzaXplID0gbm9kZV9yZW1hcF9zaXplW25vZGVdOwogCi0JCXByaW50ayhLRVJOX0RFQlVHICIlczogbm9kZSAlZFxuIiwgX19GVU5DVElPTl9fLCBub2RlKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBub2RlICVkXG4iLCBfX2Z1bmNfXywgbm9kZSk7CiAKIAkJZm9yIChwZm4gPSAwOyBwZm4gPCBzaXplOyBwZm4gKz0gUFRSU19QRVJfUFRFKSB7CiAJCQl1bnNpZ25lZCBsb25nIHZhZGRyID0gc3RhcnRfdmEgKyAocGZuIDw8IFBBR0VfU0hJRlQpOwpAQCAtMjUxLDcgKzI1MSw3IEBACiAJCQkJCQlQQUdFX0tFUk5FTF9MQVJHRV9FWEVDKSk7CiAKIAkJCXByaW50ayhLRVJOX0RFQlVHICIlczogJTA4bHggLT4gcGZuICUwOGx4XG4iLAotCQkJCV9fRlVOQ1RJT05fXywgdmFkZHIsIHN0YXJ0X3BmbiArIHBmbik7CisJCQkJX19mdW5jX18sIHZhZGRyLCBzdGFydF9wZm4gKyBwZm4pOwogCQl9CiAJfQogfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvcGNpL2FjcGkuYyBiL2FyY2gveDg2L3BjaS9hY3BpLmMKaW5kZXggOWU1NzUyZi4uYzBlY2YyNSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvcGNpL2FjcGkuYworKysgYi9hcmNoL3g4Ni9wY2kvYWNwaS5jCkBAIC0yMTAsMTEgKzIxMCwxMCBAQAogCWlmIChidXMgJiYgbm9kZSAhPSAtMSkgewogI2lmZGVmIENPTkZJR19BQ1BJX05VTUEKIAkJaWYgKHB4bSA+PSAwKQotCQkJcHJpbnRrKEtFUk5fREVCVUcgImJ1cyAlMDJ4IC0+IHB4bSAlZCAtPiBub2RlICVkXG4iLAotCQkJCWJ1c251bSwgcHhtLCBub2RlKTsKKwkJCWRldl9wcmludGsoS0VSTl9ERUJVRywgJmJ1cy0+ZGV2LAorCQkJCSAgICJvbiBOVU1BIG5vZGUgJWQgKHB4bSAlZClcbiIsIG5vZGUsIHB4bSk7CiAjZWxzZQotCQlwcmludGsoS0VSTl9ERUJVRyAiYnVzICUwMnggLT4gbm9kZSAlZFxuIiwKLQkJCWJ1c251bSwgbm9kZSk7CisJCWRldl9wcmludGsoS0VSTl9ERUJVRywgJmJ1cy0+ZGV2LCAib24gTlVNQSBub2RlICVkXG4iLCBub2RlKTsKICNlbmRpZgogCX0KIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvcGNpL2NvbW1vbi5jIGIvYXJjaC94ODYvcGNpL2NvbW1vbi5jCmluZGV4IDYyZGRiNzMuLjgyZDIyZmMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3BjaS9jb21tb24uYworKysgYi9hcmNoL3g4Ni9wY2kvY29tbW9uLmMKQEAgLTU1MSwxNyArNTUxLDI1IEBACiAJaWYgKChlcnIgPSBwY2lfZW5hYmxlX3Jlc291cmNlcyhkZXYsIG1hc2spKSA8IDApCiAJCXJldHVybiBlcnI7CiAKLQlpZiAoIWRldi0+bXNpX2VuYWJsZWQpCisJaWYgKCFwY2lfZGV2X21zaV9lbmFibGVkKGRldikpCiAJCXJldHVybiBwY2liaW9zX2VuYWJsZV9pcnEoZGV2KTsKIAlyZXR1cm4gMDsKIH0KIAogdm9pZCBwY2liaW9zX2Rpc2FibGVfZGV2aWNlIChzdHJ1Y3QgcGNpX2RldiAqZGV2KQogewotCWlmICghZGV2LT5tc2lfZW5hYmxlZCAmJiBwY2liaW9zX2Rpc2FibGVfaXJxKQorCWlmICghcGNpX2Rldl9tc2lfZW5hYmxlZChkZXYpICYmIHBjaWJpb3NfZGlzYWJsZV9pcnEpCiAJCXBjaWJpb3NfZGlzYWJsZV9pcnEoZGV2KTsKIH0KIAoraW50IHBjaV9leHRfY2ZnX2F2YWlsKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJaWYgKHJhd19wY2lfZXh0X29wcykKKwkJcmV0dXJuIDE7CisJZWxzZQorCQlyZXR1cm4gMDsKK30KKwogc3RydWN0IHBjaV9idXMgKiBfX2RldmluaXQgcGNpX3NjYW5fYnVzX29uX25vZGUoaW50IGJ1c25vLCBzdHJ1Y3QgcGNpX29wcyAqb3BzLCBpbnQgbm9kZSkKIHsKIAlzdHJ1Y3QgcGNpX2J1cyAqYnVzID0gTlVMTDsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3BjaS9pMzg2LmMgYi9hcmNoL3g4Ni9wY2kvaTM4Ni5jCmluZGV4IGU1MWJmMmMuLmY4ODQ3NDAgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3BjaS9pMzg2LmMKKysrIGIvYXJjaC94ODYvcGNpL2kzODYuYwpAQCAtMTI5LDcgKzEyOSw3IEBACiAJCQkJcHIgPSBwY2lfZmluZF9wYXJlbnRfcmVzb3VyY2UoZGV2LCByKTsKIAkJCQlpZiAoIXItPnN0YXJ0IHx8ICFwciB8fAogCQkJCSAgICByZXF1ZXN0X3Jlc291cmNlKHByLCByKSA8IDApIHsKLQkJCQkJZGV2X2VycigmZGV2LT5kZXYsICJCQVIgJWQ6IGNhbid0IGFsbG9jYXRlIHJlc291cmNlXG4iLCBpZHgpOworCQkJCQlkZXZfaW5mbygmZGV2LT5kZXYsICJCQVIgJWQ6IGNhbid0IGFsbG9jYXRlIHJlc291cmNlXG4iLCBpZHgpOwogCQkJCQkvKgogCQkJCQkgKiBTb21ldGhpbmcgaXMgd3Jvbmcgd2l0aCB0aGUgcmVnaW9uLgogCQkJCQkgKiBJbnZhbGlkYXRlIHRoZSByZXNvdXJjZSB0byBwcmV2ZW50CkBAIC0xNzAsNyArMTcwLDcgQEAKIAkJCQkJci0+ZmxhZ3MsIGRpc2FibGVkLCBwYXNzKTsKIAkJCQlwciA9IHBjaV9maW5kX3BhcmVudF9yZXNvdXJjZShkZXYsIHIpOwogCQkJCWlmICghcHIgfHwgcmVxdWVzdF9yZXNvdXJjZShwciwgcikgPCAwKSB7Ci0JCQkJCWRldl9lcnIoJmRldi0+ZGV2LCAiQkFSICVkOiBjYW4ndCBhbGxvY2F0ZSByZXNvdXJjZVxuIiwgaWR4KTsKKwkJCQkJZGV2X2luZm8oJmRldi0+ZGV2LCAiQkFSICVkOiBjYW4ndCBhbGxvY2F0ZSByZXNvdXJjZVxuIiwgaWR4KTsKIAkJCQkJLyogV2UnbGwgYXNzaWduIGEgbmV3IGFkZHJlc3MgbGF0ZXIgKi8KIAkJCQkJci0+ZW5kIC09IHItPnN0YXJ0OwogCQkJCQlyLT5zdGFydCA9IDA7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9wY2kvaW5pdC5jIGIvYXJjaC94ODYvcGNpL2luaXQuYwppbmRleCBiZWMzYjA0Li4yNWExZjhlIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9wY2kvaW5pdC5jCisrKyBiL2FyY2gveDg2L3BjaS9pbml0LmMKQEAgLTEyLDcgKzEyLDggQEAKIAl0eXBlID0gcGNpX2RpcmVjdF9wcm9iZSgpOwogI2VuZGlmCiAKLQlwY2lfbW1jZmdfZWFybHlfaW5pdCgpOworCWlmICghKHBjaV9wcm9iZSAmIFBDSV9QUk9CRV9OT0VBUkxZKSkKKwkJcGNpX21tY2ZnX2Vhcmx5X2luaXQoKTsKIAogI2lmZGVmIENPTkZJR19QQ0lfT0xQQwogCWlmICghcGNpX29scGNfaW5pdCgpKQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvcGNpL2lycS5jIGIvYXJjaC94ODYvcGNpL2lycS5jCmluZGV4IDM3M2I5YWYuLjQwNjQzNDUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3BjaS9pcnEuYworKysgYi9hcmNoL3g4Ni9wY2kvaXJxLmMKQEAgLTUzMyw3ICs1MzMsNyBAQAogewogCXN0cnVjdCBwY2lfZGV2ICpicmlkZ2U7CiAJaW50IHBpbiA9IHBjaV9nZXRfaW50ZXJydXB0X3BpbihkZXYsICZicmlkZ2UpOwotCXJldHVybiBwY2liaW9zX3NldF9pcnFfcm91dGluZyhicmlkZ2UsIHBpbiwgaXJxKTsKKwlyZXR1cm4gcGNpYmlvc19zZXRfaXJxX3JvdXRpbmcoYnJpZGdlLCBwaW4gLSAxLCBpcnEpOwogfQogCiAjZW5kaWYKQEAgLTg4Nyw3ICs4ODcsNiBAQAogCQlkZXZfZGJnKCZkZXYtPmRldiwgIm5vIGludGVycnVwdCBwaW5cbiIpOwogCQlyZXR1cm4gMDsKIAl9Ci0JcGluID0gcGluIC0gMTsKIAogCS8qIEZpbmQgSVJRIHJvdXRpbmcgZW50cnkgKi8KIApAQCAtODk3LDE3ICs4OTYsMTcgQEAKIAlpbmZvID0gcGlycV9nZXRfaW5mbyhkZXYpOwogCWlmICghaW5mbykgewogCQlkZXZfZGJnKCZkZXYtPmRldiwgIlBDSSBJTlQgJWMgbm90IGZvdW5kIGluIHJvdXRpbmcgdGFibGVcbiIsCi0JCQknQScgKyBwaW4pOworCQkJJ0EnICsgcGluIC0gMSk7CiAJCXJldHVybiAwOwogCX0KLQlwaXJxID0gaW5mby0+aXJxW3Bpbl0ubGluazsKLQltYXNrID0gaW5mby0+aXJxW3Bpbl0uYml0bWFwOworCXBpcnEgPSBpbmZvLT5pcnFbcGluIC0gMV0ubGluazsKKwltYXNrID0gaW5mby0+aXJxW3BpbiAtIDFdLmJpdG1hcDsKIAlpZiAoIXBpcnEpIHsKLQkJZGV2X2RiZygmZGV2LT5kZXYsICJQQ0kgSU5UICVjIG5vdCByb3V0ZWRcbiIsICdBJyArIHBpbik7CisJCWRldl9kYmcoJmRldi0+ZGV2LCAiUENJIElOVCAlYyBub3Qgcm91dGVkXG4iLCAnQScgKyBwaW4gLSAxKTsKIAkJcmV0dXJuIDA7CiAJfQogCWRldl9kYmcoJmRldi0+ZGV2LCAiUENJIElOVCAlYyAtPiBQSVJRICUwMngsIG1hc2sgJTA0eCwgZXhjbCAlMDR4IiwKLQkJJ0EnICsgcGluLCBwaXJxLCBtYXNrLCBwaXJxX3RhYmxlLT5leGNsdXNpdmVfaXJxcyk7CisJCSdBJyArIHBpbiAtIDEsIHBpcnEsIG1hc2ssIHBpcnFfdGFibGUtPmV4Y2x1c2l2ZV9pcnFzKTsKIAltYXNrICY9IHBjaWJpb3NfaXJxX21hc2s7CiAKIAkvKiBXb3JrIGFyb3VuZCBicm9rZW4gSFAgUGF2aWxpb24gTm90ZWJvb2tzIHdoaWNoIGFzc2lnbiBVU0IgdG8KQEAgLTk0OSw3ICs5NDgsNyBAQAogCQkJCW5ld2lycSA9IGk7CiAJCX0KIAl9Ci0JZGV2X2RiZygmZGV2LT5kZXYsICJQQ0kgSU5UICVjIC0+IG5ld2lycSAlZCIsICdBJyArIHBpbiwgbmV3aXJxKTsKKwlkZXZfZGJnKCZkZXYtPmRldiwgIlBDSSBJTlQgJWMgLT4gbmV3aXJxICVkIiwgJ0EnICsgcGluIC0gMSwgbmV3aXJxKTsKIAogCS8qIENoZWNrIGlmIGl0IGlzIGhhcmRjb2RlZCAqLwogCWlmICgocGlycSAmIDB4ZjApID09IDB4ZjApIHsKQEAgLTk3NywxOCArOTc2LDE4IEBACiAJCQlyZXR1cm4gMDsKIAkJfQogCX0KLQlkZXZfaW5mbygmZGV2LT5kZXYsICIlcyBQQ0kgSU5UICVjIC0+IElSUSAlZFxuIiwgbXNnLCAnQScgKyBwaW4sIGlycSk7CisJZGV2X2luZm8oJmRldi0+ZGV2LCAiJXMgUENJIElOVCAlYyAtPiBJUlEgJWRcbiIsIG1zZywgJ0EnICsgcGluIC0gMSwgaXJxKTsKIAogCS8qIFVwZGF0ZSBJUlEgZm9yIGFsbCBkZXZpY2VzIHdpdGggdGhlIHNhbWUgcGlycSB2YWx1ZSAqLwogCXdoaWxlICgoZGV2MiA9IHBjaV9nZXRfZGV2aWNlKFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIGRldjIpKSAhPSBOVUxMKSB7CiAJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldjIsIFBDSV9JTlRFUlJVUFRfUElOLCAmcGluKTsKIAkJaWYgKCFwaW4pCiAJCQljb250aW51ZTsKLQkJcGluLS07CisKIAkJaW5mbyA9IHBpcnFfZ2V0X2luZm8oZGV2Mik7CiAJCWlmICghaW5mbykKIAkJCWNvbnRpbnVlOwotCQlpZiAoaW5mby0+aXJxW3Bpbl0ubGluayA9PSBwaXJxKSB7CisJCWlmIChpbmZvLT5pcnFbcGluIC0gMV0ubGluayA9PSBwaXJxKSB7CiAJCQkvKgogCQkJICogV2UgcmVmdXNlIHRvIG92ZXJyaWRlIHRoZSBkZXYtPmlycQogCQkJICogaW5mb3JtYXRpb24uIEdpdmUgYSB3YXJuaW5nIQpAQCAtMTA0Miw2ICsxMDQxLDkgQEAKIAlkZXYgPSBOVUxMOwogCXdoaWxlICgoZGV2ID0gcGNpX2dldF9kZXZpY2UoUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgZGV2KSkgIT0gTlVMTCkgewogCQlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIFBDSV9JTlRFUlJVUFRfUElOLCAmcGluKTsKKwkJaWYgKCFwaW4pCisJCQljb250aW51ZTsKKwogI2lmZGVmIENPTkZJR19YODZfSU9fQVBJQwogCQkvKgogCQkgKiBSZWNhbGN1bGF0ZSBJUlEgbnVtYmVycyBpZiB3ZSB1c2UgdGhlIEkvTyBBUElDLgpAQCAtMTA0OSwxNSArMTA1MSwxMSBAQAogCQlpZiAoaW9fYXBpY19hc3NpZ25fcGNpX2lycXMpIHsKIAkJCWludCBpcnE7CiAKLQkJCWlmICghcGluKQotCQkJCWNvbnRpbnVlOwotCiAJCQkvKgogCQkJICogaW50ZXJydXB0IHBpbnMgYXJlIG51bWJlcmVkIHN0YXJ0aW5nIGZyb20gMQogCQkJICovCi0JCQlwaW4tLTsKIAkJCWlycSA9IElPX0FQSUNfZ2V0X1BDSV9pcnFfdmVjdG9yKGRldi0+YnVzLT5udW1iZXIsCi0JCQkJUENJX1NMT1QoZGV2LT5kZXZmbiksIHBpbik7CisJCQkJUENJX1NMT1QoZGV2LT5kZXZmbiksIHBpbiAtIDEpOwogCQkJLyoKIAkJCSAqIEJ1c3NlcyBiZWhpbmQgYnJpZGdlcyBhcmUgdHlwaWNhbGx5IG5vdCBsaXN0ZWQgaW4gdGhlCiAJCQkgKiBNUC10YWJsZS4gIEluIHRoaXMgY2FzZSB3ZSBoYXZlIHRvIGxvb2sgdXAgdGhlIElSUQpAQCAtMTA3MCwyMiArMTA2OCwyMiBAQAogCQkJCXN0cnVjdCBwY2lfZGV2ICpicmlkZ2UgPSBkZXYtPmJ1cy0+c2VsZjsKIAkJCQlpbnQgYnVzOwogCi0JCQkJcGluID0gKHBpbiArIFBDSV9TTE9UKGRldi0+ZGV2Zm4pKSAlIDQ7CisJCQkJcGluID0gcGNpX3N3aXp6bGVfaW50ZXJydXB0X3BpbihkZXYsIHBpbik7CiAJCQkJYnVzID0gYnJpZGdlLT5idXMtPm51bWJlcjsKIAkJCQlpcnEgPSBJT19BUElDX2dldF9QQ0lfaXJxX3ZlY3RvcihidXMsCi0JCQkJCQlQQ0lfU0xPVChicmlkZ2UtPmRldmZuKSwgcGluKTsKKwkJCQkJCVBDSV9TTE9UKGJyaWRnZS0+ZGV2Zm4pLCBwaW4gLSAxKTsKIAkJCQlpZiAoaXJxID49IDApCiAJCQkJCWRldl93YXJuKCZkZXYtPmRldiwKIAkJCQkJCSJ1c2luZyBicmlkZ2UgJXMgSU5UICVjIHRvICIKIAkJCQkJCQkiZ2V0IElSUSAlZFxuIiwKIAkJCQkJCSBwY2lfbmFtZShicmlkZ2UpLAotCQkJCQkJICdBJyArIHBpbiwgaXJxKTsKKwkJCQkJCSAnQScgKyBwaW4gLSAxLCBpcnEpOwogCQkJfQogCQkJaWYgKGlycSA+PSAwKSB7CiAJCQkJZGV2X2luZm8oJmRldi0+ZGV2LAogCQkJCQkiUENJLT5BUElDIElSUSB0cmFuc2Zvcm06IElOVCAlYyAiCiAJCQkJCQkiLT4gSVJRICVkXG4iLAotCQkJCQknQScgKyBwaW4sIGlycSk7CisJCQkJCSdBJyArIHBpbiAtIDEsIGlycSk7CiAJCQkJZGV2LT5pcnEgPSBpcnE7CiAJCQl9CiAJCX0KQEAgLTEwOTMsNyArMTA5MSw3IEBACiAJCS8qCiAJCSAqIFN0aWxsIG5vIElSUT8gVHJ5IHRvIGxvb2t1cCBvbmUuLi4KIAkJICovCi0JCWlmIChwaW4gJiYgIWRldi0+aXJxKQorCQlpZiAoIWRldi0+aXJxKQogCQkJcGNpYmlvc19sb29rdXBfaXJxKGRldiwgMCk7CiAJfQogfQpAQCAtMTIyMCwxMiArMTIxOCwxMCBAQAogCWlmIChwaW4gJiYgIXBjaWJpb3NfbG9va3VwX2lycShkZXYsIDEpICYmICFkZXYtPmlycSkgewogCQljaGFyICptc2cgPSAiIjsKIAotCQlwaW4tLTsgLyogaW50ZXJydXB0IHBpbnMgYXJlIG51bWJlcmVkIHN0YXJ0aW5nIGZyb20gMSAqLwotCiAJCWlmIChpb19hcGljX2Fzc2lnbl9wY2lfaXJxcykgewogCQkJaW50IGlycTsKIAotCQkJaXJxID0gSU9fQVBJQ19nZXRfUENJX2lycV92ZWN0b3IoZGV2LT5idXMtPm51bWJlciwgUENJX1NMT1QoZGV2LT5kZXZmbiksIHBpbik7CisJCQlpcnEgPSBJT19BUElDX2dldF9QQ0lfaXJxX3ZlY3RvcihkZXYtPmJ1cy0+bnVtYmVyLCBQQ0lfU0xPVChkZXYtPmRldmZuKSwgcGluIC0gMSk7CiAJCQkvKgogCQkJICogQnVzc2VzIGJlaGluZCBicmlkZ2VzIGFyZSB0eXBpY2FsbHkgbm90IGxpc3RlZCBpbiB0aGUgTVAtdGFibGUuCiAJCQkgKiBJbiB0aGlzIGNhc2Ugd2UgaGF2ZSB0byBsb29rIHVwIHRoZSBJUlEgYmFzZWQgb24gdGhlIHBhcmVudCBidXMsCkBAIC0xMjM2LDIwICsxMjMyLDIwIEBACiAJCQl3aGlsZSAoaXJxIDwgMCAmJiBkZXYtPmJ1cy0+cGFyZW50KSB7IC8qIGdvIGJhY2sgdG8gdGhlIGJyaWRnZSAqLwogCQkJCXN0cnVjdCBwY2lfZGV2ICpicmlkZ2UgPSBkZXYtPmJ1cy0+c2VsZjsKIAotCQkJCXBpbiA9IChwaW4gKyBQQ0lfU0xPVChkZXYtPmRldmZuKSkgJSA0OworCQkJCXBpbiA9IHBjaV9zd2l6emxlX2ludGVycnVwdF9waW4oZGV2LCBwaW4pOwogCQkJCWlycSA9IElPX0FQSUNfZ2V0X1BDSV9pcnFfdmVjdG9yKGJyaWRnZS0+YnVzLT5udW1iZXIsCi0JCQkJCQlQQ0lfU0xPVChicmlkZ2UtPmRldmZuKSwgcGluKTsKKwkJCQkJCVBDSV9TTE9UKGJyaWRnZS0+ZGV2Zm4pLCBwaW4gLSAxKTsKIAkJCQlpZiAoaXJxID49IDApCiAJCQkJCWRldl93YXJuKCZkZXYtPmRldiwgInVzaW5nIGJyaWRnZSAlcyAiCiAJCQkJCQkgIklOVCAlYyB0byBnZXQgSVJRICVkXG4iLAotCQkJCQkJIHBjaV9uYW1lKGJyaWRnZSksICdBJyArIHBpbiwKKwkJCQkJCSBwY2lfbmFtZShicmlkZ2UpLCAnQScgKyBwaW4gLSAxLAogCQkJCQkJIGlycSk7CiAJCQkJZGV2ID0gYnJpZGdlOwogCQkJfQogCQkJZGV2ID0gdGVtcF9kZXY7CiAJCQlpZiAoaXJxID49IDApIHsKIAkJCQlkZXZfaW5mbygmZGV2LT5kZXYsICJQQ0ktPkFQSUMgSVJRIHRyYW5zZm9ybTogIgotCQkJCQkgIklOVCAlYyAtPiBJUlEgJWRcbiIsICdBJyArIHBpbiwgaXJxKTsKKwkJCQkJICJJTlQgJWMgLT4gSVJRICVkXG4iLCAnQScgKyBwaW4gLSAxLCBpcnEpOwogCQkJCWRldi0+aXJxID0gaXJxOwogCQkJCXJldHVybiAwOwogCQkJfSBlbHNlCkBAIC0xMjY4LDcgKzEyNjQsNyBAQAogCQkJcmV0dXJuIDA7CiAKIAkJZGV2X3dhcm4oJmRldi0+ZGV2LCAiY2FuJ3QgZmluZCBJUlEgZm9yIFBDSSBJTlQgJWMlc1xuIiwKLQkJCSAnQScgKyBwaW4sIG1zZyk7CisJCQkgJ0EnICsgcGluIC0gMSwgbXNnKTsKIAl9CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9wY2kvdmlzd3MuYyBiL2FyY2gveDg2L3BjaS92aXN3cy5jCmluZGV4IDE2ZDBjMGUuLmJjZWFkN2EgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3BjaS92aXN3cy5jCisrKyBiL2FyY2gveDg2L3BjaS92aXN3cy5jCkBAIC0yNCwyNCArMjQsNiBAQAogCiB1bnNpZ25lZCBpbnQgcGNpX2J1czAsIHBjaV9idXMxOwogCi1zdGF0aWMgaW5saW5lIHU4IGJyaWRnZV9zd2l6emxlKHU4IHBpbiwgdTggc2xvdCkgCi17Ci0JcmV0dXJuICgoKHBpbiAtIDEpICsgc2xvdCkgJSA0KSArIDE7Ci19Ci0KLXN0YXRpYyB1OCBfX2luaXQgdmlzd3Nfc3dpenpsZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCAqcGlucCkKLXsKLQl1OCBwaW4gPSAqcGlucDsKLQotCXdoaWxlIChkZXYtPmJ1cy0+c2VsZikgewkvKiBNb3ZlIHVwIHRoZSBjaGFpbiBvZiBicmlkZ2VzLiAqLwotCQlwaW4gPSBicmlkZ2Vfc3dpenpsZShwaW4sIFBDSV9TTE9UKGRldi0+ZGV2Zm4pKTsKLQkJZGV2ID0gZGV2LT5idXMtPnNlbGY7Ci0JfQotCSpwaW5wID0gcGluOwotCi0JcmV0dXJuIFBDSV9TTE9UKGRldi0+ZGV2Zm4pOwotfQotCiBzdGF0aWMgaW50IF9faW5pdCB2aXN3c19tYXBfaXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKIHsKIAlpbnQgaXJxLCBidXMgPSBkZXYtPmJ1cy0+bnVtYmVyOwpAQCAtMTA2LDcgKzg4LDcgQEAKIAlyYXdfcGNpX29wcyA9ICZwY2lfZGlyZWN0X2NvbmYxOwogCXBjaV9zY2FuX2J1c193aXRoX3N5c2RhdGEocGNpX2J1czApOwogCXBjaV9zY2FuX2J1c193aXRoX3N5c2RhdGEocGNpX2J1czEpOwotCXBjaV9maXh1cF9pcnFzKHZpc3dzX3N3aXp6bGUsIHZpc3dzX21hcF9pcnEpOworCXBjaV9maXh1cF9pcnFzKHBjaV9jb21tb25fc3dpenpsZSwgdmlzd3NfbWFwX2lycSk7CiAJcGNpYmlvc19yZXNvdXJjZV9zdXJ2ZXkoKTsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL01ha2VmaWxlIGIvYXJjaC94dGVuc2EvTWFrZWZpbGUKaW5kZXggMDE1YjZiMi4uMWRhNTVmZSAxMDA2NDQKLS0tIGEvYXJjaC94dGVuc2EvTWFrZWZpbGUKKysrIGIvYXJjaC94dGVuc2EvTWFrZWZpbGUKQEAgLTMzLDYgKzMzLDE1IEBACiAKIEtCVUlMRF9DRkxBR1MgKz0gLXBpcGUgLW1sb25nY2FsbHMKIAordmFyZGlycyA6PSAkKHBhdHN1YnN0ICUsYXJjaC94dGVuc2EvdmFyaWFudHMvJS8sJCh2YXJpYW50LXkpKQorcGxmZGlycyA6PSAkKHBhdHN1YnN0ICUsYXJjaC94dGVuc2EvcGxhdGZvcm1zLyUvLCQocGxhdGZvcm0teSkpCisKK2lmZXEgKCQoS0JVSUxEX1NSQyksKQorS0JVSUxEX0NQUEZMQUdTICs9ICQocGF0c3Vic3QgJSwtSSVpbmNsdWRlLCQodmFyZGlycykgJChwbGZkaXJzKSkKK2Vsc2UKK0tCVUlMRF9DUFBGTEFHUyArPSAkKHBhdHN1YnN0ICUsLUkkKHNyY3RyZWUpLyVpbmNsdWRlLCQodmFyZGlycykgJChwbGZkaXJzKSkKK2VuZGlmCisKIEtCVUlMRF9ERUZDT05GSUcgOj0gaXNzX2RlZmNvbmZpZwogCiAjIHJhbWRpc2svaW5pdHJkIHN1cHBvcnQKQEAgLTY2LDIxICs3NSw2IEBACiAKIGJvb3QJCTo9IGFyY2gveHRlbnNhL2Jvb3QKIAotYXJjaGluYwkJOj0gaW5jbHVkZS9hc20teHRlbnNhCi0KLWFyY2hwcmVwYXJlOiAkKGFyY2hpbmMpLy5wbGF0Zm9ybQotCi0jIFVwZGF0ZSBwcm9jZXNzb3IgdmFyaWFudCBhbmQgcGxhdGZvcm0gc3ltbGlua3MgaWYgc29tZXRoaW5nIHdoaWNoIGFmZmVjdHMKLSMgdGhlbSBjaGFuZ2VkLgotCi0kKGFyY2hpbmMpLy5wbGF0Zm9ybTogJCh3aWxkY2FyZCBpbmNsdWRlL2NvbmZpZy9hcmNoLyouaCkgaW5jbHVkZS9jb25maWcvYXV0by5jb25mCi0JQGVjaG8gJyAgU1lNTElOSyAkKGFyY2hpbmMpL3ZhcmlhbnQgLT4gJChhcmNoaW5jKS92YXJpYW50LSQoVkFSSUFOVCknCi0JJChRKW1rZGlyIC1wICQoYXJjaGluYykKLQkkKFEpbG4gLWZzbiAkKHNyY3RyZWUpLyQoYXJjaGluYykvdmFyaWFudC0kKFZBUklBTlQpICQoYXJjaGluYykvdmFyaWFudAotCUBlY2hvICcgIFNZTUxJTksgJChhcmNoaW5jKS9wbGF0Zm9ybSAtPiAkKGFyY2hpbmMpL3BsYXRmb3JtLSQoUExBVEZPUk0pJwotCSQoUSlsbiAtZnNuICQoc3JjdHJlZSkvJChhcmNoaW5jKS9wbGF0Zm9ybS0kKFBMQVRGT1JNKSAkKGFyY2hpbmMpL3BsYXRmb3JtCi0JQHRvdWNoICRACi0KIAogYWxsOiB6SW1hZ2UKIApAQCAtODksMTAgKzgzLDYgQEAKIHpJbWFnZSB6SW1hZ2UuaW5pdHJkOiB2bWxpbnV4CiAJJChRKSQoTUFLRSkgJChidWlsZCk9JChib290KSAkQAogCi1DTEVBTl9GSUxFUwkrPSBhcmNoL3h0ZW5zYS92bWxpbnV4LmxkcyAgICAgICAgICAgICAgICAgICAgICBcCi0JCSAgICQoYXJjaGluYykvcGxhdGZvcm0gJChhcmNoaW5jKS92YXJpYW50CVwKLQkJICAgJChhcmNoaW5jKS8ucGxhdGZvcm0KLQogZGVmaW5lIGFyY2hoZWxwCiAgIEBlY2hvICcqIHpJbWFnZSAgICAgIC0gQ29tcHJlc3NlZCBrZXJuZWwgaW1hZ2UgKGFyY2gveHRlbnNhL2Jvb3QvaW1hZ2VzL3pJbWFnZS4qKScKIGVuZGVmCmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9ib290L2Jvb3QtZWxmL2Jvb3QubGRzLlMgYi9hcmNoL3h0ZW5zYS9ib290L2Jvb3QtZWxmL2Jvb3QubGRzLlMKaW5kZXggODQ5ZGZjYS4uNGU1M2I3NCAxMDA2NDQKLS0tIGEvYXJjaC94dGVuc2EvYm9vdC9ib290LWVsZi9ib290Lmxkcy5TCisrKyBiL2FyY2gveHRlbnNhL2Jvb3QvYm9vdC1lbGYvYm9vdC5sZHMuUwpAQCAtMSw0ICsxLDQgQEAKLSNpbmNsdWRlIDxhc20vdmFyaWFudC9jb3JlLmg+CisjaW5jbHVkZSA8dmFyaWFudC9jb3JlLmg+CiBPVVRQVVRfQVJDSCh4dGVuc2EpCiBFTlRSWShfUmVzZXRWZWN0b3IpCiAKZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL2Jvb3QvYm9vdC1yZWRib290L2Jvb3RzdHJhcC5TIGIvYXJjaC94dGVuc2EvYm9vdC9ib290LXJlZGJvb3QvYm9vdHN0cmFwLlMKaW5kZXggODQ4NDgxMi4uNTU4MmU4YyAxMDA2NDQKLS0tIGEvYXJjaC94dGVuc2EvYm9vdC9ib290LXJlZGJvb3QvYm9vdHN0cmFwLlMKKysrIGIvYXJjaC94dGVuc2EvYm9vdC9ib290LXJlZGJvb3QvYm9vdHN0cmFwLlMKQEAgLTEsNCArMSw0IEBACi0jaW5jbHVkZSA8YXNtL3ZhcmlhbnQvY29yZS5oPgorI2luY2x1ZGUgPHZhcmlhbnQvY29yZS5oPgogI2luY2x1ZGUgPGFzbS9yZWdzLmg+CiAjaW5jbHVkZSA8YXNtL2FzbW1hY3JvLmg+CiAjaW5jbHVkZSA8YXNtL2NhY2hlYXNtLmg+CmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9LYnVpbGQgYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9LYnVpbGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNThjMDJhNAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL0tidWlsZApAQCAtMCwwICsxLDMgQEAKK2luY2x1ZGUgaW5jbHVkZS9hc20tZ2VuZXJpYy9LYnVpbGQuYXNtCisKK3VuaWZkZWYteSArPSBzd2FiLmgKZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL2FzbW1hY3JvLmggYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9hc21tYWNyby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1NTMyMGYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9hc21tYWNyby5oCkBAIC0wLDAgKzEsMTUzIEBACisvKgorICogaW5jbHVkZS9hc20teHRlbnNhL2FzbW1hY3JvLmgKKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgVGVuc2lsaWNhIEluYy4KKyAqLworCisjaWZuZGVmIF9YVEVOU0FfQVNNTUFDUk9fSAorI2RlZmluZSBfWFRFTlNBX0FTTU1BQ1JPX0gKKworI2luY2x1ZGUgPHZhcmlhbnQvY29yZS5oPgorCisvKgorICogU29tZSBsaXR0bGUgaGVscGVycyBmb3IgbG9vcHMuIFVzZSB6ZXJvLW92ZXJoZWFkLWxvb3BzCisgKiB3aGVyZSBhcHBsaWNhYmxlIGFuZCBpZiBzdXBwb3J0ZWQgYnkgdGhlIHByb2Nlc3Nvci4KKyAqCisgKiBfX2xvb3BpIGFyLCBhdCwgc2l6ZSwgaW5jCisgKiAgICAgICAgIGFyCXJlZ2lzdGVyIGluaXRpYWxpemVkIHdpdGggdGhlIHN0YXJ0IGFkZHJlc3MKKyAqCSAgIGF0CXNjcmF0Y2ggcmVnaXN0ZXIgdXNlZCBieSBtYWNybworICoJICAgc2l6ZQlzaXplIGltbWVkaWF0ZSB2YWx1ZQorICoJICAgaW5jCWluY3JlbWVudAorICoKKyAqIF9fbG9vcHMgYXIsIGFzLCBhdCwgaW5jX2xvZzJbLCBtYXNrX2xvZzJdWywgY29uZF1bLCBuY29uZF0KKyAqCSAgIGFyCXJlZ2lzdGVyIGluaXRpYWxpemVkIHdpdGggdGhlIHN0YXJ0IGFkZHJlc3MKKyAqCSAgIGFzCXJlZ2lzdGVyIGluaXRpYWxpemVkIHdpdGggdGhlIHNpemUKKyAqCSAgIGF0CXNjcmF0Y2ggcmVnaXN0ZXIgdXNlIGJ5IG1hY3JvCisgKgkgICBpbmNfbG9nMglpbmNyZW1lbnQgW2luIGxvZzJdCisgKgkgICBtYXNrX2xvZzIJbWFzayBbaW4gbG9nMl0KKyAqCSAgIGNvbmQJCXRydWUgY29uZGl0aW9uICh1c2VkIGluIGxvb3AnY29uZCcpCisgKgkgICBuY29uZAlmYWxzZSBjb25kaXRpb24gKHVzZWQgaW4gYiduY29uZCcpCisgKgorICogX19sb29wICBhcworICoJICAgcmVzdGFydCBsb29wLiAnYXMnIHJlZ2lzdGVyIG11c3Qgbm90IGhhdmUgYmVlbiBtb2RpZmllZCEKKyAqCisgKiBfX2VuZGxhIGFyLCBhdCwgaW5jcgorICoJICAgYXIJc3RhcnQgYWRkcmVzcyAobW9kaWZpZWQpCisgKgkgICBhcwlzY3JhdGNoIHJlZ2lzdGVyIHVzZWQgYnkgbWFjcm8KKyAqCSAgIGluYwlpbmNyZW1lbnQKKyAqLworCisvKgorICogbG9vcCBmb3IgZ2l2ZW4gc2l6ZSBhcyBpbW1lZGlhdGUKKyAqLworCisJLm1hY3JvCV9fbG9vcGkgYXIsIGF0LCBzaXplLCBpbmNyCisKKyNpZiBYQ0hBTF9IQVZFX0xPT1BTCisJCW1vdmkJXGF0LCAoKFxzaXplICsgXGluY3IgLSAxKSAvIChcaW5jcikpCisJCWxvb3AJXGF0LCA5OWYKKyNlbHNlCisJCWFkZGkJXGF0LCBcYXIsIFxzaXplCisJCTk4OgorI2VuZGlmCisKKwkuZW5kbQorCisvKgorICogbG9vcCBmb3IgZ2l2ZW4gc2l6ZSBpbiByZWdpc3RlcgorICovCisKKwkubWFjcm8JX19sb29wcwlhciwgYXMsIGF0LCBpbmNyX2xvZzIsIG1hc2tfbG9nMiwgY29uZCwgbmNvbmQKKworI2lmIFhDSEFMX0hBVkVfTE9PUFMKKwkJLmlmZ3QgXGluY3JfbG9nMiAtIDEKKwkJCWFkZGkJXGF0LCBcYXMsICgxIDw8IFxpbmNyX2xvZzIpIC0gMQorCQkJLmlmbmMgXG1hc2tfbG9nMiwKKwkJCQlleHR1aQlcYXQsIFxhdCwgXGluY3JfbG9nMiwgXG1hc2tfbG9nMgorCQkJLmVsc2UKKwkJCQlzcmxpCVxhdCwgXGF0LCBcaW5jcl9sb2cyCisJCQkuZW5kaWYKKwkJLmVuZGlmCisJCWxvb3BcY29uZAlcYXQsIDk5ZgorI2Vsc2UKKwkJLmlmbmMgXG1hc2tfbG9nMiwKKwkJCWV4dHVpCVxhdCwgXGFzLCBcaW5jcl9sb2cyLCBcbWFza19sb2cyCisJCS5lbHNlCisJCQkuaWZuYyBcbmNvbmQsCisJCQkJc3JsaQlcYXQsIFxhcywgXGluY3JfbG9nMgorCQkJLmVuZGlmCisJCS5lbmRpZgorCQkuaWZuYyBcbmNvbmQsCisJCQliXG5jb25kCVxhdCwgOTlmCisKKwkJLmVuZGlmCisJCS5pZm5jIFxtYXNrX2xvZzIsCisJCQlzbGxpCVxhdCwgXGF0LCBcaW5jcl9sb2cyCisJCQlhZGQJXGF0LCBcYXIsIFxhdAorCQkuZWxzZQorCQkJYWRkCVxhdCwgXGFyLCBcYXMKKwkJLmVuZGlmCisjZW5kaWYKKwkJOTg6CisKKwkuZW5kbQorCisvKgorICogbG9vcCBmcm9tIGFyIHRvIGF4CisgKi8KKworCS5tYWNybwlfX2xvb3B0CWFyLCBhcywgYXQsIGluY3JfbG9nMgorCisjaWYgWENIQUxfSEFWRV9MT09QUworCQlzdWIJXGF0LCBcYXMsIFxhcgorCQkuaWZndAlcaW5jcl9sb2cyIC0gMQorCQkJYWRkaQlcYXQsIFxhdCwgKDEgPDwgXGluY3JfbG9nMikgLSAxCisJCQlzcmxpCVxhdCwgXGF0LCBcaW5jcl9sb2cyCisJCS5lbmRpZgorCQlsb29wCVxhdCwgOTlmCisjZWxzZQorCQk5ODoKKyNlbmRpZgorCisJLmVuZG0KKworLyoKKyAqIHJlc3RhcnQgbG9vcC4gcmVnaXN0ZXJzIG11c3QgYmUgdW5jaGFuZ2VkCisgKi8KKworCS5tYWNybwlfX2xvb3AJYXMKKworI2lmIFhDSEFMX0hBVkVfTE9PUFMKKwkJbG9vcAlcYXMsIDk5ZgorI2Vsc2UKKwkJOTg6CisjZW5kaWYKKworCS5lbmRtCisKKy8qCisgKiBlbmQgb2YgbG9vcCB3aXRoIG5vIGluY3JlbWVudCBvZiB0aGUgYWRkcmVzcy4KKyAqLworCisJLm1hY3JvCV9fZW5kbAlhciwgYXMKKyNpZiAhWENIQUxfSEFWRV9MT09QUworCQlibHR1CVxhciwgXGFzLCA5OGIKKyNlbmRpZgorCQk5OToKKwkuZW5kbQorCisvKgorICogZW5kIG9mIGxvb3Agd2l0aCBpbmNyZW1lbnQgb2YgdGhlIGFkZHJlc3MuCisgKi8KKworCS5tYWNybwlfX2VuZGxhCWFyLCBhcywgaW5jcgorCQlhZGRpCVxhciwgXGFyLCBcaW5jcgorCQlfX2VuZGwJXGFyIFxhcworCS5lbmRtCisKKworI2VuZGlmIC8qIF9YVEVOU0FfQVNNTUFDUk9fSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vYXRvbWljLmggYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9hdG9taWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2FkNjdiCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vYXRvbWljLmgKQEAgLTAsMCArMSwyOTkgQEAKKy8qCisgKiBpbmNsdWRlL2FzbS14dGVuc2EvYXRvbWljLmgKKyAqCisgKiBBdG9taWMgb3BlcmF0aW9ucyB0aGF0IEMgY2FuJ3QgZ3VhcmFudGVlIHVzLiAgVXNlZnVsIGZvciByZXNvdXJjZSBjb3VudGluZy4uCisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxIC0gMjAwNSBUZW5zaWxpY2EgSW5jLgorICovCisKKyNpZm5kZWYgX1hURU5TQV9BVE9NSUNfSAorI2RlZmluZSBfWFRFTlNBX0FUT01JQ19ICisKKyNpbmNsdWRlIDxsaW51eC9zdHJpbmdpZnkuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjaWZkZWYgX19LRVJORUxfXworI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisKKyNkZWZpbmUgQVRPTUlDX0lOSVQoaSkJeyAoaSkgfQorCisvKgorICogVGhpcyBYdGVuc2EgaW1wbGVtZW50YXRpb24gYXNzdW1lcyB0aGF0IHRoZSByaWdodCBtZWNoYW5pc20KKyAqIGZvciBleGNsdXNpb24gaXMgZm9yIGxvY2tpbmcgaW50ZXJydXB0cyB0byBsZXZlbCAxLgorICoKKyAqIExvY2tpbmcgaW50ZXJydXB0cyBsb29rcyBsaWtlIHRoaXM6CisgKgorICogICAgcnNpbCBhMTUsIDEKKyAqICAgIDxjb2RlPgorICogICAgd3NyICBhMTUsIFBTCisgKiAgICByc3luYworICoKKyAqIE5vdGUgdGhhdCBhMTUgaXMgdXNlZCBoZXJlIGJlY2F1c2UgdGhlIHJlZ2lzdGVyIGFsbG9jYXRpb24KKyAqIGRvbmUgYnkgdGhlIGNvbXBpbGVyIGlzIG5vdCBndWFyYW50ZWVkIGFuZCBhIHdpbmRvdyBvdmVyZmxvdworICogbWF5IG5vdCBvY2N1ciBiZXR3ZWVuIHRoZSByc2lsIGFuZCB3c3IgaW5zdHJ1Y3Rpb25zLiBCeSB1c2luZworICogYTE1IGluIHRoZSByc2lsLCB0aGUgbWFjaGluZSBpcyBndWFyYW50ZWVkIHRvIGJlIGluIGEgc3RhdGUKKyAqIHdoZXJlIG5vIHJlZ2lzdGVyIHJlZmVyZW5jZSB3aWxsIGNhdXNlIGFuIG92ZXJmbG93LgorICovCisKKy8qKgorICogYXRvbWljX3JlYWQgLSByZWFkIGF0b21pYyB2YXJpYWJsZQorICogQHY6IHBvaW50ZXIgb2YgdHlwZSBhdG9taWNfdAorICoKKyAqIEF0b21pY2FsbHkgcmVhZHMgdGhlIHZhbHVlIG9mIEB2LgorICovCisjZGVmaW5lIGF0b21pY19yZWFkKHYpCQkoKHYpLT5jb3VudGVyKQorCisvKioKKyAqIGF0b21pY19zZXQgLSBzZXQgYXRvbWljIHZhcmlhYmxlCisgKiBAdjogcG9pbnRlciBvZiB0eXBlIGF0b21pY190CisgKiBAaTogcmVxdWlyZWQgdmFsdWUKKyAqCisgKiBBdG9taWNhbGx5IHNldHMgdGhlIHZhbHVlIG9mIEB2IHRvIEBpLgorICovCisjZGVmaW5lIGF0b21pY19zZXQodixpKQkJKCh2KS0+Y291bnRlciA9IChpKSkKKworLyoqCisgKiBhdG9taWNfYWRkIC0gYWRkIGludGVnZXIgdG8gYXRvbWljIHZhcmlhYmxlCisgKiBAaTogaW50ZWdlciB2YWx1ZSB0byBhZGQKKyAqIEB2OiBwb2ludGVyIG9mIHR5cGUgYXRvbWljX3QKKyAqCisgKiBBdG9taWNhbGx5IGFkZHMgQGkgdG8gQHYuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBhdG9taWNfYWRkKGludCBpLCBhdG9taWNfdCAqIHYpCit7CisgICAgdW5zaWduZWQgaW50IHZ2YWw7CisKKyAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXygKKwkicnNpbCAgICBhMTUsICJfX3N0cmluZ2lmeShMT0NLTEVWRUwpIlxuXHQiCisJImwzMmkgICAgJTAsICUyLCAwICAgICAgICAgICAgICBcblx0IgorCSJhZGQgICAgICUwLCAlMCwgJTEgICAgICAgICAgICAgXG5cdCIKKwkiczMyaSAgICAlMCwgJTIsIDAgICAgICAgICAgICAgIFxuXHQiCisJIndzciAgICAgYTE1LCAiX19zdHJpbmdpZnkoUFMpIiAgICAgICBcblx0IgorCSJyc3luYyAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisJOiAiPSZhIiAodnZhbCkKKwk6ICJhIiAoaSksICJhIiAodikKKwk6ICJhMTUiLCAibWVtb3J5IgorCSk7Cit9CisKKy8qKgorICogYXRvbWljX3N1YiAtIHN1YnRyYWN0IHRoZSBhdG9taWMgdmFyaWFibGUKKyAqIEBpOiBpbnRlZ2VyIHZhbHVlIHRvIHN1YnRyYWN0CisgKiBAdjogcG9pbnRlciBvZiB0eXBlIGF0b21pY190CisgKgorICogQXRvbWljYWxseSBzdWJ0cmFjdHMgQGkgZnJvbSBAdi4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGF0b21pY19zdWIoaW50IGksIGF0b21pY190ICp2KQoreworICAgIHVuc2lnbmVkIGludCB2dmFsOworCisgICAgX19hc21fXyBfX3ZvbGF0aWxlX18oCisJInJzaWwgICAgYTE1LCAiX19zdHJpbmdpZnkoTE9DS0xFVkVMKSJcblx0IgorCSJsMzJpICAgICUwLCAlMiwgMCAgICAgICAgICAgICAgXG5cdCIKKwkic3ViICAgICAlMCwgJTAsICUxICAgICAgICAgICAgIFxuXHQiCisJInMzMmkgICAgJTAsICUyLCAwICAgICAgICAgICAgICBcblx0IgorCSJ3c3IgICAgIGExNSwgIl9fc3RyaW5naWZ5KFBTKSIgICAgICAgXG5cdCIKKwkicnN5bmMgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorCTogIj0mYSIgKHZ2YWwpCisJOiAiYSIgKGkpLCAiYSIgKHYpCisJOiAiYTE1IiwgIm1lbW9yeSIKKwkpOworfQorCisvKgorICogV2UgdXNlIGF0b21pY197YWRkfHN1Yn1fcmV0dXJuIHRvIGRlZmluZSBvdGhlciBmdW5jdGlvbnMuCisgKi8KKworc3RhdGljIGlubGluZSBpbnQgYXRvbWljX2FkZF9yZXR1cm4oaW50IGksIGF0b21pY190ICogdikKK3sKKyAgICAgdW5zaWduZWQgaW50IHZ2YWw7CisKKyAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXygKKwkicnNpbCAgICBhMTUsIl9fc3RyaW5naWZ5KExPQ0tMRVZFTCkiXG5cdCIKKwkibDMyaSAgICAlMCwgJTIsIDAgICAgICAgICAgICAgXG5cdCIKKwkiYWRkICAgICAlMCwgJTAsICUxICAgICAgICAgICAgXG5cdCIKKwkiczMyaSAgICAlMCwgJTIsIDAgICAgICAgICAgICAgXG5cdCIKKwkid3NyICAgICBhMTUsICJfX3N0cmluZ2lmeShQUykiICAgICAgXG5cdCIKKwkicnN5bmMgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisJOiAiPSZhIiAodnZhbCkKKwk6ICJhIiAoaSksICJhIiAodikKKwk6ICJhMTUiLCAibWVtb3J5IgorCSk7CisKKyAgICByZXR1cm4gdnZhbDsKK30KKworc3RhdGljIGlubGluZSBpbnQgYXRvbWljX3N1Yl9yZXR1cm4oaW50IGksIGF0b21pY190ICogdikKK3sKKyAgICB1bnNpZ25lZCBpbnQgdnZhbDsKKworICAgIF9fYXNtX18gX192b2xhdGlsZV9fKAorCSJyc2lsICAgIGExNSwiX19zdHJpbmdpZnkoTE9DS0xFVkVMKSJcblx0IgorCSJsMzJpICAgICUwLCAlMiwgMCAgICAgICAgICAgICBcblx0IgorCSJzdWIgICAgICUwLCAlMCwgJTEgICAgICAgICAgICBcblx0IgorCSJzMzJpICAgICUwLCAlMiwgMCAgICAgICAgICAgICBcblx0IgorCSJ3c3IgICAgIGExNSwgIl9fc3RyaW5naWZ5KFBTKSIgICAgICAgXG5cdCIKKwkicnN5bmMgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisJOiAiPSZhIiAodnZhbCkKKwk6ICJhIiAoaSksICJhIiAodikKKwk6ICJhMTUiLCAibWVtb3J5IgorCSk7CisKKyAgICByZXR1cm4gdnZhbDsKK30KKworLyoqCisgKiBhdG9taWNfc3ViX2FuZF90ZXN0IC0gc3VidHJhY3QgdmFsdWUgZnJvbSB2YXJpYWJsZSBhbmQgdGVzdCByZXN1bHQKKyAqIEBpOiBpbnRlZ2VyIHZhbHVlIHRvIHN1YnRyYWN0CisgKiBAdjogcG9pbnRlciBvZiB0eXBlIGF0b21pY190CisgKgorICogQXRvbWljYWxseSBzdWJ0cmFjdHMgQGkgZnJvbSBAdiBhbmQgcmV0dXJucworICogdHJ1ZSBpZiB0aGUgcmVzdWx0IGlzIHplcm8sIG9yIGZhbHNlIGZvciBhbGwKKyAqIG90aGVyIGNhc2VzLgorICovCisjZGVmaW5lIGF0b21pY19zdWJfYW5kX3Rlc3QoaSx2KSAoYXRvbWljX3N1Yl9yZXR1cm4oKGkpLCh2KSkgPT0gMCkKKworLyoqCisgKiBhdG9taWNfaW5jIC0gaW5jcmVtZW50IGF0b21pYyB2YXJpYWJsZQorICogQHY6IHBvaW50ZXIgb2YgdHlwZSBhdG9taWNfdAorICoKKyAqIEF0b21pY2FsbHkgaW5jcmVtZW50cyBAdiBieSAxLgorICovCisjZGVmaW5lIGF0b21pY19pbmModikgYXRvbWljX2FkZCgxLCh2KSkKKworLyoqCisgKiBhdG9taWNfaW5jIC0gaW5jcmVtZW50IGF0b21pYyB2YXJpYWJsZQorICogQHY6IHBvaW50ZXIgb2YgdHlwZSBhdG9taWNfdAorICoKKyAqIEF0b21pY2FsbHkgaW5jcmVtZW50cyBAdiBieSAxLgorICovCisjZGVmaW5lIGF0b21pY19pbmNfcmV0dXJuKHYpIGF0b21pY19hZGRfcmV0dXJuKDEsKHYpKQorCisvKioKKyAqIGF0b21pY19kZWMgLSBkZWNyZW1lbnQgYXRvbWljIHZhcmlhYmxlCisgKiBAdjogcG9pbnRlciBvZiB0eXBlIGF0b21pY190CisgKgorICogQXRvbWljYWxseSBkZWNyZW1lbnRzIEB2IGJ5IDEuCisgKi8KKyNkZWZpbmUgYXRvbWljX2RlYyh2KSBhdG9taWNfc3ViKDEsKHYpKQorCisvKioKKyAqIGF0b21pY19kZWNfcmV0dXJuIC0gZGVjcmVtZW50IGF0b21pYyB2YXJpYWJsZQorICogQHY6IHBvaW50ZXIgb2YgdHlwZSBhdG9taWNfdAorICoKKyAqIEF0b21pY2FsbHkgZGVjcmVtZW50cyBAdiBieSAxLgorICovCisjZGVmaW5lIGF0b21pY19kZWNfcmV0dXJuKHYpIGF0b21pY19zdWJfcmV0dXJuKDEsKHYpKQorCisvKioKKyAqIGF0b21pY19kZWNfYW5kX3Rlc3QgLSBkZWNyZW1lbnQgYW5kIHRlc3QKKyAqIEB2OiBwb2ludGVyIG9mIHR5cGUgYXRvbWljX3QKKyAqCisgKiBBdG9taWNhbGx5IGRlY3JlbWVudHMgQHYgYnkgMSBhbmQKKyAqIHJldHVybnMgdHJ1ZSBpZiB0aGUgcmVzdWx0IGlzIDAsIG9yIGZhbHNlIGZvciBhbGwgb3RoZXIKKyAqIGNhc2VzLgorICovCisjZGVmaW5lIGF0b21pY19kZWNfYW5kX3Rlc3QodikgKGF0b21pY19zdWJfcmV0dXJuKDEsKHYpKSA9PSAwKQorCisvKioKKyAqIGF0b21pY19pbmNfYW5kX3Rlc3QgLSBpbmNyZW1lbnQgYW5kIHRlc3QKKyAqIEB2OiBwb2ludGVyIG9mIHR5cGUgYXRvbWljX3QKKyAqCisgKiBBdG9taWNhbGx5IGluY3JlbWVudHMgQHYgYnkgMQorICogYW5kIHJldHVybnMgdHJ1ZSBpZiB0aGUgcmVzdWx0IGlzIHplcm8sIG9yIGZhbHNlIGZvciBhbGwKKyAqIG90aGVyIGNhc2VzLgorICovCisjZGVmaW5lIGF0b21pY19pbmNfYW5kX3Rlc3QodikgKGF0b21pY19hZGRfcmV0dXJuKDEsKHYpKSA9PSAwKQorCisvKioKKyAqIGF0b21pY19hZGRfbmVnYXRpdmUgLSBhZGQgYW5kIHRlc3QgaWYgbmVnYXRpdmUKKyAqIEB2OiBwb2ludGVyIG9mIHR5cGUgYXRvbWljX3QKKyAqIEBpOiBpbnRlZ2VyIHZhbHVlIHRvIGFkZAorICoKKyAqIEF0b21pY2FsbHkgYWRkcyBAaSB0byBAdiBhbmQgcmV0dXJucyB0cnVlCisgKiBpZiB0aGUgcmVzdWx0IGlzIG5lZ2F0aXZlLCBvciBmYWxzZSB3aGVuCisgKiByZXN1bHQgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHplcm8uCisgKi8KKyNkZWZpbmUgYXRvbWljX2FkZF9uZWdhdGl2ZShpLHYpIChhdG9taWNfYWRkX3JldHVybigoaSksKHYpKSA8IDApCisKKyNkZWZpbmUgYXRvbWljX2NtcHhjaGcodiwgbywgbikgKChpbnQpY21weGNoZygmKCh2KS0+Y291bnRlciksIChvKSwgKG4pKSkKKyNkZWZpbmUgYXRvbWljX3hjaGcodiwgbmV3KSAoeGNoZygmKCh2KS0+Y291bnRlciksIG5ldykpCisKKy8qKgorICogYXRvbWljX2FkZF91bmxlc3MgLSBhZGQgdW5sZXNzIHRoZSBudW1iZXIgaXMgYSBnaXZlbiB2YWx1ZQorICogQHY6IHBvaW50ZXIgb2YgdHlwZSBhdG9taWNfdAorICogQGE6IHRoZSBhbW91bnQgdG8gYWRkIHRvIHYuLi4KKyAqIEB1OiAuLi51bmxlc3MgdiBpcyBlcXVhbCB0byB1LgorICoKKyAqIEF0b21pY2FsbHkgYWRkcyBAYSB0byBAdiwgc28gbG9uZyBhcyBpdCB3YXMgbm90IEB1LgorICogUmV0dXJucyBub24temVybyBpZiBAdiB3YXMgbm90IEB1LCBhbmQgemVybyBvdGhlcndpc2UuCisgKi8KK3N0YXRpYyBfX2lubGluZV9fIGludCBhdG9taWNfYWRkX3VubGVzcyhhdG9taWNfdCAqdiwgaW50IGEsIGludCB1KQoreworCWludCBjLCBvbGQ7CisJYyA9IGF0b21pY19yZWFkKHYpOworCWZvciAoOzspIHsKKwkJaWYgKHVubGlrZWx5KGMgPT0gKHUpKSkKKwkJCWJyZWFrOworCQlvbGQgPSBhdG9taWNfY21weGNoZygodiksIGMsIGMgKyAoYSkpOworCQlpZiAobGlrZWx5KG9sZCA9PSBjKSkKKwkJCWJyZWFrOworCQljID0gb2xkOworCX0KKwlyZXR1cm4gYyAhPSAodSk7Cit9CisKKyNkZWZpbmUgYXRvbWljX2luY19ub3RfemVybyh2KSBhdG9taWNfYWRkX3VubGVzcygodiksIDEsIDApCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhdG9taWNfY2xlYXJfbWFzayh1bnNpZ25lZCBpbnQgbWFzaywgYXRvbWljX3QgKnYpCit7CisgICAgdW5zaWduZWQgaW50IGFsbF9mID0gLTE7CisgICAgdW5zaWduZWQgaW50IHZ2YWw7CisKKyAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXygKKwkicnNpbCAgICBhMTUsIl9fc3RyaW5naWZ5KExPQ0tMRVZFTCkiXG5cdCIKKwkibDMyaSAgICAlMCwgJTIsIDAgICAgICAgICAgICAgXG5cdCIKKwkieG9yICAgICAlMSwgJTQsICUzICAgICAgICAgICAgXG5cdCIKKwkiYW5kICAgICAlMCwgJTAsICU0ICAgICAgICAgICAgXG5cdCIKKwkiczMyaSAgICAlMCwgJTIsIDAgICAgICAgICAgICAgXG5cdCIKKwkid3NyICAgICBhMTUsICJfX3N0cmluZ2lmeShQUykiICAgICAgXG5cdCIKKwkicnN5bmMgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisJOiAiPSZhIiAodnZhbCksICI9YSIgKG1hc2spCisJOiAiYSIgKHYpLCAiYSIgKGFsbF9mKSwgIjEiIChtYXNrKQorCTogImExNSIsICJtZW1vcnkiCisJKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGF0b21pY19zZXRfbWFzayh1bnNpZ25lZCBpbnQgbWFzaywgYXRvbWljX3QgKnYpCit7CisgICAgdW5zaWduZWQgaW50IHZ2YWw7CisKKyAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXygKKwkicnNpbCAgICBhMTUsIl9fc3RyaW5naWZ5KExPQ0tMRVZFTCkiXG5cdCIKKwkibDMyaSAgICAlMCwgJTIsIDAgICAgICAgICAgICAgXG5cdCIKKwkib3IgICAgICAlMCwgJTAsICUxICAgICAgICAgICAgXG5cdCIKKwkiczMyaSAgICAlMCwgJTIsIDAgICAgICAgICAgICAgXG5cdCIKKwkid3NyICAgICBhMTUsICJfX3N0cmluZ2lmeShQUykiICAgICAgIFxuXHQiCisJInJzeW5jICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorCTogIj0mYSIgKHZ2YWwpCisJOiAiYSIgKG1hc2spLCAiYSIgKHYpCisJOiAiYTE1IiwgIm1lbW9yeSIKKwkpOworfQorCisvKiBBdG9taWMgb3BlcmF0aW9ucyBhcmUgYWxyZWFkeSBzZXJpYWxpemluZyAqLworI2RlZmluZSBzbXBfbWJfX2JlZm9yZV9hdG9taWNfZGVjKCkJYmFycmllcigpCisjZGVmaW5lIHNtcF9tYl9fYWZ0ZXJfYXRvbWljX2RlYygpCWJhcnJpZXIoKQorI2RlZmluZSBzbXBfbWJfX2JlZm9yZV9hdG9taWNfaW5jKCkJYmFycmllcigpCisjZGVmaW5lIHNtcF9tYl9fYWZ0ZXJfYXRvbWljX2luYygpCWJhcnJpZXIoKQorCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvYXRvbWljLmg+CisjZW5kaWYgLyogX19LRVJORUxfXyAqLworCisjZW5kaWYgLyogX1hURU5TQV9BVE9NSUNfSCAqLworCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvYXV4dmVjLmggYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9hdXh2ZWMuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20teHRlbnNhL2F1eHZlYy5oCnJlbmFtZSB0byBhcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9hdXh2ZWMuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL2JpdG9wcy5oIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vYml0b3BzLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLXh0ZW5zYS9iaXRvcHMuaApyZW5hbWUgdG8gYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vYml0b3BzLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9ib290cGFyYW0uaCBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL2Jvb3RwYXJhbS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS14dGVuc2EvYm9vdHBhcmFtLmgKcmVuYW1lIHRvIGFyY2gveHRlbnNhL2luY2x1ZGUvYXNtL2Jvb3RwYXJhbS5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvYnVnLmggYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9idWcuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20teHRlbnNhL2J1Zy5oCnJlbmFtZSB0byBhcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9idWcuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL2J1Z3MuaCBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL2J1Z3MuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20teHRlbnNhL2J1Z3MuaApyZW5hbWUgdG8gYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vYnVncy5oCmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9ieXRlb3JkZXIuaCBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL2J5dGVvcmRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyOWI5NDUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9ieXRlb3JkZXIuaApAQCAtMCwwICsxLDE0IEBACisjaWZuZGVmIF9YVEVOU0FfQllURU9SREVSX0gKKyNkZWZpbmUgX1hURU5TQV9CWVRFT1JERVJfSAorCisjaW5jbHVkZSA8YXNtL3N3YWIuaD4KKworI2lmZGVmIF9fWFRFTlNBX0VMX18KKyNpbmNsdWRlIDxsaW51eC9ieXRlb3JkZXIvbGl0dGxlX2VuZGlhbi5oPgorI2VsaWYgZGVmaW5lZChfX1hURU5TQV9FQl9fKQorI2luY2x1ZGUgPGxpbnV4L2J5dGVvcmRlci9iaWdfZW5kaWFuLmg+CisjZWxzZQorIyBlcnJvciBwcm9jZXNzb3IgYnl0ZSBvcmRlciB1bmRlZmluZWQhCisjZW5kaWYKKworI2VuZGlmIC8qIF9YVEVOU0FfQllURU9SREVSX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL2NhY2hlLmggYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9jYWNoZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwNGM5ODkKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9jYWNoZS5oCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBpbmNsdWRlL2FzbS14dGVuc2EvY2FjaGUuaAorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIChDKSAyMDAxIC0gMjAwNSBUZW5zaWxpY2EgSW5jLgorICovCisKKyNpZm5kZWYgX1hURU5TQV9DQUNIRV9ICisjZGVmaW5lIF9YVEVOU0FfQ0FDSEVfSAorCisjaW5jbHVkZSA8dmFyaWFudC9jb3JlLmg+CisKKyNkZWZpbmUgTDFfQ0FDSEVfU0hJRlQJWENIQUxfRENBQ0hFX0xJTkVXSURUSAorI2RlZmluZSBMMV9DQUNIRV9CWVRFUwlYQ0hBTF9EQ0FDSEVfTElORVNJWkUKKyNkZWZpbmUgU01QX0NBQ0hFX0JZVEVTCUwxX0NBQ0hFX0JZVEVTCisKKyNkZWZpbmUgRENBQ0hFX1dBWV9TSVpFCShYQ0hBTF9EQ0FDSEVfU0laRS9YQ0hBTF9EQ0FDSEVfV0FZUykKKyNkZWZpbmUgSUNBQ0hFX1dBWV9TSVpFCShYQ0hBTF9JQ0FDSEVfU0laRS9YQ0hBTF9JQ0FDSEVfV0FZUykKKyNkZWZpbmUgRENBQ0hFX1dBWV9TSElGVCAoWENIQUxfRENBQ0hFX1NFVFdJRFRIICsgWENIQUxfRENBQ0hFX0xJTkVXSURUSCkKKyNkZWZpbmUgSUNBQ0hFX1dBWV9TSElGVCAoWENIQUxfSUNBQ0hFX1NFVFdJRFRIICsgWENIQUxfSUNBQ0hFX0xJTkVXSURUSCkKKworLyogTWF4aW11bSBjYWNoZSBzaXplIHBlciB3YXkuICovCisjaWYgRENBQ0hFX1dBWV9TSVpFID49IElDQUNIRV9XQVlfU0laRQorIyBkZWZpbmUgQ0FDSEVfV0FZX1NJWkUgRENBQ0hFX1dBWV9TSVpFCisjZWxzZQorIyBkZWZpbmUgQ0FDSEVfV0FZX1NJWkUgSUNBQ0hFX1dBWV9TSVpFCisjZW5kaWYKKworCisjZW5kaWYJLyogX1hURU5TQV9DQUNIRV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvY2FjaGVhc20uaCBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL2NhY2hlYXNtLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLXh0ZW5zYS9jYWNoZWFzbS5oCnJlbmFtZSB0byBhcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9jYWNoZWFzbS5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvY2FjaGVmbHVzaC5oIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vY2FjaGVmbHVzaC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS14dGVuc2EvY2FjaGVmbHVzaC5oCnJlbmFtZSB0byBhcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9jYWNoZWZsdXNoLmgKZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL2NoZWNrc3VtLmggYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9jaGVja3N1bS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4NGQzZjAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9jaGVja3N1bS5oCkBAIC0wLDAgKzEsMjUwIEBACisvKgorICogaW5jbHVkZS9hc20teHRlbnNhL2NoZWNrc3VtLmgKKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgLSAyMDA1IFRlbnNpbGljYSBJbmMuCisgKi8KKworI2lmbmRlZiBfWFRFTlNBX0NIRUNLU1VNX0gKKyNkZWZpbmUgX1hURU5TQV9DSEVDS1NVTV9ICisKKyNpbmNsdWRlIDxsaW51eC9pbjYuaD4KKyNpbmNsdWRlIDx2YXJpYW50L2NvcmUuaD4KKworLyoKKyAqIGNvbXB1dGVzIHRoZSBjaGVja3N1bSBvZiBhIG1lbW9yeSBibG9jayBhdCBidWZmLCBsZW5ndGggbGVuLAorICogYW5kIGFkZHMgaW4gInN1bSIgKDMyLWJpdCkKKyAqCisgKiByZXR1cm5zIGEgMzItYml0IG51bWJlciBzdWl0YWJsZSBmb3IgZmVlZGluZyBpbnRvIGl0c2VsZgorICogb3IgY3N1bV90Y3B1ZHBfbWFnaWMKKyAqCisgKiB0aGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIHdpdGggZXZlbiBsZW5ndGhzLCBleGNlcHQKKyAqIGZvciB0aGUgbGFzdCBmcmFnbWVudCwgd2hpY2ggbWF5IGJlIG9kZAorICoKKyAqIGl0J3MgYmVzdCB0byBoYXZlIGJ1ZmYgYWxpZ25lZCBvbiBhIDMyLWJpdCBib3VuZGFyeQorICovCithc21saW5rYWdlIF9fd3N1bSBjc3VtX3BhcnRpYWwoY29uc3Qgdm9pZCAqYnVmZiwgaW50IGxlbiwgX193c3VtIHN1bSk7CisKKy8qCisgKiB0aGUgc2FtZSBhcyBjc3VtX3BhcnRpYWwsIGJ1dCBjb3BpZXMgZnJvbSBzcmMgd2hpbGUgaXQKKyAqIGNoZWNrc3VtcywgYW5kIGhhbmRsZXMgdXNlci1zcGFjZSBwb2ludGVyIGV4Y2VwdGlvbnMgY29ycmVjdGx5LCB3aGVuIG5lZWRlZC4KKyAqCisgKiBoZXJlIGV2ZW4gbW9yZSBpbXBvcnRhbnQgdG8gYWxpZ24gc3JjIGFuZCBkc3Qgb24gYSAzMi1iaXQgKG9yIGV2ZW4KKyAqIGJldHRlciA2NC1iaXQpIGJvdW5kYXJ5CisgKi8KKworYXNtbGlua2FnZSBfX3dzdW0gY3N1bV9wYXJ0aWFsX2NvcHlfZ2VuZXJpYyhjb25zdCB2b2lkICpzcmMsIHZvaWQgKmRzdCwgaW50IGxlbiwgX193c3VtIHN1bSwKKwkJCQkJCSAgIGludCAqc3JjX2Vycl9wdHIsIGludCAqZHN0X2Vycl9wdHIpOworCisvKgorICoJTm90ZTogd2hlbiB5b3UgZ2V0IGEgTlVMTCBwb2ludGVyIGV4Y2VwdGlvbiBoZXJlIHRoaXMgbWVhbnMgc29tZW9uZQorICoJcGFzc2VkIGluIGFuIGluY29ycmVjdCBrZXJuZWwgYWRkcmVzcyB0byBvbmUgb2YgdGhlc2UgZnVuY3Rpb25zLgorICoKKyAqCUlmIHlvdSB1c2UgdGhlc2UgZnVuY3Rpb25zIGRpcmVjdGx5IHBsZWFzZSBkb24ndCBmb3JnZXQgdGhlIGFjY2Vzc19vaygpLgorICovCitzdGF0aWMgaW5saW5lCitfX3dzdW0gY3N1bV9wYXJ0aWFsX2NvcHlfbm9jaGVjayhjb25zdCB2b2lkICpzcmMsIHZvaWQgKmRzdCwKKwkJCQkJaW50IGxlbiwgX193c3VtIHN1bSkKK3sKKwlyZXR1cm4gY3N1bV9wYXJ0aWFsX2NvcHlfZ2VuZXJpYyhzcmMsIGRzdCwgbGVuLCBzdW0sIE5VTEwsIE5VTEwpOworfQorCitzdGF0aWMgaW5saW5lCitfX3dzdW0gY3N1bV9wYXJ0aWFsX2NvcHlfZnJvbV91c2VyKGNvbnN0IHZvaWQgX191c2VyICpzcmMsIHZvaWQgKmRzdCwKKwkJCQkJCWludCBsZW4sIF9fd3N1bSBzdW0sIGludCAqZXJyX3B0cikKK3sKKwlyZXR1cm4gY3N1bV9wYXJ0aWFsX2NvcHlfZ2VuZXJpYygoX19mb3JjZSBjb25zdCB2b2lkICopc3JjLCBkc3QsCisJCQkJCWxlbiwgc3VtLCBlcnJfcHRyLCBOVUxMKTsKK30KKworLyoKKyAqCUZvbGQgYSBwYXJ0aWFsIGNoZWNrc3VtCisgKi8KKworc3RhdGljIF9faW5saW5lX18gX19zdW0xNiBjc3VtX2ZvbGQoX193c3VtIHN1bSkKK3sKKwl1bnNpZ25lZCBpbnQgX19kdW1teTsKKwlfX2FzbV9fKCJleHR1aQklMSwgJTAsIDE2LCAxNlxuXHQiCisJCSJleHR1aQklMCAsJTAsIDAsIDE2XG5cdCIKKwkJImFkZAklMCwgJTAsICUxXG5cdCIKKwkJInNsbGkJJTEsICUwLCAxNlxuXHQiCisJCSJhZGQJJTAsICUwLCAlMVxuXHQiCisJCSJleHR1aQklMCwgJTAsIDE2LCAxNlxuXHQiCisJCSJuZWcJJTAsICUwXG5cdCIKKwkJImFkZGkJJTAsICUwLCAtMVxuXHQiCisJCSJleHR1aQklMCwgJTAsIDAsIDE2XG5cdCIKKwkJOiAiPXIiIChzdW0pLCAiPSZyIiAoX19kdW1teSkKKwkJOiAiMCIgKHN1bSkpOworCXJldHVybiAoX19mb3JjZSBfX3N1bTE2KXN1bTsKK30KKworLyoKKyAqCVRoaXMgaXMgYSB2ZXJzaW9uIG9mIGlwX2NvbXB1dGVfY3N1bSgpIG9wdGltaXplZCBmb3IgSVAgaGVhZGVycywKKyAqCXdoaWNoIGFsd2F5cyBjaGVja3N1bSBvbiA0IG9jdGV0IGJvdW5kYXJpZXMuCisgKi8KK3N0YXRpYyBfX2lubGluZV9fIF9fc3VtMTYgaXBfZmFzdF9jc3VtKGNvbnN0IHZvaWQgKmlwaCwgdW5zaWduZWQgaW50IGlobCkKK3sKKwl1bnNpZ25lZCBpbnQgc3VtLCB0bXAsIGVuZGFkZHI7CisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygKKwkJInN1YgkJJTAsICUwLCAlMFxuXHQiCisjaWYgWENIQUxfSEFWRV9MT09QUworCQkibG9vcGd0egklMiwgMmZcblx0IgorI2Vsc2UKKwkJImJlcXoJCSUyLCAyZlxuXHQiCisJCSJzbGxpCQklNCwgJTIsIDJcblx0IgorCQkiYWRkCQklNCwgJTQsICUxXG5cdCIKKwkJIjA6XHQiCisjZW5kaWYKKwkJImwzMmkJCSUzLCAlMSwgMFxuXHQiCisJCSJhZGQJCSUwLCAlMCwgJTNcblx0IgorCQkiYmdldQkJJTAsICUzLCAxZlxuXHQiCisJCSJhZGRpCQklMCwgJTAsIDFcblx0IgorCQkiMTpcdCIKKwkJImFkZGkJCSUxLCAlMSwgNFxuXHQiCisjaWYgIVhDSEFMX0hBVkVfTE9PUFMKKwkJImJsdAkJJTEsICU0LCAwYlxuXHQiCisjZW5kaWYKKwkJIjI6XHQiCisJLyogU2luY2UgdGhlIGlucHV0IHJlZ2lzdGVycyB3aGljaCBhcmUgbG9hZGVkIHdpdGggaXBoIGFuZCBpaGwKKwkgICBhcmUgbW9kaWZpZWQsIHdlIG11c3QgYWxzbyBzcGVjaWZ5IHRoZW0gYXMgb3V0cHV0cywgb3IgZ2NjCisJICAgd2lsbCBhc3N1bWUgdGhleSBjb250YWluIHRoZWlyIG9yaWdpbmFsIHZhbHVlcy4gKi8KKwkJOiAiPXIiIChzdW0pLCAiPXIiIChpcGgpLCAiPXIiIChpaGwpLCAiPSZyIiAodG1wKSwgIj0mciIgKGVuZGFkZHIpCisJCTogIjEiIChpcGgpLCAiMiIgKGlobCkpOworCisJcmV0dXJuCWNzdW1fZm9sZChzdW0pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX3dzdW0gY3N1bV90Y3B1ZHBfbm9mb2xkKF9fYmUzMiBzYWRkciwgX19iZTMyIGRhZGRyLAorCQkJCQkJICAgdW5zaWduZWQgc2hvcnQgbGVuLAorCQkJCQkJICAgdW5zaWduZWQgc2hvcnQgcHJvdG8sCisJCQkJCQkgICBfX3dzdW0gc3VtKQoreworCisjaWZkZWYgX19YVEVOU0FfRUxfXworCXVuc2lnbmVkIGxvbmcgbGVuX3Byb3RvID0gKGxlbiArIHByb3RvKSA8PCA4OworI2VsaWYgZGVmaW5lZChfX1hURU5TQV9FQl9fKQorCXVuc2lnbmVkIGxvbmcgbGVuX3Byb3RvID0gbGVuICsgcHJvdG87CisjZWxzZQorIyBlcnJvciBwcm9jZXNzb3IgYnl0ZSBvcmRlciB1bmRlZmluZWQhCisjZW5kaWYKKwlfX2FzbV9fKCJhZGQJJTAsICUwLCAlMVxuXHQiCisJCSJiZ2V1CSUwLCAlMSwgMWZcblx0IgorCQkiYWRkaQklMCwgJTAsIDFcblx0IgorCQkiMTpcdCIKKwkJImFkZAklMCwgJTAsICUyXG5cdCIKKwkJImJnZXUJJTAsICUyLCAxZlxuXHQiCisJCSJhZGRpCSUwLCAlMCwgMVxuXHQiCisJCSIxOlx0IgorCQkiYWRkCSUwLCAlMCwgJTNcblx0IgorCQkiYmdldQklMCwgJTMsIDFmXG5cdCIKKwkJImFkZGkJJTAsICUwLCAxXG5cdCIKKwkJIjE6XHQiCisJCTogIj1yIiAoc3VtKSwgIj1yIiAobGVuX3Byb3RvKQorCQk6ICJyIiAoZGFkZHIpLCAiciIgKHNhZGRyKSwgIjEiIChsZW5fcHJvdG8pLCAiMCIgKHN1bSkpOworCXJldHVybiBzdW07Cit9CisKKy8qCisgKiBjb21wdXRlcyB0aGUgY2hlY2tzdW0gb2YgdGhlIFRDUC9VRFAgcHNldWRvLWhlYWRlcgorICogcmV0dXJucyBhIDE2LWJpdCBjaGVja3N1bSwgYWxyZWFkeSBjb21wbGVtZW50ZWQKKyAqLworc3RhdGljIF9faW5saW5lX18gX19zdW0xNiBjc3VtX3RjcHVkcF9tYWdpYyhfX2JlMzIgc2FkZHIsIF9fYmUzMiBkYWRkciwKKwkJCQkJCSAgICAgICB1bnNpZ25lZCBzaG9ydCBsZW4sCisJCQkJCQkgICAgICAgdW5zaWduZWQgc2hvcnQgcHJvdG8sCisJCQkJCQkgICAgICAgX193c3VtIHN1bSkKK3sKKwlyZXR1cm4gY3N1bV9mb2xkKGNzdW1fdGNwdWRwX25vZm9sZChzYWRkcixkYWRkcixsZW4scHJvdG8sc3VtKSk7Cit9CisKKy8qCisgKiB0aGlzIHJvdXRpbmUgaXMgdXNlZCBmb3IgbWlzY2VsbGFuZW91cyBJUC1saWtlIGNoZWNrc3VtcywgbWFpbmx5CisgKiBpbiBpY21wLmMKKyAqLworCitzdGF0aWMgX19pbmxpbmVfXyBfX3N1bTE2IGlwX2NvbXB1dGVfY3N1bShjb25zdCB2b2lkICpidWZmLCBpbnQgbGVuKQoreworICAgIHJldHVybiBjc3VtX2ZvbGQgKGNzdW1fcGFydGlhbChidWZmLCBsZW4sIDApKTsKK30KKworI2RlZmluZSBfSEFWRV9BUkNIX0lQVjZfQ1NVTQorc3RhdGljIF9faW5saW5lX18gX19zdW0xNiBjc3VtX2lwdjZfbWFnaWMoY29uc3Qgc3RydWN0IGluNl9hZGRyICpzYWRkciwKKwkJCQkJICBjb25zdCBzdHJ1Y3QgaW42X2FkZHIgKmRhZGRyLAorCQkJCQkgIF9fdTMyIGxlbiwgdW5zaWduZWQgc2hvcnQgcHJvdG8sCisJCQkJCSAgX193c3VtIHN1bSkKK3sKKwl1bnNpZ25lZCBpbnQgX19kdW1teTsKKwlfX2FzbV9fKCJsMzJpCSUxLCAlMiwgMFxuXHQiCisJCSJhZGQJJTAsICUwLCAlMVxuXHQiCisJCSJiZ2V1CSUwLCAlMSwgMWZcblx0IgorCQkiYWRkaQklMCwgJTAsIDFcblx0IgorCQkiMTpcdCIKKwkJImwzMmkJJTEsICUyLCA0XG5cdCIKKwkJImFkZAklMCwgJTAsICUxXG5cdCIKKwkJImJnZXUJJTAsICUxLCAxZlxuXHQiCisJCSJhZGRpCSUwLCAlMCwgMVxuXHQiCisJCSIxOlx0IgorCQkibDMyaQklMSwgJTIsIDhcblx0IgorCQkiYWRkCSUwLCAlMCwgJTFcblx0IgorCQkiYmdldQklMCwgJTEsIDFmXG5cdCIKKwkJImFkZGkJJTAsICUwLCAxXG5cdCIKKwkJIjE6XHQiCisJCSJsMzJpCSUxLCAlMiwgMTJcblx0IgorCQkiYWRkCSUwLCAlMCwgJTFcblx0IgorCQkiYmdldQklMCwgJTEsIDFmXG5cdCIKKwkJImFkZGkJJTAsICUwLCAxXG5cdCIKKwkJIjE6XHQiCisJCSJsMzJpCSUxLCAlMywgMFxuXHQiCisJCSJhZGQJJTAsICUwLCAlMVxuXHQiCisJCSJiZ2V1CSUwLCAlMSwgMWZcblx0IgorCQkiYWRkaQklMCwgJTAsIDFcblx0IgorCQkiMTpcdCIKKwkJImwzMmkJJTEsICUzLCA0XG5cdCIKKwkJImFkZAklMCwgJTAsICUxXG5cdCIKKwkJImJnZXUJJTAsICUxLCAxZlxuXHQiCisJCSJhZGRpCSUwLCAlMCwgMVxuXHQiCisJCSIxOlx0IgorCQkibDMyaQklMSwgJTMsIDhcblx0IgorCQkiYWRkCSUwLCAlMCwgJTFcblx0IgorCQkiYmdldQklMCwgJTEsIDFmXG5cdCIKKwkJImFkZGkJJTAsICUwLCAxXG5cdCIKKwkJIjE6XHQiCisJCSJsMzJpCSUxLCAlMywgMTJcblx0IgorCQkiYWRkCSUwLCAlMCwgJTFcblx0IgorCQkiYmdldQklMCwgJTEsIDFmXG5cdCIKKwkJImFkZGkJJTAsICUwLCAxXG5cdCIKKwkJIjE6XHQiCisJCSJhZGQJJTAsICUwLCAlNFxuXHQiCisJCSJiZ2V1CSUwLCAlNCwgMWZcblx0IgorCQkiYWRkaQklMCwgJTAsIDFcblx0IgorCQkiMTpcdCIKKwkJImFkZAklMCwgJTAsICU1XG5cdCIKKwkJImJnZXUJJTAsICU1LCAxZlxuXHQiCisJCSJhZGRpCSUwLCAlMCwgMVxuXHQiCisJCSIxOlx0IgorCQk6ICI9ciIgKHN1bSksICI9JnIiIChfX2R1bW15KQorCQk6ICJyIiAoc2FkZHIpLCAiciIgKGRhZGRyKSwKKwkJICAiciIgKGh0b25sKGxlbikpLCAiciIgKGh0b25sKHByb3RvKSksICIwIiAoc3VtKSk7CisKKwlyZXR1cm4gY3N1bV9mb2xkKHN1bSk7Cit9CisKKy8qCisgKglDb3B5IGFuZCBjaGVja3N1bSB0byB1c2VyCisgKi8KKyNkZWZpbmUgSEFWRV9DU1VNX0NPUFlfVVNFUgorc3RhdGljIF9faW5saW5lX18gX193c3VtIGNzdW1fYW5kX2NvcHlfdG9fdXNlcihjb25zdCB2b2lkICpzcmMsIHZvaWQgX191c2VyICpkc3QsCisJCQkJICAgIGludCBsZW4sIF9fd3N1bSBzdW0sIGludCAqZXJyX3B0cikKK3sKKwlpZiAoYWNjZXNzX29rKFZFUklGWV9XUklURSwgZHN0LCBsZW4pKQorCQlyZXR1cm4gY3N1bV9wYXJ0aWFsX2NvcHlfZ2VuZXJpYyhzcmMsIGRzdCwgbGVuLCBzdW0sIE5VTEwsIGVycl9wdHIpOworCisJaWYgKGxlbikKKwkJKmVycl9wdHIgPSAtRUZBVUxUOworCisJcmV0dXJuIChfX2ZvcmNlIF9fd3N1bSktMTsgLyogaW52YWxpZCBjaGVja3N1bSAqLworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9jb3Byb2Nlc3Nvci5oIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vY29wcm9jZXNzb3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NWEyODVkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vY29wcm9jZXNzb3IuaApAQCAtMCwwICsxLDE3NyBAQAorLyoKKyAqIGluY2x1ZGUvYXNtLXh0ZW5zYS9jb3Byb2Nlc3Nvci5oCisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzIC0gMjAwNyBUZW5zaWxpY2EgSW5jLgorICovCisKKworI2lmbmRlZiBfWFRFTlNBX0NPUFJPQ0VTU09SX0gKKyNkZWZpbmUgX1hURU5TQV9DT1BST0NFU1NPUl9ICisKKyNpbmNsdWRlIDxsaW51eC9zdHJpbmdpZnkuaD4KKyNpbmNsdWRlIDx2YXJpYW50L3RpZS5oPgorI2luY2x1ZGUgPGFzbS90eXBlcy5oPgorCisjaWZkZWYgX19BU1NFTUJMWV9fCisjIGluY2x1ZGUgPHZhcmlhbnQvdGllLWFzbS5oPgorCisubWFjcm8JeGNoYWxfc2Ffc3RhcnQgIGEgYgorCS5zZXQgLkx4Y2hhbF9wb2ZzXywgMAorCS5zZXQgLkx4Y2hhbF9vZnNfLCAwCisuZW5kbQorCisubWFjcm8JeGNoYWxfc2FfYWxpZ24gIHB0ciBtaW5vZnMgbWF4b2ZzIG9mc2FsaWduIHRvdGFsaWduCisJLnNldAkuTHhjaGFsX29mc18sIC5MeGNoYWxfb2ZzXyArIC5MeGNoYWxfcG9mc18gKyBcdG90YWxpZ24gLSAxCisJLnNldAkuTHhjaGFsX29mc18sICguTHhjaGFsX29mc18gJiAtXHRvdGFsaWduKSAtIC5MeGNoYWxfcG9mc18KKy5lbmRtCisKKyNkZWZpbmUgX1NFTEVDVAkoICBYVEhBTF9TQVNfVElFIHwgWFRIQUxfU0FTX09QVCBcCisJCSB8IFhUSEFMX1NBU19DQyBcCisJCSB8IFhUSEFMX1NBU19DQUxSIHwgWFRIQUxfU0FTX0NBTEUgKQorCisubWFjcm8gc2F2ZV94dHJlZ3Nfb3B0IHB0ciBjbGIgYXQxIGF0MiBhdDMgYXQ0IG9mZnNldAorCS5pZiBYVFJFR1NfT1BUX1NJWkUgPiAwCisJCWFkZGkJXGNsYiwgXHB0ciwgXG9mZnNldAorCQl4Y2hhbF9uY3Bfc3RvcmUgXGNsYiBcYXQxIFxhdDIgXGF0MyBcYXQ0IHNlbGVjdD1fU0VMRUNUCisJLmVuZGlmCisuZW5kbQorCisubWFjcm8gbG9hZF94dHJlZ3Nfb3B0IHB0ciBjbGIgYXQxIGF0MiBhdDMgYXQ0IG9mZnNldAorCS5pZiBYVFJFR1NfT1BUX1NJWkUgPiAwCisJCWFkZGkJXGNsYiwgXHB0ciwgXG9mZnNldAorCQl4Y2hhbF9uY3BfbG9hZCBcY2xiIFxhdDEgXGF0MiBcYXQzIFxhdDQgc2VsZWN0PV9TRUxFQ1QKKwkuZW5kaWYKKy5lbmRtCisjdW5kZWYgX1NFTEVDVAorCisjZGVmaW5lIF9TRUxFQ1QJKCAgWFRIQUxfU0FTX1RJRSB8IFhUSEFMX1NBU19PUFQgXAorCQkgfCBYVEhBTF9TQVNfTk9DQyBcCisJCSB8IFhUSEFMX1NBU19DQUxSIHwgWFRIQUxfU0FTX0NBTEUgfCBYVEhBTF9TQVNfR0xPQiApCisKKy5tYWNybyBzYXZlX3h0cmVnc191c2VyIHB0ciBjbGIgYXQxIGF0MiBhdDMgYXQ0IG9mZnNldAorCS5pZiBYVFJFR1NfVVNFUl9TSVpFID4gMAorCQlhZGRpCVxjbGIsIFxwdHIsIFxvZmZzZXQKKwkJeGNoYWxfbmNwX3N0b3JlIFxjbGIgXGF0MSBcYXQyIFxhdDMgXGF0NCBzZWxlY3Q9X1NFTEVDVAorCS5lbmRpZgorLmVuZG0KKworLm1hY3JvIGxvYWRfeHRyZWdzX3VzZXIgcHRyIGNsYiBhdDEgYXQyIGF0MyBhdDQgb2Zmc2V0CisJLmlmIFhUUkVHU19VU0VSX1NJWkUgPiAwCisJCWFkZGkJXGNsYiwgXHB0ciwgXG9mZnNldAorCQl4Y2hhbF9uY3BfbG9hZCBcY2xiIFxhdDEgXGF0MiBcYXQzIFxhdDQgc2VsZWN0PV9TRUxFQ1QKKwkuZW5kaWYKKy5lbmRtCisjdW5kZWYgX1NFTEVDVAorCisKKworI2VuZGlmCS8qIF9fQVNTRU1CTFlfXyAqLworCisvKgorICogWFRFTlNBX0hBVkVfQ09QUk9DRVNTT1IoeCkgcmV0dXJucyAxIGlmIGNvcHJvY2Vzc29yIHggaXMgY29uZmlndXJlZC4KKyAqCisgKiBYVEVOU0FfSEFWRV9JT19QT1JUKHgpIHJldHVybnMgMSBpZiBpby1wb3J0IHggaXMgY29uZmlndXJlZC4KKyAqCisgKi8KKworI2RlZmluZSBYVEVOU0FfSEFWRV9DT1BST0NFU1NPUih4KQkJCQkJXAorCSgoWENIQUxfQ1BfTUFTSyBeIFhDSEFMX0NQX1BPUlRfTUFTSykgJiAoMSA8PCAoeCkpKQorI2RlZmluZSBYVEVOU0FfSEFWRV9DT1BST0NFU1NPUlMJCQkJCVwKKwkoWENIQUxfQ1BfTUFTSyBeIFhDSEFMX0NQX1BPUlRfTUFTSykKKyNkZWZpbmUgWFRFTlNBX0hBVkVfSU9fUE9SVCh4KQkJCQkJCVwKKwkoWENIQUxfQ1BfUE9SVF9NQVNLICYgKDEgPDwgKHgpKSkKKyNkZWZpbmUgWFRFTlNBX0hBVkVfSU9fUE9SVFMJCQkJCQlcCisJWENIQUxfQ1BfUE9SVF9NQVNLCisKKyNpZm5kZWYgX19BU1NFTUJMWV9fCisKKworI2lmIFhDSEFMX0hBVkVfQ1AKKworI2RlZmluZSBSU1JfQ1BFTkFCTEUoeCkJZG8gewkJCQkJCSAgXAorCV9fYXNtX18gX192b2xhdGlsZV9fKCJyc3IgJTAsIiBfX3N0cmluZ2lmeShDUEVOQUJMRSkgOiAiPWEiICh4KSk7IFwKKwl9IHdoaWxlKDApOworI2RlZmluZSBXU1JfQ1BFTkFCTEUoeCkJZG8gewkJCQkJCSAgXAorICAJX19hc21fXyBfX3ZvbGF0aWxlX18oIndzciAlMCwiIF9fc3RyaW5naWZ5KENQRU5BQkxFKSAiOyByc3luYyIgCSAgXAorCSAgICAJCSAgICAgOjogImEiICh4KSk7CQkJCSAgXAorCX0gd2hpbGUoMCk7CisKKyNlbmRpZiAvKiBYQ0hBTF9IQVZFX0NQICovCisKKworLyoKKyAqIEFkZGl0aW9uYWwgcmVnaXN0ZXJzLgorICogV2UgZGVmaW5lIHRocmVlIHR5cGVzIG9mIGFkZGl0aW9uYWwgcmVnaXN0ZXJzOgorICogIGV4dDogZXh0cmEgcmVnaXN0ZXJzIHRoYXQgYXJlIHVzZWQgYnkgdGhlIGNvbXBpbGVyCisgKiAgY3BuOiBvcHRpb25hbCByZWdpc3RlcnMgdGhhdCBjYW4gYmUgdXNlZCBieSBhIHVzZXIgYXBwbGljYXRpb24KKyAqICBjcFg6IGNvcHJvY2Vzc29yIHJlZ2lzdGVycyB0aGF0IGNhbiBvbmx5IGJlIHVzZWQgaWYgdGhlIGNvcnJlc3BvbmRpbmcKKyAqICAgICAgIENQRU5BQkxFIGJpdCBpcyBzZXQuCisgKi8KKworI2RlZmluZSBYQ0hBTF9TQV9SRUcobGlzdCxjYyxhYmksdHlwZSx5LG5hbWUseixhbGlnbixzaXplLC4uLikJXAorCV9fUkVHICMjIGxpc3QgKGNjLCBhYmksIHR5cGUsIG5hbWUsIHNpemUsIGFsaWduKQorCisjZGVmaW5lIF9fUkVHMChjYyxhYmksdCxuYW1lLHMsYSkJX19SRUcwXyAjIyBjYyAoYWJpLG5hbWUpCisjZGVmaW5lIF9fUkVHMShjYyxhYmksdCxuYW1lLHMsYSkJX19SRUcxXyAjIyBjYyAobmFtZSkKKyNkZWZpbmUgX19SRUcyKGNjLGFiaSx0eXBlLC4uLikJCV9fUkVHMl8gIyMgdHlwZSAoX19WQV9BUkdTX18pCisKKyNkZWZpbmUgX19SRUcwXzAoYWJpLG5hbWUpCisjZGVmaW5lIF9fUkVHMF8xKGFiaSxuYW1lKQkJX19SRUcwXzEgIyMgYWJpIChuYW1lKQorI2RlZmluZSBfX1JFRzBfMTAobmFtZSkJX191MzIgbmFtZTsKKyNkZWZpbmUgX19SRUcwXzExKG5hbWUpCV9fdTMyIG5hbWU7CisjZGVmaW5lIF9fUkVHMF8xMihuYW1lKQorCisjZGVmaW5lIF9fUkVHMV8wKG5hbWUpCV9fdTMyIG5hbWU7CisjZGVmaW5lIF9fUkVHMV8xKG5hbWUpCisKKyNkZWZpbmUgX19SRUcyXzAobixzLGEpCV9fdTMyIG5hbWU7CisjZGVmaW5lIF9fUkVHMl8xKG4scyxhKQl1bnNpZ25lZCBjaGFyIG5bc10gX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQoYSkpKTsKKyNkZWZpbmUgX19SRUcyXzIobixzLGEpIHVuc2lnbmVkIGNoYXIgbltzXSBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZChhKSkpOworCit0eXBlZGVmIHN0cnVjdCB7IFhDSEFMX05DUF9TQV9MSVNUKDApIH0geHRyZWdzX29wdF90CisJX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQgKFhDSEFMX05DUF9TQV9BTElHTikpKTsKK3R5cGVkZWYgc3RydWN0IHsgWENIQUxfTkNQX1NBX0xJU1QoMSkgfSB4dHJlZ3NfdXNlcl90CisJX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQgKFhDSEFMX05DUF9TQV9BTElHTikpKTsKKworI2lmIFhURU5TQV9IQVZFX0NPUFJPQ0VTU09SUworCit0eXBlZGVmIHN0cnVjdCB7IFhDSEFMX0NQMF9TQV9MSVNUKDIpIH0geHRyZWdzX2NwMF90CisJX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQgKFhDSEFMX0NQMF9TQV9BTElHTikpKTsKK3R5cGVkZWYgc3RydWN0IHsgWENIQUxfQ1AxX1NBX0xJU1QoMikgfSB4dHJlZ3NfY3AxX3QKKwlfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCAoWENIQUxfQ1AxX1NBX0FMSUdOKSkpOwordHlwZWRlZiBzdHJ1Y3QgeyBYQ0hBTF9DUDJfU0FfTElTVCgyKSB9IHh0cmVnc19jcDJfdAorCV9fYXR0cmlidXRlX18gKChhbGlnbmVkIChYQ0hBTF9DUDJfU0FfQUxJR04pKSk7Cit0eXBlZGVmIHN0cnVjdCB7IFhDSEFMX0NQM19TQV9MSVNUKDIpIH0geHRyZWdzX2NwM190CisJX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQgKFhDSEFMX0NQM19TQV9BTElHTikpKTsKK3R5cGVkZWYgc3RydWN0IHsgWENIQUxfQ1A0X1NBX0xJU1QoMikgfSB4dHJlZ3NfY3A0X3QKKwlfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCAoWENIQUxfQ1A0X1NBX0FMSUdOKSkpOwordHlwZWRlZiBzdHJ1Y3QgeyBYQ0hBTF9DUDVfU0FfTElTVCgyKSB9IHh0cmVnc19jcDVfdAorCV9fYXR0cmlidXRlX18gKChhbGlnbmVkIChYQ0hBTF9DUDVfU0FfQUxJR04pKSk7Cit0eXBlZGVmIHN0cnVjdCB7IFhDSEFMX0NQNl9TQV9MSVNUKDIpIH0geHRyZWdzX2NwNl90CisJX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQgKFhDSEFMX0NQNl9TQV9BTElHTikpKTsKK3R5cGVkZWYgc3RydWN0IHsgWENIQUxfQ1A3X1NBX0xJU1QoMikgfSB4dHJlZ3NfY3A3X3QKKwlfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCAoWENIQUxfQ1A3X1NBX0FMSUdOKSkpOworCitleHRlcm4gc3RydWN0IHRocmVhZF9pbmZvKiBjb3Byb2Nlc3Nvcl9vd25lcltYQ0hBTF9DUF9NQVhdOworZXh0ZXJuIHZvaWQgY29wcm9jZXNzb3Jfc2F2ZSh2b2lkKiwgaW50KTsKK2V4dGVybiB2b2lkIGNvcHJvY2Vzc29yX2xvYWQodm9pZCosIGludCk7CitleHRlcm4gdm9pZCBjb3Byb2Nlc3Nvcl9mbHVzaChzdHJ1Y3QgdGhyZWFkX2luZm8qLCBpbnQpOworZXh0ZXJuIHZvaWQgY29wcm9jZXNzb3JfcmVzdG9yZShzdHJ1Y3QgdGhyZWFkX2luZm8qLCBpbnQpOworCitleHRlcm4gdm9pZCBjb3Byb2Nlc3Nvcl9yZWxlYXNlX2FsbChzdHJ1Y3QgdGhyZWFkX2luZm8qKTsKK2V4dGVybiB2b2lkIGNvcHJvY2Vzc29yX2ZsdXNoX2FsbChzdHJ1Y3QgdGhyZWFkX2luZm8qKTsKKworc3RhdGljIGlubGluZSB2b2lkIGNvcHJvY2Vzc29yX2NsZWFyX2NwZW5hYmxlKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBpID0gMDsKKwlXU1JfQ1BFTkFCTEUoaSk7Cit9CisKKyNlbmRpZgkvKiBYVEVOU0FfSEFWRV9DT1BST0NFU1NPUlMgKi8KKworI2VuZGlmCS8qICFfX0FTU0VNQkxZX18gKi8KKyNlbmRpZgkvKiBfWFRFTlNBX0NPUFJPQ0VTU09SX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9jcHVtYXNrLmggYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9jcHVtYXNrLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLXh0ZW5zYS9jcHVtYXNrLmgKcmVuYW1lIHRvIGFyY2gveHRlbnNhL2luY2x1ZGUvYXNtL2NwdW1hc2suaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL2NwdXRpbWUuaCBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL2NwdXRpbWUuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20teHRlbnNhL2NwdXRpbWUuaApyZW5hbWUgdG8gYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vY3B1dGltZS5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvY3VycmVudC5oIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vY3VycmVudC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS14dGVuc2EvY3VycmVudC5oCnJlbmFtZSB0byBhcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9jdXJyZW50LmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9kZWxheS5oIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vZGVsYXkuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20teHRlbnNhL2RlbGF5LmgKcmVuYW1lIHRvIGFyY2gveHRlbnNhL2luY2x1ZGUvYXNtL2RlbGF5LmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9kZXZpY2UuaCBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL2RldmljZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS14dGVuc2EvZGV2aWNlLmgKcmVuYW1lIHRvIGFyY2gveHRlbnNhL2luY2x1ZGUvYXNtL2RldmljZS5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvZGl2NjQuaCBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL2RpdjY0LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLXh0ZW5zYS9kaXY2NC5oCnJlbmFtZSB0byBhcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9kaXY2NC5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvZG1hLW1hcHBpbmcuaCBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL2RtYS1tYXBwaW5nLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLXh0ZW5zYS9kbWEtbWFwcGluZy5oCnJlbmFtZSB0byBhcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9kbWEtbWFwcGluZy5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvZG1hLmggYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9kbWEuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20teHRlbnNhL2RtYS5oCnJlbmFtZSB0byBhcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9kbWEuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL2VsZi5oIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vZWxmLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLXh0ZW5zYS9lbGYuaApyZW5hbWUgdG8gYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vZWxmLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9lbWVyZ2VuY3ktcmVzdGFydC5oIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vZW1lcmdlbmN5LXJlc3RhcnQuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20teHRlbnNhL2VtZXJnZW5jeS1yZXN0YXJ0LmgKcmVuYW1lIHRvIGFyY2gveHRlbnNhL2luY2x1ZGUvYXNtL2VtZXJnZW5jeS1yZXN0YXJ0LmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9lcnJuby5oIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vZXJybm8uaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20teHRlbnNhL2Vycm5vLmgKcmVuYW1lIHRvIGFyY2gveHRlbnNhL2luY2x1ZGUvYXNtL2Vycm5vLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9mYi5oIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vZmIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20teHRlbnNhL2ZiLmgKcmVuYW1lIHRvIGFyY2gveHRlbnNhL2luY2x1ZGUvYXNtL2ZiLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9mY250bC5oIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vZmNudGwuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20teHRlbnNhL2ZjbnRsLmgKcmVuYW1lIHRvIGFyY2gveHRlbnNhL2luY2x1ZGUvYXNtL2ZjbnRsLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9mdXRleC5oIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vZnV0ZXguaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20teHRlbnNhL2Z1dGV4LmgKcmVuYW1lIHRvIGFyY2gveHRlbnNhL2luY2x1ZGUvYXNtL2Z1dGV4LmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9oYXJkaXJxLmggYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9oYXJkaXJxLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLXh0ZW5zYS9oYXJkaXJxLmgKcmVuYW1lIHRvIGFyY2gveHRlbnNhL2luY2x1ZGUvYXNtL2hhcmRpcnEuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL2hpZ2htZW0uaCBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL2hpZ2htZW0uaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20teHRlbnNhL2hpZ2htZW0uaApyZW5hbWUgdG8gYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vaGlnaG1lbS5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvaHdfaXJxLmggYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9od19pcnEuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20teHRlbnNhL2h3X2lycS5oCnJlbmFtZSB0byBhcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9od19pcnEuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL2lvLmggYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9pby5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS14dGVuc2EvaW8uaApyZW5hbWUgdG8gYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vaW8uaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL2lvY3RsLmggYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9pb2N0bC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS14dGVuc2EvaW9jdGwuaApyZW5hbWUgdG8gYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vaW9jdGwuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL2lvY3Rscy5oIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vaW9jdGxzLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLXh0ZW5zYS9pb2N0bHMuaApyZW5hbWUgdG8gYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vaW9jdGxzLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9pcGNidWYuaCBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL2lwY2J1Zi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS14dGVuc2EvaXBjYnVmLmgKcmVuYW1lIHRvIGFyY2gveHRlbnNhL2luY2x1ZGUvYXNtL2lwY2J1Zi5oCmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9pcnEuaCBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL2lycS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2MjBkMWUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9pcnEuaApAQCAtMCwwICsxLDMwIEBACisvKgorICogaW5jbHVkZS9hc20teHRlbnNhL2lycS5oCisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxIC0gMjAwNSBUZW5zaWxpY2EgSW5jLgorICovCisKKyNpZm5kZWYgX1hURU5TQV9JUlFfSAorI2RlZmluZSBfWFRFTlNBX0lSUV9ICisKKyNpbmNsdWRlIDxwbGF0Zm9ybS9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPHZhcmlhbnQvY29yZS5oPgorCisjaWZuZGVmIFBMQVRGT1JNX05SX0lSUVMKKyMgZGVmaW5lIFBMQVRGT1JNX05SX0lSUVMgMAorI2VuZGlmCisjZGVmaW5lIFhURU5TQV9OUl9JUlFTIFhDSEFMX05VTV9JTlRFUlJVUFRTCisjZGVmaW5lIE5SX0lSUVMgKFhURU5TQV9OUl9JUlFTICsgUExBVEZPUk1fTlJfSVJRUykKKworc3RhdGljIF9faW5saW5lX18gaW50IGlycV9jYW5vbmljYWxpemUoaW50IGlycSkKK3sKKwlyZXR1cm4gKGlycSk7Cit9CisKK3N0cnVjdCBpcnFhY3Rpb247CisKKyNlbmRpZgkvKiBfWFRFTlNBX0lSUV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvaXJxX3JlZ3MuaCBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL2lycV9yZWdzLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLXh0ZW5zYS9pcnFfcmVncy5oCnJlbmFtZSB0byBhcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9pcnFfcmVncy5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2Eva2RlYnVnLmggYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9rZGVidWcuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20teHRlbnNhL2tkZWJ1Zy5oCnJlbmFtZSB0byBhcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9rZGVidWcuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL2ttYXBfdHlwZXMuaCBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL2ttYXBfdHlwZXMuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20teHRlbnNhL2ttYXBfdHlwZXMuaApyZW5hbWUgdG8gYXJjaC94dGVuc2EvaW5jbHVkZS9hc20va21hcF90eXBlcy5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvbGlua2FnZS5oIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vbGlua2FnZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS14dGVuc2EvbGlua2FnZS5oCnJlbmFtZSB0byBhcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9saW5rYWdlLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9sb2NhbC5oIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vbG9jYWwuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20teHRlbnNhL2xvY2FsLmgKcmVuYW1lIHRvIGFyY2gveHRlbnNhL2luY2x1ZGUvYXNtL2xvY2FsLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9tbWFuLmggYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9tbWFuLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLXh0ZW5zYS9tbWFuLmgKcmVuYW1lIHRvIGFyY2gveHRlbnNhL2luY2x1ZGUvYXNtL21tYW4uaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL21tdS5oIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vbW11LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLXh0ZW5zYS9tbXUuaApyZW5hbWUgdG8gYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vbW11LmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9tbXVfY29udGV4dC5oIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vbW11X2NvbnRleHQuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20teHRlbnNhL21tdV9jb250ZXh0LmgKcmVuYW1lIHRvIGFyY2gveHRlbnNhL2luY2x1ZGUvYXNtL21tdV9jb250ZXh0LmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9tb2R1bGUuaCBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL21vZHVsZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS14dGVuc2EvbW9kdWxlLmgKcmVuYW1lIHRvIGFyY2gveHRlbnNhL2luY2x1ZGUvYXNtL21vZHVsZS5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvbXNnYnVmLmggYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9tc2didWYuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20teHRlbnNhL21zZ2J1Zi5oCnJlbmFtZSB0byBhcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9tc2didWYuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL211dGV4LmggYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9tdXRleC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS14dGVuc2EvbXV0ZXguaApyZW5hbWUgdG8gYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vbXV0ZXguaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL3BhZ2UuaCBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3BhZ2UuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20teHRlbnNhL3BhZ2UuaApyZW5hbWUgdG8gYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vcGFnZS5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvcGFyYW0uaCBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3BhcmFtLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLXh0ZW5zYS9wYXJhbS5oCnJlbmFtZSB0byBhcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9wYXJhbS5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvcGNpLWJyaWRnZS5oIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vcGNpLWJyaWRnZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS14dGVuc2EvcGNpLWJyaWRnZS5oCnJlbmFtZSB0byBhcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9wY2ktYnJpZGdlLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9wY2kuaCBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3BjaS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS14dGVuc2EvcGNpLmgKcmVuYW1lIHRvIGFyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3BjaS5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvcGVyY3B1LmggYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9wZXJjcHUuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20teHRlbnNhL3BlcmNwdS5oCnJlbmFtZSB0byBhcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9wZXJjcHUuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL3BnYWxsb2MuaCBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3BnYWxsb2MuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20teHRlbnNhL3BnYWxsb2MuaApyZW5hbWUgdG8gYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vcGdhbGxvYy5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvcGd0YWJsZS5oIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vcGd0YWJsZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS14dGVuc2EvcGd0YWJsZS5oCnJlbmFtZSB0byBhcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9wZ3RhYmxlLmgKZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3BsYXRmb3JtLmggYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9wbGF0Zm9ybS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzZDVhNDgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9wbGF0Zm9ybS5oCkBAIC0wLDAgKzEsODkgQEAKKy8qCisgKiBQbGF0Zm9ybSBzcGVjaWZpYyBmdW5jdGlvbnMKKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsCisgKiBQdWJsaWMgTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mCisgKiB0aGlzIGFyY2hpdmUgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgLSAyMDA1IFRlbnNpbGljYSBJbmMuCisgKi8KKworI2lmbmRlZiBfWFRFTlNBX1BMQVRGT1JNX0gKKyNkZWZpbmUgX1hURU5TQV9QTEFURk9STV9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorCisjaW5jbHVkZSA8YXNtL2Jvb3RwYXJhbS5oPgorCisvKgorICogcGxhdGZvcm1faW5pdCBpcyBjYWxsZWQgYmVmb3JlIHRoZSBtbXUgaXMgaW5pdGlhbGl6ZWQgdG8gZ2l2ZSB0aGUKKyAqIHBsYXRmb3JtIGEgZWFybHkgaG9vay11cC4gYnBfdGFnX3QgaXMgYSBsaXN0IG9mIGNvbmZpZ3VyYXRpb24gdGFncworICogcGFzc2VkIGZyb20gdGhlIGJvb3QtbG9hZGVyLgorICovCitleHRlcm4gdm9pZCBwbGF0Zm9ybV9pbml0KGJwX3RhZ190Kik7CisKKy8qCisgKiBwbGF0Zm9ybV9zZXR1cCBpcyBjYWxsZWQgZnJvbSBzZXR1cF9hcmNoIHdpdGggYSBwb2ludGVyIHRvIHRoZSBjb21tYW5kLWxpbmUKKyAqIHN0cmluZy4KKyAqLworZXh0ZXJuIHZvaWQgcGxhdGZvcm1fc2V0dXAgKGNoYXIgKiopOworCisvKgorICogcGxhdGZvcm1faW5pdF9pcnEgaXMgY2FsbGVkIGZyb20gaW5pdF9JUlEuCisgKi8KK2V4dGVybiB2b2lkIHBsYXRmb3JtX2luaXRfaXJxICh2b2lkKTsKKworLyoKKyAqIHBsYXRmb3JtX3Jlc3RhcnQgaXMgY2FsbGVkIHRvIHJlc3RhcnQgdGhlIHN5c3RlbS4KKyAqLworZXh0ZXJuIHZvaWQgcGxhdGZvcm1fcmVzdGFydCAodm9pZCk7CisKKy8qCisgKiBwbGF0Zm9ybV9oYWx0IGlzIGNhbGxlZCB0byBzdG9wIHRoZSBzeXN0ZW0gYW5kIGhhbHQuCisgKi8KK2V4dGVybiB2b2lkIHBsYXRmb3JtX2hhbHQgKHZvaWQpOworCisvKgorICogcGxhdGZvcm1fcG93ZXJfb2ZmIGlzIGNhbGxlZCB0byBzdG9wIHRoZSBzeXN0ZW0gYW5kIHBvd2VyIGl0IG9mZi4KKyAqLworZXh0ZXJuIHZvaWQgcGxhdGZvcm1fcG93ZXJfb2ZmICh2b2lkKTsKKworLyoKKyAqIHBsYXRmb3JtX2lkbGUgaXMgY2FsbGVkIGZyb20gdGhlIGlkbGUgZnVuY3Rpb24uCisgKi8KK2V4dGVybiB2b2lkIHBsYXRmb3JtX2lkbGUgKHZvaWQpOworCisvKgorICogcGxhdGZvcm1faGVhcnRiZWF0IGlzIGNhbGxlZCBldmVyeSBIWgorICovCitleHRlcm4gdm9pZCBwbGF0Zm9ybV9oZWFydGJlYXQgKHZvaWQpOworCisvKgorICogcGxhdGZvcm1fcGNpYmlvc19pbml0IGlzIGNhbGxlZCB0byBhbGxvdyB0aGUgcGxhdGZvcm0gdG8gc2V0dXAgdGhlIHBjaSBidXMuCisgKi8KK2V4dGVybiB2b2lkIHBsYXRmb3JtX3BjaWJpb3NfaW5pdCAodm9pZCk7CisKKy8qCisgKiBwbGF0Zm9ybV9wY2liaW9zX2ZpeHVwIGFsbG93cyB0byBtb2RpZnkgdGhlIFBDSSBjb25maWd1cmF0aW9uLgorICovCitleHRlcm4gaW50IHBsYXRmb3JtX3BjaWJpb3NfZml4dXAgKHZvaWQpOworCisvKgorICogcGxhdGZvcm1fY2FsaWJyYXRlX2Njb3VudCBjYWxpYnJhdGVzIGNwdSBjbG9jayBmcmVxIChDT05GSUdfWFRFTlNBX0NBTElCUkFURSkKKyAqLworZXh0ZXJuIHZvaWQgcGxhdGZvcm1fY2FsaWJyYXRlX2Njb3VudCAodm9pZCk7CisKKy8qCisgKiBwbGF0Zm9ybV9nZXRfcnRjX3RpbWUgcmV0dXJucyBSVEMgc2Vjb25kcyAocmV0dXJucyAwIGZvciBubyBlcnJvcikKKyAqLworZXh0ZXJuIGludCBwbGF0Zm9ybV9nZXRfcnRjX3RpbWUodGltZV90Kik7CisKKy8qCisgKiBwbGF0Zm9ybV9zZXRfcnRjX3RpbWUgc2V0IFJUQyBzZWNvbmRzIChyZXR1cm5zIDAgZm9yIG5vIGVycm9yKQorICovCitleHRlcm4gaW50IHBsYXRmb3JtX3NldF9ydGNfdGltZSh0aW1lX3QpOworCisKKyNlbmRpZgkvKiBfWFRFTlNBX1BMQVRGT1JNX0ggKi8KKwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL3BvbGwuaCBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3BvbGwuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20teHRlbnNhL3BvbGwuaApyZW5hbWUgdG8gYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vcG9sbC5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvcG9zaXhfdHlwZXMuaCBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3Bvc2l4X3R5cGVzLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLXh0ZW5zYS9wb3NpeF90eXBlcy5oCnJlbmFtZSB0byBhcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9wb3NpeF90eXBlcy5oCmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9wcm9jZXNzb3IuaCBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3Byb2Nlc3Nvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3Mzg3ZDMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9wcm9jZXNzb3IuaApAQCAtMCwwICsxLDE5MyBAQAorLyoKKyAqIGluY2x1ZGUvYXNtLXh0ZW5zYS9wcm9jZXNzb3IuaAorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMSAtIDIwMDUgVGVuc2lsaWNhIEluYy4KKyAqLworCisjaWZuZGVmIF9YVEVOU0FfUFJPQ0VTU09SX0gKKyNkZWZpbmUgX1hURU5TQV9QUk9DRVNTT1JfSAorCisjaW5jbHVkZSA8dmFyaWFudC9jb3JlLmg+CisjaW5jbHVkZSA8YXNtL2NvcHJvY2Vzc29yLmg+CisKKyNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgorI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KKyNpbmNsdWRlIDxhc20vdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vcmVncy5oPgorCisvKiBBc3NlcnRpb25zLiAqLworCisjaWYgKFhDSEFMX0hBVkVfV0lORE9XRUQgIT0gMSkKKyMgZXJyb3IgTGludXggcmVxdWlyZXMgdGhlIFh0ZW5zYSBXaW5kb3dlZCBSZWdpc3RlcnMgT3B0aW9uLgorI2VuZGlmCisKKy8qCisgKiBVc2VyIHNwYWNlIHByb2Nlc3Mgc2l6ZTogMSBHQi4KKyAqIFdpbmRvd2VkIGNhbGwgQUJJIHJlcXVpcmVzIGNhbGxlciBhbmQgY2FsbGVlIHRvIGJlIGxvY2F0ZWQgd2l0aGluIHRoZSBzYW1lCisgKiAxIEdCIHJlZ2lvbi4gVGhlIEMgY29tcGlsZXIgcGxhY2VzIHRyYW1wb2xpbmUgY29kZSBvbiB0aGUgc3RhY2sgZm9yIHNvdXJjZXMKKyAqIHRoYXQgdGFrZSB0aGUgYWRkcmVzcyBvZiBhIG5lc3RlZCBDIGZ1bmN0aW9uIChhIGZlYXR1cmUgdXNlZCBieSBnbGliYyksIHNvCisgKiB0aGUgMSBHQiByZXF1aXJlbWVudCBhcHBsaWVzIHRvIHRoZSBzdGFjayBhcyB3ZWxsLgorICovCisKKyNkZWZpbmUgVEFTS19TSVpFCV9fWFRFTlNBX1VMX0NPTlNUKDB4NDAwMDAwMDApCisjZGVmaW5lIFNUQUNLX1RPUAlUQVNLX1NJWkUKKyNkZWZpbmUgU1RBQ0tfVE9QX01BWAlTVEFDS19UT1AKKworLyoKKyAqIEdlbmVyYWwgZXhjZXB0aW9uIGNhdXNlIGFzc2lnbmVkIHRvIGRlYnVnIGV4Y2VwdGlvbnMuIERlYnVnIGV4Y2VwdGlvbnMgZ28KKyAqIHRvIHRoZWlyIG93biB2ZWN0b3IsIHJhdGhlciB0aGFuIHRoZSBnZW5lcmFsIGV4Y2VwdGlvbiB2ZWN0b3JzICh1c2VyLAorICoga2VybmVsLCBkb3VibGUpOyBhbmQgdGhlaXIgc3BlY2lmaWMgY2F1c2VzIGFyZSByZXBvcnRlZCB2aWEgREVCVUdDQVVTRQorICogcmF0aGVyIHRoYW4gRVhDQ0FVU0UuICBIb3dldmVyIGl0IGlzIHNvbWV0aW1lcyBjb252ZW5pZW50IHRvIHJlZGlyZWN0IGRlYnVnCisgKiBleGNlcHRpb25zIHRvIHRoZSBnZW5lcmFsIGV4Y2VwdGlvbiBtZWNoYW5pc20uICBUbyBkbyB0aGlzLCBhbiBvdGhlcndpc2UKKyAqIHVudXNlZCBFWENDQVVTRSB2YWx1ZSB3YXMgYXNzaWduZWQgdG8gZGVidWcgZXhjZXB0aW9ucyBmb3IgdGhpcyBwdXJwb3NlLgorICovCisKKyNkZWZpbmUgRVhDQ0FVU0VfTUFQUEVEX0RFQlVHCTYzCisKKy8qCisgKiBXZSB1c2UgREVQQyBhbHNvIGFzIGEgZmxhZyB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIGRvdWJsZSBhbmQgcmVndWxhcgorICogZXhjZXB0aW9ucy4gRm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMsIERFUEMgbWlnaHQgY29udGFpbiB0aGUgdmFsdWUgb2YKKyAqIEVYQ0NBVVNFIGZvciByZWd1bGFyIGV4Y2VwdGlvbnMsIHNvIHdlIHVzZSB0aGlzIGRlZmluaXRpb24gdG8gbWFyayBhCisgKiB2YWxpZCBkb3VibGUgZXhjZXB0aW9uIGFkZHJlc3MuCisgKiAoTm90ZTogV2UgdXNlIGl0IGluIGJnZXVpLCBzbyBpdCBzaG91bGQgYmUgNjQsIDEyOCwgb3IgMjU2KQorICovCisKKyNkZWZpbmUgVkFMSURfRE9VQkxFX0VYQ0VQVElPTl9BRERSRVNTCTY0CisKKy8qIExPQ0tMRVZFTCBkZWZpbmVzIHRoZSBpbnRlcnJ1cHQgbGV2ZWwgdGhhdCBtYXNrcyBhbGwKKyAqIGdlbmVyYWwtcHVycG9zZSBpbnRlcnJ1cHRzLgorICovCisjZGVmaW5lIExPQ0tMRVZFTCAxCisKKy8qIFdTQklUUyBhbmQgV0JCSVRTIGFyZSB0aGUgd2lkdGggb2YgdGhlIFdJTkRPV1NUQVJUIGFuZCBXSU5ET1dCQVNFCisgKiByZWdpc3RlcnMKKyAqLworI2RlZmluZSBXU0JJVFMgIChYQ0hBTF9OVU1fQVJFR1MgLyA0KSAgICAgIC8qIHdpZHRoIG9mIFdJTkRPV1NUQVJUIGluIGJpdHMgKi8KKyNkZWZpbmUgV0JCSVRTICAoWENIQUxfTlVNX0FSRUdTX0xPRzIgLSAyKSAvKiB3aWR0aCBvZiBXSU5ET1dCQVNFIGluIGJpdHMgKi8KKworI2lmbmRlZiBfX0FTU0VNQkxZX18KKworLyogQnVpbGQgYSB2YWxpZCByZXR1cm4gYWRkcmVzcyBmb3IgdGhlIHNwZWNpZmllZCBjYWxsIHdpbnNpemUuCisgKiB3aW5zaXplIG11c3QgYmUgMSAoY2FsbDQpLCAyIChjYWxsOCksIG9yIDMgKGNhbGwxMikKKyAqLworI2RlZmluZSBNQUtFX1JBX0ZPUl9DQUxMKHJhLHdzKSAgICgoKHJhKSAmIDB4M2ZmZmZmZmYpIHwgKHdzKSA8PCAzMCkKKworLyogQ29udmVydCByZXR1cm4gYWRkcmVzcyB0byBhIHZhbGlkIHBjCisgKiBOb3RlOiBXZSBhc3N1bWUgdGhhdCB0aGUgc3RhY2sgcG9pbnRlciBpcyBpbiB0aGUgc2FtZSAxR0IgcmFuZ2VzIGFzIHRoZSByYQorICovCisjZGVmaW5lIE1BS0VfUENfRlJPTV9SQShyYSxzcCkgICAgKCgocmEpICYgMHgzZmZmZmZmZikgfCAoKHNwKSAmIDB4YzAwMDAwMDApKQorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdW5zaWduZWQgbG9uZyBzZWc7Cit9IG1tX3NlZ21lbnRfdDsKKworc3RydWN0IHRocmVhZF9zdHJ1Y3QgeworCisJLyoga2VybmVsJ3MgcmV0dXJuIGFkZHJlc3MgYW5kIHN0YWNrIHBvaW50ZXIgZm9yIGNvbnRleHQgc3dpdGNoaW5nICovCisJdW5zaWduZWQgbG9uZyByYTsgLyoga2VybmVsJ3MgYTA6IHJldHVybiBhZGRyZXNzIGFuZCB3aW5kb3cgY2FsbCBzaXplICovCisJdW5zaWduZWQgbG9uZyBzcDsgLyoga2VybmVsJ3MgYTE6IHN0YWNrIHBvaW50ZXIgKi8KKworCW1tX3NlZ21lbnRfdCBjdXJyZW50X2RzOyAgICAvKiBzZWUgdWFjY2Vzcy5oIGZvciBleGFtcGxlIHVzZXMgKi8KKworCS8qIHN0cnVjdCB4dGVuc2FfY3B1aW5mbyBpbmZvOyAqLworCisJdW5zaWduZWQgbG9uZyBiYWRfdmFkZHI7IC8qIGxhc3QgdXNlciBmYXVsdCAqLworCXVuc2lnbmVkIGxvbmcgYmFkX3VhZGRyOyAvKiBsYXN0IGtlcm5lbCBmYXVsdCBhY2Nlc3NpbmcgdXNlciBzcGFjZSAqLworCXVuc2lnbmVkIGxvbmcgZXJyb3JfY29kZTsKKworCXVuc2lnbmVkIGxvbmcgaWJyZWFrW1hDSEFMX05VTV9JQlJFQUtdOworCXVuc2lnbmVkIGxvbmcgZGJyZWFrYVtYQ0hBTF9OVU1fREJSRUFLXTsKKwl1bnNpZ25lZCBsb25nIGRicmVha2NbWENIQUxfTlVNX0RCUkVBS107CisKKwkvKiBNYWtlIHN0cnVjdHVyZSAxNiBieXRlcyBhbGlnbmVkLiAqLworCWludCBhbGlnblswXSBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCgxNikpKTsKK307CisKKworLyoKKyAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgbWFjcm8gdGhhdCByZXR1cm5zIGN1cnJlbnQKKyAqIGluc3RydWN0aW9uIHBvaW50ZXIgKCJwcm9ncmFtIGNvdW50ZXIiKS4KKyAqLworI2RlZmluZSBjdXJyZW50X3RleHRfYWRkcigpICAoeyBfX2xhYmVsX18gX2w7IF9sOiAmJl9sO30pCisKKworLyogVGhpcyBkZWNpZGVzIHdoZXJlIHRoZSBrZXJuZWwgd2lsbCBzZWFyY2ggZm9yIGEgZnJlZSBjaHVuayBvZiB2bQorICogc3BhY2UgZHVyaW5nIG1tYXAncy4KKyAqLworI2RlZmluZSBUQVNLX1VOTUFQUEVEX0JBU0UJKFRBU0tfU0laRSAvIDIpCisKKyNkZWZpbmUgSU5JVF9USFJFQUQgIFwKK3sJCQkJCQkJCQlcCisJcmE6CQkwLCAJCQkJCQlcCisJc3A6CQlzaXplb2YoaW5pdF9zdGFjaykgKyAobG9uZykgJmluaXRfc3RhY2ssCVwKKwljdXJyZW50X2RzOgl7MH0sCQkJCQkJXAorCS8qaW5mbzoJCXswfSwgKi8JCQkJCQlcCisJYmFkX3ZhZGRyOgkwLAkJCQkJCVwKKwliYWRfdWFkZHI6CTAsCQkJCQkJXAorCWVycm9yX2NvZGU6CTAsCQkJCQkJXAorfQorCisKKy8qCisgKiBEbyBuZWNlc3Nhcnkgc2V0dXAgdG8gc3RhcnQgdXAgYSBuZXdseSBleGVjdXRlZCB0aHJlYWQuCisgKiBOb3RlOiBXZSBzZXQtdXAgcHMgYXMgaWYgd2UgZGlkIGEgY2FsbDQgdG8gdGhlIG5ldyBwYy4KKyAqICAgICAgIHNldF90aHJlYWRfc3RhdGUgaW4gc2lnbmFsLmMgZGVwZW5kcyBvbiBpdC4KKyAqLworI2RlZmluZSBVU0VSX1BTX1ZBTFVFICgoMSA8PCBQU19XT0VfQklUKSB8CQkJCVwKKyAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgUFNfQ0FMTElOQ19TSElGVCkgfAkJCVwKKyAgICAgICAgICAgICAgICAgICAgICAgKFVTRVJfUklORyA8PCBQU19SSU5HX1NISUZUKSB8CQkJXAorICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCBQU19VTV9CSVQpIHwJCQkJXAorICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCBQU19FWENNX0JJVCkpCisKKy8qIENsZWFyaW5nIGEwIHRlcm1pbmF0ZXMgdGhlIGJhY2t0cmFjZS4gKi8KKyNkZWZpbmUgc3RhcnRfdGhyZWFkKHJlZ3MsIG5ld19wYywgbmV3X3NwKSBcCisJcmVncy0+cGMgPSBuZXdfcGM7IFwKKwlyZWdzLT5wcyA9IFVTRVJfUFNfVkFMVUU7IFwKKwlyZWdzLT5hcmVnWzFdID0gbmV3X3NwOyBcCisJcmVncy0+YXJlZ1swXSA9IDA7IFwKKwlyZWdzLT53bWFzayA9IDE7IFwKKwlyZWdzLT5kZXBjID0gMDsgXAorCXJlZ3MtPndpbmRvd2Jhc2UgPSAwOyBcCisJcmVncy0+d2luZG93c3RhcnQgPSAxOworCisvKiBGb3J3YXJkIGRlY2xhcmF0aW9uICovCitzdHJ1Y3QgdGFza19zdHJ1Y3Q7CitzdHJ1Y3QgbW1fc3RydWN0OworCisvKiBGcmVlIGFsbCByZXNvdXJjZXMgaGVsZCBieSBhIHRocmVhZC4gKi8KKyNkZWZpbmUgcmVsZWFzZV90aHJlYWQodGhyZWFkKSBkbyB7IH0gd2hpbGUoMCkKKworLyogUHJlcGFyZSB0byBjb3B5IHRocmVhZCBzdGF0ZSAtIHVubGF6eSBhbGwgbGF6eSBzdGF0dXMgKi8KK2V4dGVybiB2b2lkIHByZXBhcmVfdG9fY29weShzdHJ1Y3QgdGFza19zdHJ1Y3QqKTsKKworLyogQ3JlYXRlIGEga2VybmVsIHRocmVhZCB3aXRob3V0IHJlbW92aW5nIGl0IGZyb20gdGFza2xpc3RzICovCitleHRlcm4gaW50IGtlcm5lbF90aHJlYWQoaW50ICgqZm4pKHZvaWQgKiksIHZvaWQgKiBhcmcsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOworCisvKiBDb3B5IGFuZCByZWxlYXNlIGFsbCBzZWdtZW50IGluZm8gYXNzb2NpYXRlZCB3aXRoIGEgVk0gKi8KKyNkZWZpbmUgY29weV9zZWdtZW50cyhwLCBtbSkJZG8geyB9IHdoaWxlKDApCisjZGVmaW5lIHJlbGVhc2Vfc2VnbWVudHMobW0pCWRvIHsgfSB3aGlsZSgwKQorI2RlZmluZSBmb3JnZXRfc2VnbWVudHMoKQlkbyB7IH0gd2hpbGUgKDApCisKKyNkZWZpbmUgdGhyZWFkX3NhdmVkX3BjKHRzaykJKHRhc2tfcHRfcmVncyh0c2spLT5wYykKKworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgZ2V0X3djaGFuKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCk7CisKKyNkZWZpbmUgS1NUS19FSVAodHNrKQkJKHRhc2tfcHRfcmVncyh0c2spLT5wYykKKyNkZWZpbmUgS1NUS19FU1AodHNrKQkJKHRhc2tfcHRfcmVncyh0c2spLT5hcmVnWzFdKQorCisjZGVmaW5lIGNwdV9yZWxheCgpICBiYXJyaWVyKCkKKworLyogU3BlY2lhbCByZWdpc3RlciBhY2Nlc3MuICovCisKKyNkZWZpbmUgV1NSKHYsc3IpIF9fYXNtX18gX192b2xhdGlsZV9fICgid3NyICUwLCJfX3N0cmluZ2lmeShzcikgOjogImEiKHYpKTsKKyNkZWZpbmUgUlNSKHYsc3IpIF9fYXNtX18gX192b2xhdGlsZV9fICgicnNyICUwLCJfX3N0cmluZ2lmeShzcikgOiAiPWEiKHYpKTsKKworI2RlZmluZSBzZXRfc3IoeCxzcikgKHt1bnNpZ25lZCBpbnQgdj0odW5zaWduZWQgaW50KXg7IFdTUih2LHNyKTt9KQorI2RlZmluZSBnZXRfc3Ioc3IpICh7dW5zaWduZWQgaW50IHY7IFJTUih2LHNyKTsgdjsgfSkKKworI2VuZGlmCS8qIF9fQVNTRU1CTFlfXyAqLworI2VuZGlmCS8qIF9YVEVOU0FfUFJPQ0VTU09SX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3B0cmFjZS5oIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vcHRyYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTA1ZTFlNgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3B0cmFjZS5oCkBAIC0wLDAgKzEsMTM1IEBACisvKgorICogaW5jbHVkZS9hc20teHRlbnNhL3B0cmFjZS5oCisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxIC0gMjAwNSBUZW5zaWxpY2EgSW5jLgorICovCisKKyNpZm5kZWYgX1hURU5TQV9QVFJBQ0VfSAorI2RlZmluZSBfWFRFTlNBX1BUUkFDRV9ICisKKy8qCisgKiBLZXJuZWwgc3RhY2sKKyAqCisgKiAJCSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsgIC0tLS0tLS0tIFNUQUNLX1NJWkUKKyAqIAkJfCAgICAgcmVnaXN0ZXIgZmlsZSAgICAgfCAgfAorICogCQkrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rICB8CisgKiAJCXwgICAgc3RydWN0IHB0X3JlZ3MgICAgIHwgIHwKKyAqIAkJKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKyAgfCAtLS0tLS0gUFRfUkVHU19PRkZTRVQKKyAqIGRvdWJsZSAJOiAgMTYgYnl0ZXMgc3BpbGwgYXJlYSAgOiAgfCAgXgorICogZXhjZXRpb24gCTotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLTogIHwgIHwKKyAqIGZyYW1lCTogICAgc3RydWN0IHB0X3JlZ3MgICAgIDogIHwgIHwKKyAqIAkJOi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtOiAgfCAgfAorICogCQl8ICAgICAgICAgICAgICAgICAgICAgICB8ICB8ICB8CisgKiAJCXwgICAgIG1lbW9yeSBzdGFjayAgICAgIHwgIHwgIHwKKyAqIAkJfCAgICAgICAgICAgICAgICAgICAgICAgfCAgfCAgfAorICogCQl+ICAgICAgICAgICAgICAgICAgICAgICB+ICB+ICB+CisgKiAJCX4gICAgICAgICAgICAgICAgICAgICAgIH4gIH4gIH4KKyAqIAkJfCAgICAgICAgICAgICAgICAgICAgICAgfCAgfCAgfAorICogCQl8ICAgICAgICAgICAgICAgICAgICAgICB8ICB8ICB8CisgKiAJCSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsgIHwgIHwgLS0tIFNUQUNLX0JJQVMKKyAqIAkJfCAgc3RydWN0IHRhc2tfc3RydWN0ICAgfCAgfCAgfCAgXgorICogIGN1cnJlbnQgLS0+ICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsgIHwgIHwgIHwKKyAqIAkJfCAgc3RydWN0IHRocmVhZF9pbmZvICAgfCAgfCAgfCAgfAorICoJCSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsgLS0tLS0tLS0KKyAqLworCisjZGVmaW5lIEtFUk5FTF9TVEFDS19TSVpFICgyICogUEFHRV9TSVpFKQorCisvKiAgT2Zmc2V0cyBmb3IgZXhjZXB0aW9uX2hhbmRsZXJzW10gKDMgeCA2NC1lbnRyaWVzIHggNC1ieXRlIHRhYmxlcykuICovCisKKyNkZWZpbmUgRVhDX1RBQkxFX0tTVEsJCTB4MDA0CS8qIEtlcm5lbCBTdGFjayAqLworI2RlZmluZSBFWENfVEFCTEVfRE9VQkxFX1NBVkUJMHgwMDgJLyogRG91YmxlIGV4Y2VwdGlvbiBzYXZlIGFyZWEgZm9yIGEwICovCisjZGVmaW5lIEVYQ19UQUJMRV9GSVhVUAkJMHgwMGMJLyogRml4dXAgaGFuZGxlciAqLworI2RlZmluZSBFWENfVEFCTEVfUEFSQU0JCTB4MDEwCS8qIEZvciBwYXNzaW5nIGEgcGFyYW1ldGVyIHRvIGZpeHVwICovCisjZGVmaW5lIEVYQ19UQUJMRV9TWVNDQUxMX1NBVkUJMHgwMTQJLyogRm9yIGZhc3Qgc3lzY2FsbCBoYW5kbGVyICovCisjZGVmaW5lIEVYQ19UQUJMRV9GQVNUX1VTRVIJMHgxMDAJLyogRmFzdCB1c2VyIGV4Y2VwdGlvbiBoYW5kbGVyICovCisjZGVmaW5lIEVYQ19UQUJMRV9GQVNUX0tFUk5FTAkweDIwMAkvKiBGYXN0IGtlcm5lbCBleGNlcHRpb24gaGFuZGxlciAqLworI2RlZmluZSBFWENfVEFCTEVfREVGQVVMVAkweDMwMAkvKiBEZWZhdWx0IEMtSGFuZGxlciAqLworI2RlZmluZSBFWENfVEFCTEVfU0laRQkJMHg0MDAKKworLyogUmVnaXN0ZXJzIHVzZWQgYnkgc3RyYWNlICovCisKKyNkZWZpbmUgUkVHX0FfQkFTRQkweDAwMDAKKyNkZWZpbmUgUkVHX0FSX0JBU0UJMHgwMTAwCisjZGVmaW5lIFJFR19QQwkJMHgwMDIwCisjZGVmaW5lIFJFR19QUwkJMHgwMmU2CisjZGVmaW5lIFJFR19XQgkJMHgwMjQ4CisjZGVmaW5lIFJFR19XUwkJMHgwMjQ5CisjZGVmaW5lIFJFR19MQkVHCTB4MDIwMAorI2RlZmluZSBSRUdfTEVORAkweDAyMDEKKyNkZWZpbmUgUkVHX0xDT1VOVAkweDAyMDIKKyNkZWZpbmUgUkVHX1NBUgkJMHgwMjAzCisKKyNkZWZpbmUgU1lTQ0FMTF9OUgkweDAwZmYKKworLyogT3RoZXIgUFRSQUNFXyB2YWx1ZXMgZGVmaW5lZCBpbiA8bGludXgvcHRyYWNlLmg+IHVzaW5nIHZhbHVlcyAwLTksMTYsMTcsMjQgKi8KKworI2RlZmluZSBQVFJBQ0VfR0VUUkVHUwkJMTIKKyNkZWZpbmUgUFRSQUNFX1NFVFJFR1MJCTEzCisjZGVmaW5lIFBUUkFDRV9HRVRYVFJFR1MJMTgKKyNkZWZpbmUgUFRSQUNFX1NFVFhUUkVHUwkxOQorCisjaWZkZWYgX19LRVJORUxfXworCisjaWZuZGVmIF9fQVNTRU1CTFlfXworCisvKgorICogVGhpcyBzdHJ1Y3QgZGVmaW5lcyB0aGUgd2F5IHRoZSByZWdpc3RlcnMgYXJlIHN0b3JlZCBvbiB0aGUKKyAqIGtlcm5lbCBzdGFjayBkdXJpbmcgYSBzeXN0ZW0gY2FsbCBvciBvdGhlciBrZXJuZWwgZW50cnkuCisgKi8KK3N0cnVjdCBwdF9yZWdzIHsKKwl1bnNpZ25lZCBsb25nIHBjOwkJLyogICA0ICovCisJdW5zaWduZWQgbG9uZyBwczsJCS8qICAgOCAqLworCXVuc2lnbmVkIGxvbmcgZGVwYzsJCS8qICAxMiAqLworCXVuc2lnbmVkIGxvbmcgZXhjY2F1c2U7CQkvKiAgMTYgKi8KKwl1bnNpZ25lZCBsb25nIGV4Y3ZhZGRyOwkJLyogIDIwICovCisJdW5zaWduZWQgbG9uZyBkZWJ1Z2NhdXNlOwkvKiAgMjQgKi8KKwl1bnNpZ25lZCBsb25nIHdtYXNrOwkJLyogIDI4ICovCisJdW5zaWduZWQgbG9uZyBsYmVnOwkJLyogIDMyICovCisJdW5zaWduZWQgbG9uZyBsZW5kOwkJLyogIDM2ICovCisJdW5zaWduZWQgbG9uZyBsY291bnQ7CQkvKiAgNDAgKi8KKwl1bnNpZ25lZCBsb25nIHNhcjsJCS8qICA0NCAqLworCXVuc2lnbmVkIGxvbmcgd2luZG93YmFzZTsJLyogIDQ4ICovCisJdW5zaWduZWQgbG9uZyB3aW5kb3dzdGFydDsJLyogIDUyICovCisJdW5zaWduZWQgbG9uZyBzeXNjYWxsOwkJLyogIDU2ICovCisJdW5zaWduZWQgbG9uZyBpY291bnRsZXZlbDsJLyogIDYwICovCisJaW50IHJlc2VydmVkWzFdOwkJLyogIDY0ICovCisKKwkvKiBBZGRpdGlvbmFsIGNvbmZpZ3VyYWJsZSByZWdpc3RlcnMgdGhhdCBhcmUgdXNlZCBieSB0aGUgY29tcGlsZXIuICovCisJeHRyZWdzX29wdF90IHh0cmVnc19vcHQ7CisKKwkvKiBNYWtlIHN1cmUgdGhlIGFyZWcgZmllbGQgaXMgMTYgYnl0ZXMgYWxpZ25lZC4gKi8KKwlpbnQgYWxpZ25bMF0gX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQoMTYpKSk7CisKKwkvKiBjdXJyZW50IHJlZ2lzdGVyIGZyYW1lLgorCSAqIE5vdGU6IFRoZSBFU0YgZm9yIGtlcm5lbCBleGNlcHRpb25zIGVuZHMgYWZ0ZXIgMTYgcmVnaXN0ZXJzIQorCSAqLworCXVuc2lnbmVkIGxvbmcgYXJlZ1sxNl07CQkvKiAxMjggKDY0KSAqLworfTsKKworI2luY2x1ZGUgPHZhcmlhbnQvY29yZS5oPgorCisjIGRlZmluZSB0YXNrX3B0X3JlZ3ModHNrKSAoKHN0cnVjdCBwdF9yZWdzKikgXAorICAodGFza19zdGFja19wYWdlKHRzaykgKyBLRVJORUxfU1RBQ0tfU0laRSAtIChYQ0hBTF9OVU1fQVJFR1MtMTYpKjQpIC0gMSkKKyMgZGVmaW5lIHVzZXJfbW9kZShyZWdzKSAoKChyZWdzKS0+cHMgJiAweDAwMDAwMDIwKSE9MCkKKyMgZGVmaW5lIGluc3RydWN0aW9uX3BvaW50ZXIocmVncykgKChyZWdzKS0+cGMpCitleHRlcm4gdm9pZCBzaG93X3JlZ3Moc3RydWN0IHB0X3JlZ3MgKik7CisKKyMgaWZuZGVmIENPTkZJR19TTVAKKyMgIGRlZmluZSBwcm9maWxlX3BjKHJlZ3MpIGluc3RydWN0aW9uX3BvaW50ZXIocmVncykKKyMgZW5kaWYKKworI2Vsc2UJLyogX19BU1NFTUJMWV9fICovCisKKyMgaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CisjZGVmaW5lIFBUX1JFR1NfT0ZGU0VUCSAgKEtFUk5FTF9TVEFDS19TSVpFIC0gUFRfVVNFUl9TSVpFKQorCisjZW5kaWYJLyogIV9fQVNTRU1CTFlfXyAqLworCisjZW5kaWYgIC8qIF9fS0VSTkVMX18gKi8KKworI2VuZGlmCS8qIF9YVEVOU0FfUFRSQUNFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9yZWdzLmggYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9yZWdzLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLXh0ZW5zYS9yZWdzLmgKcmVuYW1lIHRvIGFyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3JlZ3MuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL3Jlc291cmNlLmggYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9yZXNvdXJjZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS14dGVuc2EvcmVzb3VyY2UuaApyZW5hbWUgdG8gYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vcmVzb3VyY2UuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL3JtYXAuaCBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3JtYXAuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20teHRlbnNhL3JtYXAuaApyZW5hbWUgdG8gYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vcm1hcC5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvcndzZW0uaCBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3J3c2VtLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLXh0ZW5zYS9yd3NlbS5oCnJlbmFtZSB0byBhcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9yd3NlbS5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2Evc2NhdHRlcmxpc3QuaCBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3NjYXR0ZXJsaXN0LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLXh0ZW5zYS9zY2F0dGVybGlzdC5oCnJlbmFtZSB0byBhcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9zY2F0dGVybGlzdC5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2Evc2VjdGlvbnMuaCBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3NlY3Rpb25zLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLXh0ZW5zYS9zZWN0aW9ucy5oCnJlbmFtZSB0byBhcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9zZWN0aW9ucy5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2Evc2VnbWVudC5oIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vc2VnbWVudC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS14dGVuc2Evc2VnbWVudC5oCnJlbmFtZSB0byBhcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9zZWdtZW50LmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9zZW1idWYuaCBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3NlbWJ1Zi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS14dGVuc2Evc2VtYnVmLmgKcmVuYW1lIHRvIGFyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3NlbWJ1Zi5oCmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9zZXJpYWwuaCBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3NlcmlhbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4YTI0OTMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9zZXJpYWwuaApAQCAtMCwwICsxLDE4IEBACisvKgorICogaW5jbHVkZS9hc20teHRlbnNhL3NlcmlhbC5oCisgKgorICogQ29uZmlndXJhdGlvbiBkZXRhaWxzIGZvciA4MjUwLCAxNjQ1MCwgMTY1NTAsIGV0Yy4gc2VyaWFsIHBvcnRzCisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxIC0gMjAwNSBUZW5zaWxpY2EgSW5jLgorICovCisKKyNpZm5kZWYgX1hURU5TQV9TRVJJQUxfSAorI2RlZmluZSBfWFRFTlNBX1NFUklBTF9ICisKKyNpbmNsdWRlIDxwbGF0Zm9ybS9zZXJpYWwuaD4KKworI2VuZGlmCS8qIF9YVEVOU0FfU0VSSUFMX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9zZXR1cC5oIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vc2V0dXAuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20teHRlbnNhL3NldHVwLmgKcmVuYW1lIHRvIGFyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3NldHVwLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9zaG1idWYuaCBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3NobWJ1Zi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS14dGVuc2Evc2htYnVmLmgKcmVuYW1lIHRvIGFyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3NobWJ1Zi5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2Evc2htcGFyYW0uaCBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3NobXBhcmFtLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLXh0ZW5zYS9zaG1wYXJhbS5oCnJlbmFtZSB0byBhcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9zaG1wYXJhbS5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2Evc2lnY29udGV4dC5oIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vc2lnY29udGV4dC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS14dGVuc2Evc2lnY29udGV4dC5oCnJlbmFtZSB0byBhcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9zaWdjb250ZXh0LmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9zaWdpbmZvLmggYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9zaWdpbmZvLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLXh0ZW5zYS9zaWdpbmZvLmgKcmVuYW1lIHRvIGFyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3NpZ2luZm8uaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL3NpZ25hbC5oIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vc2lnbmFsLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLXh0ZW5zYS9zaWduYWwuaApyZW5hbWUgdG8gYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vc2lnbmFsLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9zbXAuaCBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3NtcC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS14dGVuc2Evc21wLmgKcmVuYW1lIHRvIGFyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3NtcC5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2Evc29ja2V0LmggYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9zb2NrZXQuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20teHRlbnNhL3NvY2tldC5oCnJlbmFtZSB0byBhcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9zb2NrZXQuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL3NvY2tpb3MuaCBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3NvY2tpb3MuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20teHRlbnNhL3NvY2tpb3MuaApyZW5hbWUgdG8gYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vc29ja2lvcy5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2Evc3BpbmxvY2suaCBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3NwaW5sb2NrLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLXh0ZW5zYS9zcGlubG9jay5oCnJlbmFtZSB0byBhcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9zcGlubG9jay5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2Evc3RhdC5oIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vc3RhdC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS14dGVuc2Evc3RhdC5oCnJlbmFtZSB0byBhcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9zdGF0LmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9zdGF0ZnMuaCBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3N0YXRmcy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS14dGVuc2Evc3RhdGZzLmgKcmVuYW1lIHRvIGFyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3N0YXRmcy5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2Evc3RyaW5nLmggYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9zdHJpbmcuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20teHRlbnNhL3N0cmluZy5oCnJlbmFtZSB0byBhcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9zdHJpbmcuaApkaWZmIC0tZ2l0IGEvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vc3dhYi5oIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vc3dhYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1MGI2OTcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9zd2FiLmgKQEAgLTAsMCArMSw3MCBAQAorLyoKKyAqIGluY2x1ZGUvYXNtLXh0ZW5zYS9zd2FiLmgKKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgLSAyMDA1IFRlbnNpbGljYSBJbmMuCisgKi8KKworI2lmbmRlZiBfWFRFTlNBX1NXQUJfSAorI2RlZmluZSBfWFRFTlNBX1NXQUJfSAorCisjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KKworI2RlZmluZSBfX1NXQUJfNjRfVEhSVV8zMl9fCisKK3N0YXRpYyBpbmxpbmUgX19hdHRyaWJ1dGVfY29uc3RfXyBfX3UzMiBfX2FyY2hfc3dhYjMyKF9fdTMyIHgpCit7CisgICAgX191MzIgcmVzOworICAgIC8qIGluc3RydWN0aW9uIHNlcXVlbmNlIGZyb20gWHRlbnNhIElTQSByZWxlYXNlIDIvMjAwMCAqLworICAgIF9fYXNtX18oInNzYWkgICAgIDggICAgICAgICAgIFxuXHQiCisJICAgICJzcmxpICAgICAlMCwgJTEsIDE2ICBcblx0IgorCSAgICAic3JjICAgICAgJTAsICUwLCAlMSAgXG5cdCIKKwkgICAgInNyYyAgICAgICUwLCAlMCwgJTAgIFxuXHQiCisJICAgICJzcmMgICAgICAlMCwgJTEsICUwICBcbiIKKwkgICAgOiAiPSZhIiAocmVzKQorCSAgICA6ICJhIiAoeCkKKwkgICAgKTsKKyAgICByZXR1cm4gcmVzOworfQorI2RlZmluZSBfX2FyY2hfc3dhYjMyIF9fYXJjaF9zd2FiMzIKKworc3RhdGljIGlubGluZSBfX2F0dHJpYnV0ZV9jb25zdF9fIF9fdTE2IF9fYXJjaF9zd2FiMTYoX191MTYgeCkKK3sKKyAgICAvKiBHaXZlbiB0aGF0ICdzaG9ydCcgdmFsdWVzIGFyZSBzaWduZWQgKGkuZS4sIGNhbiBiZSBuZWdhdGl2ZSksCisgICAgICogd2UgY2Fubm90IGFzc3VtZSB0aGF0IHRoZSB1cHBlciAxNi1iaXRzIG9mIHRoZSByZWdpc3RlciBhcmUKKyAgICAgKiB6ZXJvLiAgV2UgYXJlIGNhcmVmdWwgdG8gbWFzayB2YWx1ZXMgYWZ0ZXIgc2hpZnRpbmcuCisgICAgICovCisKKyAgICAvKiBUaGVyZSBleGlzdHMgYW4gYW5vbWFseSBiZXR3ZWVuIHh0LWdjYyBhbmQgeHQteGNjLiAgeHQtZ2NjCisgICAgICogaW5zZXJ0cyBhbiBleHR1aSBpbnN0cnVjdGlvbiBhZnRlciBwdXR0aW5nIHRoaXMgZnVuY3Rpb24gaW5saW5lCisgICAgICogdG8gZW5zdXJlIHRoYXQgaXQgdXNlcyBvbmx5IHRoZSBsZWFzdC1zaWduaWZpY2FudCAxNiBiaXRzIG9mCisgICAgICogdGhlIHJlc3VsdC4gIHh0LXhjYyBkb2Vzbid0IHVzZSBhbiBleHR1aSwgYnV0IGFzc3VtZXMgdGhlCisgICAgICogX19hc21fXyBtYWNybyBmb2xsb3dzIGNvbnZlbnRpb24gdGhhdCB0aGUgdXBwZXIgMTYgYml0cyBvZiBhbgorICAgICAqICd1bnNpZ25lZCBzaG9ydCcgcmVzdWx0IGFyZSBzdGlsbCB6ZXJvLiAgVGhpcyBtYWNybyBkb2Vzbid0CisgICAgICogZm9sbG93IGNvbnZlbnRpb247IGluZGVlZCwgaXQgbGVhdmVzIGdhcmJhZ2UgaW4gdGhlIHVwcG9ydCAxNgorICAgICAqIGJpdHMgb2YgdGhlIHJlZ2lzdGVyLgorCisgICAgICogRGVjbGFyaW5nIHRoZSB0ZW1wb3JhcnkgdmFyaWFibGVzICdyZXMnIGFuZCAndG1wJyB0byBiZSAzMi1iaXQKKyAgICAgKiB0eXBlcyB3aGlsZSB0aGUgcmV0dXJuIHR5cGUgb2YgdGhlIGZ1bmN0aW9uIGlzIGEgMTYtYml0IHR5cGUKKyAgICAgKiBmb3JjZXMgYm90aCBjb21waWxlcnMgdG8gaW5zZXJ0IGV4YWN0bHkgb25lIGV4dHVpIGluc3RydWN0aW9uCisgICAgICogKG9yIGVxdWl2YWxlbnQpIHRvIG1hc2sgb2ZmIHRoZSB1cHBlciAxNiBiaXRzLiAqLworCisgICAgX191MzIgcmVzOworICAgIF9fdTMyIHRtcDsKKworICAgIF9fYXNtX18oImV4dHVpICAgICUxLCAlMiwgOCwgOFxuXHQiCisJICAgICJzbGxpICAgICAlMCwgJTIsIDggICBcblx0IgorCSAgICAib3IgICAgICAgJTAsICUwLCAlMSAgXG4iCisJICAgIDogIj0mYSIgKHJlcyksICI9JmEiICh0bXApCisJICAgIDogImEiICh4KQorCSAgICApOworCisgICAgcmV0dXJuIHJlczsKK30KKyNkZWZpbmUgX19hcmNoX3N3YWIxNiBfX2FyY2hfc3dhYjE2CisKKyNlbmRpZiAvKiBfWFRFTlNBX1NXQUJfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL3N5c2NhbGwuaCBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3N5c2NhbGwuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20teHRlbnNhL3N5c2NhbGwuaApyZW5hbWUgdG8gYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vc3lzY2FsbC5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2Evc3lzdGVtLmggYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9zeXN0ZW0uaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20teHRlbnNhL3N5c3RlbS5oCnJlbmFtZSB0byBhcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9zeXN0ZW0uaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL3Rlcm1iaXRzLmggYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS90ZXJtYml0cy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS14dGVuc2EvdGVybWJpdHMuaApyZW5hbWUgdG8gYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vdGVybWJpdHMuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL3Rlcm1pb3MuaCBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3Rlcm1pb3MuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20teHRlbnNhL3Rlcm1pb3MuaApyZW5hbWUgdG8gYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vdGVybWlvcy5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvdGhyZWFkX2luZm8uaCBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3RocmVhZF9pbmZvLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLXh0ZW5zYS90aHJlYWRfaW5mby5oCnJlbmFtZSB0byBhcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS90aHJlYWRfaW5mby5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvdGltZXguaCBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3RpbWV4LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLXh0ZW5zYS90aW1leC5oCnJlbmFtZSB0byBhcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS90aW1leC5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvdGxiLmggYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS90bGIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20teHRlbnNhL3RsYi5oCnJlbmFtZSB0byBhcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS90bGIuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL3RsYmZsdXNoLmggYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS90bGJmbHVzaC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS14dGVuc2EvdGxiZmx1c2guaApyZW5hbWUgdG8gYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vdGxiZmx1c2guaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL3RvcG9sb2d5LmggYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS90b3BvbG9neS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS14dGVuc2EvdG9wb2xvZ3kuaApyZW5hbWUgdG8gYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vdG9wb2xvZ3kuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL3R5cGVzLmggYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS90eXBlcy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS14dGVuc2EvdHlwZXMuaApyZW5hbWUgdG8gYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vdHlwZXMuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL3VhY2Nlc3MuaCBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3VhY2Nlc3MuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20teHRlbnNhL3VhY2Nlc3MuaApyZW5hbWUgdG8gYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vdWFjY2Vzcy5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvdWNvbnRleHQuaCBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3Vjb250ZXh0LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLXh0ZW5zYS91Y29udGV4dC5oCnJlbmFtZSB0byBhcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS91Y29udGV4dC5oCmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS91bmFsaWduZWQuaCBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3VuYWxpZ25lZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlN2VkMDQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS91bmFsaWduZWQuaApAQCAtMCwwICsxLDI5IEBACisvKgorICogWHRlbnNhIGRvZXNuJ3QgaGFuZGxlIHVuYWxpZ25lZCBhY2Nlc3NlcyBlZmZpY2llbnRseS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgLSAyMDA1IFRlbnNpbGljYSBJbmMuCisgKi8KKyNpZm5kZWYgX0FTTV9YVEVOU0FfVU5BTElHTkVEX0gKKyNkZWZpbmUgX0FTTV9YVEVOU0FfVU5BTElHTkVEX0gKKworI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKworI2lmZGVmIF9fTElUVExFX0VORElBTgorIyBpbmNsdWRlIDxsaW51eC91bmFsaWduZWQvbGVfc3RydWN0Lmg+CisjIGluY2x1ZGUgPGxpbnV4L3VuYWxpZ25lZC9iZV9ieXRlc2hpZnQuaD4KKyMgaW5jbHVkZSA8bGludXgvdW5hbGlnbmVkL2dlbmVyaWMuaD4KKyMgZGVmaW5lIGdldF91bmFsaWduZWQJX19nZXRfdW5hbGlnbmVkX2xlCisjIGRlZmluZSBwdXRfdW5hbGlnbmVkCV9fcHV0X3VuYWxpZ25lZF9sZQorI2Vsc2UKKyMgaW5jbHVkZSA8bGludXgvdW5hbGlnbmVkL2JlX3N0cnVjdC5oPgorIyBpbmNsdWRlIDxsaW51eC91bmFsaWduZWQvbGVfYnl0ZXNoaWZ0Lmg+CisjIGluY2x1ZGUgPGxpbnV4L3VuYWxpZ25lZC9nZW5lcmljLmg+CisjIGRlZmluZSBnZXRfdW5hbGlnbmVkCV9fZ2V0X3VuYWxpZ25lZF9iZQorIyBkZWZpbmUgcHV0X3VuYWxpZ25lZAlfX3B1dF91bmFsaWduZWRfYmUKKyNlbmRpZgorCisjZW5kaWYJLyogX0FTTV9YVEVOU0FfVU5BTElHTkVEX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS91bmlzdGQuaCBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3VuaXN0ZC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS14dGVuc2EvdW5pc3RkLmgKcmVuYW1lIHRvIGFyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3VuaXN0ZC5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvdXNlci5oIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vdXNlci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS14dGVuc2EvdXNlci5oCnJlbmFtZSB0byBhcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS91c2VyLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS92Z2EuaCBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3ZnYS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS14dGVuc2EvdmdhLmgKcmVuYW1lIHRvIGFyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3ZnYS5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EveG9yLmggYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS94b3IuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20teHRlbnNhL3hvci5oCnJlbmFtZSB0byBhcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS94b3IuaApkaWZmIC0tZ2l0IGEvYXJjaC94dGVuc2Eva2VybmVsL2VudHJ5LlMgYi9hcmNoL3h0ZW5zYS9rZXJuZWwvZW50cnkuUwppbmRleCBkZmQzNWRjLi5hNTFkMzZhIDEwMDY0NAotLS0gYS9hcmNoL3h0ZW5zYS9rZXJuZWwvZW50cnkuUworKysgYi9hcmNoL3h0ZW5zYS9rZXJuZWwvZW50cnkuUwpAQCAtMjUsNyArMjUsNyBAQAogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CiAjaW5jbHVkZSA8YXNtL3NpZ25hbC5oPgogI2luY2x1ZGUgPGFzbS90bGJmbHVzaC5oPgotI2luY2x1ZGUgPGFzbS92YXJpYW50L3RpZS1hc20uaD4KKyNpbmNsdWRlIDx2YXJpYW50L3RpZS1hc20uaD4KIAogLyogVW5pbXBsZW1lbnRlZCBmZWF0dXJlcy4gKi8KIApkaWZmIC0tZ2l0IGEvYXJjaC94dGVuc2Eva2VybmVsL3ZtbGludXgubGRzLlMgYi9hcmNoL3h0ZW5zYS9rZXJuZWwvdm1saW51eC5sZHMuUwppbmRleCA1MWY0ZmI2Li5kNTA2Nzc0IDEwMDY0NAotLS0gYS9hcmNoL3h0ZW5zYS9rZXJuZWwvdm1saW51eC5sZHMuUworKysgYi9hcmNoL3h0ZW5zYS9rZXJuZWwvdm1saW51eC5sZHMuUwpAQCAtMTYsNyArMTYsNyBAQAogCiAjaW5jbHVkZSA8YXNtLWdlbmVyaWMvdm1saW51eC5sZHMuaD4KIAotI2luY2x1ZGUgPGFzbS92YXJpYW50L2NvcmUuaD4KKyNpbmNsdWRlIDx2YXJpYW50L2NvcmUuaD4KIE9VVFBVVF9BUkNIKHh0ZW5zYSkKIEVOVFJZKF9zdGFydCkKIApkaWZmIC0tZ2l0IGEvYXJjaC94dGVuc2EvbGliL2NoZWNrc3VtLlMgYi9hcmNoL3h0ZW5zYS9saWIvY2hlY2tzdW0uUwppbmRleCA5ZDljZDk5Li5kZjM5N2Y5IDEwMDY0NAotLS0gYS9hcmNoL3h0ZW5zYS9saWIvY2hlY2tzdW0uUworKysgYi9hcmNoL3h0ZW5zYS9saWIvY2hlY2tzdW0uUwpAQCAtMTYsNyArMTYsNyBAQAogCiAjaW5jbHVkZSA8YXNtL2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgotI2luY2x1ZGUgPGFzbS92YXJpYW50L2NvcmUuaD4KKyNpbmNsdWRlIDx2YXJpYW50L2NvcmUuaD4KIAogLyoKICAqIGNvbXB1dGVzIGEgcGFydGlhbCBjaGVja3N1bSwgZS5nLiBmb3IgVENQL1VEUCBmcmFnbWVudHMKZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL2xpYi9tZW1jb3B5LlMgYi9hcmNoL3h0ZW5zYS9saWIvbWVtY29weS5TCmluZGV4IGRkZGE4ZjQuLmVhNTlkY2QgMTAwNjQ0Ci0tLSBhL2FyY2gveHRlbnNhL2xpYi9tZW1jb3B5LlMKKysrIGIvYXJjaC94dGVuc2EvbGliL21lbWNvcHkuUwpAQCAtOSw3ICs5LDcgQEAKICAqIENvcHlyaWdodCAoQykgMjAwMiAtIDIwMDUgVGVuc2lsaWNhIEluYy4KICAqLwogCi0jaW5jbHVkZSA8YXNtL3ZhcmlhbnQvY29yZS5oPgorI2luY2x1ZGUgPHZhcmlhbnQvY29yZS5oPgogCiAJLm1hY3JvCXNyY19iCXIsIHcwLCB3MQogI2lmZGVmIF9fWFRFTlNBX0VCX18KZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL2xpYi9tZW1zZXQuUyBiL2FyY2gveHRlbnNhL2xpYi9tZW1zZXQuUwppbmRleCA1NmExNzQ5Li4xMGI4YzQwIDEwMDY0NAotLS0gYS9hcmNoL3h0ZW5zYS9saWIvbWVtc2V0LlMKKysrIGIvYXJjaC94dGVuc2EvbGliL21lbXNldC5TCkBAIC0xMSw3ICsxMSw3IEBACiAgKiAgQ29weXJpZ2h0IChDKSAyMDAyIFRlbnNpbGljYSBJbmMuCiAgKi8KIAotI2luY2x1ZGUgPGFzbS92YXJpYW50L2NvcmUuaD4KKyNpbmNsdWRlIDx2YXJpYW50L2NvcmUuaD4KIAogLyoKICAqIHZvaWQgKm1lbXNldCh2b2lkICpkc3QsIGludCBjLCBzaXplX3QgbGVuZ3RoKQpkaWZmIC0tZ2l0IGEvYXJjaC94dGVuc2EvbGliL3N0cm5jcHlfdXNlci5TIGIvYXJjaC94dGVuc2EvbGliL3N0cm5jcHlfdXNlci5TCmluZGV4IGIyNjU1ZDkuLjlmNjAzY2QgMTAwNjQ0Ci0tLSBhL2FyY2gveHRlbnNhL2xpYi9zdHJuY3B5X3VzZXIuUworKysgYi9hcmNoL3h0ZW5zYS9saWIvc3RybmNweV91c2VyLlMKQEAgLTExLDcgKzExLDcgQEAKICAqICBDb3B5cmlnaHQgKEMpIDIwMDIgVGVuc2lsaWNhIEluYy4KICAqLwogCi0jaW5jbHVkZSA8YXNtL3ZhcmlhbnQvY29yZS5oPgorI2luY2x1ZGUgPHZhcmlhbnQvY29yZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAKIC8qIExvYWQgb3Igc3RvcmUgaW5zdHJ1Y3Rpb25zIHRoYXQgbWF5IGNhdXNlIGV4Y2VwdGlvbnMgdXNlIHRoZSBFWCBtYWNyby4gKi8KZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL2xpYi9zdHJubGVuX3VzZXIuUyBiL2FyY2gveHRlbnNhL2xpYi9zdHJubGVuX3VzZXIuUwppbmRleCBhZDNmNjE2Li4yM2YyYTg5IDEwMDY0NAotLS0gYS9hcmNoL3h0ZW5zYS9saWIvc3Rybmxlbl91c2VyLlMKKysrIGIvYXJjaC94dGVuc2EvbGliL3N0cm5sZW5fdXNlci5TCkBAIC0xMSw3ICsxMSw3IEBACiAgKiAgQ29weXJpZ2h0IChDKSAyMDAyIFRlbnNpbGljYSBJbmMuCiAgKi8KIAotI2luY2x1ZGUgPGFzbS92YXJpYW50L2NvcmUuaD4KKyNpbmNsdWRlIDx2YXJpYW50L2NvcmUuaD4KIAogLyogTG9hZCBvciBzdG9yZSBpbnN0cnVjdGlvbnMgdGhhdCBtYXkgY2F1c2UgZXhjZXB0aW9ucyB1c2UgdGhlIEVYIG1hY3JvLiAqLwogCmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9saWIvdXNlcmNvcHkuUyBiL2FyY2gveHRlbnNhL2xpYi91c2VyY29weS5TCmluZGV4IGE4YWIxZDQuLjQ2ZDYwMzEgMTAwNjQ0Ci0tLSBhL2FyY2gveHRlbnNhL2xpYi91c2VyY29weS5TCisrKyBiL2FyY2gveHRlbnNhL2xpYi91c2VyY29weS5TCkBAIC01Myw3ICs1Myw3IEBACiAgKglhMTEvIG9yaWdpbmFsIGxlbmd0aAogICovCiAKLSNpbmNsdWRlIDxhc20vdmFyaWFudC9jb3JlLmg+CisjaW5jbHVkZSA8dmFyaWFudC9jb3JlLmg+CiAKICNpZmRlZiBfX1hURU5TQV9FQl9fCiAjZGVmaW5lIEFMSUdOKFIsIFcwLCBXMSkgc3JjCVIsIFcwLCBXMQpkaWZmIC0tZ2l0IGEvYXJjaC94dGVuc2EvcGxhdGZvcm1zL2lzcy9jb25zb2xlLmMgYi9hcmNoL3h0ZW5zYS9wbGF0Zm9ybXMvaXNzL2NvbnNvbGUuYwppbmRleCA5MTQxZTM2Li5lZmVkODg5IDEwMDY0NAotLS0gYS9hcmNoL3h0ZW5zYS9wbGF0Zm9ybXMvaXNzL2NvbnNvbGUuYworKysgYi9hcmNoL3h0ZW5zYS9wbGF0Zm9ybXMvaXNzL2NvbnNvbGUuYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBhcmNoL3h0ZW5zYS9wbGF0Zm9ybS1pc3MvY29uc29sZS5jCisgKiBhcmNoL3h0ZW5zYS9wbGF0Zm9ybXMvaXNzL2NvbnNvbGUuYwogICoKICAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCiAgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCkBAIC0yNCw3ICsyNCw3IEBACiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CiAKLSNpbmNsdWRlIDxhc20vcGxhdGZvcm0vc2ltY2FsbC5oPgorI2luY2x1ZGUgPHBsYXRmb3JtL3NpbWNhbGwuaD4KIAogI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgogI2luY2x1ZGUgPGxpbnV4L3R0eV9mbGlwLmg+CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvcGxhdGZvcm0taXNzL2hhcmR3YXJlLmggYi9hcmNoL3h0ZW5zYS9wbGF0Zm9ybXMvaXNzL2luY2x1ZGUvcGxhdGZvcm0vaGFyZHdhcmUuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20teHRlbnNhL3BsYXRmb3JtLWlzcy9oYXJkd2FyZS5oCnJlbmFtZSB0byBhcmNoL3h0ZW5zYS9wbGF0Zm9ybXMvaXNzL2luY2x1ZGUvcGxhdGZvcm0vaGFyZHdhcmUuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL3BsYXRmb3JtLWlzcy9zaW1jYWxsLmggYi9hcmNoL3h0ZW5zYS9wbGF0Zm9ybXMvaXNzL2luY2x1ZGUvcGxhdGZvcm0vc2ltY2FsbC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS14dGVuc2EvcGxhdGZvcm0taXNzL3NpbWNhbGwuaApyZW5hbWUgdG8gYXJjaC94dGVuc2EvcGxhdGZvcm1zL2lzcy9pbmNsdWRlL3BsYXRmb3JtL3NpbWNhbGwuaApkaWZmIC0tZ2l0IGEvYXJjaC94dGVuc2EvcGxhdGZvcm1zL2lzcy9pby5jIGIvYXJjaC94dGVuc2EvcGxhdGZvcm1zL2lzcy9pby5jCmluZGV4IDViMTYxYTUuLjU3MWQwYjIgMTAwNjQ0Ci0tLSBhL2FyY2gveHRlbnNhL3BsYXRmb3Jtcy9pc3MvaW8uYworKysgYi9hcmNoL3h0ZW5zYS9wbGF0Zm9ybXMvaXNzL2lvLmMKQEAgLTMsNyArMyw3IEBACiAjaWYgMAogCiAjaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8eHRlbnNhL3NpbWNhbGwuaD4KKyNpbmNsdWRlIDxwbGF0Zm9ybS9wbGF0Zm9ybS1pc3Mvc2ltY2FsbC5oPgogCiBleHRlcm4gaW50IF9fc2ltYyAoKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC94dGVuc2EvcGxhdGZvcm1zL2lzcy9uZXR3b3JrLmMgYi9hcmNoL3h0ZW5zYS9wbGF0Zm9ybXMvaXNzL25ldHdvcmsuYwppbmRleCA2NGYwNTdkLi5lZGFkNDE1IDEwMDY0NAotLS0gYS9hcmNoL3h0ZW5zYS9wbGF0Zm9ybXMvaXNzL25ldHdvcmsuYworKysgYi9hcmNoL3h0ZW5zYS9wbGF0Zm9ybXMvaXNzL25ldHdvcmsuYwpAQCAtMSw2ICsxLDYgQEAKIC8qCiAgKgotICogYXJjaC94dGVuc2EvcGxhdGZvcm0taXNzL25ldHdvcmsuYworICogYXJjaC94dGVuc2EvcGxhdGZvcm1zL2lzcy9uZXR3b3JrLmMKICAqCiAgKiBQbGF0Zm9ybSBzcGVjaWZpYyBpbml0aWFsaXphdGlvbi4KICAqCkBAIC0zMyw3ICszMyw3IEBACiAjaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAKLSNpbmNsdWRlIDxhc20vcGxhdGZvcm0vc2ltY2FsbC5oPgorI2luY2x1ZGUgPHBsYXRmb3JtL3NpbWNhbGwuaD4KIAogI2RlZmluZSBEUklWRVJfTkFNRSAiaXNzLW5ldGRldiIKICNkZWZpbmUgRVRIX01BWF9QQUNLRVQgMTUwMApkaWZmIC0tZ2l0IGEvYXJjaC94dGVuc2EvcGxhdGZvcm1zL3h0MjAwMC9NYWtlZmlsZSBiL2FyY2gveHRlbnNhL3BsYXRmb3Jtcy94dDIwMDAvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTRkMDE4ZQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveHRlbnNhL3BsYXRmb3Jtcy94dDIwMDAvTWFrZWZpbGUKQEAgLTAsMCArMSw1IEBACisjCisjIE1ha2VmaWxlIGZvciB0aGUgVGVuc2lsaWNhIFhUMjAwMCBFbXVsYXRpb24gQm9hcmQKKyMKKworb2JqLXkgCQkJPSBzZXR1cC5vCmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9wbGF0Zm9ybXMveHQyMDAwL2luY2x1ZGUvcGxhdGZvcm0vaGFyZHdhcmUuaCBiL2FyY2gveHRlbnNhL3BsYXRmb3Jtcy94dDIwMDAvaW5jbHVkZS9wbGF0Zm9ybS9oYXJkd2FyZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxNDU5YWQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3h0ZW5zYS9wbGF0Zm9ybXMveHQyMDAwL2luY2x1ZGUvcGxhdGZvcm0vaGFyZHdhcmUuaApAQCAtMCwwICsxLDU1IEBACisvKgorICogcGxhdGZvcm0vaGFyZHdhcmUuaAorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMSBUZW5zaWxpY2EgSW5jLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGhhcmR3YXJlIGNvbmZpZ3VyYXRpb24gb2YgdGhlIFhUMjAwMCBib2FyZC4KKyAqLworCisjaWZuZGVmIF9YVEVOU0FfWFQyMDAwX0hBUkRXQVJFX0gKKyNkZWZpbmUgX1hURU5TQV9YVDIwMDBfSEFSRFdBUkVfSAorCisjaW5jbHVkZSA8dmFyaWFudC9jb3JlLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKy8qIAorICogTWVtb3J5IGNvbmZpZ3VyYXRpb24uCisgKi8KKworI2RlZmluZSBQTEFURk9STV9ERUZBVUxUX01FTV9TVEFSVCAweDAwMDAwMDAwCisjZGVmaW5lIFBMQVRGT1JNX0RFRkFVTFRfTUVNX1NJWkUgMHgwODAwMDAwMAorCisvKgorICogTnVtYmVyIG9mIHBsYXRmb3JtIElSUXMKKyAqLworI2RlZmluZSBQTEFURk9STV9OUl9JUlFTIDMKKy8qCisgKiBPbi1ib2FyZCBjb21wb25lbnRzLgorICovCisKKyNkZWZpbmUgU09OSUM4MzkzNF9JTlROVU0JWENIQUxfRVhUSU5UM19OVU0KKyNkZWZpbmUgU09OSUM4MzkzNF9BRERSCQlJT0FERFIoMHgwZDAzMDAwMCkKKworLyoKKyAqIFYzLVBDSQorICovCisKKy8qIFRoZSBYVDIwMDAgdXNlcyB0aGUgVjMgYXMgYSBjYXNjYWRlZCBpbnRlcnJ1cHQgY29udHJvbGxlciBmb3IgdGhlIFBDSSBidXMgKi8KKworI2RlZmluZSBJUlFfUENJX0EJCShYQ0hBTF9OVU1fSU5URVJSVVBUUyArIDApCisjZGVmaW5lIElSUV9QQ0lfQgkJKFhDSEFMX05VTV9JTlRFUlJVUFRTICsgMSkKKyNkZWZpbmUgSVJRX1BDSV9DCQkoWENIQUxfTlVNX0lOVEVSUlVQVFMgKyAyKQorCisvKgorICogVmFyaW91cyBvdGhlciBjb21wb25lbnRzLgorICovCisKKyNkZWZpbmUgWFQyMDAwX0xFRF9BRERSCQlJT0FERFIoMHgwZDA0MDAwMCkKKworI2VuZGlmIC8qIF9YVEVOU0FfWFQyMDAwX0hBUkRXQVJFX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL3BsYXRmb3Jtcy94dDIwMDAvaW5jbHVkZS9wbGF0Zm9ybS9zZXJpYWwuaCBiL2FyY2gveHRlbnNhL3BsYXRmb3Jtcy94dDIwMDAvaW5jbHVkZS9wbGF0Zm9ybS9zZXJpYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjI2Y2Y3Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94dGVuc2EvcGxhdGZvcm1zL3h0MjAwMC9pbmNsdWRlL3BsYXRmb3JtL3NlcmlhbC5oCkBAIC0wLDAgKzEsMjggQEAKKy8qCisgKiBwbGF0Zm9ybS9zZXJpYWwuaAorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMSBUZW5zaWxpY2EgSW5jLgorICovCisKKyNpZm5kZWYgX1hURU5TQV9YVDIwMDBfU0VSSUFMX0gKKyNkZWZpbmUgX1hURU5TQV9YVDIwMDBfU0VSSUFMX0gKKworI2luY2x1ZGUgPHZhcmlhbnQvY29yZS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCisvKiAgTmF0aW9uYWwtU2VtaSBQQzE2NTUyRCBEVUFSVDogICovCisKKyNkZWZpbmUgRFVBUlQxNjU1Ml8xX0lOVE5VTQlYQ0hBTF9FWFRJTlQ0X05VTQorI2RlZmluZSBEVUFSVDE2NTUyXzJfSU5UTlVNCVhDSEFMX0VYVElOVDVfTlVNCisKKyNkZWZpbmUgRFVBUlQxNjU1Ml8xX0FERFIJSU9BRERSKDB4MGQwNTAwMjApCS8qIGNoYW5uZWwgMSAqLworI2RlZmluZSBEVUFSVDE2NTUyXzJfQUREUglJT0FERFIoMHgwZDA1MDAwMCkJLyogY2hhbm5lbCAyICovCisKKyNkZWZpbmUgRFVBUlQxNjU1Ml9YVEFMX0ZSRVEJMTg0MzIwMDAJLyogY3J5c3RhbCBmcmVxdWVuY3kgaW4gSHogKi8KKyNkZWZpbmUgQkFTRV9CQVVEICggRFVBUlQxNjU1Ml9YVEFMX0ZSRVEgLyAxNiApCisKKyNlbmRpZiAvKiBfWFRFTlNBX1hUMjAwMF9TRVJJQUxfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94dGVuc2EvcGxhdGZvcm1zL3h0MjAwMC9zZXR1cC5jIGIvYXJjaC94dGVuc2EvcGxhdGZvcm1zL3h0MjAwMC9zZXR1cC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllODM5NDAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3h0ZW5zYS9wbGF0Zm9ybXMveHQyMDAwL3NldHVwLmMKQEAgLTAsMCArMSwxODEgQEAKKy8qCisgKiBhcmNoL3h0ZW5zYS9wbGF0Zm9ybXMveHQyMDAwL3NldHVwLmMKKyAqCisgKiBQbGF0Zm9ybSBzcGVjaWZpYyBmdW5jdGlvbnMgZm9yIHRoZSBYVDIwMDAgYm9hcmQuCisgKgorICogQXV0aG9yczoJQ2hyaXMgWmFua2VsIDxjaHJpc0B6YW5rZWwubmV0PgorICoJCUpvZSBUYXlsb3IgPGpvZUB0ZW5zaWxpY2EuY29tPgorICoKKyAqIENvcHlyaWdodCAyMDAxIC0gMjAwNCBUZW5zaWxpY2EgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICovCisjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvcmVib290Lmg+CisjaW5jbHVkZSA8bGludXgva2Rldl90Lmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbnNvbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZ2lmeS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF84MjUwLmg+CisKKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8YXNtL3BsYXRmb3JtLmg+CisjaW5jbHVkZSA8YXNtL2Jvb3RwYXJhbS5oPgorI2luY2x1ZGUgPHBsYXRmb3JtL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8cGxhdGZvcm0vc2VyaWFsLmg+CisKKy8qIEFzc3VtZXMgcyBwb2ludHMgdG8gYW4gOC1jaHIgc3RyaW5nLiAgTm8gY2hlY2tpbmcgZm9yIE5VTEwuICovCisKK3N0YXRpYyB2b2lkIGxlZF9wcmludCAoaW50IGYsIGNoYXIgKnMpCit7CisJdW5zaWduZWQgbG9uZyogbGVkX2FkZHIgPSAodW5zaWduZWQgbG9uZyopIChYVDIwMDBfTEVEX0FERFIgKyAweEUwKSArIGY7CisJaW50IGk7CisJZm9yIChpID0gZjsgaSA8IDg7IGkrKykKKwkJaWYgKCgqbGVkX2FkZHIrKyA9ICpzKyspID09IDApCisJCSAgICBicmVhazsKK30KKwordm9pZCBwbGF0Zm9ybV9oYWx0KHZvaWQpCit7CisJbGVkX3ByaW50ICgwLCAiICBIQUxUICAiKTsKKwlsb2NhbF9pcnFfZGlzYWJsZSgpOworCXdoaWxlICgxKTsKK30KKwordm9pZCBwbGF0Zm9ybV9wb3dlcl9vZmYodm9pZCkKK3sKKwlsZWRfcHJpbnQgKDAsICJQT1dFUk9GRiIpOworCWxvY2FsX2lycV9kaXNhYmxlKCk7CisJd2hpbGUgKDEpOworfQorCit2b2lkIHBsYXRmb3JtX3Jlc3RhcnQodm9pZCkKK3sKKwkvKiBGbHVzaCBhbmQgcmVzZXQgdGhlIG1tdSwgc2ltdWxhdGUgYSBwcm9jZXNzb3IgcmVzZXQsIGFuZAorCSAqIGp1bXAgdG8gdGhlIHJlc2V0IHZlY3Rvci4gKi8KKworCV9fYXNtX18gX192b2xhdGlsZV9fICgibW92aQlhMiwgMTVcblx0IgorCQkJICAgICAgIndzcglhMiwgIiBfX3N0cmluZ2lmeShJQ09VTlRMRVZFTCkgIlxuXHQiCisJCQkgICAgICAibW92aQlhMiwgMFxuXHQiCisJCQkgICAgICAid3NyCWEyLCAiIF9fc3RyaW5naWZ5KElDT1VOVCkgIlxuXHQiCisJCQkgICAgICAid3NyCWEyLCAiIF9fc3RyaW5naWZ5KElCUkVBS0VOQUJMRSkgIlxuXHQiCisJCQkgICAgICAid3NyCWEyLCAiIF9fc3RyaW5naWZ5KExDT1VOVCkgIlxuXHQiCisJCQkgICAgICAibW92aQlhMiwgMHgxZlxuXHQiCisJCQkgICAgICAid3NyCWEyLCAiIF9fc3RyaW5naWZ5KFBTKSAiXG5cdCIKKwkJCSAgICAgICJpc3luY1xuXHQiCisJCQkgICAgICAiangJJTBcblx0IgorCQkJICAgICAgOgorCQkJICAgICAgOiAiYSIgKFhDSEFMX1JFU0VUX1ZFQ1RPUl9WQUREUikKKwkJCSAgICAgIDogImEyIgorCQkJICAgICAgKTsKKworCS8qIGNvbnRyb2wgbmV2ZXIgZ2V0cyBoZXJlICovCit9CisKK3ZvaWQgX19pbml0IHBsYXRmb3JtX3NldHVwKGNoYXIqKiBjbWRsaW5lKQoreworCWxlZF9wcmludCAoMCwgIkxJTlVYICAgIik7Cit9CisKKy8qIGVhcmx5IGluaXRpYWxpemF0aW9uICovCisKK2V4dGVybiBzeXNtZW1faW5mb190IF9faW5pdGRhdGEgc3lzbWVtOworCit2b2lkIHBsYXRmb3JtX2luaXQoYnBfdGFnX3QqIGZpcnN0KQoreworCS8qIFNldCBkZWZhdWx0IG1lbW9yeSBibG9jayBpZiBub3QgcHJvdmlkZWQgYnkgdGhlIGJvb3Rsb2FkZXIuICovCisKKwlpZiAoc3lzbWVtLm5yX2JhbmtzID09IDApIHsKKwkJc3lzbWVtLm5yX2JhbmtzID0gMTsKKwkJc3lzbWVtLmJhbmtbMF0uc3RhcnQgPSBQTEFURk9STV9ERUZBVUxUX01FTV9TVEFSVDsKKwkJc3lzbWVtLmJhbmtbMF0uZW5kID0gUExBVEZPUk1fREVGQVVMVF9NRU1fU1RBUlQKKwkJCQkgICAgICsgUExBVEZPUk1fREVGQVVMVF9NRU1fU0laRTsKKwl9Cit9CisKKy8qIEhlYXJ0YmVhdC4gTGV0IHRoZSBMRUQgYmxpbmsuICovCisKK3ZvaWQgcGxhdGZvcm1faGVhcnRiZWF0KHZvaWQpCit7CisJc3RhdGljIGludCBpPTAsIHQgPSAwOworCisJaWYgKC0tdCA8IDApCisJeworCQl0ID0gNTk7CisJCWxlZF9wcmludCg3LCBpID8gIi4iOiAiICIpOworCQlpIF49IDE7CisJfQorfQorCisvLyNkZWZpbmUgUlNfVEFCTEVfU0laRSAyCisvLyNkZWZpbmUgU1REX0NPTV9GTEFHUyAoQVNZTkNfQk9PVF9BVVRPQ09ORnxBU1lOQ19TS0lQX1RFU1QpCisKKyNkZWZpbmUgX1NFUklBTF9QT1JUKF9iYXNlLF9pcnEpCQkJCQlcCit7CQkJCQkJCQkJXAorCS5tYXBiYXNlCT0gKF9iYXNlKSwJCQkJCVwKKwkubWVtYmFzZQk9ICh2b2lkKikoX2Jhc2UpLAkJCQlcCisJLmlycQkJPSAoX2lycSksCQkJCQlcCisJLnVhcnRjbGsJPSBEVUFSVDE2NTUyX1hUQUxfRlJFUSwJCQkJXAorCS5pb3R5cGUJCT0gVVBJT19NRU0sCQkJCQlcCisJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GLAkJCQlcCisJLnJlZ3NoaWZ0CT0gMiwJCQkJCQlcCit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdF9zZXJpYWw4MjUwX3BvcnQgeHQyMDAwX3NlcmlhbF9kYXRhW10gPSB7CisjaWYgWENIQUxfSEFWRV9CRQorCV9TRVJJQUxfUE9SVChEVUFSVDE2NTUyXzFfQUREUiArIDMsIERVQVJUMTY1NTJfMV9JTlROVU0pLAorCV9TRVJJQUxfUE9SVChEVUFSVDE2NTUyXzJfQUREUiArIDMsIERVQVJUMTY1NTJfMl9JTlROVU0pLAorI2Vsc2UKKwlfU0VSSUFMX1BPUlQoRFVBUlQxNjU1Ml8xX0FERFIsIERVQVJUMTY1NTJfMV9JTlROVU0pLAorCV9TRVJJQUxfUE9SVChEVUFSVDE2NTUyXzJfQUREUiwgRFVBUlQxNjU1Ml8yX0lOVE5VTSksCisjZW5kaWYKKwl7IH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHh0MjAwMF9zZXJpYWw4MjUwX2RldmljZSA9IHsKKwkubmFtZQkJPSAic2VyaWFsODI1MCIsCisJLmlkCQk9IFBMQVQ4MjUwX0RFVl9QTEFURk9STSwKKwkuZGV2CQk9IHsKKwkgICAgLnBsYXRmb3JtX2RhdGEgPSB4dDIwMDBfc2VyaWFsX2RhdGEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgeHQyMDAwX3NvbmljX3Jlc1tdID0geworCXsKKwkJLnN0YXJ0ID0gU09OSUM4MzkzNF9BRERSLAorCQkuZW5kICAgPSBTT05JQzgzOTM0X0FERFIgKyAweGZmLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCXsKKwkJLnN0YXJ0ID0gU09OSUM4MzkzNF9JTlROVU0sCisJCS5lbmQgPSBTT05JQzgzOTM0X0lOVE5VTSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHh0MjAwMF9zb25pY19kZXZpY2UgPSB7CisJLm5hbWUJCT0gInh0c29uaWMiLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRSh4dDIwMDBfc29uaWNfcmVzKSwKKwkucmVzb3VyY2UJCT0geHQyMDAwX3NvbmljX3JlcywKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHh0MjAwMF9zZXR1cF9kZXZpbml0KHZvaWQpCit7CisJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZ4dDIwMDBfc2VyaWFsODI1MF9kZXZpY2UpOworCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmeHQyMDAwX3NvbmljX2RldmljZSk7CisKKwlyZXR1cm4gMDsKK30KKworZGV2aWNlX2luaXRjYWxsKHh0MjAwMF9zZXR1cF9kZXZpbml0KTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS92YXJpYW50LWRjMjMyYi9jb3JlLmggYi9hcmNoL3h0ZW5zYS92YXJpYW50cy9kYzIzMmIvaW5jbHVkZS92YXJpYW50L2NvcmUuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20teHRlbnNhL3ZhcmlhbnQtZGMyMzJiL2NvcmUuaApyZW5hbWUgdG8gYXJjaC94dGVuc2EvdmFyaWFudHMvZGMyMzJiL2luY2x1ZGUvdmFyaWFudC9jb3JlLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS92YXJpYW50LWRjMjMyYi90aWUtYXNtLmggYi9hcmNoL3h0ZW5zYS92YXJpYW50cy9kYzIzMmIvaW5jbHVkZS92YXJpYW50L3RpZS1hc20uaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20teHRlbnNhL3ZhcmlhbnQtZGMyMzJiL3RpZS1hc20uaApyZW5hbWUgdG8gYXJjaC94dGVuc2EvdmFyaWFudHMvZGMyMzJiL2luY2x1ZGUvdmFyaWFudC90aWUtYXNtLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS92YXJpYW50LWRjMjMyYi90aWUuaCBiL2FyY2gveHRlbnNhL3ZhcmlhbnRzL2RjMjMyYi9pbmNsdWRlL3ZhcmlhbnQvdGllLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLXh0ZW5zYS92YXJpYW50LWRjMjMyYi90aWUuaApyZW5hbWUgdG8gYXJjaC94dGVuc2EvdmFyaWFudHMvZGMyMzJiL2luY2x1ZGUvdmFyaWFudC90aWUuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL3ZhcmlhbnQtZnNmL2NvcmUuaCBiL2FyY2gveHRlbnNhL3ZhcmlhbnRzL2ZzZi9pbmNsdWRlL3ZhcmlhbnQvY29yZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS14dGVuc2EvdmFyaWFudC1mc2YvY29yZS5oCnJlbmFtZSB0byBhcmNoL3h0ZW5zYS92YXJpYW50cy9mc2YvaW5jbHVkZS92YXJpYW50L2NvcmUuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL3ZhcmlhbnQtZnNmL3RpZS1hc20uaCBiL2FyY2gveHRlbnNhL3ZhcmlhbnRzL2ZzZi9pbmNsdWRlL3ZhcmlhbnQvdGllLWFzbS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS14dGVuc2EvdmFyaWFudC1mc2YvdGllLWFzbS5oCnJlbmFtZSB0byBhcmNoL3h0ZW5zYS92YXJpYW50cy9mc2YvaW5jbHVkZS92YXJpYW50L3RpZS1hc20uaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL3ZhcmlhbnQtZnNmL3RpZS5oIGIvYXJjaC94dGVuc2EvdmFyaWFudHMvZnNmL2luY2x1ZGUvdmFyaWFudC90aWUuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20teHRlbnNhL3ZhcmlhbnQtZnNmL3RpZS5oCnJlbmFtZSB0byBhcmNoL3h0ZW5zYS92YXJpYW50cy9mc2YvaW5jbHVkZS92YXJpYW50L3RpZS5oCmRpZmYgLS1naXQgYS9ibG9jay9LY29uZmlnIGIvYmxvY2svS2NvbmZpZwppbmRleCBhYzA5NTZmLi4wY2JiM2I4IDEwMDY0NAotLS0gYS9ibG9jay9LY29uZmlnCisrKyBiL2Jsb2NrL0tjb25maWcKQEAgLTM2LDYgKzM2LDEyIEBACiAJICBUaGlzIG9wdGlvbiBhbHNvIGVuYWJsZXMgc3VwcG9ydCBmb3Igc2luZ2xlIGZpbGVzIGxhcmdlciB0aGFuCiAJICAyVEIuCiAKKwkgIFRoZSBleHQ0IGZpbGVzeXN0ZW0gcmVxdWlyZXMgdGhhdCB0aGlzIGZlYXR1cmUgYmUgZW5hYmxlZCBpbgorCSAgb3JkZXIgdG8gc3VwcG9ydCBmaWxlc3lzdGVtcyB0aGF0IGhhdmUgdGhlIGh1Z2VfZmlsZSBmZWF0dXJlCisJICBlbmFibGVkLiAgICBPdGhlcndpc2UsIGl0IHdpbGwgcmVmdXNlIHRvIG1vdW50IGFueSBmaWxlc3lzdGVtcworCSAgdGhhdCB1c2UgdGhlIGh1Z2VfZmlsZSBmZWF0dXJlLCB3aGljaCBpcyBlbmFibGVkIGJ5IGRlZmF1bHQKKwkgIGJ5IG1rZTJmcy5leHQ0LiAgIFRoZSBHRlMyIGZpbGVzeXN0ZW0gYWxzbyByZXF1aXJlcyB0aGlzIGZlYXR1cmUuCisKIAkgIElmIHVuc3VyZSwgc2F5IE4uCiAKIGNvbmZpZyBCTEtfREVWX0lPX1RSQUNFCmRpZmYgLS1naXQgYS9ibG9jay9ibGstbWFwLmMgYi9ibG9jay9ibGstbWFwLmMKaW5kZXggMjk5MDQ0Ny4uZjEwMzcyOSAxMDA2NDQKLS0tIGEvYmxvY2svYmxrLW1hcC5jCisrKyBiL2Jsb2NrL2Jsay1tYXAuYwpAQCAtNDIsNyArNDIsNyBAQAogCiBzdGF0aWMgaW50IF9fYmxrX3JxX21hcF91c2VyKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgcmVxdWVzdCAqcnEsCiAJCQkgICAgIHN0cnVjdCBycV9tYXBfZGF0YSAqbWFwX2RhdGEsIHZvaWQgX191c2VyICp1YnVmLAotCQkJICAgICB1bnNpZ25lZCBpbnQgbGVuLCBpbnQgbnVsbF9tYXBwZWQsIGdmcF90IGdmcF9tYXNrKQorCQkJICAgICB1bnNpZ25lZCBpbnQgbGVuLCBnZnBfdCBnZnBfbWFzaykKIHsKIAl1bnNpZ25lZCBsb25nIHVhZGRyOwogCXN0cnVjdCBiaW8gKmJpbywgKm9yaWdfYmlvOwpAQCAtNjMsNyArNjMsNyBAQAogCWlmIChJU19FUlIoYmlvKSkKIAkJcmV0dXJuIFBUUl9FUlIoYmlvKTsKIAotCWlmIChudWxsX21hcHBlZCkKKwlpZiAobWFwX2RhdGEgJiYgbWFwX2RhdGEtPm51bGxfbWFwcGVkKQogCQliaW8tPmJpX2ZsYWdzIHw9ICgxIDw8IEJJT19OVUxMX01BUFBFRCk7CiAKIAlvcmlnX2JpbyA9IGJpbzsKQEAgLTExNCwxNyArMTE0LDE1IEBACiB7CiAJdW5zaWduZWQgbG9uZyBieXRlc19yZWFkID0gMDsKIAlzdHJ1Y3QgYmlvICpiaW8gPSBOVUxMOwotCWludCByZXQsIG51bGxfbWFwcGVkID0gMDsKKwlpbnQgcmV0OwogCiAJaWYgKGxlbiA+IChxLT5tYXhfaHdfc2VjdG9ycyA8PCA5KSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAJaWYgKCFsZW4pCiAJCXJldHVybiAtRUlOVkFMOwotCWlmICghdWJ1ZikgewotCQlpZiAoIW1hcF9kYXRhIHx8IHJxX2RhdGFfZGlyKHJxKSAhPSBSRUFEKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCW51bGxfbWFwcGVkID0gMTsKLQl9CisKKwlpZiAoIXVidWYgJiYgKCFtYXBfZGF0YSB8fCAhbWFwX2RhdGEtPm51bGxfbWFwcGVkKSkKKwkJcmV0dXJuIC1FSU5WQUw7CiAKIAl3aGlsZSAoYnl0ZXNfcmVhZCAhPSBsZW4pIHsKIAkJdW5zaWduZWQgbG9uZyBtYXBfbGVuLCBlbmQsIHN0YXJ0OwpAQCAtMTQzLDEzICsxNDEsMTYgQEAKIAkJCW1hcF9sZW4gLT0gUEFHRV9TSVpFOwogCiAJCXJldCA9IF9fYmxrX3JxX21hcF91c2VyKHEsIHJxLCBtYXBfZGF0YSwgdWJ1ZiwgbWFwX2xlbiwKLQkJCQkJbnVsbF9tYXBwZWQsIGdmcF9tYXNrKTsKKwkJCQkJZ2ZwX21hc2spOwogCQlpZiAocmV0IDwgMCkKIAkJCWdvdG8gdW5tYXBfcnE7CiAJCWlmICghYmlvKQogCQkJYmlvID0gcnEtPmJpbzsKIAkJYnl0ZXNfcmVhZCArPSByZXQ7CiAJCXVidWYgKz0gcmV0OworCisJCWlmIChtYXBfZGF0YSkKKwkJCW1hcF9kYXRhLT5vZmZzZXQgKz0gcmV0OwogCX0KIAogCWlmICghYmlvX2ZsYWdnZWQoYmlvLCBCSU9fVVNFUl9NQVBQRUQpKQpkaWZmIC0tZ2l0IGEvYmxvY2svYnNnLmMgYi9ibG9jay9ic2cuYwppbmRleCBlNzNlNTBkLi5kNDE0YmI1IDEwMDY0NAotLS0gYS9ibG9jay9ic2cuYworKysgYi9ibG9jay9ic2cuYwpAQCAtNDIsNyArNDIsNyBAQAogCWludCBkb25lX2NtZHM7CiAJd2FpdF9xdWV1ZV9oZWFkX3Qgd3FfZG9uZTsKIAl3YWl0X3F1ZXVlX2hlYWRfdCB3cV9mcmVlOwotCWNoYXIgbmFtZVtCVVNfSURfU0laRV07CisJY2hhciBuYW1lWzIwXTsKIAlpbnQgbWF4X3F1ZXVlOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiB9OwpAQCAtNzgxLDcgKzc4MSw3IEBACiAJbXV0ZXhfbG9jaygmYnNnX211dGV4KTsKIAlobGlzdF9hZGRfaGVhZCgmYmQtPmRldl9saXN0LCBic2dfZGV2X2lkeF9oYXNoKGltaW5vcihpbm9kZSkpKTsKIAotCXN0cm5jcHkoYmQtPm5hbWUsIHJxLT5ic2dfZGV2LmNsYXNzX2Rldi0+YnVzX2lkLCBzaXplb2YoYmQtPm5hbWUpIC0gMSk7CisJc3RybmNweShiZC0+bmFtZSwgZGV2X25hbWUocnEtPmJzZ19kZXYuY2xhc3NfZGV2KSwgc2l6ZW9mKGJkLT5uYW1lKSAtIDEpOwogCWRwcmludGsoImJvdW5kIHRvIDwlcz4sIG1heCBxdWV1ZSAlZFxuIiwKIAkJZm9ybWF0X2Rldl90KGJ1ZiwgaW5vZGUtPmlfcmRldiksIGJkLT5tYXhfcXVldWUpOwogCkBAIC05OTIsNyArOTkyLDcgQEAKIAlpZiAobmFtZSkKIAkJZGV2bmFtZSA9IG5hbWU7CiAJZWxzZQotCQlkZXZuYW1lID0gcGFyZW50LT5idXNfaWQ7CisJCWRldm5hbWUgPSBkZXZfbmFtZShwYXJlbnQpOwogCiAJLyoKIAkgKiB3ZSBuZWVkIGEgcHJvcGVyIHRyYW5zcG9ydCB0byBzZW5kIGNvbW1hbmRzLCBub3QgYSBzdGFja2VkIGRldmljZQpkaWZmIC0tZ2l0IGEvYmxvY2svZ2VuaGQuYyBiL2Jsb2NrL2dlbmhkLmMKaW5kZXggZDg0YTdkZi4uMzk3OTYwYyAxMDA2NDQKLS0tIGEvYmxvY2svZ2VuaGQuYworKysgYi9ibG9jay9nZW5oZC5jCkBAIC0xMDg0LDcgKzEwODQsNyBAQAogCQlzdHJ1Y3QgZ2VuZGlzayAqZGlzayA9IGRldl90b19kaXNrKGRldik7CiAJCXN0cnVjdCBoZF9zdHJ1Y3QgKnBhcnQ7CiAKLQkJaWYgKHN0cmNtcChkZXYtPmJ1c19pZCwgbmFtZSkpCisJCWlmIChzdHJjbXAoZGV2X25hbWUoZGV2KSwgbmFtZSkpCiAJCQljb250aW51ZTsKIAogCQlwYXJ0ID0gZGlza19nZXRfcGFydChkaXNrLCBwYXJ0bm8pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9NYWtlZmlsZSBiL2RyaXZlcnMvTWFrZWZpbGUKaW5kZXggZmNlYjcxYS4uNjMyNmY0ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9NYWtlZmlsZQorKysgYi9kcml2ZXJzL01ha2VmaWxlCkBAIC0xOCw2ICsxOCw5IEBACiAKIG9iai0kKENPTkZJR19YRU4pCQkrPSB4ZW4vCiAKKyMgcmVndWxhdG9ycyBlYXJseSwgc2luY2Ugc29tZSBzdWJzeXN0ZW1zIHJlbHkgb24gdGhlbSB0byBpbml0aWFsaXplCitvYmotJChDT05GSUdfUkVHVUxBVE9SKQkJKz0gcmVndWxhdG9yLworCiAjIGNoYXIvIGNvbWVzIGJlZm9yZSBzZXJpYWwvIGV0YyBzbyB0aGF0IHRoZSBWVCBjb25zb2xlIGlzIHRoZSBib290LXRpbWUKICMgZGVmYXVsdC4KIG9iai15CQkJCSs9IGNoYXIvCkBAIC01Nyw2ICs2MCw3IEBACiBvYmotJChDT05GSUdfUEFSSURFKSAJCSs9IGJsb2NrL3BhcmlkZS8KIG9iai0kKENPTkZJR19UQykJCSs9IHRjLwogb2JqLSQoQ09ORklHX1VXQikJCSs9IHV3Yi8KK29iai0kKENPTkZJR19VU0JfT1RHX1VUSUxTKQkrPSB1c2Ivb3RnLwogb2JqLSQoQ09ORklHX1VTQikJCSs9IHVzYi8KIG9iai0kKENPTkZJR19VU0JfTVVTQl9IRFJDKQkrPSB1c2IvbXVzYi8KIG9iai0kKENPTkZJR19QQ0kpCQkrPSB1c2IvCkBAIC0xMDAsNSArMTA0LDQgQEAKIG9iai0kKENPTkZJR19PRikJCSs9IG9mLwogb2JqLSQoQ09ORklHX1NTQikJCSs9IHNzYi8KIG9iai0kKENPTkZJR19WSVJUSU8pCQkrPSB2aXJ0aW8vCi1vYmotJChDT05GSUdfUkVHVUxBVE9SKQkJKz0gcmVndWxhdG9yLwogb2JqLSQoQ09ORklHX1NUQUdJTkcpCQkrPSBzdGFnaW5nLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGlfbWVtaG90cGx1Zy5jIGIvZHJpdmVycy9hY3BpL2FjcGlfbWVtaG90cGx1Zy5jCmluZGV4IDYzYTE3YjUuLjdhMGY0YWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpX21lbWhvdHBsdWcuYworKysgYi9kcml2ZXJzL2FjcGkvYWNwaV9tZW1ob3RwbHVnLmMKQEAgLTIwLDcgKzIwLDcgQEAKICAqCiAgKgogICogQUNQSSBiYXNlZCBIb3RQbHVnIGRyaXZlciB0aGF0IHN1cHBvcnRzIE1lbW9yeSBIb3RwbHVnCi0gKiBUaGlzIGRyaXZlciBmaWVsZHMgbm90aWZpY2F0aW9ucyBmcm9tIGZpcm1hcmUgZm9yIG1lbW9yeSBhZGQKKyAqIFRoaXMgZHJpdmVyIGZpZWxkcyBub3RpZmljYXRpb25zIGZyb20gZmlybXdhcmUgZm9yIG1lbW9yeSBhZGQKICAqIGFuZCByZW1vdmUgb3BlcmF0aW9ucyBhbmQgYWxlcnRzIHRoZSBWTSBvZiB0aGUgYWZmZWN0ZWQgbWVtb3J5CiAgKiByYW5nZXMuCiAgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leHByZXAuYyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leHByZXAuYwppbmRleCA1ZDQzOGMzLi5hN2RjODdlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhwcmVwLmMKKysrIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4cHJlcC5jCkBAIC00MDQsNyArNDA0LDcgQEAKICAqCiAgKiBSRVRVUk46ICAgICAgU3RhdHVzCiAgKgotICogREVTQ1JJUFRJT046IENvbnN0cnVjdCBhbiB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0IG9mIHR5cGUgZGVmX2ZpZWxkIGFuZAorICogREVTQ1JJUFRJT046IENvbnN0cnVjdCBhIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3Qgb2YgdHlwZSBkZWZfZmllbGQgYW5kCiAgKiAgICAgICAgICAgICAgY29ubmVjdCBpdCB0byB0aGUgcGFyZW50IE5vZGUuCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leHJlc29sdi5jIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4cmVzb2x2LmMKaW5kZXggODk1NzFiOS4uNjBlOGM0NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4cmVzb2x2LmMKKysrIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4cmVzb2x2LmMKQEAgLTE0Niw3ICsxNDYsNyBAQAogCiAJc3RhY2tfZGVzYyA9ICpzdGFja19wdHI7CiAKLQkvKiBUaGlzIGlzIGFuIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgKi8KKwkvKiBUaGlzIGlzIGEgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAqLwogCiAJc3dpdGNoIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShzdGFja19kZXNjKSkgewogCWNhc2UgQUNQSV9UWVBFX0xPQ0FMX1JFRkVSRU5DRToKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leHN0b3JlLmMgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhzdG9yZS5jCmluZGV4IDMzMThkZjQuLjFjMTE4YmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leHN0b3JlLmMKKysrIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4c3RvcmUuYwpAQCAtMjc0LDcgKzI3NCw3IEBACiAgKgogICogUEFSQU1FVEVSUzogICpzb3VyY2VfZGVzYyAgICAgICAgLSBWYWx1ZSB0byBiZSBzdG9yZWQKICAqICAgICAgICAgICAgICAqZGVzdF9kZXNjICAgICAgICAgIC0gV2hlcmUgdG8gc3RvcmUgaXQuICBNdXN0IGJlIGFuIE5TIG5vZGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgYW4gdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCBvZiB0eXBlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGEgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCBvZiB0eXBlCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZmVyZW5jZTsKICAqICAgICAgICAgICAgICB3YWxrX3N0YXRlICAgICAgICAgIC0gQ3VycmVudCB3YWxrIHN0YXRlCiAgKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3BjaV9yb290LmMgYi9kcml2ZXJzL2FjcGkvcGNpX3Jvb3QuYwppbmRleCA2NDI1NTRiLi41YjM4YTAyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvcGNpX3Jvb3QuYworKysgYi9kcml2ZXJzL2FjcGkvcGNpX3Jvb3QuYwpAQCAtMzEsNiArMzEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvcG0uaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2ktYWNwaS5oPgogI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KICNpbmNsdWRlIDxhY3BpL2FjcGlfYnVzLmg+CiAjaW5jbHVkZSA8YWNwaS9hY3BpX2RyaXZlcnMuaD4KQEAgLTE5Myw2ICsxOTQsNyBAQAogCXVuc2lnbmVkIGxvbmcgbG9uZyB2YWx1ZSA9IDA7CiAJYWNwaV9oYW5kbGUgaGFuZGxlID0gTlVMTDsKIAlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmNoaWxkOworCXUzMiBmbGFncywgYmFzZV9mbGFnczsKIAogCiAJaWYgKCFkZXZpY2UpCkBAIC0yMTAsNiArMjEyLDEzIEBACiAKIAlkZXZpY2UtPm9wcy5iaW5kID0gYWNwaV9wY2lfYmluZDsKIAorCS8qCisJICogQWxsIHN1cHBvcnRlZCBhcmNoaXRlY3R1cmVzIHRoYXQgdXNlIEFDUEkgaGF2ZSBzdXBwb3J0IGZvcgorCSAqIFBDSSBkb21haW5zLCBzbyB3ZSBpbmRpY2F0ZSB0aGlzIGluIF9PU0Mgc3VwcG9ydCBjYXBhYmlsaXRpZXMuCisJICovCisJZmxhZ3MgPSBiYXNlX2ZsYWdzID0gT1NDX1BDSV9TRUdNRU5UX0dST1VQU19TVVBQT1JUOworCXBjaV9hY3BpX29zY19zdXBwb3J0KGRldmljZS0+aGFuZGxlLCBmbGFncyk7CisKIAkvKiAKIAkgKiBTZWdtZW50CiAJICogLS0tLS0tLQpAQCAtMzM1LDYgKzM0NCwxNyBAQAogCWxpc3RfZm9yX2VhY2hfZW50cnkoY2hpbGQsICZkZXZpY2UtPmNoaWxkcmVuLCBub2RlKQogCQlhY3BpX3BjaV9icmlkZ2Vfc2NhbihjaGlsZCk7CiAKKwkvKiBJbmRpY2F0ZSBzdXBwb3J0IGZvciB2YXJpb3VzIF9PU0MgY2FwYWJpbGl0aWVzLiAqLworCWlmIChwY2lfZXh0X2NmZ19hdmFpbChyb290LT5idXMtPnNlbGYpKQorCQlmbGFncyB8PSBPU0NfRVhUX1BDSV9DT05GSUdfU1VQUE9SVDsKKwlpZiAocGNpZV9hc3BtX2VuYWJsZWQoKSkKKwkJZmxhZ3MgfD0gT1NDX0FDVElWRV9TVEFURV9QV1JfU1VQUE9SVCB8CisJCQlPU0NfQ0xPQ0tfUFdSX0NBUEFCSUxJVFlfU1VQUE9SVDsKKwlpZiAocGNpX21zaV9lbmFibGVkKCkpCisJCWZsYWdzIHw9IE9TQ19NU0lfU1VQUE9SVDsKKwlpZiAoZmxhZ3MgIT0gYmFzZV9mbGFncykKKwkJcGNpX2FjcGlfb3NjX3N1cHBvcnQoZGV2aWNlLT5oYW5kbGUsIGZsYWdzKTsKKwogICAgICAgZW5kOgogCWlmIChyZXN1bHQpIHsKIAkJaWYgKCFsaXN0X2VtcHR5KCZyb290LT5ub2RlKSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfaWRsZS5jIGIvZHJpdmVycy9hY3BpL3Byb2Nlc3Nvcl9pZGxlLmMKaW5kZXggMzhhY2EwNC4uNjZhOWQ4MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3Byb2Nlc3Nvcl9pZGxlLmMKKysrIGIvZHJpdmVycy9hY3BpL3Byb2Nlc3Nvcl9pZGxlLmMKQEAgLTQxLDYgKzQxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9wbV9xb3NfcGFyYW1zLmg+CiAjaW5jbHVkZSA8bGludXgvY2xvY2tjaGlwcy5oPgogI2luY2x1ZGUgPGxpbnV4L2NwdWlkbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnFmbGFncy5oPgogCiAvKgogICogSW5jbHVkZSB0aGUgYXBpYyBkZWZpbml0aW9ucyBmb3IgeDg2IHRvIGhhdmUgdGhlIEFQSUMgdGltZXIgcmVsYXRlZCBkZWZpbmVzCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvcmVzb3VyY2VzL3JzY3JlYXRlLmMgYi9kcml2ZXJzL2FjcGkvcmVzb3VyY2VzL3JzY3JlYXRlLmMKaW5kZXggYzBiYmZhMi4uMDhiOGQ3MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc2NyZWF0ZS5jCisrKyBiL2RyaXZlcnMvYWNwaS9yZXNvdXJjZXMvcnNjcmVhdGUuYwpAQCAtMTI0LDcgKzEyNCw3IEBACiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfcnNfY3JlYXRlX3BjaV9yb3V0aW5nX3RhYmxlCiAgKgotICogUEFSQU1FVEVSUzogIHBhY2thZ2Vfb2JqZWN0ICAgICAgICAgIC0gUG9pbnRlciB0byBhbiB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0CisgKiBQQVJBTUVURVJTOiAgcGFja2FnZV9vYmplY3QgICAgICAgICAgLSBQb2ludGVyIHRvIGEgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZQogICogICAgICAgICAgICAgIG91dHB1dF9idWZmZXIgICAgICAgICAgIC0gUG9pbnRlciB0byB0aGUgdXNlcidzIGJ1ZmZlcgogICoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRvYmplY3QuYyBiL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRvYmplY3QuYwppbmRleCBjMzU0ZTdhLi40YmVmM2NmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0b2JqZWN0LmMKKysrIGIvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dG9iamVjdC5jCkBAIC0yOTcsNyArMjk3LDcgQEAKICAqCiAgKiBSRVRVUk46ICAgICAgVFJVRSBpZiBvYmplY3QgaXMgdmFsaWQsIEZBTFNFIG90aGVyd2lzZQogICoKLSAqIERFU0NSSVBUSU9OOiBWYWxpZGF0ZSBhIHBvaW50ZXIgdG8gYmUgYW4gdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdAorICogREVTQ1JJUFRJT046IFZhbGlkYXRlIGEgcG9pbnRlciB0byBiZSBhIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCkBAIC0zODksNyArMzg5LDcgQEAKIHsKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUih1dF9kZWxldGVfb2JqZWN0X2Rlc2MsIG9iamVjdCk7CiAKLQkvKiBPYmplY3QgbXVzdCBiZSBhbiB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICovCisJLyogT2JqZWN0IG11c3QgYmUgYSB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICovCiAKIAlpZiAoQUNQSV9HRVRfREVTQ1JJUFRPUl9UWVBFKG9iamVjdCkgIT0gQUNQSV9ERVNDX1RZUEVfT1BFUkFORCkgewogCQlBQ1BJX0VSUk9SKChBRV9JTkZPLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hbWJhL2J1cy5jIGIvZHJpdmVycy9hbWJhL2J1cy5jCmluZGV4IDZiOTRmYjcuLjAwYzQ2ZTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYW1iYS9idXMuYworKysgYi9kcml2ZXJzL2FtYmEvYnVzLmMKQEAgLTEyLDkgKzEyLDEwIEBACiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvYW1iYS9idXMuaD4KIAotI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vc2l6ZXMuaD4KIAogI2RlZmluZSB0b19hbWJhX2RldmljZShkKQljb250YWluZXJfb2YoZCwgc3RydWN0IGFtYmFfZGV2aWNlLCBkZXYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9haGNpLmMgYi9kcml2ZXJzL2F0YS9haGNpLmMKaW5kZXggNjU2NDQ4Yy4uN2Y3MDFjYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvYWhjaS5jCisrKyBiL2RyaXZlcnMvYXRhL2FoY2kuYwpAQCAtMTA1LDcgKzEwNSw3IEBACiAJYm9hcmRfYWhjaV9pZ25faWZlcnIJPSAyLAogCWJvYXJkX2FoY2lfc2I2MDAJPSAzLAogCWJvYXJkX2FoY2lfbXYJCT0gNCwKLQlib2FyZF9haGNpX3NiNzAwCT0gNSwKKwlib2FyZF9haGNpX3NiNzAwCT0gNSwgLyogZm9yIFNCNzAwIGFuZCBTQjgwMCAqLwogCWJvYXJkX2FoY2lfbWNwNjUJPSA2LAogCWJvYXJkX2FoY2lfbm9wbXAJPSA3LAogCkBAIC00MzksNyArNDM5LDcgQEAKIAkJLnVkbWFfbWFzawk9IEFUQV9VRE1BNiwKIAkJLnBvcnRfb3BzCT0gJmFoY2lfb3BzLAogCX0sCi0JLyogYm9hcmRfYWhjaV9zYjcwMCAqLworCS8qIGJvYXJkX2FoY2lfc2I3MDAsIGZvciBTQjcwMCBhbmQgU0I4MDAgKi8KIAl7CiAJCUFIQ0lfSEZMQUdTCShBSENJX0hGTEFHX0lHTl9TRVJSX0lOVEVSTkFMKSwKIAkJLmZsYWdzCQk9IEFIQ0lfRkxBR19DT01NT04sCkBAIC0yNDQ2LDYgKzI0NDYsOCBAQAogCQlzcGVlZF9zID0gIjEuNSI7CiAJZWxzZSBpZiAoc3BlZWQgPT0gMikKIAkJc3BlZWRfcyA9ICIzIjsKKwllbHNlIGlmIChzcGVlZCA9PSAzKQorCQlzcGVlZF9zID0gIjYiOwogCWVsc2UKIAkJc3BlZWRfcyA9ICI/IjsKIApAQCAtMjYxMCw2ICsyNjEyLDEwIEBACiAJICAgIChwZGV2LT5yZXZpc2lvbiA9PSAweGExIHx8IHBkZXYtPnJldmlzaW9uID09IDB4YTIpKQogCQlocHJpdi0+ZmxhZ3MgfD0gQUhDSV9IRkxBR19OT19NU0k7CiAKKwkvKiBTQjgwMCBkb2VzIE5PVCBuZWVkIHRoZSB3b3JrYXJvdW5kIHRvIGlnbm9yZSBTRVJSX0lOVEVSTkFMICovCisJaWYgKGJvYXJkX2lkID09IGJvYXJkX2FoY2lfc2I3MDAgJiYgcGRldi0+cmV2aXNpb24gPj0gMHg0MCkKKwkJaHByaXYtPmZsYWdzICY9IH5BSENJX0hGTEFHX0lHTl9TRVJSX0lOVEVSTkFMOworCiAJaWYgKChocHJpdi0+ZmxhZ3MgJiBBSENJX0hGTEFHX05PX01TSSkgfHwgcGNpX2VuYWJsZV9tc2kocGRldikpCiAJCXBjaV9pbnR4KHBkZXYsIDEpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9hdGFfcGlpeC5jIGIvZHJpdmVycy9hdGEvYXRhX3BpaXguYwppbmRleCA1ZmRmMTY3Li44ODdkOGY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9hdGFfcGlpeC5jCisrKyBiL2RyaXZlcnMvYXRhL2F0YV9waWl4LmMKQEAgLTE1NCwxMSArMTU0LDEzIEBACiAKIHN0cnVjdCBwaWl4X2hvc3RfcHJpdiB7CiAJY29uc3QgaW50ICptYXA7CisJdTMyIHNhdmVkX2lvY2ZnOwogCXZvaWQgX19pb21lbSAqc2lkcHI7CiB9OwogCiBzdGF0aWMgaW50IHBpaXhfaW5pdF9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCiAJCQkgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCk7CitzdGF0aWMgdm9pZCBwaWl4X3JlbW92ZV9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpOwogc3RhdGljIGludCBwaWl4X3BhdGFfcHJlcmVzZXQoc3RydWN0IGF0YV9saW5rICpsaW5rLCB1bnNpZ25lZCBsb25nIGRlYWRsaW5lKTsKIHN0YXRpYyB2b2lkIHBpaXhfc2V0X3Bpb21vZGUoc3RydWN0IGF0YV9wb3J0ICphcCwgc3RydWN0IGF0YV9kZXZpY2UgKmFkZXYpOwogc3RhdGljIHZvaWQgcGlpeF9zZXRfZG1hbW9kZShzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBzdHJ1Y3QgYXRhX2RldmljZSAqYWRldik7CkBAIC0yOTYsNyArMjk4LDcgQEAKIAkubmFtZQkJCT0gRFJWX05BTUUsCiAJLmlkX3RhYmxlCQk9IHBpaXhfcGNpX3RibCwKIAkucHJvYmUJCQk9IHBpaXhfaW5pdF9vbmUsCi0JLnJlbW92ZQkJCT0gYXRhX3BjaV9yZW1vdmVfb25lLAorCS5yZW1vdmUJCQk9IHBpaXhfcmVtb3ZlX29uZSwKICNpZmRlZiBDT05GSUdfUE0KIAkuc3VzcGVuZAkJPSBwaWl4X3BjaV9kZXZpY2Vfc3VzcGVuZCwKIAkucmVzdW1lCQkJPSBwaWl4X3BjaV9kZXZpY2VfcmVzdW1lLApAQCAtMzA4LDcgKzMxMCw3IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IGF0YV9wb3J0X29wZXJhdGlvbnMgcGlpeF9wYXRhX29wcyA9IHsKLQkuaW5oZXJpdHMJCT0gJmF0YV9ibWRtYV9wb3J0X29wcywKKwkuaW5oZXJpdHMJCT0gJmF0YV9ibWRtYTMyX3BvcnRfb3BzLAogCS5jYWJsZV9kZXRlY3QJCT0gYXRhX2NhYmxlXzQwd2lyZSwKIAkuc2V0X3Bpb21vZGUJCT0gcGlpeF9zZXRfcGlvbW9kZSwKIAkuc2V0X2RtYW1vZGUJCT0gcGlpeF9zZXRfZG1hbW9kZSwKQEAgLTYxMCw4ICs2MTIsOSBAQAogc3RhdGljIGludCBpY2hfcGF0YV9jYWJsZV9kZXRlY3Qoc3RydWN0IGF0YV9wb3J0ICphcCkKIHsKIAlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRvX3BjaV9kZXYoYXAtPmhvc3QtPmRldik7CisJc3RydWN0IHBpaXhfaG9zdF9wcml2ICpocHJpdiA9IGFwLT5ob3N0LT5wcml2YXRlX2RhdGE7CiAJY29uc3Qgc3RydWN0IGljaF9sYXB0b3AgKmxhcCA9ICZpY2hfbGFwdG9wWzBdOwotCXU4IHRtcCwgbWFzazsKKwl1OCBtYXNrOwogCiAJLyogQ2hlY2sgZm9yIHNwZWNpYWxzIC0gQWNlciBBc3BpcmUgNTYwMldMTWkgKi8KIAl3aGlsZSAobGFwLT5kZXZpY2UpIHsKQEAgLTYyNSw4ICs2MjgsNyBAQAogCiAJLyogY2hlY2sgQklPUyBjYWJsZSBkZXRlY3QgcmVzdWx0cyAqLwogCW1hc2sgPSBhcC0+cG9ydF9ubyA9PSAwID8gUElJWF84MENfUFJJIDogUElJWF84MENfU0VDOwotCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIFBJSVhfSU9DRkcsICZ0bXApOwotCWlmICgodG1wICYgbWFzaykgPT0gMCkKKwlpZiAoKGhwcml2LT5zYXZlZF9pb2NmZyAmIG1hc2spID09IDApCiAJCXJldHVybiBBVEFfQ0JMX1BBVEE0MDsKIAlyZXR1cm4gQVRBX0NCTF9QQVRBODA7CiB9CkBAIC0xMzUwLDcgKzEzNTIsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBwaWl4X2lvY2ZnX2JpdDE4X3F1aXJrKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQorc3RhdGljIHZvaWQgcGlpeF9pb2NmZ19iaXQxOF9xdWlyayhzdHJ1Y3QgYXRhX2hvc3QgKmhvc3QpCiB7CiAJc3RhdGljIGNvbnN0IHN0cnVjdCBkbWlfc3lzdGVtX2lkIHN5c2lkc1tdID0gewogCQl7CkBAIC0xMzY3LDcgKzEzNjksOCBAQAogCiAJCXsgfQkvKiB0ZXJtaW5hdGUgbGlzdCAqLwogCX07Ci0JdTMyIGlvY2ZnOworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2Rldihob3N0LT5kZXYpOworCXN0cnVjdCBwaWl4X2hvc3RfcHJpdiAqaHByaXYgPSBob3N0LT5wcml2YXRlX2RhdGE7CiAKIAlpZiAoIWRtaV9jaGVja19zeXN0ZW0oc3lzaWRzKSkKIAkJcmV0dXJuOwpAQCAtMTM3NiwxMiArMTM3OSwxMSBAQAogCSAqIHNlZW0gdG8gdXNlIGl0IHRvIGRpc2FibGUgYSBjaGFubmVsLiAgQ2xlYXIgdGhlIGJpdCBvbiB0aGUKIAkgKiBhZmZlY3RlZCBzeXN0ZW1zLgogCSAqLwotCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LCBQSUlYX0lPQ0ZHLCAmaW9jZmcpOwotCWlmIChpb2NmZyAmICgxIDw8IDE4KSkgeworCWlmIChocHJpdi0+c2F2ZWRfaW9jZmcgJiAoMSA8PCAxOCkpIHsKIAkJZGV2X3ByaW50ayhLRVJOX0lORk8sICZwZGV2LT5kZXYsCiAJCQkgICAiYXBwbHlpbmcgSU9DRkcgYml0MTggcXVpcmtcbiIpOwotCQlpb2NmZyAmPSB+KDEgPDwgMTgpOwotCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBkZXYsIFBJSVhfSU9DRkcsIGlvY2ZnKTsKKwkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwZGV2LCBQSUlYX0lPQ0ZHLAorCQkJCSAgICAgICBocHJpdi0+c2F2ZWRfaW9jZmcgJiB+KDEgPDwgMTgpKTsKIAl9CiB9CiAKQEAgLTE0MzAsNiArMTQzMiwxNyBAQAogCWlmIChyYykKIAkJcmV0dXJuIHJjOwogCisJaHByaXYgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKmhwcml2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFocHJpdikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKiBTYXZlIElPQ0ZHLCB0aGlzIHdpbGwgYmUgdXNlZCBmb3IgY2FibGUgZGV0ZWN0aW9uLCBxdWlyaworCSAqIGRldGVjdGlvbiBhbmQgcmVzdG9yYXRpb24gb24gZGV0YWNoLiAgVGhpcyBpcyBuZWNlc3NhcnkKKwkgKiBiZWNhdXNlIHNvbWUgQUNQSSBpbXBsZW1lbnRhdGlvbnMgbWVzcyB1cCBjYWJsZSByZWxhdGVkCisJICogYml0cyBvbiBfU1RNLiAgUmVwb3J0ZWQgb24ga2VybmVsIGJ6IzExODc5LgorCSAqLworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LCBQSUlYX0lPQ0ZHLCAmaHByaXYtPnNhdmVkX2lvY2ZnKTsKKwogCS8qIElDSDZSIG1heSBiZSBkcml2ZW4gYnkgZWl0aGVyIGF0YV9waWl4IG9yIGFoY2kgZHJpdmVyCiAJICogcmVnYXJkbGVzcyBvZiBCSU9TIGNvbmZpZ3VyYXRpb24uICBNYWtlIHN1cmUgQUhDSSBtb2RlIGlzCiAJICogb2ZmLgpAQCAtMTQ0MSwxMCArMTQ1NCw2IEBACiAJfQogCiAJLyogU0FUQSBtYXAgaW5pdCBjYW4gY2hhbmdlIHBvcnRfaW5mbywgZG8gaXQgYmVmb3JlIHByZXBwaW5nIGhvc3QgKi8KLQlocHJpdiA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqaHByaXYpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWhwcml2KQotCQlyZXR1cm4gLUVOT01FTTsKLQogCWlmIChwb3J0X2ZsYWdzICYgQVRBX0ZMQUdfU0FUQSkKIAkJaHByaXYtPm1hcCA9IHBpaXhfaW5pdF9zYXRhX21hcChwZGV2LCBwb3J0X2luZm8sCiAJCQkJCXBpaXhfbWFwX2RiX3RhYmxlW2VudC0+ZHJpdmVyX2RhdGFdKTsKQEAgLTE0NjMsNyArMTQ3Miw3IEBACiAJfQogCiAJLyogYXBwbHkgSU9DRkcgYml0MTggcXVpcmsgKi8KLQlwaWl4X2lvY2ZnX2JpdDE4X3F1aXJrKHBkZXYpOworCXBpaXhfaW9jZmdfYml0MThfcXVpcmsoaG9zdCk7CiAKIAkvKiBPbiBJQ0g1LCBzb21lIEJJT1NlbiBkaXNhYmxlIHRoZSBpbnRlcnJ1cHQgdXNpbmcgdGhlCiAJICogUENJX0NPTU1BTkRfSU5UWF9ESVNBQkxFIGJpdCBhZGRlZCBpbiBQQ0kgMi4zLgpAQCAtMTQ4OCw2ICsxNDk3LDE2IEBACiAJcmV0dXJuIGF0YV9wY2lfc2ZmX2FjdGl2YXRlX2hvc3QoaG9zdCwgYXRhX3NmZl9pbnRlcnJ1cHQsICZwaWl4X3NodCk7CiB9CiAKK3N0YXRpYyB2b2lkIHBpaXhfcmVtb3ZlX29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgYXRhX2hvc3QgKmhvc3QgPSBkZXZfZ2V0X2RydmRhdGEoJnBkZXYtPmRldik7CisJc3RydWN0IHBpaXhfaG9zdF9wcml2ICpocHJpdiA9IGhvc3QtPnByaXZhdGVfZGF0YTsKKworCXBjaV93cml0ZV9jb25maWdfZHdvcmQocGRldiwgUElJWF9JT0NGRywgaHByaXYtPnNhdmVkX2lvY2ZnKTsKKworCWF0YV9wY2lfcmVtb3ZlX29uZShwZGV2KTsKK30KKwogc3RhdGljIGludCBfX2luaXQgcGlpeF9pbml0KHZvaWQpCiB7CiAJaW50IHJjOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvbGliYXRhLWNvcmUuYyBiL2RyaXZlcnMvYXRhL2xpYmF0YS1jb3JlLmMKaW5kZXggZmVjY2E0Mi4uMTc1ZGY1NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvbGliYXRhLWNvcmUuYworKysgYi9kcml2ZXJzL2F0YS9saWJhdGEtY29yZS5jCkBAIC01Niw2ICs1Niw3IEBACiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CiAjaW5jbHVkZSA8bGludXgvc2NhdHRlcmxpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2FzeW5jLmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpLmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpX2NtbmQuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgpAQCAtMTAwNiw2ICsxMDA3LDcgQEAKIAlzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNwZF9zdHJbXSA9IHsKIAkJIjEuNSBHYnBzIiwKIAkJIjMuMCBHYnBzIiwKKwkJIjYuMCBHYnBzIiwKIAl9OwogCiAJaWYgKHNwZCA9PSAwIHx8IChzcGQgLSAxKSA+PSBBUlJBWV9TSVpFKHNwZF9zdHIpKQpAQCAtMTk5OSw2ICsyMDAxLDEwIEBACiAJICAgYXMgdGhlIGNhbGxlciBzaG91bGQga25vdyB0aGlzICovCiAJaWYgKGFkZXYtPmxpbmstPmFwLT5mbGFncyAmIEFUQV9GTEFHX05PX0lPUkRZKQogCQlyZXR1cm4gMDsKKwkvKiBDRiBzcGVjLiByNC4xIFRhYmxlIDIyIHNheXMgbm8gaW9yZHkgb24gUElPNSBhbmQgUElPNi4gICovCisJaWYgKGF0YV9pZF9pc19jZmEoYWRldi0+aWQpCisJICAgICYmIChhZGV2LT5waW9fbW9kZSA9PSBYRkVSX1BJT181IHx8IGFkZXYtPnBpb19tb2RlID09IFhGRVJfUElPXzYpKQorCQlyZXR1cm4gMDsKIAkvKiBQSU8zIGFuZCBoaWdoZXIgaXQgaXMgbWFuZGF0b3J5ICovCiAJaWYgKGFkZXYtPnBpb19tb2RlID4gWEZFUl9QSU9fMikKIAkJcmV0dXJuIDE7CkBAIC01OTA5LDYgKzU5MTUsNTQgQEAKIAlob3N0LT5vcHMgPSBvcHM7CiB9CiAKKworc3RhdGljIHZvaWQgYXN5bmNfcG9ydF9wcm9iZSh2b2lkICpkYXRhLCBhc3luY19jb29raWVfdCBjb29raWUpCit7CisJaW50IHJjOworCXN0cnVjdCBhdGFfcG9ydCAqYXAgPSBkYXRhOworCS8qIHByb2JlICovCisJaWYgKGFwLT5vcHMtPmVycm9yX2hhbmRsZXIpIHsKKwkJc3RydWN0IGF0YV9laF9pbmZvICplaGkgPSAmYXAtPmxpbmsuZWhfaW5mbzsKKwkJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCQlhdGFfcG9ydF9wcm9iZShhcCk7CisKKwkJLyoga2ljayBFSCBmb3IgYm9vdCBwcm9iaW5nICovCisJCXNwaW5fbG9ja19pcnFzYXZlKGFwLT5sb2NrLCBmbGFncyk7CisKKwkJZWhpLT5wcm9iZV9tYXNrIHw9IEFUQV9BTExfREVWSUNFUzsKKwkJZWhpLT5hY3Rpb24gfD0gQVRBX0VIX1JFU0VUIHwgQVRBX0VIX0xQTTsKKwkJZWhpLT5mbGFncyB8PSBBVEFfRUhJX05PX0FVVE9QU1kgfCBBVEFfRUhJX1FVSUVUOworCisJCWFwLT5wZmxhZ3MgJj0gfkFUQV9QRkxBR19JTklUSUFMSVpJTkc7CisJCWFwLT5wZmxhZ3MgfD0gQVRBX1BGTEFHX0xPQURJTkc7CisJCWF0YV9wb3J0X3NjaGVkdWxlX2VoKGFwKTsKKworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKGFwLT5sb2NrLCBmbGFncyk7CisKKwkJLyogd2FpdCBmb3IgRUggdG8gZmluaXNoICovCisJCWF0YV9wb3J0X3dhaXRfZWgoYXApOworCX0gZWxzZSB7CisJCURQUklOVEsoImF0YSV1OiBidXMgcHJvYmUgYmVnaW5cbiIsIGFwLT5wcmludF9pZCk7CisJCXJjID0gYXRhX2J1c19wcm9iZShhcCk7CisJCURQUklOVEsoImF0YSV1OiBidXMgcHJvYmUgZW5kXG4iLCBhcC0+cHJpbnRfaWQpOworCisJCWlmIChyYykgeworCQkJLyogRklYTUU6IGRvIHNvbWV0aGluZyB1c2VmdWwgaGVyZT8KKwkJCSAqIEN1cnJlbnQgbGliYXRhIGJlaGF2aW9yIHdpbGwKKwkJCSAqIHRlYXIgZG93biBldmVyeXRoaW5nIHdoZW4KKwkJCSAqIHRoZSBtb2R1bGUgaXMgcmVtb3ZlZAorCQkJICogb3IgdGhlIGgvdyBpcyB1bnBsdWdnZWQuCisJCQkgKi8KKwkJfQorCX0KKworCS8qIGluIG9yZGVyIHRvIGtlZXAgZGV2aWNlIG9yZGVyLCB3ZSBuZWVkIHRvIHN5bmNocm9uaXplIGF0IHRoaXMgcG9pbnQgKi8KKwlhc3luY19zeW5jaHJvbml6ZV9jb29raWUoY29va2llKTsKKworCWF0YV9zY3NpX3NjYW5faG9zdChhcCwgMSk7CisKK30KIC8qKgogICoJYXRhX2hvc3RfcmVnaXN0ZXIgLSByZWdpc3RlciBpbml0aWFsaXplZCBBVEEgaG9zdAogICoJQGhvc3Q6IEFUQSBob3N0IHRvIHJlZ2lzdGVyCkBAIC01OTg4LDUyICs2MDQyLDkgQEAKIAlEUFJJTlRLKCJwcm9iZSBiZWdpblxuIik7CiAJZm9yIChpID0gMDsgaSA8IGhvc3QtPm5fcG9ydHM7IGkrKykgewogCQlzdHJ1Y3QgYXRhX3BvcnQgKmFwID0gaG9zdC0+cG9ydHNbaV07Ci0KLQkJLyogcHJvYmUgKi8KLQkJaWYgKGFwLT5vcHMtPmVycm9yX2hhbmRsZXIpIHsKLQkJCXN0cnVjdCBhdGFfZWhfaW5mbyAqZWhpID0gJmFwLT5saW5rLmVoX2luZm87Ci0JCQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JCQlhdGFfcG9ydF9wcm9iZShhcCk7Ci0KLQkJCS8qIGtpY2sgRUggZm9yIGJvb3QgcHJvYmluZyAqLwotCQkJc3Bpbl9sb2NrX2lycXNhdmUoYXAtPmxvY2ssIGZsYWdzKTsKLQotCQkJZWhpLT5wcm9iZV9tYXNrIHw9IEFUQV9BTExfREVWSUNFUzsKLQkJCWVoaS0+YWN0aW9uIHw9IEFUQV9FSF9SRVNFVCB8IEFUQV9FSF9MUE07Ci0JCQllaGktPmZsYWdzIHw9IEFUQV9FSElfTk9fQVVUT1BTWSB8IEFUQV9FSElfUVVJRVQ7Ci0KLQkJCWFwLT5wZmxhZ3MgJj0gfkFUQV9QRkxBR19JTklUSUFMSVpJTkc7Ci0JCQlhcC0+cGZsYWdzIHw9IEFUQV9QRkxBR19MT0FESU5HOwotCQkJYXRhX3BvcnRfc2NoZWR1bGVfZWgoYXApOwotCi0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKGFwLT5sb2NrLCBmbGFncyk7Ci0KLQkJCS8qIHdhaXQgZm9yIEVIIHRvIGZpbmlzaCAqLwotCQkJYXRhX3BvcnRfd2FpdF9laChhcCk7Ci0JCX0gZWxzZSB7Ci0JCQlEUFJJTlRLKCJhdGEldTogYnVzIHByb2JlIGJlZ2luXG4iLCBhcC0+cHJpbnRfaWQpOwotCQkJcmMgPSBhdGFfYnVzX3Byb2JlKGFwKTsKLQkJCURQUklOVEsoImF0YSV1OiBidXMgcHJvYmUgZW5kXG4iLCBhcC0+cHJpbnRfaWQpOwotCi0JCQlpZiAocmMpIHsKLQkJCQkvKiBGSVhNRTogZG8gc29tZXRoaW5nIHVzZWZ1bCBoZXJlPwotCQkJCSAqIEN1cnJlbnQgbGliYXRhIGJlaGF2aW9yIHdpbGwKLQkJCQkgKiB0ZWFyIGRvd24gZXZlcnl0aGluZyB3aGVuCi0JCQkJICogdGhlIG1vZHVsZSBpcyByZW1vdmVkCi0JCQkJICogb3IgdGhlIGgvdyBpcyB1bnBsdWdnZWQuCi0JCQkJICovCi0JCQl9Ci0JCX0KKwkJYXN5bmNfc2NoZWR1bGUoYXN5bmNfcG9ydF9wcm9iZSwgYXApOwogCX0KLQotCS8qIHByb2JlcyBhcmUgZG9uZSwgbm93IHNjYW4gZWFjaCBwb3J0J3MgZGlzayhzKSAqLwotCURQUklOVEsoImhvc3QgcHJvYmUgYmVnaW5cbiIpOwotCWZvciAoaSA9IDA7IGkgPCBob3N0LT5uX3BvcnRzOyBpKyspIHsKLQkJc3RydWN0IGF0YV9wb3J0ICphcCA9IGhvc3QtPnBvcnRzW2ldOwotCi0JCWF0YV9zY3NpX3NjYW5faG9zdChhcCwgMSk7Ci0JfQorCURQUklOVEsoInByb2JlIGVuZFxuIik7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL2xpYmF0YS1zY3NpLmMgYi9kcml2ZXJzL2F0YS9saWJhdGEtc2NzaS5jCmluZGV4IDQwNDBkOGIuLjllOTIxMDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL2xpYmF0YS1zY3NpLmMKKysrIGIvZHJpdmVycy9hdGEvbGliYXRhLXNjc2kuYwpAQCAtMzM2OSw3ICszMzY5LDcgQEAKIAogCWlmIChzZGV2KSB7CiAJCWF0YV9kZXZfcHJpbnRrKGRldiwgS0VSTl9JTkZPLCAiZGV0YWNoaW5nIChTQ1NJICVzKVxuIiwKLQkJCSAgICAgICBzZGV2LT5zZGV2X2dlbmRldi5idXNfaWQpOworCQkJICAgICAgIGRldl9uYW1lKCZzZGV2LT5zZGV2X2dlbmRldikpOwogCiAJCXNjc2lfcmVtb3ZlX2RldmljZShzZGV2KTsKIAkJc2NzaV9kZXZpY2VfcHV0KHNkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvbGliYXRhLXNmZi5jIGIvZHJpdmVycy9hdGEvbGliYXRhLXNmZi5jCmluZGV4IDkwMzNkMTYuLmM1OWFkNzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL2xpYmF0YS1zZmYuYworKysgYi9kcml2ZXJzL2F0YS9saWJhdGEtc2ZmLmMKQEAgLTY2LDYgKzY2LDcgQEAKIAogCS5wb3J0X3N0YXJ0CQk9IGF0YV9zZmZfcG9ydF9zdGFydCwKIH07CitFWFBPUlRfU1lNQk9MX0dQTChhdGFfc2ZmX3BvcnRfb3BzKTsKIAogY29uc3Qgc3RydWN0IGF0YV9wb3J0X29wZXJhdGlvbnMgYXRhX2JtZG1hX3BvcnRfb3BzID0gewogCS5pbmhlcml0cwkJPSAmYXRhX3NmZl9wb3J0X29wcywKQEAgLTc3LDYgKzc4LDE0IEBACiAJLmJtZG1hX3N0b3AJCT0gYXRhX2JtZG1hX3N0b3AsCiAJLmJtZG1hX3N0YXR1cwkJPSBhdGFfYm1kbWFfc3RhdHVzLAogfTsKK0VYUE9SVF9TWU1CT0xfR1BMKGF0YV9ibWRtYV9wb3J0X29wcyk7CisKK2NvbnN0IHN0cnVjdCBhdGFfcG9ydF9vcGVyYXRpb25zIGF0YV9ibWRtYTMyX3BvcnRfb3BzID0geworCS5pbmhlcml0cwkJPSAmYXRhX2JtZG1hX3BvcnRfb3BzLAorCisJLnNmZl9kYXRhX3hmZXIJCT0gYXRhX3NmZl9kYXRhX3hmZXIzMiwKK307CitFWFBPUlRfU1lNQk9MX0dQTChhdGFfYm1kbWEzMl9wb3J0X29wcyk7CiAKIC8qKgogICoJYXRhX2ZpbGxfc2cgLSBGaWxsIFBDSSBJREUgUFJEIHRhYmxlCkBAIC0xNjYsOCArMTc1LDkgQEAKIAkJCWJsZW4gPSBsZW4gJiAweGZmZmY7CiAJCQlhcC0+cHJkW3BpXS5hZGRyID0gY3B1X3RvX2xlMzIoYWRkcik7CiAJCQlpZiAoYmxlbiA9PSAwKSB7Ci0JCQkgICAvKiBTb21lIFBBVEEgY2hpcHNldHMgbGlrZSB0aGUgQ1M1NTMwIGNhbid0Ci0JCQkgICAgICBjb3BlIHdpdGggMHgwMDAwIG1lYW5pbmcgNjRLIGFzIHRoZSBzcGVjIHNheXMgKi8KKwkJCQkvKiBTb21lIFBBVEEgY2hpcHNldHMgbGlrZSB0aGUgQ1M1NTMwIGNhbid0CisJCQkJICAgY29wZSB3aXRoIDB4MDAwMCBtZWFuaW5nIDY0SyBhcyB0aGUgc3BlYworCQkJCSAgIHNheXMgKi8KIAkJCQlhcC0+cHJkW3BpXS5mbGFnc19sZW4gPSBjcHVfdG9fbGUzMigweDgwMDApOwogCQkJCWJsZW4gPSAweDgwMDA7CiAJCQkJYXAtPnByZFsrK3BpXS5hZGRyID0gY3B1X3RvX2xlMzIoYWRkciArIDB4ODAwMCk7CkBAIC0yMDAsNiArMjEwLDcgQEAKIAogCWF0YV9maWxsX3NnKHFjKTsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKGF0YV9zZmZfcWNfcHJlcCk7CiAKIC8qKgogICoJYXRhX3NmZl9kdW1iX3FjX3ByZXAgLSBQcmVwYXJlIHRhc2tmaWxlIGZvciBzdWJtaXNzaW9uCkBAIC0yMTcsNiArMjI4LDcgQEAKIAogCWF0YV9maWxsX3NnX2R1bWIocWMpOwogfQorRVhQT1JUX1NZTUJPTF9HUEwoYXRhX3NmZl9kdW1iX3FjX3ByZXApOwogCiAvKioKICAqCWF0YV9zZmZfY2hlY2tfc3RhdHVzIC0gUmVhZCBkZXZpY2Ugc3RhdHVzIHJlZyAmIGNsZWFyIGludGVycnVwdApAQCAtMjMzLDYgKzI0NSw3IEBACiB7CiAJcmV0dXJuIGlvcmVhZDgoYXAtPmlvYWRkci5zdGF0dXNfYWRkcik7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChhdGFfc2ZmX2NoZWNrX3N0YXR1cyk7CiAKIC8qKgogICoJYXRhX3NmZl9hbHRzdGF0dXMgLSBSZWFkIGRldmljZSBhbHRlcm5hdGUgc3RhdHVzIHJlZwpAQCAtMjc1LDcgKzI4OCw3IEBACiAJCXN0YXR1cyA9IGF0YV9zZmZfYWx0c3RhdHVzKGFwKTsKIAkJLyogTm90IHVzOiBXZSBhcmUgYnVzeSAqLwogCQlpZiAoc3RhdHVzICYgQVRBX0JVU1kpCi0JCSAgICAJcmV0dXJuIHN0YXR1czsKKwkJCXJldHVybiBzdGF0dXM7CiAJfQogCS8qIENsZWFyIElOVFJRIGxhdGNoICovCiAJc3RhdHVzID0gYXAtPm9wcy0+c2ZmX2NoZWNrX3N0YXR1cyhhcCk7CkBAIC0zMTksNiArMzMyLDcgQEAKIAlhdGFfc2ZmX3N5bmMoYXApOwogCW5kZWxheSg0MDApOwogfQorRVhQT1JUX1NZTUJPTF9HUEwoYXRhX3NmZl9wYXVzZSk7CiAKIC8qKgogICoJYXRhX3NmZl9kbWFfcGF1c2UJLQlQYXVzZSBiZWZvcmUgY29tbWVuY2luZyBETUEKQEAgLTMyNyw3ICszNDEsNyBAQAogICoJUGVyZm9ybSBJL08gZmVuY2luZyBhbmQgZW5zdXJlIHN1ZmZpY2llbnQgY3ljbGUgZGVsYXlzIG9jY3VyCiAgKglmb3IgdGhlIEhETUExOjAgdHJhbnNpdGlvbgogICovCi0gCisKIHZvaWQgYXRhX3NmZl9kbWFfcGF1c2Uoc3RydWN0IGF0YV9wb3J0ICphcCkKIHsKIAlpZiAoYXAtPm9wcy0+c2ZmX2NoZWNrX2FsdHN0YXR1cyB8fCBhcC0+aW9hZGRyLmFsdHN0YXR1c19hZGRyKSB7CkBAIC0zNDEsNiArMzU1LDcgQEAKIAkgICBjb3JydXB0aW9uLiAqLwogCUJVRygpOwogfQorRVhQT1JUX1NZTUJPTF9HUEwoYXRhX3NmZl9kbWFfcGF1c2UpOwogCiAvKioKICAqCWF0YV9zZmZfYnVzeV9zbGVlcCAtIHNsZWVwIHVudGlsIEJTWSBjbGVhcnMsIG9yIHRpbWVvdXQKQEAgLTM5Niw2ICs0MTEsNyBAQAogCiAJcmV0dXJuIDA7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChhdGFfc2ZmX2J1c3lfc2xlZXApOwogCiBzdGF0aWMgaW50IGF0YV9zZmZfY2hlY2tfcmVhZHkoc3RydWN0IGF0YV9saW5rICpsaW5rKQogewpAQCAtNDIyLDYgKzQzOCw3IEBACiB7CiAJcmV0dXJuIGF0YV93YWl0X3JlYWR5KGxpbmssIGRlYWRsaW5lLCBhdGFfc2ZmX2NoZWNrX3JlYWR5KTsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKGF0YV9zZmZfd2FpdF9yZWFkeSk7CiAKIC8qKgogICoJYXRhX3NmZl9kZXZfc2VsZWN0IC0gU2VsZWN0IGRldmljZSAwLzEgb24gQVRBIGJ1cwpAQCAtNDQ5LDYgKzQ2Niw3IEBACiAJaW93cml0ZTgodG1wLCBhcC0+aW9hZGRyLmRldmljZV9hZGRyKTsKIAlhdGFfc2ZmX3BhdXNlKGFwKTsJLyogbmVlZGVkOyBhbHNvIGZsdXNoZXMsIGZvciBtbWlvICovCiB9CitFWFBPUlRfU1lNQk9MX0dQTChhdGFfc2ZmX2Rldl9zZWxlY3QpOwogCiAvKioKICAqCWF0YV9kZXZfc2VsZWN0IC0gU2VsZWN0IGRldmljZSAwLzEgb24gQVRBIGJ1cwpAQCAtNTEzLDYgKzUzMSw3IEBACiAKIAlyZXR1cm4gdG1wOwogfQorRVhQT1JUX1NZTUJPTF9HUEwoYXRhX3NmZl9pcnFfb24pOwogCiAvKioKICAqCWF0YV9zZmZfaXJxX2NsZWFyIC0gQ2xlYXIgUENJIElERSBCTURNQSBpbnRlcnJ1cHQuCkBAIC01MzQsNiArNTUzLDcgQEAKIAogCWlvd3JpdGU4KGlvcmVhZDgobW1pbyArIEFUQV9ETUFfU1RBVFVTKSwgbW1pbyArIEFUQV9ETUFfU1RBVFVTKTsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKGF0YV9zZmZfaXJxX2NsZWFyKTsKIAogLyoqCiAgKglhdGFfc2ZmX3RmX2xvYWQgLSBzZW5kIHRhc2tmaWxlIHJlZ2lzdGVycyB0byBob3N0IGNvbnRyb2xsZXIKQEAgLTU5Myw2ICs2MTMsNyBAQAogCiAJYXRhX3dhaXRfaWRsZShhcCk7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChhdGFfc2ZmX3RmX2xvYWQpOwogCiAvKioKICAqCWF0YV9zZmZfdGZfcmVhZCAtIGlucHV0IGRldmljZSdzIEFUQSB0YXNrZmlsZSBzaGFkb3cgcmVnaXN0ZXJzCkBAIC02MzMsNiArNjU0LDcgQEAKIAkJCVdBUk5fT04oMSk7CiAJfQogfQorRVhQT1JUX1NZTUJPTF9HUEwoYXRhX3NmZl90Zl9yZWFkKTsKIAogLyoqCiAgKglhdGFfc2ZmX2V4ZWNfY29tbWFuZCAtIGlzc3VlIEFUQSBjb21tYW5kIHRvIGhvc3QgY29udHJvbGxlcgpAQCAtNjUyLDYgKzY3NCw3IEBACiAJaW93cml0ZTgodGYtPmNvbW1hbmQsIGFwLT5pb2FkZHIuY29tbWFuZF9hZGRyKTsKIAlhdGFfc2ZmX3BhdXNlKGFwKTsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKGF0YV9zZmZfZXhlY19jb21tYW5kKTsKIAogLyoqCiAgKglhdGFfdGZfdG9faG9zdCAtIGlzc3VlIEFUQSB0YXNrZmlsZSB0byBob3N0IGNvbnRyb2xsZXIKQEAgLTcxNyw2ICs3NDAsNTMgQEAKIAogCXJldHVybiB3b3JkcyA8PCAxOwogfQorRVhQT1JUX1NZTUJPTF9HUEwoYXRhX3NmZl9kYXRhX3hmZXIpOworCisvKioKKyAqCWF0YV9zZmZfZGF0YV94ZmVyMzIgLSBUcmFuc2ZlciBkYXRhIGJ5IFBJTworICoJQGRldjogZGV2aWNlIHRvIHRhcmdldAorICoJQGJ1ZjogZGF0YSBidWZmZXIKKyAqCUBidWZsZW46IGJ1ZmZlciBsZW5ndGgKKyAqCUBydzogcmVhZC93cml0ZQorICoKKyAqCVRyYW5zZmVyIGRhdGEgZnJvbS90byB0aGUgZGV2aWNlIGRhdGEgcmVnaXN0ZXIgYnkgUElPIHVzaW5nIDMyYml0CisgKglJL08gb3BlcmF0aW9ucy4KKyAqCisgKglMT0NLSU5HOgorICoJSW5oZXJpdGVkIGZyb20gY2FsbGVyLgorICoKKyAqCVJFVFVSTlM6CisgKglCeXRlcyBjb25zdW1lZC4KKyAqLworCit1bnNpZ25lZCBpbnQgYXRhX3NmZl9kYXRhX3hmZXIzMihzdHJ1Y3QgYXRhX2RldmljZSAqZGV2LCB1bnNpZ25lZCBjaGFyICpidWYsCisJCQkgICAgICAgdW5zaWduZWQgaW50IGJ1ZmxlbiwgaW50IHJ3KQoreworCXN0cnVjdCBhdGFfcG9ydCAqYXAgPSBkZXYtPmxpbmstPmFwOworCXZvaWQgX19pb21lbSAqZGF0YV9hZGRyID0gYXAtPmlvYWRkci5kYXRhX2FkZHI7CisJdW5zaWduZWQgaW50IHdvcmRzID0gYnVmbGVuID4+IDI7CisJaW50IHNsb3AgPSBidWZsZW4gJiAzOworCisJLyogVHJhbnNmZXIgbXVsdGlwbGUgb2YgNCBieXRlcyAqLworCWlmIChydyA9PSBSRUFEKQorCQlpb3JlYWQzMl9yZXAoZGF0YV9hZGRyLCBidWYsIHdvcmRzKTsKKwllbHNlCisJCWlvd3JpdGUzMl9yZXAoZGF0YV9hZGRyLCBidWYsIHdvcmRzKTsKKworCWlmICh1bmxpa2VseShzbG9wKSkgeworCQlfX2xlMzIgcGFkOworCQlpZiAocncgPT0gUkVBRCkgeworCQkJcGFkID0gY3B1X3RvX2xlMzIoaW9yZWFkMzIoYXAtPmlvYWRkci5kYXRhX2FkZHIpKTsKKwkJCW1lbWNweShidWYgKyBidWZsZW4gLSBzbG9wLCAmcGFkLCBzbG9wKTsKKwkJfSBlbHNlIHsKKwkJCW1lbWNweSgmcGFkLCBidWYgKyBidWZsZW4gLSBzbG9wLCBzbG9wKTsKKwkJCWlvd3JpdGUzMihsZTMyX3RvX2NwdShwYWQpLCBhcC0+aW9hZGRyLmRhdGFfYWRkcik7CisJCX0KKwkJd29yZHMrKzsKKwl9CisJcmV0dXJuIHdvcmRzIDw8IDI7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChhdGFfc2ZmX2RhdGFfeGZlcjMyKTsKIAogLyoqCiAgKglhdGFfc2ZmX2RhdGFfeGZlcl9ub2lycSAtIFRyYW5zZmVyIGRhdGEgYnkgUElPCkBAIC03NDYsNiArODE2LDcgQEAKIAogCXJldHVybiBjb25zdW1lZDsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKGF0YV9zZmZfZGF0YV94ZmVyX25vaXJxKTsKIAogLyoqCiAgKglhdGFfcGlvX3NlY3RvciAtIFRyYW5zZmVyIGEgc2VjdG9yIG9mIGRhdGEuCkBAIC05MjIsMTMgKzk5MywxNSBAQAogCQlidWYgPSBrbWFwX2F0b21pYyhwYWdlLCBLTV9JUlEwKTsKIAogCQkvKiBkbyB0aGUgYWN0dWFsIGRhdGEgdHJhbnNmZXIgKi8KLQkJY29uc3VtZWQgPSBhcC0+b3BzLT5zZmZfZGF0YV94ZmVyKGRldiwgIGJ1ZiArIG9mZnNldCwgY291bnQsIHJ3KTsKKwkJY29uc3VtZWQgPSBhcC0+b3BzLT5zZmZfZGF0YV94ZmVyKGRldiwgIGJ1ZiArIG9mZnNldCwKKwkJCQkJCQkJY291bnQsIHJ3KTsKIAogCQlrdW5tYXBfYXRvbWljKGJ1ZiwgS01fSVJRMCk7CiAJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIAl9IGVsc2UgewogCQlidWYgPSBwYWdlX2FkZHJlc3MocGFnZSk7Ci0JCWNvbnN1bWVkID0gYXAtPm9wcy0+c2ZmX2RhdGFfeGZlcihkZXYsICBidWYgKyBvZmZzZXQsIGNvdW50LCBydyk7CisJCWNvbnN1bWVkID0gYXAtPm9wcy0+c2ZmX2RhdGFfeGZlcihkZXYsICBidWYgKyBvZmZzZXQsCisJCQkJCQkJCWNvdW50LCBydyk7CiAJfQogCiAJYnl0ZXMgLT0gbWluKGJ5dGVzLCBjb25zdW1lZCk7CkBAIC0xMDEzLDE4ICsxMDg2LDE5IEBACiAgKglSRVRVUk5TOgogICoJMSBpZiBvayBpbiB3b3JrcXVldWUsIDAgb3RoZXJ3aXNlLgogICovCi1zdGF0aWMgaW5saW5lIGludCBhdGFfaHNtX29rX2luX3dxKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMpCitzdGF0aWMgaW5saW5lIGludCBhdGFfaHNtX29rX2luX3dxKHN0cnVjdCBhdGFfcG9ydCAqYXAsCisJCQkJCQlzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjKQogewogCWlmIChxYy0+dGYuZmxhZ3MgJiBBVEFfVEZMQUdfUE9MTElORykKIAkJcmV0dXJuIDE7CiAKIAlpZiAoYXAtPmhzbV90YXNrX3N0YXRlID09IEhTTV9TVF9GSVJTVCkgewogCQlpZiAocWMtPnRmLnByb3RvY29sID09IEFUQV9QUk9UX1BJTyAmJgotCQkgICAgKHFjLT50Zi5mbGFncyAmIEFUQV9URkxBR19XUklURSkpCisJCSAgIChxYy0+dGYuZmxhZ3MgJiBBVEFfVEZMQUdfV1JJVEUpKQogCQkgICAgcmV0dXJuIDE7CiAKIAkJaWYgKGF0YV9pc19hdGFwaShxYy0+dGYucHJvdG9jb2wpICYmCi0JCSAgICAhKHFjLT5kZXYtPmZsYWdzICYgQVRBX0RGTEFHX0NEQl9JTlRSKSkKKwkJICAgIShxYy0+ZGV2LT5mbGFncyAmIEFUQV9ERkxBR19DREJfSU5UUikpCiAJCQlyZXR1cm4gMTsKIAl9CiAKQEAgLTEzMzgsNiArMTQxMiw3IEBACiAKIAlyZXR1cm4gcG9sbF9uZXh0OwogfQorRVhQT1JUX1NZTUJPTF9HUEwoYXRhX3NmZl9oc21fbW92ZSk7CiAKIHZvaWQgYXRhX3Bpb190YXNrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKQEAgLTE1MDcsNiArMTU4Miw3IEBACiAKIAlyZXR1cm4gMDsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKGF0YV9zZmZfcWNfaXNzdWUpOwogCiAvKioKICAqCWF0YV9zZmZfcWNfZmlsbF9ydGYgLSBmaWxsIHJlc3VsdCBURiB1c2luZyAtPnNmZl90Zl9yZWFkCkBAIC0xNTI2LDYgKzE2MDIsNyBAQAogCXFjLT5hcC0+b3BzLT5zZmZfdGZfcmVhZChxYy0+YXAsICZxYy0+cmVzdWx0X3RmKTsKIAlyZXR1cm4gdHJ1ZTsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKGF0YV9zZmZfcWNfZmlsbF9ydGYpOwogCiAvKioKICAqCWF0YV9zZmZfaG9zdF9pbnRyIC0gSGFuZGxlIGhvc3QgaW50ZXJydXB0IGZvciBnaXZlbiAocG9ydCwgdGFzaykKQEAgLTE2MjMsNiArMTcwMCw3IEBACiAjZW5kaWYKIAlyZXR1cm4gMDsJLyogaXJxIG5vdCBoYW5kbGVkICovCiB9CitFWFBPUlRfU1lNQk9MX0dQTChhdGFfc2ZmX2hvc3RfaW50cik7CiAKIC8qKgogICoJYXRhX3NmZl9pbnRlcnJ1cHQgLSBEZWZhdWx0IEFUQSBob3N0IGludGVycnVwdCBoYW5kbGVyCkBAIC0xNjY3LDYgKzE3NDUsNyBAQAogCiAJcmV0dXJuIElSUV9SRVRWQUwoaGFuZGxlZCk7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChhdGFfc2ZmX2ludGVycnVwdCk7CiAKIC8qKgogICoJYXRhX3NmZl9mcmVlemUgLSBGcmVlemUgU0ZGIGNvbnRyb2xsZXIgcG9ydApAQCAtMTY5NSw2ICsxNzc0LDcgQEAKIAogCWFwLT5vcHMtPnNmZl9pcnFfY2xlYXIoYXApOwogfQorRVhQT1JUX1NZTUJPTF9HUEwoYXRhX3NmZl9mcmVlemUpOwogCiAvKioKICAqCWF0YV9zZmZfdGhhdyAtIFRoYXcgU0ZGIGNvbnRyb2xsZXIgcG9ydApAQCAtMTcxMiw2ICsxNzkyLDcgQEAKIAlhcC0+b3BzLT5zZmZfaXJxX2NsZWFyKGFwKTsKIAlhcC0+b3BzLT5zZmZfaXJxX29uKGFwKTsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKGF0YV9zZmZfdGhhdyk7CiAKIC8qKgogICoJYXRhX3NmZl9wcmVyZXNldCAtIHByZXBhcmUgU0ZGIGxpbmsgZm9yIHJlc2V0CkBAIC0xNzUzLDYgKzE4MzQsNyBAQAogCiAJcmV0dXJuIDA7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChhdGFfc2ZmX3ByZXJlc2V0KTsKIAogLyoqCiAgKglhdGFfZGV2Y2hrIC0gUEFUQSBkZXZpY2UgcHJlc2VuY2UgZGV0ZWN0aW9uCkBAIC0xODY1LDYgKzE5NDcsNyBAQAogCiAJcmV0dXJuIGNsYXNzOwogfQorRVhQT1JUX1NZTUJPTF9HUEwoYXRhX3NmZl9kZXZfY2xhc3NpZnkpOwogCiAvKioKICAqCWF0YV9zZmZfd2FpdF9hZnRlcl9yZXNldCAtIHdhaXQgZm9yIGRldmljZXMgdG8gYmVjb21lIHJlYWR5IGFmdGVyIHJlc2V0CkBAIC0xOTQxLDYgKzIwMjQsNyBAQAogCiAJcmV0dXJuIHJldDsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKGF0YV9zZmZfd2FpdF9hZnRlcl9yZXNldCk7CiAKIHN0YXRpYyBpbnQgYXRhX2J1c19zb2Z0cmVzZXQoc3RydWN0IGF0YV9wb3J0ICphcCwgdW5zaWduZWQgaW50IGRldm1hc2ssCiAJCQkgICAgIHVuc2lnbmVkIGxvbmcgZGVhZGxpbmUpCkBAIC0yMDEzLDYgKzIwOTcsNyBAQAogCURQUklOVEsoIkVYSVQsIGNsYXNzZXNbMF09JXUgWzFdPSV1XG4iLCBjbGFzc2VzWzBdLCBjbGFzc2VzWzFdKTsKIAlyZXR1cm4gMDsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKGF0YV9zZmZfc29mdHJlc2V0KTsKIAogLyoqCiAgKglzYXRhX3NmZl9oYXJkcmVzZXQgLSByZXNldCBob3N0IHBvcnQgdmlhIFNBVEEgcGh5IHJlc2V0CkBAIC0yMDQ1LDYgKzIxMzAsNyBAQAogCURQUklOVEsoIkVYSVQsIGNsYXNzPSV1XG4iLCAqY2xhc3MpOwogCXJldHVybiByYzsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKHNhdGFfc2ZmX2hhcmRyZXNldCk7CiAKIC8qKgogICoJYXRhX3NmZl9wb3N0cmVzZXQgLSBTRkYgcG9zdHJlc2V0IGNhbGxiYWNrCkBAIC0yMDgwLDYgKzIxNjYsNyBAQAogCWlmIChhcC0+aW9hZGRyLmN0bF9hZGRyKQogCQlpb3dyaXRlOChhcC0+Y3RsLCBhcC0+aW9hZGRyLmN0bF9hZGRyKTsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKGF0YV9zZmZfcG9zdHJlc2V0KTsKIAogLyoqCiAgKglhdGFfc2ZmX2Vycm9yX2hhbmRsZXIgLSBTdG9jayBlcnJvciBoYW5kbGVyIGZvciBCTURNQSBjb250cm9sbGVyCkBAIC0yMTUyLDYgKzIyMzksNyBAQAogCWF0YV9kb19laChhcCwgYXAtPm9wcy0+cHJlcmVzZXQsIHNvZnRyZXNldCwgaGFyZHJlc2V0LAogCQkgIGFwLT5vcHMtPnBvc3RyZXNldCk7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChhdGFfc2ZmX2Vycm9yX2hhbmRsZXIpOwogCiAvKioKICAqCWF0YV9zZmZfcG9zdF9pbnRlcm5hbF9jbWQgLSBTdG9jayBwb3N0X2ludGVybmFsX2NtZCBmb3IgU0ZGIGNvbnRyb2xsZXIKQEAgLTIxNzQsNiArMjI2Miw3IEBACiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKGFwLT5sb2NrLCBmbGFncyk7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChhdGFfc2ZmX3Bvc3RfaW50ZXJuYWxfY21kKTsKIAogLyoqCiAgKglhdGFfc2ZmX3BvcnRfc3RhcnQgLSBTZXQgcG9ydCB1cCBmb3IgZG1hLgpAQCAtMjE5NCw2ICsyMjgzLDcgQEAKIAkJcmV0dXJuIGF0YV9wb3J0X3N0YXJ0KGFwKTsKIAlyZXR1cm4gMDsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKGF0YV9zZmZfcG9ydF9zdGFydCk7CiAKIC8qKgogICoJYXRhX3NmZl9zdGRfcG9ydHMgLSBpbml0aWFsaXplIGlvYWRkciB3aXRoIHN0YW5kYXJkIHBvcnQgb2Zmc2V0cy4KQEAgLTIyMTksNiArMjMwOSw3IEBACiAJaW9hZGRyLT5zdGF0dXNfYWRkciA9IGlvYWRkci0+Y21kX2FkZHIgKyBBVEFfUkVHX1NUQVRVUzsKIAlpb2FkZHItPmNvbW1hbmRfYWRkciA9IGlvYWRkci0+Y21kX2FkZHIgKyBBVEFfUkVHX0NNRDsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKGF0YV9zZmZfc3RkX3BvcnRzKTsKIAogdW5zaWduZWQgbG9uZyBhdGFfYm1kbWFfbW9kZV9maWx0ZXIoc3RydWN0IGF0YV9kZXZpY2UgKmFkZXYsCiAJCQkJICAgIHVuc2lnbmVkIGxvbmcgeGZlcl9tYXNrKQpAQCAtMjIzMCw2ICsyMzIxLDcgQEAKIAkJeGZlcl9tYXNrICY9IH4oQVRBX01BU0tfTVdETUEgfCBBVEFfTUFTS19VRE1BKTsKIAlyZXR1cm4geGZlcl9tYXNrOwogfQorRVhQT1JUX1NZTUJPTF9HUEwoYXRhX2JtZG1hX21vZGVfZmlsdGVyKTsKIAogLyoqCiAgKglhdGFfYm1kbWFfc2V0dXAgLSBTZXQgdXAgUENJIElERSBCTURNQSB0cmFuc2FjdGlvbgpAQCAtMjI1OCw2ICsyMzUwLDcgQEAKIAkvKiBpc3N1ZSByL3cgY29tbWFuZCAqLwogCWFwLT5vcHMtPnNmZl9leGVjX2NvbW1hbmQoYXAsICZxYy0+dGYpOwogfQorRVhQT1JUX1NZTUJPTF9HUEwoYXRhX2JtZG1hX3NldHVwKTsKIAogLyoqCiAgKglhdGFfYm1kbWFfc3RhcnQgLSBTdGFydCBhIFBDSSBJREUgQk1ETUEgdHJhbnNhY3Rpb24KQEAgLTIyOTAsNiArMjM4Myw3IEBACiAJICogdW5uZWNjZXNzYXJpbHkgZGVsYXllZCBmb3IgTU1JTwogCSAqLwogfQorRVhQT1JUX1NZTUJPTF9HUEwoYXRhX2JtZG1hX3N0YXJ0KTsKIAogLyoqCiAgKglhdGFfYm1kbWFfc3RvcCAtIFN0b3AgUENJIElERSBCTURNQSB0cmFuc2ZlcgpAQCAtMjMxNCw2ICsyNDA4LDcgQEAKIAkvKiBvbmUtUElPLWN5Y2xlIGd1YXJhbnRlZWQgd2FpdCwgcGVyIHNwZWMsIGZvciBIRE1BMTowIHRyYW5zaXRpb24gKi8KIAlhdGFfc2ZmX2RtYV9wYXVzZShhcCk7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChhdGFfYm1kbWFfc3RvcCk7CiAKIC8qKgogICoJYXRhX2JtZG1hX3N0YXR1cyAtIFJlYWQgUENJIElERSBCTURNQSBzdGF0dXMKQEAgLTIzMzAsNiArMjQyNSw3IEBACiB7CiAJcmV0dXJuIGlvcmVhZDgoYXAtPmlvYWRkci5ibWRtYV9hZGRyICsgQVRBX0RNQV9TVEFUVVMpOwogfQorRVhQT1JUX1NZTUJPTF9HUEwoYXRhX2JtZG1hX3N0YXR1cyk7CiAKIC8qKgogICoJYXRhX2J1c19yZXNldCAtIHJlc2V0IGhvc3QgcG9ydCBhbmQgYXNzb2NpYXRlZCBBVEEgY2hhbm5lbApAQCAtMjQyMiw2ICsyNTE4LDcgQEAKIAogCURQUklOVEsoIkVYSVRcbiIpOwogfQorRVhQT1JUX1NZTUJPTF9HUEwoYXRhX2J1c19yZXNldCk7CiAKICNpZmRlZiBDT05GSUdfUENJCiAKQEAgLTI0NDksNiArMjU0Niw3IEBACiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIAlyZXR1cm4gMDsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKGF0YV9wY2lfYm1kbWFfY2xlYXJfc2ltcGxleCk7CiAKIC8qKgogICoJYXRhX3BjaV9ibWRtYV9pbml0IC0gYWNxdWlyZSBQQ0kgQk1ETUEgcmVzb3VyY2VzIGFuZCBpbml0IEFUQSBob3N0CkBAIC0yNTAxLDExICsyNTk5LDEyIEBACiAJCQlob3N0LT5mbGFncyB8PSBBVEFfSE9TVF9TSU1QTEVYOwogCiAJCWF0YV9wb3J0X2Rlc2MoYXAsICJibWRtYSAweCVsbHgiLAotCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgNCkgKyA4ICogaSk7CisJCSAgICAodW5zaWduZWQgbG9uZyBsb25nKXBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCA0KSArIDggKiBpKTsKIAl9CiAKIAlyZXR1cm4gMDsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKGF0YV9wY2lfYm1kbWFfaW5pdCk7CiAKIHN0YXRpYyBpbnQgYXRhX3Jlc291cmNlc19wcmVzZW50KHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBpbnQgcG9ydCkKIHsKQEAgLTI1MTMsNyArMjYxMiw3IEBACiAKIAkvKiBDaGVjayB0aGUgUENJIHJlc291cmNlcyBmb3IgdGhpcyBjaGFubmVsIGFyZSBlbmFibGVkICovCiAJcG9ydCA9IHBvcnQgKiAyOwotCWZvciAoaSA9IDA7IGkgPCAyOyBpICsrKSB7CisJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgewogCQlpZiAocGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIHBvcnQgKyBpKSA9PSAwIHx8CiAJCSAgICBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIHBvcnQgKyBpKSA9PSAwKQogCQkJcmV0dXJuIDA7CkBAIC0yNTk4LDYgKzI2OTcsNyBAQAogCiAJcmV0dXJuIDA7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChhdGFfcGNpX3NmZl9pbml0X2hvc3QpOwogCiAvKioKICAqCWF0YV9wY2lfc2ZmX3ByZXBhcmVfaG9zdCAtIGhlbHBlciB0byBwcmVwYXJlIG5hdGl2ZSBQQ0kgQVRBIGhvc3QKQEAgLTI2MTUsNyArMjcxNSw3IEBACiAgKgkwIG9uIHN1Y2Nlc3MsIC1lcnJubyBvdGhlcndpc2UuCiAgKi8KIGludCBhdGFfcGNpX3NmZl9wcmVwYXJlX2hvc3Qoc3RydWN0IHBjaV9kZXYgKnBkZXYsCi0JCQkgICAgIGNvbnN0IHN0cnVjdCBhdGFfcG9ydF9pbmZvICogY29uc3QgKiBwcGksCisJCQkgICAgIGNvbnN0IHN0cnVjdCBhdGFfcG9ydF9pbmZvICogY29uc3QgKnBwaSwKIAkJCSAgICAgc3RydWN0IGF0YV9ob3N0ICoqcl9ob3N0KQogewogCXN0cnVjdCBhdGFfaG9zdCAqaG9zdDsKQEAgLTI2NDUsMTcgKzI3NDUsMTggQEAKIAkqcl9ob3N0ID0gaG9zdDsKIAlyZXR1cm4gMDsKIAotIGVycl9ibWRtYToKK2Vycl9ibWRtYToKIAkvKiBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIFBDSSBhbmQgaW9tYXAgcmVzb3VyY2VzIGFyZQogCSAqIG1lcmdlZCBhbmQgcmVsZWFzaW5nIHRoZSB0b3AgZ3JvdXAgd29uJ3QgcmVsZWFzZSB0aGUKIAkgKiBhY3F1aXJlZCByZXNvdXJjZXMgaWYgc29tZSBvZiB0aG9zZSBoYXZlIGJlZW4gYWNxdWlyZWQKIAkgKiBiZWZvcmUgZW50ZXJpbmcgdGhpcyBmdW5jdGlvbi4KIAkgKi8KIAlwY2ltX2lvdW5tYXBfcmVnaW9ucyhwZGV2LCAweGYpOwotIGVycl9vdXQ6CitlcnJfb3V0OgogCWRldnJlc19yZWxlYXNlX2dyb3VwKCZwZGV2LT5kZXYsIE5VTEwpOwogCXJldHVybiByYzsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKGF0YV9wY2lfc2ZmX3ByZXBhcmVfaG9zdCk7CiAKIC8qKgogICoJYXRhX3BjaV9zZmZfYWN0aXZhdGVfaG9zdCAtIHN0YXJ0IFNGRiBob3N0LCByZXF1ZXN0IElSUSBhbmQgcmVnaXN0ZXIgaXQKQEAgLTI3NDEsNyArMjg0Miw3IEBACiAJfQogCiAJcmMgPSBhdGFfaG9zdF9yZWdpc3Rlcihob3N0LCBzaHQpOwotIG91dDoKK291dDoKIAlpZiAocmMgPT0gMCkKIAkJZGV2cmVzX3JlbW92ZV9ncm91cChkZXYsIE5VTEwpOwogCWVsc2UKQEAgLTI3NDksNiArMjg1MCw3IEBACiAKIAlyZXR1cm4gcmM7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChhdGFfcGNpX3NmZl9hY3RpdmF0ZV9ob3N0KTsKIAogLyoqCiAgKglhdGFfcGNpX3NmZl9pbml0X29uZSAtIEluaXRpYWxpemUvcmVnaXN0ZXIgUENJIElERSBob3N0IGNvbnRyb2xsZXIKQEAgLTI3NzYsNyArMjg3OCw3IEBACiAgKglaZXJvIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIG9uIGVycm5vLWJhc2VkIHZhbHVlIG9uIGVycm9yLgogICovCiBpbnQgYXRhX3BjaV9zZmZfaW5pdF9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCi0JCQkgY29uc3Qgc3RydWN0IGF0YV9wb3J0X2luZm8gKiBjb25zdCAqIHBwaSwKKwkJCSBjb25zdCBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyAqIGNvbnN0ICpwcGksCiAJCQkgc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSAqc2h0LCB2b2lkICpob3N0X3ByaXYpCiB7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKQEAgLTI4MTUsNyArMjkxNyw3IEBACiAKIAlwY2lfc2V0X21hc3RlcihwZGV2KTsKIAlyYyA9IGF0YV9wY2lfc2ZmX2FjdGl2YXRlX2hvc3QoaG9zdCwgYXRhX3NmZl9pbnRlcnJ1cHQsIHNodCk7Ci0gb3V0Ogorb3V0OgogCWlmIChyYyA9PSAwKQogCQlkZXZyZXNfcmVtb3ZlX2dyb3VwKCZwZGV2LT5kZXYsIE5VTEwpOwogCWVsc2UKQEAgLTI4MjMsNTQgKzI5MjUsNyBAQAogCiAJcmV0dXJuIHJjOwogfQotCi0jZW5kaWYgLyogQ09ORklHX1BDSSAqLwotCi1FWFBPUlRfU1lNQk9MX0dQTChhdGFfc2ZmX3BvcnRfb3BzKTsKLUVYUE9SVF9TWU1CT0xfR1BMKGF0YV9ibWRtYV9wb3J0X29wcyk7Ci1FWFBPUlRfU1lNQk9MX0dQTChhdGFfc2ZmX3FjX3ByZXApOwotRVhQT1JUX1NZTUJPTF9HUEwoYXRhX3NmZl9kdW1iX3FjX3ByZXApOwotRVhQT1JUX1NZTUJPTF9HUEwoYXRhX3NmZl9kZXZfc2VsZWN0KTsKLUVYUE9SVF9TWU1CT0xfR1BMKGF0YV9zZmZfY2hlY2tfc3RhdHVzKTsKLUVYUE9SVF9TWU1CT0xfR1BMKGF0YV9zZmZfZG1hX3BhdXNlKTsKLUVYUE9SVF9TWU1CT0xfR1BMKGF0YV9zZmZfcGF1c2UpOwotRVhQT1JUX1NZTUJPTF9HUEwoYXRhX3NmZl9idXN5X3NsZWVwKTsKLUVYUE9SVF9TWU1CT0xfR1BMKGF0YV9zZmZfd2FpdF9yZWFkeSk7Ci1FWFBPUlRfU1lNQk9MX0dQTChhdGFfc2ZmX3RmX2xvYWQpOwotRVhQT1JUX1NZTUJPTF9HUEwoYXRhX3NmZl90Zl9yZWFkKTsKLUVYUE9SVF9TWU1CT0xfR1BMKGF0YV9zZmZfZXhlY19jb21tYW5kKTsKLUVYUE9SVF9TWU1CT0xfR1BMKGF0YV9zZmZfZGF0YV94ZmVyKTsKLUVYUE9SVF9TWU1CT0xfR1BMKGF0YV9zZmZfZGF0YV94ZmVyX25vaXJxKTsKLUVYUE9SVF9TWU1CT0xfR1BMKGF0YV9zZmZfaXJxX29uKTsKLUVYUE9SVF9TWU1CT0xfR1BMKGF0YV9zZmZfaXJxX2NsZWFyKTsKLUVYUE9SVF9TWU1CT0xfR1BMKGF0YV9zZmZfaHNtX21vdmUpOwotRVhQT1JUX1NZTUJPTF9HUEwoYXRhX3NmZl9xY19pc3N1ZSk7Ci1FWFBPUlRfU1lNQk9MX0dQTChhdGFfc2ZmX3FjX2ZpbGxfcnRmKTsKLUVYUE9SVF9TWU1CT0xfR1BMKGF0YV9zZmZfaG9zdF9pbnRyKTsKLUVYUE9SVF9TWU1CT0xfR1BMKGF0YV9zZmZfaW50ZXJydXB0KTsKLUVYUE9SVF9TWU1CT0xfR1BMKGF0YV9zZmZfZnJlZXplKTsKLUVYUE9SVF9TWU1CT0xfR1BMKGF0YV9zZmZfdGhhdyk7Ci1FWFBPUlRfU1lNQk9MX0dQTChhdGFfc2ZmX3ByZXJlc2V0KTsKLUVYUE9SVF9TWU1CT0xfR1BMKGF0YV9zZmZfZGV2X2NsYXNzaWZ5KTsKLUVYUE9SVF9TWU1CT0xfR1BMKGF0YV9zZmZfd2FpdF9hZnRlcl9yZXNldCk7Ci1FWFBPUlRfU1lNQk9MX0dQTChhdGFfc2ZmX3NvZnRyZXNldCk7Ci1FWFBPUlRfU1lNQk9MX0dQTChzYXRhX3NmZl9oYXJkcmVzZXQpOwotRVhQT1JUX1NZTUJPTF9HUEwoYXRhX3NmZl9wb3N0cmVzZXQpOwotRVhQT1JUX1NZTUJPTF9HUEwoYXRhX3NmZl9lcnJvcl9oYW5kbGVyKTsKLUVYUE9SVF9TWU1CT0xfR1BMKGF0YV9zZmZfcG9zdF9pbnRlcm5hbF9jbWQpOwotRVhQT1JUX1NZTUJPTF9HUEwoYXRhX3NmZl9wb3J0X3N0YXJ0KTsKLUVYUE9SVF9TWU1CT0xfR1BMKGF0YV9zZmZfc3RkX3BvcnRzKTsKLUVYUE9SVF9TWU1CT0xfR1BMKGF0YV9ibWRtYV9tb2RlX2ZpbHRlcik7Ci1FWFBPUlRfU1lNQk9MX0dQTChhdGFfYm1kbWFfc2V0dXApOwotRVhQT1JUX1NZTUJPTF9HUEwoYXRhX2JtZG1hX3N0YXJ0KTsKLUVYUE9SVF9TWU1CT0xfR1BMKGF0YV9ibWRtYV9zdG9wKTsKLUVYUE9SVF9TWU1CT0xfR1BMKGF0YV9ibWRtYV9zdGF0dXMpOwotRVhQT1JUX1NZTUJPTF9HUEwoYXRhX2J1c19yZXNldCk7Ci0jaWZkZWYgQ09ORklHX1BDSQotRVhQT1JUX1NZTUJPTF9HUEwoYXRhX3BjaV9ibWRtYV9jbGVhcl9zaW1wbGV4KTsKLUVYUE9SVF9TWU1CT0xfR1BMKGF0YV9wY2lfYm1kbWFfaW5pdCk7Ci1FWFBPUlRfU1lNQk9MX0dQTChhdGFfcGNpX3NmZl9pbml0X2hvc3QpOwotRVhQT1JUX1NZTUJPTF9HUEwoYXRhX3BjaV9zZmZfcHJlcGFyZV9ob3N0KTsKLUVYUE9SVF9TWU1CT0xfR1BMKGF0YV9wY2lfc2ZmX2FjdGl2YXRlX2hvc3QpOwogRVhQT1JUX1NZTUJPTF9HUEwoYXRhX3BjaV9zZmZfaW5pdF9vbmUpOworCiAjZW5kaWYgLyogQ09ORklHX1BDSSAqLworCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX2FsaS5jIGIvZHJpdmVycy9hdGEvcGF0YV9hbGkuYwppbmRleCA3M2M0NjZlLi5hNzk5OWMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX2FsaS5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfYWxpLmMKQEAgLTE5LDcgKzE5LDkgQEAKICAqCiAgKiAgVE9ETy9DSEVDSwogICoJQ2Fubm90IGhhdmUgQVRBUEkgb24gYm90aCBtYXN0ZXIgJiBzbGF2ZSBmb3IgcmV2IDwgYzIgKD8/PykgYnV0Ci0gKglvdGhlcndpc2Ugc2hvdWxkIGRvIGF0YXBpIERNQS4KKyAqCW90aGVyd2lzZSBzaG91bGQgZG8gYXRhcGkgRE1BIChGb3Igbm93IGZvciBvbGQgd2UgZG8gUElPIG9ubHkgZm9yCisgKglBVEFQSSkKKyAqCVJldmlldyBTdW5ibGFkZSB3b3JrYXJvdW5kLgogICovCiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KQEAgLTMzLDEyICszNSwxNCBAQAogI2luY2x1ZGUgPGxpbnV4L2RtaS5oPgogCiAjZGVmaW5lIERSVl9OQU1FICJwYXRhX2FsaSIKLSNkZWZpbmUgRFJWX1ZFUlNJT04gIjAuNy41IgorI2RlZmluZSBEUlZfVkVSU0lPTiAiMC43LjgiCiAKIHN0YXRpYyBpbnQgYWxpX2F0YXBpX2RtYSA9IDA7CiBtb2R1bGVfcGFyYW1fbmFtZWQoYXRhcGlfZG1hLCBhbGlfYXRhcGlfZG1hLCBpbnQsIDA2NDQpOwogTU9EVUxFX1BBUk1fREVTQyhhdGFwaV9kbWEsICJFbmFibGUgQVRBUEkgRE1BICgwPWRpc2FibGUsIDE9ZW5hYmxlKSIpOwogCitzdGF0aWMgc3RydWN0IHBjaV9kZXYgKmlzYV9icmlkZ2U7CisKIC8qCiAgKglDYWJsZSBzcGVjaWFsIGNhc2VzCiAgKi8KQEAgLTE0Nyw4ICsxNTEsNyBAQAogCiAJcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgcGlvX2ZpZm8sICZmaWZvKTsKIAlmaWZvICY9IH4oMHgwRiA8PCBzaGlmdCk7Ci0JaWYgKG9uKQotCQlmaWZvIHw9IChvbiA8PCBzaGlmdCk7CisJZmlmbyB8PSAob24gPDwgc2hpZnQpOwogCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCBwaW9fZmlmbywgZmlmbyk7CiB9CiAKQEAgLTMzNyw2ICszNDAsMjMgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHZvaWQgYWxpX2MyX2MzX3Bvc3RyZXNldChzdHJ1Y3QgYXRhX2xpbmsgKmxpbmssIHVuc2lnbmVkIGludCAqY2xhc3NlcykKK3sKKwl1OCByOworCWludCBwb3J0X2JpdCA9IDQgPDwgbGluay0+YXAtPnBvcnRfbm87CisKKwkvKiBJZiBvdXIgYnJpZGdlIGlzIGFuIEFMSSAxNTMzIHRoZW4gZG8gdGhlIGV4dHJhIHdvcmsgKi8KKwlpZiAoaXNhX2JyaWRnZSkgeworCQkvKiBUcmlzdGF0ZSBhbmQgcmUtZW5hYmxlIHRoZSBidXMgc2lnbmFscyAqLworCQlwY2lfcmVhZF9jb25maWdfYnl0ZShpc2FfYnJpZGdlLCAweDU4LCAmcik7CisJCXIgJj0gfnBvcnRfYml0OworCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoaXNhX2JyaWRnZSwgMHg1OCwgcik7CisJCXIgfD0gcG9ydF9iaXQ7CisJCXBjaV93cml0ZV9jb25maWdfYnl0ZShpc2FfYnJpZGdlLCAweDU4LCByKTsKKwl9CisJYXRhX3NmZl9wb3N0cmVzZXQobGluaywgY2xhc3Nlcyk7Cit9CisKIHN0YXRpYyBzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlIGFsaV9zaHQgPSB7CiAJQVRBX0JNRE1BX1NIVChEUlZfTkFNRSksCiB9OwpAQCAtMzQ5LDEwICszNjksMTEgQEAKIAkuaW5oZXJpdHMJPSAmYXRhX3NmZl9wb3J0X29wcywKIAkuY2FibGVfZGV0ZWN0CT0gYXRhX2NhYmxlXzQwd2lyZSwKIAkuc2V0X3Bpb21vZGUJPSBhbGlfc2V0X3Bpb21vZGUsCisJLnNmZl9kYXRhX3hmZXIgID0gYXRhX3NmZl9kYXRhX3hmZXIzMiwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYXRhX3BvcnRfb3BlcmF0aW9ucyBhbGlfZG1hX2Jhc2Vfb3BzID0gewotCS5pbmhlcml0cwk9ICZhdGFfYm1kbWFfcG9ydF9vcHMsCisJLmluaGVyaXRzCT0gJmF0YV9ibWRtYTMyX3BvcnRfb3BzLAogCS5zZXRfcGlvbW9kZQk9IGFsaV9zZXRfcGlvbW9kZSwKIAkuc2V0X2RtYW1vZGUJPSBhbGlfc2V0X2RtYW1vZGUsCiB9OwpAQCAtMzc3LDYgKzM5OCwxNyBAQAogCS5jaGVja19hdGFwaV9kbWEgPSBhbGlfY2hlY2tfYXRhcGlfZG1hLAogCS5jYWJsZV9kZXRlY3QJPSBhbGlfYzJfY2FibGVfZGV0ZWN0LAogCS5kZXZfY29uZmlnCT0gYWxpX2xvY2tfc2VjdG9ycywKKwkucG9zdHJlc2V0CT0gYWxpX2MyX2MzX3Bvc3RyZXNldCwKK307CisKKy8qCisgKglQb3J0IG9wZXJhdGlvbnMgZm9yIERNQSBjYXBhYmxlIEFMaSB3aXRoIGNhYmxlIGRldGVjdAorICovCitzdGF0aWMgc3RydWN0IGF0YV9wb3J0X29wZXJhdGlvbnMgYWxpX2M0X3BvcnRfb3BzID0geworCS5pbmhlcml0cwk9ICZhbGlfZG1hX2Jhc2Vfb3BzLAorCS5jaGVja19hdGFwaV9kbWEgPSBhbGlfY2hlY2tfYXRhcGlfZG1hLAorCS5jYWJsZV9kZXRlY3QJPSBhbGlfYzJfY2FibGVfZGV0ZWN0LAorCS5kZXZfY29uZmlnCT0gYWxpX2xvY2tfc2VjdG9ycywKIH07CiAKIC8qCkBAIC00MDEsMjcgKzQzMyw0MCBAQAogc3RhdGljIHZvaWQgYWxpX2luaXRfY2hpcHNldChzdHJ1Y3QgcGNpX2RldiAqcGRldikKIHsKIAl1OCB0bXA7Ci0Jc3RydWN0IHBjaV9kZXYgKm5vcnRoLCAqaXNhX2JyaWRnZTsKKwlzdHJ1Y3QgcGNpX2RldiAqbm9ydGg7CiAKIAkvKgogCSAqIFRoZSBjaGlwc2V0IHJldmlzaW9uIHNlbGVjdHMgdGhlIGRyaXZlciBvcGVyYXRpb25zIGFuZAogCSAqIG1vZGUgZGF0YS4KIAkgKi8KIAotCWlmIChwZGV2LT5yZXZpc2lvbiA+PSAweDIwICYmIHBkZXYtPnJldmlzaW9uIDwgMHhDMikgewotCQkvKiAxNTQzLUUvRiwgMTU0M0MtQywgMTU0M0MtRCwgMTU0M0MtRSAqLworCWlmIChwZGV2LT5yZXZpc2lvbiA8PSAweDIwKSB7CisJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIDB4NTMsICZ0bXApOworCQl0bXAgfD0gMHgwMzsKKwkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIDB4NTMsIHRtcCk7CisJfSBlbHNlIHsKKwkJcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgMHg0YSwgJnRtcCk7CisJCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCAweDRhLCB0bXAgfCAweDIwKTsKIAkJcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgMHg0QiwgJnRtcCk7Ci0JCS8qIENsZWFyIENELVJPTSBETUEgd3JpdGUgYml0ICovCi0JCXRtcCAmPSAweDdGOwotCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgMHg0QiwgdG1wKTsKLQl9IGVsc2UgaWYgKHBkZXYtPnJldmlzaW9uID49IDB4QzIpIHsKLQkJLyogRW5hYmxlIGNhYmxlIGRldGVjdGlvbiBsb2dpYyAqLwotCQlwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCAweDRCLCAmdG1wKTsKLQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIDB4NEIsIHRtcCB8IDB4MDgpOworCQlpZiAocGRldi0+cmV2aXNpb24gPCAweEMyKQorCQkJLyogMTU0My1FL0YsIDE1NDNDLUMsIDE1NDNDLUQsIDE1NDNDLUUgKi8KKwkJCS8qIENsZWFyIENELVJPTSBETUEgd3JpdGUgYml0ICovCisJCQl0bXAgJj0gMHg3RjsKKwkJLyogQ2FibGUgYW5kIFVETUEgKi8KKwkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIDB4NEIsIHRtcCB8IDB4MDkpOworCQkvKgorCQkgKiBDRF9ST00gRE1BIG9uICgweDUzIGJpdCAwKS4gRW5hYmxlIHRoaXMgZXZlbiBpZiB3ZSB3YW50CisJCSAqIHRvIHVzZSBQSU8uIDB4NTMgYml0IDEgKHJldiAyMCBvbmx5KSAtIGVuYWJsZSBGSUZPIGNvbnRyb2wKKwkJICogdmlhIDB4NTQvNTUuCisJCSAqLworCQlwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCAweDUzLCAmdG1wKTsKKwkJaWYgKHBkZXYtPnJldmlzaW9uID49IDB4YzcpCisJCQl0bXAgfD0gMHgwMzsKKwkJZWxzZQorCQkJdG1wIHw9IDB4MDE7CS8qIENEX1JPTSBlbmFibGUgZm9yIERNQSAqLworCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgMHg1MywgdG1wKTsKIAl9CiAJbm9ydGggPSBwY2lfZ2V0X2J1c19hbmRfc2xvdCgwLCBQQ0lfREVWRk4oMCwwKSk7Ci0JaXNhX2JyaWRnZSA9IHBjaV9nZXRfZGV2aWNlKFBDSV9WRU5ET1JfSURfQUwsIFBDSV9ERVZJQ0VfSURfQUxfTTE1MzMsIE5VTEwpOwotCiAJaWYgKG5vcnRoICYmIG5vcnRoLT52ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRF9BTCAmJiBpc2FfYnJpZGdlKSB7CiAJCS8qIENvbmZpZ3VyZSB0aGUgQUxpIGJyaWRnZSBsb2dpYy4gRm9yIG5vbiBBTGkgcmVseSBvbiBCSU9TLgogCQkgICBTZXQgdGhlIHNvdXRoIGJyaWRnZSBlbmFibGUgYml0ICovCkBAIC00MzEsMjIgKzQ3Niw2IEBACiAJCWVsc2UgaWYgKHBkZXYtPnJldmlzaW9uID4gMHhDMiAmJiBwZGV2LT5yZXZpc2lvbiA8IDB4QzUpCiAJCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoaXNhX2JyaWRnZSwgMHg3OSwgdG1wIHwgMHgwMik7CiAJfQotCWlmIChwZGV2LT5yZXZpc2lvbiA+PSAweDIwKSB7Ci0JCS8qCi0JCSAqIENEX1JPTSBETUEgb24gKDB4NTMgYml0IDApLiBFbmFibGUgdGhpcyBldmVuIGlmIHdlIHdhbnQKLQkJICogdG8gdXNlIFBJTy4gMHg1MyBiaXQgMSAocmV2IDIwIG9ubHkpIC0gZW5hYmxlIEZJRk8gY29udHJvbAotCQkgKiB2aWEgMHg1NC81NS4KLQkJICovCi0JCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIDB4NTMsICZ0bXApOwotCQlpZiAocGRldi0+cmV2aXNpb24gPD0gMHgyMCkKLQkJCXRtcCAmPSB+MHgwMjsKLQkJaWYgKHBkZXYtPnJldmlzaW9uID49IDB4YzcpCi0JCQl0bXAgfD0gMHgwMzsKLQkJZWxzZQotCQkJdG1wIHw9IDB4MDE7CS8qIENEX1JPTSBlbmFibGUgZm9yIERNQSAqLwotCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgMHg1MywgdG1wKTsKLQl9Ci0JcGNpX2Rldl9wdXQoaXNhX2JyaWRnZSk7CiAJcGNpX2Rldl9wdXQobm9ydGgpOwogCWF0YV9wY2lfYm1kbWFfY2xlYXJfc2ltcGxleChwZGV2KTsKIH0KQEAgLTUwMyw3ICs1MzIsNyBAQAogCQkucGlvX21hc2sgPSAweDFmLAogCQkubXdkbWFfbWFzayA9IDB4MDcsCiAJCS51ZG1hX21hc2sgPSBBVEFfVURNQTUsCi0JCS5wb3J0X29wcyA9ICZhbGlfYzJfcG9ydF9vcHMKKwkJLnBvcnRfb3BzID0gJmFsaV9jNF9wb3J0X29wcwogCX07CiAJLyogUmV2aXNpb24gMHhDNSBpcyBVRE1BMTMzIHdpdGggTEJBNDggRE1BICovCiAJc3RhdGljIGNvbnN0IHN0cnVjdCBhdGFfcG9ydF9pbmZvIGluZm9fYzUgPSB7CkBAIC01MTYsNyArNTQ1LDYgQEAKIAogCWNvbnN0IHN0cnVjdCBhdGFfcG9ydF9pbmZvICpwcGlbXSA9IHsgTlVMTCwgTlVMTCB9OwogCXU4IHRtcDsKLQlzdHJ1Y3QgcGNpX2RldiAqaXNhX2JyaWRnZTsKIAlpbnQgcmM7CiAKIAlyYyA9IHBjaW1fZW5hYmxlX2RldmljZShwZGV2KTsKQEAgLTU0MywxNCArNTcxLDEyIEBACiAKIAlhbGlfaW5pdF9jaGlwc2V0KHBkZXYpOwogCi0JaXNhX2JyaWRnZSA9IHBjaV9nZXRfZGV2aWNlKFBDSV9WRU5ET1JfSURfQUwsIFBDSV9ERVZJQ0VfSURfQUxfTTE1MzMsIE5VTEwpOwogCWlmIChpc2FfYnJpZGdlICYmIHBkZXYtPnJldmlzaW9uID49IDB4MjAgJiYgcGRldi0+cmV2aXNpb24gPCAweEMyKSB7CiAJCS8qIEFyZSB3ZSBwYWlyZWQgd2l0aCBhIFVETUEgY2FwYWJsZSBjaGlwICovCiAJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGlzYV9icmlkZ2UsIDB4NUUsICZ0bXApOwogCQlpZiAoKHRtcCAmIDB4MUUpID09IDB4MTIpCiAJICAgICAgICAJcHBpWzBdID0gJmluZm9fMjBfdWRtYTsKIAl9Ci0JcGNpX2Rldl9wdXQoaXNhX2JyaWRnZSk7CiAKIAlyZXR1cm4gYXRhX3BjaV9zZmZfaW5pdF9vbmUocGRldiwgcHBpLCAmYWxpX3NodCwgTlVMTCk7CiB9CkBAIC01OTAsMTMgKzYxNiwyMCBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBhbGlfaW5pdCh2b2lkKQogewotCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZhbGlfcGNpX2RyaXZlcik7CisJaW50IHJldDsKKwlpc2FfYnJpZGdlID0gcGNpX2dldF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9BTCwgUENJX0RFVklDRV9JRF9BTF9NMTUzMywgTlVMTCk7CisKKwlyZXQgPSBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZhbGlfcGNpX2RyaXZlcik7CisJaWYgKHJldCA8IDApCisJCXBjaV9kZXZfcHV0KGlzYV9icmlkZ2UpOworCXJldHVybiByZXQ7CiB9CiAKIAogc3RhdGljIHZvaWQgX19leGl0IGFsaV9leGl0KHZvaWQpCiB7CiAJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZhbGlfcGNpX2RyaXZlcik7CisJcGNpX2Rldl9wdXQoaXNhX2JyaWRnZSk7CiB9CiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9hbWQuYyBiL2RyaXZlcnMvYXRhL3BhdGFfYW1kLmMKaW5kZXggMGVjOWM3ZC4uNjM3MTlhYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9hbWQuYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX2FtZC5jCkBAIC0yNCw3ICsyNCw3IEBACiAjaW5jbHVkZSA8bGludXgvbGliYXRhLmg+CiAKICNkZWZpbmUgRFJWX05BTUUgInBhdGFfYW1kIgotI2RlZmluZSBEUlZfVkVSU0lPTiAiMC4zLjEwIgorI2RlZmluZSBEUlZfVkVSU0lPTiAiMC4zLjExIgogCiAvKioKICAqCXRpbWluZ19zZXR1cAkJLQlzaGFyZWQgdGltaW5nIGNvbXB1dGF0aW9uIGFuZCBsb2FkCkBAIC0zNDUsNyArMzQ1LDcgQEAKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYXRhX3BvcnRfb3BlcmF0aW9ucyBhbWRfYmFzZV9wb3J0X29wcyA9IHsKLQkuaW5oZXJpdHMJPSAmYXRhX2JtZG1hX3BvcnRfb3BzLAorCS5pbmhlcml0cwk9ICZhdGFfYm1kbWEzMl9wb3J0X29wcywKIAkucHJlcmVzZXQJPSBhbWRfcHJlX3Jlc2V0LAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9ocHQzNjYuYyBiL2RyaXZlcnMvYXRhL3BhdGFfaHB0MzY2LmMKaW5kZXggZTBjNGYwNS4uNjVjMjhlNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9ocHQzNjYuYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX2hwdDM2Ni5jCkBAIC0zMCw3ICszMCw3IEBACiAjZGVmaW5lIERSVl9WRVJTSU9OCSIwLjYuMiIKIAogc3RydWN0IGhwdF9jbG9jayB7Ci0JdTgJeGZlcl9zcGVlZDsKKwl1OAl4ZmVyX21vZGU7CiAJdTMyCXRpbWluZzsKIH07CiAKQEAgLTE4OSwyOCArMTg5LDYgQEAKIAlyZXR1cm4gYXRhX2JtZG1hX21vZGVfZmlsdGVyKGFkZXYsIG1hc2spOwogfQogCi0vKioKLSAqCWhwdDM2eF9maW5kX21vZGUJLQlyZXNldCB0aGUgaHB0MzZ4IGJ1cwotICoJQGFwOiBBVEEgcG9ydAotICoJQHNwZWVkOiB0cmFuc2ZlciBtb2RlCi0gKgotICoJUmV0dXJuIHRoZSAzMmJpdCByZWdpc3RlciBwcm9ncmFtbWluZyBpbmZvcm1hdGlvbiBmb3IgdGhpcyBjaGFubmVsCi0gKgl0aGF0IG1hdGNoZXMgdGhlIHNwZWVkIHByb3ZpZGVkLgotICovCi0KLXN0YXRpYyB1MzIgaHB0MzZ4X2ZpbmRfbW9kZShzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBpbnQgc3BlZWQpCi17Ci0Jc3RydWN0IGhwdF9jbG9jayAqY2xvY2tzID0gYXAtPmhvc3QtPnByaXZhdGVfZGF0YTsKLQotCXdoaWxlKGNsb2Nrcy0+eGZlcl9zcGVlZCkgewotCQlpZiAoY2xvY2tzLT54ZmVyX3NwZWVkID09IHNwZWVkKQotCQkJcmV0dXJuIGNsb2Nrcy0+dGltaW5nOwotCQljbG9ja3MrKzsKLQl9Ci0JQlVHKCk7Ci0JcmV0dXJuIDB4ZmZmZmZmZmZVOwkvKiBzaWxlbmNlIGNvbXBpbGVyIHdhcm5pbmcgKi8KLX0KLQogc3RhdGljIGludCBocHQzNnhfY2FibGVfZGV0ZWN0KHN0cnVjdCBhdGFfcG9ydCAqYXApCiB7CiAJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGFwLT5ob3N0LT5kZXYpOwpAQCAtMjI2LDYgKzIwNCw0OSBAQAogCXJldHVybiBBVEFfQ0JMX1BBVEE4MDsKIH0KIAorc3RhdGljIHZvaWQgaHB0MzY2X3NldF9tb2RlKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHN0cnVjdCBhdGFfZGV2aWNlICphZGV2LAorCQkJICAgIHU4IG1vZGUpCit7CisJc3RydWN0IGhwdF9jbG9jayAqY2xvY2tzID0gYXAtPmhvc3QtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRvX3BjaV9kZXYoYXAtPmhvc3QtPmRldik7CisJdTMyIGFkZHIxID0gMHg0MCArIDQgKiAoYWRldi0+ZGV2bm8gKyAyICogYXAtPnBvcnRfbm8pOworCXUzMiBhZGRyMiA9IDB4NTEgKyA0ICogYXAtPnBvcnRfbm87CisJdTMyIG1hc2ssIHJlZzsKKwl1OCBmYXN0OworCisJLyogRmFzdCBpbnRlcnJ1cHQgcHJlZGljdGlvbiBkaXNhYmxlLCBob2xkIG9mZiBpbnRlcnJ1cHQgZGlzYWJsZSAqLworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIGFkZHIyLCAmZmFzdCk7CisJaWYgKGZhc3QgJiAweDgwKSB7CisJCWZhc3QgJj0gfjB4ODA7CisJCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCBhZGRyMiwgZmFzdCk7CisJfQorCisJLyogZGV0ZXJtaW5lIHRpbWluZyBtYXNrIGFuZCBmaW5kIG1hdGNoaW5nIGNsb2NrIGVudHJ5ICovCisJaWYgKG1vZGUgPCBYRkVSX01XX0RNQV8wKQorCQltYXNrID0gMHhjMWY4ZmZmZjsKKwllbHNlIGlmIChtb2RlIDwgWEZFUl9VRE1BXzApCisJCW1hc2sgPSAweDMwMzgwMGZmOworCWVsc2UKKwkJbWFzayA9IDB4MzAwNzAwMDA7CisKKwl3aGlsZSAoY2xvY2tzLT54ZmVyX21vZGUpIHsKKwkJaWYgKGNsb2Nrcy0+eGZlcl9tb2RlID09IG1vZGUpCisJCQlicmVhazsKKwkJY2xvY2tzKys7CisJfQorCWlmICghY2xvY2tzLT54ZmVyX21vZGUpCisJCUJVRygpOworCisJLyoKKwkgKiBDb21iaW5lIG5ldyBtb2RlIGJpdHMgd2l0aCBvbGQgY29uZmlnIGJpdHMgYW5kIGRpc2FibGUKKwkgKiBvbi1jaGlwIFBJTyBGSUZPL2J1ZmZlciAoYW5kIFBJTyBNU1QgbW9kZSBhcyB3ZWxsKSB0byBhdm9pZAorCSAqIHByb2JsZW1zIGhhbmRsaW5nIEkvTyBlcnJvcnMgbGF0ZXIuCisJICovCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBkZXYsIGFkZHIxLCAmcmVnKTsKKwlyZWcgPSAoKHJlZyAmIH5tYXNrKSB8IChjbG9ja3MtPnRpbWluZyAmIG1hc2spKSAmIH4weGMwMDAwMDAwOworCXBjaV93cml0ZV9jb25maWdfZHdvcmQocGRldiwgYWRkcjEsIHJlZyk7Cit9CisKIC8qKgogICoJaHB0MzY2X3NldF9waW9tb2RlCQktCVBJTyBzZXR1cAogICoJQGFwOiBBVEEgaW50ZXJmYWNlCkBAIC0yMzYsMjggKzI1Nyw3IEBACiAKIHN0YXRpYyB2b2lkIGhwdDM2Nl9zZXRfcGlvbW9kZShzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBzdHJ1Y3QgYXRhX2RldmljZSAqYWRldikKIHsKLQlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRvX3BjaV9kZXYoYXAtPmhvc3QtPmRldik7Ci0JdTMyIGFkZHIxLCBhZGRyMjsKLQl1MzIgcmVnOwotCXUzMiBtb2RlOwotCXU4IGZhc3Q7Ci0KLQlhZGRyMSA9IDB4NDAgKyA0ICogKGFkZXYtPmRldm5vICsgMiAqIGFwLT5wb3J0X25vKTsKLQlhZGRyMiA9IDB4NTEgKyA0ICogYXAtPnBvcnRfbm87Ci0KLQkvKiBGYXN0IGludGVycnVwdCBwcmVkaWN0aW9uIGRpc2FibGUsIGhvbGQgb2ZmIGludGVycnVwdCBkaXNhYmxlICovCi0JcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgYWRkcjIsICZmYXN0KTsKLQlpZiAoZmFzdCAmIDB4ODApIHsKLQkJZmFzdCAmPSB+MHg4MDsKLQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIGFkZHIyLCBmYXN0KTsKLQl9Ci0KLQlwY2lfcmVhZF9jb25maWdfZHdvcmQocGRldiwgYWRkcjEsICZyZWcpOwotCW1vZGUgPSBocHQzNnhfZmluZF9tb2RlKGFwLCBhZGV2LT5waW9fbW9kZSk7Ci0JbW9kZSAmPSB+MHg4MDAwMDAwOwkvKiBObyBGSUZPIGluIFBJTyAqLwotCW1vZGUgJj0gfjB4MzAwNzAwMDA7CS8qIExlYXZlIGNvbmZpZyBiaXRzIGFsb25lICovCi0JcmVnICY9IDB4MzAwNzAwMDA7CS8qIFN0cmlwIHRpbWluZyBiaXRzICovCi0JcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwZGV2LCBhZGRyMSwgcmVnIHwgbW9kZSk7CisJaHB0MzY2X3NldF9tb2RlKGFwLCBhZGV2LCBhZGV2LT5waW9fbW9kZSk7CiB9CiAKIC8qKgpAQCAtMjcxLDI4ICsyNzEsNyBAQAogCiBzdGF0aWMgdm9pZCBocHQzNjZfc2V0X2RtYW1vZGUoc3RydWN0IGF0YV9wb3J0ICphcCwgc3RydWN0IGF0YV9kZXZpY2UgKmFkZXYpCiB7Ci0Jc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGFwLT5ob3N0LT5kZXYpOwotCXUzMiBhZGRyMSwgYWRkcjI7Ci0JdTMyIHJlZzsKLQl1MzIgbW9kZTsKLQl1OCBmYXN0OwotCi0JYWRkcjEgPSAweDQwICsgNCAqIChhZGV2LT5kZXZubyArIDIgKiBhcC0+cG9ydF9ubyk7Ci0JYWRkcjIgPSAweDUxICsgNCAqIGFwLT5wb3J0X25vOwotCi0JLyogRmFzdCBpbnRlcnJ1cHQgcHJlZGljdGlvbiBkaXNhYmxlLCBob2xkIG9mZiBpbnRlcnJ1cHQgZGlzYWJsZSAqLwotCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIGFkZHIyLCAmZmFzdCk7Ci0JaWYgKGZhc3QgJiAweDgwKSB7Ci0JCWZhc3QgJj0gfjB4ODA7Ci0JCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCBhZGRyMiwgZmFzdCk7Ci0JfQotCi0JcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBkZXYsIGFkZHIxLCAmcmVnKTsKLQltb2RlID0gaHB0MzZ4X2ZpbmRfbW9kZShhcCwgYWRldi0+ZG1hX21vZGUpOwotCW1vZGUgfD0gMHg4MDAwMDAwOwkvKiBGSUZPIGluIE1XRE1BIG9yIFVETUEgKi8KLQltb2RlICY9IH4weEMwMDAwMDAwOwkvKiBMZWF2ZSBjb25maWcgYml0cyBhbG9uZSAqLwotCXJlZyAmPSAweEMwMDAwMDAwOwkvKiBTdHJpcCB0aW1pbmcgYml0cyAqLwotCXBjaV93cml0ZV9jb25maWdfZHdvcmQocGRldiwgYWRkcjEsIHJlZyB8IG1vZGUpOworCWhwdDM2Nl9zZXRfbW9kZShhcCwgYWRldiwgYWRldi0+ZG1hX21vZGUpOwogfQogCiBzdGF0aWMgc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSBocHQzNnhfc2h0ID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9ocHQzeDMuYyBiL2RyaXZlcnMvYXRhL3BhdGFfaHB0M3gzLmMKaW5kZXggZjExYTMyMC4uZjE5Y2M2NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9ocHQzeDMuYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX2hwdDN4My5jCkBAIC0yMyw3ICsyMyw3IEBACiAjaW5jbHVkZSA8bGludXgvbGliYXRhLmg+CiAKICNkZWZpbmUgRFJWX05BTUUJInBhdGFfaHB0M3gzIgotI2RlZmluZSBEUlZfVkVSU0lPTgkiMC41LjMiCisjZGVmaW5lIERSVl9WRVJTSU9OCSIwLjYuMSIKIAogLyoqCiAgKglocHQzeDNfc2V0X3Bpb21vZGUJCS0JUElPIHNldHVwCkBAIC04MCwxNCArODAsNDggQEAKIAlyMiAmPSB+KDB4MTEgPDwgZG4pOwkvKiBDbGVhciBNV0RNQSBhbmQgVURNQSBiaXRzICovCiAKIAlpZiAoYWRldi0+ZG1hX21vZGUgPj0gWEZFUl9VRE1BXzApCi0JCXIyIHw9ICgweDEwIDw8IGRuKTsJLyogVWx0cmEgbW9kZSAqLworCQlyMiB8PSAoMHgwMSA8PCBkbik7CS8qIFVsdHJhIG1vZGUgKi8KIAllbHNlCi0JCXIyIHw9ICgweDAxIDw8IGRuKTsJLyogTVdETUEgKi8KKwkJcjIgfD0gKDB4MTAgPDwgZG4pOwkvKiBNV0RNQSAqLwogCiAJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwZGV2LCAweDQ0LCByMSk7CiAJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwZGV2LCAweDQ4LCByMik7CiB9Ci0jZW5kaWYgLyogQ09ORklHX1BBVEFfSFBUM1gzX0RNQSAqLworCisvKioKKyAqCWhwdDN4M19mcmVlemUJCS0JRE1BIHdvcmthcm91bmQKKyAqCUBhcDogcG9ydCB0byBmcmVlemUKKyAqCisgKglXaGVuIGZyZWV6aW5nIGFuIEhQVDN4MyB3ZSBtdXN0IHN0b3AgYW55IHBlbmRpbmcgRE1BIGJlZm9yZQorICoJd3JpdGluZyB0byB0aGUgY29udHJvbCByZWdpc3RlciBvciB0aGUgY2hpcCB3aWxsIGhhbmcKKyAqLworCitzdGF0aWMgdm9pZCBocHQzeDNfZnJlZXplKHN0cnVjdCBhdGFfcG9ydCAqYXApCit7CisJdm9pZCBfX2lvbWVtICptbWlvID0gYXAtPmlvYWRkci5ibWRtYV9hZGRyOworCisJaW93cml0ZTgoaW9yZWFkOChtbWlvICsgQVRBX0RNQV9DTUQpICYgfiBBVEFfRE1BX1NUQVJULAorCQkJbW1pbyArIEFUQV9ETUFfQ01EKTsKKwlhdGFfc2ZmX2RtYV9wYXVzZShhcCk7CisJYXRhX3NmZl9mcmVlemUoYXApOworfQorCisvKioKKyAqCWhwdDN4M19ibWRtYV9zZXR1cAktCURNQSB3b3JrYXJvdW5kCisgKglAcWM6IFF1ZXVlZCBjb21tYW5kCisgKgorICoJV2hlbiBpc3N1aW5nIEJNRE1BIHdlIG11c3QgY2xlYW4gdXAgdGhlIGVycm9yL2FjdGl2ZSBiaXRzIGluCisgKglzb2Z0d2FyZSBvbiB0aGlzIGRldmljZQorICovCisKK3N0YXRpYyB2b2lkIGhwdDN4M19ibWRtYV9zZXR1cChzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjKQoreworCXN0cnVjdCBhdGFfcG9ydCAqYXAgPSBxYy0+YXA7CisJdTggciA9IGlvcmVhZDgoYXAtPmlvYWRkci5ibWRtYV9hZGRyICsgQVRBX0RNQV9TVEFUVVMpOworCXIgfD0gQVRBX0RNQV9JTlRSIHwgQVRBX0RNQV9FUlI7CisJaW93cml0ZTgociwgYXAtPmlvYWRkci5ibWRtYV9hZGRyICsgQVRBX0RNQV9TVEFUVVMpOworCXJldHVybiBhdGFfYm1kbWFfc2V0dXAocWMpOworfQogCiAvKioKICAqCWhwdDN4M19hdGFwaV9kbWEJLQlBVEFQSSBETUEgY2hlY2sKQEAgLTEwMSwxOCArMTM1LDIzIEBACiAJcmV0dXJuIDE7CiB9CiAKKyNlbmRpZiAvKiBDT05GSUdfUEFUQV9IUFQzWDNfRE1BICovCisKIHN0YXRpYyBzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlIGhwdDN4M19zaHQgPSB7CiAJQVRBX0JNRE1BX1NIVChEUlZfTkFNRSksCiB9OwogCiBzdGF0aWMgc3RydWN0IGF0YV9wb3J0X29wZXJhdGlvbnMgaHB0M3gzX3BvcnRfb3BzID0gewogCS5pbmhlcml0cwk9ICZhdGFfYm1kbWFfcG9ydF9vcHMsCi0JLmNoZWNrX2F0YXBpX2RtYT0gaHB0M3gzX2F0YXBpX2RtYSwKIAkuY2FibGVfZGV0ZWN0CT0gYXRhX2NhYmxlXzQwd2lyZSwKIAkuc2V0X3Bpb21vZGUJPSBocHQzeDNfc2V0X3Bpb21vZGUsCiAjaWYgZGVmaW5lZChDT05GSUdfUEFUQV9IUFQzWDNfRE1BKQogCS5zZXRfZG1hbW9kZQk9IGhwdDN4M19zZXRfZG1hbW9kZSwKKwkuYm1kbWFfc2V0dXAJPSBocHQzeDNfYm1kbWFfc2V0dXAsCisJLmNoZWNrX2F0YXBpX2RtYT0gaHB0M3gzX2F0YXBpX2RtYSwKKwkuZnJlZXplCQk9IGhwdDN4M19mcmVlemUsCiAjZW5kaWYKKwkKIH07CiAKIC8qKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9tcGlpeC5jIGIvZHJpdmVycy9hdGEvcGF0YV9tcGlpeC5jCmluZGV4IDdjOGZhYTQuLmFhNTc2Y2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfbXBpaXguYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX21waWl4LmMKQEAgLTM1LDcgKzM1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9saWJhdGEuaD4KIAogI2RlZmluZSBEUlZfTkFNRSAicGF0YV9tcGlpeCIKLSNkZWZpbmUgRFJWX1ZFUlNJT04gIjAuNy42IgorI2RlZmluZSBEUlZfVkVSU0lPTiAiMC43LjciCiAKIGVudW0gewogCUlERVRJTSA9IDB4NkMsCQkvKiBJREUgY29udHJvbCByZWdpc3RlciAqLwpAQCAtMTQ2LDYgKzE0Niw3IEBACiAJLmNhYmxlX2RldGVjdAk9IGF0YV9jYWJsZV80MHdpcmUsCiAJLnNldF9waW9tb2RlCT0gbXBpaXhfc2V0X3Bpb21vZGUsCiAJLnByZXJlc2V0CT0gbXBpaXhfcHJlX3Jlc2V0LAorCS5zZmZfZGF0YV94ZmVyCT0gYXRhX3NmZl9kYXRhX3hmZXIzMiwKIH07CiAKIHN0YXRpYyBpbnQgbXBpaXhfaW5pdF9vbmUoc3RydWN0IHBjaV9kZXYgKmRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9wbGF0Zm9ybS5jIGIvZHJpdmVycy9hdGEvcGF0YV9wbGF0Zm9ybS5jCmluZGV4IDZhZmEwN2EuLmQ4ZDc0M2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfcGxhdGZvcm0uYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX3BsYXRmb3JtLmMKQEAgLTE4Niw3ICsxODYsNyBAQAogICoJQSBwbGF0Zm9ybSBidXMgQVRBIGRldmljZSBoYXMgYmVlbiB1bnBsdWdnZWQuIFBlcmZvcm0gdGhlIG5lZWRlZAogICoJY2xlYW51cC4gQWxzbyBjYWxsZWQgb24gbW9kdWxlIHVubG9hZCBmb3IgYW55IGFjdGl2ZSBkZXZpY2VzLgogICovCi1pbnQgX19kZXZleGl0IF9fcGF0YV9wbGF0Zm9ybV9yZW1vdmUoc3RydWN0IGRldmljZSAqZGV2KQoraW50IF9fcGF0YV9wbGF0Zm9ybV9yZW1vdmUoc3RydWN0IGRldmljZSAqZGV2KQogewogCXN0cnVjdCBhdGFfaG9zdCAqaG9zdCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX3NpbDY4MC5jIGIvZHJpdmVycy9hdGEvcGF0YV9zaWw2ODAuYwppbmRleCA4MzU4MGE1Li45ZTc2NGU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX3NpbDY4MC5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfc2lsNjgwLmMKQEAgLTMyLDcgKzMyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9saWJhdGEuaD4KIAogI2RlZmluZSBEUlZfTkFNRSAicGF0YV9zaWw2ODAiCi0jZGVmaW5lIERSVl9WRVJTSU9OICIwLjQuOCIKKyNkZWZpbmUgRFJWX1ZFUlNJT04gIjAuNC45IgogCiAjZGVmaW5lIFNJTDY4MF9NTUlPX0JBUgkJNQogCkBAIC0xOTUsNyArMTk1LDcgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgYXRhX3BvcnRfb3BlcmF0aW9ucyBzaWw2ODBfcG9ydF9vcHMgPSB7Ci0JLmluaGVyaXRzCT0gJmF0YV9ibWRtYV9wb3J0X29wcywKKwkuaW5oZXJpdHMJPSAmYXRhX2JtZG1hMzJfcG9ydF9vcHMsCiAJLmNhYmxlX2RldGVjdAk9IHNpbDY4MF9jYWJsZV9kZXRlY3QsCiAJLnNldF9waW9tb2RlCT0gc2lsNjgwX3NldF9waW9tb2RlLAogCS5zZXRfZG1hbW9kZQk9IHNpbDY4MF9zZXRfZG1hbW9kZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3NhdGFfc2lsMjQuYyBiL2RyaXZlcnMvYXRhL3NhdGFfc2lsMjQuYwppbmRleCBjY2VlOTMwLi4yNTkwYzIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9zYXRhX3NpbDI0LmMKKysrIGIvZHJpdmVycy9hdGEvc2F0YV9zaWwyNC5jCkBAIC01MSwxMyArNTEsNiBAQAogCV9fbGUzMglmbGFnczsKIH07CiAKLS8qCi0gKiBQb3J0IG11bHRpcGxpZXIKLSAqLwotc3RydWN0IHNpbDI0X3BvcnRfbXVsdGlwbGllciB7Ci0JX19sZTMyCWRpYWc7Ci0JX19sZTMyCXNhY3RpdmU7Ci19OwogCiBlbnVtIHsKIAlTSUwyNF9IT1NUX0JBUgkJPSAwLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdG0vaXBoYXNlLmMgYi9kcml2ZXJzL2F0bS9pcGhhc2UuYwppbmRleCAwODg4ODVlLi5lMWM3NjExIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0bS9pcGhhc2UuYworKysgYi9kcml2ZXJzL2F0bS9pcGhhc2UuYwpAQCAtNjQsNyArNjQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KICNpbmNsdWRlICJpcGhhc2UuaCIJCSAgCiAjaW5jbHVkZSAic3VuaS5oIgkJICAKLSNkZWZpbmUgc3dhcCh4KSAoKCh4ICYgMHhmZikgPDwgOCkgfCAoKHggJiAweGZmMDApID4+IDgpKSAgCisjZGVmaW5lIHN3YXBfYnl0ZV9vcmRlcih4KSAoKCh4ICYgMHhmZikgPDwgOCkgfCAoKHggJiAweGZmMDApID4+IDgpKQogCiAjZGVmaW5lIFBSSVYoZGV2KSAoKHN0cnVjdCBzdW5pX3ByaXYgKikgZGV2LT5waHlfZGF0YSkKIApAQCAtMTMwNiw3ICsxMzA2LDcgQEAKICAgICAgICAgICAvLyBnZXQgcmVhbCBwa3QgbGVuZ3RoICBwd2FuZ190ZXN0CiAgICAgICAgICAgdHJhaWxlciA9IChzdHJ1Y3QgY3Bjc190cmFpbGVyKikoKHVfY2hhciAqKXNrYi0+ZGF0YSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2ItPmxlbiAtIHNpemVvZigqdHJhaWxlcikpOwotICAgICAgICAgIGxlbmd0aCA9ICBzd2FwKHRyYWlsZXItPmxlbmd0aCk7CisJICBsZW5ndGggPSBzd2FwX2J5dGVfb3JkZXIodHJhaWxlci0+bGVuZ3RoKTsKICAgICAgICAgICBpZiAoKGxlbmd0aCA+IGlhZGV2LT5yeF9idWZfc3opIHx8IChsZW5ndGggPiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChza2ItPmxlbiAtIHNpemVvZihzdHJ1Y3QgY3Bjc190cmFpbGVyKSkpKQogICAgICAgICAgIHsKQEAgLTI5OTUsNyArMjk5NSw3IEBACiAJCXNrYi0+bGVuLCBQQ0lfRE1BX1RPREVWSUNFKTsKIAl3cl9wdHItPmxvY2FsX3BrdF9hZGRyID0gKGJ1Zl9kZXNjX3B0ci0+YnVmX3N0YXJ0X2hpIDw8IDE2KSB8IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZfZGVzY19wdHItPmJ1Zl9zdGFydF9sbzsgIAotCS8qIHdyX3B0ci0+Ynl0ZXMgPSBzd2FwKHRvdGFsX2xlbik7CWRpZG4ndCBzZWVtIHRvIGFmZmVjdCA/PyAqLyAgCisJLyogd3JfcHRyLT5ieXRlcyA9IHN3YXBfYnl0ZV9vcmRlcih0b3RhbF9sZW4pOyBkaWRuJ3Qgc2VlbSB0byBhZmZlY3Q/PyAqLwogCXdyX3B0ci0+Ynl0ZXMgPSBza2ItPmxlbjsgIAogCiAgICAgICAgIC8qIGh3IGJ1ZyAtIERMRXMgb2YgMHgyZCwgMHgyZSwgMHgyZiBjYXVzZSBETUEgbG9ja3VwICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvS2NvbmZpZyBiL2RyaXZlcnMvYmFzZS9LY29uZmlnCmluZGV4IGQ4ZThjNDkuLjhmMDA2ZjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9LY29uZmlnCisrKyBiL2RyaXZlcnMvYmFzZS9LY29uZmlnCkBAIC01NCw3ICs1NCw3IEBACiAJICBzdWNoIGZpcm13YXJlLCBhbmQgZG8gbm90IHdpc2ggdG8gdXNlIGFuIGluaXRyZC4KIAogCSAgVGhpcyBzaW5nbGUgb3B0aW9uIGNvbnRyb2xzIHRoZSBpbmNsdXNpb24gb2YgZmlybXdhcmUgZm9yCi0JICBldmVyeSBkcml2ZXIgd2hpY2ggdXNlcyByZXF1ZXN0X2Zpcm1hcmUoKSBhbmQgc2hpcHMgaXRzCisJICBldmVyeSBkcml2ZXIgd2hpY2ggdXNlcyByZXF1ZXN0X2Zpcm13YXJlKCkgYW5kIHNoaXBzIGl0cwogCSAgZmlybXdhcmUgaW4gdGhlIGtlcm5lbCBzb3VyY2UgdHJlZSwgdG8gYXZvaWQgYSBwcm9saWZlcmF0aW9uCiAJICBvZiAnSW5jbHVkZSBmaXJtd2FyZSBmb3IgeHh4IGRldmljZScgb3B0aW9ucy4KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL2F0dHJpYnV0ZV9jb250YWluZXIuYyBiL2RyaXZlcnMvYmFzZS9hdHRyaWJ1dGVfY29udGFpbmVyLmMKaW5kZXggZjU3NjUyZC4uYjljZGEwNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL2F0dHJpYnV0ZV9jb250YWluZXIuYworKysgYi9kcml2ZXJzL2Jhc2UvYXR0cmlidXRlX2NvbnRhaW5lci5jCkBAIC0xNjcsNyArMTY3LDcgQEAKIAkJaWMtPmNsYXNzZGV2LnBhcmVudCA9IGdldF9kZXZpY2UoZGV2KTsKIAkJaWMtPmNsYXNzZGV2LmNsYXNzID0gY29udC0+Y2xhc3M7CiAJCWNvbnQtPmNsYXNzLT5kZXZfcmVsZWFzZSA9IGF0dHJpYnV0ZV9jb250YWluZXJfcmVsZWFzZTsKLQkJc3RyY3B5KGljLT5jbGFzc2Rldi5idXNfaWQsIGRldi0+YnVzX2lkKTsKKwkJZGV2X3NldF9uYW1lKCZpYy0+Y2xhc3NkZXYsIGRldl9uYW1lKGRldikpOwogCQlpZiAoZm4pCiAJCQlmbihjb250LCBkZXYsICZpYy0+Y2xhc3NkZXYpOwogCQllbHNlCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvYmFzZS5oIGIvZHJpdmVycy9iYXNlL2Jhc2UuaAppbmRleCAwYTVmMDU1Li5iNjc2ZjhmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvYmFzZS5oCisrKyBiL2RyaXZlcnMvYmFzZS9iYXNlLmgKQEAgLTYzLDYgKzYzLDMyIEBACiAjZGVmaW5lIHRvX2NsYXNzKG9iaikJXAogCWNvbnRhaW5lcl9vZihvYmosIHN0cnVjdCBjbGFzc19wcml2YXRlLCBjbGFzc19zdWJzeXMua29iaikKIAorLyoqCisgKiBzdHJ1Y3QgZGV2aWNlX3ByaXZhdGUgLSBzdHJ1Y3R1cmUgdG8gaG9sZCB0aGUgcHJpdmF0ZSB0byB0aGUgZHJpdmVyIGNvcmUgcG9ydGlvbnMgb2YgdGhlIGRldmljZSBzdHJ1Y3R1cmUuCisgKgorICogQGtsaXN0X2NoaWxkcmVuIC0ga2xpc3QgY29udGFpbmluZyBhbGwgY2hpbGRyZW4gb2YgdGhpcyBkZXZpY2UKKyAqIEBrbm9kZV9wYXJlbnQgLSBub2RlIGluIHNpYmxpbmcgbGlzdAorICogQGtub2RlX2RyaXZlciAtIG5vZGUgaW4gZHJpdmVyIGxpc3QKKyAqIEBrbm9kZV9idXMgLSBub2RlIGluIGJ1cyBsaXN0CisgKiBAZGV2aWNlIC0gcG9pbnRlciBiYWNrIHRvIHRoZSBzdHJ1Y3QgY2xhc3MgdGhhdCB0aGlzIHN0cnVjdHVyZSBpcworICogYXNzb2NpYXRlZCB3aXRoLgorICoKKyAqIE5vdGhpbmcgb3V0c2lkZSBvZiB0aGUgZHJpdmVyIGNvcmUgc2hvdWxkIGV2ZXIgdG91Y2ggdGhlc2UgZmllbGRzLgorICovCitzdHJ1Y3QgZGV2aWNlX3ByaXZhdGUgeworCXN0cnVjdCBrbGlzdCBrbGlzdF9jaGlsZHJlbjsKKwlzdHJ1Y3Qga2xpc3Rfbm9kZSBrbm9kZV9wYXJlbnQ7CisJc3RydWN0IGtsaXN0X25vZGUga25vZGVfZHJpdmVyOworCXN0cnVjdCBrbGlzdF9ub2RlIGtub2RlX2J1czsKKwlzdHJ1Y3QgZGV2aWNlICpkZXZpY2U7Cit9OworI2RlZmluZSB0b19kZXZpY2VfcHJpdmF0ZV9wYXJlbnQob2JqKQlcCisJY29udGFpbmVyX29mKG9iaiwgc3RydWN0IGRldmljZV9wcml2YXRlLCBrbm9kZV9wYXJlbnQpCisjZGVmaW5lIHRvX2RldmljZV9wcml2YXRlX2RyaXZlcihvYmopCVwKKwljb250YWluZXJfb2Yob2JqLCBzdHJ1Y3QgZGV2aWNlX3ByaXZhdGUsIGtub2RlX2RyaXZlcikKKyNkZWZpbmUgdG9fZGV2aWNlX3ByaXZhdGVfYnVzKG9iaikJXAorCWNvbnRhaW5lcl9vZihvYmosIHN0cnVjdCBkZXZpY2VfcHJpdmF0ZSwga25vZGVfYnVzKQorCiAvKiBpbml0aWFsaXNhdGlvbiBmdW5jdGlvbnMgKi8KIGV4dGVybiBpbnQgZGV2aWNlc19pbml0KHZvaWQpOwogZXh0ZXJuIGludCBidXNlc19pbml0KHZvaWQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL2J1cy5jIGIvZHJpdmVycy9iYXNlL2J1cy5jCmluZGV4IDVhZWUxYzAuLjBmMGE1MDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9idXMuYworKysgYi9kcml2ZXJzL2Jhc2UvYnVzLmMKQEAgLTI1Myw3ICsyNTMsMTQgQEAKIHN0YXRpYyBzdHJ1Y3QgZGV2aWNlICpuZXh0X2RldmljZShzdHJ1Y3Qga2xpc3RfaXRlciAqaSkKIHsKIAlzdHJ1Y3Qga2xpc3Rfbm9kZSAqbiA9IGtsaXN0X25leHQoaSk7Ci0JcmV0dXJuIG4gPyBjb250YWluZXJfb2Yobiwgc3RydWN0IGRldmljZSwga25vZGVfYnVzKSA6IE5VTEw7CisJc3RydWN0IGRldmljZSAqZGV2ID0gTlVMTDsKKwlzdHJ1Y3QgZGV2aWNlX3ByaXZhdGUgKmRldl9wcnY7CisKKwlpZiAobikgeworCQlkZXZfcHJ2ID0gdG9fZGV2aWNlX3ByaXZhdGVfYnVzKG4pOworCQlkZXYgPSBkZXZfcHJ2LT5kZXZpY2U7CisJfQorCXJldHVybiBkZXY7CiB9CiAKIC8qKgpAQCAtMjg2LDcgKzI5Myw3IEBACiAJCXJldHVybiAtRUlOVkFMOwogCiAJa2xpc3RfaXRlcl9pbml0X25vZGUoJmJ1cy0+cC0+a2xpc3RfZGV2aWNlcywgJmksCi0JCQkgICAgIChzdGFydCA/ICZzdGFydC0+a25vZGVfYnVzIDogTlVMTCkpOworCQkJICAgICAoc3RhcnQgPyAmc3RhcnQtPnAtPmtub2RlX2J1cyA6IE5VTEwpKTsKIAl3aGlsZSAoKGRldiA9IG5leHRfZGV2aWNlKCZpKSkgJiYgIWVycm9yKQogCQllcnJvciA9IGZuKGRldiwgZGF0YSk7CiAJa2xpc3RfaXRlcl9leGl0KCZpKTsKQEAgLTMyMCw3ICszMjcsNyBAQAogCQlyZXR1cm4gTlVMTDsKIAogCWtsaXN0X2l0ZXJfaW5pdF9ub2RlKCZidXMtPnAtPmtsaXN0X2RldmljZXMsICZpLAotCQkJICAgICAoc3RhcnQgPyAmc3RhcnQtPmtub2RlX2J1cyA6IE5VTEwpKTsKKwkJCSAgICAgKHN0YXJ0ID8gJnN0YXJ0LT5wLT5rbm9kZV9idXMgOiBOVUxMKSk7CiAJd2hpbGUgKChkZXYgPSBuZXh0X2RldmljZSgmaSkpKQogCQlpZiAobWF0Y2goZGV2LCBkYXRhKSAmJiBnZXRfZGV2aWNlKGRldikpCiAJCQlicmVhazsKQEAgLTMzMyw3ICszNDAsNyBAQAogewogCWNvbnN0IGNoYXIgKm5hbWUgPSBkYXRhOwogCi0JcmV0dXJuIHN5c2ZzX3N0cmVxKG5hbWUsIGRldi0+YnVzX2lkKTsKKwlyZXR1cm4gc3lzZnNfc3RyZXEobmFtZSwgZGV2X25hbWUoZGV2KSk7CiB9CiAKIC8qKgpAQCAtNDYxLDEyICs0NjgsMTIgQEAKIAlpbnQgZXJyb3IgPSAwOwogCiAJaWYgKGJ1cykgewotCQlwcl9kZWJ1ZygiYnVzOiAnJXMnOiBhZGQgZGV2aWNlICVzXG4iLCBidXMtPm5hbWUsIGRldi0+YnVzX2lkKTsKKwkJcHJfZGVidWcoImJ1czogJyVzJzogYWRkIGRldmljZSAlc1xuIiwgYnVzLT5uYW1lLCBkZXZfbmFtZShkZXYpKTsKIAkJZXJyb3IgPSBkZXZpY2VfYWRkX2F0dHJzKGJ1cywgZGV2KTsKIAkJaWYgKGVycm9yKQogCQkJZ290byBvdXRfcHV0OwogCQllcnJvciA9IHN5c2ZzX2NyZWF0ZV9saW5rKCZidXMtPnAtPmRldmljZXNfa3NldC0+a29iaiwKLQkJCQkJCSZkZXYtPmtvYmosIGRldi0+YnVzX2lkKTsKKwkJCQkJCSZkZXYtPmtvYmosIGRldl9uYW1lKGRldikpOwogCQlpZiAoZXJyb3IpCiAJCQlnb3RvIG91dF9pZDsKIAkJZXJyb3IgPSBzeXNmc19jcmVhdGVfbGluaygmZGV2LT5rb2JqLApAQCAtNDgyLDcgKzQ4OSw3IEBACiBvdXRfZGVwcmVjYXRlZDoKIAlzeXNmc19yZW1vdmVfbGluaygmZGV2LT5rb2JqLCAic3Vic3lzdGVtIik7CiBvdXRfc3Vic3lzOgotCXN5c2ZzX3JlbW92ZV9saW5rKCZidXMtPnAtPmRldmljZXNfa3NldC0+a29iaiwgZGV2LT5idXNfaWQpOworCXN5c2ZzX3JlbW92ZV9saW5rKCZidXMtPnAtPmRldmljZXNfa3NldC0+a29iaiwgZGV2X25hbWUoZGV2KSk7CiBvdXRfaWQ6CiAJZGV2aWNlX3JlbW92ZV9hdHRycyhidXMsIGRldik7CiBvdXRfcHV0OgpAQCAtNTA3LDcgKzUxNCw4IEBACiAJCQlyZXQgPSBkZXZpY2VfYXR0YWNoKGRldik7CiAJCVdBUk5fT04ocmV0IDwgMCk7CiAJCWlmIChyZXQgPj0gMCkKLQkJCWtsaXN0X2FkZF90YWlsKCZkZXYtPmtub2RlX2J1cywgJmJ1cy0+cC0+a2xpc3RfZGV2aWNlcyk7CisJCQlrbGlzdF9hZGRfdGFpbCgmZGV2LT5wLT5rbm9kZV9idXMsCisJCQkJICAgICAgICZidXMtPnAtPmtsaXN0X2RldmljZXMpOwogCX0KIH0KIApAQCAtNTI2LDEzICs1MzQsMTMgQEAKIAkJc3lzZnNfcmVtb3ZlX2xpbmsoJmRldi0+a29iaiwgInN1YnN5c3RlbSIpOwogCQlyZW1vdmVfZGVwcmVjYXRlZF9idXNfbGlua3MoZGV2KTsKIAkJc3lzZnNfcmVtb3ZlX2xpbmsoJmRldi0+YnVzLT5wLT5kZXZpY2VzX2tzZXQtPmtvYmosCi0JCQkJICBkZXYtPmJ1c19pZCk7CisJCQkJICBkZXZfbmFtZShkZXYpKTsKIAkJZGV2aWNlX3JlbW92ZV9hdHRycyhkZXYtPmJ1cywgZGV2KTsKLQkJaWYgKGtsaXN0X25vZGVfYXR0YWNoZWQoJmRldi0+a25vZGVfYnVzKSkKLQkJCWtsaXN0X2RlbCgmZGV2LT5rbm9kZV9idXMpOworCQlpZiAoa2xpc3Rfbm9kZV9hdHRhY2hlZCgmZGV2LT5wLT5rbm9kZV9idXMpKQorCQkJa2xpc3RfZGVsKCZkZXYtPnAtPmtub2RlX2J1cyk7CiAKIAkJcHJfZGVidWcoImJ1czogJyVzJzogcmVtb3ZlIGRldmljZSAlc1xuIiwKLQkJCSBkZXYtPmJ1cy0+bmFtZSwgZGV2LT5idXNfaWQpOworCQkJIGRldi0+YnVzLT5uYW1lLCBkZXZfbmFtZShkZXYpKTsKIAkJZGV2aWNlX3JlbGVhc2VfZHJpdmVyKGRldik7CiAJCWJ1c19wdXQoZGV2LT5idXMpOwogCX0KQEAgLTgzMSwxNCArODM5LDE2IEBACiAKIHN0YXRpYyB2b2lkIGtsaXN0X2RldmljZXNfZ2V0KHN0cnVjdCBrbGlzdF9ub2RlICpuKQogewotCXN0cnVjdCBkZXZpY2UgKmRldiA9IGNvbnRhaW5lcl9vZihuLCBzdHJ1Y3QgZGV2aWNlLCBrbm9kZV9idXMpOworCXN0cnVjdCBkZXZpY2VfcHJpdmF0ZSAqZGV2X3BydiA9IHRvX2RldmljZV9wcml2YXRlX2J1cyhuKTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBkZXZfcHJ2LT5kZXZpY2U7CiAKIAlnZXRfZGV2aWNlKGRldik7CiB9CiAKIHN0YXRpYyB2b2lkIGtsaXN0X2RldmljZXNfcHV0KHN0cnVjdCBrbGlzdF9ub2RlICpuKQogewotCXN0cnVjdCBkZXZpY2UgKmRldiA9IGNvbnRhaW5lcl9vZihuLCBzdHJ1Y3QgZGV2aWNlLCBrbm9kZV9idXMpOworCXN0cnVjdCBkZXZpY2VfcHJpdmF0ZSAqZGV2X3BydiA9IHRvX2RldmljZV9wcml2YXRlX2J1cyhuKTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBkZXZfcHJ2LT5kZXZpY2U7CiAKIAlwdXRfZGV2aWNlKGRldik7CiB9CkBAIC05OTMsMTggKzEwMDMsMjAgQEAKIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkICpwb3M7CiAJc3RydWN0IGtsaXN0X25vZGUgKm47CisJc3RydWN0IGRldmljZV9wcml2YXRlICpkZXZfcHJ2OwogCXN0cnVjdCBkZXZpY2UgKmI7CiAKIAlsaXN0X2Zvcl9lYWNoKHBvcywgbGlzdCkgewogCQluID0gY29udGFpbmVyX29mKHBvcywgc3RydWN0IGtsaXN0X25vZGUsIG5fbm9kZSk7Ci0JCWIgPSBjb250YWluZXJfb2Yobiwgc3RydWN0IGRldmljZSwga25vZGVfYnVzKTsKKwkJZGV2X3BydiA9IHRvX2RldmljZV9wcml2YXRlX2J1cyhuKTsKKwkJYiA9IGRldl9wcnYtPmRldmljZTsKIAkJaWYgKGNvbXBhcmUoYSwgYikgPD0gMCkgewotCQkJbGlzdF9tb3ZlX3RhaWwoJmEtPmtub2RlX2J1cy5uX25vZGUsCi0JCQkJICAgICAgICZiLT5rbm9kZV9idXMubl9ub2RlKTsKKwkJCWxpc3RfbW92ZV90YWlsKCZhLT5wLT5rbm9kZV9idXMubl9ub2RlLAorCQkJCSAgICAgICAmYi0+cC0+a25vZGVfYnVzLm5fbm9kZSk7CiAJCQlyZXR1cm47CiAJCX0KIAl9Ci0JbGlzdF9tb3ZlX3RhaWwoJmEtPmtub2RlX2J1cy5uX25vZGUsIGxpc3QpOworCWxpc3RfbW92ZV90YWlsKCZhLT5wLT5rbm9kZV9idXMubl9ub2RlLCBsaXN0KTsKIH0KIAogdm9pZCBidXNfc29ydF9icmVhZHRoZmlyc3Qoc3RydWN0IGJ1c190eXBlICpidXMsCkBAIC0xMDE0LDYgKzEwMjYsNyBAQAogCUxJU1RfSEVBRChzb3J0ZWRfZGV2aWNlcyk7CiAJc3RydWN0IGxpc3RfaGVhZCAqcG9zLCAqdG1wOwogCXN0cnVjdCBrbGlzdF9ub2RlICpuOworCXN0cnVjdCBkZXZpY2VfcHJpdmF0ZSAqZGV2X3BydjsKIAlzdHJ1Y3QgZGV2aWNlICpkZXY7CiAJc3RydWN0IGtsaXN0ICpkZXZpY2Vfa2xpc3Q7CiAKQEAgLTEwMjIsNyArMTAzNSw4IEBACiAJc3Bpbl9sb2NrKCZkZXZpY2Vfa2xpc3QtPmtfbG9jayk7CiAJbGlzdF9mb3JfZWFjaF9zYWZlKHBvcywgdG1wLCAmZGV2aWNlX2tsaXN0LT5rX2xpc3QpIHsKIAkJbiA9IGNvbnRhaW5lcl9vZihwb3MsIHN0cnVjdCBrbGlzdF9ub2RlLCBuX25vZGUpOwotCQlkZXYgPSBjb250YWluZXJfb2Yobiwgc3RydWN0IGRldmljZSwga25vZGVfYnVzKTsKKwkJZGV2X3BydiA9IHRvX2RldmljZV9wcml2YXRlX2J1cyhuKTsKKwkJZGV2ID0gZGV2X3Bydi0+ZGV2aWNlOwogCQlkZXZpY2VfaW5zZXJ0aW9uX3NvcnRfa2xpc3QoZGV2LCAmc29ydGVkX2RldmljZXMsIGNvbXBhcmUpOwogCX0KIAlsaXN0X3NwbGljZSgmc29ydGVkX2RldmljZXMsICZkZXZpY2Vfa2xpc3QtPmtfbGlzdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvY29yZS5jIGIvZHJpdmVycy9iYXNlL2NvcmUuYwppbmRleCA4YzJjYzI2Li42MWRmNTA4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvY29yZS5jCisrKyBiL2RyaXZlcnMvYmFzZS9jb3JlLmMKQEAgLTEwOSw2ICsxMDksNyBAQAogc3RhdGljIHZvaWQgZGV2aWNlX3JlbGVhc2Uoc3RydWN0IGtvYmplY3QgKmtvYmopCiB7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gdG9fZGV2KGtvYmopOworCXN0cnVjdCBkZXZpY2VfcHJpdmF0ZSAqcCA9IGRldi0+cDsKIAogCWlmIChkZXYtPnJlbGVhc2UpCiAJCWRldi0+cmVsZWFzZShkZXYpOwpAQCAtMTE5LDcgKzEyMCw4IEBACiAJZWxzZQogCQlXQVJOKDEsIEtFUk5fRVJSICJEZXZpY2UgJyVzJyBkb2VzIG5vdCBoYXZlIGEgcmVsZWFzZSgpICIKIAkJCSJmdW5jdGlvbiwgaXQgaXMgYnJva2VuIGFuZCBtdXN0IGJlIGZpeGVkLlxuIiwKLQkJCWRldi0+YnVzX2lkKTsKKwkJCWRldl9uYW1lKGRldikpOworCWtmcmVlKHApOwogfQogCiBzdGF0aWMgc3RydWN0IGtvYmpfdHlwZSBkZXZpY2Vfa3R5cGUgPSB7CkBAIC0yMDksNyArMjExLDcgQEAKIAkJcmV0dmFsID0gZGV2LT5idXMtPnVldmVudChkZXYsIGVudik7CiAJCWlmIChyZXR2YWwpCiAJCQlwcl9kZWJ1ZygiZGV2aWNlOiAnJXMnOiAlczogYnVzIHVldmVudCgpIHJldHVybmVkICVkXG4iLAotCQkJCSBkZXYtPmJ1c19pZCwgX19mdW5jX18sIHJldHZhbCk7CisJCQkJIGRldl9uYW1lKGRldiksIF9fZnVuY19fLCByZXR2YWwpOwogCX0KIAogCS8qIGhhdmUgdGhlIGNsYXNzIHNwZWNpZmljIGZ1bmN0aW9uIGFkZCBpdHMgc3R1ZmYgKi8KQEAgLTIxNyw3ICsyMTksNyBAQAogCQlyZXR2YWwgPSBkZXYtPmNsYXNzLT5kZXZfdWV2ZW50KGRldiwgZW52KTsKIAkJaWYgKHJldHZhbCkKIAkJCXByX2RlYnVnKCJkZXZpY2U6ICclcyc6ICVzOiBjbGFzcyB1ZXZlbnQoKSAiCi0JCQkJICJyZXR1cm5lZCAlZFxuIiwgZGV2LT5idXNfaWQsCisJCQkJICJyZXR1cm5lZCAlZFxuIiwgZGV2X25hbWUoZGV2KSwKIAkJCQkgX19mdW5jX18sIHJldHZhbCk7CiAJfQogCkBAIC0yMjYsNyArMjI4LDcgQEAKIAkJcmV0dmFsID0gZGV2LT50eXBlLT51ZXZlbnQoZGV2LCBlbnYpOwogCQlpZiAocmV0dmFsKQogCQkJcHJfZGVidWcoImRldmljZTogJyVzJzogJXM6IGRldl90eXBlIHVldmVudCgpICIKLQkJCQkgInJldHVybmVkICVkXG4iLCBkZXYtPmJ1c19pZCwKKwkJCQkgInJldHVybmVkICVkXG4iLCBkZXZfbmFtZShkZXYpLAogCQkJCSBfX2Z1bmNfXywgcmV0dmFsKTsKIAl9CiAKQEAgLTUwNywxNCArNTA5LDE2IEBACiAKIHN0YXRpYyB2b2lkIGtsaXN0X2NoaWxkcmVuX2dldChzdHJ1Y3Qga2xpc3Rfbm9kZSAqbikKIHsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBjb250YWluZXJfb2Yobiwgc3RydWN0IGRldmljZSwga25vZGVfcGFyZW50KTsKKwlzdHJ1Y3QgZGV2aWNlX3ByaXZhdGUgKnAgPSB0b19kZXZpY2VfcHJpdmF0ZV9wYXJlbnQobik7CisJc3RydWN0IGRldmljZSAqZGV2ID0gcC0+ZGV2aWNlOwogCiAJZ2V0X2RldmljZShkZXYpOwogfQogCiBzdGF0aWMgdm9pZCBrbGlzdF9jaGlsZHJlbl9wdXQoc3RydWN0IGtsaXN0X25vZGUgKm4pCiB7Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gY29udGFpbmVyX29mKG4sIHN0cnVjdCBkZXZpY2UsIGtub2RlX3BhcmVudCk7CisJc3RydWN0IGRldmljZV9wcml2YXRlICpwID0gdG9fZGV2aWNlX3ByaXZhdGVfcGFyZW50KG4pOworCXN0cnVjdCBkZXZpY2UgKmRldiA9IHAtPmRldmljZTsKIAogCXB1dF9kZXZpY2UoZGV2KTsKIH0KQEAgLTUzNiw5ICs1NDAsMTUgQEAKICAqLwogdm9pZCBkZXZpY2VfaW5pdGlhbGl6ZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CisJZGV2LT5wID0ga3phbGxvYyhzaXplb2YoKmRldi0+cCksIEdGUF9LRVJORUwpOworCWlmICghZGV2LT5wKSB7CisJCVdBUk5fT04oMSk7CisJCXJldHVybjsKKwl9CisJZGV2LT5wLT5kZXZpY2UgPSBkZXY7CiAJZGV2LT5rb2JqLmtzZXQgPSBkZXZpY2VzX2tzZXQ7CiAJa29iamVjdF9pbml0KCZkZXYtPmtvYmosICZkZXZpY2Vfa3R5cGUpOwotCWtsaXN0X2luaXQoJmRldi0+a2xpc3RfY2hpbGRyZW4sIGtsaXN0X2NoaWxkcmVuX2dldCwKKwlrbGlzdF9pbml0KCZkZXYtPnAtPmtsaXN0X2NoaWxkcmVuLCBrbGlzdF9jaGlsZHJlbl9nZXQsCiAJCSAgIGtsaXN0X2NoaWxkcmVuX3B1dCk7CiAJSU5JVF9MSVNUX0hFQUQoJmRldi0+ZG1hX3Bvb2xzKTsKIAlpbml0X01VVEVYKCZkZXYtPnNlbSk7CkBAIC02NzIsNyArNjgyLDcgQEAKIAlpZiAoZGV2LT5rb2JqLnBhcmVudCAhPSAmZGV2LT5jbGFzcy0+cC0+Y2xhc3Nfc3Vic3lzLmtvYmogJiYKIAkgICAgZGV2aWNlX2lzX25vdF9wYXJ0aXRpb24oZGV2KSkgewogCQllcnJvciA9IHN5c2ZzX2NyZWF0ZV9saW5rKCZkZXYtPmNsYXNzLT5wLT5jbGFzc19zdWJzeXMua29iaiwKLQkJCQkJICAmZGV2LT5rb2JqLCBkZXYtPmJ1c19pZCk7CisJCQkJCSAgJmRldi0+a29iaiwgZGV2X25hbWUoZGV2KSk7CiAJCWlmIChlcnJvcikKIAkJCWdvdG8gb3V0X3N1YnN5czsKIAl9CkBAIC03MTIsMTEgKzcyMiwxMSBAQAogCWlmIChkZXYtPmtvYmoucGFyZW50ICE9ICZkZXYtPmNsYXNzLT5wLT5jbGFzc19zdWJzeXMua29iaiAmJgogCSAgICBkZXZpY2VfaXNfbm90X3BhcnRpdGlvbihkZXYpKQogCQlzeXNmc19yZW1vdmVfbGluaygmZGV2LT5jbGFzcy0+cC0+Y2xhc3Nfc3Vic3lzLmtvYmosCi0JCQkJICBkZXYtPmJ1c19pZCk7CisJCQkJICBkZXZfbmFtZShkZXYpKTsKICNlbHNlCiAJLyogbGluayBpbiB0aGUgY2xhc3MgZGlyZWN0b3J5IHBvaW50aW5nIHRvIHRoZSBkZXZpY2UgKi8KIAllcnJvciA9IHN5c2ZzX2NyZWF0ZV9saW5rKCZkZXYtPmNsYXNzLT5wLT5jbGFzc19zdWJzeXMua29iaiwKLQkJCQkgICZkZXYtPmtvYmosIGRldi0+YnVzX2lkKTsKKwkJCQkgICZkZXYtPmtvYmosIGRldl9uYW1lKGRldikpOwogCWlmIChlcnJvcikKIAkJZ290byBvdXRfc3Vic3lzOwogCkBAIC03MjksNyArNzM5LDcgQEAKIAlyZXR1cm4gMDsKIAogb3V0X2J1c2lkOgotCXN5c2ZzX3JlbW92ZV9saW5rKCZkZXYtPmNsYXNzLT5wLT5jbGFzc19zdWJzeXMua29iaiwgZGV2LT5idXNfaWQpOworCXN5c2ZzX3JlbW92ZV9saW5rKCZkZXYtPmNsYXNzLT5wLT5jbGFzc19zdWJzeXMua29iaiwgZGV2X25hbWUoZGV2KSk7CiAjZW5kaWYKIAogb3V0X3N1YnN5czoKQEAgLTc1OCwxMiArNzY4LDEyIEBACiAJaWYgKGRldi0+a29iai5wYXJlbnQgIT0gJmRldi0+Y2xhc3MtPnAtPmNsYXNzX3N1YnN5cy5rb2JqICYmCiAJICAgIGRldmljZV9pc19ub3RfcGFydGl0aW9uKGRldikpCiAJCXN5c2ZzX3JlbW92ZV9saW5rKCZkZXYtPmNsYXNzLT5wLT5jbGFzc19zdWJzeXMua29iaiwKLQkJCQkgIGRldi0+YnVzX2lkKTsKKwkJCQkgIGRldl9uYW1lKGRldikpOwogI2Vsc2UKIAlpZiAoZGV2LT5wYXJlbnQgJiYgZGV2aWNlX2lzX25vdF9wYXJ0aXRpb24oZGV2KSkKIAkJc3lzZnNfcmVtb3ZlX2xpbmsoJmRldi0+a29iaiwgImRldmljZSIpOwogCi0Jc3lzZnNfcmVtb3ZlX2xpbmsoJmRldi0+Y2xhc3MtPnAtPmNsYXNzX3N1YnN5cy5rb2JqLCBkZXYtPmJ1c19pZCk7CisJc3lzZnNfcmVtb3ZlX2xpbmsoJmRldi0+Y2xhc3MtPnAtPmNsYXNzX3N1YnN5cy5rb2JqLCBkZXZfbmFtZShkZXYpKTsKICNlbmRpZgogCiAJc3lzZnNfcmVtb3ZlX2xpbmsoJmRldi0+a29iaiwgInN1YnN5c3RlbSIpOwpAQCAtODY2LDcgKzg3Niw3IEBACiAJaWYgKCFzdHJsZW4oZGV2LT5idXNfaWQpKQogCQlnb3RvIGRvbmU7CiAKLQlwcl9kZWJ1ZygiZGV2aWNlOiAnJXMnOiAlc1xuIiwgZGV2LT5idXNfaWQsIF9fZnVuY19fKTsKKwlwcl9kZWJ1ZygiZGV2aWNlOiAnJXMnOiAlc1xuIiwgZGV2X25hbWUoZGV2KSwgX19mdW5jX18pOwogCiAJcGFyZW50ID0gZ2V0X2RldmljZShkZXYtPnBhcmVudCk7CiAJc2V0dXBfcGFyZW50KGRldiwgcGFyZW50KTsKQEAgLTg3Niw3ICs4ODYsNyBAQAogCQlzZXRfZGV2X25vZGUoZGV2LCBkZXZfdG9fbm9kZShwYXJlbnQpKTsKIAogCS8qIGZpcnN0LCByZWdpc3RlciB3aXRoIGdlbmVyaWMgbGF5ZXIuICovCi0JZXJyb3IgPSBrb2JqZWN0X2FkZCgmZGV2LT5rb2JqLCBkZXYtPmtvYmoucGFyZW50LCAiJXMiLCBkZXYtPmJ1c19pZCk7CisJZXJyb3IgPSBrb2JqZWN0X2FkZCgmZGV2LT5rb2JqLCBkZXYtPmtvYmoucGFyZW50LCAiJXMiLCBkZXZfbmFtZShkZXYpKTsKIAlpZiAoZXJyb3IpCiAJCWdvdG8gRXJyb3I7CiAKQEAgLTg4NCwxMSArODk0LDYgQEAKIAlpZiAocGxhdGZvcm1fbm90aWZ5KQogCQlwbGF0Zm9ybV9ub3RpZnkoZGV2KTsKIAotCS8qIG5vdGlmeSBjbGllbnRzIG9mIGRldmljZSBlbnRyeSAobmV3IHdheSkgKi8KLQlpZiAoZGV2LT5idXMpCi0JCWJsb2NraW5nX25vdGlmaWVyX2NhbGxfY2hhaW4oJmRldi0+YnVzLT5wLT5idXNfbm90aWZpZXIsCi0JCQkJCSAgICAgQlVTX05PVElGWV9BRERfREVWSUNFLCBkZXYpOwotCiAJZXJyb3IgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmdWV2ZW50X2F0dHIpOwogCWlmIChlcnJvcikKIAkJZ290byBhdHRyRXJyb3I7CkBAIC05MTYsMTAgKzkyMSwxOSBAQAogCWlmIChlcnJvcikKIAkJZ290byBEUE1FcnJvcjsKIAlkZXZpY2VfcG1fYWRkKGRldik7CisKKwkvKiBOb3RpZnkgY2xpZW50cyBvZiBkZXZpY2UgYWRkaXRpb24uICBUaGlzIGNhbGwgbXVzdCBjb21lCisJICogYWZ0ZXIgZHBtX3N5c2ZfYWRkKCkgYW5kIGJlZm9yZSBrb2JqZWN0X3VldmVudCgpLgorCSAqLworCWlmIChkZXYtPmJ1cykKKwkJYmxvY2tpbmdfbm90aWZpZXJfY2FsbF9jaGFpbigmZGV2LT5idXMtPnAtPmJ1c19ub3RpZmllciwKKwkJCQkJICAgICBCVVNfTk9USUZZX0FERF9ERVZJQ0UsIGRldik7CisKIAlrb2JqZWN0X3VldmVudCgmZGV2LT5rb2JqLCBLT0JKX0FERCk7CiAJYnVzX2F0dGFjaF9kZXZpY2UoZGV2KTsKIAlpZiAocGFyZW50KQotCQlrbGlzdF9hZGRfdGFpbCgmZGV2LT5rbm9kZV9wYXJlbnQsICZwYXJlbnQtPmtsaXN0X2NoaWxkcmVuKTsKKwkJa2xpc3RfYWRkX3RhaWwoJmRldi0+cC0+a25vZGVfcGFyZW50LAorCQkJICAgICAgICZwYXJlbnQtPnAtPmtsaXN0X2NoaWxkcmVuKTsKIAogCWlmIChkZXYtPmNsYXNzKSB7CiAJCW11dGV4X2xvY2soJmRldi0+Y2xhc3MtPnAtPmNsYXNzX211dGV4KTsKQEAgLTk0MCw5ICs5NTQsNiBAQAogIERQTUVycm9yOgogCWJ1c19yZW1vdmVfZGV2aWNlKGRldik7CiAgQnVzRXJyb3I6Ci0JaWYgKGRldi0+YnVzKQotCQlibG9ja2luZ19ub3RpZmllcl9jYWxsX2NoYWluKCZkZXYtPmJ1cy0+cC0+YnVzX25vdGlmaWVyLAotCQkJCQkgICAgIEJVU19OT1RJRllfREVMX0RFVklDRSwgZGV2KTsKIAlkZXZpY2VfcmVtb3ZlX2F0dHJzKGRldik7CiAgQXR0cnNFcnJvcjoKIAlkZXZpY2VfcmVtb3ZlX2NsYXNzX3N5bWxpbmtzKGRldik7CkBAIC0xMDI3LDEwICsxMDM4LDE2IEBACiAJc3RydWN0IGRldmljZSAqcGFyZW50ID0gZGV2LT5wYXJlbnQ7CiAJc3RydWN0IGNsYXNzX2ludGVyZmFjZSAqY2xhc3NfaW50ZjsKIAorCS8qIE5vdGlmeSBjbGllbnRzIG9mIGRldmljZSByZW1vdmFsLiAgVGhpcyBjYWxsIG11c3QgY29tZQorCSAqIGJlZm9yZSBkcG1fc3lzZnNfcmVtb3ZlKCkuCisJICovCisJaWYgKGRldi0+YnVzKQorCQlibG9ja2luZ19ub3RpZmllcl9jYWxsX2NoYWluKCZkZXYtPmJ1cy0+cC0+YnVzX25vdGlmaWVyLAorCQkJCQkgICAgIEJVU19OT1RJRllfREVMX0RFVklDRSwgZGV2KTsKIAlkZXZpY2VfcG1fcmVtb3ZlKGRldik7CiAJZHBtX3N5c2ZzX3JlbW92ZShkZXYpOwogCWlmIChwYXJlbnQpCi0JCWtsaXN0X2RlbCgmZGV2LT5rbm9kZV9wYXJlbnQpOworCQlrbGlzdF9kZWwoJmRldi0+cC0+a25vZGVfcGFyZW50KTsKIAlpZiAoTUFKT1IoZGV2LT5kZXZ0KSkgewogCQlkZXZpY2VfcmVtb3ZlX3N5c19kZXZfZW50cnkoZGV2KTsKIAkJZGV2aWNlX3JlbW92ZV9maWxlKGRldiwgJmRldnRfYXR0cik7CkBAIC0xMDY0LDkgKzEwODEsNiBAQAogCSAqLwogCWlmIChwbGF0Zm9ybV9ub3RpZnlfcmVtb3ZlKQogCQlwbGF0Zm9ybV9ub3RpZnlfcmVtb3ZlKGRldik7Ci0JaWYgKGRldi0+YnVzKQotCQlibG9ja2luZ19ub3RpZmllcl9jYWxsX2NoYWluKCZkZXYtPmJ1cy0+cC0+YnVzX25vdGlmaWVyLAotCQkJCQkgICAgIEJVU19OT1RJRllfREVMX0RFVklDRSwgZGV2KTsKIAlrb2JqZWN0X3VldmVudCgmZGV2LT5rb2JqLCBLT0JKX1JFTU9WRSk7CiAJY2xlYW51cF9kZXZpY2VfcGFyZW50KGRldik7CiAJa29iamVjdF9kZWwoJmRldi0+a29iaik7CkBAIC0xMDg2LDcgKzExMDAsNyBAQAogICovCiB2b2lkIGRldmljZV91bnJlZ2lzdGVyKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlwcl9kZWJ1ZygiZGV2aWNlOiAnJXMnOiAlc1xuIiwgZGV2LT5idXNfaWQsIF9fZnVuY19fKTsKKwlwcl9kZWJ1ZygiZGV2aWNlOiAnJXMnOiAlc1xuIiwgZGV2X25hbWUoZGV2KSwgX19mdW5jX18pOwogCWRldmljZV9kZWwoZGV2KTsKIAlwdXRfZGV2aWNlKGRldik7CiB9CkBAIC0xMDk0LDcgKzExMDgsMTQgQEAKIHN0YXRpYyBzdHJ1Y3QgZGV2aWNlICpuZXh0X2RldmljZShzdHJ1Y3Qga2xpc3RfaXRlciAqaSkKIHsKIAlzdHJ1Y3Qga2xpc3Rfbm9kZSAqbiA9IGtsaXN0X25leHQoaSk7Ci0JcmV0dXJuIG4gPyBjb250YWluZXJfb2Yobiwgc3RydWN0IGRldmljZSwga25vZGVfcGFyZW50KSA6IE5VTEw7CisJc3RydWN0IGRldmljZSAqZGV2ID0gTlVMTDsKKwlzdHJ1Y3QgZGV2aWNlX3ByaXZhdGUgKnA7CisKKwlpZiAobikgeworCQlwID0gdG9fZGV2aWNlX3ByaXZhdGVfcGFyZW50KG4pOworCQlkZXYgPSBwLT5kZXZpY2U7CisJfQorCXJldHVybiBkZXY7CiB9CiAKIC8qKgpAQCAtMTExNiw3ICsxMTM3LDcgQEAKIAlzdHJ1Y3QgZGV2aWNlICpjaGlsZDsKIAlpbnQgZXJyb3IgPSAwOwogCi0Ja2xpc3RfaXRlcl9pbml0KCZwYXJlbnQtPmtsaXN0X2NoaWxkcmVuLCAmaSk7CisJa2xpc3RfaXRlcl9pbml0KCZwYXJlbnQtPnAtPmtsaXN0X2NoaWxkcmVuLCAmaSk7CiAJd2hpbGUgKChjaGlsZCA9IG5leHRfZGV2aWNlKCZpKSkgJiYgIWVycm9yKQogCQllcnJvciA9IGZuKGNoaWxkLCBkYXRhKTsKIAlrbGlzdF9pdGVyX2V4aXQoJmkpOwpAQCAtMTE0Nyw3ICsxMTY4LDcgQEAKIAlpZiAoIXBhcmVudCkKIAkJcmV0dXJuIE5VTEw7CiAKLQlrbGlzdF9pdGVyX2luaXQoJnBhcmVudC0+a2xpc3RfY2hpbGRyZW4sICZpKTsKKwlrbGlzdF9pdGVyX2luaXQoJnBhcmVudC0+cC0+a2xpc3RfY2hpbGRyZW4sICZpKTsKIAl3aGlsZSAoKGNoaWxkID0gbmV4dF9kZXZpY2UoJmkpKSkKIAkJaWYgKG1hdGNoKGNoaWxkLCBkYXRhKSAmJiBnZXRfZGV2aWNlKGNoaWxkKSkKIAkJCWJyZWFrOwpAQCAtMTE5NiwxMCArMTIxNywxMDEgQEAKIEVYUE9SVF9TWU1CT0xfR1BMKGRldmljZV9jcmVhdGVfZmlsZSk7CiBFWFBPUlRfU1lNQk9MX0dQTChkZXZpY2VfcmVtb3ZlX2ZpbGUpOwogCitzdHJ1Y3Qgcm9vdF9kZXZpY2UKK3sKKwlzdHJ1Y3QgZGV2aWNlIGRldjsKKwlzdHJ1Y3QgbW9kdWxlICpvd25lcjsKK307CisKKyNkZWZpbmUgdG9fcm9vdF9kZXZpY2UoZGV2KSBjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3Qgcm9vdF9kZXZpY2UsIGRldikKKworc3RhdGljIHZvaWQgcm9vdF9kZXZpY2VfcmVsZWFzZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJa2ZyZWUodG9fcm9vdF9kZXZpY2UoZGV2KSk7Cit9CisKKy8qKgorICogX19yb290X2RldmljZV9yZWdpc3RlciAtIGFsbG9jYXRlIGFuZCByZWdpc3RlciBhIHJvb3QgZGV2aWNlCisgKiBAbmFtZTogcm9vdCBkZXZpY2UgbmFtZQorICogQG93bmVyOiBvd25lciBtb2R1bGUgb2YgdGhlIHJvb3QgZGV2aWNlLCB1c3VhbGx5IFRISVNfTU9EVUxFCisgKgorICogVGhpcyBmdW5jdGlvbiBhbGxvY2F0ZXMgYSByb290IGRldmljZSBhbmQgcmVnaXN0ZXJzIGl0CisgKiB1c2luZyBkZXZpY2VfcmVnaXN0ZXIoKS4gSW4gb3JkZXIgdG8gZnJlZSB0aGUgcmV0dXJuZWQKKyAqIGRldmljZSwgdXNlIHJvb3RfZGV2aWNlX3VucmVnaXN0ZXIoKS4KKyAqCisgKiBSb290IGRldmljZXMgYXJlIGR1bW15IGRldmljZXMgd2hpY2ggYWxsb3cgb3RoZXIgZGV2aWNlcworICogdG8gYmUgZ3JvdXBlZCB1bmRlciAvc3lzL2RldmljZXMuIFVzZSB0aGlzIGZ1bmN0aW9uIHRvCisgKiBhbGxvY2F0ZSBhIHJvb3QgZGV2aWNlIGFuZCB0aGVuIHVzZSBpdCBhcyB0aGUgcGFyZW50IG9mCisgKiBhbnkgZGV2aWNlIHdoaWNoIHNob3VsZCBhcHBlYXIgdW5kZXIgL3N5cy9kZXZpY2VzL3tuYW1lfQorICoKKyAqIFRoZSAvc3lzL2RldmljZXMve25hbWV9IGRpcmVjdG9yeSB3aWxsIGFsc28gY29udGFpbiBhCisgKiAnbW9kdWxlJyBzeW1saW5rIHdoaWNoIHBvaW50cyB0byB0aGUgQG93bmVyIGRpcmVjdG9yeQorICogaW4gc3lzZnMuCisgKgorICogTm90ZTogWW91IHByb2JhYmx5IHdhbnQgdG8gdXNlIHJvb3RfZGV2aWNlX3JlZ2lzdGVyKCkuCisgKi8KK3N0cnVjdCBkZXZpY2UgKl9fcm9vdF9kZXZpY2VfcmVnaXN0ZXIoY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IG1vZHVsZSAqb3duZXIpCit7CisJc3RydWN0IHJvb3RfZGV2aWNlICpyb290OworCWludCBlcnIgPSAtRU5PTUVNOworCisJcm9vdCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCByb290X2RldmljZSksIEdGUF9LRVJORUwpOworCWlmICghcm9vdCkKKwkJcmV0dXJuIEVSUl9QVFIoZXJyKTsKKworCWVyciA9IGRldl9zZXRfbmFtZSgmcm9vdC0+ZGV2LCBuYW1lKTsKKwlpZiAoZXJyKSB7CisJCWtmcmVlKHJvb3QpOworCQlyZXR1cm4gRVJSX1BUUihlcnIpOworCX0KKworCXJvb3QtPmRldi5yZWxlYXNlID0gcm9vdF9kZXZpY2VfcmVsZWFzZTsKKworCWVyciA9IGRldmljZV9yZWdpc3Rlcigmcm9vdC0+ZGV2KTsKKwlpZiAoZXJyKSB7CisJCXB1dF9kZXZpY2UoJnJvb3QtPmRldik7CisJCXJldHVybiBFUlJfUFRSKGVycik7CisJfQorCisjaWZkZWYgQ09ORklHX01PRFVMRQkvKiBnb3R0YSBmaW5kIGEgImNsZWFuZXIiIHdheSB0byBkbyB0aGlzICovCisJaWYgKG93bmVyKSB7CisJCXN0cnVjdCBtb2R1bGVfa29iamVjdCAqbWsgPSAmb3duZXItPm1rb2JqOworCisJCWVyciA9IHN5c2ZzX2NyZWF0ZV9saW5rKCZyb290LT5kZXYua29iaiwgJm1rLT5rb2JqLCAibW9kdWxlIik7CisJCWlmIChlcnIpIHsKKwkJCWRldmljZV91bnJlZ2lzdGVyKCZyb290LT5kZXYpOworCQkJcmV0dXJuIEVSUl9QVFIoZXJyKTsKKwkJfQorCQlyb290LT5vd25lciA9IG93bmVyOworCX0KKyNlbmRpZgorCisJcmV0dXJuICZyb290LT5kZXY7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChfX3Jvb3RfZGV2aWNlX3JlZ2lzdGVyKTsKKworLyoqCisgKiByb290X2RldmljZV91bnJlZ2lzdGVyIC0gdW5yZWdpc3RlciBhbmQgZnJlZSBhIHJvb3QgZGV2aWNlCisgKiBAcm9vdDogZGV2aWNlIGdvaW5nIGF3YXkuCisgKgorICogVGhpcyBmdW5jdGlvbiB1bnJlZ2lzdGVycyBhbmQgY2xlYW5zIHVwIGEgZGV2aWNlIHRoYXQgd2FzIGNyZWF0ZWQgYnkKKyAqIHJvb3RfZGV2aWNlX3JlZ2lzdGVyKCkuCisgKi8KK3ZvaWQgcm9vdF9kZXZpY2VfdW5yZWdpc3RlcihzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHJvb3RfZGV2aWNlICpyb290ID0gdG9fcm9vdF9kZXZpY2UoZGV2KTsKKworCWlmIChyb290LT5vd25lcikKKwkJc3lzZnNfcmVtb3ZlX2xpbmsoJnJvb3QtPmRldi5rb2JqLCAibW9kdWxlIik7CisKKwlkZXZpY2VfdW5yZWdpc3RlcihkZXYpOworfQorRVhQT1JUX1NZTUJPTF9HUEwocm9vdF9kZXZpY2VfdW5yZWdpc3Rlcik7CisKIAogc3RhdGljIHZvaWQgZGV2aWNlX2NyZWF0ZV9yZWxlYXNlKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlwcl9kZWJ1ZygiZGV2aWNlOiAnJXMnOiAlc1xuIiwgZGV2LT5idXNfaWQsIF9fZnVuY19fKTsKKwlwcl9kZWJ1ZygiZGV2aWNlOiAnJXMnOiAlc1xuIiwgZGV2X25hbWUoZGV2KSwgX19mdW5jX18pOwogCWtmcmVlKGRldik7CiB9CiAKQEAgLTEzNDQsNyArMTQ1Niw3IEBACiAJaWYgKCFkZXYpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JcHJfZGVidWcoImRldmljZTogJyVzJzogJXM6IHJlbmFtaW5nIHRvICclcydcbiIsIGRldi0+YnVzX2lkLAorCXByX2RlYnVnKCJkZXZpY2U6ICclcyc6ICVzOiByZW5hbWluZyB0byAnJXMnXG4iLCBkZXZfbmFtZShkZXYpLAogCQkgX19mdW5jX18sIG5ld19uYW1lKTsKIAogI2lmZGVmIENPTkZJR19TWVNGU19ERVBSRUNBVEVECkBAIC0xMzgxLDcgKzE0OTMsNyBAQAogI2Vsc2UKIAlpZiAoZGV2LT5jbGFzcykgewogCQllcnJvciA9IHN5c2ZzX2NyZWF0ZV9saW5rX25vd2FybigmZGV2LT5jbGFzcy0+cC0+Y2xhc3Nfc3Vic3lzLmtvYmosCi0JCQkJCQkgJmRldi0+a29iaiwgZGV2LT5idXNfaWQpOworCQkJCQkJICZkZXYtPmtvYmosIGRldl9uYW1lKGRldikpOwogCQlpZiAoZXJyb3IpCiAJCQlnb3RvIG91dDsKIAkJc3lzZnNfcmVtb3ZlX2xpbmsoJmRldi0+Y2xhc3MtPnAtPmNsYXNzX3N1YnN5cy5rb2JqLApAQCAtMTQ1OSw4ICsxNTcxLDggQEAKIAluZXdfcGFyZW50ID0gZ2V0X2RldmljZShuZXdfcGFyZW50KTsKIAluZXdfcGFyZW50X2tvYmogPSBnZXRfZGV2aWNlX3BhcmVudChkZXYsIG5ld19wYXJlbnQpOwogCi0JcHJfZGVidWcoImRldmljZTogJyVzJzogJXM6IG1vdmluZyB0byAnJXMnXG4iLCBkZXYtPmJ1c19pZCwKLQkJIF9fZnVuY19fLCBuZXdfcGFyZW50ID8gbmV3X3BhcmVudC0+YnVzX2lkIDogIjxOVUxMPiIpOworCXByX2RlYnVnKCJkZXZpY2U6ICclcyc6ICVzOiBtb3ZpbmcgdG8gJyVzJ1xuIiwgZGV2X25hbWUoZGV2KSwKKwkJIF9fZnVuY19fLCBuZXdfcGFyZW50ID8gZGV2X25hbWUobmV3X3BhcmVudCkgOiAiPE5VTEw+Iik7CiAJZXJyb3IgPSBrb2JqZWN0X21vdmUoJmRldi0+a29iaiwgbmV3X3BhcmVudF9rb2JqKTsKIAlpZiAoZXJyb3IpIHsKIAkJY2xlYW51cF9nbHVlX2RpcihkZXYsIG5ld19wYXJlbnRfa29iaik7CkBAIC0xNDcwLDkgKzE1ODIsMTAgQEAKIAlvbGRfcGFyZW50ID0gZGV2LT5wYXJlbnQ7CiAJZGV2LT5wYXJlbnQgPSBuZXdfcGFyZW50OwogCWlmIChvbGRfcGFyZW50KQotCQlrbGlzdF9yZW1vdmUoJmRldi0+a25vZGVfcGFyZW50KTsKKwkJa2xpc3RfcmVtb3ZlKCZkZXYtPnAtPmtub2RlX3BhcmVudCk7CiAJaWYgKG5ld19wYXJlbnQpIHsKLQkJa2xpc3RfYWRkX3RhaWwoJmRldi0+a25vZGVfcGFyZW50LCAmbmV3X3BhcmVudC0+a2xpc3RfY2hpbGRyZW4pOworCQlrbGlzdF9hZGRfdGFpbCgmZGV2LT5wLT5rbm9kZV9wYXJlbnQsCisJCQkgICAgICAgJm5ld19wYXJlbnQtPnAtPmtsaXN0X2NoaWxkcmVuKTsKIAkJc2V0X2Rldl9ub2RlKGRldiwgZGV2X3RvX25vZGUobmV3X3BhcmVudCkpOwogCX0KIApAQCAtMTQ4NCwxMSArMTU5NywxMSBAQAogCQlkZXZpY2VfbW92ZV9jbGFzc19saW5rcyhkZXYsIG5ld19wYXJlbnQsIG9sZF9wYXJlbnQpOwogCQlpZiAoIWtvYmplY3RfbW92ZSgmZGV2LT5rb2JqLCAmb2xkX3BhcmVudC0+a29iaikpIHsKIAkJCWlmIChuZXdfcGFyZW50KQotCQkJCWtsaXN0X3JlbW92ZSgmZGV2LT5rbm9kZV9wYXJlbnQpOworCQkJCWtsaXN0X3JlbW92ZSgmZGV2LT5wLT5rbm9kZV9wYXJlbnQpOwogCQkJZGV2LT5wYXJlbnQgPSBvbGRfcGFyZW50OwogCQkJaWYgKG9sZF9wYXJlbnQpIHsKLQkJCQlrbGlzdF9hZGRfdGFpbCgmZGV2LT5rbm9kZV9wYXJlbnQsCi0JCQkJCSAgICAgICAmb2xkX3BhcmVudC0+a2xpc3RfY2hpbGRyZW4pOworCQkJCWtsaXN0X2FkZF90YWlsKCZkZXYtPnAtPmtub2RlX3BhcmVudCwKKwkJCQkJICAgICAgICZvbGRfcGFyZW50LT5wLT5rbGlzdF9jaGlsZHJlbik7CiAJCQkJc2V0X2Rldl9ub2RlKGRldiwgZGV2X3RvX25vZGUob2xkX3BhcmVudCkpOwogCQkJfQogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvZGQuYyBiL2RyaXZlcnMvYmFzZS9kZC5jCmluZGV4IDIwZmViYzAuLjZmZGFmNzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9kZC5jCisrKyBiL2RyaXZlcnMvYmFzZS9kZC5jCkBAIC0yOCwyMCArMjgsMjAgQEAKIAogc3RhdGljIHZvaWQgZHJpdmVyX2JvdW5kKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlpZiAoa2xpc3Rfbm9kZV9hdHRhY2hlZCgmZGV2LT5rbm9kZV9kcml2ZXIpKSB7CisJaWYgKGtsaXN0X25vZGVfYXR0YWNoZWQoJmRldi0+cC0+a25vZGVfZHJpdmVyKSkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogZGV2aWNlICVzIGFscmVhZHkgYm91bmRcbiIsCiAJCQlfX2Z1bmNfXywga29iamVjdF9uYW1lKCZkZXYtPmtvYmopKTsKIAkJcmV0dXJuOwogCX0KIAotCXByX2RlYnVnKCJkcml2ZXI6ICclcyc6ICVzOiBib3VuZCB0byBkZXZpY2UgJyVzJ1xuIiwgZGV2LT5idXNfaWQsCisJcHJfZGVidWcoImRyaXZlcjogJyVzJzogJXM6IGJvdW5kIHRvIGRldmljZSAnJXMnXG4iLCBkZXZfbmFtZShkZXYpLAogCQkgX19mdW5jX18sIGRldi0+ZHJpdmVyLT5uYW1lKTsKIAogCWlmIChkZXYtPmJ1cykKIAkJYmxvY2tpbmdfbm90aWZpZXJfY2FsbF9jaGFpbigmZGV2LT5idXMtPnAtPmJ1c19ub3RpZmllciwKIAkJCQkJICAgICBCVVNfTk9USUZZX0JPVU5EX0RSSVZFUiwgZGV2KTsKIAotCWtsaXN0X2FkZF90YWlsKCZkZXYtPmtub2RlX2RyaXZlciwgJmRldi0+ZHJpdmVyLT5wLT5rbGlzdF9kZXZpY2VzKTsKKwlrbGlzdF9hZGRfdGFpbCgmZGV2LT5wLT5rbm9kZV9kcml2ZXIsICZkZXYtPmRyaXZlci0+cC0+a2xpc3RfZGV2aWNlcyk7CiB9CiAKIHN0YXRpYyBpbnQgZHJpdmVyX3N5c2ZzX2FkZChzdHJ1Y3QgZGV2aWNlICpkZXYpCkBAIC0xMDQsMTMgKzEwNCwxMyBAQAogCiAJYXRvbWljX2luYygmcHJvYmVfY291bnQpOwogCXByX2RlYnVnKCJidXM6ICclcyc6ICVzOiBwcm9iaW5nIGRyaXZlciAlcyB3aXRoIGRldmljZSAlc1xuIiwKLQkJIGRydi0+YnVzLT5uYW1lLCBfX2Z1bmNfXywgZHJ2LT5uYW1lLCBkZXYtPmJ1c19pZCk7CisJCSBkcnYtPmJ1cy0+bmFtZSwgX19mdW5jX18sIGRydi0+bmFtZSwgZGV2X25hbWUoZGV2KSk7CiAJV0FSTl9PTighbGlzdF9lbXB0eSgmZGV2LT5kZXZyZXNfaGVhZCkpOwogCiAJZGV2LT5kcml2ZXIgPSBkcnY7CiAJaWYgKGRyaXZlcl9zeXNmc19hZGQoZGV2KSkgewogCQlwcmludGsoS0VSTl9FUlIgIiVzOiBkcml2ZXJfc3lzZnNfYWRkKCVzKSBmYWlsZWRcbiIsCi0JCQlfX2Z1bmNfXywgZGV2LT5idXNfaWQpOworCQkJX19mdW5jX18sIGRldl9uYW1lKGRldikpOwogCQlnb3RvIHByb2JlX2ZhaWxlZDsKIAl9CiAKQEAgLTEyNyw3ICsxMjcsNyBAQAogCWRyaXZlcl9ib3VuZChkZXYpOwogCXJldCA9IDE7CiAJcHJfZGVidWcoImJ1czogJyVzJzogJXM6IGJvdW5kIGRldmljZSAlcyB0byBkcml2ZXIgJXNcbiIsCi0JCSBkcnYtPmJ1cy0+bmFtZSwgX19mdW5jX18sIGRldi0+YnVzX2lkLCBkcnYtPm5hbWUpOworCQkgZHJ2LT5idXMtPm5hbWUsIF9fZnVuY19fLCBkZXZfbmFtZShkZXYpLCBkcnYtPm5hbWUpOwogCWdvdG8gZG9uZTsKIAogcHJvYmVfZmFpbGVkOgpAQCAtMTM5LDcgKzEzOSw3IEBACiAJCS8qIGRyaXZlciBtYXRjaGVkIGJ1dCB0aGUgcHJvYmUgZmFpbGVkICovCiAJCXByaW50ayhLRVJOX1dBUk5JTkcKIAkJICAgICAgICIlczogcHJvYmUgb2YgJXMgZmFpbGVkIHdpdGggZXJyb3IgJWRcbiIsCi0JCSAgICAgICBkcnYtPm5hbWUsIGRldi0+YnVzX2lkLCByZXQpOworCQkgICAgICAgZHJ2LT5uYW1lLCBkZXZfbmFtZShkZXYpLCByZXQpOwogCX0KIAkvKgogCSAqIElnbm9yZSBlcnJvcnMgcmV0dXJuZWQgYnkgLT5wcm9iZSBzbyB0aGF0IHRoZSBuZXh0IGRyaXZlciBjYW4gdHJ5CkBAIC0xOTQsNyArMTk0LDcgQEAKIAkJZ290byBkb25lOwogCiAJcHJfZGVidWcoImJ1czogJyVzJzogJXM6IG1hdGNoZWQgZGV2aWNlICVzIHdpdGggZHJpdmVyICVzXG4iLAotCQkgZHJ2LT5idXMtPm5hbWUsIF9fZnVuY19fLCBkZXYtPmJ1c19pZCwgZHJ2LT5uYW1lKTsKKwkJIGRydi0+YnVzLT5uYW1lLCBfX2Z1bmNfXywgZGV2X25hbWUoZGV2KSwgZHJ2LT5uYW1lKTsKIAogCXJldCA9IHJlYWxseV9wcm9iZShkZXYsIGRydik7CiAKQEAgLTI5OCw3ICsyOTgsNiBAQAogCWRydiA9IGRldi0+ZHJpdmVyOwogCWlmIChkcnYpIHsKIAkJZHJpdmVyX3N5c2ZzX3JlbW92ZShkZXYpOwotCQlzeXNmc19yZW1vdmVfbGluaygmZGV2LT5rb2JqLCAiZHJpdmVyIik7CiAKIAkJaWYgKGRldi0+YnVzKQogCQkJYmxvY2tpbmdfbm90aWZpZXJfY2FsbF9jaGFpbigmZGV2LT5idXMtPnAtPmJ1c19ub3RpZmllciwKQEAgLTMxMSw3ICszMTAsNyBAQAogCQkJZHJ2LT5yZW1vdmUoZGV2KTsKIAkJZGV2cmVzX3JlbGVhc2VfYWxsKGRldik7CiAJCWRldi0+ZHJpdmVyID0gTlVMTDsKLQkJa2xpc3RfcmVtb3ZlKCZkZXYtPmtub2RlX2RyaXZlcik7CisJCWtsaXN0X3JlbW92ZSgmZGV2LT5wLT5rbm9kZV9kcml2ZXIpOwogCX0KIH0KIApAQCAtMzQxLDYgKzM0MCw3IEBACiAgKi8KIHZvaWQgZHJpdmVyX2RldGFjaChzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2KQogeworCXN0cnVjdCBkZXZpY2VfcHJpdmF0ZSAqZGV2X3BydjsKIAlzdHJ1Y3QgZGV2aWNlICpkZXY7CiAKIAlmb3IgKDs7KSB7CkBAIC0zNDksOCArMzQ5LDEwIEBACiAJCQlzcGluX3VubG9jaygmZHJ2LT5wLT5rbGlzdF9kZXZpY2VzLmtfbG9jayk7CiAJCQlicmVhazsKIAkJfQotCQlkZXYgPSBsaXN0X2VudHJ5KGRydi0+cC0+a2xpc3RfZGV2aWNlcy5rX2xpc3QucHJldiwKLQkJCQlzdHJ1Y3QgZGV2aWNlLCBrbm9kZV9kcml2ZXIubl9ub2RlKTsKKwkJZGV2X3BydiA9IGxpc3RfZW50cnkoZHJ2LT5wLT5rbGlzdF9kZXZpY2VzLmtfbGlzdC5wcmV2LAorCQkJCSAgICAgc3RydWN0IGRldmljZV9wcml2YXRlLAorCQkJCSAgICAga25vZGVfZHJpdmVyLm5fbm9kZSk7CisJCWRldiA9IGRldl9wcnYtPmRldmljZTsKIAkJZ2V0X2RldmljZShkZXYpOwogCQlzcGluX3VubG9jaygmZHJ2LT5wLT5rbGlzdF9kZXZpY2VzLmtfbG9jayk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9kcml2ZXIuYyBiL2RyaXZlcnMvYmFzZS9kcml2ZXIuYwppbmRleCAxZTJiZGE3Li5iNzZjYzY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvZHJpdmVyLmMKKysrIGIvZHJpdmVycy9iYXNlL2RyaXZlci5jCkBAIC0xOSw3ICsxOSwxNCBAQAogc3RhdGljIHN0cnVjdCBkZXZpY2UgKm5leHRfZGV2aWNlKHN0cnVjdCBrbGlzdF9pdGVyICppKQogewogCXN0cnVjdCBrbGlzdF9ub2RlICpuID0ga2xpc3RfbmV4dChpKTsKLQlyZXR1cm4gbiA/IGNvbnRhaW5lcl9vZihuLCBzdHJ1Y3QgZGV2aWNlLCBrbm9kZV9kcml2ZXIpIDogTlVMTDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBOVUxMOworCXN0cnVjdCBkZXZpY2VfcHJpdmF0ZSAqZGV2X3BydjsKKworCWlmIChuKSB7CisJCWRldl9wcnYgPSB0b19kZXZpY2VfcHJpdmF0ZV9kcml2ZXIobik7CisJCWRldiA9IGRldl9wcnYtPmRldmljZTsKKwl9CisJcmV0dXJuIGRldjsKIH0KIAogLyoqCkBAIC00Miw3ICs0OSw3IEBACiAJCXJldHVybiAtRUlOVkFMOwogCiAJa2xpc3RfaXRlcl9pbml0X25vZGUoJmRydi0+cC0+a2xpc3RfZGV2aWNlcywgJmksCi0JCQkgICAgIHN0YXJ0ID8gJnN0YXJ0LT5rbm9kZV9kcml2ZXIgOiBOVUxMKTsKKwkJCSAgICAgc3RhcnQgPyAmc3RhcnQtPnAtPmtub2RlX2RyaXZlciA6IE5VTEwpOwogCXdoaWxlICgoZGV2ID0gbmV4dF9kZXZpY2UoJmkpKSAmJiAhZXJyb3IpCiAJCWVycm9yID0gZm4oZGV2LCBkYXRhKTsKIAlrbGlzdF9pdGVyX2V4aXQoJmkpOwpAQCAtNzYsNyArODMsNyBAQAogCQlyZXR1cm4gTlVMTDsKIAogCWtsaXN0X2l0ZXJfaW5pdF9ub2RlKCZkcnYtPnAtPmtsaXN0X2RldmljZXMsICZpLAotCQkJICAgICAoc3RhcnQgPyAmc3RhcnQtPmtub2RlX2RyaXZlciA6IE5VTEwpKTsKKwkJCSAgICAgKHN0YXJ0ID8gJnN0YXJ0LT5wLT5rbm9kZV9kcml2ZXIgOiBOVUxMKSk7CiAJd2hpbGUgKChkZXYgPSBuZXh0X2RldmljZSgmaSkpKQogCQlpZiAobWF0Y2goZGV2LCBkYXRhKSAmJiBnZXRfZGV2aWNlKGRldikpCiAJCQlicmVhazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9maXJtd2FyZV9jbGFzcy5jIGIvZHJpdmVycy9iYXNlL2Zpcm13YXJlX2NsYXNzLmMKaW5kZXggYjdlNTcxMC4uNDQ2OTlkOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL2Zpcm13YXJlX2NsYXNzLmMKKysrIGIvZHJpdmVycy9iYXNlL2Zpcm13YXJlX2NsYXNzLmMKQEAgLTI5MSwxMiArMjkxLDYgQEAKIAlmd19sb2FkX2Fib3J0KGZ3X3ByaXYpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgZndfc2V0dXBfZGV2aWNlX2lkKHN0cnVjdCBkZXZpY2UgKmZfZGV2LCBzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0JLyogWFhYIHdhcm5pbmcgd2Ugc2hvdWxkIHdhdGNoIG91dCBmb3IgbmFtZSBjb2xsaXNpb25zICovCi0Jc3RybGNweShmX2Rldi0+YnVzX2lkLCBkZXYtPmJ1c19pZCwgQlVTX0lEX1NJWkUpOwotfQotCiBzdGF0aWMgaW50IGZ3X3JlZ2lzdGVyX2RldmljZShzdHJ1Y3QgZGV2aWNlICoqZGV2X3AsIGNvbnN0IGNoYXIgKmZ3X25hbWUsCiAJCQkgICAgICBzdHJ1Y3QgZGV2aWNlICpkZXZpY2UpCiB7CkBAIC0zMjEsNyArMzE1LDcgQEAKIAlmd19wcml2LT50aW1lb3V0LmRhdGEgPSAodV9sb25nKSBmd19wcml2OwogCWluaXRfdGltZXIoJmZ3X3ByaXYtPnRpbWVvdXQpOwogCi0JZndfc2V0dXBfZGV2aWNlX2lkKGZfZGV2LCBkZXZpY2UpOworCWRldl9zZXRfbmFtZShmX2RldiwgZGV2X25hbWUoZGV2aWNlKSk7CiAJZl9kZXYtPnBhcmVudCA9IGRldmljZTsKIAlmX2Rldi0+Y2xhc3MgPSAmZmlybXdhcmVfY2xhc3M7CiAJZGV2X3NldF9kcnZkYXRhKGZfZGV2LCBmd19wcml2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9pc2EuYyBiL2RyaXZlcnMvYmFzZS9pc2EuYwppbmRleCBlZmQ1Nzc1Li40Nzk2OTRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvaXNhLmMKKysrIGIvZHJpdmVycy9iYXNlL2lzYS5jCkBAIC0xMSw3ICsxMSw3IEBACiAjaW5jbHVkZSA8bGludXgvaXNhLmg+CiAKIHN0YXRpYyBzdHJ1Y3QgZGV2aWNlIGlzYV9idXMgPSB7Ci0JLmJ1c19pZAkJPSAiaXNhIgorCS5pbml0X25hbWUJPSAiaXNhIgogfTsKIAogc3RydWN0IGlzYV9kZXYgewpAQCAtMTM1LDkgKzEzNSw4IEBACiAJCWlzYV9kZXYtPmRldi5wYXJlbnQJPSAmaXNhX2J1czsKIAkJaXNhX2Rldi0+ZGV2LmJ1cwk9ICZpc2FfYnVzX3R5cGU7CiAKLQkJc25wcmludGYoaXNhX2Rldi0+ZGV2LmJ1c19pZCwgQlVTX0lEX1NJWkUsICIlcy4ldSIsCi0JCQkJaXNhX2RyaXZlci0+ZHJpdmVyLm5hbWUsIGlkKTsKLQorCQlkZXZfc2V0X25hbWUoJmlzYV9kZXYtPmRldiwgIiVzLiV1IiwKKwkJCSAgICAgaXNhX2RyaXZlci0+ZHJpdmVyLm5hbWUsIGlkKTsKIAkJaXNhX2Rldi0+ZGV2LnBsYXRmb3JtX2RhdGEJPSBpc2FfZHJpdmVyOwogCQlpc2FfZGV2LT5kZXYucmVsZWFzZQkJPSBpc2FfZGV2X3JlbGVhc2U7CiAJCWlzYV9kZXYtPmlkCQkJPSBpZDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9tZW1vcnkuYyBiL2RyaXZlcnMvYmFzZS9tZW1vcnkuYwppbmRleCA1MjYwZTllLi45ODk0MjljIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvbWVtb3J5LmMKKysrIGIvZHJpdmVycy9iYXNlL21lbW9yeS5jCkBAIC0zNDcsOCArMzQ3LDkgQEAKICAqIHNlY3Rpb24gYmVsb25ncyB0by4uLgogICovCiAKLXN0YXRpYyBpbnQgYWRkX21lbW9yeV9ibG9jayh1bnNpZ25lZCBsb25nIG5vZGVfaWQsIHN0cnVjdCBtZW1fc2VjdGlvbiAqc2VjdGlvbiwKLQkJICAgICB1bnNpZ25lZCBsb25nIHN0YXRlLCBpbnQgcGh5c19kZXZpY2UpCitzdGF0aWMgaW50IGFkZF9tZW1vcnlfYmxvY2soaW50IG5pZCwgc3RydWN0IG1lbV9zZWN0aW9uICpzZWN0aW9uLAorCQkJdW5zaWduZWQgbG9uZyBzdGF0ZSwgaW50IHBoeXNfZGV2aWNlLAorCQkJZW51bSBtZW1fYWRkX2NvbnRleHQgY29udGV4dCkKIHsKIAlzdHJ1Y3QgbWVtb3J5X2Jsb2NrICptZW0gPSBremFsbG9jKHNpemVvZigqbWVtKSwgR0ZQX0tFUk5FTCk7CiAJaW50IHJldCA9IDA7CkBAIC0zNzAsNiArMzcxLDEwIEBACiAJCXJldCA9IG1lbV9jcmVhdGVfc2ltcGxlX2ZpbGUobWVtLCBwaHlzX2RldmljZSk7CiAJaWYgKCFyZXQpCiAJCXJldCA9IG1lbV9jcmVhdGVfc2ltcGxlX2ZpbGUobWVtLCByZW1vdmFibGUpOworCWlmICghcmV0KSB7CisJCWlmIChjb250ZXh0ID09IEhPVFBMVUcpCisJCQlyZXQgPSByZWdpc3Rlcl9tZW1fc2VjdF91bmRlcl9ub2RlKG1lbSwgbmlkKTsKKwl9CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtMzgyLDcgKzM4Nyw3IEBACiAgKgogICogVGhpcyBjb3VsZCBiZSBtYWRlIGdlbmVyaWMgZm9yIGFsbCBzeXNkZXYgY2xhc3Nlcy4KICAqLwotc3RhdGljIHN0cnVjdCBtZW1vcnlfYmxvY2sgKmZpbmRfbWVtb3J5X2Jsb2NrKHN0cnVjdCBtZW1fc2VjdGlvbiAqc2VjdGlvbikKK3N0cnVjdCBtZW1vcnlfYmxvY2sgKmZpbmRfbWVtb3J5X2Jsb2NrKHN0cnVjdCBtZW1fc2VjdGlvbiAqc2VjdGlvbikKIHsKIAlzdHJ1Y3Qga29iamVjdCAqa29iajsKIAlzdHJ1Y3Qgc3lzX2RldmljZSAqc3lzZGV2OwpAQCAtNDExLDYgKzQxNiw3IEBACiAJc3RydWN0IG1lbW9yeV9ibG9jayAqbWVtOwogCiAJbWVtID0gZmluZF9tZW1vcnlfYmxvY2soc2VjdGlvbik7CisJdW5yZWdpc3Rlcl9tZW1fc2VjdF91bmRlcl9ub2RlcyhtZW0pOwogCW1lbV9yZW1vdmVfc2ltcGxlX2ZpbGUobWVtLCBwaHlzX2luZGV4KTsKIAltZW1fcmVtb3ZlX3NpbXBsZV9maWxlKG1lbSwgc3RhdGUpOwogCW1lbV9yZW1vdmVfc2ltcGxlX2ZpbGUobWVtLCBwaHlzX2RldmljZSk7CkBAIC00MjQsOSArNDMwLDkgQEAKICAqIG5lZWQgYW4gaW50ZXJmYWNlIGZvciB0aGUgVk0gdG8gYWRkIG5ldyBtZW1vcnkgcmVnaW9ucywKICAqIGJ1dCB3aXRob3V0IG9ubGluaW5nIGl0LgogICovCi1pbnQgcmVnaXN0ZXJfbmV3X21lbW9yeShzdHJ1Y3QgbWVtX3NlY3Rpb24gKnNlY3Rpb24pCitpbnQgcmVnaXN0ZXJfbmV3X21lbW9yeShpbnQgbmlkLCBzdHJ1Y3QgbWVtX3NlY3Rpb24gKnNlY3Rpb24pCiB7Ci0JcmV0dXJuIGFkZF9tZW1vcnlfYmxvY2soMCwgc2VjdGlvbiwgTUVNX09GRkxJTkUsIDApOworCXJldHVybiBhZGRfbWVtb3J5X2Jsb2NrKG5pZCwgc2VjdGlvbiwgTUVNX09GRkxJTkUsIDAsIEhPVFBMVUcpOwogfQogCiBpbnQgdW5yZWdpc3Rlcl9tZW1vcnlfc2VjdGlvbihzdHJ1Y3QgbWVtX3NlY3Rpb24gKnNlY3Rpb24pCkBAIC00NTgsNyArNDY0LDggQEAKIAlmb3IgKGkgPSAwOyBpIDwgTlJfTUVNX1NFQ1RJT05TOyBpKyspIHsKIAkJaWYgKCFwcmVzZW50X3NlY3Rpb25fbnIoaSkpCiAJCQljb250aW51ZTsKLQkJZXJyID0gYWRkX21lbW9yeV9ibG9jaygwLCBfX25yX3RvX3NlY3Rpb24oaSksIE1FTV9PTkxJTkUsIDApOworCQllcnIgPSBhZGRfbWVtb3J5X2Jsb2NrKDAsIF9fbnJfdG9fc2VjdGlvbihpKSwgTUVNX09OTElORSwKKwkJCQkJMCwgQk9PVCk7CiAJCWlmICghcmV0KQogCQkJcmV0ID0gZXJyOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9ub2RlLmMgYi9kcml2ZXJzL2Jhc2Uvbm9kZS5jCmluZGV4IDkxNjM2Y2QuLjQzZmE5MGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9ub2RlLmMKKysrIGIvZHJpdmVycy9iYXNlL25vZGUuYwpAQCAtNiw2ICs2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tZW1vcnkuaD4KICNpbmNsdWRlIDxsaW51eC9ub2RlLmg+CiAjaW5jbHVkZSA8bGludXgvaHVnZXRsYi5oPgogI2luY2x1ZGUgPGxpbnV4L2NwdW1hc2suaD4KQEAgLTI0OCw2ICsyNDksMTA1IEBACiAJcmV0dXJuIDA7CiB9CiAKKyNpZmRlZiBDT05GSUdfTUVNT1JZX0hPVFBMVUdfU1BBUlNFCisjZGVmaW5lIHBhZ2VfaW5pdGlhbGl6ZWQocGFnZSkgIChwYWdlLT5scnUubmV4dCkKKworc3RhdGljIGludCBnZXRfbmlkX2Zvcl9wZm4odW5zaWduZWQgbG9uZyBwZm4pCit7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisKKwlpZiAoIXBmbl92YWxpZF93aXRoaW4ocGZuKSkKKwkJcmV0dXJuIC0xOworCXBhZ2UgPSBwZm5fdG9fcGFnZShwZm4pOworCWlmICghcGFnZV9pbml0aWFsaXplZChwYWdlKSkKKwkJcmV0dXJuIC0xOworCXJldHVybiBwZm5fdG9fbmlkKHBmbik7Cit9CisKKy8qIHJlZ2lzdGVyIG1lbW9yeSBzZWN0aW9uIHVuZGVyIHNwZWNpZmllZCBub2RlIGlmIGl0IHNwYW5zIHRoYXQgbm9kZSAqLworaW50IHJlZ2lzdGVyX21lbV9zZWN0X3VuZGVyX25vZGUoc3RydWN0IG1lbW9yeV9ibG9jayAqbWVtX2JsaywgaW50IG5pZCkKK3sKKwl1bnNpZ25lZCBsb25nIHBmbiwgc2VjdF9zdGFydF9wZm4sIHNlY3RfZW5kX3BmbjsKKworCWlmICghbWVtX2JsaykKKwkJcmV0dXJuIC1FRkFVTFQ7CisJaWYgKCFub2RlX29ubGluZShuaWQpKQorCQlyZXR1cm4gMDsKKwlzZWN0X3N0YXJ0X3BmbiA9IHNlY3Rpb25fbnJfdG9fcGZuKG1lbV9ibGstPnBoeXNfaW5kZXgpOworCXNlY3RfZW5kX3BmbiA9IHNlY3Rfc3RhcnRfcGZuICsgUEFHRVNfUEVSX1NFQ1RJT04gLSAxOworCWZvciAocGZuID0gc2VjdF9zdGFydF9wZm47IHBmbiA8PSBzZWN0X2VuZF9wZm47IHBmbisrKSB7CisJCWludCBwYWdlX25pZDsKKworCQlwYWdlX25pZCA9IGdldF9uaWRfZm9yX3BmbihwZm4pOworCQlpZiAocGFnZV9uaWQgPCAwKQorCQkJY29udGludWU7CisJCWlmIChwYWdlX25pZCAhPSBuaWQpCisJCQljb250aW51ZTsKKwkJcmV0dXJuIHN5c2ZzX2NyZWF0ZV9saW5rX25vd2Fybigmbm9kZV9kZXZpY2VzW25pZF0uc3lzZGV2LmtvYmosCisJCQkJCSZtZW1fYmxrLT5zeXNkZXYua29iaiwKKwkJCQkJa29iamVjdF9uYW1lKCZtZW1fYmxrLT5zeXNkZXYua29iaikpOworCX0KKwkvKiBtZW0gc2VjdGlvbiBkb2VzIG5vdCBzcGFuIHRoZSBzcGVjaWZpZWQgbm9kZSAqLworCXJldHVybiAwOworfQorCisvKiB1bnJlZ2lzdGVyIG1lbW9yeSBzZWN0aW9uIHVuZGVyIGFsbCBub2RlcyB0aGF0IGl0IHNwYW5zICovCitpbnQgdW5yZWdpc3Rlcl9tZW1fc2VjdF91bmRlcl9ub2RlcyhzdHJ1Y3QgbWVtb3J5X2Jsb2NrICptZW1fYmxrKQoreworCW5vZGVtYXNrX3QgdW5saW5rZWRfbm9kZXM7CisJdW5zaWduZWQgbG9uZyBwZm4sIHNlY3Rfc3RhcnRfcGZuLCBzZWN0X2VuZF9wZm47CisKKwlpZiAoIW1lbV9ibGspCisJCXJldHVybiAtRUZBVUxUOworCW5vZGVzX2NsZWFyKHVubGlua2VkX25vZGVzKTsKKwlzZWN0X3N0YXJ0X3BmbiA9IHNlY3Rpb25fbnJfdG9fcGZuKG1lbV9ibGstPnBoeXNfaW5kZXgpOworCXNlY3RfZW5kX3BmbiA9IHNlY3Rfc3RhcnRfcGZuICsgUEFHRVNfUEVSX1NFQ1RJT04gLSAxOworCWZvciAocGZuID0gc2VjdF9zdGFydF9wZm47IHBmbiA8PSBzZWN0X2VuZF9wZm47IHBmbisrKSB7CisJCXVuc2lnbmVkIGludCBuaWQ7CisKKwkJbmlkID0gZ2V0X25pZF9mb3JfcGZuKHBmbik7CisJCWlmIChuaWQgPCAwKQorCQkJY29udGludWU7CisJCWlmICghbm9kZV9vbmxpbmUobmlkKSkKKwkJCWNvbnRpbnVlOworCQlpZiAobm9kZV90ZXN0X2FuZF9zZXQobmlkLCB1bmxpbmtlZF9ub2RlcykpCisJCQljb250aW51ZTsKKwkJc3lzZnNfcmVtb3ZlX2xpbmsoJm5vZGVfZGV2aWNlc1tuaWRdLnN5c2Rldi5rb2JqLAorCQkJIGtvYmplY3RfbmFtZSgmbWVtX2Jsay0+c3lzZGV2LmtvYmopKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbGlua19tZW1fc2VjdGlvbnMoaW50IG5pZCkKK3sKKwl1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbiA9IE5PREVfREFUQShuaWQpLT5ub2RlX3N0YXJ0X3BmbjsKKwl1bnNpZ25lZCBsb25nIGVuZF9wZm4gPSBzdGFydF9wZm4gKyBOT0RFX0RBVEEobmlkKS0+bm9kZV9zcGFubmVkX3BhZ2VzOworCXVuc2lnbmVkIGxvbmcgcGZuOworCWludCBlcnIgPSAwOworCisJZm9yIChwZm4gPSBzdGFydF9wZm47IHBmbiA8IGVuZF9wZm47IHBmbiArPSBQQUdFU19QRVJfU0VDVElPTikgeworCQl1bnNpZ25lZCBsb25nIHNlY3Rpb25fbnIgPSBwZm5fdG9fc2VjdGlvbl9ucihwZm4pOworCQlzdHJ1Y3QgbWVtX3NlY3Rpb24gKm1lbV9zZWN0OworCQlzdHJ1Y3QgbWVtb3J5X2Jsb2NrICptZW1fYmxrOworCQlpbnQgcmV0OworCisJCWlmICghcHJlc2VudF9zZWN0aW9uX25yKHNlY3Rpb25fbnIpKQorCQkJY29udGludWU7CisJCW1lbV9zZWN0ID0gX19ucl90b19zZWN0aW9uKHNlY3Rpb25fbnIpOworCQltZW1fYmxrID0gZmluZF9tZW1vcnlfYmxvY2sobWVtX3NlY3QpOworCQlyZXQgPSByZWdpc3Rlcl9tZW1fc2VjdF91bmRlcl9ub2RlKG1lbV9ibGssIG5pZCk7CisJCWlmICghZXJyKQorCQkJZXJyID0gcmV0OworCisJCS8qIGRpc2NhcmQgcmVmIG9idGFpbmVkIGluIGZpbmRfbWVtb3J5X2Jsb2NrKCkgKi8KKwkJa29iamVjdF9wdXQoJm1lbV9ibGstPnN5c2Rldi5rb2JqKTsKKwl9CisJcmV0dXJuIGVycjsKK30KKyNlbHNlCitzdGF0aWMgaW50IGxpbmtfbWVtX3NlY3Rpb25zKGludCBuaWQpIHsgcmV0dXJuIDA7IH0KKyNlbmRpZiAvKiBDT05GSUdfTUVNT1JZX0hPVFBMVUdfU1BBUlNFICovCisKIGludCByZWdpc3Rlcl9vbmVfbm9kZShpbnQgbmlkKQogewogCWludCBlcnJvciA9IDA7CkBAIC0yNjcsNiArMzY3LDkgQEAKIAkJCWlmIChjcHVfdG9fbm9kZShjcHUpID09IG5pZCkKIAkJCQlyZWdpc3Rlcl9jcHVfdW5kZXJfbm9kZShjcHUsIG5pZCk7CiAJCX0KKworCQkvKiBsaW5rIG1lbW9yeSBzZWN0aW9ucyB1bmRlciB0aGlzIG5vZGUgKi8KKwkJZXJyb3IgPSBsaW5rX21lbV9zZWN0aW9ucyhuaWQpOwogCX0KIAogCXJldHVybiBlcnJvcjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9wbGF0Zm9ybS5jIGIvZHJpdmVycy9iYXNlL3BsYXRmb3JtLmMKaW5kZXggZGZjYmZlNS4uMzQ5YTEwMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL3BsYXRmb3JtLmMKKysrIGIvZHJpdmVycy9iYXNlL3BsYXRmb3JtLmMKQEAgLTI0LDcgKzI0LDcgQEAKIAkJCQkgZHJpdmVyKSkKIAogc3RydWN0IGRldmljZSBwbGF0Zm9ybV9idXMgPSB7Ci0JLmJ1c19pZAkJPSAicGxhdGZvcm0iLAorCS5pbml0X25hbWUJPSAicGxhdGZvcm0iLAogfTsKIEVYUE9SVF9TWU1CT0xfR1BMKHBsYXRmb3JtX2J1cyk7CiAKQEAgLTI0MiwxNiArMjQyLDE1IEBACiAJcGRldi0+ZGV2LmJ1cyA9ICZwbGF0Zm9ybV9idXNfdHlwZTsKIAogCWlmIChwZGV2LT5pZCAhPSAtMSkKLQkJc25wcmludGYocGRldi0+ZGV2LmJ1c19pZCwgQlVTX0lEX1NJWkUsICIlcy4lZCIsIHBkZXYtPm5hbWUsCi0JCQkgcGRldi0+aWQpOworCQlkZXZfc2V0X25hbWUoJnBkZXYtPmRldiwgIiVzLiVkIiwgcGRldi0+bmFtZSwgIHBkZXYtPmlkKTsKIAllbHNlCi0JCXN0cmxjcHkocGRldi0+ZGV2LmJ1c19pZCwgcGRldi0+bmFtZSwgQlVTX0lEX1NJWkUpOworCQlkZXZfc2V0X25hbWUoJnBkZXYtPmRldiwgcGRldi0+bmFtZSk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgcGRldi0+bnVtX3Jlc291cmNlczsgaSsrKSB7CiAJCXN0cnVjdCByZXNvdXJjZSAqcCwgKnIgPSAmcGRldi0+cmVzb3VyY2VbaV07CiAKIAkJaWYgKHItPm5hbWUgPT0gTlVMTCkKLQkJCXItPm5hbWUgPSBwZGV2LT5kZXYuYnVzX2lkOworCQkJci0+bmFtZSA9IGRldl9uYW1lKCZwZGV2LT5kZXYpOwogCiAJCXAgPSByLT5wYXJlbnQ7CiAJCWlmICghcCkgewpAQCAtMjY0LDE0ICsyNjMsMTQgQEAKIAkJaWYgKHAgJiYgaW5zZXJ0X3Jlc291cmNlKHAsIHIpKSB7CiAJCQlwcmludGsoS0VSTl9FUlIKIAkJCSAgICAgICAiJXM6IGZhaWxlZCB0byBjbGFpbSByZXNvdXJjZSAlZFxuIiwKLQkJCSAgICAgICBwZGV2LT5kZXYuYnVzX2lkLCBpKTsKKwkJCSAgICAgICBkZXZfbmFtZSgmcGRldi0+ZGV2KSwgaSk7CiAJCQlyZXQgPSAtRUJVU1k7CiAJCQlnb3RvIGZhaWxlZDsKIAkJfQogCX0KIAogCXByX2RlYnVnKCJSZWdpc3RlcmluZyBwbGF0Zm9ybSBkZXZpY2UgJyVzJy4gUGFyZW50IGF0ICVzXG4iLAotCQkgcGRldi0+ZGV2LmJ1c19pZCwgcGRldi0+ZGV2LnBhcmVudC0+YnVzX2lkKTsKKwkJIGRldl9uYW1lKCZwZGV2LT5kZXYpLCBkZXZfbmFtZShwZGV2LT5kZXYucGFyZW50KSk7CiAKIAlyZXQgPSBkZXZpY2VfYWRkKCZwZGV2LT5kZXYpOwogCWlmIChyZXQgPT0gMCkKQEAgLTUwMyw4ICs1MDIsNiBAQAogCQlkcnYtPmRyaXZlci5zdXNwZW5kID0gcGxhdGZvcm1fZHJ2X3N1c3BlbmQ7CiAJaWYgKGRydi0+cmVzdW1lKQogCQlkcnYtPmRyaXZlci5yZXN1bWUgPSBwbGF0Zm9ybV9kcnZfcmVzdW1lOwotCWlmIChkcnYtPnBtKQotCQlkcnYtPmRyaXZlci5wbSA9ICZkcnYtPnBtLT5iYXNlOwogCXJldHVybiBkcml2ZXJfcmVnaXN0ZXIoJmRydi0+ZHJpdmVyKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHBsYXRmb3JtX2RyaXZlcl9yZWdpc3Rlcik7CkBAIC02MDksNyArNjA2LDcgQEAKIAlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2OwogCiAJcGRldiA9IGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UsIGRldik7Ci0JcmV0dXJuIChzdHJuY21wKHBkZXYtPm5hbWUsIGRydi0+bmFtZSwgQlVTX0lEX1NJWkUpID09IDApOworCXJldHVybiAoc3RyY21wKHBkZXYtPm5hbWUsIGRydi0+bmFtZSkgPT0gMCk7CiB9CiAKICNpZmRlZiBDT05GSUdfUE1fU0xFRVAKQEAgLTY4Niw3ICs2ODMsMTAgQEAKIAlzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2ID0gZGV2LT5kcml2ZXI7CiAJaW50IHJldCA9IDA7CiAKLQlpZiAoZHJ2ICYmIGRydi0+cG0pIHsKKwlpZiAoIWRydikKKwkJcmV0dXJuIDA7CisKKwlpZiAoZHJ2LT5wbSkgewogCQlpZiAoZHJ2LT5wbS0+c3VzcGVuZCkKIAkJCXJldCA9IGRydi0+cG0tPnN1c3BlbmQoZGV2KTsKIAl9IGVsc2UgewpAQCAtNjk4LDE2ICs2OTgsMTUgQEAKIAogc3RhdGljIGludCBwbGF0Zm9ybV9wbV9zdXNwZW5kX25vaXJxKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyICpwZHJ2OworCXN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnYgPSBkZXYtPmRyaXZlcjsKIAlpbnQgcmV0ID0gMDsKIAotCWlmICghZGV2LT5kcml2ZXIpCisJaWYgKCFkcnYpCiAJCXJldHVybiAwOwogCi0JcGRydiA9IHRvX3BsYXRmb3JtX2RyaXZlcihkZXYtPmRyaXZlcik7Ci0JaWYgKHBkcnYtPnBtKSB7Ci0JCWlmIChwZHJ2LT5wbS0+c3VzcGVuZF9ub2lycSkKLQkJCXJldCA9IHBkcnYtPnBtLT5zdXNwZW5kX25vaXJxKGRldik7CisJaWYgKGRydi0+cG0pIHsKKwkJaWYgKGRydi0+cG0tPnN1c3BlbmRfbm9pcnEpCisJCQlyZXQgPSBkcnYtPnBtLT5zdXNwZW5kX25vaXJxKGRldik7CiAJfSBlbHNlIHsKIAkJcmV0ID0gcGxhdGZvcm1fbGVnYWN5X3N1c3BlbmRfbGF0ZShkZXYsIFBNU0dfU1VTUEVORCk7CiAJfQpAQCAtNzIwLDcgKzcxOSwxMCBAQAogCXN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnYgPSBkZXYtPmRyaXZlcjsKIAlpbnQgcmV0ID0gMDsKIAotCWlmIChkcnYgJiYgZHJ2LT5wbSkgeworCWlmICghZHJ2KQorCQlyZXR1cm4gMDsKKworCWlmIChkcnYtPnBtKSB7CiAJCWlmIChkcnYtPnBtLT5yZXN1bWUpCiAJCQlyZXQgPSBkcnYtPnBtLT5yZXN1bWUoZGV2KTsKIAl9IGVsc2UgewpAQCAtNzMyLDE2ICs3MzQsMTUgQEAKIAogc3RhdGljIGludCBwbGF0Zm9ybV9wbV9yZXN1bWVfbm9pcnEoc3RydWN0IGRldmljZSAqZGV2KQogewotCXN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgKnBkcnY7CisJc3RydWN0IGRldmljZV9kcml2ZXIgKmRydiA9IGRldi0+ZHJpdmVyOwogCWludCByZXQgPSAwOwogCi0JaWYgKCFkZXYtPmRyaXZlcikKKwlpZiAoIWRydikKIAkJcmV0dXJuIDA7CiAKLQlwZHJ2ID0gdG9fcGxhdGZvcm1fZHJpdmVyKGRldi0+ZHJpdmVyKTsKLQlpZiAocGRydi0+cG0pIHsKLQkJaWYgKHBkcnYtPnBtLT5yZXN1bWVfbm9pcnEpCi0JCQlyZXQgPSBwZHJ2LT5wbS0+cmVzdW1lX25vaXJxKGRldik7CisJaWYgKGRydi0+cG0pIHsKKwkJaWYgKGRydi0+cG0tPnJlc3VtZV9ub2lycSkKKwkJCXJldCA9IGRydi0+cG0tPnJlc3VtZV9ub2lycShkZXYpOwogCX0gZWxzZSB7CiAJCXJldCA9IHBsYXRmb3JtX2xlZ2FjeV9yZXN1bWVfZWFybHkoZGV2KTsKIAl9CkBAIC03ODAsMTYgKzc4MSwxNSBAQAogCiBzdGF0aWMgaW50IHBsYXRmb3JtX3BtX2ZyZWV6ZV9ub2lycShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IHBsYXRmb3JtX2RyaXZlciAqcGRydjsKKwlzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2ID0gZGV2LT5kcml2ZXI7CiAJaW50IHJldCA9IDA7CiAKLQlpZiAoIWRldi0+ZHJpdmVyKQorCWlmICghZHJ2KQogCQlyZXR1cm4gMDsKIAotCXBkcnYgPSB0b19wbGF0Zm9ybV9kcml2ZXIoZGV2LT5kcml2ZXIpOwotCWlmIChwZHJ2LT5wbSkgewotCQlpZiAocGRydi0+cG0tPmZyZWV6ZV9ub2lycSkKLQkJCXJldCA9IHBkcnYtPnBtLT5mcmVlemVfbm9pcnEoZGV2KTsKKwlpZiAoZHJ2LT5wbSkgeworCQlpZiAoZHJ2LT5wbS0+ZnJlZXplX25vaXJxKQorCQkJcmV0ID0gZHJ2LT5wbS0+ZnJlZXplX25vaXJxKGRldik7CiAJfSBlbHNlIHsKIAkJcmV0ID0gcGxhdGZvcm1fbGVnYWN5X3N1c3BlbmRfbGF0ZShkZXYsIFBNU0dfRlJFRVpFKTsKIAl9CkBAIC04MDIsNyArODAyLDEwIEBACiAJc3RydWN0IGRldmljZV9kcml2ZXIgKmRydiA9IGRldi0+ZHJpdmVyOwogCWludCByZXQgPSAwOwogCi0JaWYgKGRydiAmJiBkcnYtPnBtKSB7CisJaWYgKCFkcnYpCisJCXJldHVybiAwOworCisJaWYgKGRydi0+cG0pIHsKIAkJaWYgKGRydi0+cG0tPnRoYXcpCiAJCQlyZXQgPSBkcnYtPnBtLT50aGF3KGRldik7CiAJfSBlbHNlIHsKQEAgLTgxNCwxNiArODE3LDE1IEBACiAKIHN0YXRpYyBpbnQgcGxhdGZvcm1fcG1fdGhhd19ub2lycShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IHBsYXRmb3JtX2RyaXZlciAqcGRydjsKKwlzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2ID0gZGV2LT5kcml2ZXI7CiAJaW50IHJldCA9IDA7CiAKLQlpZiAoIWRldi0+ZHJpdmVyKQorCWlmICghZHJ2KQogCQlyZXR1cm4gMDsKIAotCXBkcnYgPSB0b19wbGF0Zm9ybV9kcml2ZXIoZGV2LT5kcml2ZXIpOwotCWlmIChwZHJ2LT5wbSkgewotCQlpZiAocGRydi0+cG0tPnRoYXdfbm9pcnEpCi0JCQlyZXQgPSBwZHJ2LT5wbS0+dGhhd19ub2lycShkZXYpOworCWlmIChkcnYtPnBtKSB7CisJCWlmIChkcnYtPnBtLT50aGF3X25vaXJxKQorCQkJcmV0ID0gZHJ2LT5wbS0+dGhhd19ub2lycShkZXYpOwogCX0gZWxzZSB7CiAJCXJldCA9IHBsYXRmb3JtX2xlZ2FjeV9yZXN1bWVfZWFybHkoZGV2KTsKIAl9CkBAIC04MzYsNyArODM4LDEwIEBACiAJc3RydWN0IGRldmljZV9kcml2ZXIgKmRydiA9IGRldi0+ZHJpdmVyOwogCWludCByZXQgPSAwOwogCi0JaWYgKGRydiAmJiBkcnYtPnBtKSB7CisJaWYgKCFkcnYpCisJCXJldHVybiAwOworCisJaWYgKGRydi0+cG0pIHsKIAkJaWYgKGRydi0+cG0tPnBvd2Vyb2ZmKQogCQkJcmV0ID0gZHJ2LT5wbS0+cG93ZXJvZmYoZGV2KTsKIAl9IGVsc2UgewpAQCAtODQ4LDE2ICs4NTMsMTUgQEAKIAogc3RhdGljIGludCBwbGF0Zm9ybV9wbV9wb3dlcm9mZl9ub2lycShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IHBsYXRmb3JtX2RyaXZlciAqcGRydjsKKwlzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2ID0gZGV2LT5kcml2ZXI7CiAJaW50IHJldCA9IDA7CiAKLQlpZiAoIWRldi0+ZHJpdmVyKQorCWlmICghZHJ2KQogCQlyZXR1cm4gMDsKIAotCXBkcnYgPSB0b19wbGF0Zm9ybV9kcml2ZXIoZGV2LT5kcml2ZXIpOwotCWlmIChwZHJ2LT5wbSkgewotCQlpZiAocGRydi0+cG0tPnBvd2Vyb2ZmX25vaXJxKQotCQkJcmV0ID0gcGRydi0+cG0tPnBvd2Vyb2ZmX25vaXJxKGRldik7CisJaWYgKGRydi0+cG0pIHsKKwkJaWYgKGRydi0+cG0tPnBvd2Vyb2ZmX25vaXJxKQorCQkJcmV0ID0gZHJ2LT5wbS0+cG93ZXJvZmZfbm9pcnEoZGV2KTsKIAl9IGVsc2UgewogCQlyZXQgPSBwbGF0Zm9ybV9sZWdhY3lfc3VzcGVuZF9sYXRlKGRldiwgUE1TR19ISUJFUk5BVEUpOwogCX0KQEAgLTg3MCw3ICs4NzQsMTAgQEAKIAlzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2ID0gZGV2LT5kcml2ZXI7CiAJaW50IHJldCA9IDA7CiAKLQlpZiAoZHJ2ICYmIGRydi0+cG0pIHsKKwlpZiAoIWRydikKKwkJcmV0dXJuIDA7CisKKwlpZiAoZHJ2LT5wbSkgewogCQlpZiAoZHJ2LT5wbS0+cmVzdG9yZSkKIAkJCXJldCA9IGRydi0+cG0tPnJlc3RvcmUoZGV2KTsKIAl9IGVsc2UgewpAQCAtODgyLDE2ICs4ODksMTUgQEAKIAogc3RhdGljIGludCBwbGF0Zm9ybV9wbV9yZXN0b3JlX25vaXJxKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyICpwZHJ2OworCXN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnYgPSBkZXYtPmRyaXZlcjsKIAlpbnQgcmV0ID0gMDsKIAotCWlmICghZGV2LT5kcml2ZXIpCisJaWYgKCFkcnYpCiAJCXJldHVybiAwOwogCi0JcGRydiA9IHRvX3BsYXRmb3JtX2RyaXZlcihkZXYtPmRyaXZlcik7Ci0JaWYgKHBkcnYtPnBtKSB7Ci0JCWlmIChwZHJ2LT5wbS0+cmVzdG9yZV9ub2lycSkKLQkJCXJldCA9IHBkcnYtPnBtLT5yZXN0b3JlX25vaXJxKGRldik7CisJaWYgKGRydi0+cG0pIHsKKwkJaWYgKGRydi0+cG0tPnJlc3RvcmVfbm9pcnEpCisJCQlyZXQgPSBkcnYtPnBtLT5yZXN0b3JlX25vaXJxKGRldik7CiAJfSBlbHNlIHsKIAkJcmV0ID0gcGxhdGZvcm1fbGVnYWN5X3Jlc3VtZV9lYXJseShkZXYpOwogCX0KQEAgLTkxMiwxNyArOTE4LDE1IEBACiAKICNlbmRpZiAvKiAhQ09ORklHX0hJQkVSTkFUSU9OICovCiAKLXN0YXRpYyBzdHJ1Y3QgcG1fZXh0X29wcyBwbGF0Zm9ybV9wbV9vcHMgPSB7Ci0JLmJhc2UgPSB7Ci0JCS5wcmVwYXJlID0gcGxhdGZvcm1fcG1fcHJlcGFyZSwKLQkJLmNvbXBsZXRlID0gcGxhdGZvcm1fcG1fY29tcGxldGUsCi0JCS5zdXNwZW5kID0gcGxhdGZvcm1fcG1fc3VzcGVuZCwKLQkJLnJlc3VtZSA9IHBsYXRmb3JtX3BtX3Jlc3VtZSwKLQkJLmZyZWV6ZSA9IHBsYXRmb3JtX3BtX2ZyZWV6ZSwKLQkJLnRoYXcgPSBwbGF0Zm9ybV9wbV90aGF3LAotCQkucG93ZXJvZmYgPSBwbGF0Zm9ybV9wbV9wb3dlcm9mZiwKLQkJLnJlc3RvcmUgPSBwbGF0Zm9ybV9wbV9yZXN0b3JlLAotCX0sCitzdGF0aWMgc3RydWN0IGRldl9wbV9vcHMgcGxhdGZvcm1fZGV2X3BtX29wcyA9IHsKKwkucHJlcGFyZSA9IHBsYXRmb3JtX3BtX3ByZXBhcmUsCisJLmNvbXBsZXRlID0gcGxhdGZvcm1fcG1fY29tcGxldGUsCisJLnN1c3BlbmQgPSBwbGF0Zm9ybV9wbV9zdXNwZW5kLAorCS5yZXN1bWUgPSBwbGF0Zm9ybV9wbV9yZXN1bWUsCisJLmZyZWV6ZSA9IHBsYXRmb3JtX3BtX2ZyZWV6ZSwKKwkudGhhdyA9IHBsYXRmb3JtX3BtX3RoYXcsCisJLnBvd2Vyb2ZmID0gcGxhdGZvcm1fcG1fcG93ZXJvZmYsCisJLnJlc3RvcmUgPSBwbGF0Zm9ybV9wbV9yZXN0b3JlLAogCS5zdXNwZW5kX25vaXJxID0gcGxhdGZvcm1fcG1fc3VzcGVuZF9ub2lycSwKIAkucmVzdW1lX25vaXJxID0gcGxhdGZvcm1fcG1fcmVzdW1lX25vaXJxLAogCS5mcmVlemVfbm9pcnEgPSBwbGF0Zm9ybV9wbV9mcmVlemVfbm9pcnEsCkBAIC05MzEsNyArOTM1LDcgQEAKIAkucmVzdG9yZV9ub2lycSA9IHBsYXRmb3JtX3BtX3Jlc3RvcmVfbm9pcnEsCiB9OwogCi0jZGVmaW5lIFBMQVRGT1JNX1BNX09QU19QVFIJJnBsYXRmb3JtX3BtX29wcworI2RlZmluZSBQTEFURk9STV9QTV9PUFNfUFRSCSgmcGxhdGZvcm1fZGV2X3BtX29wcykKIAogI2Vsc2UgLyogIUNPTkZJR19QTV9TTEVFUCAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvcG93ZXIvbWFpbi5jIGIvZHJpdmVycy9iYXNlL3Bvd2VyL21haW4uYwppbmRleCA2OTJjMjBiLi42NzBjOWQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvcG93ZXIvbWFpbi5jCisrKyBiL2RyaXZlcnMvYmFzZS9wb3dlci9tYWluLmMKQEAgLTc2LDcgKzc2LDcgQEAKIAlpZiAoZGV2LT5wYXJlbnQpIHsKIAkJaWYgKGRldi0+cGFyZW50LT5wb3dlci5zdGF0dXMgPj0gRFBNX1NVU1BFTkRJTkcpCiAJCQlkZXZfd2FybihkZXYsICJwYXJlbnQgJXMgc2hvdWxkIG5vdCBiZSBzbGVlcGluZ1xuIiwKLQkJCQlkZXYtPnBhcmVudC0+YnVzX2lkKTsKKwkJCQkgZGV2X25hbWUoZGV2LT5wYXJlbnQpKTsKIAl9IGVsc2UgaWYgKHRyYW5zaXRpb25fc3RhcnRlZCkgewogCQkvKgogCQkgKiBXZSByZWZ1c2UgdG8gcmVnaXN0ZXIgcGFyZW50bGVzcyBkZXZpY2VzIHdoaWxlIGEgUE0KQEAgLTExMiw3ICsxMTIsOCBAQAogICoJQG9wczoJUE0gb3BlcmF0aW9ucyB0byBjaG9vc2UgZnJvbS4KICAqCUBzdGF0ZToJUE0gdHJhbnNpdGlvbiBvZiB0aGUgc3lzdGVtIGJlaW5nIGNhcnJpZWQgb3V0LgogICovCi1zdGF0aWMgaW50IHBtX29wKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHBtX29wcyAqb3BzLCBwbV9tZXNzYWdlX3Qgc3RhdGUpCitzdGF0aWMgaW50IHBtX29wKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldl9wbV9vcHMgKm9wcywKKwkJCXBtX21lc3NhZ2VfdCBzdGF0ZSkKIHsKIAlpbnQgZXJyb3IgPSAwOwogCkBAIC0xNzQsNyArMTc1LDcgQEAKICAqCVRoZSBvcGVyYXRpb24gaXMgZXhlY3V0ZWQgd2l0aCBpbnRlcnJ1cHRzIGRpc2FibGVkIGJ5IHRoZSBvbmx5IHJlbWFpbmluZwogICoJZnVuY3Rpb25hbCBDUFUgaW4gdGhlIHN5c3RlbS4KICAqLwotc3RhdGljIGludCBwbV9ub2lycV9vcChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBwbV9leHRfb3BzICpvcHMsCitzdGF0aWMgaW50IHBtX25vaXJxX29wKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldl9wbV9vcHMgKm9wcywKIAkJCXBtX21lc3NhZ2VfdCBzdGF0ZSkKIHsKIAlpbnQgZXJyb3IgPSAwOwpAQCAtMzU0LDcgKzM1NSw3IEBACiAJaWYgKGRldi0+YnVzKSB7CiAJCWlmIChkZXYtPmJ1cy0+cG0pIHsKIAkJCXBtX2Rldl9kYmcoZGV2LCBzdGF0ZSwgIiIpOwotCQkJZXJyb3IgPSBwbV9vcChkZXYsICZkZXYtPmJ1cy0+cG0tPmJhc2UsIHN0YXRlKTsKKwkJCWVycm9yID0gcG1fb3AoZGV2LCBkZXYtPmJ1cy0+cG0sIHN0YXRlKTsKIAkJfSBlbHNlIGlmIChkZXYtPmJ1cy0+cmVzdW1lKSB7CiAJCQlwbV9kZXZfZGJnKGRldiwgc3RhdGUsICJsZWdhY3kgIik7CiAJCQllcnJvciA9IGRldi0+YnVzLT5yZXN1bWUoZGV2KTsKQEAgLTQ1MSw5ICs0NTIsOSBAQAogCQlkZXYtPnR5cGUtPnBtLT5jb21wbGV0ZShkZXYpOwogCX0KIAotCWlmIChkZXYtPmJ1cyAmJiBkZXYtPmJ1cy0+cG0gJiYgZGV2LT5idXMtPnBtLT5iYXNlLmNvbXBsZXRlKSB7CisJaWYgKGRldi0+YnVzICYmIGRldi0+YnVzLT5wbSAmJiBkZXYtPmJ1cy0+cG0tPmNvbXBsZXRlKSB7CiAJCXBtX2Rldl9kYmcoZGV2LCBzdGF0ZSwgImNvbXBsZXRpbmcgIik7Ci0JCWRldi0+YnVzLT5wbS0+YmFzZS5jb21wbGV0ZShkZXYpOworCQlkZXYtPmJ1cy0+cG0tPmNvbXBsZXRlKGRldik7CiAJfQogCiAJdXAoJmRldi0+c2VtKTsKQEAgLTYyNCw3ICs2MjUsNyBAQAogCWlmIChkZXYtPmJ1cykgewogCQlpZiAoZGV2LT5idXMtPnBtKSB7CiAJCQlwbV9kZXZfZGJnKGRldiwgc3RhdGUsICIiKTsKLQkJCWVycm9yID0gcG1fb3AoZGV2LCAmZGV2LT5idXMtPnBtLT5iYXNlLCBzdGF0ZSk7CisJCQllcnJvciA9IHBtX29wKGRldiwgZGV2LT5idXMtPnBtLCBzdGF0ZSk7CiAJCX0gZWxzZSBpZiAoZGV2LT5idXMtPnN1c3BlbmQpIHsKIAkJCXBtX2Rldl9kYmcoZGV2LCBzdGF0ZSwgImxlZ2FjeSAiKTsKIAkJCWVycm9yID0gZGV2LT5idXMtPnN1c3BlbmQoZGV2LCBzdGF0ZSk7CkBAIC02ODUsMTAgKzY4NiwxMCBAQAogCiAJZG93bigmZGV2LT5zZW0pOwogCi0JaWYgKGRldi0+YnVzICYmIGRldi0+YnVzLT5wbSAmJiBkZXYtPmJ1cy0+cG0tPmJhc2UucHJlcGFyZSkgeworCWlmIChkZXYtPmJ1cyAmJiBkZXYtPmJ1cy0+cG0gJiYgZGV2LT5idXMtPnBtLT5wcmVwYXJlKSB7CiAJCXBtX2Rldl9kYmcoZGV2LCBzdGF0ZSwgInByZXBhcmluZyAiKTsKLQkJZXJyb3IgPSBkZXYtPmJ1cy0+cG0tPmJhc2UucHJlcGFyZShkZXYpOwotCQlzdXNwZW5kX3JlcG9ydF9yZXN1bHQoZGV2LT5idXMtPnBtLT5iYXNlLnByZXBhcmUsIGVycm9yKTsKKwkJZXJyb3IgPSBkZXYtPmJ1cy0+cG0tPnByZXBhcmUoZGV2KTsKKwkJc3VzcGVuZF9yZXBvcnRfcmVzdWx0KGRldi0+YnVzLT5wbS0+cHJlcGFyZSwgZXJyb3IpOwogCQlpZiAoZXJyb3IpCiAJCQlnb3RvIEVuZDsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvcG93ZXIvdHJhY2UuYyBiL2RyaXZlcnMvYmFzZS9wb3dlci90cmFjZS5jCmluZGV4IDJhYTZlOGYuLjBhMWEyYzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9wb3dlci90cmFjZS5jCisrKyBiL2RyaXZlcnMvYmFzZS9wb3dlci90cmFjZS5jCkBAIC0xNDAsNyArMTQwLDcgQEAKIAogdm9pZCBzZXRfdHJhY2VfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlkZXZfaGFzaF92YWx1ZSA9IGhhc2hfc3RyaW5nKERFVlNFRUQsIGRldi0+YnVzX2lkLCBERVZIQVNIKTsKKwlkZXZfaGFzaF92YWx1ZSA9IGhhc2hfc3RyaW5nKERFVlNFRUQsIGRldl9uYW1lKGRldiksIERFVkhBU0gpOwogfQogRVhQT1JUX1NZTUJPTChzZXRfdHJhY2VfZGV2aWNlKTsKIApAQCAtMTkyLDcgKzE5Miw3IEBACiAKIAl3aGlsZSAoZW50cnkgIT0gJmRwbV9saXN0KSB7CiAJCXN0cnVjdCBkZXZpY2UgKiBkZXYgPSB0b19kZXZpY2UoZW50cnkpOwotCQl1bnNpZ25lZCBpbnQgaGFzaCA9IGhhc2hfc3RyaW5nKERFVlNFRUQsIGRldi0+YnVzX2lkLCBERVZIQVNIKTsKKwkJdW5zaWduZWQgaW50IGhhc2ggPSBoYXNoX3N0cmluZyhERVZTRUVELCBkZXZfbmFtZShkZXYpLCBERVZIQVNIKTsKIAkJaWYgKGhhc2ggPT0gdmFsdWUpIHsKIAkJCWRldl9pbmZvKGRldiwgImhhc2ggbWF0Y2hlc1xuIik7CiAJCQltYXRjaCsrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL3RvcG9sb2d5LmMgYi9kcml2ZXJzL2Jhc2UvdG9wb2xvZ3kuYwppbmRleCBhOGJjMWNiLi5hNzc4ZmI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvdG9wb2xvZ3kuYworKysgYi9kcml2ZXJzL2Jhc2UvdG9wb2xvZ3kuYwpAQCAtMjgsNiArMjgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvY3B1Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaGFyZGlycS5oPgogI2luY2x1ZGUgPGxpbnV4L3RvcG9sb2d5Lmg+CiAKICNkZWZpbmUgZGVmaW5lX29uZV9ybyhfbmFtZSkgCQlcCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL3N1bnZkYy5jIGIvZHJpdmVycy9ibG9jay9zdW52ZGMuYwppbmRleCA5NTNjMGI4Li41ODYxZTMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL3N1bnZkYy5jCisrKyBiL2RyaXZlcnMvYmxvY2svc3VudmRjLmMKQEAgLTE1Myw3ICsxNTMsNyBAQAogCXBrdC52ZGlza19ibG9ja19zaXplID0gcG9ydC0+dmRpc2tfYmxvY2tfc2l6ZTsKIAlwa3QubWF4X3hmZXJfc2l6ZSA9IHBvcnQtPm1heF94ZmVyX3NpemU7CiAKLQl2aW9kYmcoSFMsICJTRU5EIEFUVFIgeGZlcl9tb2RlWzB4JXhdIGJsa3N6WyV1XSBtYXhfeGZlclslbHVdXG4iLAorCXZpb2RiZyhIUywgIlNFTkQgQVRUUiB4ZmVyX21vZGVbMHgleF0gYmxrc3pbJXVdIG1heF94ZmVyWyVsbHVdXG4iLAogCSAgICAgICBwa3QueGZlcl9tb2RlLCBwa3QudmRpc2tfYmxvY2tfc2l6ZSwgcGt0Lm1heF94ZmVyX3NpemUpOwogCiAJcmV0dXJuIHZpb19sZGNfc2VuZCgmcG9ydC0+dmlvLCAmcGt0LCBzaXplb2YocGt0KSk7CkBAIC0xNjQsOCArMTY0LDggQEAKIAlzdHJ1Y3QgdmRjX3BvcnQgKnBvcnQgPSB0b192ZGNfcG9ydCh2aW8pOwogCXN0cnVjdCB2aW9fZGlza19hdHRyX2luZm8gKnBrdCA9IGFyZzsKIAotCXZpb2RiZyhIUywgIkdPVCBBVFRSIHN0eXBlWzB4JXhdIG9wc1slbHhdIGRpc2tfc2l6ZVslbHVdIGRpc2tfdHlwZVsleF0gIgotCSAgICAgICAieGZlcl9tb2RlWzB4JXhdIGJsa3N6WyV1XSBtYXhfeGZlclslbHVdXG4iLAorCXZpb2RiZyhIUywgIkdPVCBBVFRSIHN0eXBlWzB4JXhdIG9wc1slbGx4XSBkaXNrX3NpemVbJWxsdV0gZGlza190eXBlWyV4XSAiCisJICAgICAgICJ4ZmVyX21vZGVbMHgleF0gYmxrc3pbJXVdIG1heF94ZmVyWyVsbHVdXG4iLAogCSAgICAgICBwa3QtPnRhZy5zdHlwZSwgcGt0LT5vcGVyYXRpb25zLAogCSAgICAgICBwa3QtPnZkaXNrX3NpemUsIHBrdC0+dmRpc2tfdHlwZSwKIAkgICAgICAgcGt0LT54ZmVyX21vZGUsIHBrdC0+dmRpc2tfYmxvY2tfc2l6ZSwKQEAgLTc1Myw3ICs3NTMsNyBAQAogCiAJZXJyID0gLUVOT0RFVjsKIAlpZiAoKHZkZXYtPmRldl9ubyA8PCBQQVJUSVRJT05fU0hJRlQpICYgfih1NjQpTUlOT1JNQVNLKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBQRlggIlBvcnQgaWQgWyVsdV0gdG9vIGxhcmdlLlxuIiwKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiUG9ydCBpZCBbJWxsdV0gdG9vIGxhcmdlLlxuIiwKIAkJICAgICAgIHZkZXYtPmRldl9ubyk7CiAJCWdvdG8gZXJyX291dF9yZWxlYXNlX21kZXNjOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svdWIuYyBiL2RyaXZlcnMvYmxvY2svdWIuYwppbmRleCAwNDhkNzFkLi4xMmZiODE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL3ViLmMKKysrIGIvZHJpdmVycy9ibG9jay91Yi5jCkBAIC0xNTc5LDcgKzE1NzksNyBAQAogCXN0cnVjdCB1Yl9kZXYgKnNjID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCB1Yl9kZXYsIHJlc2V0X3dvcmspOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJc3RydWN0IHViX2x1biAqbHVuOwotCWludCBsa3IsIHJjOworCWludCByYzsKIAogCWlmICghc2MtPnJlc2V0KSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBSdW5uaW5nIHJlc2V0IHVucmVxdWVzdGVkXG4iLApAQCAtMTU5NywxMCArMTU5NywxMSBAQAogCX0gZWxzZSBpZiAoc2MtPmRldi0+YWN0Y29uZmlnLT5kZXNjLmJOdW1JbnRlcmZhY2VzICE9IDEpIHsKIAkJOwogCX0gZWxzZSB7Ci0JCWlmICgobGtyID0gdXNiX2xvY2tfZGV2aWNlX2Zvcl9yZXNldChzYy0+ZGV2LCBzYy0+aW50ZikpIDwgMCkgeworCQlyYyA9IHVzYl9sb2NrX2RldmljZV9mb3JfcmVzZXQoc2MtPmRldiwgc2MtPmludGYpOworCQlpZiAocmMgPCAwKSB7CiAJCQlwcmludGsoS0VSTl9OT1RJQ0UKIAkJCSAgICAiJXM6IHVzYl9sb2NrX2RldmljZV9mb3JfcmVzZXQgZmFpbGVkICglZClcbiIsCi0JCQkgICAgc2MtPm5hbWUsIGxrcik7CisJCQkgICAgc2MtPm5hbWUsIHJjKTsKIAkJfSBlbHNlIHsKIAkJCXJjID0gdXNiX3Jlc2V0X2RldmljZShzYy0+ZGV2KTsKIAkJCWlmIChyYyA8IDApIHsKQEAgLTE2MDgsOSArMTYwOSw3IEBACiAJCQkJICAgICJ1c2JfbG9ja19kZXZpY2VfZm9yX3Jlc2V0IGZhaWxlZCAoJWQpXG4iLAogCQkJCSAgICBzYy0+bmFtZSwgcmMpOwogCQkJfQotCi0JCQlpZiAobGtyKQotCQkJCXVzYl91bmxvY2tfZGV2aWNlKHNjLT5kZXYpOworCQkJdXNiX3VubG9ja19kZXZpY2Uoc2MtPmRldik7CiAJCX0KIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9LY29uZmlnIGIvZHJpdmVycy9jaGFyL0tjb25maWcKaW5kZXggMTY5NzA0My4uZjViZTgwOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL0tjb25maWcKKysrIGIvZHJpdmVycy9jaGFyL0tjb25maWcKQEAgLTYxNiw2ICs2MTYsNyBAQAogCWRlZmF1bHQgeQogCXNlbGVjdCBIVkNfRFJJVkVSCiAJc2VsZWN0IEhWQ19JUlEKKwlzZWxlY3QgVklPUEFUSAogCWhlbHAKIAkgIGlTZXJpZXMgbWFjaGluZXMgc3VwcG9ydCBhIGh5cGVydmlzb3IgdmlydHVhbCBjb25zb2xlLgogCkBAIC04NDEsNyArODQyLDcgQEAKIAogY29uZmlnIEdFTl9SVEMKIAl0cmlzdGF0ZSAiR2VuZXJpYyAvZGV2L3J0YyBlbXVsYXRpb24iCi0JZGVwZW5kcyBvbiBSVEMhPXkgJiYgIUlBNjQgJiYgIUFSTSAmJiAhTTMyUiAmJiAhTUlQUyAmJiAhU1BBUkMgJiYgIUZSViAmJiAhUzM5MCAmJiAhU1VQRVJIICYmICFBVlIzMgorCWRlcGVuZHMgb24gUlRDIT15ICYmICFJQTY0ICYmICFBUk0gJiYgIU0zMlIgJiYgIU1JUFMgJiYgIVNQQVJDICYmICFGUlYgJiYgIVMzOTAgJiYgIVNVUEVSSCAmJiAhQVZSMzIgJiYgIUJMQUNLRklOCiAJLS0taGVscC0tLQogCSAgSWYgeW91IHNheSBZIGhlcmUgYW5kIGNyZWF0ZSBhIGNoYXJhY3RlciBzcGVjaWFsIGZpbGUgL2Rldi9ydGMgd2l0aAogCSAgbWFqb3IgbnVtYmVyIDEwIGFuZCBtaW5vciBudW1iZXIgMTM1IHVzaW5nIG1rbm9kICgibWFuIG1rbm9kIiksIHlvdQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2NvbnNvbGVtYXAuYyBiL2RyaXZlcnMvY2hhci9jb25zb2xlbWFwLmMKaW5kZXggNDI0NmI4ZS4uNDVkM2U4MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2NvbnNvbGVtYXAuYworKysgYi9kcml2ZXJzL2NoYXIvY29uc29sZW1hcC5jCkBAIC01NTQsNyArNTU0LDcgQEAKIAkJX19nZXRfdXNlcihmb250cG9zLCAmbGlzdC0+Zm9udHBvcyk7CiAJCWlmICgoZXJyMSA9IGNvbl9pbnNlcnRfdW5pcGFpcihwLCB1bmljb2RlLGZvbnRwb3MpKSAhPSAwKQogCQkJZXJyID0gZXJyMTsKLQkJCWxpc3QrKzsKKwkJbGlzdCsrOwogCX0KIAkKIAlpZiAoY29uX3VuaWZ5X3VuaW1hcCh2YywgcCkpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZXBjYS5jIGIvZHJpdmVycy9jaGFyL2VwY2EuYwppbmRleCAzOWFkODIwLi5hZjdjMTNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZXBjYS5jCisrKyBiL2RyaXZlcnMvY2hhci9lcGNhLmMKQEAgLTc2OSw3ICs3NjksNyBAQAogCS8qIENoZWNrIHN0YXR1cyBvZiBib2FyZCBjb25maWd1cmVkIGluIHN5c3RlbS4gICovCiAKIAkvKgotCSAqIEkgY2hlY2sgdG8gc2VlIGlmIHRoZSBlcGNhX3NldHVwIHJvdXRpbmUgZGV0ZWN0ZWQgYW4gdXNlciBlcnJvci4gSXQKKwkgKiBJIGNoZWNrIHRvIHNlZSBpZiB0aGUgZXBjYV9zZXR1cCByb3V0aW5lIGRldGVjdGVkIGEgdXNlciBlcnJvci4gSXQKIAkgKiBtaWdodCBiZSBiZXR0ZXIgdG8gcHV0IHRoaXMgaW4gcGNfaW5pdCwgYnV0IGZvciB0aGUgbW9tZW50IGl0IGdvZXMKIAkgKiBoZXJlLgogCSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2h2Y19iZWF0LmMgYi9kcml2ZXJzL2NoYXIvaHZjX2JlYXQuYwppbmRleCA5MWNkYjM1Li4wYWZjOGI4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvaHZjX2JlYXQuYworKysgYi9kcml2ZXJzL2NoYXIvaHZjX2JlYXQuYwpAQCAtNDQsNyArNDQsNyBAQAogCXN0YXRpYyB1bnNpZ25lZCBjaGFyIHFbc2l6ZW9mKHVuc2lnbmVkIGxvbmcpICogMl0KIAkJX19hdHRyaWJ1dGVfXygoYWxpZ25lZChzaXplb2YodW5zaWduZWQgbG9uZykpKSk7CiAJc3RhdGljIGludCBxbGVuID0gMDsKLQl1bnNpZ25lZCBsb25nIGdvdDsKKwl1NjQgZ290OwogCiBhZ2FpbjoKIAlpZiAocWxlbikgewpAQCAtNjMsNyArNjMsNyBAQAogCQl9CiAJfQogCWlmIChiZWF0X2dldF90ZXJtX2NoYXIodnRlcm1ubywgJmdvdCwKLQkJKCh1bnNpZ25lZCBsb25nICopcSksICgodW5zaWduZWQgbG9uZyAqKXEpICsgMSkgPT0gMCkgeworCQkoKHU2NCAqKXEpLCAoKHU2NCAqKXEpICsgMSkgPT0gMCkgewogCQlxbGVuID0gZ290OwogCQlnb3RvIGFnYWluOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9od19yYW5kb20vbjItZHJ2LmMgYi9kcml2ZXJzL2NoYXIvaHdfcmFuZG9tL24yLWRydi5jCmluZGV4IDg4NTlhZWEuLjliM2UwOWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9od19yYW5kb20vbjItZHJ2LmMKKysrIGIvZHJpdmVycy9jaGFyL2h3X3JhbmRvbS9uMi1kcnYuYwpAQCAtNDgyLDcgKzQ4Miw3IEBACiAJaW50IGk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgU0VMRlRFU1RfQlVGRkVSX1dPUkRTOyBpKyspCi0JCWRldl9lcnIoJm5wLT5vcC0+ZGV2LCAiVGVzdCBidWZmZXIgc2xvdCAlZCBbMHglMDE2bHhdXG4iLAorCQlkZXZfZXJyKCZucC0+b3AtPmRldiwgIlRlc3QgYnVmZmVyIHNsb3QgJWQgWzB4JTAxNmxseF1cbiIsCiAJCQlpLCBucC0+dGVzdF9idWZmZXJbaV0pOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvbWVtLmMgYi9kcml2ZXJzL2NoYXIvbWVtLmMKaW5kZXggNjQzMWY2OS4uMzU4NmIzYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL21lbS5jCisrKyBiL2RyaXZlcnMvY2hhci9tZW0uYwpAQCAtNDI1LDkgKzQyNSw2IEBACiB9CiAjZW5kaWYKIAotZXh0ZXJuIGxvbmcgdnJlYWQoY2hhciAqYnVmLCBjaGFyICphZGRyLCB1bnNpZ25lZCBsb25nIGNvdW50KTsKLWV4dGVybiBsb25nIHZ3cml0ZShjaGFyICpidWYsIGNoYXIgKmFkZHIsIHVuc2lnbmVkIGxvbmcgY291bnQpOwotCiAjaWZkZWYgQ09ORklHX0RFVktNRU0KIC8qCiAgKiBUaGlzIGZ1bmN0aW9uIHJlYWRzIHRoZSAqdmlydHVhbCogbWVtb3J5IGFzIHNlZW4gYnkgdGhlIGtlcm5lbC4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9td2F2ZS9td2F2ZWRkLmMgYi9kcml2ZXJzL2NoYXIvbXdhdmUvbXdhdmVkZC5jCmluZGV4IDRmOGQ2N2YuLjk0YWQyYzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9td2F2ZS9td2F2ZWRkLmMKKysrIGIvZHJpdmVycy9jaGFyL213YXZlL213YXZlZGQuYwpAQCAtNjYzLDcgKzY2Myw3IEBACiAjaWYgMAogCS8qIHN5c2ZzICovCiAJbWVtc2V0KCZtd2F2ZV9kZXZpY2UsIDAsIHNpemVvZiAoc3RydWN0IGRldmljZSkpOwotCXNucHJpbnRmKG13YXZlX2RldmljZS5idXNfaWQsIEJVU19JRF9TSVpFLCAibXdhdmUiKTsKKwlkZXZfc2V0X25hbWUoJm13YXZlX2RldmljZSwgIm13YXZlIik7CiAKIAlpZiAoZGV2aWNlX3JlZ2lzdGVyKCZtd2F2ZV9kZXZpY2UpKQogCQlnb3RvIGNsZWFudXBfZXJyb3I7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcHR5LmMgYi9kcml2ZXJzL2NoYXIvcHR5LmMKaW5kZXggMTEyYTZiYS4uMTQ2Yzk3NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3B0eS5jCisrKyBiL2RyaXZlcnMvY2hhci9wdHkuYwpAQCAtMzIsNyArMzIsNyBAQAogCiAvKiBUaGVzZSBhcmUgZ2xvYmFsIGJlY2F1c2UgdGhleSBhcmUgYWNjZXNzZWQgaW4gdHR5X2lvLmMgKi8KICNpZmRlZiBDT05GSUdfVU5JWDk4X1BUWVMKLXN0cnVjdCB0dHlfZHJpdmVyICpwdG1fZHJpdmVyOworc3RhdGljIHN0cnVjdCB0dHlfZHJpdmVyICpwdG1fZHJpdmVyOwogc3RhdGljIHN0cnVjdCB0dHlfZHJpdmVyICpwdHNfZHJpdmVyOwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yYW5kb20uYyBiL2RyaXZlcnMvY2hhci9yYW5kb20uYwppbmRleCBjN2FmYzA2Li43YzEzNTgxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvcmFuZG9tLmMKKysrIGIvZHJpdmVycy9jaGFyL3JhbmRvbS5jCkBAIC00MDcsNyArNDA3LDcgQEAKIAkvKiByZWFkLXdyaXRlIGRhdGE6ICovCiAJc3BpbmxvY2tfdCBsb2NrOwogCXVuc2lnbmVkIGFkZF9wdHI7Ci0JaW50IGVudHJvcHlfY291bnQ7CS8qIE11c3QgYXQgbm8gdGltZSBleGNlZWQgLT5QT09MQklUUyEgKi8KKwlpbnQgZW50cm9weV9jb3VudDsKIAlpbnQgaW5wdXRfcm90YXRlOwogfTsKIApAQCAtNzY3LDExICs3NjcsMTAgQEAKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JQlVHX09OKHItPmVudHJvcHlfY291bnQgPiByLT5wb29saW5mby0+UE9PTEJJVFMpOwotCiAJLyogSG9sZCBsb2NrIHdoaWxlIGFjY291bnRpbmcgKi8KIAlzcGluX2xvY2tfaXJxc2F2ZSgmci0+bG9jaywgZmxhZ3MpOwogCisJQlVHX09OKHItPmVudHJvcHlfY291bnQgPiByLT5wb29saW5mby0+UE9PTEJJVFMpOwogCURFQlVHX0VOVCgidHJ5aW5nIHRvIGV4dHJhY3QgJWQgYml0cyBmcm9tICVzXG4iLAogCQkgIG5ieXRlcyAqIDgsIHItPm5hbWUpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcnRjLmMgYi9kcml2ZXJzL2NoYXIvcnRjLmMKaW5kZXggMjBkNmVmYi4uZTBkMGY4YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3J0Yy5jCisrKyBiL2RyaXZlcnMvY2hhci9ydGMuYwpAQCAtNDgsOSArNDgsMTAgQEAKICAqCQlDT05GSUdfSFBFVF9FTVVMQVRFX1JUQwogICoJMS4xMmEJTWFjaWVqIFcuIFJvenlja2k6IEhhbmRsZSBtZW1vcnktbWFwcGVkIGNoaXBzIHByb3Blcmx5LgogICoJMS4xMmFjCUFsYW4gQ294OiBBbGxvdyByZWFkIGFjY2VzcyB0byB0aGUgZGF5IG9mIHdlZWsgcmVnaXN0ZXIKKyAqCTEuMTJiCURhdmlkIEpvaG46IFJlbW92ZSBjYWxscyB0byB0aGUgQktMLgogICovCiAKLSNkZWZpbmUgUlRDX1ZFUlNJT04JCSIxLjEyYWMiCisjZGVmaW5lIFJUQ19WRVJTSU9OCQkiMS4xMmIiCiAKIC8qCiAgKglOb3RlIHRoYXQgKmFsbCogY2FsbHMgdG8gQ01PU19SRUFEIGFuZCBDTU9TX1dSSVRFIGFyZSBkb25lIHdpdGgKQEAgLTczLDcgKzc0LDYgQEAKICNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgotI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvc3lzY3RsLmg+CiAjaW5jbHVkZSA8bGludXgvd2FpdC5oPgogI2luY2x1ZGUgPGxpbnV4L2JjZC5oPgpAQCAtMTgyLDggKzE4Miw4IEBACiAKIC8qCiAgKiBydGNfc3RhdHVzIGlzIG5ldmVyIGNoYW5nZWQgYnkgcnRjX2ludGVycnVwdCwgYW5kIGlvY3RsL29wZW4vY2xvc2UgaXMKLSAqIHByb3RlY3RlZCBieSB0aGUgYmlnIGtlcm5lbCBsb2NrLiBIb3dldmVyLCBpb2N0bCBjYW4gc3RpbGwgZGlzYWJsZSB0aGUgdGltZXIKLSAqIGluIHJ0Y19zdGF0dXMgYW5kIHRoZW4gd2l0aCBkZWxfdGltZXIgYWZ0ZXIgdGhlIGludGVycnVwdCBoYXMgcmVhZAorICogcHJvdGVjdGVkIGJ5IHRoZSBzcGluIGxvY2sgcnRjX2xvY2suIEhvd2V2ZXIsIGlvY3RsIGNhbiBzdGlsbCBkaXNhYmxlIHRoZQorICogdGltZXIgaW4gcnRjX3N0YXR1cyBhbmQgdGhlbiB3aXRoIGRlbF90aW1lciBhZnRlciB0aGUgaW50ZXJydXB0IGhhcyByZWFkCiAgKiBydGNfc3RhdHVzIGJ1dCBiZWZvcmUgbW9kX3RpbWVyIGlzIGNhbGxlZCwgd2hpY2ggd291bGQgdGhlbiByZWVuYWJsZSB0aGUKICAqIHRpbWVyIChidXQgeW91IHdvdWxkIG5lZWQgdG8gaGF2ZSBhbiBhd2Z1bCB0aW1pbmcgYmVmb3JlIHlvdSdkIHRyaXAgb24gaXQpCiAgKi8KQEAgLTcyMCw5ICs3MjAsNyBAQAogc3RhdGljIGxvbmcgcnRjX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKIAlsb25nIHJldDsKLQlsb2NrX2tlcm5lbCgpOwogCXJldCA9IHJ0Y19kb19pb2N0bChjbWQsIGFyZywgMCk7Ci0JdW5sb2NrX2tlcm5lbCgpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTczMSwxMiArNzI5LDggQEAKICAqCUFsc28gY2xlYXIgdGhlIHByZXZpb3VzIGludGVycnVwdCBkYXRhIG9uIGFuIG9wZW4sIGFuZCBjbGVhbgogICoJdXAgdGhpbmdzIG9uIGEgY2xvc2UuCiAgKi8KLQotLyogV2UgdXNlIHJ0Y19sb2NrIHRvIHByb3RlY3QgYWdhaW5zdCBjb25jdXJyZW50IG9wZW5zLiBTbyB0aGUgQktMIGlzIG5vdAotICogbmVlZGVkIGhlcmUuIE9yIGFueXdoZXJlIGVsc2UgaW4gdGhpcyBkcml2ZXIuICovCiBzdGF0aWMgaW50IHJ0Y19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQogewotCWxvY2tfa2VybmVsKCk7CiAJc3Bpbl9sb2NrX2lycSgmcnRjX2xvY2spOwogCiAJaWYgKHJ0Y19zdGF0dXMgJiBSVENfSVNfT1BFTikKQEAgLTc0NiwxMiArNzQwLDEwIEBACiAKIAlydGNfaXJxX2RhdGEgPSAwOwogCXNwaW5fdW5sb2NrX2lycSgmcnRjX2xvY2spOwotCXVubG9ja19rZXJuZWwoKTsKIAlyZXR1cm4gMDsKIAogb3V0X2J1c3k6CiAJc3Bpbl91bmxvY2tfaXJxKCZydGNfbG9jayk7Ci0JdW5sb2NrX2tlcm5lbCgpOwogCXJldHVybiAtRUJVU1k7CiB9CiAKQEAgLTgwMCw3ICs3OTIsNiBAQAogfQogCiAjaWZkZWYgUlRDX0lSUQotLyogQ2FsbGVkIHdpdGhvdXQgdGhlIGtlcm5lbCBsb2NrIC0gZmluZSAqLwogc3RhdGljIHVuc2lnbmVkIGludCBydGNfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwgcG9sbF90YWJsZSAqd2FpdCkKIHsKIAl1bnNpZ25lZCBsb25nIGw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvc3lzcnEuYyBiL2RyaXZlcnMvY2hhci9zeXNycS5jCmluZGV4IDk0OTY2ZWQuLmQ0MWI5ZjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9zeXNycS5jCisrKyBiL2RyaXZlcnMvY2hhci9zeXNycS5jCkBAIC04Miw3ICs4Miw3IEBACiB9CiBzdGF0aWMgc3RydWN0IHN5c3JxX2tleV9vcCBzeXNycV9sb2dsZXZlbF9vcCA9IHsKIAkuaGFuZGxlcgk9IHN5c3JxX2hhbmRsZV9sb2dsZXZlbCwKLQkuaGVscF9tc2cJPSAibG9nbGV2ZWwwLTgiLAorCS5oZWxwX21zZwk9ICJsb2dsZXZlbCgwLTkpIiwKIAkuYWN0aW9uX21zZwk9ICJDaGFuZ2luZyBMb2dsZXZlbCIsCiAJLmVuYWJsZV9tYXNrCT0gU1lTUlFfRU5BQkxFX0xPRywKIH07CkBAIC0yMzMsNyArMjMzLDcgQEAKIAogc3RhdGljIHN0cnVjdCBzeXNycV9rZXlfb3Agc3lzcnFfc2hvd2FsbGNwdXNfb3AgPSB7CiAJLmhhbmRsZXIJPSBzeXNycV9oYW5kbGVfc2hvd2FsbGNwdXMsCi0JLmhlbHBfbXNnCT0gImFMbGNwdXMiLAorCS5oZWxwX21zZwk9ICJzaG93LWJhY2t0cmFjZS1hbGwtYWN0aXZlLWNwdXMoTCkiLAogCS5hY3Rpb25fbXNnCT0gIlNob3cgYmFja3RyYWNlIG9mIGFsbCBhY3RpdmUgQ1BVcyIsCiAJLmVuYWJsZV9tYXNrCT0gU1lTUlFfRU5BQkxFX0RVTVAsCiB9OwpAQCAtMjQ3LDcgKzI0Nyw3IEBACiB9CiBzdGF0aWMgc3RydWN0IHN5c3JxX2tleV9vcCBzeXNycV9zaG93cmVnc19vcCA9IHsKIAkuaGFuZGxlcgk9IHN5c3JxX2hhbmRsZV9zaG93cmVncywKLQkuaGVscF9tc2cJPSAic2hvd1BjIiwKKwkuaGVscF9tc2cJPSAic2hvdy1yZWdpc3RlcnMoUCkiLAogCS5hY3Rpb25fbXNnCT0gIlNob3cgUmVncyIsCiAJLmVuYWJsZV9tYXNrCT0gU1lTUlFfRU5BQkxFX0RVTVAsCiB9OwpAQCAtMjU4LDcgKzI1OCw3IEBACiB9CiBzdGF0aWMgc3RydWN0IHN5c3JxX2tleV9vcCBzeXNycV9zaG93c3RhdGVfb3AgPSB7CiAJLmhhbmRsZXIJPSBzeXNycV9oYW5kbGVfc2hvd3N0YXRlLAotCS5oZWxwX21zZwk9ICJzaG93VGFza3MiLAorCS5oZWxwX21zZwk9ICJzaG93LXRhc2stc3RhdGVzKFQpIiwKIAkuYWN0aW9uX21zZwk9ICJTaG93IFN0YXRlIiwKIAkuZW5hYmxlX21hc2sJPSBTWVNSUV9FTkFCTEVfRFVNUCwKIH07CkBAIC0yNjksNyArMjY5LDcgQEAKIH0KIHN0YXRpYyBzdHJ1Y3Qgc3lzcnFfa2V5X29wIHN5c3JxX3Nob3dzdGF0ZV9ibG9ja2VkX29wID0gewogCS5oYW5kbGVyCT0gc3lzcnFfaGFuZGxlX3Nob3dzdGF0ZV9ibG9ja2VkLAotCS5oZWxwX21zZwk9ICJzaG9XLWJsb2NrZWQtdGFza3MiLAorCS5oZWxwX21zZwk9ICJzaG93LWJsb2NrZWQtdGFza3MoVykiLAogCS5hY3Rpb25fbXNnCT0gIlNob3cgQmxvY2tlZCBTdGF0ZSIsCiAJLmVuYWJsZV9tYXNrCT0gU1lTUlFfRU5BQkxFX0RVTVAsCiB9OwpAQCAtMjk3LDcgKzI5Nyw3IEBACiB9CiBzdGF0aWMgc3RydWN0IHN5c3JxX2tleV9vcCBzeXNycV9zaG93bWVtX29wID0gewogCS5oYW5kbGVyCT0gc3lzcnFfaGFuZGxlX3Nob3dtZW0sCi0JLmhlbHBfbXNnCT0gInNob3dNZW0iLAorCS5oZWxwX21zZwk9ICJzaG93LW1lbW9yeS11c2FnZShNKSIsCiAJLmFjdGlvbl9tc2cJPSAiU2hvdyBNZW1vcnkiLAogCS5lbmFibGVfbWFzawk9IFNZU1JRX0VOQUJMRV9EVU1QLAogfTsKQEAgLTMyMyw3ICszMjMsNyBAQAogfQogc3RhdGljIHN0cnVjdCBzeXNycV9rZXlfb3Agc3lzcnFfdGVybV9vcCA9IHsKIAkuaGFuZGxlcgk9IHN5c3JxX2hhbmRsZV90ZXJtLAotCS5oZWxwX21zZwk9ICJ0RXJtIiwKKwkuaGVscF9tc2cJPSAidGVybWluYXRlLWFsbC10YXNrcyhFKSIsCiAJLmFjdGlvbl9tc2cJPSAiVGVybWluYXRlIEFsbCBUYXNrcyIsCiAJLmVuYWJsZV9tYXNrCT0gU1lTUlFfRU5BQkxFX1NJR05BTCwKIH07CkBAIC0zNDEsNyArMzQxLDcgQEAKIH0KIHN0YXRpYyBzdHJ1Y3Qgc3lzcnFfa2V5X29wIHN5c3JxX21vb21fb3AgPSB7CiAJLmhhbmRsZXIJPSBzeXNycV9oYW5kbGVfbW9vbSwKLQkuaGVscF9tc2cJPSAiRnVsbCIsCisJLmhlbHBfbXNnCT0gIm1lbW9yeS1mdWxsLW9vbS1raWxsKEYpIiwKIAkuYWN0aW9uX21zZwk9ICJNYW51YWwgT09NIGV4ZWN1dGlvbiIsCiAJLmVuYWJsZV9tYXNrCT0gU1lTUlFfRU5BQkxFX1NJR05BTCwKIH07CkBAIC0zNTMsNyArMzUzLDcgQEAKIH0KIHN0YXRpYyBzdHJ1Y3Qgc3lzcnFfa2V5X29wIHN5c3JxX2tpbGxfb3AgPSB7CiAJLmhhbmRsZXIJPSBzeXNycV9oYW5kbGVfa2lsbCwKLQkuaGVscF9tc2cJPSAia0lsbCIsCisJLmhlbHBfbXNnCT0gImtpbGwtYWxsLXRhc2tzKEkpIiwKIAkuYWN0aW9uX21zZwk9ICJLaWxsIEFsbCBUYXNrcyIsCiAJLmVuYWJsZV9tYXNrCT0gU1lTUlFfRU5BQkxFX1NJR05BTCwKIH07CkBAIC0zNjQsNyArMzY0LDcgQEAKIH0KIHN0YXRpYyBzdHJ1Y3Qgc3lzcnFfa2V5X29wIHN5c3JxX3VucnRfb3AgPSB7CiAJLmhhbmRsZXIJPSBzeXNycV9oYW5kbGVfdW5ydCwKLQkuaGVscF9tc2cJPSAiTmljZSIsCisJLmhlbHBfbXNnCT0gIm5pY2UtYWxsLVJULXRhc2tzKE4pIiwKIAkuYWN0aW9uX21zZwk9ICJOaWNlIEFsbCBSVCBUYXNrcyIsCiAJLmVuYWJsZV9tYXNrCT0gU1lTUlFfRU5BQkxFX1JUTklDRSwKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvdHBtL3RwbV9uc2MuYyBiL2RyaXZlcnMvY2hhci90cG0vdHBtX25zYy5jCmluZGV4IGFiMThjMWUuLjcwZWZiYTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci90cG0vdHBtX25zYy5jCisrKyBiL2RyaXZlcnMvY2hhci90cG0vdHBtX25zYy5jCkBAIC0yNzMsMTIgKzI3MywyMyBAQAogCX0KIH0KIAotc3RhdGljIHN0cnVjdCBkZXZpY2VfZHJpdmVyIG5zY19kcnYgPSB7Ci0JLm5hbWUgPSAidHBtX25zYyIsCi0JLmJ1cyA9ICZwbGF0Zm9ybV9idXNfdHlwZSwKLQkub3duZXIgPSBUSElTX01PRFVMRSwKLQkuc3VzcGVuZCA9IHRwbV9wbV9zdXNwZW5kLAotCS5yZXN1bWUgPSB0cG1fcG1fcmVzdW1lLAorc3RhdGljIGludCB0cG1fbnNjX3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2LCBwbV9tZXNzYWdlX3QgbXNnKQoreworCXJldHVybiB0cG1fcG1fc3VzcGVuZCgmZGV2LT5kZXYsIG1zZyk7Cit9CisKK3N0YXRpYyBpbnQgdHBtX25zY19yZXN1bWUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQoreworCXJldHVybiB0cG1fcG1fcmVzdW1lKCZkZXYtPmRldik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG5zY19kcnYgPSB7CisJLnN1c3BlbmQgICAgICAgICA9IHRwbV9uc2Nfc3VzcGVuZCwKKwkucmVzdW1lICAgICAgICAgID0gdHBtX25zY19yZXN1bWUsCisJLmRyaXZlciAgICAgICAgICA9IHsKKwkJLm5hbWUgICAgPSAidHBtX25zYyIsCisJCS5vd25lciAgID0gVEhJU19NT0RVTEUsCisJfSwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IGluaXRfbnNjKHZvaWQpCkBAIC0yOTcsNyArMzA4LDcgQEAKIAkJCXJldHVybiAtRU5PREVWOwogCX0KIAotCWVyciA9IGRyaXZlcl9yZWdpc3RlcigmbnNjX2Rydik7CisJZXJyID0gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZuc2NfZHJ2KTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwogCkBAIC0zMDgsMTcgKzMxOSwxNSBAQAogCS8qIGVuYWJsZSB0aGUgRFBNIG1vZHVsZSAqLwogCXRwbV93cml0ZV9pbmRleChuc2NBZGRyQmFzZSwgTlNDX0xEQ19JTkRFWCwgMHgwMSk7CiAKLQlwZGV2ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHBsYXRmb3JtX2RldmljZSksIEdGUF9LRVJORUwpOworCXBkZXYgPSBwbGF0Zm9ybV9kZXZpY2VfYWxsb2MoInRwbV9uc2NsMCIsIC0xKTsKIAlpZiAoIXBkZXYpIHsKIAkJcmMgPSAtRU5PTUVNOwogCQlnb3RvIGVycl91bnJlZ19kcnY7CiAJfQogCi0JcGRldi0+bmFtZSA9ICJ0cG1fbnNjbDAiOwotCXBkZXYtPmlkID0gLTE7CiAJcGRldi0+bnVtX3Jlc291cmNlcyA9IDA7CisJcGRldi0+ZGV2LmRyaXZlciA9ICZuc2NfZHJ2LmRyaXZlcjsKIAlwZGV2LT5kZXYucmVsZWFzZSA9IHRwbV9uc2NfcmVtb3ZlOwotCXBkZXYtPmRldi5kcml2ZXIgPSAmbnNjX2RydjsKIAogCWlmICgocmMgPSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIocGRldikpIDwgMCkKIAkJZ290byBlcnJfZnJlZV9kZXY7CkBAIC0zNzcsNyArMzg2LDcgQEAKIGVycl9mcmVlX2RldjoKIAlrZnJlZShwZGV2KTsKIGVycl91bnJlZ19kcnY6Ci0JZHJpdmVyX3VucmVnaXN0ZXIoJm5zY19kcnYpOworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZuc2NfZHJ2KTsKIAlyZXR1cm4gcmM7CiB9CiAKQEAgLTM5MCw3ICszOTksNyBAQAogCQlwZGV2ID0gTlVMTDsKIAl9CiAKLQlkcml2ZXJfdW5yZWdpc3RlcigmbnNjX2Rydik7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJm5zY19kcnYpOwogfQogCiBtb2R1bGVfaW5pdChpbml0X25zYyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvdnQuYyBiL2RyaXZlcnMvY2hhci92dC5jCmluZGV4IDgwMDE0MjEuLjc5MDBiZDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci92dC5jCisrKyBiL2RyaXZlcnMvY2hhci92dC5jCkBAIC05NjksOCArOTY5LDcgQEAKICAqCVRha2VzIHRoZSBjb25zb2xlIHNlbSBhbmQgdGhlIGNhbGxlZCBtZXRob2RzIHRoZW4gdGFrZSB0aGUgdHR5CiAgKgl0ZXJtaW9zX211dGV4IGFuZCB0aGUgdHR5IGN0cmxfbG9jayBpbiB0aGF0IG9yZGVyLgogICovCi0KLWludCB2dF9yZXNpemUoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IHdpbnNpemUgKndzKQorc3RhdGljIGludCB2dF9yZXNpemUoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IHdpbnNpemUgKndzKQogewogCXN0cnVjdCB2Y19kYXRhICp2YyA9IHR0eS0+ZHJpdmVyX2RhdGE7CiAJaW50IHJldDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3B1ZnJlcS9LY29uZmlnIGIvZHJpdmVycy9jcHVmcmVxL0tjb25maWcKaW5kZXggNWYwNzZhZS4uYThjOGQ5YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcHVmcmVxL0tjb25maWcKKysrIGIvZHJpdmVycy9jcHVmcmVxL0tjb25maWcKQEAgLTgzLDcgKzgzLDcgQEAKIAlzZWxlY3QgQ1BVX0ZSRVFfR09WX1VTRVJTUEFDRQogCWhlbHAKIAkgIFVzZSB0aGUgQ1BVRnJlcSBnb3Zlcm5vciAndXNlcnNwYWNlJyBhcyBkZWZhdWx0LiBUaGlzIGFsbG93cwotCSAgeW91IHRvIHNldCB0aGUgQ1BVIGZyZXF1ZW5jeSBtYW51YWxseSBvciB3aGVuIGFuIHVzZXJzcGFjZSAKKwkgIHlvdSB0byBzZXQgdGhlIENQVSBmcmVxdWVuY3kgbWFudWFsbHkgb3Igd2hlbiBhIHVzZXJzcGFjZSAKIAkgIHByb2dyYW0gc2hhbGwgYmUgYWJsZSB0byBzZXQgdGhlIENQVSBkeW5hbWljYWxseSB3aXRob3V0IGhhdmluZwogCSAgdG8gZW5hYmxlIHRoZSB1c2Vyc3BhY2UgZ292ZXJub3IgbWFudWFsbHkuCiAKQEAgLTEzOCw3ICsxMzgsNyBAQAogCXRyaXN0YXRlICIndXNlcnNwYWNlJyBnb3Zlcm5vciBmb3IgdXNlcnNwYWNlIGZyZXF1ZW5jeSBzY2FsaW5nIgogCWhlbHAKIAkgIEVuYWJsZSB0aGlzIGNwdWZyZXEgZ292ZXJub3Igd2hlbiB5b3UgZWl0aGVyIHdhbnQgdG8gc2V0IHRoZQotCSAgQ1BVIGZyZXF1ZW5jeSBtYW51YWxseSBvciB3aGVuIGFuIHVzZXJzcGFjZSBwcm9ncmFtIHNoYWxsCisJICBDUFUgZnJlcXVlbmN5IG1hbnVhbGx5IG9yIHdoZW4gYSB1c2Vyc3BhY2UgcHJvZ3JhbSBzaGFsbAogCSAgYmUgYWJsZSB0byBzZXQgdGhlIENQVSBkeW5hbWljYWxseSwgbGlrZSBvbiBMQVJUIAogCSAgPGh0dHA6Ly93d3cubGFydG1ha2VyLm5sLz4uCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxLmMgYi9kcml2ZXJzL2NwdWZyZXEvY3B1ZnJlcS5jCmluZGV4IDMxZDZmNTMuLjAxZGRlODAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxLmMKKysrIGIvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXEuYwpAQCAtNzU0LDYgKzc1NCwxMSBAQAogCS5yZWxlYXNlCT0gY3B1ZnJlcV9zeXNmc19yZWxlYXNlLAogfTsKIAorc3RhdGljIHN0cnVjdCBrb2JqX3R5cGUga3R5cGVfZW1wdHlfY3B1ZnJlcSA9IHsKKwkuc3lzZnNfb3BzCT0gJnN5c2ZzX29wcywKKwkucmVsZWFzZQk9IGNwdWZyZXFfc3lzZnNfcmVsZWFzZSwKK307CisKIAogLyoqCiAgKiBjcHVmcmVxX2FkZF9kZXYgLSBhZGQgYSBDUFUgZGV2aWNlCkBAIC04MjIsOCArODI3LDggQEAKIAkJZHByaW50aygiaW5pdGlhbGl6YXRpb24gZmFpbGVkXG4iKTsKIAkJZ290byBlcnJfb3V0OwogCX0KLQlwb2xpY3ktPnVzZXJfcG9saWN5Lm1pbiA9IHBvbGljeS0+Y3B1aW5mby5taW5fZnJlcTsKLQlwb2xpY3ktPnVzZXJfcG9saWN5Lm1heCA9IHBvbGljeS0+Y3B1aW5mby5tYXhfZnJlcTsKKwlwb2xpY3ktPnVzZXJfcG9saWN5Lm1pbiA9IHBvbGljeS0+bWluOworCXBvbGljeS0+dXNlcl9wb2xpY3kubWF4ID0gcG9saWN5LT5tYXg7CiAKIAlibG9ja2luZ19ub3RpZmllcl9jYWxsX2NoYWluKCZjcHVmcmVxX3BvbGljeV9ub3RpZmllcl9saXN0LAogCQkJCSAgICAgQ1BVRlJFUV9TVEFSVCwgcG9saWN5KTsKQEAgLTg3NiwyNiArODgxLDM2IEBACiAJbWVtY3B5KCZuZXdfcG9saWN5LCBwb2xpY3ksIHNpemVvZihzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kpKTsKIAogCS8qIHByZXBhcmUgaW50ZXJmYWNlIGRhdGEgKi8KLQlyZXQgPSBrb2JqZWN0X2luaXRfYW5kX2FkZCgmcG9saWN5LT5rb2JqLCAma3R5cGVfY3B1ZnJlcSwgJnN5c19kZXYtPmtvYmosCi0JCQkJICAgImNwdWZyZXEiKTsKLQlpZiAocmV0KQotCQlnb3RvIGVycl9vdXRfZHJpdmVyX2V4aXQ7CisJaWYgKCFjcHVmcmVxX2RyaXZlci0+aGlkZV9pbnRlcmZhY2UpIHsKKwkJcmV0ID0ga29iamVjdF9pbml0X2FuZF9hZGQoJnBvbGljeS0+a29iaiwgJmt0eXBlX2NwdWZyZXEsCisJCQkJCSAgICZzeXNfZGV2LT5rb2JqLCAiY3B1ZnJlcSIpOworCQlpZiAocmV0KQorCQkJZ290byBlcnJfb3V0X2RyaXZlcl9leGl0OwogCi0JLyogc2V0IHVwIGZpbGVzIGZvciB0aGlzIGNwdSBkZXZpY2UgKi8KLQlkcnZfYXR0ciA9IGNwdWZyZXFfZHJpdmVyLT5hdHRyOwotCXdoaWxlICgoZHJ2X2F0dHIpICYmICgqZHJ2X2F0dHIpKSB7Ci0JCXJldCA9IHN5c2ZzX2NyZWF0ZV9maWxlKCZwb2xpY3ktPmtvYmosICYoKCpkcnZfYXR0ciktPmF0dHIpKTsKLQkJaWYgKHJldCkKLQkJCWdvdG8gZXJyX291dF9kcml2ZXJfZXhpdDsKLQkJZHJ2X2F0dHIrKzsKLQl9Ci0JaWYgKGNwdWZyZXFfZHJpdmVyLT5nZXQpIHsKLQkJcmV0ID0gc3lzZnNfY3JlYXRlX2ZpbGUoJnBvbGljeS0+a29iaiwgJmNwdWluZm9fY3VyX2ZyZXEuYXR0cik7Ci0JCWlmIChyZXQpCi0JCQlnb3RvIGVycl9vdXRfZHJpdmVyX2V4aXQ7Ci0JfQotCWlmIChjcHVmcmVxX2RyaXZlci0+dGFyZ2V0KSB7Ci0JCXJldCA9IHN5c2ZzX2NyZWF0ZV9maWxlKCZwb2xpY3ktPmtvYmosICZzY2FsaW5nX2N1cl9mcmVxLmF0dHIpOworCQkvKiBzZXQgdXAgZmlsZXMgZm9yIHRoaXMgY3B1IGRldmljZSAqLworCQlkcnZfYXR0ciA9IGNwdWZyZXFfZHJpdmVyLT5hdHRyOworCQl3aGlsZSAoKGRydl9hdHRyKSAmJiAoKmRydl9hdHRyKSkgeworCQkJcmV0ID0gc3lzZnNfY3JlYXRlX2ZpbGUoJnBvbGljeS0+a29iaiwKKwkJCQkJCSYoKCpkcnZfYXR0ciktPmF0dHIpKTsKKwkJCWlmIChyZXQpCisJCQkJZ290byBlcnJfb3V0X2RyaXZlcl9leGl0OworCQkJZHJ2X2F0dHIrKzsKKwkJfQorCQlpZiAoY3B1ZnJlcV9kcml2ZXItPmdldCkgeworCQkJcmV0ID0gc3lzZnNfY3JlYXRlX2ZpbGUoJnBvbGljeS0+a29iaiwKKwkJCQkJCSZjcHVpbmZvX2N1cl9mcmVxLmF0dHIpOworCQkJaWYgKHJldCkKKwkJCQlnb3RvIGVycl9vdXRfZHJpdmVyX2V4aXQ7CisJCX0KKwkJaWYgKGNwdWZyZXFfZHJpdmVyLT50YXJnZXQpIHsKKwkJCXJldCA9IHN5c2ZzX2NyZWF0ZV9maWxlKCZwb2xpY3ktPmtvYmosCisJCQkJCQkmc2NhbGluZ19jdXJfZnJlcS5hdHRyKTsKKwkJCWlmIChyZXQpCisJCQkJZ290byBlcnJfb3V0X2RyaXZlcl9leGl0OworCQl9CisJfSBlbHNlIHsKKwkJcmV0ID0ga29iamVjdF9pbml0X2FuZF9hZGQoJnBvbGljeS0+a29iaiwgJmt0eXBlX2VtcHR5X2NwdWZyZXEsCisJCQkJCSAgICZzeXNfZGV2LT5rb2JqLCAiY3B1ZnJlcSIpOwogCQlpZiAocmV0KQogCQkJZ290byBlcnJfb3V0X2RyaXZlcl9leGl0OwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZWRhYy9LY29uZmlnIGIvZHJpdmVycy9lZGFjL0tjb25maWcKaW5kZXggZTI2NjdhOC4uZWVlNDdmZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9lZGFjL0tjb25maWcKKysrIGIvZHJpdmVycy9lZGFjL0tjb25maWcKQEAgLTEwOSw2ICsxMDksMTMgQEAKIAkgIFN1cHBvcnQgZm9yIGVycm9yIGRldGVjdGlvbiBhbmQgY29ycmVjdGlvbiBvbiB0aGUgSW50ZWwKIAkgIFgzOCBzZXJ2ZXIgY2hpcHNldHMuCiAKK2NvbmZpZyBFREFDX0k1NDAwCisJdHJpc3RhdGUgIkludGVsIDU0MDAgKFNlYWJ1cmcpIGNoaXBzZXRzIgorCWRlcGVuZHMgb24gRURBQ19NTV9FREFDICYmIFBDSSAmJiBYODYKKwloZWxwCisJICBTdXBwb3J0IGZvciBlcnJvciBkZXRlY3Rpb24gYW5kIGNvcnJlY3Rpb24gdGhlIEludGVsCisJICBpNTQwMCBNQ0ggY2hpcHNldCAoU2VhYnVyZykuCisKIGNvbmZpZyBFREFDX0k4Mjg2MAogCXRyaXN0YXRlICJJbnRlbCA4Mjg2MCIKIAlkZXBlbmRzIG9uIEVEQUNfTU1fRURBQyAmJiBQQ0kgJiYgWDg2XzMyCmRpZmYgLS1naXQgYS9kcml2ZXJzL2VkYWMvTWFrZWZpbGUgYi9kcml2ZXJzL2VkYWMvTWFrZWZpbGUKaW5kZXggNjJjMmQ5Yi4uYjc1MTk2OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9lZGFjL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvZWRhYy9NYWtlZmlsZQpAQCAtMjAsNiArMjAsNyBAQAogb2JqLSQoQ09ORklHX0VEQUNfQU1ENzZYKQkJKz0gYW1kNzZ4X2VkYWMubwogb2JqLSQoQ09ORklHX0VEQUNfSTUwMDApCQkrPSBpNTAwMF9lZGFjLm8KIG9iai0kKENPTkZJR19FREFDX0k1MTAwKQkJKz0gaTUxMDBfZWRhYy5vCitvYmotJChDT05GSUdfRURBQ19JNTQwMCkJCSs9IGk1NDAwX2VkYWMubwogb2JqLSQoQ09ORklHX0VEQUNfRTdYWFgpCQkrPSBlN3h4eF9lZGFjLm8KIG9iai0kKENPTkZJR19FREFDX0U3NTJYKQkJKz0gZTc1MnhfZWRhYy5vCiBvYmotJChDT05GSUdfRURBQ19JODI0NDNCWEdYKQkJKz0gaTgyNDQzYnhneF9lZGFjLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZWRhYy9lZGFjX2RldmljZS5jIGIvZHJpdmVycy9lZGFjL2VkYWNfZGV2aWNlLmMKaW5kZXggNDA0MWU5MS4uY2E5MTEzZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9lZGFjL2VkYWNfZGV2aWNlLmMKKysrIGIvZHJpdmVycy9lZGFjL2VkYWNfZGV2aWNlLmMKQEAgLTMzMyw3ICszMzMsNyBAQAogZmFpbDA6CiAJZWRhY19wcmludGsoS0VSTl9XQVJOSU5HLCBFREFDX01DLAogCQkJIiVzICglcykgJXMgJXMgYWxyZWFkeSBhc3NpZ25lZCAlZFxuIiwKLQkJCXJvdmVyLT5kZXYtPmJ1c19pZCwgZWRhY19kZXZfbmFtZShyb3ZlciksCisJCQlkZXZfbmFtZShyb3Zlci0+ZGV2KSwgZWRhY19kZXZfbmFtZShyb3ZlciksCiAJCQlyb3Zlci0+bW9kX25hbWUsIHJvdmVyLT5jdGxfbmFtZSwgcm92ZXItPmRldl9pZHgpOwogCXJldHVybiAxOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2VkYWMvZWRhY19tYy5jIGIvZHJpdmVycy9lZGFjL2VkYWNfbWMuYwppbmRleCBkMTEwMzkyLi4yNWQ2Njk0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2VkYWMvZWRhY19tYy5jCisrKyBiL2RyaXZlcnMvZWRhYy9lZGFjX21jLmMKQEAgLTQwMSw3ICs0MDEsNyBAQAogCiBmYWlsMDoKIAllZGFjX3ByaW50ayhLRVJOX1dBUk5JTkcsIEVEQUNfTUMsCi0JCSIlcyAoJXMpICVzICVzIGFscmVhZHkgYXNzaWduZWQgJWRcbiIsIHAtPmRldi0+YnVzX2lkLAorCQkiJXMgKCVzKSAlcyAlcyBhbHJlYWR5IGFzc2lnbmVkICVkXG4iLCBkZXZfbmFtZShwLT5kZXYpLAogCQllZGFjX2Rldl9uYW1lKG1jaSksIHAtPm1vZF9uYW1lLCBwLT5jdGxfbmFtZSwgcC0+bWNfaWR4KTsKIAlyZXR1cm4gMTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9lZGFjL2VkYWNfcGNpLmMgYi9kcml2ZXJzL2VkYWMvZWRhY19wY2kuYwppbmRleCAyMmVjOWQ1Li41ZDNjODA4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2VkYWMvZWRhY19wY2kuYworKysgYi9kcml2ZXJzL2VkYWMvZWRhY19wY2kuYwpAQCAtMTUwLDcgKzE1MCw3IEBACiBmYWlsMDoKIAllZGFjX3ByaW50ayhLRVJOX1dBUk5JTkcsIEVEQUNfUENJLAogCQkiJXMgKCVzKSAlcyAlcyBhbHJlYWR5IGFzc2lnbmVkICVkXG4iLAotCQlyb3Zlci0+ZGV2LT5idXNfaWQsIGVkYWNfZGV2X25hbWUocm92ZXIpLAorCQlkZXZfbmFtZShyb3Zlci0+ZGV2KSwgZWRhY19kZXZfbmFtZShyb3ZlciksCiAJCXJvdmVyLT5tb2RfbmFtZSwgcm92ZXItPmN0bF9uYW1lLCByb3Zlci0+cGNpX2lkeCk7CiAJcmV0dXJuIDE7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZWRhYy9lZGFjX3BjaV9zeXNmcy5jIGIvZHJpdmVycy9lZGFjL2VkYWNfcGNpX3N5c2ZzLmMKaW5kZXggNWMxNTNkYy4uNDIyNzI4YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9lZGFjL2VkYWNfcGNpX3N5c2ZzLmMKKysrIGIvZHJpdmVycy9lZGFjL2VkYWNfcGNpX3N5c2ZzLmMKQEAgLTU2OSw3ICs1NjksNyBAQAogCiAJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogCi0JZGVidWdmNCgiUENJIFNUQVRVUz0gMHglMDR4ICVzXG4iLCBzdGF0dXMsIGRldi0+ZGV2LmJ1c19pZCk7CisJZGVidWdmNCgiUENJIFNUQVRVUz0gMHglMDR4ICVzXG4iLCBzdGF0dXMsIGRldl9uYW1lKCZkZXYtPmRldikpOwogCiAJLyogY2hlY2sgdGhlIHN0YXR1cyByZWcgZm9yIGVycm9ycyBvbiBib2FyZHMgTk9UIG1hcmtlZCBhcyBicm9rZW4KIAkgKiBpZiBicm9rZW4sIHdlIGNhbm5vdCB0cnVzdCBhbnkgb2YgdGhlIHN0YXR1cyBiaXRzCkBAIC02MDAsMTMgKzYwMCwxMyBAQAogCX0KIAogCi0JZGVidWdmNCgiUENJIEhFQURFUiBUWVBFPSAweCUwMnggJXNcbiIsIGhlYWRlcl90eXBlLCBkZXYtPmRldi5idXNfaWQpOworCWRlYnVnZjQoIlBDSSBIRUFERVIgVFlQRT0gMHglMDJ4ICVzXG4iLCBoZWFkZXJfdHlwZSwgZGV2X25hbWUoJmRldi0+ZGV2KSk7CiAKIAlpZiAoKGhlYWRlcl90eXBlICYgMHg3RikgPT0gUENJX0hFQURFUl9UWVBFX0JSSURHRSkgewogCQkvKiBPbiBicmlkZ2VzLCBuZWVkIHRvIGV4YW1pbmUgc2Vjb25kYXJ5IHN0YXR1cyByZWdpc3RlciAgKi8KIAkJc3RhdHVzID0gZ2V0X3BjaV9wYXJpdHlfc3RhdHVzKGRldiwgMSk7CiAKLQkJZGVidWdmNCgiUENJIFNFQ19TVEFUVVM9IDB4JTA0eCAlc1xuIiwgc3RhdHVzLCBkZXYtPmRldi5idXNfaWQpOworCQlkZWJ1Z2Y0KCJQQ0kgU0VDX1NUQVRVUz0gMHglMDR4ICVzXG4iLCBzdGF0dXMsIGRldl9uYW1lKCZkZXYtPmRldikpOwogCiAJCS8qIGNoZWNrIHRoZSBzZWNvbmRhcnkgc3RhdHVzIHJlZyBmb3IgZXJyb3JzLAogCQkgKiBvbiBOT1QgYnJva2VuIGJvYXJkcwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9lZGFjL2k1NDAwX2VkYWMuYyBiL2RyaXZlcnMvZWRhYy9pNTQwMF9lZGFjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjA4YjZkOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZWRhYy9pNTQwMF9lZGFjLmMKQEAgLTAsMCArMSwxNDc2IEBACisvKgorICogSW50ZWwgNTQwMCBjbGFzcyBNZW1vcnkgQ29udHJvbGxlcnMga2VybmVsIG1vZHVsZSAoU2VhYnVyZykKKyAqCisgKiBUaGlzIGZpbGUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwOCBieToKKyAqCSBCZW4gV29vZGFyZCA8d29vZGFyZEByZWRoYXQuY29tPgorICoJIE1hdXJvIENhcnZhbGhvIENoZWhhYiA8bWNoZWhhYkByZWRoYXQuY29tPgorICoKKyAqIFJlZCBIYXQgSW5jLiBodHRwOi8vd3d3LnJlZGhhdC5jb20KKyAqCisgKiBGb3JrZWQgYW5kIGFkYXB0ZWQgZnJvbSB0aGUgaTUwMDBfZWRhYyBkcml2ZXIgd2hpY2ggd2FzCisgKiB3cml0dGVuIGJ5IERvdWdsYXMgVGhvbXBzb24gTGludXggTmV0d29yeCA8bm9yc2s1QHhtaXNzaW9uLmNvbT4KKyAqCisgKiBUaGlzIG1vZHVsZSBpcyBiYXNlZCBvbiB0aGUgZm9sbG93aW5nIGRvY3VtZW50OgorICoKKyAqIEludGVsIDU0MDAgQ2hpcHNldCBNZW1vcnkgQ29udHJvbGxlciBIdWIgKE1DSCkgLSBEYXRhc2hlZXQKKyAqIAlodHRwOi8vZGV2ZWxvcGVyLmludGVsLmNvbS9kZXNpZ24vY2hpcHNldHMvZGF0YXNodHMvMzEzMDcwLmh0bQorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaV9pZHMuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZWRhYy5oPgorI2luY2x1ZGUgPGxpbnV4L21tem9uZS5oPgorCisjaW5jbHVkZSAiZWRhY19jb3JlLmgiCisKKy8qCisgKiBBbHRlciB0aGlzIHZlcnNpb24gZm9yIHRoZSBJNTQwMCBtb2R1bGUgd2hlbiBtb2RpZmljYXRpb25zIGFyZSBtYWRlCisgKi8KKyNkZWZpbmUgSTU0MDBfUkVWSVNJT04gICAgIiBWZXI6IDEuMC4wICIgX19EQVRFX18KKworI2RlZmluZSBFREFDX01PRF9TVFIgICAgICAiaTU0MDBfZWRhYyIKKworI2RlZmluZSBpNTQwMF9wcmludGsobGV2ZWwsIGZtdCwgYXJnLi4uKSBcCisJZWRhY19wcmludGsobGV2ZWwsICJpNTQwMCIsIGZtdCwgIyNhcmcpCisKKyNkZWZpbmUgaTU0MDBfbWNfcHJpbnRrKG1jaSwgbGV2ZWwsIGZtdCwgYXJnLi4uKSBcCisJZWRhY19tY19jaGlwc2V0X3ByaW50ayhtY2ksIGxldmVsLCAiaTU0MDAiLCBmbXQsICMjYXJnKQorCisvKiBMaW1pdHMgZm9yIGk1NDAwICovCisjZGVmaW5lIE5VTV9NVFJTX1BFUl9CUkFOQ0gJNAorI2RlZmluZSBDSEFOTkVMU19QRVJfQlJBTkNICTIKKyNkZWZpbmUJTUFYX0NIQU5ORUxTCQk0CisjZGVmaW5lIE1BWF9ESU1NUwkJKE1BWF9DSEFOTkVMUyAqIDQpCS8qIFVwIHRvIDQgRElNTSdzIHBlciBjaGFubmVsICovCisjZGVmaW5lIE1BWF9DU1JPV1MJCShNQVhfRElNTVMgKiAyKQkJLyogbWF4IHBvc3NpYmxlIGNzcm93cyBwZXIgY2hhbm5lbCAqLworCisvKiBEZXZpY2UgMTYsCisgKiBGdW5jdGlvbiAwOiBTeXN0ZW0gQWRkcmVzcworICogRnVuY3Rpb24gMTogTWVtb3J5IEJyYW5jaCBNYXAsIENvbnRyb2wsIEVycm9ycyBSZWdpc3RlcgorICogRnVuY3Rpb24gMjogRlNCIEVycm9yIFJlZ2lzdGVycworICoKKyAqIEFsbCAzIGZ1bmN0aW9ucyBvZiBEZXZpY2UgMTYgKDAsMSwyKSBzaGFyZSB0aGUgU0FNRSBESUQgYW5kCisgKiB1c2VzIFBDSV9ERVZJQ0VfSURfSU5URUxfNTQwMF9FUlIgZm9yIGRldmljZSAxNiAoMCwxLDIpLAorICogUENJX0RFVklDRV9JRF9JTlRFTF81NDAwX0ZCRDAgYW5kIFBDSV9ERVZJQ0VfSURfSU5URUxfNTQwMF9GQkQxCisgKiBmb3IgZGV2aWNlIDIxICgwLDEpLgorICovCisKKwkvKiBPRkZTRVRTIGZvciBGdW5jdGlvbiAwICovCisjZGVmaW5lCQlBTUJBU0UJCQkweDQ4IC8qIEFNQiBNZW0gTWFwcGVkIFJlZyBSZWdpb24gQmFzZSAqLworI2RlZmluZQkJTUFYQ0gJCQkweDU2IC8qIE1heCBDaGFubmVsIE51bWJlciAqLworI2RlZmluZQkJTUFYRElNTVBFUkNICQkweDU3IC8qIE1heCBESU1NIFBFUiBDaGFubmVsIE51bWJlciAqLworCisJLyogT0ZGU0VUUyBmb3IgRnVuY3Rpb24gMSAqLworI2RlZmluZQkJVE9MTQkJCTB4NkMKKyNkZWZpbmUJCVJFRE1FTUIJCQkweDdDCisjZGVmaW5lCQkJUkVDX0VDQ19MT0NBVE9SX09ERCh4KQkoKHgpICYgMHgzZmUwMCkgLyogYml0cyBbMTc6OV0gaW5kaWNhdGUgT0RELCBbODowXSAgaW5kaWNhdGUgRVZFTiAqLworI2RlZmluZQkJTUlSMAkJCTB4ODAKKyNkZWZpbmUJCU1JUjEJCQkweDg0CisjZGVmaW5lCQlBTUlSMAkJCTB4OGMKKyNkZWZpbmUJCUFNSVIxCQkJMHg5MAorCisJLyogRmF0YWwgZXJyb3IgcmVnaXN0ZXJzICovCisjZGVmaW5lCQlGRVJSX0ZBVF9GQkQJCTB4OTgJLyogYWxzbyBjYWxsZWQgYXMgRkVSUl9GQVRfRkJfRElNTSBhdCBkYXRhc2hlZXQgKi8KKyNkZWZpbmUJCQlGRVJSX0ZBVF9GQkRDSEFOICgzPDwyOCkJLyogY2hhbm5lbCBpbmRleCB3aGVyZSB0aGUgaGlnaGVzdC1vcmRlciBlcnJvciBvY2N1cnJlZCAqLworCisjZGVmaW5lCQlORVJSX0ZBVF9GQkQJCTB4OWMKKyNkZWZpbmUJCUZFUlJfTkZfRkJECQkweGEwCS8qIGFsc28gY2FsbGVkIGFzIEZFUlJfTkZBVF9GQl9ESU1NIGF0IGRhdGFzaGVldCAqLworCisJLyogTm9uLWZhdGFsIGVycm9yIHJlZ2lzdGVyICovCisjZGVmaW5lCQlORVJSX05GX0ZCRAkJMHhhNAorCisJLyogRW5hYmxlIGVycm9yIG1hc2sgKi8KKyNkZWZpbmUJCUVNQVNLX0ZCRAkJMHhhOAorCisjZGVmaW5lCQlFUlIwX0ZCRAkJMHhhYworI2RlZmluZQkJRVJSMV9GQkQJCTB4YjAKKyNkZWZpbmUJCUVSUjJfRkJECQkweGI0CisjZGVmaW5lCQlNQ0VSUl9GQkQJCTB4YjgKKworCS8qIE5vIE9GRlNFVFMgZm9yIERldmljZSAxNiBGdW5jdGlvbiAyICovCisKKy8qCisgKiBEZXZpY2UgMjEsCisgKiBGdW5jdGlvbiAwOiBNZW1vcnkgTWFwIEJyYW5jaCAwCisgKgorICogRGV2aWNlIDIyLAorICogRnVuY3Rpb24gMDogTWVtb3J5IE1hcCBCcmFuY2ggMQorICovCisKKwkvKiBPRkZTRVRTIGZvciBGdW5jdGlvbiAwICovCisjZGVmaW5lIEFNQlBSRVNFTlRfMAkweDY0CisjZGVmaW5lIEFNQlBSRVNFTlRfMQkweDY2CisjZGVmaW5lIE1UUjAJCTB4ODAKKyNkZWZpbmUgTVRSMQkJMHg4MgorI2RlZmluZSBNVFIyCQkweDg0CisjZGVmaW5lIE1UUjMJCTB4ODYKKworCS8qIE9GRlNFVFMgZm9yIEZ1bmN0aW9uIDEgKi8KKyNkZWZpbmUgTlJFQ0ZHTE9HCQkweDc0CisjZGVmaW5lIFJFQ0ZHTE9HCQkweDc4CisjZGVmaW5lIE5SRUNNRU1BCQkweGJlCisjZGVmaW5lIE5SRUNNRU1CCQkweGMwCisjZGVmaW5lIE5SRUNGQl9ESU1NQQkJMHhjNAorI2RlZmluZSBOUkVDRkJfRElNTUIJCTB4YzgKKyNkZWZpbmUgTlJFQ0ZCX0RJTU1DCQkweGNjCisjZGVmaW5lIE5SRUNGQl9ESU1NRAkJMHhkMAorI2RlZmluZSBOUkVDRkJfRElNTUUJCTB4ZDQKKyNkZWZpbmUgTlJFQ0ZCX0RJTU1GCQkweGQ4CisjZGVmaW5lIFJFRE1FTUEJCQkweGRDCisjZGVmaW5lIFJFQ01FTUEJCQkweGYwCisjZGVmaW5lIFJFQ01FTUIJCQkweGY0CisjZGVmaW5lIFJFQ0ZCX0RJTU1BCQkweGY4CisjZGVmaW5lIFJFQ0ZCX0RJTU1CCQkweGVjCisjZGVmaW5lIFJFQ0ZCX0RJTU1DCQkweGYwCisjZGVmaW5lIFJFQ0ZCX0RJTU1ECQkweGY0CisjZGVmaW5lIFJFQ0ZCX0RJTU1FCQkweGY4CisjZGVmaW5lIFJFQ0ZCX0RJTU1GCQkweGZDCisKKy8qCisgKiBFcnJvciBpbmRpY2F0b3IgYml0cyBhbmQgbWFza3MKKyAqIEVycm9yIG1hc2tzIGFyZSBhY2NvcmRpbmcgd2l0aCBUYWJsZSA1LTE3IG9mIGk1NDAwIGRhdGFzaGVldAorICovCisKK2VudW0gZXJyb3JfbWFzayB7CisJRU1BU0tfTTEgID0gMTw8MCwgIC8qIE1lbW9yeSBXcml0ZSBlcnJvciBvbiBub24tcmVkdW5kYW50IHJldHJ5ICovCisJRU1BU0tfTTIgID0gMTw8MSwgIC8qIE1lbW9yeSBvciBGQi1ESU1NIGNvbmZpZ3VyYXRpb24gQ1JDIHJlYWQgZXJyb3IgKi8KKwlFTUFTS19NMyAgPSAxPDwyLCAgLyogUmVzZXJ2ZWQgKi8KKwlFTUFTS19NNCAgPSAxPDwzLCAgLyogVW5jb3JyZWN0YWJsZSBEYXRhIEVDQyBvbiBSZXBsYXkgKi8KKwlFTUFTS19NNSAgPSAxPDw0LCAgLyogQWxpYXNlZCBVbmNvcnJlY3RhYmxlIE5vbi1NaXJyb3JlZCBEZW1hbmQgRGF0YSBFQ0MgKi8KKwlFTUFTS19NNiAgPSAxPDw1LCAgLyogVW5zdXBwb3J0ZWQgb24gaTU0MDAgKi8KKwlFTUFTS19NNyAgPSAxPDw2LCAgLyogQWxpYXNlZCBVbmNvcnJlY3RhYmxlIFJlc2lsdmVyLSBvciBTcGFyZS1Db3B5IERhdGEgRUNDICovCisJRU1BU0tfTTggID0gMTw8NywgIC8qIEFsaWFzZWQgVW5jb3JyZWN0YWJsZSBQYXRyb2wgRGF0YSBFQ0MgKi8KKwlFTUFTS19NOSAgPSAxPDw4LCAgLyogTm9uLUFsaWFzZWQgVW5jb3JyZWN0YWJsZSBOb24tTWlycm9yZWQgRGVtYW5kIERhdGEgRUNDICovCisJRU1BU0tfTTEwID0gMTw8OSwgIC8qIFVuc3VwcG9ydGVkIG9uIGk1NDAwICovCisJRU1BU0tfTTExID0gMTw8MTAsIC8qIE5vbi1BbGlhc2VkIFVuY29ycmVjdGFibGUgUmVzaWx2ZXItIG9yIFNwYXJlLUNvcHkgRGF0YSBFQ0MgICovCisJRU1BU0tfTTEyID0gMTw8MTEsIC8qIE5vbi1BbGlhc2VkIFVuY29ycmVjdGFibGUgUGF0cm9sIERhdGEgRUNDICovCisJRU1BU0tfTTEzID0gMTw8MTIsIC8qIE1lbW9yeSBXcml0ZSBlcnJvciBvbiBmaXJzdCBhdHRlbXB0ICovCisJRU1BU0tfTTE0ID0gMTw8MTMsIC8qIEZCLURJTU0gQ29uZmlndXJhdGlvbiBXcml0ZSBlcnJvciBvbiBmaXJzdCBhdHRlbXB0ICovCisJRU1BU0tfTTE1ID0gMTw8MTQsIC8qIE1lbW9yeSBvciBGQi1ESU1NIGNvbmZpZ3VyYXRpb24gQ1JDIHJlYWQgZXJyb3IgKi8KKwlFTUFTS19NMTYgPSAxPDwxNSwgLyogQ2hhbm5lbCBGYWlsZWQtT3ZlciBPY2N1cnJlZCAqLworCUVNQVNLX00xNyA9IDE8PDE2LCAvKiBDb3JyZWN0YWJsZSBOb24tTWlycm9yZWQgRGVtYW5kIERhdGEgRUNDICovCisJRU1BU0tfTTE4ID0gMTw8MTcsIC8qIFVuc3VwcG9ydGVkIG9uIGk1NDAwICovCisJRU1BU0tfTTE5ID0gMTw8MTgsIC8qIENvcnJlY3RhYmxlIFJlc2lsdmVyLSBvciBTcGFyZS1Db3B5IERhdGEgRUNDICovCisJRU1BU0tfTTIwID0gMTw8MTksIC8qIENvcnJlY3RhYmxlIFBhdHJvbCBEYXRhIEVDQyAqLworCUVNQVNLX00yMSA9IDE8PDIwLCAvKiBGQi1ESU1NIE5vcnRoYm91bmQgcGFyaXR5IGVycm9yIG9uIEZCLURJTU0gU3luYyBTdGF0dXMgKi8KKwlFTUFTS19NMjIgPSAxPDwyMSwgLyogU1BEIHByb3RvY29sIEVycm9yICovCisJRU1BU0tfTTIzID0gMTw8MjIsIC8qIE5vbi1SZWR1bmRhbnQgRmFzdCBSZXNldCBUaW1lb3V0ICovCisJRU1BU0tfTTI0ID0gMTw8MjMsIC8qIFJlZnJlc2ggZXJyb3IgKi8KKwlFTUFTS19NMjUgPSAxPDwyNCwgLyogTWVtb3J5IFdyaXRlIGVycm9yIG9uIHJlZHVuZGFudCByZXRyeSAqLworCUVNQVNLX00yNiA9IDE8PDI1LCAvKiBSZWR1bmRhbnQgRmFzdCBSZXNldCBUaW1lb3V0ICovCisJRU1BU0tfTTI3ID0gMTw8MjYsIC8qIENvcnJlY3RhYmxlIENvdW50ZXIgVGhyZXNob2xkIEV4Y2VlZGVkICovCisJRU1BU0tfTTI4ID0gMTw8MjcsIC8qIERJTU0tU3BhcmUgQ29weSBDb21wbGV0ZWQgKi8KKwlFTUFTS19NMjkgPSAxPDwyOCwgLyogRElNTS1Jc29sYXRpb24gQ29tcGxldGVkICovCit9OworCisvKgorICogTmFtZXMgdG8gdHJhbnNsYXRlIGJpdCBlcnJvciBpbnRvIHNvbWV0aGluZyB1c2VmdWwKKyAqLworc3RhdGljIGNvbnN0IGNoYXIgKmVycm9yX25hbWVbXSA9IHsKKwlbMF0gID0gIk1lbW9yeSBXcml0ZSBlcnJvciBvbiBub24tcmVkdW5kYW50IHJldHJ5IiwKKwlbMV0gID0gIk1lbW9yeSBvciBGQi1ESU1NIGNvbmZpZ3VyYXRpb24gQ1JDIHJlYWQgZXJyb3IiLAorCS8qIFJlc2VydmVkICovCisJWzNdICA9ICJVbmNvcnJlY3RhYmxlIERhdGEgRUNDIG9uIFJlcGxheSIsCisJWzRdICA9ICJBbGlhc2VkIFVuY29ycmVjdGFibGUgTm9uLU1pcnJvcmVkIERlbWFuZCBEYXRhIEVDQyIsCisJLyogTTYgVW5zdXBwb3J0ZWQgb24gaTU0MDAgKi8KKwlbNl0gID0gIkFsaWFzZWQgVW5jb3JyZWN0YWJsZSBSZXNpbHZlci0gb3IgU3BhcmUtQ29weSBEYXRhIEVDQyIsCisJWzddICA9ICJBbGlhc2VkIFVuY29ycmVjdGFibGUgUGF0cm9sIERhdGEgRUNDIiwKKwlbOF0gID0gIk5vbi1BbGlhc2VkIFVuY29ycmVjdGFibGUgTm9uLU1pcnJvcmVkIERlbWFuZCBEYXRhIEVDQyIsCisJLyogTTEwIFVuc3VwcG9ydGVkIG9uIGk1NDAwICovCisJWzEwXSA9ICJOb24tQWxpYXNlZCBVbmNvcnJlY3RhYmxlIFJlc2lsdmVyLSBvciBTcGFyZS1Db3B5IERhdGEgRUNDIiwKKwlbMTFdID0gIk5vbi1BbGlhc2VkIFVuY29ycmVjdGFibGUgUGF0cm9sIERhdGEgRUNDIiwKKwlbMTJdID0gIk1lbW9yeSBXcml0ZSBlcnJvciBvbiBmaXJzdCBhdHRlbXB0IiwKKwlbMTNdID0gIkZCLURJTU0gQ29uZmlndXJhdGlvbiBXcml0ZSBlcnJvciBvbiBmaXJzdCBhdHRlbXB0IiwKKwlbMTRdID0gIk1lbW9yeSBvciBGQi1ESU1NIGNvbmZpZ3VyYXRpb24gQ1JDIHJlYWQgZXJyb3IiLAorCVsxNV0gPSAiQ2hhbm5lbCBGYWlsZWQtT3ZlciBPY2N1cnJlZCIsCisJWzE2XSA9ICJDb3JyZWN0YWJsZSBOb24tTWlycm9yZWQgRGVtYW5kIERhdGEgRUNDIiwKKwkvKiBNMTggVW5zdXBwb3J0ZWQgb24gaTU0MDAgKi8KKwlbMThdID0gIkNvcnJlY3RhYmxlIFJlc2lsdmVyLSBvciBTcGFyZS1Db3B5IERhdGEgRUNDIiwKKwlbMTldID0gIkNvcnJlY3RhYmxlIFBhdHJvbCBEYXRhIEVDQyIsCisJWzIwXSA9ICJGQi1ESU1NIE5vcnRoYm91bmQgcGFyaXR5IGVycm9yIG9uIEZCLURJTU0gU3luYyBTdGF0dXMiLAorCVsyMV0gPSAiU1BEIHByb3RvY29sIEVycm9yIiwKKwlbMjJdID0gIk5vbi1SZWR1bmRhbnQgRmFzdCBSZXNldCBUaW1lb3V0IiwKKwlbMjNdID0gIlJlZnJlc2ggZXJyb3IiLAorCVsyNF0gPSAiTWVtb3J5IFdyaXRlIGVycm9yIG9uIHJlZHVuZGFudCByZXRyeSIsCisJWzI1XSA9ICJSZWR1bmRhbnQgRmFzdCBSZXNldCBUaW1lb3V0IiwKKwlbMjZdID0gIkNvcnJlY3RhYmxlIENvdW50ZXIgVGhyZXNob2xkIEV4Y2VlZGVkIiwKKwlbMjddID0gIkRJTU0tU3BhcmUgQ29weSBDb21wbGV0ZWQiLAorCVsyOF0gPSAiRElNTS1Jc29sYXRpb24gQ29tcGxldGVkIiwKK307CisKKy8qIEZhdGFsIGVycm9ycyAqLworI2RlZmluZSBFUlJPUl9GQVRfTUFTSwkJKEVNQVNLX00xIHwgXAorCQkJCSBFTUFTS19NMiB8IFwKKwkJCQkgRU1BU0tfTTIzKQorCisvKiBDb3JyZWN0YWJsZSBlcnJvcnMgKi8KKyNkZWZpbmUgRVJST1JfTkZfQ09SUkVDVEFCTEUJKEVNQVNLX00yNyB8IFwKKwkJCQkgRU1BU0tfTTIwIHwgXAorCQkJCSBFTUFTS19NMTkgfCBcCisJCQkJIEVNQVNLX00xOCB8IFwKKwkJCQkgRU1BU0tfTTE3IHwgXAorCQkJCSBFTUFTS19NMTYpCisjZGVmaW5lIEVSUk9SX05GX0RJTU1fU1BBUkUJKEVNQVNLX00yOSB8IFwKKwkJCQkgRU1BU0tfTTI4KQorI2RlZmluZSBFUlJPUl9ORl9TUERfUFJPVE9DT0wJKEVNQVNLX00yMikKKyNkZWZpbmUgRVJST1JfTkZfTk9SVEhfQ1JDCShFTUFTS19NMjEpCisKKy8qIFJlY292ZXJhYmxlIGVycm9ycyAqLworI2RlZmluZSBFUlJPUl9ORl9SRUNPVkVSQUJMRQkoRU1BU0tfTTI2IHwgXAorCQkJCSBFTUFTS19NMjUgfCBcCisJCQkJIEVNQVNLX00yNCB8IFwKKwkJCQkgRU1BU0tfTTE1IHwgXAorCQkJCSBFTUFTS19NMTQgfCBcCisJCQkJIEVNQVNLX00xMyB8IFwKKwkJCQkgRU1BU0tfTTEyIHwgXAorCQkJCSBFTUFTS19NMTEgfCBcCisJCQkJIEVNQVNLX005ICB8IFwKKwkJCQkgRU1BU0tfTTggIHwgXAorCQkJCSBFTUFTS19NNyAgfCBcCisJCQkJIEVNQVNLX001KQorCisvKiB1bmNvcnJlY3RhYmxlIGVycm9ycyAqLworI2RlZmluZSBFUlJPUl9ORl9VTkNPUlJFQ1RBQkxFCShFTUFTS19NNCkKKworLyogbWFzayB0byBhbGwgbm9uLWZhdGFsIGVycm9ycyAqLworI2RlZmluZSBFUlJPUl9ORl9NQVNLCQkoRVJST1JfTkZfQ09SUkVDVEFCTEUgICB8IFwKKwkJCQkgRVJST1JfTkZfVU5DT1JSRUNUQUJMRSB8IFwKKwkJCQkgRVJST1JfTkZfUkVDT1ZFUkFCTEUgICB8IFwKKwkJCQkgRVJST1JfTkZfRElNTV9TUEFSRSAgICB8IFwKKwkJCQkgRVJST1JfTkZfU1BEX1BST1RPQ09MICB8IFwKKwkJCQkgRVJST1JfTkZfTk9SVEhfQ1JDKQorCisvKgorICogRGVmaW5lIGVycm9yIG1hc2tzIGZvciB0aGUgc2V2ZXJhbCByZWdpc3RlcnMKKyAqLworCisvKiBFbmFibGUgYWxsIGZhdGFsIGFuZCBub24gZmF0YWwgZXJyb3JzICovCisjZGVmaW5lIEVOQUJMRV9FTUFTS19BTEwJKEVSUk9SX0ZBVF9NQVNLIHwgRVJST1JfTkZfTUFTSykKKworLyogbWFzayBmb3IgZmF0YWwgZXJyb3IgcmVnaXN0ZXJzICovCisjZGVmaW5lIEZFUlJfRkFUX01BU0sgRVJST1JfRkFUX01BU0sKKworLyogbWFza3MgZm9yIG5vbi1mYXRhbCBlcnJvciByZWdpc3RlciAqLworc3RhdGljIGlubGluZSBpbnQgdG9fbmZfbWFzayh1bnNpZ25lZCBpbnQgbWFzaykKK3sKKwlyZXR1cm4gKG1hc2sgJiBFTUFTS19NMjkpIHwgKG1hc2sgPj4gMyk7Cit9OworCitzdGF0aWMgaW5saW5lIGludCBmcm9tX25mX2ZlcnIodW5zaWduZWQgaW50IG1hc2spCit7CisJcmV0dXJuIChtYXNrICYgRU1BU0tfTTI5KSB8CQkvKiBCaXQgMjggKi8KKwkgICAgICAgKG1hc2sgJiAoKDEgPDwgMjgpIC0gMSkgPDwgMyk7CS8qIEJpdHMgMCB0byAyNyAqLworfTsKKworI2RlZmluZSBGRVJSX05GX01BU0sJCXRvX25mX21hc2soRVJST1JfTkZfTUFTSykKKyNkZWZpbmUgRkVSUl9ORl9DT1JSRUNUQUJMRQl0b19uZl9tYXNrKEVSUk9SX05GX0NPUlJFQ1RBQkxFKQorI2RlZmluZSBGRVJSX05GX0RJTU1fU1BBUkUJdG9fbmZfbWFzayhFUlJPUl9ORl9ESU1NX1NQQVJFKQorI2RlZmluZSBGRVJSX05GX1NQRF9QUk9UT0NPTAl0b19uZl9tYXNrKEVSUk9SX05GX1NQRF9QUk9UT0NPTCkKKyNkZWZpbmUgRkVSUl9ORl9OT1JUSF9DUkMJdG9fbmZfbWFzayhFUlJPUl9ORl9OT1JUSF9DUkMpCisjZGVmaW5lIEZFUlJfTkZfUkVDT1ZFUkFCTEUJdG9fbmZfbWFzayhFUlJPUl9ORl9SRUNPVkVSQUJMRSkKKyNkZWZpbmUgRkVSUl9ORl9VTkNPUlJFQ1RBQkxFCXRvX25mX21hc2soRVJST1JfTkZfVU5DT1JSRUNUQUJMRSkKKworLyogRGVmaW5lcyB0byBleHRyYWN0IHRoZSB2YWlvdXMgZmllbGRzIGZyb20gdGhlCisgKglNVFJ4IC0gTWVtb3J5IFRlY2hub2xvZ3kgUmVnaXN0ZXJzCisgKi8KKyNkZWZpbmUgTVRSX0RJTU1TX1BSRVNFTlQobXRyKQkJKChtdHIpICYgKDEgPDwgMTApKQorI2RlZmluZSBNVFJfRElNTVNfRVRIUk9UVExFKG10cikJKChtdHIpICYgKDEgPDwgOSkpCisjZGVmaW5lIE1UUl9EUkFNX1dJRFRIKG10cikJCSgoKG10cikgJiAoMSA8PCA4KSkgPyA4IDogNCkKKyNkZWZpbmUgTVRSX0RSQU1fQkFOS1MobXRyKQkJKCgobXRyKSAmICgxIDw8IDYpKSA/IDggOiA0KQorI2RlZmluZSBNVFJfRFJBTV9CQU5LU19BRERSX0JJVFMobXRyKQkoKE1UUl9EUkFNX0JBTktTKG10cikgPT0gOCkgPyAzIDogMikKKyNkZWZpbmUgTVRSX0RJTU1fUkFOSyhtdHIpCQkoKChtdHIpID4+IDUpICYgMHgxKQorI2RlZmluZSBNVFJfRElNTV9SQU5LX0FERFJfQklUUyhtdHIpCShNVFJfRElNTV9SQU5LKG10cikgPyAyIDogMSkKKyNkZWZpbmUgTVRSX0RJTU1fUk9XUyhtdHIpCQkoKChtdHIpID4+IDIpICYgMHgzKQorI2RlZmluZSBNVFJfRElNTV9ST1dTX0FERFJfQklUUyhtdHIpCShNVFJfRElNTV9ST1dTKG10cikgKyAxMykKKyNkZWZpbmUgTVRSX0RJTU1fQ09MUyhtdHIpCQkoKG10cikgJiAweDMpCisjZGVmaW5lIE1UUl9ESU1NX0NPTFNfQUREUl9CSVRTKG10cikJKE1UUl9ESU1NX0NPTFMobXRyKSArIDEwKQorCisvKiBUaGlzIGFwcGxpZXMgdG8gRkVSUl9ORl9GQi1ESU1NIGFzIHdlbGwgYXMgRkVSUl9GQVRfRkItRElNTSAqLworc3RhdGljIGlubGluZSBpbnQgZXh0cmFjdF9mYmRjaGFuX2luZHgodTMyIHgpCit7CisJcmV0dXJuICh4Pj4yOCkgJiAweDM7Cit9CisKKyNpZmRlZiBDT05GSUdfRURBQ19ERUJVRworLyogTVRSIE5VTVJPVyAqLworc3RhdGljIGNvbnN0IGNoYXIgKm51bXJvd190b1N0cmluZ1tdID0geworCSI4LDE5MiAtIDEzIHJvd3MiLAorCSIxNiwzODQgLSAxNCByb3dzIiwKKwkiMzIsNzY4IC0gMTUgcm93cyIsCisJIjY1LDUzNiAtIDE2IHJvd3MiCit9OworCisvKiBNVFIgTlVNQ09MICovCitzdGF0aWMgY29uc3QgY2hhciAqbnVtY29sX3RvU3RyaW5nW10gPSB7CisJIjEsMDI0IC0gMTAgY29sdW1ucyIsCisJIjIsMDQ4IC0gMTEgY29sdW1ucyIsCisJIjQsMDk2IC0gMTIgY29sdW1ucyIsCisJInJlc2VydmVkIgorfTsKKyNlbmRpZgorCisvKiBEZXZpY2UgbmFtZSBhbmQgcmVnaXN0ZXIgRElEIChEZXZpY2UgSUQpICovCitzdHJ1Y3QgaTU0MDBfZGV2X2luZm8geworCWNvbnN0IGNoYXIgKmN0bF9uYW1lOwkvKiBuYW1lIGZvciB0aGlzIGRldmljZSAqLworCXUxNiBmc2JfbWFwcGluZ19lcnJvcnM7CS8qIERJRCBmb3IgdGhlIGJyYW5jaG1hcCxjb250cm9sICovCit9OworCisvKiBUYWJsZSBvZiBkZXZpY2VzIGF0dHJpYnV0ZXMgc3VwcG9ydGVkIGJ5IHRoaXMgZHJpdmVyICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGk1NDAwX2Rldl9pbmZvIGk1NDAwX2RldnNbXSA9IHsKKwl7CisJCS5jdGxfbmFtZSA9ICJJNTQwMCIsCisJCS5mc2JfbWFwcGluZ19lcnJvcnMgPSBQQ0lfREVWSUNFX0lEX0lOVEVMXzU0MDBfRVJSLAorCX0sCit9OworCitzdHJ1Y3QgaTU0MDBfZGltbV9pbmZvIHsKKwlpbnQgbWVnYWJ5dGVzOwkJLyogc2l6ZSwgMCBtZWFucyBub3QgcHJlc2VudCAgKi8KKwlpbnQgZHVhbF9yYW5rOworfTsKKworLyogZHJpdmVyIHByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUgKi8KK3N0cnVjdCBpNTQwMF9wdnQgeworCXN0cnVjdCBwY2lfZGV2ICpzeXN0ZW1fYWRkcmVzczsJCS8qIDE2LjAgKi8KKwlzdHJ1Y3QgcGNpX2RldiAqYnJhbmNobWFwX3dlcnJvcnM7CS8qIDE2LjEgKi8KKwlzdHJ1Y3QgcGNpX2RldiAqZnNiX2Vycm9yX3JlZ3M7CQkvKiAxNi4yICovCisJc3RydWN0IHBjaV9kZXYgKmJyYW5jaF8wOwkJLyogMjEuMCAqLworCXN0cnVjdCBwY2lfZGV2ICpicmFuY2hfMTsJCS8qIDIyLjAgKi8KKworCXUxNiB0b2xtOwkJCQkvKiB0b3Agb2YgbG93IG1lbW9yeSAqLworCXU2NCBhbWJhc2U7CQkJCS8qIEFNQiBCQVIgKi8KKworCXUxNiBtaXIwLCBtaXIxOworCisJdTE2IGIwX210cltOVU1fTVRSU19QRVJfQlJBTkNIXTsJLyogTWVtb3J5IFRlY2hubG9neSBSZWcgKi8KKwl1MTYgYjBfYW1icHJlc2VudDA7CQkJLyogQnJhbmNoIDAsIENoYW5uZWwgMCAqLworCXUxNiBiMF9hbWJwcmVzZW50MTsJCQkvKiBCcm5hY2ggMCwgQ2hhbm5lbCAxICovCisKKwl1MTYgYjFfbXRyW05VTV9NVFJTX1BFUl9CUkFOQ0hdOwkvKiBNZW1vcnkgVGVjaG5sb2d5IFJlZyAqLworCXUxNiBiMV9hbWJwcmVzZW50MDsJCQkvKiBCcmFuY2ggMSwgQ2hhbm5lbCA4ICovCisJdTE2IGIxX2FtYnByZXNlbnQxOwkJCS8qIEJyYW5jaCAxLCBDaGFubmVsIDEgKi8KKworCS8qIERJTU0gaW5mb3JtYXRpb24gbWF0cml4LCBhbGxvY2F0aW5nIGFyY2hpdGVjdHVyZSBtYXhpbXVtcyAqLworCXN0cnVjdCBpNTQwMF9kaW1tX2luZm8gZGltbV9pbmZvW01BWF9DU1JPV1NdW01BWF9DSEFOTkVMU107CisKKwkvKiBBY3R1YWwgdmFsdWVzIGZvciB0aGlzIGNvbnRyb2xsZXIgKi8KKwlpbnQgbWF4Y2g7CQkJCS8qIE1heCBjaGFubmVscyAqLworCWludCBtYXhkaW1tcGVyY2g7CQkJLyogTWF4IERJTU1zIHBlciBjaGFubmVsICovCit9OworCisvKiBJNTQwMCBNQ0ggZXJyb3IgaW5mb3JtYXRpb24gcmV0cmlldmVkIGZyb20gSGFyZHdhcmUgKi8KK3N0cnVjdCBpNTQwMF9lcnJvcl9pbmZvIHsKKwkvKiBUaGVzZSByZWdpc3RlcnMgYXJlIGFsd2F5cyByZWFkIGZyb20gdGhlIE1DICovCisJdTMyIGZlcnJfZmF0X2ZiZDsJLyogRmlyc3QgRXJyb3JzIEZhdGFsICovCisJdTMyIG5lcnJfZmF0X2ZiZDsJLyogTmV4dCBFcnJvcnMgRmF0YWwgKi8KKwl1MzIgZmVycl9uZl9mYmQ7CS8qIEZpcnN0IEVycm9ycyBOb24tRmF0YWwgKi8KKwl1MzIgbmVycl9uZl9mYmQ7CS8qIE5leHQgRXJyb3JzIE5vbi1GYXRhbCAqLworCisJLyogVGhlc2UgcmVnaXN0ZXJzIGFyZSBpbnB1dCBPTkxZIGlmIHRoZXJlIHdhcyBhIFJlY292ZXJhYmxlIEVycm9yICovCisJdTMyIHJlZG1lbWI7CQkvKiBSZWNvdmVyYWJsZSBNZW0gRGF0YSBFcnJvciBsb2cgQiAqLworCXUxNiByZWNtZW1hOwkJLyogUmVjb3ZlcmFibGUgTWVtIEVycm9yIGxvZyBBICovCisJdTMyIHJlY21lbWI7CQkvKiBSZWNvdmVyYWJsZSBNZW0gRXJyb3IgbG9nIEIgKi8KKworCS8qIFRoZXNlIHJlZ2lzdGVycyBhcmUgaW5wdXQgT05MWSBpZiB0aGVyZSB3YXMgYSBOb24tUmVjIEVycm9yICovCisJdTE2IG5yZWNtZW1hOwkJLyogTm9uLVJlY292ZXJhYmxlIE1lbSBsb2cgQSAqLworCXUxNiBucmVjbWVtYjsJCS8qIE5vbi1SZWNvdmVyYWJsZSBNZW0gbG9nIEIgKi8KKworfTsKKworLyogbm90ZSB0aGF0IG5yZWNfcmR3ciBjaGFuZ2VkIGZyb20gTlJFQ01FTUEgdG8gTlJFQ01FTUIgYmV0d2VlbiB0aGUgNTAwMCBhbmQKKyAgIDU0MDAgYmV0dGVyIHRvIHVzZSBhbiBpbmxpbmUgZnVuY3Rpb24gdGhhbiBhIG1hY3JvIGluIHRoaXMgY2FzZSAqLworc3RhdGljIGlubGluZSBpbnQgbnJlY19iYW5rKHN0cnVjdCBpNTQwMF9lcnJvcl9pbmZvICppbmZvKQoreworCXJldHVybiAoKGluZm8tPm5yZWNtZW1hKSA+PiAxMikgJiAweDc7Cit9CitzdGF0aWMgaW5saW5lIGludCBucmVjX3Jhbmsoc3RydWN0IGk1NDAwX2Vycm9yX2luZm8gKmluZm8pCit7CisJcmV0dXJuICgoaW5mby0+bnJlY21lbWEpID4+IDgpICYgMHhmOworfQorc3RhdGljIGlubGluZSBpbnQgbnJlY19idWZfaWQoc3RydWN0IGk1NDAwX2Vycm9yX2luZm8gKmluZm8pCit7CisJcmV0dXJuICgoaW5mby0+bnJlY21lbWEpKSAmIDB4ZmY7Cit9CitzdGF0aWMgaW5saW5lIGludCBucmVjX3Jkd3Ioc3RydWN0IGk1NDAwX2Vycm9yX2luZm8gKmluZm8pCit7CisJcmV0dXJuIChpbmZvLT5ucmVjbWVtYikgPj4gMzE7Cit9CisvKiBUaGlzIGFwcGxpZXMgdG8gYm90aCBOUkVDIGFuZCBSRUMgc3RyaW5nIHNvIGl0IGNhbiBiZSB1c2VkIHdpdGggbnJlY19yZHdyCisgICBhbmQgcmVjX3Jkd3IgKi8KK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciAqcmR3cl9zdHIoaW50IHJkd3IpCit7CisJcmV0dXJuIHJkd3IgPyAiV3JpdGUiIDogIlJlYWQiOworfQorc3RhdGljIGlubGluZSBpbnQgbnJlY19jYXMoc3RydWN0IGk1NDAwX2Vycm9yX2luZm8gKmluZm8pCit7CisJcmV0dXJuICgoaW5mby0+bnJlY21lbWIpID4+IDE2KSAmIDB4MWZmZjsKK30KK3N0YXRpYyBpbmxpbmUgaW50IG5yZWNfcmFzKHN0cnVjdCBpNTQwMF9lcnJvcl9pbmZvICppbmZvKQoreworCXJldHVybiAoaW5mby0+bnJlY21lbWIpICYgMHhmZmZmOworfQorc3RhdGljIGlubGluZSBpbnQgcmVjX2Jhbmsoc3RydWN0IGk1NDAwX2Vycm9yX2luZm8gKmluZm8pCit7CisJcmV0dXJuICgoaW5mby0+cmVjbWVtYSkgPj4gMTIpICYgMHg3OworfQorc3RhdGljIGlubGluZSBpbnQgcmVjX3Jhbmsoc3RydWN0IGk1NDAwX2Vycm9yX2luZm8gKmluZm8pCit7CisJcmV0dXJuICgoaW5mby0+cmVjbWVtYSkgPj4gOCkgJiAweGY7Cit9CitzdGF0aWMgaW5saW5lIGludCByZWNfcmR3cihzdHJ1Y3QgaTU0MDBfZXJyb3JfaW5mbyAqaW5mbykKK3sKKwlyZXR1cm4gKGluZm8tPnJlY21lbWIpID4+IDMxOworfQorc3RhdGljIGlubGluZSBpbnQgcmVjX2NhcyhzdHJ1Y3QgaTU0MDBfZXJyb3JfaW5mbyAqaW5mbykKK3sKKwlyZXR1cm4gKChpbmZvLT5yZWNtZW1iKSA+PiAxNikgJiAweDFmZmY7Cit9CitzdGF0aWMgaW5saW5lIGludCByZWNfcmFzKHN0cnVjdCBpNTQwMF9lcnJvcl9pbmZvICppbmZvKQoreworCXJldHVybiAoaW5mby0+cmVjbWVtYikgJiAweGZmZmY7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZWRhY19wY2lfY3RsX2luZm8gKmk1NDAwX3BjaTsKKworLyoKKyAqCWk1NDAwX2dldF9lcnJvcl9pbmZvCVJldHJpZXZlIHRoZSBoYXJkd2FyZSBlcnJvciBpbmZvcm1hdGlvbiBmcm9tCisgKgkJCQl0aGUgaGFyZHdhcmUgYW5kIGNhY2hlIGl0IGluIHRoZSAnaW5mbycKKyAqCQkJCXN0cnVjdHVyZQorICovCitzdGF0aWMgdm9pZCBpNTQwMF9nZXRfZXJyb3JfaW5mbyhzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2ksCisJCQkJIHN0cnVjdCBpNTQwMF9lcnJvcl9pbmZvICppbmZvKQoreworCXN0cnVjdCBpNTQwMF9wdnQgKnB2dDsKKwl1MzIgdmFsdWU7CisKKwlwdnQgPSBtY2ktPnB2dF9pbmZvOworCisJLyogcmVhZCBpbiB0aGUgMXN0IEZBVEFMIGVycm9yIHJlZ2lzdGVyICovCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHB2dC0+YnJhbmNobWFwX3dlcnJvcnMsIEZFUlJfRkFUX0ZCRCwgJnZhbHVlKTsKKworCS8qIE1hc2sgb25seSB0aGUgYml0cyB0aGF0IHRoZSBkb2Mgc2F5cyBhcmUgdmFsaWQKKwkgKi8KKwl2YWx1ZSAmPSAoRkVSUl9GQVRfRkJEQ0hBTiB8IEZFUlJfRkFUX01BU0spOworCisJLyogSWYgdGhlcmUgaXMgYW4gZXJyb3IsIHRoZW4gcmVhZCBpbiB0aGUKKwkgICBORVhUIEZBVEFMIGVycm9yIHJlZ2lzdGVyIGFuZCB0aGUgTWVtb3J5IEVycm9yIExvZyBSZWdpc3RlciBBCisJICovCisJaWYgKHZhbHVlICYgRkVSUl9GQVRfTUFTSykgeworCQlpbmZvLT5mZXJyX2ZhdF9mYmQgPSB2YWx1ZTsKKworCQkvKiBoYXJ2ZXN0IHRoZSB2YXJpb3VzIGVycm9yIGRhdGEgd2UgbmVlZCAqLworCQlwY2lfcmVhZF9jb25maWdfZHdvcmQocHZ0LT5icmFuY2htYXBfd2Vycm9ycywKKwkJCQlORVJSX0ZBVF9GQkQsICZpbmZvLT5uZXJyX2ZhdF9mYmQpOworCQlwY2lfcmVhZF9jb25maWdfd29yZChwdnQtPmJyYW5jaG1hcF93ZXJyb3JzLAorCQkJCU5SRUNNRU1BLCAmaW5mby0+bnJlY21lbWEpOworCQlwY2lfcmVhZF9jb25maWdfd29yZChwdnQtPmJyYW5jaG1hcF93ZXJyb3JzLAorCQkJCU5SRUNNRU1CLCAmaW5mby0+bnJlY21lbWIpOworCisJCS8qIENsZWFyIHRoZSBlcnJvciBiaXRzLCBieSB3cml0aW5nIHRoZW0gYmFjayAqLworCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHB2dC0+YnJhbmNobWFwX3dlcnJvcnMsCisJCQkJRkVSUl9GQVRfRkJELCB2YWx1ZSk7CisJfSBlbHNlIHsKKwkJaW5mby0+ZmVycl9mYXRfZmJkID0gMDsKKwkJaW5mby0+bmVycl9mYXRfZmJkID0gMDsKKwkJaW5mby0+bnJlY21lbWEgPSAwOworCQlpbmZvLT5ucmVjbWVtYiA9IDA7CisJfQorCisJLyogcmVhZCBpbiB0aGUgMXN0IE5PTi1GQVRBTCBlcnJvciByZWdpc3RlciAqLworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwdnQtPmJyYW5jaG1hcF93ZXJyb3JzLCBGRVJSX05GX0ZCRCwgJnZhbHVlKTsKKworCS8qIElmIHRoZXJlIGlzIGFuIGVycm9yLCB0aGVuIHJlYWQgaW4gdGhlIDFzdCBOT04tRkFUQUwgZXJyb3IKKwkgKiByZWdpc3RlciBhcyB3ZWxsICovCisJaWYgKHZhbHVlICYgRkVSUl9ORl9NQVNLKSB7CisJCWluZm8tPmZlcnJfbmZfZmJkID0gdmFsdWU7CisKKwkJLyogaGFydmVzdCB0aGUgdmFyaW91cyBlcnJvciBkYXRhIHdlIG5lZWQgKi8KKwkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHB2dC0+YnJhbmNobWFwX3dlcnJvcnMsCisJCQkJTkVSUl9ORl9GQkQsICZpbmZvLT5uZXJyX25mX2ZiZCk7CisJCXBjaV9yZWFkX2NvbmZpZ193b3JkKHB2dC0+YnJhbmNobWFwX3dlcnJvcnMsCisJCQkJUkVDTUVNQSwgJmluZm8tPnJlY21lbWEpOworCQlwY2lfcmVhZF9jb25maWdfZHdvcmQocHZ0LT5icmFuY2htYXBfd2Vycm9ycywKKwkJCQlSRUNNRU1CLCAmaW5mby0+cmVjbWVtYik7CisJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwdnQtPmJyYW5jaG1hcF93ZXJyb3JzLAorCQkJCVJFRE1FTUIsICZpbmZvLT5yZWRtZW1iKTsKKworCQkvKiBDbGVhciB0aGUgZXJyb3IgYml0cywgYnkgd3JpdGluZyB0aGVtIGJhY2sgKi8KKwkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwdnQtPmJyYW5jaG1hcF93ZXJyb3JzLAorCQkJCUZFUlJfTkZfRkJELCB2YWx1ZSk7CisJfSBlbHNlIHsKKwkJaW5mby0+ZmVycl9uZl9mYmQgPSAwOworCQlpbmZvLT5uZXJyX25mX2ZiZCA9IDA7CisJCWluZm8tPnJlY21lbWEgPSAwOworCQlpbmZvLT5yZWNtZW1iID0gMDsKKwkJaW5mby0+cmVkbWVtYiA9IDA7CisJfQorfQorCisvKgorICogaTU0MDBfcHJvY2Nlc3Nfbm9uX3JlY292ZXJhYmxlX2luZm8oc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpLAorICogCQkJCQlzdHJ1Y3QgaTU0MDBfZXJyb3JfaW5mbyAqaW5mbywKKyAqIAkJCQkJaW50IGhhbmRsZV9lcnJvcnMpOworICoKKyAqCWhhbmRsZSB0aGUgSW50ZWwgRkFUQUwgYW5kIHVucmVjb3ZlcmFibGUgZXJyb3JzLCBpZiBhbnkKKyAqLworc3RhdGljIHZvaWQgaTU0MDBfcHJvY2Nlc3Nfbm9uX3JlY292ZXJhYmxlX2luZm8oc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpLAorCQkJCSAgICBzdHJ1Y3QgaTU0MDBfZXJyb3JfaW5mbyAqaW5mbywKKwkJCQkgICAgdW5zaWduZWQgbG9uZyBhbGxFcnJvcnMpCit7CisJY2hhciBtc2dbRURBQ19NQ19MQUJFTF9MRU4gKyAxICsgOTAgKyA4MF07CisJaW50IGJyYW5jaDsKKwlpbnQgY2hhbm5lbDsKKwlpbnQgYmFuazsKKwlpbnQgYnVmX2lkOworCWludCByYW5rOworCWludCByZHdyOworCWludCByYXMsIGNhczsKKwlpbnQgZXJybnVtOworCWNoYXIgKnR5cGUgPSBOVUxMOworCisJaWYgKCFhbGxFcnJvcnMpCisJCXJldHVybjsJCS8qIGlmIG5vIGVycm9yLCByZXR1cm4gbm93ICovCisKKwlpZiAoYWxsRXJyb3JzICYgIEVSUk9SX0ZBVF9NQVNLKQorCQl0eXBlID0gIkZBVEFMIjsKKwllbHNlIGlmIChhbGxFcnJvcnMgJiBGRVJSX05GX1VOQ09SUkVDVEFCTEUpCisJCXR5cGUgPSAiTk9OLUZBVEFMIHVuY29ycmVjdGVkIjsKKwllbHNlCisJCXR5cGUgPSAiTk9OLUZBVEFMIHJlY292ZXJhYmxlIjsKKworCS8qIE9OTFkgT05FIG9mIHRoZSBwb3NzaWJsZSBlcnJvciBiaXRzIHdpbGwgYmUgc2V0LCBhcyBwZXIgdGhlIGRvY3MgKi8KKworCWJyYW5jaCA9IGV4dHJhY3RfZmJkY2hhbl9pbmR4KGluZm8tPmZlcnJfZmF0X2ZiZCk7CisJY2hhbm5lbCA9IGJyYW5jaDsKKworCS8qIFVzZSB0aGUgTk9OLVJlY292ZXJhYmxlIG1hY3JvcyB0byBleHRyYWN0IGRhdGEgKi8KKwliYW5rID0gbnJlY19iYW5rKGluZm8pOworCXJhbmsgPSBucmVjX3JhbmsoaW5mbyk7CisJYnVmX2lkID0gbnJlY19idWZfaWQoaW5mbyk7CisJcmR3ciA9IG5yZWNfcmR3cihpbmZvKTsKKwlyYXMgPSBucmVjX3JhcyhpbmZvKTsKKwljYXMgPSBucmVjX2NhcyhpbmZvKTsKKworCWRlYnVnZjAoIlx0XHRDU1JPVz0gJWQgIENoYW5uZWxzPSAlZCwlZCAgKEJyYW5jaD0gJWQgIgorCQkiRFJBTSBCYW5rPSAlZCBCdWZmZXIgSUQgPSAlZCByZHdyPSAlcyByYXM9ICVkIGNhcz0gJWQpXG4iLAorCQlyYW5rLCBjaGFubmVsLCBjaGFubmVsICsgMSwgYnJhbmNoID4+IDEsIGJhbmssCisJCWJ1Zl9pZCwgcmR3cl9zdHIocmR3ciksIHJhcywgY2FzKTsKKworCS8qIE9ubHkgMSBiaXQgd2lsbCBiZSBvbiAqLworCWVycm51bSA9IGZpbmRfZmlyc3RfYml0KCZhbGxFcnJvcnMsIEFSUkFZX1NJWkUoZXJyb3JfbmFtZSkpOworCisJLyogRm9ybSBvdXQgbWVzc2FnZSAqLworCXNucHJpbnRmKG1zZywgc2l6ZW9mKG1zZyksCisJCSAiJXMgKEJyYW5jaD0lZCBEUkFNLUJhbms9JWQgQnVmZmVyIElEID0gJWQgUkRXUj0lcyAiCisJCSAiUkFTPSVkIENBUz0lZCAlcyBFcnI9MHglbHggKCVzKSkiLAorCQkgdHlwZSwgYnJhbmNoID4+IDEsIGJhbmssIGJ1Zl9pZCwgcmR3cl9zdHIocmR3ciksIHJhcywgY2FzLAorCQkgdHlwZSwgYWxsRXJyb3JzLCBlcnJvcl9uYW1lW2Vycm51bV0pOworCisJLyogQ2FsbCB0aGUgaGVscGVyIHRvIG91dHB1dCBtZXNzYWdlICovCisJZWRhY19tY19oYW5kbGVfZmJkX3VlKG1jaSwgcmFuaywgY2hhbm5lbCwgY2hhbm5lbCArIDEsIG1zZyk7Cit9CisKKy8qCisgKiBpNTQwMF9wcm9jZXNzX2ZhdGFsX2Vycm9yX2luZm8oc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpLAorICogCQkJCXN0cnVjdCBpNTQwMF9lcnJvcl9pbmZvICppbmZvLAorICogCQkJCWludCBoYW5kbGVfZXJyb3JzKTsKKyAqCisgKgloYW5kbGUgdGhlIEludGVsIE5PTi1GQVRBTCBlcnJvcnMsIGlmIGFueQorICovCitzdGF0aWMgdm9pZCBpNTQwMF9wcm9jZXNzX25vbmZhdGFsX2Vycm9yX2luZm8oc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpLAorCQkJCQlzdHJ1Y3QgaTU0MDBfZXJyb3JfaW5mbyAqaW5mbykKK3sKKwljaGFyIG1zZ1tFREFDX01DX0xBQkVMX0xFTiArIDEgKyA5MCArIDgwXTsKKwl1bnNpZ25lZCBsb25nIGFsbEVycm9yczsKKwlpbnQgYnJhbmNoOworCWludCBjaGFubmVsOworCWludCBiYW5rOworCWludCByYW5rOworCWludCByZHdyOworCWludCByYXMsIGNhczsKKwlpbnQgZXJybnVtOworCisJLyogbWFzayBvZmYgdGhlIEVycm9yIGJpdHMgdGhhdCBhcmUgcG9zc2libGUgKi8KKwlhbGxFcnJvcnMgPSBmcm9tX25mX2ZlcnIoaW5mby0+ZmVycl9uZl9mYmQgJiBGRVJSX05GX01BU0spOworCWlmICghYWxsRXJyb3JzKQorCQlyZXR1cm47CQkvKiBpZiBubyBlcnJvciwgcmV0dXJuIG5vdyAqLworCisJLyogT05MWSBPTkUgb2YgdGhlIHBvc3NpYmxlIGVycm9yIGJpdHMgd2lsbCBiZSBzZXQsIGFzIHBlciB0aGUgZG9jcyAqLworCisJaWYgKGFsbEVycm9ycyAmIChFUlJPUl9ORl9VTkNPUlJFQ1RBQkxFIHwgRVJST1JfTkZfUkVDT1ZFUkFCTEUpKSB7CisJCWk1NDAwX3Byb2NjZXNzX25vbl9yZWNvdmVyYWJsZV9pbmZvKG1jaSwgaW5mbywgYWxsRXJyb3JzKTsKKwkJcmV0dXJuOworCX0KKworCS8qIENvcnJlY3RhYmxlIGVycm9ycyAqLworCWlmIChhbGxFcnJvcnMgJiBFUlJPUl9ORl9DT1JSRUNUQUJMRSkgeworCQlkZWJ1Z2YwKCJcdENvcnJlY3RlZCBiaXRzPSAweCVseFxuIiwgYWxsRXJyb3JzKTsKKworCQlicmFuY2ggPSBleHRyYWN0X2ZiZGNoYW5faW5keChpbmZvLT5mZXJyX25mX2ZiZCk7CisKKwkJY2hhbm5lbCA9IDA7CisJCWlmIChSRUNfRUNDX0xPQ0FUT1JfT0REKGluZm8tPnJlZG1lbWIpKQorCQkJY2hhbm5lbCA9IDE7CisKKwkJLyogQ29udmVydCBjaGFubmVsIHRvIGJlIGJhc2VkIGZyb20gemVybywgaW5zdGVhZCBvZgorCQkgKiBmcm9tIGJyYW5jaCBiYXNlIG9mIDAgKi8KKwkJY2hhbm5lbCArPSBicmFuY2g7CisKKwkJYmFuayA9IHJlY19iYW5rKGluZm8pOworCQlyYW5rID0gcmVjX3JhbmsoaW5mbyk7CisJCXJkd3IgPSByZWNfcmR3cihpbmZvKTsKKwkJcmFzID0gcmVjX3JhcyhpbmZvKTsKKwkJY2FzID0gcmVjX2NhcyhpbmZvKTsKKworCQkvKiBPbmx5IDEgYml0IHdpbGwgYmUgb24gKi8KKwkJZXJybnVtID0gZmluZF9maXJzdF9iaXQoJmFsbEVycm9ycywgQVJSQVlfU0laRShlcnJvcl9uYW1lKSk7CisKKwkJZGVidWdmMCgiXHRcdENTUk9XPSAlZCBDaGFubmVsPSAlZCAgKEJyYW5jaCAlZCAiCisJCQkiRFJBTSBCYW5rPSAlZCByZHdyPSAlcyByYXM9ICVkIGNhcz0gJWQpXG4iLAorCQkJcmFuaywgY2hhbm5lbCwgYnJhbmNoID4+IDEsIGJhbmssCisJCQlyZHdyX3N0cihyZHdyKSwgcmFzLCBjYXMpOworCisJCS8qIEZvcm0gb3V0IG1lc3NhZ2UgKi8KKwkJc25wcmludGYobXNnLCBzaXplb2YobXNnKSwKKwkJCSAiQ29ycmVjdGVkIGVycm9yIChCcmFuY2g9JWQgRFJBTS1CYW5rPSVkIFJEV1I9JXMgIgorCQkJICJSQVM9JWQgQ0FTPSVkLCBDRSBFcnI9MHglbHggKCVzKSkiLAorCQkJIGJyYW5jaCA+PiAxLCBiYW5rLCByZHdyX3N0cihyZHdyKSwgcmFzLCBjYXMsCisJCQkgYWxsRXJyb3JzLCBlcnJvcl9uYW1lW2Vycm51bV0pOworCisJCS8qIENhbGwgdGhlIGhlbHBlciB0byBvdXRwdXQgbWVzc2FnZSAqLworCQllZGFjX21jX2hhbmRsZV9mYmRfY2UobWNpLCByYW5rLCBjaGFubmVsLCBtc2cpOworCisJCXJldHVybjsKKwl9CisKKwkvKiBNaXNjZWxhbmVvdXMgZXJyb3JzICovCisJZXJybnVtID0gZmluZF9maXJzdF9iaXQoJmFsbEVycm9ycywgQVJSQVlfU0laRShlcnJvcl9uYW1lKSk7CisKKwlicmFuY2ggPSBleHRyYWN0X2ZiZGNoYW5faW5keChpbmZvLT5mZXJyX25mX2ZiZCk7CisKKwlpNTQwMF9tY19wcmludGsobWNpLCBLRVJOX0VNRVJHLAorCQkJIk5vbi1GYXRhbCBtaXNjIGVycm9yIChCcmFuY2g9JWQgRXJyPSUjbHggKCVzKSkiLAorCQkJYnJhbmNoID4+IDEsIGFsbEVycm9ycywgZXJyb3JfbmFtZVtlcnJudW1dKTsKK30KKworLyoKKyAqCWk1NDAwX3Byb2Nlc3NfZXJyb3JfaW5mbwlQcm9jZXNzIHRoZSBlcnJvciBpbmZvIHRoYXQgaXMKKyAqCWluIHRoZSAnaW5mbycgc3RydWN0dXJlLCBwcmV2aW91c2x5IHJldHJpZXZlZCBmcm9tIGhhcmR3YXJlCisgKi8KK3N0YXRpYyB2b2lkIGk1NDAwX3Byb2Nlc3NfZXJyb3JfaW5mbyhzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2ksCisJCQkJc3RydWN0IGk1NDAwX2Vycm9yX2luZm8gKmluZm8pCit7CXUzMiBhbGxFcnJvcnM7CisKKwkvKiBGaXJzdCBoYW5kbGUgYW55IGZhdGFsIGVycm9ycyB0aGF0IG9jY3VycmVkICovCisJYWxsRXJyb3JzID0gKGluZm8tPmZlcnJfZmF0X2ZiZCAmIEZFUlJfRkFUX01BU0spOworCWk1NDAwX3Byb2NjZXNzX25vbl9yZWNvdmVyYWJsZV9pbmZvKG1jaSwgaW5mbywgYWxsRXJyb3JzKTsKKworCS8qIG5vdyBoYW5kbGUgYW55IG5vbi1mYXRhbCBlcnJvcnMgdGhhdCBvY2N1cnJlZCAqLworCWk1NDAwX3Byb2Nlc3Nfbm9uZmF0YWxfZXJyb3JfaW5mbyhtY2ksIGluZm8pOworfQorCisvKgorICoJaTU0MDBfY2xlYXJfZXJyb3IJUmV0cmlldmUgYW55IGVycm9yIGZyb20gdGhlIGhhcmR3YXJlCisgKgkJCQlidXQgZG8gTk9UIHByb2Nlc3MgdGhhdCBlcnJvci4KKyAqCQkJCVVzZWQgZm9yICdjbGVhcmluZycgb3V0IG9mIHByZXZpb3VzIGVycm9ycworICoJCQkJQ2FsbGVkIGJ5IHRoZSBDb3JlIG1vZHVsZS4KKyAqLworc3RhdGljIHZvaWQgaTU0MDBfY2xlYXJfZXJyb3Ioc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpKQoreworCXN0cnVjdCBpNTQwMF9lcnJvcl9pbmZvIGluZm87CisKKwlpNTQwMF9nZXRfZXJyb3JfaW5mbyhtY2ksICZpbmZvKTsKK30KKworLyoKKyAqCWk1NDAwX2NoZWNrX2Vycm9yCVJldHJpZXZlIGFuZCBwcm9jZXNzIGVycm9ycyByZXBvcnRlZCBieSB0aGUKKyAqCQkJCWhhcmR3YXJlLiBDYWxsZWQgYnkgdGhlIENvcmUgbW9kdWxlLgorICovCitzdGF0aWMgdm9pZCBpNTQwMF9jaGVja19lcnJvcihzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2kpCit7CisJc3RydWN0IGk1NDAwX2Vycm9yX2luZm8gaW5mbzsKKwlkZWJ1Z2Y0KCJNQyVkOiAiIF9fRklMRV9fICI6ICVzKClcbiIsIG1jaS0+bWNfaWR4LCBfX2Z1bmNfXyk7CisJaTU0MDBfZ2V0X2Vycm9yX2luZm8obWNpLCAmaW5mbyk7CisJaTU0MDBfcHJvY2Vzc19lcnJvcl9pbmZvKG1jaSwgJmluZm8pOworfQorCisvKgorICoJaTU0MDBfcHV0X2RldmljZXMJJ3B1dCcgYWxsIHRoZSBkZXZpY2VzIHRoYXQgd2UgaGF2ZQorICoJCQkJcmVzZXJ2ZWQgdmlhICdnZXQnCisgKi8KK3N0YXRpYyB2b2lkIGk1NDAwX3B1dF9kZXZpY2VzKHN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaSkKK3sKKwlzdHJ1Y3QgaTU0MDBfcHZ0ICpwdnQ7CisKKwlwdnQgPSBtY2ktPnB2dF9pbmZvOworCisJLyogRGVjcmVtZW50IHVzYWdlIGNvdW50IGZvciBkZXZpY2VzICovCisJcGNpX2Rldl9wdXQocHZ0LT5icmFuY2hfMSk7CisJcGNpX2Rldl9wdXQocHZ0LT5icmFuY2hfMCk7CisJcGNpX2Rldl9wdXQocHZ0LT5mc2JfZXJyb3JfcmVncyk7CisJcGNpX2Rldl9wdXQocHZ0LT5icmFuY2htYXBfd2Vycm9ycyk7Cit9CisKKy8qCisgKglpNTQwMF9nZXRfZGV2aWNlcwlGaW5kIGFuZCBwZXJmb3JtICdnZXQnIG9wZXJhdGlvbiBvbiB0aGUgTUNIJ3MKKyAqCQkJZGV2aWNlL2Z1bmN0aW9ucyB3ZSB3YW50IHRvIHJlZmVyZW5jZSBmb3IgdGhpcyBkcml2ZXIKKyAqCisgKgkJCU5lZWQgdG8gJ2dldCcgZGV2aWNlIDE2IGZ1bmMgMSBhbmQgZnVuYyAyCisgKi8KK3N0YXRpYyBpbnQgaTU0MDBfZ2V0X2RldmljZXMoc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpLCBpbnQgZGV2X2lkeCkKK3sKKwlzdHJ1Y3QgaTU0MDBfcHZ0ICpwdnQ7CisJc3RydWN0IHBjaV9kZXYgKnBkZXY7CisKKwlwdnQgPSBtY2ktPnB2dF9pbmZvOworCXB2dC0+YnJhbmNobWFwX3dlcnJvcnMgPSBOVUxMOworCXB2dC0+ZnNiX2Vycm9yX3JlZ3MgPSBOVUxMOworCXB2dC0+YnJhbmNoXzAgPSBOVUxMOworCXB2dC0+YnJhbmNoXzEgPSBOVUxMOworCisJLyogQXR0ZW1wdCB0byAnZ2V0JyB0aGUgTUNIIHJlZ2lzdGVyIHdlIHdhbnQgKi8KKwlwZGV2ID0gTlVMTDsKKwl3aGlsZSAoIXB2dC0+YnJhbmNobWFwX3dlcnJvcnMgfHwgIXB2dC0+ZnNiX2Vycm9yX3JlZ3MpIHsKKwkJcGRldiA9IHBjaV9nZXRfZGV2aWNlKFBDSV9WRU5ET1JfSURfSU5URUwsCisJCQkJICAgICAgUENJX0RFVklDRV9JRF9JTlRFTF81NDAwX0VSUiwgcGRldik7CisJCWlmICghcGRldikgeworCQkJLyogRW5kIG9mIGxpc3QsIGxlYXZlICovCisJCQlpNTQwMF9wcmludGsoS0VSTl9FUlIsCisJCQkJIidzeXN0ZW0gYWRkcmVzcyxQcm9jZXNzIEJ1cycgIgorCQkJCSJkZXZpY2Ugbm90IGZvdW5kOiIKKwkJCQkidmVuZG9yIDB4JXggZGV2aWNlIDB4JXggRVJSIGZ1bmNzICIKKwkJCQkiKGJyb2tlbiBCSU9TPylcbiIsCisJCQkJUENJX1ZFTkRPUl9JRF9JTlRFTCwKKwkJCQlQQ0lfREVWSUNFX0lEX0lOVEVMXzU0MDBfRVJSKTsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKworCQkvKiBTdG9yZSBkZXZpY2UgMTYgZnVuY3MgMSBhbmQgMiAqLworCQlzd2l0Y2ggKFBDSV9GVU5DKHBkZXYtPmRldmZuKSkgeworCQljYXNlIDE6CisJCQlwdnQtPmJyYW5jaG1hcF93ZXJyb3JzID0gcGRldjsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQlwdnQtPmZzYl9lcnJvcl9yZWdzID0gcGRldjsKKwkJCWJyZWFrOworCQl9CisJfQorCisJZGVidWdmMSgiU3lzdGVtIEFkZHJlc3MsIHByb2Nlc3NvciBidXMtIFBDSSBCdXMgSUQ6ICVzICAleDoleFxuIiwKKwkJcGNpX25hbWUocHZ0LT5zeXN0ZW1fYWRkcmVzcyksCisJCXB2dC0+c3lzdGVtX2FkZHJlc3MtPnZlbmRvciwgcHZ0LT5zeXN0ZW1fYWRkcmVzcy0+ZGV2aWNlKTsKKwlkZWJ1Z2YxKCJCcmFuY2htYXAsIGNvbnRyb2wgYW5kIGVycm9ycyAtIFBDSSBCdXMgSUQ6ICVzICAleDoleFxuIiwKKwkJcGNpX25hbWUocHZ0LT5icmFuY2htYXBfd2Vycm9ycyksCisJCXB2dC0+YnJhbmNobWFwX3dlcnJvcnMtPnZlbmRvciwgcHZ0LT5icmFuY2htYXBfd2Vycm9ycy0+ZGV2aWNlKTsKKwlkZWJ1Z2YxKCJGU0IgRXJyb3IgUmVncyAtIFBDSSBCdXMgSUQ6ICVzICAleDoleFxuIiwKKwkJcGNpX25hbWUocHZ0LT5mc2JfZXJyb3JfcmVncyksCisJCXB2dC0+ZnNiX2Vycm9yX3JlZ3MtPnZlbmRvciwgcHZ0LT5mc2JfZXJyb3JfcmVncy0+ZGV2aWNlKTsKKworCXB2dC0+YnJhbmNoXzAgPSBwY2lfZ2V0X2RldmljZShQQ0lfVkVORE9SX0lEX0lOVEVMLAorCQkJCSAgICAgICBQQ0lfREVWSUNFX0lEX0lOVEVMXzU0MDBfRkJEMCwgTlVMTCk7CisJaWYgKCFwdnQtPmJyYW5jaF8wKSB7CisJCWk1NDAwX3ByaW50ayhLRVJOX0VSUiwKKwkJCSJNQzogJ0JSQU5DSCAwJyBkZXZpY2Ugbm90IGZvdW5kOiIKKwkJCSJ2ZW5kb3IgMHgleCBkZXZpY2UgMHgleCBGdW5jIDAgKGJyb2tlbiBCSU9TPylcbiIsCisJCQlQQ0lfVkVORE9SX0lEX0lOVEVMLCBQQ0lfREVWSUNFX0lEX0lOVEVMXzU0MDBfRkJEMCk7CisJCWdvdG8gZXJyb3I7CisJfQorCisJLyogSWYgdGhpcyBkZXZpY2UgY2xhaW1zIHRvIGhhdmUgbW9yZSB0aGFuIDIgY2hhbm5lbHMgdGhlbgorCSAqIGZldGNoIEJyYW5jaCAxJ3MgaW5mb3JtYXRpb24KKwkgKi8KKwlpZiAocHZ0LT5tYXhjaCA8IENIQU5ORUxTX1BFUl9CUkFOQ0gpCisJCXJldHVybiAwOworCisJcHZ0LT5icmFuY2hfMSA9IHBjaV9nZXRfZGV2aWNlKFBDSV9WRU5ET1JfSURfSU5URUwsCisJCQkJICAgICAgIFBDSV9ERVZJQ0VfSURfSU5URUxfNTQwMF9GQkQxLCBOVUxMKTsKKwlpZiAoIXB2dC0+YnJhbmNoXzEpIHsKKwkJaTU0MDBfcHJpbnRrKEtFUk5fRVJSLAorCQkJIk1DOiAnQlJBTkNIIDEnIGRldmljZSBub3QgZm91bmQ6IgorCQkJInZlbmRvciAweCV4IGRldmljZSAweCV4IEZ1bmMgMCAiCisJCQkiKGJyb2tlbiBCSU9TPylcbiIsCisJCQlQQ0lfVkVORE9SX0lEX0lOVEVMLAorCQkJUENJX0RFVklDRV9JRF9JTlRFTF81NDAwX0ZCRDEpOworCQlnb3RvIGVycm9yOworCX0KKworCXJldHVybiAwOworCitlcnJvcjoKKwlpNTQwMF9wdXRfZGV2aWNlcyhtY2kpOworCXJldHVybiAtRU5PREVWOworfQorCisvKgorICoJZGV0ZXJtaW5lX2FtYl9wcmVzZW50CisgKgorICoJCXRoZSBpbmZvcm1hdGlvbiBpcyBjb250YWluZWQgaW4gTlVNX01UUlNfUEVSX0JSQU5DSCBkaWZmZXJlbnQKKyAqCQlyZWdpc3RlcnMgZGV0ZXJtaW5pbmcgd2hpY2ggb2YgdGhlIE5VTV9NVFJTX1BFUl9CUkFOQ0ggcmVxdWlyZXMKKyAqICAgICAgICAgICAgICBrbm93aW5nIHdoaWNoIGNoYW5uZWwgaXMgaW4gcXVlc3Rpb24KKyAqCisgKgkyIGJyYW5jaGVzLCBlYWNoIHdpdGggMiBjaGFubmVscworICoJCWIwX2FtYnByZXNlbnQwIGZvciBjaGFubmVsICcwJworICoJCWIwX2FtYnByZXNlbnQxIGZvciBjaGFubmVsICcxJworICoJCWIxX2FtYnByZXNlbnQwIGZvciBjaGFubmVsICcyJworICoJCWIxX2FtYnByZXNlbnQxIGZvciBjaGFubmVsICczJworICovCitzdGF0aWMgaW50IGRldGVybWluZV9hbWJfcHJlc2VudF9yZWcoc3RydWN0IGk1NDAwX3B2dCAqcHZ0LCBpbnQgY2hhbm5lbCkKK3sKKwlpbnQgYW1iX3ByZXNlbnQ7CisKKwlpZiAoY2hhbm5lbCA8IENIQU5ORUxTX1BFUl9CUkFOQ0gpIHsKKwkJaWYgKGNoYW5uZWwgJiAweDEpCisJCQlhbWJfcHJlc2VudCA9IHB2dC0+YjBfYW1icHJlc2VudDE7CisJCWVsc2UKKwkJCWFtYl9wcmVzZW50ID0gcHZ0LT5iMF9hbWJwcmVzZW50MDsKKwl9IGVsc2UgeworCQlpZiAoY2hhbm5lbCAmIDB4MSkKKwkJCWFtYl9wcmVzZW50ID0gcHZ0LT5iMV9hbWJwcmVzZW50MTsKKwkJZWxzZQorCQkJYW1iX3ByZXNlbnQgPSBwdnQtPmIxX2FtYnByZXNlbnQwOworCX0KKworCXJldHVybiBhbWJfcHJlc2VudDsKK30KKworLyoKKyAqIGRldGVybWluZV9tdHIocHZ0LCBjc3JvdywgY2hhbm5lbCkKKyAqCisgKiByZXR1cm4gdGhlIHByb3BlciBNVFIgcmVnaXN0ZXIgYXMgZGV0ZXJtaW5lIGJ5IHRoZSBjc3JvdyBhbmQgZGVzaXJlZCBjaGFubmVsCisgKi8KK3N0YXRpYyBpbnQgZGV0ZXJtaW5lX210cihzdHJ1Y3QgaTU0MDBfcHZ0ICpwdnQsIGludCBjc3JvdywgaW50IGNoYW5uZWwpCit7CisJaW50IG10cjsKKwlpbnQgbjsKKworCS8qIFRoZXJlIGlzIG9uZSBNVFIgZm9yIGVhY2ggc2xvdCBwYWlyIG9mIEZCLURJTU1zLAorCSAgIEVhY2ggc2xvdCBtYXkgaGF2ZSBvbmUgb3IgdHdvIHJhbmtzICgyIGNzcm93cyksCisJICAgRWFjaCBzbG90IHBhaXIgbWF5IGJlIGF0IGJyYW5jaCAwIG9yIGJyYW5jaCAxLgorCSAgIFNvLCBjc3JvdyBzaG91bGQgYmUgZGl2aWRlZCBieSBlaWdodAorCSAqLworCW4gPSBjc3JvdyA+PiAzOworCisJaWYgKG4gPj0gTlVNX01UUlNfUEVSX0JSQU5DSCkgeworCQlkZWJ1Z2YwKCJFUlJPUjogdHJ5aW5nIHRvIGFjY2VzcyBhbiBpbnZhbGlkIGNzcm93OiAlZFxuIiwKKwkJCWNzcm93KTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGNoYW5uZWwgPCBDSEFOTkVMU19QRVJfQlJBTkNIKQorCQltdHIgPSBwdnQtPmIwX210cltuXTsKKwllbHNlCisJCW10ciA9IHB2dC0+YjFfbXRyW25dOworCisJcmV0dXJuIG10cjsKK30KKworLyoKKyAqLworc3RhdGljIHZvaWQgZGVjb2RlX210cihpbnQgc2xvdF9yb3csIHUxNiBtdHIpCit7CisJaW50IGFuczsKKworCWFucyA9IE1UUl9ESU1NU19QUkVTRU5UKG10cik7CisKKwlkZWJ1Z2YyKCJcdE1UUiVkPTB4JXg6ICBESU1NcyBhcmUgJXNcbiIsIHNsb3Rfcm93LCBtdHIsCisJCWFucyA/ICJQcmVzZW50IiA6ICJOT1QgUHJlc2VudCIpOworCWlmICghYW5zKQorCQlyZXR1cm47CisKKwlkZWJ1Z2YyKCJcdFx0V0lEVEg6IHglZFxuIiwgTVRSX0RSQU1fV0lEVEgobXRyKSk7CisKKwlkZWJ1Z2YyKCJcdFx0RUxFQ1RSSUNBTCBUSFJPVFRMSU5HIGlzICVzXG4iLAorCQlNVFJfRElNTVNfRVRIUk9UVExFKG10cikgPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiKTsKKworCWRlYnVnZjIoIlx0XHROVU1CQU5LOiAlZCBiYW5rKHMpXG4iLCBNVFJfRFJBTV9CQU5LUyhtdHIpKTsKKwlkZWJ1Z2YyKCJcdFx0TlVNUkFOSzogJXNcbiIsIE1UUl9ESU1NX1JBTksobXRyKSA/ICJkb3VibGUiIDogInNpbmdsZSIpOworCWRlYnVnZjIoIlx0XHROVU1ST1c6ICVzXG4iLCBudW1yb3dfdG9TdHJpbmdbTVRSX0RJTU1fUk9XUyhtdHIpXSk7CisJZGVidWdmMigiXHRcdE5VTUNPTDogJXNcbiIsIG51bWNvbF90b1N0cmluZ1tNVFJfRElNTV9DT0xTKG10cildKTsKK30KKworc3RhdGljIHZvaWQgaGFuZGxlX2NoYW5uZWwoc3RydWN0IGk1NDAwX3B2dCAqcHZ0LCBpbnQgY3Nyb3csIGludCBjaGFubmVsLAorCQkJc3RydWN0IGk1NDAwX2RpbW1faW5mbyAqZGluZm8pCit7CisJaW50IG10cjsKKwlpbnQgYW1iX3ByZXNlbnRfcmVnOworCWludCBhZGRyQml0czsKKworCW10ciA9IGRldGVybWluZV9tdHIocHZ0LCBjc3JvdywgY2hhbm5lbCk7CisJaWYgKE1UUl9ESU1NU19QUkVTRU5UKG10cikpIHsKKwkJYW1iX3ByZXNlbnRfcmVnID0gZGV0ZXJtaW5lX2FtYl9wcmVzZW50X3JlZyhwdnQsIGNoYW5uZWwpOworCisJCS8qIERldGVybWluZSBpZiB0aGVyZSBpcyBhIERJTU0gcHJlc2VudCBpbiB0aGlzIERJTU0gc2xvdCAqLworCQlpZiAoYW1iX3ByZXNlbnRfcmVnICYgKDEgPDwgKGNzcm93ID4+IDEpKSkgeworCQkJZGluZm8tPmR1YWxfcmFuayA9IE1UUl9ESU1NX1JBTksobXRyKTsKKworCQkJaWYgKCEoKGRpbmZvLT5kdWFsX3JhbmsgPT0gMCkgJiYKKwkJCQkoKGNzcm93ICYgMHgxKSA9PSAweDEpKSkgeworCQkJCS8qIFN0YXJ0IHdpdGggdGhlIG51bWJlciBvZiBiaXRzIGZvciBhIEJhbmsKKwkJCQkgKiBvbiB0aGUgRFJBTSAqLworCQkJCWFkZHJCaXRzID0gTVRSX0RSQU1fQkFOS1NfQUREUl9CSVRTKG10cik7CisJCQkJLyogQWRkIHRoZW51bWJlciBvZiBST1cgYml0cyAqLworCQkJCWFkZHJCaXRzICs9IE1UUl9ESU1NX1JPV1NfQUREUl9CSVRTKG10cik7CisJCQkJLyogYWRkIHRoZSBudW1iZXIgb2YgQ09MVU1OIGJpdHMgKi8KKwkJCQlhZGRyQml0cyArPSBNVFJfRElNTV9DT0xTX0FERFJfQklUUyhtdHIpOworCisJCQkJYWRkckJpdHMgKz0gNjsJLyogYWRkIDY0IGJpdHMgcGVyIERJTU0gKi8KKwkJCQlhZGRyQml0cyAtPSAyMDsJLyogZGl2aWRlIGJ5IDJeXjIwICovCisJCQkJYWRkckJpdHMgLT0gMzsJLyogOCBiaXRzIHBlciBieXRlcyAqLworCisJCQkJZGluZm8tPm1lZ2FieXRlcyA9IDEgPDwgYWRkckJpdHM7CisJCQl9CisJCX0KKwl9Cit9CisKKy8qCisgKgljYWxjdWxhdGVfZGltbV9zaXplCisgKgorICoJYWxzbyB3aWxsIG91dHB1dCBhIERJTU0gbWF0cml4IG1hcCwgaWYgZGVidWcgaXMgZW5hYmxlZCwgZm9yIHZpZXdpbmcKKyAqCWhvdyB0aGUgRElNTXMgYXJlIHBvcHVsYXRlZAorICovCitzdGF0aWMgdm9pZCBjYWxjdWxhdGVfZGltbV9zaXplKHN0cnVjdCBpNTQwMF9wdnQgKnB2dCkKK3sKKwlzdHJ1Y3QgaTU0MDBfZGltbV9pbmZvICpkaW5mbzsKKwlpbnQgY3Nyb3csIG1heF9jc3Jvd3M7CisJY2hhciAqcCwgKm1lbV9idWZmZXI7CisJaW50IHNwYWNlLCBuOworCWludCBjaGFubmVsOworCisJLyogPT09PT09PT09PT09PT09PT0gR2VuZXJhdGUgc29tZSBkZWJ1ZyBvdXRwdXQgPT09PT09PT09PT09PT09PT0gKi8KKwlzcGFjZSA9IFBBR0VfU0laRTsKKwltZW1fYnVmZmVyID0gcCA9IGttYWxsb2Moc3BhY2UsIEdGUF9LRVJORUwpOworCWlmIChwID09IE5VTEwpIHsKKwkJaTU0MDBfcHJpbnRrKEtFUk5fRVJSLCAiTUM6ICVzOiVzKCkga21hbGxvYygpIGZhaWxlZFxuIiwKKwkJCV9fRklMRV9fLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisKKwkvKiBTY2FuIGFsbCB0aGUgYWN0dWFsIENTUk9XUyAod2hpY2ggaXMgIyBvZiBESU1NUyAqIDIpCisJICogYW5kIGNhbGN1bGF0ZSB0aGUgaW5mb3JtYXRpb24gZm9yIGVhY2ggRElNTQorCSAqIFN0YXJ0IHdpdGggdGhlIGhpZ2hlc3QgY3Nyb3cgZmlyc3QsIHRvIGRpc3BsYXkgaXQgZmlyc3QKKwkgKiBhbmQgd29yayB0b3dhcmQgdGhlIDB0aCBjc3JvdworCSAqLworCW1heF9jc3Jvd3MgPSBwdnQtPm1heGRpbW1wZXJjaCAqIDI7CisJZm9yIChjc3JvdyA9IG1heF9jc3Jvd3MgLSAxOyBjc3JvdyA+PSAwOyBjc3Jvdy0tKSB7CisKKwkJLyogb24gYW4gb2RkIGNzcm93LCBmaXJzdCBvdXRwdXQgYSAnYm91bmRhcnknIG1hcmtlciwKKwkJICogdGhlbiByZXNldCB0aGUgbWVzc2FnZSBidWZmZXIgICovCisJCWlmIChjc3JvdyAmIDB4MSkgeworCQkJbiA9IHNucHJpbnRmKHAsIHNwYWNlLCAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIgorCQkJCQkiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKKwkJCXAgKz0gbjsKKwkJCXNwYWNlIC09IG47CisJCQlkZWJ1Z2YyKCIlc1xuIiwgbWVtX2J1ZmZlcik7CisJCQlwID0gbWVtX2J1ZmZlcjsKKwkJCXNwYWNlID0gUEFHRV9TSVpFOworCQl9CisJCW4gPSBzbnByaW50ZihwLCBzcGFjZSwgImNzcm93ICUyZCAgICAiLCBjc3Jvdyk7CisJCXAgKz0gbjsKKwkJc3BhY2UgLT0gbjsKKworCQlmb3IgKGNoYW5uZWwgPSAwOyBjaGFubmVsIDwgcHZ0LT5tYXhjaDsgY2hhbm5lbCsrKSB7CisJCQlkaW5mbyA9ICZwdnQtPmRpbW1faW5mb1tjc3Jvd11bY2hhbm5lbF07CisJCQloYW5kbGVfY2hhbm5lbChwdnQsIGNzcm93LCBjaGFubmVsLCBkaW5mbyk7CisJCQluID0gc25wcmludGYocCwgc3BhY2UsICIlNGQgTUIgICB8ICIsIGRpbmZvLT5tZWdhYnl0ZXMpOworCQkJcCArPSBuOworCQkJc3BhY2UgLT0gbjsKKwkJfQorCQlkZWJ1Z2YyKCIlc1xuIiwgbWVtX2J1ZmZlcik7CisJCXAgPSBtZW1fYnVmZmVyOworCQlzcGFjZSA9IFBBR0VfU0laRTsKKwl9CisKKwkvKiBPdXRwdXQgdGhlIGxhc3QgYm90dG9tICdib3VuZGFyeScgbWFya2VyICovCisJbiA9IHNucHJpbnRmKHAsIHNwYWNlLCAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIgorCQkJIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7CisJcCArPSBuOworCXNwYWNlIC09IG47CisJZGVidWdmMigiJXNcbiIsIG1lbV9idWZmZXIpOworCXAgPSBtZW1fYnVmZmVyOworCXNwYWNlID0gUEFHRV9TSVpFOworCisJLyogbm93IG91dHB1dCB0aGUgJ2NoYW5uZWwnIGxhYmVscyAqLworCW4gPSBzbnByaW50ZihwLCBzcGFjZSwgIiAgICAgICAgICAgICIpOworCXAgKz0gbjsKKwlzcGFjZSAtPSBuOworCWZvciAoY2hhbm5lbCA9IDA7IGNoYW5uZWwgPCBwdnQtPm1heGNoOyBjaGFubmVsKyspIHsKKwkJbiA9IHNucHJpbnRmKHAsIHNwYWNlLCAiY2hhbm5lbCAlZCB8ICIsIGNoYW5uZWwpOworCQlwICs9IG47CisJCXNwYWNlIC09IG47CisJfQorCisJLyogb3V0cHV0IHRoZSBsYXN0IG1lc3NhZ2UgYW5kIGZyZWUgYnVmZmVyICovCisJZGVidWdmMigiJXNcbiIsIG1lbV9idWZmZXIpOworCWtmcmVlKG1lbV9idWZmZXIpOworfQorCisvKgorICoJaTU0MDBfZ2V0X21jX3JlZ3MJcmVhZCBpbiB0aGUgbmVjZXNzYXJ5IHJlZ2lzdGVycyBhbmQKKyAqCQkJCWNhY2hlIGxvY2FsbHkKKyAqCisgKgkJCUZpbGxzIGluIHRoZSBwcml2YXRlIGRhdGEgbWVtYmVycworICovCitzdGF0aWMgdm9pZCBpNTQwMF9nZXRfbWNfcmVncyhzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2kpCit7CisJc3RydWN0IGk1NDAwX3B2dCAqcHZ0OworCXUzMiBhY3R1YWxfdG9sbTsKKwl1MTYgbGltaXQ7CisJaW50IHNsb3Rfcm93OworCWludCBtYXhjaDsKKwlpbnQgbWF4ZGltbXBlcmNoOworCWludCB3YXkwLCB3YXkxOworCisJcHZ0ID0gbWNpLT5wdnRfaW5mbzsKKworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwdnQtPnN5c3RlbV9hZGRyZXNzLCBBTUJBU0UsCisJCQkodTMyICopICZwdnQtPmFtYmFzZSk7CisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHB2dC0+c3lzdGVtX2FkZHJlc3MsIEFNQkFTRSArIHNpemVvZih1MzIpLAorCQkJKCh1MzIgKikgJnB2dC0+YW1iYXNlKSArIHNpemVvZih1MzIpKTsKKworCW1heGRpbW1wZXJjaCA9IHB2dC0+bWF4ZGltbXBlcmNoOworCW1heGNoID0gcHZ0LT5tYXhjaDsKKworCWRlYnVnZjIoIkFNQkFTRT0gMHglbHggIE1BWENIPSAlZCAgTUFYLURJTU0tUGVyLUNIPSAlZFxuIiwKKwkJKGxvbmcgdW5zaWduZWQgaW50KXB2dC0+YW1iYXNlLCBwdnQtPm1heGNoLCBwdnQtPm1heGRpbW1wZXJjaCk7CisKKwkvKiBHZXQgdGhlIEJyYW5jaCBNYXAgcmVncyAqLworCXBjaV9yZWFkX2NvbmZpZ193b3JkKHB2dC0+YnJhbmNobWFwX3dlcnJvcnMsIFRPTE0sICZwdnQtPnRvbG0pOworCXB2dC0+dG9sbSA+Pj0gMTI7CisJZGVidWdmMigiXG5UT0xNIChudW1iZXIgb2YgMjU2TSByZWdpb25zKSA9JXUgKDB4JXgpXG4iLCBwdnQtPnRvbG0sCisJCXB2dC0+dG9sbSk7CisKKwlhY3R1YWxfdG9sbSA9ICh1MzIpICgoMTAwMGwgKiBwdnQtPnRvbG0pID4+ICgzMCAtIDI4KSk7CisJZGVidWdmMigiQWN0dWFsIFRPTE0gYnl0ZSBhZGRyPSV1LiUwM3UgR0IgKDB4JXgpXG4iLAorCQlhY3R1YWxfdG9sbS8xMDAwLCBhY3R1YWxfdG9sbSAlIDEwMDAsIHB2dC0+dG9sbSA8PCAyOCk7CisKKwlwY2lfcmVhZF9jb25maWdfd29yZChwdnQtPmJyYW5jaG1hcF93ZXJyb3JzLCBNSVIwLCAmcHZ0LT5taXIwKTsKKwlwY2lfcmVhZF9jb25maWdfd29yZChwdnQtPmJyYW5jaG1hcF93ZXJyb3JzLCBNSVIxLCAmcHZ0LT5taXIxKTsKKworCS8qIEdldCB0aGUgTUlSWzAtMV0gcmVncyAqLworCWxpbWl0ID0gKHB2dC0+bWlyMCA+PiA0KSAmIDB4MGZmZjsKKwl3YXkwID0gcHZ0LT5taXIwICYgMHgxOworCXdheTEgPSBwdnQtPm1pcjAgJiAweDI7CisJZGVidWdmMigiTUlSMDogbGltaXQ9IDB4JXggIFdBWTE9ICV1ICBXQVkwPSAleFxuIiwgbGltaXQsIHdheTEsIHdheTApOworCWxpbWl0ID0gKHB2dC0+bWlyMSA+PiA0KSAmIDB4ZmZmOworCXdheTAgPSBwdnQtPm1pcjEgJiAweDE7CisJd2F5MSA9IHB2dC0+bWlyMSAmIDB4MjsKKwlkZWJ1Z2YyKCJNSVIxOiBsaW1pdD0gMHgleCAgV0FZMT0gJXUgIFdBWTA9ICV4XG4iLCBsaW1pdCwgd2F5MSwgd2F5MCk7CisKKwkvKiBHZXQgdGhlIHNldCBvZiBNVFJbMC0zXSByZWdzIGJ5IGVhY2ggYnJhbmNoICovCisJZm9yIChzbG90X3JvdyA9IDA7IHNsb3Rfcm93IDwgTlVNX01UUlNfUEVSX0JSQU5DSDsgc2xvdF9yb3crKykgeworCQlpbnQgd2hlcmUgPSBNVFIwICsgKHNsb3Rfcm93ICogc2l6ZW9mKHUzMikpOworCisJCS8qIEJyYW5jaCAwIHNldCBvZiBNVFIgcmVnaXN0ZXJzICovCisJCXBjaV9yZWFkX2NvbmZpZ193b3JkKHB2dC0+YnJhbmNoXzAsIHdoZXJlLAorCQkJCSZwdnQtPmIwX210cltzbG90X3Jvd10pOworCisJCWRlYnVnZjIoIk1UUiVkIHdoZXJlPTB4JXggQjAgdmFsdWU9MHgleFxuIiwgc2xvdF9yb3csIHdoZXJlLAorCQkJcHZ0LT5iMF9tdHJbc2xvdF9yb3ddKTsKKworCQlpZiAocHZ0LT5tYXhjaCA8IENIQU5ORUxTX1BFUl9CUkFOQ0gpIHsKKwkJCXB2dC0+YjFfbXRyW3Nsb3Rfcm93XSA9IDA7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIEJyYW5jaCAxIHNldCBvZiBNVFIgcmVnaXN0ZXJzICovCisJCXBjaV9yZWFkX2NvbmZpZ193b3JkKHB2dC0+YnJhbmNoXzEsIHdoZXJlLAorCQkJCSZwdnQtPmIxX210cltzbG90X3Jvd10pOworCQlkZWJ1Z2YyKCJNVFIlZCB3aGVyZT0weCV4IEIxIHZhbHVlPTB4JXhcbiIsIHNsb3Rfcm93LCB3aGVyZSwKKwkJCXB2dC0+YjFfbXRyW3Nsb3Rfcm93XSk7CisJfQorCisJLyogUmVhZCBhbmQgZHVtcCBicmFuY2ggMCdzIE1UUnMgKi8KKwlkZWJ1Z2YyKCJcbk1lbW9yeSBUZWNobm9sb2d5IFJlZ2lzdGVyczpcbiIpOworCWRlYnVnZjIoIiAgIEJyYW5jaCAwOlxuIik7CisJZm9yIChzbG90X3JvdyA9IDA7IHNsb3Rfcm93IDwgTlVNX01UUlNfUEVSX0JSQU5DSDsgc2xvdF9yb3crKykKKwkJZGVjb2RlX210cihzbG90X3JvdywgcHZ0LT5iMF9tdHJbc2xvdF9yb3ddKTsKKworCXBjaV9yZWFkX2NvbmZpZ193b3JkKHB2dC0+YnJhbmNoXzAsIEFNQlBSRVNFTlRfMCwKKwkJCSZwdnQtPmIwX2FtYnByZXNlbnQwKTsKKwlkZWJ1Z2YyKCJcdFx0QU1CLUJyYW5jaCAwLXByZXNlbnQwIDB4JXg6XG4iLCBwdnQtPmIwX2FtYnByZXNlbnQwKTsKKwlwY2lfcmVhZF9jb25maWdfd29yZChwdnQtPmJyYW5jaF8wLCBBTUJQUkVTRU5UXzEsCisJCQkmcHZ0LT5iMF9hbWJwcmVzZW50MSk7CisJZGVidWdmMigiXHRcdEFNQi1CcmFuY2ggMC1wcmVzZW50MSAweCV4OlxuIiwgcHZ0LT5iMF9hbWJwcmVzZW50MSk7CisKKwkvKiBPbmx5IGlmIHdlIGhhdmUgMiBicmFuY2hzICg0IGNoYW5uZWxzKSAqLworCWlmIChwdnQtPm1heGNoIDwgQ0hBTk5FTFNfUEVSX0JSQU5DSCkgeworCQlwdnQtPmIxX2FtYnByZXNlbnQwID0gMDsKKwkJcHZ0LT5iMV9hbWJwcmVzZW50MSA9IDA7CisJfSBlbHNlIHsKKwkJLyogUmVhZCBhbmQgZHVtcCAgYnJhbmNoIDEncyBNVFJzICovCisJCWRlYnVnZjIoIiAgIEJyYW5jaCAxOlxuIik7CisJCWZvciAoc2xvdF9yb3cgPSAwOyBzbG90X3JvdyA8IE5VTV9NVFJTX1BFUl9CUkFOQ0g7IHNsb3Rfcm93KyspCisJCQlkZWNvZGVfbXRyKHNsb3Rfcm93LCBwdnQtPmIxX210cltzbG90X3Jvd10pOworCisJCXBjaV9yZWFkX2NvbmZpZ193b3JkKHB2dC0+YnJhbmNoXzEsIEFNQlBSRVNFTlRfMCwKKwkJCQkmcHZ0LT5iMV9hbWJwcmVzZW50MCk7CisJCWRlYnVnZjIoIlx0XHRBTUItQnJhbmNoIDEtcHJlc2VudDAgMHgleDpcbiIsCisJCQlwdnQtPmIxX2FtYnByZXNlbnQwKTsKKwkJcGNpX3JlYWRfY29uZmlnX3dvcmQocHZ0LT5icmFuY2hfMSwgQU1CUFJFU0VOVF8xLAorCQkJCSZwdnQtPmIxX2FtYnByZXNlbnQxKTsKKwkJZGVidWdmMigiXHRcdEFNQi1CcmFuY2ggMS1wcmVzZW50MSAweCV4OlxuIiwKKwkJCXB2dC0+YjFfYW1icHJlc2VudDEpOworCX0KKworCS8qIEdvIGFuZCBkZXRlcm1pbmUgdGhlIHNpemUgb2YgZWFjaCBESU1NIGFuZCBwbGFjZSBpbiBhbgorCSAqIG9yZGVybHkgbWF0cml4ICovCisJY2FsY3VsYXRlX2RpbW1fc2l6ZShwdnQpOworfQorCisvKgorICoJaTU0MDBfaW5pdF9jc3Jvd3MJSW5pdGlhbGl6ZSB0aGUgJ2Nzcm93cycgdGFibGUgd2l0aGluCisgKgkJCQl0aGUgbWNpIGNvbnRyb2wJc3RydWN0dXJlIHdpdGggdGhlCisgKgkJCQlhZGRyZXNzaW5nIG9mIG1lbW9yeS4KKyAqCisgKglyZXR1cm46CisgKgkJMAlzdWNjZXNzCisgKgkJMQlubyBhY3R1YWwgbWVtb3J5IGZvdW5kIG9uIHRoaXMgTUMKKyAqLworc3RhdGljIGludCBpNTQwMF9pbml0X2Nzcm93cyhzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2kpCit7CisJc3RydWN0IGk1NDAwX3B2dCAqcHZ0OworCXN0cnVjdCBjc3Jvd19pbmZvICpwX2Nzcm93OworCWludCBlbXB0eSwgY2hhbm5lbF9jb3VudDsKKwlpbnQgbWF4X2Nzcm93czsKKwlpbnQgbXRyOworCWludCBjc3Jvd19tZWdzOworCWludCBjaGFubmVsOworCWludCBjc3JvdzsKKworCXB2dCA9IG1jaS0+cHZ0X2luZm87CisKKwljaGFubmVsX2NvdW50ID0gcHZ0LT5tYXhjaDsKKwltYXhfY3Nyb3dzID0gcHZ0LT5tYXhkaW1tcGVyY2ggKiAyOworCisJZW1wdHkgPSAxOwkJLyogQXNzdW1lIE5PIG1lbW9yeSAqLworCisJZm9yIChjc3JvdyA9IDA7IGNzcm93IDwgbWF4X2Nzcm93czsgY3Nyb3crKykgeworCQlwX2Nzcm93ID0gJm1jaS0+Y3Nyb3dzW2Nzcm93XTsKKworCQlwX2Nzcm93LT5jc3Jvd19pZHggPSBjc3JvdzsKKworCQkvKiB1c2UgYnJhbmNoIDAgZm9yIHRoZSBiYXNpcyAqLworCQltdHIgPSBkZXRlcm1pbmVfbXRyKHB2dCwgY3Nyb3csIDApOworCisJCS8qIGlmIG5vIERJTU1TIG9uIHRoaXMgcm93LCBjb250aW51ZSAqLworCQlpZiAoIU1UUl9ESU1NU19QUkVTRU5UKG10cikpCisJCQljb250aW51ZTsKKworCQkvKiBGQUtFIE9VVCBWQUxVRVMsIEZJWE1FICovCisJCXBfY3Nyb3ctPmZpcnN0X3BhZ2UgPSAwICsgY3Nyb3cgKiAyMDsKKwkJcF9jc3Jvdy0+bGFzdF9wYWdlID0gOSArIGNzcm93ICogMjA7CisJCXBfY3Nyb3ctPnBhZ2VfbWFzayA9IDB4RkZGOworCisJCXBfY3Nyb3ctPmdyYWluID0gODsKKworCQljc3Jvd19tZWdzID0gMDsKKwkJZm9yIChjaGFubmVsID0gMDsgY2hhbm5lbCA8IHB2dC0+bWF4Y2g7IGNoYW5uZWwrKykKKwkJCWNzcm93X21lZ3MgKz0gcHZ0LT5kaW1tX2luZm9bY3Nyb3ddW2NoYW5uZWxdLm1lZ2FieXRlczsKKworCQlwX2Nzcm93LT5ucl9wYWdlcyA9IGNzcm93X21lZ3MgPDwgODsKKworCQkvKiBBc3N1bWUgRERSMiBmb3Igbm93ICovCisJCXBfY3Nyb3ctPm10eXBlID0gTUVNX0ZCX0REUjI7CisKKwkJLyogYXNrIHdoYXQgZGV2aWNlIHR5cGUgb24gdGhpcyByb3cgKi8KKwkJaWYgKE1UUl9EUkFNX1dJRFRIKG10cikpCisJCQlwX2Nzcm93LT5kdHlwZSA9IERFVl9YODsKKwkJZWxzZQorCQkJcF9jc3Jvdy0+ZHR5cGUgPSBERVZfWDQ7CisKKwkJcF9jc3Jvdy0+ZWRhY19tb2RlID0gRURBQ19TOEVDRDhFRDsKKworCQllbXB0eSA9IDA7CisJfQorCisJcmV0dXJuIGVtcHR5OworfQorCisvKgorICoJaTU0MDBfZW5hYmxlX2Vycm9yX3JlcG9ydGluZworICoJCQlUdXJuIG9uIHRoZSBtZW1vcnkgcmVwb3J0aW5nIGZlYXR1cmVzIG9mIHRoZSBoYXJkd2FyZQorICovCitzdGF0aWMgdm9pZCBpNTQwMF9lbmFibGVfZXJyb3JfcmVwb3J0aW5nKHN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaSkKK3sKKwlzdHJ1Y3QgaTU0MDBfcHZ0ICpwdnQ7CisJdTMyIGZiZF9lcnJvcl9tYXNrOworCisJcHZ0ID0gbWNpLT5wdnRfaW5mbzsKKworCS8qIFJlYWQgdGhlIEZCRCBFcnJvciBNYXNrIFJlZ2lzdGVyICovCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHB2dC0+YnJhbmNobWFwX3dlcnJvcnMsIEVNQVNLX0ZCRCwKKwkJCSZmYmRfZXJyb3JfbWFzayk7CisKKwkvKiBFbmFibGUgd2l0aCBhICcwJyAqLworCWZiZF9lcnJvcl9tYXNrICY9IH4oRU5BQkxFX0VNQVNLX0FMTCk7CisKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHB2dC0+YnJhbmNobWFwX3dlcnJvcnMsIEVNQVNLX0ZCRCwKKwkJCWZiZF9lcnJvcl9tYXNrKTsKK30KKworLyoKKyAqIGk1NDAwX2dldF9kaW1tX2FuZF9jaGFubmVsX2NvdW50cyhwZGV2LCAmbnVtX2Nzcm93cywgJm51bV9jaGFubmVscykKKyAqCisgKglhc2sgdGhlIGRldmljZSBob3cgbWFueSBjaGFubmVscyBhcmUgcHJlc2VudCBhbmQgaG93IG1hbnkgQ1NST1dTCisgKgkgYXMgd2VsbAorICovCitzdGF0aWMgdm9pZCBpNTQwMF9nZXRfZGltbV9hbmRfY2hhbm5lbF9jb3VudHMoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCQkJCWludCAqbnVtX2RpbW1zX3Blcl9jaGFubmVsLAorCQkJCQlpbnQgKm51bV9jaGFubmVscykKK3sKKwl1OCB2YWx1ZTsKKworCS8qIE5lZWQgdG8gcmV0cmlldmUganVzdCBob3cgbWFueSBjaGFubmVscyBhbmQgZGltbXMgcGVyIGNoYW5uZWwgYXJlCisJICogc3VwcG9ydGVkIG9uIHRoaXMgbWVtb3J5IGNvbnRyb2xsZXIKKwkgKi8KKwlwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCBNQVhESU1NUEVSQ0gsICZ2YWx1ZSk7CisJKm51bV9kaW1tc19wZXJfY2hhbm5lbCA9IChpbnQpdmFsdWUgKiAyOworCisJcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgTUFYQ0gsICZ2YWx1ZSk7CisJKm51bV9jaGFubmVscyA9IChpbnQpdmFsdWU7Cit9CisKKy8qCisgKglpNTQwMF9wcm9iZTEJUHJvYmUgZm9yIE9ORSBpbnN0YW5jZSBvZiBkZXZpY2UgdG8gc2VlIGlmIGl0IGlzCisgKgkJCXByZXNlbnQuCisgKglyZXR1cm46CisgKgkJMCBmb3IgRk9VTkQgYSBkZXZpY2UKKyAqCQk8IDAgZm9yIGVycm9yIGNvZGUKKyAqLworc3RhdGljIGludCBpNTQwMF9wcm9iZTEoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGludCBkZXZfaWR4KQoreworCXN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaTsKKwlzdHJ1Y3QgaTU0MDBfcHZ0ICpwdnQ7CisJaW50IG51bV9jaGFubmVsczsKKwlpbnQgbnVtX2RpbW1zX3Blcl9jaGFubmVsOworCWludCBudW1fY3Nyb3dzOworCisJaWYgKGRldl9pZHggPj0gQVJSQVlfU0laRShpNTQwMF9kZXZzKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkZWJ1Z2YwKCJNQzogIiBfX0ZJTEVfXyAiOiAlcygpLCBwZGV2IGJ1cyAldSBkZXY9MHgleCBmbj0weCV4XG4iLAorCQlfX2Z1bmNfXywKKwkJcGRldi0+YnVzLT5udW1iZXIsCisJCVBDSV9TTE9UKHBkZXYtPmRldmZuKSwgUENJX0ZVTkMocGRldi0+ZGV2Zm4pKTsKKworCS8qIFdlIG9ubHkgYXJlIGxvb2tpbmcgZm9yIGZ1bmMgMCBvZiB0aGUgc2V0ICovCisJaWYgKFBDSV9GVU5DKHBkZXYtPmRldmZuKSAhPSAwKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCS8qIEFzayB0aGUgZGV2aWNlcyBmb3IgdGhlIG51bWJlciBvZiBDU1JPV1MgYW5kIENIQU5ORUxTIHNvCisJICogdGhhdCB3ZSBjYW4gY2FsY3VsYXRlIHRoZSBtZW1vcnkgcmVzb3VyY2VzLCBldGMKKwkgKgorCSAqIFRoZSBDaGlwc2V0IHdpbGwgcmVwb3J0IHdoYXQgaXQgY2FuIGhhbmRsZSB3aGljaCB3aWxsIGJlIGdyZWF0ZXIKKwkgKiBvciBlcXVhbCB0byB3aGF0IHRoZSBtb3RoZXJib2FyZCBtYW51ZmFjdHVyZXIgd2lsbCBpbXBsZW1lbnQuCisJICoKKwkgKiBBcyB3ZSBkb24ndCBoYXZlIGEgbW90aGVyYm9hcmQgaWRlbnRpZmljYXRpb24gcm91dGluZSB0byBkZXRlcm1pbmUKKwkgKiBhY3R1YWwgbnVtYmVyIG9mIHNsb3RzL2RpbW1zIHBlciBjaGFubmVsLCB3ZSB0aHVzIHV0aWxpemUgdGhlCisJICogcmVzb3VyY2UgYXMgc3BlY2lmaWVkIGJ5IHRoZSBjaGlwc2V0LiBUaHVzLCB3ZSBtaWdodCBoYXZlCisJICogaGF2ZSBtb3JlIERJTU1zIHBlciBjaGFubmVsIHRoYW4gYWN0dWFsbHkgb24gdGhlIG1vYm8sIGJ1dCB0aGlzCisJICogYWxsb3dzIHRoZSBkcml2ZXIgdG8gc3VwcG9ydCB1cHRvIHRoZSBjaGlwc2V0IG1heCwgd2l0aG91dAorCSAqIHNvbWUgZmFuY3kgbW9ibyBkZXRlcm1pbmF0aW9uLgorCSAqLworCWk1NDAwX2dldF9kaW1tX2FuZF9jaGFubmVsX2NvdW50cyhwZGV2LCAmbnVtX2RpbW1zX3Blcl9jaGFubmVsLAorCQkJCQkmbnVtX2NoYW5uZWxzKTsKKwludW1fY3Nyb3dzID0gbnVtX2RpbW1zX3Blcl9jaGFubmVsICogMjsKKworCWRlYnVnZjAoIk1DOiAlcygpOiBOdW1iZXIgb2YgLSBDaGFubmVscz0gJWQgIERJTU1TPSAlZCAgQ1NST1dTPSAlZFxuIiwKKwkJX19mdW5jX18sIG51bV9jaGFubmVscywgbnVtX2RpbW1zX3Blcl9jaGFubmVsLCBudW1fY3Nyb3dzKTsKKworCS8qIGFsbG9jYXRlIGEgbmV3IE1DIGNvbnRyb2wgc3RydWN0dXJlICovCisJbWNpID0gZWRhY19tY19hbGxvYyhzaXplb2YoKnB2dCksIG51bV9jc3Jvd3MsIG51bV9jaGFubmVscywgMCk7CisKKwlpZiAobWNpID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJZGVidWdmMCgiTUM6ICIgX19GSUxFX18gIjogJXMoKTogbWNpID0gJXBcbiIsIF9fZnVuY19fLCBtY2kpOworCisJbWNpLT5kZXYgPSAmcGRldi0+ZGV2OwkvKiByZWNvcmQgcHRyICB0byB0aGUgZ2VuZXJpYyBkZXZpY2UgKi8KKworCXB2dCA9IG1jaS0+cHZ0X2luZm87CisJcHZ0LT5zeXN0ZW1fYWRkcmVzcyA9IHBkZXY7CS8qIFJlY29yZCB0aGlzIGRldmljZSBpbiBvdXIgcHJpdmF0ZSAqLworCXB2dC0+bWF4Y2ggPSBudW1fY2hhbm5lbHM7CisJcHZ0LT5tYXhkaW1tcGVyY2ggPSBudW1fZGltbXNfcGVyX2NoYW5uZWw7CisKKwkvKiAnZ2V0JyB0aGUgcGNpIGRldmljZXMgd2Ugd2FudCB0byByZXNlcnZlIGZvciBvdXIgdXNlICovCisJaWYgKGk1NDAwX2dldF9kZXZpY2VzKG1jaSwgZGV2X2lkeCkpCisJCWdvdG8gZmFpbDA7CisKKwkvKiBUaW1lIHRvIGdldCBzZXJpb3VzICovCisJaTU0MDBfZ2V0X21jX3JlZ3MobWNpKTsJLyogcmV0cmlldmUgdGhlIGhhcmR3YXJlIHJlZ2lzdGVycyAqLworCisJbWNpLT5tY19pZHggPSAwOworCW1jaS0+bXR5cGVfY2FwID0gTUVNX0ZMQUdfRkJfRERSMjsKKwltY2ktPmVkYWNfY3RsX2NhcCA9IEVEQUNfRkxBR19OT05FOworCW1jaS0+ZWRhY19jYXAgPSBFREFDX0ZMQUdfTk9ORTsKKwltY2ktPm1vZF9uYW1lID0gImk1NDAwX2VkYWMuYyI7CisJbWNpLT5tb2RfdmVyID0gSTU0MDBfUkVWSVNJT047CisJbWNpLT5jdGxfbmFtZSA9IGk1NDAwX2RldnNbZGV2X2lkeF0uY3RsX25hbWU7CisJbWNpLT5kZXZfbmFtZSA9IHBjaV9uYW1lKHBkZXYpOworCW1jaS0+Y3RsX3BhZ2VfdG9fcGh5cyA9IE5VTEw7CisKKwkvKiBTZXQgdGhlIGZ1bmN0aW9uIHBvaW50ZXIgdG8gYW4gYWN0dWFsIG9wZXJhdGlvbiBmdW5jdGlvbiAqLworCW1jaS0+ZWRhY19jaGVjayA9IGk1NDAwX2NoZWNrX2Vycm9yOworCisJLyogaW5pdGlhbGl6ZSB0aGUgTUMgY29udHJvbCBzdHJ1Y3R1cmUgJ2Nzcm93cycgdGFibGUKKwkgKiB3aXRoIHRoZSBtYXBwaW5nIGFuZCBjb250cm9sIGluZm9ybWF0aW9uICovCisJaWYgKGk1NDAwX2luaXRfY3Nyb3dzKG1jaSkpIHsKKwkJZGVidWdmMCgiTUM6IFNldHRpbmcgbWNpLT5lZGFjX2NhcCB0byBFREFDX0ZMQUdfTk9ORVxuIgorCQkJIiAgICBiZWNhdXNlIGk1NDAwX2luaXRfY3Nyb3dzKCkgcmV0dXJuZWQgbm9uemVybyAiCisJCQkidmFsdWVcbiIpOworCQltY2ktPmVkYWNfY2FwID0gRURBQ19GTEFHX05PTkU7CS8qIG5vIGNzcm93cyBmb3VuZCAqLworCX0gZWxzZSB7CisJCWRlYnVnZjEoIk1DOiBFbmFibGUgZXJyb3IgcmVwb3J0aW5nIG5vd1xuIik7CisJCWk1NDAwX2VuYWJsZV9lcnJvcl9yZXBvcnRpbmcobWNpKTsKKwl9CisKKwkvKiBhZGQgdGhpcyBuZXcgTUMgY29udHJvbCBzdHJ1Y3R1cmUgdG8gRURBQydzIGxpc3Qgb2YgTUNzICovCisJaWYgKGVkYWNfbWNfYWRkX21jKG1jaSkpIHsKKwkJZGVidWdmMCgiTUM6ICIgX19GSUxFX18KKwkJCSI6ICVzKCk6IGZhaWxlZCBlZGFjX21jX2FkZF9tYygpXG4iLCBfX2Z1bmNfXyk7CisJCS8qIEZJWE1FOiBwZXJoYXBzIHNvbWUgY29kZSBzaG91bGQgZ28gaGVyZSB0aGF0IGRpc2FibGVzIGVycm9yCisJCSAqIHJlcG9ydGluZyBpZiB3ZSBqdXN0IGVuYWJsZWQgaXQKKwkJICovCisJCWdvdG8gZmFpbDE7CisJfQorCisJaTU0MDBfY2xlYXJfZXJyb3IobWNpKTsKKworCS8qIGFsbG9jYXRpbmcgZ2VuZXJpYyBQQ0kgY29udHJvbCBpbmZvICovCisJaTU0MDBfcGNpID0gZWRhY19wY2lfY3JlYXRlX2dlbmVyaWNfY3RsKCZwZGV2LT5kZXYsIEVEQUNfTU9EX1NUUik7CisJaWYgKCFpNTQwMF9wY2kpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJIiVzKCk6IFVuYWJsZSB0byBjcmVhdGUgUENJIGNvbnRyb2xcbiIsCisJCQlfX2Z1bmNfXyk7CisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCSIlcygpOiBQQ0kgZXJyb3IgcmVwb3J0IHZpYSBFREFDIG5vdCBzZXR1cFxuIiwKKwkJCV9fZnVuY19fKTsKKwl9CisKKwlyZXR1cm4gMDsKKworCS8qIEVycm9yIGV4aXQgdW53aW5kaW5nIHN0YWNrICovCitmYWlsMToKKworCWk1NDAwX3B1dF9kZXZpY2VzKG1jaSk7CisKK2ZhaWwwOgorCWVkYWNfbWNfZnJlZShtY2kpOworCXJldHVybiAtRU5PREVWOworfQorCisvKgorICoJaTU0MDBfaW5pdF9vbmUJY29uc3RydWN0b3IgZm9yIG9uZSBpbnN0YW5jZSBvZiBkZXZpY2UKKyAqCisgKiAJcmV0dXJuczoKKyAqCQluZWdhdGl2ZSBvbiBlcnJvcgorICoJCWNvdW50ICg+PSAwKQorICovCitzdGF0aWMgaW50IF9fZGV2aW5pdCBpNTQwMF9pbml0X29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKwkJCQljb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCit7CisJaW50IHJjOworCisJZGVidWdmMCgiTUM6ICIgX19GSUxFX18gIjogJXMoKVxuIiwgX19mdW5jX18pOworCisJLyogd2FrZSB1cCBkZXZpY2UgKi8KKwlyYyA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOworCWlmIChyYyA9PSAtRUlPKQorCQlyZXR1cm4gcmM7CisKKwkvKiBub3cgcHJvYmUgYW5kIGVuYWJsZSB0aGUgZGV2aWNlICovCisJcmV0dXJuIGk1NDAwX3Byb2JlMShwZGV2LCBpZC0+ZHJpdmVyX2RhdGEpOworfQorCisvKgorICoJaTU0MDBfcmVtb3ZlX29uZQlkZXN0cnVjdG9yIGZvciBvbmUgaW5zdGFuY2Ugb2YgZGV2aWNlCisgKgorICovCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgaTU0MDBfcmVtb3ZlX29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2k7CisKKwlkZWJ1Z2YwKF9fRklMRV9fICI6ICVzKClcbiIsIF9fZnVuY19fKTsKKworCWlmIChpNTQwMF9wY2kpCisJCWVkYWNfcGNpX3JlbGVhc2VfZ2VuZXJpY19jdGwoaTU0MDBfcGNpKTsKKworCW1jaSA9IGVkYWNfbWNfZGVsX21jKCZwZGV2LT5kZXYpOworCWlmICghbWNpKQorCQlyZXR1cm47CisKKwkvKiByZXRyaWV2ZSByZWZlcmVuY2VzIHRvIHJlc291cmNlcywgYW5kIGZyZWUgdGhvc2UgcmVzb3VyY2VzICovCisJaTU0MDBfcHV0X2RldmljZXMobWNpKTsKKworCWVkYWNfbWNfZnJlZShtY2kpOworfQorCisvKgorICoJcGNpX2RldmljZV9pZAl0YWJsZSBmb3Igd2hpY2ggZGV2aWNlcyB3ZSBhcmUgbG9va2luZyBmb3IKKyAqCisgKglUaGUgIkU1MDBQIiBkZXZpY2UgaXMgdGhlIGZpcnN0IGRldmljZSBzdXBwb3J0ZWQuCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCBpNTQwMF9wY2lfdGJsW10gX19kZXZpbml0ZGF0YSA9IHsKKwl7UENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0lOVEVMLCBQQ0lfREVWSUNFX0lEX0lOVEVMXzU0MDBfRVJSKX0sCisJezAsfQkJCS8qIDAgdGVybWluYXRlZCBsaXN0LiAqLworfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGk1NDAwX3BjaV90YmwpOworCisvKgorICoJaTU0MDBfZHJpdmVyCXBjaV9kcml2ZXIgc3RydWN0dXJlIGZvciB0aGlzIG1vZHVsZQorICoKKyAqLworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGk1NDAwX2RyaXZlciA9IHsKKwkubmFtZSA9ICJpNTQwMF9lZGFjIiwKKwkucHJvYmUgPSBpNTQwMF9pbml0X29uZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3AoaTU0MDBfcmVtb3ZlX29uZSksCisJLmlkX3RhYmxlID0gaTU0MDBfcGNpX3RibCwKK307CisKKy8qCisgKglpNTQwMF9pbml0CQlNb2R1bGUgZW50cnkgZnVuY3Rpb24KKyAqCQkJVHJ5IHRvIGluaXRpYWxpemUgdGhpcyBtb2R1bGUgZm9yIGl0cyBkZXZpY2VzCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IGk1NDAwX2luaXQodm9pZCkKK3sKKwlpbnQgcGNpX3JjOworCisJZGVidWdmMigiTUM6ICIgX19GSUxFX18gIjogJXMoKVxuIiwgX19mdW5jX18pOworCisJLyogRW5zdXJlIHRoYXQgdGhlIE9QU1RBVEUgaXMgc2V0IGNvcnJlY3RseSBmb3IgUE9MTCBvciBOTUkgKi8KKwlvcHN0YXRlX2luaXQoKTsKKworCXBjaV9yYyA9IHBjaV9yZWdpc3Rlcl9kcml2ZXIoJmk1NDAwX2RyaXZlcik7CisKKwlyZXR1cm4gKHBjaV9yYyA8IDApID8gcGNpX3JjIDogMDsKK30KKworLyoKKyAqCWk1NDAwX2V4aXQoKQlNb2R1bGUgZXhpdCBmdW5jdGlvbgorICoJCQlVbnJlZ2lzdGVyIHRoZSBkcml2ZXIKKyAqLworc3RhdGljIHZvaWQgX19leGl0IGk1NDAwX2V4aXQodm9pZCkKK3sKKwlkZWJ1Z2YyKCJNQzogIiBfX0ZJTEVfXyAiOiAlcygpXG4iLCBfX2Z1bmNfXyk7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZpNTQwMF9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChpNTQwMF9pbml0KTsKK21vZHVsZV9leGl0KGk1NDAwX2V4aXQpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJCZW4gV29vZGFyZCA8d29vZGFyZEByZWRoYXQuY29tPiIpOworTU9EVUxFX0FVVEhPUigiTWF1cm8gQ2FydmFsaG8gQ2hlaGFiIDxtY2hlaGFiQHJlZGhhdC5jb20+Iik7CitNT0RVTEVfQVVUSE9SKCJSZWQgSGF0IEluYy4gKGh0dHA6Ly93d3cucmVkaGF0LmNvbSkiKTsKK01PRFVMRV9ERVNDUklQVElPTigiTUMgRHJpdmVyIGZvciBJbnRlbCBJNTQwMCBtZW1vcnkgY29udHJvbGxlcnMgLSAiCisJCSAgIEk1NDAwX1JFVklTSU9OKTsKKworbW9kdWxlX3BhcmFtKGVkYWNfb3Bfc3RhdGUsIGludCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGVkYWNfb3Bfc3RhdGUsICJFREFDIEVycm9yIFJlcG9ydGluZyBzdGF0ZTogMD1Qb2xsLDE9Tk1JIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2VkYWMvaTgyODc1cF9lZGFjLmMgYi9kcml2ZXJzL2VkYWMvaTgyODc1cF9lZGFjLmMKaW5kZXggZWJiMDM3Yi4uYjJkODNiOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9lZGFjL2k4Mjg3NXBfZWRhYy5jCisrKyBiL2RyaXZlcnMvZWRhYy9pODI4NzVwX2VkYWMuYwpAQCAtMzExLDkgKzMxMSw3IEBACiAJfQogCiAJLyogY2FjaGUgaXMgaXJyZWxldmFudCBmb3IgUENJIGJ1cyByZWFkcy93cml0ZXMgKi8KLQl3aW5kb3cgPSBpb3JlbWFwX25vY2FjaGUocGNpX3Jlc291cmNlX3N0YXJ0KGRldiwgMCksCi0JCQkJIHBjaV9yZXNvdXJjZV9sZW4oZGV2LCAwKSk7Ci0KKwl3aW5kb3cgPSBwY2lfaW9yZW1hcF9iYXIoZGV2LCAwKTsKIAlpZiAod2luZG93ID09IE5VTEwpIHsKIAkJaTgyODc1cF9wcmludGsoS0VSTl9FUlIsICIlcygpOiBGYWlsZWQgdG8gaW9yZW1hcCBiYXI2XG4iLAogCQkJX19mdW5jX18pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9lZGFjL21wYzg1eHhfZWRhYy5jIGIvZHJpdmVycy9lZGFjL21wYzg1eHhfZWRhYy5jCmluZGV4IDBjZmNiMmQuLjg1M2VmMzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZWRhYy9tcGM4NXh4X2VkYWMuYworKysgYi9kcml2ZXJzL2VkYWMvbXBjODV4eF9lZGFjLmMKQEAgLTYzMCwyNyArNjMwLDIyIEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG1wYzg1eHhfbDJfZXJyX29mX21hdGNoW10gPSB7Ci0JewotCSAuY29tcGF0aWJsZSA9ICJmc2wsODU0MC1sMi1jYWNoZS1jb250cm9sbGVyIiwKLQkgfSwKLQl7Ci0JIC5jb21wYXRpYmxlID0gImZzbCw4NTQxLWwyLWNhY2hlLWNvbnRyb2xsZXIiLAotCSB9LAotCXsKLQkgLmNvbXBhdGlibGUgPSAiZnNsLDg1NDQtbDItY2FjaGUtY29udHJvbGxlciIsCi0JIH0sCi0JewotCSAuY29tcGF0aWJsZSA9ICJmc2wsODU0OC1sMi1jYWNoZS1jb250cm9sbGVyIiwKLQkgfSwKLQl7Ci0JIC5jb21wYXRpYmxlID0gImZzbCw4NTU1LWwyLWNhY2hlLWNvbnRyb2xsZXIiLAotCSB9LAotCXsKLQkgLmNvbXBhdGlibGUgPSAiZnNsLDg1NjgtbDItY2FjaGUtY29udHJvbGxlciIsCi0JIH0sCi0JewotCSAuY29tcGF0aWJsZSA9ICJmc2wsbXBjODU3Mi1sMi1jYWNoZS1jb250cm9sbGVyIiwKLQkgfSwKKy8qIGRlcHJlY2F0ZSB0aGUgZnNsLDg1Li4gZm9ybXMgaW4gdGhlIGZ1dHVyZSwgMi42LjMwPyAqLworCXsgLmNvbXBhdGlibGUgPSAiZnNsLDg1NDAtbDItY2FjaGUtY29udHJvbGxlciIsIH0sCisJeyAuY29tcGF0aWJsZSA9ICJmc2wsODU0MS1sMi1jYWNoZS1jb250cm9sbGVyIiwgfSwKKwl7IC5jb21wYXRpYmxlID0gImZzbCw4NTQ0LWwyLWNhY2hlLWNvbnRyb2xsZXIiLCB9LAorCXsgLmNvbXBhdGlibGUgPSAiZnNsLDg1NDgtbDItY2FjaGUtY29udHJvbGxlciIsIH0sCisJeyAuY29tcGF0aWJsZSA9ICJmc2wsODU1NS1sMi1jYWNoZS1jb250cm9sbGVyIiwgfSwKKwl7IC5jb21wYXRpYmxlID0gImZzbCw4NTY4LWwyLWNhY2hlLWNvbnRyb2xsZXIiLCB9LAorCXsgLmNvbXBhdGlibGUgPSAiZnNsLG1wYzg1MzYtbDItY2FjaGUtY29udHJvbGxlciIsIH0sCisJeyAuY29tcGF0aWJsZSA9ICJmc2wsbXBjODU0MC1sMi1jYWNoZS1jb250cm9sbGVyIiwgfSwKKwl7IC5jb21wYXRpYmxlID0gImZzbCxtcGM4NTQxLWwyLWNhY2hlLWNvbnRyb2xsZXIiLCB9LAorCXsgLmNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NDQtbDItY2FjaGUtY29udHJvbGxlciIsIH0sCisJeyAuY29tcGF0aWJsZSA9ICJmc2wsbXBjODU0OC1sMi1jYWNoZS1jb250cm9sbGVyIiwgfSwKKwl7IC5jb21wYXRpYmxlID0gImZzbCxtcGM4NTU1LWwyLWNhY2hlLWNvbnRyb2xsZXIiLCB9LAorCXsgLmNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NjAtbDItY2FjaGUtY29udHJvbGxlciIsIH0sCisJeyAuY29tcGF0aWJsZSA9ICJmc2wsbXBjODU2OC1sMi1jYWNoZS1jb250cm9sbGVyIiwgfSwKKwl7IC5jb21wYXRpYmxlID0gImZzbCxtcGM4NTcyLWwyLWNhY2hlLWNvbnRyb2xsZXIiLCB9LAogCXt9LAogfTsKIApAQCAtOTY3LDI3ICs5NjIsMjIgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgbXBjODV4eF9tY19lcnJfb2ZfbWF0Y2hbXSA9IHsKLQl7Ci0JIC5jb21wYXRpYmxlID0gImZzbCw4NTQwLW1lbW9yeS1jb250cm9sbGVyIiwKLQkgfSwKLQl7Ci0JIC5jb21wYXRpYmxlID0gImZzbCw4NTQxLW1lbW9yeS1jb250cm9sbGVyIiwKLQkgfSwKLQl7Ci0JIC5jb21wYXRpYmxlID0gImZzbCw4NTQ0LW1lbW9yeS1jb250cm9sbGVyIiwKLQkgfSwKLQl7Ci0JIC5jb21wYXRpYmxlID0gImZzbCw4NTQ4LW1lbW9yeS1jb250cm9sbGVyIiwKLQkgfSwKLQl7Ci0JIC5jb21wYXRpYmxlID0gImZzbCw4NTU1LW1lbW9yeS1jb250cm9sbGVyIiwKLQkgfSwKLQl7Ci0JIC5jb21wYXRpYmxlID0gImZzbCw4NTY4LW1lbW9yeS1jb250cm9sbGVyIiwKLQkgfSwKLQl7Ci0JIC5jb21wYXRpYmxlID0gImZzbCxtcGM4NTcyLW1lbW9yeS1jb250cm9sbGVyIiwKLQkgfSwKKy8qIGRlcHJlY2F0ZSB0aGUgZnNsLDg1Li4gZm9ybXMgaW4gdGhlIGZ1dHVyZSwgMi42LjMwPyAqLworCXsgLmNvbXBhdGlibGUgPSAiZnNsLDg1NDAtbWVtb3J5LWNvbnRyb2xsZXIiLCB9LAorCXsgLmNvbXBhdGlibGUgPSAiZnNsLDg1NDEtbWVtb3J5LWNvbnRyb2xsZXIiLCB9LAorCXsgLmNvbXBhdGlibGUgPSAiZnNsLDg1NDQtbWVtb3J5LWNvbnRyb2xsZXIiLCB9LAorCXsgLmNvbXBhdGlibGUgPSAiZnNsLDg1NDgtbWVtb3J5LWNvbnRyb2xsZXIiLCB9LAorCXsgLmNvbXBhdGlibGUgPSAiZnNsLDg1NTUtbWVtb3J5LWNvbnRyb2xsZXIiLCB9LAorCXsgLmNvbXBhdGlibGUgPSAiZnNsLDg1NjgtbWVtb3J5LWNvbnRyb2xsZXIiLCB9LAorCXsgLmNvbXBhdGlibGUgPSAiZnNsLG1wYzg1MzYtbWVtb3J5LWNvbnRyb2xsZXIiLCB9LAorCXsgLmNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NDAtbWVtb3J5LWNvbnRyb2xsZXIiLCB9LAorCXsgLmNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NDEtbWVtb3J5LWNvbnRyb2xsZXIiLCB9LAorCXsgLmNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NDQtbWVtb3J5LWNvbnRyb2xsZXIiLCB9LAorCXsgLmNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NDgtbWVtb3J5LWNvbnRyb2xsZXIiLCB9LAorCXsgLmNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NTUtbWVtb3J5LWNvbnRyb2xsZXIiLCB9LAorCXsgLmNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NjAtbWVtb3J5LWNvbnRyb2xsZXIiLCB9LAorCXsgLmNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NjgtbWVtb3J5LWNvbnRyb2xsZXIiLCB9LAorCXsgLmNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NzItbWVtb3J5LWNvbnRyb2xsZXIiLCB9LAogCXt9LAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9maXJld2lyZS9mdy1jYXJkLmMgYi9kcml2ZXJzL2ZpcmV3aXJlL2Z3LWNhcmQuYwppbmRleCA0MThjMThmLi43OTlmOTQ0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2ZpcmV3aXJlL2Z3LWNhcmQuYworKysgYi9kcml2ZXJzL2ZpcmV3aXJlL2Z3LWNhcmQuYwpAQCAtNzUsNyArNzUsNyBAQAogCSAqIGNvbnRyb2xsZXIsIGJsb2NrIHJlYWRzIHRvIHRoZSBjb25maWcgcm9tIGFjY2Vzc2VzIHRoZSBob3N0CiAJICogbWVtb3J5LCBidXQgcXVhZGxldCByZWFkIGFjY2VzcyB0aGUgaGFyZHdhcmUgYnVzIGluZm8gYmxvY2sKIAkgKiByZWdpc3RlcnMuICBUaGF0J3MganVzdCBjcmFjaywgYnV0IGl0IG1lYW5zIHdlIHNob3VsZCBtYWtlCi0JICogc3VyZSB0aGUgY29udGVudHMgb2YgYnVzIGluZm8gYmxvY2sgaW4gaG9zdCBtZW1vcnkgbWF0aGNlcworCSAqIHN1cmUgdGhlIGNvbnRlbnRzIG9mIGJ1cyBpbmZvIGJsb2NrIGluIGhvc3QgbWVtb3J5IG1hdGNoZXMKIAkgKiB0aGUgdmVyc2lvbiBzdG9yZWQgaW4gdGhlIE9IQ0kgcmVnaXN0ZXJzLgogCSAqLwogCkBAIC0xODksNiArMTg5LDE3IEBACiAJNjMsIDUsIDcsIDgsIDEwLCAxMywgMTYsIDE4LCAyMSwgMjQsIDI2LCAyOSwgMzIsIDM1LCAzNywgNDAKIH07CiAKK3ZvaWQKK2Z3X3NjaGVkdWxlX2JtX3dvcmsoc3RydWN0IGZ3X2NhcmQgKmNhcmQsIHVuc2lnbmVkIGxvbmcgZGVsYXkpCit7CisJaW50IHNjaGVkdWxlZDsKKworCWZ3X2NhcmRfZ2V0KGNhcmQpOworCXNjaGVkdWxlZCA9IHNjaGVkdWxlX2RlbGF5ZWRfd29yaygmY2FyZC0+d29yaywgZGVsYXkpOworCWlmICghc2NoZWR1bGVkKQorCQlmd19jYXJkX3B1dChjYXJkKTsKK30KKwogc3RhdGljIHZvaWQKIGZ3X2NhcmRfYm1fd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CkBAIC0yMDYsNyArMjE3LDcgQEAKIAogCWlmIChsb2NhbF9ub2RlID09IE5VTEwpIHsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwotCQlyZXR1cm47CisJCWdvdG8gb3V0X3B1dF9jYXJkOwogCX0KIAlmd19ub2RlX2dldChsb2NhbF9ub2RlKTsKIAlmd19ub2RlX2dldChyb290X25vZGUpOwpAQCAtMjgwLDcgKzI5MSw3IEBACiAJCSAqIHRoaXMgdGFzayAxMDBtcyBmcm9tIG5vdy4KIAkJICovCiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKLQkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZjYXJkLT53b3JrLCBESVZfUk9VTkRfVVAoSFosIDEwKSk7CisJCWZ3X3NjaGVkdWxlX2JtX3dvcmsoY2FyZCwgRElWX1JPVU5EX1VQKEhaLCAxMCkpOwogCQlnb3RvIG91dDsKIAl9CiAKQEAgLTM1NSw2ICszNjYsOCBAQAogCQlmd19kZXZpY2VfcHV0KHJvb3RfZGV2aWNlKTsKIAlmd19ub2RlX3B1dChyb290X25vZGUpOwogCWZ3X25vZGVfcHV0KGxvY2FsX25vZGUpOworIG91dF9wdXRfY2FyZDoKKwlmd19jYXJkX3B1dChjYXJkKTsKIH0KIAogc3RhdGljIHZvaWQKQEAgLTUxMCw3ICs1MjMsNiBAQAogCWZ3X2NhcmRfcHV0KGNhcmQpOwogCXdhaXRfZm9yX2NvbXBsZXRpb24oJmNhcmQtPmRvbmUpOwogCi0JY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZjYXJkLT53b3JrKTsKIAlXQVJOX09OKCFsaXN0X2VtcHR5KCZjYXJkLT50cmFuc2FjdGlvbl9saXN0KSk7CiAJZGVsX3RpbWVyX3N5bmMoJmNhcmQtPmZsdXNoX3RpbWVyKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlyZXdpcmUvZnctZGV2aWNlLmMgYi9kcml2ZXJzL2ZpcmV3aXJlL2Z3LWRldmljZS5jCmluZGV4IDZiOWJlNDIuLmMxNzNiZTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZmlyZXdpcmUvZnctZGV2aWNlLmMKKysrIGIvZHJpdmVycy9maXJld2lyZS9mdy1kZXZpY2UuYwpAQCAtNjE3LDcgKzYxNyw3IEBACiAgKi8KIERFQ0xBUkVfUldTRU0oZndfZGV2aWNlX3J3c2VtKTsKIAotc3RhdGljIERFRklORV9JRFIoZndfZGV2aWNlX2lkcik7CitERUZJTkVfSURSKGZ3X2RldmljZV9pZHIpOwogaW50IGZ3X2NkZXZfbWFqb3I7CiAKIHN0cnVjdCBmd19kZXZpY2UgKmZ3X2RldmljZV9nZXRfYnlfZGV2dChkZXZfdCBkZXZ0KQpAQCAtNjg5LDcgKzY4OSw3IEBACiAJCQlmd19ub3RpZnkoImdpdmluZyB1cCBvbiBjb25maWcgcm9tIGZvciBub2RlIGlkICV4XG4iLAogCQkJCSAgZGV2aWNlLT5ub2RlX2lkKTsKIAkJCWlmIChkZXZpY2UtPm5vZGUgPT0gZGV2aWNlLT5jYXJkLT5yb290X25vZGUpCi0JCQkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZkZXZpY2UtPmNhcmQtPndvcmssIDApOworCQkJCWZ3X3NjaGVkdWxlX2JtX3dvcmsoZGV2aWNlLT5jYXJkLCAwKTsKIAkJCWZ3X2RldmljZV9yZWxlYXNlKCZkZXZpY2UtPmRldmljZSk7CiAJCX0KIAkJcmV0dXJuOwpAQCAtNzU4LDcgKzc1OCw3IEBACiAJICogcHJldHR5IGhhcm1sZXNzLgogCSAqLwogCWlmIChkZXZpY2UtPm5vZGUgPT0gZGV2aWNlLT5jYXJkLT5yb290X25vZGUpCi0JCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmZGV2aWNlLT5jYXJkLT53b3JrLCAwKTsKKwkJZndfc2NoZWR1bGVfYm1fd29yayhkZXZpY2UtPmNhcmQsIDApOwogCiAJcmV0dXJuOwogCkBAIC04OTIsNyArODkyLDcgQEAKIAlmd19kZXZpY2Vfc2h1dGRvd24od29yayk7CiAgb3V0OgogCWlmIChub2RlX2lkID09IGNhcmQtPnJvb3Rfbm9kZS0+bm9kZV9pZCkKLQkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZjYXJkLT53b3JrLCAwKTsKKwkJZndfc2NoZWR1bGVfYm1fd29yayhjYXJkLCAwKTsKIH0KIAogdm9pZCBmd19ub2RlX2V2ZW50KHN0cnVjdCBmd19jYXJkICpjYXJkLCBzdHJ1Y3QgZndfbm9kZSAqbm9kZSwgaW50IGV2ZW50KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9maXJld2lyZS9mdy1kZXZpY2UuaCBiL2RyaXZlcnMvZmlyZXdpcmUvZnctZGV2aWNlLmgKaW5kZXggNDIzMDViYi4uZGY1MTczMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9maXJld2lyZS9mdy1kZXZpY2UuaAorKysgYi9kcml2ZXJzL2ZpcmV3aXJlL2Z3LWRldmljZS5oCkBAIC0yMSw2ICsyMSw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L2NkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9pZHIuaD4KICNpbmNsdWRlIDxsaW51eC9yd3NlbS5oPgogI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KIApAQCAtOTksNiArMTAwLDcgQEAKIHZvaWQgZndfZGV2aWNlX2NkZXZfcmVtb3ZlKHN0cnVjdCBmd19kZXZpY2UgKmRldmljZSk7CiAKIGV4dGVybiBzdHJ1Y3Qgcndfc2VtYXBob3JlIGZ3X2RldmljZV9yd3NlbTsKK2V4dGVybiBzdHJ1Y3QgaWRyIGZ3X2RldmljZV9pZHI7CiBleHRlcm4gaW50IGZ3X2NkZXZfbWFqb3I7CiAKIC8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL2ZpcmV3aXJlL2Z3LXNicDIuYyBiL2RyaXZlcnMvZmlyZXdpcmUvZnctc2JwMi5jCmluZGV4IGU1NDQwM2UuLmU4OGQ1MDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZmlyZXdpcmUvZnctc2JwMi5jCisrKyBiL2RyaXZlcnMvZmlyZXdpcmUvZnctc2JwMi5jCkBAIC02NzAsMTcgKzY3MCw2IEBACiAJCQkmZCwgc2l6ZW9mKGQpLCBjb21wbGV0ZV9hZ2VudF9yZXNldF93cml0ZV9ub193YWl0LCB0KTsKIH0KIAotc3RhdGljIHZvaWQgc2JwMl9zZXRfZ2VuZXJhdGlvbihzdHJ1Y3Qgc2JwMl9sb2dpY2FsX3VuaXQgKmx1LCBpbnQgZ2VuZXJhdGlvbikKLXsKLQlzdHJ1Y3QgZndfY2FyZCAqY2FyZCA9IGZ3X2RldmljZShsdS0+dGd0LT51bml0LT5kZXZpY2UucGFyZW50KS0+Y2FyZDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JLyogc2VyaWFsaXplIHdpdGggY29tcGFyaXNvbnMgb2YgbHUtPmdlbmVyYXRpb24gYW5kIGNhcmQtPmdlbmVyYXRpb24gKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwotCWx1LT5nZW5lcmF0aW9uID0gZ2VuZXJhdGlvbjsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgdm9pZCBzYnAyX2FsbG93X2Jsb2NrKHN0cnVjdCBzYnAyX2xvZ2ljYWxfdW5pdCAqbHUpCiB7CiAJLyoKQEAgLTg4NCw3ICs4NzMsNyBAQAogCQlnb3RvIG91dDsKIAogCWdlbmVyYXRpb24gICAgPSBkZXZpY2UtPmdlbmVyYXRpb247Ci0Jc21wX3JtYigpOyAgICAvKiBub2RlX2lkIG11c3Qgbm90IGJlIG9sZGVyIHRoYW4gZ2VuZXJhdGlvbiAqLworCXNtcF9ybWIoKTsgICAgLyogbm9kZSBJRHMgbXVzdCBub3QgYmUgb2xkZXIgdGhhbiBnZW5lcmF0aW9uICovCiAJbm9kZV9pZCAgICAgICA9IGRldmljZS0+bm9kZV9pZDsKIAlsb2NhbF9ub2RlX2lkID0gZGV2aWNlLT5jYXJkLT5ub2RlX2lkOwogCkBAIC05MDgsNyArODk3LDggQEAKIAogCXRndC0+bm9kZV9pZAkgID0gbm9kZV9pZDsKIAl0Z3QtPmFkZHJlc3NfaGlnaCA9IGxvY2FsX25vZGVfaWQgPDwgMTY7Ci0Jc2JwMl9zZXRfZ2VuZXJhdGlvbihsdSwgZ2VuZXJhdGlvbik7CisJc21wX3dtYigpOwkgIC8qIG5vZGUgSURzIG11c3Qgbm90IGJlIG9sZGVyIHRoYW4gZ2VuZXJhdGlvbiAqLworCWx1LT5nZW5lcmF0aW9uCSAgPSBnZW5lcmF0aW9uOwogCiAJbHUtPmNvbW1hbmRfYmxvY2tfYWdlbnRfYWRkcmVzcyA9CiAJCSgodTY0KShiZTMyX3RvX2NwdShyZXNwb25zZS5jb21tYW5kX2Jsb2NrX2FnZW50LmhpZ2gpICYgMHhmZmZmKQpAQCAtMTIwMSw3ICsxMTkxLDcgQEAKIAkJZ290byBvdXQ7CiAKIAlnZW5lcmF0aW9uICAgID0gZGV2aWNlLT5nZW5lcmF0aW9uOwotCXNtcF9ybWIoKTsgICAgLyogbm9kZV9pZCBtdXN0IG5vdCBiZSBvbGRlciB0aGFuIGdlbmVyYXRpb24gKi8KKwlzbXBfcm1iKCk7ICAgIC8qIG5vZGUgSURzIG11c3Qgbm90IGJlIG9sZGVyIHRoYW4gZ2VuZXJhdGlvbiAqLwogCW5vZGVfaWQgICAgICAgPSBkZXZpY2UtPm5vZGVfaWQ7CiAJbG9jYWxfbm9kZV9pZCA9IGRldmljZS0+Y2FyZC0+bm9kZV9pZDsKIApAQCAtMTIyOCw3ICsxMjE4LDggQEAKIAogCXRndC0+bm9kZV9pZCAgICAgID0gbm9kZV9pZDsKIAl0Z3QtPmFkZHJlc3NfaGlnaCA9IGxvY2FsX25vZGVfaWQgPDwgMTY7Ci0Jc2JwMl9zZXRfZ2VuZXJhdGlvbihsdSwgZ2VuZXJhdGlvbik7CisJc21wX3dtYigpOwkgIC8qIG5vZGUgSURzIG11c3Qgbm90IGJlIG9sZGVyIHRoYW4gZ2VuZXJhdGlvbiAqLworCWx1LT5nZW5lcmF0aW9uCSAgPSBnZW5lcmF0aW9uOwogCiAJZndfbm90aWZ5KCIlczogcmVjb25uZWN0ZWQgdG8gTFVOICUwNHggKCVkIHJldHJpZXMpXG4iLAogCQkgIHRndC0+YnVzX2lkLCBsdS0+bHVuLCBsdS0+cmV0cmllcyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2ZpcmV3aXJlL2Z3LXRvcG9sb2d5LmMgYi9kcml2ZXJzL2ZpcmV3aXJlL2Z3LXRvcG9sb2d5LmMKaW5kZXggNWUyMDQ3MS4uYzliZTZlNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9maXJld2lyZS9mdy10b3BvbG9neS5jCisrKyBiL2RyaXZlcnMvZmlyZXdpcmUvZnctdG9wb2xvZ3kuYwpAQCAtMzU1LDYgKzM1NSw5IEBACiB7CiAJZndfbm9kZV9ldmVudChjYXJkLCBub2RlLCBGV19OT0RFX0RFU1RST1lFRCk7CiAJZndfbm9kZV9wdXQobm9kZSk7CisKKwkvKiBUb3BvbG9neSBoYXMgY2hhbmdlZCAtIHJlc2V0IGJ1cyBtYW5hZ2VyIHJldHJ5IGNvdW50ZXIgKi8KKwljYXJkLT5ibV9yZXRyaWVzID0gMDsKIH0KIAogc3RhdGljIHZvaWQKQEAgLTM3NCw2ICszNzcsOSBAQAogCX0KIAogCWZ3X25vZGVfZXZlbnQoY2FyZCwgbm9kZSwgRldfTk9ERV9DUkVBVEVEKTsKKworCS8qIFRvcG9sb2d5IGhhcyBjaGFuZ2VkIC0gcmVzZXQgYnVzIG1hbmFnZXIgcmV0cnkgY291bnRlciAqLworCWNhcmQtPmJtX3JldHJpZXMgPSAwOwogfQogCiB2b2lkIGZ3X2Rlc3Ryb3lfbm9kZXMoc3RydWN0IGZ3X2NhcmQgKmNhcmQpCkBAIC01MTQsMTQgKzUyMCw2IEBACiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwogCi0JLyoKLQkgKiBJZiB0aGUgbmV3IHRvcG9sb2d5IGhhcyBhIGRpZmZlcmVudCBzZWxmX2lkX2NvdW50IHRoZSB0b3BvbG9neQotCSAqIGNoYW5nZWQsIGVpdGhlciBub2RlcyB3ZXJlIGFkZGVkIG9yIHJlbW92ZWQuIEluIHRoYXQgY2FzZSB3ZQotCSAqIHJlc2V0IHRoZSBJUk0gcmVzZXQgY291bnRlci4KLQkgKi8KLQlpZiAoY2FyZC0+c2VsZl9pZF9jb3VudCAhPSBzZWxmX2lkX2NvdW50KQotCQljYXJkLT5ibV9yZXRyaWVzID0gMDsKLQogCWNhcmQtPm5vZGVfaWQgPSBub2RlX2lkOwogCS8qCiAJICogVXBkYXRlIG5vZGVfaWQgYmVmb3JlIGdlbmVyYXRpb24gdG8gcHJldmVudCBhbnlib2R5IGZyb20gdXNpbmcKQEAgLTUzMCw3ICs1MjgsNyBAQAogCXNtcF93bWIoKTsKIAljYXJkLT5nZW5lcmF0aW9uID0gZ2VuZXJhdGlvbjsKIAljYXJkLT5yZXNldF9qaWZmaWVzID0gamlmZmllczsKLQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmNhcmQtPndvcmssIDApOworCWZ3X3NjaGVkdWxlX2JtX3dvcmsoY2FyZCwgMCk7CiAKIAlsb2NhbF9ub2RlID0gYnVpbGRfdHJlZShjYXJkLCBzZWxmX2lkcywgc2VsZl9pZF9jb3VudCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlyZXdpcmUvZnctdHJhbnNhY3Rpb24uYyBiL2RyaXZlcnMvZmlyZXdpcmUvZnctdHJhbnNhY3Rpb24uYwppbmRleCAyODg0Zjg3Li42OTlhYzA0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2ZpcmV3aXJlL2Z3LXRyYW5zYWN0aW9uLmMKKysrIGIvZHJpdmVycy9maXJld2lyZS9mdy10cmFuc2FjdGlvbi5jCkBAIC0xOSw2ICsxOSw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9pZHIuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9rcmVmLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CkBAIC05NzEsNiArOTcyLDcgQEAKIHsKIAl1bnJlZ2lzdGVyX2NocmRldihmd19jZGV2X21ham9yLCAiZmlyZXdpcmUiKTsKIAlidXNfdW5yZWdpc3RlcigmZndfYnVzX3R5cGUpOworCWlkcl9kZXN0cm95KCZmd19kZXZpY2VfaWRyKTsKIH0KIAogbW9kdWxlX2luaXQoZndfY29yZV9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlyZXdpcmUvZnctdHJhbnNhY3Rpb24uaCBiL2RyaXZlcnMvZmlyZXdpcmUvZnctdHJhbnNhY3Rpb24uaAppbmRleCA4Mzk0NjZmMC4uYzlhYjEyYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9maXJld2lyZS9mdy10cmFuc2FjdGlvbi5oCisrKyBiL2RyaXZlcnMvZmlyZXdpcmUvZnctdHJhbnNhY3Rpb24uaApAQCAtMjM3LDE0ICsyMzcsNiBAQAogCWludCBsaW5rX3NwZWVkOwogCWludCBjb25maWdfcm9tX2dlbmVyYXRpb247CiAKLQkvKgotCSAqIFdlIG5lZWQgdG8gc3RvcmUgdXAgdG8gNCBzZWxmIElEIGZvciBhIG1heGltdW0gb2YgNjMKLQkgKiBkZXZpY2VzIHBsdXMgMyB3b3JkcyBmb3IgdGhlIHRvcG9sb2d5IG1hcCBoZWFkZXIuCi0JICovCi0JaW50IHNlbGZfaWRfY291bnQ7Ci0JdTMyIHRvcG9sb2d5X21hcFsyNTIgKyAzXTsKLQl1MzIgYnJvYWRjYXN0X2NoYW5uZWw7Ci0KIAlzcGlubG9ja190IGxvY2s7IC8qIFRha2UgdGhpcyBsb2NrIHdoZW4gaGFuZGxpbmcgdGhlIGxpc3RzIGluCiAJCQkgICogdGhpcyBzdHJ1Y3QuICovCiAJc3RydWN0IGZ3X25vZGUgKmxvY2FsX25vZGU7CkBAIC0yNjIsNiArMjU0LDkgQEAKIAlzdHJ1Y3QgZGVsYXllZF93b3JrIHdvcms7CiAJaW50IGJtX3JldHJpZXM7CiAJaW50IGJtX2dlbmVyYXRpb247CisKKwl1MzIgYnJvYWRjYXN0X2NoYW5uZWw7CisJdTMyIHRvcG9sb2d5X21hcFsoQ1NSX1RPUE9MT0dZX01BUF9FTkQgLSBDU1JfVE9QT0xPR1lfTUFQKSAvIDRdOwogfTsKIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgZndfY2FyZCAqZndfY2FyZF9nZXQoc3RydWN0IGZ3X2NhcmQgKmNhcmQpCkBAIC0yNzgsNiArMjczLDggQEAKIAlrcmVmX3B1dCgmY2FyZC0+a3JlZiwgZndfY2FyZF9yZWxlYXNlKTsKIH0KIAorZXh0ZXJuIHZvaWQgZndfc2NoZWR1bGVfYm1fd29yayhzdHJ1Y3QgZndfY2FyZCAqY2FyZCwgdW5zaWduZWQgbG9uZyBkZWxheSk7CisKIC8qCiAgKiBUaGUgaXNvIHBhY2tldCBmb3JtYXQgYWxsb3dzIGZvciBhbiBpbW1lZGlhdGUgaGVhZGVyL3BheWxvYWQgcGFydAogICogc3RvcmVkIGluICdoZWFkZXInIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBwYWNrZXQgaW5mbyBwbHVzIGFuCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Zpcm13YXJlL2RjZGJhcy5jIGIvZHJpdmVycy9maXJtd2FyZS9kY2RiYXMuYwppbmRleCA1MGEwNzFmLi43NzdmYmE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Zpcm13YXJlL2RjZGJhcy5jCisrKyBiL2RyaXZlcnMvZmlybXdhcmUvZGNkYmFzLmMKQEAgLTIzOCwxMSArMjM4LDExIEBACiB9CiAKIC8qKgotICogc21pX3JlcXVlc3Q6IGdlbmVyYXRlIFNNSSByZXF1ZXN0CisgKiBkY2RiYXNfc21pX3JlcXVlc3Q6IGdlbmVyYXRlIFNNSSByZXF1ZXN0CiAgKgogICogQ2FsbGVkIHdpdGggc21pX2RhdGFfbG9jay4KICAqLwotc3RhdGljIGludCBzbWlfcmVxdWVzdChzdHJ1Y3Qgc21pX2NtZCAqc21pX2NtZCkKK2ludCBkY2RiYXNfc21pX3JlcXVlc3Qoc3RydWN0IHNtaV9jbWQgKnNtaV9jbWQpCiB7CiAJY3B1bWFza190IG9sZF9tYXNrOwogCWludCByZXQgPSAwOwpAQCAtMzA5LDE0ICszMDksMTQgQEAKIAlzd2l0Y2ggKHZhbCkgewogCWNhc2UgMjoKIAkJLyogUmF3IFNNSSAqLwotCQlyZXQgPSBzbWlfcmVxdWVzdChzbWlfY21kKTsKKwkJcmV0ID0gZGNkYmFzX3NtaV9yZXF1ZXN0KHNtaV9jbWQpOwogCQlpZiAoIXJldCkKIAkJCXJldCA9IGNvdW50OwogCQlicmVhazsKIAljYXNlIDE6CiAJCS8qIENhbGxpbmcgSW50ZXJmYWNlIFNNSSAqLwogCQlzbWlfY21kLT5lYnggPSAodTMyKSB2aXJ0X3RvX3BoeXMoc21pX2NtZC0+Y29tbWFuZF9idWZmZXIpOwotCQlyZXQgPSBzbWlfcmVxdWVzdChzbWlfY21kKTsKKwkJcmV0ID0gZGNkYmFzX3NtaV9yZXF1ZXN0KHNtaV9jbWQpOwogCQlpZiAoIXJldCkKIAkJCXJldCA9IGNvdW50OwogCQlicmVhazsKQEAgLTMzMyw2ICszMzMsNyBAQAogCW11dGV4X3VubG9jaygmc21pX2RhdGFfbG9jayk7CiAJcmV0dXJuIHJldDsKIH0KK0VYUE9SVF9TWU1CT0woZGNkYmFzX3NtaV9yZXF1ZXN0KTsKIAogLyoqCiAgKiBob3N0X2NvbnRyb2xfc21pOiBnZW5lcmF0ZSBob3N0IGNvbnRyb2wgU01JCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Zpcm13YXJlL2RjZGJhcy5oIGIvZHJpdmVycy9maXJtd2FyZS9kY2RiYXMuaAppbmRleCA4N2JjMzQxLi5jYTNjYjBhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Zpcm13YXJlL2RjZGJhcy5oCisrKyBiL2RyaXZlcnMvZmlybXdhcmUvZGNkYmFzLmgKQEAgLTEwMSw1ICsxMDEsNyBAQAogCX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIHBhcmFtZXRlcnM7CiB9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKIAoraW50IGRjZGJhc19zbWlfcmVxdWVzdChzdHJ1Y3Qgc21pX2NtZCAqc21pX2NtZCk7CisKICNlbmRpZiAvKiBfRENEQkFTX0hfICovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlybXdhcmUvZG1pLWlkLmMgYi9kcml2ZXJzL2Zpcm13YXJlL2RtaS1pZC5jCmluZGV4IGU4ODBkNmMuLjVhNzZkMDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZmlybXdhcmUvZG1pLWlkLmMKKysrIGIvZHJpdmVycy9maXJtd2FyZS9kbWktaWQuYwpAQCAtMjIzLDcgKzIyMyw3IEBACiAJfQogCiAJZG1pX2Rldi0+Y2xhc3MgPSAmZG1pX2NsYXNzOwotCXN0cmNweShkbWlfZGV2LT5idXNfaWQsICJpZCIpOworCWRldl9zZXRfbmFtZShkbWlfZGV2LCAiaWQiKTsKIAlkbWlfZGV2LT5ncm91cHMgPSBzeXNfZG1pX2F0dHJpYnV0ZV9ncm91cHM7CiAKIAlyZXQgPSBkZXZpY2VfcmVnaXN0ZXIoZG1pX2Rldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Zpcm13YXJlL2RtaV9zY2FuLmMgYi9kcml2ZXJzL2Zpcm13YXJlL2RtaV9zY2FuLmMKaW5kZXggNzhiOTg5ZC4uZDc2YWRmZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9maXJtd2FyZS9kbWlfc2Nhbi5jCisrKyBiL2RyaXZlcnMvZmlybXdhcmUvZG1pX3NjYW4uYwpAQCAtNDY4LDggKzQ2OCw4IEBACiBFWFBPUlRfU1lNQk9MKGRtaV9nZXRfc3lzdGVtX2luZm8pOwogCiAvKioKLSAqCWRtaV9uYW1lX2luX3NlcmlhbCAtIAlDaGVjayBpZiBzdHJpbmcgaXMgaW4gdGhlIERNSSBwcm9kdWN0IHNlcmlhbAotICoJCQkJaW5mb3JtYXRpb24uCisgKiBkbWlfbmFtZV9pbl9zZXJpYWwgLSBDaGVjayBpZiBzdHJpbmcgaXMgaW4gdGhlIERNSSBwcm9kdWN0IHNlcmlhbCBpbmZvcm1hdGlvbgorICogQHN0cjogc3RyaW5nIHRvIGNoZWNrIGZvcgogICovCiBpbnQgZG1pX25hbWVfaW5fc2VyaWFsKGNvbnN0IGNoYXIgKnN0cikKIHsKQEAgLTU4NSw2ICs1ODUsOCBAQAogCiAvKioKICAqIGRtaV9tYXRjaCAtIGNvbXBhcmUgYSBzdHJpbmcgdG8gdGhlIGRtaSBmaWVsZCAoaWYgZXhpc3RzKQorICogQGY6IERNSSBmaWVsZCBpZGVudGlmaWVyCisgKiBAc3RyOiBzdHJpbmcgdG8gY29tcGFyZSB0aGUgRE1JIGZpZWxkIHRvCiAgKgogICogUmV0dXJucyB0cnVlIGlmIHRoZSByZXF1ZXN0ZWQgZmllbGQgZXF1YWxzIHRvIHRoZSBzdHIgKGluY2x1ZGluZyBOVUxMKS4KICAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9maXJtd2FyZS9tZW1tYXAuYyBiL2RyaXZlcnMvZmlybXdhcmUvbWVtbWFwLmMKaW5kZXggM2JmOGVlMS4uMjYxYjlhYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9maXJtd2FyZS9tZW1tYXAuYworKysgYi9kcml2ZXJzL2Zpcm13YXJlL21lbW1hcC5jCkBAIC01Niw5ICs1Niw5IEBACiAJc3NpemVfdCAoKnNob3cpKHN0cnVjdCBmaXJtd2FyZV9tYXBfZW50cnkgKmVudHJ5LCBjaGFyICpidWYpOwogfTsKIAotc3RydWN0IG1lbW1hcF9hdHRyaWJ1dGUgbWVtbWFwX3N0YXJ0X2F0dHIgPSBfX0FUVFJfUk8oc3RhcnQpOwotc3RydWN0IG1lbW1hcF9hdHRyaWJ1dGUgbWVtbWFwX2VuZF9hdHRyICAgPSBfX0FUVFJfUk8oZW5kKTsKLXN0cnVjdCBtZW1tYXBfYXR0cmlidXRlIG1lbW1hcF90eXBlX2F0dHIgID0gX19BVFRSX1JPKHR5cGUpOworc3RhdGljIHN0cnVjdCBtZW1tYXBfYXR0cmlidXRlIG1lbW1hcF9zdGFydF9hdHRyID0gX19BVFRSX1JPKHN0YXJ0KTsKK3N0YXRpYyBzdHJ1Y3QgbWVtbWFwX2F0dHJpYnV0ZSBtZW1tYXBfZW5kX2F0dHIgICA9IF9fQVRUUl9STyhlbmQpOworc3RhdGljIHN0cnVjdCBtZW1tYXBfYXR0cmlidXRlIG1lbW1hcF90eXBlX2F0dHIgID0gX19BVFRSX1JPKHR5cGUpOwogCiAvKgogICogVGhlc2UgYXJlIGRlZmF1bHQgYXR0cmlidXRlcyB0aGF0IGFyZSBhZGRlZCBmb3IgZXZlcnkgbWVtbWFwIGVudHJ5LgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL0tjb25maWcgYi9kcml2ZXJzL2dwaW8vS2NvbmZpZwppbmRleCA0OGY0OWQ5Li4zZDI1NjU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwaW8vS2NvbmZpZworKysgYi9kcml2ZXJzL2dwaW8vS2NvbmZpZwpAQCAtOTUsNyArOTUsNyBAQAogCSAgbnVtYmVyIGZvciB0aGVzZSBHUElPcy4KIAogY29uZmlnIEdQSU9fUENBOTUzWAotCXRyaXN0YXRlICJQQ0E5NTN4LCBQQ0E5NTV4LCBhbmQgTUFYNzMxMCBJL08gcG9ydHMiCisJdHJpc3RhdGUgIlBDQTk1M3gsIFBDQTk1NXgsIFRDQTY0eHgsIGFuZCBNQVg3MzEwIEkvTyBwb3J0cyIKIAlkZXBlbmRzIG9uIEkyQwogCWhlbHAKIAkgIFNheSB5ZXMgaGVyZSB0byBwcm92aWRlIGFjY2VzcyB0byBzZXZlcmFsIHJlZ2lzdGVyLW9yaWVudGVkCkBAIC0xMDQsOSArMTA0LDEwIEBACiAKIAkgIDQgYml0czoJcGNhOTUzNiwgcGNhOTUzNwogCi0JICA4IGJpdHM6CW1heDczMTAsIHBjYTk1MzQsIHBjYTk1MzgsIHBjYTk1NTQsIHBjYTk1NTcKKwkgIDggYml0czoJbWF4NzMxMCwgcGNhOTUzNCwgcGNhOTUzOCwgcGNhOTU1NCwgcGNhOTU1NywKKwkgIAkJdGNhNjQwOAogCi0JICAxNiBiaXRzOglwY2E5NTM1LCBwY2E5NTM5LCBwY2E5NTU1CisJICAxNiBiaXRzOglwY2E5NTM1LCBwY2E5NTM5LCBwY2E5NTU1LCB0Y2E2NDE2CiAKIAkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKIAkgIHdpbGwgYmUgY2FsbGVkIHBjYTk1M3guCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwaW8vZ3Bpb2xpYi5jIGIvZHJpdmVycy9ncGlvL2dwaW9saWIuYwppbmRleCA4MjAyMGFiLi4zNWU3YWVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwaW8vZ3Bpb2xpYi5jCisrKyBiL2RyaXZlcnMvZ3Bpby9ncGlvbGliLmMKQEAgLTEyMTMsNyArMTIxMyw3IEBACiAJCWlmIChkZXYpCiAJCQlzZXFfcHJpbnRmKHMsICIsICVzLyVzIiwKIAkJCQlkZXYtPmJ1cyA/IGRldi0+YnVzLT5uYW1lIDogIm5vLWJ1cyIsCi0JCQkJZGV2LT5idXNfaWQpOworCQkJCWRldl9uYW1lKGRldikpOwogCQlpZiAoY2hpcC0+bGFiZWwpCiAJCQlzZXFfcHJpbnRmKHMsICIsICVzIiwgY2hpcC0+bGFiZWwpOwogCQlpZiAoY2hpcC0+Y2FuX3NsZWVwKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL3BjYTk1M3guYyBiL2RyaXZlcnMvZ3Bpby9wY2E5NTN4LmMKaW5kZXggOWNlZWI4OS4uMzdmMzUzOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncGlvL3BjYTk1M3guYworKysgYi9kcml2ZXJzL2dwaW8vcGNhOTUzeC5jCkBAIC0zMyw3ICszMywxMiBAQAogCXsgInBjYTk1NTQiLCA4LCB9LAogCXsgInBjYTk1NTUiLCAxNiwgfSwKIAl7ICJwY2E5NTU3IiwgOCwgfSwKKwogCXsgIm1heDczMTAiLCA4LCB9LAorCXsgInBjYTYxMDciLCA4LCB9LAorCXsgInRjYTY0MDgiLCA4LCB9LAorCXsgInRjYTY0MTYiLCAxNiwgfSwKKwkvKiBOWUVUOiAgeyAidGNhNjQyNCIsIDI0LCB9LCAqLwogCXsgfQogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBwY2E5NTN4X2lkKTsKQEAgLTQ3LDkgKzUyLDYgQEAKIAlzdHJ1Y3QgZ3Bpb19jaGlwIGdwaW9fY2hpcDsKIH07CiAKLS8qIE5PVEU6ICB3ZSBjYW4ndCBjdXJyZW50bHkgcmVseSBvbiBmYXVsdCBjb2RlcyB0byBjb21lIGZyb20gU01CdXMKLSAqIGNhbGxzLCBzbyB3ZSBtYXAgYWxsIGVycm9ycyB0byBFSU8gaGVyZSBhbmQgcmV0dXJuIHplcm8gb3RoZXJ3aXNlLgotICovCiBzdGF0aWMgaW50IHBjYTk1M3hfd3JpdGVfcmVnKHN0cnVjdCBwY2E5NTN4X2NoaXAgKmNoaXAsIGludCByZWcsIHVpbnQxNl90IHZhbCkKIHsKIAlpbnQgcmV0OwpAQCAtNjEsNyArNjMsNyBAQAogCiAJaWYgKHJldCA8IDApIHsKIAkJZGV2X2VycigmY2hpcC0+Y2xpZW50LT5kZXYsICJmYWlsZWQgd3JpdGluZyByZWdpc3RlclxuIik7Ci0JCXJldHVybiAtRUlPOworCQlyZXR1cm4gcmV0OwogCX0KIAogCXJldHVybiAwOwpAQCAtNzgsNyArODAsNyBAQAogCiAJaWYgKHJldCA8IDApIHsKIAkJZGV2X2VycigmY2hpcC0+Y2xpZW50LT5kZXYsICJmYWlsZWQgcmVhZGluZyByZWdpc3RlclxuIik7Ci0JCXJldHVybiAtRUlPOworCQlyZXR1cm4gcmV0OwogCX0KIAogCSp2YWwgPSAodWludDE2X3QpcmV0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL3R3bDQwMzAtZ3Bpby5jIGIvZHJpdmVycy9ncGlvL3R3bDQwMzAtZ3Bpby5jCmluZGV4IDM3ZDNlZWMuLmFmYWQxNDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3Bpby90d2w0MDMwLWdwaW8uYworKysgYi9kcml2ZXJzL2dwaW8vdHdsNDAzMC1ncGlvLmMKQEAgLTIwMiwzNyArMjAyLDYgQEAKIAlyZXR1cm4gcmV0OwogfQogCi0vKgotICogQ29uZmlndXJlIGRlYm91bmNlIHRpbWluZyB2YWx1ZSBmb3IgYSBHUElPIHBpbiBvbiBUV0w0MDMwCi0gKi8KLWludCB0d2w0MDMwX3NldF9ncGlvX2RlYm91bmNlKGludCBncGlvLCBpbnQgZW5hYmxlKQotewotCXU4IGRfYm5rID0gZ3BpbyA+PiAzOwotCXU4IGRfbXNrID0gQklUKGdwaW8gJiAweDcpOwotCXU4IHJlZyA9IDA7Ci0JdTggYmFzZSA9IDA7Ci0JaW50IHJldCA9IDA7Ci0KLQlpZiAodW5saWtlbHkoKGdwaW8gPj0gVFdMNDAzMF9HUElPX01BWCkKLQkJfHwgIShncGlvX3VzYWdlX2NvdW50ICYgQklUKGdwaW8pKSkpCi0JCXJldHVybiAtRVBFUk07Ci0KLQliYXNlID0gUkVHX0dQSU9fREVCRU4xICsgZF9ibms7Ci0JbXV0ZXhfbG9jaygmZ3Bpb19sb2NrKTsKLQlyZXQgPSBncGlvX3R3bDQwMzBfcmVhZChiYXNlKTsKLQlpZiAocmV0ID49IDApIHsKLQkJaWYgKGVuYWJsZSkKLQkJCXJlZyA9IHJldCB8IGRfbXNrOwotCQllbHNlCi0JCQlyZWcgPSByZXQgJiB+ZF9tc2s7Ci0KLQkJcmV0ID0gZ3Bpb190d2w0MDMwX3dyaXRlKGJhc2UsIHJlZyk7Ci0JfQotCW11dGV4X3VubG9jaygmZ3Bpb19sb2NrKTsKLQlyZXR1cm4gcmV0OwotfQotRVhQT1JUX1NZTUJPTCh0d2w0MDMwX3NldF9ncGlvX2RlYm91bmNlKTsKLQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAogc3RhdGljIGludCB0d2xfcmVxdWVzdChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQpCkBAIC00MDUsNiArMzc0LDIzIEBACiAJCQkJUkVHX0dQSU9QVVBEQ1RSMSwgNSk7CiB9CiAKK3N0YXRpYyBpbnQgX19kZXZpbml0IGdwaW9fdHdsNDAzMF9kZWJvdW5jZSh1MzIgZGVib3VuY2UsIHU4IG1tY19jZCkKK3sKKwl1OAkJbWVzc2FnZVs0XTsKKworCS8qIDMwIG1zZWMgb2YgZGVib3VuY2luZyBpcyBhbHdheXMgdXNlZCBmb3IgTU1DIGNhcmQgZGV0ZWN0LAorCSAqIGFuZCBpcyBvcHRpb25hbCBmb3IgZXZlcnl0aGluZyBlbHNlLgorCSAqLworCW1lc3NhZ2VbMV0gPSAoZGVib3VuY2UgJiAweGZmKSB8IChtbWNfY2QgJiAweDAzKTsKKwlkZWJvdW5jZSA+Pj0gODsKKwltZXNzYWdlWzJdID0gKGRlYm91bmNlICYgMHhmZik7CisJZGVib3VuY2UgPj49IDg7CisJbWVzc2FnZVszXSA9IChkZWJvdW5jZSAmIDB4MDMpOworCisJcmV0dXJuIHR3bDQwMzBfaTJjX3dyaXRlKFRXTDQwMzBfTU9EVUxFX0dQSU8sIG1lc3NhZ2UsCisJCQkJUkVHX0dQSU9fREVCRU4xLCAzKTsKK30KKwogc3RhdGljIGludCBncGlvX3R3bDQwMzBfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpOwogCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBncGlvX3R3bDQwMzBfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKQEAgLTQzOSw2ICs0MjUsMTIgQEAKIAkJCQlwZGF0YS0+cHVsbHVwcywgcGRhdGEtPnB1bGxkb3ducywKIAkJCQlyZXQpOwogCisJcmV0ID0gZ3Bpb190d2w0MDMwX2RlYm91bmNlKHBkYXRhLT5kZWJvdW5jZSwgcGRhdGEtPm1tY19jZCk7CisJaWYgKHJldCkKKwkJZGV2X2RiZygmcGRldi0+ZGV2LCAiZGVib3VuY2UgJS4wM3ggJS4wMXggLS0+ICVkXG4iLAorCQkJCXBkYXRhLT5kZWJvdW5jZSwgcGRhdGEtPm1tY19jZCwKKwkJCQlyZXQpOworCiAJdHdsX2dwaW9jaGlwLmJhc2UgPSBwZGF0YS0+Z3Bpb19iYXNlOwogCXR3bF9ncGlvY2hpcC5uZ3BpbyA9IFRXTDQwMzBfR1BJT19NQVg7CiAJdHdsX2dwaW9jaGlwLmRldiA9ICZwZGV2LT5kZXY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZHJtX2NydGMuYyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fY3J0Yy5jCmluZGV4IDUzYzg3MjUuLjViMmNiYjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fY3J0Yy5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fY3J0Yy5jCkBAIC0yMTAsNyArMjEwLDcgQEAKIAlpbnQgcmV0OwogCiAJV0FSTighbXV0ZXhfaXNfbG9ja2VkKCZkZXYtPm1vZGVfY29uZmlnLm11dGV4KSwKLQkgICAgICIlcyBjYWxsZWQgdy9vIG1vZGVfY29uZmlnIGxvY2tcbiIsIF9fRlVOQ1RJT05fXyk7CisJICAgICAiJXMgY2FsbGVkIHcvbyBtb2RlX2NvbmZpZyBsb2NrXG4iLCBfX2Z1bmNfXyk7CiBhZ2FpbjoKIAlpZiAoaWRyX3ByZV9nZXQoJmRldi0+bW9kZV9jb25maWcuY3J0Y19pZHIsIEdGUF9LRVJORUwpID09IDApIHsKIAkJRFJNX0VSUk9SKCJSYW4gb3V0IG1lbW9yeSBnZXR0aW5nIGEgbW9kZSBudW1iZXJcbiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2RybV9kcnYuYyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fZHJ2LmMKaW5kZXggZmViYjUxNy4uNWZmODhkOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2RybV9kcnYuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2Rydi5jCkBAIC0zMTQsMTQgKzMxNCwxNCBAQAogCQlEUk1fREVCVUcoIm10cnJfZGVsPSVkXG4iLCByZXR2YWwpOwogCX0KIAorCWlmIChkZXYtPmRyaXZlci0+dW5sb2FkKQorCQlkZXYtPmRyaXZlci0+dW5sb2FkKGRldik7CisKIAlpZiAoZHJtX2NvcmVfaGFzX0FHUChkZXYpICYmIGRldi0+YWdwKSB7CiAJCWRybV9mcmVlKGRldi0+YWdwLCBzaXplb2YoKmRldi0+YWdwKSwgRFJNX01FTV9BR1BMSVNUUyk7CiAJCWRldi0+YWdwID0gTlVMTDsKIAl9CiAKLQlpZiAoZGV2LT5kcml2ZXItPnVubG9hZCkKLQkJZGV2LT5kcml2ZXItPnVubG9hZChkZXYpOwotCiAJZHJtX2h0X3JlbW92ZSgmZGV2LT5tYXBfaGFzaCk7CiAJZHJtX2N0eGJpdG1hcF9jbGVhbnVwKGRldik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fZm9wcy5jIGIvZHJpdmVycy9ncHUvZHJtL2RybV9mb3BzLmMKaW5kZXggMzczM2UzNi4uYjA2YTUzNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2RybV9mb3BzLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2RybV9mb3BzLmMKQEAgLTE4Myw2ICsxODMsMTAgQEAKIAogCW9sZF9mb3BzID0gZmlscC0+Zl9vcDsKIAlmaWxwLT5mX29wID0gZm9wc19nZXQoJmRldi0+ZHJpdmVyLT5mb3BzKTsKKwlpZiAoZmlscC0+Zl9vcCA9PSBOVUxMKSB7CisJCWZpbHAtPmZfb3AgPSBvbGRfZm9wczsKKwkJZ290byBvdXQ7CisJfQogCWlmIChmaWxwLT5mX29wLT5vcGVuICYmIChlcnIgPSBmaWxwLT5mX29wLT5vcGVuKGlub2RlLCBmaWxwKSkpIHsKIAkJZm9wc19wdXQoZmlscC0+Zl9vcCk7CiAJCWZpbHAtPmZfb3AgPSBmb3BzX2dldChvbGRfZm9wcyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZHJtX3N5c2ZzLmMgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX3N5c2ZzLmMKaW5kZXggNjVkNzJkMC4uNWFhNjc4MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2RybV9zeXNmcy5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fc3lzZnMuYwpAQCAtNDg4LDcgKzQ4OCw3IEBACiAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICBtaW5vcl9zdHIgPSAiY2FyZCVkIjsKIAotCXNucHJpbnRmKG1pbm9yLT5rZGV2LmJ1c19pZCwgQlVTX0lEX1NJWkUsIG1pbm9yX3N0ciwgbWlub3ItPmluZGV4KTsKKwlkZXZfc2V0X25hbWUoJm1pbm9yLT5rZGV2LCBtaW5vcl9zdHIsIG1pbm9yLT5pbmRleCk7CiAKIAllcnIgPSBkZXZpY2VfcmVnaXN0ZXIoJm1pbm9yLT5rZGV2KTsKIAlpZiAoZXJyKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9NYWtlZmlsZSBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L01ha2VmaWxlCmluZGV4IGRkNTdhNWIuLjc5M2NiYTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L01ha2VmaWxlCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L01ha2VmaWxlCkBAIC0xMyw2ICsxMyw3IEBACiAJICBpbnRlbF9jcnQubyBcCiAJICBpbnRlbF9sdmRzLm8gXAogCSAgaW50ZWxfYmlvcy5vIFwKKwkgIGludGVsX2hkbWkubyBcCiAJICBpbnRlbF9zZHZvLm8gXAogCSAgaW50ZWxfbW9kZXMubyBcCiAJICBpbnRlbF9pMmMubyBcCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2RtYS5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kbWEuYwppbmRleCAzZDcwODJhLi42MmE0YmY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2RtYS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZG1hLmMKQEAgLTgyNyw2ICs4MjcsNyBAQAogCXN0cnVjdCBwY2lfZGV2ICpicmlkZ2VfZGV2OwogCXUxNiB0bXAgPSAwOwogCXVuc2lnbmVkIGxvbmcgb3ZlcmhlYWQ7CisJdW5zaWduZWQgbG9uZyBzdG9sZW47CiAKIAlicmlkZ2VfZGV2ID0gcGNpX2dldF9idXNfYW5kX3Nsb3QoMCwgUENJX0RFVkZOKDAsMCkpOwogCWlmICghYnJpZGdlX2RldikgewpAQCAtODY2LDM2ICs4NjcsNTUgQEAKIAllbHNlCiAJCW92ZXJoZWFkID0gKCphcGVydHVyZV9zaXplIC8gMTAyNCkgKyA0MDk2OwogCi0Jc3dpdGNoICh0bXAgJiBJTlRFTF84NTVfR01DSF9HTVNfTUFTSykgewotCWNhc2UgSU5URUxfODU1X0dNQ0hfR01TX1NUT0xFTl8xTToKLQkJYnJlYWs7IC8qIDFNIGFscmVhZHkgKi8KLQljYXNlIElOVEVMXzg1NV9HTUNIX0dNU19TVE9MRU5fNE06Ci0JCSpwcmVhbGxvY2F0ZWRfc2l6ZSAqPSA0OwotCQlicmVhazsKLQljYXNlIElOVEVMXzg1NV9HTUNIX0dNU19TVE9MRU5fOE06Ci0JCSpwcmVhbGxvY2F0ZWRfc2l6ZSAqPSA4OwotCQlicmVhazsKLQljYXNlIElOVEVMXzg1NV9HTUNIX0dNU19TVE9MRU5fMTZNOgotCQkqcHJlYWxsb2NhdGVkX3NpemUgKj0gMTY7Ci0JCWJyZWFrOwotCWNhc2UgSU5URUxfODU1X0dNQ0hfR01TX1NUT0xFTl8zMk06Ci0JCSpwcmVhbGxvY2F0ZWRfc2l6ZSAqPSAzMjsKLQkJYnJlYWs7Ci0JY2FzZSBJTlRFTF85MTVHX0dNQ0hfR01TX1NUT0xFTl80OE06Ci0JCSpwcmVhbGxvY2F0ZWRfc2l6ZSAqPSA0ODsKLQkJYnJlYWs7Ci0JY2FzZSBJTlRFTF85MTVHX0dNQ0hfR01TX1NUT0xFTl82NE06Ci0JCSpwcmVhbGxvY2F0ZWRfc2l6ZSAqPSA2NDsKLQkJYnJlYWs7CisJc3dpdGNoICh0bXAgJiBJTlRFTF9HTUNIX0dNU19NQVNLKSB7CiAJY2FzZSBJTlRFTF84NTVfR01DSF9HTVNfRElTQUJMRUQ6CiAJCURSTV9FUlJPUigidmlkZW8gbWVtb3J5IGlzIGRpc2FibGVkXG4iKTsKIAkJcmV0dXJuIC0xOworCWNhc2UgSU5URUxfODU1X0dNQ0hfR01TX1NUT0xFTl8xTToKKwkJc3RvbGVuID0gMSAqIDEwMjQgKiAxMDI0OworCQlicmVhazsKKwljYXNlIElOVEVMXzg1NV9HTUNIX0dNU19TVE9MRU5fNE06CisJCXN0b2xlbiA9IDQgKiAxMDI0ICogMTAyNDsKKwkJYnJlYWs7CisJY2FzZSBJTlRFTF84NTVfR01DSF9HTVNfU1RPTEVOXzhNOgorCQlzdG9sZW4gPSA4ICogMTAyNCAqIDEwMjQ7CisJCWJyZWFrOworCWNhc2UgSU5URUxfODU1X0dNQ0hfR01TX1NUT0xFTl8xNk06CisJCXN0b2xlbiA9IDE2ICogMTAyNCAqIDEwMjQ7CisJCWJyZWFrOworCWNhc2UgSU5URUxfODU1X0dNQ0hfR01TX1NUT0xFTl8zMk06CisJCXN0b2xlbiA9IDMyICogMTAyNCAqIDEwMjQ7CisJCWJyZWFrOworCWNhc2UgSU5URUxfOTE1R19HTUNIX0dNU19TVE9MRU5fNDhNOgorCQlzdG9sZW4gPSA0OCAqIDEwMjQgKiAxMDI0OworCQlicmVhazsKKwljYXNlIElOVEVMXzkxNUdfR01DSF9HTVNfU1RPTEVOXzY0TToKKwkJc3RvbGVuID0gNjQgKiAxMDI0ICogMTAyNDsKKwkJYnJlYWs7CisJY2FzZSBJTlRFTF9HTUNIX0dNU19TVE9MRU5fMTI4TToKKwkJc3RvbGVuID0gMTI4ICogMTAyNCAqIDEwMjQ7CisJCWJyZWFrOworCWNhc2UgSU5URUxfR01DSF9HTVNfU1RPTEVOXzI1Nk06CisJCXN0b2xlbiA9IDI1NiAqIDEwMjQgKiAxMDI0OworCQlicmVhazsKKwljYXNlIElOVEVMX0dNQ0hfR01TX1NUT0xFTl85Nk06CisJCXN0b2xlbiA9IDk2ICogMTAyNCAqIDEwMjQ7CisJCWJyZWFrOworCWNhc2UgSU5URUxfR01DSF9HTVNfU1RPTEVOXzE2ME06CisJCXN0b2xlbiA9IDE2MCAqIDEwMjQgKiAxMDI0OworCQlicmVhazsKKwljYXNlIElOVEVMX0dNQ0hfR01TX1NUT0xFTl8yMjRNOgorCQlzdG9sZW4gPSAyMjQgKiAxMDI0ICogMTAyNDsKKwkJYnJlYWs7CisJY2FzZSBJTlRFTF9HTUNIX0dNU19TVE9MRU5fMzUyTToKKwkJc3RvbGVuID0gMzUyICogMTAyNCAqIDEwMjQ7CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCURSTV9FUlJPUigidW5leHBlY3RlZCBHTUNIX0dNUyB2YWx1ZTogMHglMDJ4XG4iLAotCQkJdG1wICYgSU5URUxfODU1X0dNQ0hfR01TX01BU0spOworCQkJdG1wICYgSU5URUxfR01DSF9HTVNfTUFTSyk7CiAJCXJldHVybiAtMTsKIAl9Ci0JKnByZWFsbG9jYXRlZF9zaXplIC09IG92ZXJoZWFkOworCSpwcmVhbGxvY2F0ZWRfc2l6ZSA9IHN0b2xlbiAtIG92ZXJoZWFkOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2Rydi5oIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kcnYuaAppbmRleCA0NzU2ZTVjLi41NjNkZTE4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2Rydi5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZHJ2LmgKQEAgLTY2NCw2ICs2NjQsNyBAQAogCQkJCSB3cml0ZWwodXBwZXJfMzJfYml0cyh2YWwpLCBkZXZfcHJpdi0+cmVncyArIFwKIAkJCQkJKHJlZykgKyA0KSkKICNlbmRpZgorI2RlZmluZSBQT1NUSU5HX1JFQUQocmVnKQkodm9pZClJOTE1X1JFQUQocmVnKQogCiAjZGVmaW5lIEk5MTVfVkVSQk9TRSAwCiAKQEAgLTc2MCw2ICs3NjEsNyBAQAogCQkJSVNfSTk0NUdNKGRldikgfHwgSVNfSTk2NUdNKGRldikgfHwgSVNfR000NShkZXYpKQogCiAjZGVmaW5lIEk5MTVfTkVFRF9HRlhfSFdTKGRldikgKElTX0czMyhkZXYpIHx8IElTX0dNNDUoZGV2KSB8fCBJU19HNFgoZGV2KSkKKyNkZWZpbmUgU1VQUE9SVFNfSU5URUdSQVRFRF9IRE1JKGRldikJKElTX0c0WChkZXYpKQogCiAjZGVmaW5lIFBSSU1BUllfUklOR0JVRkZFUl9TSVpFICAgICAgICAgKDEyOCoxMDI0KQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbS5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW0uYwppbmRleCBjYzJjYTU1Li4xMzg0ZDY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtLmMKQEAgLTE0NDUsNyArMTQ0NSw3IEBACiAKIAlpZiAoKG9ial9wcml2LT5ndHRfb2Zmc2V0ICYgfkk5MTVfRkVOQ0VfU1RBUlRfTUFTSykgfHwKIAkgICAgKG9ial9wcml2LT5ndHRfb2Zmc2V0ICYgKG9iai0+c2l6ZSAtIDEpKSkgewotCQlXQVJOKDEsICIlczogb2JqZWN0IG5vdCAxTSBvciBzaXplIGFsaWduZWRcbiIsIF9fRlVOQ1RJT05fXyk7CisJCVdBUk4oMSwgIiVzOiBvYmplY3Qgbm90IDFNIG9yIHNpemUgYWxpZ25lZFxuIiwgX19mdW5jX18pOwogCQlyZXR1cm47CiAJfQogCkBAIC0xNDc4LDcgKzE0NzgsNyBAQAogCiAJaWYgKChvYmpfcHJpdi0+Z3R0X29mZnNldCAmIH5JOTE1X0ZFTkNFX1NUQVJUX01BU0spIHx8CiAJICAgIChvYmpfcHJpdi0+Z3R0X29mZnNldCAmIChvYmotPnNpemUgLSAxKSkpIHsKLQkJV0FSTigxLCAiJXM6IG9iamVjdCBub3QgMU0gb3Igc2l6ZSBhbGlnbmVkXG4iLCBfX0ZVTkNUSU9OX18pOworCQlXQVJOKDEsICIlczogb2JqZWN0IG5vdCAxTSBvciBzaXplIGFsaWduZWRcbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMTYyMyw2ICsxNjIzLDggQEAKIAlzdHJ1Y3QgZHJtX21tX25vZGUgKmZyZWVfc3BhY2U7CiAJaW50IHBhZ2VfY291bnQsIHJldDsKIAorCWlmIChkZXZfcHJpdi0+bW0uc3VzcGVuZGVkKQorCQlyZXR1cm4gLUVCVVNZOwogCWlmIChhbGlnbm1lbnQgPT0gMCkKIAkJYWxpZ25tZW50ID0gUEFHRV9TSVpFOwogCWlmIChhbGlnbm1lbnQgJiAoUEFHRV9TSVpFIC0gMSkpIHsKQEAgLTI2NDEsNyArMjY0Myw3IEBACiAJaWYgKG9ial9wcml2LT5ndHRfc3BhY2UgPT0gTlVMTCkgewogCQlyZXQgPSBpOTE1X2dlbV9vYmplY3RfYmluZF90b19ndHQob2JqLCBhbGlnbm1lbnQpOwogCQlpZiAocmV0ICE9IDApIHsKLQkJCWlmIChyZXQgIT0gLUVSRVNUQVJUU1lTKQorCQkJaWYgKHJldCAhPSAtRUJVU1kgJiYgcmV0ICE9IC1FUkVTVEFSVFNZUykKIAkJCQlEUk1fRVJST1IoIkZhaWx1cmUgdG8gYmluZDogJWQiLCByZXQpOwogCQkJcmV0dXJuIHJldDsKIAkJfQpAQCAtMzIxOSwyMCArMzIyMSwyMSBAQAogCQlkZXZfcHJpdi0+bW0ud2VkZ2VkID0gMDsKIAl9CiAKLQlyZXQgPSBpOTE1X2dlbV9pbml0X3JpbmdidWZmZXIoZGV2KTsKLQlpZiAocmV0ICE9IDApCi0JCXJldHVybiByZXQ7Ci0KIAlkZXZfcHJpdi0+bW0uZ3R0X21hcHBpbmcgPSBpb19tYXBwaW5nX2NyZWF0ZV93YyhkZXYtPmFncC0+YmFzZSwKIAkJCQkJCQlkZXYtPmFncC0+YWdwX2luZm8uYXBlcl9zaXplCiAJCQkJCQkJKiAxMDI0ICogMTAyNCk7CiAKIAltdXRleF9sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CisJZGV2X3ByaXYtPm1tLnN1c3BlbmRlZCA9IDA7CisKKwlyZXQgPSBpOTE1X2dlbV9pbml0X3JpbmdidWZmZXIoZGV2KTsKKwlpZiAocmV0ICE9IDApCisJCXJldHVybiByZXQ7CisKIAlCVUdfT04oIWxpc3RfZW1wdHkoJmRldl9wcml2LT5tbS5hY3RpdmVfbGlzdCkpOwogCUJVR19PTighbGlzdF9lbXB0eSgmZGV2X3ByaXYtPm1tLmZsdXNoaW5nX2xpc3QpKTsKIAlCVUdfT04oIWxpc3RfZW1wdHkoJmRldl9wcml2LT5tbS5pbmFjdGl2ZV9saXN0KSk7CiAJQlVHX09OKCFsaXN0X2VtcHR5KCZkZXZfcHJpdi0+bW0ucmVxdWVzdF9saXN0KSk7Ci0JZGV2X3ByaXYtPm1tLnN1c3BlbmRlZCA9IDA7CiAJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CiAKIAlkcm1faXJxX2luc3RhbGwoZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfcmVnLmggYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X3JlZy5oCmluZGV4IDQ3ZTZiYWYuLjI3MzE2MjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfcmVnLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9yZWcuaApAQCAtMzUsNyArMzUsNyBAQAogI2RlZmluZSBJTlRFTF9HTUNIX01FTV82NE0JMHgxCiAjZGVmaW5lIElOVEVMX0dNQ0hfTUVNXzEyOE0JMAogCi0jZGVmaW5lIElOVEVMXzg1NV9HTUNIX0dNU19NQVNLCQkoMHg3IDw8IDQpCisjZGVmaW5lIElOVEVMX0dNQ0hfR01TX01BU0sJCSgweGYgPDwgNCkKICNkZWZpbmUgSU5URUxfODU1X0dNQ0hfR01TX0RJU0FCTEVECSgweDAgPDwgNCkKICNkZWZpbmUgSU5URUxfODU1X0dNQ0hfR01TX1NUT0xFTl8xTQkoMHgxIDw8IDQpCiAjZGVmaW5lIElOVEVMXzg1NV9HTUNIX0dNU19TVE9MRU5fNE0JKDB4MiA8PCA0KQpAQCAtNDUsNiArNDUsMTIgQEAKIAogI2RlZmluZSBJTlRFTF85MTVHX0dNQ0hfR01TX1NUT0xFTl80OE0JKDB4NiA8PCA0KQogI2RlZmluZSBJTlRFTF85MTVHX0dNQ0hfR01TX1NUT0xFTl82NE0JKDB4NyA8PCA0KQorI2RlZmluZSBJTlRFTF9HTUNIX0dNU19TVE9MRU5fMTI4TQkoMHg4IDw8IDQpCisjZGVmaW5lIElOVEVMX0dNQ0hfR01TX1NUT0xFTl8yNTZNCSgweDkgPDwgNCkKKyNkZWZpbmUgSU5URUxfR01DSF9HTVNfU1RPTEVOXzk2TQkoMHhhIDw8IDQpCisjZGVmaW5lIElOVEVMX0dNQ0hfR01TX1NUT0xFTl8xNjBNCSgweGIgPDwgNCkKKyNkZWZpbmUgSU5URUxfR01DSF9HTVNfU1RPTEVOXzIyNE0JKDB4YyA8PCA0KQorI2RlZmluZSBJTlRFTF9HTUNIX0dNU19TVE9MRU5fMzUyTQkoMHhkIDw8IDQpCiAKIC8qIFBDSSBjb25maWcgc3BhY2UgKi8KIApAQCAtNTQ5LDYgKzU1NSw4IEBACiAvKiogR005NjUgR000NSByZW5kZXIgc3RhbmRieSByZWdpc3RlciAqLwogI2RlZmluZSBNQ0hCQVJfUkVOREVSX1NUQU5EQlkJMHgxMTFCOAogCisjZGVmaW5lIFBFR19CQU5EX0dBUF9EQVRBCTB4MTRkNjgKKwogLyoKICAqIE92ZXJsYXkgcmVncwogICovCkBAIC02MTIsNiArNjIwLDkgQEAKIAogLyogSG90cGx1ZyBjb250cm9sICg5NDUrIG9ubHkpICovCiAjZGVmaW5lIFBPUlRfSE9UUExVR19FTgkJMHg2MTExMAorI2RlZmluZSAgIEhETUlCX0hPVFBMVUdfSU5UX0VOCQkJKDEgPDwgMjkpCisjZGVmaW5lICAgSERNSUNfSE9UUExVR19JTlRfRU4JCQkoMSA8PCAyOCkKKyNkZWZpbmUgICBIRE1JRF9IT1RQTFVHX0lOVF9FTgkJCSgxIDw8IDI3KQogI2RlZmluZSAgIFNEVk9CX0hPVFBMVUdfSU5UX0VOCQkJKDEgPDwgMjYpCiAjZGVmaW5lICAgU0RWT0NfSE9UUExVR19JTlRfRU4JCQkoMSA8PCAyNSkKICNkZWZpbmUgICBUVl9IT1RQTFVHX0lOVF9FTgkJCSgxIDw8IDE4KQpAQCAtNjE5LDYgKzYzMCw5IEBACiAjZGVmaW5lICAgQ1JUX0hPVFBMVUdfRk9SQ0VfREVURUNUCQkoMSA8PCAzKQogCiAjZGVmaW5lIFBPUlRfSE9UUExVR19TVEFUCTB4NjExMTQKKyNkZWZpbmUgICBIRE1JQl9IT1RQTFVHX0lOVF9TVEFUVVMJCSgxIDw8IDI5KQorI2RlZmluZSAgIEhETUlDX0hPVFBMVUdfSU5UX1NUQVRVUwkJKDEgPDwgMjgpCisjZGVmaW5lICAgSERNSURfSE9UUExVR19JTlRfU1RBVFVTCQkoMSA8PCAyNykKICNkZWZpbmUgICBDUlRfSE9UUExVR19JTlRfU1RBVFVTCQkoMSA8PCAxMSkKICNkZWZpbmUgICBUVl9IT1RQTFVHX0lOVF9TVEFUVVMJCQkoMSA8PCAxMCkKICNkZWZpbmUgICBDUlRfSE9UUExVR19NT05JVE9SX01BU0sJCSgzIDw8IDgpCkBAIC02NDgsNyArNjYyLDE2IEBACiAjZGVmaW5lICAgU0RWT19QSEFTRV9TRUxFQ1RfREVGQVVMVAkoNiA8PCAxOSkKICNkZWZpbmUgICBTRFZPX0NMT0NLX09VVFBVVF9JTlZFUlQJKDEgPDwgMTgpCiAjZGVmaW5lICAgU0RWT0NfR0FOR19NT0RFCQkoMSA8PCAxNikKKyNkZWZpbmUgICBTRFZPX0VOQ09ESU5HX1NEVk8JCSgweDAgPDwgMTApCisjZGVmaW5lICAgU0RWT19FTkNPRElOR19IRE1JCQkoMHgyIDw8IDEwKQorLyoqIFJlcXVpcmQgZm9yIEhETUkgb3BlcmF0aW9uICovCisjZGVmaW5lICAgU0RWT19OVUxMX1BBQ0tFVFNfRFVSSU5HX1ZTWU5DICgxIDw8IDkpCiAjZGVmaW5lICAgU0RWT19CT1JERVJfRU5BQkxFCQkoMSA8PCA3KQorI2RlZmluZSAgIFNEVk9fQVVESU9fRU5BQkxFCQkoMSA8PCA2KQorLyoqIE5ldyB3aXRoIDk2NSwgZGVmYXVsdCBpcyB0byBiZSBzZXQgKi8KKyNkZWZpbmUgICBTRFZPX1ZTWU5DX0FDVElWRV9ISUdICSgxIDw8IDQpCisvKiogTmV3IHdpdGggOTY1LCBkZWZhdWx0IGlzIHRvIGJlIHNldCAqLworI2RlZmluZSAgIFNEVk9fSFNZTkNfQUNUSVZFX0hJR0gJKDEgPDwgMykKICNkZWZpbmUgICBTRFZPQl9QQ0lFX0NPTkNVUlJFTkNZCSgxIDw8IDMpCiAjZGVmaW5lICAgU0RWT19ERVRFQ1RFRAkJCSgxIDw8IDIpCiAvKiBCaXRzIHRvIGJlIHByZXNlcnZlZCB3aGVuIHdyaXRpbmcgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2Rpc3BsYXkuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2Rpc3BsYXkuYwppbmRleCBlNWMxYzgwLi44Y2NiOWMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9kaXNwbGF5LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZGlzcGxheS5jCkBAIC03NTEsNiArNzUxLDcgQEAKIAkJCWlzX2x2ZHMgPSB0cnVlOwogCQkJYnJlYWs7CiAJCWNhc2UgSU5URUxfT1VUUFVUX1NEVk86CisJCWNhc2UgSU5URUxfT1VUUFVUX0hETUk6CiAJCQlpc19zZHZvID0gdHJ1ZTsKIAkJCWJyZWFrOwogCQljYXNlIElOVEVMX09VVFBVVF9EVk86CkBAIC05ODYsMTkgKzk4NywxNyBAQAogCXVpbnQzMl90IGJhc2UgPSAocGlwZSA9PSAwKSA/IENVUkFCQVNFIDogQ1VSQkJBU0U7CiAJdWludDMyX3QgdGVtcDsKIAlzaXplX3QgYWRkcjsKKwlpbnQgcmV0OwogCiAJRFJNX0RFQlVHKCJcbiIpOwogCiAJLyogaWYgd2Ugd2FudCB0byB0dXJuIG9mZiB0aGUgY3Vyc29yIGlnbm9yZSB3aWR0aCBhbmQgaGVpZ2h0ICovCiAJaWYgKCFoYW5kbGUpIHsKIAkJRFJNX0RFQlVHKCJjdXJzb3Igb2ZmXG4iKTsKLQkJLyogdHVybiBvZiB0aGUgY3Vyc29yICovCi0JCXRlbXAgPSAwOwotCQl0ZW1wIHw9IENVUlNPUl9NT0RFX0RJU0FCTEU7Ci0KLQkJSTkxNV9XUklURShjb250cm9sLCB0ZW1wKTsKLQkJSTkxNV9XUklURShiYXNlLCAwKTsKLQkJcmV0dXJuIDA7CisJCXRlbXAgPSBDVVJTT1JfTU9ERV9ESVNBQkxFOworCQlhZGRyID0gMDsKKwkJYm8gPSBOVUxMOworCQlnb3RvIGZpbmlzaDsKIAl9CiAKIAkvKiBDdXJyZW50bHkgd2Ugb25seSBzdXBwb3J0IDY0eDY0IGN1cnNvcnMgKi8KQEAgLTEwMjUsMTUgKzEwMjQsMzAgQEAKIAkJYWRkciA9IG9ial9wcml2LT5ndHRfb2Zmc2V0OwogCX0KIAotCWludGVsX2NydGMtPmN1cnNvcl9hZGRyID0gYWRkcjsKKwlyZXQgPSBpOTE1X2dlbV9vYmplY3RfcGluKGJvLCBQQUdFX1NJWkUpOworCWlmIChyZXQpIHsKKwkJRFJNX0VSUk9SKCJmYWlsZWQgdG8gcGluIGN1cnNvciBib1xuIik7CisJCWRybV9nZW1fb2JqZWN0X3VucmVmZXJlbmNlKGJvKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKIAl0ZW1wID0gMDsKIAkvKiBzZXQgdGhlIHBpcGUgZm9yIHRoZSBjdXJzb3IgKi8KIAl0ZW1wIHw9IChwaXBlIDw8IDI4KTsKIAl0ZW1wIHw9IENVUlNPUl9NT0RFXzY0X0FSR0JfQVggfCBNQ1VSU09SX0dBTU1BX0VOQUJMRTsKIAorIGZpbmlzaDoKIAlJOTE1X1dSSVRFKGNvbnRyb2wsIHRlbXApOwogCUk5MTVfV1JJVEUoYmFzZSwgYWRkcik7CiAKKwlpZiAoaW50ZWxfY3J0Yy0+Y3Vyc29yX2JvKSB7CisJCWk5MTVfZ2VtX29iamVjdF91bnBpbihpbnRlbF9jcnRjLT5jdXJzb3JfYm8pOworCQlkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZShpbnRlbF9jcnRjLT5jdXJzb3JfYm8pOworCX0KKworCWludGVsX2NydGMtPmN1cnNvcl9hZGRyID0gYWRkcjsKKwlpbnRlbF9jcnRjLT5jdXJzb3JfYm8gPSBibzsKKwogCXJldHVybiAwOwogfQogCkBAIC0xNDMwLDEyICsxNDQ0LDE5IEBACiAJCWludGVsX2x2ZHNfaW5pdChkZXYpOwogCiAJaWYgKElTX0k5WFgoZGV2KSkgewotCQlpbnRlbF9zZHZvX2luaXQoZGV2LCBTRFZPQik7Ci0JCWludGVsX3Nkdm9faW5pdChkZXYsIFNEVk9DKTsKKwkJaW50IGZvdW5kOworCisJCWZvdW5kID0gaW50ZWxfc2R2b19pbml0KGRldiwgU0RWT0IpOworCQlpZiAoIWZvdW5kICYmIFNVUFBPUlRTX0lOVEVHUkFURURfSERNSShkZXYpKQorCQkJaW50ZWxfaGRtaV9pbml0KGRldiwgU0RWT0IpOworCisJCWZvdW5kID0gaW50ZWxfc2R2b19pbml0KGRldiwgU0RWT0MpOworCQlpZiAoIWZvdW5kICYmIFNVUFBPUlRTX0lOVEVHUkFURURfSERNSShkZXYpKQorCQkJaW50ZWxfaGRtaV9pbml0KGRldiwgU0RWT0MpOwogCX0gZWxzZQogCQlpbnRlbF9kdm9faW5pdChkZXYpOwogCi0JaWYgKElTX0k5WFgoZGV2KSAmJiAhSVNfSTkxNUcoZGV2KSkKKwlpZiAoSVNfSTlYWChkZXYpICYmIElTX01PQklMRShkZXYpKQogCQlpbnRlbF90dl9pbml0KGRldik7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNvbm5lY3RvciwgJmRldi0+bW9kZV9jb25maWcuY29ubmVjdG9yX2xpc3QsIGhlYWQpIHsKQEAgLTE0NDUsNiArMTQ2NiwxMSBAQAogCiAJCS8qIHZhbGlkIGNydGNzICovCiAJCXN3aXRjaChpbnRlbF9vdXRwdXQtPnR5cGUpIHsKKwkJY2FzZSBJTlRFTF9PVVRQVVRfSERNSToKKwkJCWNydGNfbWFzayA9ICgoMSA8PCAwKXwKKwkJCQkgICAgICgxIDw8IDEpKTsKKwkJCWNsb25lX21hc2sgPSAoKDEgPDwgSU5URUxfT1VUUFVUX0hETUkpKTsKKwkJCWJyZWFrOwogCQljYXNlIElOVEVMX09VVFBVVF9EVk86CiAJCWNhc2UgSU5URUxfT1VUUFVUX1NEVk86CiAJCQljcnRjX21hc2sgPSAoKDEgPDwgMCl8CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9kcnYuaCBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2Rydi5oCmluZGV4IDQwN2VkZDUuLjhhNGNjNTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2Rydi5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2Rydi5oCkBAIC01Myw2ICs1Myw3IEBACiAjZGVmaW5lIElOVEVMX09VVFBVVF9TRFZPIDMKICNkZWZpbmUgSU5URUxfT1VUUFVUX0xWRFMgNAogI2RlZmluZSBJTlRFTF9PVVRQVVRfVFZPVVQgNQorI2RlZmluZSBJTlRFTF9PVVRQVVRfSERNSSA2CiAKICNkZWZpbmUgSU5URUxfRFZPX0NISVBfTk9ORSAwCiAjZGVmaW5lIElOVEVMX0RWT19DSElQX0xWRFMgMQpAQCAtODgsNiArODksNyBAQAogCXN0cnVjdCBkcm1fY3J0YyBiYXNlOwogCWludCBwaXBlOwogCWludCBwbGFuZTsKKwlzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKmN1cnNvcl9ibzsKIAl1aW50MzJfdCBjdXJzb3JfYWRkcjsKIAl1OCBsdXRfclsyNTZdLCBsdXRfZ1syNTZdLCBsdXRfYlsyNTZdOwogCWludCBkcG1zX21vZGU7CkBAIC0xMDgsNyArMTEwLDggQEAKIGV4dGVybiBib29sIGludGVsX2RkY19wcm9iZShzdHJ1Y3QgaW50ZWxfb3V0cHV0ICppbnRlbF9vdXRwdXQpOwogCiBleHRlcm4gdm9pZCBpbnRlbF9jcnRfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKLWV4dGVybiB2b2lkIGludGVsX3Nkdm9faW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgb3V0cHV0X2RldmljZSk7CitleHRlcm4gdm9pZCBpbnRlbF9oZG1pX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IHNkdm94X3JlZyk7CitleHRlcm4gYm9vbCBpbnRlbF9zZHZvX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IG91dHB1dF9kZXZpY2UpOwogZXh0ZXJuIHZvaWQgaW50ZWxfZHZvX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CiBleHRlcm4gdm9pZCBpbnRlbF90dl9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwogZXh0ZXJuIHZvaWQgaW50ZWxfbHZkc19pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfaGRtaS5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfaGRtaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwNmE0YTMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9oZG1pLmMKQEAgLTAsMCArMSwyODAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNiBEYXZlIEFpcmxpZSA8YWlybGllZEBsaW51eC5pZT4KKyAqIENvcHlyaWdodCDCqSAyMDA2LTIwMDkgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogQXV0aG9yczoKKyAqCUVyaWMgQW5ob2x0IDxlcmljQGFuaG9sdC5uZXQ+CisgKglKZXNzZSBCYXJuZXMgPGplc3NlLmJhcm5lc0BpbnRlbC5jb20+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSAiZHJtUC5oIgorI2luY2x1ZGUgImRybS5oIgorI2luY2x1ZGUgImRybV9jcnRjLmgiCisjaW5jbHVkZSAiaW50ZWxfZHJ2LmgiCisjaW5jbHVkZSAiaTkxNV9kcm0uaCIKKyNpbmNsdWRlICJpOTE1X2Rydi5oIgorCitzdHJ1Y3QgaW50ZWxfaGRtaV9wcml2IHsKKwl1MzIgc2R2b3hfcmVnOworCXUzMiBzYXZlX1NEVk9YOworCWludCBoYXNfaGRtaV9zaW5rOworfTsKKworc3RhdGljIHZvaWQgaW50ZWxfaGRtaV9tb2RlX3NldChzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsCisJCQkJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUsCisJCQkJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKmFkanVzdGVkX21vZGUpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGVuY29kZXItPmRldjsKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBkcm1fY3J0YyAqY3J0YyA9IGVuY29kZXItPmNydGM7CisJc3RydWN0IGludGVsX2NydGMgKmludGVsX2NydGMgPSB0b19pbnRlbF9jcnRjKGNydGMpOworCXN0cnVjdCBpbnRlbF9vdXRwdXQgKmludGVsX291dHB1dCA9IGVuY190b19pbnRlbF9vdXRwdXQoZW5jb2Rlcik7CisJc3RydWN0IGludGVsX2hkbWlfcHJpdiAqaGRtaV9wcml2ID0gaW50ZWxfb3V0cHV0LT5kZXZfcHJpdjsKKwl1MzIgc2R2b3g7CisKKwlzZHZveCA9IFNEVk9fRU5DT0RJTkdfSERNSSB8CisJCVNEVk9fQk9SREVSX0VOQUJMRSB8CisJCVNEVk9fVlNZTkNfQUNUSVZFX0hJR0ggfAorCQlTRFZPX0hTWU5DX0FDVElWRV9ISUdIOworCisJaWYgKGhkbWlfcHJpdi0+aGFzX2hkbWlfc2luaykKKwkJc2R2b3ggfD0gU0RWT19BVURJT19FTkFCTEU7CisKKwlpZiAoaW50ZWxfY3J0Yy0+cGlwZSA9PSAxKQorCQlzZHZveCB8PSBTRFZPX1BJUEVfQl9TRUxFQ1Q7CisKKwlJOTE1X1dSSVRFKGhkbWlfcHJpdi0+c2R2b3hfcmVnLCBzZHZveCk7CisJUE9TVElOR19SRUFEKGhkbWlfcHJpdi0+c2R2b3hfcmVnKTsKK30KKworc3RhdGljIHZvaWQgaW50ZWxfaGRtaV9kcG1zKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciwgaW50IG1vZGUpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGVuY29kZXItPmRldjsKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBpbnRlbF9vdXRwdXQgKmludGVsX291dHB1dCA9IGVuY190b19pbnRlbF9vdXRwdXQoZW5jb2Rlcik7CisJc3RydWN0IGludGVsX2hkbWlfcHJpdiAqaGRtaV9wcml2ID0gaW50ZWxfb3V0cHV0LT5kZXZfcHJpdjsKKwl1MzIgdGVtcDsKKworCWlmIChtb2RlICE9IERSTV9NT0RFX0RQTVNfT04pIHsKKwkJdGVtcCA9IEk5MTVfUkVBRChoZG1pX3ByaXYtPnNkdm94X3JlZyk7CisJCUk5MTVfV1JJVEUoaGRtaV9wcml2LT5zZHZveF9yZWcsIHRlbXAgJiB+U0RWT19FTkFCTEUpOworCX0gZWxzZSB7CisJCXRlbXAgPSBJOTE1X1JFQUQoaGRtaV9wcml2LT5zZHZveF9yZWcpOworCQlJOTE1X1dSSVRFKGhkbWlfcHJpdi0+c2R2b3hfcmVnLCB0ZW1wIHwgU0RWT19FTkFCTEUpOworCX0KKwlQT1NUSU5HX1JFQUQoaGRtaV9wcml2LT5zZHZveF9yZWcpOworfQorCitzdGF0aWMgdm9pZCBpbnRlbF9oZG1pX3NhdmUoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcikKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY29ubmVjdG9yLT5kZXY7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgaW50ZWxfb3V0cHV0ICppbnRlbF9vdXRwdXQgPSB0b19pbnRlbF9vdXRwdXQoY29ubmVjdG9yKTsKKwlzdHJ1Y3QgaW50ZWxfaGRtaV9wcml2ICpoZG1pX3ByaXYgPSBpbnRlbF9vdXRwdXQtPmRldl9wcml2OworCisJaGRtaV9wcml2LT5zYXZlX1NEVk9YID0gSTkxNV9SRUFEKGhkbWlfcHJpdi0+c2R2b3hfcmVnKTsKK30KKworc3RhdGljIHZvaWQgaW50ZWxfaGRtaV9yZXN0b3JlKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNvbm5lY3Rvci0+ZGV2OworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IGludGVsX291dHB1dCAqaW50ZWxfb3V0cHV0ID0gdG9faW50ZWxfb3V0cHV0KGNvbm5lY3Rvcik7CisJc3RydWN0IGludGVsX2hkbWlfcHJpdiAqaGRtaV9wcml2ID0gaW50ZWxfb3V0cHV0LT5kZXZfcHJpdjsKKworCUk5MTVfV1JJVEUoaGRtaV9wcml2LT5zZHZveF9yZWcsIGhkbWlfcHJpdi0+c2F2ZV9TRFZPWCk7CisJUE9TVElOR19SRUFEKGhkbWlfcHJpdi0+c2R2b3hfcmVnKTsKK30KKworc3RhdGljIGludCBpbnRlbF9oZG1pX21vZGVfdmFsaWQoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciwKKwkJCQkgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUpCit7CisJaWYgKG1vZGUtPmNsb2NrID4gMTY1MDAwKQorCQlyZXR1cm4gTU9ERV9DTE9DS19ISUdIOworCWlmIChtb2RlLT5jbG9jayA8IDIwMDAwKQorCQlyZXR1cm4gTU9ERV9DTE9DS19ISUdIOworCisJaWYgKG1vZGUtPmZsYWdzICYgRFJNX01PREVfRkxBR19EQkxTQ0FOKQorCQlyZXR1cm4gTU9ERV9OT19EQkxFU0NBTjsKKworCXJldHVybiBNT0RFX09LOworfQorCitzdGF0aWMgYm9vbCBpbnRlbF9oZG1pX21vZGVfZml4dXAoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLAorCQkJCSAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUsCisJCQkJICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqYWRqdXN0ZWRfbW9kZSkKK3sKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGVudW0gZHJtX2Nvbm5lY3Rvcl9zdGF0dXMKK2ludGVsX2hkbWlfZGV0ZWN0KHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNvbm5lY3Rvci0+ZGV2OworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IGludGVsX291dHB1dCAqaW50ZWxfb3V0cHV0ID0gdG9faW50ZWxfb3V0cHV0KGNvbm5lY3Rvcik7CisJc3RydWN0IGludGVsX2hkbWlfcHJpdiAqaGRtaV9wcml2ID0gaW50ZWxfb3V0cHV0LT5kZXZfcHJpdjsKKwl1MzIgdGVtcCwgYml0OworCisJdGVtcCA9IEk5MTVfUkVBRChQT1JUX0hPVFBMVUdfRU4pOworCisJSTkxNV9XUklURShQT1JUX0hPVFBMVUdfRU4sCisJCSAgIHRlbXAgfAorCQkgICBIRE1JQl9IT1RQTFVHX0lOVF9FTiB8CisJCSAgIEhETUlDX0hPVFBMVUdfSU5UX0VOIHwKKwkJICAgSERNSURfSE9UUExVR19JTlRfRU4pOworCisJUE9TVElOR19SRUFEKFBPUlRfSE9UUExVR19FTik7CisKKwlzd2l0Y2ggKGhkbWlfcHJpdi0+c2R2b3hfcmVnKSB7CisJY2FzZSBTRFZPQjoKKwkJYml0ID0gSERNSUJfSE9UUExVR19JTlRfU1RBVFVTOworCQlicmVhazsKKwljYXNlIFNEVk9DOgorCQliaXQgPSBIRE1JQ19IT1RQTFVHX0lOVF9TVEFUVVM7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiBjb25uZWN0b3Jfc3RhdHVzX3Vua25vd247CisJfQorCisJaWYgKChJOTE1X1JFQUQoUE9SVF9IT1RQTFVHX1NUQVQpICYgYml0KSAhPSAwKQorCQlyZXR1cm4gY29ubmVjdG9yX3N0YXR1c19jb25uZWN0ZWQ7CisJZWxzZQorCQlyZXR1cm4gY29ubmVjdG9yX3N0YXR1c19kaXNjb25uZWN0ZWQ7Cit9CisKK3N0YXRpYyBpbnQgaW50ZWxfaGRtaV9nZXRfbW9kZXMoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcikKK3sKKwlzdHJ1Y3QgaW50ZWxfb3V0cHV0ICppbnRlbF9vdXRwdXQgPSB0b19pbnRlbF9vdXRwdXQoY29ubmVjdG9yKTsKKworCS8qIFdlIHNob3VsZCBwYXJzZSB0aGUgRURJRCBkYXRhIGFuZCBmaW5kIG91dCBpZiBpdCdzIGFuIEhETUkgc2luayBzbworCSAqIHdlIGNhbiBzZW5kIGF1ZGlvIHRvIGl0LgorCSAqLworCisJcmV0dXJuIGludGVsX2RkY19nZXRfbW9kZXMoaW50ZWxfb3V0cHV0KTsKK30KKworc3RhdGljIHZvaWQgaW50ZWxfaGRtaV9kZXN0cm95KHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpCit7CisJc3RydWN0IGludGVsX291dHB1dCAqaW50ZWxfb3V0cHV0ID0gdG9faW50ZWxfb3V0cHV0KGNvbm5lY3Rvcik7CisKKwlpZiAoaW50ZWxfb3V0cHV0LT5pMmNfYnVzKQorCQlpbnRlbF9pMmNfZGVzdHJveShpbnRlbF9vdXRwdXQtPmkyY19idXMpOworCWRybV9zeXNmc19jb25uZWN0b3JfcmVtb3ZlKGNvbm5lY3Rvcik7CisJZHJtX2Nvbm5lY3Rvcl9jbGVhbnVwKGNvbm5lY3Rvcik7CisJa2ZyZWUoaW50ZWxfb3V0cHV0KTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBkcm1fZW5jb2Rlcl9oZWxwZXJfZnVuY3MgaW50ZWxfaGRtaV9oZWxwZXJfZnVuY3MgPSB7CisJLmRwbXMgPSBpbnRlbF9oZG1pX2RwbXMsCisJLm1vZGVfZml4dXAgPSBpbnRlbF9oZG1pX21vZGVfZml4dXAsCisJLnByZXBhcmUgPSBpbnRlbF9lbmNvZGVyX3ByZXBhcmUsCisJLm1vZGVfc2V0ID0gaW50ZWxfaGRtaV9tb2RlX3NldCwKKwkuY29tbWl0ID0gaW50ZWxfZW5jb2Rlcl9jb21taXQsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGRybV9jb25uZWN0b3JfZnVuY3MgaW50ZWxfaGRtaV9jb25uZWN0b3JfZnVuY3MgPSB7CisJLnNhdmUgPSBpbnRlbF9oZG1pX3NhdmUsCisJLnJlc3RvcmUgPSBpbnRlbF9oZG1pX3Jlc3RvcmUsCisJLmRldGVjdCA9IGludGVsX2hkbWlfZGV0ZWN0LAorCS5maWxsX21vZGVzID0gZHJtX2hlbHBlcl9wcm9iZV9zaW5nbGVfY29ubmVjdG9yX21vZGVzLAorCS5kZXN0cm95ID0gaW50ZWxfaGRtaV9kZXN0cm95LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBkcm1fY29ubmVjdG9yX2hlbHBlcl9mdW5jcyBpbnRlbF9oZG1pX2Nvbm5lY3Rvcl9oZWxwZXJfZnVuY3MgPSB7CisJLmdldF9tb2RlcyA9IGludGVsX2hkbWlfZ2V0X21vZGVzLAorCS5tb2RlX3ZhbGlkID0gaW50ZWxfaGRtaV9tb2RlX3ZhbGlkLAorCS5iZXN0X2VuY29kZXIgPSBpbnRlbF9iZXN0X2VuY29kZXIsCit9OworCitzdGF0aWMgdm9pZCBpbnRlbF9oZG1pX2VuY19kZXN0cm95KHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcikKK3sKKwlkcm1fZW5jb2Rlcl9jbGVhbnVwKGVuY29kZXIpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGRybV9lbmNvZGVyX2Z1bmNzIGludGVsX2hkbWlfZW5jX2Z1bmNzID0geworCS5kZXN0cm95ID0gaW50ZWxfaGRtaV9lbmNfZGVzdHJveSwKK307CisKKwordm9pZCBpbnRlbF9oZG1pX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IHNkdm94X3JlZykKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3I7CisJc3RydWN0IGludGVsX291dHB1dCAqaW50ZWxfb3V0cHV0OworCXN0cnVjdCBpbnRlbF9oZG1pX3ByaXYgKmhkbWlfcHJpdjsKKworCWludGVsX291dHB1dCA9IGtjYWxsb2Moc2l6ZW9mKHN0cnVjdCBpbnRlbF9vdXRwdXQpICsKKwkJCSAgICAgICBzaXplb2Yoc3RydWN0IGludGVsX2hkbWlfcHJpdiksIDEsIEdGUF9LRVJORUwpOworCWlmICghaW50ZWxfb3V0cHV0KQorCQlyZXR1cm47CisJaGRtaV9wcml2ID0gKHN0cnVjdCBpbnRlbF9oZG1pX3ByaXYgKikoaW50ZWxfb3V0cHV0ICsgMSk7CisKKwljb25uZWN0b3IgPSAmaW50ZWxfb3V0cHV0LT5iYXNlOworCWRybV9jb25uZWN0b3JfaW5pdChkZXYsIGNvbm5lY3RvciwgJmludGVsX2hkbWlfY29ubmVjdG9yX2Z1bmNzLAorCQkJICAgRFJNX01PREVfQ09OTkVDVE9SX0RWSUQpOworCWRybV9jb25uZWN0b3JfaGVscGVyX2FkZChjb25uZWN0b3IsICZpbnRlbF9oZG1pX2Nvbm5lY3Rvcl9oZWxwZXJfZnVuY3MpOworCisJaW50ZWxfb3V0cHV0LT50eXBlID0gSU5URUxfT1VUUFVUX0hETUk7CisKKwljb25uZWN0b3ItPmludGVybGFjZV9hbGxvd2VkID0gMDsKKwljb25uZWN0b3ItPmRvdWJsZXNjYW5fYWxsb3dlZCA9IDA7CisKKwkvKiBTZXQgdXAgdGhlIEREQyBidXMuICovCisJaWYgKHNkdm94X3JlZyA9PSBTRFZPQikKKwkJaW50ZWxfb3V0cHV0LT5kZGNfYnVzID0gaW50ZWxfaTJjX2NyZWF0ZShkZXYsIEdQSU9FLCAiSERNSUIiKTsKKwllbHNlCisJCWludGVsX291dHB1dC0+ZGRjX2J1cyA9IGludGVsX2kyY19jcmVhdGUoZGV2LCBHUElPRCwgIkhETUlDIik7CisKKwlpZiAoIWludGVsX291dHB1dC0+ZGRjX2J1cykKKwkJZ290byBlcnJfY29ubmVjdG9yOworCisJaGRtaV9wcml2LT5zZHZveF9yZWcgPSBzZHZveF9yZWc7CisJaW50ZWxfb3V0cHV0LT5kZXZfcHJpdiA9IGhkbWlfcHJpdjsKKworCWRybV9lbmNvZGVyX2luaXQoZGV2LCAmaW50ZWxfb3V0cHV0LT5lbmMsICZpbnRlbF9oZG1pX2VuY19mdW5jcywKKwkJCSBEUk1fTU9ERV9FTkNPREVSX1RNRFMpOworCWRybV9lbmNvZGVyX2hlbHBlcl9hZGQoJmludGVsX291dHB1dC0+ZW5jLCAmaW50ZWxfaGRtaV9oZWxwZXJfZnVuY3MpOworCisJZHJtX21vZGVfY29ubmVjdG9yX2F0dGFjaF9lbmNvZGVyKCZpbnRlbF9vdXRwdXQtPmJhc2UsCisJCQkJCSAgJmludGVsX291dHB1dC0+ZW5jKTsKKwlkcm1fc3lzZnNfY29ubmVjdG9yX2FkZChjb25uZWN0b3IpOworCisJLyogRm9yIEc0WCBkZXNrdG9wIGNoaXAsIFBFR19CQU5EX0dBUF9EQVRBIDM6MCBtdXN0IGZpcnN0IGJlIHdyaXR0ZW4KKwkgKiAweGQuICBGYWlsdXJlIHRvIGRvIHNvIHdpbGwgcmVzdWx0IGluIHNwdXJpb3VzIGludGVycnVwdHMgYmVpbmcKKwkgKiBnZW5lcmF0ZWQgb24gdGhlIHBvcnQgd2hlbiBhIGNhYmxlIGlzIG5vdCBhdHRhY2hlZC4KKwkgKi8KKwlpZiAoSVNfRzRYKGRldikgJiYgIUlTX0dNNDUoZGV2KSkgeworCQl1MzIgdGVtcCA9IEk5MTVfUkVBRChQRUdfQkFORF9HQVBfREFUQSk7CisJCUk5MTVfV1JJVEUoUEVHX0JBTkRfR0FQX0RBVEEsICh0ZW1wICYgfjB4ZikgfCAweGQpOworCX0KKworCXJldHVybjsKKworZXJyX2Nvbm5lY3RvcjoKKwlkcm1fY29ubmVjdG9yX2NsZWFudXAoY29ubmVjdG9yKTsKKwlrZnJlZShpbnRlbF9vdXRwdXQpOworCisJcmV0dXJuOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfc2R2by5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfc2R2by5jCmluZGV4IGZiYmFhNGYuLjQwNzIxNTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX3Nkdm8uYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9zZHZvLmMKQEAgLTk3OCw3ICs5NzgsNyBAQAogfTsKIAogCi12b2lkIGludGVsX3Nkdm9faW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgb3V0cHV0X2RldmljZSkKK2Jvb2wgaW50ZWxfc2R2b19pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBvdXRwdXRfZGV2aWNlKQogewogCXN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3I7CiAJc3RydWN0IGludGVsX291dHB1dCAqaW50ZWxfb3V0cHV0OwpAQCAtOTkxLDcgKzk5MSw3IEBACiAKIAlpbnRlbF9vdXRwdXQgPSBrY2FsbG9jKHNpemVvZihzdHJ1Y3QgaW50ZWxfb3V0cHV0KStzaXplb2Yoc3RydWN0IGludGVsX3Nkdm9fcHJpdiksIDEsIEdGUF9LRVJORUwpOwogCWlmICghaW50ZWxfb3V0cHV0KSB7Ci0JCXJldHVybjsKKwkJcmV0dXJuIGZhbHNlOwogCX0KIAogCWNvbm5lY3RvciA9ICZpbnRlbF9vdXRwdXQtPmJhc2U7CkBAIC0xMTE2LDcgKzExMTYsNyBAQAogCiAJaW50ZWxfb3V0cHV0LT5kZGNfYnVzID0gaTJjYnVzOwogCi0JcmV0dXJuOworCXJldHVybiB0cnVlOwogCiBlcnJfaTJjOgogCWludGVsX2kyY19kZXN0cm95KGludGVsX291dHB1dC0+aTJjX2J1cyk7CkBAIC0xMTI0LDUgKzExMjQsNSBAQAogCWRybV9jb25uZWN0b3JfY2xlYW51cChjb25uZWN0b3IpOwogCWtmcmVlKGludGVsX291dHB1dCk7CiAKLQlyZXR1cm47CisJcmV0dXJuIGZhbHNlOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvS2NvbmZpZyBiL2RyaXZlcnMvaGlkL0tjb25maWcKaW5kZXggYjRmZDhjYS4uZTg1YzhmZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvS2NvbmZpZworKysgYi9kcml2ZXJzL2hpZC9LY29uZmlnCkBAIC04NSwxNCArODUsMTQgQEAKIGNvbmZpZyBISURfQTRURUNICiAJdHJpc3RhdGUgIkE0IHRlY2giIGlmIEVNQkVEREVECiAJZGVwZW5kcyBvbiBVU0JfSElECi0JZGVmYXVsdCB5CisJZGVmYXVsdCAhRU1CRURERUQKIAktLS1oZWxwLS0tCiAJU3VwcG9ydCBmb3IgQTQgdGVjaCBYNSBhbmQgV09QLTM1IC8gVHJ1c3QgNDUwTCBtaWNlLgogCiBjb25maWcgSElEX0FQUExFCiAJdHJpc3RhdGUgIkFwcGxlIiBpZiBFTUJFRERFRAogCWRlcGVuZHMgb24gKFVTQl9ISUQgfHwgQlRfSElEUCkKLQlkZWZhdWx0IHkKKwlkZWZhdWx0ICFFTUJFRERFRAogCS0tLWhlbHAtLS0KIAlTdXBwb3J0IGZvciBzb21lIEFwcGxlIGRldmljZXMgd2hpY2ggbGVzcyBvciBtb3JlIGJyZWFrCiAJSElEIHNwZWNpZmljYXRpb24uCkBAIC0xMDMsNjQgKzEwMyw0OSBAQAogY29uZmlnIEhJRF9CRUxLSU4KIAl0cmlzdGF0ZSAiQmVsa2luIiBpZiBFTUJFRERFRAogCWRlcGVuZHMgb24gVVNCX0hJRAotCWRlZmF1bHQgeQorCWRlZmF1bHQgIUVNQkVEREVECiAJLS0taGVscC0tLQogCVN1cHBvcnQgZm9yIEJlbGtpbiBGbGlwIEtWTSBhbmQgV2lyZWxlc3Mga2V5Ym9hcmQuCiAKLWNvbmZpZyBISURfQlJJR0hUCi0JdHJpc3RhdGUgIkJyaWdodCIgaWYgRU1CRURERUQKLQlkZXBlbmRzIG9uIFVTQl9ISUQKLQlkZWZhdWx0IHkKLQktLS1oZWxwLS0tCi0JU3VwcG9ydCBmb3IgQnJpZ2h0IEFCTlQtMiBrZXlib2FyZC4KLQogY29uZmlnIEhJRF9DSEVSUlkKIAl0cmlzdGF0ZSAiQ2hlcnJ5IiBpZiBFTUJFRERFRAogCWRlcGVuZHMgb24gVVNCX0hJRAotCWRlZmF1bHQgeQorCWRlZmF1bHQgIUVNQkVEREVECiAJLS0taGVscC0tLQogCVN1cHBvcnQgZm9yIENoZXJyeSBDeW1vdGlvbiBrZXlib2FyZC4KIAogY29uZmlnIEhJRF9DSElDT05ZCiAJdHJpc3RhdGUgIkNoaWNvbnkiIGlmIEVNQkVEREVECiAJZGVwZW5kcyBvbiBVU0JfSElECi0JZGVmYXVsdCB5CisJZGVmYXVsdCAhRU1CRURERUQKIAktLS1oZWxwLS0tCiAJU3VwcG9ydCBmb3IgQ2hpY29ueSBUYWN0aWNhbCBwYWQuCiAKIGNvbmZpZyBISURfQ1lQUkVTUwogCXRyaXN0YXRlICJDeXByZXNzIiBpZiBFTUJFRERFRAogCWRlcGVuZHMgb24gVVNCX0hJRAotCWRlZmF1bHQgeQorCWRlZmF1bHQgIUVNQkVEREVECiAJLS0taGVscC0tLQogCVN1cHBvcnQgZm9yIGN5cHJlc3MgbW91c2UgYW5kIGJhcmNvZGUgcmVhZGVycy4KIAotY29uZmlnIEhJRF9ERUxMCi0JdHJpc3RhdGUgIkRlbGwiIGlmIEVNQkVEREVECi0JZGVwZW5kcyBvbiBVU0JfSElECi0JZGVmYXVsdCB5Ci0JLS0taGVscC0tLQotCVN1cHBvcnQgZm9yIHF1aXJreSBEZWxsIEhJRCBoYXJkd2FyZSB0aGF0IHJlcXVpcmUKLQlzcGVjaWFsIExFRCBoYW5kbGluZyAoVzc2NTggYW5kIFNLODExNSBtb2RlbHMpCi0KIGNvbmZpZyBISURfRVpLRVkKIAl0cmlzdGF0ZSAiRXprZXkiIGlmIEVNQkVEREVECiAJZGVwZW5kcyBvbiBVU0JfSElECi0JZGVmYXVsdCB5CisJZGVmYXVsdCAhRU1CRURERUQKIAktLS1oZWxwLS0tCiAJU3VwcG9ydCBmb3IgRXprZXkgQlRDIDgxOTMga2V5Ym9hcmQuCiAKIGNvbmZpZyBISURfR1lSQVRJT04KIAl0cmlzdGF0ZSAiR3lyYXRpb24iIGlmIEVNQkVEREVECiAJZGVwZW5kcyBvbiBVU0JfSElECi0JZGVmYXVsdCB5CisJZGVmYXVsdCAhRU1CRURERUQKIAktLS1oZWxwLS0tCiAJU3VwcG9ydCBmb3IgR3lyYXRpb24gcmVtb3RlIGNvbnRyb2wuCiAKIGNvbmZpZyBISURfTE9HSVRFQ0gKIAl0cmlzdGF0ZSAiTG9naXRlY2giIGlmIEVNQkVEREVECiAJZGVwZW5kcyBvbiBVU0JfSElECi0JZGVmYXVsdCB5CisJZGVmYXVsdCAhRU1CRURERUQKIAktLS1oZWxwLS0tCiAJU3VwcG9ydCBmb3IgTG9naXRlY2ggZGV2aWNlcyB0aGF0IGFyZSBub3QgZnVsbHkgY29tcGxpYW50IHdpdGggSElEIHN0YW5kYXJkLgogCkBAIC0xOTEsMjEgKzE3NiwyOCBAQAogY29uZmlnIEhJRF9NSUNST1NPRlQKIAl0cmlzdGF0ZSAiTWljcm9zb2Z0IiBpZiBFTUJFRERFRAogCWRlcGVuZHMgb24gVVNCX0hJRAotCWRlZmF1bHQgeQorCWRlZmF1bHQgIUVNQkVEREVECiAJLS0taGVscC0tLQogCVN1cHBvcnQgZm9yIE1pY3Jvc29mdCBkZXZpY2VzIHRoYXQgYXJlIG5vdCBmdWxseSBjb21wbGlhbnQgd2l0aCBISUQgc3RhbmRhcmQuCiAKIGNvbmZpZyBISURfTU9OVEVSRVkKIAl0cmlzdGF0ZSAiTW9udGVyZXkiIGlmIEVNQkVEREVECiAJZGVwZW5kcyBvbiBVU0JfSElECi0JZGVmYXVsdCB5CisJZGVmYXVsdCAhRU1CRURERUQKIAktLS1oZWxwLS0tCiAJU3VwcG9ydCBmb3IgTW9udGVyZXkgR2VuaXVzIEtCMjlFLgogCitjb25maWcgSElEX05UUklHCisJdHJpc3RhdGUgIk5UcmlnIiBpZiBFTUJFRERFRAorCWRlcGVuZHMgb24gVVNCX0hJRAorCWRlZmF1bHQgIUVNQkVEREVECisJLS0taGVscC0tLQorCVN1cHBvcnQgZm9yIE4tVHJpZyB0b3VjaCBzY3JlZW4uCisKIGNvbmZpZyBISURfUEFOVEhFUkxPUkQKIAl0cmlzdGF0ZSAiUGFudGhlcmxvcmQgZGV2aWNlcyBzdXBwb3J0IiBpZiBFTUJFRERFRAogCWRlcGVuZHMgb24gVVNCX0hJRAotCWRlZmF1bHQgeQorCWRlZmF1bHQgIUVNQkVEREVECiAJLS0taGVscC0tLQogCVN1cHBvcnQgZm9yIFBhbnRoZXJMb3JkL0dyZWVuQXNpYSBiYXNlZCBkZXZpY2Ugc3VwcG9ydC4KIApAQCAtMjIwLDMxICsyMTIsNDcgQEAKIGNvbmZpZyBISURfUEVUQUxZTlgKIAl0cmlzdGF0ZSAiUGV0YWx5bngiIGlmIEVNQkVEREVECiAJZGVwZW5kcyBvbiBVU0JfSElECi0JZGVmYXVsdCB5CisJZGVmYXVsdCAhRU1CRURERUQKIAktLS1oZWxwLS0tCiAJU3VwcG9ydCBmb3IgUGV0YWx5bnggTWF4dGVyIHJlbW90ZSBjb250cm9sLgogCiBjb25maWcgSElEX1NBTVNVTkcKIAl0cmlzdGF0ZSAiU2Ftc3VuZyIgaWYgRU1CRURERUQKIAlkZXBlbmRzIG9uIFVTQl9ISUQKLQlkZWZhdWx0IHkKKwlkZWZhdWx0ICFFTUJFRERFRAogCS0tLWhlbHAtLS0KIAlTdXBwb3J0IGZvciBTYW1zdW5nIEluZnJhUmVkIHJlbW90ZSBjb250cm9sLgogCiBjb25maWcgSElEX1NPTlkKIAl0cmlzdGF0ZSAiU29ueSIgaWYgRU1CRURERUQKIAlkZXBlbmRzIG9uIFVTQl9ISUQKLQlkZWZhdWx0IHkKKwlkZWZhdWx0ICFFTUJFRERFRAogCS0tLWhlbHAtLS0KIAlTdXBwb3J0IGZvciBTb255IFBTMyBjb250cm9sbGVyLgogCiBjb25maWcgSElEX1NVTlBMVVMKIAl0cmlzdGF0ZSAiU3VucGx1cyIgaWYgRU1CRURERUQKIAlkZXBlbmRzIG9uIFVTQl9ISUQKLQlkZWZhdWx0IHkKKwlkZWZhdWx0ICFFTUJFRERFRAogCS0tLWhlbHAtLS0KIAlTdXBwb3J0IGZvciBTdW5wbHVzIHdpcmVsZXNzIGRlc2t0b3AuCiAKK2NvbmZpZyBHUkVFTkFTSUFfRkYKKwl0cmlzdGF0ZSAiR3JlZW5Bc2lhIChQcm9kdWN0IElEIDB4MTIpIGZvcmNlIGZlZWRiYWNrIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBVU0JfSElECisJc2VsZWN0IElOUFVUX0ZGX01FTUxFU1MKKwktLS1oZWxwLS0tCisJU2F5IFkgaGVyZSBpZiB5b3UgaGF2ZSBhIEdyZWVuQXNpYSAoUHJvZHVjdCBJRCAweDEyKSBiYXNlZCBnYW1lIGNvbnRyb2xsZXIKKwkobGlrZSBNQU5UQSBXYXJpb3IgTU04MTYgYW5kIFNwZWVkTGluayBTdHJpa2UyIFNMLTY2MzUpIG9yIGFkYXB0ZXIKKwlhbmQgd2FudCB0byBlbmFibGUgZm9yY2UgZmVlZGJhY2sgc3VwcG9ydCBmb3IgaXQuCisKK2NvbmZpZyBISURfVE9QU0VFRAorCXRyaXN0YXRlICJUb3BTZWVkIEN5YmVybGluayByZW1vdGUgY29udHJvbCBzdXBwb3J0IiBpZiBFTUJFRERFRAorCWRlcGVuZHMgb24gVVNCX0hJRAorCWRlZmF1bHQgIUVNQkVEREVECisJLS0taGVscC0tLQorCVNheSBZIGlmIHlvdSBoYXZlIGEgVG9wU2VlZCBDeWJlcmxpbmsgcmVtb3RlIGNvbnRyb2wuCisKIGNvbmZpZyBUSFJVU1RNQVNURVJfRkYKIAl0cmlzdGF0ZSAiVGhydXN0TWFzdGVyIGRldmljZXMgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIFVTQl9ISUQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL01ha2VmaWxlIGIvZHJpdmVycy9oaWQvTWFrZWZpbGUKaW5kZXggYjA5ZTQzZS4uZmJkMDIxZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9oaWQvTWFrZWZpbGUKQEAgLTIzLDIyICsyMywyMyBAQAogb2JqLSQoQ09ORklHX0hJRF9BNFRFQ0gpCSs9IGhpZC1hNHRlY2gubwogb2JqLSQoQ09ORklHX0hJRF9BUFBMRSkJCSs9IGhpZC1hcHBsZS5vCiBvYmotJChDT05GSUdfSElEX0JFTEtJTikJKz0gaGlkLWJlbGtpbi5vCi1vYmotJChDT05GSUdfSElEX0JSSUdIVCkJKz0gaGlkLWJyaWdodC5vCiBvYmotJChDT05GSUdfSElEX0NIRVJSWSkJKz0gaGlkLWNoZXJyeS5vCiBvYmotJChDT05GSUdfSElEX0NISUNPTlkpCSs9IGhpZC1jaGljb255Lm8KIG9iai0kKENPTkZJR19ISURfQ1lQUkVTUykJKz0gaGlkLWN5cHJlc3Mubwotb2JqLSQoQ09ORklHX0hJRF9ERUxMKQkJKz0gaGlkLWRlbGwubwogb2JqLSQoQ09ORklHX0hJRF9FWktFWSkJCSs9IGhpZC1lemtleS5vCiBvYmotJChDT05GSUdfSElEX0dZUkFUSU9OKQkrPSBoaWQtZ3lyYXRpb24ubwogb2JqLSQoQ09ORklHX0hJRF9MT0dJVEVDSCkJKz0gaGlkLWxvZ2l0ZWNoLm8KIG9iai0kKENPTkZJR19ISURfTUlDUk9TT0ZUKQkrPSBoaWQtbWljcm9zb2Z0Lm8KIG9iai0kKENPTkZJR19ISURfTU9OVEVSRVkpCSs9IGhpZC1tb250ZXJleS5vCitvYmotJChDT05GSUdfSElEX05UUklHKQkJKz0gaGlkLW50cmlnLm8KIG9iai0kKENPTkZJR19ISURfUEFOVEhFUkxPUkQpCSs9IGhpZC1wbC5vCiBvYmotJChDT05GSUdfSElEX1BFVEFMWU5YKQkrPSBoaWQtcGV0YWx5bngubwogb2JqLSQoQ09ORklHX0hJRF9TQU1TVU5HKQkrPSBoaWQtc2Ftc3VuZy5vCiBvYmotJChDT05GSUdfSElEX1NPTlkpCQkrPSBoaWQtc29ueS5vCiBvYmotJChDT05GSUdfSElEX1NVTlBMVVMpCSs9IGhpZC1zdW5wbHVzLm8KK29iai0kKENPTkZJR19HUkVFTkFTSUFfRkYpCSs9IGhpZC1nYWZmLm8KIG9iai0kKENPTkZJR19USFJVU1RNQVNURVJfRkYpCSs9IGhpZC10bWZmLm8KK29iai0kKENPTkZJR19ISURfVE9QU0VFRCkJKz0gaGlkLXRvcHNlZWQubwogb2JqLSQoQ09ORklHX1pFUk9QTFVTX0ZGKQkrPSBoaWQtenBmZi5vCiAKIG9iai0kKENPTkZJR19VU0JfSElEKQkJKz0gdXNiaGlkLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkLWJyaWdodC5jIGIvZHJpdmVycy9oaWQvaGlkLWJyaWdodC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODUxN2ExLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvaGlkL2hpZC1icmlnaHQuYworKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qCi0gKiAgSElEIGRyaXZlciBmb3Igc29tZSBicmlnaHQgInNwZWNpYWwiIGRldmljZXMKLSAqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA4IE1hdXJvIENhcnZhbGhvIENoZWhhYiA8bWNoZWhhYkByZWRoYXQuY29tPgotICoKLSAqIEJhc2VkIG9uIGhpZC1kZWxsIGRyaXZlcgotICovCi0KLS8qCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAqIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAqIGFueSBsYXRlciB2ZXJzaW9uLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9oaWQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLQotI2luY2x1ZGUgImhpZC1pZHMuaCIKLQotc3RhdGljIGludCBicmlnaHRfcHJvYmUoc3RydWN0IGhpZF9kZXZpY2UgKmhkZXYsIGNvbnN0IHN0cnVjdCBoaWRfZGV2aWNlX2lkICppZCkKLXsKLQlpbnQgcmV0OwotCi0JcmV0ID0gaGlkX3BhcnNlKGhkZXYpOwotCWlmIChyZXQpIHsKLQkJZGV2X2VycigmaGRldi0+ZGV2LCAicGFyc2UgZmFpbGVkXG4iKTsKLQkJZ290byBlcnJfZnJlZTsKLQl9Ci0KLQlyZXQgPSBoaWRfaHdfc3RhcnQoaGRldiwgSElEX0NPTk5FQ1RfREVGQVVMVCk7Ci0JaWYgKHJldCkgewotCQlkZXZfZXJyKCZoZGV2LT5kZXYsICJodyBzdGFydCBmYWlsZWRcbiIpOwotCQlnb3RvIGVycl9mcmVlOwotCX0KLQotCXVzYmhpZF9zZXRfbGVkcyhoZGV2KTsKLQotCXJldHVybiAwOwotZXJyX2ZyZWU6Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBoaWRfZGV2aWNlX2lkIGJyaWdodF9kZXZpY2VzW10gPSB7Ci0JeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0JSSUdIVCwgVVNCX0RFVklDRV9JRF9CUklHSFRfQUJOVDIpIH0sCi0JeyB9Ci19OwotTU9EVUxFX0RFVklDRV9UQUJMRShoaWQsIGJyaWdodF9kZXZpY2VzKTsKLQotc3RhdGljIHN0cnVjdCBoaWRfZHJpdmVyIGJyaWdodF9kcml2ZXIgPSB7Ci0JLm5hbWUgPSAiYnJpZ2h0IiwKLQkuaWRfdGFibGUgPSBicmlnaHRfZGV2aWNlcywKLQkucHJvYmUgPSBicmlnaHRfcHJvYmUsCi19OwotCi1zdGF0aWMgaW50IGJyaWdodF9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIGhpZF9yZWdpc3Rlcl9kcml2ZXIoJmJyaWdodF9kcml2ZXIpOwotfQotCi1zdGF0aWMgdm9pZCBicmlnaHRfZXhpdCh2b2lkKQotewotCWhpZF91bnJlZ2lzdGVyX2RyaXZlcigmYnJpZ2h0X2RyaXZlcik7Ci19Ci0KLW1vZHVsZV9pbml0KGJyaWdodF9pbml0KTsKLW1vZHVsZV9leGl0KGJyaWdodF9leGl0KTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLQotSElEX0NPTVBBVF9MT0FEX0RSSVZFUihicmlnaHQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkLWNvcmUuYyBiL2RyaXZlcnMvaGlkL2hpZC1jb3JlLmMKaW5kZXggNDBkZjNlMS4uNWQ3NjQwZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvaGlkLWNvcmUuYworKysgYi9kcml2ZXJzL2hpZC9oaWQtY29yZS5jCkBAIC0xMjU2LDE5ICsxMjU2LDE2IEBACiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX0ZPVU5UQUlOX1RQX09OTFkpIH0sCiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX0dFWVNFUjFfVFBfT05MWSkgfSwKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQkVMS0lOLCBVU0JfREVWSUNFX0lEX0ZMSVBfS1ZNKSB9LAotCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9CUklHSFQsIFVTQl9ERVZJQ0VfSURfQlJJR0hUX0FCTlQyKSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9DSEVSUlksIFVTQl9ERVZJQ0VfSURfQ0hFUlJZX0NZTU9USU9OKSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9DSElDT05ZLCBVU0JfREVWSUNFX0lEX0NISUNPTllfVEFDVElDQUxfUEFEKSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9DWVBSRVNTLCBVU0JfREVWSUNFX0lEX0NZUFJFU1NfQkFSQ09ERV8xKSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9DWVBSRVNTLCBVU0JfREVWSUNFX0lEX0NZUFJFU1NfQkFSQ09ERV8yKSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9DWVBSRVNTLCBVU0JfREVWSUNFX0lEX0NZUFJFU1NfTU9VU0UpIH0sCi0JeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0RFTEwsIFVTQl9ERVZJQ0VfSURfREVMTF9XNzY1OCkgfSwKLQl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfREVMTCwgVVNCX0RFVklDRV9JRF9ERUxMX1NLODExNSkgfSwKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfRVpLRVksIFVTQl9ERVZJQ0VfSURfQlRDXzgxOTMpIH0sCi0JeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0dFTkVSSUNfMTNCQSwgVVNCX0RFVklDRV9JRF9HRU5FUklDXzEzQkFfS0JEX01PVVNFKSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9HQU1FUk9OLCBVU0JfREVWSUNFX0lEX0dBTUVST05fRFVBTF9QU1hfQURBUFRPUikgfSwKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfR0FNRVJPTiwgVVNCX0RFVklDRV9JRF9HQU1FUk9OX0RVQUxfUENTX0FEQVBUT1IpIH0sCiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0dSRUVOQVNJQSwgMHgwMDAzKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9HUkVFTkFTSUEsIDB4MDAxMikgfSwKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfR1lSQVRJT04sIFVTQl9ERVZJQ0VfSURfR1lSQVRJT05fUkVNT1RFKSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9HWVJBVElPTiwgVVNCX0RFVklDRV9JRF9HWVJBVElPTl9SRU1PVEVfMikgfSwKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfTEFCVEVDLCBVU0JfREVWSUNFX0lEX0xBQlRFQ19XSVJFTEVTU19LRVlCT0FSRCkgfSwKQEAgLTEyNzksNyArMTI3Niw2IEBACiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0xPR0lURUNILCBVU0JfREVWSUNFX0lEX0RJTk9WT19ERVNLVE9QKSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9MT0dJVEVDSCwgVVNCX0RFVklDRV9JRF9ESU5PVk9fRURHRSkgfSwKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfTE9HSVRFQ0gsIFVTQl9ERVZJQ0VfSURfRElOT1ZPX01JTkkpIH0sCi0JeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0xPR0lURUNILCBVU0JfREVWSUNFX0lEX0xPR0lURUNIX0tCRCkgfSwKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfTE9HSVRFQ0gsIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfRUxJVEVfS0JEKSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9MT0dJVEVDSCwgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9DT1JETEVTU19ERVNLVE9QX0xYNTAwKSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9MT0dJVEVDSCwgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9FWFRSRU1FXzNEKSB9LApAQCAtMTI5NywyMyArMTI5MywxMDUgQEAKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfTUlDUk9TT0ZULCBVU0JfREVWSUNFX0lEX01TX1BSRVNFTlRFUl84S19VU0IpIH0sCiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX01JQ1JPU09GVCwgVVNCX0RFVklDRV9JRF9XSVJFTEVTU19PUFRJQ0FMX0RFU0tUT1BfM18wKSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9NT05URVJFWSwgVVNCX0RFVklDRV9JRF9HRU5JVVNfS0IyOUUpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX05UUklHLCBVU0JfREVWSUNFX0lEX05UUklHX1RPVUNIX1NDUkVFTikgfSwKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfUEVUQUxZTlgsIFVTQl9ERVZJQ0VfSURfUEVUQUxZTlhfTUFYVEVSX1JFTU9URSkgfSwKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfU0FNU1VORywgVVNCX0RFVklDRV9JRF9TQU1TVU5HX0lSX1JFTU9URSkgfSwKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfU09OWSwgVVNCX0RFVklDRV9JRF9TT05ZX1BTM19DT05UUk9MTEVSKSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9TT05ZLCBVU0JfREVWSUNFX0lEX1NPTllfVkFJT19WR1hfTU9VU0UpIH0sCiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1NVTlBMVVMsIFVTQl9ERVZJQ0VfSURfU1VOUExVU19XREVTS1RPUCkgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfVE9QU0VFRCwgVVNCX0RFVklDRV9JRF9UT1BTRUVEX0NZQkVSTElOSykgfSwKIAogCXsgSElEX0JMVUVUT09USF9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BUFBMRSwgMHgwMzBjKSB9LAogCXsgSElEX0JMVUVUT09USF9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9NSUNST1NPRlQsIFVTQl9ERVZJQ0VfSURfTVNfUFJFU0VOVEVSXzhLX0JUKSB9LAogCXsgfQogfTsKIAorc3RydWN0IGhpZF9keW5pZCB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXN0cnVjdCBoaWRfZGV2aWNlX2lkIGlkOworfTsKKworLyoqCisgKiBzdG9yZV9uZXdfaWQgLSBhZGQgYSBuZXcgSElEIGRldmljZSBJRCB0byB0aGlzIGRyaXZlciBhbmQgcmUtcHJvYmUgZGV2aWNlcworICogQGRyaXZlcjogdGFyZ2V0IGRldmljZSBkcml2ZXIKKyAqIEBidWY6IGJ1ZmZlciBmb3Igc2Nhbm5pbmcgZGV2aWNlIElEIGRhdGEKKyAqIEBjb3VudDogaW5wdXQgc2l6ZQorICoKKyAqIEFkZHMgYSBuZXcgZHluYW1pYyBoaWQgZGV2aWNlIElEIHRvIHRoaXMgZHJpdmVyLAorICogYW5kIGNhdXNlcyB0aGUgZHJpdmVyIHRvIHByb2JlIGZvciBhbGwgZGV2aWNlcyBhZ2Fpbi4KKyAqLworc3RhdGljIHNzaXplX3Qgc3RvcmVfbmV3X2lkKHN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnYsIGNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBoaWRfZHJpdmVyICpoZHJ2ID0gY29udGFpbmVyX29mKGRydiwgc3RydWN0IGhpZF9kcml2ZXIsIGRyaXZlcik7CisJc3RydWN0IGhpZF9keW5pZCAqZHluaWQ7CisJX191MzIgYnVzLCB2ZW5kb3IsIHByb2R1Y3Q7CisJdW5zaWduZWQgbG9uZyBkcml2ZXJfZGF0YSA9IDA7CisJaW50IHJldDsKKworCXJldCA9IHNzY2FuZihidWYsICIleCAleCAleCAlbHgiLAorCQkJJmJ1cywgJnZlbmRvciwgJnByb2R1Y3QsICZkcml2ZXJfZGF0YSk7CisJaWYgKHJldCA8IDMpCisJCXJldHVybiAtRUlOVkFMOworCisJZHluaWQgPSBremFsbG9jKHNpemVvZigqZHluaWQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWR5bmlkKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWR5bmlkLT5pZC5idXMgPSBidXM7CisJZHluaWQtPmlkLnZlbmRvciA9IHZlbmRvcjsKKwlkeW5pZC0+aWQucHJvZHVjdCA9IHByb2R1Y3Q7CisJZHluaWQtPmlkLmRyaXZlcl9kYXRhID0gZHJpdmVyX2RhdGE7CisKKwlzcGluX2xvY2soJmhkcnYtPmR5bl9sb2NrKTsKKwlsaXN0X2FkZF90YWlsKCZkeW5pZC0+bGlzdCwgJmhkcnYtPmR5bl9saXN0KTsKKwlzcGluX3VubG9jaygmaGRydi0+ZHluX2xvY2spOworCisJcmV0ID0gMDsKKwlpZiAoZ2V0X2RyaXZlcigmaGRydi0+ZHJpdmVyKSkgeworCQlyZXQgPSBkcml2ZXJfYXR0YWNoKCZoZHJ2LT5kcml2ZXIpOworCQlwdXRfZHJpdmVyKCZoZHJ2LT5kcml2ZXIpOworCX0KKworCXJldHVybiByZXQgPyA6IGNvdW50OworfQorc3RhdGljIERSSVZFUl9BVFRSKG5ld19pZCwgU19JV1VTUiwgTlVMTCwgc3RvcmVfbmV3X2lkKTsKKworc3RhdGljIHZvaWQgaGlkX2ZyZWVfZHluaWRzKHN0cnVjdCBoaWRfZHJpdmVyICpoZHJ2KQoreworCXN0cnVjdCBoaWRfZHluaWQgKmR5bmlkLCAqbjsKKworCXNwaW5fbG9jaygmaGRydi0+ZHluX2xvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShkeW5pZCwgbiwgJmhkcnYtPmR5bl9saXN0LCBsaXN0KSB7CisJCWxpc3RfZGVsKCZkeW5pZC0+bGlzdCk7CisJCWtmcmVlKGR5bmlkKTsKKwl9CisJc3Bpbl91bmxvY2soJmhkcnYtPmR5bl9sb2NrKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBoaWRfZGV2aWNlX2lkICpoaWRfbWF0Y2hfZGV2aWNlKHN0cnVjdCBoaWRfZGV2aWNlICpoZGV2LAorCQlzdHJ1Y3QgaGlkX2RyaXZlciAqaGRydikKK3sKKwlzdHJ1Y3QgaGlkX2R5bmlkICpkeW5pZDsKKworCXNwaW5fbG9jaygmaGRydi0+ZHluX2xvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnkoZHluaWQsICZoZHJ2LT5keW5fbGlzdCwgbGlzdCkgeworCQlpZiAoaGlkX21hdGNoX29uZV9pZChoZGV2LCAmZHluaWQtPmlkKSkgeworCQkJc3Bpbl91bmxvY2soJmhkcnYtPmR5bl9sb2NrKTsKKwkJCXJldHVybiAmZHluaWQtPmlkOworCQl9CisJfQorCXNwaW5fdW5sb2NrKCZoZHJ2LT5keW5fbG9jayk7CisKKwlyZXR1cm4gaGlkX21hdGNoX2lkKGhkZXYsIGhkcnYtPmlkX3RhYmxlKTsKK30KKwogc3RhdGljIGludCBoaWRfYnVzX21hdGNoKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9kcml2ZXIgKmRydikKIHsKIAlzdHJ1Y3QgaGlkX2RyaXZlciAqaGRydiA9IGNvbnRhaW5lcl9vZihkcnYsIHN0cnVjdCBoaWRfZHJpdmVyLCBkcml2ZXIpOwogCXN0cnVjdCBoaWRfZGV2aWNlICpoZGV2ID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IGhpZF9kZXZpY2UsIGRldik7CiAKLQlpZiAoIWhpZF9tYXRjaF9pZChoZGV2LCBoZHJ2LT5pZF90YWJsZSkpCisJaWYgKCFoaWRfbWF0Y2hfZGV2aWNlKGhkZXYsIGhkcnYpKQogCQlyZXR1cm4gMDsKIAogCS8qIGdlbmVyaWMgd2FudHMgYWxsIG5vbi1ibGFja2xpc3RlZCAqLwpAQCAtMTMzMiw3ICsxNDEwLDcgQEAKIAlpbnQgcmV0ID0gMDsKIAogCWlmICghaGRldi0+ZHJpdmVyKSB7Ci0JCWlkID0gaGlkX21hdGNoX2lkKGhkZXYsIGhkcnYtPmlkX3RhYmxlKTsKKwkJaWQgPSBoaWRfbWF0Y2hfZGV2aWNlKGhkZXYsIGhkcnYpOwogCQlpZiAoaWQgPT0gTlVMTCkKIAkJCXJldHVybiAtRU5PREVWOwogCkBAIC0xNDIwLDYgKzE0OTgsNyBAQAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9DTUVESUEsIFVTQl9ERVZJQ0VfSURfQ00xMDkpIH0sCiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0NZUFJFU1MsIFVTQl9ERVZJQ0VfSURfQ1lQUkVTU19ISURDT00pIH0sCiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0NZUFJFU1MsIFVTQl9ERVZJQ0VfSURfQ1lQUkVTU19VTFRSQU1PVVNFKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9ERUFMRVhUUkVBTUUsIFVTQl9ERVZJQ0VfSURfREVBTEVYVFJFQU1FX1JBRElPX1NJNDcwMSkgfSwKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfREVMT1JNRSwgVVNCX0RFVklDRV9JRF9ERUxPUk1FX0VBUlRITUFURSkgfSwKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfREVMT1JNRSwgVVNCX0RFVklDRV9JRF9ERUxPUk1FX0VNX0xUMjApIH0sCiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0VTU0VOVElBTF9SRUFMSVRZLCBVU0JfREVWSUNFX0lEX0VTU0VOVElBTF9SRUFMSVRZX1A1KSB9LApAQCAtMTU3Nyw2ICsxNjU2LDkgQEAKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfV0VMTFNQUklORzJfQU5TSSkgfSwKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfV0VMTFNQUklORzJfSVNPKSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9XRUxMU1BSSU5HMl9KSVMpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX1dFTExTUFJJTkczX0FOU0kpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX1dFTExTUFJJTkczX0lTTykgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfV0VMTFNQUklORzNfSklTKSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9GT1VOVEFJTl9UUF9PTkxZKSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9HRVlTRVIxX1RQX09OTFkpIH0sCiAJeyB9CkBAIC0xNjE4LDkgKzE3MDAsMTAgQEAKIAlpZiAoaGlkX2lnbm9yZShoZGV2KSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQkvKiBYWFggaGFjaywgYW55IG90aGVyIGNsZWFuZXIgc29sdXRpb24gPCAyMCBidXNfaWQgYnl0ZXM/ICovCi0Jc3ByaW50ZihoZGV2LT5kZXYuYnVzX2lkLCAiJTA0WDolMDRYOiUwNFguJTA0WCIsIGhkZXYtPmJ1cywKLQkJCWhkZXYtPnZlbmRvciwgaGRldi0+cHJvZHVjdCwgYXRvbWljX2luY19yZXR1cm4oJmlkKSk7CisJLyogWFhYIGhhY2ssIGFueSBvdGhlciBjbGVhbmVyIHNvbHV0aW9uIGFmdGVyIHRoZSBkcml2ZXIgY29yZQorCSAqIGlzIGNvbnZlcnRlZCB0byBhbGxvdyBtb3JlIHRoYW4gMjAgYnl0ZXMgYXMgdGhlIGRldmljZSBuYW1lPyAqLworCWRldl9zZXRfbmFtZSgmaGRldi0+ZGV2LCAiJTA0WDolMDRYOiUwNFguJTA0WCIsIGhkZXYtPmJ1cywKKwkJICAgICBoZGV2LT52ZW5kb3IsIGhkZXYtPnByb2R1Y3QsIGF0b21pY19pbmNfcmV0dXJuKCZpZCkpOwogCiAJcmV0ID0gZGV2aWNlX2FkZCgmaGRldi0+ZGV2KTsKIAlpZiAoIXJldCkKQEAgLTE2OTUsMTggKzE3NzgsMzMgQEAKIGludCBfX2hpZF9yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IGhpZF9kcml2ZXIgKmhkcnYsIHN0cnVjdCBtb2R1bGUgKm93bmVyLAogCQljb25zdCBjaGFyICptb2RfbmFtZSkKIHsKKwlpbnQgcmV0OworCiAJaGRydi0+ZHJpdmVyLm5hbWUgPSBoZHJ2LT5uYW1lOwogCWhkcnYtPmRyaXZlci5idXMgPSAmaGlkX2J1c190eXBlOwogCWhkcnYtPmRyaXZlci5vd25lciA9IG93bmVyOwogCWhkcnYtPmRyaXZlci5tb2RfbmFtZSA9IG1vZF9uYW1lOwogCi0JcmV0dXJuIGRyaXZlcl9yZWdpc3RlcigmaGRydi0+ZHJpdmVyKTsKKwlJTklUX0xJU1RfSEVBRCgmaGRydi0+ZHluX2xpc3QpOworCXNwaW5fbG9ja19pbml0KCZoZHJ2LT5keW5fbG9jayk7CisKKwlyZXQgPSBkcml2ZXJfcmVnaXN0ZXIoJmhkcnYtPmRyaXZlcik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IGRyaXZlcl9jcmVhdGVfZmlsZSgmaGRydi0+ZHJpdmVyLCAmZHJpdmVyX2F0dHJfbmV3X2lkKTsKKwlpZiAocmV0KQorCQlkcml2ZXJfdW5yZWdpc3RlcigmaGRydi0+ZHJpdmVyKTsKKworCXJldHVybiByZXQ7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChfX2hpZF9yZWdpc3Rlcl9kcml2ZXIpOwogCiB2b2lkIGhpZF91bnJlZ2lzdGVyX2RyaXZlcihzdHJ1Y3QgaGlkX2RyaXZlciAqaGRydikKIHsKKwlkcml2ZXJfcmVtb3ZlX2ZpbGUoJmhkcnYtPmRyaXZlciwgJmRyaXZlcl9hdHRyX25ld19pZCk7CiAJZHJpdmVyX3VucmVnaXN0ZXIoJmhkcnYtPmRyaXZlcik7CisJaGlkX2ZyZWVfZHluaWRzKGhkcnYpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoaGlkX3VucmVnaXN0ZXJfZHJpdmVyKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkLWRlbGwuYyBiL2RyaXZlcnMvaGlkL2hpZC1kZWxsLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1NDc0MzAwLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvaGlkL2hpZC1kZWxsLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKgotICogIEhJRCBkcml2ZXIgZm9yIHNvbWUgZGVsbCAic3BlY2lhbCIgZGV2aWNlcwotICoKLSAqICBDb3B5cmlnaHQgKGMpIDE5OTkgQW5kcmVhcyBHYWwKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNSBWb2p0ZWNoIFBhdmxpayA8dm9qdGVjaEBzdXNlLmN6PgotICogIENvcHlyaWdodCAoYykgMjAwNSBNaWNoYWVsIEhhYm91c3RhayA8bWlrZS1AY2luY2kucnIuY29tPiBmb3IgQ29uY2VwdDIsIEluYwotICogIENvcHlyaWdodCAoYykgMjAwNi0yMDA3IEppcmkgS29zaW5hCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA3IFBhdWwgV2FsbXNsZXkKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDggSmlyaSBTbGFieQotICovCi0KLS8qCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAqIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAqIGFueSBsYXRlciB2ZXJzaW9uLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9oaWQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLQotI2luY2x1ZGUgImhpZC1pZHMuaCIKLQotc3RhdGljIGludCBkZWxsX3Byb2JlKHN0cnVjdCBoaWRfZGV2aWNlICpoZGV2LCBjb25zdCBzdHJ1Y3QgaGlkX2RldmljZV9pZCAqaWQpCi17Ci0JaW50IHJldDsKLQotCXJldCA9IGhpZF9wYXJzZShoZGV2KTsKLQlpZiAocmV0KSB7Ci0JCWRldl9lcnIoJmhkZXYtPmRldiwgInBhcnNlIGZhaWxlZFxuIik7Ci0JCWdvdG8gZXJyX2ZyZWU7Ci0JfQotCi0JcmV0ID0gaGlkX2h3X3N0YXJ0KGhkZXYsIEhJRF9DT05ORUNUX0RFRkFVTFQpOwotCWlmIChyZXQpIHsKLQkJZGV2X2VycigmaGRldi0+ZGV2LCAiaHcgc3RhcnQgZmFpbGVkXG4iKTsKLQkJZ290byBlcnJfZnJlZTsKLQl9Ci0KLQl1c2JoaWRfc2V0X2xlZHMoaGRldik7Ci0KLQlyZXR1cm4gMDsKLWVycl9mcmVlOgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGlkX2RldmljZV9pZCBkZWxsX2RldmljZXNbXSA9IHsKLQl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfREVMTCwgVVNCX0RFVklDRV9JRF9ERUxMX1c3NjU4KSB9LAotCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9ERUxMLCBVU0JfREVWSUNFX0lEX0RFTExfU0s4MTE1KSB9LAotCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9HRU5FUklDXzEzQkEsIFVTQl9ERVZJQ0VfSURfR0VORVJJQ18xM0JBX0tCRF9NT1VTRSkgfSwKLQl7IH0KLX07Ci1NT0RVTEVfREVWSUNFX1RBQkxFKGhpZCwgZGVsbF9kZXZpY2VzKTsKLQotc3RhdGljIHN0cnVjdCBoaWRfZHJpdmVyIGRlbGxfZHJpdmVyID0gewotCS5uYW1lID0gImRlbGwiLAotCS5pZF90YWJsZSA9IGRlbGxfZGV2aWNlcywKLQkucHJvYmUgPSBkZWxsX3Byb2JlLAotfTsKLQotc3RhdGljIGludCBkZWxsX2luaXQodm9pZCkKLXsKLQlyZXR1cm4gaGlkX3JlZ2lzdGVyX2RyaXZlcigmZGVsbF9kcml2ZXIpOwotfQotCi1zdGF0aWMgdm9pZCBkZWxsX2V4aXQodm9pZCkKLXsKLQloaWRfdW5yZWdpc3Rlcl9kcml2ZXIoJmRlbGxfZHJpdmVyKTsKLX0KLQotbW9kdWxlX2luaXQoZGVsbF9pbml0KTsKLW1vZHVsZV9leGl0KGRlbGxfZXhpdCk7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci0KLUhJRF9DT01QQVRfTE9BRF9EUklWRVIoZGVsbCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9oaWQtZHVtbXkuYyBiL2RyaXZlcnMvaGlkL2hpZC1kdW1teS5jCmluZGV4IGUxNDhmODYuLmI0Y2MwZjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL2hpZC1kdW1teS5jCisrKyBiL2RyaXZlcnMvaGlkL2hpZC1kdW1teS5jCkBAIC00Myw2ICs0Myw5IEBACiAjaWZkZWYgQ09ORklHX0hJRF9NT05URVJFWV9NT0RVTEUKIAlISURfQ09NUEFUX0NBTExfRFJJVkVSKG1vbnRlcmV5KTsKICNlbmRpZgorI2lmZGVmIENPTkZJR19ISURfTlRSSUdfTU9EVUxFCisJSElEX0NPTVBBVF9DQUxMX0RSSVZFUihudHJpZyk7CisjZW5kaWYKICNpZmRlZiBDT05GSUdfSElEX1BBTlRIRVJMT1JEX01PRFVMRQogCUhJRF9DT01QQVRfQ0FMTF9EUklWRVIocGFudGhlcmxvcmQpOwogI2VuZGlmCkBAIC01OCw2ICs2MSw5IEBACiAjaWZkZWYgQ09ORklHX0hJRF9TVU5QTFVTX01PRFVMRQogCUhJRF9DT01QQVRfQ0FMTF9EUklWRVIoc3VucGx1cyk7CiAjZW5kaWYKKyNpZmRlZiBDT05GSUdfR1JFRU5BU0lBX0ZGX01PRFVMRQorCUhJRF9DT01QQVRfQ0FMTF9EUklWRVIoZ3JlZW5hc2lhKTsKKyNlbmRpZgogI2lmZGVmIENPTkZJR19USFJVU1RNQVNURVJfRkZfTU9EVUxFCiAJSElEX0NPTVBBVF9DQUxMX0RSSVZFUih0aHJ1c3RtYXN0ZXIpOwogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9oaWQtZ2FmZi5jIGIvZHJpdmVycy9oaWQvaGlkLWdhZmYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTIxMWY2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9oaWQvaGlkLWdhZmYuYwpAQCAtMCwwICsxLDE4NSBAQAorLyoKKyAqICBGb3JjZSBmZWVkYmFjayBzdXBwb3J0IGZvciBHcmVlbkFzaWEgKFByb2R1Y3QgSUQgMHgxMikgYmFzZWQgZGV2aWNlcworICoKKyAqICBUaGUgZGV2aWNlcyBhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdmFyaW91cyBuYW1lcyBhbmQgdGhlIHNhbWUgVVNCIGRldmljZSBJRAorICogIGNhbiBiZSB1c2VkIGluIG1hbnkgZ2FtZSBjb250cm9sbGVycy4KKyAqCisgKgorICogIDBlOGY6MDAxMiAiR3JlZW5Bc2lhIEluYy4gICAgVVNCIEpveXN0aWNrICAgICAiCisgKiAgIC0gdGVzdGVkIHdpdGggTUFOVEEgV2FyaW9yIE1NODE2IGFuZCBTcGVlZExpbmsgU3RyaWtlMiBTTC02NjM1LgorICoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDggTHVrYXN6IEx1Ym9qYW5za2kgPGx1a2FzekBsdWJvamFuc2tpLmluZm8+CisgKi8KKworLyoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CisjaW5jbHVkZSA8bGludXgvdXNiLmg+CisjaW5jbHVkZSA8bGludXgvaGlkLmg+CisjaW5jbHVkZSAiaGlkLWlkcy5oIgorI2luY2x1ZGUgInVzYmhpZC91c2JoaWQuaCIKKworc3RydWN0IGdhZmZfZGV2aWNlIHsKKwlzdHJ1Y3QgaGlkX3JlcG9ydCAqcmVwb3J0OworfTsKKworc3RhdGljIGludCBoaWRfZ2FmZl9wbGF5KHN0cnVjdCBpbnB1dF9kZXYgKmRldiwgdm9pZCAqZGF0YSwKKwkJCSBzdHJ1Y3QgZmZfZWZmZWN0ICplZmZlY3QpCit7CisJc3RydWN0IGhpZF9kZXZpY2UgKmhpZCA9IGlucHV0X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGdhZmZfZGV2aWNlICpnYWZmID0gZGF0YTsKKwlpbnQgbGVmdCwgcmlnaHQ7CisKKwlsZWZ0ID0gZWZmZWN0LT51LnJ1bWJsZS5zdHJvbmdfbWFnbml0dWRlOworCXJpZ2h0ID0gZWZmZWN0LT51LnJ1bWJsZS53ZWFrX21hZ25pdHVkZTsKKworCWRiZ19oaWQoImNhbGxlZCB3aXRoIDB4JTA0eCAweCUwNHgiLCBsZWZ0LCByaWdodCk7CisKKwlsZWZ0ID0gbGVmdCAqIDB4ZmUgLyAweGZmZmY7CisJcmlnaHQgPSByaWdodCAqIDB4ZmUgLyAweGZmZmY7CisKKwlnYWZmLT5yZXBvcnQtPmZpZWxkWzBdLT52YWx1ZVswXSA9IDB4NTE7CisJZ2FmZi0+cmVwb3J0LT5maWVsZFswXS0+dmFsdWVbMV0gPSAweDA7CisJZ2FmZi0+cmVwb3J0LT5maWVsZFswXS0+dmFsdWVbMl0gPSByaWdodDsKKwlnYWZmLT5yZXBvcnQtPmZpZWxkWzBdLT52YWx1ZVszXSA9IDA7CisJZ2FmZi0+cmVwb3J0LT5maWVsZFswXS0+dmFsdWVbNF0gPSBsZWZ0OworCWdhZmYtPnJlcG9ydC0+ZmllbGRbMF0tPnZhbHVlWzVdID0gMDsKKwlkYmdfaGlkKCJydW5uaW5nIHdpdGggMHglMDJ4IDB4JTAyeCIsIGxlZnQsIHJpZ2h0KTsKKwl1c2JoaWRfc3VibWl0X3JlcG9ydChoaWQsIGdhZmYtPnJlcG9ydCwgVVNCX0RJUl9PVVQpOworCisJZ2FmZi0+cmVwb3J0LT5maWVsZFswXS0+dmFsdWVbMF0gPSAweGZhOworCWdhZmYtPnJlcG9ydC0+ZmllbGRbMF0tPnZhbHVlWzFdID0gMHhmZTsKKwlnYWZmLT5yZXBvcnQtPmZpZWxkWzBdLT52YWx1ZVsyXSA9IDB4MDsKKwlnYWZmLT5yZXBvcnQtPmZpZWxkWzBdLT52YWx1ZVs0XSA9IDB4MDsKKworCXVzYmhpZF9zdWJtaXRfcmVwb3J0KGhpZCwgZ2FmZi0+cmVwb3J0LCBVU0JfRElSX09VVCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnYWZmX2luaXQoc3RydWN0IGhpZF9kZXZpY2UgKmhpZCkKK3sKKwlzdHJ1Y3QgZ2FmZl9kZXZpY2UgKmdhZmY7CisJc3RydWN0IGhpZF9yZXBvcnQgKnJlcG9ydDsKKwlzdHJ1Y3QgaGlkX2lucHV0ICpoaWRpbnB1dCA9IGxpc3RfZW50cnkoaGlkLT5pbnB1dHMubmV4dCwKKwkJCQkJCXN0cnVjdCBoaWRfaW5wdXQsIGxpc3QpOworCXN0cnVjdCBsaXN0X2hlYWQgKnJlcG9ydF9saXN0ID0KKwkJCSZoaWQtPnJlcG9ydF9lbnVtW0hJRF9PVVRQVVRfUkVQT1JUXS5yZXBvcnRfbGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpyZXBvcnRfcHRyID0gcmVwb3J0X2xpc3Q7CisJc3RydWN0IGlucHV0X2RldiAqZGV2ID0gaGlkaW5wdXQtPmlucHV0OworCWludCBlcnJvcjsKKworCWlmIChsaXN0X2VtcHR5KHJlcG9ydF9saXN0KSkgeworCQlkZXZfZXJyKCZoaWQtPmRldiwgIm5vIG91dHB1dCByZXBvcnRzIGZvdW5kXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJcmVwb3J0X3B0ciA9IHJlcG9ydF9wdHItPm5leHQ7CisKKwlyZXBvcnQgPSBsaXN0X2VudHJ5KHJlcG9ydF9wdHIsIHN0cnVjdCBoaWRfcmVwb3J0LCBsaXN0KTsKKwlpZiAocmVwb3J0LT5tYXhmaWVsZCA8IDEpIHsKKwkJZGV2X2VycigmaGlkLT5kZXYsICJubyBmaWVsZHMgaW4gdGhlIHJlcG9ydFxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWlmIChyZXBvcnQtPmZpZWxkWzBdLT5yZXBvcnRfY291bnQgPCA2KSB7CisJCWRldl9lcnIoJmhpZC0+ZGV2LCAibm90IGVub3VnaCB2YWx1ZXMgaW4gdGhlIGZpZWxkXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJZ2FmZiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBnYWZmX2RldmljZSksIEdGUF9LRVJORUwpOworCWlmICghZ2FmZikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlzZXRfYml0KEZGX1JVTUJMRSwgZGV2LT5mZmJpdCk7CisKKwllcnJvciA9IGlucHV0X2ZmX2NyZWF0ZV9tZW1sZXNzKGRldiwgZ2FmZiwgaGlkX2dhZmZfcGxheSk7CisJaWYgKGVycm9yKSB7CisJCWtmcmVlKGdhZmYpOworCQlyZXR1cm4gZXJyb3I7CisJfQorCisJZ2FmZi0+cmVwb3J0ID0gcmVwb3J0OworCWdhZmYtPnJlcG9ydC0+ZmllbGRbMF0tPnZhbHVlWzBdID0gMHg1MTsKKwlnYWZmLT5yZXBvcnQtPmZpZWxkWzBdLT52YWx1ZVsxXSA9IDB4MDA7CisJZ2FmZi0+cmVwb3J0LT5maWVsZFswXS0+dmFsdWVbMl0gPSAweDAwOworCWdhZmYtPnJlcG9ydC0+ZmllbGRbMF0tPnZhbHVlWzNdID0gMHgwMDsKKwl1c2JoaWRfc3VibWl0X3JlcG9ydChoaWQsIGdhZmYtPnJlcG9ydCwgVVNCX0RJUl9PVVQpOworCisJZ2FmZi0+cmVwb3J0LT5maWVsZFswXS0+dmFsdWVbMF0gPSAweGZhOworCWdhZmYtPnJlcG9ydC0+ZmllbGRbMF0tPnZhbHVlWzFdID0gMHhmZTsKKworCXVzYmhpZF9zdWJtaXRfcmVwb3J0KGhpZCwgZ2FmZi0+cmVwb3J0LCBVU0JfRElSX09VVCk7CisKKwlkZXZfaW5mbygmaGlkLT5kZXYsICJGb3JjZSBGZWVkYmFjayBmb3IgR3JlZW5Bc2lhIDB4MTIiCisJICAgICAgICIgZGV2aWNlcyBieSBMdWthc3ogTHVib2phbnNraSA8bHVrYXN6QGx1Ym9qYW5za2kuaW5mbz5cbiIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2FfcHJvYmUoc3RydWN0IGhpZF9kZXZpY2UgKmhkZXYsIGNvbnN0IHN0cnVjdCBoaWRfZGV2aWNlX2lkICppZCkKK3sKKwlpbnQgcmV0OworCisJZGV2X2RiZygmaGRldi0+ZGV2LCAiR3JlZW5hc2lhIEhJRCBoYXJkd2FyZSBwcm9iZS4uLiIpOworCisJcmV0ID0gaGlkX3BhcnNlKGhkZXYpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmaGRldi0+ZGV2LCAicGFyc2UgZmFpbGVkXG4iKTsKKwkJZ290byBlcnI7CisJfQorCisJcmV0ID0gaGlkX2h3X3N0YXJ0KGhkZXYsIEhJRF9DT05ORUNUX0RFRkFVTFQgJiB+SElEX0NPTk5FQ1RfRkYpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmaGRldi0+ZGV2LCAiaHcgc3RhcnQgZmFpbGVkXG4iKTsKKwkJZ290byBlcnI7CisJfQorCisJZ2FmZl9pbml0KGhkZXYpOworCisJcmV0dXJuIDA7CitlcnI6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBoaWRfZGV2aWNlX2lkIGdhX2RldmljZXNbXSA9IHsKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfR1JFRU5BU0lBLCAweDAwMTIpLCAgfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGhpZCwgZ2FfZGV2aWNlcyk7CisKK3N0YXRpYyBzdHJ1Y3QgaGlkX2RyaXZlciBnYV9kcml2ZXIgPSB7CisJLm5hbWUgPSAiZ3JlZW5hc2lhIiwKKwkuaWRfdGFibGUgPSBnYV9kZXZpY2VzLAorCS5wcm9iZSA9IGdhX3Byb2JlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgZ2FfaW5pdCh2b2lkKQoreworCXJldHVybiBoaWRfcmVnaXN0ZXJfZHJpdmVyKCZnYV9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZ2FfZXhpdCh2b2lkKQoreworCWhpZF91bnJlZ2lzdGVyX2RyaXZlcigmZ2FfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoZ2FfaW5pdCk7Cittb2R1bGVfZXhpdChnYV9leGl0KTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworSElEX0NPTVBBVF9MT0FEX0RSSVZFUihncmVlbmFzaWEpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkLWlkcy5oIGIvZHJpdmVycy9oaWQvaGlkLWlkcy5oCmluZGV4IDM5Mjg5NjkuLmFjYzFhYmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL2hpZC1pZHMuaAorKysgYi9kcml2ZXJzL2hpZC9oaWQtaWRzLmgKQEAgLTEwNyw5ICsxMDcsNiBAQAogI2RlZmluZSBVU0JfVkVORE9SX0lEX0JFTEtJTiAgICAgICAgICAgMHgwNTBkCiAjZGVmaW5lIFVTQl9ERVZJQ0VfSURfRkxJUF9LVk0gICAgICAgICAweDMyMDEKIAotI2RlZmluZSBVU0JfVkVORE9SX0lEX0JSSUdIVAkJMHgxMjQxCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfQlJJR0hUX0FCTlQyCTB4MTUwMwotCiAjZGVmaW5lIFVTQl9WRU5ET1JfSURfQkVSS1NISVJFCQkweDBjOTgKICNkZWZpbmUgVVNCX0RFVklDRV9JRF9CRVJLU0hJUkVfUENXRAkweDExNDAKIApAQCAtMTQxLDkgKzEzOCw4IEBACiAjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQ1lQUkVTU19CQVJDT0RFXzEJMHhkZTYxCiAjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQ1lQUkVTU19CQVJDT0RFXzIJMHhkZTY0CiAKLSNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9ERUxMCQkweDQxM2MKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9ERUxMX1c3NjU4CTB4MjAwNQotI2RlZmluZSBVU0JfREVWSUNFX0lEX0RFTExfU0s4MTE1CTB4MjEwNQorI2RlZmluZSBVU0JfVkVORE9SX0lEX0RFQUxFWFRSRUFNRQkweDEwYzUKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9ERUFMRVhUUkVBTUVfUkFESU9fU0k0NzAxCTB4ODE5YQogCiAjZGVmaW5lIFVTQl9WRU5ET1JfSURfREVMT1JNRQkJMHgxMTYzCiAjZGVmaW5lIFVTQl9ERVZJQ0VfSURfREVMT1JNRV9FQVJUSE1BVEUgMHgwMTAwCkBAIC0xNjcsOSArMTYzLDYgQEAKIAogI2RlZmluZSBVU0JfVkVORE9SX0lEX0dFTkVSQUxfVE9VQ0gJMHgwZGZjCiAKLSNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9HRU5FUklDXzEzQkEJMHgxM2JhCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfR0VORVJJQ18xM0JBX0tCRF9NT1VTRQkweDAwMTcKLQogI2RlZmluZSBVU0JfVkVORE9SX0lEX0dMQUIJCTB4MDZjMgogI2RlZmluZSBVU0JfREVWSUNFX0lEXzRfUEhJREdFVFNFUlZPXzMwCTB4MDAzOAogI2RlZmluZSBVU0JfREVWSUNFX0lEXzFfUEhJREdFVFNFUlZPXzMwCTB4MDAzOQpAQCAtMjkyLDcgKzI4NSw2IEBACiAjZGVmaW5lIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfV0hFRUwJMHhjMjk0CiAjZGVmaW5lIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfTU9NT19XSEVFTAkweGMyOTUKICNkZWZpbmUgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9FTElURV9LQkQJMHhjMzBhCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfS0JECTB4YzMxMQogI2RlZmluZSBVU0JfREVWSUNFX0lEX1M1MTBfUkVDRUlWRVIJMHhjNTBjCiAjZGVmaW5lIFVTQl9ERVZJQ0VfSURfUzUxMF9SRUNFSVZFUl8yCTB4YzUxNwogI2RlZmluZSBVU0JfREVWSUNFX0lEX0xPR0lURUNIX0NPUkRMRVNTX0RFU0tUT1BfTFg1MDAJMHhjNTEyCkBAIC0zMzksNiArMzMxLDkgQEAKICNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9ORUMJCTB4MDczZQogI2RlZmluZSBVU0JfREVWSUNFX0lEX05FQ19VU0JfR0FNRV9QQUQJMHgwMzAxCiAKKyNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9OVFJJRyAgICAgICAgICAgICAgICAweDFiOTYKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9OVFJJR19UT1VDSF9TQ1JFRU4gICAweDAwMDEKKwogI2RlZmluZSBVU0JfVkVORE9SX0lEX09OVFJBSwkJMHgwYTA3CiAjZGVmaW5lIFVTQl9ERVZJQ0VfSURfT05UUkFLX0FEVTEwMAkweDAwNjQKIApAQCAtMzgzLDkgKzM3OCwxNSBAQAogI2RlZmluZSBVU0JfVkVORE9SX0lEX1RPUE1BWAkJMHgwNjYzCiAjZGVmaW5lIFVTQl9ERVZJQ0VfSURfVE9QTUFYX0NPQlJBUEFECTB4MDEwMwogCisjZGVmaW5lIFVTQl9WRU5ET1JfSURfVE9QU0VFRAkJMHgwNzY2CisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfVE9QU0VFRF9DWUJFUkxJTksJMHgwMjA0CisKICNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9UVVJCT1gJCTB4MDYyYQogI2RlZmluZSBVU0JfREVWSUNFX0lEX1RVUkJPWF9LRVlCT0FSRAkweDAyMDEKIAorI2RlZmluZSBVU0JfVkVORE9SX0lEX1VDTE9HSUMJCTB4NTU0MworI2RlZmluZSBVU0JfREVWSUNFX0lEX1VDTE9HSUNfVEFCTEVUX1BGMTIwOQkweDAwNDIKKwogI2RlZmluZSBVU0JfVkVORE9SX0lEX1ZFUk5JRVIJCTB4MDhmNwogI2RlZmluZSBVU0JfREVWSUNFX0lEX1ZFUk5JRVJfTEFCUFJPCTB4MDAwMQogI2RlZmluZSBVU0JfREVWSUNFX0lEX1ZFUk5JRVJfR09URU1QCTB4MDAwMgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkLWxnLmMgYi9kcml2ZXJzL2hpZC9oaWQtbGcuYwppbmRleCAyYmFlMzQwLi44M2UwN2M5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC9oaWQtbGcuYworKysgYi9kcml2ZXJzL2hpZC9oaWQtbGcuYwpAQCAtMjYsNyArMjYsNiBAQAogI2RlZmluZSBMR19SREVTQwkJMHgwMDEKICNkZWZpbmUgTEdfQkFEX1JFTEFUSVZFX0tFWVMJMHgwMDIKICNkZWZpbmUgTEdfRFVQTElDQVRFX1VTQUdFUwkweDAwNAotI2RlZmluZSBMR19SRVNFVF9MRURTCQkweDAwOAogI2RlZmluZSBMR19FWFBBTkRFRF9LRVlNQVAJMHgwMTAKICNkZWZpbmUgTEdfSUdOT1JFX0RPVUJMRURfV0hFRUwJMHgwMjAKICNkZWZpbmUgTEdfV0lSRUxFU1MJCTB4MDQwCkBAIC0yNDgsOSArMjQ3LDYgQEAKIAkJZ290byBlcnJfZnJlZTsKIAl9CiAKLQlpZiAocXVpcmtzICYgTEdfUkVTRVRfTEVEUykKLQkJdXNiaGlkX3NldF9sZWRzKGhkZXYpOwotCiAJaWYgKHF1aXJrcyAmIExHX0ZGKQogCQlsZ2ZmX2luaXQoaGRldik7CiAJaWYgKHF1aXJrcyAmIExHX0ZGMikKQEAgLTI3OSw5ICsyNzUsNiBAQAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9MT0dJVEVDSCwgVVNCX0RFVklDRV9JRF9ESU5PVk9fTUlOSSksCiAJCS5kcml2ZXJfZGF0YSA9IExHX0RVUExJQ0FURV9VU0FHRVMgfSwKIAotCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9MT0dJVEVDSCwgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9LQkQpLAotCQkuZHJpdmVyX2RhdGEgPSBMR19SRVNFVF9MRURTIH0sCi0KIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfTE9HSVRFQ0gsIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfRUxJVEVfS0JEKSwKIAkJLmRyaXZlcl9kYXRhID0gTEdfSUdOT1JFX0RPVUJMRURfV0hFRUwgfCBMR19FWFBBTkRFRF9LRVlNQVAgfSwKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfTE9HSVRFQ0gsIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfQ09SRExFU1NfREVTS1RPUF9MWDUwMCksCmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9oaWQtbnRyaWcuYyBiL2RyaXZlcnMvaGlkL2hpZC1udHJpZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiNDRmYmQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2hpZC9oaWQtbnRyaWcuYwpAQCAtMCwwICsxLDgyIEBACisvKgorICogIEhJRCBkcml2ZXIgZm9yIHNvbWUgbnRyaWcgInNwZWNpYWwiIGRldmljZXMKKyAqCisgKiAgQ29weXJpZ2h0IChjKSAxOTk5IEFuZHJlYXMgR2FsCisgKiAgQ29weXJpZ2h0IChjKSAyMDAwLTIwMDUgVm9qdGVjaCBQYXZsaWsgPHZvanRlY2hAc3VzZS5jej4KKyAqICBDb3B5cmlnaHQgKGMpIDIwMDUgTWljaGFlbCBIYWJvdXN0YWsgPG1pa2UtQGNpbmNpLnJyLmNvbT4gZm9yIENvbmNlcHQyLCBJbmMKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBKaXJpIEtvc2luYQorICogIENvcHlyaWdodCAoYykgMjAwNyBQYXVsIFdhbG1zbGV5CisgKiAgQ29weXJpZ2h0IChjKSAyMDA4IEppcmkgU2xhYnkKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDggUmFmaSBSdWJpbgorICoKKyAqLworCisvKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaGlkLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlICJoaWQtaWRzLmgiCisKKyNkZWZpbmUgTlRSSUdfRFVQTElDQVRFX1VTQUdFUwkweDAwMQorCisjZGVmaW5lIG50X21hcF9rZXlfY2xlYXIoYykJaGlkX21hcF91c2FnZV9jbGVhcihoaSwgdXNhZ2UsIGJpdCwgbWF4LCBcCisJCQkJCUVWX0tFWSwgKGMpKQorCitzdGF0aWMgaW50IG50cmlnX2lucHV0X21hcHBpbmcoc3RydWN0IGhpZF9kZXZpY2UgKmhkZXYsIHN0cnVjdCBoaWRfaW5wdXQgKmhpLAorCQlzdHJ1Y3QgaGlkX2ZpZWxkICpmaWVsZCwgc3RydWN0IGhpZF91c2FnZSAqdXNhZ2UsCisJCXVuc2lnbmVkIGxvbmcgKipiaXQsIGludCAqbWF4KQoreworCWlmICgodXNhZ2UtPmhpZCAmIEhJRF9VU0FHRV9QQUdFKSA9PSBISURfVVBfRElHSVRJWkVSICYmCisJCQkodXNhZ2UtPmhpZCAmIDB4ZmYpID09IDB4NDcpIHsKKwkJbnRfbWFwX2tleV9jbGVhcihCVE5fVE9PTF9ET1VCTEVUQVApOworCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbnRyaWdfaW5wdXRfbWFwcGVkKHN0cnVjdCBoaWRfZGV2aWNlICpoZGV2LCBzdHJ1Y3QgaGlkX2lucHV0ICpoaSwKKwkJc3RydWN0IGhpZF9maWVsZCAqZmllbGQsIHN0cnVjdCBoaWRfdXNhZ2UgKnVzYWdlLAorCQl1bnNpZ25lZCBsb25nICoqYml0LCBpbnQgKm1heCkKK3sKKwlpZiAodXNhZ2UtPnR5cGUgPT0gRVZfS0VZIHx8IHVzYWdlLT50eXBlID09IEVWX1JFTAorCQkJfHwgdXNhZ2UtPnR5cGUgPT0gRVZfQUJTKQorCQljbGVhcl9iaXQodXNhZ2UtPmNvZGUsICpiaXQpOworCisJcmV0dXJuIDA7Cit9CitzdGF0aWMgY29uc3Qgc3RydWN0IGhpZF9kZXZpY2VfaWQgbnRyaWdfZGV2aWNlc1tdID0geworCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9OVFJJRywgVVNCX0RFVklDRV9JRF9OVFJJR19UT1VDSF9TQ1JFRU4pLAorCQkuZHJpdmVyX2RhdGEgPSBOVFJJR19EVVBMSUNBVEVfVVNBR0VTIH0sCisJeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShoaWQsIG50cmlnX2RldmljZXMpOworCitzdGF0aWMgc3RydWN0IGhpZF9kcml2ZXIgbnRyaWdfZHJpdmVyID0geworCS5uYW1lID0gIm50cmlnIiwKKwkuaWRfdGFibGUgPSBudHJpZ19kZXZpY2VzLAorCS5pbnB1dF9tYXBwaW5nID0gbnRyaWdfaW5wdXRfbWFwcGluZywKKwkuaW5wdXRfbWFwcGVkID0gbnRyaWdfaW5wdXRfbWFwcGVkLAorfTsKKworc3RhdGljIGludCBudHJpZ19pbml0KHZvaWQpCit7CisJcmV0dXJuIGhpZF9yZWdpc3Rlcl9kcml2ZXIoJm50cmlnX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIG50cmlnX2V4aXQodm9pZCkKK3sKKwloaWRfdW5yZWdpc3Rlcl9kcml2ZXIoJm50cmlnX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KG50cmlnX2luaXQpOworbW9kdWxlX2V4aXQobnRyaWdfZXhpdCk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK0hJRF9DT01QQVRfTE9BRF9EUklWRVIobnRyaWcpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkLXNvbnkuYyBiL2RyaXZlcnMvaGlkL2hpZC1zb255LmMKaW5kZXggODZlNTYzYi4uZGQ1YTM5NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvaGlkLXNvbnkuYworKysgYi9kcml2ZXJzL2hpZC9oaWQtc29ueS5jCkBAIC0xMDIsNyArMTAyLDcgQEAKIAl9CiAKIAlyZXQgPSBzb255X3NldF9vcGVyYXRpb25hbChoZGV2KTsKLQlpZiAocmV0KQorCWlmIChyZXQgPCAwKQogCQlnb3RvIGVycl9zdG9wOwogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9oaWQtdG9wc2VlZC5jIGIvZHJpdmVycy9oaWQvaGlkLXRvcHNlZWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jY2E2NGEwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9oaWQvaGlkLXRvcHNlZWQuYwpAQCAtMCwwICsxLDc3IEBACisvKgorICogIEhJRCBkcml2ZXIgZm9yIFRvcFNlZWQgQ3liZXJsaW5rIHJlbW90ZQorICoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDggTGV2IEJhYmlldgorICogIGJhc2VkIG9uIGhpZC1jaGVycnkgZHJpdmVyCisgKi8KKworLyoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2hpZC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSAiaGlkLWlkcy5oIgorCisjZGVmaW5lIHRzX21hcF9rZXlfY2xlYXIoYykJaGlkX21hcF91c2FnZV9jbGVhcihoaSwgdXNhZ2UsIGJpdCwgbWF4LCBcCisJCQkJCUVWX0tFWSwgKGMpKQorc3RhdGljIGludCB0c19pbnB1dF9tYXBwaW5nKHN0cnVjdCBoaWRfZGV2aWNlICpoZGV2LCBzdHJ1Y3QgaGlkX2lucHV0ICpoaSwKKwkJc3RydWN0IGhpZF9maWVsZCAqZmllbGQsIHN0cnVjdCBoaWRfdXNhZ2UgKnVzYWdlLAorCQl1bnNpZ25lZCBsb25nICoqYml0LCBpbnQgKm1heCkKK3sKKwlpZiAoKHVzYWdlLT5oaWQgJiBISURfVVNBR0VfUEFHRSkgIT0gMHgwZmZiYzAwMDApCisJCXJldHVybiAwOworCisJc3dpdGNoICh1c2FnZS0+aGlkICYgSElEX1VTQUdFKSB7CisgICAgICAgIGNhc2UgMHgwMGQ6IHRzX21hcF9rZXlfY2xlYXIoS0VZX0hPTUUpOyAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMHgwMjQ6IHRzX21hcF9rZXlfY2xlYXIoS0VZX01FTlUpOyAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMHgwMjU6IHRzX21hcF9rZXlfY2xlYXIoS0VZX1RWKTsgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMHgwNDg6IHRzX21hcF9rZXlfY2xlYXIoS0VZX1JFRCk7ICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMHgwNDc6IHRzX21hcF9rZXlfY2xlYXIoS0VZX0dSRUVOKTsgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMHgwNDk6IHRzX21hcF9rZXlfY2xlYXIoS0VZX1lFTExPVyk7ICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMHgwNGE6IHRzX21hcF9rZXlfY2xlYXIoS0VZX0JMVUUpOyAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMHgwNGI6IHRzX21hcF9rZXlfY2xlYXIoS0VZX0FOR0xFKTsgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMHgwNGM6IHRzX21hcF9rZXlfY2xlYXIoS0VZX0xBTkdVQUdFKTsgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMHgwNGQ6IHRzX21hcF9rZXlfY2xlYXIoS0VZX1NVQlRJVExFKTsgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMHgwMzE6IHRzX21hcF9rZXlfY2xlYXIoS0VZX0FVRElPKTsgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMHgwMzI6IHRzX21hcF9rZXlfY2xlYXIoS0VZX1RFWFQpOyAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMHgwMzM6IHRzX21hcF9rZXlfY2xlYXIoS0VZX0NIQU5ORUwpOyAgICAgICAgYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGlkX2RldmljZV9pZCB0c19kZXZpY2VzW10gPSB7CisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1RPUFNFRUQsIFVTQl9ERVZJQ0VfSURfVE9QU0VFRF9DWUJFUkxJTkspIH0sCisJeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShoaWQsIHRzX2RldmljZXMpOworCitzdGF0aWMgc3RydWN0IGhpZF9kcml2ZXIgdHNfZHJpdmVyID0geworCS5uYW1lID0gInRvcHNlZWQiLAorCS5pZF90YWJsZSA9IHRzX2RldmljZXMsCisJLmlucHV0X21hcHBpbmcgPSB0c19pbnB1dF9tYXBwaW5nLAorfTsKKworc3RhdGljIGludCB0c19pbml0KHZvaWQpCit7CisJcmV0dXJuIGhpZF9yZWdpc3Rlcl9kcml2ZXIoJnRzX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIHRzX2V4aXQodm9pZCkKK3sKKwloaWRfdW5yZWdpc3Rlcl9kcml2ZXIoJnRzX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHRzX2luaXQpOworbW9kdWxlX2V4aXQodHNfZXhpdCk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK0hJRF9DT01QQVRfTE9BRF9EUklWRVIodG9wc2VlZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9oaWRyYXcuYyBiL2RyaXZlcnMvaGlkL2hpZHJhdy5jCmluZGV4IDc2ODVhZTYuLjczMjQ0OTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL2hpZHJhdy5jCisrKyBiL2RyaXZlcnMvaGlkL2hpZHJhdy5jCkBAIC0yMDgsNyArMjA4LDcgQEAKIAogCWxpc3RfZGVsKCZsaXN0LT5ub2RlKTsKIAlkZXYgPSBoaWRyYXdfdGFibGVbbWlub3JdOwotCWlmICghZGV2LT5vcGVuLS0pIHsKKwlpZiAoIS0tZGV2LT5vcGVuKSB7CiAJCWlmIChsaXN0LT5oaWRyYXctPmV4aXN0KQogCQkJZGV2LT5oaWQtPmxsX2RyaXZlci0+Y2xvc2UoZGV2LT5oaWQpOwogCQllbHNlCkBAIC0yNjUsNiArMjY1LDM0IEBACiAJCQkJYnJlYWs7CiAJCQl9CiAJCWRlZmF1bHQ6CisJCQl7CisJCQkJc3RydWN0IGhpZF9kZXZpY2UgKmhpZCA9IGRldi0+aGlkOworCQkJCWlmIChfSU9DX1RZUEUoY21kKSAhPSAnSCcgfHwgX0lPQ19ESVIoY21kKSAhPSBfSU9DX1JFQUQpCisJCQkJCXJldHVybiAtRUlOVkFMOworCisJCQkJaWYgKF9JT0NfTlIoY21kKSA9PSBfSU9DX05SKEhJRElPQ0dSQVdOQU1FKDApKSkgeworCQkJCQlpbnQgbGVuOworCQkJCQlpZiAoIWhpZC0+bmFtZSkKKwkJCQkJCXJldHVybiAwOworCQkJCQlsZW4gPSBzdHJsZW4oaGlkLT5uYW1lKSArIDE7CisJCQkJCWlmIChsZW4gPiBfSU9DX1NJWkUoY21kKSkKKwkJCQkJCWxlbiA9IF9JT0NfU0laRShjbWQpOworCQkJCQlyZXR1cm4gY29weV90b191c2VyKHVzZXJfYXJnLCBoaWQtPm5hbWUsIGxlbikgPworCQkJCQkJLUVGQVVMVCA6IGxlbjsKKwkJCQl9CisKKwkJCQlpZiAoX0lPQ19OUihjbWQpID09IF9JT0NfTlIoSElESU9DR1JBV1BIWVMoMCkpKSB7CisJCQkJCWludCBsZW47CisJCQkJCWlmICghaGlkLT5waHlzKQorCQkJCQkJcmV0dXJuIDA7CisJCQkJCWxlbiA9IHN0cmxlbihoaWQtPnBoeXMpICsgMTsKKwkJCQkJaWYgKGxlbiA+IF9JT0NfU0laRShjbWQpKQorCQkJCQkJbGVuID0gX0lPQ19TSVpFKGNtZCk7CisJCQkJCXJldHVybiBjb3B5X3RvX3VzZXIodXNlcl9hcmcsIGhpZC0+cGh5cywgbGVuKSA/CisJCQkJCQktRUZBVUxUIDogbGVuOworCQkJCX0KKyAgICAgICAgICAgICAgICB9CisKIAkJCXJldCA9IC1FTk9UVFk7CiAJfQogCXVubG9ja19rZXJuZWwoKTsKQEAgLTMyOSw3ICszNTcsNyBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQlkZXYtPmRldiA9IGRldmljZV9jcmVhdGUoaGlkcmF3X2NsYXNzLCBOVUxMLCBNS0RFVihoaWRyYXdfbWFqb3IsIG1pbm9yKSwKKwlkZXYtPmRldiA9IGRldmljZV9jcmVhdGUoaGlkcmF3X2NsYXNzLCAmaGlkLT5kZXYsIE1LREVWKGhpZHJhd19tYWpvciwgbWlub3IpLAogCQkJCSBOVUxMLCAiJXMlZCIsICJoaWRyYXciLCBtaW5vcik7CiAKIAlpZiAoSVNfRVJSKGRldi0+ZGV2KSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvdXNiaGlkL0tjb25maWcgYi9kcml2ZXJzL2hpZC91c2JoaWQvS2NvbmZpZwppbmRleCA1ZDlhYTk1Li40ZWRiM2JlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC91c2JoaWQvS2NvbmZpZworKysgYi9kcml2ZXJzL2hpZC91c2JoaWQvS2NvbmZpZwpAQCAtNDUsNyArNDUsNyBAQAogCSAgSWYgdW5zdXJlLCBzYXkgWS4KIAogbWVudSAiVVNCIEhJRCBCb290IFByb3RvY29sIGRyaXZlcnMiCi0JZGVwZW5kcyBvbiBVU0IhPW4gJiYgVVNCX0hJRCE9eQorCWRlcGVuZHMgb24gVVNCIT1uICYmIFVTQl9ISUQhPXkgJiYgRU1CRURERUQKIAogY29uZmlnIFVTQl9LQkQKIAl0cmlzdGF0ZSAiVVNCIEhJREJQIEtleWJvYXJkIChzaW1wbGUgQm9vdCkgc3VwcG9ydCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL3VzYmhpZC9oaWQtY29yZS5jIGIvZHJpdmVycy9oaWQvdXNiaGlkL2hpZC1jb3JlLmMKaW5kZXggNjA2MzY5ZS4uZjBhMGY3MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvdXNiaGlkL2hpZC1jb3JlLmMKKysrIGIvZHJpdmVycy9oaWQvdXNiaGlkL2hpZC1jb3JlLmMKQEAgLTQsNyArNCw3IEBACiAgKiAgQ29weXJpZ2h0IChjKSAxOTk5IEFuZHJlYXMgR2FsCiAgKiAgQ29weXJpZ2h0IChjKSAyMDAwLTIwMDUgVm9qdGVjaCBQYXZsaWsgPHZvanRlY2hAc3VzZS5jej4KICAqICBDb3B5cmlnaHQgKGMpIDIwMDUgTWljaGFlbCBIYWJvdXN0YWsgPG1pa2UtQGNpbmNpLnJyLmNvbT4gZm9yIENvbmNlcHQyLCBJbmMKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBKaXJpIEtvc2luYQorICogIENvcHlyaWdodCAoYykgMjAwNi0yMDA4IEppcmkgS29zaW5hCiAgKi8KIAogLyoKQEAgLTEwMiw3ICsxMDIsNyBAQAogCXN0cnVjdCB1c2JoaWRfZGV2aWNlICp1c2JoaWQgPQogCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IHVzYmhpZF9kZXZpY2UsIHJlc2V0X3dvcmspOwogCXN0cnVjdCBoaWRfZGV2aWNlICpoaWQgPSB1c2JoaWQtPmhpZDsKLQlpbnQgcmNfbG9jaywgcmMgPSAwOworCWludCByYyA9IDA7CiAKIAlpZiAodGVzdF9iaXQoSElEX0NMRUFSX0hBTFQsICZ1c2JoaWQtPmlvZmwpKSB7CiAJCWRldl9kYmcoJnVzYmhpZC0+aW50Zi0+ZGV2LCAiY2xlYXIgaGFsdFxuIik7CkBAIC0xMTMsMTEgKzExMywxMCBAQAogCiAJZWxzZSBpZiAodGVzdF9iaXQoSElEX1JFU0VUX1BFTkRJTkcsICZ1c2JoaWQtPmlvZmwpKSB7CiAJCWRldl9kYmcoJnVzYmhpZC0+aW50Zi0+ZGV2LCAicmVzZXR0aW5nIGRldmljZVxuIik7Ci0JCXJjID0gcmNfbG9jayA9IHVzYl9sb2NrX2RldmljZV9mb3JfcmVzZXQoaGlkX3RvX3VzYl9kZXYoaGlkKSwgdXNiaGlkLT5pbnRmKTsKLQkJaWYgKHJjX2xvY2sgPj0gMCkgeworCQlyYyA9IHVzYl9sb2NrX2RldmljZV9mb3JfcmVzZXQoaGlkX3RvX3VzYl9kZXYoaGlkKSwgdXNiaGlkLT5pbnRmKTsKKwkJaWYgKHJjID09IDApIHsKIAkJCXJjID0gdXNiX3Jlc2V0X2RldmljZShoaWRfdG9fdXNiX2RldihoaWQpKTsKLQkJCWlmIChyY19sb2NrKQotCQkJCXVzYl91bmxvY2tfZGV2aWNlKGhpZF90b191c2JfZGV2KGhpZCkpOworCQkJdXNiX3VubG9ja19kZXZpY2UoaGlkX3RvX3VzYl9kZXYoaGlkKSk7CiAJCX0KIAkJY2xlYXJfYml0KEhJRF9SRVNFVF9QRU5ESU5HLCAmdXNiaGlkLT5pb2ZsKTsKIAl9CkBAIC02NDEsOSArNjQwLDcgQEAKIAl1bnNpZ25lZCBpbnQgc2l6ZTsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkocmVwb3J0LCAmaGlkLT5yZXBvcnRfZW51bVt0eXBlXS5yZXBvcnRfbGlzdCwgbGlzdCkgewotCQlzaXplID0gKChyZXBvcnQtPnNpemUgLSAxKSA+PiAzKSArIDE7Ci0JCWlmICh0eXBlID09IEhJRF9JTlBVVF9SRVBPUlQgJiYgaGlkLT5yZXBvcnRfZW51bVt0eXBlXS5udW1iZXJlZCkKLQkJCXNpemUrKzsKKwkJc2l6ZSA9ICgocmVwb3J0LT5zaXplIC0gMSkgPj4gMykgKyAxICsgaGlkLT5yZXBvcnRfZW51bVt0eXBlXS5udW1iZXJlZDsKIAkJaWYgKCptYXggPCBzaXplKQogCQkJKm1heCA9IHNpemU7CiAJfQpAQCAtNjUzLDEzICs2NTAsMTYgQEAKIHsKIAlzdHJ1Y3QgdXNiaGlkX2RldmljZSAqdXNiaGlkID0gaGlkLT5kcml2ZXJfZGF0YTsKIAotCWlmICghKHVzYmhpZC0+aW5idWYgPSB1c2JfYnVmZmVyX2FsbG9jKGRldiwgdXNiaGlkLT5idWZzaXplLCBHRlBfQVRPTUlDLCAmdXNiaGlkLT5pbmJ1Zl9kbWEpKSkKLQkJcmV0dXJuIC0xOwotCWlmICghKHVzYmhpZC0+b3V0YnVmID0gdXNiX2J1ZmZlcl9hbGxvYyhkZXYsIHVzYmhpZC0+YnVmc2l6ZSwgR0ZQX0FUT01JQywgJnVzYmhpZC0+b3V0YnVmX2RtYSkpKQotCQlyZXR1cm4gLTE7Ci0JaWYgKCEodXNiaGlkLT5jciA9IHVzYl9idWZmZXJfYWxsb2MoZGV2LCBzaXplb2YoKih1c2JoaWQtPmNyKSksIEdGUF9BVE9NSUMsICZ1c2JoaWQtPmNyX2RtYSkpKQotCQlyZXR1cm4gLTE7Ci0JaWYgKCEodXNiaGlkLT5jdHJsYnVmID0gdXNiX2J1ZmZlcl9hbGxvYyhkZXYsIHVzYmhpZC0+YnVmc2l6ZSwgR0ZQX0FUT01JQywgJnVzYmhpZC0+Y3RybGJ1Zl9kbWEpKSkKKwl1c2JoaWQtPmluYnVmID0gdXNiX2J1ZmZlcl9hbGxvYyhkZXYsIHVzYmhpZC0+YnVmc2l6ZSwgR0ZQX0tFUk5FTCwKKwkJCSZ1c2JoaWQtPmluYnVmX2RtYSk7CisJdXNiaGlkLT5vdXRidWYgPSB1c2JfYnVmZmVyX2FsbG9jKGRldiwgdXNiaGlkLT5idWZzaXplLCBHRlBfS0VSTkVMLAorCQkJJnVzYmhpZC0+b3V0YnVmX2RtYSk7CisJdXNiaGlkLT5jciA9IHVzYl9idWZmZXJfYWxsb2MoZGV2LCBzaXplb2YoKnVzYmhpZC0+Y3IpLCBHRlBfS0VSTkVMLAorCQkJJnVzYmhpZC0+Y3JfZG1hKTsKKwl1c2JoaWQtPmN0cmxidWYgPSB1c2JfYnVmZmVyX2FsbG9jKGRldiwgdXNiaGlkLT5idWZzaXplLCBHRlBfS0VSTkVMLAorCQkJJnVzYmhpZC0+Y3RybGJ1Zl9kbWEpOworCWlmICghdXNiaGlkLT5pbmJ1ZiB8fCAhdXNiaGlkLT5vdXRidWYgfHwgIXVzYmhpZC0+Y3IgfHwKKwkJCSF1c2JoaWQtPmN0cmxidWYpCiAJCXJldHVybiAtMTsKIAogCXJldHVybiAwOwpAQCAtODA3LDcgKzgwNyw3IEBACiAJCWludCBpbnRlcnZhbDsKIAogCQllbmRwb2ludCA9ICZpbnRlcmZhY2UtPmVuZHBvaW50W25dLmRlc2M7Ci0JCWlmICgoZW5kcG9pbnQtPmJtQXR0cmlidXRlcyAmIDMpICE9IDMpCQkvKiBOb3QgYW4gaW50ZXJydXB0IGVuZHBvaW50ICovCisJCWlmICghdXNiX2VuZHBvaW50X3hmZXJfaW50KGVuZHBvaW50KSkKIAkJCWNvbnRpbnVlOwogCiAJCWludGVydmFsID0gZW5kcG9pbnQtPmJJbnRlcnZhbDsKQEAgLTg3Niw2ICs4NzYsMTUgQEAKIAogCXNldF9iaXQoSElEX1NUQVJURUQsICZ1c2JoaWQtPmlvZmwpOwogCisJLyogU29tZSBrZXlib2FyZHMgZG9uJ3Qgd29yayB1bnRpbCB0aGVpciBMRURzIGhhdmUgYmVlbiBzZXQuCisJICogU2luY2UgQklPU2VzIGRvIHNldCB0aGUgTEVEcywgaXQgbXVzdCBiZSBzYWZlIGZvciBhbnkgZGV2aWNlCisJICogdGhhdCBzdXBwb3J0cyB0aGUga2V5Ym9hcmQgYm9vdCBwcm90b2NvbC4KKwkgKi8KKwlpZiAoaW50ZXJmYWNlLT5kZXNjLmJJbnRlcmZhY2VTdWJDbGFzcyA9PSBVU0JfSU5URVJGQUNFX1NVQkNMQVNTX0JPT1QgJiYKKwkJCWludGVyZmFjZS0+ZGVzYy5iSW50ZXJmYWNlUHJvdG9jb2wgPT0KKwkJCQlVU0JfSU5URVJGQUNFX1BST1RPQ09MX0tFWUJPQVJEKQorCQl1c2JoaWRfc2V0X2xlZHMoaGlkKTsKKwogCXJldHVybiAwOwogCiBmYWlsOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvdXNiaGlkL2hpZC1xdWlya3MuYyBiL2RyaXZlcnMvaGlkL3VzYmhpZC9oaWQtcXVpcmtzLmMKaW5kZXggNDdlYmUwNC4uNDM5MTcxNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvdXNiaGlkL2hpZC1xdWlya3MuYworKysgYi9kcml2ZXJzL2hpZC91c2JoaWQvaGlkLXF1aXJrcy5jCkBAIC01NCw2ICs1NCw3IEBACiAJeyBVU0JfVkVORE9SX0lEX0VMTywgVVNCX0RFVklDRV9JRF9FTE9fVFMyNzAwLCBISURfUVVJUktfTk9HRVQgfSwKIAl7IFVTQl9WRU5ET1JfSURfU1VOLCBVU0JfREVWSUNFX0lEX1JBUklUQU5fS1ZNX0RPTkdMRSwgSElEX1FVSVJLX05PR0VUIH0sCiAJeyBVU0JfVkVORE9SX0lEX1RVUkJPWCwgVVNCX0RFVklDRV9JRF9UVVJCT1hfS0VZQk9BUkQsIEhJRF9RVUlSS19OT0dFVCB9LAorCXsgVVNCX1ZFTkRPUl9JRF9VQ0xPR0lDLCBVU0JfREVWSUNFX0lEX1VDTE9HSUNfVEFCTEVUX1BGMTIwOSwgSElEX1FVSVJLX01VTFRJX0lOUFVUIH0sCiAJeyBVU0JfVkVORE9SX0lEX1dJU0VHUk9VUCwgVVNCX0RFVklDRV9JRF9EVUFMX1VTQl9KT1lQQUQsIEhJRF9RVUlSS19OT0dFVCB8IEhJRF9RVUlSS19NVUxUSV9JTlBVVCB8IEhJRF9RVUlSS19TS0lQX09VVFBVVF9SRVBPUlRTIH0sCiAJeyBVU0JfVkVORE9SX0lEX1dJU0VHUk9VUCwgVVNCX0RFVklDRV9JRF9RVUFEX1VTQl9KT1lQQUQsIEhJRF9RVUlSS19OT0dFVCB8IEhJRF9RVUlSS19NVUxUSV9JTlBVVCB9LAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC91c2JoaWQvaGlkZGV2LmMgYi9kcml2ZXJzL2hpZC91c2JoaWQvaGlkZGV2LmMKaW5kZXggODNlODUxYS4uZDczZWVhMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvdXNiaGlkL2hpZGRldi5jCisrKyBiL2RyaXZlcnMvaGlkL3VzYmhpZC9oaWRkZXYuYwpAQCAtNDksNiArNDksNyBAQAogc3RydWN0IGhpZGRldiB7CiAJaW50IGV4aXN0OwogCWludCBvcGVuOworCXN0cnVjdCBtdXRleCBleGlzdGFuY2Vsb2NrOwogCXdhaXRfcXVldWVfaGVhZF90IHdhaXQ7CiAJc3RydWN0IGhpZF9kZXZpY2UgKmhpZDsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CkBAIC02Myw2ICs2NCw3IEBACiAJc3RydWN0IGZhc3luY19zdHJ1Y3QgKmZhc3luYzsKIAlzdHJ1Y3QgaGlkZGV2ICpoaWRkZXY7CiAJc3RydWN0IGxpc3RfaGVhZCBub2RlOworCXN0cnVjdCBtdXRleCB0aHJlYWRfbG9jazsKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgaGlkZGV2ICpoaWRkZXZfdGFibGVbSElEREVWX01JTk9SU107CkBAIC0yNjQsMjkgKzI2Niw0OCBAQAogc3RhdGljIGludCBoaWRkZXZfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKIAlzdHJ1Y3QgaGlkZGV2X2xpc3QgKmxpc3Q7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmVzOwogCiAJaW50IGkgPSBpbWlub3IoaW5vZGUpIC0gSElEREVWX01JTk9SX0JBU0U7CiAKLQlpZiAoaSA+PSBISURERVZfTUlOT1JTIHx8ICFoaWRkZXZfdGFibGVbaV0pCisJaWYgKGkgPj0gSElEREVWX01JTk9SUyB8fCBpIDwgMCB8fCAhaGlkZGV2X3RhYmxlW2ldKQogCQlyZXR1cm4gLUVOT0RFVjsKIAogCWlmICghKGxpc3QgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgaGlkZGV2X2xpc3QpLCBHRlBfS0VSTkVMKSkpCiAJCXJldHVybiAtRU5PTUVNOworCW11dGV4X2luaXQoJmxpc3QtPnRocmVhZF9sb2NrKTsKIAogCWxpc3QtPmhpZGRldiA9IGhpZGRldl90YWJsZVtpXTsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZsaXN0LT5oaWRkZXYtPmxpc3RfbG9jaywgZmxhZ3MpOwotCWxpc3RfYWRkX3RhaWwoJmxpc3QtPm5vZGUsICZoaWRkZXZfdGFibGVbaV0tPmxpc3QpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxpc3QtPmhpZGRldi0+bGlzdF9sb2NrLCBmbGFncyk7CiAKIAlmaWxlLT5wcml2YXRlX2RhdGEgPSBsaXN0OwogCi0JaWYgKCFsaXN0LT5oaWRkZXYtPm9wZW4rKykKLQkJaWYgKGxpc3QtPmhpZGRldi0+ZXhpc3QpCi0JCQl1c2JoaWRfb3BlbihoaWRkZXZfdGFibGVbaV0tPmhpZCk7CisJLyoKKwkgKiBubyBuZWVkIGZvciBsb2NraW5nIGJlY2F1c2UgdGhlIFVTQiBtYWpvciBudW1iZXIKKwkgKiBpcyBzaGFyZWQgd2hpY2ggdXNiY29yZSBndWFyZHMgYWdhaW5zdCBkaXNjb25uZWN0CisJICovCisJaWYgKGxpc3QtPmhpZGRldi0+ZXhpc3QpIHsKKwkJaWYgKCFsaXN0LT5oaWRkZXYtPm9wZW4rKykgeworCQkJcmVzID0gdXNiaGlkX29wZW4oaGlkZGV2X3RhYmxlW2ldLT5oaWQpOworCQkJaWYgKHJlcyA8IDApIHsKKwkJCQlyZXMgPSAtRUlPOworCQkJCWdvdG8gYmFpbDsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCXJlcyA9IC1FTk9ERVY7CisJCWdvdG8gYmFpbDsKKwl9CisKKwlzcGluX2xvY2tfaXJxKCZsaXN0LT5oaWRkZXYtPmxpc3RfbG9jayk7CisJbGlzdF9hZGRfdGFpbCgmbGlzdC0+bm9kZSwgJmhpZGRldl90YWJsZVtpXS0+bGlzdCk7CisJc3Bpbl91bmxvY2tfaXJxKCZsaXN0LT5oaWRkZXYtPmxpc3RfbG9jayk7CiAKIAlyZXR1cm4gMDsKK2JhaWw6CisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gTlVMTDsKKwlrZnJlZShsaXN0LT5oaWRkZXYpOworCXJldHVybiByZXM7CiB9CiAKIC8qCkBAIC0zMDUsNyArMzI2LDcgQEAKIAlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKIAlzdHJ1Y3QgaGlkZGV2X2xpc3QgKmxpc3QgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAJaW50IGV2ZW50X3NpemU7Ci0JaW50IHJldHZhbCA9IDA7CisJaW50IHJldHZhbDsKIAogCWV2ZW50X3NpemUgPSAoKGxpc3QtPmZsYWdzICYgSElEREVWX0ZMQUdfVVJFRikgIT0gMCkgPwogCQlzaXplb2Yoc3RydWN0IGhpZGRldl91c2FnZV9yZWYpIDogc2l6ZW9mKHN0cnVjdCBoaWRkZXZfZXZlbnQpOwpAQCAtMzEzLDEwICszMzQsMTQgQEAKIAlpZiAoY291bnQgPCBldmVudF9zaXplKQogCQlyZXR1cm4gMDsKIAorCS8qIGxvY2sgYWdhaW5zdCBvdGhlciB0aHJlYWRzICovCisJcmV0dmFsID0gbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZsaXN0LT50aHJlYWRfbG9jayk7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwogCXdoaWxlIChyZXR2YWwgPT0gMCkgewogCQlpZiAobGlzdC0+aGVhZCA9PSBsaXN0LT50YWlsKSB7Ci0JCQlhZGRfd2FpdF9xdWV1ZSgmbGlzdC0+aGlkZGV2LT53YWl0LCAmd2FpdCk7Ci0JCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQkJcHJlcGFyZV90b193YWl0KCZsaXN0LT5oaWRkZXYtPndhaXQsICZ3YWl0LCBUQVNLX0lOVEVSUlVQVElCTEUpOwogCiAJCQl3aGlsZSAobGlzdC0+aGVhZCA9PSBsaXN0LT50YWlsKSB7CiAJCQkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB7CkBAIC0zMzIsMzUgKzM1Nyw0NSBAQAogCQkJCQlicmVhazsKIAkJCQl9CiAKKwkJCQkvKiBsZXQgT19OT05CTE9DSyB0YXNrcyBydW4gKi8KKwkJCQltdXRleF91bmxvY2soJmxpc3QtPnRocmVhZF9sb2NrKTsKIAkJCQlzY2hlZHVsZSgpOworCQkJCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmxpc3QtPnRocmVhZF9sb2NrKSkKKwkJCQkJcmV0dXJuIC1FSU5UUjsKIAkJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwogCQkJfQorCQkJZmluaXNoX3dhaXQoJmxpc3QtPmhpZGRldi0+d2FpdCwgJndhaXQpOwogCi0JCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOwotCQkJcmVtb3ZlX3dhaXRfcXVldWUoJmxpc3QtPmhpZGRldi0+d2FpdCwgJndhaXQpOwogCQl9CiAKLQkJaWYgKHJldHZhbCkKKwkJaWYgKHJldHZhbCkgeworCQkJbXV0ZXhfdW5sb2NrKCZsaXN0LT50aHJlYWRfbG9jayk7CiAJCQlyZXR1cm4gcmV0dmFsOworCQl9CiAKIAogCQl3aGlsZSAobGlzdC0+aGVhZCAhPSBsaXN0LT50YWlsICYmCiAJCSAgICAgICByZXR2YWwgKyBldmVudF9zaXplIDw9IGNvdW50KSB7CiAJCQlpZiAoKGxpc3QtPmZsYWdzICYgSElEREVWX0ZMQUdfVVJFRikgPT0gMCkgewotCQkJCWlmIChsaXN0LT5idWZmZXJbbGlzdC0+dGFpbF0uZmllbGRfaW5kZXggIT0KLQkJCQkgICAgSElEX0ZJRUxEX0lOREVYX05PTkUpIHsKKwkJCQlpZiAobGlzdC0+YnVmZmVyW2xpc3QtPnRhaWxdLmZpZWxkX2luZGV4ICE9IEhJRF9GSUVMRF9JTkRFWF9OT05FKSB7CiAJCQkJCXN0cnVjdCBoaWRkZXZfZXZlbnQgZXZlbnQ7CisKIAkJCQkJZXZlbnQuaGlkID0gbGlzdC0+YnVmZmVyW2xpc3QtPnRhaWxdLnVzYWdlX2NvZGU7CiAJCQkJCWV2ZW50LnZhbHVlID0gbGlzdC0+YnVmZmVyW2xpc3QtPnRhaWxdLnZhbHVlOwotCQkJCQlpZiAoY29weV90b191c2VyKGJ1ZmZlciArIHJldHZhbCwgJmV2ZW50LCBzaXplb2Yoc3RydWN0IGhpZGRldl9ldmVudCkpKQorCQkJCQlpZiAoY29weV90b191c2VyKGJ1ZmZlciArIHJldHZhbCwgJmV2ZW50LCBzaXplb2Yoc3RydWN0IGhpZGRldl9ldmVudCkpKSB7CisJCQkJCQltdXRleF91bmxvY2soJmxpc3QtPnRocmVhZF9sb2NrKTsKIAkJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCQl9CiAJCQkJCXJldHZhbCArPSBzaXplb2Yoc3RydWN0IGhpZGRldl9ldmVudCk7CiAJCQkJfQogCQkJfSBlbHNlIHsKIAkJCQlpZiAobGlzdC0+YnVmZmVyW2xpc3QtPnRhaWxdLmZpZWxkX2luZGV4ICE9IEhJRF9GSUVMRF9JTkRFWF9OT05FIHx8CiAJCQkJICAgIChsaXN0LT5mbGFncyAmIEhJRERFVl9GTEFHX1JFUE9SVCkgIT0gMCkgewotCQkJCQlpZiAoY29weV90b191c2VyKGJ1ZmZlciArIHJldHZhbCwgbGlzdC0+YnVmZmVyICsgbGlzdC0+dGFpbCwgc2l6ZW9mKHN0cnVjdCBoaWRkZXZfdXNhZ2VfcmVmKSkpCisKKwkJCQkJaWYgKGNvcHlfdG9fdXNlcihidWZmZXIgKyByZXR2YWwsIGxpc3QtPmJ1ZmZlciArIGxpc3QtPnRhaWwsIHNpemVvZihzdHJ1Y3QgaGlkZGV2X3VzYWdlX3JlZikpKSB7CisJCQkJCQltdXRleF91bmxvY2soJmxpc3QtPnRocmVhZF9sb2NrKTsKIAkJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCQl9CiAJCQkJCXJldHZhbCArPSBzaXplb2Yoc3RydWN0IGhpZGRldl91c2FnZV9yZWYpOwogCQkJCX0KIAkJCX0KQEAgLTM2OCw2ICs0MDMsNyBAQAogCQl9CiAKIAl9CisJbXV0ZXhfdW5sb2NrKCZsaXN0LT50aHJlYWRfbG9jayk7CiAKIAlyZXR1cm4gcmV0dmFsOwogfQpAQCAtNTU1LDcgKzU5MSw3IEBACiAJc3RydWN0IGhpZF9maWVsZCAqZmllbGQ7CiAJc3RydWN0IHVzYmhpZF9kZXZpY2UgKnVzYmhpZCA9IGhpZC0+ZHJpdmVyX2RhdGE7CiAJdm9pZCBfX3VzZXIgKnVzZXJfYXJnID0gKHZvaWQgX191c2VyICopYXJnOwotCWludCBpOworCWludCBpLCByOwogCQogCS8qIENhbGxlZCB3aXRob3V0IEJLTCBieSBjb21wYXQgbWV0aG9kcyBzbyBubyBCS0wgdGFrZW4gKi8KIApAQCAtNjE5LDEwICs2NTUsMjIgQEAKIAkJfQogCiAJY2FzZSBISURJT0NHU1RSSU5HOgotCQlyZXR1cm4gaGlkZGV2X2lvY3RsX3N0cmluZyhoaWRkZXYsIGNtZCwgdXNlcl9hcmcpOworCQltdXRleF9sb2NrKCZoaWRkZXYtPmV4aXN0YW5jZWxvY2spOworCQlpZiAoIWhpZGRldi0+ZXhpc3QpCisJCQlyID0gaGlkZGV2X2lvY3RsX3N0cmluZyhoaWRkZXYsIGNtZCwgdXNlcl9hcmcpOworCQllbHNlCisJCQlyID0gLUVOT0RFVjsKKwkJbXV0ZXhfdW5sb2NrKCZoaWRkZXYtPmV4aXN0YW5jZWxvY2spOworCQlyZXR1cm4gcjsKIAogCWNhc2UgSElESU9DSU5JVFJFUE9SVDoKKwkJbXV0ZXhfbG9jaygmaGlkZGV2LT5leGlzdGFuY2Vsb2NrKTsKKwkJaWYgKCFoaWRkZXYtPmV4aXN0KSB7CisJCQltdXRleF91bmxvY2soJmhpZGRldi0+ZXhpc3RhbmNlbG9jayk7CisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJfQogCQl1c2JoaWRfaW5pdF9yZXBvcnRzKGhpZCk7CisJCW11dGV4X3VubG9jaygmaGlkZGV2LT5leGlzdGFuY2Vsb2NrKTsKIAogCQlyZXR1cm4gMDsKIApAQCAtNjM2LDggKzY4NCwxMiBAQAogCQlpZiAoKHJlcG9ydCA9IGhpZGRldl9sb29rdXBfcmVwb3J0KGhpZCwgJnJpbmZvKSkgPT0gTlVMTCkKIAkJCXJldHVybiAtRUlOVkFMOwogCi0JCXVzYmhpZF9zdWJtaXRfcmVwb3J0KGhpZCwgcmVwb3J0LCBVU0JfRElSX0lOKTsKLQkJdXNiaGlkX3dhaXRfaW8oaGlkKTsKKwkJbXV0ZXhfbG9jaygmaGlkZGV2LT5leGlzdGFuY2Vsb2NrKTsKKwkJaWYgKGhpZGRldi0+ZXhpc3QpIHsKKwkJCXVzYmhpZF9zdWJtaXRfcmVwb3J0KGhpZCwgcmVwb3J0LCBVU0JfRElSX0lOKTsKKwkJCXVzYmhpZF93YWl0X2lvKGhpZCk7CisJCX0KKwkJbXV0ZXhfdW5sb2NrKCZoaWRkZXYtPmV4aXN0YW5jZWxvY2spOwogCiAJCXJldHVybiAwOwogCkBAIC02NTEsOCArNzAzLDEyIEBACiAJCWlmICgocmVwb3J0ID0gaGlkZGV2X2xvb2t1cF9yZXBvcnQoaGlkLCAmcmluZm8pKSA9PSBOVUxMKQogCQkJcmV0dXJuIC1FSU5WQUw7CiAKLQkJdXNiaGlkX3N1Ym1pdF9yZXBvcnQoaGlkLCByZXBvcnQsIFVTQl9ESVJfT1VUKTsKLQkJdXNiaGlkX3dhaXRfaW8oaGlkKTsKKwkJbXV0ZXhfbG9jaygmaGlkZGV2LT5leGlzdGFuY2Vsb2NrKTsKKwkJaWYgKGhpZGRldi0+ZXhpc3QpIHsKKwkJCXVzYmhpZF9zdWJtaXRfcmVwb3J0KGhpZCwgcmVwb3J0LCBVU0JfRElSX09VVCk7CisJCQl1c2JoaWRfd2FpdF9pbyhoaWQpOworCQl9CisJCW11dGV4X3VubG9jaygmaGlkZGV2LT5leGlzdGFuY2Vsb2NrKTsKIAogCQlyZXR1cm4gMDsKIApAQCAtNzEwLDcgKzc2NiwxMyBAQAogCWNhc2UgSElESU9DR1VTQUdFUzoKIAljYXNlIEhJRElPQ1NVU0FHRVM6CiAJY2FzZSBISURJT0NHQ09MTEVDVElPTklOREVYOgotCQlyZXR1cm4gaGlkZGV2X2lvY3RsX3VzYWdlKGhpZGRldiwgY21kLCB1c2VyX2FyZyk7CisJCW11dGV4X2xvY2soJmhpZGRldi0+ZXhpc3RhbmNlbG9jayk7CisJCWlmIChoaWRkZXYtPmV4aXN0KQorCQkJciA9IGhpZGRldl9pb2N0bF91c2FnZShoaWRkZXYsIGNtZCwgdXNlcl9hcmcpOworCQllbHNlCisJCQlyID0gLUVOT0RFVjsKKwkJbXV0ZXhfdW5sb2NrKCZoaWRkZXYtPmV4aXN0YW5jZWxvY2spOworCQlyZXR1cm4gcjsKIAogCWNhc2UgSElESU9DR0NPTExFQ1RJT05JTkZPOgogCQlpZiAoY29weV9mcm9tX3VzZXIoJmNpbmZvLCB1c2VyX2FyZywgc2l6ZW9mKGNpbmZvKSkpCkBAIC04MDgsMjMgKzg3MCwyNCBAQAogCWlmICghKGhpZGRldiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBoaWRkZXYpLCBHRlBfS0VSTkVMKSkpCiAJCXJldHVybiAtMTsKIAotCXJldHZhbCA9IHVzYl9yZWdpc3Rlcl9kZXYodXNiaGlkLT5pbnRmLCAmaGlkZGV2X2NsYXNzKTsKLQlpZiAocmV0dmFsKSB7Ci0JCWVycl9oaWQoIk5vdCBhYmxlIHRvIGdldCBhIG1pbm9yIGZvciB0aGlzIGRldmljZS4iKTsKLQkJa2ZyZWUoaGlkZGV2KTsKLQkJcmV0dXJuIC0xOwotCX0KLQogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmhpZGRldi0+d2FpdCk7CiAJSU5JVF9MSVNUX0hFQUQoJmhpZGRldi0+bGlzdCk7CiAJc3Bpbl9sb2NrX2luaXQoJmhpZGRldi0+bGlzdF9sb2NrKTsKKwltdXRleF9pbml0KCZoaWRkZXYtPmV4aXN0YW5jZWxvY2spOworCWhpZC0+aGlkZGV2ID0gaGlkZGV2OwogCWhpZGRldi0+aGlkID0gaGlkOwogCWhpZGRldi0+ZXhpc3QgPSAxOwogCi0JaGlkLT5taW5vciA9IHVzYmhpZC0+aW50Zi0+bWlub3I7Ci0JaGlkLT5oaWRkZXYgPSBoaWRkZXY7Ci0KLQloaWRkZXZfdGFibGVbdXNiaGlkLT5pbnRmLT5taW5vciAtIEhJRERFVl9NSU5PUl9CQVNFXSA9IGhpZGRldjsKKwlyZXR2YWwgPSB1c2JfcmVnaXN0ZXJfZGV2KHVzYmhpZC0+aW50ZiwgJmhpZGRldl9jbGFzcyk7CisJaWYgKHJldHZhbCkgeworCQllcnJfaGlkKCJOb3QgYWJsZSB0byBnZXQgYSBtaW5vciBmb3IgdGhpcyBkZXZpY2UuIik7CisJCWhpZC0+aGlkZGV2ID0gTlVMTDsKKwkJa2ZyZWUoaGlkZGV2KTsKKwkJcmV0dXJuIC0xOworCX0gZWxzZSB7CisJCWhpZC0+bWlub3IgPSB1c2JoaWQtPmludGYtPm1pbm9yOworCQloaWRkZXZfdGFibGVbdXNiaGlkLT5pbnRmLT5taW5vciAtIEhJRERFVl9NSU5PUl9CQVNFXSA9IGhpZGRldjsKKwl9CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTgzOSw3ICs5MDIsOSBAQAogCXN0cnVjdCBoaWRkZXYgKmhpZGRldiA9IGhpZC0+aGlkZGV2OwogCXN0cnVjdCB1c2JoaWRfZGV2aWNlICp1c2JoaWQgPSBoaWQtPmRyaXZlcl9kYXRhOwogCisJbXV0ZXhfbG9jaygmaGlkZGV2LT5leGlzdGFuY2Vsb2NrKTsKIAloaWRkZXYtPmV4aXN0ID0gMDsKKwltdXRleF91bmxvY2soJmhpZGRldi0+ZXhpc3RhbmNlbG9jayk7CiAKIAloaWRkZXZfdGFibGVbaGlkZGV2LT5oaWQtPm1pbm9yIC0gSElEREVWX01JTk9SX0JBU0VdID0gTlVMTDsKIAl1c2JfZGVyZWdpc3Rlcl9kZXYodXNiaGlkLT5pbnRmLCAmaGlkZGV2X2NsYXNzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL3VzYmhpZC91c2JoaWQuaCBiL2RyaXZlcnMvaGlkL3VzYmhpZC91c2JoaWQuaAppbmRleCAzMzJhYmNkLi45ZWIzMDU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC91c2JoaWQvdXNiaGlkLmgKKysrIGIvZHJpdmVycy9oaWQvdXNiaGlkL3VzYmhpZC5oCkBAIC00MCw2ICs0MCwxNiBAQAogdm9pZCB1c2JoaWRfaW5pdF9yZXBvcnRzKHN0cnVjdCBoaWRfZGV2aWNlICpoaWQpOwogdm9pZCB1c2JoaWRfc3VibWl0X3JlcG9ydChzdHJ1Y3QgaGlkX2RldmljZSAqaGlkLCBzdHJ1Y3QgaGlkX3JlcG9ydCAqcmVwb3J0LCB1bnNpZ25lZCBjaGFyIGRpcik7CiAKKy8qIGlvZmwgZmxhZ3MgKi8KKyNkZWZpbmUgSElEX0NUUkxfUlVOTklORwkxCisjZGVmaW5lIEhJRF9PVVRfUlVOTklORwkJMgorI2RlZmluZSBISURfSU5fUlVOTklORwkJMworI2RlZmluZSBISURfUkVTRVRfUEVORElORwk0CisjZGVmaW5lIEhJRF9TVVNQRU5ERUQJCTUKKyNkZWZpbmUgSElEX0NMRUFSX0hBTFQJCTYKKyNkZWZpbmUgSElEX0RJU0NPTk5FQ1RFRAk3CisjZGVmaW5lIEhJRF9TVEFSVEVECQk4CisKIC8qCiAgKiBVU0Itc3BlY2lmaWMgSElEIHN0cnVjdCwgdG8gYmUgcG9pbnRlZCB0bwogICogZnJvbSBzdHJ1Y3QgaGlkX2RldmljZS0+ZHJpdmVyX2RhdGEKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vS2NvbmZpZyBiL2RyaXZlcnMvaHdtb24vS2NvbmZpZwppbmRleCBjNzA5ZTgyLi40YjMzYmM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL0tjb25maWcKKysrIGIvZHJpdmVycy9od21vbi9LY29uZmlnCkBAIC0yODQsMTEgKzI4NCwxMiBAQAogCSAgd2lsbCBiZSBjYWxsZWQgZjcxODA1Zi4KIAogY29uZmlnIFNFTlNPUlNfRjcxODgyRkcKLQl0cmlzdGF0ZSAiRmludGVrIEY3MTg4MkZHIGFuZCBGNzE4ODNGRyIKKwl0cmlzdGF0ZSAiRmludGVrIEY3MTg2MkZHLCBGNzE4ODJGRyBhbmQgRjgwMDAiCiAJZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwKIAloZWxwCiAJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgaGFyZHdhcmUgbW9uaXRvcmluZwotCSAgZmVhdHVyZXMgb2YgdGhlIEZpbnRlayBGNzE4ODJGRyBhbmQgRjcxODgzRkcgU3VwZXItSS9PIGNoaXBzLgorCSAgZmVhdHVyZXMgb2YgdGhlIEZpbnRlayBGNzE4ODJGRy9GNzE4ODNGRywgRjcxODYyRkcvNzE4NjNGRworCSAgYW5kIEY4MDAwIFN1cGVyLUkvTyBjaGlwcy4KIAogCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQogCSAgd2lsbCBiZSBjYWxsZWQgZjcxODgyZmcuCkBAIC0zMDQsOSArMzA1LDEzIEBACiAJICB3aWxsIGJlIGNhbGxlZCBmNzUzNzVzLgogCiBjb25maWcgU0VOU09SU19GU0NIRVIKLQl0cmlzdGF0ZSAiRlNDIEhlcm1lcyIKKwl0cmlzdGF0ZSAiRlNDIEhlcm1lcyAoREVQUkVDQVRFRCkiCiAJZGVwZW5kcyBvbiBYODYgJiYgSTJDCiAJaGVscAorCSAgVGhpcyBkcml2ZXIgaXMgREVQUkVDQVRFRCBwbGVhc2UgdXNlIHRoZSBuZXcgbWVyZ2VkIGZzY2htZAorCSAgKCJGU0MgUG9zZWlkb24sIFNjeWxsYSwgSGVybWVzLCBIZWltZGFsbCBhbmQgSGVyYWNsZXMiKSBkcml2ZXIKKwkgIGluc3RlYWQuCisKIAkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciBGdWppdHN1IFNpZW1lbnMKIAkgIENvbXB1dGVycyBIZXJtZXMgc2Vuc29yIGNoaXBzLgogCkBAIC0zMTQsOSArMzE5LDEzIEBACiAJICB3aWxsIGJlIGNhbGxlZCBmc2NoZXIuCiAKIGNvbmZpZyBTRU5TT1JTX0ZTQ1BPUwotCXRyaXN0YXRlICJGU0MgUG9zZWlkb24iCisJdHJpc3RhdGUgIkZTQyBQb3NlaWRvbiAoREVQUkVDQVRFRCkiCiAJZGVwZW5kcyBvbiBYODYgJiYgSTJDCiAJaGVscAorCSAgVGhpcyBkcml2ZXIgaXMgREVQUkVDQVRFRCBwbGVhc2UgdXNlIHRoZSBuZXcgbWVyZ2VkIGZzY2htZAorCSAgKCJGU0MgUG9zZWlkb24sIFNjeWxsYSwgSGVybWVzLCBIZWltZGFsbCBhbmQgSGVyYWNsZXMiKSBkcml2ZXIKKwkgIGluc3RlYWQuCisKIAkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciBGdWppdHN1IFNpZW1lbnMKIAkgIENvbXB1dGVycyBQb3NlaWRvbiBzZW5zb3IgY2hpcHMuCiAKQEAgLTMyNSwxNCArMzM0LDE1IEBACiAKIGNvbmZpZyBTRU5TT1JTX0ZTQ0hNRAogCXRyaXN0YXRlICJGU0MgUG9zZWlkb24sIFNjeWxsYSwgSGVybWVzLCBIZWltZGFsbCBhbmQgSGVyYWNsZXMiCi0JZGVwZW5kcyBvbiBYODYgJiYgSTJDICYmIEVYUEVSSU1FTlRBTAorCWRlcGVuZHMgb24gWDg2ICYmIEkyQwogCWhlbHAKIAkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciB2YXJpb3VzIEZ1aml0c3UgU2llbWVucwotCSAgQ29tcHV0ZXJzIHNlbnNvciBjaGlwcy4KKwkgIENvbXB1dGVycyBzZW5zb3IgY2hpcHMsIGluY2x1ZGluZyBzdXBwb3J0IGZvciB0aGUgaW50ZWdyYXRlZAorCSAgd2F0Y2hkb2cuCiAKLQkgIFRoaXMgaXMgYSBuZXcgbWVyZ2VkIGRyaXZlciBmb3IgRlNDIHNlbnNvciBjaGlwcyB3aGljaCBpcyBpbnRlbmRlZAotCSAgYXMgYSByZXBsYWNtZW50IGZvciB0aGUgZnNjcG9zLCBmc2NzY3kgYW5kIGZzY2hlciBkcml2ZXJzIGFuZCBhZGRzCi0JICBzdXBwb3J0IGZvciBzZXZlcmFsIG90aGVyIEZDUyBzZW5zb3IgY2hpcHMuCisJICBUaGlzIGlzIGEgbWVyZ2VkIGRyaXZlciBmb3IgRlNDIHNlbnNvciBjaGlwcyByZXBsYWNpbmcgdGhlIGZzY3BvcywKKwkgIGZzY3NjeSBhbmQgZnNjaGVyIGRyaXZlcnMgYW5kIGFkZGluZyBzdXBwb3J0IGZvciBzZXZlcmFsIG90aGVyIEZTQworCSAgc2Vuc29yIGNoaXBzLgogCiAJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCiAJICB3aWxsIGJlIGNhbGxlZCBmc2NobWQuCkBAIC0zOTksNyArNDA5LDggQEAKIAlzZWxlY3QgSFdNT05fVklECiAJaGVscAogCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIElURSBJVDg3MDVGLCBJVDg3MTJGLAotCSAgSVQ4NzE2RiwgSVQ4NzE4RiBhbmQgSVQ4NzI2RiBzZW5zb3IgY2hpcHMsIGFuZCB0aGUgU2lTOTYwIGNsb25lLgorCSAgSVQ4NzE2RiwgSVQ4NzE4RiwgSVQ4NzIwRiBhbmQgSVQ4NzI2RiBzZW5zb3IgY2hpcHMsIGFuZCB0aGUKKwkgIFNpUzk2MCBjbG9uZS4KIAogCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQogCSAgd2lsbCBiZSBjYWxsZWQgaXQ4Ny4KQEAgLTQxNywxMSArNDI4LDEyIEBACiAJICB3aWxsIGJlIGNhbGxlZCBsbTYzLgogCiBjb25maWcgU0VOU09SU19MTTcwCi0JdHJpc3RhdGUgIk5hdGlvbmFsIFNlbWljb25kdWN0b3IgTE03MCIKKwl0cmlzdGF0ZSAiTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBMTTcwIC8gVGV4YXMgSW5zdHJ1bWVudHMgVE1QMTIxIgogCWRlcGVuZHMgb24gU1BJX01BU1RFUiAmJiBFWFBFUklNRU5UQUwKIAloZWxwCiAJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgdGhlIE5hdGlvbmFsIFNlbWljb25kdWN0b3IKLQkgIExNNzAgZGlnaXRhbCB0ZW1wZXJhdHVyZSBzZW5zb3IgY2hpcC4KKwkgIExNNzAgYW5kIFRleGFzIEluc3RydW1lbnRzIFRNUDEyMS9UTVAxMjMgZGlnaXRhbCB0ZW1wZXJhdHVyZQorCSAgc2Vuc29yIGNoaXBzLgogCiAJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCiAJICB3aWxsIGJlIGNhbGxlZCBsbTcwLgpAQCAtNTQ4LDYgKzU2MCwxNyBAQAogCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQogCSAgd2lsbCBiZSBjYWxsZWQgbG05My4KIAorY29uZmlnIFNFTlNPUlNfTFRDNDI0NQorCXRyaXN0YXRlICJMaW5lYXIgVGVjaG5vbG9neSBMVEM0MjQ1IgorCWRlcGVuZHMgb24gSTJDICYmIEVYUEVSSU1FTlRBTAorCWRlZmF1bHQgbgorCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciBMaW5lYXIgVGVjaG5vbG9neSBMVEM0MjQ1CisJICBNdWx0aXBsZSBTdXBwbHkgSG90IFN3YXAgQ29udHJvbGxlciBJMkMgaW50ZXJmYWNlLgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gSWYgc28sIHRoZSBtb2R1bGUgd2lsbAorCSAgYmUgY2FsbGVkIGx0YzQyNDUuCisKIGNvbmZpZyBTRU5TT1JTX01BWDExMTEKIAl0cmlzdGF0ZSAiTWF4aW0gTUFYMTExMSBNdWx0aWNoYW5uZWwsIFNlcmlhbCA4LWJpdCBBREMgY2hpcCIKIAlkZXBlbmRzIG9uIFNQSV9NQVNURVIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vTWFrZWZpbGUgYi9kcml2ZXJzL2h3bW9uL01ha2VmaWxlCmluZGV4IDU4ZmM1YmUuLjhmZDEyNGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vTWFrZWZpbGUKKysrIGIvZHJpdmVycy9od21vbi9NYWtlZmlsZQpAQCAtNjIsNiArNjIsNyBAQAogb2JqLSQoQ09ORklHX1NFTlNPUlNfTE05MCkJKz0gbG05MC5vCiBvYmotJChDT05GSUdfU0VOU09SU19MTTkyKQkrPSBsbTkyLm8KIG9iai0kKENPTkZJR19TRU5TT1JTX0xNOTMpCSs9IGxtOTMubworb2JqLSQoQ09ORklHX1NFTlNPUlNfTFRDNDI0NSkJKz0gbHRjNDI0NS5vCiBvYmotJChDT05GSUdfU0VOU09SU19NQVgxMTExKQkrPSBtYXgxMTExLm8KIG9iai0kKENPTkZJR19TRU5TT1JTX01BWDE2MTkpCSs9IG1heDE2MTkubwogb2JqLSQoQ09ORklHX1NFTlNPUlNfTUFYNjY1MCkJKz0gbWF4NjY1MC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2FkdDc0NjIuYyBiL2RyaXZlcnMvaHdtb24vYWR0NzQ2Mi5jCmluZGV4IDY2MTA3YjQuLjE4NTJmMjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vYWR0NzQ2Mi5jCisrKyBiL2RyaXZlcnMvaHdtb24vYWR0NzQ2Mi5jCkBAIC0yMDQsOCArMjA0LDYgQEAKICNkZWZpbmUgTUFTS19BTkRfU0hJRlQodmFsdWUsIHByZWZpeCkJXAogCSgoKHZhbHVlKSAmIHByZWZpeCMjX01BU0spID4+IHByZWZpeCMjX1NISUZUKQogCi0jZGVmaW5lIFJPVU5EX0RJVih4LCBkaXZpc29yKSAgKCgoeCkgKyAoKGRpdmlzb3IpIC8gMikpIC8gKGRpdmlzb3IpKQotCiBzdHJ1Y3QgYWR0NzQ2Ml9kYXRhIHsKIAlzdHJ1Y3QgZGV2aWNlCQkqaHdtb25fZGV2OwogCXN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAJYXR0cnM7CkBAIC04NDAsNyArODM4LDcgQEAKIAlpZiAoc3RyaWN0X3N0cnRvbChidWYsIDEwLCAmdGVtcCkgfHwgIXRlbXBfZW5hYmxlZChkYXRhLCBhdHRyLT5pbmRleCkpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JdGVtcCA9IFJPVU5EX0RJVih0ZW1wLCAxMDAwKSArIDY0OworCXRlbXAgPSBESVZfUk9VTkRfQ0xPU0VTVCh0ZW1wLCAxMDAwKSArIDY0OwogCXRlbXAgPSBTRU5TT1JTX0xJTUlUKHRlbXAsIDAsIDI1NSk7CiAKIAltdXRleF9sb2NrKCZkYXRhLT5sb2NrKTsKQEAgLTg3OCw3ICs4NzYsNyBAQAogCWlmIChzdHJpY3Rfc3RydG9sKGJ1ZiwgMTAsICZ0ZW1wKSB8fCAhdGVtcF9lbmFibGVkKGRhdGEsIGF0dHItPmluZGV4KSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQl0ZW1wID0gUk9VTkRfRElWKHRlbXAsIDEwMDApICsgNjQ7CisJdGVtcCA9IERJVl9ST1VORF9DTE9TRVNUKHRlbXAsIDEwMDApICsgNjQ7CiAJdGVtcCA9IFNFTlNPUlNfTElNSVQodGVtcCwgMCwgMjU1KTsKIAogCW11dGV4X2xvY2soJmRhdGEtPmxvY2spOwpAQCAtOTQzLDcgKzk0MSw3IEBACiAJCXJldHVybiAtRUlOVkFMOwogCiAJdGVtcCAqPSAxMDAwOyAvKiBjb252ZXJ0IG1WIHRvIHVWICovCi0JdGVtcCA9IFJPVU5EX0RJVih0ZW1wLCB4KTsKKwl0ZW1wID0gRElWX1JPVU5EX0NMT1NFU1QodGVtcCwgeCk7CiAJdGVtcCA9IFNFTlNPUlNfTElNSVQodGVtcCwgMCwgMjU1KTsKIAogCW11dGV4X2xvY2soJmRhdGEtPmxvY2spOwpAQCAtOTg1LDcgKzk4Myw3IEBACiAJCXJldHVybiAtRUlOVkFMOwogCiAJdGVtcCAqPSAxMDAwOyAvKiBjb252ZXJ0IG1WIHRvIHVWICovCi0JdGVtcCA9IFJPVU5EX0RJVih0ZW1wLCB4KTsKKwl0ZW1wID0gRElWX1JPVU5EX0NMT1NFU1QodGVtcCwgeCk7CiAJdGVtcCA9IFNFTlNPUlNfTElNSVQodGVtcCwgMCwgMjU1KTsKIAogCW11dGV4X2xvY2soJmRhdGEtPmxvY2spOwpAQCAtMTI1MCw3ICsxMjQ4LDcgQEAKIAlpZiAoc3RyaWN0X3N0cnRvbChidWYsIDEwLCAmdGVtcCkpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JdGVtcCA9IFJPVU5EX0RJVih0ZW1wLCAxMDAwKTsKKwl0ZW1wID0gRElWX1JPVU5EX0NMT1NFU1QodGVtcCwgMTAwMCk7CiAJdGVtcCA9IFNFTlNPUlNfTElNSVQodGVtcCwgMCwgMTUpOwogCiAJLyogcGFja2FnZSB0aGluZ3MgdXAgKi8KQEAgLTEzMzcsNyArMTMzNSw3IEBACiAJaWYgKHN0cmljdF9zdHJ0b2woYnVmLCAxMCwgJnRlbXApKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCXRlbXAgPSBST1VORF9ESVYodGVtcCwgMTAwMCkgKyA2NDsKKwl0ZW1wID0gRElWX1JPVU5EX0NMT1NFU1QodGVtcCwgMTAwMCkgKyA2NDsKIAl0ZW1wID0gU0VOU09SU19MSU1JVCh0ZW1wLCAwLCAyNTUpOwogCiAJbXV0ZXhfbG9jaygmZGF0YS0+bG9jayk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2FkdDc0NzAuYyBiL2RyaXZlcnMvaHdtb24vYWR0NzQ3MC5jCmluZGV4IDEzMTFhNTkuLjYzM2UxYTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vYWR0NzQ3MC5jCisrKyBiL2RyaXZlcnMvaHdtb24vYWR0NzQ3MC5jCkBAIC0yOCw2ICsyOCw3IEBACiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2xvZzIuaD4KKyNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CiAKIC8qIEFkZHJlc3NlcyB0byBzY2FuICovCiBzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgbm9ybWFsX2kyY1tdID0geyAweDJDLCAweDJFLCAweDJGLCBJMkNfQ0xJRU5UX0VORCB9OwpAQCAtNzQsNiArNzUsNyBAQAogI2RlZmluZSBBRFQ3NDcwX1JFR19QV00xMl9DRkcJCQkweDY4CiAjZGVmaW5lCQlBRFQ3NDcwX1BXTTJfQVVUT19NQVNLCQkweDQwCiAjZGVmaW5lCQlBRFQ3NDcwX1BXTTFfQVVUT19NQVNLCQkweDgwCisjZGVmaW5lCQlBRFQ3NDcwX1BXTV9BVVRPX01BU0sJCTB4QzAKICNkZWZpbmUgQURUNzQ3MF9SRUdfUFdNMzRfQ0ZHCQkJMHg2OQogI2RlZmluZQkJQURUNzQ3MF9QV00zX0FVVE9fTUFTSwkJMHg0MAogI2RlZmluZQkJQURUNzQ3MF9QV000X0FVVE9fTUFTSwkJMHg4MApAQCAtMTI4LDggKzEzMCwxMSBAQAogLyogSG93IG9mdGVuIGRvIHdlIHJlcmVhZCBzZW5zb3IgbGltaXQgdmFsdWVzPyAoSW4gamlmZmllcykgKi8KICNkZWZpbmUgTElNSVRfUkVGUkVTSF9JTlRFUlZBTAkoNjAgKiBIWikKIAotLyogc2xlZXAgMXMgd2hpbGUgZ2F0aGVyaW5nIHRlbXBlcmF0dXJlIGRhdGEgKi8KLSNkZWZpbmUgVEVNUF9DT0xMRUNUSU9OX1RJTUUJMTAwMAorLyogV2FpdCBhdCBsZWFzdCAyMDBtcyBwZXIgc2Vuc29yIGZvciAxMCBzZW5zb3JzICovCisjZGVmaW5lIFRFTVBfQ09MTEVDVElPTl9USU1FCTIwMDAKKworLyogYXV0byB1cGRhdGUgdGhpbmcgd29uJ3QgZmlyZSBtb3JlIHRoYW4gZXZlcnkgMnMgKi8KKyNkZWZpbmUgQVVUT19VUERBVEVfSU5URVJWQUwJMjAwMAogCiAvKiBkYXRhc2hlZXQgc2F5cyB0byBkaXZpZGUgdGhpcyBudW1iZXIgYnkgdGhlIGZhbiByZWFkaW5nIHRvIGdldCBmYW4gcnBtICovCiAjZGVmaW5lIEZBTl9QRVJJT0RfVE9fUlBNKHgpCSgoOTAwMDAgKiA2MCkgLyAoeCkpCkBAIC0xMzcsOCArMTQyLDYgQEAKICNkZWZpbmUgRkFOX1BFUklPRF9JTlZBTElECTY1NTM1CiAjZGVmaW5lIEZBTl9EQVRBX1ZBTElEKHgpCSgoeCkgJiYgKHgpICE9IEZBTl9QRVJJT0RfSU5WQUxJRCkKIAotI2RlZmluZSBST1VORF9ESVYoeCwgZGl2aXNvcikJKCgoeCkgKyAoKGRpdmlzb3IpIC8gMikpIC8gKGRpdmlzb3IpKQotCiBzdHJ1Y3QgYWR0NzQ3MF9kYXRhIHsKIAlzdHJ1Y3QgZGV2aWNlCQkqaHdtb25fZGV2OwogCXN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAJYXR0cnM7CkBAIC0xNDgsNiArMTUxLDkgQEAKIAl1bnNpZ25lZCBsb25nCQlzZW5zb3JzX2xhc3RfdXBkYXRlZDsJLyogSW4gamlmZmllcyAqLwogCXVuc2lnbmVkIGxvbmcJCWxpbWl0c19sYXN0X3VwZGF0ZWQ7CS8qIEluIGppZmZpZXMgKi8KIAorCWludAkJCW51bV90ZW1wX3NlbnNvcnM7CS8qIC0xID0gcHJvYmUgKi8KKwlpbnQJCQl0ZW1wZXJhdHVyZXNfcHJvYmVkOworCiAJczgJCQl0ZW1wW0FEVDc0NzBfVEVNUF9DT1VOVF07CiAJczgJCQl0ZW1wX21pbltBRFQ3NDcwX1RFTVBfQ09VTlRdOwogCXM4CQkJdGVtcF9tYXhbQURUNzQ3MF9URU1QX0NPVU5UXTsKQEAgLTE2Myw2ICsxNjksMTAgQEAKIAl1OAkJCXB3bV9taW5bQURUNzQ3MF9QV01fQ09VTlRdOwogCXM4CQkJcHdtX3RtaW5bQURUNzQ3MF9QV01fQ09VTlRdOwogCXU4CQkJcHdtX2F1dG9fdGVtcFtBRFQ3NDcwX1BXTV9DT1VOVF07CisKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QJKmF1dG9fdXBkYXRlOworCXN0cnVjdCBjb21wbGV0aW9uCWF1dG9fdXBkYXRlX3N0b3A7CisJdW5zaWduZWQgaW50CQlhdXRvX3VwZGF0ZV9pbnRlcnZhbDsKIH07CiAKIHN0YXRpYyBpbnQgYWR0NzQ3MF9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LApAQCAtMjIwLDYgKzIzMCw4OCBAQAogCX0KIH0KIAorLyogUHJvYmUgZm9yIHRlbXBlcmF0dXJlIHNlbnNvcnMuICBBc3N1bWVzIGxvY2sgaXMgaGVsZCAqLworc3RhdGljIGludCBhZHQ3NDcwX3JlYWRfdGVtcGVyYXR1cmVzKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCQkJICAgICBzdHJ1Y3QgYWR0NzQ3MF9kYXRhICpkYXRhKQoreworCXVuc2lnbmVkIGxvbmcgcmVzOworCWludCBpOworCXU4IGNmZywgcHdtWzRdLCBwd21fY2ZnWzJdOworCisJLyogc2F2ZSBwd21bMS00XSBjb25maWcgcmVnaXN0ZXIgKi8KKwlwd21fY2ZnWzBdID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgQURUNzQ3MF9SRUdfUFdNX0NGRygwKSk7CisJcHdtX2NmZ1sxXSA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIEFEVDc0NzBfUkVHX1BXTV9DRkcoMikpOworCisJLyogc2V0IG1hbnVhbCBwd20gdG8gd2hhdGV2ZXIgaXQgaXMgc2V0IHRvIG5vdyAqLworCWZvciAoaSA9IDA7IGkgPCBBRFQ3NDcwX0ZBTl9DT1VOVDsgaSsrKQorCQlwd21baV0gPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBBRFQ3NDcwX1JFR19QV00oaSkpOworCisJLyogcHV0IHB3bSBpbiBtYW51YWwgbW9kZSAqLworCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBBRFQ3NDcwX1JFR19QV01fQ0ZHKDApLAorCQlwd21fY2ZnWzBdICYgfihBRFQ3NDcwX1BXTV9BVVRPX01BU0spKTsKKwlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgQURUNzQ3MF9SRUdfUFdNX0NGRygyKSwKKwkJcHdtX2NmZ1sxXSAmIH4oQURUNzQ3MF9QV01fQVVUT19NQVNLKSk7CisKKwkvKiB3cml0ZSBwd20gY29udHJvbCB0byB3aGF0ZXZlciBpdCB3YXMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgQURUNzQ3MF9GQU5fQ09VTlQ7IGkrKykKKwkJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIEFEVDc0NzBfUkVHX1BXTShpKSwgcHdtW2ldKTsKKworCS8qIHN0YXJ0IHJlYWRpbmcgdGVtcGVyYXR1cmUgc2Vuc29ycyAqLworCWNmZyA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIEFEVDc0NzBfUkVHX0NGRyk7CisJY2ZnIHw9IDB4ODA7CisJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIEFEVDc0NzBfUkVHX0NGRywgY2ZnKTsKKworCS8qIERlbGF5IGlzIDIwMG1zICogbnVtYmVyIG9mIHRlbXAgc2Vuc29ycy4gKi8KKwlyZXMgPSBtc2xlZXBfaW50ZXJydXB0aWJsZSgoZGF0YS0+bnVtX3RlbXBfc2Vuc29ycyA+PSAwID8KKwkJCQkgICAgZGF0YS0+bnVtX3RlbXBfc2Vuc29ycyAqIDIwMCA6CisJCQkJICAgIFRFTVBfQ09MTEVDVElPTl9USU1FKSk7CisKKwkvKiBkb25lIHJlYWRpbmcgdGVtcGVyYXR1cmUgc2Vuc29ycyAqLworCWNmZyA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIEFEVDc0NzBfUkVHX0NGRyk7CisJY2ZnICY9IH4weDgwOworCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBBRFQ3NDcwX1JFR19DRkcsIGNmZyk7CisKKwkvKiByZXN0b3JlIHB3bVsxLTRdIGNvbmZpZyByZWdpc3RlcnMgKi8KKwlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgQURUNzQ3MF9SRUdfUFdNX0NGRygwKSwgcHdtX2NmZ1swXSk7CisJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIEFEVDc0NzBfUkVHX1BXTV9DRkcoMiksIHB3bV9jZmdbMV0pOworCisJaWYgKHJlcykgeworCQlwcmludGsoS0VSTl9FUlIgImhhIGhhLCBpbnRlcnJ1cHRlZCIpOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisKKwkvKiBPbmx5IGNvdW50IGZhbnMgaWYgd2UgaGF2ZSB0byAqLworCWlmIChkYXRhLT5udW1fdGVtcF9zZW5zb3JzID49IDApCisJCXJldHVybiAwOworCisJZm9yIChpID0gMDsgaSA8IEFEVDc0NzBfVEVNUF9DT1VOVDsgaSsrKSB7CisJCWRhdGEtPnRlbXBbaV0gPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LAorCQkJCQkJQURUNzQ3MF9URU1QX1JFRyhpKSk7CisJCWlmIChkYXRhLT50ZW1wW2ldKQorCQkJZGF0YS0+bnVtX3RlbXBfc2Vuc29ycyA9IGkgKyAxOworCX0KKwlkYXRhLT50ZW1wZXJhdHVyZXNfcHJvYmVkID0gMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhZHQ3NDcwX3VwZGF0ZV90aHJlYWQodm9pZCAqcCkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gcDsKKwlzdHJ1Y3QgYWR0NzQ3MF9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisKKwl3aGlsZSAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSkgeworCQltdXRleF9sb2NrKCZkYXRhLT5sb2NrKTsKKwkJYWR0NzQ3MF9yZWFkX3RlbXBlcmF0dXJlcyhjbGllbnQsIGRhdGEpOworCQltdXRleF91bmxvY2soJmRhdGEtPmxvY2spOworCQlpZiAoa3RocmVhZF9zaG91bGRfc3RvcCgpKQorCQkJYnJlYWs7CisJCW1zbGVlcF9pbnRlcnJ1cHRpYmxlKGRhdGEtPmF1dG9fdXBkYXRlX2ludGVydmFsKTsKKwl9CisKKwljb21wbGV0ZV9hbGwoJmRhdGEtPmF1dG9fdXBkYXRlX3N0b3ApOworCXJldHVybiAwOworfQorCiBzdGF0aWMgc3RydWN0IGFkdDc0NzBfZGF0YSAqYWR0NzQ3MF91cGRhdGVfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOwpAQCAtMjI3LDMyICszMTksMzYgQEAKIAl1bnNpZ25lZCBsb25nIGxvY2FsX2ppZmZpZXMgPSBqaWZmaWVzOwogCXU4IGNmZzsKIAlpbnQgaTsKLQotCW11dGV4X2xvY2soJmRhdGEtPmxvY2spOwotCWlmICh0aW1lX2JlZm9yZShsb2NhbF9qaWZmaWVzLCBkYXRhLT5zZW5zb3JzX2xhc3RfdXBkYXRlZCArCi0JCVNFTlNPUl9SRUZSRVNIX0lOVEVSVkFMKQotCQkmJiBkYXRhLT5zZW5zb3JzX3ZhbGlkKQotCQlnb3RvIG5vX3NlbnNvcl91cGRhdGU7Ci0KLQkvKiBzdGFydCByZWFkaW5nIHRlbXBlcmF0dXJlIHNlbnNvcnMgKi8KLQljZmcgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBBRFQ3NDcwX1JFR19DRkcpOwotCWNmZyB8PSAweDgwOwotCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBBRFQ3NDcwX1JFR19DRkcsIGNmZyk7CisJaW50IG5lZWRfc2Vuc29ycyA9IDE7CisJaW50IG5lZWRfbGltaXRzID0gMTsKIAogCS8qCi0JICogRGVsYXkgaXMgMjAwbXMgKiBudW1iZXIgb2YgdG1wMDUgc2Vuc29ycy4gIFRvbyBiYWQKLQkgKiB0aGVyZSdzIG5vIHdheSB0byBmaWd1cmUgb3V0IGhvdyBtYW55IGFyZSBjb25uZWN0ZWQuCi0JICogRm9yIG5vdywgYXNzdW1lIDFzIHdpbGwgd29yay4KKwkgKiBGaWd1cmUgb3V0IGlmIHdlIG5lZWQgdG8gdXBkYXRlIHRoZSBzaGFkb3cgcmVnaXN0ZXJzLgorCSAqIExvY2tsZXNzIG1lYW5zIHRoYXQgd2UgbWF5IG9jY2FzaW9uYWxseSByZXBvcnQgb3V0IG9mCisJICogZGF0ZSBkYXRhLgogCSAqLwotCW1zbGVlcChURU1QX0NPTExFQ1RJT05fVElNRSk7CisJaWYgKHRpbWVfYmVmb3JlKGxvY2FsX2ppZmZpZXMsIGRhdGEtPnNlbnNvcnNfbGFzdF91cGRhdGVkICsKKwkJCVNFTlNPUl9SRUZSRVNIX0lOVEVSVkFMKSAmJgorCSAgICBkYXRhLT5zZW5zb3JzX3ZhbGlkKQorCQluZWVkX3NlbnNvcnMgPSAwOwogCi0JLyogZG9uZSByZWFkaW5nIHRlbXBlcmF0dXJlIHNlbnNvcnMgKi8KLQljZmcgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBBRFQ3NDcwX1JFR19DRkcpOwotCWNmZyAmPSB+MHg4MDsKLQlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgQURUNzQ3MF9SRUdfQ0ZHLCBjZmcpOworCWlmICh0aW1lX2JlZm9yZShsb2NhbF9qaWZmaWVzLCBkYXRhLT5saW1pdHNfbGFzdF91cGRhdGVkICsKKwkJCUxJTUlUX1JFRlJFU0hfSU5URVJWQUwpICYmCisJICAgIGRhdGEtPmxpbWl0c192YWxpZCkKKwkJbmVlZF9saW1pdHMgPSAwOwogCi0JZm9yIChpID0gMDsgaSA8IEFEVDc0NzBfVEVNUF9DT1VOVDsgaSsrKQotCQlkYXRhLT50ZW1wW2ldID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwKKwlpZiAoIW5lZWRfc2Vuc29ycyAmJiAhbmVlZF9saW1pdHMpCisJCXJldHVybiBkYXRhOworCisJbXV0ZXhfbG9jaygmZGF0YS0+bG9jayk7CisJaWYgKCFuZWVkX3NlbnNvcnMpCisJCWdvdG8gbm9fc2Vuc29yX3VwZGF0ZTsKKworCWlmICghZGF0YS0+dGVtcGVyYXR1cmVzX3Byb2JlZCkKKwkJYWR0NzQ3MF9yZWFkX3RlbXBlcmF0dXJlcyhjbGllbnQsIGRhdGEpOworCWVsc2UKKwkJZm9yIChpID0gMDsgaSA8IEFEVDc0NzBfVEVNUF9DT1VOVDsgaSsrKQorCQkJZGF0YS0+dGVtcFtpXSA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsCiAJCQkJCQlBRFQ3NDcwX1RFTVBfUkVHKGkpKTsKIAogCWZvciAoaSA9IDA7IGkgPCBBRFQ3NDcwX0ZBTl9DT1VOVDsgaSsrKQpAQCAtMzAyLDkgKzM5OCw3IEBACiAJZGF0YS0+c2Vuc29yc192YWxpZCA9IDE7CiAKIG5vX3NlbnNvcl91cGRhdGU6Ci0JaWYgKHRpbWVfYmVmb3JlKGxvY2FsX2ppZmZpZXMsIGRhdGEtPmxpbWl0c19sYXN0X3VwZGF0ZWQgKwotCQlMSU1JVF9SRUZSRVNIX0lOVEVSVkFMKQotCQkmJiBkYXRhLT5saW1pdHNfdmFsaWQpCisJaWYgKCFuZWVkX2xpbWl0cykKIAkJZ290byBvdXQ7CiAKIAlmb3IgKGkgPSAwOyBpIDwgQURUNzQ3MF9URU1QX0NPVU5UOyBpKyspIHsKQEAgLTMzOCw2ICs0MzIsNjYgQEAKIAlyZXR1cm4gZGF0YTsKIH0KIAorc3RhdGljIHNzaXplX3Qgc2hvd19hdXRvX3VwZGF0ZV9pbnRlcnZhbChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCSBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwKKwkJCQkJIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgYWR0NzQ3MF9kYXRhICpkYXRhID0gYWR0NzQ3MF91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGRhdGEtPmF1dG9fdXBkYXRlX2ludGVydmFsKTsKK30KKworc3RhdGljIHNzaXplX3Qgc2V0X2F1dG9fdXBkYXRlX2ludGVydmFsKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsCisJCQkJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJCQkJc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IGFkdDc0NzBfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWxvbmcgdGVtcDsKKworCWlmIChzdHJpY3Rfc3RydG9sKGJ1ZiwgMTAsICZ0ZW1wKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl0ZW1wID0gU0VOU09SU19MSU1JVCh0ZW1wLCAwLCA2MDAwMCk7CisKKwltdXRleF9sb2NrKCZkYXRhLT5sb2NrKTsKKwlkYXRhLT5hdXRvX3VwZGF0ZV9pbnRlcnZhbCA9IHRlbXA7CisJbXV0ZXhfdW5sb2NrKCZkYXRhLT5sb2NrKTsKKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHNzaXplX3Qgc2hvd19udW1fdGVtcF9zZW5zb3JzKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLAorCQkJCSAgICAgY2hhciAqYnVmKQoreworCXN0cnVjdCBhZHQ3NDcwX2RhdGEgKmRhdGEgPSBhZHQ3NDcwX3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgZGF0YS0+bnVtX3RlbXBfc2Vuc29ycyk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNldF9udW1fdGVtcF9zZW5zb3JzKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsCisJCQkJICAgIGNvbnN0IGNoYXIgKmJ1ZiwKKwkJCQkgICAgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IGFkdDc0NzBfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWxvbmcgdGVtcDsKKworCWlmIChzdHJpY3Rfc3RydG9sKGJ1ZiwgMTAsICZ0ZW1wKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl0ZW1wID0gU0VOU09SU19MSU1JVCh0ZW1wLCAtMSwgMTApOworCisJbXV0ZXhfbG9jaygmZGF0YS0+bG9jayk7CisJZGF0YS0+bnVtX3RlbXBfc2Vuc29ycyA9IHRlbXA7CisJaWYgKHRlbXAgPCAwKQorCQlkYXRhLT50ZW1wZXJhdHVyZXNfcHJvYmVkID0gMDsKKwltdXRleF91bmxvY2soJmRhdGEtPmxvY2spOworCisJcmV0dXJuIGNvdW50OworfQorCiBzdGF0aWMgc3NpemVfdCBzaG93X3RlbXBfbWluKHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCSAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsCiAJCQkgICAgIGNoYXIgKmJ1ZikKQEAgLTM2MCw3ICs1MTQsNyBAQAogCWlmIChzdHJpY3Rfc3RydG9sKGJ1ZiwgMTAsICZ0ZW1wKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQl0ZW1wID0gUk9VTkRfRElWKHRlbXAsIDEwMDApOworCXRlbXAgPSBESVZfUk9VTkRfQ0xPU0VTVCh0ZW1wLCAxMDAwKTsKIAl0ZW1wID0gU0VOU09SU19MSU1JVCh0ZW1wLCAwLCAyNTUpOwogCiAJbXV0ZXhfbG9jaygmZGF0YS0+bG9jayk7CkBAIC0zOTQsNyArNTQ4LDcgQEAKIAlpZiAoc3RyaWN0X3N0cnRvbChidWYsIDEwLCAmdGVtcCkpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JdGVtcCA9IFJPVU5EX0RJVih0ZW1wLCAxMDAwKTsKKwl0ZW1wID0gRElWX1JPVU5EX0NMT1NFU1QodGVtcCwgMTAwMCk7CiAJdGVtcCA9IFNFTlNPUlNfTElNSVQodGVtcCwgMCwgMjU1KTsKIAogCW11dGV4X2xvY2soJmRhdGEtPmxvY2spOwpAQCAtNjcxLDcgKzgyNSw3IEBACiAJaWYgKHN0cmljdF9zdHJ0b2woYnVmLCAxMCwgJnRlbXApKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCXRlbXAgPSBST1VORF9ESVYodGVtcCwgMTAwMCk7CisJdGVtcCA9IERJVl9ST1VORF9DTE9TRVNUKHRlbXAsIDEwMDApOwogCXRlbXAgPSBTRU5TT1JTX0xJTUlUKHRlbXAsIDAsIDI1NSk7CiAKIAltdXRleF9sb2NrKCZkYXRhLT5sb2NrKTsKQEAgLTgwNCw2ICs5NTgsMTAgQEAKIH0KIAogc3RhdGljIERFVklDRV9BVFRSKGFsYXJtX21hc2ssIFNfSVJVR08sIHNob3dfYWxhcm1fbWFzaywgTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFIobnVtX3RlbXBfc2Vuc29ycywgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfbnVtX3RlbXBfc2Vuc29ycywKKwkJICAgc2V0X251bV90ZW1wX3NlbnNvcnMpOworc3RhdGljIERFVklDRV9BVFRSKGF1dG9fdXBkYXRlX2ludGVydmFsLCBTX0lXVVNSIHwgU19JUlVHTywKKwkJICAgc2hvd19hdXRvX3VwZGF0ZV9pbnRlcnZhbCwgc2V0X2F1dG9fdXBkYXRlX2ludGVydmFsKTsKIAogc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMV9tYXgsIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X3RlbXBfbWF4LAogCQkgICAgc2V0X3RlbXBfbWF4LCAwKTsKQEAgLTk3Niw2ICsxMTM0LDggQEAKIHN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICphZHQ3NDcwX2F0dHJbXSA9CiB7CiAJJmRldl9hdHRyX2FsYXJtX21hc2suYXR0ciwKKwkmZGV2X2F0dHJfbnVtX3RlbXBfc2Vuc29ycy5hdHRyLAorCSZkZXZfYXR0cl9hdXRvX3VwZGF0ZV9pbnRlcnZhbC5hdHRyLAogCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfbWF4LmRldl9hdHRyLmF0dHIsCiAJJnNlbnNvcl9kZXZfYXR0cl90ZW1wMl9tYXguZGV2X2F0dHIuYXR0ciwKIAkmc2Vuc29yX2Rldl9hdHRyX3RlbXAzX21heC5kZXZfYXR0ci5hdHRyLApAQCAtMTEwOCw2ICsxMjY4LDkgQEAKIAkJZ290byBleGl0OwogCX0KIAorCWRhdGEtPm51bV90ZW1wX3NlbnNvcnMgPSAtMTsKKwlkYXRhLT5hdXRvX3VwZGF0ZV9pbnRlcnZhbCA9IEFVVE9fVVBEQVRFX0lOVEVSVkFMOworCiAJaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgZGF0YSk7CiAJbXV0ZXhfaW5pdCgmZGF0YS0+bG9jayk7CiAKQEAgLTExMjcsOCArMTI5MCwxNiBAQAogCQlnb3RvIGV4aXRfcmVtb3ZlOwogCX0KIAorCWluaXRfY29tcGxldGlvbigmZGF0YS0+YXV0b191cGRhdGVfc3RvcCk7CisJZGF0YS0+YXV0b191cGRhdGUgPSBrdGhyZWFkX3J1bihhZHQ3NDcwX3VwZGF0ZV90aHJlYWQsIGNsaWVudCwKKwkJCQkJZGV2X25hbWUoZGF0YS0+aHdtb25fZGV2KSk7CisJaWYgKElTX0VSUihkYXRhLT5hdXRvX3VwZGF0ZSkpCisJCWdvdG8gZXhpdF91bnJlZ2lzdGVyOworCiAJcmV0dXJuIDA7CiAKK2V4aXRfdW5yZWdpc3RlcjoKKwlod21vbl9kZXZpY2VfdW5yZWdpc3RlcihkYXRhLT5od21vbl9kZXYpOwogZXhpdF9yZW1vdmU6CiAJc3lzZnNfcmVtb3ZlX2dyb3VwKCZjbGllbnQtPmRldi5rb2JqLCAmZGF0YS0+YXR0cnMpOwogZXhpdF9mcmVlOgpAQCAtMTE0MSw2ICsxMzEyLDggQEAKIHsKIAlzdHJ1Y3QgYWR0NzQ3MF9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CiAKKwlrdGhyZWFkX3N0b3AoZGF0YS0+YXV0b191cGRhdGUpOworCXdhaXRfZm9yX2NvbXBsZXRpb24oJmRhdGEtPmF1dG9fdXBkYXRlX3N0b3ApOwogCWh3bW9uX2RldmljZV91bnJlZ2lzdGVyKGRhdGEtPmh3bW9uX2Rldik7CiAJc3lzZnNfcmVtb3ZlX2dyb3VwKCZjbGllbnQtPmRldi5rb2JqLCAmZGF0YS0+YXR0cnMpOwogCWtmcmVlKGRhdGEpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9hZHQ3NDczLmMgYi9kcml2ZXJzL2h3bW9uL2FkdDc0NzMuYwppbmRleCAxOGFhMzA4Li4wYTZjZTIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2FkdDc0NzMuYworKysgYi9kcml2ZXJzL2h3bW9uL2FkdDc0NzMuYwpAQCAtMTI5LDggKzEyOSw2IEBACiAjZGVmaW5lIEZBTl9QRVJJT0RfSU5WQUxJRAk2NTUzNQogI2RlZmluZSBGQU5fREFUQV9WQUxJRCh4KQkoKHgpICYmICh4KSAhPSBGQU5fUEVSSU9EX0lOVkFMSUQpCiAKLSNkZWZpbmUgUk9VTkRfRElWKHgsIGRpdmlzb3IpCSgoKHgpICsgKChkaXZpc29yKSAvIDIpKSAvIChkaXZpc29yKSkKLQogc3RydWN0IGFkdDc0NzNfZGF0YSB7CiAJc3RydWN0IGRldmljZQkJKmh3bW9uX2RldjsKIAlzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwCWF0dHJzOwpAQCAtNDU5LDcgKzQ1Nyw3IEBACiAJaWYgKHN0cmljdF9zdHJ0b2woYnVmLCAxMCwgJnRlbXApKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCXRlbXAgPSBST1VORF9ESVYodGVtcCwgMTAwMCk7CisJdGVtcCA9IERJVl9ST1VORF9DTE9TRVNUKHRlbXAsIDEwMDApOwogCXRlbXAgPSBlbmNvZGVfdGVtcChkYXRhLT50ZW1wX3R3b3NfY29tcGxlbWVudCwgdGVtcCk7CiAKIAltdXRleF9sb2NrKCZkYXRhLT5sb2NrKTsKQEAgLTQ5NSw3ICs0OTMsNyBAQAogCWlmIChzdHJpY3Rfc3RydG9sKGJ1ZiwgMTAsICZ0ZW1wKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQl0ZW1wID0gUk9VTkRfRElWKHRlbXAsIDEwMDApOworCXRlbXAgPSBESVZfUk9VTkRfQ0xPU0VTVCh0ZW1wLCAxMDAwKTsKIAl0ZW1wID0gZW5jb2RlX3RlbXAoZGF0YS0+dGVtcF90d29zX2NvbXBsZW1lbnQsIHRlbXApOwogCiAJbXV0ZXhfbG9jaygmZGF0YS0+bG9jayk7CkBAIC03MjAsNyArNzE4LDcgQEAKIAlpZiAoc3RyaWN0X3N0cnRvbChidWYsIDEwLCAmdGVtcCkpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JdGVtcCA9IFJPVU5EX0RJVih0ZW1wLCAxMDAwKTsKKwl0ZW1wID0gRElWX1JPVU5EX0NMT1NFU1QodGVtcCwgMTAwMCk7CiAJdGVtcCA9IGVuY29kZV90ZW1wKGRhdGEtPnRlbXBfdHdvc19jb21wbGVtZW50LCB0ZW1wKTsKIAogCW11dGV4X2xvY2soJmRhdGEtPmxvY2spOwpAQCAtNzU2LDcgKzc1NCw3IEBACiAJaWYgKHN0cmljdF9zdHJ0b2woYnVmLCAxMCwgJnRlbXApKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCXRlbXAgPSBST1VORF9ESVYodGVtcCwgMTAwMCk7CisJdGVtcCA9IERJVl9ST1VORF9DTE9TRVNUKHRlbXAsIDEwMDApOwogCXRlbXAgPSBlbmNvZGVfdGVtcChkYXRhLT50ZW1wX3R3b3NfY29tcGxlbWVudCwgdGVtcCk7CiAKIAltdXRleF9sb2NrKCZkYXRhLT5sb2NrKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vYXBwbGVzbWMuYyBiL2RyaXZlcnMvaHdtb24vYXBwbGVzbWMuYwppbmRleCAwODZjMmE1Li5kY2E0N2E1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2FwcGxlc21jLmMKKysrIGIvZHJpdmVycy9od21vbi9hcHBsZXNtYy5jCkBAIC0xMzEsNiArMTMxLDEwIEBACiAvKiBTZXQgMTQ6IGlNYWMgNiwxICovCiAJeyAiVEEwUCIsICJUQzBEIiwgIlRDMEgiLCAiVEMwUCIsICJURzBEIiwgIlRHMEgiLCAiVEcwUCIsICJUSDBQIiwKIAkgICJUTzBQIiwgIlRwMFAiLCBOVUxMIH0sCisvKiBTZXQgMTU6IE1hY0Jvb2sgQWlyIDIsMSAqLworCXsgIlRCMFQiLCAiVEIxUyIsICJUQjFUIiwgIlRCMlMiLCAiVEIyVCIsICJUQzBEIiwgIlROMEQiLCAiVFRGMCIsCisJICAiVFYwUCIsICJUVkZQIiwgIlRXMFAiLCAiVGgwUCIsICJUcDBQIiwgIlRwMVAiLCAiVHBGUCIsICJUczBQIiwKKwkgICJUczBTIiwgTlVMTCB9LAogfTsKIAogLyogTGlzdCBvZiBrZXlzIHVzZWQgdG8gcmVhZC93cml0ZSBmYW4gc3BlZWRzICovCkBAIC0xMzAxLDExICsxMzA1LDE3IEBACiAJeyAuYWNjZWxlcm9tZXRlciA9IDAsIC5saWdodCA9IDAsIC50ZW1wZXJhdHVyZV9zZXQgPSAxMyB9LAogLyogaU1hYyA2OiBsaWdodCBzZW5zb3Igb25seSwgdGVtcGVyYXR1cmUgc2V0IDE0ICovCiAJeyAuYWNjZWxlcm9tZXRlciA9IDAsIC5saWdodCA9IDAsIC50ZW1wZXJhdHVyZV9zZXQgPSAxNCB9LAorLyogTWFjQm9vayBBaXIgMiwxOiBhY2NlbGVyb21ldGVyLCBiYWNrbGlnaHQgYW5kIHRlbXBlcmF0dXJlIHNldCAxNSAqLworCXsgLmFjY2VsZXJvbWV0ZXIgPSAxLCAubGlnaHQgPSAxLCAudGVtcGVyYXR1cmVfc2V0ID0gMTUgfSwKIH07CiAKIC8qIE5vdGUgdGhhdCBETUlfTUFUQ0goLi4uLCJNYWNCb29rIikgd2lsbCBtYXRjaCAiTWFjQm9va1BybzEsMSIuCiAgKiBTbyB3ZSBuZWVkIHRvIHB1dCAiQXBwbGUgTWFjQm9vayBQcm8iIGJlZm9yZSAiQXBwbGUgTWFjQm9vayIuICovCiBzdGF0aWMgX19pbml0ZGF0YSBzdHJ1Y3QgZG1pX3N5c3RlbV9pZCBhcHBsZXNtY193aGl0ZWxpc3RbXSA9IHsKKwl7IGFwcGxlc21jX2RtaV9tYXRjaCwgIkFwcGxlIE1hY0Jvb2sgQWlyIDIiLCB7CisJICBETUlfTUFUQ0goRE1JX0JPQVJEX1ZFTkRPUiwgIkFwcGxlIiksCisJICBETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIk1hY0Jvb2tBaXIyIikgfSwKKwkJJmFwcGxlc21jX2RtaV9kYXRhWzE1XX0sCiAJeyBhcHBsZXNtY19kbWlfbWF0Y2gsICJBcHBsZSBNYWNCb29rIEFpciIsIHsKIAkgIERNSV9NQVRDSChETUlfQk9BUkRfVkVORE9SLCAiQXBwbGUiKSwKIAkgIERNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiTWFjQm9va0FpciIpIH0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2FzYjEwMC5jIGIvZHJpdmVycy9od21vbi9hc2IxMDAuYwppbmRleCA4YTQ1YTJlLi44YWNmODI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2FzYjEwMC5jCisrKyBiL2RyaXZlcnMvaHdtb24vYXNiMTAwLmMKQEAgLTUzLDcgKzUzLDEwIEBACiAKIC8qIEluc21vZCBwYXJhbWV0ZXJzICovCiBJMkNfQ0xJRU5UX0lOU01PRF8xKGFzYjEwMCk7Ci1JMkNfQ0xJRU5UX01PRFVMRV9QQVJNKGZvcmNlX3N1YmNsaWVudHMsICJMaXN0IG9mIHN1YmNsaWVudCBhZGRyZXNzZXM6ICIKKworc3RhdGljIHVuc2lnbmVkIHNob3J0IGZvcmNlX3N1YmNsaWVudHNbNF07Cittb2R1bGVfcGFyYW1fYXJyYXkoZm9yY2Vfc3ViY2xpZW50cywgc2hvcnQsIE5VTEwsIDApOworTU9EVUxFX1BBUk1fREVTQyhmb3JjZV9zdWJjbGllbnRzLCAiTGlzdCBvZiBzdWJjbGllbnQgYWRkcmVzc2VzOiAiCiAJIntidXMsIGNsaWVudGFkZHIsIHN1YmNsaWVudGFkZHIxLCBzdWJjbGllbnRhZGRyMn0iKTsKIAogLyogVm9sdGFnZSBJTiByZWdpc3RlcnMgMC02ICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2RtZTE3MzcuYyBiL2RyaXZlcnMvaHdtb24vZG1lMTczNy5jCmluZGV4IDI3YTVkMzkuLjNkZjIwMmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vZG1lMTczNy5jCisrKyBiL2RyaXZlcnMvaHdtb24vZG1lMTczNy5jCkBAIC0zNCw2ICszNCw3IEBACiAjaW5jbHVkZSA8bGludXgvaHdtb24tdmlkLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9hY3BpLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAKIC8qIElTQSBkZXZpY2UsIGlmIGZvdW5kICovCkBAIC0yMzYxLDYgKzIzNjIsMTAgQEAKIAl9OwogCWludCBlcnI7CiAKKwllcnIgPSBhY3BpX2NoZWNrX3Jlc291cmNlX2NvbmZsaWN0KCZyZXMpOworCWlmIChlcnIpCisJCWdvdG8gZXhpdDsKKwogCWlmICghKHBkZXYgPSBwbGF0Zm9ybV9kZXZpY2VfYWxsb2MoImRtZTE3MzciLCBhZGRyKSkpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJkbWUxNzM3OiBGYWlsZWQgdG8gYWxsb2NhdGUgZGV2aWNlLlxuIik7CiAJCWVyciA9IC1FTk9NRU07CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2Y3MTgwNWYuYyBiL2RyaXZlcnMvaHdtb24vZjcxODA1Zi5jCmluZGV4IDdhMTRhMmQuLjg5OTg3NjU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2Y3MTgwNWYuYworKysgYi9kcml2ZXJzL2h3bW9uL2Y3MTgwNWYuYwpAQCAtMzksNiArMzksNyBAQAogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9hY3BpLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAKIHN0YXRpYyB1bnNpZ25lZCBzaG9ydCBmb3JjZV9pZDsKQEAgLTE0NTUsNiArMTQ1NiwxMCBAQAogCX0KIAogCXJlcy5uYW1lID0gcGRldi0+bmFtZTsKKwllcnIgPSBhY3BpX2NoZWNrX3Jlc291cmNlX2NvbmZsaWN0KCZyZXMpOworCWlmIChlcnIpCisJCWdvdG8gZXhpdF9kZXZpY2VfcHV0OworCiAJZXJyID0gcGxhdGZvcm1fZGV2aWNlX2FkZF9yZXNvdXJjZXMocGRldiwgJnJlcywgMSk7CiAJaWYgKGVycikgewogCQlwcmludGsoS0VSTl9FUlIgRFJWTkFNRSAiOiBEZXZpY2UgcmVzb3VyY2UgYWRkaXRpb24gZmFpbGVkICIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vZjcxODgyZmcuYyBiL2RyaXZlcnMvaHdtb24vZjcxODgyZmcuYwppbmRleCA2NzA2N2U5Li42MDljYWZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2Y3MTg4MmZnLmMKKysrIGIvZHJpdmVycy9od21vbi9mNzE4ODJmZy5jCkBAIC0xLDYgKzEsNiBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICBDb3B5cmlnaHQgKEMpIDIwMDYgYnkgSGFucyBFZGdpbmd0b24gPGhhbnNAZWRnaW5ndG9uLm5sPiAgICAgICAgICAgICAgKgotICogICBDb3B5cmlnaHQgKEMpIDIwMDcgYnkgSGFucyBkZSBHb2VkZSAgPGoudy5yLmRlZ29lZGVAaGhzLm5sPiAgICAgICAgICAgKgorICogICBDb3B5cmlnaHQgKEMpIDIwMDcsMjAwOCBieSBIYW5zIGRlIEdvZWRlIDxoZGVnb2VkZUByZWRoYXQuY29tPiAgICAgICAgKgogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgogICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgogICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgpAQCAtMjcsMTEgKzI3LDEyIEBACiAjaW5jbHVkZSA8bGludXgvaHdtb24tc3lzZnMuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvYWNwaS5oPgogCiAjZGVmaW5lIERSVk5BTUUgImY3MTg4MmZnIgogCi0jZGVmaW5lIFNJT19GNzE4ODJGR19MRF9IV00JMHgwNAkvKiBIYXJkd2FyZSBtb25pdG9yIGxvZ2ljYWwgZGV2aWNlKi8KKyNkZWZpbmUgU0lPX0Y3MTg4MkZHX0xEX0hXTQkweDA0CS8qIEhhcmR3YXJlIG1vbml0b3IgbG9naWNhbCBkZXZpY2UgKi8KICNkZWZpbmUgU0lPX1VOTE9DS19LRVkJCTB4ODcJLyogS2V5IHRvIGVuYWJsZSBTdXBlci1JL08gKi8KICNkZWZpbmUgU0lPX0xPQ0tfS0VZCQkweEFBCS8qIEtleSB0byBkaWFzYmxlIFN1cGVyLUkvTyAqLwogCkBAIC00Myw3ICs0NCw5IEBACiAjZGVmaW5lIFNJT19SRUdfQUREUgkJMHg2MAkvKiBMb2dpY2FsIGRldmljZSBhZGRyZXNzICgyIGJ5dGVzKSAqLwogCiAjZGVmaW5lIFNJT19GSU5URUtfSUQJCTB4MTkzNAkvKiBNYW51ZmFjdHVyZXJzIElEICovCisjZGVmaW5lIFNJT19GNzE4NjJfSUQJCTB4MDYwMQkvKiBDaGlwc2V0IElEICovCiAjZGVmaW5lIFNJT19GNzE4ODJfSUQJCTB4MDU0MQkvKiBDaGlwc2V0IElEICovCisjZGVmaW5lIFNJT19GODAwMF9JRAkJMHgwNTgxCS8qIENoaXBzZXQgSUQgKi8KIAogI2RlZmluZSBSRUdJT05fTEVOR1RICQk4CiAjZGVmaW5lIEFERFJfUkVHX09GRlNFVAkJNQpAQCAtNTEsMjUgKzU0LDM2IEBACiAKICNkZWZpbmUgRjcxODgyRkdfUkVHX1BFQ0kJCTB4MEEKIAotI2RlZmluZSBGNzE4ODJGR19SRUdfSU5fU1RBVFVTCQkweDEyCi0jZGVmaW5lIEY3MTg4MkZHX1JFR19JTl9CRUVQCQkweDEzCisjZGVmaW5lIEY3MTg4MkZHX1JFR19JTl9TVEFUVVMJCTB4MTIgLyogZjcxODgyZmcgb25seSAqLworI2RlZmluZSBGNzE4ODJGR19SRUdfSU5fQkVFUAkJMHgxMyAvKiBmNzE4ODJmZyBvbmx5ICovCiAjZGVmaW5lIEY3MTg4MkZHX1JFR19JTihucikJCSgweDIwICArIChucikpCi0jZGVmaW5lIEY3MTg4MkZHX1JFR19JTjFfSElHSAkJMHgzMgorI2RlZmluZSBGNzE4ODJGR19SRUdfSU4xX0hJR0gJCTB4MzIgLyogZjcxODgyZmcgb25seSAqLwogCiAjZGVmaW5lIEY3MTg4MkZHX1JFR19GQU4obnIpCQkoMHhBMCArICgxNiAqIChucikpKQorI2RlZmluZSBGNzE4ODJGR19SRUdfRkFOX1RBUkdFVChucikJKDB4QTIgKyAoMTYgKiAobnIpKSkKKyNkZWZpbmUgRjcxODgyRkdfUkVHX0ZBTl9GVUxMX1NQRUVEKG5yKQkoMHhBNCArICgxNiAqIChucikpKQogI2RlZmluZSBGNzE4ODJGR19SRUdfRkFOX1NUQVRVUwkJMHg5MgogI2RlZmluZSBGNzE4ODJGR19SRUdfRkFOX0JFRVAJCTB4OTMKIAotI2RlZmluZSBGNzE4ODJGR19SRUdfVEVNUChucikJCSgweDcyICsgMiAqIChucikpCi0jZGVmaW5lIEY3MTg4MkZHX1JFR19URU1QX09WVChucikJKDB4ODIgKyAyICogKG5yKSkKLSNkZWZpbmUgRjcxODgyRkdfUkVHX1RFTVBfSElHSChucikJKDB4ODMgKyAyICogKG5yKSkKKyNkZWZpbmUgRjcxODgyRkdfUkVHX1RFTVAobnIpCQkoMHg3MCArIDIgKiAobnIpKQorI2RlZmluZSBGNzE4ODJGR19SRUdfVEVNUF9PVlQobnIpCSgweDgwICsgMiAqIChucikpCisjZGVmaW5lIEY3MTg4MkZHX1JFR19URU1QX0hJR0gobnIpCSgweDgxICsgMiAqIChucikpCiAjZGVmaW5lIEY3MTg4MkZHX1JFR19URU1QX1NUQVRVUwkweDYyCiAjZGVmaW5lIEY3MTg4MkZHX1JFR19URU1QX0JFRVAJCTB4NjMKLSNkZWZpbmUgRjcxODgyRkdfUkVHX1RFTVBfSFlTVDEJCTB4NkMKLSNkZWZpbmUgRjcxODgyRkdfUkVHX1RFTVBfSFlTVDIzCTB4NkQKKyNkZWZpbmUgRjcxODgyRkdfUkVHX1RFTVBfSFlTVChucikJKDB4NkMgKyAobnIpKQogI2RlZmluZSBGNzE4ODJGR19SRUdfVEVNUF9UWVBFCQkweDZCCiAjZGVmaW5lIEY3MTg4MkZHX1JFR19URU1QX0RJT0RFX09QRU4JMHg2RgogCisjZGVmaW5lIEY3MTg4MkZHX1JFR19QV00obnIpCQkoMHhBMyArICgxNiAqIChucikpKQorI2RlZmluZSBGNzE4ODJGR19SRUdfUFdNX1RZUEUJCTB4OTQKKyNkZWZpbmUgRjcxODgyRkdfUkVHX1BXTV9FTkFCTEUJCTB4OTYKKworI2RlZmluZSBGNzE4ODJGR19SRUdfRkFOX0hZU1QobnIpCSgweDk4ICsgKG5yKSkKKworI2RlZmluZSBGNzE4ODJGR19SRUdfUE9JTlRfUFdNKHB3bSwgcG9pbnQpCSgweEFBICsgKHBvaW50KSArICgxNiAqIChwd20pKSkKKyNkZWZpbmUgRjcxODgyRkdfUkVHX1BPSU5UX1RFTVAocHdtLCBwb2ludCkJKDB4QTYgKyAocG9pbnQpICsgKDE2ICogKHB3bSkpKQorI2RlZmluZSBGNzE4ODJGR19SRUdfUE9JTlRfTUFQUElORyhucikJCSgweEFGICsgMTYgKiAobnIpKQorCiAjZGVmaW5lCUY3MTg4MkZHX1JFR19TVEFSVAkJMHgwMQogCiAjZGVmaW5lIEZBTl9NSU5fREVURUNUCQkJMzY2IC8qIExvd2VzdCBkZXRlY3RhYmxlIGZhbnNwZWVkICovCkBAIC03OCw3ICs5MiwxNSBAQAogbW9kdWxlX3BhcmFtKGZvcmNlX2lkLCB1c2hvcnQsIDApOwogTU9EVUxFX1BBUk1fREVTQyhmb3JjZV9pZCwgIk92ZXJyaWRlIHRoZSBkZXRlY3RlZCBkZXZpY2UgSUQiKTsKIAotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmY3MTg4MmZnX3BkZXYgPSBOVUxMOworZW51bSBjaGlwcyB7IGY3MTg2MmZnLCBmNzE4ODJmZywgZjgwMDAgfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmY3MTg4MmZnX25hbWVzW10gPSB7CisJImY3MTg2MmZnIiwKKwkiZjcxODgyZmciLAorCSJmODAwMCIsCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZjcxODgyZmdfcGRldjsKIAogLyogU3VwZXItSS9PIEZ1bmN0aW9uIHByb3RvdHlwZXMgKi8KIHN0YXRpYyBpbmxpbmUgaW50IHN1cGVyaW9faW5iKGludCBiYXNlLCBpbnQgcmVnKTsKQEAgLTg3LDggKzEwOSwxMyBAQAogc3RhdGljIGlubGluZSB2b2lkIHN1cGVyaW9fc2VsZWN0KGludCBiYXNlLCBpbnQgbGQpOwogc3RhdGljIGlubGluZSB2b2lkIHN1cGVyaW9fZXhpdChpbnQgYmFzZSk7CiAKK3N0cnVjdCBmNzE4ODJmZ19zaW9fZGF0YSB7CisJZW51bSBjaGlwcyB0eXBlOworfTsKKwogc3RydWN0IGY3MTg4MmZnX2RhdGEgewogCXVuc2lnbmVkIHNob3J0IGFkZHI7CisJZW51bSBjaGlwcyB0eXBlOwogCXN0cnVjdCBkZXZpY2UgKmh3bW9uX2RldjsKIAogCXN0cnVjdCBtdXRleCB1cGRhdGVfbG9jazsKQEAgLTEwMiwxOSArMTI5LDMwIEBACiAJdTgJaW5fc3RhdHVzOwogCXU4CWluX2JlZXA7CiAJdTE2CWZhbls0XTsKKwl1MTYJZmFuX3RhcmdldFs0XTsKKwl1MTYJZmFuX2Z1bGxfc3BlZWRbNF07CiAJdTgJZmFuX3N0YXR1czsKIAl1OAlmYW5fYmVlcDsKLQl1OAl0ZW1wWzNdOwotCXU4CXRlbXBfb3Z0WzNdOwotCXU4CXRlbXBfaGlnaFszXTsKLQl1OAl0ZW1wX2h5c3RbM107Ci0JdTgJdGVtcF90eXBlWzNdOworCS8qIE5vdGU6IGFsbCBtb2RlbHMgaGF2ZSBvbmx5IDMgdGVtcGVyYXR1cmUgY2hhbm5lbHMsIGJ1dCBvbiBzb21lCisJICAgdGhleSBhcmUgYWRkcmVzc2VkIGFzIDAtMiBhbmQgb24gb3RoZXJzIGFzIDEtMywgc28gZm9yIGNvZGluZworCSAgIGNvbnZlbmllbmNlIHdlIHJlc2VydmUgc3BhY2UgZm9yIDQgY2hhbm5lbHMgKi8KKwl1OAl0ZW1wWzRdOworCXU4CXRlbXBfb3Z0WzRdOworCXU4CXRlbXBfaGlnaFs0XTsKKwl1OAl0ZW1wX2h5c3RbMl07IC8qIDIgaHlzdHMgc3RvcmVkIHBlciByZWcgKi8KKwl1OAl0ZW1wX3R5cGVbNF07CiAJdTgJdGVtcF9zdGF0dXM7CiAJdTgJdGVtcF9iZWVwOwogCXU4CXRlbXBfZGlvZGVfb3BlbjsKKwl1OAlwd21bNF07CisJdTgJcHdtX2VuYWJsZTsKKwl1OAlwd21fYXV0b19wb2ludF9oeXN0WzJdOworCXU4CXB3bV9hdXRvX3BvaW50X21hcHBpbmdbNF07CisJdTgJcHdtX2F1dG9fcG9pbnRfcHdtWzRdWzVdOworCXU4CXB3bV9hdXRvX3BvaW50X3RlbXBbNF1bNF07CiB9OwogCi0vKiBTeXNmcyBpbiovCisvKiBTeXNmcyBpbiAqLwogc3RhdGljIHNzaXplX3Qgc2hvd19pbihzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLAogCWNoYXIgKmJ1Zik7CiBzdGF0aWMgc3NpemVfdCBzaG93X2luX21heChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlCkBAIC0xMzAsNiArMTY4LDEwIEBACiAvKiBTeXNmcyBGYW4gKi8KIHN0YXRpYyBzc2l6ZV90IHNob3dfZmFuKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsCiAJY2hhciAqYnVmKTsKK3N0YXRpYyBzc2l6ZV90IHNob3dfZmFuX2Z1bGxfc3BlZWQoc3RydWN0IGRldmljZSAqZGV2LAorCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLCBjaGFyICpidWYpOworc3RhdGljIHNzaXplX3Qgc3RvcmVfZmFuX2Z1bGxfc3BlZWQoc3RydWN0IGRldmljZSAqZGV2LAorCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCk7CiBzdGF0aWMgc3NpemVfdCBzaG93X2Zhbl9iZWVwKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUKIAkqZGV2YXR0ciwgY2hhciAqYnVmKTsKIHN0YXRpYyBzc2l6ZV90IHN0b3JlX2Zhbl9iZWVwKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUKQEAgLTE2MywxNiArMjA1LDQxIEBACiAJKmRldmF0dHIsIGNoYXIgKmJ1Zik7CiBzdGF0aWMgc3NpemVfdCBzaG93X3RlbXBfZmF1bHQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZQogCSpkZXZhdHRyLCBjaGFyICpidWYpOworLyogUFdNIGFuZCBBdXRvIHBvaW50IGNvbnRyb2wgKi8KK3N0YXRpYyBzc2l6ZV90IHNob3dfcHdtKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsCisJY2hhciAqYnVmKTsKK3N0YXRpYyBzc2l6ZV90IHN0b3JlX3B3bShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLAorCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KTsKK3N0YXRpYyBzc2l6ZV90IHNob3dfcHdtX2VuYWJsZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsIGNoYXIgKmJ1Zik7CitzdGF0aWMgc3NpemVfdCBzdG9yZV9wd21fZW5hYmxlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZQkqZGV2YXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpOworc3RhdGljIHNzaXplX3Qgc2hvd19wd21faW50ZXJwb2xhdGUoc3RydWN0IGRldmljZSAqZGV2LAorCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLCBjaGFyICpidWYpOworc3RhdGljIHNzaXplX3Qgc3RvcmVfcHdtX2ludGVycG9sYXRlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpOworc3RhdGljIHNzaXplX3Qgc2hvd19wd21fYXV0b19wb2ludF9jaGFubmVsKHN0cnVjdCBkZXZpY2UgKmRldiwKKwlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwgY2hhciAqYnVmKTsKK3N0YXRpYyBzc2l6ZV90IHN0b3JlX3B3bV9hdXRvX3BvaW50X2NoYW5uZWwoc3RydWN0IGRldmljZSAqZGV2LAorCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCk7CitzdGF0aWMgc3NpemVfdCBzaG93X3B3bV9hdXRvX3BvaW50X3RlbXBfaHlzdChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsIGNoYXIgKmJ1Zik7CitzdGF0aWMgc3NpemVfdCBzdG9yZV9wd21fYXV0b19wb2ludF90ZW1wX2h5c3Qoc3RydWN0IGRldmljZSAqZGV2LAorCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCk7CitzdGF0aWMgc3NpemVfdCBzaG93X3B3bV9hdXRvX3BvaW50X3B3bShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsIGNoYXIgKmJ1Zik7CitzdGF0aWMgc3NpemVfdCBzdG9yZV9wd21fYXV0b19wb2ludF9wd20oc3RydWN0IGRldmljZSAqZGV2LAorCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCk7CitzdGF0aWMgc3NpemVfdCBzaG93X3B3bV9hdXRvX3BvaW50X3RlbXAoc3RydWN0IGRldmljZSAqZGV2LAorCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLCBjaGFyICpidWYpOworc3RhdGljIHNzaXplX3Qgc3RvcmVfcHdtX2F1dG9fcG9pbnRfdGVtcChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KTsKIC8qIFN5c2ZzIG1pc2MgKi8KIHN0YXRpYyBzc2l6ZV90IHNob3dfbmFtZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLAogCWNoYXIgKmJ1Zik7CiAKIHN0YXRpYyBpbnQgX19kZXZpbml0IGY3MTg4MmZnX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKiBwZGV2KTsKLXN0YXRpYyBpbnQgX19kZXZleGl0IGY3MTg4MmZnX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KTsKLXN0YXRpYyBpbnQgX19pbml0IGY3MTg4MmZnX2luaXQodm9pZCk7Ci1zdGF0aWMgaW50IF9faW5pdCBmNzE4ODJmZ19maW5kKGludCBzaW9hZGRyLCB1bnNpZ25lZCBzaG9ydCAqYWRkcmVzcyk7Ci1zdGF0aWMgaW50IF9faW5pdCBmNzE4ODJmZ19kZXZpY2VfYWRkKHVuc2lnbmVkIHNob3J0IGFkZHJlc3MpOwotc3RhdGljIHZvaWQgX19leGl0IGY3MTg4MmZnX2V4aXQodm9pZCk7CitzdGF0aWMgaW50IGY3MTg4MmZnX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KTsKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgZjcxODgyZmdfZHJpdmVyID0gewogCS5kcml2ZXIgPSB7CkBAIC0xODMsODYgKzI1MCw1MzEgQEAKIAkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGY3MTg4MmZnX3JlbW92ZSksCiB9OwogCi1zdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgZjcxODgyZmdfZGV2X2F0dHJbXSA9Ci17Ci0JX19BVFRSKCBuYW1lLCBTX0lSVUdPLCBzaG93X25hbWUsIE5VTEwgKSwKK3N0YXRpYyBERVZJQ0VfQVRUUihuYW1lLCBTX0lSVUdPLCBzaG93X25hbWUsIE5VTEwpOworCisvKiBUZW1wIGFuZCBpbiBhdHRyIGNvbW1vbiB0byBib3RoIHRoZSBmNzE4NjJmZyBhbmQgZjcxODgyZmcgKi8KK3N0YXRpYyBzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGVfMiBmNzE4eDJmZ19pbl90ZW1wX2F0dHJbXSA9IHsKKwlTRU5TT1JfQVRUUl8yKGluMF9pbnB1dCwgU19JUlVHTywgc2hvd19pbiwgTlVMTCwgMCwgMCksCisJU0VOU09SX0FUVFJfMihpbjFfaW5wdXQsIFNfSVJVR08sIHNob3dfaW4sIE5VTEwsIDAsIDEpLAorCVNFTlNPUl9BVFRSXzIoaW4yX2lucHV0LCBTX0lSVUdPLCBzaG93X2luLCBOVUxMLCAwLCAyKSwKKwlTRU5TT1JfQVRUUl8yKGluM19pbnB1dCwgU19JUlVHTywgc2hvd19pbiwgTlVMTCwgMCwgMyksCisJU0VOU09SX0FUVFJfMihpbjRfaW5wdXQsIFNfSVJVR08sIHNob3dfaW4sIE5VTEwsIDAsIDQpLAorCVNFTlNPUl9BVFRSXzIoaW41X2lucHV0LCBTX0lSVUdPLCBzaG93X2luLCBOVUxMLCAwLCA1KSwKKwlTRU5TT1JfQVRUUl8yKGluNl9pbnB1dCwgU19JUlVHTywgc2hvd19pbiwgTlVMTCwgMCwgNiksCisJU0VOU09SX0FUVFJfMihpbjdfaW5wdXQsIFNfSVJVR08sIHNob3dfaW4sIE5VTEwsIDAsIDcpLAorCVNFTlNPUl9BVFRSXzIoaW44X2lucHV0LCBTX0lSVUdPLCBzaG93X2luLCBOVUxMLCAwLCA4KSwKKwlTRU5TT1JfQVRUUl8yKHRlbXAxX2lucHV0LCBTX0lSVUdPLCBzaG93X3RlbXAsIE5VTEwsIDAsIDEpLAorCVNFTlNPUl9BVFRSXzIodGVtcDFfbWF4LCBTX0lSVUdPfFNfSVdVU1IsIHNob3dfdGVtcF9tYXgsCisJCXN0b3JlX3RlbXBfbWF4LCAwLCAxKSwKKwlTRU5TT1JfQVRUUl8yKHRlbXAxX21heF9oeXN0LCBTX0lSVUdPfFNfSVdVU1IsIHNob3dfdGVtcF9tYXhfaHlzdCwKKwkJc3RvcmVfdGVtcF9tYXhfaHlzdCwgMCwgMSksCisJLyogU2hvdWxkIHJlYWxseSBiZSB0ZW1wMV9tYXhfYWxhcm0sIGJ1dCBvbGRlciB2ZXJzaW9ucyBkaWQgbm90IGhhbmRsZQorCSAgIHRoZSBtYXggYW5kIGNyaXQgYWxhcm1zIHNlcGFyYXRlbHkgYW5kIGxtX3NlbnNvcnMgdjIgZGVwZW5kcyBvbiB0aGUKKwkgICBwcmVzZW5jZSBvZiB0ZW1wI19hbGFybSBmaWxlcy4gVGhlIHNhbWUgZ29lcyBmb3IgdGVtcDIvMyBfYWxhcm0uICovCisJU0VOU09SX0FUVFJfMih0ZW1wMV9hbGFybSwgU19JUlVHTywgc2hvd190ZW1wX2FsYXJtLCBOVUxMLCAwLCAxKSwKKwlTRU5TT1JfQVRUUl8yKHRlbXAxX21heF9iZWVwLCBTX0lSVUdPfFNfSVdVU1IsIHNob3dfdGVtcF9iZWVwLAorCQlzdG9yZV90ZW1wX2JlZXAsIDAsIDEpLAorCVNFTlNPUl9BVFRSXzIodGVtcDFfY3JpdCwgU19JUlVHT3xTX0lXVVNSLCBzaG93X3RlbXBfY3JpdCwKKwkJc3RvcmVfdGVtcF9jcml0LCAwLCAxKSwKKwlTRU5TT1JfQVRUUl8yKHRlbXAxX2NyaXRfaHlzdCwgU19JUlVHTywgc2hvd190ZW1wX2NyaXRfaHlzdCwgTlVMTCwKKwkJMCwgMSksCisJU0VOU09SX0FUVFJfMih0ZW1wMV9jcml0X2FsYXJtLCBTX0lSVUdPLCBzaG93X3RlbXBfYWxhcm0sIE5VTEwsIDAsIDUpLAorCVNFTlNPUl9BVFRSXzIodGVtcDFfY3JpdF9iZWVwLCBTX0lSVUdPfFNfSVdVU1IsIHNob3dfdGVtcF9iZWVwLAorCQlzdG9yZV90ZW1wX2JlZXAsIDAsIDUpLAorCVNFTlNPUl9BVFRSXzIodGVtcDFfdHlwZSwgU19JUlVHTywgc2hvd190ZW1wX3R5cGUsIE5VTEwsIDAsIDEpLAorCVNFTlNPUl9BVFRSXzIodGVtcDFfZmF1bHQsIFNfSVJVR08sIHNob3dfdGVtcF9mYXVsdCwgTlVMTCwgMCwgMSksCisJU0VOU09SX0FUVFJfMih0ZW1wMl9pbnB1dCwgU19JUlVHTywgc2hvd190ZW1wLCBOVUxMLCAwLCAyKSwKKwlTRU5TT1JfQVRUUl8yKHRlbXAyX21heCwgU19JUlVHT3xTX0lXVVNSLCBzaG93X3RlbXBfbWF4LAorCQlzdG9yZV90ZW1wX21heCwgMCwgMiksCisJU0VOU09SX0FUVFJfMih0ZW1wMl9tYXhfaHlzdCwgU19JUlVHT3xTX0lXVVNSLCBzaG93X3RlbXBfbWF4X2h5c3QsCisJCXN0b3JlX3RlbXBfbWF4X2h5c3QsIDAsIDIpLAorCS8qIFNob3VsZCBiZSB0ZW1wMl9tYXhfYWxhcm0sIHNlZSB0ZW1wMV9hbGFybSBub3RlICovCisJU0VOU09SX0FUVFJfMih0ZW1wMl9hbGFybSwgU19JUlVHTywgc2hvd190ZW1wX2FsYXJtLCBOVUxMLCAwLCAyKSwKKwlTRU5TT1JfQVRUUl8yKHRlbXAyX21heF9iZWVwLCBTX0lSVUdPfFNfSVdVU1IsIHNob3dfdGVtcF9iZWVwLAorCQlzdG9yZV90ZW1wX2JlZXAsIDAsIDIpLAorCVNFTlNPUl9BVFRSXzIodGVtcDJfY3JpdCwgU19JUlVHT3xTX0lXVVNSLCBzaG93X3RlbXBfY3JpdCwKKwkJc3RvcmVfdGVtcF9jcml0LCAwLCAyKSwKKwlTRU5TT1JfQVRUUl8yKHRlbXAyX2NyaXRfaHlzdCwgU19JUlVHTywgc2hvd190ZW1wX2NyaXRfaHlzdCwgTlVMTCwKKwkJMCwgMiksCisJU0VOU09SX0FUVFJfMih0ZW1wMl9jcml0X2FsYXJtLCBTX0lSVUdPLCBzaG93X3RlbXBfYWxhcm0sIE5VTEwsIDAsIDYpLAorCVNFTlNPUl9BVFRSXzIodGVtcDJfY3JpdF9iZWVwLCBTX0lSVUdPfFNfSVdVU1IsIHNob3dfdGVtcF9iZWVwLAorCQlzdG9yZV90ZW1wX2JlZXAsIDAsIDYpLAorCVNFTlNPUl9BVFRSXzIodGVtcDJfdHlwZSwgU19JUlVHTywgc2hvd190ZW1wX3R5cGUsIE5VTEwsIDAsIDIpLAorCVNFTlNPUl9BVFRSXzIodGVtcDJfZmF1bHQsIFNfSVJVR08sIHNob3dfdGVtcF9mYXVsdCwgTlVMTCwgMCwgMiksCisJU0VOU09SX0FUVFJfMih0ZW1wM19pbnB1dCwgU19JUlVHTywgc2hvd190ZW1wLCBOVUxMLCAwLCAzKSwKKwlTRU5TT1JfQVRUUl8yKHRlbXAzX21heCwgU19JUlVHT3xTX0lXVVNSLCBzaG93X3RlbXBfbWF4LAorCQlzdG9yZV90ZW1wX21heCwgMCwgMyksCisJU0VOU09SX0FUVFJfMih0ZW1wM19tYXhfaHlzdCwgU19JUlVHT3xTX0lXVVNSLCBzaG93X3RlbXBfbWF4X2h5c3QsCisJCXN0b3JlX3RlbXBfbWF4X2h5c3QsIDAsIDMpLAorCS8qIFNob3VsZCBiZSB0ZW1wM19tYXhfYWxhcm0sIHNlZSB0ZW1wMV9hbGFybSBub3RlICovCisJU0VOU09SX0FUVFJfMih0ZW1wM19hbGFybSwgU19JUlVHTywgc2hvd190ZW1wX2FsYXJtLCBOVUxMLCAwLCAzKSwKKwlTRU5TT1JfQVRUUl8yKHRlbXAzX21heF9iZWVwLCBTX0lSVUdPfFNfSVdVU1IsIHNob3dfdGVtcF9iZWVwLAorCQlzdG9yZV90ZW1wX2JlZXAsIDAsIDMpLAorCVNFTlNPUl9BVFRSXzIodGVtcDNfY3JpdCwgU19JUlVHT3xTX0lXVVNSLCBzaG93X3RlbXBfY3JpdCwKKwkJc3RvcmVfdGVtcF9jcml0LCAwLCAzKSwKKwlTRU5TT1JfQVRUUl8yKHRlbXAzX2NyaXRfaHlzdCwgU19JUlVHTywgc2hvd190ZW1wX2NyaXRfaHlzdCwgTlVMTCwKKwkJMCwgMyksCisJU0VOU09SX0FUVFJfMih0ZW1wM19jcml0X2FsYXJtLCBTX0lSVUdPLCBzaG93X3RlbXBfYWxhcm0sIE5VTEwsIDAsIDcpLAorCVNFTlNPUl9BVFRSXzIodGVtcDNfY3JpdF9iZWVwLCBTX0lSVUdPfFNfSVdVU1IsIHNob3dfdGVtcF9iZWVwLAorCQlzdG9yZV90ZW1wX2JlZXAsIDAsIDcpLAorCVNFTlNPUl9BVFRSXzIodGVtcDNfdHlwZSwgU19JUlVHTywgc2hvd190ZW1wX3R5cGUsIE5VTEwsIDAsIDMpLAorCVNFTlNPUl9BVFRSXzIodGVtcDNfZmF1bHQsIFNfSVJVR08sIHNob3dfdGVtcF9mYXVsdCwgTlVMTCwgMCwgMyksCiB9OwogCi1zdGF0aWMgc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlIGY3MTg4MmZnX2luX3RlbXBfYXR0cltdID0KLXsKLQlTRU5TT1JfQVRUUihpbjBfaW5wdXQsIFNfSVJVR08sIHNob3dfaW4sIE5VTEwsIDApLAotCVNFTlNPUl9BVFRSKGluMV9pbnB1dCwgU19JUlVHTywgc2hvd19pbiwgTlVMTCwgMSksCi0JU0VOU09SX0FUVFIoaW4xX21heCwgU19JUlVHT3xTX0lXVVNSLCBzaG93X2luX21heCwgc3RvcmVfaW5fbWF4LCAxKSwKLQlTRU5TT1JfQVRUUihpbjFfYmVlcCwgU19JUlVHT3xTX0lXVVNSLCBzaG93X2luX2JlZXAsIHN0b3JlX2luX2JlZXAsIDEpLAotCVNFTlNPUl9BVFRSKGluMV9hbGFybSwgU19JUlVHTywgc2hvd19pbl9hbGFybSwgTlVMTCwgMSksCi0JU0VOU09SX0FUVFIoaW4yX2lucHV0LCBTX0lSVUdPLCBzaG93X2luLCBOVUxMLCAyKSwKLQlTRU5TT1JfQVRUUihpbjNfaW5wdXQsIFNfSVJVR08sIHNob3dfaW4sIE5VTEwsIDMpLAotCVNFTlNPUl9BVFRSKGluNF9pbnB1dCwgU19JUlVHTywgc2hvd19pbiwgTlVMTCwgNCksCi0JU0VOU09SX0FUVFIoaW41X2lucHV0LCBTX0lSVUdPLCBzaG93X2luLCBOVUxMLCA1KSwKLQlTRU5TT1JfQVRUUihpbjZfaW5wdXQsIFNfSVJVR08sIHNob3dfaW4sIE5VTEwsIDYpLAotCVNFTlNPUl9BVFRSKGluN19pbnB1dCwgU19JUlVHTywgc2hvd19pbiwgTlVMTCwgNyksCi0JU0VOU09SX0FUVFIoaW44X2lucHV0LCBTX0lSVUdPLCBzaG93X2luLCBOVUxMLCA4KSwKLQlTRU5TT1JfQVRUUih0ZW1wMV9pbnB1dCwgU19JUlVHTywgc2hvd190ZW1wLCBOVUxMLCAwKSwKLQlTRU5TT1JfQVRUUih0ZW1wMV9tYXgsIFNfSVJVR098U19JV1VTUiwgc2hvd190ZW1wX21heCwKLQkJc3RvcmVfdGVtcF9tYXgsIDApLAotCVNFTlNPUl9BVFRSKHRlbXAxX21heF9oeXN0LCBTX0lSVUdPfFNfSVdVU1IsIHNob3dfdGVtcF9tYXhfaHlzdCwKLQkJc3RvcmVfdGVtcF9tYXhfaHlzdCwgMCksCi0JU0VOU09SX0FUVFIodGVtcDFfY3JpdCwgU19JUlVHT3xTX0lXVVNSLCBzaG93X3RlbXBfY3JpdCwKLQkJc3RvcmVfdGVtcF9jcml0LCAwKSwKLQlTRU5TT1JfQVRUUih0ZW1wMV9jcml0X2h5c3QsIFNfSVJVR08sIHNob3dfdGVtcF9jcml0X2h5c3QsIE5VTEwsIDApLAotCVNFTlNPUl9BVFRSKHRlbXAxX3R5cGUsIFNfSVJVR08sIHNob3dfdGVtcF90eXBlLCBOVUxMLCAwKSwKLQlTRU5TT1JfQVRUUih0ZW1wMV9iZWVwLCBTX0lSVUdPfFNfSVdVU1IsIHNob3dfdGVtcF9iZWVwLAotCQlzdG9yZV90ZW1wX2JlZXAsIDApLAotCVNFTlNPUl9BVFRSKHRlbXAxX2FsYXJtLCBTX0lSVUdPLCBzaG93X3RlbXBfYWxhcm0sIE5VTEwsIDApLAotCVNFTlNPUl9BVFRSKHRlbXAxX2ZhdWx0LCBTX0lSVUdPLCBzaG93X3RlbXBfZmF1bHQsIE5VTEwsIDApLAotCVNFTlNPUl9BVFRSKHRlbXAyX2lucHV0LCBTX0lSVUdPLCBzaG93X3RlbXAsIE5VTEwsIDEpLAotCVNFTlNPUl9BVFRSKHRlbXAyX21heCwgU19JUlVHT3xTX0lXVVNSLCBzaG93X3RlbXBfbWF4LAotCQlzdG9yZV90ZW1wX21heCwgMSksCi0JU0VOU09SX0FUVFIodGVtcDJfbWF4X2h5c3QsIFNfSVJVR098U19JV1VTUiwgc2hvd190ZW1wX21heF9oeXN0LAotCQlzdG9yZV90ZW1wX21heF9oeXN0LCAxKSwKLQlTRU5TT1JfQVRUUih0ZW1wMl9jcml0LCBTX0lSVUdPfFNfSVdVU1IsIHNob3dfdGVtcF9jcml0LAotCQlzdG9yZV90ZW1wX2NyaXQsIDEpLAotCVNFTlNPUl9BVFRSKHRlbXAyX2NyaXRfaHlzdCwgU19JUlVHTywgc2hvd190ZW1wX2NyaXRfaHlzdCwgTlVMTCwgMSksCi0JU0VOU09SX0FUVFIodGVtcDJfdHlwZSwgU19JUlVHTywgc2hvd190ZW1wX3R5cGUsIE5VTEwsIDEpLAotCVNFTlNPUl9BVFRSKHRlbXAyX2JlZXAsIFNfSVJVR098U19JV1VTUiwgc2hvd190ZW1wX2JlZXAsCi0JCXN0b3JlX3RlbXBfYmVlcCwgMSksCi0JU0VOU09SX0FUVFIodGVtcDJfYWxhcm0sIFNfSVJVR08sIHNob3dfdGVtcF9hbGFybSwgTlVMTCwgMSksCi0JU0VOU09SX0FUVFIodGVtcDJfZmF1bHQsIFNfSVJVR08sIHNob3dfdGVtcF9mYXVsdCwgTlVMTCwgMSksCi0JU0VOU09SX0FUVFIodGVtcDNfaW5wdXQsIFNfSVJVR08sIHNob3dfdGVtcCwgTlVMTCwgMiksCi0JU0VOU09SX0FUVFIodGVtcDNfbWF4LCBTX0lSVUdPfFNfSVdVU1IsIHNob3dfdGVtcF9tYXgsCi0JCXN0b3JlX3RlbXBfbWF4LCAyKSwKLQlTRU5TT1JfQVRUUih0ZW1wM19tYXhfaHlzdCwgU19JUlVHT3xTX0lXVVNSLCBzaG93X3RlbXBfbWF4X2h5c3QsCi0JCXN0b3JlX3RlbXBfbWF4X2h5c3QsIDIpLAotCVNFTlNPUl9BVFRSKHRlbXAzX2NyaXQsIFNfSVJVR098U19JV1VTUiwgc2hvd190ZW1wX2NyaXQsCi0JCXN0b3JlX3RlbXBfY3JpdCwgMiksCi0JU0VOU09SX0FUVFIodGVtcDNfY3JpdF9oeXN0LCBTX0lSVUdPLCBzaG93X3RlbXBfY3JpdF9oeXN0LCBOVUxMLCAyKSwKLQlTRU5TT1JfQVRUUih0ZW1wM190eXBlLCBTX0lSVUdPLCBzaG93X3RlbXBfdHlwZSwgTlVMTCwgMiksCi0JU0VOU09SX0FUVFIodGVtcDNfYmVlcCwgU19JUlVHT3xTX0lXVVNSLCBzaG93X3RlbXBfYmVlcCwKLQkJc3RvcmVfdGVtcF9iZWVwLCAyKSwKLQlTRU5TT1JfQVRUUih0ZW1wM19hbGFybSwgU19JUlVHTywgc2hvd190ZW1wX2FsYXJtLCBOVUxMLCAyKSwKLQlTRU5TT1JfQVRUUih0ZW1wM19mYXVsdCwgU19JUlVHTywgc2hvd190ZW1wX2ZhdWx0LCBOVUxMLCAyKQorLyogVGVtcCBhbmQgaW4gYXR0ciBmb3VuZCBvbmx5IG9uIHRoZSBmNzE4ODJmZyAqLworc3RhdGljIHN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZV8yIGY3MTg4MmZnX2luX3RlbXBfYXR0cltdID0geworCVNFTlNPUl9BVFRSXzIoaW4xX21heCwgU19JUlVHT3xTX0lXVVNSLCBzaG93X2luX21heCwgc3RvcmVfaW5fbWF4LAorCQkwLCAxKSwKKwlTRU5TT1JfQVRUUl8yKGluMV9iZWVwLCBTX0lSVUdPfFNfSVdVU1IsIHNob3dfaW5fYmVlcCwgc3RvcmVfaW5fYmVlcCwKKwkJMCwgMSksCisJU0VOU09SX0FUVFJfMihpbjFfYWxhcm0sIFNfSVJVR08sIHNob3dfaW5fYWxhcm0sIE5VTEwsIDAsIDEpLAogfTsKIAotc3RhdGljIHN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSBmNzE4ODJmZ19mYW5fYXR0cltdID0KLXsKLQlTRU5TT1JfQVRUUihmYW4xX2lucHV0LCBTX0lSVUdPLCBzaG93X2ZhbiwgTlVMTCwgMCksCi0JU0VOU09SX0FUVFIoZmFuMV9iZWVwLCBTX0lSVUdPfFNfSVdVU1IsIHNob3dfZmFuX2JlZXAsCi0JCXN0b3JlX2Zhbl9iZWVwLCAwKSwKLQlTRU5TT1JfQVRUUihmYW4xX2FsYXJtLCBTX0lSVUdPLCBzaG93X2Zhbl9hbGFybSwgTlVMTCwgMCksCi0JU0VOU09SX0FUVFIoZmFuMl9pbnB1dCwgU19JUlVHTywgc2hvd19mYW4sIE5VTEwsIDEpLAotCVNFTlNPUl9BVFRSKGZhbjJfYmVlcCwgU19JUlVHT3xTX0lXVVNSLCBzaG93X2Zhbl9iZWVwLAotCQlzdG9yZV9mYW5fYmVlcCwgMSksCi0JU0VOU09SX0FUVFIoZmFuMl9hbGFybSwgU19JUlVHTywgc2hvd19mYW5fYWxhcm0sIE5VTEwsIDEpLAotCVNFTlNPUl9BVFRSKGZhbjNfaW5wdXQsIFNfSVJVR08sIHNob3dfZmFuLCBOVUxMLCAyKSwKLQlTRU5TT1JfQVRUUihmYW4zX2JlZXAsIFNfSVJVR098U19JV1VTUiwgc2hvd19mYW5fYmVlcCwKLQkJc3RvcmVfZmFuX2JlZXAsIDIpLAotCVNFTlNPUl9BVFRSKGZhbjNfYWxhcm0sIFNfSVJVR08sIHNob3dfZmFuX2FsYXJtLCBOVUxMLCAyKSwKLQlTRU5TT1JfQVRUUihmYW40X2lucHV0LCBTX0lSVUdPLCBzaG93X2ZhbiwgTlVMTCwgMyksCi0JU0VOU09SX0FUVFIoZmFuNF9iZWVwLCBTX0lSVUdPfFNfSVdVU1IsIHNob3dfZmFuX2JlZXAsCi0JCXN0b3JlX2Zhbl9iZWVwLCAzKSwKLQlTRU5TT1JfQVRUUihmYW40X2FsYXJtLCBTX0lSVUdPLCBzaG93X2Zhbl9hbGFybSwgTlVMTCwgMykKKy8qIFRlbXAgYW5kIGluIGF0dHIgZm9yIHRoZSBmODAwMAorICAgTm90ZSBvbiB0aGUgZjgwMDAgdGVtcF9vdnQgKGNyaXQpIGlzIHVzZWQgYXMgbWF4LCBhbmQgdGVtcF9oaWdoIChtYXgpCisgICBpcyB1c2VkIGFzIGh5c3RlcmVzaXMgdmFsdWUgdG8gY2xlYXIgYWxhcm1zCisgKi8KK3N0YXRpYyBzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGVfMiBmODAwMF9pbl90ZW1wX2F0dHJbXSA9IHsKKwlTRU5TT1JfQVRUUl8yKGluMF9pbnB1dCwgU19JUlVHTywgc2hvd19pbiwgTlVMTCwgMCwgMCksCisJU0VOU09SX0FUVFJfMihpbjFfaW5wdXQsIFNfSVJVR08sIHNob3dfaW4sIE5VTEwsIDAsIDEpLAorCVNFTlNPUl9BVFRSXzIoaW4yX2lucHV0LCBTX0lSVUdPLCBzaG93X2luLCBOVUxMLCAwLCAyKSwKKwlTRU5TT1JfQVRUUl8yKHRlbXAxX2lucHV0LCBTX0lSVUdPLCBzaG93X3RlbXAsIE5VTEwsIDAsIDApLAorCVNFTlNPUl9BVFRSXzIodGVtcDFfbWF4LCBTX0lSVUdPfFNfSVdVU1IsIHNob3dfdGVtcF9jcml0LAorCQlzdG9yZV90ZW1wX2NyaXQsIDAsIDApLAorCVNFTlNPUl9BVFRSXzIodGVtcDFfbWF4X2h5c3QsIFNfSVJVR098U19JV1VTUiwgc2hvd190ZW1wX21heCwKKwkJc3RvcmVfdGVtcF9tYXgsIDAsIDApLAorCVNFTlNPUl9BVFRSXzIodGVtcDFfYWxhcm0sIFNfSVJVR08sIHNob3dfdGVtcF9hbGFybSwgTlVMTCwgMCwgNCksCisJU0VOU09SX0FUVFJfMih0ZW1wMl9pbnB1dCwgU19JUlVHTywgc2hvd190ZW1wLCBOVUxMLCAwLCAxKSwKKwlTRU5TT1JfQVRUUl8yKHRlbXAyX21heCwgU19JUlVHT3xTX0lXVVNSLCBzaG93X3RlbXBfY3JpdCwKKwkJc3RvcmVfdGVtcF9jcml0LCAwLCAxKSwKKwlTRU5TT1JfQVRUUl8yKHRlbXAyX21heF9oeXN0LCBTX0lSVUdPfFNfSVdVU1IsIHNob3dfdGVtcF9tYXgsCisJCXN0b3JlX3RlbXBfbWF4LCAwLCAxKSwKKwlTRU5TT1JfQVRUUl8yKHRlbXAyX2FsYXJtLCBTX0lSVUdPLCBzaG93X3RlbXBfYWxhcm0sIE5VTEwsIDAsIDUpLAorCVNFTlNPUl9BVFRSXzIodGVtcDJfdHlwZSwgU19JUlVHTywgc2hvd190ZW1wX3R5cGUsIE5VTEwsIDAsIDEpLAorCVNFTlNPUl9BVFRSXzIodGVtcDNfaW5wdXQsIFNfSVJVR08sIHNob3dfdGVtcCwgTlVMTCwgMCwgMiksCisJU0VOU09SX0FUVFJfMih0ZW1wM19tYXgsIFNfSVJVR098U19JV1VTUiwgc2hvd190ZW1wX2NyaXQsCisJCXN0b3JlX3RlbXBfY3JpdCwgMCwgMiksCisJU0VOU09SX0FUVFJfMih0ZW1wM19tYXhfaHlzdCwgU19JUlVHT3xTX0lXVVNSLCBzaG93X3RlbXBfbWF4LAorCQlzdG9yZV90ZW1wX21heCwgMCwgMiksCisJU0VOU09SX0FUVFJfMih0ZW1wM19hbGFybSwgU19JUlVHTywgc2hvd190ZW1wX2FsYXJtLCBOVUxMLCAwLCA2KSwKIH07CiAKKy8qIEZhbiAvIFBXTSBhdHRyIGNvbW1vbiB0byBhbGwgbW9kZWxzICovCitzdGF0aWMgc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlXzIgZnh4eHhfZmFuX2F0dHJbXSA9IHsKKwlTRU5TT1JfQVRUUl8yKGZhbjFfaW5wdXQsIFNfSVJVR08sIHNob3dfZmFuLCBOVUxMLCAwLCAwKSwKKwlTRU5TT1JfQVRUUl8yKGZhbjFfZnVsbF9zcGVlZCwgU19JUlVHT3xTX0lXVVNSLAorCQkgICAgICBzaG93X2Zhbl9mdWxsX3NwZWVkLAorCQkgICAgICBzdG9yZV9mYW5fZnVsbF9zcGVlZCwgMCwgMCksCisJU0VOU09SX0FUVFJfMihmYW4xX2FsYXJtLCBTX0lSVUdPLCBzaG93X2Zhbl9hbGFybSwgTlVMTCwgMCwgMCksCisJU0VOU09SX0FUVFJfMihmYW4yX2lucHV0LCBTX0lSVUdPLCBzaG93X2ZhbiwgTlVMTCwgMCwgMSksCisJU0VOU09SX0FUVFJfMihmYW4yX2Z1bGxfc3BlZWQsIFNfSVJVR098U19JV1VTUiwKKwkJICAgICAgc2hvd19mYW5fZnVsbF9zcGVlZCwKKwkJICAgICAgc3RvcmVfZmFuX2Z1bGxfc3BlZWQsIDAsIDEpLAorCVNFTlNPUl9BVFRSXzIoZmFuMl9hbGFybSwgU19JUlVHTywgc2hvd19mYW5fYWxhcm0sIE5VTEwsIDAsIDEpLAorCVNFTlNPUl9BVFRSXzIoZmFuM19pbnB1dCwgU19JUlVHTywgc2hvd19mYW4sIE5VTEwsIDAsIDIpLAorCVNFTlNPUl9BVFRSXzIoZmFuM19mdWxsX3NwZWVkLCBTX0lSVUdPfFNfSVdVU1IsCisJCSAgICAgIHNob3dfZmFuX2Z1bGxfc3BlZWQsCisJCSAgICAgIHN0b3JlX2Zhbl9mdWxsX3NwZWVkLCAwLCAyKSwKKwlTRU5TT1JfQVRUUl8yKGZhbjNfYWxhcm0sIFNfSVJVR08sIHNob3dfZmFuX2FsYXJtLCBOVUxMLCAwLCAyKSwKKworCVNFTlNPUl9BVFRSXzIocHdtMSwgU19JUlVHT3xTX0lXVVNSLCBzaG93X3B3bSwgc3RvcmVfcHdtLCAwLCAwKSwKKwlTRU5TT1JfQVRUUl8yKHB3bTFfZW5hYmxlLCBTX0lSVUdPfFNfSVdVU1IsIHNob3dfcHdtX2VuYWJsZSwKKwkJICAgICAgc3RvcmVfcHdtX2VuYWJsZSwgMCwgMCksCisJU0VOU09SX0FUVFJfMihwd20xX2ludGVycG9sYXRlLCBTX0lSVUdPfFNfSVdVU1IsCisJCSAgICAgIHNob3dfcHdtX2ludGVycG9sYXRlLCBzdG9yZV9wd21faW50ZXJwb2xhdGUsIDAsIDApLAorCVNFTlNPUl9BVFRSXzIocHdtMV9hdXRvX2NoYW5uZWxzX3RlbXAsIFNfSVJVR098U19JV1VTUiwKKwkJICAgICAgc2hvd19wd21fYXV0b19wb2ludF9jaGFubmVsLAorCQkgICAgICBzdG9yZV9wd21fYXV0b19wb2ludF9jaGFubmVsLCAwLCAwKSwKKworCVNFTlNPUl9BVFRSXzIocHdtMiwgU19JUlVHT3xTX0lXVVNSLCBzaG93X3B3bSwgc3RvcmVfcHdtLCAwLCAxKSwKKwlTRU5TT1JfQVRUUl8yKHB3bTJfZW5hYmxlLCBTX0lSVUdPfFNfSVdVU1IsIHNob3dfcHdtX2VuYWJsZSwKKwkJICAgICAgc3RvcmVfcHdtX2VuYWJsZSwgMCwgMSksCisJU0VOU09SX0FUVFJfMihwd20yX2ludGVycG9sYXRlLCBTX0lSVUdPfFNfSVdVU1IsCisJCSAgICAgIHNob3dfcHdtX2ludGVycG9sYXRlLCBzdG9yZV9wd21faW50ZXJwb2xhdGUsIDAsIDEpLAorCVNFTlNPUl9BVFRSXzIocHdtMl9hdXRvX2NoYW5uZWxzX3RlbXAsIFNfSVJVR098U19JV1VTUiwKKwkJICAgICAgc2hvd19wd21fYXV0b19wb2ludF9jaGFubmVsLAorCQkgICAgICBzdG9yZV9wd21fYXV0b19wb2ludF9jaGFubmVsLCAwLCAxKSwKKworCVNFTlNPUl9BVFRSXzIocHdtM19pbnRlcnBvbGF0ZSwgU19JUlVHT3xTX0lXVVNSLAorCQkgICAgICBzaG93X3B3bV9pbnRlcnBvbGF0ZSwgc3RvcmVfcHdtX2ludGVycG9sYXRlLCAwLCAyKSwKKwlTRU5TT1JfQVRUUl8yKHB3bTNfYXV0b19jaGFubmVsc190ZW1wLCBTX0lSVUdPfFNfSVdVU1IsCisJCSAgICAgIHNob3dfcHdtX2F1dG9fcG9pbnRfY2hhbm5lbCwKKwkJICAgICAgc3RvcmVfcHdtX2F1dG9fcG9pbnRfY2hhbm5lbCwgMCwgMiksCit9OworCisvKiBGYW4gLyBQV00gYXR0ciBmb3IgdGhlIGY3MTg2MmZnLCBsZXNzIHB3bXMgYW5kIGxlc3Mgem9uZXMgcGVyIHB3bSB0aGFuIHRoZQorICAgZjcxODgyZmcgKi8KK3N0YXRpYyBzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGVfMiBmNzE4NjJmZ19mYW5fYXR0cltdID0geworCVNFTlNPUl9BVFRSXzIoZmFuMV9iZWVwLCBTX0lSVUdPfFNfSVdVU1IsIHNob3dfZmFuX2JlZXAsCisJCXN0b3JlX2Zhbl9iZWVwLCAwLCAwKSwKKwlTRU5TT1JfQVRUUl8yKGZhbjJfYmVlcCwgU19JUlVHT3xTX0lXVVNSLCBzaG93X2Zhbl9iZWVwLAorCQlzdG9yZV9mYW5fYmVlcCwgMCwgMSksCisJU0VOU09SX0FUVFJfMihmYW4zX2JlZXAsIFNfSVJVR098U19JV1VTUiwgc2hvd19mYW5fYmVlcCwKKwkJc3RvcmVfZmFuX2JlZXAsIDAsIDIpLAorCisJU0VOU09SX0FUVFJfMihwd20xX2F1dG9fcG9pbnQxX3B3bSwgU19JUlVHT3xTX0lXVVNSLAorCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3B3bSwgc3RvcmVfcHdtX2F1dG9fcG9pbnRfcHdtLAorCQkgICAgICAxLCAwKSwKKwlTRU5TT1JfQVRUUl8yKHB3bTFfYXV0b19wb2ludDJfcHdtLCBTX0lSVUdPfFNfSVdVU1IsCisJCSAgICAgIHNob3dfcHdtX2F1dG9fcG9pbnRfcHdtLCBzdG9yZV9wd21fYXV0b19wb2ludF9wd20sCisJCSAgICAgIDQsIDApLAorCVNFTlNPUl9BVFRSXzIocHdtMV9hdXRvX3BvaW50MV90ZW1wLCBTX0lSVUdPfFNfSVdVU1IsCisJCSAgICAgIHNob3dfcHdtX2F1dG9fcG9pbnRfdGVtcCwgc3RvcmVfcHdtX2F1dG9fcG9pbnRfdGVtcCwKKwkJICAgICAgMCwgMCksCisJU0VOU09SX0FUVFJfMihwd20xX2F1dG9fcG9pbnQyX3RlbXAsIFNfSVJVR098U19JV1VTUiwKKwkJICAgICAgc2hvd19wd21fYXV0b19wb2ludF90ZW1wLCBzdG9yZV9wd21fYXV0b19wb2ludF90ZW1wLAorCQkgICAgICAzLCAwKSwKKwlTRU5TT1JfQVRUUl8yKHB3bTFfYXV0b19wb2ludDFfdGVtcF9oeXN0LCBTX0lSVUdPfFNfSVdVU1IsCisJCSAgICAgIHNob3dfcHdtX2F1dG9fcG9pbnRfdGVtcF9oeXN0LAorCQkgICAgICBzdG9yZV9wd21fYXV0b19wb2ludF90ZW1wX2h5c3QsCisJCSAgICAgIDAsIDApLAorCVNFTlNPUl9BVFRSXzIocHdtMV9hdXRvX3BvaW50Ml90ZW1wX2h5c3QsIFNfSVJVR08sCisJCSAgICAgIHNob3dfcHdtX2F1dG9fcG9pbnRfdGVtcF9oeXN0LCBOVUxMLCAzLCAwKSwKKworCVNFTlNPUl9BVFRSXzIocHdtMl9hdXRvX3BvaW50MV9wd20sIFNfSVJVR098U19JV1VTUiwKKwkJICAgICAgc2hvd19wd21fYXV0b19wb2ludF9wd20sIHN0b3JlX3B3bV9hdXRvX3BvaW50X3B3bSwKKwkJICAgICAgMSwgMSksCisJU0VOU09SX0FUVFJfMihwd20yX2F1dG9fcG9pbnQyX3B3bSwgU19JUlVHT3xTX0lXVVNSLAorCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3B3bSwgc3RvcmVfcHdtX2F1dG9fcG9pbnRfcHdtLAorCQkgICAgICA0LCAxKSwKKwlTRU5TT1JfQVRUUl8yKHB3bTJfYXV0b19wb2ludDFfdGVtcCwgU19JUlVHT3xTX0lXVVNSLAorCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3RlbXAsIHN0b3JlX3B3bV9hdXRvX3BvaW50X3RlbXAsCisJCSAgICAgIDAsIDEpLAorCVNFTlNPUl9BVFRSXzIocHdtMl9hdXRvX3BvaW50Ml90ZW1wLCBTX0lSVUdPfFNfSVdVU1IsCisJCSAgICAgIHNob3dfcHdtX2F1dG9fcG9pbnRfdGVtcCwgc3RvcmVfcHdtX2F1dG9fcG9pbnRfdGVtcCwKKwkJICAgICAgMywgMSksCisJU0VOU09SX0FUVFJfMihwd20yX2F1dG9fcG9pbnQxX3RlbXBfaHlzdCwgU19JUlVHT3xTX0lXVVNSLAorCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3RlbXBfaHlzdCwKKwkJICAgICAgc3RvcmVfcHdtX2F1dG9fcG9pbnRfdGVtcF9oeXN0LAorCQkgICAgICAwLCAxKSwKKwlTRU5TT1JfQVRUUl8yKHB3bTJfYXV0b19wb2ludDJfdGVtcF9oeXN0LCBTX0lSVUdPLAorCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3RlbXBfaHlzdCwgTlVMTCwgMywgMSksCisKKwlTRU5TT1JfQVRUUl8yKHB3bTMsIFNfSVJVR098U19JV1VTUiwgc2hvd19wd20sIHN0b3JlX3B3bSwgMCwgMiksCisJU0VOU09SX0FUVFJfMihwd20zX2VuYWJsZSwgU19JUlVHT3xTX0lXVVNSLCBzaG93X3B3bV9lbmFibGUsCisJCSAgICAgIHN0b3JlX3B3bV9lbmFibGUsIDAsIDIpLAorCVNFTlNPUl9BVFRSXzIocHdtM19hdXRvX3BvaW50MV9wd20sIFNfSVJVR098U19JV1VTUiwKKwkJICAgICAgc2hvd19wd21fYXV0b19wb2ludF9wd20sIHN0b3JlX3B3bV9hdXRvX3BvaW50X3B3bSwKKwkJICAgICAgMSwgMiksCisJU0VOU09SX0FUVFJfMihwd20zX2F1dG9fcG9pbnQyX3B3bSwgU19JUlVHT3xTX0lXVVNSLAorCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3B3bSwgc3RvcmVfcHdtX2F1dG9fcG9pbnRfcHdtLAorCQkgICAgICA0LCAyKSwKKwlTRU5TT1JfQVRUUl8yKHB3bTNfYXV0b19wb2ludDFfdGVtcCwgU19JUlVHT3xTX0lXVVNSLAorCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3RlbXAsIHN0b3JlX3B3bV9hdXRvX3BvaW50X3RlbXAsCisJCSAgICAgIDAsIDIpLAorCVNFTlNPUl9BVFRSXzIocHdtM19hdXRvX3BvaW50Ml90ZW1wLCBTX0lSVUdPfFNfSVdVU1IsCisJCSAgICAgIHNob3dfcHdtX2F1dG9fcG9pbnRfdGVtcCwgc3RvcmVfcHdtX2F1dG9fcG9pbnRfdGVtcCwKKwkJICAgICAgMywgMiksCisJU0VOU09SX0FUVFJfMihwd20zX2F1dG9fcG9pbnQxX3RlbXBfaHlzdCwgU19JUlVHT3xTX0lXVVNSLAorCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3RlbXBfaHlzdCwKKwkJICAgICAgc3RvcmVfcHdtX2F1dG9fcG9pbnRfdGVtcF9oeXN0LAorCQkgICAgICAwLCAyKSwKKwlTRU5TT1JfQVRUUl8yKHB3bTNfYXV0b19wb2ludDJfdGVtcF9oeXN0LCBTX0lSVUdPLAorCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3RlbXBfaHlzdCwgTlVMTCwgMywgMiksCit9OworCisvKiBGYW4gLyBQV00gYXR0ciBmb3IgdGhlIGY3MTg4MmZnICovCitzdGF0aWMgc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlXzIgZjcxODgyZmdfZmFuX2F0dHJbXSA9IHsKKwlTRU5TT1JfQVRUUl8yKGZhbjFfYmVlcCwgU19JUlVHT3xTX0lXVVNSLCBzaG93X2Zhbl9iZWVwLAorCQlzdG9yZV9mYW5fYmVlcCwgMCwgMCksCisJU0VOU09SX0FUVFJfMihmYW4yX2JlZXAsIFNfSVJVR098U19JV1VTUiwgc2hvd19mYW5fYmVlcCwKKwkJc3RvcmVfZmFuX2JlZXAsIDAsIDEpLAorCVNFTlNPUl9BVFRSXzIoZmFuM19iZWVwLCBTX0lSVUdPfFNfSVdVU1IsIHNob3dfZmFuX2JlZXAsCisJCXN0b3JlX2Zhbl9iZWVwLCAwLCAyKSwKKwlTRU5TT1JfQVRUUl8yKGZhbjRfaW5wdXQsIFNfSVJVR08sIHNob3dfZmFuLCBOVUxMLCAwLCAzKSwKKwlTRU5TT1JfQVRUUl8yKGZhbjRfZnVsbF9zcGVlZCwgU19JUlVHT3xTX0lXVVNSLAorCQkgICAgICBzaG93X2Zhbl9mdWxsX3NwZWVkLAorCQkgICAgICBzdG9yZV9mYW5fZnVsbF9zcGVlZCwgMCwgMyksCisJU0VOU09SX0FUVFJfMihmYW40X2JlZXAsIFNfSVJVR098U19JV1VTUiwgc2hvd19mYW5fYmVlcCwKKwkJc3RvcmVfZmFuX2JlZXAsIDAsIDMpLAorCVNFTlNPUl9BVFRSXzIoZmFuNF9hbGFybSwgU19JUlVHTywgc2hvd19mYW5fYWxhcm0sIE5VTEwsIDAsIDMpLAorCisJU0VOU09SX0FUVFJfMihwd20xX2F1dG9fcG9pbnQxX3B3bSwgU19JUlVHT3xTX0lXVVNSLAorCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3B3bSwgc3RvcmVfcHdtX2F1dG9fcG9pbnRfcHdtLAorCQkgICAgICAwLCAwKSwKKwlTRU5TT1JfQVRUUl8yKHB3bTFfYXV0b19wb2ludDJfcHdtLCBTX0lSVUdPfFNfSVdVU1IsCisJCSAgICAgIHNob3dfcHdtX2F1dG9fcG9pbnRfcHdtLCBzdG9yZV9wd21fYXV0b19wb2ludF9wd20sCisJCSAgICAgIDEsIDApLAorCVNFTlNPUl9BVFRSXzIocHdtMV9hdXRvX3BvaW50M19wd20sIFNfSVJVR098U19JV1VTUiwKKwkJICAgICAgc2hvd19wd21fYXV0b19wb2ludF9wd20sIHN0b3JlX3B3bV9hdXRvX3BvaW50X3B3bSwKKwkJICAgICAgMiwgMCksCisJU0VOU09SX0FUVFJfMihwd20xX2F1dG9fcG9pbnQ0X3B3bSwgU19JUlVHT3xTX0lXVVNSLAorCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3B3bSwgc3RvcmVfcHdtX2F1dG9fcG9pbnRfcHdtLAorCQkgICAgICAzLCAwKSwKKwlTRU5TT1JfQVRUUl8yKHB3bTFfYXV0b19wb2ludDVfcHdtLCBTX0lSVUdPfFNfSVdVU1IsCisJCSAgICAgIHNob3dfcHdtX2F1dG9fcG9pbnRfcHdtLCBzdG9yZV9wd21fYXV0b19wb2ludF9wd20sCisJCSAgICAgIDQsIDApLAorCVNFTlNPUl9BVFRSXzIocHdtMV9hdXRvX3BvaW50MV90ZW1wLCBTX0lSVUdPfFNfSVdVU1IsCisJCSAgICAgIHNob3dfcHdtX2F1dG9fcG9pbnRfdGVtcCwgc3RvcmVfcHdtX2F1dG9fcG9pbnRfdGVtcCwKKwkJICAgICAgMCwgMCksCisJU0VOU09SX0FUVFJfMihwd20xX2F1dG9fcG9pbnQyX3RlbXAsIFNfSVJVR098U19JV1VTUiwKKwkJICAgICAgc2hvd19wd21fYXV0b19wb2ludF90ZW1wLCBzdG9yZV9wd21fYXV0b19wb2ludF90ZW1wLAorCQkgICAgICAxLCAwKSwKKwlTRU5TT1JfQVRUUl8yKHB3bTFfYXV0b19wb2ludDNfdGVtcCwgU19JUlVHT3xTX0lXVVNSLAorCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3RlbXAsIHN0b3JlX3B3bV9hdXRvX3BvaW50X3RlbXAsCisJCSAgICAgIDIsIDApLAorCVNFTlNPUl9BVFRSXzIocHdtMV9hdXRvX3BvaW50NF90ZW1wLCBTX0lSVUdPfFNfSVdVU1IsCisJCSAgICAgIHNob3dfcHdtX2F1dG9fcG9pbnRfdGVtcCwgc3RvcmVfcHdtX2F1dG9fcG9pbnRfdGVtcCwKKwkJICAgICAgMywgMCksCisJU0VOU09SX0FUVFJfMihwd20xX2F1dG9fcG9pbnQxX3RlbXBfaHlzdCwgU19JUlVHT3xTX0lXVVNSLAorCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3RlbXBfaHlzdCwKKwkJICAgICAgc3RvcmVfcHdtX2F1dG9fcG9pbnRfdGVtcF9oeXN0LAorCQkgICAgICAwLCAwKSwKKwlTRU5TT1JfQVRUUl8yKHB3bTFfYXV0b19wb2ludDJfdGVtcF9oeXN0LCBTX0lSVUdPLAorCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3RlbXBfaHlzdCwgTlVMTCwgMSwgMCksCisJU0VOU09SX0FUVFJfMihwd20xX2F1dG9fcG9pbnQzX3RlbXBfaHlzdCwgU19JUlVHTywKKwkJICAgICAgc2hvd19wd21fYXV0b19wb2ludF90ZW1wX2h5c3QsIE5VTEwsIDIsIDApLAorCVNFTlNPUl9BVFRSXzIocHdtMV9hdXRvX3BvaW50NF90ZW1wX2h5c3QsIFNfSVJVR08sCisJCSAgICAgIHNob3dfcHdtX2F1dG9fcG9pbnRfdGVtcF9oeXN0LCBOVUxMLCAzLCAwKSwKKworCVNFTlNPUl9BVFRSXzIocHdtMl9hdXRvX3BvaW50MV9wd20sIFNfSVJVR098U19JV1VTUiwKKwkJICAgICAgc2hvd19wd21fYXV0b19wb2ludF9wd20sIHN0b3JlX3B3bV9hdXRvX3BvaW50X3B3bSwKKwkJICAgICAgMCwgMSksCisJU0VOU09SX0FUVFJfMihwd20yX2F1dG9fcG9pbnQyX3B3bSwgU19JUlVHT3xTX0lXVVNSLAorCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3B3bSwgc3RvcmVfcHdtX2F1dG9fcG9pbnRfcHdtLAorCQkgICAgICAxLCAxKSwKKwlTRU5TT1JfQVRUUl8yKHB3bTJfYXV0b19wb2ludDNfcHdtLCBTX0lSVUdPfFNfSVdVU1IsCisJCSAgICAgIHNob3dfcHdtX2F1dG9fcG9pbnRfcHdtLCBzdG9yZV9wd21fYXV0b19wb2ludF9wd20sCisJCSAgICAgIDIsIDEpLAorCVNFTlNPUl9BVFRSXzIocHdtMl9hdXRvX3BvaW50NF9wd20sIFNfSVJVR098U19JV1VTUiwKKwkJICAgICAgc2hvd19wd21fYXV0b19wb2ludF9wd20sIHN0b3JlX3B3bV9hdXRvX3BvaW50X3B3bSwKKwkJICAgICAgMywgMSksCisJU0VOU09SX0FUVFJfMihwd20yX2F1dG9fcG9pbnQ1X3B3bSwgU19JUlVHT3xTX0lXVVNSLAorCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3B3bSwgc3RvcmVfcHdtX2F1dG9fcG9pbnRfcHdtLAorCQkgICAgICA0LCAxKSwKKwlTRU5TT1JfQVRUUl8yKHB3bTJfYXV0b19wb2ludDFfdGVtcCwgU19JUlVHT3xTX0lXVVNSLAorCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3RlbXAsIHN0b3JlX3B3bV9hdXRvX3BvaW50X3RlbXAsCisJCSAgICAgIDAsIDEpLAorCVNFTlNPUl9BVFRSXzIocHdtMl9hdXRvX3BvaW50Ml90ZW1wLCBTX0lSVUdPfFNfSVdVU1IsCisJCSAgICAgIHNob3dfcHdtX2F1dG9fcG9pbnRfdGVtcCwgc3RvcmVfcHdtX2F1dG9fcG9pbnRfdGVtcCwKKwkJICAgICAgMSwgMSksCisJU0VOU09SX0FUVFJfMihwd20yX2F1dG9fcG9pbnQzX3RlbXAsIFNfSVJVR098U19JV1VTUiwKKwkJICAgICAgc2hvd19wd21fYXV0b19wb2ludF90ZW1wLCBzdG9yZV9wd21fYXV0b19wb2ludF90ZW1wLAorCQkgICAgICAyLCAxKSwKKwlTRU5TT1JfQVRUUl8yKHB3bTJfYXV0b19wb2ludDRfdGVtcCwgU19JUlVHT3xTX0lXVVNSLAorCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3RlbXAsIHN0b3JlX3B3bV9hdXRvX3BvaW50X3RlbXAsCisJCSAgICAgIDMsIDEpLAorCVNFTlNPUl9BVFRSXzIocHdtMl9hdXRvX3BvaW50MV90ZW1wX2h5c3QsIFNfSVJVR098U19JV1VTUiwKKwkJICAgICAgc2hvd19wd21fYXV0b19wb2ludF90ZW1wX2h5c3QsCisJCSAgICAgIHN0b3JlX3B3bV9hdXRvX3BvaW50X3RlbXBfaHlzdCwKKwkJICAgICAgMCwgMSksCisJU0VOU09SX0FUVFJfMihwd20yX2F1dG9fcG9pbnQyX3RlbXBfaHlzdCwgU19JUlVHTywKKwkJICAgICAgc2hvd19wd21fYXV0b19wb2ludF90ZW1wX2h5c3QsIE5VTEwsIDEsIDEpLAorCVNFTlNPUl9BVFRSXzIocHdtMl9hdXRvX3BvaW50M190ZW1wX2h5c3QsIFNfSVJVR08sCisJCSAgICAgIHNob3dfcHdtX2F1dG9fcG9pbnRfdGVtcF9oeXN0LCBOVUxMLCAyLCAxKSwKKwlTRU5TT1JfQVRUUl8yKHB3bTJfYXV0b19wb2ludDRfdGVtcF9oeXN0LCBTX0lSVUdPLAorCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3RlbXBfaHlzdCwgTlVMTCwgMywgMSksCisKKwlTRU5TT1JfQVRUUl8yKHB3bTMsIFNfSVJVR098U19JV1VTUiwgc2hvd19wd20sIHN0b3JlX3B3bSwgMCwgMiksCisJU0VOU09SX0FUVFJfMihwd20zX2VuYWJsZSwgU19JUlVHT3xTX0lXVVNSLCBzaG93X3B3bV9lbmFibGUsCisJCSAgICAgIHN0b3JlX3B3bV9lbmFibGUsIDAsIDIpLAorCVNFTlNPUl9BVFRSXzIocHdtM19hdXRvX3BvaW50MV9wd20sIFNfSVJVR098U19JV1VTUiwKKwkJICAgICAgc2hvd19wd21fYXV0b19wb2ludF9wd20sIHN0b3JlX3B3bV9hdXRvX3BvaW50X3B3bSwKKwkJICAgICAgMCwgMiksCisJU0VOU09SX0FUVFJfMihwd20zX2F1dG9fcG9pbnQyX3B3bSwgU19JUlVHT3xTX0lXVVNSLAorCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3B3bSwgc3RvcmVfcHdtX2F1dG9fcG9pbnRfcHdtLAorCQkgICAgICAxLCAyKSwKKwlTRU5TT1JfQVRUUl8yKHB3bTNfYXV0b19wb2ludDNfcHdtLCBTX0lSVUdPfFNfSVdVU1IsCisJCSAgICAgIHNob3dfcHdtX2F1dG9fcG9pbnRfcHdtLCBzdG9yZV9wd21fYXV0b19wb2ludF9wd20sCisJCSAgICAgIDIsIDIpLAorCVNFTlNPUl9BVFRSXzIocHdtM19hdXRvX3BvaW50NF9wd20sIFNfSVJVR098U19JV1VTUiwKKwkJICAgICAgc2hvd19wd21fYXV0b19wb2ludF9wd20sIHN0b3JlX3B3bV9hdXRvX3BvaW50X3B3bSwKKwkJICAgICAgMywgMiksCisJU0VOU09SX0FUVFJfMihwd20zX2F1dG9fcG9pbnQ1X3B3bSwgU19JUlVHT3xTX0lXVVNSLAorCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3B3bSwgc3RvcmVfcHdtX2F1dG9fcG9pbnRfcHdtLAorCQkgICAgICA0LCAyKSwKKwlTRU5TT1JfQVRUUl8yKHB3bTNfYXV0b19wb2ludDFfdGVtcCwgU19JUlVHT3xTX0lXVVNSLAorCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3RlbXAsIHN0b3JlX3B3bV9hdXRvX3BvaW50X3RlbXAsCisJCSAgICAgIDAsIDIpLAorCVNFTlNPUl9BVFRSXzIocHdtM19hdXRvX3BvaW50Ml90ZW1wLCBTX0lSVUdPfFNfSVdVU1IsCisJCSAgICAgIHNob3dfcHdtX2F1dG9fcG9pbnRfdGVtcCwgc3RvcmVfcHdtX2F1dG9fcG9pbnRfdGVtcCwKKwkJICAgICAgMSwgMiksCisJU0VOU09SX0FUVFJfMihwd20zX2F1dG9fcG9pbnQzX3RlbXAsIFNfSVJVR098U19JV1VTUiwKKwkJICAgICAgc2hvd19wd21fYXV0b19wb2ludF90ZW1wLCBzdG9yZV9wd21fYXV0b19wb2ludF90ZW1wLAorCQkgICAgICAyLCAyKSwKKwlTRU5TT1JfQVRUUl8yKHB3bTNfYXV0b19wb2ludDRfdGVtcCwgU19JUlVHT3xTX0lXVVNSLAorCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3RlbXAsIHN0b3JlX3B3bV9hdXRvX3BvaW50X3RlbXAsCisJCSAgICAgIDMsIDIpLAorCVNFTlNPUl9BVFRSXzIocHdtM19hdXRvX3BvaW50MV90ZW1wX2h5c3QsIFNfSVJVR098U19JV1VTUiwKKwkJICAgICAgc2hvd19wd21fYXV0b19wb2ludF90ZW1wX2h5c3QsCisJCSAgICAgIHN0b3JlX3B3bV9hdXRvX3BvaW50X3RlbXBfaHlzdCwKKwkJICAgICAgMCwgMiksCisJU0VOU09SX0FUVFJfMihwd20zX2F1dG9fcG9pbnQyX3RlbXBfaHlzdCwgU19JUlVHTywKKwkJICAgICAgc2hvd19wd21fYXV0b19wb2ludF90ZW1wX2h5c3QsIE5VTEwsIDEsIDIpLAorCVNFTlNPUl9BVFRSXzIocHdtM19hdXRvX3BvaW50M190ZW1wX2h5c3QsIFNfSVJVR08sCisJCSAgICAgIHNob3dfcHdtX2F1dG9fcG9pbnRfdGVtcF9oeXN0LCBOVUxMLCAyLCAyKSwKKwlTRU5TT1JfQVRUUl8yKHB3bTNfYXV0b19wb2ludDRfdGVtcF9oeXN0LCBTX0lSVUdPLAorCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3RlbXBfaHlzdCwgTlVMTCwgMywgMiksCisKKwlTRU5TT1JfQVRUUl8yKHB3bTQsIFNfSVJVR098U19JV1VTUiwgc2hvd19wd20sIHN0b3JlX3B3bSwgMCwgMyksCisJU0VOU09SX0FUVFJfMihwd200X2VuYWJsZSwgU19JUlVHT3xTX0lXVVNSLCBzaG93X3B3bV9lbmFibGUsCisJCSAgICAgIHN0b3JlX3B3bV9lbmFibGUsIDAsIDMpLAorCVNFTlNPUl9BVFRSXzIocHdtNF9pbnRlcnBvbGF0ZSwgU19JUlVHT3xTX0lXVVNSLAorCQkgICAgICBzaG93X3B3bV9pbnRlcnBvbGF0ZSwgc3RvcmVfcHdtX2ludGVycG9sYXRlLCAwLCAzKSwKKwlTRU5TT1JfQVRUUl8yKHB3bTRfYXV0b19jaGFubmVsc190ZW1wLCBTX0lSVUdPfFNfSVdVU1IsCisJCSAgICAgIHNob3dfcHdtX2F1dG9fcG9pbnRfY2hhbm5lbCwKKwkJICAgICAgc3RvcmVfcHdtX2F1dG9fcG9pbnRfY2hhbm5lbCwgMCwgMyksCisJU0VOU09SX0FUVFJfMihwd200X2F1dG9fcG9pbnQxX3B3bSwgU19JUlVHT3xTX0lXVVNSLAorCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3B3bSwgc3RvcmVfcHdtX2F1dG9fcG9pbnRfcHdtLAorCQkgICAgICAwLCAzKSwKKwlTRU5TT1JfQVRUUl8yKHB3bTRfYXV0b19wb2ludDJfcHdtLCBTX0lSVUdPfFNfSVdVU1IsCisJCSAgICAgIHNob3dfcHdtX2F1dG9fcG9pbnRfcHdtLCBzdG9yZV9wd21fYXV0b19wb2ludF9wd20sCisJCSAgICAgIDEsIDMpLAorCVNFTlNPUl9BVFRSXzIocHdtNF9hdXRvX3BvaW50M19wd20sIFNfSVJVR098U19JV1VTUiwKKwkJICAgICAgc2hvd19wd21fYXV0b19wb2ludF9wd20sIHN0b3JlX3B3bV9hdXRvX3BvaW50X3B3bSwKKwkJICAgICAgMiwgMyksCisJU0VOU09SX0FUVFJfMihwd200X2F1dG9fcG9pbnQ0X3B3bSwgU19JUlVHT3xTX0lXVVNSLAorCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3B3bSwgc3RvcmVfcHdtX2F1dG9fcG9pbnRfcHdtLAorCQkgICAgICAzLCAzKSwKKwlTRU5TT1JfQVRUUl8yKHB3bTRfYXV0b19wb2ludDVfcHdtLCBTX0lSVUdPfFNfSVdVU1IsCisJCSAgICAgIHNob3dfcHdtX2F1dG9fcG9pbnRfcHdtLCBzdG9yZV9wd21fYXV0b19wb2ludF9wd20sCisJCSAgICAgIDQsIDMpLAorCVNFTlNPUl9BVFRSXzIocHdtNF9hdXRvX3BvaW50MV90ZW1wLCBTX0lSVUdPfFNfSVdVU1IsCisJCSAgICAgIHNob3dfcHdtX2F1dG9fcG9pbnRfdGVtcCwgc3RvcmVfcHdtX2F1dG9fcG9pbnRfdGVtcCwKKwkJICAgICAgMCwgMyksCisJU0VOU09SX0FUVFJfMihwd200X2F1dG9fcG9pbnQyX3RlbXAsIFNfSVJVR098U19JV1VTUiwKKwkJICAgICAgc2hvd19wd21fYXV0b19wb2ludF90ZW1wLCBzdG9yZV9wd21fYXV0b19wb2ludF90ZW1wLAorCQkgICAgICAxLCAzKSwKKwlTRU5TT1JfQVRUUl8yKHB3bTRfYXV0b19wb2ludDNfdGVtcCwgU19JUlVHT3xTX0lXVVNSLAorCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3RlbXAsIHN0b3JlX3B3bV9hdXRvX3BvaW50X3RlbXAsCisJCSAgICAgIDIsIDMpLAorCVNFTlNPUl9BVFRSXzIocHdtNF9hdXRvX3BvaW50NF90ZW1wLCBTX0lSVUdPfFNfSVdVU1IsCisJCSAgICAgIHNob3dfcHdtX2F1dG9fcG9pbnRfdGVtcCwgc3RvcmVfcHdtX2F1dG9fcG9pbnRfdGVtcCwKKwkJICAgICAgMywgMyksCisJU0VOU09SX0FUVFJfMihwd200X2F1dG9fcG9pbnQxX3RlbXBfaHlzdCwgU19JUlVHT3xTX0lXVVNSLAorCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3RlbXBfaHlzdCwKKwkJICAgICAgc3RvcmVfcHdtX2F1dG9fcG9pbnRfdGVtcF9oeXN0LAorCQkgICAgICAwLCAzKSwKKwlTRU5TT1JfQVRUUl8yKHB3bTRfYXV0b19wb2ludDJfdGVtcF9oeXN0LCBTX0lSVUdPLAorCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3RlbXBfaHlzdCwgTlVMTCwgMSwgMyksCisJU0VOU09SX0FUVFJfMihwd200X2F1dG9fcG9pbnQzX3RlbXBfaHlzdCwgU19JUlVHTywKKwkJICAgICAgc2hvd19wd21fYXV0b19wb2ludF90ZW1wX2h5c3QsIE5VTEwsIDIsIDMpLAorCVNFTlNPUl9BVFRSXzIocHdtNF9hdXRvX3BvaW50NF90ZW1wX2h5c3QsIFNfSVJVR08sCisJCSAgICAgIHNob3dfcHdtX2F1dG9fcG9pbnRfdGVtcF9oeXN0LCBOVUxMLCAzLCAzKSwKK307CisKKy8qIEZhbiAvIFBXTSBhdHRyIGZvciB0aGUgZjgwMDAsIHpvbmVzIG1hcHBlZCB0byB0ZW1wIGluc3RlYWQgb2YgdG8gcHdtIQorICAgQWxzbyB0aGUgcmVnaXN0ZXIgYmxvY2sgYXQgb2Zmc2V0IEEwIG1hcHMgdG8gVEVNUDEgKHNvIG91ciB0ZW1wMiwgYXMgdGhlCisgICBGODAwMCBzdGFydHMgY291bnRpbmcgdGVtcHMgYXQgMCksIEIwIG1hcHMgdGhlIFRFTVAyIGFuZCBDMCBtYXBzIHRvIFRFTVAwICovCitzdGF0aWMgc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlXzIgZjgwMDBfZmFuX2F0dHJbXSA9IHsKKwlTRU5TT1JfQVRUUl8yKGZhbjRfaW5wdXQsIFNfSVJVR08sIHNob3dfZmFuLCBOVUxMLCAwLCAzKSwKKworCVNFTlNPUl9BVFRSXzIocHdtMywgU19JUlVHTywgc2hvd19wd20sIE5VTEwsIDAsIDIpLAorCisJU0VOU09SX0FUVFJfMih0ZW1wMV9hdXRvX3BvaW50MV9wd20sIFNfSVJVR098U19JV1VTUiwKKwkJICAgICAgc2hvd19wd21fYXV0b19wb2ludF9wd20sIHN0b3JlX3B3bV9hdXRvX3BvaW50X3B3bSwKKwkJICAgICAgMCwgMiksCisJU0VOU09SX0FUVFJfMih0ZW1wMV9hdXRvX3BvaW50Ml9wd20sIFNfSVJVR098U19JV1VTUiwKKwkJICAgICAgc2hvd19wd21fYXV0b19wb2ludF9wd20sIHN0b3JlX3B3bV9hdXRvX3BvaW50X3B3bSwKKwkJICAgICAgMSwgMiksCisJU0VOU09SX0FUVFJfMih0ZW1wMV9hdXRvX3BvaW50M19wd20sIFNfSVJVR098U19JV1VTUiwKKwkJICAgICAgc2hvd19wd21fYXV0b19wb2ludF9wd20sIHN0b3JlX3B3bV9hdXRvX3BvaW50X3B3bSwKKwkJICAgICAgMiwgMiksCisJU0VOU09SX0FUVFJfMih0ZW1wMV9hdXRvX3BvaW50NF9wd20sIFNfSVJVR098U19JV1VTUiwKKwkJICAgICAgc2hvd19wd21fYXV0b19wb2ludF9wd20sIHN0b3JlX3B3bV9hdXRvX3BvaW50X3B3bSwKKwkJICAgICAgMywgMiksCisJU0VOU09SX0FUVFJfMih0ZW1wMV9hdXRvX3BvaW50NV9wd20sIFNfSVJVR098U19JV1VTUiwKKwkJICAgICAgc2hvd19wd21fYXV0b19wb2ludF9wd20sIHN0b3JlX3B3bV9hdXRvX3BvaW50X3B3bSwKKwkJICAgICAgNCwgMiksCisJU0VOU09SX0FUVFJfMih0ZW1wMV9hdXRvX3BvaW50MV90ZW1wLCBTX0lSVUdPfFNfSVdVU1IsCisJCSAgICAgIHNob3dfcHdtX2F1dG9fcG9pbnRfdGVtcCwgc3RvcmVfcHdtX2F1dG9fcG9pbnRfdGVtcCwKKwkJICAgICAgMCwgMiksCisJU0VOU09SX0FUVFJfMih0ZW1wMV9hdXRvX3BvaW50Ml90ZW1wLCBTX0lSVUdPfFNfSVdVU1IsCisJCSAgICAgIHNob3dfcHdtX2F1dG9fcG9pbnRfdGVtcCwgc3RvcmVfcHdtX2F1dG9fcG9pbnRfdGVtcCwKKwkJICAgICAgMSwgMiksCisJU0VOU09SX0FUVFJfMih0ZW1wMV9hdXRvX3BvaW50M190ZW1wLCBTX0lSVUdPfFNfSVdVU1IsCisJCSAgICAgIHNob3dfcHdtX2F1dG9fcG9pbnRfdGVtcCwgc3RvcmVfcHdtX2F1dG9fcG9pbnRfdGVtcCwKKwkJICAgICAgMiwgMiksCisJU0VOU09SX0FUVFJfMih0ZW1wMV9hdXRvX3BvaW50NF90ZW1wLCBTX0lSVUdPfFNfSVdVU1IsCisJCSAgICAgIHNob3dfcHdtX2F1dG9fcG9pbnRfdGVtcCwgc3RvcmVfcHdtX2F1dG9fcG9pbnRfdGVtcCwKKwkJICAgICAgMywgMiksCisJU0VOU09SX0FUVFJfMih0ZW1wMV9hdXRvX3BvaW50MV90ZW1wX2h5c3QsIFNfSVJVR098U19JV1VTUiwKKwkJICAgICAgc2hvd19wd21fYXV0b19wb2ludF90ZW1wX2h5c3QsCisJCSAgICAgIHN0b3JlX3B3bV9hdXRvX3BvaW50X3RlbXBfaHlzdCwKKwkJICAgICAgMCwgMiksCisJU0VOU09SX0FUVFJfMih0ZW1wMV9hdXRvX3BvaW50Ml90ZW1wX2h5c3QsIFNfSVJVR08sCisJCSAgICAgIHNob3dfcHdtX2F1dG9fcG9pbnRfdGVtcF9oeXN0LCBOVUxMLCAxLCAyKSwKKwlTRU5TT1JfQVRUUl8yKHRlbXAxX2F1dG9fcG9pbnQzX3RlbXBfaHlzdCwgU19JUlVHTywKKwkJICAgICAgc2hvd19wd21fYXV0b19wb2ludF90ZW1wX2h5c3QsIE5VTEwsIDIsIDIpLAorCVNFTlNPUl9BVFRSXzIodGVtcDFfYXV0b19wb2ludDRfdGVtcF9oeXN0LCBTX0lSVUdPLAorCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3RlbXBfaHlzdCwgTlVMTCwgMywgMiksCisKKwlTRU5TT1JfQVRUUl8yKHRlbXAyX2F1dG9fcG9pbnQxX3B3bSwgU19JUlVHT3xTX0lXVVNSLAorCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3B3bSwgc3RvcmVfcHdtX2F1dG9fcG9pbnRfcHdtLAorCQkgICAgICAwLCAwKSwKKwlTRU5TT1JfQVRUUl8yKHRlbXAyX2F1dG9fcG9pbnQyX3B3bSwgU19JUlVHT3xTX0lXVVNSLAorCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3B3bSwgc3RvcmVfcHdtX2F1dG9fcG9pbnRfcHdtLAorCQkgICAgICAxLCAwKSwKKwlTRU5TT1JfQVRUUl8yKHRlbXAyX2F1dG9fcG9pbnQzX3B3bSwgU19JUlVHT3xTX0lXVVNSLAorCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3B3bSwgc3RvcmVfcHdtX2F1dG9fcG9pbnRfcHdtLAorCQkgICAgICAyLCAwKSwKKwlTRU5TT1JfQVRUUl8yKHRlbXAyX2F1dG9fcG9pbnQ0X3B3bSwgU19JUlVHT3xTX0lXVVNSLAorCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3B3bSwgc3RvcmVfcHdtX2F1dG9fcG9pbnRfcHdtLAorCQkgICAgICAzLCAwKSwKKwlTRU5TT1JfQVRUUl8yKHRlbXAyX2F1dG9fcG9pbnQ1X3B3bSwgU19JUlVHT3xTX0lXVVNSLAorCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3B3bSwgc3RvcmVfcHdtX2F1dG9fcG9pbnRfcHdtLAorCQkgICAgICA0LCAwKSwKKwlTRU5TT1JfQVRUUl8yKHRlbXAyX2F1dG9fcG9pbnQxX3RlbXAsIFNfSVJVR098U19JV1VTUiwKKwkJICAgICAgc2hvd19wd21fYXV0b19wb2ludF90ZW1wLCBzdG9yZV9wd21fYXV0b19wb2ludF90ZW1wLAorCQkgICAgICAwLCAwKSwKKwlTRU5TT1JfQVRUUl8yKHRlbXAyX2F1dG9fcG9pbnQyX3RlbXAsIFNfSVJVR098U19JV1VTUiwKKwkJICAgICAgc2hvd19wd21fYXV0b19wb2ludF90ZW1wLCBzdG9yZV9wd21fYXV0b19wb2ludF90ZW1wLAorCQkgICAgICAxLCAwKSwKKwlTRU5TT1JfQVRUUl8yKHRlbXAyX2F1dG9fcG9pbnQzX3RlbXAsIFNfSVJVR098U19JV1VTUiwKKwkJICAgICAgc2hvd19wd21fYXV0b19wb2ludF90ZW1wLCBzdG9yZV9wd21fYXV0b19wb2ludF90ZW1wLAorCQkgICAgICAyLCAwKSwKKwlTRU5TT1JfQVRUUl8yKHRlbXAyX2F1dG9fcG9pbnQ0X3RlbXAsIFNfSVJVR098U19JV1VTUiwKKwkJICAgICAgc2hvd19wd21fYXV0b19wb2ludF90ZW1wLCBzdG9yZV9wd21fYXV0b19wb2ludF90ZW1wLAorCQkgICAgICAzLCAwKSwKKwlTRU5TT1JfQVRUUl8yKHRlbXAyX2F1dG9fcG9pbnQxX3RlbXBfaHlzdCwgU19JUlVHT3xTX0lXVVNSLAorCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3RlbXBfaHlzdCwKKwkJICAgICAgc3RvcmVfcHdtX2F1dG9fcG9pbnRfdGVtcF9oeXN0LAorCQkgICAgICAwLCAwKSwKKwlTRU5TT1JfQVRUUl8yKHRlbXAyX2F1dG9fcG9pbnQyX3RlbXBfaHlzdCwgU19JUlVHTywKKwkJICAgICAgc2hvd19wd21fYXV0b19wb2ludF90ZW1wX2h5c3QsIE5VTEwsIDEsIDApLAorCVNFTlNPUl9BVFRSXzIodGVtcDJfYXV0b19wb2ludDNfdGVtcF9oeXN0LCBTX0lSVUdPLAorCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3RlbXBfaHlzdCwgTlVMTCwgMiwgMCksCisJU0VOU09SX0FUVFJfMih0ZW1wMl9hdXRvX3BvaW50NF90ZW1wX2h5c3QsIFNfSVJVR08sCisJCSAgICAgIHNob3dfcHdtX2F1dG9fcG9pbnRfdGVtcF9oeXN0LCBOVUxMLCAzLCAwKSwKKworCVNFTlNPUl9BVFRSXzIodGVtcDNfYXV0b19wb2ludDFfcHdtLCBTX0lSVUdPfFNfSVdVU1IsCisJCSAgICAgIHNob3dfcHdtX2F1dG9fcG9pbnRfcHdtLCBzdG9yZV9wd21fYXV0b19wb2ludF9wd20sCisJCSAgICAgIDAsIDEpLAorCVNFTlNPUl9BVFRSXzIodGVtcDNfYXV0b19wb2ludDJfcHdtLCBTX0lSVUdPfFNfSVdVU1IsCisJCSAgICAgIHNob3dfcHdtX2F1dG9fcG9pbnRfcHdtLCBzdG9yZV9wd21fYXV0b19wb2ludF9wd20sCisJCSAgICAgIDEsIDEpLAorCVNFTlNPUl9BVFRSXzIodGVtcDNfYXV0b19wb2ludDNfcHdtLCBTX0lSVUdPfFNfSVdVU1IsCisJCSAgICAgIHNob3dfcHdtX2F1dG9fcG9pbnRfcHdtLCBzdG9yZV9wd21fYXV0b19wb2ludF9wd20sCisJCSAgICAgIDIsIDEpLAorCVNFTlNPUl9BVFRSXzIodGVtcDNfYXV0b19wb2ludDRfcHdtLCBTX0lSVUdPfFNfSVdVU1IsCisJCSAgICAgIHNob3dfcHdtX2F1dG9fcG9pbnRfcHdtLCBzdG9yZV9wd21fYXV0b19wb2ludF9wd20sCisJCSAgICAgIDMsIDEpLAorCVNFTlNPUl9BVFRSXzIodGVtcDNfYXV0b19wb2ludDVfcHdtLCBTX0lSVUdPfFNfSVdVU1IsCisJCSAgICAgIHNob3dfcHdtX2F1dG9fcG9pbnRfcHdtLCBzdG9yZV9wd21fYXV0b19wb2ludF9wd20sCisJCSAgICAgIDQsIDEpLAorCVNFTlNPUl9BVFRSXzIodGVtcDNfYXV0b19wb2ludDFfdGVtcCwgU19JUlVHT3xTX0lXVVNSLAorCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3RlbXAsIHN0b3JlX3B3bV9hdXRvX3BvaW50X3RlbXAsCisJCSAgICAgIDAsIDEpLAorCVNFTlNPUl9BVFRSXzIodGVtcDNfYXV0b19wb2ludDJfdGVtcCwgU19JUlVHT3xTX0lXVVNSLAorCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3RlbXAsIHN0b3JlX3B3bV9hdXRvX3BvaW50X3RlbXAsCisJCSAgICAgIDEsIDEpLAorCVNFTlNPUl9BVFRSXzIodGVtcDNfYXV0b19wb2ludDNfdGVtcCwgU19JUlVHT3xTX0lXVVNSLAorCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3RlbXAsIHN0b3JlX3B3bV9hdXRvX3BvaW50X3RlbXAsCisJCSAgICAgIDIsIDEpLAorCVNFTlNPUl9BVFRSXzIodGVtcDNfYXV0b19wb2ludDRfdGVtcCwgU19JUlVHT3xTX0lXVVNSLAorCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3RlbXAsIHN0b3JlX3B3bV9hdXRvX3BvaW50X3RlbXAsCisJCSAgICAgIDMsIDEpLAorCVNFTlNPUl9BVFRSXzIodGVtcDNfYXV0b19wb2ludDFfdGVtcF9oeXN0LCBTX0lSVUdPfFNfSVdVU1IsCisJCSAgICAgIHNob3dfcHdtX2F1dG9fcG9pbnRfdGVtcF9oeXN0LAorCQkgICAgICBzdG9yZV9wd21fYXV0b19wb2ludF90ZW1wX2h5c3QsCisJCSAgICAgIDAsIDEpLAorCVNFTlNPUl9BVFRSXzIodGVtcDNfYXV0b19wb2ludDJfdGVtcF9oeXN0LCBTX0lSVUdPLAorCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3RlbXBfaHlzdCwgTlVMTCwgMSwgMSksCisJU0VOU09SX0FUVFJfMih0ZW1wM19hdXRvX3BvaW50M190ZW1wX2h5c3QsIFNfSVJVR08sCisJCSAgICAgIHNob3dfcHdtX2F1dG9fcG9pbnRfdGVtcF9oeXN0LCBOVUxMLCAyLCAxKSwKKwlTRU5TT1JfQVRUUl8yKHRlbXAzX2F1dG9fcG9pbnQ0X3RlbXBfaHlzdCwgU19JUlVHTywKKwkJICAgICAgc2hvd19wd21fYXV0b19wb2ludF90ZW1wX2h5c3QsIE5VTEwsIDMsIDEpLAorfTsKIAogLyogU3VwZXIgSS9PIGZ1bmN0aW9ucyAqLwogc3RhdGljIGlubGluZSBpbnQgc3VwZXJpb19pbmIoaW50IGJhc2UsIGludCByZWcpCkBAIC0yOTksMTEgKzgxMSwxNiBAQAogCW91dGIoU0lPX0xPQ0tfS0VZLCBiYXNlKTsKIH0KIAotc3RhdGljIGlubGluZSB1MTYgZmFuX2Zyb21fcmVnKHUxNiByZWcpCitzdGF0aWMgaW5saW5lIGludCBmYW5fZnJvbV9yZWcodTE2IHJlZykKIHsKIAlyZXR1cm4gcmVnID8gKDE1MDAwMDAgLyByZWcpIDogMDsKIH0KIAorc3RhdGljIGlubGluZSB1MTYgZmFuX3RvX3JlZyhpbnQgZmFuKQoreworCXJldHVybiBmYW4gPyAoMTUwMDAwMCAvIGZhbikgOiAwOworfQorCiBzdGF0aWMgdTggZjcxODgyZmdfcmVhZDgoc3RydWN0IGY3MTg4MmZnX2RhdGEgKmRhdGEsIHU4IHJlZykKIHsKIAl1OCB2YWw7CkBAIC0zMzIsNTIgKzg0OSwxMTEgQEAKIAlvdXRiKHZhbCwgZGF0YS0+YWRkciArIERBVEFfUkVHX09GRlNFVCk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZjcxODgyZmdfZGF0YSAqZjcxODgyZmdfdXBkYXRlX2RldmljZShzdHJ1Y3QgZGV2aWNlICogZGV2KQorc3RhdGljIHZvaWQgZjcxODgyZmdfd3JpdGUxNihzdHJ1Y3QgZjcxODgyZmdfZGF0YSAqZGF0YSwgdTggcmVnLCB1MTYgdmFsKQoreworCW91dGIocmVnKyssIGRhdGEtPmFkZHIgKyBBRERSX1JFR19PRkZTRVQpOworCW91dGIodmFsID4+IDgsIGRhdGEtPmFkZHIgKyBEQVRBX1JFR19PRkZTRVQpOworCW91dGIocmVnLCBkYXRhLT5hZGRyICsgQUREUl9SRUdfT0ZGU0VUKTsKKwlvdXRiKHZhbCAmIDI1NSwgZGF0YS0+YWRkciArIERBVEFfUkVHX09GRlNFVCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZjcxODgyZmdfZGF0YSAqZjcxODgyZmdfdXBkYXRlX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGY3MTg4MmZnX2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlpbnQgbnIsIHJlZywgcmVnMjsKKwlpbnQgbnIsIHJlZyA9IDAsIHJlZzI7CisJaW50IG5yX2ZhbnMgPSAoZGF0YS0+dHlwZSA9PSBmNzE4ODJmZykgPyA0IDogMzsKKwlpbnQgbnJfaW5zID0gKGRhdGEtPnR5cGUgPT0gZjgwMDApID8gMyA6IDk7CisJaW50IHRlbXBfc3RhcnQgPSAoZGF0YS0+dHlwZSA9PSBmODAwMCkgPyAwIDogMTsKIAogCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKIAogCS8qIFVwZGF0ZSBvbmNlIGV2ZXJ5IDYwIHNlY29uZHMgKi8KIAlpZiAoIHRpbWVfYWZ0ZXIoamlmZmllcywgZGF0YS0+bGFzdF9saW1pdHMgKyA2MCAqIEhaICkgfHwKIAkJCSFkYXRhLT52YWxpZCkgewotCQlkYXRhLT5pbjFfbWF4ID0gZjcxODgyZmdfcmVhZDgoZGF0YSwgRjcxODgyRkdfUkVHX0lOMV9ISUdIKTsKLQkJZGF0YS0+aW5fYmVlcCA9IGY3MTg4MmZnX3JlYWQ4KGRhdGEsIEY3MTg4MkZHX1JFR19JTl9CRUVQKTsKKwkJaWYgKGRhdGEtPnR5cGUgPT0gZjcxODgyZmcpIHsKKwkJCWRhdGEtPmluMV9tYXggPQorCQkJCWY3MTg4MmZnX3JlYWQ4KGRhdGEsIEY3MTg4MkZHX1JFR19JTjFfSElHSCk7CisJCQlkYXRhLT5pbl9iZWVwID0KKwkJCQlmNzE4ODJmZ19yZWFkOChkYXRhLCBGNzE4ODJGR19SRUdfSU5fQkVFUCk7CisJCX0KIAogCQkvKiBHZXQgSGlnaCAmIGJvdW5kYXJ5IHRlbXBzKi8KLQkJZm9yIChuciA9IDA7IG5yIDwgMzsgbnIrKykgeworCQlmb3IgKG5yID0gdGVtcF9zdGFydDsgbnIgPCAzICsgdGVtcF9zdGFydDsgbnIrKykgewogCQkJZGF0YS0+dGVtcF9vdnRbbnJdID0gZjcxODgyZmdfcmVhZDgoZGF0YSwKIAkJCQkJCUY3MTg4MkZHX1JFR19URU1QX09WVChucikpOwogCQkJZGF0YS0+dGVtcF9oaWdoW25yXSA9IGY3MTg4MmZnX3JlYWQ4KGRhdGEsCiAJCQkJCQlGNzE4ODJGR19SRUdfVEVNUF9ISUdIKG5yKSk7CiAJCX0KIAotCQkvKiBIYXZlIHRvIGhhcmRjb2RlIGh5c3QqLwotCQlkYXRhLT50ZW1wX2h5c3RbMF0gPSBmNzE4ODJmZ19yZWFkOChkYXRhLAotCQkJCQkJRjcxODgyRkdfUkVHX1RFTVBfSFlTVDEpID4+IDQ7Ci0JCS8qIEh5c3QgdGVtcHMgMiAmIDMgc3RvcmVkIGluIHNhbWUgcmVnaXN0ZXIgKi8KLQkJcmVnID0gZjcxODgyZmdfcmVhZDgoZGF0YSwgRjcxODgyRkdfUkVHX1RFTVBfSFlTVDIzKTsKLQkJZGF0YS0+dGVtcF9oeXN0WzFdID0gcmVnICYgMHgwRjsKLQkJZGF0YS0+dGVtcF9oeXN0WzJdID0gcmVnID4+IDQ7Ci0KLQkJLyogSGF2ZSB0byBoYXJkY29kZSB0eXBlLCBiZWNhdXNlIHRlbXAxIGlzIHNwZWNpYWwgKi8KLQkJcmVnICA9IGY3MTg4MmZnX3JlYWQ4KGRhdGEsIEY3MTg4MkZHX1JFR19URU1QX1RZUEUpOworCQlpZiAoZGF0YS0+dHlwZSAhPSBmODAwMCkgeworCQkJZGF0YS0+ZmFuX2JlZXAgPSBmNzE4ODJmZ19yZWFkOChkYXRhLAorCQkJCQkJRjcxODgyRkdfUkVHX0ZBTl9CRUVQKTsKKwkJCWRhdGEtPnRlbXBfYmVlcCA9IGY3MTg4MmZnX3JlYWQ4KGRhdGEsCisJCQkJCQlGNzE4ODJGR19SRUdfVEVNUF9CRUVQKTsKKwkJCWRhdGEtPnRlbXBfaHlzdFswXSA9IGY3MTg4MmZnX3JlYWQ4KGRhdGEsCisJCQkJCQlGNzE4ODJGR19SRUdfVEVNUF9IWVNUKDApKTsKKwkJCWRhdGEtPnRlbXBfaHlzdFsxXSA9IGY3MTg4MmZnX3JlYWQ4KGRhdGEsCisJCQkJCQlGNzE4ODJGR19SRUdfVEVNUF9IWVNUKDEpKTsKKwkJCS8qIEhhdmUgdG8gaGFyZGNvZGUgdHlwZSwgYmVjYXVzZSB0ZW1wMSBpcyBzcGVjaWFsICovCisJCQlyZWcgID0gZjcxODgyZmdfcmVhZDgoZGF0YSwgRjcxODgyRkdfUkVHX1RFTVBfVFlQRSk7CisJCQlkYXRhLT50ZW1wX3R5cGVbMl0gPSAocmVnICYgMHgwNCkgPyAyIDogNDsKKwkJCWRhdGEtPnRlbXBfdHlwZVszXSA9IChyZWcgJiAweDA4KSA/IDIgOiA0OworCQl9CiAJCXJlZzIgPSBmNzE4ODJmZ19yZWFkOChkYXRhLCBGNzE4ODJGR19SRUdfUEVDSSk7CiAJCWlmICgocmVnMiAmIDB4MDMpID09IDB4MDEpCi0JCQlkYXRhLT50ZW1wX3R5cGVbMF0gPSA2IC8qIFBFQ0kgKi87CisJCQlkYXRhLT50ZW1wX3R5cGVbMV0gPSA2IC8qIFBFQ0kgKi87CiAJCWVsc2UgaWYgKChyZWcyICYgMHgwMykgPT0gMHgwMikKLQkJCWRhdGEtPnRlbXBfdHlwZVswXSA9IDUgLyogQU1EU0kgKi87CisJCQlkYXRhLT50ZW1wX3R5cGVbMV0gPSA1IC8qIEFNRFNJICovOworCQllbHNlIGlmIChkYXRhLT50eXBlICE9IGY4MDAwKQorCQkJZGF0YS0+dGVtcF90eXBlWzFdID0gKHJlZyAmIDB4MDIpID8gMiA6IDQ7CiAJCWVsc2UKLQkJCWRhdGEtPnRlbXBfdHlwZVswXSA9IChyZWcgJiAweDAyKSA/IDIgOiA0OworCQkJZGF0YS0+dGVtcF90eXBlWzFdID0gMjsgLyogRjgwMDAgb25seSBzdXBwb3J0cyBCSlQgKi8KIAotCQlkYXRhLT50ZW1wX3R5cGVbMV0gPSAocmVnICYgMHgwNCkgPyAyIDogNDsKLQkJZGF0YS0+dGVtcF90eXBlWzJdID0gKHJlZyAmIDB4MDgpID8gMiA6IDQ7CisJCWRhdGEtPnB3bV9lbmFibGUgPSBmNzE4ODJmZ19yZWFkOChkYXRhLAorCQkJCQkJICBGNzE4ODJGR19SRUdfUFdNX0VOQUJMRSk7CisJCWRhdGEtPnB3bV9hdXRvX3BvaW50X2h5c3RbMF0gPQorCQkJZjcxODgyZmdfcmVhZDgoZGF0YSwgRjcxODgyRkdfUkVHX0ZBTl9IWVNUKDApKTsKKwkJZGF0YS0+cHdtX2F1dG9fcG9pbnRfaHlzdFsxXSA9CisJCQlmNzE4ODJmZ19yZWFkOChkYXRhLCBGNzE4ODJGR19SRUdfRkFOX0hZU1QoMSkpOwogCi0JCWRhdGEtPnRlbXBfYmVlcCA9IGY3MTg4MmZnX3JlYWQ4KGRhdGEsIEY3MTg4MkZHX1JFR19URU1QX0JFRVApOworCQlmb3IgKG5yID0gMDsgbnIgPCBucl9mYW5zOyBucisrKSB7CisJCQlkYXRhLT5wd21fYXV0b19wb2ludF9tYXBwaW5nW25yXSA9CisJCQkgICAgZjcxODgyZmdfcmVhZDgoZGF0YSwKKwkJCQkJICAgRjcxODgyRkdfUkVHX1BPSU5UX01BUFBJTkcobnIpKTsKIAotCQlkYXRhLT5mYW5fYmVlcCA9IGY3MTg4MmZnX3JlYWQ4KGRhdGEsIEY3MTg4MkZHX1JFR19GQU5fQkVFUCk7Ci0KKwkJCWlmIChkYXRhLT50eXBlICE9IGY3MTg2MmZnKSB7CisJCQkJaW50IHBvaW50OworCQkJCWZvciAocG9pbnQgPSAwOyBwb2ludCA8IDU7IHBvaW50KyspIHsKKwkJCQkJZGF0YS0+cHdtX2F1dG9fcG9pbnRfcHdtW25yXVtwb2ludF0gPQorCQkJCQkJZjcxODgyZmdfcmVhZDgoZGF0YSwKKwkJCQkJCQlGNzE4ODJGR19SRUdfUE9JTlRfUFdNCisJCQkJCQkJKG5yLCBwb2ludCkpOworCQkJCX0KKwkJCQlmb3IgKHBvaW50ID0gMDsgcG9pbnQgPCA0OyBwb2ludCsrKSB7CisJCQkJCWRhdGEtPnB3bV9hdXRvX3BvaW50X3RlbXBbbnJdW3BvaW50XSA9CisJCQkJCQlmNzE4ODJmZ19yZWFkOChkYXRhLAorCQkJCQkJCUY3MTg4MkZHX1JFR19QT0lOVF9URU1QCisJCQkJCQkJKG5yLCBwb2ludCkpOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJZGF0YS0+cHdtX2F1dG9fcG9pbnRfcHdtW25yXVsxXSA9CisJCQkJCWY3MTg4MmZnX3JlYWQ4KGRhdGEsCisJCQkJCQlGNzE4ODJGR19SRUdfUE9JTlRfUFdNCisJCQkJCQkobnIsIDEpKTsKKwkJCQlkYXRhLT5wd21fYXV0b19wb2ludF9wd21bbnJdWzRdID0KKwkJCQkJZjcxODgyZmdfcmVhZDgoZGF0YSwKKwkJCQkJCUY3MTg4MkZHX1JFR19QT0lOVF9QV00KKwkJCQkJCShuciwgNCkpOworCQkJCWRhdGEtPnB3bV9hdXRvX3BvaW50X3RlbXBbbnJdWzBdID0KKwkJCQkJZjcxODgyZmdfcmVhZDgoZGF0YSwKKwkJCQkJCUY3MTg4MkZHX1JFR19QT0lOVF9URU1QCisJCQkJCQkobnIsIDApKTsKKwkJCQlkYXRhLT5wd21fYXV0b19wb2ludF90ZW1wW25yXVszXSA9CisJCQkJCWY3MTg4MmZnX3JlYWQ4KGRhdGEsCisJCQkJCQlGNzE4ODJGR19SRUdfUE9JTlRfVEVNUAorCQkJCQkJKG5yLCAzKSk7CisJCQl9CisJCX0KIAkJZGF0YS0+bGFzdF9saW1pdHMgPSBqaWZmaWVzOwogCX0KIApAQCAtMzg3LDE5ICs5NjMsMzIgQEAKIAkJCQkJCUY3MTg4MkZHX1JFR19URU1QX1NUQVRVUyk7CiAJCWRhdGEtPnRlbXBfZGlvZGVfb3BlbiA9IGY3MTg4MmZnX3JlYWQ4KGRhdGEsCiAJCQkJCQlGNzE4ODJGR19SRUdfVEVNUF9ESU9ERV9PUEVOKTsKLQkJZm9yIChuciA9IDA7IG5yIDwgMzsgbnIrKykKKwkJZm9yIChuciA9IHRlbXBfc3RhcnQ7IG5yIDwgMyArIHRlbXBfc3RhcnQ7IG5yKyspCiAJCQlkYXRhLT50ZW1wW25yXSA9IGY3MTg4MmZnX3JlYWQ4KGRhdGEsCiAJCQkJCQlGNzE4ODJGR19SRUdfVEVNUChucikpOwogCiAJCWRhdGEtPmZhbl9zdGF0dXMgPSBmNzE4ODJmZ19yZWFkOChkYXRhLAogCQkJCQkJRjcxODgyRkdfUkVHX0ZBTl9TVEFUVVMpOwotCQlmb3IgKG5yID0gMDsgbnIgPCA0OyBucisrKQorCQlmb3IgKG5yID0gMDsgbnIgPCBucl9mYW5zOyBucisrKSB7CiAJCQlkYXRhLT5mYW5bbnJdID0gZjcxODgyZmdfcmVhZDE2KGRhdGEsCiAJCQkJCQlGNzE4ODJGR19SRUdfRkFOKG5yKSk7CisJCQlkYXRhLT5mYW5fdGFyZ2V0W25yXSA9CisJCQkgICAgZjcxODgyZmdfcmVhZDE2KGRhdGEsIEY3MTg4MkZHX1JFR19GQU5fVEFSR0VUKG5yKSk7CisJCQlkYXRhLT5mYW5fZnVsbF9zcGVlZFtucl0gPQorCQkJICAgIGY3MTg4MmZnX3JlYWQxNihkYXRhLAorCQkJCQkgICAgRjcxODgyRkdfUkVHX0ZBTl9GVUxMX1NQRUVEKG5yKSk7CisJCQlkYXRhLT5wd21bbnJdID0KKwkJCSAgICBmNzE4ODJmZ19yZWFkOChkYXRhLCBGNzE4ODJGR19SRUdfUFdNKG5yKSk7CisJCX0KIAotCQlkYXRhLT5pbl9zdGF0dXMgPSBmNzE4ODJmZ19yZWFkOChkYXRhLAorCQkvKiBUaGUgZjgwMDAgY2FuIG1vbml0b3IgMSBtb3JlIGZhbiwgYnV0IGhhcyBubyBwd20gZm9yIGl0ICovCisJCWlmIChkYXRhLT50eXBlID09IGY4MDAwKQorCQkJZGF0YS0+ZmFuWzNdID0gZjcxODgyZmdfcmVhZDE2KGRhdGEsCisJCQkJCQlGNzE4ODJGR19SRUdfRkFOKDMpKTsKKwkJaWYgKGRhdGEtPnR5cGUgPT0gZjcxODgyZmcpCisJCQlkYXRhLT5pbl9zdGF0dXMgPSBmNzE4ODJmZ19yZWFkOChkYXRhLAogCQkJCQkJRjcxODgyRkdfUkVHX0lOX1NUQVRVUyk7Ci0JCWZvciAobnIgPSAwOyBuciA8IDk7IG5yKyspCisJCWZvciAobnIgPSAwOyBuciA8IG5yX2luczsgbnIrKykKIAkJCWRhdGEtPmluW25yXSA9IGY3MTg4MmZnX3JlYWQ4KGRhdGEsCiAJCQkJCQlGNzE4ODJGR19SRUdfSU4obnIpKTsKIApAQCAtNDE3LDcgKzEwMDYsNyBAQAogCWNoYXIgKmJ1ZikKIHsKIAlzdHJ1Y3QgZjcxODgyZmdfZGF0YSAqZGF0YSA9IGY3MTg4MmZnX3VwZGF0ZV9kZXZpY2UoZGV2KTsKLQlpbnQgbnIgPSB0b19zZW5zb3JfZGV2X2F0dHIoZGV2YXR0ciktPmluZGV4OworCWludCBuciA9IHRvX3NlbnNvcl9kZXZfYXR0cl8yKGRldmF0dHIpLT5pbmRleDsKIAlpbnQgc3BlZWQgPSBmYW5fZnJvbV9yZWcoZGF0YS0+ZmFuW25yXSk7CiAKIAlpZiAoc3BlZWQgPT0gRkFOX01JTl9ERVRFQ1QpCkBAIC00MjYsMTEgKzEwMTUsMzkgQEAKIAlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgc3BlZWQpOwogfQogCitzdGF0aWMgc3NpemVfdCBzaG93X2Zhbl9mdWxsX3NwZWVkKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBmNzE4ODJmZ19kYXRhICpkYXRhID0gZjcxODgyZmdfdXBkYXRlX2RldmljZShkZXYpOworCWludCBuciA9IHRvX3NlbnNvcl9kZXZfYXR0cl8yKGRldmF0dHIpLT5pbmRleDsKKwlpbnQgc3BlZWQgPSBmYW5fZnJvbV9yZWcoZGF0YS0+ZmFuX2Z1bGxfc3BlZWRbbnJdKTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgc3BlZWQpOworfQorCitzdGF0aWMgc3NpemVfdCBzdG9yZV9mYW5fZnVsbF9zcGVlZChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLAorCQkJCSAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgZjcxODgyZmdfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCWludCBuciA9IHRvX3NlbnNvcl9kZXZfYXR0cl8yKGRldmF0dHIpLT5pbmRleDsKKwlsb25nIHZhbCA9IHNpbXBsZV9zdHJ0b2woYnVmLCBOVUxMLCAxMCk7CisKKwl2YWwgPSBTRU5TT1JTX0xJTUlUKHZhbCwgMjMsIDE1MDAwMDApOworCXZhbCA9IGZhbl90b19yZWcodmFsKTsKKworCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlmNzE4ODJmZ193cml0ZTE2KGRhdGEsIEY3MTg4MkZHX1JFR19GQU5fRlVMTF9TUEVFRChuciksIHZhbCk7CisJZGF0YS0+ZmFuX2Z1bGxfc3BlZWRbbnJdID0gdmFsOworCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOworCisJcmV0dXJuIGNvdW50OworfQorCiBzdGF0aWMgc3NpemVfdCBzaG93X2Zhbl9iZWVwKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUKIAkqZGV2YXR0ciwgY2hhciAqYnVmKQogewogCXN0cnVjdCBmNzE4ODJmZ19kYXRhICpkYXRhID0gZjcxODgyZmdfdXBkYXRlX2RldmljZShkZXYpOwotCWludCBuciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZhdHRyKS0+aW5kZXg7CisJaW50IG5yID0gdG9fc2Vuc29yX2Rldl9hdHRyXzIoZGV2YXR0ciktPmluZGV4OwogCiAJaWYgKGRhdGEtPmZhbl9iZWVwICYgKDEgPDwgbnIpKQogCQlyZXR1cm4gc3ByaW50ZihidWYsICIxXG4iKTsKQEAgLTQ0MiwxMCArMTA1OSwxMSBAQAogCSpkZXZhdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKIAlzdHJ1Y3QgZjcxODgyZmdfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCWludCBuciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZhdHRyKS0+aW5kZXg7Ci0JaW50IHZhbCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOworCWludCBuciA9IHRvX3NlbnNvcl9kZXZfYXR0cl8yKGRldmF0dHIpLT5pbmRleDsKKwl1bnNpZ25lZCBsb25nIHZhbCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOwogCiAJbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOworCWRhdGEtPmZhbl9iZWVwID0gZjcxODgyZmdfcmVhZDgoZGF0YSwgRjcxODgyRkdfUkVHX0ZBTl9CRUVQKTsKIAlpZiAodmFsKQogCQlkYXRhLT5mYW5fYmVlcCB8PSAxIDw8IG5yOwogCWVsc2UKQEAgLTQ2MSw3ICsxMDc5LDcgQEAKIAkqZGV2YXR0ciwgY2hhciAqYnVmKQogewogCXN0cnVjdCBmNzE4ODJmZ19kYXRhICpkYXRhID0gZjcxODgyZmdfdXBkYXRlX2RldmljZShkZXYpOwotCWludCBuciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZhdHRyKS0+aW5kZXg7CisJaW50IG5yID0gdG9fc2Vuc29yX2Rldl9hdHRyXzIoZGV2YXR0ciktPmluZGV4OwogCiAJaWYgKGRhdGEtPmZhbl9zdGF0dXMgJiAoMSA8PCBucikpCiAJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjFcbiIpOwpAQCAtNDczLDcgKzEwOTEsNyBAQAogCWNoYXIgKmJ1ZikKIHsKIAlzdHJ1Y3QgZjcxODgyZmdfZGF0YSAqZGF0YSA9IGY3MTg4MmZnX3VwZGF0ZV9kZXZpY2UoZGV2KTsKLQlpbnQgbnIgPSB0b19zZW5zb3JfZGV2X2F0dHIoZGV2YXR0ciktPmluZGV4OworCWludCBuciA9IHRvX3NlbnNvcl9kZXZfYXR0cl8yKGRldmF0dHIpLT5pbmRleDsKIAogCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBkYXRhLT5pbltucl0gKiA4KTsKIH0KQEAgLTQ5MCwxMCArMTEwOCw4IEBACiAJKmRldmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewogCXN0cnVjdCBmNzE4ODJmZ19kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0JaW50IHZhbCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApIC8gODsKLQotCWlmICh2YWwgPiAyNTUpCi0JCXZhbCA9IDI1NTsKKwlsb25nIHZhbCA9IHNpbXBsZV9zdHJ0b2woYnVmLCBOVUxMLCAxMCkgLyA4OworCXZhbCA9IFNFTlNPUlNfTElNSVQodmFsLCAwLCAyNTUpOwogCiAJbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwogCWY3MTg4MmZnX3dyaXRlOChkYXRhLCBGNzE4ODJGR19SRUdfSU4xX0hJR0gsIHZhbCk7CkBAIC01MDcsNyArMTEyMyw3IEBACiAJKmRldmF0dHIsIGNoYXIgKmJ1ZikKIHsKIAlzdHJ1Y3QgZjcxODgyZmdfZGF0YSAqZGF0YSA9IGY3MTg4MmZnX3VwZGF0ZV9kZXZpY2UoZGV2KTsKLQlpbnQgbnIgPSB0b19zZW5zb3JfZGV2X2F0dHIoZGV2YXR0ciktPmluZGV4OworCWludCBuciA9IHRvX3NlbnNvcl9kZXZfYXR0cl8yKGRldmF0dHIpLT5pbmRleDsKIAogCWlmIChkYXRhLT5pbl9iZWVwICYgKDEgPDwgbnIpKQogCQlyZXR1cm4gc3ByaW50ZihidWYsICIxXG4iKTsKQEAgLTUxOSwxMCArMTEzNSwxMSBAQAogCSpkZXZhdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKIAlzdHJ1Y3QgZjcxODgyZmdfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCWludCBuciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZhdHRyKS0+aW5kZXg7Ci0JaW50IHZhbCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOworCWludCBuciA9IHRvX3NlbnNvcl9kZXZfYXR0cl8yKGRldmF0dHIpLT5pbmRleDsKKwl1bnNpZ25lZCBsb25nIHZhbCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOwogCiAJbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOworCWRhdGEtPmluX2JlZXAgPSBmNzE4ODJmZ19yZWFkOChkYXRhLCBGNzE4ODJGR19SRUdfSU5fQkVFUCk7CiAJaWYgKHZhbCkKIAkJZGF0YS0+aW5fYmVlcCB8PSAxIDw8IG5yOwogCWVsc2UKQEAgLTUzOCw3ICsxMTU1LDcgQEAKIAkqZGV2YXR0ciwgY2hhciAqYnVmKQogewogCXN0cnVjdCBmNzE4ODJmZ19kYXRhICpkYXRhID0gZjcxODgyZmdfdXBkYXRlX2RldmljZShkZXYpOwotCWludCBuciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZhdHRyKS0+aW5kZXg7CisJaW50IG5yID0gdG9fc2Vuc29yX2Rldl9hdHRyXzIoZGV2YXR0ciktPmluZGV4OwogCiAJaWYgKGRhdGEtPmluX3N0YXR1cyAmICgxIDw8IG5yKSkKIAkJcmV0dXJuIHNwcmludGYoYnVmLCAiMVxuIik7CkBAIC01NTAsNyArMTE2Nyw3IEBACiAJY2hhciAqYnVmKQogewogCXN0cnVjdCBmNzE4ODJmZ19kYXRhICpkYXRhID0gZjcxODgyZmdfdXBkYXRlX2RldmljZShkZXYpOwotCWludCBuciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZhdHRyKS0+aW5kZXg7CisJaW50IG5yID0gdG9fc2Vuc29yX2Rldl9hdHRyXzIoZGV2YXR0ciktPmluZGV4OwogCiAJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGRhdGEtPnRlbXBbbnJdICogMTAwMCk7CiB9CkBAIC01NTksNyArMTE3Niw3IEBACiAJKmRldmF0dHIsIGNoYXIgKmJ1ZikKIHsKIAlzdHJ1Y3QgZjcxODgyZmdfZGF0YSAqZGF0YSA9IGY3MTg4MmZnX3VwZGF0ZV9kZXZpY2UoZGV2KTsKLQlpbnQgbnIgPSB0b19zZW5zb3JfZGV2X2F0dHIoZGV2YXR0ciktPmluZGV4OworCWludCBuciA9IHRvX3NlbnNvcl9kZXZfYXR0cl8yKGRldmF0dHIpLT5pbmRleDsKIAogCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBkYXRhLT50ZW1wX2hpZ2hbbnJdICogMTAwMCk7CiB9CkBAIC01NjgsMTEgKzExODUsOSBAQAogCSpkZXZhdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKIAlzdHJ1Y3QgZjcxODgyZmdfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCWludCBuciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZhdHRyKS0+aW5kZXg7Ci0JaW50IHZhbCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApIC8gMTAwMDsKLQotCWlmICh2YWwgPiAyNTUpCi0JCXZhbCA9IDI1NTsKKwlpbnQgbnIgPSB0b19zZW5zb3JfZGV2X2F0dHJfMihkZXZhdHRyKS0+aW5kZXg7CisJbG9uZyB2YWwgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApIC8gMTAwMDsKKwl2YWwgPSBTRU5TT1JTX0xJTUlUKHZhbCwgMCwgMjU1KTsKIAogCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKIAlmNzE4ODJmZ193cml0ZTgoZGF0YSwgRjcxODgyRkdfUkVHX1RFTVBfSElHSChuciksIHZhbCk7CkBAIC01ODYsNDggKzEyMDEsNDYgQEAKIAkqZGV2YXR0ciwgY2hhciAqYnVmKQogewogCXN0cnVjdCBmNzE4ODJmZ19kYXRhICpkYXRhID0gZjcxODgyZmdfdXBkYXRlX2RldmljZShkZXYpOwotCWludCBuciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZhdHRyKS0+aW5kZXg7CisJaW50IG5yID0gdG9fc2Vuc29yX2Rldl9hdHRyXzIoZGV2YXR0ciktPmluZGV4OworCWludCB0ZW1wX21heF9oeXN0OwogCi0JcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsCi0JCShkYXRhLT50ZW1wX2hpZ2hbbnJdIC0gZGF0YS0+dGVtcF9oeXN0W25yXSkgKiAxMDAwKTsKKwltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisJaWYgKG5yICYgMSkKKwkJdGVtcF9tYXhfaHlzdCA9IGRhdGEtPnRlbXBfaHlzdFtuciAvIDJdID4+IDQ7CisJZWxzZQorCQl0ZW1wX21heF9oeXN0ID0gZGF0YS0+dGVtcF9oeXN0W25yIC8gMl0gJiAweDBmOworCXRlbXBfbWF4X2h5c3QgPSAoZGF0YS0+dGVtcF9oaWdoW25yXSAtIHRlbXBfbWF4X2h5c3QpICogMTAwMDsKKwltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCB0ZW1wX21heF9oeXN0KTsKIH0KIAogc3RhdGljIHNzaXplX3Qgc3RvcmVfdGVtcF9tYXhfaHlzdChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlCiAJKmRldmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewogCXN0cnVjdCBmNzE4ODJmZ19kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0JaW50IG5yID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRldmF0dHIpLT5pbmRleDsKLQlpbnQgdmFsID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCkgLyAxMDAwOworCWludCBuciA9IHRvX3NlbnNvcl9kZXZfYXR0cl8yKGRldmF0dHIpLT5pbmRleDsKKwlsb25nIHZhbCA9IHNpbXBsZV9zdHJ0b2woYnVmLCBOVUxMLCAxMCkgLyAxMDAwOwogCXNzaXplX3QgcmV0ID0gY291bnQ7CisJdTggcmVnOwogCiAJbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwogCiAJLyogY29udmVydCBhYnMgdG8gcmVsYXRpdmUgYW5kIGNoZWNrICovCisJZGF0YS0+dGVtcF9oaWdoW25yXSA9IGY3MTg4MmZnX3JlYWQ4KGRhdGEsIEY3MTg4MkZHX1JFR19URU1QX0hJR0gobnIpKTsKKwl2YWwgPSBTRU5TT1JTX0xJTUlUKHZhbCwgZGF0YS0+dGVtcF9oaWdoW25yXSAtIDE1LAorCQkJICAgIGRhdGEtPnRlbXBfaGlnaFtucl0pOwogCXZhbCA9IGRhdGEtPnRlbXBfaGlnaFtucl0gLSB2YWw7Ci0JaWYgKHZhbCA8IDAgfHwgdmFsID4gMTUpIHsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBzdG9yZV90ZW1wX21heF9oeXN0X2V4aXQ7Ci0JfQotCi0JZGF0YS0+dGVtcF9oeXN0W25yXSA9IHZhbDsKIAogCS8qIGNvbnZlcnQgdmFsdWUgdG8gcmVnaXN0ZXIgY29udGVudHMgKi8KLQlzd2l0Y2ggKG5yKSB7Ci0JCWNhc2UgMDoKLQkJCXZhbCA9IHZhbCA8PCA0OwotCQkJYnJlYWs7Ci0JCWNhc2UgMToKLQkJCXZhbCA9IHZhbCB8IChkYXRhLT50ZW1wX2h5c3RbMl0gPDwgNCk7Ci0JCQlicmVhazsKLQkJY2FzZSAyOgotCQkJdmFsID0gZGF0YS0+dGVtcF9oeXN0WzFdIHwgKHZhbCA8PCA0KTsKLQkJCWJyZWFrOwotCX0KKwlyZWcgPSBmNzE4ODJmZ19yZWFkOChkYXRhLCBGNzE4ODJGR19SRUdfVEVNUF9IWVNUKG5yIC8gMikpOworCWlmIChuciAmIDEpCisJCXJlZyA9IChyZWcgJiAweDBmKSB8ICh2YWwgPDwgNCk7CisJZWxzZQorCQlyZWcgPSAocmVnICYgMHhmMCkgfCB2YWw7CisJZjcxODgyZmdfd3JpdGU4KGRhdGEsIEY3MTg4MkZHX1JFR19URU1QX0hZU1QobnIgLyAyKSwgcmVnKTsKKwlkYXRhLT50ZW1wX2h5c3RbbnIgLyAyXSA9IHJlZzsKIAotCWY3MTg4MmZnX3dyaXRlOChkYXRhLCBuciA/IEY3MTg4MkZHX1JFR19URU1QX0hZU1QyMyA6Ci0JCUY3MTg4MkZHX1JFR19URU1QX0hZU1QxLCB2YWwpOwotCi1zdG9yZV90ZW1wX21heF9oeXN0X2V4aXQ6CiAJbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CiAJcmV0dXJuIHJldDsKIH0KQEAgLTYzNiw3ICsxMjQ5LDcgQEAKIAkqZGV2YXR0ciwgY2hhciAqYnVmKQogewogCXN0cnVjdCBmNzE4ODJmZ19kYXRhICpkYXRhID0gZjcxODgyZmdfdXBkYXRlX2RldmljZShkZXYpOwotCWludCBuciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZhdHRyKS0+aW5kZXg7CisJaW50IG5yID0gdG9fc2Vuc29yX2Rldl9hdHRyXzIoZGV2YXR0ciktPmluZGV4OwogCiAJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGRhdGEtPnRlbXBfb3Z0W25yXSAqIDEwMDApOwogfQpAQCAtNjQ1LDExICsxMjU4LDkgQEAKIAkqZGV2YXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7CiAJc3RydWN0IGY3MTg4MmZnX2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlpbnQgbnIgPSB0b19zZW5zb3JfZGV2X2F0dHIoZGV2YXR0ciktPmluZGV4OwotCWludCB2YWwgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKSAvIDEwMDA7Ci0KLQlpZiAodmFsID4gMjU1KQotCQl2YWwgPSAyNTU7CisJaW50IG5yID0gdG9fc2Vuc29yX2Rldl9hdHRyXzIoZGV2YXR0ciktPmluZGV4OworCWxvbmcgdmFsID0gc2ltcGxlX3N0cnRvbChidWYsIE5VTEwsIDEwKSAvIDEwMDA7CisJdmFsID0gU0VOU09SU19MSU1JVCh2YWwsIDAsIDI1NSk7CiAKIAltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CiAJZjcxODgyZmdfd3JpdGU4KGRhdGEsIEY3MTg4MkZHX1JFR19URU1QX09WVChuciksIHZhbCk7CkBAIC02NjMsMTcgKzEyNzQsMjUgQEAKIAkqZGV2YXR0ciwgY2hhciAqYnVmKQogewogCXN0cnVjdCBmNzE4ODJmZ19kYXRhICpkYXRhID0gZjcxODgyZmdfdXBkYXRlX2RldmljZShkZXYpOwotCWludCBuciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZhdHRyKS0+aW5kZXg7CisJaW50IG5yID0gdG9fc2Vuc29yX2Rldl9hdHRyXzIoZGV2YXR0ciktPmluZGV4OworCWludCB0ZW1wX2NyaXRfaHlzdDsKIAotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLAotCQkoZGF0YS0+dGVtcF9vdnRbbnJdIC0gZGF0YS0+dGVtcF9oeXN0W25yXSkgKiAxMDAwKTsKKwltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisJaWYgKG5yICYgMSkKKwkJdGVtcF9jcml0X2h5c3QgPSBkYXRhLT50ZW1wX2h5c3RbbnIgLyAyXSA+PiA0OworCWVsc2UKKwkJdGVtcF9jcml0X2h5c3QgPSBkYXRhLT50ZW1wX2h5c3RbbnIgLyAyXSAmIDB4MGY7CisJdGVtcF9jcml0X2h5c3QgPSAoZGF0YS0+dGVtcF9vdnRbbnJdIC0gdGVtcF9jcml0X2h5c3QpICogMTAwMDsKKwltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCB0ZW1wX2NyaXRfaHlzdCk7CiB9CiAKIHN0YXRpYyBzc2l6ZV90IHNob3dfdGVtcF90eXBlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUKIAkqZGV2YXR0ciwgY2hhciAqYnVmKQogewogCXN0cnVjdCBmNzE4ODJmZ19kYXRhICpkYXRhID0gZjcxODgyZmdfdXBkYXRlX2RldmljZShkZXYpOwotCWludCBuciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZhdHRyKS0+aW5kZXg7CisJaW50IG5yID0gdG9fc2Vuc29yX2Rldl9hdHRyXzIoZGV2YXR0ciktPmluZGV4OwogCiAJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGRhdGEtPnRlbXBfdHlwZVtucl0pOwogfQpAQCAtNjgyLDkgKzEzMDEsOSBAQAogCSpkZXZhdHRyLCBjaGFyICpidWYpCiB7CiAJc3RydWN0IGY3MTg4MmZnX2RhdGEgKmRhdGEgPSBmNzE4ODJmZ191cGRhdGVfZGV2aWNlKGRldik7Ci0JaW50IG5yID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRldmF0dHIpLT5pbmRleDsKKwlpbnQgbnIgPSB0b19zZW5zb3JfZGV2X2F0dHJfMihkZXZhdHRyKS0+aW5kZXg7CiAKLQlpZiAoZGF0YS0+dGVtcF9iZWVwICYgKDEgPDwgKG5yICsgMSkpKQorCWlmIChkYXRhLT50ZW1wX2JlZXAgJiAoMSA8PCBucikpCiAJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjFcbiIpOwogCWVsc2UKIAkJcmV0dXJuIHNwcmludGYoYnVmLCAiMFxuIik7CkBAIC02OTQsMTQgKzEzMTMsMTUgQEAKIAkqZGV2YXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7CiAJc3RydWN0IGY3MTg4MmZnX2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlpbnQgbnIgPSB0b19zZW5zb3JfZGV2X2F0dHIoZGV2YXR0ciktPmluZGV4OwotCWludCB2YWwgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsKKwlpbnQgbnIgPSB0b19zZW5zb3JfZGV2X2F0dHJfMihkZXZhdHRyKS0+aW5kZXg7CisJdW5zaWduZWQgbG9uZyB2YWwgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsKIAogCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlkYXRhLT50ZW1wX2JlZXAgPSBmNzE4ODJmZ19yZWFkOChkYXRhLCBGNzE4ODJGR19SRUdfVEVNUF9CRUVQKTsKIAlpZiAodmFsKQotCQlkYXRhLT50ZW1wX2JlZXAgfD0gMSA8PCAobnIgKyAxKTsKKwkJZGF0YS0+dGVtcF9iZWVwIHw9IDEgPDwgbnI7CiAJZWxzZQotCQlkYXRhLT50ZW1wX2JlZXAgJj0gfigxIDw8IChuciArIDEpKTsKKwkJZGF0YS0+dGVtcF9iZWVwICY9IH4oMSA8PCBucik7CiAKIAlmNzE4ODJmZ193cml0ZTgoZGF0YSwgRjcxODgyRkdfUkVHX1RFTVBfQkVFUCwgZGF0YS0+dGVtcF9iZWVwKTsKIAltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKQEAgLTcxMyw5ICsxMzMzLDkgQEAKIAkqZGV2YXR0ciwgY2hhciAqYnVmKQogewogCXN0cnVjdCBmNzE4ODJmZ19kYXRhICpkYXRhID0gZjcxODgyZmdfdXBkYXRlX2RldmljZShkZXYpOwotCWludCBuciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZhdHRyKS0+aW5kZXg7CisJaW50IG5yID0gdG9fc2Vuc29yX2Rldl9hdHRyXzIoZGV2YXR0ciktPmluZGV4OwogCi0JaWYgKGRhdGEtPnRlbXBfc3RhdHVzICYgKDEgPDwgKG5yICsgMSkpKQorCWlmIChkYXRhLT50ZW1wX3N0YXR1cyAmICgxIDw8IG5yKSkKIAkJcmV0dXJuIHNwcmludGYoYnVmLCAiMVxuIik7CiAJZWxzZQogCQlyZXR1cm4gc3ByaW50ZihidWYsICIwXG4iKTsKQEAgLTcyNSwxMTMgKzEzNDUsNTI4IEBACiAJKmRldmF0dHIsIGNoYXIgKmJ1ZikKIHsKIAlzdHJ1Y3QgZjcxODgyZmdfZGF0YSAqZGF0YSA9IGY3MTg4MmZnX3VwZGF0ZV9kZXZpY2UoZGV2KTsKLQlpbnQgbnIgPSB0b19zZW5zb3JfZGV2X2F0dHIoZGV2YXR0ciktPmluZGV4OworCWludCBuciA9IHRvX3NlbnNvcl9kZXZfYXR0cl8yKGRldmF0dHIpLT5pbmRleDsKIAotCWlmIChkYXRhLT50ZW1wX2Rpb2RlX29wZW4gJiAoMSA8PCAobnIgKyAxKSkpCisJaWYgKGRhdGEtPnRlbXBfZGlvZGVfb3BlbiAmICgxIDw8IG5yKSkKIAkJcmV0dXJuIHNwcmludGYoYnVmLCAiMVxuIik7CiAJZWxzZQogCQlyZXR1cm4gc3ByaW50ZihidWYsICIwXG4iKTsKIH0KIAorc3RhdGljIHNzaXplX3Qgc2hvd19wd20oc3RydWN0IGRldmljZSAqZGV2LAorCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgZjcxODgyZmdfZGF0YSAqZGF0YSA9IGY3MTg4MmZnX3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlpbnQgdmFsLCBuciA9IHRvX3NlbnNvcl9kZXZfYXR0cl8yKGRldmF0dHIpLT5pbmRleDsKKwltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisJaWYgKGRhdGEtPnB3bV9lbmFibGUgJiAoMSA8PCAoMiAqIG5yKSkpCisJCS8qIFBXTSBtb2RlICovCisJCXZhbCA9IGRhdGEtPnB3bVtucl07CisJZWxzZSB7CisJCS8qIFJQTSBtb2RlICovCisJCXZhbCA9IDI1NSAqIGZhbl9mcm9tX3JlZyhkYXRhLT5mYW5fdGFyZ2V0W25yXSkKKwkJCS8gZmFuX2Zyb21fcmVnKGRhdGEtPmZhbl9mdWxsX3NwZWVkW25yXSk7CisJfQorCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCB2YWwpOworfQorCitzdGF0aWMgc3NpemVfdCBzdG9yZV9wd20oc3RydWN0IGRldmljZSAqZGV2LAorCQkJIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLCBjb25zdCBjaGFyICpidWYsCisJCQkgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBmNzE4ODJmZ19kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJaW50IG5yID0gdG9fc2Vuc29yX2Rldl9hdHRyXzIoZGV2YXR0ciktPmluZGV4OworCWxvbmcgdmFsID0gc2ltcGxlX3N0cnRvbChidWYsIE5VTEwsIDEwKTsKKwl2YWwgPSBTRU5TT1JTX0xJTUlUKHZhbCwgMCwgMjU1KTsKKworCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlkYXRhLT5wd21fZW5hYmxlID0gZjcxODgyZmdfcmVhZDgoZGF0YSwgRjcxODgyRkdfUkVHX1BXTV9FTkFCTEUpOworCWlmICgoZGF0YS0+dHlwZSA9PSBmODAwMCAmJiAoKGRhdGEtPnB3bV9lbmFibGUgPj4gMiAqIG5yKSAmIDMpICE9IDIpIHx8CisJICAgIChkYXRhLT50eXBlICE9IGY4MDAwICYmICEoKGRhdGEtPnB3bV9lbmFibGUgPj4gMiAqIG5yKSAmIDIpKSkgeworCQljb3VudCA9IC1FUk9GUzsKKwkJZ290byBsZWF2ZTsKKwl9CisJaWYgKGRhdGEtPnB3bV9lbmFibGUgJiAoMSA8PCAoMiAqIG5yKSkpIHsKKwkJLyogUFdNIG1vZGUgKi8KKwkJZjcxODgyZmdfd3JpdGU4KGRhdGEsIEY3MTg4MkZHX1JFR19QV00obnIpLCB2YWwpOworCQlkYXRhLT5wd21bbnJdID0gdmFsOworCX0gZWxzZSB7CisJCS8qIFJQTSBtb2RlICovCisJCWludCB0YXJnZXQsIGZ1bGxfc3BlZWQ7CisJCWZ1bGxfc3BlZWQgPSBmNzE4ODJmZ19yZWFkMTYoZGF0YSwKKwkJCQkJICAgICBGNzE4ODJGR19SRUdfRkFOX0ZVTExfU1BFRUQobnIpKTsKKwkJdGFyZ2V0ID0gZmFuX3RvX3JlZyh2YWwgKiBmYW5fZnJvbV9yZWcoZnVsbF9zcGVlZCkgLyAyNTUpOworCQlmNzE4ODJmZ193cml0ZTE2KGRhdGEsIEY3MTg4MkZHX1JFR19GQU5fVEFSR0VUKG5yKSwgdGFyZ2V0KTsKKwkJZGF0YS0+ZmFuX3RhcmdldFtucl0gPSB0YXJnZXQ7CisJCWRhdGEtPmZhbl9mdWxsX3NwZWVkW25yXSA9IGZ1bGxfc3BlZWQ7CisJfQorbGVhdmU6CisJbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfcHdtX2VuYWJsZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlpbnQgcmVzdWx0ID0gMDsKKwlzdHJ1Y3QgZjcxODgyZmdfZGF0YSAqZGF0YSA9IGY3MTg4MmZnX3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlpbnQgbnIgPSB0b19zZW5zb3JfZGV2X2F0dHJfMihkZXZhdHRyKS0+aW5kZXg7CisKKwlzd2l0Y2ggKChkYXRhLT5wd21fZW5hYmxlID4+IDIgKiBucikgJiAzKSB7CisJY2FzZSAwOgorCWNhc2UgMToKKwkJcmVzdWx0ID0gMjsgLyogTm9ybWFsIGF1dG8gbW9kZSAqLworCQlicmVhazsKKwljYXNlIDI6CisJCXJlc3VsdCA9IDE7IC8qIE1hbnVhbCBtb2RlICovCisJCWJyZWFrOworCWNhc2UgMzoKKwkJaWYgKGRhdGEtPnR5cGUgPT0gZjgwMDApCisJCQlyZXN1bHQgPSAzOyAvKiBUaGVybW9zdGF0IG1vZGUgKi8KKwkJZWxzZQorCQkJcmVzdWx0ID0gMTsgLyogTWFudWFsIG1vZGUgKi8KKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHJlc3VsdCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHN0b3JlX3B3bV9lbmFibGUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZQorCQkJCSpkZXZhdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgZjcxODgyZmdfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCWludCBuciA9IHRvX3NlbnNvcl9kZXZfYXR0cl8yKGRldmF0dHIpLT5pbmRleDsKKwlsb25nIHZhbCA9IHNpbXBsZV9zdHJ0b2woYnVmLCBOVUxMLCAxMCk7CisKKwltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisJZGF0YS0+cHdtX2VuYWJsZSA9IGY3MTg4MmZnX3JlYWQ4KGRhdGEsIEY3MTg4MkZHX1JFR19QV01fRU5BQkxFKTsKKwkvKiBTcGVjaWFsIGNhc2UgZm9yIEY4MDAwIGF1dG8gUFdNIG1vZGUgLyBUaGVybW9zdGF0IG1vZGUgKi8KKwlpZiAoZGF0YS0+dHlwZSA9PSBmODAwMCAmJiAoKGRhdGEtPnB3bV9lbmFibGUgPj4gMiAqIG5yKSAmIDEpKSB7CisJCXN3aXRjaCAodmFsKSB7CisJCWNhc2UgMjoKKwkJCWRhdGEtPnB3bV9lbmFibGUgJj0gfigyIDw8ICgyICogbnIpKTsKKwkJCWJyZWFrOwkJLyogTm9ybWFsIGF1dG8gbW9kZSAqLworCQljYXNlIDM6CisJCQlkYXRhLT5wd21fZW5hYmxlIHw9IDIgPDwgKDIgKiBucik7CisJCQlicmVhazsJCS8qIFRoZXJtb3N0YXQgbW9kZSAqLworCQlkZWZhdWx0OgorCQkJY291bnQgPSAtRUlOVkFMOworCQkJZ290byBsZWF2ZTsKKwkJfQorCX0gZWxzZSB7CisJCXN3aXRjaCAodmFsKSB7CisJCWNhc2UgMToKKwkJCWRhdGEtPnB3bV9lbmFibGUgfD0gMiA8PCAoMiAqIG5yKTsKKwkJCWJyZWFrOwkJLyogTWFudWFsICovCisJCWNhc2UgMjoKKwkJCWRhdGEtPnB3bV9lbmFibGUgJj0gfigyIDw8ICgyICogbnIpKTsKKwkJCWJyZWFrOwkJLyogTm9ybWFsIGF1dG8gbW9kZSAqLworCQlkZWZhdWx0OgorCQkJY291bnQgPSAtRUlOVkFMOworCQkJZ290byBsZWF2ZTsKKwkJfQorCX0KKwlmNzE4ODJmZ193cml0ZTgoZGF0YSwgRjcxODgyRkdfUkVHX1BXTV9FTkFCTEUsIGRhdGEtPnB3bV9lbmFibGUpOworbGVhdmU6CisJbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfcHdtX2F1dG9fcG9pbnRfcHdtKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsCisJCQkJICAgICAgIGNoYXIgKmJ1ZikKK3sKKwlpbnQgcmVzdWx0OworCXN0cnVjdCBmNzE4ODJmZ19kYXRhICpkYXRhID0gZjcxODgyZmdfdXBkYXRlX2RldmljZShkZXYpOworCWludCBwd20gPSB0b19zZW5zb3JfZGV2X2F0dHJfMihkZXZhdHRyKS0+aW5kZXg7CisJaW50IHBvaW50ID0gdG9fc2Vuc29yX2Rldl9hdHRyXzIoZGV2YXR0ciktPm5yOworCisJbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOworCWlmIChkYXRhLT5wd21fZW5hYmxlICYgKDEgPDwgKDIgKiBwd20pKSkgeworCQkvKiBQV00gbW9kZSAqLworCQlyZXN1bHQgPSBkYXRhLT5wd21fYXV0b19wb2ludF9wd21bcHdtXVtwb2ludF07CisJfSBlbHNlIHsKKwkJLyogUlBNIG1vZGUgKi8KKwkJcmVzdWx0ID0gMzIgKiAyNTUgLyAoMzIgKyBkYXRhLT5wd21fYXV0b19wb2ludF9wd21bcHdtXVtwb2ludF0pOworCX0KKwltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCByZXN1bHQpOworfQorCitzdGF0aWMgc3NpemVfdCBzdG9yZV9wd21fYXV0b19wb2ludF9wd20oc3RydWN0IGRldmljZSAqZGV2LAorCQkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwKKwkJCQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGY3MTg4MmZnX2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlpbnQgcHdtID0gdG9fc2Vuc29yX2Rldl9hdHRyXzIoZGV2YXR0ciktPmluZGV4OworCWludCBwb2ludCA9IHRvX3NlbnNvcl9kZXZfYXR0cl8yKGRldmF0dHIpLT5ucjsKKwlsb25nIHZhbCA9IHNpbXBsZV9zdHJ0b2woYnVmLCBOVUxMLCAxMCk7CisJdmFsID0gU0VOU09SU19MSU1JVCh2YWwsIDAsIDI1NSk7CisKKwltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisJZGF0YS0+cHdtX2VuYWJsZSA9IGY3MTg4MmZnX3JlYWQ4KGRhdGEsIEY3MTg4MkZHX1JFR19QV01fRU5BQkxFKTsKKwlpZiAoZGF0YS0+cHdtX2VuYWJsZSAmICgxIDw8ICgyICogcHdtKSkpIHsKKwkJLyogUFdNIG1vZGUgKi8KKwl9IGVsc2UgeworCQkvKiBSUE0gbW9kZSAqLworCQlpZiAodmFsIDwgMjkpCS8qIFByZXZlbnQgbmVnYXRpdmUgbnVtYmVycyAqLworCQkJdmFsID0gMjU1OworCQllbHNlCisJCQl2YWwgPSAoMjU1IC0gdmFsKSAqIDMyIC8gdmFsOworCX0KKwlmNzE4ODJmZ193cml0ZTgoZGF0YSwgRjcxODgyRkdfUkVHX1BPSU5UX1BXTShwd20sIHBvaW50KSwgdmFsKTsKKwlkYXRhLT5wd21fYXV0b19wb2ludF9wd21bcHdtXVtwb2ludF0gPSB2YWw7CisJbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfcHdtX2F1dG9fcG9pbnRfdGVtcF9oeXN0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkJICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwKKwkJCQkJICAgICBjaGFyICpidWYpCit7CisJaW50IHJlc3VsdCA9IDA7CisJc3RydWN0IGY3MTg4MmZnX2RhdGEgKmRhdGEgPSBmNzE4ODJmZ191cGRhdGVfZGV2aWNlKGRldik7CisJaW50IG5yID0gdG9fc2Vuc29yX2Rldl9hdHRyXzIoZGV2YXR0ciktPmluZGV4OworCWludCBwb2ludCA9IHRvX3NlbnNvcl9kZXZfYXR0cl8yKGRldmF0dHIpLT5ucjsKKworCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlpZiAobnIgJiAxKQorCQlyZXN1bHQgPSBkYXRhLT5wd21fYXV0b19wb2ludF9oeXN0W25yIC8gMl0gPj4gNDsKKwllbHNlCisJCXJlc3VsdCA9IGRhdGEtPnB3bV9hdXRvX3BvaW50X2h5c3RbbnIgLyAyXSAmIDB4MGY7CisJcmVzdWx0ID0gMTAwMCAqIChkYXRhLT5wd21fYXV0b19wb2ludF90ZW1wW25yXVtwb2ludF0gLSByZXN1bHQpOworCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHJlc3VsdCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHN0b3JlX3B3bV9hdXRvX3BvaW50X3RlbXBfaHlzdChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCSAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLAorCQkJCQkgICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgZjcxODgyZmdfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCWludCBuciA9IHRvX3NlbnNvcl9kZXZfYXR0cl8yKGRldmF0dHIpLT5pbmRleDsKKwlpbnQgcG9pbnQgPSB0b19zZW5zb3JfZGV2X2F0dHJfMihkZXZhdHRyKS0+bnI7CisJbG9uZyB2YWwgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApIC8gMTAwMDsKKwl1OCByZWc7CisKKwltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisJZGF0YS0+cHdtX2F1dG9fcG9pbnRfdGVtcFtucl1bcG9pbnRdID0KKwkJZjcxODgyZmdfcmVhZDgoZGF0YSwgRjcxODgyRkdfUkVHX1BPSU5UX1RFTVAobnIsIHBvaW50KSk7CisJdmFsID0gU0VOU09SU19MSU1JVCh2YWwsIGRhdGEtPnB3bV9hdXRvX3BvaW50X3RlbXBbbnJdW3BvaW50XSAtIDE1LAorCQkJCWRhdGEtPnB3bV9hdXRvX3BvaW50X3RlbXBbbnJdW3BvaW50XSk7CisJdmFsID0gZGF0YS0+cHdtX2F1dG9fcG9pbnRfdGVtcFtucl1bcG9pbnRdIC0gdmFsOworCisJcmVnID0gZjcxODgyZmdfcmVhZDgoZGF0YSwgRjcxODgyRkdfUkVHX0ZBTl9IWVNUKG5yIC8gMikpOworCWlmIChuciAmIDEpCisJCXJlZyA9IChyZWcgJiAweDBmKSB8ICh2YWwgPDwgNCk7CisJZWxzZQorCQlyZWcgPSAocmVnICYgMHhmMCkgfCB2YWw7CisKKwlmNzE4ODJmZ193cml0ZTgoZGF0YSwgRjcxODgyRkdfUkVHX0ZBTl9IWVNUKG5yIC8gMiksIHJlZyk7CisJZGF0YS0+cHdtX2F1dG9fcG9pbnRfaHlzdFtuciAvIDJdID0gcmVnOworCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdCBzaG93X3B3bV9pbnRlcnBvbGF0ZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLCBjaGFyICpidWYpCit7CisJaW50IHJlc3VsdDsKKwlzdHJ1Y3QgZjcxODgyZmdfZGF0YSAqZGF0YSA9IGY3MTg4MmZnX3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlpbnQgbnIgPSB0b19zZW5zb3JfZGV2X2F0dHJfMihkZXZhdHRyKS0+aW5kZXg7CisKKwlyZXN1bHQgPSAoZGF0YS0+cHdtX2F1dG9fcG9pbnRfbWFwcGluZ1tucl0gPj4gNCkgJiAxOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHJlc3VsdCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHN0b3JlX3B3bV9pbnRlcnBvbGF0ZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwKKwkJCQkgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBmNzE4ODJmZ19kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJaW50IG5yID0gdG9fc2Vuc29yX2Rldl9hdHRyXzIoZGV2YXR0ciktPmluZGV4OworCXVuc2lnbmVkIGxvbmcgdmFsID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7CisKKwltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisJZGF0YS0+cHdtX2F1dG9fcG9pbnRfbWFwcGluZ1tucl0gPQorCQlmNzE4ODJmZ19yZWFkOChkYXRhLCBGNzE4ODJGR19SRUdfUE9JTlRfTUFQUElORyhucikpOworCWlmICh2YWwpCisJCXZhbCA9IGRhdGEtPnB3bV9hdXRvX3BvaW50X21hcHBpbmdbbnJdIHwgKDEgPDwgNCk7CisJZWxzZQorCQl2YWwgPSBkYXRhLT5wd21fYXV0b19wb2ludF9tYXBwaW5nW25yXSAmICh+KDEgPDwgNCkpOworCWY3MTg4MmZnX3dyaXRlOChkYXRhLCBGNzE4ODJGR19SRUdfUE9JTlRfTUFQUElORyhuciksIHZhbCk7CisJZGF0YS0+cHdtX2F1dG9fcG9pbnRfbWFwcGluZ1tucl0gPSB2YWw7CisJbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfcHdtX2F1dG9fcG9pbnRfY2hhbm5lbChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCSAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLAorCQkJCQkgICBjaGFyICpidWYpCit7CisJaW50IHJlc3VsdDsKKwlzdHJ1Y3QgZjcxODgyZmdfZGF0YSAqZGF0YSA9IGY3MTg4MmZnX3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlpbnQgbnIgPSB0b19zZW5zb3JfZGV2X2F0dHJfMihkZXZhdHRyKS0+aW5kZXg7CisJaW50IHRlbXBfc3RhcnQgPSAoZGF0YS0+dHlwZSA9PSBmODAwMCkgPyAwIDogMTsKKworCXJlc3VsdCA9IDEgPDwgKChkYXRhLT5wd21fYXV0b19wb2ludF9tYXBwaW5nW25yXSAmIDMpIC0gdGVtcF9zdGFydCk7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgcmVzdWx0KTsKK30KKworc3RhdGljIHNzaXplX3Qgc3RvcmVfcHdtX2F1dG9fcG9pbnRfY2hhbm5lbChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwKKwkJCQkJICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBmNzE4ODJmZ19kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJaW50IG5yID0gdG9fc2Vuc29yX2Rldl9hdHRyXzIoZGV2YXR0ciktPmluZGV4OworCWludCB0ZW1wX3N0YXJ0ID0gKGRhdGEtPnR5cGUgPT0gZjgwMDApID8gMCA6IDE7CisJbG9uZyB2YWwgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApOworCisJc3dpdGNoICh2YWwpIHsKKwljYXNlIDE6CisJCXZhbCA9IDA7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJdmFsID0gMTsKKwkJYnJlYWs7CisJY2FzZSA0OgorCQl2YWwgPSAyOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJdmFsICs9IHRlbXBfc3RhcnQ7CisJbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOworCWRhdGEtPnB3bV9hdXRvX3BvaW50X21hcHBpbmdbbnJdID0KKwkJZjcxODgyZmdfcmVhZDgoZGF0YSwgRjcxODgyRkdfUkVHX1BPSU5UX01BUFBJTkcobnIpKTsKKwl2YWwgPSAoZGF0YS0+cHdtX2F1dG9fcG9pbnRfbWFwcGluZ1tucl0gJiAweGZjKSB8IHZhbDsKKwlmNzE4ODJmZ193cml0ZTgoZGF0YSwgRjcxODgyRkdfUkVHX1BPSU5UX01BUFBJTkcobnIpLCB2YWwpOworCWRhdGEtPnB3bV9hdXRvX3BvaW50X21hcHBpbmdbbnJdID0gdmFsOworCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdCBzaG93X3B3bV9hdXRvX3BvaW50X3RlbXAoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwKKwkJCQkJY2hhciAqYnVmKQoreworCWludCByZXN1bHQ7CisJc3RydWN0IGY3MTg4MmZnX2RhdGEgKmRhdGEgPSBmNzE4ODJmZ191cGRhdGVfZGV2aWNlKGRldik7CisJaW50IHB3bSA9IHRvX3NlbnNvcl9kZXZfYXR0cl8yKGRldmF0dHIpLT5pbmRleDsKKwlpbnQgcG9pbnQgPSB0b19zZW5zb3JfZGV2X2F0dHJfMihkZXZhdHRyKS0+bnI7CisKKwlyZXN1bHQgPSBkYXRhLT5wd21fYXV0b19wb2ludF90ZW1wW3B3bV1bcG9pbnRdOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCAxMDAwICogcmVzdWx0KTsKK30KKworc3RhdGljIHNzaXplX3Qgc3RvcmVfcHdtX2F1dG9fcG9pbnRfdGVtcChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCSBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwKKwkJCQkJIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBmNzE4ODJmZ19kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJaW50IHB3bSA9IHRvX3NlbnNvcl9kZXZfYXR0cl8yKGRldmF0dHIpLT5pbmRleDsKKwlpbnQgcG9pbnQgPSB0b19zZW5zb3JfZGV2X2F0dHJfMihkZXZhdHRyKS0+bnI7CisJbG9uZyB2YWwgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApIC8gMTAwMDsKKwl2YWwgPSBTRU5TT1JTX0xJTUlUKHZhbCwgMCwgMjU1KTsKKworCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlmNzE4ODJmZ193cml0ZTgoZGF0YSwgRjcxODgyRkdfUkVHX1BPSU5UX1RFTVAocHdtLCBwb2ludCksIHZhbCk7CisJZGF0YS0+cHdtX2F1dG9fcG9pbnRfdGVtcFtwd21dW3BvaW50XSA9IHZhbDsKKwltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCXJldHVybiBjb3VudDsKK30KKwogc3RhdGljIHNzaXplX3Qgc2hvd19uYW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsCiAJY2hhciAqYnVmKQogewotCXJldHVybiBzcHJpbnRmKGJ1ZiwgRFJWTkFNRSAiXG4iKTsKKwlzdHJ1Y3QgZjcxODgyZmdfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVzXG4iLCBmNzE4ODJmZ19uYW1lc1tkYXRhLT50eXBlXSk7CiB9CiAKK3N0YXRpYyBpbnQgX19kZXZpbml0IGY3MTg4MmZnX2NyZWF0ZV9zeXNmc19maWxlcyhzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAorCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZV8yICphdHRyLCBpbnQgY291bnQpCit7CisJaW50IGVyciwgaTsKIAotc3RhdGljIGludCBfX2RldmluaXQgZjcxODgyZmdfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqIHBkZXYpCisJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJZXJyID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZwZGV2LT5kZXYsICZhdHRyW2ldLmRldl9hdHRyKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBmNzE4ODJmZ19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXN0cnVjdCBmNzE4ODJmZ19kYXRhICpkYXRhOwotCWludCBlcnIsIGk7CisJc3RydWN0IGY3MTg4MmZnX3Npb19kYXRhICpzaW9fZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCWludCBlcnIsIGksIG5yX2ZhbnMgPSAoc2lvX2RhdGEtPnR5cGUgPT0gZjcxODgyZmcpID8gNCA6IDM7CiAJdTggc3RhcnRfcmVnOwogCi0JaWYgKCEoZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBmNzE4ODJmZ19kYXRhKSwgR0ZQX0tFUk5FTCkpKQorCWRhdGEgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZjcxODgyZmdfZGF0YSksIEdGUF9LRVJORUwpOworCWlmICghZGF0YSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAlkYXRhLT5hZGRyID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfSU8sIDApLT5zdGFydDsKKwlkYXRhLT50eXBlID0gc2lvX2RhdGEtPnR5cGU7CiAJbXV0ZXhfaW5pdCgmZGF0YS0+dXBkYXRlX2xvY2spOwogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGRhdGEpOwogCisJc3RhcnRfcmVnID0gZjcxODgyZmdfcmVhZDgoZGF0YSwgRjcxODgyRkdfUkVHX1NUQVJUKTsKKwlpZiAoc3RhcnRfcmVnICYgMHgwNCkgeworCQlkZXZfd2FybigmcGRldi0+ZGV2LCAiSGFyZHdhcmUgbW9uaXRvciBpcyBwb3dlcmVkIGRvd25cbiIpOworCQllcnIgPSAtRU5PREVWOworCQlnb3RvIGV4aXRfZnJlZTsKKwl9CisJaWYgKCEoc3RhcnRfcmVnICYgMHgwMykpIHsKKwkJZGV2X3dhcm4oJnBkZXYtPmRldiwgIkhhcmR3YXJlIG1vbml0b3Jpbmcgbm90IGFjdGl2YXRlZFxuIik7CisJCWVyciA9IC1FTk9ERVY7CisJCWdvdG8gZXhpdF9mcmVlOworCX0KKworCWRhdGEtPnB3bV9lbmFibGUgPSBmNzE4ODJmZ19yZWFkOChkYXRhLCBGNzE4ODJGR19SRUdfUFdNX0VOQUJMRSk7CisJLyogSWYgaXQgaXMgYSA3MTg2MiBhbmQgdGhlIGZhbiAvIHB3bSBwYXJ0IGlzIGVuYWJsZWQgc2FuaXR5IGNoZWNrCisJICAgdGhlIHB3bSBzZXR0aW5ncyAqLworCWlmIChkYXRhLT50eXBlID09IGY3MTg2MmZnICYmIChzdGFydF9yZWcgJiAweDAyKSkgeworCQlpZiAoKGRhdGEtPnB3bV9lbmFibGUgJiAweDE1KSAhPSAweDE1KSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsCisJCQkJIkludmFsaWQgKHJlc2VydmVkKSBwd20gc2V0dGluZ3M6IDB4JTAyeFxuIiwKKwkJCQkodW5zaWduZWQgaW50KWRhdGEtPnB3bV9lbmFibGUpOworCQkJZXJyID0gLUVOT0RFVjsKKwkJCWdvdG8gZXhpdF9mcmVlOworCQl9CisJfQorCiAJLyogUmVnaXN0ZXIgc3lzZnMgaW50ZXJmYWNlIGZpbGVzICovCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZjcxODgyZmdfZGV2X2F0dHIpOyBpKyspIHsKLQkJZXJyID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZwZGV2LT5kZXYsICZmNzE4ODJmZ19kZXZfYXR0cltpXSk7CisJZXJyID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZwZGV2LT5kZXYsICZkZXZfYXR0cl9uYW1lKTsKKwlpZiAoZXJyKQorCQlnb3RvIGV4aXRfdW5yZWdpc3Rlcl9zeXNmczsKKworCWlmIChzdGFydF9yZWcgJiAweDAxKSB7CisJCXN3aXRjaCAoZGF0YS0+dHlwZSkgeworCQljYXNlIGY3MTg4MmZnOgorCQkJZXJyID0gZjcxODgyZmdfY3JlYXRlX3N5c2ZzX2ZpbGVzKHBkZXYsCisJCQkJCWY3MTg4MmZnX2luX3RlbXBfYXR0ciwKKwkJCQkJQVJSQVlfU0laRShmNzE4ODJmZ19pbl90ZW1wX2F0dHIpKTsKKwkJCWlmIChlcnIpCisJCQkJZ290byBleGl0X3VucmVnaXN0ZXJfc3lzZnM7CisJCQkvKiBmYWxsIHRocm91Z2ghICovCisJCWNhc2UgZjcxODYyZmc6CisJCQllcnIgPSBmNzE4ODJmZ19jcmVhdGVfc3lzZnNfZmlsZXMocGRldiwKKwkJCQkJZjcxOHgyZmdfaW5fdGVtcF9hdHRyLAorCQkJCQlBUlJBWV9TSVpFKGY3MTh4MmZnX2luX3RlbXBfYXR0cikpOworCQkJYnJlYWs7CisJCWNhc2UgZjgwMDA6CisJCQllcnIgPSBmNzE4ODJmZ19jcmVhdGVfc3lzZnNfZmlsZXMocGRldiwKKwkJCQkJZjgwMDBfaW5fdGVtcF9hdHRyLAorCQkJCQlBUlJBWV9TSVpFKGY4MDAwX2luX3RlbXBfYXR0cikpOworCQkJYnJlYWs7CisJCX0KIAkJaWYgKGVycikKIAkJCWdvdG8gZXhpdF91bnJlZ2lzdGVyX3N5c2ZzOwogCX0KIAotCXN0YXJ0X3JlZyA9IGY3MTg4MmZnX3JlYWQ4KGRhdGEsIEY3MTg4MkZHX1JFR19TVEFSVCk7Ci0JaWYgKHN0YXJ0X3JlZyAmIDB4MDEpIHsKLQkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZjcxODgyZmdfaW5fdGVtcF9hdHRyKTsgaSsrKSB7Ci0JCQllcnIgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJnBkZXYtPmRldiwKLQkJCQkJJmY3MTg4MmZnX2luX3RlbXBfYXR0cltpXS5kZXZfYXR0cik7Ci0JCQlpZiAoZXJyKQotCQkJCWdvdG8gZXhpdF91bnJlZ2lzdGVyX3N5c2ZzOwotCQl9Ci0JfQotCiAJaWYgKHN0YXJ0X3JlZyAmIDB4MDIpIHsKLQkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZjcxODgyZmdfZmFuX2F0dHIpOyBpKyspIHsKLQkJCWVyciA9IGRldmljZV9jcmVhdGVfZmlsZSgmcGRldi0+ZGV2LAotCQkJCQkmZjcxODgyZmdfZmFuX2F0dHJbaV0uZGV2X2F0dHIpOwotCQkJaWYgKGVycikKLQkJCQlnb3RvIGV4aXRfdW5yZWdpc3Rlcl9zeXNmczsKKwkJZXJyID0gZjcxODgyZmdfY3JlYXRlX3N5c2ZzX2ZpbGVzKHBkZXYsIGZ4eHh4X2Zhbl9hdHRyLAorCQkJCQlBUlJBWV9TSVpFKGZ4eHh4X2Zhbl9hdHRyKSk7CisJCWlmIChlcnIpCisJCQlnb3RvIGV4aXRfdW5yZWdpc3Rlcl9zeXNmczsKKworCQlzd2l0Y2ggKGRhdGEtPnR5cGUpIHsKKwkJY2FzZSBmNzE4NjJmZzoKKwkJCWVyciA9IGY3MTg4MmZnX2NyZWF0ZV9zeXNmc19maWxlcyhwZGV2LAorCQkJCQlmNzE4NjJmZ19mYW5fYXR0ciwKKwkJCQkJQVJSQVlfU0laRShmNzE4NjJmZ19mYW5fYXR0cikpOworCQkJYnJlYWs7CisJCWNhc2UgZjcxODgyZmc6CisJCQllcnIgPSBmNzE4ODJmZ19jcmVhdGVfc3lzZnNfZmlsZXMocGRldiwKKwkJCQkJZjcxODgyZmdfZmFuX2F0dHIsCisJCQkJCUFSUkFZX1NJWkUoZjcxODgyZmdfZmFuX2F0dHIpKTsKKwkJCWJyZWFrOworCQljYXNlIGY4MDAwOgorCQkJZXJyID0gZjcxODgyZmdfY3JlYXRlX3N5c2ZzX2ZpbGVzKHBkZXYsCisJCQkJCWY4MDAwX2Zhbl9hdHRyLAorCQkJCQlBUlJBWV9TSVpFKGY4MDAwX2Zhbl9hdHRyKSk7CisJCQlicmVhazsKIAkJfQorCQlpZiAoZXJyKQorCQkJZ290byBleGl0X3VucmVnaXN0ZXJfc3lzZnM7CisKKwkJZm9yIChpID0gMDsgaSA8IG5yX2ZhbnM7IGkrKykKKwkJCWRldl9pbmZvKCZwZGV2LT5kZXYsICJGYW46ICVkIGlzIGluICVzIG1vZGVcbiIsIGkgKyAxLAorCQkJCSAoZGF0YS0+cHdtX2VuYWJsZSAmICgxIDw8IDIgKiBpKSkgPworCQkJCSAiZHV0eS1jeWNsZSIgOiAiUlBNIik7CiAJfQogCiAJZGF0YS0+aHdtb25fZGV2ID0gaHdtb25fZGV2aWNlX3JlZ2lzdGVyKCZwZGV2LT5kZXYpOwogCWlmIChJU19FUlIoZGF0YS0+aHdtb25fZGV2KSkgewogCQllcnIgPSBQVFJfRVJSKGRhdGEtPmh3bW9uX2Rldik7CisJCWRhdGEtPmh3bW9uX2RldiA9IE5VTEw7CiAJCWdvdG8gZXhpdF91bnJlZ2lzdGVyX3N5c2ZzOwogCX0KIAogCXJldHVybiAwOwogCiBleGl0X3VucmVnaXN0ZXJfc3lzZnM6Ci0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZjcxODgyZmdfZGV2X2F0dHIpOyBpKyspCi0JCWRldmljZV9yZW1vdmVfZmlsZSgmcGRldi0+ZGV2LCAmZjcxODgyZmdfZGV2X2F0dHJbaV0pOwotCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZjcxODgyZmdfaW5fdGVtcF9hdHRyKTsgaSsrKQotCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnBkZXYtPmRldiwKLQkJCQkJJmY3MTg4MmZnX2luX3RlbXBfYXR0cltpXS5kZXZfYXR0cik7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShmNzE4ODJmZ19mYW5fYXR0cik7IGkrKykKLQkJZGV2aWNlX3JlbW92ZV9maWxlKCZwZGV2LT5kZXYsICZmNzE4ODJmZ19mYW5fYXR0cltpXS5kZXZfYXR0cik7Ci0KKwlmNzE4ODJmZ19yZW1vdmUocGRldik7IC8qIFdpbGwgdW5yZWdpc3RlciB0aGUgc3lzZnMgZmlsZXMgZm9yIHVzICovCisJcmV0dXJuIGVycjsgLyogZjcxODgyZmdfcmVtb3ZlKCkgYWxzbyBmcmVlcyBvdXIgZGF0YSAqLworZXhpdF9mcmVlOgogCWtmcmVlKGRhdGEpOwotCiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIGludCBfX2RldmV4aXQgZjcxODgyZmdfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCitzdGF0aWMgaW50IGY3MTg4MmZnX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCWludCBpOwogCXN0cnVjdCBmNzE4ODJmZ19kYXRhICpkYXRhID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CiAKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKLQlod21vbl9kZXZpY2VfdW5yZWdpc3RlcihkYXRhLT5od21vbl9kZXYpOworCWlmIChkYXRhLT5od21vbl9kZXYpCisJCWh3bW9uX2RldmljZV91bnJlZ2lzdGVyKGRhdGEtPmh3bW9uX2Rldik7CiAKLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShmNzE4ODJmZ19kZXZfYXR0cik7IGkrKykKLQkJZGV2aWNlX3JlbW92ZV9maWxlKCZwZGV2LT5kZXYsICZmNzE4ODJmZ19kZXZfYXR0cltpXSk7CisJLyogTm90ZSB3ZSBhcmUgbm90IGxvb3Bpbmcgb3ZlciBhbGwgYXR0ciBhcnJheXMgd2UgaGF2ZSBhcyB0aGUgb25lcworCSAgIGJlbG93IGFyZSBzdXBlcnNldHMgb2YgdGhlIG9uZXMgc2tpcHBlZC4gKi8KKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnBkZXYtPmRldiwgJmRldl9hdHRyX25hbWUpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZjcxOHgyZmdfaW5fdGVtcF9hdHRyKTsgaSsrKQorCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnBkZXYtPmRldiwKKwkJCQkJJmY3MTh4MmZnX2luX3RlbXBfYXR0cltpXS5kZXZfYXR0cik7CiAKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShmNzE4ODJmZ19pbl90ZW1wX2F0dHIpOyBpKyspCiAJCWRldmljZV9yZW1vdmVfZmlsZSgmcGRldi0+ZGV2LAogCQkJCQkmZjcxODgyZmdfaW5fdGVtcF9hdHRyW2ldLmRldl9hdHRyKTsKIAorCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGZ4eHh4X2Zhbl9hdHRyKTsgaSsrKQorCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnBkZXYtPmRldiwgJmZ4eHh4X2Zhbl9hdHRyW2ldLmRldl9hdHRyKTsKKwogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGY3MTg4MmZnX2Zhbl9hdHRyKTsgaSsrKQogCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnBkZXYtPmRldiwgJmY3MTg4MmZnX2Zhbl9hdHRyW2ldLmRldl9hdHRyKTsKIAorCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGY4MDAwX2Zhbl9hdHRyKTsgaSsrKQorCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnBkZXYtPmRldiwgJmY4MDAwX2Zhbl9hdHRyW2ldLmRldl9hdHRyKTsKKwogCWtmcmVlKGRhdGEpOwogCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgX19pbml0IGY3MTg4MmZnX2ZpbmQoaW50IHNpb2FkZHIsIHVuc2lnbmVkIHNob3J0ICphZGRyZXNzKQorc3RhdGljIGludCBfX2luaXQgZjcxODgyZmdfZmluZChpbnQgc2lvYWRkciwgdW5zaWduZWQgc2hvcnQgKmFkZHJlc3MsCisJc3RydWN0IGY3MTg4MmZnX3Npb19kYXRhICpzaW9fZGF0YSkKIHsKIAlpbnQgZXJyID0gLUVOT0RFVjsKIAl1MTYgZGV2aWQ7Ci0JdTggc3RhcnRfcmVnOwotCXN0cnVjdCBmNzE4ODJmZ19kYXRhIGRhdGE7CiAKIAlzdXBlcmlvX2VudGVyKHNpb2FkZHIpOwogCkBAIC04NDIsNyArMTg3NywxNyBAQAogCX0KIAogCWRldmlkID0gZm9yY2VfaWQgPyBmb3JjZV9pZCA6IHN1cGVyaW9faW53KHNpb2FkZHIsIFNJT19SRUdfREVWSUQpOwotCWlmIChkZXZpZCAhPSBTSU9fRjcxODgyX0lEKSB7CisJc3dpdGNoIChkZXZpZCkgeworCWNhc2UgU0lPX0Y3MTg2Ml9JRDoKKwkJc2lvX2RhdGEtPnR5cGUgPSBmNzE4NjJmZzsKKwkJYnJlYWs7CisJY2FzZSBTSU9fRjcxODgyX0lEOgorCQlzaW9fZGF0YS0+dHlwZSA9IGY3MTg4MmZnOworCQlicmVhazsKKwljYXNlIFNJT19GODAwMF9JRDoKKwkJc2lvX2RhdGEtPnR5cGUgPSBmODAwMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKIAkJcHJpbnRrKEtFUk5fSU5GTyBEUlZOQU1FICI6IFVuc3VwcG9ydGVkIEZpbnRlayBkZXZpY2VcbiIpOwogCQlnb3RvIGV4aXQ7CiAJfQpAQCAtODYxLDI0ICsxOTA2LDE3IEBACiAJfQogCSphZGRyZXNzICY9IH4oUkVHSU9OX0xFTkdUSCAtIDEpOwkvKiBJZ25vcmUgMyBMU0IgKi8KIAotCWRhdGEuYWRkciA9ICphZGRyZXNzOwotCXN0YXJ0X3JlZyA9IGY3MTg4MmZnX3JlYWQ4KCZkYXRhLCBGNzE4ODJGR19SRUdfU1RBUlQpOwotCWlmICghKHN0YXJ0X3JlZyAmIDB4MDMpKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgRFJWTkFNRQotCQkJIjogSGFyZHdhcmUgbW9uaXRvcmluZyBub3QgYWN0aXZhdGVkXG4iKTsKLQkJZ290byBleGl0OwotCX0KLQogCWVyciA9IDA7Ci0JcHJpbnRrKEtFUk5fSU5GTyBEUlZOQU1FICI6IEZvdW5kIEY3MTg4MkZHIGNoaXAgYXQgJSN4LCByZXZpc2lvbiAlZFxuIiwKLQkJKHVuc2lnbmVkIGludCkqYWRkcmVzcywKKwlwcmludGsoS0VSTl9JTkZPIERSVk5BTUUgIjogRm91bmQgJXMgY2hpcCBhdCAlI3gsIHJldmlzaW9uICVkXG4iLAorCQlmNzE4ODJmZ19uYW1lc1tzaW9fZGF0YS0+dHlwZV0sCSh1bnNpZ25lZCBpbnQpKmFkZHJlc3MsCiAJCShpbnQpc3VwZXJpb19pbmIoc2lvYWRkciwgU0lPX1JFR19ERVZSRVYpKTsKIGV4aXQ6CiAJc3VwZXJpb19leGl0KHNpb2FkZHIpOwogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBpbnQgX19pbml0IGY3MTg4MmZnX2RldmljZV9hZGQodW5zaWduZWQgc2hvcnQgYWRkcmVzcykKK3N0YXRpYyBpbnQgX19pbml0IGY3MTg4MmZnX2RldmljZV9hZGQodW5zaWduZWQgc2hvcnQgYWRkcmVzcywKKwljb25zdCBzdHJ1Y3QgZjcxODgyZmdfc2lvX2RhdGEgKnNpb19kYXRhKQogewogCXN0cnVjdCByZXNvdXJjZSByZXMgPSB7CiAJCS5zdGFydAk9IGFkZHJlc3MsCkBAIC04OTIsMTIgKzE5MzAsMjMgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAlyZXMubmFtZSA9IGY3MTg4MmZnX3BkZXYtPm5hbWU7CisJZXJyID0gYWNwaV9jaGVja19yZXNvdXJjZV9jb25mbGljdCgmcmVzKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCiAJZXJyID0gcGxhdGZvcm1fZGV2aWNlX2FkZF9yZXNvdXJjZXMoZjcxODgyZmdfcGRldiwgJnJlcywgMSk7CiAJaWYgKGVycikgewogCQlwcmludGsoS0VSTl9FUlIgRFJWTkFNRSAiOiBEZXZpY2UgcmVzb3VyY2UgYWRkaXRpb24gZmFpbGVkXG4iKTsKIAkJZ290byBleGl0X2RldmljZV9wdXQ7CiAJfQogCisJZXJyID0gcGxhdGZvcm1fZGV2aWNlX2FkZF9kYXRhKGY3MTg4MmZnX3BkZXYsIHNpb19kYXRhLAorCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IGY3MTg4MmZnX3Npb19kYXRhKSk7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9FUlIgRFJWTkFNRSAiOiBQbGF0Zm9ybSBkYXRhIGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKKwkJZ290byBleGl0X2RldmljZV9wdXQ7CisJfQorCiAJZXJyID0gcGxhdGZvcm1fZGV2aWNlX2FkZChmNzE4ODJmZ19wZGV2KTsKIAlpZiAoZXJyKSB7CiAJCXByaW50ayhLRVJOX0VSUiBEUlZOQU1FICI6IERldmljZSBhZGRpdGlvbiBmYWlsZWRcbiIpOwpAQCAtOTE2LDE0ICsxOTY1LDIwIEBACiB7CiAJaW50IGVyciA9IC1FTk9ERVY7CiAJdW5zaWduZWQgc2hvcnQgYWRkcmVzczsKKwlzdHJ1Y3QgZjcxODgyZmdfc2lvX2RhdGEgc2lvX2RhdGE7CiAKLQlpZiAoZjcxODgyZmdfZmluZCgweDJlLCAmYWRkcmVzcykgJiYgZjcxODgyZmdfZmluZCgweDRlLCAmYWRkcmVzcykpCisJbWVtc2V0KCZzaW9fZGF0YSwgMCwgc2l6ZW9mKHNpb19kYXRhKSk7CisKKwlpZiAoZjcxODgyZmdfZmluZCgweDJlLCAmYWRkcmVzcywgJnNpb19kYXRhKSAmJgorCSAgICBmNzE4ODJmZ19maW5kKDB4NGUsICZhZGRyZXNzLCAmc2lvX2RhdGEpKQogCQlnb3RvIGV4aXQ7CiAKLQlpZiAoKGVyciA9IHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmZjcxODgyZmdfZHJpdmVyKSkpCisJZXJyID0gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZmNzE4ODJmZ19kcml2ZXIpOworCWlmIChlcnIpCiAJCWdvdG8gZXhpdDsKIAotCWlmICgoZXJyID0gZjcxODgyZmdfZGV2aWNlX2FkZChhZGRyZXNzKSkpCisJZXJyID0gZjcxODgyZmdfZGV2aWNlX2FkZChhZGRyZXNzLCAmc2lvX2RhdGEpOworCWlmIChlcnIpCiAJCWdvdG8gZXhpdF9kcml2ZXI7CiAKIAlyZXR1cm4gMDsKQEAgLTk0MSw3ICsxOTk2LDcgQEAKIH0KIAogTU9EVUxFX0RFU0NSSVBUSU9OKCJGNzE4ODJGRyBIYXJkd2FyZSBNb25pdG9yaW5nIERyaXZlciIpOwotTU9EVUxFX0FVVEhPUigiSGFucyBFZGdpbmd0b24gKGhhbnNAZWRnaW5ndG9uLm5sKSIpOworTU9EVUxFX0FVVEhPUigiSGFucyBFZGdpbmd0b24sIEhhbnMgZGUgR29lZGUgKGhkZWdvZWRlQHJlZGhhdC5jb20pIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKIG1vZHVsZV9pbml0KGY3MTg4MmZnX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9mc2NobWQuYyBiL2RyaXZlcnMvaHdtb24vZnNjaG1kLmMKaW5kZXggOTY3MTcwMy4uZDA3ZjRlZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9mc2NobWQuYworKysgYi9kcml2ZXJzL2h3bW9uL2ZzY2htZC5jCkBAIC0xLDYgKzEsNiBAQAogLyogZnNjaG1kLmMKICAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgSGFucyBkZSBHb2VkZSA8ai53LnIuZGVnb2VkZUBoaHMubmw+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDcsMjAwOCBIYW5zIGRlIEdvZWRlIDxoZGVnb2VkZUByZWRoYXQuY29tPgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQpAQCAtNDIsMTEgKzQyLDIwIEBACiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC9zeXNmcy5oPgogI2luY2x1ZGUgPGxpbnV4L2RtaS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvd2F0Y2hkb2cuaD4KKyNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tyZWYuaD4KIAogLyogQWRkcmVzc2VzIHRvIHNjYW4gKi8KIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBub3JtYWxfaTJjW10gPSB7IDB4NzMsIEkyQ19DTElFTlRfRU5EIH07CiAKIC8qIEluc21vZCBwYXJhbWV0ZXJzICovCitzdGF0aWMgaW50IG5vd2F5b3V0ID0gV0FUQ0hET0dfTk9XQVlPVVQ7Cittb2R1bGVfcGFyYW0obm93YXlvdXQsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKG5vd2F5b3V0LCAiV2F0Y2hkb2cgY2Fubm90IGJlIHN0b3BwZWQgb25jZSBzdGFydGVkIChkZWZhdWx0PSIKKwlfX01PRFVMRV9TVFJJTkcoV0FUQ0hET0dfTk9XQVlPVVQpICIpIik7CiBJMkNfQ0xJRU5UX0lOU01PRF81KGZzY3BvcywgZnNjaGVyLCBmc2NzY3ksIGZzY2hyYywgZnNjaG1kKTsKIAogLyoKQEAgLTYzLDE5ICs3MiwyNiBAQAogI2RlZmluZSBGU0NITURfUkVHX0VWRU5UX1NUQVRFCQkweDA0CiAjZGVmaW5lIEZTQ0hNRF9SRUdfQ09OVFJPTAkJMHgwNQogCi0jZGVmaW5lIEZTQ0hNRF9DT05UUk9MX0FMRVJUX0xFRF9NQVNLCTB4MDEKKyNkZWZpbmUgRlNDSE1EX0NPTlRST0xfQUxFUlRfTEVECTB4MDEKIAotLyogd2F0Y2hkb2cgKHN1cHBvcnQgdG8gYmUgaW1wbGVtZW50ZWQpICovCisvKiB3YXRjaGRvZyAqLwogI2RlZmluZSBGU0NITURfUkVHX1dET0dfUFJFU0VUCQkweDI4CiAjZGVmaW5lIEZTQ0hNRF9SRUdfV0RPR19TVEFURQkJMHgyMwogI2RlZmluZSBGU0NITURfUkVHX1dET0dfQ09OVFJPTAkJMHgyMQogCisjZGVmaW5lIEZTQ0hNRF9XRE9HX0NPTlRST0xfVFJJR0dFUgkweDEwCisjZGVmaW5lIEZTQ0hNRF9XRE9HX0NPTlRST0xfU1RBUlRFRAkweDEwIC8qIHRoZSBzYW1lIGFzIHRyaWdnZXIgKi8KKyNkZWZpbmUgRlNDSE1EX1dET0dfQ09OVFJPTF9TVE9QCTB4MjAKKyNkZWZpbmUgRlNDSE1EX1dET0dfQ09OVFJPTF9SRVNPTFVUSU9OCTB4NDAKKworI2RlZmluZSBGU0NITURfV0RPR19TVEFURV9DQVJEUkVTRVQJMHgwMgorCiAvKiB2b2x0YWdlcywgd2VpcmQgb3JkZXIgaXMgdG8ga2VlcCB0aGUgc2FtZSBvcmRlciBhcyB0aGUgb2xkIGRyaXZlcnMgKi8KIHN0YXRpYyBjb25zdCB1OCBGU0NITURfUkVHX1ZPTFRbM10gPSB7IDB4NDUsIDB4NDIsIDB4NDggfTsKIAogLyogbWluaW11bSBwd20gYXQgd2hpY2ggdGhlIGZhbiBpcyBkcml2ZW4gKHB3bSBjYW4gYnkgaW5jcmVhc2VkIGRlcGVuZGluZyBvbgogICAgdGhlIHRlbXAuIE5vdGljZSB0aGF0IGZvciB0aGUgc2N5IHNvbWUgZmFucyBzaGFyZSB0aGVyZSBtaW5pbXVtIHNwZWVkLgotICAgQWxzbyBub3RpY2UgdGhhdCB3aXRoIHRoZSBzY3kgdGhlIHNlbnNvciBvcmRlciBpcyBkaWZmZXJlbnQgdGhlbiB3aXRoIHRoZQorICAgQWxzbyBub3RpY2UgdGhhdCB3aXRoIHRoZSBzY3kgdGhlIHNlbnNvciBvcmRlciBpcyBkaWZmZXJlbnQgdGhhbiB3aXRoIHRoZQogICAgb3RoZXIgY2hpcHMsIHRoaXMgb3JkZXIgd2FzIGluIHRoZSAyLjQgZHJpdmVyIGFuZCBrZXB0IGZvciBjb25zaXN0ZW5jeS4gKi8KIHN0YXRpYyBjb25zdCB1OCBGU0NITURfUkVHX0ZBTl9NSU5bNV1bNl0gPSB7CiAJeyAweDU1LCAweDY1IH0sCQkJCQkvKiBwb3MgKi8KQEAgLTExNSw4ICsxMzEsOCBAQAogc3RhdGljIGNvbnN0IGludCBGU0NITURfTk9fRkFOX1NFTlNPUlNbNV0gPSB7IDMsIDMsIDYsIDQsIDUgfTsKIAogLyogRmFuIHN0YXR1cyByZWdpc3RlciBiaXRtYXNrcyAqLwotI2RlZmluZSBGU0NITURfRkFOX0FMQVJNX01BU0sJCTB4MDQgLyogY2FsbGVkIGZhdWx0IGJ5IEZTQyEgKi8KLSNkZWZpbmUgRlNDSE1EX0ZBTl9OT1RfUFJFU0VOVF9NQVNLCTB4MDggLyogbm90IGRvY3VtZW50ZWQgKi8KKyNkZWZpbmUgRlNDSE1EX0ZBTl9BTEFSTQkweDA0IC8qIGNhbGxlZCBmYXVsdCBieSBGU0MhICovCisjZGVmaW5lIEZTQ0hNRF9GQU5fTk9UX1BSRVNFTlQJMHgwOCAvKiBub3QgZG9jdW1lbnRlZCAqLwogCiAKIC8qIGFjdHVhbCB0ZW1wZXJhdHVyZSByZWdpc3RlcnMgKi8KQEAgLTE1OCwxNCArMTc0LDExIEBACiBzdGF0aWMgY29uc3QgaW50IEZTQ0hNRF9OT19URU1QX1NFTlNPUlNbNV0gPSB7IDMsIDMsIDQsIDMsIDUgfTsKIAogLyogdGVtcCBzdGF0dXMgcmVnaXN0ZXIgYml0bWFza3MgKi8KLSNkZWZpbmUgRlNDSE1EX1RFTVBfV09SS0lOR19NQVNLCTB4MDEKLSNkZWZpbmUgRlNDSE1EX1RFTVBfQUxFUlRfTUFTSwkJMHgwMgorI2RlZmluZSBGU0NITURfVEVNUF9XT1JLSU5HCTB4MDEKKyNkZWZpbmUgRlNDSE1EX1RFTVBfQUxFUlQJMHgwMgogLyogdGhlcmUgb25seSByZWFsbHkgaXMgYW4gYWxhcm0gaWYgdGhlIHNlbnNvciBpcyB3b3JraW5nIGFuZCBhbGVydCA9PSAxICovCiAjZGVmaW5lIEZTQ0hNRF9URU1QX0FMQVJNX01BU0sgXAotCShGU0NITURfVEVNUF9XT1JLSU5HX01BU0sgfCBGU0NITURfVEVNUF9BTEVSVF9NQVNLKQotCi0vKiBvdXIgZHJpdmVyIG5hbWUgKi8KLSNkZWZpbmUgRlNDSE1EX05BTUUgImZzY2htZCIKKwkoRlNDSE1EX1RFTVBfV09SS0lORyB8IEZTQ0hNRF9URU1QX0FMRVJUKQogCiAvKgogICogRnVuY3Rpb25zIGRlY2xhcmF0aW9ucwpAQCAtMTk1LDcgKzIwOCw3IEBACiBzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgZnNjaG1kX2RyaXZlciA9IHsKIAkuY2xhc3MJCT0gSTJDX0NMQVNTX0hXTU9OLAogCS5kcml2ZXIgPSB7Ci0JCS5uYW1lCT0gRlNDSE1EX05BTUUsCisJCS5uYW1lCT0gImZzY2htZCIsCiAJfSwKIAkucHJvYmUJCT0gZnNjaG1kX3Byb2JlLAogCS5yZW1vdmUJCT0gZnNjaG1kX3JlbW92ZSwKQEAgLTIwOSwxNCArMjIyLDI2IEBACiAgKi8KIAogc3RydWN0IGZzY2htZF9kYXRhIHsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OwogCXN0cnVjdCBkZXZpY2UgKmh3bW9uX2RldjsKIAlzdHJ1Y3QgbXV0ZXggdXBkYXRlX2xvY2s7CisJc3RydWN0IG11dGV4IHdhdGNoZG9nX2xvY2s7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OyAvKiBtZW1iZXIgb2YgdGhlIHdhdGNoZG9nX2RhdGFfbGlzdCAqLworCXN0cnVjdCBrcmVmIGtyZWY7CisJc3RydWN0IG1pc2NkZXZpY2Ugd2F0Y2hkb2dfbWlzY2RldjsKIAlpbnQga2luZDsKKwl1bnNpZ25lZCBsb25nIHdhdGNoZG9nX2lzX29wZW47CisJY2hhciB3YXRjaGRvZ19leHBlY3RfY2xvc2U7CisJY2hhciB3YXRjaGRvZ19uYW1lWzEwXTsgLyogbXVzdCBiZSB1bmlxdWUgdG8gYXZvaWQgc3lzZnMgY29uZmxpY3QgKi8KIAljaGFyIHZhbGlkOyAvKiB6ZXJvIHVudGlsIGZvbGxvd2luZyBmaWVsZHMgYXJlIHZhbGlkICovCiAJdW5zaWduZWQgbG9uZyBsYXN0X3VwZGF0ZWQ7IC8qIGluIGppZmZpZXMgKi8KIAogCS8qIHJlZ2lzdGVyIHZhbHVlcyAqLworCXU4IHJldmlzaW9uOyAgICAgICAgICAgIC8qIGNoaXAgcmV2aXNpb24gKi8KIAl1OCBnbG9iYWxfY29udHJvbDsJLyogZ2xvYmFsIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKwl1OCB3YXRjaGRvZ19jb250cm9sOyAgICAvKiB3YXRjaGRvZyBjb250cm9sIHJlZ2lzdGVyICovCisJdTggd2F0Y2hkb2dfc3RhdGU7ICAgICAgLyogd2F0Y2hkb2cgc3RhdHVzIHJlZ2lzdGVyICovCisJdTggd2F0Y2hkb2dfcHJlc2V0OyAgICAgLyogd2F0Y2hkb2cgY291bnRlciBwcmVzZXQgb24gdHJpZ2dlciB2YWwgKi8KIAl1OCB2b2x0WzNdOwkJLyogMTIsIDUsIGJhdHRlcnkgdm9sdGFnZSAqLwogCXU4IHRlbXBfYWN0WzVdOwkJLyogdGVtcGVyYXR1cmUgKi8KIAl1OCB0ZW1wX3N0YXR1c1s1XTsJLyogc3RhdHVzIG9mIHNlbnNvciAqLwpAQCAtMjI4LDExICsyNTMsMjggQEAKIH07CiAKIC8qIEdsb2JhbCB2YXJpYWJsZXMgdG8gaG9sZCBpbmZvcm1hdGlvbiByZWFkIGZyb20gc3BlY2lhbCBETUkgdGFibGVzLCB3aGljaCBhcmUKLSAgIGF2YWlsYWJsZSBvbiBGU0MgbWFjaGluZXMgd2l0aCBhbiBmc2NoZXIgb3IgbGF0ZXIgY2hpcC4gKi8KKyAgIGF2YWlsYWJsZSBvbiBGU0MgbWFjaGluZXMgd2l0aCBhbiBmc2NoZXIgb3IgbGF0ZXIgY2hpcC4gVGhlcmUgaXMgbm8gbmVlZCB0bworICAgcHJvdGVjdCB0aGVzZSB3aXRoIGEgbG9jayBhcyB0aGV5IGFyZSBvbmx5IG1vZGlmaWVkIGZyb20gb3VyIGF0dGFjaCBmdW5jdGlvbgorICAgd2hpY2ggYWx3YXlzIGdldHMgY2FsbGVkIHdpdGggdGhlIGkyYy1jb3JlIGxvY2sgaGVsZCBhbmQgbmV2ZXIgYWNjZXNzZWQKKyAgIGJlZm9yZSB0aGUgYXR0YWNoIGZ1bmN0aW9uIGlzIGRvbmUgd2l0aCB0aGVtLiAqLwogc3RhdGljIGludCBkbWlfbXVsdFszXSA9IHsgNDkwLCAyMDAsIDEwMCB9Owogc3RhdGljIGludCBkbWlfb2Zmc2V0WzNdID0geyAwLCAwLCAwIH07CiBzdGF0aWMgaW50IGRtaV92cmVmID0gLTE7CiAKKy8qIFNvbWV3aGF0IHVnbHkgOiggZ2xvYmFsIGRhdGEgcG9pbnRlciBsaXN0IHdpdGggYWxsIGZzY2htZCBkZXZpY2VzLCBzbyB0aGF0CisgICB3ZSBjYW4gZmluZCBvdXIgZGV2aWNlIGRhdGEgYXMgd2hlbiB1c2luZyBtaXNjX3JlZ2lzdGVyIHRoZXJlIGlzIG5vIG90aGVyCisgICBtZXRob2QgdG8gZ2V0IHRvIG9uZXMgZGV2aWNlIGRhdGEgZnJvbSB0aGUgb3BlbiBmb3AuICovCitzdGF0aWMgTElTVF9IRUFEKHdhdGNoZG9nX2RhdGFfbGlzdCk7CisvKiBOb3RlIHRoaXMgbG9jayBub3Qgb25seSBwcm90ZWN0IGxpc3QgYWNjZXNzLCBidXQgYWxzbyBkYXRhLmtyZWYgYWNjZXNzICovCitzdGF0aWMgREVGSU5FX01VVEVYKHdhdGNoZG9nX2RhdGFfbXV0ZXgpOworCisvKiBSZWxlYXNlIG91ciBkYXRhIHN0cnVjdCB3aGVuIHdlJ3JlIGRldGFjaGVkIGZyb20gdGhlIGkyYyBjbGllbnQgKmFuZCogYWxsCisgICByZWZlcmVuY2VzIHRvIG91ciB3YXRjaGRvZyBkZXZpY2UgYXJlIHJlbGVhc2VkICovCitzdGF0aWMgdm9pZCBmc2NobWRfcmVsZWFzZV9yZXNvdXJjZXMoc3RydWN0IGtyZWYgKnJlZikKK3sKKwlzdHJ1Y3QgZnNjaG1kX2RhdGEgKmRhdGEgPSBjb250YWluZXJfb2YocmVmLCBzdHJ1Y3QgZnNjaG1kX2RhdGEsIGtyZWYpOworCWtmcmVlKGRhdGEpOworfQogCiAvKgogICogU3lzZnMgYXR0ciBzaG93IC8gc3RvcmUgZnVuY3Rpb25zCkBAIC0zMDAsNyArMzQyLDcgQEAKIAlzdHJ1Y3QgZnNjaG1kX2RhdGEgKmRhdGEgPSBmc2NobWRfdXBkYXRlX2RldmljZShkZXYpOwogCiAJLyogYml0IDAgc2V0IG1lYW5zIHNlbnNvciB3b3JraW5nIG9rLCBzbyBubyBmYXVsdCEgKi8KLQlpZiAoZGF0YS0+dGVtcF9zdGF0dXNbaW5kZXhdICYgRlNDSE1EX1RFTVBfV09SS0lOR19NQVNLKQorCWlmIChkYXRhLT50ZW1wX3N0YXR1c1tpbmRleF0gJiBGU0NITURfVEVNUF9XT1JLSU5HKQogCQlyZXR1cm4gc3ByaW50ZihidWYsICIwXG4iKTsKIAllbHNlCiAJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjFcbiIpOwpAQCAtMzg1LDcgKzQyNyw3IEBACiAJaW50IGluZGV4ID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRldmF0dHIpLT5pbmRleDsKIAlzdHJ1Y3QgZnNjaG1kX2RhdGEgKmRhdGEgPSBmc2NobWRfdXBkYXRlX2RldmljZShkZXYpOwogCi0JaWYgKGRhdGEtPmZhbl9zdGF0dXNbaW5kZXhdICYgRlNDSE1EX0ZBTl9BTEFSTV9NQVNLKQorCWlmIChkYXRhLT5mYW5fc3RhdHVzW2luZGV4XSAmIEZTQ0hNRF9GQU5fQUxBUk0pCiAJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjFcbiIpOwogCWVsc2UKIAkJcmV0dXJuIHNwcmludGYoYnVmLCAiMFxuIik7CkBAIC0zOTcsNyArNDM5LDcgQEAKIAlpbnQgaW5kZXggPSB0b19zZW5zb3JfZGV2X2F0dHIoZGV2YXR0ciktPmluZGV4OwogCXN0cnVjdCBmc2NobWRfZGF0YSAqZGF0YSA9IGZzY2htZF91cGRhdGVfZGV2aWNlKGRldik7CiAKLQlpZiAoZGF0YS0+ZmFuX3N0YXR1c1tpbmRleF0gJiBGU0NITURfRkFOX05PVF9QUkVTRU5UX01BU0spCisJaWYgKGRhdGEtPmZhbl9zdGF0dXNbaW5kZXhdICYgRlNDSE1EX0ZBTl9OT1RfUFJFU0VOVCkKIAkJcmV0dXJuIHNwcmludGYoYnVmLCAiMVxuIik7CiAJZWxzZQogCQlyZXR1cm4gc3ByaW50ZihidWYsICIwXG4iKTsKQEAgLTQ0OSw3ICs0OTEsNyBAQAogewogCXN0cnVjdCBmc2NobWRfZGF0YSAqZGF0YSA9IGZzY2htZF91cGRhdGVfZGV2aWNlKGRldik7CiAKLQlpZiAoZGF0YS0+Z2xvYmFsX2NvbnRyb2wgJiBGU0NITURfQ09OVFJPTF9BTEVSVF9MRURfTUFTSykKKwlpZiAoZGF0YS0+Z2xvYmFsX2NvbnRyb2wgJiBGU0NITURfQ09OVFJPTF9BTEVSVF9MRUQpCiAJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjFcbiIpOwogCWVsc2UKIAkJcmV0dXJuIHNwcmludGYoYnVmLCAiMFxuIik7CkBAIC00NjcsOSArNTA5LDkgQEAKIAlyZWcgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEodG9faTJjX2NsaWVudChkZXYpLCBGU0NITURfUkVHX0NPTlRST0wpOwogCiAJaWYgKHYpCi0JCXJlZyB8PSBGU0NITURfQ09OVFJPTF9BTEVSVF9MRURfTUFTSzsKKwkJcmVnIHw9IEZTQ0hNRF9DT05UUk9MX0FMRVJUX0xFRDsKIAllbHNlCi0JCXJlZyAmPSB+RlNDSE1EX0NPTlRST0xfQUxFUlRfTEVEX01BU0s7CisJCXJlZyAmPSB+RlNDSE1EX0NPTlRST0xfQUxFUlRfTEVEOwogCiAJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YSh0b19pMmNfY2xpZW50KGRldiksIEZTQ0hNRF9SRUdfQ09OVFJPTCwgcmVnKTsKIApAQCAtNTUxLDcgKzU5MywyNjUgQEAKIAogCiAvKgotICogUmVhbCBjb2RlCisgKiBXYXRjaGRvZyByb3V0aW5lcworICovCisKK3N0YXRpYyBpbnQgd2F0Y2hkb2dfc2V0X3RpbWVvdXQoc3RydWN0IGZzY2htZF9kYXRhICpkYXRhLCBpbnQgdGltZW91dCkKK3sKKwlpbnQgcmV0LCByZXNvbHV0aW9uOworCWludCBraW5kID0gZGF0YS0+a2luZCArIDE7IC8qIDAteCBhcnJheSBpbmRleCAtPiAxLXggbW9kdWxlIHBhcmFtICovCisKKwkvKiAyIHNlY29uZCBvciA2MCBzZWNvbmQgcmVzb2x1dGlvbj8gKi8KKwlpZiAodGltZW91dCA8PSA1MTAgfHwga2luZCA9PSBmc2Nwb3MgfHwga2luZCA9PSBmc2NzY3kpCisJCXJlc29sdXRpb24gPSAyOworCWVsc2UKKwkJcmVzb2x1dGlvbiA9IDYwOworCisJaWYgKHRpbWVvdXQgPCByZXNvbHV0aW9uIHx8IHRpbWVvdXQgPiAocmVzb2x1dGlvbiAqIDI1NSkpCisJCXJldHVybiAtRUlOVkFMOworCisJbXV0ZXhfbG9jaygmZGF0YS0+d2F0Y2hkb2dfbG9jayk7CisJaWYgKCFkYXRhLT5jbGllbnQpIHsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBsZWF2ZTsKKwl9CisKKwlpZiAocmVzb2x1dGlvbiA9PSAyKQorCQlkYXRhLT53YXRjaGRvZ19jb250cm9sICY9IH5GU0NITURfV0RPR19DT05UUk9MX1JFU09MVVRJT047CisJZWxzZQorCQlkYXRhLT53YXRjaGRvZ19jb250cm9sIHw9IEZTQ0hNRF9XRE9HX0NPTlRST0xfUkVTT0xVVElPTjsKKworCWRhdGEtPndhdGNoZG9nX3ByZXNldCA9IERJVl9ST1VORF9VUCh0aW1lb3V0LCByZXNvbHV0aW9uKTsKKworCS8qIFdyaXRlIG5ldyB0aW1lb3V0IHZhbHVlICovCisJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShkYXRhLT5jbGllbnQsIEZTQ0hNRF9SRUdfV0RPR19QUkVTRVQsCisJCWRhdGEtPndhdGNoZG9nX3ByZXNldCk7CisJLyogV3JpdGUgbmV3IGNvbnRyb2wgcmVnaXN0ZXIsIGRvIG5vdCB0cmlnZ2VyISAqLworCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoZGF0YS0+Y2xpZW50LCBGU0NITURfUkVHX1dET0dfQ09OVFJPTCwKKwkJZGF0YS0+d2F0Y2hkb2dfY29udHJvbCAmIH5GU0NITURfV0RPR19DT05UUk9MX1RSSUdHRVIpOworCisJcmV0ID0gZGF0YS0+d2F0Y2hkb2dfcHJlc2V0ICogcmVzb2x1dGlvbjsKKworbGVhdmU6CisJbXV0ZXhfdW5sb2NrKCZkYXRhLT53YXRjaGRvZ19sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHdhdGNoZG9nX2dldF90aW1lb3V0KHN0cnVjdCBmc2NobWRfZGF0YSAqZGF0YSkKK3sKKwlpbnQgdGltZW91dDsKKworCW11dGV4X2xvY2soJmRhdGEtPndhdGNoZG9nX2xvY2spOworCWlmIChkYXRhLT53YXRjaGRvZ19jb250cm9sICYgRlNDSE1EX1dET0dfQ09OVFJPTF9SRVNPTFVUSU9OKQorCQl0aW1lb3V0ID0gZGF0YS0+d2F0Y2hkb2dfcHJlc2V0ICogNjA7CisJZWxzZQorCQl0aW1lb3V0ID0gZGF0YS0+d2F0Y2hkb2dfcHJlc2V0ICogMjsKKwltdXRleF91bmxvY2soJmRhdGEtPndhdGNoZG9nX2xvY2spOworCisJcmV0dXJuIHRpbWVvdXQ7Cit9CisKK3N0YXRpYyBpbnQgd2F0Y2hkb2dfdHJpZ2dlcihzdHJ1Y3QgZnNjaG1kX2RhdGEgKmRhdGEpCit7CisJaW50IHJldCA9IDA7CisKKwltdXRleF9sb2NrKCZkYXRhLT53YXRjaGRvZ19sb2NrKTsKKwlpZiAoIWRhdGEtPmNsaWVudCkgeworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIGxlYXZlOworCX0KKworCWRhdGEtPndhdGNoZG9nX2NvbnRyb2wgfD0gRlNDSE1EX1dET0dfQ09OVFJPTF9UUklHR0VSOworCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoZGF0YS0+Y2xpZW50LCBGU0NITURfUkVHX1dET0dfQ09OVFJPTCwKKwkJCQkJZGF0YS0+d2F0Y2hkb2dfY29udHJvbCk7CitsZWF2ZToKKwltdXRleF91bmxvY2soJmRhdGEtPndhdGNoZG9nX2xvY2spOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgd2F0Y2hkb2dfc3RvcChzdHJ1Y3QgZnNjaG1kX2RhdGEgKmRhdGEpCit7CisJaW50IHJldCA9IDA7CisKKwltdXRleF9sb2NrKCZkYXRhLT53YXRjaGRvZ19sb2NrKTsKKwlpZiAoIWRhdGEtPmNsaWVudCkgeworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIGxlYXZlOworCX0KKworCWRhdGEtPndhdGNoZG9nX2NvbnRyb2wgJj0gfkZTQ0hNRF9XRE9HX0NPTlRST0xfU1RBUlRFRDsKKwkvKiBEb24ndCBzdG9yZSB0aGUgc3RvcCBmbGFnIGluIG91ciB3YXRjaGRvZyBjb250cm9sIHJlZ2lzdGVyIGNvcHksIGFzCisJICAgaXRzIGEgd3JpdGUgb25seSBiaXQgKHJlYWQgYWx3YXlzIHJldHVybnMgMCkgKi8KKwlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGRhdGEtPmNsaWVudCwgRlNDSE1EX1JFR19XRE9HX0NPTlRST0wsCisJCWRhdGEtPndhdGNoZG9nX2NvbnRyb2wgfCBGU0NITURfV0RPR19DT05UUk9MX1NUT1ApOworbGVhdmU6CisJbXV0ZXhfdW5sb2NrKCZkYXRhLT53YXRjaGRvZ19sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHdhdGNoZG9nX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApCit7CisJc3RydWN0IGZzY2htZF9kYXRhICpwb3MsICpkYXRhID0gTlVMTDsKKworCS8qIFdlIGdldCBjYWxsZWQgZnJvbSBkcml2ZXJzL2NoYXIvbWlzYy5jIHdpdGggbWlzY19tdHggaG9sZCwgYW5kIHdlCisJICAgY2FsbCBtaXNjX3JlZ2lzdGVyKCkgZnJvbSBmc2NobWRfcHJvYmUoKSB3aXRoIHdhdGNoZG9nX2RhdGFfbXV0ZXgKKwkgICBob2xkLCBhcyBtaXNjX3JlZ2lzdGVyKCkgdGFrZXMgdGhlIG1pc2NfbXR4IGxvY2ssIHRoaXMgaXMgYSBwb3NzaWJsZQorCSAgIGRlYWRsb2NrLCBzbyB3ZSB1c2UgbXV0ZXhfdHJ5bG9jayBoZXJlLiAqLworCWlmICghbXV0ZXhfdHJ5bG9jaygmd2F0Y2hkb2dfZGF0YV9tdXRleCkpCisJCXJldHVybiAtRVJFU1RBUlRTWVM7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShwb3MsICZ3YXRjaGRvZ19kYXRhX2xpc3QsIGxpc3QpIHsKKwkJaWYgKHBvcy0+d2F0Y2hkb2dfbWlzY2Rldi5taW5vciA9PSBpbWlub3IoaW5vZGUpKSB7CisJCQlkYXRhID0gcG9zOworCQkJYnJlYWs7CisJCX0KKwl9CisJLyogTm90ZSB3ZSBjYW4gbmV2ZXIgbm90IGhhdmUgZm91bmQgZGF0YSwgc28gd2UgZG9uJ3QgY2hlY2sgZm9yIHRoaXMgKi8KKwlrcmVmX2dldCgmZGF0YS0+a3JlZik7CisJbXV0ZXhfdW5sb2NrKCZ3YXRjaGRvZ19kYXRhX211dGV4KTsKKworCWlmICh0ZXN0X2FuZF9zZXRfYml0KDAsICZkYXRhLT53YXRjaGRvZ19pc19vcGVuKSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCS8qIFN0YXJ0IHRoZSB3YXRjaGRvZyAqLworCXdhdGNoZG9nX3RyaWdnZXIoZGF0YSk7CisJZmlscC0+cHJpdmF0ZV9kYXRhID0gZGF0YTsKKworCXJldHVybiBub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxwKTsKK30KKworc3RhdGljIGludCB3YXRjaGRvZ19yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQoreworCXN0cnVjdCBmc2NobWRfZGF0YSAqZGF0YSA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKworCWlmIChkYXRhLT53YXRjaGRvZ19leHBlY3RfY2xvc2UpIHsKKwkJd2F0Y2hkb2dfc3RvcChkYXRhKTsKKwkJZGF0YS0+d2F0Y2hkb2dfZXhwZWN0X2Nsb3NlID0gMDsKKwl9IGVsc2UgeworCQl3YXRjaGRvZ190cmlnZ2VyKGRhdGEpOworCQlkZXZfY3JpdCgmZGF0YS0+Y2xpZW50LT5kZXYsCisJCQkidW5leHBlY3RlZCBjbG9zZSwgbm90IHN0b3BwaW5nIHdhdGNoZG9nIVxuIik7CisJfQorCisJY2xlYXJfYml0KDAsICZkYXRhLT53YXRjaGRvZ19pc19vcGVuKTsKKworCW11dGV4X2xvY2soJndhdGNoZG9nX2RhdGFfbXV0ZXgpOworCWtyZWZfcHV0KCZkYXRhLT5rcmVmLCBmc2NobWRfcmVsZWFzZV9yZXNvdXJjZXMpOworCW11dGV4X3VubG9jaygmd2F0Y2hkb2dfZGF0YV9tdXRleCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNzaXplX3Qgd2F0Y2hkb2dfd3JpdGUoc3RydWN0IGZpbGUgKmZpbHAsIGNvbnN0IGNoYXIgX191c2VyICpidWYsCisJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKm9mZnNldCkKK3sKKwlzaXplX3QgcmV0OworCXN0cnVjdCBmc2NobWRfZGF0YSAqZGF0YSA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKworCWlmIChjb3VudCkgeworCQlpZiAoIW5vd2F5b3V0KSB7CisJCQlzaXplX3QgaTsKKworCQkJLyogQ2xlYXIgaXQgaW4gY2FzZSBpdCB3YXMgc2V0IHdpdGggYSBwcmV2aW91cyB3cml0ZSAqLworCQkJZGF0YS0+d2F0Y2hkb2dfZXhwZWN0X2Nsb3NlID0gMDsKKworCQkJZm9yIChpID0gMDsgaSAhPSBjb3VudDsgaSsrKSB7CisJCQkJY2hhciBjOworCQkJCWlmIChnZXRfdXNlcihjLCBidWYgKyBpKSkKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJaWYgKGMgPT0gJ1YnKQorCQkJCQlkYXRhLT53YXRjaGRvZ19leHBlY3RfY2xvc2UgPSAxOworCQkJfQorCQl9CisJCXJldCA9IHdhdGNoZG9nX3RyaWdnZXIoZGF0YSk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwl9CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgaW50IHdhdGNoZG9nX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0YXRpYyBzdHJ1Y3Qgd2F0Y2hkb2dfaW5mbyBpZGVudCA9IHsKKwkJLm9wdGlvbnMgPSBXRElPRl9LRUVQQUxJVkVQSU5HIHwgV0RJT0ZfU0VUVElNRU9VVCB8CisJCQkJV0RJT0ZfQ0FSRFJFU0VULAorCQkuaWRlbnRpdHkgPSAiRlNDIHdhdGNoZG9nIgorCX07CisJaW50IGksIHJldCA9IDA7CisJc3RydWN0IGZzY2htZF9kYXRhICpkYXRhID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFdESU9DX0dFVFNVUFBPUlQ6CisJCWlkZW50LmZpcm13YXJlX3ZlcnNpb24gPSBkYXRhLT5yZXZpc2lvbjsKKwkJaWYgKCFub3dheW91dCkKKwkJCWlkZW50Lm9wdGlvbnMgfD0gV0RJT0ZfTUFHSUNDTE9TRTsKKwkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsICZpZGVudCwgc2l6ZW9mKGlkZW50KSkpCisJCQlyZXQgPSAtRUZBVUxUOworCQlicmVhazsKKworCWNhc2UgV0RJT0NfR0VUU1RBVFVTOgorCQlyZXQgPSBwdXRfdXNlcigwLCAoaW50IF9fdXNlciAqKWFyZyk7CisJCWJyZWFrOworCisJY2FzZSBXRElPQ19HRVRCT09UU1RBVFVTOgorCQlpZiAoZGF0YS0+d2F0Y2hkb2dfc3RhdGUgJiBGU0NITURfV0RPR19TVEFURV9DQVJEUkVTRVQpCisJCQlyZXQgPSBwdXRfdXNlcihXRElPRl9DQVJEUkVTRVQsIChpbnQgX191c2VyICopYXJnKTsKKwkJZWxzZQorCQkJcmV0ID0gcHV0X3VzZXIoMCwgKGludCBfX3VzZXIgKilhcmcpOworCQlicmVhazsKKworCWNhc2UgV0RJT0NfS0VFUEFMSVZFOgorCQlyZXQgPSB3YXRjaGRvZ190cmlnZ2VyKGRhdGEpOworCQlicmVhazsKKworCWNhc2UgV0RJT0NfR0VUVElNRU9VVDoKKwkJaSA9IHdhdGNoZG9nX2dldF90aW1lb3V0KGRhdGEpOworCQlyZXQgPSBwdXRfdXNlcihpLCAoaW50IF9fdXNlciAqKWFyZyk7CisJCWJyZWFrOworCisJY2FzZSBXRElPQ19TRVRUSU1FT1VUOgorCQlpZiAoZ2V0X3VzZXIoaSwgKGludCBfX3VzZXIgKilhcmcpKSB7CisJCQlyZXQgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKwkJcmV0ID0gd2F0Y2hkb2dfc2V0X3RpbWVvdXQoZGF0YSwgaSk7CisJCWlmIChyZXQgPiAwKQorCQkJcmV0ID0gcHV0X3VzZXIocmV0LCAoaW50IF9fdXNlciAqKWFyZyk7CisJCWJyZWFrOworCisJY2FzZSBXRElPQ19TRVRPUFRJT05TOgorCQlpZiAoZ2V0X3VzZXIoaSwgKGludCBfX3VzZXIgKilhcmcpKSB7CisJCQlyZXQgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoaSAmIFdESU9TX0RJU0FCTEVDQVJEKQorCQkJcmV0ID0gd2F0Y2hkb2dfc3RvcChkYXRhKTsKKwkJZWxzZSBpZiAoaSAmIFdESU9TX0VOQUJMRUNBUkQpCisJCQlyZXQgPSB3YXRjaGRvZ190cmlnZ2VyKGRhdGEpOworCQllbHNlCisJCQlyZXQgPSAtRUlOVkFMOworCisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IC1FTk9UVFk7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgd2F0Y2hkb2dfZm9wcyA9IHsKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkubGxzZWVrID0gbm9fbGxzZWVrLAorCS5vcGVuID0gd2F0Y2hkb2dfb3BlbiwKKwkucmVsZWFzZSA9IHdhdGNoZG9nX3JlbGVhc2UsCisJLndyaXRlID0gd2F0Y2hkb2dfd3JpdGUsCisJLmlvY3RsID0gd2F0Y2hkb2dfaW9jdGwsCit9OworCisKKy8qCisgKiBEZXRlY3QsIHJlZ2lzdGVyLCB1bnJlZ2lzdGVyIGFuZCB1cGRhdGUgZGV2aWNlIGZ1bmN0aW9ucwogICovCiAKIC8qIERNSSBkZWNvZGUgcm91dGluZSB0byByZWFkIHZvbHRhZ2Ugc2NhbGluZyBmYWN0b3JzIGZyb20gc3BlY2lhbCBETUkgdGFibGVzLApAQCAtNjYxLDkgKzk2MSw5IEBACiAJCQljb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCiB7CiAJc3RydWN0IGZzY2htZF9kYXRhICpkYXRhOwotCXU4IHJldmlzaW9uOwogCWNvbnN0IGNoYXIgKiBjb25zdCBuYW1lc1s1XSA9IHsgIlBvc2VpZG9uIiwgIkhlcm1lcyIsICJTY3lsbGEiLAogCQkJCQkiSGVyYWNsZXMiLCAiSGVpbWRhbGwiIH07CisJY29uc3QgaW50IHdhdGNoZG9nX21pbm9yc1tdID0geyBXQVRDSERPR19NSU5PUiwgMjEyLCAyMTMsIDIxNCwgMjE1IH07CiAJaW50IGksIGVycjsKIAllbnVtIGNoaXBzIGtpbmQgPSBpZC0+ZHJpdmVyX2RhdGE7CiAKQEAgLTY3Myw2ICs5NzMsMTMgQEAKIAogCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIGRhdGEpOwogCW11dGV4X2luaXQoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwltdXRleF9pbml0KCZkYXRhLT53YXRjaGRvZ19sb2NrKTsKKwlJTklUX0xJU1RfSEVBRCgmZGF0YS0+bGlzdCk7CisJa3JlZl9pbml0KCZkYXRhLT5rcmVmKTsKKwkvKiBTdG9yZSBjbGllbnQgcG9pbnRlciBpbiBvdXIgZGF0YSBzdHJ1Y3QgZm9yIHdhdGNoZG9nIHVzYWdlCisJICAgKHdoZXJlIHRoZSBjbGllbnQgaXMgZm91bmQgdGhyb3VnaCBhIGRhdGEgcHRyIGluc3RlYWQgb2YgdGhlCisJICAgb3RoZXJ3YXkgYXJvdW5kKSAqLworCWRhdGEtPmNsaWVudCA9IGNsaWVudDsKIAogCWlmIChraW5kID09IGZzY3BvcykgewogCQkvKiBUaGUgUG9zZWlkb24gaGFzIGhhcmR3aXJlZCB0ZW1wIGxpbWl0cywgZmlsbCB0aGVzZQpAQCAtNjgzLDE2ICs5OTAsMjcgQEAKIAl9CiAKIAkvKiBSZWFkIHRoZSBzcGVjaWFsIERNSSB0YWJsZSBmb3IgZnNjaGVyIGFuZCBuZXdlciBjaGlwcyAqLwotCWlmIChraW5kID09IGZzY2hlciB8fCBraW5kID49IGZzY2hyYykgeworCWlmICgoa2luZCA9PSBmc2NoZXIgfHwga2luZCA+PSBmc2NocmMpICYmIGRtaV92cmVmID09IC0xKSB7CiAJCWRtaV93YWxrKGZzY2htZF9kbWlfZGVjb2RlKTsKIAkJaWYgKGRtaV92cmVmID09IC0xKSB7Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HIEZTQ0hNRF9OQU1FCi0JCQkJIjogQ291bGRuJ3QgZ2V0IHZvbHRhZ2Ugc2NhbGluZyBmYWN0b3JzIGZyb20gIgorCQkJZGV2X3dhcm4oJmNsaWVudC0+ZGV2LAorCQkJCSJDb3VsZG4ndCBnZXQgdm9sdGFnZSBzY2FsaW5nIGZhY3RvcnMgZnJvbSAiCiAJCQkJIkJJT1MgRE1JIHRhYmxlLCB1c2luZyBidWlsdGluIGRlZmF1bHRzXG4iKTsKIAkJCWRtaV92cmVmID0gMzM7CiAJCX0KIAl9CiAKKwkvKiBSZWFkIGluIHNvbWUgbmV2ZXIgY2hhbmdpbmcgcmVnaXN0ZXJzICovCisJZGF0YS0+cmV2aXNpb24gPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBGU0NITURfUkVHX1JFVklTSU9OKTsKKwlkYXRhLT5nbG9iYWxfY29udHJvbCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsCisJCQkJCUZTQ0hNRF9SRUdfQ09OVFJPTCk7CisJZGF0YS0+d2F0Y2hkb2dfY29udHJvbCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsCisJCQkJCUZTQ0hNRF9SRUdfV0RPR19DT05UUk9MKTsKKwlkYXRhLT53YXRjaGRvZ19zdGF0ZSA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsCisJCQkJCUZTQ0hNRF9SRUdfV0RPR19TVEFURSk7CisJZGF0YS0+d2F0Y2hkb2dfcHJlc2V0ID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwKKwkJCQkJRlNDSE1EX1JFR19XRE9HX1BSRVNFVCk7CisKIAkvKiBpMmMga2luZCBnb2VzIGZyb20gMS01LCB3ZSB3YW50IGZyb20gMC00IHRvIGFkZHJlc3MgYXJyYXlzICovCiAJZGF0YS0+a2luZCA9IGtpbmQgLSAxOwogCkBAIC03MzUsOSArMTA1Myw0MyBAQAogCQlnb3RvIGV4aXRfZGV0YWNoOwogCX0KIAotCXJldmlzaW9uID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgRlNDSE1EX1JFR19SRVZJU0lPTik7Ci0JcHJpbnRrKEtFUk5fSU5GTyBGU0NITURfTkFNRSAiOiBEZXRlY3RlZCBGU0MgJXMgY2hpcCwgcmV2aXNpb246ICVkXG4iLAotCQluYW1lc1tkYXRhLT5raW5kXSwgKGludCkgcmV2aXNpb24pOworCS8qIFdlIHRha2UgdGhlIGRhdGFfbXV0ZXggbG9jayBlYXJseSBzbyB0aGF0IHdhdGNoZG9nX29wZW4oKSBjYW5ub3QKKwkgICBydW4gd2hlbiBtaXNjX3JlZ2lzdGVyKCkgaGFzIGNvbXBsZXRlZCwgYnV0IHdlJ3ZlIG5vdCB5ZXQgYWRkZWQKKwkgICBvdXIgZGF0YSB0byB0aGUgd2F0Y2hkb2dfZGF0YV9saXN0IChhbmQgc2V0IHRoZSBkZWZhdWx0IHRpbWVvdXQpICovCisJbXV0ZXhfbG9jaygmd2F0Y2hkb2dfZGF0YV9tdXRleCk7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUod2F0Y2hkb2dfbWlub3JzKTsgaSsrKSB7CisJCS8qIFJlZ2lzdGVyIG91ciB3YXRjaGRvZyBwYXJ0ICovCisJCXNucHJpbnRmKGRhdGEtPndhdGNoZG9nX25hbWUsIHNpemVvZihkYXRhLT53YXRjaGRvZ19uYW1lKSwKKwkJCSJ3YXRjaGRvZyVjIiwgKGkgPT0gMCkgPyAnXDAnIDogKCcwJyArIGkpKTsKKwkJZGF0YS0+d2F0Y2hkb2dfbWlzY2Rldi5uYW1lID0gZGF0YS0+d2F0Y2hkb2dfbmFtZTsKKwkJZGF0YS0+d2F0Y2hkb2dfbWlzY2Rldi5mb3BzID0gJndhdGNoZG9nX2ZvcHM7CisJCWRhdGEtPndhdGNoZG9nX21pc2NkZXYubWlub3IgPSB3YXRjaGRvZ19taW5vcnNbaV07CisJCWVyciA9IG1pc2NfcmVnaXN0ZXIoJmRhdGEtPndhdGNoZG9nX21pc2NkZXYpOworCQlpZiAoZXJyID09IC1FQlVTWSkKKwkJCWNvbnRpbnVlOworCQlpZiAoZXJyKSB7CisJCQlkYXRhLT53YXRjaGRvZ19taXNjZGV2Lm1pbm9yID0gMDsKKwkJCWRldl9lcnIoJmNsaWVudC0+ZGV2LAorCQkJCSJSZWdpc3RlcmluZyB3YXRjaGRvZyBjaGFyZGV2OiAlZFxuIiwgZXJyKTsKKwkJCWJyZWFrOworCQl9CisKKwkJbGlzdF9hZGQoJmRhdGEtPmxpc3QsICZ3YXRjaGRvZ19kYXRhX2xpc3QpOworCQl3YXRjaGRvZ19zZXRfdGltZW91dChkYXRhLCA2MCk7CisJCWRldl9pbmZvKCZjbGllbnQtPmRldiwKKwkJCSJSZWdpc3RlcmVkIHdhdGNoZG9nIGNoYXJkZXYgbWFqb3IgMTAsIG1pbm9yOiAlZFxuIiwKKwkJCXdhdGNoZG9nX21pbm9yc1tpXSk7CisJCWJyZWFrOworCX0KKwlpZiAoaSA9PSBBUlJBWV9TSVpFKHdhdGNoZG9nX21pbm9ycykpIHsKKwkJZGF0YS0+d2F0Y2hkb2dfbWlzY2Rldi5taW5vciA9IDA7CisJCWRldl93YXJuKCZjbGllbnQtPmRldiwgIkNvdWxkbid0IHJlZ2lzdGVyIHdhdGNoZG9nIGNoYXJkZXYgIgorCQkJIihkdWUgdG8gbm8gZnJlZSBtaW5vcilcbiIpOworCX0KKwltdXRleF91bmxvY2soJndhdGNoZG9nX2RhdGFfbXV0ZXgpOworCisJZGV2X2luZm8oJmNsaWVudC0+ZGV2LCAiRGV0ZWN0ZWQgRlNDICVzIGNoaXAsIHJldmlzaW9uOiAlZFxuIiwKKwkJbmFtZXNbZGF0YS0+a2luZF0sIChpbnQpIGRhdGEtPnJldmlzaW9uKTsKIAogCXJldHVybiAwOwogCkBAIC03NTEsNiArMTEwMywyNCBAQAogCXN0cnVjdCBmc2NobWRfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwogCWludCBpOwogCisJLyogVW5yZWdpc3RlciB0aGUgd2F0Y2hkb2cgKGlmIHJlZ2lzdGVyZWQpICovCisJaWYgKGRhdGEtPndhdGNoZG9nX21pc2NkZXYubWlub3IpIHsKKwkJbWlzY19kZXJlZ2lzdGVyKCZkYXRhLT53YXRjaGRvZ19taXNjZGV2KTsKKwkJaWYgKGRhdGEtPndhdGNoZG9nX2lzX29wZW4pIHsKKwkJCWRldl93YXJuKCZjbGllbnQtPmRldiwKKwkJCQkiaTJjIGNsaWVudCBkZXRhY2hlZCB3aXRoIHdhdGNoZG9nIG9wZW4hICIKKwkJCQkiU3RvcHBpbmcgd2F0Y2hkb2cuXG4iKTsKKwkJCXdhdGNoZG9nX3N0b3AoZGF0YSk7CisJCX0KKwkJbXV0ZXhfbG9jaygmd2F0Y2hkb2dfZGF0YV9tdXRleCk7CisJCWxpc3RfZGVsKCZkYXRhLT5saXN0KTsKKwkJbXV0ZXhfdW5sb2NrKCZ3YXRjaGRvZ19kYXRhX211dGV4KTsKKwkJLyogVGVsbCB0aGUgd2F0Y2hkb2cgY29kZSB0aGUgY2xpZW50IGlzIGdvbmUgKi8KKwkJbXV0ZXhfbG9jaygmZGF0YS0+d2F0Y2hkb2dfbG9jayk7CisJCWRhdGEtPmNsaWVudCA9IE5VTEw7CisJCW11dGV4X3VubG9jaygmZGF0YS0+d2F0Y2hkb2dfbG9jayk7CisJfQorCiAJLyogQ2hlY2sgaWYgcmVnaXN0ZXJlZCBpbiBjYXNlIHdlJ3JlIGNhbGxlZCBmcm9tIGZzY2htZF9kZXRlY3QKIAkgICB0byBjbGVhbnVwIGFmdGVyIGFuIGVycm9yICovCiAJaWYgKGRhdGEtPmh3bW9uX2RldikKQEAgLTc2NSw3ICsxMTM1LDEwIEBACiAJCWRldmljZV9yZW1vdmVfZmlsZSgmY2xpZW50LT5kZXYsCiAJCQkJCSZmc2NobWRfZmFuX2F0dHJbaV0uZGV2X2F0dHIpOwogCi0Ja2ZyZWUoZGF0YSk7CisJbXV0ZXhfbG9jaygmd2F0Y2hkb2dfZGF0YV9tdXRleCk7CisJa3JlZl9wdXQoJmRhdGEtPmtyZWYsIGZzY2htZF9yZWxlYXNlX3Jlc291cmNlcyk7CisJbXV0ZXhfdW5sb2NrKCZ3YXRjaGRvZ19kYXRhX211dGV4KTsKKwogCXJldHVybiAwOwogfQogCkBAIC03OTgsNyArMTE3MSw3IEBACiAJCQkJCWRhdGEtPnRlbXBfYWN0W2ldIDwgZGF0YS0+dGVtcF9tYXhbaV0pCiAJCQkJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsCiAJCQkJCUZTQ0hNRF9SRUdfVEVNUF9TVEFURVtkYXRhLT5raW5kXVtpXSwKLQkJCQkJRlNDSE1EX1RFTVBfQUxFUlRfTUFTSyk7CisJCQkJCUZTQ0hNRF9URU1QX0FMRVJUKTsKIAkJfQogCiAJCWZvciAoaSA9IDA7IGkgPCBGU0NITURfTk9fRkFOX1NFTlNPUlNbZGF0YS0+a2luZF07IGkrKykgewpAQCAtODE2LDI4ICsxMTg5LDE3IEBACiAJCQkJCUZTQ0hNRF9SRUdfRkFOX01JTltkYXRhLT5raW5kXVtpXSk7CiAKIAkJCS8qIHJlc2V0IGZhbiBzdGF0dXMgaWYgc3BlZWQgaXMgYmFjayB0byA+IDAgKi8KLQkJCWlmICgoZGF0YS0+ZmFuX3N0YXR1c1tpXSAmIEZTQ0hNRF9GQU5fQUxBUk1fTUFTSykgJiYKKwkJCWlmICgoZGF0YS0+ZmFuX3N0YXR1c1tpXSAmIEZTQ0hNRF9GQU5fQUxBUk0pICYmCiAJCQkJCWRhdGEtPmZhbl9hY3RbaV0pCiAJCQkJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsCiAJCQkJCUZTQ0hNRF9SRUdfRkFOX1NUQVRFW2RhdGEtPmtpbmRdW2ldLAotCQkJCQlGU0NITURfRkFOX0FMQVJNX01BU0spOworCQkJCQlGU0NITURfRkFOX0FMQVJNKTsKIAkJfQogCiAJCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspCiAJCQlkYXRhLT52b2x0W2ldID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwKIAkJCQkJCUZTQ0hNRF9SRUdfVk9MVFtpXSk7CiAKLQkJZGF0YS0+Z2xvYmFsX2NvbnRyb2wgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LAotCQkJCQkJRlNDSE1EX1JFR19DT05UUk9MKTsKLQotCQkvKiBUbyBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgZnV0dXJlCi0JCWRhdGEtPndhdGNoZG9nWzBdID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwKLQkJCQkJCUZTQ0hNRF9SRUdfV0RPR19QUkVTRVQpOwotCQlkYXRhLT53YXRjaGRvZ1sxXSA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsCi0JCQkJCQlGU0NITURfUkVHX1dET0dfU1RBVEUpOwotCQlkYXRhLT53YXRjaGRvZ1syXSA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsCi0JCQkJCQlGU0NITURfUkVHX1dET0dfQ09OVFJPTCk7ICovCi0KIAkJZGF0YS0+bGFzdF91cGRhdGVkID0gamlmZmllczsKIAkJZGF0YS0+dmFsaWQgPSAxOwogCX0KQEAgLTg1Nyw3ICsxMjE5LDcgQEAKIAlpMmNfZGVsX2RyaXZlcigmZnNjaG1kX2RyaXZlcik7CiB9CiAKLU1PRFVMRV9BVVRIT1IoIkhhbnMgZGUgR29lZGUgPGoudy5yLmRlZ29lZGVAaGhzLm5sPiIpOworTU9EVUxFX0FVVEhPUigiSGFucyBkZSBHb2VkZSA8aGRlZ29lZGVAcmVkaGF0LmNvbT4iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiRlNDIFBvc2VpZG9uLCBIZXJtZXMsIFNjeWxsYSwgSGVyYWNsZXMgYW5kICIKIAkJCSJIZWltZGFsbCBkcml2ZXIiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vaHdtb24uYyBiL2RyaXZlcnMvaHdtb24vaHdtb24uYwppbmRleCAwNzZhNTljLi5lMTVjM2U3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2h3bW9uLmMKKysrIGIvZHJpdmVycy9od21vbi9od21vbi5jCkBAIC03Niw3ICs3Niw3IEBACiB7CiAJaW50IGlkOwogCi0JaWYgKGxpa2VseShzc2NhbmYoZGV2LT5idXNfaWQsIEhXTU9OX0lEX0ZPUk1BVCwgJmlkKSA9PSAxKSkgeworCWlmIChsaWtlbHkoc3NjYW5mKGRldl9uYW1lKGRldiksIEhXTU9OX0lEX0ZPUk1BVCwgJmlkKSA9PSAxKSkgewogCQlkZXZpY2VfdW5yZWdpc3RlcihkZXYpOwogCQlzcGluX2xvY2soJmlkcl9sb2NrKTsKIAkJaWRyX3JlbW92ZSgmaHdtb25faWRyLCBpZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2k1a19hbWIuYyBiL2RyaXZlcnMvaHdtb24vaTVrX2FtYi5jCmluZGV4IDJlZGU5MzguLjI3ZDdmNzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vaTVrX2FtYi5jCisrKyBiL2RyaXZlcnMvaHdtb24vaTVrX2FtYi5jCkBAIC00OTAsNiArNDkwLDEzIEBACiAJMAogfTsKIAorc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGk1a19hbWJfaWRzW10gX19kZXZpbml0ZGF0YSA9IHsKKwl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9JTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF81MDAwX0VSUikgfSwKKwl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9JTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF81NDAwX0VSUikgfSwKKwl7IDAsIH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgaTVrX2FtYl9pZHMpOworCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBpNWtfYW1iX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IGk1a19hbWJfZGF0YSAqZGF0YTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vaWJtcGV4LmMgYi9kcml2ZXJzL2h3bW9uL2libXBleC5jCmluZGV4IDUzN2Q5ZmIuLmEzNjM2MzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vaWJtcGV4LmMKKysrIGIvZHJpdmVycy9od21vbi9pYm1wZXguYwpAQCAtNDAsNyArNDAsNyBAQAogCiBzdGF0aWMgaW5saW5lIHUxNiBleHRyYWN0X3ZhbHVlKGNvbnN0IGNoYXIgKmRhdGEsIGludCBvZmZzZXQpCiB7Ci0JcmV0dXJuIGJlMTZfdG9fY3B1cCgodTE2ICopJmRhdGFbb2Zmc2V0XSk7CisJcmV0dXJuIGJlMTZfdG9fY3B1cCgoX19iZTE2ICopJmRhdGFbb2Zmc2V0XSk7CiB9CiAKICNkZWZpbmUgVEVNUF9TRU5TT1IJCTEKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vaXQ4Ny5jIGIvZHJpdmVycy9od21vbi9pdDg3LmMKaW5kZXggYjc0Yzk1Ny4uOTVhOTljNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9pdDg3LmMKKysrIGIvZHJpdmVycy9od21vbi9pdDg3LmMKQEAgLTE0LDYgKzE0LDcgQEAKICAgICAgICAgICAgICAgSVQ4NzEyRiAgU3VwZXIgSS9PIGNoaXAgdy9MUEMgaW50ZXJmYWNlCiAgICAgICAgICAgICAgIElUODcxNkYgIFN1cGVyIEkvTyBjaGlwIHcvTFBDIGludGVyZmFjZQogICAgICAgICAgICAgICBJVDg3MThGICBTdXBlciBJL08gY2hpcCB3L0xQQyBpbnRlcmZhY2UKKyAgICAgICAgICAgICAgSVQ4NzIwRiAgU3VwZXIgSS9PIGNoaXAgdy9MUEMgaW50ZXJmYWNlCiAgICAgICAgICAgICAgIElUODcyNkYgIFN1cGVyIEkvTyBjaGlwIHcvTFBDIGludGVyZmFjZQogICAgICAgICAgICAgICBTaXM5NTAgICBBIGNsb25lIG9mIHRoZSBJVDg3MDVGCiAKQEAgLTQ4LDExICs0OSwxMiBAQAogI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvZG1pLmg+CisjaW5jbHVkZSA8bGludXgvYWNwaS5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogCiAjZGVmaW5lIERSVk5BTUUgIml0ODciCiAKLWVudW0gY2hpcHMgeyBpdDg3LCBpdDg3MTIsIGl0ODcxNiwgaXQ4NzE4IH07CitlbnVtIGNoaXBzIHsgaXQ4NywgaXQ4NzEyLCBpdDg3MTYsIGl0ODcxOCwgaXQ4NzIwIH07CiAKIHN0YXRpYyB1bnNpZ25lZCBzaG9ydCBmb3JjZV9pZDsKIG1vZHVsZV9wYXJhbShmb3JjZV9pZCwgdXNob3J0LCAwKTsKQEAgLTY0LDcgKzY2LDEwIEBACiAjZGVmaW5lCURFVgkweDA3CS8qIFJlZ2lzdGVyOiBMb2dpY2FsIGRldmljZSBzZWxlY3QgKi8KICNkZWZpbmUJVkFMCTB4MmYJLyogVGhlIHZhbHVlIHRvIHJlYWQvd3JpdGUgKi8KICNkZWZpbmUgUE1FCTB4MDQJLyogVGhlIGRldmljZSB3aXRoIHRoZSBmYW4gcmVnaXN0ZXJzIGluIGl0ICovCi0jZGVmaW5lIEdQSU8JMHgwNwkvKiBUaGUgZGV2aWNlIHdpdGggdGhlIElUODcxOEYgVklEIHZhbHVlIGluIGl0ICovCisKKy8qIFRoZSBkZXZpY2Ugd2l0aCB0aGUgSVQ4NzE4Ri9JVDg3MjBGIFZJRCB2YWx1ZSBpbiBpdCAqLworI2RlZmluZSBHUElPCTB4MDcKKwogI2RlZmluZQlERVZJRAkweDIwCS8qIFJlZ2lzdGVyOiBEZXZpY2UgSUQgKi8KICNkZWZpbmUJREVWUkVWCTB4MjIJLyogUmVnaXN0ZXI6IERldmljZSBSZXZpc2lvbiAqLwogCkBAIC0xMTMsNiArMTE4LDcgQEAKICNkZWZpbmUgSVQ4NzA1Rl9ERVZJRCAweDg3MDUKICNkZWZpbmUgSVQ4NzE2Rl9ERVZJRCAweDg3MTYKICNkZWZpbmUgSVQ4NzE4Rl9ERVZJRCAweDg3MTgKKyNkZWZpbmUgSVQ4NzIwRl9ERVZJRCAweDg3MjAKICNkZWZpbmUgSVQ4NzI2Rl9ERVZJRCAweDg3MjYKICNkZWZpbmUgSVQ4N19BQ1RfUkVHICAweDMwCiAjZGVmaW5lIElUODdfQkFTRV9SRUcgMHg2MApAQCAtMTUwLDggKzE1Niw4IEBACiAjZGVmaW5lIElUODdfUkVHX0FMQVJNMiAgICAgICAgMHgwMgogI2RlZmluZSBJVDg3X1JFR19BTEFSTTMgICAgICAgIDB4MDMKIAotLyogVGhlIElUODcxOEYgaGFzIHRoZSBWSUQgdmFsdWUgaW4gYSBkaWZmZXJlbnQgcmVnaXN0ZXIsIGluIFN1cGVyLUkvTwotICAgY29uZmlndXJhdGlvbiBzcGFjZS4gKi8KKy8qIFRoZSBJVDg3MThGIGFuZCBJVDg3MjBGIGhhdmUgdGhlIFZJRCB2YWx1ZSBpbiBhIGRpZmZlcmVudCByZWdpc3RlciwgaW4KKyAgIFN1cGVyLUkvTyBjb25maWd1cmF0aW9uIHNwYWNlLiAqLwogI2RlZmluZSBJVDg3X1JFR19WSUQgICAgICAgICAgIDB4MGEKIC8qIFRoZSBJVDg3MDVGIGFuZCBJVDg3MTJGIGVhcmxpZXIgdGhhbiByZXZpc2lvbiAweDA4IHVzZSByZWdpc3RlciAweDBiCiAgICBmb3IgZmFuIGRpdmlzb3JzLiBMYXRlciBJVDg3MTJGIHJldmlzaW9ucyBtdXN0IHVzZSAxNi1iaXQgdGFjaG9tZXRlcgpAQCAtMjgyLDcgKzI4OCw4IEBACiAJcmV0dXJuIChkYXRhLT50eXBlID09IGl0ODcgJiYgZGF0YS0+cmV2aXNpb24gPj0gMHgwMykKIAkgICAgfHwgKGRhdGEtPnR5cGUgPT0gaXQ4NzEyICYmIGRhdGEtPnJldmlzaW9uID49IDB4MDgpCiAJICAgIHx8IGRhdGEtPnR5cGUgPT0gaXQ4NzE2Ci0JICAgIHx8IGRhdGEtPnR5cGUgPT0gaXQ4NzE4OworCSAgICB8fCBkYXRhLT50eXBlID09IGl0ODcxOAorCSAgICB8fCBkYXRhLT50eXBlID09IGl0ODcyMDsKIH0KIAogc3RhdGljIGludCBpdDg3X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpOwpAQCAtOTkyLDYgKzk5OSw5IEBACiAJY2FzZSBJVDg3MThGX0RFVklEOgogCQlzaW9fZGF0YS0+dHlwZSA9IGl0ODcxODsKIAkJYnJlYWs7CisJY2FzZSBJVDg3MjBGX0RFVklEOgorCQlzaW9fZGF0YS0+dHlwZSA9IGl0ODcyMDsKKwkJYnJlYWs7CiAJY2FzZSAweGZmZmY6CS8qIE5vIGRldmljZSBhdCBhbGwgKi8KIAkJZ290byBleGl0OwogCWRlZmF1bHQ6CkBAIC0xMDIyLDcgKzEwMzIsOCBAQAogCQlpbnQgcmVnOwogCiAJCXN1cGVyaW9fc2VsZWN0KEdQSU8pOwotCQlpZiAoY2hpcF90eXBlID09IGl0ODcxOCkKKwkJaWYgKChjaGlwX3R5cGUgPT0gaXQ4NzE4KSB8fAorCQkgICAgKGNoaXBfdHlwZSA9PSBpdDg3MjApKQogCQkJc2lvX2RhdGEtPnZpZF92YWx1ZSA9IHN1cGVyaW9faW5iKElUODdfU0lPX1ZJRF9SRUcpOwogCiAJCXJlZyA9IHN1cGVyaW9faW5iKElUODdfU0lPX1BJTlgyX1JFRyk7CkBAIC0xMDY4LDYgKzEwNzksNyBAQAogCQkiaXQ4NzEyIiwKIAkJIml0ODcxNiIsCiAJCSJpdDg3MTgiLAorCQkiaXQ4NzIwIiwKIAl9OwogCiAJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfSU8sIDApOwpAQCAtMTIyNiw3ICsxMjM4LDcgQEAKIAl9CiAKIAlpZiAoZGF0YS0+dHlwZSA9PSBpdDg3MTIgfHwgZGF0YS0+dHlwZSA9PSBpdDg3MTYKLQkgfHwgZGF0YS0+dHlwZSA9PSBpdDg3MTgpIHsKKwkgfHwgZGF0YS0+dHlwZSA9PSBpdDg3MTggfHwgZGF0YS0+dHlwZSA9PSBpdDg3MjApIHsKIAkJZGF0YS0+dnJtID0gdmlkX3doaWNoX3ZybSgpOwogCQkvKiBWSUQgcmVhZGluZyBmcm9tIFN1cGVyLUkvTyBjb25maWcgc3BhY2UgaWYgYXZhaWxhYmxlICovCiAJCWRhdGEtPnZpZCA9IHNpb19kYXRhLT52aWRfdmFsdWU7CkBAIC0xMzc0LDcgKzEzODYsNyBAQAogCQkJaXQ4N193cml0ZV92YWx1ZShkYXRhLCBJVDg3X1JFR19URU1QX0hJR0goaSksIDEyNyk7CiAJfQogCi0JLyogQ2hlY2sgaWYgdGVtcGVyYXR1cmUgY2hhbm5uZWxzIGFyZSByZXNldCBtYW51YWxseSBvciBieSBzb21lIHJlYXNvbiAqLworCS8qIENoZWNrIGlmIHRlbXBlcmF0dXJlIGNoYW5uZWxzIGFyZSByZXNldCBtYW51YWxseSBvciBieSBzb21lIHJlYXNvbiAqLwogCXRtcCA9IGl0ODdfcmVhZF92YWx1ZShkYXRhLCBJVDg3X1JFR19URU1QX0VOQUJMRSk7CiAJaWYgKCh0bXAgJiAweDNmKSA9PSAwKSB7CiAJCS8qIFRlbXAxLFRlbXAzPXRoZXJtaXN0b3I7IFRlbXAyPXRoZXJtYWwgZGlvZGUgKi8KQEAgLTE1MTMsNyArMTUyNSw4IEBACiAKIAkJZGF0YS0+c2Vuc29yID0gaXQ4N19yZWFkX3ZhbHVlKGRhdGEsIElUODdfUkVHX1RFTVBfRU5BQkxFKTsKIAkJLyogVGhlIDg3MDUgZG9lcyBub3QgaGF2ZSBWSUQgY2FwYWJpbGl0eS4KLQkJICAgVGhlIDg3MTggZG9lcyBub3QgdXNlIElUODdfUkVHX1ZJRCBmb3IgdGhlIHNhbWUgcHVycG9zZS4gKi8KKwkJICAgVGhlIDg3MTggYW5kIHRoZSA4NzIwIGRvbid0IHVzZSBJVDg3X1JFR19WSUQgZm9yIHRoZQorCQkgICBzYW1lIHB1cnBvc2UuICovCiAJCWlmIChkYXRhLT50eXBlID09IGl0ODcxMiB8fCBkYXRhLT50eXBlID09IGl0ODcxNikgewogCQkJZGF0YS0+dmlkID0gaXQ4N19yZWFkX3ZhbHVlKGRhdGEsIElUODdfUkVHX1ZJRCk7CiAJCQkvKiBUaGUgb2xkZXIgSVQ4NzEyRiByZXZpc2lvbnMgaGFkIG9ubHkgNSBWSUQgcGlucywKQEAgLTE1NDAsNiArMTU1MywxMCBAQAogCX07CiAJaW50IGVycjsKIAorCWVyciA9IGFjcGlfY2hlY2tfcmVzb3VyY2VfY29uZmxpY3QoJnJlcyk7CisJaWYgKGVycikKKwkJZ290byBleGl0OworCiAJcGRldiA9IHBsYXRmb3JtX2RldmljZV9hbGxvYyhEUlZOQU1FLCBhZGRyZXNzKTsKIAlpZiAoIXBkZXYpIHsKIAkJZXJyID0gLUVOT01FTTsKQEAgLTE2MDgsNyArMTYyNSw3IEBACiAKIE1PRFVMRV9BVVRIT1IoIkNocmlzIEdhdXRocm9uLCAiCiAJICAgICAgIkplYW4gRGVsdmFyZSA8a2hhbGlAbGludXgtZnIub3JnPiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJJVDg3MDVGLzg3MTJGLzg3MTZGLzg3MThGLzg3MjZGLCBTaVM5NTAgZHJpdmVyIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIklUODcwNUYvODcxMkYvODcxNkYvODcxOEYvODcyMEYvODcyNkYsIFNpUzk1MCBkcml2ZXIiKTsKIG1vZHVsZV9wYXJhbSh1cGRhdGVfdmJhdCwgYm9vbCwgMCk7CiBNT0RVTEVfUEFSTV9ERVNDKHVwZGF0ZV92YmF0LCAiVXBkYXRlIHZiYXQgaWYgc2V0IGVsc2UgcmV0dXJuIHBvd2VydXAgdmFsdWUiKTsKIG1vZHVsZV9wYXJhbShmaXhfcHdtX3BvbGFyaXR5LCBib29sLCAwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vbG03MC5jIGIvZHJpdmVycy9od21vbi9sbTcwLmMKaW5kZXggZDQzNWYwMC4uYWU2MjA0ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9sbTcwLmMKKysrIGIvZHJpdmVycy9od21vbi9sbTcwLmMKQEAgLTM3LDkgKzM3LDEzIEBACiAKICNkZWZpbmUgRFJWTkFNRQkJImxtNzAiCiAKKyNkZWZpbmUgTE03MF9DSElQX0xNNzAJCTAJLyogb3JpZ2luYWwgTlMgTE03MCAqLworI2RlZmluZSBMTTcwX0NISVBfVE1QMTIxCTEJLyogVEkgVE1QMTIxL1RNUDEyMyAqLworCiBzdHJ1Y3QgbG03MCB7CiAJc3RydWN0IGRldmljZSAqaHdtb25fZGV2OwogCXN0cnVjdCBtdXRleCBsb2NrOworCXVuc2lnbmVkIGludCBjaGlwOwogfTsKIAogLyogc3lzZnMgaG9vayBmdW5jdGlvbiAqLwpAQCAtNDcsNyArNTEsNyBAQAogCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewogCXN0cnVjdCBzcGlfZGV2aWNlICpzcGkgPSB0b19zcGlfZGV2aWNlKGRldik7Ci0JaW50IHN0YXR1cywgdmFsOworCWludCBzdGF0dXMsIHZhbCA9IDA7CiAJdTggcnhidWZbMl07CiAJczE2IHJhdz0wOwogCXN0cnVjdCBsbTcwICpwX2xtNzAgPSBkZXZfZ2V0X2RydmRhdGEoJnNwaS0+ZGV2KTsKQEAgLTY1LDEyICs2OSwxMiBAQAogCQkic3BpX3dyaXRlX3RoZW5fcmVhZCBmYWlsZWQgd2l0aCBzdGF0dXMgJWRcbiIsIHN0YXR1cyk7CiAJCWdvdG8gb3V0OwogCX0KLQlkZXZfZGJnKGRldiwgInJ4YnVmWzFdIDogMHgleCByeGJ1ZlswXSA6IDB4JXhcbiIsIHJ4YnVmWzFdLCByeGJ1ZlswXSk7Ci0KLQlyYXcgPSAocnhidWZbMV0gPDwgOCkgKyByeGJ1ZlswXTsKLQlkZXZfZGJnKGRldiwgInJhdz0weCV4XG4iLCByYXcpOworCXJhdyA9IChyeGJ1ZlswXSA8PCA4KSArIHJ4YnVmWzFdOworCWRldl9kYmcoZGV2LCAicnhidWZbMF0gOiAweCUwMnggcnhidWZbMV0gOiAweCUwMnggcmF3PTB4JTA0eFxuIiwKKwkJcnhidWZbMF0sIHJ4YnVmWzFdLCByYXcpOwogCiAJLyoKKwkgKiBMTTcwOgogCSAqIFRoZSAicmF3IiB0ZW1wZXJhdHVyZSByZWFkIGludG8gcnhidWZbXSBpcyBhIDE2LWJpdCBzaWduZWQgMidzCiAJICogY29tcGxlbWVudCB2YWx1ZS4gT25seSB0aGUgTVNCIDExIGJpdHMgKDEgc2lnbiArIDEwIHRlbXBlcmF0dXJlCiAJICogYml0cykgYXJlIG1lYW5pbmdmdWw7IHRoZSBMU0IgNSBiaXRzIGFyZSB0byBiZSBkaXNjYXJkZWQuCkBAIC04MCw4ICs4NCwyMSBAQAogCSAqIGJ5IDAuMjUuIEFsc28gbXVsdGlwbHkgYnkgMTAwMCB0byByZXByZXNlbnQgaW4gbWlsbGlkZWdyZWVzCiAJICogQ2Vsc2l1cy4KIAkgKiBTbyBpdCdzIGVxdWl2YWxlbnQgdG8gbXVsdGlwbHlpbmcgYnkgMC4yNSAqIDEwMDAgPSAyNTAuCisJICoKKwkgKiBUTVAxMjEvVE1QMTIzOgorCSAqIDEzIGJpdHMgb2YgMidzIGNvbXBsZW1lbnQgZGF0YSwgZGlzY2FyZCBMU0IgMyBiaXRzLAorCSAqIHJlc29sdXRpb24gMC4wNjI1IGRlZ3JlZXMgY2Vsc2l1cy4KIAkgKi8KLQl2YWwgPSAoKGludClyYXcvMzIpICogMjUwOworCXN3aXRjaCAocF9sbTcwLT5jaGlwKSB7CisJY2FzZSBMTTcwX0NISVBfTE03MDoKKwkJdmFsID0gKChpbnQpcmF3IC8gMzIpICogMjUwOworCQlicmVhazsKKworCWNhc2UgTE03MF9DSElQX1RNUDEyMToKKwkJdmFsID0gKChpbnQpcmF3IC8gOCkgKiA2MjUgLyAxMDsKKwkJYnJlYWs7CisJfQorCiAJc3RhdHVzID0gc3ByaW50ZihidWYsICIlZFxuIiwgdmFsKTsgLyogbWlsbGlkZWdyZWVzIENlbHNpdXMgKi8KIG91dDoKIAltdXRleF91bmxvY2soJnBfbG03MC0+bG9jayk7CkBAIC05MywyNyArMTEwLDM5IEBACiBzdGF0aWMgc3NpemVfdCBsbTcwX3Nob3dfbmFtZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlCiAJCQkgICAgICAqZGV2YXR0ciwgY2hhciAqYnVmKQogewotCXJldHVybiBzcHJpbnRmKGJ1ZiwgImxtNzBcbiIpOworCXN0cnVjdCBsbTcwICpwX2xtNzAgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlpbnQgcmV0OworCisJc3dpdGNoIChwX2xtNzAtPmNoaXApIHsKKwljYXNlIExNNzBfQ0hJUF9MTTcwOgorCQlyZXQgPSBzcHJpbnRmKGJ1ZiwgImxtNzBcbiIpOworCQlicmVhazsKKwljYXNlIExNNzBfQ0hJUF9UTVAxMjE6CisJCXJldCA9IHNwcmludGYoYnVmLCAidG1wMTIxXG4iKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVJTlZBTDsKKwl9CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIERFVklDRV9BVFRSKG5hbWUsIFNfSVJVR08sIGxtNzBfc2hvd19uYW1lLCBOVUxMKTsKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAotc3RhdGljIGludCBfX2RldmluaXQgbG03MF9wcm9iZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQorc3RhdGljIGludCBfX2RldmluaXQgY29tbW9uX3Byb2JlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIGludCBjaGlwKQogewogCXN0cnVjdCBsbTcwICpwX2xtNzA7CiAJaW50IHN0YXR1czsKIAotCS8qIHNpZ25hbGluZyBpcyBTUElfTU9ERV8wIG9uIGEgMy13aXJlIGxpbmsgKHNoYXJlZCBTSS9TTykgKi8KLQlpZiAoKHNwaS0+bW9kZSAmIChTUElfQ1BPTHxTUElfQ1BIQSkpIHx8ICEoc3BpLT5tb2RlICYgU1BJXzNXSVJFKSkKLQkJcmV0dXJuIC1FSU5WQUw7CisJLyogTk9URTogIHdlIGFzc3VtZSA4LWJpdCB3b3JkcywgYW5kIGNvbnZlcnQgdG8gMTYgYml0cyBtYW51YWxseSAqLwogCiAJcF9sbTcwID0ga3phbGxvYyhzaXplb2YgKnBfbG03MCwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFwX2xtNzApCiAJCXJldHVybiAtRU5PTUVNOwogCiAJbXV0ZXhfaW5pdCgmcF9sbTcwLT5sb2NrKTsKKwlwX2xtNzAtPmNoaXAgPSBjaGlwOwogCiAJLyogc3lzZnMgaG9vayAqLwogCXBfbG03MC0+aHdtb25fZGV2ID0gaHdtb25fZGV2aWNlX3JlZ2lzdGVyKCZzcGktPmRldik7CkBAIC0xNDEsNiArMTcwLDI0IEBACiAJcmV0dXJuIHN0YXR1czsKIH0KIAorc3RhdGljIGludCBfX2RldmluaXQgbG03MF9wcm9iZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCS8qIHNpZ25hbGluZyBpcyBTUElfTU9ERV8wIG9uIGEgMy13aXJlIGxpbmsgKHNoYXJlZCBTSS9TTykgKi8KKwlpZiAoKHNwaS0+bW9kZSAmIChTUElfQ1BPTCB8IFNQSV9DUEhBKSkgfHwgIShzcGktPm1vZGUgJiBTUElfM1dJUkUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiBjb21tb25fcHJvYmUoc3BpLCBMTTcwX0NISVBfTE03MCk7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHRtcDEyMV9wcm9iZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCS8qIHNpZ25hbGluZyBpcyBTUElfTU9ERV8wIHdpdGggb25seSBNSVNPIGNvbm5lY3RlZCAqLworCWlmIChzcGktPm1vZGUgJiAoU1BJX0NQT0wgfCBTUElfQ1BIQSkpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIGNvbW1vbl9wcm9iZShzcGksIExNNzBfQ0hJUF9UTVAxMjEpOworfQorCiBzdGF0aWMgaW50IF9fZGV2ZXhpdCBsbTcwX3JlbW92ZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQogewogCXN0cnVjdCBsbTcwICpwX2xtNzAgPSBkZXZfZ2V0X2RydmRhdGEoJnNwaS0+ZGV2KTsKQEAgLTE1NCw2ICsyMDEsMTUgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHN0cnVjdCBzcGlfZHJpdmVyIHRtcDEyMV9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUJPSAidG1wMTIxIiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUJPSB0bXAxMjFfcHJvYmUsCisJLnJlbW92ZQk9IF9fZGV2ZXhpdF9wKGxtNzBfcmVtb3ZlKSwKK307CisKIHN0YXRpYyBzdHJ1Y3Qgc3BpX2RyaXZlciBsbTcwX2RyaXZlciA9IHsKIAkuZHJpdmVyID0gewogCQkubmFtZQk9ICJsbTcwIiwKQEAgLTE2NSwxNyArMjIxLDI2IEBACiAKIHN0YXRpYyBpbnQgX19pbml0IGluaXRfbG03MCh2b2lkKQogewotCXJldHVybiBzcGlfcmVnaXN0ZXJfZHJpdmVyKCZsbTcwX2RyaXZlcik7CisJaW50IHJldCA9IHNwaV9yZWdpc3Rlcl9kcml2ZXIoJmxtNzBfZHJpdmVyKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gc3BpX3JlZ2lzdGVyX2RyaXZlcigmdG1wMTIxX2RyaXZlcik7CisJaWYgKHJldCkKKwkJc3BpX3VucmVnaXN0ZXJfZHJpdmVyKCZsbTcwX2RyaXZlcik7CisKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgY2xlYW51cF9sbTcwKHZvaWQpCiB7CiAJc3BpX3VucmVnaXN0ZXJfZHJpdmVyKCZsbTcwX2RyaXZlcik7CisJc3BpX3VucmVnaXN0ZXJfZHJpdmVyKCZ0bXAxMjFfZHJpdmVyKTsKIH0KIAogbW9kdWxlX2luaXQoaW5pdF9sbTcwKTsKIG1vZHVsZV9leGl0KGNsZWFudXBfbG03MCk7CiAKIE1PRFVMRV9BVVRIT1IoIkthaXdhbiBOIEJpbGxpbW9yaWEiKTsKLU1PRFVMRV9ERVNDUklQVElPTigiTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBMTTcwIExpbnV4IGRyaXZlciIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJOUyBMTTcwIC8gVEkgVE1QMTIxL1RNUDEyMyBMaW51eCBkcml2ZXIiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vbG03NS5jIGIvZHJpdmVycy9od21vbi9sbTc1LmMKaW5kZXggOGY5NTk1Zi4uNTViZDg3YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9sbTc1LmMKKysrIGIvZHJpdmVycy9od21vbi9sbTc1LmMKQEAgLTE5MCw3ICsxOTAsNyBAQAogCX0KIAogCWRldl9pbmZvKCZjbGllbnQtPmRldiwgIiVzOiBzZW5zb3IgJyVzJ1xuIiwKLQkJZGF0YS0+aHdtb25fZGV2LT5idXNfaWQsIGNsaWVudC0+bmFtZSk7CisJCSBkZXZfbmFtZShkYXRhLT5od21vbl9kZXYpLCBjbGllbnQtPm5hbWUpOwogCiAJcmV0dXJuIDA7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vbHRjNDI0NS5jIGIvZHJpdmVycy9od21vbi9sdGM0MjQ1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM0YjJjNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaHdtb24vbHRjNDI0NS5jCkBAIC0wLDAgKzEsNTY3IEBACisvKgorICogRHJpdmVyIGZvciBMaW5lYXIgVGVjaG5vbG9neSBMVEM0MjQ1IEkyQyBNdWx0aXBsZSBTdXBwbHkgSG90IFN3YXAgQ29udHJvbGxlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBJcmEgVy4gU255ZGVyIDxpd3NAb3Zyby5jYWx0ZWNoLmVkdT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZS4KKyAqCisgKiBUaGlzIGRyaXZlciBpcyBiYXNlZCBvbiB0aGUgZHMxNjIxIGFuZCBpbmEyMDkgZHJpdmVycy4KKyAqCisgKiBEYXRhc2hlZXQ6CisgKiBodHRwOi8vd3d3LmxpbmVhci5jb20vcGMvZG93bmxvYWREb2N1bWVudC5kbz9uYXZJZD1IMCxDMSxDMTAwMyxDMTAwNixDMTE0MCxQMTkzOTIsRDEzNTE3CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvaHdtb24uaD4KKyNpbmNsdWRlIDxsaW51eC9od21vbi1zeXNmcy5oPgorCisvKiBWYWxpZCBhZGRyZXNzZXMgYXJlIDB4MjAgLSAweDNmCisgKgorICogRm9yIG5vdywgd2UgZG8gbm90IHByb2JlLCBzaW5jZSBzb21lIG9mIHRoZXNlIGFkZHJlc3NlcworICogYXJlIGtub3duIHRvIGJlIHVuZnJpZW5kbHkgdG8gcHJvYmluZyAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IG5vcm1hbF9pMmNbXSA9IHsgSTJDX0NMSUVOVF9FTkQgfTsKKworLyogSW5zbW9kIHBhcmFtZXRlcnMgKi8KK0kyQ19DTElFTlRfSU5TTU9EXzEobHRjNDI0NSk7CisKKy8qIEhlcmUgYXJlIG5hbWVzIG9mIHRoZSBjaGlwJ3MgcmVnaXN0ZXJzIChhLmsuYS4gY29tbWFuZHMpICovCitlbnVtIGx0YzQyNDVfY21kIHsKKwlMVEM0MjQ1X1NUQVRVUwkJCT0gMHgwMCwgLyogcmVhZG9ubHkgKi8KKwlMVEM0MjQ1X0FMRVJUCQkJPSAweDAxLAorCUxUQzQyNDVfQ09OVFJPTAkJCT0gMHgwMiwKKwlMVEM0MjQ1X09OCQkJPSAweDAzLAorCUxUQzQyNDVfRkFVTFQxCQkJPSAweDA0LAorCUxUQzQyNDVfRkFVTFQyCQkJPSAweDA1LAorCUxUQzQyNDVfR1BJTwkJCT0gMHgwNiwKKwlMVEM0MjQ1X0FEQ0FEUgkJCT0gMHgwNywKKworCUxUQzQyNDVfMTJWSU4JCQk9IDB4MTAsCisJTFRDNDI0NV8xMlZTRU5TRQkJPSAweDExLAorCUxUQzQyNDVfMTJWT1VUCQkJPSAweDEyLAorCUxUQzQyNDVfNVZJTgkJCT0gMHgxMywKKwlMVEM0MjQ1XzVWU0VOU0UJCQk9IDB4MTQsCisJTFRDNDI0NV81Vk9VVAkJCT0gMHgxNSwKKwlMVEM0MjQ1XzNWSU4JCQk9IDB4MTYsCisJTFRDNDI0NV8zVlNFTlNFCQkJPSAweDE3LAorCUxUQzQyNDVfM1ZPVVQJCQk9IDB4MTgsCisJTFRDNDI0NV9WRUVJTgkJCT0gMHgxOSwKKwlMVEM0MjQ1X1ZFRVNFTlNFCQk9IDB4MWEsCisJTFRDNDI0NV9WRUVPVVQJCQk9IDB4MWIsCisJTFRDNDI0NV9HUElPQURDMQkJPSAweDFjLAorCUxUQzQyNDVfR1BJT0FEQzIJCT0gMHgxZCwKKwlMVEM0MjQ1X0dQSU9BREMzCQk9IDB4MWUsCit9OworCitzdHJ1Y3QgbHRjNDI0NV9kYXRhIHsKKwlzdHJ1Y3QgZGV2aWNlICpod21vbl9kZXY7CisKKwlzdHJ1Y3QgbXV0ZXggdXBkYXRlX2xvY2s7CisJYm9vbCB2YWxpZDsKKwl1bnNpZ25lZCBsb25nIGxhc3RfdXBkYXRlZDsgLyogaW4gamlmZmllcyAqLworCisJLyogQ29udHJvbCByZWdpc3RlcnMgKi8KKwl1OCBjcmVnc1sweDA4XTsKKworCS8qIFZvbHRhZ2UgcmVnaXN0ZXJzICovCisJdTggdnJlZ3NbMHgwZl07Cit9OworCitzdGF0aWMgc3RydWN0IGx0YzQyNDVfZGF0YSAqbHRjNDI0NV91cGRhdGVfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBsdGM0MjQ1X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlzMzIgdmFsOworCWludCBpOworCisJbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOworCisJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgZGF0YS0+bGFzdF91cGRhdGVkICsgSFopIHx8ICFkYXRhLT52YWxpZCkgeworCisJCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAiU3RhcnRpbmcgbHRjNDI0NSB1cGRhdGVcbiIpOworCisJCS8qIFJlYWQgY29udHJvbCByZWdpc3RlcnMgLS0gMHgwMCB0byAweDA3ICovCisJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGRhdGEtPmNyZWdzKTsgaSsrKSB7CisJCQl2YWwgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBpKTsKKwkJCWlmICh1bmxpa2VseSh2YWwgPCAwKSkKKwkJCQlkYXRhLT5jcmVnc1tpXSA9IDA7CisJCQllbHNlCisJCQkJZGF0YS0+Y3JlZ3NbaV0gPSB2YWw7CisJCX0KKworCQkvKiBSZWFkIHZvbHRhZ2UgcmVnaXN0ZXJzIC0tIDB4MTAgdG8gMHgxZiAqLworCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShkYXRhLT52cmVncyk7IGkrKykgeworCQkJdmFsID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgaSsweDEwKTsKKwkJCWlmICh1bmxpa2VseSh2YWwgPCAwKSkKKwkJCQlkYXRhLT52cmVnc1tpXSA9IDA7CisJCQllbHNlCisJCQkJZGF0YS0+dnJlZ3NbaV0gPSB2YWw7CisJCX0KKworCQlkYXRhLT5sYXN0X3VwZGF0ZWQgPSBqaWZmaWVzOworCQlkYXRhLT52YWxpZCA9IDE7CisJfQorCisJbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwlyZXR1cm4gZGF0YTsKK30KKworLyogUmV0dXJuIHRoZSB2b2x0YWdlIGZyb20gdGhlIGdpdmVuIHJlZ2lzdGVyIGluIG1pbGxpdm9sdHMgKi8KK3N0YXRpYyBpbnQgbHRjNDI0NV9nZXRfdm9sdGFnZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHU4IHJlZykKK3sKKwlzdHJ1Y3QgbHRjNDI0NV9kYXRhICpkYXRhID0gbHRjNDI0NV91cGRhdGVfZGV2aWNlKGRldik7CisJY29uc3QgdTggcmVndmFsID0gZGF0YS0+dnJlZ3NbcmVnIC0gMHgxMF07CisJdTMyIHZvbHRhZ2UgPSAwOworCisJc3dpdGNoIChyZWcpIHsKKwljYXNlIExUQzQyNDVfMTJWSU46CisJY2FzZSBMVEM0MjQ1XzEyVk9VVDoKKwkJdm9sdGFnZSA9IHJlZ3ZhbCAqIDU1OworCQlicmVhazsKKwljYXNlIExUQzQyNDVfNVZJTjoKKwljYXNlIExUQzQyNDVfNVZPVVQ6CisJCXZvbHRhZ2UgPSByZWd2YWwgKiAyMjsKKwkJYnJlYWs7CisJY2FzZSBMVEM0MjQ1XzNWSU46CisJY2FzZSBMVEM0MjQ1XzNWT1VUOgorCQl2b2x0YWdlID0gcmVndmFsICogMTU7CisJCWJyZWFrOworCWNhc2UgTFRDNDI0NV9WRUVJTjoKKwljYXNlIExUQzQyNDVfVkVFT1VUOgorCQl2b2x0YWdlID0gcmVndmFsICogLTU1OworCQlicmVhazsKKwljYXNlIExUQzQyNDVfR1BJT0FEQzE6CisJY2FzZSBMVEM0MjQ1X0dQSU9BREMyOgorCWNhc2UgTFRDNDI0NV9HUElPQURDMzoKKwkJdm9sdGFnZSA9IHJlZ3ZhbCAqIDEwOworCQlicmVhazsKKwlkZWZhdWx0OgorCQkvKiBJZiB3ZSBnZXQgaGVyZSwgdGhlIGRldmVsb3BlciBtZXNzZWQgdXAgKi8KKwkJV0FSTl9PTl9PTkNFKDEpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gdm9sdGFnZTsKK30KKworLyogUmV0dXJuIHRoZSBjdXJyZW50IGluIHRoZSBnaXZlbiBzZW5zZSByZWdpc3RlciBpbiBtaWxsaUFtcGVyZXMgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgbHRjNDI0NV9nZXRfY3VycmVudChzdHJ1Y3QgZGV2aWNlICpkZXYsIHU4IHJlZykKK3sKKwlzdHJ1Y3QgbHRjNDI0NV9kYXRhICpkYXRhID0gbHRjNDI0NV91cGRhdGVfZGV2aWNlKGRldik7CisJY29uc3QgdTggcmVndmFsID0gZGF0YS0+dnJlZ3NbcmVnIC0gMHgxMF07CisJdW5zaWduZWQgaW50IHZvbHRhZ2U7CisJdW5zaWduZWQgaW50IGN1cnI7CisKKwkvKiBUaGUgc3RyYW5nZSBsb29raW5nIGNvbnZlcnNpb25zIHRoYXQgZm9sbG93IGFyZSBmaXhlZC1wb2ludAorCSAqIG1hdGgsIHNpbmNlIHdlIGNhbm5vdCBkbyBmbG9hdGluZyBwb2ludCBpbiB0aGUga2VybmVsLgorCSAqCisJICogU3RlcCAxOiBjb252ZXJ0IHNlbnNlIHJlZ2lzdGVyIHRvIG1pY3JvVm9sdHMKKwkgKiBTdGVwIDI6IGNvbnZlcnQgdm9sdGFnZSB0byBtaWxsaUFtcGVyZXMKKwkgKgorCSAqIElmIHlvdSBwbGF5IGFyb3VuZCB3aXRoIHRoZSBWPUlSIGVxdWF0aW9uLCB5b3UgY29tZSB1cCB3aXRoCisJICogdGhlIGZvbGxvd2luZzogWCB1ViAvIFkgbU9obSA9PSBaIG1BCisJICoKKwkgKiBXaXRoIHRoZSByZXNpc3RvcnMgdGhhdCBhcmUgZnJhY3Rpb25zIG9mIGEgbWlsbGlPaG0sIHdlIG11bHRpcGx5CisJICogdGhlIHZvbHRhZ2UgYW5kIHJlc2lzdGFuY2UgYnkgMTAsIHRvIHNoaWZ0IHRoZSBkZWNpbWFsIHBvaW50LgorCSAqIE5vdyB3ZSBjYW4gdXNlIHRoZSBub3JtYWwgZGl2aXNpb24gb3BlcmF0b3IgYWdhaW4uCisJICovCisKKwlzd2l0Y2ggKHJlZykgeworCWNhc2UgTFRDNDI0NV8xMlZTRU5TRToKKwkJdm9sdGFnZSA9IHJlZ3ZhbCAqIDI1MDsgLyogdm9sdGFnZSBpbiB1ViAqLworCQljdXJyID0gdm9sdGFnZSAvIDUwOyAvKiBzZW5zZSByZXNpc3RvciA1MCBtT2htICovCisJCWJyZWFrOworCWNhc2UgTFRDNDI0NV81VlNFTlNFOgorCQl2b2x0YWdlID0gcmVndmFsICogMTI1OyAvKiB2b2x0YWdlIGluIHVWICovCisJCWN1cnIgPSAodm9sdGFnZSAqIDEwKSAvIDM1OyAvKiBzZW5zZSByZXNpc3RvciAzLjUgbU9obSAqLworCQlicmVhazsKKwljYXNlIExUQzQyNDVfM1ZTRU5TRToKKwkJdm9sdGFnZSA9IHJlZ3ZhbCAqIDEyNTsgLyogdm9sdGFnZSBpbiB1ViAqLworCQljdXJyID0gKHZvbHRhZ2UgKiAxMCkgLyAyNTsgLyogc2Vuc2UgcmVzaXN0b3IgMi41IG1PaG0gKi8KKwkJYnJlYWs7CisJY2FzZSBMVEM0MjQ1X1ZFRVNFTlNFOgorCQl2b2x0YWdlID0gcmVndmFsICogMjUwOyAvKiB2b2x0YWdlIGluIHVWICovCisJCWN1cnIgPSB2b2x0YWdlIC8gMTAwOyAvKiBzZW5zZSByZXNpc3RvciAxMDAgbU9obSAqLworCQlicmVhazsKKwlkZWZhdWx0OgorCQkvKiBJZiB3ZSBnZXQgaGVyZSwgdGhlIGRldmVsb3BlciBtZXNzZWQgdXAgKi8KKwkJV0FSTl9PTl9PTkNFKDEpOworCQljdXJyID0gMDsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIGN1cnI7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGx0YzQyNDVfc2hvd192b2x0YWdlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRhLAorCQkJCSAgICBjaGFyICpidWYpCit7CisJc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlICphdHRyID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRhKTsKKwljb25zdCBpbnQgdm9sdGFnZSA9IGx0YzQyNDVfZ2V0X3ZvbHRhZ2UoZGV2LCBhdHRyLT5pbmRleCk7CisKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwgdm9sdGFnZSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGx0YzQyNDVfc2hvd19jdXJyZW50KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRhLAorCQkJCSAgICBjaGFyICpidWYpCit7CisJc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlICphdHRyID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRhKTsKKwljb25zdCB1bnNpZ25lZCBpbnQgY3VyciA9IGx0YzQyNDVfZ2V0X2N1cnJlbnQoZGV2LCBhdHRyLT5pbmRleCk7CisKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIldVxuIiwgY3Vycik7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGx0YzQyNDVfc2hvd19wb3dlcihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGEsCisJCQkJICBjaGFyICpidWYpCit7CisJc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlICphdHRyID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRhKTsKKwljb25zdCB1bnNpZ25lZCBpbnQgY3VyciA9IGx0YzQyNDVfZ2V0X2N1cnJlbnQoZGV2LCBhdHRyLT5pbmRleCk7CisJY29uc3QgaW50IG91dHB1dF92b2x0YWdlID0gbHRjNDI0NV9nZXRfdm9sdGFnZShkZXYsIGF0dHItPmluZGV4KzEpOworCisJLyogY3VycmVudCBpbiBtQSAqIHZvbHRhZ2UgaW4gbVYgPT0gcG93ZXIgaW4gdVcgKi8KKwljb25zdCB1bnNpZ25lZCBpbnQgcG93ZXIgPSBhYnMob3V0cHV0X3ZvbHRhZ2UgKiBjdXJyKTsKKworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiV1XG4iLCBwb3dlcik7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGx0YzQyNDVfc2hvd19hbGFybShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCSAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRhLAorCQkJCQkgIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGVfMiAqYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cl8yKGRhKTsKKwlzdHJ1Y3QgbHRjNDI0NV9kYXRhICpkYXRhID0gbHRjNDI0NV91cGRhdGVfZGV2aWNlKGRldik7CisJY29uc3QgdTggcmVnID0gZGF0YS0+Y3JlZ3NbYXR0ci0+aW5kZXhdOworCWNvbnN0IHUzMiBtYXNrID0gYXR0ci0+bnI7CisKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIldVxuIiwgKHJlZyAmIG1hc2spID8gMSA6IDApOworfQorCisvKiBUaGVzZSBtYWNyb3MgYXJlIHVzZWQgYmVsb3cgaW4gY29uc3RydWN0aW5nIGRldmljZSBhdHRyaWJ1dGUgb2JqZWN0cworICogZm9yIHVzZSB3aXRoIHN5c2ZzX2NyZWF0ZV9ncm91cCgpIHRvIG1ha2UgYSBzeXNmcyBkZXZpY2UgZmlsZQorICogZm9yIGVhY2ggcmVnaXN0ZXIuCisgKi8KKworI2RlZmluZSBMVEM0MjQ1X1ZPTFRBR0UobmFtZSwgbHRjNDI0NV9jbWRfaWR4KSBcCisJc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihuYW1lLCBTX0lSVUdPLCBcCisJbHRjNDI0NV9zaG93X3ZvbHRhZ2UsIE5VTEwsIGx0YzQyNDVfY21kX2lkeCkKKworI2RlZmluZSBMVEM0MjQ1X0NVUlJFTlQobmFtZSwgbHRjNDI0NV9jbWRfaWR4KSBcCisJc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihuYW1lLCBTX0lSVUdPLCBcCisJbHRjNDI0NV9zaG93X2N1cnJlbnQsIE5VTEwsIGx0YzQyNDVfY21kX2lkeCkKKworI2RlZmluZSBMVEM0MjQ1X1BPV0VSKG5hbWUsIGx0YzQyNDVfY21kX2lkeCkgXAorCXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIobmFtZSwgU19JUlVHTywgXAorCWx0YzQyNDVfc2hvd19wb3dlciwgTlVMTCwgbHRjNDI0NV9jbWRfaWR4KQorCisjZGVmaW5lIExUQzQyNDVfQUxBUk0obmFtZSwgbWFzaywgcmVnKSBcCisJc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUl8yKG5hbWUsIFNfSVJVR08sIFwKKwlsdGM0MjQ1X3Nob3dfYWxhcm0sIE5VTEwsIChtYXNrKSwgcmVnKQorCisvKiBDb25zdHJ1Y3QgYSBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSBzdHJ1Y3R1cmUgZm9yIGVhY2ggcmVnaXN0ZXIgKi8KKworLyogSW5wdXQgdm9sdGFnZXMgKi8KK0xUQzQyNDVfVk9MVEFHRShpbjFfaW5wdXQsCQkJTFRDNDI0NV8xMlZJTik7CitMVEM0MjQ1X1ZPTFRBR0UoaW4yX2lucHV0LAkJCUxUQzQyNDVfNVZJTik7CitMVEM0MjQ1X1ZPTFRBR0UoaW4zX2lucHV0LAkJCUxUQzQyNDVfM1ZJTik7CitMVEM0MjQ1X1ZPTFRBR0UoaW40X2lucHV0LAkJCUxUQzQyNDVfVkVFSU4pOworCisvKiBJbnB1dCB1bmRlcnZvbHRhZ2UgYWxhcm1zICovCitMVEM0MjQ1X0FMQVJNKGluMV9taW5fYWxhcm0sCSgxIDw8IDApLAlMVEM0MjQ1X0ZBVUxUMSk7CitMVEM0MjQ1X0FMQVJNKGluMl9taW5fYWxhcm0sCSgxIDw8IDEpLAlMVEM0MjQ1X0ZBVUxUMSk7CitMVEM0MjQ1X0FMQVJNKGluM19taW5fYWxhcm0sCSgxIDw8IDIpLAlMVEM0MjQ1X0ZBVUxUMSk7CitMVEM0MjQ1X0FMQVJNKGluNF9taW5fYWxhcm0sCSgxIDw8IDMpLAlMVEM0MjQ1X0ZBVUxUMSk7CisKKy8qIEN1cnJlbnRzICh2aWEgc2Vuc2UgcmVzaXN0b3IpICovCitMVEM0MjQ1X0NVUlJFTlQoY3VycjFfaW5wdXQsCQkJTFRDNDI0NV8xMlZTRU5TRSk7CitMVEM0MjQ1X0NVUlJFTlQoY3VycjJfaW5wdXQsCQkJTFRDNDI0NV81VlNFTlNFKTsKK0xUQzQyNDVfQ1VSUkVOVChjdXJyM19pbnB1dCwJCQlMVEM0MjQ1XzNWU0VOU0UpOworTFRDNDI0NV9DVVJSRU5UKGN1cnI0X2lucHV0LAkJCUxUQzQyNDVfVkVFU0VOU0UpOworCisvKiBPdmVyY3VycmVudCBhbGFybXMgKi8KK0xUQzQyNDVfQUxBUk0oY3VycjFfbWF4X2FsYXJtLAkoMSA8PCA0KSwJTFRDNDI0NV9GQVVMVDEpOworTFRDNDI0NV9BTEFSTShjdXJyMl9tYXhfYWxhcm0sCSgxIDw8IDUpLAlMVEM0MjQ1X0ZBVUxUMSk7CitMVEM0MjQ1X0FMQVJNKGN1cnIzX21heF9hbGFybSwJKDEgPDwgNiksCUxUQzQyNDVfRkFVTFQxKTsKK0xUQzQyNDVfQUxBUk0oY3VycjRfbWF4X2FsYXJtLAkoMSA8PCA3KSwJTFRDNDI0NV9GQVVMVDEpOworCisvKiBPdXRwdXQgdm9sdGFnZXMgKi8KK0xUQzQyNDVfVk9MVEFHRShpbjVfaW5wdXQsCQkJTFRDNDI0NV8xMlZPVVQpOworTFRDNDI0NV9WT0xUQUdFKGluNl9pbnB1dCwJCQlMVEM0MjQ1XzVWT1VUKTsKK0xUQzQyNDVfVk9MVEFHRShpbjdfaW5wdXQsCQkJTFRDNDI0NV8zVk9VVCk7CitMVEM0MjQ1X1ZPTFRBR0UoaW44X2lucHV0LAkJCUxUQzQyNDVfVkVFT1VUKTsKKworLyogUG93ZXIgQmFkIGFsYXJtcyAqLworTFRDNDI0NV9BTEFSTShpbjVfbWluX2FsYXJtLAkoMSA8PCAwKSwJTFRDNDI0NV9GQVVMVDIpOworTFRDNDI0NV9BTEFSTShpbjZfbWluX2FsYXJtLAkoMSA8PCAxKSwJTFRDNDI0NV9GQVVMVDIpOworTFRDNDI0NV9BTEFSTShpbjdfbWluX2FsYXJtLAkoMSA8PCAyKSwJTFRDNDI0NV9GQVVMVDIpOworTFRDNDI0NV9BTEFSTShpbjhfbWluX2FsYXJtLAkoMSA8PCAzKSwJTFRDNDI0NV9GQVVMVDIpOworCisvKiBHUElPIHZvbHRhZ2VzICovCitMVEM0MjQ1X1ZPTFRBR0UoaW45X2lucHV0LAkJCUxUQzQyNDVfR1BJT0FEQzEpOworTFRDNDI0NV9WT0xUQUdFKGluMTBfaW5wdXQsCQkJTFRDNDI0NV9HUElPQURDMik7CitMVEM0MjQ1X1ZPTFRBR0UoaW4xMV9pbnB1dCwJCQlMVEM0MjQ1X0dQSU9BREMzKTsKKworLyogUG93ZXIgQ29uc3VtcHRpb24gKHZpcnR1YWwpICovCitMVEM0MjQ1X1BPV0VSKHBvd2VyMV9pbnB1dCwJCQlMVEM0MjQ1XzEyVlNFTlNFKTsKK0xUQzQyNDVfUE9XRVIocG93ZXIyX2lucHV0LAkJCUxUQzQyNDVfNVZTRU5TRSk7CitMVEM0MjQ1X1BPV0VSKHBvd2VyM19pbnB1dCwJCQlMVEM0MjQ1XzNWU0VOU0UpOworTFRDNDI0NV9QT1dFUihwb3dlcjRfaW5wdXQsCQkJTFRDNDI0NV9WRUVTRU5TRSk7CisKKy8qIEZpbmFsbHksIGNvbnN0cnVjdCBhbiBhcnJheSBvZiBwb2ludGVycyB0byBtZW1iZXJzIG9mIHRoZSBhYm92ZSBvYmplY3RzLAorICogYXMgcmVxdWlyZWQgZm9yIHN5c2ZzX2NyZWF0ZV9ncm91cCgpCisgKi8KK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpsdGM0MjQ1X2F0dHJpYnV0ZXNbXSA9IHsKKwkmc2Vuc29yX2Rldl9hdHRyX2luMV9pbnB1dC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfaW4yX2lucHV0LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjNfaW5wdXQuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luNF9pbnB1dC5kZXZfYXR0ci5hdHRyLAorCisJJnNlbnNvcl9kZXZfYXR0cl9pbjFfbWluX2FsYXJtLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjJfbWluX2FsYXJtLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjNfbWluX2FsYXJtLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjRfbWluX2FsYXJtLmRldl9hdHRyLmF0dHIsCisKKwkmc2Vuc29yX2Rldl9hdHRyX2N1cnIxX2lucHV0LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9jdXJyMl9pbnB1dC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfY3VycjNfaW5wdXQuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2N1cnI0X2lucHV0LmRldl9hdHRyLmF0dHIsCisKKwkmc2Vuc29yX2Rldl9hdHRyX2N1cnIxX21heF9hbGFybS5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfY3VycjJfbWF4X2FsYXJtLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9jdXJyM19tYXhfYWxhcm0uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2N1cnI0X21heF9hbGFybS5kZXZfYXR0ci5hdHRyLAorCisJJnNlbnNvcl9kZXZfYXR0cl9pbjVfaW5wdXQuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luNl9pbnB1dC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfaW43X2lucHV0LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjhfaW5wdXQuZGV2X2F0dHIuYXR0ciwKKworCSZzZW5zb3JfZGV2X2F0dHJfaW41X21pbl9hbGFybS5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfaW42X21pbl9hbGFybS5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfaW43X21pbl9hbGFybS5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfaW44X21pbl9hbGFybS5kZXZfYXR0ci5hdHRyLAorCisJJnNlbnNvcl9kZXZfYXR0cl9pbjlfaW5wdXQuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luMTBfaW5wdXQuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luMTFfaW5wdXQuZGV2X2F0dHIuYXR0ciwKKworCSZzZW5zb3JfZGV2X2F0dHJfcG93ZXIxX2lucHV0LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9wb3dlcjJfaW5wdXQuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX3Bvd2VyM19pbnB1dC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfcG93ZXI0X2lucHV0LmRldl9hdHRyLmF0dHIsCisKKwlOVUxMLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgbHRjNDI0NV9ncm91cCA9IHsKKwkuYXR0cnMgPSBsdGM0MjQ1X2F0dHJpYnV0ZXMsCit9OworCitzdGF0aWMgaW50IGx0YzQyNDVfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwkJCSBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IGx0YzQyNDVfZGF0YSAqZGF0YTsKKwlpbnQgcmV0OworCisJZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKCpkYXRhKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkYXRhKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gb3V0X2t6YWxsb2M7CisJfQorCisJaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgZGF0YSk7CisJbXV0ZXhfaW5pdCgmZGF0YS0+dXBkYXRlX2xvY2spOworCisJLyogSW5pdGlhbGl6ZSB0aGUgTFRDNDI0NSBjaGlwICovCisJLyogVE9ETyAqLworCisJLyogUmVnaXN0ZXIgc3lzZnMgaG9va3MgKi8KKwlyZXQgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJmNsaWVudC0+ZGV2LmtvYmosICZsdGM0MjQ1X2dyb3VwKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dF9zeXNmc19jcmVhdGVfZ3JvdXA7CisKKwlkYXRhLT5od21vbl9kZXYgPSBod21vbl9kZXZpY2VfcmVnaXN0ZXIoJmNsaWVudC0+ZGV2KTsKKwlpZiAoSVNfRVJSKGRhdGEtPmh3bW9uX2RldikpIHsKKwkJcmV0ID0gUFRSX0VSUihkYXRhLT5od21vbl9kZXYpOworCQlnb3RvIG91dF9od21vbl9kZXZpY2VfcmVnaXN0ZXI7CisJfQorCisJcmV0dXJuIDA7CisKK291dF9od21vbl9kZXZpY2VfcmVnaXN0ZXI6CisJc3lzZnNfcmVtb3ZlX2dyb3VwKCZjbGllbnQtPmRldi5rb2JqLCAmbHRjNDI0NV9ncm91cCk7CitvdXRfc3lzZnNfY3JlYXRlX2dyb3VwOgorCWtmcmVlKGRhdGEpOworb3V0X2t6YWxsb2M6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBsdGM0MjQ1X3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXN0cnVjdCBsdGM0MjQ1X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKworCWh3bW9uX2RldmljZV91bnJlZ2lzdGVyKGRhdGEtPmh3bW9uX2Rldik7CisJc3lzZnNfcmVtb3ZlX2dyb3VwKCZjbGllbnQtPmRldi5rb2JqLCAmbHRjNDI0NV9ncm91cCk7CisKKwlrZnJlZShkYXRhKTsKKworCXJldHVybiAwOworfQorCisvKiBDaGVjayB0aGF0IHNvbWUgYml0cyBpbiBhIGNvbnRyb2wgcmVnaXN0ZXIgYXBwZWFyIGF0IGFsbCBwb3NzaWJsZQorICogbG9jYXRpb25zIHdpdGhvdXQgY2hhbmdpbmcgdmFsdWUKKyAqCisgKiBAY2xpZW50OiB0aGUgaTJjIGNsaWVudCB0byB1c2UKKyAqIEByZWc6IHRoZSByZWdpc3RlciB0byByZWFkCisgKiBAYml0czogdGhlIGJpdHMgdG8gY2hlY2sgKDB4ZmYgY2hlY2tzIGFsbCBiaXRzLAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAweDAzIGNoZWNrcyBvbmx5IHRoZSBsYXN0IHR3byBiaXRzKQorICoKKyAqIHJldHVybiAtRVJSTk8gaWYgdGhlIHJlZ2lzdGVyIHJlYWQgZmFpbGVkCisgKiByZXR1cm4gLUVOT0RFViBpZiB0aGUgcmVnaXN0ZXIgdmFsdWUgZG9lc24ndCBzdGF5IGNvbnN0YW50IGF0IGFsbAorICogcG9zc2libGUgYWRkcmVzc2VzCisgKgorICogcmV0dXJuIDAgZm9yIHN1Y2Nlc3MKKyAqLworc3RhdGljIGludCBsdGM0MjQ1X2NoZWNrX2NvbnRyb2xfcmVnKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHJlZywgdTggYml0cykKK3sKKwlpbnQgaTsKKwlzMzIgdiwgdm9mZjEsIHZvZmYyOworCisJLyogUmVhZCByZWdpc3RlciBhbmQgY2hlY2sgZm9yIGVycm9yICovCisJdiA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIHJlZyk7CisJaWYgKHYgPCAwKQorCQlyZXR1cm4gdjsKKworCXYgJj0gYml0czsKKworCWZvciAoaSA9IDB4MDA7IGkgPCAweGZmOyBpICs9IDB4MjApIHsKKworCQl2b2ZmMSA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIHJlZyArIGkpOworCQlpZiAodm9mZjEgPCAwKQorCQkJcmV0dXJuIHZvZmYxOworCisJCXZvZmYyID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgcmVnICsgaSArIDB4MDgpOworCQlpZiAodm9mZjIgPCAwKQorCQkJcmV0dXJuIHZvZmYyOworCisJCXZvZmYxICY9IGJpdHM7CisJCXZvZmYyICY9IGJpdHM7CisKKwkJaWYgKHYgIT0gdm9mZjEgfHwgdiAhPSB2b2ZmMikKKwkJCXJldHVybiAtRU5PREVWOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGx0YzQyNDVfZGV0ZWN0KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCQkgIGludCBraW5kLAorCQkJICBzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gKmluZm8pCit7CisJc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyID0gY2xpZW50LT5hZGFwdGVyOworCisJaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShhZGFwdGVyLCBJMkNfRlVOQ19TTUJVU19CWVRFX0RBVEEpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmIChraW5kIDwgMCkgewkJLyogcHJvYmVkIGRldGVjdGlvbiAtIGNoZWNrIHRoZSBjaGlwIHR5cGUgKi8KKwkJczMyIHY7CQkvKiA4IGJpdHMgZnJvbSB0aGUgY2hpcCwgb3IgLUVSUk5PICovCisKKwkJLyogQ2hpcCByZWdpc3RlcnMgMHgwMC0weDA3IGFyZSBjb250cm9sIHJlZ2lzdGVycworCQkgKiBDaGlwIHJlZ2lzdGVycyAweDEwLTB4MWYgYXJlIGRhdGEgcmVnaXN0ZXJzCisJCSAqCisJCSAqIEFkZHJlc3MgYml0cyBiNy1iNSBhcmUgaWdub3JlZC4gVGhpcyBtYWtlcyB0aGUgY2hpcCAicmVwZWF0IgorCQkgKiBpbiBzdGVwcyBvZiAweDIwLiBBbnkgY29udHJvbCByZWdpc3RlcnMgc2hvdWxkIGFwcGVhciB3aXRoCisJCSAqIHRoZSBzYW1lIHZhbHVlcyBhY3Jvc3MgYWxsIGR1cGxpY2F0ZWQgYWRkcmVzc2VzLgorCQkgKgorCQkgKiBSZWdpc3RlciAweDAyIGJpdCBiMiBpcyByZXNlcnZlZCwgZXhwZWN0IDAKKwkJICogUmVnaXN0ZXIgMHgwNyBiaXRzIGI3IHRvIGI0IGFyZSByZXNlcnZlZCwgZXhwZWN0IDAKKwkJICoKKwkJICogUmVnaXN0ZXJzIDB4MDEsIDB4MDIgYXJlIGNvbnRyb2wgcmVnaXN0ZXJzIGFuZCBzaG91bGQgbm90CisJCSAqIGNoYW5nZSBvbiB0aGVpciBvd24uCisJCSAqCisJCSAqIFJlZ2lzdGVyIDB4MDYgYml0cyBiNiBhbmQgYjcgYXJlIGNvbnRyb2wgYml0cywgYW5kIHNob3VsZAorCQkgKiBub3QgY2hhbmdlIG9uIHRoZWlyIG93bi4KKwkJICoKKwkJICogUmVnaXN0ZXIgMHgwNyBiaXRzIGIzIHRvIGIwIGFyZSBjb250cm9sIGJpdHMsIGFuZCBzaG91bGQKKwkJICogbm90IGNoYW5nZSBvbiB0aGVpciBvd24uCisJCSAqLworCisJCS8qIHJlYWQgcmVnaXN0ZXIgMHgwMiByZXNlcnZlZCBiaXQsIGV4cGVjdCAwICovCisJCXYgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBMVEM0MjQ1X0NPTlRST0wpOworCQlpZiAodiA8IDAgfHwgKHYgJiAweDA0KSAhPSAwKQorCQkJcmV0dXJuIC1FTk9ERVY7CisKKwkJLyogcmVhZCByZWdpc3RlciAweDA3IHJlc2VydmVkIGJpdHMsIGV4cGVjdCAwICovCisJCXYgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBMVEM0MjQ1X0FEQ0FEUik7CisJCWlmICh2IDwgMCB8fCAodiAmIDB4ZjApICE9IDApCisJCQlyZXR1cm4gLUVOT0RFVjsKKworCQkvKiBjaGVjayB0aGF0IHRoZSBhbGVydCByZWdpc3RlciBhcHBlYXJzIGF0IGFsbCBsb2NhdGlvbnMgKi8KKwkJaWYgKGx0YzQyNDVfY2hlY2tfY29udHJvbF9yZWcoY2xpZW50LCBMVEM0MjQ1X0FMRVJULCAweGZmKSkKKwkJCXJldHVybiAtRU5PREVWOworCisJCS8qIGNoZWNrIHRoYXQgdGhlIGNvbnRyb2wgcmVnaXN0ZXIgYXBwZWFycyBhdCBhbGwgbG9jYXRpb25zICovCisJCWlmIChsdGM0MjQ1X2NoZWNrX2NvbnRyb2xfcmVnKGNsaWVudCwgTFRDNDI0NV9DT05UUk9MLCAweGZmKSkKKwkJCXJldHVybiAtRU5PREVWOworCisJCS8qIGNoZWNrIHRoYXQgcmVnaXN0ZXIgMHgwNiBiaXRzIGI2IGFuZCBiNyBzdGF5IGNvbnN0YW50ICovCisJCWlmIChsdGM0MjQ1X2NoZWNrX2NvbnRyb2xfcmVnKGNsaWVudCwgTFRDNDI0NV9HUElPLCAweGMwKSkKKwkJCXJldHVybiAtRU5PREVWOworCisJCS8qIGNoZWNrIHRoYXQgcmVnaXN0ZXIgMHgwNyBiaXRzIGIzLWIwIHN0YXkgY29uc3RhbnQgKi8KKwkJaWYgKGx0YzQyNDVfY2hlY2tfY29udHJvbF9yZWcoY2xpZW50LCBMVEM0MjQ1X0FEQ0FEUiwgMHgwZikpCisJCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlzdHJsY3B5KGluZm8tPnR5cGUsICJsdGM0MjQ1IiwgSTJDX05BTUVfU0laRSk7CisJZGV2X2luZm8oJmFkYXB0ZXItPmRldiwgImx0YzQyNDUgJXMgYXQgYWRkcmVzcyAweCUwMnhcbiIsCisJCQlraW5kIDwgMCA/ICJwcm9iZWQiIDogImZvcmNlZCIsCisJCQljbGllbnQtPmFkZHIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBsdGM0MjQ1X2lkW10gPSB7CisJeyAibHRjNDI0NSIsIGx0YzQyNDUgfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgbHRjNDI0NV9pZCk7CisKKy8qIFRoaXMgaXMgdGhlIGRyaXZlciB0aGF0IHdpbGwgYmUgaW5zZXJ0ZWQgKi8KK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBsdGM0MjQ1X2RyaXZlciA9IHsKKwkuY2xhc3MJCT0gSTJDX0NMQVNTX0hXTU9OLAorCS5kcml2ZXIgPSB7CisJCS5uYW1lCT0gImx0YzQyNDUiLAorCX0sCisJLnByb2JlCQk9IGx0YzQyNDVfcHJvYmUsCisJLnJlbW92ZQkJPSBsdGM0MjQ1X3JlbW92ZSwKKwkuaWRfdGFibGUJPSBsdGM0MjQ1X2lkLAorCS5kZXRlY3QJCT0gbHRjNDI0NV9kZXRlY3QsCisJLmFkZHJlc3NfZGF0YQk9ICZhZGRyX2RhdGEsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBsdGM0MjQ1X2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaTJjX2FkZF9kcml2ZXIoJmx0YzQyNDVfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGx0YzQyNDVfZXhpdCh2b2lkKQoreworCWkyY19kZWxfZHJpdmVyKCZsdGM0MjQ1X2RyaXZlcik7Cit9CisKK01PRFVMRV9BVVRIT1IoIklyYSBXLiBTbnlkZXIgPGl3c0BvdnJvLmNhbHRlY2guZWR1PiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJMVEM0MjQ1IGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCittb2R1bGVfaW5pdChsdGM0MjQ1X2luaXQpOworbW9kdWxlX2V4aXQobHRjNDI0NV9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vcGM4NzM2MC5jIGIvZHJpdmVycy9od21vbi9wYzg3MzYwLmMKaW5kZXggNWZiZmEzNC4uZmIwNTJmZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9wYzg3MzYwLmMKKysrIGIvZHJpdmVycy9od21vbi9wYzg3MzYwLmMKQEAgLTQzLDYgKzQzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9od21vbi12aWQuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KIAogc3RhdGljIHU4IGRldmlkOwpAQCAtMTYyNyw2ICsxNjI4LDExIEBACiAJCQljb250aW51ZTsKIAkJcmVzLnN0YXJ0ID0gZXh0cmFfaXNhW2ldOwogCQlyZXMuZW5kID0gZXh0cmFfaXNhW2ldICsgUEM4NzM2MF9FWFRFTlQgLSAxOworCisJCWVyciA9IGFjcGlfY2hlY2tfcmVzb3VyY2VfY29uZmxpY3QoJnJlcyk7CisJCWlmIChlcnIpCisJCQlnb3RvIGV4aXRfZGV2aWNlX3B1dDsKKwogCQllcnIgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkX3Jlc291cmNlcyhwZGV2LCAmcmVzLCAxKTsKIAkJaWYgKGVycikgewogCQkJcHJpbnRrKEtFUk5fRVJSICJwYzg3MzYwOiBEZXZpY2UgcmVzb3VyY2VbJWRdICIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vcGM4NzQyNy5jIGIvZHJpdmVycy9od21vbi9wYzg3NDI3LmMKaW5kZXggNzI2NWYyMi4uM2E4YTBmNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9wYzg3NDI3LmMKKysrIGIvZHJpdmVycy9od21vbi9wYzg3NDI3LmMKQEAgLTMyLDYgKzMyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvYWNwaS5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogCiBzdGF0aWMgdW5zaWduZWQgc2hvcnQgZm9yY2VfaWQ7CkBAIC01MjQsNiArNTI1LDEwIEBACiAJfTsKIAlpbnQgZXJyOwogCisJZXJyID0gYWNwaV9jaGVja19yZXNvdXJjZV9jb25mbGljdCgmcmVzKTsKKwlpZiAoZXJyKQorCQlnb3RvIGV4aXQ7CisKIAlwZGV2ID0gcGxhdGZvcm1fZGV2aWNlX2FsbG9jKERSVk5BTUUsIGFkZHJlc3MpOwogCWlmICghcGRldikgewogCQllcnIgPSAtRU5PTUVNOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9zaXM1NTk1LmMgYi9kcml2ZXJzL2h3bW9uL3NpczU1OTUuYwppbmRleCBhMjc2ODA2Li5hYTJlODMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL3NpczU1OTUuYworKysgYi9kcml2ZXJzL2h3bW9uL3NpczU1OTUuYwpAQCAtNjIsNiArNjIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CisjaW5jbHVkZSA8bGludXgvYWNwaS5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogCiAKQEAgLTcyNyw2ICs3MjgsMTAgQEAKIAl9OwogCWludCBlcnI7CiAKKwllcnIgPSBhY3BpX2NoZWNrX3Jlc291cmNlX2NvbmZsaWN0KCZyZXMpOworCWlmIChlcnIpCisJCWdvdG8gZXhpdDsKKwogCXBkZXYgPSBwbGF0Zm9ybV9kZXZpY2VfYWxsb2MoInNpczU1OTUiLCBhZGRyZXNzKTsKIAlpZiAoIXBkZXYpIHsKIAkJZXJyID0gLUVOT01FTTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vc21zYzQ3YjM5Ny5jIGIvZHJpdmVycy9od21vbi9zbXNjNDdiMzk3LmMKaW5kZXggZWIwMzU0NC4uNmY2ZDUyYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9zbXNjNDdiMzk3LmMKKysrIGIvZHJpdmVycy9od21vbi9zbXNjNDdiMzk3LmMKQEAgLTM2LDYgKzM2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9hY3BpLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAKIHN0YXRpYyB1bnNpZ25lZCBzaG9ydCBmb3JjZV9pZDsKQEAgLTMwMyw2ICszMDQsMTAgQEAKIAl9OwogCWludCBlcnI7CiAKKwllcnIgPSBhY3BpX2NoZWNrX3Jlc291cmNlX2NvbmZsaWN0KCZyZXMpOworCWlmIChlcnIpCisJCWdvdG8gZXhpdDsKKwogCXBkZXYgPSBwbGF0Zm9ybV9kZXZpY2VfYWxsb2MoRFJWTkFNRSwgYWRkcmVzcyk7CiAJaWYgKCFwZGV2KSB7CiAJCWVyciA9IC1FTk9NRU07CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL3Ntc2M0N20xLmMgYi9kcml2ZXJzL2h3bW9uL3Ntc2M0N20xLmMKaW5kZXggZDFiNDk4NS4uYTkyZGJiOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9zbXNjNDdtMS5jCisrKyBiL2RyaXZlcnMvaHdtb24vc21zYzQ3bTEuYwpAQCAtMzcsNiArMzcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CisjaW5jbHVkZSA8bGludXgvYWNwaS5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogCiBzdGF0aWMgdW5zaWduZWQgc2hvcnQgZm9yY2VfaWQ7CkBAIC03MDUsNiArNzA2LDEwIEBACiAJfTsKIAlpbnQgZXJyOwogCisJZXJyID0gYWNwaV9jaGVja19yZXNvdXJjZV9jb25mbGljdCgmcmVzKTsKKwlpZiAoZXJyKQorCQlnb3RvIGV4aXQ7CisKIAlwZGV2ID0gcGxhdGZvcm1fZGV2aWNlX2FsbG9jKERSVk5BTUUsIGFkZHJlc3MpOwogCWlmICghcGRldikgewogCQllcnIgPSAtRU5PTUVNOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi92aWE2ODZhLmMgYi9kcml2ZXJzL2h3bW9uL3ZpYTY4NmEuYwppbmRleCBmMWVlNWU3Li5hMDIyYWVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL3ZpYTY4NmEuYworKysgYi9kcml2ZXJzL2h3bW9uL3ZpYTY4NmEuYwpAQCAtNDEsNiArNDEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CisjaW5jbHVkZSA8bGludXgvYWNwaS5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogCiAKQEAgLTc4Myw2ICs3ODQsMTAgQEAKIAl9OwogCWludCBlcnI7CiAKKwllcnIgPSBhY3BpX2NoZWNrX3Jlc291cmNlX2NvbmZsaWN0KCZyZXMpOworCWlmIChlcnIpCisJCWdvdG8gZXhpdDsKKwogCXBkZXYgPSBwbGF0Zm9ybV9kZXZpY2VfYWxsb2MoInZpYTY4NmEiLCBhZGRyZXNzKTsKIAlpZiAoIXBkZXYpIHsKIAkJZXJyID0gLUVOT01FTTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vdnQxMjExLmMgYi9kcml2ZXJzL2h3bW9uL3Z0MTIxMS5jCmluZGV4IDEyYjQzNTkuLmIwY2UzNzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vdnQxMjExLmMKKysrIGIvZHJpdmVycy9od21vbi92dDEyMTEuYwpAQCAtMzIsNiArMzIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvYWNwaS5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogCiBzdGF0aWMgaW50IHVjaF9jb25maWcgPSAtMTsKQEAgLTEyNTksNiArMTI2MCwxMCBAQAogCX0KIAogCXJlcy5uYW1lID0gcGRldi0+bmFtZTsKKwllcnIgPSBhY3BpX2NoZWNrX3Jlc291cmNlX2NvbmZsaWN0KCZyZXMpOworCWlmIChlcnIpCisJCWdvdG8gRVhJVDsKKwogCWVyciA9IHBsYXRmb3JtX2RldmljZV9hZGRfcmVzb3VyY2VzKHBkZXYsICZyZXMsIDEpOwogCWlmIChlcnIpIHsKIAkJcHJpbnRrKEtFUk5fRVJSIERSVk5BTUUgIjogRGV2aWNlIHJlc291cmNlIGFkZGl0aW9uIGZhaWxlZCAiCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL3Z0ODIzMS5jIGIvZHJpdmVycy9od21vbi92dDgyMzEuYwppbmRleCA1YmM1NzI3Li45OTgyYjQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL3Z0ODIzMS5jCisrKyBiL2RyaXZlcnMvaHdtb24vdnQ4MjMxLmMKQEAgLTM1LDYgKzM1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9od21vbi12aWQuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KIAogc3RhdGljIGludCBmb3JjZV9hZGRyOwpAQCAtODk0LDYgKzg5NSwxMCBAQAogCX07CiAJaW50IGVycjsKIAorCWVyciA9IGFjcGlfY2hlY2tfcmVzb3VyY2VfY29uZmxpY3QoJnJlcyk7CisJaWYgKGVycikKKwkJZ290byBleGl0OworCiAJcGRldiA9IHBsYXRmb3JtX2RldmljZV9hbGxvYygidnQ4MjMxIiwgYWRkcmVzcyk7CiAJaWYgKCFwZGV2KSB7CiAJCWVyciA9IC1FTk9NRU07CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL3c4MzYyN2VoZi5jIGIvZHJpdmVycy9od21vbi93ODM2MjdlaGYuYwppbmRleCAwNzUxNjRkLi5jYjgwOGQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL3c4MzYyN2VoZi5jCisrKyBiL2RyaXZlcnMvaHdtb24vdzgzNjI3ZWhmLmMKQEAgLTQ4LDYgKzQ4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9od21vbi12aWQuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlICJsbTc1LmgiCiAKQEAgLTUwMiw3ICs1MDMsNyBAQAogCQl9CiAKIAkJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgewotCQkJLyogcHdtY2ZnLCB0b2xhcmFuY2UgbWFwcGVkIGZvciBpPTAsIGk9MSB0byBzYW1lIHJlZyAqLworCQkJLyogcHdtY2ZnLCB0b2xlcmFuY2UgbWFwcGVkIGZvciBpPTAsIGk9MSB0byBzYW1lIHJlZyAqLwogCQkJaWYgKGkgIT0gMSkgewogCQkJCXB3bWNmZyA9IHc4MzYyN2VoZl9yZWFkX3ZhbHVlKGRhdGEsCiAJCQkJCQlXODM2MjdFSEZfUkVHX1BXTV9FTkFCTEVbaV0pOwpAQCAtMTU0NCw2ICsxNTQ1LDExIEBACiAJcmVzLnN0YXJ0ID0gYWRkcmVzcyArIElPUkVHSU9OX09GRlNFVDsKIAlyZXMuZW5kID0gYWRkcmVzcyArIElPUkVHSU9OX09GRlNFVCArIElPUkVHSU9OX0xFTkdUSCAtIDE7CiAJcmVzLmZsYWdzID0gSU9SRVNPVVJDRV9JTzsKKworCWVyciA9IGFjcGlfY2hlY2tfcmVzb3VyY2VfY29uZmxpY3QoJnJlcyk7CisJaWYgKGVycikKKwkJZ290byBleGl0OworCiAJZXJyID0gcGxhdGZvcm1fZGV2aWNlX2FkZF9yZXNvdXJjZXMocGRldiwgJnJlcywgMSk7CiAJaWYgKGVycikgewogCQlwcmludGsoS0VSTl9FUlIgRFJWTkFNRSAiOiBEZXZpY2UgcmVzb3VyY2UgYWRkaXRpb24gZmFpbGVkICIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vdzgzNjI3aGYuYyBiL2RyaXZlcnMvaHdtb24vdzgzNjI3aGYuYwppbmRleCBiMzBlNTc5Li4zODkxNTBiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL3c4MzYyN2hmLmMKKysrIGIvZHJpdmVycy9od21vbi93ODM2MjdoZi5jCkBAIC01MCw2ICs1MCw3IEBACiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9hY3BpLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSAibG03NS5oIgogCkBAIC0xNzkzLDYgKzE3OTQsMTAgQEAKIAl9OwogCWludCBlcnI7CiAKKwllcnIgPSBhY3BpX2NoZWNrX3Jlc291cmNlX2NvbmZsaWN0KCZyZXMpOworCWlmIChlcnIpCisJCWdvdG8gZXhpdDsKKwogCXBkZXYgPSBwbGF0Zm9ybV9kZXZpY2VfYWxsb2MoRFJWTkFNRSwgYWRkcmVzcyk7CiAJaWYgKCFwZGV2KSB7CiAJCWVyciA9IC1FTk9NRU07CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL3c4Mzc4MWQuYyBiL2RyaXZlcnMvaHdtb24vdzgzNzgxZC5jCmluZGV4IGZjMTJiZDQuLmRiZmIzMGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vdzgzNzgxZC5jCisrKyBiL2RyaXZlcnMvaHdtb24vdzgzNzgxZC5jCkBAIC01OCw3ICs1OCwxMCBAQAogCQkJCQkJMHgyZSwgMHgyZiwgSTJDX0NMSUVOVF9FTkQgfTsKIC8qIEluc21vZCBwYXJhbWV0ZXJzICovCiBJMkNfQ0xJRU5UX0lOU01PRF80KHc4Mzc4MWQsIHc4Mzc4MmQsIHc4Mzc4M3MsIGFzOTkxMjdmKTsKLUkyQ19DTElFTlRfTU9EVUxFX1BBUk0oZm9yY2Vfc3ViY2xpZW50cywgIkxpc3Qgb2Ygc3ViY2xpZW50IGFkZHJlc3NlczogIgorCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgZm9yY2Vfc3ViY2xpZW50c1s0XTsKK21vZHVsZV9wYXJhbV9hcnJheShmb3JjZV9zdWJjbGllbnRzLCBzaG9ydCwgTlVMTCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGZvcmNlX3N1YmNsaWVudHMsICJMaXN0IG9mIHN1YmNsaWVudCBhZGRyZXNzZXM6ICIKIAkJICAgICJ7YnVzLCBjbGllbnRhZGRyLCBzdWJjbGllbnRhZGRyMSwgc3ViY2xpZW50YWRkcjJ9Iik7CiAKIHN0YXRpYyBpbnQgcmVzZXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL3c4Mzc5MWQuYyBiL2RyaXZlcnMvaHdtb24vdzgzNzkxZC5jCmluZGV4IDU3NjhkZWYuLjk3ODUxYzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vdzgzNzkxZC5jCisrKyBiL2RyaXZlcnMvaHdtb24vdzgzNzkxZC5jCkBAIC01Myw3ICs1MywxMCBAQAogCiAvKiBJbnNtb2QgcGFyYW1ldGVycyAqLwogSTJDX0NMSUVOVF9JTlNNT0RfMSh3ODM3OTFkKTsKLUkyQ19DTElFTlRfTU9EVUxFX1BBUk0oZm9yY2Vfc3ViY2xpZW50cywgIkxpc3Qgb2Ygc3ViY2xpZW50IGFkZHJlc3NlczogIgorCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgZm9yY2Vfc3ViY2xpZW50c1s0XTsKK21vZHVsZV9wYXJhbV9hcnJheShmb3JjZV9zdWJjbGllbnRzLCBzaG9ydCwgTlVMTCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGZvcmNlX3N1YmNsaWVudHMsICJMaXN0IG9mIHN1YmNsaWVudCBhZGRyZXNzZXM6ICIKIAkJCSJ7YnVzLCBjbGllbnRhZGRyLCBzdWJjbGllbnRhZGRyMSwgc3ViY2xpZW50YWRkcjJ9Iik7CiAKIHN0YXRpYyBpbnQgcmVzZXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL3c4Mzc5MmQuYyBiL2RyaXZlcnMvaHdtb24vdzgzNzkyZC5jCmluZGV4IGNmOTRjNWIuLjJiZTE2MTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vdzgzNzkyZC5jCisrKyBiL2RyaXZlcnMvaHdtb24vdzgzNzkyZC5jCkBAIC01MSw3ICs1MSwxMCBAQAogCiAvKiBJbnNtb2QgcGFyYW1ldGVycyAqLwogSTJDX0NMSUVOVF9JTlNNT0RfMSh3ODM3OTJkKTsKLUkyQ19DTElFTlRfTU9EVUxFX1BBUk0oZm9yY2Vfc3ViY2xpZW50cywgIkxpc3Qgb2Ygc3ViY2xpZW50IGFkZHJlc3NlczogIgorCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgZm9yY2Vfc3ViY2xpZW50c1s0XTsKK21vZHVsZV9wYXJhbV9hcnJheShmb3JjZV9zdWJjbGllbnRzLCBzaG9ydCwgTlVMTCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGZvcmNlX3N1YmNsaWVudHMsICJMaXN0IG9mIHN1YmNsaWVudCBhZGRyZXNzZXM6ICIKIAkJCSJ7YnVzLCBjbGllbnRhZGRyLCBzdWJjbGllbnRhZGRyMSwgc3ViY2xpZW50YWRkcjJ9Iik7CiAKIHN0YXRpYyBpbnQgaW5pdDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vdzgzNzkzLmMgYi9kcml2ZXJzL2h3bW9uL3c4Mzc5My5jCmluZGV4IDBhNzM5ZjEuLjQ3ZGQzOTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vdzgzNzkzLmMKKysrIGIvZHJpdmVycy9od21vbi93ODM3OTMuYwpAQCAtNDIsNyArNDIsMTAgQEAKIAogLyogSW5zbW9kIHBhcmFtZXRlcnMgKi8KIEkyQ19DTElFTlRfSU5TTU9EXzEodzgzNzkzKTsKLUkyQ19DTElFTlRfTU9EVUxFX1BBUk0oZm9yY2Vfc3ViY2xpZW50cywgIkxpc3Qgb2Ygc3ViY2xpZW50IGFkZHJlc3NlczogIgorCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgZm9yY2Vfc3ViY2xpZW50c1s0XTsKK21vZHVsZV9wYXJhbV9hcnJheShmb3JjZV9zdWJjbGllbnRzLCBzaG9ydCwgTlVMTCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGZvcmNlX3N1YmNsaWVudHMsICJMaXN0IG9mIHN1YmNsaWVudCBhZGRyZXNzZXM6ICIKIAkJICAgICAgICJ7YnVzLCBjbGllbnRhZGRyLCBzdWJjbGllbnRhZGRyMSwgc3ViY2xpZW50YWRkcjJ9Iik7CiAKIHN0YXRpYyBpbnQgcmVzZXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWFsaTE1NjMuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtYWxpMTU2My5jCmluZGV4IGZjM2U1YjAuLmRkOWU3OTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtYWxpMTU2My5jCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtYWxpMTU2My5jCkBAIC0zOTksOCArMzk5LDggQEAKIAlpZiAoKGVycm9yID0gYWxpMTU2M19zZXR1cChkZXYpKSkKIAkJZ290byBleGl0OwogCWFsaTE1NjNfYWRhcHRlci5kZXYucGFyZW50ID0gJmRldi0+ZGV2OwotCXNwcmludGYoYWxpMTU2M19hZGFwdGVyLm5hbWUsIlNNQnVzIEFMaSAxNTYzIEFkYXB0ZXIgQCAlMDR4IiwKLQkJYWxpMTU2M19zbWJhKTsKKwlzbnByaW50ZihhbGkxNTYzX2FkYXB0ZXIubmFtZSwgc2l6ZW9mKGFsaTE1NjNfYWRhcHRlci5uYW1lKSwKKwkJICJTTUJ1cyBBTGkgMTU2MyBBZGFwdGVyIEAgJTA0eCIsIGFsaTE1NjNfc21iYSk7CiAJaWYgKChlcnJvciA9IGkyY19hZGRfYWRhcHRlcigmYWxpMTU2M19hZGFwdGVyKSkpCiAJCWdvdG8gZXhpdF9zaHV0ZG93bjsKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtYW1kNzU2LXM0ODgyLmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWFtZDc1Ni1zNDg4Mi5jCmluZGV4IDhiYTJiY2YuLjM3OGZjYjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtYW1kNzU2LXM0ODgyLmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1hbWQ3NTYtczQ4ODIuYwpAQCAtMTk3LDggKzE5Nyw4IEBACiAJZm9yIChpID0gMTsgaSA8IDU7IGkrKykgewogCQlzNDg4Ml9hbGdvW2ldID0gKihhbWQ3NTZfc21idXMuYWxnbyk7CiAJCXM0ODgyX2FkYXB0ZXJbaV0gPSBhbWQ3NTZfc21idXM7Ci0JCXNwcmludGYoczQ4ODJfYWRhcHRlcltpXS5uYW1lLAotCQkJIlNNQnVzIDgxMTEgYWRhcHRlciAoQ1BVJWQpIiwgaS0xKTsKKwkJc25wcmludGYoczQ4ODJfYWRhcHRlcltpXS5uYW1lLCBzaXplb2YoczQ4ODJfYWRhcHRlcltpXS5uYW1lKSwKKwkJCSAiU01CdXMgODExMSBhZGFwdGVyIChDUFUlZCkiLCBpLTEpOwogCQlzNDg4Ml9hZGFwdGVyW2ldLmFsZ28gPSBzNDg4Ml9hbGdvK2k7CiAJCXM0ODgyX2FkYXB0ZXJbaV0uZGV2LnBhcmVudCA9IGFtZDc1Nl9zbWJ1cy5kZXYucGFyZW50OwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtYW1kNzU2LmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWFtZDc1Ni5jCmluZGV4IDQyNGRhZDYuLjM2YmVlNWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtYW1kNzU2LmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1hbWQ3NTYuYwpAQCAtMzgwLDggKzM4MCw5IEBACiAJLyogc2V0IHVwIHRoZSBzeXNmcyBsaW5rYWdlIHRvIG91ciBwYXJlbnQgZGV2aWNlICovCiAJYW1kNzU2X3NtYnVzLmRldi5wYXJlbnQgPSAmcGRldi0+ZGV2OwogCi0Jc3ByaW50ZihhbWQ3NTZfc21idXMubmFtZSwgIlNNQnVzICVzIGFkYXB0ZXIgYXQgJTA0eCIsCi0JCWNoaXBuYW1lW2lkLT5kcml2ZXJfZGF0YV0sIGFtZDc1Nl9pb3BvcnQpOworCXNucHJpbnRmKGFtZDc1Nl9zbWJ1cy5uYW1lLCBzaXplb2YoYW1kNzU2X3NtYnVzLm5hbWUpLAorCQkgIlNNQnVzICVzIGFkYXB0ZXIgYXQgJTA0eCIsIGNoaXBuYW1lW2lkLT5kcml2ZXJfZGF0YV0sCisJCSBhbWQ3NTZfaW9wb3J0KTsKIAogCWVycm9yID0gaTJjX2FkZF9hZGFwdGVyKCZhbWQ3NTZfc21idXMpOwogCWlmIChlcnJvcikgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1hdDkxLmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWF0OTEuYwppbmRleCA5ZWZiMDIxLi42N2Q5ZGM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWF0OTEuYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWF0OTEuYwpAQCAtMjIyLDcgKzIyMiw3IEBACiAJCXJjID0gLUVOT01FTTsKIAkJZ290byBmYWlsMjsKIAl9Ci0Jc3ByaW50ZihhZGFwdGVyLT5uYW1lLCAiQVQ5MSIpOworCXNucHJpbnRmKGFkYXB0ZXItPm5hbWUsIHNpemVvZihhZGFwdGVyLT5uYW1lKSwgIkFUOTEiKTsKIAlhZGFwdGVyLT5hbGdvID0gJmF0OTFfYWxnb3JpdGhtOwogCWFkYXB0ZXItPmNsYXNzID0gSTJDX0NMQVNTX0hXTU9OOwogCWFkYXB0ZXItPmRldi5wYXJlbnQgPSAmcGRldi0+ZGV2OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1iZmluLXR3aS5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1iZmluLXR3aS5jCmluZGV4IDNjODU1ZmYuLjNmZDJjNDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtYmZpbi10d2kuYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWJmaW4tdHdpLmMKQEAgLTY1Niw3ICs2NTYsNyBAQAogCXN0cmxjcHkocF9hZGFwLT5uYW1lLCBwZGV2LT5uYW1lLCBzaXplb2YocF9hZGFwLT5uYW1lKSk7CiAJcF9hZGFwLT5hbGdvID0gJmJmaW5fdHdpX2FsZ29yaXRobTsKIAlwX2FkYXAtPmFsZ29fZGF0YSA9IGlmYWNlOwotCXBfYWRhcC0+Y2xhc3MgPSBJMkNfQ0xBU1NfQUxMOworCXBfYWRhcC0+Y2xhc3MgPSBJMkNfQ0xBU1NfSFdNT04gfCBJMkNfQ0xBU1NfU1BEOwogCXBfYWRhcC0+ZGV2LnBhcmVudCA9ICZwZGV2LT5kZXY7CiAKIAlyYyA9IHBlcmlwaGVyYWxfcmVxdWVzdF9saXN0KHBpbl9yZXFbcGRldi0+aWRdLCAiaTJjLWJmaW4tdHdpIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWk4MDEuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtaTgwMS5jCmluZGV4IDUxMjNlYjYuLjUyNjYyNWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtaTgwMS5jCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtaTgwMS5jCkBAIC02NCw3ICs2NCw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgogI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogCiAvKiBJODAxIFNNQnVzIGFkZHJlc3Mgb2Zmc2V0cyAqLwogI2RlZmluZSBTTUJIU1RTVFMJKDAgKyBpODAxX3NtYmEpCkBAIC01ODMsNiArNTgzLDQwIEBACiAKIE1PRFVMRV9ERVZJQ0VfVEFCTEUgKHBjaSwgaTgwMV9pZHMpOwogCisjaWYgZGVmaW5lZCBDT05GSUdfSU5QVVRfQVBBTkVMIHx8IGRlZmluZWQgQ09ORklHX0lOUFVUX0FQQU5FTF9NT0RVTEUKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGFwYW5lbF9hZGRyOworCisvKiBTY2FuIHRoZSBzeXN0ZW0gUk9NIGZvciB0aGUgc2lnbmF0dXJlICJGSktFWUlORiIgKi8KK3N0YXRpYyBfX2luaXQgY29uc3Qgdm9pZCBfX2lvbWVtICpiaW9zX3NpZ25hdHVyZShjb25zdCB2b2lkIF9faW9tZW0gKmJpb3MpCit7CisJc3NpemVfdCBvZmZzZXQ7CisJY29uc3QgdW5zaWduZWQgY2hhciBzaWduYXR1cmVbXSA9ICJGSktFWUlORiI7CisKKwlmb3IgKG9mZnNldCA9IDA7IG9mZnNldCA8IDB4MTAwMDA7IG9mZnNldCArPSAweDEwKSB7CisJCWlmIChjaGVja19zaWduYXR1cmUoYmlvcyArIG9mZnNldCwgc2lnbmF0dXJlLAorCQkJCSAgICBzaXplb2Yoc2lnbmF0dXJlKS0xKSkKKwkJCXJldHVybiBiaW9zICsgb2Zmc2V0OworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgX19pbml0IGlucHV0X2FwYW5lbF9pbml0KHZvaWQpCit7CisJdm9pZCBfX2lvbWVtICpiaW9zOworCWNvbnN0IHZvaWQgX19pb21lbSAqcDsKKworCWJpb3MgPSBpb3JlbWFwKDB4RjAwMDAsIDB4MTAwMDApOyAvKiBDYW4ndCBmYWlsICovCisJcCA9IGJpb3Nfc2lnbmF0dXJlKGJpb3MpOworCWlmIChwKSB7CisJCS8qIGp1c3QgdXNlIHRoZSBmaXJzdCBhZGRyZXNzICovCisJCWFwYW5lbF9hZGRyID0gcmVhZGIocCArIDggKyAzKSA+PiAxOworCX0KKwlpb3VubWFwKGJpb3MpOworfQorI2Vsc2UKK3N0YXRpYyB2b2lkIF9faW5pdCBpbnB1dF9hcGFuZWxfaW5pdCh2b2lkKSB7fQorI2VuZGlmCisKIHN0YXRpYyBpbnQgX19kZXZpbml0IGk4MDFfcHJvYmUoc3RydWN0IHBjaV9kZXYgKmRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQogewogCXVuc2lnbmVkIGNoYXIgdGVtcDsKQEAgLTY2Nyw2ICs3MDEsMTkgQEAKIAkJZGV2X2VycigmZGV2LT5kZXYsICJGYWlsZWQgdG8gYWRkIFNNQnVzIGFkYXB0ZXJcbiIpOwogCQlnb3RvIGV4aXRfcmVsZWFzZTsKIAl9CisKKwkvKiBSZWdpc3RlciBvcHRpb25hbCBzbGF2ZXMgKi8KKyNpZiBkZWZpbmVkIENPTkZJR19JTlBVVF9BUEFORUwgfHwgZGVmaW5lZCBDT05GSUdfSU5QVVRfQVBBTkVMX01PRFVMRQorCWlmIChhcGFuZWxfYWRkcikgeworCQlzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gaW5mbzsKKworCQltZW1zZXQoJmluZm8sIDAsIHNpemVvZihzdHJ1Y3QgaTJjX2JvYXJkX2luZm8pKTsKKwkJaW5mby5hZGRyID0gYXBhbmVsX2FkZHI7CisJCXN0cmxjcHkoaW5mby50eXBlLCAiZnVqaXRzdV9hcGFuZWwiLCBJMkNfTkFNRV9TSVpFKTsKKwkJaTJjX25ld19kZXZpY2UoJmk4MDFfYWRhcHRlciwgJmluZm8pOworCX0KKyNlbmRpZgorCiAJcmV0dXJuIDA7CiAKIGV4aXRfcmVsZWFzZToKQEAgLTcxNyw2ICs3NjQsNyBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBpMmNfaTgwMV9pbml0KHZvaWQpCiB7CisJaW5wdXRfYXBhbmVsX2luaXQoKTsKIAlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmaTgwMV9kcml2ZXIpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLW9tYXAuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtb21hcC5jCmluZGV4IDYwODAzOGQuLmJlOGVlMmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtb21hcC5jCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtb21hcC5jCkBAIC0yLDEzICsyLDE2IEBACiAgKiBUSSBPTUFQIEkyQyBtYXN0ZXIgbW9kZSBkcml2ZXIKICAqCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDMgTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLgotICogQ29weXJpZ2h0IChDKSAyMDA0IFRleGFzIEluc3RydW1lbnRzLgotICoKLSAqIFVwZGF0ZWQgdG8gd29yayB3aXRoIG11bHRpcGxlIEkyQyBpbnRlcmZhY2VzIG9uIDI0eHggYnkKLSAqIFRvbnkgTGluZGdyZW4gPHRvbnlAYXRvbWlkZS5jb20+IGFuZCBJbXJlIERlYWsgPGltcmUuZGVha0Bub2tpYS5jb20+CiAgKiBDb3B5cmlnaHQgKEMpIDIwMDUgTm9raWEgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoQykgMjAwNCAtIDIwMDcgVGV4YXMgSW5zdHJ1bWVudHMuCiAgKgotICogQ2xlYW5lZCB1cCBieSBKdWhhIFlyasO2bMOkIDxqdWhhLnlyam9sYUBub2tpYS5jb20+CisgKiBPcmlnaW5hbGx5IHdyaXR0ZW4gYnkgTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLgorICogQWRkaXRpb25hbCBjb250cmlidXRpb25zIGJ5OgorICoJVG9ueSBMaW5kZ3JlbiA8dG9ueUBhdG9taWRlLmNvbT4KKyAqCUltcmUgRGVhayA8aW1yZS5kZWFrQG5va2lhLmNvbT4KKyAqCUp1aGEgWXJqw7Zsw6QgPGp1aGEueXJqb2xhQHNvbGlkYm9vdC5jb20+CisgKglTeWVkIEtoYXNpbSA8eDBraGFzaW1AdGkuY29tPgorICoJTmlzaGFudCBNZW5vbiA8bm1AdGkuY29tPgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQpAQCAtMzMsOCArMzYsMTQgQEAKICNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KIAotI2luY2x1ZGUgPGFzbS9pby5oPgorLyogSTJDIGNvbnRyb2xsZXIgcmV2aXNpb25zICovCisjZGVmaW5lIE9NQVBfSTJDX1JFVl8yCQkJMHgyMAorCisvKiBJMkMgY29udHJvbGxlciByZXZpc2lvbnMgcHJlc2VudCBvbiBzcGVjaWZpYyBoYXJkd2FyZSAqLworI2RlZmluZSBPTUFQX0kyQ19SRVZfT05fMjQzMAkJMHgzNgorI2RlZmluZSBPTUFQX0kyQ19SRVZfT05fMzQzMAkJMHgzQwogCiAvKiB0aW1lb3V0IHdhaXRpbmcgZm9yIHRoZSBjb250cm9sbGVyIHRvIHJlc3BvbmQgKi8KICNkZWZpbmUgT01BUF9JMkNfVElNRU9VVCAobXNlY3NfdG9famlmZmllcygxMDAwKSkKQEAgLTQzLDYgKzUyLDggQEAKICNkZWZpbmUgT01BUF9JMkNfSUVfUkVHCQkJMHgwNAogI2RlZmluZSBPTUFQX0kyQ19TVEFUX1JFRwkJMHgwOAogI2RlZmluZSBPTUFQX0kyQ19JVl9SRUcJCQkweDBjCisvKiBGb3IgT01BUDMgSTJDX0lWIGhhcyBjaGFuZ2VkIHRvIEkyQ19XRSAod2FrZXVwIGVuYWJsZSkgKi8KKyNkZWZpbmUgT01BUF9JMkNfV0VfUkVHCQkJMHgwYwogI2RlZmluZSBPTUFQX0kyQ19TWVNTX1JFRwkJMHgxMAogI2RlZmluZSBPTUFQX0kyQ19CVUZfUkVHCQkweDE0CiAjZGVmaW5lIE9NQVBfSTJDX0NOVF9SRUcJCTB4MTgKQEAgLTU1LDggKzY2LDExIEBACiAjZGVmaW5lIE9NQVBfSTJDX1NDTExfUkVHCQkweDM0CiAjZGVmaW5lIE9NQVBfSTJDX1NDTEhfUkVHCQkweDM4CiAjZGVmaW5lIE9NQVBfSTJDX1NZU1RFU1RfUkVHCQkweDNjCisjZGVmaW5lIE9NQVBfSTJDX0JVRlNUQVRfUkVHCQkweDQwCiAKIC8qIEkyQyBJbnRlcnJ1cHQgRW5hYmxlIFJlZ2lzdGVyIChPTUFQX0kyQ19JRSk6ICovCisjZGVmaW5lIE9NQVBfSTJDX0lFX1hEUgkJKDEgPDwgMTQpCS8qIFRYIEJ1ZmZlciBkcmFpbiBpbnQgZW5hYmxlICovCisjZGVmaW5lIE9NQVBfSTJDX0lFX1JEUgkJKDEgPDwgMTMpCS8qIFJYIEJ1ZmZlciBkcmFpbiBpbnQgZW5hYmxlICovCiAjZGVmaW5lIE9NQVBfSTJDX0lFX1hSRFkJKDEgPDwgNCkJLyogVFggZGF0YSByZWFkeSBpbnQgZW5hYmxlICovCiAjZGVmaW5lIE9NQVBfSTJDX0lFX1JSRFkJKDEgPDwgMykJLyogUlggZGF0YSByZWFkeSBpbnQgZW5hYmxlICovCiAjZGVmaW5lIE9NQVBfSTJDX0lFX0FSRFkJKDEgPDwgMikJLyogQWNjZXNzIHJlYWR5IGludCBlbmFibGUgKi8KQEAgLTY0LDcgKzc4LDggQEAKICNkZWZpbmUgT01BUF9JMkNfSUVfQUwJCSgxIDw8IDApCS8qIEFyYml0cmF0aW9uIGxvc3QgaW50IGVuYSAqLwogCiAvKiBJMkMgU3RhdHVzIFJlZ2lzdGVyIChPTUFQX0kyQ19TVEFUKTogKi8KLSNkZWZpbmUgT01BUF9JMkNfU1RBVF9TQkQJKDEgPDwgMTUpCS8qIFNpbmdsZSBieXRlIGRhdGEgKi8KKyNkZWZpbmUgT01BUF9JMkNfU1RBVF9YRFIJKDEgPDwgMTQpCS8qIFRYIEJ1ZmZlciBkcmFpbmluZyAqLworI2RlZmluZSBPTUFQX0kyQ19TVEFUX1JEUgkoMSA8PCAxMykJLyogUlggQnVmZmVyIGRyYWluaW5nICovCiAjZGVmaW5lIE9NQVBfSTJDX1NUQVRfQkIJKDEgPDwgMTIpCS8qIEJ1cyBidXN5ICovCiAjZGVmaW5lIE9NQVBfSTJDX1NUQVRfUk9WUgkoMSA8PCAxMSkJLyogUmVjZWl2ZSBvdmVycnVuICovCiAjZGVmaW5lIE9NQVBfSTJDX1NUQVRfWFVERgkoMSA8PCAxMCkJLyogVHJhbnNtaXQgdW5kZXJmbG93ICovCkBAIC03NiwxMyArOTEsMzQgQEAKICNkZWZpbmUgT01BUF9JMkNfU1RBVF9OQUNLCSgxIDw8IDEpCS8qIE5vIGFjayBpbnRlcnJ1cHQgZW5hYmxlICovCiAjZGVmaW5lIE9NQVBfSTJDX1NUQVRfQUwJKDEgPDwgMCkJLyogQXJiaXRyYXRpb24gbG9zdCBpbnQgZW5hICovCiAKKy8qIEkyQyBXRSB3YWtldXAgZW5hYmxlIHJlZ2lzdGVyICovCisjZGVmaW5lIE9NQVBfSTJDX1dFX1hEUl9XRQkoMSA8PCAxNCkJLyogVFggZHJhaW4gd2FrdXAgKi8KKyNkZWZpbmUgT01BUF9JMkNfV0VfUkRSX1dFCSgxIDw8IDEzKQkvKiBSWCBkcmFpbiB3YWtldXAgKi8KKyNkZWZpbmUgT01BUF9JMkNfV0VfQUFTX1dFCSgxIDw8IDkpCS8qIEFkZHJlc3MgYXMgc2xhdmUgd2FrZXVwKi8KKyNkZWZpbmUgT01BUF9JMkNfV0VfQkZfV0UJKDEgPDwgOCkJLyogQnVzIGZyZWUgd2FrZXVwICovCisjZGVmaW5lIE9NQVBfSTJDX1dFX1NUQ19XRQkoMSA8PCA2KQkvKiBTdGFydCBjb25kaXRpb24gd2FrZXVwICovCisjZGVmaW5lIE9NQVBfSTJDX1dFX0dDX1dFCSgxIDw8IDUpCS8qIEdlbmVyYWwgY2FsbCB3YWtldXAgKi8KKyNkZWZpbmUgT01BUF9JMkNfV0VfRFJEWV9XRQkoMSA8PCAzKQkvKiBUWC9SWCBkYXRhIHJlYWR5IHdha2V1cCAqLworI2RlZmluZSBPTUFQX0kyQ19XRV9BUkRZX1dFCSgxIDw8IDIpCS8qIFJlZyBhY2Nlc3MgcmVhZHkgd2FrZXVwICovCisjZGVmaW5lIE9NQVBfSTJDX1dFX05BQ0tfV0UJKDEgPDwgMSkJLyogTm8gYWNrbm93bGVkZ21lbnQgd2FrZXVwICovCisjZGVmaW5lIE9NQVBfSTJDX1dFX0FMX1dFCSgxIDw8IDApCS8qIEFyYml0cmF0aW9uIGxvc3Qgd2FrZXVwICovCisKKyNkZWZpbmUgT01BUF9JMkNfV0VfQUxMCQkoT01BUF9JMkNfV0VfWERSX1dFIHwgT01BUF9JMkNfV0VfUkRSX1dFIHwgXAorCQkJCU9NQVBfSTJDX1dFX0FBU19XRSB8IE9NQVBfSTJDX1dFX0JGX1dFIHwgXAorCQkJCU9NQVBfSTJDX1dFX1NUQ19XRSB8IE9NQVBfSTJDX1dFX0dDX1dFIHwgXAorCQkJCU9NQVBfSTJDX1dFX0RSRFlfV0UgfCBPTUFQX0kyQ19XRV9BUkRZX1dFIHwgXAorCQkJCU9NQVBfSTJDX1dFX05BQ0tfV0UgfCBPTUFQX0kyQ19XRV9BTF9XRSkKKwogLyogSTJDIEJ1ZmZlciBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIChPTUFQX0kyQ19CVUYpOiAqLwogI2RlZmluZSBPTUFQX0kyQ19CVUZfUkRNQV9FTgkoMSA8PCAxNSkJLyogUlggRE1BIGNoYW5uZWwgZW5hYmxlICovCisjZGVmaW5lIE9NQVBfSTJDX0JVRl9SWEZJRl9DTFIJKDEgPDwgMTQpCS8qIFJYIEZJRk8gQ2xlYXIgKi8KICNkZWZpbmUgT01BUF9JMkNfQlVGX1hETUFfRU4JKDEgPDwgNykJLyogVFggRE1BIGNoYW5uZWwgZW5hYmxlICovCisjZGVmaW5lIE9NQVBfSTJDX0JVRl9UWEZJRl9DTFIJKDEgPDwgNikJLyogVFggRklGTyBDbGVhciAqLwogCiAvKiBJMkMgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAoT01BUF9JMkNfQ09OKTogKi8KICNkZWZpbmUgT01BUF9JMkNfQ09OX0VOCQkoMSA8PCAxNSkJLyogSTJDIG1vZHVsZSBlbmFibGUgKi8KICNkZWZpbmUgT01BUF9JMkNfQ09OX0JFCQkoMSA8PCAxNCkJLyogQmlnIGVuZGlhbiBtb2RlICovCisjZGVmaW5lIE9NQVBfSTJDX0NPTl9PUE1PREVfSFMJKDEgPDwgMTIpCS8qIEhpZ2ggU3BlZWQgc3VwcG9ydCAqLwogI2RlZmluZSBPTUFQX0kyQ19DT05fU1RCCSgxIDw8IDExKQkvKiBTdGFydCBieXRlIG1vZGUgKG1hc3RlcikgKi8KICNkZWZpbmUgT01BUF9JMkNfQ09OX01TVAkoMSA8PCAxMCkJLyogTWFzdGVyL3NsYXZlIG1vZGUgKi8KICNkZWZpbmUgT01BUF9JMkNfQ09OX1RSWAkoMSA8PCA5KQkvKiBUWC9SWCBtb2RlIChtYXN0ZXIgb25seSkgKi8KQEAgLTkxLDYgKzEyNywxMCBAQAogI2RlZmluZSBPTUFQX0kyQ19DT05fU1RQCSgxIDw8IDEpCS8qIFN0b3AgY29uZCAobWFzdGVyIG9ubHkpICovCiAjZGVmaW5lIE9NQVBfSTJDX0NPTl9TVFQJKDEgPDwgMCkJLyogU3RhcnQgY29uZGl0aW9uIChtYXN0ZXIpICovCiAKKy8qIEkyQyBTQ0wgdGltZSB2YWx1ZSB3aGVuIE1hc3RlciAqLworI2RlZmluZSBPTUFQX0kyQ19TQ0xMX0hTU0NMTAk4CisjZGVmaW5lIE9NQVBfSTJDX1NDTEhfSFNTQ0xICTgKKwogLyogSTJDIFN5c3RlbSBUZXN0IFJlZ2lzdGVyIChPTUFQX0kyQ19TWVNURVNUKTogKi8KICNpZmRlZiBERUJVRwogI2RlZmluZSBPTUFQX0kyQ19TWVNURVNUX1NUX0VOCQkoMSA8PCAxNSkJLyogU3lzdGVtIHRlc3QgZW5hYmxlICovCkBAIC0xMDMsMTcgKzE0MywxOSBAQAogI2RlZmluZSBPTUFQX0kyQ19TWVNURVNUX1NEQV9PCQkoMSA8PCAwKQkvKiBTREEgbGluZSBkcml2ZSBvdXQgKi8KICNlbmRpZgogCi0vKiBJMkMgU3lzdGVtIFN0YXR1cyByZWdpc3RlciAoT01BUF9JMkNfU1lTUyk6ICovCi0jZGVmaW5lIE9NQVBfSTJDX1NZU1NfUkRPTkUJCSgxIDw8IDApCS8qIFJlc2V0IERvbmUgKi8KKy8qIE9DUF9TWVNTVEFUVVMgYml0IGRlZmluaXRpb25zICovCisjZGVmaW5lIFNZU1NfUkVTRVRET05FX01BU0sJCSgxIDw8IDApCiAKLS8qIEkyQyBTeXN0ZW0gQ29uZmlndXJhdGlvbiBSZWdpc3RlciAoT01BUF9JMkNfU1lTQyk6ICovCi0jZGVmaW5lIE9NQVBfSTJDX1NZU0NfU1JTVAkJKDEgPDwgMSkJLyogU29mdCBSZXNldCAqLworLyogT0NQX1NZU0NPTkZJRyBiaXQgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgU1lTQ19DTE9DS0FDVElWSVRZX01BU0sJCSgweDMgPDwgOCkKKyNkZWZpbmUgU1lTQ19TSURMRU1PREVfTUFTSwkJKDB4MyA8PCAzKQorI2RlZmluZSBTWVNDX0VOQVdBS0VVUF9NQVNLCQkoMSA8PCAyKQorI2RlZmluZSBTWVNDX1NPRlRSRVNFVF9NQVNLCQkoMSA8PCAxKQorI2RlZmluZSBTWVNDX0FVVE9JRExFX01BU0sJCSgxIDw8IDApCiAKLS8qIFJFVklTSVQ6IFVzZSBwbGF0Zm9ybV9kYXRhIGluc3RlYWQgb2YgbW9kdWxlIHBhcmFtZXRlcnMgKi8KLS8qIEZhc3QgTW9kZSA9IDQwMCBrSHosIFN0YW5kYXJkID0gMTAwIGtIeiAqLwotc3RhdGljIGludCBjbG9jayA9IDEwMDsgLyogRGVmYXVsdDogMTAwIGtIeiAqLwotbW9kdWxlX3BhcmFtKGNsb2NrLCBpbnQsIDApOwotTU9EVUxFX1BBUk1fREVTQyhjbG9jaywgIlNldCBJMkMgY2xvY2sgaW4ga0h6OiA0MDA9ZmFzdCBtb2RlIChkZWZhdWx0ID09IDEwMCkiKTsKKyNkZWZpbmUgU1lTQ19JRExFTU9ERV9TTUFSVAkJMHgyCisjZGVmaW5lIFNZU0NfQ0xPQ0tBQ1RJVklUWV9GQ0xLCQkweDIKKwogCiBzdHJ1Y3Qgb21hcF9pMmNfZGV2IHsKIAlzdHJ1Y3QgZGV2aWNlCQkqZGV2OwpAQCAtMTIzLDExICsxNjUsMTcgQEAKIAlzdHJ1Y3QgY2xrCQkqZmNsazsJCS8qIEZ1bmN0aW9uYWwgY2xvY2sgKi8KIAlzdHJ1Y3QgY29tcGxldGlvbgljbWRfY29tcGxldGU7CiAJc3RydWN0IHJlc291cmNlCQkqaW9hcmVhOworCXUzMgkJCXNwZWVkOwkJLyogU3BlZWQgb2YgYnVzIGluIEtoeiAqLwogCXUxNgkJCWNtZF9lcnI7CiAJdTgJCQkqYnVmOwogCXNpemVfdAkJCWJ1Zl9sZW47CiAJc3RydWN0IGkyY19hZGFwdGVyCWFkYXB0ZXI7Ci0JdW5zaWduZWQJCXJldjE6MTsKKwl1OAkJCWZpZm9fc2l6ZTsJLyogdXNlIGFzIGZsYWcgYW5kIHZhbHVlCisJCQkJCQkgKiBmaWZvX3NpemU9PTAgaW1wbGllcyBubyBmaWZvCisJCQkJCQkgKiBpZiBzZXQsIHNob3VsZCBiZSB0cnNoKzEKKwkJCQkJCSAqLworCXU4CQkJcmV2OworCXVuc2lnbmVkCQliX2h3OjE7CQkvKiBiYWQgaC93IGZpeGVzICovCiAJdW5zaWduZWQJCWlkbGU6MTsKIAl1MTYJCQlpZXN0YXRlOwkvKiBTYXZlZCBpbnRlcnJ1cHQgcmVnaXN0ZXIgKi8KIH07CkBAIC0xNDMsOSArMTkxLDkgQEAKIAlyZXR1cm4gX19yYXdfcmVhZHcoaTJjX2Rldi0+YmFzZSArIHJlZyk7CiB9CiAKLXN0YXRpYyBpbnQgb21hcF9pMmNfZ2V0X2Nsb2NrcyhzdHJ1Y3Qgb21hcF9pMmNfZGV2ICpkZXYpCitzdGF0aWMgaW50IF9faW5pdCBvbWFwX2kyY19nZXRfY2xvY2tzKHN0cnVjdCBvbWFwX2kyY19kZXYgKmRldikKIHsKLQlpZiAoY3B1X2lzX29tYXAxNnh4KCkgfHwgY3B1X2lzX29tYXAyNHh4KCkpIHsKKwlpZiAoY3B1X2lzX29tYXAxNnh4KCkgfHwgY3B1X2NsYXNzX2lzX29tYXAyKCkpIHsKIAkJZGV2LT5pY2xrID0gY2xrX2dldChkZXYtPmRldiwgImkyY19pY2siKTsKIAkJaWYgKElTX0VSUihkZXYtPmljbGspKSB7CiAJCQlkZXYtPmljbGsgPSBOVUxMOwpAQCAtMTc4LDI1ICsyMjYsMzMgQEAKIAogc3RhdGljIHZvaWQgb21hcF9pMmNfdW5pZGxlKHN0cnVjdCBvbWFwX2kyY19kZXYgKmRldikKIHsKKwlXQVJOX09OKCFkZXYtPmlkbGUpOworCiAJaWYgKGRldi0+aWNsayAhPSBOVUxMKQogCQljbGtfZW5hYmxlKGRldi0+aWNsayk7CiAJY2xrX2VuYWJsZShkZXYtPmZjbGspOworCWRldi0+aWRsZSA9IDA7CiAJaWYgKGRldi0+aWVzdGF0ZSkKIAkJb21hcF9pMmNfd3JpdGVfcmVnKGRldiwgT01BUF9JMkNfSUVfUkVHLCBkZXYtPmllc3RhdGUpOwotCWRldi0+aWRsZSA9IDA7CiB9CiAKIHN0YXRpYyB2b2lkIG9tYXBfaTJjX2lkbGUoc3RydWN0IG9tYXBfaTJjX2RldiAqZGV2KQogewogCXUxNiBpdjsKIAotCWRldi0+aWRsZSA9IDE7CisJV0FSTl9PTihkZXYtPmlkbGUpOworCiAJZGV2LT5pZXN0YXRlID0gb21hcF9pMmNfcmVhZF9yZWcoZGV2LCBPTUFQX0kyQ19JRV9SRUcpOwogCW9tYXBfaTJjX3dyaXRlX3JlZyhkZXYsIE9NQVBfSTJDX0lFX1JFRywgMCk7Ci0JaWYgKGRldi0+cmV2MSkKLQkJaXYgPSBvbWFwX2kyY19yZWFkX3JlZyhkZXYsIE9NQVBfSTJDX0lWX1JFRyk7CS8qIFJlYWQgY2xlYXJzICovCi0JZWxzZQorCWlmIChkZXYtPnJldiA8IE9NQVBfSTJDX1JFVl8yKSB7CisJCWl2ID0gb21hcF9pMmNfcmVhZF9yZWcoZGV2LCBPTUFQX0kyQ19JVl9SRUcpOyAvKiBSZWFkIGNsZWFycyAqLworCX0gZWxzZSB7CiAJCW9tYXBfaTJjX3dyaXRlX3JlZyhkZXYsIE9NQVBfSTJDX1NUQVRfUkVHLCBkZXYtPmllc3RhdGUpOworCisJCS8qIEZsdXNoIHBvc3RlZCB3cml0ZSBiZWZvcmUgdGhlIGRldi0+aWRsZSBzdG9yZSBvY2N1cnMgKi8KKwkJb21hcF9pMmNfcmVhZF9yZWcoZGV2LCBPTUFQX0kyQ19TVEFUX1JFRyk7CisJfQorCWRldi0+aWRsZSA9IDE7CiAJY2xrX2Rpc2FibGUoZGV2LT5mY2xrKTsKIAlpZiAoZGV2LT5pY2xrICE9IE5VTEwpCiAJCWNsa19kaXNhYmxlKGRldi0+aWNsayk7CkBAIC0yMDQsMTggKzI2MCwyMCBAQAogCiBzdGF0aWMgaW50IG9tYXBfaTJjX2luaXQoc3RydWN0IG9tYXBfaTJjX2RldiAqZGV2KQogewotCXUxNiBwc2MgPSAwOworCXUxNiBwc2MgPSAwLCBzY2xsID0gMCwgc2NsaCA9IDA7CisJdTE2IGZzc2NsbCA9IDAsIGZzc2NsaCA9IDAsIGhzc2NsbCA9IDAsIGhzc2NsaCA9IDA7CiAJdW5zaWduZWQgbG9uZyBmY2xrX3JhdGUgPSAxMjAwMDAwMDsKIAl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CisJdW5zaWduZWQgbG9uZyBpbnRlcm5hbF9jbGsgPSAwOwogCi0JaWYgKCFkZXYtPnJldjEpIHsKLQkJb21hcF9pMmNfd3JpdGVfcmVnKGRldiwgT01BUF9JMkNfU1lTQ19SRUcsIE9NQVBfSTJDX1NZU0NfU1JTVCk7CisJaWYgKGRldi0+cmV2ID49IE9NQVBfSTJDX1JFVl8yKSB7CisJCW9tYXBfaTJjX3dyaXRlX3JlZyhkZXYsIE9NQVBfSTJDX1NZU0NfUkVHLCBTWVNDX1NPRlRSRVNFVF9NQVNLKTsKIAkJLyogRm9yIHNvbWUgcmVhc29uIHdlIG5lZWQgdG8gc2V0IHRoZSBFTiBiaXQgYmVmb3JlIHRoZQogCQkgKiByZXNldCBkb25lIGJpdCBnZXRzIHNldC4gKi8KIAkJdGltZW91dCA9IGppZmZpZXMgKyBPTUFQX0kyQ19USU1FT1VUOwogCQlvbWFwX2kyY193cml0ZV9yZWcoZGV2LCBPTUFQX0kyQ19DT05fUkVHLCBPTUFQX0kyQ19DT05fRU4pOwogCQl3aGlsZSAoIShvbWFwX2kyY19yZWFkX3JlZyhkZXYsIE9NQVBfSTJDX1NZU1NfUkVHKSAmCi0JCQkgT01BUF9JMkNfU1lTU19SRE9ORSkpIHsKKwkJCSBTWVNTX1JFU0VURE9ORV9NQVNLKSkgewogCQkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgdGltZW91dCkpIHsKIAkJCQlkZXZfd2FybihkZXYtPmRldiwgInRpbWVvdXQgd2FpdGluZyAiCiAJCQkJCQkiZm9yIGNvbnRyb2xsZXIgcmVzZXRcbiIpOwpAQCAtMjIzLDYgKzI4MSwzMyBAQAogCQkJfQogCQkJbXNsZWVwKDEpOwogCQl9CisKKwkJLyogU1lTQyByZWdpc3RlciBpcyBjbGVhcmVkIGJ5IHRoZSByZXNldDsgcmV3cml0ZSBpdCAqLworCQlpZiAoZGV2LT5yZXYgPT0gT01BUF9JMkNfUkVWX09OXzI0MzApIHsKKworCQkJb21hcF9pMmNfd3JpdGVfcmVnKGRldiwgT01BUF9JMkNfU1lTQ19SRUcsCisJCQkJCSAgIFNZU0NfQVVUT0lETEVfTUFTSyk7CisKKwkJfSBlbHNlIGlmIChkZXYtPnJldiA+PSBPTUFQX0kyQ19SRVZfT05fMzQzMCkgeworCQkJdTMyIHY7CisKKwkJCXYgPSBTWVNDX0FVVE9JRExFX01BU0s7CisJCQl2IHw9IFNZU0NfRU5BV0FLRVVQX01BU0s7CisJCQl2IHw9IChTWVNDX0lETEVNT0RFX1NNQVJUIDw8CisJCQkgICAgICBfX2ZmcyhTWVNDX1NJRExFTU9ERV9NQVNLKSk7CisJCQl2IHw9IChTWVNDX0NMT0NLQUNUSVZJVFlfRkNMSyA8PAorCQkJICAgICAgX19mZnMoU1lTQ19DTE9DS0FDVElWSVRZX01BU0spKTsKKworCQkJb21hcF9pMmNfd3JpdGVfcmVnKGRldiwgT01BUF9JMkNfU1lTQ19SRUcsIHYpOworCQkJLyoKKwkJCSAqIEVuYWJsaW5nIGFsbCB3YWt1cCBzb3VyY2VzIHRvIHN0b3AgSTJDIGZyZWV6aW5nIG9uCisJCQkgKiBXRkkgaW5zdHJ1Y3Rpb24uCisJCQkgKiBSRVZJU0lUOiBTb21lIHdrdXAgc291cmNlcyBtaWdodCBub3QgYmUgbmVlZGVkLgorCQkJICovCisJCQlvbWFwX2kyY193cml0ZV9yZWcoZGV2LCBPTUFQX0kyQ19XRV9SRUcsCisJCQkJCQkJT01BUF9JMkNfV0VfQUxMKTsKKworCQl9CiAJfQogCW9tYXBfaTJjX3dyaXRlX3JlZyhkZXYsIE9NQVBfSTJDX0NPTl9SRUcsIDApOwogCkBAIC0yNDksMjcgKzMzNCw2NSBAQAogCQkJcHNjID0gZmNsa19yYXRlIC8gMTIwMDAwMDA7CiAJfQogCisJaWYgKGNwdV9pc19vbWFwMjQzMCgpIHx8IGNwdV9pc19vbWFwMzR4eCgpKSB7CisKKwkJLyogSFNJMkMgY29udHJvbGxlciBpbnRlcm5hbCBjbGsgcmF0ZSBzaG91bGQgYmUgMTkuMiBNaHogKi8KKwkJaW50ZXJuYWxfY2xrID0gMTkyMDA7CisJCWZjbGtfcmF0ZSA9IGNsa19nZXRfcmF0ZShkZXYtPmZjbGspIC8gMTAwMDsKKworCQkvKiBDb21wdXRlIHByZXNjYWxlciBkaXZpc29yICovCisJCXBzYyA9IGZjbGtfcmF0ZSAvIGludGVybmFsX2NsazsKKwkJcHNjID0gcHNjIC0gMTsKKworCQkvKiBJZiBjb25maWd1cmVkIGZvciBIaWdoIFNwZWVkICovCisJCWlmIChkZXYtPnNwZWVkID4gNDAwKSB7CisJCQkvKiBGb3IgZmlyc3QgcGhhc2Ugb2YgSFMgbW9kZSAqLworCQkJZnNzY2xsID0gaW50ZXJuYWxfY2xrIC8gKDQwMCAqIDIpIC0gNjsKKwkJCWZzc2NsaCA9IGludGVybmFsX2NsayAvICg0MDAgKiAyKSAtIDY7CisKKwkJCS8qIEZvciBzZWNvbmQgcGhhc2Ugb2YgSFMgbW9kZSAqLworCQkJaHNzY2xsID0gZmNsa19yYXRlIC8gKGRldi0+c3BlZWQgKiAyKSAtIDY7CisJCQloc3NjbGggPSBmY2xrX3JhdGUgLyAoZGV2LT5zcGVlZCAqIDIpIC0gNjsKKwkJfSBlbHNlIHsKKwkJCS8qIFRvIGhhbmRsZSBGL1MgbW9kZXMgKi8KKwkJCWZzc2NsbCA9IGludGVybmFsX2NsayAvIChkZXYtPnNwZWVkICogMikgLSA2OworCQkJZnNzY2xoID0gaW50ZXJuYWxfY2xrIC8gKGRldi0+c3BlZWQgKiAyKSAtIDY7CisJCX0KKwkJc2NsbCA9IChoc3NjbGwgPDwgT01BUF9JMkNfU0NMTF9IU1NDTEwpIHwgZnNzY2xsOworCQlzY2xoID0gKGhzc2NsaCA8PCBPTUFQX0kyQ19TQ0xIX0hTU0NMSCkgfCBmc3NjbGg7CisJfSBlbHNlIHsKKwkJLyogUHJvZ3JhbSBkZXNpcmVkIG9wZXJhdGluZyByYXRlICovCisJCWZjbGtfcmF0ZSAvPSAocHNjICsgMSkgKiAxMDAwOworCQlpZiAocHNjID4gMikKKwkJCXBzYyA9IDI7CisJCXNjbGwgPSBmY2xrX3JhdGUgLyAoZGV2LT5zcGVlZCAqIDIpIC0gNyArIHBzYzsKKwkJc2NsaCA9IGZjbGtfcmF0ZSAvIChkZXYtPnNwZWVkICogMikgLSA3ICsgcHNjOworCX0KKwogCS8qIFNldHVwIGNsb2NrIHByZXNjYWxlciB0byBvYnRhaW4gYXBwcm94IDEyTUh6IEkyQyBtb2R1bGUgY2xvY2s6ICovCiAJb21hcF9pMmNfd3JpdGVfcmVnKGRldiwgT01BUF9JMkNfUFNDX1JFRywgcHNjKTsKIAotCS8qIFByb2dyYW0gZGVzaXJlZCBvcGVyYXRpbmcgcmF0ZSAqLwotCWZjbGtfcmF0ZSAvPSAocHNjICsgMSkgKiAxMDAwOwotCWlmIChwc2MgPiAyKQotCQlwc2MgPSAyOworCS8qIFNDTCBsb3cgYW5kIGhpZ2ggdGltZSB2YWx1ZXMgKi8KKwlvbWFwX2kyY193cml0ZV9yZWcoZGV2LCBPTUFQX0kyQ19TQ0xMX1JFRywgc2NsbCk7CisJb21hcF9pMmNfd3JpdGVfcmVnKGRldiwgT01BUF9JMkNfU0NMSF9SRUcsIHNjbGgpOwogCi0Jb21hcF9pMmNfd3JpdGVfcmVnKGRldiwgT01BUF9JMkNfU0NMTF9SRUcsCi0JCQkgICBmY2xrX3JhdGUgLyAoY2xvY2sgKiAyKSAtIDcgKyBwc2MpOwotCW9tYXBfaTJjX3dyaXRlX3JlZyhkZXYsIE9NQVBfSTJDX1NDTEhfUkVHLAotCQkJICAgZmNsa19yYXRlIC8gKGNsb2NrICogMikgLSA3ICsgcHNjKTsKKwlpZiAoZGV2LT5maWZvX3NpemUpCisJCS8qIE5vdGU6IHNldHVwIHJlcXVpcmVkIGZpZm8gc2l6ZSAtIDEgKi8KKwkJb21hcF9pMmNfd3JpdGVfcmVnKGRldiwgT01BUF9JMkNfQlVGX1JFRywKKwkJCQkJKGRldi0+Zmlmb19zaXplIC0gMSkgPDwgOCB8IC8qIFJUUlNIICovCisJCQkJCU9NQVBfSTJDX0JVRl9SWEZJRl9DTFIgfAorCQkJCQkoZGV2LT5maWZvX3NpemUgLSAxKSB8IC8qIFhUUlNIICovCisJCQkJCU9NQVBfSTJDX0JVRl9UWEZJRl9DTFIpOwogCiAJLyogVGFrZSB0aGUgSTJDIG1vZHVsZSBvdXQgb2YgcmVzZXQ6ICovCiAJb21hcF9pMmNfd3JpdGVfcmVnKGRldiwgT01BUF9JMkNfQ09OX1JFRywgT01BUF9JMkNfQ09OX0VOKTsKIAogCS8qIEVuYWJsZSBpbnRlcnJ1cHRzICovCiAJb21hcF9pMmNfd3JpdGVfcmVnKGRldiwgT01BUF9JMkNfSUVfUkVHLAotCQkJICAgKE9NQVBfSTJDX0lFX1hSRFkgfCBPTUFQX0kyQ19JRV9SUkRZIHwKLQkJCSAgICBPTUFQX0kyQ19JRV9BUkRZIHwgT01BUF9JMkNfSUVfTkFDSyB8Ci0JCQkgICAgT01BUF9JMkNfSUVfQUwpKTsKKwkJCShPTUFQX0kyQ19JRV9YUkRZIHwgT01BUF9JMkNfSUVfUlJEWSB8CisJCQlPTUFQX0kyQ19JRV9BUkRZIHwgT01BUF9JMkNfSUVfTkFDSyB8CisJCQlPTUFQX0kyQ19JRV9BTCkgIHwgKChkZXYtPmZpZm9fc2l6ZSkgPworCQkJCShPTUFQX0kyQ19JRV9SRFIgfCBPTUFQX0kyQ19JRV9YRFIpIDogMCkpOwogCXJldHVybiAwOwogfQogCkBAIC0zMTYsMjAgKzQzOSw1OSBAQAogCiAJb21hcF9pMmNfd3JpdGVfcmVnKGRldiwgT01BUF9JMkNfQ05UX1JFRywgZGV2LT5idWZfbGVuKTsKIAorCS8qIENsZWFyIHRoZSBGSUZPIEJ1ZmZlcnMgKi8KKwl3ID0gb21hcF9pMmNfcmVhZF9yZWcoZGV2LCBPTUFQX0kyQ19CVUZfUkVHKTsKKwl3IHw9IE9NQVBfSTJDX0JVRl9SWEZJRl9DTFIgfCBPTUFQX0kyQ19CVUZfVFhGSUZfQ0xSOworCW9tYXBfaTJjX3dyaXRlX3JlZyhkZXYsIE9NQVBfSTJDX0JVRl9SRUcsIHcpOworCiAJaW5pdF9jb21wbGV0aW9uKCZkZXYtPmNtZF9jb21wbGV0ZSk7CiAJZGV2LT5jbWRfZXJyID0gMDsKIAogCXcgPSBPTUFQX0kyQ19DT05fRU4gfCBPTUFQX0kyQ19DT05fTVNUIHwgT01BUF9JMkNfQ09OX1NUVDsKKworCS8qIEhpZ2ggc3BlZWQgY29uZmlndXJhdGlvbiAqLworCWlmIChkZXYtPnNwZWVkID4gNDAwKQorCQl3IHw9IE9NQVBfSTJDX0NPTl9PUE1PREVfSFM7CisKIAlpZiAobXNnLT5mbGFncyAmIEkyQ19NX1RFTikKIAkJdyB8PSBPTUFQX0kyQ19DT05fWEE7CiAJaWYgKCEobXNnLT5mbGFncyAmIEkyQ19NX1JEKSkKIAkJdyB8PSBPTUFQX0kyQ19DT05fVFJYOwotCWlmIChzdG9wKQorCisJaWYgKCFkZXYtPmJfaHcgJiYgc3RvcCkKIAkJdyB8PSBPTUFQX0kyQ19DT05fU1RQOworCiAJb21hcF9pMmNfd3JpdGVfcmVnKGRldiwgT01BUF9JMkNfQ09OX1JFRywgdyk7CiAKLQlyID0gd2FpdF9mb3JfY29tcGxldGlvbl9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoJmRldi0+Y21kX2NvbXBsZXRlLAotCQkJCQkJICAgICAgT01BUF9JMkNfVElNRU9VVCk7CisJLyoKKwkgKiBEb24ndCB3cml0ZSBzdHQgYW5kIHN0cCB0b2dldGhlciBvbiBzb21lIGhhcmR3YXJlLgorCSAqLworCWlmIChkZXYtPmJfaHcgJiYgc3RvcCkgeworCQl1bnNpZ25lZCBsb25nIGRlbGF5ID0gamlmZmllcyArIE9NQVBfSTJDX1RJTUVPVVQ7CisJCXUxNiBjb24gPSBvbWFwX2kyY19yZWFkX3JlZyhkZXYsIE9NQVBfSTJDX0NPTl9SRUcpOworCQl3aGlsZSAoY29uICYgT01BUF9JMkNfQ09OX1NUVCkgeworCQkJY29uID0gb21hcF9pMmNfcmVhZF9yZWcoZGV2LCBPTUFQX0kyQ19DT05fUkVHKTsKKworCQkJLyogTGV0IHRoZSB1c2VyIGtub3cgaWYgaTJjIGlzIGluIGEgYmFkIHN0YXRlICovCisJCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBkZWxheSkpIHsKKwkJCQlkZXZfZXJyKGRldi0+ZGV2LCAiY29udHJvbGxlciB0aW1lZCBvdXQgIgorCQkJCSJ3YWl0aW5nIGZvciBzdGFydCBjb25kaXRpb24gdG8gZmluaXNoXG4iKTsKKwkJCQlyZXR1cm4gLUVUSU1FRE9VVDsKKwkJCX0KKwkJCWNwdV9yZWxheCgpOworCQl9CisKKwkJdyB8PSBPTUFQX0kyQ19DT05fU1RQOworCQl3ICY9IH5PTUFQX0kyQ19DT05fU1RUOworCQlvbWFwX2kyY193cml0ZV9yZWcoZGV2LCBPTUFQX0kyQ19DT05fUkVHLCB3KTsKKwl9CisKKwkvKgorCSAqIFJFVklTSVQ6IFdlIHNob3VsZCBhYm9ydCB0aGUgdHJhbnNmZXIgb24gc2lnbmFscywgYnV0IHRoZSBidXMgZ29lcworCSAqIGludG8gYXJiaXRyYXRpb24gYW5kIHdlJ3JlIGN1cnJlbnRseSB1bmFibGUgdG8gcmVjb3ZlciBmcm9tIGl0LgorCSAqLworCXIgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJmRldi0+Y21kX2NvbXBsZXRlLAorCQkJCQlPTUFQX0kyQ19USU1FT1VUKTsKIAlkZXYtPmJ1Zl9sZW4gPSAwOwogCWlmIChyIDwgMCkKIAkJcmV0dXJuIHI7CkBAIC0zNzYsNyArNTM4LDggQEAKIAogCW9tYXBfaTJjX3VuaWRsZShkZXYpOwogCi0JaWYgKChyID0gb21hcF9pMmNfd2FpdF9mb3JfYmIoZGV2KSkgPCAwKQorCXIgPSBvbWFwX2kyY193YWl0X2Zvcl9iYihkZXYpOworCWlmIChyIDwgMCkKIAkJZ290byBvdXQ7CiAKIAlmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspIHsKQEAgLTQxMSw2ICs1NzQsOSBAQAogCW9tYXBfaTJjX3dyaXRlX3JlZyhkZXYsIE9NQVBfSTJDX1NUQVRfUkVHLCBzdGF0KTsKIH0KIAorLyogcmV2MSBkZXZpY2VzIGFyZSBhcHBhcmVudGx5IG9ubHkgb24gc29tZSAxNXh4ICovCisjaWZkZWYgQ09ORklHX0FSQ0hfT01BUDE1WFgKKwogc3RhdGljIGlycXJldHVybl90CiBvbWFwX2kyY19yZXYxX2lzcihpbnQgdGhpc19pcnEsIHZvaWQgKmRldl9pZCkKIHsKQEAgLTQ2NSw2ICs2MzEsOSBAQAogCiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQorI2Vsc2UKKyNkZWZpbmUgb21hcF9pMmNfcmV2MV9pc3IJCU5VTEwKKyNlbmRpZgogCiBzdGF0aWMgaXJxcmV0dXJuX3QKIG9tYXBfaTJjX2lzcihpbnQgdGhpc19pcnEsIHZvaWQgKmRldl9pZCkKQEAgLTQ3Miw3ICs2NDEsNyBAQAogCXN0cnVjdCBvbWFwX2kyY19kZXYgKmRldiA9IGRldl9pZDsKIAl1MTYgYml0czsKIAl1MTYgc3RhdCwgdzsKLQlpbnQgY291bnQgPSAwOworCWludCBlcnIsIGNvdW50ID0gMDsKIAogCWlmIChkZXYtPmlkbGUpCiAJCXJldHVybiBJUlFfTk9ORTsKQEAgLTQ4NywzOSArNjU2LDk2IEBACiAKIAkJb21hcF9pMmNfd3JpdGVfcmVnKGRldiwgT01BUF9JMkNfU1RBVF9SRUcsIHN0YXQpOwogCi0JCWlmIChzdGF0ICYgT01BUF9JMkNfU1RBVF9BUkRZKSB7Ci0JCQlvbWFwX2kyY19jb21wbGV0ZV9jbWQoZGV2LCAwKTsKKwkJZXJyID0gMDsKKwkJaWYgKHN0YXQgJiBPTUFQX0kyQ19TVEFUX05BQ0spIHsKKwkJCWVyciB8PSBPTUFQX0kyQ19TVEFUX05BQ0s7CisJCQlvbWFwX2kyY193cml0ZV9yZWcoZGV2LCBPTUFQX0kyQ19DT05fUkVHLAorCQkJCQkgICBPTUFQX0kyQ19DT05fU1RQKTsKKwkJfQorCQlpZiAoc3RhdCAmIE9NQVBfSTJDX1NUQVRfQUwpIHsKKwkJCWRldl9lcnIoZGV2LT5kZXYsICJBcmJpdHJhdGlvbiBsb3N0XG4iKTsKKwkJCWVyciB8PSBPTUFQX0kyQ19TVEFUX0FMOworCQl9CisJCWlmIChzdGF0ICYgKE9NQVBfSTJDX1NUQVRfQVJEWSB8IE9NQVBfSTJDX1NUQVRfTkFDSyB8CisJCQkJCU9NQVBfSTJDX1NUQVRfQUwpKQorCQkJb21hcF9pMmNfY29tcGxldGVfY21kKGRldiwgZXJyKTsKKwkJaWYgKHN0YXQgJiAoT01BUF9JMkNfU1RBVF9SUkRZIHwgT01BUF9JMkNfU1RBVF9SRFIpKSB7CisJCQl1OCBudW1fYnl0ZXMgPSAxOworCQkJaWYgKGRldi0+Zmlmb19zaXplKSB7CisJCQkJaWYgKHN0YXQgJiBPTUFQX0kyQ19TVEFUX1JSRFkpCisJCQkJCW51bV9ieXRlcyA9IGRldi0+Zmlmb19zaXplOworCQkJCWVsc2UKKwkJCQkJbnVtX2J5dGVzID0gb21hcF9pMmNfcmVhZF9yZWcoZGV2LAorCQkJCQkJCU9NQVBfSTJDX0JVRlNUQVRfUkVHKTsKKwkJCX0KKwkJCXdoaWxlIChudW1fYnl0ZXMpIHsKKwkJCQludW1fYnl0ZXMtLTsKKwkJCQl3ID0gb21hcF9pMmNfcmVhZF9yZWcoZGV2LCBPTUFQX0kyQ19EQVRBX1JFRyk7CisJCQkJaWYgKGRldi0+YnVmX2xlbikgeworCQkJCQkqZGV2LT5idWYrKyA9IHc7CisJCQkJCWRldi0+YnVmX2xlbi0tOworCQkJCQkvKiBEYXRhIHJlZyBmcm9tIDI0MzAgaXMgOCBiaXQgd2lkZSAqLworCQkJCQlpZiAoIWNwdV9pc19vbWFwMjQzMCgpICYmCisJCQkJCQkJIWNwdV9pc19vbWFwMzR4eCgpKSB7CisJCQkJCQlpZiAoZGV2LT5idWZfbGVuKSB7CisJCQkJCQkJKmRldi0+YnVmKysgPSB3ID4+IDg7CisJCQkJCQkJZGV2LT5idWZfbGVuLS07CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQlpZiAoc3RhdCAmIE9NQVBfSTJDX1NUQVRfUlJEWSkKKwkJCQkJCWRldl9lcnIoZGV2LT5kZXYsCisJCQkJCQkJIlJSRFkgSVJRIHdoaWxlIG5vIGRhdGEiCisJCQkJCQkJCSIgcmVxdWVzdGVkXG4iKTsKKwkJCQkJaWYgKHN0YXQgJiBPTUFQX0kyQ19TVEFUX1JEUikKKwkJCQkJCWRldl9lcnIoZGV2LT5kZXYsCisJCQkJCQkJIlJEUiBJUlEgd2hpbGUgbm8gZGF0YSIKKwkJCQkJCQkJIiByZXF1ZXN0ZWRcbiIpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQlvbWFwX2kyY19hY2tfc3RhdChkZXYsCisJCQkJc3RhdCAmIChPTUFQX0kyQ19TVEFUX1JSRFkgfCBPTUFQX0kyQ19TVEFUX1JEUikpOwogCQkJY29udGludWU7CiAJCX0KLQkJaWYgKHN0YXQgJiBPTUFQX0kyQ19TVEFUX1JSRFkpIHsKLQkJCXcgPSBvbWFwX2kyY19yZWFkX3JlZyhkZXYsIE9NQVBfSTJDX0RBVEFfUkVHKTsKLQkJCWlmIChkZXYtPmJ1Zl9sZW4pIHsKLQkJCQkqZGV2LT5idWYrKyA9IHc7Ci0JCQkJZGV2LT5idWZfbGVuLS07CisJCWlmIChzdGF0ICYgKE9NQVBfSTJDX1NUQVRfWFJEWSB8IE9NQVBfSTJDX1NUQVRfWERSKSkgeworCQkJdTggbnVtX2J5dGVzID0gMTsKKwkJCWlmIChkZXYtPmZpZm9fc2l6ZSkgeworCQkJCWlmIChzdGF0ICYgT01BUF9JMkNfU1RBVF9YUkRZKQorCQkJCQludW1fYnl0ZXMgPSBkZXYtPmZpZm9fc2l6ZTsKKwkJCQllbHNlCisJCQkJCW51bV9ieXRlcyA9IG9tYXBfaTJjX3JlYWRfcmVnKGRldiwKKwkJCQkJCQlPTUFQX0kyQ19CVUZTVEFUX1JFRyk7CisJCQl9CisJCQl3aGlsZSAobnVtX2J5dGVzKSB7CisJCQkJbnVtX2J5dGVzLS07CisJCQkJdyA9IDA7CiAJCQkJaWYgKGRldi0+YnVmX2xlbikgewotCQkJCQkqZGV2LT5idWYrKyA9IHcgPj4gODsKKwkJCQkJdyA9ICpkZXYtPmJ1ZisrOwogCQkJCQlkZXYtPmJ1Zl9sZW4tLTsKKwkJCQkJLyogRGF0YSByZWcgZnJvbSAgMjQzMCBpcyA4IGJpdCB3aWRlICovCisJCQkJCWlmICghY3B1X2lzX29tYXAyNDMwKCkgJiYKKwkJCQkJCQkhY3B1X2lzX29tYXAzNHh4KCkpIHsKKwkJCQkJCWlmIChkZXYtPmJ1Zl9sZW4pIHsKKwkJCQkJCQl3IHw9ICpkZXYtPmJ1ZisrIDw8IDg7CisJCQkJCQkJZGV2LT5idWZfbGVuLS07CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQlpZiAoc3RhdCAmIE9NQVBfSTJDX1NUQVRfWFJEWSkKKwkJCQkJCWRldl9lcnIoZGV2LT5kZXYsCisJCQkJCQkJIlhSRFkgSVJRIHdoaWxlIG5vICIKKwkJCQkJCQkiZGF0YSB0byBzZW5kXG4iKTsKKwkJCQkJaWYgKHN0YXQgJiBPTUFQX0kyQ19TVEFUX1hEUikKKwkJCQkJCWRldl9lcnIoZGV2LT5kZXYsCisJCQkJCQkJIlhEUiBJUlEgd2hpbGUgbm8gIgorCQkJCQkJCSJkYXRhIHRvIHNlbmRcbiIpOworCQkJCQlicmVhazsKIAkJCQl9Ci0JCQl9IGVsc2UKLQkJCQlkZXZfZXJyKGRldi0+ZGV2LCAiUlJEWSBJUlEgd2hpbGUgbm8gZGF0YSAiCi0JCQkJCQkicmVxdWVzdGVkXG4iKTsKLQkJCW9tYXBfaTJjX2Fja19zdGF0KGRldiwgT01BUF9JMkNfU1RBVF9SUkRZKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmIChzdGF0ICYgT01BUF9JMkNfU1RBVF9YUkRZKSB7Ci0JCQl3ID0gMDsKLQkJCWlmIChkZXYtPmJ1Zl9sZW4pIHsKLQkJCQl3ID0gKmRldi0+YnVmKys7Ci0JCQkJZGV2LT5idWZfbGVuLS07Ci0JCQkJaWYgKGRldi0+YnVmX2xlbikgewotCQkJCQl3IHw9ICpkZXYtPmJ1ZisrIDw8IDg7Ci0JCQkJCWRldi0+YnVmX2xlbi0tOwotCQkJCX0KLQkJCX0gZWxzZQotCQkJCWRldl9lcnIoZGV2LT5kZXYsICJYUkRZIElSUSB3aGlsZSBubyAiCi0JCQkJCSJkYXRhIHRvIHNlbmRcbiIpOwotCQkJb21hcF9pMmNfd3JpdGVfcmVnKGRldiwgT01BUF9JMkNfREFUQV9SRUcsIHcpOwotCQkJb21hcF9pMmNfYWNrX3N0YXQoZGV2LCBPTUFQX0kyQ19TVEFUX1hSRFkpOworCQkJCW9tYXBfaTJjX3dyaXRlX3JlZyhkZXYsIE9NQVBfSTJDX0RBVEFfUkVHLCB3KTsKKwkJCX0KKwkJCW9tYXBfaTJjX2Fja19zdGF0KGRldiwKKwkJCQlzdGF0ICYgKE9NQVBfSTJDX1NUQVRfWFJEWSB8IE9NQVBfSTJDX1NUQVRfWERSKSk7CiAJCQljb250aW51ZTsKIAkJfQogCQlpZiAoc3RhdCAmIE9NQVBfSTJDX1NUQVRfUk9WUikgewpAQCAtNTI3LDE4ICs3NTMsOSBAQAogCQkJZGV2LT5jbWRfZXJyIHw9IE9NQVBfSTJDX1NUQVRfUk9WUjsKIAkJfQogCQlpZiAoc3RhdCAmIE9NQVBfSTJDX1NUQVRfWFVERikgewotCQkJZGV2X2VycihkZXYtPmRldiwgIlRyYW5zbWl0IG92ZXJmbG93XG4iKTsKKwkJCWRldl9lcnIoZGV2LT5kZXYsICJUcmFuc21pdCB1bmRlcmZsb3dcbiIpOwogCQkJZGV2LT5jbWRfZXJyIHw9IE9NQVBfSTJDX1NUQVRfWFVERjsKIAkJfQotCQlpZiAoc3RhdCAmIE9NQVBfSTJDX1NUQVRfTkFDSykgewotCQkJb21hcF9pMmNfY29tcGxldGVfY21kKGRldiwgT01BUF9JMkNfU1RBVF9OQUNLKTsKLQkJCW9tYXBfaTJjX3dyaXRlX3JlZyhkZXYsIE9NQVBfSTJDX0NPTl9SRUcsCi0JCQkJCSAgIE9NQVBfSTJDX0NPTl9TVFApOwotCQl9Ci0JCWlmIChzdGF0ICYgT01BUF9JMkNfU1RBVF9BTCkgewotCQkJZGV2X2VycihkZXYtPmRldiwgIkFyYml0cmF0aW9uIGxvc3RcbiIpOwotCQkJb21hcF9pMmNfY29tcGxldGVfY21kKGRldiwgT01BUF9JMkNfU1RBVF9BTCk7Ci0JCX0KIAl9CiAKIAlyZXR1cm4gY291bnQgPyBJUlFfSEFORExFRCA6IElSUV9OT05FOwpAQCAtNTQ5LDEzICs3NjYsMTUgQEAKIAkuZnVuY3Rpb25hbGl0eQk9IG9tYXBfaTJjX2Z1bmMsCiB9OwogCi1zdGF0aWMgaW50CitzdGF0aWMgaW50IF9faW5pdAogb21hcF9pMmNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlzdHJ1Y3Qgb21hcF9pMmNfZGV2CSpkZXY7CiAJc3RydWN0IGkyY19hZGFwdGVyCSphZGFwOwogCXN0cnVjdCByZXNvdXJjZQkJKm1lbSwgKmlycSwgKmlvYXJlYTsKKwlpcnFfaGFuZGxlcl90IGlzcjsKIAlpbnQgcjsKKwl1MzIgc3BlZWQgPSAwOwogCiAJLyogTk9URTogZHJpdmVyIHVzZXMgdGhlIHN0YXRpYyByZWdpc3RlciBtYXBwaW5nICovCiAJbWVtID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKQEAgLTU3NiwxNyArNzk1LDE5IEBACiAJCXJldHVybiAtRUJVU1k7CiAJfQogCi0JaWYgKGNsb2NrID4gMjAwKQotCQljbG9jayA9IDQwMDsJLyogRmFzdCBtb2RlICovCi0JZWxzZQotCQljbG9jayA9IDEwMDsJLyogU3RhbmRhcmQgbW9kZSAqLwotCiAJZGV2ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG9tYXBfaTJjX2RldiksIEdGUF9LRVJORUwpOwogCWlmICghZGV2KSB7CiAJCXIgPSAtRU5PTUVNOwogCQlnb3RvIGVycl9yZWxlYXNlX3JlZ2lvbjsKIAl9CiAKKwlpZiAocGRldi0+ZGV2LnBsYXRmb3JtX2RhdGEgIT0gTlVMTCkKKwkJc3BlZWQgPSAqKHUzMiAqKXBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCWVsc2UKKwkJc3BlZWQgPSAxMDA7CS8qIERlZnVhbHQgc3BlZWQgKi8KKworCWRldi0+c3BlZWQgPSBzcGVlZDsKKwlkZXYtPmlkbGUgPSAxOwogCWRldi0+ZGV2ID0gJnBkZXYtPmRldjsKIAlkZXYtPmlycSA9IGlycS0+c3RhcnQ7CiAJZGV2LT5iYXNlID0gaW9yZW1hcChtZW0tPnN0YXJ0LCBtZW0tPmVuZCAtIG1lbS0+c3RhcnQgKyAxKTsKQEAgLTYwMiwyMiArODIzLDM5IEBACiAKIAlvbWFwX2kyY191bmlkbGUoZGV2KTsKIAotCWlmIChjcHVfaXNfb21hcDE1eHgoKSkKLQkJZGV2LT5yZXYxID0gb21hcF9pMmNfcmVhZF9yZWcoZGV2LCBPTUFQX0kyQ19SRVZfUkVHKSA8IDB4MjA7CisJZGV2LT5yZXYgPSBvbWFwX2kyY19yZWFkX3JlZyhkZXYsIE9NQVBfSTJDX1JFVl9SRUcpICYgMHhmZjsKKworCWlmIChjcHVfaXNfb21hcDI0MzAoKSB8fCBjcHVfaXNfb21hcDM0eHgoKSkgeworCQl1MTYgczsKKworCQkvKiBTZXQgdXAgdGhlIGZpZm8gc2l6ZSAtIEdldCB0b3RhbCBzaXplICovCisJCXMgPSAob21hcF9pMmNfcmVhZF9yZWcoZGV2LCBPTUFQX0kyQ19CVUZTVEFUX1JFRykgPj4gMTQpICYgMHgzOworCQlkZXYtPmZpZm9fc2l6ZSA9IDB4OCA8PCBzOworCisJCS8qCisJCSAqIFNldCB1cCBub3RpZmljYXRpb24gdGhyZXNob2xkIGFzIGhhbGYgdGhlIHRvdGFsIGF2YWlsYWJsZQorCQkgKiBzaXplLiBUaGlzIGlzIHRvIGVuc3VyZSB0aGF0IHdlIGNhbiBoYW5kbGUgdGhlIHN0YXR1cyBvbiBpbnQKKwkJICogY2FsbCBiYWNrIGxhdGVuY2llcy4KKwkJICovCisJCWRldi0+Zmlmb19zaXplID0gKGRldi0+Zmlmb19zaXplIC8gMik7CisJCWRldi0+Yl9odyA9IDE7IC8qIEVuYWJsZSBoYXJkd2FyZSBmaXhlcyAqLworCX0KIAogCS8qIHJlc2V0IEFTQVAsIGNsZWFyaW5nIGFueSBJUlFzICovCiAJb21hcF9pMmNfaW5pdChkZXYpOwogCi0JciA9IHJlcXVlc3RfaXJxKGRldi0+aXJxLCBkZXYtPnJldjEgPyBvbWFwX2kyY19yZXYxX2lzciA6IG9tYXBfaTJjX2lzciwKLQkJCTAsIHBkZXYtPm5hbWUsIGRldik7CisJaXNyID0gKGRldi0+cmV2IDwgT01BUF9JMkNfUkVWXzIpID8gb21hcF9pMmNfcmV2MV9pc3IgOiBvbWFwX2kyY19pc3I7CisJciA9IHJlcXVlc3RfaXJxKGRldi0+aXJxLCBpc3IsIDAsIHBkZXYtPm5hbWUsIGRldik7CiAKIAlpZiAocikgewogCQlkZXZfZXJyKGRldi0+ZGV2LCAiZmFpbHVyZSByZXF1ZXN0aW5nIGlycSAlaVxuIiwgZGV2LT5pcnEpOwogCQlnb3RvIGVycl91bnVzZV9jbG9ja3M7CiAJfQotCXIgPSBvbWFwX2kyY19yZWFkX3JlZyhkZXYsIE9NQVBfSTJDX1JFVl9SRUcpICYgMHhmZjsKKwogCWRldl9pbmZvKGRldi0+ZGV2LCAiYnVzICVkIHJldiVkLiVkIGF0ICVkIGtIelxuIiwKLQkJIHBkZXYtPmlkLCByID4+IDQsIHIgJiAweGYsIGNsb2NrKTsKKwkJIHBkZXYtPmlkLCBkZXYtPnJldiA+PiA0LCBkZXYtPnJldiAmIDB4ZiwgZGV2LT5zcGVlZCk7CisKKwlvbWFwX2kyY19pZGxlKGRldik7CiAKIAlhZGFwID0gJmRldi0+YWRhcHRlcjsKIAlpMmNfc2V0X2FkYXBkYXRhKGFkYXAsIGRldik7CkBAIC02MzUsOCArODczLDYgQEAKIAkJZ290byBlcnJfZnJlZV9pcnE7CiAJfQogCi0Jb21hcF9pMmNfaWRsZShkZXYpOwotCiAJcmV0dXJuIDA7CiAKIGVycl9mcmVlX2lycToKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtcHhhLmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXB4YS5jCmluZGV4IDU4N2Y1YjIuLjZhZjY4MTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtcHhhLmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1weGEuYwpAQCAtMTA3NiwxMCArMTA3NiwxMCBAQAogCiAjaWZkZWYgQ09ORklHX0kyQ19QWEFfU0xBVkUKIAlwcmludGsoS0VSTl9JTkZPICJJMkM6ICVzOiBQWEEgSTJDIGFkYXB0ZXIsIHNsYXZlIGFkZHJlc3MgJWRcbiIsCi0JICAgICAgIGkyYy0+YWRhcC5kZXYuYnVzX2lkLCBpMmMtPnNsYXZlX2FkZHIpOworCSAgICAgICBkZXZfbmFtZSgmaTJjLT5hZGFwLmRldiksIGkyYy0+c2xhdmVfYWRkcik7CiAjZWxzZQogCXByaW50ayhLRVJOX0lORk8gIkkyQzogJXM6IFBYQSBJMkMgYWRhcHRlclxuIiwKLQkgICAgICAgaTJjLT5hZGFwLmRldi5idXNfaWQpOworCSAgICAgICBkZXZfbmFtZSgmaTJjLT5hZGFwLmRldikpOwogI2VuZGlmCiAJcmV0dXJuIDA7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtczNjMjQxMC5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1zM2MyNDEwLmMKaW5kZXggYzM5MDc5Zi4uNWI3Zjk1NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1zM2MyNDEwLmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1zM2MyNDEwLmMKQEAgLTM1LDExICszNSw5IEBACiAjaW5jbHVkZSA8bGludXgvY2xrLmg+CiAjaW5jbHVkZSA8bGludXgvY3B1ZnJlcS5oPgogCi0jaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KIAotI2luY2x1ZGUgPG1hY2gvcmVncy1ncGlvLmg+CiAjaW5jbHVkZSA8cGxhdC9yZWdzLWlpYy5oPgogI2luY2x1ZGUgPHBsYXQvaWljLmg+CiAKQEAgLTY0LDYgKzYyLDcgQEAKIAl1bnNpZ25lZCBpbnQJCW1zZ19wdHI7CiAKIAl1bnNpZ25lZCBpbnQJCXR4X3NldHVwOworCXVuc2lnbmVkIGludAkJaXJxOwogCiAJZW51bSBzM2MyNHh4X2kyY19zdGF0ZQlzdGF0ZTsKIAl1bnNpZ25lZCBsb25nCQljbGtyYXRlOwpAQCAtNzEsNyArNzAsNiBAQAogCXZvaWQgX19pb21lbQkJKnJlZ3M7CiAJc3RydWN0IGNsawkJKmNsazsKIAlzdHJ1Y3QgZGV2aWNlCQkqZGV2OwotCXN0cnVjdCByZXNvdXJjZQkJKmlycTsKIAlzdHJ1Y3QgcmVzb3VyY2UJCSppb2FyZWE7CiAJc3RydWN0IGkyY19hZGFwdGVyCWFkYXA7CiAKQEAgLTgwLDE2ICs3OCw3IEBACiAjZW5kaWYKIH07CiAKLS8qIGRlZmF1bHQgcGxhdGZvcm0gZGF0YSB0byB1c2UgaWYgbm90IHN1cHBsaWVkIGluIHRoZSBwbGF0Zm9ybV9kZXZpY2UKLSovCi0KLXN0YXRpYyBzdHJ1Y3QgczNjMjQxMF9wbGF0Zm9ybV9pMmMgczNjMjR4eF9pMmNfZGVmYXVsdF9wbGF0Zm9ybSA9IHsKLQkuZmxhZ3MJCT0gMCwKLQkuc2xhdmVfYWRkcgk9IDB4MTAsCi0JLmJ1c19mcmVxCT0gMTAwKjEwMDAsCi0JLm1heF9mcmVxCT0gNDAwKjEwMDAsCi0JLnNkYV9kZWxheQk9IFMzQzI0MTBfSUlDTENfU0RBX0RFTEFZNSB8IFMzQzI0MTBfSUlDTENfRklMVEVSX09OLAotfTsKKy8qIGRlZmF1bHQgcGxhdGZvcm0gZGF0YSByZW1vdmVkLCBkZXYgc2hvdWxkIGFsd2F5cyBjYXJyeSBkYXRhLiAqLwogCiAvKiBzM2MyNHh4X2kyY19pczI0NDAoKQogICoKQEAgLTEwMywyMSArOTIsNiBAQAogCXJldHVybiAhc3RyY21wKHBkZXYtPm5hbWUsICJzM2MyNDQwLWkyYyIpOwogfQogCi0KLS8qIHMzYzI0eHhfaTJjX2dldF9wbGF0Zm9ybWRhdGEKLSAqCi0gKiBnZXQgdGhlIHBsYXRmb3JtIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBkZXZpY2UsIG9yIHJldHVybgotICogdGhlIGRlZmF1bHQgaWYgdGhlcmUgaXMgbm9uZQotKi8KLQotc3RhdGljIGlubGluZSBzdHJ1Y3QgczNjMjQxMF9wbGF0Zm9ybV9pMmMgKnMzYzI0eHhfaTJjX2dldF9wbGF0Zm9ybWRhdGEoc3RydWN0IGRldmljZSAqZGV2KQotewotCWlmIChkZXYtPnBsYXRmb3JtX2RhdGEgIT0gTlVMTCkKLQkJcmV0dXJuIChzdHJ1Y3QgczNjMjQxMF9wbGF0Zm9ybV9pMmMgKilkZXYtPnBsYXRmb3JtX2RhdGE7Ci0KLQlyZXR1cm4gJnMzYzI0eHhfaTJjX2RlZmF1bHRfcGxhdGZvcm07Ci19Ci0KIC8qIHMzYzI0eHhfaTJjX21hc3Rlcl9jb21wbGV0ZQogICoKICAqIGNvbXBsZXRlIHRoZSBtZXNzYWdlIGFuZCB3YWtlIHVwIHRoZSBjYWxsZXIsIHVzaW5nIHRoZSBnaXZlbiByZXR1cm4gY29kZSwKQEAgLTEzMCw3ICsxMDQsNyBAQAogCiAJaTJjLT5tc2dfcHRyID0gMDsKIAlpMmMtPm1zZyA9IE5VTEw7Ci0JaTJjLT5tc2dfaWR4ICsrOworCWkyYy0+bXNnX2lkeCsrOwogCWkyYy0+bXNnX251bSA9IDA7CiAJaWYgKHJldCkKIAkJaTJjLT5tc2dfaWR4ID0gcmV0OwpAQCAtMTQxLDE5ICsxMTUsMTcgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBzM2MyNHh4X2kyY19kaXNhYmxlX2FjayhzdHJ1Y3QgczNjMjR4eF9pMmMgKmkyYykKIHsKIAl1bnNpZ25lZCBsb25nIHRtcDsKLQkKKwogCXRtcCA9IHJlYWRsKGkyYy0+cmVncyArIFMzQzI0MTBfSUlDQ09OKTsKIAl3cml0ZWwodG1wICYgflMzQzI0MTBfSUlDQ09OX0FDS0VOLCBpMmMtPnJlZ3MgKyBTM0MyNDEwX0lJQ0NPTik7Ci0KIH0KIAogc3RhdGljIGlubGluZSB2b2lkIHMzYzI0eHhfaTJjX2VuYWJsZV9hY2soc3RydWN0IHMzYzI0eHhfaTJjICppMmMpCiB7CiAJdW5zaWduZWQgbG9uZyB0bXA7Ci0JCisKIAl0bXAgPSByZWFkbChpMmMtPnJlZ3MgKyBTM0MyNDEwX0lJQ0NPTik7CiAJd3JpdGVsKHRtcCB8IFMzQzI0MTBfSUlDQ09OX0FDS0VOLCBpMmMtPnJlZ3MgKyBTM0MyNDEwX0lJQ0NPTik7Ci0KIH0KIAogLyogaXJxIGVuYWJsZS9kaXNhYmxlIGZ1bmN0aW9ucyAqLwpAQCAtMTYxLDcgKzEzMyw3IEBACiBzdGF0aWMgaW5saW5lIHZvaWQgczNjMjR4eF9pMmNfZGlzYWJsZV9pcnEoc3RydWN0IHMzYzI0eHhfaTJjICppMmMpCiB7CiAJdW5zaWduZWQgbG9uZyB0bXA7Ci0JCisKIAl0bXAgPSByZWFkbChpMmMtPnJlZ3MgKyBTM0MyNDEwX0lJQ0NPTik7CiAJd3JpdGVsKHRtcCAmIH5TM0MyNDEwX0lJQ0NPTl9JUlFFTiwgaTJjLT5yZWdzICsgUzNDMjQxMF9JSUNDT04pOwogfQpAQCAtMTY5LDcgKzE0MSw3IEBACiBzdGF0aWMgaW5saW5lIHZvaWQgczNjMjR4eF9pMmNfZW5hYmxlX2lycShzdHJ1Y3QgczNjMjR4eF9pMmMgKmkyYykKIHsKIAl1bnNpZ25lZCBsb25nIHRtcDsKLQkKKwogCXRtcCA9IHJlYWRsKGkyYy0+cmVncyArIFMzQzI0MTBfSUlDQ09OKTsKIAl3cml0ZWwodG1wIHwgUzNDMjQxMF9JSUNDT05fSVJRRU4sIGkyYy0+cmVncyArIFMzQzI0MTBfSUlDQ09OKTsKIH0KQEAgLTE3NywxMCArMTQ5LDEwIEBACiAKIC8qIHMzYzI0eHhfaTJjX21lc3NhZ2Vfc3RhcnQKICAqCi0gKiBwdXQgdGhlIHN0YXJ0IG9mIGEgbWVzc2FnZSBvbnRvIHRoZSBidXMgCisgKiBwdXQgdGhlIHN0YXJ0IG9mIGEgbWVzc2FnZSBvbnRvIHRoZSBidXMKICovCiAKLXN0YXRpYyB2b2lkIHMzYzI0eHhfaTJjX21lc3NhZ2Vfc3RhcnQoc3RydWN0IHMzYzI0eHhfaTJjICppMmMsIAorc3RhdGljIHZvaWQgczNjMjR4eF9pMmNfbWVzc2FnZV9zdGFydChzdHJ1Y3QgczNjMjR4eF9pMmMgKmkyYywKIAkJCQkgICAgICBzdHJ1Y3QgaTJjX21zZyAqbXNnKQogewogCXVuc2lnbmVkIGludCBhZGRyID0gKG1zZy0+YWRkciAmIDB4N2YpIDw8IDE7CkBAIC0xOTksMTUgKzE3MSwxNSBAQAogCWlmIChtc2ctPmZsYWdzICYgSTJDX01fUkVWX0RJUl9BRERSKQogCQlhZGRyIF49IDE7CiAKLQkvLyB0b2RvIC0gY2hlY2sgZm9yIHdldGhlciBhY2sgd2FudGVkIG9yIG5vdAorCS8qIHRvZG8gLSBjaGVjayBmb3Igd2V0aGVyIGFjayB3YW50ZWQgb3Igbm90ICovCiAJczNjMjR4eF9pMmNfZW5hYmxlX2FjayhpMmMpOwogCiAJaWljY29uID0gcmVhZGwoaTJjLT5yZWdzICsgUzNDMjQxMF9JSUNDT04pOwogCXdyaXRlbChzdGF0LCBpMmMtPnJlZ3MgKyBTM0MyNDEwX0lJQ1NUQVQpOwotCQorCiAJZGV2X2RiZyhpMmMtPmRldiwgIlNUQVJUOiAlMDhseCB0byBJSUNTVEFULCAlMDJ4IHRvIERTXG4iLCBzdGF0LCBhZGRyKTsKIAl3cml0ZWIoYWRkciwgaTJjLT5yZWdzICsgUzNDMjQxMF9JSUNEUyk7Ci0JCisKIAkvKiBkZWxheSBoZXJlIHRvIGVuc3VyZSB0aGUgZGF0YSBieXRlIGhhcyBnb3R0ZW4gb250byB0aGUgYnVzCiAJICogYmVmb3JlIHRoZSB0cmFuc2FjdGlvbiBpcyBzdGFydGVkICovCiAKQEAgLTIxNSw4ICsxODcsOCBAQAogCiAJZGV2X2RiZyhpMmMtPmRldiwgImlpY2NvbiwgJTA4bHhcbiIsIGlpY2Nvbik7CiAJd3JpdGVsKGlpY2NvbiwgaTJjLT5yZWdzICsgUzNDMjQxMF9JSUNDT04pOwotCQotCXN0YXQgfD0gIFMzQzI0MTBfSUlDU1RBVF9TVEFSVDsKKworCXN0YXQgfD0gUzNDMjQxMF9JSUNTVEFUX1NUQVJUOwogCXdyaXRlbChzdGF0LCBpMmMtPnJlZ3MgKyBTM0MyNDEwX0lJQ1NUQVQpOwogfQogCkBAIC0yMjcsMTEgKzE5OSwxMSBAQAogCWRldl9kYmcoaTJjLT5kZXYsICJTVE9QXG4iKTsKIAogCS8qIHN0b3AgdGhlIHRyYW5zZmVyICovCi0JaWljc3RhdCAmPSB+IFMzQzI0MTBfSUlDU1RBVF9TVEFSVDsKKwlpaWNzdGF0ICY9IH5TM0MyNDEwX0lJQ1NUQVRfU1RBUlQ7CiAJd3JpdGVsKGlpY3N0YXQsIGkyYy0+cmVncyArIFMzQzI0MTBfSUlDU1RBVCk7Ci0JCisKIAlpMmMtPnN0YXRlID0gU1RBVEVfU1RPUDsKLQkKKwogCXMzYzI0eHhfaTJjX21hc3Rlcl9jb21wbGV0ZShpMmMsIHJldCk7CiAJczNjMjR4eF9pMmNfZGlzYWJsZV9pcnEoaTJjKTsKIH0KQEAgLTI0MSw3ICsyMTMsNyBAQAogCiAvKiBpc19sYXN0bXNnKCkKICAqCi0gKiByZXR1cm5zIFRSVUUgaWYgdGhlIGN1cnJlbnQgbWVzc2FnZSBpcyB0aGUgbGFzdCBpbiB0aGUgc2V0IAorICogcmV0dXJucyBUUlVFIGlmIHRoZSBjdXJyZW50IG1lc3NhZ2UgaXMgdGhlIGxhc3QgaW4gdGhlIHNldAogKi8KIAogc3RhdGljIGlubGluZSBpbnQgaXNfbGFzdG1zZyhzdHJ1Y3QgczNjMjR4eF9pMmMgKmkyYykKQEAgLTI4OSwxNCArMjYxLDE0IEBACiAKIAljYXNlIFNUQVRFX1NUT1A6CiAJCWRldl9lcnIoaTJjLT5kZXYsICIlczogY2FsbGVkIGluIFNUQVRFX1NUT1BcbiIsIF9fZnVuY19fKTsKLQkJczNjMjR4eF9pMmNfZGlzYWJsZV9pcnEoaTJjKTsJCQorCQlzM2MyNHh4X2kyY19kaXNhYmxlX2lycShpMmMpOwogCQlnb3RvIG91dF9hY2s7CiAKIAljYXNlIFNUQVRFX1NUQVJUOgogCQkvKiBsYXN0IHRoaW5nIHdlIGRpZCB3YXMgc2VuZCBhIHN0YXJ0IGNvbmRpdGlvbiBvbiB0aGUKIAkJICogYnVzLCBvciBzdGFydGVkIGEgbmV3IGkyYyBtZXNzYWdlCiAJCSAqLwotCQkKKwogCQlpZiAoaWljc3RhdCAmIFMzQzI0MTBfSUlDU1RBVF9MQVNUQklUICYmCiAJCSAgICAhKGkyYy0+bXNnLT5mbGFncyAmIEkyQ19NX0lHTk9SRV9OQUspKSB7CiAJCQkvKiBhY2sgd2FzIG5vdCByZWNlaXZlZC4uLiAqLwpAQCAtMzIyLDcgKzI5NCw3IEBACiAJCWlmIChpMmMtPnN0YXRlID09IFNUQVRFX1JFQUQpCiAJCQlnb3RvIHByZXBhcmVfcmVhZDsKIAotCQkvKiBmYWxsIHRocm91Z2ggdG8gdGhlIHdyaXRlIHN0YXRlLCBhcyB3ZSB3aWxsIG5lZWQgdG8gCisJCS8qIGZhbGwgdGhyb3VnaCB0byB0aGUgd3JpdGUgc3RhdGUsIGFzIHdlIHdpbGwgbmVlZCB0bwogCQkgKiBzZW5kIGEgYnl0ZSBhcyB3ZWxsICovCiAKIAljYXNlIFNUQVRFX1dSSVRFOgpAQCAtMzM5LDcgKzMxMSw3IEBACiAJCQl9CiAJCX0KIAotCXJldHJ5X3dyaXRlOgorIHJldHJ5X3dyaXRlOgogCiAJCWlmICghaXNfbXNnZW5kKGkyYykpIHsKIAkJCWJ5dGUgPSBpMmMtPm1zZy0+YnVmW2kyYy0+bXNnX3B0cisrXTsKQEAgLTM1OSw5ICszMzEsOSBAQAogCQkJZGV2X2RiZyhpMmMtPmRldiwgIldSSVRFOiBOZXh0IE1lc3NhZ2VcbiIpOwogCiAJCQlpMmMtPm1zZ19wdHIgPSAwOwotCQkJaTJjLT5tc2dfaWR4ICsrOworCQkJaTJjLT5tc2dfaWR4Kys7CiAJCQlpMmMtPm1zZysrOwotCQkJCisKIAkJCS8qIGNoZWNrIHRvIHNlZSBpZiB3ZSBuZWVkIHRvIGRvIGFub3RoZXIgbWVzc2FnZSAqLwogCQkJaWYgKGkyYy0+bXNnLT5mbGFncyAmIEkyQ19NX05PU1RBUlQpIHsKIApAQCAtMzc1LDcgKzM0Nyw2IEBACiAKIAkJCQlnb3RvIHJldHJ5X3dyaXRlOwogCQkJfSBlbHNlIHsKLQkJCQogCQkJCS8qIHNlbmQgdGhlIG5ldyBzdGFydCAqLwogCQkJCXMzYzI0eHhfaTJjX21lc3NhZ2Vfc3RhcnQoaTJjLCBpMmMtPm1zZyk7CiAJCQkJaTJjLT5zdGF0ZSA9IFNUQVRFX1NUQVJUOwpAQCAtMzg5LDcgKzM2MCw3IEBACiAJCWJyZWFrOwogCiAJY2FzZSBTVEFURV9SRUFEOgotCQkvKiB3ZSBoYXZlIGEgYnl0ZSBvZiBkYXRhIGluIHRoZSBkYXRhIHJlZ2lzdGVyLCBkbyAKKwkJLyogd2UgaGF2ZSBhIGJ5dGUgb2YgZGF0YSBpbiB0aGUgZGF0YSByZWdpc3RlciwgZG8KIAkJICogc29tZXRoaW5nIHdpdGggaXQsIGFuZCB0aGVuIHdvcmsgb3V0IHdldGhlciB3ZSBhcmUKIAkJICogZ29pbmcgdG8gZG8gYW55IG1vcmUgcmVhZC93cml0ZQogCQkgKi8KQEAgLTM5NywxMyArMzY4LDEzIEBACiAJCWJ5dGUgPSByZWFkYihpMmMtPnJlZ3MgKyBTM0MyNDEwX0lJQ0RTKTsKIAkJaTJjLT5tc2ctPmJ1ZltpMmMtPm1zZ19wdHIrK10gPSBieXRlOwogCi0JcHJlcGFyZV9yZWFkOgorIHByZXBhcmVfcmVhZDoKIAkJaWYgKGlzX21zZ2xhc3QoaTJjKSkgewogCQkJLyogbGFzdCBieXRlIG9mIGJ1ZmZlciAqLwogCiAJCQlpZiAoaXNfbGFzdG1zZyhpMmMpKQogCQkJCXMzYzI0eHhfaTJjX2Rpc2FibGVfYWNrKGkyYyk7Ci0JCQkKKwogCQl9IGVsc2UgaWYgKGlzX21zZ2VuZChpMmMpKSB7CiAJCQkvKiBvaywgd2UndmUgcmVhZCB0aGUgZW50aXJlIGJ1ZmZlciwgc2VlIGlmIHRoZXJlCiAJCQkgKiBpcyBhbnl0aGluZyBlbHNlIHdlIG5lZWQgdG8gZG8gKi8KQEAgLTQyOSw3ICs0MDAsNyBAQAogCS8qIGFja25vd2xlZ2RlIHRoZSBJUlEgYW5kIGdldCBiYWNrIG9uIHdpdGggdGhlIHdvcmsgKi8KIAogIG91dF9hY2s6Ci0JdG1wID0gcmVhZGwoaTJjLT5yZWdzICsgUzNDMjQxMF9JSUNDT04pOwkKKwl0bXAgPSByZWFkbChpMmMtPnJlZ3MgKyBTM0MyNDEwX0lJQ0NPTik7CiAJdG1wICY9IH5TM0MyNDEwX0lJQ0NPTl9JUlFQRU5EOwogCXdyaXRlbCh0bXAsIGkyYy0+cmVncyArIFMzQzI0MTBfSUlDQ09OKTsKICBvdXQ6CkBAIC00NTAsMTkgKzQyMSwxOSBAQAogCXN0YXR1cyA9IHJlYWRsKGkyYy0+cmVncyArIFMzQzI0MTBfSUlDU1RBVCk7CiAKIAlpZiAoc3RhdHVzICYgUzNDMjQxMF9JSUNTVEFUX0FSQklUUikgewotCQkvLyBkZWFsIHdpdGggYXJiaXRyYXRpb24gbG9zcworCQkvKiBkZWFsIHdpdGggYXJiaXRyYXRpb24gbG9zcyAqLwogCQlkZXZfZXJyKGkyYy0+ZGV2LCAiZGVhbCB3aXRoIGFyYml0cmF0aW9uIGxvc3NcbiIpOwogCX0KIAogCWlmIChpMmMtPnN0YXRlID09IFNUQVRFX0lETEUpIHsKIAkJZGV2X2RiZyhpMmMtPmRldiwgIklSUTogZXJyb3IgaTJjLT5zdGF0ZSA9PSBJRExFXG4iKTsKIAotCQl0bXAgPSByZWFkbChpMmMtPnJlZ3MgKyBTM0MyNDEwX0lJQ0NPTik7CQorCQl0bXAgPSByZWFkbChpMmMtPnJlZ3MgKyBTM0MyNDEwX0lJQ0NPTik7CiAJCXRtcCAmPSB+UzNDMjQxMF9JSUNDT05fSVJRUEVORDsKIAkJd3JpdGVsKHRtcCwgaTJjLT5yZWdzICsgIFMzQzI0MTBfSUlDQ09OKTsKIAkJZ290byBvdXQ7CiAJfQotCQorCiAJLyogcHJldHR5IG11Y2ggdGhpcyBsZWF2ZXMgdXMgd2l0aCB0aGUgZmFjdCB0aGF0IHdlJ3ZlCiAJICogdHJhbnNtaXR0ZWQgb3IgcmVjZWl2ZWQgd2hhdGV2ZXIgYnl0ZSB3ZSBsYXN0IHNlbnQgKi8KIApAQCAtNDg1LDE2ICs0NTYsMTMgQEAKIAogCXdoaWxlICh0aW1lb3V0LS0gPiAwKSB7CiAJCWlpY3N0YXQgPSByZWFkbChpMmMtPnJlZ3MgKyBTM0MyNDEwX0lJQ1NUQVQpOwotCQkKKwogCQlpZiAoIShpaWNzdGF0ICYgUzNDMjQxMF9JSUNTVEFUX0JVU0JVU1kpKQogCQkJcmV0dXJuIDA7CiAKIAkJbXNsZWVwKDEpOwogCX0KIAotCWRldl9kYmcoaTJjLT5kZXYsICJ0aW1lb3V0OiBHUEVEQVQgaXMgJTA4eFxuIiwKLQkJX19yYXdfcmVhZGwoUzNDMjQxMF9HUEVEQVQpKTsKLQogCXJldHVybiAtRVRJTUVET1VUOwogfQogCkBAIC01MDMsNyArNDcxLDggQEAKICAqIHRoaXMgc3RhcnRzIGFuIGkyYyB0cmFuc2ZlcgogKi8KIAotc3RhdGljIGludCBzM2MyNHh4X2kyY19kb3hmZXIoc3RydWN0IHMzYzI0eHhfaTJjICppMmMsIHN0cnVjdCBpMmNfbXNnICptc2dzLCBpbnQgbnVtKQorc3RhdGljIGludCBzM2MyNHh4X2kyY19kb3hmZXIoc3RydWN0IHMzYzI0eHhfaTJjICppMmMsCisJCQkgICAgICBzdHJ1Y3QgaTJjX21zZyAqbXNncywgaW50IG51bSkKIHsKIAl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CiAJaW50IHJldDsKQEAgLTUyOSwxMiArNDk4LDEyIEBACiAJczNjMjR4eF9pMmNfZW5hYmxlX2lycShpMmMpOwogCXMzYzI0eHhfaTJjX21lc3NhZ2Vfc3RhcnQoaTJjLCBtc2dzKTsKIAlzcGluX3VubG9ja19pcnEoJmkyYy0+bG9jayk7Ci0JCisKIAl0aW1lb3V0ID0gd2FpdF9ldmVudF90aW1lb3V0KGkyYy0+d2FpdCwgaTJjLT5tc2dfbnVtID09IDAsIEhaICogNSk7CiAKIAlyZXQgPSBpMmMtPm1zZ19pZHg7CiAKLQkvKiBoYXZpbmcgdGhlc2UgbmV4dCB0d28gYXMgZGV2X2VycigpIG1ha2VzIGxpZmUgdmVyeSAKKwkvKiBoYXZpbmcgdGhlc2UgbmV4dCB0d28gYXMgZGV2X2VycigpIG1ha2VzIGxpZmUgdmVyeQogCSAqIG5vaXN5IHdoZW4gZG9pbmcgYW4gaTJjZGV0ZWN0ICovCiAKIAlpZiAodGltZW91dCA9PSAwKQpAQCAtNTkxLDE5ICs1NjAsNiBAQAogCS5mdW5jdGlvbmFsaXR5CQk9IHMzYzI0eHhfaTJjX2Z1bmMsCiB9OwogCi1zdGF0aWMgc3RydWN0IHMzYzI0eHhfaTJjIHMzYzI0eHhfaTJjID0gewotCS5sb2NrCQk9IF9fU1BJTl9MT0NLX1VOTE9DS0VEKHMzYzI0eHhfaTJjLmxvY2spLAotCS53YWl0CQk9IF9fV0FJVF9RVUVVRV9IRUFEX0lOSVRJQUxJWkVSKHMzYzI0eHhfaTJjLndhaXQpLAotCS50eF9zZXR1cAk9IDUwLAotCS5hZGFwCQk9IHsKLQkJLm5hbWUJCQk9ICJzM2MyNDEwLWkyYyIsCi0JCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCi0JCS5hbGdvCQkJPSAmczNjMjR4eF9pMmNfYWxnb3JpdGhtLAotCQkucmV0cmllcwkJPSAyLAotCQkuY2xhc3MJCQk9IEkyQ19DTEFTU19IV01PTiB8IEkyQ19DTEFTU19TUEQsCi0JfSwKLX07Ci0KIC8qIHMzYzI0eHhfaTJjX2NhbGNkaXZpc29yCiAgKgogICogcmV0dXJuIHRoZSBkaXZpc29yIHNldHRpbmdzIGZvciBhIGdpdmVuIGZyZXF1ZW5jeQpAQCAtNjQzLDcgKzU5OSw3IEBACiB7CiAJaW50IGRpZmYgPSBmcmVxIC0gd2FudGVkOwogCi0JcmV0dXJuIChkaWZmID49IC0yICYmIGRpZmYgPD0gMik7CisJcmV0dXJuIGRpZmYgPj0gLTIgJiYgZGlmZiA8PSAyOwogfQogCiAvKiBzM2MyNHh4X2kyY19jbG9ja3JhdGUKQEAgLTY1NSw3ICs2MTEsNyBAQAogCiBzdGF0aWMgaW50IHMzYzI0eHhfaTJjX2Nsb2NrcmF0ZShzdHJ1Y3QgczNjMjR4eF9pMmMgKmkyYywgdW5zaWduZWQgaW50ICpnb3QpCiB7Ci0Jc3RydWN0IHMzYzI0MTBfcGxhdGZvcm1faTJjICpwZGF0YTsKKwlzdHJ1Y3QgczNjMjQxMF9wbGF0Zm9ybV9pMmMgKnBkYXRhID0gaTJjLT5kZXYtPnBsYXRmb3JtX2RhdGE7CiAJdW5zaWduZWQgbG9uZyBjbGtpbiA9IGNsa19nZXRfcmF0ZShpMmMtPmNsayk7CiAJdW5zaWduZWQgaW50IGRpdnMsIGRpdjE7CiAJdTMyIGlpY2NvbjsKQEAgLTY2MywxMCArNjE5LDggQEAKIAlpbnQgc3RhcnQsIGVuZDsKIAogCWkyYy0+Y2xrcmF0ZSA9IGNsa2luOwotCi0JcGRhdGEgPSBzM2MyNHh4X2kyY19nZXRfcGxhdGZvcm1kYXRhKGkyYy0+YWRhcC5kZXYucGFyZW50KTsKIAljbGtpbiAvPSAxMDAwOwkJLyogY2xraW4gbm93IGluIEtIeiAqLwotICAgICAKKwogCWRldl9kYmcoaTJjLT5kZXYsICJwZGF0YSAlcCwgZnJlcSAlbHUgJWx1Li4lbHVcbiIsCiAJCSBwZGF0YSwgcGRhdGEtPmJ1c19mcmVxLCBwZGF0YS0+bWluX2ZyZXEsIHBkYXRhLT5tYXhfZnJlcSk7CiAKQEAgLTc3NCw3ICs3MjgsNyBAQAogCiAvKiBzM2MyNHh4X2kyY19pbml0CiAgKgotICogaW5pdGlhbGlzZSB0aGUgY29udHJvbGxlciwgc2V0IHRoZSBJTyBsaW5lcyBhbmQgZnJlcXVlbmN5IAorICogaW5pdGlhbGlzZSB0aGUgY29udHJvbGxlciwgc2V0IHRoZSBJTyBsaW5lcyBhbmQgZnJlcXVlbmN5CiAqLwogCiBzdGF0aWMgaW50IHMzYzI0eHhfaTJjX2luaXQoc3RydWN0IHMzYzI0eHhfaTJjICppMmMpCkBAIC03ODUsMTUgKzczOSwxNSBAQAogCiAJLyogZ2V0IHRoZSBwbGFmcm9tIGRhdGEgKi8KIAotCXBkYXRhID0gczNjMjR4eF9pMmNfZ2V0X3BsYXRmb3JtZGF0YShpMmMtPmFkYXAuZGV2LnBhcmVudCk7CisJcGRhdGEgPSBpMmMtPmRldi0+cGxhdGZvcm1fZGF0YTsKIAogCS8qIGluaXRpdGFsaXNlIHRoZSBncGlvICovCiAKLQlzM2MyNDEwX2dwaW9fY2ZncGluKFMzQzI0MTBfR1BFMTUsIFMzQzI0MTBfR1BFMTVfSUlDU0RBKTsKLQlzM2MyNDEwX2dwaW9fY2ZncGluKFMzQzI0MTBfR1BFMTQsIFMzQzI0MTBfR1BFMTRfSUlDU0NMKTsKKwlpZiAocGRhdGEtPmNmZ19ncGlvKQorCQlwZGF0YS0+Y2ZnX2dwaW8odG9fcGxhdGZvcm1fZGV2aWNlKGkyYy0+ZGV2KSk7CiAKIAkvKiB3cml0ZSBzbGF2ZSBhZGRyZXNzICovCi0JCisKIAl3cml0ZWIocGRhdGEtPnNsYXZlX2FkZHIsIGkyYy0+cmVncyArIFMzQzI0MTBfSUlDQUREKTsKIAogCWRldl9pbmZvKGkyYy0+ZGV2LCAic2xhdmUgYWRkcmVzcyAweCUwMnhcbiIsIHBkYXRhLT5zbGF2ZV9hZGRyKTsKQEAgLTgzMSwxMiArNzg1LDMyIEBACiAKIHN0YXRpYyBpbnQgczNjMjR4eF9pMmNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKLQlzdHJ1Y3QgczNjMjR4eF9pMmMgKmkyYyA9ICZzM2MyNHh4X2kyYzsKKwlzdHJ1Y3QgczNjMjR4eF9pMmMgKmkyYzsKIAlzdHJ1Y3QgczNjMjQxMF9wbGF0Zm9ybV9pMmMgKnBkYXRhOwogCXN0cnVjdCByZXNvdXJjZSAqcmVzOwogCWludCByZXQ7CiAKLQlwZGF0YSA9IHMzYzI0eHhfaTJjX2dldF9wbGF0Zm9ybWRhdGEoJnBkZXYtPmRldik7CisJcGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlpZiAoIXBkYXRhKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIm5vIHBsYXRmb3JtIGRhdGFcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpMmMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgczNjMjR4eF9pMmMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWkyYykgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJubyBtZW1vcnkgZm9yIHN0YXRlXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJc3RybGNweShpMmMtPmFkYXAubmFtZSwgInMzYzI0MTAtaTJjIiwgc2l6ZW9mKGkyYy0+YWRhcC5uYW1lKSk7CisJaTJjLT5hZGFwLm93bmVyICAgPSBUSElTX01PRFVMRTsKKwlpMmMtPmFkYXAuYWxnbyAgICA9ICZzM2MyNHh4X2kyY19hbGdvcml0aG07CisJaTJjLT5hZGFwLnJldHJpZXMgPSAyOworCWkyYy0+YWRhcC5jbGFzcyAgID0gSTJDX0NMQVNTX0hXTU9OIHwgSTJDX0NMQVNTX1NQRDsKKwlpMmMtPnR4X3NldHVwICAgICA9IDUwOworCisJc3Bpbl9sb2NrX2luaXQoJmkyYy0+bG9jayk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmaTJjLT53YWl0KTsKIAogCS8qIGZpbmQgdGhlIGNsb2NrIGFuZCBlbmFibGUgaXQgKi8KIApAQCAtODc4LDcgKzg1Miw4IEBACiAJCWdvdG8gZXJyX2lvYXJlYTsKIAl9CiAKLQlkZXZfZGJnKCZwZGV2LT5kZXYsICJyZWdpc3RlcnMgJXAgKCVwLCAlcClcbiIsIGkyYy0+cmVncywgaTJjLT5pb2FyZWEsIHJlcyk7CisJZGV2X2RiZygmcGRldi0+ZGV2LCAicmVnaXN0ZXJzICVwICglcCwgJXApXG4iLAorCQlpMmMtPnJlZ3MsIGkyYy0+aW9hcmVhLCByZXMpOwogCiAJLyogc2V0dXAgaW5mbyBibG9jayBmb3IgdGhlIGkyYyBjb3JlICovCiAKQEAgLTg5MiwyOSArODY3LDIzIEBACiAJCWdvdG8gZXJyX2lvbWFwOwogCiAJLyogZmluZCB0aGUgSVJRIGZvciB0aGlzIHVuaXQgKG5vdGUsIHRoaXMgcmVsaWVzIG9uIHRoZSBpbml0IGNhbGwgdG8KLQkgKiBlbnN1cmUgbm8gY3VycmVudCBJUlFzIHBlbmRpbmcgCisJICogZW5zdXJlIG5vIGN1cnJlbnQgSVJRcyBwZW5kaW5nCiAJICovCiAKLQlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9JUlEsIDApOwotCWlmIChyZXMgPT0gTlVMTCkgeworCWkyYy0+aXJxID0gcmV0ID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKKwlpZiAocmV0IDw9IDApIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiY2Fubm90IGZpbmQgSVJRXG4iKTsKLQkJcmV0ID0gLUVOT0VOVDsKIAkJZ290byBlcnJfaW9tYXA7CiAJfQogCi0JcmV0ID0gcmVxdWVzdF9pcnEocmVzLT5zdGFydCwgczNjMjR4eF9pMmNfaXJxLCBJUlFGX0RJU0FCTEVELAotCQkJICBwZGV2LT5uYW1lLCBpMmMpOworCXJldCA9IHJlcXVlc3RfaXJxKGkyYy0+aXJxLCBzM2MyNHh4X2kyY19pcnEsIElSUUZfRElTQUJMRUQsCisJCQkgIGRldl9uYW1lKCZwZGV2LT5kZXYpLCBpMmMpOwogCiAJaWYgKHJldCAhPSAwKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgImNhbm5vdCBjbGFpbSBJUlFcbiIpOworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjYW5ub3QgY2xhaW0gSVJRICVkXG4iLCBpMmMtPmlycSk7CiAJCWdvdG8gZXJyX2lvbWFwOwogCX0KIAotCWkyYy0+aXJxID0gcmVzOwotCQkKLQlkZXZfZGJnKCZwZGV2LT5kZXYsICJpcnEgcmVzb3VyY2UgJXAgKCVsdSlcbiIsIHJlcywKLQkJKHVuc2lnbmVkIGxvbmcpcmVzLT5zdGFydCk7Ci0KIAlyZXQgPSBzM2MyNHh4X2kyY19yZWdpc3Rlcl9jcHVmcmVxKGkyYyk7CiAJaWYgKHJldCA8IDApIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIHJlZ2lzdGVyIGNwdWZyZXEgbm90aWZpZXJcbiIpOwpAQCAtOTM3LDE0ICs5MDYsMTQgQEAKIAogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGkyYyk7CiAKLQlkZXZfaW5mbygmcGRldi0+ZGV2LCAiJXM6IFMzQyBJMkMgYWRhcHRlclxuIiwgaTJjLT5hZGFwLmRldi5idXNfaWQpOworCWRldl9pbmZvKCZwZGV2LT5kZXYsICIlczogUzNDIEkyQyBhZGFwdGVyXG4iLCBkZXZfbmFtZSgmaTJjLT5hZGFwLmRldikpOwogCXJldHVybiAwOwogCiAgZXJyX2NwdWZyZXE6CiAJczNjMjR4eF9pMmNfZGVyZWdpc3Rlcl9jcHVmcmVxKGkyYyk7CiAKICBlcnJfaXJxOgotCWZyZWVfaXJxKGkyYy0+aXJxLT5zdGFydCwgaTJjKTsKKwlmcmVlX2lycShpMmMtPmlycSwgaTJjKTsKIAogIGVycl9pb21hcDoKIAlpb3VubWFwKGkyYy0+cmVncyk7CkBAIC05NTgsNiArOTI3LDcgQEAKIAljbGtfcHV0KGkyYy0+Y2xrKTsKIAogIGVycl9ub2NsazoKKwlrZnJlZShpMmMpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTk3Myw3ICs5NDMsNyBAQAogCXMzYzI0eHhfaTJjX2RlcmVnaXN0ZXJfY3B1ZnJlcShpMmMpOwogCiAJaTJjX2RlbF9hZGFwdGVyKCZpMmMtPmFkYXApOwotCWZyZWVfaXJxKGkyYy0+aXJxLT5zdGFydCwgaTJjKTsKKwlmcmVlX2lycShpMmMtPmlycSwgaTJjKTsKIAogCWNsa19kaXNhYmxlKGkyYy0+Y2xrKTsKIAljbGtfcHV0KGkyYy0+Y2xrKTsKQEAgLTk4Miw2ICs5NTIsNyBAQAogCiAJcmVsZWFzZV9yZXNvdXJjZShpMmMtPmlvYXJlYSk7CiAJa2ZyZWUoaTJjLT5pb2FyZWEpOworCWtmcmVlKGkyYyk7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtc2g3NzYwLmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXNoNzc2MC5jCmluZGV4IDVlMGUyNTQuLmJhYTI4YjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtc2g3NzYwLmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1zaDc3NjAuYwpAQCAtNDc1LDcgKzQ3NSw3IEBACiAKIAlpZC0+YWRhcC5uciA9IHBkZXYtPmlkOwogCWlkLT5hZGFwLmFsZ28gPSAmc2g3NzYwX2kyY19hbGdvOwotCWlkLT5hZGFwLmNsYXNzID0gSTJDX0NMQVNTX0FMTDsKKwlpZC0+YWRhcC5jbGFzcyA9IEkyQ19DTEFTU19IV01PTiB8IEkyQ19DTEFTU19TUEQ7CiAJaWQtPmFkYXAucmV0cmllcyA9IDM7CiAJaWQtPmFkYXAuYWxnb19kYXRhID0gaWQ7CiAJaWQtPmFkYXAuZGV2LnBhcmVudCA9ICZwZGV2LT5kZXY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXNoX21vYmlsZS5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1zaF9tb2JpbGUuYwppbmRleCA2YzNkNjBiLi4xYzAxMDgzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXNoX21vYmlsZS5jCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtc2hfbW9iaWxlLmMKQEAgLTUwMCw3ICs1MDAsNyBAQAogCXdoaWxlICgocmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKGRldiwgSU9SRVNPVVJDRV9JUlEsIGspKSkgewogCQlmb3IgKG4gPSByZXMtPnN0YXJ0OyBob29rICYmIG4gPD0gcmVzLT5lbmQ7IG4rKykgewogCQkJaWYgKHJlcXVlc3RfaXJxKG4sIHNoX21vYmlsZV9pMmNfaXNyLCBJUlFGX0RJU0FCTEVELAotCQkJCQlkZXYtPmRldi5idXNfaWQsIGRldikpCisJCQkJCWRldl9uYW1lKCZkZXYtPmRldiksIGRldikpCiAJCQkJZ290byByb2xsYmFjazsKIAkJfQogCQlrKys7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXNpczU1OTUuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtc2lzNTU5NS5jCmluZGV4IGRmYzJkNWUuLjhjZTJkYWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtc2lzNTU5NS5jCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtc2lzNTU5NS5jCkBAIC0zODksOCArMzg5LDggQEAKIAkvKiBzZXQgdXAgdGhlIHN5c2ZzIGxpbmthZ2UgdG8gb3VyIHBhcmVudCBkZXZpY2UgKi8KIAlzaXM1NTk1X2FkYXB0ZXIuZGV2LnBhcmVudCA9ICZkZXYtPmRldjsKIAotCXNwcmludGYoc2lzNTU5NV9hZGFwdGVyLm5hbWUsICJTTUJ1cyBTSVM1NTk1IGFkYXB0ZXIgYXQgJTA0eCIsCi0JCXNpczU1OTVfYmFzZSArIFNNQl9JTkRFWCk7CisJc25wcmludGYoc2lzNTU5NV9hZGFwdGVyLm5hbWUsIHNpemVvZihzaXM1NTk1X2FkYXB0ZXIubmFtZSksCisJCSAiU01CdXMgU0lTNTU5NSBhZGFwdGVyIGF0ICUwNHgiLCBzaXM1NTk1X2Jhc2UgKyBTTUJfSU5ERVgpOwogCWVyciA9IGkyY19hZGRfYWRhcHRlcigmc2lzNTU5NV9hZGFwdGVyKTsKIAlpZiAoZXJyKSB7CiAJCXJlbGVhc2VfcmVnaW9uKHNpczU1OTVfYmFzZSArIFNNQl9JTkRFWCwgMik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXNpczYzMC5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1zaXM2MzAuYwppbmRleCBlN2M0Yjc5Li45YzljMDE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXNpczYzMC5jCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtc2lzNjMwLmMKQEAgLTQ4Nyw4ICs0ODcsOCBAQAogCS8qIHNldCB1cCB0aGUgc3lzZnMgbGlua2FnZSB0byBvdXIgcGFyZW50IGRldmljZSAqLwogCXNpczYzMF9hZGFwdGVyLmRldi5wYXJlbnQgPSAmZGV2LT5kZXY7CiAKLQlzcHJpbnRmKHNpczYzMF9hZGFwdGVyLm5hbWUsICJTTUJ1cyBTSVM2MzAgYWRhcHRlciBhdCAlMDR4IiwKLQkJYWNwaV9iYXNlICsgU01CX1NUUyk7CisJc25wcmludGYoc2lzNjMwX2FkYXB0ZXIubmFtZSwgc2l6ZW9mKHNpczYzMF9hZGFwdGVyLm5hbWUpLAorCQkgIlNNQnVzIFNJUzYzMCBhZGFwdGVyIGF0ICUwNHgiLCBhY3BpX2Jhc2UgKyBTTUJfU1RTKTsKIAogCXJldHVybiBpMmNfYWRkX2FkYXB0ZXIoJnNpczYzMF9hZGFwdGVyKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2NoaXBzL0tjb25maWcgYi9kcml2ZXJzL2kyYy9jaGlwcy9LY29uZmlnCmluZGV4IDRjMzU3MDIuLjU5YzNkMjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2NoaXBzL0tjb25maWcKKysrIGIvZHJpdmVycy9pMmMvY2hpcHMvS2NvbmZpZwpAQCAtMTE0LDMxICsxMTQsNiBAQAogCSAgVGhlc2UgZGV2aWNlcyBhcmUgaGFyZCB0byBkZXRlY3QgYW5kIHJhcmVseSBmb3VuZCBvbiBtYWluc3RyZWFtCiAJICBoYXJkd2FyZS4gIElmIHVuc3VyZSwgc2F5IE4uCiAKLWNvbmZpZyBJU1AxMzAxX09NQVAKLQl0cmlzdGF0ZSAiUGhpbGlwcyBJU1AxMzAxIHdpdGggT01BUCBPVEciCi0JZGVwZW5kcyBvbiBBUkNIX09NQVBfT1RHCi0JaGVscAotCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZSBQaGlsaXBzIElTUDEzMDEKLQkgIFVTQi1Pbi1UaGUtR28gdHJhbnNjZWl2ZXIgd29ya2luZyB3aXRoIHRoZSBPTUFQIE9URyBjb250cm9sbGVyLgotCSAgVGhlIElTUDEzMDEgaXMgdXNlZCBpbiBwcm9kdWN0cyBpbmNsdWRpbmcgSDIgYW5kIEgzIGRldmVsb3BtZW50Ci0JICBib2FyZHMgZm9yIFRleGFzIEluc3RydW1lbnRzIE9NQVAgcHJvY2Vzc29ycy4KLQkgIAotCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQotCSAgd2lsbCBiZSBjYWxsZWQgaXNwMTMwMV9vbWFwLgotCi1jb25maWcgVFBTNjUwMTAKLQl0cmlzdGF0ZSAiVFBTNjUwMXggUG93ZXIgTWFuYWdlbWVudCBjaGlwcyIKLQlkZXBlbmRzIG9uIEdQSU9MSUIKLQlkZWZhdWx0IHkgaWYgTUFDSF9PTUFQX0gyIHx8IE1BQ0hfT01BUF9IMyB8fCBNQUNIX09NQVBfT1NLCi0JaGVscAotCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZSBUUFM2NTAxeCBzZXJpZXMgb2YKLQkgIFBvd2VyIE1hbmFnZW1lbnQgY2hpcHMuICBUaGVzZSBpbmNsdWRlIHZvbHRhZ2UgcmVndWxhdG9ycywKLQkgIGxpdGhpdW0gaW9uL3BvbHltZXIgYmF0dGVyeSBjaGFyZ2luZywgYW5kIG90aGVyIGZlYXR1cmVzIHRoYXQKLQkgIGFyZSBvZnRlbiB1c2VkIGluIHBvcnRhYmxlIGRldmljZXMgbGlrZSBjZWxsIHBob25lcyBhbmQgY2FtZXJhcy4KLQotCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQotCSAgd2lsbCBiZSBjYWxsZWQgdHBzNjUwMTAuCi0KIGNvbmZpZyBTRU5TT1JTX01BWDY4NzUKIAl0cmlzdGF0ZSAiTWF4aW0gTUFYNjg3NSBQb3dlciBzdXBwbHkgc3VwZXJ2aXNvciIKIAlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTApAQCAtMTY0LDE2ICsxMzksNiBAQAogCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQogCSAgd2lsbCBiZSBjYWxsZWQgdHNsMjU1MC4KIAotY29uZmlnIE1FTkVMQVVTCi0JYm9vbCAiVFdMOTIzMzAvTWVuZWxhdXMgUE0gY2hpcCIKLQlkZXBlbmRzIG9uIEkyQz15ICYmIEFSQ0hfT01BUDI0WFgKLQloZWxwCi0JICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgdGhlIFRleGFzIEluc3RydW1lbnRzCi0JICBUV0w5MjMzMC9NZW5lbGF1cyBQb3dlciBNYW5hZ2VtZW50IGNoaXAuIFRoaXMgaW5jbHVkZSB2b2x0YWdlCi0JICByZWd1bGF0b3JzLCBEdWFsIHNsb3QgbWVtb3J5IGNhcmQgdHJhbmNlaXZlcnMsIHJlYWwtdGltZSBjbG9jawotCSAgYW5kIG90aGVyIGZlYXR1cmVzIHRoYXQgYXJlIG9mdGVuIHVzZWQgaW4gcG9ydGFibGUgZGV2aWNlcyBsaWtlCi0JICBjZWxsIHBob25lcyBhbmQgUERBcy4KLQogY29uZmlnIE1DVV9NUEM4MzQ5RU1JVFgKIAl0cmlzdGF0ZSAiTVBDODM0OUUtbUlUWCBNQ1UgZHJpdmVyIgogCWRlcGVuZHMgb24gSTJDICYmIFBQQ184M3h4CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9jaGlwcy9NYWtlZmlsZSBiL2RyaXZlcnMvaTJjL2NoaXBzL01ha2VmaWxlCmluZGV4IDIzZDJhMzEuLjgzYWNjYWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2NoaXBzL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvaTJjL2NoaXBzL01ha2VmaWxlCkBAIC0xOCw5ICsxOCw2IEBACiBvYmotJChDT05GSUdfU0VOU09SU19QQ0Y4NTc0KQkrPSBwY2Y4NTc0Lm8KIG9iai0kKENPTkZJR19QQ0Y4NTc1KQkJKz0gcGNmODU3NS5vCiBvYmotJChDT05GSUdfU0VOU09SU19QQ0Y4NTkxKQkrPSBwY2Y4NTkxLm8KLW9iai0kKENPTkZJR19JU1AxMzAxX09NQVApCSs9IGlzcDEzMDFfb21hcC5vCi1vYmotJChDT05GSUdfVFBTNjUwMTApCQkrPSB0cHM2NTAxMC5vCi1vYmotJChDT05GSUdfTUVORUxBVVMpCQkrPSBtZW5lbGF1cy5vCiBvYmotJChDT05GSUdfU0VOU09SU19UU0wyNTUwKQkrPSB0c2wyNTUwLm8KIG9iai0kKENPTkZJR19NQ1VfTVBDODM0OUVNSVRYKQkrPSBtY3VfbXBjODM0OWVtaXR4Lm8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvaTJjLWNvcmUuYyBiL2RyaXZlcnMvaTJjL2kyYy1jb3JlLmMKaW5kZXggYzZhNjNmNC4uYjFjOWFiZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvaTJjLWNvcmUuYworKysgYi9kcml2ZXJzL2kyYy9pMmMtY29yZS5jCkBAIC00NTksNyArNDU5LDcgQEAKIAkJcHJfZGVidWcoIkkyQyBhZGFwdGVyIGRyaXZlciBbJXNdIGZvcmdvdCB0byBzcGVjaWZ5ICIKIAkJCSAicGh5c2ljYWwgZGV2aWNlXG4iLCBhZGFwLT5uYW1lKTsKIAl9Ci0Jc3ByaW50ZihhZGFwLT5kZXYuYnVzX2lkLCAiaTJjLSVkIiwgYWRhcC0+bnIpOworCWRldl9zZXRfbmFtZSgmYWRhcC0+ZGV2LCAiaTJjLSVkIiwgYWRhcC0+bnIpOwogCWFkYXAtPmRldi5yZWxlYXNlID0gJmkyY19hZGFwdGVyX2Rldl9yZWxlYXNlOwogCWFkYXAtPmRldi5jbGFzcyA9ICZpMmNfYWRhcHRlcl9jbGFzczsKIAlyZXMgPSBkZXZpY2VfcmVnaXN0ZXIoJmFkYXAtPmRldik7CkBAIC04NDUsOCArODQ1LDggQEAKIAl9IGVsc2UKIAkJY2xpZW50LT5kZXYucmVsZWFzZSA9IGkyY19jbGllbnRfZGV2X3JlbGVhc2U7CiAKLQlzbnByaW50ZigmY2xpZW50LT5kZXYuYnVzX2lkWzBdLCBzaXplb2YoY2xpZW50LT5kZXYuYnVzX2lkKSwKLQkJIiVkLSUwNHgiLCBpMmNfYWRhcHRlcl9pZChhZGFwdGVyKSwgY2xpZW50LT5hZGRyKTsKKwlkZXZfc2V0X25hbWUoJmNsaWVudC0+ZGV2LCAiJWQtJTA0eCIsIGkyY19hZGFwdGVyX2lkKGFkYXB0ZXIpLAorCQkgICAgIGNsaWVudC0+YWRkcik7CiAJcmVzID0gZGV2aWNlX3JlZ2lzdGVyKCZjbGllbnQtPmRldik7CiAJaWYgKHJlcykKIAkJZ290byBvdXRfZXJyOwpAQCAtODU2LDcgKzg1Niw3IEBACiAJbXV0ZXhfdW5sb2NrKCZhZGFwdGVyLT5jbGlzdF9sb2NrKTsKIAogCWRldl9kYmcoJmFkYXB0ZXItPmRldiwgImNsaWVudCBbJXNdIHJlZ2lzdGVyZWQgd2l0aCBidXMgaWQgJXNcbiIsCi0JCWNsaWVudC0+bmFtZSwgY2xpZW50LT5kZXYuYnVzX2lkKTsKKwkJY2xpZW50LT5uYW1lLCBkZXZfbmFtZSgmY2xpZW50LT5kZXYpKTsKIAogCWlmIChhZGFwdGVyLT5jbGllbnRfcmVnaXN0ZXIpICB7CiAJCWlmIChhZGFwdGVyLT5jbGllbnRfcmVnaXN0ZXIoY2xpZW50KSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvS2NvbmZpZyBiL2RyaXZlcnMvaWRlL0tjb25maWcKaW5kZXggNGVlODVmYy4uM2Y5NTAzOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvS2NvbmZpZworKysgYi9kcml2ZXJzL2lkZS9LY29uZmlnCkBAIC01MTEsNiArNTExLDEzIEBACiAJICBUaGlzIGFsbG93cyB0aGUga2VybmVsIHRvIGNoYW5nZSBQSU8sIERNQSBhbmQgVURNQSBzcGVlZHMgYW5kIHRvCiAJICBjb25maWd1cmUgdGhlIGNoaXAgdG8gb3B0aW11bSBwZXJmb3JtYW5jZS4KIAorY29uZmlnIEJMS19ERVZfSVQ4MTcyCisJdHJpc3RhdGUgIklUODE3MiBJREUgc3VwcG9ydCIKKwlzZWxlY3QgQkxLX0RFVl9JREVETUFfUENJCisJaGVscAorCSAgVGhpcyBkcml2ZXIgYWRkcyBzdXBwb3J0IGZvciB0aGUgSURFIGNvbnRyb2xsZXIgb24gdGhlCisJICBJVDgxNzIgU3lzdGVtIENvbnRyb2xsZXIuCisKIGNvbmZpZyBCTEtfREVWX0lUODIxMwogCXRyaXN0YXRlICJJVDgyMTMgSURFIHN1cHBvcnQiCiAJc2VsZWN0IEJMS19ERVZfSURFRE1BX1BDSQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvTWFrZWZpbGUgYi9kcml2ZXJzL2lkZS9NYWtlZmlsZQppbmRleCA0MTA3Mjg5Li5jMmI5YzkzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2lkZS9NYWtlZmlsZQpAQCAtNDcsNiArNDcsNyBAQAogb2JqLSQoQ09ORklHX0JMS19ERVZfQ1k4MkM2OTMpCQkrPSBjeTgyYzY5My5vCiBvYmotJChDT05GSUdfQkxLX0RFVl9ERUxLSU4pCQkrPSBkZWxraW5fY2Iubwogb2JqLSQoQ09ORklHX0JMS19ERVZfSFBUMzY2KQkJKz0gaHB0MzY2Lm8KK29iai0kKENPTkZJR19CTEtfREVWX0lUODE3MikJCSs9IGl0ODE3Mi5vCiBvYmotJChDT05GSUdfQkxLX0RFVl9JVDgyMTMpCQkrPSBpdDgyMTMubwogb2JqLSQoQ09ORklHX0JMS19ERVZfSVQ4MjFYKQkJKz0gaXQ4MjF4Lm8KIG9iai0kKENPTkZJR19CTEtfREVWX0pNSUNST04pCQkrPSBqbWljcm9uLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2FlYzYyeHguYyBiL2RyaXZlcnMvaWRlL2FlYzYyeHguYwppbmRleCA0MTQyYzY5Li40NDg1YjljIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9hZWM2Mnh4LmMKKysrIGIvZHJpdmVycy9pZGUvYWVjNjJ4eC5jCkBAIC04Myw3ICs4Myw3IEBACiAKIHN0YXRpYyB2b2lkIGFlYzYyMTBfc2V0X21vZGUoaWRlX2RyaXZlX3QgKmRyaXZlLCBjb25zdCB1OCBzcGVlZCkKIHsKLQlpZGVfaHdpZl90ICpod2lmCT0gSFdJRihkcml2ZSk7CisJaWRlX2h3aWZfdCAqaHdpZgk9IGRyaXZlLT5od2lmOwogCXN0cnVjdCBwY2lfZGV2ICpkZXYJPSB0b19wY2lfZGV2KGh3aWYtPmRldik7CiAJc3RydWN0IGlkZV9ob3N0ICpob3N0CT0gcGNpX2dldF9kcnZkYXRhKGRldik7CiAJc3RydWN0IGNoaXBzZXRfYnVzX2Nsb2NrX2xpc3RfZW50cnkgKmJ1c19jbG9jayA9IGhvc3QtPmhvc3RfcHJpdjsKQEAgLTExMSw3ICsxMTEsNyBAQAogCiBzdGF0aWMgdm9pZCBhZWM2MjYwX3NldF9tb2RlKGlkZV9kcml2ZV90ICpkcml2ZSwgY29uc3QgdTggc3BlZWQpCiB7Ci0JaWRlX2h3aWZfdCAqaHdpZgk9IEhXSUYoZHJpdmUpOworCWlkZV9od2lmX3QgKmh3aWYJPSBkcml2ZS0+aHdpZjsKIAlzdHJ1Y3QgcGNpX2RldiAqZGV2CT0gdG9fcGNpX2Rldihod2lmLT5kZXYpOwogCXN0cnVjdCBpZGVfaG9zdCAqaG9zdAk9IHBjaV9nZXRfZHJ2ZGF0YShkZXYpOwogCXN0cnVjdCBjaGlwc2V0X2J1c19jbG9ja19saXN0X2VudHJ5ICpidXNfY2xvY2sgPSBob3N0LT5ob3N0X3ByaXY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9hbGltMTV4My5jIGIvZHJpdmVycy9pZGUvYWxpbTE1eDMuYwppbmRleCA0NWQyMzU2Li42NmY0MzA4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9hbGltMTV4My5jCisrKyBiL2RyaXZlcnMvaWRlL2FsaW0xNXgzLmMKQEAgLTY4LDcgKzY4LDcgQEAKIAogc3RhdGljIHZvaWQgYWxpX3NldF9waW9fbW9kZShpZGVfZHJpdmVfdCAqZHJpdmUsIGNvbnN0IHU4IHBpbykKIHsKLQlpZGVfaHdpZl90ICpod2lmID0gSFdJRihkcml2ZSk7CisJaWRlX2h3aWZfdCAqaHdpZiA9IGRyaXZlLT5od2lmOwogCXN0cnVjdCBwY2lfZGV2ICpkZXYgPSB0b19wY2lfZGV2KGh3aWYtPmRldik7CiAJc3RydWN0IGlkZV90aW1pbmcgKnQgPSBpZGVfdGltaW5nX2ZpbmRfbW9kZShYRkVSX1BJT18wICsgcGlvKTsKIAlpbnQgc190aW1lID0gdC0+c2V0dXAsIGFfdGltZSA9IHQtPmFjdGl2ZSwgY190aW1lID0gdC0+Y3ljbGU7CkBAIC0xNTAsNyArMTUwLDcgQEAKIAogc3RhdGljIHZvaWQgYWxpX3NldF9kbWFfbW9kZShpZGVfZHJpdmVfdCAqZHJpdmUsIGNvbnN0IHU4IHNwZWVkKQogewotCWlkZV9od2lmX3QgKmh3aWYJPSBIV0lGKGRyaXZlKTsKKwlpZGVfaHdpZl90ICpod2lmCT0gZHJpdmUtPmh3aWY7CiAJc3RydWN0IHBjaV9kZXYgKmRldgk9IHRvX3BjaV9kZXYoaHdpZi0+ZGV2KTsKIAl1OCBzcGVlZDEJCT0gc3BlZWQ7CiAJdTggdW5pdAkJCT0gZHJpdmUtPmRuICYgMTsKQEAgLTE5OCw3ICsxOTgsNyBAQAogc3RhdGljIGludCBhbGkxNXgzX2RtYV9zZXR1cChpZGVfZHJpdmVfdCAqZHJpdmUpCiB7CiAJaWYgKG01MjI5X3JldmlzaW9uIDwgMHhDMiAmJiBkcml2ZS0+bWVkaWEgIT0gaWRlX2Rpc2spIHsKLQkJaWYgKHJxX2RhdGFfZGlyKGRyaXZlLT5od2lmLT5od2dyb3VwLT5ycSkpCisJCWlmIChycV9kYXRhX2Rpcihkcml2ZS0+aHdpZi0+cnEpKQogCQkJcmV0dXJuIDE7CS8qIHRyeSBQSU8gaW5zdGVhZCBvZiBETUEgKi8KIAl9CiAJcmV0dXJuIGlkZV9kbWFfc2V0dXAoZHJpdmUpOwpAQCAtNDkwLDggKzQ5MCw2IEBACiAJaWYgKGlkZV9hbGxvY2F0ZV9kbWFfZW5naW5lKGh3aWYpKQogCQlyZXR1cm4gLTE7CiAKLQlod2lmLT5kbWFfb3BzID0gJnNmZl9kbWFfb3BzOwotCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTUxMSw2ICs1MDksNyBAQAogCS5kbWFfdGVzdF9pcnEJCT0gaWRlX2RtYV90ZXN0X2lycSwKIAkuZG1hX2xvc3RfaXJxCQk9IGlkZV9kbWFfbG9zdF9pcnEsCiAJLmRtYV90aW1lb3V0CQk9IGlkZV9kbWFfdGltZW91dCwKKwkuZG1hX3NmZl9yZWFkX3N0YXR1cwk9IGlkZV9kbWFfc2ZmX3JlYWRfc3RhdHVzLAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBpZGVfcG9ydF9pbmZvIGFsaTE1eDNfY2hpcHNldCBfX2RldmluaXRkYXRhID0gewpAQCAtNTE5LDYgKzUxOCw3IEBACiAJLmluaXRfaHdpZgk9IGluaXRfaHdpZl9hbGkxNXgzLAogCS5pbml0X2RtYQk9IGluaXRfZG1hX2FsaTE1eDMsCiAJLnBvcnRfb3BzCT0gJmFsaV9wb3J0X29wcywKKwkuZG1hX29wcwk9ICZzZmZfZG1hX29wcywKIAkucGlvX21hc2sJPSBBVEFfUElPNSwKIAkuc3dkbWFfbWFzawk9IEFUQV9TV0RNQTIsCiAJLm13ZG1hX21hc2sJPSBBVEFfTVdETUEyLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvYW1kNzR4eC5jIGIvZHJpdmVycy9pZGUvYW1kNzR4eC5jCmluZGV4IGM2YmNkMzAuLjY5NjYwYTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2FtZDc0eHguYworKysgYi9kcml2ZXJzL2lkZS9hbWQ3NHh4LmMKQEAgLTgyLDcgKzgyLDcgQEAKIHsKIAlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7CiAJc3RydWN0IHBjaV9kZXYgKmRldiA9IHRvX3BjaV9kZXYoaHdpZi0+ZGV2KTsKLQlpZGVfZHJpdmVfdCAqcGVlciA9IGh3aWYtPmRyaXZlcyArICh+ZHJpdmUtPmRuICYgMSk7CisJaWRlX2RyaXZlX3QgKnBlZXIgPSBpZGVfZ2V0X3BhaXJfZGV2KGRyaXZlKTsKIAlzdHJ1Y3QgaWRlX3RpbWluZyB0LCBwOwogCWludCBULCBVVDsKIAl1OCB1ZG1hX21hc2sgPSBod2lmLT51bHRyYV9tYXNrOwpAQCAtOTIsNyArOTIsNyBAQAogCiAJaWRlX3RpbWluZ19jb21wdXRlKGRyaXZlLCBzcGVlZCwgJnQsIFQsIFVUKTsKIAotCWlmIChwZWVyLT5kZXZfZmxhZ3MgJiBJREVfREZMQUdfUFJFU0VOVCkgeworCWlmIChwZWVyKSB7CiAJCWlkZV90aW1pbmdfY29tcHV0ZShwZWVyLCBwZWVyLT5jdXJyZW50X3NwZWVkLCAmcCwgVCwgVVQpOwogCQlpZGVfdGltaW5nX21lcmdlKCZwLCAmdCwgJnQsIElERV9USU1JTkdfOEJJVCk7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvYXUxeHh4LWlkZS5jIGIvZHJpdmVycy9pZGUvYXUxeHh4LWlkZS5jCmluZGV4IDBlYzhmZDEuLjc5YTJkZmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2F1MXh4eC1pZGUuYworKysgYi9kcml2ZXJzL2lkZS9hdTF4eHgtaWRlLmMKQEAgLTIxMiw4ICsyMTIsOCBAQAogc3RhdGljIGludCBhdWlkZV9idWlsZF9kbWF0YWJsZShpZGVfZHJpdmVfdCAqZHJpdmUpCiB7CiAJaW50IGksIGlzd3JpdGUsIGNvdW50ID0gMDsKLQlpZGVfaHdpZl90ICpod2lmID0gSFdJRihkcml2ZSk7Ci0Jc3RydWN0IHJlcXVlc3QgKnJxID0gSFdHUk9VUChkcml2ZSktPnJxOworCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKKwlzdHJ1Y3QgcmVxdWVzdCAqcnEgPSBod2lmLT5ycTsKIAlfYXVpZGVfaHdpZiAqYWh3aWYgPSAmYXVpZGVfaHdpZjsKIAlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOwogCkBAIC0yODYsNyArMjg2LDcgQEAKIAogc3RhdGljIGludCBhdWlkZV9kbWFfZW5kKGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKLQlpZGVfaHdpZl90ICpod2lmID0gSFdJRihkcml2ZSk7CisJaWRlX2h3aWZfdCAqaHdpZiA9IGRyaXZlLT5od2lmOwogCiAJaWYgKGh3aWYtPnNnX25lbnRzKSB7CiAJCWlkZV9kZXN0cm95X2RtYXRhYmxlKGRyaXZlKTsKQEAgLTMwOSw4ICszMDksOCBAQAogfQogCiBzdGF0aWMgaW50IGF1aWRlX2RtYV9zZXR1cChpZGVfZHJpdmVfdCAqZHJpdmUpCi17ICAgICAgIAkKLQlzdHJ1Y3QgcmVxdWVzdCAqcnEgPSBIV0dST1VQKGRyaXZlKS0+cnE7Cit7CisJc3RydWN0IHJlcXVlc3QgKnJxID0gZHJpdmUtPmh3aWYtPnJxOwogCiAJaWYgKCFhdWlkZV9idWlsZF9kbWF0YWJsZShkcml2ZSkpIHsKIAkJaWRlX21hcF9zZyhkcml2ZSwgcnEpOwpAQCAtNTAyLDcgKzUwMiw2IEBACiAJLmV4ZWNfY29tbWFuZAkJPSBpZGVfZXhlY19jb21tYW5kLAogCS5yZWFkX3N0YXR1cwkJPSBpZGVfcmVhZF9zdGF0dXMsCiAJLnJlYWRfYWx0c3RhdHVzCQk9IGlkZV9yZWFkX2FsdHN0YXR1cywKLQkucmVhZF9zZmZfZG1hX3N0YXR1cwk9IGlkZV9yZWFkX3NmZl9kbWFfc3RhdHVzLAogCiAJLnNldF9pcnEJCT0gaWRlX3NldF9pcnEsCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2NtZDY0MC5jIGIvZHJpdmVycy9pZGUvY21kNjQwLmMKaW5kZXggZTQzMDY2NC4uODg5MDI3NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvY21kNjQwLmMKKysrIGIvZHJpdmVycy9pZGUvY21kNjQwLmMKQEAgLTQ2NywxMSArNDY3LDEwIEBACiAJICogc28gd2UgbWVyZ2UgdGhlIHRpbWluZ3MsIHVzaW5nIHRoZSBzbG93ZXN0IHZhbHVlIGZvciBlYWNoIHRpbWluZy4KIAkgKi8KIAlpZiAoaW5kZXggPiAxKSB7Ci0JCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKLQkJaWRlX2RyaXZlX3QgKnBlZXIgPSAmaHdpZi0+ZHJpdmVzWyEoZHJpdmUtPmRuICYgMSldOworCQlpZGVfZHJpdmVfdCAqcGVlciA9IGlkZV9nZXRfcGFpcl9kZXYoZHJpdmUpOwogCQl1bnNpZ25lZCBpbnQgbWF0ZSA9IGluZGV4IF4gMTsKIAotCQlpZiAocGVlci0+ZGV2X2ZsYWdzICYgSURFX0RGTEFHX1BSRVNFTlQpIHsKKwkJaWYgKHBlZXIpIHsKIAkJCWlmIChzZXR1cF9jb3VudCA8IHNldHVwX2NvdW50c1ttYXRlXSkKIAkJCQlzZXR1cF9jb3VudCA9IHNldHVwX2NvdW50c1ttYXRlXTsKIAkJCWlmIChhY3RpdmVfY291bnQgPCBhY3RpdmVfY291bnRzW21hdGVdKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvY21kNjR4LmMgYi9kcml2ZXJzL2lkZS9jbWQ2NHguYwppbmRleCAzNjIzYmYwLi4yZjk2ODhkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9jbWQ2NHguYworKysgYi9kcml2ZXJzL2lkZS9jbWQ2NHguYwpAQCAtMTE1LDcgKzExNSw3IEBACiAgKi8KIHN0YXRpYyB2b2lkIGNtZDY0eF90dW5lX3BpbyhpZGVfZHJpdmVfdCAqZHJpdmUsIGNvbnN0IHU4IHBpbykKIHsKLQlpZGVfaHdpZl90ICpod2lmCT0gSFdJRihkcml2ZSk7CisJaWRlX2h3aWZfdCAqaHdpZgk9IGRyaXZlLT5od2lmOwogCXN0cnVjdCBwY2lfZGV2ICpkZXYJPSB0b19wY2lfZGV2KGh3aWYtPmRldik7CiAJc3RydWN0IGlkZV90aW1pbmcgKnQJPSBpZGVfdGltaW5nX2ZpbmRfbW9kZShYRkVSX1BJT18wICsgcGlvKTsKIAl1bnNpZ25lZCBpbnQgY3ljbGVfdGltZTsKQEAgLTEzOCwxMCArMTM4LDEyIEBACiAJICogdGhlIHNsb3dlc3QgYWRkcmVzcyBzZXR1cCB0aW1pbmcgb3Vyc2VsdmVzLgogCSAqLwogCWlmIChod2lmLT5jaGFubmVsKSB7Ci0JCWlkZV9kcml2ZV90ICpkcml2ZXMgPSBod2lmLT5kcml2ZXM7CisJCWlkZV9kcml2ZV90ICpwYWlyID0gaWRlX2dldF9wYWlyX2Rldihkcml2ZSk7CiAKIAkJZHJpdmUtPmRyaXZlX2RhdGEgPSBzZXR1cF9jb3VudDsKLQkJc2V0dXBfY291bnQgPSBtYXgoZHJpdmVzWzBdLmRyaXZlX2RhdGEsIGRyaXZlc1sxXS5kcml2ZV9kYXRhKTsKKworCQlpZiAocGFpcikKKwkJCXNldHVwX2NvdW50ID0gbWF4X3QodTgsIHNldHVwX2NvdW50LCBwYWlyLT5kcml2ZV9kYXRhKTsKIAl9CiAKIAlpZiAoc2V0dXBfY291bnQgPiA1KQkJLyogc2hvdWxkbid0IGFjdHVhbGx5IGhhcHBlbi4uLiAqLwpAQCAtMTgwLDcgKzE4Miw3IEBACiAKIHN0YXRpYyB2b2lkIGNtZDY0eF9zZXRfZG1hX21vZGUoaWRlX2RyaXZlX3QgKmRyaXZlLCBjb25zdCB1OCBzcGVlZCkKIHsKLQlpZGVfaHdpZl90ICpod2lmCT0gSFdJRihkcml2ZSk7CisJaWRlX2h3aWZfdCAqaHdpZgk9IGRyaXZlLT5od2lmOwogCXN0cnVjdCBwY2lfZGV2ICpkZXYJPSB0b19wY2lfZGV2KGh3aWYtPmRldik7CiAJdTggdW5pdAkJCT0gZHJpdmUtPmRuICYgMHgwMTsKIAl1OCByZWdVID0gMCwgcGNpVQk9IGh3aWYtPmNoYW5uZWwgPyBVRElERVRDUjEgOiBVRElERVRDUjA7CkBAIC0yMjYsNyArMjI4LDcgQEAKIAogc3RhdGljIGludCBjbWQ2NDhfZG1hX2VuZChpZGVfZHJpdmVfdCAqZHJpdmUpCiB7Ci0JaWRlX2h3aWZfdCAqaHdpZgk9IEhXSUYoZHJpdmUpOworCWlkZV9od2lmX3QgKmh3aWYJPSBkcml2ZS0+aHdpZjsKIAl1bnNpZ25lZCBsb25nIGJhc2UJPSBod2lmLT5kbWFfYmFzZSAtIChod2lmLT5jaGFubmVsICogOCk7CiAJaW50IGVycgkJCT0gaWRlX2RtYV9lbmQoZHJpdmUpOwogCXU4ICBpcnFfbWFzawkJPSBod2lmLT5jaGFubmVsID8gTVJETU9ERV9JTlRSX0NIMSA6CkBAIC0yNDIsNyArMjQ0LDcgQEAKIAogc3RhdGljIGludCBjbWQ2NHhfZG1hX2VuZChpZGVfZHJpdmVfdCAqZHJpdmUpCiB7Ci0JaWRlX2h3aWZfdCAqaHdpZgk9IEhXSUYoZHJpdmUpOworCWlkZV9od2lmX3QgKmh3aWYJPSBkcml2ZS0+aHdpZjsKIAlzdHJ1Y3QgcGNpX2RldiAqZGV2CT0gdG9fcGNpX2Rldihod2lmLT5kZXYpOwogCWludCBpcnFfcmVnCQk9IGh3aWYtPmNoYW5uZWwgPyBBUlRUSU0yMyA6IENGUjsKIAl1OCAgaXJxX21hc2sJCT0gaHdpZi0+Y2hhbm5lbCA/IEFSVFRJTTIzX0lOVFJfQ0gxIDoKQEAgLTI1OSw3ICsyNjEsNyBAQAogCiBzdGF0aWMgaW50IGNtZDY0OF9kbWFfdGVzdF9pcnEoaWRlX2RyaXZlX3QgKmRyaXZlKQogewotCWlkZV9od2lmX3QgKmh3aWYJPSBIV0lGKGRyaXZlKTsKKwlpZGVfaHdpZl90ICpod2lmCT0gZHJpdmUtPmh3aWY7CiAJdW5zaWduZWQgbG9uZyBiYXNlCT0gaHdpZi0+ZG1hX2Jhc2UgLSAoaHdpZi0+Y2hhbm5lbCAqIDgpOwogCXU4IGlycV9tYXNrCQk9IGh3aWYtPmNoYW5uZWwgPyBNUkRNT0RFX0lOVFJfQ0gxIDoKIAkJCQkJCSAgTVJETU9ERV9JTlRSX0NIMDsKQEAgLTI4Miw3ICsyODQsNyBAQAogCiBzdGF0aWMgaW50IGNtZDY0eF9kbWFfdGVzdF9pcnEoaWRlX2RyaXZlX3QgKmRyaXZlKQogewotCWlkZV9od2lmX3QgKmh3aWYJPSBIV0lGKGRyaXZlKTsKKwlpZGVfaHdpZl90ICpod2lmCT0gZHJpdmUtPmh3aWY7CiAJc3RydWN0IHBjaV9kZXYgKmRldgk9IHRvX3BjaV9kZXYoaHdpZi0+ZGV2KTsKIAlpbnQgaXJxX3JlZwkJPSBod2lmLT5jaGFubmVsID8gQVJUVElNMjMgOiBDRlI7CiAJdTggIGlycV9tYXNrCQk9IGh3aWYtPmNoYW5uZWwgPyBBUlRUSU0yM19JTlRSX0NIMSA6CkBAIC0zMTMsNyArMzE1LDcgQEAKIAogc3RhdGljIGludCBjbWQ2NDZfMV9kbWFfZW5kKGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKLQlpZGVfaHdpZl90ICpod2lmID0gSFdJRihkcml2ZSk7CisJaWRlX2h3aWZfdCAqaHdpZiA9IGRyaXZlLT5od2lmOwogCXU4IGRtYV9zdGF0ID0gMCwgZG1hX2NtZCA9IDA7CiAKIAlkcml2ZS0+d2FpdGluZ19mb3JfZG1hID0gMDsKQEAgLTM4Myw2ICszODUsNyBAQAogCS5kbWFfdGVzdF9pcnEJCT0gY21kNjR4X2RtYV90ZXN0X2lycSwKIAkuZG1hX2xvc3RfaXJxCQk9IGlkZV9kbWFfbG9zdF9pcnEsCiAJLmRtYV90aW1lb3V0CQk9IGlkZV9kbWFfdGltZW91dCwKKwkuZG1hX3NmZl9yZWFkX3N0YXR1cwk9IGlkZV9kbWFfc2ZmX3JlYWRfc3RhdHVzLAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBpZGVfZG1hX29wcyBjbWQ2NDZfcmV2MV9kbWFfb3BzID0gewpAQCAtMzk0LDYgKzM5Nyw3IEBACiAJLmRtYV90ZXN0X2lycQkJPSBpZGVfZG1hX3Rlc3RfaXJxLAogCS5kbWFfbG9zdF9pcnEJCT0gaWRlX2RtYV9sb3N0X2lycSwKIAkuZG1hX3RpbWVvdXQJCT0gaWRlX2RtYV90aW1lb3V0LAorCS5kbWFfc2ZmX3JlYWRfc3RhdHVzCT0gaWRlX2RtYV9zZmZfcmVhZF9zdGF0dXMsCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGlkZV9kbWFfb3BzIGNtZDY0OF9kbWFfb3BzID0gewpAQCAtNDA1LDYgKzQwOSw3IEBACiAJLmRtYV90ZXN0X2lycQkJPSBjbWQ2NDhfZG1hX3Rlc3RfaXJxLAogCS5kbWFfbG9zdF9pcnEJCT0gaWRlX2RtYV9sb3N0X2lycSwKIAkuZG1hX3RpbWVvdXQJCT0gaWRlX2RtYV90aW1lb3V0LAorCS5kbWFfc2ZmX3JlYWRfc3RhdHVzCT0gaWRlX2RtYV9zZmZfcmVhZF9zdGF0dXMsCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGlkZV9wb3J0X2luZm8gY21kNjR4X2NoaXBzZXRzW10gX19kZXZpbml0ZGF0YSA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2NzNTUyMC5jIGIvZHJpdmVycy9pZGUvY3M1NTIwLmMKaW5kZXggNWVmYjQ2Ny4uZDAwM2JlYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvY3M1NTIwLmMKKysrIGIvZHJpdmVycy9pZGUvY3M1NTIwLmMKQEAgLTU5LDcgKzU5LDcgQEAKIAogc3RhdGljIHZvaWQgY3M1NTIwX3NldF9waW9fbW9kZShpZGVfZHJpdmVfdCAqZHJpdmUsIGNvbnN0IHU4IHBpbykKIHsKLQlpZGVfaHdpZl90ICpod2lmID0gSFdJRihkcml2ZSk7CisJaWRlX2h3aWZfdCAqaHdpZiA9IGRyaXZlLT5od2lmOwogCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2Rldihod2lmLT5kZXYpOwogCWludCBjb250cm9sbGVyID0gZHJpdmUtPmRuID4gMSA/IDEgOiAwOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9jeTgyYzY5My5jIGIvZHJpdmVycy9pZGUvY3k4MmM2OTMuYwppbmRleCBkMzdiYWY4Li43NGZjNTQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9jeTgyYzY5My5jCisrKyBiL2RyaXZlcnMvaWRlL2N5ODJjNjkzLmMKQEAgLTIwMyw3ICsyMDMsNyBAQAogCiBzdGF0aWMgdm9pZCBjeTgyYzY5M19zZXRfcGlvX21vZGUoaWRlX2RyaXZlX3QgKmRyaXZlLCBjb25zdCB1OCBwaW8pCiB7Ci0JaWRlX2h3aWZfdCAqaHdpZiA9IEhXSUYoZHJpdmUpOworCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKIAlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gdG9fcGNpX2Rldihod2lmLT5kZXYpOwogCXBpb19jbG9ja3NfdCBwY2xrOwogCXVuc2lnbmVkIGludCBhZGRyQ3RybDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2ZhbGNvbmlkZS5jIGIvZHJpdmVycy9pZGUvZmFsY29uaWRlLmMKaW5kZXggMzlkNTAwZC4uYTViYTgyMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvZmFsY29uaWRlLmMKKysrIGIvZHJpdmVycy9pZGUvZmFsY29uaWRlLmMKQEAgLTcwLDcgKzcwLDYgQEAKIAkuZXhlY19jb21tYW5kCQk9IGlkZV9leGVjX2NvbW1hbmQsCiAJLnJlYWRfc3RhdHVzCQk9IGlkZV9yZWFkX3N0YXR1cywKIAkucmVhZF9hbHRzdGF0dXMJCT0gaWRlX3JlYWRfYWx0c3RhdHVzLAotCS5yZWFkX3NmZl9kbWFfc3RhdHVzCT0gaWRlX3JlYWRfc2ZmX2RtYV9zdGF0dXMsCiAKIAkuc2V0X2lycQkJPSBpZGVfc2V0X2lycSwKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvaHB0MzY2LmMgYi9kcml2ZXJzL2lkZS9ocHQzNjYuYwppbmRleCBiMThlMTBkLi4zZWI5YjVjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9ocHQzNjYuYworKysgYi9kcml2ZXJzL2lkZS9ocHQzNjYuYwpAQCAtNjI2LDcgKzYyNiw3IEBACiAKIHN0YXRpYyB1OCBocHQzeHhfdWRtYV9maWx0ZXIoaWRlX2RyaXZlX3QgKmRyaXZlKQogewotCWlkZV9od2lmX3QgKmh3aWYJPSBIV0lGKGRyaXZlKTsKKwlpZGVfaHdpZl90ICpod2lmCT0gZHJpdmUtPmh3aWY7CiAJc3RydWN0IGhwdF9pbmZvICppbmZvCT0gaHB0M3h4X2dldF9pbmZvKGh3aWYtPmRldik7CiAJdTggbWFzayAJCT0gaHdpZi0+dWx0cmFfbWFzazsKIApAQCAtNjY1LDcgKzY2NSw3IEBACiAKIHN0YXRpYyB1OCBocHQzeHhfbWRtYV9maWx0ZXIoaWRlX2RyaXZlX3QgKmRyaXZlKQogewotCWlkZV9od2lmX3QgKmh3aWYJPSBIV0lGKGRyaXZlKTsKKwlpZGVfaHdpZl90ICpod2lmCT0gZHJpdmUtPmh3aWY7CiAJc3RydWN0IGhwdF9pbmZvICppbmZvCT0gaHB0M3h4X2dldF9pbmZvKGh3aWYtPmRldik7CiAKIAlzd2l0Y2ggKGluZm8tPmNoaXBfdHlwZSkgewpAQCAtNzQzLDcgKzc0Myw3IEBACiAKIHN0YXRpYyB2b2lkIGhwdDN4eF9tYXNrcHJvYyhpZGVfZHJpdmVfdCAqZHJpdmUsIGludCBtYXNrKQogewotCWlkZV9od2lmX3QgKmh3aWYJPSBIV0lGKGRyaXZlKTsKKwlpZGVfaHdpZl90ICpod2lmCT0gZHJpdmUtPmh3aWY7CiAJc3RydWN0IHBjaV9kZXYJKmRldgk9IHRvX3BjaV9kZXYoaHdpZi0+ZGV2KTsKIAlzdHJ1Y3QgaHB0X2luZm8gKmluZm8JPSBocHQzeHhfZ2V0X2luZm8oaHdpZi0+ZGV2KTsKIApAQCAtNzg4LDcgKzc4OCw3IEBACiAKIHN0YXRpYyB2b2lkIGhwdDM3MF9jbGVhcl9lbmdpbmUoaWRlX2RyaXZlX3QgKmRyaXZlKQogewotCWlkZV9od2lmX3QgKmh3aWYgPSBIV0lGKGRyaXZlKTsKKwlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7CiAJc3RydWN0IHBjaV9kZXYgKmRldiA9IHRvX3BjaV9kZXYoaHdpZi0+ZGV2KTsKIAogCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIGh3aWYtPnNlbGVjdF9kYXRhLCAweDM3KTsKQEAgLTc5Nyw3ICs3OTcsNyBAQAogCiBzdGF0aWMgdm9pZCBocHQzNzBfaXJxX3RpbWVvdXQoaWRlX2RyaXZlX3QgKmRyaXZlKQogewotCWlkZV9od2lmX3QgKmh3aWYJPSBIV0lGKGRyaXZlKTsKKwlpZGVfaHdpZl90ICpod2lmCT0gZHJpdmUtPmh3aWY7CiAJc3RydWN0IHBjaV9kZXYgKmRldgk9IHRvX3BjaV9kZXYoaHdpZi0+ZGV2KTsKIAl1MTYgYmZpZm8JCT0gMDsKIAl1OCAgZG1hX2NtZDsKQEAgLTgyMiw3ICs4MjIsNyBAQAogCiBzdGF0aWMgaW50IGhwdDM3MF9kbWFfZW5kKGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKLQlpZGVfaHdpZl90ICpod2lmCT0gSFdJRihkcml2ZSk7CisJaWRlX2h3aWZfdCAqaHdpZgk9IGRyaXZlLT5od2lmOwogCXU4ICBkbWFfc3RhdAkJPSBpbmIoaHdpZi0+ZG1hX2Jhc2UgKyBBVEFfRE1BX1NUQVRVUyk7CiAKIAlpZiAoZG1hX3N0YXQgJiAweDAxKSB7CkBAIC04NDQsNyArODQ0LDcgQEAKIC8qIHJldHVybnMgMSBpZiBETUEgSVJRIGlzc3VlZCwgMCBvdGhlcndpc2UgKi8KIHN0YXRpYyBpbnQgaHB0Mzc0X2RtYV90ZXN0X2lycShpZGVfZHJpdmVfdCAqZHJpdmUpCiB7Ci0JaWRlX2h3aWZfdCAqaHdpZgk9IEhXSUYoZHJpdmUpOworCWlkZV9od2lmX3QgKmh3aWYJPSBkcml2ZS0+aHdpZjsKIAlzdHJ1Y3QgcGNpX2RldiAqZGV2CT0gdG9fcGNpX2Rldihod2lmLT5kZXYpOwogCXUxNiBiZmlmbwkJPSAwOwogCXU4ICBkbWFfc3RhdDsKQEAgLTg2NSw3ICs4NjUsNyBAQAogCiBzdGF0aWMgaW50IGhwdDM3NF9kbWFfZW5kKGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKLQlpZGVfaHdpZl90ICpod2lmCT0gSFdJRihkcml2ZSk7CisJaWRlX2h3aWZfdCAqaHdpZgk9IGRyaXZlLT5od2lmOwogCXN0cnVjdCBwY2lfZGV2ICpkZXYJPSB0b19wY2lfZGV2KGh3aWYtPmRldik7CiAJdTggbWNyCT0gMCwgbWNyX2FkZHIJPSBod2lmLT5zZWxlY3RfZGF0YTsKIAl1OCBid3NyID0gMCwgbWFzawk9IGh3aWYtPmNoYW5uZWwgPyAweDAyIDogMHgwMTsKQEAgLTkyNyw3ICs5MjcsNyBAQAogCiBzdGF0aWMgdm9pZCBocHQzeHhuX3J3X2Rpc2soaWRlX2RyaXZlX3QgKmRyaXZlLCBzdHJ1Y3QgcmVxdWVzdCAqcnEpCiB7Ci0JaHB0M3h4bl9zZXRfY2xvY2soSFdJRihkcml2ZSksIHJxX2RhdGFfZGlyKHJxKSA/IDB4MjMgOiAweDIxKTsKKwlocHQzeHhuX3NldF9jbG9jayhkcml2ZS0+aHdpZiwgcnFfZGF0YV9kaXIocnEpID8gMHgyMyA6IDB4MjEpOwogfQogCiAvKioKQEAgLTEzNDksOCArMTM0OSw2IEBACiAJaWYgKGlkZV9hbGxvY2F0ZV9kbWFfZW5naW5lKGh3aWYpKQogCQlyZXR1cm4gLTE7CiAKLQlod2lmLT5kbWFfb3BzID0gJnNmZl9kbWFfb3BzOwotCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE0MjYsNiArMTQyNCw3IEBACiAJLmRtYV90ZXN0X2lycQkJPSBocHQzNzRfZG1hX3Rlc3RfaXJxLAogCS5kbWFfbG9zdF9pcnEJCT0gaWRlX2RtYV9sb3N0X2lycSwKIAkuZG1hX3RpbWVvdXQJCT0gaWRlX2RtYV90aW1lb3V0LAorCS5kbWFfc2ZmX3JlYWRfc3RhdHVzCT0gaWRlX2RtYV9zZmZfcmVhZF9zdGF0dXMsCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGlkZV9kbWFfb3BzIGhwdDM3MF9kbWFfb3BzID0gewpAQCAtMTQzNyw2ICsxNDM2LDcgQEAKIAkuZG1hX3Rlc3RfaXJxCQk9IGlkZV9kbWFfdGVzdF9pcnEsCiAJLmRtYV9sb3N0X2lycQkJPSBpZGVfZG1hX2xvc3RfaXJxLAogCS5kbWFfdGltZW91dAkJPSBocHQzNzBfZG1hX3RpbWVvdXQsCisJLmRtYV9zZmZfcmVhZF9zdGF0dXMJPSBpZGVfZG1hX3NmZl9yZWFkX3N0YXR1cywKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaWRlX2RtYV9vcHMgaHB0MzZ4X2RtYV9vcHMgPSB7CkBAIC0xNDQ4LDYgKzE0NDgsNyBAQAogCS5kbWFfdGVzdF9pcnEJCT0gaWRlX2RtYV90ZXN0X2lycSwKIAkuZG1hX2xvc3RfaXJxCQk9IGhwdDM2Nl9kbWFfbG9zdF9pcnEsCiAJLmRtYV90aW1lb3V0CQk9IGlkZV9kbWFfdGltZW91dCwKKwkuZG1hX3NmZl9yZWFkX3N0YXR1cwk9IGlkZV9kbWFfc2ZmX3JlYWRfc3RhdHVzLAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBpZGVfcG9ydF9pbmZvIGhwdDM2Nl9jaGlwc2V0c1tdIF9fZGV2aW5pdGRhdGEgPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9pY3NpZGUuYyBiL2RyaXZlcnMvaWRlL2ljc2lkZS5jCmluZGV4IDgxZjcwY2EuLjk3YTM1YzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2ljc2lkZS5jCisrKyBiL2RyaXZlcnMvaWRlL2ljc2lkZS5jCkBAIC0xNjYsNyArMTY2LDcgQEAKICAqLwogc3RhdGljIHZvaWQgaWNzaWRlX21hc2twcm9jKGlkZV9kcml2ZV90ICpkcml2ZSwgaW50IG1hc2spCiB7Ci0JaWRlX2h3aWZfdCAqaHdpZiA9IEhXSUYoZHJpdmUpOworCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKIAlzdHJ1Y3QgZXhwYW5zaW9uX2NhcmQgKmVjID0gRUNBUkRfREVWKGh3aWYtPmRldik7CiAJc3RydWN0IGljc2lkZV9zdGF0ZSAqc3RhdGUgPSBlY2FyZF9nZXRfZHJ2ZGF0YShlYyk7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKQEAgLTI4NCw3ICsyODQsNyBAQAogCiBzdGF0aWMgaW50IGljc2lkZV9kbWFfZW5kKGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKLQlpZGVfaHdpZl90ICpod2lmID0gSFdJRihkcml2ZSk7CisJaWRlX2h3aWZfdCAqaHdpZiA9IGRyaXZlLT5od2lmOwogCXN0cnVjdCBleHBhbnNpb25fY2FyZCAqZWMgPSBFQ0FSRF9ERVYoaHdpZi0+ZGV2KTsKIAogCWRyaXZlLT53YWl0aW5nX2Zvcl9kbWEgPSAwOwpAQCAtMjk5LDcgKzI5OSw3IEBACiAKIHN0YXRpYyB2b2lkIGljc2lkZV9kbWFfc3RhcnQoaWRlX2RyaXZlX3QgKmRyaXZlKQogewotCWlkZV9od2lmX3QgKmh3aWYgPSBIV0lGKGRyaXZlKTsKKwlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7CiAJc3RydWN0IGV4cGFuc2lvbl9jYXJkICplYyA9IEVDQVJEX0RFVihod2lmLT5kZXYpOwogCiAJLyogV2UgY2FuIG5vdCBlbmFibGUgRE1BIG9uIGJvdGggY2hhbm5lbHMgc2ltdWx0YW5lb3VzbHkuICovCkBAIC0zMDksMTAgKzMwOSwxMCBAQAogCiBzdGF0aWMgaW50IGljc2lkZV9kbWFfc2V0dXAoaWRlX2RyaXZlX3QgKmRyaXZlKQogewotCWlkZV9od2lmX3QgKmh3aWYgPSBIV0lGKGRyaXZlKTsKKwlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7CiAJc3RydWN0IGV4cGFuc2lvbl9jYXJkICplYyA9IEVDQVJEX0RFVihod2lmLT5kZXYpOwogCXN0cnVjdCBpY3NpZGVfc3RhdGUgKnN0YXRlID0gZWNhcmRfZ2V0X2RydmRhdGEoZWMpOwotCXN0cnVjdCByZXF1ZXN0ICpycSA9IGh3aWYtPmh3Z3JvdXAtPnJxOworCXN0cnVjdCByZXF1ZXN0ICpycSA9IGh3aWYtPnJxOwogCXVuc2lnbmVkIGludCBkbWFfbW9kZTsKIAogCWlmIChycV9kYXRhX2RpcihycSkpCkBAIC0zNjIsNyArMzYyLDcgQEAKIAogc3RhdGljIGludCBpY3NpZGVfZG1hX3Rlc3RfaXJxKGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKLQlpZGVfaHdpZl90ICpod2lmID0gSFdJRihkcml2ZSk7CisJaWRlX2h3aWZfdCAqaHdpZiA9IGRyaXZlLT5od2lmOwogCXN0cnVjdCBleHBhbnNpb25fY2FyZCAqZWMgPSBFQ0FSRF9ERVYoaHdpZi0+ZGV2KTsKIAlzdHJ1Y3QgaWNzaWRlX3N0YXRlICpzdGF0ZSA9IGVjYXJkX2dldF9kcnZkYXRhKGVjKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvaWRlLWFjcGkuYyBiL2RyaXZlcnMvaWRlL2lkZS1hY3BpLmMKaW5kZXggZmQ0YTM2NC4uMmY5ZTk0MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvaWRlLWFjcGkuYworKysgYi9kcml2ZXJzL2lkZS9pZGUtYWNwaS5jCkBAIC0yMTgsNyArMjE4LDcgQEAKICAqLwogc3RhdGljIGFjcGlfaGFuZGxlIGlkZV9hY3BpX2RyaXZlX2dldF9oYW5kbGUoaWRlX2RyaXZlX3QgKmRyaXZlKQogewotCWlkZV9od2lmX3QJKmh3aWYgPSBIV0lGKGRyaXZlKTsKKwlpZGVfaHdpZl90CSpod2lmID0gZHJpdmUtPmh3aWY7CiAJaW50CQkgcG9ydDsKIAlhY3BpX2hhbmRsZQkgZHJpdmVfaGFuZGxlOwogCkBAIC0yNjMsNyArMjYzLDcgQEAKIAlhY3BpX3N0YXR1cwkJCXN0YXR1czsKIAlzdHJ1Y3QgYWNwaV9idWZmZXIJCW91dHB1dDsKIAl1bmlvbiBhY3BpX29iamVjdCAJCSpvdXRfb2JqOwotCWlkZV9od2lmX3QJCQkqaHdpZiA9IEhXSUYoZHJpdmUpOworCWlkZV9od2lmX3QJCQkqaHdpZiA9IGRyaXZlLT5od2lmOwogCXN0cnVjdCBkZXZpY2UJCQkqZGV2ID0gaHdpZi0+Z2VuZGV2LnBhcmVudDsKIAlpbnQJCQkJZXJyID0gLUVOT0RFVjsKIAlpbnQJCQkJcG9ydDsKQEAgLTY0MSw3ICs2NDEsOCBAQAogICovCiB2b2lkIGlkZV9hY3BpX3NldF9zdGF0ZShpZGVfaHdpZl90ICpod2lmLCBpbnQgb24pCiB7Ci0JaW50IHVuaXQ7CisJaWRlX2RyaXZlX3QgKmRyaXZlOworCWludCBpOwogCiAJaWYgKGlkZV9ub2FjcGkgfHwgaWRlX25vYWNwaV9wc3gpCiAJCXJldHVybjsKQEAgLTY1NSw5ICs2NTYsOCBAQAogCS8qIGNoYW5uZWwgZmlyc3QgYW5kIHRoZW4gZHJpdmVzIGZvciBwb3dlciBvbiBhbmQgdmVyc2UgdmVyc2EgZm9yIHBvd2VyIG9mZiAqLwogCWlmIChvbikKIAkJYWNwaV9idXNfc2V0X3Bvd2VyKGh3aWYtPmFjcGlkYXRhLT5vYmpfaGFuZGxlLCBBQ1BJX1NUQVRFX0QwKTsKLQlmb3IgKHVuaXQgPSAwOyB1bml0IDwgTUFYX0RSSVZFUzsgKyt1bml0KSB7Ci0JCWlkZV9kcml2ZV90ICpkcml2ZSA9ICZod2lmLT5kcml2ZXNbdW5pdF07CiAKKwlpZGVfcG9ydF9mb3JfZWFjaF9kZXYoaSwgZHJpdmUsIGh3aWYpIHsKIAkJaWYgKCFkcml2ZS0+YWNwaWRhdGEtPm9ial9oYW5kbGUpCiAJCQlkcml2ZS0+YWNwaWRhdGEtPm9ial9oYW5kbGUgPSBpZGVfYWNwaV9kcml2ZV9nZXRfaGFuZGxlKGRyaXZlKTsKIApAQCAtNzExLDE1ICs3MTEsMTMgQEAKIAkgKiBmb3IgYm90aCBkcml2ZXMsIHJlZ2FyZGxlc3Mgd2hldGhlciB0aGV5IGFyZSBjb25uZWN0ZWQKIAkgKiBvciBub3QuCiAJICovCi0JaHdpZi0+ZHJpdmVzWzBdLmFjcGlkYXRhID0gJmh3aWYtPmFjcGlkYXRhLT5tYXN0ZXI7Ci0JaHdpZi0+ZHJpdmVzWzFdLmFjcGlkYXRhID0gJmh3aWYtPmFjcGlkYXRhLT5zbGF2ZTsKKwlod2lmLT5kZXZpY2VzWzBdLT5hY3BpZGF0YSA9ICZod2lmLT5hY3BpZGF0YS0+bWFzdGVyOworCWh3aWYtPmRldmljZXNbMV0tPmFjcGlkYXRhID0gJmh3aWYtPmFjcGlkYXRhLT5zbGF2ZTsKIAogCS8qCiAJICogU2VuZCBJREVOVElGWSBmb3IgZWFjaCBkcml2ZQogCSAqLwotCWZvciAoaSA9IDA7IGkgPCBNQVhfRFJJVkVTOyBpKyspIHsKLQkJZHJpdmUgPSAmaHdpZi0+ZHJpdmVzW2ldOwotCisJaWRlX3BvcnRfZm9yX2VhY2hfZGV2KGksIGRyaXZlLCBod2lmKSB7CiAJCW1lbXNldChkcml2ZS0+YWNwaWRhdGEsIDAsIHNpemVvZigqZHJpdmUtPmFjcGlkYXRhKSk7CiAKIAkJaWYgKChkcml2ZS0+ZGV2X2ZsYWdzICYgSURFX0RGTEFHX1BSRVNFTlQpID09IDApCkBAIC03NDQsOSArNzQyLDcgQEAKIAlpZGVfYWNwaV9nZXRfdGltaW5nKGh3aWYpOwogCWlkZV9hY3BpX3B1c2hfdGltaW5nKGh3aWYpOwogCi0JZm9yIChpID0gMDsgaSA8IE1BWF9EUklWRVM7IGkrKykgewotCQlkcml2ZSA9ICZod2lmLT5kcml2ZXNbaV07Ci0KKwlpZGVfcG9ydF9mb3JfZWFjaF9kZXYoaSwgZHJpdmUsIGh3aWYpIHsKIAkJaWYgKGRyaXZlLT5kZXZfZmxhZ3MgJiBJREVfREZMQUdfUFJFU0VOVCkKIAkJCS8qIEV4ZWN1dGUgQUNQSSBzdGFydHVwIGNvZGUgKi8KIAkJCWlkZV9hY3BpX2V4ZWNfdGZzKGRyaXZlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2lkZS1hdGFwaS5jIGIvZHJpdmVycy9pZGUvaWRlLWF0YXBpLmMKaW5kZXggZTg2ODhjMC4uZTk2YzAxMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvaWRlLWF0YXBpLmMKKysrIGIvZHJpdmVycy9pZGUvaWRlLWF0YXBpLmMKQEAgLTI0Myw3ICsyNDMsNyBAQAogCiBpbnQgaWRlX2NkX2V4cGlyeShpZGVfZHJpdmVfdCAqZHJpdmUpCiB7Ci0Jc3RydWN0IHJlcXVlc3QgKnJxID0gSFdHUk9VUChkcml2ZSktPnJxOworCXN0cnVjdCByZXF1ZXN0ICpycSA9IGRyaXZlLT5od2lmLT5ycTsKIAl1bnNpZ25lZCBsb25nIHdhaXQgPSAwOwogCiAJZGVidWdfbG9nKCIlczogcnEtPmNtZFswXTogMHgleFxuIiwgX19mdW5jX18sIHJxLT5jbWRbMF0pOwpAQCAtMjk0LDcgKzI5NCw3IEBACiB7CiAJc3RydWN0IGlkZV9hdGFwaV9wYyAqcGMgPSBkcml2ZS0+cGM7CiAJaWRlX2h3aWZfdCAqaHdpZiA9IGRyaXZlLT5od2lmOwotCXN0cnVjdCByZXF1ZXN0ICpycSA9IGh3aWYtPmh3Z3JvdXAtPnJxOworCXN0cnVjdCByZXF1ZXN0ICpycSA9IGh3aWYtPnJxOwogCWNvbnN0IHN0cnVjdCBpZGVfdHBfb3BzICp0cF9vcHMgPSBod2lmLT50cF9vcHM7CiAJeGZlcl9mdW5jX3QgKnhmZXJmdW5jOwogCXVuc2lnbmVkIGludCB0aW1lb3V0LCB0ZW1wOwpAQCAtNDkxLDcgKzQ5MSw3IEBACiB7CiAJc3RydWN0IGlkZV9hdGFwaV9wYyAqdW5pbml0aWFsaXplZF92YXIocGMpOwogCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKLQlzdHJ1Y3QgcmVxdWVzdCAqcnEgPSBod2lmLT5od2dyb3VwLT5ycTsKKwlzdHJ1Y3QgcmVxdWVzdCAqcnEgPSBod2lmLT5ycTsKIAlpZGVfZXhwaXJ5X3QgKmV4cGlyeTsKIAl1bnNpZ25lZCBpbnQgdGltZW91dDsKIAlpbnQgY21kX2xlbjsKQEAgLTU0OSw3ICs1NDksMTAgQEAKIAl9CiAKIAkvKiBTZXQgdGhlIGludGVycnVwdCByb3V0aW5lICovCi0JaWRlX3NldF9oYW5kbGVyKGRyaXZlLCBpZGVfcGNfaW50ciwgdGltZW91dCwgZXhwaXJ5KTsKKwlpZGVfc2V0X2hhbmRsZXIoZHJpdmUsCisJCQkoZGV2X2lzX2lkZWNkKGRyaXZlKSA/IGRyaXZlLT5pcnFfaGFuZGxlcgorCQkJCQkgICAgIDogaWRlX3BjX2ludHIpLAorCQkJdGltZW91dCwgZXhwaXJ5KTsKIAogCS8qIEJlZ2luIERNQSwgaWYgbmVjZXNzYXJ5ICovCiAJaWYgKGRldl9pc19pZGVjZChkcml2ZSkpIHsKQEAgLTU4MCw3ICs1ODMsNyBAQAogCiAJaWYgKGRldl9pc19pZGVjZChkcml2ZSkpIHsKIAkJdGZfZmxhZ3MgPSBJREVfVEZMQUdfT1VUX05TRUNUIHwgSURFX1RGTEFHX09VVF9MQkFMOwotCQliY291bnQgPSBpZGVfY2RfZ2V0X3hmZXJsZW4oaHdpZi0+aHdncm91cC0+cnEpOworCQliY291bnQgPSBpZGVfY2RfZ2V0X3hmZXJsZW4oaHdpZi0+cnEpOwogCQlleHBpcnkgPSBpZGVfY2RfZXhwaXJ5OwogCQl0aW1lb3V0ID0gQVRBUElfV0FJVF9QQzsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvaWRlLWNkLmMgYi9kcml2ZXJzL2lkZS9pZGUtY2QuYwppbmRleCAxYTc0MTBmLi5jYWU2OTM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9pZGUtY2QuYworKysgYi9kcml2ZXJzL2lkZS9pZGUtY2QuYwpAQCAtMjM5LDcgKzIzOSw3IEBACiAKIHN0YXRpYyB2b2lkIGNkcm9tX2VuZF9yZXF1ZXN0KGlkZV9kcml2ZV90ICpkcml2ZSwgaW50IHVwdG9kYXRlKQogewotCXN0cnVjdCByZXF1ZXN0ICpycSA9IEhXR1JPVVAoZHJpdmUpLT5ycTsKKwlzdHJ1Y3QgcmVxdWVzdCAqcnEgPSBkcml2ZS0+aHdpZi0+cnE7CiAJaW50IG5zZWN0b3JzID0gcnEtPmhhcmRfY3VyX3NlY3RvcnM7CiAKIAlpZGVfZGVidWdfbG9nKElERV9EQkdfRlVOQywgIkNhbGwgJXMsIGNtZDogMHgleCwgdXB0b2RhdGU6IDB4JXgsICIKQEAgLTMwNiw4ICszMDYsNyBAQAogc3RhdGljIGludCBjZHJvbV9kZWNvZGVfc3RhdHVzKGlkZV9kcml2ZV90ICpkcml2ZSwgaW50IGdvb2Rfc3RhdCwgaW50ICpzdGF0X3JldCkKIHsKIAlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7Ci0JaWRlX2h3Z3JvdXBfdCAqaHdncm91cCA9IGh3aWYtPmh3Z3JvdXA7Ci0Jc3RydWN0IHJlcXVlc3QgKnJxID0gaHdncm91cC0+cnE7CisJc3RydWN0IHJlcXVlc3QgKnJxID0gaHdpZi0+cnE7CiAJaW50IHN0YXQsIGVyciwgc2Vuc2Vfa2V5OwogCiAJLyogY2hlY2sgZm9yIGVycm9ycyAqLwpAQCAtNTAyLDcgKzUwMSw3IEBACiAJCWJsa2Rldl9kZXF1ZXVlX3JlcXVlc3QocnEpOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKHEtPnF1ZXVlX2xvY2ssIGZsYWdzKTsKIAotCQlod2dyb3VwLT5ycSA9IE5VTEw7CisJCWh3aWYtPnJxID0gTlVMTDsKIAogCQljZHJvbV9xdWV1ZV9yZXF1ZXN0X3NlbnNlKGRyaXZlLCBycS0+c2Vuc2UsIHJxKTsKIAl9IGVsc2UKQEAgLTUxMSwxMDYgKzUxMCw2IEBACiAJcmV0dXJuIDE7CiB9CiAKLXN0YXRpYyBpZGVfc3RhcnRzdG9wX3QgY2Ryb21fdHJhbnNmZXJfcGFja2V0X2NvbW1hbmQoaWRlX2RyaXZlX3QgKik7Ci1zdGF0aWMgaWRlX3N0YXJ0c3RvcF90IGNkcm9tX25ld3BjX2ludHIoaWRlX2RyaXZlX3QgKik7Ci0KLS8qCi0gKiBTZXQgdXAgdGhlIGRldmljZSByZWdpc3RlcnMgZm9yIHRyYW5zZmVycmluZyBhIHBhY2tldCBjb21tYW5kIG9uIERFViwKLSAqIGV4cGVjdGluZyB0byBsYXRlciB0cmFuc2ZlciBYRkVSTEVOIGJ5dGVzLiAgSEFORExFUiBpcyB0aGUgcm91dGluZQotICogd2hpY2ggYWN0dWFsbHkgdHJhbnNmZXJzIHRoZSBjb21tYW5kIHRvIHRoZSBkcml2ZS4gIElmIHRoaXMgaXMgYQotICogZHJxX2ludGVycnVwdCBkZXZpY2UsIHRoaXMgcm91dGluZSB3aWxsIGFycmFuZ2UgZm9yIEhBTkRMRVIgdG8gYmUKLSAqIGNhbGxlZCB3aGVuIHRoZSBpbnRlcnJ1cHQgZnJvbSB0aGUgZHJpdmUgYXJyaXZlcy4gIE90aGVyd2lzZSwgSEFORExFUgotICogd2lsbCBiZSBjYWxsZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIGRyaXZlIGlzIHByZXBhcmVkIGZvciB0aGUgdHJhbnNmZXIuCi0gKi8KLXN0YXRpYyBpZGVfc3RhcnRzdG9wX3QgY2Ryb21fc3RhcnRfcGFja2V0X2NvbW1hbmQoaWRlX2RyaXZlX3QgKmRyaXZlKQotewotCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKLQlzdHJ1Y3QgcmVxdWVzdCAqcnEgPSBod2lmLT5od2dyb3VwLT5ycTsKLQlpbnQgeGZlcmxlbjsKLQotCXhmZXJsZW4gPSBpZGVfY2RfZ2V0X3hmZXJsZW4ocnEpOwotCi0JaWRlX2RlYnVnX2xvZyhJREVfREJHX1BDLCAiQ2FsbCAlcywgeGZlcmxlbjogJWRcbiIsIF9fZnVuY19fLCB4ZmVybGVuKTsKLQotCS8qIEZJWE1FOiBmb3IgVmlydHVhbCBETUEgd2UgbXVzdCBjaGVjayBoYXJkZXIgKi8KLQlpZiAoZHJpdmUtPmRtYSkKLQkJZHJpdmUtPmRtYSA9ICFod2lmLT5kbWFfb3BzLT5kbWFfc2V0dXAoZHJpdmUpOwotCi0JLyogc2V0IHVwIHRoZSBjb250cm9sbGVyIHJlZ2lzdGVycyAqLwotCWlkZV9wa3RjbWRfdGZfbG9hZChkcml2ZSwgSURFX1RGTEFHX09VVF9OU0VDVCB8IElERV9URkxBR19PVVRfTEJBTCwKLQkJCSAgIHhmZXJsZW4sIGRyaXZlLT5kbWEpOwotCi0JaWYgKGRyaXZlLT5hdGFwaV9mbGFncyAmIElERV9BRkxBR19EUlFfSU5URVJSVVBUKSB7Ci0JCS8qIHdhaXRpbmcgZm9yIENEQiBpbnRlcnJ1cHQsIG5vdCBETUEgeWV0LiAqLwotCQlpZiAoZHJpdmUtPmRtYSkKLQkJCWRyaXZlLT53YWl0aW5nX2Zvcl9kbWEgPSAwOwotCi0JCS8qIHBhY2tldCBjb21tYW5kICovCi0JCWlkZV9leGVjdXRlX2NvbW1hbmQoZHJpdmUsIEFUQV9DTURfUEFDS0VULAotCQkJCSAgICBjZHJvbV90cmFuc2Zlcl9wYWNrZXRfY29tbWFuZCwKLQkJCQkgICAgQVRBUElfV0FJVF9QQywgaWRlX2NkX2V4cGlyeSk7Ci0JCXJldHVybiBpZGVfc3RhcnRlZDsKLQl9IGVsc2UgewotCQlpZGVfZXhlY3V0ZV9wa3RfY21kKGRyaXZlKTsKLQotCQlyZXR1cm4gY2Ryb21fdHJhbnNmZXJfcGFja2V0X2NvbW1hbmQoZHJpdmUpOwotCX0KLX0KLQotLyoKLSAqIFNlbmQgYSBwYWNrZXQgY29tbWFuZCB0byBEUklWRSBkZXNjcmliZWQgYnkgQ01EX0JVRiBhbmQgQ01EX0xFTi4gVGhlIGRldmljZQotICogcmVnaXN0ZXJzIG11c3QgaGF2ZSBhbHJlYWR5IGJlZW4gcHJlcGFyZWQgYnkgY2Ryb21fc3RhcnRfcGFja2V0X2NvbW1hbmQuCi0gKiBIQU5ETEVSIGlzIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciB0byBjYWxsIHdoZW4gdGhlIGNvbW1hbmQgY29tcGxldGVzIG9yCi0gKiB0aGVyZSdzIGRhdGEgcmVhZHkuCi0gKi8KLSNkZWZpbmUgQVRBUElfTUlOX0NEQl9CWVRFUyAxMgotc3RhdGljIGlkZV9zdGFydHN0b3BfdCBjZHJvbV90cmFuc2Zlcl9wYWNrZXRfY29tbWFuZChpZGVfZHJpdmVfdCAqZHJpdmUpCi17Ci0JaWRlX2h3aWZfdCAqaHdpZiA9IGRyaXZlLT5od2lmOwotCXN0cnVjdCByZXF1ZXN0ICpycSA9IGh3aWYtPmh3Z3JvdXAtPnJxOwotCWludCBjbWRfbGVuOwotCWlkZV9zdGFydHN0b3BfdCBzdGFydHN0b3A7Ci0KLQlpZGVfZGVidWdfbG9nKElERV9EQkdfUEMsICJDYWxsICVzXG4iLCBfX2Z1bmNfXyk7Ci0KLQlpZiAoZHJpdmUtPmF0YXBpX2ZsYWdzICYgSURFX0FGTEFHX0RSUV9JTlRFUlJVUFQpIHsKLQkJLyoKLQkJICogSGVyZSB3ZSBzaG91bGQgaGF2ZSBiZWVuIGNhbGxlZCBhZnRlciByZWNlaXZpbmcgYW4gaW50ZXJydXB0Ci0JCSAqIGZyb20gdGhlIGRldmljZS4gIERSUSBzaG91bGQgaG93IGJlIHNldC4KLQkJICovCi0KLQkJLyogY2hlY2sgZm9yIGVycm9ycyAqLwotCQlpZiAoY2Ryb21fZGVjb2RlX3N0YXR1cyhkcml2ZSwgQVRBX0RSUSwgTlVMTCkpCi0JCQlyZXR1cm4gaWRlX3N0b3BwZWQ7Ci0KLQkJLyogb2ssIG5leHQgaW50ZXJydXB0IHdpbGwgYmUgRE1BIGludGVycnVwdCAqLwotCQlpZiAoZHJpdmUtPmRtYSkKLQkJCWRyaXZlLT53YWl0aW5nX2Zvcl9kbWEgPSAxOwotCX0gZWxzZSB7Ci0JCS8qIG90aGVyd2lzZSwgd2UgbXVzdCB3YWl0IGZvciBEUlEgdG8gZ2V0IHNldCAqLwotCQlpZiAoaWRlX3dhaXRfc3RhdCgmc3RhcnRzdG9wLCBkcml2ZSwgQVRBX0RSUSwKLQkJCQkgIEFUQV9CVVNZLCBXQUlUX1JFQURZKSkKLQkJCXJldHVybiBzdGFydHN0b3A7Ci0JfQotCi0JLyogYXJtIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciAqLwotCWlkZV9zZXRfaGFuZGxlcihkcml2ZSwgY2Ryb21fbmV3cGNfaW50ciwgcnEtPnRpbWVvdXQsIGlkZV9jZF9leHBpcnkpOwotCi0JLyogQVRBUEkgY29tbWFuZHMgZ2V0IHBhZGRlZCBvdXQgdG8gMTIgYnl0ZXMgbWluaW11bSAqLwotCWNtZF9sZW4gPSBDT01NQU5EX1NJWkUocnEtPmNtZFswXSk7Ci0JaWYgKGNtZF9sZW4gPCBBVEFQSV9NSU5fQ0RCX0JZVEVTKQotCQljbWRfbGVuID0gQVRBUElfTUlOX0NEQl9CWVRFUzsKLQotCS8qIHNlbmQgdGhlIGNvbW1hbmQgdG8gdGhlIGRldmljZSAqLwotCWh3aWYtPnRwX29wcy0+b3V0cHV0X2RhdGEoZHJpdmUsIE5VTEwsIHJxLT5jbWQsIGNtZF9sZW4pOwotCi0JLyogc3RhcnQgdGhlIERNQSBpZiBuZWVkIGJlICovCi0JaWYgKGRyaXZlLT5kbWEpCi0JCWh3aWYtPmRtYV9vcHMtPmRtYV9zdGFydChkcml2ZSk7Ci0KLQlyZXR1cm4gaWRlX3N0YXJ0ZWQ7Ci19Ci0KIC8qCiAgKiBDaGVjayB0aGUgY29udGVudHMgb2YgdGhlIGludGVycnVwdCByZWFzb24gcmVnaXN0ZXIgZnJvbSB0aGUgY2Ryb20KICAqIGFuZCBhdHRlbXB0IHRvIHJlY292ZXIgaWYgdGhlcmUgYXJlIHByb2JsZW1zLiAgUmV0dXJucyAgMCBpZiBldmVyeXRoaW5nJ3MKQEAgLTg1NCw4ICs3NTMsNyBAQAogc3RhdGljIGlkZV9zdGFydHN0b3BfdCBjZHJvbV9uZXdwY19pbnRyKGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKIAlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7Ci0JaWRlX2h3Z3JvdXBfdCAqaHdncm91cCA9IGh3aWYtPmh3Z3JvdXA7Ci0Jc3RydWN0IHJlcXVlc3QgKnJxID0gaHdncm91cC0+cnE7CisJc3RydWN0IHJlcXVlc3QgKnJxID0gaHdpZi0+cnE7CiAJeGZlcl9mdW5jX3QgKnhmZXJmdW5jOwogCWlkZV9leHBpcnlfdCAqZXhwaXJ5ID0gTlVMTDsKIAlpbnQgZG1hX2Vycm9yID0gMCwgZG1hLCBzdGF0LCB0aGlzbGVuLCB1cHRvZGF0ZSA9IDA7CkBAIC0xMDYxLDcgKzk1OSw3IEBACiAJCWlmIChibGtfZW5kX3JlcXVlc3QocnEsIDAsIGRsZW4pKQogCQkJQlVHKCk7CiAKLQkJaHdncm91cC0+cnEgPSBOVUxMOworCQlod2lmLT5ycSA9IE5VTEw7CiAJfSBlbHNlIHsKIAkJaWYgKCF1cHRvZGF0ZSkKIAkJCXJxLT5jbWRfZmxhZ3MgfD0gUkVRX0ZBSUxFRDsKQEAgLTExODMsNyArMTA4MSw3IEBACiAJCXJldHVybiBpZGVfc3RvcHBlZDsKIAl9CiAKLQlyZXR1cm4gY2Ryb21fc3RhcnRfcGFja2V0X2NvbW1hbmQoZHJpdmUpOworCXJldHVybiBpZGVfaXNzdWVfcGMoZHJpdmUpOwogfQogCiAvKgpAQCAtMTkxNiw3ICsxODE0LDcgQEAKIAogc3RhdGljIGludCBpZGVfY2RfcHJvYmUoaWRlX2RyaXZlX3QgKik7CiAKLXN0YXRpYyBpZGVfZHJpdmVyX3QgaWRlX2Nkcm9tX2RyaXZlciA9IHsKK3N0YXRpYyBzdHJ1Y3QgaWRlX2RyaXZlciBpZGVfY2Ryb21fZHJpdmVyID0gewogCS5nZW5fZHJpdmVyID0gewogCQkub3duZXIJCT0gVEhJU19NT0RVTEUsCiAJCS5uYW1lCQk9ICJpZGUtY2Ryb20iLApAQCAtMTkyNyw3ICsxODI1LDYgQEAKIAkudmVyc2lvbgkJPSBJREVDRF9WRVJTSU9OLAogCS5kb19yZXF1ZXN0CQk9IGlkZV9jZF9kb19yZXF1ZXN0LAogCS5lbmRfcmVxdWVzdAkJPSBpZGVfZW5kX3JlcXVlc3QsCi0JLmVycm9yCQkJPSBfX2lkZV9lcnJvciwKICNpZmRlZiBDT05GSUdfSURFX1BST0NfRlMKIAkucHJvY19lbnRyaWVzCQk9IGlkZV9jZF9wcm9jX2VudHJpZXMsCiAJLnByb2NfZGV2c2V0cwkJPSBpZGVfY2RfcHJvY19kZXZzZXRzLApAQCAtMjA4Miw2ICsxOTc5LDcgQEAKIAl9CiAKIAlkcml2ZS0+ZGVidWdfbWFzayA9IGRlYnVnX21hc2s7CisJZHJpdmUtPmlycV9oYW5kbGVyID0gY2Ryb21fbmV3cGNfaW50cjsKIAogCWluZm8gPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgY2Ryb21faW5mbyksIEdGUF9LRVJORUwpOwogCWlmIChpbmZvID09IE5VTEwpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2lkZS1jZC5oIGIvZHJpdmVycy9pZGUvaWRlLWNkLmgKaW5kZXggYmY2NzZiMi4uYWM0MGQ2YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvaWRlLWNkLmgKKysrIGIvZHJpdmVycy9pZGUvaWRlLWNkLmgKQEAgLTMzLDMzICszMywzMyBAQAogCiAvKiBTdHJ1Y3R1cmUgb2YgYSBNU0YgY2Ryb20gYWRkcmVzcy4gKi8KIHN0cnVjdCBhdGFwaV9tc2YgewotCWJ5dGUgcmVzZXJ2ZWQ7Ci0JYnl0ZSBtaW51dGU7Ci0JYnl0ZSBzZWNvbmQ7Ci0JYnl0ZSBmcmFtZTsKKwl1OCByZXNlcnZlZDsKKwl1OCBtaW51dGU7CisJdTggc2Vjb25kOworCXU4IGZyYW1lOwogfTsKIAogLyogU3BhY2UgdG8gaG9sZCB0aGUgZGlzayBUT0MuICovCiAjZGVmaW5lIE1BWF9UUkFDS1MgOTkKIHN0cnVjdCBhdGFwaV90b2NfaGVhZGVyIHsKIAl1bnNpZ25lZCBzaG9ydCB0b2NfbGVuZ3RoOwotCWJ5dGUgZmlyc3RfdHJhY2s7Ci0JYnl0ZSBsYXN0X3RyYWNrOworCXU4IGZpcnN0X3RyYWNrOworCXU4IGxhc3RfdHJhY2s7CiB9OwogCiBzdHJ1Y3QgYXRhcGlfdG9jX2VudHJ5IHsKLQlieXRlIHJlc2VydmVkMTsKKwl1OCByZXNlcnZlZDE7CiAjaWYgZGVmaW5lZChfX0JJR19FTkRJQU5fQklURklFTEQpCi0JX191OCBhZHIgICAgIDogNDsKLQlfX3U4IGNvbnRyb2wgOiA0OworCXU4IGFkciAgICAgOiA0OworCXU4IGNvbnRyb2wgOiA0OwogI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU5fQklURklFTEQpCi0JX191OCBjb250cm9sIDogNDsKLQlfX3U4IGFkciAgICAgOiA0OworCXU4IGNvbnRyb2wgOiA0OworCXU4IGFkciAgICAgOiA0OwogI2Vsc2UKICNlcnJvciAiUGxlYXNlIGZpeCA8YXNtL2J5dGVvcmRlci5oPiIKICNlbmRpZgotCWJ5dGUgdHJhY2s7Ci0JYnl0ZSByZXNlcnZlZDI7CisJdTggdHJhY2s7CisJdTggcmVzZXJ2ZWQyOwogCXVuaW9uIHsKIAkJdW5zaWduZWQgbGJhOwogCQlzdHJ1Y3QgYXRhcGlfbXNmIG1zZjsKQEAgLTc3LDEwICs3NywxMCBAQAogCiAvKiBFeHRyYSBwZXItZGV2aWNlIGluZm8gZm9yIGNkcm9tIGRyaXZlcy4gKi8KIHN0cnVjdCBjZHJvbV9pbmZvIHsKLQlpZGVfZHJpdmVfdAkqZHJpdmU7Ci0JaWRlX2RyaXZlcl90CSpkcml2ZXI7Ci0Jc3RydWN0IGdlbmRpc2sJKmRpc2s7Ci0Jc3RydWN0IGtyZWYJa3JlZjsKKwlpZGVfZHJpdmVfdAkJKmRyaXZlOworCXN0cnVjdCBpZGVfZHJpdmVyCSpkcml2ZXI7CisJc3RydWN0IGdlbmRpc2sJCSpkaXNrOworCXN0cnVjdCBrcmVmCQlrcmVmOwogCiAJLyogQnVmZmVyIGZvciB0YWJsZSBvZiBjb250ZW50cy4gIE5VTEwgaWYgd2UgaGF2ZW4ndCBhbGxvY2F0ZWQKIAkgICBhIFRPQyBidWZmZXIgZm9yIHRoaXMgZGV2aWNlIHlldC4gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2lkZS1kaXNrLmMgYi9kcml2ZXJzL2lkZS9pZGUtZGlzay5jCmluZGV4IGViOWZhYzQuLjQwODhhNjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2lkZS1kaXNrLmMKKysrIGIvZHJpdmVycy9pZGUvaWRlLWRpc2suYwpAQCAtODksNyArODksNyBAQAogc3RhdGljIGlkZV9zdGFydHN0b3BfdCBfX2lkZV9kb19yd19kaXNrKGlkZV9kcml2ZV90ICpkcml2ZSwgc3RydWN0IHJlcXVlc3QgKnJxLAogCQkJCQlzZWN0b3JfdCBibG9jaykKIHsKLQlpZGVfaHdpZl90ICpod2lmCT0gSFdJRihkcml2ZSk7CisJaWRlX2h3aWZfdCAqaHdpZgk9IGRyaXZlLT5od2lmOwogCXUxNiBuc2VjdG9ycwkJPSAodTE2KXJxLT5ucl9zZWN0b3JzOwogCXU4IGxiYTQ4CQk9ICEhKGRyaXZlLT5kZXZfZmxhZ3MgJiBJREVfREZMQUdfTEJBNDgpOwogCXU4IGRtYQkJCT0gISEoZHJpdmUtPmRldl9mbGFncyAmIElERV9ERkxBR19VU0lOR19ETUEpOwpAQCAtMTg3LDcgKzE4Nyw3IEBACiBzdGF0aWMgaWRlX3N0YXJ0c3RvcF90IGlkZV9kb19yd19kaXNrKGlkZV9kcml2ZV90ICpkcml2ZSwgc3RydWN0IHJlcXVlc3QgKnJxLAogCQkJCSAgICAgIHNlY3Rvcl90IGJsb2NrKQogewotCWlkZV9od2lmX3QgKmh3aWYgPSBIV0lGKGRyaXZlKTsKKwlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7CiAKIAlCVUdfT04oZHJpdmUtPmRldl9mbGFncyAmIElERV9ERkxBR19CTE9DS0VEKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvaWRlLWRtYS1zZmYuYyBiL2RyaXZlcnMvaWRlL2lkZS1kbWEtc2ZmLmMKaW5kZXggZjZkMmQ0NC4uMTIzZDM5MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvaWRlLWRtYS1zZmYuYworKysgYi9kcml2ZXJzL2lkZS9pZGUtZG1hLXNmZi5jCkBAIC01MCw2ICs1MCwyNyBAQAogCXJldHVybiAwOwogfQogCit1OCBpZGVfZG1hX3NmZl9yZWFkX3N0YXR1cyhpZGVfaHdpZl90ICpod2lmKQoreworCXVuc2lnbmVkIGxvbmcgYWRkciA9IGh3aWYtPmRtYV9iYXNlICsgQVRBX0RNQV9TVEFUVVM7CisKKwlpZiAoaHdpZi0+aG9zdF9mbGFncyAmIElERV9IRkxBR19NTUlPKQorCQlyZXR1cm4gcmVhZGIoKHZvaWQgX19pb21lbSAqKWFkZHIpOworCWVsc2UKKwkJcmV0dXJuIGluYihhZGRyKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGlkZV9kbWFfc2ZmX3JlYWRfc3RhdHVzKTsKKworc3RhdGljIHZvaWQgaWRlX2RtYV9zZmZfd3JpdGVfc3RhdHVzKGlkZV9od2lmX3QgKmh3aWYsIHU4IHZhbCkKK3sKKwl1bnNpZ25lZCBsb25nIGFkZHIgPSBod2lmLT5kbWFfYmFzZSArIEFUQV9ETUFfU1RBVFVTOworCisJaWYgKGh3aWYtPmhvc3RfZmxhZ3MgJiBJREVfSEZMQUdfTU1JTykKKwkJd3JpdGViKHZhbCwgKHZvaWQgX19pb21lbSAqKWFkZHIpOworCWVsc2UKKwkJb3V0Yih2YWwsIGFkZHIpOworfQorCiAvKioKICAqCWlkZV9kbWFfaG9zdF9zZXQJLQlFbmFibGUvZGlzYWJsZSBETUEgb24gYSBob3N0CiAgKglAZHJpdmU6IGRyaXZlIHRvIGNvbnRyb2wKQEAgLTYyLDE4ICs4MywxNCBAQAogewogCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKIAl1OCB1bml0ID0gZHJpdmUtPmRuICYgMTsKLQl1OCBkbWFfc3RhdCA9IGh3aWYtPnRwX29wcy0+cmVhZF9zZmZfZG1hX3N0YXR1cyhod2lmKTsKKwl1OCBkbWFfc3RhdCA9IGh3aWYtPmRtYV9vcHMtPmRtYV9zZmZfcmVhZF9zdGF0dXMoaHdpZik7CiAKIAlpZiAob24pCiAJCWRtYV9zdGF0IHw9ICgxIDw8ICg1ICsgdW5pdCkpOwogCWVsc2UKIAkJZG1hX3N0YXQgJj0gfigxIDw8ICg1ICsgdW5pdCkpOwogCi0JaWYgKGh3aWYtPmhvc3RfZmxhZ3MgJiBJREVfSEZMQUdfTU1JTykKLQkJd3JpdGViKGRtYV9zdGF0LAotCQkgICAgICAgKHZvaWQgX19pb21lbSAqKShod2lmLT5kbWFfYmFzZSArIEFUQV9ETUFfU1RBVFVTKSk7Ci0JZWxzZQotCQlvdXRiKGRtYV9zdGF0LCBod2lmLT5kbWFfYmFzZSArIEFUQV9ETUFfU1RBVFVTKTsKKwlpZGVfZG1hX3NmZl93cml0ZV9zdGF0dXMoaHdpZiwgZG1hX3N0YXQpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoaWRlX2RtYV9ob3N0X3NldCk7CiAKQEAgLTE3NSw3ICsxOTIsNyBAQAogaW50IGlkZV9kbWFfc2V0dXAoaWRlX2RyaXZlX3QgKmRyaXZlKQogewogCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKLQlzdHJ1Y3QgcmVxdWVzdCAqcnEgPSBod2lmLT5od2dyb3VwLT5ycTsKKwlzdHJ1Y3QgcmVxdWVzdCAqcnEgPSBod2lmLT5ycTsKIAl1bnNpZ25lZCBpbnQgcmVhZGluZyA9IHJxX2RhdGFfZGlyKHJxKSA/IDAgOiBBVEFfRE1BX1dSOwogCXU4IG1taW8gPSAoaHdpZi0+aG9zdF9mbGFncyAmIElERV9IRkxBR19NTUlPKSA/IDEgOiAwOwogCXU4IGRtYV9zdGF0OwpAQCAtMTg3LDcgKzIwNCw3IEBACiAJfQogCiAJLyogUFJEIHRhYmxlICovCi0JaWYgKGh3aWYtPmhvc3RfZmxhZ3MgJiBJREVfSEZMQUdfTU1JTykKKwlpZiAobW1pbykKIAkJd3JpdGVsKGh3aWYtPmRtYXRhYmxlX2RtYSwKIAkJICAgICAgICh2b2lkIF9faW9tZW0gKikoaHdpZi0+ZG1hX2Jhc2UgKyBBVEFfRE1BX1RBQkxFX09GUykpOwogCWVsc2UKQEAgLTIwMCwxNSArMjE3LDEwIEBACiAJCW91dGIocmVhZGluZywgaHdpZi0+ZG1hX2Jhc2UgKyBBVEFfRE1BX0NNRCk7CiAKIAkvKiByZWFkIERNQSBzdGF0dXMgZm9yIElOVFIgJiBFUlJPUiBmbGFncyAqLwotCWRtYV9zdGF0ID0gaHdpZi0+dHBfb3BzLT5yZWFkX3NmZl9kbWFfc3RhdHVzKGh3aWYpOworCWRtYV9zdGF0ID0gaHdpZi0+ZG1hX29wcy0+ZG1hX3NmZl9yZWFkX3N0YXR1cyhod2lmKTsKIAogCS8qIGNsZWFyIElOVFIgJiBFUlJPUiBmbGFncyAqLwotCWlmIChtbWlvKQotCQl3cml0ZWIoZG1hX3N0YXQgfCBBVEFfRE1BX0VSUiB8IEFUQV9ETUFfSU5UUiwKLQkJICAgICAgICh2b2lkIF9faW9tZW0gKikoaHdpZi0+ZG1hX2Jhc2UgKyBBVEFfRE1BX1NUQVRVUykpOwotCWVsc2UKLQkJb3V0YihkbWFfc3RhdCB8IEFUQV9ETUFfRVJSIHwgQVRBX0RNQV9JTlRSLAotCQkgICAgIGh3aWYtPmRtYV9iYXNlICsgQVRBX0RNQV9TVEFUVVMpOworCWlkZV9kbWFfc2ZmX3dyaXRlX3N0YXR1cyhod2lmLCBkbWFfc3RhdCB8IEFUQV9ETUFfRVJSIHwgQVRBX0RNQV9JTlRSKTsKIAogCWRyaXZlLT53YWl0aW5nX2Zvcl9kbWEgPSAxOwogCXJldHVybiAwOwpAQCAtMjMyLDcgKzI0NCw3IEBACiBzdGF0aWMgaW50IGRtYV90aW1lcl9leHBpcnkoaWRlX2RyaXZlX3QgKmRyaXZlKQogewogCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKLQl1OCBkbWFfc3RhdCA9IGh3aWYtPnRwX29wcy0+cmVhZF9zZmZfZG1hX3N0YXR1cyhod2lmKTsKKwl1OCBkbWFfc3RhdCA9IGh3aWYtPmRtYV9vcHMtPmRtYV9zZmZfcmVhZF9zdGF0dXMoaHdpZik7CiAKIAlwcmludGsoS0VSTl9XQVJOSU5HICIlczogJXM6IERNQSBzdGF0dXMgKDB4JTAyeClcbiIsCiAJCWRyaXZlLT5uYW1lLCBfX2Z1bmNfXywgZG1hX3N0YXQpOwpAQCAtMjQwLDcgKzI1Miw3IEBACiAJaWYgKChkbWFfc3RhdCAmIDB4MTgpID09IDB4MTgpCS8qIEJVU1kgU3R1cGlkIEVhcmx5IFRpbWVyICEhICovCiAJCXJldHVybiBXQUlUX0NNRDsKIAotCWh3aWYtPmh3Z3JvdXAtPmV4cGlyeSA9IE5VTEw7CS8qIG9uZSBmcmVlIHJpZGUgZm9yIG5vdyAqLworCWh3aWYtPmV4cGlyeSA9IE5VTEw7CS8qIG9uZSBmcmVlIHJpZGUgZm9yIG5vdyAqLwogCiAJaWYgKGRtYV9zdGF0ICYgQVRBX0RNQV9FUlIpCS8qIEVSUk9SICovCiAJCXJldHVybiAtMTsKQEAgLTI4OSwxMyArMzAxLDEyIEBACiBpbnQgaWRlX2RtYV9lbmQoaWRlX2RyaXZlX3QgKmRyaXZlKQogewogCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKLQl1OCBtbWlvID0gKGh3aWYtPmhvc3RfZmxhZ3MgJiBJREVfSEZMQUdfTU1JTykgPyAxIDogMDsKIAl1OCBkbWFfc3RhdCA9IDAsIGRtYV9jbWQgPSAwLCBtYXNrOwogCiAJZHJpdmUtPndhaXRpbmdfZm9yX2RtYSA9IDA7CiAKIAkvKiBzdG9wIERNQSAqLwotCWlmIChtbWlvKSB7CisJaWYgKGh3aWYtPmhvc3RfZmxhZ3MgJiBJREVfSEZMQUdfTU1JTykgewogCQlkbWFfY21kID0gcmVhZGIoKHZvaWQgX19pb21lbSAqKShod2lmLT5kbWFfYmFzZSArIEFUQV9ETUFfQ01EKSk7CiAJCXdyaXRlYihkbWFfY21kICYgfkFUQV9ETUFfU1RBUlQsCiAJCSAgICAgICAodm9pZCBfX2lvbWVtICopKGh3aWYtPmRtYV9iYXNlICsgQVRBX0RNQV9DTUQpKTsKQEAgLTMwNSwxNSArMzE2LDEwIEBACiAJfQogCiAJLyogZ2V0IERNQSBzdGF0dXMgKi8KLQlkbWFfc3RhdCA9IGh3aWYtPnRwX29wcy0+cmVhZF9zZmZfZG1hX3N0YXR1cyhod2lmKTsKKwlkbWFfc3RhdCA9IGh3aWYtPmRtYV9vcHMtPmRtYV9zZmZfcmVhZF9zdGF0dXMoaHdpZik7CiAKLQlpZiAobW1pbykKLQkJLyogY2xlYXIgdGhlIElOVFIgJiBFUlJPUiBiaXRzICovCi0JCXdyaXRlYihkbWFfc3RhdCB8IEFUQV9ETUFfRVJSIHwgQVRBX0RNQV9JTlRSLAotCQkgICAgICAgKHZvaWQgX19pb21lbSAqKShod2lmLT5kbWFfYmFzZSArIEFUQV9ETUFfU1RBVFVTKSk7Ci0JZWxzZQotCQlvdXRiKGRtYV9zdGF0IHwgQVRBX0RNQV9FUlIgfCBBVEFfRE1BX0lOVFIsCi0JCSAgICAgaHdpZi0+ZG1hX2Jhc2UgKyBBVEFfRE1BX1NUQVRVUyk7CisJLyogY2xlYXIgSU5UUiAmIEVSUk9SIGJpdHMgKi8KKwlpZGVfZG1hX3NmZl93cml0ZV9zdGF0dXMoaHdpZiwgZG1hX3N0YXQgfCBBVEFfRE1BX0VSUiB8IEFUQV9ETUFfSU5UUik7CiAKIAkvKiBwdXJnZSBETUEgbWFwcGluZ3MgKi8KIAlpZGVfZGVzdHJveV9kbWF0YWJsZShkcml2ZSk7CkBAIC0zMzEsNyArMzM3LDcgQEAKIGludCBpZGVfZG1hX3Rlc3RfaXJxKGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKIAlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7Ci0JdTggZG1hX3N0YXQgPSBod2lmLT50cF9vcHMtPnJlYWRfc2ZmX2RtYV9zdGF0dXMoaHdpZik7CisJdTggZG1hX3N0YXQgPSBod2lmLT5kbWFfb3BzLT5kbWFfc2ZmX3JlYWRfc3RhdHVzKGh3aWYpOwogCiAJcmV0dXJuIChkbWFfc3RhdCAmIEFUQV9ETUFfSU5UUikgPyAxIDogMDsKIH0KQEAgLTM0Niw1ICszNTIsNiBAQAogCS5kbWFfdGVzdF9pcnEJCT0gaWRlX2RtYV90ZXN0X2lycSwKIAkuZG1hX3RpbWVvdXQJCT0gaWRlX2RtYV90aW1lb3V0LAogCS5kbWFfbG9zdF9pcnEJCT0gaWRlX2RtYV9sb3N0X2lycSwKKwkuZG1hX3NmZl9yZWFkX3N0YXR1cwk9IGlkZV9kbWFfc2ZmX3JlYWRfc3RhdHVzLAogfTsKIEVYUE9SVF9TWU1CT0xfR1BMKHNmZl9kbWFfb3BzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2lkZS1kbWEuYyBiL2RyaXZlcnMvaWRlL2lkZS1kbWEuYwppbmRleCBmZmZkMTE3Li43MmViYWIwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9pZGUtZG1hLmMKKysrIGIvZHJpdmVycy9pZGUvaWRlLWRtYS5jCkBAIC05Niw3ICs5Niw3IEBACiAKIAlpZiAoT0tfU1RBVChzdGF0LCBEUklWRV9SRUFEWSwgZHJpdmUtPmJhZF93c3RhdCB8IEFUQV9EUlEpKSB7CiAJCWlmICghZG1hX3N0YXQpIHsKLQkJCXN0cnVjdCByZXF1ZXN0ICpycSA9IGh3aWYtPmh3Z3JvdXAtPnJxOworCQkJc3RydWN0IHJlcXVlc3QgKnJxID0gaHdpZi0+cnE7CiAKIAkJCXRhc2tfZW5kX3JlcXVlc3QoZHJpdmUsIHJxLCBzdGF0KTsKIAkJCXJldHVybiBpZGVfc3RvcHBlZDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2lkZS1mbG9wcHkuYyBiL2RyaXZlcnMvaWRlL2lkZS1mbG9wcHkuYwppbmRleCAwYTQ4ZTJkLi4zZWFiMWM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9pZGUtZmxvcHB5LmMKKysrIGIvZHJpdmVycy9pZGUvaWRlLWZsb3BweS5jCkBAIC03MSw3ICs3MSw3IEBACiBzdGF0aWMgaW50IGlkZV9mbG9wcHlfZW5kX3JlcXVlc3QoaWRlX2RyaXZlX3QgKmRyaXZlLCBpbnQgdXB0b2RhdGUsIGludCBuc2VjcykKIHsKIAlzdHJ1Y3QgaWRlX2Rpc2tfb2JqICpmbG9wcHkgPSBkcml2ZS0+ZHJpdmVyX2RhdGE7Ci0Jc3RydWN0IHJlcXVlc3QgKnJxID0gSFdHUk9VUChkcml2ZSktPnJxOworCXN0cnVjdCByZXF1ZXN0ICpycSA9IGRyaXZlLT5od2lmLT5ycTsKIAlpbnQgZXJyb3I7CiAKIAlpZGVfZGVidWdfbG9nKElERV9EQkdfRlVOQywgIkNhbGwgJXNcbiIsIF9fZnVuY19fKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2lkZS1nZC5jIGIvZHJpdmVycy9pZGUvaWRlLWdkLmMKaW5kZXggYjgwNzhiMy4uNzg1N2IyMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvaWRlLWdkLmMKKysrIGIvZHJpdmVycy9pZGUvaWRlLWdkLmMKQEAgLTE0OSw3ICsxNDksNyBAQAogCXJldHVybiBkcml2ZS0+ZGlza19vcHMtPmVuZF9yZXF1ZXN0KGRyaXZlLCB1cHRvZGF0ZSwgbnJzZWNzKTsKIH0KIAotc3RhdGljIGlkZV9kcml2ZXJfdCBpZGVfZ2RfZHJpdmVyID0geworc3RhdGljIHN0cnVjdCBpZGVfZHJpdmVyIGlkZV9nZF9kcml2ZXIgPSB7CiAJLmdlbl9kcml2ZXIgPSB7CiAJCS5vd25lcgkJPSBUSElTX01PRFVMRSwKIAkJLm5hbWUJCT0gImlkZS1nZCIsCkBAIC0xNjIsNyArMTYyLDYgQEAKIAkudmVyc2lvbgkJPSBJREVfR0RfVkVSU0lPTiwKIAkuZG9fcmVxdWVzdAkJPSBpZGVfZ2RfZG9fcmVxdWVzdCwKIAkuZW5kX3JlcXVlc3QJCT0gaWRlX2dkX2VuZF9yZXF1ZXN0LAotCS5lcnJvcgkJCT0gX19pZGVfZXJyb3IsCiAjaWZkZWYgQ09ORklHX0lERV9QUk9DX0ZTCiAJLnByb2NfZW50cmllcwkJPSBpZGVfZGlza19wcm9jX2VudHJpZXMsCiAJLnByb2NfZGV2c2V0cwkJPSBpZGVfZGlza19wcm9jX2RldnNldHMsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9pZGUtZ2QuaCBiL2RyaXZlcnMvaWRlL2lkZS1nZC5oCmluZGV4IDdkM2QxMDEuLmE4Njc3OWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2lkZS1nZC5oCisrKyBiL2RyaXZlcnMvaWRlL2lkZS1nZC5oCkBAIC0xNCwxMSArMTQsMTEgQEAKICNlbmRpZgogCiBzdHJ1Y3QgaWRlX2Rpc2tfb2JqIHsKLQlpZGVfZHJpdmVfdAkqZHJpdmU7Ci0JaWRlX2RyaXZlcl90CSpkcml2ZXI7Ci0Jc3RydWN0IGdlbmRpc2sJKmRpc2s7Ci0Jc3RydWN0IGtyZWYJa3JlZjsKLQl1bnNpZ25lZCBpbnQJb3BlbmVyczsJLyogcHJvdGVjdGVkIGJ5IEJLTCBmb3Igbm93ICovCisJaWRlX2RyaXZlX3QJCSpkcml2ZTsKKwlzdHJ1Y3QgaWRlX2RyaXZlcgkqZHJpdmVyOworCXN0cnVjdCBnZW5kaXNrCQkqZGlzazsKKwlzdHJ1Y3Qga3JlZgkJa3JlZjsKKwl1bnNpZ25lZCBpbnQJCW9wZW5lcnM7CS8qIHByb3RlY3RlZCBieSBCS0wgZm9yIG5vdyAqLwogCiAJLyogTGFzdCBmYWlsZWQgcGFja2V0IGNvbW1hbmQgKi8KIAlzdHJ1Y3QgaWRlX2F0YXBpX3BjICpmYWlsZWRfcGM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9pZGUtaDgzMDAuYyBiL2RyaXZlcnMvaWRlL2lkZS1oODMwMC5jCmluZGV4IGUyY2RkMmUuLjkyNzBkMzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2lkZS1oODMwMC5jCisrKyBiL2RyaXZlcnMvaWRlL2lkZS1oODMwMC5jCkBAIC0xNTksNyArMTU5LDYgQEAKIAkuZXhlY19jb21tYW5kCQk9IGlkZV9leGVjX2NvbW1hbmQsCiAJLnJlYWRfc3RhdHVzCQk9IGlkZV9yZWFkX3N0YXR1cywKIAkucmVhZF9hbHRzdGF0dXMJCT0gaWRlX3JlYWRfYWx0c3RhdHVzLAotCS5yZWFkX3NmZl9kbWFfc3RhdHVzCT0gaWRlX3JlYWRfc2ZmX2RtYV9zdGF0dXMsCiAKIAkuc2V0X2lycQkJPSBpZGVfc2V0X2lycSwKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvaWRlLWlvLmMgYi9kcml2ZXJzL2lkZS9pZGUtaW8uYwppbmRleCAxYzM2YThlLi5jYzE2MzMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9pZGUtaW8uYworKysgYi9kcml2ZXJzL2lkZS9pZGUtaW8uYwpAQCAtODgsNyArODgsNyBAQAogCQlyZXQgPSAwOwogCiAJaWYgKHJldCA9PSAwICYmIGRlcXVldWUpCi0JCWRyaXZlLT5od2lmLT5od2dyb3VwLT5ycSA9IE5VTEw7CisJCWRyaXZlLT5od2lmLT5ycSA9IE5VTEw7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtMTA3LDcgKzEwNyw3IEBACiBpbnQgaWRlX2VuZF9yZXF1ZXN0IChpZGVfZHJpdmVfdCAqZHJpdmUsIGludCB1cHRvZGF0ZSwgaW50IG5yX3NlY3RvcnMpCiB7CiAJdW5zaWduZWQgaW50IG5yX2J5dGVzID0gbnJfc2VjdG9ycyA8PCA5OwotCXN0cnVjdCByZXF1ZXN0ICpycSA9IGRyaXZlLT5od2lmLT5od2dyb3VwLT5ycTsKKwlzdHJ1Y3QgcmVxdWVzdCAqcnEgPSBkcml2ZS0+aHdpZi0+cnE7CiAKIAlpZiAoIW5yX2J5dGVzKSB7CiAJCWlmIChibGtfcGNfcmVxdWVzdChycSkpCkBAIC0xNjAsOCArMTYwLDggQEAKICAKIHZvaWQgaWRlX2VuZF9kcml2ZV9jbWQgKGlkZV9kcml2ZV90ICpkcml2ZSwgdTggc3RhdCwgdTggZXJyKQogewotCWlkZV9od2dyb3VwX3QgKmh3Z3JvdXAgPSBkcml2ZS0+aHdpZi0+aHdncm91cDsKLQlzdHJ1Y3QgcmVxdWVzdCAqcnEgPSBod2dyb3VwLT5ycTsKKwlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7CisJc3RydWN0IHJlcXVlc3QgKnJxID0gaHdpZi0+cnE7CiAKIAlpZiAocnEtPmNtZF90eXBlID09IFJFUV9UWVBFX0FUQV9UQVNLRklMRSkgewogCQlpZGVfdGFza190ICp0YXNrID0gKGlkZV90YXNrX3QgKilycS0+c3BlY2lhbDsKQEAgLTE4Niw3ICsxODYsNyBAQAogCQlyZXR1cm47CiAJfQogCi0JaHdncm91cC0+cnEgPSBOVUxMOworCWh3aWYtPnJxID0gTlVMTDsKIAogCXJxLT5lcnJvcnMgPSBlcnI7CiAKQEAgLTE5OSw5ICsxOTksOSBAQAogc3RhdGljIHZvaWQgaWRlX2tpbGxfcnEoaWRlX2RyaXZlX3QgKmRyaXZlLCBzdHJ1Y3QgcmVxdWVzdCAqcnEpCiB7CiAJaWYgKHJxLT5ycV9kaXNrKSB7Ci0JCWlkZV9kcml2ZXJfdCAqZHJ2OworCQlzdHJ1Y3QgaWRlX2RyaXZlciAqZHJ2OwogCi0JCWRydiA9ICooaWRlX2RyaXZlcl90ICoqKXJxLT5ycV9kaXNrLT5wcml2YXRlX2RhdGE7CisJCWRydiA9ICooc3RydWN0IGlkZV9kcml2ZXIgKiopcnEtPnJxX2Rpc2stPnByaXZhdGVfZGF0YTsKIAkJZHJ2LT5lbmRfcmVxdWVzdChkcml2ZSwgMCwgMCk7CiAJfSBlbHNlCiAJCWlkZV9lbmRfcmVxdWVzdChkcml2ZSwgMCwgMCk7CkBAIC0yOTEsNyArMjkxLDcgQEAKIAlyZXR1cm4gaWRlX3N0b3BwZWQ7CiB9CiAKLWlkZV9zdGFydHN0b3BfdAorc3RhdGljIGlkZV9zdGFydHN0b3BfdAogX19pZGVfZXJyb3IoaWRlX2RyaXZlX3QgKmRyaXZlLCBzdHJ1Y3QgcmVxdWVzdCAqcnEsIHU4IHN0YXQsIHU4IGVycikKIHsKIAlpZiAoZHJpdmUtPm1lZGlhID09IGlkZV9kaXNrKQpAQCAtMjk5LDggKzI5OSw2IEBACiAJcmV0dXJuIGlkZV9hdGFwaV9lcnJvcihkcml2ZSwgcnEsIHN0YXQsIGVycik7CiB9CiAKLUVYUE9SVF9TWU1CT0xfR1BMKF9faWRlX2Vycm9yKTsKLQogLyoqCiAgKglpZGVfZXJyb3IJLQloYW5kbGUgYW4gZXJyb3Igb24gdGhlIElERQogICoJQGRyaXZlOiBkcml2ZSB0aGUgZXJyb3Igb2NjdXJyZWQgb24KQEAgLTMyMSw3ICszMTksOCBAQAogCiAJZXJyID0gaWRlX2R1bXBfc3RhdHVzKGRyaXZlLCBtc2csIHN0YXQpOwogCi0JaWYgKChycSA9IEhXR1JPVVAoZHJpdmUpLT5ycSkgPT0gTlVMTCkKKwlycSA9IGRyaXZlLT5od2lmLT5ycTsKKwlpZiAocnEgPT0gTlVMTCkKIAkJcmV0dXJuIGlkZV9zdG9wcGVkOwogCiAJLyogcmV0cnkgb25seSAibm9ybWFsIiBJL086ICovCkBAIC0zMzEsMTUgKzMzMCw4IEBACiAJCXJldHVybiBpZGVfc3RvcHBlZDsKIAl9CiAKLQlpZiAocnEtPnJxX2Rpc2spIHsKLQkJaWRlX2RyaXZlcl90ICpkcnY7Ci0KLQkJZHJ2ID0gKihpZGVfZHJpdmVyX3QgKiopcnEtPnJxX2Rpc2stPnByaXZhdGVfZGF0YTsKLQkJcmV0dXJuIGRydi0+ZXJyb3IoZHJpdmUsIHJxLCBzdGF0LCBlcnIpOwotCX0gZWxzZQotCQlyZXR1cm4gX19pZGVfZXJyb3IoZHJpdmUsIHJxLCBzdGF0LCBlcnIpOworCXJldHVybiBfX2lkZV9lcnJvcihkcml2ZSwgcnEsIHN0YXQsIGVycik7CiB9Ci0KIEVYUE9SVF9TWU1CT0xfR1BMKGlkZV9lcnJvcik7CiAKIHN0YXRpYyB2b2lkIGlkZV90Zl9zZXRfc3BlY2lmeV9jbWQoaWRlX2RyaXZlX3QgKmRyaXZlLCBzdHJ1Y3QgaWRlX3Rhc2tmaWxlICp0ZikKQEAgLTQ2Miw3ICs0NTQsNyBAQAogc3RhdGljIGlkZV9zdGFydHN0b3BfdCBleGVjdXRlX2RyaXZlX2NtZCAoaWRlX2RyaXZlX3QgKmRyaXZlLAogCQlzdHJ1Y3QgcmVxdWVzdCAqcnEpCiB7Ci0JaWRlX2h3aWZfdCAqaHdpZiA9IEhXSUYoZHJpdmUpOworCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKIAlpZGVfdGFza190ICp0YXNrID0gcnEtPnNwZWNpYWw7CiAKIAlpZiAodGFzaykgewpAQCAtNTg2LDcgKzU3OCw3IEBACiAKICNpZmRlZiBERUJVRwogCXByaW50aygiJXM6IHN0YXJ0X3JlcXVlc3Q6IGN1cnJlbnQ9MHglMDhseFxuIiwKLQkJSFdJRihkcml2ZSktPm5hbWUsICh1bnNpZ25lZCBsb25nKSBycSk7CisJCWRyaXZlLT5od2lmLT5uYW1lLCAodW5zaWduZWQgbG9uZykgcnEpOwogI2VuZGlmCiAKIAkvKiBiYWlsIGVhcmx5IGlmIHdlJ3ZlIGV4Y2VlZGVkIG1heF9mYWlsdXJlcyAqLwpAQCAtNjA1LDcgKzU5Nyw3IEBACiAJCXJldHVybiBzdGFydHN0b3A7CiAJfQogCWlmICghZHJpdmUtPnNwZWNpYWwuYWxsKSB7Ci0JCWlkZV9kcml2ZXJfdCAqZHJ2OworCQlzdHJ1Y3QgaWRlX2RyaXZlciAqZHJ2OwogCiAJCS8qCiAJCSAqIFdlIHJlc2V0IHRoZSBkcml2ZSBzbyB3ZSBuZWVkIHRvIGlzc3VlIGEgU0VURkVBVFVSRVMuCkBAIC02MzgsNyArNjMwLDcgQEAKIAkJCSAqLwogCQkJcmV0dXJuIGlkZV9zcGVjaWFsX3JxKGRyaXZlLCBycSk7CiAKLQkJZHJ2ID0gKihpZGVfZHJpdmVyX3QgKiopcnEtPnJxX2Rpc2stPnByaXZhdGVfZGF0YTsKKwkJZHJ2ID0gKihzdHJ1Y3QgaWRlX2RyaXZlciAqKilycS0+cnFfZGlzay0+cHJpdmF0ZV9kYXRhOwogCiAJCXJldHVybiBkcnYtPmRvX3JlcXVlc3QoZHJpdmUsIHJxLCBycS0+c2VjdG9yKTsKIAl9CkBAIC02NTQsNyArNjQ2LDcgQEAKICAqCUB0aW1lb3V0OiB0aW1lIHRvIHN0YWxsIGZvciAoamlmZmllcykKICAqCiAgKglpZGVfc3RhbGxfcXVldWUoKSBjYW4gYmUgdXNlZCBieSBhIGRyaXZlIHRvIGdpdmUgZXhjZXNzIGJhbmR3aWR0aCBiYWNrCi0gKgl0byB0aGUgaHdncm91cCBieSBzbGVlcGluZyBmb3IgdGltZW91dCBqaWZmaWVzLgorICoJdG8gdGhlIHBvcnQgYnkgc2xlZXBpbmcgZm9yIHRpbWVvdXQgamlmZmllcy4KICAqLwogIAogdm9pZCBpZGVfc3RhbGxfcXVldWUgKGlkZV9kcml2ZV90ICpkcml2ZSwgdW5zaWduZWQgbG9uZyB0aW1lb3V0KQpAQCAtNjY2LDQ1ICs2NTgsNTMgQEAKIH0KIEVYUE9SVF9TWU1CT0woaWRlX3N0YWxsX3F1ZXVlKTsKIAorc3RhdGljIGlubGluZSBpbnQgaWRlX2xvY2tfcG9ydChpZGVfaHdpZl90ICpod2lmKQoreworCWlmIChod2lmLT5idXN5KQorCQlyZXR1cm4gMTsKKworCWh3aWYtPmJ1c3kgPSAxOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpZGVfdW5sb2NrX3BvcnQoaWRlX2h3aWZfdCAqaHdpZikKK3sKKwlod2lmLT5idXN5ID0gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgaWRlX2xvY2tfaG9zdChzdHJ1Y3QgaWRlX2hvc3QgKmhvc3QsIGlkZV9od2lmX3QgKmh3aWYpCit7CisJaW50IHJjID0gMDsKKworCWlmIChob3N0LT5ob3N0X2ZsYWdzICYgSURFX0hGTEFHX1NFUklBTElaRSkgeworCQlyYyA9IHRlc3RfYW5kX3NldF9iaXRfbG9jayhJREVfSE9TVF9CVVNZLCAmaG9zdC0+aG9zdF9idXN5KTsKKwkJaWYgKHJjID09IDApIHsKKwkJCS8qIGZvciBhdGFyaSBvbmx5ICovCisJCQlpZGVfZ2V0X2xvY2soaWRlX2ludHIsIGh3aWYpOworCQl9CisJfQorCXJldHVybiByYzsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGlkZV91bmxvY2tfaG9zdChzdHJ1Y3QgaWRlX2hvc3QgKmhvc3QpCit7CisJaWYgKGhvc3QtPmhvc3RfZmxhZ3MgJiBJREVfSEZMQUdfU0VSSUFMSVpFKSB7CisJCS8qIGZvciBhdGFyaSBvbmx5ICovCisJCWlkZV9yZWxlYXNlX2xvY2soKTsKKwkJY2xlYXJfYml0X3VubG9jayhJREVfSE9TVF9CVVNZLCAmaG9zdC0+aG9zdF9idXN5KTsKKwl9Cit9CisKIC8qCi0gKiBJc3N1ZSBhIG5ldyByZXF1ZXN0IHRvIGEgZHJpdmUgZnJvbSBod2dyb3VwCi0gKgotICogQSBod2dyb3VwIGlzIGEgc2VyaWFsaXplZCBncm91cCBvZiBJREUgaW50ZXJmYWNlcy4gIFVzdWFsbHkgdGhlcmUgaXMKLSAqIGV4YWN0bHkgb25lIGh3aWYgKGludGVyZmFjZSkgcGVyIGh3Z3JvdXAsIGJ1dCBidWdneSBjb250cm9sbGVycyAoZWcuIENNRDY0MCkKLSAqIG1heSBoYXZlIGJvdGggaW50ZXJmYWNlcyBpbiBhIHNpbmdsZSBod2dyb3VwIHRvICJzZXJpYWxpemUiIGFjY2Vzcy4KLSAqIE9yIHBvc3NpYmx5IG11bHRpcGxlIElTQSBpbnRlcmZhY2VzIGNhbiBzaGFyZSBhIGNvbW1vbiBJUlEgYnkgYmVpbmcgZ3JvdXBlZAotICogdG9nZXRoZXIgaW50byBvbmUgaHdncm91cCBmb3Igc2VyaWFsaXplZCBhY2Nlc3MuCi0gKgotICogTm90ZSBhbHNvIHRoYXQgc2V2ZXJhbCBod2dyb3VwcyBjYW4gZW5kIHVwIHNoYXJpbmcgYSBzaW5nbGUgSVJRLAotICogcG9zc2libHkgYWxvbmcgd2l0aCBtYW55IG90aGVyIGRldmljZXMuICBUaGlzIGlzIGVzcGVjaWFsbHkgY29tbW9uIGluCi0gKiBQQ0ktYmFzZWQgc3lzdGVtcyB3aXRoIG9mZi1ib2FyZCBJREUgY29udHJvbGxlciBjYXJkcy4KLSAqCi0gKiBUaGUgSURFIGRyaXZlciB1c2VzIGEgcGVyLWh3Z3JvdXAgbG9jayB0byBwcm90ZWN0IHRoZSBod2dyb3VwLT5idXN5IGZsYWcuCi0gKgotICogVGhlIGZpcnN0IHRocmVhZCBpbnRvIHRoZSBkcml2ZXIgZm9yIGEgcGFydGljdWxhciBod2dyb3VwIHNldHMgdGhlCi0gKiBod2dyb3VwLT5idXN5IGZsYWcgdG8gaW5kaWNhdGUgdGhhdCB0aGlzIGh3Z3JvdXAgaXMgbm93IGFjdGl2ZSwKLSAqIGFuZCB0aGVuIGluaXRpYXRlcyBwcm9jZXNzaW5nIG9mIHRoZSB0b3AgcmVxdWVzdCBmcm9tIHRoZSByZXF1ZXN0IHF1ZXVlLgotICoKLSAqIE90aGVyIHRocmVhZHMgYXR0ZW1wdGluZyBlbnRyeSBub3RpY2UgdGhlIGJ1c3kgc2V0dGluZywgYW5kIHdpbGwgc2ltcGx5Ci0gKiBxdWV1ZSB0aGVpciBuZXcgcmVxdWVzdHMgYW5kIGV4aXQgaW1tZWRpYXRlbHkuICBOb3RlIHRoYXQgaHdncm91cC0+YnVzeQotICogcmVtYWlucyBzZXQgZXZlbiB3aGVuIHRoZSBkcml2ZXIgaXMgbWVyZWx5IGF3YWl0aW5nIHRoZSBuZXh0IGludGVycnVwdC4KLSAqIFRodXMsIHRoZSBtZWFuaW5nIGlzICJ0aGlzIGh3Z3JvdXAgaXMgYnVzeSBwcm9jZXNzaW5nIGEgcmVxdWVzdCIuCi0gKgotICogV2hlbiBwcm9jZXNzaW5nIG9mIGEgcmVxdWVzdCBjb21wbGV0ZXMsIHRoZSBjb21wbGV0aW5nIHRocmVhZCBvciBJUlEtaGFuZGxlcgotICogd2lsbCBzdGFydCB0aGUgbmV4dCByZXF1ZXN0IGZyb20gdGhlIHF1ZXVlLiAgSWYgbm8gbW9yZSB3b3JrIHJlbWFpbnMsCi0gKiB0aGUgZHJpdmVyIHdpbGwgY2xlYXIgdGhlIGh3Z3JvdXAtPmJ1c3kgZmxhZyBhbmQgZXhpdC4KLSAqCi0gKiBUaGUgcGVyLWh3Z3JvdXAgc3BpbmxvY2sgaXMgdXNlZCB0byBwcm90ZWN0IGFsbCBhY2Nlc3MgdG8gdGhlCi0gKiBod2dyb3VwLT5idXN5IGZsYWcsIGJ1dCBpcyBvdGhlcndpc2Ugbm90IG5lZWRlZCBmb3IgbW9zdCBwcm9jZXNzaW5nIGluCi0gKiB0aGUgZHJpdmVyLiAgVGhpcyBtYWtlcyB0aGUgZHJpdmVyIG11Y2ggbW9yZSBmcmllbmRsaWVyIHRvIHNoYXJlZCBJUlFzCi0gKiB0aGFuIHByZXZpb3VzIGRlc2lnbnMsIHdoaWxlIHJlbWFpbmluZyAxMDAlICg/KSBTTVAgc2FmZSBhbmQgY2FwYWJsZS4KKyAqIElzc3VlIGEgbmV3IHJlcXVlc3QgdG8gYSBkZXZpY2UuCiAgKi8KIHZvaWQgZG9faWRlX3JlcXVlc3Qoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEpCiB7CiAJaWRlX2RyaXZlX3QJKmRyaXZlID0gcS0+cXVldWVkYXRhOwogCWlkZV9od2lmX3QJKmh3aWYgPSBkcml2ZS0+aHdpZjsKLQlpZGVfaHdncm91cF90CSpod2dyb3VwID0gaHdpZi0+aHdncm91cDsKLQlzdHJ1Y3QgcmVxdWVzdAkqcnE7CisJc3RydWN0IGlkZV9ob3N0ICpob3N0ID0gaHdpZi0+aG9zdDsKKwlzdHJ1Y3QgcmVxdWVzdAkqcnEgPSBOVUxMOwogCWlkZV9zdGFydHN0b3BfdAlzdGFydHN0b3A7CiAKIAkvKgpAQCAtNzIxLDMyICs3MjEsNDAgQEAKIAkJYmxrX3JlbW92ZV9wbHVnKHEpOwogCiAJc3Bpbl91bmxvY2tfaXJxKHEtPnF1ZXVlX2xvY2spOwotCXNwaW5fbG9ja19pcnEoJmh3Z3JvdXAtPmxvY2spOwogCi0JaWYgKCFpZGVfbG9ja19od2dyb3VwKGh3Z3JvdXApKSB7CisJaWYgKGlkZV9sb2NrX2hvc3QoaG9zdCwgaHdpZikpCisJCWdvdG8gcGx1Z19kZXZpY2VfMjsKKworCXNwaW5fbG9ja19pcnEoJmh3aWYtPmxvY2spOworCisJaWYgKCFpZGVfbG9ja19wb3J0KGh3aWYpKSB7CisJCWlkZV9od2lmX3QgKnByZXZfcG9ydDsKIHJlcGVhdDoKLQkJaHdncm91cC0+cnEgPSBOVUxMOworCQlwcmV2X3BvcnQgPSBod2lmLT5ob3N0LT5jdXJfcG9ydDsKKwkJaHdpZi0+cnEgPSBOVUxMOwogCiAJCWlmIChkcml2ZS0+ZGV2X2ZsYWdzICYgSURFX0RGTEFHX1NMRUVQSU5HKSB7CiAJCQlpZiAodGltZV9iZWZvcmUoZHJpdmUtPnNsZWVwLCBqaWZmaWVzKSkgewotCQkJCWlkZV91bmxvY2tfaHdncm91cChod2dyb3VwKTsKKwkJCQlpZGVfdW5sb2NrX3BvcnQoaHdpZik7CiAJCQkJZ290byBwbHVnX2RldmljZTsKIAkJCX0KIAkJfQogCi0JCWlmIChod2lmICE9IGh3Z3JvdXAtPmh3aWYpIHsKKwkJaWYgKChod2lmLT5ob3N0LT5ob3N0X2ZsYWdzICYgSURFX0hGTEFHX1NFUklBTElaRSkgJiYKKwkJICAgIGh3aWYgIT0gcHJldl9wb3J0KSB7CiAJCQkvKgotCQkJICogc2V0IG5JRU4gZm9yIHByZXZpb3VzIGh3aWYsIGRyaXZlcyBpbiB0aGUKKwkJCSAqIHNldCBuSUVOIGZvciBwcmV2aW91cyBwb3J0LCBkcml2ZXMgaW4gdGhlCiAJCQkgKiBxdWlya19saXN0IG1heSBub3QgbGlrZSBpbnRyIHNldHVwcy9jbGVhbnVwcwogCQkJICovCi0JCQlpZiAoZHJpdmUtPnF1aXJrX2xpc3QgPT0gMCkKLQkJCQlod2lmLT50cF9vcHMtPnNldF9pcnEoaHdpZiwgMCk7CisJCQlpZiAocHJldl9wb3J0ICYmIHByZXZfcG9ydC0+Y3VyX2Rldi0+cXVpcmtfbGlzdCA9PSAwKQorCQkJCXByZXZfcG9ydC0+dHBfb3BzLT5zZXRfaXJxKHByZXZfcG9ydCwgMCk7CisKKwkJCWh3aWYtPmhvc3QtPmN1cl9wb3J0ID0gaHdpZjsKIAkJfQotCQlod2dyb3VwLT5od2lmID0gaHdpZjsKLQkJaHdncm91cC0+ZHJpdmUgPSBkcml2ZTsKKwkJaHdpZi0+Y3VyX2RldiA9IGRyaXZlOwogCQlkcml2ZS0+ZGV2X2ZsYWdzICY9IH4oSURFX0RGTEFHX1NMRUVQSU5HIHwgSURFX0RGTEFHX1BBUktFRCk7CiAKLQkJc3Bpbl91bmxvY2tfaXJxKCZod2dyb3VwLT5sb2NrKTsKKwkJc3Bpbl91bmxvY2tfaXJxKCZod2lmLT5sb2NrKTsKIAkJc3Bpbl9sb2NrX2lycShxLT5xdWV1ZV9sb2NrKTsKIAkJLyoKIAkJICogd2Uga25vdyB0aGF0IHRoZSBxdWV1ZSBpc24ndCBlbXB0eSwgYnV0IHRoaXMgY2FuIGhhcHBlbgpAQCAtNzU0LDEwICs3NjIsMTAgQEAKIAkJICovCiAJCXJxID0gZWx2X25leHRfcmVxdWVzdChkcml2ZS0+cXVldWUpOwogCQlzcGluX3VubG9ja19pcnEocS0+cXVldWVfbG9jayk7Ci0JCXNwaW5fbG9ja19pcnEoJmh3Z3JvdXAtPmxvY2spOworCQlzcGluX2xvY2tfaXJxKCZod2lmLT5sb2NrKTsKIAogCQlpZiAoIXJxKSB7Ci0JCQlpZGVfdW5sb2NrX2h3Z3JvdXAoaHdncm91cCk7CisJCQlpZGVfdW5sb2NrX3BvcnQoaHdpZik7CiAJCQlnb3RvIG91dDsKIAkJfQogCkBAIC03NzgsMjcgKzc4NiwzMSBAQAogCQkgICAgYmxrX3BtX3JlcXVlc3QocnEpID09IDAgJiYKIAkJICAgIChycS0+Y21kX2ZsYWdzICYgUkVRX1BSRUVNUFQpID09IDApIHsKIAkJCS8qIHRoZXJlIHNob3VsZCBiZSBubyBwZW5kaW5nIGNvbW1hbmQgYXQgdGhpcyBwb2ludCAqLwotCQkJaWRlX3VubG9ja19od2dyb3VwKGh3Z3JvdXApOworCQkJaWRlX3VubG9ja19wb3J0KGh3aWYpOwogCQkJZ290byBwbHVnX2RldmljZTsKIAkJfQogCi0JCWh3Z3JvdXAtPnJxID0gcnE7CisJCWh3aWYtPnJxID0gcnE7CiAKLQkJc3Bpbl91bmxvY2tfaXJxKCZod2dyb3VwLT5sb2NrKTsKKwkJc3Bpbl91bmxvY2tfaXJxKCZod2lmLT5sb2NrKTsKIAkJc3RhcnRzdG9wID0gc3RhcnRfcmVxdWVzdChkcml2ZSwgcnEpOwotCQlzcGluX2xvY2tfaXJxKCZod2dyb3VwLT5sb2NrKTsKKwkJc3Bpbl9sb2NrX2lycSgmaHdpZi0+bG9jayk7CiAKIAkJaWYgKHN0YXJ0c3RvcCA9PSBpZGVfc3RvcHBlZCkKIAkJCWdvdG8gcmVwZWF0OwogCX0gZWxzZQogCQlnb3RvIHBsdWdfZGV2aWNlOwogb3V0OgotCXNwaW5fdW5sb2NrX2lycSgmaHdncm91cC0+bG9jayk7CisJc3Bpbl91bmxvY2tfaXJxKCZod2lmLT5sb2NrKTsKKwlpZiAocnEgPT0gTlVMTCkKKwkJaWRlX3VubG9ja19ob3N0KGhvc3QpOwogCXNwaW5fbG9ja19pcnEocS0+cXVldWVfbG9jayk7CiAJcmV0dXJuOwogCiBwbHVnX2RldmljZToKLQlzcGluX3VubG9ja19pcnEoJmh3Z3JvdXAtPmxvY2spOworCXNwaW5fdW5sb2NrX2lycSgmaHdpZi0+bG9jayk7CisJaWRlX3VubG9ja19ob3N0KGhvc3QpOworcGx1Z19kZXZpY2VfMjoKIAlzcGluX2xvY2tfaXJxKHEtPnF1ZXVlX2xvY2spOwogCiAJaWYgKCFlbHZfcXVldWVfZW1wdHkocSkpCkBAIC04MDYsMTMgKzgxOCwxMyBAQAogfQogCiAvKgotICogdW4tYnVzeSB0aGUgaHdncm91cCBldGMsIGFuZCBjbGVhciBhbnkgcGVuZGluZyBETUEgc3RhdHVzLiB3ZSB3YW50IHRvCisgKiB1bi1idXN5IHRoZSBwb3J0IGV0YywgYW5kIGNsZWFyIGFueSBwZW5kaW5nIERNQSBzdGF0dXMuIHdlIHdhbnQgdG8KICAqIHJldHJ5IHRoZSBjdXJyZW50IHJlcXVlc3QgaW4gcGlvIG1vZGUgaW5zdGVhZCBvZiByaXNraW5nIHRvc3NpbmcgaXQKICAqIGFsbCBhd2F5CiAgKi8KIHN0YXRpYyBpZGVfc3RhcnRzdG9wX3QgaWRlX2RtYV90aW1lb3V0X3JldHJ5KGlkZV9kcml2ZV90ICpkcml2ZSwgaW50IGVycm9yKQogewotCWlkZV9od2lmX3QgKmh3aWYgPSBIV0lGKGRyaXZlKTsKKwlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7CiAJc3RydWN0IHJlcXVlc3QgKnJxOwogCWlkZV9zdGFydHN0b3BfdCByZXQgPSBpZGVfc3RvcHBlZDsKIApAQCAtODQwLDE1ICs4NTIsMTQgQEAKIAlpZGVfZG1hX29mZl9xdWlldGx5KGRyaXZlKTsKIAogCS8qCi0JICogdW4tYnVzeSBkcml2ZSBldGMgKGh3Z3JvdXAtPmJ1c3kgaXMgY2xlYXJlZCBvbiByZXR1cm4pIGFuZAotCSAqIG1ha2Ugc3VyZSByZXF1ZXN0IGlzIHNhbmUKKwkgKiB1bi1idXN5IGRyaXZlIGV0YyBhbmQgbWFrZSBzdXJlIHJlcXVlc3QgaXMgc2FuZQogCSAqLwotCXJxID0gSFdHUk9VUChkcml2ZSktPnJxOwogCisJcnEgPSBod2lmLT5ycTsKIAlpZiAoIXJxKQogCQlnb3RvIG91dDsKIAotCUhXR1JPVVAoZHJpdmUpLT5ycSA9IE5VTEw7CisJaHdpZi0+cnEgPSBOVUxMOwogCiAJcnEtPmVycm9ycyA9IDA7CiAKQEAgLTg3Niw3ICs4ODcsNyBAQAogCiAvKioKICAqCWlkZV90aW1lcl9leHBpcnkJLQloYW5kbGUgbGFjayBvZiBhbiBJREUgaW50ZXJydXB0Ci0gKglAZGF0YTogdGltZXIgY2FsbGJhY2sgbWFnaWMgKGh3Z3JvdXApCisgKglAZGF0YTogdGltZXIgY2FsbGJhY2sgbWFnaWMgKGh3aWYpCiAgKgogICoJQW4gSURFIGNvbW1hbmQgaGFzIHRpbWVkIG91dCBiZWZvcmUgdGhlIGV4cGVjdGVkIGRyaXZlIHJldHVybgogICoJb2NjdXJyZWQuIEF0IHRoaXMgcG9pbnQgd2UgYXR0ZW1wdCB0byBjbGVhbiB1cCB0aGUgY3VycmVudApAQCAtODkwLDE4ICs5MDEsMTggQEAKICAKIHZvaWQgaWRlX3RpbWVyX2V4cGlyeSAodW5zaWduZWQgbG9uZyBkYXRhKQogewotCWlkZV9od2dyb3VwX3QJKmh3Z3JvdXAgPSAoaWRlX2h3Z3JvdXBfdCAqKSBkYXRhOworCWlkZV9od2lmX3QJKmh3aWYgPSAoaWRlX2h3aWZfdCAqKWRhdGE7CiAJaWRlX2RyaXZlX3QJKnVuaW5pdGlhbGl6ZWRfdmFyKGRyaXZlKTsKIAlpZGVfaGFuZGxlcl90CSpoYW5kbGVyOwotCWlkZV9leHBpcnlfdAkqZXhwaXJ5OwogCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CiAJdW5zaWduZWQgbG9uZwl3YWl0ID0gLTE7CiAJaW50CQlwbHVnX2RldmljZSA9IDA7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmaHdncm91cC0+bG9jaywgZmxhZ3MpOworCXNwaW5fbG9ja19pcnFzYXZlKCZod2lmLT5sb2NrLCBmbGFncyk7CiAKLQlpZiAoKChoYW5kbGVyID0gaHdncm91cC0+aGFuZGxlcikgPT0gTlVMTCkgfHwKLQkgICAgKGh3Z3JvdXAtPnJlcV9nZW4gIT0gaHdncm91cC0+cmVxX2dlbl90aW1lcikpIHsKKwloYW5kbGVyID0gaHdpZi0+aGFuZGxlcjsKKworCWlmIChoYW5kbGVyID09IE5VTEwgfHwgaHdpZi0+cmVxX2dlbiAhPSBod2lmLT5yZXFfZ2VuX3RpbWVyKSB7CiAJCS8qCiAJCSAqIEVpdGhlciBhIG1hcmdpbmFsIHRpbWVvdXQgb2NjdXJyZWQKIAkJICogKGdvdCB0aGUgaW50ZXJydXB0IGp1c3QgYXMgdGltZXIgZXhwaXJlZCksCkBAIC05MDksNzIgKzkyMCw2OCBAQAogCQkgKiBFaXRoZXIgd2F5LCB3ZSBkb24ndCByZWFsbHkgd2FudCB0byBjb21wbGFpbiBhYm91dCBhbnl0aGluZy4KIAkJICovCiAJfSBlbHNlIHsKLQkJZHJpdmUgPSBod2dyb3VwLT5kcml2ZTsKLQkJaWYgKCFkcml2ZSkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJpZGVfdGltZXJfZXhwaXJ5OiBod2dyb3VwLT5kcml2ZSB3YXMgTlVMTFxuIik7Ci0JCQlod2dyb3VwLT5oYW5kbGVyID0gTlVMTDsKLQkJfSBlbHNlIHsKLQkJCWlkZV9od2lmX3QgKmh3aWY7Ci0JCQlpZGVfc3RhcnRzdG9wX3Qgc3RhcnRzdG9wID0gaWRlX3N0b3BwZWQ7CisJCWlkZV9leHBpcnlfdCAqZXhwaXJ5ID0gaHdpZi0+ZXhwaXJ5OworCQlpZGVfc3RhcnRzdG9wX3Qgc3RhcnRzdG9wID0gaWRlX3N0b3BwZWQ7CiAKLQkJCWlmICgoZXhwaXJ5ID0gaHdncm91cC0+ZXhwaXJ5KSAhPSBOVUxMKSB7Ci0JCQkJLyogY29udGludWUgKi8KLQkJCQlpZiAoKHdhaXQgPSBleHBpcnkoZHJpdmUpKSA+IDApIHsKLQkJCQkJLyogcmVzZXQgdGltZXIgKi8KLQkJCQkJaHdncm91cC0+dGltZXIuZXhwaXJlcyAgPSBqaWZmaWVzICsgd2FpdDsKLQkJCQkJaHdncm91cC0+cmVxX2dlbl90aW1lciA9IGh3Z3JvdXAtPnJlcV9nZW47Ci0JCQkJCWFkZF90aW1lcigmaHdncm91cC0+dGltZXIpOwotCQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZod2dyb3VwLT5sb2NrLCBmbGFncyk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCQlod2dyb3VwLT5oYW5kbGVyID0gTlVMTDsKLQkJCS8qCi0JCQkgKiBXZSBuZWVkIHRvIHNpbXVsYXRlIGEgcmVhbCBpbnRlcnJ1cHQgd2hlbiBpbnZva2luZwotCQkJICogdGhlIGhhbmRsZXIoKSBmdW5jdGlvbiwgd2hpY2ggbWVhbnMgd2UgbmVlZCB0bwotCQkJICogZ2xvYmFsbHkgbWFzayB0aGUgc3BlY2lmaWMgSVJROgotCQkJICovCi0JCQlzcGluX3VubG9jaygmaHdncm91cC0+bG9jayk7Ci0JCQlod2lmICA9IEhXSUYoZHJpdmUpOwotCQkJLyogZGlzYWJsZV9pcnFfbm9zeW5jID8/ICovCi0JCQlkaXNhYmxlX2lycShod2lmLT5pcnEpOwotCQkJLyogbG9jYWwgQ1BVIG9ubHksCi0JCQkgKiBhcyBpZiB3ZSB3ZXJlIGhhbmRsaW5nIGFuIGludGVycnVwdCAqLwotCQkJbG9jYWxfaXJxX2Rpc2FibGUoKTsKLQkJCWlmIChod2dyb3VwLT5wb2xsaW5nKSB7Ci0JCQkJc3RhcnRzdG9wID0gaGFuZGxlcihkcml2ZSk7Ci0JCQl9IGVsc2UgaWYgKGRyaXZlX2lzX3JlYWR5KGRyaXZlKSkgewotCQkJCWlmIChkcml2ZS0+d2FpdGluZ19mb3JfZG1hKQotCQkJCQlod2lmLT5kbWFfb3BzLT5kbWFfbG9zdF9pcnEoZHJpdmUpOwotCQkJCSh2b2lkKWlkZV9hY2tfaW50cihod2lmKTsKLQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogbG9zdCBpbnRlcnJ1cHRcbiIsIGRyaXZlLT5uYW1lKTsKLQkJCQlzdGFydHN0b3AgPSBoYW5kbGVyKGRyaXZlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKGRyaXZlLT53YWl0aW5nX2Zvcl9kbWEpIHsKLQkJCQkJc3RhcnRzdG9wID0gaWRlX2RtYV90aW1lb3V0X3JldHJ5KGRyaXZlLCB3YWl0KTsKLQkJCQl9IGVsc2UKLQkJCQkJc3RhcnRzdG9wID0KLQkJCQkJaWRlX2Vycm9yKGRyaXZlLCAiaXJxIHRpbWVvdXQiLAotCQkJCQkJICBod2lmLT50cF9vcHMtPnJlYWRfc3RhdHVzKGh3aWYpKTsKLQkJCX0KLQkJCXNwaW5fbG9ja19pcnEoJmh3Z3JvdXAtPmxvY2spOwotCQkJZW5hYmxlX2lycShod2lmLT5pcnEpOwotCQkJaWYgKHN0YXJ0c3RvcCA9PSBpZGVfc3RvcHBlZCkgewotCQkJCWlkZV91bmxvY2tfaHdncm91cChod2dyb3VwKTsKLQkJCQlwbHVnX2RldmljZSA9IDE7CisJCWRyaXZlID0gaHdpZi0+Y3VyX2RldjsKKworCQlpZiAoZXhwaXJ5KSB7CisJCQl3YWl0ID0gZXhwaXJ5KGRyaXZlKTsKKwkJCWlmICh3YWl0ID4gMCkgeyAvKiBjb250aW51ZSAqLworCQkJCS8qIHJlc2V0IHRpbWVyICovCisJCQkJaHdpZi0+dGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyB3YWl0OworCQkJCWh3aWYtPnJlcV9nZW5fdGltZXIgPSBod2lmLT5yZXFfZ2VuOworCQkJCWFkZF90aW1lcigmaHdpZi0+dGltZXIpOworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmh3aWYtPmxvY2ssIGZsYWdzKTsKKwkJCQlyZXR1cm47CiAJCQl9CiAJCX0KKwkJaHdpZi0+aGFuZGxlciA9IE5VTEw7CisJCS8qCisJCSAqIFdlIG5lZWQgdG8gc2ltdWxhdGUgYSByZWFsIGludGVycnVwdCB3aGVuIGludm9raW5nCisJCSAqIHRoZSBoYW5kbGVyKCkgZnVuY3Rpb24sIHdoaWNoIG1lYW5zIHdlIG5lZWQgdG8KKwkJICogZ2xvYmFsbHkgbWFzayB0aGUgc3BlY2lmaWMgSVJROgorCQkgKi8KKwkJc3Bpbl91bmxvY2soJmh3aWYtPmxvY2spOworCQkvKiBkaXNhYmxlX2lycV9ub3N5bmMgPz8gKi8KKwkJZGlzYWJsZV9pcnEoaHdpZi0+aXJxKTsKKwkJLyogbG9jYWwgQ1BVIG9ubHksIGFzIGlmIHdlIHdlcmUgaGFuZGxpbmcgYW4gaW50ZXJydXB0ICovCisJCWxvY2FsX2lycV9kaXNhYmxlKCk7CisJCWlmIChod2lmLT5wb2xsaW5nKSB7CisJCQlzdGFydHN0b3AgPSBoYW5kbGVyKGRyaXZlKTsKKwkJfSBlbHNlIGlmIChkcml2ZV9pc19yZWFkeShkcml2ZSkpIHsKKwkJCWlmIChkcml2ZS0+d2FpdGluZ19mb3JfZG1hKQorCQkJCWh3aWYtPmRtYV9vcHMtPmRtYV9sb3N0X2lycShkcml2ZSk7CisJCQkodm9pZClpZGVfYWNrX2ludHIoaHdpZik7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogbG9zdCBpbnRlcnJ1cHRcbiIsCisJCQkJZHJpdmUtPm5hbWUpOworCQkJc3RhcnRzdG9wID0gaGFuZGxlcihkcml2ZSk7CisJCX0gZWxzZSB7CisJCQlpZiAoZHJpdmUtPndhaXRpbmdfZm9yX2RtYSkKKwkJCQlzdGFydHN0b3AgPSBpZGVfZG1hX3RpbWVvdXRfcmV0cnkoZHJpdmUsIHdhaXQpOworCQkJZWxzZQorCQkJCXN0YXJ0c3RvcCA9IGlkZV9lcnJvcihkcml2ZSwgImlycSB0aW1lb3V0IiwKKwkJCQkJaHdpZi0+dHBfb3BzLT5yZWFkX3N0YXR1cyhod2lmKSk7CisJCX0KKwkJc3Bpbl9sb2NrX2lycSgmaHdpZi0+bG9jayk7CisJCWVuYWJsZV9pcnEoaHdpZi0+aXJxKTsKKwkJaWYgKHN0YXJ0c3RvcCA9PSBpZGVfc3RvcHBlZCkgeworCQkJaWRlX3VubG9ja19wb3J0KGh3aWYpOworCQkJcGx1Z19kZXZpY2UgPSAxOworCQl9CiAJfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmh3Z3JvdXAtPmxvY2ssIGZsYWdzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZod2lmLT5sb2NrLCBmbGFncyk7CiAKLQlpZiAocGx1Z19kZXZpY2UpCisJaWYgKHBsdWdfZGV2aWNlKSB7CisJCWlkZV91bmxvY2tfaG9zdChod2lmLT5ob3N0KTsKIAkJaWRlX3BsdWdfZGV2aWNlKGRyaXZlKTsKKwl9CiB9CiAKIC8qKgogICoJdW5leHBlY3RlZF9pbnRyCQktCWhhbmRsZSBhbiB1bmV4cGVjdGVkIElERSBpbnRlcnJ1cHQKICAqCUBpcnE6IGludGVycnVwdCBsaW5lCi0gKglAaHdncm91cDogaHdncm91cCBiZWluZyBwcm9jZXNzZWQKKyAqCUBod2lmOiBwb3J0IGJlaW5nIHByb2Nlc3NlZAogICoKICAqCVRoZXJlJ3Mgbm90aGluZyByZWFsbHkgdXNlZnVsIHdlIGNhbiBkbyB3aXRoIGFuIHVuZXhwZWN0ZWQgaW50ZXJydXB0LAogICoJb3RoZXIgdGhhbiByZWFkaW5nIHRoZSBzdGF0dXMgcmVnaXN0ZXIgKHRvIGNsZWFyIGl0KSwgYW5kIGxvZ2dpbmcgaXQuCkBAIC05OTgsNTIgKzEwMDUsMzggQEAKICAqCWJlZm9yZSBjb21wbGV0aW5nIHRoZSBpc3N1YW5jZSBvZiBhbnkgbmV3IGRyaXZlIGNvbW1hbmQsIHNvIHdlIHdpbGwgbm90CiAgKgliZSBhY2NpZGVudGFsbHkgaW52b2tlZCBhcyBhIHJlc3VsdCBvZiBhbnkgdmFsaWQgY29tbWFuZCBjb21wbGV0aW9uCiAgKglpbnRlcnJ1cHQuCi0gKgotICoJTm90ZSB0aGF0IHdlIG11c3Qgd2FsayB0aGUgZW50aXJlIGh3Z3JvdXAgaGVyZS4gV2Uga25vdyB3aGljaCBod2lmCi0gKglpcyBkb2luZyB0aGUgY3VycmVudCBjb21tYW5kLCBidXQgd2UgZG9uJ3Qga25vdyB3aGljaCBod2lmIGJ1cnBlZAotICoJbXlzdGVyaW91c2x5LgogICovCi0gCi1zdGF0aWMgdm9pZCB1bmV4cGVjdGVkX2ludHIgKGludCBpcnEsIGlkZV9od2dyb3VwX3QgKmh3Z3JvdXApCisKK3N0YXRpYyB2b2lkIHVuZXhwZWN0ZWRfaW50cihpbnQgaXJxLCBpZGVfaHdpZl90ICpod2lmKQogewotCXU4IHN0YXQ7Ci0JaWRlX2h3aWZfdCAqaHdpZiA9IGh3Z3JvdXAtPmh3aWY7CisJdTggc3RhdCA9IGh3aWYtPnRwX29wcy0+cmVhZF9zdGF0dXMoaHdpZik7CiAKLQkvKgotCSAqIGhhbmRsZSB0aGUgdW5leHBlY3RlZCBpbnRlcnJ1cHQKLQkgKi8KLQlkbyB7Ci0JCWlmIChod2lmLT5pcnEgPT0gaXJxKSB7Ci0JCQlzdGF0ID0gaHdpZi0+dHBfb3BzLT5yZWFkX3N0YXR1cyhod2lmKTsKKwlpZiAoIU9LX1NUQVQoc3RhdCwgQVRBX0RSRFksIEJBRF9TVEFUKSkgeworCQkvKiBUcnkgdG8gbm90IGZsb29kIHRoZSBjb25zb2xlIHdpdGggbXNncyAqLworCQlzdGF0aWMgdW5zaWduZWQgbG9uZyBsYXN0X21zZ3RpbWUsIGNvdW50OworCQkrK2NvdW50OwogCi0JCQlpZiAoIU9LX1NUQVQoc3RhdCwgQVRBX0RSRFksIEJBRF9TVEFUKSkgewotCQkJCS8qIFRyeSB0byBub3QgZmxvb2QgdGhlIGNvbnNvbGUgd2l0aCBtc2dzICovCi0JCQkJc3RhdGljIHVuc2lnbmVkIGxvbmcgbGFzdF9tc2d0aW1lLCBjb3VudDsKLQkJCQkrK2NvdW50OwotCQkJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIGxhc3RfbXNndGltZSArIEhaKSkgewotCQkJCQlsYXN0X21zZ3RpbWUgPSBqaWZmaWVzOwotCQkJCQlwcmludGsoS0VSTl9FUlIgIiVzJXM6IHVuZXhwZWN0ZWQgaW50ZXJydXB0LCAiCi0JCQkJCQkic3RhdHVzPTB4JTAyeCwgY291bnQ9JWxkXG4iLAotCQkJCQkJaHdpZi0+bmFtZSwKLQkJCQkJCShod2lmLT5uZXh0PT1od2dyb3VwLT5od2lmKSA/ICIiIDogIig/KSIsIHN0YXQsIGNvdW50KTsKLQkJCQl9Ci0JCQl9CisJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIGxhc3RfbXNndGltZSArIEhaKSkgeworCQkJbGFzdF9tc2d0aW1lID0gamlmZmllczsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IHVuZXhwZWN0ZWQgaW50ZXJydXB0LCAiCisJCQkJInN0YXR1cz0weCUwMngsIGNvdW50PSVsZFxuIiwKKwkJCQlod2lmLT5uYW1lLCBzdGF0LCBjb3VudCk7CiAJCX0KLQl9IHdoaWxlICgoaHdpZiA9IGh3aWYtPm5leHQpICE9IGh3Z3JvdXAtPmh3aWYpOworCX0KIH0KIAogLyoqCiAgKglpZGVfaW50cgktCWRlZmF1bHQgSURFIGludGVycnVwdCBoYW5kbGVyCiAgKglAaXJxOiBpbnRlcnJ1cHQgbnVtYmVyCi0gKglAZGV2X2lkOiBod2lmIGdyb3VwCisgKglAZGV2X2lkOiBod2lmCiAgKglAcmVnczogdW51c2VkIHdlaXJkbmVzcyBmcm9tIHRoZSBrZXJuZWwgaXJxIGxheWVyCiAgKgogICoJVGhpcyBpcyB0aGUgZGVmYXVsdCBJUlEgaGFuZGxlciBmb3IgdGhlIElERSBsYXllci4gWW91IHNob3VsZAogICoJbm90IG5lZWQgdG8gb3ZlcnJpZGUgaXQuIElmIHlvdSBkbyBiZSBhd2FyZSBpdCBpcyBzdWJ0bGUgaW4KICAqCXBsYWNlcwogICoKLSAqCWh3Z3JvdXAtPmh3aWYgaXMgdGhlIGludGVyZmFjZSBpbiB0aGUgZ3JvdXAgY3VycmVudGx5IHBlcmZvcm1pbmcKLSAqCWEgY29tbWFuZC4gaHdncm91cC0+ZHJpdmUgaXMgdGhlIGRyaXZlIGFuZCBod2dyb3VwLT5oYW5kbGVyIGlzCisgKglod2lmIGlzIHRoZSBpbnRlcmZhY2UgaW4gdGhlIGdyb3VwIGN1cnJlbnRseSBwZXJmb3JtaW5nCisgKglhIGNvbW1hbmQuIGh3aWYtPmN1cl9kZXYgaXMgdGhlIGRyaXZlIGFuZCBod2lmLT5oYW5kbGVyIGlzCiAgKgl0aGUgSVJRIGhhbmRsZXIgdG8gY2FsbC4gQXMgd2UgaXNzdWUgYSBjb21tYW5kIHRoZSBoYW5kbGVycwogICoJc3RlcCB0aHJvdWdoIG11bHRpcGxlIHN0YXRlcywgcmVhc3NpZ25pbmcgdGhlIGhhbmRsZXIgdG8gdGhlCiAgKgluZXh0IHN0ZXAgaW4gdGhlIHByb2Nlc3MuIFVubGlrZSBhIHNtYXJ0IFNDU0kgY29udHJvbGxlciBJREUKQEAgLTEwNTQsMjYgKzEwNDcsMzIgQEAKICAqCiAgKglUaGUgaGFuZGxlciBldmVudHVhbGx5IHJldHVybnMgaWRlX3N0b3BwZWQgdG8gaW5kaWNhdGUgdGhlCiAgKglyZXF1ZXN0IGNvbXBsZXRlZC4gQXQgdGhpcyBwb2ludCB3ZSBpc3N1ZSB0aGUgbmV4dCByZXF1ZXN0Ci0gKglvbiB0aGUgaHdncm91cCBhbmQgdGhlIHByb2Nlc3MgYmVnaW5zIGFnYWluLgorICoJb24gdGhlIHBvcnQgYW5kIHRoZSBwcm9jZXNzIGJlZ2lucyBhZ2Fpbi4KICAqLwotIAorCiBpcnFyZXR1cm5fdCBpZGVfaW50ciAoaW50IGlycSwgdm9pZCAqZGV2X2lkKQogewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaWRlX2h3Z3JvdXBfdCAqaHdncm91cCA9IChpZGVfaHdncm91cF90ICopZGV2X2lkOwotCWlkZV9od2lmX3QgKmh3aWYgPSBod2dyb3VwLT5od2lmOworCWlkZV9od2lmX3QgKmh3aWYgPSAoaWRlX2h3aWZfdCAqKWRldl9pZDsKIAlpZGVfZHJpdmVfdCAqdW5pbml0aWFsaXplZF92YXIoZHJpdmUpOwogCWlkZV9oYW5kbGVyX3QgKmhhbmRsZXI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpZGVfc3RhcnRzdG9wX3Qgc3RhcnRzdG9wOwogCWlycXJldHVybl90IGlycV9yZXQgPSBJUlFfTk9ORTsKIAlpbnQgcGx1Z19kZXZpY2UgPSAwOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmh3Z3JvdXAtPmxvY2ssIGZsYWdzKTsKKwlpZiAoaHdpZi0+aG9zdC0+aG9zdF9mbGFncyAmIElERV9IRkxBR19TRVJJQUxJWkUpIHsKKwkJaWYgKGh3aWYgIT0gaHdpZi0+aG9zdC0+Y3VyX3BvcnQpCisJCQlnb3RvIG91dF9lYXJseTsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaHdpZi0+bG9jaywgZmxhZ3MpOwogCiAJaWYgKCFpZGVfYWNrX2ludHIoaHdpZikpCiAJCWdvdG8gb3V0OwogCi0JaWYgKChoYW5kbGVyID0gaHdncm91cC0+aGFuZGxlcikgPT0gTlVMTCB8fCBod2dyb3VwLT5wb2xsaW5nKSB7CisJaGFuZGxlciA9IGh3aWYtPmhhbmRsZXI7CisKKwlpZiAoaGFuZGxlciA9PSBOVUxMIHx8IGh3aWYtPnBvbGxpbmcpIHsKIAkJLyoKIAkJICogTm90IGV4cGVjdGluZyBhbiBpbnRlcnJ1cHQgZnJvbSB0aGlzIGRyaXZlLgogCQkgKiBUaGF0IG1lYW5zIHRoaXMgY291bGQgYmU6CkBAIC0xMDk3LDcgKzEwOTYsNyBAQAogCQkJICogUHJvYmFibHkgbm90IGEgc2hhcmVkIFBDSSBpbnRlcnJ1cHQsCiAJCQkgKiBzbyB3ZSBjYW4gc2FmZWx5IHRyeSB0byBkbyBzb21ldGhpbmcgYWJvdXQgaXQ6CiAJCQkgKi8KLQkJCXVuZXhwZWN0ZWRfaW50cihpcnEsIGh3Z3JvdXApOworCQkJdW5leHBlY3RlZF9pbnRyKGlycSwgaHdpZik7CiAjaWZkZWYgQ09ORklHX0JMS19ERVZfSURFUENJCiAJCX0gZWxzZSB7CiAJCQkvKgpAQCAtMTExMCwxNiArMTEwOSw3IEBACiAJCWdvdG8gb3V0OwogCX0KIAotCWRyaXZlID0gaHdncm91cC0+ZHJpdmU7Ci0JaWYgKCFkcml2ZSkgewotCQkvKgotCQkgKiBUaGlzIHNob3VsZCBORVZFUiBoYXBwZW4sIGFuZCB0aGVyZSBpc24ndCBtdWNoCi0JCSAqIHdlIGNvdWxkIGRvIGFib3V0IGl0IGhlcmUuCi0JCSAqCi0JCSAqIFtOb3RlIC0gdGhpcyBjYW4gb2NjdXIgaWYgdGhlIGRyaXZlIGlzIGhvdCB1bnBsdWdnZWRdCi0JCSAqLwotCQlnb3RvIG91dF9oYW5kbGVkOwotCX0KKwlkcml2ZSA9IGh3aWYtPmN1cl9kZXY7CiAKIAlpZiAoIWRyaXZlX2lzX3JlYWR5KGRyaXZlKSkKIAkJLyoKQEAgLTExMzEsMTAgKzExMjEsMTAgQEAKIAkJICovCiAJCWdvdG8gb3V0OwogCi0JaHdncm91cC0+aGFuZGxlciA9IE5VTEw7Ci0JaHdncm91cC0+cmVxX2dlbisrOwotCWRlbF90aW1lcigmaHdncm91cC0+dGltZXIpOwotCXNwaW5fdW5sb2NrKCZod2dyb3VwLT5sb2NrKTsKKwlod2lmLT5oYW5kbGVyID0gTlVMTDsKKwlod2lmLT5yZXFfZ2VuKys7CisJZGVsX3RpbWVyKCZod2lmLT50aW1lcik7CisJc3Bpbl91bmxvY2soJmh3aWYtPmxvY2spOwogCiAJaWYgKGh3aWYtPnBvcnRfb3BzICYmIGh3aWYtPnBvcnRfb3BzLT5jbGVhcl9pcnEpCiAJCWh3aWYtPnBvcnRfb3BzLT5jbGVhcl9pcnEoZHJpdmUpOwpAQCAtMTE0NSw3ICsxMTM1LDcgQEAKIAkvKiBzZXJ2aWNlIHRoaXMgaW50ZXJydXB0LCBtYXkgc2V0IGhhbmRsZXIgZm9yIG5leHQgaW50ZXJydXB0ICovCiAJc3RhcnRzdG9wID0gaGFuZGxlcihkcml2ZSk7CiAKLQlzcGluX2xvY2tfaXJxKCZod2dyb3VwLT5sb2NrKTsKKwlzcGluX2xvY2tfaXJxKCZod2lmLT5sb2NrKTsKIAkvKgogCSAqIE5vdGUgdGhhdCBoYW5kbGVyKCkgbWF5IGhhdmUgc2V0IHRoaW5ncyB1cCBmb3IgYW5vdGhlcgogCSAqIGludGVycnVwdCB0byBvY2N1ciBzb29uLCBidXQgaXQgY2Fubm90IGhhcHBlbiB1bnRpbApAQCAtMTE1NCwyMCArMTE0NCwxOCBAQAogCSAqIHdvbid0IGFsbG93IGFub3RoZXIgb2YgdGhlIHNhbWUgKG9uIGFueSBDUFUpIHVudGlsIHdlIHJldHVybi4KIAkgKi8KIAlpZiAoc3RhcnRzdG9wID09IGlkZV9zdG9wcGVkKSB7Ci0JCWlmIChod2dyb3VwLT5oYW5kbGVyID09IE5VTEwpIHsJLyogcGFyYW5vaWEgKi8KLQkJCWlkZV91bmxvY2tfaHdncm91cChod2dyb3VwKTsKLQkJCXBsdWdfZGV2aWNlID0gMTsKLQkJfSBlbHNlCi0JCQlwcmludGsoS0VSTl9FUlIgIiVzOiAlczogaHVoPyBleHBlY3RlZCBOVUxMIGhhbmRsZXIgIgotCQkJCQkib24gZXhpdFxuIiwgX19mdW5jX18sIGRyaXZlLT5uYW1lKTsKKwkJQlVHX09OKGh3aWYtPmhhbmRsZXIpOworCQlpZGVfdW5sb2NrX3BvcnQoaHdpZik7CisJCXBsdWdfZGV2aWNlID0gMTsKIAl9Ci1vdXRfaGFuZGxlZDoKIAlpcnFfcmV0ID0gSVJRX0hBTkRMRUQ7CiBvdXQ6Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHdncm91cC0+bG9jaywgZmxhZ3MpOwotCi0JaWYgKHBsdWdfZGV2aWNlKQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmh3aWYtPmxvY2ssIGZsYWdzKTsKK291dF9lYXJseToKKwlpZiAocGx1Z19kZXZpY2UpIHsKKwkJaWRlX3VubG9ja19ob3N0KGh3aWYtPmhvc3QpOwogCQlpZGVfcGx1Z19kZXZpY2UoZHJpdmUpOworCX0KIAogCXJldHVybiBpcnFfcmV0OwogfQpAQCAtMTE4OSwxNSArMTE3NywxMyBAQAogCiB2b2lkIGlkZV9kb19kcml2ZV9jbWQoaWRlX2RyaXZlX3QgKmRyaXZlLCBzdHJ1Y3QgcmVxdWVzdCAqcnEpCiB7Ci0JaWRlX2h3Z3JvdXBfdCAqaHdncm91cCA9IGRyaXZlLT5od2lmLT5od2dyb3VwOwogCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxID0gZHJpdmUtPnF1ZXVlOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlod2dyb3VwLT5ycSA9IE5VTEw7CisJZHJpdmUtPmh3aWYtPnJxID0gTlVMTDsKIAogCXNwaW5fbG9ja19pcnFzYXZlKHEtPnF1ZXVlX2xvY2ssIGZsYWdzKTsKIAlfX2Vsdl9hZGRfcmVxdWVzdChxLCBycSwgRUxFVkFUT1JfSU5TRVJUX0ZST05ULCAwKTsKLQlibGtfc3RhcnRfcXVldWVpbmcocSk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShxLT5xdWV1ZV9sb2NrLCBmbGFncyk7CiB9CiBFWFBPUlRfU1lNQk9MKGlkZV9kb19kcml2ZV9jbWQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvaWRlLWlvcHMuYyBiL2RyaXZlcnMvaWRlL2lkZS1pb3BzLmMKaW5kZXggYWQ4YmQ2NS4uZTcyOGNmZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvaWRlLWlvcHMuYworKysgYi9kcml2ZXJzL2lkZS9pZGUtaW9wcy5jCkBAIC0xMDUsMTUgKzEwNSw2IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChpZGVfcmVhZF9hbHRzdGF0dXMpOwogCi11OCBpZGVfcmVhZF9zZmZfZG1hX3N0YXR1cyhpZGVfaHdpZl90ICpod2lmKQotewotCWlmIChod2lmLT5ob3N0X2ZsYWdzICYgSURFX0hGTEFHX01NSU8pCi0JCXJldHVybiByZWFkYigodm9pZCBfX2lvbWVtICopKGh3aWYtPmRtYV9iYXNlICsgQVRBX0RNQV9TVEFUVVMpKTsKLQllbHNlCi0JCXJldHVybiBpbmIoaHdpZi0+ZG1hX2Jhc2UgKyBBVEFfRE1BX1NUQVRVUyk7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChpZGVfcmVhZF9zZmZfZG1hX3N0YXR1cyk7Ci0KIHZvaWQgaWRlX3NldF9pcnEoaWRlX2h3aWZfdCAqaHdpZiwgaW50IG9uKQogewogCXU4IGN0bCA9IEFUQV9ERVZDVExfT0JTOwpAQCAtMzg4LDcgKzM3OSw2IEBACiAJLmV4ZWNfY29tbWFuZAkJPSBpZGVfZXhlY19jb21tYW5kLAogCS5yZWFkX3N0YXR1cwkJPSBpZGVfcmVhZF9zdGF0dXMsCiAJLnJlYWRfYWx0c3RhdHVzCQk9IGlkZV9yZWFkX2FsdHN0YXR1cywKLQkucmVhZF9zZmZfZG1hX3N0YXR1cwk9IGlkZV9yZWFkX3NmZl9kbWFfc3RhdHVzLAogCiAJLnNldF9pcnEJCT0gaWRlX3NldF9pcnEsCiAKQEAgLTQ1MSw3ICs0NDEsNyBAQAogICovCiBpbnQgZHJpdmVfaXNfcmVhZHkgKGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKLQlpZGVfaHdpZl90ICpod2lmCT0gSFdJRihkcml2ZSk7CisJaWRlX2h3aWZfdCAqaHdpZgk9IGRyaXZlLT5od2lmOwogCXU4IHN0YXQJCQk9IDA7CiAKIAlpZiAoZHJpdmUtPndhaXRpbmdfZm9yX2RtYSkKQEAgLTUwMyw3ICs0OTMsOCBAQAogCXN0YXQgPSB0cF9vcHMtPnJlYWRfc3RhdHVzKGh3aWYpOwogCiAJaWYgKHN0YXQgJiBBVEFfQlVTWSkgewotCQlsb2NhbF9pcnFfc2V0KGZsYWdzKTsKKwkJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCQlsb2NhbF9pcnFfZW5hYmxlX2luX2hhcmRpcnEoKTsKIAkJdGltZW91dCArPSBqaWZmaWVzOwogCQl3aGlsZSAoKHN0YXQgPSB0cF9vcHMtPnJlYWRfc3RhdHVzKGh3aWYpKSAmIEFUQV9CVVNZKSB7CiAJCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCB0aW1lb3V0KSkgewpAQCAtODIyLDI1ICs4MTMsMjUgQEAKIHN0YXRpYyB2b2lkIF9faWRlX3NldF9oYW5kbGVyIChpZGVfZHJpdmVfdCAqZHJpdmUsIGlkZV9oYW5kbGVyX3QgKmhhbmRsZXIsCiAJCSAgICAgIHVuc2lnbmVkIGludCB0aW1lb3V0LCBpZGVfZXhwaXJ5X3QgKmV4cGlyeSkKIHsKLQlpZGVfaHdncm91cF90ICpod2dyb3VwID0gSFdHUk9VUChkcml2ZSk7CisJaWRlX2h3aWZfdCAqaHdpZiA9IGRyaXZlLT5od2lmOwogCi0JQlVHX09OKGh3Z3JvdXAtPmhhbmRsZXIpOwotCWh3Z3JvdXAtPmhhbmRsZXIJPSBoYW5kbGVyOwotCWh3Z3JvdXAtPmV4cGlyeQkJPSBleHBpcnk7Ci0JaHdncm91cC0+dGltZXIuZXhwaXJlcwk9IGppZmZpZXMgKyB0aW1lb3V0OwotCWh3Z3JvdXAtPnJlcV9nZW5fdGltZXIJPSBod2dyb3VwLT5yZXFfZ2VuOwotCWFkZF90aW1lcigmaHdncm91cC0+dGltZXIpOworCUJVR19PTihod2lmLT5oYW5kbGVyKTsKKwlod2lmLT5oYW5kbGVyCQk9IGhhbmRsZXI7CisJaHdpZi0+ZXhwaXJ5CQk9IGV4cGlyeTsKKwlod2lmLT50aW1lci5leHBpcmVzCT0gamlmZmllcyArIHRpbWVvdXQ7CisJaHdpZi0+cmVxX2dlbl90aW1lcgk9IGh3aWYtPnJlcV9nZW47CisJYWRkX3RpbWVyKCZod2lmLT50aW1lcik7CiB9CiAKIHZvaWQgaWRlX3NldF9oYW5kbGVyIChpZGVfZHJpdmVfdCAqZHJpdmUsIGlkZV9oYW5kbGVyX3QgKmhhbmRsZXIsCiAJCSAgICAgIHVuc2lnbmVkIGludCB0aW1lb3V0LCBpZGVfZXhwaXJ5X3QgKmV4cGlyeSkKIHsKLQlpZGVfaHdncm91cF90ICpod2dyb3VwID0gZHJpdmUtPmh3aWYtPmh3Z3JvdXA7CisJaWRlX2h3aWZfdCAqaHdpZiA9IGRyaXZlLT5od2lmOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmaHdncm91cC0+bG9jaywgZmxhZ3MpOworCXNwaW5fbG9ja19pcnFzYXZlKCZod2lmLT5sb2NrLCBmbGFncyk7CiAJX19pZGVfc2V0X2hhbmRsZXIoZHJpdmUsIGhhbmRsZXIsIHRpbWVvdXQsIGV4cGlyeSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHdncm91cC0+bG9jaywgZmxhZ3MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmh3aWYtPmxvY2ssIGZsYWdzKTsKIH0KIAogRVhQT1JUX1NZTUJPTChpZGVfc2V0X2hhbmRsZXIpOwpAQCAtODYzLDEwICs4NTQsOSBAQAogCQkJIHVuc2lnbmVkIHRpbWVvdXQsIGlkZV9leHBpcnlfdCAqZXhwaXJ5KQogewogCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKLQlpZGVfaHdncm91cF90ICpod2dyb3VwID0gaHdpZi0+aHdncm91cDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmh3Z3JvdXAtPmxvY2ssIGZsYWdzKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaHdpZi0+bG9jaywgZmxhZ3MpOwogCV9faWRlX3NldF9oYW5kbGVyKGRyaXZlLCBoYW5kbGVyLCB0aW1lb3V0LCBleHBpcnkpOwogCWh3aWYtPnRwX29wcy0+ZXhlY19jb21tYW5kKGh3aWYsIGNtZCk7CiAJLyoKQEAgLTg3NiwyNiArODY2LDI1IEBACiAJICogRklYTUU6IHdlIGNvdWxkIHNraXAgdGhpcyBkZWxheSB3aXRoIGNhcmUgb24gbm9uIHNoYXJlZCBkZXZpY2VzCiAJICovCiAJbmRlbGF5KDQwMCk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHdncm91cC0+bG9jaywgZmxhZ3MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmh3aWYtPmxvY2ssIGZsYWdzKTsKIH0KIEVYUE9SVF9TWU1CT0woaWRlX2V4ZWN1dGVfY29tbWFuZCk7CiAKIHZvaWQgaWRlX2V4ZWN1dGVfcGt0X2NtZChpZGVfZHJpdmVfdCAqZHJpdmUpCiB7CiAJaWRlX2h3aWZfdCAqaHdpZiA9IGRyaXZlLT5od2lmOwotCWlkZV9od2dyb3VwX3QgKmh3Z3JvdXAgPSBod2lmLT5od2dyb3VwOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmaHdncm91cC0+bG9jaywgZmxhZ3MpOworCXNwaW5fbG9ja19pcnFzYXZlKCZod2lmLT5sb2NrLCBmbGFncyk7CiAJaHdpZi0+dHBfb3BzLT5leGVjX2NvbW1hbmQoaHdpZiwgQVRBX0NNRF9QQUNLRVQpOwogCW5kZWxheSg0MDApOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmh3Z3JvdXAtPmxvY2ssIGZsYWdzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZod2lmLT5sb2NrLCBmbGFncyk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChpZGVfZXhlY3V0ZV9wa3RfY21kKTsKIAogc3RhdGljIGlubGluZSB2b2lkIGlkZV9jb21wbGV0ZV9kcml2ZV9yZXNldChpZGVfZHJpdmVfdCAqZHJpdmUsIGludCBlcnIpCiB7Ci0Jc3RydWN0IHJlcXVlc3QgKnJxID0gZHJpdmUtPmh3aWYtPmh3Z3JvdXAtPnJxOworCXN0cnVjdCByZXF1ZXN0ICpycSA9IGRyaXZlLT5od2lmLT5ycTsKIAogCWlmIChycSAmJiBibGtfc3BlY2lhbF9yZXF1ZXN0KHJxKSAmJiBycS0+Y21kWzBdID09IFJFUV9EUklWRV9SRVNFVCkKIAkJaWRlX2VuZF9yZXF1ZXN0KGRyaXZlLCBlcnIgPyBlcnIgOiAxLCAwKTsKQEAgLTkxMyw3ICs5MDIsNiBAQAogc3RhdGljIGlkZV9zdGFydHN0b3BfdCBhdGFwaV9yZXNldF9wb2xsZnVuYyAoaWRlX2RyaXZlX3QgKmRyaXZlKQogewogCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKLQlpZGVfaHdncm91cF90ICpod2dyb3VwID0gaHdpZi0+aHdncm91cDsKIAl1OCBzdGF0OwogCiAJU0VMRUNUX0RSSVZFKGRyaXZlKTsKQEAgLTkyMywyMCArOTExLDIwIEBACiAJaWYgKE9LX1NUQVQoc3RhdCwgMCwgQVRBX0JVU1kpKQogCQlwcmludGsoIiVzOiBBVEFQSSByZXNldCBjb21wbGV0ZVxuIiwgZHJpdmUtPm5hbWUpOwogCWVsc2UgewotCQlpZiAodGltZV9iZWZvcmUoamlmZmllcywgaHdncm91cC0+cG9sbF90aW1lb3V0KSkgeworCQlpZiAodGltZV9iZWZvcmUoamlmZmllcywgaHdpZi0+cG9sbF90aW1lb3V0KSkgewogCQkJaWRlX3NldF9oYW5kbGVyKGRyaXZlLCAmYXRhcGlfcmVzZXRfcG9sbGZ1bmMsIEhaLzIwLCBOVUxMKTsKIAkJCS8qIGNvbnRpbnVlIHBvbGxpbmcgKi8KIAkJCXJldHVybiBpZGVfc3RhcnRlZDsKIAkJfQogCQkvKiBlbmQgb2YgcG9sbGluZyAqLwotCQlod2dyb3VwLT5wb2xsaW5nID0gMDsKKwkJaHdpZi0+cG9sbGluZyA9IDA7CiAJCXByaW50aygiJXM6IEFUQVBJIHJlc2V0IHRpbWVkLW91dCwgc3RhdHVzPTB4JTAyeFxuIiwKIAkJCQlkcml2ZS0+bmFtZSwgc3RhdCk7CiAJCS8qIGRvIGl0IHRoZSBvbGQgZmFzaGlvbmVkIHdheSAqLwogCQlyZXR1cm4gZG9fcmVzZXQxKGRyaXZlLCAxKTsKIAl9CiAJLyogZG9uZSBwb2xsaW5nICovCi0JaHdncm91cC0+cG9sbGluZyA9IDA7CisJaHdpZi0+cG9sbGluZyA9IDA7CiAJaWRlX2NvbXBsZXRlX2RyaXZlX3Jlc2V0KGRyaXZlLCAwKTsKIAlyZXR1cm4gaWRlX3N0b3BwZWQ7CiB9CkBAIC05NjgsOCArOTU2LDcgQEAKICAqLwogc3RhdGljIGlkZV9zdGFydHN0b3BfdCByZXNldF9wb2xsZnVuYyAoaWRlX2RyaXZlX3QgKmRyaXZlKQogewotCWlkZV9od2dyb3VwX3QgKmh3Z3JvdXAJPSBIV0dST1VQKGRyaXZlKTsKLQlpZGVfaHdpZl90ICpod2lmCT0gSFdJRihkcml2ZSk7CisJaWRlX2h3aWZfdCAqaHdpZiA9IGRyaXZlLT5od2lmOwogCWNvbnN0IHN0cnVjdCBpZGVfcG9ydF9vcHMgKnBvcnRfb3BzID0gaHdpZi0+cG9ydF9vcHM7CiAJdTggdG1wOwogCWludCBlcnIgPSAwOwpAQCAtOTg2LDcgKzk3Myw3IEBACiAJdG1wID0gaHdpZi0+dHBfb3BzLT5yZWFkX3N0YXR1cyhod2lmKTsKIAogCWlmICghT0tfU1RBVCh0bXAsIDAsIEFUQV9CVVNZKSkgewotCQlpZiAodGltZV9iZWZvcmUoamlmZmllcywgaHdncm91cC0+cG9sbF90aW1lb3V0KSkgeworCQlpZiAodGltZV9iZWZvcmUoamlmZmllcywgaHdpZi0+cG9sbF90aW1lb3V0KSkgewogCQkJaWRlX3NldF9oYW5kbGVyKGRyaXZlLCAmcmVzZXRfcG9sbGZ1bmMsIEhaLzIwLCBOVUxMKTsKIAkJCS8qIGNvbnRpbnVlIHBvbGxpbmcgKi8KIAkJCXJldHVybiBpZGVfc3RhcnRlZDsKQEAgLTEwMDcsNyArOTk0LDcgQEAKIAkJfQogCX0KIG91dDoKLQlod2dyb3VwLT5wb2xsaW5nID0gMDsJLyogZG9uZSBwb2xsaW5nICovCisJaHdpZi0+cG9sbGluZyA9IDA7CS8qIGRvbmUgcG9sbGluZyAqLwogCWlkZV9jb21wbGV0ZV9kcml2ZV9yZXNldChkcml2ZSwgZXJyKTsKIAlyZXR1cm4gaWRlX3N0b3BwZWQ7CiB9CkBAIC0xMDgxLDE4ICsxMDY4LDE4IEBACiBzdGF0aWMgaWRlX3N0YXJ0c3RvcF90IGRvX3Jlc2V0MSAoaWRlX2RyaXZlX3QgKmRyaXZlLCBpbnQgZG9fbm90X3RyeV9hdGFwaSkKIHsKIAlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7Ci0JaWRlX2h3Z3JvdXBfdCAqaHdncm91cCA9IGh3aWYtPmh3Z3JvdXA7CiAJc3RydWN0IGlkZV9pb19wb3J0cyAqaW9fcG9ydHMgPSAmaHdpZi0+aW9fcG9ydHM7CiAJY29uc3Qgc3RydWN0IGlkZV90cF9vcHMgKnRwX29wcyA9IGh3aWYtPnRwX29wczsKIAljb25zdCBzdHJ1Y3QgaWRlX3BvcnRfb3BzICpwb3J0X29wczsKKwlpZGVfZHJpdmVfdCAqdGRyaXZlOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIHRpbWVvdXQ7Ci0JdW5zaWduZWQgaW50IHVuaXQ7CisJaW50IGk7CiAJREVGSU5FX1dBSVQod2FpdCk7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmaHdncm91cC0+bG9jaywgZmxhZ3MpOworCXNwaW5fbG9ja19pcnFzYXZlKCZod2lmLT5sb2NrLCBmbGFncyk7CiAKIAkvKiBXZSBtdXN0IG5vdCByZXNldCB3aXRoIHJ1bm5pbmcgaGFuZGxlcnMgKi8KLQlCVUdfT04oaHdncm91cC0+aGFuZGxlciAhPSBOVUxMKTsKKwlCVUdfT04oaHdpZi0+aGFuZGxlciAhPSBOVUxMKTsKIAogCS8qIEZvciBhbiBBVEFQSSBkZXZpY2UsIGZpcnN0IHRyeSBhbiBBVEFQSSBTUlNULiAqLwogCWlmIChkcml2ZS0+bWVkaWEgIT0gaWRlX2Rpc2sgJiYgIWRvX25vdF90cnlfYXRhcGkpIHsKQEAgLTExMDEsMTAgKzEwODgsMTAgQEAKIAkJdWRlbGF5ICgyMCk7CiAJCXRwX29wcy0+ZXhlY19jb21tYW5kKGh3aWYsIEFUQV9DTURfREVWX1JFU0VUKTsKIAkJbmRlbGF5KDQwMCk7Ci0JCWh3Z3JvdXAtPnBvbGxfdGltZW91dCA9IGppZmZpZXMgKyBXQUlUX1dPUlNUQ0FTRTsKLQkJaHdncm91cC0+cG9sbGluZyA9IDE7CisJCWh3aWYtPnBvbGxfdGltZW91dCA9IGppZmZpZXMgKyBXQUlUX1dPUlNUQ0FTRTsKKwkJaHdpZi0+cG9sbGluZyA9IDE7CiAJCV9faWRlX3NldF9oYW5kbGVyKGRyaXZlLCAmYXRhcGlfcmVzZXRfcG9sbGZ1bmMsIEhaLzIwLCBOVUxMKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHdncm91cC0+bG9jaywgZmxhZ3MpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZod2lmLT5sb2NrLCBmbGFncyk7CiAJCXJldHVybiBpZGVfc3RhcnRlZDsKIAl9CiAKQEAgLTExMTQsOSArMTEwMSw3IEBACiAKIAkJcHJlcGFyZV90b193YWl0KCZpZGVfcGFya193cSwgJndhaXQsIFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKIAkJdGltZW91dCA9IGppZmZpZXM7Ci0JCWZvciAodW5pdCA9IDA7IHVuaXQgPCBNQVhfRFJJVkVTOyB1bml0KyspIHsKLQkJCWlkZV9kcml2ZV90ICp0ZHJpdmUgPSAmaHdpZi0+ZHJpdmVzW3VuaXRdOwotCisJCWlkZV9wb3J0X2Zvcl9lYWNoX2RldihpLCB0ZHJpdmUsIGh3aWYpIHsKIAkJCWlmICh0ZHJpdmUtPmRldl9mbGFncyAmIElERV9ERkxBR19QUkVTRU5UICYmCiAJCQkgICAgdGRyaXZlLT5kZXZfZmxhZ3MgJiBJREVfREZMQUdfUEFSS0VEICYmCiAJCQkgICAgdGltZV9hZnRlcih0ZHJpdmUtPnNsZWVwLCB0aW1lb3V0KSkKQEAgLTExMjcsOSArMTExMiw5IEBACiAJCWlmICh0aW1lX2JlZm9yZV9lcSh0aW1lb3V0LCBub3cpKQogCQkJYnJlYWs7CiAKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHdncm91cC0+bG9jaywgZmxhZ3MpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZod2lmLT5sb2NrLCBmbGFncyk7CiAJCXRpbWVvdXQgPSBzY2hlZHVsZV90aW1lb3V0X3VuaW50ZXJydXB0aWJsZSh0aW1lb3V0IC0gbm93KTsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmh3Z3JvdXAtPmxvY2ssIGZsYWdzKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmh3aWYtPmxvY2ssIGZsYWdzKTsKIAl9IHdoaWxlICh0aW1lb3V0KTsKIAlmaW5pc2hfd2FpdCgmaWRlX3Bhcmtfd3EsICZ3YWl0KTsKIApAQCAtMTEzNywxMSArMTEyMiwxMSBAQAogCSAqIEZpcnN0LCByZXNldCBhbnkgZGV2aWNlIHN0YXRlIGRhdGEgd2Ugd2VyZSBtYWludGFpbmluZwogCSAqIGZvciBhbnkgb2YgdGhlIGRyaXZlcyBvbiB0aGlzIGludGVyZmFjZS4KIAkgKi8KLQlmb3IgKHVuaXQgPSAwOyB1bml0IDwgTUFYX0RSSVZFUzsgKyt1bml0KQotCQlwcmVfcmVzZXQoJmh3aWYtPmRyaXZlc1t1bml0XSk7CisJaWRlX3BvcnRfZm9yX2VhY2hfZGV2KGksIHRkcml2ZSwgaHdpZikKKwkJcHJlX3Jlc2V0KHRkcml2ZSk7CiAKIAlpZiAoaW9fcG9ydHMtPmN0bF9hZGRyID09IDApIHsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHdncm91cC0+bG9jaywgZmxhZ3MpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZod2lmLT5sb2NrLCBmbGFncyk7CiAJCWlkZV9jb21wbGV0ZV9kcml2ZV9yZXNldChkcml2ZSwgLUVOWElPKTsKIAkJcmV0dXJuIGlkZV9zdG9wcGVkOwogCX0KQEAgLTExNjQsOCArMTE0OSw4IEBACiAJdHBfb3BzLT5zZXRfaXJxKGh3aWYsIGRyaXZlLT5xdWlya19saXN0ID09IDIpOwogCS8qIG1vcmUgdGhhbiBlbm91Z2ggdGltZSAqLwogCXVkZWxheSgxMCk7Ci0JaHdncm91cC0+cG9sbF90aW1lb3V0ID0gamlmZmllcyArIFdBSVRfV09SU1RDQVNFOwotCWh3Z3JvdXAtPnBvbGxpbmcgPSAxOworCWh3aWYtPnBvbGxfdGltZW91dCA9IGppZmZpZXMgKyBXQUlUX1dPUlNUQ0FTRTsKKwlod2lmLT5wb2xsaW5nID0gMTsKIAlfX2lkZV9zZXRfaGFuZGxlcihkcml2ZSwgJnJlc2V0X3BvbGxmdW5jLCBIWi8yMCwgTlVMTCk7CiAKIAkvKgpAQCAtMTE3Nyw3ICsxMTYyLDcgQEAKIAlpZiAocG9ydF9vcHMgJiYgcG9ydF9vcHMtPnJlc2V0cHJvYykKIAkJcG9ydF9vcHMtPnJlc2V0cHJvYyhkcml2ZSk7CiAKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZod2dyb3VwLT5sb2NrLCBmbGFncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHdpZi0+bG9jaywgZmxhZ3MpOwogCXJldHVybiBpZGVfc3RhcnRlZDsKIH0KIApAQCAtMTIyMSw2ICsxMjA2LDMgQEAKIAl9CiAJcmV0dXJuIC1FQlVTWTsKIH0KLQotRVhQT1JUX1NZTUJPTF9HUEwoaWRlX3dhaXRfbm90X2J1c3kpOwotCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9pZGUtbGliLmMgYi9kcml2ZXJzL2lkZS9pZGUtbGliLmMKaW5kZXggOWY2ZTMzZC4uMDk1MjZhMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvaWRlLWxpYi5jCisrKyBiL2RyaXZlcnMvaWRlL2lkZS1saWIuYwpAQCAtMjczLDcgKzI3Myw3IEBACiAKIHN0YXRpYyB2b2lkIGlkZV9kdW1wX29wY29kZShpZGVfZHJpdmVfdCAqZHJpdmUpCiB7Ci0Jc3RydWN0IHJlcXVlc3QgKnJxID0gZHJpdmUtPmh3aWYtPmh3Z3JvdXAtPnJxOworCXN0cnVjdCByZXF1ZXN0ICpycSA9IGRyaXZlLT5od2lmLT5ycTsKIAlpZGVfdGFza190ICp0YXNrID0gTlVMTDsKIAogCWlmICghcnEpCkBAIC0zNDYsMTAgKzM0NiwxMyBAQAogCXByaW50ayhLRVJOX0NPTlQgIn0iKTsKIAlpZiAoKGVyciAmIChBVEFfQkJLIHwgQVRBX0FCT1JURUQpKSA9PSBBVEFfQkJLIHx8CiAJICAgIChlcnIgJiAoQVRBX1VOQyB8IEFUQV9JRE5GIHwgQVRBX0FNTkYpKSkgeworCQlzdHJ1Y3QgcmVxdWVzdCAqcnEgPSBkcml2ZS0+aHdpZi0+cnE7CisKIAkJaWRlX2R1bXBfc2VjdG9yKGRyaXZlKTsKLQkJaWYgKEhXR1JPVVAoZHJpdmUpICYmIEhXR1JPVVAoZHJpdmUpLT5ycSkKKworCQlpZiAocnEpCiAJCQlwcmludGsoS0VSTl9DT05UICIsIHNlY3Rvcj0lbGx1IiwKLQkJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKUhXR1JPVVAoZHJpdmUpLT5ycS0+c2VjdG9yKTsKKwkJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKXJxLT5zZWN0b3IpOwogCX0KIAlwcmludGsoS0VSTl9DT05UICJcbiIpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvaWRlLXBhcmsuYyBiL2RyaXZlcnMvaWRlL2lkZS1wYXJrLmMKaW5kZXggNjc4NDU0YS4uYzg3NWE5NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvaWRlLXBhcmsuYworKysgYi9kcml2ZXJzL2lkZS9pZGUtcGFyay5jCkBAIC03LDIyICs3LDIyIEBACiAKIHN0YXRpYyB2b2lkIGlzc3VlX3BhcmtfY21kKGlkZV9kcml2ZV90ICpkcml2ZSwgdW5zaWduZWQgbG9uZyB0aW1lb3V0KQogewotCWlkZV9od2dyb3VwX3QgKmh3Z3JvdXAgPSBkcml2ZS0+aHdpZi0+aHdncm91cDsKKwlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7CiAJc3RydWN0IHJlcXVlc3RfcXVldWUgKnEgPSBkcml2ZS0+cXVldWU7CiAJc3RydWN0IHJlcXVlc3QgKnJxOwogCWludCByYzsKIAogCXRpbWVvdXQgKz0gamlmZmllczsKLQlzcGluX2xvY2tfaXJxKCZod2dyb3VwLT5sb2NrKTsKKwlzcGluX2xvY2tfaXJxKCZod2lmLT5sb2NrKTsKIAlpZiAoZHJpdmUtPmRldl9mbGFncyAmIElERV9ERkxBR19QQVJLRUQpIHsKIAkJaW50IHJlc2V0X3RpbWVyID0gdGltZV9iZWZvcmUodGltZW91dCwgZHJpdmUtPnNsZWVwKTsKIAkJaW50IHN0YXJ0X3F1ZXVlID0gMDsKIAogCQlkcml2ZS0+c2xlZXAgPSB0aW1lb3V0OwogCQl3YWtlX3VwX2FsbCgmaWRlX3Bhcmtfd3EpOwotCQlpZiAocmVzZXRfdGltZXIgJiYgZGVsX3RpbWVyKCZod2dyb3VwLT50aW1lcikpCisJCWlmIChyZXNldF90aW1lciAmJiBkZWxfdGltZXIoJmh3aWYtPnRpbWVyKSkKIAkJCXN0YXJ0X3F1ZXVlID0gMTsKLQkJc3Bpbl91bmxvY2tfaXJxKCZod2dyb3VwLT5sb2NrKTsKKwkJc3Bpbl91bmxvY2tfaXJxKCZod2lmLT5sb2NrKTsKIAogCQlpZiAoc3RhcnRfcXVldWUpIHsKIAkJCXNwaW5fbG9ja19pcnEocS0+cXVldWVfbG9jayk7CkBAIC0zMSw3ICszMSw3IEBACiAJCX0KIAkJcmV0dXJuOwogCX0KLQlzcGluX3VubG9ja19pcnEoJmh3Z3JvdXAtPmxvY2spOworCXNwaW5fdW5sb2NrX2lycSgmaHdpZi0+bG9jayk7CiAKIAlycSA9IGJsa19nZXRfcmVxdWVzdChxLCBSRUFELCBfX0dGUF9XQUlUKTsKIAlycS0+Y21kWzBdID0gUkVRX1BBUktfSEVBRFM7CkBAIC02NCwyMSArNjQsMjEgQEAKIAkJICAgICAgY2hhciAqYnVmKQogewogCWlkZV9kcml2ZV90ICpkcml2ZSA9IHRvX2lkZV9kZXZpY2UoZGV2KTsKLQlpZGVfaHdncm91cF90ICpod2dyb3VwID0gZHJpdmUtPmh3aWYtPmh3Z3JvdXA7CisJaWRlX2h3aWZfdCAqaHdpZiA9IGRyaXZlLT5od2lmOwogCXVuc2lnbmVkIGxvbmcgbm93OwogCXVuc2lnbmVkIGludCBtc2VjczsKIAogCWlmIChkcml2ZS0+ZGV2X2ZsYWdzICYgSURFX0RGTEFHX05PX1VOTE9BRCkKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCi0Jc3Bpbl9sb2NrX2lycSgmaHdncm91cC0+bG9jayk7CisJc3Bpbl9sb2NrX2lycSgmaHdpZi0+bG9jayk7CiAJbm93ID0gamlmZmllczsKIAlpZiAoZHJpdmUtPmRldl9mbGFncyAmIElERV9ERkxBR19QQVJLRUQgJiYKIAkgICAgdGltZV9hZnRlcihkcml2ZS0+c2xlZXAsIG5vdykpCiAJCW1zZWNzID0gamlmZmllc190b19tc2Vjcyhkcml2ZS0+c2xlZXAgLSBub3cpOwogCWVsc2UKIAkJbXNlY3MgPSAwOwotCXNwaW5fdW5sb2NrX2lycSgmaHdncm91cC0+bG9jayk7CisJc3Bpbl91bmxvY2tfaXJxKCZod2lmLT5sb2NrKTsKIAogCXJldHVybiBzbnByaW50ZihidWYsIDIwLCAiJXVcbiIsIG1zZWNzKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2lkZS1wbS5jIGIvZHJpdmVycy9pZGUvaWRlLXBtLmMKaW5kZXggODI4MmM2MC4uNGIzYmY2YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvaWRlLXBtLmMKKysrIGIvZHJpdmVycy9pZGUvaWRlLXBtLmMKQEAgLTUsNyArNSw3IEBACiBpbnQgZ2VuZXJpY19pZGVfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHBtX21lc3NhZ2VfdCBtZXNnKQogewogCWlkZV9kcml2ZV90ICpkcml2ZSA9IGRldi0+ZHJpdmVyX2RhdGEsICpwYWlyID0gaWRlX2dldF9wYWlyX2Rldihkcml2ZSk7Ci0JaWRlX2h3aWZfdCAqaHdpZiA9IEhXSUYoZHJpdmUpOworCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKIAlzdHJ1Y3QgcmVxdWVzdCAqcnE7CiAJc3RydWN0IHJlcXVlc3RfcG1fc3RhdGUgcnFwbTsKIAlpZGVfdGFza190IGFyZ3M7CkBAIC0zOSw3ICszOSw3IEBACiBpbnQgZ2VuZXJpY19pZGVfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlpZGVfZHJpdmVfdCAqZHJpdmUgPSBkZXYtPmRyaXZlcl9kYXRhLCAqcGFpciA9IGlkZV9nZXRfcGFpcl9kZXYoZHJpdmUpOwotCWlkZV9od2lmX3QgKmh3aWYgPSBIV0lGKGRyaXZlKTsKKwlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7CiAJc3RydWN0IHJlcXVlc3QgKnJxOwogCXN0cnVjdCByZXF1ZXN0X3BtX3N0YXRlIHJxcG07CiAJaWRlX3Rhc2tfdCBhcmdzOwpAQCAtNjcsNyArNjcsNyBAQAogCWJsa19wdXRfcmVxdWVzdChycSk7CiAKIAlpZiAoZXJyID09IDAgJiYgZGV2LT5kcml2ZXIpIHsKLQkJaWRlX2RyaXZlcl90ICpkcnYgPSB0b19pZGVfZHJpdmVyKGRldi0+ZHJpdmVyKTsKKwkJc3RydWN0IGlkZV9kcml2ZXIgKmRydiA9IHRvX2lkZV9kcml2ZXIoZGV2LT5kcml2ZXIpOwogCiAJCWlmIChkcnYtPnJlc3VtZSkKIAkJCWRydi0+cmVzdW1lKGRyaXZlKTsKQEAgLTE5NCw3ICsxOTQsNyBAQAogCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKHEtPnF1ZXVlX2xvY2ssIGZsYWdzKTsKIAotCWRyaXZlLT5od2lmLT5od2dyb3VwLT5ycSA9IE5VTEw7CisJZHJpdmUtPmh3aWYtPnJxID0gTlVMTDsKIAogCWlmIChibGtfZW5kX3JlcXVlc3QocnEsIDAsIDApKQogCQlCVUcoKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2lkZS1wcm9iZS5jIGIvZHJpdmVycy9pZGUvaWRlLXByb2JlLmMKaW5kZXggYzVhZGI3Yi4uMGNjYmI0NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvaWRlLXByb2JlLmMKKysrIGIvZHJpdmVycy9pZGUvaWRlLXByb2JlLmMKQEAgLTE4OSw3ICsxODksNyBAQAogCiBzdGF0aWMgdm9pZCBkb19pZGVudGlmeShpZGVfZHJpdmVfdCAqZHJpdmUsIHU4IGNtZCkKIHsKLQlpZGVfaHdpZl90ICpod2lmID0gSFdJRihkcml2ZSk7CisJaWRlX2h3aWZfdCAqaHdpZiA9IGRyaXZlLT5od2lmOwogCXUxNiAqaWQgPSBkcml2ZS0+aWQ7CiAJY2hhciAqbSA9IChjaGFyICopJmlkW0FUQV9JRF9QUk9EXTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwpAQCAtMjY2LDcgKzI2Niw3IEBACiAKIHN0YXRpYyBpbnQgYWN0dWFsX3RyeV90b19pZGVudGlmeSAoaWRlX2RyaXZlX3QgKmRyaXZlLCB1OCBjbWQpCiB7Ci0JaWRlX2h3aWZfdCAqaHdpZiA9IEhXSUYoZHJpdmUpOworCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKIAlzdHJ1Y3QgaWRlX2lvX3BvcnRzICppb19wb3J0cyA9ICZod2lmLT5pb19wb3J0czsKIAljb25zdCBzdHJ1Y3QgaWRlX3RwX29wcyAqdHBfb3BzID0gaHdpZi0+dHBfb3BzOwogCWludCB1c2VfYWx0c3RhdHVzID0gMCwgcmM7CkBAIC0zNDEsNyArMzQxLDcgQEAKICAKIHN0YXRpYyBpbnQgdHJ5X3RvX2lkZW50aWZ5IChpZGVfZHJpdmVfdCAqZHJpdmUsIHU4IGNtZCkKIHsKLQlpZGVfaHdpZl90ICpod2lmID0gSFdJRihkcml2ZSk7CisJaWRlX2h3aWZfdCAqaHdpZiA9IGRyaXZlLT5od2lmOwogCWNvbnN0IHN0cnVjdCBpZGVfdHBfb3BzICp0cF9vcHMgPSBod2lmLT50cF9vcHM7CiAJaW50IHJldHZhbDsKIAlpbnQgYXV0b3Byb2JlID0gMDsKQEAgLTQzOCw3ICs0MzgsNyBAQAogCiBzdGF0aWMgaW50IGRvX3Byb2JlIChpZGVfZHJpdmVfdCAqZHJpdmUsIHU4IGNtZCkKIHsKLQlpZGVfaHdpZl90ICpod2lmID0gSFdJRihkcml2ZSk7CisJaWRlX2h3aWZfdCAqaHdpZiA9IGRyaXZlLT5od2lmOwogCWNvbnN0IHN0cnVjdCBpZGVfdHBfb3BzICp0cF9vcHMgPSBod2lmLT50cF9vcHM7CiAJaW50IHJjOwogCXU4IHByZXNlbnQgPSAhIShkcml2ZS0+ZGV2X2ZsYWdzICYgSURFX0RGTEFHX1BSRVNFTlQpLCBzdGF0OwpAQCAtNDYzLDcgKzQ2Myw3IEBACiAJaWYgKGlkZV9yZWFkX2RldmljZShkcml2ZSkgIT0gZHJpdmUtPnNlbGVjdCAmJiBwcmVzZW50ID09IDApIHsKIAkJaWYgKGRyaXZlLT5kbiAmIDEpIHsKIAkJCS8qIGV4aXQgd2l0aCBkcml2ZTAgc2VsZWN0ZWQgKi8KLQkJCVNFTEVDVF9EUklWRSgmaHdpZi0+ZHJpdmVzWzBdKTsKKwkJCVNFTEVDVF9EUklWRShod2lmLT5kZXZpY2VzWzBdKTsKIAkJCS8qIGFsbG93IEFUQV9CVVNZIHRvIGFzc2VydCAmIGNsZWFyICovCiAJCQltc2xlZXAoNTApOwogCQl9CkBAIC01MDksNyArNTA5LDcgQEAKIAl9CiAJaWYgKGRyaXZlLT5kbiAmIDEpIHsKIAkJLyogZXhpdCB3aXRoIGRyaXZlMCBzZWxlY3RlZCAqLwotCQlTRUxFQ1RfRFJJVkUoJmh3aWYtPmRyaXZlc1swXSk7CisJCVNFTEVDVF9EUklWRShod2lmLT5kZXZpY2VzWzBdKTsKIAkJbXNsZWVwKDUwKTsKIAkJLyogZW5zdXJlIGRyaXZlIGlycSBpcyBjbGVhciAqLwogCQkodm9pZCl0cF9vcHMtPnJlYWRfc3RhdHVzKGh3aWYpOwpAQCAtNTIyLDcgKzUyMiw3IEBACiAgKi8KIHN0YXRpYyB2b2lkIGVuYWJsZV9uZXN0IChpZGVfZHJpdmVfdCAqZHJpdmUpCiB7Ci0JaWRlX2h3aWZfdCAqaHdpZiA9IEhXSUYoZHJpdmUpOworCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKIAljb25zdCBzdHJ1Y3QgaWRlX3RwX29wcyAqdHBfb3BzID0gaHdpZi0+dHBfb3BzOwogCXU4IHN0YXQ7CiAKQEAgLTY5Nyw3ICs2OTcsOCBAQAogCiBzdGF0aWMgaW50IGlkZV9wb3J0X3dhaXRfcmVhZHkoaWRlX2h3aWZfdCAqaHdpZikKIHsKLQlpbnQgdW5pdCwgcmM7CisJaWRlX2RyaXZlX3QgKmRyaXZlOworCWludCBpLCByYzsKIAogCXByaW50ayhLRVJOX0RFQlVHICJQcm9iaW5nIElERSBpbnRlcmZhY2UgJXMuLi5cbiIsIGh3aWYtPm5hbWUpOwogCkBAIC03MTQsOSArNzE1LDcgQEAKIAkJcmV0dXJuIHJjOwogCiAJLyogTm93IG1ha2Ugc3VyZSBib3RoIG1hc3RlciAmIHNsYXZlIGFyZSByZWFkeSAqLwotCWZvciAodW5pdCA9IDA7IHVuaXQgPCBNQVhfRFJJVkVTOyB1bml0KyspIHsKLQkJaWRlX2RyaXZlX3QgKmRyaXZlID0gJmh3aWYtPmRyaXZlc1t1bml0XTsKLQorCWlkZV9wb3J0X2Zvcl9lYWNoX2RldihpLCBkcml2ZSwgaHdpZikgewogCQkvKiBJZ25vcmUgZGlza3MgdGhhdCB3ZSB3aWxsIG5vdCBwcm9iZSBmb3IgbGF0ZXIuICovCiAJCWlmICgoZHJpdmUtPmRldl9mbGFncyAmIElERV9ERkxBR19OT1BST0JFKSA9PSAwIHx8CiAJCSAgICAoZHJpdmUtPmRldl9mbGFncyAmIElERV9ERkxBR19QUkVTRU5UKSkgewpAQCAtNzMyLDggKzczMSw4IEBACiAJfQogb3V0OgogCS8qIEV4aXQgZnVuY3Rpb24gd2l0aCBtYXN0ZXIgcmVzZWxlY3RlZCAobGV0J3MgYmUgc2FuZSkgKi8KLQlpZiAodW5pdCkKLQkJU0VMRUNUX0RSSVZFKCZod2lmLT5kcml2ZXNbMF0pOworCWlmIChpKQorCQlTRUxFQ1RfRFJJVkUoaHdpZi0+ZGV2aWNlc1swXSk7CiAKIAlyZXR1cm4gcmM7CiB9CkBAIC03NDksNyArNzQ4LDcgQEAKIAogdm9pZCBpZGVfdW5kZWNvZGVkX3NsYXZlKGlkZV9kcml2ZV90ICpkZXYxKQogewotCWlkZV9kcml2ZV90ICpkZXYwID0gJmRldjEtPmh3aWYtPmRyaXZlc1swXTsKKwlpZGVfZHJpdmVfdCAqZGV2MCA9IGRldjEtPmh3aWYtPmRldmljZXNbMF07CiAKIAlpZiAoKGRldjEtPmRuICYgMSkgPT0gMCB8fCAoZGV2MC0+ZGV2X2ZsYWdzICYgSURFX0RGTEFHX1BSRVNFTlQpID09IDApCiAJCXJldHVybjsKQEAgLTc3OCwxNCArNzc3LDE1IEBACiAKIHN0YXRpYyBpbnQgaWRlX3Byb2JlX3BvcnQoaWRlX2h3aWZfdCAqaHdpZikKIHsKKwlpZGVfZHJpdmVfdCAqZHJpdmU7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1bnNpZ25lZCBpbnQgaXJxZDsKLQlpbnQgdW5pdCwgcmMgPSAtRU5PREVWOworCWludCBpLCByYyA9IC1FTk9ERVY7CiAKIAlCVUdfT04oaHdpZi0+cHJlc2VudCk7CiAKLQlpZiAoKGh3aWYtPmRyaXZlc1swXS5kZXZfZmxhZ3MgJiBJREVfREZMQUdfTk9QUk9CRSkgJiYKLQkgICAgKGh3aWYtPmRyaXZlc1sxXS5kZXZfZmxhZ3MgJiBJREVfREZMQUdfTk9QUk9CRSkpCisJaWYgKChod2lmLT5kZXZpY2VzWzBdLT5kZXZfZmxhZ3MgJiBJREVfREZMQUdfTk9QUk9CRSkgJiYKKwkgICAgKGh3aWYtPmRldmljZXNbMV0tPmRldl9mbGFncyAmIElERV9ERkxBR19OT1BST0JFKSkKIAkJcmV0dXJuIC1FQUNDRVM7CiAKIAkvKgpAQCAtNzk2LDcgKzc5Niw4IEBACiAJaWYgKGlycWQpCiAJCWRpc2FibGVfaXJxKGh3aWYtPmlycSk7CiAKLQlsb2NhbF9pcnFfc2V0KGZsYWdzKTsKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJbG9jYWxfaXJxX2VuYWJsZV9pbl9oYXJkaXJxKCk7CiAKIAlpZiAoaWRlX3BvcnRfd2FpdF9yZWFkeShod2lmKSA9PSAtRUJVU1kpCiAJCXByaW50ayhLRVJOX0RFQlVHICIlczogV2FpdCBmb3IgcmVhZHkgZmFpbGVkIGJlZm9yZSBwcm9iZSAhXG4iLCBod2lmLT5uYW1lKTsKQEAgLTgwNSw5ICs4MDYsNyBAQAogCSAqIFNlY29uZCBkcml2ZSBzaG91bGQgb25seSBleGlzdCBpZiBmaXJzdCBkcml2ZSB3YXMgZm91bmQsCiAJICogYnV0IGEgbG90IG9mIGNkcm9tIGRyaXZlcyBhcmUgY29uZmlndXJlZCBhcyBzaW5nbGUgc2xhdmVzLgogCSAqLwotCWZvciAodW5pdCA9IDA7IHVuaXQgPCBNQVhfRFJJVkVTOyArK3VuaXQpIHsKLQkJaWRlX2RyaXZlX3QgKmRyaXZlID0gJmh3aWYtPmRyaXZlc1t1bml0XTsKLQorCWlkZV9wb3J0X2Zvcl9lYWNoX2RldihpLCBkcml2ZSwgaHdpZikgewogCQkodm9pZCkgcHJvYmVfZm9yX2RyaXZlKGRyaXZlKTsKIAkJaWYgKGRyaXZlLT5kZXZfZmxhZ3MgJiBJREVfREZMQUdfUFJFU0VOVCkKIAkJCXJjID0gMDsKQEAgLTgyOCwyMCArODI3LDE3IEBACiBzdGF0aWMgdm9pZCBpZGVfcG9ydF90dW5lX2RldmljZXMoaWRlX2h3aWZfdCAqaHdpZikKIHsKIAljb25zdCBzdHJ1Y3QgaWRlX3BvcnRfb3BzICpwb3J0X29wcyA9IGh3aWYtPnBvcnRfb3BzOwotCWludCB1bml0OworCWlkZV9kcml2ZV90ICpkcml2ZTsKKwlpbnQgaTsKIAotCWZvciAodW5pdCA9IDA7IHVuaXQgPCBNQVhfRFJJVkVTOyB1bml0KyspIHsKLQkJaWRlX2RyaXZlX3QgKmRyaXZlID0gJmh3aWYtPmRyaXZlc1t1bml0XTsKLQorCWlkZV9wb3J0X2Zvcl9lYWNoX2RldihpLCBkcml2ZSwgaHdpZikgewogCQlpZiAoZHJpdmUtPmRldl9mbGFncyAmIElERV9ERkxBR19QUkVTRU5UKSB7CiAJCQlpZiAocG9ydF9vcHMgJiYgcG9ydF9vcHMtPnF1aXJrcHJvYykKIAkJCQlwb3J0X29wcy0+cXVpcmtwcm9jKGRyaXZlKTsKIAkJfQogCX0KIAotCWZvciAodW5pdCA9IDA7IHVuaXQgPCBNQVhfRFJJVkVTOyArK3VuaXQpIHsKLQkJaWRlX2RyaXZlX3QgKmRyaXZlID0gJmh3aWYtPmRyaXZlc1t1bml0XTsKLQorCWlkZV9wb3J0X2Zvcl9lYWNoX2RldihpLCBkcml2ZSwgaHdpZikgewogCQlpZiAoZHJpdmUtPmRldl9mbGFncyAmIElERV9ERkxBR19QUkVTRU5UKSB7CiAJCQlpZGVfc2V0X21heF9waW8oZHJpdmUpOwogCkBAIC04NTIsMTEgKzg0OCw4IEBACiAJCX0KIAl9CiAKLQlmb3IgKHVuaXQgPSAwOyB1bml0IDwgTUFYX0RSSVZFUzsgKyt1bml0KSB7Ci0JCWlkZV9kcml2ZV90ICpkcml2ZSA9ICZod2lmLT5kcml2ZXNbdW5pdF07Ci0KLQkJaWYgKChod2lmLT5ob3N0X2ZsYWdzICYgSURFX0hGTEFHX05PX0lPXzMyQklUKSB8fAotCQkgICAgZHJpdmUtPmlkW0FUQV9JRF9EV09SRF9JT10pCisJaWRlX3BvcnRfZm9yX2VhY2hfZGV2KGksIGRyaXZlLCBod2lmKSB7CisJCWlmIChod2lmLT5ob3N0X2ZsYWdzICYgSURFX0hGTEFHX05PX0lPXzMyQklUKQogCQkJZHJpdmUtPmRldl9mbGFncyB8PSBJREVfREZMQUdfTk9fSU9fMzJCSVQ7CiAJCWVsc2UKIAkJCWRyaXZlLT5kZXZfZmxhZ3MgJj0gfklERV9ERkxBR19OT19JT18zMkJJVDsKQEAgLTg2OSw3ICs4NjIsNyBAQAogc3RhdGljIGludCBpZGVfaW5pdF9xdWV1ZShpZGVfZHJpdmVfdCAqZHJpdmUpCiB7CiAJc3RydWN0IHJlcXVlc3RfcXVldWUgKnE7Ci0JaWRlX2h3aWZfdCAqaHdpZiA9IEhXSUYoZHJpdmUpOworCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKIAlpbnQgbWF4X3NlY3RvcnMgPSAyNTY7CiAJaW50IG1heF9zZ19lbnRyaWVzID0gUFJEX0VOVFJJRVM7CiAKQEAgLTkxOCwzNiArOTExLDE5IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIGlkZV9hZGRfZHJpdmVfdG9faHdncm91cChpZGVfZHJpdmVfdCAqZHJpdmUpCi17Ci0JaWRlX2h3Z3JvdXBfdCAqaHdncm91cCA9IGRyaXZlLT5od2lmLT5od2dyb3VwOwotCi0Jc3Bpbl9sb2NrX2lycSgmaHdncm91cC0+bG9jayk7Ci0JaWYgKCFod2dyb3VwLT5kcml2ZSkgewotCQkvKiBmaXJzdCBkcml2ZSBmb3IgaHdncm91cC4gKi8KLQkJZHJpdmUtPm5leHQgPSBkcml2ZTsKLQkJaHdncm91cC0+ZHJpdmUgPSBkcml2ZTsKLQkJaHdncm91cC0+aHdpZiA9IEhXSUYoaHdncm91cC0+ZHJpdmUpOwotCX0gZWxzZSB7Ci0JCWRyaXZlLT5uZXh0ID0gaHdncm91cC0+ZHJpdmUtPm5leHQ7Ci0JCWh3Z3JvdXAtPmRyaXZlLT5uZXh0ID0gZHJpdmU7Ci0JfQotCXNwaW5fdW5sb2NrX2lycSgmaHdncm91cC0+bG9jayk7Ci19CitzdGF0aWMgREVGSU5FX01VVEVYKGlkZV9jZmdfbXR4KTsKIAogLyoKICAqIEZvciBhbnkgcHJlc2VudCBkcml2ZToKICAqIC0gYWxsb2NhdGUgdGhlIGJsb2NrIGRldmljZSBxdWV1ZQotICogLSBsaW5rIGRyaXZlIGludG8gdGhlIGh3Z3JvdXAKICAqLwogc3RhdGljIGludCBpZGVfcG9ydF9zZXR1cF9kZXZpY2VzKGlkZV9od2lmX3QgKmh3aWYpCiB7CisJaWRlX2RyaXZlX3QgKmRyaXZlOwogCWludCBpLCBqID0gMDsKIAogCW11dGV4X2xvY2soJmlkZV9jZmdfbXR4KTsKLQlmb3IgKGkgPSAwOyBpIDwgTUFYX0RSSVZFUzsgaSsrKSB7Ci0JCWlkZV9kcml2ZV90ICpkcml2ZSA9ICZod2lmLT5kcml2ZXNbaV07Ci0KKwlpZGVfcG9ydF9mb3JfZWFjaF9kZXYoaSwgZHJpdmUsIGh3aWYpIHsKIAkJaWYgKChkcml2ZS0+ZGV2X2ZsYWdzICYgSURFX0RGTEFHX1BSRVNFTlQpID09IDApCiAJCQljb250aW51ZTsKIApAQCAtOTYxLDEzOSArOTM3LDM5IEBACiAJCX0KIAogCQlqKys7Ci0KLQkJaWRlX2FkZF9kcml2ZV90b19od2dyb3VwKGRyaXZlKTsKIAl9CiAJbXV0ZXhfdW5sb2NrKCZpZGVfY2ZnX210eCk7CiAKIAlyZXR1cm4gajsKIH0KIAotc3RhdGljIGlkZV9od2lmX3QgKmlkZV9wb3J0c1tNQVhfSFdJRlNdOwotCi12b2lkIGlkZV9yZW1vdmVfcG9ydF9mcm9tX2h3Z3JvdXAoaWRlX2h3aWZfdCAqaHdpZikKLXsKLQlpZGVfaHdncm91cF90ICpod2dyb3VwID0gaHdpZi0+aHdncm91cDsKLQotCWlkZV9wb3J0c1tod2lmLT5pbmRleF0gPSBOVUxMOwotCi0Jc3Bpbl9sb2NrX2lycSgmaHdncm91cC0+bG9jayk7Ci0JLyoKLQkgKiBSZW1vdmUgdXMgZnJvbSB0aGUgaHdncm91cCwgYW5kIGZyZWUKLQkgKiB0aGUgaHdncm91cCBpZiB3ZSB3ZXJlIHRoZSBvbmx5IG1lbWJlcgotCSAqLwotCWlmIChod2lmLT5uZXh0ID09IGh3aWYpIHsKLQkJQlVHX09OKGh3Z3JvdXAtPmh3aWYgIT0gaHdpZik7Ci0JCWtmcmVlKGh3Z3JvdXApOwotCX0gZWxzZSB7Ci0JCS8qIFRoZXJlIGlzIGFub3RoZXIgaW50ZXJmYWNlIGluIGh3Z3JvdXAuCi0JCSAqIFVubGluayB1cywgYW5kIHNldCBod2dyb3VwLT5kcml2ZSBhbmQgLT5od2lmIHRvCi0JCSAqIHNvbWV0aGluZyBzYW5lLgotCQkgKi8KLQkJaWRlX2h3aWZfdCAqZyA9IGh3Z3JvdXAtPmh3aWY7Ci0KLQkJd2hpbGUgKGctPm5leHQgIT0gaHdpZikKLQkJCWcgPSBnLT5uZXh0OwotCQlnLT5uZXh0ID0gaHdpZi0+bmV4dDsKLQkJaWYgKGh3Z3JvdXAtPmh3aWYgPT0gaHdpZikgewotCQkJLyogQ2hvc2UgYSByYW5kb20gaHdpZiBmb3IgaHdncm91cC0+aHdpZi4KLQkJCSAqIEl0J3MgZ3VhcmFudGVlZCB0aGF0IHRoZXJlIGFyZSBubyBkcml2ZXMKLQkJCSAqIGxlZnQgaW4gdGhlIGh3Z3JvdXAuCi0JCQkgKi8KLQkJCUJVR19PTihod2dyb3VwLT5kcml2ZSAhPSBOVUxMKTsKLQkJCWh3Z3JvdXAtPmh3aWYgPSBnOwotCQl9Ci0JCUJVR19PTihod2dyb3VwLT5od2lmID09IGh3aWYpOwotCX0KLQlzcGluX3VubG9ja19pcnEoJmh3Z3JvdXAtPmxvY2spOwotfQotCiAvKgotICogVGhpcyByb3V0aW5lIHNldHMgdXAgdGhlIGlycSBmb3IgYW4gaWRlIGludGVyZmFjZSwgYW5kIGNyZWF0ZXMgYSBuZXcKLSAqIGh3Z3JvdXAgZm9yIHRoZSBpcnEvaHdpZiBpZiBub25lIHdhcyBwcmV2aW91c2x5IGFzc2lnbmVkLgotICoKLSAqIE11Y2ggb2YgdGhlIGNvZGUgaXMgZm9yIGNvcnJlY3RseSBkZXRlY3RpbmcvaGFuZGxpbmcgaXJxIHNoYXJpbmcKLSAqIGFuZCBpcnEgc2VyaWFsaXphdGlvbiBzaXR1YXRpb25zLiAgVGhpcyBpcyBzb21ld2hhdCBjb21wbGV4IGJlY2F1c2UKLSAqIGl0IGhhbmRsZXMgc3RhdGljIGFzIHdlbGwgYXMgZHluYW1pYyAoUENNQ0lBKSBJREUgaW50ZXJmYWNlcy4KKyAqIFRoaXMgcm91dGluZSBzZXRzIHVwIHRoZSBJUlEgZm9yIGFuIElERSBpbnRlcmZhY2UuCiAgKi8KIHN0YXRpYyBpbnQgaW5pdF9pcnEgKGlkZV9od2lmX3QgKmh3aWYpCiB7CiAJc3RydWN0IGlkZV9pb19wb3J0cyAqaW9fcG9ydHMgPSAmaHdpZi0+aW9fcG9ydHM7Ci0JdW5zaWduZWQgaW50IGluZGV4OwotCWlkZV9od2dyb3VwX3QgKmh3Z3JvdXA7Ci0JaWRlX2h3aWZfdCAqbWF0Y2ggPSBOVUxMOworCWludCBzYSA9IDA7CiAKIAltdXRleF9sb2NrKCZpZGVfY2ZnX210eCk7Ci0JaHdpZi0+aHdncm91cCA9IE5VTEw7CisJc3Bpbl9sb2NrX2luaXQoJmh3aWYtPmxvY2spOwogCi0JZm9yIChpbmRleCA9IDA7IGluZGV4IDwgTUFYX0hXSUZTOyBpbmRleCsrKSB7Ci0JCWlkZV9od2lmX3QgKmggPSBpZGVfcG9ydHNbaW5kZXhdOworCWluaXRfdGltZXIoJmh3aWYtPnRpbWVyKTsKKwlod2lmLT50aW1lci5mdW5jdGlvbiA9ICZpZGVfdGltZXJfZXhwaXJ5OworCWh3aWYtPnRpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZylod2lmOwogCi0JCWlmIChoICYmIGgtPmh3Z3JvdXApIHsgIC8qIHNjYW4gb25seSBpbml0aWFsaXplZCBwb3J0cyAqLwotCQkJaWYgKGh3aWYtPmhvc3QtPmhvc3RfZmxhZ3MgJiBJREVfSEZMQUdfU0VSSUFMSVpFKSB7Ci0JCQkJaWYgKGh3aWYtPmhvc3QgPT0gaC0+aG9zdCkKLQkJCQkJbWF0Y2ggPSBoOwotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiBJZiB3ZSBhcmUgc3RpbGwgd2l0aG91dCBhIGh3Z3JvdXAsIHRoZW4gZm9ybSBhIG5ldyBvbmUKLQkgKi8KLQlpZiAobWF0Y2gpIHsKLQkJaHdncm91cCA9IG1hdGNoLT5od2dyb3VwOwotCQlod2lmLT5od2dyb3VwID0gaHdncm91cDsKLQkJLyoKLQkJICogTGluayB1cyBpbnRvIHRoZSBod2dyb3VwLgotCQkgKiBUaGlzIG11c3QgYmUgZG9uZSBlYXJseSwgZG8gZW5zdXJlIHRoYXQgdW5leHBlY3RlZF9pbnRyCi0JCSAqIGNhbiBmaW5kIHRoZSBod2lmIGFuZCBwcmV2ZW50IGlycSBzdG9ybXMuCi0JCSAqIE5vIGRyaXZlcyBhcmUgYXR0YWNoZWQgdG8gdGhlIG5ldyBod2lmLCBjaG9vc2VfZHJpdmUKLQkJICogY2FuJ3QgZG8gYW55dGhpbmcgc3R1cGlkICh5ZXQpLgotCQkgKiBBZGQgb3Vyc2VsZiBhcyB0aGUgMm5kIGVudHJ5IHRvIHRoZSBod2dyb3VwLT5od2lmCi0JCSAqIGxpbmtlZCBsaXN0LCB0aGUgZmlyc3QgZW50cnkgaXMgdGhlIGh3aWYgdGhhdCBvd25zCi0JCSAqIGh3Z3JvdXAtPmhhbmRsZXIgLSBkbyBub3QgY2hhbmdlIHRoYXQuCi0JCSAqLwotCQlzcGluX2xvY2tfaXJxKCZod2dyb3VwLT5sb2NrKTsKLQkJaHdpZi0+bmV4dCA9IGh3Z3JvdXAtPmh3aWYtPm5leHQ7Ci0JCWh3Z3JvdXAtPmh3aWYtPm5leHQgPSBod2lmOwotCQlCVUdfT04oaHdpZi0+bmV4dCA9PSBod2lmKTsKLQkJc3Bpbl91bmxvY2tfaXJxKCZod2dyb3VwLT5sb2NrKTsKLQl9IGVsc2UgewotCQlod2dyb3VwID0ga21hbGxvY19ub2RlKHNpemVvZigqaHdncm91cCksIEdGUF9LRVJORUx8X19HRlBfWkVSTywKLQkJCQkgICAgICAgaHdpZl90b19ub2RlKGh3aWYpKTsKLQkJaWYgKGh3Z3JvdXAgPT0gTlVMTCkKLQkJCWdvdG8gb3V0X3VwOwotCi0JCXNwaW5fbG9ja19pbml0KCZod2dyb3VwLT5sb2NrKTsKLQotCQlod2lmLT5od2dyb3VwID0gaHdncm91cDsKLQkJaHdncm91cC0+aHdpZiA9IGh3aWYtPm5leHQgPSBod2lmOwotCi0JCWluaXRfdGltZXIoJmh3Z3JvdXAtPnRpbWVyKTsKLQkJaHdncm91cC0+dGltZXIuZnVuY3Rpb24gPSAmaWRlX3RpbWVyX2V4cGlyeTsKLQkJaHdncm91cC0+dGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBod2dyb3VwOwotCX0KLQotCWlkZV9wb3J0c1tod2lmLT5pbmRleF0gPSBod2lmOwotCi0JLyoKLQkgKiBBbGxvY2F0ZSB0aGUgaXJxLCBpZiBub3QgYWxyZWFkeSBvYnRhaW5lZCBmb3IgYW5vdGhlciBod2lmCi0JICovCi0JaWYgKCFtYXRjaCB8fCBtYXRjaC0+aXJxICE9IGh3aWYtPmlycSkgewotCQlpbnQgc2EgPSAwOwogI2lmIGRlZmluZWQoX19tYzY4MDAwX18pCi0JCXNhID0gSVJRRl9TSEFSRUQ7CisJc2EgPSBJUlFGX1NIQVJFRDsKICNlbmRpZiAvKiBfX21jNjgwMDBfXyAqLwogCi0JCWlmIChod2lmLT5jaGlwc2V0ID09IGlkZV9wY2kpCi0JCQlzYSA9IElSUUZfU0hBUkVEOworCWlmIChod2lmLT5jaGlwc2V0ID09IGlkZV9wY2kpCisJCXNhID0gSVJRRl9TSEFSRUQ7CiAKLQkJaWYgKGlvX3BvcnRzLT5jdGxfYWRkcikKLQkJCWh3aWYtPnRwX29wcy0+c2V0X2lycShod2lmLCAxKTsKKwlpZiAoaW9fcG9ydHMtPmN0bF9hZGRyKQorCQlod2lmLT50cF9vcHMtPnNldF9pcnEoaHdpZiwgMSk7CiAKLQkJaWYgKHJlcXVlc3RfaXJxKGh3aWYtPmlycSwmaWRlX2ludHIsc2EsaHdpZi0+bmFtZSxod2dyb3VwKSkKLQkgICAgICAgCQlnb3RvIG91dF91bmxpbms7Ci0JfQorCWlmIChyZXF1ZXN0X2lycShod2lmLT5pcnEsICZpZGVfaW50ciwgc2EsIGh3aWYtPm5hbWUsIGh3aWYpKQorCQlnb3RvIG91dF91cDsKIAogCWlmICghaHdpZi0+cnFzaXplKSB7CiAJCWlmICgoaHdpZi0+aG9zdF9mbGFncyAmIElERV9IRkxBR19OT19MQkE0OCkgfHwKQEAgLTExMTEsMTQgKzk4NywxMiBAQAogCXByaW50ayhLRVJOX0lORk8gIiVzIGF0IDB4JTA4bHggb24gaXJxICVkIiwgaHdpZi0+bmFtZSwKIAkJaW9fcG9ydHMtPmRhdGFfYWRkciwgaHdpZi0+aXJxKTsKICNlbmRpZiAvKiBfX21jNjgwMDBfXyAqLwotCWlmIChtYXRjaCkKLQkJcHJpbnRrKEtFUk5fQ09OVCAiIChzZXJpYWxpemVkIHdpdGggJXMpIiwgbWF0Y2gtPm5hbWUpOworCWlmIChod2lmLT5ob3N0LT5ob3N0X2ZsYWdzICYgSURFX0hGTEFHX1NFUklBTElaRSkKKwkJcHJpbnRrKEtFUk5fQ09OVCAiIChzZXJpYWxpemVkKSIpOwogCXByaW50ayhLRVJOX0NPTlQgIlxuIik7CiAKIAltdXRleF91bmxvY2soJmlkZV9jZmdfbXR4KTsKIAlyZXR1cm4gMDsKLW91dF91bmxpbms6Ci0JaWRlX3JlbW92ZV9wb3J0X2Zyb21faHdncm91cChod2lmKTsKIG91dF91cDoKIAltdXRleF91bmxvY2soJmlkZV9jZmdfbXR4KTsKIAlyZXR1cm4gMTsKQEAgLTExMzQsNyArMTAwOCw3IEBACiB7CiAJaWRlX2h3aWZfdCAqaHdpZiA9IGRhdGE7CiAJaW50IHVuaXQgPSAqcGFydCA+PiBQQVJUTl9CSVRTOwotCWlkZV9kcml2ZV90ICpkcml2ZSA9ICZod2lmLT5kcml2ZXNbdW5pdF07CisJaWRlX2RyaXZlX3QgKmRyaXZlID0gaHdpZi0+ZGV2aWNlc1t1bml0XTsKIAogCWlmICgoZHJpdmUtPmRldl9mbGFncyAmIElERV9ERkxBR19QUkVTRU5UKSA9PSAwKQogCQlyZXR1cm4gTlVMTDsKQEAgLTExOTYsNDcgKzEwNzAsMjMgQEAKIAogRVhQT1JUX1NZTUJPTF9HUEwoaWRlX2luaXRfZGlzayk7CiAKLXN0YXRpYyB2b2lkIGlkZV9yZW1vdmVfZHJpdmVfZnJvbV9od2dyb3VwKGlkZV9kcml2ZV90ICpkcml2ZSkKLXsKLQlpZGVfaHdncm91cF90ICpod2dyb3VwID0gZHJpdmUtPmh3aWYtPmh3Z3JvdXA7Ci0KLQlpZiAoZHJpdmUgPT0gZHJpdmUtPm5leHQpIHsKLQkJLyogc3BlY2lhbCBjYXNlOiBsYXN0IGRyaXZlIGZyb20gaHdncm91cC4gKi8KLQkJQlVHX09OKGh3Z3JvdXAtPmRyaXZlICE9IGRyaXZlKTsKLQkJaHdncm91cC0+ZHJpdmUgPSBOVUxMOwotCX0gZWxzZSB7Ci0JCWlkZV9kcml2ZV90ICp3YWxrOwotCi0JCXdhbGsgPSBod2dyb3VwLT5kcml2ZTsKLQkJd2hpbGUgKHdhbGstPm5leHQgIT0gZHJpdmUpCi0JCQl3YWxrID0gd2Fsay0+bmV4dDsKLQkJd2Fsay0+bmV4dCA9IGRyaXZlLT5uZXh0OwotCQlpZiAoaHdncm91cC0+ZHJpdmUgPT0gZHJpdmUpIHsKLQkJCWh3Z3JvdXAtPmRyaXZlID0gZHJpdmUtPm5leHQ7Ci0JCQlod2dyb3VwLT5od2lmID0gaHdncm91cC0+ZHJpdmUtPmh3aWY7Ci0JCX0KLQl9Ci0JQlVHX09OKGh3Z3JvdXAtPmRyaXZlID09IGRyaXZlKTsKLX0KLQogc3RhdGljIHZvaWQgZHJpdmVfcmVsZWFzZV9kZXYgKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlpZGVfZHJpdmVfdCAqZHJpdmUgPSBjb250YWluZXJfb2YoZGV2LCBpZGVfZHJpdmVfdCwgZ2VuZGV2KTsKLQlpZGVfaHdncm91cF90ICpod2dyb3VwID0gZHJpdmUtPmh3aWYtPmh3Z3JvdXA7CisJaWRlX2h3aWZfdCAqaHdpZiA9IGRyaXZlLT5od2lmOwogCiAJaWRlX3Byb2NfdW5yZWdpc3Rlcl9kZXZpY2UoZHJpdmUpOwogCi0Jc3Bpbl9sb2NrX2lycSgmaHdncm91cC0+bG9jayk7Ci0JaWRlX3JlbW92ZV9kcml2ZV9mcm9tX2h3Z3JvdXAoZHJpdmUpOworCXNwaW5fbG9ja19pcnEoJmh3aWYtPmxvY2spOwogCWtmcmVlKGRyaXZlLT5pZCk7CiAJZHJpdmUtPmlkID0gTlVMTDsKIAlkcml2ZS0+ZGV2X2ZsYWdzICY9IH5JREVfREZMQUdfUFJFU0VOVDsKIAkvKiBNZXNzZWQgdXAgbG9ja2luZyAuLi4gKi8KLQlzcGluX3VubG9ja19pcnEoJmh3Z3JvdXAtPmxvY2spOworCXNwaW5fdW5sb2NrX2lycSgmaHdpZi0+bG9jayk7CiAJYmxrX2NsZWFudXBfcXVldWUoZHJpdmUtPnF1ZXVlKTsKLQlzcGluX2xvY2tfaXJxKCZod2dyb3VwLT5sb2NrKTsKKwlzcGluX2xvY2tfaXJxKCZod2lmLT5sb2NrKTsKIAlkcml2ZS0+cXVldWUgPSBOVUxMOwotCXNwaW5fdW5sb2NrX2lycSgmaHdncm91cC0+bG9jayk7CisJc3Bpbl91bmxvY2tfaXJxKCZod2lmLT5sb2NrKTsKIAogCWNvbXBsZXRlKCZkcml2ZS0+Z2VuZGV2X3JlbF9jb21wKTsKIH0KQEAgLTEzMDIsMTAgKzExNTIsMTAgQEAKIAogc3RhdGljIHZvaWQgaHdpZl9yZWdpc3Rlcl9kZXZpY2VzKGlkZV9od2lmX3QgKmh3aWYpCiB7CisJaWRlX2RyaXZlX3QgKmRyaXZlOwogCXVuc2lnbmVkIGludCBpOwogCi0JZm9yIChpID0gMDsgaSA8IE1BWF9EUklWRVM7IGkrKykgewotCQlpZGVfZHJpdmVfdCAqZHJpdmUgPSAmaHdpZi0+ZHJpdmVzW2ldOworCWlkZV9wb3J0X2Zvcl9lYWNoX2RldihpLCBkcml2ZSwgaHdpZikgewogCQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmZHJpdmUtPmdlbmRldjsKIAkJaW50IHJldDsKIApAQCAtMTMyOCwxMSArMTE3OCwxMCBAQAogc3RhdGljIHZvaWQgaWRlX3BvcnRfaW5pdF9kZXZpY2VzKGlkZV9od2lmX3QgKmh3aWYpCiB7CiAJY29uc3Qgc3RydWN0IGlkZV9wb3J0X29wcyAqcG9ydF9vcHMgPSBod2lmLT5wb3J0X29wczsKKwlpZGVfZHJpdmVfdCAqZHJpdmU7CiAJaW50IGk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgTUFYX0RSSVZFUzsgaSsrKSB7Ci0JCWlkZV9kcml2ZV90ICpkcml2ZSA9ICZod2lmLT5kcml2ZXNbaV07Ci0KKwlpZGVfcG9ydF9mb3JfZWFjaF9kZXYoaSwgZHJpdmUsIGh3aWYpIHsKIAkJZHJpdmUtPmRuID0gaSArIGh3aWYtPmNoYW5uZWwgKiAyOwogCiAJCWlmIChod2lmLT5ob3N0X2ZsYWdzICYgSURFX0hGTEFHX0lPXzMyQklUKQpAQCAtMTM4MCw2ICsxMjI5LDggQEAKIAlpZiAoKGQtPmhvc3RfZmxhZ3MgJiBJREVfSEZMQUdfTk9fRE1BKSA9PSAwKSB7CiAJCWludCByYzsKIAorCQlod2lmLT5kbWFfb3BzID0gZC0+ZG1hX29wczsKKwogCQlpZiAoZC0+aW5pdF9kbWEpCiAJCQlyYyA9IGQtPmluaXRfZG1hKGh3aWYsIGQpOwogCQllbHNlCkBAIC0xMzg3LDEyICsxMjM4LDEzIEBACiAKIAkJaWYgKHJjIDwgMCkgewogCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IERNQSBkaXNhYmxlZFxuIiwgaHdpZi0+bmFtZSk7CisKKwkJCWh3aWYtPmRtYV9vcHMgPSBOVUxMOwogCQkJaHdpZi0+ZG1hX2Jhc2UgPSAwOwogCQkJaHdpZi0+c3dkbWFfbWFzayA9IDA7CiAJCQlod2lmLT5td2RtYV9tYXNrID0gMDsKIAkJCWh3aWYtPnVsdHJhX21hc2sgPSAwOwotCQl9IGVsc2UgaWYgKGQtPmRtYV9vcHMpCi0JCQlod2lmLT5kbWFfb3BzID0gZC0+ZG1hX29wczsKKwkJfQogCX0KIAogCWlmICgoZC0+aG9zdF9mbGFncyAmIElERV9IRkxBR19TRVJJQUxJWkUpIHx8CkBAIC0xNDE3LDYgKzEyNjksNjYgQEAKIAl9CiB9CiAKK3N0YXRpYyBjb25zdCB1OCBpZGVfaHdpZl90b19tYWpvcltdID0KKwl7IElERTBfTUFKT1IsIElERTFfTUFKT1IsIElERTJfTUFKT1IsIElERTNfTUFKT1IsIElERTRfTUFKT1IsCisJICBJREU1X01BSk9SLCBJREU2X01BSk9SLCBJREU3X01BSk9SLCBJREU4X01BSk9SLCBJREU5X01BSk9SIH07CisKK3N0YXRpYyB2b2lkIGlkZV9wb3J0X2luaXRfZGV2aWNlc19kYXRhKGlkZV9od2lmX3QgKmh3aWYpCit7CisJaWRlX2RyaXZlX3QgKmRyaXZlOworCWludCBpOworCisJaWRlX3BvcnRfZm9yX2VhY2hfZGV2KGksIGRyaXZlLCBod2lmKSB7CisJCXU4IGogPSAoaHdpZi0+aW5kZXggKiBNQVhfRFJJVkVTKSArIGk7CisKKwkJbWVtc2V0KGRyaXZlLCAwLCBzaXplb2YoKmRyaXZlKSk7CisKKwkJZHJpdmUtPm1lZGlhCQkJPSBpZGVfZGlzazsKKwkJZHJpdmUtPnNlbGVjdAkJCT0gKGkgPDwgNCkgfCBBVEFfREVWSUNFX09CUzsKKwkJZHJpdmUtPmh3aWYJCQk9IGh3aWY7CisJCWRyaXZlLT5yZWFkeV9zdGF0CQk9IEFUQV9EUkRZOworCQlkcml2ZS0+YmFkX3dzdGF0CQk9IEJBRF9XX1NUQVQ7CisJCWRyaXZlLT5zcGVjaWFsLmIucmVjYWxpYnJhdGUJPSAxOworCQlkcml2ZS0+c3BlY2lhbC5iLnNldF9nZW9tZXRyeQk9IDE7CisJCWRyaXZlLT5uYW1lWzBdCQkJPSAnaCc7CisJCWRyaXZlLT5uYW1lWzFdCQkJPSAnZCc7CisJCWRyaXZlLT5uYW1lWzJdCQkJPSAnYScgKyBqOworCQlkcml2ZS0+bWF4X2ZhaWx1cmVzCQk9IElERV9ERUZBVUxUX01BWF9GQUlMVVJFUzsKKworCQlJTklUX0xJU1RfSEVBRCgmZHJpdmUtPmxpc3QpOworCQlpbml0X2NvbXBsZXRpb24oJmRyaXZlLT5nZW5kZXZfcmVsX2NvbXApOworCX0KK30KKworc3RhdGljIHZvaWQgaWRlX2luaXRfcG9ydF9kYXRhKGlkZV9od2lmX3QgKmh3aWYsIHVuc2lnbmVkIGludCBpbmRleCkKK3sKKwkvKiBmaWxsIGluIGFueSBub24temVybyBpbml0aWFsIHZhbHVlcyAqLworCWh3aWYtPmluZGV4CT0gaW5kZXg7CisJaHdpZi0+bWFqb3IJPSBpZGVfaHdpZl90b19tYWpvcltpbmRleF07CisKKwlod2lmLT5uYW1lWzBdCT0gJ2knOworCWh3aWYtPm5hbWVbMV0JPSAnZCc7CisJaHdpZi0+bmFtZVsyXQk9ICdlJzsKKwlod2lmLT5uYW1lWzNdCT0gJzAnICsgaW5kZXg7CisKKwlpbml0X2NvbXBsZXRpb24oJmh3aWYtPmdlbmRldl9yZWxfY29tcCk7CisKKwlod2lmLT50cF9vcHMgPSAmZGVmYXVsdF90cF9vcHM7CisKKwlpZGVfcG9ydF9pbml0X2RldmljZXNfZGF0YShod2lmKTsKK30KKworc3RhdGljIHZvaWQgaWRlX2luaXRfcG9ydF9odyhpZGVfaHdpZl90ICpod2lmLCBod19yZWdzX3QgKmh3KQoreworCW1lbWNweSgmaHdpZi0+aW9fcG9ydHMsICZody0+aW9fcG9ydHMsIHNpemVvZihod2lmLT5pb19wb3J0cykpOworCWh3aWYtPmlycSA9IGh3LT5pcnE7CisJaHdpZi0+Y2hpcHNldCA9IGh3LT5jaGlwc2V0OworCWh3aWYtPmRldiA9IGh3LT5kZXY7CisJaHdpZi0+Z2VuZGV2LnBhcmVudCA9IGh3LT5wYXJlbnQgPyBody0+cGFyZW50IDogaHctPmRldjsKKwlod2lmLT5hY2tfaW50ciA9IGh3LT5hY2tfaW50cjsKKwlod2lmLT5jb25maWdfZGF0YSA9IGh3LT5jb25maWc7Cit9CisKIHN0YXRpYyB1bnNpZ25lZCBpbnQgaWRlX2luZGV4ZXM7CiAKIC8qKgpAQCAtMTQ2NiwxMiArMTM3OCw0MyBAQAogCW11dGV4X3VubG9jaygmaWRlX2NmZ19tdHgpOwogfQogCitzdGF0aWMgdm9pZCBpZGVfcG9ydF9mcmVlX2RldmljZXMoaWRlX2h3aWZfdCAqaHdpZikKK3sKKwlpZGVfZHJpdmVfdCAqZHJpdmU7CisJaW50IGk7CisKKwlpZGVfcG9ydF9mb3JfZWFjaF9kZXYoaSwgZHJpdmUsIGh3aWYpCisJCWtmcmVlKGRyaXZlKTsKK30KKworc3RhdGljIGludCBpZGVfcG9ydF9hbGxvY19kZXZpY2VzKGlkZV9od2lmX3QgKmh3aWYsIGludCBub2RlKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IE1BWF9EUklWRVM7IGkrKykgeworCQlpZGVfZHJpdmVfdCAqZHJpdmU7CisKKwkJZHJpdmUgPSBremFsbG9jX25vZGUoc2l6ZW9mKCpkcml2ZSksIEdGUF9LRVJORUwsIG5vZGUpOworCQlpZiAoZHJpdmUgPT0gTlVMTCkKKwkJCWdvdG8gb3V0X25vbWVtOworCisJCWh3aWYtPmRldmljZXNbaV0gPSBkcml2ZTsKKwl9CisJcmV0dXJuIDA7CisKK291dF9ub21lbToKKwlpZGVfcG9ydF9mcmVlX2RldmljZXMoaHdpZik7CisJcmV0dXJuIC1FTk9NRU07Cit9CisKIHN0cnVjdCBpZGVfaG9zdCAqaWRlX2hvc3RfYWxsb2MoY29uc3Qgc3RydWN0IGlkZV9wb3J0X2luZm8gKmQsIGh3X3JlZ3NfdCAqKmh3cykKIHsKIAlzdHJ1Y3QgaWRlX2hvc3QgKmhvc3Q7CisJc3RydWN0IGRldmljZSAqZGV2ID0gaHdzWzBdID8gaHdzWzBdLT5kZXYgOiBOVUxMOworCWludCBub2RlID0gZGV2ID8gZGV2X3RvX25vZGUoZGV2KSA6IC0xOwogCWludCBpOwogCi0JaG9zdCA9IGt6YWxsb2Moc2l6ZW9mKCpob3N0KSwgR0ZQX0tFUk5FTCk7CisJaG9zdCA9IGt6YWxsb2Nfbm9kZShzaXplb2YoKmhvc3QpLCBHRlBfS0VSTkVMLCBub2RlKTsKIAlpZiAoaG9zdCA9PSBOVUxMKQogCQlyZXR1cm4gTlVMTDsKIApAQCAtMTQ4MiwxMCArMTQyNSwxNSBAQAogCQlpZiAoaHdzW2ldID09IE5VTEwpCiAJCQljb250aW51ZTsKIAotCQlod2lmID0ga3phbGxvYyhzaXplb2YoKmh3aWYpLCBHRlBfS0VSTkVMKTsKKwkJaHdpZiA9IGt6YWxsb2Nfbm9kZShzaXplb2YoKmh3aWYpLCBHRlBfS0VSTkVMLCBub2RlKTsKIAkJaWYgKGh3aWYgPT0gTlVMTCkKIAkJCWNvbnRpbnVlOwogCisJCWlmIChpZGVfcG9ydF9hbGxvY19kZXZpY2VzKGh3aWYsIG5vZGUpIDwgMCkgeworCQkJa2ZyZWUoaHdpZik7CisJCQljb250aW51ZTsKKwkJfQorCiAJCWlkeCA9IGlkZV9maW5kX3BvcnRfc2xvdChkKTsKIAkJaWYgKGlkeCA8IDApIHsKIAkJCXByaW50ayhLRVJOX0VSUiAiJXM6IG5vIGZyZWUgc2xvdCBmb3IgaW50ZXJmYWNlXG4iLApAQCAtMTUwNyw4ICsxNDU1LDcgQEAKIAkJcmV0dXJuIE5VTEw7CiAJfQogCi0JaWYgKGh3c1swXSkKLQkJaG9zdC0+ZGV2WzBdID0gaHdzWzBdLT5kZXY7CisJaG9zdC0+ZGV2WzBdID0gZGV2OwogCiAJaWYgKGQpIHsKIAkJaG9zdC0+aW5pdF9jaGlwc2V0ID0gZC0+aW5pdF9jaGlwc2V0OwpAQCAtMTUyNSw5ICsxNDcyLDcgQEAKIAlpZGVfaHdpZl90ICpod2lmLCAqbWF0ZSA9IE5VTEw7CiAJaW50IGksIGogPSAwOwogCi0JZm9yIChpID0gMDsgaSA8IE1BWF9IT1NUX1BPUlRTOyBpKyspIHsKLQkJaHdpZiA9IGhvc3QtPnBvcnRzW2ldOwotCisJaWRlX2hvc3RfZm9yX2VhY2hfcG9ydChpLCBod2lmLCBob3N0KSB7CiAJCWlmIChod2lmID09IE5VTEwpIHsKIAkJCW1hdGUgPSBOVUxMOwogCQkJY29udGludWU7CkBAIC0xNTUzLDkgKzE0OTgsNyBAQAogCQlpZGVfcG9ydF9pbml0X2RldmljZXMoaHdpZik7CiAJfQogCi0JZm9yIChpID0gMDsgaSA8IE1BWF9IT1NUX1BPUlRTOyBpKyspIHsKLQkJaHdpZiA9IGhvc3QtPnBvcnRzW2ldOwotCisJaWRlX2hvc3RfZm9yX2VhY2hfcG9ydChpLCBod2lmLCBob3N0KSB7CiAJCWlmIChod2lmID09IE5VTEwpCiAJCQljb250aW51ZTsKIApAQCAtMTU3MCw5ICsxNTEzLDcgQEAKIAkJCWlkZV9wb3J0X3R1bmVfZGV2aWNlcyhod2lmKTsKIAl9CiAKLQlmb3IgKGkgPSAwOyBpIDwgTUFYX0hPU1RfUE9SVFM7IGkrKykgewotCQlod2lmID0gaG9zdC0+cG9ydHNbaV07Ci0KKwlpZGVfaG9zdF9mb3JfZWFjaF9wb3J0KGksIGh3aWYsIGhvc3QpIHsKIAkJaWYgKGh3aWYgPT0gTlVMTCkKIAkJCWNvbnRpbnVlOwogCkBAIC0xNTk3LDkgKzE1MzgsNyBAQAogCQkJaWRlX2FjcGlfcG9ydF9pbml0X2RldmljZXMoaHdpZik7CiAJfQogCi0JZm9yIChpID0gMDsgaSA8IE1BWF9IT1NUX1BPUlRTOyBpKyspIHsKLQkJaHdpZiA9IGhvc3QtPnBvcnRzW2ldOwotCisJaWRlX2hvc3RfZm9yX2VhY2hfcG9ydChpLCBod2lmLCBob3N0KSB7CiAJCWlmIChod2lmID09IE5VTEwpCiAJCQljb250aW51ZTsKIApAQCAtMTYwNyw5ICsxNTQ2LDcgQEAKIAkJCWh3aWZfcmVnaXN0ZXJfZGV2aWNlcyhod2lmKTsKIAl9CiAKLQlmb3IgKGkgPSAwOyBpIDwgTUFYX0hPU1RfUE9SVFM7IGkrKykgewotCQlod2lmID0gaG9zdC0+cG9ydHNbaV07Ci0KKwlpZGVfaG9zdF9mb3JfZWFjaF9wb3J0KGksIGh3aWYsIGhvc3QpIHsKIAkJaWYgKGh3aWYgPT0gTlVMTCkKIAkJCWNvbnRpbnVlOwogCkBAIC0xNjQ3LDE3ICsxNTg0LDg1IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChpZGVfaG9zdF9hZGQpOwogCitzdGF0aWMgdm9pZCBfX2lkZV9wb3J0X3VucmVnaXN0ZXJfZGV2aWNlcyhpZGVfaHdpZl90ICpod2lmKQoreworCWlkZV9kcml2ZV90ICpkcml2ZTsKKwlpbnQgaTsKKworCWlkZV9wb3J0X2Zvcl9lYWNoX2RldihpLCBkcml2ZSwgaHdpZikgeworCQlpZiAoZHJpdmUtPmRldl9mbGFncyAmIElERV9ERkxBR19QUkVTRU5UKSB7CisJCQlkZXZpY2VfdW5yZWdpc3RlcigmZHJpdmUtPmdlbmRldik7CisJCQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZkcml2ZS0+Z2VuZGV2X3JlbF9jb21wKTsKKwkJfQorCX0KK30KKwordm9pZCBpZGVfcG9ydF91bnJlZ2lzdGVyX2RldmljZXMoaWRlX2h3aWZfdCAqaHdpZikKK3sKKwltdXRleF9sb2NrKCZpZGVfY2ZnX210eCk7CisJX19pZGVfcG9ydF91bnJlZ2lzdGVyX2RldmljZXMoaHdpZik7CisJaHdpZi0+cHJlc2VudCA9IDA7CisJaWRlX3BvcnRfaW5pdF9kZXZpY2VzX2RhdGEoaHdpZik7CisJbXV0ZXhfdW5sb2NrKCZpZGVfY2ZnX210eCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChpZGVfcG9ydF91bnJlZ2lzdGVyX2RldmljZXMpOworCisvKioKKyAqCWlkZV91bnJlZ2lzdGVyCQktCWZyZWUgYW4gSURFIGludGVyZmFjZQorICoJQGh3aWY6IElERSBpbnRlcmZhY2UKKyAqCisgKglQZXJmb3JtIHRoZSBmaW5hbCB1bnJlZ2lzdGVyIG9mIGFuIElERSBpbnRlcmZhY2UuCisgKgorICoJTG9ja2luZzoKKyAqCVRoZSBjYWxsZXIgbXVzdCBub3QgaG9sZCB0aGUgSURFIGxvY2tzLgorICoKKyAqCUl0IGlzIHVwIHRvIHRoZSBjYWxsZXIgdG8gYmUgc3VyZSB0aGVyZSBpcyBubyBwZW5kaW5nIEkvTyBoZXJlLAorICoJYW5kIHRoYXQgdGhlIGludGVyZmFjZSB3aWxsIG5vdCBiZSByZW9wZW5lZCAocHJlc2VudC92YW5pc2hpbmcKKyAqCWxvY2tpbmcgaXNuJ3QgeWV0IGRvbmUgQlRXKS4KKyAqLworCitzdGF0aWMgdm9pZCBpZGVfdW5yZWdpc3RlcihpZGVfaHdpZl90ICpod2lmKQoreworCUJVR19PTihpbl9pbnRlcnJ1cHQoKSk7CisJQlVHX09OKGlycXNfZGlzYWJsZWQoKSk7CisKKwltdXRleF9sb2NrKCZpZGVfY2ZnX210eCk7CisKKwlpZiAoaHdpZi0+cHJlc2VudCkgeworCQlfX2lkZV9wb3J0X3VucmVnaXN0ZXJfZGV2aWNlcyhod2lmKTsKKwkJaHdpZi0+cHJlc2VudCA9IDA7CisJfQorCisJaWRlX3Byb2NfdW5yZWdpc3Rlcl9wb3J0KGh3aWYpOworCisJZnJlZV9pcnEoaHdpZi0+aXJxLCBod2lmKTsKKworCWRldmljZV91bnJlZ2lzdGVyKGh3aWYtPnBvcnRkZXYpOworCWRldmljZV91bnJlZ2lzdGVyKCZod2lmLT5nZW5kZXYpOworCXdhaXRfZm9yX2NvbXBsZXRpb24oJmh3aWYtPmdlbmRldl9yZWxfY29tcCk7CisKKwkvKgorCSAqIFJlbW92ZSB1cyBmcm9tIHRoZSBrZXJuZWwncyBrbm93bGVkZ2UKKwkgKi8KKwlibGtfdW5yZWdpc3Rlcl9yZWdpb24oTUtERVYoaHdpZi0+bWFqb3IsIDApLCBNQVhfRFJJVkVTPDxQQVJUTl9CSVRTKTsKKwlrZnJlZShod2lmLT5zZ190YWJsZSk7CisJdW5yZWdpc3Rlcl9ibGtkZXYoaHdpZi0+bWFqb3IsIGh3aWYtPm5hbWUpOworCisJaWRlX3JlbGVhc2VfZG1hX2VuZ2luZShod2lmKTsKKworCW11dGV4X3VubG9jaygmaWRlX2NmZ19tdHgpOworfQorCiB2b2lkIGlkZV9ob3N0X2ZyZWUoc3RydWN0IGlkZV9ob3N0ICpob3N0KQogewogCWlkZV9od2lmX3QgKmh3aWY7CiAJaW50IGk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgTUFYX0hPU1RfUE9SVFM7IGkrKykgewotCQlod2lmID0gaG9zdC0+cG9ydHNbaV07Ci0KKwlpZGVfaG9zdF9mb3JfZWFjaF9wb3J0KGksIGh3aWYsIGhvc3QpIHsKIAkJaWYgKGh3aWYgPT0gTlVMTCkKIAkJCWNvbnRpbnVlOwogCisJCWlkZV9wb3J0X2ZyZWVfZGV2aWNlcyhod2lmKTsKIAkJaWRlX2ZyZWVfcG9ydF9zbG90KGh3aWYtPmluZGV4KTsKIAkJa2ZyZWUoaHdpZik7CiAJfQpAQCAtMTY2OCwxMSArMTY3MywxMiBAQAogCiB2b2lkIGlkZV9ob3N0X3JlbW92ZShzdHJ1Y3QgaWRlX2hvc3QgKmhvc3QpCiB7CisJaWRlX2h3aWZfdCAqaHdpZjsKIAlpbnQgaTsKIAotCWZvciAoaSA9IDA7IGkgPCBNQVhfSE9TVF9QT1JUUzsgaSsrKSB7Ci0JCWlmIChob3N0LT5wb3J0c1tpXSkKLQkJCWlkZV91bnJlZ2lzdGVyKGhvc3QtPnBvcnRzW2ldKTsKKwlpZGVfaG9zdF9mb3JfZWFjaF9wb3J0KGksIGh3aWYsIGhvc3QpIHsKKwkJaWYgKGh3aWYpCisJCQlpZGVfdW5yZWdpc3Rlcihod2lmKTsKIAl9CiAKIAlpZGVfaG9zdF9mcmVlKGhvc3QpOwpAQCAtMTY5MSw4ICsxNjk3LDggQEAKIAlod2lmLT5wcmVzZW50ID0gMTsKIAogCWlkZV9wb3J0X3R1bmVfZGV2aWNlcyhod2lmKTsKLQlpZGVfYWNwaV9wb3J0X2luaXRfZGV2aWNlcyhod2lmKTsKIAlpZGVfcG9ydF9zZXR1cF9kZXZpY2VzKGh3aWYpOworCWlkZV9hY3BpX3BvcnRfaW5pdF9kZXZpY2VzKGh3aWYpOwogCWh3aWZfcmVnaXN0ZXJfZGV2aWNlcyhod2lmKTsKIAlpZGVfcHJvY19wb3J0X3JlZ2lzdGVyX2RldmljZXMoaHdpZik7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9pZGUtcHJvYy5jIGIvZHJpdmVycy9pZGUvaWRlLXByb2MuYwppbmRleCBhMTRlMjkzLi4xZDg5NzhiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9pZGUtcHJvYy5jCisrKyBiL2RyaXZlcnMvaWRlL2lkZS1wcm9jLmMKQEAgLTQzOSwxMyArNDM5LDEzIEBACiBzdGF0aWMgaW50IHByb2NfaWRlX3JlYWRfZHJpdmVyCiAJKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLCBpbnQgY291bnQsIGludCAqZW9mLCB2b2lkICpkYXRhKQogewotCWlkZV9kcml2ZV90CSpkcml2ZSA9IChpZGVfZHJpdmVfdCAqKSBkYXRhOwotCXN0cnVjdCBkZXZpY2UJKmRldiA9ICZkcml2ZS0+Z2VuZGV2OwotCWlkZV9kcml2ZXJfdAkqaWRlX2RydjsKLQlpbnQJCWxlbjsKKwlpZGVfZHJpdmVfdAkJKmRyaXZlID0gKGlkZV9kcml2ZV90ICopZGF0YTsKKwlzdHJ1Y3QgZGV2aWNlCQkqZGV2ID0gJmRyaXZlLT5nZW5kZXY7CisJc3RydWN0IGlkZV9kcml2ZXIJKmlkZV9kcnY7CisJaW50CQkJbGVuOwogCiAJaWYgKGRldi0+ZHJpdmVyKSB7Ci0JCWlkZV9kcnYgPSBjb250YWluZXJfb2YoZGV2LT5kcml2ZXIsIGlkZV9kcml2ZXJfdCwgZ2VuX2RyaXZlcik7CisJCWlkZV9kcnYgPSB0b19pZGVfZHJpdmVyKGRldi0+ZHJpdmVyKTsKIAkJbGVuID0gc3ByaW50ZihwYWdlLCAiJXMgdmVyc2lvbiAlc1xuIiwKIAkJCQlkZXYtPmRyaXZlci0+bmFtZSwgaWRlX2Rydi0+dmVyc2lvbik7CiAJfSBlbHNlCkBAIC01NTUsNyArNTU1LDcgQEAKIAl9CiB9CiAKLXZvaWQgaWRlX3Byb2NfcmVnaXN0ZXJfZHJpdmVyKGlkZV9kcml2ZV90ICpkcml2ZSwgaWRlX2RyaXZlcl90ICpkcml2ZXIpCit2b2lkIGlkZV9wcm9jX3JlZ2lzdGVyX2RyaXZlcihpZGVfZHJpdmVfdCAqZHJpdmUsIHN0cnVjdCBpZGVfZHJpdmVyICpkcml2ZXIpCiB7CiAJbXV0ZXhfbG9jaygmaWRlX3NldHRpbmdfbXR4KTsKIAlkcml2ZS0+c2V0dGluZ3MgPSBkcml2ZXItPnByb2NfZGV2c2V0cyhkcml2ZSk7CkBAIC01NzcsNyArNTc3LDcgQEAKICAqCVRha2VzIGlkZV9zZXR0aW5nX210eC4KICAqLwogCi12b2lkIGlkZV9wcm9jX3VucmVnaXN0ZXJfZHJpdmVyKGlkZV9kcml2ZV90ICpkcml2ZSwgaWRlX2RyaXZlcl90ICpkcml2ZXIpCit2b2lkIGlkZV9wcm9jX3VucmVnaXN0ZXJfZHJpdmVyKGlkZV9kcml2ZV90ICpkcml2ZSwgc3RydWN0IGlkZV9kcml2ZXIgKmRyaXZlcikKIHsKIAlpZGVfcmVtb3ZlX3Byb2NfZW50cmllcyhkcml2ZS0+cHJvYywgZHJpdmVyLT5wcm9jX2VudHJpZXMoZHJpdmUpKTsKIApAQCAtNTkzLDE0ICs1OTMsMTMgQEAKIAogdm9pZCBpZGVfcHJvY19wb3J0X3JlZ2lzdGVyX2RldmljZXMoaWRlX2h3aWZfdCAqaHdpZikKIHsKLQlpbnQJZDsKIAlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmVudDsKIAlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnBhcmVudCA9IGh3aWYtPnByb2M7CisJaWRlX2RyaXZlX3QgKmRyaXZlOwogCWNoYXIgbmFtZVs2NF07CisJaW50IGk7CiAKLQlmb3IgKGQgPSAwOyBkIDwgTUFYX0RSSVZFUzsgZCsrKSB7Ci0JCWlkZV9kcml2ZV90ICpkcml2ZSA9ICZod2lmLT5kcml2ZXNbZF07Ci0KKwlpZGVfcG9ydF9mb3JfZWFjaF9kZXYoaSwgZHJpdmUsIGh3aWYpIHsKIAkJaWYgKChkcml2ZS0+ZGV2X2ZsYWdzICYgSURFX0RGTEFHX1BSRVNFTlQpID09IDAgfHwgZHJpdmUtPnByb2MpCiAJCQljb250aW51ZTsKIApAQCAtNjUzLDcgKzY1Miw3IEBACiAKIHN0YXRpYyBpbnQgcHJvY19wcmludF9kcml2ZXIoc3RydWN0IGRldmljZV9kcml2ZXIgKmRydiwgdm9pZCAqZGF0YSkKIHsKLQlpZGVfZHJpdmVyX3QgKmlkZV9kcnYgPSBjb250YWluZXJfb2YoZHJ2LCBpZGVfZHJpdmVyX3QsIGdlbl9kcml2ZXIpOworCXN0cnVjdCBpZGVfZHJpdmVyICppZGVfZHJ2ID0gdG9faWRlX2RyaXZlcihkcnYpOwogCXN0cnVjdCBzZXFfZmlsZSAqcyA9IGRhdGE7CiAKIAlzZXFfcHJpbnRmKHMsICIlcyB2ZXJzaW9uICVzXG4iLCBkcnYtPm5hbWUsIGlkZV9kcnYtPnZlcnNpb24pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvaWRlLXRhcGUuYyBiL2RyaXZlcnMvaWRlL2lkZS10YXBlLmMKaW5kZXggNWQyYWEyMi4uZDdlY2QzYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvaWRlLXRhcGUuYworKysgYi9kcml2ZXJzL2lkZS9pZGUtdGFwZS5jCkBAIC0xNjYsMTAgKzE2NiwxMCBAQAogICogdG8gYW4gaW50ZXJydXB0IG9yIGEgdGltZXIgZXZlbnQgaXMgc3RvcmVkIGluIHRoZSBzdHJ1Y3QgZGVmaW5lZCBiZWxvdy4KICAqLwogdHlwZWRlZiBzdHJ1Y3QgaWRlX3RhcGVfb2JqIHsKLQlpZGVfZHJpdmVfdAkqZHJpdmU7Ci0JaWRlX2RyaXZlcl90CSpkcml2ZXI7Ci0Jc3RydWN0IGdlbmRpc2sJKmRpc2s7Ci0Jc3RydWN0IGtyZWYJa3JlZjsKKwlpZGVfZHJpdmVfdAkJKmRyaXZlOworCXN0cnVjdCBpZGVfZHJpdmVyCSpkcml2ZXI7CisJc3RydWN0IGdlbmRpc2sJCSpkaXNrOworCXN0cnVjdCBrcmVmCQlrcmVmOwogCiAJLyoKIAkgKglmYWlsZWRfcGMgcG9pbnRzIHRvIHRoZSBsYXN0IGZhaWxlZCBwYWNrZXQgY29tbWFuZCwgb3IgY29udGFpbnMKQEAgLTQ3OSw3ICs0NzksNyBAQAogCiBzdGF0aWMgaW50IGlkZXRhcGVfZW5kX3JlcXVlc3QoaWRlX2RyaXZlX3QgKmRyaXZlLCBpbnQgdXB0b2RhdGUsIGludCBucl9zZWN0cykKIHsKLQlzdHJ1Y3QgcmVxdWVzdCAqcnEgPSBIV0dST1VQKGRyaXZlKS0+cnE7CisJc3RydWN0IHJlcXVlc3QgKnJxID0gZHJpdmUtPmh3aWYtPnJxOwogCWlkZXRhcGVfdGFwZV90ICp0YXBlID0gZHJpdmUtPmRyaXZlcl9kYXRhOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IGVycm9yOwpAQCAtNTMxLDcgKzUzMSw3IEBACiAJCQlwcmludGsoS0VSTl9FUlIgImlkZS10YXBlOiBFcnJvciBpbiBSRVFVRVNUIFNFTlNFICIKIAkJCQkJIml0c2VsZiAtIEFib3J0aW5nIHJlcXVlc3QhXG4iKTsKIAl9IGVsc2UgaWYgKHBjLT5jWzBdID09IFJFQURfNiB8fCBwYy0+Y1swXSA9PSBXUklURV82KSB7Ci0JCXN0cnVjdCByZXF1ZXN0ICpycSA9IGRyaXZlLT5od2lmLT5od2dyb3VwLT5ycTsKKwkJc3RydWN0IHJlcXVlc3QgKnJxID0gZHJpdmUtPmh3aWYtPnJxOwogCQlpbnQgYmxvY2tzID0gcGMtPnhmZXJyZWQgLyB0YXBlLT5ibGtfc2l6ZTsKIAogCQl0YXBlLT5hdmdfc2l6ZSArPSBibG9ja3MgKiB0YXBlLT5ibGtfc2l6ZTsKQEAgLTU3Niw3ICs1NzYsNyBAQAogCiAvKgogICogUG9zdHBvbmUgdGhlIGN1cnJlbnQgcmVxdWVzdCBzbyB0aGF0IGlkZS5jIHdpbGwgYmUgYWJsZSB0byBzZXJ2aWNlIHJlcXVlc3RzCi0gKiBmcm9tIGFub3RoZXIgZGV2aWNlIG9uIHRoZSBzYW1lIGh3Z3JvdXAgd2hpbGUgd2UgYXJlIHBvbGxpbmcgZm9yIERTQy4KKyAqIGZyb20gYW5vdGhlciBkZXZpY2Ugb24gdGhlIHNhbWUgcG9ydCB3aGlsZSB3ZSBhcmUgcG9sbGluZyBmb3IgRFNDLgogICovCiBzdGF0aWMgdm9pZCBpZGV0YXBlX3Bvc3Rwb25lX3JlcXVlc3QoaWRlX2RyaXZlX3QgKmRyaXZlKQogewpAQCAtNTg0LDcgKzU4NCw4IEBACiAKIAlkZWJ1Z19sb2coREJHX1BST0NTLCAiRW50ZXIgJXNcbiIsIF9fZnVuY19fKTsKIAotCXRhcGUtPnBvc3Rwb25lZF9ycSA9IEhXR1JPVVAoZHJpdmUpLT5ycTsKKwl0YXBlLT5wb3N0cG9uZWRfcnEgPSBkcml2ZS0+aHdpZi0+cnE7CisKIAlpZGVfc3RhbGxfcXVldWUoZHJpdmUsIHRhcGUtPmRzY19wb2xsX2ZyZXEpOwogfQogCkBAIC0yMzEyLDcgKzIzMTMsNyBAQAogCiBzdGF0aWMgaW50IGlkZV90YXBlX3Byb2JlKGlkZV9kcml2ZV90ICopOwogCi1zdGF0aWMgaWRlX2RyaXZlcl90IGlkZXRhcGVfZHJpdmVyID0geworc3RhdGljIHN0cnVjdCBpZGVfZHJpdmVyIGlkZXRhcGVfZHJpdmVyID0gewogCS5nZW5fZHJpdmVyID0gewogCQkub3duZXIJCT0gVEhJU19NT0RVTEUsCiAJCS5uYW1lCQk9ICJpZGUtdGFwZSIsCkBAIC0yMzIzLDcgKzIzMjQsNiBAQAogCS52ZXJzaW9uCQk9IElERVRBUEVfVkVSU0lPTiwKIAkuZG9fcmVxdWVzdAkJPSBpZGV0YXBlX2RvX3JlcXVlc3QsCiAJLmVuZF9yZXF1ZXN0CQk9IGlkZXRhcGVfZW5kX3JlcXVlc3QsCi0JLmVycm9yCQkJPSBfX2lkZV9lcnJvciwKICNpZmRlZiBDT05GSUdfSURFX1BST0NfRlMKIAkucHJvY19lbnRyaWVzCQk9IGlkZV90YXBlX3Byb2NfZW50cmllcywKIAkucHJvY19kZXZzZXRzCQk9IGlkZV90YXBlX3Byb2NfZGV2c2V0cywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2lkZS10YXNrZmlsZS5jIGIvZHJpdmVycy9pZGUvaWRlLXRhc2tmaWxlLmMKaW5kZXggYmY0ZmI5ZC4uMTYxMzhiYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvaWRlLXRhc2tmaWxlLmMKKysrIGIvZHJpdmVycy9pZGUvaWRlLXRhc2tmaWxlLmMKQEAgLTU4LDcgKzU4LDcgQEAKIAogaWRlX3N0YXJ0c3RvcF90IGRvX3J3X3Rhc2tmaWxlIChpZGVfZHJpdmVfdCAqZHJpdmUsIGlkZV90YXNrX3QgKnRhc2spCiB7Ci0JaWRlX2h3aWZfdCAqaHdpZgk9IEhXSUYoZHJpdmUpOworCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKIAlzdHJ1Y3QgaWRlX3Rhc2tmaWxlICp0ZiA9ICZ0YXNrLT50ZjsKIAlpZGVfaGFuZGxlcl90ICpoYW5kbGVyID0gTlVMTDsKIAljb25zdCBzdHJ1Y3QgaWRlX3RwX29wcyAqdHBfb3BzID0gaHdpZi0+dHBfb3BzOwpAQCAtMzA5LDkgKzMwOSw5IEBACiAJCX0KIAogCQlpZiAoc2VjdG9ycyA+IDApIHsKLQkJCWlkZV9kcml2ZXJfdCAqZHJ2OworCQkJc3RydWN0IGlkZV9kcml2ZXIgKmRydjsKIAotCQkJZHJ2ID0gKihpZGVfZHJpdmVyX3QgKiopcnEtPnJxX2Rpc2stPnByaXZhdGVfZGF0YTsKKwkJCWRydiA9ICooc3RydWN0IGlkZV9kcml2ZXIgKiopcnEtPnJxX2Rpc2stPnByaXZhdGVfZGF0YTsKIAkJCWRydi0+ZW5kX3JlcXVlc3QoZHJpdmUsIDEsIHNlY3RvcnMpOwogCQl9CiAJfQpAQCAtMzI4LDkgKzMyOCw5IEBACiAJfQogCiAJaWYgKHJxLT5ycV9kaXNrKSB7Ci0JCWlkZV9kcml2ZXJfdCAqZHJ2OworCQlzdHJ1Y3QgaWRlX2RyaXZlciAqZHJ2OwogCi0JCWRydiA9ICooaWRlX2RyaXZlcl90ICoqKXJxLT5ycV9kaXNrLT5wcml2YXRlX2RhdGE7OworCQlkcnYgPSAqKHN0cnVjdCBpZGVfZHJpdmVyICoqKXJxLT5ycV9kaXNrLT5wcml2YXRlX2RhdGE7OwogCQlkcnYtPmVuZF9yZXF1ZXN0KGRyaXZlLCAxLCBycS0+bnJfc2VjdG9ycyk7CiAJfSBlbHNlCiAJCWlkZV9lbmRfcmVxdWVzdChkcml2ZSwgMSwgcnEtPm5yX3NlY3RvcnMpOwpAQCAtMzYxLDcgKzM2MSw3IEBACiBzdGF0aWMgaWRlX3N0YXJ0c3RvcF90IHRhc2tfaW5faW50cihpZGVfZHJpdmVfdCAqZHJpdmUpCiB7CiAJaWRlX2h3aWZfdCAqaHdpZiA9IGRyaXZlLT5od2lmOwotCXN0cnVjdCByZXF1ZXN0ICpycSA9IGh3aWYtPmh3Z3JvdXAtPnJxOworCXN0cnVjdCByZXF1ZXN0ICpycSA9IGh3aWYtPnJxOwogCXU4IHN0YXQgPSBod2lmLT50cF9vcHMtPnJlYWRfc3RhdHVzKGh3aWYpOwogCiAJLyogRXJyb3I/ICovCkBAIC0zOTUsNyArMzk1LDcgQEAKIHN0YXRpYyBpZGVfc3RhcnRzdG9wX3QgdGFza19vdXRfaW50ciAoaWRlX2RyaXZlX3QgKmRyaXZlKQogewogCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKLQlzdHJ1Y3QgcmVxdWVzdCAqcnEgPSBIV0dST1VQKGRyaXZlKS0+cnE7CisJc3RydWN0IHJlcXVlc3QgKnJxID0gaHdpZi0+cnE7CiAJdTggc3RhdCA9IGh3aWYtPnRwX29wcy0+cmVhZF9zdGF0dXMoaHdpZik7CiAKIAlpZiAoIU9LX1NUQVQoc3RhdCwgRFJJVkVfUkVBRFksIGRyaXZlLT5iYWRfd3N0YXQpKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvaWRlLmMgYi9kcml2ZXJzL2lkZS9pZGUuYwppbmRleCA0NmEyZDRjLi4yNTg4MDVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9pZGUuYworKysgYi9kcml2ZXJzL2lkZS9pZGUuYwpAQCAtNjAsMTc5ICs2MCw4IEBACiAjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogCi0KLS8qIGRlZmF1bHQgbWF4aW11bSBudW1iZXIgb2YgZmFpbHVyZXMgKi8KLSNkZWZpbmUgSURFX0RFRkFVTFRfTUFYX0ZBSUxVUkVTIAkxCi0KIHN0cnVjdCBjbGFzcyAqaWRlX3BvcnRfY2xhc3M7CiAKLXN0YXRpYyBjb25zdCB1OCBpZGVfaHdpZl90b19tYWpvcltdID0geyBJREUwX01BSk9SLCBJREUxX01BSk9SLAotCQkJCQlJREUyX01BSk9SLCBJREUzX01BSk9SLAotCQkJCQlJREU0X01BSk9SLCBJREU1X01BSk9SLAotCQkJCQlJREU2X01BSk9SLCBJREU3X01BSk9SLAotCQkJCQlJREU4X01BSk9SLCBJREU5X01BSk9SIH07Ci0KLURFRklORV9NVVRFWChpZGVfY2ZnX210eCk7Ci0KLXN0YXRpYyB2b2lkIGlkZV9wb3J0X2luaXRfZGV2aWNlc19kYXRhKGlkZV9od2lmX3QgKik7Ci0KLS8qCi0gKiBEbyBub3QgZXZlbiAqdGhpbmsqIGFib3V0IGNhbGxpbmcgdGhpcyEKLSAqLwotdm9pZCBpZGVfaW5pdF9wb3J0X2RhdGEoaWRlX2h3aWZfdCAqaHdpZiwgdW5zaWduZWQgaW50IGluZGV4KQotewotCS8qIGJ1bGsgaW5pdGlhbGl6ZSBod2lmICYgZHJpdmUgaW5mbyB3aXRoIHplcm9zICovCi0JbWVtc2V0KGh3aWYsIDAsIHNpemVvZihpZGVfaHdpZl90KSk7Ci0KLQkvKiBmaWxsIGluIGFueSBub24temVybyBpbml0aWFsIHZhbHVlcyAqLwotCWh3aWYtPmluZGV4CT0gaW5kZXg7Ci0JaHdpZi0+bWFqb3IJPSBpZGVfaHdpZl90b19tYWpvcltpbmRleF07Ci0KLQlod2lmLT5uYW1lWzBdCT0gJ2knOwotCWh3aWYtPm5hbWVbMV0JPSAnZCc7Ci0JaHdpZi0+bmFtZVsyXQk9ICdlJzsKLQlod2lmLT5uYW1lWzNdCT0gJzAnICsgaW5kZXg7Ci0KLQlpbml0X2NvbXBsZXRpb24oJmh3aWYtPmdlbmRldl9yZWxfY29tcCk7Ci0KLQlod2lmLT50cF9vcHMgPSAmZGVmYXVsdF90cF9vcHM7Ci0KLQlpZGVfcG9ydF9pbml0X2RldmljZXNfZGF0YShod2lmKTsKLX0KLQotc3RhdGljIHZvaWQgaWRlX3BvcnRfaW5pdF9kZXZpY2VzX2RhdGEoaWRlX2h3aWZfdCAqaHdpZikKLXsKLQlpbnQgdW5pdDsKLQotCWZvciAodW5pdCA9IDA7IHVuaXQgPCBNQVhfRFJJVkVTOyArK3VuaXQpIHsKLQkJaWRlX2RyaXZlX3QgKmRyaXZlID0gJmh3aWYtPmRyaXZlc1t1bml0XTsKLQkJdTggaiA9IChod2lmLT5pbmRleCAqIE1BWF9EUklWRVMpICsgdW5pdDsKLQotCQltZW1zZXQoZHJpdmUsIDAsIHNpemVvZigqZHJpdmUpKTsKLQotCQlkcml2ZS0+bWVkaWEJCQk9IGlkZV9kaXNrOwotCQlkcml2ZS0+c2VsZWN0CQkJPSAodW5pdCA8PCA0KSB8IEFUQV9ERVZJQ0VfT0JTOwotCQlkcml2ZS0+aHdpZgkJCT0gaHdpZjsKLQkJZHJpdmUtPnJlYWR5X3N0YXQJCT0gQVRBX0RSRFk7Ci0JCWRyaXZlLT5iYWRfd3N0YXQJCT0gQkFEX1dfU1RBVDsKLQkJZHJpdmUtPnNwZWNpYWwuYi5yZWNhbGlicmF0ZQk9IDE7Ci0JCWRyaXZlLT5zcGVjaWFsLmIuc2V0X2dlb21ldHJ5CT0gMTsKLQkJZHJpdmUtPm5hbWVbMF0JCQk9ICdoJzsKLQkJZHJpdmUtPm5hbWVbMV0JCQk9ICdkJzsKLQkJZHJpdmUtPm5hbWVbMl0JCQk9ICdhJyArIGo7Ci0JCWRyaXZlLT5tYXhfZmFpbHVyZXMJCT0gSURFX0RFRkFVTFRfTUFYX0ZBSUxVUkVTOwotCi0JCUlOSVRfTElTVF9IRUFEKCZkcml2ZS0+bGlzdCk7Ci0JCWluaXRfY29tcGxldGlvbigmZHJpdmUtPmdlbmRldl9yZWxfY29tcCk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBfX2lkZV9wb3J0X3VucmVnaXN0ZXJfZGV2aWNlcyhpZGVfaHdpZl90ICpod2lmKQotewotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IE1BWF9EUklWRVM7IGkrKykgewotCQlpZGVfZHJpdmVfdCAqZHJpdmUgPSAmaHdpZi0+ZHJpdmVzW2ldOwotCi0JCWlmIChkcml2ZS0+ZGV2X2ZsYWdzICYgSURFX0RGTEFHX1BSRVNFTlQpIHsKLQkJCWRldmljZV91bnJlZ2lzdGVyKCZkcml2ZS0+Z2VuZGV2KTsKLQkJCXdhaXRfZm9yX2NvbXBsZXRpb24oJmRyaXZlLT5nZW5kZXZfcmVsX2NvbXApOwotCQl9Ci0JfQotfQotCi12b2lkIGlkZV9wb3J0X3VucmVnaXN0ZXJfZGV2aWNlcyhpZGVfaHdpZl90ICpod2lmKQotewotCW11dGV4X2xvY2soJmlkZV9jZmdfbXR4KTsKLQlfX2lkZV9wb3J0X3VucmVnaXN0ZXJfZGV2aWNlcyhod2lmKTsKLQlod2lmLT5wcmVzZW50ID0gMDsKLQlpZGVfcG9ydF9pbml0X2RldmljZXNfZGF0YShod2lmKTsKLQltdXRleF91bmxvY2soJmlkZV9jZmdfbXR4KTsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKGlkZV9wb3J0X3VucmVnaXN0ZXJfZGV2aWNlcyk7Ci0KLS8qKgotICoJaWRlX3VucmVnaXN0ZXIJCS0JZnJlZSBhbiBJREUgaW50ZXJmYWNlCi0gKglAaHdpZjogSURFIGludGVyZmFjZQotICoKLSAqCVBlcmZvcm0gdGhlIGZpbmFsIHVucmVnaXN0ZXIgb2YgYW4gSURFIGludGVyZmFjZS4gQXQgdGhlIG1vbWVudAotICoJd2UgZG9uJ3QgcmVmY291bnQgaW50ZXJmYWNlcyBzbyB0aGlzIHdpbGwgYWxzbyBnZXQgc3BsaXQgdXAuCi0gKgotICoJTG9ja2luZzoKLSAqCVRoZSBjYWxsZXIgbXVzdCBub3QgaG9sZCB0aGUgSURFIGxvY2tzCi0gKglUaGUgZHJpdmUgcHJlc2VudC92YW5pc2hpbmcgaXMgbm90IHlldCBwcm9wZXJseSBsb2NrZWQKLSAqCVRha2UgY2FyZSB3aXRoIHRoZSBjYWxsYmFja3MuIFRoZXNlIGhhdmUgYmVlbiBzcGxpdCB0byBhdm9pZAotICoJZGVhZGxvY2tpbmcgdGhlIElERSBsYXllci4gVGhlIHNodXRkb3duIGNhbGxiYWNrIGlzIGNhbGxlZAotICoJYmVmb3JlIHdlIHRha2UgdGhlIGxvY2sgYW5kIGZyZWUgcmVzb3VyY2VzLiBJdCBpcyB1cCB0byB0aGUKLSAqCWNhbGxlciB0byBiZSBzdXJlIHRoZXJlIGlzIG5vIHBlbmRpbmcgSS9PIGhlcmUsIGFuZCB0aGF0Ci0gKgl0aGUgaW50ZXJmYWNlIHdpbGwgbm90IGJlIHJlb3BlbmVkIChwcmVzZW50L3ZhbmlzaGluZyBsb2NraW5nCi0gKglpc24ndCB5ZXQgZG9uZSBCVFcpLiBBZnRlciB3ZSBjb21taXQgdG8gdGhlIGZpbmFsIGtpbGwgd2UKLSAqCWNhbGwgdGhlIGNsZWFudXAgY2FsbGJhY2sgd2l0aCB0aGUgaWRlIGxvY2tzIGhlbGQuCi0gKgotICoJVW5yZWdpc3RlciByZXN0b3JlcyB0aGUgaHdpZiBzdHJ1Y3R1cmVzIHRvIHRoZSBkZWZhdWx0IHN0YXRlLgotICoJVGhpcyBpcyByYXZpbmcgYm9ua2Vycy4KLSAqLwotCi12b2lkIGlkZV91bnJlZ2lzdGVyKGlkZV9od2lmX3QgKmh3aWYpCi17Ci0JaWRlX2h3aWZfdCAqZzsKLQlpZGVfaHdncm91cF90ICpod2dyb3VwOwotCWludCBpcnFfY291bnQgPSAwOwotCi0JQlVHX09OKGluX2ludGVycnVwdCgpKTsKLQlCVUdfT04oaXJxc19kaXNhYmxlZCgpKTsKLQotCW11dGV4X2xvY2soJmlkZV9jZmdfbXR4KTsKLQotCWlmIChod2lmLT5wcmVzZW50KSB7Ci0JCV9faWRlX3BvcnRfdW5yZWdpc3Rlcl9kZXZpY2VzKGh3aWYpOwotCQlod2lmLT5wcmVzZW50ID0gMDsKLQl9Ci0KLQlpZGVfcHJvY191bnJlZ2lzdGVyX3BvcnQoaHdpZik7Ci0KLQlod2dyb3VwID0gaHdpZi0+aHdncm91cDsKLQkvKgotCSAqIGZyZWUgdGhlIGlycSBpZiB3ZSB3ZXJlIHRoZSBvbmx5IGh3aWYgdXNpbmcgaXQKLQkgKi8KLQlnID0gaHdncm91cC0+aHdpZjsKLQlkbyB7Ci0JCWlmIChnLT5pcnEgPT0gaHdpZi0+aXJxKQotCQkJKytpcnFfY291bnQ7Ci0JCWcgPSBnLT5uZXh0OwotCX0gd2hpbGUgKGcgIT0gaHdncm91cC0+aHdpZik7Ci0JaWYgKGlycV9jb3VudCA9PSAxKQotCQlmcmVlX2lycShod2lmLT5pcnEsIGh3Z3JvdXApOwotCi0JaWRlX3JlbW92ZV9wb3J0X2Zyb21faHdncm91cChod2lmKTsKLQotCWRldmljZV91bnJlZ2lzdGVyKGh3aWYtPnBvcnRkZXYpOwotCWRldmljZV91bnJlZ2lzdGVyKCZod2lmLT5nZW5kZXYpOwotCXdhaXRfZm9yX2NvbXBsZXRpb24oJmh3aWYtPmdlbmRldl9yZWxfY29tcCk7Ci0KLQkvKgotCSAqIFJlbW92ZSB1cyBmcm9tIHRoZSBrZXJuZWwncyBrbm93bGVkZ2UKLQkgKi8KLQlibGtfdW5yZWdpc3Rlcl9yZWdpb24oTUtERVYoaHdpZi0+bWFqb3IsIDApLCBNQVhfRFJJVkVTPDxQQVJUTl9CSVRTKTsKLQlrZnJlZShod2lmLT5zZ190YWJsZSk7Ci0JdW5yZWdpc3Rlcl9ibGtkZXYoaHdpZi0+bWFqb3IsIGh3aWYtPm5hbWUpOwotCi0JaWRlX3JlbGVhc2VfZG1hX2VuZ2luZShod2lmKTsKLQotCW11dGV4X3VubG9jaygmaWRlX2NmZ19tdHgpOwotfQotCi12b2lkIGlkZV9pbml0X3BvcnRfaHcoaWRlX2h3aWZfdCAqaHdpZiwgaHdfcmVnc190ICpodykKLXsKLQltZW1jcHkoJmh3aWYtPmlvX3BvcnRzLCAmaHctPmlvX3BvcnRzLCBzaXplb2YoaHdpZi0+aW9fcG9ydHMpKTsKLQlod2lmLT5pcnEgPSBody0+aXJxOwotCWh3aWYtPmNoaXBzZXQgPSBody0+Y2hpcHNldDsKLQlod2lmLT5kZXYgPSBody0+ZGV2OwotCWh3aWYtPmdlbmRldi5wYXJlbnQgPSBody0+cGFyZW50ID8gaHctPnBhcmVudCA6IGh3LT5kZXY7Ci0JaHdpZi0+YWNrX2ludHIgPSBody0+YWNrX2ludHI7Ci0JaHdpZi0+Y29uZmlnX2RhdGEgPSBody0+Y29uZmlnOwotfQotCiAvKgogICoJTG9ja3MgZm9yIElERSBzZXR0aW5nIGZ1bmN0aW9uYWxpdHkKICAqLwpAQCAtMzMwLDcgKzE1OSw2IEBACiBzdGF0aWMgaW50IHNldF9waW9fbW9kZShpZGVfZHJpdmVfdCAqZHJpdmUsIGludCBhcmcpCiB7CiAJaWRlX2h3aWZfdCAqaHdpZiA9IGRyaXZlLT5od2lmOwotCWlkZV9od2dyb3VwX3QgKmh3Z3JvdXAgPSBod2lmLT5od2dyb3VwOwogCWNvbnN0IHN0cnVjdCBpZGVfcG9ydF9vcHMgKnBvcnRfb3BzID0gaHdpZi0+cG9ydF9vcHM7CiAKIAlpZiAoYXJnIDwgMCB8fCBhcmcgPiAyNTUpCkBAIC0zNDUsOSArMTczLDkgQEAKIAkJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAkJCS8qIHRha2UgbG9jayBmb3IgSURFX0RGTEFHX1tOT19dVU5NQVNLL1tOT19dSU9fMzJCSVQgKi8KLQkJCXNwaW5fbG9ja19pcnFzYXZlKCZod2dyb3VwLT5sb2NrLCBmbGFncyk7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmaHdpZi0+bG9jaywgZmxhZ3MpOwogCQkJcG9ydF9vcHMtPnNldF9waW9fbW9kZShkcml2ZSwgYXJnKTsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmh3Z3JvdXAtPmxvY2ssIGZsYWdzKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmh3aWYtPmxvY2ssIGZsYWdzKTsKIAkJfSBlbHNlCiAJCQlwb3J0X29wcy0+c2V0X3Bpb19tb2RlKGRyaXZlLCBhcmcpOwogCX0gZWxzZSB7CkBAIC00NTMsNyArMjgxLDcgQEAKIHN0YXRpYyBpbnQgZ2VuZXJpY19pZGVfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2KQogewogCWlkZV9kcml2ZV90ICpkcml2ZSA9IHRvX2lkZV9kZXZpY2UoZGV2KTsKLQlpZGVfZHJpdmVyX3QgKmRydiA9IHRvX2lkZV9kcml2ZXIoZGV2LT5kcml2ZXIpOworCXN0cnVjdCBpZGVfZHJpdmVyICpkcnYgPSB0b19pZGVfZHJpdmVyKGRldi0+ZHJpdmVyKTsKIAogCXJldHVybiBkcnYtPnByb2JlID8gZHJ2LT5wcm9iZShkcml2ZSkgOiAtRU5PREVWOwogfQpAQCAtNDYxLDcgKzI4OSw3IEBACiBzdGF0aWMgaW50IGdlbmVyaWNfaWRlX3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJaWRlX2RyaXZlX3QgKmRyaXZlID0gdG9faWRlX2RldmljZShkZXYpOwotCWlkZV9kcml2ZXJfdCAqZHJ2ID0gdG9faWRlX2RyaXZlcihkZXYtPmRyaXZlcik7CisJc3RydWN0IGlkZV9kcml2ZXIgKmRydiA9IHRvX2lkZV9kcml2ZXIoZGV2LT5kcml2ZXIpOwogCiAJaWYgKGRydi0+cmVtb3ZlKQogCQlkcnYtPnJlbW92ZShkcml2ZSk7CkBAIC00NzIsNyArMzAwLDcgQEAKIHN0YXRpYyB2b2lkIGdlbmVyaWNfaWRlX3NodXRkb3duKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlpZGVfZHJpdmVfdCAqZHJpdmUgPSB0b19pZGVfZGV2aWNlKGRldik7Ci0JaWRlX2RyaXZlcl90ICpkcnYgPSB0b19pZGVfZHJpdmVyKGRldi0+ZHJpdmVyKTsKKwlzdHJ1Y3QgaWRlX2RyaXZlciAqZHJ2ID0gdG9faWRlX2RyaXZlcihkZXYtPmRyaXZlcik7CiAKIAlpZiAoZGV2LT5kcml2ZXIgJiYgZHJ2LT5zaHV0ZG93bikKIAkJZHJ2LT5zaHV0ZG93bihkcml2ZSk7CkBAIC02NjAsNiArNDg4LDcgQEAKIAogdm9pZCBpZGVfcG9ydF9hcHBseV9wYXJhbXMoaWRlX2h3aWZfdCAqaHdpZikKIHsKKwlpZGVfZHJpdmVfdCAqZHJpdmU7CiAJaW50IGk7CiAKIAlpZiAoaWRlX2lnbm9yZV9jYWJsZSAmICgxIDw8IGh3aWYtPmluZGV4KSkgewpAQCAtNjY4LDggKzQ5Nyw4IEBACiAJCWh3aWYtPmNibCA9IEFUQV9DQkxfUEFUQTQwX1NIT1JUOwogCX0KIAotCWZvciAoaSA9IDA7IGkgPCBNQVhfRFJJVkVTOyBpKyspCi0JCWlkZV9kZXZfYXBwbHlfcGFyYW1zKCZod2lmLT5kcml2ZXNbaV0sIGkpOworCWlkZV9wb3J0X2Zvcl9lYWNoX2RldihpLCBkcml2ZSwgaHdpZikKKwkJaWRlX2Rldl9hcHBseV9wYXJhbXMoZHJpdmUsIGkpOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvaXQ4MTcyLmMgYi9kcml2ZXJzL2lkZS9pdDgxNzIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDIxMDc4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pZGUvaXQ4MTcyLmMKQEAgLTAsMCArMSwxNjYgQEAKKy8qCisgKgorICogQlJJRUYgTU9EVUxFIERFU0NSSVBUSU9OCisgKiAgICAgIElUODE3MiBJREUgY29udHJvbGxlciBzdXBwb3J0CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAwIE1vbnRhVmlzdGEgU29mdHdhcmUgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDA4IFNoYW5lIE1jRG9uYWxkCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAorICogIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgorICogIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRISVMgIFNPRlRXQVJFICBJUyBQUk9WSURFRCAgIGBgQVMgIElTJycgQU5EICAgQU5ZICBFWFBSRVNTIE9SIElNUExJRUQKKyAqICBXQVJSQU5USUVTLCAgIElOQ0xVRElORywgQlVUIE5PVCAgTElNSVRFRCAgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqICBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4KKyAqICBOTyAgRVZFTlQgIFNIQUxMICAgVEhFIEFVVEhPUiAgQkUgICAgTElBQkxFIEZPUiBBTlkgICBESVJFQ1QsIElORElSRUNULAorICogIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogIE5PVCBMSU1JVEVEICAgVE8sIFBST0NVUkVNRU5UIE9GICBTVUJTVElUVVRFIEdPT0RTICBPUiBTRVJWSUNFUzsgTE9TUyBPRgorICogIFVTRSwgREFUQSwgIE9SIFBST0ZJVFM7IE9SICBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTgorICogIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOICBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlICB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2lkZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2RlZmluZSBEUlZfTkFNRSAiSVQ4MTcyIgorCitzdGF0aWMgdm9pZCBpdDgxNzJfc2V0X3Bpb19tb2RlKGlkZV9kcml2ZV90ICpkcml2ZSwgY29uc3QgdTggcGlvKQoreworCWlkZV9od2lmX3QgKmh3aWYJPSBkcml2ZS0+aHdpZjsKKwlzdHJ1Y3QgcGNpX2RldiAqZGV2CT0gdG9fcGNpX2Rldihod2lmLT5kZXYpOworCXUxNiBkcml2ZV9lbmFibGVzOworCXUzMiBkcml2ZV90aW1pbmc7CisKKwkvKgorCSAqIFRoZSBoaWdoZXN0IHZhbHVlIG9mIERJT1IvRElPVyBwdWxzZSB3aWR0aCBhbmQgcmVjb3ZlcnkgdGltZQorCSAqIHRoYXQgY2FuIGJlIHNldCBpbiB0aGUgSVQ4MTcyIGlzIDggUENJIGNsb2NrIGN5Y2xlcy4gIEFzIGEgcmVzdWx0LAorCSAqIGl0IGNhbm5vdCBiZSBjb25maWd1cmVkIGZvciBQSU8gbW9kZSAwLiAgVGhpcyB0YWJsZSBzZXRzIHRoZXNlCisJICogcGFyYW1ldGVycyB0byB0aGUgbWF4aW11bSBzdXBwb3J0ZWQgYnkgdGhlIElUODE3Mi4KKwkgKi8KKwlzdGF0aWMgY29uc3QgdTggdGltaW5nc1tdID0geyAweDNmLCAweDNjLCAweDFiLCAweDEyLCAweDBhIH07CisKKwlwY2lfcmVhZF9jb25maWdfd29yZChkZXYsIDB4NDAsICZkcml2ZV9lbmFibGVzKTsKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQoZGV2LCAweDQ0LCAmZHJpdmVfdGltaW5nKTsKKworCS8qCisJICogRW5hYmxlIHBvcnQgMHg0NC4gVGhlIElUODE3MiBzcGVjIGlzIGNvbmZ1c2VkOyBpdCBjYWxscworCSAqIHRoaXMgcmVnaXN0ZXIgdGhlICJTbGF2ZSBJREUgVGltaW5nIFJlZ2lzdGVyIiwgYnV0IGluIGZhY3QsCisJICogaXQgY29udHJvbHMgdGltaW5nIGZvciBib3RoIG1hc3RlciBhbmQgc2xhdmUgZHJpdmVzLgorCSAqLworCWRyaXZlX2VuYWJsZXMgfD0gMHg0MDAwOworCisJZHJpdmVfZW5hYmxlcyAmPSBkcml2ZS0+ZG4gPyAweGMwMDYgOiAweGMwNjA7CisJaWYgKGRyaXZlLT5tZWRpYSA9PSBpZGVfZGlzaykKKwkJLyogZW5hYmxlIHByZWZldGNoICovCisJCWRyaXZlX2VuYWJsZXMgfD0gMHgwMDA0IDw8IChkcml2ZS0+ZG4gKiA0KTsKKwlpZiAoYXRhX2lkX2hhc19pb3JkeShkcml2ZS0+aWQpKQorCQkvKiBlbmFibGUgSU9SRFkgc2FtcGxlLXBvaW50ICovCisJCWRyaXZlX2VuYWJsZXMgfD0gMHgwMDAyIDw8IChkcml2ZS0+ZG4gKiA0KTsKKworCWRyaXZlX3RpbWluZyAmPSBkcml2ZS0+ZG4gPyAweDAwMDAzZjAwIDogMHgwMDBmYzAwMDsKKwlkcml2ZV90aW1pbmcgfD0gdGltaW5nc1twaW9dIDw8IChkcml2ZS0+ZG4gKiA2ICsgOCk7CisKKwlwY2lfd3JpdGVfY29uZmlnX3dvcmQoZGV2LCAweDQwLCBkcml2ZV9lbmFibGVzKTsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgMHg0NCwgZHJpdmVfdGltaW5nKTsKK30KKworc3RhdGljIHZvaWQgaXQ4MTcyX3NldF9kbWFfbW9kZShpZGVfZHJpdmVfdCAqZHJpdmUsIGNvbnN0IHU4IHNwZWVkKQoreworCWlkZV9od2lmX3QgKmh3aWYJPSBkcml2ZS0+aHdpZjsKKwlzdHJ1Y3QgcGNpX2RldiAqZGV2CT0gdG9fcGNpX2Rldihod2lmLT5kZXYpOworCWludCBhX3NwZWVkCQk9IDMgPDwgKGRyaXZlLT5kbiAqIDQpOworCWludCB1X2ZsYWcJCT0gMSA8PCBkcml2ZS0+ZG47CisJaW50IHVfc3BlZWQJCT0gMDsKKwl1OCByZWc0OCwgcmVnNGE7CisKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIDB4NDgsICZyZWc0OCk7CisJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCAweDRhLCAmcmVnNGEpOworCisJaWYgKHNwZWVkID49IFhGRVJfVURNQV8wKSB7CisJCXU4IHVkbWEgPSBzcGVlZCAtIFhGRVJfVURNQV8wOworCQl1X3NwZWVkID0gdWRtYSA8PCAoZHJpdmUtPmRuICogNCk7CisKKwkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgMHg0OCwgcmVnNDggfCB1X2ZsYWcpOworCQlyZWc0YSAmPSB+YV9zcGVlZDsKKwkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgMHg0YSwgcmVnNGEgfCB1X3NwZWVkKTsKKwl9IGVsc2UgeworCQljb25zdCB1OCBtd2RtYV90b19waW9bXSA9IHsgMCwgMywgNCB9OworCQl1OCBwaW87CisKKwkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgMHg0OCwgcmVnNDggJiB+dV9mbGFnKTsKKwkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgMHg0YSwgcmVnNGEgJiB+YV9zcGVlZCk7CisKKwkJcGlvID0gbXdkbWFfdG9fcGlvW3NwZWVkIC0gWEZFUl9NV19ETUFfMF07CisKKwkJaXQ4MTcyX3NldF9waW9fbW9kZShkcml2ZSwgcGlvKTsKKwl9Cit9CisKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpZGVfcG9ydF9vcHMgaXQ4MTcyX3BvcnRfb3BzID0geworCS5zZXRfcGlvX21vZGUJPSBpdDgxNzJfc2V0X3Bpb19tb2RlLAorCS5zZXRfZG1hX21vZGUJPSBpdDgxNzJfc2V0X2RtYV9tb2RlLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpZGVfcG9ydF9pbmZvIGl0ODE3Ml9wb3J0X2luZm8gX19kZXZpbml0ZGF0YSA9IHsKKwkubmFtZQkJPSBEUlZfTkFNRSwKKwkucG9ydF9vcHMJPSAmaXQ4MTcyX3BvcnRfb3BzLAorCS5lbmFibGViaXRzCT0geyB7MHg0MSwgMHg4MCwgMHg4MH0sIHsweDAwLCAweDAwLCAweDAwfSB9LAorCS5ob3N0X2ZsYWdzCT0gSURFX0hGTEFHX1NJTkdMRSwKKwkucGlvX21hc2sJPSBBVEFfUElPNCAmIH5BVEFfUElPMCwKKwkubXdkbWFfbWFzawk9IEFUQV9NV0RNQTIsCisJLnVkbWFfbWFzawk9IEFUQV9VRE1BMiwKK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGl0ODE3Ml9pbml0X29uZShzdHJ1Y3QgcGNpX2RldiAqZGV2LAorCQkJCQljb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCit7CisJaWYgKChkZXYtPmNsYXNzID4+IDgpICE9IFBDSV9DTEFTU19TVE9SQUdFX0lERSkKKwkJcmV0dXJuIC1FTk9ERVY7IC8qIElUODE3MiBpcyBtb3JlIHRoYW4gYW4gSURFIGNvbnRyb2xsZXIgKi8KKwlyZXR1cm4gaWRlX3BjaV9pbml0X29uZShkZXYsICZpdDgxNzJfcG9ydF9pbmZvLCBOVUxMKTsKK30KKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGl0ODE3Ml9wY2lfdGJsW10gPSB7CisJeyBQQ0lfVkRFVklDRShJVEUsIFBDSV9ERVZJQ0VfSURfSVRFXzgxNzIpLCAwIH0sCisJeyAwLCB9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBpdDgxNzJfcGNpX3RibCk7CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBpdDgxNzJfcGNpX2RyaXZlciA9IHsKKwkubmFtZQkJPSAiSVQ4MTcyX0lERSIsCisJLmlkX3RhYmxlCT0gaXQ4MTcyX3BjaV90YmwsCisJLnByb2JlCQk9IGl0ODE3Ml9pbml0X29uZSwKKwkucmVtb3ZlCQk9IGlkZV9wY2lfcmVtb3ZlLAorCS5zdXNwZW5kCT0gaWRlX3BjaV9zdXNwZW5kLAorCS5yZXN1bWUJCT0gaWRlX3BjaV9yZXN1bWUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpdDgxNzJfaWRlX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaWRlX3BjaV9yZWdpc3Rlcl9kcml2ZXIoJml0ODE3Ml9wY2lfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGl0ODE3Ml9pZGVfZXhpdCh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmaXQ4MTcyX3BjaV9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChpdDgxNzJfaWRlX2luaXQpOworbW9kdWxlX2V4aXQoaXQ4MTcyX2lkZV9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiU3RldmUgTG9uZ2VyYmVhbSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJQQ0kgZHJpdmVyIG1vZHVsZSBmb3IgSVRFIDgxNzIgSURFIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9pdDgyMTMuYyBiL2RyaXZlcnMvaWRlL2l0ODIxMy5jCmluZGV4IDdjMmZlZWIuLmQ3OTY5YjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2l0ODIxMy5jCisrKyBiL2RyaXZlcnMvaWRlL2l0ODIxMy5jCkBAIC0yNSw3ICsyNSw3IEBACiAKIHN0YXRpYyB2b2lkIGl0ODIxM19zZXRfcGlvX21vZGUoaWRlX2RyaXZlX3QgKmRyaXZlLCBjb25zdCB1OCBwaW8pCiB7Ci0JaWRlX2h3aWZfdCAqaHdpZgk9IEhXSUYoZHJpdmUpOworCWlkZV9od2lmX3QgKmh3aWYJPSBkcml2ZS0+aHdpZjsKIAlzdHJ1Y3QgcGNpX2RldiAqZGV2CT0gdG9fcGNpX2Rldihod2lmLT5kZXYpOwogCWludCBpc19zbGF2ZQkJPSBkcml2ZS0+ZG4gJiAxOwogCWludCBtYXN0ZXJfcG9ydAkJPSAweDQwOwpAQCAtODIsNyArODIsNyBAQAogCiBzdGF0aWMgdm9pZCBpdDgyMTNfc2V0X2RtYV9tb2RlKGlkZV9kcml2ZV90ICpkcml2ZSwgY29uc3QgdTggc3BlZWQpCiB7Ci0JaWRlX2h3aWZfdCAqaHdpZgk9IEhXSUYoZHJpdmUpOworCWlkZV9od2lmX3QgKmh3aWYJPSBkcml2ZS0+aHdpZjsKIAlzdHJ1Y3QgcGNpX2RldiAqZGV2CT0gdG9fcGNpX2Rldihod2lmLT5kZXYpOwogCXU4IG1hc2xhdmUJCT0gMHg0MDsKIAlpbnQgYV9zcGVlZAkJPSAzIDw8IChkcml2ZS0+ZG4gKiA0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2l0ODIxeC5jIGIvZHJpdmVycy9pZGUvaXQ4MjF4LmMKaW5kZXggZWYwMDQwOC4uMGJlMjdhYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvaXQ4MjF4LmMKKysrIGIvZHJpdmVycy9pZGUvaXQ4MjF4LmMKQEAgLTE2NywxMiArMTY3LDEwIEBACiAJaWRlX2h3aWZfdCAqaHdpZiA9IGRyaXZlLT5od2lmOwogCXN0cnVjdCBwY2lfZGV2ICpkZXYgPSB0b19wY2lfZGV2KGh3aWYtPmRldik7CiAJc3RydWN0IGl0ODIxeF9kZXYgKml0ZGV2ID0gaWRlX2dldF9od2lmZGF0YShod2lmKTsKLQlpZGVfZHJpdmVfdCAqcGFpcjsKKwlpZGVfZHJpdmVfdCAqcGFpciA9IGlkZV9nZXRfcGFpcl9kZXYoZHJpdmUpOwogCWludCBjbG9jaywgYWx0Y2xvY2ssIHNlbCA9IDA7CiAJdTggdW5pdCA9IGRyaXZlLT5kbiAmIDEsIHY7CiAKLQlwYWlyID0gJmh3aWYtPmRyaXZlc1sxIC0gdW5pdF07Ci0KIAlpZihpdGRldi0+d2FudFswXVswXSA+IGl0ZGV2LT53YW50WzFdWzBdKSB7CiAJCWNsb2NrID0gaXRkZXYtPndhbnRbMF1bMV07CiAJCWFsdGNsb2NrID0gaXRkZXYtPndhbnRbMV1bMV07CkBAIC0yMzksMTUgKzIzNywxMyBAQAogewogCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKIAlzdHJ1Y3QgaXQ4MjF4X2RldiAqaXRkZXYgPSBpZGVfZ2V0X2h3aWZkYXRhKGh3aWYpOwotCWlkZV9kcml2ZV90ICpwYWlyOworCWlkZV9kcml2ZV90ICpwYWlyID0gaWRlX2dldF9wYWlyX2Rldihkcml2ZSk7CiAJdTggdW5pdCA9IGRyaXZlLT5kbiAmIDEsIHNldF9waW8gPSBwaW87CiAKIAkvKiBTcGVjIHNheXMgODkgcmVmIGRyaXZlciB1c2VzIDg4ICovCiAJc3RhdGljIHUxNiBwaW9fdGltaW5nc1tdPSB7IDB4QUE4OCwgMHhBMzgyLCAweEExODEsIDB4MzMzMiwgMHgzMTIxIH07CiAJc3RhdGljIHU4IHBpb193YW50W10gICAgPSB7IEFUQV82NiwgQVRBXzY2LCBBVEFfNjYsIEFUQV82NiwgQVRBX0FOWSB9OwogCi0JcGFpciA9ICZod2lmLT5kcml2ZXNbMSAtIHVuaXRdOwotCiAJLyoKIAkgKiBDb21wdXRlIHRoZSBiZXN0IFBJTyBtb2RlIHdlIGNhbiBmb3IgYSBnaXZlbiBkZXZpY2UuIFdlIG11c3QKIAkgKiBwaWNrIGEgc3BlZWQgdGhhdCBkb2VzIG5vdCBjYXVzZSBwcm9ibGVtcyB3aXRoIHRoZSBvdGhlciBkZXZpY2UKQEAgLTI3OSw3ICsyNzUsNyBAQAogICoJdGhlIHNoYXJlZCBNV0RNQS9QSU8gdGltaW5nIHJlZ2lzdGVyLgogICovCiAKLXN0YXRpYyB2b2lkIGl0ODIxeF90dW5lX213ZG1hIChpZGVfZHJpdmVfdCAqZHJpdmUsIGJ5dGUgbW9kZV93YW50ZWQpCitzdGF0aWMgdm9pZCBpdDgyMXhfdHVuZV9td2RtYShpZGVfZHJpdmVfdCAqZHJpdmUsIHU4IG1vZGVfd2FudGVkKQogewogCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKIAlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gdG9fcGNpX2Rldihod2lmLT5kZXYpOwpAQCAtMzE2LDcgKzMxMiw3IEBACiAgKgljb250cm9sbGVyIHdoZW4gZG9pbmcgVURNQSBtb2RlcyBpbiBwYXNzIHRocm91Z2guCiAgKi8KIAotc3RhdGljIHZvaWQgaXQ4MjF4X3R1bmVfdWRtYSAoaWRlX2RyaXZlX3QgKmRyaXZlLCBieXRlIG1vZGVfd2FudGVkKQorc3RhdGljIHZvaWQgaXQ4MjF4X3R1bmVfdWRtYShpZGVfZHJpdmVfdCAqZHJpdmUsIHU4IG1vZGVfd2FudGVkKQogewogCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKIAlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gdG9fcGNpX2Rldihod2lmLT5kZXYpOwpAQCAtNTE2LDYgKzUxMiw3IEBACiAJLmRtYV90ZXN0X2lycQkJPSBpZGVfZG1hX3Rlc3RfaXJxLAogCS5kbWFfdGltZW91dAkJPSBpZGVfZG1hX3RpbWVvdXQsCiAJLmRtYV9sb3N0X2lycQkJPSBpZGVfZG1hX2xvc3RfaXJxLAorCS5kbWFfc2ZmX3JlYWRfc3RhdHVzCT0gaWRlX2RtYV9zZmZfcmVhZF9zdGF0dXMsCiB9OwogCiAvKioKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL25zODc0MTUuYyBiL2RyaXZlcnMvaWRlL25zODc0MTUuYwppbmRleCAxMzc4OTA2Li44MzY0M2VkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9uczg3NDE1LmMKKysrIGIvZHJpdmVycy9pZGUvbnM4NzQxNS5jCkBAIC01Niw3ICs1Niw3IEBACiAJcmV0dXJuIHN1cGVyaW9faWRlX2luYihod2lmLT5pb19wb3J0cy5zdGF0dXNfYWRkcik7CiB9CiAKLXN0YXRpYyB1OCBzdXBlcmlvX3JlYWRfc2ZmX2RtYV9zdGF0dXMoaWRlX2h3aWZfdCAqaHdpZikKK3N0YXRpYyB1OCBzdXBlcmlvX2RtYV9zZmZfcmVhZF9zdGF0dXMoaWRlX2h3aWZfdCAqaHdpZikKIHsKIAlyZXR1cm4gc3VwZXJpb19pZGVfaW5iKGh3aWYtPmRtYV9iYXNlICsgQVRBX0RNQV9TVEFUVVMpOwogfQpAQCAtMTA5LDcgKzEwOSw2IEBACiAJLmV4ZWNfY29tbWFuZAkJPSBpZGVfZXhlY19jb21tYW5kLAogCS5yZWFkX3N0YXR1cwkJPSBzdXBlcmlvX3JlYWRfc3RhdHVzLAogCS5yZWFkX2FsdHN0YXR1cwkJPSBpZGVfcmVhZF9hbHRzdGF0dXMsCi0JLnJlYWRfc2ZmX2RtYV9zdGF0dXMJPSBzdXBlcmlvX3JlYWRfc2ZmX2RtYV9zdGF0dXMsCiAKIAkuc2V0X2lycQkJPSBpZGVfc2V0X2lycSwKIApAQCAtMTMyLDE4ICsxMzEsMjAgQEAKIAl0bXAgPSBzdXBlcmlvX2lkZV9pbmIoZG1hX3N0YXQpOwogCW91dGIodG1wIHwgMHg2NiwgZG1hX3N0YXQpOwogfQorI2Vsc2UKKyNkZWZpbmUgc3VwZXJpb19kbWFfc2ZmX3JlYWRfc3RhdHVzIGlkZV9kbWFfc2ZmX3JlYWRfc3RhdHVzCiAjZW5kaWYKIAogc3RhdGljIHVuc2lnbmVkIGludCBuczg3NDE1X2NvdW50ID0gMCwgbnM4NzQxNV9jb250cm9sW01BWF9IV0lGU10gPSB7IDAgfTsKIAogLyoKICAqIFRoaXMgcm91dGluZSBlaXRoZXIgZW5hYmxlcy9kaXNhYmxlcyAoYWNjb3JkaW5nIHRvIElERV9ERkxBR19QUkVTRU5UKQotICogdGhlIElSUSBhc3NvY2lhdGVkIHdpdGggdGhlIHBvcnQgKEhXSUYoZHJpdmUpKSwKKyAqIHRoZSBJUlEgYXNzb2NpYXRlZCB3aXRoIHRoZSBwb3J0LAogICogYW5kIHNlbGVjdHMgZWl0aGVyIFBJTyBvciBETUEgaGFuZHNoYWtpbmcgZm9yIHRoZSBuZXh0IEkvTyBvcGVyYXRpb24uCiAgKi8KIHN0YXRpYyB2b2lkIG5zODc0MTVfcHJlcGFyZV9kcml2ZSAoaWRlX2RyaXZlX3QgKmRyaXZlLCB1bnNpZ25lZCBpbnQgdXNlX2RtYSkKIHsKLQlpZGVfaHdpZl90ICpod2lmID0gSFdJRihkcml2ZSk7CisJaWRlX2h3aWZfdCAqaHdpZiA9IGRyaXZlLT5od2lmOwogCXN0cnVjdCBwY2lfZGV2ICpkZXYgPSB0b19wY2lfZGV2KGh3aWYtPmRldik7CiAJdW5zaWduZWQgaW50IGJpdCwgb3RoZXIsIG5ldywgKm9sZCA9ICh1bnNpZ25lZCBpbnQgKikgaHdpZi0+c2VsZWN0X2RhdGE7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKQEAgLTE5NywxMSArMTk4LDExIEBACiAKIHN0YXRpYyBpbnQgbnM4NzQxNV9kbWFfZW5kKGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKLQlpZGVfaHdpZl90ICAgICAgKmh3aWYgPSBIV0lGKGRyaXZlKTsKKwlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7CiAJdTggZG1hX3N0YXQgPSAwLCBkbWFfY21kID0gMDsKIAogCWRyaXZlLT53YWl0aW5nX2Zvcl9kbWEgPSAwOwotCWRtYV9zdGF0ID0gaHdpZi0+dHBfb3BzLT5yZWFkX3NmZl9kbWFfc3RhdHVzKGh3aWYpOworCWRtYV9zdGF0ID0gaHdpZi0+ZG1hX29wcy0+ZG1hX3NmZl9yZWFkX3N0YXR1cyhod2lmKTsKIAkvKiBnZXQgRE1BIGNvbW1hbmQgbW9kZSAqLwogCWRtYV9jbWQgPSBpbmIoaHdpZi0+ZG1hX2Jhc2UgKyBBVEFfRE1BX0NNRCk7CiAJLyogc3RvcCBETUEgKi8KQEAgLTMwOCw2ICszMDksNyBAQAogCS5kbWFfdGVzdF9pcnEJCT0gaWRlX2RtYV90ZXN0X2lycSwKIAkuZG1hX2xvc3RfaXJxCQk9IGlkZV9kbWFfbG9zdF9pcnEsCiAJLmRtYV90aW1lb3V0CQk9IGlkZV9kbWFfdGltZW91dCwKKwkuZG1hX3NmZl9yZWFkX3N0YXR1cwk9IHN1cGVyaW9fZG1hX3NmZl9yZWFkX3N0YXR1cywKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaWRlX3BvcnRfaW5mbyBuczg3NDE1X2NoaXBzZXQgX19kZXZpbml0ZGF0YSA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL3BhbG1fYmszNzEwLmMgYi9kcml2ZXJzL2lkZS9wYWxtX2JrMzcxMC5jCmluZGV4IDEyMmVkM2MuLmE3YWM0OTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL3BhbG1fYmszNzEwLmMKKysrIGIvZHJpdmVycy9pZGUvcGFsbV9iazM3MTAuYwpAQCAtMzI0LDggKzMyNCw2IEBACiAKIAlod2lmLT5kbWFfYmFzZSA9IGh3aWYtPmlvX3BvcnRzLmRhdGFfYWRkciAtIElERV9QQUxNX0FUQV9QUklfUkVHX09GRlNFVDsKIAotCWh3aWYtPmRtYV9vcHMgPSAmc2ZmX2RtYV9vcHM7Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtMzM4LDYgKzMzNiw3IEBACiBzdGF0aWMgc3RydWN0IGlkZV9wb3J0X2luZm8gX19kZXZpbml0ZGF0YSBwYWxtX2JrMzcxMF9wb3J0X2luZm8gPSB7CiAJLmluaXRfZG1hCQk9IHBhbG1fYmszNzEwX2luaXRfZG1hLAogCS5wb3J0X29wcwkJPSAmcGFsbV9iazM3MTBfcG9ydHNfb3BzLAorCS5kbWFfb3BzCQk9ICZzZmZfZG1hX29wcywKIAkuaG9zdF9mbGFncwkJPSBJREVfSEZMQUdfTU1JTywKIAkucGlvX21hc2sJCT0gQVRBX1BJTzQsCiAJLm13ZG1hX21hc2sJCT0gQVRBX01XRE1BMiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL3BkYzIwMnh4X25ldy5jIGIvZHJpdmVycy9pZGUvcGRjMjAyeHhfbmV3LmMKaW5kZXggMjExYWU0Ni4uZjIxMjkwYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvcGRjMjAyeHhfbmV3LmMKKysrIGIvZHJpdmVycy9pZGUvcGRjMjAyeHhfbmV3LmMKQEAgLTE0Myw3ICsxNDMsNyBAQAogCiBzdGF0aWMgdm9pZCBwZGNuZXdfc2V0X2RtYV9tb2RlKGlkZV9kcml2ZV90ICpkcml2ZSwgY29uc3QgdTggc3BlZWQpCiB7Ci0JaWRlX2h3aWZfdCAqaHdpZgk9IEhXSUYoZHJpdmUpOworCWlkZV9od2lmX3QgKmh3aWYJPSBkcml2ZS0+aHdpZjsKIAlzdHJ1Y3QgcGNpX2RldiAqZGV2CT0gdG9fcGNpX2Rldihod2lmLT5kZXYpOwogCXU4IGFkagkJCT0gKGRyaXZlLT5kbiAmIDEpID8gMHgwOCA6IDB4MDA7CiAKQEAgLTIxOSw3ICsyMTksNyBAQAogCSAqIERlbGV0ZWQgdGhpcyBiZWNhdXNlIGl0IGlzIHJlZHVuZGFudCBmcm9tIHRoZSBjYWxsZXIuCiAJICovCiAJcHJpbnRrKEtFUk5fV0FSTklORyAicGRjMjAyeHhfbmV3OiAlcyBjaGFubmVsIHJlc2V0LlxuIiwKLQkJSFdJRihkcml2ZSktPmNoYW5uZWwgPyAiU2Vjb25kYXJ5IiA6ICJQcmltYXJ5Iik7CisJCWRyaXZlLT5od2lmLT5jaGFubmVsID8gIlNlY29uZGFyeSIgOiAiUHJpbWFyeSIpOwogfQogCiAvKioKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL3BkYzIwMnh4X29sZC5jIGIvZHJpdmVycy9pZGUvcGRjMjAyeHhfb2xkLmMKaW5kZXggNjI0ZTYyZS4uOTcxOTMzMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvcGRjMjAyeHhfb2xkLmMKKysrIGIvZHJpdmVycy9pZGUvcGRjMjAyeHhfb2xkLmMKQEAgLTM5LDcgKzM5LDcgQEAKIAogc3RhdGljIHZvaWQgcGRjMjAyeHhfc2V0X21vZGUoaWRlX2RyaXZlX3QgKmRyaXZlLCBjb25zdCB1OCBzcGVlZCkKIHsKLQlpZGVfaHdpZl90ICpod2lmCT0gSFdJRihkcml2ZSk7CisJaWRlX2h3aWZfdCAqaHdpZgk9IGRyaXZlLT5od2lmOwogCXN0cnVjdCBwY2lfZGV2ICpkZXYJPSB0b19wY2lfZGV2KGh3aWYtPmRldik7CiAJdTggZHJpdmVfcGNpCQk9IDB4NjAgKyAoZHJpdmUtPmRuIDw8IDIpOwogCkBAIC0xNjksOCArMTY5LDggQEAKIAlpZiAoZHJpdmUtPmN1cnJlbnRfc3BlZWQgPiBYRkVSX1VETUFfMikKIAkJcGRjX29sZF9lbmFibGVfNjZNSHpfY2xvY2soZHJpdmUtPmh3aWYpOwogCWlmIChkcml2ZS0+bWVkaWEgIT0gaWRlX2Rpc2sgfHwgKGRyaXZlLT5kZXZfZmxhZ3MgJiBJREVfREZMQUdfTEJBNDgpKSB7Ci0JCXN0cnVjdCByZXF1ZXN0ICpycQk9IEhXR1JPVVAoZHJpdmUpLT5ycTsKLQkJaWRlX2h3aWZfdCAqaHdpZgk9IEhXSUYoZHJpdmUpOworCQlpZGVfaHdpZl90ICpod2lmCT0gZHJpdmUtPmh3aWY7CisJCXN0cnVjdCByZXF1ZXN0ICpycQk9IGh3aWYtPnJxOwogCQl1bnNpZ25lZCBsb25nIGhpZ2hfMTYJPSBod2lmLT5leHRyYV9iYXNlIC0gMTY7CiAJCXVuc2lnbmVkIGxvbmcgYXRhcGlfcmVnCT0gaGlnaF8xNiArIChod2lmLT5jaGFubmVsID8gMHgyNCA6IDB4MjApOwogCQl1MzIgd29yZF9jb3VudAk9IDA7CkBAIC0xODksNyArMTg5LDcgQEAKIHN0YXRpYyBpbnQgcGRjMjAyeHhfZG1hX2VuZChpZGVfZHJpdmVfdCAqZHJpdmUpCiB7CiAJaWYgKGRyaXZlLT5tZWRpYSAhPSBpZGVfZGlzayB8fCAoZHJpdmUtPmRldl9mbGFncyAmIElERV9ERkxBR19MQkE0OCkpIHsKLQkJaWRlX2h3aWZfdCAqaHdpZgk9IEhXSUYoZHJpdmUpOworCQlpZGVfaHdpZl90ICpod2lmCT0gZHJpdmUtPmh3aWY7CiAJCXVuc2lnbmVkIGxvbmcgaGlnaF8xNgk9IGh3aWYtPmV4dHJhX2Jhc2UgLSAxNjsKIAkJdW5zaWduZWQgbG9uZyBhdGFwaV9yZWcJPSBoaWdoXzE2ICsgKGh3aWYtPmNoYW5uZWwgPyAweDI0IDogMHgyMCk7CiAJCXU4IGNsb2NrCQk9IDA7CkBAIC0yMDUsNyArMjA1LDcgQEAKIAogc3RhdGljIGludCBwZGMyMDJ4eF9kbWFfdGVzdF9pcnEoaWRlX2RyaXZlX3QgKmRyaXZlKQogewotCWlkZV9od2lmX3QgKmh3aWYJPSBIV0lGKGRyaXZlKTsKKwlpZGVfaHdpZl90ICpod2lmCT0gZHJpdmUtPmh3aWY7CiAJdW5zaWduZWQgbG9uZyBoaWdoXzE2CT0gaHdpZi0+ZXh0cmFfYmFzZSAtIDE2OwogCXU4IGRtYV9zdGF0CQk9IGluYihod2lmLT5kbWFfYmFzZSArIEFUQV9ETUFfU1RBVFVTKTsKIAl1OCBzYzFkCQkJPSBpbmIoaGlnaF8xNiArIDB4MDAxZCk7CkBAIC0yNDMsNyArMjQzLDcgQEAKIAogc3RhdGljIHZvaWQgcGRjMjAyeHhfcmVzZXQgKGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKLQlpZGVfaHdpZl90ICpod2lmCT0gSFdJRihkcml2ZSk7CisJaWRlX2h3aWZfdCAqaHdpZgk9IGRyaXZlLT5od2lmOwogCWlkZV9od2lmX3QgKm1hdGUJPSBod2lmLT5tYXRlOwogCiAJcGRjMjAyeHhfcmVzZXRfaG9zdChod2lmKTsKQEAgLTMzNyw2ICszMzcsNyBAQAogCS5kbWFfdGVzdF9pcnEJCT0gcGRjMjAyeHhfZG1hX3Rlc3RfaXJxLAogCS5kbWFfbG9zdF9pcnEJCT0gcGRjMjAyeHhfZG1hX2xvc3RfaXJxLAogCS5kbWFfdGltZW91dAkJPSBwZGMyMDJ4eF9kbWFfdGltZW91dCwKKwkuZG1hX3NmZl9yZWFkX3N0YXR1cwk9IGlkZV9kbWFfc2ZmX3JlYWRfc3RhdHVzLAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBpZGVfZG1hX29wcyBwZGMyMDI2eF9kbWFfb3BzID0gewpAQCAtMzQ4LDYgKzM0OSw3IEBACiAJLmRtYV90ZXN0X2lycQkJPSBwZGMyMDJ4eF9kbWFfdGVzdF9pcnEsCiAJLmRtYV9sb3N0X2lycQkJPSBwZGMyMDJ4eF9kbWFfbG9zdF9pcnEsCiAJLmRtYV90aW1lb3V0CQk9IHBkYzIwMnh4X2RtYV90aW1lb3V0LAorCS5kbWFfc2ZmX3JlYWRfc3RhdHVzCT0gaWRlX2RtYV9zZmZfcmVhZF9zdGF0dXMsCiB9OwogCiAjZGVmaW5lIERFQ0xBUkVfUERDMjAyNlhfREVWKHVkbWEsIHNlY3RvcnMpIFwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL3BpaXguYyBiL2RyaXZlcnMvaWRlL3BpaXguYwppbmRleCA2MWQyZDkyLi5mMWUyZTRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9waWl4LmMKKysrIGIvZHJpdmVycy9pZGUvcGlpeC5jCkBAIC02Nyw3ICs2Nyw3IEBACiAKIHN0YXRpYyB2b2lkIHBpaXhfc2V0X3Bpb19tb2RlKGlkZV9kcml2ZV90ICpkcml2ZSwgY29uc3QgdTggcGlvKQogewotCWlkZV9od2lmX3QgKmh3aWYJPSBIV0lGKGRyaXZlKTsKKwlpZGVfaHdpZl90ICpod2lmCT0gZHJpdmUtPmh3aWY7CiAJc3RydWN0IHBjaV9kZXYgKmRldgk9IHRvX3BjaV9kZXYoaHdpZi0+ZGV2KTsKIAlpbnQgaXNfc2xhdmUJCT0gZHJpdmUtPmRuICYgMTsKIAlpbnQgbWFzdGVyX3BvcnQJCT0gaHdpZi0+Y2hhbm5lbCA/IDB4NDIgOiAweDQwOwpAQCAtMTM2LDcgKzEzNiw3IEBACiAKIHN0YXRpYyB2b2lkIHBpaXhfc2V0X2RtYV9tb2RlKGlkZV9kcml2ZV90ICpkcml2ZSwgY29uc3QgdTggc3BlZWQpCiB7Ci0JaWRlX2h3aWZfdCAqaHdpZgk9IEhXSUYoZHJpdmUpOworCWlkZV9od2lmX3QgKmh3aWYJPSBkcml2ZS0+aHdpZjsKIAlzdHJ1Y3QgcGNpX2RldiAqZGV2CT0gdG9fcGNpX2Rldihod2lmLT5kZXYpOwogCXU4IG1hc2xhdmUJCT0gaHdpZi0+Y2hhbm5lbCA/IDB4NDIgOiAweDQwOwogCWludCBhX3NwZWVkCQk9IDMgPDwgKGRyaXZlLT5kbiAqIDQpOwpAQCAtMjI0LDcgKzIyNCw3IEBACiAgKi8KIHN0YXRpYyB2b2lkIGljaF9jbGVhcl9pcnEoaWRlX2RyaXZlX3QgKmRyaXZlKQogewotCWlkZV9od2lmX3QgKmh3aWYgPSBIV0lGKGRyaXZlKTsKKwlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7CiAJdTggZG1hX3N0YXQ7CiAKIAkvKgpAQCAtMjYwLDYgKzI2MCw4IEBACiAJeyAweDI3REYsIDB4MTAzQywgMHgzMEExIH0sCS8qIElDSDcgb24gSFAgQ29tcGFxIG5jMjQwMCAqLwogCXsgMHgyN0RGLCAweDEwNzEsIDB4RDIyMSB9LAkvKiBJQ0g3IG9uIEhlcmN1bGVzIEVDLTkwMCAqLwogCXsgMHgyNENBLCAweDEwMjUsIDB4MDA2MSB9LAkvKiBJQ0g0IG9uIEFjZXIgQXNwaXJlIDIwMjNXTE1pICovCisJeyAweDI0Q0EsIDB4MTAyNSwgMHgwMDNkIH0sCS8qIElDSDQgb24gQUNFUiBUTTI5MCAqLworCXsgMHgyNjZGLCAweDEwMjUsIDB4MDA2NiB9LAkvKiBJQ0g2IG9uIEFDRVIgQXNwaXJlIDE2OTRXTE1pICovCiAJeyAweDI2NTMsIDB4MTA0MywgMHg4MkQ4IH0sCS8qIElDSDZNIG9uIEFzdXMgRWVlIDcwMSAqLwogCS8qIGVuZCBtYXJrZXIgKi8KIAl7IDAsIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL3BtYWMuYyBiL2RyaXZlcnMvaWRlL3BtYWMuYwppbmRleCA3YzQ4MWJiLi43NDYyNWU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9wbWFjLmMKKysrIGIvZHJpdmVycy9pZGUvcG1hYy5jCkBAIC05NTUsNyArOTU1LDYgQEAKIAkuZXhlY19jb21tYW5kCQk9IHBtYWNfZXhlY19jb21tYW5kLAogCS5yZWFkX3N0YXR1cwkJPSBpZGVfcmVhZF9zdGF0dXMsCiAJLnJlYWRfYWx0c3RhdHVzCQk9IGlkZV9yZWFkX2FsdHN0YXR1cywKLQkucmVhZF9zZmZfZG1hX3N0YXR1cwk9IGlkZV9yZWFkX3NmZl9kbWFfc3RhdHVzLAogCiAJLnNldF9pcnEJCT0gcG1hY19zZXRfaXJxLAogCkBAIC0xNTEzLDEwICsxNTEyLDEwIEBACiBzdGF0aWMgaW50CiBwbWFjX2lkZV9kbWFfc2V0dXAoaWRlX2RyaXZlX3QgKmRyaXZlKQogewotCWlkZV9od2lmX3QgKmh3aWYgPSBIV0lGKGRyaXZlKTsKKwlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7CiAJcG1hY19pZGVfaHdpZl90ICpwbWlmID0KIAkJKHBtYWNfaWRlX2h3aWZfdCAqKWRldl9nZXRfZHJ2ZGF0YShod2lmLT5nZW5kZXYucGFyZW50KTsKLQlzdHJ1Y3QgcmVxdWVzdCAqcnEgPSBIV0dST1VQKGRyaXZlKS0+cnE7CisJc3RydWN0IHJlcXVlc3QgKnJxID0gaHdpZi0+cnE7CiAJdTggdW5pdCA9IGRyaXZlLT5kbiAmIDEsIGF0YTQgPSAocG1pZi0+a2luZCA9PSBjb250cm9sbGVyX2tsX2F0YTQpOwogCiAJaWYgKCFwbWFjX2lkZV9idWlsZF9kbWF0YWJsZShkcml2ZSwgcnEpKSB7CkBAIC0xNjM3LDcgKzE2MzYsNyBAQAogCQkJYnJlYWs7CiAJCWlmICgrK3RpbWVvdXQgPiAxMDApIHsKIAkJCXByaW50ayhLRVJOX1dBUk5JTkcgImlkZSVkLCBpZGVfZG1hX3Rlc3RfaXJxIFwKLQkJCXRpbWVvdXQgZmx1c2hpbmcgY2hhbm5lbFxuIiwgSFdJRihkcml2ZSktPmluZGV4KTsKKwkJCXRpbWVvdXQgZmx1c2hpbmcgY2hhbm5lbFxuIiwgaHdpZi0+aW5kZXgpOwogCQkJYnJlYWs7CiAJCX0KIAl9CQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvcTQwaWRlLmMgYi9kcml2ZXJzL2lkZS9xNDBpZGUuYwppbmRleCA0YWY0YThjLi45ZjljMGIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9xNDBpZGUuYworKysgYi9kcml2ZXJzL2lkZS9xNDBpZGUuYwpAQCAtOTksNyArOTksNiBAQAogCS5leGVjX2NvbW1hbmQJCT0gaWRlX2V4ZWNfY29tbWFuZCwKIAkucmVhZF9zdGF0dXMJCT0gaWRlX3JlYWRfc3RhdHVzLAogCS5yZWFkX2FsdHN0YXR1cwkJPSBpZGVfcmVhZF9hbHRzdGF0dXMsCi0JLnJlYWRfc2ZmX2RtYV9zdGF0dXMJPSBpZGVfcmVhZF9zZmZfZG1hX3N0YXR1cywKIAogCS5zZXRfaXJxCQk9IGlkZV9zZXRfaXJxLAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9xZDY1eHguYyBiL2RyaXZlcnMvaWRlL3FkNjV4eC5jCmluZGV4IGJjMjdjN2EuLjViMmUzYWY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9xZDY1eHguYworKysgYi9kcml2ZXJzL2lkZS9xZDY1eHguYwpAQCAtMjAyLDcgKzIwMiw4IEBACiAJCXJlY292ZXJ5X3RpbWUgPSBkcml2ZS0+aWRbQVRBX0lEX0VJREVfUElPXSAtIDEyMDsKIAl9CiAKLQlxZF9zZXRfdGltaW5nKGRyaXZlLCBxZDY1MDBfY29tcHV0ZV90aW1pbmcoSFdJRihkcml2ZSksIGFjdGl2ZV90aW1lLCByZWNvdmVyeV90aW1lKSk7CisJcWRfc2V0X3RpbWluZyhkcml2ZSwgcWQ2NTAwX2NvbXB1dGVfdGltaW5nKGRyaXZlLT5od2lmLAorCQkJCWFjdGl2ZV90aW1lLCByZWNvdmVyeV90aW1lKSk7CiB9CiAKIHN0YXRpYyB2b2lkIHFkNjU4MF9zZXRfcGlvX21vZGUoaWRlX2RyaXZlX3QgKmRyaXZlLCBjb25zdCB1OCBwaW8pCkBAIC0yNDUsMTEgKzI0NiwxMSBAQAogCQlwcmludGsoS0VSTl9JTkZPICIlczogUElPIG1vZGUlZFxuIiwgZHJpdmUtPm5hbWUscGlvKTsKIAl9CiAKLQlpZiAoIUhXSUYoZHJpdmUpLT5jaGFubmVsICYmIGRyaXZlLT5tZWRpYSAhPSBpZGVfZGlzaykgeworCWlmICghaHdpZi0+Y2hhbm5lbCAmJiBkcml2ZS0+bWVkaWEgIT0gaWRlX2Rpc2spIHsKIAkJb3V0YigweDVmLCBRRF9DT05UUk9MX1BPUlQpOwogCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogQVRBUEk6IGRpc2FibGVkIHJlYWQtYWhlYWQgRklGTyAiCiAJCQkiYW5kIHBvc3Qtd3JpdGUgYnVmZmVyIG9uICVzLlxuIiwKLQkJCWRyaXZlLT5uYW1lLCBIV0lGKGRyaXZlKS0+bmFtZSk7CisJCQlkcml2ZS0+bmFtZSwgaHdpZi0+bmFtZSk7CiAJfQogCiAJcWRfc2V0X3RpbWluZyhkcml2ZSwgcWQ2NTgwX2NvbXB1dGVfdGltaW5nKGFjdGl2ZV90aW1lLCByZWNvdmVyeV90aW1lKSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9xZDY1eHguaCBiL2RyaXZlcnMvaWRlL3FkNjV4eC5oCmluZGV4IGM4M2RlYTguLjY2MzZmOTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL3FkNjV4eC5oCisrKyBiL2RyaXZlcnMvaWRlL3FkNjV4eC5oCkBAIC0zMSw4ICszMSw4IEBACiAKICNkZWZpbmUgUURfQ09ORklHKGh3aWYpCQkoKGh3aWYpLT5jb25maWdfZGF0YSAmIDB4MDBmZikKIAotI2RlZmluZSBRRF9USU1JTkcoZHJpdmUpCShieXRlKSgoKGRyaXZlKS0+ZHJpdmVfZGF0YSkgJiAweDAwZmYpCi0jZGVmaW5lIFFEX1RJTVJFRyhkcml2ZSkJKGJ5dGUpKCgoKGRyaXZlKS0+ZHJpdmVfZGF0YSkgJiAweGZmMDApID4+IDgpCisjZGVmaW5lIFFEX1RJTUlORyhkcml2ZSkJKHU4KSgoKGRyaXZlKS0+ZHJpdmVfZGF0YSkgJiAweDAwZmYpCisjZGVmaW5lIFFEX1RJTVJFRyhkcml2ZSkJKHU4KSgoKChkcml2ZSktPmRyaXZlX2RhdGEpICYgMHhmZjAwKSA+PiA4KQogCiAjZGVmaW5lIFFENjUwMF9ERUZfREFUQQkJKChRRF9USU0xX1BPUlQ8PDgpIHwgKFFEX0lEMyA/IDB4MGMgOiAweDA4KSkKICNkZWZpbmUgUUQ2NTgwX0RFRl9EQVRBCQkoKFFEX1RJTTFfUE9SVDw8OCkgfCAoUURfSUQzID8gMHgwYSA6IDB4MDApKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvc2MxMjAwLmMgYi9kcml2ZXJzL2lkZS9zYzEyMDAuYwppbmRleCBlYzdmNzY2Li5kYmRkMjk4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9zYzEyMDAuYworKysgYi9kcml2ZXJzL2lkZS9zYzEyMDAuYwpAQCAtMTI1LDcgKzEyNSw3IEBACiAKIHN0YXRpYyB2b2lkIHNjMTIwMF9zZXRfZG1hX21vZGUoaWRlX2RyaXZlX3QgKmRyaXZlLCBjb25zdCB1OCBtb2RlKQogewotCWlkZV9od2lmX3QJCSpod2lmID0gSFdJRihkcml2ZSk7CisJaWRlX2h3aWZfdAkJKmh3aWYgPSBkcml2ZS0+aHdpZjsKIAlzdHJ1Y3QgcGNpX2RldgkJKmRldiA9IHRvX3BjaV9kZXYoaHdpZi0+ZGV2KTsKIAl1bnNpZ25lZCBpbnQJCXJlZywgdGltaW5nczsKIAl1bnNpZ25lZCBzaG9ydAkJcGNpX2Nsb2NrOwpAQCAtMTcwLDkgKzE3MCw5IEBACiAgKi8KIHN0YXRpYyBpbnQgc2MxMjAwX2RtYV9lbmQoaWRlX2RyaXZlX3QgKmRyaXZlKQogewotCWlkZV9od2lmX3QgKmh3aWYgPSBIV0lGKGRyaXZlKTsKKwlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7CiAJdW5zaWduZWQgbG9uZyBkbWFfYmFzZSA9IGh3aWYtPmRtYV9iYXNlOwotCWJ5dGUgZG1hX3N0YXQ7CisJdTggZG1hX3N0YXQ7CiAKIAlkbWFfc3RhdCA9IGluYihkbWFfYmFzZSsyKTsJCS8qIGdldCBETUEgc3RhdHVzICovCiAKQEAgLTE5OSw3ICsxOTksNyBAQAogCiBzdGF0aWMgdm9pZCBzYzEyMDBfc2V0X3Bpb19tb2RlKGlkZV9kcml2ZV90ICpkcml2ZSwgY29uc3QgdTggcGlvKQogewotCWlkZV9od2lmX3QJKmh3aWYgPSBIV0lGKGRyaXZlKTsKKwlpZGVfaHdpZl90CSpod2lmID0gZHJpdmUtPmh3aWY7CiAJaW50CQltb2RlID0gLTE7CiAKIAkvKgpAQCAtMjkyLDYgKzI5Miw3IEBACiAJLmRtYV90ZXN0X2lycQkJPSBpZGVfZG1hX3Rlc3RfaXJxLAogCS5kbWFfbG9zdF9pcnEJCT0gaWRlX2RtYV9sb3N0X2lycSwKIAkuZG1hX3RpbWVvdXQJCT0gaWRlX2RtYV90aW1lb3V0LAorCS5kbWFfc2ZmX3JlYWRfc3RhdHVzCT0gaWRlX2RtYV9zZmZfcmVhZF9zdGF0dXMsCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGlkZV9wb3J0X2luZm8gc2MxMjAwX2NoaXBzZXQgX19kZXZpbml0ZGF0YSA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL3NjY19wYXRhLmMgYi9kcml2ZXJzL2lkZS9zY2NfcGF0YS5jCmluZGV4IDBmNDhmOWQuLjhkMjMxNGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL3NjY19wYXRhLmMKKysrIGIvZHJpdmVycy9pZGUvc2NjX3BhdGEuYwpAQCAtMTQzLDcgKzE0Myw3IEBACiAJcmV0dXJuICh1OClpbl9iZTMyKCh2b2lkICopaHdpZi0+aW9fcG9ydHMuY3RsX2FkZHIpOwogfQogCi1zdGF0aWMgdTggc2NjX3JlYWRfc2ZmX2RtYV9zdGF0dXMoaWRlX2h3aWZfdCAqaHdpZikKK3N0YXRpYyB1OCBzY2NfZG1hX3NmZl9yZWFkX3N0YXR1cyhpZGVfaHdpZl90ICpod2lmKQogewogCXJldHVybiAodTgpaW5fYmUzMigodm9pZCAqKShod2lmLT5kbWFfYmFzZSArIDQpKTsKIH0KQEAgLTIxNyw3ICsyMTcsNyBAQAogCiBzdGF0aWMgdm9pZCBzY2Nfc2V0X3Bpb19tb2RlKGlkZV9kcml2ZV90ICpkcml2ZSwgY29uc3QgdTggcGlvKQogewotCWlkZV9od2lmX3QgKmh3aWYgPSBIV0lGKGRyaXZlKTsKKwlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7CiAJc3RydWN0IHNjY19wb3J0cyAqcG9ydHMgPSBpZGVfZ2V0X2h3aWZkYXRhKGh3aWYpOwogCXVuc2lnbmVkIGxvbmcgY3RsX2Jhc2UgPSBwb3J0cy0+Y3RsOwogCXVuc2lnbmVkIGxvbmcgY2NrY3RybF9wb3J0ID0gY3RsX2Jhc2UgKyAweGZmMDsKQEAgLTI0OSw3ICsyNDksNyBAQAogCiBzdGF0aWMgdm9pZCBzY2Nfc2V0X2RtYV9tb2RlKGlkZV9kcml2ZV90ICpkcml2ZSwgY29uc3QgdTggc3BlZWQpCiB7Ci0JaWRlX2h3aWZfdCAqaHdpZiA9IEhXSUYoZHJpdmUpOworCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKIAlzdHJ1Y3Qgc2NjX3BvcnRzICpwb3J0cyA9IGlkZV9nZXRfaHdpZmRhdGEoaHdpZik7CiAJdW5zaWduZWQgbG9uZyBjdGxfYmFzZSA9IHBvcnRzLT5jdGw7CiAJdW5zaWduZWQgbG9uZyBjY2tjdHJsX3BvcnQgPSBjdGxfYmFzZSArIDB4ZmYwOwpAQCAtMjU5LDcgKzI1OSw3IEBACiAJdW5zaWduZWQgbG9uZyBzY3Jjc3RfcG9ydCA9IGN0bF9iYXNlICsgMHgwMTQ7CiAJdW5zaWduZWQgbG9uZyB1ZGVudnRfcG9ydCA9IGN0bF9iYXNlICsgMHgwMTg7CiAJdW5zaWduZWQgbG9uZyB0ZHZoc2VsX3BvcnQgICA9IGN0bF9iYXNlICsgMHgwMjA7Ci0JaW50IGlzX3NsYXZlID0gKCZod2lmLT5kcml2ZXNbMV0gPT0gZHJpdmUpOworCWludCBpc19zbGF2ZSA9IGRyaXZlLT5kbiAmIDE7CiAJaW50IG9mZnNldCwgaWR4OwogCXVuc2lnbmVkIGxvbmcgcmVnOwogCXVuc2lnbmVkIGxvbmcgamNhY3RzZWw7CkBAIC0yOTIsNyArMjkyLDcgQEAKIHsKIAlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7CiAJdTggdW5pdCA9IGRyaXZlLT5kbiAmIDE7Ci0JdTggZG1hX3N0YXQgPSBzY2NfaWRlX2luYihod2lmLT5kbWFfYmFzZSArIDQpOworCXU4IGRtYV9zdGF0ID0gc2NjX2RtYV9zZmZfcmVhZF9zdGF0dXMoaHdpZik7CiAKIAlpZiAob24pCiAJCWRtYV9zdGF0IHw9ICgxIDw8ICg1ICsgdW5pdCkpOwpAQCAtMzE2LDcgKzMxNiw3IEBACiBzdGF0aWMgaW50IHNjY19kbWFfc2V0dXAoaWRlX2RyaXZlX3QgKmRyaXZlKQogewogCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKLQlzdHJ1Y3QgcmVxdWVzdCAqcnEgPSBIV0dST1VQKGRyaXZlKS0+cnE7CisJc3RydWN0IHJlcXVlc3QgKnJxID0gaHdpZi0+cnE7CiAJdW5zaWduZWQgaW50IHJlYWRpbmc7CiAJdTggZG1hX3N0YXQ7CiAKQEAgLTMzOCw3ICszMzgsNyBAQAogCW91dF9iZTMyKCh2b2lkIF9faW9tZW0gKilod2lmLT5kbWFfYmFzZSwgcmVhZGluZyk7CiAKIAkvKiByZWFkIERNQSBzdGF0dXMgZm9yIElOVFIgJiBFUlJPUiBmbGFncyAqLwotCWRtYV9zdGF0ID0gaW5fYmUzMigodm9pZCBfX2lvbWVtICopKGh3aWYtPmRtYV9iYXNlICsgNCkpOworCWRtYV9zdGF0ID0gc2NjX2RtYV9zZmZfcmVhZF9zdGF0dXMoaHdpZik7CiAKIAkvKiBjbGVhciBJTlRSICYgRVJST1IgZmxhZ3MgKi8KIAlvdXRfYmUzMigodm9pZCBfX2lvbWVtICopKGh3aWYtPmRtYV9iYXNlICsgNCksIGRtYV9zdGF0IHwgNik7CkBAIC0zNjcsNyArMzY3LDcgQEAKIAkvKiBzdG9wIERNQSAqLwogCXNjY19pZGVfb3V0YihkbWFfY21kICYgfjEsIGh3aWYtPmRtYV9iYXNlKTsKIAkvKiBnZXQgRE1BIHN0YXR1cyAqLwotCWRtYV9zdGF0ID0gc2NjX2lkZV9pbmIoaHdpZi0+ZG1hX2Jhc2UgKyA0KTsKKwlkbWFfc3RhdCA9IHNjY19kbWFfc2ZmX3JlYWRfc3RhdHVzKGh3aWYpOwogCS8qIGNsZWFyIHRoZSBJTlRSICYgRVJST1IgYml0cyAqLwogCXNjY19pZGVfb3V0YihkbWFfc3RhdCB8IDYsIGh3aWYtPmRtYV9iYXNlICsgNCk7CiAJLyogcHVyZ2UgRE1BIG1hcHBpbmdzICovCkBAIC0zODcsNyArMzg3LDcgQEAKIAogc3RhdGljIGludCBzY2NfZG1hX2VuZChpZGVfZHJpdmVfdCAqZHJpdmUpCiB7Ci0JaWRlX2h3aWZfdCAqaHdpZiA9IEhXSUYoZHJpdmUpOworCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKIAl2b2lkIF9faW9tZW0gKmRtYV9iYXNlID0gKHZvaWQgX19pb21lbSAqKWh3aWYtPmRtYV9iYXNlOwogCXVuc2lnbmVkIGxvbmcgaW50c3RzX3BvcnQgPSBod2lmLT5kbWFfYmFzZSArIDB4MDE0OwogCXUzMiByZWc7CkBAIC00MDUsMTcgKzQwNSwxOCBAQAogCQkJICAgICAgIGRyaXZlLT5uYW1lKTsKIAkJCWRhdGFfbG9zcyA9IDE7CiAJCQlpZiAocmV0cnkrKykgewotCQkJCXN0cnVjdCByZXF1ZXN0ICpycSA9IEhXR1JPVVAoZHJpdmUpLT5ycTsKLQkJCQlpbnQgdW5pdDsKKwkJCQlzdHJ1Y3QgcmVxdWVzdCAqcnEgPSBod2lmLT5ycTsKKwkJCQlpZGVfZHJpdmVfdCAqZHJpdmU7CisJCQkJaW50IGk7CisKIAkJCQkvKiBFUlJPUl9SRVNFVCBhbmQgZHJpdmUtPmNyY19jb3VudCBhcmUgbmVlZGVkCiAJCQkJICogdG8gcmVkdWNlIERNQSB0cmFuc2ZlciBtb2RlIGluIHJldHJ5IHByb2Nlc3MuCiAJCQkJICovCiAJCQkJaWYgKHJxKQogCQkJCQlycS0+ZXJyb3JzIHw9IEVSUk9SX1JFU0VUOwotCQkJCWZvciAodW5pdCA9IDA7IHVuaXQgPCBNQVhfRFJJVkVTOyB1bml0KyspIHsKLQkJCQkJaWRlX2RyaXZlX3QgKmRyaXZlID0gJmh3aWYtPmRyaXZlc1t1bml0XTsKKworCQkJCWlkZV9wb3J0X2Zvcl9lYWNoX2RldihpLCBkcml2ZSwgaHdpZikKIAkJCQkJZHJpdmUtPmNyY19jb3VudCsrOwotCQkJCX0KIAkJCX0KIAkJfQogCX0KQEAgLTQ5Niw3ICs0OTcsNyBAQAogLyogcmV0dXJucyAxIGlmIGRtYSBpcnEgaXNzdWVkLCAwIG90aGVyd2lzZSAqLwogc3RhdGljIGludCBzY2NfZG1hX3Rlc3RfaXJxKGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKLQlpZGVfaHdpZl90ICpod2lmID0gSFdJRihkcml2ZSk7CisJaWRlX2h3aWZfdCAqaHdpZiA9IGRyaXZlLT5od2lmOwogCXUzMiBpbnRfc3RhdCA9IGluX2JlMzIoKHZvaWQgX19pb21lbSAqKWh3aWYtPmRtYV9iYXNlICsgMHgwMTQpOwogCiAJLyogU0NDIGVycmF0YSBBMjUyLEEzMDggd29ya2Fyb3VuZDogU3RlcDQgKi8KQEAgLTg1Miw3ICs4NTMsNiBAQAogCS5leGVjX2NvbW1hbmQJCT0gc2NjX2V4ZWNfY29tbWFuZCwKIAkucmVhZF9zdGF0dXMJCT0gc2NjX3JlYWRfc3RhdHVzLAogCS5yZWFkX2FsdHN0YXR1cwkJPSBzY2NfcmVhZF9hbHRzdGF0dXMsCi0JLnJlYWRfc2ZmX2RtYV9zdGF0dXMJPSBzY2NfcmVhZF9zZmZfZG1hX3N0YXR1cywKIAogCS5zZXRfaXJxCQk9IHNjY19zZXRfaXJxLAogCkBAIC04NzksNiArODc5LDcgQEAKIAkuZG1hX3Rlc3RfaXJxCQk9IHNjY19kbWFfdGVzdF9pcnEsCiAJLmRtYV9sb3N0X2lycQkJPSBpZGVfZG1hX2xvc3RfaXJxLAogCS5kbWFfdGltZW91dAkJPSBpZGVfZG1hX3RpbWVvdXQsCisJLmRtYV9zZmZfcmVhZF9zdGF0dXMJPSBzY2NfZG1hX3NmZl9yZWFkX3N0YXR1cywKIH07CiAKICNkZWZpbmUgREVDTEFSRV9TQ0NfREVWKG5hbWVfc3RyKQkJCVwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL3NlcnZlcndvcmtzLmMgYi9kcml2ZXJzL2lkZS9zZXJ2ZXJ3b3Jrcy5jCmluZGV4IDQzN2JjOTEuLjM4MjEwMmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL3NlcnZlcndvcmtzLmMKKysrIGIvZHJpdmVycy9pZGUvc2VydmVyd29ya3MuYwpAQCAtMTUxLDcgKzE1MSw3IEBACiAJc3RhdGljIGNvbnN0IHU4IGRtYV9tb2Rlc1tdCQk9IHsgMHg3NywgMHgyMSwgMHgyMCB9OwogCXN0YXRpYyBjb25zdCB1OCBkcml2ZV9wY2kyW10JCT0geyAweDQ1LCAweDQ0LCAweDQ3LCAweDQ2IH07CiAKLQlpZGVfaHdpZl90ICpod2lmCT0gSFdJRihkcml2ZSk7CisJaWRlX2h3aWZfdCAqaHdpZgk9IGRyaXZlLT5od2lmOwogCXN0cnVjdCBwY2lfZGV2ICpkZXYJPSB0b19wY2lfZGV2KGh3aWYtPmRldik7CiAJdTggdW5pdAkJCT0gZHJpdmUtPmRuICYgMTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvc2V0dXAtcGNpLmMgYi9kcml2ZXJzL2lkZS9zZXR1cC1wY2kuYwppbmRleCA5ZjFmOTE2Li5lODVkMWVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9zZXR1cC1wY2kuYworKysgYi9kcml2ZXJzL2lkZS9zZXR1cC1wY2kuYwpAQCAtMTMwLDcgKzEzMCw3IEBACiAJICogd2UgdHVuZSB0aGUgZHJpdmUgdGhlbiB0cnkgdG8gZ3JhYiBETUEgb3duZXJzaGlwIGlmIHdlIHdhbnQgdG8gYmUKIAkgKiB0aGUgRE1BIGVuZC4gIFRoaXMgaGFzIHRvIGJlIGJlY29tZSBkeW5hbWljIHRvIGhhbmRsZSBob3QtcGx1Zy4KIAkgKi8KLQlkbWFfc3RhdCA9IGh3aWYtPnRwX29wcy0+cmVhZF9zZmZfZG1hX3N0YXR1cyhod2lmKTsKKwlkbWFfc3RhdCA9IGh3aWYtPmRtYV9vcHMtPmRtYV9zZmZfcmVhZF9zdGF0dXMoaHdpZik7CiAJaWYgKChkbWFfc3RhdCAmIDB4ODApICYmIGh3aWYtPm1hdGUgJiYgaHdpZi0+bWF0ZS0+ZG1hX2Jhc2UpIHsKIAkJcHJpbnRrKEtFUk5fSU5GTyAiJXMgJXM6IHNpbXBsZXggZGV2aWNlOiBETUEgZGlzYWJsZWRcbiIsCiAJCQlkLT5uYW1lLCBwY2lfbmFtZShkZXYpKTsKQEAgLTM3Nyw2ICszNzcsOSBAQAogCiAJCWh3aWYtPmRtYV9iYXNlID0gYmFzZTsKIAorCQlpZiAoaHdpZi0+ZG1hX29wcyA9PSBOVUxMKQorCQkJaHdpZi0+ZG1hX29wcyA9ICZzZmZfZG1hX29wczsKKwogCQlpZiAoaWRlX3BjaV9jaGVja19zaW1wbGV4KGh3aWYsIGQpIDwgMCkKIAkJCXJldHVybiAtMTsKIApAQCAtMzkzLDggKzM5Niw2IEBACiAKIAkJaWYgKGlkZV9hbGxvY2F0ZV9kbWFfZW5naW5lKGh3aWYpKQogCQkJcmV0dXJuIC0xOwotCi0JCWh3aWYtPmRtYV9vcHMgPSAmc2ZmX2RtYV9vcHM7CiAJfQogCiAJcmV0dXJuIDA7CkBAIC00NzEsNyArNDcyLDcgQEAKIAkgKi8KIAogCWZvciAocG9ydCA9IDA7IHBvcnQgPCBjaGFubmVsczsgKytwb3J0KSB7Ci0JCWNvbnN0IGlkZV9wY2lfZW5hYmxlYml0X3QgKmUgPSAmKGQtPmVuYWJsZWJpdHNbcG9ydF0pOworCQljb25zdCBzdHJ1Y3QgaWRlX3BjaV9lbmFibGViaXQgKmUgPSAmZC0+ZW5hYmxlYml0c1twb3J0XTsKIAogCQlpZiAoZS0+cmVnICYmIChwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIGUtPnJlZywgJnRtcCkgfHwKIAkJICAgICh0bXAgJiBlLT5tYXNrKSAhPSBlLT52YWwpKSB7CkBAIC01MTksOCArNTIwLDcgQEAKIAlpZiAocmV0IDwgMCkKIAkJZ290byBvdXQ7CiAKLQkvKiBJcyBpdCBhbiAiSURFIHN0b3JhZ2UiIGRldmljZSBpbiBub24tUENJIG1vZGU/ICovCi0JaWYgKChkZXYtPmNsYXNzID4+IDgpID09IFBDSV9DTEFTU19TVE9SQUdFX0lERSAmJiAoZGV2LT5jbGFzcyAmIDUpICE9IDUpIHsKKwlpZiAoaWRlX3BjaV9pc19pbl9jb21wYXRpYmlsaXR5X21vZGUoZGV2KSkgewogCQlpZiAobm9pc3kpCiAJCQlwcmludGsoS0VSTl9JTkZPICIlcyAlczogbm90IDEwMCUlIG5hdGl2ZSBtb2RlOiB3aWxsICIKIAkJCQkicHJvYmUgaXJxcyBsYXRlclxuIiwgZC0+bmFtZSwgcGNpX25hbWUoZGV2KSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9zZ2lpb2M0LmMgYi9kcml2ZXJzL2lkZS9zZ2lpb2M0LmMKaW5kZXggYTY4N2E3ZC4uZmRiOWQ3MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvc2dpaW9jNC5jCisrKyBiL2RyaXZlcnMvaWRlL3NnaWlvYzQuYwpAQCAtMTIzLDcgKzEyMyw3IEBACiBzZ2lpb2M0X2NsZWFyaXJxKGlkZV9kcml2ZV90ICogZHJpdmUpCiB7CiAJdTMyIGludHJfcmVnOwotCWlkZV9od2lmX3QgKmh3aWYgPSBIV0lGKGRyaXZlKTsKKwlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7CiAJc3RydWN0IGlkZV9pb19wb3J0cyAqaW9fcG9ydHMgPSAmaHdpZi0+aW9fcG9ydHM7CiAJdW5zaWduZWQgbG9uZyBvdGhlcl9pciA9IGlvX3BvcnRzLT5pcnFfYWRkciArIChJT0M0X0lOVFJfUkVHIDw8IDIpOwogCkBAIC0xODEsNyArMTgxLDcgQEAKIAogc3RhdGljIHZvaWQgc2dpaW9jNF9kbWFfc3RhcnQoaWRlX2RyaXZlX3QgKmRyaXZlKQogewotCWlkZV9od2lmX3QgKmh3aWYgPSBIV0lGKGRyaXZlKTsKKwlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7CiAJdW5zaWduZWQgbG9uZyBpb2M0X2RtYV9hZGRyID0gaHdpZi0+ZG1hX2Jhc2UgKyBJT0M0X0RNQV9DVFJMICogNDsKIAl1bnNpZ25lZCBpbnQgcmVnID0gcmVhZGwoKHZvaWQgX19pb21lbSAqKWlvYzRfZG1hX2FkZHIpOwogCXVuc2lnbmVkIGludCB0ZW1wX3JlZyA9IHJlZyB8IElPQzRfU19ETUFfU1RBUlQ7CkBAIC0yMDksNyArMjA5LDcgQEAKIHN0YXRpYyBpbnQgc2dpaW9jNF9kbWFfZW5kKGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKIAl1MzIgaW9jNF9kbWEsIGJjX2RldiwgYmNfbWVtLCBudW0sIHZhbGlkID0gMCwgY250ID0gMDsKLQlpZGVfaHdpZl90ICpod2lmID0gSFdJRihkcml2ZSk7CisJaWRlX2h3aWZfdCAqaHdpZiA9IGRyaXZlLT5od2lmOwogCXVuc2lnbmVkIGxvbmcgZG1hX2Jhc2UgPSBod2lmLT5kbWFfYmFzZTsKIAlpbnQgZG1hX3N0YXQgPSAwOwogCXVuc2lnbmVkIGxvbmcgKmVuZGluZ19kbWEgPSBpZGVfZ2V0X2h3aWZkYXRhKGh3aWYpOwpAQCAtMjcxLDcgKzI3MSw3IEBACiAvKiByZXR1cm5zIDEgaWYgZG1hIGlycSBpc3N1ZWQsIDAgb3RoZXJ3aXNlICovCiBzdGF0aWMgaW50IHNnaWlvYzRfZG1hX3Rlc3RfaXJxKGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKLQlyZXR1cm4gc2dpaW9jNF9jaGVja2lycShIV0lGKGRyaXZlKSk7CisJcmV0dXJuIHNnaWlvYzRfY2hlY2tpcnEoZHJpdmUtPmh3aWYpOwogfQogCiBzdGF0aWMgdm9pZCBzZ2lpb2M0X2RtYV9ob3N0X3NldChpZGVfZHJpdmVfdCAqZHJpdmUsIGludCBvbikKQEAgLTM2Nyw3ICszNjcsNyBAQAogc2dpaW9jNF9jb25maWd1cmVfZm9yX2RtYShpbnQgZG1hX2RpcmVjdGlvbiwgaWRlX2RyaXZlX3QgKiBkcml2ZSkKIHsKIAl1MzIgaW9jNF9kbWE7Ci0JaWRlX2h3aWZfdCAqaHdpZiA9IEhXSUYoZHJpdmUpOworCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKIAl1bnNpZ25lZCBsb25nIGRtYV9iYXNlID0gaHdpZi0+ZG1hX2Jhc2U7CiAJdW5zaWduZWQgbG9uZyBpb2M0X2RtYV9hZGRyID0gZG1hX2Jhc2UgKyBJT0M0X0RNQV9DVFJMICogNDsKIAl1MzIgZG1hX2FkZHIsIGVuZGluZ19kbWFfYWRkcjsKQEAgLTQyNyw3ICs0MjcsNyBAQAogc3RhdGljIHVuc2lnbmVkIGludAogc2dpaW9jNF9idWlsZF9kbWFfdGFibGUoaWRlX2RyaXZlX3QgKiBkcml2ZSwgc3RydWN0IHJlcXVlc3QgKnJxLCBpbnQgZGRpcikKIHsKLQlpZGVfaHdpZl90ICpod2lmID0gSFdJRihkcml2ZSk7CisJaWRlX2h3aWZfdCAqaHdpZiA9IGRyaXZlLT5od2lmOwogCXVuc2lnbmVkIGludCAqdGFibGUgPSBod2lmLT5kbWF0YWJsZV9jcHU7CiAJdW5zaWduZWQgaW50IGNvdW50ID0gMCwgaSA9IDE7CiAJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsKQEAgLTQ5Miw3ICs0OTIsNyBAQAogCiBzdGF0aWMgaW50IHNnaWlvYzRfZG1hX3NldHVwKGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKLQlzdHJ1Y3QgcmVxdWVzdCAqcnEgPSBIV0dST1VQKGRyaXZlKS0+cnE7CisJc3RydWN0IHJlcXVlc3QgKnJxID0gZHJpdmUtPmh3aWYtPnJxOwogCXVuc2lnbmVkIGludCBjb3VudCA9IDA7CiAJaW50IGRkaXI7CiAKQEAgLTUyMyw3ICs1MjMsNiBAQAogCS5leGVjX2NvbW1hbmQJCT0gaWRlX2V4ZWNfY29tbWFuZCwKIAkucmVhZF9zdGF0dXMJCT0gc2dpaW9jNF9yZWFkX3N0YXR1cywKIAkucmVhZF9hbHRzdGF0dXMJCT0gaWRlX3JlYWRfYWx0c3RhdHVzLAotCS5yZWFkX3NmZl9kbWFfc3RhdHVzCT0gaWRlX3JlYWRfc2ZmX2RtYV9zdGF0dXMsCiAKIAkuc2V0X2lycQkJPSBpZGVfc2V0X2lycSwKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvc2lpbWFnZS5jIGIvZHJpdmVycy9pZGUvc2lpbWFnZS5jCmluZGV4IDdkNjIyZDIuLmNiMmIzNTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL3NpaW1hZ2UuYworKysgYi9kcml2ZXJzL2lkZS9zaWltYWdlLmMKQEAgLTExNCw3ICsxMTQsNyBAQAogCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgc2lpbWFnZV9zZWxkZXYoaWRlX2RyaXZlX3QgKmRyaXZlLCBpbnQgcikKIHsKLQlpZGVfaHdpZl90ICpod2lmCT0gSFdJRihkcml2ZSk7CisJaWRlX2h3aWZfdCAqaHdpZgk9IGRyaXZlLT5od2lmOwogCXVuc2lnbmVkIGxvbmcgYmFzZQk9ICh1bnNpZ25lZCBsb25nKWh3aWYtPmh3aWZfZGF0YTsKIAl1OCB1bml0CQkJPSBkcml2ZS0+ZG4gJiAxOwogCkBAIC0yNDMsNyArMjQzLDcgQEAKIAlzdGF0aWMgY29uc3QgdTE2IHRmX3NwZWVkW10gICA9IHsgMHgzMjhhLCAweDIyODMsIDB4MTI4MSwgMHgxMGMzLCAweDEwYzEgfTsKIAlzdGF0aWMgY29uc3QgdTE2IGRhdGFfc3BlZWRbXSA9IHsgMHgzMjhhLCAweDIyODMsIDB4MTEwNCwgMHgxMGMzLCAweDEwYzEgfTsKIAotCWlkZV9od2lmX3QgKmh3aWYJPSBIV0lGKGRyaXZlKTsKKwlpZGVfaHdpZl90ICpod2lmCT0gZHJpdmUtPmh3aWY7CiAJc3RydWN0IHBjaV9kZXYgKmRldgk9IHRvX3BjaV9kZXYoaHdpZi0+ZGV2KTsKIAlpZGVfZHJpdmVfdCAqcGFpcgk9IGlkZV9nZXRfcGFpcl9kZXYoZHJpdmUpOwogCXUzMiBzcGVlZHQJCT0gMDsKQEAgLTMwMCw3ICszMDAsNyBAQAogCXN0YXRpYyBjb25zdCB1OCB1bHRyYTVbXSA9IHsgMHgwQywgMHgwNywgMHgwNSwgMHgwNCwgMHgwMiwgMHgwMSB9OwogCXN0YXRpYyBjb25zdCB1MTYgZG1hW10JID0geyAweDIyMDgsIDB4MTBDMiwgMHgxMEMxIH07CiAKLQlpZGVfaHdpZl90ICpod2lmCT0gSFdJRihkcml2ZSk7CisJaWRlX2h3aWZfdCAqaHdpZgk9IGRyaXZlLT5od2lmOwogCXN0cnVjdCBwY2lfZGV2ICpkZXYJPSB0b19wY2lfZGV2KGh3aWYtPmRldik7CiAJdW5zaWduZWQgbG9uZyBiYXNlCT0gKHVuc2lnbmVkIGxvbmcpaHdpZi0+aHdpZl9kYXRhOwogCXUxNiB1bHRyYSA9IDAsIG11bHRpCT0gMDsKQEAgLTM0MCw3ICszNDAsNyBAQAogLyogcmV0dXJucyAxIGlmIGRtYSBpcnEgaXNzdWVkLCAwIG90aGVyd2lzZSAqLwogc3RhdGljIGludCBzaWltYWdlX2lvX2RtYV90ZXN0X2lycShpZGVfZHJpdmVfdCAqZHJpdmUpCiB7Ci0JaWRlX2h3aWZfdCAqaHdpZgk9IEhXSUYoZHJpdmUpOworCWlkZV9od2lmX3QgKmh3aWYJPSBkcml2ZS0+aHdpZjsKIAlzdHJ1Y3QgcGNpX2RldiAqZGV2CT0gdG9fcGNpX2Rldihod2lmLT5kZXYpOwogCXU4IGRtYV9hbHRzdGF0CQk9IDA7CiAJdW5zaWduZWQgbG9uZyBhZGRyCT0gc2lpbWFnZV9zZWxyZWcoaHdpZiwgMSk7CkBAIC0zNjcsNyArMzY3LDcgQEAKIAogc3RhdGljIGludCBzaWltYWdlX21taW9fZG1hX3Rlc3RfaXJxKGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKLQlpZGVfaHdpZl90ICpod2lmCT0gSFdJRihkcml2ZSk7CisJaWRlX2h3aWZfdCAqaHdpZgk9IGRyaXZlLT5od2lmOwogCXVuc2lnbmVkIGxvbmcgYWRkcgk9IHNpaW1hZ2Vfc2VscmVnKGh3aWYsIDB4MSk7CiAJdm9pZCBfX2lvbWVtICpzYXRhX2Vycm9yX2FkZHIKIAkJPSAodm9pZCBfX2lvbWVtICopaHdpZi0+c2F0YV9zY3JbU0FUQV9FUlJPUl9PRkZTRVRdOwpAQCAtNzE3LDYgKzcxNyw3IEBACiAJLmRtYV90ZXN0X2lycQkJPSBzaWltYWdlX2RtYV90ZXN0X2lycSwKIAkuZG1hX3RpbWVvdXQJCT0gaWRlX2RtYV90aW1lb3V0LAogCS5kbWFfbG9zdF9pcnEJCT0gaWRlX2RtYV9sb3N0X2lycSwKKwkuZG1hX3NmZl9yZWFkX3N0YXR1cwk9IGlkZV9kbWFfc2ZmX3JlYWRfc3RhdHVzLAogfTsKIAogI2RlZmluZSBERUNMQVJFX1NJSV9ERVYocF9vcHMpCQkJCVwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL3NpczU1MTMuYyBiL2RyaXZlcnMvaWRlL3NpczU1MTMuYwppbmRleCBhZDMyZTE4Li45ZWMxYTRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9zaXM1NTEzLmMKKysrIGIvZHJpdmVycy9pZGUvc2lzNTUxMy5jCkBAIC0yNzQsNyArMjc0LDcgQEAKIAogc3RhdGljIHZvaWQgY29uZmlnX2RyaXZlX2FydF9yd3AoaWRlX2RyaXZlX3QgKmRyaXZlKQogewotCWlkZV9od2lmX3QgKmh3aWYJPSBIV0lGKGRyaXZlKTsKKwlpZGVfaHdpZl90ICpod2lmCT0gZHJpdmUtPmh3aWY7CiAJc3RydWN0IHBjaV9kZXYgKmRldgk9IHRvX3BjaV9kZXYoaHdpZi0+ZGV2KTsKIAl1OCByZWc0YmgJCT0gMDsKIAl1OCByd19wcmVmZXRjaAkJPSAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvc2w4MmMxMDUuYyBiL2RyaXZlcnMvaWRlL3NsODJjMTA1LmMKaW5kZXggODRkYzMzNi4uNDhjYzc0OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvc2w4MmMxMDUuYworKysgYi9kcml2ZXJzL2lkZS9zbDgyYzEwNS5jCkBAIC0xNDAsNyArMTQwLDcgQEAKICAqLwogc3RhdGljIHZvaWQgc2w4MmMxMDVfZG1hX2xvc3RfaXJxKGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKLQlpZGVfaHdpZl90ICpod2lmCT0gSFdJRihkcml2ZSk7CisJaWRlX2h3aWZfdCAqaHdpZgk9IGRyaXZlLT5od2lmOwogCXN0cnVjdCBwY2lfZGV2ICpkZXYJPSB0b19wY2lfZGV2KGh3aWYtPmRldik7CiAJdTMyIHZhbCwgbWFzawkJPSBod2lmLT5jaGFubmVsID8gQ1RSTF9JREVfSVJRQiA6IENUUkxfSURFX0lSUUE7CiAJdTggZG1hX2NtZDsKQEAgLTE3Nyw3ICsxNzcsNyBAQAogICovCiBzdGF0aWMgdm9pZCBzbDgyYzEwNV9kbWFfc3RhcnQoaWRlX2RyaXZlX3QgKmRyaXZlKQogewotCWlkZV9od2lmX3QgKmh3aWYJPSBIV0lGKGRyaXZlKTsKKwlpZGVfaHdpZl90ICpod2lmCT0gZHJpdmUtPmh3aWY7CiAJc3RydWN0IHBjaV9kZXYgKmRldgk9IHRvX3BjaV9kZXYoaHdpZi0+ZGV2KTsKIAlpbnQgcmVnIAkJPSAweDQ0ICsgZHJpdmUtPmRuICogNDsKIApAQCAtMjk5LDYgKzI5OSw3IEBACiAJLmRtYV90ZXN0X2lycQkJPSBpZGVfZG1hX3Rlc3RfaXJxLAogCS5kbWFfbG9zdF9pcnEJCT0gc2w4MmMxMDVfZG1hX2xvc3RfaXJxLAogCS5kbWFfdGltZW91dAkJPSBzbDgyYzEwNV9kbWFfdGltZW91dCwKKwkuZG1hX3NmZl9yZWFkX3N0YXR1cwk9IGlkZV9kbWFfc2ZmX3JlYWRfc3RhdHVzLAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBpZGVfcG9ydF9pbmZvIHNsODJjMTA1X2NoaXBzZXQgX19kZXZpbml0ZGF0YSA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL3NsYzkwZTY2LmMgYi9kcml2ZXJzL2lkZS9zbGM5MGU2Ni5jCmluZGV4IDBmNzU5ZTQuLjQwYjRiOTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL3NsYzkwZTY2LmMKKysrIGIvZHJpdmVycy9pZGUvc2xjOTBlNjYuYwpAQCAtMjAsNyArMjAsNyBAQAogCiBzdGF0aWMgdm9pZCBzbGM5MGU2Nl9zZXRfcGlvX21vZGUoaWRlX2RyaXZlX3QgKmRyaXZlLCBjb25zdCB1OCBwaW8pCiB7Ci0JaWRlX2h3aWZfdCAqaHdpZgk9IEhXSUYoZHJpdmUpOworCWlkZV9od2lmX3QgKmh3aWYJPSBkcml2ZS0+aHdpZjsKIAlzdHJ1Y3QgcGNpX2RldiAqZGV2CT0gdG9fcGNpX2Rldihod2lmLT5kZXYpOwogCWludCBpc19zbGF2ZQkJPSBkcml2ZS0+ZG4gJiAxOwogCWludCBtYXN0ZXJfcG9ydAkJPSBod2lmLT5jaGFubmVsID8gMHg0MiA6IDB4NDA7CkBAIC03Myw3ICs3Myw3IEBACiAKIHN0YXRpYyB2b2lkIHNsYzkwZTY2X3NldF9kbWFfbW9kZShpZGVfZHJpdmVfdCAqZHJpdmUsIGNvbnN0IHU4IHNwZWVkKQogewotCWlkZV9od2lmX3QgKmh3aWYJPSBIV0lGKGRyaXZlKTsKKwlpZGVfaHdpZl90ICpod2lmCT0gZHJpdmUtPmh3aWY7CiAJc3RydWN0IHBjaV9kZXYgKmRldgk9IHRvX3BjaV9kZXYoaHdpZi0+ZGV2KTsKIAl1OCBtYXNsYXZlCQk9IGh3aWYtPmNoYW5uZWwgPyAweDQyIDogMHg0MDsKIAlpbnQgc2l0cmUgPSAwLCBhX3NwZWVkCT0gNyA8PCAoZHJpdmUtPmRuICogNCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS90Yzg2YzAwMS5jIGIvZHJpdmVycy9pZGUvdGM4NmMwMDEuYwppbmRleCA5M2UyY2NlLi44NDEwOWY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS90Yzg2YzAwMS5jCisrKyBiL2RyaXZlcnMvaWRlL3RjODZjMDAxLmMKQEAgLTE1LDcgKzE1LDcgQEAKIAogc3RhdGljIHZvaWQgdGM4NmMwMDFfc2V0X21vZGUoaWRlX2RyaXZlX3QgKmRyaXZlLCBjb25zdCB1OCBzcGVlZCkKIHsKLQlpZGVfaHdpZl90ICpod2lmCT0gSFdJRihkcml2ZSk7CisJaWRlX2h3aWZfdCAqaHdpZgk9IGRyaXZlLT5od2lmOwogCXVuc2lnbmVkIGxvbmcgc2NyX3BvcnQJPSBod2lmLT5jb25maWdfZGF0YSArIChkcml2ZS0+ZG4gPyAweDAyIDogMHgwMCk7CiAJdTE2IG1vZGUsIHNjcgkJPSBpbncoc2NyX3BvcnQpOwogCkBAIC02MiwxMyArNjIsMTIgQEAKICAqLwogc3RhdGljIGludCB0Yzg2YzAwMV90aW1lcl9leHBpcnkoaWRlX2RyaXZlX3QgKmRyaXZlKQogewotCWlkZV9od2lmX3QgKmh3aWYJPSBIV0lGKGRyaXZlKTsKKwlpZGVfaHdpZl90ICpod2lmCT0gZHJpdmUtPmh3aWY7CiAJaWRlX2V4cGlyeV90ICpleHBpcnkJPSBpZGVfZ2V0X2h3aWZkYXRhKGh3aWYpOwotCWlkZV9od2dyb3VwX3QgKmh3Z3JvdXAJPSBIV0dST1VQKGRyaXZlKTsKIAl1OCBkbWFfc3RhdAkJPSBpbmIoaHdpZi0+ZG1hX2Jhc2UgKyBBVEFfRE1BX1NUQVRVUyk7CiAKIAkvKiBSZXN0b3JlIGEgaGlnaGVyIGxldmVsIGRyaXZlcidzIGV4cGlyeSBoYW5kbGVyIGZpcnN0LiAqLwotCWh3Z3JvdXAtPmV4cGlyeQk9IGV4cGlyeTsKKwlod2lmLT5leHBpcnkgPSBleHBpcnk7CiAKIAlpZiAoKGRtYV9zdGF0ICYgNSkgPT0gMSkgewkvKiBETUEgYWN0aXZlIGFuZCBubyBpbnRlcnJ1cHQgKi8KIAkJdW5zaWduZWQgbG9uZyBzY19iYXNlCT0gaHdpZi0+Y29uZmlnX2RhdGE7CkBAIC0xMTAsMTEgKzEwOSwxMCBAQAogCiBzdGF0aWMgdm9pZCB0Yzg2YzAwMV9kbWFfc3RhcnQoaWRlX2RyaXZlX3QgKmRyaXZlKQogewotCWlkZV9od2lmX3QgKmh3aWYJPSBIV0lGKGRyaXZlKTsKLQlpZGVfaHdncm91cF90ICpod2dyb3VwCT0gSFdHUk9VUChkcml2ZSk7CisJaWRlX2h3aWZfdCAqaHdpZgk9IGRyaXZlLT5od2lmOwogCXVuc2lnbmVkIGxvbmcgc2NfYmFzZQk9IGh3aWYtPmNvbmZpZ19kYXRhOwogCXVuc2lnbmVkIGxvbmcgdHdjcl9wb3J0CT0gc2NfYmFzZSArIChkcml2ZS0+ZG4gPyAweDA2IDogMHgwNCk7Ci0JdW5zaWduZWQgbG9uZyBuc2VjdG9ycwk9IGh3Z3JvdXAtPnJxLT5ucl9zZWN0b3JzOworCXVuc2lnbmVkIGxvbmcgbnNlY3RvcnMJPSBod2lmLT5ycS0+bnJfc2VjdG9yczsKIAogCS8qCiAJICogV2UgaGF2ZSB0byBtYW51YWxseSBsb2FkIHRoZSBzZWN0b3IgY291bnQgYW5kIHNpemUgaW50bwpAQCAtMTI1LDggKzEyMyw4IEBACiAJb3V0dyhTRUNUT1JfU0laRSAvIDIsIHR3Y3JfcG9ydCk7IC8qIFRyYW5zZmVyIFdvcmQgQ291bnQgMS8yICovCiAKIAkvKiBJbnN0YWxsIG91ciB0aW1lb3V0IGV4cGlyeSBob29rLCBzYXZpbmcgdGhlIGN1cnJlbnQgaGFuZGxlci4uLiAqLwotCWlkZV9zZXRfaHdpZmRhdGEoaHdpZiwgaHdncm91cC0+ZXhwaXJ5KTsKLQlod2dyb3VwLT5leHBpcnkgPSAmdGM4NmMwMDFfdGltZXJfZXhwaXJ5OworCWlkZV9zZXRfaHdpZmRhdGEoaHdpZiwgaHdpZi0+ZXhwaXJ5KTsKKwlod2lmLT5leHBpcnkgPSAmdGM4NmMwMDFfdGltZXJfZXhwaXJ5OwogCiAJaWRlX2RtYV9zdGFydChkcml2ZSk7CiB9CkBAIC0xOTAsNiArMTg4LDcgQEAKIAkuZG1hX3Rlc3RfaXJxCQk9IGlkZV9kbWFfdGVzdF9pcnEsCiAJLmRtYV9sb3N0X2lycQkJPSBpZGVfZG1hX2xvc3RfaXJxLAogCS5kbWFfdGltZW91dAkJPSBpZGVfZG1hX3RpbWVvdXQsCisJLmRtYV9zZmZfcmVhZF9zdGF0dXMJPSBpZGVfZG1hX3NmZl9yZWFkX3N0YXR1cywKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaWRlX3BvcnRfaW5mbyB0Yzg2YzAwMV9jaGlwc2V0IF9fZGV2aW5pdGRhdGEgPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS90cmlmbGV4LmMgYi9kcml2ZXJzL2lkZS90cmlmbGV4LmMKaW5kZXggYjZmZjQwMy4uODc3M2MzYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvdHJpZmxleC5jCisrKyBiL2RyaXZlcnMvaWRlL3RyaWZsZXguYwpAQCAtMzYsNyArMzYsNyBAQAogCiBzdGF0aWMgdm9pZCB0cmlmbGV4X3NldF9tb2RlKGlkZV9kcml2ZV90ICpkcml2ZSwgY29uc3QgdTggc3BlZWQpCiB7Ci0JaWRlX2h3aWZfdCAqaHdpZiA9IEhXSUYoZHJpdmUpOworCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKIAlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gdG9fcGNpX2Rldihod2lmLT5kZXYpOwogCXUzMiB0cmlmbGV4X3RpbWluZ3MgPSAwOwogCXUxNiB0aW1pbmcgPSAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvdHJtMjkwLmMgYi9kcml2ZXJzL2lkZS90cm0yOTAuYwppbmRleCAyYTVlYTkwLi5iNmExMjg1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS90cm0yOTAuYworKysgYi9kcml2ZXJzL2lkZS90cm0yOTAuYwpAQCAtMTQ0LDcgKzE0NCw3IEBACiAKIHN0YXRpYyB2b2lkIHRybTI5MF9wcmVwYXJlX2RyaXZlIChpZGVfZHJpdmVfdCAqZHJpdmUsIHVuc2lnbmVkIGludCB1c2VfZG1hKQogewotCWlkZV9od2lmX3QgKmh3aWYgPSBIV0lGKGRyaXZlKTsKKwlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7CiAJdTE2IHJlZyA9IDA7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIApAQCAtMTg0LDcgKzE4NCw3IEBACiBzdGF0aWMgaW50IHRybTI5MF9kbWFfc2V0dXAoaWRlX2RyaXZlX3QgKmRyaXZlKQogewogCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKLQlzdHJ1Y3QgcmVxdWVzdCAqcnEgPSBod2lmLT5od2dyb3VwLT5ycTsKKwlzdHJ1Y3QgcmVxdWVzdCAqcnEgPSBod2lmLT5ycTsKIAl1bnNpZ25lZCBpbnQgY291bnQsIHJ3OwogCiAJaWYgKHJxX2RhdGFfZGlyKHJxKSkgewpAQCAtMjIyLDE1ICsyMjIsMTUgQEAKIAlkcml2ZS0+d2FpdGluZ19mb3JfZG1hID0gMDsKIAkvKiBwdXJnZSBETUEgbWFwcGluZ3MgKi8KIAlpZGVfZGVzdHJveV9kbWF0YWJsZShkcml2ZSk7Ci0Jc3RhdHVzID0gaW53KEhXSUYoZHJpdmUpLT5kbWFfYmFzZSArIDIpOworCXN0YXR1cyA9IGludyhkcml2ZS0+aHdpZi0+ZG1hX2Jhc2UgKyAyKTsKKwogCXJldHVybiBzdGF0dXMgIT0gMHgwMGZmOwogfQogCiBzdGF0aWMgaW50IHRybTI5MF9kbWFfdGVzdF9pcnEoaWRlX2RyaXZlX3QgKmRyaXZlKQogewotCXUxNiBzdGF0dXM7CisJdTE2IHN0YXR1cyA9IGludyhkcml2ZS0+aHdpZi0+ZG1hX2Jhc2UgKyAyKTsKIAotCXN0YXR1cyA9IGludyhIV0lGKGRyaXZlKS0+ZG1hX2Jhc2UgKyAyKTsKIAlyZXR1cm4gc3RhdHVzID09IDB4MDBmZjsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvdHg0OTM5aWRlLmMgYi9kcml2ZXJzL2lkZS90eDQ5MzlpZGUuYwppbmRleCA0YThjNWEyLi44ODJmNmYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS90eDQ5MzlpZGUuYworKysgYi9kcml2ZXJzL2lkZS90eDQ5MzlpZGUuYwpAQCAtMjkzLDcgKzI5Myw3IEBACiB7CiAJaWRlX2h3aWZfdCAqaHdpZiA9IGRyaXZlLT5od2lmOwogCXZvaWQgX19pb21lbSAqYmFzZSA9IFRYNDkzOUlERV9CQVNFKGh3aWYpOwotCXN0cnVjdCByZXF1ZXN0ICpycSA9IGh3aWYtPmh3Z3JvdXAtPnJxOworCXN0cnVjdCByZXF1ZXN0ICpycSA9IGh3aWYtPnJxOwogCXU4IHJlYWRpbmc7CiAJaW50IG5lbnQ7CiAKQEAgLTM5Nyw2ICszOTcsMTcgQEAKIAlyZXR1cm4gZm91bmQ7CiB9CiAKKyNpZmRlZiBfX0JJR19FTkRJQU4KK3N0YXRpYyB1OCB0eDQ5MzlpZGVfZG1hX3NmZl9yZWFkX3N0YXR1cyhpZGVfaHdpZl90ICpod2lmKQoreworCXZvaWQgX19pb21lbSAqYmFzZSA9IFRYNDkzOUlERV9CQVNFKGh3aWYpOworCisJcmV0dXJuIHR4NDkzOWlkZV9yZWFkYihiYXNlLCBUWDQ5MzlJREVfRE1BX1N0YXQpOworfQorI2Vsc2UKKyNkZWZpbmUgdHg0OTM5aWRlX2RtYV9zZmZfcmVhZF9zdGF0dXMgaWRlX2RtYV9zZmZfcmVhZF9zdGF0dXMKKyNlbmRpZgorCiBzdGF0aWMgdm9pZCB0eDQ5MzlpZGVfaW5pdF9od2lmKGlkZV9od2lmX3QgKmh3aWYpCiB7CiAJdm9pZCBfX2lvbWVtICpiYXNlID0gVFg0OTM5SURFX0JBU0UoaHdpZik7CkBAIC00NDMsMTMgKzQ1NCw2IEBACiAKICNpZmRlZiBfX0JJR19FTkRJQU4KIAotc3RhdGljIHU4IHR4NDkzOWlkZV9yZWFkX3NmZl9kbWFfc3RhdHVzKGlkZV9od2lmX3QgKmh3aWYpCi17Ci0Jdm9pZCBfX2lvbWVtICpiYXNlID0gVFg0OTM5SURFX0JBU0UoaHdpZik7Ci0KLQlyZXR1cm4gdHg0OTM5aWRlX3JlYWRiKGJhc2UsIFRYNDkzOUlERV9ETUFfU3RhdCk7Ci19Ci0KIC8qIGN1c3RvbSBpb3BzIChpbmRlcGVuZGVudCBmcm9tIFNXQVBfSU9fU1BBQ0UpICovCiBzdGF0aWMgdTggdHg0OTM5aWRlX2luYih1bnNpZ25lZCBsb25nIHBvcnQpCiB7CkBAIC01ODUsNyArNTg5LDYgQEAKIAkuZXhlY19jb21tYW5kCQk9IGlkZV9leGVjX2NvbW1hbmQsCiAJLnJlYWRfc3RhdHVzCQk9IGlkZV9yZWFkX3N0YXR1cywKIAkucmVhZF9hbHRzdGF0dXMJCT0gaWRlX3JlYWRfYWx0c3RhdHVzLAotCS5yZWFkX3NmZl9kbWFfc3RhdHVzCT0gdHg0OTM5aWRlX3JlYWRfc2ZmX2RtYV9zdGF0dXMsCiAKIAkuc2V0X2lycQkJPSBpZGVfc2V0X2lycSwKIApAQCAtNjA5LDcgKzYxMiw2IEBACiAJLmV4ZWNfY29tbWFuZAkJPSBpZGVfZXhlY19jb21tYW5kLAogCS5yZWFkX3N0YXR1cwkJPSBpZGVfcmVhZF9zdGF0dXMsCiAJLnJlYWRfYWx0c3RhdHVzCQk9IGlkZV9yZWFkX2FsdHN0YXR1cywKLQkucmVhZF9zZmZfZG1hX3N0YXR1cwk9IGlkZV9yZWFkX3NmZl9kbWFfc3RhdHVzLAogCiAJLnNldF9pcnEJCT0gaWRlX3NldF9pcnEsCiAKQEAgLTYzOCw2ICs2NDAsNyBAQAogCS5kbWFfdGVzdF9pcnEJCT0gdHg0OTM5aWRlX2RtYV90ZXN0X2lycSwKIAkuZG1hX2xvc3RfaXJxCQk9IGlkZV9kbWFfbG9zdF9pcnEsCiAJLmRtYV90aW1lb3V0CQk9IGlkZV9kbWFfdGltZW91dCwKKwkuZG1hX3NmZl9yZWFkX3N0YXR1cwk9IHR4NDkzOWlkZV9kbWFfc2ZmX3JlYWRfc3RhdHVzLAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBpZGVfcG9ydF9pbmZvIHR4NDkzOWlkZV9wb3J0X2luZm8gX19pbml0ZGF0YSA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL3VtYzg2NzIuYyBiL2RyaXZlcnMvaWRlL3VtYzg2NzIuYwppbmRleCBlMjk5NzhjLi4wNjA4ZDQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS91bWM4NjcyLmMKKysrIGIvZHJpdmVycy9pZGUvdW1jODY3Mi5jCkBAIC0xMDYsMjIgKzEwNiwyMSBAQAogCiBzdGF0aWMgdm9pZCB1bWNfc2V0X3Bpb19tb2RlKGlkZV9kcml2ZV90ICpkcml2ZSwgY29uc3QgdTggcGlvKQogewotCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKLQlpZGVfaHdncm91cF90ICptYXRlX2h3Z3JvdXAgPSBod2lmLT5tYXRlID8gaHdpZi0+bWF0ZS0+aHdncm91cCA6IE5VTEw7CisJaWRlX2h3aWZfdCAqaHdpZiA9IGRyaXZlLT5od2lmLCAqbWF0ZSA9IGh3aWYtPm1hdGU7CiAJdW5zaWduZWQgbG9uZyB1bmluaXRpYWxpemVkX3ZhcihmbGFncyk7CiAKIAlwcmludGsoIiVzOiBzZXR0aW5nIHVtYzg2NzIgdG8gUElPIG1vZGUlZCAoc3BlZWQgJWQpXG4iLAogCQlkcml2ZS0+bmFtZSwgcGlvLCBwaW9fdG9fdW1jW3Bpb10pOwotCWlmIChtYXRlX2h3Z3JvdXApCi0JCXNwaW5fbG9ja19pcnFzYXZlKCZtYXRlX2h3Z3JvdXAtPmxvY2ssIGZsYWdzKTsKLQlpZiAobWF0ZV9od2dyb3VwICYmIG1hdGVfaHdncm91cC0+aGFuZGxlcikgeworCWlmIChtYXRlKQorCQlzcGluX2xvY2tfaXJxc2F2ZSgmbWF0ZS0+bG9jaywgZmxhZ3MpOworCWlmIChtYXRlICYmIG1hdGUtPmhhbmRsZXIpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJ1bWM4NjcyOiBvdGhlciBpbnRlcmZhY2UgaXMgYnVzeTogZXhpdGluZyB0dW5lX3VtYygpXG4iKTsKIAl9IGVsc2UgewogCQljdXJyZW50X3NwZWVkc1tkcml2ZS0+bmFtZVsyXSAtICdhJ10gPSBwaW9fdG9fdW1jW3Bpb107CiAJCXVtY19zZXRfc3BlZWRzKGN1cnJlbnRfc3BlZWRzKTsKIAl9Ci0JaWYgKG1hdGVfaHdncm91cCkKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWF0ZV9od2dyb3VwLT5sb2NrLCBmbGFncyk7CisJaWYgKG1hdGUpCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1hdGUtPmxvY2ssIGZsYWdzKTsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBpZGVfcG9ydF9vcHMgdW1jODY3Ml9wb3J0X29wcyA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL3ZpYTgyY3h4eC5jIGIvZHJpdmVycy9pZGUvdmlhODJjeHh4LmMKaW5kZXggMmE4MTJkMy4uZmVjYzBlMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvdmlhODJjeHh4LmMKKysrIGIvZHJpdmVycy9pZGUvdmlhODJjeHh4LmMKQEAgLTE3OCw3ICsxNzgsNyBAQAogCQlpZGVfdGltaW5nX21lcmdlKCZwLCAmdCwgJnQsIElERV9USU1JTkdfOEJJVCk7CiAJfQogCi0JdmlhX3NldF9zcGVlZChIV0lGKGRyaXZlKSwgZHJpdmUtPmRuLCAmdCk7CisJdmlhX3NldF9zcGVlZChod2lmLCBkcml2ZS0+ZG4sICZ0KTsKIH0KIAogLyoqCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkbGUvaTczMDBfaWRsZS5jIGIvZHJpdmVycy9pZGxlL2k3MzAwX2lkbGUuYwppbmRleCBmYjE3NmY2Li4xN2U4ZGRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkbGUvaTczMDBfaWRsZS5jCisrKyBiL2RyaXZlcnMvaWRsZS9pNzMwMF9pZGxlLmMKQEAgLTE3Nyw3ICsxNzcsNyBAQAogfQogCiBzdGF0aWMgc3RydWN0IGRldmljZSBkdW1teV9kbWFfZGV2ID0gewotCS5idXNfaWQgPSAiZmFsbGJhY2sgZGV2aWNlIiwKKwkuaW5pdF9uYW1lID0gImZhbGxiYWNrIGRldmljZSIsCiAJLmNvaGVyZW50X2RtYV9tYXNrID0gRE1BXzY0QklUX01BU0ssCiAJLmRtYV9tYXNrID0gJmR1bW15X2RtYV9kZXYuY29oZXJlbnRfZG1hX21hc2ssCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZWVlMTM5NC9jc3IuYyBiL2RyaXZlcnMvaWVlZTEzOTQvY3NyLmMKaW5kZXggYzkwYmU0MC4uMzE0MDBjOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZWVlMTM5NC9jc3IuYworKysgYi9kcml2ZXJzL2llZWUxMzk0L2Nzci5jCkBAIC02OCwyMiArNjgsMjIgQEAKIAkuaG9zdF9yZXNldCA9CWhvc3RfcmVzZXQsCiB9OwogCi1zdGF0aWMgc3RydWN0IGhwc2JfYWRkcmVzc19vcHMgbWFwX29wcyA9IHsKK2NvbnN0IHN0YXRpYyBzdHJ1Y3QgaHBzYl9hZGRyZXNzX29wcyBtYXBfb3BzID0gewogCS5yZWFkID0gcmVhZF9tYXBzLAogfTsKIAotc3RhdGljIHN0cnVjdCBocHNiX2FkZHJlc3Nfb3BzIGZjcF9vcHMgPSB7Citjb25zdCBzdGF0aWMgc3RydWN0IGhwc2JfYWRkcmVzc19vcHMgZmNwX29wcyA9IHsKIAkud3JpdGUgPSB3cml0ZV9mY3AsCiB9OwogCi1zdGF0aWMgc3RydWN0IGhwc2JfYWRkcmVzc19vcHMgcmVnX29wcyA9IHsKK2NvbnN0IHN0YXRpYyBzdHJ1Y3QgaHBzYl9hZGRyZXNzX29wcyByZWdfb3BzID0gewogCS5yZWFkID0gcmVhZF9yZWdzLAogCS53cml0ZSA9IHdyaXRlX3JlZ3MsCiAJLmxvY2sgPSBsb2NrX3JlZ3MsCiAJLmxvY2s2NCA9IGxvY2s2NF9yZWdzLAogfTsKIAotc3RhdGljIHN0cnVjdCBocHNiX2FkZHJlc3Nfb3BzIGNvbmZpZ19yb21fb3BzID0geworY29uc3Qgc3RhdGljIHN0cnVjdCBocHNiX2FkZHJlc3Nfb3BzIGNvbmZpZ19yb21fb3BzID0gewogCS5yZWFkID0gcmVhZF9jb25maWdfcm9tLAogfTsKIApAQCAtMjE3LDcgKzIxNyw3IEBACiAKIAlob3N0LT5jc3IuZ2VuZXJhdGlvbiA9IDI7CiAKLQlidXNfaW5mb1sxXSA9IF9fY29uc3RhbnRfY3B1X3RvX2JlMzIoMHgzMTMzMzkzNCk7CisJYnVzX2luZm9bMV0gPSBJRUVFMTM5NF9CVVNJRF9NQUdJQzsKIAlidXNfaW5mb1syXSA9IGNwdV90b19iZTMyKChocHNiX2Rpc2FibGVfaXJtID8gMCA6IDEgPDwgQ1NSX0lSTUNfU0hJRlQpIHwKIAkJCQkgICgxIDw8IENTUl9DTUNfU0hJRlQpIHwKIAkJCQkgICgxIDw8IENTUl9JU0NfU0hJRlQpIHwKQEAgLTI1MCw3ICsyNTAsNyBAQAogewogCXF1YWRsZXRfdCBidXNfaW5mb1tDU1JfQlVTX0lORk9fU0laRV07CiAKLQlidXNfaW5mb1sxXSA9IF9fY29uc3RhbnRfY3B1X3RvX2JlMzIoMHgzMTMzMzkzNCk7CisJYnVzX2luZm9bMV0gPSBJRUVFMTM5NF9CVVNJRF9NQUdJQzsKIAlidXNfaW5mb1syXSA9IGNwdV90b19iZTMyKCgwIDw8IENTUl9JUk1DX1NISUZUKSB8CiAJCQkJICAoMCA8PCBDU1JfQ01DX1NISUZUKSB8CiAJCQkJICAoMCA8PCBDU1JfSVNDX1NISUZUKSB8CmRpZmYgLS1naXQgYS9kcml2ZXJzL2llZWUxMzk0L2Nzci5oIGIvZHJpdmVycy9pZWVlMTM5NC9jc3IuaAppbmRleCBmMTE1NDY1Li45MGZiM2YyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2llZWUxMzk0L2Nzci5oCisrKyBiL2RyaXZlcnMvaWVlZTEzOTQvY3NyLmgKQEAgLTUwLDExICs1MCwxMSBAQAogI2RlZmluZSBDU1JfTUFYX1JPTV9TSElGVAkJOAogI2RlZmluZSBDU1JfR0VORVJBVElPTl9TSElGVAkJNAogCi0jZGVmaW5lIENTUl9TRVRfQlVTX0lORk9fR0VORVJBVElPTihjc3IsIGdlbikJCQkJXAotCSgoY3NyKS0+YnVzX2luZm9fZGF0YVsyXSA9CQkJCQlcCi0JCWNwdV90b19iZTMyKChiZTMyX3RvX2NwdSgoY3NyKS0+YnVzX2luZm9fZGF0YVsyXSkgJglcCi0JCQkgICAgIH4oMHhmIDw8IENTUl9HRU5FUkFUSU9OX1NISUZUKSkgfAkJXAotCQkJICAgIChnZW4pIDw8IENTUl9HRU5FUkFUSU9OX1NISUZUKSkKK3N0YXRpYyBpbmxpbmUgdm9pZCBjc3Jfc2V0X2J1c19pbmZvX2dlbmVyYXRpb24oc3RydWN0IGNzcjEyMTJfY3NyICpjc3IsIHU4IGdlbikKK3sKKwljc3ItPmJ1c19pbmZvX2RhdGFbMl0gJj0gfmNwdV90b19iZTMyKDB4ZiA8PCBDU1JfR0VORVJBVElPTl9TSElGVCk7CisJY3NyLT5idXNfaW5mb19kYXRhWzJdIHw9IGNwdV90b19iZTMyKCh1MzIpZ2VuIDw8IENTUl9HRU5FUkFUSU9OX1NISUZUKTsKK30KIAogc3RydWN0IGNzcl9jb250cm9sIHsKIAlzcGlubG9ja190IGxvY2s7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2llZWUxMzk0L2NzcjEyMTIuYyBiL2RyaXZlcnMvaWVlZTEzOTQvY3NyMTIxMi5jCmluZGV4IDVlMzhhNjguLmE2ZGZlYjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWVlZTEzOTQvY3NyMTIxMi5jCisrKyBiL2RyaXZlcnMvaWVlZTEzOTQvY3NyMTIxMi5jCkBAIC0xMDc3LDE1ICsxMDc3LDEwIEBACiAJaW50IGk7CiAJaW50IHJldDsKIAotCS8qIElFRUUgMTIxMiBzYXlzIHRoYXQgdGhlIGVudGlyZSBidXMgaW5mbyBibG9jayBzaG91bGQgYmUgcmVhZGFibGUgaW4KLQkgKiBhIHNpbmdsZSB0cmFuc2FjdGlvbiByZWdhcmRsZXNzIG9mIHRoZSBtYXhfcm9tIHZhbHVlLgotCSAqIFVuZm9ydHVuYXRlbHksIG1hbnkgSUVFRSAxMzk0IGRldmljZXMgZG8gbm90IGFiaWRlIGJ5IHRoYXQsIHNvIHRoZQotCSAqIGJ1cyBpbmZvIGJsb2NrIHdpbGwgYmUgcmVhZCAxIHF1YWRsZXQgYXQgYSB0aW1lLiAgVGhlIHJlc3Qgb2YgdGhlCi0JICogQ29uZmlnUk9NIHdpbGwgYmUgcmVhZCBhY2NvcmRpbmcgdG8gdGhlIG1heF9yb20gZmllbGQuICovCiAJZm9yIChpID0gMDsgaSA8IGNzci0+YnVzX2luZm9fbGVuOyBpICs9IHNpemVvZih1MzIpKSB7CiAJCXJldCA9IGNzci0+b3BzLT5idXNfcmVhZChjc3IsIENTUjEyMTJfQ09ORklHX1JPTV9TUEFDRV9CQVNFICsgaSwKLQkJCXNpemVvZih1MzIpLCAmY3NyLT5jYWNoZV9oZWFkLT5kYXRhW2J5dGVzX3RvX3F1YWRzKGkpXSwKLQkJCWNzci0+cHJpdmF0ZSk7CisJCQkJJmNzci0+Y2FjaGVfaGVhZC0+ZGF0YVtieXRlc190b19xdWFkcyhpKV0sCisJCQkJY3NyLT5wcml2YXRlKTsKIAkJaWYgKHJldCAhPSBDU1IxMjEyX1NVQ0NFU1MpCiAJCQlyZXR1cm4gcmV0OwogCkBAIC0xMTA0LDggKzEwOTksOCBAQAogCSAqIGEgdGltZS4gKi8KIAlmb3IgKGkgPSBjc3ItPmJ1c19pbmZvX2xlbjsgaSA8PSBjc3ItPmNyY19sZW47IGkgKz0gc2l6ZW9mKHUzMikpIHsKIAkJcmV0ID0gY3NyLT5vcHMtPmJ1c19yZWFkKGNzciwgQ1NSMTIxMl9DT05GSUdfUk9NX1NQQUNFX0JBU0UgKyBpLAotCQkJc2l6ZW9mKHUzMiksICZjc3ItPmNhY2hlX2hlYWQtPmRhdGFbYnl0ZXNfdG9fcXVhZHMoaSldLAotCQkJY3NyLT5wcml2YXRlKTsKKwkJCQkmY3NyLT5jYWNoZV9oZWFkLT5kYXRhW2J5dGVzX3RvX3F1YWRzKGkpXSwKKwkJCQljc3ItPnByaXZhdGUpOwogCQlpZiAocmV0ICE9IENTUjEyMTJfU1VDQ0VTUykKIAkJCXJldHVybiByZXQ7CiAJfQpAQCAtMTI4OSw3ICsxMjg0LDcgQEAKIAogCQlpZiAoY3NyLT5vcHMtPmJ1c19yZWFkKGNzciwKIAkJCQkgICAgICAgQ1NSMTIxMl9SRUdJU1RFUl9TUEFDRV9CQVNFICsga3YtPm9mZnNldCwKLQkJCQkgICAgICAgc2l6ZW9mKHUzMiksICZxLCBjc3ItPnByaXZhdGUpKQorCQkJCSAgICAgICAmcSwgY3NyLT5wcml2YXRlKSkKIAkJCXJldHVybiAtRUlPOwogCiAJCWt2LT52YWx1ZS5sZWFmLmxlbiA9IGJlMzJfdG9fY3B1KHEpID4+IDE2OwpAQCAtMTM3MiwxNyArMTM2Nyw4IEBACiAJCWFkZHIgPSAoQ1NSMTIxMl9DU1JfQVJDSF9SRUdfU1BBQ0VfQkFTRSArIGNhY2hlLT5vZmZzZXQgKwogCQkJY3ItPm9mZnNldF9lbmQpICYgfihjc3ItPm1heF9yb20gLSAxKTsKIAotCQlpZiAoY3NyLT5vcHMtPmJ1c19yZWFkKGNzciwgYWRkciwgY3NyLT5tYXhfcm9tLCBjYWNoZV9wdHIsCi0JCQkJICAgICAgIGNzci0+cHJpdmF0ZSkpIHsKLQkJCWlmIChjc3ItPm1heF9yb20gPT0gNCkKLQkJCQkvKiBXZSd2ZSBnb3QgcHJvYmxlbXMhICovCi0JCQkJcmV0dXJuIC1FSU87Ci0KLQkJCS8qIEFwcGVyZW50bHkgdGhlIG1heF9yb20gdmFsdWUgd2FzIGEgbGllLCBzZXQgaXQgdG8KLQkJCSAqIGRvIHF1YWRsZXQgcmVhZHMgYW5kIHRyeSBhZ2Fpbi4gKi8KLQkJCWNzci0+bWF4X3JvbSA9IDQ7Ci0JCQljb250aW51ZTsKLQkJfQorCQlpZiAoY3NyLT5vcHMtPmJ1c19yZWFkKGNzciwgYWRkciwgY2FjaGVfcHRyLCBjc3ItPnByaXZhdGUpKQorCQkJcmV0dXJuIC1FSU87CiAKIAkJY3ItPm9mZnNldF9lbmQgKz0gY3NyLT5tYXhfcm9tIC0gKGNyLT5vZmZzZXRfZW5kICYKIAkJCQkJCSAgKGNzci0+bWF4X3JvbSAtIDEpKTsKQEAgLTE0MzMsNyArMTQxOSw2IEBACiAKIGludCBjc3IxMjEyX3BhcnNlX2NzcihzdHJ1Y3QgY3NyMTIxMl9jc3IgKmNzcikKIHsKLQlzdGF0aWMgY29uc3QgaW50IG1yX21hcFtdID0geyA0LCA2NCwgMTAyNCwgMCB9OwogCXN0cnVjdCBjc3IxMjEyX2RlbnRyeSAqZGVudHJ5OwogCWludCByZXQ7CiAKQEAgLTE0NDMsMTUgKzE0MjgsMTMgQEAKIAlpZiAocmV0ICE9IENTUjEyMTJfU1VDQ0VTUykKIAkJcmV0dXJuIHJldDsKIAotCWlmICghY3NyLT5vcHMtPmdldF9tYXhfcm9tKSB7Ci0JCWNzci0+bWF4X3JvbSA9IG1yX21hcFswXTsJLyogZGVmYXVsdCB2YWx1ZSAqLwotCX0gZWxzZSB7Ci0JCWludCBpID0gY3NyLT5vcHMtPmdldF9tYXhfcm9tKGNzci0+YnVzX2luZm9fZGF0YSwKLQkJCQkJICAgICAgY3NyLT5wcml2YXRlKTsKLQkJaWYgKGkgJiB+MHgzKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWNzci0+bWF4X3JvbSA9IG1yX21hcFtpXTsKLQl9CisJLyoKKwkgKiBUaGVyZSBoYXMgYmVlbiBhIGJ1Z2d5IGZpcm13YXJlIHdpdGggYnVzX2luZm9fYmxvY2subWF4X3JvbSA+IDAKKwkgKiBzcG90dGVkIHdoaWNoIGFjdHVhbGx5IG9ubHkgc3VwcG9ydGVkIHF1YWRsZXQgcmVhZCByZXF1ZXN0cyB0byB0aGUKKwkgKiBjb25maWcgUk9NLiAgVGhlcmVmb3JlIHJlYWQgZXZlcnl0aGluZyBxdWFkbGV0IGJ5IHF1YWRsZXQgcmVnYXJkbGVzcworCSAqIG9mIHdoYXQgdGhlIGJ1cyBpbmZvIGJsb2NrIHNheXMuCisJICovCisJY3NyLT5tYXhfcm9tID0gNDsKIAogCWNzci0+Y2FjaGVfaGVhZC0+bGF5b3V0X2hlYWQgPSBjc3ItPnJvb3Rfa3Y7CiAJY3NyLT5jYWNoZV9oZWFkLT5sYXlvdXRfdGFpbCA9IGNzci0+cm9vdF9rdjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWVlZTEzOTQvY3NyMTIxMi5oIGIvZHJpdmVycy9pZWVlMTM5NC9jc3IxMjEyLmgKaW5kZXggMDQzMDM5Zi4uYTg5MmQ5MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZWVlMTM5NC9jc3IxMjEyLmgKKysrIGIvZHJpdmVycy9pZWVlMTM5NC9jc3IxMjEyLmgKQEAgLTE4MSw3ICsxODEsNyBAQAogc3RydWN0IGNzcjEyMTJfY3NyIHsKIAlzaXplX3QgYnVzX2luZm9fbGVuOwkvKiBidXMgaW5mbyBibG9jayBsZW5ndGggaW4gYnl0ZXMgKi8KIAlzaXplX3QgY3JjX2xlbjsJCS8qIGNyYyBsZW5ndGggaW4gYnl0ZXMgKi8KLQl1MzIgKmJ1c19pbmZvX2RhdGE7CS8qIGJ1cyBpbmZvIGRhdGEgaW5jbCBidXMgbmFtZSBhbmQgRVVJICovCisJX19iZTMyICpidXNfaW5mb19kYXRhOwkvKiBidXMgaW5mbyBkYXRhIGluY2wgYnVzIG5hbWUgYW5kIEVVSSAqLwogCiAJdm9pZCAqcHJpdmF0ZTsJCS8qIHByaXZhdGUsIGJ1cyBzcGVjaWZpYyBkYXRhICovCiAJc3RydWN0IGNzcjEyMTJfYnVzX29wcyAqb3BzOwpAQCAtMjAwLDcgKzIwMCw3IEBACiAJICogZW50cmllcyBsb2NhdGVkIGluIHRoZSBVbml0cyBTcGFjZS4gIE11c3QgcmV0dXJuIDAgb24gc3VjY2VzcwogCSAqIGFueXRoaW5nIGVsc2UgaW5kaWNhdGVzIGFuIGVycm9yLiAqLwogCWludCAoKmJ1c19yZWFkKSAoc3RydWN0IGNzcjEyMTJfY3NyICpjc3IsIHU2NCBhZGRyLAotCQkJIHUxNiBsZW5ndGgsIHZvaWQgKmJ1ZmZlciwgdm9pZCAqcHJpdmF0ZSk7CisJCQkgdm9pZCAqYnVmZmVyLCB2b2lkICpwcml2YXRlKTsKIAogCS8qIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBieSBjc3IxMjEyIHRvIGFsbG9jYXRlIGEgcmVnaW9uIGluIHVuaXRzIHNwYWNlCiAJICogaW4gdGhlIGV2ZW50IHRoYXQgQ29uZmlnIFJPTSBlbnRyaWVzIGRvbid0IGFsbCBmaXQgaW4gdGhlIHByZWRlZmluZWQKQEAgLTIxMSwxMSArMjExLDYgQEAKIAkvKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYnkgY3NyMTIxMiB0byByZWxlYXNlIGEgcmVnaW9uIGluIHVuaXRzIHNwYWNlCiAJICogdGhhdCBpcyBubyBsb25nZXIgbmVlZGVkLiAqLwogCXZvaWQgKCpyZWxlYXNlX2FkZHIpICh1NjQgYWRkciwgdm9pZCAqcHJpdmF0ZSk7Ci0KLQkvKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYnkgY3NyMTIxMiB0byBkZXRlcm1pbmUgdGhlIG1heCByZWFkIHJlcXVlc3QKLQkgKiBzdXBwb3J0ZWQgYnkgYSByZW1vdGUgbm9kZSB3aGVuIHJlYWRpbmcgdGhlIENvbmZpZ1JPTSBzcGFjZS4gIE11c3QKLQkgKiByZXR1cm4gMCwgMSwgb3IgMiBwZXIgSUVFRSAxMjEyLiAgKi8KLQlpbnQgKCpnZXRfbWF4X3JvbSkgKHUzMiAqYnVzX2luZm8sIHZvaWQgKnByaXZhdGUpOwogfTsKIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2llZWUxMzk0L2R2MTM5NC1wcml2YXRlLmggYi9kcml2ZXJzL2llZWUxMzk0L2R2MTM5NC1wcml2YXRlLmgKaW5kZXggN2QxZDI4NC4uMThiOTJjYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZWVlMTM5NC9kdjEzOTQtcHJpdmF0ZS5oCisrKyBiL2RyaXZlcnMvaWVlZTEzOTQvZHYxMzk0LXByaXZhdGUuaApAQCAtNzcsMTEgKzc3LDExIEBACiAgICBTZWUgdGhlIFRleGFzIEluc3RydW1lbnRzIE9IQ0kgMTM5NCBjaGlwc2V0IGRvY3VtZW50YXRpb24uCiAqLwogCi1zdHJ1Y3Qgb3V0cHV0X21vcmVfaW1tZWRpYXRlIHsgdTMyIHFbOF07IH07Ci1zdHJ1Y3Qgb3V0cHV0X21vcmUgeyB1MzIgcVs0XTsgfTsKLXN0cnVjdCBvdXRwdXRfbGFzdCB7IHUzMiBxWzRdOyB9Owotc3RydWN0IGlucHV0X21vcmUgeyB1MzIgcVs0XTsgfTsKLXN0cnVjdCBpbnB1dF9sYXN0IHsgdTMyIHFbNF07IH07CitzdHJ1Y3Qgb3V0cHV0X21vcmVfaW1tZWRpYXRlIHsgX19sZTMyIHFbOF07IH07CitzdHJ1Y3Qgb3V0cHV0X21vcmUgeyBfX2xlMzIgcVs0XTsgfTsKK3N0cnVjdCBvdXRwdXRfbGFzdCB7IF9fbGUzMiBxWzRdOyB9Oworc3RydWN0IGlucHV0X21vcmUgeyBfX2xlMzIgcVs0XTsgfTsKK3N0cnVjdCBpbnB1dF9sYXN0IHsgX19sZTMyIHFbNF07IH07CiAKIC8qIG91dHB1dHMgKi8KIApAQCAtOTIsOSArOTIsOSBAQAogCQkJCQkgICAgICB1bnNpZ25lZCBpbnQgIHBheWxvYWRfc2l6ZSkKIHsKIAlvbWktPnFbMF0gPSBjcHVfdG9fbGUzMigweDAyMDAwMDAwIHwgOCk7IC8qIE9VVFBVVF9NT1JFX0lNTUVESUFURTsgOCBpcyB0aGUgc2l6ZSBvZiB0aGUgSVQgaGVhZGVyICovCi0Jb21pLT5xWzFdID0gMDsKLQlvbWktPnFbMl0gPSAwOwotCW9taS0+cVszXSA9IDA7CisJb21pLT5xWzFdID0gY3B1X3RvX2xlMzIoMCk7CisJb21pLT5xWzJdID0gY3B1X3RvX2xlMzIoMCk7CisJb21pLT5xWzNdID0gY3B1X3RvX2xlMzIoMCk7CiAKIAkvKiBJVCBwYWNrZXQgaGVhZGVyICovCiAJb21pLT5xWzRdID0gY3B1X3RvX2xlMzIoICAoMHgwIDw8IDE2KSAgLyogSUVFRTEzOTRfU1BFRURfMTAwICovCkBAIC0xMDYsOCArMTA2LDggQEAKIAkvKiByZXNlcnZlZCBmaWVsZDsgbWltaWMgYmVoYXZpb3Igb2YgbXkgU29ueSBEU1ItNDAgKi8KIAlvbWktPnFbNV0gPSBjcHVfdG9fbGUzMigocGF5bG9hZF9zaXplIDw8IDE2KSB8ICgweDdGIDw8IDgpIHwgMHhBMCk7CiAKLQlvbWktPnFbNl0gPSAwOwotCW9taS0+cVs3XSA9IDA7CisJb21pLT5xWzZdID0gY3B1X3RvX2xlMzIoMCk7CisJb21pLT5xWzddID0gY3B1X3RvX2xlMzIoMCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBmaWxsX291dHB1dF9tb3JlKHN0cnVjdCBvdXRwdXRfbW9yZSAqb20sCkBAIC0xMTYsOCArMTE2LDggQEAKIHsKIAlvbS0+cVswXSA9IGNwdV90b19sZTMyKGRhdGFfc2l6ZSk7CiAJb20tPnFbMV0gPSBjcHVfdG9fbGUzMihkYXRhX3BoeXNfYWRkcik7Ci0Jb20tPnFbMl0gPSAwOwotCW9tLT5xWzNdID0gMDsKKwlvbS0+cVsyXSA9IGNwdV90b19sZTMyKDApOworCW9tLT5xWzNdID0gY3B1X3RvX2xlMzIoMCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBmaWxsX291dHB1dF9sYXN0KHN0cnVjdCBvdXRwdXRfbGFzdCAqb2wsCkBAIC0xNDAsOCArMTQwLDggQEAKIAogCW9sLT5xWzBdID0gY3B1X3RvX2xlMzIodGVtcCk7CiAJb2wtPnFbMV0gPSBjcHVfdG9fbGUzMihkYXRhX3BoeXNfYWRkcik7Ci0Jb2wtPnFbMl0gPSAwOwotCW9sLT5xWzNdID0gMDsKKwlvbC0+cVsyXSA9IGNwdV90b19sZTMyKDApOworCW9sLT5xWzNdID0gY3B1X3RvX2xlMzIoMCk7CiB9CiAKIC8qIGlucHV0cyAqLwpAQCAtMTYxLDggKzE2MSw4IEBACiAKIAlpbS0+cVswXSA9IGNwdV90b19sZTMyKHRlbXApOwogCWltLT5xWzFdID0gY3B1X3RvX2xlMzIoZGF0YV9waHlzX2FkZHIpOwotCWltLT5xWzJdID0gMDsgLyogYnJhbmNoQWRkcmVzcyBhbmQgWiBub3QgdXNlIGluIHBhY2tldC1wZXItYnVmZmVyIG1vZGUgKi8KLQlpbS0+cVszXSA9IDA7IC8qIHhmZXJTdGF0dXMgJiByZXNDb3VudCwgcmVzQ291bnQgbXVzdCBiZSBpbml0aWFsaXplIHRvIGRhdGFfc2l6ZSAqLworCWltLT5xWzJdID0gY3B1X3RvX2xlMzIoMCk7IC8qIGJyYW5jaEFkZHJlc3MgYW5kIFogbm90IHVzZSBpbiBwYWNrZXQtcGVyLWJ1ZmZlciBtb2RlICovCisJaW0tPnFbM10gPSBjcHVfdG9fbGUzMigwKTsgLyogeGZlclN0YXR1cyAmIHJlc0NvdW50LCByZXNDb3VudCBtdXN0IGJlIGluaXRpYWxpemUgdG8gZGF0YV9zaXplICovCiB9CiAgCiBzdGF0aWMgaW5saW5lIHZvaWQgZmlsbF9pbnB1dF9sYXN0KHN0cnVjdCBpbnB1dF9sYXN0ICppbCwKQEAgLTMzMSw3ICszMzEsNyBAQAogCiAJLyogcG9pbnRzIHRvIHN0YXR1cy90aW1lc3RhbXAgZmllbGQgb2YgZmlyc3QgRE1BIHBhY2tldCAqLwogCS8qICh3ZSdsbCBjaGVjayBpdCBsYXRlciB0byBtb25pdG9yIHRpbWVzdGFtcCBhY2N1cmFjeSkgKi8KLQl1MzIgKmZyYW1lX2JlZ2luX3RpbWVzdGFtcDsKKwlfX2xlMzIgKmZyYW1lX2JlZ2luX3RpbWVzdGFtcDsKIAogCS8qIHRoZSB0aW1lc3RhbXAgd2UgYXNzaWduZWQgdG8gdGhlIGZpcnN0IHBhY2tldCBpbiB0aGUgZnJhbWUgKi8KIAl1MzIgYXNzaWduZWRfdGltZXN0YW1wOwpAQCAtMzQ4LDE1ICszNDgsMTUgQEAKIAkgICB0aGF0IGNhbiBjYXVzZSBpbnRlcnJ1cHRzLiBXZSdsbCBjaGVjayB0aGVzZSBmcm9tIHRoZQogCSAgIGludGVycnVwdCBoYW5kbGVyLgogCSovCi0JdTMyICptaWRfZnJhbWVfdGltZXN0YW1wOwotCXUzMiAqZnJhbWVfZW5kX3RpbWVzdGFtcDsKKwlfX2xlMzIgKm1pZF9mcmFtZV90aW1lc3RhbXA7CisJX19sZTMyICpmcmFtZV9lbmRfdGltZXN0YW1wOwogCiAJLyogYnJhbmNoIGFkZHJlc3MgZmllbGQgb2YgZmluYWwgcGFja2V0LiBUaGlzIGlzIGVmZmVjdGl2ZWx5CiAJICAgdGhlICJ0YWlsIiBpbiB0aGUgY2hhaW4gb2YgRE1BIGRlc2NyaXB0b3IgYmxvY2tzLgogCSAgIFdlIHdpbGwgZmlsbCBpdCB3aXRoIHRoZSBhZGRyZXNzIG9mIHRoZSBmaXJzdCBETUEgZGVzY3JpcHRvcgogCSAgIGJsb2NrIGluIHRoZSBzdWJzZXF1ZW50IGZyYW1lLCBvbmNlIGl0IGlzIHJlYWR5LgogCSovCi0JdTMyICpmcmFtZV9lbmRfYnJhbmNoOworCV9fbGUzMiAqZnJhbWVfZW5kX2JyYW5jaDsKIAogCS8qIHRoZSBudW1iZXIgb2YgZGVzY3JpcHRvcnMgaW4gdGhlIGZpcnN0IGRlc2NyaXB0b3IgYmxvY2sKIAkgICBvZiB0aGUgZnJhbWUuIE5lZWRlZCB0byBzdGFydCBETUEgKi8KQEAgLTM2NSwxMCArMzY1LDEwIEBACiAKIAogc3RydWN0IHBhY2tldCB7Ci0JdTE2CXRpbWVzdGFtcDsKKwlfX2xlMTYJdGltZXN0YW1wOwogCXUxNglpbnZhbGlkOwogCXUxNglpc29faGVhZGVyOwotCXUxNglkYXRhX2xlbmd0aDsKKwlfX2xlMTYJZGF0YV9sZW5ndGg7CiAJdTMyCWNpcF9oMTsKIAl1MzIJY2lwX2gyOwogCXVuc2lnbmVkIGNoYXIgZGF0YVs0ODBdOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZWVlMTM5NC9kdjEzOTQuYyBiL2RyaXZlcnMvaWVlZTEzOTQvZHYxMzk0LmMKaW5kZXggYzE5ZjIzMi4uYTMyOWU2YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZWVlMTM5NC9kdjEzOTQuYworKysgYi9kcml2ZXJzL2llZWUxMzk0L2R2MTM5NC5jCkBAIC0yNjUsNyArMjY1LDcgQEAKIAkvKiB0aGVzZSBmbGFncyBkZW5vdGUgcGFja2V0cyB0aGF0IG5lZWQgc3BlY2lhbCBhdHRlbnRpb24gKi8KIAlpbnQgZW1wdHlfcGFja2V0LCBmaXJzdF9wYWNrZXQsIGxhc3RfcGFja2V0LCBtaWRfcGFja2V0OwogCi0JdTMyICpicmFuY2hfYWRkcmVzcywgKmxhc3RfYnJhbmNoX2FkZHJlc3MgPSBOVUxMOworCV9fbGUzMiAqYnJhbmNoX2FkZHJlc3MsICpsYXN0X2JyYW5jaF9hZGRyZXNzID0gTlVMTDsKIAl1bnNpZ25lZCBsb25nIGRhdGFfcDsKIAlpbnQgZmlyc3RfcGFja2V0X2VtcHR5ID0gMDsKIAl1MzIgY3ljbGVUaW1lciwgY3Rfc2VjLCBjdF9jeWMsIGN0X29mZjsKQEAgLTg0OCw3ICs4NDgsNyBAQAogCWRtYV9hZGRyX3QgYmxvY2tfZG1hID0gMDsKIAlzdHJ1Y3QgcGFja2V0ICpkYXRhID0gTlVMTDsKIAlkbWFfYWRkcl90IGRhdGFfZG1hID0gMDsKLQl1MzIgKmxhc3RfYnJhbmNoX2FkZHJlc3MgPSBOVUxMOworCV9fbGUzMiAqbGFzdF9icmFuY2hfYWRkcmVzcyA9IE5VTEw7CiAJdW5zaWduZWQgbG9uZyBpcnFfZmxhZ3M7CiAJaW50IHdhbnRfaW50ZXJydXB0ID0gMDsKIAlzdHJ1Y3QgZnJhbWUgKmYgPSBOVUxMOwpAQCAtMjExMCwxNyArMjExMCwxNyBAQAogCQkJZiA9IHZpZGVvLT5mcmFtZXNbbmV4dF9pIC8gTUFYX1BBQ0tFVFNdOwogCQkJbmV4dCA9ICYoZi0+ZGVzY3JpcHRvcl9wb29sW25leHRfaSAlIE1BWF9QQUNLRVRTXSk7CiAJCQluZXh0X2RtYSA9ICgodW5zaWduZWQgbG9uZykgYmxvY2sgLSAodW5zaWduZWQgbG9uZykgZi0+ZGVzY3JpcHRvcl9wb29sKSArIGYtPmRlc2NyaXB0b3JfcG9vbF9kbWE7Ci0JCQluZXh0LT51LmluLmlsLnFbMF0gfD0gMyA8PCAyMDsgLyogZW5hYmxlIGludGVycnVwdCAqLwotCQkJbmV4dC0+dS5pbi5pbC5xWzJdID0gMDsgLyogZGlzYWJsZSBicmFuY2ggKi8KKwkJCW5leHQtPnUuaW4uaWwucVswXSB8PSBjcHVfdG9fbGUzMigzIDw8IDIwKTsgLyogZW5hYmxlIGludGVycnVwdCAqLworCQkJbmV4dC0+dS5pbi5pbC5xWzJdID0gY3B1X3RvX2xlMzIoMCk7IC8qIGRpc2FibGUgYnJhbmNoICovCiAKIAkJCS8qIGxpbmsgcHJldmlvdXMgdG8gbmV4dCAqLwogCQkJcHJldl9pID0gKG5leHRfaSA9PSAwKSA/IChNQVhfUEFDS0VUUyAqIHZpZGVvLT5uX2ZyYW1lcyAtIDEpIDogKG5leHRfaSAtIDEpOwogCQkJZiA9IHZpZGVvLT5mcmFtZXNbcHJldl9pIC8gTUFYX1BBQ0tFVFNdOwogCQkJcHJldiA9ICYoZi0+ZGVzY3JpcHRvcl9wb29sW3ByZXZfaSAlIE1BWF9QQUNLRVRTXSk7CiAJCQlpZiAocHJldl9pICUgKE1BWF9QQUNLRVRTLzIpKSB7Ci0JCQkJcHJldi0+dS5pbi5pbC5xWzBdICY9IH4oMyA8PCAyMCk7IC8qIG5vIGludGVycnVwdCAqLworCQkJCXByZXYtPnUuaW4uaWwucVswXSAmPSB+Y3B1X3RvX2xlMzIoMyA8PCAyMCk7IC8qIG5vIGludGVycnVwdCAqLwogCQkJfSBlbHNlIHsKLQkJCQlwcmV2LT51LmluLmlsLnFbMF0gfD0gMyA8PCAyMDsgLyogZW5hYmxlIGludGVycnVwdCAqLworCQkJCXByZXYtPnUuaW4uaWwucVswXSB8PSBjcHVfdG9fbGUzMigzIDw8IDIwKTsgLyogZW5hYmxlIGludGVycnVwdCAqLwogCQkJfQogCQkJcHJldi0+dS5pbi5pbC5xWzJdID0gY3B1X3RvX2xlMzIobmV4dF9kbWEgfCAxKTsgLyogc2V0IFo9MSAqLwogCQkJd21iKCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2llZWUxMzk0L2V0aDEzOTQuYyBiL2RyaXZlcnMvaWVlZTEzOTQvZXRoMTM5NC5jCmluZGV4IDIwMTI4NjkuLjFhOTE5ZGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWVlZTEzOTQvZXRoMTM5NC5jCisrKyBiL2RyaXZlcnMvaWVlZTEzOTQvZXRoMTM5NC5jCkBAIC05Miw3ICs5Miw3IEBACiAJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwogCXUxNiBkZ2w7CiAJdTE2IGRnX3NpemU7Ci0JdTE2IGV0aGVyX3R5cGU7CisJX19iZTE2IGV0aGVyX3R5cGU7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAljaGFyICpwYnVmOwogCXN0cnVjdCBsaXN0X2hlYWQgZnJhZ19pbmZvOwpAQCAtMTgxLDcgKzE4MSw3IEBACiBzdGF0aWMgdm9pZCBldGhlcjEzOTRfaG9zdF9yZXNldChzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0KTsKIAogLyogRnVuY3Rpb24gZm9yIGluY29taW5nIDEzOTQgcGFja2V0cyAqLwotc3RhdGljIHN0cnVjdCBocHNiX2FkZHJlc3Nfb3BzIGFkZHJfb3BzID0geworY29uc3Qgc3RhdGljIHN0cnVjdCBocHNiX2FkZHJlc3Nfb3BzIGFkZHJfb3BzID0gewogCS53cml0ZSA9CWV0aGVyMTM5NF93cml0ZSwKIH07CiAKQEAgLTI0NSwxMiArMjQ1LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotLyogUmV0dXJuIHN0YXRpc3RpY3MgdG8gdGhlIGNhbGxlciAqLwotc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpldGhlcjEzOTRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLQlyZXR1cm4gJigoKHN0cnVjdCBldGgxMzk0X3ByaXYgKiluZXRkZXZfcHJpdihkZXYpKS0+c3RhdHMpOwotfQotCiAvKiBGSVhNRTogV2hhdCB0byBkbyBpZiB3ZSB0aW1lb3V0PyBJIHRoaW5rIGEgaG9zdCByZXNldCBpcyBwcm9iYWJseSBpbiBvcmRlciwKICAqIHNvIHRoYXQncyB3aGF0IHdlIGRvLiBTaG91bGQgd2UgaW5jcmVtZW50IHRoZSBzdGF0IGNvdW50ZXJzIHRvbz8gICovCiBzdGF0aWMgdm9pZCBldGhlcjEzOTRfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQpAQCAtNTE2LDE2ICs1MTAsMTkgQEAKIAkucGFyc2UJCT0gZXRoZXIxMzk0X2hlYWRlcl9wYXJzZSwKIH07CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgZXRoZXIxMzk0X25ldGRldl9vcHMgPSB7CisJLm5kb19vcGVuCT0gZXRoZXIxMzk0X29wZW4sCisJLm5kb19zdG9wCT0gZXRoZXIxMzk0X3N0b3AsCisJLm5kb19zdGFydF94bWl0CT0gZXRoZXIxMzk0X3R4LAorCS5uZG9fdHhfdGltZW91dAk9IGV0aGVyMTM5NF90eF90aW1lb3V0LAorCS5uZG9fY2hhbmdlX210dQk9IGV0aGVyMTM5NF9jaGFuZ2VfbXR1LAorfTsKKwogc3RhdGljIHZvaWQgZXRoZXIxMzk0X2luaXRfZGV2KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0JZGV2LT5vcGVuCQk9IGV0aGVyMTM5NF9vcGVuOwotCWRldi0+c3RvcAkJPSBldGhlcjEzOTRfc3RvcDsKLQlkZXYtPmhhcmRfc3RhcnRfeG1pdAk9IGV0aGVyMTM5NF90eDsKLQlkZXYtPmdldF9zdGF0cwkJPSBldGhlcjEzOTRfc3RhdHM7Ci0JZGV2LT50eF90aW1lb3V0CQk9IGV0aGVyMTM5NF90eF90aW1lb3V0OwotCWRldi0+Y2hhbmdlX210dQkJPSBldGhlcjEzOTRfY2hhbmdlX210dTsKIAogCWRldi0+aGVhZGVyX29wcwkJPSAmZXRoZXIxMzk0X2hlYWRlcl9vcHM7CisJZGV2LT5uZXRkZXZfb3BzCQk9ICZldGhlcjEzOTRfbmV0ZGV2X29wczsKIAogCVNFVF9FVEhUT09MX09QUyhkZXYsICZldGh0b29sX29wcyk7CiAKQEAgLTc2Nyw3ICs3NjQsNyBAQAogc3RhdGljIGludCBldGhlcjEzOTRfaGVhZGVyX2NhY2hlKGNvbnN0IHN0cnVjdCBuZWlnaGJvdXIgKm5laWdoLAogCQkJCSAgc3RydWN0IGhoX2NhY2hlICpoaCkKIHsKLQl1bnNpZ25lZCBzaG9ydCB0eXBlID0gaGgtPmhoX3R5cGU7CisJX19iZTE2IHR5cGUgPSBoaC0+aGhfdHlwZTsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbmVpZ2gtPmRldjsKIAlzdHJ1Y3QgZXRoMTM5NGhkciAqZXRoID0KIAkJKHN0cnVjdCBldGgxMzk0aGRyICopKCh1OCAqKWhoLT5oaF9kYXRhICsgMTYgLSBFVEgxMzk0X0hMRU4pOwpAQCAtNzk1LDcgKzc5Miw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKiBDb3BpZWQgZnJvbSBuZXQvZXRoZXJuZXQvZXRoLmMgKi8KLXN0YXRpYyB1MTYgZXRoZXIxMzk0X3R5cGVfdHJhbnMoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3N0YXRpYyBfX2JlMTYgZXRoZXIxMzk0X3R5cGVfdHJhbnMoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgZXRoMTM5NGhkciAqZXRoOwogCXVuc2lnbmVkIGNoYXIgKnJhd3A7CkBAIC04MjksMTcgKzgyNiwxNyBAQAogCiAvKiBQYXJzZSBhbiBlbmNhcHN1bGF0ZWQgSVAxMzk0IGhlYWRlciBpbnRvIGFuIGV0aGVybmV0IGZyYW1lIHBhY2tldC4KICAqIFdlIGFsc28gcGVyZm9ybSBBUlAgdHJhbnNsYXRpb24gaGVyZSwgaWYgbmVlZCBiZS4gICovCi1zdGF0aWMgdTE2IGV0aGVyMTM5NF9wYXJzZV9lbmNhcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorc3RhdGljIF9fYmUxNiBldGhlcjEzOTRfcGFyc2VfZW5jYXAoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKIAkJCQkgbm9kZWlkX3Qgc3JjaWQsIG5vZGVpZF90IGRlc3RpZCwKLQkJCQkgdTE2IGV0aGVyX3R5cGUpCisJCQkJIF9fYmUxNiBldGhlcl90eXBlKQogewogCXN0cnVjdCBldGgxMzk0X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwotCXU2NCBkZXN0X2h3OwotCXVuc2lnbmVkIHNob3J0IHJldCA9IDA7CisJX19iZTY0IGRlc3RfaHc7CisJX19iZTE2IHJldCA9IDA7CiAKIAkvKiBTZXR1cCBvdXIgaHcgYWRkcmVzc2VzLiBXZSB1c2UgdGhlc2UgdG8gYnVpbGQgdGhlIGV0aGVybmV0IGhlYWRlci4gKi8KIAlpZiAoZGVzdGlkID09IChMT0NBTF9CVVMgfCBBTExfTk9ERVMpKQotCQlkZXN0X2h3ID0gfjBVTEw7ICAvKiBicm9hZGNhc3QgKi8KKwkJZGVzdF9odyA9IH5jcHVfdG9fYmU2NCgwKTsgIC8qIGJyb2FkY2FzdCAqLwogCWVsc2UKIAkJZGVzdF9odyA9IGNwdV90b19iZTY0KCh1NjQpcHJpdi0+aG9zdC0+Y3NyLmd1aWRfaGkgPDwgMzIgfAogCQkJCSAgICAgIHByaXYtPmhvc3QtPmNzci5ndWlkX2xvKTsKQEAgLTg3Myw3ICs4NzAsNyBAQAogCQlub2RlID0gZXRoMTM5NF9maW5kX25vZGVfZ3VpZCgmcHJpdi0+aXBfbm9kZV9saXN0LAogCQkJCQkgICAgICBiZTY0X3RvX2NwdShndWlkKSk7CiAJCWlmICghbm9kZSkKLQkJCXJldHVybiAwOworCQkJcmV0dXJuIGNwdV90b19iZTE2KDApOwogCiAJCW5vZGVfaW5mbyA9CiAJCSAgICAoc3RydWN0IGV0aDEzOTRfbm9kZV9pbmZvICopbm9kZS0+dWQtPmRldmljZS5kcml2ZXJfZGF0YTsKQEAgLTEwNjMsNyArMTA2MCw3IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3QgZXRoMTM5NF9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAl1bmlvbiBldGgxMzk0X2hkciAqaGRyID0gKHVuaW9uIGV0aDEzOTRfaGRyICopYnVmOwotCXUxNiBldGhlcl90eXBlID0gMDsgIC8qIGluaXRpYWxpemVkIHRvIGNsZWFyIHdhcm5pbmcgKi8KKwlfX2JlMTYgZXRoZXJfdHlwZSA9IGNwdV90b19iZTE2KDApOyAgLyogaW5pdGlhbGl6ZWQgdG8gY2xlYXIgd2FybmluZyAqLwogCWludCBoZHJfbGVuOwogCXN0cnVjdCB1bml0X2RpcmVjdG9yeSAqdWQgPSBwcml2LT51ZF9saXN0W05PREVJRF9UT19OT0RFKHNyY2lkKV07CiAJc3RydWN0IGV0aDEzOTRfbm9kZV9pbmZvICpub2RlX2luZm87CkBAIC0xMDc1LDcgKzEwNzIsNyBAQAogCQkJSFBTQl9QUklOVChLRVJOX0VSUiwgImV0aGVyMTM5NCByeDogc2VuZGVyIG5vZGVpZCAiCiAJCQkJICAgImxvb2t1cCBmYWlsdXJlOiAiIE5PREVfQlVTX0ZNVCwKIAkJCQkgICBOT0RFX0JVU19BUkdTKHByaXYtPmhvc3QsIHNyY2lkKSk7Ci0JCQlwcml2LT5zdGF0cy5yeF9kcm9wcGVkKys7CisJCQlkZXYtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKIAkJCXJldHVybiAtMTsKIAkJfQogCQl1ZCA9IG5vZGUtPnVkOwpAQCAtMTA5OCw3ICsxMDk1LDcgQEAKIAkJc2tiID0gZGV2X2FsbG9jX3NrYihsZW4gKyBkZXYtPmhhcmRfaGVhZGVyX2xlbiArIDE1KTsKIAkJaWYgKHVubGlrZWx5KCFza2IpKSB7CiAJCQlFVEgxMzk0X1BSSU5UX0coS0VSTl9FUlIsICJPdXQgb2YgbWVtb3J5XG4iKTsKLQkJCXByaXYtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJCWRldi0+c3RhdHMucnhfZHJvcHBlZCsrOwogCQkJcmV0dXJuIC0xOwogCQl9CiAJCXNrYl9yZXNlcnZlKHNrYiwgKGRldi0+aGFyZF9oZWFkZXJfbGVuICsgMTUpICYgfjE1KTsKQEAgLTEyMTcsMTUgKzEyMTQsMTUgQEAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwogCiAJaWYgKCFza2ItPnByb3RvY29sKSB7Ci0JCXByaXYtPnN0YXRzLnJ4X2Vycm9ycysrOwotCQlwcml2LT5zdGF0cy5yeF9kcm9wcGVkKys7CisJCWRldi0+c3RhdHMucnhfZXJyb3JzKys7CisJCWRldi0+c3RhdHMucnhfZHJvcHBlZCsrOwogCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOwogCX0gZWxzZSBpZiAobmV0aWZfcngoc2tiKSA9PSBORVRfUlhfRFJPUCkgewotCQlwcml2LT5zdGF0cy5yeF9lcnJvcnMrKzsKLQkJcHJpdi0+c3RhdHMucnhfZHJvcHBlZCsrOworCQlkZXYtPnN0YXRzLnJ4X2Vycm9ycysrOworCQlkZXYtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKIAl9IGVsc2UgewotCQlwcml2LT5zdGF0cy5yeF9wYWNrZXRzKys7Ci0JCXByaXYtPnN0YXRzLnJ4X2J5dGVzICs9IHNrYi0+bGVuOworCQlkZXYtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwkJZGV2LT5zdGF0cy5yeF9ieXRlcyArPSBza2ItPmxlbjsKIAl9CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CkBAIC0xMjM0LDggKzEyMzEsNiBAQAogCWlmIChuZXRpZl9xdWV1ZV9zdG9wcGVkKGRldikpCiAJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKIAotCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtMTI1OSw3ICsxMjU0LDcgQEAKIAogc3RhdGljIHZvaWQgZXRoZXIxMzk0X2lzbyhzdHJ1Y3QgaHBzYl9pc28gKmlzbykKIHsKLQlxdWFkbGV0X3QgKmRhdGE7CisJX19iZTMyICpkYXRhOwogCWNoYXIgKmJ1ZjsKIAlzdHJ1Y3QgZXRoMTM5NF9ob3N0X2luZm8gKmhpOwogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CkBAIC0xMjgzLDcgKzEyNzgsNyBAQAogCWZvciAoaSA9IDA7IGkgPCBucmVhZHk7IGkrKykgewogCQlzdHJ1Y3QgaHBzYl9pc29fcGFja2V0X2luZm8gKmluZm8gPQogCQkJJmlzby0+aW5mb3NbKGlzby0+Zmlyc3RfcGFja2V0ICsgaSkgJSBpc28tPmJ1Zl9wYWNrZXRzXTsKLQkJZGF0YSA9IChxdWFkbGV0X3QgKikoaXNvLT5kYXRhX2J1Zi5rdmlydCArIGluZm8tPm9mZnNldCk7CisJCWRhdGEgPSAoX19iZTMyICopKGlzby0+ZGF0YV9idWYua3ZpcnQgKyBpbmZvLT5vZmZzZXQpOwogCiAJCS8qIHNraXAgb3ZlciBHQVNQIGhlYWRlciAqLwogCQlidWYgPSAoY2hhciAqKWRhdGEgKyA4OwpAQCAtMTUwOSwxNyArMTUwNCwxOCBAQAogc3RhdGljIHZvaWQgZXRoZXIxMzk0X2RnX2NvbXBsZXRlKHN0cnVjdCBwYWNrZXRfdGFzayAqcHRhc2ssIGludCBmYWlsKQogewogCXN0cnVjdCBza19idWZmICpza2IgPSBwdGFzay0+c2tiOwotCXN0cnVjdCBldGgxMzk0X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihza2ItPmRldik7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHNrYi0+ZGV2OworCXN0cnVjdCBldGgxMzk0X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAkvKiBTdGF0aXN0aWNzICovCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKIAlpZiAoZmFpbCkgewotCQlwcml2LT5zdGF0cy50eF9kcm9wcGVkKys7Ci0JCXByaXYtPnN0YXRzLnR4X2Vycm9ycysrOworCQlkZXYtPnN0YXRzLnR4X2Ryb3BwZWQrKzsKKwkJZGV2LT5zdGF0cy50eF9lcnJvcnMrKzsKIAl9IGVsc2UgewotCQlwcml2LT5zdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKLQkJcHJpdi0+c3RhdHMudHhfcGFja2V0cysrOworCQlkZXYtPnN0YXRzLnR4X2J5dGVzICs9IHNrYi0+bGVuOworCQlkZXYtPnN0YXRzLnR4X3BhY2tldHMrKzsKIAl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwogCkBAIC0xNjE0LDcgKzE2MTAsNyBAQAogCQlpZiAobWF4X3BheWxvYWQgPCBkZ19zaXplICsgaGRyX3R5cGVfbGVuW0VUSDEzOTRfSERSX0xGX1VGXSkKIAkJCXByaXYtPmJjX2RnbCsrOwogCX0gZWxzZSB7Ci0JCV9fYmU2NCBndWlkID0gZ2V0X3VuYWxpZ25lZCgodTY0ICopaGRyX2J1Zi5oX2Rlc3QpOworCQlfX2JlNjQgZ3VpZCA9IGdldF91bmFsaWduZWQoKF9fYmU2NCAqKWhkcl9idWYuaF9kZXN0KTsKIAogCQlub2RlID0gZXRoMTM5NF9maW5kX25vZGVfZ3VpZCgmcHJpdi0+aXBfbm9kZV9saXN0LAogCQkJCQkgICAgICBiZTY0X3RvX2NwdShndWlkKSk7CkBAIC0xNjk2LDggKzE2OTIsOCBAQAogCQlkZXZfa2ZyZWVfc2tiKHNrYik7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCXByaXYtPnN0YXRzLnR4X2Ryb3BwZWQrKzsKLQlwcml2LT5zdGF0cy50eF9lcnJvcnMrKzsKKwlkZXYtPnN0YXRzLnR4X2Ryb3BwZWQrKzsKKwlkZXYtPnN0YXRzLnR4X2Vycm9ycysrOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKIAogCS8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL2llZWUxMzk0L2V0aDEzOTQuaCBiL2RyaXZlcnMvaWVlZTEzOTQvZXRoMTM5NC5oCmluZGV4IDRmM2UyZGQuLmQ1M2JhYzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWVlZTEzOTQvZXRoMTM5NC5oCisrKyBiL2RyaXZlcnMvaWVlZTEzOTQvZXRoMTM5NC5oCkBAIC01NCw3ICs1NCw2IEBACiAKIC8qIFByaXZhdGUgc3RydWN0dXJlIGZvciBvdXIgZXRoZXJuZXQgZHJpdmVyICovCiBzdHJ1Y3QgZXRoMTM5NF9wcml2IHsKLQlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsJLyogRGV2aWNlIHN0YXRzCQkJICovCiAJc3RydWN0IGhwc2JfaG9zdCAqaG9zdDsJCS8qIFRoZSBjYXJkIGZvciB0aGlzIGRldgkgKi8KIAl1MTYgYmNfbWF4cGF5bG9hZDsJCS8qIE1heCBicm9hZGNhc3QgcGF5bG9hZAkgKi8KIAl1OCBiY19zc3BkOwkJCS8qIE1heCBicm9hZGNhc3Qgc3BlZWQJCSAqLwpAQCAtODIsNyArODEsNyBAQAogCiBzdHJ1Y3QgZXRoMTM5NGhkciB7CiAJdW5zaWduZWQgY2hhcgloX2Rlc3RbRVRIMTM5NF9BTEVOXTsJLyogZGVzdGluYXRpb24gZXRoMTM5NCBhZGRyCSovCi0JdW5zaWduZWQgc2hvcnQJaF9wcm90bzsJCS8qIHBhY2tldCB0eXBlIElEIGZpZWxkCSovCisJX19iZTE2CQloX3Byb3RvOwkJLyogcGFja2V0IHR5cGUgSUQgZmllbGQJKi8KIH0gIF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBldGgxMzk0aGRyICpldGgxMzk0X2hkcihjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQpAQCAtOTksMTMgKzk4LDEzIEBACiBzdHJ1Y3QgZXRoMTM5NF91Zl9oZHIgewogCXUxNiBsZjoyOwogCXUxNiByZXM6MTQ7Ci0JdTE2IGV0aGVyX3R5cGU7CQkvKiBFdGhlcm5ldCBwYWNrZXQgdHlwZSAqLworCV9fYmUxNiBldGhlcl90eXBlOwkJLyogRXRoZXJuZXQgcGFja2V0IHR5cGUgKi8KIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAjZWxpZiBkZWZpbmVkIF9fTElUVExFX0VORElBTl9CSVRGSUVMRAogc3RydWN0IGV0aDEzOTRfdWZfaGRyIHsKIAl1MTYgcmVzOjE0OwogCXUxNiBsZjoyOwotCXUxNiBldGhlcl90eXBlOworCV9fYmUxNiBldGhlcl90eXBlOwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKICNlbHNlCiAjZXJyb3IgVW5rbm93biBiaXQgZmllbGQgdHlwZQpAQCAtMTE3LDcgKzExNiw3IEBACiAJdTE2IGxmOjI7CiAJdTE2IHJlczE6MjsKIAl1MTYgZGdfc2l6ZToxMjsJCS8qIERhdGFncmFtIHNpemUgKi8KLQl1MTYgZXRoZXJfdHlwZTsJCS8qIEV0aGVybmV0IHBhY2tldCB0eXBlICovCisJX19iZTE2IGV0aGVyX3R5cGU7CQkvKiBFdGhlcm5ldCBwYWNrZXQgdHlwZSAqLwogCXUxNiBkZ2w7CQkvKiBEYXRhZ3JhbSBsYWJlbCAqLwogCXUxNiByZXMyOwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKQEAgLTEyNiw3ICsxMjUsNyBAQAogCXUxNiBkZ19zaXplOjEyOwogCXUxNiByZXMxOjI7CiAJdTE2IGxmOjI7Ci0JdTE2IGV0aGVyX3R5cGU7CisJX19iZTE2IGV0aGVyX3R5cGU7CiAJdTE2IGRnbDsKIAl1MTYgcmVzMjsKIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CkBAIC0yMDcsMTEgKzIwNiwxMSBAQAogCXUxNiBvcGNvZGU7CQkvKiBBUlAgT3Bjb2RlCSovCiAJLyogQWJvdmUgaXMgZXhhY3RseSB0aGUgc2FtZSBmb3JtYXQgYXMgc3RydWN0IGFycGhkciAqLwogCi0JdTY0IHNfdW5pcV9pZDsJCS8qIFNlbmRlcidzIDY0Yml0IEVVSQkJCSovCisJX19iZTY0IHNfdW5pcV9pZDsJLyogU2VuZGVyJ3MgNjRiaXQgRVVJCQkqLwogCXU4IG1heF9yZWM7CQkvKiBTZW5kZXIncyBtYXggcGFja2V0IHNpemUJCSovCiAJdTggc3NwZDsJCS8qIFNlbmRlcidzIG1heCBzcGVlZAkJCSovCi0JdTE2IGZpZm9faGk7CQkvKiBoaSAxNmJpdHMgb2Ygc2VuZGVyJ3MgRklGTyBhZGRyCSovCi0JdTMyIGZpZm9fbG87CQkvKiBsbyAzMmJpdHMgb2Ygc2VuZGVyJ3MgRklGTyBhZGRyCSovCisJX19iZTE2IGZpZm9faGk7CQkvKiBoaSAxNmJpdHMgb2Ygc2VuZGVyJ3MgRklGTyBhZGRyCSovCisJX19iZTMyIGZpZm9fbG87CQkvKiBsbyAzMmJpdHMgb2Ygc2VuZGVyJ3MgRklGTyBhZGRyCSovCiAJdTMyIHNpcDsJCS8qIFNlbmRlcidzIElQIEFkZHJlc3MJCQkqLwogCXUzMiB0aXA7CQkvKiBJUCBBZGRyZXNzIG9mIHJlcXVlc3RlZCBodyBhZGRyCSovCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZWVlMTM5NC9oaWdobGV2ZWwuYyBiL2RyaXZlcnMvaWVlZTEzOTQvaGlnaGxldmVsLmMKaW5kZXggMjcyNTQzYS4uNjAwZTM5MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZWVlMTM5NC9oaWdobGV2ZWwuYworKysgYi9kcml2ZXJzL2llZWUxMzk0L2hpZ2hsZXZlbC5jCkBAIC0zMjAsNyArMzIwLDcgQEAKICAqLwogdTY0IGhwc2JfYWxsb2NhdGVfYW5kX3JlZ2lzdGVyX2FkZHJzcGFjZShzdHJ1Y3QgaHBzYl9oaWdobGV2ZWwgKmhsLAogCQkJCQkgc3RydWN0IGhwc2JfaG9zdCAqaG9zdCwKLQkJCQkJIHN0cnVjdCBocHNiX2FkZHJlc3Nfb3BzICpvcHMsCisJCQkJCSBjb25zdCBzdHJ1Y3QgaHBzYl9hZGRyZXNzX29wcyAqb3BzLAogCQkJCQkgdTY0IHNpemUsIHU2NCBhbGlnbm1lbnQsCiAJCQkJCSB1NjQgc3RhcnQsIHU2NCBlbmQpCiB7CkBAIC00MDcsNyArNDA3LDggQEAKICAqIGFyZSBhdXRvbWF0aWNhbGx5IGRlYWxsb2NhdGVkIHRvZ2V0aGVyIHdpdGggdGhlIGhwc2JfaGlnaGxldmVsIEBobC4KICAqLwogaW50IGhwc2JfcmVnaXN0ZXJfYWRkcnNwYWNlKHN0cnVjdCBocHNiX2hpZ2hsZXZlbCAqaGwsIHN0cnVjdCBocHNiX2hvc3QgKmhvc3QsCi0JCQkgICAgc3RydWN0IGhwc2JfYWRkcmVzc19vcHMgKm9wcywgdTY0IHN0YXJ0LCB1NjQgZW5kKQorCQkJICAgIGNvbnN0IHN0cnVjdCBocHNiX2FkZHJlc3Nfb3BzICpvcHMsCisJCQkgICAgdTY0IHN0YXJ0LCB1NjQgZW5kKQogewogCXN0cnVjdCBocHNiX2FkZHJlc3Nfc2VydmUgKmFzOwogCXN0cnVjdCBsaXN0X2hlYWQgKmxoOwpAQCAtNDIwLDcgKzQyMSw3IEBACiAJCXJldHVybiAwOwogCX0KIAotCWFzID0ga21hbGxvYyhzaXplb2YoKmFzKSwgR0ZQX0FUT01JQyk7CisJYXMgPSBrbWFsbG9jKHNpemVvZigqYXMpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWFzKQogCQlyZXR1cm4gMDsKIApAQCAtNDc3LDcgKzQ3OCw3IEBACiAJcmV0dXJuIHJldHZhbDsKIH0KIAotc3RhdGljIHN0cnVjdCBocHNiX2FkZHJlc3Nfb3BzIGR1bW15X29wczsKK2NvbnN0IHN0YXRpYyBzdHJ1Y3QgaHBzYl9hZGRyZXNzX29wcyBkdW1teV9vcHM7CiAKIC8qIGR1bW15IGFkZHJlc3Mgc3BhY2VzIGFzIGxvd2VyIGFuZCB1cHBlciBib3VuZHMgb2YgdGhlIGhvc3QncyBhLnMuIGxpc3QgKi8KIHN0YXRpYyB2b2lkIGluaXRfaHBzYl9oaWdobGV2ZWwoc3RydWN0IGhwc2JfaG9zdCAqaG9zdCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWVlZTEzOTQvaGlnaGxldmVsLmggYi9kcml2ZXJzL2llZWUxMzk0L2hpZ2hsZXZlbC5oCmluZGV4IGJjNWQwODUuLjlkYmE4OWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWVlZTEzOTQvaGlnaGxldmVsLmgKKysrIGIvZHJpdmVycy9pZWVlMTM5NC9oaWdobGV2ZWwuaApAQCAtMTUsNyArMTUsNyBAQAogc3RydWN0IGhwc2JfYWRkcmVzc19zZXJ2ZSB7CiAJc3RydWN0IGxpc3RfaGVhZCBob3N0X2xpc3Q7CS8qIHBlciBob3N0IGxpc3QgKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkIGhsX2xpc3Q7CS8qIGhwc2JfaGlnaGxldmVsIGxpc3QgKi8KLQlzdHJ1Y3QgaHBzYl9hZGRyZXNzX29wcyAqb3A7CisJY29uc3Qgc3RydWN0IGhwc2JfYWRkcmVzc19vcHMgKm9wOwogCXN0cnVjdCBocHNiX2hvc3QgKmhvc3Q7CiAJdTY0IHN0YXJ0OwkvKiBmaXJzdCBhZGRyZXNzIGhhbmRsZWQsIHF1YWRsZXQgYWxpZ25lZCAqLwogCXU2NCBlbmQ7CS8qIGZpcnN0IGFkZHJlc3MgYmVoaW5kLCBxdWFkbGV0IGFsaWduZWQgKi8KQEAgLTExOSwxMSArMTE5LDEyIEBACiAKIHU2NCBocHNiX2FsbG9jYXRlX2FuZF9yZWdpc3Rlcl9hZGRyc3BhY2Uoc3RydWN0IGhwc2JfaGlnaGxldmVsICpobCwKIAkJCQkJIHN0cnVjdCBocHNiX2hvc3QgKmhvc3QsCi0JCQkJCSBzdHJ1Y3QgaHBzYl9hZGRyZXNzX29wcyAqb3BzLAorCQkJCQkgY29uc3Qgc3RydWN0IGhwc2JfYWRkcmVzc19vcHMgKm9wcywKIAkJCQkJIHU2NCBzaXplLCB1NjQgYWxpZ25tZW50LAogCQkJCQkgdTY0IHN0YXJ0LCB1NjQgZW5kKTsKIGludCBocHNiX3JlZ2lzdGVyX2FkZHJzcGFjZShzdHJ1Y3QgaHBzYl9oaWdobGV2ZWwgKmhsLCBzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0LAotCQkJICAgIHN0cnVjdCBocHNiX2FkZHJlc3Nfb3BzICpvcHMsIHU2NCBzdGFydCwgdTY0IGVuZCk7CisJCQkgICAgY29uc3Qgc3RydWN0IGhwc2JfYWRkcmVzc19vcHMgKm9wcywKKwkJCSAgICB1NjQgc3RhcnQsIHU2NCBlbmQpOwogaW50IGhwc2JfdW5yZWdpc3Rlcl9hZGRyc3BhY2Uoc3RydWN0IGhwc2JfaGlnaGxldmVsICpobCwgc3RydWN0IGhwc2JfaG9zdCAqaG9zdCwKIAkJCSAgICAgIHU2NCBzdGFydCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWVlZTEzOTQvaG9zdHMuYyBiL2RyaXZlcnMvaWVlZTEzOTQvaG9zdHMuYwppbmRleCAyMzdkMGM5Li5lOTQ3ZDhmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2llZWUxMzk0L2hvc3RzLmMKKysrIGIvZHJpdmVycy9pZWVlMTM5NC9ob3N0cy5jCkBAIC0zNCwxOCArMzQsMTggQEAKIHsKIAlzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0ID0KIAkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBocHNiX2hvc3QsIGRlbGF5ZWRfcmVzZXQud29yayk7Ci0JaW50IGdlbmVyYXRpb24gPSBob3N0LT5jc3IuZ2VuZXJhdGlvbiArIDE7CisJdTggZ2VuZXJhdGlvbiA9IGhvc3QtPmNzci5nZW5lcmF0aW9uICsgMTsKIAogCS8qIFRoZSBnZW5lcmF0aW9uIGZpZWxkIHJvbGxzIG92ZXIgdG8gMiByYXRoZXIgdGhhbiAwIHBlciBJRUVFCiAJICogMTM5NGEtMjAwMC4gKi8KIAlpZiAoZ2VuZXJhdGlvbiA+IDB4ZiB8fCBnZW5lcmF0aW9uIDwgMikKIAkJZ2VuZXJhdGlvbiA9IDI7CiAKLQlDU1JfU0VUX0JVU19JTkZPX0dFTkVSQVRJT04oaG9zdC0+Y3NyLnJvbSwgZ2VuZXJhdGlvbik7CisJY3NyX3NldF9idXNfaW5mb19nZW5lcmF0aW9uKGhvc3QtPmNzci5yb20sIGdlbmVyYXRpb24pOwogCWlmIChjc3IxMjEyX2dlbmVyYXRlX2Nzcl9pbWFnZShob3N0LT5jc3Iucm9tKSAhPSBDU1IxMjEyX1NVQ0NFU1MpIHsKIAkJLyogQ1NSIGltYWdlIGNyZWF0aW9uIGZhaWxlZC4KIAkJICogUmVzZXQgZ2VuZXJhdGlvbiBmaWVsZCBhbmQgZG8gbm90IGlzc3VlIGEgYnVzIHJlc2V0LiAqLwotCQlDU1JfU0VUX0JVU19JTkZPX0dFTkVSQVRJT04oaG9zdC0+Y3NyLnJvbSwKKwkJY3NyX3NldF9idXNfaW5mb19nZW5lcmF0aW9uKGhvc3QtPmNzci5yb20sCiAJCQkJCSAgICBob3N0LT5jc3IuZ2VuZXJhdGlvbik7CiAJCXJldHVybjsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2llZWUxMzk0L2hvc3RzLmggYi9kcml2ZXJzL2llZWUxMzk0L2hvc3RzLmgKaW5kZXggZGQyMjk5NS4uNDljMzU5MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZWVlMTM5NC9ob3N0cy5oCisrKyBiL2RyaXZlcnMvaWVlZTEzOTQvaG9zdHMuaApAQCAtMTU0LDcgKzE1NCw3IEBACiAJICogdG8gc2V0IHRoZSBoYXJkd2FyZSBDb25maWdST00gaWYgdGhlIGhhcmR3YXJlIHN1cHBvcnRzIGhhbmRsaW5nCiAJICogcmVhZHMgdG8gdGhlIENvbmZpZ1JPTSBvbiBpdHMgb3duLiAqLwogCXZvaWQgKCpzZXRfaHdfY29uZmlnX3JvbSkoc3RydWN0IGhwc2JfaG9zdCAqaG9zdCwKLQkJCQkgIHF1YWRsZXRfdCAqY29uZmlnX3JvbSk7CisJCQkJICBfX2JlMzIgKmNvbmZpZ19yb20pOwogCiAJLyogVGhpcyBmdW5jdGlvbiBzaGFsbCBpbXBsZW1lbnQgcGFja2V0IHRyYW5zbWlzc2lvbiBiYXNlZCBvbgogCSAqIHBhY2tldC0+dHlwZS4gIEl0IHNoYWxsIENSQyBib3RoIHBhcnRzIG9mIHRoZSBwYWNrZXQgKHVubGVzcwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZWVlMTM5NC9pZWVlMTM5NC5oIGIvZHJpdmVycy9pZWVlMTM5NC9pZWVlMTM5NC5oCmluZGV4IDQwNDkyMDcuLmUwYWUwZDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWVlZTEzOTQvaWVlZTEzOTQuaAorKysgYi9kcml2ZXJzL2llZWUxMzk0L2llZWUxMzk0LmgKQEAgLTEyMSw2ICsxMjEsOSBAQAogCiAjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgogCisvKiAnMScgJzMnICc5JyAnNCcgaW4gQVNDSUkgKi8KKyNkZWZpbmUgSUVFRTEzOTRfQlVTSURfTUFHSUMJY3B1X3RvX2JlMzIoMHgzMTMzMzkzNCkKKwogI2lmZGVmIF9fQklHX0VORElBTl9CSVRGSUVMRAogCiBzdHJ1Y3Qgc2VsZmlkIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWVlZTEzOTQvbm9kZW1nci5jIGIvZHJpdmVycy9pZWVlMTM5NC9ub2RlbWdyLmMKaW5kZXggNzllZjVmZC4uOTA2YzVhOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZWVlMTM5NC9ub2RlbWdyLmMKKysrIGIvZHJpdmVycy9pZWVlMTM5NC9ub2RlbWdyLmMKQEAgLTY3LDcgKzY3LDcgQEAKIAlmb3IgKGkgPSBJRUVFMTM5NF9TUEVFRF8xMDA7IGkgPD0gb2xkX3NwZWVkOyBpKyspIHsKIAkJKnNwZWVkID0gaTsKIAkJZXJyb3IgPSBocHNiX3JlYWQoY2ktPmhvc3QsIGNpLT5ub2RlaWQsIGNpLT5nZW5lcmF0aW9uLCBhZGRyLAotCQkJCSAgJnEsIHNpemVvZihxdWFkbGV0X3QpKTsKKwkJCQkgICZxLCA0KTsKIAkJaWYgKGVycm9yKQogCQkJYnJlYWs7CiAJCSpidWZmZXIgPSBxOwpAQCAtODUsNyArODUsNyBAQAogCXJldHVybiBlcnJvcjsKIH0KIAotc3RhdGljIGludCBub2RlbWdyX2J1c19yZWFkKHN0cnVjdCBjc3IxMjEyX2NzciAqY3NyLCB1NjQgYWRkciwgdTE2IGxlbmd0aCwKK3N0YXRpYyBpbnQgbm9kZW1ncl9idXNfcmVhZChzdHJ1Y3QgY3NyMTIxMl9jc3IgKmNzciwgdTY0IGFkZHIsCiAJCQkgICAgdm9pZCAqYnVmZmVyLCB2b2lkICpfX2NpKQogewogCXN0cnVjdCBub2RlbWdyX2Nzcl9pbmZvICpjaSA9IChzdHJ1Y3Qgbm9kZW1ncl9jc3JfaW5mbyopX19jaTsKQEAgLTkzLDcgKzkzLDcgQEAKIAogCWZvciAoaSA9IDE7IDsgaSsrKSB7CiAJCWVycm9yID0gaHBzYl9yZWFkKGNpLT5ob3N0LCBjaS0+bm9kZWlkLCBjaS0+Z2VuZXJhdGlvbiwgYWRkciwKLQkJCQkgIGJ1ZmZlciwgbGVuZ3RoKTsKKwkJCQkgIGJ1ZmZlciwgNCk7CiAJCWlmICghZXJyb3IpIHsKIAkJCWNpLT5zcGVlZF91bnZlcmlmaWVkID0gMDsKIAkJCWJyZWFrOwpAQCAtMTA0LDcgKzEwNCw3IEBACiAKIAkJLyogVGhlIGllZWUxMzk0X2NvcmUgZ3Vlc3NlZCB0aGUgbm9kZSdzIHNwZWVkIGNhcGFiaWxpdHkgZnJvbQogCQkgKiB0aGUgc2VsZiBJRC4gIENoZWNrIHdoZXRoZXIgYSBsb3dlciBzcGVlZCB3b3Jrcy4gKi8KLQkJaWYgKGNpLT5zcGVlZF91bnZlcmlmaWVkICYmIGxlbmd0aCA9PSBzaXplb2YocXVhZGxldF90KSkgeworCQlpZiAoY2ktPnNwZWVkX3VudmVyaWZpZWQpIHsKIAkJCWVycm9yID0gbm9kZW1ncl9jaGVja19zcGVlZChjaSwgYWRkciwgYnVmZmVyKTsKIAkJCWlmICghZXJyb3IpCiAJCQkJYnJlYWs7CkBAIC0xMTUsMjAgKzExNSw4IEBACiAJcmV0dXJuIGVycm9yOwogfQogCi0jZGVmaW5lIE9VSV9GUkVFQ09NX1RFQ0hOT0xPR0lFU19HTUJIIDB4MDAwMWRiCi0KLXN0YXRpYyBpbnQgbm9kZW1ncl9nZXRfbWF4X3JvbShxdWFkbGV0X3QgKmJ1c19pbmZvX2RhdGEsIHZvaWQgKl9fY2kpCi17Ci0JLyogRnJlZWNvbSBGaXJlV2lyZSBIYXJkIERyaXZlIGZpcm13YXJlIGJ1ZyAqLwotCWlmIChiZTMyX3RvX2NwdShidXNfaW5mb19kYXRhWzNdKSA+PiA4ID09IE9VSV9GUkVFQ09NX1RFQ0hOT0xPR0lFU19HTUJIKQotCQlyZXR1cm4gMDsKLQotCXJldHVybiAoYmUzMl90b19jcHUoYnVzX2luZm9fZGF0YVsyXSkgPj4gOCkgJiAweDM7Ci19Ci0KIHN0YXRpYyBzdHJ1Y3QgY3NyMTIxMl9idXNfb3BzIG5vZGVtZ3JfY3NyX29wcyA9IHsKIAkuYnVzX3JlYWQgPQlub2RlbWdyX2J1c19yZWFkLAotCS5nZXRfbWF4X3JvbSA9CW5vZGVtZ3JfZ2V0X21heF9yb20KIH07CiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZWVlMTM5NC9ub2RlbWdyLmggYi9kcml2ZXJzL2llZWUxMzk0L25vZGVtZ3IuaAppbmRleCA0ZjI4N2EzLi4xNWVhMDk3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2llZWUxMzk0L25vZGVtZ3IuaAorKysgYi9kcml2ZXJzL2llZWUxMzk0L25vZGVtZ3IuaApAQCAtMzEsOSArMzEsNiBAQAogc3RydWN0IGhwc2JfaG9zdDsKIHN0cnVjdCBpZWVlMTM5NF9kZXZpY2VfaWQ7CiAKLS8qICcxJyAnMycgJzknICc0JyBpbiBBU0NJSSAqLwotI2RlZmluZSBJRUVFMTM5NF9CVVNJRF9NQUdJQwlfX2NvbnN0YW50X2NwdV90b19iZTMyKDB4MzEzMzM5MzQpCi0KIC8qIFRoaXMgaXMgdGhlIHN0YXJ0IG9mIGEgTm9kZSBlbnRyeSBzdHJ1Y3R1cmUuIEl0IHNob3VsZCBiZSBhIHN0YWJsZSBBUEkKICAqIGZvciB3aGljaCB0byBnYXRoZXIgaW5mbyBmcm9tIHRoZSBOb2RlIE1hbmFnZXIgYWJvdXQgZGV2aWNlcyBhdHRhY2hlZAogICogdG8gdGhlIGJ1cy4gICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2llZWUxMzk0L29oY2kxMzk0LmMgYi9kcml2ZXJzL2llZWUxMzk0L29oY2kxMzk0LmMKaW5kZXggZTUwOWUxMy4uNjVjMTQyOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZWVlMTM5NC9vaGNpMTM5NC5jCisrKyBiL2RyaXZlcnMvaWVlZTEzOTQvb2hjaTEzOTQuYwpAQCAtMjk3Myw3ICsyOTczLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgb2hjaV9zZXRfaHdfY29uZmlnX3JvbShzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0LCBxdWFkbGV0X3QgKmNvbmZpZ19yb20pCitzdGF0aWMgdm9pZCBvaGNpX3NldF9od19jb25maWdfcm9tKHN0cnVjdCBocHNiX2hvc3QgKmhvc3QsIF9fYmUzMiAqY29uZmlnX3JvbSkKIHsKIAlzdHJ1Y3QgdGlfb2hjaSAqb2hjaSA9IGhvc3QtPmhvc3RkYXRhOwogCkBAIC0zMTk5LDE1ICszMTk5LDE2IEBACiAJLyogTm93IGVuYWJsZSBMUFMsIHdoaWNoIHdlIG5lZWQgaW4gb3JkZXIgdG8gc3RhcnQgYWNjZXNzaW5nCiAJICogbW9zdCBvZiB0aGUgcmVnaXN0ZXJzLiAgSW4gZmFjdCwgb24gc29tZSBjYXJkcyAoQUxJIE01MjUxKSwKIAkgKiBhY2Nlc3NpbmcgcmVnaXN0ZXJzIGluIHRoZSBTQ2xrIGRvbWFpbiB3aXRob3V0IExQUyBlbmFibGVkCi0JICogd2lsbCBsb2NrIHVwIHRoZSBtYWNoaW5lLiAgV2FpdCA1MG1zZWMgdG8gbWFrZSBzdXJlIHdlIGhhdmUKLQkgKiBmdWxsIGxpbmsgZW5hYmxlZC4gICovCisJICogd2lsbCBsb2NrIHVwIHRoZSBtYWNoaW5lLiAqLwogCXJlZ193cml0ZShvaGNpLCBPSENJMTM5NF9IQ0NvbnRyb2xTZXQsIE9IQ0kxMzk0X0hDQ29udHJvbF9MUFMpOwogCiAJLyogRGlzYWJsZSBhbmQgY2xlYXIgaW50ZXJydXB0cyAqLwogCXJlZ193cml0ZShvaGNpLCBPSENJMTM5NF9JbnRFdmVudENsZWFyLCAweGZmZmZmZmZmKTsKIAlyZWdfd3JpdGUob2hjaSwgT0hDSTEzOTRfSW50TWFza0NsZWFyLCAweGZmZmZmZmZmKTsKIAotCW1kZWxheSg1MCk7CisJLyogRmx1c2ggTU1JTyB3cml0ZXMgYW5kIHdhaXQgdG8gbWFrZSBzdXJlIHdlIGhhdmUgZnVsbCBsaW5rIGVuYWJsZWQuICovCisJcmVnX3JlYWQob2hjaSwgT0hDSTEzOTRfVmVyc2lvbik7CisJbXNsZWVwKDUwKTsKIAogCS8qIERldGVybWluZSB0aGUgbnVtYmVyIG9mIGF2YWlsYWJsZSBJUiBhbmQgSVQgY29udGV4dHMuICovCiAJb2hjaS0+bmJfaXNvX3Jjdl9jdHggPQpAQCAtMzIzMyw4ICszMjM0LDkgQEAKIAkgKiB3ZSBuZWVkIHRvIGdldCB0byB0aGF0ICJubyBldmVudCIsIHNvIGVub3VnaCBzaG91bGQgYmUgaW5pdGlhbGl6ZWQKIAkgKiBieSB0aGF0IHBvaW50LgogCSAqLwotCWlmIChyZXF1ZXN0X2lycShkZXYtPmlycSwgb2hjaV9pcnFfaGFuZGxlciwgSVJRRl9TSEFSRUQsCi0JCQkgT0hDSTEzOTRfRFJJVkVSX05BTUUsIG9oY2kpKSB7CisJZXJyID0gcmVxdWVzdF9pcnEoZGV2LT5pcnEsIG9oY2lfaXJxX2hhbmRsZXIsIElSUUZfU0hBUkVELAorCQkJICBPSENJMTM5NF9EUklWRVJfTkFNRSwgb2hjaSk7CisJaWYgKGVycikgewogCQlQUklOVF9HKEtFUk5fRVJSLCAiRmFpbGVkIHRvIGFsbG9jYXRlIGludGVycnVwdCAlZCIsIGRldi0+aXJxKTsKIAkJZ290byBlcnI7CiAJfQpAQCAtMzM4MSw2ICszMzgzLDcgQEAKIAlvaGNpX2RldmN0bChvaGNpLT5ob3N0LCBSRVNFVF9CVVMsIExPTkdfUkVTRVRfTk9fRk9SQ0VfUk9PVCk7CiAJb2hjaV9zb2Z0X3Jlc2V0KG9oY2kpOwogCisJZnJlZV9pcnEoZGV2LT5pcnEsIG9oY2kpOwogCWVyciA9IHBjaV9zYXZlX3N0YXRlKGRldik7CiAJaWYgKGVycikgewogCQlQUklOVChLRVJOX0VSUiwgInBjaV9zYXZlX3N0YXRlIGZhaWxlZCB3aXRoICVkIiwgZXJyKTsKQEAgLTM0MjAsNyArMzQyMywxNiBAQAogCXJlZ193cml0ZShvaGNpLCBPSENJMTM5NF9IQ0NvbnRyb2xTZXQsIE9IQ0kxMzk0X0hDQ29udHJvbF9MUFMpOwogCXJlZ193cml0ZShvaGNpLCBPSENJMTM5NF9JbnRFdmVudENsZWFyLCAweGZmZmZmZmZmKTsKIAlyZWdfd3JpdGUob2hjaSwgT0hDSTEzOTRfSW50TWFza0NsZWFyLCAweGZmZmZmZmZmKTsKLQltZGVsYXkoNTApOworCXJlZ19yZWFkKG9oY2ksIE9IQ0kxMzk0X1ZlcnNpb24pOworCW1zbGVlcCg1MCk7CisKKwllcnIgPSByZXF1ZXN0X2lycShkZXYtPmlycSwgb2hjaV9pcnFfaGFuZGxlciwgSVJRRl9TSEFSRUQsCisJCQkgIE9IQ0kxMzk0X0RSSVZFUl9OQU1FLCBvaGNpKTsKKwlpZiAoZXJyKSB7CisJCVBSSU5UX0coS0VSTl9FUlIsICJGYWlsZWQgdG8gYWxsb2NhdGUgaW50ZXJydXB0ICVkIiwgZGV2LT5pcnEpOworCQlyZXR1cm4gZXJyOworCX0KKwogCW9oY2lfaW5pdGlhbGl6ZShvaGNpKTsKIAogCWhwc2JfcmVzdW1lX2hvc3Qob2hjaS0+aG9zdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2llZWUxMzk0L3BjaWx5bnguYyBiL2RyaXZlcnMvaWVlZTEzOTQvcGNpbHlueC5jCmluZGV4IDdhZWUxYWMuLmRjMTVjYWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWVlZTEzOTQvcGNpbHlueC5jCisrKyBiL2RyaXZlcnMvaWVlZTEzOTQvcGNpbHlueC5jCkBAIC0xNDYzLDcgKzE0NjMsNyBAQAogCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluZm9fbGVuZ3RoLCBjcmNfbGVuZ3RoIGFuZCAxMzk0IG1hZ2ljIG51bWJlciB0byBjaGVjaywgaWYgaXQgaXMgcmVhbGx5IGEgYnVzIGluZm8gYmxvY2sgKi8KIAkJCQlpZiAoKChiZTMyX3RvX2NwdShseW54LT5idXNfaW5mb19ibG9ja1swXSkgJiAweGZmZmYwMDAwKSA9PSAweDA0MDQwMDAwKSAmJgotCQkJCSAgICAobHlueC0+YnVzX2luZm9fYmxvY2tbMV0gPT0gX19jb25zdGFudF9jcHVfdG9fYmUzMigweDMxMzMzOTM0KSkpCisJCQkJICAgIChseW54LT5idXNfaW5mb19ibG9ja1sxXSA9PSBJRUVFMTM5NF9CVVNJRF9NQUdJQykpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUklOVChLRVJOX0RFQlVHLCBseW54LT5pZCwgInJlYWQgYSB2YWxpZCBidXMgaW5mbyBibG9jayBmcm9tIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2llZWUxMzk0L3BjaWx5bnguaCBiL2RyaXZlcnMvaWVlZTEzOTQvcGNpbHlueC5oCmluZGV4IGVjMjczMjEuLjY5M2ExNjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWVlZTEzOTQvcGNpbHlueC5oCisrKyBiL2RyaXZlcnMvaWVlZTEzOTQvcGNpbHlueC5oCkBAIC01Miw3ICs1Miw3IEBACiAgICAgICAgIHZvaWQgX19pb21lbSAqbG9jYWxfcm9tOwogICAgICAgICB2b2lkIF9faW9tZW0gKmxvY2FsX3JhbTsKICAgICAgICAgdm9pZCBfX2lvbWVtICphdXhfcG9ydDsKLQlxdWFkbGV0X3QgYnVzX2luZm9fYmxvY2tbNV07CisJX19iZTMyIGJ1c19pbmZvX2Jsb2NrWzVdOwogCiAgICAgICAgIC8qCiAgICAgICAgICAqIHVzZSBsb2NhbCBSQU0gb2YgTE9DQUxSQU1fU0laRSBieXRlcyBmb3IgUENMcywgd2hpY2ggYWxsb3dzIGZvcgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZWVlMTM5NC9yYXcxMzk0LmMgYi9kcml2ZXJzL2llZWUxMzk0L3JhdzEzOTQuYwppbmRleCBiZjdlNzYxLi5iYWQ2NmM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2llZWUxMzk0L3JhdzEzOTQuYworKysgYi9kcml2ZXJzL2llZWUxMzk0L3JhdzEzOTQuYwpAQCAtOTAsNyArOTAsNyBAQAogc3RhdGljIGludCBhcm1fbG9jazY0KHN0cnVjdCBocHNiX2hvc3QgKmhvc3QsIGludCBub2RlaWQsIG9jdGxldF90ICogc3RvcmUsCiAJCSAgICAgIHU2NCBhZGRyLCBvY3RsZXRfdCBkYXRhLCBvY3RsZXRfdCBhcmcsIGludCBleHRfdGNvZGUsCiAJCSAgICAgIHUxNiBmbGFncyk7Ci1zdGF0aWMgc3RydWN0IGhwc2JfYWRkcmVzc19vcHMgYXJtX29wcyA9IHsKK2NvbnN0IHN0YXRpYyBzdHJ1Y3QgaHBzYl9hZGRyZXNzX29wcyBhcm1fb3BzID0gewogCS5yZWFkID0gYXJtX3JlYWQsCiAJLndyaXRlID0gYXJtX3dyaXRlLAogCS5sb2NrID0gYXJtX2xvY2ssCmRpZmYgLS1naXQgYS9kcml2ZXJzL2llZWUxMzk0L3NicDIuYyBiL2RyaXZlcnMvaWVlZTEzOTQvc2JwMi5jCmluZGV4IGEzNzNjMTguLmFiMTAzNGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWVlZTEzOTQvc2JwMi5jCisrKyBiL2RyaXZlcnMvaWVlZTEzOTQvc2JwMi5jCkBAIC0yNjUsNyArMjY1LDcgQEAKIAkuaG9zdF9yZXNldAk9IHNicDJfaG9zdF9yZXNldCwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgaHBzYl9hZGRyZXNzX29wcyBzYnAyX29wcyA9IHsKK2NvbnN0IHN0YXRpYyBzdHJ1Y3QgaHBzYl9hZGRyZXNzX29wcyBzYnAyX29wcyA9IHsKIAkud3JpdGUJCT0gc2JwMl9oYW5kbGVfc3RhdHVzX3dyaXRlCiB9OwogCkBAIC0yNzUsNyArMjc1LDcgQEAKIHN0YXRpYyBpbnQgc2JwMl9oYW5kbGVfcGh5c2RtYV9yZWFkKHN0cnVjdCBocHNiX2hvc3QgKiwgaW50LCBxdWFkbGV0X3QgKiwgdTY0LAogCQkJCSAgICBzaXplX3QsIHUxNik7CiAKLXN0YXRpYyBzdHJ1Y3QgaHBzYl9hZGRyZXNzX29wcyBzYnAyX3BoeXNkbWFfb3BzID0geworY29uc3Qgc3RhdGljIHN0cnVjdCBocHNiX2FkZHJlc3Nfb3BzIHNicDJfcGh5c2RtYV9vcHMgPSB7CiAJLnJlYWQJCT0gc2JwMl9oYW5kbGVfcGh5c2RtYV9yZWFkLAogCS53cml0ZQkJPSBzYnAyX2hhbmRsZV9waHlzZG1hX3dyaXRlLAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3N5c2ZzLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9zeXNmcy5jCmluZGV4IDRmNGQxYmIuLmI0M2Y3ZDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3N5c2ZzLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvc3lzZnMuYwpAQCAtNzc4LDcgKzc3OCw3IEBACiAJY2xhc3NfZGV2LT5jbGFzcyAgICAgID0gJmliX2NsYXNzOwogCWNsYXNzX2Rldi0+ZHJpdmVyX2RhdGEgPSBkZXZpY2U7CiAJY2xhc3NfZGV2LT5wYXJlbnQgICAgID0gZGV2aWNlLT5kbWFfZGV2aWNlOwotCXN0cmxjcHkoY2xhc3NfZGV2LT5idXNfaWQsIGRldmljZS0+bmFtZSwgQlVTX0lEX1NJWkUpOworCWRldl9zZXRfbmFtZShjbGFzc19kZXYsIGRldmljZS0+bmFtZSk7CiAKIAlJTklUX0xJU1RfSEVBRCgmZGV2aWNlLT5wb3J0X2xpc3QpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvY29yZS91Y20uYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3VjbS5jCmluZGV4IGU2MDM3MzYuLjUxYmQ5NjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3VjbS5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3VjbS5jCkBAIC0xMjY2LDggKzEyNjYsNyBAQAogCXVjbV9kZXYtPmRldi5wYXJlbnQgPSBkZXZpY2UtPmRtYV9kZXZpY2U7CiAJdWNtX2Rldi0+ZGV2LmRldnQgPSB1Y21fZGV2LT5jZGV2LmRldjsKIAl1Y21fZGV2LT5kZXYucmVsZWFzZSA9IGliX3VjbV9yZWxlYXNlX2RldjsKLQlzbnByaW50Zih1Y21fZGV2LT5kZXYuYnVzX2lkLCBCVVNfSURfU0laRSwgInVjbSVkIiwKLQkJIHVjbV9kZXYtPmRldm51bSk7CisJZGV2X3NldF9uYW1lKCZ1Y21fZGV2LT5kZXYsICJ1Y20lZCIsIHVjbV9kZXYtPmRldm51bSk7CiAJaWYgKGRldmljZV9yZWdpc3RlcigmdWNtX2Rldi0+ZGV2KSkKIAkJZ290byBlcnJfY2RldjsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX2ZzLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaXBhdGgvaXBhdGhfZnMuYwppbmRleCA1MzkxMmMzLi44ZGMyYmI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaXBhdGgvaXBhdGhfZnMuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaXBhdGgvaXBhdGhfZnMuYwpAQCAtNTcsOSArNTcsNiBAQAogCX0KIAogCWlub2RlLT5pX21vZGUgPSBtb2RlOwotCWlub2RlLT5pX3VpZCA9IDA7Ci0JaW5vZGUtPmlfZ2lkID0gMDsKLQlpbm9kZS0+aV9ibG9ja3MgPSAwOwogCWlub2RlLT5pX2F0aW1lID0gaW5vZGUtPmlfbXRpbWUgPSBpbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRTsKIAlpbm9kZS0+aV9wcml2YXRlID0gZGF0YTsKIAlpZiAoKG1vZGUgJiBTX0lGTVQpID09IFNfSUZESVIpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tbHg0L2NxLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbWx4NC9jcS5jCmluZGV4IGEzYzVhZjFkLi5kZTUyNjNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbWx4NC9jcS5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tbHg0L2NxLmMKQEAgLTM2Nyw3ICszNjcsNyBAQAogCQlpZiAoZXJyKQogCQkJZ290byBvdXQ7CiAJfSBlbHNlIHsKLQkJLyogQ2FuJ3QgYmUgc21hbGxlciB0aGVuIHRoZSBudW1iZXIgb2Ygb3V0c3RhbmRpbmcgQ1FFcyAqLworCQkvKiBDYW4ndCBiZSBzbWFsbGVyIHRoYW4gdGhlIG51bWJlciBvZiBvdXRzdGFuZGluZyBDUUVzICovCiAJCW91dHN0X2NxZSA9IG1seDRfaWJfZ2V0X291dHN0YW5kaW5nX2NxZXMoY3EpOwogCQlpZiAoZW50cmllcyA8IG91dHN0X2NxZSArIDEpIHsKIAkJCWVyciA9IDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbmVzL25lc19jbS5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L25lcy9uZXNfY20uYwppbmRleCBhODEyZGIyLi42YmE1N2U5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbmVzL25lc19jbS5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9uZXMvbmVzX2NtLmMKQEAgLTI3MDUsNyArMjcwNSw3IEBACiAJCQlzaXplb2Yoc3RydWN0IGlldGZfbXBhX2ZyYW1lKSk7CiAKIAotCS8qIG5vdGlmeSBPRiBsYXllciB0aGF0IGFjY2VwdCBldmVudCB3YXMgc3VjY2Vzc2Z1bGwgKi8KKwkvKiBub3RpZnkgT0YgbGF5ZXIgdGhhdCBhY2NlcHQgZXZlbnQgd2FzIHN1Y2Nlc3NmdWwgKi8KIAljbV9pZC0+YWRkX3JlZihjbV9pZCk7CiAKIAljbV9ldmVudC5ldmVudCA9IElXX0NNX0VWRU5UX0VTVEFCTElTSEVEOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL3VscC9zcnAvaWJfc3JwLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvdWxwL3NycC9pYl9zcnAuYwppbmRleCA3YzEzZGI4Li41NGM4ZmUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvdWxwL3NycC9pYl9zcnAuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvdWxwL3NycC9pYl9zcnAuYwpAQCAtMTk0OSw4ICsxOTQ5LDcgQEAKIAogCWhvc3QtPmRldi5jbGFzcyA9ICZzcnBfY2xhc3M7CiAJaG9zdC0+ZGV2LnBhcmVudCA9IGRldmljZS0+ZGV2LT5kbWFfZGV2aWNlOwotCXNucHJpbnRmKGhvc3QtPmRldi5idXNfaWQsIEJVU19JRF9TSVpFLCAic3JwLSVzLSVkIiwKLQkJIGRldmljZS0+ZGV2LT5uYW1lLCBwb3J0KTsKKwlkZXZfc2V0X25hbWUoJmhvc3QtPmRldiwgInNycC0lcy0lZCIsIGRldmljZS0+ZGV2LT5uYW1lLCBwb3J0KTsKIAogCWlmIChkZXZpY2VfcmVnaXN0ZXIoJmhvc3QtPmRldikpCiAJCWdvdG8gZnJlZV9ob3N0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9NYWtlZmlsZSBiL2RyaXZlcnMvaW5wdXQvTWFrZWZpbGUKaW5kZXggOThjNGY5YS4uNGM5Yzc0NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2lucHV0L01ha2VmaWxlCkBAIC01LDcgKzUsNyBAQAogIyBFYWNoIGNvbmZpZ3VyYXRpb24gb3B0aW9uIGVuYWJsZXMgYSBsaXN0IG9mIGZpbGVzLgogCiBvYmotJChDT05GSUdfSU5QVVQpCQkrPSBpbnB1dC1jb3JlLm8KLWlucHV0LWNvcmUtb2JqcyA6PSBpbnB1dC5vIGZmLWNvcmUubworaW5wdXQtY29yZS1vYmpzIDo9IGlucHV0Lm8gaW5wdXQtY29tcGF0Lm8gZmYtY29yZS5vCiAKIG9iai0kKENPTkZJR19JTlBVVF9GRl9NRU1MRVNTKQkrPSBmZi1tZW1sZXNzLm8KIG9iai0kKENPTkZJR19JTlBVVF9QT0xMREVWKQkrPSBpbnB1dC1wb2xsZGV2Lm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvZXZidWcuYyBiL2RyaXZlcnMvaW5wdXQvZXZidWcuYwppbmRleCAwMzUzNjAxLi5mN2M1YzE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2V2YnVnLmMKKysrIGIvZHJpdmVycy9pbnB1dC9ldmJ1Zy5jCkBAIC0zOSw3ICszOSw3IEBACiBzdGF0aWMgdm9pZCBldmJ1Z19ldmVudChzdHJ1Y3QgaW5wdXRfaGFuZGxlICpoYW5kbGUsIHVuc2lnbmVkIGludCB0eXBlLCB1bnNpZ25lZCBpbnQgY29kZSwgaW50IHZhbHVlKQogewogCXByaW50ayhLRVJOX0RFQlVHICJldmJ1Zy5jOiBFdmVudC4gRGV2OiAlcywgVHlwZTogJWQsIENvZGU6ICVkLCBWYWx1ZTogJWRcbiIsCi0JCWhhbmRsZS0+ZGV2LT5kZXYuYnVzX2lkLCB0eXBlLCBjb2RlLCB2YWx1ZSk7CisJCWRldl9uYW1lKCZoYW5kbGUtPmRldi0+ZGV2KSwgdHlwZSwgY29kZSwgdmFsdWUpOwogfQogCiBzdGF0aWMgaW50IGV2YnVnX2Nvbm5lY3Qoc3RydWN0IGlucHV0X2hhbmRsZXIgKmhhbmRsZXIsIHN0cnVjdCBpbnB1dF9kZXYgKmRldiwKQEAgLTY1LDcgKzY1LDcgQEAKIAkJZ290byBlcnJfdW5yZWdpc3Rlcl9oYW5kbGU7CiAKIAlwcmludGsoS0VSTl9ERUJVRyAiZXZidWcuYzogQ29ubmVjdGVkIGRldmljZTogJXMgKCVzIGF0ICVzKVxuIiwKLQkJZGV2LT5kZXYuYnVzX2lkLAorCQlkZXZfbmFtZSgmZGV2LT5kZXYpLAogCQlkZXYtPm5hbWUgPzogInVua25vd24iLAogCQlkZXYtPnBoeXMgPzogInVua25vd24iKTsKIApAQCAtODEsNyArODEsNyBAQAogc3RhdGljIHZvaWQgZXZidWdfZGlzY29ubmVjdChzdHJ1Y3QgaW5wdXRfaGFuZGxlICpoYW5kbGUpCiB7CiAJcHJpbnRrKEtFUk5fREVCVUcgImV2YnVnLmM6IERpc2Nvbm5lY3RlZCBkZXZpY2U6ICVzXG4iLAotCQloYW5kbGUtPmRldi0+ZGV2LmJ1c19pZCk7CisJCWRldl9uYW1lKCZoYW5kbGUtPmRldi0+ZGV2KSk7CiAKIAlpbnB1dF9jbG9zZV9kZXZpY2UoaGFuZGxlKTsKIAlpbnB1dF91bnJlZ2lzdGVyX2hhbmRsZShoYW5kbGUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9ldmRldi5jIGIvZHJpdmVycy9pbnB1dC9ldmRldi5jCmluZGV4IDEwNzBkYjMuLmVkOGJhYTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvZXZkZXYuYworKysgYi9kcml2ZXJzL2lucHV0L2V2ZGV2LmMKQEAgLTE5LDcgKzE5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgogI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvY29tcGF0Lmg+CisjaW5jbHVkZSAiaW5wdXQtY29tcGF0LmgiCiAKIHN0cnVjdCBldmRldiB7CiAJaW50IGV4aXN0OwpAQCAtMjkwLDE4NyArMjkwLDYgQEAKIAlyZXR1cm4gZXJyb3I7CiB9CiAKLSNpZmRlZiBDT05GSUdfQ09NUEFUCi0KLXN0cnVjdCBpbnB1dF9ldmVudF9jb21wYXQgewotCXN0cnVjdCBjb21wYXRfdGltZXZhbCB0aW1lOwotCV9fdTE2IHR5cGU7Ci0JX191MTYgY29kZTsKLQlfX3MzMiB2YWx1ZTsKLX07Ci0KLXN0cnVjdCBmZl9wZXJpb2RpY19lZmZlY3RfY29tcGF0IHsKLQlfX3UxNiB3YXZlZm9ybTsKLQlfX3UxNiBwZXJpb2Q7Ci0JX19zMTYgbWFnbml0dWRlOwotCV9fczE2IG9mZnNldDsKLQlfX3UxNiBwaGFzZTsKLQotCXN0cnVjdCBmZl9lbnZlbG9wZSBlbnZlbG9wZTsKLQotCV9fdTMyIGN1c3RvbV9sZW47Ci0JY29tcGF0X3VwdHJfdCBjdXN0b21fZGF0YTsKLX07Ci0KLXN0cnVjdCBmZl9lZmZlY3RfY29tcGF0IHsKLQlfX3UxNiB0eXBlOwotCV9fczE2IGlkOwotCV9fdTE2IGRpcmVjdGlvbjsKLQlzdHJ1Y3QgZmZfdHJpZ2dlciB0cmlnZ2VyOwotCXN0cnVjdCBmZl9yZXBsYXkgcmVwbGF5OwotCi0JdW5pb24gewotCQlzdHJ1Y3QgZmZfY29uc3RhbnRfZWZmZWN0IGNvbnN0YW50OwotCQlzdHJ1Y3QgZmZfcmFtcF9lZmZlY3QgcmFtcDsKLQkJc3RydWN0IGZmX3BlcmlvZGljX2VmZmVjdF9jb21wYXQgcGVyaW9kaWM7Ci0JCXN0cnVjdCBmZl9jb25kaXRpb25fZWZmZWN0IGNvbmRpdGlvblsyXTsgLyogT25lIGZvciBlYWNoIGF4aXMgKi8KLQkJc3RydWN0IGZmX3J1bWJsZV9lZmZlY3QgcnVtYmxlOwotCX0gdTsKLX07Ci0KLS8qIE5vdGUgdG8gdGhlIGF1dGhvciBvZiB0aGlzIGNvZGU6IGRpZCBpdCBldmVyIG9jY3VyIHRvCi0gICB5b3Ugd2h5IHRoZSBpZmRlZnMgYXJlIG5lZWRlZD8gVGhpbmsgYWJvdXQgaXQgYWdhaW4uIC1BSyAqLwotI2lmZGVmIENPTkZJR19YODZfNjQKLSMgIGRlZmluZSBDT01QQVRfVEVTVCBpc19jb21wYXRfdGFzaygpCi0jZWxpZiBkZWZpbmVkKENPTkZJR19JQTY0KQotIyAgZGVmaW5lIENPTVBBVF9URVNUIElTX0lBMzJfUFJPQ0VTUyh0YXNrX3B0X3JlZ3MoY3VycmVudCkpCi0jZWxpZiBkZWZpbmVkKENPTkZJR19TMzkwKQotIyAgZGVmaW5lIENPTVBBVF9URVNUIHRlc3RfdGhyZWFkX2ZsYWcoVElGXzMxQklUKQotI2VsaWYgZGVmaW5lZChDT05GSUdfTUlQUykKLSMgIGRlZmluZSBDT01QQVRfVEVTVCB0ZXN0X3RocmVhZF9mbGFnKFRJRl8zMkJJVF9BRERSKQotI2Vsc2UKLSMgIGRlZmluZSBDT01QQVRfVEVTVCB0ZXN0X3RocmVhZF9mbGFnKFRJRl8zMkJJVCkKLSNlbmRpZgotCi1zdGF0aWMgaW5saW5lIHNpemVfdCBldmRldl9ldmVudF9zaXplKHZvaWQpCi17Ci0JcmV0dXJuIENPTVBBVF9URVNUID8KLQkJc2l6ZW9mKHN0cnVjdCBpbnB1dF9ldmVudF9jb21wYXQpIDogc2l6ZW9mKHN0cnVjdCBpbnB1dF9ldmVudCk7Ci19Ci0KLXN0YXRpYyBpbnQgZXZkZXZfZXZlbnRfZnJvbV91c2VyKGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsCi0JCQkJIHN0cnVjdCBpbnB1dF9ldmVudCAqZXZlbnQpCi17Ci0JaWYgKENPTVBBVF9URVNUKSB7Ci0JCXN0cnVjdCBpbnB1dF9ldmVudF9jb21wYXQgY29tcGF0X2V2ZW50OwotCi0JCWlmIChjb3B5X2Zyb21fdXNlcigmY29tcGF0X2V2ZW50LCBidWZmZXIsCi0JCQkJICAgc2l6ZW9mKHN0cnVjdCBpbnB1dF9ldmVudF9jb21wYXQpKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCi0JCWV2ZW50LT50aW1lLnR2X3NlYyA9IGNvbXBhdF9ldmVudC50aW1lLnR2X3NlYzsKLQkJZXZlbnQtPnRpbWUudHZfdXNlYyA9IGNvbXBhdF9ldmVudC50aW1lLnR2X3VzZWM7Ci0JCWV2ZW50LT50eXBlID0gY29tcGF0X2V2ZW50LnR5cGU7Ci0JCWV2ZW50LT5jb2RlID0gY29tcGF0X2V2ZW50LmNvZGU7Ci0JCWV2ZW50LT52YWx1ZSA9IGNvbXBhdF9ldmVudC52YWx1ZTsKLQotCX0gZWxzZSB7Ci0JCWlmIChjb3B5X2Zyb21fdXNlcihldmVudCwgYnVmZmVyLCBzaXplb2Yoc3RydWN0IGlucHV0X2V2ZW50KSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBldmRldl9ldmVudF90b191c2VyKGNoYXIgX191c2VyICpidWZmZXIsCi0JCQkJY29uc3Qgc3RydWN0IGlucHV0X2V2ZW50ICpldmVudCkKLXsKLQlpZiAoQ09NUEFUX1RFU1QpIHsKLQkJc3RydWN0IGlucHV0X2V2ZW50X2NvbXBhdCBjb21wYXRfZXZlbnQ7Ci0KLQkJY29tcGF0X2V2ZW50LnRpbWUudHZfc2VjID0gZXZlbnQtPnRpbWUudHZfc2VjOwotCQljb21wYXRfZXZlbnQudGltZS50dl91c2VjID0gZXZlbnQtPnRpbWUudHZfdXNlYzsKLQkJY29tcGF0X2V2ZW50LnR5cGUgPSBldmVudC0+dHlwZTsKLQkJY29tcGF0X2V2ZW50LmNvZGUgPSBldmVudC0+Y29kZTsKLQkJY29tcGF0X2V2ZW50LnZhbHVlID0gZXZlbnQtPnZhbHVlOwotCi0JCWlmIChjb3B5X3RvX3VzZXIoYnVmZmVyLCAmY29tcGF0X2V2ZW50LAotCQkJCSBzaXplb2Yoc3RydWN0IGlucHV0X2V2ZW50X2NvbXBhdCkpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQl9IGVsc2UgewotCQlpZiAoY29weV90b191c2VyKGJ1ZmZlciwgZXZlbnQsIHNpemVvZihzdHJ1Y3QgaW5wdXRfZXZlbnQpKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGV2ZGV2X2ZmX2VmZmVjdF9mcm9tX3VzZXIoY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90IHNpemUsCi0JCQkJICAgICBzdHJ1Y3QgZmZfZWZmZWN0ICplZmZlY3QpCi17Ci0JaWYgKENPTVBBVF9URVNUKSB7Ci0JCXN0cnVjdCBmZl9lZmZlY3RfY29tcGF0ICpjb21wYXRfZWZmZWN0OwotCi0JCWlmIChzaXplICE9IHNpemVvZihzdHJ1Y3QgZmZfZWZmZWN0X2NvbXBhdCkpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQotCQkvKgotCQkgKiBJdCBzbyBoYXBwZW5zIHRoYXQgdGhlIHBvaW50ZXIgd2hpY2ggbmVlZHMgdG8gYmUgY2hhbmdlZAotCQkgKiBpcyB0aGUgbGFzdCBmaWVsZCBpbiB0aGUgc3RydWN0dXJlLCBzbyB3ZSBjYW4gY29weSB0aGUKLQkJICogd2hvbGUgdGhpbmcgYW5kIHJlcGxhY2UganVzdCB0aGUgcG9pbnRlci4KLQkJICovCi0KLQkJY29tcGF0X2VmZmVjdCA9IChzdHJ1Y3QgZmZfZWZmZWN0X2NvbXBhdCAqKWVmZmVjdDsKLQotCQlpZiAoY29weV9mcm9tX3VzZXIoY29tcGF0X2VmZmVjdCwgYnVmZmVyLAotCQkJCSAgIHNpemVvZihzdHJ1Y3QgZmZfZWZmZWN0X2NvbXBhdCkpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQkJaWYgKGNvbXBhdF9lZmZlY3QtPnR5cGUgPT0gRkZfUEVSSU9ESUMgJiYKLQkJICAgIGNvbXBhdF9lZmZlY3QtPnUucGVyaW9kaWMud2F2ZWZvcm0gPT0gRkZfQ1VTVE9NKQotCQkJZWZmZWN0LT51LnBlcmlvZGljLmN1c3RvbV9kYXRhID0KLQkJCQljb21wYXRfcHRyKGNvbXBhdF9lZmZlY3QtPnUucGVyaW9kaWMuY3VzdG9tX2RhdGEpOwotCX0gZWxzZSB7Ci0JCWlmIChzaXplICE9IHNpemVvZihzdHJ1Y3QgZmZfZWZmZWN0KSkKLQkJCXJldHVybiAtRUlOVkFMOwotCi0JCWlmIChjb3B5X2Zyb21fdXNlcihlZmZlY3QsIGJ1ZmZlciwgc2l6ZW9mKHN0cnVjdCBmZl9lZmZlY3QpKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCX0KLQotCXJldHVybiAwOwotfQotCi0jZWxzZQotCi1zdGF0aWMgaW5saW5lIHNpemVfdCBldmRldl9ldmVudF9zaXplKHZvaWQpCi17Ci0JcmV0dXJuIHNpemVvZihzdHJ1Y3QgaW5wdXRfZXZlbnQpOwotfQotCi1zdGF0aWMgaW50IGV2ZGV2X2V2ZW50X2Zyb21fdXNlcihjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLAotCQkJCSBzdHJ1Y3QgaW5wdXRfZXZlbnQgKmV2ZW50KQotewotCWlmIChjb3B5X2Zyb21fdXNlcihldmVudCwgYnVmZmVyLCBzaXplb2Yoc3RydWN0IGlucHV0X2V2ZW50KSkpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgZXZkZXZfZXZlbnRfdG9fdXNlcihjaGFyIF9fdXNlciAqYnVmZmVyLAotCQkJCWNvbnN0IHN0cnVjdCBpbnB1dF9ldmVudCAqZXZlbnQpCi17Ci0JaWYgKGNvcHlfdG9fdXNlcihidWZmZXIsIGV2ZW50LCBzaXplb2Yoc3RydWN0IGlucHV0X2V2ZW50KSkpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgZXZkZXZfZmZfZWZmZWN0X2Zyb21fdXNlcihjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3Qgc2l6ZSwKLQkJCQkgICAgIHN0cnVjdCBmZl9lZmZlY3QgKmVmZmVjdCkKLXsKLQlpZiAoc2l6ZSAhPSBzaXplb2Yoc3RydWN0IGZmX2VmZmVjdCkpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKGNvcHlfZnJvbV91c2VyKGVmZmVjdCwgYnVmZmVyLCBzaXplb2Yoc3RydWN0IGZmX2VmZmVjdCkpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCXJldHVybiAwOwotfQotCi0jZW5kaWYgLyogQ09ORklHX0NPTVBBVCAqLwotCiBzdGF0aWMgc3NpemVfdCBldmRldl93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwKIAkJCSAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQogewpAQCAtNDkwLDE0ICszMDksMTQgQEAKIAogCXdoaWxlIChyZXR2YWwgPCBjb3VudCkgewogCi0JCWlmIChldmRldl9ldmVudF9mcm9tX3VzZXIoYnVmZmVyICsgcmV0dmFsLCAmZXZlbnQpKSB7CisJCWlmIChpbnB1dF9ldmVudF9mcm9tX3VzZXIoYnVmZmVyICsgcmV0dmFsLCAmZXZlbnQpKSB7CiAJCQlyZXR2YWwgPSAtRUZBVUxUOwogCQkJZ290byBvdXQ7CiAJCX0KIAogCQlpbnB1dF9pbmplY3RfZXZlbnQoJmV2ZGV2LT5oYW5kbGUsCiAJCQkJICAgZXZlbnQudHlwZSwgZXZlbnQuY29kZSwgZXZlbnQudmFsdWUpOwotCQlyZXR2YWwgKz0gZXZkZXZfZXZlbnRfc2l6ZSgpOworCQlyZXR2YWwgKz0gaW5wdXRfZXZlbnRfc2l6ZSgpOwogCX0KIAogIG91dDoKQEAgLTUzMSw3ICszNTAsNyBAQAogCXN0cnVjdCBpbnB1dF9ldmVudCBldmVudDsKIAlpbnQgcmV0dmFsOwogCi0JaWYgKGNvdW50IDwgZXZkZXZfZXZlbnRfc2l6ZSgpKQorCWlmIChjb3VudCA8IGlucHV0X2V2ZW50X3NpemUoKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlpZiAoY2xpZW50LT5oZWFkID09IGNsaWVudC0+dGFpbCAmJiBldmRldi0+ZXhpc3QgJiYKQEAgLTU0NiwxMyArMzY1LDEzIEBACiAJaWYgKCFldmRldi0+ZXhpc3QpCiAJCXJldHVybiAtRU5PREVWOwogCi0Jd2hpbGUgKHJldHZhbCArIGV2ZGV2X2V2ZW50X3NpemUoKSA8PSBjb3VudCAmJgorCXdoaWxlIChyZXR2YWwgKyBpbnB1dF9ldmVudF9zaXplKCkgPD0gY291bnQgJiYKIAkgICAgICAgZXZkZXZfZmV0Y2hfbmV4dF9ldmVudChjbGllbnQsICZldmVudCkpIHsKIAotCQlpZiAoZXZkZXZfZXZlbnRfdG9fdXNlcihidWZmZXIgKyByZXR2YWwsICZldmVudCkpCisJCWlmIChpbnB1dF9ldmVudF90b191c2VyKGJ1ZmZlciArIHJldHZhbCwgJmV2ZW50KSkKIAkJCXJldHVybiAtRUZBVUxUOwogCi0JCXJldHZhbCArPSBldmRldl9ldmVudF9zaXplKCk7CisJCXJldHZhbCArPSBpbnB1dF9ldmVudF9zaXplKCk7CiAJfQogCiAJcmV0dXJuIHJldHZhbDsKQEAgLTgyMyw3ICs2NDIsNyBAQAogCiAJCQlpZiAoX0lPQ19OUihjbWQpID09IF9JT0NfTlIoRVZJT0NTRkYpKSB7CiAKLQkJCQlpZiAoZXZkZXZfZmZfZWZmZWN0X2Zyb21fdXNlcihwLCBfSU9DX1NJWkUoY21kKSwgJmVmZmVjdCkpCisJCQkJaWYgKGlucHV0X2ZmX2VmZmVjdF9mcm9tX3VzZXIocCwgX0lPQ19TSVpFKGNtZCksICZlZmZlY3QpKQogCQkJCQlyZXR1cm4gLUVGQVVMVDsKIAogCQkJCWVycm9yID0gaW5wdXRfZmZfdXBsb2FkKGRldiwgJmVmZmVjdCwgZmlsZSk7CkBAIC0xMDAwLDcgKzgxOSw3IEBACiAJZXZkZXYtPmhhbmRsZS5oYW5kbGVyID0gaGFuZGxlcjsKIAlldmRldi0+aGFuZGxlLnByaXZhdGUgPSBldmRldjsKIAotCXN0cmxjcHkoZXZkZXYtPmRldi5idXNfaWQsIGV2ZGV2LT5uYW1lLCBzaXplb2YoZXZkZXYtPmRldi5idXNfaWQpKTsKKwlkZXZfc2V0X25hbWUoJmV2ZGV2LT5kZXYsIGV2ZGV2LT5uYW1lKTsKIAlldmRldi0+ZGV2LmRldnQgPSBNS0RFVihJTlBVVF9NQUpPUiwgRVZERVZfTUlOT1JfQkFTRSArIG1pbm9yKTsKIAlldmRldi0+ZGV2LmNsYXNzID0gJmlucHV0X2NsYXNzOwogCWV2ZGV2LT5kZXYucGFyZW50ID0gJmRldi0+ZGV2OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9nYW1lcG9ydC9nYW1lcG9ydC5jIGIvZHJpdmVycy9pbnB1dC9nYW1lcG9ydC9nYW1lcG9ydC5jCmluZGV4IDI4ODBlYWEuLmViZjRiZTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvZ2FtZXBvcnQvZ2FtZXBvcnQuYworKysgYi9kcml2ZXJzL2lucHV0L2dhbWVwb3J0L2dhbWVwb3J0LmMKQEAgLTUzMCw4ICs1MzAsNyBAQAogCiAJbXV0ZXhfaW5pdCgmZ2FtZXBvcnQtPmRydl9tdXRleCk7CiAJZGV2aWNlX2luaXRpYWxpemUoJmdhbWVwb3J0LT5kZXYpOwotCXNucHJpbnRmKGdhbWVwb3J0LT5kZXYuYnVzX2lkLCBzaXplb2YoZ2FtZXBvcnQtPmRldi5idXNfaWQpLAotCQkgImdhbWVwb3J0JWx1IiwgKHVuc2lnbmVkIGxvbmcpYXRvbWljX2luY19yZXR1cm4oJmdhbWVwb3J0X25vKSAtIDEpOworCWRldl9zZXRfbmFtZSgmZ2FtZXBvcnQtPmRldiwgImdhbWVwb3J0JWx1IiwgKHVuc2lnbmVkIGxvbmcpYXRvbWljX2luY19yZXR1cm4oJmdhbWVwb3J0X25vKSAtIDEpOwogCWdhbWVwb3J0LT5kZXYuYnVzID0gJmdhbWVwb3J0X2J1czsKIAlnYW1lcG9ydC0+ZGV2LnJlbGVhc2UgPSBnYW1lcG9ydF9yZWxlYXNlX3BvcnQ7CiAJaWYgKGdhbWVwb3J0LT5wYXJlbnQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2dhbWVwb3J0L25zNTU4LmMgYi9kcml2ZXJzL2lucHV0L2dhbWVwb3J0L25zNTU4LmMKaW5kZXggMmIyODJjZC4uZGI1NTZiNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9nYW1lcG9ydC9uczU1OC5jCisrKyBiL2RyaXZlcnMvaW5wdXQvZ2FtZXBvcnQvbnM1NTguYwpAQCAtMjI2LDcgKzIyNiw3IEBACiAJbnM1NTgtPmdhbWVwb3J0ID0gcG9ydDsKIAogCWdhbWVwb3J0X3NldF9uYW1lKHBvcnQsICJOUzU1OCBQblAgR2FtZXBvcnQiKTsKLQlnYW1lcG9ydF9zZXRfcGh5cyhwb3J0LCAicG5wJXMvZ2FtZXBvcnQwIiwgZGV2LT5kZXYuYnVzX2lkKTsKKwlnYW1lcG9ydF9zZXRfcGh5cyhwb3J0LCAicG5wJXMvZ2FtZXBvcnQwIiwgZGV2X25hbWUoJmRldi0+ZGV2KSk7CiAJcG9ydC0+ZGV2LnBhcmVudCA9ICZkZXYtPmRldjsKIAlwb3J0LT5pbyA9IGlvcG9ydDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9pbnB1dC1jb21wYXQuYyBiL2RyaXZlcnMvaW5wdXQvaW5wdXQtY29tcGF0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWFjY2I4OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaW5wdXQvaW5wdXQtY29tcGF0LmMKQEAgLTAsMCArMSwxMzUgQEAKKy8qCisgKiAzMmJpdCBjb21wYXRpYmlsaXR5IHdyYXBwZXJzIGZvciB0aGUgaW5wdXQgc3Vic3lzdGVtLgorICoKKyAqIFZlcnkgaGVhdmlseSBiYXNlZCBvbiBldmRldi5jIC0gQ29weXJpZ2h0IChjKSAxOTk5LTIwMDIgVm9qdGVjaCBQYXZsaWsKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgImlucHV0LWNvbXBhdC5oIgorCisjaWZkZWYgQ09ORklHX0NPTVBBVAorCitpbnQgaW5wdXRfZXZlbnRfZnJvbV91c2VyKGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsCisJCQkgIHN0cnVjdCBpbnB1dF9ldmVudCAqZXZlbnQpCit7CisJaWYgKElOUFVUX0NPTVBBVF9URVNUKSB7CisJCXN0cnVjdCBpbnB1dF9ldmVudF9jb21wYXQgY29tcGF0X2V2ZW50OworCisJCWlmIChjb3B5X2Zyb21fdXNlcigmY29tcGF0X2V2ZW50LCBidWZmZXIsCisJCQkJICAgc2l6ZW9mKHN0cnVjdCBpbnB1dF9ldmVudF9jb21wYXQpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCWV2ZW50LT50aW1lLnR2X3NlYyA9IGNvbXBhdF9ldmVudC50aW1lLnR2X3NlYzsKKwkJZXZlbnQtPnRpbWUudHZfdXNlYyA9IGNvbXBhdF9ldmVudC50aW1lLnR2X3VzZWM7CisJCWV2ZW50LT50eXBlID0gY29tcGF0X2V2ZW50LnR5cGU7CisJCWV2ZW50LT5jb2RlID0gY29tcGF0X2V2ZW50LmNvZGU7CisJCWV2ZW50LT52YWx1ZSA9IGNvbXBhdF9ldmVudC52YWx1ZTsKKworCX0gZWxzZSB7CisJCWlmIChjb3B5X2Zyb21fdXNlcihldmVudCwgYnVmZmVyLCBzaXplb2Yoc3RydWN0IGlucHV0X2V2ZW50KSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IGlucHV0X2V2ZW50X3RvX3VzZXIoY2hhciBfX3VzZXIgKmJ1ZmZlciwKKwkJCWNvbnN0IHN0cnVjdCBpbnB1dF9ldmVudCAqZXZlbnQpCit7CisJaWYgKElOUFVUX0NPTVBBVF9URVNUKSB7CisJCXN0cnVjdCBpbnB1dF9ldmVudF9jb21wYXQgY29tcGF0X2V2ZW50OworCisJCWNvbXBhdF9ldmVudC50aW1lLnR2X3NlYyA9IGV2ZW50LT50aW1lLnR2X3NlYzsKKwkJY29tcGF0X2V2ZW50LnRpbWUudHZfdXNlYyA9IGV2ZW50LT50aW1lLnR2X3VzZWM7CisJCWNvbXBhdF9ldmVudC50eXBlID0gZXZlbnQtPnR5cGU7CisJCWNvbXBhdF9ldmVudC5jb2RlID0gZXZlbnQtPmNvZGU7CisJCWNvbXBhdF9ldmVudC52YWx1ZSA9IGV2ZW50LT52YWx1ZTsKKworCQlpZiAoY29weV90b191c2VyKGJ1ZmZlciwgJmNvbXBhdF9ldmVudCwKKwkJCQkgc2l6ZW9mKHN0cnVjdCBpbnB1dF9ldmVudF9jb21wYXQpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJfSBlbHNlIHsKKwkJaWYgKGNvcHlfdG9fdXNlcihidWZmZXIsIGV2ZW50LCBzaXplb2Yoc3RydWN0IGlucHV0X2V2ZW50KSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IGlucHV0X2ZmX2VmZmVjdF9mcm9tX3VzZXIoY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90IHNpemUsCisJCQkgICAgICBzdHJ1Y3QgZmZfZWZmZWN0ICplZmZlY3QpCit7CisJaWYgKElOUFVUX0NPTVBBVF9URVNUKSB7CisJCXN0cnVjdCBmZl9lZmZlY3RfY29tcGF0ICpjb21wYXRfZWZmZWN0OworCisJCWlmIChzaXplICE9IHNpemVvZihzdHJ1Y3QgZmZfZWZmZWN0X2NvbXBhdCkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQkvKgorCQkgKiBJdCBzbyBoYXBwZW5zIHRoYXQgdGhlIHBvaW50ZXIgd2hpY2ggbmVlZHMgdG8gYmUgY2hhbmdlZAorCQkgKiBpcyB0aGUgbGFzdCBmaWVsZCBpbiB0aGUgc3RydWN0dXJlLCBzbyB3ZSBjYW4gcmV0cmlldmUgdGhlCisJCSAqIHdob2xlIHRoaW5nIGFuZCByZXBsYWNlIGp1c3QgdGhlIHBvaW50ZXIuCisJCSAqLworCQljb21wYXRfZWZmZWN0ID0gKHN0cnVjdCBmZl9lZmZlY3RfY29tcGF0ICopZWZmZWN0OworCisJCWlmIChjb3B5X2Zyb21fdXNlcihjb21wYXRfZWZmZWN0LCBidWZmZXIsCisJCQkJICAgc2l6ZW9mKHN0cnVjdCBmZl9lZmZlY3RfY29tcGF0KSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlpZiAoY29tcGF0X2VmZmVjdC0+dHlwZSA9PSBGRl9QRVJJT0RJQyAmJgorCQkgICAgY29tcGF0X2VmZmVjdC0+dS5wZXJpb2RpYy53YXZlZm9ybSA9PSBGRl9DVVNUT00pCisJCQllZmZlY3QtPnUucGVyaW9kaWMuY3VzdG9tX2RhdGEgPQorCQkJCWNvbXBhdF9wdHIoY29tcGF0X2VmZmVjdC0+dS5wZXJpb2RpYy5jdXN0b21fZGF0YSk7CisJfSBlbHNlIHsKKwkJaWYgKHNpemUgIT0gc2l6ZW9mKHN0cnVjdCBmZl9lZmZlY3QpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKGVmZmVjdCwgYnVmZmVyLCBzaXplb2Yoc3RydWN0IGZmX2VmZmVjdCkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKyNlbHNlCisKK2ludCBpbnB1dF9ldmVudF9mcm9tX3VzZXIoY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwKKwkJCSBzdHJ1Y3QgaW5wdXRfZXZlbnQgKmV2ZW50KQoreworCWlmIChjb3B5X2Zyb21fdXNlcihldmVudCwgYnVmZmVyLCBzaXplb2Yoc3RydWN0IGlucHV0X2V2ZW50KSkpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBpbnB1dF9ldmVudF90b191c2VyKGNoYXIgX191c2VyICpidWZmZXIsCisJCQljb25zdCBzdHJ1Y3QgaW5wdXRfZXZlbnQgKmV2ZW50KQoreworCWlmIChjb3B5X3RvX3VzZXIoYnVmZmVyLCBldmVudCwgc2l6ZW9mKHN0cnVjdCBpbnB1dF9ldmVudCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiAwOworfQorCitpbnQgaW5wdXRfZmZfZWZmZWN0X2Zyb21fdXNlcihjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3Qgc2l6ZSwKKwkJCSAgICAgIHN0cnVjdCBmZl9lZmZlY3QgKmVmZmVjdCkKK3sKKwlpZiAoc2l6ZSAhPSBzaXplb2Yoc3RydWN0IGZmX2VmZmVjdCkpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGNvcHlfZnJvbV91c2VyKGVmZmVjdCwgYnVmZmVyLCBzaXplb2Yoc3RydWN0IGZmX2VmZmVjdCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiAwOworfQorCisjZW5kaWYgLyogQ09ORklHX0NPTVBBVCAqLworCitFWFBPUlRfU1lNQk9MX0dQTChpbnB1dF9ldmVudF9mcm9tX3VzZXIpOworRVhQT1JUX1NZTUJPTF9HUEwoaW5wdXRfZXZlbnRfdG9fdXNlcik7CitFWFBPUlRfU1lNQk9MX0dQTChpbnB1dF9mZl9lZmZlY3RfZnJvbV91c2VyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvaW5wdXQtY29tcGF0LmggYi9kcml2ZXJzL2lucHV0L2lucHV0LWNvbXBhdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3Y2Q5ZWEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2lucHV0L2lucHV0LWNvbXBhdC5oCkBAIC0wLDAgKzEsOTQgQEAKKyNpZm5kZWYgX0lOUFVUX0NPTVBBVF9ICisjZGVmaW5lIF9JTlBVVF9DT01QQVRfSAorCisvKgorICogMzJiaXQgY29tcGF0aWJpbGl0eSB3cmFwcGVycyBmb3IgdGhlIGlucHV0IHN1YnN5c3RlbS4KKyAqCisgKiBWZXJ5IGhlYXZpbHkgYmFzZWQgb24gZXZkZXYuYyAtIENvcHlyaWdodCAoYykgMTk5OS0yMDAyIFZvanRlY2ggUGF2bGlrCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21wYXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgorCisjaWZkZWYgQ09ORklHX0NPTVBBVAorCisvKiBOb3RlIHRvIHRoZSBhdXRob3Igb2YgdGhpcyBjb2RlOiBkaWQgaXQgZXZlciBvY2N1ciB0bworICAgeW91IHdoeSB0aGUgaWZkZWZzIGFyZSBuZWVkZWQ/IFRoaW5rIGFib3V0IGl0IGFnYWluLiAtQUsgKi8KKyNpZmRlZiBDT05GSUdfWDg2XzY0CisjICBkZWZpbmUgSU5QVVRfQ09NUEFUX1RFU1QgaXNfY29tcGF0X3Rhc2soKQorI2VsaWYgZGVmaW5lZChDT05GSUdfSUE2NCkKKyMgIGRlZmluZSBJTlBVVF9DT01QQVRfVEVTVCBJU19JQTMyX1BST0NFU1ModGFza19wdF9yZWdzKGN1cnJlbnQpKQorI2VsaWYgZGVmaW5lZChDT05GSUdfUzM5MCkKKyMgIGRlZmluZSBJTlBVVF9DT01QQVRfVEVTVCB0ZXN0X3RocmVhZF9mbGFnKFRJRl8zMUJJVCkKKyNlbGlmIGRlZmluZWQoQ09ORklHX01JUFMpCisjICBkZWZpbmUgSU5QVVRfQ09NUEFUX1RFU1QgdGVzdF90aHJlYWRfZmxhZyhUSUZfMzJCSVRfQUREUikKKyNlbHNlCisjICBkZWZpbmUgSU5QVVRfQ09NUEFUX1RFU1QgdGVzdF90aHJlYWRfZmxhZyhUSUZfMzJCSVQpCisjZW5kaWYKKworc3RydWN0IGlucHV0X2V2ZW50X2NvbXBhdCB7CisJc3RydWN0IGNvbXBhdF90aW1ldmFsIHRpbWU7CisJX191MTYgdHlwZTsKKwlfX3UxNiBjb2RlOworCV9fczMyIHZhbHVlOworfTsKKworc3RydWN0IGZmX3BlcmlvZGljX2VmZmVjdF9jb21wYXQgeworCV9fdTE2IHdhdmVmb3JtOworCV9fdTE2IHBlcmlvZDsKKwlfX3MxNiBtYWduaXR1ZGU7CisJX19zMTYgb2Zmc2V0OworCV9fdTE2IHBoYXNlOworCisJc3RydWN0IGZmX2VudmVsb3BlIGVudmVsb3BlOworCisJX191MzIgY3VzdG9tX2xlbjsKKwljb21wYXRfdXB0cl90IGN1c3RvbV9kYXRhOworfTsKKworc3RydWN0IGZmX2VmZmVjdF9jb21wYXQgeworCV9fdTE2IHR5cGU7CisJX19zMTYgaWQ7CisJX191MTYgZGlyZWN0aW9uOworCXN0cnVjdCBmZl90cmlnZ2VyIHRyaWdnZXI7CisJc3RydWN0IGZmX3JlcGxheSByZXBsYXk7CisKKwl1bmlvbiB7CisJCXN0cnVjdCBmZl9jb25zdGFudF9lZmZlY3QgY29uc3RhbnQ7CisJCXN0cnVjdCBmZl9yYW1wX2VmZmVjdCByYW1wOworCQlzdHJ1Y3QgZmZfcGVyaW9kaWNfZWZmZWN0X2NvbXBhdCBwZXJpb2RpYzsKKwkJc3RydWN0IGZmX2NvbmRpdGlvbl9lZmZlY3QgY29uZGl0aW9uWzJdOyAvKiBPbmUgZm9yIGVhY2ggYXhpcyAqLworCQlzdHJ1Y3QgZmZfcnVtYmxlX2VmZmVjdCBydW1ibGU7CisJfSB1OworfTsKKworc3RhdGljIGlubGluZSBzaXplX3QgaW5wdXRfZXZlbnRfc2l6ZSh2b2lkKQoreworCXJldHVybiBJTlBVVF9DT01QQVRfVEVTVCA/CisJCXNpemVvZihzdHJ1Y3QgaW5wdXRfZXZlbnRfY29tcGF0KSA6IHNpemVvZihzdHJ1Y3QgaW5wdXRfZXZlbnQpOworfQorCisjZWxzZQorCitzdGF0aWMgaW5saW5lIHNpemVfdCBpbnB1dF9ldmVudF9zaXplKHZvaWQpCit7CisJcmV0dXJuIHNpemVvZihzdHJ1Y3QgaW5wdXRfZXZlbnQpOworfQorCisjZW5kaWYgLyogQ09ORklHX0NPTVBBVCAqLworCitpbnQgaW5wdXRfZXZlbnRfZnJvbV91c2VyKGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsCisJCQkgc3RydWN0IGlucHV0X2V2ZW50ICpldmVudCk7CisKK2ludCBpbnB1dF9ldmVudF90b191c2VyKGNoYXIgX191c2VyICpidWZmZXIsCisJCQljb25zdCBzdHJ1Y3QgaW5wdXRfZXZlbnQgKmV2ZW50KTsKKworaW50IGlucHV0X2ZmX2VmZmVjdF9mcm9tX3VzZXIoY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90IHNpemUsCisJCQkgICAgICBzdHJ1Y3QgZmZfZWZmZWN0ICplZmZlY3QpOworCisjZW5kaWYgLyogX0lOUFVUX0NPTVBBVF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2lucHV0LmMgYi9kcml2ZXJzL2lucHV0L2lucHV0LmMKaW5kZXggYzEzY2VkMy4uMTczMGQ3MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9pbnB1dC5jCisrKyBiL2RyaXZlcnMvaW5wdXQvaW5wdXQuYwpAQCAtMTM4OSw4ICsxMzg5LDggQEAKIAlpZiAoIWRldi0+c2V0a2V5Y29kZSkKIAkJZGV2LT5zZXRrZXljb2RlID0gaW5wdXRfZGVmYXVsdF9zZXRrZXljb2RlOwogCi0Jc25wcmludGYoZGV2LT5kZXYuYnVzX2lkLCBzaXplb2YoZGV2LT5kZXYuYnVzX2lkKSwKLQkJICJpbnB1dCVsZCIsICh1bnNpZ25lZCBsb25nKSBhdG9taWNfaW5jX3JldHVybigmaW5wdXRfbm8pIC0gMSk7CisJZGV2X3NldF9uYW1lKCZkZXYtPmRldiwgImlucHV0JWxkIiwKKwkJICAgICAodW5zaWduZWQgbG9uZykgYXRvbWljX2luY19yZXR1cm4oJmlucHV0X25vKSAtIDEpOwogCiAJZXJyb3IgPSBkZXZpY2VfYWRkKCZkZXYtPmRldik7CiAJaWYgKGVycm9yKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9qb3lkZXYuYyBiL2RyaXZlcnMvaW5wdXQvam95ZGV2LmMKaW5kZXggYTg1YjE0OC4uNmYyMzY2MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9qb3lkZXYuYworKysgYi9kcml2ZXJzL2lucHV0L2pveWRldi5jCkBAIC04MDAsNyArODAwLDcgQEAKIAkJfQogCX0KIAotCXN0cmxjcHkoam95ZGV2LT5kZXYuYnVzX2lkLCBqb3lkZXYtPm5hbWUsIHNpemVvZihqb3lkZXYtPmRldi5idXNfaWQpKTsKKwlkZXZfc2V0X25hbWUoJmpveWRldi0+ZGV2LCBqb3lkZXYtPm5hbWUpOwogCWpveWRldi0+ZGV2LmRldnQgPSBNS0RFVihJTlBVVF9NQUpPUiwgSk9ZREVWX01JTk9SX0JBU0UgKyBtaW5vcik7CiAJam95ZGV2LT5kZXYuY2xhc3MgPSAmaW5wdXRfY2xhc3M7CiAJam95ZGV2LT5kZXYucGFyZW50ID0gJmRldi0+ZGV2OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9qb3lzdGljay9LY29uZmlnIGIvZHJpdmVycy9pbnB1dC9qb3lzdGljay9LY29uZmlnCmluZGV4IGJlNWMxNGEuLmIxMTQxOTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvam95c3RpY2svS2NvbmZpZworKysgYi9kcml2ZXJzL2lucHV0L2pveXN0aWNrL0tjb25maWcKQEAgLTI5NCw0ICsyOTQsMjggQEAKIAkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgdGhlIExFRCB3aGljaCBzdXJyb3VuZHMgdGhlIEJpZyBYIG9uCiAJICBYQm94IDM2MCBjb250cm9sbGVyLgogCitjb25maWcgSk9ZU1RJQ0tfV0FMS0VSQTA3MDEKKwl0cmlzdGF0ZSAiV2Fsa2VyYSBXSy0wNzAxIFJDIHRyYW5zbWl0dGVyIgorCWRlcGVuZHMgb24gSElHSF9SRVNfVElNRVJTICYmIFBBUlBPUlQKKwloZWxwCisJICBTYXkgWSBvciBNIGhlcmUgaWYgeW91IGhhdmUgYSBXYWxrZXJhIFdLLTA3MDEgdHJhbnNtaXR0ZXIgd2hpY2ggaXMKKwkgIHN1cHBsaWVkIHdpdGggYSByZWFkeSB0byBmbHkgV2Fsa2VyYSBoZWxpY29wdGVycyBzdWNoIGFzIEhNMzYsCisJICBITTM3LCBITTYwIGFuZCB3YW50IHRvIHVzZSBpdCB2aWEgcGFycG9ydCBhcyBhIGpveXN0aWNrLiBNb3JlCisJICBpbmZvcm1hdGlvbiBpcyBhdmFpbGFibGU6IDxmaWxlOkRvY3VtZW50YXRpb24vaW5wdXQvd2Fsa2VyYTA3MDEudHh0PgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCB3YWxrZXJhMDcwMS4KKworY29uZmlnIEpPWVNUSUNLX01BUExFCisJdHJpc3RhdGUgIkRyZWFtY2FzdCBjb250cm9sIHBhZCIKKwlkZXBlbmRzIG9uIE1BUExFCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3UgaGF2ZSBhIFNFR0EgRHJlYW1jYXN0IGFuZCB3YW50IHRvIHVzZSB5b3VyCisJICBjb250cm9sbGVyIGFzIGEgam95c3RpY2suCisKKwkgIE1vc3QgRHJlYW1jYXN0IHVzZXJzIHdpbGwgc2F5IFkuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBhcyBhIG1vZHVsZSBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlIHdpbGwgYmUgY2FsbGVkCisJICBtYXBsZWNvbnRyb2wuCisKIGVuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2pveXN0aWNrL01ha2VmaWxlIGIvZHJpdmVycy9pbnB1dC9qb3lzdGljay9NYWtlZmlsZQppbmRleCBmZGJmOGM0Li5mM2E4Y2JlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2pveXN0aWNrL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvaW5wdXQvam95c3RpY2svTWFrZWZpbGUKQEAgLTE5LDYgKzE5LDcgQEAKIG9iai0kKENPTkZJR19KT1lTVElDS19JTlRFUkFDVCkJCSs9IGludGVyYWN0Lm8KIG9iai0kKENPTkZJR19KT1lTVElDS19KT1lEVU1QKQkJKz0gam95ZHVtcC5vCiBvYmotJChDT05GSUdfSk9ZU1RJQ0tfTUFHRUxMQU4pCQkrPSBtYWdlbGxhbi5vCitvYmotJChDT05GSUdfSk9ZU1RJQ0tfTUFQTEUpCQkrPSBtYXBsZWNvbnRyb2wubwogb2JqLSQoQ09ORklHX0pPWVNUSUNLX1NJREVXSU5ERVIpCSs9IHNpZGV3aW5kZXIubwogb2JqLSQoQ09ORklHX0pPWVNUSUNLX1NQQUNFQkFMTCkJKz0gc3BhY2ViYWxsLm8KIG9iai0kKENPTkZJR19KT1lTVElDS19TUEFDRU9SQikJCSs9IHNwYWNlb3JiLm8KQEAgLTI5LDQgKzMwLDUgQEAKIG9iai0kKENPTkZJR19KT1lTVElDS19XQVJSSU9SKQkJKz0gd2Fycmlvci5vCiBvYmotJChDT05GSUdfSk9ZU1RJQ0tfWFBBRCkJCSs9IHhwYWQubwogb2JqLSQoQ09ORklHX0pPWVNUSUNLX1pIRU5IVUEpCQkrPSB6aGVuaHVhLm8KK29iai0kKENPTkZJR19KT1lTVElDS19XQUxLRVJBMDcwMSkJKz0gd2Fsa2VyYTA3MDEubwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2pveXN0aWNrL21hcGxlY29udHJvbC5jIGIvZHJpdmVycy9pbnB1dC9qb3lzdGljay9tYXBsZWNvbnRyb2wuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTAwNDdiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pbnB1dC9qb3lzdGljay9tYXBsZWNvbnRyb2wuYwpAQCAtMCwwICsxLDE5MyBAQAorLyoKKyAqCVNFR0EgRHJlYW1jYXN0IGNvbnRyb2xsZXIgZHJpdmVyCisgKglCYXNlZCBvbiBkcml2ZXJzL3VzYi9pZm9yY2UuYworICoKKyAqCUNvcHlyaWdodCBZYWVnYXNoaSBUYWtlc2hpLCAyMDAxCisgKglBZHJpYW4gTWNNZW5hbWluLCAyMDA4CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L21hcGxlLmg+CisKK01PRFVMRV9BVVRIT1IoIkFkcmlhbiBNY01lbmFtaW4gPGFkcmlhbkBtY21lbi5kZW1vbi5jby51az4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiU0VHQSBEcmVhbWNhc3QgY29udHJvbGxlciBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworc3RydWN0IGRjX3BhZCB7CisJc3RydWN0IGlucHV0X2RldiAqZGV2OworCXN0cnVjdCBtYXBsZV9kZXZpY2UgKm1kZXY7Cit9OworCitzdGF0aWMgdm9pZCBkY19wYWRfY2FsbGJhY2soc3RydWN0IG1hcGxlcSAqbXEpCit7CisJdW5zaWduZWQgc2hvcnQgYnV0dG9uczsKKwlzdHJ1Y3QgbWFwbGVfZGV2aWNlICptYXBsZWRldiA9IG1xLT5kZXY7CisJc3RydWN0IGRjX3BhZCAqcGFkID0gbWFwbGVfZ2V0X2RydmRhdGEobWFwbGVkZXYpOworCXN0cnVjdCBpbnB1dF9kZXYgKmRldiA9IHBhZC0+ZGV2OworCXVuc2lnbmVkIGNoYXIgKnJlcyA9IG1xLT5yZWN2YnVmOworCisJYnV0dG9ucyA9IH5sZTE2X3RvX2NwdXAoKF9fbGUxNiAqKShyZXMgKyA4KSk7CisKKwlpbnB1dF9yZXBvcnRfYWJzKGRldiwgQUJTX0hBVDBZLAorCQkoYnV0dG9ucyAmIDB4MDAxMCA/IC0xIDogMCkgKyAoYnV0dG9ucyAmIDB4MDAyMCA/IDEgOiAwKSk7CisJaW5wdXRfcmVwb3J0X2FicyhkZXYsIEFCU19IQVQwWCwKKwkJKGJ1dHRvbnMgJiAweDAwNDAgPyAtMSA6IDApICsgKGJ1dHRvbnMgJiAweDAwODAgPyAxIDogMCkpOworCWlucHV0X3JlcG9ydF9hYnMoZGV2LCBBQlNfSEFUMVksCisJCShidXR0b25zICYgMHgxMDAwID8gLTEgOiAwKSArIChidXR0b25zICYgMHgyMDAwID8gMSA6IDApKTsKKwlpbnB1dF9yZXBvcnRfYWJzKGRldiwgQUJTX0hBVDFYLAorCQkoYnV0dG9ucyAmIDB4NDAwMCA/IC0xIDogMCkgKyAoYnV0dG9ucyAmIDB4ODAwMCA/IDEgOiAwKSk7CisKKwlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX0MsICAgICAgYnV0dG9ucyAmIDB4MDAwMSk7CisJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9CLCAgICAgIGJ1dHRvbnMgJiAweDAwMDIpOworCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fQSwgICAgICBidXR0b25zICYgMHgwMDA0KTsKKwlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX1NUQVJULCAgYnV0dG9ucyAmIDB4MDAwOCk7CisJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9aLCAgICAgIGJ1dHRvbnMgJiAweDAxMDApOworCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fWSwgICAgICBidXR0b25zICYgMHgwMjAwKTsKKwlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX1gsICAgICAgYnV0dG9ucyAmIDB4MDQwMCk7CisJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9TRUxFQ1QsIGJ1dHRvbnMgJiAweDA4MDApOworCisJaW5wdXRfcmVwb3J0X2FicyhkZXYsIEFCU19HQVMsICAgIHJlc1sxMF0pOworCWlucHV0X3JlcG9ydF9hYnMoZGV2LCBBQlNfQlJBS0UsICByZXNbMTFdKTsKKwlpbnB1dF9yZXBvcnRfYWJzKGRldiwgQUJTX1gsICAgICAgcmVzWzEyXSk7CisJaW5wdXRfcmVwb3J0X2FicyhkZXYsIEFCU19ZLCAgICAgIHJlc1sxM10pOworCWlucHV0X3JlcG9ydF9hYnMoZGV2LCBBQlNfUlgsICAgICByZXNbMTRdKTsKKwlpbnB1dF9yZXBvcnRfYWJzKGRldiwgQUJTX1JZLCAgICAgcmVzWzE1XSk7Cit9CisKK3N0YXRpYyBpbnQgZGNfcGFkX29wZW4oc3RydWN0IGlucHV0X2RldiAqZGV2KQoreworCXN0cnVjdCBkY19wYWQgKnBhZCA9IGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisKKwltYXBsZV9nZXRjb25kX2NhbGxiYWNrKHBhZC0+bWRldiwgZGNfcGFkX2NhbGxiYWNrLCBIWi8yMCwKKwkJTUFQTEVfRlVOQ19DT05UUk9MTEVSKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBkY19wYWRfY2xvc2Uoc3RydWN0IGlucHV0X2RldiAqZGV2KQoreworCXN0cnVjdCBkY19wYWQgKnBhZCA9IGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisKKwltYXBsZV9nZXRjb25kX2NhbGxiYWNrKHBhZC0+bWRldiwgZGNfcGFkX2NhbGxiYWNrLCAwLAorCQlNQVBMRV9GVU5DX0NPTlRST0xMRVIpOworfQorCisvKiBhbGxvdyB0aGUgY29udHJvbGxlciB0byBiZSB1c2VkICovCitzdGF0aWMgaW50IF9fZGV2aW5pdCBwcm9iZV9tYXBsZV9jb250cm9sbGVyKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdGF0aWMgY29uc3Qgc2hvcnQgYnRuX2JpdFszMl0gPSB7CisJCUJUTl9DLCBCVE5fQiwgQlROX0EsIEJUTl9TVEFSVCwgLTEsIC0xLCAtMSwgLTEsCisJCUJUTl9aLCBCVE5fWSwgQlROX1gsIEJUTl9TRUxFQ1QsIC0xLCAtMSwgLTEsIC0xLAorCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwl9OworCisJc3RhdGljIGNvbnN0IHNob3J0IGFic19iaXRbMzJdID0geworCQktMSwgLTEsIC0xLCAtMSwgQUJTX0hBVDBZLCBBQlNfSEFUMFksIEFCU19IQVQwWCwgQUJTX0hBVDBYLAorCQktMSwgLTEsIC0xLCAtMSwgQUJTX0hBVDFZLCBBQlNfSEFUMVksIEFCU19IQVQxWCwgQUJTX0hBVDFYLAorCQlBQlNfR0FTLCBBQlNfQlJBS0UsIEFCU19YLCBBQlNfWSwgQUJTX1JYLCBBQlNfUlksIC0xLCAtMSwKKwkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCX07CisKKwlzdHJ1Y3QgbWFwbGVfZGV2aWNlICptZGV2ID0gdG9fbWFwbGVfZGV2KGRldik7CisJc3RydWN0IG1hcGxlX2RyaXZlciAqbWRydiA9IHRvX21hcGxlX2RyaXZlcihkZXYtPmRyaXZlcik7CisJaW50IGksIGVycm9yOworCXN0cnVjdCBkY19wYWQgKnBhZDsKKwlzdHJ1Y3QgaW5wdXRfZGV2ICppZGV2OworCXVuc2lnbmVkIGxvbmcgZGF0YSA9IGJlMzJfdG9fY3B1KG1kZXYtPmRldmluZm8uZnVuY3Rpb25fZGF0YVswXSk7CisKKwlwYWQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZGNfcGFkKSwgR0ZQX0tFUk5FTCk7CisJaWRldiA9IGlucHV0X2FsbG9jYXRlX2RldmljZSgpOworCWlmICghcGFkIHx8ICFpZGV2KSB7CisJCWVycm9yID0gLUVOT01FTTsKKwkJZ290byBmYWlsOworCX0KKworCXBhZC0+ZGV2ID0gaWRldjsKKwlwYWQtPm1kZXYgPSBtZGV2OworCisJaWRldi0+b3BlbiA9IGRjX3BhZF9vcGVuOworCWlkZXYtPmNsb3NlID0gZGNfcGFkX2Nsb3NlOworCisJZm9yIChpID0gMDsgaSA8IDMyOyBpKyspIHsKKwkJaWYgKGRhdGEgJiAoMSA8PCBpKSkgeworCQkJaWYgKGJ0bl9iaXRbaV0gPj0gMCkKKwkJCQlfX3NldF9iaXQoYnRuX2JpdFtpXSwgaWRldi0+a2V5Yml0KTsKKwkJCWVsc2UgaWYgKGFic19iaXRbaV0gPj0gMCkKKwkJCQlfX3NldF9iaXQoYWJzX2JpdFtpXSwgaWRldi0+YWJzYml0KTsKKwkJfQorCX0KKworCWlmIChpZGV2LT5rZXliaXRbQklUX1dPUkQoQlROX0pPWVNUSUNLKV0pCisJCWlkZXYtPmV2Yml0WzBdIHw9IEJJVF9NQVNLKEVWX0tFWSk7CisKKwlpZiAoaWRldi0+YWJzYml0WzBdKQorCQlpZGV2LT5ldmJpdFswXSB8PSBCSVRfTUFTSyhFVl9BQlMpOworCisJZm9yIChpID0gQUJTX1g7IGkgPD0gQUJTX0JSQUtFOyBpKyspCisJCWlucHV0X3NldF9hYnNfcGFyYW1zKGlkZXYsIGksIDAsIDI1NSwgMCwgMCk7CisKKwlmb3IgKGkgPSBBQlNfSEFUMFg7IGkgPD0gQUJTX0hBVDNZOyBpKyspCisJCWlucHV0X3NldF9hYnNfcGFyYW1zKGlkZXYsIGksIDEsIC0xLCAwLCAwKTsKKworCWlkZXYtPmRldi5wbGF0Zm9ybV9kYXRhID0gcGFkOworCWlkZXYtPmRldi5wYXJlbnQgPSAmbWRldi0+ZGV2OworCWlkZXYtPm5hbWUgPSBtZGV2LT5wcm9kdWN0X25hbWU7CisJaWRldi0+aWQuYnVzdHlwZSA9IEJVU19IT1NUOworCWlucHV0X3NldF9kcnZkYXRhKGlkZXYsIHBhZCk7CisKKwllcnJvciA9IGlucHV0X3JlZ2lzdGVyX2RldmljZShpZGV2KTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gZmFpbDsKKworCW1kZXYtPmRyaXZlciA9IG1kcnY7CisJbWFwbGVfc2V0X2RydmRhdGEobWRldiwgcGFkKTsKKworCXJldHVybiAwOworCitmYWlsOgorCWlucHV0X2ZyZWVfZGV2aWNlKGlkZXYpOworCWtmcmVlKHBhZCk7CisJbWFwbGVfc2V0X2RydmRhdGEobWRldiwgTlVMTCk7CisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCByZW1vdmVfbWFwbGVfY29udHJvbGxlcihzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG1hcGxlX2RldmljZSAqbWRldiA9IHRvX21hcGxlX2RldihkZXYpOworCXN0cnVjdCBkY19wYWQgKnBhZCA9IG1hcGxlX2dldF9kcnZkYXRhKG1kZXYpOworCisJbWRldi0+Y2FsbGJhY2sgPSBOVUxMOworCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKHBhZC0+ZGV2KTsKKwltYXBsZV9zZXRfZHJ2ZGF0YShtZGV2LCBOVUxMKTsKKwlrZnJlZShwYWQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbWFwbGVfZHJpdmVyIGRjX3BhZF9kcml2ZXIgPSB7CisJLmZ1bmN0aW9uID0JTUFQTEVfRlVOQ19DT05UUk9MTEVSLAorCS5kcnYgPSB7CisJCS5uYW1lCT0gIkRyZWFtY2FzdF9jb250cm9sbGVyIiwKKwkJLnByb2JlCT0gcHJvYmVfbWFwbGVfY29udHJvbGxlciwKKwkJLnJlbW92ZQk9IF9fZGV2ZXhpdF9wKHJlbW92ZV9tYXBsZV9jb250cm9sbGVyKSwKKwl9LAorfTsKKworc3RhdGljIGludCBfX2luaXQgZGNfcGFkX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gbWFwbGVfZHJpdmVyX3JlZ2lzdGVyKCZkY19wYWRfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGRjX3BhZF9leGl0KHZvaWQpCit7CisJbWFwbGVfZHJpdmVyX3VucmVnaXN0ZXIoJmRjX3BhZF9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChkY19wYWRfaW5pdCk7Cittb2R1bGVfZXhpdChkY19wYWRfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2pveXN0aWNrL3dhbGtlcmEwNzAxLmMgYi9kcml2ZXJzL2lucHV0L2pveXN0aWNrL3dhbGtlcmEwNzAxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGRmYTFlZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaW5wdXQvam95c3RpY2svd2Fsa2VyYTA3MDEuYwpAQCAtMCwwICsxLDI5MiBAQAorLyoKKyAqICBQYXJhbGxlbCBwb3J0IHRvIFdhbGtlcmEgV0stMDcwMSBUWCBqb3lzdGljaworICoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDggUGV0ZXIgUG9wb3ZlYworICoKKyAqICBNb3JlIGFib3V0IGRyaXZlcjogIDxmaWxlOkRvY3VtZW50YXRpb24vaW5wdXQvd2Fsa2VyYTA3MDEudHh0PgorICovCisKKy8qCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorKi8KKworLyogI2RlZmluZSBXSzA3MDFfREVCVUcgKi8KKworI2RlZmluZSBSRVNFUlZFIDIwMDAwCisjZGVmaW5lIFNZTkNfUFVMU0UgMTMwNjAwMAorI2RlZmluZSBCSU4wX1BVTFNFIDI4ODAwMAorI2RlZmluZSBCSU4xX1BVTFNFIDQzODAwMAorCisjZGVmaW5lIEFOQUxPR19NSU5fUFVMU0UgMzE4MDAwCisjZGVmaW5lIEFOQUxPR19NQVhfUFVMU0UgODc4MDAwCisjZGVmaW5lIEFOQUxPR19ERUxUQSA4MDAwMAorCisjZGVmaW5lIEJJTl9TQU1QTEUgKChCSU4wX1BVTFNFICsgQklOMV9QVUxTRSkgLyAyKQorCisjZGVmaW5lIE5PX1NZTkMgMjUKKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BhcnBvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgorI2luY2x1ZGUgPGxpbnV4L2hydGltZXIuaD4KKworTU9EVUxFX0FVVEhPUigiUGV0ZXIgUG9wb3ZlYyA8cG9wb3ZlY0BmZWkudHVrZS5zaz4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiV2Fsa2VyYSBXSy0wNzAxIFRYIGFzIGpveXN0aWNrIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgd2Fsa2VyYTA3MDFfcHBfbm87Cittb2R1bGVfcGFyYW1fbmFtZWQocG9ydCwgd2Fsa2VyYTA3MDFfcHBfbm8sIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHBvcnQsCisJCSAiUGFyYWxsZWwgcG9ydCBhZGFwdGVyIGZvciBXYWxrZXJhIFdLLTA3MDEgVFggKGRlZmF1bHQgaXMgMCkiKTsKKworLyoKKyAqIEZvciBub3csIG9ubHkgb25lIGRldmljZSBpcyBzdXBwb3J0ZWQsIGlmIHNvbWVib2R5IG5lZWQgbW9yZSBkZXZpY2VzLCBjb2RlCisgKiBjYW4gYmUgZXhwYW5kZWQsIG9uZSBzdHJ1Y3Qgd2Fsa2VyYV9kZXYgcGVyIGRldmljZSBtdXN0IGJlIGFsbG9jYXRlZCBhbmQKKyAqIHNldCB1cCBieSB3YWxrZXJhMDcwMV9jb25uZWN0IChyZWxlYXNlIG9mIGRldmljZSBieSB3YWxrZXJhMDcwMV9kaXNjb25uZWN0KQorICovCisKK3N0cnVjdCB3YWxrZXJhX2RldiB7CisJdW5zaWduZWQgY2hhciBidWZbMjVdOworCXU2NCBpcnFfdGltZSwgaXJxX2xhc3R0aW1lOworCWludCBjb3VudGVyOworCWludCBhY2s7CisKKwlzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dF9kZXY7CisJc3RydWN0IGhydGltZXIgdGltZXI7CisKKwlzdHJ1Y3QgcGFycG9ydCAqcGFycG9ydDsKKwlzdHJ1Y3QgcGFyZGV2aWNlICpwYXJkZXZpY2U7Cit9OworCitzdGF0aWMgc3RydWN0IHdhbGtlcmFfZGV2IHdfZGV2OworCitzdGF0aWMgaW5saW5lIHZvaWQgd2Fsa2VyYTA3MDFfcGFyc2VfZnJhbWUoc3RydWN0IHdhbGtlcmFfZGV2ICp3KQoreworCWludCBpOworCWludCB2YWwxLCB2YWwyLCB2YWwzLCB2YWw0LCB2YWw1LCB2YWw2LCB2YWw3LCB2YWw4OworCWludCBjcmMxLCBjcmMyOworCisJZm9yIChjcmMxID0gY3JjMiA9IGkgPSAwOyBpIDwgMTA7IGkrKykgeworCQljcmMxICs9IHctPmJ1ZltpXSAmIDc7CisJCWNyYzIgKz0gKHctPmJ1ZltpXSAmIDgpID4+IDM7CisJfQorCWlmICgody0+YnVmWzEwXSAmIDcpICE9IChjcmMxICYgNykpCisJCXJldHVybjsKKwlpZiAoKCh3LT5idWZbMTBdICYgOCkgPj4gMykgIT0gKCgoY3JjMSA+PiAzKSArIGNyYzIpICYgMSkpCisJCXJldHVybjsKKwlmb3IgKGNyYzEgPSBjcmMyID0gMCwgaSA9IDExOyBpIDwgMjM7IGkrKykgeworCQljcmMxICs9IHctPmJ1ZltpXSAmIDc7CisJCWNyYzIgKz0gKHctPmJ1ZltpXSAmIDgpID4+IDM7CisJfQorCWlmICgody0+YnVmWzIzXSAmIDcpICE9IChjcmMxICYgNykpCisJCXJldHVybjsKKwlpZiAoKCh3LT5idWZbMjNdICYgOCkgPj4gMykgIT0gKCgoY3JjMSA+PiAzKSArIGNyYzIpICYgMSkpCisJCXJldHVybjsKKwl2YWwxID0gKCh3LT5idWZbMF0gJiA3KSAqIDI1NiArIHctPmJ1ZlsxXSAqIDE2ICsgdy0+YnVmWzJdKSA+PiAyOworCXZhbDEgKj0gKCh3LT5idWZbMF0gPj4gMikgJiAyKSAtIDE7CS8qIHNpZ24gKi8KKwl2YWwyID0gKHctPmJ1ZlsyXSAmIDEpIDw8IDggfCAody0+YnVmWzNdIDw8IDQpIHwgdy0+YnVmWzRdOworCXZhbDIgKj0gKHctPmJ1ZlsyXSAmIDIpIC0gMTsJLyogc2lnbiAqLworCXZhbDMgPSAoKHctPmJ1Zls1XSAmIDcpICogMjU2ICsgdy0+YnVmWzZdICogMTYgKyB3LT5idWZbN10pID4+IDI7CisJdmFsMyAqPSAoKHctPmJ1Zls1XSA+PiAyKSAmIDIpIC0gMTsJLyogc2lnbiAqLworCXZhbDQgPSAody0+YnVmWzddICYgMSkgPDwgOCB8ICh3LT5idWZbOF0gPDwgNCkgfCB3LT5idWZbOV07CisJdmFsNCAqPSAody0+YnVmWzddICYgMikgLSAxOwkvKiBzaWduICovCisJdmFsNSA9ICgody0+YnVmWzExXSAmIDcpICogMjU2ICsgdy0+YnVmWzEyXSAqIDE2ICsgdy0+YnVmWzEzXSkgPj4gMjsKKwl2YWw1ICo9ICgody0+YnVmWzExXSA+PiAyKSAmIDIpIC0gMTsJLyogc2lnbiAqLworCXZhbDYgPSAody0+YnVmWzEzXSAmIDEpIDw8IDggfCAody0+YnVmWzE0XSA8PCA0KSB8IHctPmJ1ZlsxNV07CisJdmFsNiAqPSAody0+YnVmWzEzXSAmIDIpIC0gMTsJLyogc2lnbiAqLworCXZhbDcgPSAoKHctPmJ1ZlsxNl0gJiA3KSAqIDI1NiArIHctPmJ1ZlsxN10gKiAxNiArIHctPmJ1ZlsxOF0pID4+IDI7CisJdmFsNyAqPSAoKHctPmJ1ZlsxNl0gPj4gMikgJiAyKSAtIDE7CS8qc2lnbiAqLworCXZhbDggPSAody0+YnVmWzE4XSAmIDEpIDw8IDggfCAody0+YnVmWzE5XSA8PCA0KSB8IHctPmJ1ZlsyMF07CisJdmFsOCAqPSAody0+YnVmWzE4XSAmIDIpIC0gMTsJLypzaWduICovCisKKyNpZmRlZiBXSzA3MDFfREVCVUcKKwl7CisJCWludCBtYWdpYywgbWFnaWNfYml0OworCQltYWdpYyA9ICh3LT5idWZbMjFdIDw8IDQpIHwgdy0+YnVmWzIyXTsKKwkJbWFnaWNfYml0ID0gKHctPmJ1ZlsyNF0gJiA4KSA+PiAzOworCQlwcmludGsoS0VSTl9ERUJVRworCQkgICAgICAgIndhbGtlcmEwNzAxOiAlNGQgJTRkICU0ZCAlNGQgICU0ZCAlNGQgJTRkICU0ZCAobWFnaWMgJTJ4ICVkKVxuIiwKKwkJICAgICAgIHZhbDEsIHZhbDIsIHZhbDMsIHZhbDQsIHZhbDUsIHZhbDYsIHZhbDcsIHZhbDgsIG1hZ2ljLAorCQkgICAgICAgbWFnaWNfYml0KTsKKwl9CisjZW5kaWYKKwlpbnB1dF9yZXBvcnRfYWJzKHctPmlucHV0X2RldiwgQUJTX1gsIHZhbDIpOworCWlucHV0X3JlcG9ydF9hYnMody0+aW5wdXRfZGV2LCBBQlNfWSwgdmFsMSk7CisJaW5wdXRfcmVwb3J0X2Ficyh3LT5pbnB1dF9kZXYsIEFCU19aLCB2YWw2KTsKKwlpbnB1dF9yZXBvcnRfYWJzKHctPmlucHV0X2RldiwgQUJTX1RIUk9UVExFLCB2YWwzKTsKKwlpbnB1dF9yZXBvcnRfYWJzKHctPmlucHV0X2RldiwgQUJTX1JVRERFUiwgdmFsNCk7CisJaW5wdXRfcmVwb3J0X2Ficyh3LT5pbnB1dF9kZXYsIEFCU19NSVNDLCB2YWw3KTsKKwlpbnB1dF9yZXBvcnRfa2V5KHctPmlucHV0X2RldiwgQlROX0dFQVJfRE9XTiwgdmFsNSA+IDApOworfQorCitzdGF0aWMgaW5saW5lIGludCByZWFkX2FjayhzdHJ1Y3QgcGFyZGV2aWNlICpwKQoreworCXJldHVybiBwYXJwb3J0X3JlYWRfc3RhdHVzKHAtPnBvcnQpICYgMHg0MDsKK30KKworLyogZmFsbGluZyBlZGdlLCBwcmVwYXJlIHRvIEJJTiB2YWx1ZSBjYWxjdWxhdGlvbiAqLworc3RhdGljIHZvaWQgd2Fsa2VyYTA3MDFfaXJxX2hhbmRsZXIodm9pZCAqaGFuZGxlcl9kYXRhKQoreworCXU2NCBwdWxzZV90aW1lOworCXN0cnVjdCB3YWxrZXJhX2RldiAqdyA9IGhhbmRsZXJfZGF0YTsKKworCXctPmlycV90aW1lID0ga3RpbWVfdG9fbnMoa3RpbWVfZ2V0KCkpOworCXB1bHNlX3RpbWUgPSB3LT5pcnFfdGltZSAtIHctPmlycV9sYXN0dGltZTsKKwl3LT5pcnFfbGFzdHRpbWUgPSB3LT5pcnFfdGltZTsKKworCS8qIGNhbmNlbCB0aW1lciwgaWYgaW4gaGFuZGxlciBvciBhY3RpdmUgZG8gcmVzeW5jICovCisJaWYgKHVubGlrZWx5KDAgIT0gaHJ0aW1lcl90cnlfdG9fY2FuY2VsKCZ3LT50aW1lcikpKSB7CisJCXctPmNvdW50ZXIgPSBOT19TWU5DOworCQlyZXR1cm47CisJfQorCisJaWYgKHctPmNvdW50ZXIgPCBOT19TWU5DKSB7CisJCWlmICh3LT5hY2spIHsKKwkJCXB1bHNlX3RpbWUgLT0gQklOMV9QVUxTRTsKKwkJCXctPmJ1Zlt3LT5jb3VudGVyXSA9IDg7CisJCX0gZWxzZSB7CisJCQlwdWxzZV90aW1lIC09IEJJTjBfUFVMU0U7CisJCQl3LT5idWZbdy0+Y291bnRlcl0gPSAwOworCQl9CisJCWlmICh3LT5jb3VudGVyID09IDI0KSB7CS8qIGZ1bGwgZnJhbWUgKi8KKwkJCXdhbGtlcmEwNzAxX3BhcnNlX2ZyYW1lKHcpOworCQkJdy0+Y291bnRlciA9IE5PX1NZTkM7CisJCQlpZiAoYWJzKHB1bHNlX3RpbWUgLSBTWU5DX1BVTFNFKSA8IFJFU0VSVkUpCS8qIG5ldyBmcmFtZSBzeW5jICovCisJCQkJdy0+Y291bnRlciA9IDA7CisJCX0gZWxzZSB7CisJCQlpZiAoKHB1bHNlX3RpbWUgPiAoQU5BTE9HX01JTl9QVUxTRSAtIFJFU0VSVkUpCisJCQkgICAgICYmIChwdWxzZV90aW1lIDwgKEFOQUxPR19NQVhfUFVMU0UgKyBSRVNFUlZFKSkpKSB7CisJCQkJcHVsc2VfdGltZSAtPSAoQU5BTE9HX01JTl9QVUxTRSAtIFJFU0VSVkUpOworCQkJCXB1bHNlX3RpbWUgPSAodTMyKSBwdWxzZV90aW1lIC8gQU5BTE9HX0RFTFRBOwkvKiBvdmVydGlwaW5nIGlzIHNhZmUsIHB1bHNldGltZSA8IHMzMi4uICovCisJCQkJdy0+YnVmW3ctPmNvdW50ZXIrK10gfD0gKHB1bHNlX3RpbWUgJiA3KTsKKwkJCX0gZWxzZQorCQkJCXctPmNvdW50ZXIgPSBOT19TWU5DOworCQl9CisJfSBlbHNlIGlmIChhYnMocHVsc2VfdGltZSAtIFNZTkNfUFVMU0UgLSBCSU4wX1BVTFNFKSA8CisJCQkJUkVTRVJWRSArIEJJTjFfUFVMU0UgLSBCSU4wX1BVTFNFKQkvKiBmcmFtZSBzeW5jIC4uICovCisJCXctPmNvdW50ZXIgPSAwOworCisJaHJ0aW1lcl9zdGFydCgmdy0+dGltZXIsIGt0aW1lX3NldCgwLCBCSU5fU0FNUExFKSwgSFJUSU1FUl9NT0RFX1JFTCk7Cit9CisKK3N0YXRpYyBlbnVtIGhydGltZXJfcmVzdGFydCB0aW1lcl9oYW5kbGVyKHN0cnVjdCBocnRpbWVyCisJCQkJCSAgKmhhbmRsZSkKK3sKKwlzdHJ1Y3Qgd2Fsa2VyYV9kZXYgKnc7CisKKwl3ID0gY29udGFpbmVyX29mKGhhbmRsZSwgc3RydWN0IHdhbGtlcmFfZGV2LCB0aW1lcik7CisJdy0+YWNrID0gcmVhZF9hY2sody0+cGFyZGV2aWNlKTsKKworCXJldHVybiBIUlRJTUVSX05PUkVTVEFSVDsKK30KKworc3RhdGljIGludCB3YWxrZXJhMDcwMV9vcGVuKHN0cnVjdCBpbnB1dF9kZXYgKmRldikKK3sKKwlzdHJ1Y3Qgd2Fsa2VyYV9kZXYgKncgPSBpbnB1dF9nZXRfZHJ2ZGF0YShkZXYpOworCisJcGFycG9ydF9lbmFibGVfaXJxKHctPnBhcnBvcnQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB3YWxrZXJhMDcwMV9jbG9zZShzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYpCit7CisJc3RydWN0IHdhbGtlcmFfZGV2ICp3ID0gaW5wdXRfZ2V0X2RydmRhdGEoZGV2KTsKKworCXBhcnBvcnRfZGlzYWJsZV9pcnEody0+cGFycG9ydCk7Cit9CisKK3N0YXRpYyBpbnQgd2Fsa2VyYTA3MDFfY29ubmVjdChzdHJ1Y3Qgd2Fsa2VyYV9kZXYgKncsIGludCBwYXJwb3J0KQoreworCWludCBlcnIgPSAtRU5PREVWOworCisJdy0+cGFycG9ydCA9IHBhcnBvcnRfZmluZF9udW1iZXIocGFycG9ydCk7CisJaWYgKHctPnBhcnBvcnQgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAody0+cGFycG9ydC0+aXJxID09IC0xKSB7CisJCXByaW50ayhLRVJOX0VSUiAid2Fsa2VyYTA3MDE6IHBhcnBvcnQgd2l0aG91dCBpbnRlcnJ1cHRcbiIpOworCQlnb3RvIGluaXRfZXJyOworCX0KKworCWVyciA9IC1FQlVTWTsKKwl3LT5wYXJkZXZpY2UgPSBwYXJwb3J0X3JlZ2lzdGVyX2RldmljZSh3LT5wYXJwb3J0LCAid2Fsa2VyYTA3MDEiLAorCQkJCSAgICBOVUxMLCBOVUxMLCB3YWxrZXJhMDcwMV9pcnFfaGFuZGxlciwKKwkJCQkgICAgUEFSUE9SVF9ERVZfRVhDTCwgdyk7CisJaWYgKCF3LT5wYXJkZXZpY2UpCisJCWdvdG8gaW5pdF9lcnI7CisKKwlpZiAocGFycG9ydF9uZWdvdGlhdGUody0+cGFyZGV2aWNlLT5wb3J0LCBJRUVFMTI4NF9NT0RFX0NPTVBBVCkpCisJCWdvdG8gaW5pdF9lcnIxOworCisJaWYgKHBhcnBvcnRfY2xhaW0ody0+cGFyZGV2aWNlKSkKKwkJZ290byBpbml0X2VycjE7CisKKwl3LT5pbnB1dF9kZXYgPSBpbnB1dF9hbGxvY2F0ZV9kZXZpY2UoKTsKKwlpZiAoIXctPmlucHV0X2RldikKKwkJZ290byBpbml0X2VycjI7CisKKwlpbnB1dF9zZXRfZHJ2ZGF0YSh3LT5pbnB1dF9kZXYsIHcpOworCXctPmlucHV0X2Rldi0+bmFtZSA9ICJXYWxrZXJhIFdLLTA3MDEgVFgiOworCXctPmlucHV0X2Rldi0+cGh5cyA9IHctPnBhcnBvcnQtPm5hbWU7CisJdy0+aW5wdXRfZGV2LT5pZC5idXN0eXBlID0gQlVTX1BBUlBPUlQ7CisKKwkvKiBUT0RPIHdoYXQgaWQgdmVuZG9yL3Byb2R1Y3QvdmVyc2lvbiA/ICovCisJdy0+aW5wdXRfZGV2LT5pZC52ZW5kb3IgPSAweDAwMDE7CisJdy0+aW5wdXRfZGV2LT5pZC5wcm9kdWN0ID0gMHgwMDAxOworCXctPmlucHV0X2Rldi0+aWQudmVyc2lvbiA9IDB4MDEwMDsKKwl3LT5pbnB1dF9kZXYtPm9wZW4gPSB3YWxrZXJhMDcwMV9vcGVuOworCXctPmlucHV0X2Rldi0+Y2xvc2UgPSB3YWxrZXJhMDcwMV9jbG9zZTsKKworCXctPmlucHV0X2Rldi0+ZXZiaXRbMF0gPSBCSVQoRVZfQUJTKSB8IEJJVF9NQVNLKEVWX0tFWSk7CisJdy0+aW5wdXRfZGV2LT5rZXliaXRbQklUX1dPUkQoQlROX0dFQVJfRE9XTildID0gQklUX01BU0soQlROX0dFQVJfRE9XTik7CisKKwlpbnB1dF9zZXRfYWJzX3BhcmFtcyh3LT5pbnB1dF9kZXYsIEFCU19YLCAtNTEyLCA1MTIsIDAsIDApOworCWlucHV0X3NldF9hYnNfcGFyYW1zKHctPmlucHV0X2RldiwgQUJTX1ksIC01MTIsIDUxMiwgMCwgMCk7CisJaW5wdXRfc2V0X2Fic19wYXJhbXMody0+aW5wdXRfZGV2LCBBQlNfWiwgLTUxMiwgNTEyLCAwLCAwKTsKKwlpbnB1dF9zZXRfYWJzX3BhcmFtcyh3LT5pbnB1dF9kZXYsIEFCU19USFJPVFRMRSwgLTUxMiwgNTEyLCAwLCAwKTsKKwlpbnB1dF9zZXRfYWJzX3BhcmFtcyh3LT5pbnB1dF9kZXYsIEFCU19SVURERVIsIC01MTIsIDUxMiwgMCwgMCk7CisJaW5wdXRfc2V0X2Fic19wYXJhbXMody0+aW5wdXRfZGV2LCBBQlNfTUlTQywgLTUxMiwgNTEyLCAwLCAwKTsKKworCWVyciA9IGlucHV0X3JlZ2lzdGVyX2RldmljZSh3LT5pbnB1dF9kZXYpOworCWlmIChlcnIpCisJCWdvdG8gaW5pdF9lcnIzOworCisJaHJ0aW1lcl9pbml0KCZ3LT50aW1lciwgQ0xPQ0tfTU9OT1RPTklDLCBIUlRJTUVSX01PREVfUkVMKTsKKwl3LT50aW1lci5mdW5jdGlvbiA9IHRpbWVyX2hhbmRsZXI7CisJcmV0dXJuIDA7CisKKyBpbml0X2VycjM6CisJaW5wdXRfZnJlZV9kZXZpY2Uody0+aW5wdXRfZGV2KTsKKyBpbml0X2VycjI6CisJcGFycG9ydF9yZWxlYXNlKHctPnBhcmRldmljZSk7CisgaW5pdF9lcnIxOgorCXBhcnBvcnRfdW5yZWdpc3Rlcl9kZXZpY2Uody0+cGFyZGV2aWNlKTsKKyBpbml0X2VycjoKKwlwYXJwb3J0X3B1dF9wb3J0KHctPnBhcnBvcnQpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIHdhbGtlcmEwNzAxX2Rpc2Nvbm5lY3Qoc3RydWN0IHdhbGtlcmFfZGV2ICp3KQoreworCWhydGltZXJfY2FuY2VsKCZ3LT50aW1lcik7CisJaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2Uody0+aW5wdXRfZGV2KTsKKwlwYXJwb3J0X3JlbGVhc2Uody0+cGFyZGV2aWNlKTsKKwlwYXJwb3J0X3VucmVnaXN0ZXJfZGV2aWNlKHctPnBhcmRldmljZSk7CisJcGFycG9ydF9wdXRfcG9ydCh3LT5wYXJwb3J0KTsKK30KKworc3RhdGljIGludCBfX2luaXQgd2Fsa2VyYTA3MDFfaW5pdCh2b2lkKQoreworCXJldHVybiB3YWxrZXJhMDcwMV9jb25uZWN0KCZ3X2Rldiwgd2Fsa2VyYTA3MDFfcHBfbm8pOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgd2Fsa2VyYTA3MDFfZXhpdCh2b2lkKQoreworCXdhbGtlcmEwNzAxX2Rpc2Nvbm5lY3QoJndfZGV2KTsKK30KKworbW9kdWxlX2luaXQod2Fsa2VyYTA3MDFfaW5pdCk7Cittb2R1bGVfZXhpdCh3YWxrZXJhMDcwMV9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvS2NvbmZpZyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvS2NvbmZpZwppbmRleCBlZmQ3MGE5Li4zNTU2MTY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL0tjb25maWcKKysrIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9LY29uZmlnCkBAIC0yNjgsNiArMjY4LDE1IEBACiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKIAkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBweGEyN3hfa2V5cGFkLgogCitjb25maWcgS0VZQk9BUkRfUFhBOTMwX1JPVEFSWQorCXRyaXN0YXRlICJQWEE5MzAvUFhBOTM1IEVuaGFuY2VkIFJvdGFyeSBDb250cm9sbGVyIFN1cHBvcnQiCisJZGVwZW5kcyBvbiBDUFVfUFhBOTMwIHx8IENQVV9QWEE5MzUKKwloZWxwCisJICBFbmFibGUgc3VwcG9ydCBmb3IgUFhBOTMwL1BYQTkzNSBFbmhhbmNlZCBSb3RhcnkgQ29udHJvbGxlci4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgcHhhOTMwX3JvdGFyeS4KKwogY29uZmlnIEtFWUJPQVJEX0FBRUQyMDAwCiAJdHJpc3RhdGUgIkFBRUQtMjAwMCBrZXlib2FyZCIKIAlkZXBlbmRzIG9uIE1BQ0hfQUFFRDIwMDAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvTWFrZWZpbGUgYi9kcml2ZXJzL2lucHV0L2tleWJvYXJkL01ha2VmaWxlCmluZGV4IDBlZGM4ZjIuLjM2MzUxZTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9NYWtlZmlsZQpAQCAtMjAsNiArMjAsNyBAQAogb2JqLSQoQ09ORklHX0tFWUJPQVJEX0hJTF9PTEQpCQkrPSBoaWxrYmQubwogb2JqLSQoQ09ORklHX0tFWUJPQVJEX09NQVApCQkrPSBvbWFwLWtleXBhZC5vCiBvYmotJChDT05GSUdfS0VZQk9BUkRfUFhBMjd4KQkJKz0gcHhhMjd4X2tleXBhZC5vCitvYmotJChDT05GSUdfS0VZQk9BUkRfUFhBOTMwX1JPVEFSWSkJKz0gcHhhOTMwX3JvdGFyeS5vCiBvYmotJChDT05GSUdfS0VZQk9BUkRfQUFFRDIwMDApCQkrPSBhYWVkMjAwMF9rYmQubwogb2JqLSQoQ09ORklHX0tFWUJPQVJEX0dQSU8pCQkrPSBncGlvX2tleXMubwogb2JqLSQoQ09ORklHX0tFWUJPQVJEX0hQNlhYKQkJKz0gam9ybmFkYTY4MF9rYmQubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9hdGtiZC5jIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9hdGtiZC5jCmluZGV4IDM3OWI3ZmYuLmMzYzhiOWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvYXRrYmQuYworKysgYi9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2F0a2JkLmMKQEAgLTY1LDcgKzY1LDcgQEAKIAogLyoKICAqIFNjYW5jb2RlIHRvIGtleWNvZGUgdGFibGVzLiBUaGVzZSBhcmUganVzdCB0aGUgZGVmYXVsdCBzZXR0aW5nLCBhbmQKLSAqIGFyZSBsb2FkYWJsZSB2aWEgYW4gdXNlcmxhbmQgdXRpbGl0eS4KKyAqIGFyZSBsb2FkYWJsZSB2aWEgYSB1c2VybGFuZCB1dGlsaXR5LgogICovCiAKIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBhdGtiZF9zZXQyX2tleWNvZGVbNTEyXSA9IHsKQEAgLTg4NCw2ICs4ODQsMzkgQEAKIH0KIAogLyoKKyAqIFBlcmZvcm0gZml4dXAgZm9yIEhQIFBhdmlsaW9uIFpWNjEwMCBsYXB0b3AgdGhhdCBkb2Vzbid0IGdlbmVyYXRlIHJlbGVhc2UKKyAqIGZvciBpdHMgdm9sdW1lIGJ1dHRvbnMKKyAqLworc3RhdGljIHZvaWQgYXRrYmRfaHBfenY2MTAwX2tleW1hcF9maXh1cChzdHJ1Y3QgYXRrYmQgKmF0a2JkKQoreworCWNvbnN0IHVuc2lnbmVkIGludCBmb3JjZWRfcmVsZWFzZV9rZXlzW10gPSB7CisJCTB4YWUsIDB4YjAsCisJfTsKKwlpbnQgaTsKKworCWlmIChhdGtiZC0+c2V0ID09IDIpCisJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGZvcmNlZF9yZWxlYXNlX2tleXMpOyBpKyspCisJCQlfX3NldF9iaXQoZm9yY2VkX3JlbGVhc2Vfa2V5c1tpXSwKKwkJCQkJYXRrYmQtPmZvcmNlX3JlbGVhc2VfbWFzayk7Cit9CisKKy8qCisgKiBTYW1zdW5nIE5DMTAgd2l0aCBGbitGPyBrZXkgcmVsZWFzZSBub3Qgd29ya2luZworICovCitzdGF0aWMgdm9pZCBhdGtiZF9zYW1zdW5nX2tleW1hcF9maXh1cChzdHJ1Y3QgYXRrYmQgKmF0a2JkKQoreworCWNvbnN0IHVuc2lnbmVkIGludCBmb3JjZWRfcmVsZWFzZV9rZXlzW10gPSB7CisJCTB4ODIsIDB4ODMsIDB4ODQsIDB4ODYsIDB4ODgsIDB4ODksIDB4YjMsIDB4ZjcsIDB4ZjksCisJfTsKKwlpbnQgaTsKKworCWlmIChhdGtiZC0+c2V0ID09IDIpCisJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGZvcmNlZF9yZWxlYXNlX2tleXMpOyBpKyspCisJCQlfX3NldF9iaXQoZm9yY2VkX3JlbGVhc2Vfa2V5c1tpXSwKKwkJCQkgIGF0a2JkLT5mb3JjZV9yZWxlYXNlX21hc2spOworfQorCisvKgogICogYXRrYmRfc2V0X2tleWNvZGVfdGFibGUoKSBpbml0aWFsaXplcyBrZXlib2FyZCdzIGtleWNvZGUgdGFibGUKICAqIGFjY29yZGluZyB0byB0aGUgc2VsZWN0ZWQgc2NhbmNvZGUgc2V0CiAgKi8KQEAgLTE0NzYsNiArMTUwOSwxNSBAQAogCQkuZHJpdmVyX2RhdGEgPSBhdGtiZF9kZWxsX2xhcHRvcF9rZXltYXBfZml4dXAsCiAJfSwKIAl7CisJCS5pZGVudCA9ICJEZWxsIExhcHRvcCIsCisJCS5tYXRjaGVzID0geworCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiRGVsbCBDb21wdXRlciBDb3Jwb3JhdGlvbiIpLAorCQkJRE1JX01BVENIKERNSV9DSEFTU0lTX1RZUEUsICI4IiksIC8qIFBvcnRhYmxlICovCisJCX0sCisJCS5jYWxsYmFjayA9IGF0a2JkX3NldHVwX2ZpeHVwLAorCQkuZHJpdmVyX2RhdGEgPSBhdGtiZF9kZWxsX2xhcHRvcF9rZXltYXBfZml4dXAsCisJfSwKKwl7CiAJCS5pZGVudCA9ICJIUCAyMTMzIiwKIAkJLm1hdGNoZXMgPSB7CiAJCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJIZXdsZXR0LVBhY2thcmQiKSwKQEAgLTE0ODUsNiArMTUyNywxNSBAQAogCQkuZHJpdmVyX2RhdGEgPSBhdGtiZF9ocF9rZXltYXBfZml4dXAsCiAJfSwKIAl7CisJCS5pZGVudCA9ICJIUCBQYXZpbGlvbiBaVjYxMDAiLAorCQkubWF0Y2hlcyA9IHsKKwkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkhld2xldHQtUGFja2FyZCIpLAorCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJQYXZpbGlvbiBaVjYxMDAiKSwKKwkJfSwKKwkJLmNhbGxiYWNrID0gYXRrYmRfc2V0dXBfZml4dXAsCisJCS5kcml2ZXJfZGF0YSA9IGF0a2JkX2hwX3p2NjEwMF9rZXltYXBfZml4dXAsCisJfSwKKwl7CiAJCS5pZGVudCA9ICJJbnZlbnRlYyBTeW1waG9ueSIsCiAJCS5tYXRjaGVzID0gewogCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiSU5WRU5URUMiKSwKQEAgLTE0OTMsNiArMTU0NCwxNSBAQAogCQkuY2FsbGJhY2sgPSBhdGtiZF9zZXR1cF9maXh1cCwKIAkJLmRyaXZlcl9kYXRhID0gYXRrYmRfaW52ZW50ZWNfa2V5bWFwX2ZpeHVwLAogCX0sCisJeworCQkuaWRlbnQgPSAiU2Ftc3VuZyBOQzEwIiwKKwkJLm1hdGNoZXMgPSB7CisJCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJTQU1TVU5HIEVMRUNUUk9OSUNTIENPLiwgTFRELiIpLAorCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJOQzEwIiksCisJCX0sCisJCS5jYWxsYmFjayA9IGF0a2JkX3NldHVwX2ZpeHVwLAorCQkuZHJpdmVyX2RhdGEgPSBhdGtiZF9zYW1zdW5nX2tleW1hcF9maXh1cCwKKwl9LAogCXsgfQogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9ncGlvX2tleXMuYyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvZ3Bpb19rZXlzLmMKaW5kZXggMDVmM2Y0My4uYWQ2N2Q3NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9ncGlvX2tleXMuYworKysgYi9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2dwaW9fa2V5cy5jCkBAIC05OCw2ICs5OCwxMCBAQAogCWlucHV0LT5pZC5wcm9kdWN0ID0gMHgwMDAxOwogCWlucHV0LT5pZC52ZXJzaW9uID0gMHgwMTAwOwogCisJLyogRW5hYmxlIGF1dG8gcmVwZWF0IGZlYXR1cmUgb2YgTGludXggaW5wdXQgc3Vic3lzdGVtICovCisJaWYgKHBkYXRhLT5yZXApCisJCV9fc2V0X2JpdChFVl9SRVAsIGlucHV0LT5ldmJpdCk7CisKIAlkZGF0YS0+aW5wdXQgPSBpbnB1dDsKIAogCWZvciAoaSA9IDA7IGkgPCBwZGF0YS0+bmJ1dHRvbnM7IGkrKykgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9oaWxfa2JkLmMgYi9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2hpbF9rYmQuYwppbmRleCA3MWMxOTcxLi42ZjM1NjcwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2hpbF9rYmQuYworKysgYi9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2hpbF9rYmQuYwpAQCAtNDcsNiArNDcsNyBAQAogTU9EVUxFX0FVVEhPUigiQnJpYW4gUy4gSnVsaW4gPGJyaUBjYWx5eC5jb20+Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oSElMX0dFTkVSSUNfTkFNRSAiIGRyaXZlciIpOwogTU9EVUxFX0xJQ0VOU0UoIkR1YWwgQlNEL0dQTCIpOworTU9EVUxFX0FMSUFTKCJzZXJpbzp0eTAzcHIyNWlkMDBleCoiKTsKIAogI2RlZmluZSBISUxfS0JEX01BWF9MRU5HVEggMTYKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9vbWFwLWtleXBhZC5jIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9vbWFwLWtleXBhZC5jCmluZGV4IGRiMjJmZDkuLjNmM2QxMTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvb21hcC1rZXlwYWQuYworKysgYi9kcml2ZXJzL2lucHV0L2tleWJvYXJkL29tYXAta2V5cGFkLmMKQEAgLTEyMiwxNCArMTIyLDEwIEBACiAKIAkvKiByZWFkIHRoZSBrZXlwYWQgc3RhdHVzICovCiAJaWYgKGNwdV9pc19vbWFwMjR4eCgpKSB7Ci0JCWludCBpOwotCQlmb3IgKGkgPSAwOyBpIDwgb21hcF9rcC0+cm93czsgaSsrKQotCQkJZGlzYWJsZV9pcnEoT01BUF9HUElPX0lSUShyb3dfZ3Bpb3NbaV0pKTsKLQogCQkvKiByZWFkIHRoZSBrZXlwYWQgc3RhdHVzICovCiAJCWZvciAoY29sID0gMDsgY29sIDwgb21hcF9rcC0+Y29sczsgY29sKyspIHsKIAkJCXNldF9jb2xfZ3Bpb192YWwob21hcF9rcCwgfigxIDw8IGNvbCkpOwotCQkJc3RhdGVbY29sXSA9IH4oZ2V0X3Jvd19ncGlvX3ZhbChvbWFwX2twKSkgJiAweDNmOworCQkJc3RhdGVbY29sXSA9IH4oZ2V0X3Jvd19ncGlvX3ZhbChvbWFwX2twKSkgJiAweGZmOwogCQl9CiAJCXNldF9jb2xfZ3Bpb192YWwob21hcF9rcCwgMCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvcHhhOTMwX3JvdGFyeS5jIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9weGE5MzBfcm90YXJ5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTVmYmJhNDcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2lucHV0L2tleWJvYXJkL3B4YTkzMF9yb3RhcnkuYwpAQCAtMCwwICsxLDIxMiBAQAorLyoKKyAqIERyaXZlciBmb3IgdGhlIGVuaGFuY2VkIHJvdGFyeSBjb250cm9sbGVyIG9uIHB4YTkzMCBhbmQgcHhhOTM1CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKworI2luY2x1ZGUgPG1hY2gvcHhhOTMwX3JvdGFyeS5oPgorCisjZGVmaW5lIFNCQ1IJKDB4MDQpCisjZGVmaW5lIEVSQ1IJKDB4MGMpCisKKyNkZWZpbmUgU0JDUl9FUlNCCSgxIDw8IDUpCisKK3N0cnVjdCBweGE5MzBfcm90YXJ5IHsKKwlzdHJ1Y3QgaW5wdXRfZGV2CSppbnB1dF9kZXY7CisJdm9pZCBfX2lvbWVtCQkqbW1pb19iYXNlOworCWludAkJCWxhc3RfZXJjcjsKKworCXN0cnVjdCBweGE5MzBfcm90YXJ5X3BsYXRmb3JtX2RhdGEgKnBkYXRhOworfTsKKworc3RhdGljIHZvaWQgY2xlYXJfc2JjcihzdHJ1Y3QgcHhhOTMwX3JvdGFyeSAqcikKK3sKKwl1aW50MzJfdCBzYmNyID0gX19yYXdfcmVhZGwoci0+bW1pb19iYXNlICsgU0JDUik7CisKKwlfX3Jhd193cml0ZWwoc2JjciB8IFNCQ1JfRVJTQiwgci0+bW1pb19iYXNlICsgU0JDUik7CisJX19yYXdfd3JpdGVsKHNiY3IgJiB+U0JDUl9FUlNCLCByLT5tbWlvX2Jhc2UgKyBTQkNSKTsKK30KKworc3RhdGljIGlycXJldHVybl90IHJvdGFyeV9pcnEoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCXN0cnVjdCBweGE5MzBfcm90YXJ5ICpyID0gZGV2X2lkOworCXN0cnVjdCBweGE5MzBfcm90YXJ5X3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gci0+cGRhdGE7CisJaW50IGVyY3IsIGRlbHRhLCBrZXk7CisKKwllcmNyID0gX19yYXdfcmVhZGwoci0+bW1pb19iYXNlICsgRVJDUikgJiAweGY7CisJY2xlYXJfc2JjcihyKTsKKworCWRlbHRhID0gZXJjciAtIHItPmxhc3RfZXJjcjsKKwlpZiAoZGVsdGEgPT0gMCkKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCisJci0+bGFzdF9lcmNyID0gZXJjcjsKKworCWlmIChwZGF0YS0+dXBfa2V5ICYmIHBkYXRhLT5kb3duX2tleSkgeworCQlrZXkgPSAoZGVsdGEgPiAwKSA/IHBkYXRhLT51cF9rZXkgOiBwZGF0YS0+ZG93bl9rZXk7CisJCWlucHV0X3JlcG9ydF9rZXkoci0+aW5wdXRfZGV2LCBrZXksIDEpOworCQlpbnB1dF9zeW5jKHItPmlucHV0X2Rldik7CisJCWlucHV0X3JlcG9ydF9rZXkoci0+aW5wdXRfZGV2LCBrZXksIDApOworCX0gZWxzZQorCQlpbnB1dF9yZXBvcnRfcmVsKHItPmlucHV0X2RldiwgcGRhdGEtPnJlbF9jb2RlLCBkZWx0YSk7CisKKwlpbnB1dF9zeW5jKHItPmlucHV0X2Rldik7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpbnQgcHhhOTMwX3JvdGFyeV9vcGVuKHN0cnVjdCBpbnB1dF9kZXYgKmRldikKK3sKKwlzdHJ1Y3QgcHhhOTMwX3JvdGFyeSAqciA9IGlucHV0X2dldF9kcnZkYXRhKGRldik7CisKKwljbGVhcl9zYmNyKHIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHB4YTkzMF9yb3RhcnlfY2xvc2Uoc3RydWN0IGlucHV0X2RldiAqZGV2KQoreworCXN0cnVjdCBweGE5MzBfcm90YXJ5ICpyID0gaW5wdXRfZ2V0X2RydmRhdGEoZGV2KTsKKworCWNsZWFyX3NiY3Iocik7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHB4YTkzMF9yb3RhcnlfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgcHhhOTMwX3JvdGFyeV9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCBweGE5MzBfcm90YXJ5ICpyOworCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0X2RldjsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwlpbnQgaXJxOworCWludCBlcnI7CisKKwlpcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOworCWlmIChpcnEgPCAwKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIm5vIGlycSBmb3Igcm90YXJ5IGNvbnRyb2xsZXJcbiIpOworCQlyZXR1cm4gLUVOWElPOworCX0KKworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJaWYgKCFyZXMpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAibm8gSS9PIG1lbW9yeSBkZWZpbmVkXG4iKTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisKKwlpZiAoIXBkYXRhKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIm5vIHBsYXRmb3JtIGRhdGEgZGVmaW5lZFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXIgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcHhhOTMwX3JvdGFyeSksIEdGUF9LRVJORUwpOworCWlmICghcikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyLT5tbWlvX2Jhc2UgPSBpb3JlbWFwX25vY2FjaGUocmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyZXMpKTsKKwlpZiAoci0+bW1pb19iYXNlID09IE5VTEwpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIHJlbWFwIElPIG1lbW9yeVxuIik7CisJCWVyciA9IC1FTlhJTzsKKwkJZ290byBmYWlsZWRfZnJlZTsKKwl9CisKKwlyLT5wZGF0YSA9IHBkYXRhOworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHIpOworCisJLyogYWxsb2NhdGUgYW5kIHJlZ2lzdGVyIHRoZSBpbnB1dCBkZXZpY2UgKi8KKwlpbnB1dF9kZXYgPSBpbnB1dF9hbGxvY2F0ZV9kZXZpY2UoKTsKKwlpZiAoIWlucHV0X2RldikgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gYWxsb2NhdGUgaW5wdXQgZGV2aWNlXG4iKTsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBmYWlsZWRfZnJlZV9pbzsKKwl9CisKKwlpbnB1dF9kZXYtPm5hbWUgPSBwZGV2LT5uYW1lOworCWlucHV0X2Rldi0+aWQuYnVzdHlwZSA9IEJVU19IT1NUOworCWlucHV0X2Rldi0+b3BlbiA9IHB4YTkzMF9yb3Rhcnlfb3BlbjsKKwlpbnB1dF9kZXYtPmNsb3NlID0gcHhhOTMwX3JvdGFyeV9jbG9zZTsKKwlpbnB1dF9kZXYtPmRldi5wYXJlbnQgPSAmcGRldi0+ZGV2OworCisJaWYgKHBkYXRhLT51cF9rZXkgJiYgcGRhdGEtPmRvd25fa2V5KSB7CisJCV9fc2V0X2JpdChwZGF0YS0+dXBfa2V5LCBpbnB1dF9kZXYtPmtleWJpdCk7CisJCV9fc2V0X2JpdChwZGF0YS0+ZG93bl9rZXksIGlucHV0X2Rldi0+a2V5Yml0KTsKKwkJX19zZXRfYml0KEVWX0tFWSwgaW5wdXRfZGV2LT5ldmJpdCk7CisJfSBlbHNlIHsKKwkJX19zZXRfYml0KHBkYXRhLT5yZWxfY29kZSwgaW5wdXRfZGV2LT5yZWxiaXQpOworCQlfX3NldF9iaXQoRVZfUkVMLCBpbnB1dF9kZXYtPmV2Yml0KTsKKwl9CisKKwlyLT5pbnB1dF9kZXYgPSBpbnB1dF9kZXY7CisJaW5wdXRfc2V0X2RydmRhdGEoaW5wdXRfZGV2LCByKTsKKworCWVyciA9IHJlcXVlc3RfaXJxKGlycSwgcm90YXJ5X2lycSwgSVJRRl9ESVNBQkxFRCwKKwkJCSJlbmhhbmNlZCByb3RhcnkiLCByKTsKKwlpZiAoZXJyKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byByZXF1ZXN0IElSUVxuIik7CisJCWdvdG8gZmFpbGVkX2ZyZWVfaW5wdXQ7CisJfQorCisJZXJyID0gaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKGlucHV0X2Rldik7CisJaWYgKGVycikgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gcmVnaXN0ZXIgaW5wdXQgZGV2aWNlXG4iKTsKKwkJZ290byBmYWlsZWRfZnJlZV9pcnE7CisJfQorCisJcmV0dXJuIDA7CisKK2ZhaWxlZF9mcmVlX2lycToKKwlmcmVlX2lycShpcnEsIHIpOworZmFpbGVkX2ZyZWVfaW5wdXQ6CisJaW5wdXRfZnJlZV9kZXZpY2UoaW5wdXRfZGV2KTsKK2ZhaWxlZF9mcmVlX2lvOgorCWlvdW5tYXAoci0+bW1pb19iYXNlKTsKK2ZhaWxlZF9mcmVlOgorCWtmcmVlKHIpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IHB4YTkzMF9yb3RhcnlfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHB4YTkzMF9yb3RhcnkgKnIgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWZyZWVfaXJxKHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCksIHIpOworCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKHItPmlucHV0X2Rldik7CisJaW91bm1hcChyLT5tbWlvX2Jhc2UpOworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCWtmcmVlKHIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHB4YTkzMF9yb3RhcnlfZHJpdmVyID0geworCS5kcml2ZXIJCT0geworCQkubmFtZQk9ICJweGE5MzAtcm90YXJ5IiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUJCT0gcHhhOTMwX3JvdGFyeV9wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKHB4YTkzMF9yb3RhcnlfcmVtb3ZlKSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHB4YTkzMF9yb3RhcnlfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnB4YTkzMF9yb3RhcnlfZHJpdmVyKTsKK30KK21vZHVsZV9pbml0KHB4YTkzMF9yb3RhcnlfaW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBweGE5MzBfcm90YXJ5X2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmcHhhOTMwX3JvdGFyeV9kcml2ZXIpOworfQorbW9kdWxlX2V4aXQocHhhOTMwX3JvdGFyeV9leGl0KTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJEcml2ZXIgZm9yIFBYQTkzeCBFbmhhbmNlZCBSb3RhcnkgQ29udHJvbGxlciIpOworTU9EVUxFX0FVVEhPUigiWWFvIFlvbmcgPHlhb3lvbmdAbWFydmVsbC5jb20+Iik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L21pc2MvYXBhbmVsLmMgYi9kcml2ZXJzL2lucHV0L21pc2MvYXBhbmVsLmMKaW5kZXggZDgyZjdmNy4uNzFiODI0MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9taXNjL2FwYW5lbC5jCisrKyBiL2RyaXZlcnMvaW5wdXQvbWlzYy9hcGFuZWwuYwpAQCAtNTcsNyArNTcsNyBAQAogCiBzdHJ1Y3QgYXBhbmVsIHsKIAlzdHJ1Y3QgaW5wdXRfcG9sbGVkX2RldiAqaXBkZXY7Ci0Jc3RydWN0IGkyY19jbGllbnQgY2xpZW50OworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQ7CiAJdW5zaWduZWQgc2hvcnQga2V5bWFwW01BWF9QQU5FTF9LRVlTXTsKIAl1MTYgICAgbmtleXM7CiAJdTE2ICAgIGxlZF9iaXRzOwpAQCAtNjYsMTYgKzY2LDcgQEAKIH07CiAKIAotc3RhdGljIGludCBhcGFuZWxfcHJvYmUoc3RydWN0IGkyY19hZGFwdGVyICosIGludCwgaW50KTsKLQotLyogZm9yIG5vdywgd2Ugb25seSBzdXBwb3J0IG9uZSBhZGRyZXNzICovCi1zdGF0aWMgdW5zaWduZWQgc2hvcnQgbm9ybWFsX2kyY1tdID0gezAsIEkyQ19DTElFTlRfRU5EfTsKLXN0YXRpYyB1bnNpZ25lZCBzaG9ydCBpZ25vcmUgPSBJMkNfQ0xJRU5UX0VORDsKLXN0YXRpYyBzdHJ1Y3QgaTJjX2NsaWVudF9hZGRyZXNzX2RhdGEgYWRkcl9kYXRhID0gewotCS5ub3JtYWxfaTJjCT0gbm9ybWFsX2kyYywKLQkucHJvYmUJCT0gJmlnbm9yZSwKLQkuaWdub3JlCQk9ICZpZ25vcmUsCi19Oworc3RhdGljIGludCBhcGFuZWxfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKiwgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKik7CiAKIHN0YXRpYyB2b2lkIHJlcG9ydF9rZXkoc3RydWN0IGlucHV0X2RldiAqaW5wdXQsIHVuc2lnbmVkIGtleWNvZGUpCiB7CkBAIC0xMDMsMTIgKzk0LDEyIEBACiAJczMyIGRhdGE7CiAJaW50IGk7CiAKLQlkYXRhID0gaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhKCZhcC0+Y2xpZW50LCBjbWQpOworCWRhdGEgPSBpMmNfc21idXNfcmVhZF93b3JkX2RhdGEoYXAtPmNsaWVudCwgY21kKTsKIAlpZiAoZGF0YSA8IDApCiAJCXJldHVybjsJLyogaWdub3JlIGVycm9ycyAoZHVlIHRvIEFDUEk/PykgKi8KIAogCS8qIHdyaXRlIGJhY2sgdG8gY2xlYXIgbGF0Y2ggKi8KLQlpMmNfc21idXNfd3JpdGVfd29yZF9kYXRhKCZhcC0+Y2xpZW50LCBjbWQsIDApOworCWkyY19zbWJ1c193cml0ZV93b3JkX2RhdGEoYXAtPmNsaWVudCwgY21kLCAwKTsKIAogCWlmICghZGF0YSkKIAkJcmV0dXJuOwpAQCAtMTI0LDcgKzExNSw3IEBACiB7CiAJc3RydWN0IGFwYW5lbCAqYXAgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGFwYW5lbCwgbGVkX3dvcmspOwogCi0JaTJjX3NtYnVzX3dyaXRlX3dvcmRfZGF0YSgmYXAtPmNsaWVudCwgMHgxMCwgYXAtPmxlZF9iaXRzKTsKKwlpMmNfc21idXNfd3JpdGVfd29yZF9kYXRhKGFwLT5jbGllbnQsIDB4MTAsIGFwLT5sZWRfYml0cyk7CiB9CiAKIHN0YXRpYyB2b2lkIG1haWxfbGVkX3NldChzdHJ1Y3QgbGVkX2NsYXNzZGV2ICpsZWQsCkBAIC0xNDAsNyArMTMxLDcgQEAKIAlzY2hlZHVsZV93b3JrKCZhcC0+bGVkX3dvcmspOwogfQogCi1zdGF0aWMgaW50IGFwYW5lbF9kZXRhY2hfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCitzdGF0aWMgaW50IGFwYW5lbF9yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKIHsKIAlzdHJ1Y3QgYXBhbmVsICphcCA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwogCkBAIC0xNDgsNDMgKzEzOSwzMyBAQAogCQlsZWRfY2xhc3NkZXZfdW5yZWdpc3RlcigmYXAtPm1haWxfbGVkKTsKIAogCWlucHV0X3VucmVnaXN0ZXJfcG9sbGVkX2RldmljZShhcC0+aXBkZXYpOwotCWkyY19kZXRhY2hfY2xpZW50KCZhcC0+Y2xpZW50KTsKIAlpbnB1dF9mcmVlX3BvbGxlZF9kZXZpY2UoYXAtPmlwZGV2KTsKIAogCXJldHVybiAwOwogfQogCi0vKiBGdW5jdGlvbiBpcyBpbnZva2VkIGZvciBldmVyeSBpMmMgYWRhcHRlci4gKi8KLXN0YXRpYyBpbnQgYXBhbmVsX2F0dGFjaF9hZGFwdGVyKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCkKLXsKLQlkZXZfZGJnKCZhZGFwLT5kZXYsIEFQQU5FTCAiOiBhdHRhY2ggYWRhcHRlciBpZD0lZFxuIiwgYWRhcC0+aWQpOwotCi0JLyogT3VyIGRldmljZSBpcyBjb25uZWN0ZWQgb25seSB0byBpODAxIG9uIGxhcHRvcCAqLwotCWlmIChhZGFwLT5pZCAhPSBJMkNfSFdfU01CVVNfSTgwMSkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQlyZXR1cm4gaTJjX3Byb2JlKGFkYXAsICZhZGRyX2RhdGEsIGFwYW5lbF9wcm9iZSk7Ci19Ci0KIHN0YXRpYyB2b2lkIGFwYW5lbF9zaHV0ZG93bihzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQogewotCWFwYW5lbF9kZXRhY2hfY2xpZW50KGNsaWVudCk7CisJYXBhbmVsX3JlbW92ZShjbGllbnQpOwogfQogCitzdGF0aWMgc3RydWN0IGkyY19kZXZpY2VfaWQgYXBhbmVsX2lkW10gPSB7CisJeyAiZnVqaXRzdV9hcGFuZWwiLCAwIH0sCisJeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIGFwYW5lbF9pZCk7CisKIHN0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBhcGFuZWxfZHJpdmVyID0gewogCS5kcml2ZXIgPSB7CiAJCS5uYW1lID0gQVBBTkVMLAogCX0sCi0JLmF0dGFjaF9hZGFwdGVyID0gJmFwYW5lbF9hdHRhY2hfYWRhcHRlciwKLQkuZGV0YWNoX2NsaWVudCAgPSAmYXBhbmVsX2RldGFjaF9jbGllbnQsCisJLnByb2JlCQk9ICZhcGFuZWxfcHJvYmUsCisJLnJlbW92ZQkJPSAmYXBhbmVsX3JlbW92ZSwKIAkuc2h1dGRvd24JPSAmYXBhbmVsX3NodXRkb3duLAorCS5pZF90YWJsZQk9IGFwYW5lbF9pZCwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgYXBhbmVsIGFwYW5lbCA9IHsKLQkuY2xpZW50ID0gewotCQkuZHJpdmVyID0gJmFwYW5lbF9kcml2ZXIsCi0JCS5uYW1lICAgPSBBUEFORUwsCi0JfSwKIAkua2V5bWFwID0gewogCQlbMF0gPSBLRVlfTUFJTCwKIAkJWzFdID0gS0VZX1dXVywKQEAgLTIwNCw3ICsxODUsOCBAQAogfTsKIAogLyogTkI6IE9ubHkgb25lIHBhbmVsIG9uIHRoZSBpMmMuICovCi1zdGF0aWMgaW50IGFwYW5lbF9wcm9iZShzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmJ1cywgaW50IGFkZHJlc3MsIGludCBraW5kKQorc3RhdGljIGludCBhcGFuZWxfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwkJCWNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKIHsKIAlzdHJ1Y3QgYXBhbmVsICphcDsKIAlzdHJ1Y3QgaW5wdXRfcG9sbGVkX2RldiAqaXBkZXY7CkBAIC0yMTIsOSArMTk0LDYgQEAKIAl1OCBjbWQgPSBkZXZpY2VfY2hpcFtBUEFORUxfREVWX0FQUEJUTl0gPT0gQ0hJUF9PWjk5MkMgPyAwIDogODsKIAlpbnQgaSwgZXJyID0gLUVOT01FTTsKIAotCWRldl9kYmcoJmJ1cy0+ZGV2LCBBUEFORUwgIjogcHJvYmUgYWRhcHRlciAlcCBhZGRyICVkIGtpbmQgJWRcbiIsCi0JCWJ1cywgYWRkcmVzcywga2luZCk7Ci0KIAlhcCA9ICZhcGFuZWw7CiAKIAlpcGRldiA9IGlucHV0X2FsbG9jYXRlX3BvbGxlZF9kZXZpY2UoKTsKQEAgLTIyMiwxOCArMjAxLDEzIEBACiAJCWdvdG8gb3V0MTsKIAogCWFwLT5pcGRldiA9IGlwZGV2OwotCWFwLT5jbGllbnQuYWRhcHRlciA9IGJ1czsKLQlhcC0+Y2xpZW50LmFkZHIgPSBhZGRyZXNzOworCWFwLT5jbGllbnQgPSBjbGllbnQ7CiAKLQlpMmNfc2V0X2NsaWVudGRhdGEoJmFwLT5jbGllbnQsIGFwKTsKKwlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBhcCk7CiAKLQllcnIgPSBpMmNfYXR0YWNoX2NsaWVudCgmYXAtPmNsaWVudCk7Ci0JaWYgKGVycikKLQkJZ290byBvdXQyOwotCi0JZXJyID0gaTJjX3NtYnVzX3dyaXRlX3dvcmRfZGF0YSgmYXAtPmNsaWVudCwgY21kLCAwKTsKKwllcnIgPSBpMmNfc21idXNfd3JpdGVfd29yZF9kYXRhKGNsaWVudCwgY21kLCAwKTsKIAlpZiAoZXJyKSB7Ci0JCWRldl93YXJuKCZhcC0+Y2xpZW50LmRldiwgQVBBTkVMICI6IHNtYnVzIHdyaXRlIGVycm9yICVkXG4iLAorCQlkZXZfd2FybigmY2xpZW50LT5kZXYsIEFQQU5FTCAiOiBzbWJ1cyB3cml0ZSBlcnJvciAlZFxuIiwKIAkJCSBlcnIpOwogCQlnb3RvIG91dDM7CiAJfQpAQCAtMjQ2LDcgKzIyMCw3IEBACiAJaWRldi0+bmFtZSA9IEFQQU5FTF9OQU1FICIgYnV0dG9ucyI7CiAJaWRldi0+cGh5cyA9ICJhcGFuZWwvaW5wdXQwIjsKIAlpZGV2LT5pZC5idXN0eXBlID0gQlVTX0hPU1Q7Ci0JaWRldi0+ZGV2LnBhcmVudCA9ICZhcC0+Y2xpZW50LmRldjsKKwlpZGV2LT5kZXYucGFyZW50ID0gJmNsaWVudC0+ZGV2OwogCiAJc2V0X2JpdChFVl9LRVksIGlkZXYtPmV2Yml0KTsKIApAQCAtMjY0LDcgKzIzOCw3IEBACiAKIAlJTklUX1dPUksoJmFwLT5sZWRfd29yaywgbGVkX3VwZGF0ZSk7CiAJaWYgKGRldmljZV9jaGlwW0FQQU5FTF9ERVZfTEVEXSAhPSBDSElQX05PTkUpIHsKLQkJZXJyID0gbGVkX2NsYXNzZGV2X3JlZ2lzdGVyKCZhcC0+Y2xpZW50LmRldiwgJmFwLT5tYWlsX2xlZCk7CisJCWVyciA9IGxlZF9jbGFzc2Rldl9yZWdpc3RlcigmY2xpZW50LT5kZXYsICZhcC0+bWFpbF9sZWQpOwogCQlpZiAoZXJyKQogCQkJZ290byBvdXQ0OwogCX0KQEAgLTI3Myw4ICsyNDcsNiBAQAogb3V0NDoKIAlpbnB1dF91bnJlZ2lzdGVyX3BvbGxlZF9kZXZpY2UoaXBkZXYpOwogb3V0MzoKLQlpMmNfZGV0YWNoX2NsaWVudCgmYXAtPmNsaWVudCk7Ci1vdXQyOgogCWlucHV0X2ZyZWVfcG9sbGVkX2RldmljZShpcGRldik7CiBvdXQxOgogCXJldHVybiBlcnI7CkBAIC0zMDEsNiArMjczLDcgQEAKIAl2b2lkIF9faW9tZW0gKmJpb3M7CiAJY29uc3Qgdm9pZCBfX2lvbWVtICpwOwogCXU4IGRldm5vOworCXVuc2lnbmVkIGNoYXIgaTJjX2FkZHI7CiAJaW50IGZvdW5kID0gMDsKIAogCWJpb3MgPSBpb3JlbWFwKDB4RjAwMDAsIDB4MTAwMDApOyAvKiBDYW4ndCBmYWlsICovCkBAIC0zMTMsNyArMjg2LDcgQEAKIAogCS8qIGp1c3QgdXNlIHRoZSBmaXJzdCBhZGRyZXNzICovCiAJcCArPSA4OwotCW5vcm1hbF9pMmNbMF0gPSByZWFkYihwKzMpID4+IDE7CisJaTJjX2FkZHIgPSByZWFkYihwICsgMykgPj4gMTsKIAogCWZvciAoIDsgKGRldm5vID0gcmVhZGIocCkpICYgMHg3ZjsgcCArPSA0KSB7CiAJCXVuc2lnbmVkIGNoYXIgbWV0aG9kLCBzbGF2ZSwgY2hpcDsKQEAgLTMyMiw3ICsyOTUsNyBAQAogCQljaGlwID0gcmVhZGIocCArIDIpOwogCQlzbGF2ZSA9IHJlYWRiKHAgKyAzKSA+PiAxOwogCi0JCWlmIChzbGF2ZSAhPSBub3JtYWxfaTJjWzBdKSB7CisJCWlmIChzbGF2ZSAhPSBpMmNfYWRkcikgewogCQkJcHJfbm90aWNlKEFQQU5FTCAiOiBvbmx5IG9uZSBTTUJ1cyBzbGF2ZSAiCiAJCQkJICAiYWRkcmVzcyBzdXBwb3J0ZWQsIHNraXBpbmcgZGV2aWNlLi4uXG4iKTsKIAkJCWNvbnRpbnVlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9taXNjL3Bjc3Brci5jIGIvZHJpdmVycy9pbnB1dC9taXNjL3Bjc3Brci5jCmluZGV4IDQzYWFhNWMuLmQ2YTMwY2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvbWlzYy9wY3Nwa3IuYworKysgYi9kcml2ZXJzL2lucHV0L21pc2MvcGNzcGtyLmMKQEAgLTUyLDEzICs1MiwxMyBAQAogCXNwaW5fbG9ja19pcnFzYXZlKCZpODI1M19sb2NrLCBmbGFncyk7CiAKIAlpZiAoY291bnQpIHsKLQkJLyogZW5hYmxlIGNvdW50ZXIgMiAqLwotCQlvdXRiX3AoaW5iX3AoMHg2MSkgfCAzLCAweDYxKTsKIAkJLyogc2V0IGNvbW1hbmQgZm9yIGNvdW50ZXIgMiwgMiBieXRlIHdyaXRlICovCiAJCW91dGJfcCgweEI2LCAweDQzKTsKIAkJLyogc2VsZWN0IGRlc2lyZWQgSFogKi8KIAkJb3V0Yl9wKGNvdW50ICYgMHhmZiwgMHg0Mik7CiAJCW91dGIoKGNvdW50ID4+IDgpICYgMHhmZiwgMHg0Mik7CisJCS8qIGVuYWJsZSBjb3VudGVyIDIgKi8KKwkJb3V0Yl9wKGluYl9wKDB4NjEpIHwgMywgMHg2MSk7CiAJfSBlbHNlIHsKIAkJLyogZGlzYWJsZSBjb3VudGVyIDIgKi8KIAkJb3V0YihpbmJfcCgweDYxKSAmIDB4RkMsIDB4NjEpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9taXNjL3VpbnB1dC5jIGIvZHJpdmVycy9pbnB1dC9taXNjL3VpbnB1dC5jCmluZGV4IDIyM2Q1NmQuLjQ2YjdjYWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvbWlzYy91aW5wdXQuYworKysgYi9kcml2ZXJzL2lucHV0L21pc2MvdWlucHV0LmMKQEAgLTM3LDYgKzM3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC91aW5wdXQuaD4KKyNpbmNsdWRlICIuLi9pbnB1dC1jb21wYXQuaCIKIAogc3RhdGljIGludCB1aW5wdXRfZGV2X2V2ZW50KHN0cnVjdCBpbnB1dF9kZXYgKmRldiwgdW5zaWduZWQgaW50IHR5cGUsIHVuc2lnbmVkIGludCBjb2RlLCBpbnQgdmFsdWUpCiB7CkBAIC03OCw2ICs3OSw3IEBACiAJLyogRmluZCBhbiBpbnB1dCByZXF1ZXN0LCBieSBJRC4gUmV0dXJucyBOVUxMIGlmIHRoZSBJRCBpc24ndCB2YWxpZC4gKi8KIAlpZiAoaWQgPj0gVUlOUFVUX05VTV9SRVFVRVNUUyB8fCBpZCA8IDApCiAJCXJldHVybiBOVUxMOworCiAJcmV0dXJuIHVkZXYtPnJlcXVlc3RzW2lkXTsKIH0KIApAQCAtMTI3LDYgKzEyOSwxNyBAQAogCXN0cnVjdCB1aW5wdXRfcmVxdWVzdCByZXF1ZXN0OwogCWludCByZXR2YWw7CiAKKwkvKgorCSAqIHVpbnB1dCBkcml2ZXIgZG9lcyBub3QgY3VycmVudGx5IHN1cHBvcnQgcGVyaW9kaWMgZWZmZWN0cyB3aXRoCisJICogY3VzdG9tIHdhdmVmb3JtIHNpbmNlIGl0IGRvZXMgbm90IGhhdmUgYSB3YXkgdG8gcGFzcyBidWZmZXIgb2YKKwkgKiBzYW1wbGVzIChjdXN0b21fZGF0YSkgdG8gdXNlcnNwYWNlLiBJZiBldmVyIHRoZXJlIGlzIGEgZGV2aWNlCisJICogc3VwcG9ydGluZyBjdXN0b20gd2F2ZWZvcm1zIHdlIHdvdWxkIG5lZWQgdG8gZGVmaW5lIGFuIGFkZGl0aW9uYWwKKwkgKiBpb2N0bCAoVUlfVVBMT0FEX1NBTVBMRVMpIGJ1dCBmb3Igbm93IHdlIGp1c3QgYmFpbCBvdXQuCisJICovCisJaWYgKGVmZmVjdC0+dHlwZSA9PSBGRl9QRVJJT0RJQyAmJgorCQkJZWZmZWN0LT51LnBlcmlvZGljLndhdmVmb3JtID09IEZGX0NVU1RPTSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKIAlyZXF1ZXN0LmlkID0gLTE7CiAJaW5pdF9jb21wbGV0aW9uKCZyZXF1ZXN0LmRvbmUpOwogCXJlcXVlc3QuY29kZSA9IFVJX0ZGX1VQTE9BRDsKQEAgLTM1MywxNSArMzY2LDE1IEBACiB7CiAJc3RydWN0IGlucHV0X2V2ZW50IGV2OwogCi0JaWYgKGNvdW50ICE9IHNpemVvZihzdHJ1Y3QgaW5wdXRfZXZlbnQpKQorCWlmIChjb3VudCA8IGlucHV0X2V2ZW50X3NpemUoKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlpZiAoY29weV9mcm9tX3VzZXIoJmV2LCBidWZmZXIsIHNpemVvZihzdHJ1Y3QgaW5wdXRfZXZlbnQpKSkKKwlpZiAoaW5wdXRfZXZlbnRfZnJvbV91c2VyKGJ1ZmZlciwgJmV2KSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKIAlpbnB1dF9ldmVudCh1ZGV2LT5kZXYsIGV2LnR5cGUsIGV2LmNvZGUsIGV2LnZhbHVlKTsKIAotCXJldHVybiBzaXplb2Yoc3RydWN0IGlucHV0X2V2ZW50KTsKKwlyZXR1cm4gaW5wdXRfZXZlbnRfc2l6ZSgpOwogfQogCiBzdGF0aWMgc3NpemVfdCB1aW5wdXRfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQpAQCAtNDA3LDEzICs0MjAsMTMgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0Jd2hpbGUgKHVkZXYtPmhlYWQgIT0gdWRldi0+dGFpbCAmJiByZXR2YWwgKyBzaXplb2Yoc3RydWN0IGlucHV0X2V2ZW50KSA8PSBjb3VudCkgewotCQlpZiAoY29weV90b191c2VyKGJ1ZmZlciArIHJldHZhbCwgJnVkZXYtPmJ1ZmZbdWRldi0+dGFpbF0sIHNpemVvZihzdHJ1Y3QgaW5wdXRfZXZlbnQpKSkgeworCXdoaWxlICh1ZGV2LT5oZWFkICE9IHVkZXYtPnRhaWwgJiYgcmV0dmFsICsgaW5wdXRfZXZlbnRfc2l6ZSgpIDw9IGNvdW50KSB7CisJCWlmIChpbnB1dF9ldmVudF90b191c2VyKGJ1ZmZlciArIHJldHZhbCwgJnVkZXYtPmJ1ZmZbdWRldi0+dGFpbF0pKSB7CiAJCQlyZXR2YWwgPSAtRUZBVUxUOwogCQkJZ290byBvdXQ7CiAJCX0KIAkJdWRldi0+dGFpbCA9ICh1ZGV2LT50YWlsICsgMSkgJSBVSU5QVVRfQlVGRkVSX1NJWkU7Ci0JCXJldHZhbCArPSBzaXplb2Yoc3RydWN0IGlucHV0X2V2ZW50KTsKKwkJcmV0dmFsICs9IGlucHV0X2V2ZW50X3NpemUoKTsKIAl9CiAKICBvdXQ6CkBAIC00NDQsNiArNDU3LDkzIEBACiAJcmV0dXJuIDA7CiB9CiAKKyNpZmRlZiBDT05GSUdfQ09NUEFUCitzdHJ1Y3QgdWlucHV0X2ZmX3VwbG9hZF9jb21wYXQgeworCWludAkJCXJlcXVlc3RfaWQ7CisJaW50CQkJcmV0dmFsOworCXN0cnVjdCBmZl9lZmZlY3RfY29tcGF0CWVmZmVjdDsKKwlzdHJ1Y3QgZmZfZWZmZWN0X2NvbXBhdAlvbGQ7Cit9OworCitzdGF0aWMgaW50IHVpbnB1dF9mZl91cGxvYWRfdG9fdXNlcihjaGFyIF9fdXNlciAqYnVmZmVyLAorCQkJCSAgICBjb25zdCBzdHJ1Y3QgdWlucHV0X2ZmX3VwbG9hZCAqZmZfdXApCit7CisJaWYgKElOUFVUX0NPTVBBVF9URVNUKSB7CisJCXN0cnVjdCB1aW5wdXRfZmZfdXBsb2FkX2NvbXBhdCBmZl91cF9jb21wYXQ7CisKKwkJZmZfdXBfY29tcGF0LnJlcXVlc3RfaWQgPSBmZl91cC0+cmVxdWVzdF9pZDsKKwkJZmZfdXBfY29tcGF0LnJldHZhbCA9IGZmX3VwLT5yZXR2YWw7CisJCS8qCisJCSAqIEl0IHNvIGhhcHBlbnMgdGhhdCB0aGUgcG9pbnRlciB0aGF0IGdpdmVzIHVzIHRoZSB0cm91YmxlCisJCSAqIGlzIHRoZSBsYXN0IGZpZWxkIGluIHRoZSBzdHJ1Y3R1cmUuIFNpbmNlIHdlIGRvbid0IHN1cHBvcnQKKwkJICogY3VzdG9tIHdhdmVmb3JtcyBpbiB1aW5wdXQgYW55d2F5IHdlIGNhbiBqdXN0IGNvcHkgdGhlIHdob2xlCisJCSAqIHRoaW5nICh0byB0aGUgY29tcGF0IHNpemUpIGFuZCBpZ25vcmUgdGhlIHBvaW50ZXIuCisJCSAqLworCQltZW1jcHkoJmZmX3VwX2NvbXBhdC5lZmZlY3QsICZmZl91cC0+ZWZmZWN0LAorCQkJc2l6ZW9mKHN0cnVjdCBmZl9lZmZlY3RfY29tcGF0KSk7CisJCW1lbWNweSgmZmZfdXBfY29tcGF0Lm9sZCwgJmZmX3VwLT5vbGQsCisJCQlzaXplb2Yoc3RydWN0IGZmX2VmZmVjdF9jb21wYXQpKTsKKworCQlpZiAoY29weV90b191c2VyKGJ1ZmZlciwgJmZmX3VwX2NvbXBhdCwKKwkJCQkgc2l6ZW9mKHN0cnVjdCB1aW5wdXRfZmZfdXBsb2FkX2NvbXBhdCkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJfSBlbHNlIHsKKwkJaWYgKGNvcHlfdG9fdXNlcihidWZmZXIsIGZmX3VwLAorCQkJCSBzaXplb2Yoc3RydWN0IHVpbnB1dF9mZl91cGxvYWQpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHVpbnB1dF9mZl91cGxvYWRfZnJvbV91c2VyKGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsCisJCQkJICAgICAgc3RydWN0IHVpbnB1dF9mZl91cGxvYWQgKmZmX3VwKQoreworCWlmIChJTlBVVF9DT01QQVRfVEVTVCkgeworCQlzdHJ1Y3QgdWlucHV0X2ZmX3VwbG9hZF9jb21wYXQgZmZfdXBfY29tcGF0OworCisJCWlmIChjb3B5X2Zyb21fdXNlcigmZmZfdXBfY29tcGF0LCBidWZmZXIsCisJCQkJICAgc2l6ZW9mKHN0cnVjdCB1aW5wdXRfZmZfdXBsb2FkX2NvbXBhdCkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJZmZfdXAtPnJlcXVlc3RfaWQgPSBmZl91cF9jb21wYXQucmVxdWVzdF9pZDsKKwkJZmZfdXAtPnJldHZhbCA9IGZmX3VwX2NvbXBhdC5yZXR2YWw7CisJCW1lbWNweSgmZmZfdXAtPmVmZmVjdCwgJmZmX3VwX2NvbXBhdC5lZmZlY3QsCisJCQlzaXplb2Yoc3RydWN0IGZmX2VmZmVjdF9jb21wYXQpKTsKKwkJbWVtY3B5KCZmZl91cC0+b2xkLCAmZmZfdXBfY29tcGF0Lm9sZCwKKwkJCXNpemVvZihzdHJ1Y3QgZmZfZWZmZWN0X2NvbXBhdCkpOworCisJfSBlbHNlIHsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKGZmX3VwLCBidWZmZXIsCisJCQkJICAgc2l6ZW9mKHN0cnVjdCB1aW5wdXRfZmZfdXBsb2FkKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworI2Vsc2UKKworc3RhdGljIGludCB1aW5wdXRfZmZfdXBsb2FkX3RvX3VzZXIoY2hhciBfX3VzZXIgKmJ1ZmZlciwKKwkJCQkgICAgY29uc3Qgc3RydWN0IHVpbnB1dF9mZl91cGxvYWQgKmZmX3VwKQoreworCWlmIChjb3B5X3RvX3VzZXIoYnVmZmVyLCBmZl91cCwgc2l6ZW9mKHN0cnVjdCB1aW5wdXRfZmZfdXBsb2FkKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdWlucHV0X2ZmX3VwbG9hZF9mcm9tX3VzZXIoY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwKKwkJCQkgICAgICBzdHJ1Y3QgdWlucHV0X2ZmX3VwbG9hZCAqZmZfdXApCit7CisJaWYgKGNvcHlfZnJvbV91c2VyKGZmX3VwLCBidWZmZXIsIHNpemVvZihzdHJ1Y3QgdWlucHV0X2ZmX3VwbG9hZCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiAwOworfQorCisjZW5kaWYKKwogI2RlZmluZSB1aW5wdXRfc2V0X2JpdChfYXJnLCBfYml0LCBfbWF4KQkJXAogKHsJCQkJCQkJXAogCWludCBfX3JldCA9IDA7CQkJCQlcCkBAIC00NTUsMTkgKzU1NSwxNyBAQAogCV9fcmV0OwkJCQkJCVwKIH0pCiAKLXN0YXRpYyBsb25nIHVpbnB1dF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCitzdGF0aWMgbG9uZyB1aW5wdXRfaW9jdGxfaGFuZGxlcihzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKKwkJCQkgdW5zaWduZWQgbG9uZyBhcmcsIHZvaWQgX191c2VyICpwKQogewogCWludAkJCXJldHZhbDsKLQlzdHJ1Y3QgdWlucHV0X2RldmljZQkqdWRldjsKLQl2b2lkIF9fdXNlciAgICAgICAgICAgICAqcCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKwlzdHJ1Y3QgdWlucHV0X2RldmljZQkqdWRldiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAlzdHJ1Y3QgdWlucHV0X2ZmX3VwbG9hZCBmZl91cDsKIAlzdHJ1Y3QgdWlucHV0X2ZmX2VyYXNlICBmZl9lcmFzZTsKIAlzdHJ1Y3QgdWlucHV0X3JlcXVlc3QgICAqcmVxOwogCWludCAgICAgICAgICAgICAgICAgICAgIGxlbmd0aDsKIAljaGFyCQkJKnBoeXM7CiAKLQl1ZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCiAJcmV0dmFsID0gbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZ1ZGV2LT5tdXRleCk7CiAJaWYgKHJldHZhbCkKIAkJcmV0dXJuIHJldHZhbDsKQEAgLTU0OSwyNiArNjQ3LDI0IEBACiAJCQlicmVhazsKIAogCQljYXNlIFVJX0JFR0lOX0ZGX1VQTE9BRDoKLQkJCWlmIChjb3B5X2Zyb21fdXNlcigmZmZfdXAsIHAsIHNpemVvZihmZl91cCkpKSB7Ci0JCQkJcmV0dmFsID0gLUVGQVVMVDsKKwkJCXJldHZhbCA9IHVpbnB1dF9mZl91cGxvYWRfZnJvbV91c2VyKHAsICZmZl91cCk7CisJCQlpZiAocmV0dmFsKQogCQkJCWJyZWFrOwotCQkJfQorCiAJCQlyZXEgPSB1aW5wdXRfcmVxdWVzdF9maW5kKHVkZXYsIGZmX3VwLnJlcXVlc3RfaWQpOwotCQkJaWYgKCEocmVxICYmIHJlcS0+Y29kZSA9PSBVSV9GRl9VUExPQUQgJiYgcmVxLT51LnVwbG9hZC5lZmZlY3QpKSB7CisJCQlpZiAoIXJlcSB8fCByZXEtPmNvZGUgIT0gVUlfRkZfVVBMT0FEIHx8ICFyZXEtPnUudXBsb2FkLmVmZmVjdCkgewogCQkJCXJldHZhbCA9IC1FSU5WQUw7CiAJCQkJYnJlYWs7CiAJCQl9CisKIAkJCWZmX3VwLnJldHZhbCA9IDA7Ci0JCQltZW1jcHkoJmZmX3VwLmVmZmVjdCwgcmVxLT51LnVwbG9hZC5lZmZlY3QsIHNpemVvZihzdHJ1Y3QgZmZfZWZmZWN0KSk7CisJCQlmZl91cC5lZmZlY3QgPSAqcmVxLT51LnVwbG9hZC5lZmZlY3Q7CiAJCQlpZiAocmVxLT51LnVwbG9hZC5vbGQpCi0JCQkJbWVtY3B5KCZmZl91cC5vbGQsIHJlcS0+dS51cGxvYWQub2xkLCBzaXplb2Yoc3RydWN0IGZmX2VmZmVjdCkpOworCQkJCWZmX3VwLm9sZCA9ICpyZXEtPnUudXBsb2FkLm9sZDsKIAkJCWVsc2UKIAkJCQltZW1zZXQoJmZmX3VwLm9sZCwgMCwgc2l6ZW9mKHN0cnVjdCBmZl9lZmZlY3QpKTsKIAotCQkJaWYgKGNvcHlfdG9fdXNlcihwLCAmZmZfdXAsIHNpemVvZihmZl91cCkpKSB7Ci0JCQkJcmV0dmFsID0gLUVGQVVMVDsKLQkJCQlicmVhazsKLQkJCX0KKwkJCXJldHZhbCA9IHVpbnB1dF9mZl91cGxvYWRfdG9fdXNlcihwLCAmZmZfdXApOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBVSV9CRUdJTl9GRl9FUkFTRToKQEAgLTU3NiwyOSArNjcyLDM0IEBACiAJCQkJcmV0dmFsID0gLUVGQVVMVDsKIAkJCQlicmVhazsKIAkJCX0KKwogCQkJcmVxID0gdWlucHV0X3JlcXVlc3RfZmluZCh1ZGV2LCBmZl9lcmFzZS5yZXF1ZXN0X2lkKTsKLQkJCWlmICghKHJlcSAmJiByZXEtPmNvZGUgPT0gVUlfRkZfRVJBU0UpKSB7CisJCQlpZiAoIXJlcSB8fCByZXEtPmNvZGUgIT0gVUlfRkZfRVJBU0UpIHsKIAkJCQlyZXR2YWwgPSAtRUlOVkFMOwogCQkJCWJyZWFrOwogCQkJfQorCiAJCQlmZl9lcmFzZS5yZXR2YWwgPSAwOwogCQkJZmZfZXJhc2UuZWZmZWN0X2lkID0gcmVxLT51LmVmZmVjdF9pZDsKIAkJCWlmIChjb3B5X3RvX3VzZXIocCwgJmZmX2VyYXNlLCBzaXplb2YoZmZfZXJhc2UpKSkgewogCQkJCXJldHZhbCA9IC1FRkFVTFQ7CiAJCQkJYnJlYWs7CiAJCQl9CisKIAkJCWJyZWFrOwogCiAJCWNhc2UgVUlfRU5EX0ZGX1VQTE9BRDoKLQkJCWlmIChjb3B5X2Zyb21fdXNlcigmZmZfdXAsIHAsIHNpemVvZihmZl91cCkpKSB7Ci0JCQkJcmV0dmFsID0gLUVGQVVMVDsKKwkJCXJldHZhbCA9IHVpbnB1dF9mZl91cGxvYWRfZnJvbV91c2VyKHAsICZmZl91cCk7CisJCQlpZiAocmV0dmFsKQogCQkJCWJyZWFrOwotCQkJfQorCiAJCQlyZXEgPSB1aW5wdXRfcmVxdWVzdF9maW5kKHVkZXYsIGZmX3VwLnJlcXVlc3RfaWQpOwotCQkJaWYgKCEocmVxICYmIHJlcS0+Y29kZSA9PSBVSV9GRl9VUExPQUQgJiYgcmVxLT51LnVwbG9hZC5lZmZlY3QpKSB7CisJCQlpZiAoIXJlcSB8fCByZXEtPmNvZGUgIT0gVUlfRkZfVVBMT0FEIHx8CisJCQkgICAgIXJlcS0+dS51cGxvYWQuZWZmZWN0KSB7CiAJCQkJcmV0dmFsID0gLUVJTlZBTDsKIAkJCQlicmVhazsKIAkJCX0KKwogCQkJcmVxLT5yZXR2YWwgPSBmZl91cC5yZXR2YWw7CiAJCQl1aW5wdXRfcmVxdWVzdF9kb25lKHVkZXYsIHJlcSk7CiAJCQlicmVhazsKQEAgLTYwOCwxMSArNzA5LDEzIEBACiAJCQkJcmV0dmFsID0gLUVGQVVMVDsKIAkJCQlicmVhazsKIAkJCX0KKwogCQkJcmVxID0gdWlucHV0X3JlcXVlc3RfZmluZCh1ZGV2LCBmZl9lcmFzZS5yZXF1ZXN0X2lkKTsKLQkJCWlmICghKHJlcSAmJiByZXEtPmNvZGUgPT0gVUlfRkZfRVJBU0UpKSB7CisJCQlpZiAoIXJlcSB8fCByZXEtPmNvZGUgIT0gVUlfRkZfRVJBU0UpIHsKIAkJCQlyZXR2YWwgPSAtRUlOVkFMOwogCQkJCWJyZWFrOwogCQkJfQorCiAJCQlyZXEtPnJldHZhbCA9IGZmX2VyYXNlLnJldHZhbDsKIAkJCXVpbnB1dF9yZXF1ZXN0X2RvbmUodWRldiwgcmVxKTsKIAkJCWJyZWFrOwpAQCAtNjI2LDYgKzcyOSwxOCBAQAogCXJldHVybiByZXR2YWw7CiB9CiAKK3N0YXRpYyBsb25nIHVpbnB1dF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJcmV0dXJuIHVpbnB1dF9pb2N0bF9oYW5kbGVyKGZpbGUsIGNtZCwgYXJnLCAodm9pZCBfX3VzZXIgKilhcmcpOworfQorCisjaWZkZWYgQ09ORklHX0NPTVBBVAorc3RhdGljIGxvbmcgdWlucHV0X2NvbXBhdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJcmV0dXJuIHVpbnB1dF9pb2N0bF9oYW5kbGVyKGZpbGUsIGNtZCwgYXJnLCBjb21wYXRfcHRyKGFyZykpOworfQorI2VuZGlmCisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHVpbnB1dF9mb3BzID0gewogCS5vd25lcgkJPSBUSElTX01PRFVMRSwKIAkub3BlbgkJPSB1aW5wdXRfb3BlbiwKQEAgLTYzNCw2ICs3NDksOSBAQAogCS53cml0ZQkJPSB1aW5wdXRfd3JpdGUsCiAJLnBvbGwJCT0gdWlucHV0X3BvbGwsCiAJLnVubG9ja2VkX2lvY3RsCT0gdWlucHV0X2lvY3RsLAorI2lmZGVmIENPTkZJR19DT01QQVQKKwkuY29tcGF0X2lvY3RsCT0gdWlucHV0X2NvbXBhdF9pb2N0bCwKKyNlbmRpZgogfTsKIAogc3RhdGljIHN0cnVjdCBtaXNjZGV2aWNlIHVpbnB1dF9taXNjID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9tb3VzZS9LY29uZmlnIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9LY29uZmlnCmluZGV4IDRlOTkzNDIuLjA5M2M4YzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvbW91c2UvS2NvbmZpZworKysgYi9kcml2ZXJzL2lucHV0L21vdXNlL0tjb25maWcKQEAgLTI4Niw0ICsyODYsMTAgQEAKIAkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQogCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGdwaW9fbW91c2UuCiAKK2NvbmZpZyBNT1VTRV9QWEE5MzBfVFJLQkFMTAorCXRyaXN0YXRlICJQWEE5MzAgVHJhY2tiYWxsIG1vdXNlIgorCWRlcGVuZHMgb24gQ1BVX1BYQTkzMCB8fCBDUFVfUFhBOTM1CisJaGVscAorCSAgU2F5IFkgaGVyZSB0byBzdXBwb3J0IFBYQTkzMCBUcmFja2JhbGwgbW91c2UuCisKIGVuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L21vdXNlL01ha2VmaWxlIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9NYWtlZmlsZQppbmRleCA5NmYxZGQ4Li44YzhhMWYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L21vdXNlL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvaW5wdXQvbW91c2UvTWFrZWZpbGUKQEAgLTQsMTkgKzQsMjAgQEAKIAogIyBFYWNoIGNvbmZpZ3VyYXRpb24gb3B0aW9uIGVuYWJsZXMgYSBsaXN0IG9mIGZpbGVzLgogCi1vYmotJChDT05GSUdfTU9VU0VfQU1JR0EpCSs9IGFtaW1vdXNlLm8KLW9iai0kKENPTkZJR19NT1VTRV9BUFBMRVRPVUNIKQkrPSBhcHBsZXRvdWNoLm8KLW9iai0kKENPTkZJR19NT1VTRV9CQ001OTc0KQkrPSBiY201OTc0Lm8KLW9iai0kKENPTkZJR19NT1VTRV9BVEFSSSkJKz0gYXRhcmltb3VzZS5vCi1vYmotJChDT05GSUdfTU9VU0VfUklTQ1BDKQkrPSBycGNtb3VzZS5vCi1vYmotJChDT05GSUdfTU9VU0VfSU5QT1JUKQkrPSBpbnBvcnQubwotb2JqLSQoQ09ORklHX01PVVNFX0xPR0lCTSkJKz0gbG9naWJtLm8KLW9iai0kKENPTkZJR19NT1VTRV9QQzExMFBBRCkJKz0gcGMxMTBwYWQubwotb2JqLSQoQ09ORklHX01PVVNFX1BTMikJCSs9IHBzbW91c2Uubwotb2JqLSQoQ09ORklHX01PVVNFX1NFUklBTCkJKz0gc2VybW91c2Uubwotb2JqLSQoQ09ORklHX01PVVNFX0hJTCkJCSs9IGhpbF9wdHIubwotb2JqLSQoQ09ORklHX01PVVNFX1ZTWFhYQUEpCSs9IHZzeHh4YWEubwotb2JqLSQoQ09ORklHX01PVVNFX0dQSU8pCSs9IGdwaW9fbW91c2Uubworb2JqLSQoQ09ORklHX01PVVNFX0FNSUdBKQkJKz0gYW1pbW91c2Uubworb2JqLSQoQ09ORklHX01PVVNFX0FQUExFVE9VQ0gpCQkrPSBhcHBsZXRvdWNoLm8KK29iai0kKENPTkZJR19NT1VTRV9CQ001OTc0KQkJKz0gYmNtNTk3NC5vCitvYmotJChDT05GSUdfTU9VU0VfQVRBUkkpCQkrPSBhdGFyaW1vdXNlLm8KK29iai0kKENPTkZJR19NT1VTRV9SSVNDUEMpCQkrPSBycGNtb3VzZS5vCitvYmotJChDT05GSUdfTU9VU0VfSU5QT1JUKQkJKz0gaW5wb3J0Lm8KK29iai0kKENPTkZJR19NT1VTRV9MT0dJQk0pCQkrPSBsb2dpYm0ubworb2JqLSQoQ09ORklHX01PVVNFX1BDMTEwUEFEKQkJKz0gcGMxMTBwYWQubworb2JqLSQoQ09ORklHX01PVVNFX1BTMikJCQkrPSBwc21vdXNlLm8KK29iai0kKENPTkZJR19NT1VTRV9QWEE5MzBfVFJLQkFMTCkJKz0gcHhhOTMwX3Rya2JhbGwubworb2JqLSQoQ09ORklHX01PVVNFX1NFUklBTCkJCSs9IHNlcm1vdXNlLm8KK29iai0kKENPTkZJR19NT1VTRV9ISUwpCQkJKz0gaGlsX3B0ci5vCitvYmotJChDT05GSUdfTU9VU0VfVlNYWFhBQSkJCSs9IHZzeHh4YWEubworb2JqLSQoQ09ORklHX01PVVNFX0dQSU8pCQkrPSBncGlvX21vdXNlLm8KIAogcHNtb3VzZS1vYmpzIDo9IHBzbW91c2UtYmFzZS5vIHN5bmFwdGljcy5vCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvbW91c2UvYXBwbGV0b3VjaC5jIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9hcHBsZXRvdWNoLmMKaW5kZXggMDc5ODE2ZS4uNDU0Yjk2MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9tb3VzZS9hcHBsZXRvdWNoLmMKKysrIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9hcHBsZXRvdWNoLmMKQEAgLTMsNyArMyw3IEBACiAgKgogICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDQgR3JlZyBLcm9haC1IYXJ0bWFuIChncmVnQGtyb2FoLmNvbSkKICAqIENvcHlyaWdodCAoQykgMjAwNS0yMDA4IEpvaGFubmVzIEJlcmcgKGpvaGFubmVzQHNpcHNvbHV0aW9ucy5uZXQpCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDUgICAgICBTdGVsaWFuIFBvcCAoc3RlbGlhbkBwb3BpZXMubmV0KQorICogQ29weXJpZ2h0IChDKSAyMDA1LTIwMDggU3RlbGlhbiBQb3AgKHN0ZWxpYW5AcG9waWVzLm5ldCkKICAqIENvcHlyaWdodCAoQykgMjAwNSAgICAgIEZyYW5rIEFybm9sZCAoZnJhbmtAc2Npcm9jY28tNXYtdHVyYm8uZGUpCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDUgICAgICBQZXRlciBPc3Rlcmx1bmQgKHBldGVybzJAdGVsaWEuY29tKQogICogQ29weXJpZ2h0IChDKSAyMDA1ICAgICAgTWljaGFlbCBIYW5zZWxtYW5uIChsaW51eC1rZXJuZWxAaGFuc21pLmNoKQpAQCAtMzUsMTYgKzM1LDc0IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvdXNiL2lucHV0Lmg+CiAKLS8qIFR5cGUgb2YgdG91Y2hwYWQgKi8KLWVudW0gYXRwX3RvdWNocGFkX3R5cGUgewotCUFUUF9GT1VOVEFJTiwKLQlBVFBfR0VZU0VSMSwKLQlBVFBfR0VZU0VSMiwKLQlBVFBfR0VZU0VSMywKLQlBVFBfR0VZU0VSNAorLyoKKyAqIE5vdGU6IFdlIHRyeSB0byBrZWVwIHRoZSB0b3VjaHBhZCBhc3BlY3QgcmF0aW8gd2hpbGUgc3RpbGwgZG9pbmcgb25seQorICogc2ltcGxlIGFyaXRobWV0aWNzOgorICoJMCA8PSB4IDw9ICh4c2Vuc29ycyAtIDEpICogeGZhY3QKKyAqCTAgPD0geSA8PSAoeXNlbnNvcnMgLSAxKSAqIHlmYWN0CisgKi8KK3N0cnVjdCBhdHBfaW5mbyB7CisJaW50IHhzZW5zb3JzOwkJCQkvKiBudW1iZXIgb2YgWCBzZW5zb3JzICovCisJaW50IHhzZW5zb3JzXzE3OwkJCS8qIDE3IiBtb2RlbHMgaGF2ZSBtb3JlIHNlbnNvcnMgKi8KKwlpbnQgeXNlbnNvcnM7CQkJCS8qIG51bWJlciBvZiBZIHNlbnNvcnMgKi8KKwlpbnQgeGZhY3Q7CQkJCS8qIFggbXVsdGlwbGljYXRpb24gZmFjdG9yICovCisJaW50IHlmYWN0OwkJCQkvKiBZIG11bHRpcGxpY2F0aW9uIGZhY3RvciAqLworCWludCBkYXRhbGVuOwkJCQkvKiBzaXplIG9mIFVTQiB0cmFuc2ZlcnMgKi8KKwl2b2lkICgqY2FsbGJhY2spKHN0cnVjdCB1cmIgKik7CQkvKiBjYWxsYmFjayBmdW5jdGlvbiAqLwogfTsKIAotI2RlZmluZSBBVFBfREVWSUNFKHByb2QsIHR5cGUpCQkJCQlcCitzdGF0aWMgdm9pZCBhdHBfY29tcGxldGVfZ2V5c2VyXzFfMihzdHJ1Y3QgdXJiICp1cmIpOworc3RhdGljIHZvaWQgYXRwX2NvbXBsZXRlX2dleXNlcl8zXzQoc3RydWN0IHVyYiAqdXJiKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhdHBfaW5mbyBmb3VudGFpbl9pbmZvID0geworCS54c2Vuc29ycwk9IDE2LAorCS54c2Vuc29yc18xNwk9IDI2LAorCS55c2Vuc29ycwk9IDE2LAorCS54ZmFjdAkJPSA2NCwKKwkueWZhY3QJCT0gNDMsCisJLmRhdGFsZW4JPSA4MSwKKwkuY2FsbGJhY2sJPSBhdHBfY29tcGxldGVfZ2V5c2VyXzFfMiwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXRwX2luZm8gZ2V5c2VyMV9pbmZvID0geworCS54c2Vuc29ycwk9IDE2LAorCS54c2Vuc29yc18xNwk9IDI2LAorCS55c2Vuc29ycwk9IDE2LAorCS54ZmFjdAkJPSA2NCwKKwkueWZhY3QJCT0gNDMsCisJLmRhdGFsZW4JPSA4MSwKKwkuY2FsbGJhY2sJPSBhdHBfY29tcGxldGVfZ2V5c2VyXzFfMiwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXRwX2luZm8gZ2V5c2VyMl9pbmZvID0geworCS54c2Vuc29ycwk9IDE1LAorCS54c2Vuc29yc18xNwk9IDIwLAorCS55c2Vuc29ycwk9IDksCisJLnhmYWN0CQk9IDY0LAorCS55ZmFjdAkJPSA0MywKKwkuZGF0YWxlbgk9IDY0LAorCS5jYWxsYmFjawk9IGF0cF9jb21wbGV0ZV9nZXlzZXJfMV8yLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhdHBfaW5mbyBnZXlzZXIzX2luZm8gPSB7CisJLnhzZW5zb3JzCT0gMjAsCisJLnlzZW5zb3JzCT0gMTAsCisJLnhmYWN0CQk9IDY0LAorCS55ZmFjdAkJPSA2NCwKKwkuZGF0YWxlbgk9IDY0LAorCS5jYWxsYmFjawk9IGF0cF9jb21wbGV0ZV9nZXlzZXJfM180LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhdHBfaW5mbyBnZXlzZXI0X2luZm8gPSB7CisJLnhzZW5zb3JzCT0gMjAsCisJLnlzZW5zb3JzCT0gMTAsCisJLnhmYWN0CQk9IDY0LAorCS55ZmFjdAkJPSA2NCwKKwkuZGF0YWxlbgk9IDY0LAorCS5jYWxsYmFjawk9IGF0cF9jb21wbGV0ZV9nZXlzZXJfM180LAorfTsKKworI2RlZmluZSBBVFBfREVWSUNFKHByb2QsIGluZm8pCQkJCQlcCiB7CQkJCQkJCQlcCiAJLm1hdGNoX2ZsYWdzID0gVVNCX0RFVklDRV9JRF9NQVRDSF9ERVZJQ0UgfAkJXAogCQkgICAgICAgVVNCX0RFVklDRV9JRF9NQVRDSF9JTlRfQ0xBU1MgfAkJXApAQCAtNTMsNyArMTExLDcgQEAKIAkuaWRQcm9kdWN0ID0gKHByb2QpLAkJCQkJXAogCS5iSW50ZXJmYWNlQ2xhc3MgPSAweDAzLAkJCQlcCiAJLmJJbnRlcmZhY2VQcm90b2NvbCA9IDB4MDIsCQkJCVwKLQkuZHJpdmVyX2luZm8gPSBBVFBfICMjIHR5cGUsCQkJCVwKKwkuZHJpdmVyX2luZm8gPSAodW5zaWduZWQgbG9uZykgJmluZm8sCQkJXAogfQogCiAvKgpAQCAtNjIsNDMgKzEyMCwzOSBAQAogICogIEFjY29yZGluZyB0byBJbmZvLnBsaXN0IEdleXNlciBJViBpcyB0aGUgc2FtZSBhcyBHZXlzZXIgSUlJLikKICAqLwogCi1zdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgYXRwX3RhYmxlIFtdID0geworc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2lkIGF0cF90YWJsZVtdID0gewogCS8qIFBvd2VyQm9va3MgRmViIDIwMDUsIGlCb29rcyBHNCAqLwotCUFUUF9ERVZJQ0UoMHgwMjBlLCBGT1VOVEFJTiksCS8qIEZPVU5UQUlOIEFOU0kgKi8KLQlBVFBfREVWSUNFKDB4MDIwZiwgRk9VTlRBSU4pLAkvKiBGT1VOVEFJTiBJU08gKi8KLQlBVFBfREVWSUNFKDB4MDMwYSwgRk9VTlRBSU4pLAkvKiBGT1VOVEFJTiBUUCBPTkxZICovCi0JQVRQX0RFVklDRSgweDAzMGIsIEdFWVNFUjEpLAkvKiBHRVlTRVIgMSBUUCBPTkxZICovCisJQVRQX0RFVklDRSgweDAyMGUsIGZvdW50YWluX2luZm8pLAkvKiBGT1VOVEFJTiBBTlNJICovCisJQVRQX0RFVklDRSgweDAyMGYsIGZvdW50YWluX2luZm8pLAkvKiBGT1VOVEFJTiBJU08gKi8KKwlBVFBfREVWSUNFKDB4MDMwYSwgZm91bnRhaW5faW5mbyksCS8qIEZPVU5UQUlOIFRQIE9OTFkgKi8KKwlBVFBfREVWSUNFKDB4MDMwYiwgZ2V5c2VyMV9pbmZvKSwJLyogR0VZU0VSIDEgVFAgT05MWSAqLwogCiAJLyogUG93ZXJCb29rcyBPY3QgMjAwNSAqLwotCUFUUF9ERVZJQ0UoMHgwMjE0LCBHRVlTRVIyKSwJLyogR0VZU0VSIDIgQU5TSSAqLwotCUFUUF9ERVZJQ0UoMHgwMjE1LCBHRVlTRVIyKSwJLyogR0VZU0VSIDIgSVNPICovCi0JQVRQX0RFVklDRSgweDAyMTYsIEdFWVNFUjIpLAkvKiBHRVlTRVIgMiBKSVMgKi8KKwlBVFBfREVWSUNFKDB4MDIxNCwgZ2V5c2VyMl9pbmZvKSwJLyogR0VZU0VSIDIgQU5TSSAqLworCUFUUF9ERVZJQ0UoMHgwMjE1LCBnZXlzZXIyX2luZm8pLAkvKiBHRVlTRVIgMiBJU08gKi8KKwlBVFBfREVWSUNFKDB4MDIxNiwgZ2V5c2VyMl9pbmZvKSwJLyogR0VZU0VSIDIgSklTICovCiAKIAkvKiBDb3JlIER1byBNYWNCb29rICYgTWFjQm9vayBQcm8gKi8KLQlBVFBfREVWSUNFKDB4MDIxNywgR0VZU0VSMyksCS8qIEdFWVNFUiAzIEFOU0kgKi8KLQlBVFBfREVWSUNFKDB4MDIxOCwgR0VZU0VSMyksCS8qIEdFWVNFUiAzIElTTyAqLwotCUFUUF9ERVZJQ0UoMHgwMjE5LCBHRVlTRVIzKSwJLyogR0VZU0VSIDMgSklTICovCisJQVRQX0RFVklDRSgweDAyMTcsIGdleXNlcjNfaW5mbyksCS8qIEdFWVNFUiAzIEFOU0kgKi8KKwlBVFBfREVWSUNFKDB4MDIxOCwgZ2V5c2VyM19pbmZvKSwJLyogR0VZU0VSIDMgSVNPICovCisJQVRQX0RFVklDRSgweDAyMTksIGdleXNlcjNfaW5mbyksCS8qIEdFWVNFUiAzIEpJUyAqLwogCiAJLyogQ29yZTIgRHVvIE1hY0Jvb2sgJiBNYWNCb29rIFBybyAqLwotCUFUUF9ERVZJQ0UoMHgwMjFhLCBHRVlTRVI0KSwJLyogR0VZU0VSIDQgQU5TSSAqLwotCUFUUF9ERVZJQ0UoMHgwMjFiLCBHRVlTRVI0KSwJLyogR0VZU0VSIDQgSVNPICovCi0JQVRQX0RFVklDRSgweDAyMWMsIEdFWVNFUjQpLAkvKiBHRVlTRVIgNCBKSVMgKi8KKwlBVFBfREVWSUNFKDB4MDIxYSwgZ2V5c2VyNF9pbmZvKSwJLyogR0VZU0VSIDQgQU5TSSAqLworCUFUUF9ERVZJQ0UoMHgwMjFiLCBnZXlzZXI0X2luZm8pLAkvKiBHRVlTRVIgNCBJU08gKi8KKwlBVFBfREVWSUNFKDB4MDIxYywgZ2V5c2VyNF9pbmZvKSwJLyogR0VZU0VSIDQgSklTICovCiAKIAkvKiBDb3JlMiBEdW8gTWFjQm9vazMsMSAqLwotCUFUUF9ERVZJQ0UoMHgwMjI5LCBHRVlTRVI0KSwJLyogR0VZU0VSIDQgSEYgQU5TSSAqLwotCUFUUF9ERVZJQ0UoMHgwMjJhLCBHRVlTRVI0KSwJLyogR0VZU0VSIDQgSEYgSVNPICovCi0JQVRQX0RFVklDRSgweDAyMmIsIEdFWVNFUjQpLAkvKiBHRVlTRVIgNCBIRiBKSVMgKi8KKwlBVFBfREVWSUNFKDB4MDIyOSwgZ2V5c2VyNF9pbmZvKSwJLyogR0VZU0VSIDQgSEYgQU5TSSAqLworCUFUUF9ERVZJQ0UoMHgwMjJhLCBnZXlzZXI0X2luZm8pLAkvKiBHRVlTRVIgNCBIRiBJU08gKi8KKwlBVFBfREVWSUNFKDB4MDIyYiwgZ2V5c2VyNF9pbmZvKSwJLyogR0VZU0VSIDQgSEYgSklTICovCiAKIAkvKiBUZXJtaW5hdGluZyBlbnRyeSAqLwogCXsgfQogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUodXNiLCBhdHBfdGFibGUpOwogCi0vKgotICogbnVtYmVyIG9mIHNlbnNvcnMuIE5vdGUgdGhhdCBvbmx5IDE2IGluc3RlYWQgb2YgMjYgWCAoaG9yaXpvbnRhbCkKLSAqIHNlbnNvcnMgZXhpc3Qgb24gMTIiIGFuZCAxNSIgUG93ZXJCb29rcy4gQWxsIG1vZGVscyBoYXZlIDE2IFkKLSAqICh2ZXJ0aWNhbCkgc2Vuc29ycy4KLSAqLworLyogbWF4aW11bSBudW1iZXIgb2Ygc2Vuc29ycyAqLwogI2RlZmluZSBBVFBfWFNFTlNPUlMJMjYKICNkZWZpbmUgQVRQX1lTRU5TT1JTCTE2CiAKQEAgLTEwNywyMSArMTYxLDYgQEAKIAogLyogbWF4aW11bSBwcmVzc3VyZSB0aGlzIGRyaXZlciB3aWxsIHJlcG9ydCAqLwogI2RlZmluZSBBVFBfUFJFU1NVUkUJMzAwCi0vKgotICogbXVsdGlwbGljYXRpb24gZmFjdG9yIGZvciB0aGUgWCBhbmQgWSBjb29yZGluYXRlcy4KLSAqIFdlIHRyeSB0byBrZWVwIHRoZSB0b3VjaHBhZCBhc3BlY3QgcmF0aW8gd2hpbGUgc3RpbGwgZG9pbmcgb25seSBzaW1wbGUKLSAqIGFyaXRobWV0aWNzLgotICogVGhlIGZhY3RvcnMgYmVsb3cgZ2l2ZSBjb29yZGluYXRlcyBsaWtlOgotICoKLSAqICAgICAgMCA8PSB4IDwgIDk2MCBvbiAxMiIgYW5kIDE1IiBQb3dlcmJvb2tzCi0gKiAgICAgIDAgPD0geCA8IDE2MDAgb24gMTciIFBvd2VyYm9va3MgYW5kIDE3IiBNYWNCb29rIFBybwotICogICAgICAwIDw9IHggPCAxMjE2IG9uIE1hY0Jvb2tzIGFuZCAxNSIgTWFjQm9vayBQcm8KLSAqCi0gKiAgICAgIDAgPD0geSA8ICA2NDYgb24gYWxsIFBvd2VyYm9va3MKLSAqICAgICAgMCA8PSB5IDwgIDc3NCBvbiBhbGwgTWFjQm9va3MKLSAqLwotI2RlZmluZSBBVFBfWEZBQ1QJNjQKLSNkZWZpbmUgQVRQX1lGQUNUCTQzCiAKIC8qCiAgKiBUaHJlc2hvbGQgZm9yIHRoZSB0b3VjaHBhZCBzZW5zb3JzLiBBbnkgY2hhbmdlIGxlc3MgdGhhbiBBVFBfVEhSRVNIT0xEIGlzCkBAIC0xNTksNyArMTk4LDcgQEAKIAlzdHJ1Y3QgdXJiCQkqdXJiOwkJLyogdXNiIHJlcXVlc3QgYmxvY2sgKi8KIAl1OAkJCSpkYXRhOwkJLyogdHJhbnNmZXJyZWQgZGF0YSAqLwogCXN0cnVjdCBpbnB1dF9kZXYJKmlucHV0OwkJLyogaW5wdXQgZGV2ICovCi0JZW51bSBhdHBfdG91Y2hwYWRfdHlwZQl0eXBlOwkJLyogdHlwZSBvZiB0b3VjaHBhZCAqLworCWNvbnN0IHN0cnVjdCBhdHBfaW5mbwkqaW5mbzsJCS8qIHRvdWNocGFkIG1vZGVsICovCiAJYm9vbAkJCW9wZW47CiAJYm9vbAkJCXZhbGlkOwkJLyogYXJlIHRoZSBzYW1wbGVzIHZhbGlkPyAqLwogCWJvb2wJCQlzaXplX2RldGVjdF9kb25lOwpAQCAtMTY5LDcgKzIwOCw2IEBACiAJc2lnbmVkIGNoYXIJCXh5X2N1cltBVFBfWFNFTlNPUlMgKyBBVFBfWVNFTlNPUlNdOwogCXNpZ25lZCBjaGFyCQl4eV9vbGRbQVRQX1hTRU5TT1JTICsgQVRQX1lTRU5TT1JTXTsKIAlpbnQJCQl4eV9hY2NbQVRQX1hTRU5TT1JTICsgQVRQX1lTRU5TT1JTXTsKLQlpbnQJCQlkYXRhbGVuOwkvKiBzaXplIG9mIFVTQiB0cmFuc2ZlciAqLwogCWludAkJCWlkbGVjb3VudDsJLyogbnVtYmVyIG9mIGVtcHR5IHBhY2tldHMgKi8KIAlzdHJ1Y3Qgd29ya19zdHJ1Y3QJd29yazsKIH07CkBAIC0zNTksNyArMzk3LDcgQEAKIAkJaWYgKCFkZXYtPm92ZXJmbG93X3dhcm5lZCkgewogCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiYXBwbGV0b3VjaDogT1ZFUkZMT1cgd2l0aCBkYXRhICIKIAkJCQkibGVuZ3RoICVkLCBhY3R1YWwgbGVuZ3RoIGlzICVkXG4iLAotCQkJCWRldi0+ZGF0YWxlbiwgZGV2LT51cmItPmFjdHVhbF9sZW5ndGgpOworCQkJCWRldi0+aW5mby0+ZGF0YWxlbiwgZGV2LT51cmItPmFjdHVhbF9sZW5ndGgpOwogCQkJZGV2LT5vdmVyZmxvd193YXJuZWQgPSB0cnVlOwogCQl9CiAJY2FzZSAtRUNPTk5SRVNFVDoKQEAgLTM3Nyw3ICs0MTUsNyBAQAogCX0KIAogCS8qIGRyb3AgaW5jb21wbGV0ZSBkYXRhc2V0cyAqLwotCWlmIChkZXYtPnVyYi0+YWN0dWFsX2xlbmd0aCAhPSBkZXYtPmRhdGFsZW4pIHsKKwlpZiAoZGV2LT51cmItPmFjdHVhbF9sZW5ndGggIT0gZGV2LT5pbmZvLT5kYXRhbGVuKSB7CiAJCWRwcmludGsoImFwcGxldG91Y2g6IGluY29tcGxldGUgZGF0YSBwYWNrYWdlIgogCQkJIiAoZmlyc3QgYnl0ZTogJWQsIGxlbmd0aDogJWQpLlxuIiwKIAkJCWRldi0+ZGF0YVswXSwgZGV2LT51cmItPmFjdHVhbF9sZW5ndGgpOwpAQCAtMzg3LDYgKzQyNSwyNSBAQAogCXJldHVybiBBVFBfVVJCX1NUQVRVU19TVUNDRVNTOwogfQogCitzdGF0aWMgdm9pZCBhdHBfZGV0ZWN0X3NpemUoc3RydWN0IGF0cCAqZGV2KQoreworCWludCBpOworCisJLyogMTciIFBvd2VyYm9va3MgaGF2ZSBleHRyYSBYIHNlbnNvcnMgKi8KKwlmb3IgKGkgPSBkZXYtPmluZm8tPnhzZW5zb3JzOyBpIDwgQVRQX1hTRU5TT1JTOyBpKyspIHsKKwkJaWYgKGRldi0+eHlfY3VyW2ldKSB7CisKKwkJCXByaW50ayhLRVJOX0lORk8gImFwcGxldG91Y2g6IDE3XCIgbW9kZWwgZGV0ZWN0ZWQuXG4iKTsKKworCQkJaW5wdXRfc2V0X2Fic19wYXJhbXMoZGV2LT5pbnB1dCwgQUJTX1gsIDAsCisJCQkJCSAgICAgKGRldi0+aW5mby0+eHNlbnNvcnNfMTcgLSAxKSAqCisJCQkJCQkJZGV2LT5pbmZvLT54ZmFjdCAtIDEsCisJCQkJCSAgICAgQVRQX0ZVWlosIDApOworCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKIC8qCiAgKiBVU0IgaW50ZXJydXB0IGNhbGxiYWNrIGZ1bmN0aW9ucwogICovCkBAIC00MDcsNyArNDY0LDcgQEAKIAkJZ290byBleGl0OwogCiAJLyogcmVvcmRlciB0aGUgc2Vuc29ycyB2YWx1ZXMgKi8KLQlpZiAoZGV2LT50eXBlID09IEFUUF9HRVlTRVIyKSB7CisJaWYgKGRldi0+aW5mbyA9PSAmZ2V5c2VyMl9pbmZvKSB7CiAJCW1lbXNldChkZXYtPnh5X2N1ciwgMCwgc2l6ZW9mKGRldi0+eHlfY3VyKSk7CiAKIAkJLyoKQEAgLTQzNyw4ICs0OTQsOCBAQAogCQkJCWRldi0+eHlfY3VyW2kgKyAyNF0gPSBkZXYtPmRhdGFbNSAqIGkgKyA0NF07CiAKIAkJCS8qIFkgdmFsdWVzICovCi0JCQlkZXYtPnh5X2N1cltpICsgMjZdID0gZGV2LT5kYXRhWzUgKiBpICsgIDFdOwotCQkJZGV2LT54eV9jdXJbaSArIDM0XSA9IGRldi0+ZGF0YVs1ICogaSArICAzXTsKKwkJCWRldi0+eHlfY3VyW0FUUF9YU0VOU09SUyArIGldID0gZGV2LT5kYXRhWzUgKiBpICsgIDFdOworCQkJZGV2LT54eV9jdXJbQVRQX1hTRU5TT1JTICsgaSArIDhdID0gZGV2LT5kYXRhWzUgKiBpICsgM107CiAJCX0KIAl9CiAKQEAgLTQ1MywzMiArNTEwLDggQEAKIAkJbWVtY3B5KGRldi0+eHlfb2xkLCBkZXYtPnh5X2N1ciwgc2l6ZW9mKGRldi0+eHlfb2xkKSk7CiAKIAkJLyogUGVyZm9ybSBzaXplIGRldGVjdGlvbiwgaWYgbm90IGRvbmUgYWxyZWFkeSAqLwotCQlpZiAoIWRldi0+c2l6ZV9kZXRlY3RfZG9uZSkgewotCi0JCQkvKiAxNyIgUG93ZXJib29rcyBoYXZlIGV4dHJhIFggc2Vuc29ycyAqLwotCQkJZm9yIChpID0gKGRldi0+dHlwZSA9PSBBVFBfR0VZU0VSMiA/IDE1IDogMTYpOwotCQkJICAgICBpIDwgQVRQX1hTRU5TT1JTOyBpKyspIHsKLQkJCQlpZiAoIWRldi0+eHlfY3VyW2ldKQotCQkJCQljb250aW51ZTsKLQotCQkJCXByaW50ayhLRVJOX0lORk8KLQkJCQkJImFwcGxldG91Y2g6IDE3XCIgbW9kZWwgZGV0ZWN0ZWQuXG4iKTsKLQotCQkJCWlmIChkZXYtPnR5cGUgPT0gQVRQX0dFWVNFUjIpCi0JCQkJCWlucHV0X3NldF9hYnNfcGFyYW1zKGRldi0+aW5wdXQsIEFCU19YLAotCQkJCQkJCSAgICAgMCwKLQkJCQkJCQkgICAgICgyMCAtIDEpICoKLQkJCQkJCQkgICAgIEFUUF9YRkFDVCAtIDEsCi0JCQkJCQkJICAgICBBVFBfRlVaWiwgMCk7Ci0JCQkJZWxzZQotCQkJCQlpbnB1dF9zZXRfYWJzX3BhcmFtcyhkZXYtPmlucHV0LCBBQlNfWCwKLQkJCQkJCQkgICAgIDAsCi0JCQkJCQkJICAgICAoMjYgLSAxKSAqCi0JCQkJCQkJICAgICBBVFBfWEZBQ1QgLSAxLAotCQkJCQkJCSAgICAgQVRQX0ZVWlosIDApOwotCQkJCWJyZWFrOwotCQkJfQotCisJCWlmICh1bmxpa2VseSghZGV2LT5zaXplX2RldGVjdF9kb25lKSkgeworCQkJYXRwX2RldGVjdF9zaXplKGRldik7CiAJCQlkZXYtPnNpemVfZGV0ZWN0X2RvbmUgPSAxOwogCQkJZ290byBleGl0OwogCQl9CkBAIC00OTksMTAgKzUzMiwxMCBAQAogCWRiZ19kdW1wKCJhY2N1bXVsYXRvciIsIGRldi0+eHlfYWNjKTsKIAogCXggPSBhdHBfY2FsY3VsYXRlX2FicyhkZXYtPnh5X2FjYywgQVRQX1hTRU5TT1JTLAotCQkJICAgICAgQVRQX1hGQUNULCAmeF96LCAmeF9mKTsKKwkJCSAgICAgIGRldi0+aW5mby0+eGZhY3QsICZ4X3osICZ4X2YpOwogCXkgPSBhdHBfY2FsY3VsYXRlX2FicyhkZXYtPnh5X2FjYyArIEFUUF9YU0VOU09SUywgQVRQX1lTRU5TT1JTLAotCQkJICAgICAgQVRQX1lGQUNULCAmeV96LCAmeV9mKTsKLQlrZXkgPSBkZXYtPmRhdGFbZGV2LT5kYXRhbGVuIC0gMV0gJiBBVFBfU1RBVFVTX0JVVFRPTjsKKwkJCSAgICAgIGRldi0+aW5mby0+eWZhY3QsICZ5X3osICZ5X2YpOworCWtleSA9IGRldi0+ZGF0YVtkZXYtPmluZm8tPmRhdGFsZW4gLSAxXSAmIEFUUF9TVEFUVVNfQlVUVE9OOwogCiAJaWYgKHggJiYgeSkgewogCQlpZiAoZGV2LT54X29sZCAhPSAtMSkgewpAQCAtNTgzLDcgKzYxNiw3IEBACiAJZGJnX2R1bXAoInNhbXBsZSIsIGRldi0+eHlfY3VyKTsKIAogCS8qIEp1c3QgdXBkYXRlIHRoZSBiYXNlIHZhbHVlcyAoaS5lLiB0b3VjaHBhZCBpbiB1bnRvdWNoZWQgc3RhdGUpICovCi0JaWYgKGRldi0+ZGF0YVtkZXYtPmRhdGFsZW4gLSAxXSAmIEFUUF9TVEFUVVNfQkFTRV9VUERBVEUpIHsKKwlpZiAoZGV2LT5kYXRhW2Rldi0+aW5mby0+ZGF0YWxlbiAtIDFdICYgQVRQX1NUQVRVU19CQVNFX1VQREFURSkgewogCiAJCWRwcmludGsoS0VSTl9ERUJVRyAiYXBwbGV0b3VjaDogdXBkYXRlZCBiYXNlIHZhbHVlc1xuIik7CiAKQEAgLTYxMCwxMCArNjQzLDEwIEBACiAJZGJnX2R1bXAoImFjY3VtdWxhdG9yIiwgZGV2LT54eV9hY2MpOwogCiAJeCA9IGF0cF9jYWxjdWxhdGVfYWJzKGRldi0+eHlfYWNjLCBBVFBfWFNFTlNPUlMsCi0JCQkgICAgICBBVFBfWEZBQ1QsICZ4X3osICZ4X2YpOworCQkJICAgICAgZGV2LT5pbmZvLT54ZmFjdCwgJnhfeiwgJnhfZik7CiAJeSA9IGF0cF9jYWxjdWxhdGVfYWJzKGRldi0+eHlfYWNjICsgQVRQX1hTRU5TT1JTLCBBVFBfWVNFTlNPUlMsCi0JCQkgICAgICBBVFBfWUZBQ1QsICZ5X3osICZ5X2YpOwotCWtleSA9IGRldi0+ZGF0YVtkZXYtPmRhdGFsZW4gLSAxXSAmIEFUUF9TVEFUVVNfQlVUVE9OOworCQkJICAgICAgZGV2LT5pbmZvLT55ZmFjdCwgJnlfeiwgJnlfZik7CisJa2V5ID0gZGV2LT5kYXRhW2Rldi0+aW5mby0+ZGF0YWxlbiAtIDFdICYgQVRQX1NUQVRVU19CVVRUT047CiAKIAlpZiAoeCAmJiB5KSB7CiAJCWlmIChkZXYtPnhfb2xkICE9IC0xKSB7CkBAIC03MDUsNyArNzM4LDcgQEAKIHsKIAlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IGRldi0+dWRldjsKIAotCWlmIChkZXYtPnR5cGUgIT0gQVRQX0ZPVU5UQUlOKSB7CisJaWYgKGRldi0+aW5mbyAhPSAmZm91bnRhaW5faW5mbykgewogCQkvKiBzd2l0Y2ggdG8gcmF3IHNlbnNvciBtb2RlICovCiAJCWlmIChhdHBfZ2V5c2VyX2luaXQodWRldikpCiAJCQlyZXR1cm4gLUVJTzsKQEAgLTcyNiw2ICs3NTksNyBAQAogCXN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZW5kcG9pbnQ7CiAJaW50IGludF9pbl9lbmRwb2ludEFkZHIgPSAwOwogCWludCBpLCBlcnJvciA9IC1FTk9NRU07CisJY29uc3Qgc3RydWN0IGF0cF9pbmZvICppbmZvID0gKGNvbnN0IHN0cnVjdCBhdHBfaW5mbyAqKWlkLT5kcml2ZXJfaW5mbzsKIAogCS8qIHNldCB1cCB0aGUgZW5kcG9pbnQgaW5mb3JtYXRpb24gKi8KIAkvKiB1c2Ugb25seSB0aGUgZmlyc3QgaW50ZXJydXB0LWluIGVuZHBvaW50ICovCkBAIC03NTMsMzUgKzc4NywyMiBAQAogCiAJZGV2LT51ZGV2ID0gdWRldjsKIAlkZXYtPmlucHV0ID0gaW5wdXRfZGV2OwotCWRldi0+dHlwZSA9IGlkLT5kcml2ZXJfaW5mbzsKKwlkZXYtPmluZm8gPSBpbmZvOwogCWRldi0+b3ZlcmZsb3dfd2FybmVkID0gZmFsc2U7Ci0JaWYgKGRldi0+dHlwZSA9PSBBVFBfRk9VTlRBSU4gfHwgZGV2LT50eXBlID09IEFUUF9HRVlTRVIxKQotCQlkZXYtPmRhdGFsZW4gPSA4MTsKLQllbHNlCi0JCWRldi0+ZGF0YWxlbiA9IDY0OwogCiAJZGV2LT51cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOwogCWlmICghZGV2LT51cmIpCiAJCWdvdG8gZXJyX2ZyZWVfZGV2czsKIAotCWRldi0+ZGF0YSA9IHVzYl9idWZmZXJfYWxsb2MoZGV2LT51ZGV2LCBkZXYtPmRhdGFsZW4sIEdGUF9LRVJORUwsCisJZGV2LT5kYXRhID0gdXNiX2J1ZmZlcl9hbGxvYyhkZXYtPnVkZXYsIGRldi0+aW5mby0+ZGF0YWxlbiwgR0ZQX0tFUk5FTCwKIAkJCQkgICAgICZkZXYtPnVyYi0+dHJhbnNmZXJfZG1hKTsKIAlpZiAoIWRldi0+ZGF0YSkKIAkJZ290byBlcnJfZnJlZV91cmI7CiAKLQkvKiBTZWxlY3QgdGhlIFVTQiBjb21wbGV0ZSAoY2FsbGJhY2spIGZ1bmN0aW9uICovCi0JaWYgKGRldi0+dHlwZSA9PSBBVFBfRk9VTlRBSU4gfHwKLQkgICAgZGV2LT50eXBlID09IEFUUF9HRVlTRVIxIHx8Ci0JICAgIGRldi0+dHlwZSA9PSBBVFBfR0VZU0VSMikKLQkJdXNiX2ZpbGxfaW50X3VyYihkZXYtPnVyYiwgdWRldiwKLQkJCQkgdXNiX3JjdmludHBpcGUodWRldiwgaW50X2luX2VuZHBvaW50QWRkciksCi0JCQkJIGRldi0+ZGF0YSwgZGV2LT5kYXRhbGVuLAotCQkJCSBhdHBfY29tcGxldGVfZ2V5c2VyXzFfMiwgZGV2LCAxKTsKLQllbHNlCi0JCXVzYl9maWxsX2ludF91cmIoZGV2LT51cmIsIHVkZXYsCi0JCQkJIHVzYl9yY3ZpbnRwaXBlKHVkZXYsIGludF9pbl9lbmRwb2ludEFkZHIpLAotCQkJCSBkZXYtPmRhdGEsIGRldi0+ZGF0YWxlbiwKLQkJCQkgYXRwX2NvbXBsZXRlX2dleXNlcl8zXzQsIGRldiwgMSk7CisJdXNiX2ZpbGxfaW50X3VyYihkZXYtPnVyYiwgdWRldiwKKwkJCSB1c2JfcmN2aW50cGlwZSh1ZGV2LCBpbnRfaW5fZW5kcG9pbnRBZGRyKSwKKwkJCSBkZXYtPmRhdGEsIGRldi0+aW5mby0+ZGF0YWxlbiwKKwkJCSBkZXYtPmluZm8tPmNhbGxiYWNrLCBkZXYsIDEpOwogCiAJZXJyb3IgPSBhdHBfaGFuZGxlX2dleXNlcihkZXYpOwogCWlmIChlcnJvcikKQEAgLTgwMiwzNSArODIzLDEyIEBACiAKIAlzZXRfYml0KEVWX0FCUywgaW5wdXRfZGV2LT5ldmJpdCk7CiAKLQlpZiAoZGV2LT50eXBlID09IEFUUF9HRVlTRVIzIHx8IGRldi0+dHlwZSA9PSBBVFBfR0VZU0VSNCkgewotCQkvKgotCQkgKiBNYWNCb29rIGhhdmUgMjAgWCBzZW5zb3JzLCAxMCBZIHNlbnNvcnMKLQkJICovCi0JCWlucHV0X3NldF9hYnNfcGFyYW1zKGlucHV0X2RldiwgQUJTX1gsIDAsCi0JCQkJICAgICAoKDIwIC0gMSkgKiBBVFBfWEZBQ1QpIC0gMSwgQVRQX0ZVWlosIDApOwotCQlpbnB1dF9zZXRfYWJzX3BhcmFtcyhpbnB1dF9kZXYsIEFCU19ZLCAwLAotCQkJCSAgICAgKCgxMCAtIDEpICogQVRQX1lGQUNUKSAtIDEsIEFUUF9GVVpaLCAwKTsKLQl9IGVsc2UgaWYgKGRldi0+dHlwZSA9PSBBVFBfR0VZU0VSMikgewotCQkvKgotCQkgKiBPY3QgMjAwNSAxNSIgUG93ZXJCb29rcyBoYXZlIDE1IFggc2Vuc29ycywgMTciIGFyZSBkZXRlY3RlZAotCQkgKiBsYXRlci4KLQkJICovCi0JCWlucHV0X3NldF9hYnNfcGFyYW1zKGlucHV0X2RldiwgQUJTX1gsIDAsCi0JCQkJICAgICAoKDE1IC0gMSkgKiBBVFBfWEZBQ1QpIC0gMSwgQVRQX0ZVWlosIDApOwotCQlpbnB1dF9zZXRfYWJzX3BhcmFtcyhpbnB1dF9kZXYsIEFCU19ZLCAwLAotCQkJCSAgICAgKCg5IC0gMSkgKiBBVFBfWUZBQ1QpIC0gMSwgQVRQX0ZVWlosIDApOwotCX0gZWxzZSB7Ci0JCS8qCi0JCSAqIDEyIiBhbmQgMTUiIFBvd2VyYm9va3Mgb25seSBoYXZlIDE2IHggc2Vuc29ycywKLQkJICogMTciIG1vZGVscyBhcmUgZGV0ZWN0ZWQgbGF0ZXIuCi0JCSAqLwotCQlpbnB1dF9zZXRfYWJzX3BhcmFtcyhpbnB1dF9kZXYsIEFCU19YLCAwLAotCQkJCSAgICAgKDE2IC0gMSkgKiBBVFBfWEZBQ1QgLSAxLAotCQkJCSAgICAgQVRQX0ZVWlosIDApOwotCQlpbnB1dF9zZXRfYWJzX3BhcmFtcyhpbnB1dF9kZXYsIEFCU19ZLCAwLAotCQkJCSAgICAgKEFUUF9ZU0VOU09SUyAtIDEpICogQVRQX1lGQUNUIC0gMSwKLQkJCQkgICAgIEFUUF9GVVpaLCAwKTsKLQl9CisJaW5wdXRfc2V0X2Fic19wYXJhbXMoaW5wdXRfZGV2LCBBQlNfWCwgMCwKKwkJCSAgICAgKGRldi0+aW5mby0+eHNlbnNvcnMgLSAxKSAqIGRldi0+aW5mby0+eGZhY3QgLSAxLAorCQkJICAgICBBVFBfRlVaWiwgMCk7CisJaW5wdXRfc2V0X2Fic19wYXJhbXMoaW5wdXRfZGV2LCBBQlNfWSwgMCwKKwkJCSAgICAgKGRldi0+aW5mby0+eXNlbnNvcnMgLSAxKSAqIGRldi0+aW5mby0+eWZhY3QgLSAxLAorCQkJICAgICBBVFBfRlVaWiwgMCk7CiAJaW5wdXRfc2V0X2Fic19wYXJhbXMoaW5wdXRfZGV2LCBBQlNfUFJFU1NVUkUsIDAsIEFUUF9QUkVTU1VSRSwgMCwgMCk7CiAKIAlzZXRfYml0KEVWX0tFWSwgaW5wdXRfZGV2LT5ldmJpdCk7CkBAIC04NTIsNyArODUwLDcgQEAKIAlyZXR1cm4gMDsKIAogIGVycl9mcmVlX2J1ZmZlcjoKLQl1c2JfYnVmZmVyX2ZyZWUoZGV2LT51ZGV2LCBkZXYtPmRhdGFsZW4sCisJdXNiX2J1ZmZlcl9mcmVlKGRldi0+dWRldiwgZGV2LT5pbmZvLT5kYXRhbGVuLAogCQkJZGV2LT5kYXRhLCBkZXYtPnVyYi0+dHJhbnNmZXJfZG1hKTsKICBlcnJfZnJlZV91cmI6CiAJdXNiX2ZyZWVfdXJiKGRldi0+dXJiKTsKQEAgLTg3MSw3ICs4NjksNyBAQAogCWlmIChkZXYpIHsKIAkJdXNiX2tpbGxfdXJiKGRldi0+dXJiKTsKIAkJaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2UoZGV2LT5pbnB1dCk7Ci0JCXVzYl9idWZmZXJfZnJlZShkZXYtPnVkZXYsIGRldi0+ZGF0YWxlbiwKKwkJdXNiX2J1ZmZlcl9mcmVlKGRldi0+dWRldiwgZGV2LT5pbmZvLT5kYXRhbGVuLAogCQkJCWRldi0+ZGF0YSwgZGV2LT51cmItPnRyYW5zZmVyX2RtYSk7CiAJCXVzYl9mcmVlX3VyYihkZXYtPnVyYik7CiAJCWtmcmVlKGRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L21vdXNlL2dwaW9fbW91c2UuYyBiL2RyaXZlcnMvaW5wdXQvbW91c2UvZ3Bpb19tb3VzZS5jCmluZGV4IDcyY2Y1ZTMuLjBkYjhkMTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvbW91c2UvZ3Bpb19tb3VzZS5jCisrKyBiL2RyaXZlcnMvaW5wdXQvbW91c2UvZ3Bpb19tb3VzZS5jCkBAIC0xNzMsNyArMTczLDcgQEAKIC8qIHdvcmsgd2l0aCBob3RwbHVnIGFuZCBjb2xkcGx1ZyAqLwogTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTpncGlvX21vdXNlIik7CiAKLXN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgZ3Bpb19tb3VzZV9kZXZpY2VfZHJpdmVyID0geworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgZ3Bpb19tb3VzZV9kZXZpY2VfZHJpdmVyID0gewogCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoZ3Bpb19tb3VzZV9yZW1vdmUpLAogCS5kcml2ZXIJCT0gewogCQkubmFtZQk9ICJncGlvX21vdXNlIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvbW91c2UvaGdway5jIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9oZ3BrLmMKaW5kZXggODhmMDRiZi4uODFlNmViZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9tb3VzZS9oZ3BrLmMKKysrIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9oZ3BrLmMKQEAgLTQ4LDYgKzQ4LDMwIEBACiBNT0RVTEVfUEFSTV9ERVNDKHJlY2FsaWJfZGVsdGEsCiAJInBhY2tldHMgY29udGFpbmluZyBhIGRlbHRhIHRoaXMgbGFyZ2Ugd2lsbCBjYXVzZSBhIHJlY2FsaWJyYXRpb24uIik7CiAKK3N0YXRpYyBpbnQganVtcHlfZGVsYXkgPSAxMDAwOworbW9kdWxlX3BhcmFtKGp1bXB5X2RlbGF5LCBpbnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhqdW1weV9kZWxheSwKKwkiZGVsYXkgKG1zKSBiZWZvcmUgcmVjYWwgYWZ0ZXIganVtcGluZXNzIGRldGVjdGVkIik7CisKK3N0YXRpYyBpbnQgc3Bld19kZWxheSA9IDEwMDA7Cittb2R1bGVfcGFyYW0oc3Bld19kZWxheSwgaW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0Moc3Bld19kZWxheSwKKwkiZGVsYXkgKG1zKSBiZWZvcmUgcmVjYWwgYWZ0ZXIgcGFja2V0IHNwZXcgZGV0ZWN0ZWQiKTsKKworc3RhdGljIGludCByZWNhbF9ndWFyZF90aW1lID0gMjAwMDsKK21vZHVsZV9wYXJhbShyZWNhbF9ndWFyZF90aW1lLCBpbnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhyZWNhbF9ndWFyZF90aW1lLAorCSJpbnRlcnZhbCAobXMpIGR1cmluZyB3aGljaCByZWNhbCB3aWxsIGJlIHJlc3RhcnRlZCBpZiBwYWNrZXQgcmVjZWl2ZWQiKTsKKworc3RhdGljIGludCBwb3N0X2ludGVycnVwdF9kZWxheSA9IDEwMDA7Cittb2R1bGVfcGFyYW0ocG9zdF9pbnRlcnJ1cHRfZGVsYXksIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKHBvc3RfaW50ZXJydXB0X2RlbGF5LAorCSJkZWxheSAobXMpIGJlZm9yZSByZWNhbCBhZnRlciByZWNhbCBpbnRlcnJ1cHQgZGV0ZWN0ZWQiKTsKKworc3RhdGljIGludCBhdXRvcmVjYWwgPSAxOworbW9kdWxlX3BhcmFtKGF1dG9yZWNhbCwgaW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoYXV0b3JlY2FsLCAiZW5hYmxlIHJlY2FsaWJyYXRpb24gaW4gdGhlIGRyaXZlciIpOworCiAvKgogICogV2hlbiB0aGUgdG91Y2hwYWQgZ2V0cyB1bHRyYS1zZW5zaXRpdmUsIG9uZSBjYW4ga2VlcCB0aGVpciBmaW5nZXIgMS8yIgogICogYWJvdmUgdGhlIHBhZCBhbmQgc3RpbGwgaGF2ZSBpdCBzZW5kIHBhY2tldHMuICBUaGlzIGNhdXNlcyBhIGp1bXAgY3Vyc29yCkBAIC02Niw3ICs5MCw3IEBACiAJCS8qIE15IGNhciBnZXRzIGZvcnR5IHJvZHMgdG8gdGhlIGhvZ3NoZWFkIGFuZCB0aGF0J3MgdGhlCiAJCSAqIHdheSBJIGxpa2VzIGl0ISAqLwogCQlwc21vdXNlX3F1ZXVlX3dvcmsocHNtb3VzZSwgJnByaXYtPnJlY2FsaWJfd3EsCi0JCQkJbXNlY3NfdG9famlmZmllcygxMDAwKSk7CisJCQkJbXNlY3NfdG9famlmZmllcyhqdW1weV9kZWxheSkpOwogCX0KIH0KIApAQCAtMTAzLDcgKzEyNyw3IEBACiAJCQloZ3BrX2RiZyhwc21vdXNlLCAicGFja2V0IHNwZXcgZGV0ZWN0ZWQgKCVkLCVkKVxuIiwKIAkJCQkgcHJpdi0+eF90YWxseSwgcHJpdi0+eV90YWxseSk7CiAJCQlwc21vdXNlX3F1ZXVlX3dvcmsocHNtb3VzZSwgJnByaXYtPnJlY2FsaWJfd3EsCi0JCQkJCSAgIG1zZWNzX3RvX2ppZmZpZXMoMTAwMCkpOworCQkJCQkgICBtc2Vjc190b19qaWZmaWVzKHNwZXdfZGVsYXkpKTsKIAkJfQogCQkvKiByZXNldCBldmVyeSAxMDAgcGFja2V0cyAqLwogCQlwcml2LT5jb3VudCA9IDA7CkBAIC0xODEsNyArMjA1LDcgQEAKIAkJCQkgInBhY2tldCBpbnNpZGUgY2FsaWJyYXRpb24gd2luZG93LCAiCiAJCQkJICJxdWV1ZWluZyBhbm90aGVyIHJlY2FsaWJyYXRpb25cbiIpOwogCQkJcHNtb3VzZV9xdWV1ZV93b3JrKHBzbW91c2UsICZwcml2LT5yZWNhbGliX3dxLAotCQkJCQltc2Vjc190b19qaWZmaWVzKDEwMDApKTsKKwkJCQkJbXNlY3NfdG9famlmZmllcyhwb3N0X2ludGVycnVwdF9kZWxheSkpOwogCQl9CiAJCXByaXYtPnJlY2FsaWJfd2luZG93ID0gMDsKIAl9CkBAIC0yMzEsNyArMjU1LDcgQEAKIAkgKiBJZiBzb21lb25lJ3MgZmluZ2VyICp3YXMqIG9uIHRoZSB0b3VjaHBhZCwgaXQncyBwcm9iYWJseQogCSAqIG1pc2NhbGlicmF0ZWQuICBTbywgd2Ugc2hvdWxkIHNjaGVkdWxlIGFub3RoZXIgcmVjYWxpYnJhdGlvbgogCSAqLwotCXByaXYtPnJlY2FsaWJfd2luZG93ID0gamlmZmllcyArICBtc2Vjc190b19qaWZmaWVzKDIwMDApOworCXByaXYtPnJlY2FsaWJfd2luZG93ID0gamlmZmllcyArICBtc2Vjc190b19qaWZmaWVzKHJlY2FsX2d1YXJkX3RpbWUpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L21vdXNlL2hpbF9wdHIuYyBiL2RyaXZlcnMvaW5wdXQvbW91c2UvaGlsX3B0ci5jCmluZGV4IGU1MzJjNDguLjMyNjNjZTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvbW91c2UvaGlsX3B0ci5jCisrKyBiL2RyaXZlcnMvaW5wdXQvbW91c2UvaGlsX3B0ci5jCkBAIC00Niw3ICs0Niw3IEBACiBNT0RVTEVfQVVUSE9SKCJCcmlhbiBTLiBKdWxpbiA8YnJpQGNhbHl4LmNvbT4iKTsKIE1PRFVMRV9ERVNDUklQVElPTihISUxfR0VORVJJQ19OQU1FICIgZHJpdmVyIik7CiBNT0RVTEVfTElDRU5TRSgiRHVhbCBCU0QvR1BMIik7Ci0KK01PRFVMRV9BTElBUygic2VyaW86dHkwM3ByMjVpZDBGZXgqIik7CiAKICNkZWZpbmUgVEFCTEVUX1NJTVVMQVRFU19NT1VTRQkvKiBhbGxvdyB0YWJsZXQgdG8gYmUgdXNlZCBhcyBtb3VzZSAqLwogI3VuZGVmICBUQUJMRVRfQVVUT0FESlVTVAkvKiBhdXRvLWFkanVzdCB2YWxpZCB0YWJsZXQgcmFuZ2VzICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L21vdXNlL3B4YTkzMF90cmtiYWxsLmMgYi9kcml2ZXJzL2lucHV0L21vdXNlL3B4YTkzMF90cmtiYWxsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDI5N2FjYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaW5wdXQvbW91c2UvcHhhOTMwX3Rya2JhbGwuYwpAQCAtMCwwICsxLDI2OSBAQAorLyoKKyAqIFBYQTkzMCB0cmFjayBiYWxsIG1vdXNlIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNYXJ2ZWxsIEludGVybmF0aW9uYWwgTHRkLgorICogMjAwOC0wMi0yODogWW9uZyBZYW8gPHlhb3lvbmdAbWFydmVsbC5jb20+CisgKiAgICAgICAgICAgICBpbml0aWFsIHZlcnNpb24KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorCisjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPG1hY2gvcHhhOTMwX3Rya2JhbGwuaD4KKworLyogVHJhY2tiYWxsIENvbnRyb2xsZXIgUmVnaXN0ZXIgRGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgVEJDUgkJKDB4MDAwQykKKyNkZWZpbmUgVEJDTlRSCQkoMHgwMDEwKQorI2RlZmluZSBUQlNCQwkJKDB4MDAxNCkKKworI2RlZmluZSBUQkNSX1RCUlNUCSgxIDw8IDEpCisjZGVmaW5lIFRCQ1JfVEJTQgkoMSA8PCAxMCkKKworI2RlZmluZSBUQkNSX1lfRkxUKG4pCSgoKG4pICYgMHhmKSA8PCA2KQorI2RlZmluZSBUQkNSX1hfRkxUKG4pCSgoKG4pICYgMHhmKSA8PCAyKQorCisjZGVmaW5lIFRCQ05UUl9ZTShuKQkoKChuKSA+PiAyNCkgJiAweGZmKQorI2RlZmluZSBUQkNOVFJfWVAobikJKCgobikgPj4gMTYpICYgMHhmZikKKyNkZWZpbmUgVEJDTlRSX1hNKG4pCSgoKG4pID4+IDgpICYgMHhmZikKKyNkZWZpbmUgVEJDTlRSX1hQKG4pCSgobikgJiAweGZmKQorCisjZGVmaW5lIFRCU0JDX1RCU0JDCSgweDEpCisKK3N0cnVjdCBweGE5MzBfdHJrYmFsbCB7CisJc3RydWN0IHB4YTkzMF90cmtiYWxsX3BsYXRmb3JtX2RhdGEgKnBkYXRhOworCisJLyogTWVtb3J5IE1hcHBlZCBSZWdpc3RlciAqLworCXN0cnVjdCByZXNvdXJjZSAqbWVtOworCXZvaWQgX19pb21lbSAqbW1pb19iYXNlOworCisJc3RydWN0IGlucHV0X2RldiAqaW5wdXQ7Cit9OworCitzdGF0aWMgaXJxcmV0dXJuX3QgcHhhOTMwX3Rya2JhbGxfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3QgcHhhOTMwX3Rya2JhbGwgKnRya2JhbGwgPSBkZXZfaWQ7CisJc3RydWN0IGlucHV0X2RldiAqaW5wdXQgPSB0cmtiYWxsLT5pbnB1dDsKKwlpbnQgdGJjbnRyLCB4LCB5OworCisJLyogQWNjb3JkaW5nIHRvIHRoZSBzcGVjIHNvZnR3YXJlIG11c3QgcmVhZCBUQkNOVFIgdHdpY2U6CisJICogaWYgdGhlIHJlYWQgdmFsdWUgaXMgdGhlIHNhbWUsIHRoZSByZWFkaW5nIGlzIHZhbGlkCisJICovCisJdGJjbnRyID0gX19yYXdfcmVhZGwodHJrYmFsbC0+bW1pb19iYXNlICsgVEJDTlRSKTsKKworCWlmICh0YmNudHIgPT0gX19yYXdfcmVhZGwodHJrYmFsbC0+bW1pb19iYXNlICsgVEJDTlRSKSkgeworCQl4ID0gKFRCQ05UUl9YUCh0YmNudHIpIC0gVEJDTlRSX1hNKHRiY250cikpIC8gMjsKKwkJeSA9IChUQkNOVFJfWVAodGJjbnRyKSAtIFRCQ05UUl9ZTSh0YmNudHIpKSAvIDI7CisKKwkJaW5wdXRfcmVwb3J0X3JlbChpbnB1dCwgUkVMX1gsIHgpOworCQlpbnB1dF9yZXBvcnRfcmVsKGlucHV0LCBSRUxfWSwgeSk7CisJCWlucHV0X3N5bmMoaW5wdXQpOworCX0KKworCV9fcmF3X3dyaXRlbChUQlNCQ19UQlNCQywgdHJrYmFsbC0+bW1pb19iYXNlICsgVEJTQkMpOworCV9fcmF3X3dyaXRlbCgwLCB0cmtiYWxsLT5tbWlvX2Jhc2UgKyBUQlNCQyk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qIEZvciBUQkNSLCB3ZSBuZWVkIHRvIHdhaXQgZm9yIGEgd2hpbGUgdG8gbWFrZSBzdXJlIGl0IGhhcyBiZWVuIG1vZGlmaWVkLiAqLworc3RhdGljIGludCB3cml0ZV90YmNyKHN0cnVjdCBweGE5MzBfdHJrYmFsbCAqdHJrYmFsbCwgaW50IHYpCit7CisJaW50IGkgPSAxMDA7CisKKwlfX3Jhd193cml0ZWwodiwgdHJrYmFsbC0+bW1pb19iYXNlICsgVEJDUik7CisKKwl3aGlsZSAoaS0tKSB7CisJCWlmIChfX3Jhd19yZWFkbCh0cmtiYWxsLT5tbWlvX2Jhc2UgKyBUQkNSKSA9PSB2KQorCQkJYnJlYWs7CisJCW1zbGVlcCgxKTsKKwl9CisKKwlpZiAoaSA9PSAwKSB7CisJCXByX2VycigiJXM6IHRpbWVkIG91dCB3cml0aW5nIFRCQ1IoJXgpIVxuIiwgX19mdW5jX18sIHYpOworCQlyZXR1cm4gLUVUSU1FRE9VVDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcHhhOTMwX3Rya2JhbGxfY29uZmlnKHN0cnVjdCBweGE5MzBfdHJrYmFsbCAqdHJrYmFsbCkKK3sKKwl1aW50MzJfdCB0YmNyOworCisJLyogQWNjb3JkaW5nIHRvIHNwZWMsIG5lZWQgdG8gd3JpdGUgdGhlIGZpbHRlcnMgb2YgeCx5IHRvIDB4ZiBmaXJzdCEgKi8KKwl0YmNyID0gX19yYXdfcmVhZGwodHJrYmFsbC0+bW1pb19iYXNlICsgVEJDUik7CisJd3JpdGVfdGJjcih0cmtiYWxsLCB0YmNyIHwgVEJDUl9YX0ZMVCgweGYpIHwgVEJDUl9ZX0ZMVCgweGYpKTsKKwl3cml0ZV90YmNyKHRya2JhbGwsIFRCQ1JfWF9GTFQodHJrYmFsbC0+cGRhdGEtPnhfZmlsdGVyKSB8CisJCQkgICAgVEJDUl9ZX0ZMVCh0cmtiYWxsLT5wZGF0YS0+eV9maWx0ZXIpKTsKKworCS8qIEFjY29yZGluZyB0byBzcGVjLCBzZXQgVEJDUl9UQlJTVCBmaXJzdCwgYmVmb3JlIGNsZWFyaW5nIGl0ISAqLworCXRiY3IgPSBfX3Jhd19yZWFkbCh0cmtiYWxsLT5tbWlvX2Jhc2UgKyBUQkNSKTsKKwl3cml0ZV90YmNyKHRya2JhbGwsIHRiY3IgfCBUQkNSX1RCUlNUKTsKKwl3cml0ZV90YmNyKHRya2JhbGwsIHRiY3IgJiB+VEJDUl9UQlJTVCk7CisKKwlfX3Jhd193cml0ZWwoVEJTQkNfVEJTQkMsIHRya2JhbGwtPm1taW9fYmFzZSArIFRCU0JDKTsKKwlfX3Jhd193cml0ZWwoMCwgdHJrYmFsbC0+bW1pb19iYXNlICsgVEJTQkMpOworCisJcHJfZGVidWcoIiVzOiBmaW5hbCBUQkNSPSV4IVxuIiwgX19mdW5jX18sCisJCSBfX3Jhd19yZWFkbCh0cmtiYWxsLT5tbWlvX2Jhc2UgKyBUQkNSKSk7Cit9CisKK3N0YXRpYyBpbnQgcHhhOTMwX3Rya2JhbGxfb3BlbihzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYpCit7CisJc3RydWN0IHB4YTkzMF90cmtiYWxsICp0cmtiYWxsID0gaW5wdXRfZ2V0X2RydmRhdGEoZGV2KTsKKworCXB4YTkzMF90cmtiYWxsX2NvbmZpZyh0cmtiYWxsKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBweGE5MzBfdHJrYmFsbF9kaXNhYmxlKHN0cnVjdCBweGE5MzBfdHJrYmFsbCAqdHJrYmFsbCkKK3sKKwl1aW50MzJfdCB0YmNyID0gX19yYXdfcmVhZGwodHJrYmFsbC0+bW1pb19iYXNlICsgVEJDUik7CisKKwkvKiBIZWxkIGluIHJlc2V0LCBnYXRlIHRoZSAzMi1LSHogaW5wdXQgY2xvY2sgb2ZmICovCisJd3JpdGVfdGJjcih0cmtiYWxsLCB0YmNyIHwgVEJDUl9UQlJTVCk7Cit9CisKK3N0YXRpYyB2b2lkIHB4YTkzMF90cmtiYWxsX2Nsb3NlKHN0cnVjdCBpbnB1dF9kZXYgKmRldikKK3sKKwlzdHJ1Y3QgcHhhOTMwX3Rya2JhbGwgKnRya2JhbGwgPSBpbnB1dF9nZXRfZHJ2ZGF0YShkZXYpOworCisJcHhhOTMwX3Rya2JhbGxfZGlzYWJsZSh0cmtiYWxsKTsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgcHhhOTMwX3Rya2JhbGxfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgcHhhOTMwX3Rya2JhbGwgKnRya2JhbGw7CisJc3RydWN0IGlucHV0X2RldiAqaW5wdXQ7CisJc3RydWN0IHJlc291cmNlICpyZXM7CisJaW50IGlycSwgZXJyb3I7CisKKwlpcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOworCWlmIChpcnEgPCAwKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBnZXQgdHJrYmFsbCBpcnFcbiIpOworCQlyZXR1cm4gLUVOWElPOworCX0KKworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJaWYgKCFyZXMpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIGdldCByZWdpc3RlciBtZW1vcnlcbiIpOworCQlyZXR1cm4gLUVOWElPOworCX0KKworCXRya2JhbGwgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcHhhOTMwX3Rya2JhbGwpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXRya2JhbGwpCisJCXJldHVybiAtRU5PTUVNOworCisJdHJrYmFsbC0+cGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlpZiAoIXRya2JhbGwtPnBkYXRhKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIm5vIHBsYXRmb3JtIGRhdGEgZGVmaW5lZFxuIik7CisJCWVycm9yID0gLUVJTlZBTDsKKwkJZ290byBmYWlsZWQ7CisJfQorCisJdHJrYmFsbC0+bW1pb19iYXNlID0gaW9yZW1hcF9ub2NhY2hlKHJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzKSk7CisJaWYgKCF0cmtiYWxsLT5tbWlvX2Jhc2UpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIGlvcmVtYXAgcmVnaXN0ZXJzXG4iKTsKKwkJZXJyb3IgPSAtRU5YSU87CisJCWdvdG8gZmFpbGVkOworCX0KKworCS8qIGhlbGQgdGhlIG1vZHVsZSBpbiByZXNldCwgd2lsbCBiZSBlbmFibGVkIGluIG9wZW4oKSAqLworCXB4YTkzMF90cmtiYWxsX2Rpc2FibGUodHJrYmFsbCk7CisKKwllcnJvciA9IHJlcXVlc3RfaXJxKGlycSwgcHhhOTMwX3Rya2JhbGxfaW50ZXJydXB0LCBJUlFGX0RJU0FCTEVELAorCQkJICAgIHBkZXYtPm5hbWUsIHRya2JhbGwpOworCWlmIChlcnJvcikgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gcmVxdWVzdCBpcnE6ICVkXG4iLCBlcnJvcik7CisJCWdvdG8gZmFpbGVkX2ZyZWVfaW87CisJfQorCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgdHJrYmFsbCk7CisKKwlpbnB1dCA9IGlucHV0X2FsbG9jYXRlX2RldmljZSgpOworCWlmICghaW5wdXQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIGFsbG9jYXRlIGlucHV0IGRldmljZVxuIik7CisJCWVycm9yID0gLUVOT01FTTsKKwkJZ290byBmYWlsZWRfZnJlZV9pcnE7CisJfQorCisJaW5wdXQtPm5hbWUgPSBwZGV2LT5uYW1lOworCWlucHV0LT5pZC5idXN0eXBlID0gQlVTX0hPU1Q7CisJaW5wdXQtPm9wZW4gPSBweGE5MzBfdHJrYmFsbF9vcGVuOworCWlucHV0LT5jbG9zZSA9IHB4YTkzMF90cmtiYWxsX2Nsb3NlOworCWlucHV0LT5kZXYucGFyZW50ID0gJnBkZXYtPmRldjsKKwlpbnB1dF9zZXRfZHJ2ZGF0YShpbnB1dCwgdHJrYmFsbCk7CisKKwl0cmtiYWxsLT5pbnB1dCA9IGlucHV0OworCisJaW5wdXRfc2V0X2NhcGFiaWxpdHkoaW5wdXQsIEVWX1JFTCwgUkVMX1gpOworCWlucHV0X3NldF9jYXBhYmlsaXR5KGlucHV0LCBFVl9SRUwsIFJFTF9ZKTsKKworCWVycm9yID0gaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKGlucHV0KTsKKwlpZiAoZXJyb3IpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAidW5hYmxlIHRvIHJlZ2lzdGVyIGlucHV0IGRldmljZVxuIik7CisJCWdvdG8gZmFpbGVkX2ZyZWVfaW5wdXQ7CisJfQorCisJcmV0dXJuIDA7CisKK2ZhaWxlZF9mcmVlX2lucHV0OgorCWlucHV0X2ZyZWVfZGV2aWNlKGlucHV0KTsKK2ZhaWxlZF9mcmVlX2lycToKKwlmcmVlX2lycShpcnEsIHRya2JhbGwpOworZmFpbGVkX2ZyZWVfaW86CisJaW91bm1hcCh0cmtiYWxsLT5tbWlvX2Jhc2UpOworZmFpbGVkOgorCWtmcmVlKHRya2JhbGwpOworCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgcHhhOTMwX3Rya2JhbGxfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHB4YTkzMF90cmtiYWxsICp0cmtiYWxsID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJaW50IGlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7CisKKwlpbnB1dF91bnJlZ2lzdGVyX2RldmljZSh0cmtiYWxsLT5pbnB1dCk7CisJZnJlZV9pcnEoaXJxLCB0cmtiYWxsKTsKKwlpb3VubWFwKHRya2JhbGwtPm1taW9fYmFzZSk7CisJa2ZyZWUodHJrYmFsbCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgcHhhOTMwX3Rya2JhbGxfZHJpdmVyID0geworCS5kcml2ZXIJCT0geworCQkubmFtZQk9ICJweGE5MzAtdHJrYmFsbCIsCisJfSwKKwkucHJvYmUJCT0gcHhhOTMwX3Rya2JhbGxfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChweGE5MzBfdHJrYmFsbF9yZW1vdmUpLAorfTsKKworc3RhdGljIGludCBfX2luaXQgcHhhOTMwX3Rya2JhbGxfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnB4YTkzMF90cmtiYWxsX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBweGE5MzBfdHJrYmFsbF9leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnB4YTkzMF90cmtiYWxsX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHB4YTkzMF90cmtiYWxsX2luaXQpOworbW9kdWxlX2V4aXQocHhhOTMwX3Rya2JhbGxfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIllvbmcgWWFvIDx5YW95b25nQG1hcnZlbGwuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJQWEE5MzAgVHJhY2tiYWxsIE1vdXNlIERyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9tb3VzZS9zeW5hcHRpY3MuYyBiL2RyaXZlcnMvaW5wdXQvbW91c2Uvc3luYXB0aWNzLmMKaW5kZXggZDM0OWM0YTVlLi44NjVmYzY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L21vdXNlL3N5bmFwdGljcy5jCisrKyBiL2RyaXZlcnMvaW5wdXQvbW91c2Uvc3luYXB0aWNzLmMKQEAgLTQ0NSwxMiArNDQ1LDE0IEBACiAKIAlpbnB1dF9yZXBvcnRfYWJzKGRldiwgQUJTX1RPT0xfV0lEVEgsIGZpbmdlcl93aWR0aCk7CiAJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9UT09MX0ZJTkdFUiwgbnVtX2ZpbmdlcnMgPT0gMSk7Ci0JaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9UT09MX0RPVUJMRVRBUCwgbnVtX2ZpbmdlcnMgPT0gMik7Ci0JaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9UT09MX1RSSVBMRVRBUCwgbnVtX2ZpbmdlcnMgPT0gMyk7Ci0KIAlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX0xFRlQsIGh3LmxlZnQpOwogCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fUklHSFQsIGh3LnJpZ2h0KTsKIAorCWlmIChTWU5fQ0FQX01VTFRJRklOR0VSKHByaXYtPmNhcGFiaWxpdGllcykpIHsKKwkJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9UT09MX0RPVUJMRVRBUCwgbnVtX2ZpbmdlcnMgPT0gMik7CisJCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fVE9PTF9UUklQTEVUQVAsIG51bV9maW5nZXJzID09IDMpOworCX0KKwogCWlmIChTWU5fQ0FQX01JRERMRV9CVVRUT04ocHJpdi0+Y2FwYWJpbGl0aWVzKSkKIAkJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9NSURETEUsIGh3Lm1pZGRsZSk7CiAKQEAgLTU0MywxMiArNTQ1LDE0IEBACiAJc2V0X2JpdChFVl9LRVksIGRldi0+ZXZiaXQpOwogCXNldF9iaXQoQlROX1RPVUNILCBkZXYtPmtleWJpdCk7CiAJc2V0X2JpdChCVE5fVE9PTF9GSU5HRVIsIGRldi0+a2V5Yml0KTsKLQlzZXRfYml0KEJUTl9UT09MX0RPVUJMRVRBUCwgZGV2LT5rZXliaXQpOwotCXNldF9iaXQoQlROX1RPT0xfVFJJUExFVEFQLCBkZXYtPmtleWJpdCk7Ci0KIAlzZXRfYml0KEJUTl9MRUZULCBkZXYtPmtleWJpdCk7CiAJc2V0X2JpdChCVE5fUklHSFQsIGRldi0+a2V5Yml0KTsKIAorCWlmIChTWU5fQ0FQX01VTFRJRklOR0VSKHByaXYtPmNhcGFiaWxpdGllcykpIHsKKwkJc2V0X2JpdChCVE5fVE9PTF9ET1VCTEVUQVAsIGRldi0+a2V5Yml0KTsKKwkJc2V0X2JpdChCVE5fVE9PTF9UUklQTEVUQVAsIGRldi0+a2V5Yml0KTsKKwl9CisKIAlpZiAoU1lOX0NBUF9NSURETEVfQlVUVE9OKHByaXYtPmNhcGFiaWxpdGllcykpCiAJCXNldF9iaXQoQlROX01JRERMRSwgZGV2LT5rZXliaXQpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L21vdXNlZGV2LmMgYi9kcml2ZXJzL2lucHV0L21vdXNlZGV2LmMKaW5kZXggZDhjMDU2Zi4uZWY5OWE3ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9tb3VzZWRldi5jCisrKyBiL2RyaXZlcnMvaW5wdXQvbW91c2VkZXYuYwpAQCAtODc4LDggKzg3OCw3IEBACiAJbW91c2VkZXYtPmhhbmRsZS5oYW5kbGVyID0gaGFuZGxlcjsKIAltb3VzZWRldi0+aGFuZGxlLnByaXZhdGUgPSBtb3VzZWRldjsKIAotCXN0cmxjcHkobW91c2VkZXYtPmRldi5idXNfaWQsIG1vdXNlZGV2LT5uYW1lLAotCQlzaXplb2YobW91c2VkZXYtPmRldi5idXNfaWQpKTsKKwlkZXZfc2V0X25hbWUoJm1vdXNlZGV2LT5kZXYsIG1vdXNlZGV2LT5uYW1lKTsKIAltb3VzZWRldi0+ZGV2LmNsYXNzID0gJmlucHV0X2NsYXNzOwogCWlmIChkZXYpCiAJCW1vdXNlZGV2LT5kZXYucGFyZW50ID0gJmRldi0+ZGV2OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9zZXJpby9oaWxfbWxjLmMgYi9kcml2ZXJzL2lucHV0L3NlcmlvL2hpbF9tbGMuYwppbmRleCAzNzU4NmE2Li43YmE5ZjJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L3NlcmlvL2hpbF9tbGMuYworKysgYi9kcml2ZXJzL2lucHV0L3NlcmlvL2hpbF9tbGMuYwpAQCAtOTM0LDYgKzkzNCw3IEBACiAJCXNucHJpbnRmKG1sY19zZXJpby0+bmFtZSwgc2l6ZW9mKG1sY19zZXJpby0+bmFtZSktMSwgIkhJTF9TRVJJTyVkIiwgaSk7CiAJCXNucHJpbnRmKG1sY19zZXJpby0+cGh5cywgc2l6ZW9mKG1sY19zZXJpby0+cGh5cyktMSwgIkhJTCVkIiwgaSk7CiAJCW1sY19zZXJpby0+aWQJCQk9IGhpbF9tbGNfc2VyaW9faWQ7CisJCW1sY19zZXJpby0+aWQuaWQJCT0gaTsgLyogSElMIHBvcnQgbm8uICovCiAJCW1sY19zZXJpby0+d3JpdGUJCT0gaGlsX21sY19zZXJpb193cml0ZTsKIAkJbWxjX3NlcmlvLT5vcGVuCQkJPSBoaWxfbWxjX3NlcmlvX29wZW47CiAJCW1sY19zZXJpby0+Y2xvc2UJCT0gaGlsX21sY19zZXJpb19jbG9zZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvc2VyaW8vaTgwNDIteDg2aWE2NGlvLmggYi9kcml2ZXJzL2lucHV0L3NlcmlvL2k4MDQyLXg4NmlhNjRpby5oCmluZGV4IDI5ZTY4NjMuLjZmYTJkZWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvc2VyaW8vaTgwNDIteDg2aWE2NGlvLmgKKysrIGIvZHJpdmVycy9pbnB1dC9zZXJpby9pODA0Mi14ODZpYTY0aW8uaApAQCAtMTQzLDYgKzE0MywxNCBAQAogCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX1ZFUlNJT04sICJNNjA2IiksCiAJCX0sCiAJfSwKKwl7CisJCS5pZGVudCA9ICJHaWdhYnl0ZSBNOTEyIiwKKwkJLm1hdGNoZXMgPSB7CisJCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJHSUdBQllURSIpLAorCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJNOTEyIiksCisJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfVkVSU0lPTiwgIjAxIiksCisJCX0sCisJfSwKIAl7IH0KIH07CiAKQEAgLTM1MSw2ICszNTksMTMgQEAKIAkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiSEVMODBJIiksCiAJCX0sCiAJfSwKKwl7CisJCS5pZGVudCA9ICJEZWxsIFZvc3RybyAxNTEwIiwKKwkJLm1hdGNoZXMgPSB7CisJCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJEZWxsIEluYy4iKSwKKwkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiVm9zdHJvMTUxMCIpLAorCQl9LAorCX0sCiAJeyB9CiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L3NlcmlvL2xpYnBzMi5jIGIvZHJpdmVycy9pbnB1dC9zZXJpby9saWJwczIuYwppbmRleCAyYjMwNGMyLi42NzI0OGMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L3NlcmlvL2xpYnBzMi5jCisrKyBiL2RyaXZlcnMvaW5wdXQvc2VyaW8vbGlicHMyLmMKQEAgLTI2Miw5ICsyNjIsMTcgQEAKIAkJCWJyZWFrOwogCiAJCWNhc2UgUFMyX1JFVF9OQUs6Ci0JCQlwczJkZXYtPm5hayA9IDE7CisJCQlwczJkZXYtPmZsYWdzIHw9IFBTMl9GTEFHX05BSzsKKwkJCXBzMmRldi0+bmFrID0gUFMyX1JFVF9OQUs7CiAJCQlicmVhazsKIAorCQljYXNlIFBTMl9SRVRfRVJSOgorCQkJaWYgKHBzMmRldi0+ZmxhZ3MgJiBQUzJfRkxBR19OQUspIHsKKwkJCQlwczJkZXYtPmZsYWdzICY9IH5QUzJfRkxBR19OQUs7CisJCQkJcHMyZGV2LT5uYWsgPSBQUzJfUkVUX0VSUjsKKwkJCQlicmVhazsKKwkJCX0KKwogCQkvKgogCQkgKiBXb3JrYXJvdW5kIGZvciBtaWNlIHdoaWNoIGRvbid0IEFDSyB0aGUgR2V0IElEIGNvbW1hbmQuCiAJCSAqIFRoZXNlIGFyZSB2YWxpZCBtb3VzZSBJRHMgdGhhdCB3ZSByZWNvZ25pemUuCkBAIC0yODIsOCArMjkwLDExIEBACiAJfQogCiAKLQlpZiAoIXBzMmRldi0+bmFrICYmIHBzMmRldi0+Y21kY250KQotCQlwczJkZXYtPmZsYWdzIHw9IFBTMl9GTEFHX0NNRCB8IFBTMl9GTEFHX0NNRDE7CisJaWYgKCFwczJkZXYtPm5haykgeworCQlwczJkZXYtPmZsYWdzICY9IH5QUzJfRkxBR19OQUs7CisJCWlmIChwczJkZXYtPmNtZGNudCkKKwkJCXBzMmRldi0+ZmxhZ3MgfD0gUFMyX0ZMQUdfQ01EIHwgUFMyX0ZMQUdfQ01EMTsKKwl9CiAKIAlwczJkZXYtPmZsYWdzICY9IH5QUzJfRkxBR19BQ0s7CiAJd2FrZV91cCgmcHMyZGV2LT53YWl0KTsKQEAgLTMyOSw2ICszNDAsNyBAQAogCWlmIChwczJkZXYtPmZsYWdzICYgKFBTMl9GTEFHX0FDSyB8IFBTMl9GTEFHX0NNRCkpCiAJCXdha2VfdXAoJnBzMmRldi0+d2FpdCk7CiAKLQlwczJkZXYtPmZsYWdzID0gMDsKKwkvKiByZXNldCBhbGwgZmxhZ3MgZXhjZXB0IGxhc3QgbmFjayAqLworCXBzMmRldi0+ZmxhZ3MgJj0gUFMyX0ZMQUdfTkFLOwogfQogRVhQT1JUX1NZTUJPTChwczJfY21kX2Fib3J0ZWQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9zZXJpby9wY2lwczIuYyBiL2RyaXZlcnMvaW5wdXQvc2VyaW8vcGNpcHMyLmMKaW5kZXggMWI0MDRmOS4uMWRhY2JlMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9zZXJpby9wY2lwczIuYworKysgYi9kcml2ZXJzL2lucHV0L3NlcmlvL3BjaXBzMi5jCkBAIC0xNTMsNyArMTUzLDcgQEAKIAlzZXJpby0+b3BlbgkJPSBwY2lwczJfb3BlbjsKIAlzZXJpby0+Y2xvc2UJCT0gcGNpcHMyX2Nsb3NlOwogCXN0cmxjcHkoc2VyaW8tPm5hbWUsIHBjaV9uYW1lKGRldiksIHNpemVvZihzZXJpby0+bmFtZSkpOwotCXN0cmxjcHkoc2VyaW8tPnBoeXMsIGRldi0+ZGV2LmJ1c19pZCwgc2l6ZW9mKHNlcmlvLT5waHlzKSk7CisJc3RybGNweShzZXJpby0+cGh5cywgZGV2X25hbWUoJmRldi0+ZGV2KSwgc2l6ZW9mKHNlcmlvLT5waHlzKSk7CiAJc2VyaW8tPnBvcnRfZGF0YQk9IHBzMmlmOwogCXNlcmlvLT5kZXYucGFyZW50CT0gJmRldi0+ZGV2OwogCXBzMmlmLT5pbwkJPSBzZXJpbzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvc2VyaW8vc2VyaW8uYyBiL2RyaXZlcnMvaW5wdXQvc2VyaW8vc2VyaW8uYwppbmRleCAyZjEyZDYwLi5iYzAzMzI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L3NlcmlvL3NlcmlvLmMKKysrIGIvZHJpdmVycy9pbnB1dC9zZXJpby9zZXJpby5jCkBAIC01NDYsOCArNTQ2LDggQEAKIAlzcGluX2xvY2tfaW5pdCgmc2VyaW8tPmxvY2spOwogCW11dGV4X2luaXQoJnNlcmlvLT5kcnZfbXV0ZXgpOwogCWRldmljZV9pbml0aWFsaXplKCZzZXJpby0+ZGV2KTsKLQlzbnByaW50ZihzZXJpby0+ZGV2LmJ1c19pZCwgc2l6ZW9mKHNlcmlvLT5kZXYuYnVzX2lkKSwKLQkJICJzZXJpbyVsZCIsIChsb25nKWF0b21pY19pbmNfcmV0dXJuKCZzZXJpb19ubykgLSAxKTsKKwlkZXZfc2V0X25hbWUoJnNlcmlvLT5kZXYsICJzZXJpbyVsZCIsCisJCQkobG9uZylhdG9taWNfaW5jX3JldHVybigmc2VyaW9fbm8pIC0gMSk7CiAJc2VyaW8tPmRldi5idXMgPSAmc2VyaW9fYnVzOwogCXNlcmlvLT5kZXYucmVsZWFzZSA9IHNlcmlvX3JlbGVhc2VfcG9ydDsKIAlpZiAoc2VyaW8tPnBhcmVudCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9zZXJpby94aWxpbnhfcHMyLmMgYi9kcml2ZXJzL2lucHV0L3NlcmlvL3hpbGlueF9wczIuYwppbmRleCA3NjUwMDc4Li5lYmIyMmY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L3NlcmlvL3hpbGlueF9wczIuYworKysgYi9kcml2ZXJzL2lucHV0L3NlcmlvL3hpbGlueF9wczIuYwpAQCAtNTgsMjMgKzU4LDIwIEBACiAKIC8qIE1hc2sgZm9yIGFsbCB0aGUgUmVjZWl2ZSBJbnRlcnJ1cHRzICovCiAjZGVmaW5lIFhQUzJfSVBJWFJfUlhfQUxMCShYUFMyX0lQSVhSX1JYX09WRiB8IFhQUzJfSVBJWFJfUlhfRVJSIHwgIFwKLQkJCQkJWFBTMl9JUElYUl9SWF9GVUxMKQorCQkJCSBYUFMyX0lQSVhSX1JYX0ZVTEwpCiAKIC8qIE1hc2sgZm9yIGFsbCB0aGUgSW50ZXJydXB0cyAqLwogI2RlZmluZSBYUFMyX0lQSVhSX0FMTAkJKFhQUzJfSVBJWFJfVFhfQUxMIHwgWFBTMl9JUElYUl9SWF9BTEwgfCAgXAotCQkJCQlYUFMyX0lQSVhSX1dEVF9UT1VUKQorCQkJCSBYUFMyX0lQSVhSX1dEVF9UT1VUKQogCiAvKiBHbG9iYWwgSW50ZXJydXB0IEVuYWJsZSBtYXNrICovCiAjZGVmaW5lIFhQUzJfR0lFUl9HSUVfTUFTSwkweDgwMDAwMDAwCiAKIHN0cnVjdCB4cHMyZGF0YSB7CiAJaW50IGlycTsKLQl1MzIgcGh5c19hZGRyOwotCXUzMiByZW1hcF9zaXplOwogCXNwaW5sb2NrX3QgbG9jazsKLQl1OCByeGI7CQkJCS8qIFJ4IGJ1ZmZlciAqLwogCXZvaWQgX19pb21lbSAqYmFzZV9hZGRyZXNzOwkvKiB2aXJ0LiBhZGRyZXNzIG9mIGNvbnRyb2wgcmVnaXN0ZXJzICovCi0JdW5zaWduZWQgaW50IGRmbDsKKwl1bnNpZ25lZCBpbnQgZmxhZ3M7CiAJc3RydWN0IHNlcmlvIHNlcmlvOwkJLyogc2VyaW8gKi8KIH07CiAKQEAgLTgyLDggKzc5LDEzIEBACiAvKiBYUFMgUFMvMiBkYXRhIHRyYW5zbWlzc2lvbiBjYWxscyAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotLyoKLSAqIHhwczJfcmVjdigpIHdpbGwgYXR0ZW1wdCB0byByZWNlaXZlIGEgYnl0ZSBvZiBkYXRhIGZyb20gdGhlIFBTLzIgcG9ydC4KKy8qKgorICogeHBzMl9yZWN2KCkgLSBhdHRlbXB0cyB0byByZWNlaXZlIGEgYnl0ZSBmcm9tIHRoZSBQUy8yIHBvcnQuCisgKiBAZHJ2ZGF0YToJcG9pbnRlciB0byBwczIgZGV2aWNlIHByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUKKyAqIEBieXRlOglhZGRyZXNzIHdoZXJlIHRoZSByZWFkIGRhdGEgd2lsbCBiZSBjb3BpZWQKKyAqCisgKiBJZiB0aGVyZSBpcyBhbnkgZGF0YSBhdmFpbGFibGUgaW4gdGhlIFBTLzIgcmVjZWl2ZXIsIHRoaXMgZnVuY3Rpb25zIHJlYWRzCisgKiB0aGUgZGF0YSwgb3RoZXJ3aXNlIGl0IHJldHVybnMgZXJyb3IuCiAgKi8KIHN0YXRpYyBpbnQgeHBzMl9yZWN2KHN0cnVjdCB4cHMyZGF0YSAqZHJ2ZGF0YSwgdTggKmJ5dGUpCiB7CkBAIC0xMTYsMzMgKzExOCwyNyBAQAogCiAJLyogQ2hlY2sgd2hpY2ggaW50ZXJydXB0IGlzIGFjdGl2ZSAqLwogCWlmIChpbnRyX3NyICYgWFBTMl9JUElYUl9SWF9PVkYpCi0JCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiByZWNlaXZlIG92ZXJydW4gZXJyb3JcbiIsCi0JCQlkcnZkYXRhLT5zZXJpby5uYW1lKTsKKwkJZGV2X3dhcm4oZHJ2ZGF0YS0+c2VyaW8uZGV2LnBhcmVudCwgInJlY2VpdmUgb3ZlcnJ1biBlcnJvclxuIik7CiAKIAlpZiAoaW50cl9zciAmIFhQUzJfSVBJWFJfUlhfRVJSKQotCQlkcnZkYXRhLT5kZmwgfD0gU0VSSU9fUEFSSVRZOworCQlkcnZkYXRhLT5mbGFncyB8PSBTRVJJT19QQVJJVFk7CiAKIAlpZiAoaW50cl9zciAmIChYUFMyX0lQSVhSX1RYX05PQUNLIHwgWFBTMl9JUElYUl9XRFRfVE9VVCkpCi0JCWRydmRhdGEtPmRmbCB8PSBTRVJJT19USU1FT1VUOworCQlkcnZkYXRhLT5mbGFncyB8PSBTRVJJT19USU1FT1VUOwogCiAJaWYgKGludHJfc3IgJiBYUFMyX0lQSVhSX1JYX0ZVTEwpIHsKLQkJc3RhdHVzID0geHBzMl9yZWN2KGRydmRhdGEsICZkcnZkYXRhLT5yeGIpOworCQlzdGF0dXMgPSB4cHMyX3JlY3YoZHJ2ZGF0YSwgJmMpOwogCiAJCS8qIEVycm9yLCBpZiBhIGJ5dGUgaXMgbm90IHJlY2VpdmVkICovCiAJCWlmIChzdGF0dXMpIHsKLQkJCXByaW50ayhLRVJOX0VSUgotCQkJCSIlczogd3JvbmcgcmN2ZCBieXRlIGNvdW50ICglZClcbiIsCi0JCQkJZHJ2ZGF0YS0+c2VyaW8ubmFtZSwgc3RhdHVzKTsKKwkJCWRldl9lcnIoZHJ2ZGF0YS0+c2VyaW8uZGV2LnBhcmVudCwKKwkJCQkid3JvbmcgcmN2ZCBieXRlIGNvdW50ICglZClcbiIsIHN0YXR1cyk7CiAJCX0gZWxzZSB7Ci0JCQljID0gZHJ2ZGF0YS0+cnhiOwotCQkJc2VyaW9faW50ZXJydXB0KCZkcnZkYXRhLT5zZXJpbywgYywgZHJ2ZGF0YS0+ZGZsKTsKLQkJCWRydmRhdGEtPmRmbCA9IDA7CisJCQlzZXJpb19pbnRlcnJ1cHQoJmRydmRhdGEtPnNlcmlvLCBjLCBkcnZkYXRhLT5mbGFncyk7CisJCQlkcnZkYXRhLT5mbGFncyA9IDA7CiAJCX0KIAl9CiAKLQlpZiAoaW50cl9zciAmIFhQUzJfSVBJWFJfVFhfQUNLKQotCQlkcnZkYXRhLT5kZmwgPSAwOwotCiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCkBAIC0xNTAsOCArMTQ2LDE1IEBACiAvKiBzZXJpbyBjYWxsYmFja3MgKi8KIC8qKioqKioqKioqKioqKioqKioqLwogCi0vKgotICogc3hwczJfd3JpdGUoKSBzZW5kcyBhIGJ5dGUgb3V0IHRocm91Z2ggdGhlIFBTLzIgaW50ZXJmYWNlLgorLyoqCisgKiBzeHBzMl93cml0ZSgpIC0gc2VuZHMgYSBieXRlIG91dCB0aHJvdWdoIHRoZSBQUy8yIHBvcnQuCisgKiBAcHNlcmlvOglwb2ludGVyIHRvIHRoZSBzZXJpbyBzdHJ1Y3R1cmUgb2YgdGhlIFBTLzIgcG9ydAorICogQGM6CQlkYXRhIHRoYXQgbmVlZHMgdG8gYmUgd3JpdHRlbiB0byB0aGUgUFMvMiBwb3J0CisgKgorICogVGhpcyBmdW5jdGlvbiBjaGVja3MgaWYgdGhlIFBTLzIgdHJhbnNtaXR0ZXIgaXMgZW1wdHkgYW5kIHNlbmRzIGEgYnl0ZS4KKyAqIE90aGVyd2lzZSBpdCByZXR1cm5zIGVycm9yLiBUcmFuc21pc3Npb24gZmFpbHMgb25seSB3aGVuIG5vdGhpbmcgaXMgY29ubmVjdGVkCisgKiB0byB0aGUgUFMvMiBwb3J0LiBUaGF0cyB3aHksIHdlIGRvIG5vdCB0cnkgdG8gcmVzZW5kIHRoZSBkYXRhIGluIGNhc2Ugb2YgYQorICogZmFpbHVyZS4KICAqLwogc3RhdGljIGludCBzeHBzMl93cml0ZShzdHJ1Y3Qgc2VyaW8gKnBzZXJpbywgdW5zaWduZWQgY2hhciBjKQogewpAQCAtMTc0LDMzICsxNzcsMzkgQEAKIAlyZXR1cm4gc3RhdHVzOwogfQogCi0vKgotICogc3hwczJfb3BlbigpIGlzIGNhbGxlZCB3aGVuIGEgcG9ydCBpcyBvcGVuIGJ5IHRoZSBoaWdoZXIgbGF5ZXIuCisvKioKKyAqIHN4cHMyX29wZW4oKSAtIGNhbGxlZCB3aGVuIGEgcG9ydCBpcyBvcGVuZWQgYnkgdGhlIGhpZ2hlciBsYXllci4KKyAqIEBwc2VyaW86CXBvaW50ZXIgdG8gdGhlIHNlcmlvIHN0cnVjdHVyZSBvZiB0aGUgUFMvMiBkZXZpY2UKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJlcXVlc3RzIGlycSBhbmQgZW5hYmxlcyBpbnRlcnJ1cHRzIGZvciB0aGUgUFMvMiBkZXZpY2UuCiAgKi8KIHN0YXRpYyBpbnQgc3hwczJfb3BlbihzdHJ1Y3Qgc2VyaW8gKnBzZXJpbykKIHsKIAlzdHJ1Y3QgeHBzMmRhdGEgKmRydmRhdGEgPSBwc2VyaW8tPnBvcnRfZGF0YTsKLQlpbnQgcmV0dmFsOworCWludCBlcnJvcjsKKwl1OCBjOwogCi0JcmV0dmFsID0gcmVxdWVzdF9pcnEoZHJ2ZGF0YS0+aXJxLCAmeHBzMl9pbnRlcnJ1cHQsIDAsCisJZXJyb3IgPSByZXF1ZXN0X2lycShkcnZkYXRhLT5pcnEsICZ4cHMyX2ludGVycnVwdCwgMCwKIAkJCQlEUklWRVJfTkFNRSwgZHJ2ZGF0YSk7Ci0JaWYgKHJldHZhbCkgewotCQlwcmludGsoS0VSTl9FUlIKLQkJCSIlczogQ291bGRuJ3QgYWxsb2NhdGUgaW50ZXJydXB0ICVkXG4iLAotCQkJZHJ2ZGF0YS0+c2VyaW8ubmFtZSwgZHJ2ZGF0YS0+aXJxKTsKLQkJcmV0dXJuIHJldHZhbDsKKwlpZiAoZXJyb3IpIHsKKwkJZGV2X2VycihkcnZkYXRhLT5zZXJpby5kZXYucGFyZW50LAorCQkJIkNvdWxkbid0IGFsbG9jYXRlIGludGVycnVwdCAlZFxuIiwgZHJ2ZGF0YS0+aXJxKTsKKwkJcmV0dXJuIGVycm9yOwogCX0KIAogCS8qIHN0YXJ0IHJlY2VwdGlvbiBieSBlbmFibGluZyB0aGUgaW50ZXJydXB0cyAqLwogCW91dF9iZTMyKGRydmRhdGEtPmJhc2VfYWRkcmVzcyArIFhQUzJfR0lFUl9PRkZTRVQsIFhQUzJfR0lFUl9HSUVfTUFTSyk7CiAJb3V0X2JlMzIoZHJ2ZGF0YS0+YmFzZV9hZGRyZXNzICsgWFBTMl9JUElFUl9PRkZTRVQsIFhQUzJfSVBJWFJfUlhfQUxMKTsKLQkodm9pZCl4cHMyX3JlY3YoZHJ2ZGF0YSwgJmRydmRhdGEtPnJ4Yik7CisJKHZvaWQpeHBzMl9yZWN2KGRydmRhdGEsICZjKTsKIAogCXJldHVybiAwOwkJLyogc3VjY2VzcyAqLwogfQogCi0vKgotICogc3hwczJfY2xvc2UoKSBmcmVlcyB0aGUgaW50ZXJydXB0LgorLyoqCisgKiBzeHBzMl9jbG9zZSgpIC0gZnJlZXMgdGhlIGludGVycnVwdC4KKyAqIEBwc2VyaW86CXBvaW50ZXIgdG8gdGhlIHNlcmlvIHN0cnVjdHVyZSBvZiB0aGUgUFMvMiBkZXZpY2UKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGZyZWVzIHRoZSBpcnEgYW5kIGRpc2FibGVzIGludGVycnVwdHMgZm9yIHRoZSBQUy8yIGRldmljZS4KICAqLwogc3RhdGljIHZvaWQgc3hwczJfY2xvc2Uoc3RydWN0IHNlcmlvICpwc2VyaW8pCiB7CkBAIC0yMTIsMjQgKzIyMSw0MSBAQAogCWZyZWVfaXJxKGRydmRhdGEtPmlycSwgZHJ2ZGF0YSk7CiB9CiAKLS8qKioqKioqKioqKioqKioqKioqKiovCi0vKiBEZXZpY2Ugc2V0dXAgY29kZSAqLwotLyoqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIGludCB4cHMyX3NldHVwKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJlc291cmNlICpyZWdzX3JlcywKLQkJICAgICAgc3RydWN0IHJlc291cmNlICppcnFfcmVzKQorLyoqCisgKiB4cHMyX29mX3Byb2JlIC0gcHJvYmUgbWV0aG9kIGZvciB0aGUgUFMvMiBkZXZpY2UuCisgKiBAb2ZfZGV2Oglwb2ludGVyIHRvIE9GIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEBtYXRjaDoJcG9pbnRlciB0byB0aGUgc3R1Y3R1cmUgdXNlZCBmb3IgbWF0Y2hpbmcgYSBkZXZpY2UKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHByb2JlcyB0aGUgUFMvMiBkZXZpY2UgaW4gdGhlIGRldmljZSB0cmVlLgorICogSXQgaW5pdGlhbGl6ZXMgdGhlIGRyaXZlciBkYXRhIHN0cnVjdHVyZSBhbmQgdGhlIGhhcmR3YXJlLgorICogSXQgcmV0dXJucyAwLCBpZiB0aGUgZHJpdmVyIGlzIGJvdW5kIHRvIHRoZSBQUy8yIGRldmljZSwgb3IgYSBuZWdhdGl2ZQorICogdmFsdWUgaWYgdGhlcmUgaXMgYW4gZXJyb3IuCisgKi8KK3N0YXRpYyBpbnQgX19kZXZpbml0IHhwczJfb2ZfcHJvYmUoc3RydWN0IG9mX2RldmljZSAqb2ZkZXYsCisJCQkJICAgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2gpCiB7CisJc3RydWN0IHJlc291cmNlIHJfaXJxOyAvKiBJbnRlcnJ1cHQgcmVzb3VyY2VzICovCisJc3RydWN0IHJlc291cmNlIHJfbWVtOyAvKiBJTyBtZW0gcmVzb3VyY2VzICovCiAJc3RydWN0IHhwczJkYXRhICpkcnZkYXRhOwogCXN0cnVjdCBzZXJpbyAqc2VyaW87Ci0JdW5zaWduZWQgbG9uZyByZW1hcF9zaXplOwotCWludCByZXR2YWw7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJm9mZGV2LT5kZXY7CisJcmVzb3VyY2Vfc2l6ZV90IHJlbWFwX3NpemUsIHBoeXNfYWRkcjsKKwlpbnQgZXJyb3I7CiAKLQlpZiAoIWRldikKLQkJcmV0dXJuIC1FSU5WQUw7CisJZGV2X2luZm8oZGV2LCAiRGV2aWNlIFRyZWUgUHJvYmluZyBcJyVzXCdcbiIsCisJCQlvZmRldi0+bm9kZS0+bmFtZSk7CiAKLQlpZiAoIXJlZ3NfcmVzIHx8ICFpcnFfcmVzKSB7Ci0JCWRldl9lcnIoZGV2LCAiSU8gcmVzb3VyY2Uocykgbm90IGZvdW5kXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7CisJLyogR2V0IGlvc3BhY2UgZm9yIHRoZSBkZXZpY2UgKi8KKwllcnJvciA9IG9mX2FkZHJlc3NfdG9fcmVzb3VyY2Uob2ZkZXYtPm5vZGUsIDAsICZyX21lbSk7CisJaWYgKGVycm9yKSB7CisJCWRldl9lcnIoZGV2LCAiaW52YWxpZCBhZGRyZXNzXG4iKTsKKwkJcmV0dXJuIGVycm9yOworCX0KKworCS8qIEdldCBJUlEgZm9yIHRoZSBkZXZpY2UgKi8KKwlpZiAob2ZfaXJxX3RvX3Jlc291cmNlKG9mZGV2LT5ub2RlLCAwLCAmcl9pcnEpID09IE5PX0lSUSkgeworCQlkZXZfZXJyKGRldiwgIm5vIElSUSBmb3VuZFxuIik7CisJCXJldHVybiAtRU5PREVWOwogCX0KIAogCWRydmRhdGEgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgeHBzMmRhdGEpLCBHRlBfS0VSTkVMKTsKQEAgLTI0MSwyNCArMjY3LDIzIEBACiAJZGV2X3NldF9kcnZkYXRhKGRldiwgZHJ2ZGF0YSk7CiAKIAlzcGluX2xvY2tfaW5pdCgmZHJ2ZGF0YS0+bG9jayk7Ci0JZHJ2ZGF0YS0+aXJxID0gaXJxX3Jlcy0+c3RhcnQ7CisJZHJ2ZGF0YS0+aXJxID0gcl9pcnEuc3RhcnQ7CiAKLQlyZW1hcF9zaXplID0gcmVnc19yZXMtPmVuZCAtIHJlZ3NfcmVzLT5zdGFydCArIDE7Ci0JaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24ocmVnc19yZXMtPnN0YXJ0LCByZW1hcF9zaXplLCBEUklWRVJfTkFNRSkpIHsKLQkJZGV2X2VycihkZXYsICJDb3VsZG4ndCBsb2NrIG1lbW9yeSByZWdpb24gYXQgMHglMDhYXG4iLAotCQkJKHVuc2lnbmVkIGludClyZWdzX3Jlcy0+c3RhcnQpOwotCQlyZXR2YWwgPSAtRUJVU1k7CisJcGh5c19hZGRyID0gcl9tZW0uc3RhcnQ7CisJcmVtYXBfc2l6ZSA9IHJfbWVtLmVuZCAtIHJfbWVtLnN0YXJ0ICsgMTsKKwlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihwaHlzX2FkZHIsIHJlbWFwX3NpemUsIERSSVZFUl9OQU1FKSkgeworCQlkZXZfZXJyKGRldiwgIkNvdWxkbid0IGxvY2sgbWVtb3J5IHJlZ2lvbiBhdCAweCUwOGxsWFxuIiwKKwkJCSh1bnNpZ25lZCBsb25nIGxvbmcpcGh5c19hZGRyKTsKKwkJZXJyb3IgPSAtRUJVU1k7CiAJCWdvdG8gZmFpbGVkMTsKIAl9CiAKIAkvKiBGaWxsIGluIGNvbmZpZ3VyYXRpb24gZGF0YSBhbmQgYWRkIHRoZW0gdG8gdGhlIGxpc3QgKi8KLQlkcnZkYXRhLT5waHlzX2FkZHIgPSByZWdzX3Jlcy0+c3RhcnQ7Ci0JZHJ2ZGF0YS0+cmVtYXBfc2l6ZSA9IHJlbWFwX3NpemU7Ci0JZHJ2ZGF0YS0+YmFzZV9hZGRyZXNzID0gaW9yZW1hcChyZWdzX3Jlcy0+c3RhcnQsIHJlbWFwX3NpemUpOworCWRydmRhdGEtPmJhc2VfYWRkcmVzcyA9IGlvcmVtYXAocGh5c19hZGRyLCByZW1hcF9zaXplKTsKIAlpZiAoZHJ2ZGF0YS0+YmFzZV9hZGRyZXNzID09IE5VTEwpIHsKLQkJZGV2X2VycihkZXYsICJDb3VsZG4ndCBpb3JlbWFwIG1lbW9yeSBhdCAweCUwOFhcbiIsCi0JCQkodW5zaWduZWQgaW50KXJlZ3NfcmVzLT5zdGFydCk7Ci0JCXJldHZhbCA9IC1FRkFVTFQ7CisJCWRldl9lcnIoZGV2LCAiQ291bGRuJ3QgaW9yZW1hcCBtZW1vcnkgYXQgMHglMDhsbFhcbiIsCisJCQkodW5zaWduZWQgbG9uZyBsb25nKXBoeXNfYWRkcik7CisJCWVycm9yID0gLUVGQVVMVDsKIAkJZ290byBmYWlsZWQyOwogCX0KIApAQCAtMjY5LDggKzI5NCw5IEBACiAJICogd2UgaGF2ZSB0aGUgUFMyIGluIGEgZ29vZCBzdGF0ZSAqLwogCW91dF9iZTMyKGRydmRhdGEtPmJhc2VfYWRkcmVzcyArIFhQUzJfU1JTVF9PRkZTRVQsIFhQUzJfU1JTVF9SRVNFVCk7CiAKLQlkZXZfaW5mbyhkZXYsICJYaWxpbnggUFMyIGF0IDB4JTA4WCBtYXBwZWQgdG8gMHglcCwgaXJxPSVkXG4iLAotCQlkcnZkYXRhLT5waHlzX2FkZHIsIGRydmRhdGEtPmJhc2VfYWRkcmVzcywgZHJ2ZGF0YS0+aXJxKTsKKwlkZXZfaW5mbyhkZXYsICJYaWxpbnggUFMyIGF0IDB4JTA4bGxYIG1hcHBlZCB0byAweCVwLCBpcnE9JWRcbiIsCisJCSAodW5zaWduZWQgbG9uZyBsb25nKXBoeXNfYWRkciwgZHJ2ZGF0YS0+YmFzZV9hZGRyZXNzLAorCQkgZHJ2ZGF0YS0+aXJxKTsKIAogCXNlcmlvID0gJmRydmRhdGEtPnNlcmlvOwogCXNlcmlvLT5pZC50eXBlID0gU0VSSU9fODA0MjsKQEAgLTI4MCw3MSArMzA2LDUxIEBACiAJc2VyaW8tPnBvcnRfZGF0YSA9IGRydmRhdGE7CiAJc2VyaW8tPmRldi5wYXJlbnQgPSBkZXY7CiAJc25wcmludGYoc2VyaW8tPm5hbWUsIHNpemVvZihzZXJpby0+bmFtZSksCi0JCSAiWGlsaW54IFhQUyBQUy8yIGF0ICUwOFgiLCBkcnZkYXRhLT5waHlzX2FkZHIpOworCQkgIlhpbGlueCBYUFMgUFMvMiBhdCAlMDhsbFgiLCAodW5zaWduZWQgbG9uZyBsb25nKXBoeXNfYWRkcik7CiAJc25wcmludGYoc2VyaW8tPnBoeXMsIHNpemVvZihzZXJpby0+cGh5cyksCi0JCSAieGlsaW54cHMyL3NlcmlvIGF0ICUwOFgiLCBkcnZkYXRhLT5waHlzX2FkZHIpOworCQkgInhpbGlueHBzMi9zZXJpbyBhdCAlMDhsbFgiLCAodW5zaWduZWQgbG9uZyBsb25nKXBoeXNfYWRkcik7CisKIAlzZXJpb19yZWdpc3Rlcl9wb3J0KHNlcmlvKTsKIAogCXJldHVybiAwOwkJLyogc3VjY2VzcyAqLwogCiBmYWlsZWQyOgotCXJlbGVhc2VfbWVtX3JlZ2lvbihyZWdzX3Jlcy0+c3RhcnQsIHJlbWFwX3NpemUpOworCXJlbGVhc2VfbWVtX3JlZ2lvbihwaHlzX2FkZHIsIHJlbWFwX3NpemUpOwogZmFpbGVkMToKIAlrZnJlZShkcnZkYXRhKTsKIAlkZXZfc2V0X2RydmRhdGEoZGV2LCBOVUxMKTsKIAotCXJldHVybiByZXR2YWw7CisJcmV0dXJuIGVycm9yOwogfQogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogT0YgUGxhdGZvcm0gQnVzIFN1cHBvcnQgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyBpbnQgX19kZXZpbml0IHhwczJfb2ZfcHJvYmUoc3RydWN0IG9mX2RldmljZSAqb2ZkZXYsIGNvbnN0IHN0cnVjdAotCQkJCSAgIG9mX2RldmljZV9pZCAqIG1hdGNoKQotewotCXN0cnVjdCByZXNvdXJjZSByX2lycTsgLyogSW50ZXJydXB0IHJlc291cmNlcyAqLwotCXN0cnVjdCByZXNvdXJjZSByX21lbTsgLyogSU8gbWVtIHJlc291cmNlcyAqLwotCWludCByYyA9IDA7Ci0KLQlwcmludGsoS0VSTl9JTkZPICJEZXZpY2UgVHJlZSBQcm9iaW5nIFwnJXNcJ1xuIiwKLQkJCW9mZGV2LT5ub2RlLT5uYW1lKTsKLQotCS8qIEdldCBpb3NwYWNlIGZvciB0aGUgZGV2aWNlICovCi0JcmMgPSBvZl9hZGRyZXNzX3RvX3Jlc291cmNlKG9mZGV2LT5ub2RlLCAwLCAmcl9tZW0pOwotCWlmIChyYykgewotCQlkZXZfZXJyKCZvZmRldi0+ZGV2LCAiaW52YWxpZCBhZGRyZXNzXG4iKTsKLQkJcmV0dXJuIHJjOwotCX0KLQotCS8qIEdldCBJUlEgZm9yIHRoZSBkZXZpY2UgKi8KLQlyYyA9IG9mX2lycV90b19yZXNvdXJjZShvZmRldi0+bm9kZSwgMCwgJnJfaXJxKTsKLQlpZiAocmMgPT0gTk9fSVJRKSB7Ci0JCWRldl9lcnIoJm9mZGV2LT5kZXYsICJubyBJUlEgZm91bmRcbiIpOwotCQlyZXR1cm4gcmM7Ci0JfQotCi0JcmV0dXJuIHhwczJfc2V0dXAoJm9mZGV2LT5kZXYsICZyX21lbSwgJnJfaXJxKTsKLX0KLQorLyoqCisgKiB4cHMyX29mX3JlbW92ZSAtIHVuYmluZHMgdGhlIGRyaXZlciBmcm9tIHRoZSBQUy8yIGRldmljZS4KKyAqIEBvZl9kZXY6CXBvaW50ZXIgdG8gT0YgZGV2aWNlIHN0cnVjdHVyZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGlmIGEgZGV2aWNlIGlzIHBoeXNpY2FsbHkgcmVtb3ZlZCBmcm9tIHRoZSBzeXN0ZW0gb3IKKyAqIGlmIHRoZSBkcml2ZXIgbW9kdWxlIGlzIGJlaW5nIHVubG9hZGVkLiBJdCBmcmVlcyBhbnkgcmVzb3VyY2VzIGFsbG9jYXRlZCB0bworICogdGhlIGRldmljZS4KKyAqLwogc3RhdGljIGludCBfX2RldmV4aXQgeHBzMl9vZl9yZW1vdmUoc3RydWN0IG9mX2RldmljZSAqb2ZfZGV2KQogewogCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZvZl9kZXYtPmRldjsKLQlzdHJ1Y3QgeHBzMmRhdGEgKmRydmRhdGE7Ci0KLQlpZiAoIWRldikKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlkcnZkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IHhwczJkYXRhICpkcnZkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IHJlc291cmNlIHJfbWVtOyAvKiBJTyBtZW0gcmVzb3VyY2VzICovCiAKIAlzZXJpb191bnJlZ2lzdGVyX3BvcnQoJmRydmRhdGEtPnNlcmlvKTsKIAlpb3VubWFwKGRydmRhdGEtPmJhc2VfYWRkcmVzcyk7Ci0JcmVsZWFzZV9tZW1fcmVnaW9uKGRydmRhdGEtPnBoeXNfYWRkciwgZHJ2ZGF0YS0+cmVtYXBfc2l6ZSk7CisKKwkvKiBHZXQgaW9zcGFjZSBvZiB0aGUgZGV2aWNlICovCisJaWYgKG9mX2FkZHJlc3NfdG9fcmVzb3VyY2Uob2ZfZGV2LT5ub2RlLCAwLCAmcl9tZW0pKQorCQlkZXZfZXJyKGRldiwgImludmFsaWQgYWRkcmVzc1xuIik7CisJZWxzZQorCQlyZWxlYXNlX21lbV9yZWdpb24ocl9tZW0uc3RhcnQsIHJfbWVtLmVuZCAtIHJfbWVtLnN0YXJ0ICsgMSk7CisKIAlrZnJlZShkcnZkYXRhKTsKIAogCWRldl9zZXRfZHJ2ZGF0YShkZXYsIE5VTEwpOwogCi0JcmV0dXJuIDA7CQkvKiBzdWNjZXNzICovCisJcmV0dXJuIDA7CiB9CiAKIC8qIE1hdGNoIHRhYmxlIGZvciBvZl9wbGF0Zm9ybSBiaW5kaW5nICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L3RhYmxldC9ndGNvLmMgYi9kcml2ZXJzL2lucHV0L3RhYmxldC9ndGNvLmMKaW5kZXggNTUyNGUwMS4uMmUxOGExYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC90YWJsZXQvZ3Rjby5jCisrKyBiL2RyaXZlcnMvaW5wdXQvdGFibGV0L2d0Y28uYwpAQCAtODc3LDcgKzg3Nyw3IEBACiAJZGJnKCJudW0gZW5kcG9pbnRzOiAgICAgJWQiLCB1c2JpbnRlcmZhY2UtPmN1cl9hbHRzZXR0aW5nLT5kZXNjLmJOdW1FbmRwb2ludHMpOwogCWRiZygiaW50ZXJmYWNlIGNsYXNzOiAgICVkIiwgdXNiaW50ZXJmYWNlLT5jdXJfYWx0c2V0dGluZy0+ZGVzYy5iSW50ZXJmYWNlQ2xhc3MpOwogCWRiZygiZW5kcG9pbnQ6IGF0dHJpYnV0ZToweCV4IHR5cGU6MHgleCIsIGVuZHBvaW50LT5ibUF0dHJpYnV0ZXMsIGVuZHBvaW50LT5iRGVzY3JpcHRvclR5cGUpOwotCWlmICgoZW5kcG9pbnQtPmJtQXR0cmlidXRlcyAmIFVTQl9FTkRQT0lOVF9YRkVSVFlQRV9NQVNLKSA9PSBVU0JfRU5EUE9JTlRfWEZFUl9JTlQpCisJaWYgKHVzYl9lbmRwb2ludF94ZmVyX2ludChlbmRwb2ludCkpCiAJCWRiZygiZW5kcG9pbnQ6IHdlIGhhdmUgaW50ZXJydXB0IGVuZHBvaW50XG4iKTsKIAogCWRiZygiZW5kcG9pbnQgZXh0cmEgbGVuOiVkICIsIHVzYmludGVyZmFjZS0+YWx0c2V0dGluZ1swXS5leHRyYWxlbik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L3RhYmxldC93YWNvbV93YWMuYyBiL2RyaXZlcnMvaW5wdXQvdGFibGV0L3dhY29tX3dhYy5jCmluZGV4IDhkYzhkMWUuLjI2Mzg4MTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvdGFibGV0L3dhY29tX3dhYy5jCisrKyBiL2RyaXZlcnMvaW5wdXQvdGFibGV0L3dhY29tX3dhYy5jCkBAIC01MzUsNyArNTM1LDcgQEAKIAlyZXR1cm4gMTsKIH0KIAotaW50IHdhY29tX3RwY19pcnEoc3RydWN0IHdhY29tX3dhYyAqd2Fjb20sIHZvaWQgKndjb21ibykKK3N0YXRpYyBpbnQgd2Fjb21fdHBjX2lycShzdHJ1Y3Qgd2Fjb21fd2FjICp3YWNvbSwgdm9pZCAqd2NvbWJvKQogewogCWNoYXIgKmRhdGEgPSB3YWNvbS0+ZGF0YTsKIAlpbnQgcHJveCA9IDAsIHByZXNzdXJlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9LY29uZmlnIGIvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9LY29uZmlnCmluZGV4IDNkMWFiOGYuLmJiNjQ4NmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vS2NvbmZpZworKysgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL0tjb25maWcKQEAgLTU4LDYgKzU4LDE0IEBACiAJICBOT1RFOiB0aGlzIGRyaXZlciBpcyBkZXByZWNhdGVkLCB0cnkgZW5hYmxlIFNQSSBhbmQgZ2VuZXJpYwogCSAgQURTNzg0Ni1iYXNlZCB0b3VjaHNjcmVlbiBkcml2ZXIuCiAKK2NvbmZpZyBUT1VDSFNDUkVFTl9EQTkwMzQKKwl0cmlzdGF0ZSAiVG91Y2hzY3JlZW4gc3VwcG9ydCBmb3IgRGlhbG9nIFNlbWljb25kdWN0b3IgREE5MDM0IgorCWRlcGVuZHMgb24gUE1JQ19EQTkwM1gKKwlkZWZhdWx0IHkKKwloZWxwCisJICBTYXkgWSBoZXJlIHRvIGVuYWJsZSB0aGUgc3VwcG9ydCBmb3IgdGhlIHRvdWNoc2NyZWVuIGZvdW5kCisJICBvbiBEaWFsb2cgU2VtaWNvbmR1Y3RvciBEQTkwMzQgUE1JQy4KKwogY29uZmlnIFRPVUNIU0NSRUVOX0ZVSklUU1UKIAl0cmlzdGF0ZSAiRnVqaXRzdSBzZXJpYWwgdG91Y2hzY3JlZW4iCiAJc2VsZWN0IFNFUklPCkBAIC05NSw2ICsxMDMsMTkgQEAKIAkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQogCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGVsby4KIAorY29uZmlnIFRPVUNIU0NSRUVOX1dBQ09NX1c4MDAxCisJdHJpc3RhdGUgIldhY29tIFc4MDAxIHBlbmFibGVkIHNlcmlhbCB0b3VjaHNjcmVlbiIKKwlzZWxlY3QgU0VSSU8KKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSBoYXZlIGFuIFdhY29tIFc4MDAxIHBlbmFibGVkIHNlcmlhbCB0b3VjaHNjcmVlbgorCSAgY29ubmVjdGVkIHRvIHlvdXIgc3lzdGVtLgorCisJICBJZiB1bnN1cmUsIHNheSBOLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCB3YWNvbV93ODAwMS4KKworCiBjb25maWcgVE9VQ0hTQ1JFRU5fTVRPVUNICiAJdHJpc3RhdGUgIk1pY3JvVG91Y2ggc2VyaWFsIHRvdWNoc2NyZWVucyIKIAlzZWxlY3QgU0VSSU8KQEAgLTM3Niw0ICszOTcsMTUgQEAKIAkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQogCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHRvdWNoaXQyMTMuCiAKK2NvbmZpZyBUT1VDSFNDUkVFTl9UU0MyMDA3CisJdHJpc3RhdGUgIlRTQzIwMDcgYmFzZWQgdG91Y2hzY3JlZW5zIgorCWRlcGVuZHMgb24gSTJDCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3UgaGF2ZSBhIFRTQzIwMDcgYmFzZWQgdG91Y2hzY3JlZW4uCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHRzYzIwMDcuCisKIGVuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL01ha2VmaWxlIGIvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9NYWtlZmlsZQppbmRleCAxNWNmMjkwLi5kMzM3NWFmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vTWFrZWZpbGUKQEAgLTI1LDggKzI1LDExIEBACiBvYmotJChDT05GSUdfVE9VQ0hTQ1JFRU5fVE9VQ0hJVDIxMykJKz0gdG91Y2hpdDIxMy5vCiBvYmotJChDT05GSUdfVE9VQ0hTQ1JFRU5fVE9VQ0hSSUdIVCkJKz0gdG91Y2hyaWdodC5vCiBvYmotJChDT05GSUdfVE9VQ0hTQ1JFRU5fVE9VQ0hXSU4pCSs9IHRvdWNod2luLm8KK29iai0kKENPTkZJR19UT1VDSFNDUkVFTl9UU0MyMDA3KQkrPSB0c2MyMDA3Lm8KIG9iai0kKENPTkZJR19UT1VDSFNDUkVFTl9VQ0IxNDAwKQkrPSB1Y2IxNDAwX3RzLm8KK29iai0kKENPTkZJR19UT1VDSFNDUkVFTl9XQUNPTV9XODAwMSkJKz0gd2Fjb21fdzgwMDEubwogb2JqLSQoQ09ORklHX1RPVUNIU0NSRUVOX1dNOTdYWCkJKz0gd205N3h4LXRzLm8KK29iai0kKENPTkZJR19UT1VDSFNDUkVFTl9EQTkwMzQpCSs9IGRhOTAzNC10cy5vCiB3bTk3eHgtdHMtJChDT05GSUdfVE9VQ0hTQ1JFRU5fV005NzA1KQkrPSB3bTk3MDUubwogd205N3h4LXRzLSQoQ09ORklHX1RPVUNIU0NSRUVOX1dNOTcxMikJKz0gd205NzEyLm8KIHdtOTd4eC10cy0kKENPTkZJR19UT1VDSFNDUkVFTl9XTTk3MTMpCSs9IHdtOTcxMy5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL2Fkczc4NDYuYyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vYWRzNzg0Ni5jCmluZGV4IGUxZWNlODkuLjdjMjdjOGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vYWRzNzg0Ni5jCisrKyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vYWRzNzg0Ni5jCkBAIC00NzIsNyArNDcyLDcgQEAKIAkJCQkgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewogCXN0cnVjdCBhZHM3ODQ2ICp0cyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCWxvbmcgaTsKKwl1bnNpZ25lZCBsb25nIGk7CiAKIAlpZiAoc3RyaWN0X3N0cnRvdWwoYnVmLCAxMCwgJmkpKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTU1OSw3ICs1NTksNyBAQAogCWlmIChwYWNrZXQtPnRjLmlnbm9yZSB8fCBSdCA+IHRzLT5wcmVzc3VyZV9tYXgpIHsKICNpZmRlZiBWRVJCT1NFCiAJCXByX2RlYnVnKCIlczogaWdub3JlZCAlZCBwcmVzc3VyZSAlZFxuIiwKLQkJCXRzLT5zcGktPmRldi5idXNfaWQsIHBhY2tldC0+dGMuaWdub3JlLCBSdCk7CisJCQlkZXZfbmFtZSgmdHMtPnNwaS0+ZGV2KSwgcGFja2V0LT50Yy5pZ25vcmUsIFJ0KTsKICNlbmRpZgogCQlocnRpbWVyX3N0YXJ0KCZ0cy0+dGltZXIsIGt0aW1lX3NldCgwLCBUU19QT0xMX1BFUklPRCksCiAJCQkgICAgICBIUlRJTUVSX01PREVfUkVMKTsKQEAgLTk0Nyw3ICs5NDcsNyBAQAogCQl0cy0+cGVuaXJxX3JlY2hlY2tfZGVsYXlfdXNlY3MgPQogCQkJCXBkYXRhLT5wZW5pcnFfcmVjaGVja19kZWxheV91c2VjczsKIAotCXNucHJpbnRmKHRzLT5waHlzLCBzaXplb2YodHMtPnBoeXMpLCAiJXMvaW5wdXQwIiwgc3BpLT5kZXYuYnVzX2lkKTsKKwlzbnByaW50Zih0cy0+cGh5cywgc2l6ZW9mKHRzLT5waHlzKSwgIiVzL2lucHV0MCIsIGRldl9uYW1lKCZzcGktPmRldikpOwogCiAJaW5wdXRfZGV2LT5uYW1lID0gIkFEUzc4NHggVG91Y2hzY3JlZW4iOwogCWlucHV0X2Rldi0+cGh5cyA9IHRzLT5waHlzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9kYTkwMzQtdHMuYyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vZGE5MDM0LXRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE2N2Q3OAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vZGE5MDM0LXRzLmMKQEAgLTAsMCArMSwzOTAgQEAKKy8qCisgKiBUb3VjaHNjcmVlbiBkcml2ZXIgZm9yIERpYWxvZyBTZW1pY29uZHVjdG9yIERBOTAzNAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNi0yMDA4IE1hcnZlbGwgSW50ZXJuYXRpb25hbCBMdGQuCisgKglGZW5nd2VpIFlpbiA8ZmVuZ3dlaS55aW5AbWFydmVsbC5jb20+CisgKglFcmljIE1pYW8gPGVyaWMubWlhb0BtYXJ2ZWxsLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC9kYTkwM3guaD4KKworI2RlZmluZSBEQTkwMzRfTUFOVUFMX0NUUkwJMHg1MAorI2RlZmluZSBEQTkwMzRfTERPX0FEQ19FTgkoMSA8PCA0KQorCisjZGVmaW5lIERBOTAzNF9BVVRPX0NUUkwxCTB4NTEKKworI2RlZmluZSBEQTkwMzRfQVVUT19DVFJMMgkweDUyCisjZGVmaW5lIERBOTAzNF9BVVRPX1RTSV9FTgkoMSA8PCAzKQorI2RlZmluZSBEQTkwMzRfUEVOX0RFVEVDVAkoMSA8PCA0KQorCisjZGVmaW5lIERBOTAzNF9UU0lfQ1RSTDEJMHg1MworI2RlZmluZSBEQTkwMzRfVFNJX0NUUkwyCTB4NTQKKyNkZWZpbmUgREE5MDM0X1RTSV9YX01TQgkweDZjCisjZGVmaW5lIERBOTAzNF9UU0lfWV9NU0IJMHg2ZAorI2RlZmluZSBEQTkwMzRfVFNJX1hZX0xTQgkweDZlCisKK2VudW0geworCVNUQVRFX0lETEUsCS8qIHdhaXQgZm9yIHBlbmRvd24gKi8KKwlTVEFURV9CVVNZLAkvKiBUU0kgYnVzeSBzYW1wbGluZyAqLworCVNUQVRFX1NUT1AsCS8qIHNhbXBsZSBhdmFpbGFibGUgKi8KKwlTVEFURV9XQUlULAkvKiBXYWl0IHRvIHN0YXJ0IG5leHQgc2FtcGxlICovCit9OworCitlbnVtIHsKKwlFVkVOVF9QRU5fRE9XTiwKKwlFVkVOVF9QRU5fVVAsCisJRVZFTlRfVFNJX1JFQURZLAorCUVWRU5UX1RJTUVET1VULAorfTsKKworc3RydWN0IGRhOTAzNF90b3VjaCB7CisJc3RydWN0IGRldmljZQkJKmRhOTAzNF9kZXY7CisJc3RydWN0IGlucHV0X2RldgkqaW5wdXRfZGV2OworCisJc3RydWN0IGRlbGF5ZWRfd29yawl0c2lfd29yazsKKwlzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sJbm90aWZpZXI7CisKKwlpbnQJc3RhdGU7CisKKwlpbnQJaW50ZXJ2YWxfbXM7CisJaW50CXhfaW52ZXJ0ZWQ7CisJaW50CXlfaW52ZXJ0ZWQ7CisKKwlpbnQJbGFzdF94OworCWludAlsYXN0X3k7Cit9OworCitzdGF0aWMgaW5saW5lIGludCBpc19wZW5fZG93bihzdHJ1Y3QgZGE5MDM0X3RvdWNoICp0b3VjaCkKK3sKKwlyZXR1cm4gZGE5MDN4X3F1ZXJ5X3N0YXR1cyh0b3VjaC0+ZGE5MDM0X2RldiwgREE5MDM0X1NUQVRVU19QRU5fRE9XTik7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGRldGVjdF9wZW5fZG93bihzdHJ1Y3QgZGE5MDM0X3RvdWNoICp0b3VjaCwgaW50IG9uKQoreworCWlmIChvbikKKwkJcmV0dXJuIGRhOTAzeF9zZXRfYml0cyh0b3VjaC0+ZGE5MDM0X2RldiwKKwkJCQlEQTkwMzRfQVVUT19DVFJMMiwgREE5MDM0X1BFTl9ERVRFQ1QpOworCWVsc2UKKwkJcmV0dXJuIGRhOTAzeF9jbHJfYml0cyh0b3VjaC0+ZGE5MDM0X2RldiwKKwkJCQlEQTkwMzRfQVVUT19DVFJMMiwgREE5MDM0X1BFTl9ERVRFQ1QpOworfQorCitzdGF0aWMgaW50IHJlYWRfdHNpKHN0cnVjdCBkYTkwMzRfdG91Y2ggKnRvdWNoKQoreworCXVpbnQ4X3QgX3gsIF95LCBfdjsKKwlpbnQgcmV0OworCisJcmV0ID0gZGE5MDN4X3JlYWQodG91Y2gtPmRhOTAzNF9kZXYsIERBOTAzNF9UU0lfWF9NU0IsICZfeCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IGRhOTAzeF9yZWFkKHRvdWNoLT5kYTkwMzRfZGV2LCBEQTkwMzRfVFNJX1lfTVNCLCAmX3kpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBkYTkwM3hfcmVhZCh0b3VjaC0+ZGE5MDM0X2RldiwgREE5MDM0X1RTSV9YWV9MU0IsICZfdik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXRvdWNoLT5sYXN0X3ggPSAoKF94IDw8IDIpICYgMHgzZmMpIHwgKF92ICYgMHgzKTsKKwl0b3VjaC0+bGFzdF95ID0gKChfeSA8PCAyKSAmIDB4M2ZjKSB8ICgoX3YgJiAweGMpID4+IDIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHN0YXJ0X3RzaShzdHJ1Y3QgZGE5MDM0X3RvdWNoICp0b3VjaCkKK3sKKwlyZXR1cm4gZGE5MDN4X3NldF9iaXRzKHRvdWNoLT5kYTkwMzRfZGV2LAorCQkJREE5MDM0X0FVVE9fQ1RSTDIsIERBOTAzNF9BVVRPX1RTSV9FTik7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHN0b3BfdHNpKHN0cnVjdCBkYTkwMzRfdG91Y2ggKnRvdWNoKQoreworCXJldHVybiBkYTkwM3hfY2xyX2JpdHModG91Y2gtPmRhOTAzNF9kZXYsCisJCQlEQTkwMzRfQVVUT19DVFJMMiwgREE5MDM0X0FVVE9fVFNJX0VOKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHJlcG9ydF9wZW5fZG93bihzdHJ1Y3QgZGE5MDM0X3RvdWNoICp0b3VjaCkKK3sKKwlpbnQgeCA9IHRvdWNoLT5sYXN0X3g7CisJaW50IHkgPSB0b3VjaC0+bGFzdF95OworCisJeCAmPSAweGZmZjsKKwlpZiAodG91Y2gtPnhfaW52ZXJ0ZWQpCisJCXggPSAxMDI0IC0geDsKKwl5ICY9IDB4ZmZmOworCWlmICh0b3VjaC0+eV9pbnZlcnRlZCkKKwkJeSA9IDEwMjQgLSB5OworCisJaW5wdXRfcmVwb3J0X2Ficyh0b3VjaC0+aW5wdXRfZGV2LCBBQlNfWCwgeCk7CisJaW5wdXRfcmVwb3J0X2Ficyh0b3VjaC0+aW5wdXRfZGV2LCBBQlNfWSwgeSk7CisJaW5wdXRfcmVwb3J0X2tleSh0b3VjaC0+aW5wdXRfZGV2LCBCVE5fVE9VQ0gsIDEpOworCisJaW5wdXRfc3luYyh0b3VjaC0+aW5wdXRfZGV2KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHJlcG9ydF9wZW5fdXAoc3RydWN0IGRhOTAzNF90b3VjaCAqdG91Y2gpCit7CisJaW5wdXRfcmVwb3J0X2tleSh0b3VjaC0+aW5wdXRfZGV2LCBCVE5fVE9VQ0gsIDApOworCWlucHV0X3N5bmModG91Y2gtPmlucHV0X2Rldik7Cit9CisKK3N0YXRpYyB2b2lkIGRhOTAzNF9ldmVudF9oYW5kbGVyKHN0cnVjdCBkYTkwMzRfdG91Y2ggKnRvdWNoLCBpbnQgZXZlbnQpCit7CisJaW50IGVycjsKKworCXN3aXRjaCAodG91Y2gtPnN0YXRlKSB7CisJY2FzZSBTVEFURV9JRExFOgorCQlpZiAoZXZlbnQgIT0gRVZFTlRfUEVOX0RPV04pCisJCQlicmVhazsKKworCQkvKiBFbmFibGUgYXV0byBtZWFzdXJlbWVudCBvZiB0aGUgVFNJLCB0aGlzIHdpbGwKKwkJICogYXV0b21hdGljYWxseSBkaXNhYmxlIHBlbiBkb3duIGRldGVjdGlvbgorCQkgKi8KKwkJZXJyID0gc3RhcnRfdHNpKHRvdWNoKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gZXJyX3Jlc2V0OworCisJCXRvdWNoLT5zdGF0ZSA9IFNUQVRFX0JVU1k7CisJCWJyZWFrOworCisJY2FzZSBTVEFURV9CVVNZOgorCQlpZiAoZXZlbnQgIT0gRVZFTlRfVFNJX1JFQURZKQorCQkJYnJlYWs7CisKKwkJZXJyID0gcmVhZF90c2kodG91Y2gpOworCQlpZiAoZXJyKQorCQkJZ290byBlcnJfcmVzZXQ7CisKKwkJLyogRGlzYWJsZSBhdXRvIG1lYXN1cmVtZW50IG9mIHRoZSBUU0ksIHNvIHRoYXQKKwkJICogcGVuIGRvd24gc3RhdHVzIHdpbGwgYmUgYXZhaWxhYmxlCisJCSAqLworCQllcnIgPSBzdG9wX3RzaSh0b3VjaCk7CisJCWlmIChlcnIpCisJCQlnb3RvIGVycl9yZXNldDsKKworCQl0b3VjaC0+c3RhdGUgPSBTVEFURV9TVE9QOworCQlicmVhazsKKworCWNhc2UgU1RBVEVfU1RPUDoKKwkJaWYgKGV2ZW50ID09IEVWRU5UX1BFTl9ET1dOKSB7CisJCQlyZXBvcnRfcGVuX2Rvd24odG91Y2gpOworCQkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZ0b3VjaC0+dHNpX3dvcmssCisJCQkJbXNlY3NfdG9famlmZmllcyh0b3VjaC0+aW50ZXJ2YWxfbXMpKTsKKwkJCXRvdWNoLT5zdGF0ZSA9IFNUQVRFX1dBSVQ7CisJCX0KKworCQlpZiAoZXZlbnQgPT0gRVZFTlRfUEVOX1VQKSB7CisJCQlyZXBvcnRfcGVuX3VwKHRvdWNoKTsKKwkJCXRvdWNoLT5zdGF0ZSA9IFNUQVRFX0lETEU7CisJCX0KKworCQlpbnB1dF9zeW5jKHRvdWNoLT5pbnB1dF9kZXYpOworCQlicmVhazsKKworCWNhc2UgU1RBVEVfV0FJVDoKKwkJaWYgKGV2ZW50ICE9IEVWRU5UX1RJTUVET1VUKQorCQkJYnJlYWs7CisKKwkJaWYgKGlzX3Blbl9kb3duKHRvdWNoKSkgeworCQkJc3RhcnRfdHNpKHRvdWNoKTsKKwkJCXRvdWNoLT5zdGF0ZSA9IFNUQVRFX0JVU1k7CisJCX0gZWxzZQorCQkJdG91Y2gtPnN0YXRlID0gU1RBVEVfSURMRTsKKwkJYnJlYWs7CisJfQorCXJldHVybjsKKworZXJyX3Jlc2V0OgorCXRvdWNoLT5zdGF0ZSA9IFNUQVRFX0lETEU7CisJc3RvcF90c2kodG91Y2gpOworCWRldGVjdF9wZW5fZG93bih0b3VjaCwgMSk7Cit9CisKK3N0YXRpYyB2b2lkIGRhOTAzNF90c2lfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGRhOTAzNF90b3VjaCAqdG91Y2ggPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IGRhOTAzNF90b3VjaCwgdHNpX3dvcmsud29yayk7CisKKwlkYTkwMzRfZXZlbnRfaGFuZGxlcih0b3VjaCwgRVZFTlRfVElNRURPVVQpOworfQorCitzdGF0aWMgaW50IGRhOTAzNF90b3VjaF9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iLAorCQkJCSB1bnNpZ25lZCBsb25nIGV2ZW50LCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBkYTkwMzRfdG91Y2ggKnRvdWNoID0KKwkJY29udGFpbmVyX29mKG5iLCBzdHJ1Y3QgZGE5MDM0X3RvdWNoLCBub3RpZmllcik7CisKKwlpZiAoZXZlbnQgJiBEQTkwMzRfRVZFTlRfUEVOX0RPV04pIHsKKwkJaWYgKGlzX3Blbl9kb3duKHRvdWNoKSkKKwkJCWRhOTAzNF9ldmVudF9oYW5kbGVyKHRvdWNoLCBFVkVOVF9QRU5fRE9XTik7CisJCWVsc2UKKwkJCWRhOTAzNF9ldmVudF9oYW5kbGVyKHRvdWNoLCBFVkVOVF9QRU5fVVApOworCX0KKworCWlmIChldmVudCAmIERBOTAzNF9FVkVOVF9UU0lfUkVBRFkpCisJCWRhOTAzNF9ldmVudF9oYW5kbGVyKHRvdWNoLCBFVkVOVF9UU0lfUkVBRFkpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGE5MDM0X3RvdWNoX29wZW4oc3RydWN0IGlucHV0X2RldiAqZGV2KQoreworCXN0cnVjdCBkYTkwMzRfdG91Y2ggKnRvdWNoID0gaW5wdXRfZ2V0X2RydmRhdGEoZGV2KTsKKwlpbnQgcmV0OworCisJcmV0ID0gZGE5MDN4X3JlZ2lzdGVyX25vdGlmaWVyKHRvdWNoLT5kYTkwMzRfZGV2LCAmdG91Y2gtPm5vdGlmaWVyLAorCQkJREE5MDM0X0VWRU5UX1BFTl9ET1dOIHwgREE5MDM0X0VWRU5UX1RTSV9SRUFEWSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1FQlVTWTsKKworCS8qIEVuYWJsZSBBREMgTERPICovCisJcmV0ID0gZGE5MDN4X3NldF9iaXRzKHRvdWNoLT5kYTkwMzRfZGV2LAorCQkJREE5MDM0X01BTlVBTF9DVFJMLCBEQTkwMzRfTERPX0FEQ19FTik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCS8qIFRTSV9ERUxBWTogMyBzbG90cywgVFNJX1NLSVA6IDMgc2xvdHMgKi8KKwlyZXQgPSBkYTkwM3hfd3JpdGUodG91Y2gtPmRhOTAzNF9kZXYsIERBOTAzNF9UU0lfQ1RSTDEsIDB4MWIpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBkYTkwM3hfd3JpdGUodG91Y2gtPmRhOTAzNF9kZXYsIERBOTAzNF9UU0lfQ1RSTDIsIDB4MDApOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwl0b3VjaC0+c3RhdGUgPSBTVEFURV9JRExFOworCWRldGVjdF9wZW5fZG93bih0b3VjaCwgMSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZGE5MDM0X3RvdWNoX2Nsb3NlKHN0cnVjdCBpbnB1dF9kZXYgKmRldikKK3sKKwlzdHJ1Y3QgZGE5MDM0X3RvdWNoICp0b3VjaCA9IGlucHV0X2dldF9kcnZkYXRhKGRldik7CisKKwlkYTkwM3hfdW5yZWdpc3Rlcl9ub3RpZmllcih0b3VjaC0+ZGE5MDM0X2RldiwgJnRvdWNoLT5ub3RpZmllciwKKwkJCURBOTAzNF9FVkVOVF9QRU5fRE9XTiB8IERBOTAzNF9FVkVOVF9UU0lfUkVBRFkpOworCisJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZ0b3VjaC0+dHNpX3dvcmspOworCisJdG91Y2gtPnN0YXRlID0gU1RBVEVfSURMRTsKKwlzdG9wX3RzaSh0b3VjaCk7CisJZGV0ZWN0X3Blbl9kb3duKHRvdWNoLCAwKTsKKworCS8qIERpc2FibGUgQURDIExETyAqLworCWRhOTAzeF9jbHJfYml0cyh0b3VjaC0+ZGE5MDM0X2RldiwKKwkJCURBOTAzNF9NQU5VQUxfQ1RSTCwgREE5MDM0X0xET19BRENfRU4pOworfQorCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGRhOTAzNF90b3VjaF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBkYTkwMzRfdG91Y2hfcGRhdGEgKnBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJc3RydWN0IGRhOTAzNF90b3VjaCAqdG91Y2g7CisJc3RydWN0IGlucHV0X2RldiAqaW5wdXRfZGV2OworCWludCByZXQ7CisKKwl0b3VjaCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBkYTkwMzRfdG91Y2gpLCBHRlBfS0VSTkVMKTsKKwlpZiAodG91Y2ggPT0gTlVMTCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gYWxsb2NhdGUgZHJpdmVyIGRhdGFcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwl0b3VjaC0+ZGE5MDM0X2RldiA9IHBkZXYtPmRldi5wYXJlbnQ7CisKKwlpZiAocGRhdGEpIHsKKwkJdG91Y2gtPmludGVydmFsX21zCT0gcGRhdGEtPmludGVydmFsX21zOworCQl0b3VjaC0+eF9pbnZlcnRlZAk9IHBkYXRhLT54X2ludmVydGVkOworCQl0b3VjaC0+eV9pbnZlcnRlZAk9IHBkYXRhLT55X2ludmVydGVkOworCX0gZWxzZQorCQkvKiBmYWxsYmFjayBpbnRvIGRlZmF1bHQgKi8KKwkJdG91Y2gtPmludGVydmFsX21zCT0gMTA7CisKKwlJTklUX0RFTEFZRURfV09SSygmdG91Y2gtPnRzaV93b3JrLCBkYTkwMzRfdHNpX3dvcmspOworCXRvdWNoLT5ub3RpZmllci5ub3RpZmllcl9jYWxsID0gZGE5MDM0X3RvdWNoX25vdGlmaWVyOworCisJaW5wdXRfZGV2ID0gaW5wdXRfYWxsb2NhdGVfZGV2aWNlKCk7CisJaWYgKCFpbnB1dF9kZXYpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIGFsbG9jYXRlIGlucHV0IGRldmljZVxuIik7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyX2ZyZWVfdG91Y2g7CisJfQorCisJaW5wdXRfZGV2LT5uYW1lCQk9IHBkZXYtPm5hbWU7CisJaW5wdXRfZGV2LT5vcGVuCQk9IGRhOTAzNF90b3VjaF9vcGVuOworCWlucHV0X2Rldi0+Y2xvc2UJPSBkYTkwMzRfdG91Y2hfY2xvc2U7CisJaW5wdXRfZGV2LT5kZXYucGFyZW50CT0gJnBkZXYtPmRldjsKKworCV9fc2V0X2JpdChFVl9BQlMsIGlucHV0X2Rldi0+ZXZiaXQpOworCV9fc2V0X2JpdChBQlNfWCwgaW5wdXRfZGV2LT5hYnNiaXQpOworCV9fc2V0X2JpdChBQlNfWSwgaW5wdXRfZGV2LT5hYnNiaXQpOworCWlucHV0X3NldF9hYnNfcGFyYW1zKGlucHV0X2RldiwgQUJTX1gsIDAsIDEwMjMsIDAsIDApOworCWlucHV0X3NldF9hYnNfcGFyYW1zKGlucHV0X2RldiwgQUJTX1ksIDAsIDEwMjMsIDAsIDApOworCisJX19zZXRfYml0KEVWX0tFWSwgaW5wdXRfZGV2LT5ldmJpdCk7CisJX19zZXRfYml0KEJUTl9UT1VDSCwgaW5wdXRfZGV2LT5rZXliaXQpOworCisJdG91Y2gtPmlucHV0X2RldiA9IGlucHV0X2RldjsKKwlpbnB1dF9zZXRfZHJ2ZGF0YShpbnB1dF9kZXYsIHRvdWNoKTsKKworCXJldCA9IGlucHV0X3JlZ2lzdGVyX2RldmljZShpbnB1dF9kZXYpOworCWlmIChyZXQpCisJCWdvdG8gZXJyX2ZyZWVfaW5wdXQ7CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCB0b3VjaCk7CisJcmV0dXJuIDA7CisKK2Vycl9mcmVlX2lucHV0OgorCWlucHV0X2ZyZWVfZGV2aWNlKGlucHV0X2Rldik7CitlcnJfZnJlZV90b3VjaDoKKwlrZnJlZSh0b3VjaCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgZGE5MDM0X3RvdWNoX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBkYTkwMzRfdG91Y2ggKnRvdWNoID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlpbnB1dF91bnJlZ2lzdGVyX2RldmljZSh0b3VjaC0+aW5wdXRfZGV2KTsKKwlrZnJlZSh0b3VjaCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgZGE5MDM0X3RvdWNoX2RyaXZlciA9IHsKKwkuZHJpdmVyCT0geworCQkubmFtZQk9ICJkYTkwMzQtdG91Y2giLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZQkJPSBkYTkwMzRfdG91Y2hfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChkYTkwMzRfdG91Y2hfcmVtb3ZlKSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGRhOTAzNF90b3VjaF9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmZGE5MDM0X3RvdWNoX2RyaXZlcik7Cit9Cittb2R1bGVfaW5pdChkYTkwMzRfdG91Y2hfaW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBkYTkwMzRfdG91Y2hfZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZkYTkwMzRfdG91Y2hfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KGRhOTAzNF90b3VjaF9leGl0KTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJUb3VjaHNjcmVlbiBkcml2ZXIgZm9yIERpYWxvZyBTZW1pY29uZHVjdG9yIERBOTAzNCIpOworTU9EVUxFX0FVVEhPUigiRXJpYyBNaWFvIDxlcmljLm1pYW9AbWFydmVsbC5jb20+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOmRhOTAzNC10b3VjaCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi90c2MyMDA3LmMgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL3RzYzIwMDcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzVkYzI5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi90c2MyMDA3LmMKQEAgLTAsMCArMSwzODEgQEAKKy8qCisgKiBkcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL3RzYzIwMDcuYworICoKKyAqIENvcHlyaWdodCAoYykgMjAwOCBNdGVrVmlzaW9uIENvLiwgTHRkLgorICoJS3dhbmd3b28gTGVlIDxrd2xlZUBtdGVrdmlzaW9uLmNvbT4KKyAqCisgKiBVc2luZyBjb2RlIGZyb206CisgKiAgLSBhZHM3ODQ2LmMKKyAqCUNvcHlyaWdodCAoYykgMjAwNSBEYXZpZCBCcm93bmVsbAorICoJQ29weXJpZ2h0IChjKSAyMDA2IE5va2lhIENvcnBvcmF0aW9uCisgKiAgLSBjb3JnaV90cy5jCisgKglDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNSBSaWNoYXJkIFB1cmRpZQorICogIC0gb21hcF90cy5baGNdLCBhZHM3ODQ2LmgsIHRzX29zay5jCisgKglDb3B5cmlnaHQgKEMpIDIwMDIgTW9udGFWaXN0YSBTb2Z0d2FyZQorICoJQ29weXJpZ2h0IChDKSAyMDA0IFRleGFzIEluc3RydW1lbnRzCisgKglDb3B5cmlnaHQgKEMpIDIwMDUgRGlyayBCZWhtZQorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2hydGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMvdHNjMjAwNy5oPgorCisjZGVmaW5lIFRTX1BPTExfREVMQVkJKDEwICogMTAwMCkJLyogbnMgZGVsYXkgYmVmb3JlIHRoZSBmaXJzdCBzYW1wbGUgKi8KKyNkZWZpbmUgVFNfUE9MTF9QRVJJT0QJKDUgKiAxMDAwKQkvKiBucyBkZWxheSBiZXR3ZWVuIHNhbXBsZXMgKi8KKworI2RlZmluZSBUU0MyMDA3X01FQVNVUkVfVEVNUDAJCSgweDAgPDwgNCkKKyNkZWZpbmUgVFNDMjAwN19NRUFTVVJFX0FVWAkJKDB4MiA8PCA0KQorI2RlZmluZSBUU0MyMDA3X01FQVNVUkVfVEVNUDEJCSgweDQgPDwgNCkKKyNkZWZpbmUgVFNDMjAwN19BQ1RJVkFURV9YTgkJKDB4OCA8PCA0KQorI2RlZmluZSBUU0MyMDA3X0FDVElWQVRFX1lOCQkoMHg5IDw8IDQpCisjZGVmaW5lIFRTQzIwMDdfQUNUSVZBVEVfWVBfWE4JCSgweGEgPDwgNCkKKyNkZWZpbmUgVFNDMjAwN19TRVRVUAkJCSgweGIgPDwgNCkKKyNkZWZpbmUgVFNDMjAwN19NRUFTVVJFX1gJCSgweGMgPDwgNCkKKyNkZWZpbmUgVFNDMjAwN19NRUFTVVJFX1kJCSgweGQgPDwgNCkKKyNkZWZpbmUgVFNDMjAwN19NRUFTVVJFX1oxCQkoMHhlIDw8IDQpCisjZGVmaW5lIFRTQzIwMDdfTUVBU1VSRV9aMgkJKDB4ZiA8PCA0KQorCisjZGVmaW5lIFRTQzIwMDdfUE9XRVJfT0ZGX0lSUV9FTgkoMHgwIDw8IDIpCisjZGVmaW5lIFRTQzIwMDdfQURDX09OX0lSUV9ESVMwCQkoMHgxIDw8IDIpCisjZGVmaW5lIFRTQzIwMDdfQURDX09GRl9JUlFfRU4JCSgweDIgPDwgMikKKyNkZWZpbmUgVFNDMjAwN19BRENfT05fSVJRX0RJUzEJCSgweDMgPDwgMikKKworI2RlZmluZSBUU0MyMDA3XzEyQklUCQkJKDB4MCA8PCAxKQorI2RlZmluZSBUU0MyMDA3XzhCSVQJCQkoMHgxIDw8IDEpCisKKyNkZWZpbmUJTUFYXzEyQklUCQkJKCgxIDw8IDEyKSAtIDEpCisKKyNkZWZpbmUgQURDX09OXzEyQklUCShUU0MyMDA3XzEyQklUIHwgVFNDMjAwN19BRENfT05fSVJRX0RJUzApCisKKyNkZWZpbmUgUkVBRF9ZCQkoQURDX09OXzEyQklUIHwgVFNDMjAwN19NRUFTVVJFX1kpCisjZGVmaW5lIFJFQURfWjEJCShBRENfT05fMTJCSVQgfCBUU0MyMDA3X01FQVNVUkVfWjEpCisjZGVmaW5lIFJFQURfWjIJCShBRENfT05fMTJCSVQgfCBUU0MyMDA3X01FQVNVUkVfWjIpCisjZGVmaW5lIFJFQURfWAkJKEFEQ19PTl8xMkJJVCB8IFRTQzIwMDdfTUVBU1VSRV9YKQorI2RlZmluZSBQV1JET1dOCQkoVFNDMjAwN18xMkJJVCB8IFRTQzIwMDdfUE9XRVJfT0ZGX0lSUV9FTikKKworc3RydWN0IHRzX2V2ZW50IHsKKwl1MTYJeDsKKwl1MTYJeTsKKwl1MTYJejEsIHoyOworfTsKKworc3RydWN0IHRzYzIwMDcgeworCXN0cnVjdCBpbnB1dF9kZXYJKmlucHV0OworCWNoYXIJCQlwaHlzWzMyXTsKKwlzdHJ1Y3QgaHJ0aW1lcgkJdGltZXI7CisJc3RydWN0IHRzX2V2ZW50CQl0YzsKKworCXN0cnVjdCBpMmNfY2xpZW50CSpjbGllbnQ7CisKKwlzcGlubG9ja190CQlsb2NrOworCisJdTE2CQkJbW9kZWw7CisJdTE2CQkJeF9wbGF0ZV9vaG1zOworCisJdW5zaWduZWQJCXBlbmRvd247CisJaW50CQkJaXJxOworCisJaW50CQkJKCpnZXRfcGVuZG93bl9zdGF0ZSkodm9pZCk7CisJdm9pZAkJCSgqY2xlYXJfcGVuaXJxKSh2b2lkKTsKK307CisKK3N0YXRpYyBpbmxpbmUgaW50IHRzYzIwMDdfeGZlcihzdHJ1Y3QgdHNjMjAwNyAqdHNjLCB1OCBjbWQpCit7CisJczMyIGRhdGE7CisJdTE2IHZhbDsKKworCWRhdGEgPSBpMmNfc21idXNfcmVhZF93b3JkX2RhdGEodHNjLT5jbGllbnQsIGNtZCk7CisJaWYgKGRhdGEgPCAwKSB7CisJCWRldl9lcnIoJnRzYy0+Y2xpZW50LT5kZXYsICJpMmMgaW8gZXJyb3I6ICVkXG4iLCBkYXRhKTsKKwkJcmV0dXJuIGRhdGE7CisJfQorCisJLyogVGhlIHByb3RvY29sIGFuZCByYXcgZGF0YSBmb3JtYXQgZnJvbSBpMmMgaW50ZXJmYWNlOgorCSAqIFMgQWRkciBXciBbQV0gQ29tbSBbQV0gUyBBZGRyIFJkIFtBXSBbRGF0YUxvd10gQSBbRGF0YUhpZ2hdIE5BIFAKKwkgKiBXaGVyZSBEYXRhTG93IGhhcyBbRDExLUQ0XSwgRGF0YUhpZ2ggaGFzIFtEMy1EMCA8PCA0IHwgRHVtbXkgNGJpdF0uCisJICovCisJdmFsID0gc3dhYjE2KGRhdGEpID4+IDQ7CisKKwlkZXZfZGJnKCZ0c2MtPmNsaWVudC0+ZGV2LCAiZGF0YTogMHgleCwgdmFsOiAweCV4XG4iLCBkYXRhLCB2YWwpOworCisJcmV0dXJuIHZhbDsKK30KKworc3RhdGljIHZvaWQgdHNjMjAwN19zZW5kX2V2ZW50KHZvaWQgKnRzYykKK3sKKwlzdHJ1Y3QgdHNjMjAwNwkqdHMgPSB0c2M7CisJdTMyCQlydDsKKwl1MTYJCXgsIHksIHoxLCB6MjsKKworCXggPSB0cy0+dGMueDsKKwl5ID0gdHMtPnRjLnk7CisJejEgPSB0cy0+dGMuejE7CisJejIgPSB0cy0+dGMuejI7CisKKwkvKiByYW5nZSBmaWx0ZXJpbmcgKi8KKwlpZiAoeCA9PSBNQVhfMTJCSVQpCisJCXggPSAwOworCisJaWYgKGxpa2VseSh4ICYmIHoxKSkgeworCQkvKiBjb21wdXRlIHRvdWNoIHByZXNzdXJlIHJlc2lzdGFuY2UgdXNpbmcgZXF1YXRpb24gIzEgKi8KKwkJcnQgPSB6MjsKKwkJcnQgLT0gejE7CisJCXJ0ICo9IHg7CisJCXJ0ICo9IHRzLT54X3BsYXRlX29obXM7CisJCXJ0IC89IHoxOworCQlydCA9IChydCArIDIwNDcpID4+IDEyOworCX0gZWxzZQorCQlydCA9IDA7CisKKwkvKiBTYW1wbGUgZm91bmQgaW5jb25zaXN0ZW50IGJ5IGRlYm91bmNpbmcgb3IgcHJlc3N1cmUgaXMgYmV5b25kCisJICogdGhlIG1heGltdW0uIERvbid0IHJlcG9ydCBpdCB0byB1c2VyIHNwYWNlLCByZXBlYXQgYXQgbGVhc3QKKwkgKiBvbmNlIG1vcmUgdGhlIG1lYXN1cmVtZW50CisJICovCisJaWYgKHJ0ID4gTUFYXzEyQklUKSB7CisJCWRldl9kYmcoJnRzLT5jbGllbnQtPmRldiwgImlnbm9yZWQgcHJlc3N1cmUgJWRcbiIsIHJ0KTsKKworCQlocnRpbWVyX3N0YXJ0KCZ0cy0+dGltZXIsIGt0aW1lX3NldCgwLCBUU19QT0xMX1BFUklPRCksCisJCQkgICAgICBIUlRJTUVSX01PREVfUkVMKTsKKwkJcmV0dXJuOworCX0KKworCS8qIE5PVEU6IFdlIGNhbid0IHJlbHkgb24gdGhlIHByZXNzdXJlIHRvIGRldGVybWluZSB0aGUgcGVuIGRvd24KKwkgKiBzdGF0ZSwgZXZlbiB0aGlzIGNvbnRyb2xsZXIgaGFzIGEgcHJlc3N1cmUgc2Vuc29yLiAgVGhlIHByZXNzdXJlCisJICogdmFsdWUgY2FuIGZsdWN0dWF0ZSBmb3IgcXVpdGUgYSB3aGlsZSBhZnRlciBsaWZ0aW5nIHRoZSBwZW4gYW5kCisJICogaW4gc29tZSBjYXNlcyBtYXkgbm90IGV2ZW4gc2V0dGxlIGF0IHRoZSBleHBlY3RlZCB2YWx1ZS4KKwkgKgorCSAqIFRoZSBvbmx5IHNhZmUgd2F5IHRvIGNoZWNrIGZvciB0aGUgcGVuIHVwIGNvbmRpdGlvbiBpcyBpbiB0aGUKKwkgKiB0aW1lciBieSByZWFkaW5nIHRoZSBwZW4gc2lnbmFsIHN0YXRlIChpdCdzIGEgR1BJTyBfYW5kXyBJUlEpLgorCSAqLworCWlmIChydCkgeworCQlzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dCA9IHRzLT5pbnB1dDsKKworCQlpZiAoIXRzLT5wZW5kb3duKSB7CisJCQlkZXZfZGJnKCZ0cy0+Y2xpZW50LT5kZXYsICJET1dOXG4iKTsKKworCQkJaW5wdXRfcmVwb3J0X2tleShpbnB1dCwgQlROX1RPVUNILCAxKTsKKwkJCXRzLT5wZW5kb3duID0gMTsKKwkJfQorCisJCWlucHV0X3JlcG9ydF9hYnMoaW5wdXQsIEFCU19YLCB4KTsKKwkJaW5wdXRfcmVwb3J0X2FicyhpbnB1dCwgQUJTX1ksIHkpOworCQlpbnB1dF9yZXBvcnRfYWJzKGlucHV0LCBBQlNfUFJFU1NVUkUsIHJ0KTsKKworCQlpbnB1dF9zeW5jKGlucHV0KTsKKworCQlkZXZfZGJnKCZ0cy0+Y2xpZW50LT5kZXYsICJwb2ludCglNGQsJTRkKSwgcHJlc3N1cmUgKCU0dSlcbiIsCisJCQl4LCB5LCBydCk7CisJfQorCisJaHJ0aW1lcl9zdGFydCgmdHMtPnRpbWVyLCBrdGltZV9zZXQoMCwgVFNfUE9MTF9QRVJJT0QpLAorCQkJSFJUSU1FUl9NT0RFX1JFTCk7Cit9CisKK3N0YXRpYyBpbnQgdHNjMjAwN19yZWFkX3ZhbHVlcyhzdHJ1Y3QgdHNjMjAwNyAqdHNjKQoreworCS8qIHktIHN0aWxsIG9uOyB0dXJuIG9uIG9ubHkgeSsgKGFuZCBBREMpICovCisJdHNjLT50Yy55ID0gdHNjMjAwN194ZmVyKHRzYywgUkVBRF9ZKTsKKworCS8qIHR1cm4geS0gb2ZmLCB4KyBvbiwgdGhlbiBsZWF2ZSBpbiBsb3dwb3dlciAqLworCXRzYy0+dGMueCA9IHRzYzIwMDdfeGZlcih0c2MsIFJFQURfWCk7CisKKwkvKiB0dXJuIHkrIG9mZiwgeC0gb247IHdlJ2xsIHVzZSBmb3JtdWxhICMxICovCisJdHNjLT50Yy56MSA9IHRzYzIwMDdfeGZlcih0c2MsIFJFQURfWjEpOworCXRzYy0+dGMuejIgPSB0c2MyMDA3X3hmZXIodHNjLCBSRUFEX1oyKTsKKworCS8qIHBvd2VyIGRvd24gKi8KKwl0c2MyMDA3X3hmZXIodHNjLCBQV1JET1dOKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgZW51bSBocnRpbWVyX3Jlc3RhcnQgdHNjMjAwN190aW1lcihzdHJ1Y3QgaHJ0aW1lciAqaGFuZGxlKQoreworCXN0cnVjdCB0c2MyMDA3ICp0cyA9IGNvbnRhaW5lcl9vZihoYW5kbGUsIHN0cnVjdCB0c2MyMDA3LCB0aW1lcik7CisKKwlzcGluX2xvY2tfaXJxKCZ0cy0+bG9jayk7CisKKwlpZiAodW5saWtlbHkoIXRzLT5nZXRfcGVuZG93bl9zdGF0ZSgpICYmIHRzLT5wZW5kb3duKSkgeworCQlzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dCA9IHRzLT5pbnB1dDsKKworCQlkZXZfZGJnKCZ0cy0+Y2xpZW50LT5kZXYsICJVUFxuIik7CisKKwkJaW5wdXRfcmVwb3J0X2tleShpbnB1dCwgQlROX1RPVUNILCAwKTsKKwkJaW5wdXRfcmVwb3J0X2FicyhpbnB1dCwgQUJTX1BSRVNTVVJFLCAwKTsKKwkJaW5wdXRfc3luYyhpbnB1dCk7CisKKwkJdHMtPnBlbmRvd24gPSAwOworCQllbmFibGVfaXJxKHRzLT5pcnEpOworCX0gZWxzZSB7CisJCS8qIHBlbiBpcyBzdGlsbCBkb3duLCBjb250aW51ZSB3aXRoIHRoZSBtZWFzdXJlbWVudCAqLworCQlkZXZfZGJnKCZ0cy0+Y2xpZW50LT5kZXYsICJwZW4gaXMgc3RpbGwgZG93blxuIik7CisKKwkJdHNjMjAwN19yZWFkX3ZhbHVlcyh0cyk7CisJCXRzYzIwMDdfc2VuZF9ldmVudCh0cyk7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxKCZ0cy0+bG9jayk7CisKKwlyZXR1cm4gSFJUSU1FUl9OT1JFU1RBUlQ7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCB0c2MyMDA3X2lycShpbnQgaXJxLCB2b2lkICpoYW5kbGUpCit7CisJc3RydWN0IHRzYzIwMDcgKnRzID0gaGFuZGxlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdHMtPmxvY2ssIGZsYWdzKTsKKworCWlmIChsaWtlbHkodHMtPmdldF9wZW5kb3duX3N0YXRlKCkpKSB7CisJCWRpc2FibGVfaXJxKHRzLT5pcnEpOworCQlocnRpbWVyX3N0YXJ0KCZ0cy0+dGltZXIsIGt0aW1lX3NldCgwLCBUU19QT0xMX0RFTEFZKSwKKwkJCQkJSFJUSU1FUl9NT0RFX1JFTCk7CisJfQorCisJaWYgKHRzLT5jbGVhcl9wZW5pcnEpCisJCXRzLT5jbGVhcl9wZW5pcnEoKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRzLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpbnQgdHNjMjAwN19wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCQkJY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQoreworCXN0cnVjdCB0c2MyMDA3ICp0czsKKwlzdHJ1Y3QgdHNjMjAwN19wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IHBkYXRhID0gY2xpZW50LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dF9kZXY7CisJaW50IGVycjsKKworCWlmICghcGRhdGEpIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJwbGF0Zm9ybSBkYXRhIGlzIHJlcXVpcmVkIVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoY2xpZW50LT5hZGFwdGVyLAorCQkJCSAgICAgSTJDX0ZVTkNfU01CVVNfUkVBRF9XT1JEX0RBVEEpKQorCQlyZXR1cm4gLUVJTzsKKworCXRzID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHRzYzIwMDcpLCBHRlBfS0VSTkVMKTsKKwlpbnB1dF9kZXYgPSBpbnB1dF9hbGxvY2F0ZV9kZXZpY2UoKTsKKwlpZiAoIXRzIHx8ICFpbnB1dF9kZXYpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBlcnJfZnJlZV9tZW07CisJfQorCisJdHMtPmNsaWVudCA9IGNsaWVudDsKKwlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCB0cyk7CisKKwl0cy0+aW5wdXQgPSBpbnB1dF9kZXY7CisKKwlocnRpbWVyX2luaXQoJnRzLT50aW1lciwgQ0xPQ0tfTU9OT1RPTklDLCBIUlRJTUVSX01PREVfUkVMKTsKKwl0cy0+dGltZXIuZnVuY3Rpb24gPSB0c2MyMDA3X3RpbWVyOworCisJc3Bpbl9sb2NrX2luaXQoJnRzLT5sb2NrKTsKKworCXRzLT5tb2RlbCAgICAgICAgICAgICA9IHBkYXRhLT5tb2RlbDsKKwl0cy0+eF9wbGF0ZV9vaG1zICAgICAgPSBwZGF0YS0+eF9wbGF0ZV9vaG1zOworCXRzLT5nZXRfcGVuZG93bl9zdGF0ZSA9IHBkYXRhLT5nZXRfcGVuZG93bl9zdGF0ZTsKKwl0cy0+Y2xlYXJfcGVuaXJxICAgICAgPSBwZGF0YS0+Y2xlYXJfcGVuaXJxOworCisJcGRhdGEtPmluaXRfcGxhdGZvcm1faHcoKTsKKworCXNucHJpbnRmKHRzLT5waHlzLCBzaXplb2YodHMtPnBoeXMpLCAiJXMvaW5wdXQwIiwgY2xpZW50LT5kZXYuYnVzX2lkKTsKKworCWlucHV0X2Rldi0+bmFtZSA9ICJUU0MyMDA3IFRvdWNoc2NyZWVuIjsKKwlpbnB1dF9kZXYtPnBoeXMgPSB0cy0+cGh5czsKKwlpbnB1dF9kZXYtPmlkLmJ1c3R5cGUgPSBCVVNfSTJDOworCisJaW5wdXRfZGV2LT5ldmJpdFswXSA9IEJJVF9NQVNLKEVWX0tFWSkgfCBCSVRfTUFTSyhFVl9BQlMpOworCWlucHV0X2Rldi0+a2V5Yml0W0JJVF9XT1JEKEJUTl9UT1VDSCldID0gQklUX01BU0soQlROX1RPVUNIKTsKKworCWlucHV0X3NldF9hYnNfcGFyYW1zKGlucHV0X2RldiwgQUJTX1gsIDAsIE1BWF8xMkJJVCwgMCwgMCk7CisJaW5wdXRfc2V0X2Fic19wYXJhbXMoaW5wdXRfZGV2LCBBQlNfWSwgMCwgTUFYXzEyQklULCAwLCAwKTsKKwlpbnB1dF9zZXRfYWJzX3BhcmFtcyhpbnB1dF9kZXYsIEFCU19QUkVTU1VSRSwgMCwgTUFYXzEyQklULCAwLCAwKTsKKworCXRzYzIwMDdfcmVhZF92YWx1ZXModHMpOworCisJdHMtPmlycSA9IGNsaWVudC0+aXJxOworCisJZXJyID0gcmVxdWVzdF9pcnEodHMtPmlycSwgdHNjMjAwN19pcnEsIDAsCisJCQljbGllbnQtPmRldi5kcml2ZXItPm5hbWUsIHRzKTsKKwlpZiAoZXJyIDwgMCkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgImlycSAlZCBidXN5P1xuIiwgdHMtPmlycSk7CisJCWdvdG8gZXJyX2ZyZWVfbWVtOworCX0KKworCWVyciA9IGlucHV0X3JlZ2lzdGVyX2RldmljZShpbnB1dF9kZXYpOworCWlmIChlcnIpCisJCWdvdG8gZXJyX2ZyZWVfaXJxOworCisJZGV2X2luZm8oJmNsaWVudC0+ZGV2LCAicmVnaXN0ZXJlZCB3aXRoIGlycSAoJWQpXG4iLCB0cy0+aXJxKTsKKworCXJldHVybiAwOworCisgZXJyX2ZyZWVfaXJxOgorCWZyZWVfaXJxKHRzLT5pcnEsIHRzKTsKKwlocnRpbWVyX2NhbmNlbCgmdHMtPnRpbWVyKTsKKyBlcnJfZnJlZV9tZW06CisJaW5wdXRfZnJlZV9kZXZpY2UoaW5wdXRfZGV2KTsKKwlrZnJlZSh0cyk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCB0c2MyMDA3X3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXN0cnVjdCB0c2MyMDA3CSp0cyA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXN0cnVjdCB0c2MyMDA3X3BsYXRmb3JtX2RhdGEgKnBkYXRhOworCisJcGRhdGEgPSBjbGllbnQtPmRldi5wbGF0Zm9ybV9kYXRhOworCXBkYXRhLT5leGl0X3BsYXRmb3JtX2h3KCk7CisKKwlmcmVlX2lycSh0cy0+aXJxLCB0cyk7CisJaHJ0aW1lcl9jYW5jZWwoJnRzLT50aW1lcik7CisJaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2UodHMtPmlucHV0KTsKKwlrZnJlZSh0cyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBpMmNfZGV2aWNlX2lkIHRzYzIwMDdfaWR0YWJsZVtdID0geworCXsgInRzYzIwMDciLCAwIH0sCisJeyB9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgdHNjMjAwN19pZHRhYmxlKTsKKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIHRzYzIwMDdfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCQkubmFtZQk9ICJ0c2MyMDA3IgorCX0sCisJLmlkX3RhYmxlCT0gdHNjMjAwN19pZHRhYmxlLAorCS5wcm9iZQkJPSB0c2MyMDA3X3Byb2JlLAorCS5yZW1vdmUJCT0gdHNjMjAwN19yZW1vdmUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCB0c2MyMDA3X2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaTJjX2FkZF9kcml2ZXIoJnRzYzIwMDdfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHRzYzIwMDdfZXhpdCh2b2lkKQoreworCWkyY19kZWxfZHJpdmVyKCZ0c2MyMDA3X2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHRzYzIwMDdfaW5pdCk7Cittb2R1bGVfZXhpdCh0c2MyMDA3X2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJLd2FuZ3dvbyBMZWUgPGt3bGVlQG10ZWt2aXNpb24uY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJUU0MyMDA3IFRvdWNoU2NyZWVuIERyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi91c2J0b3VjaHNjcmVlbi5jIGIvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi91c2J0b3VjaHNjcmVlbi5jCmluZGV4IGZkZDY0NWMuLjUwODBiMjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vdXNidG91Y2hzY3JlZW4uYworKysgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL3VzYnRvdWNoc2NyZWVuLmMKQEAgLTQyNCw3ICs0MjQsNyBAQAogCSAgICAgICAgICAgICAgICAgICAgICAwLCAwLCBidWYsIDIsIFVTQl9DVFJMX1NFVF9USU1FT1VUKTsKIAlpZiAocmV0IDwgMCkKIAkJZ290byBlcnJfb3V0OwotCWlmIChidWZbMF0gIT0gMHgwNiB8fCBidWZbMV0gIT0gMHgwMCkgeworCWlmIChidWZbMF0gIT0gMHgwNikgewogCQlyZXQgPSAtRU5PREVWOwogCQlnb3RvIGVycl9vdXQ7CiAJfQpAQCAtNDM3LDggKzQzNyw3IEBACiAJICAgICAgICAgICAgICAgICAgICAgIFRTQzEwX1JBVEVfMTUwLCAwLCBidWYsIDIsIFVTQl9DVFJMX1NFVF9USU1FT1VUKTsKIAlpZiAocmV0IDwgMCkKIAkJZ290byBlcnJfb3V0OwotCWlmICgoYnVmWzBdICE9IDB4MDYgfHwgYnVmWzFdICE9IDB4MDApICYmCi0JICAgIChidWZbMF0gIT0gMHgxNSB8fCBidWZbMV0gIT0gMHgwMSkpIHsKKwlpZiAoKGJ1ZlswXSAhPSAweDA2KSAmJiAoYnVmWzBdICE9IDB4MTUgfHwgYnVmWzFdICE9IDB4MDEpKSB7CiAJCXJldCA9IC1FTk9ERVY7CiAJCWdvdG8gZXJyX291dDsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL3dhY29tX3c4MDAxLmMgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL3dhY29tX3c4MDAxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmYzM2EwMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vd2Fjb21fdzgwMDEuYwpAQCAtMCwwICsxLDMyNSBAQAorLyoKKyAqIFdhY29tIFc4MDAxIHBlbmFibGVkIHNlcmlhbCB0b3VjaHNjcmVlbiBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSmF5YSBLdW1hcgorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiBTZWUgdGhlIGZpbGUgQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIExheW91dCBiYXNlZCBvbiBFbG8gc2VyaWFsIHRvdWNoc2NyZWVuIGRyaXZlciBieSBWb2p0ZWNoIFBhdmxpaworICovCisKKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlvLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CisKKyNkZWZpbmUgRFJJVkVSX0RFU0MJIldhY29tIFc4MDAxIHNlcmlhbCB0b3VjaHNjcmVlbiBkcml2ZXIiCisKK01PRFVMRV9BVVRIT1IoIkpheWEgS3VtYXIgPGpheWFrdW1hci5sa21sQGdtYWlsLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTihEUklWRVJfREVTQyk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKy8qCisgKiBEZWZpbml0aW9ucyAmIGdsb2JhbCBhcnJheXMuCisgKi8KKworI2RlZmluZSBXODAwMV9NQVhfTEVOR1RICTExCisjZGVmaW5lIFc4MDAxX1BBQ0tFVF9MRU4JMTEKKyNkZWZpbmUgVzgwMDFfTEVBRF9NQVNLIDB4ODAKKyNkZWZpbmUgVzgwMDFfTEVBRF9CWVRFIDB4ODAKKyNkZWZpbmUgVzgwMDFfVEFCX01BU0sgMHg0MAorI2RlZmluZSBXODAwMV9UQUJfQllURSAweDQwCisKKyNkZWZpbmUgVzgwMDFfUVVFUllfUEFDS0VUIDB4MjAKKworc3RydWN0IHc4MDAxX2Nvb3JkIHsKKwl1OCByZHk7CisJdTggdHN3OworCXU4IGYxOworCXU4IGYyOworCXUxNiB4OworCXUxNiB5OworCXUxNiBwZW5fcHJlc3N1cmU7CisJdTggdGlsdF94OworCXU4IHRpbHRfeTsKK307CisKKy8qCisgKiBQZXItdG91Y2hzY3JlZW4gZGF0YS4KKyAqLworCitzdHJ1Y3QgdzgwMDEgeworCXN0cnVjdCBpbnB1dF9kZXYgKmRldjsKKwlzdHJ1Y3Qgc2VyaW8gKnNlcmlvOworCXN0cnVjdCBtdXRleCBjbWRfbXV0ZXg7CisJc3RydWN0IGNvbXBsZXRpb24gY21kX2RvbmU7CisJaW50IGlkOworCWludCBpZHg7CisJdW5zaWduZWQgY2hhciBleHBlY3RlZF9wYWNrZXQ7CisJdW5zaWduZWQgY2hhciBkYXRhW1c4MDAxX01BWF9MRU5HVEhdOworCXVuc2lnbmVkIGNoYXIgcmVzcG9uc2VbVzgwMDFfUEFDS0VUX0xFTl07CisJY2hhciBwaHlzWzMyXTsKK307CisKK3N0YXRpYyBpbnQgcGFyc2VfZGF0YSh1OCAqZGF0YSwgc3RydWN0IHc4MDAxX2Nvb3JkICpjb29yZCkKK3sKKwljb29yZC0+cmR5ID0gZGF0YVswXSAmIDB4MjA7CisJY29vcmQtPnRzdyA9IGRhdGFbMF0gJiAweDAxOworCWNvb3JkLT5mMSA9IGRhdGFbMF0gJiAweDAyOworCWNvb3JkLT5mMiA9IGRhdGFbMF0gJiAweDA0OworCisJY29vcmQtPnggPSAoZGF0YVsxXSAmIDB4N0YpIDw8IDk7CisJY29vcmQtPnggfD0gKGRhdGFbMl0gJiAweDdGKSA8PCAyOworCWNvb3JkLT54IHw9IChkYXRhWzZdICYgMHg2MCkgPj4gNTsKKworCWNvb3JkLT55ID0gKGRhdGFbM10gJiAweDdGKSA8PCA5OworCWNvb3JkLT55IHw9IChkYXRhWzRdICYgMHg3RikgPDwgMjsKKwljb29yZC0+eSB8PSAoZGF0YVs2XSAmIDB4MTgpID4+IDM7CisKKwljb29yZC0+cGVuX3ByZXNzdXJlID0gZGF0YVs1XSAmIDB4N0Y7CisJY29vcmQtPnBlbl9wcmVzc3VyZSB8PSAoZGF0YVs2XSAmIDB4MDcpIDw8IDcgOworCisJY29vcmQtPnRpbHRfeCA9IGRhdGFbN10gJiAweDdGOworCWNvb3JkLT50aWx0X3kgPSBkYXRhWzhdICYgMHg3RjsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB3ODAwMV9wcm9jZXNzX2RhdGEoc3RydWN0IHc4MDAxICp3ODAwMSwgdW5zaWduZWQgY2hhciBkYXRhKQoreworCXN0cnVjdCBpbnB1dF9kZXYgKmRldiA9IHc4MDAxLT5kZXY7CisJdTggdG1wOworCXN0cnVjdCB3ODAwMV9jb29yZCBjb29yZDsKKworCXc4MDAxLT5kYXRhW3c4MDAxLT5pZHhdID0gZGF0YTsKKwlzd2l0Y2ggKHc4MDAxLT5pZHgrKykgeworCWNhc2UgMDoKKwkJaWYgKChkYXRhICYgVzgwMDFfTEVBRF9NQVNLKSAhPSBXODAwMV9MRUFEX0JZVEUpIHsKKwkJCXByX2RlYnVnKCJ3ODAwMTogdW5zeW5jaHJvbml6ZWQgZGF0YTogMHglMDJ4XG4iLCBkYXRhKTsKKwkJCXc4MDAxLT5pZHggPSAwOworCQl9CisJCWJyZWFrOworCWNhc2UgODoKKwkJdG1wID0gdzgwMDEtPmRhdGFbMF0gJiBXODAwMV9UQUJfTUFTSzsKKwkJaWYgKHVubGlrZWx5KHRtcCA9PSBXODAwMV9UQUJfQllURSkpCisJCQlicmVhazsKKwkJdzgwMDEtPmlkeCA9IDA7CisJCW1lbXNldCgmY29vcmQsIDAsIHNpemVvZihjb29yZCkpOworCQlwYXJzZV9kYXRhKHc4MDAxLT5kYXRhLCAmY29vcmQpOworCQlpbnB1dF9yZXBvcnRfYWJzKGRldiwgQUJTX1gsIGNvb3JkLngpOworCQlpbnB1dF9yZXBvcnRfYWJzKGRldiwgQUJTX1ksIGNvb3JkLnkpOworCQlpbnB1dF9yZXBvcnRfYWJzKGRldiwgQUJTX1BSRVNTVVJFLCBjb29yZC5wZW5fcHJlc3N1cmUpOworCQlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX1RPVUNILCBjb29yZC50c3cpOworCQlpbnB1dF9zeW5jKGRldik7CisJCWJyZWFrOworCWNhc2UgMTA6CisJCXc4MDAxLT5pZHggPSAwOworCQltZW1jcHkodzgwMDEtPnJlc3BvbnNlLCAmdzgwMDEtPmRhdGEsIFc4MDAxX1BBQ0tFVF9MRU4pOworCQl3ODAwMS0+ZXhwZWN0ZWRfcGFja2V0ID0gVzgwMDFfUVVFUllfUEFDS0VUOworCQljb21wbGV0ZSgmdzgwMDEtPmNtZF9kb25lKTsKKwkJYnJlYWs7CisJfQorfQorCisKK3N0YXRpYyBpcnFyZXR1cm5fdCB3ODAwMV9pbnRlcnJ1cHQoc3RydWN0IHNlcmlvICpzZXJpbywKKwkJdW5zaWduZWQgY2hhciBkYXRhLCB1bnNpZ25lZCBpbnQgZmxhZ3MpCit7CisJc3RydWN0IHc4MDAxICp3ODAwMSA9IHNlcmlvX2dldF9kcnZkYXRhKHNlcmlvKTsKKworCXc4MDAxX3Byb2Nlc3NfZGF0YSh3ODAwMSwgZGF0YSk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpbnQgdzgwMDFfYXN5bmNfY29tbWFuZChzdHJ1Y3QgdzgwMDEgKnc4MDAxLCB1bnNpZ25lZCBjaGFyICpwYWNrZXQsCisJCQkJCWludCBsZW4pCit7CisJaW50IHJjID0gLTE7CisJaW50IGk7CisKKwltdXRleF9sb2NrKCZ3ODAwMS0+Y21kX211dGV4KTsKKworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworCQlpZiAoc2VyaW9fd3JpdGUodzgwMDEtPnNlcmlvLCBwYWNrZXRbaV0pKQorCQkJZ290byBvdXQ7CisJfQorCXJjID0gMDsKKworb3V0OgorCW11dGV4X3VubG9jaygmdzgwMDEtPmNtZF9tdXRleCk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IHc4MDAxX2NvbW1hbmQoc3RydWN0IHc4MDAxICp3ODAwMSwgdW5zaWduZWQgY2hhciAqcGFja2V0LCBpbnQgbGVuKQoreworCWludCByYyA9IC0xOworCWludCBpOworCisJbXV0ZXhfbG9jaygmdzgwMDEtPmNtZF9tdXRleCk7CisKKwlzZXJpb19wYXVzZV9yeCh3ODAwMS0+c2VyaW8pOworCWluaXRfY29tcGxldGlvbigmdzgwMDEtPmNtZF9kb25lKTsKKwlzZXJpb19jb250aW51ZV9yeCh3ODAwMS0+c2VyaW8pOworCisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisJCWlmIChzZXJpb193cml0ZSh3ODAwMS0+c2VyaW8sIHBhY2tldFtpXSkpCisJCQlnb3RvIG91dDsKKwl9CisKKwl3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJnc4MDAxLT5jbWRfZG9uZSwgSFopOworCisJaWYgKHc4MDAxLT5leHBlY3RlZF9wYWNrZXQgPT0gVzgwMDFfUVVFUllfUEFDS0VUKSB7CisJCS8qIFdlIGFyZSBiYWNrIGluIHJlcG9ydGluZyBtb2RlLCB0aGUgcXVlcnkgd2FzIEFDS2VkICovCisJCW1lbWNweShwYWNrZXQsIHc4MDAxLT5yZXNwb25zZSwgVzgwMDFfUEFDS0VUX0xFTik7CisJCXJjID0gMDsKKwl9CisKK291dDoKKwltdXRleF91bmxvY2soJnc4MDAxLT5jbWRfbXV0ZXgpOworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCB3ODAwMV9zZXR1cChzdHJ1Y3QgdzgwMDEgKnc4MDAxKQoreworCXN0cnVjdCB3ODAwMV9jb29yZCBjb29yZDsKKwlzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYgPSB3ODAwMS0+ZGV2OworCXVuc2lnbmVkIGNoYXIgc3RhcnRbMV0gPSB7ICcxJyB9OworCXVuc2lnbmVkIGNoYXIgcXVlcnlbMTFdID0geyAnKicgfTsKKworCWlmICh3ODAwMV9jb21tYW5kKHc4MDAxLCBxdWVyeSwgMSkpCisJCXJldHVybiAtMTsKKworCW1lbXNldCgmY29vcmQsIDAsIHNpemVvZihjb29yZCkpOworCXBhcnNlX2RhdGEocXVlcnksICZjb29yZCk7CisKKwlpbnB1dF9zZXRfYWJzX3BhcmFtcyhkZXYsIEFCU19YLCAwLCBjb29yZC54LCAwLCAwKTsKKwlpbnB1dF9zZXRfYWJzX3BhcmFtcyhkZXYsIEFCU19ZLCAwLCBjb29yZC55LCAwLCAwKTsKKwlpbnB1dF9zZXRfYWJzX3BhcmFtcyhkZXYsIEFCU19QUkVTU1VSRSwgMCwgY29vcmQucGVuX3ByZXNzdXJlLCAwLCAwKTsKKwlpbnB1dF9zZXRfYWJzX3BhcmFtcyhkZXYsIEFCU19USUxUX1gsIDAsIGNvb3JkLnRpbHRfeCwgMCwgMCk7CisJaW5wdXRfc2V0X2Fic19wYXJhbXMoZGV2LCBBQlNfVElMVF9ZLCAwLCBjb29yZC50aWx0X3ksIDAsIDApOworCisJaWYgKHc4MDAxX2FzeW5jX2NvbW1hbmQodzgwMDEsIHN0YXJ0LCAxKSkKKwkJcmV0dXJuIC0xOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiB3ODAwMV9kaXNjb25uZWN0KCkgaXMgdGhlIG9wcG9zaXRlIG9mIHc4MDAxX2Nvbm5lY3QoKQorICovCisKK3N0YXRpYyB2b2lkIHc4MDAxX2Rpc2Nvbm5lY3Qoc3RydWN0IHNlcmlvICpzZXJpbykKK3sKKwlzdHJ1Y3QgdzgwMDEgKnc4MDAxID0gc2VyaW9fZ2V0X2RydmRhdGEoc2VyaW8pOworCisJaW5wdXRfZ2V0X2RldmljZSh3ODAwMS0+ZGV2KTsKKwlpbnB1dF91bnJlZ2lzdGVyX2RldmljZSh3ODAwMS0+ZGV2KTsKKwlzZXJpb19jbG9zZShzZXJpbyk7CisJc2VyaW9fc2V0X2RydmRhdGEoc2VyaW8sIE5VTEwpOworCWlucHV0X3B1dF9kZXZpY2UodzgwMDEtPmRldik7CisJa2ZyZWUodzgwMDEpOworfQorCisvKgorICogdzgwMDFfY29ubmVjdCgpIGlzIHRoZSByb3V0aW5lIHRoYXQgaXMgY2FsbGVkIHdoZW4gc29tZW9uZSBhZGRzIGEKKyAqIG5ldyBzZXJpbyBkZXZpY2UgdGhhdCBzdXBwb3J0cyB0aGUgdzgwMDEgcHJvdG9jb2wgYW5kIHJlZ2lzdGVycyBpdCBhcworICogYW4gaW5wdXQgZGV2aWNlLgorICovCisKK3N0YXRpYyBpbnQgdzgwMDFfY29ubmVjdChzdHJ1Y3Qgc2VyaW8gKnNlcmlvLCBzdHJ1Y3Qgc2VyaW9fZHJpdmVyICpkcnYpCit7CisJc3RydWN0IHc4MDAxICp3ODAwMTsKKwlzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dF9kZXY7CisJaW50IGVycjsKKworCXc4MDAxID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHc4MDAxKSwgR0ZQX0tFUk5FTCk7CisJaW5wdXRfZGV2ID0gaW5wdXRfYWxsb2NhdGVfZGV2aWNlKCk7CisJaWYgKCF3ODAwMSB8fCAhaW5wdXRfZGV2KSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZmFpbDE7CisJfQorCisJdzgwMDEtPnNlcmlvID0gc2VyaW87CisJdzgwMDEtPmlkID0gc2VyaW8tPmlkLmlkOworCXc4MDAxLT5kZXYgPSBpbnB1dF9kZXY7CisJbXV0ZXhfaW5pdCgmdzgwMDEtPmNtZF9tdXRleCk7CisJaW5pdF9jb21wbGV0aW9uKCZ3ODAwMS0+Y21kX2RvbmUpOworCXNucHJpbnRmKHc4MDAxLT5waHlzLCBzaXplb2YodzgwMDEtPnBoeXMpLCAiJXMvaW5wdXQwIiwgc2VyaW8tPnBoeXMpOworCisJaW5wdXRfZGV2LT5uYW1lID0gIldhY29tIFc4MDAxIFBlbmFibGVkIFNlcmlhbCBUb3VjaFNjcmVlbiI7CisJaW5wdXRfZGV2LT5waHlzID0gdzgwMDEtPnBoeXM7CisJaW5wdXRfZGV2LT5pZC5idXN0eXBlID0gQlVTX1JTMjMyOworCWlucHV0X2Rldi0+aWQudmVuZG9yID0gU0VSSU9fVzgwMDE7CisJaW5wdXRfZGV2LT5pZC5wcm9kdWN0ID0gdzgwMDEtPmlkOworCWlucHV0X2Rldi0+aWQudmVyc2lvbiA9IDB4MDEwMDsKKwlpbnB1dF9kZXYtPmRldi5wYXJlbnQgPSAmc2VyaW8tPmRldjsKKworCWlucHV0X2Rldi0+ZXZiaXRbMF0gPSBCSVRfTUFTSyhFVl9LRVkpIHwgQklUX01BU0soRVZfQUJTKTsKKwlpbnB1dF9kZXYtPmtleWJpdFtCSVRfV09SRChCVE5fVE9VQ0gpXSA9IEJJVF9NQVNLKEJUTl9UT1VDSCk7CisKKwlzZXJpb19zZXRfZHJ2ZGF0YShzZXJpbywgdzgwMDEpOworCWVyciA9IHNlcmlvX29wZW4oc2VyaW8sIGRydik7CisJaWYgKGVycikKKwkJZ290byBmYWlsMjsKKworCWlmICh3ODAwMV9zZXR1cCh3ODAwMSkpCisJCWdvdG8gZmFpbDM7CisKKwllcnIgPSBpbnB1dF9yZWdpc3Rlcl9kZXZpY2UodzgwMDEtPmRldik7CisJaWYgKGVycikKKwkJZ290byBmYWlsMzsKKworCXJldHVybiAwOworCitmYWlsMzoKKwlzZXJpb19jbG9zZShzZXJpbyk7CitmYWlsMjoKKwlzZXJpb19zZXRfZHJ2ZGF0YShzZXJpbywgTlVMTCk7CitmYWlsMToKKwlpbnB1dF9mcmVlX2RldmljZShpbnB1dF9kZXYpOworCWtmcmVlKHc4MDAxKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgc3RydWN0IHNlcmlvX2RldmljZV9pZCB3ODAwMV9zZXJpb19pZHNbXSA9IHsKKwl7CisJCS50eXBlCT0gU0VSSU9fUlMyMzIsCisJCS5wcm90bwk9IFNFUklPX1c4MDAxLAorCQkuaWQJPSBTRVJJT19BTlksCisJCS5leHRyYQk9IFNFUklPX0FOWSwKKwl9LAorCXsgMCB9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHNlcmlvLCB3ODAwMV9zZXJpb19pZHMpOworCitzdGF0aWMgc3RydWN0IHNlcmlvX2RyaXZlciB3ODAwMV9kcnYgPSB7CisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gInc4MDAxIiwKKwl9LAorCS5kZXNjcmlwdGlvbgk9IERSSVZFUl9ERVNDLAorCS5pZF90YWJsZQk9IHc4MDAxX3NlcmlvX2lkcywKKwkuaW50ZXJydXB0CT0gdzgwMDFfaW50ZXJydXB0LAorCS5jb25uZWN0CT0gdzgwMDFfY29ubmVjdCwKKwkuZGlzY29ubmVjdAk9IHc4MDAxX2Rpc2Nvbm5lY3QsCit9OworCitzdGF0aWMgaW50IF9faW5pdCB3ODAwMV9pbml0KHZvaWQpCit7CisJcmV0dXJuIHNlcmlvX3JlZ2lzdGVyX2RyaXZlcigmdzgwMDFfZHJ2KTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHc4MDAxX2V4aXQodm9pZCkKK3sKKwlzZXJpb191bnJlZ2lzdGVyX2RyaXZlcigmdzgwMDFfZHJ2KTsKK30KKworbW9kdWxlX2luaXQodzgwMDFfaW5pdCk7Cittb2R1bGVfZXhpdCh3ODAwMV9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9jYXBpL2NhcGlkcnYuYyBiL2RyaXZlcnMvaXNkbi9jYXBpL2NhcGlkcnYuYwppbmRleCBkNWI0Y2MzLi42NTAxMjAyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vY2FwaS9jYXBpZHJ2LmMKKysrIGIvZHJpdmVycy9pc2RuL2NhcGkvY2FwaWRydi5jCkBAIC0xNTE5LDcgKzE1MTksNyBAQAogCQlpbnQgZGlnaXQyID0gMDsKIAkJaWYgKCFpc2RpZ2l0KCpzKSkgcmV0dXJuIC0zOwogCQl3aGlsZSAoaXNkaWdpdCgqcykpIHsgZGlnaXQxID0gZGlnaXQxKjEwICsgKCpzIC0gJzAnKTsgcysrOyB9Ci0JCWlmIChkaWdpdDEgPD0gMCAmJiBkaWdpdDEgPiAzMCkgcmV0dXJuIC00OworCQlpZiAoZGlnaXQxIDw9IDAgfHwgZGlnaXQxID4gMzApIHJldHVybiAtNDsKIAkJaWYgKCpzID09IDAgfHwgKnMgPT0gJywnIHx8ICpzID09ICcgJykgewogCQkJYm1hc2sgfD0gKDEgPDwgZGlnaXQxKTsKIAkJCWRpZ2l0MSA9IDA7CkBAIC0xNTMwLDcgKzE1MzAsNyBAQAogCQlzKys7CiAJCWlmICghaXNkaWdpdCgqcykpIHJldHVybiAtMzsKIAkJd2hpbGUgKGlzZGlnaXQoKnMpKSB7IGRpZ2l0MiA9IGRpZ2l0MioxMCArICgqcyAtICcwJyk7IHMrKzsgfQotCQlpZiAoZGlnaXQyIDw9IDAgJiYgZGlnaXQyID4gMzApIHJldHVybiAtNDsKKwkJaWYgKGRpZ2l0MiA8PSAwIHx8IGRpZ2l0MiA+IDMwKSByZXR1cm4gLTQ7CiAJCWlmICgqcyA9PSAwIHx8ICpzID09ICcsJyB8fCAqcyA9PSAnICcpIHsKIAkJCWlmIChkaWdpdDEgPiBkaWdpdDIpCiAJCQkJZm9yIChpID0gZGlnaXQyOyBpIDw9IGRpZ2l0MSA7IGkrKykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9jYXBpL2NhcGlmcy5jIGIvZHJpdmVycy9pc2RuL2NhcGkvY2FwaWZzLmMKaW5kZXggMGFhNjZlYy4uYjEyOTQwOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2NhcGkvY2FwaWZzLmMKKysrIGIvZHJpdmVycy9pc2RuL2NhcGkvY2FwaWZzLmMKQEAgLTExMSw4ICsxMTEsNiBAQAogCQlnb3RvIGZhaWw7CiAJaW5vZGUtPmlfaW5vID0gMTsKIAlpbm9kZS0+aV9tdGltZSA9IGlub2RlLT5pX2F0aW1lID0gaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUU7Ci0JaW5vZGUtPmlfYmxvY2tzID0gMDsKLQlpbm9kZS0+aV91aWQgPSBpbm9kZS0+aV9naWQgPSAwOwogCWlub2RlLT5pX21vZGUgPSBTX0lGRElSIHwgU19JUlVHTyB8IFNfSVhVR08gfCBTX0lXVVNSOwogCWlub2RlLT5pX29wID0gJnNpbXBsZV9kaXJfaW5vZGVfb3BlcmF0aW9uczsKIAlpbm9kZS0+aV9mb3AgPSAmc2ltcGxlX2Rpcl9vcGVyYXRpb25zOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2hhcmR3YXJlL2VpY29uL2RlYnVnbGliLmggYi9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvZWljb24vZGVidWdsaWIuaAppbmRleCAwMTY0MTBjLi44ZWE1ODc3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvZWljb24vZGVidWdsaWIuaAorKysgYi9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvZWljb24vZGVidWdsaWIuaApAQCAtMjM1LDcgKzIzNSw3IEBACiB0eXBlZGVmIHZvaWQgKCAqIERiZ0V2KSAgKHVuc2lnbmVkIHNob3J0LCB1bnNpZ25lZCBsb25nLCB2YV9saXN0KSA7CiB0eXBlZGVmIHZvaWQgKCAqIERiZ0lycSkgKHVuc2lnbmVkIHNob3J0LCBpbnQsIGNoYXIgKiwgdmFfbGlzdCkgOwogdHlwZWRlZiBzdHJ1Y3QgX0RiZ0hhbmRsZV8KLXsgY2hhciAgICBSZWdpc3RlcmVkIDsgLyogZHJpdmVyIHN1Y2Nlc3NmdWxsIHJlZ2lzdGVyZWQgKi8KK3sgY2hhciAgICBSZWdpc3RlcmVkIDsgLyogZHJpdmVyIHN1Y2Nlc3NmdWxseSByZWdpc3RlcmVkICovCiAjZGVmaW5lIERCR19IQU5ETEVfUkVHX05FVyAweDAxICAvKiB0aGlzIChuZXcpIHN0cnVjdHVyZSAgICAqLwogI2RlZmluZSBEQkdfSEFORExFX1JFR19PTEQgMHg3ZiAgLyogb2xkIHN0cnVjdHVyZSAoc2VlIGJlbG93KSAgKi8KICBjaGFyICAgIFZlcnNpb247ICAvKiB2ZXJzaW9uIG9mIHRoaXMgc3RydWN0dXJlICAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2hhcmR3YXJlL2VpY29uL29zXzRicmkuYyBiL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9laWNvbi9vc180YnJpLmMKaW5kZXggN2I0ZWMzZi4uYzk2NGI4ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2hhcmR3YXJlL2VpY29uL29zXzRicmkuYworKysgYi9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvZWljb24vb3NfNGJyaS5jCkBAIC05OTcsNyArOTk3LDcgQEAKIAlkaXZhX3hkaV9kaXNwbGF5X2FkYXB0ZXJfZmVhdHVyZXMoSW9BZGFwdGVyLT5BTnVtKTsKIAogCWZvciAoaSA9IDA7IGkgPCBJb0FkYXB0ZXItPnRhc2tzOyBpKyspIHsKLQkJREJHX0xPRygoIkEoJWQpICVzIGFkYXB0ZXIgc3VjY2Vzc2Z1bGwgc3RhcnRlZCIsCisJCURCR19MT0coKCJBKCVkKSAlcyBhZGFwdGVyIHN1Y2Nlc3NmdWxseSBzdGFydGVkIiwKIAkJCSBJb0FkYXB0ZXItPlF1YWRyb0xpc3QtPlF1YWRyb0FkYXB0ZXJbaV0tPkFOdW0sCiAJCQkgKElvQWRhcHRlci0+dGFza3MgPT0gMSkgPyAiQlJJIDIuMCIgOiAiNEJSSSIpKQogCQlkaXZhX3hkaV9kaWRkX3JlZ2lzdGVyX2FkYXB0ZXIoSW9BZGFwdGVyLT5RdWFkcm9MaXN0LT5RdWFkcm9BZGFwdGVyW2ldLT5BTnVtKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9laWNvbi9vc19icmkuYyBiL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9laWNvbi9vc19icmkuYwppbmRleCBmMzFiYmE1Li4wOGYwMTk5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvZWljb24vb3NfYnJpLmMKKysrIGIvZHJpdmVycy9pc2RuL2hhcmR3YXJlL2VpY29uL29zX2JyaS5jCkBAIC03MzYsNyArNzM2LDcgQEAKIAogCUlvQWRhcHRlci0+UHJvcGVydGllcy5GZWF0dXJlcyA9ICh3b3JkKSBmZWF0dXJlczsKIAlkaXZhX3hkaV9kaXNwbGF5X2FkYXB0ZXJfZmVhdHVyZXMoSW9BZGFwdGVyLT5BTnVtKTsKLQlEQkdfTE9HKCgiQSglZCkgQlJJIGFkYXB0ZXIgc3VjY2Vzc2Z1bGwgc3RhcnRlZCIsIElvQWRhcHRlci0+QU51bSkpCisJREJHX0xPRygoIkEoJWQpIEJSSSBhZGFwdGVyIHN1Y2Nlc3NmdWxseSBzdGFydGVkIiwgSW9BZGFwdGVyLT5BTnVtKSkKIAkgICAgLyoKIAkgICAgICAgUmVnaXN0ZXIgd2l0aCBESURECiAJICAgICAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2hhcmR3YXJlL2VpY29uL29zX3ByaS5jIGIvZHJpdmVycy9pc2RuL2hhcmR3YXJlL2VpY29uL29zX3ByaS5jCmluZGV4IDkwMzM1NjUuLjVkNjU0MDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9laWNvbi9vc19wcmkuYworKysgYi9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvZWljb24vb3NfcHJpLmMKQEAgLTUxMyw3ICs1MTMsNyBAQAogCiAJZGl2YV94ZGlfZGlzcGxheV9hZGFwdGVyX2ZlYXR1cmVzKElvQWRhcHRlci0+QU51bSk7CiAKLQlEQkdfTE9HKCgiQSglZCkgUFJJIGFkYXB0ZXIgc3VjY2Vzc2Z1bGwgc3RhcnRlZCIsIElvQWRhcHRlci0+QU51bSkpCisJREJHX0xPRygoIkEoJWQpIFBSSSBhZGFwdGVyIHN1Y2Nlc3NmdWxseSBzdGFydGVkIiwgSW9BZGFwdGVyLT5BTnVtKSkKIAkvKgogCSAgIFJlZ2lzdGVyIHdpdGggRElERAogCSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2h5c2RuL2h5c2RuX25ldC5jIGIvZHJpdmVycy9pc2RuL2h5c2RuL2h5c2RuX25ldC5jCmluZGV4IDdlZTViZDkuLjU3OTk3NGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9oeXNkbi9oeXNkbl9uZXQuYworKysgYi9kcml2ZXJzL2lzZG4vaHlzZG4vaHlzZG5fbmV0LmMKQEAgLTM4LDE2ICszOCwxMiBAQAogLyogaW5zaWRlIHRoZSBkZWZpbml0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHN0cnVjdCBuZXRfbG9jYWwgewotCXN0cnVjdCBuZXRfZGV2aWNlIG5ldGRldjsJLyogdGhlIG5ldHdvcmsgZGV2aWNlICovCi0Jc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7Ci0JLyogYWRkaXRpb25hbCB2YXJzIG1heSBiZSBhZGRlZCBoZXJlICovCi0JY2hhciBkZXZfbmFtZVs5XTsJLyogb3VyIG93biBkZXZpY2UgbmFtZSAqLwotCiAJLyogVHggY29udHJvbCBsb2NrLiAgVGhpcyBwcm90ZWN0cyB0aGUgdHJhbnNtaXQgYnVmZmVyIHJpbmcKIAkgKiBzdGF0ZSBhbG9uZyB3aXRoIHRoZSAidHggZnVsbCIgc3RhdGUgb2YgdGhlIGRyaXZlci4gIFRoaXMKIAkgKiBtZWFucyBhbGwgbmV0aWZfcXVldWUgZmxvdyBjb250cm9sIGFjdGlvbnMgYXJlIHByb3RlY3RlZAogCSAqIGJ5IHRoaXMgbG9jayBhcyB3ZWxsLgogCSAqLworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CiAJc3BpbmxvY2tfdCBsb2NrOwogCXN0cnVjdCBza19idWZmICpza2JzW01BWF9TS0JfQlVGRkVSU107CS8qIHBvaW50ZXJzIHRvIHR4LXNrYnMgKi8KIAlpbnQgaW5faWR4LCBvdXRfaWR4OwkvKiBpbmRleGVzIHRvIGJ1ZmZlciByaW5nICovCkBAIC01NSwxNSArNTEsNiBAQAogfTsJCQkJLyogbmV0X2xvY2FsICovCiAKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogR2V0IHRoZSBjdXJyZW50IHN0YXRpc3RpY3MgZm9yIHRoaXMgY2FyZC4gICAgICAgICAqLwotLyogVGhpcyBtYXkgYmUgY2FsbGVkIHdpdGggdGhlIGNhcmQgb3BlbiBvciBjbG9zZWQgISAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICoKLW5ldF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLQlyZXR1cm4gKCYoKHN0cnVjdCBuZXRfbG9jYWwgKikgZGV2KS0+c3RhdHMpOwotfQkJCQkvKiBuZXRfZGV2aWNlX3N0YXRzICovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBPcGVuL2luaXRpYWxpemUgdGhlIGJvYXJkLiBUaGlzIGlzIGNhbGxlZCAoaW4gdGhlIGN1cnJlbnQga2VybmVsKSAqLwpAQCAtMTgyLDggKzE2OSw4IEBACiAJaWYgKCFscC0+c2tfY291bnQpCiAJCXJldHVybjsJCS8qIGVycm9yIGNvbmRpdGlvbiAqLwogCi0JbHAtPnN0YXRzLnR4X3BhY2tldHMrKzsKLQlscC0+c3RhdHMudHhfYnl0ZXMgKz0gbHAtPnNrYnNbbHAtPm91dF9pZHhdLT5sZW47CisJbHAtPmRldi0+c3RhdHMudHhfcGFja2V0cysrOworCWxwLT5kZXYtPnN0YXRzLnR4X2J5dGVzICs9IGxwLT5za2JzW2xwLT5vdXRfaWR4XS0+bGVuOwogCiAJZGV2X2tmcmVlX3NrYihscC0+c2tic1tscC0+b3V0X2lkeCsrXSk7CQkvKiBmcmVlIHNrYiAqLwogCWlmIChscC0+b3V0X2lkeCA+PSBNQVhfU0tCX0JVRkZFUlMpCkBAIC0yMDAsMjkgKzE4NywzMCBAQAogaHlzZG5fcnhfbmV0cGt0KGh5c2RuX2NhcmQgKiBjYXJkLCB1bnNpZ25lZCBjaGFyICpidWYsIHVuc2lnbmVkIHNob3J0IGxlbikKIHsKIAlzdHJ1Y3QgbmV0X2xvY2FsICpscCA9IGNhcmQtPm5ldGlmOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBscC0+ZGV2OwogCXN0cnVjdCBza19idWZmICpza2I7CiAKIAlpZiAoIWxwKQogCQlyZXR1cm47CQkvKiBub24gZXhpc3RpbmcgZGV2aWNlICovCiAKLQlscC0+c3RhdHMucnhfYnl0ZXMgKz0gbGVuOworCWRldi0+c3RhdHMucnhfYnl0ZXMgKz0gbGVuOwogCiAJc2tiID0gZGV2X2FsbG9jX3NrYihsZW4pOwogCWlmIChza2IgPT0gTlVMTCkgewogCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiBNZW1vcnkgc3F1ZWV6ZSwgZHJvcHBpbmcgcGFja2V0LlxuIiwKLQkJICAgICAgIGxwLT5uZXRkZXYubmFtZSk7Ci0JCWxwLT5zdGF0cy5yeF9kcm9wcGVkKys7CisJCSAgICAgICBkZXYtPm5hbWUpOworCQlkZXYtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKIAkJcmV0dXJuOwogCX0KIAkvKiBjb3B5IHRoZSBkYXRhICovCiAJbWVtY3B5KHNrYl9wdXQoc2tiLCBsZW4pLCBidWYsIGxlbik7CiAKIAkvKiBkZXRlcm1pbmUgdGhlIHVzZWQgcHJvdG9jb2wgKi8KLQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCAmbHAtPm5ldGRldik7CisJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKKworCWRldi0+c3RhdHMucnhfcGFja2V0cysrOwkvKiBhZGp1c3QgcGFja2V0IGNvdW50ICovCiAKIAluZXRpZl9yeChza2IpOwotCWxwLT5zdGF0cy5yeF9wYWNrZXRzKys7CS8qIGFkanVzdCBwYWNrZXQgY291bnQgKi8KLQogfQkJCQkvKiBoeXNkbl9yeF9uZXRwa3QgKi8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMjQyLDI0ICsyMzAsMTUgQEAKIAlyZXR1cm4gKGxwLT5za2JzW2xwLT5vdXRfaWR4XSk7CQkvKiBuZXh0IHBhY2tldCB0byBzZW5kICovCiB9CQkJCS8qIGh5c2RuX3R4X25ldGdldCAqLwogCitzdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIGh5c2RuX25ldGRldl9vcHMgPSB7CisJLm5kb19vcGVuIAkJPSBuZXRfb3BlbiwKKwkubmRvX3N0b3AJCT0gbmV0X2Nsb3NlLAorCS5uZG9fc3RhcnRfeG1pdAkJPSBuZXRfc2VuZF9wYWNrZXQsCisJLm5kb19jaGFuZ2VfbXR1CQk9IGV0aF9jaGFuZ2VfbXR1LAorCS5uZG9fc2V0X21hY19hZGRyZXNzIAk9IGV0aF9tYWNfYWRkciwKKwkubmRvX3ZhbGlkYXRlX2FkZHIJPSBldGhfdmFsaWRhdGVfYWRkciwKK307CiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogaW5pdCBmdW5jdGlvbiBjYWxsZWQgYnkgcmVnaXN0ZXIgZGV2aWNlICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpbnQKLW5ldF9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0JLyogc2V0dXAgdGhlIGZ1bmN0aW9uIHRhYmxlICovCi0JZGV2LT5vcGVuID0gbmV0X29wZW47Ci0JZGV2LT5zdG9wID0gbmV0X2Nsb3NlOwotCWRldi0+aGFyZF9zdGFydF94bWl0ID0gbmV0X3NlbmRfcGFja2V0OwotCWRldi0+Z2V0X3N0YXRzID0gbmV0X2dldF9zdGF0czsKLQotCS8qIEZpbGwgaW4gdGhlIGZpZWxkcyBvZiB0aGUgZGV2aWNlIHN0cnVjdHVyZSB3aXRoIGV0aGVybmV0IHZhbHVlcy4gKi8KLQlldGhlcl9zZXR1cChkZXYpOwotCi0JcmV0dXJuICgwKTsJCS8qIHN1Y2Nlc3MgKi8KLX0JCQkJLyogbmV0X2luaXQgKi8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogaHlzZG5fbmV0X2NyZWF0ZSBjcmVhdGVzIGEgbmV3IG5ldCBkZXZpY2UgZm9yIHRoZSBnaXZlbiBjYXJkLiBJZiBhIGRldmljZSAqLwpAQCAtMjcxLDI4ICsyNTAsMzQgQEAKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OwogCWludCBpOworCXN0cnVjdCBuZXRfbG9jYWwgKmxwOworCiAJaWYoIWNhcmQpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiTm8gY2FyZC1wdCBpbiBoeXNkbl9uZXRfY3JlYXRlIVxuIik7CiAJCXJldHVybiAoLUVOT01FTSk7CiAJfQogCWh5c2RuX25ldF9yZWxlYXNlKGNhcmQpOwkvKiByZWxlYXNlIGFuIGV4aXN0aW5nIG5ldCBkZXZpY2UgKi8KLQlpZiAoKGRldiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBuZXRfbG9jYWwpLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkgeworCisJZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKHN0cnVjdCBuZXRfbG9jYWwpKTsKKwlpZiAoIWRldikgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICJIWVNETjogdW5hYmxlIHRvIGFsbG9jYXRlIG1lbVxuIik7CiAJCXJldHVybiAoLUVOT01FTSk7CiAJfQogCisJbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWxwLT5kZXYgPSBkZXY7CisKKwlkZXYtPm5ldGRldl9vcHMgPSAmaHlzZG5fbmV0ZGV2X29wczsKIAlzcGluX2xvY2tfaW5pdCgmKChzdHJ1Y3QgbmV0X2xvY2FsICopIGRldiktPmxvY2spOwogCiAJLyogaW5pdGlhbGlzZSBuZWNlc3Nhcnkgb3IgaW5mb3JtaW5nIGZpZWxkcyAqLwogCWRldi0+YmFzZV9hZGRyID0gY2FyZC0+aW9iYXNlOwkvKiBJTyBhZGRyZXNzICovCiAJZGV2LT5pcnEgPSBjYXJkLT5pcnE7CS8qIGlycSAqLwotCWRldi0+aW5pdCA9IG5ldF9pbml0OwkvKiB0aGUgaW5pdCBmdW5jdGlvbiBvZiB0aGUgZGV2aWNlICovCi0JaWYoZGV2LT5uYW1lKSB7Ci0JCXN0cmNweShkZXYtPm5hbWUsICgoc3RydWN0IG5ldF9sb2NhbCAqKSBkZXYpLT5kZXZfbmFtZSk7Ci0JfSAKKworCWRldi0+bmV0ZGV2X29wcyA9ICZoeXNkbl9uZXRkZXZfb3BzOwogCWlmICgoaSA9IHJlZ2lzdGVyX25ldGRldihkZXYpKSkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICJIWVNETjogdW5hYmxlIHRvIGNyZWF0ZSBuZXR3b3JrIGRldmljZVxuIik7Ci0JCWtmcmVlKGRldik7CisJCWZyZWVfbmV0ZGV2KGRldik7CiAJCXJldHVybiAoaSk7CiAJfQogCWRldi0+bWxfcHJpdiA9IGNhcmQ7CS8qIHJlbWVtYmVyIHBvaW50ZXIgdG8gb3duIGRhdGEgc3RydWN0dXJlICovCkBAIC0zMTYsNyArMzAxLDcgQEAKIAkJcmV0dXJuICgwKTsJLyogbm9uIGV4aXN0aW5nICovCiAKIAljYXJkLT5uZXRpZiA9IE5VTEw7CS8qIGNsZWFyIG91dCBwb2ludGVyICovCi0JZGV2LT5zdG9wKGRldik7CQkvKiBjbG9zZSB0aGUgZGV2aWNlICovCisJbmV0X2Nsb3NlKGRldik7CiAKIAlmbHVzaF90eF9idWZmZXJzKChzdHJ1Y3QgbmV0X2xvY2FsICopIGRldik7CS8qIGVtcHR5IGJ1ZmZlcnMgKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2k0bC9pc2RuX25ldC5jIGIvZHJpdmVycy9pc2RuL2k0bC9pc2RuX25ldC5jCmluZGV4IDAyM2VhMTEuLjdjNWY5NzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9pNGwvaXNkbl9uZXQuYworKysgYi9kcml2ZXJzL2lzZG4vaTRsL2lzZG5fbmV0LmMKQEAgLTE0ODUsNiArMTQ4NSwyNCBAQAogCXJldHVybiAocmMpOwogfQogCisKK3N0YXRpYyBpbnQgaXNkbl9uZXRfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgc3RydWN0IGlmcmVxICppZnIsIGludCBjbWQpCit7CisJaXNkbl9uZXRfbG9jYWwgKmxwID0gKGlzZG5fbmV0X2xvY2FsICopIG5ldGRldl9wcml2KGRldik7CisKKwlzd2l0Y2ggKGxwLT5wX2VuY2FwKSB7CisjaWZkZWYgQ09ORklHX0lTRE5fUFBQCisJY2FzZSBJU0ROX05FVF9FTkNBUF9TWU5DUFBQOgorCQlyZXR1cm4gaXNkbl9wcHBfZGV2X2lvY3RsKGRldiwgaWZyLCBjbWQpOworI2VuZGlmCisJY2FzZSBJU0ROX05FVF9FTkNBUF9DSVNDT0hETENLOgorCQlyZXR1cm4gaXNkbl9jaXNjb2hkbGNrX2Rldl9pb2N0bChkZXYsIGlmciwgY21kKTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9Cit9CisKIC8qIGNhbGxlZCB2aWEgY2lzY29fdGltZXIuZnVuY3Rpb24gKi8KIHN0YXRpYyB2b2lkCiBpc2RuX25ldF9jaXNjb2hkbGNrX3NsYXJwX3NlbmRfa2VlcGFsaXZlKHVuc2lnbmVkIGxvbmcgZGF0YSkKQEAgLTE5OTgsMjMgKzIwMTYsNiBAQAogCXVzaG9ydCBtYXhfaGxoZHJfbGVuID0gMDsKIAlpbnQgZHJ2aWR4OwogCi0JZXRoZXJfc2V0dXAobmRldik7Ci0JbmRldi0+aGVhZGVyX29wcyA9IE5VTEw7Ci0KLQkvKiBTZXR1cCB0aGUgZ2VuZXJpYyBwcm9wZXJ0aWVzICovCi0JbmRldi0+bXR1ID0gMTUwMDsKLQluZGV2LT5mbGFncyA9IElGRl9OT0FSUHxJRkZfUE9JTlRPUE9JTlQ7Ci0JbmRldi0+dHlwZSA9IEFSUEhSRF9FVEhFUjsKLQluZGV2LT5hZGRyX2xlbiA9IEVUSF9BTEVOOwotCW5kZXYtPnZhbGlkYXRlX2FkZHIgPSBOVUxMOwotCi0JLyogZm9yIGNsaWVudHMgd2l0aCBNUFBQIG1heWJlIGhpZ2hlciB2YWx1ZXMgYmV0dGVyICovCi0JbmRldi0+dHhfcXVldWVfbGVuID0gMzA7Ci0KLQkvKiBUaGUgSVNETi1zcGVjaWZpYyBlbnRyaWVzIGluIHRoZSBkZXZpY2Ugc3RydWN0dXJlLiAqLwotCW5kZXYtPm9wZW4gPSAmaXNkbl9uZXRfb3BlbjsKLQluZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSAmaXNkbl9uZXRfc3RhcnRfeG1pdDsKLQogCS8qCiAJICogIHVwIHRpbGwgYmluZGluZyB3ZSBhc2sgdGhlIHByb3RvY29sIGxheWVyIHRvIHJlc2VydmUgYXMgbXVjaAogCSAqICBhcyB3ZSBtaWdodCBuZWVkIGZvciBITCBsYXllcgpAQCAtMjAyNiw5ICsyMDI3LDYgQEAKIAkJCQltYXhfaGxoZHJfbGVuID0gZGV2LT5kcnZbZHJ2aWR4XS0+aW50ZXJmYWNlLT5obF9oZHJsZW47CiAKIAluZGV2LT5oYXJkX2hlYWRlcl9sZW4gPSBFVEhfSExFTiArIG1heF9obGhkcl9sZW47Ci0JbmRldi0+c3RvcCA9ICZpc2RuX25ldF9jbG9zZTsKLQluZGV2LT5nZXRfc3RhdHMgPSAmaXNkbl9uZXRfZ2V0X3N0YXRzOwotCW5kZXYtPmRvX2lvY3RsID0gTlVMTDsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjUwOCw2ICsyNTA2LDE5IEBACiAJcmV0dXJuIChpc2RuX25ldF9mb3JjZV9kaWFsX2xwKHAtPmxvY2FsKSk7CiB9CiAKKy8qIFRoZSBJU0ROLXNwZWNpZmljIGVudHJpZXMgaW4gdGhlIGRldmljZSBzdHJ1Y3R1cmUuICovCitzdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIGlzZG5fbmV0ZGV2X29wcyA9IHsKKwkubmRvX2luaXQJICAgICAgPSBpc2RuX25ldF9pbml0LAorCS5uZG9fb3BlbgkgICAgICA9IGlzZG5fbmV0X29wZW4sCisJLm5kb19zdG9wCSAgICAgID0gaXNkbl9uZXRfY2xvc2UsCisJLm5kb19kb19pb2N0bAkgICAgICA9IGlzZG5fbmV0X2lvY3RsLAorCisJLm5kb192YWxpZGF0ZV9hZGRyICAgID0gTlVMTCwKKwkubmRvX3N0YXJ0X3htaXQJICAgICAgPSBpc2RuX25ldF9zdGFydF94bWl0LAorCS5uZG9fZ2V0X3N0YXRzCSAgICAgID0gaXNkbl9uZXRfZ2V0X3N0YXRzLAorCS5uZG9fdHhfdGltZW91dAkgICAgICA9IGlzZG5fbmV0X3R4X3RpbWVvdXQsCit9OworCiAvKgogICogSGVscGVyIGZvciBhbGxvY19uZXRkZXYoKQogICovCkBAIC0yNTE1LDcgKzI1MjYsMjAgQEAKIHsKIAlpc2RuX25ldF9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOwogCisJZXRoZXJfc2V0dXAoZGV2KTsKKwogCWRldi0+ZmxhZ3MgPSBJRkZfTk9BUlAgfCBJRkZfUE9JTlRPUE9JTlQ7CisJLyogU2V0dXAgdGhlIGdlbmVyaWMgcHJvcGVydGllcyAqLworCWRldi0+bXR1ID0gMTUwMDsKKwlkZXYtPmZsYWdzID0gSUZGX05PQVJQfElGRl9QT0lOVE9QT0lOVDsKKwlkZXYtPnR5cGUgPSBBUlBIUkRfRVRIRVI7CisJZGV2LT5hZGRyX2xlbiA9IEVUSF9BTEVOOworCWRldi0+aGVhZGVyX29wcyA9IE5VTEw7CisJZGV2LT5uZXRkZXZfb3BzID0gJmlzZG5fbmV0ZGV2X29wczsKKworCS8qIGZvciBjbGllbnRzIHdpdGggTVBQUCBtYXliZSBoaWdoZXIgdmFsdWVzIGJldHRlciAqLworCWRldi0+dHhfcXVldWVfbGVuID0gMzA7CisKIAlscC0+cF9lbmNhcCA9IElTRE5fTkVUX0VOQ0FQX1JBV0lQOwogCWxwLT5tYWdpYyA9IElTRE5fTkVUX01BR0lDOwogCWxwLT5sYXN0ID0gbHA7CkBAIC0yNTcwLDcgKzI1OTQsNyBAQAogCQlyZXR1cm4gTlVMTDsKIAl9CiAJbmV0ZGV2LT5sb2NhbCA9IG5ldGRldl9wcml2KG5ldGRldi0+ZGV2KTsKLQluZXRkZXYtPmRldi0+aW5pdCA9IGlzZG5fbmV0X2luaXQ7CisKIAlpZiAobWFzdGVyKSB7CiAJCS8qIERldmljZSBzaGFsbCBiZSBhIHNsYXZlICovCiAJCXN0cnVjdCBuZXRfZGV2aWNlICpwID0gTUFTVEVSX1RPX1NMQVZFKG1hc3Rlcik7CkBAIC0yNTg4LDcgKzI2MTIsNiBAQAogCQkvKgogCQkgKiBXYXRjaGRvZyB0aW1lciAoY3VycmVudGx5KSBmb3IgbWFzdGVyIG9ubHkuCiAJCSAqLwotCQluZXRkZXYtPmRldi0+dHhfdGltZW91dCA9IGlzZG5fbmV0X3R4X3RpbWVvdXQ7CiAJCW5ldGRldi0+ZGV2LT53YXRjaGRvZ190aW1lbyA9IElTRE5fTkVUX1RYX1RJTUVPVVQ7CiAJCWlmIChyZWdpc3Rlcl9uZXRkZXYobmV0ZGV2LT5kZXYpICE9IDApIHsKIAkJCXByaW50ayhLRVJOX1dBUk5JTkcgImlzZG5fbmV0OiBDb3VsZCBub3QgcmVnaXN0ZXIgbmV0LWRldmljZVxuIik7CkBAIC0yNzA0LDcgKzI3MjcsNiBAQAogI2Vsc2UKIAkJCXAtPmRldi0+dHlwZSA9IEFSUEhSRF9QUFA7CS8qIGNoYW5nZSBBUlAgdHlwZSAqLwogCQkJcC0+ZGV2LT5hZGRyX2xlbiA9IDA7Ci0JCQlwLT5kZXYtPmRvX2lvY3RsID0gaXNkbl9wcHBfZGV2X2lvY3RsOwogI2VuZGlmCiAJCQlicmVhazsKIAkJY2FzZSBJU0ROX05FVF9FTkNBUF9YMjVJRkFDRToKQEAgLTI3MTgsNyArMjc0MCw2IEBACiAjZW5kaWYKIAkJCWJyZWFrOwogCQljYXNlIElTRE5fTkVUX0VOQ0FQX0NJU0NPSERMQ0s6Ci0JCQlwLT5kZXYtPmRvX2lvY3RsID0gaXNkbl9jaXNjb2hkbGNrX2Rldl9pb2N0bDsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJaWYoIGNmZy0+cF9lbmNhcCA+PSAwICYmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vbUlTRE4vZHNwX3BpcGVsaW5lLmMgYi9kcml2ZXJzL2lzZG4vbUlTRE4vZHNwX3BpcGVsaW5lLmMKaW5kZXggNWVlNjY1MS4uODM2MzliZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL21JU0ROL2RzcF9waXBlbGluZS5jCisrKyBiL2RyaXZlcnMvaXNkbi9tSVNETi9kc3BfcGlwZWxpbmUuYwpAQCAtOTEsNyArOTEsNyBAQAogCiAJZW50cnktPmRldi5jbGFzcyA9IGVsZW1lbnRzX2NsYXNzOwogCWRldl9zZXRfZHJ2ZGF0YSgmZW50cnktPmRldiwgZWxlbSk7Ci0Jc25wcmludGYoZW50cnktPmRldi5idXNfaWQsIEJVU19JRF9TSVpFLCBlbGVtLT5uYW1lKTsKKwlkZXZfc2V0X25hbWUoJmVudHJ5LT5kZXYsIGVsZW0tPm5hbWUpOwogCXJldCA9IGRldmljZV9yZWdpc3RlcigmZW50cnktPmRldik7CiAJaWYgKHJldCkgewogCQlwcmludGsoS0VSTl9FUlIgIiVzOiBmYWlsZWQgdG8gcmVnaXN0ZXIgJXNcbiIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2xndWVzdC9sZ3Vlc3RfZGV2aWNlLmMgYi9kcml2ZXJzL2xndWVzdC9sZ3Vlc3RfZGV2aWNlLmMKaW5kZXggOTE1ZGE2Yi4uYjRkNDRlNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9sZ3Vlc3QvbGd1ZXN0X2RldmljZS5jCisrKyBiL2RyaXZlcnMvbGd1ZXN0L2xndWVzdF9kZXZpY2UuYwpAQCAtMzIxLDEwICszMjEsNyBAQAogCiAvKiBUaGUgcm9vdCBkZXZpY2UgZm9yIHRoZSBsZ3Vlc3QgdmlydGlvIGRldmljZXMuICBUaGlzIG1ha2VzIHRoZW0gYXBwZWFyIGFzCiAgKiAvc3lzL2RldmljZXMvbGd1ZXN0LzAsMSwyIG5vdCAvc3lzL2RldmljZXMvMCwxLDIuICovCi1zdGF0aWMgc3RydWN0IGRldmljZSBsZ3Vlc3Rfcm9vdCA9IHsKLQkucGFyZW50ID0gTlVMTCwKLQkuYnVzX2lkID0gImxndWVzdCIsCi19Oworc3RhdGljIHN0cnVjdCBkZXZpY2UgKmxndWVzdF9yb290OwogCiAvKkQ6MTIwIFRoaXMgaXMgdGhlIGNvcmUgb2YgdGhlIGxndWVzdCBidXM6IGFjdHVhbGx5IGFkZGluZyBhIG5ldyBkZXZpY2UuCiAgKiBJdCdzIGEgc2VwYXJhdGUgZnVuY3Rpb24gYmVjYXVzZSBpdCdzIG5lYXRlciB0aGF0IHdheSwgYW5kIGJlY2F1c2UgYW4KQEAgLTM1MSw3ICszNDgsNyBAQAogCX0KIAogCS8qIFRoaXMgZGV2aWNlcycgcGFyZW50IGlzIHRoZSBsZ3Vlc3QvIGRpci4gKi8KLQlsZGV2LT52ZGV2LmRldi5wYXJlbnQgPSAmbGd1ZXN0X3Jvb3Q7CisJbGRldi0+dmRldi5kZXYucGFyZW50ID0gbGd1ZXN0X3Jvb3Q7CiAJLyogV2UgaGF2ZSBhIHVuaXF1ZSBkZXZpY2UgaW5kZXggdGhhbmtzIHRvIHRoZSBkZXZfaW5kZXggY291bnRlci4gKi8KIAlsZGV2LT52ZGV2LmlkLmRldmljZSA9IGQtPnR5cGU7CiAJLyogV2UgaGF2ZSBhIHNpbXBsZSBzZXQgb2Ygcm91dGluZXMgZm9yIHF1ZXJ5aW5nIHRoZSBkZXZpY2UncwpAQCAtNDA3LDcgKzQwNCw4IEBACiAJaWYgKHN0cmNtcChwdl9pbmZvLm5hbWUsICJsZ3Vlc3QiKSAhPSAwKQogCQlyZXR1cm4gMDsKIAotCWlmIChkZXZpY2VfcmVnaXN0ZXIoJmxndWVzdF9yb290KSAhPSAwKQorCWxndWVzdF9yb290ID0gcm9vdF9kZXZpY2VfcmVnaXN0ZXIoImxndWVzdCIpOworCWlmIChJU19FUlIobGd1ZXN0X3Jvb3QpKQogCQlwYW5pYygiQ291bGQgbm90IHJlZ2lzdGVyIGxndWVzdCByb290Iik7CiAKIAkvKiBEZXZpY2VzIGFyZSBpbiBhIHNpbmdsZSBwYWdlIGFib3ZlIHRvcCBvZiAibm9ybWFsIiBtZW0gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWFjaW50b3NoL0tjb25maWcgYi9kcml2ZXJzL21hY2ludG9zaC9LY29uZmlnCmluZGV4IGI1MjY1OTYuLjE3M2NmNTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWFjaW50b3NoL0tjb25maWcKKysrIGIvZHJpdmVycy9tYWNpbnRvc2gvS2NvbmZpZwpAQCAtMTM4LDcgKzEzOCw3IEBACiAJICBTYXkgWSBoZXJlIHRvIGVuYWJsZSBNYWNpbnRvc2ggc3BlY2lmaWMgZXh0ZW5zaW9ucyBvZiB0aGUgZ2VuZXJpYwogCSAgYmFja2xpZ2h0IGNvZGUuIFdpdGggdGhpcyBlbmFibGVkLCB0aGUgYnJpZ2h0bmVzcyBrZXlzIG9uIG9sZGVyCiAJICBQb3dlckJvb2tzIHdpbGwgYmUgZW5hYmxlZCBzbyB5b3UgY2FuIGNoYW5nZSB0aGUgc2NyZWVuIGJyaWdodG5lc3MuCi0JICBOZXdlciBtb2RlbHMgc2hvdWxkIHVzZSBhbiB1c2Vyc3BhY2UgZGFlbW9uIGxpa2UgcGJidXR0b25zZC4KKwkgIE5ld2VyIG1vZGVscyBzaG91bGQgdXNlIGEgdXNlcnNwYWNlIGRhZW1vbiBsaWtlIHBiYnV0dG9uc2QuCiAKIGNvbmZpZyBQTUFDX0JBQ0tMSUdIVF9MRUdBQ1kKIAlib29sICJQcm92aWRlIGxlZ2FjeSBpb2N0bCdzIG9uIC9kZXYvcG11IGZvciB0aGUgYmFja2xpZ2h0IgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tYWNpbnRvc2gvbWFjaW9fYXNpYy5jIGIvZHJpdmVycy9tYWNpbnRvc2gvbWFjaW9fYXNpYy5jCmluZGV4IGVjOWU1ZjMuLjZlMTQ5ZjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWFjaW50b3NoL21hY2lvX2FzaWMuYworKysgYi9kcml2ZXJzL21hY2ludG9zaC9tYWNpb19hc2ljLmMKQEAgLTMzLDcgKzMzLDcgQEAKIAogI3VuZGVmIERFQlVHCiAKLSNkZWZpbmUgTUFYX05PREVfTkFNRV9TSVpFIChCVVNfSURfU0laRSAtIDEyKQorI2RlZmluZSBNQVhfTk9ERV9OQU1FX1NJWkUgKDIwIC0gMTIpCiAKIHN0YXRpYyBzdHJ1Y3QgbWFjaW9fY2hpcCAgICAgICptYWNpb19vbl9ob2xkOwogCkBAIC0yNDAsNyArMjQwLDcgQEAKIAlpZiAoaXJxICE9IE5PX0lSUSkgewogCQlkZXYtPmludGVycnVwdFtpbmRleF0uc3RhcnQgPSBpcnE7CiAJCWRldi0+aW50ZXJydXB0W2luZGV4XS5mbGFncyA9IElPUkVTT1VSQ0VfSVJROwotCQlkZXYtPmludGVycnVwdFtpbmRleF0ubmFtZSA9IGRldi0+b2ZkZXYuZGV2LmJ1c19pZDsKKwkJZGV2LT5pbnRlcnJ1cHRbaW5kZXhdLm5hbWUgPSBkZXZfbmFtZSgmZGV2LT5vZmRldi5kZXYpOwogCX0KIAlpZiAoZGV2LT5uX2ludGVycnVwdHMgPD0gaW5kZXgpCiAJCWRldi0+bl9pbnRlcnJ1cHRzID0gaW5kZXggKyAxOwpAQCAtMzAzLDcgKzMwMyw3IEBACiAJCQlicmVhazsKIAkJcmVzLT5zdGFydCA9IGlycTsKIAkJcmVzLT5mbGFncyA9IElPUkVTT1VSQ0VfSVJROwotCQlyZXMtPm5hbWUgPSBkZXYtPm9mZGV2LmRldi5idXNfaWQ7CisJCXJlcy0+bmFtZSA9IGRldl9uYW1lKCZkZXYtPm9mZGV2LmRldik7CiAJCWlmIChtYWNpb19yZXNvdXJjZV9xdWlya3MobnAsIHJlcywgaSAtIDEpKSB7CiAJCQltZW1zZXQocmVzLCAwLCBzaXplb2Yoc3RydWN0IHJlc291cmNlKSk7CiAJCQljb250aW51ZTsKQEAgLTMyNSw3ICszMjUsNyBAQAogCQlpZiAoaW5kZXggPj0gTUFDSU9fREVWX0NPVU5UX1JFU09VUkNFUykKIAkJCWJyZWFrOwogCQkqcmVzID0gcjsKLQkJcmVzLT5uYW1lID0gZGV2LT5vZmRldi5kZXYuYnVzX2lkOworCQlyZXMtPm5hbWUgPSBkZXZfbmFtZSgmZGV2LT5vZmRldi5kZXYpOwogCiAJCWlmIChtYWNpb19yZXNvdXJjZV9xdWlya3MobnAsIHJlcywgaW5kZXgpKSB7CiAJCQltZW1zZXQocmVzLCAwLCBzaXplb2Yoc3RydWN0IHJlc291cmNlKSk7CkBAIC0zMzgsNyArMzM4LDcgQEAKIAkJaWYgKGluc2VydF9yZXNvdXJjZShwYXJlbnRfcmVzLCByZXMpKSB7CiAJCQlwcmludGsoS0VSTl9XQVJOSU5HICJDYW4ndCByZXF1ZXN0IHJlc291cmNlICIKIAkJCSAgICAgICAiJWQgZm9yIE1hY0lPIGRldmljZSAlc1xuIiwKLQkJCSAgICAgICBpbmRleCwgZGV2LT5vZmRldi5kZXYuYnVzX2lkKTsKKwkJCSAgICAgICBpbmRleCwgZGV2X25hbWUoJmRldi0+b2ZkZXYuZGV2KSk7CiAJCX0KIAl9CiAJZGV2LT5uX3Jlc291cmNlcyA9IGluZGV4OwpAQCAtMzg1LDggKzM4NSw4IEBACiAKIAkvKiBNYWNJTyBpdHNlbGYgaGFzIGEgZGlmZmVyZW50IHJlZywgd2UgdXNlIGl0J3MgUENJIGJhc2UgKi8KIAlpZiAobnAgPT0gY2hpcC0+b2Zfbm9kZSkgewotCQlzcHJpbnRmKGRldi0+b2ZkZXYuZGV2LmJ1c19pZCwgIiUxZC4lMDh4OiUuKnMiLAotCQkJY2hpcC0+bGJ1cy5pbmRleCwKKwkJZGV2X3NldF9uYW1lKCZkZXYtPm9mZGV2LmRldiwgIiUxZC4lMDh4OiUuKnMiLAorCQkJICAgICBjaGlwLT5sYnVzLmluZGV4LAogI2lmZGVmIENPTkZJR19QQ0kKIAkJCSh1bnNpZ25lZCBpbnQpcGNpX3Jlc291cmNlX3N0YXJ0KGNoaXAtPmxidXMucGRldiwgMCksCiAjZWxzZQpAQCAtMzk1LDkgKzM5NSw5IEBACiAJCQlNQVhfTk9ERV9OQU1FX1NJWkUsIG5wLT5uYW1lKTsKIAl9IGVsc2UgewogCQlyZWcgPSBvZl9nZXRfcHJvcGVydHkobnAsICJyZWciLCBOVUxMKTsKLQkJc3ByaW50ZihkZXYtPm9mZGV2LmRldi5idXNfaWQsICIlMWQuJTA4eDolLipzIiwKLQkJCWNoaXAtPmxidXMuaW5kZXgsCi0JCQlyZWcgPyAqcmVnIDogMCwgTUFYX05PREVfTkFNRV9TSVpFLCBucC0+bmFtZSk7CisJCWRldl9zZXRfbmFtZSgmZGV2LT5vZmRldi5kZXYsICIlMWQuJTA4eDolLipzIiwKKwkJCSAgICAgY2hpcC0+bGJ1cy5pbmRleCwKKwkJCSAgICAgcmVnID8gKnJlZyA6IDAsIE1BWF9OT0RFX05BTUVfU0laRSwgbnAtPm5hbWUpOwogCX0KIAogCS8qIFNldHVwIGludGVycnVwdHMgJiByZXNvdXJjZXMgKi8KQEAgLTQwOCw3ICs0MDgsNyBAQAogCS8qIFJlZ2lzdGVyIHdpdGggY29yZSAqLwogCWlmIChvZl9kZXZpY2VfcmVnaXN0ZXIoJmRldi0+b2ZkZXYpICE9IDApIHsKIAkJcHJpbnRrKEtFUk5fREVCVUcibWFjaW86IGRldmljZSByZWdpc3RyYXRpb24gZXJyb3IgZm9yICVzIVxuIiwKLQkJICAgICAgIGRldi0+b2ZkZXYuZGV2LmJ1c19pZCk7CisJCSAgICAgICBkZXZfbmFtZSgmZGV2LT5vZmRldi5kZXYpKTsKIAkJa2ZyZWUoZGV2KTsKIAkJcmV0dXJuIE5VTEw7CiAJfQpAQCAtNTU4LDcgKzU1OCw3IEBACiAJCXJlc291cmNlX25vLAogCQltYWNpb19yZXNvdXJjZV9sZW4oZGV2LCByZXNvdXJjZV9ubyksCiAJCW1hY2lvX3Jlc291cmNlX3N0YXJ0KGRldiwgcmVzb3VyY2Vfbm8pLAotCQlkZXYtPm9mZGV2LmRldi5idXNfaWQpOworCQlkZXZfbmFtZSgmZGV2LT5vZmRldi5kZXYpKTsKIAlyZXR1cm4gLUVCVVNZOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21hY2ludG9zaC90aGVybV9hZHQ3NDZ4LmMgYi9kcml2ZXJzL21hY2ludG9zaC90aGVybV9hZHQ3NDZ4LmMKaW5kZXggMjJiZjk4MS4uODI2MDdhZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tYWNpbnRvc2gvdGhlcm1fYWR0NzQ2eC5jCisrKyBiL2RyaXZlcnMvbWFjaW50b3NoL3RoZXJtX2FkdDc0NnguYwpAQCAtNTU0LDcgKzU1NCw3IEBACiAJY29uc3QgdTMyICpwcm9wOwogCWludCBpID0gMCwgb2Zmc2V0ID0gMDsKIAlpbnQgZXJyOwotCQorCiAJbnAgPSBvZl9maW5kX25vZGVfYnlfbmFtZShOVUxMLCAiZmFuIik7CiAJaWYgKCFucCkKIAkJcmV0dXJuIC1FTk9ERVY7CkBAIC02MTMsMTMgKzYxMywxMyBAQAogCX0KIAogCW9mX2RldiA9IG9mX3BsYXRmb3JtX2RldmljZV9jcmVhdGUobnAsICJ0ZW1wZXJhdHVyZXMiLCBOVUxMKTsKLQkKKwlvZl9ub2RlX3B1dChucCk7CisKIAlpZiAob2ZfZGV2ID09IE5VTEwpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJDYW4ndCByZWdpc3RlciB0ZW1wZXJhdHVyZXMgZGV2aWNlICFcbiIpOwotCQlvZl9ub2RlX3B1dChucCk7CiAJCXJldHVybiAtRU5PREVWOwogCX0KLQkKKwogCWVyciA9IGRldmljZV9jcmVhdGVfZmlsZSgmb2ZfZGV2LT5kZXYsICZkZXZfYXR0cl9zZW5zb3IxX3RlbXBlcmF0dXJlKTsKIAllcnIgfD0gZGV2aWNlX2NyZWF0ZV9maWxlKCZvZl9kZXYtPmRldiwgJmRldl9hdHRyX3NlbnNvcjJfdGVtcGVyYXR1cmUpOwogCWVyciB8PSBkZXZpY2VfY3JlYXRlX2ZpbGUoJm9mX2Rldi0+ZGV2LCAmZGV2X2F0dHJfc2Vuc29yMV9saW1pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL01ha2VmaWxlIGIvZHJpdmVycy9tZC9NYWtlZmlsZQppbmRleCAxYzYxNTgwLi43Mjg4MGI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbWQvTWFrZWZpbGUKQEAgLTMsOSArMywxMCBAQAogIwogCiBkbS1tb2Qtb2Jqcwk6PSBkbS5vIGRtLXRhYmxlLm8gZG0tdGFyZ2V0Lm8gZG0tbGluZWFyLm8gZG0tc3RyaXBlLm8gXAotCQkgICBkbS1pb2N0bC5vIGRtLWlvLm8gZG0ta2NvcHlkLm8KKwkJICAgZG0taW9jdGwubyBkbS1pby5vIGRtLWtjb3B5ZC5vIGRtLXN5c2ZzLm8KIGRtLW11bHRpcGF0aC1vYmpzIDo9IGRtLXBhdGgtc2VsZWN0b3IubyBkbS1tcGF0aC5vCi1kbS1zbmFwc2hvdC1vYmpzIDo9IGRtLXNuYXAubyBkbS1leGNlcHRpb24tc3RvcmUubworZG0tc25hcHNob3Qtb2JqcyA6PSBkbS1zbmFwLm8gZG0tZXhjZXB0aW9uLXN0b3JlLm8gZG0tc25hcC10cmFuc2llbnQubyBcCisJCSAgICBkbS1zbmFwLXBlcnNpc3RlbnQubwogZG0tbWlycm9yLW9ianMJOj0gZG0tcmFpZDEubwogbWQtbW9kLW9ianMgICAgIDo9IG1kLm8gYml0bWFwLm8KIHJhaWQ0NTYtb2Jqcwk6PSByYWlkNS5vIHJhaWQ2YWxnb3MubyByYWlkNnJlY292Lm8gcmFpZDZ0YWJsZXMubyBcCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2JpdG1hcC5jIGIvZHJpdmVycy9tZC9iaXRtYXAuYwppbmRleCBhYjdjOGU0Li43MTk5NDM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL2JpdG1hcC5jCisrKyBiL2RyaXZlcnMvbWQvYml0bWFwLmMKQEAgLTIxNSw3ICsyMTUsNiBAQAogCS8qIGNob29zZSBhIGdvb2QgcmRldiBhbmQgcmVhZCB0aGUgcGFnZSBmcm9tIHRoZXJlICovCiAKIAltZGtfcmRldl90ICpyZGV2OwotCXN0cnVjdCBsaXN0X2hlYWQgKnRtcDsKIAlzZWN0b3JfdCB0YXJnZXQ7CiAKIAlpZiAoIXBhZ2UpCkBAIC0yMjMsNyArMjIyLDcgQEAKIAlpZiAoIXBhZ2UpCiAJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwogCi0JcmRldl9mb3JfZWFjaChyZGV2LCB0bXAsIG1kZGV2KSB7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShyZGV2LCAmbWRkZXYtPmRpc2tzLCBzYW1lX3NldCkgewogCQlpZiAoISB0ZXN0X2JpdChJbl9zeW5jLCAmcmRldi0+ZmxhZ3MpCiAJCSAgICB8fCB0ZXN0X2JpdChGYXVsdHksICZyZGV2LT5mbGFncykpCiAJCQljb250aW51ZTsKQEAgLTk2NCw5ICs5NjMsMTEgQEAKIAkJCQkgKi8KIAkJCQlwYWdlID0gYml0bWFwLT5zYl9wYWdlOwogCQkJCW9mZnNldCA9IHNpemVvZihiaXRtYXBfc3VwZXJfdCk7Ci0JCQkJcmVhZF9zYl9wYWdlKGJpdG1hcC0+bWRkZXYsIGJpdG1hcC0+b2Zmc2V0LAotCQkJCQkgICAgIHBhZ2UsCi0JCQkJCSAgICAgaW5kZXgsIGNvdW50KTsKKwkJCQlpZiAoIWZpbGUpCisJCQkJCXJlYWRfc2JfcGFnZShiaXRtYXAtPm1kZGV2LAorCQkJCQkJICAgICBiaXRtYXAtPm9mZnNldCwKKwkJCQkJCSAgICAgcGFnZSwKKwkJCQkJCSAgICAgaW5kZXgsIGNvdW50KTsKIAkJCX0gZWxzZSBpZiAoZmlsZSkgewogCQkJCXBhZ2UgPSByZWFkX3BhZ2UoZmlsZSwgaW5kZXgsIGJpdG1hcCwgY291bnQpOwogCQkJCW9mZnNldCA9IDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2RtLWNyeXB0LmMgYi9kcml2ZXJzL21kL2RtLWNyeXB0LmMKaW5kZXggMzMyNjc1MC4uMzViZGE0OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9kbS1jcnlwdC5jCisrKyBiL2RyaXZlcnMvbWQvZG0tY3J5cHQuYwpAQCAtMTMyMiwxMSArMTMyMiw3IEBACiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBkbV9jcnlwdF9leGl0KHZvaWQpCiB7Ci0JaW50IHIgPSBkbV91bnJlZ2lzdGVyX3RhcmdldCgmY3J5cHRfdGFyZ2V0KTsKLQotCWlmIChyIDwgMCkKLQkJRE1FUlIoInVucmVnaXN0ZXIgZmFpbGVkICVkIiwgcik7Ci0KKwlkbV91bnJlZ2lzdGVyX3RhcmdldCgmY3J5cHRfdGFyZ2V0KTsKIAlrbWVtX2NhY2hlX2Rlc3Ryb3koX2NyeXB0X2lvX3Bvb2wpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2RtLWRlbGF5LmMgYi9kcml2ZXJzL21kL2RtLWRlbGF5LmMKaW5kZXggODQ4YjM4MS4uNTllZTFiMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9kbS1kZWxheS5jCisrKyBiL2RyaXZlcnMvbWQvZG0tZGVsYXkuYwpAQCAtMzY0LDExICszNjQsNyBAQAogCiBzdGF0aWMgdm9pZCBfX2V4aXQgZG1fZGVsYXlfZXhpdCh2b2lkKQogewotCWludCByID0gZG1fdW5yZWdpc3Rlcl90YXJnZXQoJmRlbGF5X3RhcmdldCk7Ci0KLQlpZiAociA8IDApCi0JCURNRVJSKCJ1bnJlZ2lzdGVyIGZhaWxlZCAlZCIsIHIpOwotCisJZG1fdW5yZWdpc3Rlcl90YXJnZXQoJmRlbGF5X3RhcmdldCk7CiAJa21lbV9jYWNoZV9kZXN0cm95KGRlbGF5ZWRfY2FjaGUpOwogCWRlc3Ryb3lfd29ya3F1ZXVlKGtkZWxheWRfd3EpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9kbS1leGNlcHRpb24tc3RvcmUuYyBiL2RyaXZlcnMvbWQvZG0tZXhjZXB0aW9uLXN0b3JlLmMKaW5kZXggMDE1OTBmM2UuLmRjY2JmYjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvZG0tZXhjZXB0aW9uLXN0b3JlLmMKKysrIGIvZHJpdmVycy9tZC9kbS1leGNlcHRpb24tc3RvcmUuYwpAQCAtMSw3NTYgKzEsNDUgQEAKIC8qCi0gKiBkbS1leGNlcHRpb24tc3RvcmUuYwotICoKICAqIENvcHlyaWdodCAoQykgMjAwMS0yMDAyIFNpc3RpbmEgU29mdHdhcmUgKFVLKSBMaW1pdGVkLgotICogQ29weXJpZ2h0IChDKSAyMDA2IFJlZCBIYXQgR21iSAorICogQ29weXJpZ2h0IChDKSAyMDA2LTIwMDggUmVkIEhhdCBHbWJICiAgKgogICogVGhpcyBmaWxlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBHUEwuCiAgKi8KIAotI2luY2x1ZGUgImRtLXNuYXAuaCIKKyNpbmNsdWRlICJkbS1leGNlcHRpb24tc3RvcmUuaCIKIAogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgogI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvZG0taW8uaD4KLSNpbmNsdWRlIDxsaW51eC9kbS1rY29weWQuaD4KIAotI2RlZmluZSBETV9NU0dfUFJFRklYICJzbmFwc2hvdHMiCi0jZGVmaW5lIERNX0NIVU5LX1NJWkVfREVGQVVMVF9TRUNUT1JTIDMyCS8qIDE2S0IgKi8KKyNkZWZpbmUgRE1fTVNHX1BSRUZJWCAic25hcHNob3QgZXhjZXB0aW9uIHN0b3JlcyIKIAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogUGVyc2lzdGVudCBzbmFwc2hvdHMsIGJ5IHBlcnNpc3RlbnQgd2UgbWVhbiB0aGF0IHRoZSBzbmFwc2hvdAotICogd2lsbCBzdXJ2aXZlIGEgcmVib290LgotICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKgotICogV2UgbmVlZCB0byBzdG9yZSBhIHJlY29yZCBvZiB3aGljaCBwYXJ0cyBvZiB0aGUgb3JpZ2luIGhhdmUKLSAqIGJlZW4gY29waWVkIHRvIHRoZSBzbmFwc2hvdCBkZXZpY2UuICBUaGUgc25hcHNob3QgY29kZQotICogcmVxdWlyZXMgdGhhdCB3ZSBjb3B5IGV4Y2VwdGlvbiBjaHVua3MgdG8gY2h1bmsgYWxpZ25lZCBhcmVhcwotICogb2YgdGhlIENPVyBzdG9yZS4gIEl0IG1ha2VzIHNlbnNlIHRoZXJlZm9yZSwgdG8gc3RvcmUgdGhlCi0gKiBtZXRhZGF0YSBpbiBjaHVuayBzaXplIGJsb2Nrcy4KLSAqCi0gKiBUaGVyZSBpcyBubyBiYWNrd2FyZCBvciBmb3J3YXJkIGNvbXBhdGliaWxpdHkgaW1wbGVtZW50ZWQsCi0gKiBzbmFwc2hvdHMgd2l0aCBkaWZmZXJlbnQgZGlzayB2ZXJzaW9ucyB0aGFuIHRoZSBrZXJuZWwgd2lsbAotICogbm90IGJlIHVzYWJsZS4gIEl0IGlzIGV4cGVjdGVkIHRoYXQgImx2Y3JlYXRlIiB3aWxsIGJsYW5rIG91dAotICogdGhlIHN0YXJ0IG9mIGEgZnJlc2ggQ09XIGRldmljZSBiZWZvcmUgY2FsbGluZyB0aGUgc25hcHNob3QKLSAqIGNvbnN0cnVjdG9yLgotICoKLSAqIFRoZSBmaXJzdCBjaHVuayBvZiB0aGUgQ09XIGRldmljZSBqdXN0IGNvbnRhaW5zIHRoZSBoZWFkZXIuCi0gKiBBZnRlciB0aGlzIHRoZXJlIGlzIGEgY2h1bmsgZmlsbGVkIHdpdGggZXhjZXB0aW9uIG1ldGFkYXRhLAotICogZm9sbG93ZWQgYnkgYXMgbWFueSBleGNlcHRpb24gY2h1bmtzIGFzIGNhbiBmaXQgaW4gdGhlCi0gKiBtZXRhZGF0YSBhcmVhcy4KLSAqCi0gKiBBbGwgb24gZGlzayBzdHJ1Y3R1cmVzIGFyZSBpbiBsaXR0bGUtZW5kaWFuIGZvcm1hdC4gIFRoZSBlbmQKLSAqIG9mIHRoZSBleGNlcHRpb25zIGluZm8gaXMgaW5kaWNhdGVkIGJ5IGFuIGV4Y2VwdGlvbiB3aXRoIGEKLSAqIG5ld19jaHVuayBvZiAwLCB3aGljaCBpcyBpbnZhbGlkIHNpbmNlIGl0IHdvdWxkIHBvaW50IHRvIHRoZQotICogaGVhZGVyIGNodW5rLgotICovCi0KLS8qCi0gKiBNYWdpYyBmb3IgcGVyc2lzdGVudCBzbmFwc2hvdHM6ICJTbkFwIiAtIEZlZWJsZSBpc24ndCBpdC4KLSAqLwotI2RlZmluZSBTTkFQX01BR0lDIDB4NzA0MTZlNTMKLQotLyoKLSAqIFRoZSBvbi1kaXNrIHZlcnNpb24gb2YgdGhlIG1ldGFkYXRhLgotICovCi0jZGVmaW5lIFNOQVBTSE9UX0RJU0tfVkVSU0lPTiAxCi0KLXN0cnVjdCBkaXNrX2hlYWRlciB7Ci0JdWludDMyX3QgbWFnaWM7Ci0KLQkvKgotCSAqIElzIHRoaXMgc25hcHNob3QgdmFsaWQuICBUaGVyZSBpcyBubyB3YXkgb2YgcmVjb3ZlcmluZwotCSAqIGFuIGludmFsaWQgc25hcHNob3QuCi0JICovCi0JdWludDMyX3QgdmFsaWQ7Ci0KLQkvKgotCSAqIFNpbXBsZSwgaW5jcmVtZW50aW5nIHZlcnNpb24uIG5vIGJhY2t3YXJkCi0JICogY29tcGF0aWJpbGl0eS4KLQkgKi8KLQl1aW50MzJfdCB2ZXJzaW9uOwotCi0JLyogSW4gc2VjdG9ycyAqLwotCXVpbnQzMl90IGNodW5rX3NpemU7Ci19OwotCi1zdHJ1Y3QgZGlza19leGNlcHRpb24gewotCXVpbnQ2NF90IG9sZF9jaHVuazsKLQl1aW50NjRfdCBuZXdfY2h1bms7Ci19OwotCi1zdHJ1Y3QgY29tbWl0X2NhbGxiYWNrIHsKLQl2b2lkICgqY2FsbGJhY2spKHZvaWQgKiwgaW50IHN1Y2Nlc3MpOwotCXZvaWQgKmNvbnRleHQ7Ci19OwotCi0vKgotICogVGhlIHRvcCBsZXZlbCBzdHJ1Y3R1cmUgZm9yIGEgcGVyc2lzdGVudCBleGNlcHRpb24gc3RvcmUuCi0gKi8KLXN0cnVjdCBwc3RvcmUgewotCXN0cnVjdCBkbV9zbmFwc2hvdCAqc25hcDsJLyogdXAgcG9pbnRlciB0byBteSBzbmFwc2hvdCAqLwotCWludCB2ZXJzaW9uOwotCWludCB2YWxpZDsKLQl1aW50MzJfdCBleGNlcHRpb25zX3Blcl9hcmVhOwotCi0JLyoKLQkgKiBOb3cgdGhhdCB3ZSBoYXZlIGFuIGFzeW5jaHJvbm91cyBrY29weWQgdGhlcmUgaXMgbm8KLQkgKiBuZWVkIGZvciBsYXJnZSBjaHVuayBzaXplcywgc28gaXQgd29udCBodXJ0IHRvIGhhdmUgYQotCSAqIHdob2xlIGNodW5rcyB3b3J0aCBvZiBtZXRhZGF0YSBpbiBtZW1vcnkgYXQgb25jZS4KLQkgKi8KLQl2b2lkICphcmVhOwotCi0JLyoKLQkgKiBBbiBhcmVhIG9mIHplcm9zIHVzZWQgdG8gY2xlYXIgdGhlIG5leHQgYXJlYS4KLQkgKi8KLQl2b2lkICp6ZXJvX2FyZWE7Ci0KLQkvKgotCSAqIFVzZWQgdG8ga2VlcCB0cmFjayBvZiB3aGljaCBtZXRhZGF0YSBhcmVhIHRoZSBkYXRhIGluCi0JICogJ2NodW5rJyByZWZlcnMgdG8uCi0JICovCi0JY2h1bmtfdCBjdXJyZW50X2FyZWE7Ci0KLQkvKgotCSAqIFRoZSBuZXh0IGZyZWUgY2h1bmsgZm9yIGFuIGV4Y2VwdGlvbi4KLQkgKi8KLQljaHVua190IG5leHRfZnJlZTsKLQotCS8qCi0JICogVGhlIGluZGV4IG9mIG5leHQgZnJlZSBleGNlcHRpb24gaW4gdGhlIGN1cnJlbnQKLQkgKiBtZXRhZGF0YSBhcmVhLgotCSAqLwotCXVpbnQzMl90IGN1cnJlbnRfY29tbWl0dGVkOwotCi0JYXRvbWljX3QgcGVuZGluZ19jb3VudDsKLQl1aW50MzJfdCBjYWxsYmFja19jb3VudDsKLQlzdHJ1Y3QgY29tbWl0X2NhbGxiYWNrICpjYWxsYmFja3M7Ci0Jc3RydWN0IGRtX2lvX2NsaWVudCAqaW9fY2xpZW50OwotCi0Jc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKm1ldGFkYXRhX3dxOwotfTsKLQotc3RhdGljIHVuc2lnbmVkIHNlY3RvcnNfdG9fcGFnZXModW5zaWduZWQgc2VjdG9ycykKLXsKLQlyZXR1cm4gRElWX1JPVU5EX1VQKHNlY3RvcnMsIFBBR0VfU0laRSA+PiA5KTsKLX0KLQotc3RhdGljIGludCBhbGxvY19hcmVhKHN0cnVjdCBwc3RvcmUgKnBzKQotewotCWludCByID0gLUVOT01FTTsKLQlzaXplX3QgbGVuOwotCi0JbGVuID0gcHMtPnNuYXAtPmNodW5rX3NpemUgPDwgU0VDVE9SX1NISUZUOwotCi0JLyoKLQkgKiBBbGxvY2F0ZSB0aGUgY2h1bmtfc2l6ZSBibG9jayBvZiBtZW1vcnkgdGhhdCB3aWxsIGhvbGQKLQkgKiBhIHNpbmdsZSBtZXRhZGF0YSBhcmVhLgotCSAqLwotCXBzLT5hcmVhID0gdm1hbGxvYyhsZW4pOwotCWlmICghcHMtPmFyZWEpCi0JCXJldHVybiByOwotCi0JcHMtPnplcm9fYXJlYSA9IHZtYWxsb2MobGVuKTsKLQlpZiAoIXBzLT56ZXJvX2FyZWEpIHsKLQkJdmZyZWUocHMtPmFyZWEpOwotCQlyZXR1cm4gcjsKLQl9Ci0JbWVtc2V0KHBzLT56ZXJvX2FyZWEsIDAsIGxlbik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgZnJlZV9hcmVhKHN0cnVjdCBwc3RvcmUgKnBzKQotewotCXZmcmVlKHBzLT5hcmVhKTsKLQlwcy0+YXJlYSA9IE5VTEw7Ci0JdmZyZWUocHMtPnplcm9fYXJlYSk7Ci0JcHMtPnplcm9fYXJlYSA9IE5VTEw7Ci19Ci0KLXN0cnVjdCBtZGF0YV9yZXEgewotCXN0cnVjdCBkbV9pb19yZWdpb24gKndoZXJlOwotCXN0cnVjdCBkbV9pb19yZXF1ZXN0ICppb19yZXE7Ci0Jc3RydWN0IHdvcmtfc3RydWN0IHdvcms7Ci0JaW50IHJlc3VsdDsKLX07Ci0KLXN0YXRpYyB2b2lkIGRvX21ldGFkYXRhKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKLXsKLQlzdHJ1Y3QgbWRhdGFfcmVxICpyZXEgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IG1kYXRhX3JlcSwgd29yayk7Ci0KLQlyZXEtPnJlc3VsdCA9IGRtX2lvKHJlcS0+aW9fcmVxLCAxLCByZXEtPndoZXJlLCBOVUxMKTsKLX0KLQotLyoKLSAqIFJlYWQgb3Igd3JpdGUgYSBjaHVuayBhbGlnbmVkIGFuZCBzaXplZCBibG9jayBvZiBkYXRhIGZyb20gYSBkZXZpY2UuCi0gKi8KLXN0YXRpYyBpbnQgY2h1bmtfaW8oc3RydWN0IHBzdG9yZSAqcHMsIGNodW5rX3QgY2h1bmssIGludCBydywgaW50IG1ldGFkYXRhKQotewotCXN0cnVjdCBkbV9pb19yZWdpb24gd2hlcmUgPSB7Ci0JCS5iZGV2ID0gcHMtPnNuYXAtPmNvdy0+YmRldiwKLQkJLnNlY3RvciA9IHBzLT5zbmFwLT5jaHVua19zaXplICogY2h1bmssCi0JCS5jb3VudCA9IHBzLT5zbmFwLT5jaHVua19zaXplLAotCX07Ci0Jc3RydWN0IGRtX2lvX3JlcXVlc3QgaW9fcmVxID0gewotCQkuYmlfcncgPSBydywKLQkJLm1lbS50eXBlID0gRE1fSU9fVk1BLAotCQkubWVtLnB0ci52bWEgPSBwcy0+YXJlYSwKLQkJLmNsaWVudCA9IHBzLT5pb19jbGllbnQsCi0JCS5ub3RpZnkuZm4gPSBOVUxMLAotCX07Ci0Jc3RydWN0IG1kYXRhX3JlcSByZXE7Ci0KLQlpZiAoIW1ldGFkYXRhKQotCQlyZXR1cm4gZG1faW8oJmlvX3JlcSwgMSwgJndoZXJlLCBOVUxMKTsKLQotCXJlcS53aGVyZSA9ICZ3aGVyZTsKLQlyZXEuaW9fcmVxID0gJmlvX3JlcTsKLQotCS8qCi0JICogSXNzdWUgdGhlIHN5bmNocm9ub3VzIEkvTyBmcm9tIGEgZGlmZmVyZW50IHRocmVhZAotCSAqIHRvIGF2b2lkIGdlbmVyaWNfbWFrZV9yZXF1ZXN0IHJlY3Vyc2lvbi4KLQkgKi8KLQlJTklUX1dPUksoJnJlcS53b3JrLCBkb19tZXRhZGF0YSk7Ci0JcXVldWVfd29yayhwcy0+bWV0YWRhdGFfd3EsICZyZXEud29yayk7Ci0JZmx1c2hfd29ya3F1ZXVlKHBzLT5tZXRhZGF0YV93cSk7Ci0KLQlyZXR1cm4gcmVxLnJlc3VsdDsKLX0KLQotLyoKLSAqIENvbnZlcnQgYSBtZXRhZGF0YSBhcmVhIGluZGV4IHRvIGEgY2h1bmsgaW5kZXguCi0gKi8KLXN0YXRpYyBjaHVua190IGFyZWFfbG9jYXRpb24oc3RydWN0IHBzdG9yZSAqcHMsIGNodW5rX3QgYXJlYSkKLXsKLQlyZXR1cm4gMSArICgocHMtPmV4Y2VwdGlvbnNfcGVyX2FyZWEgKyAxKSAqIGFyZWEpOwotfQotCi0vKgotICogUmVhZCBvciB3cml0ZSBhIG1ldGFkYXRhIGFyZWEuICBSZW1lbWJlcmluZyB0byBza2lwIHRoZSBmaXJzdAotICogY2h1bmsgd2hpY2ggaG9sZHMgdGhlIGhlYWRlci4KLSAqLwotc3RhdGljIGludCBhcmVhX2lvKHN0cnVjdCBwc3RvcmUgKnBzLCBpbnQgcncpCitpbnQgZG1fZXhjZXB0aW9uX3N0b3JlX2luaXQodm9pZCkKIHsKIAlpbnQgcjsKLQljaHVua190IGNodW5rOwogCi0JY2h1bmsgPSBhcmVhX2xvY2F0aW9uKHBzLCBwcy0+Y3VycmVudF9hcmVhKTsKKwlyID0gZG1fdHJhbnNpZW50X3NuYXBzaG90X2luaXQoKTsKKwlpZiAocikgeworCQlETUVSUigiVW5hYmxlIHRvIHJlZ2lzdGVyIHRyYW5zaWVudCBleGNlcHRpb24gc3RvcmUgdHlwZS4iKTsKKwkJZ290byB0cmFuc2llbnRfZmFpbDsKKwl9CiAKLQlyID0gY2h1bmtfaW8ocHMsIGNodW5rLCBydywgMCk7Ci0JaWYgKHIpCi0JCXJldHVybiByOworCXIgPSBkbV9wZXJzaXN0ZW50X3NuYXBzaG90X2luaXQoKTsKKwlpZiAocikgeworCQlETUVSUigiVW5hYmxlIHRvIHJlZ2lzdGVyIHBlcnNpc3RlbnQgZXhjZXB0aW9uIHN0b3JlIHR5cGUiKTsKKwkJZ290byBwZXJzaXN0ZW50X2ZhaWw7CisJfQogCiAJcmV0dXJuIDA7Ci19CiAKLXN0YXRpYyB2b2lkIHplcm9fbWVtb3J5X2FyZWEoc3RydWN0IHBzdG9yZSAqcHMpCi17Ci0JbWVtc2V0KHBzLT5hcmVhLCAwLCBwcy0+c25hcC0+Y2h1bmtfc2l6ZSA8PCBTRUNUT1JfU0hJRlQpOwotfQotCi1zdGF0aWMgaW50IHplcm9fZGlza19hcmVhKHN0cnVjdCBwc3RvcmUgKnBzLCBjaHVua190IGFyZWEpCi17Ci0Jc3RydWN0IGRtX2lvX3JlZ2lvbiB3aGVyZSA9IHsKLQkJLmJkZXYgPSBwcy0+c25hcC0+Y293LT5iZGV2LAotCQkuc2VjdG9yID0gcHMtPnNuYXAtPmNodW5rX3NpemUgKiBhcmVhX2xvY2F0aW9uKHBzLCBhcmVhKSwKLQkJLmNvdW50ID0gcHMtPnNuYXAtPmNodW5rX3NpemUsCi0JfTsKLQlzdHJ1Y3QgZG1faW9fcmVxdWVzdCBpb19yZXEgPSB7Ci0JCS5iaV9ydyA9IFdSSVRFLAotCQkubWVtLnR5cGUgPSBETV9JT19WTUEsCi0JCS5tZW0ucHRyLnZtYSA9IHBzLT56ZXJvX2FyZWEsCi0JCS5jbGllbnQgPSBwcy0+aW9fY2xpZW50LAotCQkubm90aWZ5LmZuID0gTlVMTCwKLQl9OwotCi0JcmV0dXJuIGRtX2lvKCZpb19yZXEsIDEsICZ3aGVyZSwgTlVMTCk7Ci19Ci0KLXN0YXRpYyBpbnQgcmVhZF9oZWFkZXIoc3RydWN0IHBzdG9yZSAqcHMsIGludCAqbmV3X3NuYXBzaG90KQotewotCWludCByOwotCXN0cnVjdCBkaXNrX2hlYWRlciAqZGg7Ci0JY2h1bmtfdCBjaHVua19zaXplOwotCWludCBjaHVua19zaXplX3N1cHBsaWVkID0gMTsKLQotCS8qCi0JICogVXNlIGRlZmF1bHQgY2h1bmsgc2l6ZSAob3IgaGFyZHNlY3Rfc2l6ZSwgaWYgbGFyZ2VyKSBpZiBub25lIHN1cHBsaWVkCi0JICovCi0JaWYgKCFwcy0+c25hcC0+Y2h1bmtfc2l6ZSkgewotICAgICAgICAJcHMtPnNuYXAtPmNodW5rX3NpemUgPSBtYXgoRE1fQ0hVTktfU0laRV9ERUZBVUxUX1NFQ1RPUlMsCi0JCSAgICBiZGV2X2hhcmRzZWN0X3NpemUocHMtPnNuYXAtPmNvdy0+YmRldikgPj4gOSk7Ci0JCXBzLT5zbmFwLT5jaHVua19tYXNrID0gcHMtPnNuYXAtPmNodW5rX3NpemUgLSAxOwotCQlwcy0+c25hcC0+Y2h1bmtfc2hpZnQgPSBmZnMocHMtPnNuYXAtPmNodW5rX3NpemUpIC0gMTsKLQkJY2h1bmtfc2l6ZV9zdXBwbGllZCA9IDA7Ci0JfQotCi0JcHMtPmlvX2NsaWVudCA9IGRtX2lvX2NsaWVudF9jcmVhdGUoc2VjdG9yc190b19wYWdlcyhwcy0+c25hcC0+Ci0JCQkJCQkJICAgICBjaHVua19zaXplKSk7Ci0JaWYgKElTX0VSUihwcy0+aW9fY2xpZW50KSkKLQkJcmV0dXJuIFBUUl9FUlIocHMtPmlvX2NsaWVudCk7Ci0KLQlyID0gYWxsb2NfYXJlYShwcyk7Ci0JaWYgKHIpCi0JCXJldHVybiByOwotCi0JciA9IGNodW5rX2lvKHBzLCAwLCBSRUFELCAxKTsKLQlpZiAocikKLQkJZ290byBiYWQ7Ci0KLQlkaCA9IChzdHJ1Y3QgZGlza19oZWFkZXIgKikgcHMtPmFyZWE7Ci0KLQlpZiAobGUzMl90b19jcHUoZGgtPm1hZ2ljKSA9PSAwKSB7Ci0JCSpuZXdfc25hcHNob3QgPSAxOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlpZiAobGUzMl90b19jcHUoZGgtPm1hZ2ljKSAhPSBTTkFQX01BR0lDKSB7Ci0JCURNV0FSTigiSW52YWxpZCBvciBjb3JydXB0IHNuYXBzaG90Iik7Ci0JCXIgPSAtRU5YSU87Ci0JCWdvdG8gYmFkOwotCX0KLQotCSpuZXdfc25hcHNob3QgPSAwOwotCXBzLT52YWxpZCA9IGxlMzJfdG9fY3B1KGRoLT52YWxpZCk7Ci0JcHMtPnZlcnNpb24gPSBsZTMyX3RvX2NwdShkaC0+dmVyc2lvbik7Ci0JY2h1bmtfc2l6ZSA9IGxlMzJfdG9fY3B1KGRoLT5jaHVua19zaXplKTsKLQotCWlmICghY2h1bmtfc2l6ZV9zdXBwbGllZCB8fCBwcy0+c25hcC0+Y2h1bmtfc2l6ZSA9PSBjaHVua19zaXplKQotCQlyZXR1cm4gMDsKLQotCURNV0FSTigiY2h1bmsgc2l6ZSAlbGx1IGluIGRldmljZSBtZXRhZGF0YSBvdmVycmlkZXMgIgotCSAgICAgICAidGFibGUgY2h1bmsgc2l6ZSBvZiAlbGx1LiIsCi0JICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpY2h1bmtfc2l6ZSwKLQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylwcy0+c25hcC0+Y2h1bmtfc2l6ZSk7Ci0KLQkvKiBXZSBoYWQgYSBib2d1cyBjaHVua19zaXplLiBGaXggc3R1ZmYgdXAuICovCi0JZnJlZV9hcmVhKHBzKTsKLQotCXBzLT5zbmFwLT5jaHVua19zaXplID0gY2h1bmtfc2l6ZTsKLQlwcy0+c25hcC0+Y2h1bmtfbWFzayA9IGNodW5rX3NpemUgLSAxOwotCXBzLT5zbmFwLT5jaHVua19zaGlmdCA9IGZmcyhjaHVua19zaXplKSAtIDE7Ci0KLQlyID0gZG1faW9fY2xpZW50X3Jlc2l6ZShzZWN0b3JzX3RvX3BhZ2VzKHBzLT5zbmFwLT5jaHVua19zaXplKSwKLQkJCQlwcy0+aW9fY2xpZW50KTsKLQlpZiAocikKLQkJcmV0dXJuIHI7Ci0KLQlyID0gYWxsb2NfYXJlYShwcyk7Ci0JcmV0dXJuIHI7Ci0KLWJhZDoKLQlmcmVlX2FyZWEocHMpOworcGVyc2lzdGVudF9mYWlsOgorCWRtX3BlcnNpc3RlbnRfc25hcHNob3RfZXhpdCgpOwordHJhbnNpZW50X2ZhaWw6CiAJcmV0dXJuIHI7CiB9CiAKLXN0YXRpYyBpbnQgd3JpdGVfaGVhZGVyKHN0cnVjdCBwc3RvcmUgKnBzKQordm9pZCBkbV9leGNlcHRpb25fc3RvcmVfZXhpdCh2b2lkKQogewotCXN0cnVjdCBkaXNrX2hlYWRlciAqZGg7Ci0KLQltZW1zZXQocHMtPmFyZWEsIDAsIHBzLT5zbmFwLT5jaHVua19zaXplIDw8IFNFQ1RPUl9TSElGVCk7Ci0KLQlkaCA9IChzdHJ1Y3QgZGlza19oZWFkZXIgKikgcHMtPmFyZWE7Ci0JZGgtPm1hZ2ljID0gY3B1X3RvX2xlMzIoU05BUF9NQUdJQyk7Ci0JZGgtPnZhbGlkID0gY3B1X3RvX2xlMzIocHMtPnZhbGlkKTsKLQlkaC0+dmVyc2lvbiA9IGNwdV90b19sZTMyKHBzLT52ZXJzaW9uKTsKLQlkaC0+Y2h1bmtfc2l6ZSA9IGNwdV90b19sZTMyKHBzLT5zbmFwLT5jaHVua19zaXplKTsKLQotCXJldHVybiBjaHVua19pbyhwcywgMCwgV1JJVEUsIDEpOwotfQotCi0vKgotICogQWNjZXNzIGZ1bmN0aW9ucyBmb3IgdGhlIGRpc2sgZXhjZXB0aW9ucywgdGhlc2UgZG8gdGhlIGVuZGlhbiBjb252ZXJzaW9ucy4KLSAqLwotc3RhdGljIHN0cnVjdCBkaXNrX2V4Y2VwdGlvbiAqZ2V0X2V4Y2VwdGlvbihzdHJ1Y3QgcHN0b3JlICpwcywgdWludDMyX3QgaW5kZXgpCi17Ci0JQlVHX09OKGluZGV4ID49IHBzLT5leGNlcHRpb25zX3Blcl9hcmVhKTsKLQotCXJldHVybiAoKHN0cnVjdCBkaXNrX2V4Y2VwdGlvbiAqKSBwcy0+YXJlYSkgKyBpbmRleDsKLX0KLQotc3RhdGljIHZvaWQgcmVhZF9leGNlcHRpb24oc3RydWN0IHBzdG9yZSAqcHMsCi0JCQkgICB1aW50MzJfdCBpbmRleCwgc3RydWN0IGRpc2tfZXhjZXB0aW9uICpyZXN1bHQpCi17Ci0Jc3RydWN0IGRpc2tfZXhjZXB0aW9uICplID0gZ2V0X2V4Y2VwdGlvbihwcywgaW5kZXgpOwotCi0JLyogY29weSBpdCAqLwotCXJlc3VsdC0+b2xkX2NodW5rID0gbGU2NF90b19jcHUoZS0+b2xkX2NodW5rKTsKLQlyZXN1bHQtPm5ld19jaHVuayA9IGxlNjRfdG9fY3B1KGUtPm5ld19jaHVuayk7Ci19Ci0KLXN0YXRpYyB2b2lkIHdyaXRlX2V4Y2VwdGlvbihzdHJ1Y3QgcHN0b3JlICpwcywKLQkJCSAgICB1aW50MzJfdCBpbmRleCwgc3RydWN0IGRpc2tfZXhjZXB0aW9uICpkZSkKLXsKLQlzdHJ1Y3QgZGlza19leGNlcHRpb24gKmUgPSBnZXRfZXhjZXB0aW9uKHBzLCBpbmRleCk7Ci0KLQkvKiBjb3B5IGl0ICovCi0JZS0+b2xkX2NodW5rID0gY3B1X3RvX2xlNjQoZGUtPm9sZF9jaHVuayk7Ci0JZS0+bmV3X2NodW5rID0gY3B1X3RvX2xlNjQoZGUtPm5ld19jaHVuayk7Ci19Ci0KLS8qCi0gKiBSZWdpc3RlcnMgdGhlIGV4Y2VwdGlvbnMgdGhhdCBhcmUgcHJlc2VudCBpbiB0aGUgY3VycmVudCBhcmVhLgotICogJ2Z1bGwnIGlzIGZpbGxlZCBpbiB0byBpbmRpY2F0ZSBpZiB0aGUgYXJlYSBoYXMgYmVlbgotICogZmlsbGVkLgotICovCi1zdGF0aWMgaW50IGluc2VydF9leGNlcHRpb25zKHN0cnVjdCBwc3RvcmUgKnBzLCBpbnQgKmZ1bGwpCi17Ci0JaW50IHI7Ci0JdW5zaWduZWQgaW50IGk7Ci0Jc3RydWN0IGRpc2tfZXhjZXB0aW9uIGRlOwotCi0JLyogcHJlc3VtZSB0aGUgYXJlYSBpcyBmdWxsICovCi0JKmZ1bGwgPSAxOwotCi0JZm9yIChpID0gMDsgaSA8IHBzLT5leGNlcHRpb25zX3Blcl9hcmVhOyBpKyspIHsKLQkJcmVhZF9leGNlcHRpb24ocHMsIGksICZkZSk7Ci0KLQkJLyoKLQkJICogSWYgdGhlIG5ld19jaHVuayBpcyBwb2ludGluZyBhdCB0aGUgc3RhcnQgb2YKLQkJICogdGhlIENPVyBkZXZpY2UsIHdoZXJlIHRoZSBmaXJzdCBtZXRhZGF0YSBhcmVhCi0JCSAqIGlzIHdlIGtub3cgdGhhdCB3ZSd2ZSBoaXQgdGhlIGVuZCBvZiB0aGUKLQkJICogZXhjZXB0aW9ucy4gIFRoZXJlZm9yZSB0aGUgYXJlYSBpcyBub3QgZnVsbC4KLQkJICovCi0JCWlmIChkZS5uZXdfY2h1bmsgPT0gMExMKSB7Ci0JCQlwcy0+Y3VycmVudF9jb21taXR0ZWQgPSBpOwotCQkJKmZ1bGwgPSAwOwotCQkJYnJlYWs7Ci0JCX0KLQotCQkvKgotCQkgKiBLZWVwIHRyYWNrIG9mIHRoZSBzdGFydCBvZiB0aGUgZnJlZSBjaHVua3MuCi0JCSAqLwotCQlpZiAocHMtPm5leHRfZnJlZSA8PSBkZS5uZXdfY2h1bmspCi0JCQlwcy0+bmV4dF9mcmVlID0gZGUubmV3X2NodW5rICsgMTsKLQotCQkvKgotCQkgKiBPdGhlcndpc2Ugd2UgYWRkIHRoZSBleGNlcHRpb24gdG8gdGhlIHNuYXBzaG90LgotCQkgKi8KLQkJciA9IGRtX2FkZF9leGNlcHRpb24ocHMtPnNuYXAsIGRlLm9sZF9jaHVuaywgZGUubmV3X2NodW5rKTsKLQkJaWYgKHIpCi0JCQlyZXR1cm4gcjsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCByZWFkX2V4Y2VwdGlvbnMoc3RydWN0IHBzdG9yZSAqcHMpCi17Ci0JaW50IHIsIGZ1bGwgPSAxOwotCi0JLyoKLQkgKiBLZWVwaW5nIHJlYWRpbmcgY2h1bmtzIGFuZCBpbnNlcnRpbmcgZXhjZXB0aW9ucyB1bnRpbAotCSAqIHdlIGZpbmQgYSBwYXJ0aWFsbHkgZnVsbCBhcmVhLgotCSAqLwotCWZvciAocHMtPmN1cnJlbnRfYXJlYSA9IDA7IGZ1bGw7IHBzLT5jdXJyZW50X2FyZWErKykgewotCQlyID0gYXJlYV9pbyhwcywgUkVBRCk7Ci0JCWlmIChyKQotCQkJcmV0dXJuIHI7Ci0KLQkJciA9IGluc2VydF9leGNlcHRpb25zKHBzLCAmZnVsbCk7Ci0JCWlmIChyKQotCQkJcmV0dXJuIHI7Ci0JfQotCi0JcHMtPmN1cnJlbnRfYXJlYS0tOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcHN0b3JlICpnZXRfaW5mbyhzdHJ1Y3QgZXhjZXB0aW9uX3N0b3JlICpzdG9yZSkKLXsKLQlyZXR1cm4gKHN0cnVjdCBwc3RvcmUgKikgc3RvcmUtPmNvbnRleHQ7Ci19Ci0KLXN0YXRpYyB2b2lkIHBlcnNpc3RlbnRfZnJhY3Rpb25fZnVsbChzdHJ1Y3QgZXhjZXB0aW9uX3N0b3JlICpzdG9yZSwKLQkJCQkgICAgIHNlY3Rvcl90ICpudW1lcmF0b3IsIHNlY3Rvcl90ICpkZW5vbWluYXRvcikKLXsKLQkqbnVtZXJhdG9yID0gZ2V0X2luZm8oc3RvcmUpLT5uZXh0X2ZyZWUgKiBzdG9yZS0+c25hcC0+Y2h1bmtfc2l6ZTsKLQkqZGVub21pbmF0b3IgPSBnZXRfZGV2X3NpemUoc3RvcmUtPnNuYXAtPmNvdy0+YmRldik7Ci19Ci0KLXN0YXRpYyB2b2lkIHBlcnNpc3RlbnRfZGVzdHJveShzdHJ1Y3QgZXhjZXB0aW9uX3N0b3JlICpzdG9yZSkKLXsKLQlzdHJ1Y3QgcHN0b3JlICpwcyA9IGdldF9pbmZvKHN0b3JlKTsKLQotCWRlc3Ryb3lfd29ya3F1ZXVlKHBzLT5tZXRhZGF0YV93cSk7Ci0JZG1faW9fY2xpZW50X2Rlc3Ryb3kocHMtPmlvX2NsaWVudCk7Ci0JdmZyZWUocHMtPmNhbGxiYWNrcyk7Ci0JZnJlZV9hcmVhKHBzKTsKLQlrZnJlZShwcyk7Ci19Ci0KLXN0YXRpYyBpbnQgcGVyc2lzdGVudF9yZWFkX21ldGFkYXRhKHN0cnVjdCBleGNlcHRpb25fc3RvcmUgKnN0b3JlKQotewotCWludCByLCB1bmluaXRpYWxpemVkX3ZhcihuZXdfc25hcHNob3QpOwotCXN0cnVjdCBwc3RvcmUgKnBzID0gZ2V0X2luZm8oc3RvcmUpOwotCi0JLyoKLQkgKiBSZWFkIHRoZSBzbmFwc2hvdCBoZWFkZXIuCi0JICovCi0JciA9IHJlYWRfaGVhZGVyKHBzLCAmbmV3X3NuYXBzaG90KTsKLQlpZiAocikKLQkJcmV0dXJuIHI7Ci0KLQkvKgotCSAqIE5vdyB3ZSBrbm93IGNvcnJlY3QgY2h1bmtfc2l6ZSwgY29tcGxldGUgdGhlIGluaXRpYWxpc2F0aW9uLgotCSAqLwotCXBzLT5leGNlcHRpb25zX3Blcl9hcmVhID0gKHBzLT5zbmFwLT5jaHVua19zaXplIDw8IFNFQ1RPUl9TSElGVCkgLwotCQkJCSAgc2l6ZW9mKHN0cnVjdCBkaXNrX2V4Y2VwdGlvbik7Ci0JcHMtPmNhbGxiYWNrcyA9IGRtX3ZjYWxsb2MocHMtPmV4Y2VwdGlvbnNfcGVyX2FyZWEsCi0JCQlzaXplb2YoKnBzLT5jYWxsYmFja3MpKTsKLQlpZiAoIXBzLT5jYWxsYmFja3MpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JLyoKLQkgKiBEbyB3ZSBuZWVkIHRvIHNldHVwIGEgbmV3IHNuYXBzaG90ID8KLQkgKi8KLQlpZiAobmV3X3NuYXBzaG90KSB7Ci0JCXIgPSB3cml0ZV9oZWFkZXIocHMpOwotCQlpZiAocikgewotCQkJRE1XQVJOKCJ3cml0ZV9oZWFkZXIgZmFpbGVkIik7Ci0JCQlyZXR1cm4gcjsKLQkJfQotCi0JCXBzLT5jdXJyZW50X2FyZWEgPSAwOwotCQl6ZXJvX21lbW9yeV9hcmVhKHBzKTsKLQkJciA9IHplcm9fZGlza19hcmVhKHBzLCAwKTsKLQkJaWYgKHIpIHsKLQkJCURNV0FSTigiemVyb19kaXNrX2FyZWEoMCkgZmFpbGVkIik7Ci0JCQlyZXR1cm4gcjsKLQkJfQotCX0gZWxzZSB7Ci0JCS8qCi0JCSAqIFNhbml0eSBjaGVja3MuCi0JCSAqLwotCQlpZiAocHMtPnZlcnNpb24gIT0gU05BUFNIT1RfRElTS19WRVJTSU9OKSB7Ci0JCQlETVdBUk4oInVuYWJsZSB0byBoYW5kbGUgc25hcHNob3QgZGlzayB2ZXJzaW9uICVkIiwKLQkJCSAgICAgICBwcy0+dmVyc2lvbik7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCi0JCS8qCi0JCSAqIE1ldGFkYXRhIGFyZSB2YWxpZCwgYnV0IHNuYXBzaG90IGlzIGludmFsaWRhdGVkCi0JCSAqLwotCQlpZiAoIXBzLT52YWxpZCkKLQkJCXJldHVybiAxOwotCi0JCS8qCi0JCSAqIFJlYWQgdGhlIG1ldGFkYXRhLgotCQkgKi8KLQkJciA9IHJlYWRfZXhjZXB0aW9ucyhwcyk7Ci0JCWlmIChyKQotCQkJcmV0dXJuIHI7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgcGVyc2lzdGVudF9wcmVwYXJlKHN0cnVjdCBleGNlcHRpb25fc3RvcmUgKnN0b3JlLAotCQkJICAgICAgc3RydWN0IGRtX3NuYXBfZXhjZXB0aW9uICplKQotewotCXN0cnVjdCBwc3RvcmUgKnBzID0gZ2V0X2luZm8oc3RvcmUpOwotCXVpbnQzMl90IHN0cmlkZTsKLQljaHVua190IG5leHRfZnJlZTsKLQlzZWN0b3JfdCBzaXplID0gZ2V0X2Rldl9zaXplKHN0b3JlLT5zbmFwLT5jb3ctPmJkZXYpOwotCi0JLyogSXMgdGhlcmUgZW5vdWdoIHJvb20gPyAqLwotCWlmIChzaXplIDwgKChwcy0+bmV4dF9mcmVlICsgMSkgKiBzdG9yZS0+c25hcC0+Y2h1bmtfc2l6ZSkpCi0JCXJldHVybiAtRU5PU1BDOwotCi0JZS0+bmV3X2NodW5rID0gcHMtPm5leHRfZnJlZTsKLQotCS8qCi0JICogTW92ZSBvbnRvIHRoZSBuZXh0IGZyZWUgcGVuZGluZywgbWFraW5nIHN1cmUgdG8gdGFrZQotCSAqIGludG8gYWNjb3VudCB0aGUgbG9jYXRpb24gb2YgdGhlIG1ldGFkYXRhIGNodW5rcy4KLQkgKi8KLQlzdHJpZGUgPSAocHMtPmV4Y2VwdGlvbnNfcGVyX2FyZWEgKyAxKTsKLQluZXh0X2ZyZWUgPSArK3BzLT5uZXh0X2ZyZWU7Ci0JaWYgKHNlY3Rvcl9kaXYobmV4dF9mcmVlLCBzdHJpZGUpID09IDEpCi0JCXBzLT5uZXh0X2ZyZWUrKzsKLQotCWF0b21pY19pbmMoJnBzLT5wZW5kaW5nX2NvdW50KTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgcGVyc2lzdGVudF9jb21taXQoc3RydWN0IGV4Y2VwdGlvbl9zdG9yZSAqc3RvcmUsCi0JCQkgICAgICBzdHJ1Y3QgZG1fc25hcF9leGNlcHRpb24gKmUsCi0JCQkgICAgICB2b2lkICgqY2FsbGJhY2spICh2b2lkICosIGludCBzdWNjZXNzKSwKLQkJCSAgICAgIHZvaWQgKmNhbGxiYWNrX2NvbnRleHQpCi17Ci0JdW5zaWduZWQgaW50IGk7Ci0Jc3RydWN0IHBzdG9yZSAqcHMgPSBnZXRfaW5mbyhzdG9yZSk7Ci0Jc3RydWN0IGRpc2tfZXhjZXB0aW9uIGRlOwotCXN0cnVjdCBjb21taXRfY2FsbGJhY2sgKmNiOwotCi0JZGUub2xkX2NodW5rID0gZS0+b2xkX2NodW5rOwotCWRlLm5ld19jaHVuayA9IGUtPm5ld19jaHVuazsKLQl3cml0ZV9leGNlcHRpb24ocHMsIHBzLT5jdXJyZW50X2NvbW1pdHRlZCsrLCAmZGUpOwotCi0JLyoKLQkgKiBBZGQgdGhlIGNhbGxiYWNrIHRvIHRoZSBiYWNrIG9mIHRoZSBhcnJheS4gIFRoaXMgY29kZQotCSAqIGlzIHRoZSBvbmx5IHBsYWNlIHdoZXJlIHRoZSBjYWxsYmFjayBhcnJheSBpcwotCSAqIG1hbmlwdWxhdGVkLCBhbmQgd2Uga25vdyB0aGF0IGl0IHdpbGwgbmV2ZXIgYmUgY2FsbGVkCi0JICogbXVsdGlwbGUgdGltZXMgY29uY3VycmVudGx5LgotCSAqLwotCWNiID0gcHMtPmNhbGxiYWNrcyArIHBzLT5jYWxsYmFja19jb3VudCsrOwotCWNiLT5jYWxsYmFjayA9IGNhbGxiYWNrOwotCWNiLT5jb250ZXh0ID0gY2FsbGJhY2tfY29udGV4dDsKLQotCS8qCi0JICogSWYgdGhlcmUgYXJlIGV4Y2VwdGlvbnMgaW4gZmxpZ2h0IGFuZCB3ZSBoYXZlIG5vdCB5ZXQKLQkgKiBmaWxsZWQgdGhpcyBtZXRhZGF0YSBhcmVhIHRoZXJlJ3Mgbm90aGluZyBtb3JlIHRvIGRvLgotCSAqLwotCWlmICghYXRvbWljX2RlY19hbmRfdGVzdCgmcHMtPnBlbmRpbmdfY291bnQpICYmCi0JICAgIChwcy0+Y3VycmVudF9jb21taXR0ZWQgIT0gcHMtPmV4Y2VwdGlvbnNfcGVyX2FyZWEpKQotCQlyZXR1cm47Ci0KLQkvKgotCSAqIElmIHdlIGNvbXBsZXRlbHkgZmlsbGVkIHRoZSBjdXJyZW50IGFyZWEsIHRoZW4gd2lwZSB0aGUgbmV4dCBvbmUuCi0JICovCi0JaWYgKChwcy0+Y3VycmVudF9jb21taXR0ZWQgPT0gcHMtPmV4Y2VwdGlvbnNfcGVyX2FyZWEpICYmCi0JICAgICB6ZXJvX2Rpc2tfYXJlYShwcywgcHMtPmN1cnJlbnRfYXJlYSArIDEpKQotCQlwcy0+dmFsaWQgPSAwOwotCi0JLyoKLQkgKiBDb21taXQgZXhjZXB0aW9ucyB0byBkaXNrLgotCSAqLwotCWlmIChwcy0+dmFsaWQgJiYgYXJlYV9pbyhwcywgV1JJVEUpKQotCQlwcy0+dmFsaWQgPSAwOwotCi0JLyoKLQkgKiBBZHZhbmNlIHRvIHRoZSBuZXh0IGFyZWEgaWYgdGhpcyBvbmUgaXMgZnVsbC4KLQkgKi8KLQlpZiAocHMtPmN1cnJlbnRfY29tbWl0dGVkID09IHBzLT5leGNlcHRpb25zX3Blcl9hcmVhKSB7Ci0JCXBzLT5jdXJyZW50X2NvbW1pdHRlZCA9IDA7Ci0JCXBzLT5jdXJyZW50X2FyZWErKzsKLQkJemVyb19tZW1vcnlfYXJlYShwcyk7Ci0JfQotCi0JZm9yIChpID0gMDsgaSA8IHBzLT5jYWxsYmFja19jb3VudDsgaSsrKSB7Ci0JCWNiID0gcHMtPmNhbGxiYWNrcyArIGk7Ci0JCWNiLT5jYWxsYmFjayhjYi0+Y29udGV4dCwgcHMtPnZhbGlkKTsKLQl9Ci0KLQlwcy0+Y2FsbGJhY2tfY291bnQgPSAwOwotfQotCi1zdGF0aWMgdm9pZCBwZXJzaXN0ZW50X2Ryb3Aoc3RydWN0IGV4Y2VwdGlvbl9zdG9yZSAqc3RvcmUpCi17Ci0Jc3RydWN0IHBzdG9yZSAqcHMgPSBnZXRfaW5mbyhzdG9yZSk7Ci0KLQlwcy0+dmFsaWQgPSAwOwotCWlmICh3cml0ZV9oZWFkZXIocHMpKQotCQlETVdBUk4oIndyaXRlIGhlYWRlciBmYWlsZWQiKTsKLX0KLQotaW50IGRtX2NyZWF0ZV9wZXJzaXN0ZW50KHN0cnVjdCBleGNlcHRpb25fc3RvcmUgKnN0b3JlKQotewotCXN0cnVjdCBwc3RvcmUgKnBzOwotCi0JLyogYWxsb2NhdGUgdGhlIHBzdG9yZSAqLwotCXBzID0ga21hbGxvYyhzaXplb2YoKnBzKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwcykKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlwcy0+c25hcCA9IHN0b3JlLT5zbmFwOwotCXBzLT52YWxpZCA9IDE7Ci0JcHMtPnZlcnNpb24gPSBTTkFQU0hPVF9ESVNLX1ZFUlNJT047Ci0JcHMtPmFyZWEgPSBOVUxMOwotCXBzLT5uZXh0X2ZyZWUgPSAyOwkvKiBza2lwcGluZyB0aGUgaGVhZGVyIGFuZCBmaXJzdCBhcmVhICovCi0JcHMtPmN1cnJlbnRfY29tbWl0dGVkID0gMDsKLQotCXBzLT5jYWxsYmFja19jb3VudCA9IDA7Ci0JYXRvbWljX3NldCgmcHMtPnBlbmRpbmdfY291bnQsIDApOwotCXBzLT5jYWxsYmFja3MgPSBOVUxMOwotCi0JcHMtPm1ldGFkYXRhX3dxID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoImtzbmFwaGQiKTsKLQlpZiAoIXBzLT5tZXRhZGF0YV93cSkgewotCQlrZnJlZShwcyk7Ci0JCURNRVJSKCJjb3VsZG4ndCBzdGFydCBoZWFkZXIgbWV0YWRhdGEgdXBkYXRlIHRocmVhZCIpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQlzdG9yZS0+ZGVzdHJveSA9IHBlcnNpc3RlbnRfZGVzdHJveTsKLQlzdG9yZS0+cmVhZF9tZXRhZGF0YSA9IHBlcnNpc3RlbnRfcmVhZF9tZXRhZGF0YTsKLQlzdG9yZS0+cHJlcGFyZV9leGNlcHRpb24gPSBwZXJzaXN0ZW50X3ByZXBhcmU7Ci0Jc3RvcmUtPmNvbW1pdF9leGNlcHRpb24gPSBwZXJzaXN0ZW50X2NvbW1pdDsKLQlzdG9yZS0+ZHJvcF9zbmFwc2hvdCA9IHBlcnNpc3RlbnRfZHJvcDsKLQlzdG9yZS0+ZnJhY3Rpb25fZnVsbCA9IHBlcnNpc3RlbnRfZnJhY3Rpb25fZnVsbDsKLQlzdG9yZS0+Y29udGV4dCA9IHBzOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBzdG9yZSBmb3Igbm9uLXBlcnNpc3RlbnQgc25hcHNob3RzLgotICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotc3RydWN0IHRyYW5zaWVudF9jIHsKLQlzZWN0b3JfdCBuZXh0X2ZyZWU7Ci19OwotCi1zdGF0aWMgdm9pZCB0cmFuc2llbnRfZGVzdHJveShzdHJ1Y3QgZXhjZXB0aW9uX3N0b3JlICpzdG9yZSkKLXsKLQlrZnJlZShzdG9yZS0+Y29udGV4dCk7Ci19Ci0KLXN0YXRpYyBpbnQgdHJhbnNpZW50X3JlYWRfbWV0YWRhdGEoc3RydWN0IGV4Y2VwdGlvbl9zdG9yZSAqc3RvcmUpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdHJhbnNpZW50X3ByZXBhcmUoc3RydWN0IGV4Y2VwdGlvbl9zdG9yZSAqc3RvcmUsCi0JCQkgICAgIHN0cnVjdCBkbV9zbmFwX2V4Y2VwdGlvbiAqZSkKLXsKLQlzdHJ1Y3QgdHJhbnNpZW50X2MgKnRjID0gKHN0cnVjdCB0cmFuc2llbnRfYyAqKSBzdG9yZS0+Y29udGV4dDsKLQlzZWN0b3JfdCBzaXplID0gZ2V0X2Rldl9zaXplKHN0b3JlLT5zbmFwLT5jb3ctPmJkZXYpOwotCi0JaWYgKHNpemUgPCAodGMtPm5leHRfZnJlZSArIHN0b3JlLT5zbmFwLT5jaHVua19zaXplKSkKLQkJcmV0dXJuIC0xOwotCi0JZS0+bmV3X2NodW5rID0gc2VjdG9yX3RvX2NodW5rKHN0b3JlLT5zbmFwLCB0Yy0+bmV4dF9mcmVlKTsKLQl0Yy0+bmV4dF9mcmVlICs9IHN0b3JlLT5zbmFwLT5jaHVua19zaXplOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIHRyYW5zaWVudF9jb21taXQoc3RydWN0IGV4Y2VwdGlvbl9zdG9yZSAqc3RvcmUsCi0JCQkgICAgIHN0cnVjdCBkbV9zbmFwX2V4Y2VwdGlvbiAqZSwKLQkJCSAgICAgdm9pZCAoKmNhbGxiYWNrKSAodm9pZCAqLCBpbnQgc3VjY2VzcyksCi0JCQkgICAgIHZvaWQgKmNhbGxiYWNrX2NvbnRleHQpCi17Ci0JLyogSnVzdCBzdWNjZWVkICovCi0JY2FsbGJhY2soY2FsbGJhY2tfY29udGV4dCwgMSk7Ci19Ci0KLXN0YXRpYyB2b2lkIHRyYW5zaWVudF9mcmFjdGlvbl9mdWxsKHN0cnVjdCBleGNlcHRpb25fc3RvcmUgKnN0b3JlLAotCQkJCSAgICBzZWN0b3JfdCAqbnVtZXJhdG9yLCBzZWN0b3JfdCAqZGVub21pbmF0b3IpCi17Ci0JKm51bWVyYXRvciA9ICgoc3RydWN0IHRyYW5zaWVudF9jICopIHN0b3JlLT5jb250ZXh0KS0+bmV4dF9mcmVlOwotCSpkZW5vbWluYXRvciA9IGdldF9kZXZfc2l6ZShzdG9yZS0+c25hcC0+Y293LT5iZGV2KTsKLX0KLQotaW50IGRtX2NyZWF0ZV90cmFuc2llbnQoc3RydWN0IGV4Y2VwdGlvbl9zdG9yZSAqc3RvcmUpCi17Ci0Jc3RydWN0IHRyYW5zaWVudF9jICp0YzsKLQotCXN0b3JlLT5kZXN0cm95ID0gdHJhbnNpZW50X2Rlc3Ryb3k7Ci0Jc3RvcmUtPnJlYWRfbWV0YWRhdGEgPSB0cmFuc2llbnRfcmVhZF9tZXRhZGF0YTsKLQlzdG9yZS0+cHJlcGFyZV9leGNlcHRpb24gPSB0cmFuc2llbnRfcHJlcGFyZTsKLQlzdG9yZS0+Y29tbWl0X2V4Y2VwdGlvbiA9IHRyYW5zaWVudF9jb21taXQ7Ci0Jc3RvcmUtPmRyb3Bfc25hcHNob3QgPSBOVUxMOwotCXN0b3JlLT5mcmFjdGlvbl9mdWxsID0gdHJhbnNpZW50X2ZyYWN0aW9uX2Z1bGw7Ci0KLQl0YyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB0cmFuc2llbnRfYyksIEdGUF9LRVJORUwpOwotCWlmICghdGMpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JdGMtPm5leHRfZnJlZSA9IDA7Ci0Jc3RvcmUtPmNvbnRleHQgPSB0YzsKLQotCXJldHVybiAwOworCWRtX3BlcnNpc3RlbnRfc25hcHNob3RfZXhpdCgpOworCWRtX3RyYW5zaWVudF9zbmFwc2hvdF9leGl0KCk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2RtLWV4Y2VwdGlvbi1zdG9yZS5oIGIvZHJpdmVycy9tZC9kbS1leGNlcHRpb24tc3RvcmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjlmMzNkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZC9kbS1leGNlcHRpb24tc3RvcmUuaApAQCAtMCwwICsxLDE0OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDAyIFNpc3RpbmEgU29mdHdhcmUgKFVLKSBMaW1pdGVkLgorICogQ29weXJpZ2h0IChDKSAyMDA4IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZpY2UtbWFwcGVyIHNuYXBzaG90IGV4Y2VwdGlvbiBzdG9yZS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIEdQTC4KKyAqLworCisjaWZuZGVmIF9MSU5VWF9ETV9FWENFUFRJT05fU1RPUkUKKyNkZWZpbmUgX0xJTlVYX0RNX0VYQ0VQVElPTl9TVE9SRQorCisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLW1hcHBlci5oPgorCisvKgorICogVGhlIHNuYXBzaG90IGNvZGUgZGVhbHMgd2l0aCBsYXJnaXNoIGNodW5rcyBvZiB0aGUgZGlzayBhdCBhCisgKiB0aW1lLiBUeXBpY2FsbHkgMzJrIC0gNTEyay4KKyAqLwordHlwZWRlZiBzZWN0b3JfdCBjaHVua190OworCisvKgorICogQW4gZXhjZXB0aW9uIGlzIHVzZWQgd2hlcmUgYW4gb2xkIGNodW5rIG9mIGRhdGEgaGFzIGJlZW4KKyAqIHJlcGxhY2VkIGJ5IGEgbmV3IG9uZS4KKyAqIElmIGNodW5rX3QgaXMgNjQgYml0cyBpbiBzaXplLCB0aGUgdG9wIDggYml0cyBvZiBuZXdfY2h1bmsgaG9sZCB0aGUgbnVtYmVyCisgKiBvZiBjaHVua3MgdGhhdCBmb2xsb3cgY29udGlndW91c2x5LiAgUmVtYWluaW5nIGJpdHMgaG9sZCB0aGUgbnVtYmVyIG9mIHRoZQorICogY2h1bmsgd2l0aGluIHRoZSBkZXZpY2UuCisgKi8KK3N0cnVjdCBkbV9zbmFwX2V4Y2VwdGlvbiB7CisJc3RydWN0IGxpc3RfaGVhZCBoYXNoX2xpc3Q7CisKKwljaHVua190IG9sZF9jaHVuazsKKwljaHVua190IG5ld19jaHVuazsKK307CisKKy8qCisgKiBBYnN0cmFjdGlvbiB0byBoYW5kbGUgdGhlIG1ldGEvbGF5b3V0IG9mIGV4Y2VwdGlvbiBzdG9yZXMgKHRoZQorICogQ09XIGRldmljZSkuCisgKi8KK3N0cnVjdCBkbV9leGNlcHRpb25fc3RvcmUgeworCS8qCisJICogRGVzdHJveXMgdGhpcyBvYmplY3Qgd2hlbiB5b3UndmUgZmluaXNoZWQgd2l0aCBpdC4KKwkgKi8KKwl2b2lkICgqZGVzdHJveSkgKHN0cnVjdCBkbV9leGNlcHRpb25fc3RvcmUgKnN0b3JlKTsKKworCS8qCisJICogVGhlIHRhcmdldCBzaG91bGRuJ3QgcmVhZCB0aGUgQ09XIGRldmljZSB1bnRpbCB0aGlzIGlzCisJICogY2FsbGVkLiAgQXMgZXhjZXB0aW9ucyBhcmUgcmVhZCBmcm9tIHRoZSBDT1csIHRoZXkgYXJlCisJICogcmVwb3J0ZWQgYmFjayB2aWEgdGhlIGNhbGxiYWNrLgorCSAqLworCWludCAoKnJlYWRfbWV0YWRhdGEpIChzdHJ1Y3QgZG1fZXhjZXB0aW9uX3N0b3JlICpzdG9yZSwKKwkJCSAgICAgIGludCAoKmNhbGxiYWNrKSh2b2lkICpjYWxsYmFja19jb250ZXh0LAorCQkJCQkgICAgICBjaHVua190IG9sZCwgY2h1bmtfdCBuZXcpLAorCQkJICAgICAgdm9pZCAqY2FsbGJhY2tfY29udGV4dCk7CisKKwkvKgorCSAqIEZpbmQgc29tZXdoZXJlIHRvIHN0b3JlIHRoZSBuZXh0IGV4Y2VwdGlvbi4KKwkgKi8KKwlpbnQgKCpwcmVwYXJlX2V4Y2VwdGlvbikgKHN0cnVjdCBkbV9leGNlcHRpb25fc3RvcmUgKnN0b3JlLAorCQkJCSAgc3RydWN0IGRtX3NuYXBfZXhjZXB0aW9uICplKTsKKworCS8qCisJICogVXBkYXRlIHRoZSBtZXRhZGF0YSB3aXRoIHRoaXMgZXhjZXB0aW9uLgorCSAqLworCXZvaWQgKCpjb21taXRfZXhjZXB0aW9uKSAoc3RydWN0IGRtX2V4Y2VwdGlvbl9zdG9yZSAqc3RvcmUsCisJCQkJICBzdHJ1Y3QgZG1fc25hcF9leGNlcHRpb24gKmUsCisJCQkJICB2b2lkICgqY2FsbGJhY2spICh2b2lkICosIGludCBzdWNjZXNzKSwKKwkJCQkgIHZvaWQgKmNhbGxiYWNrX2NvbnRleHQpOworCisJLyoKKwkgKiBUaGUgc25hcHNob3QgaXMgaW52YWxpZCwgbm90ZSB0aGlzIGluIHRoZSBtZXRhZGF0YS4KKwkgKi8KKwl2b2lkICgqZHJvcF9zbmFwc2hvdCkgKHN0cnVjdCBkbV9leGNlcHRpb25fc3RvcmUgKnN0b3JlKTsKKworCWludCAoKnN0YXR1cykgKHN0cnVjdCBkbV9leGNlcHRpb25fc3RvcmUgKnN0b3JlLCBzdGF0dXNfdHlwZV90IHN0YXR1cywKKwkJICAgICAgIGNoYXIgKnJlc3VsdCwgdW5zaWduZWQgaW50IG1heGxlbik7CisKKwkvKgorCSAqIFJldHVybiBob3cgZnVsbCB0aGUgc25hcHNob3QgaXMuCisJICovCisJdm9pZCAoKmZyYWN0aW9uX2Z1bGwpIChzdHJ1Y3QgZG1fZXhjZXB0aW9uX3N0b3JlICpzdG9yZSwKKwkJCSAgICAgICBzZWN0b3JfdCAqbnVtZXJhdG9yLAorCQkJICAgICAgIHNlY3Rvcl90ICpkZW5vbWluYXRvcik7CisKKwlzdHJ1Y3QgZG1fc25hcHNob3QgKnNuYXA7CisJdm9pZCAqY29udGV4dDsKK307CisKKy8qCisgKiBGdW50aW9ucyB0byBtYW5pcHVsYXRlIGNvbnNlY3V0aXZlIGNodW5rcworICovCisjICBpZiBkZWZpbmVkKENPTkZJR19MQkQpIHx8IChCSVRTX1BFUl9MT05HID09IDY0KQorIyAgICBkZWZpbmUgRE1fQ0hVTktfQ09OU0VDVVRJVkVfQklUUyA4CisjICAgIGRlZmluZSBETV9DSFVOS19OVU1CRVJfQklUUyA1NgorCitzdGF0aWMgaW5saW5lIGNodW5rX3QgZG1fY2h1bmtfbnVtYmVyKGNodW5rX3QgY2h1bmspCit7CisJcmV0dXJuIGNodW5rICYgKGNodW5rX3QpKCgxVUxMIDw8IERNX0NIVU5LX05VTUJFUl9CSVRTKSAtIDFVTEwpOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGRtX2NvbnNlY3V0aXZlX2NodW5rX2NvdW50KHN0cnVjdCBkbV9zbmFwX2V4Y2VwdGlvbiAqZSkKK3sKKwlyZXR1cm4gZS0+bmV3X2NodW5rID4+IERNX0NIVU5LX05VTUJFUl9CSVRTOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZG1fY29uc2VjdXRpdmVfY2h1bmtfY291bnRfaW5jKHN0cnVjdCBkbV9zbmFwX2V4Y2VwdGlvbiAqZSkKK3sKKwllLT5uZXdfY2h1bmsgKz0gKDFVTEwgPDwgRE1fQ0hVTktfTlVNQkVSX0JJVFMpOworCisJQlVHX09OKCFkbV9jb25zZWN1dGl2ZV9jaHVua19jb3VudChlKSk7Cit9CisKKyMgIGVsc2UKKyMgICAgZGVmaW5lIERNX0NIVU5LX0NPTlNFQ1VUSVZFX0JJVFMgMAorCitzdGF0aWMgaW5saW5lIGNodW5rX3QgZG1fY2h1bmtfbnVtYmVyKGNodW5rX3QgY2h1bmspCit7CisJcmV0dXJuIGNodW5rOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGRtX2NvbnNlY3V0aXZlX2NodW5rX2NvdW50KHN0cnVjdCBkbV9zbmFwX2V4Y2VwdGlvbiAqZSkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGRtX2NvbnNlY3V0aXZlX2NodW5rX2NvdW50X2luYyhzdHJ1Y3QgZG1fc25hcF9leGNlcHRpb24gKmUpCit7Cit9CisKKyMgIGVuZGlmCisKK2ludCBkbV9leGNlcHRpb25fc3RvcmVfaW5pdCh2b2lkKTsKK3ZvaWQgZG1fZXhjZXB0aW9uX3N0b3JlX2V4aXQodm9pZCk7CisKKy8qCisgKiBUd28gZXhjZXB0aW9uIHN0b3JlIGltcGxlbWVudGF0aW9ucy4KKyAqLworaW50IGRtX3BlcnNpc3RlbnRfc25hcHNob3RfaW5pdCh2b2lkKTsKK3ZvaWQgZG1fcGVyc2lzdGVudF9zbmFwc2hvdF9leGl0KHZvaWQpOworCitpbnQgZG1fdHJhbnNpZW50X3NuYXBzaG90X2luaXQodm9pZCk7Cit2b2lkIGRtX3RyYW5zaWVudF9zbmFwc2hvdF9leGl0KHZvaWQpOworCitpbnQgZG1fY3JlYXRlX3BlcnNpc3RlbnQoc3RydWN0IGRtX2V4Y2VwdGlvbl9zdG9yZSAqc3RvcmUpOworCitpbnQgZG1fY3JlYXRlX3RyYW5zaWVudChzdHJ1Y3QgZG1fZXhjZXB0aW9uX3N0b3JlICpzdG9yZSk7CisKKyNlbmRpZiAvKiBfTElOVVhfRE1fRVhDRVBUSU9OX1NUT1JFICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2RtLWlvY3RsLmMgYi9kcml2ZXJzL21kL2RtLWlvY3RsLmMKaW5kZXggNzc3Yzk0OC4uNTRkMDU4OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9kbS1pb2N0bC5jCisrKyBiL2RyaXZlcnMvbWQvZG0taW9jdGwuYwpAQCAtMjMzLDcgKzIzMyw3IEBACiAJfQogCiAJaWYgKGhjLT5uZXdfbWFwKQotCQlkbV90YWJsZV9wdXQoaGMtPm5ld19tYXApOworCQlkbV90YWJsZV9kZXN0cm95KGhjLT5uZXdfbWFwKTsKIAlkbV9wdXQoaGMtPm1kKTsKIAlmcmVlX2NlbGwoaGMpOwogfQpAQCAtODI3LDggKzgyNyw4IEBACiAKIAkJciA9IGRtX3N3YXBfdGFibGUobWQsIG5ld19tYXApOwogCQlpZiAocikgeworCQkJZG1fdGFibGVfZGVzdHJveShuZXdfbWFwKTsKIAkJCWRtX3B1dChtZCk7Ci0JCQlkbV90YWJsZV9wdXQobmV3X21hcCk7CiAJCQlyZXR1cm4gcjsKIAkJfQogCkBAIC04MzYsOCArODM2LDYgQEAKIAkJCXNldF9kaXNrX3JvKGRtX2Rpc2sobWQpLCAwKTsKIAkJZWxzZQogCQkJc2V0X2Rpc2tfcm8oZG1fZGlzayhtZCksIDEpOwotCi0JCWRtX3RhYmxlX3B1dChuZXdfbWFwKTsKIAl9CiAKIAlpZiAoZG1fc3VzcGVuZGVkKG1kKSkKQEAgLTEwODAsNyArMTA3OCw3IEBACiAJfQogCiAJaWYgKGhjLT5uZXdfbWFwKQotCQlkbV90YWJsZV9wdXQoaGMtPm5ld19tYXApOworCQlkbV90YWJsZV9kZXN0cm95KGhjLT5uZXdfbWFwKTsKIAloYy0+bmV3X21hcCA9IHQ7CiAJdXBfd3JpdGUoJl9oYXNoX2xvY2spOwogCkBAIC0xMTA5LDcgKzExMDcsNyBAQAogCX0KIAogCWlmIChoYy0+bmV3X21hcCkgewotCQlkbV90YWJsZV9wdXQoaGMtPm5ld19tYXApOworCQlkbV90YWJsZV9kZXN0cm95KGhjLT5uZXdfbWFwKTsKIAkJaGMtPm5ld19tYXAgPSBOVUxMOwogCX0KIApAQCAtMTU1MCw4ICsxNTQ4LDEwIEBACiAJCWdvdG8gb3V0OwogCX0KIAotCXN0cmNweShuYW1lLCBoYy0+bmFtZSk7Ci0Jc3RyY3B5KHV1aWQsIGhjLT51dWlkID8gOiAiIik7CisJaWYgKG5hbWUpCisJCXN0cmNweShuYW1lLCBoYy0+bmFtZSk7CisJaWYgKHV1aWQpCisJCXN0cmNweSh1dWlkLCBoYy0+dXVpZCA/IDogIiIpOwogCiBvdXQ6CiAJdXBfcmVhZCgmX2hhc2hfbG9jayk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2RtLWxpbmVhci5jIGIvZHJpdmVycy9tZC9kbS1saW5lYXIuYwppbmRleCA0NDA0MmJlLi5iZmExMDdmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL2RtLWxpbmVhci5jCisrKyBiL2RyaXZlcnMvbWQvZG0tbGluZWFyLmMKQEAgLTE0Miw2ICsxNDIsNyBAQAogCS5zdGF0dXMgPSBsaW5lYXJfc3RhdHVzLAogCS5pb2N0bCAgPSBsaW5lYXJfaW9jdGwsCiAJLm1lcmdlICA9IGxpbmVhcl9tZXJnZSwKKwkuZmVhdHVyZXMgPSBETV9UQVJHRVRfU1VQUE9SVFNfQkFSUklFUlMsCiB9OwogCiBpbnQgX19pbml0IGRtX2xpbmVhcl9pbml0KHZvaWQpCkBAIC0xNTYsOCArMTU3LDUgQEAKIAogdm9pZCBkbV9saW5lYXJfZXhpdCh2b2lkKQogewotCWludCByID0gZG1fdW5yZWdpc3Rlcl90YXJnZXQoJmxpbmVhcl90YXJnZXQpOwotCi0JaWYgKHIgPCAwKQotCQlETUVSUigidW5yZWdpc3RlciBmYWlsZWQgJWQiLCByKTsKKwlkbV91bnJlZ2lzdGVyX3RhcmdldCgmbGluZWFyX3RhcmdldCk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2RtLWxvZy5jIGIvZHJpdmVycy9tZC9kbS1sb2cuYwppbmRleCBhOGMwZmM3Li43Mzc5NjFmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL2RtLWxvZy5jCisrKyBiL2RyaXZlcnMvbWQvZG0tbG9nLmMKQEAgLTMyNiw4ICszMjYsNiBAQAogc3RhdGljIGludCByd19oZWFkZXIoc3RydWN0IGxvZ19jICpsYywgaW50IHJ3KQogewogCWxjLT5pb19yZXEuYmlfcncgPSBydzsKLQlsYy0+aW9fcmVxLm1lbS5wdHIudm1hID0gbGMtPmRpc2tfaGVhZGVyOwotCWxjLT5pb19yZXEubm90aWZ5LmZuID0gTlVMTDsKIAogCXJldHVybiBkbV9pbygmbGMtPmlvX3JlcSwgMSwgJmxjLT5oZWFkZXJfbG9jYXRpb24sIE5VTEwpOwogfQpAQCAtMzYyLDEwICszNjAsMTUgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgd3JpdGVfaGVhZGVyKHN0cnVjdCBsb2dfYyAqbG9nKQorc3RhdGljIGludCBfY2hlY2tfcmVnaW9uX3NpemUoc3RydWN0IGRtX3RhcmdldCAqdGksIHVpbnQzMl90IHJlZ2lvbl9zaXplKQogewotCWhlYWRlcl90b19kaXNrKCZsb2ctPmhlYWRlciwgbG9nLT5kaXNrX2hlYWRlcik7Ci0JcmV0dXJuIHJ3X2hlYWRlcihsb2csIFdSSVRFKTsKKwlpZiAocmVnaW9uX3NpemUgPCAyIHx8IHJlZ2lvbl9zaXplID4gdGktPmxlbikKKwkJcmV0dXJuIDA7CisKKwlpZiAoIWlzX3Bvd2VyX29mXzIocmVnaW9uX3NpemUpKQorCQlyZXR1cm4gMDsKKworCXJldHVybiAxOwogfQogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTQwMyw4ICs0MDYsOSBAQAogCQl9CiAJfQogCi0JaWYgKHNzY2FuZihhcmd2WzBdLCAiJXUiLCAmcmVnaW9uX3NpemUpICE9IDEpIHsKLQkJRE1XQVJOKCJpbnZhbGlkIHJlZ2lvbiBzaXplIHN0cmluZyIpOworCWlmIChzc2NhbmYoYXJndlswXSwgIiV1IiwgJnJlZ2lvbl9zaXplKSAhPSAxIHx8CisJICAgICFfY2hlY2tfcmVnaW9uX3NpemUodGksIHJlZ2lvbl9zaXplKSkgeworCQlETVdBUk4oImludmFsaWQgcmVnaW9uIHNpemUgJXMiLCBhcmd2WzBdKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC00NTMsOCArNDU3LDE4IEBACiAJCSAqLwogCQlidWZfc2l6ZSA9IGRtX3JvdW5kX3VwKChMT0dfT0ZGU0VUIDw8IFNFQ1RPUl9TSElGVCkgKwogCQkJCSAgICAgICBiaXRzZXRfc2l6ZSwgdGktPmxpbWl0cy5oYXJkc2VjdF9zaXplKTsKKworCQlpZiAoYnVmX3NpemUgPiBkZXYtPmJkZXYtPmJkX2lub2RlLT5pX3NpemUpIHsKKwkJCURNV0FSTigibG9nIGRldmljZSAlcyB0b28gc21hbGw6IG5lZWQgJWxsdSBieXRlcyIsCisJCQkJZGV2LT5uYW1lLCAodW5zaWduZWQgbG9uZyBsb25nKWJ1Zl9zaXplKTsKKwkJCWtmcmVlKGxjKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKIAkJbGMtPmhlYWRlcl9sb2NhdGlvbi5jb3VudCA9IGJ1Zl9zaXplID4+IFNFQ1RPUl9TSElGVDsKKwogCQlsYy0+aW9fcmVxLm1lbS50eXBlID0gRE1fSU9fVk1BOworCQlsYy0+aW9fcmVxLm5vdGlmeS5mbiA9IE5VTEw7CiAJCWxjLT5pb19yZXEuY2xpZW50ID0gZG1faW9fY2xpZW50X2NyZWF0ZShkbV9kaXZfdXAoYnVmX3NpemUsCiAJCQkJCQkJCSAgIFBBR0VfU0laRSkpOwogCQlpZiAoSVNfRVJSKGxjLT5pb19yZXEuY2xpZW50KSkgewpAQCAtNDY3LDEwICs0ODEsMTIgQEAKIAkJbGMtPmRpc2tfaGVhZGVyID0gdm1hbGxvYyhidWZfc2l6ZSk7CiAJCWlmICghbGMtPmRpc2tfaGVhZGVyKSB7CiAJCQlETVdBUk4oImNvdWxkbid0IGFsbG9jYXRlIGRpc2sgbG9nIGJ1ZmZlciIpOworCQkJZG1faW9fY2xpZW50X2Rlc3Ryb3kobGMtPmlvX3JlcS5jbGllbnQpOwogCQkJa2ZyZWUobGMpOwogCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0KIAorCQlsYy0+aW9fcmVxLm1lbS5wdHIudm1hID0gbGMtPmRpc2tfaGVhZGVyOwogCQlsYy0+Y2xlYW5fYml0cyA9ICh2b2lkICopbGMtPmRpc2tfaGVhZGVyICsKIAkJCQkgKExPR19PRkZTRVQgPDwgU0VDVE9SX1NISUZUKTsKIAl9CkBAIC00ODIsNiArNDk4LDggQEAKIAkJRE1XQVJOKCJjb3VsZG4ndCBhbGxvY2F0ZSBzeW5jIGJpdHNldCIpOwogCQlpZiAoIWRldikKIAkJCXZmcmVlKGxjLT5jbGVhbl9iaXRzKTsKKwkJZWxzZQorCQkJZG1faW9fY2xpZW50X2Rlc3Ryb3kobGMtPmlvX3JlcS5jbGllbnQpOwogCQl2ZnJlZShsYy0+ZGlza19oZWFkZXIpOwogCQlrZnJlZShsYyk7CiAJCXJldHVybiAtRU5PTUVNOwpAQCAtNDk1LDYgKzUxMyw4IEBACiAJCXZmcmVlKGxjLT5zeW5jX2JpdHMpOwogCQlpZiAoIWRldikKIAkJCXZmcmVlKGxjLT5jbGVhbl9iaXRzKTsKKwkJZWxzZQorCQkJZG1faW9fY2xpZW50X2Rlc3Ryb3kobGMtPmlvX3JlcS5jbGllbnQpOwogCQl2ZnJlZShsYy0+ZGlza19oZWFkZXIpOwogCQlrZnJlZShsYyk7CiAJCXJldHVybiAtRU5PTUVNOwpAQCAtNjMxLDggKzY1MSwxMCBAQAogCS8qIHNldCB0aGUgY29ycmVjdCBudW1iZXIgb2YgcmVnaW9ucyBpbiB0aGUgaGVhZGVyICovCiAJbGMtPmhlYWRlci5ucl9yZWdpb25zID0gbGMtPnJlZ2lvbl9jb3VudDsKIAorCWhlYWRlcl90b19kaXNrKCZsYy0+aGVhZGVyLCBsYy0+ZGlza19oZWFkZXIpOworCiAJLyogd3JpdGUgdGhlIG5ldyBoZWFkZXIgKi8KLQlyID0gd3JpdGVfaGVhZGVyKGxjKTsKKwlyID0gcndfaGVhZGVyKGxjLCBXUklURSk7CiAJaWYgKHIpIHsKIAkJRE1XQVJOKCIlczogRmFpbGVkIHRvIHdyaXRlIGhlYWRlciBvbiBkaXJ0eSByZWdpb24gbG9nIGRldmljZSIsCiAJCSAgICAgICBsYy0+bG9nX2Rldi0+bmFtZSk7CkBAIC02ODIsNyArNzA0LDcgQEAKIAlpZiAoIWxjLT50b3VjaGVkKQogCQlyZXR1cm4gMDsKIAotCXIgPSB3cml0ZV9oZWFkZXIobGMpOworCXIgPSByd19oZWFkZXIobGMsIFdSSVRFKTsKIAlpZiAocikKIAkJZmFpbF9sb2dfZGV2aWNlKGxjKTsKIAllbHNlCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2RtLW1wYXRoLmMgYi9kcml2ZXJzL21kL2RtLW1wYXRoLmMKaW5kZXggM2Q3ZjQ5Mi4uMDk1Zjc3YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9kbS1tcGF0aC5jCisrKyBiL2RyaXZlcnMvbWQvZG0tbXBhdGguYwpAQCAtODg5LDcgKzg4OSw3IEBACiAJZG1fcGF0aF91ZXZlbnQoRE1fVUVWRU5UX1BBVEhfRkFJTEVELCBtLT50aSwKIAkJICAgICAgcGdwYXRoLT5wYXRoLmRldi0+bmFtZSwgbS0+bnJfdmFsaWRfcGF0aHMpOwogCi0JcXVldWVfd29yayhrbXVsdGlwYXRoZCwgJm0tPnRyaWdnZXJfZXZlbnQpOworCXNjaGVkdWxlX3dvcmsoJm0tPnRyaWdnZXJfZXZlbnQpOwogCXF1ZXVlX3dvcmsoa211bHRpcGF0aGQsICZwZ3BhdGgtPmRlYWN0aXZhdGVfcGF0aCk7CiAKIG91dDoKQEAgLTkzMiw3ICs5MzIsNyBAQAogCWRtX3BhdGhfdWV2ZW50KERNX1VFVkVOVF9QQVRIX1JFSU5TVEFURUQsIG0tPnRpLAogCQkgICAgICBwZ3BhdGgtPnBhdGguZGV2LT5uYW1lLCBtLT5ucl92YWxpZF9wYXRocyk7CiAKLQlxdWV1ZV93b3JrKGttdWx0aXBhdGhkLCAmbS0+dHJpZ2dlcl9ldmVudCk7CisJc2NoZWR1bGVfd29yaygmbS0+dHJpZ2dlcl9ldmVudCk7CiAKIG91dDoKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtLT5sb2NrLCBmbGFncyk7CkBAIC05NzYsNyArOTc2LDcgQEAKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm0tPmxvY2ssIGZsYWdzKTsKIAotCXF1ZXVlX3dvcmsoa211bHRpcGF0aGQsICZtLT50cmlnZ2VyX2V2ZW50KTsKKwlzY2hlZHVsZV93b3JrKCZtLT50cmlnZ2VyX2V2ZW50KTsKIH0KIAogLyoKQEAgLTEwMDYsNyArMTAwNiw3IEBACiAJfQogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm0tPmxvY2ssIGZsYWdzKTsKIAotCXF1ZXVlX3dvcmsoa211bHRpcGF0aGQsICZtLT50cmlnZ2VyX2V2ZW50KTsKKwlzY2hlZHVsZV93b3JrKCZtLT50cmlnZ2VyX2V2ZW50KTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTQ5NSwxNCArMTQ5NSwxMCBAQAogCiBzdGF0aWMgdm9pZCBfX2V4aXQgZG1fbXVsdGlwYXRoX2V4aXQodm9pZCkKIHsKLQlpbnQgcjsKLQogCWRlc3Ryb3lfd29ya3F1ZXVlKGttcGF0aF9oYW5kbGVyZCk7CiAJZGVzdHJveV93b3JrcXVldWUoa211bHRpcGF0aGQpOwogCi0JciA9IGRtX3VucmVnaXN0ZXJfdGFyZ2V0KCZtdWx0aXBhdGhfdGFyZ2V0KTsKLQlpZiAociA8IDApCi0JCURNRVJSKCJ0YXJnZXQgdW5yZWdpc3RlciBmYWlsZWQgJWQiLCByKTsKKwlkbV91bnJlZ2lzdGVyX3RhcmdldCgmbXVsdGlwYXRoX3RhcmdldCk7CiAJa21lbV9jYWNoZV9kZXN0cm95KF9tcGlvX2NhY2hlKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9kbS1yYWlkMS5jIGIvZHJpdmVycy9tZC9kbS1yYWlkMS5jCmluZGV4IGVjNDNmOWYuLjRkNmJjMTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvZG0tcmFpZDEuYworKysgYi9kcml2ZXJzL21kL2RtLXJhaWQxLmMKQEAgLTE5Nyw5ICsxOTcsNiBAQAogCXN0cnVjdCBtaXJyb3Jfc2V0ICptcyA9IG0tPm1zOwogCXN0cnVjdCBtaXJyb3IgKm5ldzsKIAotCWlmICghZXJyb3JzX2hhbmRsZWQobXMpKQotCQlyZXR1cm47Ci0KIAkvKgogCSAqIGVycm9yX2NvdW50IGlzIHVzZWQgZm9yIG5vdGhpbmcgbW9yZSB0aGFuIGEKIAkgKiBzaW1wbGUgd2F5IHRvIHRlbGwgaWYgYSBkZXZpY2UgaGFzIGVuY291bnRlcmVkCkBAIC0yMTAsNiArMjA3LDkgQEAKIAlpZiAodGVzdF9hbmRfc2V0X2JpdChlcnJvcl90eXBlLCAmbS0+ZXJyb3JfdHlwZSkpCiAJCXJldHVybjsKIAorCWlmICghZXJyb3JzX2hhbmRsZWQobXMpKQorCQlyZXR1cm47CisKIAlpZiAobSAhPSBnZXRfZGVmYXVsdF9taXJyb3IobXMpKQogCQlnb3RvIG91dDsKIApAQCAtODA4LDEyICs4MDgsNiBAQAogCWtmcmVlKG1zKTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgX2NoZWNrX3JlZ2lvbl9zaXplKHN0cnVjdCBkbV90YXJnZXQgKnRpLCB1aW50MzJfdCBzaXplKQotewotCXJldHVybiAhKHNpemUgJSAoUEFHRV9TSVpFID4+IDkpIHx8ICFpc19wb3dlcl9vZl8yKHNpemUpIHx8Ci0JCSBzaXplID4gdGktPmxlbik7Ci19Ci0KIHN0YXRpYyBpbnQgZ2V0X21pcnJvcihzdHJ1Y3QgbWlycm9yX3NldCAqbXMsIHN0cnVjdCBkbV90YXJnZXQgKnRpLAogCQkgICAgICB1bnNpZ25lZCBpbnQgbWlycm9yLCBjaGFyICoqYXJndikKIHsKQEAgLTg3MiwxMiArODY2LDYgQEAKIAkJcmV0dXJuIE5VTEw7CiAJfQogCi0JaWYgKCFfY2hlY2tfcmVnaW9uX3NpemUodGksIGRsLT50eXBlLT5nZXRfcmVnaW9uX3NpemUoZGwpKSkgewotCQl0aS0+ZXJyb3IgPSAiSW52YWxpZCByZWdpb24gc2l6ZSI7Ci0JCWRtX2RpcnR5X2xvZ19kZXN0cm95KGRsKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCiAJcmV0dXJuIGRsOwogfQogCkBAIC0xMzAwLDExICsxMjg4LDcgQEAKIAogc3RhdGljIHZvaWQgX19leGl0IGRtX21pcnJvcl9leGl0KHZvaWQpCiB7Ci0JaW50IHI7Ci0KLQlyID0gZG1fdW5yZWdpc3Rlcl90YXJnZXQoJm1pcnJvcl90YXJnZXQpOwotCWlmIChyIDwgMCkKLQkJRE1FUlIoInVucmVnaXN0ZXIgZmFpbGVkICVkIiwgcik7CisJZG1fdW5yZWdpc3Rlcl90YXJnZXQoJm1pcnJvcl90YXJnZXQpOwogfQogCiAvKiBNb2R1bGUgaG9va3MgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvZG0tc25hcC1wZXJzaXN0ZW50LmMgYi9kcml2ZXJzL21kL2RtLXNuYXAtcGVyc2lzdGVudC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzNmIzNGUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21kL2RtLXNuYXAtcGVyc2lzdGVudC5jCkBAIC0wLDAgKzEsNzA0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDIgU2lzdGluYSBTb2Z0d2FyZSAoVUspIExpbWl0ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwOCBSZWQgSGF0IEdtYkgKKyAqCisgKiBUaGlzIGZpbGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIEdQTC4KKyAqLworCisjaW5jbHVkZSAiZG0tZXhjZXB0aW9uLXN0b3JlLmgiCisjaW5jbHVkZSAiZG0tc25hcC5oIgorCisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9kbS1pby5oPgorCisjZGVmaW5lIERNX01TR19QUkVGSVggInBlcnNpc3RlbnQgc25hcHNob3QiCisjZGVmaW5lIERNX0NIVU5LX1NJWkVfREVGQVVMVF9TRUNUT1JTIDMyCS8qIDE2S0IgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUGVyc2lzdGVudCBzbmFwc2hvdHMsIGJ5IHBlcnNpc3RlbnQgd2UgbWVhbiB0aGF0IHRoZSBzbmFwc2hvdAorICogd2lsbCBzdXJ2aXZlIGEgcmVib290LgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKgorICogV2UgbmVlZCB0byBzdG9yZSBhIHJlY29yZCBvZiB3aGljaCBwYXJ0cyBvZiB0aGUgb3JpZ2luIGhhdmUKKyAqIGJlZW4gY29waWVkIHRvIHRoZSBzbmFwc2hvdCBkZXZpY2UuICBUaGUgc25hcHNob3QgY29kZQorICogcmVxdWlyZXMgdGhhdCB3ZSBjb3B5IGV4Y2VwdGlvbiBjaHVua3MgdG8gY2h1bmsgYWxpZ25lZCBhcmVhcworICogb2YgdGhlIENPVyBzdG9yZS4gIEl0IG1ha2VzIHNlbnNlIHRoZXJlZm9yZSwgdG8gc3RvcmUgdGhlCisgKiBtZXRhZGF0YSBpbiBjaHVuayBzaXplIGJsb2Nrcy4KKyAqCisgKiBUaGVyZSBpcyBubyBiYWNrd2FyZCBvciBmb3J3YXJkIGNvbXBhdGliaWxpdHkgaW1wbGVtZW50ZWQsCisgKiBzbmFwc2hvdHMgd2l0aCBkaWZmZXJlbnQgZGlzayB2ZXJzaW9ucyB0aGFuIHRoZSBrZXJuZWwgd2lsbAorICogbm90IGJlIHVzYWJsZS4gIEl0IGlzIGV4cGVjdGVkIHRoYXQgImx2Y3JlYXRlIiB3aWxsIGJsYW5rIG91dAorICogdGhlIHN0YXJ0IG9mIGEgZnJlc2ggQ09XIGRldmljZSBiZWZvcmUgY2FsbGluZyB0aGUgc25hcHNob3QKKyAqIGNvbnN0cnVjdG9yLgorICoKKyAqIFRoZSBmaXJzdCBjaHVuayBvZiB0aGUgQ09XIGRldmljZSBqdXN0IGNvbnRhaW5zIHRoZSBoZWFkZXIuCisgKiBBZnRlciB0aGlzIHRoZXJlIGlzIGEgY2h1bmsgZmlsbGVkIHdpdGggZXhjZXB0aW9uIG1ldGFkYXRhLAorICogZm9sbG93ZWQgYnkgYXMgbWFueSBleGNlcHRpb24gY2h1bmtzIGFzIGNhbiBmaXQgaW4gdGhlCisgKiBtZXRhZGF0YSBhcmVhcy4KKyAqCisgKiBBbGwgb24gZGlzayBzdHJ1Y3R1cmVzIGFyZSBpbiBsaXR0bGUtZW5kaWFuIGZvcm1hdC4gIFRoZSBlbmQKKyAqIG9mIHRoZSBleGNlcHRpb25zIGluZm8gaXMgaW5kaWNhdGVkIGJ5IGFuIGV4Y2VwdGlvbiB3aXRoIGEKKyAqIG5ld19jaHVuayBvZiAwLCB3aGljaCBpcyBpbnZhbGlkIHNpbmNlIGl0IHdvdWxkIHBvaW50IHRvIHRoZQorICogaGVhZGVyIGNodW5rLgorICovCisKKy8qCisgKiBNYWdpYyBmb3IgcGVyc2lzdGVudCBzbmFwc2hvdHM6ICJTbkFwIiAtIEZlZWJsZSBpc24ndCBpdC4KKyAqLworI2RlZmluZSBTTkFQX01BR0lDIDB4NzA0MTZlNTMKKworLyoKKyAqIFRoZSBvbi1kaXNrIHZlcnNpb24gb2YgdGhlIG1ldGFkYXRhLgorICovCisjZGVmaW5lIFNOQVBTSE9UX0RJU0tfVkVSU0lPTiAxCisKK3N0cnVjdCBkaXNrX2hlYWRlciB7CisJdWludDMyX3QgbWFnaWM7CisKKwkvKgorCSAqIElzIHRoaXMgc25hcHNob3QgdmFsaWQuICBUaGVyZSBpcyBubyB3YXkgb2YgcmVjb3ZlcmluZworCSAqIGFuIGludmFsaWQgc25hcHNob3QuCisJICovCisJdWludDMyX3QgdmFsaWQ7CisKKwkvKgorCSAqIFNpbXBsZSwgaW5jcmVtZW50aW5nIHZlcnNpb24uIG5vIGJhY2t3YXJkCisJICogY29tcGF0aWJpbGl0eS4KKwkgKi8KKwl1aW50MzJfdCB2ZXJzaW9uOworCisJLyogSW4gc2VjdG9ycyAqLworCXVpbnQzMl90IGNodW5rX3NpemU7Cit9OworCitzdHJ1Y3QgZGlza19leGNlcHRpb24geworCXVpbnQ2NF90IG9sZF9jaHVuazsKKwl1aW50NjRfdCBuZXdfY2h1bms7Cit9OworCitzdHJ1Y3QgY29tbWl0X2NhbGxiYWNrIHsKKwl2b2lkICgqY2FsbGJhY2spKHZvaWQgKiwgaW50IHN1Y2Nlc3MpOworCXZvaWQgKmNvbnRleHQ7Cit9OworCisvKgorICogVGhlIHRvcCBsZXZlbCBzdHJ1Y3R1cmUgZm9yIGEgcGVyc2lzdGVudCBleGNlcHRpb24gc3RvcmUuCisgKi8KK3N0cnVjdCBwc3RvcmUgeworCXN0cnVjdCBkbV9zbmFwc2hvdCAqc25hcDsJLyogdXAgcG9pbnRlciB0byBteSBzbmFwc2hvdCAqLworCWludCB2ZXJzaW9uOworCWludCB2YWxpZDsKKwl1aW50MzJfdCBleGNlcHRpb25zX3Blcl9hcmVhOworCisJLyoKKwkgKiBOb3cgdGhhdCB3ZSBoYXZlIGFuIGFzeW5jaHJvbm91cyBrY29weWQgdGhlcmUgaXMgbm8KKwkgKiBuZWVkIGZvciBsYXJnZSBjaHVuayBzaXplcywgc28gaXQgd29udCBodXJ0IHRvIGhhdmUgYQorCSAqIHdob2xlIGNodW5rcyB3b3J0aCBvZiBtZXRhZGF0YSBpbiBtZW1vcnkgYXQgb25jZS4KKwkgKi8KKwl2b2lkICphcmVhOworCisJLyoKKwkgKiBBbiBhcmVhIG9mIHplcm9zIHVzZWQgdG8gY2xlYXIgdGhlIG5leHQgYXJlYS4KKwkgKi8KKwl2b2lkICp6ZXJvX2FyZWE7CisKKwkvKgorCSAqIFVzZWQgdG8ga2VlcCB0cmFjayBvZiB3aGljaCBtZXRhZGF0YSBhcmVhIHRoZSBkYXRhIGluCisJICogJ2NodW5rJyByZWZlcnMgdG8uCisJICovCisJY2h1bmtfdCBjdXJyZW50X2FyZWE7CisKKwkvKgorCSAqIFRoZSBuZXh0IGZyZWUgY2h1bmsgZm9yIGFuIGV4Y2VwdGlvbi4KKwkgKi8KKwljaHVua190IG5leHRfZnJlZTsKKworCS8qCisJICogVGhlIGluZGV4IG9mIG5leHQgZnJlZSBleGNlcHRpb24gaW4gdGhlIGN1cnJlbnQKKwkgKiBtZXRhZGF0YSBhcmVhLgorCSAqLworCXVpbnQzMl90IGN1cnJlbnRfY29tbWl0dGVkOworCisJYXRvbWljX3QgcGVuZGluZ19jb3VudDsKKwl1aW50MzJfdCBjYWxsYmFja19jb3VudDsKKwlzdHJ1Y3QgY29tbWl0X2NhbGxiYWNrICpjYWxsYmFja3M7CisJc3RydWN0IGRtX2lvX2NsaWVudCAqaW9fY2xpZW50OworCisJc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKm1ldGFkYXRhX3dxOworfTsKKworc3RhdGljIHVuc2lnbmVkIHNlY3RvcnNfdG9fcGFnZXModW5zaWduZWQgc2VjdG9ycykKK3sKKwlyZXR1cm4gRElWX1JPVU5EX1VQKHNlY3RvcnMsIFBBR0VfU0laRSA+PiA5KTsKK30KKworc3RhdGljIGludCBhbGxvY19hcmVhKHN0cnVjdCBwc3RvcmUgKnBzKQoreworCWludCByID0gLUVOT01FTTsKKwlzaXplX3QgbGVuOworCisJbGVuID0gcHMtPnNuYXAtPmNodW5rX3NpemUgPDwgU0VDVE9SX1NISUZUOworCisJLyoKKwkgKiBBbGxvY2F0ZSB0aGUgY2h1bmtfc2l6ZSBibG9jayBvZiBtZW1vcnkgdGhhdCB3aWxsIGhvbGQKKwkgKiBhIHNpbmdsZSBtZXRhZGF0YSBhcmVhLgorCSAqLworCXBzLT5hcmVhID0gdm1hbGxvYyhsZW4pOworCWlmICghcHMtPmFyZWEpCisJCXJldHVybiByOworCisJcHMtPnplcm9fYXJlYSA9IHZtYWxsb2MobGVuKTsKKwlpZiAoIXBzLT56ZXJvX2FyZWEpIHsKKwkJdmZyZWUocHMtPmFyZWEpOworCQlyZXR1cm4gcjsKKwl9CisJbWVtc2V0KHBzLT56ZXJvX2FyZWEsIDAsIGxlbik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZnJlZV9hcmVhKHN0cnVjdCBwc3RvcmUgKnBzKQoreworCXZmcmVlKHBzLT5hcmVhKTsKKwlwcy0+YXJlYSA9IE5VTEw7CisJdmZyZWUocHMtPnplcm9fYXJlYSk7CisJcHMtPnplcm9fYXJlYSA9IE5VTEw7Cit9CisKK3N0cnVjdCBtZGF0YV9yZXEgeworCXN0cnVjdCBkbV9pb19yZWdpb24gKndoZXJlOworCXN0cnVjdCBkbV9pb19yZXF1ZXN0ICppb19yZXE7CisJc3RydWN0IHdvcmtfc3RydWN0IHdvcms7CisJaW50IHJlc3VsdDsKK307CisKK3N0YXRpYyB2b2lkIGRvX21ldGFkYXRhKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgbWRhdGFfcmVxICpyZXEgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IG1kYXRhX3JlcSwgd29yayk7CisKKwlyZXEtPnJlc3VsdCA9IGRtX2lvKHJlcS0+aW9fcmVxLCAxLCByZXEtPndoZXJlLCBOVUxMKTsKK30KKworLyoKKyAqIFJlYWQgb3Igd3JpdGUgYSBjaHVuayBhbGlnbmVkIGFuZCBzaXplZCBibG9jayBvZiBkYXRhIGZyb20gYSBkZXZpY2UuCisgKi8KK3N0YXRpYyBpbnQgY2h1bmtfaW8oc3RydWN0IHBzdG9yZSAqcHMsIGNodW5rX3QgY2h1bmssIGludCBydywgaW50IG1ldGFkYXRhKQoreworCXN0cnVjdCBkbV9pb19yZWdpb24gd2hlcmUgPSB7CisJCS5iZGV2ID0gcHMtPnNuYXAtPmNvdy0+YmRldiwKKwkJLnNlY3RvciA9IHBzLT5zbmFwLT5jaHVua19zaXplICogY2h1bmssCisJCS5jb3VudCA9IHBzLT5zbmFwLT5jaHVua19zaXplLAorCX07CisJc3RydWN0IGRtX2lvX3JlcXVlc3QgaW9fcmVxID0geworCQkuYmlfcncgPSBydywKKwkJLm1lbS50eXBlID0gRE1fSU9fVk1BLAorCQkubWVtLnB0ci52bWEgPSBwcy0+YXJlYSwKKwkJLmNsaWVudCA9IHBzLT5pb19jbGllbnQsCisJCS5ub3RpZnkuZm4gPSBOVUxMLAorCX07CisJc3RydWN0IG1kYXRhX3JlcSByZXE7CisKKwlpZiAoIW1ldGFkYXRhKQorCQlyZXR1cm4gZG1faW8oJmlvX3JlcSwgMSwgJndoZXJlLCBOVUxMKTsKKworCXJlcS53aGVyZSA9ICZ3aGVyZTsKKwlyZXEuaW9fcmVxID0gJmlvX3JlcTsKKworCS8qCisJICogSXNzdWUgdGhlIHN5bmNocm9ub3VzIEkvTyBmcm9tIGEgZGlmZmVyZW50IHRocmVhZAorCSAqIHRvIGF2b2lkIGdlbmVyaWNfbWFrZV9yZXF1ZXN0IHJlY3Vyc2lvbi4KKwkgKi8KKwlJTklUX1dPUksoJnJlcS53b3JrLCBkb19tZXRhZGF0YSk7CisJcXVldWVfd29yayhwcy0+bWV0YWRhdGFfd3EsICZyZXEud29yayk7CisJZmx1c2hfd29ya3F1ZXVlKHBzLT5tZXRhZGF0YV93cSk7CisKKwlyZXR1cm4gcmVxLnJlc3VsdDsKK30KKworLyoKKyAqIENvbnZlcnQgYSBtZXRhZGF0YSBhcmVhIGluZGV4IHRvIGEgY2h1bmsgaW5kZXguCisgKi8KK3N0YXRpYyBjaHVua190IGFyZWFfbG9jYXRpb24oc3RydWN0IHBzdG9yZSAqcHMsIGNodW5rX3QgYXJlYSkKK3sKKwlyZXR1cm4gMSArICgocHMtPmV4Y2VwdGlvbnNfcGVyX2FyZWEgKyAxKSAqIGFyZWEpOworfQorCisvKgorICogUmVhZCBvciB3cml0ZSBhIG1ldGFkYXRhIGFyZWEuICBSZW1lbWJlcmluZyB0byBza2lwIHRoZSBmaXJzdAorICogY2h1bmsgd2hpY2ggaG9sZHMgdGhlIGhlYWRlci4KKyAqLworc3RhdGljIGludCBhcmVhX2lvKHN0cnVjdCBwc3RvcmUgKnBzLCBpbnQgcncpCit7CisJaW50IHI7CisJY2h1bmtfdCBjaHVuazsKKworCWNodW5rID0gYXJlYV9sb2NhdGlvbihwcywgcHMtPmN1cnJlbnRfYXJlYSk7CisKKwlyID0gY2h1bmtfaW8ocHMsIGNodW5rLCBydywgMCk7CisJaWYgKHIpCisJCXJldHVybiByOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHplcm9fbWVtb3J5X2FyZWEoc3RydWN0IHBzdG9yZSAqcHMpCit7CisJbWVtc2V0KHBzLT5hcmVhLCAwLCBwcy0+c25hcC0+Y2h1bmtfc2l6ZSA8PCBTRUNUT1JfU0hJRlQpOworfQorCitzdGF0aWMgaW50IHplcm9fZGlza19hcmVhKHN0cnVjdCBwc3RvcmUgKnBzLCBjaHVua190IGFyZWEpCit7CisJc3RydWN0IGRtX2lvX3JlZ2lvbiB3aGVyZSA9IHsKKwkJLmJkZXYgPSBwcy0+c25hcC0+Y293LT5iZGV2LAorCQkuc2VjdG9yID0gcHMtPnNuYXAtPmNodW5rX3NpemUgKiBhcmVhX2xvY2F0aW9uKHBzLCBhcmVhKSwKKwkJLmNvdW50ID0gcHMtPnNuYXAtPmNodW5rX3NpemUsCisJfTsKKwlzdHJ1Y3QgZG1faW9fcmVxdWVzdCBpb19yZXEgPSB7CisJCS5iaV9ydyA9IFdSSVRFLAorCQkubWVtLnR5cGUgPSBETV9JT19WTUEsCisJCS5tZW0ucHRyLnZtYSA9IHBzLT56ZXJvX2FyZWEsCisJCS5jbGllbnQgPSBwcy0+aW9fY2xpZW50LAorCQkubm90aWZ5LmZuID0gTlVMTCwKKwl9OworCisJcmV0dXJuIGRtX2lvKCZpb19yZXEsIDEsICZ3aGVyZSwgTlVMTCk7Cit9CisKK3N0YXRpYyBpbnQgcmVhZF9oZWFkZXIoc3RydWN0IHBzdG9yZSAqcHMsIGludCAqbmV3X3NuYXBzaG90KQoreworCWludCByOworCXN0cnVjdCBkaXNrX2hlYWRlciAqZGg7CisJY2h1bmtfdCBjaHVua19zaXplOworCWludCBjaHVua19zaXplX3N1cHBsaWVkID0gMTsKKworCS8qCisJICogVXNlIGRlZmF1bHQgY2h1bmsgc2l6ZSAob3IgaGFyZHNlY3Rfc2l6ZSwgaWYgbGFyZ2VyKSBpZiBub25lIHN1cHBsaWVkCisJICovCisJaWYgKCFwcy0+c25hcC0+Y2h1bmtfc2l6ZSkgeworCQlwcy0+c25hcC0+Y2h1bmtfc2l6ZSA9IG1heChETV9DSFVOS19TSVpFX0RFRkFVTFRfU0VDVE9SUywKKwkJICAgIGJkZXZfaGFyZHNlY3Rfc2l6ZShwcy0+c25hcC0+Y293LT5iZGV2KSA+PiA5KTsKKwkJcHMtPnNuYXAtPmNodW5rX21hc2sgPSBwcy0+c25hcC0+Y2h1bmtfc2l6ZSAtIDE7CisJCXBzLT5zbmFwLT5jaHVua19zaGlmdCA9IGZmcyhwcy0+c25hcC0+Y2h1bmtfc2l6ZSkgLSAxOworCQljaHVua19zaXplX3N1cHBsaWVkID0gMDsKKwl9CisKKwlwcy0+aW9fY2xpZW50ID0gZG1faW9fY2xpZW50X2NyZWF0ZShzZWN0b3JzX3RvX3BhZ2VzKHBzLT5zbmFwLT4KKwkJCQkJCQkgICAgIGNodW5rX3NpemUpKTsKKwlpZiAoSVNfRVJSKHBzLT5pb19jbGllbnQpKQorCQlyZXR1cm4gUFRSX0VSUihwcy0+aW9fY2xpZW50KTsKKworCXIgPSBhbGxvY19hcmVhKHBzKTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisKKwlyID0gY2h1bmtfaW8ocHMsIDAsIFJFQUQsIDEpOworCWlmIChyKQorCQlnb3RvIGJhZDsKKworCWRoID0gKHN0cnVjdCBkaXNrX2hlYWRlciAqKSBwcy0+YXJlYTsKKworCWlmIChsZTMyX3RvX2NwdShkaC0+bWFnaWMpID09IDApIHsKKwkJKm5ld19zbmFwc2hvdCA9IDE7CisJCXJldHVybiAwOworCX0KKworCWlmIChsZTMyX3RvX2NwdShkaC0+bWFnaWMpICE9IFNOQVBfTUFHSUMpIHsKKwkJRE1XQVJOKCJJbnZhbGlkIG9yIGNvcnJ1cHQgc25hcHNob3QiKTsKKwkJciA9IC1FTlhJTzsKKwkJZ290byBiYWQ7CisJfQorCisJKm5ld19zbmFwc2hvdCA9IDA7CisJcHMtPnZhbGlkID0gbGUzMl90b19jcHUoZGgtPnZhbGlkKTsKKwlwcy0+dmVyc2lvbiA9IGxlMzJfdG9fY3B1KGRoLT52ZXJzaW9uKTsKKwljaHVua19zaXplID0gbGUzMl90b19jcHUoZGgtPmNodW5rX3NpemUpOworCisJaWYgKCFjaHVua19zaXplX3N1cHBsaWVkIHx8IHBzLT5zbmFwLT5jaHVua19zaXplID09IGNodW5rX3NpemUpCisJCXJldHVybiAwOworCisJRE1XQVJOKCJjaHVuayBzaXplICVsbHUgaW4gZGV2aWNlIG1ldGFkYXRhIG92ZXJyaWRlcyAiCisJICAgICAgICJ0YWJsZSBjaHVuayBzaXplIG9mICVsbHUuIiwKKwkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyljaHVua19zaXplLAorCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKXBzLT5zbmFwLT5jaHVua19zaXplKTsKKworCS8qIFdlIGhhZCBhIGJvZ3VzIGNodW5rX3NpemUuIEZpeCBzdHVmZiB1cC4gKi8KKwlmcmVlX2FyZWEocHMpOworCisJcHMtPnNuYXAtPmNodW5rX3NpemUgPSBjaHVua19zaXplOworCXBzLT5zbmFwLT5jaHVua19tYXNrID0gY2h1bmtfc2l6ZSAtIDE7CisJcHMtPnNuYXAtPmNodW5rX3NoaWZ0ID0gZmZzKGNodW5rX3NpemUpIC0gMTsKKworCXIgPSBkbV9pb19jbGllbnRfcmVzaXplKHNlY3RvcnNfdG9fcGFnZXMocHMtPnNuYXAtPmNodW5rX3NpemUpLAorCQkJCXBzLT5pb19jbGllbnQpOworCWlmIChyKQorCQlyZXR1cm4gcjsKKworCXIgPSBhbGxvY19hcmVhKHBzKTsKKwlyZXR1cm4gcjsKKworYmFkOgorCWZyZWVfYXJlYShwcyk7CisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbnQgd3JpdGVfaGVhZGVyKHN0cnVjdCBwc3RvcmUgKnBzKQoreworCXN0cnVjdCBkaXNrX2hlYWRlciAqZGg7CisKKwltZW1zZXQocHMtPmFyZWEsIDAsIHBzLT5zbmFwLT5jaHVua19zaXplIDw8IFNFQ1RPUl9TSElGVCk7CisKKwlkaCA9IChzdHJ1Y3QgZGlza19oZWFkZXIgKikgcHMtPmFyZWE7CisJZGgtPm1hZ2ljID0gY3B1X3RvX2xlMzIoU05BUF9NQUdJQyk7CisJZGgtPnZhbGlkID0gY3B1X3RvX2xlMzIocHMtPnZhbGlkKTsKKwlkaC0+dmVyc2lvbiA9IGNwdV90b19sZTMyKHBzLT52ZXJzaW9uKTsKKwlkaC0+Y2h1bmtfc2l6ZSA9IGNwdV90b19sZTMyKHBzLT5zbmFwLT5jaHVua19zaXplKTsKKworCXJldHVybiBjaHVua19pbyhwcywgMCwgV1JJVEUsIDEpOworfQorCisvKgorICogQWNjZXNzIGZ1bmN0aW9ucyBmb3IgdGhlIGRpc2sgZXhjZXB0aW9ucywgdGhlc2UgZG8gdGhlIGVuZGlhbiBjb252ZXJzaW9ucy4KKyAqLworc3RhdGljIHN0cnVjdCBkaXNrX2V4Y2VwdGlvbiAqZ2V0X2V4Y2VwdGlvbihzdHJ1Y3QgcHN0b3JlICpwcywgdWludDMyX3QgaW5kZXgpCit7CisJQlVHX09OKGluZGV4ID49IHBzLT5leGNlcHRpb25zX3Blcl9hcmVhKTsKKworCXJldHVybiAoKHN0cnVjdCBkaXNrX2V4Y2VwdGlvbiAqKSBwcy0+YXJlYSkgKyBpbmRleDsKK30KKworc3RhdGljIHZvaWQgcmVhZF9leGNlcHRpb24oc3RydWN0IHBzdG9yZSAqcHMsCisJCQkgICB1aW50MzJfdCBpbmRleCwgc3RydWN0IGRpc2tfZXhjZXB0aW9uICpyZXN1bHQpCit7CisJc3RydWN0IGRpc2tfZXhjZXB0aW9uICplID0gZ2V0X2V4Y2VwdGlvbihwcywgaW5kZXgpOworCisJLyogY29weSBpdCAqLworCXJlc3VsdC0+b2xkX2NodW5rID0gbGU2NF90b19jcHUoZS0+b2xkX2NodW5rKTsKKwlyZXN1bHQtPm5ld19jaHVuayA9IGxlNjRfdG9fY3B1KGUtPm5ld19jaHVuayk7Cit9CisKK3N0YXRpYyB2b2lkIHdyaXRlX2V4Y2VwdGlvbihzdHJ1Y3QgcHN0b3JlICpwcywKKwkJCSAgICB1aW50MzJfdCBpbmRleCwgc3RydWN0IGRpc2tfZXhjZXB0aW9uICpkZSkKK3sKKwlzdHJ1Y3QgZGlza19leGNlcHRpb24gKmUgPSBnZXRfZXhjZXB0aW9uKHBzLCBpbmRleCk7CisKKwkvKiBjb3B5IGl0ICovCisJZS0+b2xkX2NodW5rID0gY3B1X3RvX2xlNjQoZGUtPm9sZF9jaHVuayk7CisJZS0+bmV3X2NodW5rID0gY3B1X3RvX2xlNjQoZGUtPm5ld19jaHVuayk7Cit9CisKKy8qCisgKiBSZWdpc3RlcnMgdGhlIGV4Y2VwdGlvbnMgdGhhdCBhcmUgcHJlc2VudCBpbiB0aGUgY3VycmVudCBhcmVhLgorICogJ2Z1bGwnIGlzIGZpbGxlZCBpbiB0byBpbmRpY2F0ZSBpZiB0aGUgYXJlYSBoYXMgYmVlbgorICogZmlsbGVkLgorICovCitzdGF0aWMgaW50IGluc2VydF9leGNlcHRpb25zKHN0cnVjdCBwc3RvcmUgKnBzLAorCQkJICAgICBpbnQgKCpjYWxsYmFjaykodm9pZCAqY2FsbGJhY2tfY29udGV4dCwKKwkJCQkJICAgICBjaHVua190IG9sZCwgY2h1bmtfdCBuZXcpLAorCQkJICAgICB2b2lkICpjYWxsYmFja19jb250ZXh0LAorCQkJICAgICBpbnQgKmZ1bGwpCit7CisJaW50IHI7CisJdW5zaWduZWQgaW50IGk7CisJc3RydWN0IGRpc2tfZXhjZXB0aW9uIGRlOworCisJLyogcHJlc3VtZSB0aGUgYXJlYSBpcyBmdWxsICovCisJKmZ1bGwgPSAxOworCisJZm9yIChpID0gMDsgaSA8IHBzLT5leGNlcHRpb25zX3Blcl9hcmVhOyBpKyspIHsKKwkJcmVhZF9leGNlcHRpb24ocHMsIGksICZkZSk7CisKKwkJLyoKKwkJICogSWYgdGhlIG5ld19jaHVuayBpcyBwb2ludGluZyBhdCB0aGUgc3RhcnQgb2YKKwkJICogdGhlIENPVyBkZXZpY2UsIHdoZXJlIHRoZSBmaXJzdCBtZXRhZGF0YSBhcmVhCisJCSAqIGlzIHdlIGtub3cgdGhhdCB3ZSd2ZSBoaXQgdGhlIGVuZCBvZiB0aGUKKwkJICogZXhjZXB0aW9ucy4gIFRoZXJlZm9yZSB0aGUgYXJlYSBpcyBub3QgZnVsbC4KKwkJICovCisJCWlmIChkZS5uZXdfY2h1bmsgPT0gMExMKSB7CisJCQlwcy0+Y3VycmVudF9jb21taXR0ZWQgPSBpOworCQkJKmZ1bGwgPSAwOworCQkJYnJlYWs7CisJCX0KKworCQkvKgorCQkgKiBLZWVwIHRyYWNrIG9mIHRoZSBzdGFydCBvZiB0aGUgZnJlZSBjaHVua3MuCisJCSAqLworCQlpZiAocHMtPm5leHRfZnJlZSA8PSBkZS5uZXdfY2h1bmspCisJCQlwcy0+bmV4dF9mcmVlID0gZGUubmV3X2NodW5rICsgMTsKKworCQkvKgorCQkgKiBPdGhlcndpc2Ugd2UgYWRkIHRoZSBleGNlcHRpb24gdG8gdGhlIHNuYXBzaG90LgorCQkgKi8KKwkJciA9IGNhbGxiYWNrKGNhbGxiYWNrX2NvbnRleHQsIGRlLm9sZF9jaHVuaywgZGUubmV3X2NodW5rKTsKKwkJaWYgKHIpCisJCQlyZXR1cm4gcjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByZWFkX2V4Y2VwdGlvbnMoc3RydWN0IHBzdG9yZSAqcHMsCisJCQkgICBpbnQgKCpjYWxsYmFjaykodm9pZCAqY2FsbGJhY2tfY29udGV4dCwgY2h1bmtfdCBvbGQsCisJCQkJCSAgIGNodW5rX3QgbmV3KSwKKwkJCSAgIHZvaWQgKmNhbGxiYWNrX2NvbnRleHQpCit7CisJaW50IHIsIGZ1bGwgPSAxOworCisJLyoKKwkgKiBLZWVwaW5nIHJlYWRpbmcgY2h1bmtzIGFuZCBpbnNlcnRpbmcgZXhjZXB0aW9ucyB1bnRpbAorCSAqIHdlIGZpbmQgYSBwYXJ0aWFsbHkgZnVsbCBhcmVhLgorCSAqLworCWZvciAocHMtPmN1cnJlbnRfYXJlYSA9IDA7IGZ1bGw7IHBzLT5jdXJyZW50X2FyZWErKykgeworCQlyID0gYXJlYV9pbyhwcywgUkVBRCk7CisJCWlmIChyKQorCQkJcmV0dXJuIHI7CisKKwkJciA9IGluc2VydF9leGNlcHRpb25zKHBzLCBjYWxsYmFjaywgY2FsbGJhY2tfY29udGV4dCwgJmZ1bGwpOworCQlpZiAocikKKwkJCXJldHVybiByOworCX0KKworCXBzLT5jdXJyZW50X2FyZWEtLTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBzdG9yZSAqZ2V0X2luZm8oc3RydWN0IGRtX2V4Y2VwdGlvbl9zdG9yZSAqc3RvcmUpCit7CisJcmV0dXJuIChzdHJ1Y3QgcHN0b3JlICopIHN0b3JlLT5jb250ZXh0OworfQorCitzdGF0aWMgdm9pZCBwZXJzaXN0ZW50X2ZyYWN0aW9uX2Z1bGwoc3RydWN0IGRtX2V4Y2VwdGlvbl9zdG9yZSAqc3RvcmUsCisJCQkJICAgICBzZWN0b3JfdCAqbnVtZXJhdG9yLCBzZWN0b3JfdCAqZGVub21pbmF0b3IpCit7CisJKm51bWVyYXRvciA9IGdldF9pbmZvKHN0b3JlKS0+bmV4dF9mcmVlICogc3RvcmUtPnNuYXAtPmNodW5rX3NpemU7CisJKmRlbm9taW5hdG9yID0gZ2V0X2Rldl9zaXplKHN0b3JlLT5zbmFwLT5jb3ctPmJkZXYpOworfQorCitzdGF0aWMgdm9pZCBwZXJzaXN0ZW50X2Rlc3Ryb3koc3RydWN0IGRtX2V4Y2VwdGlvbl9zdG9yZSAqc3RvcmUpCit7CisJc3RydWN0IHBzdG9yZSAqcHMgPSBnZXRfaW5mbyhzdG9yZSk7CisKKwlkZXN0cm95X3dvcmtxdWV1ZShwcy0+bWV0YWRhdGFfd3EpOworCWRtX2lvX2NsaWVudF9kZXN0cm95KHBzLT5pb19jbGllbnQpOworCXZmcmVlKHBzLT5jYWxsYmFja3MpOworCWZyZWVfYXJlYShwcyk7CisJa2ZyZWUocHMpOworfQorCitzdGF0aWMgaW50IHBlcnNpc3RlbnRfcmVhZF9tZXRhZGF0YShzdHJ1Y3QgZG1fZXhjZXB0aW9uX3N0b3JlICpzdG9yZSwKKwkJCQkgICAgaW50ICgqY2FsbGJhY2spKHZvaWQgKmNhbGxiYWNrX2NvbnRleHQsCisJCQkJCQkgICAgY2h1bmtfdCBvbGQsIGNodW5rX3QgbmV3KSwKKwkJCQkgICAgdm9pZCAqY2FsbGJhY2tfY29udGV4dCkKK3sKKwlpbnQgciwgdW5pbml0aWFsaXplZF92YXIobmV3X3NuYXBzaG90KTsKKwlzdHJ1Y3QgcHN0b3JlICpwcyA9IGdldF9pbmZvKHN0b3JlKTsKKworCS8qCisJICogUmVhZCB0aGUgc25hcHNob3QgaGVhZGVyLgorCSAqLworCXIgPSByZWFkX2hlYWRlcihwcywgJm5ld19zbmFwc2hvdCk7CisJaWYgKHIpCisJCXJldHVybiByOworCisJLyoKKwkgKiBOb3cgd2Uga25vdyBjb3JyZWN0IGNodW5rX3NpemUsIGNvbXBsZXRlIHRoZSBpbml0aWFsaXNhdGlvbi4KKwkgKi8KKwlwcy0+ZXhjZXB0aW9uc19wZXJfYXJlYSA9IChwcy0+c25hcC0+Y2h1bmtfc2l6ZSA8PCBTRUNUT1JfU0hJRlQpIC8KKwkJCQkgIHNpemVvZihzdHJ1Y3QgZGlza19leGNlcHRpb24pOworCXBzLT5jYWxsYmFja3MgPSBkbV92Y2FsbG9jKHBzLT5leGNlcHRpb25zX3Blcl9hcmVhLAorCQkJc2l6ZW9mKCpwcy0+Y2FsbGJhY2tzKSk7CisJaWYgKCFwcy0+Y2FsbGJhY2tzKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qCisJICogRG8gd2UgbmVlZCB0byBzZXR1cCBhIG5ldyBzbmFwc2hvdCA/CisJICovCisJaWYgKG5ld19zbmFwc2hvdCkgeworCQlyID0gd3JpdGVfaGVhZGVyKHBzKTsKKwkJaWYgKHIpIHsKKwkJCURNV0FSTigid3JpdGVfaGVhZGVyIGZhaWxlZCIpOworCQkJcmV0dXJuIHI7CisJCX0KKworCQlwcy0+Y3VycmVudF9hcmVhID0gMDsKKwkJemVyb19tZW1vcnlfYXJlYShwcyk7CisJCXIgPSB6ZXJvX2Rpc2tfYXJlYShwcywgMCk7CisJCWlmIChyKSB7CisJCQlETVdBUk4oInplcm9fZGlza19hcmVhKDApIGZhaWxlZCIpOworCQkJcmV0dXJuIHI7CisJCX0KKwl9IGVsc2UgeworCQkvKgorCQkgKiBTYW5pdHkgY2hlY2tzLgorCQkgKi8KKwkJaWYgKHBzLT52ZXJzaW9uICE9IFNOQVBTSE9UX0RJU0tfVkVSU0lPTikgeworCQkJRE1XQVJOKCJ1bmFibGUgdG8gaGFuZGxlIHNuYXBzaG90IGRpc2sgdmVyc2lvbiAlZCIsCisJCQkgICAgICAgcHMtPnZlcnNpb24pOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQkvKgorCQkgKiBNZXRhZGF0YSBhcmUgdmFsaWQsIGJ1dCBzbmFwc2hvdCBpcyBpbnZhbGlkYXRlZAorCQkgKi8KKwkJaWYgKCFwcy0+dmFsaWQpCisJCQlyZXR1cm4gMTsKKworCQkvKgorCQkgKiBSZWFkIHRoZSBtZXRhZGF0YS4KKwkJICovCisJCXIgPSByZWFkX2V4Y2VwdGlvbnMocHMsIGNhbGxiYWNrLCBjYWxsYmFja19jb250ZXh0KTsKKwkJaWYgKHIpCisJCQlyZXR1cm4gcjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwZXJzaXN0ZW50X3ByZXBhcmVfZXhjZXB0aW9uKHN0cnVjdCBkbV9leGNlcHRpb25fc3RvcmUgKnN0b3JlLAorCQkJCQlzdHJ1Y3QgZG1fc25hcF9leGNlcHRpb24gKmUpCit7CisJc3RydWN0IHBzdG9yZSAqcHMgPSBnZXRfaW5mbyhzdG9yZSk7CisJdWludDMyX3Qgc3RyaWRlOworCWNodW5rX3QgbmV4dF9mcmVlOworCXNlY3Rvcl90IHNpemUgPSBnZXRfZGV2X3NpemUoc3RvcmUtPnNuYXAtPmNvdy0+YmRldik7CisKKwkvKiBJcyB0aGVyZSBlbm91Z2ggcm9vbSA/ICovCisJaWYgKHNpemUgPCAoKHBzLT5uZXh0X2ZyZWUgKyAxKSAqIHN0b3JlLT5zbmFwLT5jaHVua19zaXplKSkKKwkJcmV0dXJuIC1FTk9TUEM7CisKKwllLT5uZXdfY2h1bmsgPSBwcy0+bmV4dF9mcmVlOworCisJLyoKKwkgKiBNb3ZlIG9udG8gdGhlIG5leHQgZnJlZSBwZW5kaW5nLCBtYWtpbmcgc3VyZSB0byB0YWtlCisJICogaW50byBhY2NvdW50IHRoZSBsb2NhdGlvbiBvZiB0aGUgbWV0YWRhdGEgY2h1bmtzLgorCSAqLworCXN0cmlkZSA9IChwcy0+ZXhjZXB0aW9uc19wZXJfYXJlYSArIDEpOworCW5leHRfZnJlZSA9ICsrcHMtPm5leHRfZnJlZTsKKwlpZiAoc2VjdG9yX2RpdihuZXh0X2ZyZWUsIHN0cmlkZSkgPT0gMSkKKwkJcHMtPm5leHRfZnJlZSsrOworCisJYXRvbWljX2luYygmcHMtPnBlbmRpbmdfY291bnQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBwZXJzaXN0ZW50X2NvbW1pdF9leGNlcHRpb24oc3RydWN0IGRtX2V4Y2VwdGlvbl9zdG9yZSAqc3RvcmUsCisJCQkJCXN0cnVjdCBkbV9zbmFwX2V4Y2VwdGlvbiAqZSwKKwkJCQkJdm9pZCAoKmNhbGxiYWNrKSAodm9pZCAqLCBpbnQgc3VjY2VzcyksCisJCQkJCXZvaWQgKmNhbGxiYWNrX2NvbnRleHQpCit7CisJdW5zaWduZWQgaW50IGk7CisJc3RydWN0IHBzdG9yZSAqcHMgPSBnZXRfaW5mbyhzdG9yZSk7CisJc3RydWN0IGRpc2tfZXhjZXB0aW9uIGRlOworCXN0cnVjdCBjb21taXRfY2FsbGJhY2sgKmNiOworCisJZGUub2xkX2NodW5rID0gZS0+b2xkX2NodW5rOworCWRlLm5ld19jaHVuayA9IGUtPm5ld19jaHVuazsKKwl3cml0ZV9leGNlcHRpb24ocHMsIHBzLT5jdXJyZW50X2NvbW1pdHRlZCsrLCAmZGUpOworCisJLyoKKwkgKiBBZGQgdGhlIGNhbGxiYWNrIHRvIHRoZSBiYWNrIG9mIHRoZSBhcnJheS4gIFRoaXMgY29kZQorCSAqIGlzIHRoZSBvbmx5IHBsYWNlIHdoZXJlIHRoZSBjYWxsYmFjayBhcnJheSBpcworCSAqIG1hbmlwdWxhdGVkLCBhbmQgd2Uga25vdyB0aGF0IGl0IHdpbGwgbmV2ZXIgYmUgY2FsbGVkCisJICogbXVsdGlwbGUgdGltZXMgY29uY3VycmVudGx5LgorCSAqLworCWNiID0gcHMtPmNhbGxiYWNrcyArIHBzLT5jYWxsYmFja19jb3VudCsrOworCWNiLT5jYWxsYmFjayA9IGNhbGxiYWNrOworCWNiLT5jb250ZXh0ID0gY2FsbGJhY2tfY29udGV4dDsKKworCS8qCisJICogSWYgdGhlcmUgYXJlIGV4Y2VwdGlvbnMgaW4gZmxpZ2h0IGFuZCB3ZSBoYXZlIG5vdCB5ZXQKKwkgKiBmaWxsZWQgdGhpcyBtZXRhZGF0YSBhcmVhIHRoZXJlJ3Mgbm90aGluZyBtb3JlIHRvIGRvLgorCSAqLworCWlmICghYXRvbWljX2RlY19hbmRfdGVzdCgmcHMtPnBlbmRpbmdfY291bnQpICYmCisJICAgIChwcy0+Y3VycmVudF9jb21taXR0ZWQgIT0gcHMtPmV4Y2VwdGlvbnNfcGVyX2FyZWEpKQorCQlyZXR1cm47CisKKwkvKgorCSAqIElmIHdlIGNvbXBsZXRlbHkgZmlsbGVkIHRoZSBjdXJyZW50IGFyZWEsIHRoZW4gd2lwZSB0aGUgbmV4dCBvbmUuCisJICovCisJaWYgKChwcy0+Y3VycmVudF9jb21taXR0ZWQgPT0gcHMtPmV4Y2VwdGlvbnNfcGVyX2FyZWEpICYmCisJICAgICB6ZXJvX2Rpc2tfYXJlYShwcywgcHMtPmN1cnJlbnRfYXJlYSArIDEpKQorCQlwcy0+dmFsaWQgPSAwOworCisJLyoKKwkgKiBDb21taXQgZXhjZXB0aW9ucyB0byBkaXNrLgorCSAqLworCWlmIChwcy0+dmFsaWQgJiYgYXJlYV9pbyhwcywgV1JJVEUpKQorCQlwcy0+dmFsaWQgPSAwOworCisJLyoKKwkgKiBBZHZhbmNlIHRvIHRoZSBuZXh0IGFyZWEgaWYgdGhpcyBvbmUgaXMgZnVsbC4KKwkgKi8KKwlpZiAocHMtPmN1cnJlbnRfY29tbWl0dGVkID09IHBzLT5leGNlcHRpb25zX3Blcl9hcmVhKSB7CisJCXBzLT5jdXJyZW50X2NvbW1pdHRlZCA9IDA7CisJCXBzLT5jdXJyZW50X2FyZWErKzsKKwkJemVyb19tZW1vcnlfYXJlYShwcyk7CisJfQorCisJZm9yIChpID0gMDsgaSA8IHBzLT5jYWxsYmFja19jb3VudDsgaSsrKSB7CisJCWNiID0gcHMtPmNhbGxiYWNrcyArIGk7CisJCWNiLT5jYWxsYmFjayhjYi0+Y29udGV4dCwgcHMtPnZhbGlkKTsKKwl9CisKKwlwcy0+Y2FsbGJhY2tfY291bnQgPSAwOworfQorCitzdGF0aWMgdm9pZCBwZXJzaXN0ZW50X2Ryb3Bfc25hcHNob3Qoc3RydWN0IGRtX2V4Y2VwdGlvbl9zdG9yZSAqc3RvcmUpCit7CisJc3RydWN0IHBzdG9yZSAqcHMgPSBnZXRfaW5mbyhzdG9yZSk7CisKKwlwcy0+dmFsaWQgPSAwOworCWlmICh3cml0ZV9oZWFkZXIocHMpKQorCQlETVdBUk4oIndyaXRlIGhlYWRlciBmYWlsZWQiKTsKK30KKworaW50IGRtX2NyZWF0ZV9wZXJzaXN0ZW50KHN0cnVjdCBkbV9leGNlcHRpb25fc3RvcmUgKnN0b3JlKQoreworCXN0cnVjdCBwc3RvcmUgKnBzOworCisJLyogYWxsb2NhdGUgdGhlIHBzdG9yZSAqLworCXBzID0ga21hbGxvYyhzaXplb2YoKnBzKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwcykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlwcy0+c25hcCA9IHN0b3JlLT5zbmFwOworCXBzLT52YWxpZCA9IDE7CisJcHMtPnZlcnNpb24gPSBTTkFQU0hPVF9ESVNLX1ZFUlNJT047CisJcHMtPmFyZWEgPSBOVUxMOworCXBzLT5uZXh0X2ZyZWUgPSAyOwkvKiBza2lwcGluZyB0aGUgaGVhZGVyIGFuZCBmaXJzdCBhcmVhICovCisJcHMtPmN1cnJlbnRfY29tbWl0dGVkID0gMDsKKworCXBzLT5jYWxsYmFja19jb3VudCA9IDA7CisJYXRvbWljX3NldCgmcHMtPnBlbmRpbmdfY291bnQsIDApOworCXBzLT5jYWxsYmFja3MgPSBOVUxMOworCisJcHMtPm1ldGFkYXRhX3dxID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoImtzbmFwaGQiKTsKKwlpZiAoIXBzLT5tZXRhZGF0YV93cSkgeworCQlrZnJlZShwcyk7CisJCURNRVJSKCJjb3VsZG4ndCBzdGFydCBoZWFkZXIgbWV0YWRhdGEgdXBkYXRlIHRocmVhZCIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlzdG9yZS0+ZGVzdHJveSA9IHBlcnNpc3RlbnRfZGVzdHJveTsKKwlzdG9yZS0+cmVhZF9tZXRhZGF0YSA9IHBlcnNpc3RlbnRfcmVhZF9tZXRhZGF0YTsKKwlzdG9yZS0+cHJlcGFyZV9leGNlcHRpb24gPSBwZXJzaXN0ZW50X3ByZXBhcmVfZXhjZXB0aW9uOworCXN0b3JlLT5jb21taXRfZXhjZXB0aW9uID0gcGVyc2lzdGVudF9jb21taXRfZXhjZXB0aW9uOworCXN0b3JlLT5kcm9wX3NuYXBzaG90ID0gcGVyc2lzdGVudF9kcm9wX3NuYXBzaG90OworCXN0b3JlLT5mcmFjdGlvbl9mdWxsID0gcGVyc2lzdGVudF9mcmFjdGlvbl9mdWxsOworCXN0b3JlLT5jb250ZXh0ID0gcHM7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGRtX3BlcnNpc3RlbnRfc25hcHNob3RfaW5pdCh2b2lkKQoreworCXJldHVybiAwOworfQorCit2b2lkIGRtX3BlcnNpc3RlbnRfc25hcHNob3RfZXhpdCh2b2lkKQoreworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9kbS1zbmFwLXRyYW5zaWVudC5jIGIvZHJpdmVycy9tZC9kbS1zbmFwLXRyYW5zaWVudC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmNmUyZTYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21kL2RtLXNuYXAtdHJhbnNpZW50LmMKQEAgLTAsMCArMSw5OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDAyIFNpc3RpbmEgU29mdHdhcmUgKFVLKSBMaW1pdGVkLgorICogQ29weXJpZ2h0IChDKSAyMDA2LTIwMDggUmVkIEhhdCBHbWJICisgKgorICogVGhpcyBmaWxlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBHUEwuCisgKi8KKworI2luY2x1ZGUgImRtLWV4Y2VwdGlvbi1zdG9yZS5oIgorI2luY2x1ZGUgImRtLXNuYXAuaCIKKworI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZG0taW8uaD4KKworI2RlZmluZSBETV9NU0dfUFJFRklYICJ0cmFuc2llbnQgc25hcHNob3QiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBzdG9yZSBmb3Igbm9uLXBlcnNpc3RlbnQgc25hcHNob3RzLgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RydWN0IHRyYW5zaWVudF9jIHsKKwlzZWN0b3JfdCBuZXh0X2ZyZWU7Cit9OworCitzdGF0aWMgdm9pZCB0cmFuc2llbnRfZGVzdHJveShzdHJ1Y3QgZG1fZXhjZXB0aW9uX3N0b3JlICpzdG9yZSkKK3sKKwlrZnJlZShzdG9yZS0+Y29udGV4dCk7Cit9CisKK3N0YXRpYyBpbnQgdHJhbnNpZW50X3JlYWRfbWV0YWRhdGEoc3RydWN0IGRtX2V4Y2VwdGlvbl9zdG9yZSAqc3RvcmUsCisJCQkJICAgaW50ICgqY2FsbGJhY2spKHZvaWQgKmNhbGxiYWNrX2NvbnRleHQsCisJCQkJCQkgICBjaHVua190IG9sZCwgY2h1bmtfdCBuZXcpLAorCQkJCSAgIHZvaWQgKmNhbGxiYWNrX2NvbnRleHQpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdHJhbnNpZW50X3ByZXBhcmVfZXhjZXB0aW9uKHN0cnVjdCBkbV9leGNlcHRpb25fc3RvcmUgKnN0b3JlLAorCQkJCSAgICAgICBzdHJ1Y3QgZG1fc25hcF9leGNlcHRpb24gKmUpCit7CisJc3RydWN0IHRyYW5zaWVudF9jICp0YyA9IChzdHJ1Y3QgdHJhbnNpZW50X2MgKikgc3RvcmUtPmNvbnRleHQ7CisJc2VjdG9yX3Qgc2l6ZSA9IGdldF9kZXZfc2l6ZShzdG9yZS0+c25hcC0+Y293LT5iZGV2KTsKKworCWlmIChzaXplIDwgKHRjLT5uZXh0X2ZyZWUgKyBzdG9yZS0+c25hcC0+Y2h1bmtfc2l6ZSkpCisJCXJldHVybiAtMTsKKworCWUtPm5ld19jaHVuayA9IHNlY3Rvcl90b19jaHVuayhzdG9yZS0+c25hcCwgdGMtPm5leHRfZnJlZSk7CisJdGMtPm5leHRfZnJlZSArPSBzdG9yZS0+c25hcC0+Y2h1bmtfc2l6ZTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB0cmFuc2llbnRfY29tbWl0X2V4Y2VwdGlvbihzdHJ1Y3QgZG1fZXhjZXB0aW9uX3N0b3JlICpzdG9yZSwKKwkJCQkgICAgICAgc3RydWN0IGRtX3NuYXBfZXhjZXB0aW9uICplLAorCQkJCSAgICAgICB2b2lkICgqY2FsbGJhY2spICh2b2lkICosIGludCBzdWNjZXNzKSwKKwkJCQkgICAgICAgdm9pZCAqY2FsbGJhY2tfY29udGV4dCkKK3sKKwkvKiBKdXN0IHN1Y2NlZWQgKi8KKwljYWxsYmFjayhjYWxsYmFja19jb250ZXh0LCAxKTsKK30KKworc3RhdGljIHZvaWQgdHJhbnNpZW50X2ZyYWN0aW9uX2Z1bGwoc3RydWN0IGRtX2V4Y2VwdGlvbl9zdG9yZSAqc3RvcmUsCisJCQkJICAgIHNlY3Rvcl90ICpudW1lcmF0b3IsIHNlY3Rvcl90ICpkZW5vbWluYXRvcikKK3sKKwkqbnVtZXJhdG9yID0gKChzdHJ1Y3QgdHJhbnNpZW50X2MgKikgc3RvcmUtPmNvbnRleHQpLT5uZXh0X2ZyZWU7CisJKmRlbm9taW5hdG9yID0gZ2V0X2Rldl9zaXplKHN0b3JlLT5zbmFwLT5jb3ctPmJkZXYpOworfQorCitpbnQgZG1fY3JlYXRlX3RyYW5zaWVudChzdHJ1Y3QgZG1fZXhjZXB0aW9uX3N0b3JlICpzdG9yZSkKK3sKKwlzdHJ1Y3QgdHJhbnNpZW50X2MgKnRjOworCisJc3RvcmUtPmRlc3Ryb3kgPSB0cmFuc2llbnRfZGVzdHJveTsKKwlzdG9yZS0+cmVhZF9tZXRhZGF0YSA9IHRyYW5zaWVudF9yZWFkX21ldGFkYXRhOworCXN0b3JlLT5wcmVwYXJlX2V4Y2VwdGlvbiA9IHRyYW5zaWVudF9wcmVwYXJlX2V4Y2VwdGlvbjsKKwlzdG9yZS0+Y29tbWl0X2V4Y2VwdGlvbiA9IHRyYW5zaWVudF9jb21taXRfZXhjZXB0aW9uOworCXN0b3JlLT5kcm9wX3NuYXBzaG90ID0gTlVMTDsKKwlzdG9yZS0+ZnJhY3Rpb25fZnVsbCA9IHRyYW5zaWVudF9mcmFjdGlvbl9mdWxsOworCisJdGMgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdHJhbnNpZW50X2MpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXRjKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXRjLT5uZXh0X2ZyZWUgPSAwOworCXN0b3JlLT5jb250ZXh0ID0gdGM7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGRtX3RyYW5zaWVudF9zbmFwc2hvdF9pbml0KHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgZG1fdHJhbnNpZW50X3NuYXBzaG90X2V4aXQodm9pZCkKK3sKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvZG0tc25hcC5jIGIvZHJpdmVycy9tZC9kbS1zbmFwLmMKaW5kZXggNmM5NmRiMi4uNjVmZjgyZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9kbS1zbmFwLmMKKysrIGIvZHJpdmVycy9tZC9kbS1zbmFwLmMKQEAgLTksNiArOSw3IEBACiAjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UtbWFwcGVyLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9rZGV2X3QuaD4KQEAgLTIwLDYgKzIxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9sb2cyLmg+CiAjaW5jbHVkZSA8bGludXgvZG0ta2NvcHlkLmg+CiAKKyNpbmNsdWRlICJkbS1leGNlcHRpb24tc3RvcmUuaCIKICNpbmNsdWRlICJkbS1zbmFwLmgiCiAjaW5jbHVkZSAiZG0tYmlvLWxpc3QuaCIKIApAQCAtNDI4LDggKzQzMCwxMyBAQAogCWxpc3RfYWRkKCZuZXdfZS0+aGFzaF9saXN0LCBlID8gJmUtPmhhc2hfbGlzdCA6IGwpOwogfQogCi1pbnQgZG1fYWRkX2V4Y2VwdGlvbihzdHJ1Y3QgZG1fc25hcHNob3QgKnMsIGNodW5rX3Qgb2xkLCBjaHVua190IG5ldykKKy8qCisgKiBDYWxsYmFjayB1c2VkIGJ5IHRoZSBleGNlcHRpb24gc3RvcmVzIHRvIGxvYWQgZXhjZXB0aW9ucyB3aGVuCisgKiBpbml0aWFsaXNpbmcuCisgKi8KK3N0YXRpYyBpbnQgZG1fYWRkX2V4Y2VwdGlvbih2b2lkICpjb250ZXh0LCBjaHVua190IG9sZCwgY2h1bmtfdCBuZXcpCiB7CisJc3RydWN0IGRtX3NuYXBzaG90ICpzID0gY29udGV4dDsKIAlzdHJ1Y3QgZG1fc25hcF9leGNlcHRpb24gKmU7CiAKIAllID0gYWxsb2NfZXhjZXB0aW9uKCk7CkBAIC02NTgsNyArNjY1LDcgQEAKIAlzcGluX2xvY2tfaW5pdCgmcy0+dHJhY2tlZF9jaHVua19sb2NrKTsKIAogCS8qIE1ldGFkYXRhIG11c3Qgb25seSBiZSBsb2FkZWQgaW50byBvbmUgdGFibGUgYXQgb25jZSAqLwotCXIgPSBzLT5zdG9yZS5yZWFkX21ldGFkYXRhKCZzLT5zdG9yZSk7CisJciA9IHMtPnN0b3JlLnJlYWRfbWV0YWRhdGEoJnMtPnN0b3JlLCBkbV9hZGRfZXhjZXB0aW9uLCAodm9pZCAqKXMpOwogCWlmIChyIDwgMCkgewogCQl0aS0+ZXJyb3IgPSAiRmFpbGVkIHRvIHJlYWQgc25hcHNob3QgbWV0YWRhdGEiOwogCQlnb3RvIGJhZF9sb2FkX2FuZF9yZWdpc3RlcjsKQEAgLTczNSw3ICs3NDIsNyBAQAogCXVucmVnaXN0ZXJfc25hcHNob3Qocyk7CiAKIAl3aGlsZSAoYXRvbWljX3JlYWQoJnMtPnBlbmRpbmdfZXhjZXB0aW9uc19jb3VudCkpCi0JCXlpZWxkKCk7CisJCW1zbGVlcCgxKTsKIAkvKgogCSAqIEVuc3VyZSBpbnN0cnVjdGlvbnMgaW4gbWVtcG9vbF9kZXN0cm95IGFyZW4ndCByZW9yZGVyZWQKIAkgKiBiZWZvcmUgYXRvbWljX3JlYWQuCkBAIC04ODgsMTAgKzg5NSwxMCBAQAogCiAJLyoKIAkgKiBDaGVjayBmb3IgY29uZmxpY3RpbmcgcmVhZHMuIFRoaXMgaXMgZXh0cmVtZWx5IGltcHJvYmFibGUsCi0JICogc28geWllbGQoKSBpcyBzdWZmaWNpZW50IGFuZCB0aGVyZSBpcyBubyBuZWVkIGZvciBhIHdhaXQgcXVldWUuCisJICogc28gbXNsZWVwKDEpIGlzIHN1ZmZpY2llbnQgYW5kIHRoZXJlIGlzIG5vIG5lZWQgZm9yIGEgd2FpdCBxdWV1ZS4KIAkgKi8KIAl3aGlsZSAoX19jaHVua19pc190cmFja2VkKHMsIHBlLT5lLm9sZF9jaHVuaykpCi0JCXlpZWxkKCk7CisJCW1zbGVlcCgxKTsKIAogCS8qCiAJICogQWRkIGEgcHJvcGVyIGV4Y2VwdGlvbiwgYW5kIHJlbW92ZSB0aGUKQEAgLTE0MDQsNiArMTQxMSwxMiBAQAogewogCWludCByOwogCisJciA9IGRtX2V4Y2VwdGlvbl9zdG9yZV9pbml0KCk7CisJaWYgKHIpIHsKKwkJRE1FUlIoIkZhaWxlZCB0byBpbml0aWFsaXplIGV4Y2VwdGlvbiBzdG9yZXMiKTsKKwkJcmV0dXJuIHI7CisJfQorCiAJciA9IGRtX3JlZ2lzdGVyX3RhcmdldCgmc25hcHNob3RfdGFyZ2V0KTsKIAlpZiAocikgewogCQlETUVSUigic25hcHNob3QgdGFyZ2V0IHJlZ2lzdGVyIGZhaWxlZCAlZCIsIHIpOwpAQCAtMTQ1MiwzOSArMTQ2NSwzNCBAQAogCiAJcmV0dXJuIDA7CiAKLSAgICAgIGJhZF9wZW5kaW5nX3Bvb2w6CitiYWRfcGVuZGluZ19wb29sOgogCWttZW1fY2FjaGVfZGVzdHJveSh0cmFja2VkX2NodW5rX2NhY2hlKTsKLSAgICAgIGJhZDU6CitiYWQ1OgogCWttZW1fY2FjaGVfZGVzdHJveShwZW5kaW5nX2NhY2hlKTsKLSAgICAgIGJhZDQ6CitiYWQ0OgogCWttZW1fY2FjaGVfZGVzdHJveShleGNlcHRpb25fY2FjaGUpOwotICAgICAgYmFkMzoKK2JhZDM6CiAJZXhpdF9vcmlnaW5faGFzaCgpOwotICAgICAgYmFkMjoKK2JhZDI6CiAJZG1fdW5yZWdpc3Rlcl90YXJnZXQoJm9yaWdpbl90YXJnZXQpOwotICAgICAgYmFkMToKK2JhZDE6CiAJZG1fdW5yZWdpc3Rlcl90YXJnZXQoJnNuYXBzaG90X3RhcmdldCk7CiAJcmV0dXJuIHI7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBkbV9zbmFwc2hvdF9leGl0KHZvaWQpCiB7Ci0JaW50IHI7Ci0KIAlkZXN0cm95X3dvcmtxdWV1ZShrc25hcGQpOwogCi0JciA9IGRtX3VucmVnaXN0ZXJfdGFyZ2V0KCZzbmFwc2hvdF90YXJnZXQpOwotCWlmIChyKQotCQlETUVSUigic25hcHNob3QgdW5yZWdpc3RlciBmYWlsZWQgJWQiLCByKTsKLQotCXIgPSBkbV91bnJlZ2lzdGVyX3RhcmdldCgmb3JpZ2luX3RhcmdldCk7Ci0JaWYgKHIpCi0JCURNRVJSKCJvcmlnaW4gdW5yZWdpc3RlciBmYWlsZWQgJWQiLCByKTsKKwlkbV91bnJlZ2lzdGVyX3RhcmdldCgmc25hcHNob3RfdGFyZ2V0KTsKKwlkbV91bnJlZ2lzdGVyX3RhcmdldCgmb3JpZ2luX3RhcmdldCk7CiAKIAlleGl0X29yaWdpbl9oYXNoKCk7CiAJa21lbV9jYWNoZV9kZXN0cm95KHBlbmRpbmdfY2FjaGUpOwogCWttZW1fY2FjaGVfZGVzdHJveShleGNlcHRpb25fY2FjaGUpOwogCWttZW1fY2FjaGVfZGVzdHJveSh0cmFja2VkX2NodW5rX2NhY2hlKTsKKworCWRtX2V4Y2VwdGlvbl9zdG9yZV9leGl0KCk7CiB9CiAKIC8qIE1vZHVsZSBob29rcyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9kbS1zbmFwLmggYi9kcml2ZXJzL21kL2RtLXNuYXAuaAppbmRleCA5OWMwMTA2Li5kOWU2MmI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL2RtLXNuYXAuaAorKysgYi9kcml2ZXJzL21kL2RtLXNuYXAuaApAQCAtMSw2ICsxLDQgQEAKIC8qCi0gKiBkbS1zbmFwc2hvdC5jCi0gKgogICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDIgU2lzdGluYSBTb2Z0d2FyZSAoVUspIExpbWl0ZWQuCiAgKgogICogVGhpcyBmaWxlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBHUEwuCkBAIC0xMCw2ICs4LDcgQEAKICNkZWZpbmUgRE1fU05BUFNIT1RfSAogCiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLW1hcHBlci5oPgorI2luY2x1ZGUgImRtLWV4Y2VwdGlvbi1zdG9yZS5oIgogI2luY2x1ZGUgImRtLWJpby1saXN0LmgiCiAjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CkBAIC0yMCwxMTYgKzE5LDYgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkICp0YWJsZTsKIH07CiAKLS8qCi0gKiBUaGUgc25hcHNob3QgY29kZSBkZWFscyB3aXRoIGxhcmdpc2ggY2h1bmtzIG9mIHRoZSBkaXNrIGF0IGEKLSAqIHRpbWUuIFR5cGljYWxseSAzMmsgLSA1MTJrLgotICovCi10eXBlZGVmIHNlY3Rvcl90IGNodW5rX3Q7Ci0KLS8qCi0gKiBBbiBleGNlcHRpb24gaXMgdXNlZCB3aGVyZSBhbiBvbGQgY2h1bmsgb2YgZGF0YSBoYXMgYmVlbgotICogcmVwbGFjZWQgYnkgYSBuZXcgb25lLgotICogSWYgY2h1bmtfdCBpcyA2NCBiaXRzIGluIHNpemUsIHRoZSB0b3AgOCBiaXRzIG9mIG5ld19jaHVuayBob2xkIHRoZSBudW1iZXIKLSAqIG9mIGNodW5rcyB0aGF0IGZvbGxvdyBjb250aWd1b3VzbHkuICBSZW1haW5pbmcgYml0cyBob2xkIHRoZSBudW1iZXIgb2YgdGhlCi0gKiBjaHVuayB3aXRoaW4gdGhlIGRldmljZS4KLSAqLwotc3RydWN0IGRtX3NuYXBfZXhjZXB0aW9uIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGhhc2hfbGlzdDsKLQotCWNodW5rX3Qgb2xkX2NodW5rOwotCWNodW5rX3QgbmV3X2NodW5rOwotfTsKLQotLyoKLSAqIEZ1bnRpb25zIHRvIG1hbmlwdWxhdGUgY29uc2VjdXRpdmUgY2h1bmtzCi0gKi8KLSMgIGlmIGRlZmluZWQoQ09ORklHX0xCRCkgfHwgKEJJVFNfUEVSX0xPTkcgPT0gNjQpCi0jICAgIGRlZmluZSBETV9DSFVOS19DT05TRUNVVElWRV9CSVRTIDgKLSMgICAgZGVmaW5lIERNX0NIVU5LX05VTUJFUl9CSVRTIDU2Ci0KLXN0YXRpYyBpbmxpbmUgY2h1bmtfdCBkbV9jaHVua19udW1iZXIoY2h1bmtfdCBjaHVuaykKLXsKLQlyZXR1cm4gY2h1bmsgJiAoY2h1bmtfdCkoKDFVTEwgPDwgRE1fQ0hVTktfTlVNQkVSX0JJVFMpIC0gMVVMTCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgZG1fY29uc2VjdXRpdmVfY2h1bmtfY291bnQoc3RydWN0IGRtX3NuYXBfZXhjZXB0aW9uICplKQotewotCXJldHVybiBlLT5uZXdfY2h1bmsgPj4gRE1fQ0hVTktfTlVNQkVSX0JJVFM7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBkbV9jb25zZWN1dGl2ZV9jaHVua19jb3VudF9pbmMoc3RydWN0IGRtX3NuYXBfZXhjZXB0aW9uICplKQotewotCWUtPm5ld19jaHVuayArPSAoMVVMTCA8PCBETV9DSFVOS19OVU1CRVJfQklUUyk7Ci0KLQlCVUdfT04oIWRtX2NvbnNlY3V0aXZlX2NodW5rX2NvdW50KGUpKTsKLX0KLQotIyAgZWxzZQotIyAgICBkZWZpbmUgRE1fQ0hVTktfQ09OU0VDVVRJVkVfQklUUyAwCi0KLXN0YXRpYyBpbmxpbmUgY2h1bmtfdCBkbV9jaHVua19udW1iZXIoY2h1bmtfdCBjaHVuaykKLXsKLQlyZXR1cm4gY2h1bms7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgZG1fY29uc2VjdXRpdmVfY2h1bmtfY291bnQoc3RydWN0IGRtX3NuYXBfZXhjZXB0aW9uICplKQotewotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgZG1fY29uc2VjdXRpdmVfY2h1bmtfY291bnRfaW5jKHN0cnVjdCBkbV9zbmFwX2V4Y2VwdGlvbiAqZSkKLXsKLX0KLQotIyAgZW5kaWYKLQotLyoKLSAqIEFic3RyYWN0aW9uIHRvIGhhbmRsZSB0aGUgbWV0YS9sYXlvdXQgb2YgZXhjZXB0aW9uIHN0b3JlcyAodGhlCi0gKiBDT1cgZGV2aWNlKS4KLSAqLwotc3RydWN0IGV4Y2VwdGlvbl9zdG9yZSB7Ci0KLQkvKgotCSAqIERlc3Ryb3lzIHRoaXMgb2JqZWN0IHdoZW4geW91J3ZlIGZpbmlzaGVkIHdpdGggaXQuCi0JICovCi0Jdm9pZCAoKmRlc3Ryb3kpIChzdHJ1Y3QgZXhjZXB0aW9uX3N0b3JlICpzdG9yZSk7Ci0KLQkvKgotCSAqIFRoZSB0YXJnZXQgc2hvdWxkbid0IHJlYWQgdGhlIENPVyBkZXZpY2UgdW50aWwgdGhpcyBpcwotCSAqIGNhbGxlZC4KLQkgKi8KLQlpbnQgKCpyZWFkX21ldGFkYXRhKSAoc3RydWN0IGV4Y2VwdGlvbl9zdG9yZSAqc3RvcmUpOwotCi0JLyoKLQkgKiBGaW5kIHNvbWV3aGVyZSB0byBzdG9yZSB0aGUgbmV4dCBleGNlcHRpb24uCi0JICovCi0JaW50ICgqcHJlcGFyZV9leGNlcHRpb24pIChzdHJ1Y3QgZXhjZXB0aW9uX3N0b3JlICpzdG9yZSwKLQkJCQkgIHN0cnVjdCBkbV9zbmFwX2V4Y2VwdGlvbiAqZSk7Ci0KLQkvKgotCSAqIFVwZGF0ZSB0aGUgbWV0YWRhdGEgd2l0aCB0aGlzIGV4Y2VwdGlvbi4KLQkgKi8KLQl2b2lkICgqY29tbWl0X2V4Y2VwdGlvbikgKHN0cnVjdCBleGNlcHRpb25fc3RvcmUgKnN0b3JlLAotCQkJCSAgc3RydWN0IGRtX3NuYXBfZXhjZXB0aW9uICplLAotCQkJCSAgdm9pZCAoKmNhbGxiYWNrKSAodm9pZCAqLCBpbnQgc3VjY2VzcyksCi0JCQkJICB2b2lkICpjYWxsYmFja19jb250ZXh0KTsKLQotCS8qCi0JICogVGhlIHNuYXBzaG90IGlzIGludmFsaWQsIG5vdGUgdGhpcyBpbiB0aGUgbWV0YWRhdGEuCi0JICovCi0Jdm9pZCAoKmRyb3Bfc25hcHNob3QpIChzdHJ1Y3QgZXhjZXB0aW9uX3N0b3JlICpzdG9yZSk7Ci0KLQkvKgotCSAqIFJldHVybiBob3cgZnVsbCB0aGUgc25hcHNob3QgaXMuCi0JICovCi0Jdm9pZCAoKmZyYWN0aW9uX2Z1bGwpIChzdHJ1Y3QgZXhjZXB0aW9uX3N0b3JlICpzdG9yZSwKLQkJCSAgICAgICBzZWN0b3JfdCAqbnVtZXJhdG9yLAotCQkJICAgICAgIHNlY3Rvcl90ICpkZW5vbWluYXRvcik7Ci0KLQlzdHJ1Y3QgZG1fc25hcHNob3QgKnNuYXA7Ci0Jdm9pZCAqY29udGV4dDsKLX07Ci0KICNkZWZpbmUgRE1fVFJBQ0tFRF9DSFVOS19IQVNIX1NJWkUJMTYKICNkZWZpbmUgRE1fVFJBQ0tFRF9DSFVOS19IQVNIKHgpCSgodW5zaWduZWQgbG9uZykoeCkgJiBcCiAJCQkJCSAoRE1fVFJBQ0tFRF9DSFVOS19IQVNIX1NJWkUgLSAxKSkKQEAgLTE3Miw3ICs2MSw3IEBACiAJc3BpbmxvY2tfdCBwZV9sb2NrOwogCiAJLyogVGhlIG9uIGRpc2sgbWV0YWRhdGEgaGFuZGxlciAqLwotCXN0cnVjdCBleGNlcHRpb25fc3RvcmUgc3RvcmU7CisJc3RydWN0IGRtX2V4Y2VwdGlvbl9zdG9yZSBzdG9yZTsKIAogCXN0cnVjdCBkbV9rY29weWRfY2xpZW50ICprY29weWRfY2xpZW50OwogCkBAIC0xODcsMjAgKzc2LDYgQEAKIH07CiAKIC8qCi0gKiBVc2VkIGJ5IHRoZSBleGNlcHRpb24gc3RvcmVzIHRvIGxvYWQgZXhjZXB0aW9ucyBoZW4KLSAqIGluaXRpYWxpc2luZy4KLSAqLwotaW50IGRtX2FkZF9leGNlcHRpb24oc3RydWN0IGRtX3NuYXBzaG90ICpzLCBjaHVua190IG9sZCwgY2h1bmtfdCBuZXcpOwotCi0vKgotICogQ29uc3RydWN0b3IgYW5kIGRlc3RydWN0b3IgZm9yIHRoZSBkZWZhdWx0IHBlcnNpc3RlbnQKLSAqIHN0b3JlLgotICovCi1pbnQgZG1fY3JlYXRlX3BlcnNpc3RlbnQoc3RydWN0IGV4Y2VwdGlvbl9zdG9yZSAqc3RvcmUpOwotCi1pbnQgZG1fY3JlYXRlX3RyYW5zaWVudChzdHJ1Y3QgZXhjZXB0aW9uX3N0b3JlICpzdG9yZSk7Ci0KLS8qCiAgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBzZWN0b3JzIGluIHRoZSBkZXZpY2UuCiAgKi8KIHN0YXRpYyBpbmxpbmUgc2VjdG9yX3QgZ2V0X2Rldl9zaXplKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2RtLXN0cmlwZS5jIGIvZHJpdmVycy9tZC9kbS1zdHJpcGUuYwppbmRleCA5ZTRlZjg4Li40MTU2OWJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL2RtLXN0cmlwZS5jCisrKyBiL2RyaXZlcnMvbWQvZG0tc3RyaXBlLmMKQEAgLTMzNyw5ICszMzcsNyBAQAogCiB2b2lkIGRtX3N0cmlwZV9leGl0KHZvaWQpCiB7Ci0JaWYgKGRtX3VucmVnaXN0ZXJfdGFyZ2V0KCZzdHJpcGVfdGFyZ2V0KSkKLQkJRE1XQVJOKCJ0YXJnZXQgdW5yZWdpc3RyYXRpb24gZmFpbGVkIik7Ci0KKwlkbV91bnJlZ2lzdGVyX3RhcmdldCgmc3RyaXBlX3RhcmdldCk7CiAJZGVzdHJveV93b3JrcXVldWUoa3N0cmlwZWQpOwogCiAJcmV0dXJuOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9kbS1zeXNmcy5jIGIvZHJpdmVycy9tZC9kbS1zeXNmcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyYTQ1ZTYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21kL2RtLXN5c2ZzLmMKQEAgLTAsMCArMSw5OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBmaWxlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBHUEwuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZG0taW9jdGwuaD4KKyNpbmNsdWRlICJkbS5oIgorCitzdHJ1Y3QgZG1fc3lzZnNfYXR0ciB7CisJc3RydWN0IGF0dHJpYnV0ZSBhdHRyOworCXNzaXplX3QgKCpzaG93KShzdHJ1Y3QgbWFwcGVkX2RldmljZSAqLCBjaGFyICopOworCXNzaXplX3QgKCpzdG9yZSkoc3RydWN0IG1hcHBlZF9kZXZpY2UgKiwgY2hhciAqKTsKK307CisKKyNkZWZpbmUgRE1fQVRUUl9STyhfbmFtZSkgXAorc3RydWN0IGRtX3N5c2ZzX2F0dHIgZG1fYXR0cl8jI19uYW1lID0gXAorCV9fQVRUUihfbmFtZSwgU19JUlVHTywgZG1fYXR0cl8jI19uYW1lIyNfc2hvdywgTlVMTCkKKworc3RhdGljIHNzaXplX3QgZG1fYXR0cl9zaG93KHN0cnVjdCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLAorCQkJICAgIGNoYXIgKnBhZ2UpCit7CisJc3RydWN0IGRtX3N5c2ZzX2F0dHIgKmRtX2F0dHI7CisJc3RydWN0IG1hcHBlZF9kZXZpY2UgKm1kOworCXNzaXplX3QgcmV0OworCisJZG1fYXR0ciA9IGNvbnRhaW5lcl9vZihhdHRyLCBzdHJ1Y3QgZG1fc3lzZnNfYXR0ciwgYXR0cik7CisJaWYgKCFkbV9hdHRyLT5zaG93KQorCQlyZXR1cm4gLUVJTzsKKworCW1kID0gZG1fZ2V0X2Zyb21fa29iamVjdChrb2JqKTsKKwlpZiAoIW1kKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldCA9IGRtX2F0dHItPnNob3cobWQsIHBhZ2UpOworCWRtX3B1dChtZCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCBkbV9hdHRyX25hbWVfc2hvdyhzdHJ1Y3QgbWFwcGVkX2RldmljZSAqbWQsIGNoYXIgKmJ1ZikKK3sKKwlpZiAoZG1fY29weV9uYW1lX2FuZF91dWlkKG1kLCBidWYsIE5VTEwpKQorCQlyZXR1cm4gLUVJTzsKKworCXN0cmNhdChidWYsICJcbiIpOworCXJldHVybiBzdHJsZW4oYnVmKTsKK30KKworc3RhdGljIHNzaXplX3QgZG1fYXR0cl91dWlkX3Nob3coc3RydWN0IG1hcHBlZF9kZXZpY2UgKm1kLCBjaGFyICpidWYpCit7CisJaWYgKGRtX2NvcHlfbmFtZV9hbmRfdXVpZChtZCwgTlVMTCwgYnVmKSkKKwkJcmV0dXJuIC1FSU87CisKKwlzdHJjYXQoYnVmLCAiXG4iKTsKKwlyZXR1cm4gc3RybGVuKGJ1Zik7Cit9CisKK3N0YXRpYyBETV9BVFRSX1JPKG5hbWUpOworc3RhdGljIERNX0FUVFJfUk8odXVpZCk7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpkbV9hdHRyc1tdID0geworCSZkbV9hdHRyX25hbWUuYXR0ciwKKwkmZG1fYXR0cl91dWlkLmF0dHIsCisJTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc3lzZnNfb3BzIGRtX3N5c2ZzX29wcyA9IHsKKwkuc2hvdwk9IGRtX2F0dHJfc2hvdywKK307CisKKy8qCisgKiBkbSBrb2JqZWN0IGlzIGVtYmVkZGVkIGluIG1hcHBlZF9kZXZpY2Ugc3RydWN0dXJlCisgKiBubyBuZWVkIHRvIGRlZmluZSByZWxlYXNlIGZ1bmN0aW9uIGhlcmUKKyAqLworc3RhdGljIHN0cnVjdCBrb2JqX3R5cGUgZG1fa3R5cGUgPSB7CisJLnN5c2ZzX29wcwk9ICZkbV9zeXNmc19vcHMsCisJLmRlZmF1bHRfYXR0cnMJPSBkbV9hdHRycywKK307CisKKy8qCisgKiBJbml0aWFsaXplIGtvYmoKKyAqIGJlY2F1c2Ugbm9ib2R5IHVzaW5nIG1kIHlldCwgbm8gbmVlZCB0byBjYWxsIGV4cGxpY2l0IGRtX2dldC9wdXQKKyAqLworaW50IGRtX3N5c2ZzX2luaXQoc3RydWN0IG1hcHBlZF9kZXZpY2UgKm1kKQoreworCXJldHVybiBrb2JqZWN0X2luaXRfYW5kX2FkZChkbV9rb2JqZWN0KG1kKSwgJmRtX2t0eXBlLAorCQkJCSAgICAmZGlza190b19kZXYoZG1fZGlzayhtZCkpLT5rb2JqLAorCQkJCSAgICAiJXMiLCAiZG0iKTsKK30KKworLyoKKyAqIFJlbW92ZSBrb2JqLCBjYWxsZWQgYWZ0ZXIgYWxsIHJlZmVyZW5jZXMgcmVtb3ZlZAorICovCit2b2lkIGRtX3N5c2ZzX2V4aXQoc3RydWN0IG1hcHBlZF9kZXZpY2UgKm1kKQoreworCWtvYmplY3RfcHV0KGRtX2tvYmplY3QobWQpKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvZG0tdGFibGUuYyBiL2RyaXZlcnMvbWQvZG0tdGFibGUuYwppbmRleCAwNGU1ZmQ3Li4yZmQ2NmMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL2RtLXRhYmxlLmMKKysrIGIvZHJpdmVycy9tZC9kbS10YWJsZS5jCkBAIC0xLDYgKzEsNiBAQAogLyoKICAqIENvcHlyaWdodCAoQykgMjAwMSBTaXN0aW5hIFNvZnR3YXJlIChVSykgTGltaXRlZC4KLSAqIENvcHlyaWdodCAoQykgMjAwNCBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwOCBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhpcyBmaWxlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBHUEwuCiAgKi8KQEAgLTE1LDYgKzE1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KIAogI2RlZmluZSBETV9NU0dfUFJFRklYICJ0YWJsZSIKQEAgLTI0LDYgKzI1LDE5IEBACiAjZGVmaW5lIEtFWVNfUEVSX05PREUgKE5PREVfU0laRSAvIHNpemVvZihzZWN0b3JfdCkpCiAjZGVmaW5lIENISUxEUkVOX1BFUl9OT0RFIChLRVlTX1BFUl9OT0RFICsgMSkKIAorLyoKKyAqIFRoZSB0YWJsZSBoYXMgYWx3YXlzIGV4YWN0bHkgb25lIHJlZmVyZW5jZSBmcm9tIGVpdGhlciBtYXBwZWRfZGV2aWNlLT5tYXAKKyAqIG9yIGhhc2hfY2VsbC0+bmV3X21hcC4gVGhpcyByZWZlcmVuY2UgaXMgbm90IGNvdW50ZWQgaW4gdGFibGUtPmhvbGRlcnMuCisgKiBBIHBhaXIgb2YgZG1fY3JlYXRlX3RhYmxlL2RtX2Rlc3Ryb3lfdGFibGUgZnVuY3Rpb25zIGlzIHVzZWQgZm9yIHRhYmxlCisgKiBjcmVhdGlvbi9kZXN0cnVjdGlvbi4KKyAqCisgKiBUZW1wb3JhcnkgcmVmZXJlbmNlcyBmcm9tIHRoZSBvdGhlciBjb2RlIGluY3JlYXNlIHRhYmxlLT5ob2xkZXJzLiBBIHBhaXIKKyAqIG9mIGRtX3RhYmxlX2dldC9kbV90YWJsZV9wdXQgZnVuY3Rpb25zIGlzIHVzZWQgdG8gbWFuaXB1bGF0ZSBpdC4KKyAqCisgKiBXaGVuIHRoZSB0YWJsZSBpcyBhYm91dCB0byBiZSBkZXN0cm95ZWQsIHdlIHdhaXQgZm9yIHRhYmxlLT5ob2xkZXJzIHRvCisgKiBkcm9wIHRvIHplcm8uCisgKi8KKwogc3RydWN0IGRtX3RhYmxlIHsKIAlzdHJ1Y3QgbWFwcGVkX2RldmljZSAqbWQ7CiAJYXRvbWljX3QgaG9sZGVyczsKQEAgLTM4LDYgKzUyLDggQEAKIAlzZWN0b3JfdCAqaGlnaHM7CiAJc3RydWN0IGRtX3RhcmdldCAqdGFyZ2V0czsKIAorCXVuc2lnbmVkIGJhcnJpZXJzX3N1cHBvcnRlZDoxOworCiAJLyoKIAkgKiBJbmRpY2F0ZXMgdGhlIHJ3IHBlcm1pc3Npb25zIGZvciB0aGUgbmV3IGxvZ2ljYWwKIAkgKiBkZXZpY2UuICBUaGlzIHNob3VsZCBiZSBhIGNvbWJpbmF0aW9uIG9mIEZNT0RFX1JFQUQKQEAgLTIyNiw3ICsyNDIsOCBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAogCUlOSVRfTElTVF9IRUFEKCZ0LT5kZXZpY2VzKTsKLQlhdG9taWNfc2V0KCZ0LT5ob2xkZXJzLCAxKTsKKwlhdG9taWNfc2V0KCZ0LT5ob2xkZXJzLCAwKTsKKwl0LT5iYXJyaWVyc19zdXBwb3J0ZWQgPSAxOwogCiAJaWYgKCFudW1fdGFyZ2V0cykKIAkJbnVtX3RhcmdldHMgPSBLRVlTX1BFUl9OT0RFOwpAQCAtMjU2LDEwICsyNzMsMTQgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIHRhYmxlX2Rlc3Ryb3koc3RydWN0IGRtX3RhYmxlICp0KQordm9pZCBkbV90YWJsZV9kZXN0cm95KHN0cnVjdCBkbV90YWJsZSAqdCkKIHsKIAl1bnNpZ25lZCBpbnQgaTsKIAorCXdoaWxlIChhdG9taWNfcmVhZCgmdC0+aG9sZGVycykpCisJCW1zbGVlcCgxKTsKKwlzbXBfbWIoKTsKKwogCS8qIGZyZWUgdGhlIGluZGV4ZXMgKHNlZSBkbV90YWJsZV9jb21wbGV0ZSkgKi8KIAlpZiAodC0+ZGVwdGggPj0gMikKIAkJdmZyZWUodC0+aW5kZXhbdC0+ZGVwdGggLSAyXSk7CkBAIC0yOTcsOCArMzE4LDggQEAKIAlpZiAoIXQpCiAJCXJldHVybjsKIAotCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZ0LT5ob2xkZXJzKSkKLQkJdGFibGVfZGVzdHJveSh0KTsKKwlzbXBfbWJfX2JlZm9yZV9hdG9taWNfZGVjKCk7CisJYXRvbWljX2RlYygmdC0+aG9sZGVycyk7CiB9CiAKIC8qCkBAIC03MjgsNiArNzQ5LDEwIEBACiAJLyogRklYTUU6IHRoZSBwbGFuIGlzIHRvIGNvbWJpbmUgaGlnaCBoZXJlIGFuZCB0aGVuIGhhdmUKIAkgKiB0aGUgbWVyZ2UgZm4gYXBwbHkgdGhlIHRhcmdldCBsZXZlbCByZXN0cmljdGlvbnMuICovCiAJY29tYmluZV9yZXN0cmljdGlvbnNfbG93KCZ0LT5saW1pdHMsICZ0Z3QtPmxpbWl0cyk7CisKKwlpZiAoISh0Z3QtPnR5cGUtPmZlYXR1cmVzICYgRE1fVEFSR0VUX1NVUFBPUlRTX0JBUlJJRVJTKSkKKwkJdC0+YmFycmllcnNfc3VwcG9ydGVkID0gMDsKKwogCXJldHVybiAwOwogCiAgYmFkOgpAQCAtNzcyLDYgKzc5NywxMiBAQAogCiAJY2hlY2tfZm9yX3ZhbGlkX2xpbWl0cygmdC0+bGltaXRzKTsKIAorCS8qCisJICogV2Ugb25seSBzdXBwb3J0IGJhcnJpZXJzIGlmIHRoZXJlIGlzIGV4YWN0bHkgb25lIHVuZGVybHlpbmcgZGV2aWNlLgorCSAqLworCWlmICghbGlzdF9pc19zaW5ndWxhcigmdC0+ZGV2aWNlcykpCisJCXQtPmJhcnJpZXJzX3N1cHBvcnRlZCA9IDA7CisKIAkvKiBob3cgbWFueSBpbmRleGVzIHdpbGwgdGhlIGJ0cmVlIGhhdmUgPyAqLwogCWxlYWZfbm9kZXMgPSBkbV9kaXZfdXAodC0+bnVtX3RhcmdldHMsIEtFWVNfUEVSX05PREUpOwogCXQtPmRlcHRoID0gMSArIGludF9sb2cobGVhZl9ub2RlcywgQ0hJTERSRU5fUEVSX05PREUpOwpAQCAtOTg2LDYgKzEwMTcsMTIgQEAKIAlyZXR1cm4gdC0+bWQ7CiB9CiAKK2ludCBkbV90YWJsZV9iYXJyaWVyX29rKHN0cnVjdCBkbV90YWJsZSAqdCkKK3sKKwlyZXR1cm4gdC0+YmFycmllcnNfc3VwcG9ydGVkOworfQorRVhQT1JUX1NZTUJPTChkbV90YWJsZV9iYXJyaWVyX29rKTsKKwogRVhQT1JUX1NZTUJPTChkbV92Y2FsbG9jKTsKIEVYUE9SVF9TWU1CT0woZG1fZ2V0X2RldmljZSk7CiBFWFBPUlRfU1lNQk9MKGRtX3B1dF9kZXZpY2UpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9kbS10YXJnZXQuYyBiL2RyaXZlcnMvbWQvZG0tdGFyZ2V0LmMKaW5kZXggODM1Y2Y5NS4uN2RlY2YxMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9kbS10YXJnZXQuYworKysgYi9kcml2ZXJzL21kL2RtLXRhcmdldC5jCkBAIC0xMzAsMjYgKzEzMCwyNiBAQAogCXJldHVybiBydjsKIH0KIAotaW50IGRtX3VucmVnaXN0ZXJfdGFyZ2V0KHN0cnVjdCB0YXJnZXRfdHlwZSAqdCkKK3ZvaWQgZG1fdW5yZWdpc3Rlcl90YXJnZXQoc3RydWN0IHRhcmdldF90eXBlICp0KQogewogCXN0cnVjdCB0dF9pbnRlcm5hbCAqdGk7CiAKIAlkb3duX3dyaXRlKCZfbG9jayk7CiAJaWYgKCEodGkgPSBfX2ZpbmRfdGFyZ2V0X3R5cGUodC0+bmFtZSkpKSB7Ci0JCXVwX3dyaXRlKCZfbG9jayk7Ci0JCXJldHVybiAtRUlOVkFMOworCQlETUNSSVQoIlVucmVnaXN0ZXJpbmcgdW5yZWNvZ25pc2VkIHRhcmdldDogJXMiLCB0LT5uYW1lKTsKKwkJQlVHKCk7CiAJfQogCiAJaWYgKHRpLT51c2UpIHsKLQkJdXBfd3JpdGUoJl9sb2NrKTsKLQkJcmV0dXJuIC1FVFhUQlNZOworCQlETUNSSVQoIkF0dGVtcHQgdG8gdW5yZWdpc3RlciB0YXJnZXQgc3RpbGwgaW4gdXNlOiAlcyIsCisJCSAgICAgICB0LT5uYW1lKTsKKwkJQlVHKCk7CiAJfQogCiAJbGlzdF9kZWwoJnRpLT5saXN0KTsKIAlrZnJlZSh0aSk7CiAKIAl1cF93cml0ZSgmX2xvY2spOwotCXJldHVybiAwOwogfQogCiAvKgpAQCAtMTg3LDggKzE4Nyw3IEBACiAKIHZvaWQgZG1fdGFyZ2V0X2V4aXQodm9pZCkKIHsKLQlpZiAoZG1fdW5yZWdpc3Rlcl90YXJnZXQoJmVycm9yX3RhcmdldCkpCi0JCURNV0FSTigiZXJyb3IgdGFyZ2V0IHVucmVnaXN0cmF0aW9uIGZhaWxlZCIpOworCWRtX3VucmVnaXN0ZXJfdGFyZ2V0KCZlcnJvcl90YXJnZXQpOwogfQogCiBFWFBPUlRfU1lNQk9MKGRtX3JlZ2lzdGVyX3RhcmdldCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2RtLXplcm8uYyBiL2RyaXZlcnMvbWQvZG0temVyby5jCmluZGV4IGNkYmYxMjYuLmJiYzk3MDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvZG0temVyby5jCisrKyBiL2RyaXZlcnMvbWQvZG0temVyby5jCkBAIC02OSwxMCArNjksNyBAQAogCiBzdGF0aWMgdm9pZCBfX2V4aXQgZG1femVyb19leGl0KHZvaWQpCiB7Ci0JaW50IHIgPSBkbV91bnJlZ2lzdGVyX3RhcmdldCgmemVyb190YXJnZXQpOwotCi0JaWYgKHIgPCAwKQotCQlETUVSUigidW5yZWdpc3RlciBmYWlsZWQgJWQiLCByKTsKKwlkbV91bnJlZ2lzdGVyX3RhcmdldCgmemVyb190YXJnZXQpOwogfQogCiBtb2R1bGVfaW5pdChkbV96ZXJvX2luaXQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2RtLmMgYi9kcml2ZXJzL21kL2RtLmMKaW5kZXggNDIxYzlmMC4uNTFiYTFkYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9kbS5jCisrKyBiL2RyaXZlcnMvbWQvZG0uYwpAQCAtMSw2ICsxLDYgQEAKIC8qCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDIgU2lzdGluYSBTb2Z0d2FyZSAoVUspIExpbWl0ZWQuCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNiBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwOCBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhpcyBmaWxlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBHUEwuCiAgKi8KQEAgLTMyLDYgKzMyLDcgQEAKIAogc3RhdGljIERFRklORV9TUElOTE9DSyhfbWlub3JfbG9jayk7CiAvKgorICogRm9yIGJpby1iYXNlZCBkbS4KICAqIE9uZSBvZiB0aGVzZSBpcyBhbGxvY2F0ZWQgcGVyIGJpby4KICAqLwogc3RydWN0IGRtX2lvIHsKQEAgLTQzLDYgKzQ0LDcgQEAKIH07CiAKIC8qCisgKiBGb3IgYmlvLWJhc2VkIGRtLgogICogT25lIG9mIHRoZXNlIGlzIGFsbG9jYXRlZCBwZXIgdGFyZ2V0IHdpdGhpbiBhIGJpby4gIEhvcGVmdWxseQogICogdGhpcyB3aWxsIGJlIHNpbXBsaWZpZWQgb3V0IG9uZSBkYXkuCiAgKi8KQEAgLTU0LDYgKzU2LDI3IEBACiAKIERFRklORV9UUkFDRShibG9ja19iaW9fY29tcGxldGUpOwogCisvKgorICogRm9yIHJlcXVlc3QtYmFzZWQgZG0uCisgKiBPbmUgb2YgdGhlc2UgaXMgYWxsb2NhdGVkIHBlciByZXF1ZXN0LgorICovCitzdHJ1Y3QgZG1fcnFfdGFyZ2V0X2lvIHsKKwlzdHJ1Y3QgbWFwcGVkX2RldmljZSAqbWQ7CisJc3RydWN0IGRtX3RhcmdldCAqdGk7CisJc3RydWN0IHJlcXVlc3QgKm9yaWcsIGNsb25lOworCWludCBlcnJvcjsKKwl1bmlvbiBtYXBfaW5mbyBpbmZvOworfTsKKworLyoKKyAqIEZvciByZXF1ZXN0LWJhc2VkIGRtLgorICogT25lIG9mIHRoZXNlIGlzIGFsbG9jYXRlZCBwZXIgYmlvLgorICovCitzdHJ1Y3QgZG1fcnFfY2xvbmVfYmlvX2luZm8geworCXN0cnVjdCBiaW8gKm9yaWc7CisJc3RydWN0IHJlcXVlc3QgKnJxOworfTsKKwogdW5pb24gbWFwX2luZm8gKmRtX2dldF9tYXBpbmZvKHN0cnVjdCBiaW8gKmJpbykKIHsKIAlpZiAoYmlvICYmIGJpby0+YmlfcHJpdmF0ZSkKQEAgLTE0NCwxMSArMTY3LDE2IEBACiAKIAkvKiBmb3JjZWQgZ2VvbWV0cnkgc2V0dGluZ3MgKi8KIAlzdHJ1Y3QgaGRfZ2VvbWV0cnkgZ2VvbWV0cnk7CisKKwkvKiBzeXNmcyBoYW5kbGUgKi8KKwlzdHJ1Y3Qga29iamVjdCBrb2JqOwogfTsKIAogI2RlZmluZSBNSU5fSU9TIDI1Ngogc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICpfaW9fY2FjaGU7CiBzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKl90aW9fY2FjaGU7CitzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKl9ycV90aW9fY2FjaGU7CitzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKl9ycV9iaW9faW5mb19jYWNoZTsKIAogc3RhdGljIGludCBfX2luaXQgbG9jYWxfaW5pdCh2b2lkKQogewpAQCAtMTY0LDkgKzE5MiwxNyBAQAogCWlmICghX3Rpb19jYWNoZSkKIAkJZ290byBvdXRfZnJlZV9pb19jYWNoZTsKIAorCV9ycV90aW9fY2FjaGUgPSBLTUVNX0NBQ0hFKGRtX3JxX3RhcmdldF9pbywgMCk7CisJaWYgKCFfcnFfdGlvX2NhY2hlKQorCQlnb3RvIG91dF9mcmVlX3Rpb19jYWNoZTsKKworCV9ycV9iaW9faW5mb19jYWNoZSA9IEtNRU1fQ0FDSEUoZG1fcnFfY2xvbmVfYmlvX2luZm8sIDApOworCWlmICghX3JxX2Jpb19pbmZvX2NhY2hlKQorCQlnb3RvIG91dF9mcmVlX3JxX3Rpb19jYWNoZTsKKwogCXIgPSBkbV91ZXZlbnRfaW5pdCgpOwogCWlmIChyKQotCQlnb3RvIG91dF9mcmVlX3Rpb19jYWNoZTsKKwkJZ290byBvdXRfZnJlZV9ycV9iaW9faW5mb19jYWNoZTsKIAogCV9tYWpvciA9IG1ham9yOwogCXIgPSByZWdpc3Rlcl9ibGtkZXYoX21ham9yLCBfbmFtZSk7CkBAIC0xODAsNiArMjE2LDEwIEBACiAKIG91dF91ZXZlbnRfZXhpdDoKIAlkbV91ZXZlbnRfZXhpdCgpOworb3V0X2ZyZWVfcnFfYmlvX2luZm9fY2FjaGU6CisJa21lbV9jYWNoZV9kZXN0cm95KF9ycV9iaW9faW5mb19jYWNoZSk7CitvdXRfZnJlZV9ycV90aW9fY2FjaGU6CisJa21lbV9jYWNoZV9kZXN0cm95KF9ycV90aW9fY2FjaGUpOwogb3V0X2ZyZWVfdGlvX2NhY2hlOgogCWttZW1fY2FjaGVfZGVzdHJveShfdGlvX2NhY2hlKTsKIG91dF9mcmVlX2lvX2NhY2hlOgpAQCAtMTkwLDYgKzIzMCw4IEBACiAKIHN0YXRpYyB2b2lkIGxvY2FsX2V4aXQodm9pZCkKIHsKKwlrbWVtX2NhY2hlX2Rlc3Ryb3koX3JxX2Jpb19pbmZvX2NhY2hlKTsKKwlrbWVtX2NhY2hlX2Rlc3Ryb3koX3JxX3Rpb19jYWNoZSk7CiAJa21lbV9jYWNoZV9kZXN0cm95KF90aW9fY2FjaGUpOwogCWttZW1fY2FjaGVfZGVzdHJveShfaW9fY2FjaGUpOwogCXVucmVnaXN0ZXJfYmxrZGV2KF9tYWpvciwgX25hbWUpOwpAQCAtNzk2LDcgKzgzOCwxMSBAQAogCWNpLm1hcCA9IGRtX2dldF90YWJsZShtZCk7CiAJaWYgKHVubGlrZWx5KCFjaS5tYXApKQogCQlyZXR1cm4gLUVJTzsKLQorCWlmICh1bmxpa2VseShiaW9fYmFycmllcihiaW8pICYmICFkbV90YWJsZV9iYXJyaWVyX29rKGNpLm1hcCkpKSB7CisJCWRtX3RhYmxlX3B1dChjaS5tYXApOworCQliaW9fZW5kaW8oYmlvLCAtRU9QTk9UU1VQUCk7CisJCXJldHVybiAwOworCX0KIAljaS5tZCA9IG1kOwogCWNpLmJpbyA9IGJpbzsKIAljaS5pbyA9IGFsbG9jX2lvKG1kKTsKQEAgLTg4MCwxNSArOTI2LDYgQEAKIAlzdHJ1Y3QgbWFwcGVkX2RldmljZSAqbWQgPSBxLT5xdWV1ZWRhdGE7CiAJaW50IGNwdTsKIAotCS8qCi0JICogVGhlcmUgaXMgbm8gdXNlIGluIGZvcndhcmRpbmcgYW55IGJhcnJpZXIgcmVxdWVzdCBzaW5jZSB3ZSBjYW4ndAotCSAqIGd1YXJhbnRlZSBpdCBpcyAob3IgY2FuIGJlKSBoYW5kbGVkIGJ5IHRoZSB0YXJnZXRzIGNvcnJlY3RseS4KLQkgKi8KLQlpZiAodW5saWtlbHkoYmlvX2JhcnJpZXIoYmlvKSkpIHsKLQkJYmlvX2VuZGlvKGJpbywgLUVPUE5PVFNVUFApOwotCQlyZXR1cm4gMDsKLQl9Ci0KIAlkb3duX3JlYWQoJm1kLT5pb19sb2NrKTsKIAogCWNwdSA9IHBhcnRfc3RhdF9sb2NrKCk7CkBAIC05NDMsOCArOTgwLDYgQEAKIAlzdHJ1Y3QgbWFwcGVkX2RldmljZSAqbWQgPSBjb25nZXN0ZWRfZGF0YTsKIAlzdHJ1Y3QgZG1fdGFibGUgKm1hcDsKIAotCWF0b21pY19pbmMoJm1kLT5wZW5kaW5nKTsKLQogCWlmICghdGVzdF9iaXQoRE1GX0JMT0NLX0lPLCAmbWQtPmZsYWdzKSkgewogCQltYXAgPSBkbV9nZXRfdGFibGUobWQpOwogCQlpZiAobWFwKSB7CkBAIC05NTMsMTAgKzk4OCw2IEBACiAJCX0KIAl9CiAKLQlpZiAoIWF0b21pY19kZWNfcmV0dXJuKCZtZC0+cGVuZGluZykpCi0JCS8qIG51ZGdlIGFueW9uZSB3YWl0aW5nIG9uIHN1c3BlbmQgcXVldWUgKi8KLQkJd2FrZV91cCgmbWQtPndhaXQpOwotCiAJcmV0dXJuIHI7CiB9CiAKQEAgLTEyMTYsMTAgKzEyNDcsMTIgQEAKIAogCWlmIChtZC0+c3VzcGVuZGVkX2JkZXYpCiAJCV9fc2V0X3NpemUobWQsIHNpemUpOwotCWlmIChzaXplID09IDApCi0JCXJldHVybiAwOwogCi0JZG1fdGFibGVfZ2V0KHQpOworCWlmICghc2l6ZSkgeworCQlkbV90YWJsZV9kZXN0cm95KHQpOworCQlyZXR1cm4gMDsKKwl9CisKIAlkbV90YWJsZV9ldmVudF9jYWxsYmFjayh0LCBldmVudF9jYWxsYmFjaywgbWQpOwogCiAJd3JpdGVfbG9jaygmbWQtPm1hcF9sb2NrKTsKQEAgLTEyNDEsNyArMTI3NCw3IEBACiAJd3JpdGVfbG9jaygmbWQtPm1hcF9sb2NrKTsKIAltZC0+bWFwID0gTlVMTDsKIAl3cml0ZV91bmxvY2soJm1kLT5tYXBfbG9jayk7Ci0JZG1fdGFibGVfcHV0KG1hcCk7CisJZG1fdGFibGVfZGVzdHJveShtYXApOwogfQogCiAvKgpAQCAtMTI1NSw2ICsxMjg4LDggQEAKIAlpZiAoIW1kKQogCQlyZXR1cm4gLUVOWElPOwogCisJZG1fc3lzZnNfaW5pdChtZCk7CisKIAkqcmVzdWx0ID0gbWQ7CiAJcmV0dXJuIDA7CiB9CkBAIC0xMzMwLDggKzEzNjUsOSBAQAogCQkJZG1fdGFibGVfcHJlc3VzcGVuZF90YXJnZXRzKG1hcCk7CiAJCQlkbV90YWJsZV9wb3N0c3VzcGVuZF90YXJnZXRzKG1hcCk7CiAJCX0KLQkJX191bmJpbmQobWQpOworCQlkbV9zeXNmc19leGl0KG1kKTsKIAkJZG1fdGFibGVfcHV0KG1hcCk7CisJCV9fdW5iaW5kKG1kKTsKIAkJZnJlZV9kZXYobWQpOwogCX0KIH0KQEAgLTE2NjksNiArMTcwNSwyNyBAQAogCXJldHVybiBtZC0+ZGlzazsKIH0KIAorc3RydWN0IGtvYmplY3QgKmRtX2tvYmplY3Qoc3RydWN0IG1hcHBlZF9kZXZpY2UgKm1kKQoreworCXJldHVybiAmbWQtPmtvYmo7Cit9CisKKy8qCisgKiBzdHJ1Y3QgbWFwcGVkX2RldmljZSBzaG91bGQgbm90IGJlIGV4cG9ydGVkIG91dHNpZGUgb2YgZG0uYworICogc28gdXNlIHRoaXMgY2hlY2sgdG8gdmVyaWZ5IHRoYXQga29iaiBpcyBwYXJ0IG9mIG1kIHN0cnVjdHVyZQorICovCitzdHJ1Y3QgbWFwcGVkX2RldmljZSAqZG1fZ2V0X2Zyb21fa29iamVjdChzdHJ1Y3Qga29iamVjdCAqa29iaikKK3sKKwlzdHJ1Y3QgbWFwcGVkX2RldmljZSAqbWQ7CisKKwltZCA9IGNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgbWFwcGVkX2RldmljZSwga29iaik7CisJaWYgKCZtZC0+a29iaiAhPSBrb2JqKQorCQlyZXR1cm4gTlVMTDsKKworCWRtX2dldChtZCk7CisJcmV0dXJuIG1kOworfQorCiBpbnQgZG1fc3VzcGVuZGVkKHN0cnVjdCBtYXBwZWRfZGV2aWNlICptZCkKIHsKIAlyZXR1cm4gdGVzdF9iaXQoRE1GX1NVU1BFTkRFRCwgJm1kLT5mbGFncyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2RtLmggYi9kcml2ZXJzL21kL2RtLmgKaW5kZXggMGFkZTYwYy4uMjAxOTRlMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9kbS5oCisrKyBiL2RyaXZlcnMvbWQvZG0uaApAQCAtMzYsNiArMzYsNyBAQAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogSW50ZXJuYWwgdGFibGUgZnVuY3Rpb25zLgogICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBkbV90YWJsZV9kZXN0cm95KHN0cnVjdCBkbV90YWJsZSAqdCk7CiB2b2lkIGRtX3RhYmxlX2V2ZW50X2NhbGxiYWNrKHN0cnVjdCBkbV90YWJsZSAqdCwKIAkJCSAgICAgdm9pZCAoKmZuKSh2b2lkICopLCB2b2lkICpjb250ZXh0KTsKIHN0cnVjdCBkbV90YXJnZXQgKmRtX3RhYmxlX2dldF90YXJnZXQoc3RydWN0IGRtX3RhYmxlICp0LCB1bnNpZ25lZCBpbnQgaW5kZXgpOwpAQCAtNTEsNiArNTIsNyBAQAogICogVG8gY2hlY2sgdGhlIHJldHVybiB2YWx1ZSBmcm9tIGRtX3RhYmxlX2ZpbmRfdGFyZ2V0KCkuCiAgKi8KICNkZWZpbmUgZG1fdGFyZ2V0X2lzX3ZhbGlkKHQpICgodCktPnRhYmxlKQoraW50IGRtX3RhYmxlX2JhcnJpZXJfb2soc3RydWN0IGRtX3RhYmxlICp0KTsKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogQSByZWdpc3RyeSBvZiB0YXJnZXQgdHlwZXMuCkBAIC03Miw2ICs3NCwxNCBAQAogdm9pZCBkbV9pbnRlcmZhY2VfZXhpdCh2b2lkKTsKIAogLyoKKyAqIHN5c2ZzIGludGVyZmFjZQorICovCitpbnQgZG1fc3lzZnNfaW5pdChzdHJ1Y3QgbWFwcGVkX2RldmljZSAqbWQpOwordm9pZCBkbV9zeXNmc19leGl0KHN0cnVjdCBtYXBwZWRfZGV2aWNlICptZCk7CitzdHJ1Y3Qga29iamVjdCAqZG1fa29iamVjdChzdHJ1Y3QgbWFwcGVkX2RldmljZSAqbWQpOworc3RydWN0IG1hcHBlZF9kZXZpY2UgKmRtX2dldF9mcm9tX2tvYmplY3Qoc3RydWN0IGtvYmplY3QgKmtvYmopOworCisvKgogICogVGFyZ2V0cyBmb3IgbGluZWFyIGFuZCBzdHJpcGVkIG1hcHBpbmdzCiAgKi8KIGludCBkbV9saW5lYXJfaW5pdCh2b2lkKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvZmF1bHR5LmMgYi9kcml2ZXJzL21kL2ZhdWx0eS5jCmluZGV4IGYyNmMxZjkuLjg2ZDlhZGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvZmF1bHR5LmMKKysrIGIvZHJpdmVycy9tZC9mYXVsdHkuYwpAQCAtMjgzLDcgKzI4Myw2IEBACiBzdGF0aWMgaW50IHJ1bihtZGRldl90ICptZGRldikKIHsKIAltZGtfcmRldl90ICpyZGV2OwotCXN0cnVjdCBsaXN0X2hlYWQgKnRtcDsKIAlpbnQgaTsKIAogCWNvbmZfdCAqY29uZiA9IGttYWxsb2Moc2l6ZW9mKCpjb25mKSwgR0ZQX0tFUk5FTCk7CkBAIC0yOTYsNyArMjk1LDcgQEAKIAl9CiAJY29uZi0+bmZhdWx0cyA9IDA7CiAKLQlyZGV2X2Zvcl9lYWNoKHJkZXYsIHRtcCwgbWRkZXYpCisJbGlzdF9mb3JfZWFjaF9lbnRyeShyZGV2LCAmbWRkZXYtPmRpc2tzLCBzYW1lX3NldCkKIAkJY29uZi0+cmRldiA9IHJkZXY7CiAKIAltZGRldi0+YXJyYXlfc2VjdG9ycyA9IG1kZGV2LT5zaXplICogMjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvbGluZWFyLmMgYi9kcml2ZXJzL21kL2xpbmVhci5jCmluZGV4IDNiOTBjNWMuLjFlM2FlYTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvbGluZWFyLmMKKysrIGIvZHJpdmVycy9tZC9saW5lYXIuYwpAQCAtMTA1LDcgKzEwNSw2IEBACiAJaW50IGksIG5iX3pvbmUsIGNudDsKIAlzZWN0b3JfdCBtaW5fc2VjdG9yczsKIAlzZWN0b3JfdCBjdXJyX3NlY3RvcjsKLQlzdHJ1Y3QgbGlzdF9oZWFkICp0bXA7CiAKIAljb25mID0ga3phbGxvYyAoc2l6ZW9mICgqY29uZikgKyByYWlkX2Rpc2tzKnNpemVvZihkZXZfaW5mb190KSwKIAkJCUdGUF9LRVJORUwpOwpAQCAtMTE1LDcgKzExNCw3IEBACiAJY250ID0gMDsKIAljb25mLT5hcnJheV9zZWN0b3JzID0gMDsKIAotCXJkZXZfZm9yX2VhY2gocmRldiwgdG1wLCBtZGRldikgeworCWxpc3RfZm9yX2VhY2hfZW50cnkocmRldiwgJm1kZGV2LT5kaXNrcywgc2FtZV9zZXQpIHsKIAkJaW50IGogPSByZGV2LT5yYWlkX2Rpc2s7CiAJCWRldl9pbmZvX3QgKmRpc2sgPSBjb25mLT5kaXNrcyArIGo7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvbWQuYyBiL2RyaXZlcnMvbWQvbWQuYwppbmRleCAxYjFkMzI2Li40MWUyNTA5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL21kLmMKKysrIGIvZHJpdmVycy9tZC9tZC5jCkBAIC0yMTQsMjAgKzIxNCwzMyBAQAogCXJldHVybiBtZGRldjsKIH0KIAorc3RhdGljIHZvaWQgbWRkZXZfZGVsYXllZF9kZWxldGUoc3RydWN0IHdvcmtfc3RydWN0ICp3cykKK3sKKwltZGRldl90ICptZGRldiA9IGNvbnRhaW5lcl9vZih3cywgbWRkZXZfdCwgZGVsX3dvcmspOworCWtvYmplY3RfZGVsKCZtZGRldi0+a29iaik7CisJa29iamVjdF9wdXQoJm1kZGV2LT5rb2JqKTsKK30KKwogc3RhdGljIHZvaWQgbWRkZXZfcHV0KG1kZGV2X3QgKm1kZGV2KQogewogCWlmICghYXRvbWljX2RlY19hbmRfbG9jaygmbWRkZXYtPmFjdGl2ZSwgJmFsbF9tZGRldnNfbG9jaykpCiAJCXJldHVybjsKLQlpZiAoIW1kZGV2LT5yYWlkX2Rpc2tzICYmIGxpc3RfZW1wdHkoJm1kZGV2LT5kaXNrcykpIHsKKwlpZiAoIW1kZGV2LT5yYWlkX2Rpc2tzICYmIGxpc3RfZW1wdHkoJm1kZGV2LT5kaXNrcykgJiYKKwkgICAgIW1kZGV2LT5ob2xkX2FjdGl2ZSkgewogCQlsaXN0X2RlbCgmbWRkZXYtPmFsbF9tZGRldnMpOwotCQlzcGluX3VubG9jaygmYWxsX21kZGV2c19sb2NrKTsKLQkJYmxrX2NsZWFudXBfcXVldWUobWRkZXYtPnF1ZXVlKTsKLQkJaWYgKG1kZGV2LT5zeXNmc19zdGF0ZSkKLQkJCXN5c2ZzX3B1dChtZGRldi0+c3lzZnNfc3RhdGUpOwotCQltZGRldi0+c3lzZnNfc3RhdGUgPSBOVUxMOwotCQlrb2JqZWN0X3B1dCgmbWRkZXYtPmtvYmopOwotCX0gZWxzZQotCQlzcGluX3VubG9jaygmYWxsX21kZGV2c19sb2NrKTsKKwkJaWYgKG1kZGV2LT5nZW5kaXNrKSB7CisJCQkvKiB3ZSBkaWQgYSBwcm9iZSBzbyBuZWVkIHRvIGNsZWFuIHVwLgorCQkJICogQ2FsbCBzY2hlZHVsZV93b3JrIGluc2lkZSB0aGUgc3BpbmxvY2sKKwkJCSAqIHNvIHRoYXQgZmx1c2hfc2NoZWR1bGVkX3dvcmsoKSBhZnRlcgorCQkJICogbWRkZXZfZmluZCB3aWxsIHN1Y2NlZWQgaW4gd2FpdGluZyBmb3IgdGhlCisJCQkgKiB3b3JrIHRvIGJlIGRvbmUuCisJCQkgKi8KKwkJCUlOSVRfV09SSygmbWRkZXYtPmRlbF93b3JrLCBtZGRldl9kZWxheWVkX2RlbGV0ZSk7CisJCQlzY2hlZHVsZV93b3JrKCZtZGRldi0+ZGVsX3dvcmspOworCQl9IGVsc2UKKwkJCWtmcmVlKG1kZGV2KTsKKwl9CisJc3Bpbl91bmxvY2soJmFsbF9tZGRldnNfbG9jayk7CiB9CiAKIHN0YXRpYyBtZGRldl90ICogbWRkZXZfZmluZChkZXZfdCB1bml0KQpAQCAtMjM2LDE1ICsyNDksNTAgQEAKIAogIHJldHJ5OgogCXNwaW5fbG9jaygmYWxsX21kZGV2c19sb2NrKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KG1kZGV2LCAmYWxsX21kZGV2cywgYWxsX21kZGV2cykKLQkJaWYgKG1kZGV2LT51bml0ID09IHVuaXQpIHsKLQkJCW1kZGV2X2dldChtZGRldik7Ci0JCQlzcGluX3VubG9jaygmYWxsX21kZGV2c19sb2NrKTsKLQkJCWtmcmVlKG5ldyk7Ci0JCQlyZXR1cm4gbWRkZXY7Ci0JCX0KIAotCWlmIChuZXcpIHsKKwlpZiAodW5pdCkgeworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KG1kZGV2LCAmYWxsX21kZGV2cywgYWxsX21kZGV2cykKKwkJCWlmIChtZGRldi0+dW5pdCA9PSB1bml0KSB7CisJCQkJbWRkZXZfZ2V0KG1kZGV2KTsKKwkJCQlzcGluX3VubG9jaygmYWxsX21kZGV2c19sb2NrKTsKKwkJCQlrZnJlZShuZXcpOworCQkJCXJldHVybiBtZGRldjsKKwkJCX0KKworCQlpZiAobmV3KSB7CisJCQlsaXN0X2FkZCgmbmV3LT5hbGxfbWRkZXZzLCAmYWxsX21kZGV2cyk7CisJCQlzcGluX3VubG9jaygmYWxsX21kZGV2c19sb2NrKTsKKwkJCW5ldy0+aG9sZF9hY3RpdmUgPSBVTlRJTF9JT0NUTDsKKwkJCXJldHVybiBuZXc7CisJCX0KKwl9IGVsc2UgaWYgKG5ldykgeworCQkvKiBmaW5kIGFuIHVudXNlZCB1bml0IG51bWJlciAqLworCQlzdGF0aWMgaW50IG5leHRfbWlub3IgPSA1MTI7CisJCWludCBzdGFydCA9IG5leHRfbWlub3I7CisJCWludCBpc19mcmVlID0gMDsKKwkJaW50IGRldiA9IDA7CisJCXdoaWxlICghaXNfZnJlZSkgeworCQkJZGV2ID0gTUtERVYoTURfTUFKT1IsIG5leHRfbWlub3IpOworCQkJbmV4dF9taW5vcisrOworCQkJaWYgKG5leHRfbWlub3IgPiBNSU5PUk1BU0spCisJCQkJbmV4dF9taW5vciA9IDA7CisJCQlpZiAobmV4dF9taW5vciA9PSBzdGFydCkgeworCQkJCS8qIE9oIGRlYXIsIGFsbCBpbiB1c2UuICovCisJCQkJc3Bpbl91bmxvY2soJmFsbF9tZGRldnNfbG9jayk7CisJCQkJa2ZyZWUobmV3KTsKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCX0KKwkJCQkKKwkJCWlzX2ZyZWUgPSAxOworCQkJbGlzdF9mb3JfZWFjaF9lbnRyeShtZGRldiwgJmFsbF9tZGRldnMsIGFsbF9tZGRldnMpCisJCQkJaWYgKG1kZGV2LT51bml0ID09IGRldikgeworCQkJCQlpc19mcmVlID0gMDsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQl9CisJCW5ldy0+dW5pdCA9IGRldjsKKwkJbmV3LT5tZF9taW5vciA9IE1JTk9SKGRldik7CisJCW5ldy0+aG9sZF9hY3RpdmUgPSBVTlRJTF9TVE9QOwogCQlsaXN0X2FkZCgmbmV3LT5hbGxfbWRkZXZzLCAmYWxsX21kZGV2cyk7CiAJCXNwaW5fdW5sb2NrKCZhbGxfbWRkZXZzX2xvY2spOwogCQlyZXR1cm4gbmV3OwpAQCAtMjc1LDE2ICszMjMsNiBAQAogCW5ldy0+cmVzeW5jX21heCA9IE1heFNlY3RvcjsKIAluZXctPmxldmVsID0gTEVWRUxfTk9ORTsKIAotCW5ldy0+cXVldWUgPSBibGtfYWxsb2NfcXVldWUoR0ZQX0tFUk5FTCk7Ci0JaWYgKCFuZXctPnF1ZXVlKSB7Ci0JCWtmcmVlKG5ldyk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQkvKiBDYW4gYmUgdW5sb2NrZWQgYmVjYXVzZSB0aGUgcXVldWUgaXMgbmV3OiBubyBjb25jdXJyZW5jeSAqLwotCXF1ZXVlX2ZsYWdfc2V0X3VubG9ja2VkKFFVRVVFX0ZMQUdfQ0xVU1RFUiwgbmV3LT5xdWV1ZSk7Ci0KLQlibGtfcXVldWVfbWFrZV9yZXF1ZXN0KG5ldy0+cXVldWUsIG1kX2ZhaWxfcmVxdWVzdCk7Ci0KIAlnb3RvIHJldHJ5OwogfQogCkBAIC0zMDcsMjUgKzM0NSwyMyBAQAogCiBzdGF0aWMgbWRrX3JkZXZfdCAqIGZpbmRfcmRldl9ucihtZGRldl90ICptZGRldiwgaW50IG5yKQogewotCW1ka19yZGV2X3QgKiByZGV2OwotCXN0cnVjdCBsaXN0X2hlYWQgKnRtcDsKKwltZGtfcmRldl90ICpyZGV2OwogCi0JcmRldl9mb3JfZWFjaChyZGV2LCB0bXAsIG1kZGV2KSB7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShyZGV2LCAmbWRkZXYtPmRpc2tzLCBzYW1lX3NldCkKIAkJaWYgKHJkZXYtPmRlc2NfbnIgPT0gbnIpCiAJCQlyZXR1cm4gcmRldjsKLQl9CisKIAlyZXR1cm4gTlVMTDsKIH0KIAogc3RhdGljIG1ka19yZGV2X3QgKiBmaW5kX3JkZXYobWRkZXZfdCAqIG1kZGV2LCBkZXZfdCBkZXYpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqdG1wOwogCW1ka19yZGV2X3QgKnJkZXY7CiAKLQlyZGV2X2Zvcl9lYWNoKHJkZXYsIHRtcCwgbWRkZXYpIHsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJkZXYsICZtZGRldi0+ZGlza3MsIHNhbWVfc2V0KQogCQlpZiAocmRldi0+YmRldi0+YmRfZGV2ID09IGRldikKIAkJCXJldHVybiByZGV2OwotCX0KKwogCXJldHVybiBOVUxMOwogfQogCkBAIC04NjEsNyArODk3LDYgQEAKIHN0YXRpYyB2b2lkIHN1cGVyXzkwX3N5bmMobWRkZXZfdCAqbWRkZXYsIG1ka19yZGV2X3QgKnJkZXYpCiB7CiAJbWRwX3N1cGVyX3QgKnNiOwotCXN0cnVjdCBsaXN0X2hlYWQgKnRtcDsKIAltZGtfcmRldl90ICpyZGV2MjsKIAlpbnQgbmV4dF9zcGFyZSA9IG1kZGV2LT5yYWlkX2Rpc2tzOwogCkBAIC05MzMsNyArOTY4LDcgQEAKIAkJc2ItPnN0YXRlIHw9ICgxPDxNRF9TQl9CSVRNQVBfUFJFU0VOVCk7CiAKIAlzYi0+ZGlza3NbMF0uc3RhdGUgPSAoMTw8TURfRElTS19SRU1PVkVEKTsKLQlyZGV2X2Zvcl9lYWNoKHJkZXYyLCB0bXAsIG1kZGV2KSB7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShyZGV2MiwgJm1kZGV2LT5kaXNrcywgc2FtZV9zZXQpIHsKIAkJbWRwX2Rpc2tfdCAqZDsKIAkJaW50IGRlc2NfbnI7CiAJCWlmIChyZGV2Mi0+cmFpZF9kaXNrID49IDAgJiYgdGVzdF9iaXQoSW5fc3luYywgJnJkZXYyLT5mbGFncykKQEAgLTEyNTksNyArMTI5NCw2IEBACiBzdGF0aWMgdm9pZCBzdXBlcl8xX3N5bmMobWRkZXZfdCAqbWRkZXYsIG1ka19yZGV2X3QgKnJkZXYpCiB7CiAJc3RydWN0IG1kcF9zdXBlcmJsb2NrXzEgKnNiOwotCXN0cnVjdCBsaXN0X2hlYWQgKnRtcDsKIAltZGtfcmRldl90ICpyZGV2MjsKIAlpbnQgbWF4X2RldiwgaTsKIAkvKiBtYWtlIHJkZXYtPnNiIG1hdGNoIG1kZGV2IGFuZCByZGV2IGRhdGEuICovCkBAIC0xMzA3LDcgKzEzNDEsNyBAQAogCX0KIAogCW1heF9kZXYgPSAwOwotCXJkZXZfZm9yX2VhY2gocmRldjIsIHRtcCwgbWRkZXYpCisJbGlzdF9mb3JfZWFjaF9lbnRyeShyZGV2MiwgJm1kZGV2LT5kaXNrcywgc2FtZV9zZXQpCiAJCWlmIChyZGV2Mi0+ZGVzY19ucisxID4gbWF4X2RldikKIAkJCW1heF9kZXYgPSByZGV2Mi0+ZGVzY19ucisxOwogCkBAIC0xMzE2LDcgKzEzNTAsNyBAQAogCWZvciAoaT0wOyBpPG1heF9kZXY7aSsrKQogCQlzYi0+ZGV2X3JvbGVzW2ldID0gY3B1X3RvX2xlMTYoMHhmZmZlKTsKIAkKLQlyZGV2X2Zvcl9lYWNoKHJkZXYyLCB0bXAsIG1kZGV2KSB7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShyZGV2MiwgJm1kZGV2LT5kaXNrcywgc2FtZV9zZXQpIHsKIAkJaSA9IHJkZXYyLT5kZXNjX25yOwogCQlpZiAodGVzdF9iaXQoRmF1bHR5LCAmcmRldjItPmZsYWdzKSkKIAkJCXNiLT5kZXZfcm9sZXNbaV0gPSBjcHVfdG9fbGUxNigweGZmZmUpOwpAQCAtMTQ2Niw2ICsxNTAwLDkgQEAKIAogCWxpc3RfYWRkX3JjdSgmcmRldi0+c2FtZV9zZXQsICZtZGRldi0+ZGlza3MpOwogCWJkX2NsYWltX2J5X2Rpc2socmRldi0+YmRldiwgcmRldi0+YmRldi0+YmRfaG9sZGVyLCBtZGRldi0+Z2VuZGlzayk7CisKKwkvKiBNYXkgYXMgd2VsbCBhbGxvdyByZWNvdmVyeSB0byBiZSByZXRyaWVkIG9uY2UgKi8KKwltZGRldi0+cmVjb3ZlcnlfZGlzYWJsZWQgPSAwOwogCXJldHVybiAwOwogCiAgZmFpbDoKQEAgLTE1NzEsOCArMTYwOCw3IEBACiAKIHN0YXRpYyB2b2lkIGV4cG9ydF9hcnJheShtZGRldl90ICptZGRldikKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICp0bXA7Ci0JbWRrX3JkZXZfdCAqcmRldjsKKwltZGtfcmRldl90ICpyZGV2LCAqdG1wOwogCiAJcmRldl9mb3JfZWFjaChyZGV2LCB0bXAsIG1kZGV2KSB7CiAJCWlmICghcmRldi0+bWRkZXYpIHsKQEAgLTE1OTMsNyArMTYyOSw3IEBACiAJCWRlc2MtPm1ham9yLGRlc2MtPm1pbm9yLGRlc2MtPnJhaWRfZGlzayxkZXNjLT5zdGF0ZSk7CiB9CiAKLXN0YXRpYyB2b2lkIHByaW50X3NiKG1kcF9zdXBlcl90ICpzYikKK3N0YXRpYyB2b2lkIHByaW50X3NiXzkwKG1kcF9zdXBlcl90ICpzYikKIHsKIAlpbnQgaTsKIApAQCAtMTYyNCwxMCArMTY2MCw1NyBAQAogCX0KIAlwcmludGsoS0VSTl9JTkZPICJtZDogICAgIFRISVM6ICIpOwogCXByaW50X2Rlc2MoJnNiLT50aGlzX2Rpc2spOwotCiB9CiAKLXN0YXRpYyB2b2lkIHByaW50X3JkZXYobWRrX3JkZXZfdCAqcmRldikKK3N0YXRpYyB2b2lkIHByaW50X3NiXzEoc3RydWN0IG1kcF9zdXBlcmJsb2NrXzEgKnNiKQoreworCV9fdTggKnV1aWQ7CisKKwl1dWlkID0gc2ItPnNldF91dWlkOworCXByaW50ayhLRVJOX0lORk8gIm1kOiAgU0I6IChWOiV1KSAoRjoweCUwOHgpIEFycmF5LUlEOjwlMDJ4JTAyeCUwMnglMDJ4IgorCQkJIjolMDJ4JTAyeDolMDJ4JTAyeDolMDJ4JTAyeDolMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMng+XG4iCisJICAgICAgIEtFUk5fSU5GTyAibWQ6ICAgIE5hbWU6IFwiJXNcIiBDVDolbGx1XG4iLAorCQlsZTMyX3RvX2NwdShzYi0+bWFqb3JfdmVyc2lvbiksCisJCWxlMzJfdG9fY3B1KHNiLT5mZWF0dXJlX21hcCksCisJCXV1aWRbMF0sIHV1aWRbMV0sIHV1aWRbMl0sIHV1aWRbM10sCisJCXV1aWRbNF0sIHV1aWRbNV0sIHV1aWRbNl0sIHV1aWRbN10sCisJCXV1aWRbOF0sIHV1aWRbOV0sIHV1aWRbMTBdLCB1dWlkWzExXSwKKwkJdXVpZFsxMl0sIHV1aWRbMTNdLCB1dWlkWzE0XSwgdXVpZFsxNV0sCisJCXNiLT5zZXRfbmFtZSwKKwkJKHVuc2lnbmVkIGxvbmcgbG9uZylsZTY0X3RvX2NwdShzYi0+Y3RpbWUpCisJCSAgICAgICAmIE1EX1NVUEVSQkxPQ0tfMV9USU1FX1NFQ19NQVNLKTsKKworCXV1aWQgPSBzYi0+ZGV2aWNlX3V1aWQ7CisJcHJpbnRrKEtFUk5fSU5GTyAibWQ6ICAgICAgIEwldSBTWiVsbHUgUkQ6JXUgTE86JXUgQ1M6JXUgRE86JWxsdSBEUzolbGx1IFNPOiVsbHUiCisJCQkiIFJPOiVsbHVcbiIKKwkgICAgICAgS0VSTl9JTkZPICJtZDogICAgIERldjolMDh4IFVVSUQ6ICUwMnglMDJ4JTAyeCUwMng6JTAyeCUwMng6JTAyeCUwMng6JTAyeCUwMngiCisJCQkiOiUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeFxuIgorCSAgICAgICBLRVJOX0lORk8gIm1kOiAgICAgICAoRjoweCUwOHgpIFVUOiVsbHUgRXZlbnRzOiVsbHUgUmVzeW5jT2Zmc2V0OiVsbHUgQ1NVTToweCUwOHhcbiIKKwkgICAgICAgS0VSTl9JTkZPICJtZDogICAgICAgICAoTWF4RGV2OiV1KSBcbiIsCisJCWxlMzJfdG9fY3B1KHNiLT5sZXZlbCksCisJCSh1bnNpZ25lZCBsb25nIGxvbmcpbGU2NF90b19jcHUoc2ItPnNpemUpLAorCQlsZTMyX3RvX2NwdShzYi0+cmFpZF9kaXNrcyksCisJCWxlMzJfdG9fY3B1KHNiLT5sYXlvdXQpLAorCQlsZTMyX3RvX2NwdShzYi0+Y2h1bmtzaXplKSwKKwkJKHVuc2lnbmVkIGxvbmcgbG9uZylsZTY0X3RvX2NwdShzYi0+ZGF0YV9vZmZzZXQpLAorCQkodW5zaWduZWQgbG9uZyBsb25nKWxlNjRfdG9fY3B1KHNiLT5kYXRhX3NpemUpLAorCQkodW5zaWduZWQgbG9uZyBsb25nKWxlNjRfdG9fY3B1KHNiLT5zdXBlcl9vZmZzZXQpLAorCQkodW5zaWduZWQgbG9uZyBsb25nKWxlNjRfdG9fY3B1KHNiLT5yZWNvdmVyeV9vZmZzZXQpLAorCQlsZTMyX3RvX2NwdShzYi0+ZGV2X251bWJlciksCisJCXV1aWRbMF0sIHV1aWRbMV0sIHV1aWRbMl0sIHV1aWRbM10sCisJCXV1aWRbNF0sIHV1aWRbNV0sIHV1aWRbNl0sIHV1aWRbN10sCisJCXV1aWRbOF0sIHV1aWRbOV0sIHV1aWRbMTBdLCB1dWlkWzExXSwKKwkJdXVpZFsxMl0sIHV1aWRbMTNdLCB1dWlkWzE0XSwgdXVpZFsxNV0sCisJCXNiLT5kZXZmbGFncywKKwkJKHVuc2lnbmVkIGxvbmcgbG9uZylsZTY0X3RvX2NwdShzYi0+dXRpbWUpICYgTURfU1VQRVJCTE9DS18xX1RJTUVfU0VDX01BU0ssCisJCSh1bnNpZ25lZCBsb25nIGxvbmcpbGU2NF90b19jcHUoc2ItPmV2ZW50cyksCisJCSh1bnNpZ25lZCBsb25nIGxvbmcpbGU2NF90b19jcHUoc2ItPnJlc3luY19vZmZzZXQpLAorCQlsZTMyX3RvX2NwdShzYi0+c2JfY3N1bSksCisJCWxlMzJfdG9fY3B1KHNiLT5tYXhfZGV2KQorCQkpOworfQorCitzdGF0aWMgdm9pZCBwcmludF9yZGV2KG1ka19yZGV2X3QgKnJkZXYsIGludCBtYWpvcl92ZXJzaW9uKQogewogCWNoYXIgYltCREVWTkFNRV9TSVpFXTsKIAlwcmludGsoS0VSTl9JTkZPICJtZDogcmRldiAlcywgU1o6JTA4bGx1IEY6JWQgUzolZCBETjoldVxuIiwKQEAgLTE2MzUsMTUgKzE3MTgsMjIgQEAKIAkgICAgICAgIHRlc3RfYml0KEZhdWx0eSwgJnJkZXYtPmZsYWdzKSwgdGVzdF9iaXQoSW5fc3luYywgJnJkZXYtPmZsYWdzKSwKIAkgICAgICAgIHJkZXYtPmRlc2NfbnIpOwogCWlmIChyZGV2LT5zYl9sb2FkZWQpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAibWQ6IHJkZXYgc3VwZXJibG9jazpcbiIpOwotCQlwcmludF9zYigobWRwX3N1cGVyX3QqKXBhZ2VfYWRkcmVzcyhyZGV2LT5zYl9wYWdlKSk7CisJCXByaW50ayhLRVJOX0lORk8gIm1kOiByZGV2IHN1cGVyYmxvY2sgKE1KOiVkKTpcbiIsIG1ham9yX3ZlcnNpb24pOworCQlzd2l0Y2ggKG1ham9yX3ZlcnNpb24pIHsKKwkJY2FzZSAwOgorCQkJcHJpbnRfc2JfOTAoKG1kcF9zdXBlcl90KilwYWdlX2FkZHJlc3MocmRldi0+c2JfcGFnZSkpOworCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCXByaW50X3NiXzEoKHN0cnVjdCBtZHBfc3VwZXJibG9ja18xICopcGFnZV9hZGRyZXNzKHJkZXYtPnNiX3BhZ2UpKTsKKwkJCWJyZWFrOworCQl9CiAJfSBlbHNlCiAJCXByaW50ayhLRVJOX0lORk8gIm1kOiBubyByZGV2IHN1cGVyYmxvY2shXG4iKTsKIH0KIAogc3RhdGljIHZvaWQgbWRfcHJpbnRfZGV2aWNlcyh2b2lkKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKnRtcCwgKnRtcDI7CisJc3RydWN0IGxpc3RfaGVhZCAqdG1wOwogCW1ka19yZGV2X3QgKnJkZXY7CiAJbWRkZXZfdCAqbWRkZXY7CiAJY2hhciBiW0JERVZOQU1FX1NJWkVdOwpAQCAtMTY1OCwxMiArMTc0OCwxMiBAQAogCQkJYml0bWFwX3ByaW50X3NiKG1kZGV2LT5iaXRtYXApOwogCQllbHNlCiAJCQlwcmludGsoIiVzOiAiLCBtZG5hbWUobWRkZXYpKTsKLQkJcmRldl9mb3JfZWFjaChyZGV2LCB0bXAyLCBtZGRldikKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShyZGV2LCAmbWRkZXYtPmRpc2tzLCBzYW1lX3NldCkKIAkJCXByaW50aygiPCVzPiIsIGJkZXZuYW1lKHJkZXYtPmJkZXYsYikpOwogCQlwcmludGsoIlxuIik7CiAKLQkJcmRldl9mb3JfZWFjaChyZGV2LCB0bXAyLCBtZGRldikKLQkJCXByaW50X3JkZXYocmRldik7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkocmRldiwgJm1kZGV2LT5kaXNrcywgc2FtZV9zZXQpCisJCQlwcmludF9yZGV2KHJkZXYsIG1kZGV2LT5tYWpvcl92ZXJzaW9uKTsKIAl9CiAJcHJpbnRrKCJtZDoJKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuIik7CiAJcHJpbnRrKCJcbiIpOwpAQCAtMTY3OSw5ICsxNzY5LDggQEAKIAkgKiB3aXRoIHRoZSByZXN0IG9mIHRoZSBhcnJheSkKIAkgKi8KIAltZGtfcmRldl90ICpyZGV2OwotCXN0cnVjdCBsaXN0X2hlYWQgKnRtcDsKIAotCXJkZXZfZm9yX2VhY2gocmRldiwgdG1wLCBtZGRldikgeworCWxpc3RfZm9yX2VhY2hfZW50cnkocmRldiwgJm1kZGV2LT5kaXNrcywgc2FtZV9zZXQpIHsKIAkJaWYgKHJkZXYtPnNiX2V2ZW50cyA9PSBtZGRldi0+ZXZlbnRzIHx8CiAJCSAgICAobm9zcGFyZXMgJiYKIAkJICAgICByZGV2LT5yYWlkX2Rpc2sgPCAwICYmCkBAIC0xNjk5LDcgKzE3ODgsNiBAQAogCiBzdGF0aWMgdm9pZCBtZF91cGRhdGVfc2IobWRkZXZfdCAqIG1kZGV2LCBpbnQgZm9yY2VfY2hhbmdlKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKnRtcDsKIAltZGtfcmRldl90ICpyZGV2OwogCWludCBzeW5jX3JlcTsKIAlpbnQgbm9zcGFyZXMgPSAwOwpAQCAtMTc5MCw3ICsxODc4LDcgQEAKIAkJbWRuYW1lKG1kZGV2KSxtZGRldi0+aW5fc3luYyk7CiAKIAliaXRtYXBfdXBkYXRlX3NiKG1kZGV2LT5iaXRtYXApOwotCXJkZXZfZm9yX2VhY2gocmRldiwgdG1wLCBtZGRldikgeworCWxpc3RfZm9yX2VhY2hfZW50cnkocmRldiwgJm1kZGV2LT5kaXNrcywgc2FtZV9zZXQpIHsKIAkJY2hhciBiW0JERVZOQU1FX1NJWkVdOwogCQlkcHJpbnRrKEtFUk5fSU5GTyAibWQ6ICIpOwogCQlpZiAocmRldi0+c2JfbG9hZGVkICE9IDEpCkBAIC0xOTk5LDcgKzIwODcsNiBAQAogCQltZF93YWtldXBfdGhyZWFkKHJkZXYtPm1kZGV2LT50aHJlYWQpOwogCX0gZWxzZSBpZiAocmRldi0+bWRkZXYtPnBlcnMpIHsKIAkJbWRrX3JkZXZfdCAqcmRldjI7Ci0JCXN0cnVjdCBsaXN0X2hlYWQgKnRtcDsKIAkJLyogQWN0aXZhdGluZyBhIHNwYXJlIC4uIG9yIHBvc3NpYmx5IHJlYWN0aXZhdGluZwogCQkgKiBpZiB3ZSBldmVyeSBnZXQgYml0bWFwcyB3b3JraW5nIGhlcmUuCiAJCSAqLwpAQCAtMjAxMCw3ICsyMDk3LDcgQEAKIAkJaWYgKHJkZXYtPm1kZGV2LT5wZXJzLT5ob3RfYWRkX2Rpc2sgPT0gTlVMTCkKIAkJCXJldHVybiAtRUlOVkFMOwogCi0JCXJkZXZfZm9yX2VhY2gocmRldjIsIHRtcCwgcmRldi0+bWRkZXYpCisJCWxpc3RfZm9yX2VhY2hfZW50cnkocmRldjIsICZyZGV2LT5tZGRldi0+ZGlza3MsIHNhbWVfc2V0KQogCQkJaWYgKHJkZXYyLT5yYWlkX2Rpc2sgPT0gc2xvdCkKIAkJCQlyZXR1cm4gLUVFWElTVDsKIApAQCAtMjEyNSwxNCArMjIxMiwxNCBAQAogCQkgKi8KIAkJbWRkZXZfdCAqbWRkZXY7CiAJCWludCBvdmVybGFwID0gMDsKLQkJc3RydWN0IGxpc3RfaGVhZCAqdG1wLCAqdG1wMjsKKwkJc3RydWN0IGxpc3RfaGVhZCAqdG1wOwogCiAJCW1kZGV2X3VubG9jayhteV9tZGRldik7CiAJCWZvcl9lYWNoX21kZGV2KG1kZGV2LCB0bXApIHsKIAkJCW1ka19yZGV2X3QgKnJkZXYyOwogCiAJCQltZGRldl9sb2NrKG1kZGV2KTsKLQkJCXJkZXZfZm9yX2VhY2gocmRldjIsIHRtcDIsIG1kZGV2KQorCQkJbGlzdF9mb3JfZWFjaF9lbnRyeShyZGV2MiwgJm1kZGV2LT5kaXNrcywgc2FtZV9zZXQpCiAJCQkJaWYgKHRlc3RfYml0KEFsbFJlc2VydmVkLCAmcmRldjItPmZsYWdzKSB8fAogCQkJCSAgICAocmRldi0+YmRldiA9PSByZGV2Mi0+YmRldiAmJgogCQkJCSAgICAgcmRldiAhPSByZGV2MiAmJgpAQCAtMjMyOCw4ICsyNDE1LDcgQEAKIHN0YXRpYyB2b2lkIGFuYWx5emVfc2JzKG1kZGV2X3QgKiBtZGRldikKIHsKIAlpbnQgaTsKLQlzdHJ1Y3QgbGlzdF9oZWFkICp0bXA7Ci0JbWRrX3JkZXZfdCAqcmRldiwgKmZyZXNoZXN0OworCW1ka19yZGV2X3QgKnJkZXYsICpmcmVzaGVzdCwgKnRtcDsKIAljaGFyIGJbQkRFVk5BTUVfU0laRV07CiAKIAlmcmVzaGVzdCA9IE5VTEw7CkBAIC0zMDQ2LDcgKzMxMzIsNyBAQAogCX0KIAlzZXRfYml0KE1EX1JFQ09WRVJZX05FRURFRCwgJm1kZGV2LT5yZWNvdmVyeSk7CiAJbWRfd2FrZXVwX3RocmVhZChtZGRldi0+dGhyZWFkKTsKLQlzeXNmc19ub3RpZnkoJm1kZGV2LT5rb2JqLCBOVUxMLCAic3luY19hY3Rpb24iKTsKKwlzeXNmc19ub3RpZnlfZGlyZW50KG1kZGV2LT5zeXNmc19hY3Rpb24pOwogCXJldHVybiBsZW47CiB9CiAKQEAgLTM0MDQsNiArMzQ5MCw4IEBACiAJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQogCQlyZXR1cm4gLUVBQ0NFUzsKIAlydiA9IG1kZGV2X2xvY2sobWRkZXYpOworCWlmIChtZGRldi0+aG9sZF9hY3RpdmUgPT0gVU5USUxfSU9DVEwpCisJCW1kZGV2LT5ob2xkX2FjdGl2ZSA9IDA7CiAJaWYgKCFydikgewogCQlydiA9IGVudHJ5LT5zdG9yZShtZGRldiwgcGFnZSwgbGVuZ3RoKTsKIAkJbWRkZXZfdW5sb2NrKG1kZGV2KTsKQEAgLTM0MTQsNiArMzUwMiwxNyBAQAogc3RhdGljIHZvaWQgbWRfZnJlZShzdHJ1Y3Qga29iamVjdCAqa28pCiB7CiAJbWRkZXZfdCAqbWRkZXYgPSBjb250YWluZXJfb2Yoa28sIG1kZGV2X3QsIGtvYmopOworCisJaWYgKG1kZGV2LT5zeXNmc19zdGF0ZSkKKwkJc3lzZnNfcHV0KG1kZGV2LT5zeXNmc19zdGF0ZSk7CisKKwlpZiAobWRkZXYtPmdlbmRpc2spIHsKKwkJZGVsX2dlbmRpc2sobWRkZXYtPmdlbmRpc2spOworCQlwdXRfZGlzayhtZGRldi0+Z2VuZGlzayk7CisJfQorCWlmIChtZGRldi0+cXVldWUpCisJCWJsa19jbGVhbnVwX3F1ZXVlKG1kZGV2LT5xdWV1ZSk7CisKIAlrZnJlZShtZGRldik7CiB9CiAKQEAgLTM0MjksMzQgKzM1MjgsNzQgQEAKIAogaW50IG1kcF9tYWpvciA9IDA7CiAKLXN0YXRpYyBzdHJ1Y3Qga29iamVjdCAqbWRfcHJvYmUoZGV2X3QgZGV2LCBpbnQgKnBhcnQsIHZvaWQgKmRhdGEpCitzdGF0aWMgaW50IG1kX2FsbG9jKGRldl90IGRldiwgY2hhciAqbmFtZSkKIHsKIAlzdGF0aWMgREVGSU5FX01VVEVYKGRpc2tzX211dGV4KTsKIAltZGRldl90ICptZGRldiA9IG1kZGV2X2ZpbmQoZGV2KTsKIAlzdHJ1Y3QgZ2VuZGlzayAqZGlzazsKLQlpbnQgcGFydGl0aW9uZWQgPSAoTUFKT1IoZGV2KSAhPSBNRF9NQUpPUik7Ci0JaW50IHNoaWZ0ID0gcGFydGl0aW9uZWQgPyBNZHBNaW5vclNoaWZ0IDogMDsKLQlpbnQgdW5pdCA9IE1JTk9SKGRldikgPj4gc2hpZnQ7CisJaW50IHBhcnRpdGlvbmVkOworCWludCBzaGlmdDsKKwlpbnQgdW5pdDsKIAlpbnQgZXJyb3I7CiAKIAlpZiAoIW1kZGV2KQotCQlyZXR1cm4gTlVMTDsKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlwYXJ0aXRpb25lZCA9IChNQUpPUihtZGRldi0+dW5pdCkgIT0gTURfTUFKT1IpOworCXNoaWZ0ID0gcGFydGl0aW9uZWQgPyBNZHBNaW5vclNoaWZ0IDogMDsKKwl1bml0ID0gTUlOT1IobWRkZXYtPnVuaXQpID4+IHNoaWZ0OworCisJLyogd2FpdCBmb3IgYW55IHByZXZpb3VzIGluc3RhbmNlIGlmIHRoaXMgZGV2aWNlCisJICogdG8gYmUgY29tcGxldGVkIHJlbW92ZWQgKG1kZGV2X2RlbGF5ZWRfZGVsZXRlKS4KKwkgKi8KKwlmbHVzaF9zY2hlZHVsZWRfd29yaygpOwogCiAJbXV0ZXhfbG9jaygmZGlza3NfbXV0ZXgpOwogCWlmIChtZGRldi0+Z2VuZGlzaykgewogCQltdXRleF91bmxvY2soJmRpc2tzX211dGV4KTsKIAkJbWRkZXZfcHV0KG1kZGV2KTsKLQkJcmV0dXJuIE5VTEw7CisJCXJldHVybiAtRUVYSVNUOwogCX0KKworCWlmIChuYW1lKSB7CisJCS8qIE5lZWQgdG8gZW5zdXJlIHRoYXQgJ25hbWUnIGlzIG5vdCBhIGR1cGxpY2F0ZS4KKwkJICovCisJCW1kZGV2X3QgKm1kZGV2MjsKKwkJc3Bpbl9sb2NrKCZhbGxfbWRkZXZzX2xvY2spOworCisJCWxpc3RfZm9yX2VhY2hfZW50cnkobWRkZXYyLCAmYWxsX21kZGV2cywgYWxsX21kZGV2cykKKwkJCWlmIChtZGRldjItPmdlbmRpc2sgJiYKKwkJCSAgICBzdHJjbXAobWRkZXYyLT5nZW5kaXNrLT5kaXNrX25hbWUsIG5hbWUpID09IDApIHsKKwkJCQlzcGluX3VubG9jaygmYWxsX21kZGV2c19sb2NrKTsKKwkJCQlyZXR1cm4gLUVFWElTVDsKKwkJCX0KKwkJc3Bpbl91bmxvY2soJmFsbF9tZGRldnNfbG9jayk7CisJfQorCisJbWRkZXYtPnF1ZXVlID0gYmxrX2FsbG9jX3F1ZXVlKEdGUF9LRVJORUwpOworCWlmICghbWRkZXYtPnF1ZXVlKSB7CisJCW11dGV4X3VubG9jaygmZGlza3NfbXV0ZXgpOworCQltZGRldl9wdXQobWRkZXYpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJLyogQ2FuIGJlIHVubG9ja2VkIGJlY2F1c2UgdGhlIHF1ZXVlIGlzIG5ldzogbm8gY29uY3VycmVuY3kgKi8KKwlxdWV1ZV9mbGFnX3NldF91bmxvY2tlZChRVUVVRV9GTEFHX0NMVVNURVIsIG1kZGV2LT5xdWV1ZSk7CisKKwlibGtfcXVldWVfbWFrZV9yZXF1ZXN0KG1kZGV2LT5xdWV1ZSwgbWRfZmFpbF9yZXF1ZXN0KTsKKwogCWRpc2sgPSBhbGxvY19kaXNrKDEgPDwgc2hpZnQpOwogCWlmICghZGlzaykgewogCQltdXRleF91bmxvY2soJmRpc2tzX211dGV4KTsKKwkJYmxrX2NsZWFudXBfcXVldWUobWRkZXYtPnF1ZXVlKTsKKwkJbWRkZXYtPnF1ZXVlID0gTlVMTDsKIAkJbWRkZXZfcHV0KG1kZGV2KTsKLQkJcmV0dXJuIE5VTEw7CisJCXJldHVybiAtRU5PTUVNOwogCX0KLQlkaXNrLT5tYWpvciA9IE1BSk9SKGRldik7CisJZGlzay0+bWFqb3IgPSBNQUpPUihtZGRldi0+dW5pdCk7CiAJZGlzay0+Zmlyc3RfbWlub3IgPSB1bml0IDw8IHNoaWZ0OwotCWlmIChwYXJ0aXRpb25lZCkKKwlpZiAobmFtZSkKKwkJc3RyY3B5KGRpc2stPmRpc2tfbmFtZSwgbmFtZSk7CisJZWxzZSBpZiAocGFydGl0aW9uZWQpCiAJCXNwcmludGYoZGlzay0+ZGlza19uYW1lLCAibWRfZCVkIiwgdW5pdCk7CiAJZWxzZQogCQlzcHJpbnRmKGRpc2stPmRpc2tfbmFtZSwgIm1kJWQiLCB1bml0KTsKQEAgLTM0NjQsNyArMzYwMyw3IEBACiAJZGlzay0+cHJpdmF0ZV9kYXRhID0gbWRkZXY7CiAJZGlzay0+cXVldWUgPSBtZGRldi0+cXVldWU7CiAJLyogQWxsb3cgZXh0ZW5kZWQgcGFydGl0aW9ucy4gIFRoaXMgbWFrZXMgdGhlCi0JICogJ21kcCcgZGV2aWNlIHJlZHVuZGFudCwgYnV0IHdlIGNhbiByZWFsbHkKKwkgKiAnbWRwJyBkZXZpY2UgcmVkdW5kYW50LCBidXQgd2UgY2FuJ3QgcmVhbGx5CiAJICogcmVtb3ZlIGl0IG5vdy4KIAkgKi8KIAlkaXNrLT5mbGFncyB8PSBHRU5IRF9GTF9FWFRfREVWVDsKQEAgLTM0ODAsOSArMzYxOSwzNSBAQAogCQlrb2JqZWN0X3VldmVudCgmbWRkZXYtPmtvYmosIEtPQkpfQUREKTsKIAkJbWRkZXYtPnN5c2ZzX3N0YXRlID0gc3lzZnNfZ2V0X2RpcmVudChtZGRldi0+a29iai5zZCwgImFycmF5X3N0YXRlIik7CiAJfQorCW1kZGV2X3B1dChtZGRldik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qga29iamVjdCAqbWRfcHJvYmUoZGV2X3QgZGV2LCBpbnQgKnBhcnQsIHZvaWQgKmRhdGEpCit7CisJbWRfYWxsb2MoZGV2LCBOVUxMKTsKIAlyZXR1cm4gTlVMTDsKIH0KIAorc3RhdGljIGludCBhZGRfbmFtZWRfYXJyYXkoY29uc3QgY2hhciAqdmFsLCBzdHJ1Y3Qga2VybmVsX3BhcmFtICprcCkKK3sKKwkvKiB2YWwgbXVzdCBiZSAibWRfKiIgd2hlcmUgKiBpcyBub3QgYWxsIGRpZ2l0cy4KKwkgKiBXZSBhbGxvY2F0ZSBhbiBhcnJheSB3aXRoIGEgbGFyZ2UgZnJlZSBtaW5vciBudW1iZXIsIGFuZAorCSAqIHNldCB0aGUgbmFtZSB0byB2YWwuICB2YWwgbXVzdCBub3QgYWxyZWFkeSBiZSBhbiBhY3RpdmUgbmFtZS4KKwkgKi8KKwlpbnQgbGVuID0gc3RybGVuKHZhbCk7CisJY2hhciBidWZbRElTS19OQU1FX0xFTl07CisKKwl3aGlsZSAobGVuICYmIHZhbFtsZW4tMV0gPT0gJ1xuJykKKwkJbGVuLS07CisJaWYgKGxlbiA+PSBESVNLX05BTUVfTEVOKQorCQlyZXR1cm4gLUUyQklHOworCXN0cmxjcHkoYnVmLCB2YWwsIGxlbisxKTsKKwlpZiAoc3RybmNtcChidWYsICJtZF8iLCAzKSAhPSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gbWRfYWxsb2MoMCwgYnVmKTsKK30KKwogc3RhdGljIHZvaWQgbWRfc2FmZW1vZGVfdGltZW91dCh1bnNpZ25lZCBsb25nIGRhdGEpCiB7CiAJbWRkZXZfdCAqbWRkZXYgPSAobWRkZXZfdCAqKSBkYXRhOwpAQCAtMzUwMSw3ICszNjY2LDYgQEAKIHsKIAlpbnQgZXJyOwogCWludCBjaHVua19zaXplOwotCXN0cnVjdCBsaXN0X2hlYWQgKnRtcDsKIAltZGtfcmRldl90ICpyZGV2OwogCXN0cnVjdCBnZW5kaXNrICpkaXNrOwogCXN0cnVjdCBtZGtfcGVyc29uYWxpdHkgKnBlcnM7CkBAIC0zNTQwLDcgKzM3MDQsNyBAQAogCQl9CiAKIAkJLyogZGV2aWNlcyBtdXN0IGhhdmUgbWluaW11bSBzaXplIG9mIG9uZSBjaHVuayAqLwotCQlyZGV2X2Zvcl9lYWNoKHJkZXYsIHRtcCwgbWRkZXYpIHsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShyZGV2LCAmbWRkZXYtPmRpc2tzLCBzYW1lX3NldCkgewogCQkJaWYgKHRlc3RfYml0KEZhdWx0eSwgJnJkZXYtPmZsYWdzKSkKIAkJCQljb250aW51ZTsKIAkJCWlmIChyZGV2LT5zaXplIDwgY2h1bmtfc2l6ZSAvIDEwMjQpIHsKQEAgLTM1NjUsNyArMzcyOSw3IEBACiAJICogdGhlIG9ubHkgdmFsaWQgZXh0ZXJuYWwgaW50ZXJmYWNlIGlzIHRocm91Z2ggdGhlIG1kCiAJICogZGV2aWNlLgogCSAqLwotCXJkZXZfZm9yX2VhY2gocmRldiwgdG1wLCBtZGRldikgeworCWxpc3RfZm9yX2VhY2hfZW50cnkocmRldiwgJm1kZGV2LT5kaXNrcywgc2FtZV9zZXQpIHsKIAkJaWYgKHRlc3RfYml0KEZhdWx0eSwgJnJkZXYtPmZsYWdzKSkKIAkJCWNvbnRpbnVlOwogCQlzeW5jX2Jsb2NrZGV2KHJkZXYtPmJkZXYpOwpAQCAtMzYzMCwxMCArMzc5NCwxMCBAQAogCQkgKi8KIAkJY2hhciBiW0JERVZOQU1FX1NJWkVdLCBiMltCREVWTkFNRV9TSVpFXTsKIAkJbWRrX3JkZXZfdCAqcmRldjI7Ci0JCXN0cnVjdCBsaXN0X2hlYWQgKnRtcDI7CiAJCWludCB3YXJuZWQgPSAwOwotCQlyZGV2X2Zvcl9lYWNoKHJkZXYsIHRtcCwgbWRkZXYpIHsKLQkJCXJkZXZfZm9yX2VhY2gocmRldjIsIHRtcDIsIG1kZGV2KSB7CisKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShyZGV2LCAmbWRkZXYtPmRpc2tzLCBzYW1lX3NldCkKKwkJCWxpc3RfZm9yX2VhY2hfZW50cnkocmRldjIsICZtZGRldi0+ZGlza3MsIHNhbWVfc2V0KSB7CiAJCQkJaWYgKHJkZXYgPCByZGV2MiAmJgogCQkJCSAgICByZGV2LT5iZGV2LT5iZF9jb250YWlucyA9PQogCQkJCSAgICByZGV2Mi0+YmRldi0+YmRfY29udGFpbnMpIHsKQEAgLTM2NDcsNyArMzgxMSw3IEBACiAJCQkJCXdhcm5lZCA9IDE7CiAJCQkJfQogCQkJfQotCQl9CisKIAkJaWYgKHdhcm5lZCkKIAkJCXByaW50ayhLRVJOX1dBUk5JTkcKIAkJCSAgICAgICAiVHJ1ZSBwcm90ZWN0aW9uIGFnYWluc3Qgc2luZ2xlLWRpc2siCkBAIC0zNjg0LDYgKzM4NDgsNyBAQAogCQkJcHJpbnRrKEtFUk5fV0FSTklORwogCQkJICAgICAgICJtZDogY2Fubm90IHJlZ2lzdGVyIGV4dHJhIGF0dHJpYnV0ZXMgZm9yICVzXG4iLAogCQkJICAgICAgIG1kbmFtZShtZGRldikpOworCQltZGRldi0+c3lzZnNfYWN0aW9uID0gc3lzZnNfZ2V0X2RpcmVudChtZGRldi0+a29iai5zZCwgInN5bmNfYWN0aW9uIik7CiAJfSBlbHNlIGlmIChtZGRldi0+cm8gPT0gMikgLyogYXV0by1yZWFkb25seSBub3QgbWVhbmluZ2Z1bCAqLwogCQltZGRldi0+cm8gPSAwOwogCkBAIC0zNjk0LDcgKzM4NTksNyBAQAogCW1kZGV2LT5zYWZlbW9kZV9kZWxheSA9ICgyMDAgKiBIWikvMTAwMCArMTsgLyogMjAwIG1zZWMgZGVsYXkgKi8KIAltZGRldi0+aW5fc3luYyA9IDE7CiAKLQlyZGV2X2Zvcl9lYWNoKHJkZXYsIHRtcCwgbWRkZXYpCisJbGlzdF9mb3JfZWFjaF9lbnRyeShyZGV2LCAmbWRkZXYtPmRpc2tzLCBzYW1lX3NldCkKIAkJaWYgKHJkZXYtPnJhaWRfZGlzayA+PSAwKSB7CiAJCQljaGFyIG5tWzIwXTsKIAkJCXNwcmludGYobm0sICJyZCVkIiwgcmRldi0+cmFpZF9kaXNrKTsKQEAgLTM3MjUsOSArMzg5MCw4IEBACiAJICogaXQgd2lsbCByZW1vdmUgdGhlIGRyaXZlcyBhbmQgbm90IGRvIHRoZSByaWdodCB0aGluZwogCSAqLwogCWlmIChtZGRldi0+ZGVncmFkZWQgJiYgIW1kZGV2LT5zeW5jX3RocmVhZCkgewotCQlzdHJ1Y3QgbGlzdF9oZWFkICpydG1wOwogCQlpbnQgc3BhcmVzID0gMDsKLQkJcmRldl9mb3JfZWFjaChyZGV2LCBydG1wLCBtZGRldikKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShyZGV2LCAmbWRkZXYtPmRpc2tzLCBzYW1lX3NldCkKIAkJCWlmIChyZGV2LT5yYWlkX2Rpc2sgPj0gMCAmJgogCQkJICAgICF0ZXN0X2JpdChJbl9zeW5jLCAmcmRldi0+ZmxhZ3MpICYmCiAJCQkgICAgIXRlc3RfYml0KEZhdWx0eSwgJnJkZXYtPmZsYWdzKSkKQEAgLTM3NTQsNyArMzkxOCw4IEBACiAJbWRkZXYtPmNoYW5nZWQgPSAxOwogCW1kX25ld19ldmVudChtZGRldik7CiAJc3lzZnNfbm90aWZ5X2RpcmVudChtZGRldi0+c3lzZnNfc3RhdGUpOwotCXN5c2ZzX25vdGlmeSgmbWRkZXYtPmtvYmosIE5VTEwsICJzeW5jX2FjdGlvbiIpOworCWlmIChtZGRldi0+c3lzZnNfYWN0aW9uKQorCQlzeXNmc19ub3RpZnlfZGlyZW50KG1kZGV2LT5zeXNmc19hY3Rpb24pOwogCXN5c2ZzX25vdGlmeSgmbWRkZXYtPmtvYmosIE5VTEwsICJkZWdyYWRlZCIpOwogCWtvYmplY3RfdWV2ZW50KCZkaXNrX3RvX2RldihtZGRldi0+Z2VuZGlzayktPmtvYmosIEtPQkpfQ0hBTkdFKTsKIAlyZXR1cm4gMDsKQEAgLTM4NTQsOSArNDAxOSwxMiBAQAogCQkJbWRkZXYtPnF1ZXVlLT5tZXJnZV9idmVjX2ZuID0gTlVMTDsKIAkJCW1kZGV2LT5xdWV1ZS0+dW5wbHVnX2ZuID0gTlVMTDsKIAkJCW1kZGV2LT5xdWV1ZS0+YmFja2luZ19kZXZfaW5mby5jb25nZXN0ZWRfZm4gPSBOVUxMOwotCQkJaWYgKG1kZGV2LT5wZXJzLT5zeW5jX3JlcXVlc3QpCisJCQlpZiAobWRkZXYtPnBlcnMtPnN5bmNfcmVxdWVzdCkgewogCQkJCXN5c2ZzX3JlbW92ZV9ncm91cCgmbWRkZXYtPmtvYmosICZtZF9yZWR1bmRhbmN5X2dyb3VwKTsKLQorCQkJCWlmIChtZGRldi0+c3lzZnNfYWN0aW9uKQorCQkJCQlzeXNmc19wdXQobWRkZXYtPnN5c2ZzX2FjdGlvbik7CisJCQkJbWRkZXYtPnN5c2ZzX2FjdGlvbiA9IE5VTEw7CisJCQl9CiAJCQltb2R1bGVfcHV0KG1kZGV2LT5wZXJzLT5vd25lcik7CiAJCQltZGRldi0+cGVycyA9IE5VTEw7CiAJCQkvKiB0ZWxsIHVzZXJzcGFjZSB0byBoYW5kbGUgJ2luYWN0aXZlJyAqLwpAQCAtMzg4Myw3ICs0MDUxLDYgQEAKIAkgKi8KIAlpZiAobW9kZSA9PSAwKSB7CiAJCW1ka19yZGV2X3QgKnJkZXY7Ci0JCXN0cnVjdCBsaXN0X2hlYWQgKnRtcDsKIAogCQlwcmludGsoS0VSTl9JTkZPICJtZDogJXMgc3RvcHBlZC5cbiIsIG1kbmFtZShtZGRldikpOwogCkBAIC0zODk1LDcgKzQwNjIsNyBAQAogCQl9CiAJCW1kZGV2LT5iaXRtYXBfb2Zmc2V0ID0gMDsKIAotCQlyZGV2X2Zvcl9lYWNoKHJkZXYsIHRtcCwgbWRkZXYpCisJCWxpc3RfZm9yX2VhY2hfZW50cnkocmRldiwgJm1kZGV2LT5kaXNrcywgc2FtZV9zZXQpCiAJCQlpZiAocmRldi0+cmFpZF9kaXNrID49IDApIHsKIAkJCQljaGFyIG5tWzIwXTsKIAkJCQlzcHJpbnRmKG5tLCAicmQlZCIsIHJkZXYtPnJhaWRfZGlzayk7CkBAIC0zOTQxLDYgKzQxMDgsOCBAQAogCQltZGRldi0+YmFycmllcnNfd29yayA9IDA7CiAJCW1kZGV2LT5zYWZlbW9kZSA9IDA7CiAJCWtvYmplY3RfdWV2ZW50KCZkaXNrX3RvX2RldihtZGRldi0+Z2VuZGlzayktPmtvYmosIEtPQkpfQ0hBTkdFKTsKKwkJaWYgKG1kZGV2LT5ob2xkX2FjdGl2ZSA9PSBVTlRJTF9TVE9QKQorCQkJbWRkZXYtPmhvbGRfYWN0aXZlID0gMDsKIAogCX0gZWxzZSBpZiAobWRkZXYtPnBlcnMpCiAJCXByaW50ayhLRVJOX0lORk8gIm1kOiAlcyBzd2l0Y2hlZCB0byByZWFkLW9ubHkgbW9kZS5cbiIsCkBAIC0zOTU2LDcgKzQxMjUsNiBAQAogc3RhdGljIHZvaWQgYXV0b3J1bl9hcnJheShtZGRldl90ICptZGRldikKIHsKIAltZGtfcmRldl90ICpyZGV2OwotCXN0cnVjdCBsaXN0X2hlYWQgKnRtcDsKIAlpbnQgZXJyOwogCiAJaWYgKGxpc3RfZW1wdHkoJm1kZGV2LT5kaXNrcykpCkBAIC0zOTY0LDcgKzQxMzIsNyBAQAogCiAJcHJpbnRrKEtFUk5fSU5GTyAibWQ6IHJ1bm5pbmc6ICIpOwogCi0JcmRldl9mb3JfZWFjaChyZGV2LCB0bXAsIG1kZGV2KSB7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShyZGV2LCAmbWRkZXYtPmRpc2tzLCBzYW1lX3NldCkgewogCQljaGFyIGJbQkRFVk5BTUVfU0laRV07CiAJCXByaW50aygiPCVzPiIsIGJkZXZuYW1lKHJkZXYtPmJkZXYsYikpOwogCX0KQEAgLTM5OTEsOCArNDE1OSw3IEBACiAgKi8KIHN0YXRpYyB2b2lkIGF1dG9ydW5fZGV2aWNlcyhpbnQgcGFydCkKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICp0bXA7Ci0JbWRrX3JkZXZfdCAqcmRldjAsICpyZGV2OworCW1ka19yZGV2X3QgKnJkZXYwLCAqcmRldiwgKnRtcDsKIAltZGRldl90ICptZGRldjsKIAljaGFyIGJbQkRFVk5BTUVfU0laRV07CiAKQEAgLTQwMDcsNyArNDE3NCw3IEBACiAJCXByaW50ayhLRVJOX0lORk8gIm1kOiBjb25zaWRlcmluZyAlcyAuLi5cbiIsCiAJCQliZGV2bmFtZShyZGV2MC0+YmRldixiKSk7CiAJCUlOSVRfTElTVF9IRUFEKCZjYW5kaWRhdGVzKTsKLQkJcmRldl9mb3JfZWFjaF9saXN0KHJkZXYsIHRtcCwgcGVuZGluZ19yYWlkX2Rpc2tzKQorCQlyZGV2X2Zvcl9lYWNoX2xpc3QocmRldiwgdG1wLCAmcGVuZGluZ19yYWlkX2Rpc2tzKQogCQkJaWYgKHN1cGVyXzkwX2xvYWQocmRldiwgcmRldjAsIDApID49IDApIHsKIAkJCQlwcmludGsoS0VSTl9JTkZPICJtZDogIGFkZGluZyAlcyAuLi5cbiIsCiAJCQkJCWJkZXZuYW1lKHJkZXYtPmJkZXYsYikpOwpAQCAtNDA1Myw3ICs0MjIwLDcgQEAKIAkJfSBlbHNlIHsKIAkJCXByaW50ayhLRVJOX0lORk8gIm1kOiBjcmVhdGVkICVzXG4iLCBtZG5hbWUobWRkZXYpKTsKIAkJCW1kZGV2LT5wZXJzaXN0ZW50ID0gMTsKLQkJCXJkZXZfZm9yX2VhY2hfbGlzdChyZGV2LCB0bXAsIGNhbmRpZGF0ZXMpIHsKKwkJCXJkZXZfZm9yX2VhY2hfbGlzdChyZGV2LCB0bXAsICZjYW5kaWRhdGVzKSB7CiAJCQkJbGlzdF9kZWxfaW5pdCgmcmRldi0+c2FtZV9zZXQpOwogCQkJCWlmIChiaW5kX3JkZXZfdG9fYXJyYXkocmRldiwgbWRkZXYpKQogCQkJCQlleHBvcnRfcmRldihyZGV2KTsKQEAgLTQwNjQsNyArNDIzMSw3IEBACiAJCS8qIG9uIHN1Y2Nlc3MsIGNhbmRpZGF0ZXMgd2lsbCBiZSBlbXB0eSwgb24gZXJyb3IKIAkJICogaXQgd29uJ3QuLi4KIAkJICovCi0JCXJkZXZfZm9yX2VhY2hfbGlzdChyZGV2LCB0bXAsIGNhbmRpZGF0ZXMpIHsKKwkJcmRldl9mb3JfZWFjaF9saXN0KHJkZXYsIHRtcCwgJmNhbmRpZGF0ZXMpIHsKIAkJCWxpc3RfZGVsX2luaXQoJnJkZXYtPnNhbWVfc2V0KTsKIAkJCWV4cG9ydF9yZGV2KHJkZXYpOwogCQl9CkBAIC00MDkzLDEwICs0MjYwLDkgQEAKIAltZHVfYXJyYXlfaW5mb190IGluZm87CiAJaW50IG5yLHdvcmtpbmcsYWN0aXZlLGZhaWxlZCxzcGFyZTsKIAltZGtfcmRldl90ICpyZGV2OwotCXN0cnVjdCBsaXN0X2hlYWQgKnRtcDsKIAogCW5yPXdvcmtpbmc9YWN0aXZlPWZhaWxlZD1zcGFyZT0wOwotCXJkZXZfZm9yX2VhY2gocmRldiwgdG1wLCBtZGRldikgeworCWxpc3RfZm9yX2VhY2hfZW50cnkocmRldiwgJm1kZGV2LT5kaXNrcywgc2FtZV9zZXQpIHsKIAkJbnIrKzsKIAkJaWYgKHRlc3RfYml0KEZhdWx0eSwgJnJkZXYtPmZsYWdzKSkKIAkJCWZhaWxlZCsrOwpAQCAtNDYxNCw5ICs0NzgwLDggQEAKIAogc3RhdGljIGludCB1cGRhdGVfc2l6ZShtZGRldl90ICptZGRldiwgc2VjdG9yX3QgbnVtX3NlY3RvcnMpCiB7Ci0JbWRrX3JkZXZfdCAqIHJkZXY7CisJbWRrX3JkZXZfdCAqcmRldjsKIAlpbnQgcnY7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqdG1wOwogCWludCBmaXQgPSAobnVtX3NlY3RvcnMgPT0gMCk7CiAKIAlpZiAobWRkZXYtPnBlcnMtPnJlc2l6ZSA9PSBOVUxMKQpAQCAtNDYzOCw3ICs0ODAzLDcgQEAKIAkJICogZ3JvdywgYW5kIHJlLWFkZC4KIAkJICovCiAJCXJldHVybiAtRUJVU1k7Ci0JcmRldl9mb3JfZWFjaChyZGV2LCB0bXAsIG1kZGV2KSB7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShyZGV2LCAmbWRkZXYtPmRpc2tzLCBzYW1lX3NldCkgewogCQlzZWN0b3JfdCBhdmFpbDsKIAkJYXZhaWwgPSByZGV2LT5zaXplICogMjsKIApAQCAtNTAwMCw2ICs1MTY1LDkgQEAKIAogZG9uZV91bmxvY2s6CiBhYm9ydF91bmxvY2s6CisJaWYgKG1kZGV2LT5ob2xkX2FjdGl2ZSA9PSBVTlRJTF9JT0NUTCAmJgorCSAgICBlcnIgIT0gLUVJTlZBTCkKKwkJbWRkZXYtPmhvbGRfYWN0aXZlID0gMDsKIAltZGRldl91bmxvY2sobWRkZXYpOwogCiAJcmV0dXJuIGVycjsKQEAgLTUwMTYsMTQgKzUxODQsMjUgQEAKIAkgKiBTdWNjZWVkIGlmIHdlIGNhbiBsb2NrIHRoZSBtZGRldiwgd2hpY2ggY29uZmlybXMgdGhhdAogCSAqIGl0IGlzbid0IGJlaW5nIHN0b3BwZWQgcmlnaHQgbm93LgogCSAqLwotCW1kZGV2X3QgKm1kZGV2ID0gYmRldi0+YmRfZGlzay0+cHJpdmF0ZV9kYXRhOworCW1kZGV2X3QgKm1kZGV2ID0gbWRkZXZfZmluZChiZGV2LT5iZF9kZXYpOwogCWludCBlcnI7CiAKKwlpZiAobWRkZXYtPmdlbmRpc2sgIT0gYmRldi0+YmRfZGlzaykgeworCQkvKiB3ZSBhcmUgcmFjaW5nIHdpdGggbWRkZXZfcHV0IHdoaWNoIGlzIGRpc2NhcmRpbmcgdGhpcworCQkgKiBiZF9kaXNrLgorCQkgKi8KKwkJbWRkZXZfcHV0KG1kZGV2KTsKKwkJLyogV2FpdCB1bnRpbCBiZGV2LT5iZF9kaXNrIGlzIGRlZmluaXRlbHkgZ29uZSAqLworCQlmbHVzaF9zY2hlZHVsZWRfd29yaygpOworCQkvKiBUaGVuIHJldHJ5IHRoZSBvcGVuIGZyb20gdGhlIHRvcCAqLworCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCX0KKwlCVUdfT04obWRkZXYgIT0gYmRldi0+YmRfZGlzay0+cHJpdmF0ZV9kYXRhKTsKKwogCWlmICgoZXJyID0gbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlX25lc3RlZCgmbWRkZXYtPnJlY29uZmlnX211dGV4LCAxKSkpCiAJCWdvdG8gb3V0OwogCiAJZXJyID0gMDsKLQltZGRldl9nZXQobWRkZXYpOwogCWF0b21pY19pbmMoJm1kZGV2LT5vcGVuZXJzKTsKIAltZGRldl91bmxvY2sobWRkZXYpOwogCkBAIC01MTg3LDExICs1MzY2LDEwIEBACiB7CiAJaW50IGkgPSAwOwogCW1ka19yZGV2X3QgKnJkZXY7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqdG1wOwogCiAJc2VxX3ByaW50ZihzZXEsICJ1bnVzZWQgZGV2aWNlczogIik7CiAKLQlyZGV2X2Zvcl9lYWNoX2xpc3QocmRldiwgdG1wLCBwZW5kaW5nX3JhaWRfZGlza3MpIHsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJkZXYsICZwZW5kaW5nX3JhaWRfZGlza3MsIHNhbWVfc2V0KSB7CiAJCWNoYXIgYltCREVWTkFNRV9TSVpFXTsKIAkJaSsrOwogCQlzZXFfcHJpbnRmKHNlcSwgIiVzICIsCkBAIC01MzUwLDcgKzU1MjgsNiBAQAogewogCW1kZGV2X3QgKm1kZGV2ID0gdjsKIAlzZWN0b3JfdCBzaXplOwotCXN0cnVjdCBsaXN0X2hlYWQgKnRtcDI7CiAJbWRrX3JkZXZfdCAqcmRldjsKIAlzdHJ1Y3QgbWRzdGF0X2luZm8gKm1pID0gc2VxLT5wcml2YXRlOwogCXN0cnVjdCBiaXRtYXAgKmJpdG1hcDsKQEAgLTUzODcsNyArNTU2NCw3IEBACiAJCX0KIAogCQlzaXplID0gMDsKLQkJcmRldl9mb3JfZWFjaChyZGV2LCB0bXAyLCBtZGRldikgeworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJkZXYsICZtZGRldi0+ZGlza3MsIHNhbWVfc2V0KSB7CiAJCQljaGFyIGJbQkRFVk5BTUVfU0laRV07CiAJCQlzZXFfcHJpbnRmKHNlcSwgIiAlc1slZF0iLAogCQkJCWJkZXZuYW1lKHJkZXYtPmJkZXYsYiksIHJkZXYtPmRlc2NfbnIpOwpAQCAtNTY5NCw3ICs1ODcxLDYgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkICp0bXA7CiAJc2VjdG9yX3QgbGFzdF9jaGVjazsKIAlpbnQgc2tpcHBlZCA9IDA7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcnRtcDsKIAltZGtfcmRldl90ICpyZGV2OwogCWNoYXIgKmRlc2M7CiAKQEAgLTU3OTksNyArNTk3NSw3IEBACiAJCS8qIHJlY292ZXJ5IGZvbGxvd3MgdGhlIHBoeXNpY2FsIHNpemUgb2YgZGV2aWNlcyAqLwogCQltYXhfc2VjdG9ycyA9IG1kZGV2LT5zaXplIDw8IDE7CiAJCWogPSBNYXhTZWN0b3I7Ci0JCXJkZXZfZm9yX2VhY2gocmRldiwgcnRtcCwgbWRkZXYpCisJCWxpc3RfZm9yX2VhY2hfZW50cnkocmRldiwgJm1kZGV2LT5kaXNrcywgc2FtZV9zZXQpCiAJCQlpZiAocmRldi0+cmFpZF9kaXNrID49IDAgJiYKIAkJCSAgICAhdGVzdF9iaXQoRmF1bHR5LCAmcmRldi0+ZmxhZ3MpICYmCiAJCQkgICAgIXRlc3RfYml0KEluX3N5bmMsICZyZGV2LT5mbGFncykgJiYKQEAgLTU5NDksNyArNjEyNSw3IEBACiAJCX0gZWxzZSB7CiAJCQlpZiAoIXRlc3RfYml0KE1EX1JFQ09WRVJZX0lOVFIsICZtZGRldi0+cmVjb3ZlcnkpKQogCQkJCW1kZGV2LT5jdXJyX3Jlc3luYyA9IE1heFNlY3RvcjsKLQkJCXJkZXZfZm9yX2VhY2gocmRldiwgcnRtcCwgbWRkZXYpCisJCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJkZXYsICZtZGRldi0+ZGlza3MsIHNhbWVfc2V0KQogCQkJCWlmIChyZGV2LT5yYWlkX2Rpc2sgPj0gMCAmJgogCQkJCSAgICAhdGVzdF9iaXQoRmF1bHR5LCAmcmRldi0+ZmxhZ3MpICYmCiAJCQkJICAgICF0ZXN0X2JpdChJbl9zeW5jLCAmcmRldi0+ZmxhZ3MpICYmCkBAIC01OTg1LDEwICs2MTYxLDkgQEAKIHN0YXRpYyBpbnQgcmVtb3ZlX2FuZF9hZGRfc3BhcmVzKG1kZGV2X3QgKm1kZGV2KQogewogCW1ka19yZGV2X3QgKnJkZXY7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcnRtcDsKIAlpbnQgc3BhcmVzID0gMDsKIAotCXJkZXZfZm9yX2VhY2gocmRldiwgcnRtcCwgbWRkZXYpCisJbGlzdF9mb3JfZWFjaF9lbnRyeShyZGV2LCAmbWRkZXYtPmRpc2tzLCBzYW1lX3NldCkKIAkJaWYgKHJkZXYtPnJhaWRfZGlzayA+PSAwICYmCiAJCSAgICAhdGVzdF9iaXQoQmxvY2tlZCwgJnJkZXYtPmZsYWdzKSAmJgogCQkgICAgKHRlc3RfYml0KEZhdWx0eSwgJnJkZXYtPmZsYWdzKSB8fApAQCAtNjAwMyw4ICs2MTc4LDggQEAKIAkJCX0KIAkJfQogCi0JaWYgKG1kZGV2LT5kZWdyYWRlZCAmJiAhIG1kZGV2LT5ybykgewotCQlyZGV2X2Zvcl9lYWNoKHJkZXYsIHJ0bXAsIG1kZGV2KSB7CisJaWYgKG1kZGV2LT5kZWdyYWRlZCAmJiAhIG1kZGV2LT5ybyAmJiAhbWRkZXYtPnJlY292ZXJ5X2Rpc2FibGVkKSB7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkocmRldiwgJm1kZGV2LT5kaXNrcywgc2FtZV9zZXQpIHsKIAkJCWlmIChyZGV2LT5yYWlkX2Rpc2sgPj0gMCAmJgogCQkJICAgICF0ZXN0X2JpdChJbl9zeW5jLCAmcmRldi0+ZmxhZ3MpICYmCiAJCQkgICAgIXRlc3RfYml0KEJsb2NrZWQsICZyZGV2LT5mbGFncykpCkBAIC02MDU2LDcgKzYyMzEsNiBAQAogdm9pZCBtZF9jaGVja19yZWNvdmVyeShtZGRldl90ICptZGRldikKIHsKIAltZGtfcmRldl90ICpyZGV2OwotCXN0cnVjdCBsaXN0X2hlYWQgKnJ0bXA7CiAKIAogCWlmIChtZGRldi0+Yml0bWFwKQpAQCAtNjEyMCw3ICs2Mjk0LDcgQEAKIAkJaWYgKG1kZGV2LT5mbGFncykKIAkJCW1kX3VwZGF0ZV9zYihtZGRldiwgMCk7CiAKLQkJcmRldl9mb3JfZWFjaChyZGV2LCBydG1wLCBtZGRldikKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShyZGV2LCAmbWRkZXYtPmRpc2tzLCBzYW1lX3NldCkKIAkJCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoU3RhdGVDaGFuZ2VkLCAmcmRldi0+ZmxhZ3MpKQogCQkJCXN5c2ZzX25vdGlmeV9kaXJlbnQocmRldi0+c3lzZnNfc3RhdGUpOwogCkBAIC02MTQ5LDEzICs2MzIzLDEzIEBACiAJCQkgKiBpbmZvcm1hdGlvbiBtdXN0IGJlIHNjcmFwcGVkCiAJCQkgKi8KIAkJCWlmICghbWRkZXYtPmRlZ3JhZGVkKQotCQkJCXJkZXZfZm9yX2VhY2gocmRldiwgcnRtcCwgbWRkZXYpCisJCQkJbGlzdF9mb3JfZWFjaF9lbnRyeShyZGV2LCAmbWRkZXYtPmRpc2tzLCBzYW1lX3NldCkKIAkJCQkJcmRldi0+c2F2ZWRfcmFpZF9kaXNrID0gLTE7CiAKIAkJCW1kZGV2LT5yZWNvdmVyeSA9IDA7CiAJCQkvKiBmbGFnIHJlY292ZXJ5IG5lZWRlZCBqdXN0IHRvIGRvdWJsZSBjaGVjayAqLwogCQkJc2V0X2JpdChNRF9SRUNPVkVSWV9ORUVERUQsICZtZGRldi0+cmVjb3ZlcnkpOwotCQkJc3lzZnNfbm90aWZ5KCZtZGRldi0+a29iaiwgTlVMTCwgInN5bmNfYWN0aW9uIik7CisJCQlzeXNmc19ub3RpZnlfZGlyZW50KG1kZGV2LT5zeXNmc19hY3Rpb24pOwogCQkJbWRfbmV3X2V2ZW50KG1kZGV2KTsKIAkJCWdvdG8gdW5sb2NrOwogCQl9CkBAIC02MjE2LDcgKzYzOTAsNyBAQAogCQkJCW1kZGV2LT5yZWNvdmVyeSA9IDA7CiAJCQl9IGVsc2UKIAkJCQltZF93YWtldXBfdGhyZWFkKG1kZGV2LT5zeW5jX3RocmVhZCk7Ci0JCQlzeXNmc19ub3RpZnkoJm1kZGV2LT5rb2JqLCBOVUxMLCAic3luY19hY3Rpb24iKTsKKwkJCXN5c2ZzX25vdGlmeV9kaXJlbnQobWRkZXYtPnN5c2ZzX2FjdGlvbik7CiAJCQltZF9uZXdfZXZlbnQobWRkZXYpOwogCQl9CiAJdW5sb2NrOgpAQCAtNjIyNCw3ICs2Mzk4LDggQEAKIAkJCWNsZWFyX2JpdChNRF9SRUNPVkVSWV9SVU5OSU5HLCAmbWRkZXYtPnJlY292ZXJ5KTsKIAkJCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoTURfUkVDT1ZFUllfUkVDT1ZFUiwKIAkJCQkJICAgICAgICZtZGRldi0+cmVjb3ZlcnkpKQotCQkJCXN5c2ZzX25vdGlmeSgmbWRkZXYtPmtvYmosIE5VTEwsICJzeW5jX2FjdGlvbiIpOworCQkJCWlmIChtZGRldi0+c3lzZnNfYWN0aW9uKQorCQkJCQlzeXNmc19ub3RpZnlfZGlyZW50KG1kZGV2LT5zeXNmc19hY3Rpb24pOwogCQl9CiAJCW1kZGV2X3VubG9jayhtZGRldik7CiAJfQpAQCAtNjM4NiwxNCArNjU2MSw4IEBACiAJdW5yZWdpc3Rlcl9zeXNjdGxfdGFibGUocmFpZF90YWJsZV9oZWFkZXIpOwogCXJlbW92ZV9wcm9jX2VudHJ5KCJtZHN0YXQiLCBOVUxMKTsKIAlmb3JfZWFjaF9tZGRldihtZGRldiwgdG1wKSB7Ci0JCXN0cnVjdCBnZW5kaXNrICpkaXNrID0gbWRkZXYtPmdlbmRpc2s7Ci0JCWlmICghZGlzaykKLQkJCWNvbnRpbnVlOwogCQlleHBvcnRfYXJyYXkobWRkZXYpOwotCQlkZWxfZ2VuZGlzayhkaXNrKTsKLQkJcHV0X2Rpc2soZGlzayk7Ci0JCW1kZGV2LT5nZW5kaXNrID0gTlVMTDsKLQkJbWRkZXZfcHV0KG1kZGV2KTsKKwkJbWRkZXYtPmhvbGRfYWN0aXZlID0gMDsKIAl9CiB9CiAKQEAgLTY0MTgsNiArNjU4Nyw3IEBACiBtb2R1bGVfcGFyYW1fY2FsbChzdGFydF9ybywgc2V0X3JvLCBnZXRfcm8sIE5VTEwsIFNfSVJVU1J8U19JV1VTUik7CiBtb2R1bGVfcGFyYW0oc3RhcnRfZGlydHlfZGVncmFkZWQsIGludCwgU19JUlVHT3xTX0lXVVNSKTsKIAorbW9kdWxlX3BhcmFtX2NhbGwobmV3X2FycmF5LCBhZGRfbmFtZWRfYXJyYXksIE5VTEwsIE5VTEwsIFNfSVdVU1IpOwogCiBFWFBPUlRfU1lNQk9MKHJlZ2lzdGVyX21kX3BlcnNvbmFsaXR5KTsKIEVYUE9SVF9TWU1CT0wodW5yZWdpc3Rlcl9tZF9wZXJzb25hbGl0eSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL211bHRpcGF0aC5jIGIvZHJpdmVycy9tZC9tdWx0aXBhdGguYwppbmRleCBkNGFjNDdkLi5mNmQwOGYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL211bHRpcGF0aC5jCisrKyBiL2RyaXZlcnMvbWQvbXVsdGlwYXRoLmMKQEAgLTQwOCw3ICs0MDgsNiBAQAogCWludCBkaXNrX2lkeDsKIAlzdHJ1Y3QgbXVsdGlwYXRoX2luZm8gKmRpc2s7CiAJbWRrX3JkZXZfdCAqcmRldjsKLQlzdHJ1Y3QgbGlzdF9oZWFkICp0bXA7CiAKIAlpZiAobWRkZXYtPmxldmVsICE9IExFVkVMX01VTFRJUEFUSCkgewogCQlwcmludGsoIm11bHRpcGF0aDogJXM6IHJhaWQgbGV2ZWwgbm90IHNldCB0byBtdWx0aXBhdGggSU8gKCVkKVxuIiwKQEAgLTQ0MSw3ICs0NDAsNyBAQAogCX0KIAogCWNvbmYtPndvcmtpbmdfZGlza3MgPSAwOwotCXJkZXZfZm9yX2VhY2gocmRldiwgdG1wLCBtZGRldikgeworCWxpc3RfZm9yX2VhY2hfZW50cnkocmRldiwgJm1kZGV2LT5kaXNrcywgc2FtZV9zZXQpIHsKIAkJZGlza19pZHggPSByZGV2LT5yYWlkX2Rpc2s7CiAJCWlmIChkaXNrX2lkeCA8IDAgfHwKIAkJICAgIGRpc2tfaWR4ID49IG1kZGV2LT5yYWlkX2Rpc2tzKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9yYWlkMC5jIGIvZHJpdmVycy9tZC9yYWlkMC5jCmluZGV4IDhhYzY0ODguLmM2MDViYTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvcmFpZDAuYworKysgYi9kcml2ZXJzL21kL3JhaWQwLmMKQEAgLTUzLDExICs1MywxMCBAQAogc3RhdGljIGludCBjcmVhdGVfc3RyaXBfem9uZXMgKG1kZGV2X3QgKm1kZGV2KQogewogCWludCBpLCBjLCBqOwotCXNlY3Rvcl90IGN1cnJlbnRfb2Zmc2V0LCBjdXJyX3pvbmVfb2Zmc2V0OworCXNlY3Rvcl90IGN1cnJlbnRfc3RhcnQsIGN1cnJfem9uZV9zdGFydDsKIAlzZWN0b3JfdCBtaW5fc3BhY2luZzsKIAlyYWlkMF9jb25mX3QgKmNvbmYgPSBtZGRldl90b19jb25mKG1kZGV2KTsKIAltZGtfcmRldl90ICpzbWFsbGVzdCwgKnJkZXYxLCAqcmRldjIsICpyZGV2OwotCXN0cnVjdCBsaXN0X2hlYWQgKnRtcDEsICp0bXAyOwogCXN0cnVjdCBzdHJpcF96b25lICp6b25lOwogCWludCBjbnQ7CiAJY2hhciBiW0JERVZOQU1FX1NJWkVdOwpAQCAtNjcsMTkgKzY2LDE5IEBACiAJICovCiAJY29uZi0+bnJfc3RyaXBfem9uZXMgPSAwOwogIAotCXJkZXZfZm9yX2VhY2gocmRldjEsIHRtcDEsIG1kZGV2KSB7Ci0JCXByaW50aygicmFpZDA6IGxvb2tpbmcgYXQgJXNcbiIsCisJbGlzdF9mb3JfZWFjaF9lbnRyeShyZGV2MSwgJm1kZGV2LT5kaXNrcywgc2FtZV9zZXQpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAicmFpZDA6IGxvb2tpbmcgYXQgJXNcbiIsCiAJCQliZGV2bmFtZShyZGV2MS0+YmRldixiKSk7CiAJCWMgPSAwOwotCQlyZGV2X2Zvcl9lYWNoKHJkZXYyLCB0bXAyLCBtZGRldikgewotCQkJcHJpbnRrKCJyYWlkMDogICBjb21wYXJpbmcgJXMoJWxsdSkiLAorCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJkZXYyLCAmbWRkZXYtPmRpc2tzLCBzYW1lX3NldCkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAicmFpZDA6ICAgY29tcGFyaW5nICVzKCVsbHUpIiwKIAkJCSAgICAgICBiZGV2bmFtZShyZGV2MS0+YmRldixiKSwKIAkJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKXJkZXYxLT5zaXplKTsKLQkJCXByaW50aygiIHdpdGggJXMoJWxsdSlcbiIsCisJCQlwcmludGsoS0VSTl9JTkZPICIgd2l0aCAlcyglbGx1KVxuIiwKIAkJCSAgICAgICBiZGV2bmFtZShyZGV2Mi0+YmRldixiKSwKIAkJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKXJkZXYyLT5zaXplKTsKIAkJCWlmIChyZGV2MiA9PSByZGV2MSkgewotCQkJCXByaW50aygicmFpZDA6ICAgRU5EXG4iKTsKKwkJCQlwcmludGsoS0VSTl9JTkZPICJyYWlkMDogICBFTkRcbiIpOwogCQkJCWJyZWFrOwogCQkJfQogCQkJaWYgKHJkZXYyLT5zaXplID09IHJkZXYxLT5zaXplKQpAQCAtODgsMTkgKzg3LDIwIEBACiAJCQkJICogTm90IHVuaXF1ZSwgZG9uJ3QgY291bnQgaXQgYXMgYSBuZXcKIAkJCQkgKiBncm91cAogCQkJCSAqLwotCQkJCXByaW50aygicmFpZDA6ICAgRVFVQUxcbiIpOworCQkJCXByaW50ayhLRVJOX0lORk8gInJhaWQwOiAgIEVRVUFMXG4iKTsKIAkJCQljID0gMTsKIAkJCQlicmVhazsKIAkJCX0KLQkJCXByaW50aygicmFpZDA6ICAgTk9UIEVRVUFMXG4iKTsKKwkJCXByaW50ayhLRVJOX0lORk8gInJhaWQwOiAgIE5PVCBFUVVBTFxuIik7CiAJCX0KIAkJaWYgKCFjKSB7Ci0JCQlwcmludGsoInJhaWQwOiAgID09PiBVTklRVUVcbiIpOworCQkJcHJpbnRrKEtFUk5fSU5GTyAicmFpZDA6ICAgPT0+IFVOSVFVRVxuIik7CiAJCQljb25mLT5ucl9zdHJpcF96b25lcysrOwotCQkJcHJpbnRrKCJyYWlkMDogJWQgem9uZXNcbiIsIGNvbmYtPm5yX3N0cmlwX3pvbmVzKTsKKwkJCXByaW50ayhLRVJOX0lORk8gInJhaWQwOiAlZCB6b25lc1xuIiwKKwkJCQljb25mLT5ucl9zdHJpcF96b25lcyk7CiAJCX0KIAl9Ci0JcHJpbnRrKCJyYWlkMDogRklOQUwgJWQgem9uZXNcbiIsIGNvbmYtPm5yX3N0cmlwX3pvbmVzKTsKKwlwcmludGsoS0VSTl9JTkZPICJyYWlkMDogRklOQUwgJWQgem9uZXNcbiIsIGNvbmYtPm5yX3N0cmlwX3pvbmVzKTsKIAogCWNvbmYtPnN0cmlwX3pvbmUgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgc3RyaXBfem9uZSkqCiAJCQkJY29uZi0+bnJfc3RyaXBfem9uZXMsIEdGUF9LRVJORUwpOwpAQCAtMTE5LDE2ICsxMTksMTcgQEAKIAljbnQgPSAwOwogCXNtYWxsZXN0ID0gTlVMTDsKIAl6b25lLT5kZXYgPSBjb25mLT5kZXZsaXN0OwotCXJkZXZfZm9yX2VhY2gocmRldjEsIHRtcDEsIG1kZGV2KSB7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShyZGV2MSwgJm1kZGV2LT5kaXNrcywgc2FtZV9zZXQpIHsKIAkJaW50IGogPSByZGV2MS0+cmFpZF9kaXNrOwogCiAJCWlmIChqIDwgMCB8fCBqID49IG1kZGV2LT5yYWlkX2Rpc2tzKSB7Ci0JCQlwcmludGsoInJhaWQwOiBiYWQgZGlzayBudW1iZXIgJWQgLSBhYm9ydGluZyFcbiIsIGopOworCQkJcHJpbnRrKEtFUk5fRVJSICJyYWlkMDogYmFkIGRpc2sgbnVtYmVyICVkIC0gIgorCQkJCSJhYm9ydGluZyFcbiIsIGopOwogCQkJZ290byBhYm9ydDsKIAkJfQogCQlpZiAoem9uZS0+ZGV2W2pdKSB7Ci0JCQlwcmludGsoInJhaWQwOiBtdWx0aXBsZSBkZXZpY2VzIGZvciAlZCAtIGFib3J0aW5nIVxuIiwKLQkJCQlqKTsKKwkJCXByaW50ayhLRVJOX0VSUiAicmFpZDA6IG11bHRpcGxlIGRldmljZXMgZm9yICVkIC0gIgorCQkJCSJhYm9ydGluZyFcbiIsIGopOwogCQkJZ290byBhYm9ydDsKIAkJfQogCQl6b25lLT5kZXZbal0gPSByZGV2MTsKQEAgLTE0OSwxNiArMTUwLDE2IEBACiAJCWNudCsrOwogCX0KIAlpZiAoY250ICE9IG1kZGV2LT5yYWlkX2Rpc2tzKSB7Ci0JCXByaW50aygicmFpZDA6IHRvbyBmZXcgZGlza3MgKCVkIG9mICVkKSAtIGFib3J0aW5nIVxuIiwKLQkJCWNudCwgbWRkZXYtPnJhaWRfZGlza3MpOworCQlwcmludGsoS0VSTl9FUlIgInJhaWQwOiB0b28gZmV3IGRpc2tzICglZCBvZiAlZCkgLSAiCisJCQkiYWJvcnRpbmchXG4iLCBjbnQsIG1kZGV2LT5yYWlkX2Rpc2tzKTsKIAkJZ290byBhYm9ydDsKIAl9CiAJem9uZS0+bmJfZGV2ID0gY250OwotCXpvbmUtPnNpemUgPSBzbWFsbGVzdC0+c2l6ZSAqIGNudDsKLQl6b25lLT56b25lX29mZnNldCA9IDA7CisJem9uZS0+c2VjdG9ycyA9IHNtYWxsZXN0LT5zaXplICogY250ICogMjsKKwl6b25lLT56b25lX3N0YXJ0ID0gMDsKIAotCWN1cnJlbnRfb2Zmc2V0ID0gc21hbGxlc3QtPnNpemU7Ci0JY3Vycl96b25lX29mZnNldCA9IHpvbmUtPnNpemU7CisJY3VycmVudF9zdGFydCA9IHNtYWxsZXN0LT5zaXplICogMjsKKwljdXJyX3pvbmVfc3RhcnQgPSB6b25lLT5zZWN0b3JzOwogCiAJLyogbm93IGRvIHRoZSBvdGhlciB6b25lcyAqLwogCWZvciAoaSA9IDE7IGkgPCBjb25mLT5ucl9zdHJpcF96b25lczsgaSsrKQpAQCAtMTY2LDQwICsxNjcsNDEgQEAKIAkJem9uZSA9IGNvbmYtPnN0cmlwX3pvbmUgKyBpOwogCQl6b25lLT5kZXYgPSBjb25mLT5zdHJpcF96b25lW2ktMV0uZGV2ICsgbWRkZXYtPnJhaWRfZGlza3M7CiAKLQkJcHJpbnRrKCJyYWlkMDogem9uZSAlZFxuIiwgaSk7Ci0JCXpvbmUtPmRldl9vZmZzZXQgPSBjdXJyZW50X29mZnNldDsKKwkJcHJpbnRrKEtFUk5fSU5GTyAicmFpZDA6IHpvbmUgJWRcbiIsIGkpOworCQl6b25lLT5kZXZfc3RhcnQgPSBjdXJyZW50X3N0YXJ0OwogCQlzbWFsbGVzdCA9IE5VTEw7CiAJCWMgPSAwOwogCiAJCWZvciAoaj0wOyBqPGNudDsgaisrKSB7CiAJCQljaGFyIGJbQkRFVk5BTUVfU0laRV07CiAJCQlyZGV2ID0gY29uZi0+c3RyaXBfem9uZVswXS5kZXZbal07Ci0JCQlwcmludGsoInJhaWQwOiBjaGVja2luZyAlcyAuLi4iLCBiZGV2bmFtZShyZGV2LT5iZGV2LGIpKTsKLQkJCWlmIChyZGV2LT5zaXplID4gY3VycmVudF9vZmZzZXQpCi0JCQl7Ci0JCQkJcHJpbnRrKCIgY29udGFpbmVkIGFzIGRldmljZSAlZFxuIiwgYyk7CisJCQlwcmludGsoS0VSTl9JTkZPICJyYWlkMDogY2hlY2tpbmcgJXMgLi4uIiwKKwkJCQliZGV2bmFtZShyZGV2LT5iZGV2LCBiKSk7CisJCQlpZiAocmRldi0+c2l6ZSA+IGN1cnJlbnRfc3RhcnQgLyAyKSB7CisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiIGNvbnRhaW5lZCBhcyBkZXZpY2UgJWRcbiIsCisJCQkJCWMpOwogCQkJCXpvbmUtPmRldltjXSA9IHJkZXY7CiAJCQkJYysrOwogCQkJCWlmICghc21hbGxlc3QgfHwgKHJkZXYtPnNpemUgPHNtYWxsZXN0LT5zaXplKSkgewogCQkJCQlzbWFsbGVzdCA9IHJkZXY7Ci0JCQkJCXByaW50aygiICAoJWxsdSkgaXMgc21hbGxlc3QhLlxuIiwgCisJCQkJCXByaW50ayhLRVJOX0lORk8gIiAgKCVsbHUpIGlzIHNtYWxsZXN0IS5cbiIsCiAJCQkJCQkodW5zaWduZWQgbG9uZyBsb25nKXJkZXYtPnNpemUpOwogCQkJCX0KIAkJCX0gZWxzZQotCQkJCXByaW50aygiIG5vcGUuXG4iKTsKKwkJCQlwcmludGsoS0VSTl9JTkZPICIgbm9wZS5cbiIpOwogCQl9CiAKIAkJem9uZS0+bmJfZGV2ID0gYzsKLQkJem9uZS0+c2l6ZSA9IChzbWFsbGVzdC0+c2l6ZSAtIGN1cnJlbnRfb2Zmc2V0KSAqIGM7Ci0JCXByaW50aygicmFpZDA6IHpvbmUtPm5iX2RldjogJWQsIHNpemU6ICVsbHVcbiIsCi0JCQl6b25lLT5uYl9kZXYsICh1bnNpZ25lZCBsb25nIGxvbmcpem9uZS0+c2l6ZSk7CisJCXpvbmUtPnNlY3RvcnMgPSAoc21hbGxlc3QtPnNpemUgKiAyIC0gY3VycmVudF9zdGFydCkgKiBjOworCQlwcmludGsoS0VSTl9JTkZPICJyYWlkMDogem9uZS0+bmJfZGV2OiAlZCwgc2VjdG9yczogJWxsdVxuIiwKKwkJCXpvbmUtPm5iX2RldiwgKHVuc2lnbmVkIGxvbmcgbG9uZyl6b25lLT5zZWN0b3JzKTsKIAotCQl6b25lLT56b25lX29mZnNldCA9IGN1cnJfem9uZV9vZmZzZXQ7Ci0JCWN1cnJfem9uZV9vZmZzZXQgKz0gem9uZS0+c2l6ZTsKKwkJem9uZS0+em9uZV9zdGFydCA9IGN1cnJfem9uZV9zdGFydDsKKwkJY3Vycl96b25lX3N0YXJ0ICs9IHpvbmUtPnNlY3RvcnM7CiAKLQkJY3VycmVudF9vZmZzZXQgPSBzbWFsbGVzdC0+c2l6ZTsKLQkJcHJpbnRrKCJyYWlkMDogY3VycmVudCB6b25lIG9mZnNldDogJWxsdVxuIiwKLQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpY3VycmVudF9vZmZzZXQpOworCQljdXJyZW50X3N0YXJ0ID0gc21hbGxlc3QtPnNpemUgKiAyOworCQlwcmludGsoS0VSTl9JTkZPICJyYWlkMDogY3VycmVudCB6b25lIHN0YXJ0OiAlbGx1XG4iLAorCQkJKHVuc2lnbmVkIGxvbmcgbG9uZyljdXJyZW50X3N0YXJ0KTsKIAl9CiAKIAkvKiBOb3cgZmluZCBhcHByb3ByaWF0ZSBoYXNoIHNwYWNpbmcuCkBAIC0yMTAsMTYgKzIxMiwxNiBAQAogCSAqIHN0cmlwIHRob3VnaCBhcyBpdCdzIHNpemUgaGFzIG5vIGJlYXJpbmcgb24gdGhlIGVmZmljYWN5IG9mIHRoZSBoYXNoCiAJICogdGFibGUuCiAJICovCi0JY29uZi0+aGFzaF9zcGFjaW5nID0gY3Vycl96b25lX29mZnNldDsKLQltaW5fc3BhY2luZyA9IGN1cnJfem9uZV9vZmZzZXQ7CisJY29uZi0+c3BhY2luZyA9IGN1cnJfem9uZV9zdGFydDsKKwltaW5fc3BhY2luZyA9IGN1cnJfem9uZV9zdGFydDsKIAlzZWN0b3JfZGl2KG1pbl9zcGFjaW5nLCBQQUdFX1NJWkUvc2l6ZW9mKHN0cnVjdCBzdHJpcF96b25lKikpOwogCWZvciAoaT0wOyBpIDwgY29uZi0+bnJfc3RyaXBfem9uZXMtMTsgaSsrKSB7Ci0JCXNlY3Rvcl90IHN6ID0gMDsKLQkJZm9yIChqPWk7IGo8Y29uZi0+bnJfc3RyaXBfem9uZXMtMSAmJgotCQkJICAgICBzeiA8IG1pbl9zcGFjaW5nIDsgaisrKQotCQkJc3ogKz0gY29uZi0+c3RyaXBfem9uZVtqXS5zaXplOwotCQlpZiAoc3ogPj0gbWluX3NwYWNpbmcgJiYgc3ogPCBjb25mLT5oYXNoX3NwYWNpbmcpCi0JCQljb25mLT5oYXNoX3NwYWNpbmcgPSBzejsKKwkJc2VjdG9yX3QgcyA9IDA7CisJCWZvciAoaiA9IGk7IGogPCBjb25mLT5ucl9zdHJpcF96b25lcyAtIDEgJiYKKwkJCQlzIDwgbWluX3NwYWNpbmc7IGorKykKKwkJCXMgKz0gY29uZi0+c3RyaXBfem9uZVtqXS5zZWN0b3JzOworCQlpZiAocyA+PSBtaW5fc3BhY2luZyAmJiBzIDwgY29uZi0+c3BhY2luZykKKwkJCWNvbmYtPnNwYWNpbmcgPSBzOwogCX0KIAogCW1kZGV2LT5xdWV1ZS0+dW5wbHVnX2ZuID0gcmFpZDBfdW5wbHVnOwpAQCAtMjI3LDcgKzIyOSw3IEBACiAJbWRkZXYtPnF1ZXVlLT5iYWNraW5nX2Rldl9pbmZvLmNvbmdlc3RlZF9mbiA9IHJhaWQwX2Nvbmdlc3RlZDsKIAltZGRldi0+cXVldWUtPmJhY2tpbmdfZGV2X2luZm8uY29uZ2VzdGVkX2RhdGEgPSBtZGRldjsKIAotCXByaW50aygicmFpZDA6IGRvbmUuXG4iKTsKKwlwcmludGsoS0VSTl9JTkZPICJyYWlkMDogZG9uZS5cbiIpOwogCXJldHVybiAwOwogIGFib3J0OgogCXJldHVybiAxOwpAQCAtMjYyLDEwICsyNjQsOSBAQAogc3RhdGljIGludCByYWlkMF9ydW4gKG1kZGV2X3QgKm1kZGV2KQogewogCXVuc2lnbmVkICBjdXI9MCwgaT0wLCBuYl96b25lOwotCXM2NCBzaXplOworCXM2NCBzZWN0b3JzOwogCXJhaWQwX2NvbmZfdCAqY29uZjsKIAltZGtfcmRldl90ICpyZGV2OwotCXN0cnVjdCBsaXN0X2hlYWQgKnRtcDsKIAogCWlmIChtZGRldi0+Y2h1bmtfc2l6ZSA9PSAwKSB7CiAJCXByaW50ayhLRVJOX0VSUiAibWQvcmFpZDA6IG5vbi16ZXJvIGNodW5rIHNpemUgcmVxdWlyZWQuXG4iKTsKQEAgLTI5MSw1NCArMjkyLDU0IEBACiAKIAkvKiBjYWxjdWxhdGUgYXJyYXkgZGV2aWNlIHNpemUgKi8KIAltZGRldi0+YXJyYXlfc2VjdG9ycyA9IDA7Ci0JcmRldl9mb3JfZWFjaChyZGV2LCB0bXAsIG1kZGV2KQorCWxpc3RfZm9yX2VhY2hfZW50cnkocmRldiwgJm1kZGV2LT5kaXNrcywgc2FtZV9zZXQpCiAJCW1kZGV2LT5hcnJheV9zZWN0b3JzICs9IHJkZXYtPnNpemUgKiAyOwogCi0JcHJpbnRrKCJyYWlkMCA6IG1kX3NpemUgaXMgJWxsdSBibG9ja3MuXG4iLCAKLQkJKHVuc2lnbmVkIGxvbmcgbG9uZyltZGRldi0+YXJyYXlfc2VjdG9ycyAvIDIpOwotCXByaW50aygicmFpZDAgOiBjb25mLT5oYXNoX3NwYWNpbmcgaXMgJWxsdSBibG9ja3MuXG4iLAotCQkodW5zaWduZWQgbG9uZyBsb25nKWNvbmYtPmhhc2hfc3BhY2luZyk7CisJcHJpbnRrKEtFUk5fSU5GTyAicmFpZDAgOiBtZF9zaXplIGlzICVsbHUgc2VjdG9ycy5cbiIsCisJCSh1bnNpZ25lZCBsb25nIGxvbmcpbWRkZXYtPmFycmF5X3NlY3RvcnMpOworCXByaW50ayhLRVJOX0lORk8gInJhaWQwIDogY29uZi0+c3BhY2luZyBpcyAlbGx1IHNlY3RvcnMuXG4iLAorCQkodW5zaWduZWQgbG9uZyBsb25nKWNvbmYtPnNwYWNpbmcpOwogCXsKLQkJc2VjdG9yX3QgcyA9IG1kZGV2LT5hcnJheV9zZWN0b3JzIC8gMjsKLQkJc2VjdG9yX3Qgc3BhY2UgPSBjb25mLT5oYXNoX3NwYWNpbmc7CisJCXNlY3Rvcl90IHMgPSBtZGRldi0+YXJyYXlfc2VjdG9yczsKKwkJc2VjdG9yX3Qgc3BhY2UgPSBjb25mLT5zcGFjaW5nOwogCQlpbnQgcm91bmQ7Ci0JCWNvbmYtPnByZXNoaWZ0ID0gMDsKKwkJY29uZi0+c2VjdG9yX3NoaWZ0ID0gMDsKIAkJaWYgKHNpemVvZihzZWN0b3JfdCkgPiBzaXplb2YodTMyKSkgewogCQkJLypzaGlmdCBkb3duIHNwYWNlIGFuZCBzIHNvIHRoYXQgc2VjdG9yX2RpdiB3aWxsIHdvcmsgKi8KIAkJCXdoaWxlIChzcGFjZSA+IChzZWN0b3JfdCkgKH4odTMyKTApKSB7CiAJCQkJcyA+Pj0gMTsKIAkJCQlzcGFjZSA+Pj0gMTsKIAkJCQlzICs9IDE7IC8qIGZvcmNlIHJvdW5kLXVwICovCi0JCQkJY29uZi0+cHJlc2hpZnQrKzsKKwkJCQljb25mLT5zZWN0b3Jfc2hpZnQrKzsKIAkJCX0KIAkJfQogCQlyb3VuZCA9IHNlY3Rvcl9kaXYocywgKHUzMilzcGFjZSkgPyAxIDogMDsKIAkJbmJfem9uZSA9IHMgKyByb3VuZDsKIAl9Ci0JcHJpbnRrKCJyYWlkMCA6IG5iX3pvbmUgaXMgJWQuXG4iLCBuYl96b25lKTsKKwlwcmludGsoS0VSTl9JTkZPICJyYWlkMCA6IG5iX3pvbmUgaXMgJWQuXG4iLCBuYl96b25lKTsKIAotCXByaW50aygicmFpZDAgOiBBbGxvY2F0aW5nICVaZCBieXRlcyBmb3IgaGFzaC5cbiIsCisJcHJpbnRrKEtFUk5fSU5GTyAicmFpZDAgOiBBbGxvY2F0aW5nICV6dSBieXRlcyBmb3IgaGFzaC5cbiIsCiAJCQkJbmJfem9uZSpzaXplb2Yoc3RydWN0IHN0cmlwX3pvbmUqKSk7CiAJY29uZi0+aGFzaF90YWJsZSA9IGttYWxsb2MgKHNpemVvZiAoc3RydWN0IHN0cmlwX3pvbmUgKikqbmJfem9uZSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFjb25mLT5oYXNoX3RhYmxlKQogCQlnb3RvIG91dF9mcmVlX2NvbmY7Ci0Jc2l6ZSA9IGNvbmYtPnN0cmlwX3pvbmVbY3VyXS5zaXplOworCXNlY3RvcnMgPSBjb25mLT5zdHJpcF96b25lW2N1cl0uc2VjdG9yczsKIAogCWNvbmYtPmhhc2hfdGFibGVbMF0gPSBjb25mLT5zdHJpcF96b25lICsgY3VyOwogCWZvciAoaT0xOyBpPCBuYl96b25lOyBpKyspIHsKLQkJd2hpbGUgKHNpemUgPD0gY29uZi0+aGFzaF9zcGFjaW5nKSB7CisJCXdoaWxlIChzZWN0b3JzIDw9IGNvbmYtPnNwYWNpbmcpIHsKIAkJCWN1cisrOwotCQkJc2l6ZSArPSBjb25mLT5zdHJpcF96b25lW2N1cl0uc2l6ZTsKKwkJCXNlY3RvcnMgKz0gY29uZi0+c3RyaXBfem9uZVtjdXJdLnNlY3RvcnM7CiAJCX0KLQkJc2l6ZSAtPSBjb25mLT5oYXNoX3NwYWNpbmc7CisJCXNlY3RvcnMgLT0gY29uZi0+c3BhY2luZzsKIAkJY29uZi0+aGFzaF90YWJsZVtpXSA9IGNvbmYtPnN0cmlwX3pvbmUgKyBjdXI7CiAJfQotCWlmIChjb25mLT5wcmVzaGlmdCkgewotCQljb25mLT5oYXNoX3NwYWNpbmcgPj49IGNvbmYtPnByZXNoaWZ0OwotCQkvKiByb3VuZCBoYXNoX3NwYWNpbmcgdXAgc28gd2hlbiB3ZSBkaXZpZGUgYnkgaXQsIHdlCisJaWYgKGNvbmYtPnNlY3Rvcl9zaGlmdCkgeworCQljb25mLT5zcGFjaW5nID4+PSBjb25mLT5zZWN0b3Jfc2hpZnQ7CisJCS8qIHJvdW5kIHNwYWNpbmcgdXAgc28gd2hlbiB3ZSBkaXZpZGUgYnkgaXQsIHdlCiAJCSAqIGVyciBvbiB0aGUgc2lkZSBvZiB0b28tbG93LCB3aGljaCBpcyBzYWZlc3QKIAkJICovCi0JCWNvbmYtPmhhc2hfc3BhY2luZysrOworCQljb25mLT5zcGFjaW5nKys7CiAJfQogCiAJLyogY2FsY3VsYXRlIHRoZSBtYXggcmVhZC1haGVhZCBzaXplLgpAQCAtMzg3LDEyICszODgsMTIgQEAKIHN0YXRpYyBpbnQgcmFpZDBfbWFrZV9yZXF1ZXN0IChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IGJpbyAqYmlvKQogewogCW1kZGV2X3QgKm1kZGV2ID0gcS0+cXVldWVkYXRhOwotCXVuc2lnbmVkIGludCBzZWN0X2luX2NodW5rLCBjaHVua3NpemVfYml0cywgIGNodW5rX3NpemUsIGNodW5rX3NlY3RzOworCXVuc2lnbmVkIGludCBzZWN0X2luX2NodW5rLCBjaHVua3NlY3RfYml0cywgY2h1bmtfc2VjdHM7CiAJcmFpZDBfY29uZl90ICpjb25mID0gbWRkZXZfdG9fY29uZihtZGRldik7CiAJc3RydWN0IHN0cmlwX3pvbmUgKnpvbmU7CiAJbWRrX3JkZXZfdCAqdG1wX2RldjsKIAlzZWN0b3JfdCBjaHVuazsKLQlzZWN0b3JfdCBibG9jaywgcnNlY3Q7CisJc2VjdG9yX3Qgc2VjdG9yLCByc2VjdDsKIAljb25zdCBpbnQgcncgPSBiaW9fZGF0YV9kaXIoYmlvKTsKIAlpbnQgY3B1OwogCkBAIC00MDcsMTEgKzQwOCw5IEBACiAJCSAgICAgIGJpb19zZWN0b3JzKGJpbykpOwogCXBhcnRfc3RhdF91bmxvY2soKTsKIAotCWNodW5rX3NpemUgPSBtZGRldi0+Y2h1bmtfc2l6ZSA+PiAxMDsKIAljaHVua19zZWN0cyA9IG1kZGV2LT5jaHVua19zaXplID4+IDk7Ci0JY2h1bmtzaXplX2JpdHMgPSBmZnoofmNodW5rX3NpemUpOwotCWJsb2NrID0gYmlvLT5iaV9zZWN0b3IgPj4gMTsKLQkKKwljaHVua3NlY3RfYml0cyA9IGZmeih+Y2h1bmtfc2VjdHMpOworCXNlY3RvciA9IGJpby0+Ymlfc2VjdG9yOwogCiAJaWYgKHVubGlrZWx5KGNodW5rX3NlY3RzIDwgKGJpby0+Ymlfc2VjdG9yICYgKGNodW5rX3NlY3RzIC0gMSkpICsgKGJpby0+Ymlfc2l6ZSA+PiA5KSkpIHsKIAkJc3RydWN0IGJpb19wYWlyICpicDsKQEAgLTQzNCwyOCArNDMzLDI3IEBACiAgCiAKIAl7Ci0JCXNlY3Rvcl90IHggPSBibG9jayA+PiBjb25mLT5wcmVzaGlmdDsKLQkJc2VjdG9yX2Rpdih4LCAodTMyKWNvbmYtPmhhc2hfc3BhY2luZyk7CisJCXNlY3Rvcl90IHggPSBzZWN0b3IgPj4gY29uZi0+c2VjdG9yX3NoaWZ0OworCQlzZWN0b3JfZGl2KHgsICh1MzIpY29uZi0+c3BhY2luZyk7CiAJCXpvbmUgPSBjb25mLT5oYXNoX3RhYmxlW3hdOwogCX0KLSAKLQl3aGlsZSAoYmxvY2sgPj0gKHpvbmUtPnpvbmVfb2Zmc2V0ICsgem9uZS0+c2l6ZSkpIAorCisJd2hpbGUgKHNlY3RvciA+PSB6b25lLT56b25lX3N0YXJ0ICsgem9uZS0+c2VjdG9ycykKIAkJem9uZSsrOwotICAgIAotCXNlY3RfaW5fY2h1bmsgPSBiaW8tPmJpX3NlY3RvciAmICgoY2h1bmtfc2l6ZTw8MSkgLTEpOworCisJc2VjdF9pbl9jaHVuayA9IGJpby0+Ymlfc2VjdG9yICYgKGNodW5rX3NlY3RzIC0gMSk7CiAKIAogCXsKLQkJc2VjdG9yX3QgeCA9ICAoYmxvY2sgLSB6b25lLT56b25lX29mZnNldCkgPj4gY2h1bmtzaXplX2JpdHM7CisJCXNlY3Rvcl90IHggPSAoc2VjdG9yIC0gem9uZS0+em9uZV9zdGFydCkgPj4gY2h1bmtzZWN0X2JpdHM7CiAKIAkJc2VjdG9yX2Rpdih4LCB6b25lLT5uYl9kZXYpOwogCQljaHVuayA9IHg7CiAKLQkJeCA9IGJsb2NrID4+IGNodW5rc2l6ZV9iaXRzOworCQl4ID0gc2VjdG9yID4+IGNodW5rc2VjdF9iaXRzOwogCQl0bXBfZGV2ID0gem9uZS0+ZGV2W3NlY3Rvcl9kaXYoeCwgem9uZS0+bmJfZGV2KV07CiAJfQotCXJzZWN0ID0gKCgoY2h1bmsgPDwgY2h1bmtzaXplX2JpdHMpICsgem9uZS0+ZGV2X29mZnNldCk8PDEpCi0JCSsgc2VjdF9pbl9jaHVuazsKKwlyc2VjdCA9IChjaHVuayA8PCBjaHVua3NlY3RfYml0cykgKyB6b25lLT5kZXZfc3RhcnQgKyBzZWN0X2luX2NodW5rOwogIAogCWJpby0+YmlfYmRldiA9IHRtcF9kZXYtPmJkZXY7CiAJYmlvLT5iaV9zZWN0b3IgPSByc2VjdCArIHRtcF9kZXYtPmRhdGFfb2Zmc2V0OwpAQCAtNDY3LDcgKzQ2NSw3IEBACiAKIGJhZF9tYXA6CiAJcHJpbnRrKCJyYWlkMF9tYWtlX3JlcXVlc3QgYnVnOiBjYW4ndCBjb252ZXJ0IGJsb2NrIGFjcm9zcyBjaHVua3MiCi0JCSIgb3IgYmlnZ2VyIHRoYW4gJWRrICVsbHUgJWRcbiIsIGNodW5rX3NpemUsIAorCQkiIG9yIGJpZ2dlciB0aGFuICVkayAlbGx1ICVkXG4iLCBjaHVua19zZWN0cyAvIDIsCiAJCSh1bnNpZ25lZCBsb25nIGxvbmcpYmlvLT5iaV9zZWN0b3IsIGJpby0+Ymlfc2l6ZSA+PiAxMCk7CiAKIAliaW9faW9fZXJyb3IoYmlvKTsKQEAgLTQ5MiwxMCArNDkwLDEwIEBACiAJCQlzZXFfcHJpbnRmKHNlcSwgIiVzLyIsIGJkZXZuYW1lKAogCQkJCWNvbmYtPnN0cmlwX3pvbmVbal0uZGV2W2tdLT5iZGV2LGIpKTsKIAotCQlzZXFfcHJpbnRmKHNlcSwgIl0gem89JWQgZG89JWQgcz0lZFxuIiwKLQkJCQljb25mLT5zdHJpcF96b25lW2pdLnpvbmVfb2Zmc2V0LAotCQkJCWNvbmYtPnN0cmlwX3pvbmVbal0uZGV2X29mZnNldCwKLQkJCQljb25mLT5zdHJpcF96b25lW2pdLnNpemUpOworCQlzZXFfcHJpbnRmKHNlcSwgIl0genM9JWQgZHM9JWQgcz0lZFxuIiwKKwkJCQljb25mLT5zdHJpcF96b25lW2pdLnpvbmVfc3RhcnQsCisJCQkJY29uZi0+c3RyaXBfem9uZVtqXS5kZXZfc3RhcnQsCisJCQkJY29uZi0+c3RyaXBfem9uZVtqXS5zZWN0b3JzKTsKIAl9CiAjZW5kaWYKIAlzZXFfcHJpbnRmKHNlcSwgIiAlZGsgY2h1bmtzIiwgbWRkZXYtPmNodW5rX3NpemUvMTAyNCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL3JhaWQxLmMgYi9kcml2ZXJzL21kL3JhaWQxLmMKaW5kZXggOWM3ODhlMi4uN2I0ZjVmNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9yYWlkMS5jCisrKyBiL2RyaXZlcnMvbWQvcmFpZDEuYwpAQCAtMTAxNiwxMiArMTAxNiwxNiBAQAogCSAqIGVsc2UgbWFyayB0aGUgZHJpdmUgYXMgZmFpbGVkCiAJICovCiAJaWYgKHRlc3RfYml0KEluX3N5bmMsICZyZGV2LT5mbGFncykKLQkgICAgJiYgKGNvbmYtPnJhaWRfZGlza3MgLSBtZGRldi0+ZGVncmFkZWQpID09IDEpCisJICAgICYmIChjb25mLT5yYWlkX2Rpc2tzIC0gbWRkZXYtPmRlZ3JhZGVkKSA9PSAxKSB7CiAJCS8qCiAJCSAqIERvbid0IGZhaWwgdGhlIGRyaXZlLCBhY3QgYXMgdGhvdWdoIHdlIHdlcmUganVzdCBhCi0JCSAqIG5vcm1hbCBzaW5nbGUgZHJpdmUKKwkJICogbm9ybWFsIHNpbmdsZSBkcml2ZS4KKwkJICogSG93ZXZlciBkb24ndCB0cnkgYSByZWNvdmVyeSBmcm9tIHRoaXMgZHJpdmUgYXMKKwkJICogaXQgaXMgdmVyeSBsaWtlbHkgdG8gZmFpbC4KIAkJICovCisJCW1kZGV2LT5yZWNvdmVyeV9kaXNhYmxlZCA9IDE7CiAJCXJldHVybjsKKwl9CiAJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChJbl9zeW5jLCAmcmRldi0+ZmxhZ3MpKSB7CiAJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJCXNwaW5fbG9ja19pcnFzYXZlKCZjb25mLT5kZXZpY2VfbG9jaywgZmxhZ3MpOwpAQCAtMTkxOSw3ICsxOTIzLDYgQEAKIAlpbnQgaSwgaiwgZGlza19pZHg7CiAJbWlycm9yX2luZm9fdCAqZGlzazsKIAltZGtfcmRldl90ICpyZGV2OwotCXN0cnVjdCBsaXN0X2hlYWQgKnRtcDsKIAogCWlmIChtZGRldi0+bGV2ZWwgIT0gMSkgewogCQlwcmludGsoInJhaWQxOiAlczogcmFpZCBsZXZlbCBub3Qgc2V0IHRvIG1pcnJvcmluZyAoJWQpXG4iLApAQCAtMTk2NCw3ICsxOTY3LDcgQEAKIAlzcGluX2xvY2tfaW5pdCgmY29uZi0+ZGV2aWNlX2xvY2spOwogCW1kZGV2LT5xdWV1ZS0+cXVldWVfbG9jayA9ICZjb25mLT5kZXZpY2VfbG9jazsKIAotCXJkZXZfZm9yX2VhY2gocmRldiwgdG1wLCBtZGRldikgeworCWxpc3RfZm9yX2VhY2hfZW50cnkocmRldiwgJm1kZGV2LT5kaXNrcywgc2FtZV9zZXQpIHsKIAkJZGlza19pZHggPSByZGV2LT5yYWlkX2Rpc2s7CiAJCWlmIChkaXNrX2lkeCA+PSBtZGRldi0+cmFpZF9kaXNrcwogCQkgICAgfHwgZGlza19pZHggPCAwKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9yYWlkMTAuYyBiL2RyaXZlcnMvbWQvcmFpZDEwLmMKaW5kZXggOTcwYTk2ZS4uNjczNmQ2ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9yYWlkMTAuYworKysgYi9kcml2ZXJzL21kL3JhaWQxMC5jCkBAIC0yMDI1LDcgKzIwMjUsNiBAQAogCWludCBpLCBkaXNrX2lkeDsKIAltaXJyb3JfaW5mb190ICpkaXNrOwogCW1ka19yZGV2X3QgKnJkZXY7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqdG1wOwogCWludCBuYywgZmMsIGZvOwogCXNlY3Rvcl90IHN0cmlkZSwgc2l6ZTsKIApAQCAtMjEwOCw3ICsyMTA3LDcgQEAKIAlzcGluX2xvY2tfaW5pdCgmY29uZi0+ZGV2aWNlX2xvY2spOwogCW1kZGV2LT5xdWV1ZS0+cXVldWVfbG9jayA9ICZjb25mLT5kZXZpY2VfbG9jazsKIAotCXJkZXZfZm9yX2VhY2gocmRldiwgdG1wLCBtZGRldikgeworCWxpc3RfZm9yX2VhY2hfZW50cnkocmRldiwgJm1kZGV2LT5kaXNrcywgc2FtZV9zZXQpIHsKIAkJZGlza19pZHggPSByZGV2LT5yYWlkX2Rpc2s7CiAJCWlmIChkaXNrX2lkeCA+PSBtZGRldi0+cmFpZF9kaXNrcwogCQkgICAgfHwgZGlza19pZHggPCAwKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9yYWlkNS5jIGIvZHJpdmVycy9tZC9yYWlkNS5jCmluZGV4IGEzNmE3NDMuLmE1YmEwODAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvcmFpZDUuYworKysgYi9kcml2ZXJzL21kL3JhaWQ1LmMKQEAgLTM5OTgsNyArMzk5OCw2IEBACiAJaW50IHJhaWRfZGlzaywgbWVtb3J5OwogCW1ka19yZGV2X3QgKnJkZXY7CiAJc3RydWN0IGRpc2tfaW5mbyAqZGlzazsKLQlzdHJ1Y3QgbGlzdF9oZWFkICp0bXA7CiAJaW50IHdvcmtpbmdfZGlza3MgPSAwOwogCiAJaWYgKG1kZGV2LT5sZXZlbCAhPSA1ICYmIG1kZGV2LT5sZXZlbCAhPSA0ICYmIG1kZGV2LT5sZXZlbCAhPSA2KSB7CkBAIC00MTA4LDcgKzQxMDcsNyBAQAogCiAJcHJfZGVidWcoInJhaWQ1OiBydW4oJXMpIGNhbGxlZC5cbiIsIG1kbmFtZShtZGRldikpOwogCi0JcmRldl9mb3JfZWFjaChyZGV2LCB0bXAsIG1kZGV2KSB7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShyZGV2LCAmbWRkZXYtPmRpc2tzLCBzYW1lX3NldCkgewogCQlyYWlkX2Rpc2sgPSByZGV2LT5yYWlkX2Rpc2s7CiAJCWlmIChyYWlkX2Rpc2sgPj0gY29uZi0+cmFpZF9kaXNrcwogCQkgICAgfHwgcmFpZF9kaXNrIDwgMCkKQEAgLTQ1MzMsNyArNDUzMiw2IEBACiB7CiAJcmFpZDVfY29uZl90ICpjb25mID0gbWRkZXZfdG9fY29uZihtZGRldik7CiAJbWRrX3JkZXZfdCAqcmRldjsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpydG1wOwogCWludCBzcGFyZXMgPSAwOwogCWludCBhZGRlZF9kZXZpY2VzID0gMDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwpAQCAtNDU0MSw3ICs0NTM5LDcgQEAKIAlpZiAodGVzdF9iaXQoTURfUkVDT1ZFUllfUlVOTklORywgJm1kZGV2LT5yZWNvdmVyeSkpCiAJCXJldHVybiAtRUJVU1k7CiAKLQlyZGV2X2Zvcl9lYWNoKHJkZXYsIHJ0bXAsIG1kZGV2KQorCWxpc3RfZm9yX2VhY2hfZW50cnkocmRldiwgJm1kZGV2LT5kaXNrcywgc2FtZV9zZXQpCiAJCWlmIChyZGV2LT5yYWlkX2Rpc2sgPCAwICYmCiAJCSAgICAhdGVzdF9iaXQoRmF1bHR5LCAmcmRldi0+ZmxhZ3MpKQogCQkJc3BhcmVzKys7CkBAIC00NTYzLDcgKzQ1NjEsNyBAQAogCS8qIEFkZCBzb21lIG5ldyBkcml2ZXMsIGFzIG1hbnkgYXMgd2lsbCBmaXQuCiAJICogV2Uga25vdyB0aGVyZSBhcmUgZW5vdWdoIHRvIG1ha2UgdGhlIG5ld2x5IHNpemVkIGFycmF5IHdvcmsuCiAJICovCi0JcmRldl9mb3JfZWFjaChyZGV2LCBydG1wLCBtZGRldikKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJkZXYsICZtZGRldi0+ZGlza3MsIHNhbWVfc2V0KQogCQlpZiAocmRldi0+cmFpZF9kaXNrIDwgMCAmJgogCQkgICAgIXRlc3RfYml0KEZhdWx0eSwgJnJkZXYtPmZsYWdzKSkgewogCQkJaWYgKHJhaWQ1X2FkZF9kaXNrKG1kZGV2LCByZGV2KSA9PSAwKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2NvbW1vbi90dW5lcnMvdGRhODI5MC5jIGIvZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzL3RkYTgyOTAuYwppbmRleCAwZWU3OWZkLi40Yjg2NjJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2NvbW1vbi90dW5lcnMvdGRhODI5MC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycy90ZGE4MjkwLmMKQEAgLTE1MCw3ICsxNTAsNyBAQAogCX0KIH0KIAotc3RydWN0IHsKK3N0YXRpYyBzdHJ1Y3QgewogCXVuc2lnbmVkIGNoYXIgc2VxWzJdOwogfSBmbV9tb2RlW10gPSB7CiAJeyB7IDB4MDEsIDB4ODF9IH0sCS8qIFB1dCBkZXZpY2UgaW50byBleHBlcnQgbW9kZSAqLwpAQCAtMjA3LDcgKzIwNyw2IEBACiAJbXNsZWVwKDEpOwogCiAJaWYgKHBhcmFtcy0+bW9kZSA9PSBWNEwyX1RVTkVSX1JBRElPKSB7Ci0JCWludCBpOwogCQl1bnNpZ25lZCBjaGFyIGRlZW1waGFzaXNbXSAgPSB7IDB4MTMsIDEgfTsKIAogCQkvKiBGSVhNRTogYWxsb3cgdXNpbmcgYSBkaWZmZXJlbnQgZGVlbXBoYXNpcyAqLwpAQCAtNzY3LDcgKzc2Niw4IEBACiAJZmUtPm9wcy5hbmFsb2dfb3BzLmluZm8ubmFtZSA9IG5hbWU7CiAKIAlpZiAocHJpdi0+dmVyICYgVERBODI5MCkgewotCQl0ZGE4MjkwX2luaXRfdHVuZXIoZmUpOworCQlpZiAocHJpdi0+dmVyICYgKFREQTgyNzUgfCBUREE4Mjc1QSkpCisJCQl0ZGE4MjkwX2luaXRfdHVuZXIoZmUpOwogCQl0ZGE4MjkwX2luaXRfaWYoZmUpOwogCX0gZWxzZSBpZiAocHJpdi0+dmVyICYgVERBODI5NSkKIAkJdGRhODI5NV9pbml0X2lmKGZlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2RtMTEwNS9LY29uZmlnIGIvZHJpdmVycy9tZWRpYS9kdmIvZG0xMTA1L0tjb25maWcKaW5kZXggMTMzMjMwMS4uNDNmNGQ0NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZG0xMTA1L0tjb25maWcKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZG0xMTA1L0tjb25maWcKQEAgLTEsNiArMSw3IEBACiBjb25maWcgRFZCX0RNMTEwNQogCXRyaXN0YXRlICJTRE1DIERNMTEwNSBiYXNlZCBQQ0kgY2FyZHMiCiAJZGVwZW5kcyBvbiBEVkJfQ09SRSAmJiBQQ0kgJiYgSTJDCisJZGVwZW5kcyBvbiBJTlBVVAogCXNlbGVjdCBEVkJfUExMIGlmICFEVkJfRkVfQ1VTVE9NSVNFCiAJc2VsZWN0IERWQl9TVFYwMjk5IGlmICFEVkJfRkVfQ1VTVE9NSVNFCiAJc2VsZWN0IERWQl9TVFYwMjg4IGlmICFEVkJfRkVfQ1VTVE9NSVNFCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kdmJfZnJvbnRlbmQuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2Yl9mcm9udGVuZC5jCmluZGV4IDE3MWY5Y2EuLjg0MzQwNzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2Yl9mcm9udGVuZC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2Yl9mcm9udGVuZC5jCkBAIC04MjQsNyArODI0LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RydWN0IGR0dl9jbWRzX2ggZHR2X2NtZHNbXSA9IHsKK3N0YXRpYyBzdHJ1Y3QgZHR2X2NtZHNfaCBkdHZfY21kc1tdID0gewogCVtEVFZfVFVORV0gPSB7CiAJCS5uYW1lCT0gIkRUVl9UVU5FIiwKIAkJLmNtZAk9IERUVl9UVU5FLApAQCAtOTYyLDcgKzk2Miw3IEBACiAJfSwKIH07CiAKLXZvaWQgZHR2X3Byb3BlcnR5X2R1bXAoc3RydWN0IGR0dl9wcm9wZXJ0eSAqdHZwKQorc3RhdGljIHZvaWQgZHR2X3Byb3BlcnR5X2R1bXAoc3RydWN0IGR0dl9wcm9wZXJ0eSAqdHZwKQogewogCWludCBpOwogCkBAIC05OTMsNyArOTkzLDcgQEAKIAkJZHByaW50aygiJXMoKSB0dnAudS5kYXRhID0gMHglMDh4XG4iLCBfX2Z1bmNfXywgdHZwLT51LmRhdGEpOwogfQogCi1pbnQgaXNfbGVnYWN5X2RlbGl2ZXJ5X3N5c3RlbShmZV9kZWxpdmVyeV9zeXN0ZW1fdCBzKQorc3RhdGljIGludCBpc19sZWdhY3lfZGVsaXZlcnlfc3lzdGVtKGZlX2RlbGl2ZXJ5X3N5c3RlbV90IHMpCiB7CiAJaWYoKHMgPT0gU1lTX1VOREVGSU5FRCkgfHwgKHMgPT0gU1lTX0RWQkNfQU5ORVhfQUMpIHx8CiAJICAgKHMgPT0gU1lTX0RWQkNfQU5ORVhfQikgfHwgKHMgPT0gU1lTX0RWQlQpIHx8IChzID09IFNZU19EVkJTKSB8fApAQCAtMTAwNyw3ICsxMDA3LDggQEAKICAqIGRyaXZlcnMgY2FuIHVzZSBhIHNpbmdsZSBzZXRfZnJvbnRlbmQgdHVuaW5nIGZ1bmN0aW9uLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIKICAqIGl0J3MgYmVpbmcgdXNlZCBmb3IgdGhlIGxlZ2FjeSBvciBuZXcgQVBJLCByZWR1Y2luZyBjb2RlIGFuZCBjb21wbGV4aXR5LgogICovCi12b2lkIGR0dl9wcm9wZXJ0eV9jYWNoZV9zeW5jKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKnApCitzdGF0aWMgdm9pZCBkdHZfcHJvcGVydHlfY2FjaGVfc3luYyhzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwKKwkJCQkgICAgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwKQogewogCXN0cnVjdCBkdHZfZnJvbnRlbmRfcHJvcGVydGllcyAqYyA9ICZmZS0+ZHR2X3Byb3BlcnR5X2NhY2hlOwogCkBAIC0xMDU5LDcgKzEwNjAsNyBAQAogLyogRW5zdXJlIHRoZSBjYWNoZWQgdmFsdWVzIGFyZSBzZXQgY29ycmVjdGx5IGluIHRoZSBmcm9udGVuZAogICogbGVnYWN5IHR1bmluZyBzdHJ1Y3R1cmVzLCBmb3IgdGhlIGFkdmFuY2VkIHR1bmluZyBBUEkuCiAgKi8KLXZvaWQgZHR2X3Byb3BlcnR5X2xlZ2FjeV9wYXJhbXNfc3luYyhzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKK3N0YXRpYyB2b2lkIGR0dl9wcm9wZXJ0eV9sZWdhY3lfcGFyYW1zX3N5bmMoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUpCiB7CiAJc3RydWN0IGR0dl9mcm9udGVuZF9wcm9wZXJ0aWVzICpjID0gJmZlLT5kdHZfcHJvcGVydHlfY2FjaGU7CiAJc3RydWN0IGR2Yl9mcm9udGVuZF9wcml2YXRlICpmZXByaXYgPSBmZS0+ZnJvbnRlbmRfcHJpdjsKQEAgLTExMTQsNyArMTExNSw3IEBACiAvKiBFbnN1cmUgdGhlIGNhY2hlZCB2YWx1ZXMgYXJlIHNldCBjb3JyZWN0bHkgaW4gdGhlIGZyb250ZW5kCiAgKiBsZWdhY3kgdHVuaW5nIHN0cnVjdHVyZXMsIGZvciB0aGUgbGVnYWN5IHR1bmluZyBBUEkuCiAgKi8KLXZvaWQgZHR2X3Byb3BlcnR5X2Fkdl9wYXJhbXNfc3luYyhzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKK3N0YXRpYyB2b2lkIGR0dl9wcm9wZXJ0eV9hZHZfcGFyYW1zX3N5bmMoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUpCiB7CiAJc3RydWN0IGR0dl9mcm9udGVuZF9wcm9wZXJ0aWVzICpjID0gJmZlLT5kdHZfcHJvcGVydHlfY2FjaGU7CiAJc3RydWN0IGR2Yl9mcm9udGVuZF9wcml2YXRlICpmZXByaXYgPSBmZS0+ZnJvbnRlbmRfcHJpdjsKQEAgLTExNDksNyArMTE1MCw3IEBACiAJfQogfQogCi12b2lkIGR0dl9wcm9wZXJ0eV9jYWNoZV9zdWJtaXQoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUpCitzdGF0aWMgdm9pZCBkdHZfcHJvcGVydHlfY2FjaGVfc3VibWl0KHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQogewogCXN0cnVjdCBkdHZfZnJvbnRlbmRfcHJvcGVydGllcyAqYyA9ICZmZS0+ZHR2X3Byb3BlcnR5X2NhY2hlOwogCkBAIC0xMTgwLDggKzExODEsOSBAQAogc3RhdGljIGludCBkdmJfZnJvbnRlbmRfaW9jdGxfcHJvcGVydGllcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKIAkJCXVuc2lnbmVkIGludCBjbWQsIHZvaWQgKnBhcmcpOwogCi1pbnQgZHR2X3Byb3BlcnR5X3Byb2Nlc3NfZ2V0KHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCBzdHJ1Y3QgZHR2X3Byb3BlcnR5ICp0dnAsCi0Jc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCitzdGF0aWMgaW50IGR0dl9wcm9wZXJ0eV9wcm9jZXNzX2dldChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwKKwkJCQkgICAgc3RydWN0IGR0dl9wcm9wZXJ0eSAqdHZwLAorCQkJCSAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKIAlpbnQgciA9IDA7CiAKQEAgLTEyNTMsOCArMTI1NSwxMCBAQAogCXJldHVybiByOwogfQogCi1pbnQgZHR2X3Byb3BlcnR5X3Byb2Nlc3Nfc2V0KHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCBzdHJ1Y3QgZHR2X3Byb3BlcnR5ICp0dnAsCi0Jc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCitzdGF0aWMgaW50IGR0dl9wcm9wZXJ0eV9wcm9jZXNzX3NldChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwKKwkJCQkgICAgc3RydWN0IGR0dl9wcm9wZXJ0eSAqdHZwLAorCQkJCSAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCSAgICBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKIAlpbnQgciA9IDA7CiAJc3RydWN0IGR2Yl9mcm9udGVuZF9wcml2YXRlICpmZXByaXYgPSBmZS0+ZnJvbnRlbmRfcHJpdjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2Yl9uZXQuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2Yl9uZXQuYwppbmRleCAwM2ZkOWRkLi5mNmJhODQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kdmJfbmV0LmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiX25ldC5jCkBAIC0xMjUsNyArMTI1LDYgQEAKIAogc3RydWN0IGR2Yl9uZXRfcHJpdiB7CiAJaW50IGluX3VzZTsKLQlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKIAl1MTYgcGlkOwogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXQ7CiAJc3RydWN0IGR2Yl9uZXQgKmhvc3Q7CkBAIC0zODQsOCArMzgzLDggQEAKIAkJCQlpZiAocHJpdi0+dWxlX3NrYikgewogCQkJCQlkZXZfa2ZyZWVfc2tiKCBwcml2LT51bGVfc2tiICk7CiAJCQkJCS8qIFByZXBhcmUgZm9yIG5leHQgU05EVS4gKi8KLQkJCQkJcHJpdi0+c3RhdHMucnhfZXJyb3JzKys7Ci0JCQkJCXByaXYtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycysrOworCQkJCQlkZXYtPnN0YXRzLnJ4X2Vycm9ycysrOworCQkJCQlkZXYtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycysrOwogCQkJCX0KIAkJCQlyZXNldF91bGUocHJpdik7CiAJCQkJcHJpdi0+bmVlZF9wdXNpID0gMTsKQEAgLTQzOCw4ICs0MzcsOCBAQAogCQkJCQlkZXZfa2ZyZWVfc2tiKCBwcml2LT51bGVfc2tiICk7CiAJCQkJCS8qIFByZXBhcmUgZm9yIG5leHQgU05EVS4gKi8KIAkJCQkJLy8gcmVzZXRfdWxlKHByaXYpOyAgbW92ZWQgdG8gYmVsb3cuCi0JCQkJCXByaXYtPnN0YXRzLnJ4X2Vycm9ycysrOwotCQkJCQlwcml2LT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKKwkJCQkJZGV2LT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJCQkJZGV2LT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKIAkJCQl9CiAJCQkJcmVzZXRfdWxlKHByaXYpOwogCQkJCS8qIHNraXAgdG8gbmV4dCBQVVNJLiAqLwpAQCAtNDYwLDggKzQ1OSw4IEBACiAJCQkJCQkvKiBEcm9wIHBhcnRseSBkZWNvZGVkIFNORFUsIHJlc2V0IHN0YXRlLCByZXN5bmMgb24gUFVTSS4gKi8KIAkJCQkJCWlmIChwcml2LT51bGVfc2tiKSB7CiAJCQkJCQkJZGV2X2tmcmVlX3NrYiggcHJpdi0+dWxlX3NrYiApOwotCQkJCQkJCXByaXYtPnN0YXRzLnJ4X2Vycm9ycysrOwotCQkJCQkJCXByaXYtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycysrOworCQkJCQkJCWRldi0+c3RhdHMucnhfZXJyb3JzKys7CisJCQkJCQkJZGV2LT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKIAkJCQkJCX0KIAkJCQkJCXJlc2V0X3VsZShwcml2KTsKIAkJCQkJCXByaXYtPm5lZWRfcHVzaSA9IDE7CkBAIC00NzcsOCArNDc2LDggQEAKIAkJCQlpZiAocHJpdi0+dWxlX3NuZHVfcmVtYWluID4gMTgzKSB7CiAJCQkJCS8qIEN1cnJlbnQgU05EVSBsYWNrcyBtb3JlIGRhdGEgdGhhbiB0aGVyZSBjb3VsZCBiZSBhdmFpbGFibGUgaW4gdGhlCiAJCQkJCSAqIGN1cnJlbnQgVFMgY2VsbC4gKi8KLQkJCQkJcHJpdi0+c3RhdHMucnhfZXJyb3JzKys7Ci0JCQkJCXByaXYtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKKwkJCQkJZGV2LT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJCQkJZGV2LT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7CiAJCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVsdTogRXhwZWN0ZWQgJWQgbW9yZSBTTkRVIGJ5dGVzLCBidXQgIgogCQkJCQkgICAgICAgImdvdCBQVVNJIChwZiAlZCwgdHNfcmVtYWluICVkKS4gIEZsdXNoaW5nIGluY29tcGxldGUgcGF5bG9hZC5cbiIsCiAJCQkJCSAgICAgICBwcml2LT50c19jb3VudCwgcHJpdi0+dWxlX3NuZHVfcmVtYWluLCB0c1s0XSwgdHNfcmVtYWluKTsKQEAgLTUyMCw4ICs1MTksOCBAQAogCQkJCWlmIChwcml2LT51bGVfc25kdV9sZW4gPCA1KSB7CiAJCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVsdTogSW52YWxpZCBVTEUgU05EVSBsZW5ndGggJXUuICIKIAkJCQkJICAgICAgICJSZXN5bmNpbmcuXG4iLCBwcml2LT50c19jb3VudCwgcHJpdi0+dWxlX3NuZHVfbGVuKTsKLQkJCQkJcHJpdi0+c3RhdHMucnhfZXJyb3JzKys7Ci0JCQkJCXByaXYtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKKwkJCQkJZGV2LT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJCQkJZGV2LT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7CiAJCQkJCXByaXYtPnVsZV9zbmR1X2xlbiA9IDA7CiAJCQkJCXByaXYtPm5lZWRfcHVzaSA9IDE7CiAJCQkJCW5ld190cyA9IDE7CkBAIC01NzMsNyArNTcyLDcgQEAKIAkJCWlmIChwcml2LT51bGVfc2tiID09IE5VTEwpIHsKIAkJCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiBNZW1vcnkgc3F1ZWV6ZSwgZHJvcHBpbmcgcGFja2V0LlxuIiwKIAkJCQkgICAgICAgZGV2LT5uYW1lKTsKLQkJCQlwcml2LT5zdGF0cy5yeF9kcm9wcGVkKys7CisJCQkJZGV2LT5zdGF0cy5yeF9kcm9wcGVkKys7CiAJCQkJcmV0dXJuOwogCQkJfQogCkBAIC02MzcsOCArNjM2LDggQEAKIAkJCQl1bGVfZHVtcCA9IDE7CiAjZW5kaWYKIAotCQkJCXByaXYtPnN0YXRzLnJ4X2Vycm9ycysrOwotCQkJCXByaXYtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKKwkJCQlkZXYtPnN0YXRzLnJ4X2Vycm9ycysrOworCQkJCWRldi0+c3RhdHMucnhfY3JjX2Vycm9ycysrOwogCQkJCWRldl9rZnJlZV9za2IocHJpdi0+dWxlX3NrYik7CiAJCQl9IGVsc2UgewogCQkJCS8qIENSQzMyIHZlcmlmaWVkIE9LLiAqLwpAQCAtNzQ0LDggKzc0Myw4IEBACiAJCQkJICogcmVjZWl2ZSB0aGUgcGFja2V0IGFueWhvdy4gKi8KIAkJCQkvKiBpZiAocHJpdi0+dWxlX2RiaXQgJiYgc2tiLT5wa3RfdHlwZSA9PSBQQUNLRVRfT1RIRVJIT1NUKQogCQkJCQlwcml2LT51bGVfc2tiLT5wa3RfdHlwZSA9IFBBQ0tFVF9IT1NUOyAqLwotCQkJCXByaXYtPnN0YXRzLnJ4X3BhY2tldHMrKzsKLQkJCQlwcml2LT5zdGF0cy5yeF9ieXRlcyArPSBwcml2LT51bGVfc2tiLT5sZW47CisJCQkJZGV2LT5zdGF0cy5yeF9wYWNrZXRzKys7CisJCQkJZGV2LT5zdGF0cy5yeF9ieXRlcyArPSBwcml2LT51bGVfc2tiLT5sZW47CiAJCQkJbmV0aWZfcngocHJpdi0+dWxlX3NrYik7CiAJCQl9CiAJCQlzbmR1X2RvbmU6CkBAIC04MDAsOCArNzk5LDcgQEAKIHsKIAl1OCAqZXRoOwogCXN0cnVjdCBza19idWZmICpza2I7Ci0Jc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzID0KLQkJJigoc3RydWN0IGR2Yl9uZXRfcHJpdiAqKSBuZXRkZXZfcHJpdihkZXYpKS0+c3RhdHM7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzID0gJmRldi0+c3RhdHM7CiAJaW50IHNuYXAgPSAwOwogCiAJLyogbm90ZTogcGt0X2xlbiBpbmNsdWRlcyBhIDMyYml0IGNoZWNrc3VtICovCkBAIC0xMjE2LDI4ICsxMjE0LDI5IEBACiAJcmV0dXJuIGR2Yl9uZXRfZmVlZF9zdG9wKGRldik7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqIGR2Yl9uZXRfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0JcmV0dXJuICYoKHN0cnVjdCBkdmJfbmV0X3ByaXYgKikgbmV0ZGV2X3ByaXYoZGV2KSktPnN0YXRzOwotfQotCiBzdGF0aWMgY29uc3Qgc3RydWN0IGhlYWRlcl9vcHMgZHZiX2hlYWRlcl9vcHMgPSB7CiAJLmNyZWF0ZQkJPSBldGhfaGVhZGVyLAogCS5wYXJzZQkJPSBldGhfaGVhZGVyX3BhcnNlLAogCS5yZWJ1aWxkCT0gZXRoX3JlYnVpbGRfaGVhZGVyLAogfTsKIAorCitzdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIGR2Yl9uZXRkZXZfb3BzID0geworCS5uZG9fb3BlbgkJPSBkdmJfbmV0X29wZW4sCisJLm5kb19zdG9wCQk9IGR2Yl9uZXRfc3RvcCwKKwkubmRvX3N0YXJ0X3htaXQJCT0gZHZiX25ldF90eCwKKwkubmRvX3NldF9tdWx0aWNhc3RfbGlzdCA9IGR2Yl9uZXRfc2V0X211bHRpY2FzdF9saXN0LAorCS5uZG9fc2V0X21hY19hZGRyZXNzICAgID0gZHZiX25ldF9zZXRfbWFjLAorCS5uZG9fY2hhbmdlX210dQkJPSBldGhfY2hhbmdlX210dSwKKwkubmRvX3ZhbGlkYXRlX2FkZHIJPSBldGhfdmFsaWRhdGVfYWRkciwKK307CisKIHN0YXRpYyB2b2lkIGR2Yl9uZXRfc2V0dXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlldGhlcl9zZXR1cChkZXYpOwogCiAJZGV2LT5oZWFkZXJfb3BzCQk9ICZkdmJfaGVhZGVyX29wczsKLQlkZXYtPm9wZW4JCT0gZHZiX25ldF9vcGVuOwotCWRldi0+c3RvcAkJPSBkdmJfbmV0X3N0b3A7Ci0JZGV2LT5oYXJkX3N0YXJ0X3htaXQJPSBkdmJfbmV0X3R4OwotCWRldi0+Z2V0X3N0YXRzCQk9IGR2Yl9uZXRfZ2V0X3N0YXRzOwotCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gZHZiX25ldF9zZXRfbXVsdGljYXN0X2xpc3Q7Ci0JZGV2LT5zZXRfbWFjX2FkZHJlc3MgICAgPSBkdmJfbmV0X3NldF9tYWM7CisJZGV2LT5uZXRkZXZfb3BzCQk9ICZkdmJfbmV0ZGV2X29wczsKIAlkZXYtPm10dQkJPSA0MDk2OwogCWRldi0+bWNfY291bnQgICAgICAgICAgID0gMDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiZGV2LmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kdmJkZXYuYwppbmRleCA2NWQ2OTY2Li42YTMyNjgwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kdmJkZXYuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kdmJkZXYuYwpAQCAtNzksNiArNzksMTAgQEAKIAkJZmlsZS0+cHJpdmF0ZV9kYXRhID0gZHZiZGV2OwogCQlvbGRfZm9wcyA9IGZpbGUtPmZfb3A7CiAJCWZpbGUtPmZfb3AgPSBmb3BzX2dldChkdmJkZXYtPmZvcHMpOworCQlpZiAoZmlsZS0+Zl9vcCA9PSBOVUxMKSB7CisJCQlmaWxlLT5mX29wID0gb2xkX2ZvcHM7CisJCQlnb3RvIGZhaWw7CisJCX0KIAkJaWYoZmlsZS0+Zl9vcC0+b3BlbikKIAkJCWVyciA9IGZpbGUtPmZfb3AtPm9wZW4oaW5vZGUsZmlsZSk7CiAJCWlmIChlcnIpIHsKQEAgLTkwLDYgKzk0LDcgQEAKIAkJdW5sb2NrX2tlcm5lbCgpOwogCQlyZXR1cm4gZXJyOwogCX0KK2ZhaWw6CiAJdXBfcmVhZCgmbWlub3JfcndzZW0pOwogCXVubG9ja19rZXJuZWwoKTsKIAlyZXR1cm4gLUVOT0RFVjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvYW55c2VlLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2FueXNlZS5jCmluZGV4IDUwMTdmMDguLmM2ZTdiNDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvYW55c2VlLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9hbnlzZWUuYwpAQCAtNDEsNyArNDEsNyBAQAogc3RhdGljIGludCBkdmJfdXNiX2FueXNlZV9kZWJ1ZzsKIG1vZHVsZV9wYXJhbV9uYW1lZChkZWJ1ZywgZHZiX3VzYl9hbnlzZWVfZGVidWcsIGludCwgMDY0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAic2V0IGRlYnVnZ2luZyBsZXZlbCIgRFZCX1VTQl9ERUJVR19TVEFUVVMpOwotaW50IGR2Yl91c2JfYW55c2VlX2RlbHN5czsKK3N0YXRpYyBpbnQgZHZiX3VzYl9hbnlzZWVfZGVsc3lzOwogbW9kdWxlX3BhcmFtX25hbWVkKGRlbHN5cywgZHZiX3VzYl9hbnlzZWVfZGVsc3lzLCBpbnQsIDA2NDQpOwogTU9EVUxFX1BBUk1fREVTQyhkZWxzeXMsICJzZWxlY3QgZGVsaXZlcnkgbW9kZSAoMD1EVkItQywgMT1EVkItVCkiKTsKIERWQl9ERUZJTkVfTU9EX09QVF9BREFQVEVSX05SKGFkYXB0ZXJfbnIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2N4MjQxMTYuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9jeDI0MTE2LmMKaW5kZXggNGY1MTRkMy4uMjhhZDYwOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2N4MjQxMTYuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvY3gyNDExNi5jCkBAIC0zNjksNyArMzY5LDcgQEAKICAqIE5vdCBhbGwgUzIgbW1vZHVsYXRpb24gc2NoZW1lcyBhcmUgc3VwcG9ydCBhbmQgbm90IGFsbCByYXRlcyB3aXRoCiAgKiBhIHNjaGVtZSBhcmUgc3VwcG9ydC4gRXNwZWNpYWxseSwgbm8gYXV0byBkZXRlY3Qgd2hlbiBpbiBTMiBtb2RlLgogICovCi1zdHJ1Y3QgY3gyNDExNl9tb2RmZWMgeworc3RhdGljIHN0cnVjdCBjeDI0MTE2X21vZGZlYyB7CiAJZmVfZGVsaXZlcnlfc3lzdGVtX3QgZGVsaXZlcnlfc3lzdGVtOwogCWZlX21vZHVsYXRpb25fdCBtb2R1bGF0aW9uOwogCWZlX2NvZGVfcmF0ZV90IGZlYzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9sZ2R0MzMwNC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2xnZHQzMzA0LmMKaW5kZXggNDY5YWNlNS4uM2JiMGM0MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2xnZHQzMzA0LmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2xnZHQzMzA0LmMKQEAgLTQyLDcgKzQyLDcgQEAKIAogCWZvciAoaT0wOyBpPGxlbi0xOyBpKz0zKXsKIAkJaWYoKGVyciA9IGkyY190cmFuc2ZlcihzdGF0ZS0+aTJjLCAmaTJjbXNncywgMSkpPDApIHsKLQkJCXByaW50aygiJXMgaTJjX3RyYW5zZmVyIGVycm9yICVkXG4iLCBfX0ZVTkNUSU9OX18sIGVycik7CisJCQlwcmludGsoIiVzIGkyY190cmFuc2ZlciBlcnJvciAlZFxuIiwgX19mdW5jX18sIGVycik7CiAJCQlpZiAoZXJyIDwgMCkKIAkJCQlyZXR1cm4gZXJyOwogCQkJZWxzZQpAQCAtNzMsNyArNzMsNyBAQAogCWkyY21zZ3NbMV0uYnVmID0gJmJ1ZjsKIAogCWlmKChyZXQgPSBpMmNfdHJhbnNmZXIoc3RhdGUtPmkyYywgaTJjbXNncywgMikpPDApIHsKLQkJcHJpbnRrKCIlcyBpMmNfdHJhbnNmZXIgZXJyb3IgJWRcbiIsIF9fRlVOQ1RJT05fXywgcmV0KTsKKwkJcHJpbnRrKCIlcyBpMmNfdHJhbnNmZXIgZXJyb3IgJWRcbiIsIF9fZnVuY19fLCByZXQpOwogCQlyZXR1cm4gcmV0OwogCX0KIApAQCAtOTQsNyArOTQsNyBAQAogCX07CiAJcmV0ID0gaTJjX3RyYW5zZmVyKHN0YXRlLT5pMmMsICZpMmNtc2dzLCAxKTsKIAlpZiAocmV0ICE9IDEpIHsKLQkJcHJpbnRrKCIlcyBpMmNfdHJhbnNmZXIgZXJyb3IgJWRcbiIsIF9fRlVOQ1RJT05fXywgcmV0KTsKKwkJcHJpbnRrKCIlcyBpMmNfdHJhbnNmZXIgZXJyb3IgJWRcbiIsIF9fZnVuY19fLCByZXQpOwogCQlyZXR1cm4gcmV0OwogCX0KIApAQCAtMjM4LDcgKzIzOCw3IEBACiAJCX0KIAogCQlpZiAoZXJyKSB7Ci0JCQlwcmludGsoIiVzIGVycm9yIHNldHRpbmcgbW9kdWxhdGlvblxuIiwgX19GVU5DVElPTl9fKTsKKwkJCXByaW50aygiJXMgZXJyb3Igc2V0dGluZyBtb2R1bGF0aW9uXG4iLCBfX2Z1bmNfXyk7CiAJCX0gZWxzZSB7CiAJCQlzdGF0ZS0+Y3VycmVudF9tb2R1bGF0aW9uID0gcGFyYW0tPnUudnNiLm1vZHVsYXRpb247CiAJCX0KQEAgLTMwNSw3ICszMDUsNyBAQAogCQl9CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXByaW50aygiJXMgdW5oYW5kbGVkIG1vZHVsYXRpb25cbiIsIF9fRlVOQ1RJT05fXyk7CisJCXByaW50aygiJXMgdW5oYW5kbGVkIG1vZHVsYXRpb25cbiIsIF9fZnVuY19fKTsKIAl9CiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3M5MjFfbW9kdWxlLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvczkyMV9tb2R1bGUuYwppbmRleCAzY2JiOWNiLi44OTJhZjhjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvczkyMV9tb2R1bGUuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvczkyMV9tb2R1bGUuYwpAQCAtMTM2LDcgKzEzNiw3IEBACiAJfTsKIAogCWlmKChlcnIgPSBpMmNfdHJhbnNmZXIoc3RhdGUtPmkyYywgJmkyY21zZ3MsIDEpKTwwKSB7Ci0JCXByaW50aygiJXMgaTJjX3RyYW5zZmVyIGVycm9yICVkXG4iLCBfX0ZVTkNUSU9OX18sIGVycik7CisJCXByaW50aygiJXMgaTJjX3RyYW5zZmVyIGVycm9yICVkXG4iLCBfX2Z1bmNfXywgZXJyKTsKIAkJaWYgKGVyciA8IDApCiAJCQlyZXR1cm4gZXJyOwogCQllbHNlCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvc3RiMDg5OV9hbGdvLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvc3RiMDg5OV9hbGdvLmMKaW5kZXggY2VkOWI3YS4uODNkYzdlMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3N0YjA4OTlfYWxnby5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zdGIwODk5X2FsZ28uYwpAQCAtNTQsNyArNTQsNyBAQAogICogc3RiMDg5OV9nZXRfc3JhdGUKICAqIEdldCB0aGUgY3VycmVudCBzeW1ib2wgcmF0ZQogICovCi11MzIgc3RiMDg5OV9nZXRfc3JhdGUoc3RydWN0IHN0YjA4OTlfc3RhdGUgKnN0YXRlKQorc3RhdGljIHUzMiBzdGIwODk5X2dldF9zcmF0ZShzdHJ1Y3Qgc3RiMDg5OV9zdGF0ZSAqc3RhdGUpCiB7CiAJc3RydWN0IHN0YjA4OTlfaW50ZXJuYWwgKmludGVybmFsID0gJnN0YXRlLT5pbnRlcm5hbDsKIAl1OCBzZnJbM107CkBAIC03NjMsNyArNzYzLDcgQEAKIAlzdGIwODk5X3dyaXRlX3MycmVnKHN0YXRlLCBTVEIwODk5X1MyREVNT0QsIFNUQjA4OTlfQkFTRV9DU01fQ05UUkwxLCBTVEIwODk5X09GRjBfQ1NNX0NOVFJMMSwgcmVnKTsKIH0KIAotbG9uZyBMb2cySW50KGludCBudW1iZXIpCitzdGF0aWMgbG9uZyBMb2cySW50KGludCBudW1iZXIpCiB7CiAJaW50IGk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zdGIwODk5X2Rydi5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3N0YjA4OTlfZHJ2LmMKaW5kZXggYmVlMjhmNy4uMTA2MTNhYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3N0YjA4OTlfZHJ2LmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3N0YjA4OTlfZHJ2LmMKQEAgLTEzNCw3ICsxMzQsNyBAQAogfTsKIAogLyogRFZCLVMyIEVzL04wIHF1YW50IGluIGRCLzEwMCB2cyByZWFkIHZhbHVlICogMTAwKi8KLXN0cnVjdCBzdGIwODk5X3RhYiBzdGIwODk5X3F1YW50X3RhYltdID0geworc3RhdGljIHN0cnVjdCBzdGIwODk5X3RhYiBzdGIwODk5X3F1YW50X3RhYltdID0gewogCXsgICAgMCwJICAgIDAgfSwKIAl7ICAgIDAsCSAgMTAwIH0sCiAJeyAgNjAwLAkgIDIwMCB9LApAQCAtMTc3LDcgKzE3Nyw3IEBACiB9OwogCiAvKiBEVkItUzIgRXMvTjAgZXN0aW1hdGUgaW4gZEIvMTAwIHZzIHJlYWQgdmFsdWUgKi8KLXN0cnVjdCBzdGIwODk5X3RhYiBzdGIwODk5X2VzdF90YWJbXSA9IHsKK3N0YXRpYyBzdHJ1Y3Qgc3RiMDg5OV90YWIgc3RiMDg5OV9lc3RfdGFiW10gPSB7CiAJeyAgICAwLAkgICAgIDAgfSwKIAl7ICAgIDAsCSAgICAgMSB9LAogCXsgIDMwMSwJICAgICAyIH0sCkBAIC0yMTcsNyArMjE3LDcgQEAKIAl7IDU3MjEsCTUyNjAxNyB9LAogfTsKIAotaW50IF9zdGIwODk5X3JlYWRfcmVnKHN0cnVjdCBzdGIwODk5X3N0YXRlICpzdGF0ZSwgdW5zaWduZWQgaW50IHJlZykKK3N0YXRpYyBpbnQgX3N0YjA4OTlfcmVhZF9yZWcoc3RydWN0IHN0YjA4OTlfc3RhdGUgKnN0YXRlLCB1bnNpZ25lZCBpbnQgcmVnKQogewogCWludCByZXQ7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2J1ZGdldC1jaS5jIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYnVkZ2V0LWNpLmMKaW5kZXggMzUwNzQ2My4uYmNiYzVkNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYnVkZ2V0LWNpLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYnVkZ2V0LWNpLmMKQEAgLTEzMzcsNyArMTMzNyw3IEBACiAJLnR1bmVyX3NldF9yZnNpZ2dhaW4JPSBOVUxMCiB9OwogCi1zdHJ1Y3Qgc3RiNjEwMF9jb25maWcgdHQzMjAwX3N0YjYxMDBfY29uZmlnID0geworc3RhdGljIHN0cnVjdCBzdGI2MTAwX2NvbmZpZyB0dDMyMDBfc3RiNjEwMF9jb25maWcgPSB7CiAJLnR1bmVyX2FkZHJlc3MJPSAweDYwLAogCS5yZWZjbG9jawk9IDI3MDAwMDAwLAogfTsKQEAgLTE0NTAsNyArMTQ1MCw3IEBACiAJCWlmIChidWRnZXRfY2ktPmJ1ZGdldC5kdmJfZnJvbnRlbmQpIHsKIAkJCWlmIChkdmJfYXR0YWNoKHN0YjYxMDBfYXR0YWNoLCBidWRnZXRfY2ktPmJ1ZGdldC5kdmJfZnJvbnRlbmQsICZ0dDMyMDBfc3RiNjEwMF9jb25maWcsICZidWRnZXRfY2ktPmJ1ZGdldC5pMmNfYWRhcCkpIHsKIAkJCQlpZiAoIWR2Yl9hdHRhY2gobG5icDIxX2F0dGFjaCwgYnVkZ2V0X2NpLT5idWRnZXQuZHZiX2Zyb250ZW5kLCAmYnVkZ2V0X2NpLT5idWRnZXQuaTJjX2FkYXAsIDAsIDApKSB7Ci0JCQkJCXByaW50aygiJXM6IE5vIExOQlAyMSBmb3VuZCFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCQkJCXByaW50aygiJXM6IE5vIExOQlAyMSBmb3VuZCFcbiIsIF9fZnVuY19fKTsKIAkJCQkJZHZiX2Zyb250ZW5kX2RldGFjaChidWRnZXRfY2ktPmJ1ZGdldC5kdmJfZnJvbnRlbmQpOwogCQkJCQlidWRnZXRfY2ktPmJ1ZGdldC5kdmJfZnJvbnRlbmQgPSBOVUxMOwogCQkJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY2FmZV9jY2ljLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2NhZmVfY2NpYy5jCmluZGV4IDM0YTM5ZDIuLjQ2ZmQ1NzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY2FmZV9jY2ljLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jYWZlX2NjaWMuYwpAQCAtNTY5LDcgKzU2OSw2IEBACiAKIAljYWZlX3NtYnVzX2VuYWJsZV9pcnEoY2FtKTsKIAlhZGFwLT5pZCA9IEkyQ19IV19TTUJVU19DQUZFOwotCWFkYXAtPmNsYXNzID0gSTJDX0NMQVNTX0NBTV9ESUdJVEFMOwogCWFkYXAtPm93bmVyID0gVEhJU19NT0RVTEU7CiAJYWRhcC0+Y2xpZW50X3JlZ2lzdGVyID0gY2FmZV9zbWJ1c19hdHRhY2g7CiAJYWRhcC0+Y2xpZW50X3VucmVnaXN0ZXIgPSBjYWZlX3NtYnVzX2RldGFjaDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9LY29uZmlnIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L0tjb25maWcKaW5kZXggYjBmODM3NS4uMmQyNTBhMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L0tjb25maWcKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L0tjb25maWcKQEAgLTY5LDYgKzY5LDExIEBACiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKIAkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBjeDg4LWR2Yi4KIAorY29uZmlnIFZJREVPX0NYODhfTVBFRworCXRyaXN0YXRlCisJZGVwZW5kcyBvbiBWSURFT19DWDg4X0RWQiB8fCBWSURFT19DWDg4X0JMQUNLQklSRAorCWRlZmF1bHQgeQorCiBjb25maWcgVklERU9fQ1g4OF9WUDMwNTQKIAl0cmlzdGF0ZSAiVlAtMzA1NCBTZWNvbmRhcnkgSTJDIEJ1cyBTdXBwb3J0IgogCWRlZmF1bHQgbQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L01ha2VmaWxlIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L01ha2VmaWxlCmluZGV4IDZlYzMwZjIuLmIwNmIxMjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvTWFrZWZpbGUKQEAgLTMsNyArMyw4IEBACiBjeDg4MDAtb2Jqcwk6PSBjeDg4LXZpZGVvLm8gY3g4OC12YmkubwogY3g4ODAyLW9ianMJOj0gY3g4OC1tcGVnLm8KIAotb2JqLSQoQ09ORklHX1ZJREVPX0NYODgpICs9IGN4ODh4eC5vIGN4ODgwMC5vIGN4ODgwMi5vCitvYmotJChDT05GSUdfVklERU9fQ1g4OCkgKz0gY3g4OHh4Lm8gY3g4ODAwLm8KK29iai0kKENPTkZJR19WSURFT19DWDg4X01QRUcpICs9IGN4ODgwMi5vCiBvYmotJChDT05GSUdfVklERU9fQ1g4OF9BTFNBKSArPSBjeDg4LWFsc2Eubwogb2JqLSQoQ09ORklHX1ZJREVPX0NYODhfQkxBQ0tCSVJEKSArPSBjeDg4LWJsYWNrYmlyZC5vCiBvYmotJChDT05GSUdfVklERU9fQ1g4OF9EVkIpICs9IGN4ODgtZHZiLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWR2Yi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtZHZiLmMKaW5kZXggZGE0ZGQ0OS4uNjEzZGZlYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtZHZiLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtZHZiLmMKQEAgLTEzOCw2ICsxMzgsMjggQEAKIAlyZXR1cm4gcmV0OwogfQogCitzdGF0aWMgdm9pZCBjeDg4X2R2Yl9nYXRlX2N0cmwoc3RydWN0IGN4ODhfY29yZSAgKmNvcmUsIGludCBvcGVuKQoreworCXN0cnVjdCB2aWRlb2J1Zl9kdmJfZnJvbnRlbmRzICpmOworCXN0cnVjdCB2aWRlb2J1Zl9kdmJfZnJvbnRlbmQgKmZlOworCisJaWYgKCFjb3JlLT5kdmJkZXYpCisJCXJldHVybjsKKworCWYgPSAmY29yZS0+ZHZiZGV2LT5mcm9udGVuZHM7CisKKwlpZiAoIWYpCisJCXJldHVybjsKKworCWlmIChmLT5nYXRlIDw9IDEpIC8qIHVuZGVmaW5lZCBvciBmZTAgKi8KKwkJZmUgPSB2aWRlb2J1Zl9kdmJfZ2V0X2Zyb250ZW5kKGYsIDEpOworCWVsc2UKKwkJZmUgPSB2aWRlb2J1Zl9kdmJfZ2V0X2Zyb250ZW5kKGYsIGYtPmdhdGUpOworCisJaWYgKGZlICYmIGZlLT5kdmIuZnJvbnRlbmQgJiYgZmUtPmR2Yi5mcm9udGVuZC0+b3BzLmkyY19nYXRlX2N0cmwpCisJCWZlLT5kdmIuZnJvbnRlbmQtPm9wcy5pMmNfZ2F0ZV9jdHJsKGZlLT5kdmIuZnJvbnRlbmQsIG9wZW4pOworfQorCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAogc3RhdGljIGludCBkdmljb19mdXNpb25oZHR2X2RlbW9kX2luaXQoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUpCkBAIC01OTcsMTIgKzYxOSwzMCBAQAogCXN0cnVjdCBjeDg4X2NvcmUgKmNvcmUgPSBkZXYtPmNvcmU7CiAJc3RydWN0IHZpZGVvYnVmX2R2Yl9mcm9udGVuZCAqZmUwLCAqZmUxID0gTlVMTDsKIAlpbnQgbWZlX3NoYXJlZCA9IDA7IC8qIGJ1cyBub3Qgc2hhcmVkIGJ5IGRlZmF1bHQgKi8KKwlpbnQgaTsKIAogCWlmICgwICE9IGNvcmUtPmkyY19yYykgewogCQlwcmludGsoS0VSTl9FUlIgIiVzLzI6IG5vIGkyYy1idXMgYXZhaWxhYmxlLCBjYW5ub3QgYXR0YWNoIGR2YiBkcml2ZXJzXG4iLCBjb3JlLT5uYW1lKTsKIAkJZ290byBmcm9udGVuZF9kZXRhY2g7CiAJfQogCisJaWYgKCFjb3JlLT5ib2FyZC5udW1fZnJvbnRlbmRzKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW11dGV4X2luaXQoJmRldi0+ZnJvbnRlbmRzLmxvY2spOworCUlOSVRfTElTVF9IRUFEKCZkZXYtPmZyb250ZW5kcy5mZWxpc3QpOworCisJcHJpbnRrKEtFUk5fSU5GTyAiJXMoKSBhbGxvY2F0aW5nICVkIGZyb250ZW5kKHMpXG4iLCBfX2Z1bmNfXywKKwkJCSBjb3JlLT5ib2FyZC5udW1fZnJvbnRlbmRzKTsKKwlmb3IgKGkgPSAxOyBpIDw9IGNvcmUtPmJvYXJkLm51bV9mcm9udGVuZHM7IGkrKykgeworCQlmZTAgPSB2aWRlb2J1Zl9kdmJfYWxsb2NfZnJvbnRlbmQoJmRldi0+ZnJvbnRlbmRzLCBpKTsKKwkJaWYgKCFmZTApIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXMoKSBmYWlsZWQgdG8gYWxsb2NcbiIsIF9fZnVuY19fKTsKKwkJCXZpZGVvYnVmX2R2Yl9kZWFsbG9jX2Zyb250ZW5kcygmZGV2LT5mcm9udGVuZHMpOworCQkJZ290byBmcm9udGVuZF9kZXRhY2g7CisJCX0KKwl9CisKIAkvKiBHZXQgdGhlIGZpcnN0IGZyb250ZW5kICovCiAJZmUwID0gdmlkZW9idWZfZHZiX2dldF9mcm9udGVuZCgmZGV2LT5mcm9udGVuZHMsIDEpOwogCWlmICghZmUwKQpAQCAtNjExLDYgKzY1MSw5IEBACiAJLyogbXVsdGktZnJvbnRlbmQgZ2F0ZSBjb250cm9sIGlzIHVuZGVmaW5lZCBvciBkZWZhdWx0cyB0byBmZTAgKi8KIAlkZXYtPmZyb250ZW5kcy5nYXRlID0gMDsKIAorCS8qIFNldHMgdGhlIGdhdGUgY29udHJvbCBjYWxsYmFjayB0byBiZSB1c2VkIGJ5IGkyYyBjb21tYW5kIGNhbGxzICovCisJY29yZS0+Z2F0ZV9jdHJsID0gY3g4OF9kdmJfZ2F0ZV9jdHJsOworCiAJLyogaW5pdCBmcm9udGVuZChzKSAqLwogCXN3aXRjaCAoY29yZS0+Ym9hcmRucikgewogCWNhc2UgQ1g4OF9CT0FSRF9IQVVQUEFVR0VfRFZCX1QxOgpAQCAtMTEwOSw2ICsxMTUyLDcgQEAKIAkJJmRldi0+cGNpLT5kZXYsIGFkYXB0ZXJfbnIsIG1mZV9zaGFyZWQpOwogCiBmcm9udGVuZF9kZXRhY2g6CisJY29yZS0+Z2F0ZV9jdHJsID0gTlVMTDsKIAl2aWRlb2J1Zl9kdmJfZGVhbGxvY19mcm9udGVuZHMoJmRldi0+ZnJvbnRlbmRzKTsKIAlyZXR1cm4gLUVJTlZBTDsKIH0KQEAgLTEyNzAsNiArMTMxNCw4IEBACiAKIAl2cDMwNTRfaTJjX3JlbW92ZShkZXYpOwogCisJY29yZS0+Z2F0ZV9jdHJsID0gTlVMTDsKKwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1pMmMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWkyYy5jCmluZGV4IDFhYjY5MWQuLmMwZmYyMzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWkyYy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWkyYy5jCkBAIC0xMTYsMzAgKzExNiwxNiBAQAogCiB2b2lkIGN4ODhfY2FsbF9pMmNfY2xpZW50cyhzdHJ1Y3QgY3g4OF9jb3JlICpjb3JlLCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpCiB7Ci0jaWYgZGVmaW5lZChDT05GSUdfVklERU9fQ1g4OF9EVkIpIHx8IGRlZmluZWQoQ09ORklHX1ZJREVPX0NYODhfRFZCX01PRFVMRSkKLQlzdHJ1Y3QgdmlkZW9idWZfZHZiX2Zyb250ZW5kcyAqZiA9ICZjb3JlLT5kdmJkZXYtPmZyb250ZW5kczsKLQlzdHJ1Y3QgdmlkZW9idWZfZHZiX2Zyb250ZW5kICpmZSA9IE5VTEw7Ci0jZW5kaWYKIAlpZiAoMCAhPSBjb3JlLT5pMmNfcmMpCiAJCXJldHVybjsKIAotI2lmIGRlZmluZWQoQ09ORklHX1ZJREVPX0NYODhfRFZCKSB8fCBkZWZpbmVkKENPTkZJR19WSURFT19DWDg4X0RWQl9NT0RVTEUpCi0JaWYgKGNvcmUtPmR2YmRldiAmJiBmKSB7Ci0JCWlmKGYtPmdhdGUgPD0gMSkgLyogdW5kZWZpbmVkIG9yIGZlMCAqLwotCQkJZmUgPSB2aWRlb2J1Zl9kdmJfZ2V0X2Zyb250ZW5kKGYsIDEpOwotCQllbHNlCi0JCQlmZSA9IHZpZGVvYnVmX2R2Yl9nZXRfZnJvbnRlbmQoZiwgZi0+Z2F0ZSk7CisJaWYgKGNvcmUtPmdhdGVfY3RybCkKKwkJY29yZS0+Z2F0ZV9jdHJsKGNvcmUsIDEpOwogCi0JCWlmIChmZSAmJiBmZS0+ZHZiLmZyb250ZW5kICYmIGZlLT5kdmIuZnJvbnRlbmQtPm9wcy5pMmNfZ2F0ZV9jdHJsKQotCQkJZmUtPmR2Yi5mcm9udGVuZC0+b3BzLmkyY19nYXRlX2N0cmwoZmUtPmR2Yi5mcm9udGVuZCwgMSk7CisJaTJjX2NsaWVudHNfY29tbWFuZCgmY29yZS0+aTJjX2FkYXAsIGNtZCwgYXJnKTsKIAotCQlpMmNfY2xpZW50c19jb21tYW5kKCZjb3JlLT5pMmNfYWRhcCwgY21kLCBhcmcpOwotCi0JCWlmIChmZSAmJiBmZS0+ZHZiLmZyb250ZW5kICYmIGZlLT5kdmIuZnJvbnRlbmQtPm9wcy5pMmNfZ2F0ZV9jdHJsKQotCQkJZmUtPmR2Yi5mcm9udGVuZC0+b3BzLmkyY19nYXRlX2N0cmwoZmUtPmR2Yi5mcm9udGVuZCwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQkJaTJjX2NsaWVudHNfY29tbWFuZCgmY29yZS0+aTJjX2FkYXAsIGNtZCwgYXJnKTsKKwlpZiAoY29yZS0+Z2F0ZV9jdHJsKQorCQljb3JlLT5nYXRlX2N0cmwoY29yZSwgMCk7CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2FsZ29fYml0X2RhdGEgY3g4ODAwX2kyY19hbGdvX3RlbXBsYXRlID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtbXBlZy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtbXBlZy5jCmluZGV4IDU5MTY0ZmMuLmIyOTViNzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LW1wZWcuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1tcGVnLmMKQEAgLTc4Nyw2ICs3ODcsOSBAQAogCWRldi0+cGNpID0gcGNpX2RldjsKIAlkZXYtPmNvcmUgPSBjb3JlOwogCisJLyogTWFpbnRhaW4gYSByZWZlcmVuY2Ugc28gY3g4OC12aWRlbyBjYW4gcXVlcnkgdGhlIDg4MDIgZGV2aWNlLiAqLworCWNvcmUtPmR2YmRldiA9IGRldjsKKwogCWVyciA9IGN4ODgwMl9pbml0X2NvbW1vbihkZXYpOwogCWlmIChlcnIgIT0gMCkKIAkJZ290byBmYWlsX2ZyZWU7CkBAIC03OTQsMzIgKzc5Nyw2IEBACiAJSU5JVF9MSVNUX0hFQUQoJmRldi0+ZHJ2bGlzdCk7CiAJbGlzdF9hZGRfdGFpbCgmZGV2LT5kZXZsaXN0LCZjeDg4MDJfZGV2bGlzdCk7CiAKLSNpZiBkZWZpbmVkKENPTkZJR19WSURFT19DWDg4X0RWQikgfHwgZGVmaW5lZChDT05GSUdfVklERU9fQ1g4OF9EVkJfTU9EVUxFKQotCW11dGV4X2luaXQoJmRldi0+ZnJvbnRlbmRzLmxvY2spOwotCUlOSVRfTElTVF9IRUFEKCZkZXYtPmZyb250ZW5kcy5mZWxpc3QpOwotCi0JaWYgKGNvcmUtPmJvYXJkLm51bV9mcm9udGVuZHMpIHsKLQkJc3RydWN0IHZpZGVvYnVmX2R2Yl9mcm9udGVuZCAqZmU7Ci0JCWludCBpOwotCi0JCXByaW50ayhLRVJOX0lORk8gIiVzKCkgYWxsb2NhdGluZyAlZCBmcm9udGVuZChzKVxuIiwgX19mdW5jX18sCi0JCQljb3JlLT5ib2FyZC5udW1fZnJvbnRlbmRzKTsKLQkJZm9yIChpID0gMTsgaSA8PSBjb3JlLT5ib2FyZC5udW1fZnJvbnRlbmRzOyBpKyspIHsKLQkJCWZlID0gdmlkZW9idWZfZHZiX2FsbG9jX2Zyb250ZW5kKCZkZXYtPmZyb250ZW5kcywgaSk7Ci0JCQlpZihmZSA9PSBOVUxMKSB7Ci0JCQkJcHJpbnRrKEtFUk5fRVJSICIlcygpIGZhaWxlZCB0byBhbGxvY1xuIiwKLQkJCQkJX19mdW5jX18pOwotCQkJCXZpZGVvYnVmX2R2Yl9kZWFsbG9jX2Zyb250ZW5kcygmZGV2LT5mcm9udGVuZHMpOwotCQkJCWVyciA9IC1FTk9NRU07Ci0JCQkJZ290byBmYWlsX2ZyZWU7Ci0JCQl9Ci0JCX0KLQl9Ci0jZW5kaWYKLQotCS8qIE1haW50YWluIGEgcmVmZXJlbmNlIHNvIGN4ODgtdmlkZW8gY2FuIHF1ZXJ5IHRoZSA4ODAyIGRldmljZS4gKi8KLQljb3JlLT5kdmJkZXYgPSBkZXY7Ci0KIAkvKiBub3cgYXV0b2xvYWQgY3g4OC1kdmIgb3IgY3g4OC1ibGFja2JpcmQgKi8KIAlyZXF1ZXN0X21vZHVsZXMoZGV2KTsKIAlyZXR1cm4gMDsKQEAgLTgyNyw2ICs4MDQsNyBAQAogIGZhaWxfZnJlZToKIAlrZnJlZShkZXYpOwogIGZhaWxfY29yZToKKwljb3JlLT5kdmJkZXYgPSBOVUxMOwogCWN4ODhfY29yZV9wdXQoY29yZSxwY2lfZGV2KTsKIAlyZXR1cm4gZXJyOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODguaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LmgKaW5kZXggZWI5Y2UzMC4uNjBhOGIzMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODguaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC5oCkBAIC0zMDIsNiArMzAyLDcgQEAKIAlzdHJ1Y3QgYnRjeF9yaXNjbWVtICAgIHN0b3BwZXI7CiAJdTMyICAgICAgICAgICAgICAgICAgICBjb3VudDsKIH07CitzdHJ1Y3QgY3g4OF9jb3JlOwogCiBzdHJ1Y3QgY3g4OF9jb3JlIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkICAgICAgICAgICBkZXZsaXN0OwpAQCAtMzM0LDcgKzMzNSw4IEBACiAKIAkvKiBjb25maWcgaW5mbyAtLSBkdmIgKi8KICNpZiBkZWZpbmVkKENPTkZJR19WSURFT19DWDg4X0RWQikgfHwgZGVmaW5lZChDT05GSUdfVklERU9fQ1g4OF9EVkJfTU9EVUxFKQotCWludCAJCQkgICAoKnByZXZfc2V0X3ZvbHRhZ2UpKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBmZV9zZWNfdm9sdGFnZV90IHZvbHRhZ2UpOworCWludCAJCQkgICAoKnByZXZfc2V0X3ZvbHRhZ2UpKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCBmZV9zZWNfdm9sdGFnZV90IHZvbHRhZ2UpOworCXZvaWQJCQkgICAoKmdhdGVfY3RybCkoc3RydWN0IGN4ODhfY29yZSAgKmNvcmUsIGludCBvcGVuKTsKICNlbmRpZgogCiAJLyogc3RhdGUgaW5mbyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvZW0yOHh4LWNhcmRzLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHgtY2FyZHMuYwppbmRleCBlNzc2Njk5Li5lZjliZjAwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHgtY2FyZHMuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHgtY2FyZHMuYwpAQCAtMTg0Miw3ICsxODQyLDcgQEAKICAqIGVtMjh4eF9pbml0X2RldigpCiAgKiBhbGxvY2F0ZXMgYW5kIGluaXRzIHRoZSBkZXZpY2Ugc3RydWN0cywgcmVnaXN0ZXJzIGkyYyBidXMgYW5kIHY0bCBkZXZpY2UKICAqLwotaW50IGVtMjh4eF9pbml0X2RldihzdHJ1Y3QgZW0yOHh4ICoqZGV2aGFuZGxlLCBzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiwKK3N0YXRpYyBpbnQgZW0yOHh4X2luaXRfZGV2KHN0cnVjdCBlbTI4eHggKipkZXZoYW5kbGUsIHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2LAogCQkJICAgaW50IG1pbm9yKQogewogCXN0cnVjdCBlbTI4eHggKmRldiA9ICpkZXZoYW5kbGU7CkBAIC0xOTkwLDggKzE5OTAsNyBAQAogCQlpbnQgY2hlY2tfaW50ZXJmYWNlID0gMTsKIAkJaXNvY19waXBlID0gMTsKIAkJZW5kcG9pbnQgPSAmaW50ZXJmYWNlLT5jdXJfYWx0c2V0dGluZy0+ZW5kcG9pbnRbMV0uZGVzYzsKLQkJaWYgKHVzYl9lbmRwb2ludF90eXBlKGVuZHBvaW50KSAhPQotCQkgICAgVVNCX0VORFBPSU5UX1hGRVJfSVNPQykKKwkJaWYgKCF1c2JfZW5kcG9pbnRfeGZlcl9pc29jKGVuZHBvaW50KSkKIAkJCWNoZWNrX2ludGVyZmFjZSA9IDA7CiAKIAkJaWYgKHVzYl9lbmRwb2ludF9kaXJfb3V0KGVuZHBvaW50KSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC1jb3JlLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHgtY29yZS5jCmluZGV4IDgxOWNjZWEuLmViNWZiMDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC1jb3JlLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvZW0yOHh4LWNvcmUuYwpAQCAtMzkzLDcgKzM5Myw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RydWN0IGVtMjh4eF92b2xfdGFibGUgb3V0cHV0c1tdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBlbTI4eHhfdm9sX3RhYmxlIG91dHB1dHNbXSA9IHsKIAl7IEVNMjhYWF9BT1VUX01BU1RFUiwgQUM5N19NQVNURVJfVk9MICAgICAgfSwKIAl7IEVNMjhYWF9BT1VUX0xJTkUsICAgQUM5N19MSU5FX0xFVkVMX1ZPTCAgfSwKIAl7IEVNMjhYWF9BT1VUX01PTk8sICAgQUM5N19NQVNURVJfTU9OT19WT0wgfSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC1pbnB1dC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvZW0yOHh4LWlucHV0LmMKaW5kZXggNDJiYmFmNi4uMDQ0M2FmZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvZW0yOHh4LWlucHV0LmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvZW0yOHh4LWlucHV0LmMKQEAgLTMwNyw3ICszMDcsNyBAQAogCW1vZF90aW1lcigmaXItPnRpbWVyLCBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyhpci0+cG9sbGluZykpOwogfQogCi12b2lkIGVtMjh4eF9pcl9zdGFydChzdHJ1Y3QgZW0yOHh4X0lSICppcikKK3N0YXRpYyB2b2lkIGVtMjh4eF9pcl9zdGFydChzdHJ1Y3QgZW0yOHh4X0lSICppcikKIHsKIAlzZXR1cF90aW1lcigmaXItPnRpbWVyLCBpcl90aW1lciwgKHVuc2lnbmVkIGxvbmcpaXIpOwogCUlOSVRfV09SSygmaXItPndvcmssIGVtMjh4eF9pcl93b3JrKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvbTU2MDIvbTU2MDJfczVrODNhLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL201NjAyL201NjAyX3M1azgzYS5jCmluZGV4IGFmM2YyZGMuLmNjZWE0YTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvbTU2MDIvbTU2MDJfczVrODNhLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9tNTYwMi9tNTYwMl9zNWs4M2EuYwpAQCAtMTEzLDcgKzExMyw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXZvaWQgczVrODNhX2R1bXBfcmVnaXN0ZXJzKHN0cnVjdCBzZCAqc2QpCitzdGF0aWMgdm9pZCBzNWs4M2FfZHVtcF9yZWdpc3RlcnMoc3RydWN0IHNkICpzZCkKIHsKIAlpbnQgYWRkcmVzczsKIAl1OCBwYWdlLCBvbGRfcGFnZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vb3Y3NjcwLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL292NzY3MC5jCmluZGV4IGNhMjZiMGMuLjA1YzE0YTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vb3Y3NjcwLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9vdjc2NzAuYwpAQCAtMTM0Nyw3ICsxMzQ3LDYgQEAKIAkJLm5hbWUgPSAib3Y3NjcwIiwKIAl9LAogCS5pZCAJCT0gSTJDX0RSSVZFUklEX09WNzY3MCwKLQkuY2xhc3MgCQk9IEkyQ19DTEFTU19DQU1fRElHSVRBTCwKIAkuYXR0YWNoX2FkYXB0ZXIgPSBvdjc2NzBfYXR0YWNoLAogCS5kZXRhY2hfY2xpZW50CT0gb3Y3NjcwX2RldGFjaCwKIAkuY29tbWFuZAk9IG92NzY3MF9jb21tYW5kLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9vdmNhbWNoaXAvb3ZjYW1jaGlwX2NvcmUuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vb3ZjYW1jaGlwL292Y2FtY2hpcF9jb3JlLmMKaW5kZXggMmM0YWNiZi4uYzg0MWY0ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9vdmNhbWNoaXAvb3ZjYW1jaGlwX2NvcmUuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL292Y2FtY2hpcC9vdmNhbWNoaXBfY29yZS5jCkBAIC00MDUsNyArNDA1LDYgQEAKIAkJLm5hbWUgPQkJIm92Y2FtY2hpcCIsCiAJfSwKIAkuaWQgPQkJCUkyQ19EUklWRVJJRF9PVkNBTUNISVAsCi0JLmNsYXNzID0JCUkyQ19DTEFTU19DQU1fRElHSVRBTCwKIAkuYXR0YWNoX2FkYXB0ZXIgPQlvdmNhbWNoaXBfYXR0YWNoLAogCS5kZXRhY2hfY2xpZW50ID0Jb3ZjYW1jaGlwX2RldGFjaCwKIAkuY29tbWFuZCA9CQlvdmNhbWNoaXBfY29tbWFuZCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHZydXNiMi9wdnJ1c2IyLWhkdy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9wdnJ1c2IyL3B2cnVzYjItaGR3LmMKaW5kZXggOGZiOTJhYy4uZmEzMDRlNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9wdnJ1c2IyL3B2cnVzYjItaGR3LmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9wdnJ1c2IyL3B2cnVzYjItaGR3LmMKQEAgLTM2NTUsNyArMzY1NSw3IEBACiAJaW50IHJldDsKIAlwdnIyX3RyYWNlKFBWUjJfVFJBQ0VfSU5JVCwiUGVyZm9ybWluZyBhIGRldmljZSByZXNldC4uLiIpOwogCXJldCA9IHVzYl9sb2NrX2RldmljZV9mb3JfcmVzZXQoaGR3LT51c2JfZGV2LE5VTEwpOwotCWlmIChyZXQgPT0gMSkgeworCWlmIChyZXQgPT0gMCkgewogCQlyZXQgPSB1c2JfcmVzZXRfZGV2aWNlKGhkdy0+dXNiX2Rldik7CiAJCXVzYl91bmxvY2tfZGV2aWNlKGhkdy0+dXNiX2Rldik7CiAJfSBlbHNlIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHhhX2NhbWVyYS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9weGFfY2FtZXJhLmMKaW5kZXggOWQzM2RlMi4uYTFkNjAwOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9weGFfY2FtZXJhLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9weGFfY2FtZXJhLmMKQEAgLTM0LDEyICszNCwxMCBAQAogCiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CiAKLSNpbmNsdWRlIDxhc20vZG1hLmg+CisjaW5jbHVkZSA8bWFjaC9kbWEuaD4KICNpbmNsdWRlIDxtYWNoL3B4YS1yZWdzLmg+CiAjaW5jbHVkZSA8bWFjaC9jYW1lcmEuaD4KIAotI2luY2x1ZGUgInB4YV9jYW1lcmEuaCIKLQogI2RlZmluZSBQWEFfQ0FNX1ZFUlNJT05fQ09ERSBLRVJORUxfVkVSU0lPTigwLCAwLCA1KQogI2RlZmluZSBQWEFfQ0FNX0RSVl9OQU1FICJweGEyN3gtY2FtZXJhIgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3B4YV9jYW1lcmEuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHhhX2NhbWVyYS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OWNiZmM5Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHhhX2NhbWVyYS5oCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLyogQ2FtZXJhIEludGVyZmFjZSAqLwotI2RlZmluZSBDSUNSMAkJX19SRUcoMHg1MDAwMDAwMCkKLSNkZWZpbmUgQ0lDUjEJCV9fUkVHKDB4NTAwMDAwMDQpCi0jZGVmaW5lIENJQ1IyCQlfX1JFRygweDUwMDAwMDA4KQotI2RlZmluZSBDSUNSMwkJX19SRUcoMHg1MDAwMDAwQykKLSNkZWZpbmUgQ0lDUjQJCV9fUkVHKDB4NTAwMDAwMTApCi0jZGVmaW5lIENJU1IJCV9fUkVHKDB4NTAwMDAwMTQpCi0jZGVmaW5lIENJRlIJCV9fUkVHKDB4NTAwMDAwMTgpCi0jZGVmaW5lIENJVE9SCQlfX1JFRygweDUwMDAwMDFDKQotI2RlZmluZSBDSUJSMAkJX19SRUcoMHg1MDAwMDAyOCkKLSNkZWZpbmUgQ0lCUjEJCV9fUkVHKDB4NTAwMDAwMzApCi0jZGVmaW5lIENJQlIyCQlfX1JFRygweDUwMDAwMDM4KQotCi0jZGVmaW5lIENJQ1IwX0RNQUVOCSgxIDw8IDMxKQkvKiBETUEgcmVxdWVzdCBlbmFibGUgKi8KLSNkZWZpbmUgQ0lDUjBfUEFSX0VOCSgxIDw8IDMwKQkvKiBQYXJpdHkgZW5hYmxlICovCi0jZGVmaW5lIENJQ1IwX1NMX0NBUF9FTgkoMSA8PCAyOSkJLyogQ2FwdHVyZSBlbmFibGUgZm9yIHNsYXZlIG1vZGUgKi8KLSNkZWZpbmUgQ0lDUjBfRU5CCSgxIDw8IDI4KQkvKiBDYW1lcmEgaW50ZXJmYWNlIGVuYWJsZSAqLwotI2RlZmluZSBDSUNSMF9ESVMJKDEgPDwgMjcpCS8qIENhbWVyYSBpbnRlcmZhY2UgZGlzYWJsZSAqLwotI2RlZmluZSBDSUNSMF9TSU0JKDB4NyA8PCAyNCkJLyogU2Vuc29yIGludGVyZmFjZSBtb2RlIG1hc2sgKi8KLSNkZWZpbmUgQ0lDUjBfVE9NCSgxIDw8IDkpCS8qIFRpbWUtb3V0IG1hc2sgKi8KLSNkZWZpbmUgQ0lDUjBfUkRBVk0JKDEgPDwgOCkJLyogUmVjZWl2ZS1kYXRhLWF2YWlsYWJsZSBtYXNrICovCi0jZGVmaW5lIENJQ1IwX0ZFTQkoMSA8PCA3KQkvKiBGSUZPLWVtcHR5IG1hc2sgKi8KLSNkZWZpbmUgQ0lDUjBfRU9MTQkoMSA8PCA2KQkvKiBFbmQtb2YtbGluZSBtYXNrICovCi0jZGVmaW5lIENJQ1IwX1BFUlJNCSgxIDw8IDUpCS8qIFBhcml0eS1lcnJvciBtYXNrICovCi0jZGVmaW5lIENJQ1IwX1FETQkoMSA8PCA0KQkvKiBRdWljay1kaXNhYmxlIG1hc2sgKi8KLSNkZWZpbmUgQ0lDUjBfQ0RNCSgxIDw8IDMpCS8qIERpc2FibGUtZG9uZSBtYXNrICovCi0jZGVmaW5lIENJQ1IwX1NPRk0JKDEgPDwgMikJLyogU3RhcnQtb2YtZnJhbWUgbWFzayAqLwotI2RlZmluZSBDSUNSMF9FT0ZNCSgxIDw8IDEpCS8qIEVuZC1vZi1mcmFtZSBtYXNrICovCi0jZGVmaW5lIENJQ1IwX0ZPTQkoMSA8PCAwKQkvKiBGSUZPLW92ZXJydW4gbWFzayAqLwotCi0jZGVmaW5lIENJQ1IxX1RCSVQJKDEgPDwgMzEpCS8qIFRyYW5zcGFyZW5jeSBiaXQgKi8KLSNkZWZpbmUgQ0lDUjFfUkdCVF9DT05WCSgweDMgPDwgMjkpCS8qIFJHQlQgY29udmVyc2lvbiBtYXNrICovCi0jZGVmaW5lIENJQ1IxX1BQTAkoMHg3ZmYgPDwgMTUpCS8qIFBpeGVscyBwZXIgbGluZSBtYXNrICovCi0jZGVmaW5lIENJQ1IxX1JHQl9DT05WCSgweDcgPDwgMTIpCS8qIFJHQiBjb252ZXJzaW9uIG1hc2sgKi8KLSNkZWZpbmUgQ0lDUjFfUkdCX0YJKDEgPDwgMTEpCS8qIFJHQiBmb3JtYXQgKi8KLSNkZWZpbmUgQ0lDUjFfWUNCQ1JfRgkoMSA8PCAxMCkJLyogWUNiQ3IgZm9ybWF0ICovCi0jZGVmaW5lIENJQ1IxX1JHQl9CUFAJKDB4NyA8PCA3KQkvKiBSR0IgYmlzIHBlciBwaXhlbCBtYXNrICovCi0jZGVmaW5lIENJQ1IxX1JBV19CUFAJKDB4MyA8PCA1KQkvKiBSYXcgYmlzIHBlciBwaXhlbCBtYXNrICovCi0jZGVmaW5lIENJQ1IxX0NPTE9SX1NQCSgweDMgPDwgMykJLyogQ29sb3Igc3BhY2UgbWFzayAqLwotI2RlZmluZSBDSUNSMV9EVwkoMHg3IDw8IDApCS8qIERhdGEgd2lkdGggbWFzayAqLwotCi0jZGVmaW5lIENJQ1IyX0JMVwkoMHhmZiA8PCAyNCkJLyogQmVnaW5uaW5nLW9mLWxpbmUgcGl4ZWwgY2xvY2sKLQkJCQkJICAgd2FpdCBjb3VudCBtYXNrICovCi0jZGVmaW5lIENJQ1IyX0VMVwkoMHhmZiA8PCAxNikJLyogRW5kLW9mLWxpbmUgcGl4ZWwgY2xvY2sKLQkJCQkJICAgd2FpdCBjb3VudCBtYXNrICovCi0jZGVmaW5lIENJQ1IyX0hTVwkoMHgzZiA8PCAxMCkJLyogSG9yaXpvbnRhbCBzeW5jIHB1bHNlIHdpZHRoIG1hc2sgKi8KLSNkZWZpbmUgQ0lDUjJfQkZQVwkoMHgzZiA8PCAzKQkvKiBCZWdpbm5pbmctb2YtZnJhbWUgcGl4ZWwgY2xvY2sKLQkJCQkJICAgd2FpdCBjb3VudCBtYXNrICovCi0jZGVmaW5lIENJQ1IyX0ZTVwkoMHg3IDw8IDApCS8qIEZyYW1lIHN0YWJpbGl6YXRpb24KLQkJCQkJICAgd2FpdCBjb3VudCBtYXNrICovCi0KLSNkZWZpbmUgQ0lDUjNfQkZXCSgweGZmIDw8IDI0KQkvKiBCZWdpbm5pbmctb2YtZnJhbWUgbGluZSBjbG9jawotCQkJCQkgICB3YWl0IGNvdW50IG1hc2sgKi8KLSNkZWZpbmUgQ0lDUjNfRUZXCSgweGZmIDw8IDE2KQkvKiBFbmQtb2YtZnJhbWUgbGluZSBjbG9jawotCQkJCQkgICB3YWl0IGNvdW50IG1hc2sgKi8KLSNkZWZpbmUgQ0lDUjNfVlNXCSgweDNmIDw8IDEwKQkvKiBWZXJ0aWNhbCBzeW5jIHB1bHNlIHdpZHRoIG1hc2sgKi8KLSNkZWZpbmUgQ0lDUjNfQkZQVwkoMHgzZiA8PCAzKQkvKiBCZWdpbm5pbmctb2YtZnJhbWUgcGl4ZWwgY2xvY2sKLQkJCQkJICAgd2FpdCBjb3VudCBtYXNrICovCi0jZGVmaW5lIENJQ1IzX0xQRgkoMHg3ZmYgPDwgMCkJLyogTGluZXMgcGVyIGZyYW1lIG1hc2sgKi8KLQotI2RlZmluZSBDSUNSNF9NQ0xLX0RMWQkoMHgzIDw8IDI0KQkvKiBNQ0xLIERhdGEgQ2FwdHVyZSBEZWxheSBtYXNrICovCi0jZGVmaW5lIENJQ1I0X1BDTEtfRU4JKDEgPDwgMjMpCS8qIFBpeGVsIGNsb2NrIGVuYWJsZSAqLwotI2RlZmluZSBDSUNSNF9QQ1AJKDEgPDwgMjIpCS8qIFBpeGVsIGNsb2NrIHBvbGFyaXR5ICovCi0jZGVmaW5lIENJQ1I0X0hTUAkoMSA8PCAyMSkJLyogSG9yaXpvbnRhbCBzeW5jIHBvbGFyaXR5ICovCi0jZGVmaW5lIENJQ1I0X1ZTUAkoMSA8PCAyMCkJLyogVmVydGljYWwgc3luYyBwb2xhcml0eSAqLwotI2RlZmluZSBDSUNSNF9NQ0xLX0VOCSgxIDw8IDE5KQkvKiBNQ0xLIGVuYWJsZSAqLwotI2RlZmluZSBDSUNSNF9GUl9SQVRFCSgweDcgPDwgOCkJLyogRnJhbWUgcmF0ZSBtYXNrICovCi0jZGVmaW5lIENJQ1I0X0RJVgkoMHhmZiA8PCAwKQkvKiBDbG9jayBkaXZpc29yIG1hc2sgKi8KLQotI2RlZmluZSBDSVNSX0ZUTwkoMSA8PCAxNSkJLyogRklGTyB0aW1lLW91dCAqLwotI2RlZmluZSBDSVNSX1JEQVZfMgkoMSA8PCAxNCkJLyogQ2hhbm5lbCAyIHJlY2VpdmUgZGF0YSBhdmFpbGFibGUgKi8KLSNkZWZpbmUgQ0lTUl9SREFWXzEJKDEgPDwgMTMpCS8qIENoYW5uZWwgMSByZWNlaXZlIGRhdGEgYXZhaWxhYmxlICovCi0jZGVmaW5lIENJU1JfUkRBVl8wCSgxIDw8IDEyKQkvKiBDaGFubmVsIDAgcmVjZWl2ZSBkYXRhIGF2YWlsYWJsZSAqLwotI2RlZmluZSBDSVNSX0ZFTVBUWV8yCSgxIDw8IDExKQkvKiBDaGFubmVsIDIgRklGTyBlbXB0eSAqLwotI2RlZmluZSBDSVNSX0ZFTVBUWV8xCSgxIDw8IDEwKQkvKiBDaGFubmVsIDEgRklGTyBlbXB0eSAqLwotI2RlZmluZSBDSVNSX0ZFTVBUWV8wCSgxIDw8IDkpCS8qIENoYW5uZWwgMCBGSUZPIGVtcHR5ICovCi0jZGVmaW5lIENJU1JfRU9MCSgxIDw8IDgpCS8qIEVuZCBvZiBsaW5lICovCi0jZGVmaW5lIENJU1JfUEFSX0VSUgkoMSA8PCA3KQkvKiBQYXJpdHkgZXJyb3IgKi8KLSNkZWZpbmUgQ0lTUl9DUUQJKDEgPDwgNikJLyogQ2FtZXJhIGludGVyZmFjZSBxdWljayBkaXNhYmxlICovCi0jZGVmaW5lIENJU1JfQ0RECSgxIDw8IDUpCS8qIENhbWVyYSBpbnRlcmZhY2UgZGlzYWJsZSBkb25lICovCi0jZGVmaW5lIENJU1JfU09GCSgxIDw8IDQpCS8qIFN0YXJ0IG9mIGZyYW1lICovCi0jZGVmaW5lIENJU1JfRU9GCSgxIDw8IDMpCS8qIEVuZCBvZiBmcmFtZSAqLwotI2RlZmluZSBDSVNSX0lGT18yCSgxIDw8IDIpCS8qIEZJRk8gb3ZlcnJ1biBmb3IgQ2hhbm5lbCAyICovCi0jZGVmaW5lIENJU1JfSUZPXzEJKDEgPDwgMSkJLyogRklGTyBvdmVycnVuIGZvciBDaGFubmVsIDEgKi8KLSNkZWZpbmUgQ0lTUl9JRk9fMAkoMSA8PCAwKQkvKiBGSUZPIG92ZXJydW4gZm9yIENoYW5uZWwgMCAqLwotCi0jZGVmaW5lIENJRlJfRkxWTDIJKDB4N2YgPDwgMjMpCS8qIEZJRk8gMiBsZXZlbCBtYXNrICovCi0jZGVmaW5lIENJRlJfRkxWTDEJKDB4N2YgPDwgMTYpCS8qIEZJRk8gMSBsZXZlbCBtYXNrICovCi0jZGVmaW5lIENJRlJfRkxWTDAJKDB4ZmYgPDwgOCkJLyogRklGTyAwIGxldmVsIG1hc2sgKi8KLSNkZWZpbmUgQ0lGUl9USExfMAkoMHgzIDw8IDQpCS8qIFRocmVzaG9sZCBMZXZlbCBmb3IgQ2hhbm5lbCAwIEZJRk8gKi8KLSNkZWZpbmUgQ0lGUl9SRVNFVF9GCSgxIDw8IDMpCS8qIFJlc2V0IGlucHV0IEZJRk9zICovCi0jZGVmaW5lIENJRlJfRkVOMgkoMSA8PCAyKQkvKiBGSUZPIGVuYWJsZSBmb3IgY2hhbm5lbCAyICovCi0jZGVmaW5lIENJRlJfRkVOMQkoMSA8PCAxKQkvKiBGSUZPIGVuYWJsZSBmb3IgY2hhbm5lbCAxICovCi0jZGVmaW5lIENJRlJfRkVOMAkoMSA8PCAwKQkvKiBGSUZPIGVuYWJsZSBmb3IgY2hhbm5lbCAwICovCi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXNidmlkZW8vaWJtY2FtLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3VzYnZpZGVvL2libWNhbS5jCmluZGV4IGY4ZDg1ZGQuLmIwODU0OTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXNidmlkZW8vaWJtY2FtLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby91c2J2aWRlby9pYm1jYW0uYwpAQCAtMzc3OSw3ICszNzc5LDcgQEAKIAkJCWVycigiQWx0ZXJuYXRlIHNldHRpbmdzIGhhdmUgZGlmZmVyZW50IGVuZHBvaW50IGFkZHJlc3NlcyEiKTsKIAkJCXJldHVybiAtRU5PREVWOwogCQl9Ci0JCWlmICh1c2JfZW5kcG9pbnRfdHlwZShlbmRwb2ludCkgIT0gVVNCX0VORFBPSU5UX1hGRVJfSVNPQykgeworCQlpZiAoIXVzYl9lbmRwb2ludF94ZmVyX2lzb2MoZW5kcG9pbnQpKSB7CiAJCQllcnIoIkludGVyZmFjZSAlZC4gaGFzIG5vbi1JU08gZW5kcG9pbnQhIiwgaWZudW0pOwogCQkJcmV0dXJuIC1FTk9ERVY7CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXNidmlkZW8va29uaWNhd2MuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXNidmlkZW8va29uaWNhd2MuYwppbmRleCA5MGYwY2U2Li45MDBlYzIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3VzYnZpZGVvL2tvbmljYXdjLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby91c2J2aWRlby9rb25pY2F3Yy5jCkBAIC04MjMsNyArODIzLDcgQEAKIAkJCWVycigiQWx0ZXJuYXRlIHNldHRpbmdzIGhhdmUgZGlmZmVyZW50IGVuZHBvaW50IGFkZHJlc3NlcyEiKTsKIAkJCXJldHVybiAtRU5PREVWOwogCQl9Ci0JCWlmICh1c2JfZW5kcG9pbnRfdHlwZShlbmRwb2ludCkgIT0gVVNCX0VORFBPSU5UX1hGRVJfSVNPQykgeworCQlpZiAoIXVzYl9lbmRwb2ludF94ZmVyX2lzb2MoZW5kcG9pbnQpKSB7CiAJCQllcnIoIkludGVyZmFjZSAlZC4gaGFzIG5vbi1JU08gZW5kcG9pbnQhIiwKIAkJCSAgICBpbnRlcmZhY2UtPmRlc2MuYkludGVyZmFjZU51bWJlcik7CiAJCQlyZXR1cm4gLUVOT0RFVjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXNidmlkZW8vdWx0cmFjYW0uYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXNidmlkZW8vdWx0cmFjYW0uYwppbmRleCA4MzlhMDgyLi5mYmQxYjYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3VzYnZpZGVvL3VsdHJhY2FtLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby91c2J2aWRlby91bHRyYWNhbS5jCkBAIC01NTYsNyArNTU2LDcgQEAKIAkJCWVycigiQWx0ZXJuYXRlIHNldHRpbmdzIGhhdmUgZGlmZmVyZW50IGVuZHBvaW50IGFkZHJlc3NlcyEiKTsKIAkJCXJldHVybiAtRU5PREVWOwogCQl9Ci0JCWlmICh1c2JfZW5kcG9pbnRfdHlwZShlbmRwb2ludCkgIT0gVVNCX0VORFBPSU5UX1hGRVJfSVNPQykgeworCQlpZiAoIXVzYl9lbmRwb2ludF94ZmVyX2lzb2MoZW5kcG9pbnQpKSB7CiAJCQllcnIoIkludGVyZmFjZSAlZC4gaGFzIG5vbi1JU08gZW5kcG9pbnQhIiwKIAkJCSAgICBpbnRlcmZhY2UtPmRlc2MuYkludGVyZmFjZU51bWJlcik7CiAJCQlyZXR1cm4gLUVOT0RFVjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXNidmlzaW9uL3VzYnZpc2lvbi12aWRlby5jIGIvZHJpdmVycy9tZWRpYS92aWRlby91c2J2aXNpb24vdXNidmlzaW9uLXZpZGVvLmMKaW5kZXggMmJlNWU0Ny4uMjYyMmRlMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby91c2J2aXNpb24vdXNidmlzaW9uLXZpZGVvLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby91c2J2aXNpb24vdXNidmlzaW9uLXZpZGVvLmMKQEAgLTE2NzQsOCArMTY3NCw3IEBACiAJCWludGVyZmFjZSA9ICZkZXYtPmFjdGNvbmZpZy0+aW50ZXJmYWNlW2lmbnVtXS0+YWx0c2V0dGluZ1swXTsKIAl9CiAJZW5kcG9pbnQgPSAmaW50ZXJmYWNlLT5lbmRwb2ludFsxXS5kZXNjOwotCWlmICh1c2JfZW5kcG9pbnRfdHlwZShlbmRwb2ludCkgIT0KLQkgICAgVVNCX0VORFBPSU5UX1hGRVJfSVNPQykgeworCWlmICghdXNiX2VuZHBvaW50X3hmZXJfaXNvYyhlbmRwb2ludCkpIHsKIAkJZXJyKCIlczogaW50ZXJmYWNlICVkLiBoYXMgbm9uLUlTTyBlbmRwb2ludCEiLAogCQkgICAgX19mdW5jX18sIGlmbnVtKTsKIAkJZXJyKCIlczogRW5kcG9pbnQgYXR0cmlidXRlcyAlZCIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3Y0bDEtY29tcGF0LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3Y0bDEtY29tcGF0LmMKaW5kZXggZDQ1MGNhYi4uYjYxN2JmMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby92NGwxLWNvbXBhdC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdjRsMS1jb21wYXQuYwpAQCAtMjAzLDcgKzIwMyw2IEBACiAJdGFibGUgPSAmcHdxLT5wdDsKIAlmb3IgKDs7KSB7CiAJCWludCBtYXNrOwotCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwogCQltYXNrID0gZmlsZS0+Zl9vcC0+cG9sbChmaWxlLCB0YWJsZSk7CiAJCWlmIChtYXNrICYgUE9MTElOKQogCQkJYnJlYWs7CkBAIC0yMTIsOSArMjExLDggQEAKIAkJCXJldHZhbCA9IC1FUkVTVEFSVFNZUzsKIAkJCWJyZWFrOwogCQl9Ci0JCXNjaGVkdWxlKCk7CisJCXBvbGxfc2NoZWR1bGUocHdxLCBUQVNLX0lOVEVSUlVQVElCTEUpOwogCX0KLQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOwogCXBvbGxfZnJlZXdhaXQocHdxKTsKIAlyZXR1cm4gcmV0dmFsOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby92NGwyLWRldmljZS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby92NGwyLWRldmljZS5jCmluZGV4IDllZWZkZTAuLmNmOWQ0YzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdjRsMi1kZXZpY2UuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3Y0bDItZGV2aWNlLmMKQEAgLTI5LDcgKzI5LDcgQEAKIAlpZiAoZGV2ID09IE5VTEwgfHwgdjRsMl9kZXYgPT0gTlVMTCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAJLyogV2FybiBpZiB3ZSBhcHBhcmVudGx5IHJlLXJlZ2lzdGVyIGEgZGV2aWNlICovCi0JV0FSTl9PTihkZXZfZ2V0X2RydmRhdGEoZGV2KSk7CisJV0FSTl9PTihkZXZfZ2V0X2RydmRhdGEoZGV2KSAhPSBOVUxMKTsKIAlJTklUX0xJU1RfSEVBRCgmdjRsMl9kZXYtPnN1YmRldnMpOwogCXNwaW5fbG9ja19pbml0KCZ2NGwyX2Rldi0+bG9jayk7CiAJdjRsMl9kZXYtPmRldiA9IGRldjsKQEAgLTYxLDcgKzYxLDcgQEAKIAlpZiAoZGV2ID09IE5VTEwgfHwgc2QgPT0gTlVMTCB8fCAhc2QtPm5hbWVbMF0pCiAJCXJldHVybiAtRUlOVkFMOwogCS8qIFdhcm4gaWYgd2UgYXBwYXJlbnRseSByZS1yZWdpc3RlciBhIHN1YmRldiAqLwotCVdBUk5fT04oc2QtPmRldik7CisJV0FSTl9PTihzZC0+ZGV2ICE9IE5VTEwpOwogCWlmICghdHJ5X21vZHVsZV9nZXQoc2QtPm93bmVyKSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAJc2QtPmRldiA9IGRldjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdmlkZW9idWYtZG1hLXNnLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3ZpZGVvYnVmLWRtYS1zZy5jCmluZGV4IGJjNmQ1YWIuLmRhMTc5MGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdmlkZW9idWYtZG1hLXNnLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby92aWRlb2J1Zi1kbWEtc2cuYwpAQCAtMzg4LDggKzM4OCw3IEBACiAJcGFnZSA9IGFsbG9jX3BhZ2UoR0ZQX1VTRVIgfCBfX0dGUF9ETUEzMik7CiAJaWYgKCFwYWdlKQogCQlyZXR1cm4gVk1fRkFVTFRfT09NOwotCWNsZWFyX3VzZXJfcGFnZShwYWdlX2FkZHJlc3MocGFnZSksICh1bnNpZ25lZCBsb25nKXZtZi0+dmlydHVhbF9hZGRyZXNzLAotCQkJcGFnZSk7CisJY2xlYXJfdXNlcl9oaWdocGFnZShwYWdlLCAodW5zaWduZWQgbG9uZyl2bWYtPnZpcnR1YWxfYWRkcmVzcyk7CiAJdm1mLT5wYWdlID0gcGFnZTsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdzk5NjhjZi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby93OTk2OGNmLmMKaW5kZXggYTM5OTdiNy4uMTA1YTgzMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby93OTk2OGNmLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby93OTk2OGNmLmMKQEAgLTE1NTMsNyArMTU1Myw2IEBACiAKIAlzdGF0aWMgc3RydWN0IGkyY19hZGFwdGVyIGFkYXAgPSB7CiAJCS5pZCA9ICAgICAgICAgICAgICAgIEkyQ19IV19TTUJVU19XOTk2OENGLAotCQkuY2xhc3MgPSAgICAgICAgICAgICBJMkNfQ0xBU1NfQ0FNX0RJR0lUQUwsCiAJCS5vd25lciA9ICAgICAgICAgICAgIFRISVNfTU9EVUxFLAogCQkuY2xpZW50X3JlZ2lzdGVyID0gICB3OTk2OGNmX2kyY19hdHRhY2hfaW5mb3JtLAogCQkuY2xpZW50X3VucmVnaXN0ZXIgPSB3OTk2OGNmX2kyY19kZXRhY2hfaW5mb3JtLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZW1zdGljay9jb3JlL21lbXN0aWNrLmMgYi9kcml2ZXJzL21lbXN0aWNrL2NvcmUvbWVtc3RpY2suYwppbmRleCBjZWE0NjkwLi5hNWI0NDhlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lbXN0aWNrL2NvcmUvbWVtc3RpY2suYworKysgYi9kcml2ZXJzL21lbXN0aWNrL2NvcmUvbWVtc3RpY2suYwpAQCAtMzg1LDggKzM4NSw3IEBACiAKIAlpZiAoY2FyZCkgewogCQljYXJkLT5ob3N0ID0gaG9zdDsKLQkJc25wcmludGYoY2FyZC0+ZGV2LmJ1c19pZCwgc2l6ZW9mKGNhcmQtPmRldi5idXNfaWQpLAotCQkJICIlcyIsIGhvc3QtPmRldi5idXNfaWQpOworCQlkZXZfc2V0X25hbWUoJmNhcmQtPmRldiwgIiVzIiwgZGV2X25hbWUoJmhvc3QtPmRldikpOwogCQljYXJkLT5kZXYucGFyZW50ID0gJmhvc3QtPmRldjsKIAkJY2FyZC0+ZGV2LmJ1cyA9ICZtZW1zdGlja19idXNfdHlwZTsKIAkJY2FyZC0+ZGV2LnJlbGVhc2UgPSBtZW1zdGlja19mcmVlX2NhcmQ7CkBAIC01MTksNyArNTE4LDcgQEAKIAlpZiAocmMpCiAJCXJldHVybiByYzsKIAotCXNucHJpbnRmKGhvc3QtPmRldi5idXNfaWQsIEJVU19JRF9TSVpFLCAibWVtc3RpY2sldSIsIGhvc3QtPmlkKTsKKwlkZXZfc2V0X25hbWUoJmhvc3QtPmRldiwgIm1lbXN0aWNrJXUiLCBob3N0LT5pZCk7CiAKIAlyYyA9IGRldmljZV9hZGQoJmhvc3QtPmRldik7CiAJaWYgKHJjKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lbXN0aWNrL2NvcmUvbXNwcm9fYmxvY2suYyBiL2RyaXZlcnMvbWVtc3RpY2svY29yZS9tc3Byb19ibG9jay5jCmluZGV4IDc5MTExNTEuLjFmMWUzOTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVtc3RpY2svY29yZS9tc3Byb19ibG9jay5jCisrKyBiL2RyaXZlcnMvbWVtc3RpY2svY29yZS9tc3Byb19ibG9jay5jCkBAIC04ODcsMTQgKzg4NywxNCBAQAogCWlmIChyYykgewogCQlwcmludGsoS0VSTl9XQVJOSU5HCiAJCSAgICAgICAiJXM6IGNvdWxkIG5vdCBzd2l0Y2ggdG8gNC1iaXQgbW9kZSwgZXJyb3IgJWRcbiIsCi0JCSAgICAgICBjYXJkLT5kZXYuYnVzX2lkLCByYyk7CisJCSAgICAgICBkZXZfbmFtZSgmY2FyZC0+ZGV2KSwgcmMpOwogCQlyZXR1cm4gMDsKIAl9CiAKIAltc2ItPnN5c3RlbSA9IE1FTVNUSUNLX1NZU19QQVI0OwogCWhvc3QtPnNldF9wYXJhbShob3N0LCBNRU1TVElDS19JTlRFUkZBQ0UsIE1FTVNUSUNLX1BBUjQpOwogCXByaW50ayhLRVJOX0lORk8gIiVzOiBzd2l0Y2hpbmcgdG8gNC1iaXQgcGFyYWxsZWwgbW9kZVxuIiwKLQkgICAgICAgY2FyZC0+ZGV2LmJ1c19pZCk7CisJICAgICAgIGRldl9uYW1lKCZjYXJkLT5kZXYpKTsKIAogCWlmIChtc2ItPmNhcHMgJiBNRU1TVElDS19DQVBfUEFSOCkgewogCQlyYyA9IG1zcHJvX2Jsb2NrX3NldF9pbnRlcmZhY2UoY2FyZCwgTUVNU1RJQ0tfU1lTX1BBUjgpOwpAQCAtOTA1LDExICs5MDUsMTEgQEAKIAkJCQkJTUVNU1RJQ0tfUEFSOCk7CiAJCQlwcmludGsoS0VSTl9JTkZPCiAJCQkgICAgICAgIiVzOiBzd2l0Y2hpbmcgdG8gOC1iaXQgcGFyYWxsZWwgbW9kZVxuIiwKLQkJCSAgICAgICBjYXJkLT5kZXYuYnVzX2lkKTsKKwkJCSAgICAgICBkZXZfbmFtZSgmY2FyZC0+ZGV2KSk7CiAJCX0gZWxzZQogCQkJcHJpbnRrKEtFUk5fV0FSTklORwogCQkJICAgICAgICIlczogY291bGQgbm90IHN3aXRjaCB0byA4LWJpdCBtb2RlLCBlcnJvciAlZFxuIiwKLQkJCSAgICAgICBjYXJkLT5kZXYuYnVzX2lkLCByYyk7CisJCQkgICAgICAgZGV2X25hbWUoJmNhcmQtPmRldiksIHJjKTsKIAl9CiAKIAljYXJkLT5uZXh0X3JlcXVlc3QgPSBoX21zcHJvX2Jsb2NrX3JlcV9pbml0OwpAQCAtOTIyLDcgKzkyMiw3IEBACiAJaWYgKHJjKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcKIAkJICAgICAgICIlczogaW50ZXJmYWNlIGVycm9yLCB0cnlpbmcgdG8gZmFsbCBiYWNrIHRvIHNlcmlhbFxuIiwKLQkJICAgICAgIGNhcmQtPmRldi5idXNfaWQpOworCQkgICAgICAgZGV2X25hbWUoJmNhcmQtPmRldikpOwogCQltc2ItPnN5c3RlbSA9IE1FTVNUSUNLX1NZU19TRVJJQUw7CiAJCWhvc3QtPnNldF9wYXJhbShob3N0LCBNRU1TVElDS19QT1dFUiwgTUVNU1RJQ0tfUE9XRVJfT0ZGKTsKIAkJbXNsZWVwKDEwKTsKQEAgLTk5MiwxNCArOTkyLDE0IEBACiAKIAlpZiAoYmUxNl90b19jcHUoYXR0ci0+c2lnbmF0dXJlKSAhPSBNU1BST19CTE9DS19TSUdOQVRVUkUpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogdW5yZWNvZ25pemVkIGRldmljZSBzaWduYXR1cmUgJXhcbiIsCi0JCSAgICAgICBjYXJkLT5kZXYuYnVzX2lkLCBiZTE2X3RvX2NwdShhdHRyLT5zaWduYXR1cmUpKTsKKwkJICAgICAgIGRldl9uYW1lKCZjYXJkLT5kZXYpLCBiZTE2X3RvX2NwdShhdHRyLT5zaWduYXR1cmUpKTsKIAkJcmMgPSAtRU5PREVWOwogCQlnb3RvIG91dF9mcmVlX2F0dHI7CiAJfQogCiAJaWYgKGF0dHItPmNvdW50ID4gTVNQUk9fQkxPQ0tfTUFYX0FUVFJJQlVURVMpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHdheSB0b28gbWFueSBhdHRyaWJ1dGUgZW50cmllc1xuIiwKLQkJICAgICAgIGNhcmQtPmRldi5idXNfaWQpOworCQkgICAgICAgZGV2X25hbWUoJmNhcmQtPmRldikpOwogCQlhdHRyX2NvdW50ID0gTVNQUk9fQkxPQ0tfTUFYX0FUVFJJQlVURVM7CiAJfSBlbHNlCiAJCWF0dHJfY291bnQgPSBhdHRyLT5jb3VudDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVtc3RpY2svaG9zdC90aWZtX21zLmMgYi9kcml2ZXJzL21lbXN0aWNrL2hvc3QvdGlmbV9tcy5jCmluZGV4IGQzMmQ2YWQuLjAzZjcxYTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVtc3RpY2svaG9zdC90aWZtX21zLmMKKysrIGIvZHJpdmVycy9tZW1zdGljay9ob3N0L3RpZm1fbXMuYwpAQCAtNTQ2LDcgKzU0Niw3IEBACiAJcHJpbnRrKEtFUk5fRVJSCiAJICAgICAgICIlcyA6IGNhcmQgZmFpbGVkIHRvIHJlc3BvbmQgZm9yIGEgbG9uZyBwZXJpb2Qgb2YgdGltZSAiCiAJICAgICAgICIoJXgsICV4KVxuIiwKLQkgICAgICAgaG9zdC0+ZGV2LT5kZXYuYnVzX2lkLCBob3N0LT5yZXEgPyBob3N0LT5yZXEtPnRwYyA6IDAsCisJICAgICAgIGRldl9uYW1lKCZob3N0LT5kZXYtPmRldiksIGhvc3QtPnJlcSA/IGhvc3QtPnJlcS0+dHBjIDogMCwKIAkgICAgICAgaG9zdC0+Y21kX2ZsYWdzKTsKIAogCXRpZm1fZWplY3QoaG9zdC0+ZGV2KTsKQEAgLTU2MSw3ICs1NjEsNyBAQAogCWlmICghKFRJRk1fU09DS19TVEFURV9PQ0NVUElFRAogCSAgICAgICYgcmVhZGwoc29jay0+YWRkciArIFNPQ0tfUFJFU0VOVF9TVEFURSkpKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzIDogY2FyZCBnb25lLCB1bmV4cGVjdGVkbHlcbiIsCi0JCSAgICAgICBzb2NrLT5kZXYuYnVzX2lkKTsKKwkJICAgICAgIGRldl9uYW1lKCZzb2NrLT5kZXYpKTsKIAkJcmV0dXJuIHJjOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRjdGwuYyBiL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0Y3RsLmMKaW5kZXggYjg5ZjQ3Ni4uYzYzODE3MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRjdGwuYworKysgYi9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdGN0bC5jCkBAIC0zMDgsMTAgKzMwOCwxMSBAQAogewogCWludCByYyA9IDE7CiAKLQlkY3RscHJpbnRrKGlvY3RsLT5pb2MsIHByaW50ayhNWUlPQ19zX0RFQlVHX0ZNVCAiOiBUaW1lb3V0IEV4cGlyZWQhIEhvc3QgJWRcbiIsCi0JCQkJaW9jdGwtPmlvYy0+bmFtZSwgaW9jdGwtPmlvYy0+aWQpKTsKIAlpZiAoaW9jdGwgPT0gTlVMTCkKIAkJcmV0dXJuOworCWRjdGxwcmludGsoaW9jdGwtPmlvYywKKwkJICAgcHJpbnRrKE1ZSU9DX3NfREVCVUdfRk1UICI6IFRpbWVvdXQgRXhwaXJlZCEgSG9zdCAlZFxuIiwKKwkJICAgaW9jdGwtPmlvYy0+bmFtZSwgaW9jdGwtPmlvYy0+aWQpKTsKIAogCWlvY3RsLT53YWl0X2RvbmUgPSAwOwogCWlmIChpb2N0bC0+cmVzZXQgJiBNUFRDVExfUkVTRVRfT0spCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdGxhbi5jIGIvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRsYW4uYwppbmRleCBhMTNmNmVlLi5jMjgwNGYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdGxhbi5jCisrKyBiL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0bGFuLmMKQEAgLTEwNiw3ICsxMDYsNiBAQAogCiAJdTMyIHRvdGFsX3Bvc3RlZDsKIAl1MzIgdG90YWxfcmVjZWl2ZWQ7Ci0Jc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CS8qIFBlciBkZXZpY2Ugc3RhdGlzdGljcyAqLwogCiAJc3RydWN0IGRlbGF5ZWRfd29yayBwb3N0X2J1Y2tldHNfdGFzazsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OwpAQCAtNTQ4LDE1ICs1NDcsNiBAQAogfQogCiAvKj0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPSovCi1zdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKgotbXB0X2xhbl9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgbXB0X2xhbl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQotCXJldHVybiAoc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKikgJnByaXYtPnN0YXRzOwotfQotCi0vKj0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPSovCiBzdGF0aWMgaW50CiBtcHRfbGFuX2NoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG5ld19tdHUpCiB7CkBAIC01OTQsOCArNTg0LDggQEAKIAljdHggPSBHRVRfTEFOX0JVRkZFUl9DT05URVhUKHRtc2cpOwogCXNlbnQgPSBwcml2LT5TZW5kQ3RsW2N0eF0uc2tiOwogCi0JcHJpdi0+c3RhdHMudHhfcGFja2V0cysrOwotCXByaXYtPnN0YXRzLnR4X2J5dGVzICs9IHNlbnQtPmxlbjsKKwlkZXYtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwlkZXYtPnN0YXRzLnR4X2J5dGVzICs9IHNlbnQtPmxlbjsKIAogCWRpb3ByaW50aygoS0VSTl9JTkZPIE1ZTkFNICI6ICVzLyVzOiBAJXMsIHNrYiAlcCBzZW50LlxuIiwKIAkJCUlPQ19BTkRfTkVUREVWX05BTUVTX3NfcyhkZXYpLApAQCAtNjM2LDcgKzYyNiw3IEBACiAKIAlzd2l0Y2ggKGxlMTZfdG9fY3B1KHBTZW5kUmVwLT5JT0NTdGF0dXMpICYgTVBJX0lPQ1NUQVRVU19NQVNLKSB7CiAJY2FzZSBNUElfSU9DU1RBVFVTX1NVQ0NFU1M6Ci0JCXByaXYtPnN0YXRzLnR4X3BhY2tldHMgKz0gY291bnQ7CisJCWRldi0+c3RhdHMudHhfcGFja2V0cyArPSBjb3VudDsKIAkJYnJlYWs7CiAKIAljYXNlIE1QSV9JT0NTVEFUVVNfTEFOX0NBTkNFTEVEOgpAQCAtNjQ0LDEzICs2MzQsMTMgQEAKIAkJYnJlYWs7CiAKIAljYXNlIE1QSV9JT0NTVEFUVVNfSU5WQUxJRF9TR0w6Ci0JCXByaXYtPnN0YXRzLnR4X2Vycm9ycyArPSBjb3VudDsKKwkJZGV2LT5zdGF0cy50eF9lcnJvcnMgKz0gY291bnQ7CiAJCXByaW50ayAoS0VSTl9FUlIgTVlOQU0gIjogJXMvJXM6IEVSUk9SIC0gSW52YWxpZCBTR0wgc2VudCB0byBJT0MhXG4iLAogCQkJCUlPQ19BTkRfTkVUREVWX05BTUVTX3NfcyhkZXYpKTsKIAkJZ290byBvdXQ7CiAKIAlkZWZhdWx0OgotCQlwcml2LT5zdGF0cy50eF9lcnJvcnMgKz0gY291bnQ7CisJCWRldi0+c3RhdHMudHhfZXJyb3JzICs9IGNvdW50OwogCQlicmVhazsKIAl9CiAKQEAgLTY2MSw3ICs2NTEsNyBAQAogCQljdHggPSBHRVRfTEFOX0JVRkZFUl9DT05URVhUKGxlMzJfdG9fY3B1KCpwQ29udGV4dCkpOwogCiAJCXNlbnQgPSBwcml2LT5TZW5kQ3RsW2N0eF0uc2tiOwotCQlwcml2LT5zdGF0cy50eF9ieXRlcyArPSBzZW50LT5sZW47CisJCWRldi0+c3RhdHMudHhfYnl0ZXMgKz0gc2VudC0+bGVuOwogCiAJCWRpb3ByaW50aygoS0VSTl9JTkZPIE1ZTkFNICI6ICVzLyVzOiBAJXMsIHNrYiAlcCBzZW50LlxuIiwKIAkJCQlJT0NfQU5EX05FVERFVl9OQU1FU19zX3MoZGV2KSwKQEAgLTg0Miw4ICs4MzIsOCBAQAogCQkgImRlbGl2ZXJlZCB0byB1cHBlciBsZXZlbC5cbiIsCiAJCQlJT0NfQU5EX05FVERFVl9OQU1FU19zX3MoZGV2KSwgc2tiLT5sZW4pKTsKIAotCXByaXYtPnN0YXRzLnJ4X2J5dGVzICs9IHNrYi0+bGVuOwotCXByaXYtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwlkZXYtPnN0YXRzLnJ4X2J5dGVzICs9IHNrYi0+bGVuOworCWRldi0+c3RhdHMucnhfcGFja2V0cysrOwogCiAJc2tiLT5kZXYgPSBkZXY7CiAJbmV0aWZfcngoc2tiKTsKQEAgLTEzMDgsNiArMTI5OCwxNCBAQAogCQkJCQkJICBwb3N0X2J1Y2tldHNfdGFzay53b3JrKSk7CiB9CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgbXB0X25ldGRldl9vcHMgPSB7CisJLm5kb19vcGVuICAgICAgID0gbXB0X2xhbl9vcGVuLAorCS5uZG9fc3RvcCAgICAgICA9IG1wdF9sYW5fY2xvc2UsCisJLm5kb19zdGFydF94bWl0ID0gbXB0X2xhbl9zZHVfc2VuZCwKKwkubmRvX2NoYW5nZV9tdHUgPSBtcHRfbGFuX2NoYW5nZV9tdHUsCisJLm5kb190eF90aW1lb3V0ID0gbXB0X2xhbl90eF90aW1lb3V0LAorfTsKKwogLyo9LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0qLwogc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICoKIG1wdF9yZWdpc3Rlcl9sYW5fZGV2aWNlIChNUFRfQURBUFRFUiAqbXB0X2RldiwgaW50IHBudW0pCkBAIC0xMzcyLDE1ICsxMzcwLDcgQEAKIAlwcml2LT50eF9tYXhfb3V0ID0gKHR4X21heF9vdXRfcCA8PSBNUFRfVFhfTUFYX09VVF9MSU0pID8KIAkJCSAgICB0eF9tYXhfb3V0X3AgOiBNUFRfVFhfTUFYX09VVF9MSU07CiAKLQlkZXYtPm9wZW4gPSBtcHRfbGFuX29wZW47Ci0JZGV2LT5zdG9wID0gbXB0X2xhbl9jbG9zZTsKLQlkZXYtPmdldF9zdGF0cyA9IG1wdF9sYW5fZ2V0X3N0YXRzOwotCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gTlVMTDsKLQlkZXYtPmNoYW5nZV9tdHUgPSBtcHRfbGFuX2NoYW5nZV9tdHU7Ci0JZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBtcHRfbGFuX3NkdV9zZW5kOwotCi0vKiBOb3QgaW4gMi4zLjQyLiBOZWVkIDIuMy40NSsgKi8KLQlkZXYtPnR4X3RpbWVvdXQgPSBtcHRfbGFuX3R4X3RpbWVvdXQ7CisJZGV2LT5uZXRkZXZfb3BzID0gJm1wdF9uZXRkZXZfb3BzOwogCWRldi0+d2F0Y2hkb2dfdGltZW8gPSBNUFRfTEFOX1RYX1RJTUVPVVQ7CiAKIAlkbHByaW50aygoS0VSTl9JTkZPIE1ZTkFNICI6IEZpbmlzaGVkIHJlZ2lzdGVyaW5nIGRldiAiCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lc3NhZ2UvaTJvL2RldmljZS5jIGIvZHJpdmVycy9tZXNzYWdlL2kyby9kZXZpY2UuYwppbmRleCA1NGMyZTlhLi4wZWU0MjY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lc3NhZ2UvaTJvL2RldmljZS5jCisrKyBiL2RyaXZlcnMvbWVzc2FnZS9pMm8vZGV2aWNlLmMKQEAgLTUyLDcgKzUyLDYgQEAKIC8qKgogICoJaTJvX2RldmljZV9jbGFpbSAtIGNsYWltIGEgZGV2aWNlIGZvciB1c2UgYnkgYW4gT1NNCiAgKglAZGV2OiBJMk8gZGV2aWNlIHRvIGNsYWltCi0gKglAZHJ2OiBJMk8gZHJpdmVyIHdoaWNoIHdhbnRzIHRvIGNsYWltIHRoZSBkZXZpY2UKICAqCiAgKglEbyB0aGUgbGVnIHdvcmsgdG8gYXNzaWduIGEgZGV2aWNlIHRvIGEgZ2l2ZW4gT1NNLiBJZiB0aGUgY2xhaW0gc3VjY2VlZHMsCiAgKgl0aGUgb3duZXIgaXMgdGhlIHByaW1hcnkuIElmIHRoZSBhdHRlbXB0IGZhaWxzIGEgbmVnYXRpdmUgZXJybm8gY29kZQpAQCAtODAsNyArNzksNiBAQAogLyoqCiAgKglpMm9fZGV2aWNlX2NsYWltX3JlbGVhc2UgLSByZWxlYXNlIGEgZGV2aWNlIHRoYXQgdGhlIE9TTSBpcyB1c2luZwogICoJQGRldjogZGV2aWNlIHRvIHJlbGVhc2UKLSAqCUBkcnY6IGRyaXZlciB3aGljaCBjbGFpbWVkIHRoZSBkZXZpY2UKICAqCiAgKglEcm9wIGEgY2xhaW0gYnkgYW4gT1NNIG9uIGEgZ2l2ZW4gSTJPIGRldmljZS4KICAqCkBAIC0xMzQsNyArMTMyLDcgQEAKIHsKIAlzdHJ1Y3QgaTJvX2RldmljZSAqaTJvX2RldiA9IHRvX2kyb19kZXZpY2UoZGV2KTsKIAotCXByX2RlYnVnKCJpMm86IGRldmljZSAlcyByZWxlYXNlZFxuIiwgZGV2LT5idXNfaWQpOworCXByX2RlYnVnKCJpMm86IGRldmljZSAlcyByZWxlYXNlZFxuIiwgZGV2X25hbWUoZGV2KSk7CiAKIAlrZnJlZShpMm9fZGV2KTsKIH0KQEAgLTIyOSw4ICsyMjcsOCBAQAogCiAJaTJvX2Rldi0+bGN0X2RhdGEgPSAqZW50cnk7CiAKLQlzbnByaW50ZihpMm9fZGV2LT5kZXZpY2UuYnVzX2lkLCBCVVNfSURfU0laRSwgIiVkOiUwM3giLCBjLT51bml0LAotCQkgaTJvX2Rldi0+bGN0X2RhdGEudGlkKTsKKwlkZXZfc2V0X25hbWUoJmkyb19kZXYtPmRldmljZSwgIiVkOiUwM3giLCBjLT51bml0LAorCQkgICAgIGkyb19kZXYtPmxjdF9kYXRhLnRpZCk7CiAKIAlpMm9fZGV2LT5pb3AgPSBjOwogCWkyb19kZXYtPmRldmljZS5wYXJlbnQgPSAmYy0+ZGV2aWNlOwpAQCAtMjgxLDcgKzI3OSw3IEBACiAKIAlpMm9fZHJpdmVyX25vdGlmeV9kZXZpY2VfYWRkX2FsbChpMm9fZGV2KTsKIAotCXByX2RlYnVnKCJpMm86IGRldmljZSAlcyBhZGRlZFxuIiwgaTJvX2Rldi0+ZGV2aWNlLmJ1c19pZCk7CisJcHJfZGVidWcoImkybzogZGV2aWNlICVzIGFkZGVkXG4iLCBkZXZfbmFtZSgmaTJvX2Rldi0+ZGV2aWNlKSk7CiAKIAlyZXR1cm4gMDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZXNzYWdlL2kyby9kcml2ZXIuYyBiL2RyaXZlcnMvbWVzc2FnZS9pMm8vZHJpdmVyLmMKaW5kZXggZTBkNDc0Yi4uYTA0MjFlZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZXNzYWdlL2kyby9kcml2ZXIuYworKysgYi9kcml2ZXJzL21lc3NhZ2UvaTJvL2RyaXZlci5jCkBAIC0xNzMsNyArMTczLDYgQEAKICAqCWkyb19kcml2ZXJfZGlzcGF0Y2ggLSBkaXNwYXRjaCBhbiBJMk8gcmVwbHkgbWVzc2FnZQogICoJQGM6IEkyTyBjb250cm9sbGVyIG9mIHRoZSBtZXNzYWdlCiAgKglAbTogSTJPIG1lc3NhZ2UgbnVtYmVyCi0gKglAbXNnOiBJMk8gbWVzc2FnZSB0byBiZSBkZWxpdmVyZWQKICAqCiAgKglUaGUgcmVwbHkgaXMgZGVsaXZlcmVkIHRvIHRoZSBkcml2ZXIgZnJvbSB3aGljaCB0aGUgb3JpZ2luYWwgbWVzc2FnZQogICoJd2FzLiBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgY2FsbGVkIGZyb20gaW50ZXJydXB0IGNvbnRleHQuCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lc3NhZ2UvaTJvL2V4ZWMtb3NtLmMgYi9kcml2ZXJzL21lc3NhZ2UvaTJvL2V4ZWMtb3NtLmMKaW5kZXggNTZmYWVmMS4uMDZjNjU1YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZXNzYWdlL2kyby9leGVjLW9zbS5jCisrKyBiL2RyaXZlcnMvbWVzc2FnZS9pMm8vZXhlYy1vc20uYwpAQCAtMTksNyArMTksNyBAQAogICoJCUF1dm8gSMOka2tpbmVuIDxBdXZvLkhha2tpbmVuQGNzLkhlbHNpbmtpLkZJPgogICoJCURlZXBhayBTYXhlbmEgPGRlZXBha0BwbGV4aXR5Lm5ldD4KICAqCQlCb2ppIFQgS2FubmFudGhhbmFtIDxib2ppLnQua2FubmFudGhhbmFtQGludGVsLmNvbT4KLSAqCQlBbGFuIENveCA8YWxhbkByZWRoYXQuY29tPjoKKyAqCQlBbGFuIENveCA8YWxhbkBseG9yZ3VrLnVrdXUub3JnLnVrPjoKICAqCQkJUG9ydGVkIHRvIExpbnV4IDIuNS4KICAqCQlNYXJrdXMgTGlkZWwgPE1hcmt1cy5MaWRlbEBzaGFkb3djb25uZWN0LmNvbT46CiAgKgkJCU1pbm9yIGZpeGVzIGZvciAyLjYuCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lc3NhZ2UvaTJvL2kyb19jb25maWcuYyBiL2RyaXZlcnMvbWVzc2FnZS9pMm8vaTJvX2NvbmZpZy5jCmluZGV4IGYzMzg0YzMuLmVmYmE3MDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVzc2FnZS9pMm8vaTJvX2NvbmZpZy5jCisrKyBiL2RyaXZlcnMvbWVzc2FnZS9pMm8vaTJvX2NvbmZpZy5jCkBAIC0xOSw3ICsxOSw3IEBACiAgKgkJQ2hhbmdlZCBpb2N0bF9zd2RsKCksIGltcGxlbWVudGVkIGlvY3RsX3N3dWwoKSBhbmQgaW9jdGxfc3dkZWwoKQogICoJRGVlcGFrIFNheGVuYSAoMTEvMTgvMTk5OSk6CiAgKgkJQWRkZWQgZXZlbnQgbWFuYWdtZW5ldCBzdXBwb3J0Ci0gKglBbGFuIENveCA8YWxhbkByZWRoYXQuY29tPjoKKyAqCUFsYW4gQ294IDxhbGFuQGx4b3JndWsudWt1dS5vcmcudWs+OgogICoJCTIuNCByZXdyaXRlIHBvcnRlZCB0byAyLjUKICAqCU1hcmt1cyBMaWRlbCA8TWFya3VzLkxpZGVsQHNoYWRvd2Nvbm5lY3QuY29tPjoKICAqCQlBZGRlZCBwYXNzLXRocnUgc3VwcG9ydCBmb3IgQWRhcHRlYydzIHJhaWR1dGlscwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZXNzYWdlL2kyby9pMm9fcHJvYy5jIGIvZHJpdmVycy9tZXNzYWdlL2kyby9pMm9fcHJvYy5jCmluZGV4IDU0YTMwMTYuLjlhMzZiNWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVzc2FnZS9pMm8vaTJvX3Byb2MuYworKysgYi9kcml2ZXJzL21lc3NhZ2UvaTJvL2kyb19wcm9jLmMKQEAgLTEzMDAsNyArMTMwMCw3IEBACiB7CiAJc3RydWN0IGkyb19kZXZpY2UgKmQgPSAoc3RydWN0IGkyb19kZXZpY2UgKilzZXEtPnByaXZhdGU7CiAKLQlzZXFfcHJpbnRmKHNlcSwgIiVzXG4iLCBkLT5kZXZpY2UuYnVzX2lkKTsKKwlzZXFfcHJpbnRmKHNlcSwgIiVzXG4iLCBkZXZfbmFtZSgmZC0+ZGV2aWNlKSk7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVzc2FnZS9pMm8vaTJvX3Njc2kuYyBiL2RyaXZlcnMvbWVzc2FnZS9pMm8vaTJvX3Njc2kuYwppbmRleCAxYmNkYmJiLi4zZDQ1ODE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lc3NhZ2UvaTJvL2kyb19zY3NpLmMKKysrIGIvZHJpdmVycy9tZXNzYWdlL2kyby9pMm9fc2NzaS5jCkBAIC0zOTAsNyArMzkwLDcgQEAKICAqCUBpMm9fZGV2OiB0aGUgSTJPIGRldmljZSB3aGljaCB3YXMgYWRkZWQKICAqCiAgKglJZiBhIEkyTyBkZXZpY2UgaXMgYWRkZWQgd2UgY2F0Y2ggdGhlIG5vdGlmaWNhdGlvbiwgYmVjYXVzZSBJMk8gY2xhc3NlcwotICoJb3RoZXIgdGhlbiBTQ1NJIHBlcmlwaGVyYWwgd2lsbCBub3QgYmUgcmVjZWl2ZWQgdGhyb3VnaAorICoJb3RoZXIgdGhhbiBTQ1NJIHBlcmlwaGVyYWwgd2lsbCBub3QgYmUgcmVjZWl2ZWQgdGhyb3VnaAogICoJaTJvX3Njc2lfcHJvYmUoKS4KICAqLwogc3RhdGljIHZvaWQgaTJvX3Njc2lfbm90aWZ5X2RldmljZV9hZGQoc3RydWN0IGkyb19kZXZpY2UgKmkyb19kZXYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lc3NhZ2UvaTJvL2lvcC5jIGIvZHJpdmVycy9tZXNzYWdlL2kyby9pb3AuYwppbmRleCA2ZTUzYTMwLi4yN2NmNGFmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lc3NhZ2UvaTJvL2lvcC5jCisrKyBiL2RyaXZlcnMvbWVzc2FnZS9pMm8vaW9wLmMKQEAgLTE5LDcgKzE5LDcgQEAKICAqCQlBdXZvIEjDpGtraW5lbiA8QXV2by5IYWtraW5lbkBjcy5IZWxzaW5raS5GST4KICAqCQlEZWVwYWsgU2F4ZW5hIDxkZWVwYWtAcGxleGl0eS5uZXQ+CiAgKgkJQm9qaSBUIEthbm5hbnRoYW5hbSA8Ym9qaS50Lmthbm5hbnRoYW5hbUBpbnRlbC5jb20+Ci0gKgkJQWxhbiBDb3ggPGFsYW5AcmVkaGF0LmNvbT46CisgKgkJQWxhbiBDb3ggPGFsYW5AbHhvcmd1ay51a3V1Lm9yZy51az46CiAgKgkJCVBvcnRlZCB0byBMaW51eCAyLjUuCiAgKgkJTWFya3VzIExpZGVsIDxNYXJrdXMuTGlkZWxAc2hhZG93Y29ubmVjdC5jb20+OgogICoJCQlNaW5vciBmaXhlcyBmb3IgMi42LgpAQCAtMTA3Miw3ICsxMDcyLDcgQEAKIAogCWMtPmRldmljZS5yZWxlYXNlID0gJmkyb19pb3BfcmVsZWFzZTsKIAotCXNucHJpbnRmKGMtPmRldmljZS5idXNfaWQsIEJVU19JRF9TSVpFLCAiaW9wJWQiLCBjLT51bml0KTsKKwlkZXZfc2V0X25hbWUoJmMtPmRldmljZSwgImlvcCVkIiwgYy0+dW5pdCk7CiAKICNpZiBCSVRTX1BFUl9MT05HID09IDY0CiAJc3Bpbl9sb2NrX2luaXQoJmMtPmNvbnRleHRfbGlzdF9sb2NrKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVzc2FnZS9pMm8vcGNpLmMgYi9kcml2ZXJzL21lc3NhZ2UvaTJvL3BjaS5jCmluZGV4IDYxMGVmMTIuLjI1ZDZmMjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVzc2FnZS9pMm8vcGNpLmMKKysrIGIvZHJpdmVycy9tZXNzYWdlL2kyby9wY2kuYwpAQCAtMTksNyArMTksNyBAQAogICoJCUF1dm8gSMOka2tpbmVuIDxBdXZvLkhha2tpbmVuQGNzLkhlbHNpbmtpLkZJPgogICoJCURlZXBhayBTYXhlbmEgPGRlZXBha0BwbGV4aXR5Lm5ldD4KICAqCQlCb2ppIFQgS2FubmFudGhhbmFtIDxib2ppLnQua2FubmFudGhhbmFtQGludGVsLmNvbT4KLSAqCQlBbGFuIENveCA8YWxhbkByZWRoYXQuY29tPjoKKyAqCQlBbGFuIENveCA8YWxhbkBseG9yZ3VrLnVrdXUub3JnLnVrPjoKICAqCQkJUG9ydGVkIHRvIExpbnV4IDIuNS4KICAqCQlNYXJrdXMgTGlkZWwgPE1hcmt1cy5MaWRlbEBzaGFkb3djb25uZWN0LmNvbT46CiAgKgkJCU1pbm9yIGZpeGVzIGZvciAyLjYuCmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC9LY29uZmlnIGIvZHJpdmVycy9tZmQvS2NvbmZpZwppbmRleCAyNTcyNzczLi40MTZmOWU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21mZC9LY29uZmlnCisrKyBiL2RyaXZlcnMvbWZkL0tjb25maWcKQEAgLTM0LDYgKzM0LDE0IEBACiAJICBUaGlzIGRyaXZlciBzdXBwb3J0cyB0aGUgQVNJQzMgbXVsdGlmdW5jdGlvbiBjaGlwIGZvdW5kIG9uIG1hbnkKIAkgIFBEQXMgKG1haW5seSBpUEFRIGFuZCBIVEMgYmFzZWQgb25lcykKIAorY29uZmlnIE1GRF9ETTM1NUVWTV9NU1AKKwlib29sICJEYVZpbmNpIERNMzU1IEVWTSBtaWNyb2NvbnRyb2xsZXIiCisJZGVwZW5kcyBvbiBJMkMgJiYgTUFDSF9EQVZJTkNJX0RNMzU1X0VWTQorCWhlbHAKKwkgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIHRoZSBNU1A0MzAgbWljcm9jb250cm9sbGVyIHVzZWQgb24gdGhlc2UKKwkgIGJvYXJkcy4gIE1TUDQzMCBmaXJtd2FyZSBtYW5hZ2VzIHJlc2V0cyBhbmQgcG93ZXIgc2VxdWVuY2luZywKKwkgIGlucHV0cyBmcm9tIGJ1dHRvbnMgYW5kIHRoZSBJUiByZW1vdGUsIExFRHMsIGFuIFJUQywgYW5kIG1vcmUuCisKIGNvbmZpZyBIVENfRUdQSU8KIAlib29sICJIVEMgRUdQSU8gc3VwcG9ydCIKIAlkZXBlbmRzIG9uIEdFTkVSSUNfSEFSRElSUVMgJiYgR1BJT0xJQiAmJiBBUk0KQEAgLTYxLDkgKzY5LDMyIEBACiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKIAkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCB1Y2IxNDAwX2NvcmUuCiAKK2NvbmZpZyBUUFM2NTAxMAorCXRyaXN0YXRlICJUUFM2NTAxeCBQb3dlciBNYW5hZ2VtZW50IGNoaXBzIgorCWRlcGVuZHMgb24gSTJDICYmIEdQSU9MSUIKKwlkZWZhdWx0IHkgaWYgTUFDSF9PTUFQX0gyIHx8IE1BQ0hfT01BUF9IMyB8fCBNQUNIX09NQVBfT1NLCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZSBUUFM2NTAxeCBzZXJpZXMgb2YKKwkgIFBvd2VyIE1hbmFnZW1lbnQgY2hpcHMuICBUaGVzZSBpbmNsdWRlIHZvbHRhZ2UgcmVndWxhdG9ycywKKwkgIGxpdGhpdW0gaW9uL3BvbHltZXIgYmF0dGVyeSBjaGFyZ2luZywgYW5kIG90aGVyIGZlYXR1cmVzIHRoYXQKKwkgIGFyZSBvZnRlbiB1c2VkIGluIHBvcnRhYmxlIGRldmljZXMgbGlrZSBjZWxsIHBob25lcyBhbmQgY2FtZXJhcy4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgdHBzNjUwMTAuCisKK2NvbmZpZyBNRU5FTEFVUworCWJvb2wgIlRleGFzIEluc3RydW1lbnRzIFRXTDkyMzMwL01lbmVsYXVzIFBNIGNoaXAiCisJZGVwZW5kcyBvbiBJMkM9eSAmJiBBUkNIX09NQVAyNFhYCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZSBUZXhhcyBJbnN0cnVtZW50cworCSAgVFdMOTIzMzAvTWVuZWxhdXMgUG93ZXIgTWFuYWdlbWVudCBjaGlwLiBUaGlzIGluY2x1ZGUgdm9sdGFnZQorCSAgcmVndWxhdG9ycywgRHVhbCBzbG90IG1lbW9yeSBjYXJkIHRyYW5jZWl2ZXJzLCByZWFsLXRpbWUgY2xvY2sKKwkgIGFuZCBvdGhlciBmZWF0dXJlcyB0aGF0IGFyZSBvZnRlbiB1c2VkIGluIHBvcnRhYmxlIGRldmljZXMgbGlrZQorCSAgY2VsbCBwaG9uZXMgYW5kIFBEQXMuCisKIGNvbmZpZyBUV0w0MDMwX0NPUkUKIAlib29sICJUZXhhcyBJbnN0cnVtZW50cyBUV0w0MDMwL1RQUzY1OXgwIFN1cHBvcnQiCi0JZGVwZW5kcyBvbiBJMkM9eSAmJiBHRU5FUklDX0hBUkRJUlFTICYmIChBUkNIX09NQVAyIHx8IEFSQ0hfT01BUDMpCisJZGVwZW5kcyBvbiBJMkM9eSAmJiBHRU5FUklDX0hBUkRJUlFTCiAJaGVscAogCSAgU2F5IHllcyBoZXJlIGlmIHlvdSBoYXZlIFRXTDQwMzAgZmFtaWx5IGNoaXAgb24geW91ciBib2FyZC4KIAkgIFRoaXMgY29yZSBkcml2ZXIgcHJvdmlkZXMgcmVnaXN0ZXIgYWNjZXNzIGFuZCBJUlEgaGFuZGxpbmcKQEAgLTExNiw2ICsxNDcsNyBAQAogCiBjb25maWcgTUZEX1dNODQwMAogCXRyaXN0YXRlICJTdXBwb3J0IFdvbGZzb24gTWljcm9lbGVjdHJvbmljcyBXTTg0MDAiCisJc2VsZWN0IE1GRF9DT1JFCiAJZGVwZW5kcyBvbiBJMkMKIAloZWxwCiAJICBTdXBwb3J0IGZvciB0aGUgV29sZnNvbiBNaWNyb2VsZWNyb25pY3MgV004NDAwIFBNSUMgYW5kIGF1ZGlvCkBAIC0xNDIsNiArMTc0LDM4IEBACiAJYm9vbAogCWRlcGVuZHMgb24gTUZEX1dNODM1MAogCitjb25maWcgTUZEX1dNODM1MV9DT05GSUdfTU9ERV8wCisJYm9vbAorCWRlcGVuZHMgb24gTUZEX1dNODM1MAorCitjb25maWcgTUZEX1dNODM1MV9DT05GSUdfTU9ERV8xCisJYm9vbAorCWRlcGVuZHMgb24gTUZEX1dNODM1MAorCitjb25maWcgTUZEX1dNODM1MV9DT05GSUdfTU9ERV8yCisJYm9vbAorCWRlcGVuZHMgb24gTUZEX1dNODM1MAorCitjb25maWcgTUZEX1dNODM1MV9DT05GSUdfTU9ERV8zCisJYm9vbAorCWRlcGVuZHMgb24gTUZEX1dNODM1MAorCitjb25maWcgTUZEX1dNODM1Ml9DT05GSUdfTU9ERV8wCisJYm9vbAorCWRlcGVuZHMgb24gTUZEX1dNODM1MAorCitjb25maWcgTUZEX1dNODM1Ml9DT05GSUdfTU9ERV8xCisJYm9vbAorCWRlcGVuZHMgb24gTUZEX1dNODM1MAorCitjb25maWcgTUZEX1dNODM1Ml9DT05GSUdfTU9ERV8yCisJYm9vbAorCWRlcGVuZHMgb24gTUZEX1dNODM1MAorCitjb25maWcgTUZEX1dNODM1Ml9DT05GSUdfTU9ERV8zCisJYm9vbAorCWRlcGVuZHMgb24gTUZEX1dNODM1MAorCiBjb25maWcgTUZEX1dNODM1MF9JMkMKIAl0cmlzdGF0ZSAiU3VwcG9ydCBXb2xmc29uIE1pY3JvZWxlY3Ryb25pY3MgV004MzUwIHdpdGggSTJDIgogCXNlbGVjdCBNRkRfV004MzUwCmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC9NYWtlZmlsZSBiL2RyaXZlcnMvbWZkL01ha2VmaWxlCmluZGV4IDlhNWFkOGEuLjBjOTQxOGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWZkL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbWZkL01ha2VmaWxlCkBAIC04LDYgKzgsOCBAQAogb2JqLSQoQ09ORklHX0hUQ19FR1BJTykJCSs9IGh0Yy1lZ3Bpby5vCiBvYmotJChDT05GSUdfSFRDX1BBU0lDMykJKz0gaHRjLXBhc2ljMy5vCiAKK29iai0kKENPTkZJR19NRkRfRE0zNTVFVk1fTVNQKQkrPSBkbTM1NWV2bV9tc3AubworCiBvYmotJChDT05GSUdfTUZEX1Q3TDY2WEIpCSs9IHQ3bDY2eGIubwogb2JqLSQoQ09ORklHX01GRF9UQzYzODdYQikJKz0gdGM2Mzg3eGIubwogb2JqLSQoQ09ORklHX01GRF9UQzYzOTNYQikJKz0gdGM2MzkzeGIubwpAQCAtMTcsNiArMTksOSBAQAogb2JqLSQoQ09ORklHX01GRF9XTTgzNTApCSs9IHdtODM1MC5vCiBvYmotJChDT05GSUdfTUZEX1dNODM1MF9JMkMpCSs9IHdtODM1MC1pMmMubwogCitvYmotJChDT05GSUdfVFBTNjUwMTApCQkrPSB0cHM2NTAxMC5vCitvYmotJChDT05GSUdfTUVORUxBVVMpCQkrPSBtZW5lbGF1cy5vCisKIG9iai0kKENPTkZJR19UV0w0MDMwX0NPUkUpCSs9IHR3bDQwMzAtY29yZS5vIHR3bDQwMzAtaXJxLm8KIAogb2JqLSQoQ09ORklHX01GRF9DT1JFKQkJKz0gbWZkLWNvcmUubwpAQCAtMzEsNCArMzYsNCBAQAogZW5kaWYKIG9iai0kKENPTkZJR19VQ0IxNDAwX0NPUkUpCSs9IHVjYjE0MDBfY29yZS5vCiAKLW9iai0kKENPTkZJR19QTUlDX0RBOTAzWCkJKz0gZGE5MDN4Lm8KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCitvYmotJChDT05GSUdfUE1JQ19EQTkwM1gpCSs9IGRhOTAzeC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC9kYTkwM3guYyBiL2RyaXZlcnMvbWZkL2RhOTAzeC5jCmluZGV4IDBiNWJkODUuLjk5ZjhkY2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWZkL2RhOTAzeC5jCisrKyBiL2RyaXZlcnMvbWZkL2RhOTAzeC5jCkBAIC0xNTEsMTIgKzE1MSwyNCBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwoZGE5MDN4X3dyaXRlKTsKIAoraW50IGRhOTAzeF93cml0ZXMoc3RydWN0IGRldmljZSAqZGV2LCBpbnQgcmVnLCBpbnQgbGVuLCB1aW50OF90ICp2YWwpCit7CisJcmV0dXJuIF9fZGE5MDN4X3dyaXRlcyh0b19pMmNfY2xpZW50KGRldiksIHJlZywgbGVuLCB2YWwpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZGE5MDN4X3dyaXRlcyk7CisKIGludCBkYTkwM3hfcmVhZChzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCByZWcsIHVpbnQ4X3QgKnZhbCkKIHsKIAlyZXR1cm4gX19kYTkwM3hfcmVhZCh0b19pMmNfY2xpZW50KGRldiksIHJlZywgdmFsKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGRhOTAzeF9yZWFkKTsKIAoraW50IGRhOTAzeF9yZWFkcyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCByZWcsIGludCBsZW4sIHVpbnQ4X3QgKnZhbCkKK3sKKwlyZXR1cm4gX19kYTkwM3hfcmVhZHModG9faTJjX2NsaWVudChkZXYpLCByZWcsIGxlbiwgdmFsKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGRhOTAzeF9yZWFkcyk7CisKIGludCBkYTkwM3hfc2V0X2JpdHMoc3RydWN0IGRldmljZSAqZGV2LCBpbnQgcmVnLCB1aW50OF90IGJpdF9tYXNrKQogewogCXN0cnVjdCBkYTkwM3hfY2hpcCAqY2hpcCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwpAQCAtNDM1LDEzICs0NDcsMTMgQEAKIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgZGE5MDN4X2lkX3RhYmxlKTsKIAotc3RhdGljIGludCBfX2RldmV4aXQgX19yZW1vdmVfc3ViZGV2KHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqdW51c2VkKQorc3RhdGljIGludCBfX3JlbW92ZV9zdWJkZXYoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICp1bnVzZWQpCiB7CiAJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIodG9fcGxhdGZvcm1fZGV2aWNlKGRldikpOwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IF9fZGV2ZXhpdCBkYTkwM3hfcmVtb3ZlX3N1YmRldnMoc3RydWN0IGRhOTAzeF9jaGlwICpjaGlwKQorc3RhdGljIGludCBkYTkwM3hfcmVtb3ZlX3N1YmRldnMoc3RydWN0IGRhOTAzeF9jaGlwICpjaGlwKQogewogCXJldHVybiBkZXZpY2VfZm9yX2VhY2hfY2hpbGQoY2hpcC0+ZGV2LCBOVUxMLCBfX3JlbW92ZV9zdWJkZXYpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvZG0zNTVldm1fbXNwLmMgYi9kcml2ZXJzL21mZC9kbTM1NWV2bV9tc3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjE0YjNmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZmQvZG0zNTVldm1fbXNwLmMKQEAgLTAsMCArMSw0MjAgQEAKKy8qCisgKiBkbTM1NWV2bV9tc3AuYyAtIGRyaXZlciBmb3IgTVNQNDMwIGZpcm13YXJlIG9uIERNMzU1RVZNIGJvYXJkCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4IERhdmlkIEJyb3duZWxsCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L2xlZHMuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMvZG0zNTVldm1fbXNwLmg+CisKKworLyoKKyAqIFRoZSBETTM1NSBpcyBhIERhVmluY2kgY2hpcCB3aXRoIHZpZGVvIHN1cHBvcnQgYnV0IG5vIEM2NCsgRFNQLiAgSXRzCisgKiBFVk0gYm9hcmQgaGFzIGFuIE1TUDQzMCBwcm9ncmFtbWVkIHdpdGggZmlybXdhcmUgZm9yIHZhcmlvdXMgYm9hcmQKKyAqIHN1cHBvcnQgZnVuY3Rpb25zLiAgVGhpcyBkcml2ZXIgZXhwb3NlcyBzb21lIG9mIHRoZW0gZGlyZWN0bHksIGFuZAorICogc3VwcG9ydHMgb3RoZXIgZHJpdmVycyAoZS5nLiBSVEMsIGlucHV0KSBmb3IgbW9yZSBjb21wbGV4IGFjY2Vzcy4KKyAqCisgKiBCZWNhdXNlIHRoaXMgZmlybXdhcmUgaXMgZW50aXJlbHkgYm9hcmQtc3BlY2lmaWMsIHRoaXMgZmlsZSBlbWJlZHMKKyAqIGtub3dsZWRnZSB0aGF0IHdvdWxkIGJlIHBhc3NlZCBhcyBwbGF0Zm9ybV9kYXRhIGluIGEgZ2VuZXJpYyBkcml2ZXIuCisgKgorICogVGhpcyBkcml2ZXIgd2FzIHRlc3RlZCB3aXRoIGZpcm13YXJlIHJldmlzaW9uIEE0LgorICovCisKKyNpZiBkZWZpbmVkKENPTkZJR19LRVlCT0FSRF9ETTM1NUVWTSkgXAorCQl8fCBkZWZpbmVkKENPTkZJR19LRVlCT0FSRF9ETTM1NUVWTV9NT0RVTEUpCisjZGVmaW5lIG1zcF9oYXNfa2V5Ym9hcmQoKQl0cnVlCisjZWxzZQorI2RlZmluZSBtc3BfaGFzX2tleWJvYXJkKCkJZmFsc2UKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfTEVEU19HUElPKSB8fCBkZWZpbmVkKENPTkZJR19MRURTX0dQSU9fTU9EVUxFKQorI2RlZmluZSBtc3BfaGFzX2xlZHMoKQkJdHJ1ZQorI2Vsc2UKKyNkZWZpbmUgbXNwX2hhc19sZWRzKCkJCWZhbHNlCisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX1JUQ19EUlZfRE0zNTVFVk0pIHx8IGRlZmluZWQoQ09ORklHX1JUQ19EUlZfRE0zNTVFVk1fTU9EVUxFKQorI2RlZmluZSBtc3BfaGFzX3J0YygpCQl0cnVlCisjZWxzZQorI2RlZmluZSBtc3BfaGFzX3J0YygpCQlmYWxzZQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19WSURFT19UVlA1MTRYKSB8fCBkZWZpbmVkKENPTkZJR19WSURFT19UVlA1MTRYX01PRFVMRSkKKyNkZWZpbmUgbXNwX2hhc190dnAoKQkJdHJ1ZQorI2Vsc2UKKyNkZWZpbmUgbXNwX2hhc190dnAoKQkJZmFsc2UKKyNlbmRpZgorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFJFVklTSVQgZm9yIHBhcmFub2lhJ3Mgc2FrZSwgcmV0cnkgcmVhZHMvd3JpdGVzIG9uIGVycm9yICovCisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2NsaWVudCAqbXNwNDMwOworCisvKioKKyAqIGRtMzU1ZXZtX21zcF93cml0ZSAtIFdyaXRlcyBhIHJlZ2lzdGVyIGluIGRtMzU1ZXZtX21zcAorICogQHZhbHVlOiB0aGUgdmFsdWUgdG8gYmUgd3JpdHRlbgorICogQHJlZzogcmVnaXN0ZXIgYWRkcmVzcworICoKKyAqIFJldHVybnMgcmVzdWx0IG9mIG9wZXJhdGlvbiAtIDAgaXMgc3VjY2VzcywgZWxzZSBuZWdhdGl2ZSBlcnJubworICovCitpbnQgZG0zNTVldm1fbXNwX3dyaXRlKHU4IHZhbHVlLCB1OCByZWcpCit7CisJcmV0dXJuIGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEobXNwNDMwLCByZWcsIHZhbHVlKTsKK30KK0VYUE9SVF9TWU1CT0woZG0zNTVldm1fbXNwX3dyaXRlKTsKKworLyoqCisgKiBkbTM1NWV2bV9tc3BfcmVhZCAtIFJlYWRzIGEgcmVnaXN0ZXIgZnJvbSBkbTM1NWV2bV9tc3AKKyAqIEByZWc6IHJlZ2lzdGVyIGFkZHJlc3MKKyAqCisgKiBSZXR1cm5zIHJlc3VsdCBvZiBvcGVyYXRpb24gLSB2YWx1ZSwgb3IgbmVnYXRpdmUgZXJybm8KKyAqLworaW50IGRtMzU1ZXZtX21zcF9yZWFkKHU4IHJlZykKK3sKKwlyZXR1cm4gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKG1zcDQzMCwgcmVnKTsKK30KK0VYUE9SVF9TWU1CT0woZG0zNTVldm1fbXNwX3JlYWQpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKgorICogTWFueSBvZiB0aGUgbXNwNDMwIHBpbnMgYXJlIGp1c3QgdXNlZCBhcyBmaXhlZC1kaXJlY3Rpb24gR1BJT3MuCisgKiBXZSBjb3VsZCBleHBvcnQgYSBmZXcgbW9yZSBvZiB0aGVtIHRoaXMgd2F5LCBpZiB3ZSB3YW50ZWQuCisgKi8KKyNkZWZpbmUgTVNQX0dQSU8oYml0LHJlZykJKChETTM1NUVWTV9NU1BfICMjIHJlZykgPDwgMyB8IChiaXQpKQorCitzdGF0aWMgY29uc3QgdTggbXNwX2dwaW9zW10gPSB7CisJLyogZWlnaHQgbGVkcyAqLworCU1TUF9HUElPKDAsIExFRCksIE1TUF9HUElPKDEsIExFRCksCisJTVNQX0dQSU8oMiwgTEVEKSwgTVNQX0dQSU8oMywgTEVEKSwKKwlNU1BfR1BJTyg0LCBMRUQpLCBNU1BfR1BJTyg1LCBMRUQpLAorCU1TUF9HUElPKDYsIExFRCksIE1TUF9HUElPKDcsIExFRCksCisJLyogU1c2IGFuZCB0aGUgTlRTQy9uUEFMIGp1bXBlciAqLworCU1TUF9HUElPKDAsIFNXSVRDSDEpLCBNU1BfR1BJTygxLCBTV0lUQ0gxKSwKKwlNU1BfR1BJTygyLCBTV0lUQ0gxKSwgTVNQX0dQSU8oMywgU1dJVENIMSksCisJTVNQX0dQSU8oNCwgU1dJVENIMSksCit9OworCisjZGVmaW5lIE1TUF9HUElPX1JFRyhvZmZzZXQpCShtc3BfZ3Bpb3NbKG9mZnNldCldID4+IDMpCisjZGVmaW5lIE1TUF9HUElPX01BU0sob2Zmc2V0KQlCSVQobXNwX2dwaW9zWyhvZmZzZXQpXSAmIDB4MDcpCisKK3N0YXRpYyBpbnQgbXNwX2dwaW9faW4oc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0KQoreworCXN3aXRjaCAoTVNQX0dQSU9fUkVHKG9mZnNldCkpIHsKKwljYXNlIERNMzU1RVZNX01TUF9TV0lUQ0gxOgorCWNhc2UgRE0zNTVFVk1fTVNQX1NXSVRDSDI6CisJY2FzZSBETTM1NUVWTV9NU1BfU0RNTUM6CisJCXJldHVybiAwOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KK30KKworc3RhdGljIHU4IG1zcF9sZWRfY2FjaGU7CisKK3N0YXRpYyBpbnQgbXNwX2dwaW9fZ2V0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCkKK3sKKwlpbnQgcmVnLCBzdGF0dXM7CisKKwlyZWcgPSBNU1BfR1BJT19SRUcob2Zmc2V0KTsKKwlzdGF0dXMgPSBkbTM1NWV2bV9tc3BfcmVhZChyZWcpOworCWlmIChzdGF0dXMgPCAwKQorCQlyZXR1cm4gc3RhdHVzOworCWlmIChyZWcgPT0gRE0zNTVFVk1fTVNQX0xFRCkKKwkJbXNwX2xlZF9jYWNoZSA9IHN0YXR1czsKKwlyZXR1cm4gc3RhdHVzICYgTVNQX0dQSU9fTUFTSyhvZmZzZXQpOworfQorCitzdGF0aWMgaW50IG1zcF9ncGlvX291dChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQsIGludCB2YWx1ZSkKK3sKKwlpbnQgbWFzaywgYml0czsKKworCS8qIE5PVEU6ICB0aGVyZSBhcmUgc29tZSBvdGhlciBzaWduYWxzIHRoYXQgY291bGQgYmUKKwkgKiBwYWNrYWdlZCBhcyBvdXRwdXQgR1BJT3MsIGJ1dCB0aGV5IGFyZW4ndCBhcyB1c2VmdWwKKwkgKiBhcyB0aGUgTEVEcyAuLi4gc28gZm9yIG5vdyB3ZSBkb24ndC4KKwkgKi8KKwlpZiAoTVNQX0dQSU9fUkVHKG9mZnNldCkgIT0gRE0zNTVFVk1fTVNQX0xFRCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltYXNrID0gTVNQX0dQSU9fTUFTSyhvZmZzZXQpOworCWJpdHMgPSBtc3BfbGVkX2NhY2hlOworCisJYml0cyAmPSB+bWFzazsKKwlpZiAodmFsdWUpCisJCWJpdHMgfD0gbWFzazsKKwltc3BfbGVkX2NhY2hlID0gYml0czsKKworCXJldHVybiBkbTM1NWV2bV9tc3Bfd3JpdGUoYml0cywgRE0zNTVFVk1fTVNQX0xFRCk7Cit9CisKK3N0YXRpYyB2b2lkIG1zcF9ncGlvX3NldChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQsIGludCB2YWx1ZSkKK3sKKwltc3BfZ3Bpb19vdXQoY2hpcCwgb2Zmc2V0LCB2YWx1ZSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZ3Bpb19jaGlwIGRtMzU1ZXZtX21zcF9ncGlvID0geworCS5sYWJlbAkJCT0gImRtMzU1ZXZtX21zcCIsCisJLm93bmVyCQkJPSBUSElTX01PRFVMRSwKKwkuZGlyZWN0aW9uX2lucHV0CT0gbXNwX2dwaW9faW4sCisJLmdldAkJCT0gbXNwX2dwaW9fZ2V0LAorCS5kaXJlY3Rpb25fb3V0cHV0CT0gbXNwX2dwaW9fb3V0LAorCS5zZXQJCQk9IG1zcF9ncGlvX3NldCwKKwkuYmFzZQkJCT0gLUVJTlZBTCwJCS8qIGR5bmFtaWMgYXNzaWdubWVudCAqLworCS5uZ3BpbwkJCT0gQVJSQVlfU0laRShtc3BfZ3Bpb3MpLAorCS5jYW5fc2xlZXAJCT0gdHJ1ZSwKK307CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlICphZGRfY2hpbGQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgY29uc3QgY2hhciAqbmFtZSwKKwkJdm9pZCAqcGRhdGEsIHVuc2lnbmVkIHBkYXRhX2xlbiwKKwkJYm9vbCBjYW5fd2FrZXVwLCBpbnQgaXJxKQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UJKnBkZXY7CisJaW50CQkJc3RhdHVzOworCisJcGRldiA9IHBsYXRmb3JtX2RldmljZV9hbGxvYyhuYW1lLCAtMSk7CisJaWYgKCFwZGV2KSB7CisJCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAiY2FuJ3QgYWxsb2MgZGV2XG4iKTsKKwkJc3RhdHVzID0gLUVOT01FTTsKKwkJZ290byBlcnI7CisJfQorCisJZGV2aWNlX2luaXRfd2FrZXVwKCZwZGV2LT5kZXYsIGNhbl93YWtldXApOworCXBkZXYtPmRldi5wYXJlbnQgPSAmY2xpZW50LT5kZXY7CisKKwlpZiAocGRhdGEpIHsKKwkJc3RhdHVzID0gcGxhdGZvcm1fZGV2aWNlX2FkZF9kYXRhKHBkZXYsIHBkYXRhLCBwZGF0YV9sZW4pOworCQlpZiAoc3RhdHVzIDwgMCkgeworCQkJZGV2X2RiZygmcGRldi0+ZGV2LCAiY2FuJ3QgYWRkIHBsYXRmb3JtX2RhdGFcbiIpOworCQkJZ290byBlcnI7CisJCX0KKwl9CisKKwlpZiAoaXJxKSB7CisJCXN0cnVjdCByZXNvdXJjZSByID0geworCQkJLnN0YXJ0ID0gaXJxLAorCQkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJCX07CisKKwkJc3RhdHVzID0gcGxhdGZvcm1fZGV2aWNlX2FkZF9yZXNvdXJjZXMocGRldiwgJnIsIDEpOworCQlpZiAoc3RhdHVzIDwgMCkgeworCQkJZGV2X2RiZygmcGRldi0+ZGV2LCAiY2FuJ3QgYWRkIGlycVxuIik7CisJCQlnb3RvIGVycjsKKwkJfQorCX0KKworCXN0YXR1cyA9IHBsYXRmb3JtX2RldmljZV9hZGQocGRldik7CisKK2VycjoKKwlpZiAoc3RhdHVzIDwgMCkgeworCQlwbGF0Zm9ybV9kZXZpY2VfcHV0KHBkZXYpOworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgImNhbid0IGFkZCAlcyBkZXZcbiIsIG5hbWUpOworCQlyZXR1cm4gRVJSX1BUUihzdGF0dXMpOworCX0KKwlyZXR1cm4gJnBkZXYtPmRldjsKK30KKworc3RhdGljIGludCBhZGRfY2hpbGRyZW4oc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlzdGF0aWMgY29uc3Qgc3RydWN0IHsKKwkJaW50IG9mZnNldDsKKwkJY2hhciAqbGFiZWw7CisJfSBjb25maWdfaW5wdXRzW10gPSB7CisJCS8qIDggPT0gcmlnaHQgYWZ0ZXIgdGhlIExFRHMgKi8KKwkJeyA4ICsgMCwgInN3Nl8xIiwgfSwKKwkJeyA4ICsgMSwgInN3Nl8yIiwgfSwKKwkJeyA4ICsgMiwgInN3Nl8zIiwgfSwKKwkJeyA4ICsgMywgInN3Nl80IiwgfSwKKwkJeyA4ICsgNCwgIk5UU0MvblBBTCIsIH0sCisJfTsKKworCXN0cnVjdCBkZXZpY2UJKmNoaWxkOworCWludAkJc3RhdHVzOworCWludAkJaTsKKworCS8qIEdQSU8taXNoIHN0dWZmICovCisJZG0zNTVldm1fbXNwX2dwaW8uZGV2ID0gJmNsaWVudC0+ZGV2OworCXN0YXR1cyA9IGdwaW9jaGlwX2FkZCgmZG0zNTVldm1fbXNwX2dwaW8pOworCWlmIChzdGF0dXMgPCAwKQorCQlyZXR1cm4gc3RhdHVzOworCisJLyogTEVEIG91dHB1dCAqLworCWlmIChtc3BfaGFzX2xlZHMoKSkgeworI2RlZmluZSBHUElPX0xFRChsKQkubmFtZSA9IGwsIC5hY3RpdmVfbG93ID0gdHJ1ZQorCQlzdGF0aWMgc3RydWN0IGdwaW9fbGVkIGV2bV9sZWRzW10gPSB7CisJCQl7IEdQSU9fTEVEKCJkbTM1NWV2bTo6ZHMxNCIpLAorCQkJCS5kZWZhdWx0X3RyaWdnZXIgPSAiaGVhcnRiZWF0IiwgfSwKKwkJCXsgR1BJT19MRUQoImRtMzU1ZXZtOjpkczE1IiksCisJCQkJLmRlZmF1bHRfdHJpZ2dlciA9ICJtbWMwIiwgfSwKKwkJCXsgR1BJT19MRUQoImRtMzU1ZXZtOjpkczE2IiksCisJCQkJLyogY291bGQgYWxzbyBiZSBhIENFLUFUQSBkcml2ZSAqLworCQkJCS5kZWZhdWx0X3RyaWdnZXIgPSAibW1jMSIsIH0sCisJCQl7IEdQSU9fTEVEKCJkbTM1NWV2bTo6ZHMxNyIpLAorCQkJCS5kZWZhdWx0X3RyaWdnZXIgPSAibmFuZC1kaXNrIiwgfSwKKwkJCXsgR1BJT19MRUQoImRtMzU1ZXZtOjpkczE4IiksIH0sCisJCQl7IEdQSU9fTEVEKCJkbTM1NWV2bTo6ZHMxOSIpLCB9LAorCQkJeyBHUElPX0xFRCgiZG0zNTVldm06OmRzMjAiKSwgfSwKKwkJCXsgR1BJT19MRUQoImRtMzU1ZXZtOjpkczIxIiksIH0sCisJCX07CisjdW5kZWYgR1BJT19MRUQKKworCQlzdHJ1Y3QgZ3Bpb19sZWRfcGxhdGZvcm1fZGF0YSBldm1fbGVkX2RhdGEgPSB7CisJCQkubnVtX2xlZHMJPSBBUlJBWV9TSVpFKGV2bV9sZWRzKSwKKwkJCS5sZWRzCQk9IGV2bV9sZWRzLAorCQl9OworCisJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGV2bV9sZWRzKTsgaSsrKQorCQkJZXZtX2xlZHNbaV0uZ3BpbyA9IGkgKyBkbTM1NWV2bV9tc3BfZ3Bpby5iYXNlOworCisJCS8qIE5PVEU6ICB0aGVzZSBhcmUgdGhlIG9ubHkgZnVsbHkgcHJvZ3JhbW1hYmxlIExFRHMKKwkJICogb24gdGhlIGJvYXJkLCBzaW5jZSBHUElPLTYxL2RzMjIgKGFuZCBtYW55IHNpZ25hbHMKKwkJICogZ29pbmcgdG8gREM3KSBtdXN0IGJlIHVzZWQgZm9yIEFFTUlGIGFkZHJlc3MgbGluZXMKKwkJICogdW5sZXNzIHRoZSB0b3AgMSBHQiBvZiBOQU5EIGlzIHVudXNlZC4uLgorCQkgKi8KKwkJY2hpbGQgPSBhZGRfY2hpbGQoY2xpZW50LCAibGVkcy1ncGlvIiwKKwkJCQkmZXZtX2xlZF9kYXRhLCBzaXplb2YoZXZtX2xlZF9kYXRhKSwKKwkJCQlmYWxzZSwgMCk7CisJCWlmIChJU19FUlIoY2hpbGQpKQorCQkJcmV0dXJuIFBUUl9FUlIoY2hpbGQpOworCX0KKworCS8qIGNvbmZpZ3VyYXRpb24gaW5wdXRzICovCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY29uZmlnX2lucHV0cyk7IGkrKykgeworCQlpbnQgZ3BpbyA9IGRtMzU1ZXZtX21zcF9ncGlvLmJhc2UgKyBjb25maWdfaW5wdXRzW2ldLm9mZnNldDsKKworCQlncGlvX3JlcXVlc3QoZ3BpbywgY29uZmlnX2lucHV0c1tpXS5sYWJlbCk7CisJCWdwaW9fZGlyZWN0aW9uX2lucHV0KGdwaW8pOworCisJCS8qIG1ha2UgaXQgZWFzeSBmb3IgdXNlcnNwYWNlIHRvIHNlZSB0aGVzZSAqLworCQlncGlvX2V4cG9ydChncGlvLCBmYWxzZSk7CisJfQorCisJLyogUlRDIGlzIGEgMzIgYml0IGNvdW50ZXIsIG5vIGFsYXJtICovCisJaWYgKG1zcF9oYXNfcnRjKCkpIHsKKwkJY2hpbGQgPSBhZGRfY2hpbGQoY2xpZW50LCAicnRjLWRtMzU1ZXZtIiwKKwkJCQlOVUxMLCAwLCBmYWxzZSwgMCk7CisJCWlmIChJU19FUlIoY2hpbGQpKQorCQkJcmV0dXJuIFBUUl9FUlIoY2hpbGQpOworCX0KKworCS8qIGlucHV0IGZyb20gYnV0dG9ucyBhbmQgSVIgcmVtb3RlICh1c2VzIHRoZSBJUlEpICovCisJaWYgKG1zcF9oYXNfa2V5Ym9hcmQoKSkgeworCQljaGlsZCA9IGFkZF9jaGlsZChjbGllbnQsICJkbTM1NWV2bV9rZXlzIiwKKwkJCQlOVUxMLCAwLCB0cnVlLCBjbGllbnQtPmlycSk7CisJCWlmIChJU19FUlIoY2hpbGQpKQorCQkJcmV0dXJuIFBUUl9FUlIoY2hpbGQpOworCX0KKworCXJldHVybiAwOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdm9pZCBkbTM1NWV2bV9jb21tYW5kKHVuc2lnbmVkIGNvbW1hbmQpCit7CisJaW50IHN0YXR1czsKKworCXN0YXR1cyA9IGRtMzU1ZXZtX21zcF93cml0ZShjb21tYW5kLCBETTM1NUVWTV9NU1BfQ09NTUFORCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWRldl9lcnIoJm1zcDQzMC0+ZGV2LCAiY29tbWFuZCAlZCBmYWlsdXJlICVkXG4iLAorCQkJCWNvbW1hbmQsIHN0YXR1cyk7Cit9CisKK3N0YXRpYyB2b2lkIGRtMzU1ZXZtX3Bvd2VyX29mZih2b2lkKQoreworCWRtMzU1ZXZtX2NvbW1hbmQoTVNQX0NPTU1BTkRfUE9XRVJPRkYpOworfQorCitzdGF0aWMgaW50IGRtMzU1ZXZtX21zcF9yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlwbV9wb3dlcl9vZmYgPSBOVUxMOworCW1zcDQzMCA9IE5VTEw7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2RtMzU1ZXZtX21zcF9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCit7CisJaW50CQlzdGF0dXM7CisJY29uc3QgY2hhcgkqdmlkZW8gPSBtc3BfaGFzX3R2cCgpID8gIlRWUDUxNDYiIDogImltYWdlciI7CisKKwlpZiAobXNwNDMwKQorCQlyZXR1cm4gLUVCVVNZOworCW1zcDQzMCA9IGNsaWVudDsKKworCS8qIGRpc3BsYXkgcmV2aXNpb24gc3RhdHVzOyBkb3VibGVzIGFzIHNhbml0eSBjaGVjayAqLworCXN0YXR1cyA9IGRtMzU1ZXZtX21zcF9yZWFkKERNMzU1RVZNX01TUF9GSVJNUkVWKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBmYWlsOworCWRldl9pbmZvKCZjbGllbnQtPmRldiwgImZpcm13YXJlIHYuJTAyWCwgJXMgYXMgdmlkZW8taW5cbiIsCisJCQlzdGF0dXMsIHZpZGVvKTsKKworCS8qIG11eCB2aWRlbyBpbnB1dDogIGVpdGhlciB0dnA1MTQ2IG9yIHNvbWUgZXh0ZXJuYWwgaW1hZ2VyICovCisJc3RhdHVzID0gZG0zNTVldm1fbXNwX3dyaXRlKG1zcF9oYXNfdHZwKCkgPyAwIDogTVNQX1ZJREVPX0lNQUdFUiwKKwkJCURNMzU1RVZNX01TUF9WSURFT19JTik7CisJaWYgKHN0YXR1cyA8IDApCisJCWRldl93YXJuKCZjbGllbnQtPmRldiwgImVycm9yICVkIG11eGluZyAlcyBhcyB2aWRlby1pblxuIiwKKwkJCXN0YXR1cywgdmlkZW8pOworCisJLyogaW5pdCBMRUQgY2FjaGUsIGFuZCB0dXJuIG9mZiB0aGUgTEVEcyAqLworCW1zcF9sZWRfY2FjaGUgPSAweGZmOworCWRtMzU1ZXZtX21zcF93cml0ZShtc3BfbGVkX2NhY2hlLCBETTM1NUVWTV9NU1BfTEVEKTsKKworCS8qIGV4cG9ydCBjYXBhYmlsaXRpZXMgd2Ugc3VwcG9ydCAqLworCXN0YXR1cyA9IGFkZF9jaGlsZHJlbihjbGllbnQpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGZhaWw7CisKKwkvKiBQTSBob29rdXAgKi8KKwlwbV9wb3dlcl9vZmYgPSBkbTM1NWV2bV9wb3dlcl9vZmY7CisKKwlyZXR1cm4gMDsKKworZmFpbDoKKwkvKiBGSVhNRSByZW1vdmUgY2hpbGRyZW4gLi4uICovCisJZG0zNTVldm1fbXNwX3JlbW92ZShjbGllbnQpOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBkbTM1NWV2bV9tc3BfaWRzW10gPSB7CisJeyAiZG0zNTVldm1fbXNwIiwgMCB9LAorCXsgLyogZW5kIG9mIGxpc3QgKi8gfSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgZG0zNTVldm1fbXNwX2lkcyk7CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBkbTM1NWV2bV9tc3BfZHJpdmVyID0geworCS5kcml2ZXIubmFtZQk9ICJkbTM1NWV2bV9tc3AiLAorCS5pZF90YWJsZQk9IGRtMzU1ZXZtX21zcF9pZHMsCisJLnByb2JlCQk9IGRtMzU1ZXZtX21zcF9wcm9iZSwKKwkucmVtb3ZlCQk9IGRtMzU1ZXZtX21zcF9yZW1vdmUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBkbTM1NWV2bV9tc3BfaW5pdCh2b2lkKQoreworCXJldHVybiBpMmNfYWRkX2RyaXZlcigmZG0zNTVldm1fbXNwX2RyaXZlcik7Cit9CitzdWJzeXNfaW5pdGNhbGwoZG0zNTVldm1fbXNwX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgZG0zNTVldm1fbXNwX2V4aXQodm9pZCkKK3sKKwlpMmNfZGVsX2RyaXZlcigmZG0zNTVldm1fbXNwX2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdChkbTM1NWV2bV9tc3BfZXhpdCk7CisKK01PRFVMRV9ERVNDUklQVElPTigiSW50ZXJmYWNlIHRvIE1TUDQzMCBmaXJtd2FyZSBvbiBETTM1NUVWTSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvY2hpcHMvbWVuZWxhdXMuYyBiL2RyaXZlcnMvbWZkL21lbmVsYXVzLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvaTJjL2NoaXBzL21lbmVsYXVzLmMKcmVuYW1lIHRvIGRyaXZlcnMvbWZkL21lbmVsYXVzLmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL21mZC1jb3JlLmMgYi9kcml2ZXJzL21mZC9tZmQtY29yZS5jCmluZGV4IDZjMGQxYmUuLjU0ZGRmMzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWZkL21mZC1jb3JlLmMKKysrIGIvZHJpdmVycy9tZmQvbWZkLWNvcmUuYwpAQCAtMzQsNiArMzQsNyBAQAogCQlnb3RvIGZhaWxfZGV2aWNlOwogCiAJcGRldi0+ZGV2LnBhcmVudCA9IHBhcmVudDsKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBjZWxsLT5kcml2ZXJfZGF0YSk7CiAKIAlyZXQgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkX2RhdGEocGRldiwKIAkJCWNlbGwtPnBsYXRmb3JtX2RhdGEsIGNlbGwtPmRhdGFfc2l6ZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9jaGlwcy90cHM2NTAxMC5jIGIvZHJpdmVycy9tZmQvdHBzNjUwMTAuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9pMmMvY2hpcHMvdHBzNjUwMTAuYwpyZW5hbWUgdG8gZHJpdmVycy9tZmQvdHBzNjUwMTAuYwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvdHdsNDAzMC1jb3JlLmMgYi9kcml2ZXJzL21mZC90d2w0MDMwLWNvcmUuYwppbmRleCBkZDg0M2M0Li5iNTljMzg1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21mZC90d2w0MDMwLWNvcmUuYworKysgYi9kcml2ZXJzL21mZC90d2w0MDMwLWNvcmUuYwpAQCAtMzMsNiArMzMsOCBAQAogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogCisjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL21hY2hpbmUuaD4KKwogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy90d2w0MDMwLmg+CiAKQEAgLTcxLDYgKzczLDEzIEBACiAjZGVmaW5lIHR3bF9oYXNfZ3BpbygpCWZhbHNlCiAjZW5kaWYKIAorI2lmIGRlZmluZWQoQ09ORklHX1JFR1VMQVRPUl9UV0w0MDMwKSBcCisJfHwgZGVmaW5lZChDT05GSUdfUkVHVUxBVE9SX1RXTDQwMzBfTU9EVUxFKQorI2RlZmluZSB0d2xfaGFzX3JlZ3VsYXRvcigpCXRydWUKKyNlbHNlCisjZGVmaW5lIHR3bF9oYXNfcmVndWxhdG9yKCkJZmFsc2UKKyNlbmRpZgorCiAjaWYgZGVmaW5lZChDT05GSUdfVFdMNDAzMF9NQURDKSB8fCBkZWZpbmVkKENPTkZJR19UV0w0MDMwX01BRENfTU9EVUxFKQogI2RlZmluZSB0d2xfaGFzX21hZGMoKQl0cnVlCiAjZWxzZQpAQCAtMTQ5LDYgKzE1OCwxMCBAQAogI2RlZmluZSBISUdIX1BFUkZfU1EJCQkoMSA8PCAzKQogCiAKKy8qIGNoaXAtc3BlY2lmaWMgZmVhdHVyZSBmbGFncywgZm9yIGkyY19kZXZpY2VfaWQuZHJpdmVyX2RhdGEgKi8KKyNkZWZpbmUgVFdMNDAzMF9WQVVYMgkJQklUKDApCS8qIHByZS01MDMwIHZvbHRhZ2UgcmFuZ2VzICovCisjZGVmaW5lIFRQU19TVUJTRVQJCUJJVCgxKQkvKiB0cHM2NTlbMjNdMCBoYXZlIGZld2VyIExET3MgKi8KKwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAogLyogaXMgZHJpdmVyIGFjdGl2ZSwgYm91bmQgdG8gYSBjaGlwPyAqLwpAQCAtMjI1LDcgKzIzOCw3IEBACiAgKgogICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIG9wZXJhdGlvbiAtIDAgaXMgc3VjY2VzcwogICovCi1pbnQgdHdsNDAzMF9pMmNfd3JpdGUodTggbW9kX25vLCB1OCAqdmFsdWUsIHU4IHJlZywgdTggbnVtX2J5dGVzKQoraW50IHR3bDQwMzBfaTJjX3dyaXRlKHU4IG1vZF9ubywgdTggKnZhbHVlLCB1OCByZWcsIHVuc2lnbmVkIG51bV9ieXRlcykKIHsKIAlpbnQgcmV0OwogCWludCBzaWQ7CkBAIC0yNzQsNyArMjg3LDcgQEAKICAqCiAgKiBSZXR1cm5zIHJlc3VsdCBvZiBvcGVyYXRpb24gLSBudW1fYnl0ZXMgaXMgc3VjY2VzcyBlbHNlIGZhaWx1cmUuCiAgKi8KLWludCB0d2w0MDMwX2kyY19yZWFkKHU4IG1vZF9ubywgdTggKnZhbHVlLCB1OCByZWcsIHU4IG51bV9ieXRlcykKK2ludCB0d2w0MDMwX2kyY19yZWFkKHU4IG1vZF9ubywgdTggKnZhbHVlLCB1OCByZWcsIHVuc2lnbmVkIG51bV9ieXRlcykKIHsKIAlpbnQgcmV0OwogCXU4IHZhbDsKQEAgLTM1MiwyNTggKzM2NSwyNTggQEAKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAorc3RhdGljIHN0cnVjdCBkZXZpY2UgKgorYWRkX251bWJlcmVkX2NoaWxkKHVuc2lnbmVkIGNoaXAsIGNvbnN0IGNoYXIgKm5hbWUsIGludCBudW0sCisJCXZvaWQgKnBkYXRhLCB1bnNpZ25lZCBwZGF0YV9sZW4sCisJCWJvb2wgY2FuX3dha2V1cCwgaW50IGlycTAsIGludCBpcnExKQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UJKnBkZXY7CisJc3RydWN0IHR3bDQwMzBfY2xpZW50CSp0d2wgPSAmdHdsNDAzMF9tb2R1bGVzW2NoaXBdOworCWludAkJCXN0YXR1czsKKworCXBkZXYgPSBwbGF0Zm9ybV9kZXZpY2VfYWxsb2MobmFtZSwgbnVtKTsKKwlpZiAoIXBkZXYpIHsKKwkJZGV2X2RiZygmdHdsLT5jbGllbnQtPmRldiwgImNhbid0IGFsbG9jIGRldlxuIik7CisJCXN0YXR1cyA9IC1FTk9NRU07CisJCWdvdG8gZXJyOworCX0KKworCWRldmljZV9pbml0X3dha2V1cCgmcGRldi0+ZGV2LCBjYW5fd2FrZXVwKTsKKwlwZGV2LT5kZXYucGFyZW50ID0gJnR3bC0+Y2xpZW50LT5kZXY7CisKKwlpZiAocGRhdGEpIHsKKwkJc3RhdHVzID0gcGxhdGZvcm1fZGV2aWNlX2FkZF9kYXRhKHBkZXYsIHBkYXRhLCBwZGF0YV9sZW4pOworCQlpZiAoc3RhdHVzIDwgMCkgeworCQkJZGV2X2RiZygmcGRldi0+ZGV2LCAiY2FuJ3QgYWRkIHBsYXRmb3JtX2RhdGFcbiIpOworCQkJZ290byBlcnI7CisJCX0KKwl9CisKKwlpZiAoaXJxMCkgeworCQlzdHJ1Y3QgcmVzb3VyY2UgclsyXSA9IHsKKwkJCXsgLnN0YXJ0ID0gaXJxMCwgLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsIH0sCisJCQl7IC5zdGFydCA9IGlycTEsIC5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLCB9LAorCQl9OworCisJCXN0YXR1cyA9IHBsYXRmb3JtX2RldmljZV9hZGRfcmVzb3VyY2VzKHBkZXYsIHIsIGlycTEgPyAyIDogMSk7CisJCWlmIChzdGF0dXMgPCAwKSB7CisJCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJjYW4ndCBhZGQgaXJxc1xuIik7CisJCQlnb3RvIGVycjsKKwkJfQorCX0KKworCXN0YXR1cyA9IHBsYXRmb3JtX2RldmljZV9hZGQocGRldik7CisKK2VycjoKKwlpZiAoc3RhdHVzIDwgMCkgeworCQlwbGF0Zm9ybV9kZXZpY2VfcHV0KHBkZXYpOworCQlkZXZfZXJyKCZ0d2wtPmNsaWVudC0+ZGV2LCAiY2FuJ3QgYWRkICVzIGRldlxuIiwgbmFtZSk7CisJCXJldHVybiBFUlJfUFRSKHN0YXR1cyk7CisJfQorCXJldHVybiAmcGRldi0+ZGV2OworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBkZXZpY2UgKmFkZF9jaGlsZCh1bnNpZ25lZCBjaGlwLCBjb25zdCBjaGFyICpuYW1lLAorCQl2b2lkICpwZGF0YSwgdW5zaWduZWQgcGRhdGFfbGVuLAorCQlib29sIGNhbl93YWtldXAsIGludCBpcnEwLCBpbnQgaXJxMSkKK3sKKwlyZXR1cm4gYWRkX251bWJlcmVkX2NoaWxkKGNoaXAsIG5hbWUsIC0xLCBwZGF0YSwgcGRhdGFfbGVuLAorCQljYW5fd2FrZXVwLCBpcnEwLCBpcnExKTsKK30KKworc3RhdGljIHN0cnVjdCBkZXZpY2UgKgorYWRkX3JlZ3VsYXRvcl9saW5rZWQoaW50IG51bSwgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgKnBkYXRhLAorCQlzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSAqY29uc3VtZXJzLAorCQl1bnNpZ25lZCBudW1fY29uc3VtZXJzKQoreworCS8qIHJlZ3VsYXRvciBmcmFtZXdvcmsgZGVtYW5kcyBpbml0X2RhdGEgLi4uICovCisJaWYgKCFwZGF0YSkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoY29uc3VtZXJzKSB7CisJCXBkYXRhLT5jb25zdW1lcl9zdXBwbGllcyA9IGNvbnN1bWVyczsKKwkJcGRhdGEtPm51bV9jb25zdW1lcl9zdXBwbGllcyA9IG51bV9jb25zdW1lcnM7CisJfQorCisJLyogTk9URTogIHdlIGN1cnJlbnRseSBpZ25vcmUgcmVndWxhdG9yIElSUXMsIGUuZy4gZm9yIHNob3J0IGNpcmN1aXRzICovCisJcmV0dXJuIGFkZF9udW1iZXJlZF9jaGlsZCgzLCAidHdsNDAzMF9yZWciLCBudW0sCisJCXBkYXRhLCBzaXplb2YoKnBkYXRhKSwgZmFsc2UsIDAsIDApOworfQorCitzdGF0aWMgc3RydWN0IGRldmljZSAqCithZGRfcmVndWxhdG9yKGludCBudW0sIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhICpwZGF0YSkKK3sKKwlyZXR1cm4gYWRkX3JlZ3VsYXRvcl9saW5rZWQobnVtLCBwZGF0YSwgTlVMTCwgMCk7Cit9CisKIC8qCiAgKiBOT1RFOiAgV2Uga25vdyB0aGUgZmlyc3QgOCBJUlFzIGFmdGVyIHBkYXRhLT5iYXNlX2lycSBhcmUKICAqIGZvciB0aGUgUElILCBhbmQgdGhlIG5leHQgYXJlIGZvciB0aGUgUFdSX0lOVCBTSUgsIHNpbmNlCiAgKiB0aGF0J3MgaG93IHR3bF9pbml0X2lycSgpIHNldHMgdGhpbmdzIHVwLgogICovCiAKLXN0YXRpYyBpbnQgYWRkX2NoaWxkcmVuKHN0cnVjdCB0d2w0MDMwX3BsYXRmb3JtX2RhdGEgKnBkYXRhKQorc3RhdGljIGludAorYWRkX2NoaWxkcmVuKHN0cnVjdCB0d2w0MDMwX3BsYXRmb3JtX2RhdGEgKnBkYXRhLCB1bnNpZ25lZCBsb25nIGZlYXR1cmVzKQogewotCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UJKnBkZXYgPSBOVUxMOwotCXN0cnVjdCB0d2w0MDMwX2NsaWVudAkqdHdsID0gTlVMTDsKLQlpbnQJCQlzdGF0dXMgPSAwOworCXN0cnVjdCBkZXZpY2UJKmNoaWxkOworCXN0cnVjdCBkZXZpY2UJKnVzYl90cmFuc2NlaXZlciA9IE5VTEw7CiAKLQlpZiAodHdsX2hhc19iY2koKSAmJiBwZGF0YS0+YmNpKSB7Ci0JCXR3bCA9ICZ0d2w0MDMwX21vZHVsZXNbM107Ci0KLQkJcGRldiA9IHBsYXRmb3JtX2RldmljZV9hbGxvYygidHdsNDAzMF9iY2kiLCAtMSk7Ci0JCWlmICghcGRldikgewotCQkJcHJfZGVidWcoIiVzOiBjYW4ndCBhbGxvYyBiY2kgZGV2XG4iLCBEUklWRVJfTkFNRSk7Ci0JCQlzdGF0dXMgPSAtRU5PTUVNOwotCQkJZ290byBlcnI7Ci0JCX0KLQotCQlpZiAoc3RhdHVzID09IDApIHsKLQkJCXBkZXYtPmRldi5wYXJlbnQgPSAmdHdsLT5jbGllbnQtPmRldjsKLQkJCXN0YXR1cyA9IHBsYXRmb3JtX2RldmljZV9hZGRfZGF0YShwZGV2LCBwZGF0YS0+YmNpLAotCQkJCQlzaXplb2YoKnBkYXRhLT5iY2kpKTsKLQkJCWlmIChzdGF0dXMgPCAwKSB7Ci0JCQkJZGV2X2RiZygmdHdsLT5jbGllbnQtPmRldiwKLQkJCQkJImNhbid0IGFkZCBiY2kgZGF0YSwgJWRcbiIsCi0JCQkJCXN0YXR1cyk7Ci0JCQkJZ290byBlcnI7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoc3RhdHVzID09IDApIHsKLQkJCXN0cnVjdCByZXNvdXJjZSByID0gewotCQkJCS5zdGFydCA9IHBkYXRhLT5pcnFfYmFzZSArIDggKyAxLAotCQkJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAotCQkJfTsKLQotCQkJc3RhdHVzID0gcGxhdGZvcm1fZGV2aWNlX2FkZF9yZXNvdXJjZXMocGRldiwgJnIsIDEpOwotCQl9Ci0KLQkJaWYgKHN0YXR1cyA9PSAwKQotCQkJc3RhdHVzID0gcGxhdGZvcm1fZGV2aWNlX2FkZChwZGV2KTsKLQotCQlpZiAoc3RhdHVzIDwgMCkgewotCQkJcGxhdGZvcm1fZGV2aWNlX3B1dChwZGV2KTsKLQkJCWRldl9kYmcoJnR3bC0+Y2xpZW50LT5kZXYsCi0JCQkJCSJjYW4ndCBjcmVhdGUgYmNpIGRldiwgJWRcbiIsCi0JCQkJCXN0YXR1cyk7Ci0JCQlnb3RvIGVycjsKLQkJfQorCWlmICh0d2xfaGFzX2JjaSgpICYmIHBkYXRhLT5iY2kgJiYgIShmZWF0dXJlcyAmIFRQU19TVUJTRVQpKSB7CisJCWNoaWxkID0gYWRkX2NoaWxkKDMsICJ0d2w0MDMwX2JjaSIsCisJCQkJcGRhdGEtPmJjaSwgc2l6ZW9mKCpwZGF0YS0+YmNpKSwKKwkJCQlmYWxzZSwKKwkJCQkvKiBpcnEwID0gQ0hHX1BSRVMsIGlycTEgPSBCQ0kgKi8KKwkJCQlwZGF0YS0+aXJxX2Jhc2UgKyA4ICsgMSwgcGRhdGEtPmlycV9iYXNlICsgMik7CisJCWlmIChJU19FUlIoY2hpbGQpKQorCQkJcmV0dXJuIFBUUl9FUlIoY2hpbGQpOwogCX0KIAogCWlmICh0d2xfaGFzX2dwaW8oKSAmJiBwZGF0YS0+Z3BpbykgewotCQl0d2wgPSAmdHdsNDAzMF9tb2R1bGVzWzFdOwotCi0JCXBkZXYgPSBwbGF0Zm9ybV9kZXZpY2VfYWxsb2MoInR3bDQwMzBfZ3BpbyIsIC0xKTsKLQkJaWYgKCFwZGV2KSB7Ci0JCQlwcl9kZWJ1ZygiJXM6IGNhbid0IGFsbG9jIGdwaW8gZGV2XG4iLCBEUklWRVJfTkFNRSk7Ci0JCQlzdGF0dXMgPSAtRU5PTUVNOwotCQkJZ290byBlcnI7Ci0JCX0KLQotCQkvKiBtb3JlIGRyaXZlciBtb2RlbCBpbml0ICovCi0JCWlmIChzdGF0dXMgPT0gMCkgewotCQkJcGRldi0+ZGV2LnBhcmVudCA9ICZ0d2wtPmNsaWVudC0+ZGV2OwotCQkJLyogZGV2aWNlX2luaXRfd2FrZXVwKCZwZGV2LT5kZXYsIDEpOyAqLwotCi0JCQlzdGF0dXMgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkX2RhdGEocGRldiwgcGRhdGEtPmdwaW8sCi0JCQkJCXNpemVvZigqcGRhdGEtPmdwaW8pKTsKLQkJCWlmIChzdGF0dXMgPCAwKSB7Ci0JCQkJZGV2X2RiZygmdHdsLT5jbGllbnQtPmRldiwKLQkJCQkJImNhbid0IGFkZCBncGlvIGRhdGEsICVkXG4iLAotCQkJCQlzdGF0dXMpOwotCQkJCWdvdG8gZXJyOwotCQkJfQotCQl9Ci0KLQkJLyogR1BJTyBtb2R1bGUgSVJRICovCi0JCWlmIChzdGF0dXMgPT0gMCkgewotCQkJc3RydWN0IHJlc291cmNlCXIgPSB7Ci0JCQkJLnN0YXJ0ID0gcGRhdGEtPmlycV9iYXNlICsgMCwKLQkJCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKLQkJCX07Ci0KLQkJCXN0YXR1cyA9IHBsYXRmb3JtX2RldmljZV9hZGRfcmVzb3VyY2VzKHBkZXYsICZyLCAxKTsKLQkJfQotCi0JCWlmIChzdGF0dXMgPT0gMCkKLQkJCXN0YXR1cyA9IHBsYXRmb3JtX2RldmljZV9hZGQocGRldik7Ci0KLQkJaWYgKHN0YXR1cyA8IDApIHsKLQkJCXBsYXRmb3JtX2RldmljZV9wdXQocGRldik7Ci0JCQlkZXZfZGJnKCZ0d2wtPmNsaWVudC0+ZGV2LAotCQkJCQkiY2FuJ3QgY3JlYXRlIGdwaW8gZGV2LCAlZFxuIiwKLQkJCQkJc3RhdHVzKTsKLQkJCWdvdG8gZXJyOwotCQl9CisJCWNoaWxkID0gYWRkX2NoaWxkKDEsICJ0d2w0MDMwX2dwaW8iLAorCQkJCXBkYXRhLT5ncGlvLCBzaXplb2YoKnBkYXRhLT5ncGlvKSwKKwkJCQlmYWxzZSwgcGRhdGEtPmlycV9iYXNlICsgMCwgMCk7CisJCWlmIChJU19FUlIoY2hpbGQpKQorCQkJcmV0dXJuIFBUUl9FUlIoY2hpbGQpOwogCX0KIAogCWlmICh0d2xfaGFzX2tleXBhZCgpICYmIHBkYXRhLT5rZXlwYWQpIHsKLQkJcGRldiA9IHBsYXRmb3JtX2RldmljZV9hbGxvYygidHdsNDAzMF9rZXlwYWQiLCAtMSk7Ci0JCWlmIChwZGV2KSB7Ci0JCQl0d2wgPSAmdHdsNDAzMF9tb2R1bGVzWzJdOwotCQkJcGRldi0+ZGV2LnBhcmVudCA9ICZ0d2wtPmNsaWVudC0+ZGV2OwotCQkJZGV2aWNlX2luaXRfd2FrZXVwKCZwZGV2LT5kZXYsIDEpOwotCQkJc3RhdHVzID0gcGxhdGZvcm1fZGV2aWNlX2FkZF9kYXRhKHBkZXYsIHBkYXRhLT5rZXlwYWQsCi0JCQkJCXNpemVvZigqcGRhdGEtPmtleXBhZCkpOwotCQkJaWYgKHN0YXR1cyA8IDApIHsKLQkJCQlkZXZfZGJnKCZ0d2wtPmNsaWVudC0+ZGV2LAotCQkJCQkiY2FuJ3QgYWRkIGtleXBhZCBkYXRhLCAlZFxuIiwKLQkJCQkJc3RhdHVzKTsKLQkJCQlwbGF0Zm9ybV9kZXZpY2VfcHV0KHBkZXYpOwotCQkJCWdvdG8gZXJyOwotCQkJfQotCQkJc3RhdHVzID0gcGxhdGZvcm1fZGV2aWNlX2FkZChwZGV2KTsKLQkJCWlmIChzdGF0dXMgPCAwKSB7Ci0JCQkJcGxhdGZvcm1fZGV2aWNlX3B1dChwZGV2KTsKLQkJCQlkZXZfZGJnKCZ0d2wtPmNsaWVudC0+ZGV2LAotCQkJCQkJImNhbid0IGNyZWF0ZSBrZXlwYWQgZGV2LCAlZFxuIiwKLQkJCQkJCXN0YXR1cyk7Ci0JCQkJZ290byBlcnI7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlwcl9kZWJ1ZygiJXM6IGNhbid0IGFsbG9jIGtleXBhZCBkZXZcbiIsIERSSVZFUl9OQU1FKTsKLQkJCXN0YXR1cyA9IC1FTk9NRU07Ci0JCQlnb3RvIGVycjsKLQkJfQorCQljaGlsZCA9IGFkZF9jaGlsZCgyLCAidHdsNDAzMF9rZXlwYWQiLAorCQkJCXBkYXRhLT5rZXlwYWQsIHNpemVvZigqcGRhdGEtPmtleXBhZCksCisJCQkJdHJ1ZSwgcGRhdGEtPmlycV9iYXNlICsgMSwgMCk7CisJCWlmIChJU19FUlIoY2hpbGQpKQorCQkJcmV0dXJuIFBUUl9FUlIoY2hpbGQpOwogCX0KIAogCWlmICh0d2xfaGFzX21hZGMoKSAmJiBwZGF0YS0+bWFkYykgewotCQlwZGV2ID0gcGxhdGZvcm1fZGV2aWNlX2FsbG9jKCJ0d2w0MDMwX21hZGMiLCAtMSk7Ci0JCWlmIChwZGV2KSB7Ci0JCQl0d2wgPSAmdHdsNDAzMF9tb2R1bGVzWzJdOwotCQkJcGRldi0+ZGV2LnBhcmVudCA9ICZ0d2wtPmNsaWVudC0+ZGV2OwotCQkJZGV2aWNlX2luaXRfd2FrZXVwKCZwZGV2LT5kZXYsIDEpOwotCQkJc3RhdHVzID0gcGxhdGZvcm1fZGV2aWNlX2FkZF9kYXRhKHBkZXYsIHBkYXRhLT5tYWRjLAotCQkJCQlzaXplb2YoKnBkYXRhLT5tYWRjKSk7Ci0JCQlpZiAoc3RhdHVzIDwgMCkgewotCQkJCXBsYXRmb3JtX2RldmljZV9wdXQocGRldik7Ci0JCQkJZGV2X2RiZygmdHdsLT5jbGllbnQtPmRldiwKLQkJCQkJImNhbid0IGFkZCBtYWRjIGRhdGEsICVkXG4iLAotCQkJCQlzdGF0dXMpOwotCQkJCWdvdG8gZXJyOwotCQkJfQotCQkJc3RhdHVzID0gcGxhdGZvcm1fZGV2aWNlX2FkZChwZGV2KTsKLQkJCWlmIChzdGF0dXMgPCAwKSB7Ci0JCQkJcGxhdGZvcm1fZGV2aWNlX3B1dChwZGV2KTsKLQkJCQlkZXZfZGJnKCZ0d2wtPmNsaWVudC0+ZGV2LAotCQkJCQkJImNhbid0IGNyZWF0ZSBtYWRjIGRldiwgJWRcbiIsCi0JCQkJCQlzdGF0dXMpOwotCQkJCWdvdG8gZXJyOwotCQkJfQotCQl9IGVsc2UgewotCQkJcHJfZGVidWcoIiVzOiBjYW4ndCBhbGxvYyBtYWRjIGRldlxuIiwgRFJJVkVSX05BTUUpOwotCQkJc3RhdHVzID0gLUVOT01FTTsKLQkJCWdvdG8gZXJyOwotCQl9CisJCWNoaWxkID0gYWRkX2NoaWxkKDIsICJ0d2w0MDMwX21hZGMiLAorCQkJCXBkYXRhLT5tYWRjLCBzaXplb2YoKnBkYXRhLT5tYWRjKSwKKwkJCQl0cnVlLCBwZGF0YS0+aXJxX2Jhc2UgKyAzLCAwKTsKKwkJaWYgKElTX0VSUihjaGlsZCkpCisJCQlyZXR1cm4gUFRSX0VSUihjaGlsZCk7CiAJfQogCiAJaWYgKHR3bF9oYXNfcnRjKCkpIHsKLQkJdHdsID0gJnR3bDQwMzBfbW9kdWxlc1szXTsKLQotCQlwZGV2ID0gcGxhdGZvcm1fZGV2aWNlX2FsbG9jKCJ0d2w0MDMwX3J0YyIsIC0xKTsKLQkJaWYgKCFwZGV2KSB7Ci0JCQlwcl9kZWJ1ZygiJXM6IGNhbid0IGFsbG9jIHJ0YyBkZXZcbiIsIERSSVZFUl9OQU1FKTsKLQkJCXN0YXR1cyA9IC1FTk9NRU07Ci0JCX0gZWxzZSB7Ci0JCQlwZGV2LT5kZXYucGFyZW50ID0gJnR3bC0+Y2xpZW50LT5kZXY7Ci0JCQlkZXZpY2VfaW5pdF93YWtldXAoJnBkZXYtPmRldiwgMSk7Ci0JCX0KLQogCQkvKgotCQkgKiBSRVZJU0lUIHBsYXRmb3JtX2RhdGEgaGVyZSBjdXJyZW50bHkgbWlnaHQgdXNlIG9mCisJCSAqIFJFVklTSVQgcGxhdGZvcm1fZGF0YSBoZXJlIGN1cnJlbnRseSBtaWdodCBleHBvc2UgdGhlCiAJCSAqICJtc2VjdXJlIiBsaW5lIC4uLiBidXQgZm9yIG5vdyB3ZSBqdXN0IGV4cGVjdCBib2FyZAotCQkgKiBzZXR1cCB0byB0ZWxsIHRoZSBjaGlwICJ3ZSBhcmUgc2VjdXJlIiBhdCBhbGwgdGltZXMuCisJCSAqIHNldHVwIHRvIHRlbGwgdGhlIGNoaXAgIml0J3MgYWx3YXlzIG9rIHRvIFNFVF9USU1FIi4KIAkJICogRXZlbnR1YWxseSwgTGludXggbWlnaHQgYmVjb21lIG1vcmUgYXdhcmUgb2Ygc3VjaAogCQkgKiBIVyBzZWN1cml0eSBjb25jZXJucywgYW5kICJsZWFzdCBwcml2aWxlZ2UiLgogCQkgKi8KLQotCQkvKiBSVEMgbW9kdWxlIElSUSAqLwotCQlpZiAoc3RhdHVzID09IDApIHsKLQkJCXN0cnVjdCByZXNvdXJjZQlyID0gewotCQkJCS5zdGFydCA9IHBkYXRhLT5pcnFfYmFzZSArIDggKyAzLAotCQkJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAotCQkJfTsKLQotCQkJc3RhdHVzID0gcGxhdGZvcm1fZGV2aWNlX2FkZF9yZXNvdXJjZXMocGRldiwgJnIsIDEpOwotCQl9Ci0KLQkJaWYgKHN0YXR1cyA9PSAwKQotCQkJc3RhdHVzID0gcGxhdGZvcm1fZGV2aWNlX2FkZChwZGV2KTsKLQotCQlpZiAoc3RhdHVzIDwgMCkgewotCQkJcGxhdGZvcm1fZGV2aWNlX3B1dChwZGV2KTsKLQkJCWRldl9kYmcoJnR3bC0+Y2xpZW50LT5kZXYsCi0JCQkJCSJjYW4ndCBjcmVhdGUgcnRjIGRldiwgJWRcbiIsCi0JCQkJCXN0YXR1cyk7Ci0JCQlnb3RvIGVycjsKLQkJfQorCQljaGlsZCA9IGFkZF9jaGlsZCgzLCAidHdsNDAzMF9ydGMiLAorCQkJCU5VTEwsIDAsCisJCQkJdHJ1ZSwgcGRhdGEtPmlycV9iYXNlICsgOCArIDMsIDApOworCQlpZiAoSVNfRVJSKGNoaWxkKSkKKwkJCXJldHVybiBQVFJfRVJSKGNoaWxkKTsKIAl9CiAKIAlpZiAodHdsX2hhc191c2IoKSAmJiBwZGF0YS0+dXNiKSB7Ci0JCXR3bCA9ICZ0d2w0MDMwX21vZHVsZXNbMF07CisJCWNoaWxkID0gYWRkX2NoaWxkKDAsICJ0d2w0MDMwX3VzYiIsCisJCQkJcGRhdGEtPnVzYiwgc2l6ZW9mKCpwZGF0YS0+dXNiKSwKKwkJCQl0cnVlLAorCQkJCS8qIGlycTAgPSBVU0JfUFJFUywgaXJxMSA9IFVTQiAqLworCQkJCXBkYXRhLT5pcnFfYmFzZSArIDggKyAyLCBwZGF0YS0+aXJxX2Jhc2UgKyA0KTsKKwkJaWYgKElTX0VSUihjaGlsZCkpCisJCQlyZXR1cm4gUFRSX0VSUihjaGlsZCk7CiAKLQkJcGRldiA9IHBsYXRmb3JtX2RldmljZV9hbGxvYygidHdsNDAzMF91c2IiLCAtMSk7Ci0JCWlmICghcGRldikgewotCQkJcHJfZGVidWcoIiVzOiBjYW4ndCBhbGxvYyB1c2IgZGV2XG4iLCBEUklWRVJfTkFNRSk7Ci0JCQlzdGF0dXMgPSAtRU5PTUVNOwotCQkJZ290byBlcnI7Ci0JCX0KLQotCQlpZiAoc3RhdHVzID09IDApIHsKLQkJCXBkZXYtPmRldi5wYXJlbnQgPSAmdHdsLT5jbGllbnQtPmRldjsKLQkJCWRldmljZV9pbml0X3dha2V1cCgmcGRldi0+ZGV2LCAxKTsKLQkJCXN0YXR1cyA9IHBsYXRmb3JtX2RldmljZV9hZGRfZGF0YShwZGV2LCBwZGF0YS0+dXNiLAotCQkJCQlzaXplb2YoKnBkYXRhLT51c2IpKTsKLQkJCWlmIChzdGF0dXMgPCAwKSB7Ci0JCQkJcGxhdGZvcm1fZGV2aWNlX3B1dChwZGV2KTsKLQkJCQlkZXZfZGJnKCZ0d2wtPmNsaWVudC0+ZGV2LAotCQkJCQkiY2FuJ3QgYWRkIHVzYiBkYXRhLCAlZFxuIiwKLQkJCQkJc3RhdHVzKTsKLQkJCQlnb3RvIGVycjsKLQkJCX0KLQkJfQotCi0JCWlmIChzdGF0dXMgPT0gMCkgewotCQkJc3RydWN0IHJlc291cmNlIHIgPSB7Ci0JCQkJLnN0YXJ0ID0gcGRhdGEtPmlycV9iYXNlICsgOCArIDIsCi0JCQkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCi0JCQl9OwotCi0JCQlzdGF0dXMgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkX3Jlc291cmNlcyhwZGV2LCAmciwgMSk7Ci0JCX0KLQotCQlpZiAoc3RhdHVzID09IDApCi0JCQlzdGF0dXMgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkKHBkZXYpOwotCi0JCWlmIChzdGF0dXMgPCAwKSB7Ci0JCQlwbGF0Zm9ybV9kZXZpY2VfcHV0KHBkZXYpOwotCQkJZGV2X2RiZygmdHdsLT5jbGllbnQtPmRldiwKLQkJCQkJImNhbid0IGNyZWF0ZSB1c2IgZGV2LCAlZFxuIiwKLQkJCQkJc3RhdHVzKTsKLQkJfQorCQkvKiB3ZSBuZWVkIHRvIGNvbm5lY3QgcmVndWxhdG9ycyB0byB0aGlzIHRyYW5zY2VpdmVyICovCisJCXVzYl90cmFuc2NlaXZlciA9IGNoaWxkOwogCX0KIAotZXJyOgotCWlmIChzdGF0dXMpCi0JCXByX2VycigiZmFpbGVkIHRvIGFkZCB0d2w0MDMwJ3MgY2hpbGRyZW4gKHN0YXR1cyAlZClcbiIsIHN0YXR1cyk7Ci0JcmV0dXJuIHN0YXR1czsKKwlpZiAodHdsX2hhc19yZWd1bGF0b3IoKSkgeworCQkvKgorCQljaGlsZCA9IGFkZF9yZWd1bGF0b3IoVFdMNDAzMF9SRUdfVlBMTDEsIHBkYXRhLT52cGxsMSk7CisJCWlmIChJU19FUlIoY2hpbGQpKQorCQkJcmV0dXJuIFBUUl9FUlIoY2hpbGQpOworCQkqLworCisJCWNoaWxkID0gYWRkX3JlZ3VsYXRvcihUV0w0MDMwX1JFR19WTU1DMSwgcGRhdGEtPnZtbWMxKTsKKwkJaWYgKElTX0VSUihjaGlsZCkpCisJCQlyZXR1cm4gUFRSX0VSUihjaGlsZCk7CisKKwkJY2hpbGQgPSBhZGRfcmVndWxhdG9yKFRXTDQwMzBfUkVHX1ZEQUMsIHBkYXRhLT52ZGFjKTsKKwkJaWYgKElTX0VSUihjaGlsZCkpCisJCQlyZXR1cm4gUFRSX0VSUihjaGlsZCk7CisKKwkJY2hpbGQgPSBhZGRfcmVndWxhdG9yKChmZWF0dXJlcyAmIFRXTDQwMzBfVkFVWDIpCisJCQkJCT8gVFdMNDAzMF9SRUdfVkFVWDJfNDAzMAorCQkJCQk6IFRXTDQwMzBfUkVHX1ZBVVgyLAorCQkJCXBkYXRhLT52YXV4Mik7CisJCWlmIChJU19FUlIoY2hpbGQpKQorCQkJcmV0dXJuIFBUUl9FUlIoY2hpbGQpOworCX0KKworCWlmICh0d2xfaGFzX3JlZ3VsYXRvcigpICYmIHVzYl90cmFuc2NlaXZlcikgeworCQlzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgdXNiMXY1ID0geworCQkJLnN1cHBseSA9CSJ1c2IxdjUiLAorCQl9OworCQlzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgdXNiMXY4ID0geworCQkJLnN1cHBseSA9CSJ1c2IxdjgiLAorCQl9OworCQlzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgdXNiM3YxID0geworCQkJLnN1cHBseSA9CSJ1c2IzdjEiLAorCQl9OworCisJCS8qIHRoaXMgaXMgYSB0ZW1wbGF0ZSB0aGF0IGdldHMgY29waWVkICovCisJCXN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIHVzYl9maXhlZCA9IHsKKwkJCS5jb25zdHJhaW50cy52YWxpZF9tb2Rlc19tYXNrID0KKwkJCQkgIFJFR1VMQVRPUl9NT0RFX05PUk1BTAorCQkJCXwgUkVHVUxBVE9SX01PREVfU1RBTkRCWSwKKwkJCS5jb25zdHJhaW50cy52YWxpZF9vcHNfbWFzayA9CisJCQkJICBSRUdVTEFUT1JfQ0hBTkdFX01PREUKKwkJCQl8IFJFR1VMQVRPUl9DSEFOR0VfU1RBVFVTLAorCQl9OworCisJCXVzYjF2NS5kZXYgPSB1c2JfdHJhbnNjZWl2ZXI7CisJCXVzYjF2OC5kZXYgPSB1c2JfdHJhbnNjZWl2ZXI7CisJCXVzYjN2MS5kZXYgPSB1c2JfdHJhbnNjZWl2ZXI7CisKKwkJY2hpbGQgPSBhZGRfcmVndWxhdG9yX2xpbmtlZChUV0w0MDMwX1JFR19WVVNCMVY1LCAmdXNiX2ZpeGVkLAorCQkJCSZ1c2IxdjUsIDEpOworCQlpZiAoSVNfRVJSKGNoaWxkKSkKKwkJCXJldHVybiBQVFJfRVJSKGNoaWxkKTsKKworCQljaGlsZCA9IGFkZF9yZWd1bGF0b3JfbGlua2VkKFRXTDQwMzBfUkVHX1ZVU0IxVjgsICZ1c2JfZml4ZWQsCisJCQkJJnVzYjF2OCwgMSk7CisJCWlmIChJU19FUlIoY2hpbGQpKQorCQkJcmV0dXJuIFBUUl9FUlIoY2hpbGQpOworCisJCWNoaWxkID0gYWRkX3JlZ3VsYXRvcl9saW5rZWQoVFdMNDAzMF9SRUdfVlVTQjNWMSwgJnVzYl9maXhlZCwKKwkJCQkmdXNiM3YxLCAxKTsKKwkJaWYgKElTX0VSUihjaGlsZCkpCisJCQlyZXR1cm4gUFRSX0VSUihjaGlsZCk7CisJfQorCisJLyogbWF5YmUgYWRkIExET3MgdGhhdCBhcmUgb21pdHRlZCBvbiBjb3N0LXJlZHVjZWQgcGFydHMgKi8KKwlpZiAodHdsX2hhc19yZWd1bGF0b3IoKSAmJiAhKGZlYXR1cmVzICYgVFBTX1NVQlNFVCkpIHsKKwkJLyoKKwkJY2hpbGQgPSBhZGRfcmVndWxhdG9yKFRXTDQwMzBfUkVHX1ZQTEwyLCBwZGF0YS0+dnBsbDIpOworCQlpZiAoSVNfRVJSKGNoaWxkKSkKKwkJCXJldHVybiBQVFJfRVJSKGNoaWxkKTsKKwkJKi8KKworCQljaGlsZCA9IGFkZF9yZWd1bGF0b3IoVFdMNDAzMF9SRUdfVk1NQzIsIHBkYXRhLT52bW1jMik7CisJCWlmIChJU19FUlIoY2hpbGQpKQorCQkJcmV0dXJuIFBUUl9FUlIoY2hpbGQpOworCisJCWNoaWxkID0gYWRkX3JlZ3VsYXRvcihUV0w0MDMwX1JFR19WU0lNLCBwZGF0YS0+dnNpbSk7CisJCWlmIChJU19FUlIoY2hpbGQpKQorCQkJcmV0dXJuIFBUUl9FUlIoY2hpbGQpOworCisJCWNoaWxkID0gYWRkX3JlZ3VsYXRvcihUV0w0MDMwX1JFR19WQVVYMSwgcGRhdGEtPnZhdXgxKTsKKwkJaWYgKElTX0VSUihjaGlsZCkpCisJCQlyZXR1cm4gUFRSX0VSUihjaGlsZCk7CisKKwkJY2hpbGQgPSBhZGRfcmVndWxhdG9yKFRXTDQwMzBfUkVHX1ZBVVgzLCBwZGF0YS0+dmF1eDMpOworCQlpZiAoSVNfRVJSKGNoaWxkKSkKKwkJCXJldHVybiBQVFJfRVJSKGNoaWxkKTsKKworCQljaGlsZCA9IGFkZF9yZWd1bGF0b3IoVFdMNDAzMF9SRUdfVkFVWDQsIHBkYXRhLT52YXV4NCk7CisJCWlmIChJU19FUlIoY2hpbGQpKQorCQkJcmV0dXJuIFBUUl9FUlIoY2hpbGQpOworCX0KKworCXJldHVybiAwOwogfQogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpAQCAtNjQ1LDEyICs2NTgsNyBAQAogCQlvc2MgPSBjbGtfZ2V0KE5VTEwsICJvc2NfY2siKTsKIAllbHNlCiAJCW9zYyA9IGNsa19nZXQoTlVMTCwgIm9zY19zeXNfY2siKTsKLSNlbHNlCi0JLyogUkVWSVNJVCBmb3Igbm9uLU9NQVAgc3lzdGVtcywgcGFzcyB0aGUgY2xvY2sgcmF0ZSBmcm9tCi0JICogYm9hcmQgaW5pdCBjb2RlLCB1c2luZyBwbGF0Zm9ybV9kYXRhLgotCSAqLwotCW9zYyA9IEVSUl9QVFIoLUVJTyk7Ci0jZW5kaWYKKwogCWlmIChJU19FUlIob3NjKSkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICJTa2lwcGluZyB0d2w0MDMwIGludGVybmFsIGNsb2NrIGluaXQgYW5kICIKIAkJCQkidXNpbmcgYm9vdGxvYWRlciB2YWx1ZSAodW5rbm93biBvc2MgcmF0ZSlcbiIpOwpAQCAtNjYwLDYgKzY2OCwxOCBAQAogCXJhdGUgPSBjbGtfZ2V0X3JhdGUob3NjKTsKIAljbGtfcHV0KG9zYyk7CiAKKyNlbHNlCisJLyogUkVWSVNJVCBmb3Igbm9uLU9NQVAgc3lzdGVtcywgcGFzcyB0aGUgY2xvY2sgcmF0ZSBmcm9tCisJICogYm9hcmQgaW5pdCBjb2RlLCB1c2luZyBwbGF0Zm9ybV9kYXRhLgorCSAqLworCW9zYyA9IEVSUl9QVFIoLUVJTyk7CisKKwlwcmludGsoS0VSTl9XQVJOSU5HICJTa2lwcGluZyB0d2w0MDMwIGludGVybmFsIGNsb2NrIGluaXQgYW5kICIKKwkgICAgICAgInVzaW5nIGJvb3Rsb2FkZXIgdmFsdWUgKHVua25vd24gb3NjIHJhdGUpXG4iKTsKKworCXJldHVybjsKKyNlbmRpZgorCiAJc3dpdGNoIChyYXRlKSB7CiAJY2FzZSAxOTIwMDAwMDoKIAkJY3RybCA9IEhGQ0xLX0ZSRVFfMTlwMl9NSFo7CkBAIC03NjQsNyArNzg0LDcgQEAKIAkJCWdvdG8gZmFpbDsKIAl9CiAKLQlzdGF0dXMgPSBhZGRfY2hpbGRyZW4ocGRhdGEpOworCXN0YXR1cyA9IGFkZF9jaGlsZHJlbihwZGF0YSwgaWQtPmRyaXZlcl9kYXRhKTsKIGZhaWw6CiAJaWYgKHN0YXR1cyA8IDApCiAJCXR3bDQwMzBfcmVtb3ZlKGNsaWVudCk7CkBAIC03NzIsMTEgKzc5MiwxMSBAQAogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgdHdsNDAzMF9pZHNbXSA9IHsKLQl7ICJ0d2w0MDMwIiwgMCB9LAkvKiAiVHJpdG9uIDIiICovCi0JeyAidHBzNjU5NTAiLCAwIH0sCS8qIGNhdGFsb2cgdmVyc2lvbiBvZiB0d2w0MDMwICovCi0JeyAidHBzNjU5MzAiLCAwIH0sCS8qIGZld2VyIExET3MgYW5kIERBQ3M7IG5vIGNoYXJnZXIgKi8KLQl7ICJ0cHM2NTkyMCIsIDAgfSwJLyogZmV3ZXIgTERPczsgbm8gY29kZWMgb3IgY2hhcmdlciAqLwotCXsgInR3bDUwMzAiLCAwIH0sCS8qIFQyIHVwZGF0ZWQgKi8KKwl7ICJ0d2w0MDMwIiwgVFdMNDAzMF9WQVVYMiB9LAkvKiAiVHJpdG9uIDIiICovCisJeyAidHdsNTAzMCIsIDAgfSwJCS8qIFQyIHVwZGF0ZWQgKi8KKwl7ICJ0cHM2NTk1MCIsIDAgfSwJCS8qIGNhdGFsb2cgdmVyc2lvbiBvZiB0d2w1MDMwICovCisJeyAidHBzNjU5MzAiLCBUUFNfU1VCU0VUIH0sCS8qIGZld2VyIExET3MgYW5kIERBQ3M7IG5vIGNoYXJnZXIgKi8KKwl7ICJ0cHM2NTkyMCIsIFRQU19TVUJTRVQgfSwJLyogZmV3ZXIgTERPczsgbm8gY29kZWMgb3IgY2hhcmdlciAqLwogCXsgLyogZW5kIG9mIGxpc3QgKi8gfSwKIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgdHdsNDAzMF9pZHMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvdHdsNDAzMC1pcnEuYyBiL2RyaXZlcnMvbWZkL3R3bDQwMzAtaXJxLmMKaW5kZXggZmFlODY4YS4uYjEwODc2MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZmQvdHdsNDAzMC1pcnEuYworKysgYi9kcml2ZXJzL21mZC90d2w0MDMwLWlycS5jCkBAIC0xODAsMTAgKzE4MCwxNSBAQAogc3RhdGljIGludCB0d2w0MDMwX2lycV90aHJlYWQodm9pZCAqZGF0YSkKIHsKIAlsb25nIGlycSA9IChsb25nKWRhdGE7Ci0JaXJxX2Rlc2NfdCAqZGVzYyA9IGlycV9kZXNjICsgaXJxOworCXN0cnVjdCBpcnFfZGVzYyAqZGVzYyA9IGlycV90b19kZXNjKGlycSk7CiAJc3RhdGljIHVuc2lnbmVkIGkyY19lcnJvcnM7CiAJY29uc3Qgc3RhdGljIHVuc2lnbmVkIG1heF9pMmNfZXJyb3JzID0gMTAwOwogCisJaWYgKCFkZXNjKSB7CisJCXByX2VycigidHdsNDAzMDogSW52YWxpZCBJUlE6ICVsZFxuIiwgaXJxKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCiAJY3VycmVudC0+ZmxhZ3MgfD0gUEZfTk9GUkVFWkU7CiAKIAl3aGlsZSAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSkgewpAQCAtMjE1LDcgKzIyMCwxMyBAQAogCQkJCXBpaF9pc3I7CiAJCQkJcGloX2lzciA+Pj0gMSwgbW9kdWxlX2lycSsrKSB7CiAJCQlpZiAocGloX2lzciAmIDB4MSkgewotCQkJCWlycV9kZXNjX3QgKmQgPSBpcnFfZGVzYyArIG1vZHVsZV9pcnE7CisJCQkJc3RydWN0IGlycV9kZXNjICpkID0gaXJxX3RvX2Rlc2MobW9kdWxlX2lycSk7CisKKwkJCQlpZiAoIWQpIHsKKwkJCQkJcHJfZXJyKCJ0d2w0MDMwOiBJbnZhbGlkIFNJSCBJUlE6ICVkXG4iLAorCQkJCQkgICAgICAgbW9kdWxlX2lycSk7CisJCQkJCXJldHVybiAtRUlOVkFMOworCQkJCX0KIAogCQkJCS8qIFRoZXNlIGNhbid0IGJlIG1hc2tlZCAuLi4gYWx3YXlzIHdhcm4KIAkJCQkgKiBpZiB3ZSBnZXQgYW55IHN1cnByaXNlcy4KQEAgLTQ1MiwxMCArNDYzLDE2IEBACiAJLyogTW9kaWZ5IG9ubHkgdGhlIGJpdHMgd2Uga25vdyBtdXN0IGNoYW5nZSAqLwogCXdoaWxlIChlZGdlX2NoYW5nZSkgewogCQlpbnQJCWkgPSBmbHMoZWRnZV9jaGFuZ2UpIC0gMTsKLQkJc3RydWN0IGlycV9kZXNjCSpkID0gaXJxX2Rlc2MgKyBpICsgYWdlbnQtPmlycV9iYXNlOworCQlzdHJ1Y3QgaXJxX2Rlc2MJKmQgPSBpcnFfdG9fZGVzYyhpICsgYWdlbnQtPmlycV9iYXNlKTsKIAkJaW50CQlieXRlID0gMSArIChpID4+IDIpOwogCQlpbnQJCW9mZiA9IChpICYgMHgzKSAqIDI7CiAKKwkJaWYgKCFkKSB7CisJCQlwcl9lcnIoInR3bDQwMzA6IEludmFsaWQgSVJROiAlZFxuIiwKKwkJCSAgICAgICBpICsgYWdlbnQtPmlycV9iYXNlKTsKKwkJCXJldHVybjsKKwkJfQorCiAJCWJ5dGVzW2J5dGVdICY9IH4oMHgwMyA8PCBvZmYpOwogCiAJCXNwaW5fbG9ja19pcnEoJmQtPmxvY2spOwpAQCAtNTEyLDkgKzUyOSwxNCBAQAogc3RhdGljIGludCB0d2w0MDMwX3NpaF9zZXRfdHlwZSh1bnNpZ25lZCBpcnEsIHVuc2lnbmVkIHRyaWdnZXIpCiB7CiAJc3RydWN0IHNpaF9hZ2VudCAqc2loID0gZ2V0X2lycV9jaGlwX2RhdGEoaXJxKTsKLQlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MgPSBpcnFfZGVzYyArIGlycTsKKwlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MgPSBpcnFfdG9fZGVzYyhpcnEpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKKwlpZiAoIWRlc2MpIHsKKwkJcHJfZXJyKCJ0d2w0MDMwOiBJbnZhbGlkIElSUTogJWRcbiIsIGlycSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwogCWlmICh0cmlnZ2VyICYgfihJUlFfVFlQRV9FREdFX0ZBTExJTkcgfCBJUlFfVFlQRV9FREdFX1JJU0lORykpCiAJCXJldHVybiAtRUlOVkFMOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC93bTgzNTAtY29yZS5jIGIvZHJpdmVycy9tZmQvd204MzUwLWNvcmUuYwppbmRleCAwZDQ3ZmI5Li4zYTI3M2NjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21mZC93bTgzNTAtY29yZS5jCisrKyBiL2RyaXZlcnMvbWZkL3dtODM1MC1jb3JlLmMKQEAgLTYzLDcgKzYzLDYgQEAKICAqLwogc3RhdGljIERFRklORV9NVVRFWChpb19tdXRleCk7CiBzdGF0aWMgREVGSU5FX01VVEVYKHJlZ19sb2NrX211dGV4KTsKLXN0YXRpYyBERUZJTkVfTVVURVgoYXV4YWRjX211dGV4KTsKIAogLyogUGVyZm9ybSBhIHBoeXNpY2FsIHJlYWQgZnJvbSB0aGUgZGV2aWNlLgogICovCkBAIC0yOTksNiArMjk4LDEzIEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTCh3bTgzNTBfYmxvY2tfd3JpdGUpOwogCisvKioKKyAqIHdtODM1MF9yZWdfbG9jaygpCisgKgorICogVGhlIFdNODM1MCBoYXMgYSBoYXJkd2FyZSBsb2NrIHdoaWNoIGNhbiBiZSB1c2VkIHRvIHByZXZlbnQgd3JpdGVzIHRvCisgKiBzb21lIHJlZ2lzdGVycyAoZ2VuZXJhbGx5IHRob3NlIHdoaWNoIGNhbiBjYXVzZSBwYXJ0aWN1bGFybHkgc2VyaW91cworICogcHJvYmxlbXMgaWYgbWlzdXNlZCkuICBUaGlzIGZ1bmN0aW9uIGVuYWJsZXMgdGhhdCBsb2NrLgorICovCiBpbnQgd204MzUwX3JlZ19sb2NrKHN0cnVjdCB3bTgzNTAgKndtODM1MCkKIHsKIAl1MTYga2V5ID0gV004MzUwX0xPQ0tfS0VZOwpAQCAtMzE0LDYgKzMyMCwxNSBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwod204MzUwX3JlZ19sb2NrKTsKIAorLyoqCisgKiB3bTgzNTBfcmVnX3VubG9jaygpCisgKgorICogVGhlIFdNODM1MCBoYXMgYSBoYXJkd2FyZSBsb2NrIHdoaWNoIGNhbiBiZSB1c2VkIHRvIHByZXZlbnQgd3JpdGVzIHRvCisgKiBzb21lIHJlZ2lzdGVycyAoZ2VuZXJhbGx5IHRob3NlIHdoaWNoIGNhbiBjYXVzZSBwYXJ0aWN1bGFybHkgc2VyaW91cworICogcHJvYmxlbXMgaWYgbWlzdXNlZCkuICBUaGlzIGZ1bmN0aW9uIGRpc2FibGVzIHRoYXQgbG9jayBzbyB1cGRhdGVzCisgKiBjYW4gYmUgcGVyZm9ybWVkLiAgRm9yIG1heGltdW0gc2FmZXR5IHRoaXMgc2hvdWxkIGJlIGRvbmUgb25seSB3aGVuCisgKiByZXF1aXJlZC4KKyAqLwogaW50IHdtODM1MF9yZWdfdW5sb2NrKHN0cnVjdCB3bTgzNTAgKndtODM1MCkKIHsKIAl1MTYga2V5ID0gV004MzUwX1VOTE9DS19LRVk7CkBAIC0xMDY2LDM4ICsxMDgxLDE1OCBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwod204MzUwX3VubWFza19pcnEpOwogCitpbnQgd204MzUwX3JlYWRfYXV4YWRjKHN0cnVjdCB3bTgzNTAgKndtODM1MCwgaW50IGNoYW5uZWwsIGludCBzY2FsZSwgaW50IHZyZWYpCit7CisJdTE2IHJlZywgcmVzdWx0ID0gMDsKKwlpbnQgdHJpZXMgPSA1OworCisJaWYgKGNoYW5uZWwgPCBXTTgzNTBfQVVYQURDX0FVWDEgfHwgY2hhbm5lbCA+IFdNODM1MF9BVVhBRENfVEVNUCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGNoYW5uZWwgPj0gV004MzUwX0FVWEFEQ19VU0IgJiYgY2hhbm5lbCA8PSBXTTgzNTBfQVVYQURDX1RFTVAKKwkgICAgJiYgKHNjYWxlICE9IDAgfHwgdnJlZiAhPSAwKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltdXRleF9sb2NrKCZ3bTgzNTAtPmF1eGFkY19tdXRleCk7CisKKwkvKiBUdXJuIG9uIHRoZSBBREMgKi8KKwlyZWcgPSB3bTgzNTBfcmVnX3JlYWQod204MzUwLCBXTTgzNTBfUE9XRVJfTUdNVF81KTsKKwl3bTgzNTBfcmVnX3dyaXRlKHdtODM1MCwgV004MzUwX1BPV0VSX01HTVRfNSwgcmVnIHwgV004MzUwX0FVWEFEQ19FTkEpOworCisJaWYgKHNjYWxlIHx8IHZyZWYpIHsKKwkJcmVnID0gc2NhbGUgPDwgMTM7CisJCXJlZyB8PSB2cmVmIDw8IDEyOworCQl3bTgzNTBfcmVnX3dyaXRlKHdtODM1MCwgV004MzUwX0FVWDFfUkVBREJBQ0sgKyBjaGFubmVsLCByZWcpOworCX0KKworCXJlZyA9IHdtODM1MF9yZWdfcmVhZCh3bTgzNTAsIFdNODM1MF9ESUdJVElTRVJfQ09OVFJPTF8xKTsKKwlyZWcgfD0gMSA8PCBjaGFubmVsIHwgV004MzUwX0FVWEFEQ19QT0xMOworCXdtODM1MF9yZWdfd3JpdGUod204MzUwLCBXTTgzNTBfRElHSVRJU0VSX0NPTlRST0xfMSwgcmVnKTsKKworCWRvIHsKKwkJc2NoZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlKDEpOworCQlyZWcgPSB3bTgzNTBfcmVnX3JlYWQod204MzUwLCBXTTgzNTBfRElHSVRJU0VSX0NPTlRST0xfMSk7CisJfSB3aGlsZSAodHJpZXMtLSAmJiAocmVnICYgV004MzUwX0FVWEFEQ19QT0xMKSk7CisKKwlpZiAoIXRyaWVzKQorCQlkZXZfZXJyKHdtODM1MC0+ZGV2LCAiYWRjIGNobiAlZCByZWFkIHRpbWVvdXRcbiIsIGNoYW5uZWwpOworCWVsc2UKKwkJcmVzdWx0ID0gd204MzUwX3JlZ19yZWFkKHdtODM1MCwKKwkJCQkJIFdNODM1MF9BVVgxX1JFQURCQUNLICsgY2hhbm5lbCk7CisKKwkvKiBUdXJuIG9mZiB0aGUgQURDICovCisJcmVnID0gd204MzUwX3JlZ19yZWFkKHdtODM1MCwgV004MzUwX1BPV0VSX01HTVRfNSk7CisJd204MzUwX3JlZ193cml0ZSh3bTgzNTAsIFdNODM1MF9QT1dFUl9NR01UXzUsCisJCQkgcmVnICYgfldNODM1MF9BVVhBRENfRU5BKTsKKworCW11dGV4X3VubG9jaygmd204MzUwLT5hdXhhZGNfbXV0ZXgpOworCisJcmV0dXJuIHJlc3VsdCAmIFdNODM1MF9BVVhBRENfREFUQTFfTUFTSzsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHdtODM1MF9yZWFkX2F1eGFkYyk7CisKIC8qCiAgKiBDYWNoZSBpcyBhbHdheXMgaG9zdCBlbmRpYW4uCiAgKi8KLXN0YXRpYyBpbnQgd204MzUwX2NyZWF0ZV9jYWNoZShzdHJ1Y3Qgd204MzUwICp3bTgzNTAsIGludCBtb2RlKQorc3RhdGljIGludCB3bTgzNTBfY3JlYXRlX2NhY2hlKHN0cnVjdCB3bTgzNTAgKndtODM1MCwgaW50IHR5cGUsIGludCBtb2RlKQogewogCWludCBpLCByZXQgPSAwOwogCXUxNiB2YWx1ZTsKIAljb25zdCB1MTYgKnJlZ19tYXA7CiAKLQlzd2l0Y2ggKG1vZGUpIHsKLSNpZmRlZiBDT05GSUdfTUZEX1dNODM1MF9DT05GSUdfTU9ERV8wCisJc3dpdGNoICh0eXBlKSB7CiAJY2FzZSAwOgotCQlyZWdfbWFwID0gd204MzUwX21vZGUwX2RlZmF1bHRzOwotCQlicmVhazsKKwkJc3dpdGNoIChtb2RlKSB7CisjaWZkZWYgQ09ORklHX01GRF9XTTgzNTBfQ09ORklHX01PREVfMAorCQljYXNlIDA6CisJCQlyZWdfbWFwID0gd204MzUwX21vZGUwX2RlZmF1bHRzOworCQkJYnJlYWs7CiAjZW5kaWYKICNpZmRlZiBDT05GSUdfTUZEX1dNODM1MF9DT05GSUdfTU9ERV8xCi0JY2FzZSAxOgotCQlyZWdfbWFwID0gd204MzUwX21vZGUxX2RlZmF1bHRzOwotCQlicmVhazsKKwkJY2FzZSAxOgorCQkJcmVnX21hcCA9IHdtODM1MF9tb2RlMV9kZWZhdWx0czsKKwkJCWJyZWFrOwogI2VuZGlmCiAjaWZkZWYgQ09ORklHX01GRF9XTTgzNTBfQ09ORklHX01PREVfMgotCWNhc2UgMjoKLQkJcmVnX21hcCA9IHdtODM1MF9tb2RlMl9kZWZhdWx0czsKLQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCXJlZ19tYXAgPSB3bTgzNTBfbW9kZTJfZGVmYXVsdHM7CisJCQlicmVhazsKICNlbmRpZgogI2lmZGVmIENPTkZJR19NRkRfV004MzUwX0NPTkZJR19NT0RFXzMKLQljYXNlIDM6Ci0JCXJlZ19tYXAgPSB3bTgzNTBfbW9kZTNfZGVmYXVsdHM7Ci0JCWJyZWFrOworCQljYXNlIDM6CisJCQlyZWdfbWFwID0gd204MzUwX21vZGUzX2RlZmF1bHRzOworCQkJYnJlYWs7CiAjZW5kaWYKKwkJZGVmYXVsdDoKKwkJCWRldl9lcnIod204MzUwLT5kZXYsCisJCQkJIldNODM1MCBjb25maWd1cmF0aW9uIG1vZGUgJWQgbm90IHN1cHBvcnRlZFxuIiwKKwkJCQltb2RlKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWJyZWFrOworCisJY2FzZSAxOgorCQlzd2l0Y2ggKG1vZGUpIHsKKyNpZmRlZiBDT05GSUdfTUZEX1dNODM1MV9DT05GSUdfTU9ERV8wCisJCWNhc2UgMDoKKwkJCXJlZ19tYXAgPSB3bTgzNTFfbW9kZTBfZGVmYXVsdHM7CisJCQlicmVhazsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19NRkRfV004MzUxX0NPTkZJR19NT0RFXzEKKwkJY2FzZSAxOgorCQkJcmVnX21hcCA9IHdtODM1MV9tb2RlMV9kZWZhdWx0czsKKwkJCWJyZWFrOworI2VuZGlmCisjaWZkZWYgQ09ORklHX01GRF9XTTgzNTFfQ09ORklHX01PREVfMgorCQljYXNlIDI6CisJCQlyZWdfbWFwID0gd204MzUxX21vZGUyX2RlZmF1bHRzOworCQkJYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfTUZEX1dNODM1MV9DT05GSUdfTU9ERV8zCisJCWNhc2UgMzoKKwkJCXJlZ19tYXAgPSB3bTgzNTFfbW9kZTNfZGVmYXVsdHM7CisJCQlicmVhazsKKyNlbmRpZgorCQlkZWZhdWx0OgorCQkJZGV2X2Vycih3bTgzNTAtPmRldiwKKwkJCQkiV004MzUxIGNvbmZpZ3VyYXRpb24gbW9kZSAlZCBub3Qgc3VwcG9ydGVkXG4iLAorCQkJCW1vZGUpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIDI6CisJCXN3aXRjaCAobW9kZSkgeworI2lmZGVmIENPTkZJR19NRkRfV004MzUyX0NPTkZJR19NT0RFXzAKKwkJY2FzZSAwOgorCQkJcmVnX21hcCA9IHdtODM1Ml9tb2RlMF9kZWZhdWx0czsKKwkJCWJyZWFrOworI2VuZGlmCisjaWZkZWYgQ09ORklHX01GRF9XTTgzNTJfQ09ORklHX01PREVfMQorCQljYXNlIDE6CisJCQlyZWdfbWFwID0gd204MzUyX21vZGUxX2RlZmF1bHRzOworCQkJYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfTUZEX1dNODM1Ml9DT05GSUdfTU9ERV8yCisJCWNhc2UgMjoKKwkJCXJlZ19tYXAgPSB3bTgzNTJfbW9kZTJfZGVmYXVsdHM7CisJCQlicmVhazsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19NRkRfV004MzUyX0NPTkZJR19NT0RFXzMKKwkJY2FzZSAzOgorCQkJcmVnX21hcCA9IHdtODM1Ml9tb2RlM19kZWZhdWx0czsKKwkJCWJyZWFrOworI2VuZGlmCisJCWRlZmF1bHQ6CisJCQlkZXZfZXJyKHdtODM1MC0+ZGV2LAorCQkJCSJXTTgzNTIgY29uZmlndXJhdGlvbiBtb2RlICVkIG5vdCBzdXBwb3J0ZWRcbiIsCisJCQkJbW9kZSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlicmVhazsKKwogCWRlZmF1bHQ6Ci0JCWRldl9lcnIod204MzUwLT5kZXYsICJDb25maWd1cmF0aW9uIG1vZGUgJWQgbm90IHN1cHBvcnRlZFxuIiwKKwkJZGV2X2Vycih3bTgzNTAtPmRldiwKKwkJCSJXTTgzNXggY29uZmlndXJhdGlvbiBtb2RlICVkIG5vdCBzdXBwb3J0ZWRcbiIsCiAJCQltb2RlKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtMTE2Myw1MyArMTI5OCwxMTMgQEAKIAkJICAgICAgIHN0cnVjdCB3bTgzNTBfcGxhdGZvcm1fZGF0YSAqcGRhdGEpCiB7CiAJaW50IHJldCA9IC1FSU5WQUw7Ci0JdTE2IGlkMSwgaWQyLCBtYXNrLCBtb2RlOworCXUxNiBpZDEsIGlkMiwgbWFza19yZXY7CisJdTE2IGN1c3RfaWQsIG1vZGUsIGNoaXBfcmV2OwogCiAJLyogZ2V0IFdNODM1MCByZXZpc2lvbiBhbmQgY29uZmlnIG1vZGUgKi8KIAl3bTgzNTAtPnJlYWRfZGV2KHdtODM1MCwgV004MzUwX1JFU0VUX0lELCBzaXplb2YoaWQxKSwgJmlkMSk7CiAJd204MzUwLT5yZWFkX2Rldih3bTgzNTAsIFdNODM1MF9JRCwgc2l6ZW9mKGlkMiksICZpZDIpOworCXdtODM1MC0+cmVhZF9kZXYod204MzUwLCBXTTgzNTBfUkVWSVNJT04sIHNpemVvZihtYXNrX3JldiksICZtYXNrX3Jldik7CiAKIAlpZDEgPSBiZTE2X3RvX2NwdShpZDEpOwogCWlkMiA9IGJlMTZfdG9fY3B1KGlkMik7CisJbWFza19yZXYgPSBiZTE2X3RvX2NwdShtYXNrX3Jldik7CiAKLQlpZiAoaWQxID09IDB4NjE0MykgewotCQlzd2l0Y2ggKChpZDIgJiBXTTgzNTBfQ0hJUF9SRVZfTUFTSykgPj4gMTIpIHsKLQkJY2FzZSBXTTgzNTBfUkVWX0U6Ci0JCQlkZXZfaW5mbyh3bTgzNTAtPmRldiwgIkZvdW5kIFJldiBFIGRldmljZVxuIik7Ci0JCQl3bTgzNTAtPnJldiA9IFdNODM1MF9SRVZfRTsKLQkJCWJyZWFrOwotCQljYXNlIFdNODM1MF9SRVZfRjoKLQkJCWRldl9pbmZvKHdtODM1MC0+ZGV2LCAiRm91bmQgUmV2IEYgZGV2aWNlXG4iKTsKLQkJCXdtODM1MC0+cmV2ID0gV004MzUwX1JFVl9GOwotCQkJYnJlYWs7Ci0JCWNhc2UgV004MzUwX1JFVl9HOgotCQkJZGV2X2luZm8od204MzUwLT5kZXYsICJGb3VuZCBSZXYgRyBkZXZpY2VcbiIpOwotCQkJd204MzUwLT5yZXYgPSBXTTgzNTBfUkVWX0c7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCS8qIEZvciBzYWZldHkgd2UgcmVmdXNlIHRvIHJ1biBvbiB1bmtub3duIGhhcmR3YXJlICovCi0JCQlkZXZfaW5mbyh3bTgzNTAtPmRldiwgIkZvdW5kIHVua25vd24gcmV2XG4iKTsKLQkJCXJldCA9IC1FTk9ERVY7Ci0JCQlnb3RvIGVycjsKLQkJfQotCX0gZWxzZSB7Ci0JCWRldl9pbmZvKHdtODM1MC0+ZGV2LCAiRGV2aWNlIHdpdGggSUQgJXggaXMgbm90IGEgV004MzUwXG4iLAotCQkJIGlkMSk7CisJaWYgKGlkMSAhPSAweDYxNDMpIHsKKwkJZGV2X2Vycih3bTgzNTAtPmRldiwKKwkJCSJEZXZpY2Ugd2l0aCBJRCAleCBpcyBub3QgYSBXTTgzNTBcbiIsIGlkMSk7CiAJCXJldCA9IC1FTk9ERVY7CiAJCWdvdG8gZXJyOwogCX0KIAogCW1vZGUgPSBpZDIgJiBXTTgzNTBfQ09ORl9TVFNfTUFTSyA+PiAxMDsKLQltYXNrID0gaWQyICYgV004MzUwX0NVU1RfSURfTUFTSzsKLQlkZXZfaW5mbyh3bTgzNTAtPmRldiwgIkNvbmZpZyBtb2RlICVkLCBST00gbWFzayAlZFxuIiwgbW9kZSwgbWFzayk7CisJY3VzdF9pZCA9IGlkMiAmIFdNODM1MF9DVVNUX0lEX01BU0s7CisJY2hpcF9yZXYgPSAoaWQyICYgV004MzUwX0NISVBfUkVWX01BU0spID4+IDEyOworCWRldl9pbmZvKHdtODM1MC0+ZGV2LAorCQkgIkNPTkZfU1RTICVkLCBDVVNUX0lEICVkLCBNQVNLX1JFViAlZCwgQ0hJUF9SRVYgJWRcbiIsCisJCSBtb2RlLCBjdXN0X2lkLCBtYXNrX3JldiwgY2hpcF9yZXYpOwogCi0JcmV0ID0gd204MzUwX2NyZWF0ZV9jYWNoZSh3bTgzNTAsIG1vZGUpOworCWlmIChjdXN0X2lkICE9IDApIHsKKwkJZGV2X2Vycih3bTgzNTAtPmRldiwgIlVuc3VwcG9ydGVkIENVU1RfSURcbiIpOworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIGVycjsKKwl9CisKKwlzd2l0Y2ggKG1hc2tfcmV2KSB7CisJY2FzZSAwOgorCQl3bTgzNTAtPnBtaWMubWF4X2RjZGMgPSBXTTgzNTBfRENEQ182OworCQl3bTgzNTAtPnBtaWMubWF4X2lzaW5rID0gV004MzUwX0lTSU5LX0I7CisKKwkJc3dpdGNoIChjaGlwX3JldikgeworCQljYXNlIFdNODM1MF9SRVZfRToKKwkJCWRldl9pbmZvKHdtODM1MC0+ZGV2LCAiV004MzUwIFJldiBFXG4iKTsKKwkJCWJyZWFrOworCQljYXNlIFdNODM1MF9SRVZfRjoKKwkJCWRldl9pbmZvKHdtODM1MC0+ZGV2LCAiV004MzUwIFJldiBGXG4iKTsKKwkJCWJyZWFrOworCQljYXNlIFdNODM1MF9SRVZfRzoKKwkJCWRldl9pbmZvKHdtODM1MC0+ZGV2LCAiV004MzUwIFJldiBHXG4iKTsKKwkJCXdtODM1MC0+cG93ZXIucmV2X2dfY29lZmYgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgV004MzUwX1JFVl9IOgorCQkJZGV2X2luZm8od204MzUwLT5kZXYsICJXTTgzNTAgUmV2IEhcbiIpOworCQkJd204MzUwLT5wb3dlci5yZXZfZ19jb2VmZiA9IDE7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCS8qIEZvciBzYWZldHkgd2UgcmVmdXNlIHRvIHJ1biBvbiB1bmtub3duIGhhcmR3YXJlICovCisJCQlkZXZfZXJyKHdtODM1MC0+ZGV2LCAiVW5rbm93biBXTTgzNTAgQ0hJUF9SRVZcbiIpOworCQkJcmV0ID0gLUVOT0RFVjsKKwkJCWdvdG8gZXJyOworCQl9CisJCWJyZWFrOworCisJY2FzZSAxOgorCQl3bTgzNTAtPnBtaWMubWF4X2RjZGMgPSBXTTgzNTBfRENEQ180OworCQl3bTgzNTAtPnBtaWMubWF4X2lzaW5rID0gV004MzUwX0lTSU5LX0E7CisKKwkJc3dpdGNoIChjaGlwX3JldikgeworCQljYXNlIDA6CisJCQlkZXZfaW5mbyh3bTgzNTAtPmRldiwgIldNODM1MSBSZXYgQVxuIik7CisJCQl3bTgzNTAtPnBvd2VyLnJldl9nX2NvZWZmID0gMTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlkZXZfZXJyKHdtODM1MC0+ZGV2LCAiVW5rbm93biBXTTgzNTEgQ0hJUF9SRVZcbiIpOworCQkJcmV0ID0gLUVOT0RFVjsKKwkJCWdvdG8gZXJyOworCQl9CisJCWJyZWFrOworCisJY2FzZSAyOgorCQl3bTgzNTAtPnBtaWMubWF4X2RjZGMgPSBXTTgzNTBfRENEQ182OworCQl3bTgzNTAtPnBtaWMubWF4X2lzaW5rID0gV004MzUwX0lTSU5LX0I7CisKKwkJc3dpdGNoIChjaGlwX3JldikgeworCQljYXNlIDA6CisJCQlkZXZfaW5mbyh3bTgzNTAtPmRldiwgIldNODM1MiBSZXYgQVxuIik7CisJCQl3bTgzNTAtPnBvd2VyLnJldl9nX2NvZWZmID0gMTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlkZXZfZXJyKHdtODM1MC0+ZGV2LCAiVW5rbm93biBXTTgzNTIgQ0hJUF9SRVZcbiIpOworCQkJcmV0ID0gLUVOT0RFVjsKKwkJCWdvdG8gZXJyOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJZGV2X2Vycih3bTgzNTAtPmRldiwgIlVua25vd24gTUFTS19SRVZcbiIpOworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIGVycjsKKwl9CisKKwlyZXQgPSB3bTgzNTBfY3JlYXRlX2NhY2hlKHdtODM1MCwgbWFza19yZXYsIG1vZGUpOwogCWlmIChyZXQgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAid204MzUwOiBmYWlsZWQgdG8gY3JlYXRlIHJlZ2lzdGVyIGNhY2hlXG4iKTsKKwkJZGV2X2Vycih3bTgzNTAtPmRldiwgIkZhaWxlZCB0byBjcmVhdGUgcmVnaXN0ZXIgY2FjaGVcbiIpOwogCQlyZXR1cm4gcmV0OwogCX0KIAotCWlmIChwZGF0YS0+aW5pdCkgeworCWlmIChwZGF0YSAmJiBwZGF0YS0+aW5pdCkgewogCQlyZXQgPSBwZGF0YS0+aW5pdCh3bTgzNTApOwogCQlpZiAocmV0ICE9IDApIHsKIAkJCWRldl9lcnIod204MzUwLT5kZXYsICJQbGF0Zm9ybSBpbml0KCkgZmFpbGVkOiAlZFxuIiwKQEAgLTEyMTgsNiArMTQxMyw3IEBACiAJCX0KIAl9CiAKKwltdXRleF9pbml0KCZ3bTgzNTAtPmF1eGFkY19tdXRleCk7CiAJbXV0ZXhfaW5pdCgmd204MzUwLT5pcnFfbXV0ZXgpOwogCUlOSVRfV09SSygmd204MzUwLT5pcnFfd29yaywgd204MzUwX2lycV93b3JrZXIpOwogCWlmIChpcnEpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL3dtODM1MC1pMmMuYyBiL2RyaXZlcnMvbWZkL3dtODM1MC1pMmMuYwppbmRleCAzZTBjZTBlLi44ZDhjOTMyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21mZC93bTgzNTAtaTJjLmMKKysrIGIvZHJpdmVycy9tZmQvd204MzUwLWkyYy5jCkBAIC0xLDggKzEsNiBAQAogLyoKICAqIHdtODM1MC1pMmMuYyAgLS0gIEdlbmVyaWMgSTJDIGRyaXZlciBmb3IgV29sZnNvbiBXTTgzNTAgUE1JQwogICoKLSAqIFRoaXMgZHJpdmVyIGRlZmluZXMgYW5kIGNvbmZpZ3VyZXMgdGhlIFdNODM1MCBmb3IgdGhlIEZyZWVzY2FsZSBpLk1YMzJBRFMuCi0gKgogICogQ29weXJpZ2h0IDIwMDcsIDIwMDggV29sZnNvbiBNaWNyb2VsZWN0cm9uaWNzIFBMQy4KICAqCiAgKiBBdXRob3I6IExpYW0gR2lyZHdvb2QKQEAgLTk5LDYgKzk3LDggQEAKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIHdtODM1MF9pMmNfaWRbXSA9IHsKICAgICAgICB7ICJ3bTgzNTAiLCAwIH0sCisgICAgICAgeyAid204MzUxIiwgMCB9LAorICAgICAgIHsgIndtODM1MiIsIDAgfSwKICAgICAgICB7IH0KIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgd204MzUwX2kyY19pZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC93bTgzNTAtcmVnbWFwLmMgYi9kcml2ZXJzL21mZC93bTgzNTAtcmVnbWFwLmMKaW5kZXggOTc0Njc4ZC4uNjg4ODdiOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZmQvd204MzUwLXJlZ21hcC5jCisrKyBiL2RyaXZlcnMvbWZkL3dtODM1MC1yZWdtYXAuYwpAQCAtMTA3NCw2ICsxMDc0LDIxMDIgQEAKIH07CiAjZW5kaWYKIAorI2lmZGVmIENPTkZJR19NRkRfV004MzUxX0NPTkZJR19NT0RFXzAKKworI3VuZGVmIFdNODM1MF9IQVZFX0NPTkZJR19NT0RFCisjZGVmaW5lIFdNODM1MF9IQVZFX0NPTkZJR19NT0RFCisKK2NvbnN0IHUxNiB3bTgzNTFfbW9kZTBfZGVmYXVsdHNbXSA9IHsKKwkweDYxNDMsICAgICAvKiBSMCAgIC0gUmVzZXQvSUQgKi8KKwkweDAwMDAsICAgICAvKiBSMSAgIC0gSUQgKi8KKwkweDAwMDEsICAgICAvKiBSMiAgIC0gUmV2aXNpb24gKi8KKwkweDFDMDIsICAgICAvKiBSMyAgIC0gU3lzdGVtIENvbnRyb2wgMSAqLworCTB4MDAwNCwgICAgIC8qIFI0ICAgLSBTeXN0ZW0gQ29udHJvbCAyICovCisJMHgwMDAwLCAgICAgLyogUjUgICAtIFN5c3RlbSBIaWJlcm5hdGUgKi8KKwkweDhBMDAsICAgICAvKiBSNiAgIC0gSW50ZXJmYWNlIENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSNyAqLworCTB4ODAwMCwgICAgIC8qIFI4ICAgLSBQb3dlciBtZ210ICgxKSAqLworCTB4MDAwMCwgICAgIC8qIFI5ICAgLSBQb3dlciBtZ210ICgyKSAqLworCTB4MDAwMCwgICAgIC8qIFIxMCAgLSBQb3dlciBtZ210ICgzKSAqLworCTB4MjAwMCwgICAgIC8qIFIxMSAgLSBQb3dlciBtZ210ICg0KSAqLworCTB4MEUwMCwgICAgIC8qIFIxMiAgLSBQb3dlciBtZ210ICg1KSAqLworCTB4MDAwMCwgICAgIC8qIFIxMyAgLSBQb3dlciBtZ210ICg2KSAqLworCTB4MDAwMCwgICAgIC8qIFIxNCAgLSBQb3dlciBtZ210ICg3KSAqLworCTB4MDAwMCwgICAgIC8qIFIxNSAqLworCTB4MDAwMCwgICAgIC8qIFIxNiAgLSBSVEMgU2Vjb25kcy9NaW51dGVzICovCisJMHgwMTAwLCAgICAgLyogUjE3ICAtIFJUQyBIb3Vycy9EYXkgKi8KKwkweDAxMDEsICAgICAvKiBSMTggIC0gUlRDIERhdGUvTW9udGggKi8KKwkweDE0MDAsICAgICAvKiBSMTkgIC0gUlRDIFllYXIgKi8KKwkweDAwMDAsICAgICAvKiBSMjAgIC0gQWxhcm0gU2Vjb25kcy9NaW51dGVzICovCisJMHgwMDAwLCAgICAgLyogUjIxICAtIEFsYXJtIEhvdXJzL0RheSAqLworCTB4MDAwMCwgICAgIC8qIFIyMiAgLSBBbGFybSBEYXRlL01vbnRoICovCisJMHgwMzIwLCAgICAgLyogUjIzICAtIFJUQyBUaW1lIENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSMjQgIC0gU3lzdGVtIEludGVycnVwdHMgKi8KKwkweDAwMDAsICAgICAvKiBSMjUgIC0gSW50ZXJydXB0IFN0YXR1cyAxICovCisJMHgwMDAwLCAgICAgLyogUjI2ICAtIEludGVycnVwdCBTdGF0dXMgMiAqLworCTB4MDAwMCwgICAgIC8qIFIyNyAqLworCTB4MDAwMCwgICAgIC8qIFIyOCAgLSBVbmRlciBWb2x0YWdlIEludGVycnVwdCBzdGF0dXMgKi8KKwkweDAwMDAsICAgICAvKiBSMjkgIC0gT3ZlciBDdXJyZW50IEludGVycnVwdCBzdGF0dXMgKi8KKwkweDAwMDAsICAgICAvKiBSMzAgIC0gR1BJTyBJbnRlcnJ1cHQgU3RhdHVzICovCisJMHgwMDAwLCAgICAgLyogUjMxICAtIENvbXBhcmF0b3IgSW50ZXJydXB0IFN0YXR1cyAqLworCTB4M0ZGRiwgICAgIC8qIFIzMiAgLSBTeXN0ZW0gSW50ZXJydXB0cyBNYXNrICovCisJMHgwMDAwLCAgICAgLyogUjMzICAtIEludGVycnVwdCBTdGF0dXMgMSBNYXNrICovCisJMHgwMDAwLCAgICAgLyogUjM0ICAtIEludGVycnVwdCBTdGF0dXMgMiBNYXNrICovCisJMHgwMDAwLCAgICAgLyogUjM1ICovCisJMHgwMDAwLCAgICAgLyogUjM2ICAtIFVuZGVyIFZvbHRhZ2UgSW50ZXJydXB0IHN0YXR1cyBNYXNrICovCisJMHgwMDAwLCAgICAgLyogUjM3ICAtIE92ZXIgQ3VycmVudCBJbnRlcnJ1cHQgc3RhdHVzIE1hc2sgKi8KKwkweDAwMDAsICAgICAvKiBSMzggIC0gR1BJTyBJbnRlcnJ1cHQgU3RhdHVzIE1hc2sgKi8KKwkweDAwMDAsICAgICAvKiBSMzkgIC0gQ29tcGFyYXRvciBJbnRlcnJ1cHQgU3RhdHVzIE1hc2sgKi8KKwkweDAwNDAsICAgICAvKiBSNDAgIC0gQ2xvY2sgQ29udHJvbCAxICovCisJMHgwMDAwLCAgICAgLyogUjQxICAtIENsb2NrIENvbnRyb2wgMiAqLworCTB4M0EwMCwgICAgIC8qIFI0MiAgLSBGTEwgQ29udHJvbCAxICovCisJMHg3MDg2LCAgICAgLyogUjQzICAtIEZMTCBDb250cm9sIDIgKi8KKwkweEMyMjYsICAgICAvKiBSNDQgIC0gRkxMIENvbnRyb2wgMyAqLworCTB4MDAwMCwgICAgIC8qIFI0NSAgLSBGTEwgQ29udHJvbCA0ICovCisJMHgwMDAwLCAgICAgLyogUjQ2ICovCisJMHgwMDAwLCAgICAgLyogUjQ3ICovCisJMHgwMDAwLCAgICAgLyogUjQ4ICAtIERBQyBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjQ5ICovCisJMHgwMEMwLCAgICAgLyogUjUwICAtIERBQyBEaWdpdGFsIFZvbHVtZSBMICovCisJMHgwMEMwLCAgICAgLyogUjUxICAtIERBQyBEaWdpdGFsIFZvbHVtZSBSICovCisJMHgwMDAwLCAgICAgLyogUjUyICovCisJMHgwMDQwLCAgICAgLyogUjUzICAtIERBQyBMUiBSYXRlICovCisJMHgwMDAwLCAgICAgLyogUjU0ICAtIERBQyBDbG9jayBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjU1ICovCisJMHgwMDAwLCAgICAgLyogUjU2ICovCisJMHgwMDAwLCAgICAgLyogUjU3ICovCisJMHg0MDAwLCAgICAgLyogUjU4ICAtIERBQyBNdXRlICovCisJMHgwMDAwLCAgICAgLyogUjU5ICAtIERBQyBNdXRlIFZvbHVtZSAqLworCTB4MDAwMCwgICAgIC8qIFI2MCAgLSBEQUMgU2lkZSAqLworCTB4MDAwMCwgICAgIC8qIFI2MSAqLworCTB4MDAwMCwgICAgIC8qIFI2MiAqLworCTB4MDAwMCwgICAgIC8qIFI2MyAqLworCTB4ODAwMCwgICAgIC8qIFI2NCAgLSBBREMgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFI2NSAqLworCTB4MDBDMCwgICAgIC8qIFI2NiAgLSBBREMgRGlnaXRhbCBWb2x1bWUgTCAqLworCTB4MDBDMCwgICAgIC8qIFI2NyAgLSBBREMgRGlnaXRhbCBWb2x1bWUgUiAqLworCTB4MDAwMCwgICAgIC8qIFI2OCAgLSBBREMgRGl2aWRlciAqLworCTB4MDAwMCwgICAgIC8qIFI2OSAqLworCTB4MDA0MCwgICAgIC8qIFI3MCAgLSBBREMgTFIgUmF0ZSAqLworCTB4MDAwMCwgICAgIC8qIFI3MSAqLworCTB4MDMwMywgICAgIC8qIFI3MiAgLSBJbnB1dCBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjczICAtIElOMyBJbnB1dCBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjc0ICAtIE1pYyBCaWFzIENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSNzUgKi8KKwkweDAwMDAsICAgICAvKiBSNzYgIC0gT3V0cHV0IENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSNzcgIC0gSmFjayBEZXRlY3QgKi8KKwkweDAwMDAsICAgICAvKiBSNzggIC0gQW50aSBQb3AgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFI3OSAqLworCTB4MDA0MCwgICAgIC8qIFI4MCAgLSBMZWZ0IElucHV0IFZvbHVtZSAqLworCTB4MDA0MCwgICAgIC8qIFI4MSAgLSBSaWdodCBJbnB1dCBWb2x1bWUgKi8KKwkweDAwMDAsICAgICAvKiBSODIgKi8KKwkweDAwMDAsICAgICAvKiBSODMgKi8KKwkweDAwMDAsICAgICAvKiBSODQgKi8KKwkweDAwMDAsICAgICAvKiBSODUgKi8KKwkweDAwMDAsICAgICAvKiBSODYgKi8KKwkweDAwMDAsICAgICAvKiBSODcgKi8KKwkweDA4MDAsICAgICAvKiBSODggIC0gTGVmdCBNaXhlciBDb250cm9sICovCisJMHgxMDAwLCAgICAgLyogUjg5ICAtIFJpZ2h0IE1peGVyIENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSOTAgKi8KKwkweDAwMDAsICAgICAvKiBSOTEgKi8KKwkweDAwMDAsICAgICAvKiBSOTIgIC0gT1VUMyBNaXhlciBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjkzICAtIE9VVDQgTWl4ZXIgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFI5NCAqLworCTB4MDAwMCwgICAgIC8qIFI5NSAqLworCTB4MDAwMCwgICAgIC8qIFI5NiAgLSBPdXRwdXQgTGVmdCBNaXhlciBWb2x1bWUgKi8KKwkweDAwMDAsICAgICAvKiBSOTcgIC0gT3V0cHV0IFJpZ2h0IE1peGVyIFZvbHVtZSAqLworCTB4MDAwMCwgICAgIC8qIFI5OCAgLSBJbnB1dCBNaXhlciBWb2x1bWUgTCAqLworCTB4MDAwMCwgICAgIC8qIFI5OSAgLSBJbnB1dCBNaXhlciBWb2x1bWUgUiAqLworCTB4MDAwMCwgICAgIC8qIFIxMDAgLSBJbnB1dCBNaXhlciBWb2x1bWUgKi8KKwkweDAwMDAsICAgICAvKiBSMTAxICovCisJMHgwMDAwLCAgICAgLyogUjEwMiAqLworCTB4MDAwMCwgICAgIC8qIFIxMDMgKi8KKwkweDAwRTQsICAgICAvKiBSMTA0IC0gT1VUMUwgVm9sdW1lICovCisJMHgwMEU0LCAgICAgLyogUjEwNSAtIE9VVDFSIFZvbHVtZSAqLworCTB4MDBFNCwgICAgIC8qIFIxMDYgLSBPVVQyTCBWb2x1bWUgKi8KKwkweDAyRTQsICAgICAvKiBSMTA3IC0gT1VUMlIgVm9sdW1lICovCisJMHgwMDAwLCAgICAgLyogUjEwOCAqLworCTB4MDAwMCwgICAgIC8qIFIxMDkgKi8KKwkweDAwMDAsICAgICAvKiBSMTEwICovCisJMHgwMDAwLCAgICAgLyogUjExMSAtIEJFRVAgVm9sdW1lICovCisJMHgwQTAwLCAgICAgLyogUjExMiAtIEFJIEZvcm1hdGluZyAqLworCTB4MDAwMCwgICAgIC8qIFIxMTMgLSBBREMgREFDIENPTVAgKi8KKwkweDAwMjAsICAgICAvKiBSMTE0IC0gQUkgQURDIENvbnRyb2wgKi8KKwkweDAwMjAsICAgICAvKiBSMTE1IC0gQUkgREFDIENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSMTE2ICovCisJMHgwMDAwLCAgICAgLyogUjExNyAqLworCTB4MDAwMCwgICAgIC8qIFIxMTggKi8KKwkweDAwMDAsICAgICAvKiBSMTE5ICovCisJMHgwMDAwLCAgICAgLyogUjEyMCAqLworCTB4MDAwMCwgICAgIC8qIFIxMjEgKi8KKwkweDAwMDAsICAgICAvKiBSMTIyICovCisJMHgwMDAwLCAgICAgLyogUjEyMyAqLworCTB4MDAwMCwgICAgIC8qIFIxMjQgKi8KKwkweDAwMDAsICAgICAvKiBSMTI1ICovCisJMHgwMDAwLCAgICAgLyogUjEyNiAqLworCTB4MDAwMCwgICAgIC8qIFIxMjcgKi8KKwkweDFGRkYsICAgICAvKiBSMTI4IC0gR1BJTyBEZWJvdW5jZSAqLworCTB4MDAwMCwgICAgIC8qIFIxMjkgLSBHUElPIFBpbiBwdWxsIHVwIENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSMTMwIC0gR1BJTyBQdWxsIGRvd24gQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFIxMzEgLSBHUElPIEludGVycnVwdCBNb2RlICovCisJMHgwMDAwLCAgICAgLyogUjEzMiAqLworCTB4MDAwMCwgICAgIC8qIFIxMzMgLSBHUElPIENvbnRyb2wgKi8KKwkweDBGRkMsICAgICAvKiBSMTM0IC0gR1BJTyBDb25maWd1cmF0aW9uIChpL28pICovCisJMHgwRkZDLCAgICAgLyogUjEzNSAtIEdQSU8gUGluIFBvbGFyaXR5IC8gVHlwZSAqLworCTB4MDAwMCwgICAgIC8qIFIxMzYgKi8KKwkweDAwMDAsICAgICAvKiBSMTM3ICovCisJMHgwMDAwLCAgICAgLyogUjEzOCAqLworCTB4MDAwMCwgICAgIC8qIFIxMzkgKi8KKwkweDAwMTMsICAgICAvKiBSMTQwIC0gR1BJTyBGdW5jdGlvbiBTZWxlY3QgMSAqLworCTB4MDAwMCwgICAgIC8qIFIxNDEgLSBHUElPIEZ1bmN0aW9uIFNlbGVjdCAyICovCisJMHgwMDAwLCAgICAgLyogUjE0MiAtIEdQSU8gRnVuY3Rpb24gU2VsZWN0IDMgKi8KKwkweDAwMDMsICAgICAvKiBSMTQzIC0gR1BJTyBGdW5jdGlvbiBTZWxlY3QgNCAqLworCTB4MDAwMCwgICAgIC8qIFIxNDQgLSBEaWdpdGlzZXIgQ29udHJvbCAoMSkgKi8KKwkweDAwMDIsICAgICAvKiBSMTQ1IC0gRGlnaXRpc2VyIENvbnRyb2wgKDIpICovCisJMHgwMDAwLCAgICAgLyogUjE0NiAqLworCTB4MDAwMCwgICAgIC8qIFIxNDcgKi8KKwkweDAwMDAsICAgICAvKiBSMTQ4ICovCisJMHgwMDAwLCAgICAgLyogUjE0OSAqLworCTB4MDAwMCwgICAgIC8qIFIxNTAgKi8KKwkweDAwMDAsICAgICAvKiBSMTUxICovCisJMHg3MDAwLCAgICAgLyogUjE1MiAtIEFVWDEgUmVhZGJhY2sgKi8KKwkweDcwMDAsICAgICAvKiBSMTUzIC0gQVVYMiBSZWFkYmFjayAqLworCTB4NzAwMCwgICAgIC8qIFIxNTQgLSBBVVgzIFJlYWRiYWNrICovCisJMHg3MDAwLCAgICAgLyogUjE1NSAtIEFVWDQgUmVhZGJhY2sgKi8KKwkweDAwMDAsICAgICAvKiBSMTU2IC0gVVNCIFZvbHRhZ2UgUmVhZGJhY2sgKi8KKwkweDAwMDAsICAgICAvKiBSMTU3IC0gTElORSBWb2x0YWdlIFJlYWRiYWNrICovCisJMHgwMDAwLCAgICAgLyogUjE1OCAtIEJBVFQgVm9sdGFnZSBSZWFkYmFjayAqLworCTB4MDAwMCwgICAgIC8qIFIxNTkgLSBDaGlwIFRlbXAgUmVhZGJhY2sgKi8KKwkweDAwMDAsICAgICAvKiBSMTYwICovCisJMHgwMDAwLCAgICAgLyogUjE2MSAqLworCTB4MDAwMCwgICAgIC8qIFIxNjIgKi8KKwkweDAwMDAsICAgICAvKiBSMTYzIC0gR2VuZXJpYyBDb21wYXJhdG9yIENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSMTY0IC0gR2VuZXJpYyBjb21wYXJhdG9yIDEgKi8KKwkweDAwMDAsICAgICAvKiBSMTY1IC0gR2VuZXJpYyBjb21wYXJhdG9yIDIgKi8KKwkweDAwMDAsICAgICAvKiBSMTY2IC0gR2VuZXJpYyBjb21wYXJhdG9yIDMgKi8KKwkweDAwMDAsICAgICAvKiBSMTY3IC0gR2VuZXJpYyBjb21wYXJhdG9yIDQgKi8KKwkweEEwMEYsICAgICAvKiBSMTY4IC0gQmF0dGVyeSBDaGFyZ2VyIENvbnRyb2wgMSAqLworCTB4MEIwNiwgICAgIC8qIFIxNjkgLSBCYXR0ZXJ5IENoYXJnZXIgQ29udHJvbCAyICovCisJMHgwMDAwLCAgICAgLyogUjE3MCAtIEJhdHRlcnkgQ2hhcmdlciBDb250cm9sIDMgKi8KKwkweDAwMDAsICAgICAvKiBSMTcxICovCisJMHgwMDAwLCAgICAgLyogUjE3MiAtIEN1cnJlbnQgU2luayBEcml2ZXIgQSAqLworCTB4MDAwMCwgICAgIC8qIFIxNzMgLSBDU0EgRmxhc2ggY29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFIxNzQgKi8KKwkweDAwMDAsICAgICAvKiBSMTc1ICovCisJMHgwMDAwLCAgICAgLyogUjE3NiAtIERDREMvTERPIHJlcXVlc3RlZCAqLworCTB4MDMyRCwgICAgIC8qIFIxNzcgLSBEQ0RDIEFjdGl2ZSBvcHRpb25zICovCisJMHgwMDAwLCAgICAgLyogUjE3OCAtIERDREMgU2xlZXAgb3B0aW9ucyAqLworCTB4MDAyNSwgICAgIC8qIFIxNzkgLSBQb3dlci1jaGVjayBjb21wYXJhdG9yICovCisJMHgwMDBFLCAgICAgLyogUjE4MCAtIERDREMxIENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSMTgxIC0gRENEQzEgVGltZW91dHMgKi8KKwkweDEwMDYsICAgICAvKiBSMTgyIC0gRENEQzEgTG93IFBvd2VyICovCisJMHgwMDE4LCAgICAgLyogUjE4MyAtIERDREMyIENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSMTg0IC0gRENEQzIgVGltZW91dHMgKi8KKwkweDAwMDAsICAgICAvKiBSMTg1ICovCisJMHgwMDAwLCAgICAgLyogUjE4NiAtIERDREMzIENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSMTg3IC0gRENEQzMgVGltZW91dHMgKi8KKwkweDAwMDYsICAgICAvKiBSMTg4IC0gRENEQzMgTG93IFBvd2VyICovCisJMHgwMDAwLCAgICAgLyogUjE4OSAtIERDREM0IENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSMTkwIC0gRENEQzQgVGltZW91dHMgKi8KKwkweDAwMDYsICAgICAvKiBSMTkxIC0gRENEQzQgTG93IFBvd2VyICovCisJMHgwMDA4LCAgICAgLyogUjE5MiAqLworCTB4MDAwMCwgICAgIC8qIFIxOTMgKi8KKwkweDAwMDAsICAgICAvKiBSMTk0ICovCisJMHgwMDAwLCAgICAgLyogUjE5NSAqLworCTB4MDAwMCwgICAgIC8qIFIxOTYgKi8KKwkweDAwMDYsICAgICAvKiBSMTk3ICovCisJMHgwMDAwLCAgICAgLyogUjE5OCAqLworCTB4MDAwMywgICAgIC8qIFIxOTkgLSBMaW1pdCBTd2l0Y2ggQ29udHJvbCAqLworCTB4MDAxQywgICAgIC8qIFIyMDAgLSBMRE8xIENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSMjAxIC0gTERPMSBUaW1lb3V0cyAqLworCTB4MDAxQywgICAgIC8qIFIyMDIgLSBMRE8xIExvdyBQb3dlciAqLworCTB4MDAxQiwgICAgIC8qIFIyMDMgLSBMRE8yIENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSMjA0IC0gTERPMiBUaW1lb3V0cyAqLworCTB4MDAxQywgICAgIC8qIFIyMDUgLSBMRE8yIExvdyBQb3dlciAqLworCTB4MDAxQiwgICAgIC8qIFIyMDYgLSBMRE8zIENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSMjA3IC0gTERPMyBUaW1lb3V0cyAqLworCTB4MDAxQywgICAgIC8qIFIyMDggLSBMRE8zIExvdyBQb3dlciAqLworCTB4MDAxQiwgICAgIC8qIFIyMDkgLSBMRE80IENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSMjEwIC0gTERPNCBUaW1lb3V0cyAqLworCTB4MDAxQywgICAgIC8qIFIyMTEgLSBMRE80IExvdyBQb3dlciAqLworCTB4MDAwMCwgICAgIC8qIFIyMTIgKi8KKwkweDAwMDAsICAgICAvKiBSMjEzICovCisJMHgwMDAwLCAgICAgLyogUjIxNCAqLworCTB4MDAwMCwgICAgIC8qIFIyMTUgLSBWQ0NfRkFVTFQgTWFza3MgKi8KKwkweDAwMUYsICAgICAvKiBSMjE2IC0gTWFpbiBCYW5kZ2FwIENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSMjE3IC0gT1NDIENvbnRyb2wgKi8KKwkweDkwMDAsICAgICAvKiBSMjE4IC0gUlRDIFRpY2sgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFIyMTkgLSBTZWN1cml0eTEgKi8KKwkweDQwMDAsICAgICAvKiBSMjIwICovCisJMHgwMDAwLCAgICAgLyogUjIyMSAqLworCTB4MDAwMCwgICAgIC8qIFIyMjIgKi8KKwkweDAwMDAsICAgICAvKiBSMjIzICovCisJMHgwMDAwLCAgICAgLyogUjIyNCAtIFNpZ25hbCBvdmVycmlkZXMgKi8KKwkweDAwMDAsICAgICAvKiBSMjI1IC0gRENEQy9MRE8gc3RhdHVzICovCisJMHgwMDAwLCAgICAgLyogUjIyNiAtIENoYXJnZXIgT3ZlcmlkZXMvc3RhdHVzICovCisJMHgwMDAwLCAgICAgLyogUjIyNyAtIG1pc2Mgb3ZlcnJpZGVzICovCisJMHgwMDAwLCAgICAgLyogUjIyOCAtIFN1cHBseSBvdmVycmlkZXMvc3RhdHVzIDEgKi8KKwkweDAwMDAsICAgICAvKiBSMjI5IC0gU3VwcGx5IG92ZXJyaWRlcy9zdGF0dXMgMiAqLworCTB4RTAwMCwgICAgIC8qIFIyMzAgLSBHUElPIFBpbiBTdGF0dXMgKi8KKwkweDAwMDAsICAgICAvKiBSMjMxIC0gY29tcGFyb3RvciBvdmVycmlkZXMgKi8KKwkweDAwMDAsICAgICAvKiBSMjMyICovCisJMHgwMDAwLCAgICAgLyogUjIzMyAtIFN0YXRlIE1hY2hpbmUgc3RhdHVzICovCisJMHgxMjAwLCAgICAgLyogUjIzNCAtIEZMTCBUZXN0IDEgKi8KKwkweDAwMDAsICAgICAvKiBSMjM1ICovCisJMHg4MDAwLCAgICAgLyogUjIzNiAqLworCTB4MDAwMCwgICAgIC8qIFIyMzcgKi8KKwkweDAwMDAsICAgICAvKiBSMjM4ICovCisJMHgwMDAwLCAgICAgLyogUjIzOSAqLworCTB4MDAwMywgICAgIC8qIFIyNDAgKi8KKwkweDAwMDAsICAgICAvKiBSMjQxICovCisJMHgwMDAwLCAgICAgLyogUjI0MiAqLworCTB4MDAwNCwgICAgIC8qIFIyNDMgKi8KKwkweDAzMDAsICAgICAvKiBSMjQ0ICovCisJMHgwMDAwLCAgICAgLyogUjI0NSAqLworCTB4MDIwMCwgICAgIC8qIFIyNDYgKi8KKwkweDAwMDAsICAgICAvKiBSMjQ3ICovCisJMHgxMDAwLCAgICAgLyogUjI0OCAtIERDREMxIFRlc3QgQ29udHJvbHMgKi8KKwkweDEwMDAsICAgICAvKiBSMjQ5ICovCisJMHgxMDAwLCAgICAgLyogUjI1MCAtIERDREMzIFRlc3QgQ29udHJvbHMgKi8KKwkweDEwMDAsICAgICAvKiBSMjUxIC0gRENEQzQgVGVzdCBDb250cm9scyAqLworfTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX01GRF9XTTgzNTFfQ09ORklHX01PREVfMQorCisjdW5kZWYgV004MzUwX0hBVkVfQ09ORklHX01PREUKKyNkZWZpbmUgV004MzUwX0hBVkVfQ09ORklHX01PREUKKworY29uc3QgdTE2IHdtODM1MV9tb2RlMV9kZWZhdWx0c1tdID0geworCTB4NjE0MywgICAgIC8qIFIwICAgLSBSZXNldC9JRCAqLworCTB4MDAwMCwgICAgIC8qIFIxICAgLSBJRCAqLworCTB4MDAwMSwgICAgIC8qIFIyICAgLSBSZXZpc2lvbiAqLworCTB4MUMwMiwgICAgIC8qIFIzICAgLSBTeXN0ZW0gQ29udHJvbCAxICovCisJMHgwMjA0LCAgICAgLyogUjQgICAtIFN5c3RlbSBDb250cm9sIDIgKi8KKwkweDAwMDAsICAgICAvKiBSNSAgIC0gU3lzdGVtIEhpYmVybmF0ZSAqLworCTB4OEEwMCwgICAgIC8qIFI2ICAgLSBJbnRlcmZhY2UgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFI3ICovCisJMHg4MDAwLCAgICAgLyogUjggICAtIFBvd2VyIG1nbXQgKDEpICovCisJMHgwMDAwLCAgICAgLyogUjkgICAtIFBvd2VyIG1nbXQgKDIpICovCisJMHgwMDAwLCAgICAgLyogUjEwICAtIFBvd2VyIG1nbXQgKDMpICovCisJMHgyMDAwLCAgICAgLyogUjExICAtIFBvd2VyIG1nbXQgKDQpICovCisJMHgwRTAwLCAgICAgLyogUjEyICAtIFBvd2VyIG1nbXQgKDUpICovCisJMHgwMDAwLCAgICAgLyogUjEzICAtIFBvd2VyIG1nbXQgKDYpICovCisJMHgwMDAwLCAgICAgLyogUjE0ICAtIFBvd2VyIG1nbXQgKDcpICovCisJMHgwMDAwLCAgICAgLyogUjE1ICovCisJMHgwMDAwLCAgICAgLyogUjE2ICAtIFJUQyBTZWNvbmRzL01pbnV0ZXMgKi8KKwkweDAxMDAsICAgICAvKiBSMTcgIC0gUlRDIEhvdXJzL0RheSAqLworCTB4MDEwMSwgICAgIC8qIFIxOCAgLSBSVEMgRGF0ZS9Nb250aCAqLworCTB4MTQwMCwgICAgIC8qIFIxOSAgLSBSVEMgWWVhciAqLworCTB4MDAwMCwgICAgIC8qIFIyMCAgLSBBbGFybSBTZWNvbmRzL01pbnV0ZXMgKi8KKwkweDAwMDAsICAgICAvKiBSMjEgIC0gQWxhcm0gSG91cnMvRGF5ICovCisJMHgwMDAwLCAgICAgLyogUjIyICAtIEFsYXJtIERhdGUvTW9udGggKi8KKwkweDAzMjAsICAgICAvKiBSMjMgIC0gUlRDIFRpbWUgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFIyNCAgLSBTeXN0ZW0gSW50ZXJydXB0cyAqLworCTB4MDAwMCwgICAgIC8qIFIyNSAgLSBJbnRlcnJ1cHQgU3RhdHVzIDEgKi8KKwkweDAwMDAsICAgICAvKiBSMjYgIC0gSW50ZXJydXB0IFN0YXR1cyAyICovCisJMHgwMDAwLCAgICAgLyogUjI3ICovCisJMHgwMDAwLCAgICAgLyogUjI4ICAtIFVuZGVyIFZvbHRhZ2UgSW50ZXJydXB0IHN0YXR1cyAqLworCTB4MDAwMCwgICAgIC8qIFIyOSAgLSBPdmVyIEN1cnJlbnQgSW50ZXJydXB0IHN0YXR1cyAqLworCTB4MDAwMCwgICAgIC8qIFIzMCAgLSBHUElPIEludGVycnVwdCBTdGF0dXMgKi8KKwkweDAwMDAsICAgICAvKiBSMzEgIC0gQ29tcGFyYXRvciBJbnRlcnJ1cHQgU3RhdHVzICovCisJMHgzRkZGLCAgICAgLyogUjMyICAtIFN5c3RlbSBJbnRlcnJ1cHRzIE1hc2sgKi8KKwkweDAwMDAsICAgICAvKiBSMzMgIC0gSW50ZXJydXB0IFN0YXR1cyAxIE1hc2sgKi8KKwkweDAwMDAsICAgICAvKiBSMzQgIC0gSW50ZXJydXB0IFN0YXR1cyAyIE1hc2sgKi8KKwkweDAwMDAsICAgICAvKiBSMzUgKi8KKwkweDAwMDAsICAgICAvKiBSMzYgIC0gVW5kZXIgVm9sdGFnZSBJbnRlcnJ1cHQgc3RhdHVzIE1hc2sgKi8KKwkweDAwMDAsICAgICAvKiBSMzcgIC0gT3ZlciBDdXJyZW50IEludGVycnVwdCBzdGF0dXMgTWFzayAqLworCTB4MDAwMCwgICAgIC8qIFIzOCAgLSBHUElPIEludGVycnVwdCBTdGF0dXMgTWFzayAqLworCTB4MDAwMCwgICAgIC8qIFIzOSAgLSBDb21wYXJhdG9yIEludGVycnVwdCBTdGF0dXMgTWFzayAqLworCTB4MDA0MCwgICAgIC8qIFI0MCAgLSBDbG9jayBDb250cm9sIDEgKi8KKwkweDAwMDAsICAgICAvKiBSNDEgIC0gQ2xvY2sgQ29udHJvbCAyICovCisJMHgzQTAwLCAgICAgLyogUjQyICAtIEZMTCBDb250cm9sIDEgKi8KKwkweDcwODYsICAgICAvKiBSNDMgIC0gRkxMIENvbnRyb2wgMiAqLworCTB4QzIyNiwgICAgIC8qIFI0NCAgLSBGTEwgQ29udHJvbCAzICovCisJMHgwMDAwLCAgICAgLyogUjQ1ICAtIEZMTCBDb250cm9sIDQgKi8KKwkweDAwMDAsICAgICAvKiBSNDYgKi8KKwkweDAwMDAsICAgICAvKiBSNDcgKi8KKwkweDAwMDAsICAgICAvKiBSNDggIC0gREFDIENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSNDkgKi8KKwkweDAwQzAsICAgICAvKiBSNTAgIC0gREFDIERpZ2l0YWwgVm9sdW1lIEwgKi8KKwkweDAwQzAsICAgICAvKiBSNTEgIC0gREFDIERpZ2l0YWwgVm9sdW1lIFIgKi8KKwkweDAwMDAsICAgICAvKiBSNTIgKi8KKwkweDAwNDAsICAgICAvKiBSNTMgIC0gREFDIExSIFJhdGUgKi8KKwkweDAwMDAsICAgICAvKiBSNTQgIC0gREFDIENsb2NrIENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSNTUgKi8KKwkweDAwMDAsICAgICAvKiBSNTYgKi8KKwkweDAwMDAsICAgICAvKiBSNTcgKi8KKwkweDQwMDAsICAgICAvKiBSNTggIC0gREFDIE11dGUgKi8KKwkweDAwMDAsICAgICAvKiBSNTkgIC0gREFDIE11dGUgVm9sdW1lICovCisJMHgwMDAwLCAgICAgLyogUjYwICAtIERBQyBTaWRlICovCisJMHgwMDAwLCAgICAgLyogUjYxICovCisJMHgwMDAwLCAgICAgLyogUjYyICovCisJMHgwMDAwLCAgICAgLyogUjYzICovCisJMHg4MDAwLCAgICAgLyogUjY0ICAtIEFEQyBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjY1ICovCisJMHgwMEMwLCAgICAgLyogUjY2ICAtIEFEQyBEaWdpdGFsIFZvbHVtZSBMICovCisJMHgwMEMwLCAgICAgLyogUjY3ICAtIEFEQyBEaWdpdGFsIFZvbHVtZSBSICovCisJMHgwMDAwLCAgICAgLyogUjY4ICAtIEFEQyBEaXZpZGVyICovCisJMHgwMDAwLCAgICAgLyogUjY5ICovCisJMHgwMDQwLCAgICAgLyogUjcwICAtIEFEQyBMUiBSYXRlICovCisJMHgwMDAwLCAgICAgLyogUjcxICovCisJMHgwMzAzLCAgICAgLyogUjcyICAtIElucHV0IENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSNzMgIC0gSU4zIElucHV0IENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSNzQgIC0gTWljIEJpYXMgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFI3NSAqLworCTB4MDAwMCwgICAgIC8qIFI3NiAgLSBPdXRwdXQgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFI3NyAgLSBKYWNrIERldGVjdCAqLworCTB4MDAwMCwgICAgIC8qIFI3OCAgLSBBbnRpIFBvcCBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjc5ICovCisJMHgwMDQwLCAgICAgLyogUjgwICAtIExlZnQgSW5wdXQgVm9sdW1lICovCisJMHgwMDQwLCAgICAgLyogUjgxICAtIFJpZ2h0IElucHV0IFZvbHVtZSAqLworCTB4MDAwMCwgICAgIC8qIFI4MiAqLworCTB4MDAwMCwgICAgIC8qIFI4MyAqLworCTB4MDAwMCwgICAgIC8qIFI4NCAqLworCTB4MDAwMCwgICAgIC8qIFI4NSAqLworCTB4MDAwMCwgICAgIC8qIFI4NiAqLworCTB4MDAwMCwgICAgIC8qIFI4NyAqLworCTB4MDgwMCwgICAgIC8qIFI4OCAgLSBMZWZ0IE1peGVyIENvbnRyb2wgKi8KKwkweDEwMDAsICAgICAvKiBSODkgIC0gUmlnaHQgTWl4ZXIgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFI5MCAqLworCTB4MDAwMCwgICAgIC8qIFI5MSAqLworCTB4MDAwMCwgICAgIC8qIFI5MiAgLSBPVVQzIE1peGVyIENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSOTMgIC0gT1VUNCBNaXhlciBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjk0ICovCisJMHgwMDAwLCAgICAgLyogUjk1ICovCisJMHgwMDAwLCAgICAgLyogUjk2ICAtIE91dHB1dCBMZWZ0IE1peGVyIFZvbHVtZSAqLworCTB4MDAwMCwgICAgIC8qIFI5NyAgLSBPdXRwdXQgUmlnaHQgTWl4ZXIgVm9sdW1lICovCisJMHgwMDAwLCAgICAgLyogUjk4ICAtIElucHV0IE1peGVyIFZvbHVtZSBMICovCisJMHgwMDAwLCAgICAgLyogUjk5ICAtIElucHV0IE1peGVyIFZvbHVtZSBSICovCisJMHgwMDAwLCAgICAgLyogUjEwMCAtIElucHV0IE1peGVyIFZvbHVtZSAqLworCTB4MDAwMCwgICAgIC8qIFIxMDEgKi8KKwkweDAwMDAsICAgICAvKiBSMTAyICovCisJMHgwMDAwLCAgICAgLyogUjEwMyAqLworCTB4MDBFNCwgICAgIC8qIFIxMDQgLSBPVVQxTCBWb2x1bWUgKi8KKwkweDAwRTQsICAgICAvKiBSMTA1IC0gT1VUMVIgVm9sdW1lICovCisJMHgwMEU0LCAgICAgLyogUjEwNiAtIE9VVDJMIFZvbHVtZSAqLworCTB4MDJFNCwgICAgIC8qIFIxMDcgLSBPVVQyUiBWb2x1bWUgKi8KKwkweDAwMDAsICAgICAvKiBSMTA4ICovCisJMHgwMDAwLCAgICAgLyogUjEwOSAqLworCTB4MDAwMCwgICAgIC8qIFIxMTAgKi8KKwkweDAwMDAsICAgICAvKiBSMTExIC0gQkVFUCBWb2x1bWUgKi8KKwkweDBBMDAsICAgICAvKiBSMTEyIC0gQUkgRm9ybWF0aW5nICovCisJMHgwMDAwLCAgICAgLyogUjExMyAtIEFEQyBEQUMgQ09NUCAqLworCTB4MDAyMCwgICAgIC8qIFIxMTQgLSBBSSBBREMgQ29udHJvbCAqLworCTB4MDAyMCwgICAgIC8qIFIxMTUgLSBBSSBEQUMgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFIxMTYgKi8KKwkweDAwMDAsICAgICAvKiBSMTE3ICovCisJMHgwMDAwLCAgICAgLyogUjExOCAqLworCTB4MDAwMCwgICAgIC8qIFIxMTkgKi8KKwkweDAwMDAsICAgICAvKiBSMTIwICovCisJMHgwMDAwLCAgICAgLyogUjEyMSAqLworCTB4MDAwMCwgICAgIC8qIFIxMjIgKi8KKwkweDAwMDAsICAgICAvKiBSMTIzICovCisJMHgwMDAwLCAgICAgLyogUjEyNCAqLworCTB4MDAwMCwgICAgIC8qIFIxMjUgKi8KKwkweDAwMDAsICAgICAvKiBSMTI2ICovCisJMHgwMDAwLCAgICAgLyogUjEyNyAqLworCTB4MUZGRiwgICAgIC8qIFIxMjggLSBHUElPIERlYm91bmNlICovCisJMHgwMDAwLCAgICAgLyogUjEyOSAtIEdQSU8gUGluIHB1bGwgdXAgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFIxMzAgLSBHUElPIFB1bGwgZG93biBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjEzMSAtIEdQSU8gSW50ZXJydXB0IE1vZGUgKi8KKwkweDAwMDAsICAgICAvKiBSMTMyICovCisJMHgwMDAwLCAgICAgLyogUjEzMyAtIEdQSU8gQ29udHJvbCAqLworCTB4MENGQiwgICAgIC8qIFIxMzQgLSBHUElPIENvbmZpZ3VyYXRpb24gKGkvbykgKi8KKwkweDBDMUYsICAgICAvKiBSMTM1IC0gR1BJTyBQaW4gUG9sYXJpdHkgLyBUeXBlICovCisJMHgwMDAwLCAgICAgLyogUjEzNiAqLworCTB4MDAwMCwgICAgIC8qIFIxMzcgKi8KKwkweDAwMDAsICAgICAvKiBSMTM4ICovCisJMHgwMDAwLCAgICAgLyogUjEzOSAqLworCTB4MDMwMCwgICAgIC8qIFIxNDAgLSBHUElPIEZ1bmN0aW9uIFNlbGVjdCAxICovCisJMHgxMTEwLCAgICAgLyogUjE0MSAtIEdQSU8gRnVuY3Rpb24gU2VsZWN0IDIgKi8KKwkweDAwMTMsICAgICAvKiBSMTQyIC0gR1BJTyBGdW5jdGlvbiBTZWxlY3QgMyAqLworCTB4MDAwMywgICAgIC8qIFIxNDMgLSBHUElPIEZ1bmN0aW9uIFNlbGVjdCA0ICovCisJMHgwMDAwLCAgICAgLyogUjE0NCAtIERpZ2l0aXNlciBDb250cm9sICgxKSAqLworCTB4MDAwMiwgICAgIC8qIFIxNDUgLSBEaWdpdGlzZXIgQ29udHJvbCAoMikgKi8KKwkweDAwMDAsICAgICAvKiBSMTQ2ICovCisJMHgwMDAwLCAgICAgLyogUjE0NyAqLworCTB4MDAwMCwgICAgIC8qIFIxNDggKi8KKwkweDAwMDAsICAgICAvKiBSMTQ5ICovCisJMHgwMDAwLCAgICAgLyogUjE1MCAqLworCTB4MDAwMCwgICAgIC8qIFIxNTEgKi8KKwkweDcwMDAsICAgICAvKiBSMTUyIC0gQVVYMSBSZWFkYmFjayAqLworCTB4NzAwMCwgICAgIC8qIFIxNTMgLSBBVVgyIFJlYWRiYWNrICovCisJMHg3MDAwLCAgICAgLyogUjE1NCAtIEFVWDMgUmVhZGJhY2sgKi8KKwkweDcwMDAsICAgICAvKiBSMTU1IC0gQVVYNCBSZWFkYmFjayAqLworCTB4MDAwMCwgICAgIC8qIFIxNTYgLSBVU0IgVm9sdGFnZSBSZWFkYmFjayAqLworCTB4MDAwMCwgICAgIC8qIFIxNTcgLSBMSU5FIFZvbHRhZ2UgUmVhZGJhY2sgKi8KKwkweDAwMDAsICAgICAvKiBSMTU4IC0gQkFUVCBWb2x0YWdlIFJlYWRiYWNrICovCisJMHgwMDAwLCAgICAgLyogUjE1OSAtIENoaXAgVGVtcCBSZWFkYmFjayAqLworCTB4MDAwMCwgICAgIC8qIFIxNjAgKi8KKwkweDAwMDAsICAgICAvKiBSMTYxICovCisJMHgwMDAwLCAgICAgLyogUjE2MiAqLworCTB4MDAwMCwgICAgIC8qIFIxNjMgLSBHZW5lcmljIENvbXBhcmF0b3IgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFIxNjQgLSBHZW5lcmljIGNvbXBhcmF0b3IgMSAqLworCTB4MDAwMCwgICAgIC8qIFIxNjUgLSBHZW5lcmljIGNvbXBhcmF0b3IgMiAqLworCTB4MDAwMCwgICAgIC8qIFIxNjYgLSBHZW5lcmljIGNvbXBhcmF0b3IgMyAqLworCTB4MDAwMCwgICAgIC8qIFIxNjcgLSBHZW5lcmljIGNvbXBhcmF0b3IgNCAqLworCTB4QTAwRiwgICAgIC8qIFIxNjggLSBCYXR0ZXJ5IENoYXJnZXIgQ29udHJvbCAxICovCisJMHgwQjA2LCAgICAgLyogUjE2OSAtIEJhdHRlcnkgQ2hhcmdlciBDb250cm9sIDIgKi8KKwkweDAwMDAsICAgICAvKiBSMTcwIC0gQmF0dGVyeSBDaGFyZ2VyIENvbnRyb2wgMyAqLworCTB4MDAwMCwgICAgIC8qIFIxNzEgKi8KKwkweDAwMDAsICAgICAvKiBSMTcyIC0gQ3VycmVudCBTaW5rIERyaXZlciBBICovCisJMHgwMDAwLCAgICAgLyogUjE3MyAtIENTQSBGbGFzaCBjb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjE3NCAqLworCTB4MDAwMCwgICAgIC8qIFIxNzUgKi8KKwkweDAwMDAsICAgICAvKiBSMTc2IC0gRENEQy9MRE8gcmVxdWVzdGVkICovCisJMHgwMzJELCAgICAgLyogUjE3NyAtIERDREMgQWN0aXZlIG9wdGlvbnMgKi8KKwkweDAwMDAsICAgICAvKiBSMTc4IC0gRENEQyBTbGVlcCBvcHRpb25zICovCisJMHgwMDI1LCAgICAgLyogUjE3OSAtIFBvd2VyLWNoZWNrIGNvbXBhcmF0b3IgKi8KKwkweDAwMEUsICAgICAvKiBSMTgwIC0gRENEQzEgQ29udHJvbCAqLworCTB4MEMwMCwgICAgIC8qIFIxODEgLSBEQ0RDMSBUaW1lb3V0cyAqLworCTB4MTAwNiwgICAgIC8qIFIxODIgLSBEQ0RDMSBMb3cgUG93ZXIgKi8KKwkweDAwMTgsICAgICAvKiBSMTgzIC0gRENEQzIgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFIxODQgLSBEQ0RDMiBUaW1lb3V0cyAqLworCTB4MDAwMCwgICAgIC8qIFIxODUgKi8KKwkweDAwMjYsICAgICAvKiBSMTg2IC0gRENEQzMgQ29udHJvbCAqLworCTB4MDQwMCwgICAgIC8qIFIxODcgLSBEQ0RDMyBUaW1lb3V0cyAqLworCTB4MDAwNiwgICAgIC8qIFIxODggLSBEQ0RDMyBMb3cgUG93ZXIgKi8KKwkweDAwNjIsICAgICAvKiBSMTg5IC0gRENEQzQgQ29udHJvbCAqLworCTB4MDgwMCwgICAgIC8qIFIxOTAgLSBEQ0RDNCBUaW1lb3V0cyAqLworCTB4MDAwNiwgICAgIC8qIFIxOTEgLSBEQ0RDNCBMb3cgUG93ZXIgKi8KKwkweDAwMDgsICAgICAvKiBSMTkyICovCisJMHgwMDAwLCAgICAgLyogUjE5MyAqLworCTB4MDAwMCwgICAgIC8qIFIxOTQgKi8KKwkweDAwMEEsICAgICAvKiBSMTk1ICovCisJMHgxMDAwLCAgICAgLyogUjE5NiAqLworCTB4MDAwNiwgICAgIC8qIFIxOTcgKi8KKwkweDAwMDAsICAgICAvKiBSMTk4ICovCisJMHgwMDAzLCAgICAgLyogUjE5OSAtIExpbWl0IFN3aXRjaCBDb250cm9sICovCisJMHgwMDA2LCAgICAgLyogUjIwMCAtIExETzEgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFIyMDEgLSBMRE8xIFRpbWVvdXRzICovCisJMHgwMDFDLCAgICAgLyogUjIwMiAtIExETzEgTG93IFBvd2VyICovCisJMHgwMDEwLCAgICAgLyogUjIwMyAtIExETzIgQ29udHJvbCAqLworCTB4MEMwMCwgICAgIC8qIFIyMDQgLSBMRE8yIFRpbWVvdXRzICovCisJMHgwMDFDLCAgICAgLyogUjIwNSAtIExETzIgTG93IFBvd2VyICovCisJMHgwMDFGLCAgICAgLyogUjIwNiAtIExETzMgQ29udHJvbCAqLworCTB4MDgwMCwgICAgIC8qIFIyMDcgLSBMRE8zIFRpbWVvdXRzICovCisJMHgwMDFDLCAgICAgLyogUjIwOCAtIExETzMgTG93IFBvd2VyICovCisJMHgwMDBBLCAgICAgLyogUjIwOSAtIExETzQgQ29udHJvbCAqLworCTB4MDgwMCwgICAgIC8qIFIyMTAgLSBMRE80IFRpbWVvdXRzICovCisJMHgwMDFDLCAgICAgLyogUjIxMSAtIExETzQgTG93IFBvd2VyICovCisJMHgwMDAwLCAgICAgLyogUjIxMiAqLworCTB4MDAwMCwgICAgIC8qIFIyMTMgKi8KKwkweDAwMDAsICAgICAvKiBSMjE0ICovCisJMHgwMDAwLCAgICAgLyogUjIxNSAtIFZDQ19GQVVMVCBNYXNrcyAqLworCTB4MDAxRiwgICAgIC8qIFIyMTYgLSBNYWluIEJhbmRnYXAgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFIyMTcgLSBPU0MgQ29udHJvbCAqLworCTB4OTAwMCwgICAgIC8qIFIyMTggLSBSVEMgVGljayBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjIxOSAtIFNlY3VyaXR5MSAqLworCTB4NDAwMCwgICAgIC8qIFIyMjAgKi8KKwkweDAwMDAsICAgICAvKiBSMjIxICovCisJMHgwMDAwLCAgICAgLyogUjIyMiAqLworCTB4MDAwMCwgICAgIC8qIFIyMjMgKi8KKwkweDAwMDAsICAgICAvKiBSMjI0IC0gU2lnbmFsIG92ZXJyaWRlcyAqLworCTB4MDAwMCwgICAgIC8qIFIyMjUgLSBEQ0RDL0xETyBzdGF0dXMgKi8KKwkweDAwMDAsICAgICAvKiBSMjI2IC0gQ2hhcmdlciBPdmVyaWRlcy9zdGF0dXMgKi8KKwkweDAwMDAsICAgICAvKiBSMjI3IC0gbWlzYyBvdmVycmlkZXMgKi8KKwkweDAwMDAsICAgICAvKiBSMjI4IC0gU3VwcGx5IG92ZXJyaWRlcy9zdGF0dXMgMSAqLworCTB4MDAwMCwgICAgIC8qIFIyMjkgLSBTdXBwbHkgb3ZlcnJpZGVzL3N0YXR1cyAyICovCisJMHhFMDAwLCAgICAgLyogUjIzMCAtIEdQSU8gUGluIFN0YXR1cyAqLworCTB4MDAwMCwgICAgIC8qIFIyMzEgLSBjb21wYXJvdG9yIG92ZXJyaWRlcyAqLworCTB4MDAwMCwgICAgIC8qIFIyMzIgKi8KKwkweDAwMDAsICAgICAvKiBSMjMzIC0gU3RhdGUgTWFjaGluZSBzdGF0dXMgKi8KKwkweDEyMDAsICAgICAvKiBSMjM0IC0gRkxMIFRlc3QgMSAqLworCTB4MDAwMCwgICAgIC8qIFIyMzUgKi8KKwkweDgwMDAsICAgICAvKiBSMjM2ICovCisJMHgwMDAwLCAgICAgLyogUjIzNyAqLworCTB4MDAwMCwgICAgIC8qIFIyMzggKi8KKwkweDAwMDAsICAgICAvKiBSMjM5ICovCisJMHgwMDAzLCAgICAgLyogUjI0MCAqLworCTB4MDAwMCwgICAgIC8qIFIyNDEgKi8KKwkweDAwMDAsICAgICAvKiBSMjQyICovCisJMHgwMDA0LCAgICAgLyogUjI0MyAqLworCTB4MDMwMCwgICAgIC8qIFIyNDQgKi8KKwkweDAwMDAsICAgICAvKiBSMjQ1ICovCisJMHgwMjAwLCAgICAgLyogUjI0NiAqLworCTB4MTAwMCwgICAgIC8qIFIyNDcgKi8KKwkweDEwMDAsICAgICAvKiBSMjQ4IC0gRENEQzEgVGVzdCBDb250cm9scyAqLworCTB4MTAwMCwgICAgIC8qIFIyNDkgKi8KKwkweDEwMDAsICAgICAvKiBSMjUwIC0gRENEQzMgVGVzdCBDb250cm9scyAqLworCTB4MTAwMCwgICAgIC8qIFIyNTEgLSBEQ0RDNCBUZXN0IENvbnRyb2xzICovCit9OworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfTUZEX1dNODM1MV9DT05GSUdfTU9ERV8yCisKKyN1bmRlZiBXTTgzNTBfSEFWRV9DT05GSUdfTU9ERQorI2RlZmluZSBXTTgzNTBfSEFWRV9DT05GSUdfTU9ERQorCitjb25zdCB1MTYgd204MzUxX21vZGUyX2RlZmF1bHRzW10gPSB7CisJMHg2MTQzLCAgICAgLyogUjAgICAtIFJlc2V0L0lEICovCisJMHgwMDAwLCAgICAgLyogUjEgICAtIElEICovCisJMHgwMDAxLCAgICAgLyogUjIgICAtIFJldmlzaW9uICovCisJMHgxQzAyLCAgICAgLyogUjMgICAtIFN5c3RlbSBDb250cm9sIDEgKi8KKwkweDAyMTQsICAgICAvKiBSNCAgIC0gU3lzdGVtIENvbnRyb2wgMiAqLworCTB4MDAwMCwgICAgIC8qIFI1ICAgLSBTeXN0ZW0gSGliZXJuYXRlICovCisJMHg4QTAwLCAgICAgLyogUjYgICAtIEludGVyZmFjZSBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjcgKi8KKwkweDgwMDAsICAgICAvKiBSOCAgIC0gUG93ZXIgbWdtdCAoMSkgKi8KKwkweDAwMDAsICAgICAvKiBSOSAgIC0gUG93ZXIgbWdtdCAoMikgKi8KKwkweDAwMDAsICAgICAvKiBSMTAgIC0gUG93ZXIgbWdtdCAoMykgKi8KKwkweDIwMDAsICAgICAvKiBSMTEgIC0gUG93ZXIgbWdtdCAoNCkgKi8KKwkweDBFMDAsICAgICAvKiBSMTIgIC0gUG93ZXIgbWdtdCAoNSkgKi8KKwkweDAwMDAsICAgICAvKiBSMTMgIC0gUG93ZXIgbWdtdCAoNikgKi8KKwkweDAwMDAsICAgICAvKiBSMTQgIC0gUG93ZXIgbWdtdCAoNykgKi8KKwkweDAwMDAsICAgICAvKiBSMTUgKi8KKwkweDAwMDAsICAgICAvKiBSMTYgIC0gUlRDIFNlY29uZHMvTWludXRlcyAqLworCTB4MDEwMCwgICAgIC8qIFIxNyAgLSBSVEMgSG91cnMvRGF5ICovCisJMHgwMTAxLCAgICAgLyogUjE4ICAtIFJUQyBEYXRlL01vbnRoICovCisJMHgxNDAwLCAgICAgLyogUjE5ICAtIFJUQyBZZWFyICovCisJMHgwMDAwLCAgICAgLyogUjIwICAtIEFsYXJtIFNlY29uZHMvTWludXRlcyAqLworCTB4MDAwMCwgICAgIC8qIFIyMSAgLSBBbGFybSBIb3Vycy9EYXkgKi8KKwkweDAwMDAsICAgICAvKiBSMjIgIC0gQWxhcm0gRGF0ZS9Nb250aCAqLworCTB4MDMyMCwgICAgIC8qIFIyMyAgLSBSVEMgVGltZSBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjI0ICAtIFN5c3RlbSBJbnRlcnJ1cHRzICovCisJMHgwMDAwLCAgICAgLyogUjI1ICAtIEludGVycnVwdCBTdGF0dXMgMSAqLworCTB4MDAwMCwgICAgIC8qIFIyNiAgLSBJbnRlcnJ1cHQgU3RhdHVzIDIgKi8KKwkweDAwMDAsICAgICAvKiBSMjcgKi8KKwkweDAwMDAsICAgICAvKiBSMjggIC0gVW5kZXIgVm9sdGFnZSBJbnRlcnJ1cHQgc3RhdHVzICovCisJMHgwMDAwLCAgICAgLyogUjI5ICAtIE92ZXIgQ3VycmVudCBJbnRlcnJ1cHQgc3RhdHVzICovCisJMHgwMDAwLCAgICAgLyogUjMwICAtIEdQSU8gSW50ZXJydXB0IFN0YXR1cyAqLworCTB4MDAwMCwgICAgIC8qIFIzMSAgLSBDb21wYXJhdG9yIEludGVycnVwdCBTdGF0dXMgKi8KKwkweDNGRkYsICAgICAvKiBSMzIgIC0gU3lzdGVtIEludGVycnVwdHMgTWFzayAqLworCTB4MDAwMCwgICAgIC8qIFIzMyAgLSBJbnRlcnJ1cHQgU3RhdHVzIDEgTWFzayAqLworCTB4MDAwMCwgICAgIC8qIFIzNCAgLSBJbnRlcnJ1cHQgU3RhdHVzIDIgTWFzayAqLworCTB4MDAwMCwgICAgIC8qIFIzNSAqLworCTB4MDAwMCwgICAgIC8qIFIzNiAgLSBVbmRlciBWb2x0YWdlIEludGVycnVwdCBzdGF0dXMgTWFzayAqLworCTB4MDAwMCwgICAgIC8qIFIzNyAgLSBPdmVyIEN1cnJlbnQgSW50ZXJydXB0IHN0YXR1cyBNYXNrICovCisJMHgwMDAwLCAgICAgLyogUjM4ICAtIEdQSU8gSW50ZXJydXB0IFN0YXR1cyBNYXNrICovCisJMHgwMDAwLCAgICAgLyogUjM5ICAtIENvbXBhcmF0b3IgSW50ZXJydXB0IFN0YXR1cyBNYXNrICovCisJMHgwMDQwLCAgICAgLyogUjQwICAtIENsb2NrIENvbnRyb2wgMSAqLworCTB4MDAwMCwgICAgIC8qIFI0MSAgLSBDbG9jayBDb250cm9sIDIgKi8KKwkweDNBMDAsICAgICAvKiBSNDIgIC0gRkxMIENvbnRyb2wgMSAqLworCTB4NzA4NiwgICAgIC8qIFI0MyAgLSBGTEwgQ29udHJvbCAyICovCisJMHhDMjI2LCAgICAgLyogUjQ0ICAtIEZMTCBDb250cm9sIDMgKi8KKwkweDAwMDAsICAgICAvKiBSNDUgIC0gRkxMIENvbnRyb2wgNCAqLworCTB4MDAwMCwgICAgIC8qIFI0NiAqLworCTB4MDAwMCwgICAgIC8qIFI0NyAqLworCTB4MDAwMCwgICAgIC8qIFI0OCAgLSBEQUMgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFI0OSAqLworCTB4MDBDMCwgICAgIC8qIFI1MCAgLSBEQUMgRGlnaXRhbCBWb2x1bWUgTCAqLworCTB4MDBDMCwgICAgIC8qIFI1MSAgLSBEQUMgRGlnaXRhbCBWb2x1bWUgUiAqLworCTB4MDAwMCwgICAgIC8qIFI1MiAqLworCTB4MDA0MCwgICAgIC8qIFI1MyAgLSBEQUMgTFIgUmF0ZSAqLworCTB4MDAwMCwgICAgIC8qIFI1NCAgLSBEQUMgQ2xvY2sgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFI1NSAqLworCTB4MDAwMCwgICAgIC8qIFI1NiAqLworCTB4MDAwMCwgICAgIC8qIFI1NyAqLworCTB4NDAwMCwgICAgIC8qIFI1OCAgLSBEQUMgTXV0ZSAqLworCTB4MDAwMCwgICAgIC8qIFI1OSAgLSBEQUMgTXV0ZSBWb2x1bWUgKi8KKwkweDAwMDAsICAgICAvKiBSNjAgIC0gREFDIFNpZGUgKi8KKwkweDAwMDAsICAgICAvKiBSNjEgKi8KKwkweDAwMDAsICAgICAvKiBSNjIgKi8KKwkweDAwMDAsICAgICAvKiBSNjMgKi8KKwkweDgwMDAsICAgICAvKiBSNjQgIC0gQURDIENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSNjUgKi8KKwkweDAwQzAsICAgICAvKiBSNjYgIC0gQURDIERpZ2l0YWwgVm9sdW1lIEwgKi8KKwkweDAwQzAsICAgICAvKiBSNjcgIC0gQURDIERpZ2l0YWwgVm9sdW1lIFIgKi8KKwkweDAwMDAsICAgICAvKiBSNjggIC0gQURDIERpdmlkZXIgKi8KKwkweDAwMDAsICAgICAvKiBSNjkgKi8KKwkweDAwNDAsICAgICAvKiBSNzAgIC0gQURDIExSIFJhdGUgKi8KKwkweDAwMDAsICAgICAvKiBSNzEgKi8KKwkweDAzMDMsICAgICAvKiBSNzIgIC0gSW5wdXQgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFI3MyAgLSBJTjMgSW5wdXQgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFI3NCAgLSBNaWMgQmlhcyBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjc1ICovCisJMHgwMDAwLCAgICAgLyogUjc2ICAtIE91dHB1dCBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjc3ICAtIEphY2sgRGV0ZWN0ICovCisJMHgwMDAwLCAgICAgLyogUjc4ICAtIEFudGkgUG9wIENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSNzkgKi8KKwkweDAwNDAsICAgICAvKiBSODAgIC0gTGVmdCBJbnB1dCBWb2x1bWUgKi8KKwkweDAwNDAsICAgICAvKiBSODEgIC0gUmlnaHQgSW5wdXQgVm9sdW1lICovCisJMHgwMDAwLCAgICAgLyogUjgyICovCisJMHgwMDAwLCAgICAgLyogUjgzICovCisJMHgwMDAwLCAgICAgLyogUjg0ICovCisJMHgwMDAwLCAgICAgLyogUjg1ICovCisJMHgwMDAwLCAgICAgLyogUjg2ICovCisJMHgwMDAwLCAgICAgLyogUjg3ICovCisJMHgwODAwLCAgICAgLyogUjg4ICAtIExlZnQgTWl4ZXIgQ29udHJvbCAqLworCTB4MTAwMCwgICAgIC8qIFI4OSAgLSBSaWdodCBNaXhlciBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjkwICovCisJMHgwMDAwLCAgICAgLyogUjkxICovCisJMHgwMDAwLCAgICAgLyogUjkyICAtIE9VVDMgTWl4ZXIgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFI5MyAgLSBPVVQ0IE1peGVyIENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSOTQgKi8KKwkweDAwMDAsICAgICAvKiBSOTUgKi8KKwkweDAwMDAsICAgICAvKiBSOTYgIC0gT3V0cHV0IExlZnQgTWl4ZXIgVm9sdW1lICovCisJMHgwMDAwLCAgICAgLyogUjk3ICAtIE91dHB1dCBSaWdodCBNaXhlciBWb2x1bWUgKi8KKwkweDAwMDAsICAgICAvKiBSOTggIC0gSW5wdXQgTWl4ZXIgVm9sdW1lIEwgKi8KKwkweDAwMDAsICAgICAvKiBSOTkgIC0gSW5wdXQgTWl4ZXIgVm9sdW1lIFIgKi8KKwkweDAwMDAsICAgICAvKiBSMTAwIC0gSW5wdXQgTWl4ZXIgVm9sdW1lICovCisJMHgwMDAwLCAgICAgLyogUjEwMSAqLworCTB4MDAwMCwgICAgIC8qIFIxMDIgKi8KKwkweDAwMDAsICAgICAvKiBSMTAzICovCisJMHgwMEU0LCAgICAgLyogUjEwNCAtIE9VVDFMIFZvbHVtZSAqLworCTB4MDBFNCwgICAgIC8qIFIxMDUgLSBPVVQxUiBWb2x1bWUgKi8KKwkweDAwRTQsICAgICAvKiBSMTA2IC0gT1VUMkwgVm9sdW1lICovCisJMHgwMkU0LCAgICAgLyogUjEwNyAtIE9VVDJSIFZvbHVtZSAqLworCTB4MDAwMCwgICAgIC8qIFIxMDggKi8KKwkweDAwMDAsICAgICAvKiBSMTA5ICovCisJMHgwMDAwLCAgICAgLyogUjExMCAqLworCTB4MDAwMCwgICAgIC8qIFIxMTEgLSBCRUVQIFZvbHVtZSAqLworCTB4MEEwMCwgICAgIC8qIFIxMTIgLSBBSSBGb3JtYXRpbmcgKi8KKwkweDAwMDAsICAgICAvKiBSMTEzIC0gQURDIERBQyBDT01QICovCisJMHgwMDIwLCAgICAgLyogUjExNCAtIEFJIEFEQyBDb250cm9sICovCisJMHgwMDIwLCAgICAgLyogUjExNSAtIEFJIERBQyBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjExNiAqLworCTB4MDAwMCwgICAgIC8qIFIxMTcgKi8KKwkweDAwMDAsICAgICAvKiBSMTE4ICovCisJMHgwMDAwLCAgICAgLyogUjExOSAqLworCTB4MDAwMCwgICAgIC8qIFIxMjAgKi8KKwkweDAwMDAsICAgICAvKiBSMTIxICovCisJMHgwMDAwLCAgICAgLyogUjEyMiAqLworCTB4MDAwMCwgICAgIC8qIFIxMjMgKi8KKwkweDAwMDAsICAgICAvKiBSMTI0ICovCisJMHgwMDAwLCAgICAgLyogUjEyNSAqLworCTB4MDAwMCwgICAgIC8qIFIxMjYgKi8KKwkweDAwMDAsICAgICAvKiBSMTI3ICovCisJMHgxRkZGLCAgICAgLyogUjEyOCAtIEdQSU8gRGVib3VuY2UgKi8KKwkweDAwMDAsICAgICAvKiBSMTI5IC0gR1BJTyBQaW4gcHVsbCB1cCBDb250cm9sICovCisJMHgwMTEwLCAgICAgLyogUjEzMCAtIEdQSU8gUHVsbCBkb3duIENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSMTMxIC0gR1BJTyBJbnRlcnJ1cHQgTW9kZSAqLworCTB4MDAwMCwgICAgIC8qIFIxMzIgKi8KKwkweDAwMDAsICAgICAvKiBSMTMzIC0gR1BJTyBDb250cm9sICovCisJMHgwOUZBLCAgICAgLyogUjEzNCAtIEdQSU8gQ29uZmlndXJhdGlvbiAoaS9vKSAqLworCTB4MERGNiwgICAgIC8qIFIxMzUgLSBHUElPIFBpbiBQb2xhcml0eSAvIFR5cGUgKi8KKwkweDAwMDAsICAgICAvKiBSMTM2ICovCisJMHgwMDAwLCAgICAgLyogUjEzNyAqLworCTB4MDAwMCwgICAgIC8qIFIxMzggKi8KKwkweDAwMDAsICAgICAvKiBSMTM5ICovCisJMHgxMzEwLCAgICAgLyogUjE0MCAtIEdQSU8gRnVuY3Rpb24gU2VsZWN0IDEgKi8KKwkweDAwMDMsICAgICAvKiBSMTQxIC0gR1BJTyBGdW5jdGlvbiBTZWxlY3QgMiAqLworCTB4MjAwMCwgICAgIC8qIFIxNDIgLSBHUElPIEZ1bmN0aW9uIFNlbGVjdCAzICovCisJMHgwMDAwLCAgICAgLyogUjE0MyAtIEdQSU8gRnVuY3Rpb24gU2VsZWN0IDQgKi8KKwkweDAwMDAsICAgICAvKiBSMTQ0IC0gRGlnaXRpc2VyIENvbnRyb2wgKDEpICovCisJMHgwMDAyLCAgICAgLyogUjE0NSAtIERpZ2l0aXNlciBDb250cm9sICgyKSAqLworCTB4MDAwMCwgICAgIC8qIFIxNDYgKi8KKwkweDAwMDAsICAgICAvKiBSMTQ3ICovCisJMHgwMDAwLCAgICAgLyogUjE0OCAqLworCTB4MDAwMCwgICAgIC8qIFIxNDkgKi8KKwkweDAwMDAsICAgICAvKiBSMTUwICovCisJMHgwMDAwLCAgICAgLyogUjE1MSAqLworCTB4NzAwMCwgICAgIC8qIFIxNTIgLSBBVVgxIFJlYWRiYWNrICovCisJMHg3MDAwLCAgICAgLyogUjE1MyAtIEFVWDIgUmVhZGJhY2sgKi8KKwkweDcwMDAsICAgICAvKiBSMTU0IC0gQVVYMyBSZWFkYmFjayAqLworCTB4NzAwMCwgICAgIC8qIFIxNTUgLSBBVVg0IFJlYWRiYWNrICovCisJMHgwMDAwLCAgICAgLyogUjE1NiAtIFVTQiBWb2x0YWdlIFJlYWRiYWNrICovCisJMHgwMDAwLCAgICAgLyogUjE1NyAtIExJTkUgVm9sdGFnZSBSZWFkYmFjayAqLworCTB4MDAwMCwgICAgIC8qIFIxNTggLSBCQVRUIFZvbHRhZ2UgUmVhZGJhY2sgKi8KKwkweDAwMDAsICAgICAvKiBSMTU5IC0gQ2hpcCBUZW1wIFJlYWRiYWNrICovCisJMHgwMDAwLCAgICAgLyogUjE2MCAqLworCTB4MDAwMCwgICAgIC8qIFIxNjEgKi8KKwkweDAwMDAsICAgICAvKiBSMTYyICovCisJMHgwMDAwLCAgICAgLyogUjE2MyAtIEdlbmVyaWMgQ29tcGFyYXRvciBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjE2NCAtIEdlbmVyaWMgY29tcGFyYXRvciAxICovCisJMHgwMDAwLCAgICAgLyogUjE2NSAtIEdlbmVyaWMgY29tcGFyYXRvciAyICovCisJMHgwMDAwLCAgICAgLyogUjE2NiAtIEdlbmVyaWMgY29tcGFyYXRvciAzICovCisJMHgwMDAwLCAgICAgLyogUjE2NyAtIEdlbmVyaWMgY29tcGFyYXRvciA0ICovCisJMHhBMDBGLCAgICAgLyogUjE2OCAtIEJhdHRlcnkgQ2hhcmdlciBDb250cm9sIDEgKi8KKwkweDBCMDYsICAgICAvKiBSMTY5IC0gQmF0dGVyeSBDaGFyZ2VyIENvbnRyb2wgMiAqLworCTB4MDAwMCwgICAgIC8qIFIxNzAgLSBCYXR0ZXJ5IENoYXJnZXIgQ29udHJvbCAzICovCisJMHgwMDAwLCAgICAgLyogUjE3MSAqLworCTB4MDAwMCwgICAgIC8qIFIxNzIgLSBDdXJyZW50IFNpbmsgRHJpdmVyIEEgKi8KKwkweDAwMDAsICAgICAvKiBSMTczIC0gQ1NBIEZsYXNoIGNvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSMTc0ICovCisJMHgwMDAwLCAgICAgLyogUjE3NSAqLworCTB4MDAwMCwgICAgIC8qIFIxNzYgLSBEQ0RDL0xETyByZXF1ZXN0ZWQgKi8KKwkweDAzMkQsICAgICAvKiBSMTc3IC0gRENEQyBBY3RpdmUgb3B0aW9ucyAqLworCTB4MDAwMCwgICAgIC8qIFIxNzggLSBEQ0RDIFNsZWVwIG9wdGlvbnMgKi8KKwkweDAwMjUsICAgICAvKiBSMTc5IC0gUG93ZXItY2hlY2sgY29tcGFyYXRvciAqLworCTB4MDAxQSwgICAgIC8qIFIxODAgLSBEQ0RDMSBDb250cm9sICovCisJMHgwODAwLCAgICAgLyogUjE4MSAtIERDREMxIFRpbWVvdXRzICovCisJMHgxMDA2LCAgICAgLyogUjE4MiAtIERDREMxIExvdyBQb3dlciAqLworCTB4MDAxOCwgICAgIC8qIFIxODMgLSBEQ0RDMiBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjE4NCAtIERDREMyIFRpbWVvdXRzICovCisJMHgwMDAwLCAgICAgLyogUjE4NSAqLworCTB4MDA1NiwgICAgIC8qIFIxODYgLSBEQ0RDMyBDb250cm9sICovCisJMHgwNDAwLCAgICAgLyogUjE4NyAtIERDREMzIFRpbWVvdXRzICovCisJMHgwMDA2LCAgICAgLyogUjE4OCAtIERDREMzIExvdyBQb3dlciAqLworCTB4MDAyNiwgICAgIC8qIFIxODkgLSBEQ0RDNCBDb250cm9sICovCisJMHgwQzAwLCAgICAgLyogUjE5MCAtIERDREM0IFRpbWVvdXRzICovCisJMHgwMDA2LCAgICAgLyogUjE5MSAtIERDREM0IExvdyBQb3dlciAqLworCTB4MDAwOCwgICAgIC8qIFIxOTIgKi8KKwkweDAwMDAsICAgICAvKiBSMTkzICovCisJMHgwMDAwLCAgICAgLyogUjE5NCAqLworCTB4MDAyNiwgICAgIC8qIFIxOTUgKi8KKwkweDBDMDAsICAgICAvKiBSMTk2ICovCisJMHgwMDA2LCAgICAgLyogUjE5NyAqLworCTB4MDAwMCwgICAgIC8qIFIxOTggKi8KKwkweDAwMDMsICAgICAvKiBSMTk5IC0gTGltaXQgU3dpdGNoIENvbnRyb2wgKi8KKwkweDAwMUMsICAgICAvKiBSMjAwIC0gTERPMSBDb250cm9sICovCisJMHgwNDAwLCAgICAgLyogUjIwMSAtIExETzEgVGltZW91dHMgKi8KKwkweDAwMUMsICAgICAvKiBSMjAyIC0gTERPMSBMb3cgUG93ZXIgKi8KKwkweDAwMTAsICAgICAvKiBSMjAzIC0gTERPMiBDb250cm9sICovCisJMHgwQzAwLCAgICAgLyogUjIwNCAtIExETzIgVGltZW91dHMgKi8KKwkweDAwMUMsICAgICAvKiBSMjA1IC0gTERPMiBMb3cgUG93ZXIgKi8KKwkweDAwMTUsICAgICAvKiBSMjA2IC0gTERPMyBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjIwNyAtIExETzMgVGltZW91dHMgKi8KKwkweDAwMUMsICAgICAvKiBSMjA4IC0gTERPMyBMb3cgUG93ZXIgKi8KKwkweDAwMUEsICAgICAvKiBSMjA5IC0gTERPNCBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjIxMCAtIExETzQgVGltZW91dHMgKi8KKwkweDAwMUMsICAgICAvKiBSMjExIC0gTERPNCBMb3cgUG93ZXIgKi8KKwkweDAwMDAsICAgICAvKiBSMjEyICovCisJMHgwMDAwLCAgICAgLyogUjIxMyAqLworCTB4MDAwMCwgICAgIC8qIFIyMTQgKi8KKwkweDAwMDAsICAgICAvKiBSMjE1IC0gVkNDX0ZBVUxUIE1hc2tzICovCisJMHgwMDFGLCAgICAgLyogUjIxNiAtIE1haW4gQmFuZGdhcCBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjIxNyAtIE9TQyBDb250cm9sICovCisJMHg5MDAwLCAgICAgLyogUjIxOCAtIFJUQyBUaWNrIENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSMjE5IC0gU2VjdXJpdHkxICovCisJMHg0MDAwLCAgICAgLyogUjIyMCAqLworCTB4MDAwMCwgICAgIC8qIFIyMjEgKi8KKwkweDAwMDAsICAgICAvKiBSMjIyICovCisJMHgwMDAwLCAgICAgLyogUjIyMyAqLworCTB4MDAwMCwgICAgIC8qIFIyMjQgLSBTaWduYWwgb3ZlcnJpZGVzICovCisJMHgwMDAwLCAgICAgLyogUjIyNSAtIERDREMvTERPIHN0YXR1cyAqLworCTB4MDAwMCwgICAgIC8qIFIyMjYgLSBDaGFyZ2VyIE92ZXJpZGVzL3N0YXR1cyAqLworCTB4MDAwMCwgICAgIC8qIFIyMjcgLSBtaXNjIG92ZXJyaWRlcyAqLworCTB4MDAwMCwgICAgIC8qIFIyMjggLSBTdXBwbHkgb3ZlcnJpZGVzL3N0YXR1cyAxICovCisJMHgwMDAwLCAgICAgLyogUjIyOSAtIFN1cHBseSBvdmVycmlkZXMvc3RhdHVzIDIgKi8KKwkweEUwMDAsICAgICAvKiBSMjMwIC0gR1BJTyBQaW4gU3RhdHVzICovCisJMHgwMDAwLCAgICAgLyogUjIzMSAtIGNvbXBhcm90b3Igb3ZlcnJpZGVzICovCisJMHgwMDAwLCAgICAgLyogUjIzMiAqLworCTB4MDAwMCwgICAgIC8qIFIyMzMgLSBTdGF0ZSBNYWNoaW5lIHN0YXR1cyAqLworCTB4MTIwMCwgICAgIC8qIFIyMzQgLSBGTEwgVGVzdCAxICovCisJMHgwMDAwLCAgICAgLyogUjIzNSAqLworCTB4ODAwMCwgICAgIC8qIFIyMzYgKi8KKwkweDAwMDAsICAgICAvKiBSMjM3ICovCisJMHgwMDAwLCAgICAgLyogUjIzOCAqLworCTB4MDAwMCwgICAgIC8qIFIyMzkgKi8KKwkweDAwMDMsICAgICAvKiBSMjQwICovCisJMHgwMDAwLCAgICAgLyogUjI0MSAqLworCTB4MDAwMCwgICAgIC8qIFIyNDIgKi8KKwkweDAwMDQsICAgICAvKiBSMjQzICovCisJMHgwMzAwLCAgICAgLyogUjI0NCAqLworCTB4MDAwMCwgICAgIC8qIFIyNDUgKi8KKwkweDAyMDAsICAgICAvKiBSMjQ2ICovCisJMHgwMDAwLCAgICAgLyogUjI0NyAqLworCTB4MTAwMCwgICAgIC8qIFIyNDggLSBEQ0RDMSBUZXN0IENvbnRyb2xzICovCisJMHgxMDAwLCAgICAgLyogUjI0OSAqLworCTB4MTAwMCwgICAgIC8qIFIyNTAgLSBEQ0RDMyBUZXN0IENvbnRyb2xzICovCisJMHgxMDAwLCAgICAgLyogUjI1MSAtIERDREM0IFRlc3QgQ29udHJvbHMgKi8KK307CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19NRkRfV004MzUxX0NPTkZJR19NT0RFXzMKKworI3VuZGVmIFdNODM1MF9IQVZFX0NPTkZJR19NT0RFCisjZGVmaW5lIFdNODM1MF9IQVZFX0NPTkZJR19NT0RFCisKK2NvbnN0IHUxNiB3bTgzNTFfbW9kZTNfZGVmYXVsdHNbXSA9IHsKKwkweDYxNDMsICAgICAvKiBSMCAgIC0gUmVzZXQvSUQgKi8KKwkweDAwMDAsICAgICAvKiBSMSAgIC0gSUQgKi8KKwkweDAwMDEsICAgICAvKiBSMiAgIC0gUmV2aXNpb24gKi8KKwkweDFDMDIsICAgICAvKiBSMyAgIC0gU3lzdGVtIENvbnRyb2wgMSAqLworCTB4MDIwNCwgICAgIC8qIFI0ICAgLSBTeXN0ZW0gQ29udHJvbCAyICovCisJMHgwMDAwLCAgICAgLyogUjUgICAtIFN5c3RlbSBIaWJlcm5hdGUgKi8KKwkweDhBMDAsICAgICAvKiBSNiAgIC0gSW50ZXJmYWNlIENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSNyAqLworCTB4ODAwMCwgICAgIC8qIFI4ICAgLSBQb3dlciBtZ210ICgxKSAqLworCTB4MDAwMCwgICAgIC8qIFI5ICAgLSBQb3dlciBtZ210ICgyKSAqLworCTB4MDAwMCwgICAgIC8qIFIxMCAgLSBQb3dlciBtZ210ICgzKSAqLworCTB4MjAwMCwgICAgIC8qIFIxMSAgLSBQb3dlciBtZ210ICg0KSAqLworCTB4MEUwMCwgICAgIC8qIFIxMiAgLSBQb3dlciBtZ210ICg1KSAqLworCTB4MDAwMCwgICAgIC8qIFIxMyAgLSBQb3dlciBtZ210ICg2KSAqLworCTB4MDAwMCwgICAgIC8qIFIxNCAgLSBQb3dlciBtZ210ICg3KSAqLworCTB4MDAwMCwgICAgIC8qIFIxNSAqLworCTB4MDAwMCwgICAgIC8qIFIxNiAgLSBSVEMgU2Vjb25kcy9NaW51dGVzICovCisJMHgwMTAwLCAgICAgLyogUjE3ICAtIFJUQyBIb3Vycy9EYXkgKi8KKwkweDAxMDEsICAgICAvKiBSMTggIC0gUlRDIERhdGUvTW9udGggKi8KKwkweDE0MDAsICAgICAvKiBSMTkgIC0gUlRDIFllYXIgKi8KKwkweDAwMDAsICAgICAvKiBSMjAgIC0gQWxhcm0gU2Vjb25kcy9NaW51dGVzICovCisJMHgwMDAwLCAgICAgLyogUjIxICAtIEFsYXJtIEhvdXJzL0RheSAqLworCTB4MDAwMCwgICAgIC8qIFIyMiAgLSBBbGFybSBEYXRlL01vbnRoICovCisJMHgwMzIwLCAgICAgLyogUjIzICAtIFJUQyBUaW1lIENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSMjQgIC0gU3lzdGVtIEludGVycnVwdHMgKi8KKwkweDAwMDAsICAgICAvKiBSMjUgIC0gSW50ZXJydXB0IFN0YXR1cyAxICovCisJMHgwMDAwLCAgICAgLyogUjI2ICAtIEludGVycnVwdCBTdGF0dXMgMiAqLworCTB4MDAwMCwgICAgIC8qIFIyNyAqLworCTB4MDAwMCwgICAgIC8qIFIyOCAgLSBVbmRlciBWb2x0YWdlIEludGVycnVwdCBzdGF0dXMgKi8KKwkweDAwMDAsICAgICAvKiBSMjkgIC0gT3ZlciBDdXJyZW50IEludGVycnVwdCBzdGF0dXMgKi8KKwkweDAwMDAsICAgICAvKiBSMzAgIC0gR1BJTyBJbnRlcnJ1cHQgU3RhdHVzICovCisJMHgwMDAwLCAgICAgLyogUjMxICAtIENvbXBhcmF0b3IgSW50ZXJydXB0IFN0YXR1cyAqLworCTB4M0ZGRiwgICAgIC8qIFIzMiAgLSBTeXN0ZW0gSW50ZXJydXB0cyBNYXNrICovCisJMHgwMDAwLCAgICAgLyogUjMzICAtIEludGVycnVwdCBTdGF0dXMgMSBNYXNrICovCisJMHgwMDAwLCAgICAgLyogUjM0ICAtIEludGVycnVwdCBTdGF0dXMgMiBNYXNrICovCisJMHgwMDAwLCAgICAgLyogUjM1ICovCisJMHgwMDAwLCAgICAgLyogUjM2ICAtIFVuZGVyIFZvbHRhZ2UgSW50ZXJydXB0IHN0YXR1cyBNYXNrICovCisJMHgwMDAwLCAgICAgLyogUjM3ICAtIE92ZXIgQ3VycmVudCBJbnRlcnJ1cHQgc3RhdHVzIE1hc2sgKi8KKwkweDAwMDAsICAgICAvKiBSMzggIC0gR1BJTyBJbnRlcnJ1cHQgU3RhdHVzIE1hc2sgKi8KKwkweDAwMDAsICAgICAvKiBSMzkgIC0gQ29tcGFyYXRvciBJbnRlcnJ1cHQgU3RhdHVzIE1hc2sgKi8KKwkweDAwNDAsICAgICAvKiBSNDAgIC0gQ2xvY2sgQ29udHJvbCAxICovCisJMHgwMDAwLCAgICAgLyogUjQxICAtIENsb2NrIENvbnRyb2wgMiAqLworCTB4M0EwMCwgICAgIC8qIFI0MiAgLSBGTEwgQ29udHJvbCAxICovCisJMHg3MDg2LCAgICAgLyogUjQzICAtIEZMTCBDb250cm9sIDIgKi8KKwkweEMyMjYsICAgICAvKiBSNDQgIC0gRkxMIENvbnRyb2wgMyAqLworCTB4MDAwMCwgICAgIC8qIFI0NSAgLSBGTEwgQ29udHJvbCA0ICovCisJMHgwMDAwLCAgICAgLyogUjQ2ICovCisJMHgwMDAwLCAgICAgLyogUjQ3ICovCisJMHgwMDAwLCAgICAgLyogUjQ4ICAtIERBQyBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjQ5ICovCisJMHgwMEMwLCAgICAgLyogUjUwICAtIERBQyBEaWdpdGFsIFZvbHVtZSBMICovCisJMHgwMEMwLCAgICAgLyogUjUxICAtIERBQyBEaWdpdGFsIFZvbHVtZSBSICovCisJMHgwMDAwLCAgICAgLyogUjUyICovCisJMHgwMDQwLCAgICAgLyogUjUzICAtIERBQyBMUiBSYXRlICovCisJMHgwMDAwLCAgICAgLyogUjU0ICAtIERBQyBDbG9jayBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjU1ICovCisJMHgwMDAwLCAgICAgLyogUjU2ICovCisJMHgwMDAwLCAgICAgLyogUjU3ICovCisJMHg0MDAwLCAgICAgLyogUjU4ICAtIERBQyBNdXRlICovCisJMHgwMDAwLCAgICAgLyogUjU5ICAtIERBQyBNdXRlIFZvbHVtZSAqLworCTB4MDAwMCwgICAgIC8qIFI2MCAgLSBEQUMgU2lkZSAqLworCTB4MDAwMCwgICAgIC8qIFI2MSAqLworCTB4MDAwMCwgICAgIC8qIFI2MiAqLworCTB4MDAwMCwgICAgIC8qIFI2MyAqLworCTB4ODAwMCwgICAgIC8qIFI2NCAgLSBBREMgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFI2NSAqLworCTB4MDBDMCwgICAgIC8qIFI2NiAgLSBBREMgRGlnaXRhbCBWb2x1bWUgTCAqLworCTB4MDBDMCwgICAgIC8qIFI2NyAgLSBBREMgRGlnaXRhbCBWb2x1bWUgUiAqLworCTB4MDAwMCwgICAgIC8qIFI2OCAgLSBBREMgRGl2aWRlciAqLworCTB4MDAwMCwgICAgIC8qIFI2OSAqLworCTB4MDA0MCwgICAgIC8qIFI3MCAgLSBBREMgTFIgUmF0ZSAqLworCTB4MDAwMCwgICAgIC8qIFI3MSAqLworCTB4MDMwMywgICAgIC8qIFI3MiAgLSBJbnB1dCBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjczICAtIElOMyBJbnB1dCBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjc0ICAtIE1pYyBCaWFzIENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSNzUgKi8KKwkweDAwMDAsICAgICAvKiBSNzYgIC0gT3V0cHV0IENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSNzcgIC0gSmFjayBEZXRlY3QgKi8KKwkweDAwMDAsICAgICAvKiBSNzggIC0gQW50aSBQb3AgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFI3OSAqLworCTB4MDA0MCwgICAgIC8qIFI4MCAgLSBMZWZ0IElucHV0IFZvbHVtZSAqLworCTB4MDA0MCwgICAgIC8qIFI4MSAgLSBSaWdodCBJbnB1dCBWb2x1bWUgKi8KKwkweDAwMDAsICAgICAvKiBSODIgKi8KKwkweDAwMDAsICAgICAvKiBSODMgKi8KKwkweDAwMDAsICAgICAvKiBSODQgKi8KKwkweDAwMDAsICAgICAvKiBSODUgKi8KKwkweDAwMDAsICAgICAvKiBSODYgKi8KKwkweDAwMDAsICAgICAvKiBSODcgKi8KKwkweDA4MDAsICAgICAvKiBSODggIC0gTGVmdCBNaXhlciBDb250cm9sICovCisJMHgxMDAwLCAgICAgLyogUjg5ICAtIFJpZ2h0IE1peGVyIENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSOTAgKi8KKwkweDAwMDAsICAgICAvKiBSOTEgKi8KKwkweDAwMDAsICAgICAvKiBSOTIgIC0gT1VUMyBNaXhlciBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjkzICAtIE9VVDQgTWl4ZXIgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFI5NCAqLworCTB4MDAwMCwgICAgIC8qIFI5NSAqLworCTB4MDAwMCwgICAgIC8qIFI5NiAgLSBPdXRwdXQgTGVmdCBNaXhlciBWb2x1bWUgKi8KKwkweDAwMDAsICAgICAvKiBSOTcgIC0gT3V0cHV0IFJpZ2h0IE1peGVyIFZvbHVtZSAqLworCTB4MDAwMCwgICAgIC8qIFI5OCAgLSBJbnB1dCBNaXhlciBWb2x1bWUgTCAqLworCTB4MDAwMCwgICAgIC8qIFI5OSAgLSBJbnB1dCBNaXhlciBWb2x1bWUgUiAqLworCTB4MDAwMCwgICAgIC8qIFIxMDAgLSBJbnB1dCBNaXhlciBWb2x1bWUgKi8KKwkweDAwMDAsICAgICAvKiBSMTAxICovCisJMHgwMDAwLCAgICAgLyogUjEwMiAqLworCTB4MDAwMCwgICAgIC8qIFIxMDMgKi8KKwkweDAwRTQsICAgICAvKiBSMTA0IC0gT1VUMUwgVm9sdW1lICovCisJMHgwMEU0LCAgICAgLyogUjEwNSAtIE9VVDFSIFZvbHVtZSAqLworCTB4MDBFNCwgICAgIC8qIFIxMDYgLSBPVVQyTCBWb2x1bWUgKi8KKwkweDAyRTQsICAgICAvKiBSMTA3IC0gT1VUMlIgVm9sdW1lICovCisJMHgwMDAwLCAgICAgLyogUjEwOCAqLworCTB4MDAwMCwgICAgIC8qIFIxMDkgKi8KKwkweDAwMDAsICAgICAvKiBSMTEwICovCisJMHgwMDAwLCAgICAgLyogUjExMSAtIEJFRVAgVm9sdW1lICovCisJMHgwQTAwLCAgICAgLyogUjExMiAtIEFJIEZvcm1hdGluZyAqLworCTB4MDAwMCwgICAgIC8qIFIxMTMgLSBBREMgREFDIENPTVAgKi8KKwkweDAwMjAsICAgICAvKiBSMTE0IC0gQUkgQURDIENvbnRyb2wgKi8KKwkweDAwMjAsICAgICAvKiBSMTE1IC0gQUkgREFDIENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSMTE2ICovCisJMHgwMDAwLCAgICAgLyogUjExNyAqLworCTB4MDAwMCwgICAgIC8qIFIxMTggKi8KKwkweDAwMDAsICAgICAvKiBSMTE5ICovCisJMHgwMDAwLCAgICAgLyogUjEyMCAqLworCTB4MDAwMCwgICAgIC8qIFIxMjEgKi8KKwkweDAwMDAsICAgICAvKiBSMTIyICovCisJMHgwMDAwLCAgICAgLyogUjEyMyAqLworCTB4MDAwMCwgICAgIC8qIFIxMjQgKi8KKwkweDAwMDAsICAgICAvKiBSMTI1ICovCisJMHgwMDAwLCAgICAgLyogUjEyNiAqLworCTB4MDAwMCwgICAgIC8qIFIxMjcgKi8KKwkweDFGRkYsICAgICAvKiBSMTI4IC0gR1BJTyBEZWJvdW5jZSAqLworCTB4MDAxMCwgICAgIC8qIFIxMjkgLSBHUElPIFBpbiBwdWxsIHVwIENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSMTMwIC0gR1BJTyBQdWxsIGRvd24gQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFIxMzEgLSBHUElPIEludGVycnVwdCBNb2RlICovCisJMHgwMDAwLCAgICAgLyogUjEzMiAqLworCTB4MDAwMCwgICAgIC8qIFIxMzMgLSBHUElPIENvbnRyb2wgKi8KKwkweDBCRkIsICAgICAvKiBSMTM0IC0gR1BJTyBDb25maWd1cmF0aW9uIChpL28pICovCisJMHgwRkZELCAgICAgLyogUjEzNSAtIEdQSU8gUGluIFBvbGFyaXR5IC8gVHlwZSAqLworCTB4MDAwMCwgICAgIC8qIFIxMzYgKi8KKwkweDAwMDAsICAgICAvKiBSMTM3ICovCisJMHgwMDAwLCAgICAgLyogUjEzOCAqLworCTB4MDAwMCwgICAgIC8qIFIxMzkgKi8KKwkweDAzMTAsICAgICAvKiBSMTQwIC0gR1BJTyBGdW5jdGlvbiBTZWxlY3QgMSAqLworCTB4MDAwMSwgICAgIC8qIFIxNDEgLSBHUElPIEZ1bmN0aW9uIFNlbGVjdCAyICovCisJMHgyMzAwLCAgICAgLyogUjE0MiAtIEdQSU8gRnVuY3Rpb24gU2VsZWN0IDMgKi8KKwkweDAwMDMsICAgICAvKiBSMTQzIC0gR1BJTyBGdW5jdGlvbiBTZWxlY3QgNCAqLworCTB4MDAwMCwgICAgIC8qIFIxNDQgLSBEaWdpdGlzZXIgQ29udHJvbCAoMSkgKi8KKwkweDAwMDIsICAgICAvKiBSMTQ1IC0gRGlnaXRpc2VyIENvbnRyb2wgKDIpICovCisJMHgwMDAwLCAgICAgLyogUjE0NiAqLworCTB4MDAwMCwgICAgIC8qIFIxNDcgKi8KKwkweDAwMDAsICAgICAvKiBSMTQ4ICovCisJMHgwMDAwLCAgICAgLyogUjE0OSAqLworCTB4MDAwMCwgICAgIC8qIFIxNTAgKi8KKwkweDAwMDAsICAgICAvKiBSMTUxICovCisJMHg3MDAwLCAgICAgLyogUjE1MiAtIEFVWDEgUmVhZGJhY2sgKi8KKwkweDcwMDAsICAgICAvKiBSMTUzIC0gQVVYMiBSZWFkYmFjayAqLworCTB4NzAwMCwgICAgIC8qIFIxNTQgLSBBVVgzIFJlYWRiYWNrICovCisJMHg3MDAwLCAgICAgLyogUjE1NSAtIEFVWDQgUmVhZGJhY2sgKi8KKwkweDAwMDAsICAgICAvKiBSMTU2IC0gVVNCIFZvbHRhZ2UgUmVhZGJhY2sgKi8KKwkweDAwMDAsICAgICAvKiBSMTU3IC0gTElORSBWb2x0YWdlIFJlYWRiYWNrICovCisJMHgwMDAwLCAgICAgLyogUjE1OCAtIEJBVFQgVm9sdGFnZSBSZWFkYmFjayAqLworCTB4MDAwMCwgICAgIC8qIFIxNTkgLSBDaGlwIFRlbXAgUmVhZGJhY2sgKi8KKwkweDAwMDAsICAgICAvKiBSMTYwICovCisJMHgwMDAwLCAgICAgLyogUjE2MSAqLworCTB4MDAwMCwgICAgIC8qIFIxNjIgKi8KKwkweDAwMDAsICAgICAvKiBSMTYzIC0gR2VuZXJpYyBDb21wYXJhdG9yIENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSMTY0IC0gR2VuZXJpYyBjb21wYXJhdG9yIDEgKi8KKwkweDAwMDAsICAgICAvKiBSMTY1IC0gR2VuZXJpYyBjb21wYXJhdG9yIDIgKi8KKwkweDAwMDAsICAgICAvKiBSMTY2IC0gR2VuZXJpYyBjb21wYXJhdG9yIDMgKi8KKwkweDAwMDAsICAgICAvKiBSMTY3IC0gR2VuZXJpYyBjb21wYXJhdG9yIDQgKi8KKwkweEEwMEYsICAgICAvKiBSMTY4IC0gQmF0dGVyeSBDaGFyZ2VyIENvbnRyb2wgMSAqLworCTB4MEIwNiwgICAgIC8qIFIxNjkgLSBCYXR0ZXJ5IENoYXJnZXIgQ29udHJvbCAyICovCisJMHgwMDAwLCAgICAgLyogUjE3MCAtIEJhdHRlcnkgQ2hhcmdlciBDb250cm9sIDMgKi8KKwkweDAwMDAsICAgICAvKiBSMTcxICovCisJMHgwMDAwLCAgICAgLyogUjE3MiAtIEN1cnJlbnQgU2luayBEcml2ZXIgQSAqLworCTB4MDAwMCwgICAgIC8qIFIxNzMgLSBDU0EgRmxhc2ggY29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFIxNzQgKi8KKwkweDAwMDAsICAgICAvKiBSMTc1ICovCisJMHgwMDAwLCAgICAgLyogUjE3NiAtIERDREMvTERPIHJlcXVlc3RlZCAqLworCTB4MDMyRCwgICAgIC8qIFIxNzcgLSBEQ0RDIEFjdGl2ZSBvcHRpb25zICovCisJMHgwMDAwLCAgICAgLyogUjE3OCAtIERDREMgU2xlZXAgb3B0aW9ucyAqLworCTB4MDAyNSwgICAgIC8qIFIxNzkgLSBQb3dlci1jaGVjayBjb21wYXJhdG9yICovCisJMHgwMDBFLCAgICAgLyogUjE4MCAtIERDREMxIENvbnRyb2wgKi8KKwkweDA0MDAsICAgICAvKiBSMTgxIC0gRENEQzEgVGltZW91dHMgKi8KKwkweDEwMDYsICAgICAvKiBSMTgyIC0gRENEQzEgTG93IFBvd2VyICovCisJMHgwMDE4LCAgICAgLyogUjE4MyAtIERDREMyIENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSMTg0IC0gRENEQzIgVGltZW91dHMgKi8KKwkweDAwMDAsICAgICAvKiBSMTg1ICovCisJMHgwMDI2LCAgICAgLyogUjE4NiAtIERDREMzIENvbnRyb2wgKi8KKwkweDA4MDAsICAgICAvKiBSMTg3IC0gRENEQzMgVGltZW91dHMgKi8KKwkweDAwMDYsICAgICAvKiBSMTg4IC0gRENEQzMgTG93IFBvd2VyICovCisJMHgwMDYyLCAgICAgLyogUjE4OSAtIERDREM0IENvbnRyb2wgKi8KKwkweDE0MDAsICAgICAvKiBSMTkwIC0gRENEQzQgVGltZW91dHMgKi8KKwkweDAwMDYsICAgICAvKiBSMTkxIC0gRENEQzQgTG93IFBvd2VyICovCisJMHgwMDA4LCAgICAgLyogUjE5MiAqLworCTB4MDAwMCwgICAgIC8qIFIxOTMgKi8KKwkweDAwMDAsICAgICAvKiBSMTk0ICovCisJMHgwMDI2LCAgICAgLyogUjE5NSAqLworCTB4MDQwMCwgICAgIC8qIFIxOTYgKi8KKwkweDAwMDYsICAgICAvKiBSMTk3ICovCisJMHgwMDAwLCAgICAgLyogUjE5OCAqLworCTB4MDAwMywgICAgIC8qIFIxOTkgLSBMaW1pdCBTd2l0Y2ggQ29udHJvbCAqLworCTB4MDAwNiwgICAgIC8qIFIyMDAgLSBMRE8xIENvbnRyb2wgKi8KKwkweDBDMDAsICAgICAvKiBSMjAxIC0gTERPMSBUaW1lb3V0cyAqLworCTB4MDAxQywgICAgIC8qIFIyMDIgLSBMRE8xIExvdyBQb3dlciAqLworCTB4MDAxNiwgICAgIC8qIFIyMDMgLSBMRE8yIENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSMjA0IC0gTERPMiBUaW1lb3V0cyAqLworCTB4MDAxQywgICAgIC8qIFIyMDUgLSBMRE8yIExvdyBQb3dlciAqLworCTB4MDAxOSwgICAgIC8qIFIyMDYgLSBMRE8zIENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSMjA3IC0gTERPMyBUaW1lb3V0cyAqLworCTB4MDAxQywgICAgIC8qIFIyMDggLSBMRE8zIExvdyBQb3dlciAqLworCTB4MDAxQSwgICAgIC8qIFIyMDkgLSBMRE80IENvbnRyb2wgKi8KKwkweDEwMDAsICAgICAvKiBSMjEwIC0gTERPNCBUaW1lb3V0cyAqLworCTB4MDAxQywgICAgIC8qIFIyMTEgLSBMRE80IExvdyBQb3dlciAqLworCTB4MDAwMCwgICAgIC8qIFIyMTIgKi8KKwkweDAwMDAsICAgICAvKiBSMjEzICovCisJMHgwMDAwLCAgICAgLyogUjIxNCAqLworCTB4MDAwMCwgICAgIC8qIFIyMTUgLSBWQ0NfRkFVTFQgTWFza3MgKi8KKwkweDAwMUYsICAgICAvKiBSMjE2IC0gTWFpbiBCYW5kZ2FwIENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSMjE3IC0gT1NDIENvbnRyb2wgKi8KKwkweDkwMDAsICAgICAvKiBSMjE4IC0gUlRDIFRpY2sgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFIyMTkgLSBTZWN1cml0eTEgKi8KKwkweDQwMDAsICAgICAvKiBSMjIwICovCisJMHgwMDAwLCAgICAgLyogUjIyMSAqLworCTB4MDAwMCwgICAgIC8qIFIyMjIgKi8KKwkweDAwMDAsICAgICAvKiBSMjIzICovCisJMHgwMDAwLCAgICAgLyogUjIyNCAtIFNpZ25hbCBvdmVycmlkZXMgKi8KKwkweDAwMDAsICAgICAvKiBSMjI1IC0gRENEQy9MRE8gc3RhdHVzICovCisJMHgwMDAwLCAgICAgLyogUjIyNiAtIENoYXJnZXIgT3ZlcmlkZXMvc3RhdHVzICovCisJMHgwMDAwLCAgICAgLyogUjIyNyAtIG1pc2Mgb3ZlcnJpZGVzICovCisJMHgwMDAwLCAgICAgLyogUjIyOCAtIFN1cHBseSBvdmVycmlkZXMvc3RhdHVzIDEgKi8KKwkweDAwMDAsICAgICAvKiBSMjI5IC0gU3VwcGx5IG92ZXJyaWRlcy9zdGF0dXMgMiAqLworCTB4RTAwMCwgICAgIC8qIFIyMzAgLSBHUElPIFBpbiBTdGF0dXMgKi8KKwkweDAwMDAsICAgICAvKiBSMjMxIC0gY29tcGFyb3RvciBvdmVycmlkZXMgKi8KKwkweDAwMDAsICAgICAvKiBSMjMyICovCisJMHgwMDAwLCAgICAgLyogUjIzMyAtIFN0YXRlIE1hY2hpbmUgc3RhdHVzICovCisJMHgxMjAwLCAgICAgLyogUjIzNCAtIEZMTCBUZXN0IDEgKi8KKwkweDAwMDAsICAgICAvKiBSMjM1ICovCisJMHg4MDAwLCAgICAgLyogUjIzNiAqLworCTB4MDAwMCwgICAgIC8qIFIyMzcgKi8KKwkweDAwMDAsICAgICAvKiBSMjM4ICovCisJMHgwMDAwLCAgICAgLyogUjIzOSAqLworCTB4MDAwMywgICAgIC8qIFIyNDAgKi8KKwkweDAwMDAsICAgICAvKiBSMjQxICovCisJMHgwMDAwLCAgICAgLyogUjI0MiAqLworCTB4MDAwNCwgICAgIC8qIFIyNDMgKi8KKwkweDAzMDAsICAgICAvKiBSMjQ0ICovCisJMHgwMDAwLCAgICAgLyogUjI0NSAqLworCTB4MDIwMCwgICAgIC8qIFIyNDYgKi8KKwkweDAwMDAsICAgICAvKiBSMjQ3ICovCisJMHgxMDAwLCAgICAgLyogUjI0OCAtIERDREMxIFRlc3QgQ29udHJvbHMgKi8KKwkweDEwMDAsICAgICAvKiBSMjQ5ICovCisJMHgxMDAwLCAgICAgLyogUjI1MCAtIERDREMzIFRlc3QgQ29udHJvbHMgKi8KKwkweDEwMDAsICAgICAvKiBSMjUxIC0gRENEQzQgVGVzdCBDb250cm9scyAqLworfTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX01GRF9XTTgzNTJfQ09ORklHX01PREVfMAorCisjdW5kZWYgV004MzUwX0hBVkVfQ09ORklHX01PREUKKyNkZWZpbmUgV004MzUwX0hBVkVfQ09ORklHX01PREUKKworY29uc3QgdTE2IHdtODM1Ml9tb2RlMF9kZWZhdWx0c1tdID0geworCTB4NjE0MywgICAgIC8qIFIwICAgLSBSZXNldC9JRCAqLworCTB4MDAwMCwgICAgIC8qIFIxICAgLSBJRCAqLworCTB4MDAwMiwgICAgIC8qIFIyICAgLSBSZXZpc2lvbiAqLworCTB4MUMwMiwgICAgIC8qIFIzICAgLSBTeXN0ZW0gQ29udHJvbCAxICovCisJMHgwMDA0LCAgICAgLyogUjQgICAtIFN5c3RlbSBDb250cm9sIDIgKi8KKwkweDAwMDAsICAgICAvKiBSNSAgIC0gU3lzdGVtIEhpYmVybmF0ZSAqLworCTB4OEEwMCwgICAgIC8qIFI2ICAgLSBJbnRlcmZhY2UgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFI3ICovCisJMHg4MDAwLCAgICAgLyogUjggICAtIFBvd2VyIG1nbXQgKDEpICovCisJMHgwMDAwLCAgICAgLyogUjkgICAtIFBvd2VyIG1nbXQgKDIpICovCisJMHgwMDAwLCAgICAgLyogUjEwICAtIFBvd2VyIG1nbXQgKDMpICovCisJMHgyMDAwLCAgICAgLyogUjExICAtIFBvd2VyIG1nbXQgKDQpICovCisJMHgwRTAwLCAgICAgLyogUjEyICAtIFBvd2VyIG1nbXQgKDUpICovCisJMHgwMDAwLCAgICAgLyogUjEzICAtIFBvd2VyIG1nbXQgKDYpICovCisJMHgwMDAwLCAgICAgLyogUjE0ICAtIFBvd2VyIG1nbXQgKDcpICovCisJMHgwMDAwLCAgICAgLyogUjE1ICovCisJMHgwMDAwLCAgICAgLyogUjE2ICAtIFJUQyBTZWNvbmRzL01pbnV0ZXMgKi8KKwkweDAxMDAsICAgICAvKiBSMTcgIC0gUlRDIEhvdXJzL0RheSAqLworCTB4MDEwMSwgICAgIC8qIFIxOCAgLSBSVEMgRGF0ZS9Nb250aCAqLworCTB4MTQwMCwgICAgIC8qIFIxOSAgLSBSVEMgWWVhciAqLworCTB4MDAwMCwgICAgIC8qIFIyMCAgLSBBbGFybSBTZWNvbmRzL01pbnV0ZXMgKi8KKwkweDAwMDAsICAgICAvKiBSMjEgIC0gQWxhcm0gSG91cnMvRGF5ICovCisJMHgwMDAwLCAgICAgLyogUjIyICAtIEFsYXJtIERhdGUvTW9udGggKi8KKwkweDAzMjAsICAgICAvKiBSMjMgIC0gUlRDIFRpbWUgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFIyNCAgLSBTeXN0ZW0gSW50ZXJydXB0cyAqLworCTB4MDAwMCwgICAgIC8qIFIyNSAgLSBJbnRlcnJ1cHQgU3RhdHVzIDEgKi8KKwkweDAwMDAsICAgICAvKiBSMjYgIC0gSW50ZXJydXB0IFN0YXR1cyAyICovCisJMHgwMDAwLCAgICAgLyogUjI3ICovCisJMHgwMDAwLCAgICAgLyogUjI4ICAtIFVuZGVyIFZvbHRhZ2UgSW50ZXJydXB0IHN0YXR1cyAqLworCTB4MDAwMCwgICAgIC8qIFIyOSAgLSBPdmVyIEN1cnJlbnQgSW50ZXJydXB0IHN0YXR1cyAqLworCTB4MDAwMCwgICAgIC8qIFIzMCAgLSBHUElPIEludGVycnVwdCBTdGF0dXMgKi8KKwkweDAwMDAsICAgICAvKiBSMzEgIC0gQ29tcGFyYXRvciBJbnRlcnJ1cHQgU3RhdHVzICovCisJMHgzRkZGLCAgICAgLyogUjMyICAtIFN5c3RlbSBJbnRlcnJ1cHRzIE1hc2sgKi8KKwkweDAwMDAsICAgICAvKiBSMzMgIC0gSW50ZXJydXB0IFN0YXR1cyAxIE1hc2sgKi8KKwkweDAwMDAsICAgICAvKiBSMzQgIC0gSW50ZXJydXB0IFN0YXR1cyAyIE1hc2sgKi8KKwkweDAwMDAsICAgICAvKiBSMzUgKi8KKwkweDAwMDAsICAgICAvKiBSMzYgIC0gVW5kZXIgVm9sdGFnZSBJbnRlcnJ1cHQgc3RhdHVzIE1hc2sgKi8KKwkweDAwMDAsICAgICAvKiBSMzcgIC0gT3ZlciBDdXJyZW50IEludGVycnVwdCBzdGF0dXMgTWFzayAqLworCTB4MDAwMCwgICAgIC8qIFIzOCAgLSBHUElPIEludGVycnVwdCBTdGF0dXMgTWFzayAqLworCTB4MDAwMCwgICAgIC8qIFIzOSAgLSBDb21wYXJhdG9yIEludGVycnVwdCBTdGF0dXMgTWFzayAqLworCTB4MDA0MCwgICAgIC8qIFI0MCAgLSBDbG9jayBDb250cm9sIDEgKi8KKwkweDAwMDAsICAgICAvKiBSNDEgIC0gQ2xvY2sgQ29udHJvbCAyICovCisJMHgzQTAwLCAgICAgLyogUjQyICAtIEZMTCBDb250cm9sIDEgKi8KKwkweDcwODYsICAgICAvKiBSNDMgIC0gRkxMIENvbnRyb2wgMiAqLworCTB4QzIyNiwgICAgIC8qIFI0NCAgLSBGTEwgQ29udHJvbCAzICovCisJMHgwMDAwLCAgICAgLyogUjQ1ICAtIEZMTCBDb250cm9sIDQgKi8KKwkweDAwMDAsICAgICAvKiBSNDYgKi8KKwkweDAwMDAsICAgICAvKiBSNDcgKi8KKwkweDAwMDAsICAgICAvKiBSNDggIC0gREFDIENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSNDkgKi8KKwkweDAwQzAsICAgICAvKiBSNTAgIC0gREFDIERpZ2l0YWwgVm9sdW1lIEwgKi8KKwkweDAwQzAsICAgICAvKiBSNTEgIC0gREFDIERpZ2l0YWwgVm9sdW1lIFIgKi8KKwkweDAwMDAsICAgICAvKiBSNTIgKi8KKwkweDAwNDAsICAgICAvKiBSNTMgIC0gREFDIExSIFJhdGUgKi8KKwkweDAwMDAsICAgICAvKiBSNTQgIC0gREFDIENsb2NrIENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSNTUgKi8KKwkweDAwMDAsICAgICAvKiBSNTYgKi8KKwkweDAwMDAsICAgICAvKiBSNTcgKi8KKwkweDQwMDAsICAgICAvKiBSNTggIC0gREFDIE11dGUgKi8KKwkweDAwMDAsICAgICAvKiBSNTkgIC0gREFDIE11dGUgVm9sdW1lICovCisJMHgwMDAwLCAgICAgLyogUjYwICAtIERBQyBTaWRlICovCisJMHgwMDAwLCAgICAgLyogUjYxICovCisJMHgwMDAwLCAgICAgLyogUjYyICovCisJMHgwMDAwLCAgICAgLyogUjYzICovCisJMHg4MDAwLCAgICAgLyogUjY0ICAtIEFEQyBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjY1ICovCisJMHgwMEMwLCAgICAgLyogUjY2ICAtIEFEQyBEaWdpdGFsIFZvbHVtZSBMICovCisJMHgwMEMwLCAgICAgLyogUjY3ICAtIEFEQyBEaWdpdGFsIFZvbHVtZSBSICovCisJMHgwMDAwLCAgICAgLyogUjY4ICAtIEFEQyBEaXZpZGVyICovCisJMHgwMDAwLCAgICAgLyogUjY5ICovCisJMHgwMDQwLCAgICAgLyogUjcwICAtIEFEQyBMUiBSYXRlICovCisJMHgwMDAwLCAgICAgLyogUjcxICovCisJMHgwMzAzLCAgICAgLyogUjcyICAtIElucHV0IENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSNzMgIC0gSU4zIElucHV0IENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSNzQgIC0gTWljIEJpYXMgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFI3NSAqLworCTB4MDAwMCwgICAgIC8qIFI3NiAgLSBPdXRwdXQgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFI3NyAgLSBKYWNrIERldGVjdCAqLworCTB4MDAwMCwgICAgIC8qIFI3OCAgLSBBbnRpIFBvcCBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjc5ICovCisJMHgwMDQwLCAgICAgLyogUjgwICAtIExlZnQgSW5wdXQgVm9sdW1lICovCisJMHgwMDQwLCAgICAgLyogUjgxICAtIFJpZ2h0IElucHV0IFZvbHVtZSAqLworCTB4MDAwMCwgICAgIC8qIFI4MiAqLworCTB4MDAwMCwgICAgIC8qIFI4MyAqLworCTB4MDAwMCwgICAgIC8qIFI4NCAqLworCTB4MDAwMCwgICAgIC8qIFI4NSAqLworCTB4MDAwMCwgICAgIC8qIFI4NiAqLworCTB4MDAwMCwgICAgIC8qIFI4NyAqLworCTB4MDgwMCwgICAgIC8qIFI4OCAgLSBMZWZ0IE1peGVyIENvbnRyb2wgKi8KKwkweDEwMDAsICAgICAvKiBSODkgIC0gUmlnaHQgTWl4ZXIgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFI5MCAqLworCTB4MDAwMCwgICAgIC8qIFI5MSAqLworCTB4MDAwMCwgICAgIC8qIFI5MiAgLSBPVVQzIE1peGVyIENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSOTMgIC0gT1VUNCBNaXhlciBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjk0ICovCisJMHgwMDAwLCAgICAgLyogUjk1ICovCisJMHgwMDAwLCAgICAgLyogUjk2ICAtIE91dHB1dCBMZWZ0IE1peGVyIFZvbHVtZSAqLworCTB4MDAwMCwgICAgIC8qIFI5NyAgLSBPdXRwdXQgUmlnaHQgTWl4ZXIgVm9sdW1lICovCisJMHgwMDAwLCAgICAgLyogUjk4ICAtIElucHV0IE1peGVyIFZvbHVtZSBMICovCisJMHgwMDAwLCAgICAgLyogUjk5ICAtIElucHV0IE1peGVyIFZvbHVtZSBSICovCisJMHgwMDAwLCAgICAgLyogUjEwMCAtIElucHV0IE1peGVyIFZvbHVtZSAqLworCTB4MDAwMCwgICAgIC8qIFIxMDEgKi8KKwkweDAwMDAsICAgICAvKiBSMTAyICovCisJMHgwMDAwLCAgICAgLyogUjEwMyAqLworCTB4MDBFNCwgICAgIC8qIFIxMDQgLSBPVVQxTCBWb2x1bWUgKi8KKwkweDAwRTQsICAgICAvKiBSMTA1IC0gT1VUMVIgVm9sdW1lICovCisJMHgwMEU0LCAgICAgLyogUjEwNiAtIE9VVDJMIFZvbHVtZSAqLworCTB4MDJFNCwgICAgIC8qIFIxMDcgLSBPVVQyUiBWb2x1bWUgKi8KKwkweDAwMDAsICAgICAvKiBSMTA4ICovCisJMHgwMDAwLCAgICAgLyogUjEwOSAqLworCTB4MDAwMCwgICAgIC8qIFIxMTAgKi8KKwkweDAwMDAsICAgICAvKiBSMTExIC0gQkVFUCBWb2x1bWUgKi8KKwkweDBBMDAsICAgICAvKiBSMTEyIC0gQUkgRm9ybWF0aW5nICovCisJMHgwMDAwLCAgICAgLyogUjExMyAtIEFEQyBEQUMgQ09NUCAqLworCTB4MDAyMCwgICAgIC8qIFIxMTQgLSBBSSBBREMgQ29udHJvbCAqLworCTB4MDAyMCwgICAgIC8qIFIxMTUgLSBBSSBEQUMgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFIxMTYgKi8KKwkweDAwMDAsICAgICAvKiBSMTE3ICovCisJMHgwMDAwLCAgICAgLyogUjExOCAqLworCTB4MDAwMCwgICAgIC8qIFIxMTkgKi8KKwkweDAwMDAsICAgICAvKiBSMTIwICovCisJMHgwMDAwLCAgICAgLyogUjEyMSAqLworCTB4MDAwMCwgICAgIC8qIFIxMjIgKi8KKwkweDAwMDAsICAgICAvKiBSMTIzICovCisJMHgwMDAwLCAgICAgLyogUjEyNCAqLworCTB4MDAwMCwgICAgIC8qIFIxMjUgKi8KKwkweDAwMDAsICAgICAvKiBSMTI2ICovCisJMHgwMDAwLCAgICAgLyogUjEyNyAqLworCTB4MUZGRiwgICAgIC8qIFIxMjggLSBHUElPIERlYm91bmNlICovCisJMHgwMDAwLCAgICAgLyogUjEyOSAtIEdQSU8gUGluIHB1bGwgdXAgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFIxMzAgLSBHUElPIFB1bGwgZG93biBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjEzMSAtIEdQSU8gSW50ZXJydXB0IE1vZGUgKi8KKwkweDAwMDAsICAgICAvKiBSMTMyICovCisJMHgwMDAwLCAgICAgLyogUjEzMyAtIEdQSU8gQ29udHJvbCAqLworCTB4MEZGQywgICAgIC8qIFIxMzQgLSBHUElPIENvbmZpZ3VyYXRpb24gKGkvbykgKi8KKwkweDBGRkMsICAgICAvKiBSMTM1IC0gR1BJTyBQaW4gUG9sYXJpdHkgLyBUeXBlICovCisJMHgwMDAwLCAgICAgLyogUjEzNiAqLworCTB4MDAwMCwgICAgIC8qIFIxMzcgKi8KKwkweDAwMDAsICAgICAvKiBSMTM4ICovCisJMHgwMDAwLCAgICAgLyogUjEzOSAqLworCTB4MDAxMywgICAgIC8qIFIxNDAgLSBHUElPIEZ1bmN0aW9uIFNlbGVjdCAxICovCisJMHgwMDAwLCAgICAgLyogUjE0MSAtIEdQSU8gRnVuY3Rpb24gU2VsZWN0IDIgKi8KKwkweDAwMDAsICAgICAvKiBSMTQyIC0gR1BJTyBGdW5jdGlvbiBTZWxlY3QgMyAqLworCTB4MDAwMywgICAgIC8qIFIxNDMgLSBHUElPIEZ1bmN0aW9uIFNlbGVjdCA0ICovCisJMHgwMDAwLCAgICAgLyogUjE0NCAtIERpZ2l0aXNlciBDb250cm9sICgxKSAqLworCTB4MDAwMiwgICAgIC8qIFIxNDUgLSBEaWdpdGlzZXIgQ29udHJvbCAoMikgKi8KKwkweDAwMDAsICAgICAvKiBSMTQ2ICovCisJMHgwMDAwLCAgICAgLyogUjE0NyAqLworCTB4MDAwMCwgICAgIC8qIFIxNDggKi8KKwkweDAwMDAsICAgICAvKiBSMTQ5ICovCisJMHgwMDAwLCAgICAgLyogUjE1MCAqLworCTB4MDAwMCwgICAgIC8qIFIxNTEgKi8KKwkweDcwMDAsICAgICAvKiBSMTUyIC0gQVVYMSBSZWFkYmFjayAqLworCTB4NzAwMCwgICAgIC8qIFIxNTMgLSBBVVgyIFJlYWRiYWNrICovCisJMHg3MDAwLCAgICAgLyogUjE1NCAtIEFVWDMgUmVhZGJhY2sgKi8KKwkweDcwMDAsICAgICAvKiBSMTU1IC0gQVVYNCBSZWFkYmFjayAqLworCTB4MDAwMCwgICAgIC8qIFIxNTYgLSBVU0IgVm9sdGFnZSBSZWFkYmFjayAqLworCTB4MDAwMCwgICAgIC8qIFIxNTcgLSBMSU5FIFZvbHRhZ2UgUmVhZGJhY2sgKi8KKwkweDAwMDAsICAgICAvKiBSMTU4IC0gQkFUVCBWb2x0YWdlIFJlYWRiYWNrICovCisJMHgwMDAwLCAgICAgLyogUjE1OSAtIENoaXAgVGVtcCBSZWFkYmFjayAqLworCTB4MDAwMCwgICAgIC8qIFIxNjAgKi8KKwkweDAwMDAsICAgICAvKiBSMTYxICovCisJMHgwMDAwLCAgICAgLyogUjE2MiAqLworCTB4MDAwMCwgICAgIC8qIFIxNjMgLSBHZW5lcmljIENvbXBhcmF0b3IgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFIxNjQgLSBHZW5lcmljIGNvbXBhcmF0b3IgMSAqLworCTB4MDAwMCwgICAgIC8qIFIxNjUgLSBHZW5lcmljIGNvbXBhcmF0b3IgMiAqLworCTB4MDAwMCwgICAgIC8qIFIxNjYgLSBHZW5lcmljIGNvbXBhcmF0b3IgMyAqLworCTB4MDAwMCwgICAgIC8qIFIxNjcgLSBHZW5lcmljIGNvbXBhcmF0b3IgNCAqLworCTB4QTAwRiwgICAgIC8qIFIxNjggLSBCYXR0ZXJ5IENoYXJnZXIgQ29udHJvbCAxICovCisJMHgwQjA2LCAgICAgLyogUjE2OSAtIEJhdHRlcnkgQ2hhcmdlciBDb250cm9sIDIgKi8KKwkweDAwMDAsICAgICAvKiBSMTcwIC0gQmF0dGVyeSBDaGFyZ2VyIENvbnRyb2wgMyAqLworCTB4MDAwMCwgICAgIC8qIFIxNzEgKi8KKwkweDAwMDAsICAgICAvKiBSMTcyIC0gQ3VycmVudCBTaW5rIERyaXZlciBBICovCisJMHgwMDAwLCAgICAgLyogUjE3MyAtIENTQSBGbGFzaCBjb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjE3NCAtIEN1cnJlbnQgU2luayBEcml2ZXIgQiAqLworCTB4MDAwMCwgICAgIC8qIFIxNzUgLSBDU0IgRmxhc2ggY29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFIxNzYgLSBEQ0RDL0xETyByZXF1ZXN0ZWQgKi8KKwkweDAzMkQsICAgICAvKiBSMTc3IC0gRENEQyBBY3RpdmUgb3B0aW9ucyAqLworCTB4MDAwMCwgICAgIC8qIFIxNzggLSBEQ0RDIFNsZWVwIG9wdGlvbnMgKi8KKwkweDAwMjUsICAgICAvKiBSMTc5IC0gUG93ZXItY2hlY2sgY29tcGFyYXRvciAqLworCTB4MDAwRSwgICAgIC8qIFIxODAgLSBEQ0RDMSBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjE4MSAtIERDREMxIFRpbWVvdXRzICovCisJMHgxMDA2LCAgICAgLyogUjE4MiAtIERDREMxIExvdyBQb3dlciAqLworCTB4MDAxOCwgICAgIC8qIFIxODMgLSBEQ0RDMiBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjE4NCAtIERDREMyIFRpbWVvdXRzICovCisJMHgwMDAwLCAgICAgLyogUjE4NSAqLworCTB4MDAwMCwgICAgIC8qIFIxODYgLSBEQ0RDMyBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjE4NyAtIERDREMzIFRpbWVvdXRzICovCisJMHgwMDA2LCAgICAgLyogUjE4OCAtIERDREMzIExvdyBQb3dlciAqLworCTB4MDAwMCwgICAgIC8qIFIxODkgLSBEQ0RDNCBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjE5MCAtIERDREM0IFRpbWVvdXRzICovCisJMHgwMDA2LCAgICAgLyogUjE5MSAtIERDREM0IExvdyBQb3dlciAqLworCTB4MDAwOCwgICAgIC8qIFIxOTIgLSBEQ0RDNSBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjE5MyAtIERDREM1IFRpbWVvdXRzICovCisJMHgwMDAwLCAgICAgLyogUjE5NCAqLworCTB4MDAwMCwgICAgIC8qIFIxOTUgLSBEQ0RDNiBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjE5NiAtIERDREM2IFRpbWVvdXRzICovCisJMHgwMDA2LCAgICAgLyogUjE5NyAtIERDREM2IExvdyBQb3dlciAqLworCTB4MDAwMCwgICAgIC8qIFIxOTggKi8KKwkweDAwMDMsICAgICAvKiBSMTk5IC0gTGltaXQgU3dpdGNoIENvbnRyb2wgKi8KKwkweDAwMUMsICAgICAvKiBSMjAwIC0gTERPMSBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjIwMSAtIExETzEgVGltZW91dHMgKi8KKwkweDAwMUMsICAgICAvKiBSMjAyIC0gTERPMSBMb3cgUG93ZXIgKi8KKwkweDAwMUIsICAgICAvKiBSMjAzIC0gTERPMiBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjIwNCAtIExETzIgVGltZW91dHMgKi8KKwkweDAwMUMsICAgICAvKiBSMjA1IC0gTERPMiBMb3cgUG93ZXIgKi8KKwkweDAwMUIsICAgICAvKiBSMjA2IC0gTERPMyBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjIwNyAtIExETzMgVGltZW91dHMgKi8KKwkweDAwMUMsICAgICAvKiBSMjA4IC0gTERPMyBMb3cgUG93ZXIgKi8KKwkweDAwMUIsICAgICAvKiBSMjA5IC0gTERPNCBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjIxMCAtIExETzQgVGltZW91dHMgKi8KKwkweDAwMUMsICAgICAvKiBSMjExIC0gTERPNCBMb3cgUG93ZXIgKi8KKwkweDAwMDAsICAgICAvKiBSMjEyICovCisJMHgwMDAwLCAgICAgLyogUjIxMyAqLworCTB4MDAwMCwgICAgIC8qIFIyMTQgKi8KKwkweDAwMDAsICAgICAvKiBSMjE1IC0gVkNDX0ZBVUxUIE1hc2tzICovCisJMHgwMDFGLCAgICAgLyogUjIxNiAtIE1haW4gQmFuZGdhcCBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjIxNyAtIE9TQyBDb250cm9sICovCisJMHg5MDAwLCAgICAgLyogUjIxOCAtIFJUQyBUaWNrIENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSMjE5IC0gU2VjdXJpdHkxICovCisJMHg0MDAwLCAgICAgLyogUjIyMCAqLworCTB4MDAwMCwgICAgIC8qIFIyMjEgKi8KKwkweDAwMDAsICAgICAvKiBSMjIyICovCisJMHgwMDAwLCAgICAgLyogUjIyMyAqLworCTB4MDAwMCwgICAgIC8qIFIyMjQgLSBTaWduYWwgb3ZlcnJpZGVzICovCisJMHgwMDAwLCAgICAgLyogUjIyNSAtIERDREMvTERPIHN0YXR1cyAqLworCTB4MDAwMCwgICAgIC8qIFIyMjYgLSBDaGFyZ2VyIE92ZXJpZGVzL3N0YXR1cyAqLworCTB4MDAwMCwgICAgIC8qIFIyMjcgLSBtaXNjIG92ZXJyaWRlcyAqLworCTB4MDAwMCwgICAgIC8qIFIyMjggLSBTdXBwbHkgb3ZlcnJpZGVzL3N0YXR1cyAxICovCisJMHgwMDAwLCAgICAgLyogUjIyOSAtIFN1cHBseSBvdmVycmlkZXMvc3RhdHVzIDIgKi8KKwkweEUwMDAsICAgICAvKiBSMjMwIC0gR1BJTyBQaW4gU3RhdHVzICovCisJMHgwMDAwLCAgICAgLyogUjIzMSAtIGNvbXBhcm90b3Igb3ZlcnJpZGVzICovCisJMHgwMDAwLCAgICAgLyogUjIzMiAqLworCTB4MDAwMCwgICAgIC8qIFIyMzMgLSBTdGF0ZSBNYWNoaW5lIHN0YXR1cyAqLworCTB4MTIwMCwgICAgIC8qIFIyMzQgKi8KKwkweDAwMDAsICAgICAvKiBSMjM1ICovCisJMHg4MDAwLCAgICAgLyogUjIzNiAqLworCTB4MDAwMCwgICAgIC8qIFIyMzcgKi8KKwkweDAwMDAsICAgICAvKiBSMjM4ICovCisJMHgwMDAwLCAgICAgLyogUjIzOSAqLworCTB4MDAwMywgICAgIC8qIFIyNDAgKi8KKwkweDAwMDAsICAgICAvKiBSMjQxICovCisJMHgwMDAwLCAgICAgLyogUjI0MiAqLworCTB4MDAwNCwgICAgIC8qIFIyNDMgKi8KKwkweDAzMDAsICAgICAvKiBSMjQ0ICovCisJMHgwMDAwLCAgICAgLyogUjI0NSAqLworCTB4MDIwMCwgICAgIC8qIFIyNDYgKi8KKwkweDAwMDAsICAgICAvKiBSMjQ3ICovCisJMHgxMDAwLCAgICAgLyogUjI0OCAtIERDREMxIFRlc3QgQ29udHJvbHMgKi8KKwkweDUwMDAsICAgICAvKiBSMjQ5ICovCisJMHgxMDAwLCAgICAgLyogUjI1MCAtIERDREMzIFRlc3QgQ29udHJvbHMgKi8KKwkweDEwMDAsICAgICAvKiBSMjUxIC0gRENEQzQgVGVzdCBDb250cm9scyAqLworCTB4NTEwMCwgICAgIC8qIFIyNTIgKi8KKwkweDEwMDAsICAgICAvKiBSMjUzIC0gRENEQzYgVGVzdCBDb250cm9scyAqLworfTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX01GRF9XTTgzNTJfQ09ORklHX01PREVfMQorCisjdW5kZWYgV004MzUwX0hBVkVfQ09ORklHX01PREUKKyNkZWZpbmUgV004MzUwX0hBVkVfQ09ORklHX01PREUKKworY29uc3QgdTE2IHdtODM1Ml9tb2RlMV9kZWZhdWx0c1tdID0geworCTB4NjE0MywgICAgIC8qIFIwICAgLSBSZXNldC9JRCAqLworCTB4MDAwMCwgICAgIC8qIFIxICAgLSBJRCAqLworCTB4MDAwMiwgICAgIC8qIFIyICAgLSBSZXZpc2lvbiAqLworCTB4MUMwMiwgICAgIC8qIFIzICAgLSBTeXN0ZW0gQ29udHJvbCAxICovCisJMHgwMjA0LCAgICAgLyogUjQgICAtIFN5c3RlbSBDb250cm9sIDIgKi8KKwkweDAwMDAsICAgICAvKiBSNSAgIC0gU3lzdGVtIEhpYmVybmF0ZSAqLworCTB4OEEwMCwgICAgIC8qIFI2ICAgLSBJbnRlcmZhY2UgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFI3ICovCisJMHg4MDAwLCAgICAgLyogUjggICAtIFBvd2VyIG1nbXQgKDEpICovCisJMHgwMDAwLCAgICAgLyogUjkgICAtIFBvd2VyIG1nbXQgKDIpICovCisJMHgwMDAwLCAgICAgLyogUjEwICAtIFBvd2VyIG1nbXQgKDMpICovCisJMHgyMDAwLCAgICAgLyogUjExICAtIFBvd2VyIG1nbXQgKDQpICovCisJMHgwRTAwLCAgICAgLyogUjEyICAtIFBvd2VyIG1nbXQgKDUpICovCisJMHgwMDAwLCAgICAgLyogUjEzICAtIFBvd2VyIG1nbXQgKDYpICovCisJMHgwMDAwLCAgICAgLyogUjE0ICAtIFBvd2VyIG1nbXQgKDcpICovCisJMHgwMDAwLCAgICAgLyogUjE1ICovCisJMHgwMDAwLCAgICAgLyogUjE2ICAtIFJUQyBTZWNvbmRzL01pbnV0ZXMgKi8KKwkweDAxMDAsICAgICAvKiBSMTcgIC0gUlRDIEhvdXJzL0RheSAqLworCTB4MDEwMSwgICAgIC8qIFIxOCAgLSBSVEMgRGF0ZS9Nb250aCAqLworCTB4MTQwMCwgICAgIC8qIFIxOSAgLSBSVEMgWWVhciAqLworCTB4MDAwMCwgICAgIC8qIFIyMCAgLSBBbGFybSBTZWNvbmRzL01pbnV0ZXMgKi8KKwkweDAwMDAsICAgICAvKiBSMjEgIC0gQWxhcm0gSG91cnMvRGF5ICovCisJMHgwMDAwLCAgICAgLyogUjIyICAtIEFsYXJtIERhdGUvTW9udGggKi8KKwkweDAzMjAsICAgICAvKiBSMjMgIC0gUlRDIFRpbWUgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFIyNCAgLSBTeXN0ZW0gSW50ZXJydXB0cyAqLworCTB4MDAwMCwgICAgIC8qIFIyNSAgLSBJbnRlcnJ1cHQgU3RhdHVzIDEgKi8KKwkweDAwMDAsICAgICAvKiBSMjYgIC0gSW50ZXJydXB0IFN0YXR1cyAyICovCisJMHgwMDAwLCAgICAgLyogUjI3ICovCisJMHgwMDAwLCAgICAgLyogUjI4ICAtIFVuZGVyIFZvbHRhZ2UgSW50ZXJydXB0IHN0YXR1cyAqLworCTB4MDAwMCwgICAgIC8qIFIyOSAgLSBPdmVyIEN1cnJlbnQgSW50ZXJydXB0IHN0YXR1cyAqLworCTB4MDAwMCwgICAgIC8qIFIzMCAgLSBHUElPIEludGVycnVwdCBTdGF0dXMgKi8KKwkweDAwMDAsICAgICAvKiBSMzEgIC0gQ29tcGFyYXRvciBJbnRlcnJ1cHQgU3RhdHVzICovCisJMHgzRkZGLCAgICAgLyogUjMyICAtIFN5c3RlbSBJbnRlcnJ1cHRzIE1hc2sgKi8KKwkweDAwMDAsICAgICAvKiBSMzMgIC0gSW50ZXJydXB0IFN0YXR1cyAxIE1hc2sgKi8KKwkweDAwMDAsICAgICAvKiBSMzQgIC0gSW50ZXJydXB0IFN0YXR1cyAyIE1hc2sgKi8KKwkweDAwMDAsICAgICAvKiBSMzUgKi8KKwkweDAwMDAsICAgICAvKiBSMzYgIC0gVW5kZXIgVm9sdGFnZSBJbnRlcnJ1cHQgc3RhdHVzIE1hc2sgKi8KKwkweDAwMDAsICAgICAvKiBSMzcgIC0gT3ZlciBDdXJyZW50IEludGVycnVwdCBzdGF0dXMgTWFzayAqLworCTB4MDAwMCwgICAgIC8qIFIzOCAgLSBHUElPIEludGVycnVwdCBTdGF0dXMgTWFzayAqLworCTB4MDAwMCwgICAgIC8qIFIzOSAgLSBDb21wYXJhdG9yIEludGVycnVwdCBTdGF0dXMgTWFzayAqLworCTB4MDA0MCwgICAgIC8qIFI0MCAgLSBDbG9jayBDb250cm9sIDEgKi8KKwkweDAwMDAsICAgICAvKiBSNDEgIC0gQ2xvY2sgQ29udHJvbCAyICovCisJMHgzQTAwLCAgICAgLyogUjQyICAtIEZMTCBDb250cm9sIDEgKi8KKwkweDcwODYsICAgICAvKiBSNDMgIC0gRkxMIENvbnRyb2wgMiAqLworCTB4QzIyNiwgICAgIC8qIFI0NCAgLSBGTEwgQ29udHJvbCAzICovCisJMHgwMDAwLCAgICAgLyogUjQ1ICAtIEZMTCBDb250cm9sIDQgKi8KKwkweDAwMDAsICAgICAvKiBSNDYgKi8KKwkweDAwMDAsICAgICAvKiBSNDcgKi8KKwkweDAwMDAsICAgICAvKiBSNDggIC0gREFDIENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSNDkgKi8KKwkweDAwQzAsICAgICAvKiBSNTAgIC0gREFDIERpZ2l0YWwgVm9sdW1lIEwgKi8KKwkweDAwQzAsICAgICAvKiBSNTEgIC0gREFDIERpZ2l0YWwgVm9sdW1lIFIgKi8KKwkweDAwMDAsICAgICAvKiBSNTIgKi8KKwkweDAwNDAsICAgICAvKiBSNTMgIC0gREFDIExSIFJhdGUgKi8KKwkweDAwMDAsICAgICAvKiBSNTQgIC0gREFDIENsb2NrIENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSNTUgKi8KKwkweDAwMDAsICAgICAvKiBSNTYgKi8KKwkweDAwMDAsICAgICAvKiBSNTcgKi8KKwkweDQwMDAsICAgICAvKiBSNTggIC0gREFDIE11dGUgKi8KKwkweDAwMDAsICAgICAvKiBSNTkgIC0gREFDIE11dGUgVm9sdW1lICovCisJMHgwMDAwLCAgICAgLyogUjYwICAtIERBQyBTaWRlICovCisJMHgwMDAwLCAgICAgLyogUjYxICovCisJMHgwMDAwLCAgICAgLyogUjYyICovCisJMHgwMDAwLCAgICAgLyogUjYzICovCisJMHg4MDAwLCAgICAgLyogUjY0ICAtIEFEQyBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjY1ICovCisJMHgwMEMwLCAgICAgLyogUjY2ICAtIEFEQyBEaWdpdGFsIFZvbHVtZSBMICovCisJMHgwMEMwLCAgICAgLyogUjY3ICAtIEFEQyBEaWdpdGFsIFZvbHVtZSBSICovCisJMHgwMDAwLCAgICAgLyogUjY4ICAtIEFEQyBEaXZpZGVyICovCisJMHgwMDAwLCAgICAgLyogUjY5ICovCisJMHgwMDQwLCAgICAgLyogUjcwICAtIEFEQyBMUiBSYXRlICovCisJMHgwMDAwLCAgICAgLyogUjcxICovCisJMHgwMzAzLCAgICAgLyogUjcyICAtIElucHV0IENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSNzMgIC0gSU4zIElucHV0IENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSNzQgIC0gTWljIEJpYXMgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFI3NSAqLworCTB4MDAwMCwgICAgIC8qIFI3NiAgLSBPdXRwdXQgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFI3NyAgLSBKYWNrIERldGVjdCAqLworCTB4MDAwMCwgICAgIC8qIFI3OCAgLSBBbnRpIFBvcCBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjc5ICovCisJMHgwMDQwLCAgICAgLyogUjgwICAtIExlZnQgSW5wdXQgVm9sdW1lICovCisJMHgwMDQwLCAgICAgLyogUjgxICAtIFJpZ2h0IElucHV0IFZvbHVtZSAqLworCTB4MDAwMCwgICAgIC8qIFI4MiAqLworCTB4MDAwMCwgICAgIC8qIFI4MyAqLworCTB4MDAwMCwgICAgIC8qIFI4NCAqLworCTB4MDAwMCwgICAgIC8qIFI4NSAqLworCTB4MDAwMCwgICAgIC8qIFI4NiAqLworCTB4MDAwMCwgICAgIC8qIFI4NyAqLworCTB4MDgwMCwgICAgIC8qIFI4OCAgLSBMZWZ0IE1peGVyIENvbnRyb2wgKi8KKwkweDEwMDAsICAgICAvKiBSODkgIC0gUmlnaHQgTWl4ZXIgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFI5MCAqLworCTB4MDAwMCwgICAgIC8qIFI5MSAqLworCTB4MDAwMCwgICAgIC8qIFI5MiAgLSBPVVQzIE1peGVyIENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSOTMgIC0gT1VUNCBNaXhlciBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjk0ICovCisJMHgwMDAwLCAgICAgLyogUjk1ICovCisJMHgwMDAwLCAgICAgLyogUjk2ICAtIE91dHB1dCBMZWZ0IE1peGVyIFZvbHVtZSAqLworCTB4MDAwMCwgICAgIC8qIFI5NyAgLSBPdXRwdXQgUmlnaHQgTWl4ZXIgVm9sdW1lICovCisJMHgwMDAwLCAgICAgLyogUjk4ICAtIElucHV0IE1peGVyIFZvbHVtZSBMICovCisJMHgwMDAwLCAgICAgLyogUjk5ICAtIElucHV0IE1peGVyIFZvbHVtZSBSICovCisJMHgwMDAwLCAgICAgLyogUjEwMCAtIElucHV0IE1peGVyIFZvbHVtZSAqLworCTB4MDAwMCwgICAgIC8qIFIxMDEgKi8KKwkweDAwMDAsICAgICAvKiBSMTAyICovCisJMHgwMDAwLCAgICAgLyogUjEwMyAqLworCTB4MDBFNCwgICAgIC8qIFIxMDQgLSBPVVQxTCBWb2x1bWUgKi8KKwkweDAwRTQsICAgICAvKiBSMTA1IC0gT1VUMVIgVm9sdW1lICovCisJMHgwMEU0LCAgICAgLyogUjEwNiAtIE9VVDJMIFZvbHVtZSAqLworCTB4MDJFNCwgICAgIC8qIFIxMDcgLSBPVVQyUiBWb2x1bWUgKi8KKwkweDAwMDAsICAgICAvKiBSMTA4ICovCisJMHgwMDAwLCAgICAgLyogUjEwOSAqLworCTB4MDAwMCwgICAgIC8qIFIxMTAgKi8KKwkweDAwMDAsICAgICAvKiBSMTExIC0gQkVFUCBWb2x1bWUgKi8KKwkweDBBMDAsICAgICAvKiBSMTEyIC0gQUkgRm9ybWF0aW5nICovCisJMHgwMDAwLCAgICAgLyogUjExMyAtIEFEQyBEQUMgQ09NUCAqLworCTB4MDAyMCwgICAgIC8qIFIxMTQgLSBBSSBBREMgQ29udHJvbCAqLworCTB4MDAyMCwgICAgIC8qIFIxMTUgLSBBSSBEQUMgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFIxMTYgKi8KKwkweDAwMDAsICAgICAvKiBSMTE3ICovCisJMHgwMDAwLCAgICAgLyogUjExOCAqLworCTB4MDAwMCwgICAgIC8qIFIxMTkgKi8KKwkweDAwMDAsICAgICAvKiBSMTIwICovCisJMHgwMDAwLCAgICAgLyogUjEyMSAqLworCTB4MDAwMCwgICAgIC8qIFIxMjIgKi8KKwkweDAwMDAsICAgICAvKiBSMTIzICovCisJMHgwMDAwLCAgICAgLyogUjEyNCAqLworCTB4MDAwMCwgICAgIC8qIFIxMjUgKi8KKwkweDAwMDAsICAgICAvKiBSMTI2ICovCisJMHgwMDAwLCAgICAgLyogUjEyNyAqLworCTB4MUZGRiwgICAgIC8qIFIxMjggLSBHUElPIERlYm91bmNlICovCisJMHgwMDAwLCAgICAgLyogUjEyOSAtIEdQSU8gUGluIHB1bGwgdXAgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFIxMzAgLSBHUElPIFB1bGwgZG93biBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjEzMSAtIEdQSU8gSW50ZXJydXB0IE1vZGUgKi8KKwkweDAwMDAsICAgICAvKiBSMTMyICovCisJMHgwMDAwLCAgICAgLyogUjEzMyAtIEdQSU8gQ29udHJvbCAqLworCTB4MEJGQiwgICAgIC8qIFIxMzQgLSBHUElPIENvbmZpZ3VyYXRpb24gKGkvbykgKi8KKwkweDBGRkYsICAgICAvKiBSMTM1IC0gR1BJTyBQaW4gUG9sYXJpdHkgLyBUeXBlICovCisJMHgwMDAwLCAgICAgLyogUjEzNiAqLworCTB4MDAwMCwgICAgIC8qIFIxMzcgKi8KKwkweDAwMDAsICAgICAvKiBSMTM4ICovCisJMHgwMDAwLCAgICAgLyogUjEzOSAqLworCTB4MDMwMCwgICAgIC8qIFIxNDAgLSBHUElPIEZ1bmN0aW9uIFNlbGVjdCAxICovCisJMHgwMDAwLCAgICAgLyogUjE0MSAtIEdQSU8gRnVuY3Rpb24gU2VsZWN0IDIgKi8KKwkweDIzMDAsICAgICAvKiBSMTQyIC0gR1BJTyBGdW5jdGlvbiBTZWxlY3QgMyAqLworCTB4MDAwMywgICAgIC8qIFIxNDMgLSBHUElPIEZ1bmN0aW9uIFNlbGVjdCA0ICovCisJMHgwMDAwLCAgICAgLyogUjE0NCAtIERpZ2l0aXNlciBDb250cm9sICgxKSAqLworCTB4MDAwMiwgICAgIC8qIFIxNDUgLSBEaWdpdGlzZXIgQ29udHJvbCAoMikgKi8KKwkweDAwMDAsICAgICAvKiBSMTQ2ICovCisJMHgwMDAwLCAgICAgLyogUjE0NyAqLworCTB4MDAwMCwgICAgIC8qIFIxNDggKi8KKwkweDAwMDAsICAgICAvKiBSMTQ5ICovCisJMHgwMDAwLCAgICAgLyogUjE1MCAqLworCTB4MDAwMCwgICAgIC8qIFIxNTEgKi8KKwkweDcwMDAsICAgICAvKiBSMTUyIC0gQVVYMSBSZWFkYmFjayAqLworCTB4NzAwMCwgICAgIC8qIFIxNTMgLSBBVVgyIFJlYWRiYWNrICovCisJMHg3MDAwLCAgICAgLyogUjE1NCAtIEFVWDMgUmVhZGJhY2sgKi8KKwkweDcwMDAsICAgICAvKiBSMTU1IC0gQVVYNCBSZWFkYmFjayAqLworCTB4MDAwMCwgICAgIC8qIFIxNTYgLSBVU0IgVm9sdGFnZSBSZWFkYmFjayAqLworCTB4MDAwMCwgICAgIC8qIFIxNTcgLSBMSU5FIFZvbHRhZ2UgUmVhZGJhY2sgKi8KKwkweDAwMDAsICAgICAvKiBSMTU4IC0gQkFUVCBWb2x0YWdlIFJlYWRiYWNrICovCisJMHgwMDAwLCAgICAgLyogUjE1OSAtIENoaXAgVGVtcCBSZWFkYmFjayAqLworCTB4MDAwMCwgICAgIC8qIFIxNjAgKi8KKwkweDAwMDAsICAgICAvKiBSMTYxICovCisJMHgwMDAwLCAgICAgLyogUjE2MiAqLworCTB4MDAwMCwgICAgIC8qIFIxNjMgLSBHZW5lcmljIENvbXBhcmF0b3IgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFIxNjQgLSBHZW5lcmljIGNvbXBhcmF0b3IgMSAqLworCTB4MDAwMCwgICAgIC8qIFIxNjUgLSBHZW5lcmljIGNvbXBhcmF0b3IgMiAqLworCTB4MDAwMCwgICAgIC8qIFIxNjYgLSBHZW5lcmljIGNvbXBhcmF0b3IgMyAqLworCTB4MDAwMCwgICAgIC8qIFIxNjcgLSBHZW5lcmljIGNvbXBhcmF0b3IgNCAqLworCTB4QTAwRiwgICAgIC8qIFIxNjggLSBCYXR0ZXJ5IENoYXJnZXIgQ29udHJvbCAxICovCisJMHgwQjA2LCAgICAgLyogUjE2OSAtIEJhdHRlcnkgQ2hhcmdlciBDb250cm9sIDIgKi8KKwkweDAwMDAsICAgICAvKiBSMTcwIC0gQmF0dGVyeSBDaGFyZ2VyIENvbnRyb2wgMyAqLworCTB4MDAwMCwgICAgIC8qIFIxNzEgKi8KKwkweDAwMDAsICAgICAvKiBSMTcyIC0gQ3VycmVudCBTaW5rIERyaXZlciBBICovCisJMHgwMDAwLCAgICAgLyogUjE3MyAtIENTQSBGbGFzaCBjb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjE3NCAtIEN1cnJlbnQgU2luayBEcml2ZXIgQiAqLworCTB4MDAwMCwgICAgIC8qIFIxNzUgLSBDU0IgRmxhc2ggY29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFIxNzYgLSBEQ0RDL0xETyByZXF1ZXN0ZWQgKi8KKwkweDAzMkQsICAgICAvKiBSMTc3IC0gRENEQyBBY3RpdmUgb3B0aW9ucyAqLworCTB4MDAwMCwgICAgIC8qIFIxNzggLSBEQ0RDIFNsZWVwIG9wdGlvbnMgKi8KKwkweDAwMjUsICAgICAvKiBSMTc5IC0gUG93ZXItY2hlY2sgY29tcGFyYXRvciAqLworCTB4MDA2MiwgICAgIC8qIFIxODAgLSBEQ0RDMSBDb250cm9sICovCisJMHgwNDAwLCAgICAgLyogUjE4MSAtIERDREMxIFRpbWVvdXRzICovCisJMHgxMDA2LCAgICAgLyogUjE4MiAtIERDREMxIExvdyBQb3dlciAqLworCTB4MDAxOCwgICAgIC8qIFIxODMgLSBEQ0RDMiBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjE4NCAtIERDREMyIFRpbWVvdXRzICovCisJMHgwMDAwLCAgICAgLyogUjE4NSAqLworCTB4MDAwNiwgICAgIC8qIFIxODYgLSBEQ0RDMyBDb250cm9sICovCisJMHgwODAwLCAgICAgLyogUjE4NyAtIERDREMzIFRpbWVvdXRzICovCisJMHgwMDA2LCAgICAgLyogUjE4OCAtIERDREMzIExvdyBQb3dlciAqLworCTB4MDAwNiwgICAgIC8qIFIxODkgLSBEQ0RDNCBDb250cm9sICovCisJMHgwQzAwLCAgICAgLyogUjE5MCAtIERDREM0IFRpbWVvdXRzICovCisJMHgwMDA2LCAgICAgLyogUjE5MSAtIERDREM0IExvdyBQb3dlciAqLworCTB4MDAwOCwgICAgIC8qIFIxOTIgLSBEQ0RDNSBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjE5MyAtIERDREM1IFRpbWVvdXRzICovCisJMHgwMDAwLCAgICAgLyogUjE5NCAqLworCTB4MDAyNiwgICAgIC8qIFIxOTUgLSBEQ0RDNiBDb250cm9sICovCisJMHgxMDAwLCAgICAgLyogUjE5NiAtIERDREM2IFRpbWVvdXRzICovCisJMHgwMDA2LCAgICAgLyogUjE5NyAtIERDREM2IExvdyBQb3dlciAqLworCTB4MDAwMCwgICAgIC8qIFIxOTggKi8KKwkweDAwMDMsICAgICAvKiBSMTk5IC0gTGltaXQgU3dpdGNoIENvbnRyb2wgKi8KKwkweDAwMDIsICAgICAvKiBSMjAwIC0gTERPMSBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjIwMSAtIExETzEgVGltZW91dHMgKi8KKwkweDAwMUMsICAgICAvKiBSMjAyIC0gTERPMSBMb3cgUG93ZXIgKi8KKwkweDAwMUEsICAgICAvKiBSMjAzIC0gTERPMiBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjIwNCAtIExETzIgVGltZW91dHMgKi8KKwkweDAwMUMsICAgICAvKiBSMjA1IC0gTERPMiBMb3cgUG93ZXIgKi8KKwkweDAwMUYsICAgICAvKiBSMjA2IC0gTERPMyBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjIwNyAtIExETzMgVGltZW91dHMgKi8KKwkweDAwMUMsICAgICAvKiBSMjA4IC0gTERPMyBMb3cgUG93ZXIgKi8KKwkweDAwMUYsICAgICAvKiBSMjA5IC0gTERPNCBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjIxMCAtIExETzQgVGltZW91dHMgKi8KKwkweDAwMUMsICAgICAvKiBSMjExIC0gTERPNCBMb3cgUG93ZXIgKi8KKwkweDAwMDAsICAgICAvKiBSMjEyICovCisJMHgwMDAwLCAgICAgLyogUjIxMyAqLworCTB4MDAwMCwgICAgIC8qIFIyMTQgKi8KKwkweDAwMDAsICAgICAvKiBSMjE1IC0gVkNDX0ZBVUxUIE1hc2tzICovCisJMHgwMDFGLCAgICAgLyogUjIxNiAtIE1haW4gQmFuZGdhcCBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjIxNyAtIE9TQyBDb250cm9sICovCisJMHg5MDAwLCAgICAgLyogUjIxOCAtIFJUQyBUaWNrIENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSMjE5IC0gU2VjdXJpdHkxICovCisJMHg0MDAwLCAgICAgLyogUjIyMCAqLworCTB4MDAwMCwgICAgIC8qIFIyMjEgKi8KKwkweDAwMDAsICAgICAvKiBSMjIyICovCisJMHgwMDAwLCAgICAgLyogUjIyMyAqLworCTB4MDAwMCwgICAgIC8qIFIyMjQgLSBTaWduYWwgb3ZlcnJpZGVzICovCisJMHgwMDAwLCAgICAgLyogUjIyNSAtIERDREMvTERPIHN0YXR1cyAqLworCTB4MDAwMCwgICAgIC8qIFIyMjYgLSBDaGFyZ2VyIE92ZXJpZGVzL3N0YXR1cyAqLworCTB4MDAwMCwgICAgIC8qIFIyMjcgLSBtaXNjIG92ZXJyaWRlcyAqLworCTB4MDAwMCwgICAgIC8qIFIyMjggLSBTdXBwbHkgb3ZlcnJpZGVzL3N0YXR1cyAxICovCisJMHgwMDAwLCAgICAgLyogUjIyOSAtIFN1cHBseSBvdmVycmlkZXMvc3RhdHVzIDIgKi8KKwkweEUwMDAsICAgICAvKiBSMjMwIC0gR1BJTyBQaW4gU3RhdHVzICovCisJMHgwMDAwLCAgICAgLyogUjIzMSAtIGNvbXBhcm90b3Igb3ZlcnJpZGVzICovCisJMHgwMDAwLCAgICAgLyogUjIzMiAqLworCTB4MDAwMCwgICAgIC8qIFIyMzMgLSBTdGF0ZSBNYWNoaW5lIHN0YXR1cyAqLworCTB4MTIwMCwgICAgIC8qIFIyMzQgKi8KKwkweDAwMDAsICAgICAvKiBSMjM1ICovCisJMHg4MDAwLCAgICAgLyogUjIzNiAqLworCTB4MDAwMCwgICAgIC8qIFIyMzcgKi8KKwkweDAwMDAsICAgICAvKiBSMjM4ICovCisJMHgwMDAwLCAgICAgLyogUjIzOSAqLworCTB4MDAwMywgICAgIC8qIFIyNDAgKi8KKwkweDAwMDAsICAgICAvKiBSMjQxICovCisJMHgwMDAwLCAgICAgLyogUjI0MiAqLworCTB4MDAwNCwgICAgIC8qIFIyNDMgKi8KKwkweDAzMDAsICAgICAvKiBSMjQ0ICovCisJMHgwMDAwLCAgICAgLyogUjI0NSAqLworCTB4MDIwMCwgICAgIC8qIFIyNDYgKi8KKwkweDAwMDAsICAgICAvKiBSMjQ3ICovCisJMHgxMDAwLCAgICAgLyogUjI0OCAtIERDREMxIFRlc3QgQ29udHJvbHMgKi8KKwkweDUwMDAsICAgICAvKiBSMjQ5ICovCisJMHgxMDAwLCAgICAgLyogUjI1MCAtIERDREMzIFRlc3QgQ29udHJvbHMgKi8KKwkweDEwMDAsICAgICAvKiBSMjUxIC0gRENEQzQgVGVzdCBDb250cm9scyAqLworCTB4NTEwMCwgICAgIC8qIFIyNTIgKi8KKwkweDEwMDAsICAgICAvKiBSMjUzIC0gRENEQzYgVGVzdCBDb250cm9scyAqLworfTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX01GRF9XTTgzNTJfQ09ORklHX01PREVfMgorCisjdW5kZWYgV004MzUwX0hBVkVfQ09ORklHX01PREUKKyNkZWZpbmUgV004MzUwX0hBVkVfQ09ORklHX01PREUKKworY29uc3QgdTE2IHdtODM1Ml9tb2RlMl9kZWZhdWx0c1tdID0geworCTB4NjE0MywgICAgIC8qIFIwICAgLSBSZXNldC9JRCAqLworCTB4MDAwMCwgICAgIC8qIFIxICAgLSBJRCAqLworCTB4MDAwMiwgICAgIC8qIFIyICAgLSBSZXZpc2lvbiAqLworCTB4MUMwMiwgICAgIC8qIFIzICAgLSBTeXN0ZW0gQ29udHJvbCAxICovCisJMHgwMjA0LCAgICAgLyogUjQgICAtIFN5c3RlbSBDb250cm9sIDIgKi8KKwkweDAwMDAsICAgICAvKiBSNSAgIC0gU3lzdGVtIEhpYmVybmF0ZSAqLworCTB4OEEwMCwgICAgIC8qIFI2ICAgLSBJbnRlcmZhY2UgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFI3ICovCisJMHg4MDAwLCAgICAgLyogUjggICAtIFBvd2VyIG1nbXQgKDEpICovCisJMHgwMDAwLCAgICAgLyogUjkgICAtIFBvd2VyIG1nbXQgKDIpICovCisJMHgwMDAwLCAgICAgLyogUjEwICAtIFBvd2VyIG1nbXQgKDMpICovCisJMHgyMDAwLCAgICAgLyogUjExICAtIFBvd2VyIG1nbXQgKDQpICovCisJMHgwRTAwLCAgICAgLyogUjEyICAtIFBvd2VyIG1nbXQgKDUpICovCisJMHgwMDAwLCAgICAgLyogUjEzICAtIFBvd2VyIG1nbXQgKDYpICovCisJMHgwMDAwLCAgICAgLyogUjE0ICAtIFBvd2VyIG1nbXQgKDcpICovCisJMHgwMDAwLCAgICAgLyogUjE1ICovCisJMHgwMDAwLCAgICAgLyogUjE2ICAtIFJUQyBTZWNvbmRzL01pbnV0ZXMgKi8KKwkweDAxMDAsICAgICAvKiBSMTcgIC0gUlRDIEhvdXJzL0RheSAqLworCTB4MDEwMSwgICAgIC8qIFIxOCAgLSBSVEMgRGF0ZS9Nb250aCAqLworCTB4MTQwMCwgICAgIC8qIFIxOSAgLSBSVEMgWWVhciAqLworCTB4MDAwMCwgICAgIC8qIFIyMCAgLSBBbGFybSBTZWNvbmRzL01pbnV0ZXMgKi8KKwkweDAwMDAsICAgICAvKiBSMjEgIC0gQWxhcm0gSG91cnMvRGF5ICovCisJMHgwMDAwLCAgICAgLyogUjIyICAtIEFsYXJtIERhdGUvTW9udGggKi8KKwkweDAzMjAsICAgICAvKiBSMjMgIC0gUlRDIFRpbWUgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFIyNCAgLSBTeXN0ZW0gSW50ZXJydXB0cyAqLworCTB4MDAwMCwgICAgIC8qIFIyNSAgLSBJbnRlcnJ1cHQgU3RhdHVzIDEgKi8KKwkweDAwMDAsICAgICAvKiBSMjYgIC0gSW50ZXJydXB0IFN0YXR1cyAyICovCisJMHgwMDAwLCAgICAgLyogUjI3ICovCisJMHgwMDAwLCAgICAgLyogUjI4ICAtIFVuZGVyIFZvbHRhZ2UgSW50ZXJydXB0IHN0YXR1cyAqLworCTB4MDAwMCwgICAgIC8qIFIyOSAgLSBPdmVyIEN1cnJlbnQgSW50ZXJydXB0IHN0YXR1cyAqLworCTB4MDAwMCwgICAgIC8qIFIzMCAgLSBHUElPIEludGVycnVwdCBTdGF0dXMgKi8KKwkweDAwMDAsICAgICAvKiBSMzEgIC0gQ29tcGFyYXRvciBJbnRlcnJ1cHQgU3RhdHVzICovCisJMHgzRkZGLCAgICAgLyogUjMyICAtIFN5c3RlbSBJbnRlcnJ1cHRzIE1hc2sgKi8KKwkweDAwMDAsICAgICAvKiBSMzMgIC0gSW50ZXJydXB0IFN0YXR1cyAxIE1hc2sgKi8KKwkweDAwMDAsICAgICAvKiBSMzQgIC0gSW50ZXJydXB0IFN0YXR1cyAyIE1hc2sgKi8KKwkweDAwMDAsICAgICAvKiBSMzUgKi8KKwkweDAwMDAsICAgICAvKiBSMzYgIC0gVW5kZXIgVm9sdGFnZSBJbnRlcnJ1cHQgc3RhdHVzIE1hc2sgKi8KKwkweDAwMDAsICAgICAvKiBSMzcgIC0gT3ZlciBDdXJyZW50IEludGVycnVwdCBzdGF0dXMgTWFzayAqLworCTB4MDAwMCwgICAgIC8qIFIzOCAgLSBHUElPIEludGVycnVwdCBTdGF0dXMgTWFzayAqLworCTB4MDAwMCwgICAgIC8qIFIzOSAgLSBDb21wYXJhdG9yIEludGVycnVwdCBTdGF0dXMgTWFzayAqLworCTB4MDA0MCwgICAgIC8qIFI0MCAgLSBDbG9jayBDb250cm9sIDEgKi8KKwkweDAwMDAsICAgICAvKiBSNDEgIC0gQ2xvY2sgQ29udHJvbCAyICovCisJMHgzQTAwLCAgICAgLyogUjQyICAtIEZMTCBDb250cm9sIDEgKi8KKwkweDcwODYsICAgICAvKiBSNDMgIC0gRkxMIENvbnRyb2wgMiAqLworCTB4QzIyNiwgICAgIC8qIFI0NCAgLSBGTEwgQ29udHJvbCAzICovCisJMHgwMDAwLCAgICAgLyogUjQ1ICAtIEZMTCBDb250cm9sIDQgKi8KKwkweDAwMDAsICAgICAvKiBSNDYgKi8KKwkweDAwMDAsICAgICAvKiBSNDcgKi8KKwkweDAwMDAsICAgICAvKiBSNDggIC0gREFDIENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSNDkgKi8KKwkweDAwQzAsICAgICAvKiBSNTAgIC0gREFDIERpZ2l0YWwgVm9sdW1lIEwgKi8KKwkweDAwQzAsICAgICAvKiBSNTEgIC0gREFDIERpZ2l0YWwgVm9sdW1lIFIgKi8KKwkweDAwMDAsICAgICAvKiBSNTIgKi8KKwkweDAwNDAsICAgICAvKiBSNTMgIC0gREFDIExSIFJhdGUgKi8KKwkweDAwMDAsICAgICAvKiBSNTQgIC0gREFDIENsb2NrIENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSNTUgKi8KKwkweDAwMDAsICAgICAvKiBSNTYgKi8KKwkweDAwMDAsICAgICAvKiBSNTcgKi8KKwkweDQwMDAsICAgICAvKiBSNTggIC0gREFDIE11dGUgKi8KKwkweDAwMDAsICAgICAvKiBSNTkgIC0gREFDIE11dGUgVm9sdW1lICovCisJMHgwMDAwLCAgICAgLyogUjYwICAtIERBQyBTaWRlICovCisJMHgwMDAwLCAgICAgLyogUjYxICovCisJMHgwMDAwLCAgICAgLyogUjYyICovCisJMHgwMDAwLCAgICAgLyogUjYzICovCisJMHg4MDAwLCAgICAgLyogUjY0ICAtIEFEQyBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjY1ICovCisJMHgwMEMwLCAgICAgLyogUjY2ICAtIEFEQyBEaWdpdGFsIFZvbHVtZSBMICovCisJMHgwMEMwLCAgICAgLyogUjY3ICAtIEFEQyBEaWdpdGFsIFZvbHVtZSBSICovCisJMHgwMDAwLCAgICAgLyogUjY4ICAtIEFEQyBEaXZpZGVyICovCisJMHgwMDAwLCAgICAgLyogUjY5ICovCisJMHgwMDQwLCAgICAgLyogUjcwICAtIEFEQyBMUiBSYXRlICovCisJMHgwMDAwLCAgICAgLyogUjcxICovCisJMHgwMzAzLCAgICAgLyogUjcyICAtIElucHV0IENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSNzMgIC0gSU4zIElucHV0IENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSNzQgIC0gTWljIEJpYXMgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFI3NSAqLworCTB4MDAwMCwgICAgIC8qIFI3NiAgLSBPdXRwdXQgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFI3NyAgLSBKYWNrIERldGVjdCAqLworCTB4MDAwMCwgICAgIC8qIFI3OCAgLSBBbnRpIFBvcCBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjc5ICovCisJMHgwMDQwLCAgICAgLyogUjgwICAtIExlZnQgSW5wdXQgVm9sdW1lICovCisJMHgwMDQwLCAgICAgLyogUjgxICAtIFJpZ2h0IElucHV0IFZvbHVtZSAqLworCTB4MDAwMCwgICAgIC8qIFI4MiAqLworCTB4MDAwMCwgICAgIC8qIFI4MyAqLworCTB4MDAwMCwgICAgIC8qIFI4NCAqLworCTB4MDAwMCwgICAgIC8qIFI4NSAqLworCTB4MDAwMCwgICAgIC8qIFI4NiAqLworCTB4MDAwMCwgICAgIC8qIFI4NyAqLworCTB4MDgwMCwgICAgIC8qIFI4OCAgLSBMZWZ0IE1peGVyIENvbnRyb2wgKi8KKwkweDEwMDAsICAgICAvKiBSODkgIC0gUmlnaHQgTWl4ZXIgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFI5MCAqLworCTB4MDAwMCwgICAgIC8qIFI5MSAqLworCTB4MDAwMCwgICAgIC8qIFI5MiAgLSBPVVQzIE1peGVyIENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSOTMgIC0gT1VUNCBNaXhlciBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjk0ICovCisJMHgwMDAwLCAgICAgLyogUjk1ICovCisJMHgwMDAwLCAgICAgLyogUjk2ICAtIE91dHB1dCBMZWZ0IE1peGVyIFZvbHVtZSAqLworCTB4MDAwMCwgICAgIC8qIFI5NyAgLSBPdXRwdXQgUmlnaHQgTWl4ZXIgVm9sdW1lICovCisJMHgwMDAwLCAgICAgLyogUjk4ICAtIElucHV0IE1peGVyIFZvbHVtZSBMICovCisJMHgwMDAwLCAgICAgLyogUjk5ICAtIElucHV0IE1peGVyIFZvbHVtZSBSICovCisJMHgwMDAwLCAgICAgLyogUjEwMCAtIElucHV0IE1peGVyIFZvbHVtZSAqLworCTB4MDAwMCwgICAgIC8qIFIxMDEgKi8KKwkweDAwMDAsICAgICAvKiBSMTAyICovCisJMHgwMDAwLCAgICAgLyogUjEwMyAqLworCTB4MDBFNCwgICAgIC8qIFIxMDQgLSBPVVQxTCBWb2x1bWUgKi8KKwkweDAwRTQsICAgICAvKiBSMTA1IC0gT1VUMVIgVm9sdW1lICovCisJMHgwMEU0LCAgICAgLyogUjEwNiAtIE9VVDJMIFZvbHVtZSAqLworCTB4MDJFNCwgICAgIC8qIFIxMDcgLSBPVVQyUiBWb2x1bWUgKi8KKwkweDAwMDAsICAgICAvKiBSMTA4ICovCisJMHgwMDAwLCAgICAgLyogUjEwOSAqLworCTB4MDAwMCwgICAgIC8qIFIxMTAgKi8KKwkweDAwMDAsICAgICAvKiBSMTExIC0gQkVFUCBWb2x1bWUgKi8KKwkweDBBMDAsICAgICAvKiBSMTEyIC0gQUkgRm9ybWF0aW5nICovCisJMHgwMDAwLCAgICAgLyogUjExMyAtIEFEQyBEQUMgQ09NUCAqLworCTB4MDAyMCwgICAgIC8qIFIxMTQgLSBBSSBBREMgQ29udHJvbCAqLworCTB4MDAyMCwgICAgIC8qIFIxMTUgLSBBSSBEQUMgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFIxMTYgKi8KKwkweDAwMDAsICAgICAvKiBSMTE3ICovCisJMHgwMDAwLCAgICAgLyogUjExOCAqLworCTB4MDAwMCwgICAgIC8qIFIxMTkgKi8KKwkweDAwMDAsICAgICAvKiBSMTIwICovCisJMHgwMDAwLCAgICAgLyogUjEyMSAqLworCTB4MDAwMCwgICAgIC8qIFIxMjIgKi8KKwkweDAwMDAsICAgICAvKiBSMTIzICovCisJMHgwMDAwLCAgICAgLyogUjEyNCAqLworCTB4MDAwMCwgICAgIC8qIFIxMjUgKi8KKwkweDAwMDAsICAgICAvKiBSMTI2ICovCisJMHgwMDAwLCAgICAgLyogUjEyNyAqLworCTB4MUZGRiwgICAgIC8qIFIxMjggLSBHUElPIERlYm91bmNlICovCisJMHgwMDAwLCAgICAgLyogUjEyOSAtIEdQSU8gUGluIHB1bGwgdXAgQ29udHJvbCAqLworCTB4MDExMCwgICAgIC8qIFIxMzAgLSBHUElPIFB1bGwgZG93biBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjEzMSAtIEdQSU8gSW50ZXJydXB0IE1vZGUgKi8KKwkweDAwMDAsICAgICAvKiBSMTMyICovCisJMHgwMDAwLCAgICAgLyogUjEzMyAtIEdQSU8gQ29udHJvbCAqLworCTB4MDlEQSwgICAgIC8qIFIxMzQgLSBHUElPIENvbmZpZ3VyYXRpb24gKGkvbykgKi8KKwkweDBERDYsICAgICAvKiBSMTM1IC0gR1BJTyBQaW4gUG9sYXJpdHkgLyBUeXBlICovCisJMHgwMDAwLCAgICAgLyogUjEzNiAqLworCTB4MDAwMCwgICAgIC8qIFIxMzcgKi8KKwkweDAwMDAsICAgICAvKiBSMTM4ICovCisJMHgwMDAwLCAgICAgLyogUjEzOSAqLworCTB4MTMxMCwgICAgIC8qIFIxNDAgLSBHUElPIEZ1bmN0aW9uIFNlbGVjdCAxICovCisJMHgwMDMzLCAgICAgLyogUjE0MSAtIEdQSU8gRnVuY3Rpb24gU2VsZWN0IDIgKi8KKwkweDIwMDAsICAgICAvKiBSMTQyIC0gR1BJTyBGdW5jdGlvbiBTZWxlY3QgMyAqLworCTB4MDAwMCwgICAgIC8qIFIxNDMgLSBHUElPIEZ1bmN0aW9uIFNlbGVjdCA0ICovCisJMHgwMDAwLCAgICAgLyogUjE0NCAtIERpZ2l0aXNlciBDb250cm9sICgxKSAqLworCTB4MDAwMiwgICAgIC8qIFIxNDUgLSBEaWdpdGlzZXIgQ29udHJvbCAoMikgKi8KKwkweDAwMDAsICAgICAvKiBSMTQ2ICovCisJMHgwMDAwLCAgICAgLyogUjE0NyAqLworCTB4MDAwMCwgICAgIC8qIFIxNDggKi8KKwkweDAwMDAsICAgICAvKiBSMTQ5ICovCisJMHgwMDAwLCAgICAgLyogUjE1MCAqLworCTB4MDAwMCwgICAgIC8qIFIxNTEgKi8KKwkweDcwMDAsICAgICAvKiBSMTUyIC0gQVVYMSBSZWFkYmFjayAqLworCTB4NzAwMCwgICAgIC8qIFIxNTMgLSBBVVgyIFJlYWRiYWNrICovCisJMHg3MDAwLCAgICAgLyogUjE1NCAtIEFVWDMgUmVhZGJhY2sgKi8KKwkweDcwMDAsICAgICAvKiBSMTU1IC0gQVVYNCBSZWFkYmFjayAqLworCTB4MDAwMCwgICAgIC8qIFIxNTYgLSBVU0IgVm9sdGFnZSBSZWFkYmFjayAqLworCTB4MDAwMCwgICAgIC8qIFIxNTcgLSBMSU5FIFZvbHRhZ2UgUmVhZGJhY2sgKi8KKwkweDAwMDAsICAgICAvKiBSMTU4IC0gQkFUVCBWb2x0YWdlIFJlYWRiYWNrICovCisJMHgwMDAwLCAgICAgLyogUjE1OSAtIENoaXAgVGVtcCBSZWFkYmFjayAqLworCTB4MDAwMCwgICAgIC8qIFIxNjAgKi8KKwkweDAwMDAsICAgICAvKiBSMTYxICovCisJMHgwMDAwLCAgICAgLyogUjE2MiAqLworCTB4MDAwMCwgICAgIC8qIFIxNjMgLSBHZW5lcmljIENvbXBhcmF0b3IgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFIxNjQgLSBHZW5lcmljIGNvbXBhcmF0b3IgMSAqLworCTB4MDAwMCwgICAgIC8qIFIxNjUgLSBHZW5lcmljIGNvbXBhcmF0b3IgMiAqLworCTB4MDAwMCwgICAgIC8qIFIxNjYgLSBHZW5lcmljIGNvbXBhcmF0b3IgMyAqLworCTB4MDAwMCwgICAgIC8qIFIxNjcgLSBHZW5lcmljIGNvbXBhcmF0b3IgNCAqLworCTB4QTAwRiwgICAgIC8qIFIxNjggLSBCYXR0ZXJ5IENoYXJnZXIgQ29udHJvbCAxICovCisJMHgwQjA2LCAgICAgLyogUjE2OSAtIEJhdHRlcnkgQ2hhcmdlciBDb250cm9sIDIgKi8KKwkweDAwMDAsICAgICAvKiBSMTcwIC0gQmF0dGVyeSBDaGFyZ2VyIENvbnRyb2wgMyAqLworCTB4MDAwMCwgICAgIC8qIFIxNzEgKi8KKwkweDAwMDAsICAgICAvKiBSMTcyIC0gQ3VycmVudCBTaW5rIERyaXZlciBBICovCisJMHgwMDAwLCAgICAgLyogUjE3MyAtIENTQSBGbGFzaCBjb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjE3NCAtIEN1cnJlbnQgU2luayBEcml2ZXIgQiAqLworCTB4MDAwMCwgICAgIC8qIFIxNzUgLSBDU0IgRmxhc2ggY29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFIxNzYgLSBEQ0RDL0xETyByZXF1ZXN0ZWQgKi8KKwkweDAzMkQsICAgICAvKiBSMTc3IC0gRENEQyBBY3RpdmUgb3B0aW9ucyAqLworCTB4MDAwMCwgICAgIC8qIFIxNzggLSBEQ0RDIFNsZWVwIG9wdGlvbnMgKi8KKwkweDAwMjUsICAgICAvKiBSMTc5IC0gUG93ZXItY2hlY2sgY29tcGFyYXRvciAqLworCTB4MDAwRSwgICAgIC8qIFIxODAgLSBEQ0RDMSBDb250cm9sICovCisJMHgwODAwLCAgICAgLyogUjE4MSAtIERDREMxIFRpbWVvdXRzICovCisJMHgxMDA2LCAgICAgLyogUjE4MiAtIERDREMxIExvdyBQb3dlciAqLworCTB4MDAxOCwgICAgIC8qIFIxODMgLSBEQ0RDMiBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjE4NCAtIERDREMyIFRpbWVvdXRzICovCisJMHgwMDAwLCAgICAgLyogUjE4NSAqLworCTB4MDA1NiwgICAgIC8qIFIxODYgLSBEQ0RDMyBDb250cm9sICovCisJMHgxODAwLCAgICAgLyogUjE4NyAtIERDREMzIFRpbWVvdXRzICovCisJMHgwMDA2LCAgICAgLyogUjE4OCAtIERDREMzIExvdyBQb3dlciAqLworCTB4MDAwRSwgICAgIC8qIFIxODkgLSBEQ0RDNCBDb250cm9sICovCisJMHgxMDAwLCAgICAgLyogUjE5MCAtIERDREM0IFRpbWVvdXRzICovCisJMHgwMDA2LCAgICAgLyogUjE5MSAtIERDREM0IExvdyBQb3dlciAqLworCTB4MDAwOCwgICAgIC8qIFIxOTIgLSBEQ0RDNSBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjE5MyAtIERDREM1IFRpbWVvdXRzICovCisJMHgwMDAwLCAgICAgLyogUjE5NCAqLworCTB4MDAyNiwgICAgIC8qIFIxOTUgLSBEQ0RDNiBDb250cm9sICovCisJMHgwQzAwLCAgICAgLyogUjE5NiAtIERDREM2IFRpbWVvdXRzICovCisJMHgwMDA2LCAgICAgLyogUjE5NyAtIERDREM2IExvdyBQb3dlciAqLworCTB4MDAwMCwgICAgIC8qIFIxOTggKi8KKwkweDAwMDMsICAgICAvKiBSMTk5IC0gTGltaXQgU3dpdGNoIENvbnRyb2wgKi8KKwkweDAwMUMsICAgICAvKiBSMjAwIC0gTERPMSBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjIwMSAtIExETzEgVGltZW91dHMgKi8KKwkweDAwMUMsICAgICAvKiBSMjAyIC0gTERPMSBMb3cgUG93ZXIgKi8KKwkweDAwMDYsICAgICAvKiBSMjAzIC0gTERPMiBDb250cm9sICovCisJMHgwNDAwLCAgICAgLyogUjIwNCAtIExETzIgVGltZW91dHMgKi8KKwkweDAwMUMsICAgICAvKiBSMjA1IC0gTERPMiBMb3cgUG93ZXIgKi8KKwkweDAwMUMsICAgICAvKiBSMjA2IC0gTERPMyBDb250cm9sICovCisJMHgxNDAwLCAgICAgLyogUjIwNyAtIExETzMgVGltZW91dHMgKi8KKwkweDAwMUMsICAgICAvKiBSMjA4IC0gTERPMyBMb3cgUG93ZXIgKi8KKwkweDAwMUEsICAgICAvKiBSMjA5IC0gTERPNCBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjIxMCAtIExETzQgVGltZW91dHMgKi8KKwkweDAwMUMsICAgICAvKiBSMjExIC0gTERPNCBMb3cgUG93ZXIgKi8KKwkweDAwMDAsICAgICAvKiBSMjEyICovCisJMHgwMDAwLCAgICAgLyogUjIxMyAqLworCTB4MDAwMCwgICAgIC8qIFIyMTQgKi8KKwkweDAwMDAsICAgICAvKiBSMjE1IC0gVkNDX0ZBVUxUIE1hc2tzICovCisJMHgwMDFGLCAgICAgLyogUjIxNiAtIE1haW4gQmFuZGdhcCBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjIxNyAtIE9TQyBDb250cm9sICovCisJMHg5MDAwLCAgICAgLyogUjIxOCAtIFJUQyBUaWNrIENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSMjE5IC0gU2VjdXJpdHkxICovCisJMHg0MDAwLCAgICAgLyogUjIyMCAqLworCTB4MDAwMCwgICAgIC8qIFIyMjEgKi8KKwkweDAwMDAsICAgICAvKiBSMjIyICovCisJMHgwMDAwLCAgICAgLyogUjIyMyAqLworCTB4MDAwMCwgICAgIC8qIFIyMjQgLSBTaWduYWwgb3ZlcnJpZGVzICovCisJMHgwMDAwLCAgICAgLyogUjIyNSAtIERDREMvTERPIHN0YXR1cyAqLworCTB4MDAwMCwgICAgIC8qIFIyMjYgLSBDaGFyZ2VyIE92ZXJpZGVzL3N0YXR1cyAqLworCTB4MDAwMCwgICAgIC8qIFIyMjcgLSBtaXNjIG92ZXJyaWRlcyAqLworCTB4MDAwMCwgICAgIC8qIFIyMjggLSBTdXBwbHkgb3ZlcnJpZGVzL3N0YXR1cyAxICovCisJMHgwMDAwLCAgICAgLyogUjIyOSAtIFN1cHBseSBvdmVycmlkZXMvc3RhdHVzIDIgKi8KKwkweEUwMDAsICAgICAvKiBSMjMwIC0gR1BJTyBQaW4gU3RhdHVzICovCisJMHgwMDAwLCAgICAgLyogUjIzMSAtIGNvbXBhcm90b3Igb3ZlcnJpZGVzICovCisJMHgwMDAwLCAgICAgLyogUjIzMiAqLworCTB4MDAwMCwgICAgIC8qIFIyMzMgLSBTdGF0ZSBNYWNoaW5lIHN0YXR1cyAqLworCTB4MTIwMCwgICAgIC8qIFIyMzQgKi8KKwkweDAwMDAsICAgICAvKiBSMjM1ICovCisJMHg4MDAwLCAgICAgLyogUjIzNiAqLworCTB4MDAwMCwgICAgIC8qIFIyMzcgKi8KKwkweDAwMDAsICAgICAvKiBSMjM4ICovCisJMHgwMDAwLCAgICAgLyogUjIzOSAqLworCTB4MDAwMywgICAgIC8qIFIyNDAgKi8KKwkweDAwMDAsICAgICAvKiBSMjQxICovCisJMHgwMDAwLCAgICAgLyogUjI0MiAqLworCTB4MDAwNCwgICAgIC8qIFIyNDMgKi8KKwkweDAzMDAsICAgICAvKiBSMjQ0ICovCisJMHgwMDAwLCAgICAgLyogUjI0NSAqLworCTB4MDIwMCwgICAgIC8qIFIyNDYgKi8KKwkweDAwMDAsICAgICAvKiBSMjQ3ICovCisJMHgxMDAwLCAgICAgLyogUjI0OCAtIERDREMxIFRlc3QgQ29udHJvbHMgKi8KKwkweDUwMDAsICAgICAvKiBSMjQ5ICovCisJMHgxMDAwLCAgICAgLyogUjI1MCAtIERDREMzIFRlc3QgQ29udHJvbHMgKi8KKwkweDEwMDAsICAgICAvKiBSMjUxIC0gRENEQzQgVGVzdCBDb250cm9scyAqLworCTB4NTEwMCwgICAgIC8qIFIyNTIgKi8KKwkweDEwMDAsICAgICAvKiBSMjUzIC0gRENEQzYgVGVzdCBDb250cm9scyAqLworfTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX01GRF9XTTgzNTJfQ09ORklHX01PREVfMworCisjdW5kZWYgV004MzUwX0hBVkVfQ09ORklHX01PREUKKyNkZWZpbmUgV004MzUwX0hBVkVfQ09ORklHX01PREUKKworY29uc3QgdTE2IHdtODM1Ml9tb2RlM19kZWZhdWx0c1tdID0geworCTB4NjE0MywgICAgIC8qIFIwICAgLSBSZXNldC9JRCAqLworCTB4MDAwMCwgICAgIC8qIFIxICAgLSBJRCAqLworCTB4MDAwMiwgICAgIC8qIFIyICAgLSBSZXZpc2lvbiAqLworCTB4MUMwMiwgICAgIC8qIFIzICAgLSBTeXN0ZW0gQ29udHJvbCAxICovCisJMHgwMjA0LCAgICAgLyogUjQgICAtIFN5c3RlbSBDb250cm9sIDIgKi8KKwkweDAwMDAsICAgICAvKiBSNSAgIC0gU3lzdGVtIEhpYmVybmF0ZSAqLworCTB4OEEwMCwgICAgIC8qIFI2ICAgLSBJbnRlcmZhY2UgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFI3ICovCisJMHg4MDAwLCAgICAgLyogUjggICAtIFBvd2VyIG1nbXQgKDEpICovCisJMHgwMDAwLCAgICAgLyogUjkgICAtIFBvd2VyIG1nbXQgKDIpICovCisJMHgwMDAwLCAgICAgLyogUjEwICAtIFBvd2VyIG1nbXQgKDMpICovCisJMHgyMDAwLCAgICAgLyogUjExICAtIFBvd2VyIG1nbXQgKDQpICovCisJMHgwRTAwLCAgICAgLyogUjEyICAtIFBvd2VyIG1nbXQgKDUpICovCisJMHgwMDAwLCAgICAgLyogUjEzICAtIFBvd2VyIG1nbXQgKDYpICovCisJMHgwMDAwLCAgICAgLyogUjE0ICAtIFBvd2VyIG1nbXQgKDcpICovCisJMHgwMDAwLCAgICAgLyogUjE1ICovCisJMHgwMDAwLCAgICAgLyogUjE2ICAtIFJUQyBTZWNvbmRzL01pbnV0ZXMgKi8KKwkweDAxMDAsICAgICAvKiBSMTcgIC0gUlRDIEhvdXJzL0RheSAqLworCTB4MDEwMSwgICAgIC8qIFIxOCAgLSBSVEMgRGF0ZS9Nb250aCAqLworCTB4MTQwMCwgICAgIC8qIFIxOSAgLSBSVEMgWWVhciAqLworCTB4MDAwMCwgICAgIC8qIFIyMCAgLSBBbGFybSBTZWNvbmRzL01pbnV0ZXMgKi8KKwkweDAwMDAsICAgICAvKiBSMjEgIC0gQWxhcm0gSG91cnMvRGF5ICovCisJMHgwMDAwLCAgICAgLyogUjIyICAtIEFsYXJtIERhdGUvTW9udGggKi8KKwkweDAzMjAsICAgICAvKiBSMjMgIC0gUlRDIFRpbWUgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFIyNCAgLSBTeXN0ZW0gSW50ZXJydXB0cyAqLworCTB4MDAwMCwgICAgIC8qIFIyNSAgLSBJbnRlcnJ1cHQgU3RhdHVzIDEgKi8KKwkweDAwMDAsICAgICAvKiBSMjYgIC0gSW50ZXJydXB0IFN0YXR1cyAyICovCisJMHgwMDAwLCAgICAgLyogUjI3ICovCisJMHgwMDAwLCAgICAgLyogUjI4ICAtIFVuZGVyIFZvbHRhZ2UgSW50ZXJydXB0IHN0YXR1cyAqLworCTB4MDAwMCwgICAgIC8qIFIyOSAgLSBPdmVyIEN1cnJlbnQgSW50ZXJydXB0IHN0YXR1cyAqLworCTB4MDAwMCwgICAgIC8qIFIzMCAgLSBHUElPIEludGVycnVwdCBTdGF0dXMgKi8KKwkweDAwMDAsICAgICAvKiBSMzEgIC0gQ29tcGFyYXRvciBJbnRlcnJ1cHQgU3RhdHVzICovCisJMHgzRkZGLCAgICAgLyogUjMyICAtIFN5c3RlbSBJbnRlcnJ1cHRzIE1hc2sgKi8KKwkweDAwMDAsICAgICAvKiBSMzMgIC0gSW50ZXJydXB0IFN0YXR1cyAxIE1hc2sgKi8KKwkweDAwMDAsICAgICAvKiBSMzQgIC0gSW50ZXJydXB0IFN0YXR1cyAyIE1hc2sgKi8KKwkweDAwMDAsICAgICAvKiBSMzUgKi8KKwkweDAwMDAsICAgICAvKiBSMzYgIC0gVW5kZXIgVm9sdGFnZSBJbnRlcnJ1cHQgc3RhdHVzIE1hc2sgKi8KKwkweDAwMDAsICAgICAvKiBSMzcgIC0gT3ZlciBDdXJyZW50IEludGVycnVwdCBzdGF0dXMgTWFzayAqLworCTB4MDAwMCwgICAgIC8qIFIzOCAgLSBHUElPIEludGVycnVwdCBTdGF0dXMgTWFzayAqLworCTB4MDAwMCwgICAgIC8qIFIzOSAgLSBDb21wYXJhdG9yIEludGVycnVwdCBTdGF0dXMgTWFzayAqLworCTB4MDA0MCwgICAgIC8qIFI0MCAgLSBDbG9jayBDb250cm9sIDEgKi8KKwkweDAwMDAsICAgICAvKiBSNDEgIC0gQ2xvY2sgQ29udHJvbCAyICovCisJMHgzQTAwLCAgICAgLyogUjQyICAtIEZMTCBDb250cm9sIDEgKi8KKwkweDcwODYsICAgICAvKiBSNDMgIC0gRkxMIENvbnRyb2wgMiAqLworCTB4QzIyNiwgICAgIC8qIFI0NCAgLSBGTEwgQ29udHJvbCAzICovCisJMHgwMDAwLCAgICAgLyogUjQ1ICAtIEZMTCBDb250cm9sIDQgKi8KKwkweDAwMDAsICAgICAvKiBSNDYgKi8KKwkweDAwMDAsICAgICAvKiBSNDcgKi8KKwkweDAwMDAsICAgICAvKiBSNDggIC0gREFDIENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSNDkgKi8KKwkweDAwQzAsICAgICAvKiBSNTAgIC0gREFDIERpZ2l0YWwgVm9sdW1lIEwgKi8KKwkweDAwQzAsICAgICAvKiBSNTEgIC0gREFDIERpZ2l0YWwgVm9sdW1lIFIgKi8KKwkweDAwMDAsICAgICAvKiBSNTIgKi8KKwkweDAwNDAsICAgICAvKiBSNTMgIC0gREFDIExSIFJhdGUgKi8KKwkweDAwMDAsICAgICAvKiBSNTQgIC0gREFDIENsb2NrIENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSNTUgKi8KKwkweDAwMDAsICAgICAvKiBSNTYgKi8KKwkweDAwMDAsICAgICAvKiBSNTcgKi8KKwkweDQwMDAsICAgICAvKiBSNTggIC0gREFDIE11dGUgKi8KKwkweDAwMDAsICAgICAvKiBSNTkgIC0gREFDIE11dGUgVm9sdW1lICovCisJMHgwMDAwLCAgICAgLyogUjYwICAtIERBQyBTaWRlICovCisJMHgwMDAwLCAgICAgLyogUjYxICovCisJMHgwMDAwLCAgICAgLyogUjYyICovCisJMHgwMDAwLCAgICAgLyogUjYzICovCisJMHg4MDAwLCAgICAgLyogUjY0ICAtIEFEQyBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjY1ICovCisJMHgwMEMwLCAgICAgLyogUjY2ICAtIEFEQyBEaWdpdGFsIFZvbHVtZSBMICovCisJMHgwMEMwLCAgICAgLyogUjY3ICAtIEFEQyBEaWdpdGFsIFZvbHVtZSBSICovCisJMHgwMDAwLCAgICAgLyogUjY4ICAtIEFEQyBEaXZpZGVyICovCisJMHgwMDAwLCAgICAgLyogUjY5ICovCisJMHgwMDQwLCAgICAgLyogUjcwICAtIEFEQyBMUiBSYXRlICovCisJMHgwMDAwLCAgICAgLyogUjcxICovCisJMHgwMzAzLCAgICAgLyogUjcyICAtIElucHV0IENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSNzMgIC0gSU4zIElucHV0IENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSNzQgIC0gTWljIEJpYXMgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFI3NSAqLworCTB4MDAwMCwgICAgIC8qIFI3NiAgLSBPdXRwdXQgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFI3NyAgLSBKYWNrIERldGVjdCAqLworCTB4MDAwMCwgICAgIC8qIFI3OCAgLSBBbnRpIFBvcCBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjc5ICovCisJMHgwMDQwLCAgICAgLyogUjgwICAtIExlZnQgSW5wdXQgVm9sdW1lICovCisJMHgwMDQwLCAgICAgLyogUjgxICAtIFJpZ2h0IElucHV0IFZvbHVtZSAqLworCTB4MDAwMCwgICAgIC8qIFI4MiAqLworCTB4MDAwMCwgICAgIC8qIFI4MyAqLworCTB4MDAwMCwgICAgIC8qIFI4NCAqLworCTB4MDAwMCwgICAgIC8qIFI4NSAqLworCTB4MDAwMCwgICAgIC8qIFI4NiAqLworCTB4MDAwMCwgICAgIC8qIFI4NyAqLworCTB4MDgwMCwgICAgIC8qIFI4OCAgLSBMZWZ0IE1peGVyIENvbnRyb2wgKi8KKwkweDEwMDAsICAgICAvKiBSODkgIC0gUmlnaHQgTWl4ZXIgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFI5MCAqLworCTB4MDAwMCwgICAgIC8qIFI5MSAqLworCTB4MDAwMCwgICAgIC8qIFI5MiAgLSBPVVQzIE1peGVyIENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSOTMgIC0gT1VUNCBNaXhlciBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjk0ICovCisJMHgwMDAwLCAgICAgLyogUjk1ICovCisJMHgwMDAwLCAgICAgLyogUjk2ICAtIE91dHB1dCBMZWZ0IE1peGVyIFZvbHVtZSAqLworCTB4MDAwMCwgICAgIC8qIFI5NyAgLSBPdXRwdXQgUmlnaHQgTWl4ZXIgVm9sdW1lICovCisJMHgwMDAwLCAgICAgLyogUjk4ICAtIElucHV0IE1peGVyIFZvbHVtZSBMICovCisJMHgwMDAwLCAgICAgLyogUjk5ICAtIElucHV0IE1peGVyIFZvbHVtZSBSICovCisJMHgwMDAwLCAgICAgLyogUjEwMCAtIElucHV0IE1peGVyIFZvbHVtZSAqLworCTB4MDAwMCwgICAgIC8qIFIxMDEgKi8KKwkweDAwMDAsICAgICAvKiBSMTAyICovCisJMHgwMDAwLCAgICAgLyogUjEwMyAqLworCTB4MDBFNCwgICAgIC8qIFIxMDQgLSBPVVQxTCBWb2x1bWUgKi8KKwkweDAwRTQsICAgICAvKiBSMTA1IC0gT1VUMVIgVm9sdW1lICovCisJMHgwMEU0LCAgICAgLyogUjEwNiAtIE9VVDJMIFZvbHVtZSAqLworCTB4MDJFNCwgICAgIC8qIFIxMDcgLSBPVVQyUiBWb2x1bWUgKi8KKwkweDAwMDAsICAgICAvKiBSMTA4ICovCisJMHgwMDAwLCAgICAgLyogUjEwOSAqLworCTB4MDAwMCwgICAgIC8qIFIxMTAgKi8KKwkweDAwMDAsICAgICAvKiBSMTExIC0gQkVFUCBWb2x1bWUgKi8KKwkweDBBMDAsICAgICAvKiBSMTEyIC0gQUkgRm9ybWF0aW5nICovCisJMHgwMDAwLCAgICAgLyogUjExMyAtIEFEQyBEQUMgQ09NUCAqLworCTB4MDAyMCwgICAgIC8qIFIxMTQgLSBBSSBBREMgQ29udHJvbCAqLworCTB4MDAyMCwgICAgIC8qIFIxMTUgLSBBSSBEQUMgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFIxMTYgKi8KKwkweDAwMDAsICAgICAvKiBSMTE3ICovCisJMHgwMDAwLCAgICAgLyogUjExOCAqLworCTB4MDAwMCwgICAgIC8qIFIxMTkgKi8KKwkweDAwMDAsICAgICAvKiBSMTIwICovCisJMHgwMDAwLCAgICAgLyogUjEyMSAqLworCTB4MDAwMCwgICAgIC8qIFIxMjIgKi8KKwkweDAwMDAsICAgICAvKiBSMTIzICovCisJMHgwMDAwLCAgICAgLyogUjEyNCAqLworCTB4MDAwMCwgICAgIC8qIFIxMjUgKi8KKwkweDAwMDAsICAgICAvKiBSMTI2ICovCisJMHgwMDAwLCAgICAgLyogUjEyNyAqLworCTB4MUZGRiwgICAgIC8qIFIxMjggLSBHUElPIERlYm91bmNlICovCisJMHgwMDEwLCAgICAgLyogUjEyOSAtIEdQSU8gUGluIHB1bGwgdXAgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFIxMzAgLSBHUElPIFB1bGwgZG93biBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjEzMSAtIEdQSU8gSW50ZXJydXB0IE1vZGUgKi8KKwkweDAwMDAsICAgICAvKiBSMTMyICovCisJMHgwMDAwLCAgICAgLyogUjEzMyAtIEdQSU8gQ29udHJvbCAqLworCTB4MEJGQiwgICAgIC8qIFIxMzQgLSBHUElPIENvbmZpZ3VyYXRpb24gKGkvbykgKi8KKwkweDBGRkQsICAgICAvKiBSMTM1IC0gR1BJTyBQaW4gUG9sYXJpdHkgLyBUeXBlICovCisJMHgwMDAwLCAgICAgLyogUjEzNiAqLworCTB4MDAwMCwgICAgIC8qIFIxMzcgKi8KKwkweDAwMDAsICAgICAvKiBSMTM4ICovCisJMHgwMDAwLCAgICAgLyogUjEzOSAqLworCTB4MDMxMCwgICAgIC8qIFIxNDAgLSBHUElPIEZ1bmN0aW9uIFNlbGVjdCAxICovCisJMHgwMDAxLCAgICAgLyogUjE0MSAtIEdQSU8gRnVuY3Rpb24gU2VsZWN0IDIgKi8KKwkweDIzMDAsICAgICAvKiBSMTQyIC0gR1BJTyBGdW5jdGlvbiBTZWxlY3QgMyAqLworCTB4MDAwMywgICAgIC8qIFIxNDMgLSBHUElPIEZ1bmN0aW9uIFNlbGVjdCA0ICovCisJMHgwMDAwLCAgICAgLyogUjE0NCAtIERpZ2l0aXNlciBDb250cm9sICgxKSAqLworCTB4MDAwMiwgICAgIC8qIFIxNDUgLSBEaWdpdGlzZXIgQ29udHJvbCAoMikgKi8KKwkweDAwMDAsICAgICAvKiBSMTQ2ICovCisJMHgwMDAwLCAgICAgLyogUjE0NyAqLworCTB4MDAwMCwgICAgIC8qIFIxNDggKi8KKwkweDAwMDAsICAgICAvKiBSMTQ5ICovCisJMHgwMDAwLCAgICAgLyogUjE1MCAqLworCTB4MDAwMCwgICAgIC8qIFIxNTEgKi8KKwkweDcwMDAsICAgICAvKiBSMTUyIC0gQVVYMSBSZWFkYmFjayAqLworCTB4NzAwMCwgICAgIC8qIFIxNTMgLSBBVVgyIFJlYWRiYWNrICovCisJMHg3MDAwLCAgICAgLyogUjE1NCAtIEFVWDMgUmVhZGJhY2sgKi8KKwkweDcwMDAsICAgICAvKiBSMTU1IC0gQVVYNCBSZWFkYmFjayAqLworCTB4MDAwMCwgICAgIC8qIFIxNTYgLSBVU0IgVm9sdGFnZSBSZWFkYmFjayAqLworCTB4MDAwMCwgICAgIC8qIFIxNTcgLSBMSU5FIFZvbHRhZ2UgUmVhZGJhY2sgKi8KKwkweDAwMDAsICAgICAvKiBSMTU4IC0gQkFUVCBWb2x0YWdlIFJlYWRiYWNrICovCisJMHgwMDAwLCAgICAgLyogUjE1OSAtIENoaXAgVGVtcCBSZWFkYmFjayAqLworCTB4MDAwMCwgICAgIC8qIFIxNjAgKi8KKwkweDAwMDAsICAgICAvKiBSMTYxICovCisJMHgwMDAwLCAgICAgLyogUjE2MiAqLworCTB4MDAwMCwgICAgIC8qIFIxNjMgLSBHZW5lcmljIENvbXBhcmF0b3IgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFIxNjQgLSBHZW5lcmljIGNvbXBhcmF0b3IgMSAqLworCTB4MDAwMCwgICAgIC8qIFIxNjUgLSBHZW5lcmljIGNvbXBhcmF0b3IgMiAqLworCTB4MDAwMCwgICAgIC8qIFIxNjYgLSBHZW5lcmljIGNvbXBhcmF0b3IgMyAqLworCTB4MDAwMCwgICAgIC8qIFIxNjcgLSBHZW5lcmljIGNvbXBhcmF0b3IgNCAqLworCTB4QTAwRiwgICAgIC8qIFIxNjggLSBCYXR0ZXJ5IENoYXJnZXIgQ29udHJvbCAxICovCisJMHgwQjA2LCAgICAgLyogUjE2OSAtIEJhdHRlcnkgQ2hhcmdlciBDb250cm9sIDIgKi8KKwkweDAwMDAsICAgICAvKiBSMTcwIC0gQmF0dGVyeSBDaGFyZ2VyIENvbnRyb2wgMyAqLworCTB4MDAwMCwgICAgIC8qIFIxNzEgKi8KKwkweDAwMDAsICAgICAvKiBSMTcyIC0gQ3VycmVudCBTaW5rIERyaXZlciBBICovCisJMHgwMDAwLCAgICAgLyogUjE3MyAtIENTQSBGbGFzaCBjb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjE3NCAtIEN1cnJlbnQgU2luayBEcml2ZXIgQiAqLworCTB4MDAwMCwgICAgIC8qIFIxNzUgLSBDU0IgRmxhc2ggY29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFIxNzYgLSBEQ0RDL0xETyByZXF1ZXN0ZWQgKi8KKwkweDAzMkQsICAgICAvKiBSMTc3IC0gRENEQyBBY3RpdmUgb3B0aW9ucyAqLworCTB4MDAwMCwgICAgIC8qIFIxNzggLSBEQ0RDIFNsZWVwIG9wdGlvbnMgKi8KKwkweDAwMjUsICAgICAvKiBSMTc5IC0gUG93ZXItY2hlY2sgY29tcGFyYXRvciAqLworCTB4MDAwNiwgICAgIC8qIFIxODAgLSBEQ0RDMSBDb250cm9sICovCisJMHgwNDAwLCAgICAgLyogUjE4MSAtIERDREMxIFRpbWVvdXRzICovCisJMHgxMDA2LCAgICAgLyogUjE4MiAtIERDREMxIExvdyBQb3dlciAqLworCTB4MDAxOCwgICAgIC8qIFIxODMgLSBEQ0RDMiBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjE4NCAtIERDREMyIFRpbWVvdXRzICovCisJMHgwMDAwLCAgICAgLyogUjE4NSAqLworCTB4MDA1MCwgICAgIC8qIFIxODYgLSBEQ0RDMyBDb250cm9sICovCisJMHgwQzAwLCAgICAgLyogUjE4NyAtIERDREMzIFRpbWVvdXRzICovCisJMHgwMDA2LCAgICAgLyogUjE4OCAtIERDREMzIExvdyBQb3dlciAqLworCTB4MDAwRSwgICAgIC8qIFIxODkgLSBEQ0RDNCBDb250cm9sICovCisJMHgwNDAwLCAgICAgLyogUjE5MCAtIERDREM0IFRpbWVvdXRzICovCisJMHgwMDA2LCAgICAgLyogUjE5MSAtIERDREM0IExvdyBQb3dlciAqLworCTB4MDAwOCwgICAgIC8qIFIxOTIgLSBEQ0RDNSBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjE5MyAtIERDREM1IFRpbWVvdXRzICovCisJMHgwMDAwLCAgICAgLyogUjE5NCAqLworCTB4MDAyOSwgICAgIC8qIFIxOTUgLSBEQ0RDNiBDb250cm9sICovCisJMHgwODAwLCAgICAgLyogUjE5NiAtIERDREM2IFRpbWVvdXRzICovCisJMHgwMDA2LCAgICAgLyogUjE5NyAtIERDREM2IExvdyBQb3dlciAqLworCTB4MDAwMCwgICAgIC8qIFIxOTggKi8KKwkweDAwMDMsICAgICAvKiBSMTk5IC0gTGltaXQgU3dpdGNoIENvbnRyb2wgKi8KKwkweDAwMUQsICAgICAvKiBSMjAwIC0gTERPMSBDb250cm9sICovCisJMHgxMDAwLCAgICAgLyogUjIwMSAtIExETzEgVGltZW91dHMgKi8KKwkweDAwMUMsICAgICAvKiBSMjAyIC0gTERPMSBMb3cgUG93ZXIgKi8KKwkweDAwMTcsICAgICAvKiBSMjAzIC0gTERPMiBDb250cm9sICovCisJMHgxMDAwLCAgICAgLyogUjIwNCAtIExETzIgVGltZW91dHMgKi8KKwkweDAwMUMsICAgICAvKiBSMjA1IC0gTERPMiBMb3cgUG93ZXIgKi8KKwkweDAwMDYsICAgICAvKiBSMjA2IC0gTERPMyBDb250cm9sICovCisJMHgxMDAwLCAgICAgLyogUjIwNyAtIExETzMgVGltZW91dHMgKi8KKwkweDAwMUMsICAgICAvKiBSMjA4IC0gTERPMyBMb3cgUG93ZXIgKi8KKwkweDAwMTAsICAgICAvKiBSMjA5IC0gTERPNCBDb250cm9sICovCisJMHgxMDAwLCAgICAgLyogUjIxMCAtIExETzQgVGltZW91dHMgKi8KKwkweDAwMUMsICAgICAvKiBSMjExIC0gTERPNCBMb3cgUG93ZXIgKi8KKwkweDAwMDAsICAgICAvKiBSMjEyICovCisJMHgwMDAwLCAgICAgLyogUjIxMyAqLworCTB4MDAwMCwgICAgIC8qIFIyMTQgKi8KKwkweDAwMDAsICAgICAvKiBSMjE1IC0gVkNDX0ZBVUxUIE1hc2tzICovCisJMHgwMDFGLCAgICAgLyogUjIxNiAtIE1haW4gQmFuZGdhcCBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjIxNyAtIE9TQyBDb250cm9sICovCisJMHg5MDAwLCAgICAgLyogUjIxOCAtIFJUQyBUaWNrIENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSMjE5IC0gU2VjdXJpdHkxICovCisJMHg0MDAwLCAgICAgLyogUjIyMCAqLworCTB4MDAwMCwgICAgIC8qIFIyMjEgKi8KKwkweDAwMDAsICAgICAvKiBSMjIyICovCisJMHgwMDAwLCAgICAgLyogUjIyMyAqLworCTB4MDAwMCwgICAgIC8qIFIyMjQgLSBTaWduYWwgb3ZlcnJpZGVzICovCisJMHgwMDAwLCAgICAgLyogUjIyNSAtIERDREMvTERPIHN0YXR1cyAqLworCTB4MDAwMCwgICAgIC8qIFIyMjYgLSBDaGFyZ2VyIE92ZXJpZGVzL3N0YXR1cyAqLworCTB4MDAwMCwgICAgIC8qIFIyMjcgLSBtaXNjIG92ZXJyaWRlcyAqLworCTB4MDAwMCwgICAgIC8qIFIyMjggLSBTdXBwbHkgb3ZlcnJpZGVzL3N0YXR1cyAxICovCisJMHgwMDAwLCAgICAgLyogUjIyOSAtIFN1cHBseSBvdmVycmlkZXMvc3RhdHVzIDIgKi8KKwkweEUwMDAsICAgICAvKiBSMjMwIC0gR1BJTyBQaW4gU3RhdHVzICovCisJMHgwMDAwLCAgICAgLyogUjIzMSAtIGNvbXBhcm90b3Igb3ZlcnJpZGVzICovCisJMHgwMDAwLCAgICAgLyogUjIzMiAqLworCTB4MDAwMCwgICAgIC8qIFIyMzMgLSBTdGF0ZSBNYWNoaW5lIHN0YXR1cyAqLworCTB4MTIwMCwgICAgIC8qIFIyMzQgKi8KKwkweDAwMDAsICAgICAvKiBSMjM1ICovCisJMHg4MDAwLCAgICAgLyogUjIzNiAqLworCTB4MDAwMCwgICAgIC8qIFIyMzcgKi8KKwkweDAwMDAsICAgICAvKiBSMjM4ICovCisJMHgwMDAwLCAgICAgLyogUjIzOSAqLworCTB4MDAwMywgICAgIC8qIFIyNDAgKi8KKwkweDAwMDAsICAgICAvKiBSMjQxICovCisJMHgwMDAwLCAgICAgLyogUjI0MiAqLworCTB4MDAwNCwgICAgIC8qIFIyNDMgKi8KKwkweDAzMDAsICAgICAvKiBSMjQ0ICovCisJMHgwMDAwLCAgICAgLyogUjI0NSAqLworCTB4MDIwMCwgICAgIC8qIFIyNDYgKi8KKwkweDAwMDAsICAgICAvKiBSMjQ3ICovCisJMHgxMDAwLCAgICAgLyogUjI0OCAtIERDREMxIFRlc3QgQ29udHJvbHMgKi8KKwkweDUwMDAsICAgICAvKiBSMjQ5ICovCisJMHgxMDAwLCAgICAgLyogUjI1MCAtIERDREMzIFRlc3QgQ29udHJvbHMgKi8KKwkweDEwMDAsICAgICAvKiBSMjUxIC0gRENEQzQgVGVzdCBDb250cm9scyAqLworCTB4NTEwMCwgICAgIC8qIFIyNTIgKi8KKwkweDEwMDAsICAgICAvKiBSMjUzIC0gRENEQzYgVGVzdCBDb250cm9scyAqLworfTsKKyNlbmRpZgorCiAvKiBUaGUgcmVnaXN0ZXIgZGVmYXVsdHMgZm9yIHRoZSBjb25maWcgbW9kZSB1c2VkIG11c3QgYmUgY29tcGlsZWQgaW4gYnV0CiAgKiBkdWUgdG8gdGhlIGltcGFjdCBvbiBrZXJuZWwgc2l6ZSBpdCBpcyBwb3NzaWJsZSB0byBkaXNhYmxlCiAgKi8KQEAgLTEzMDcsMTQgKzM0MDMsMTQgQEAKIAl7IDB4RkYzRiwgMHhFMDNGLCAweDAwMDAgfSwgLyogUjIxNiAtIE1haW4gQmFuZGdhcCBDb250cm9sICovCiAJeyAweEVGMkYsIDB4RTAyRiwgMHgwMDAwIH0sIC8qIFIyMTcgLSBPU0MgQ29udHJvbCAqLwogCXsgMHhGM0ZGLCAweEIzRkYsIDB4YzAwMCB9LCAvKiBSMjE4IC0gUlRDIFRpY2sgQ29udHJvbCAqLwotCXsgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiB9LCAvKiBSMjE5ICovCisJeyAweEZGRkYsIDB4RkZGRiwgMHgwMDAwIH0sIC8qIFIyMTkgLSBTZWN1cml0eSAqLwogCXsgMHgwOUZGLCAweDAxRkYsIDB4MDAwMCB9LCAvKiBSMjIwIC0gUkFNIEJJU1QgMSAqLwogCXsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMjIxICovCiAJeyAweEZGRkYsIDB4RkZGRiwgMHhGRkZGIH0sIC8qIFIyMjIgKi8KIAl7IDB4RkZGRiwgMHhGRkZGLCAweEZGRkYgfSwgLyogUjIyMyAqLwogCXsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMjI0ICovCiAJeyAweDhGM0YsIDB4MDAwMCwgMHhGRkZGIH0sIC8qIFIyMjUgLSBEQ0RDL0xETyBzdGF0dXMgKi8KLQl7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLyogUjIyNiAqLworCXsgMHgwMDAwLCAweDAwMDAsIDB4RkZGRiB9LCAvKiBSMjI2IC0gQ2hhcmdlciBzdGF0dXMgKi8KIAl7IDB4MDAwMCwgMHgwMDAwLCAweEZGRkYgfSwgLyogUjIyNyAqLwogCXsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMjI4ICovCiAJeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIyMjkgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL3dtODQwMC1jb3JlLmMgYi9kcml2ZXJzL21mZC93bTg0MDAtY29yZS5jCmluZGV4IDZhMGNlZGIuLmNmMzBkMDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWZkL3dtODQwMC1jb3JlLmMKKysrIGIvZHJpdmVycy9tZmQvd204NDAwLWNvcmUuYwpAQCAtMTUsNiArMTUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2J1Zy5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC9jb3JlLmg+CiAjaW5jbHVkZSA8bGludXgvbWZkL3dtODQwMC1wcml2YXRlLmg+CiAjaW5jbHVkZSA8bGludXgvbWZkL3dtODQwMC1hdWRpby5oPgogCkBAIC0yMzksNiArMjQwLDE2IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTCh3bTg0MDBfcmVzZXRfY29kZWNfcmVnX2NhY2hlKTsKIAorc3RhdGljIGludCB3bTg0MDBfcmVnaXN0ZXJfY29kZWMoc3RydWN0IHdtODQwMCAqd204NDAwKQoreworCXN0cnVjdCBtZmRfY2VsbCBjZWxsID0geworCQkubmFtZSA9ICJ3bTg0MDAtY29kZWMiLAorCQkuZHJpdmVyX2RhdGEgPSB3bTg0MDAsCisJfTsKKworCXJldHVybiBtZmRfYWRkX2RldmljZXMod204NDAwLT5kZXYsIC0xLCAmY2VsbCwgMSwgTlVMTCwgMCk7Cit9CisKIC8qCiAgKiB3bTg0MDBfaW5pdCAtIEdlbmVyaWMgaW5pdGlhbGlzYXRpb24KICAqCkBAIC0yOTYsMjQgKzMwNywzMiBAQAogCXJlZyA9IChyZWcgJiBXTTg0MDBfQ0hJUF9SRVZfTUFTSykgPj4gV004NDAwX0NISVBfUkVWX1NISUZUOwogCWRldl9pbmZvKHdtODQwMC0+ZGV2LCAiV004NDAwIHJldmlzaW9uICV4XG4iLCByZWcpOwogCisJcmV0ID0gd204NDAwX3JlZ2lzdGVyX2NvZGVjKHdtODQwMCk7CisJaWYgKHJldCAhPSAwKSB7CisJCWRldl9lcnIod204NDAwLT5kZXYsICJGYWlsZWQgdG8gcmVnaXN0ZXIgY29kZWNcbiIpOworCQlnb3RvIGVycl9jaGlsZHJlbjsKKwl9CisKIAlpZiAocGRhdGEgJiYgcGRhdGEtPnBsYXRmb3JtX2luaXQpIHsKIAkJcmV0ID0gcGRhdGEtPnBsYXRmb3JtX2luaXQod204NDAwLT5kZXYpOwotCQlpZiAocmV0ICE9IDApCisJCWlmIChyZXQgIT0gMCkgewogCQkJZGV2X2Vycih3bTg0MDAtPmRldiwgIlBsYXRmb3JtIGluaXQgZmFpbGVkOiAlZFxuIiwKIAkJCQlyZXQpOworCQkJZ290byBlcnJfY2hpbGRyZW47CisJCX0KIAl9IGVsc2UKIAkJZGV2X3dhcm4od204NDAwLT5kZXYsICJObyBwbGF0Zm9ybSBpbml0aWFsaXNhdGlvbiBzdXBwbGllZFxuIik7CiAKKwlyZXR1cm4gMDsKKworZXJyX2NoaWxkcmVuOgorCW1mZF9yZW1vdmVfZGV2aWNlcyh3bTg0MDAtPmRldik7CiAJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIHZvaWQgd204NDAwX3JlbGVhc2Uoc3RydWN0IHdtODQwMCAqd204NDAwKQogewotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUod204NDAwLT5yZWd1bGF0b3JzKTsgaSsrKQotCQlpZiAod204NDAwLT5yZWd1bGF0b3JzW2ldLm5hbWUpCi0JCQlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3Rlcigmd204NDAwLT5yZWd1bGF0b3JzW2ldKTsKKwltZmRfcmVtb3ZlX2RldmljZXMod204NDAwLT5kZXYpOwogfQogCiAjaWYgZGVmaW5lZChDT05GSUdfSTJDKSB8fCBkZWZpbmVkKENPTkZJR19JMkNfTU9EVUxFKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL0tjb25maWcgYi9kcml2ZXJzL21pc2MvS2NvbmZpZwppbmRleCBmZWU3MzA0Li4zOTQ5YTFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvS2NvbmZpZworKysgYi9kcml2ZXJzL21pc2MvS2NvbmZpZwpAQCAtNDk4LDYgKzQ5OCwxOCBAQAogCVRoaXMgb3B0aW9uIGVuYWJsZXMgYWRkaXRpb24gZGVidWdnaW5nIGNvZGUgZm9yIHRoZSBTR0kgR1JVIGRyaXZlci4gSWYKIAl5b3UgYXJlIHVuc3VyZSwgc2F5IE4uCiAKK2NvbmZpZyBERUxMX0xBUFRPUAorCXRyaXN0YXRlICJEZWxsIExhcHRvcCBFeHRyYXMgKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBYODYKKwlkZXBlbmRzIG9uIERDREJBUworCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMCisJZGVwZW5kcyBvbiBCQUNLTElHSFRfQ0xBU1NfREVWSUNFCisJZGVwZW5kcyBvbiBSRktJTEwKKwlkZWZhdWx0IG4KKwktLS1oZWxwLS0tCisJVGhpcyBkcml2ZXIgYWRkcyBzdXBwb3J0IGZvciByZmtpbGwgYW5kIGJhY2tsaWdodCBjb250cm9sIHRvIERlbGwKKwlsYXB0b3BzLgorCiBzb3VyY2UgImRyaXZlcnMvbWlzYy9jMnBvcnQvS2NvbmZpZyIKIAogZW5kaWYgIyBNSVNDX0RFVklDRVMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9NYWtlZmlsZSBiL2RyaXZlcnMvbWlzYy9NYWtlZmlsZQppbmRleCA4MTdmN2Y1Li41ZGU4NjNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9taXNjL01ha2VmaWxlCkBAIC0xOCw2ICsxOCw3IEBACiBvYmotJChDT05GSUdfVEMxMTAwX1dNSSkJKz0gdGMxMTAwLXdtaS5vCiBvYmotJChDT05GSUdfTEtEVE0pCQkrPSBsa2R0bS5vCiBvYmotJChDT05GSUdfVElGTV9DT1JFKSAgICAgICAJKz0gdGlmbV9jb3JlLm8KK29iai0kKENPTkZJR19ERUxMX0xBUFRPUCkJKz0gZGVsbC1sYXB0b3Aubwogb2JqLSQoQ09ORklHX1RJRk1fN1hYMSkgICAgICAgCSs9IHRpZm1fN3h4MS5vCiBvYmotJChDT05GSUdfUEhBTlRPTSkJCSs9IHBoYW50b20ubwogb2JqLSQoQ09ORklHX1NHSV9JT0M0KQkJKz0gaW9jNC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvZGVsbC1sYXB0b3AuYyBiL2RyaXZlcnMvbWlzYy9kZWxsLWxhcHRvcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkMzNhMjAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21pc2MvZGVsbC1sYXB0b3AuYwpAQCAtMCwwICsxLDQzNiBAQAorLyoKKyAqICBEcml2ZXIgZm9yIERlbGwgbGFwdG9wIGV4dHJhcworICoKKyAqICBDb3B5cmlnaHQgKGMpIFJlZCBIYXQgPG1qZ0ByZWRoYXQuY29tPgorICoKKyAqICBCYXNlZCBvbiBkb2N1bWVudGF0aW9uIGluIHRoZSBsaWJzbWJpb3MgcGFja2FnZSwgQ29weXJpZ2h0IChDKSAyMDA1IERlbGwKKyAqICBJbmMuCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2JhY2tsaWdodC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2RtaS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvcmZraWxsLmg+CisjaW5jbHVkZSA8bGludXgvcG93ZXJfc3VwcGx5Lmg+CisjaW5jbHVkZSA8bGludXgvYWNwaS5oPgorI2luY2x1ZGUgIi4uL2Zpcm13YXJlL2RjZGJhcy5oIgorCisjZGVmaW5lIEJSSUdIVE5FU1NfVE9LRU4gMHg3ZAorCisvKiBUaGlzIHN0cnVjdHVyZSB3aWxsIGJlIG1vZGlmaWVkIGJ5IHRoZSBmaXJtd2FyZSB3aGVuIHdlIGVudGVyCisgKiBzeXN0ZW0gbWFuYWdlbWVudCBtb2RlLCBoZW5jZSB0aGUgdm9sYXRpbGVzICovCisKK3N0cnVjdCBjYWxsaW5nX2ludGVyZmFjZV9idWZmZXIgeworCXUxNiBjbGFzczsKKwl1MTYgc2VsZWN0OworCXZvbGF0aWxlIHUzMiBpbnB1dFs0XTsKKwl2b2xhdGlsZSB1MzIgb3V0cHV0WzRdOworfSBfX3BhY2tlZDsKKworc3RydWN0IGNhbGxpbmdfaW50ZXJmYWNlX3Rva2VuIHsKKwl1MTYgdG9rZW5JRDsKKwl1MTYgbG9jYXRpb247CisJdW5pb24geworCQl1MTYgdmFsdWU7CisJCXUxNiBzdHJpbmdsZW5ndGg7CisJfTsKK307CisKK3N0cnVjdCBjYWxsaW5nX2ludGVyZmFjZV9zdHJ1Y3R1cmUgeworCXN0cnVjdCBkbWlfaGVhZGVyIGhlYWRlcjsKKwl1MTYgY21kSU9BZGRyZXNzOworCXU4IGNtZElPQ29kZTsKKwl1MzIgc3VwcG9ydGVkQ21kczsKKwlzdHJ1Y3QgY2FsbGluZ19pbnRlcmZhY2VfdG9rZW4gdG9rZW5zW107Cit9IF9fcGFja2VkOworCitzdGF0aWMgaW50IGRhX2NvbW1hbmRfYWRkcmVzczsKK3N0YXRpYyBpbnQgZGFfY29tbWFuZF9jb2RlOworc3RhdGljIGludCBkYV9udW1fdG9rZW5zOworc3RhdGljIHN0cnVjdCBjYWxsaW5nX2ludGVyZmFjZV90b2tlbiAqZGFfdG9rZW5zOworCitzdGF0aWMgc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmRlbGxfYmFja2xpZ2h0X2RldmljZTsKK3N0YXRpYyBzdHJ1Y3QgcmZraWxsICp3aWZpX3Jma2lsbDsKK3N0YXRpYyBzdHJ1Y3QgcmZraWxsICpibHVldG9vdGhfcmZraWxsOworc3RhdGljIHN0cnVjdCByZmtpbGwgKnd3YW5fcmZraWxsOworCitzdGF0aWMgY29uc3Qgc3RydWN0IGRtaV9zeXN0ZW1faWQgX19pbml0ZGF0YSBkZWxsX2RldmljZV90YWJsZVtdID0geworCXsKKwkJLmlkZW50ID0gIkRlbGwgbGFwdG9wIiwKKwkJLm1hdGNoZXMgPSB7CisJCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJEZWxsIEluYy4iKSwKKwkJCURNSV9NQVRDSChETUlfQ0hBU1NJU19UWVBFLCAiOCIpLAorCQl9LAorCX0sCisJeyB9Cit9OworCitzdGF0aWMgdm9pZCBwYXJzZV9kYV90YWJsZShjb25zdCBzdHJ1Y3QgZG1pX2hlYWRlciAqZG0pCit7CisJLyogRmluYWwgdG9rZW4gaXMgYSB0ZXJtaW5hdG9yLCBzbyB3ZSBkb24ndCB3YW50IHRvIGNvcHkgaXQgKi8KKwlpbnQgdG9rZW5zID0gKGRtLT5sZW5ndGgtMTEpL3NpemVvZihzdHJ1Y3QgY2FsbGluZ19pbnRlcmZhY2VfdG9rZW4pLTE7CisJc3RydWN0IGNhbGxpbmdfaW50ZXJmYWNlX3N0cnVjdHVyZSAqdGFibGUgPQorCQljb250YWluZXJfb2YoZG0sIHN0cnVjdCBjYWxsaW5nX2ludGVyZmFjZV9zdHJ1Y3R1cmUsIGhlYWRlcik7CisKKwkvKiA0IGJ5dGVzIG9mIHRhYmxlIGhlYWRlciwgcGx1cyA3IGJ5dGVzIG9mIERlbGwgaGVhZGVyLCBwbHVzIGF0IGxlYXN0CisJICAgNiBieXRlcyBvZiBlbnRyeSAqLworCisJaWYgKGRtLT5sZW5ndGggPCAxNykKKwkJcmV0dXJuOworCisJZGFfY29tbWFuZF9hZGRyZXNzID0gdGFibGUtPmNtZElPQWRkcmVzczsKKwlkYV9jb21tYW5kX2NvZGUgPSB0YWJsZS0+Y21kSU9Db2RlOworCisJZGFfdG9rZW5zID0ga3JlYWxsb2MoZGFfdG9rZW5zLCAoZGFfbnVtX3Rva2VucyArIHRva2VucykgKgorCQkJICAgICBzaXplb2Yoc3RydWN0IGNhbGxpbmdfaW50ZXJmYWNlX3Rva2VuKSwKKwkJCSAgICAgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIWRhX3Rva2VucykKKwkJcmV0dXJuOworCisJbWVtY3B5KGRhX3Rva2VucytkYV9udW1fdG9rZW5zLCB0YWJsZS0+dG9rZW5zLAorCSAgICAgICBzaXplb2Yoc3RydWN0IGNhbGxpbmdfaW50ZXJmYWNlX3Rva2VuKSAqIHRva2Vucyk7CisKKwlkYV9udW1fdG9rZW5zICs9IHRva2VuczsKK30KKworc3RhdGljIHZvaWQgZmluZF90b2tlbnMoY29uc3Qgc3RydWN0IGRtaV9oZWFkZXIgKmRtKQoreworCXN3aXRjaCAoZG0tPnR5cGUpIHsKKwljYXNlIDB4ZDQ6IC8qIEluZGV4ZWQgSU8gKi8KKwkJYnJlYWs7CisJY2FzZSAweGQ1OiAvKiBQcm90ZWN0ZWQgQXJlYSBUeXBlIDEgKi8KKwkJYnJlYWs7CisJY2FzZSAweGQ2OiAvKiBQcm90ZWN0ZWQgQXJlYSBUeXBlIDIgKi8KKwkJYnJlYWs7CisJY2FzZSAweGRhOiAvKiBDYWxsaW5nIGludGVyZmFjZSAqLworCQlwYXJzZV9kYV90YWJsZShkbSk7CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIGludCBmaW5kX3Rva2VuX2xvY2F0aW9uKGludCB0b2tlbmlkKQoreworCWludCBpOworCWZvciAoaSA9IDA7IGkgPCBkYV9udW1fdG9rZW5zOyBpKyspIHsKKwkJaWYgKGRhX3Rva2Vuc1tpXS50b2tlbklEID09IHRva2VuaWQpCisJCQlyZXR1cm4gZGFfdG9rZW5zW2ldLmxvY2F0aW9uOworCX0KKworCXJldHVybiAtMTsKK30KKworc3RhdGljIHN0cnVjdCBjYWxsaW5nX2ludGVyZmFjZV9idWZmZXIgKgorZGVsbF9zZW5kX3JlcXVlc3Qoc3RydWN0IGNhbGxpbmdfaW50ZXJmYWNlX2J1ZmZlciAqYnVmZmVyLCBpbnQgY2xhc3MsCisJCSAgaW50IHNlbGVjdCkKK3sKKwlzdHJ1Y3Qgc21pX2NtZCBjb21tYW5kOworCisJY29tbWFuZC5tYWdpYyA9IFNNSV9DTURfTUFHSUM7CisJY29tbWFuZC5jb21tYW5kX2FkZHJlc3MgPSBkYV9jb21tYW5kX2FkZHJlc3M7CisJY29tbWFuZC5jb21tYW5kX2NvZGUgPSBkYV9jb21tYW5kX2NvZGU7CisJY29tbWFuZC5lYnggPSB2aXJ0X3RvX3BoeXMoYnVmZmVyKTsKKwljb21tYW5kLmVjeCA9IDB4NDI1MzQ5MzE7CisKKwlidWZmZXItPmNsYXNzID0gY2xhc3M7CisJYnVmZmVyLT5zZWxlY3QgPSBzZWxlY3Q7CisKKwlkY2RiYXNfc21pX3JlcXVlc3QoJmNvbW1hbmQpOworCisJcmV0dXJuIGJ1ZmZlcjsKK30KKworLyogRGVyaXZlZCBmcm9tIGluZm9ybWF0aW9uIGluIERlbGxXaXJlbGVzc0N0bC5jcHA6CisgICBDbGFzcyAxNywgc2VsZWN0IDExIGlzIHJhZGlvIGNvbnRyb2wuIEl0IHJldHVybnMgYW4gYXJyYXkgb2YgMzItYml0IHZhbHVlcy4KKworICAgcmVzdWx0WzBdOiByZXR1cm4gY29kZQorICAgcmVzdWx0WzFdOgorICAgICBCaXQgMDogICAgICBIYXJkd2FyZSBzd2l0Y2ggc3VwcG9ydGVkCisgICAgIEJpdCAxOiAgICAgIFdpZmkgbG9jYXRvciBzdXBwb3J0ZWQKKyAgICAgQml0IDI6ICAgICAgV2lmaSBpcyBzdXBwb3J0ZWQKKyAgICAgQml0IDM6ICAgICAgQmx1ZXRvb3RoIGlzIHN1cHBvcnRlZAorICAgICBCaXQgNDogICAgICBXV0FOIGlzIHN1cHBvcnRlZAorICAgICBCaXQgNTogICAgICBXaXJlbGVzcyBrZXlib2FyZCBzdXBwb3J0ZWQKKyAgICAgQml0cyA2LTc6ICAgUmVzZXJ2ZWQKKyAgICAgQml0IDg6ICAgICAgV2lmaSBpcyBpbnN0YWxsZWQKKyAgICAgQml0IDk6ICAgICAgQmx1ZXRvb3RoIGlzIGluc3RhbGxlZAorICAgICBCaXQgMTA6ICAgICBXV0FOIGlzIGluc3RhbGxlZAorICAgICBCaXRzIDExLTE1OiBSZXNlcnZlZAorICAgICBCaXQgMTY6ICAgICBIYXJkd2FyZSBzd2l0Y2ggaXMgb24KKyAgICAgQml0IDE3OiAgICAgV2lmaSBpcyBibG9ja2VkCisgICAgIEJpdCAxODogICAgIEJsdWV0b290aCBpcyBibG9ja2VkCisgICAgIEJpdCAxOTogICAgIFdXQU4gaXMgYmxvY2tlZAorICAgICBCaXRzIDIwLTMxOiBSZXNlcnZlZAorICAgcmVzdWx0WzJdOiBOVlJBTSBzaXplIGluIGJ5dGVzCisgICByZXN1bHRbM106IE5WUkFNIGZvcm1hdCB2ZXJzaW9uIG51bWJlcgorKi8KKworc3RhdGljIGludCBkZWxsX3Jma2lsbF9zZXQoaW50IHJhZGlvLCBlbnVtIHJma2lsbF9zdGF0ZSBzdGF0ZSkKK3sKKwlzdHJ1Y3QgY2FsbGluZ19pbnRlcmZhY2VfYnVmZmVyIGJ1ZmZlcjsKKwlpbnQgZGlzYWJsZSA9IChzdGF0ZSA9PSBSRktJTExfU1RBVEVfVU5CTE9DS0VEKSA/IDAgOiAxOworCisJbWVtc2V0KCZidWZmZXIsIDAsIHNpemVvZihzdHJ1Y3QgY2FsbGluZ19pbnRlcmZhY2VfYnVmZmVyKSk7CisJYnVmZmVyLmlucHV0WzBdID0gKDEgfCAocmFkaW88PDgpIHwgKGRpc2FibGUgPDwgMTYpKTsKKwlkZWxsX3NlbmRfcmVxdWVzdCgmYnVmZmVyLCAxNywgMTEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGVsbF93aWZpX3NldCh2b2lkICpkYXRhLCBlbnVtIHJma2lsbF9zdGF0ZSBzdGF0ZSkKK3sKKwlyZXR1cm4gZGVsbF9yZmtpbGxfc2V0KDEsIHN0YXRlKTsKK30KKworc3RhdGljIGludCBkZWxsX2JsdWV0b290aF9zZXQodm9pZCAqZGF0YSwgZW51bSByZmtpbGxfc3RhdGUgc3RhdGUpCit7CisJcmV0dXJuIGRlbGxfcmZraWxsX3NldCgyLCBzdGF0ZSk7Cit9CisKK3N0YXRpYyBpbnQgZGVsbF93d2FuX3NldCh2b2lkICpkYXRhLCBlbnVtIHJma2lsbF9zdGF0ZSBzdGF0ZSkKK3sKKwlyZXR1cm4gZGVsbF9yZmtpbGxfc2V0KDMsIHN0YXRlKTsKK30KKworc3RhdGljIGludCBkZWxsX3Jma2lsbF9nZXQoaW50IGJpdCwgZW51bSByZmtpbGxfc3RhdGUgKnN0YXRlKQoreworCXN0cnVjdCBjYWxsaW5nX2ludGVyZmFjZV9idWZmZXIgYnVmZmVyOworCWludCBzdGF0dXM7CisJaW50IG5ld19zdGF0ZSA9IFJGS0lMTF9TVEFURV9IQVJEX0JMT0NLRUQ7CisKKwltZW1zZXQoJmJ1ZmZlciwgMCwgc2l6ZW9mKHN0cnVjdCBjYWxsaW5nX2ludGVyZmFjZV9idWZmZXIpKTsKKwlkZWxsX3NlbmRfcmVxdWVzdCgmYnVmZmVyLCAxNywgMTEpOworCXN0YXR1cyA9IGJ1ZmZlci5vdXRwdXRbMV07CisKKwlpZiAoc3RhdHVzICYgKDE8PDE2KSkKKwkJbmV3X3N0YXRlID0gUkZLSUxMX1NUQVRFX1NPRlRfQkxPQ0tFRDsKKworCWlmIChzdGF0dXMgJiAoMTw8Yml0KSkKKwkJKnN0YXRlID0gbmV3X3N0YXRlOworCWVsc2UKKwkJKnN0YXRlID0gUkZLSUxMX1NUQVRFX1VOQkxPQ0tFRDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRlbGxfd2lmaV9nZXQodm9pZCAqZGF0YSwgZW51bSByZmtpbGxfc3RhdGUgKnN0YXRlKQoreworCXJldHVybiBkZWxsX3Jma2lsbF9nZXQoMTcsIHN0YXRlKTsKK30KKworc3RhdGljIGludCBkZWxsX2JsdWV0b290aF9nZXQodm9pZCAqZGF0YSwgZW51bSByZmtpbGxfc3RhdGUgKnN0YXRlKQoreworCXJldHVybiBkZWxsX3Jma2lsbF9nZXQoMTgsIHN0YXRlKTsKK30KKworc3RhdGljIGludCBkZWxsX3d3YW5fZ2V0KHZvaWQgKmRhdGEsIGVudW0gcmZraWxsX3N0YXRlICpzdGF0ZSkKK3sKKwlyZXR1cm4gZGVsbF9yZmtpbGxfZ2V0KDE5LCBzdGF0ZSk7Cit9CisKK3N0YXRpYyBpbnQgZGVsbF9zZXR1cF9yZmtpbGwodm9pZCkKK3sKKwlzdHJ1Y3QgY2FsbGluZ19pbnRlcmZhY2VfYnVmZmVyIGJ1ZmZlcjsKKwlpbnQgc3RhdHVzOworCWludCByZXQ7CisKKwltZW1zZXQoJmJ1ZmZlciwgMCwgc2l6ZW9mKHN0cnVjdCBjYWxsaW5nX2ludGVyZmFjZV9idWZmZXIpKTsKKwlkZWxsX3NlbmRfcmVxdWVzdCgmYnVmZmVyLCAxNywgMTEpOworCXN0YXR1cyA9IGJ1ZmZlci5vdXRwdXRbMV07CisKKwlpZiAoKHN0YXR1cyAmICgxPDwyfDE8PDgpKSA9PSAoMTw8MnwxPDw4KSkgeworCQl3aWZpX3Jma2lsbCA9IHJma2lsbF9hbGxvY2F0ZShOVUxMLCBSRktJTExfVFlQRV9XTEFOKTsKKwkJaWYgKCF3aWZpX3Jma2lsbCkKKwkJCWdvdG8gZXJyX3dpZmk7CisJCXdpZmlfcmZraWxsLT5uYW1lID0gImRlbGwtd2lmaSI7CisJCXdpZmlfcmZraWxsLT50b2dnbGVfcmFkaW8gPSBkZWxsX3dpZmlfc2V0OworCQl3aWZpX3Jma2lsbC0+Z2V0X3N0YXRlID0gZGVsbF93aWZpX2dldDsKKwkJcmV0ID0gcmZraWxsX3JlZ2lzdGVyKHdpZmlfcmZraWxsKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyX3dpZmk7CisJfQorCisJaWYgKChzdGF0dXMgJiAoMTw8M3wxPDw5KSkgPT0gKDE8PDN8MTw8OSkpIHsKKwkJYmx1ZXRvb3RoX3Jma2lsbCA9IHJma2lsbF9hbGxvY2F0ZShOVUxMLCBSRktJTExfVFlQRV9CTFVFVE9PVEgpOworCQlpZiAoIWJsdWV0b290aF9yZmtpbGwpCisJCQlnb3RvIGVycl9ibHVldG9vdGg7CisJCWJsdWV0b290aF9yZmtpbGwtPm5hbWUgPSAiZGVsbC1ibHVldG9vdGgiOworCQlibHVldG9vdGhfcmZraWxsLT50b2dnbGVfcmFkaW8gPSBkZWxsX2JsdWV0b290aF9zZXQ7CisJCWJsdWV0b290aF9yZmtpbGwtPmdldF9zdGF0ZSA9IGRlbGxfYmx1ZXRvb3RoX2dldDsKKwkJcmV0ID0gcmZraWxsX3JlZ2lzdGVyKGJsdWV0b290aF9yZmtpbGwpOworCQlpZiAocmV0KQorCQkJZ290byBlcnJfYmx1ZXRvb3RoOworCX0KKworCWlmICgoc3RhdHVzICYgKDE8PDR8MTw8MTApKSA9PSAoMTw8NHwxPDwxMCkpIHsKKwkJd3dhbl9yZmtpbGwgPSByZmtpbGxfYWxsb2NhdGUoTlVMTCwgUkZLSUxMX1RZUEVfV1dBTik7CisJCWlmICghd3dhbl9yZmtpbGwpCisJCQlnb3RvIGVycl93d2FuOworCQl3d2FuX3Jma2lsbC0+bmFtZSA9ICJkZWxsLXd3YW4iOworCQl3d2FuX3Jma2lsbC0+dG9nZ2xlX3JhZGlvID0gZGVsbF93d2FuX3NldDsKKwkJd3dhbl9yZmtpbGwtPmdldF9zdGF0ZSA9IGRlbGxfd3dhbl9nZXQ7CisJCXJldCA9IHJma2lsbF9yZWdpc3Rlcih3d2FuX3Jma2lsbCk7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycl93d2FuOworCX0KKworCXJldHVybiAwOworZXJyX3d3YW46CisJaWYgKHd3YW5fcmZraWxsKQorCQlyZmtpbGxfZnJlZSh3d2FuX3Jma2lsbCk7CisJaWYgKGJsdWV0b290aF9yZmtpbGwpIHsKKwkJcmZraWxsX3VucmVnaXN0ZXIoYmx1ZXRvb3RoX3Jma2lsbCk7CisJCWJsdWV0b290aF9yZmtpbGwgPSBOVUxMOworCX0KK2Vycl9ibHVldG9vdGg6CisJaWYgKGJsdWV0b290aF9yZmtpbGwpCisJCXJma2lsbF9mcmVlKGJsdWV0b290aF9yZmtpbGwpOworCWlmICh3aWZpX3Jma2lsbCkgeworCQlyZmtpbGxfdW5yZWdpc3Rlcih3aWZpX3Jma2lsbCk7CisJCXdpZmlfcmZraWxsID0gTlVMTDsKKwl9CitlcnJfd2lmaToKKwlpZiAod2lmaV9yZmtpbGwpCisJCXJma2lsbF9mcmVlKHdpZmlfcmZraWxsKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZGVsbF9zZW5kX2ludGVuc2l0eShzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYmQpCit7CisJc3RydWN0IGNhbGxpbmdfaW50ZXJmYWNlX2J1ZmZlciBidWZmZXI7CisKKwltZW1zZXQoJmJ1ZmZlciwgMCwgc2l6ZW9mKHN0cnVjdCBjYWxsaW5nX2ludGVyZmFjZV9idWZmZXIpKTsKKwlidWZmZXIuaW5wdXRbMF0gPSBmaW5kX3Rva2VuX2xvY2F0aW9uKEJSSUdIVE5FU1NfVE9LRU4pOworCWJ1ZmZlci5pbnB1dFsxXSA9IGJkLT5wcm9wcy5icmlnaHRuZXNzOworCisJaWYgKGJ1ZmZlci5pbnB1dFswXSA9PSAtMSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAocG93ZXJfc3VwcGx5X2lzX3N5c3RlbV9zdXBwbGllZCgpID4gMCkKKwkJZGVsbF9zZW5kX3JlcXVlc3QoJmJ1ZmZlciwgMSwgMik7CisJZWxzZQorCQlkZWxsX3NlbmRfcmVxdWVzdCgmYnVmZmVyLCAxLCAxKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRlbGxfZ2V0X2ludGVuc2l0eShzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYmQpCit7CisJc3RydWN0IGNhbGxpbmdfaW50ZXJmYWNlX2J1ZmZlciBidWZmZXI7CisKKwltZW1zZXQoJmJ1ZmZlciwgMCwgc2l6ZW9mKHN0cnVjdCBjYWxsaW5nX2ludGVyZmFjZV9idWZmZXIpKTsKKwlidWZmZXIuaW5wdXRbMF0gPSBmaW5kX3Rva2VuX2xvY2F0aW9uKEJSSUdIVE5FU1NfVE9LRU4pOworCisJaWYgKGJ1ZmZlci5pbnB1dFswXSA9PSAtMSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAocG93ZXJfc3VwcGx5X2lzX3N5c3RlbV9zdXBwbGllZCgpID4gMCkKKwkJZGVsbF9zZW5kX3JlcXVlc3QoJmJ1ZmZlciwgMCwgMik7CisJZWxzZQorCQlkZWxsX3NlbmRfcmVxdWVzdCgmYnVmZmVyLCAwLCAxKTsKKworCXJldHVybiBidWZmZXIub3V0cHV0WzFdOworfQorCitzdGF0aWMgc3RydWN0IGJhY2tsaWdodF9vcHMgZGVsbF9vcHMgPSB7CisJLmdldF9icmlnaHRuZXNzID0gZGVsbF9nZXRfaW50ZW5zaXR5LAorCS51cGRhdGVfc3RhdHVzICA9IGRlbGxfc2VuZF9pbnRlbnNpdHksCit9OworCitzdGF0aWMgaW50IF9faW5pdCBkZWxsX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgY2FsbGluZ19pbnRlcmZhY2VfYnVmZmVyIGJ1ZmZlcjsKKwlpbnQgbWF4X2ludGVuc2l0eSA9IDA7CisJaW50IHJldDsKKworCWlmICghZG1pX2NoZWNrX3N5c3RlbShkZWxsX2RldmljZV90YWJsZSkpCisJCXJldHVybiAtRU5PREVWOworCisJZG1pX3dhbGsoZmluZF90b2tlbnMpOworCisJaWYgKCFkYV90b2tlbnMpICB7CisJCXByaW50ayhLRVJOX0lORk8gImRlbGwtbGFwdG9wOiBVbmFibGUgdG8gZmluZCBkbWkgdG9rZW5zXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJcmV0ID0gZGVsbF9zZXR1cF9yZmtpbGwoKTsKKworCWlmIChyZXQpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiZGVsbC1sYXB0b3A6IFVuYWJsZSB0byBzZXR1cCByZmtpbGxcbiIpOworCQlnb3RvIG91dDsKKwl9CisKKyNpZmRlZiBDT05GSUdfQUNQSQorCS8qIEluIHRoZSBldmVudCBvZiBhbiBBQ1BJIGJhY2tsaWdodCBiZWluZyBhdmFpbGFibGUsIGRvbid0CisJICogcmVnaXN0ZXIgdGhlIHBsYXRmb3JtIGNvbnRyb2xsZXIuCisJICovCisJaWYgKGFjcGlfdmlkZW9fYmFja2xpZ2h0X3N1cHBvcnQoKSkKKwkJcmV0dXJuIDA7CisjZW5kaWYKKworCW1lbXNldCgmYnVmZmVyLCAwLCBzaXplb2Yoc3RydWN0IGNhbGxpbmdfaW50ZXJmYWNlX2J1ZmZlcikpOworCWJ1ZmZlci5pbnB1dFswXSA9IGZpbmRfdG9rZW5fbG9jYXRpb24oQlJJR0hUTkVTU19UT0tFTik7CisKKwlpZiAoYnVmZmVyLmlucHV0WzBdICE9IC0xKSB7CisJCWRlbGxfc2VuZF9yZXF1ZXN0KCZidWZmZXIsIDAsIDIpOworCQltYXhfaW50ZW5zaXR5ID0gYnVmZmVyLm91dHB1dFszXTsKKwl9CisKKwlpZiAobWF4X2ludGVuc2l0eSkgeworCQlkZWxsX2JhY2tsaWdodF9kZXZpY2UgPSBiYWNrbGlnaHRfZGV2aWNlX3JlZ2lzdGVyKAorCQkJImRlbGxfYmFja2xpZ2h0IiwKKwkJCU5VTEwsIE5VTEwsCisJCQkmZGVsbF9vcHMpOworCisJCWlmIChJU19FUlIoZGVsbF9iYWNrbGlnaHRfZGV2aWNlKSkgeworCQkJcmV0ID0gUFRSX0VSUihkZWxsX2JhY2tsaWdodF9kZXZpY2UpOworCQkJZGVsbF9iYWNrbGlnaHRfZGV2aWNlID0gTlVMTDsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJZGVsbF9iYWNrbGlnaHRfZGV2aWNlLT5wcm9wcy5tYXhfYnJpZ2h0bmVzcyA9IG1heF9pbnRlbnNpdHk7CisJCWRlbGxfYmFja2xpZ2h0X2RldmljZS0+cHJvcHMuYnJpZ2h0bmVzcyA9CisJCQlkZWxsX2dldF9pbnRlbnNpdHkoZGVsbF9iYWNrbGlnaHRfZGV2aWNlKTsKKwkJYmFja2xpZ2h0X3VwZGF0ZV9zdGF0dXMoZGVsbF9iYWNrbGlnaHRfZGV2aWNlKTsKKwl9CisKKwlyZXR1cm4gMDsKK291dDoKKwlpZiAod2lmaV9yZmtpbGwpCisJCXJma2lsbF91bnJlZ2lzdGVyKHdpZmlfcmZraWxsKTsKKwlpZiAoYmx1ZXRvb3RoX3Jma2lsbCkKKwkJcmZraWxsX3VucmVnaXN0ZXIoYmx1ZXRvb3RoX3Jma2lsbCk7CisJaWYgKHd3YW5fcmZraWxsKQorCQlyZmtpbGxfdW5yZWdpc3Rlcih3d2FuX3Jma2lsbCk7CisJa2ZyZWUoZGFfdG9rZW5zKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZGVsbF9leGl0KHZvaWQpCit7CisJYmFja2xpZ2h0X2RldmljZV91bnJlZ2lzdGVyKGRlbGxfYmFja2xpZ2h0X2RldmljZSk7CisJaWYgKHdpZmlfcmZraWxsKQorCQlyZmtpbGxfdW5yZWdpc3Rlcih3aWZpX3Jma2lsbCk7CisJaWYgKGJsdWV0b290aF9yZmtpbGwpCisJCXJma2lsbF91bnJlZ2lzdGVyKGJsdWV0b290aF9yZmtpbGwpOworCWlmICh3d2FuX3Jma2lsbCkKKwkJcmZraWxsX3VucmVnaXN0ZXIod3dhbl9yZmtpbGwpOworfQorCittb2R1bGVfaW5pdChkZWxsX2luaXQpOworbW9kdWxlX2V4aXQoZGVsbF9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiTWF0dGhldyBHYXJyZXR0IDxtamdAcmVkaGF0LmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiRGVsbCBsYXB0b3AgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVMoImRtaToqc3ZuRGVsbEluYy46KjpjdDg6KiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL2VuY2xvc3VyZS5jIGIvZHJpdmVycy9taXNjL2VuY2xvc3VyZS5jCmluZGV4IDA3MzZjZmYuLjNjZjYxZWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9lbmNsb3N1cmUuYworKysgYi9kcml2ZXJzL21pc2MvZW5jbG9zdXJlLmMKQEAgLTExOSw3ICsxMTksNyBAQAogCWVkZXYtPmVkZXYuY2xhc3MgPSAmZW5jbG9zdXJlX2NsYXNzOwogCWVkZXYtPmVkZXYucGFyZW50ID0gZ2V0X2RldmljZShkZXYpOwogCWVkZXYtPmNiID0gY2I7Ci0Jc25wcmludGYoZWRldi0+ZWRldi5idXNfaWQsIEJVU19JRF9TSVpFLCAiJXMiLCBuYW1lKTsKKwlkZXZfc2V0X25hbWUoJmVkZXYtPmVkZXYsIG5hbWUpOwogCWVyciA9IGRldmljZV9yZWdpc3RlcigmZWRldi0+ZWRldik7CiAJaWYgKGVycikKIAkJZ290byBlcnI7CkBAIC0xNzAsNyArMTcwLDcgQEAKIHN0YXRpYyB2b2lkIGVuY2xvc3VyZV9saW5rX25hbWUoc3RydWN0IGVuY2xvc3VyZV9jb21wb25lbnQgKmNkZXYsIGNoYXIgKm5hbWUpCiB7CiAJc3RyY3B5KG5hbWUsICJlbmNsb3N1cmVfZGV2aWNlOiIpOwotCXN0cmNhdChuYW1lLCBjZGV2LT5jZGV2LmJ1c19pZCk7CisJc3RyY2F0KG5hbWUsIGRldl9uYW1lKCZjZGV2LT5jZGV2KSk7CiB9CiAKIHN0YXRpYyB2b2lkIGVuY2xvc3VyZV9yZW1vdmVfbGlua3Moc3RydWN0IGVuY2xvc3VyZV9jb21wb25lbnQgKmNkZXYpCkBAIC0yNTYsOSArMjU2LDkgQEAKIAljZGV2ID0gJmVjb21wLT5jZGV2OwogCWNkZXYtPnBhcmVudCA9IGdldF9kZXZpY2UoJmVkZXYtPmVkZXYpOwogCWlmIChuYW1lKQotCQlzbnByaW50ZihjZGV2LT5idXNfaWQsIEJVU19JRF9TSVpFLCAiJXMiLCBuYW1lKTsKKwkJZGV2X3NldF9uYW1lKGNkZXYsIG5hbWUpOwogCWVsc2UKLQkJc25wcmludGYoY2Rldi0+YnVzX2lkLCBCVVNfSURfU0laRSwgIiV1IiwgbnVtYmVyKTsKKwkJZGV2X3NldF9uYW1lKGNkZXYsICIldSIsIG51bWJlcik7CiAKIAljZGV2LT5yZWxlYXNlID0gZW5jbG9zdXJlX2NvbXBvbmVudF9yZWxlYXNlOwogCWNkZXYtPmdyb3VwcyA9IGVuY2xvc3VyZV9ncm91cHM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvaWJtYXNtL2V2ZW50LmMgYi9kcml2ZXJzL21pc2MvaWJtYXNtL2V2ZW50LmMKaW5kZXggZmRhNmE0ZC4uNjhhMGE1YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL2libWFzbS9ldmVudC5jCisrKyBiL2RyaXZlcnMvbWlzYy9pYm1hc20vZXZlbnQuYwpAQCAtNTAsNyArNTAsNyBAQAogICogU3RvcmUgdGhlIGV2ZW50IGluIHRoZSBjaXJjdWxhciBldmVudCBidWZmZXIsIHdha2UgdXAgYW55IHNsZWVwaW5nCiAgKiBldmVudCByZWFkZXJzLgogICogVGhlcmUgaXMgbm8gcmVhZGVyIG1hcmtlciBpbiB0aGUgYnVmZmVyLCB0aGVyZWZvcmUgcmVhZGVycyBhcmUKLSAqIHJlc3BvbnNpYmxlIGZvciBrZWVwaW5nIHVwIHdpdGggdGhlIHdyaXRlciwgb3IgdGhleSB3aWxsIGxvb3NlIGV2ZW50cy4KKyAqIHJlc3BvbnNpYmxlIGZvciBrZWVwaW5nIHVwIHdpdGggdGhlIHdyaXRlciwgb3IgdGhleSB3aWxsIGxvc2UgZXZlbnRzLgogICovCiB2b2lkIGlibWFzbV9yZWNlaXZlX2V2ZW50KHN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3AsIHZvaWQgKmRhdGEsIHVuc2lnbmVkIGludCBkYXRhX3NpemUpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvaWJtYXNtL2libWFzbWZzLmMgYi9kcml2ZXJzL21pc2MvaWJtYXNtL2libWFzbWZzLmMKaW5kZXggMjJhN2U4Yi4uZGU5NjZhNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL2libWFzbS9pYm1hc21mcy5jCisrKyBiL2RyaXZlcnMvbWlzYy9pYm1hc20vaWJtYXNtZnMuYwpAQCAtMTQ2LDggKzE0Niw2IEBACiAKIAlpZiAocmV0KSB7CiAJCXJldC0+aV9tb2RlID0gbW9kZTsKLQkJcmV0LT5pX3VpZCA9IHJldC0+aV9naWQgPSAwOwotCQlyZXQtPmlfYmxvY2tzID0gMDsKIAkJcmV0LT5pX2F0aW1lID0gcmV0LT5pX210aW1lID0gcmV0LT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FOwogCX0KIAlyZXR1cm4gcmV0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL2libWFzbS9tb2R1bGUuYyBiL2RyaXZlcnMvbWlzYy9pYm1hc20vbW9kdWxlLmMKaW5kZXggYjVmNmFkZC4uZGMxNGIwYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL2libWFzbS9tb2R1bGUuYworKysgYi9kcml2ZXJzL21pc2MvaWJtYXNtL21vZHVsZS5jCkBAIC0xMDQsOCArMTA0LDcgQEAKIAl9CiAKIAlzcC0+aXJxID0gcGRldi0+aXJxOwotCXNwLT5iYXNlX2FkZHJlc3MgPSBpb3JlbWFwKHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAwKSwKLQkJCQkJcGNpX3Jlc291cmNlX2xlbihwZGV2LCAwKSk7CisJc3AtPmJhc2VfYWRkcmVzcyA9IHBjaV9pb3JlbWFwX2JhcihwZGV2LCAwKTsKIAlpZiAoIXNwLT5iYXNlX2FkZHJlc3MpIHsKIAkJZGV2X2VycihzcC0+ZGV2LCAiRmFpbGVkIHRvIGlvcmVtYXAgcGNpIG1lbW9yeVxuIik7CiAJCXJlc3VsdCA9ICAtRU5PREVWOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL2lvYzQuYyBiL2RyaXZlcnMvbWlzYy9pb2M0LmMKaW5kZXggNmY3NjU3My4uNjBiMGIxYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL2lvYzQuYworKysgYi9kcml2ZXJzL21pc2MvaW9jNC5jCkBAIC0yNjksNiArMjY5LDE2IEBACiAJcmV0dXJuIElPQzRfVkFSSUFOVF9QQ0lfUlQ7CiB9CiAKK3N0YXRpYyB2b2lkCitpb2M0X2xvYWRfbW9kdWxlcyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJLyogYXJnIGp1c3QgaGFzIHRvIGJlIGZyZWVkICovCisKKwlyZXF1ZXN0X21vZHVsZSgic2dpaW9jNCIpOworCisJa2ZyZWUod29yayk7Cit9CisKIC8qIEFkZHMgYSBuZXcgaW5zdGFuY2Ugb2YgYW4gSU9DNCBjYXJkICovCiBzdGF0aWMgaW50CiBpb2M0X3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqcGNpX2lkKQpAQCAtMzc4LDYgKzM4OCwzMCBAQAogCX0KIAltdXRleF91bmxvY2soJmlvYzRfbXV0ZXgpOwogCisJLyogUmVxdWVzdCBzZ2lpb2M0IElERSBkcml2ZXIgb24gYm9hcmRzIHRoYXQgYnJpbmcgdGhhdCBmdW5jdGlvbmFsaXR5CisJICogb2ZmIG9mIElPQzQuICBUaGUgcm9vdCBmaWxlc3lzdGVtIG1heSBiZSBob3N0ZWQgb24gYSBkcml2ZSBjb25uZWN0ZWQKKwkgKiB0byBJT0M0LCBzbyB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGUgc2dpaW9jNCBkcml2ZXIgaXMgbG9hZGVkIGFzIGl0CisJICogd29uJ3QgYmUgcGlja2VkIHVwIGJ5IG1vZHByb2JlcyBkdWUgdG8gdGhlIGlvYzQgbW9kdWxlIG93bmluZyB0aGUKKwkgKiBQQ0kgZGV2aWNlLgorCSAqLworCWlmIChpZGQtPmlkZF92YXJpYW50ICE9IElPQzRfVkFSSUFOVF9QQ0lfUlQpIHsKKwkJc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrOworCQl3b3JrID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHdvcmtfc3RydWN0KSwgR0ZQX0tFUk5FTCk7CisJCWlmICghd29yaykgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJICAgICAgICIlczogSU9DNCB1bmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciAiCisJCQkgICAgICAgImxvYWQgb2Ygc3ViLW1vZHVsZXMuXG4iLCBfX2Z1bmNfXyk7CisJCX0gZWxzZSB7CisJCQkvKiBSZXF1ZXN0IHRoZSBtb2R1bGUgZnJvbSBhIHdvcmsgcHJvY2VkdXJlIGFzIHRoZQorCQkJICogbW9kcHJvYmUgZ29lcyBvdXQgdG8gYSB1c2VybGFuZCBoZWxwZXIgYW5kIHRoYXQKKwkJCSAqIHdpbGwgaGFuZyBpZiBkb25lIGRpcmVjdGx5IGZyb20gaW9jNF9wcm9iZSgpLgorCQkJICovCisJCQlwcmludGsoS0VSTl9JTkZPICJJT0M0IGxvYWRpbmcgc2dpaW9jNCBzdWJtb2R1bGVcbiIpOworCQkJSU5JVF9XT1JLKHdvcmssIGlvYzRfbG9hZF9tb2R1bGVzKTsKKwkJCXNjaGVkdWxlX3dvcmsod29yayk7CisJCX0KKwl9CisKIAlyZXR1cm4gMDsKIAogb3V0X21pc2NfcmVnaW9uOgpAQCAtNDYyLDYgKzQ5Niw4IEBACiBzdGF0aWMgdm9pZCBfX2RldmV4aXQKIGlvYzRfZXhpdCh2b2lkKQogeworCS8qIEVuc3VyZSBpb2M0X2xvYWRfbW9kdWxlcygpIGhhcyBjb21wbGV0ZWQgYmVmb3JlIGV4aXRpbmcgKi8KKwlmbHVzaF9zY2hlZHVsZWRfd29yaygpOwogCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmaW9jNF9kcml2ZXIpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvcGhhbnRvbS5jIGIvZHJpdmVycy9taXNjL3BoYW50b20uYwppbmRleCBhYmRlYmUzLi5mYTU3YjY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvcGhhbnRvbS5jCisrKyBiL2RyaXZlcnMvbWlzYy9waGFudG9tLmMKQEAgLTYsNyArNiw3IEBACiAgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKICAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogICoKLSAqICBZb3UgbmVlZCBhbiB1c2Vyc3BhY2UgbGlicmFyeSB0byBjb29wZXJhdGUgd2l0aCB0aGlzIGRyaXZlci4gSXQgKGFuZCBvdGhlcgorICogIFlvdSBuZWVkIGEgdXNlcnNwYWNlIGxpYnJhcnkgdG8gY29vcGVyYXRlIHdpdGggdGhpcyBkcml2ZXIuIEl0IChhbmQgb3RoZXIKICAqICBpbmZvKSBtYXkgYmUgb2J0YWluZWQgaGVyZToKICAqICBodHRwOi8vd3d3LmZpLm11bmkuY3ovfnhzbGFieS9waGFudG9tLmh0bWwKICAqICBvciBhbHRlcm5hdGl2ZWx5LCB5b3UgbWlnaHQgdXNlIE9wZW5IYXB0aWNzIHByb3ZpZGVkIGJ5IFNlbnNhYmxlLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL3NnaS1ncnUvZ3J1bWFpbi5jIGIvZHJpdmVycy9taXNjL3NnaS1ncnUvZ3J1bWFpbi5jCmluZGV4IGUxMWUxYWMuLjNkMmZjMjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9zZ2ktZ3J1L2dydW1haW4uYworKysgYi9kcml2ZXJzL21pc2Mvc2dpLWdydS9ncnVtYWluLmMKQEAgLTI5LDcgKzI5LDcgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgZGV2aWNlIGdydV9kZXZpY2UgPSB7Ci0JLmJ1c19pZCA9IHswfSwKKwkuaW5pdF9uYW1lID0gIiIsCiAJLmRyaXZlciA9ICZncnVfZHJpdmVyLAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL3NnaS14cC94cF9tYWluLmMgYi9kcml2ZXJzL21pc2Mvc2dpLXhwL3hwX21haW4uYwppbmRleCA5YTJlNzcxLi4xNmY4ZGNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2Mvc2dpLXhwL3hwX21haW4uYworKysgYi9kcml2ZXJzL21pc2Mvc2dpLXhwL3hwX21haW4uYwpAQCAtMjUsNyArMjUsNyBAQAogfTsKIAogc3RydWN0IGRldmljZSB4cF9kYmdfc3VibmFtZSA9IHsKLQkuYnVzX2lkID0gezB9LAkJLyogc2V0IHRvICIiICovCisJLmluaXRfbmFtZSA9ICIiLAkJLyogc2V0IHRvICIiICovCiAJLmRyaXZlciA9ICZ4cF9kYmdfbmFtZQogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL3NnaS14cC94cGNfbWFpbi5jIGIvZHJpdmVycy9taXNjL3NnaS14cC94cGNfbWFpbi5jCmluZGV4IGU4ZDVjZmIuLjg5MjE4ZjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9zZ2kteHAveHBjX21haW4uYworKysgYi9kcml2ZXJzL21pc2Mvc2dpLXhwL3hwY19tYWluLmMKQEAgLTU5LDEyICs1OSwxMiBAQAogfTsKIAogc3RydWN0IGRldmljZSB4cGNfcGFydF9kYmdfc3VibmFtZSA9IHsKLQkuYnVzX2lkID0gezB9LAkJLyogc2V0IHRvICJwYXJ0IiBhdCB4cGNfaW5pdCgpIHRpbWUgKi8KKwkuaW5pdF9uYW1lID0gIiIsCS8qIHNldCB0byAicGFydCIgYXQgeHBjX2luaXQoKSB0aW1lICovCiAJLmRyaXZlciA9ICZ4cGNfZGJnX25hbWUKIH07CiAKIHN0cnVjdCBkZXZpY2UgeHBjX2NoYW5fZGJnX3N1Ym5hbWUgPSB7Ci0JLmJ1c19pZCA9IHswfSwJCS8qIHNldCB0byAiY2hhbiIgYXQgeHBjX2luaXQoKSB0aW1lICovCisJLmluaXRfbmFtZSA9ICIiLAkvKiBzZXQgdG8gImNoYW4iIGF0IHhwY19pbml0KCkgdGltZSAqLwogCS5kcml2ZXIgPSAmeHBjX2RiZ19uYW1lCiB9OwogCkBAIC0xMjU4LDggKzEyNTgsOCBAQAogCWludCByZXQ7CiAJc3RydWN0IHRhc2tfc3RydWN0ICprdGhyZWFkOwogCi0Jc25wcmludGYoeHBjX3BhcnQtPmJ1c19pZCwgQlVTX0lEX1NJWkUsICJwYXJ0Iik7Ci0Jc25wcmludGYoeHBjX2NoYW4tPmJ1c19pZCwgQlVTX0lEX1NJWkUsICJjaGFuIik7CisJZGV2X3NldF9uYW1lKHhwY19wYXJ0LCAicGFydCIpOworCWRldl9zZXRfbmFtZSh4cGNfY2hhbiwgImNoYW4iKTsKIAogCWlmIChpc19zaHViKCkpIHsKIAkJLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9zZ2kteHAveHBuZXQuYyBiL2RyaXZlcnMvbWlzYy9zZ2kteHAveHBuZXQuYwppbmRleCA4ZTZhYTk1Li43OTU3ZjUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2Mvc2dpLXhwL3hwbmV0LmMKKysrIGIvZHJpdmVycy9taXNjL3NnaS14cC94cG5ldC5jCkBAIC05NSwxMSArOTUsNiBAQAogCWF0b21pY190IHVzZV9jb3VudDsKIH07CiAKLS8qIGRyaXZlciBzcGVjaWZpYyBzdHJ1Y3R1cmUgcG9pbnRlZCB0byBieSB0aGUgZGV2aWNlIHN0cnVjdHVyZSAqLwotc3RydWN0IHhwbmV0X2Rldl9wcml2YXRlIHsKLQlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKLX07Ci0KIHN0cnVjdCBuZXRfZGV2aWNlICp4cG5ldF9kZXZpY2U7CiAKIC8qCkBAIC0xMzgsNyArMTMzLDcgQEAKIH07CiAKIHN0cnVjdCBkZXZpY2UgeHBuZXRfZGJnX3N1Ym5hbWUgPSB7Ci0JLmJ1c19pZCA9IHswfSwJCS8qIHNldCB0byAiIiAqLworCS5pbml0X25hbWUgPSAiIiwJLyogc2V0IHRvICIiICovCiAJLmRyaXZlciA9ICZ4cG5ldF9kYmdfbmFtZQogfTsKIApAQCAtMTUzLDcgKzE0OCw2IEBACiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAl2b2lkICpkc3Q7CiAJZW51bSB4cF9yZXR2YWwgcmV0OwotCXN0cnVjdCB4cG5ldF9kZXZfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KHhwbmV0X2RldmljZSk7CiAKIAlpZiAoIVhQTkVUX1ZBTElEX01TRyhtc2cpKSB7CiAJCS8qCkBAIC0xNjEsNyArMTU1LDcgQEAKIAkJICovCiAJCXhwY19yZWNlaXZlZChwYXJ0aWQsIGNoYW5uZWwsICh2b2lkICopbXNnKTsKIAotCQlwcml2LT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJeHBuZXRfZGV2aWNlLT5zdGF0cy5yeF9lcnJvcnMrKzsKIAogCQlyZXR1cm47CiAJfQpAQCAtMTc2LDcgKzE3MCw3IEBACiAKIAkJeHBjX3JlY2VpdmVkKHBhcnRpZCwgY2hhbm5lbCwgKHZvaWQgKiltc2cpOwogCi0JCXByaXYtPnN0YXRzLnJ4X2Vycm9ycysrOworCQl4cG5ldF9kZXZpY2UtPnN0YXRzLnJ4X2Vycm9ycysrOwogCiAJCXJldHVybjsKIAl9CkBAIC0yMjYsNyArMjIwLDcgQEAKIAogCQkJeHBjX3JlY2VpdmVkKHBhcnRpZCwgY2hhbm5lbCwgKHZvaWQgKiltc2cpOwogCi0JCQlwcml2LT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJCXhwbmV0X2RldmljZS0+c3RhdHMucnhfZXJyb3JzKys7CiAKIAkJCXJldHVybjsKIAkJfQpAQCAtMjQ3LDggKzI0MSw4IEBACiAJCXNrYl9lbmRfcG9pbnRlcihza2IpLCBza2ItPmxlbik7CiAKIAl4cG5ldF9kZXZpY2UtPmxhc3RfcnggPSBqaWZmaWVzOwotCXByaXYtPnN0YXRzLnJ4X3BhY2tldHMrKzsKLQlwcml2LT5zdGF0cy5yeF9ieXRlcyArPSBza2ItPmxlbiArIEVUSF9ITEVOOworCXhwbmV0X2RldmljZS0+c3RhdHMucnhfcGFja2V0cysrOworCXhwbmV0X2RldmljZS0+c3RhdHMucnhfYnl0ZXMgKz0gc2tiLT5sZW4gKyBFVEhfSExFTjsKIAogCW5ldGlmX3J4X25pKHNrYik7CiAJeHBjX3JlY2VpdmVkKHBhcnRpZCwgY2hhbm5lbCwgKHZvaWQgKiltc2cpOwpAQCAtMzUzLDI2ICszNDcsNiBAQAogfQogCiAvKgotICogUmVxdWlyZWQgZm9yIHRoZSBuZXRfZGV2aWNlIHN0cnVjdHVyZS4KLSAqLwotc3RhdGljIGludAoteHBuZXRfZGV2X3NldF9jb25maWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmbWFwICpuZXdfbWFwKQotewotCXJldHVybiAwOwotfQotCi0vKgotICogUmV0dXJuIHN0YXRpc3RpY3MgdG8gdGhlIGNhbGxlci4KLSAqLwotc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICoKLXhwbmV0X2Rldl9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgeHBuZXRfZGV2X3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwotCi0JcmV0dXJuICZwcml2LT5zdGF0czsKLX0KLQotLyoKICAqIE5vdGlmaWNhdGlvbiB0aGF0IHRoZSBvdGhlciBlbmQgaGFzIHJlY2VpdmVkIHRoZSBtZXNzYWdlIGFuZAogICogRE1BJ2QgdGhlIHNrYiBpbmZvcm1hdGlvbi4gIEF0IHRoaXMgcG9pbnQsIHRoZXkgYXJlIGRvbmUgd2l0aAogICogb3VyIHNpZGUuICBXaGVuIGFsbCByZWNpcGllbnRzIGFyZSBkb25lIHByb2Nlc3NpbmcsIHdlCkBAIC00NTMsNyArNDI3LDYgQEAKIAlzdHJ1Y3QgeHBuZXRfcGVuZGluZ19tc2cgKnF1ZXVlZF9tc2c7CiAJdTY0IHN0YXJ0X2FkZHIsIGVuZF9hZGRyOwogCXNob3J0IGRlc3RfcGFydGlkOwotCXN0cnVjdCB4cG5ldF9kZXZfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CiAJdTE2IGVtYmVkZGVkX2J5dGVzID0gMDsKIAogCWRldl9kYmcoeHBuZXQsICI+c2tiLT5oZWFkPTB4JXAgc2tiLT5kYXRhPTB4JXAgc2tiLT50YWlsPTB4JXAgIgpAQCAtNDc2LDcgKzQ0OSw3IEBACiAJCWRldl93YXJuKHhwbmV0LCAiZmFpbGVkIHRvIGttYWxsb2MgJWxkIGJ5dGVzOyBkcm9wcGluZyAiCiAJCQkgInBhY2tldFxuIiwgc2l6ZW9mKHN0cnVjdCB4cG5ldF9wZW5kaW5nX21zZykpOwogCi0JCXByaXYtPnN0YXRzLnR4X2Vycm9ycysrOworCQlkZXYtPnN0YXRzLnR4X2Vycm9ycysrOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKQEAgLTUyNiw4ICs0OTksOCBAQAogCQlrZnJlZShxdWV1ZWRfbXNnKTsKIAl9CiAKLQlwcml2LT5zdGF0cy50eF9wYWNrZXRzKys7Ci0JcHJpdi0+c3RhdHMudHhfYnl0ZXMgKz0gc2tiLT5sZW47CisJZGV2LT5zdGF0cy50eF9wYWNrZXRzKys7CisJZGV2LT5zdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKIAogCXJldHVybiAwOwogfQpAQCAtNTM4LDEyICs1MTEsMTkgQEAKIHN0YXRpYyB2b2lkCiB4cG5ldF9kZXZfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotCXN0cnVjdCB4cG5ldF9kZXZfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7Ci0KLQlwcml2LT5zdGF0cy50eF9lcnJvcnMrKzsKLQlyZXR1cm47CisJZGV2LT5zdGF0cy50eF9lcnJvcnMrKzsKIH0KIAorc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyB4cG5ldF9uZXRkZXZfb3BzID0geworCS5uZG9fb3BlbgkJPSB4cG5ldF9kZXZfb3BlbiwKKwkubmRvX3N0b3AJCT0geHBuZXRfZGV2X3N0b3AsCisJLm5kb19zdGFydF94bWl0CQk9IHhwbmV0X2Rldl9oYXJkX3N0YXJ0X3htaXQsCisJLm5kb19jaGFuZ2VfbXR1CQk9IHhwbmV0X2Rldl9jaGFuZ2VfbXR1LAorCS5uZG9fdHhfdGltZW91dAkJPSB4cG5ldF9kZXZfdHhfdGltZW91dCwKKwkubmRvX3NldF9tYWNfYWRkcmVzcyAJPSBldGhfbWFjX2FkZHIsCisJLm5kb192YWxpZGF0ZV9hZGRyCT0gZXRoX3ZhbGlkYXRlX2FkZHIsCit9OworCiBzdGF0aWMgaW50IF9faW5pdAogeHBuZXRfaW5pdCh2b2lkKQogewpAQCAtNTYzLDggKzU0Myw3IEBACiAJICogdXNlIGV0aGVyX3NldHVwKCkgdG8gaW5pdCB0aGUgbWFqb3JpdHkgb2Ygb3VyIGRldmljZQogCSAqIHN0cnVjdHVyZSBhbmQgdGhlbiBvdmVycmlkZSB0aGUgbmVjZXNzYXJ5IHBpZWNlcy4KIAkgKi8KLQl4cG5ldF9kZXZpY2UgPSBhbGxvY19uZXRkZXYoc2l6ZW9mKHN0cnVjdCB4cG5ldF9kZXZfcHJpdmF0ZSksCi0JCQkJICAgIFhQTkVUX0RFVklDRV9OQU1FLCBldGhlcl9zZXR1cCk7CisJeHBuZXRfZGV2aWNlID0gYWxsb2NfbmV0ZGV2KDAsIFhQTkVUX0RFVklDRV9OQU1FLCBldGhlcl9zZXR1cCk7CiAJaWYgKHhwbmV0X2RldmljZSA9PSBOVUxMKSB7CiAJCWtmcmVlKHhwbmV0X2Jyb2FkY2FzdF9wYXJ0aXRpb25zKTsKIAkJcmV0dXJuIC1FTk9NRU07CkBAIC01NzMsMTMgKzU1Miw2IEBACiAJbmV0aWZfY2Fycmllcl9vZmYoeHBuZXRfZGV2aWNlKTsKIAogCXhwbmV0X2RldmljZS0+bXR1ID0gWFBORVRfREVGX01UVTsKLQl4cG5ldF9kZXZpY2UtPmNoYW5nZV9tdHUgPSB4cG5ldF9kZXZfY2hhbmdlX210dTsKLQl4cG5ldF9kZXZpY2UtPm9wZW4gPSB4cG5ldF9kZXZfb3BlbjsKLQl4cG5ldF9kZXZpY2UtPmdldF9zdGF0cyA9IHhwbmV0X2Rldl9nZXRfc3RhdHM7Ci0JeHBuZXRfZGV2aWNlLT5zdG9wID0geHBuZXRfZGV2X3N0b3A7Ci0JeHBuZXRfZGV2aWNlLT5oYXJkX3N0YXJ0X3htaXQgPSB4cG5ldF9kZXZfaGFyZF9zdGFydF94bWl0OwotCXhwbmV0X2RldmljZS0+dHhfdGltZW91dCA9IHhwbmV0X2Rldl90eF90aW1lb3V0OwotCXhwbmV0X2RldmljZS0+c2V0X2NvbmZpZyA9IHhwbmV0X2Rldl9zZXRfY29uZmlnOwogCiAJLyoKIAkgKiBNdWx0aWNhc3QgYXNzdW1lcyB0aGUgTFNCIG9mIHRoZSBmaXJzdCBvY3RldCBpcyBzZXQgZm9yIG11bHRpY2FzdApkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL3RpZm1fN3h4MS5jIGIvZHJpdmVycy9taXNjL3RpZm1fN3h4MS5jCmluZGV4IDY3NTAzZWEuLmJlNTY3MmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy90aWZtXzd4eDEuYworKysgYi9kcml2ZXJzL21pc2MvdGlmbV83eHgxLmMKQEAgLTE2NCw3ICsxNjQsNyBAQAogCQlpZiAoc29jaykgewogCQkJcHJpbnRrKEtFUk5fSU5GTwogCQkJICAgICAgICIlcyA6IGRlbWFuZCByZW1vdmluZyBjYXJkIGZyb20gc29ja2V0ICV1OiV1XG4iLAotCQkJICAgICAgIGZtLT5kZXYuYnVzX2lkLCBmbS0+aWQsIGNudCk7CisJCQkgICAgICAgZGV2X25hbWUoJmZtLT5kZXYpLCBmbS0+aWQsIGNudCk7CiAJCQlmbS0+c29ja2V0c1tjbnRdID0gTlVMTDsKIAkJCXNvY2tfYWRkciA9IHNvY2stPmFkZHI7CiAJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZmbS0+bG9jaywgZmxhZ3MpOwpAQCAtMzU0LDggKzM1NCw3IEBACiAJZm0tPmhhc19tc19waWYgPSB0aWZtXzd4eDFfaGFzX21zX3BpZjsKIAlwY2lfc2V0X2RydmRhdGEoZGV2LCBmbSk7CiAKLQlmbS0+YWRkciA9IGlvcmVtYXAocGNpX3Jlc291cmNlX3N0YXJ0KGRldiwgMCksCi0JCQkgICBwY2lfcmVzb3VyY2VfbGVuKGRldiwgMCkpOworCWZtLT5hZGRyID0gcGNpX2lvcmVtYXBfYmFyKGRldiwgMCk7CiAJaWYgKCFmbS0+YWRkcikKIAkJZ290byBlcnJfb3V0X2ZyZWU7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy90aWZtX2NvcmUuYyBiL2RyaXZlcnMvbWlzYy90aWZtX2NvcmUuYwppbmRleCA4MmRjNzJhLi45OGJjYmE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvdGlmbV9jb3JlLmMKKysrIGIvZHJpdmVycy9taXNjL3RpZm1fY29yZS5jCkBAIC0yMDMsNyArMjAzLDcgQEAKIAlpZiAocmMpCiAJCXJldHVybiByYzsKIAotCXNucHJpbnRmKGZtLT5kZXYuYnVzX2lkLCBCVVNfSURfU0laRSwgInRpZm0ldSIsIGZtLT5pZCk7CisJZGV2X3NldF9uYW1lKCZmbS0+ZGV2LCAidGlmbSV1IiwgZm0tPmlkKTsKIAlyYyA9IGRldmljZV9hZGQoJmZtLT5kZXYpOwogCWlmIChyYykgewogCQlzcGluX2xvY2soJnRpZm1fYWRhcHRlcl9sb2NrKTsKQEAgLTI2Niw5ICsyNjYsOCBAQAogCQlzb2NrLT5kZXYuZG1hX21hc2sgPSBmbS0+ZGV2LnBhcmVudC0+ZG1hX21hc2s7CiAJCXNvY2stPmRldi5yZWxlYXNlID0gdGlmbV9mcmVlX2RldmljZTsKIAotCQlzbnByaW50Zihzb2NrLT5kZXYuYnVzX2lkLCBCVVNfSURfU0laRSwKLQkJCSAidGlmbV8lcyV1OiV1IiwgdGlmbV9tZWRpYV90eXBlX25hbWUodHlwZSwgMiksCi0JCQkgZm0tPmlkLCBpZCk7CisJCWRldl9zZXRfbmFtZSgmc29jay0+ZGV2LCAidGlmbV8lcyV1OiV1IiwKKwkJCSAgICAgdGlmbV9tZWRpYV90eXBlX25hbWUodHlwZSwgMiksIGZtLT5pZCwgaWQpOwogCQlwcmludGsoS0VSTl9JTkZPIERSSVZFUl9OQU1FCiAJCSAgICAgICAiOiAlcyBjYXJkIGRldGVjdGVkIGluIHNvY2tldCAldToldVxuIiwKIAkJICAgICAgIHRpZm1fbWVkaWFfdHlwZV9uYW1lKHR5cGUsIDApLCBmbS0+aWQsIGlkKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2hvc3QvYXRtZWwtbWNpLmMgYi9kcml2ZXJzL21tYy9ob3N0L2F0bWVsLW1jaS5jCmluZGV4IGIwMDQyZDAuLjc2YmZlMTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2hvc3QvYXRtZWwtbWNpLmMKKysrIGIvZHJpdmVycy9tbWMvaG9zdC9hdG1lbC1tY2kuYwpAQCAtMjUsOCArMjUsOCBAQAogI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KIAogI2luY2x1ZGUgPGxpbnV4L21tYy9ob3N0Lmg+CisjaW5jbHVkZSA8bGludXgvYXRtZWwtbWNpLmg+CiAKLSNpbmNsdWRlIDxhc20vYXRtZWwtbWNpLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9kZXZpY2VzL0tjb25maWcgYi9kcml2ZXJzL210ZC9kZXZpY2VzL0tjb25maWcKaW5kZXggNmZkZTBhMi4uYmMzMzIwMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvZGV2aWNlcy9LY29uZmlnCisrKyBiL2RyaXZlcnMvbXRkL2RldmljZXMvS2NvbmZpZwpAQCAtMTIwLDYgKzEyMCwxMyBAQAogCSAgZG9lc24ndCBoYXZlIGFjY2VzcyB0bywgbWVtb3J5IGJleW9uZCB0aGUgbWVtPXh4eCBsaW1pdCwgbnZyYW0sCiAJICBtZW1vcnkgb24gdGhlIHZpZGVvIGNhcmQsIGV0Yy4uLgogCitjb25maWcgTVREX1BTM1ZSQU0KKwl0cmlzdGF0ZSAiUFMzIHZpZGVvIFJBTSIKKwlkZXBlbmRzIG9uIEZCX1BTMworCWhlbHAKKwkgIFRoaXMgZHJpdmVyIGFsbG93cyB5b3UgdG8gdXNlIGV4Y2VzcyBQUzMgdmlkZW8gUkFNIGFzIHZvbGF0aWxlCisJICBzdG9yYWdlIG9yIHN5c3RlbSBzd2FwLgorCiBjb25maWcgTVREX0xBUlQKIAl0cmlzdGF0ZSAiMjhGMTYweHggZmxhc2ggZHJpdmVyIGZvciBMQVJUIgogCWRlcGVuZHMgb24gU0ExMTAwX0xBUlQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL2RldmljZXMvTWFrZWZpbGUgYi9kcml2ZXJzL210ZC9kZXZpY2VzL01ha2VmaWxlCmluZGV4IDA5OTNkNWMuLmU1MTUyMWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL2RldmljZXMvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9tdGQvZGV2aWNlcy9NYWtlZmlsZQpAQCAtMTYsMyArMTYsNCBAQAogb2JqLSQoQ09ORklHX01URF9CTE9DSzJNVEQpCSs9IGJsb2NrMm10ZC5vCiBvYmotJChDT05GSUdfTVREX0RBVEFGTEFTSCkJKz0gbXRkX2RhdGFmbGFzaC5vCiBvYmotJChDT05GSUdfTVREX00yNVA4MCkJKz0gbTI1cDgwLm8KK29iai0kKENPTkZJR19NVERfUFMzVlJBTSkJKz0gcHMzdnJhbS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9kZXZpY2VzL20yNXA4MC5jIGIvZHJpdmVycy9tdGQvZGV2aWNlcy9tMjVwODAuYwppbmRleCA2NjU5YjIyLi41NzMzZjA2IDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9kZXZpY2VzL20yNXA4MC5jCisrKyBiL2RyaXZlcnMvbXRkL2RldmljZXMvbTI1cDgwLmMKQEAgLTE3MCw3ICsxNzAsNyBAQAogc3RhdGljIGludCBlcmFzZV9jaGlwKHN0cnVjdCBtMjVwICpmbGFzaCkKIHsKIAlERUJVRyhNVERfREVCVUdfTEVWRUwzLCAiJXM6ICVzICVkS2lCXG4iLAotCQkJZmxhc2gtPnNwaS0+ZGV2LmJ1c19pZCwgX19mdW5jX18sCisJCQlkZXZfbmFtZSgmZmxhc2gtPnNwaS0+ZGV2KSwgX19mdW5jX18sCiAJCQlmbGFzaC0+bXRkLnNpemUgLyAxMDI0KTsKIAogCS8qIFdhaXQgdW50aWwgZmluaXNoZWQgcHJldmlvdXMgd3JpdGUgY29tbWFuZC4gKi8KQEAgLTE5Nyw3ICsxOTcsNyBAQAogc3RhdGljIGludCBlcmFzZV9zZWN0b3Ioc3RydWN0IG0yNXAgKmZsYXNoLCB1MzIgb2Zmc2V0KQogewogCURFQlVHKE1URF9ERUJVR19MRVZFTDMsICIlczogJXMgJWRLaUIgYXQgMHglMDh4XG4iLAotCQkJZmxhc2gtPnNwaS0+ZGV2LmJ1c19pZCwgX19mdW5jX18sCisJCQlkZXZfbmFtZSgmZmxhc2gtPnNwaS0+ZGV2KSwgX19mdW5jX18sCiAJCQlmbGFzaC0+bXRkLmVyYXNlc2l6ZSAvIDEwMjQsIG9mZnNldCk7CiAKIAkvKiBXYWl0IHVudGlsIGZpbmlzaGVkIHByZXZpb3VzIHdyaXRlIGNvbW1hbmQuICovCkBAIC0yMzQsNyArMjM0LDcgQEAKIAl1MzIgYWRkcixsZW47CiAKIAlERUJVRyhNVERfREVCVUdfTEVWRUwyLCAiJXM6ICVzICVzIDB4JTA4eCwgbGVuICVkXG4iLAotCQkJZmxhc2gtPnNwaS0+ZGV2LmJ1c19pZCwgX19mdW5jX18sICJhdCIsCisJCQlkZXZfbmFtZSgmZmxhc2gtPnNwaS0+ZGV2KSwgX19mdW5jX18sICJhdCIsCiAJCQkodTMyKWluc3RyLT5hZGRyLCBpbnN0ci0+bGVuKTsKIAogCS8qIHNhbml0eSBjaGVja3MgKi8KQEAgLTI5NSw3ICsyOTUsNyBAQAogCXN0cnVjdCBzcGlfbWVzc2FnZSBtOwogCiAJREVCVUcoTVREX0RFQlVHX0xFVkVMMiwgIiVzOiAlcyAlcyAweCUwOHgsIGxlbiAlemRcbiIsCi0JCQlmbGFzaC0+c3BpLT5kZXYuYnVzX2lkLCBfX2Z1bmNfXywgImZyb20iLAorCQkJZGV2X25hbWUoJmZsYXNoLT5zcGktPmRldiksIF9fZnVuY19fLCAiZnJvbSIsCiAJCQkodTMyKWZyb20sIGxlbik7CiAKIAkvKiBzYW5pdHkgY2hlY2tzICovCkBAIC0zNjcsNyArMzY3LDcgQEAKIAlzdHJ1Y3Qgc3BpX21lc3NhZ2UgbTsKIAogCURFQlVHKE1URF9ERUJVR19MRVZFTDIsICIlczogJXMgJXMgMHglMDh4LCBsZW4gJXpkXG4iLAotCQkJZmxhc2gtPnNwaS0+ZGV2LmJ1c19pZCwgX19mdW5jX18sICJ0byIsCisJCQlkZXZfbmFtZSgmZmxhc2gtPnNwaS0+ZGV2KSwgX19mdW5jX18sICJ0byIsCiAJCQkodTMyKXRvLCBsZW4pOwogCiAJaWYgKHJldGxlbikKQEAgLTU2Myw3ICs1NjMsNyBAQAogCXRtcCA9IHNwaV93cml0ZV90aGVuX3JlYWQoc3BpLCAmY29kZSwgMSwgaWQsIDUpOwogCWlmICh0bXAgPCAwKSB7CiAJCURFQlVHKE1URF9ERUJVR19MRVZFTDAsICIlczogZXJyb3IgJWQgcmVhZGluZyBKRURFQyBJRFxuIiwKLQkJCXNwaS0+ZGV2LmJ1c19pZCwgdG1wKTsKKwkJCWRldl9uYW1lKCZzcGktPmRldiksIHRtcCk7CiAJCXJldHVybiBOVUxMOwogCX0KIAlqZWRlYyA9IGlkWzBdOwpAQCAtNjE3LDcgKzYxNyw3IEBACiAJCS8qIHVucmVjb2duaXplZCBjaGlwPyAqLwogCQlpZiAoaSA9PSBBUlJBWV9TSVpFKG0yNXBfZGF0YSkpIHsKIAkJCURFQlVHKE1URF9ERUJVR19MRVZFTDAsICIlczogdW5yZWNvZ25pemVkIGlkICVzXG4iLAotCQkJCQlzcGktPmRldi5idXNfaWQsIGRhdGEtPnR5cGUpOworCQkJCQlkZXZfbmFtZSgmc3BpLT5kZXYpLCBkYXRhLT50eXBlKTsKIAkJCWluZm8gPSBOVUxMOwogCiAJCS8qIHJlY29nbml6ZWQ7IGlzIHRoYXQgY2hpcCByZWFsbHkgd2hhdCdzIHRoZXJlPyAqLwpAQCAtNjU4LDcgKzY1OCw3IEBACiAJaWYgKGRhdGEgJiYgZGF0YS0+bmFtZSkKIAkJZmxhc2gtPm10ZC5uYW1lID0gZGF0YS0+bmFtZTsKIAllbHNlCi0JCWZsYXNoLT5tdGQubmFtZSA9IHNwaS0+ZGV2LmJ1c19pZDsKKwkJZmxhc2gtPm10ZC5uYW1lID0gZGV2X25hbWUoJnNwaS0+ZGV2KTsKIAogCWZsYXNoLT5tdGQudHlwZSA9IE1URF9OT1JGTEFTSDsKIAlmbGFzaC0+bXRkLndyaXRlc2l6ZSA9IDE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9kZXZpY2VzL210ZF9kYXRhZmxhc2guYyBiL2RyaXZlcnMvbXRkL2RldmljZXMvbXRkX2RhdGFmbGFzaC5jCmluZGV4IDZkZDlhZmYuLjY1MTI2Y2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL2RldmljZXMvbXRkX2RhdGFmbGFzaC5jCisrKyBiL2RyaXZlcnMvbXRkL2RldmljZXMvbXRkX2RhdGFmbGFzaC5jCkBAIC0xMjgsNyArMTI4LDcgQEAKIAkJc3RhdHVzID0gZGF0YWZsYXNoX3N0YXR1cyhzcGkpOwogCQlpZiAoc3RhdHVzIDwgMCkgewogCQkJREVCVUcoTVREX0RFQlVHX0xFVkVMMSwgIiVzOiBzdGF0dXMgJWQ/XG4iLAotCQkJCQlzcGktPmRldi5idXNfaWQsIHN0YXR1cyk7CisJCQkJCWRldl9uYW1lKCZzcGktPmRldiksIHN0YXR1cyk7CiAJCQlzdGF0dXMgPSAwOwogCQl9CiAKQEAgLTE1NCw3ICsxNTQsNyBAQAogCXVpbnQ4X3QJCQkqY29tbWFuZDsKIAogCURFQlVHKE1URF9ERUJVR19MRVZFTDIsICIlczogZXJhc2UgYWRkcj0weCV4IGxlbiAweCV4XG4iLAotCQkJc3BpLT5kZXYuYnVzX2lkLAorCQkJZGV2X25hbWUoJnNwaS0+ZGV2KSwKIAkJCWluc3RyLT5hZGRyLCBpbnN0ci0+bGVuKTsKIAogCS8qIFNhbml0eSBjaGVja3MgKi8KQEAgLTE5Nyw3ICsxOTcsNyBAQAogCiAJCWlmIChzdGF0dXMgPCAwKSB7CiAJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBlcmFzZSAleCwgZXJyICVkXG4iLAotCQkJCXNwaS0+ZGV2LmJ1c19pZCwgcGFnZWFkZHIsIHN0YXR1cyk7CisJCQkJZGV2X25hbWUoJnNwaS0+ZGV2KSwgcGFnZWFkZHIsIHN0YXR1cyk7CiAJCQkvKiBSRVZJU0lUOiAgY2FuIHJldHJ5IGluc3RyLT5yZXRyaWVzIHRpbWVzOyBvcgogCQkJICogZ2l2ZXVwIGFuZCBpbnN0ci0+ZmFpbF9hZGRyID0gaW5zdHItPmFkZHI7CiAJCQkgKi8KQEAgLTIzOSw3ICsyMzksNyBAQAogCWludAkJCXN0YXR1czsKIAogCURFQlVHKE1URF9ERUJVR19MRVZFTDIsICIlczogcmVhZCAweCV4Li4weCV4XG4iLAotCQlwcml2LT5zcGktPmRldi5idXNfaWQsICh1bnNpZ25lZClmcm9tLCAodW5zaWduZWQpKGZyb20gKyBsZW4pKTsKKwkJZGV2X25hbWUoJnByaXYtPnNwaS0+ZGV2KSwgKHVuc2lnbmVkKWZyb20sICh1bnNpZ25lZCkoZnJvbSArIGxlbikpOwogCiAJKnJldGxlbiA9IDA7CiAKQEAgLTI4OCw3ICsyODgsNyBAQAogCQlzdGF0dXMgPSAwOwogCX0gZWxzZQogCQlERUJVRyhNVERfREVCVUdfTEVWRUwxLCAiJXM6IHJlYWQgJXguLiV4IC0tPiAlZFxuIiwKLQkJCXByaXYtPnNwaS0+ZGV2LmJ1c19pZCwKKwkJCWRldl9uYW1lKCZwcml2LT5zcGktPmRldiksCiAJCQkodW5zaWduZWQpZnJvbSwgKHVuc2lnbmVkKShmcm9tICsgbGVuKSwKIAkJCXN0YXR1cyk7CiAJcmV0dXJuIHN0YXR1czsKQEAgLTMxNSw3ICszMTUsNyBAQAogCXVpbnQ4X3QJCQkqY29tbWFuZDsKIAogCURFQlVHKE1URF9ERUJVR19MRVZFTDIsICIlczogd3JpdGUgMHgleC4uMHgleFxuIiwKLQkJc3BpLT5kZXYuYnVzX2lkLCAodW5zaWduZWQpdG8sICh1bnNpZ25lZCkodG8gKyBsZW4pKTsKKwkJZGV2X25hbWUoJnNwaS0+ZGV2KSwgKHVuc2lnbmVkKXRvLCAodW5zaWduZWQpKHRvICsgbGVuKSk7CiAKIAkqcmV0bGVuID0gMDsKIApAQCAtMzc0LDcgKzM3NCw3IEBACiAJCQlzdGF0dXMgPSBzcGlfc3luYyhzcGksICZtc2cpOwogCQkJaWYgKHN0YXR1cyA8IDApCiAJCQkJREVCVUcoTVREX0RFQlVHX0xFVkVMMSwgIiVzOiB4ZmVyICV1IC0+ICVkIFxuIiwKLQkJCQkJc3BpLT5kZXYuYnVzX2lkLCBhZGRyLCBzdGF0dXMpOworCQkJCQlkZXZfbmFtZSgmc3BpLT5kZXYpLCBhZGRyLCBzdGF0dXMpOwogCiAJCQkodm9pZCkgZGF0YWZsYXNoX3dhaXRyZWFkeShwcml2LT5zcGkpOwogCQl9CkBAIC0zOTYsNyArMzk2LDcgQEAKIAkJc3BpX3RyYW5zZmVyX2RlbCh4ICsgMSk7CiAJCWlmIChzdGF0dXMgPCAwKQogCQkJREVCVUcoTVREX0RFQlVHX0xFVkVMMSwgIiVzOiBwZ20gJXUvJXUgLT4gJWQgXG4iLAotCQkJCXNwaS0+ZGV2LmJ1c19pZCwgYWRkciwgd3JpdGVsZW4sIHN0YXR1cyk7CisJCQkJZGV2X25hbWUoJnNwaS0+ZGV2KSwgYWRkciwgd3JpdGVsZW4sIHN0YXR1cyk7CiAKIAkJKHZvaWQpIGRhdGFmbGFzaF93YWl0cmVhZHkocHJpdi0+c3BpKTsKIApAQCAtNDE2LDE0ICs0MTYsMTQgQEAKIAkJc3RhdHVzID0gc3BpX3N5bmMoc3BpLCAmbXNnKTsKIAkJaWYgKHN0YXR1cyA8IDApCiAJCQlERUJVRyhNVERfREVCVUdfTEVWRUwxLCAiJXM6IGNvbXBhcmUgJXUgLT4gJWQgXG4iLAotCQkJCXNwaS0+ZGV2LmJ1c19pZCwgYWRkciwgc3RhdHVzKTsKKwkJCQlkZXZfbmFtZSgmc3BpLT5kZXYpLCBhZGRyLCBzdGF0dXMpOwogCiAJCXN0YXR1cyA9IGRhdGFmbGFzaF93YWl0cmVhZHkocHJpdi0+c3BpKTsKIAogCQkvKiBDaGVjayByZXN1bHQgb2YgdGhlIGNvbXBhcmUgb3BlcmF0aW9uICovCiAJCWlmIChzdGF0dXMgJiAoMSA8PCA2KSkgewogCQkJcHJpbnRrKEtFUk5fRVJSICIlczogY29tcGFyZSBwYWdlICV1LCBlcnIgJWRcbiIsCi0JCQkJc3BpLT5kZXYuYnVzX2lkLCBwYWdlYWRkciwgc3RhdHVzKTsKKwkJCQlkZXZfbmFtZSgmc3BpLT5kZXYpLCBwYWdlYWRkciwgc3RhdHVzKTsKIAkJCXJlbWFpbmluZyA9IDA7CiAJCQlzdGF0dXMgPSAtRUlPOwogCQkJYnJlYWs7CkBAIC03NzksNyArNzc5LDcgQEAKIAl0bXAgPSBzcGlfd3JpdGVfdGhlbl9yZWFkKHNwaSwgJmNvZGUsIDEsIGlkLCAzKTsKIAlpZiAodG1wIDwgMCkgewogCQlERUJVRyhNVERfREVCVUdfTEVWRUwwLCAiJXM6IGVycm9yICVkIHJlYWRpbmcgSkVERUMgSURcbiIsCi0JCQlzcGktPmRldi5idXNfaWQsIHRtcCk7CisJCQlkZXZfbmFtZSgmc3BpLT5kZXYpLCB0bXApOwogCQlyZXR1cm4gRVJSX1BUUih0bXApOwogCX0KIAlpZiAoaWRbMF0gIT0gMHgxZikKQEAgLTg2OSw3ICs4NjksNyBAQAogCXN0YXR1cyA9IGRhdGFmbGFzaF9zdGF0dXMoc3BpKTsKIAlpZiAoc3RhdHVzIDw9IDAgfHwgc3RhdHVzID09IDB4ZmYpIHsKIAkJREVCVUcoTVREX0RFQlVHX0xFVkVMMSwgIiVzOiBzdGF0dXMgZXJyb3IgJWRcbiIsCi0JCQkJc3BpLT5kZXYuYnVzX2lkLCBzdGF0dXMpOworCQkJCWRldl9uYW1lKCZzcGktPmRldiksIHN0YXR1cyk7CiAJCWlmIChzdGF0dXMgPT0gMCB8fCBzdGF0dXMgPT0gMHhmZikKIAkJCXN0YXR1cyA9IC1FTk9ERVY7CiAJCXJldHVybiBzdGF0dXM7CkBAIC05MDUsMTMgKzkwNSwxMyBAQAogCS8qIG9ic29sZXRlIEFUNDVEQjEyODIgbm90ICh5ZXQ/KSBzdXBwb3J0ZWQgKi8KIAlkZWZhdWx0OgogCQlERUJVRyhNVERfREVCVUdfTEVWRUwxLCAiJXM6IHVuc3VwcG9ydGVkIGRldmljZSAoJXgpXG4iLAotCQkJCXNwaS0+ZGV2LmJ1c19pZCwgc3RhdHVzICYgMHgzYyk7CisJCQkJZGV2X25hbWUoJnNwaS0+ZGV2KSwgc3RhdHVzICYgMHgzYyk7CiAJCXN0YXR1cyA9IC1FTk9ERVY7CiAJfQogCiAJaWYgKHN0YXR1cyA8IDApCiAJCURFQlVHKE1URF9ERUJVR19MRVZFTDEsICIlczogYWRkX2RhdGFmbGFzaCAtLT4gJWRcbiIsCi0JCQkJc3BpLT5kZXYuYnVzX2lkLCBzdGF0dXMpOworCQkJCWRldl9uYW1lKCZzcGktPmRldiksIHN0YXR1cyk7CiAKIAlyZXR1cm4gc3RhdHVzOwogfQpAQCAtOTIxLDcgKzkyMSw3IEBACiAJc3RydWN0IGRhdGFmbGFzaAkqZmxhc2ggPSBkZXZfZ2V0X2RydmRhdGEoJnNwaS0+ZGV2KTsKIAlpbnQJCQlzdGF0dXM7CiAKLQlERUJVRyhNVERfREVCVUdfTEVWRUwxLCAiJXM6IHJlbW92ZVxuIiwgc3BpLT5kZXYuYnVzX2lkKTsKKwlERUJVRyhNVERfREVCVUdfTEVWRUwxLCAiJXM6IHJlbW92ZVxuIiwgZGV2X25hbWUoJnNwaS0+ZGV2KSk7CiAKIAlpZiAobXRkX2hhc19wYXJ0aXRpb25zKCkgJiYgZmxhc2gtPnBhcnRpdGlvbmVkKQogCQlzdGF0dXMgPSBkZWxfbXRkX3BhcnRpdGlvbnMoJmZsYXNoLT5tdGQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvZGV2aWNlcy9wbWM1NTEuYyBiL2RyaXZlcnMvbXRkL2RldmljZXMvcG1jNTUxLmMKaW5kZXggZDM4YmNhNi4uZDJmZDU1MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvZGV2aWNlcy9wbWM1NTEuYworKysgYi9kcml2ZXJzL210ZC9kZXZpY2VzL3BtYzU1MS5jCkBAIC0zNCw3ICszNCw3IEBACiAgKglhcGVydHVyZSBzaXplLCBub3QgdGhlIGRyYW0gc2l6ZSwgYW5kIHRoZSBWMzcwUERDIHN1cHBsaWVzIG5vCiAgKglvdGhlciBtZXRob2QgZm9yIG1lbW9yeSBzaXplIGRpc2NvdmVyeS4gIFRoaXMgcHJvYmxlbSBpcwogICoJbW9zdGx5IG9ubHkgcmVsZXZhbnQgd2hlbiBjb21waWxlZCBhcyBhIG1vZHVsZSwgYXMgdGhlCi0gKgl1bmxvYWRpbmcgb2YgdGhlIG1vZHVsZSB3aXRoIGFuIGFwZXJ0dXJlIHNpemUgc21hbGxlciB0aGVuCisgKgl1bmxvYWRpbmcgb2YgdGhlIG1vZHVsZSB3aXRoIGFuIGFwZXJ0dXJlIHNpemUgc21hbGxlciB0aGFuCiAgKgl0aGUgcmFtIHdpbGwgY2F1c2UgdGhlIGRyaXZlciB0byBkZXRlY3QgdGhlIG9uYm9hcmQgbWVtb3J5CiAgKglzaXplIHRvIGJlIGVxdWFsIHRvIHRoZSBhcGVydHVyZSBzaXplIHdoZW4gdGhlIG1vZHVsZSBpcwogICoJcmVsb2FkZWQuICBTb29vbywgdG8gaGVscCwgdGhlIG1vZHVsZSBzdXBwb3J0cyBhbiBtc2l6ZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvZGV2aWNlcy9wczN2cmFtLmMgYi9kcml2ZXJzL210ZC9kZXZpY2VzL3BzM3ZyYW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjFlOWJlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tdGQvZGV2aWNlcy9wczN2cmFtLmMKQEAgLTAsMCArMSw3NjggQEAKKy8qKgorICogcHMzdnJhbSAtIFVzZSBleHRyYSBQUzMgdmlkZW8gcmFtIGFzIE1URCBibG9jayBkZXZpY2UuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggSmltIFBhcmlzIDxqaW1AanRhbi5jb20+CisgKiBBZGRlZCBzdXBwb3J0IFJTWCBETUEgVml2aWVuIENoYXBwZWxpZXIgPHZpdmllbi5jaGFwcGVsaWVyQGZyZWUuZnI+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9nZnAuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9tdGQuaD4KKworI2luY2x1ZGUgPGFzbS9sdjFjYWxsLmg+CisjaW5jbHVkZSA8YXNtL3BzMy5oPgorCisjZGVmaW5lIERFVklDRV9OQU1FCQkicHMzdnJhbSIKKworI2RlZmluZSBYRFJfQlVGX1NJWkUgKDIgKiAxMDI0ICogMTAyNCkgLyogWERSIGJ1ZmZlciAobXVzdCBiZSAxTWlCIGFsaWduZWQpICovCisjZGVmaW5lIFhEUl9JT0lGIDB4MGMwMDAwMDAKKworI2RlZmluZSBGSUZPX0JBU0UgWERSX0lPSUYKKyNkZWZpbmUgRklGT19TSVpFICg2NCAqIDEwMjQpCisKKyNkZWZpbmUgRE1BX1BBR0VfU0laRSAoNCAqIDEwMjQpCisKKyNkZWZpbmUgQ0FDSEVfUEFHRV9TSVpFICgyNTYgKiAxMDI0KQorI2RlZmluZSBDQUNIRV9QQUdFX0NPVU5UICgoWERSX0JVRl9TSVpFIC0gRklGT19TSVpFKSAvIENBQ0hFX1BBR0VfU0laRSkKKworI2RlZmluZSBDQUNIRV9PRkZTRVQgQ0FDSEVfUEFHRV9TSVpFCisjZGVmaW5lIEZJRk9fT0ZGU0VUIDAKKworI2RlZmluZSBDVFJMX1BVVCAweDEwCisjZGVmaW5lIENUUkxfR0VUIDB4MTEKKyNkZWZpbmUgQ1RSTF9UT1AgMHgxNQorCisjZGVmaW5lIFVQTE9BRF9TVUJDSAkxCisjZGVmaW5lIERPV05MT0FEX1NVQkNICTIKKworI2RlZmluZSBOVl9NRU1PUllfVE9fTUVNT1JZX0ZPUk1BVF9PRkZTRVRfSU4JMHgwMDAwMDMwYworI2RlZmluZSBOVl9NRU1PUllfVE9fTUVNT1JZX0ZPUk1BVF9OT1RJRlkJMHgwMDAwMDEwNAorCisjZGVmaW5lIEwxR1BVX0NPTlRFWFRfQVRUUklCVVRFX0ZCX0JMSVQgMHg2MDEKKworc3RydWN0IG10ZF9pbmZvIHBzM3ZyYW1fbXRkOworCisjZGVmaW5lIENBQ0hFX1BBR0VfUFJFU0VOVCAxCisjZGVmaW5lIENBQ0hFX1BBR0VfRElSVFkgICAyCisKK3N0cnVjdCBwczN2cmFtX3RhZyB7CisJdW5zaWduZWQgaW50IGFkZHJlc3M7CisJdW5zaWduZWQgaW50IGZsYWdzOworfTsKKworc3RydWN0IHBzM3ZyYW1fY2FjaGUgeworCXVuc2lnbmVkIGludCBwYWdlX2NvdW50OworCXVuc2lnbmVkIGludCBwYWdlX3NpemU7CisJc3RydWN0IHBzM3ZyYW1fdGFnICp0YWdzOworfTsKKworc3RydWN0IHBzM3ZyYW1fcHJpdiB7CisJdTY0IG1lbW9yeV9oYW5kbGU7CisJdTY0IGNvbnRleHRfaGFuZGxlOworCXUzMiAqY3RybDsKKwl1MzIgKnJlcG9ydHM7CisJdTggX19pb21lbSAqZGRyX2Jhc2U7CisJdTggKnhkcl9idWY7CisKKwl1MzIgKmZpZm9fYmFzZTsKKwl1MzIgKmZpZm9fcHRyOworCisJc3RydWN0IGRldmljZSAqZGV2OworCXN0cnVjdCBwczN2cmFtX2NhY2hlIGNhY2hlOworCisJLyogVXNlZCB0byBzZXJpYWxpemUgY2FjaGUvRE1BIG9wZXJhdGlvbnMgKi8KKwlzdHJ1Y3QgbXV0ZXggbG9jazsKK307CisKKyNkZWZpbmUgRE1BX05PVElGSUVSX0hBTkRMRV9CQVNFIDB4NjY2MDQyMDAgLyogZmlyc3QgRE1BIG5vdGlmaWVyIGhhbmRsZSAqLworI2RlZmluZSBETUFfTk9USUZJRVJfT0ZGU0VUX0JBU0UgMHgxMDAwICAgICAvKiBmaXJzdCBETUEgbm90aWZpZXIgb2Zmc2V0ICovCisjZGVmaW5lIERNQV9OT1RJRklFUl9TSVpFICAgICAgICAweDQwCisjZGVmaW5lIE5PVElGSUVSIDcJLyogbm90aWZpZXIgdXNlZCBmb3IgY29tcGxldGlvbiByZXBvcnQgKi8KKworLyogQSB0cmFpbGluZyAnLScgbWVhbnMgdG8gc3VidHJhY3Qgb2ZmIHBzM2ZiX3ZpZGVvbWVtb3J5LnNpemUgKi8KK2NoYXIgKnNpemUgPSAiMjU2TS0iOworbW9kdWxlX3BhcmFtKHNpemUsIGNoYXJwLCAwKTsKK01PRFVMRV9QQVJNX0RFU0Moc2l6ZSwgIm1lbW9yeSBzaXplIik7CisKK3N0YXRpYyB1MzIgKnBzM3ZyYW1fZ2V0X25vdGlmaWVyKHUzMiAqcmVwb3J0cywgaW50IG5vdGlmaWVyKQoreworCXJldHVybiAodm9pZCAqKSByZXBvcnRzICsKKwkJRE1BX05PVElGSUVSX09GRlNFVF9CQVNFICsKKwkJRE1BX05PVElGSUVSX1NJWkUgKiBub3RpZmllcjsKK30KKworc3RhdGljIHZvaWQgcHMzdnJhbV9ub3RpZmllcl9yZXNldChzdHJ1Y3QgbXRkX2luZm8gKm10ZCkKK3sKKwlpbnQgaTsKKworCXN0cnVjdCBwczN2cmFtX3ByaXYgKnByaXYgPSBtdGQtPnByaXY7CisJdTMyICpub3RpZnkgPSBwczN2cmFtX2dldF9ub3RpZmllcihwcml2LT5yZXBvcnRzLCBOT1RJRklFUik7CisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKwkJbm90aWZ5W2ldID0gMHhmZmZmZmZmZjsKK30KKworc3RhdGljIGludCBwczN2cmFtX25vdGlmaWVyX3dhaXQoc3RydWN0IG10ZF9pbmZvICptdGQsIHVuc2lnbmVkIGludCB0aW1lb3V0X21zKQoreworCXN0cnVjdCBwczN2cmFtX3ByaXYgKnByaXYgPSBtdGQtPnByaXY7CisJdTMyICpub3RpZnkgPSBwczN2cmFtX2dldF9ub3RpZmllcihwcml2LT5yZXBvcnRzLCBOT1RJRklFUik7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0ID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXModGltZW91dF9tcyk7CisKKwlkbyB7CisJCWlmICghbm90aWZ5WzNdKQorCQkJcmV0dXJuIDA7CisJCW1zbGVlcCgxKTsKKwl9IHdoaWxlICh0aW1lX2JlZm9yZShqaWZmaWVzLCB0aW1lb3V0KSk7CisKKwlyZXR1cm4gLUVUSU1FRE9VVDsKK30KKworc3RhdGljIHZvaWQgcHMzdnJhbV9pbml0X3Jpbmcoc3RydWN0IG10ZF9pbmZvICptdGQpCit7CisJc3RydWN0IHBzM3ZyYW1fcHJpdiAqcHJpdiA9IG10ZC0+cHJpdjsKKworCXByaXYtPmN0cmxbQ1RSTF9QVVRdID0gRklGT19CQVNFICsgRklGT19PRkZTRVQ7CisJcHJpdi0+Y3RybFtDVFJMX0dFVF0gPSBGSUZPX0JBU0UgKyBGSUZPX09GRlNFVDsKK30KKworc3RhdGljIGludCBwczN2cmFtX3dhaXRfcmluZyhzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgdW5zaWduZWQgaW50IHRpbWVvdXRfbXMpCit7CisJc3RydWN0IHBzM3ZyYW1fcHJpdiAqcHJpdiA9IG10ZC0+cHJpdjsKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyh0aW1lb3V0X21zKTsKKworCWRvIHsKKwkJaWYgKHByaXYtPmN0cmxbQ1RSTF9QVVRdID09IHByaXYtPmN0cmxbQ1RSTF9HRVRdKQorCQkJcmV0dXJuIDA7CisJCW1zbGVlcCgxKTsKKwl9IHdoaWxlICh0aW1lX2JlZm9yZShqaWZmaWVzLCB0aW1lb3V0KSk7CisKKwlkZXZfZGJnKHByaXYtPmRldiwgIiVzOiVkOiBGSUZPIHRpbWVvdXQgKCUwOHgvJTA4eC8lMDh4KVxuIiwgX19mdW5jX18sCisJCV9fTElORV9fLCBwcml2LT5jdHJsW0NUUkxfUFVUXSwgcHJpdi0+Y3RybFtDVFJMX0dFVF0sCisJCXByaXYtPmN0cmxbQ1RSTF9UT1BdKTsKKworCXJldHVybiAtRVRJTUVET1VUOworfQorCitzdGF0aWMgdm9pZCBwczN2cmFtX291dF9yaW5nKHN0cnVjdCBwczN2cmFtX3ByaXYgKnByaXYsIHUzMiBkYXRhKQoreworCSoocHJpdi0+Zmlmb19wdHIpKysgPSBkYXRhOworfQorCitzdGF0aWMgdm9pZCBwczN2cmFtX2JlZ2luX3Jpbmcoc3RydWN0IHBzM3ZyYW1fcHJpdiAqcHJpdiwgdTMyIGNoYW4sCisJCQkJICAgICAgdTMyIHRhZywgdTMyIHNpemUpCit7CisJcHMzdnJhbV9vdXRfcmluZyhwcml2LCAoc2l6ZSA8PCAxOCkgfCAoY2hhbiA8PCAxMykgfCB0YWcpOworfQorCitzdGF0aWMgdm9pZCBwczN2cmFtX3Jld2luZF9yaW5nKHN0cnVjdCBtdGRfaW5mbyAqbXRkKQoreworCXN0cnVjdCBwczN2cmFtX3ByaXYgKnByaXYgPSBtdGQtPnByaXY7CisJdTY0IHN0YXR1czsKKworCXBzM3ZyYW1fb3V0X3JpbmcocHJpdiwgMHgyMDAwMDAwMCB8IChGSUZPX0JBU0UgKyBGSUZPX09GRlNFVCkpOworCisJcHJpdi0+Y3RybFtDVFJMX1BVVF0gPSBGSUZPX0JBU0UgKyBGSUZPX09GRlNFVDsKKworCS8qIGFza2luZyB0aGUgSFYgZm9yIGEgYmxpdCB3aWxsIGtpY2sgdGhlIGZpZm8gKi8KKwlzdGF0dXMgPSBsdjFfZ3B1X2NvbnRleHRfYXR0cmlidXRlKHByaXYtPmNvbnRleHRfaGFuZGxlLAorCQkJCQkgICBMMUdQVV9DT05URVhUX0FUVFJJQlVURV9GQl9CTElULAorCQkJCQkgICAwLCAwLCAwLCAwKTsKKwlpZiAoc3RhdHVzKQorCQlkZXZfZXJyKHByaXYtPmRldiwgIiVzOiVkOiBsdjFfZ3B1X2NvbnRleHRfYXR0cmlidXRlIGZhaWxlZFxuIiwKKwkJCV9fZnVuY19fLCBfX0xJTkVfXyk7CisKKwlwcml2LT5maWZvX3B0ciA9IHByaXYtPmZpZm9fYmFzZTsKK30KKworc3RhdGljIHZvaWQgcHMzdnJhbV9maXJlX3Jpbmcoc3RydWN0IG10ZF9pbmZvICptdGQpCit7CisJc3RydWN0IHBzM3ZyYW1fcHJpdiAqcHJpdiA9IG10ZC0+cHJpdjsKKwl1NjQgc3RhdHVzOworCisJbXV0ZXhfbG9jaygmcHMzX2dwdV9tdXRleCk7CisKKwlwcml2LT5jdHJsW0NUUkxfUFVUXSA9IEZJRk9fQkFTRSArIEZJRk9fT0ZGU0VUICsKKwkJKHByaXYtPmZpZm9fcHRyIC0gcHJpdi0+Zmlmb19iYXNlKSAqIHNpemVvZih1MzIpOworCisJLyogYXNraW5nIHRoZSBIViBmb3IgYSBibGl0IHdpbGwga2ljayB0aGUgZmlmbyAqLworCXN0YXR1cyA9IGx2MV9ncHVfY29udGV4dF9hdHRyaWJ1dGUocHJpdi0+Y29udGV4dF9oYW5kbGUsCisJCQkJCSAgIEwxR1BVX0NPTlRFWFRfQVRUUklCVVRFX0ZCX0JMSVQsCisJCQkJCSAgIDAsIDAsIDAsIDApOworCWlmIChzdGF0dXMpCisJCWRldl9lcnIocHJpdi0+ZGV2LCAiJXM6JWQ6IGx2MV9ncHVfY29udGV4dF9hdHRyaWJ1dGUgZmFpbGVkXG4iLAorCQkJX19mdW5jX18sIF9fTElORV9fKTsKKworCWlmICgocHJpdi0+Zmlmb19wdHIgLSBwcml2LT5maWZvX2Jhc2UpICogc2l6ZW9mKHUzMikgPgorCQlGSUZPX1NJWkUgLSAxMDI0KSB7CisJCWRldl9kYmcocHJpdi0+ZGV2LCAiJXM6JWQ6IGZpZm8gZnVsbCwgcmV3aW5kaW5nXG4iLCBfX2Z1bmNfXywKKwkJCV9fTElORV9fKTsKKwkJcHMzdnJhbV93YWl0X3JpbmcobXRkLCAyMDApOworCQlwczN2cmFtX3Jld2luZF9yaW5nKG10ZCk7CisJfQorCisJbXV0ZXhfdW5sb2NrKCZwczNfZ3B1X211dGV4KTsKK30KKworc3RhdGljIHZvaWQgcHMzdnJhbV9iaW5kKHN0cnVjdCBtdGRfaW5mbyAqbXRkKQoreworCXN0cnVjdCBwczN2cmFtX3ByaXYgKnByaXYgPSBtdGQtPnByaXY7CisKKwlwczN2cmFtX2JlZ2luX3JpbmcocHJpdiwgVVBMT0FEX1NVQkNILCAwLCAxKTsKKwlwczN2cmFtX291dF9yaW5nKHByaXYsIDB4MzEzMzczMDMpOworCXBzM3ZyYW1fYmVnaW5fcmluZyhwcml2LCBVUExPQURfU1VCQ0gsIDB4MTgwLCAzKTsKKwlwczN2cmFtX291dF9yaW5nKHByaXYsIERNQV9OT1RJRklFUl9IQU5ETEVfQkFTRSArIE5PVElGSUVSKTsKKwlwczN2cmFtX291dF9yaW5nKHByaXYsIDB4ZmVlZDAwMDEpOwkvKiBETUEgc3lzdGVtIFJBTSBpbnN0YW5jZSAqLworCXBzM3ZyYW1fb3V0X3JpbmcocHJpdiwgMHhmZWVkMDAwMCk7ICAgICAvKiBETUEgdmlkZW8gUkFNIGluc3RhbmNlICovCisKKwlwczN2cmFtX2JlZ2luX3JpbmcocHJpdiwgRE9XTkxPQURfU1VCQ0gsIDAsIDEpOworCXBzM3ZyYW1fb3V0X3JpbmcocHJpdiwgMHgzMTM3YzBkZSk7CisJcHMzdnJhbV9iZWdpbl9yaW5nKHByaXYsIERPV05MT0FEX1NVQkNILCAweDE4MCwgMyk7CisJcHMzdnJhbV9vdXRfcmluZyhwcml2LCBETUFfTk9USUZJRVJfSEFORExFX0JBU0UgKyBOT1RJRklFUik7CisJcHMzdnJhbV9vdXRfcmluZyhwcml2LCAweGZlZWQwMDAwKTsJLyogRE1BIHZpZGVvIFJBTSBpbnN0YW5jZSAqLworCXBzM3ZyYW1fb3V0X3JpbmcocHJpdiwgMHhmZWVkMDAwMSk7CS8qIERNQSBzeXN0ZW0gUkFNIGluc3RhbmNlICovCisKKwlwczN2cmFtX2ZpcmVfcmluZyhtdGQpOworfQorCitzdGF0aWMgaW50IHBzM3ZyYW1fdXBsb2FkKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCB1bnNpZ25lZCBpbnQgc3JjX29mZnNldCwKKwkJCSAgdW5zaWduZWQgaW50IGRzdF9vZmZzZXQsIGludCBsZW4sIGludCBjb3VudCkKK3sKKwlzdHJ1Y3QgcHMzdnJhbV9wcml2ICpwcml2ID0gbXRkLT5wcml2OworCisJcHMzdnJhbV9iZWdpbl9yaW5nKHByaXYsIFVQTE9BRF9TVUJDSCwKKwkJCSAgIE5WX01FTU9SWV9UT19NRU1PUllfRk9STUFUX09GRlNFVF9JTiwgOCk7CisJcHMzdnJhbV9vdXRfcmluZyhwcml2LCBYRFJfSU9JRiArIHNyY19vZmZzZXQpOworCXBzM3ZyYW1fb3V0X3JpbmcocHJpdiwgZHN0X29mZnNldCk7CisJcHMzdnJhbV9vdXRfcmluZyhwcml2LCBsZW4pOworCXBzM3ZyYW1fb3V0X3JpbmcocHJpdiwgbGVuKTsKKwlwczN2cmFtX291dF9yaW5nKHByaXYsIGxlbik7CisJcHMzdnJhbV9vdXRfcmluZyhwcml2LCBjb3VudCk7CisJcHMzdnJhbV9vdXRfcmluZyhwcml2LCAoMSA8PCA4KSB8IDEpOworCXBzM3ZyYW1fb3V0X3JpbmcocHJpdiwgMCk7CisKKwlwczN2cmFtX25vdGlmaWVyX3Jlc2V0KG10ZCk7CisJcHMzdnJhbV9iZWdpbl9yaW5nKHByaXYsIFVQTE9BRF9TVUJDSCwKKwkJCSAgIE5WX01FTU9SWV9UT19NRU1PUllfRk9STUFUX05PVElGWSwgMSk7CisJcHMzdnJhbV9vdXRfcmluZyhwcml2LCAwKTsKKwlwczN2cmFtX2JlZ2luX3JpbmcocHJpdiwgVVBMT0FEX1NVQkNILCAweDEwMCwgMSk7CisJcHMzdnJhbV9vdXRfcmluZyhwcml2LCAwKTsKKwlwczN2cmFtX2ZpcmVfcmluZyhtdGQpOworCWlmIChwczN2cmFtX25vdGlmaWVyX3dhaXQobXRkLCAyMDApIDwgMCkgeworCQlkZXZfZGJnKHByaXYtPmRldiwgIiVzOiVkOiBub3RpZmllciB0aW1lb3V0XG4iLCBfX2Z1bmNfXywKKwkJCV9fTElORV9fKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBzM3ZyYW1fZG93bmxvYWQoc3RydWN0IG10ZF9pbmZvICptdGQsIHVuc2lnbmVkIGludCBzcmNfb2Zmc2V0LAorCQkJICAgIHVuc2lnbmVkIGludCBkc3Rfb2Zmc2V0LCBpbnQgbGVuLCBpbnQgY291bnQpCit7CisJc3RydWN0IHBzM3ZyYW1fcHJpdiAqcHJpdiA9IG10ZC0+cHJpdjsKKworCXBzM3ZyYW1fYmVnaW5fcmluZyhwcml2LCBET1dOTE9BRF9TVUJDSCwKKwkJCSAgIE5WX01FTU9SWV9UT19NRU1PUllfRk9STUFUX09GRlNFVF9JTiwgOCk7CisJcHMzdnJhbV9vdXRfcmluZyhwcml2LCBzcmNfb2Zmc2V0KTsKKwlwczN2cmFtX291dF9yaW5nKHByaXYsIFhEUl9JT0lGICsgZHN0X29mZnNldCk7CisJcHMzdnJhbV9vdXRfcmluZyhwcml2LCBsZW4pOworCXBzM3ZyYW1fb3V0X3JpbmcocHJpdiwgbGVuKTsKKwlwczN2cmFtX291dF9yaW5nKHByaXYsIGxlbik7CisJcHMzdnJhbV9vdXRfcmluZyhwcml2LCBjb3VudCk7CisJcHMzdnJhbV9vdXRfcmluZyhwcml2LCAoMSA8PCA4KSB8IDEpOworCXBzM3ZyYW1fb3V0X3JpbmcocHJpdiwgMCk7CisKKwlwczN2cmFtX25vdGlmaWVyX3Jlc2V0KG10ZCk7CisJcHMzdnJhbV9iZWdpbl9yaW5nKHByaXYsIERPV05MT0FEX1NVQkNILAorCQkJICAgTlZfTUVNT1JZX1RPX01FTU9SWV9GT1JNQVRfTk9USUZZLCAxKTsKKwlwczN2cmFtX291dF9yaW5nKHByaXYsIDApOworCXBzM3ZyYW1fYmVnaW5fcmluZyhwcml2LCBET1dOTE9BRF9TVUJDSCwgMHgxMDAsIDEpOworCXBzM3ZyYW1fb3V0X3JpbmcocHJpdiwgMCk7CisJcHMzdnJhbV9maXJlX3JpbmcobXRkKTsKKwlpZiAocHMzdnJhbV9ub3RpZmllcl93YWl0KG10ZCwgMjAwKSA8IDApIHsKKwkJZGV2X2RiZyhwcml2LT5kZXYsICIlczolZDogbm90aWZpZXIgdGltZW91dFxuIiwgX19mdW5jX18sCisJCQlfX0xJTkVfXyk7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcHMzdnJhbV9jYWNoZV9ldmljdChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgaW50IGVudHJ5KQoreworCXN0cnVjdCBwczN2cmFtX3ByaXYgKnByaXYgPSBtdGQtPnByaXY7CisJc3RydWN0IHBzM3ZyYW1fY2FjaGUgKmNhY2hlID0gJnByaXYtPmNhY2hlOworCisJaWYgKGNhY2hlLT50YWdzW2VudHJ5XS5mbGFncyAmIENBQ0hFX1BBR0VfRElSVFkpIHsKKwkJZGV2X2RiZyhwcml2LT5kZXYsICIlczolZDogZmx1c2hpbmcgJWQgOiAweCUwOHhcbiIsIF9fZnVuY19fLAorCQkJX19MSU5FX18sIGVudHJ5LCBjYWNoZS0+dGFnc1tlbnRyeV0uYWRkcmVzcyk7CisJCWlmIChwczN2cmFtX3VwbG9hZChtdGQsCisJCQkJICAgQ0FDSEVfT0ZGU0VUICsgZW50cnkgKiBjYWNoZS0+cGFnZV9zaXplLAorCQkJCSAgIGNhY2hlLT50YWdzW2VudHJ5XS5hZGRyZXNzLAorCQkJCSAgIERNQV9QQUdFX1NJWkUsCisJCQkJICAgY2FjaGUtPnBhZ2Vfc2l6ZSAvIERNQV9QQUdFX1NJWkUpIDwgMCkgeworCQkJZGV2X2RiZyhwcml2LT5kZXYsICIlczolZDogZmFpbGVkIHRvIHVwbG9hZCBmcm9tICIKKwkJCQkiMHgleCB0byAweCV4IHNpemUgMHgleFxuIiwgX19mdW5jX18sIF9fTElORV9fLAorCQkJCWVudHJ5ICogY2FjaGUtPnBhZ2Vfc2l6ZSwKKwkJCQljYWNoZS0+dGFnc1tlbnRyeV0uYWRkcmVzcywgY2FjaGUtPnBhZ2Vfc2l6ZSk7CisJCX0KKwkJY2FjaGUtPnRhZ3NbZW50cnldLmZsYWdzICY9IH5DQUNIRV9QQUdFX0RJUlRZOworCX0KK30KKworc3RhdGljIHZvaWQgcHMzdnJhbV9jYWNoZV9sb2FkKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBpbnQgZW50cnksCisJCQkgICAgICAgdW5zaWduZWQgaW50IGFkZHJlc3MpCit7CisJc3RydWN0IHBzM3ZyYW1fcHJpdiAqcHJpdiA9IG10ZC0+cHJpdjsKKwlzdHJ1Y3QgcHMzdnJhbV9jYWNoZSAqY2FjaGUgPSAmcHJpdi0+Y2FjaGU7CisKKwlkZXZfZGJnKHByaXYtPmRldiwgIiVzOiVkOiBmZXRjaGluZyAlZCA6IDB4JTA4eFxuIiwgX19mdW5jX18sIF9fTElORV9fLAorCQllbnRyeSwgYWRkcmVzcyk7CisJaWYgKHBzM3ZyYW1fZG93bmxvYWQobXRkLAorCQkJICAgICBhZGRyZXNzLAorCQkJICAgICBDQUNIRV9PRkZTRVQgKyBlbnRyeSAqIGNhY2hlLT5wYWdlX3NpemUsCisJCQkgICAgIERNQV9QQUdFX1NJWkUsCisJCQkgICAgIGNhY2hlLT5wYWdlX3NpemUgLyBETUFfUEFHRV9TSVpFKSA8IDApIHsKKwkJZGV2X2Vycihwcml2LT5kZXYsICIlczolZDogZmFpbGVkIHRvIGRvd25sb2FkIGZyb20gIgorCQkJIjB4JXggdG8gMHgleCBzaXplIDB4JXhcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgYWRkcmVzcywKKwkJCWVudHJ5ICogY2FjaGUtPnBhZ2Vfc2l6ZSwgY2FjaGUtPnBhZ2Vfc2l6ZSk7CisJfQorCisJY2FjaGUtPnRhZ3NbZW50cnldLmFkZHJlc3MgPSBhZGRyZXNzOworCWNhY2hlLT50YWdzW2VudHJ5XS5mbGFncyB8PSBDQUNIRV9QQUdFX1BSRVNFTlQ7Cit9CisKKworc3RhdGljIHZvaWQgcHMzdnJhbV9jYWNoZV9mbHVzaChzdHJ1Y3QgbXRkX2luZm8gKm10ZCkKK3sKKwlzdHJ1Y3QgcHMzdnJhbV9wcml2ICpwcml2ID0gbXRkLT5wcml2OworCXN0cnVjdCBwczN2cmFtX2NhY2hlICpjYWNoZSA9ICZwcml2LT5jYWNoZTsKKwlpbnQgaTsKKworCWRldl9kYmcocHJpdi0+ZGV2LCAiJXM6JWQ6IEZMVVNIXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCWZvciAoaSA9IDA7IGkgPCBjYWNoZS0+cGFnZV9jb3VudDsgaSsrKSB7CisJCXBzM3ZyYW1fY2FjaGVfZXZpY3QobXRkLCBpKTsKKwkJY2FjaGUtPnRhZ3NbaV0uZmxhZ3MgPSAwOworCX0KK30KKworc3RhdGljIHVuc2lnbmVkIGludCBwczN2cmFtX2NhY2hlX21hdGNoKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBsb2ZmX3QgYWRkcmVzcykKK3sKKwlzdHJ1Y3QgcHMzdnJhbV9wcml2ICpwcml2ID0gbXRkLT5wcml2OworCXN0cnVjdCBwczN2cmFtX2NhY2hlICpjYWNoZSA9ICZwcml2LT5jYWNoZTsKKwl1bnNpZ25lZCBpbnQgYmFzZTsKKwl1bnNpZ25lZCBpbnQgb2Zmc2V0OworCWludCBpOworCXN0YXRpYyBpbnQgY291bnRlcjsKKworCW9mZnNldCA9ICh1bnNpZ25lZCBpbnQpIChhZGRyZXNzICYgKGNhY2hlLT5wYWdlX3NpemUgLSAxKSk7CisJYmFzZSA9ICh1bnNpZ25lZCBpbnQpIChhZGRyZXNzIC0gb2Zmc2V0KTsKKworCS8qIGZ1bGx5IGFzc29jaWF0aXZlIGNoZWNrICovCisJZm9yIChpID0gMDsgaSA8IGNhY2hlLT5wYWdlX2NvdW50OyBpKyspIHsKKwkJaWYgKChjYWNoZS0+dGFnc1tpXS5mbGFncyAmIENBQ0hFX1BBR0VfUFJFU0VOVCkgJiYKKwkJICAgIGNhY2hlLT50YWdzW2ldLmFkZHJlc3MgPT0gYmFzZSkgeworCQkJZGV2X2RiZyhwcml2LT5kZXYsICIlczolZDogZm91bmQgZW50cnkgJWQgOiAweCUwOHhcbiIsCisJCQkJX19mdW5jX18sIF9fTElORV9fLCBpLCBjYWNoZS0+dGFnc1tpXS5hZGRyZXNzKTsKKwkJCXJldHVybiBpOworCQl9CisJfQorCisJLyogY2hvb3NlIGEgcmFuZG9tIGVudHJ5ICovCisJaSA9IChqaWZmaWVzICsgKGNvdW50ZXIrKykpICUgY2FjaGUtPnBhZ2VfY291bnQ7CisJZGV2X2RiZyhwcml2LT5kZXYsICIlczolZDogdXNpbmcgZW50cnkgJWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgaSk7CisKKwlwczN2cmFtX2NhY2hlX2V2aWN0KG10ZCwgaSk7CisJcHMzdnJhbV9jYWNoZV9sb2FkKG10ZCwgaSwgYmFzZSk7CisKKwlyZXR1cm4gaTsKK30KKworc3RhdGljIGludCBwczN2cmFtX2NhY2hlX2luaXQoc3RydWN0IG10ZF9pbmZvICptdGQpCit7CisJc3RydWN0IHBzM3ZyYW1fcHJpdiAqcHJpdiA9IG10ZC0+cHJpdjsKKworCXByaXYtPmNhY2hlLnBhZ2VfY291bnQgPSBDQUNIRV9QQUdFX0NPVU5UOworCXByaXYtPmNhY2hlLnBhZ2Vfc2l6ZSA9IENBQ0hFX1BBR0VfU0laRTsKKwlwcml2LT5jYWNoZS50YWdzID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHBzM3ZyYW1fdGFnKSAqCisJCQkJICAgQ0FDSEVfUEFHRV9DT1VOVCwgR0ZQX0tFUk5FTCk7CisJaWYgKHByaXYtPmNhY2hlLnRhZ3MgPT0gTlVMTCkgeworCQlkZXZfZXJyKHByaXYtPmRldiwgIiVzOiVkOiBjb3VsZCBub3QgYWxsb2NhdGUgY2FjaGUgdGFnc1xuIiwKKwkJCV9fZnVuY19fLCBfX0xJTkVfXyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWRldl9pbmZvKHByaXYtPmRldiwgImNyZWF0ZWQgcmFtIGNhY2hlOiAlZCBlbnRyaWVzLCAlZCBLaUIgZWFjaFxuIiwKKwkJQ0FDSEVfUEFHRV9DT1VOVCwgQ0FDSEVfUEFHRV9TSVpFIC8gMTAyNCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcHMzdnJhbV9jYWNoZV9jbGVhbnVwKHN0cnVjdCBtdGRfaW5mbyAqbXRkKQoreworCXN0cnVjdCBwczN2cmFtX3ByaXYgKnByaXYgPSBtdGQtPnByaXY7CisKKwlwczN2cmFtX2NhY2hlX2ZsdXNoKG10ZCk7CisJa2ZyZWUocHJpdi0+Y2FjaGUudGFncyk7Cit9CisKK3N0YXRpYyBpbnQgcHMzdnJhbV9lcmFzZShzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgc3RydWN0IGVyYXNlX2luZm8gKmluc3RyKQoreworCXN0cnVjdCBwczN2cmFtX3ByaXYgKnByaXYgPSBtdGQtPnByaXY7CisKKwlpZiAoaW5zdHItPmFkZHIgKyBpbnN0ci0+bGVuID4gbXRkLT5zaXplKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW11dGV4X2xvY2soJnByaXYtPmxvY2spOworCisJcHMzdnJhbV9jYWNoZV9mbHVzaChtdGQpOworCisJLyogU2V0IGJ5dGVzIHRvIDB4RkYgKi8KKwltZW1zZXRfaW8ocHJpdi0+ZGRyX2Jhc2UgKyBpbnN0ci0+YWRkciwgMHhGRiwgaW5zdHItPmxlbik7CisKKwltdXRleF91bmxvY2soJnByaXYtPmxvY2spOworCisJaW5zdHItPnN0YXRlID0gTVREX0VSQVNFX0RPTkU7CisJbXRkX2VyYXNlX2NhbGxiYWNrKGluc3RyKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBzM3ZyYW1fcmVhZChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IGZyb20sIHNpemVfdCBsZW4sCisJCQlzaXplX3QgKnJldGxlbiwgdV9jaGFyICpidWYpCit7CisJc3RydWN0IHBzM3ZyYW1fcHJpdiAqcHJpdiA9IG10ZC0+cHJpdjsKKwl1bnNpZ25lZCBpbnQgY2FjaGVkLCBjb3VudDsKKworCWRldl9kYmcocHJpdi0+ZGV2LCAiJXM6JWQ6IGZyb209MHglMDh4IGxlbj0weCV6eFxuIiwgX19mdW5jX18sIF9fTElORV9fLAorCQkodW5zaWduZWQgaW50KWZyb20sIGxlbik7CisKKwlpZiAoZnJvbSA+PSBtdGQtPnNpemUpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGxlbiA+IG10ZC0+c2l6ZSAtIGZyb20pCisJCWxlbiA9IG10ZC0+c2l6ZSAtIGZyb207CisKKwkvKiBDb3B5IGZyb20gdnJhbSB0byBidWYgKi8KKwljb3VudCA9IGxlbjsKKwl3aGlsZSAoY291bnQpIHsKKwkJdW5zaWduZWQgaW50IG9mZnNldCwgYXZhaWw7CisJCXVuc2lnbmVkIGludCBlbnRyeTsKKworCQlvZmZzZXQgPSAodW5zaWduZWQgaW50KSAoZnJvbSAmIChwcml2LT5jYWNoZS5wYWdlX3NpemUgLSAxKSk7CisJCWF2YWlsICA9IHByaXYtPmNhY2hlLnBhZ2Vfc2l6ZSAtIG9mZnNldDsKKworCQltdXRleF9sb2NrKCZwcml2LT5sb2NrKTsKKworCQllbnRyeSA9IHBzM3ZyYW1fY2FjaGVfbWF0Y2gobXRkLCBmcm9tKTsKKwkJY2FjaGVkID0gQ0FDSEVfT0ZGU0VUICsgZW50cnkgKiBwcml2LT5jYWNoZS5wYWdlX3NpemUgKyBvZmZzZXQ7CisKKwkJZGV2X2RiZyhwcml2LT5kZXYsICIlczolZDogZnJvbT0lMDh4IGNhY2hlZD0lMDh4IG9mZnNldD0lMDh4ICIKKwkJCSJhdmFpbD0lMDh4IGNvdW50PSUwOHhcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKKwkJCSh1bnNpZ25lZCBpbnQpZnJvbSwgY2FjaGVkLCBvZmZzZXQsIGF2YWlsLCBjb3VudCk7CisKKwkJaWYgKGF2YWlsID4gY291bnQpCisJCQlhdmFpbCA9IGNvdW50OworCQltZW1jcHkoYnVmLCBwcml2LT54ZHJfYnVmICsgY2FjaGVkLCBhdmFpbCk7CisKKwkJbXV0ZXhfdW5sb2NrKCZwcml2LT5sb2NrKTsKKworCQlidWYgKz0gYXZhaWw7CisJCWNvdW50IC09IGF2YWlsOworCQlmcm9tICs9IGF2YWlsOworCX0KKworCSpyZXRsZW4gPSBsZW47CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHMzdnJhbV93cml0ZShzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IHRvLCBzaXplX3QgbGVuLAorCQkJIHNpemVfdCAqcmV0bGVuLCBjb25zdCB1X2NoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgcHMzdnJhbV9wcml2ICpwcml2ID0gbXRkLT5wcml2OworCXVuc2lnbmVkIGludCBjYWNoZWQsIGNvdW50OworCisJaWYgKHRvID49IG10ZC0+c2l6ZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAobGVuID4gbXRkLT5zaXplIC0gdG8pCisJCWxlbiA9IG10ZC0+c2l6ZSAtIHRvOworCisJLyogQ29weSBmcm9tIGJ1ZiB0byB2cmFtICovCisJY291bnQgPSBsZW47CisJd2hpbGUgKGNvdW50KSB7CisJCXVuc2lnbmVkIGludCBvZmZzZXQsIGF2YWlsOworCQl1bnNpZ25lZCBpbnQgZW50cnk7CisKKwkJb2Zmc2V0ID0gKHVuc2lnbmVkIGludCkgKHRvICYgKHByaXYtPmNhY2hlLnBhZ2Vfc2l6ZSAtIDEpKTsKKwkJYXZhaWwgID0gcHJpdi0+Y2FjaGUucGFnZV9zaXplIC0gb2Zmc2V0OworCisJCW11dGV4X2xvY2soJnByaXYtPmxvY2spOworCisJCWVudHJ5ID0gcHMzdnJhbV9jYWNoZV9tYXRjaChtdGQsIHRvKTsKKwkJY2FjaGVkID0gQ0FDSEVfT0ZGU0VUICsgZW50cnkgKiBwcml2LT5jYWNoZS5wYWdlX3NpemUgKyBvZmZzZXQ7CisKKwkJZGV2X2RiZyhwcml2LT5kZXYsICIlczolZDogdG89JTA4eCBjYWNoZWQ9JTA4eCBvZmZzZXQ9JTA4eCAiCisJCQkiYXZhaWw9JTA4eCBjb3VudD0lMDh4XG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCisJCQkodW5zaWduZWQgaW50KXRvLCBjYWNoZWQsIG9mZnNldCwgYXZhaWwsIGNvdW50KTsKKworCQlpZiAoYXZhaWwgPiBjb3VudCkKKwkJCWF2YWlsID0gY291bnQ7CisJCW1lbWNweShwcml2LT54ZHJfYnVmICsgY2FjaGVkLCBidWYsIGF2YWlsKTsKKworCQlwcml2LT5jYWNoZS50YWdzW2VudHJ5XS5mbGFncyB8PSBDQUNIRV9QQUdFX0RJUlRZOworCisJCW11dGV4X3VubG9jaygmcHJpdi0+bG9jayk7CisKKwkJYnVmICs9IGF2YWlsOworCQljb3VudCAtPSBhdmFpbDsKKwkJdG8gKz0gYXZhaWw7CisJfQorCisJKnJldGxlbiA9IGxlbjsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgcHMzdnJhbV9wcm9iZShzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHBzM3ZyYW1fcHJpdiAqcHJpdjsKKwlpbnQgc3RhdHVzOworCXU2NCBkZHJfbHBhcjsKKwl1NjQgY3RybF9scGFyOworCXU2NCBpbmZvX2xwYXI7CisJdTY0IHJlcG9ydHNfbHBhcjsKKwl1NjQgZGRyX3NpemU7CisJdTY0IHJlcG9ydHNfc2l6ZTsKKwlpbnQgcmV0ID0gLUVOT01FTTsKKwljaGFyICpyZXN0OworCisJcmV0ID0gLUVJTzsKKwlwczN2cmFtX210ZC5wcml2ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHBzM3ZyYW1fcHJpdiksIEdGUF9LRVJORUwpOworCWlmICghcHMzdnJhbV9tdGQucHJpdikKKwkJZ290byBvdXQ7CisJcHJpdiA9IHBzM3ZyYW1fbXRkLnByaXY7CisKKwltdXRleF9pbml0KCZwcml2LT5sb2NrKTsKKwlwcml2LT5kZXYgPSAmZGV2LT5jb3JlOworCisJLyogQWxsb2NhdGUgWERSIGJ1ZmZlciAoMU1pQiBhbGlnbmVkKSAqLworCXByaXYtPnhkcl9idWYgPSAodm9pZCAqKV9fZ2V0X2ZyZWVfcGFnZXMoR0ZQX0tFUk5FTCwKKwkJZ2V0X29yZGVyKFhEUl9CVUZfU0laRSkpOworCWlmIChwcml2LT54ZHJfYnVmID09IE5VTEwpIHsKKwkJZGV2X2RiZygmZGV2LT5jb3JlLCAiJXM6JWQ6IGNvdWxkIG5vdCBhbGxvY2F0ZSBYRFIgYnVmZmVyXG4iLAorCQkJX19mdW5jX18sIF9fTElORV9fKTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBvdXRfZnJlZV9wcml2OworCX0KKworCS8qIFB1dCBGSUZPIGF0IGJlZ2dpbm5pbmcgb2YgWERSIGJ1ZmZlciAqLworCXByaXYtPmZpZm9fYmFzZSA9ICh1MzIgKikgKHByaXYtPnhkcl9idWYgKyBGSUZPX09GRlNFVCk7CisJcHJpdi0+Zmlmb19wdHIgPSBwcml2LT5maWZvX2Jhc2U7CisKKwkvKiBYWFg6IE5lZWQgdG8gb3BlbiBHUFUsIGluIGNhc2UgcHMzZmIgb3Igc25kX3BzMyBhcmVuJ3QgbG9hZGVkICovCisJaWYgKHBzM19vcGVuX2h2X2RldmljZShkZXYpKSB7CisJCWRldl9lcnIoJmRldi0+Y29yZSwgIiVzOiVkOiBwczNfb3Blbl9odl9kZXZpY2UgZmFpbGVkXG4iLAorCQkJX19mdW5jX18sIF9fTElORV9fKTsKKwkJcmV0ID0gLUVBR0FJTjsKKwkJZ290byBvdXRfY2xvc2VfZ3B1OworCX0KKworCS8qIFJlcXVlc3QgbWVtb3J5ICovCisJc3RhdHVzID0gLTE7CisJZGRyX3NpemUgPSBtZW1wYXJzZShzaXplLCAmcmVzdCk7CisJaWYgKCpyZXN0ID09ICctJykKKwkJZGRyX3NpemUgLT0gcHMzZmJfdmlkZW9tZW1vcnkuc2l6ZTsKKwlkZHJfc2l6ZSA9IEFMSUdOKGRkcl9zaXplLCAxMDI0KjEwMjQpOworCWlmIChkZHJfc2l6ZSA8PSAwKSB7CisJCWRldl9lcnIoJmRldi0+Y29yZSwgIiVzOiVkOiBzcGVjaWZpZWQgc2l6ZSBpcyB0b28gc21hbGxcbiIsCisJCQlfX2Z1bmNfXywgX19MSU5FX18pOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIG91dF9jbG9zZV9ncHU7CisJfQorCisJd2hpbGUgKGRkcl9zaXplID4gMCkgeworCQlzdGF0dXMgPSBsdjFfZ3B1X21lbW9yeV9hbGxvY2F0ZShkZHJfc2l6ZSwgMCwgMCwgMCwgMCwKKwkJCQkJCSAmcHJpdi0+bWVtb3J5X2hhbmRsZSwKKwkJCQkJCSAmZGRyX2xwYXIpOworCQlpZiAoIXN0YXR1cykKKwkJCWJyZWFrOworCQlkZHJfc2l6ZSAtPSAxMDI0KjEwMjQ7CisJfQorCWlmIChzdGF0dXMgfHwgZGRyX3NpemUgPD0gMCkgeworCQlkZXZfZXJyKCZkZXYtPmNvcmUsICIlczolZDogbHYxX2dwdV9tZW1vcnlfYWxsb2NhdGUgZmFpbGVkXG4iLAorCQkJX19mdW5jX18sIF9fTElORV9fKTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBvdXRfZnJlZV94ZHJfYnVmOworCX0KKworCS8qIFJlcXVlc3QgY29udGV4dCAqLworCXN0YXR1cyA9IGx2MV9ncHVfY29udGV4dF9hbGxvY2F0ZShwcml2LT5tZW1vcnlfaGFuZGxlLAorCQkJCQkgIDAsCisJCQkJCSAgJnByaXYtPmNvbnRleHRfaGFuZGxlLAorCQkJCQkgICZjdHJsX2xwYXIsCisJCQkJCSAgJmluZm9fbHBhciwKKwkJCQkJICAmcmVwb3J0c19scGFyLAorCQkJCQkgICZyZXBvcnRzX3NpemUpOworCWlmIChzdGF0dXMpIHsKKwkJZGV2X2VycigmZGV2LT5jb3JlLCAiJXM6JWQ6IGx2MV9ncHVfY29udGV4dF9hbGxvY2F0ZSBmYWlsZWRcbiIsCisJCQlfX2Z1bmNfXywgX19MSU5FX18pOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIG91dF9mcmVlX21lbW9yeTsKKwl9CisKKwkvKiBNYXAgWERSIGJ1ZmZlciB0byBSU1ggKi8KKwlzdGF0dXMgPSBsdjFfZ3B1X2NvbnRleHRfaW9tYXAocHJpdi0+Y29udGV4dF9oYW5kbGUsIFhEUl9JT0lGLAorCQkJCSAgICAgICBwczNfbW1fcGh5c190b19scGFyKF9fcGEocHJpdi0+eGRyX2J1ZikpLAorCQkJCSAgICAgICBYRFJfQlVGX1NJWkUsIDApOworCWlmIChzdGF0dXMpIHsKKwkJZGV2X2VycigmZGV2LT5jb3JlLCAiJXM6JWQ6IGx2MV9ncHVfY29udGV4dF9pb21hcCBmYWlsZWRcbiIsCisJCQlfX2Z1bmNfXywgX19MSU5FX18pOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIG91dF9mcmVlX2NvbnRleHQ7CisJfQorCisJcHJpdi0+ZGRyX2Jhc2UgPSBpb3JlbWFwX2ZsYWdzKGRkcl9scGFyLCBkZHJfc2l6ZSwgX1BBR0VfTk9fQ0FDSEUpOworCisJaWYgKCFwcml2LT5kZHJfYmFzZSkgeworCQlkZXZfZXJyKCZkZXYtPmNvcmUsICIlczolZDogaW9yZW1hcCBmYWlsZWRcbiIsIF9fZnVuY19fLAorCQkJX19MSU5FX18pOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIG91dF9mcmVlX2NvbnRleHQ7CisJfQorCisJcHJpdi0+Y3RybCA9IGlvcmVtYXAoY3RybF9scGFyLCA2NCAqIDEwMjQpOworCWlmICghcHJpdi0+Y3RybCkgeworCQlkZXZfZXJyKCZkZXYtPmNvcmUsICIlczolZDogaW9yZW1hcCBmYWlsZWRcbiIsIF9fZnVuY19fLAorCQkJX19MSU5FX18pOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIG91dF91bm1hcF92cmFtOworCX0KKworCXByaXYtPnJlcG9ydHMgPSBpb3JlbWFwKHJlcG9ydHNfbHBhciwgcmVwb3J0c19zaXplKTsKKwlpZiAoIXByaXYtPnJlcG9ydHMpIHsKKwkJZGV2X2VycigmZGV2LT5jb3JlLCAiJXM6JWQ6IGlvcmVtYXAgZmFpbGVkXG4iLCBfX2Z1bmNfXywKKwkJCV9fTElORV9fKTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBvdXRfdW5tYXBfY3RybDsKKwl9CisKKwltdXRleF9sb2NrKCZwczNfZ3B1X211dGV4KTsKKwlwczN2cmFtX2luaXRfcmluZygmcHMzdnJhbV9tdGQpOworCW11dGV4X3VubG9jaygmcHMzX2dwdV9tdXRleCk7CisKKwlwczN2cmFtX210ZC5uYW1lID0gInBzM3ZyYW0iOworCXBzM3ZyYW1fbXRkLnNpemUgPSBkZHJfc2l6ZTsKKwlwczN2cmFtX210ZC5mbGFncyA9IE1URF9DQVBfUkFNOworCXBzM3ZyYW1fbXRkLmVyYXNlID0gcHMzdnJhbV9lcmFzZTsKKwlwczN2cmFtX210ZC5wb2ludCA9IE5VTEw7CisJcHMzdnJhbV9tdGQudW5wb2ludCA9IE5VTEw7CisJcHMzdnJhbV9tdGQucmVhZCA9IHBzM3ZyYW1fcmVhZDsKKwlwczN2cmFtX210ZC53cml0ZSA9IHBzM3ZyYW1fd3JpdGU7CisJcHMzdnJhbV9tdGQub3duZXIgPSBUSElTX01PRFVMRTsKKwlwczN2cmFtX210ZC50eXBlID0gTVREX1JBTTsKKwlwczN2cmFtX210ZC5lcmFzZXNpemUgPSBDQUNIRV9QQUdFX1NJWkU7CisJcHMzdnJhbV9tdGQud3JpdGVzaXplID0gMTsKKworCXBzM3ZyYW1fYmluZCgmcHMzdnJhbV9tdGQpOworCisJbXV0ZXhfbG9jaygmcHMzX2dwdV9tdXRleCk7CisJcmV0ID0gcHMzdnJhbV93YWl0X3JpbmcoJnBzM3ZyYW1fbXRkLCAxMDApOworCW11dGV4X3VubG9jaygmcHMzX2dwdV9tdXRleCk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycigmZGV2LT5jb3JlLCAiJXM6JWQ6IGZhaWxlZCB0byBpbml0aWFsaXplIGNoYW5uZWxzXG4iLAorCQkJX19mdW5jX18sIF9fTElORV9fKTsKKwkJcmV0ID0gLUVUSU1FRE9VVDsKKwkJZ290byBvdXRfdW5tYXBfcmVwb3J0czsKKwl9CisKKwlwczN2cmFtX2NhY2hlX2luaXQoJnBzM3ZyYW1fbXRkKTsKKworCWlmIChhZGRfbXRkX2RldmljZSgmcHMzdnJhbV9tdGQpKSB7CisJCWRldl9lcnIoJmRldi0+Y29yZSwgIiVzOiVkOiBhZGRfbXRkX2RldmljZSBmYWlsZWRcbiIsCisJCQlfX2Z1bmNfXywgX19MSU5FX18pOworCQlyZXQgPSAtRUFHQUlOOworCQlnb3RvIG91dF9jYWNoZV9jbGVhbnVwOworCX0KKworCWRldl9pbmZvKCZkZXYtPmNvcmUsICJyZXNlcnZlZCAldSBNaUIgb2YgZ3B1IG1lbW9yeVxuIiwKKwkJKHVuc2lnbmVkIGludCkoZGRyX3NpemUgLyAxMDI0IC8gMTAyNCkpOworCisJcmV0dXJuIDA7CisKK291dF9jYWNoZV9jbGVhbnVwOgorCXBzM3ZyYW1fY2FjaGVfY2xlYW51cCgmcHMzdnJhbV9tdGQpOworb3V0X3VubWFwX3JlcG9ydHM6CisJaW91bm1hcChwcml2LT5yZXBvcnRzKTsKK291dF91bm1hcF9jdHJsOgorCWlvdW5tYXAocHJpdi0+Y3RybCk7CitvdXRfdW5tYXBfdnJhbToKKwlpb3VubWFwKHByaXYtPmRkcl9iYXNlKTsKK291dF9mcmVlX2NvbnRleHQ6CisJbHYxX2dwdV9jb250ZXh0X2ZyZWUocHJpdi0+Y29udGV4dF9oYW5kbGUpOworb3V0X2ZyZWVfbWVtb3J5OgorCWx2MV9ncHVfbWVtb3J5X2ZyZWUocHJpdi0+bWVtb3J5X2hhbmRsZSk7CitvdXRfY2xvc2VfZ3B1OgorCXBzM19jbG9zZV9odl9kZXZpY2UoZGV2KTsKK291dF9mcmVlX3hkcl9idWY6CisJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZykgcHJpdi0+eGRyX2J1ZiwgZ2V0X29yZGVyKFhEUl9CVUZfU0laRSkpOworb3V0X2ZyZWVfcHJpdjoKKwlrZnJlZShwczN2cmFtX210ZC5wcml2KTsKKwlwczN2cmFtX210ZC5wcml2ID0gTlVMTDsKK291dDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHBzM3ZyYW1fc2h1dGRvd24oc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBwczN2cmFtX3ByaXYgKnByaXY7CisKKwlwcml2ID0gcHMzdnJhbV9tdGQucHJpdjsKKworCWRlbF9tdGRfZGV2aWNlKCZwczN2cmFtX210ZCk7CisJcHMzdnJhbV9jYWNoZV9jbGVhbnVwKCZwczN2cmFtX210ZCk7CisJaW91bm1hcChwcml2LT5yZXBvcnRzKTsKKwlpb3VubWFwKHByaXYtPmN0cmwpOworCWlvdW5tYXAocHJpdi0+ZGRyX2Jhc2UpOworCWx2MV9ncHVfY29udGV4dF9mcmVlKHByaXYtPmNvbnRleHRfaGFuZGxlKTsKKwlsdjFfZ3B1X21lbW9yeV9mcmVlKHByaXYtPm1lbW9yeV9oYW5kbGUpOworCXBzM19jbG9zZV9odl9kZXZpY2UoZGV2KTsKKwlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKSBwcml2LT54ZHJfYnVmLCBnZXRfb3JkZXIoWERSX0JVRl9TSVpFKSk7CisJa2ZyZWUocHJpdik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZHJpdmVyIHBzM3ZyYW1fZHJpdmVyID0geworCS5tYXRjaF9pZAk9IFBTM19NQVRDSF9JRF9HUFUsCisJLm1hdGNoX3N1Yl9pZAk9IFBTM19NQVRDSF9TVUJfSURfR1BVX1JBTURJU0ssCisJLmNvcmUubmFtZQk9IERFVklDRV9OQU1FLAorCS5jb3JlLm93bmVyCT0gVEhJU19NT0RVTEUsCisJLnByb2JlCQk9IHBzM3ZyYW1fcHJvYmUsCisJLnJlbW92ZQkJPSBwczN2cmFtX3NodXRkb3duLAorCS5zaHV0ZG93bgk9IHBzM3ZyYW1fc2h1dGRvd24sCit9OworCitzdGF0aWMgaW50IF9faW5pdCBwczN2cmFtX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcHMzX3N5c3RlbV9idXNfZHJpdmVyX3JlZ2lzdGVyKCZwczN2cmFtX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBwczN2cmFtX2V4aXQodm9pZCkKK3sKKwlwczNfc3lzdGVtX2J1c19kcml2ZXJfdW5yZWdpc3RlcigmcHMzdnJhbV9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChwczN2cmFtX2luaXQpOworbW9kdWxlX2V4aXQocHMzdnJhbV9leGl0KTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiSmltIFBhcmlzIDxqaW1AanRhbi5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIk1URCBkcml2ZXIgZm9yIFBTMyB2aWRlbyBSQU0iKTsKK01PRFVMRV9BTElBUyhQUzNfTU9EVUxFX0FMSUFTX0dQVV9SQU1ESVNLKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL21hcHMvaW50ZWdyYXRvci1mbGFzaC5jIGIvZHJpdmVycy9tdGQvbWFwcy9pbnRlZ3JhdG9yLWZsYXNoLmMKaW5kZXggNzEwMGVlMy4uZDJlYzI2MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbWFwcy9pbnRlZ3JhdG9yLWZsYXNoLmMKKysrIGIvZHJpdmVycy9tdGQvbWFwcy9pbnRlZ3JhdG9yLWZsYXNoLmMKQEAgLTEwNSw3ICsxMDUsNyBAQAogCWluZm8tPm1hcC5iYW5rd2lkdGgJPSBwbGF0LT53aWR0aDsKIAlpbmZvLT5tYXAucGh5cwkJPSByZXMtPnN0YXJ0OwogCWluZm8tPm1hcC52aXJ0CQk9IGJhc2U7Ci0JaW5mby0+bWFwLm5hbWUJCT0gZGV2LT5kZXYuYnVzX2lkOworCWluZm8tPm1hcC5uYW1lCQk9IGRldl9uYW1lKCZkZXYtPmRldik7CiAJaW5mby0+bWFwLnNldF92cHAJPSBhcm1mbGFzaF9zZXRfdnBwOwogCiAJc2ltcGxlX21hcF9pbml0KCZpbmZvLT5tYXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbWFwcy9peHAyMDAwLmMgYi9kcml2ZXJzL210ZC9tYXBzL2l4cDIwMDAuYwppbmRleCAzZWExZGU5Li5kNGZiOWEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9tYXBzL2l4cDIwMDAuYworKysgYi9kcml2ZXJzL210ZC9tYXBzL2l4cDIwMDAuYwpAQCAtMTg4LDcgKzE4OCw3IEBACiAgCSAqLwogCWluZm8tPm1hcC5tYXBfcHJpdl8yID0gKHVuc2lnbmVkIGxvbmcpIGl4cF9kYXRhLT5iYW5rX3NldHVwOwogCi0JaW5mby0+bWFwLm5hbWUgPSBkZXYtPmRldi5idXNfaWQ7CisJaW5mby0+bWFwLm5hbWUgPSBkZXZfbmFtZSgmZGV2LT5kZXYpOwogCWluZm8tPm1hcC5yZWFkID0gaXhwMjAwMF9mbGFzaF9yZWFkODsKIAlpbmZvLT5tYXAud3JpdGUgPSBpeHAyMDAwX2ZsYXNoX3dyaXRlODsKIAlpbmZvLT5tYXAuY29weV9mcm9tID0gaXhwMjAwMF9mbGFzaF9jb3B5X2Zyb207CkBAIC0xOTYsNyArMTk2LDcgQEAKIAogCWluZm8tPnJlcyA9IHJlcXVlc3RfbWVtX3JlZ2lvbihkZXYtPnJlc291cmNlLT5zdGFydCwKIAkJCWRldi0+cmVzb3VyY2UtPmVuZCAtIGRldi0+cmVzb3VyY2UtPnN0YXJ0ICsgMSwKLQkJCWRldi0+ZGV2LmJ1c19pZCk7CisJCQlkZXZfbmFtZSgmZGV2LT5kZXYpKTsKIAlpZiAoIWluZm8tPnJlcykgewogCQlkZXZfZXJyKCZkZXYtPmRldiwgIkNvdWxkIG5vdCByZXNlcnZlIG1lbW9yeSByZWdpb25cbiIpOwogCQllcnIgPSAtRU5PTUVNOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbWFwcy9peHA0eHguYyBiL2RyaXZlcnMvbXRkL21hcHMvaXhwNHh4LmMKaW5kZXggMTY1NTVjYi4uNzIxNGI4NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbWFwcy9peHA0eHguYworKysgYi9kcml2ZXJzL210ZC9tYXBzL2l4cDR4eC5jCkBAIC0yMTgsNyArMjE4LDcgQEAKIAkgKiBoYW5kbGUgdGhhdC4KIAkgKi8KIAlpbmZvLT5tYXAuYmFua3dpZHRoID0gMjsKLQlpbmZvLT5tYXAubmFtZSA9IGRldi0+ZGV2LmJ1c19pZDsKKwlpbmZvLT5tYXAubmFtZSA9IGRldl9uYW1lKCZkZXYtPmRldik7CiAJaW5mby0+bWFwLnJlYWQgPSBpeHA0eHhfcmVhZDE2LAogCWluZm8tPm1hcC53cml0ZSA9IGl4cDR4eF9wcm9iZV93cml0ZTE2LAogCWluZm8tPm1hcC5jb3B5X2Zyb20gPSBpeHA0eHhfY29weV9mcm9tLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbWFwcy9vbWFwX25vci5jIGIvZHJpdmVycy9tdGQvbWFwcy9vbWFwX25vci5jCmluZGV4IDA1ZjI3NmEuLjdlNTBlOWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL21hcHMvb21hcF9ub3IuYworKysgYi9kcml2ZXJzL210ZC9tYXBzL29tYXBfbm9yLmMKQEAgLTEwMSw3ICsxMDEsNyBAQAogCQllcnIgPSAtRU5PTUVNOwogCQlnb3RvIG91dF9yZWxlYXNlX21lbV9yZWdpb247CiAJfQotCWluZm8tPm1hcC5uYW1lCQk9IHBkZXYtPmRldi5idXNfaWQ7CisJaW5mby0+bWFwLm5hbWUJCT0gZGV2X25hbWUoJnBkZXYtPmRldik7CiAJaW5mby0+bWFwLnBoeXMJCT0gcmVzLT5zdGFydDsKIAlpbmZvLT5tYXAuc2l6ZQkJPSBzaXplOwogCWluZm8tPm1hcC5iYW5rd2lkdGgJPSBwZGF0YS0+d2lkdGg7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9tYXBzL3BoeXNtYXAuYyBiL2RyaXZlcnMvbXRkL21hcHMvcGh5c21hcC5jCmluZGV4IGRmYmYzZjIuLjFkYjE2ZTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL21hcHMvcGh5c21hcC5jCisrKyBiL2RyaXZlcnMvbXRkL21hcHMvcGh5c21hcC5jCkBAIC0xMDgsMTMgKzEwOCwxMyBAQAogCQlpZiAoIWRldm1fcmVxdWVzdF9tZW1fcmVnaW9uKCZkZXYtPmRldiwKIAkJCWRldi0+cmVzb3VyY2VbaV0uc3RhcnQsCiAJCQlkZXYtPnJlc291cmNlW2ldLmVuZCAtIGRldi0+cmVzb3VyY2VbaV0uc3RhcnQgKyAxLAotCQkJZGV2LT5kZXYuYnVzX2lkKSkgeworCQkJZGV2X25hbWUoJmRldi0+ZGV2KSkpIHsKIAkJCWRldl9lcnIoJmRldi0+ZGV2LCAiQ291bGQgbm90IHJlc2VydmUgbWVtb3J5IHJlZ2lvblxuIik7CiAJCQllcnIgPSAtRU5PTUVNOwogCQkJZ290byBlcnJfb3V0OwogCQl9CiAKLQkJaW5mby0+bWFwW2ldLm5hbWUgPSBkZXYtPmRldi5idXNfaWQ7CisJCWluZm8tPm1hcFtpXS5uYW1lID0gZGV2X25hbWUoJmRldi0+ZGV2KTsKIAkJaW5mby0+bWFwW2ldLnBoeXMgPSBkZXYtPnJlc291cmNlW2ldLnN0YXJ0OwogCQlpbmZvLT5tYXBbaV0uc2l6ZSA9IGRldi0+cmVzb3VyY2VbaV0uZW5kIC0gZGV2LT5yZXNvdXJjZVtpXS5zdGFydCArIDE7CiAJCWluZm8tPm1hcFtpXS5iYW5rd2lkdGggPSBwaHlzbWFwX2RhdGEtPndpZHRoOwpAQCAtMTUwLDcgKzE1MCw3IEBACiAJCSAqIFdlIGRldGVjdGVkIG11bHRpcGxlIGRldmljZXMuIENvbmNhdGVuYXRlIHRoZW0gdG9nZXRoZXIuCiAJCSAqLwogI2lmZGVmIENPTkZJR19NVERfQ09OQ0FUCi0JCWluZm8tPmNtdGQgPSBtdGRfY29uY2F0X2NyZWF0ZShpbmZvLT5tdGQsIGRldmljZXNfZm91bmQsIGRldi0+ZGV2LmJ1c19pZCk7CisJCWluZm8tPmNtdGQgPSBtdGRfY29uY2F0X2NyZWF0ZShpbmZvLT5tdGQsIGRldmljZXNfZm91bmQsIGRldl9uYW1lKCZkZXYtPmRldikpOwogCQlpZiAoaW5mby0+Y210ZCA9PSBOVUxMKQogCQkJZXJyID0gLUVOWElPOwogI2Vsc2UKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL21hcHMvcGh5c21hcF9vZi5jIGIvZHJpdmVycy9tdGQvbWFwcy9waHlzbWFwX29mLmMKaW5kZXggNWZjZmVjMC4uZmJmMGNhOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbWFwcy9waHlzbWFwX29mLmMKKysrIGIvZHJpdmVycy9tdGQvbWFwcy9waHlzbWFwX29mLmMKQEAgLTE4Myw3ICsxODMsNyBAQAogCiAJZXJyID0gLUVCVVNZOwogCWluZm8tPnJlcyA9IHJlcXVlc3RfbWVtX3JlZ2lvbihyZXMuc3RhcnQsIHJlcy5lbmQgLSByZXMuc3RhcnQgKyAxLAotCQkJCSAgICAgICBkZXYtPmRldi5idXNfaWQpOworCQkJCSAgICAgICBkZXZfbmFtZSgmZGV2LT5kZXYpKTsKIAlpZiAoIWluZm8tPnJlcykKIAkJZ290byBlcnJfb3V0OwogCkBAIC0xOTQsNyArMTk0LDcgQEAKIAkJZ290byBlcnJfb3V0OwogCX0KIAotCWluZm8tPm1hcC5uYW1lID0gZGV2LT5kZXYuYnVzX2lkOworCWluZm8tPm1hcC5uYW1lID0gZGV2X25hbWUoJmRldi0+ZGV2KTsKIAlpbmZvLT5tYXAucGh5cyA9IHJlcy5zdGFydDsKIAlpbmZvLT5tYXAuc2l6ZSA9IHJlcy5lbmQgLSByZXMuc3RhcnQgKyAxOwogCWluZm8tPm1hcC5iYW5rd2lkdGggPSAqd2lkdGg7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9tdGRjb25jYXQuYyBiL2RyaXZlcnMvbXRkL210ZGNvbmNhdC5jCmluZGV4IDc4OTg0MmQuLjFhMDVjZjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL210ZGNvbmNhdC5jCisrKyBiL2RyaXZlcnMvbXRkL210ZGNvbmNhdC5jCkBAIC02OTEsNyArNjkxLDcgQEAKICAqLwogc3RydWN0IG10ZF9pbmZvICptdGRfY29uY2F0X2NyZWF0ZShzdHJ1Y3QgbXRkX2luZm8gKnN1YmRldltdLAkvKiBzdWJkZXZpY2VzIHRvIGNvbmNhdGVuYXRlICovCiAJCQkJICAgaW50IG51bV9kZXZzLAkvKiBudW1iZXIgb2Ygc3ViZGV2aWNlcyAgICAgICovCi0JCQkJICAgY2hhciAqbmFtZSkKKwkJCQkgICBjb25zdCBjaGFyICpuYW1lKQogewkJCQkvKiBuYW1lIGZvciB0aGUgbmV3IGRldmljZSAgICovCiAJaW50IGk7CiAJc2l6ZV90IHNpemU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9uYW5kL2ZzbF91cG0uYyBiL2RyaXZlcnMvbXRkL25hbmQvZnNsX3VwbS5jCmluZGV4IGE4MzE5MmYuLjc4MTVhNDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL25hbmQvZnNsX3VwbS5jCisrKyBiL2RyaXZlcnMvbXRkL25hbmQvZnNsX3VwbS5jCkBAIC0yMjIsNyArMjIyLDcgQEAKIAogCWZ1bi0+cm5iX2dwaW8gPSBvZl9nZXRfZ3BpbyhvZmRldi0+bm9kZSwgMCk7CiAJaWYgKGZ1bi0+cm5iX2dwaW8gPj0gMCkgewotCQlyZXQgPSBncGlvX3JlcXVlc3QoZnVuLT5ybmJfZ3Bpbywgb2ZkZXYtPmRldi5idXNfaWQpOworCQlyZXQgPSBncGlvX3JlcXVlc3QoZnVuLT5ybmJfZ3BpbywgZGV2X25hbWUoJm9mZGV2LT5kZXYpKTsKIAkJaWYgKHJldCkgewogCQkJZGV2X2Vycigmb2ZkZXYtPmRldiwgImNhbid0IHJlcXVlc3QgUk5CIGdwaW9cbiIpOwogCQkJZ290byBlcnIyOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbmFuZC9wbGF0X25hbmQuYyBiL2RyaXZlcnMvbXRkL25hbmQvcGxhdF9uYW5kLmMKaW5kZXggZjY3NGM1NC4uNzVmOWY0OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbmFuZC9wbGF0X25hbmQuYworKysgYi9kcml2ZXJzL210ZC9uYW5kL3BsYXRfbmFuZC5jCkBAIC01NCw3ICs1NCw3IEBACiAJZGF0YS0+Y2hpcC5wcml2ID0gJmRhdGE7CiAJZGF0YS0+bXRkLnByaXYgPSAmZGF0YS0+Y2hpcDsKIAlkYXRhLT5tdGQub3duZXIgPSBUSElTX01PRFVMRTsKLQlkYXRhLT5tdGQubmFtZSA9IHBkZXYtPmRldi5idXNfaWQ7CisJZGF0YS0+bXRkLm5hbWUgPSBkZXZfbmFtZSgmcGRldi0+ZGV2KTsKIAogCWRhdGEtPmNoaXAuSU9fQUREUl9SID0gZGF0YS0+aW9fYmFzZTsKIAlkYXRhLT5jaGlwLklPX0FERFJfVyA9IGRhdGEtPmlvX2Jhc2U7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9uYW5kL3RtaW9fbmFuZC5jIGIvZHJpdmVycy9tdGQvbmFuZC90bWlvX25hbmQuYwppbmRleCBlZGIxZTMyLi5kYWE2YTRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9uYW5kL3RtaW9fbmFuZC5jCisrKyBiL2RyaXZlcnMvbXRkL25hbmQvdG1pb19uYW5kLmMKQEAgLTQzMyw3ICs0MzMsNyBAQAogCW5hbmRfY2hpcC0+Y2hpcF9kZWxheSA9IDE1OwogCiAJcmV0dmFsID0gcmVxdWVzdF9pcnEoaXJxLCAmdG1pb19pcnEsCi0JCQkJSVJRRl9ESVNBQkxFRCwgZGV2LT5kZXYuYnVzX2lkLCB0bWlvKTsKKwkJCQlJUlFGX0RJU0FCTEVELCBkZXZfbmFtZSgmZGV2LT5kZXYpLCB0bWlvKTsKIAlpZiAocmV0dmFsKSB7CiAJCWRldl9lcnIoJmRldi0+ZGV2LCAicmVxdWVzdF9pcnEgZXJyb3IgJWRcbiIsIHJldHZhbCk7CiAJCWdvdG8gZXJyX2lycTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL29uZW5hbmQvZ2VuZXJpYy5jIGIvZHJpdmVycy9tdGQvb25lbmFuZC9nZW5lcmljLmMKaW5kZXggYWQ4MWFiOC4uNWI2OWU3NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvb25lbmFuZC9nZW5lcmljLmMKKysrIGIvZHJpdmVycy9tdGQvb25lbmFuZC9nZW5lcmljLmMKQEAgLTYzLDcgKzYzLDcgQEAKIAlpbmZvLT5vbmVuYW5kLm1tY29udHJvbCA9IHBkYXRhLT5tbWNvbnRyb2w7CiAJaW5mby0+b25lbmFuZC5pcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOwogCi0JaW5mby0+bXRkLm5hbWUgPSBwZGV2LT5kZXYuYnVzX2lkOworCWluZm8tPm10ZC5uYW1lID0gZGV2X25hbWUoJnBkZXYtPmRldik7CiAJaW5mby0+bXRkLnByaXYgPSAmaW5mby0+b25lbmFuZDsKIAlpbmZvLT5tdGQub3duZXIgPSBUSElTX01PRFVMRTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvb25lbmFuZC9vbWFwMi5jIGIvZHJpdmVycy9tdGQvb25lbmFuZC9vbWFwMi5jCmluZGV4IGQxZTBiOGUuLjk2ZWNjMTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL29uZW5hbmQvb21hcDIuYworKysgYi9kcml2ZXJzL210ZC9vbmVuYW5kL29tYXAyLmMKQEAgLTY2OCw3ICs2NjgsNyBAQAogCQkgYy0+b25lbmFuZC5iYXNlKTsKIAogCWMtPnBkZXYgPSBwZGV2OwotCWMtPm10ZC5uYW1lID0gcGRldi0+ZGV2LmJ1c19pZDsKKwljLT5tdGQubmFtZSA9IGRldl9uYW1lKCZwZGV2LT5kZXYpOwogCWMtPm10ZC5wcml2ID0gJmMtPm9uZW5hbmQ7CiAJYy0+bXRkLm93bmVyID0gVEhJU19NT0RVTEU7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL3ViaS9idWlsZC5jIGIvZHJpdmVycy9tdGQvdWJpL2J1aWxkLmMKaW5kZXggYmEwYmQzZC4uN2NhZjIyYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvdWJpL2J1aWxkLmMKKysrIGIvZHJpdmVycy9tdGQvdWJpL2J1aWxkLmMKQEAgLTI4MCw3ICsyODAsNyBAQAogCXViaS0+ZGV2LnJlbGVhc2UgPSBkZXZfcmVsZWFzZTsKIAl1YmktPmRldi5kZXZ0ID0gdWJpLT5jZGV2LmRldjsKIAl1YmktPmRldi5jbGFzcyA9IHViaV9jbGFzczsKLQlzcHJpbnRmKCZ1YmktPmRldi5idXNfaWRbMF0sIFVCSV9OQU1FX1NUUiIlZCIsIHViaS0+dWJpX251bSk7CisJZGV2X3NldF9uYW1lKCZ1YmktPmRldiwgVUJJX05BTUVfU1RSIiVkIiwgdWJpLT51YmlfbnVtKTsKIAllcnIgPSBkZXZpY2VfcmVnaXN0ZXIoJnViaS0+ZGV2KTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvdWJpL2ViYS5jIGIvZHJpdmVycy9tdGQvdWJpL2ViYS5jCmluZGV4IDA0OGE2MDYuLjI1ZGVmMzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL3ViaS9lYmEuYworKysgYi9kcml2ZXJzL210ZC91YmkvZWJhLmMKQEAgLTcxNyw3ICs3MTcsNyBAQAogICogdG8gdGhlIHJlYWwgZGF0YSBzaXplLCBhbHRob3VnaCB0aGUgQGJ1ZiBidWZmZXIgaGFzIHRvIGNvbnRhaW4gdGhlCiAgKiBhbGlnbm1lbnQuIEluIGFsbCBvdGhlciBjYXNlcywgQGxlbiBoYXMgdG8gYmUgYWxpZ25lZC4KICAqCi0gKiBJdCBpcyBwcm9oaWJpdGVkIHRvIHdyaXRlIG1vcmUgdGhlbiBvbmNlIHRvIGxvZ2ljYWwgZXJhc2VibG9ja3Mgb2Ygc3RhdGljCisgKiBJdCBpcyBwcm9oaWJpdGVkIHRvIHdyaXRlIG1vcmUgdGhhbiBvbmNlIHRvIGxvZ2ljYWwgZXJhc2VibG9ja3Mgb2Ygc3RhdGljCiAgKiB2b2x1bWVzLiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgemVybyBpbiBjYXNlIG9mIHN1Y2Nlc3MgYW5kIGEgbmVnYXRpdmUgZXJyb3IKICAqIGNvZGUgaW4gY2FzZSBvZiBmYWlsdXJlLgogICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC91YmkvaW8uYyBiL2RyaXZlcnMvbXRkL3ViaS9pby5jCmluZGV4IGE3NDExOGMuLmZlODEwMzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL3ViaS9pby5jCisrKyBiL2RyaXZlcnMvbXRkL3ViaS9pby5jCkBAIC00NjUsNyArNDY1LDcgQEAKICAqIFRoaXMgZnVuY3Rpb24gc3luY2hyb25vdXNseSBlcmFzZXMgcGh5c2ljYWwgZXJhc2VibG9jayBAcG51bS4gSWYgQHRvcnR1cmUKICAqIGZsYWcgaXMgbm90IHplcm8sIHRoZSBwaHlzaWNhbCBlcmFzZWJsb2NrIGlzIGNoZWNrZWQgYnkgbWVhbnMgb2Ygd3JpdGluZwogICogZGlmZmVyZW50IHBhdHRlcm5zIHRvIGl0IGFuZCByZWFkaW5nIHRoZW0gYmFjay4gSWYgdGhlIHRvcnR1cmluZyBpcyBlbmFibGVkLAotICogdGhlIHBoeXNpY2FsIGVyYXNlYmxvY2sgaXMgZXJhc2VkIG1vcmUgdGhlbiBvbmNlLgorICogdGhlIHBoeXNpY2FsIGVyYXNlYmxvY2sgaXMgZXJhc2VkIG1vcmUgdGhhbiBvbmNlLgogICoKICAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgbnVtYmVyIG9mIGVyYXN1cmVzIG1hZGUgaW4gY2FzZSBvZiBzdWNjZXNzLCAlLUVJTwogICogaWYgdGhlIGVyYXN1cmUgZmFpbGVkIG9yIHRoZSB0b3J0dXJpbmcgdGVzdCBmYWlsZWQsIGFuZCBvdGhlciBuZWdhdGl2ZSBlcnJvcgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvdWJpL2thcGkuYyBiL2RyaXZlcnMvbXRkL3ViaS9rYXBpLmMKaW5kZXggNWQ5YmNmMS4uNGFiYmU1NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvdWJpL2thcGkuYworKysgYi9kcml2ZXJzL210ZC91Ymkva2FwaS5jCkBAIC01NjQsNyArNTY0LDcgQEAKICAqIEBkdHlwZTogZXhwZWN0ZWQgZGF0YSB0eXBlCiAgKgogICogVGhpcyBmdW5jdGlvbiBtYXBzIGFuIHVuLW1hcHBlZCBsb2dpY2FsIGVyYXNlYmxvY2sgQGxudW0gdG8gYSBwaHlzaWNhbAotICogZXJhc2VibG9jay4gVGhpcyBtZWFucywgdGhhdCBhZnRlciBhIHN1Y2Nlc3NmdWxsIGludm9jYXRpb24gb2YgdGhpcworICogZXJhc2VibG9jay4gVGhpcyBtZWFucywgdGhhdCBhZnRlciBhIHN1Y2Nlc3NmdWwgaW52b2NhdGlvbiBvZiB0aGlzCiAgKiBmdW5jdGlvbiB0aGUgbG9naWNhbCBlcmFzZWJsb2NrIEBsbnVtIHdpbGwgYmUgZW1wdHkgKGNvbnRhaW4gb25seSAlMHhGRgogICogYnl0ZXMpIGFuZCBiZSBtYXBwZWQgdG8gYSBwaHlzaWNhbCBlcmFzZWJsb2NrLCBldmVuIGlmIGFuIHVuY2xlYW4gcmVib290CiAgKiBoYXBwZW5zLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvdWJpL3NjYW4uYyBiL2RyaXZlcnMvbXRkL3ViaS9zY2FuLmMKaW5kZXggNDFkNDdlMS4uZWNkZTIwMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvdWJpL3NjYW4uYworKysgYi9kcml2ZXJzL210ZC91Ymkvc2Nhbi5jCkBAIC00NzgsNyArNDc4LDcgQEAKIAkJCXJldHVybiAwOwogCQl9IGVsc2UgewogCQkJLyoKLQkJCSAqIFRoaXMgbG9naWNhbCBlcmFzZWJsb2NrIGlzIG9sZGVyIHRoZW4gdGhlIG9uZSBmb3VuZAorCQkJICogVGhpcyBsb2dpY2FsIGVyYXNlYmxvY2sgaXMgb2xkZXIgdGhhbiB0aGUgb25lIGZvdW5kCiAJCQkgKiBwcmV2aW91c2x5LgogCQkJICovCiAJCQlpZiAoY21wX3JlcyAmIDQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC91YmkvdWJpLW1lZGlhLmggYi9kcml2ZXJzL210ZC91YmkvdWJpLW1lZGlhLmgKaW5kZXggMmFkOTQwNC4uODQxOWZkYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvdWJpL3ViaS1tZWRpYS5oCisrKyBiL2RyaXZlcnMvbXRkL3ViaS91YmktbWVkaWEuaApAQCAtMTM1LDcgKzEzNSw3IEBACiAgKiBUaGUgZXJhc2UgY291bnRlciBoZWFkZXIgdGFrZXMgNjQgYnl0ZXMgYW5kIGhhcyBhIHBsZW50eSBvZiB1bnVzZWQgc3BhY2UgZm9yCiAgKiBmdXR1cmUgdXNhZ2UuIFRoZSB1bnVzZWQgZmllbGRzIGFyZSB6ZXJvZWQuIFRoZSBAdmVyc2lvbiBmaWVsZCBpcyB1c2VkIHRvCiAgKiBpbmRpY2F0ZSB0aGUgdmVyc2lvbiBvZiBVQkkgaW1wbGVtZW50YXRpb24gd2hpY2ggaXMgc3VwcG9zZWQgdG8gYmUgYWJsZSB0bwotICogd29yayB3aXRoIHRoaXMgVUJJIGltYWdlLiBJZiBAdmVyc2lvbiBpcyBncmVhdGVyIHRoZW4gdGhlIGN1cnJlbnQgVUJJCisgKiB3b3JrIHdpdGggdGhpcyBVQkkgaW1hZ2UuIElmIEB2ZXJzaW9uIGlzIGdyZWF0ZXIgdGhhbiB0aGUgY3VycmVudCBVQkkKICAqIHZlcnNpb24sIHRoZSBpbWFnZSBpcyByZWplY3RlZC4gVGhpcyBtYXkgYmUgdXNlZnVsIGluIGZ1dHVyZSBpZiBzb21ldGhpbmcKICAqIGlzIGNoYW5nZWQgcmFkaWNhbGx5LiBUaGlzIGZpZWxkIGlzIGR1cGxpY2F0ZWQgaW4gdGhlIHZvbHVtZSBpZGVudGlmaWVyCiAgKiBoZWFkZXIuCkBAIC0xODcsNyArMTg3LDcgQEAKICAqIChzZXF1ZW5jZSBudW1iZXIpIGlzIHVzZWQgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBvbGRlciBhbmQgbmV3ZXIgdmVyc2lvbnMgb2YKICAqIGxvZ2ljYWwgZXJhc2VibG9ja3MuCiAgKgotICogVGhlcmUgYXJlIDIgc2l0dWF0aW9ucyB3aGVuIHRoZXJlIG1heSBiZSBtb3JlIHRoZW4gb25lIHBoeXNpY2FsIGVyYXNlYmxvY2sKKyAqIFRoZXJlIGFyZSAyIHNpdHVhdGlvbnMgd2hlbiB0aGVyZSBtYXkgYmUgbW9yZSB0aGFuIG9uZSBwaHlzaWNhbCBlcmFzZWJsb2NrCiAgKiBjb3JyZXNwb25kaW5nIHRvIHRoZSBzYW1lIGxvZ2ljYWwgZXJhc2VibG9jaywgaS5lLiwgaGF2aW5nIHRoZSBzYW1lIEB2b2xfaWQKICAqIGFuZCBAbG51bSB2YWx1ZXMgaW4gdGhlIHZvbHVtZSBpZGVudGlmaWVyIGhlYWRlci4gU3VwcG9zZSB3ZSBoYXZlIGEgbG9naWNhbAogICogZXJhc2VibG9jayBMIGFuZCBpdCBpcyBtYXBwZWQgdG8gdGhlIHBoeXNpY2FsIGVyYXNlYmxvY2sgUC4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL3ViaS92bXQuYyBiL2RyaXZlcnMvbXRkL3ViaS92bXQuYwppbmRleCAzNTMxY2E5Li4yMmUxZDczIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC91Ymkvdm10LmMKKysrIGIvZHJpdmVycy9tdGQvdWJpL3ZtdC5jCkBAIC0zMjksNyArMzI5LDcgQEAKIAl2b2wtPmRldi5kZXZ0ID0gZGV2OwogCXZvbC0+ZGV2LmNsYXNzID0gdWJpX2NsYXNzOwogCi0Jc3ByaW50Zigmdm9sLT5kZXYuYnVzX2lkWzBdLCAiJXNfJWQiLCB1YmktPnViaV9uYW1lLCB2b2wtPnZvbF9pZCk7CisJZGV2X3NldF9uYW1lKCZ2b2wtPmRldiwgIiVzXyVkIiwgdWJpLT51YmlfbmFtZSwgdm9sLT52b2xfaWQpOwogCWVyciA9IGRldmljZV9yZWdpc3Rlcigmdm9sLT5kZXYpOwogCWlmIChlcnIpIHsKIAkJdWJpX2VycigiY2Fubm90IHJlZ2lzdGVyIGRldmljZSIpOwpAQCAtNjc4LDcgKzY3OCw3IEBACiAJdm9sLT5kZXYucGFyZW50ID0gJnViaS0+ZGV2OwogCXZvbC0+ZGV2LmRldnQgPSBkZXY7CiAJdm9sLT5kZXYuY2xhc3MgPSB1YmlfY2xhc3M7Ci0Jc3ByaW50Zigmdm9sLT5kZXYuYnVzX2lkWzBdLCAiJXNfJWQiLCB1YmktPnViaV9uYW1lLCB2b2wtPnZvbF9pZCk7CisJZGV2X3NldF9uYW1lKCZ2b2wtPmRldiwgIiVzXyVkIiwgdWJpLT51YmlfbmFtZSwgdm9sLT52b2xfaWQpOwogCWVyciA9IGRldmljZV9yZWdpc3Rlcigmdm9sLT5kZXYpOwogCWlmIChlcnIpCiAJCWdvdG8gb3V0X2dsdWViaTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL3ViaS92dGJsLmMgYi9kcml2ZXJzL210ZC91YmkvdnRibC5jCmluZGV4IDMzM2M4OTQuLjFhZmM2MWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL3ViaS92dGJsLmMKKysrIGIvZHJpdmVycy9tdGQvdWJpL3Z0YmwuYwpAQCAtNTc3LDcgKzU3Nyw3IEBACiAJCWlmICh2dGJsW2ldLmZsYWdzICYgVUJJX1ZUQkxfQVVUT1JFU0laRV9GTEcpIHsKIAkJCS8qIEF1dG8gcmUtc2l6ZSBmbGFnIG1heSBiZSBzZXQgb25seSBmb3Igb25lIHZvbHVtZSAqLwogCQkJaWYgKHViaS0+YXV0b3Jlc2l6ZV92b2xfaWQgIT0gLTEpIHsKLQkJCQl1YmlfZXJyKCJtb3JlIHRoZW4gb25lIGF1dG8tcmVzaXplIHZvbHVtZSAoJWQgIgorCQkJCXViaV9lcnIoIm1vcmUgdGhhbiBvbmUgYXV0by1yZXNpemUgdm9sdW1lICglZCAiCiAJCQkJCSJhbmQgJWQpIiwgdWJpLT5hdXRvcmVzaXplX3ZvbF9pZCwgaSk7CiAJCQkJa2ZyZWUodm9sKTsKIAkJCQlyZXR1cm4gLUVJTlZBTDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL3ViaS93bC5jIGIvZHJpdmVycy9tdGQvdWJpL3dsLmMKaW5kZXggMTQ5MDFjYi4uODkxNTM0ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvdWJpL3dsLmMKKysrIGIvZHJpdmVycy9tdGQvdWJpL3dsLmMKQEAgLTEyOCw3ICsxMjgsNyBAQAogICogc2l0dWF0aW9uIHdoZW4gdGhlIHBpY2tlZCBwaHlzaWNhbCBlcmFzZWJsb2NrIGlzIGNvbnN0YW50bHkgZXJhc2VkIGFmdGVyIHRoZQogICogZGF0YSBpcyB3cml0dGVuIHRvIGl0LiBTbywgd2UgaGF2ZSBhIGNvbnN0YW50IHdoaWNoIGxpbWl0cyB0aGUgaGlnaGVzdCBlcmFzZQogICogY291bnRlciBvZiB0aGUgZnJlZSBwaHlzaWNhbCBlcmFzZWJsb2NrIHRvIHBpY2suIE5hbWVseSwgdGhlIFdMIHN1Yi1zeXN0ZW0KLSAqIGRvZXMgbm90IHBpY2sgZXJhc2VibG9ja3Mgd2l0aCBlcmFzZSBjb3VudGVyIGdyZWF0ZXIgdGhlbiB0aGUgbG93ZXN0IGVyYXNlCisgKiBkb2VzIG5vdCBwaWNrIGVyYXNlYmxvY2tzIHdpdGggZXJhc2UgY291bnRlciBncmVhdGVyIHRoYW4gdGhlIGxvd2VzdCBlcmFzZQogICogY291bnRlciBwbHVzICVXTF9GUkVFX01BWF9ESUZGLgogICovCiAjZGVmaW5lIFdMX0ZSRUVfTUFYX0RJRkYgKDIqVUJJX1dMX1RIUkVTSE9MRCkKQEAgLTkxNyw3ICs5MTcsNyBAQAogCQkvKgogCQkgKiBXZSBzY2hlZHVsZSB3ZWFyLWxldmVsaW5nIG9ubHkgaWYgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUKIAkJICogbG93ZXN0IGVyYXNlIGNvdW50ZXIgb2YgdXNlZCBwaHlzaWNhbCBlcmFzZWJsb2NrcyBhbmQgYSBoaWdoCi0JCSAqIGVyYXNlIGNvdW50ZXIgb2YgZnJlZSBwaHlzaWNhbCBlcmFzZWJsb2NrcyBpcyBncmVhdGVyIHRoZW4KKwkJICogZXJhc2UgY291bnRlciBvZiBmcmVlIHBoeXNpY2FsIGVyYXNlYmxvY2tzIGlzIGdyZWF0ZXIgdGhhbgogCQkgKiAlVUJJX1dMX1RIUkVTSE9MRC4KIAkJICovCiAJCWUxID0gcmJfZW50cnkocmJfZmlyc3QoJnViaS0+dXNlZCksIHN0cnVjdCB1Ymlfd2xfZW50cnksIHUucmIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvS2NvbmZpZyBiL2RyaXZlcnMvbmV0L0tjb25maWcKaW5kZXggOWExODI3MC4uNjVhZmRhNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvS2NvbmZpZworKysgYi9kcml2ZXJzL25ldC9LY29uZmlnCkBAIC04MzAsNyArODMwLDcgQEAKIAogY29uZmlnIEJGSU5fTUFDCiAJdHJpc3RhdGUgIkJsYWNrZmluIG9uLWNoaXAgTUFDIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBORVRfRVRIRVJORVQgJiYgKEJGNTI2IHx8IEJGNTI3IHx8IEJGNTM2IHx8IEJGNTM3KQorCWRlcGVuZHMgb24gTkVUX0VUSEVSTkVUICYmIChCRjUxNiB8fCBCRjUxOCB8fCBCRjUyNiB8fCBCRjUyNyB8fCBCRjUzNiB8fCBCRjUzNykKIAlzZWxlY3QgQ1JDMzIKIAlzZWxlY3QgTUlJCiAJc2VsZWN0IFBIWUxJQgpAQCAtMjYxNCw2ICsyNjE0LDggQEAKIAogc291cmNlICJkcml2ZXJzL25ldC93aXJlbGVzcy9LY29uZmlnIgogCitzb3VyY2UgImRyaXZlcnMvbmV0L3dpbWF4L0tjb25maWciCisKIHNvdXJjZSAiZHJpdmVycy9uZXQvdXNiL0tjb25maWciCiAKIHNvdXJjZSAiZHJpdmVycy9uZXQvcGNtY2lhL0tjb25maWciCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9NYWtlZmlsZSBiL2RyaXZlcnMvbmV0L01ha2VmaWxlCmluZGV4IGU1YzM0YjQuLmEzYzVjMDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbmV0L01ha2VmaWxlCkBAIC0yNjMsMyArMjYzLDQgQEAKIG9iai0kKENPTkZJR19WSVJUSU9fTkVUKSArPSB2aXJ0aW9fbmV0Lm8KIG9iai0kKENPTkZJR19TRkMpICs9IHNmYy8KIAorb2JqLSQoQ09ORklHX1dJTUFYKSArPSB3aW1heC8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2FjZW5pYy5jIGIvZHJpdmVycy9uZXQvYWNlbmljLmMKaW5kZXggNTE3ZmNlNC4uNWIzOTZmZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYWNlbmljLmMKKysrIGIvZHJpdmVycy9uZXQvYWNlbmljLmMKQEAgLTY2LDYgKzY2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KICNpbmNsdWRlIDxsaW51eC9zb2NraW9zLmg+CisjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KIAogI2lmIGRlZmluZWQoQ09ORklHX1ZMQU5fODAyMVEpIHx8IGRlZmluZWQoQ09ORklHX1ZMQU5fODAyMVFfTU9EVUxFKQogI2luY2x1ZGUgPGxpbnV4L2lmX3ZsYW4uaD4KQEAgLTE4Niw4ICsxODcsNiBAQAogI2RlZmluZSBNQVhfUk9EQVRBX0xFTgk4KjEwMjQKICNkZWZpbmUgTUFYX0RBVEFfTEVOCTIqMTAyNAogCi0jaW5jbHVkZSAiYWNlbmljX2Zpcm13YXJlLmgiCi0KICNpZm5kZWYgdGlnb24yRndSZWxlYXNlTG9jYWwKICNkZWZpbmUgdGlnb24yRndSZWxlYXNlTG9jYWwgMAogI2VuZGlmCkBAIC00MTcsNiArNDE2LDEwIEBACiBNT0RVTEVfQVVUSE9SKCJKZXMgU29yZW5zZW4gPGplc0B0cmFpbmVkLW1vbmtleS5vcmc+Iik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIkFjZU5JQy8zQzk4NS9HQTYyMCBHaWdhYml0IEV0aGVybmV0IGRyaXZlciIpOworI2lmbmRlZiBDT05GSUdfQUNFTklDX09NSVRfVElHT05fSQorTU9EVUxFX0ZJUk1XQVJFKCJhY2VuaWMvdGcxLmJpbiIpOworI2VuZGlmCitNT0RVTEVfRklSTVdBUkUoImFjZW5pYy90ZzIuYmluIik7CiAKIG1vZHVsZV9wYXJhbV9hcnJheV9uYW1lZChsaW5rLCBsaW5rX3N0YXRlLCBpbnQsIE5VTEwsIDApOwogbW9kdWxlX3BhcmFtX2FycmF5KHRyYWNlLCBpbnQsIE5VTEwsIDApOwpAQCAtOTQzLDggKzk0Niw4IEBACiAJY2FzZSA0OgogCWNhc2UgNToKIAkJcHJpbnRrKEtFUk5fSU5GTyAiICBUaWdvbiBJICAoUmV2LiAlaSksIEZpcm13YXJlOiAlaS4laS4laSwgIiwKLQkJICAgICAgIHRpZ192ZXIsIHRpZ29uRndSZWxlYXNlTWFqb3IsIHRpZ29uRndSZWxlYXNlTWlub3IsCi0JCSAgICAgICB0aWdvbkZ3UmVsZWFzZUZpeCk7CisJCSAgICAgICB0aWdfdmVyLCBhcC0+ZmlybXdhcmVfbWFqb3IsIGFwLT5maXJtd2FyZV9taW5vciwKKwkJICAgICAgIGFwLT5maXJtd2FyZV9maXgpOwogCQl3cml0ZWwoMCwgJnJlZ3MtPkxvY2FsQ3RybCk7CiAJCWFwLT52ZXJzaW9uID0gMTsKIAkJYXAtPnR4X3JpbmdfZW50cmllcyA9IFRJR09OX0lfVFhfUklOR19FTlRSSUVTOwpAQCAtOTUyLDggKzk1NSw4IEBACiAjZW5kaWYKIAljYXNlIDY6CiAJCXByaW50ayhLRVJOX0lORk8gIiAgVGlnb24gSUkgKFJldi4gJWkpLCBGaXJtd2FyZTogJWkuJWkuJWksICIsCi0JCSAgICAgICB0aWdfdmVyLCB0aWdvbjJGd1JlbGVhc2VNYWpvciwgdGlnb24yRndSZWxlYXNlTWlub3IsCi0JCSAgICAgICB0aWdvbjJGd1JlbGVhc2VGaXgpOworCQkgICAgICAgdGlnX3ZlciwgYXAtPmZpcm13YXJlX21ham9yLCBhcC0+ZmlybXdhcmVfbWlub3IsCisJCSAgICAgICBhcC0+ZmlybXdhcmVfZml4KTsKIAkJd3JpdGVsKHJlYWRsKCZyZWdzLT5DcHVCQ3RybCkgfCBDUFVfSEFMVCwgJnJlZ3MtPkNwdUJDdHJsKTsKIAkJcmVhZGwoJnJlZ3MtPkNwdUJDdHJsKTsJCS8qIFBDSSB3cml0ZSBwb3N0aW5nICovCiAJCS8qCkBAIC0xMjA1LDcgKzEyMDgsOSBAQAogCW1lbXNldChhcC0+aW5mbywgMCwgc2l6ZW9mKHN0cnVjdCBhY2VfaW5mbykpOwogCW1lbXNldChhcC0+c2tiLCAwLCBzaXplb2Yoc3RydWN0IGFjZV9za2IpKTsKIAotCWFjZV9sb2FkX2Zpcm13YXJlKGRldik7CisJaWYgKGFjZV9sb2FkX2Zpcm13YXJlKGRldikpCisJCWdvdG8gaW5pdF9lcnJvcjsKKwogCWFwLT5md19ydW5uaW5nID0gMDsKIAogCXRtcF9wdHIgPSBhcC0+aW5mb19kbWE7CkBAIC0xNDQxLDEwICsxNDQ2LDcgQEAKIAlpZiAoYXAtPnZlcnNpb24gPj0gMikKIAkJd3JpdGVsKHRtcCwgJnJlZ3MtPlR1bmVGYXN0TGluayk7CiAKLQlpZiAoQUNFX0lTX1RJR09OX0koYXApKQotCQl3cml0ZWwodGlnb25Gd1N0YXJ0QWRkciwgJnJlZ3MtPlBjKTsKLQlpZiAoYXAtPnZlcnNpb24gPT0gMikKLQkJd3JpdGVsKHRpZ29uMkZ3U3RhcnRBZGRyLCAmcmVncy0+UGMpOworCXdyaXRlbChhcC0+ZmlybXdhcmVfc3RhcnQsICZyZWdzLT5QYyk7CiAKIAl3cml0ZWwoMCwgJnJlZ3MtPk1iMExvKTsKIApAQCAtMjc2MSw4ICsyNzYzLDggQEAKIAogCXN0cmxjcHkoaW5mby0+ZHJpdmVyLCAiYWNlbmljIiwgc2l6ZW9mKGluZm8tPmRyaXZlcikpOwogCXNucHJpbnRmKGluZm8tPnZlcnNpb24sIHNpemVvZihpbmZvLT52ZXJzaW9uKSwgIiVpLiVpLiVpIiwKLQkJdGlnb25Gd1JlbGVhc2VNYWpvciwgdGlnb25Gd1JlbGVhc2VNaW5vciwKLQkJdGlnb25Gd1JlbGVhc2VGaXgpOworCQkgYXAtPmZpcm13YXJlX21ham9yLCBhcC0+ZmlybXdhcmVfbWlub3IsCisJCSBhcC0+ZmlybXdhcmVfZml4KTsKIAogCWlmIChhcC0+cGRldikKIAkJc3RybGNweShpbmZvLT5idXNfaW5mbywgcGNpX25hbWUoYXAtPnBkZXYpLApAQCAtMjg2OSwxMSArMjg3MSwxMCBAQAogfQogCiAKLXN0YXRpYyB2b2lkIF9fZGV2aW5pdCBhY2VfY29weShzdHJ1Y3QgYWNlX3JlZ3MgX19pb21lbSAqcmVncywgdm9pZCAqc3JjLAotCQkJICAgIHUzMiBkZXN0LCBpbnQgc2l6ZSkKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBhY2VfY29weShzdHJ1Y3QgYWNlX3JlZ3MgX19pb21lbSAqcmVncywgY29uc3QgX19iZTMyICpzcmMsCisJCQkgICAgICAgdTMyIGRlc3QsIGludCBzaXplKQogewogCXZvaWQgX19pb21lbSAqdGRlc3Q7Ci0JdTMyICp3c3JjOwogCXNob3J0IHRzaXplLCBpOwogCiAJaWYgKHNpemUgPD0gMCkKQEAgLTI4ODUsMjAgKzI4ODYsMTUgQEAKIAkJdGRlc3QgPSAodm9pZCBfX2lvbWVtICopICZyZWdzLT5XaW5kb3cgKwogCQkJKGRlc3QgJiAoQUNFX1dJTkRPV19TSVpFIC0gMSkpOwogCQl3cml0ZWwoZGVzdCAmIH4oQUNFX1dJTkRPV19TSVpFIC0gMSksICZyZWdzLT5XaW5CYXNlKTsKLQkJLyoKLQkJICogVGhpcyByZXF1aXJlcyBieXRlIHN3YXBwaW5nIG9uIGJpZyBlbmRpYW4sIGhvd2V2ZXIKLQkJICogd3JpdGVsIGRvZXMgdGhhdCBmb3IgdXMKLQkJICovCi0JCXdzcmMgPSBzcmM7CiAJCWZvciAoaSA9IDA7IGkgPCAodHNpemUgLyA0KTsgaSsrKSB7Ci0JCQl3cml0ZWwod3NyY1tpXSwgdGRlc3QgKyBpKjQpOworCQkJLyogRmlybXdhcmUgaXMgYmlnLWVuZGlhbiAqLworCQkJd3JpdGVsKGJlMzJfdG9fY3B1cChzcmMpLCB0ZGVzdCk7CisJCQlzcmMrKzsKKwkJCXRkZXN0ICs9IDQ7CisJCQlkZXN0ICs9IDQ7CisJCQlzaXplIC09IDQ7CiAJCX0KLQkJZGVzdCArPSB0c2l6ZTsKLQkJc3JjICs9IHRzaXplOwotCQlzaXplIC09IHRzaXplOwogCX0KLQotCXJldHVybjsKIH0KIAogCkBAIC0yOTM3LDggKzI5MzMsMTMgQEAKICAqLwogc3RhdGljIGludCBfX2RldmluaXQgYWNlX2xvYWRfZmlybXdhcmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKKwljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3OworCWNvbnN0IGNoYXIgKmZ3X25hbWUgPSAiYWNlbmljL3RnMi5iaW4iOwogCXN0cnVjdCBhY2VfcHJpdmF0ZSAqYXAgPSBuZXRkZXZfcHJpdihkZXYpOwogCXN0cnVjdCBhY2VfcmVncyBfX2lvbWVtICpyZWdzID0gYXAtPnJlZ3M7CisJY29uc3QgX19iZTMyICpmd19kYXRhOworCXUzMiBsb2FkX2FkZHI7CisJaW50IHJldDsKIAogCWlmICghKHJlYWRsKCZyZWdzLT5DcHVDdHJsKSAmIENQVV9IQUxURUQpKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiJXM6IHRyeWluZyB0byBkb3dubG9hZCBmaXJtd2FyZSB3aGlsZSB0aGUgIgpAQCAtMjk0NiwyOCArMjk0Nyw1MiBAQAogCQlyZXR1cm4gLUVGQVVMVDsKIAl9CiAKLQkvKgotCSAqIERvIG5vdCB0cnkgdG8gY2xlYXIgbW9yZSB0aGFuIDUxMktCIG9yIHdlIGVuZCB1cCBzZWVpbmcKLQkgKiBmdW5ueSB0aGluZ3Mgb24gTklDcyB3aXRoIG9ubHkgNTEyS0IgU1JBTQotCSAqLwotCWFjZV9jbGVhcihyZWdzLCAweDIwMDAsIDB4ODAwMDAtMHgyMDAwKTsKLQlpZiAoQUNFX0lTX1RJR09OX0koYXApKSB7Ci0JCWFjZV9jb3B5KHJlZ3MsIHRpZ29uRndUZXh0LCB0aWdvbkZ3VGV4dEFkZHIsIHRpZ29uRndUZXh0TGVuKTsKLQkJYWNlX2NvcHkocmVncywgdGlnb25Gd0RhdGEsIHRpZ29uRndEYXRhQWRkciwgdGlnb25Gd0RhdGFMZW4pOwotCQlhY2VfY29weShyZWdzLCB0aWdvbkZ3Um9kYXRhLCB0aWdvbkZ3Um9kYXRhQWRkciwKLQkJCSB0aWdvbkZ3Um9kYXRhTGVuKTsKLQkJYWNlX2NsZWFyKHJlZ3MsIHRpZ29uRndCc3NBZGRyLCB0aWdvbkZ3QnNzTGVuKTsKLQkJYWNlX2NsZWFyKHJlZ3MsIHRpZ29uRndTYnNzQWRkciwgdGlnb25Gd1Nic3NMZW4pOwotCX1lbHNlIGlmIChhcC0+dmVyc2lvbiA9PSAyKSB7Ci0JCWFjZV9jbGVhcihyZWdzLCB0aWdvbjJGd0Jzc0FkZHIsIHRpZ29uMkZ3QnNzTGVuKTsKLQkJYWNlX2NsZWFyKHJlZ3MsIHRpZ29uMkZ3U2Jzc0FkZHIsIHRpZ29uMkZ3U2Jzc0xlbik7Ci0JCWFjZV9jb3B5KHJlZ3MsIHRpZ29uMkZ3VGV4dCwgdGlnb24yRndUZXh0QWRkcix0aWdvbjJGd1RleHRMZW4pOwotCQlhY2VfY29weShyZWdzLCB0aWdvbjJGd1JvZGF0YSwgdGlnb24yRndSb2RhdGFBZGRyLAotCQkJIHRpZ29uMkZ3Um9kYXRhTGVuKTsKLQkJYWNlX2NvcHkocmVncywgdGlnb24yRndEYXRhLCB0aWdvbjJGd0RhdGFBZGRyLHRpZ29uMkZ3RGF0YUxlbik7CisJaWYgKEFDRV9JU19USUdPTl9JKGFwKSkKKwkJZndfbmFtZSA9ICJhY2VuaWMvdGcxLmJpbiI7CisKKwlyZXQgPSByZXF1ZXN0X2Zpcm13YXJlKCZmdywgZndfbmFtZSwgJmFwLT5wZGV2LT5kZXYpOworCWlmIChyZXQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogRmFpbGVkIHRvIGxvYWQgZmlybXdhcmUgXCIlc1wiXG4iLAorCQkgICAgICAgYXAtPm5hbWUsIGZ3X25hbWUpOworCQlyZXR1cm4gcmV0OwogCX0KIAotCXJldHVybiAwOworCWZ3X2RhdGEgPSAodm9pZCAqKWZ3LT5kYXRhOworCisJLyogRmlybXdhcmUgYmxvYiBzdGFydHMgd2l0aCB2ZXJzaW9uIG51bWJlcnMsIGZvbGxvd2VkIGJ5CisJICAgbG9hZCBhbmQgc3RhcnQgYWRkcmVzcy4gUmVtYWluZGVyIGlzIHRoZSBibG9iIHRvIGJlIGxvYWRlZAorCSAgIGNvbnRpZ3VvdXNseSBmcm9tIGxvYWQgYWRkcmVzcy4gV2UgZG9uJ3QgYm90aGVyIHRvIHJlcHJlc2VudAorCSAgIHRoZSBCU1MvU0JTUyBzZWN0aW9ucyBhbnkgbW9yZSwgc2luY2Ugd2Ugd2VyZSBjbGVhcmluZyB0aGUKKwkgICB3aG9sZSB0aGluZyBhbnl3YXkuICovCisJYXAtPmZpcm13YXJlX21ham9yID0gZnctPmRhdGFbMF07CisJYXAtPmZpcm13YXJlX21pbm9yID0gZnctPmRhdGFbMV07CisJYXAtPmZpcm13YXJlX2ZpeCA9IGZ3LT5kYXRhWzJdOworCisJYXAtPmZpcm13YXJlX3N0YXJ0ID0gYmUzMl90b19jcHUoZndfZGF0YVsxXSk7CisJaWYgKGFwLT5maXJtd2FyZV9zdGFydCA8IDB4NDAwMCB8fCBhcC0+ZmlybXdhcmVfc3RhcnQgPj0gMHg4MDAwMCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBib2d1cyBsb2FkIGFkZHJlc3MgJTA4eCBpbiBcIiVzXCJcbiIsCisJCSAgICAgICBhcC0+bmFtZSwgYXAtPmZpcm13YXJlX3N0YXJ0LCBmd19uYW1lKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCisJbG9hZF9hZGRyID0gYmUzMl90b19jcHUoZndfZGF0YVsyXSk7CisJaWYgKGxvYWRfYWRkciA8IDB4NDAwMCB8fCBsb2FkX2FkZHIgPj0gMHg4MDAwMCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBib2d1cyBsb2FkIGFkZHJlc3MgJTA4eCBpbiBcIiVzXCJcbiIsCisJCSAgICAgICBhcC0+bmFtZSwgbG9hZF9hZGRyLCBmd19uYW1lKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCisJLyoKKwkgKiBEbyBub3QgdHJ5IHRvIGNsZWFyIG1vcmUgdGhhbiA1MTJLaUIgb3Igd2UgZW5kIHVwIHNlZWluZworCSAqIGZ1bm55IHRoaW5ncyBvbiBOSUNzIHdpdGggb25seSA1MTJLaUIgU1JBTQorCSAqLworCWFjZV9jbGVhcihyZWdzLCAweDIwMDAsIDB4ODAwMDAtMHgyMDAwKTsKKwlhY2VfY29weShyZWdzLCAmZndfZGF0YVszXSwgbG9hZF9hZGRyLCBmdy0+c2l6ZS0xMik7Cisgb3V0OgorCXJlbGVhc2VfZmlybXdhcmUoZncpOworCXJldHVybiByZXQ7CiB9CiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYWNlbmljLmggYi9kcml2ZXJzL25ldC9hY2VuaWMuaAppbmRleCA0NDg3ZjMyNy4uYzk4N2M5YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYWNlbmljLmgKKysrIGIvZHJpdmVycy9uZXQvYWNlbmljLmgKQEAgLTY5NCw2ICs2OTQsMTAgQEAKIAl1MzIJCQlsYXN0X3R4LCBsYXN0X3N0ZF9yeCwgbGFzdF9taW5pX3J4OwogI2VuZGlmCiAJaW50CQkJcGNpX3VzaW5nX2RhYzsKKwl1OAkJCWZpcm13YXJlX21ham9yOworCXU4CQkJZmlybXdhcmVfbWlub3I7CisJdTgJCQlmaXJtd2FyZV9maXg7CisJdTMyCQkJZmlybXdhcmVfc3RhcnQ7CiB9OwogCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2FjZW5pY19maXJtd2FyZS5oIGIvZHJpdmVycy9uZXQvYWNlbmljX2Zpcm13YXJlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkNDFmNzguLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9uZXQvYWNlbmljX2Zpcm13YXJlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5NDU2ICswLDAgQEAKLS8qCi0gKiBEZWNsYXJlIHRoZXNlIGhlcmUgZXZlbiBpZiBUaWdvbiBJIHN1cHBvcnQgaXMgZGlzYWJsZWQgdG8gYXZvaWQKLSAqIHRoZSBjb21waWxlciBjb21wbGFpbmluZyBhYm91dCB1bmRlZmluZWQgc3ltYm9scy4KLSAqLwotI2RlZmluZSB0aWdvbkZ3UmVsZWFzZU1ham9yIDB4YwotI2RlZmluZSB0aWdvbkZ3UmVsZWFzZU1pbm9yIDB4NAotI2RlZmluZSB0aWdvbkZ3UmVsZWFzZUZpeCAweGIKLSNkZWZpbmUgdGlnb25Gd1N0YXJ0QWRkciAweDAwMDA0MDAwCi0jZGVmaW5lIHRpZ29uRndUZXh0QWRkciAweDAwMDA0MDAwCi0jZGVmaW5lIHRpZ29uRndUZXh0TGVuIDB4MTExNDAKLSNkZWZpbmUgdGlnb25Gd1JvZGF0YUFkZHIgMHgwMDAxNTE0MAotI2RlZmluZSB0aWdvbkZ3Um9kYXRhTGVuIDB4YWMwCi0jZGVmaW5lIHRpZ29uRndEYXRhQWRkciAweDAwMDE1YzIwCi0jZGVmaW5lIHRpZ29uRndEYXRhTGVuIDB4MTcwCi0jZGVmaW5lIHRpZ29uRndTYnNzQWRkciAweDAwMDE1ZDkwCi0jZGVmaW5lIHRpZ29uRndTYnNzTGVuIDB4MzgKLSNkZWZpbmUgdGlnb25Gd0Jzc0FkZHIgMHgwMDAxNWRkMAotI2RlZmluZSB0aWdvbkZ3QnNzTGVuIDB4MjA4MAotI2lmZGVmIENPTkZJR19BQ0VOSUNfT01JVF9USUdPTl9JCi0jZGVmaW5lIHRpZ29uRndUZXh0IE5VTEwKLSNkZWZpbmUgdGlnb25Gd0RhdGEgTlVMTAotI2RlZmluZSB0aWdvbkZ3Um9kYXRhIE5VTEwKLSNlbHNlCi0vKiBHZW5lcmF0ZWQgYnkgZ2VuZncuYyAqLwotc3RhdGljIHUzMiB0aWdvbkZ3VGV4dFsoTUFYX1RFWFRfTEVOLzQpICsgMV0gX19kZXZpbml0ZGF0YSA9IHsKLTB4MTAwMDAwMDMsCi0weDAsIDB4ZCwgMHhkLCAweDNjMWQwMDAxLAotMHg4ZmJkNWM1NCwgMHgzYTBmMDIxLCAweDNjMTAwMDAwLCAweDI2MTA0MDAwLAotMHhjMDAxMDBjLCAweDAsIDB4ZCwgMHgyN2JkZmZkOCwKLTB4M2MxY2MwMDAsIDB4M2MxYjAwMTMsIDB4Mzc3YmQ4MDAsIDB4ZDAyMSwKLTB4M2MxNzAwMTMsIDB4MzZmNzU0MTgsIDB4MmUwMjAyMSwgMHgzNDA1ODNlOCwKLTB4YWZiZjAwMjQsIDB4YzAwMjQ4OCwgMHhhZmIwMDAyMCwgMHhjMDAyM2U4LAotMHgwLCAweDNjMDQwMDAxLCAweDI0ODQ1MWE0LCAweDI0MDUwMDAxLAotMHgyZTAzMDIxLCAweDM4MjEsIDB4M2MxMDAwMDEsIDB4MjYxMDdlNTAsCi0weGFmYjAwMDEwLCAweGMwMDI0MDMsIDB4YWZiYjAwMTQsIDB4M2MwMjAwMGYsCi0weDM0NDJmZmZmLCAweDIwMjEwMjQsIDB4MzYyMTAyYiwgMHgxMDQwMDAwOSwKLTB4MjQwNTAwMDMsIDB4M2MwNDAwMDEsIDB4MjQ4NDUxYjAsIDB4MjAwMzAyMSwKLTB4MzYwMzgyMSwgMHgzYzAyMDAxMCwgMHhhZmEyMDAxMCwgMHhjMDAyNDAzLAotMHhhZmEwMDAxNCwgMHgyMDIxLCAweDM0MDVjMDAwLCAweDNjMDEwMDAxLAotMHgzNzA4MjEsIDB4YTAyMDgzYjAsIDB4M2MwMTAwMDEsIDB4MzcwODIxLAotMHhhMDIwODNiMiwgMHgzYzAxMDAwMSwgMHgzNzA4MjEsIDB4YTAyMDgzYjMsCi0weDNjMDEwMDAxLCAweDM3MDgyMSwgMHhhYzIwODNiNCwgMHhhMmUwMDRkOCwKLTB4NDE4YzAsIDB4MjQ4NDAwMDEsIDB4NzcxMDIxLCAweGFjNDA3MjdjLAotMHg3NzEwMjEsIDB4YWM0MDcyODAsIDB4MmUzMTAyMSwgMHhhNDQ1NzI3YywKLTB4MmM4MjAwMjAsIDB4MTQ0MGZmZjcsIDB4NDE4YzAsIDB4MjAyMSwKLTB4MzQwNWMwMDAsIDB4NDE4YzAsIDB4MjQ4NDAwMDEsIDB4NzcxMDIxLAotMHhhYzQwNzM3YywgMHg3NzEwMjEsIDB4YWM0MDczODAsIDB4MmUzMTAyMSwKLTB4YTQ0NTczN2MsIDB4MmM4MjAwODAsIDB4NTQ0MGZmZjcsIDB4NDE4YzAsCi0weGFmODAwMDU0LCAweGFmODAwMTFjLCAweDhmODIwMDQ0LCAweDM0NDIwMDQwLAotMHhhZjgyMDA0NCwgMHg4ZjgyMDA0NCwgMHgzNDQyMDAyMCwgMHhhZjgyMDA0NCwKLTB4OGY0MjAyMTgsIDB4MzA0MjAwMDIsIDB4MTA0MDAwMDksIDB4MCwKLTB4OGY0MjAyMjAsIDB4M2MwMzAwMDIsIDB4MzQ2MzAwMDQsIDB4NDMxMDI1LAotMHhhZWUyMDRjNCwgMHg4ZjQyMDIxYywgMHg4MDAxMDc0LCAweDM0NDIwMDA0LAotMHg4ZjQyMDIyMCwgMHgzYzAzMDAwMiwgMHgzNDYzMDAwNiwgMHg0MzEwMjUsCi0weGFlZTIwNGM0LCAweDhmNDIwMjFjLCAweDM0NDIwMDA2LCAweGFlZTIwNGNjLAotMHg4ZjQyMDIxOCwgMHgzMDQyMDAxMCwgMHgxMDQwMDAwYSwgMHgwLAotMHg4ZjQyMDIxYywgMHgzNDQyMDAwNCwgMHhhZWUyMDRjOCwgMHg4ZjQyMDIyMCwKLTB4M2MwMzAwMGEsIDB4MzQ2MzAwMDQsIDB4NDMxMDI1LCAweDgwMDEwOGEsCi0weGFlZTIwNGMwLCAweDhmNDIwMjIwLCAweDNjMDMwMDBhLCAweDM0NjMwMDA2LAotMHg0MzEwMjUsIDB4YWVlMjA0YzAsIDB4OGY0MjAyMWMsIDB4MzQ0MjAwMDYsCi0weGFlZTIwNGM4LCAweDhmNDIwMjE4LCAweDMwNDIwMjAwLCAweDEwNDAwMDAzLAotMHgyNDAyMDAwMSwgMHg4MDAxMDkxLCAweGEyZTI3MjQ4LCAweGEyZTA3MjQ4LAotMHgyNDAyMDAwMSwgMHhhZjgyMDBhMCwgMHhhZjgyMDBiMCwgMHg4ZjgzMDA1NCwKLTB4OGY4MjAwNTQsIDB4ODAwMTA5OSwgMHgyNDYzMDA2NCwgMHg4ZjgyMDA1NCwKLTB4NjIxMDIzLCAweDJjNDIwMDY1LCAweDE0NDBmZmZjLCAweDAsCi0weGFmODAwMDQ0LCAweDhmNDIwMjA4LCAweDhmNDMwMjBjLCAweGFlZTIwMDEwLAotMHhhZWUzMDAxNCwgMHg4ZWU0MDAxMCwgMHg4ZWU1MDAxNCwgMHgyNmUyMDAzMCwKLTB4YWVlMjAwMjgsIDB4MjQwMjA0OTAsIDB4YWVlMjAwMTgsIDB4YWY4NDAwOTAsCi0weGFmODUwMDk0LCAweDhlZTIwMDI4LCAweGFmODIwMGI0LCAweDk2ZTIwMDFhLAotMHhhZjgyMDA5YywgMHg4ZjgyMDBiMCwgMHg4ZWUzMDRjYywgMHg0MzEwMjUsCi0weGFmODIwMGIwLCAweDhmODIwMGIwLCAweDMwNDIwMDA0LCAweDE0NDBmZmZkLAotMHgwLCAweDhlZTIwNDUwLCAweDhlZTMwNDU0LCAweGFlZTMwNGZjLAotMHg4ZWUyMDRmYywgMHgyNDQyZTAwMCwgMHgyYzQyMjAwMSwgMHgxNDQwMDAwZCwKLTB4MjZlNDAwMzAsIDB4OGVlMjA0NTAsIDB4OGVlMzA0NTQsIDB4M2MwNDAwMDEsCi0weDI0ODQ1MWJjLCAweDNjMDUwMDAxLCAweGFmYTAwMDEwLCAweGFmYTAwMDE0LAotMHg4ZWU3MDRmYywgMHgzNGE1ZjAwMCwgMHhjMDAyNDAzLCAweDYwMzAyMSwKLTB4MjZlNDAwMzAsIDB4YzAwMjQ4OCwgMHgyNDA1MDQwMCwgMHgyNzQ0MDA4MCwKLTB4YzAwMjQ4OCwgMHgyNDA1MDA4MCwgMHgyNmU0Nzc3YywgMHhjMDAyNDg4LAotMHgyNDA1MDQwMCwgMHg4ZjQyMDI1YywgMHgyNmU0MDA5NCwgMHhhZWUyMDA2MCwKLTB4OGY0MjAyNjAsIDB4Mjc0NTAyMDAsIDB4MjQwNjAwMDgsIDB4YWVlMjAwNjgsCi0weDI0MDIwMDA2LCAweGMwMDI0OWEsIDB4YWVlMjAwNjQsIDB4M2MwMjNiOWEsCi0weDM0NDJjYTAwLCAweDIwMjEsIDB4MjQwMzAwMDIsIDB4YWVlMzAwNzQsCi0weGFlZTMwMDcwLCAweGFlZTIwMDZjLCAweDI0MDIwM2U4LCAweGFlZTIwMTA0LAotMHgyNDAyMDAwMSwgMHhhZWUzMDEwMCwgMHhhZWUyMDEwYywgMHgzYzAzMDAwMSwKLTB4NjQxODIxLCAweDkwNjM1YzIwLCAweDJlNDEwMjEsIDB4MjQ4NDAwMDEsCi0weGEwNDMwMDljLCAweDJjODIwMDBmLCAweDE0NDBmZmY4LCAweDAsCi0weDhmODIwMDQwLCAweDJlNDE4MjEsIDB4MjQ4NDAwMDEsIDB4MjE3MDIsCi0weDI0NDIwMDMwLCAweGEwNjIwMDljLCAweDJlNDEwMjEsIDB4YTA0MDAwOWMsCi0weDk2ZTIwNDZhLCAweDMwNDIwMDAzLCAweDE0NDAwMDA5LCAweDAsCi0weDk2ZTIwNDdhLCAweDMwNDIwMDAzLCAweDUwNDAwMTMxLCAweDNjMDMwODAwLAotMHg5NmUyMDQ2YSwgMHgzMDQyMDAwMywgMHgxMDQwMDAyYSwgMHgzYzAyMDcwMCwKLTB4OTZlMjA0N2EsIDB4MzA0MjAwMDMsIDB4MTA0MDAwMjYsIDB4M2MwMjA3MDAsCi0weDk2ZTMwNDdhLCAweDk2ZTIwNDZhLCAweDE0NjIwMDIyLCAweDNjMDIwNzAwLAotMHg4ZWUyMDRjMCwgMHgyNDAzMDAwMSwgMHhhMmUzNGUyMCwgMHgzNDQyMGUwMCwKLTB4YWVlMjA0YzAsIDB4OGY0MjAyMTgsIDB4MzA0MjAxMDAsIDB4MTA0MDAwMDUsCi0weDAsIDB4M2MwMjAwMDEsIDB4MjQ0MmUxNjgsIDB4ODAwMTExZCwKLTB4MjExMDAsIDB4M2MwMjAwMDEsIDB4MjQ0MmQzNWMsIDB4MjExMDAsCi0weDIxMTgyLCAweDNjMDMwODAwLCAweDQzMTAyNSwgMHgzYzAxMDAwMSwKLTB4YWMyMjEyMzgsIDB4M2MwMjAwMDEsIDB4MjQ0MmY2ODAsIDB4MjExMDAsCi0weDIxMTgyLCAweDNjMDMwODAwLCAweDQzMTAyNSwgMHgzYzAxMDAwMSwKLTB4YWMyMjEyNzgsIDB4OGVlMjAwMDAsIDB4MzQ0MjQwMDAsIDB4ODAwMTIzOCwKLTB4YWVlMjAwMDAsIDB4MzQ0MjMwMDAsIDB4YWZhMjAwMTgsIDB4OGVlMjA2MDgsCi0weDhmNDMwMjI4LCAweDI0NDIwMDAxLCAweDMwNDkwMGZmLCAweDUxMjMwMGUyLAotMHhhZmEwMDAxMCwgMHg4ZWUyMDYwOCwgMHgyMTBjMCwgMHg1NzEwMjEsCi0weDhmYTMwMDE4LCAweDhmYTQwMDFjLCAweGFjNDMwNjBjLCAweGFjNDQwNjEwLAotMHg4Zjg3MDEyMCwgMHgyNzYyMzgwMCwgMHgyNGU4MDAyMCwgMHgxMDIxMDJiLAotMHg1MDQwMDAwMSwgMHgyNzY4MzAwMCwgMHg4ZjgyMDEyOCwgMHgxMTAyMDAwNCwKLTB4MCwgMHg4ZjgyMDEyNCwgMHgxNTAyMDAwNywgMHgxMDIxLAotMHg4ZWUyMDFhNCwgMHgzMDIxLCAweDI0NDIwMDAxLCAweGFlZTIwMWE0LAotMHg4MDAxMWEwLCAweDhlZTIwMWE0LCAweDhlZTQwNjA4LCAweDQyMGMwLAotMHg4MDE4MjEsIDB4OGVlNDA0MzAsIDB4OGVlNTA0MzQsIDB4YTMyODIxLAotMHhhMzMwMmIsIDB4ODIyMDIxLCAweDg2MjAyMSwgMHhhY2U0MDAwMCwKLTB4YWNlNTAwMDQsIDB4OGVlMzA2MDgsIDB4MjQwMjAwMDgsIDB4YTRlMjAwMGUsCi0weDI0MDIwMDBkLCAweGFjZTIwMDE4LCAweGFjZTkwMDFjLCAweDMxOGMwLAotMHgyNDYzMDYwYywgMHgyZTMxMDIxLCAweGFjZTIwMDA4LCAweDhlZTIwNGM0LAotMHhhY2UyMDAxMCwgMHhhZjg4MDEyMCwgMHg5MmUyNGUyMCwgMHgxNDQwMDAzNywKLTB4MjQwNjAwMDEsIDB4OGVlMjRlMzAsIDB4MjEwYzAsIDB4MjQ0MjUwMzgsCi0weDJlMjIwMjEsIDB4OGM4MzAwMDAsIDB4MjQwMjAwMDcsIDB4MTQ2MjAwMWYsCi0weDAsIDB4OGVlMzRlMzAsIDB4OGVlMjRlMzQsIDB4MTA2MjAwMWIsCi0weDI0MDMwMDQwLCAweDhjODIwMDA0LCAweDI0NDIwMDAxLCAweGFjODIwMDA0LAotMHg4ZWUyNGUzNCwgMHg4ZWU1NGUzMCwgMHgyNDQyMDAwMSwgMHgxMDQzMDAwNywKLTB4MCwgMHg4ZWUyNGUzNCwgMHgyNDQyMDAwMSwgMHgxMGEyMDAwNSwKLTB4MCwgMHg4MDAxMThhLCAweDAsIDB4MTRhMDAwMDUsCi0weDAsIDB4OGY4MjAxMjgsIDB4MjQ0MjAwMjAsIDB4YWY4MjAxMjgsCi0weDhmODIwMTI4LCAweDhjODIwMDA0LCAweDJjNDIwMDExLCAweDUwNDAwMDEzLAotMHhhYzgwMDAwMCwgMHg4MDAxMWEwLCAweDAsIDB4OGVlMjRlMzAsCi0weDI0MDMwMDQwLCAweDI0NDIwMDAxLCAweDUwNDMwMDAzLCAweDEwMjEsCi0weDhlZTI0ZTMwLCAweDI0NDIwMDAxLCAweGFlZTI0ZTMwLCAweDhlZTI0ZTMwLAotMHgyMTBjMCwgMHgyNDQyNTAzOCwgMHgyZTIyMDIxLCAweDI0MDIwMDA3LAotMHhhYzgyMDAwMCwgMHgyNDAyMDAwMSwgMHhhYzgyMDAwNCwgMHg1NGMwMDAwYywKLTB4YWVlOTA2MDgsIDB4M2MwNDAwMDEsIDB4MjQ4NDUxYzgsIDB4YWZhMDAwMTAsCi0weGFmYTAwMDE0LCAweDhlZTYwNjA4LCAweDhmNDcwMjI4LCAweDNjMDUwMDA5LAotMHhjMDAyNDAzLCAweDM0YTVmMDAwLCAweDgwMDEyMjMsIDB4MCwKLTB4OGY4MzAxMjAsIDB4Mjc2MjM4MDAsIDB4MjQ2NjAwMjAsIDB4YzIxMDJiLAotMHg1MDQwMDAwMSwgMHgyNzY2MzAwMCwgMHg4ZjgyMDEyOCwgMHgxMGMyMDAwNCwKLTB4MCwgMHg4ZjgyMDEyNCwgMHgxNGMyMDAwNywgMHgwLAotMHg4ZWUyMDFhNCwgMHgzMDIxLCAweDI0NDIwMDAxLCAweGFlZTIwMWE0LAotMHg4MDAxMjA3LCAweDhlZTIwMWE0LCAweDhlZTIwNjA4LCAweGFjNjIwMDFjLAotMHg4ZWU0MDRhMCwgMHg4ZWU1MDRhNCwgMHgyNDYyMDAxYywgMHhhYzYyMDAwOCwKLTB4MjQwMjAwMDgsIDB4YTQ2MjAwMGUsIDB4MjQwMjAwMTEsIDB4YWM2MjAwMTgsCi0weGFjNjQwMDAwLCAweGFjNjUwMDA0LCAweDhlZTIwNGM0LCAweGFjNjIwMDEwLAotMHhhZjg2MDEyMCwgMHg5MmUyNGUyMCwgMHgxNDQwMDAzNywgMHgyNDA2MDAwMSwKLTB4OGVlMjRlMzAsIDB4MjEwYzAsIDB4MjQ0MjUwMzgsIDB4MmUyMjAyMSwKLTB4OGM4MzAwMDAsIDB4MjQwMjAwMTIsIDB4MTQ2MjAwMWYsIDB4MCwKLTB4OGVlMzRlMzAsIDB4OGVlMjRlMzQsIDB4MTA2MjAwMWIsIDB4MjQwMzAwNDAsCi0weDhjODIwMDA0LCAweDI0NDIwMDAxLCAweGFjODIwMDA0LCAweDhlZTI0ZTM0LAotMHg4ZWU1NGUzMCwgMHgyNDQyMDAwMSwgMHgxMDQzMDAwNywgMHgwLAotMHg4ZWUyNGUzNCwgMHgyNDQyMDAwMSwgMHgxMGEyMDAwNSwgMHgwLAotMHg4MDAxMWYxLCAweDAsIDB4MTRhMDAwMDUsIDB4MCwKLTB4OGY4MjAxMjgsIDB4MjQ0MjAwMjAsIDB4YWY4MjAxMjgsIDB4OGY4MjAxMjgsCi0weDhjODIwMDA0LCAweDJjNDIwMDExLCAweDUwNDAwMDEzLCAweGFjODAwMDAwLAotMHg4MDAxMjA3LCAweDAsIDB4OGVlMjRlMzAsIDB4MjQwMzAwNDAsCi0weDI0NDIwMDAxLCAweDUwNDMwMDAzLCAweDEwMjEsIDB4OGVlMjRlMzAsCi0weDI0NDIwMDAxLCAweGFlZTI0ZTMwLCAweDhlZTI0ZTMwLCAweDIxMGMwLAotMHgyNDQyNTAzOCwgMHgyZTIyMDIxLCAweDI0MDIwMDEyLCAweGFjODIwMDAwLAotMHgyNDAyMDAwMSwgMHhhYzgyMDAwNCwgMHgxNGMwMDAxYiwgMHgwLAotMHgzYzA0MDAwMSwgMHgyNDg0NTFkMCwgMHhhZmEwMDAxMCwgMHhhZmEwMDAxNCwKLTB4OGVlNjA2MDgsIDB4OGY0NzAyMjgsIDB4M2MwNTAwMDksIDB4YzAwMjQwMywKLTB4MzRhNWYwMDEsIDB4OGVlMjAxYjAsIDB4MjQ0MjAwMDEsIDB4YWVlMjAxYjAsCi0weDgwMDEyMjMsIDB4OGVlMjAxYjAsIDB4M2MwNDAwMDEsIDB4MjQ4NDUxZGMsCi0weGFmYTAwMDE0LCAweDhlZTYwNjA4LCAweDhmNDcwMjI4LCAweDNjMDUwMDA5LAotMHhjMDAyNDAzLCAweDM0YTVmMDA1LCAweDhlZTIwMWFjLCAweDI0NDIwMDAxLAotMHhhZWUyMDFhYywgMHg4ZWUyMDFhYywgMHg4ZWUyMDE2MCwgMHgzYzA0MDAwMSwKLTB4MjQ4NDUxZTgsIDB4MzQwNWYwMDEsIDB4MjQ0MjAwMDEsIDB4YWVlMjAxNjAsCi0weDhlZTIwMTYwLCAweDMwMjEsIDB4MzgyMSwgMHhhZmEwMDAxMCwKLTB4YzAwMjQwMywgMHhhZmEwMDAxNCwgMHg4MDAxMjM4LCAweDAsCi0weDNjMDIwMDAxLCAweDI0NDJmNWE4LCAweDIxMTAwLCAweDIxMTgyLAotMHg0MzEwMjUsIDB4M2MwMTAwMDEsIDB4YWMyMjEyNzgsIDB4OTZlMjA0NWEsCi0weDMwNDIwMDAzLCAweDEwNDAwMDI1LCAweDNjMDUwZmZmLCAweDhlZTIwNGM4LAotMHgzNGE1ZmZmZiwgMHgzNDQyMGEwMCwgMHhhZWUyMDRjOCwgMHg4ZWUzMDRjOCwKLTB4M2MwNDAwMDEsIDB4MjQ4NDUxZjQsIDB4MjQwMjAwMDEsIDB4YTJlMjA0ZWMsCi0weGEyZTIwNGVkLCAweDNjMDIwMDAyLCAweDYyMTgyNSwgMHgzYzAyMDAwMSwKLTB4MjQ0MmEzOTAsIDB4NDUxMDI0LCAweDIxMDgyLCAweGFlZTMwNGM4LAotMHgzYzAzMDgwMCwgMHg0MzEwMjUsIDB4M2MwMTAwMDEsIDB4YWMyMjEyMjAsCi0weDNjMDIwMDAxLCAweDI0NDJhZGQ0LCAweDQ1MTAyNCwgMHgyMTA4MiwKLTB4NDMxMDI1LCAweDNjMDEwMDAxLCAweGFjMjIxMjgwLCAweDk2ZTYwNDVhLAotMHgzODIxLCAweDI0MDUwMDExLCAweGFmYTAwMDEwLCAweGMwMDI0MDMsCi0weGFmYTAwMDE0LCAweDgwMDEyNjgsIDB4MCwgMHgzYzAyMDAwMSwKLTB4MjQ0MmE5ZDQsIDB4MjExMDAsIDB4MjExODIsIDB4M2MwMzA4MDAsCi0weDQzMTAyNSwgMHgzYzAxMDAwMSwgMHhhYzIyMTI4MCwgMHg5NmUyMDQ2YSwKLTB4MzA0MjAwMTAsIDB4MTQ0MDAwMDksIDB4MCwgMHg5NmUyMDQ3YSwKLTB4MzA0MjAwMTAsIDB4MTA0MDAxMTIsIDB4MCwgMHg5NmUyMDQ2YSwKLTB4MzA0MjAwMTAsIDB4MTA0MDAwMDUsIDB4M2MwMjA3MDAsIDB4OTZlMjA0N2EsCi0weDMwNDIwMDEwLCAweDE0NDAwMTAyLCAweDNjMDIwNzAwLCAweDM0NDIzMDAwLAotMHhhZmEyMDAxOCwgMHg4ZWUyMDYwOCwgMHg4ZjQzMDIyOCwgMHgyNDQyMDAwMSwKLTB4MzA0OTAwZmYsIDB4NTEyMzAwZTIsIDB4YWZhMDAwMTAsIDB4OGVlMjA2MDgsCi0weDIxMGMwLCAweDU3MTAyMSwgMHg4ZmEzMDAxOCwgMHg4ZmE0MDAxYywKLTB4YWM0MzA2MGMsIDB4YWM0NDA2MTAsIDB4OGY4NzAxMjAsIDB4Mjc2MjM4MDAsCi0weDI0ZTgwMDIwLCAweDEwMjEwMmIsIDB4NTA0MDAwMDEsIDB4Mjc2ODMwMDAsCi0weDhmODIwMTI4LCAweDExMDIwMDA0LCAweDAsIDB4OGY4MjAxMjQsCi0weDE1MDIwMDA3LCAweDEwMjEsIDB4OGVlMjAxYTQsIDB4MzAyMSwKLTB4MjQ0MjAwMDEsIDB4YWVlMjAxYTQsIDB4ODAwMTJlYSwgMHg4ZWUyMDFhNCwKLTB4OGVlNDA2MDgsIDB4NDIwYzAsIDB4ODAxODIxLCAweDhlZTQwNDMwLAotMHg4ZWU1MDQzNCwgMHhhMzI4MjEsIDB4YTMzMDJiLCAweDgyMjAyMSwKLTB4ODYyMDIxLCAweGFjZTQwMDAwLCAweGFjZTUwMDA0LCAweDhlZTMwNjA4LAotMHgyNDAyMDAwOCwgMHhhNGUyMDAwZSwgMHgyNDAyMDAwZCwgMHhhY2UyMDAxOCwKLTB4YWNlOTAwMWMsIDB4MzE4YzAsIDB4MjQ2MzA2MGMsIDB4MmUzMTAyMSwKLTB4YWNlMjAwMDgsIDB4OGVlMjA0YzQsIDB4YWNlMjAwMTAsIDB4YWY4ODAxMjAsCi0weDkyZTI0ZTIwLCAweDE0NDAwMDM3LCAweDI0MDYwMDAxLCAweDhlZTI0ZTMwLAotMHgyMTBjMCwgMHgyNDQyNTAzOCwgMHgyZTIyMDIxLCAweDhjODMwMDAwLAotMHgyNDAyMDAwNywgMHgxNDYyMDAxZiwgMHgwLCAweDhlZTM0ZTMwLAotMHg4ZWUyNGUzNCwgMHgxMDYyMDAxYiwgMHgyNDAzMDA0MCwgMHg4YzgyMDAwNCwKLTB4MjQ0MjAwMDEsIDB4YWM4MjAwMDQsIDB4OGVlMjRlMzQsIDB4OGVlNTRlMzAsCi0weDI0NDIwMDAxLCAweDEwNDMwMDA3LCAweDAsIDB4OGVlMjRlMzQsCi0weDI0NDIwMDAxLCAweDEwYTIwMDA1LCAweDAsIDB4ODAwMTJkNCwKLTB4MCwgMHgxNGEwMDAwNSwgMHgwLCAweDhmODIwMTI4LAotMHgyNDQyMDAyMCwgMHhhZjgyMDEyOCwgMHg4ZjgyMDEyOCwgMHg4YzgyMDAwNCwKLTB4MmM0MjAwMTEsIDB4NTA0MDAwMTMsIDB4YWM4MDAwMDAsIDB4ODAwMTJlYSwKLTB4MCwgMHg4ZWUyNGUzMCwgMHgyNDAzMDA0MCwgMHgyNDQyMDAwMSwKLTB4NTA0MzAwMDMsIDB4MTAyMSwgMHg4ZWUyNGUzMCwgMHgyNDQyMDAwMSwKLTB4YWVlMjRlMzAsIDB4OGVlMjRlMzAsIDB4MjEwYzAsIDB4MjQ0MjUwMzgsCi0weDJlMjIwMjEsIDB4MjQwMjAwMDcsIDB4YWM4MjAwMDAsIDB4MjQwMjAwMDEsCi0weGFjODIwMDA0LCAweDU0YzAwMDBjLCAweGFlZTkwNjA4LCAweDNjMDQwMDAxLAotMHgyNDg0NTFjOCwgMHhhZmEwMDAxMCwgMHhhZmEwMDAxNCwgMHg4ZWU2MDYwOCwKLTB4OGY0NzAyMjgsIDB4M2MwNTAwMDksIDB4YzAwMjQwMywgMHgzNGE1ZjAwMCwKLTB4ODAwMTM2ZCwgMHgwLCAweDhmODMwMTIwLCAweDI3NjIzODAwLAotMHgyNDY2MDAyMCwgMHhjMjEwMmIsIDB4NTA0MDAwMDEsIDB4Mjc2NjMwMDAsCi0weDhmODIwMTI4LCAweDEwYzIwMDA0LCAweDAsIDB4OGY4MjAxMjQsCi0weDE0YzIwMDA3LCAweDAsIDB4OGVlMjAxYTQsIDB4MzAyMSwKLTB4MjQ0MjAwMDEsIDB4YWVlMjAxYTQsIDB4ODAwMTM1MSwgMHg4ZWUyMDFhNCwKLTB4OGVlMjA2MDgsIDB4YWM2MjAwMWMsIDB4OGVlNDA0YTAsIDB4OGVlNTA0YTQsCi0weDI0NjIwMDFjLCAweGFjNjIwMDA4LCAweDI0MDIwMDA4LCAweGE0NjIwMDBlLAotMHgyNDAyMDAxMSwgMHhhYzYyMDAxOCwgMHhhYzY0MDAwMCwgMHhhYzY1MDAwNCwKLTB4OGVlMjA0YzQsIDB4YWM2MjAwMTAsIDB4YWY4NjAxMjAsIDB4OTJlMjRlMjAsCi0weDE0NDAwMDM3LCAweDI0MDYwMDAxLCAweDhlZTI0ZTMwLCAweDIxMGMwLAotMHgyNDQyNTAzOCwgMHgyZTIyMDIxLCAweDhjODMwMDAwLCAweDI0MDIwMDEyLAotMHgxNDYyMDAxZiwgMHgwLCAweDhlZTM0ZTMwLCAweDhlZTI0ZTM0LAotMHgxMDYyMDAxYiwgMHgyNDAzMDA0MCwgMHg4YzgyMDAwNCwgMHgyNDQyMDAwMSwKLTB4YWM4MjAwMDQsIDB4OGVlMjRlMzQsIDB4OGVlNTRlMzAsIDB4MjQ0MjAwMDEsCi0weDEwNDMwMDA3LCAweDAsIDB4OGVlMjRlMzQsIDB4MjQ0MjAwMDEsCi0weDEwYTIwMDA1LCAweDAsIDB4ODAwMTMzYiwgMHgwLAotMHgxNGEwMDAwNSwgMHgwLCAweDhmODIwMTI4LCAweDI0NDIwMDIwLAotMHhhZjgyMDEyOCwgMHg4ZjgyMDEyOCwgMHg4YzgyMDAwNCwgMHgyYzQyMDAxMSwKLTB4NTA0MDAwMTMsIDB4YWM4MDAwMDAsIDB4ODAwMTM1MSwgMHgwLAotMHg4ZWUyNGUzMCwgMHgyNDAzMDA0MCwgMHgyNDQyMDAwMSwgMHg1MDQzMDAwMywKLTB4MTAyMSwgMHg4ZWUyNGUzMCwgMHgyNDQyMDAwMSwgMHhhZWUyNGUzMCwKLTB4OGVlMjRlMzAsIDB4MjEwYzAsIDB4MjQ0MjUwMzgsIDB4MmUyMjAyMSwKLTB4MjQwMjAwMTIsIDB4YWM4MjAwMDAsIDB4MjQwMjAwMDEsIDB4YWM4MjAwMDQsCi0weDE0YzAwMDFiLCAweDAsIDB4M2MwNDAwMDEsIDB4MjQ4NDUxZDAsCi0weGFmYTAwMDEwLCAweGFmYTAwMDE0LCAweDhlZTYwNjA4LCAweDhmNDcwMjI4LAotMHgzYzA1MDAwOSwgMHhjMDAyNDAzLCAweDM0YTVmMDAxLCAweDhlZTIwMWIwLAotMHgyNDQyMDAwMSwgMHhhZWUyMDFiMCwgMHg4MDAxMzZkLCAweDhlZTIwMWIwLAotMHgzYzA0MDAwMSwgMHgyNDg0NTFkYywgMHhhZmEwMDAxNCwgMHg4ZWU2MDYwOCwKLTB4OGY0NzAyMjgsIDB4M2MwNTAwMDksIDB4YzAwMjQwMywgMHgzNGE1ZjAwNSwKLTB4OGVlMjAxYWMsIDB4MjQ0MjAwMDEsIDB4YWVlMjAxYWMsIDB4OGVlMjAxYWMsCi0weDhlZTIwMTYwLCAweDNjMDQwMDAxLCAweDI0ODQ1MWU4LCAweDM0MDVmMDAyLAotMHgyNDQyMDAwMSwgMHhhZWUyMDE2MCwgMHg4ZWUyMDE2MCwgMHgzMDIxLAotMHgzODIxLCAweGFmYTAwMDEwLCAweGMwMDI0MDMsIDB4YWZhMDAwMTQsCi0weDk2ZTYwNDdhLCAweDk2ZTcwNDZhLCAweDNjMDQwMDAxLCAweDI0ODQ1MjAwLAotMHgyNDA1MDAxMiwgMHhhZmEwMDAxMCwgMHhjMDAyNDAzLCAweGFmYTAwMDE0LAotMHhjMDA0NTAwLCAweDAsIDB4YzAwMjMxOCwgMHgwLAotMHgzYzA2MDAwMSwgMHgzNGM2MzgwMCwgMHhhZWUwMDYwOCwgMHhhZjQwMDIyOCwKLTB4YWY0MDAyMmMsIDB4OTZlMzA0NTgsIDB4OGVlNDAwMDAsIDB4M2MwNTEyZDgsCi0weDM0YTVjMzU4LCAweDI3NjIzODAwLCAweGFlZTI3MjU4LCAweDI3NjIzODAwLAotMHhhZWUyNzI2MCwgMHgyNzYyMzgwMCwgMHhhZWUyNzI2NCwgMHgzNjYxMDIxLAotMHhhZWUyNzI3MCwgMHgyNDAyZmZmZiwgMHhhZWUwMDRkNCwgMHhhZWUwMDRlMCwKLTB4YWVlMDA0ZTQsIDB4YWVlMDA0ZjAsIDB4YTJlMDA0ZjQsIDB4YWVlMDBlMGMsCi0weGFlZTAwZTE4LCAweGFlZTAwZTEwLCAweGFlZTAwZTE0LCAweGFlZTAwZTFjLAotMHhhZWUwNzI0YywgMHhhZWUwNTI0NCwgMHhhZWUwNTI0MCwgMHhhZWUwNTIzYywKLTB4YWVlMDcyNTAsIDB4YWVlMDcyNTQsIDB4YWVlMDcyNWMsIDB4YWVlMDcyNjgsCi0weGFlZTAwNGQwLCAweDI0NjNmZmZmLCAweDg1MjAyNSwgMHhhZWUzMDRmOCwKLTB4YWVlNDAwMDAsIDB4YWY4MDAwNjAsIDB4YWY4MjAwNjQsIDB4M2MwMjAxMDAsCi0weGFmYTIwMDE4LCAweDhlZTIwNjA4LCAweDhmNDMwMjI4LCAweDI0NDIwMDAxLAotMHgzMDQ5MDBmZiwgMHg1MTIzMDBlMiwgMHhhZmEwMDAxMCwgMHg4ZWUyMDYwOCwKLTB4MjEwYzAsIDB4NTcxMDIxLCAweDhmYTMwMDE4LCAweDhmYTQwMDFjLAotMHhhYzQzMDYwYywgMHhhYzQ0MDYxMCwgMHg4Zjg3MDEyMCwgMHgyNzYyMzgwMCwKLTB4MjRlODAwMjAsIDB4MTAyMTAyYiwgMHg1MDQwMDAwMSwgMHgyNzY4MzAwMCwKLTB4OGY4MjAxMjgsIDB4MTEwMjAwMDQsIDB4MCwgMHg4ZjgyMDEyNCwKLTB4MTUwMjAwMDcsIDB4MTAyMSwgMHg4ZWUyMDFhNCwgMHgzMDIxLAotMHgyNDQyMDAwMSwgMHhhZWUyMDFhNCwgMHg4MDAxNDIyLCAweDhlZTIwMWE0LAotMHg4ZWU0MDYwOCwgMHg0MjBjMCwgMHg4MDE4MjEsIDB4OGVlNDA0MzAsCi0weDhlZTUwNDM0LCAweGEzMjgyMSwgMHhhMzMwMmIsIDB4ODIyMDIxLAotMHg4NjIwMjEsIDB4YWNlNDAwMDAsIDB4YWNlNTAwMDQsIDB4OGVlMzA2MDgsCi0weDI0MDIwMDA4LCAweGE0ZTIwMDBlLCAweDI0MDIwMDBkLCAweGFjZTIwMDE4LAotMHhhY2U5MDAxYywgMHgzMThjMCwgMHgyNDYzMDYwYywgMHgyZTMxMDIxLAotMHhhY2UyMDAwOCwgMHg4ZWUyMDRjNCwgMHhhY2UyMDAxMCwgMHhhZjg4MDEyMCwKLTB4OTJlMjRlMjAsIDB4MTQ0MDAwMzcsIDB4MjQwNjAwMDEsIDB4OGVlMjRlMzAsCi0weDIxMGMwLCAweDI0NDI1MDM4LCAweDJlMjIwMjEsIDB4OGM4MzAwMDAsCi0weDI0MDIwMDA3LCAweDE0NjIwMDFmLCAweDAsIDB4OGVlMzRlMzAsCi0weDhlZTI0ZTM0LCAweDEwNjIwMDFiLCAweDI0MDMwMDQwLCAweDhjODIwMDA0LAotMHgyNDQyMDAwMSwgMHhhYzgyMDAwNCwgMHg4ZWUyNGUzNCwgMHg4ZWU1NGUzMCwKLTB4MjQ0MjAwMDEsIDB4MTA0MzAwMDcsIDB4MCwgMHg4ZWUyNGUzNCwKLTB4MjQ0MjAwMDEsIDB4MTBhMjAwMDUsIDB4MCwgMHg4MDAxNDBjLAotMHgwLCAweDE0YTAwMDA1LCAweDAsIDB4OGY4MjAxMjgsCi0weDI0NDIwMDIwLCAweGFmODIwMTI4LCAweDhmODIwMTI4LCAweDhjODIwMDA0LAotMHgyYzQyMDAxMSwgMHg1MDQwMDAxMywgMHhhYzgwMDAwMCwgMHg4MDAxNDIyLAotMHgwLCAweDhlZTI0ZTMwLCAweDI0MDMwMDQwLCAweDI0NDIwMDAxLAotMHg1MDQzMDAwMywgMHgxMDIxLCAweDhlZTI0ZTMwLCAweDI0NDIwMDAxLAotMHhhZWUyNGUzMCwgMHg4ZWUyNGUzMCwgMHgyMTBjMCwgMHgyNDQyNTAzOCwKLTB4MmUyMjAyMSwgMHgyNDAyMDAwNywgMHhhYzgyMDAwMCwgMHgyNDAyMDAwMSwKLTB4YWM4MjAwMDQsIDB4NTRjMDAwMGMsIDB4YWVlOTA2MDgsIDB4M2MwNDAwMDEsCi0weDI0ODQ1MWM4LCAweGFmYTAwMDEwLCAweGFmYTAwMDE0LCAweDhlZTYwNjA4LAotMHg4ZjQ3MDIyOCwgMHgzYzA1MDAwOSwgMHhjMDAyNDAzLCAweDM0YTVmMDAwLAotMHg4MDAxNGE1LCAweDAsIDB4OGY4MzAxMjAsIDB4Mjc2MjM4MDAsCi0weDI0NjYwMDIwLCAweGMyMTAyYiwgMHg1MDQwMDAwMSwgMHgyNzY2MzAwMCwKLTB4OGY4MjAxMjgsIDB4MTBjMjAwMDQsIDB4MCwgMHg4ZjgyMDEyNCwKLTB4MTRjMjAwMDcsIDB4MCwgMHg4ZWUyMDFhNCwgMHgzMDIxLAotMHgyNDQyMDAwMSwgMHhhZWUyMDFhNCwgMHg4MDAxNDg5LCAweDhlZTIwMWE0LAotMHg4ZWUyMDYwOCwgMHhhYzYyMDAxYywgMHg4ZWU0MDRhMCwgMHg4ZWU1MDRhNCwKLTB4MjQ2MjAwMWMsIDB4YWM2MjAwMDgsIDB4MjQwMjAwMDgsIDB4YTQ2MjAwMGUsCi0weDI0MDIwMDExLCAweGFjNjIwMDE4LCAweGFjNjQwMDAwLCAweGFjNjUwMDA0LAotMHg4ZWUyMDRjNCwgMHhhYzYyMDAxMCwgMHhhZjg2MDEyMCwgMHg5MmUyNGUyMCwKLTB4MTQ0MDAwMzcsIDB4MjQwNjAwMDEsIDB4OGVlMjRlMzAsIDB4MjEwYzAsCi0weDI0NDI1MDM4LCAweDJlMjIwMjEsIDB4OGM4MzAwMDAsIDB4MjQwMjAwMTIsCi0weDE0NjIwMDFmLCAweDAsIDB4OGVlMzRlMzAsIDB4OGVlMjRlMzQsCi0weDEwNjIwMDFiLCAweDI0MDMwMDQwLCAweDhjODIwMDA0LCAweDI0NDIwMDAxLAotMHhhYzgyMDAwNCwgMHg4ZWUyNGUzNCwgMHg4ZWU1NGUzMCwgMHgyNDQyMDAwMSwKLTB4MTA0MzAwMDcsIDB4MCwgMHg4ZWUyNGUzNCwgMHgyNDQyMDAwMSwKLTB4MTBhMjAwMDUsIDB4MCwgMHg4MDAxNDczLCAweDAsCi0weDE0YTAwMDA1LCAweDAsIDB4OGY4MjAxMjgsIDB4MjQ0MjAwMjAsCi0weGFmODIwMTI4LCAweDhmODIwMTI4LCAweDhjODIwMDA0LCAweDJjNDIwMDExLAotMHg1MDQwMDAxMywgMHhhYzgwMDAwMCwgMHg4MDAxNDg5LCAweDAsCi0weDhlZTI0ZTMwLCAweDI0MDMwMDQwLCAweDI0NDIwMDAxLCAweDUwNDMwMDAzLAotMHgxMDIxLCAweDhlZTI0ZTMwLCAweDI0NDIwMDAxLCAweGFlZTI0ZTMwLAotMHg4ZWUyNGUzMCwgMHgyMTBjMCwgMHgyNDQyNTAzOCwgMHgyZTIyMDIxLAotMHgyNDAyMDAxMiwgMHhhYzgyMDAwMCwgMHgyNDAyMDAwMSwgMHhhYzgyMDAwNCwKLTB4MTRjMDAwMWIsIDB4MCwgMHgzYzA0MDAwMSwgMHgyNDg0NTFkMCwKLTB4YWZhMDAwMTAsIDB4YWZhMDAwMTQsIDB4OGVlNjA2MDgsIDB4OGY0NzAyMjgsCi0weDNjMDUwMDA5LCAweGMwMDI0MDMsIDB4MzRhNWYwMDEsIDB4OGVlMjAxYjAsCi0weDI0NDIwMDAxLCAweGFlZTIwMWIwLCAweDgwMDE0YTUsIDB4OGVlMjAxYjAsCi0weDNjMDQwMDAxLCAweDI0ODQ1MWRjLCAweGFmYTAwMDE0LCAweDhlZTYwNjA4LAotMHg4ZjQ3MDIyOCwgMHgzYzA1MDAwOSwgMHhjMDAyNDAzLCAweDM0YTVmMDA1LAotMHg4ZWUyMDFhYywgMHgyNDQyMDAwMSwgMHhhZWUyMDFhYywgMHg4ZWUyMDFhYywKLTB4OGVlMjAxNTQsIDB4MjQ0MjAwMDEsIDB4YWVlMjAxNTQsIDB4YzAwMTRkYywKLTB4OGVlMjAxNTQsIDB4OGY4MjAwYTAsIDB4MzA0MjAwMDQsIDB4MTQ0MGZmZmQsCi0weDAsIDB4OGY4MjAwNDAsIDB4MzA0MjAwMDEsIDB4MTQ0MDAwMDgsCi0weDAsIDB4OGY0MzAxMDQsIDB4MjQwMjAwMDEsIDB4MTA2MjAwMDQsCi0weDAsIDB4OGY0MjAyNjQsIDB4MTA0MDAwMDYsIDB4MCwKLTB4OGVlMjAxN2MsIDB4MjQ0MjAwMDEsIDB4YWVlMjAxN2MsIDB4ODAwMTRjNSwKLTB4OGVlMjAxN2MsIDB4OGY4MjAwNDQsIDB4MzQ0MjAwMDQsIDB4YWY4MjAwNDQsCi0weDhlZTIwMTc4LCAweDI0NDIwMDAxLCAweGFlZTIwMTc4LCAweDhlZTIwMTc4LAotMHg4ZjgyMDBkOCwgMHg4ZjgzMDBkNCwgMHg0MzEwMjMsIDB4YWVlMjcyNmMsCi0weDhlZTI3MjZjLCAweDFjNDAwMDAzLCAweDNjMDMwMDAxLCAweDQzMTAyMSwKLTB4YWVlMjcyNmMsIDB4YzAwNDA2NCwgMHgwLCAweGMwMDQ0NDAsCi0weGFmODAwMjI4LCAweDhmYmYwMDI0LCAweDhmYjAwMDIwLCAweDNlMDAwMDgsCi0weDI3YmQwMDI4LCAweDNlMDAwMDgsIDB4MCwgMHgzZTAwMDA4LAotMHgwLCAweDAsIDB4MCwgMHgyNDAyMDAyYywKLTB4YWY4MjAwNTAsIDB4YWVlMDcyNzQsIDB4OGY0MjAyMzgsIDB4YWVlMjcyNzgsCi0weDhmODIwMDU0LCAweDI0NDIwMDY3LCAweGFmODIwMDU4LCAweGFlZTA3Yjg4LAotMHhhZWUwN2I4YywgMHhhZWUwN2I4NCwgMHgzYzAxMDAwMSwgMHgzNzA4MjEsCi0weGFjMjA4M2JjLCAweDNjMDEwMDAxLCAweDM3MDgyMSwgMHgzZTAwMDA4LAotMHhhMDIwODNiOSwgMHgyN2JkZmZkOCwgMHhhZmJmMDAyNCwgMHhhZmIwMDAyMCwKLTB4OGY4MjAwNTQsIDB4M2MwMzAwMDEsIDB4OGM2MzVjZDgsIDB4MjQ0MjAwNjcsCi0weDEwNjAwMDBkLCAweGFmODIwMDU4LCAweDNjMDIwMDAxLCAweDU3MTAyMSwKLTB4OTA0MjgzYjgsIDB4MTA0MDAwMDUsIDB4M2MwMzAyMDAsIDB4M2MwMTAwMDEsCi0weDM3MDgyMSwgMHg4MDAxNTAzLCAweGEwMjA4M2I4LCAweDhlZTIwMDAwLAotMHg0MzEwMjUsIDB4YWVlMjAwMDAsIDB4OGY0MjAyMTgsIDB4MzA0MjAxMDAsCi0weDEwNDAwMGM2LCAweDAsIDB4OGY4MjAwYjAsIDB4MzA0MjAwMDQsCi0weDEwNDAwMGMyLCAweDAsIDB4M2MwMzAwMDEsIDB4NzcxODIxLAotMHg4YzYzODNkMCwgMHg4ZjgyMDEwNCwgMHgxNDYyMDBiNCwgMHgwLAotMHgzYzAzMDAwMSwgMHg3NzE4MjEsIDB4OGM2MzgzZDQsIDB4OGY4MjAwYjQsCi0weDE0NjIwMGFlLCAweDAsIDB4OGY4MjAwYjAsIDB4M2MwMzAwODAsCi0weDQzMTAyNCwgMHgxMDQwMDAwZCwgMHgwLCAweDhmODIwMTFjLAotMHgzNDQyMDAwMiwgMHhhZjgyMDExYywgMHg4ZjgyMDBiMCwgMHgyNDAzZmZmYiwKLTB4NDMxMDI0LCAweGFmODIwMGIwLCAweDhmODIwMTFjLCAweDI0MDNmZmZkLAotMHg0MzEwMjQsIDB4ODAwMTVjYywgMHhhZjgyMDExYywgMHgzYzAzMDAwMSwKLTB4NzcxODIxLCAweDhjNjM4M2QwLCAweDhmODIwMTA0LCAweDE0NjIwMDgyLAotMHgwLCAweDNjMDMwMDAxLCAweDc3MTgyMSwgMHg4YzYzODNkNCwKLTB4OGY4MjAwYjQsIDB4MTQ2MjAwN2MsIDB4MCwgMHgzYzA3MDAwMSwKLTB4ZjczODIxLCAweDhjZTc4M2QwLCAweDhmODIwMGIwLCAweDNjMDQwMDAxLAotMHgyNDg0NTI3MCwgMHhhZmEwMDAxNCwgMHhhZmEyMDAxMCwgMHg4Zjg2MDBiMCwKLTB4M2MwNTAwMDUsIDB4YzAwMjQwMywgMHgzNGE1MDkwMCwgMHg4ZjgyMDExYywKLTB4MzQ0MjAwMDIsIDB4YWY4MjAxMWMsIDB4OGY4MzAxMDQsIDB4OGY4MjAwYjAsCi0weDM0NDIwMDAxLCAweGFmODIwMGIwLCAweGFmODMwMTA0LCAweDhmODMwMTIwLAotMHgyNzYyMzgwMCwgMHgyNDY2MDAyMCwgMHhjMjEwMmIsIDB4NTA0MDAwMDEsCi0weDI3NjYzMDAwLCAweDhmODIwMTI4LCAweDEwYzIwMDA0LCAweDAsCi0weDhmODIwMTI0LCAweDE0YzIwMDA2LCAweDAsIDB4OGVlMjAxYTQsCi0weDI0NDIwMDAxLCAweGFlZTIwMWE0LCAweDgwMDE1YTAsIDB4OGVlMjAxYTQsCi0weDhmNDQwMjA4LCAweDhmNDUwMjBjLCAweDI2ZTIwMDMwLCAweGFjNjIwMDA4LAotMHgyNDAyMDQwMCwgMHhhNDYyMDAwZSwgMHgyNDAyMDAwZiwgMHhhYzYyMDAxOCwKLTB4YWM2MDAwMWMsIDB4YWM2NDAwMDAsIDB4YWM2NTAwMDQsIDB4OGVlMjA0YzQsCi0weGFjNjIwMDEwLCAweGFmODYwMTIwLCAweDkyZTI0ZTIwLCAweDE0NDAwMDM3LAotMHgwLCAweDhlZTI0ZTMwLCAweDIxMGMwLCAweDI0NDI1MDM4LAotMHgyZTIyMDIxLCAweDhjODMwMDAwLCAweDI0MDIwMDA3LCAweDE0NjIwMDFmLAotMHgwLCAweDhlZTM0ZTMwLCAweDhlZTI0ZTM0LCAweDEwNjIwMDFiLAotMHgyNDAzMDA0MCwgMHg4YzgyMDAwNCwgMHgyNDQyMDAwMSwgMHhhYzgyMDAwNCwKLTB4OGVlMjRlMzQsIDB4OGVlNTRlMzAsIDB4MjQ0MjAwMDEsIDB4MTA0MzAwMDcsCi0weDAsIDB4OGVlMjRlMzQsIDB4MjQ0MjAwMDEsIDB4MTBhMjAwMDUsCi0weDAsIDB4ODAwMTU4YSwgMHgwLCAweDE0YTAwMDA1LAotMHgwLCAweDhmODIwMTI4LCAweDI0NDIwMDIwLCAweGFmODIwMTI4LAotMHg4ZjgyMDEyOCwgMHg4YzgyMDAwNCwgMHgyYzQyMDAxMSwgMHg1MDQwMDAxMywKLTB4YWM4MDAwMDAsIDB4ODAwMTVhMCwgMHgwLCAweDhlZTI0ZTMwLAotMHgyNDAzMDA0MCwgMHgyNDQyMDAwMSwgMHg1MDQzMDAwMywgMHgxMDIxLAotMHg4ZWUyNGUzMCwgMHgyNDQyMDAwMSwgMHhhZWUyNGUzMCwgMHg4ZWUyNGUzMCwKLTB4MjEwYzAsIDB4MjQ0MjUwMzgsIDB4MmUyMjAyMSwgMHgyNDAyMDAwNywKLTB4YWM4MjAwMDAsIDB4MjQwMjAwMDEsIDB4YWM4MjAwMDQsIDB4OGY4MjAxMWMsCi0weDI0MDNmZmZkLCAweDQzMTAyNCwgMHhhZjgyMDExYywgMHg4ZWUyMDFlNCwKLTB4M2MwNzAwMDEsIDB4ZjczODIxLCAweDhjZTc4M2QwLCAweDI0NDIwMDAxLAotMHhhZWUyMDFlNCwgMHg4ZWUyMDFlNCwgMHgzYzA0MDAwMSwgMHgyNDg0NTI3YywKLTB4ODAwMTViZCwgMHhhZmEwMDAxMCwgMHg4ZjgyMDEwNCwgMHgzYzAxMDAwMSwKLTB4MzcwODIxLCAweGFjMjI4M2QwLCAweDhmODIwMGI0LCAweDNjMDcwMDAxLAotMHhmNzM4MjEsIDB4OGNlNzgzZDAsIDB4M2MwNDAwMDEsIDB4MjQ4NDUyODQsCi0weDNjMDEwMDAxLCAweDM3MDgyMSwgMHhhYzIyODNkNCwgMHhhZmEwMDAxMCwKLTB4YWZhMDAwMTQsIDB4OGY4NjAwYjAsIDB4M2MwNTAwMDUsIDB4YzAwMjQwMywKLTB4MzRhNTA5MDAsIDB4ODAwMTVjYywgMHgwLCAweDhmODIwMTA0LAotMHgzYzAxMDAwMSwgMHgzNzA4MjEsIDB4YWMyMjgzZDAsIDB4OGY4MjAwYjQsCi0weDNjMDEwMDAxLCAweDM3MDgyMSwgMHhhYzIyODNkNCwgMHg4ZWUyNzI3NCwKLTB4OTJlMzA0ZjQsIDB4MjQ0MjAwNjcsIDB4MTQ2MDAwMDYsIDB4YWVlMjcyNzQsCi0weDhlZTI3Mjc0LCAweDhmNDMwMjM0LCAweDQzMTAyYiwgMHgxNDQwMDA3YiwKLTB4MCwgMHg4ZWUzMDRlNCwgMHg4ZWUyMDRmOCwgMHgxNDYyMDAwNCwKLTB4MCwgMHg5MmUyMDRmNCwgMHg1MDQwMDA3NCwgMHhhMmUwMDRmNCwKLTB4OGY4MzAxMjAsIDB4Mjc2MjM4MDAsIDB4MjQ2NjAwMjAsIDB4YzIxMDJiLAotMHg1MDQwMDAwMSwgMHgyNzY2MzAwMCwgMHg4ZjgyMDEyOCwgMHgxMGMyMDAwNCwKLTB4MCwgMHg4ZjgyMDEyNCwgMHgxNGMyMDAwNywgMHgwLAotMHg4ZWUyMDFhNCwgMHg4MDIxLCAweDI0NDIwMDAxLCAweGFlZTIwMWE0LAotMHg4MDAxNjM3LCAweDhlZTIwMWE0LCAweDhlZTIwNGU0LCAweGFjNjIwMDFjLAotMHg4ZWU0MDRiMCwgMHg4ZWU1MDRiNCwgMHgyNDYyMDAxYywgMHhhYzYyMDAwOCwKLTB4MjQwMjAwMDgsIDB4YTQ2MjAwMGUsIDB4MjQwMjAwMTEsIDB4YWM2MjAwMTgsCi0weGFjNjQwMDAwLCAweGFjNjUwMDA0LCAweDhlZTIwNGM0LCAweGFjNjIwMDEwLAotMHhhZjg2MDEyMCwgMHg5MmUyNGUyMCwgMHgxNDQwMDAzNywgMHgyNDEwMDAwMSwKLTB4OGVlMjRlMzAsIDB4MjEwYzAsIDB4MjQ0MjUwMzgsIDB4MmUyMjAyMSwKLTB4OGM4MzAwMDAsIDB4MjQwMjAwMTIsIDB4MTQ2MjAwMWYsIDB4MCwKLTB4OGVlMzRlMzAsIDB4OGVlMjRlMzQsIDB4MTA2MjAwMWIsIDB4MjQwMzAwNDAsCi0weDhjODIwMDA0LCAweDI0NDIwMDAxLCAweGFjODIwMDA0LCAweDhlZTI0ZTM0LAotMHg4ZWU1NGUzMCwgMHgyNDQyMDAwMSwgMHgxMDQzMDAwNywgMHgwLAotMHg4ZWUyNGUzNCwgMHgyNDQyMDAwMSwgMHgxMGEyMDAwNSwgMHgwLAotMHg4MDAxNjIxLCAweDAsIDB4MTRhMDAwMDUsIDB4MCwKLTB4OGY4MjAxMjgsIDB4MjQ0MjAwMjAsIDB4YWY4MjAxMjgsIDB4OGY4MjAxMjgsCi0weDhjODIwMDA0LCAweDJjNDIwMDExLCAweDUwNDAwMDEzLCAweGFjODAwMDAwLAotMHg4MDAxNjM3LCAweDAsIDB4OGVlMjRlMzAsIDB4MjQwMzAwNDAsCi0weDI0NDIwMDAxLCAweDUwNDMwMDAzLCAweDEwMjEsIDB4OGVlMjRlMzAsCi0weDI0NDIwMDAxLCAweGFlZTI0ZTMwLCAweDhlZTI0ZTMwLCAweDIxMGMwLAotMHgyNDQyNTAzOCwgMHgyZTIyMDIxLCAweDI0MDIwMDEyLCAweGFjODIwMDAwLAotMHgyNDAyMDAwMSwgMHhhYzgyMDAwNCwgMHg1NjAwMDAwYiwgMHgyNDEwMDAwMSwKLTB4OGVlMjA0ZTQsIDB4M2MwNDAwMDEsIDB4MjQ4NDUyOGMsIDB4YWZhMDAwMTQsCi0weGFmYTIwMDEwLCAweDhlZTYwNjA4LCAweDhmNDcwMjI4LCAweDNjMDUwMDA5LAotMHhjMDAyNDAzLCAweDM0YTVmMDA2LCAweDE2MDAwMDAzLCAweDI0MDIwMDAxLAotMHg4MDAxNjUwLCAweGEyZTIwNGY0LCAweDhlZTIwMTcwLCAweDI0NDIwMDAxLAotMHhhZWUyMDE3MCwgMHg4ZWUyMDE3MCwgMHg4ZWUyMDRlNCwgMHhhMmUwMDRmNCwKLTB4YWVlMDA0ZjAsIDB4YWVlMDcyNzQsIDB4YWVlMjA0ZjgsIDB4OGVlMjBlMWMsCi0weDEwNDAwMDZkLCAweDAsIDB4OGY4MzAxMjAsIDB4Mjc2MjM4MDAsCi0weDI0NjYwMDIwLCAweGMyMTAyYiwgMHg1MDQwMDAwMSwgMHgyNzY2MzAwMCwKLTB4OGY4MjAxMjgsIDB4MTBjMjAwMDQsIDB4MCwgMHg4ZjgyMDEyNCwKLTB4MTRjMjAwMDcsIDB4MCwgMHg4ZWUyMDFhNCwgMHg4MDIxLAotMHgyNDQyMDAwMSwgMHhhZWUyMDFhNCwgMHg4MDAxNmFkLCAweDhlZTIwMWE0LAotMHg4ZWUyNzI0YywgMHhhYzYyMDAxYywgMHg4ZWU0MDRhOCwgMHg4ZWU1MDRhYywKLTB4MjQ2MjAwMWMsIDB4YWM2MjAwMDgsIDB4MjQwMjAwMDgsIDB4YTQ2MjAwMGUsCi0weDI0MDIwMDExLCAweGFjNjIwMDE4LCAweGFjNjQwMDAwLCAweGFjNjUwMDA0LAotMHg4ZWUyMDRjNCwgMHhhYzYyMDAxMCwgMHhhZjg2MDEyMCwgMHg5MmUyNGUyMCwKLTB4MTQ0MDAwMzcsIDB4MjQxMDAwMDEsIDB4OGVlMjRlMzAsIDB4MjEwYzAsCi0weDI0NDI1MDM4LCAweDJlMjIwMjEsIDB4OGM4MzAwMDAsIDB4MjQwMjAwMTIsCi0weDE0NjIwMDFmLCAweDAsIDB4OGVlMzRlMzAsIDB4OGVlMjRlMzQsCi0weDEwNjIwMDFiLCAweDI0MDMwMDQwLCAweDhjODIwMDA0LCAweDI0NDIwMDAxLAotMHhhYzgyMDAwNCwgMHg4ZWUyNGUzNCwgMHg4ZWU1NGUzMCwgMHgyNDQyMDAwMSwKLTB4MTA0MzAwMDcsIDB4MCwgMHg4ZWUyNGUzNCwgMHgyNDQyMDAwMSwKLTB4MTBhMjAwMDUsIDB4MCwgMHg4MDAxNjk3LCAweDAsCi0weDE0YTAwMDA1LCAweDAsIDB4OGY4MjAxMjgsIDB4MjQ0MjAwMjAsCi0weGFmODIwMTI4LCAweDhmODIwMTI4LCAweDhjODIwMDA0LCAweDJjNDIwMDExLAotMHg1MDQwMDAxMywgMHhhYzgwMDAwMCwgMHg4MDAxNmFkLCAweDAsCi0weDhlZTI0ZTMwLCAweDI0MDMwMDQwLCAweDI0NDIwMDAxLCAweDUwNDMwMDAzLAotMHgxMDIxLCAweDhlZTI0ZTMwLCAweDI0NDIwMDAxLCAweGFlZTI0ZTMwLAotMHg4ZWUyNGUzMCwgMHgyMTBjMCwgMHgyNDQyNTAzOCwgMHgyZTIyMDIxLAotMHgyNDAyMDAxMiwgMHhhYzgyMDAwMCwgMHgyNDAyMDAwMSwgMHhhYzgyMDAwNCwKLTB4NTYwMDAwMGIsIDB4MjQxMDAwMDEsIDB4OGVlMjcyNGMsIDB4M2MwNDAwMDEsCi0weDI0ODQ1Mjk4LCAweGFmYTAwMDE0LCAweGFmYTIwMDEwLCAweDhlZTY3MjRjLAotMHg4ZjQ3MDI4MCwgMHgzYzA1MDAwOSwgMHhjMDAyNDAzLCAweDM0YTVmMDA4LAotMHg1NjAwMDAwMSwgMHhhZWUwMGUxYywgMHg4ZWUyMDE3NCwgMHgyNDQyMDAwMSwKLTB4YWVlMjAxNzQsIDB4OGVlMjAxNzQsIDB4OGVlMjRlMjQsIDB4MTA0MDAwMTksCi0weDAsIDB4YWVlMDRlMjQsIDB4OGY4MjAwNDAsIDB4MzA0MjAwMDEsCi0weDE0NDAwMDA4LCAweDAsIDB4OGY0MzAxMDQsIDB4MjQwMjAwMDEsCi0weDEwNjIwMDA0LCAweDAsIDB4OGY0MjAyNjQsIDB4MTA0MDAwMDYsCi0weDAsIDB4OGVlMjAxN2MsIDB4MjQ0MjAwMDEsIDB4YWVlMjAxN2MsCi0weDgwMDE2ZGEsIDB4OGVlMjAxN2MsIDB4OGY4MjAwNDQsIDB4MzQ0MjAwMDQsCi0weGFmODIwMDQ0LCAweDhlZTIwMTc4LCAweDI0NDIwMDAxLCAweGFlZTIwMTc4LAotMHg4ZWUyMDE3OCwgMHg4ZWUyNzI3OCwgMHgyNDQyZmY5OSwgMHhhZWUyNzI3OCwKLTB4OGVlMjcyNzgsIDB4MWM0MDAyYWQsIDB4MCwgMHg4ZjQyMDIzOCwKLTB4MTA0MDAyYWEsIDB4MCwgMHgzYzAyMDAwMSwgMHg1NzEwMjEsCi0weDkwNDI4M2UwLCAweDE0NDAwMmE1LCAweDAsIDB4OGY0MjAwODAsCi0weGFlZTIwMDRjLCAweDhmNDIwMGMwLCAweGFlZTIwMDQ4LCAweDhmNDIwMDg0LAotMHhhZWUyMDAzOCwgMHg4ZjQyMDA4NCwgMHhhZWUyMDI0NCwgMHg4ZjQyMDA4OCwKLTB4YWVlMjAyNDgsIDB4OGY0MjAwOGMsIDB4YWVlMjAyNGMsIDB4OGY0MjAwOTAsCi0weGFlZTIwMjUwLCAweDhmNDIwMDk0LCAweGFlZTIwMjU0LCAweDhmNDIwMDk4LAotMHhhZWUyMDI1OCwgMHg4ZjQyMDA5YywgMHhhZWUyMDI1YywgMHg4ZjQyMDBhMCwKLTB4YWVlMjAyNjAsIDB4OGY0MjAwYTQsIDB4YWVlMjAyNjQsIDB4OGY0MjAwYTgsCi0weGFlZTIwMjY4LCAweDhmNDIwMGFjLCAweGFlZTIwMjZjLCAweDhmNDIwMGIwLAotMHhhZWUyMDI3MCwgMHg4ZjQyMDBiNCwgMHhhZWUyMDI3NCwgMHg4ZjQyMDBiOCwKLTB4YWVlMjAyNzgsIDB4OGY0MjAwYmMsIDB4MjQwNDAwMDEsIDB4YWVlMjAyN2MsCi0weGFlZTAwMDNjLCAweDQxMDgwLCAweDU3MTAyMSwgMHg4ZWUzMDAzYywKLTB4OGM0MjAyNDQsIDB4MjQ4NDAwMDEsIDB4NjIxODIxLCAweDJjODIwMDBmLAotMHhhZWUzMDAzYywgMHgxNDQwZmZmOCwgMHg0MTA4MCwgMHg4ZjQyMDBjYywKLTB4YWVlMjAwNTAsIDB4OGY0MjAwZDAsIDB4YWVlMjAwNTQsIDB4OGY4MzAxMjAsCi0weDI3NjIzODAwLCAweDI0NjYwMDIwLCAweGMyMTAyYiwgMHg1MDQwMDAwMSwKLTB4Mjc2NjMwMDAsIDB4OGY4MjAxMjgsIDB4MTBjMjAwMDQsIDB4MCwKLTB4OGY4MjAxMjQsIDB4MTRjMjAwMDcsIDB4MCwgMHg4ZWUyMDFhNCwKLTB4ODAyMSwgMHgyNDQyMDAwMSwgMHhhZWUyMDFhNCwgMHg4MDAxNzc1LAotMHg4ZWUyMDFhNCwgMHg4ZjQ0MDIwOCwgMHg4ZjQ1MDIwYywgMHgyNmUyMDAzMCwKLTB4YWM2MjAwMDgsIDB4MjQwMjA0MDAsIDB4YTQ2MjAwMGUsIDB4MjQwMjAwMGYsCi0weGFjNjIwMDE4LCAweGFjNjAwMDFjLCAweGFjNjQwMDAwLCAweGFjNjUwMDA0LAotMHg4ZWUyMDRjNCwgMHhhYzYyMDAxMCwgMHhhZjg2MDEyMCwgMHg5MmUyNGUyMCwKLTB4MTQ0MDAwMzcsIDB4MjQxMDAwMDEsIDB4OGVlMjRlMzAsIDB4MjEwYzAsCi0weDI0NDI1MDM4LCAweDJlMjIwMjEsIDB4OGM4MzAwMDAsIDB4MjQwMjAwMDcsCi0weDE0NjIwMDFmLCAweDAsIDB4OGVlMzRlMzAsIDB4OGVlMjRlMzQsCi0weDEwNjIwMDFiLCAweDI0MDMwMDQwLCAweDhjODIwMDA0LCAweDI0NDIwMDAxLAotMHhhYzgyMDAwNCwgMHg4ZWUyNGUzNCwgMHg4ZWU1NGUzMCwgMHgyNDQyMDAwMSwKLTB4MTA0MzAwMDcsIDB4MCwgMHg4ZWUyNGUzNCwgMHgyNDQyMDAwMSwKLTB4MTBhMjAwMDUsIDB4MCwgMHg4MDAxNzVmLCAweDAsCi0weDE0YTAwMDA1LCAweDAsIDB4OGY4MjAxMjgsIDB4MjQ0MjAwMjAsCi0weGFmODIwMTI4LCAweDhmODIwMTI4LCAweDhjODIwMDA0LCAweDJjNDIwMDExLAotMHg1MDQwMDAxMywgMHhhYzgwMDAwMCwgMHg4MDAxNzc1LCAweDAsCi0weDhlZTI0ZTMwLCAweDI0MDMwMDQwLCAweDI0NDIwMDAxLCAweDUwNDMwMDAzLAotMHgxMDIxLCAweDhlZTI0ZTMwLCAweDI0NDIwMDAxLCAweGFlZTI0ZTMwLAotMHg4ZWUyNGUzMCwgMHgyMTBjMCwgMHgyNDQyNTAzOCwgMHgyZTIyMDIxLAotMHgyNDAyMDAwNywgMHhhYzgyMDAwMCwgMHgyNDAyMDAwMSwgMHhhYzgyMDAwNCwKLTB4MTIwMDAyMTIsIDB4M2MwMjA0MDAsIDB4YWZhMjAwMTgsIDB4M2MwMjAwMDEsCi0weDU3MTAyMSwgMHg5MDQyODNiMCwgMHgxMDQwMDEwYiwgMHgwLAotMHg4ZWUyMDYwOCwgMHg4ZjQzMDIyOCwgMHgyNDQyMDAwMSwgMHgzMDRhMDBmZiwKLTB4NTE0MzAwZmQsIDB4YWZhMDAwMTAsIDB4OGVlMjA2MDgsIDB4MjEwYzAsCi0weDU3MTAyMSwgMHg4ZmEzMDAxOCwgMHg4ZmE0MDAxYywgMHhhYzQzMDYwYywKLTB4YWM0NDA2MTAsIDB4OGY4MzAwNTQsIDB4OGY4MjAwNTQsIDB4MjQ2OTAwMzIsCi0weDEyMjEwMjMsIDB4MmM0MjAwMzMsIDB4MTA0MDAwNmEsIDB4NTgyMSwKLTB4MjQxODAwMDgsIDB4MjQwZjAwMGQsIDB4MjQwZDAwMDcsIDB4MjQwYzAwNDAsCi0weDI0MGUwMDAxLCAweDhmODcwMTIwLCAweDI3NjIzODAwLCAweDI0ZTgwMDIwLAotMHgxMDIxMDJiLCAweDUwNDAwMDAxLCAweDI3NjgzMDAwLCAweDhmODIwMTI4LAotMHgxMTAyMDAwNCwgMHgwLCAweDhmODIwMTI0LCAweDE1MDIwMDA3LAotMHgxMDIxLCAweDhlZTIwMWE0LCAweDgwMjEsIDB4MjQ0MjAwMDEsCi0weGFlZTIwMWE0LCAweDgwMDE3ZjMsIDB4OGVlMjAxYTQsIDB4OGVlNDA2MDgsCi0weDQyMGMwLCAweDgwMTgyMSwgMHg4ZWU0MDQzMCwgMHg4ZWU1MDQzNCwKLTB4YTMyODIxLCAweGEzMzAyYiwgMHg4MjIwMjEsIDB4ODYyMDIxLAotMHhhY2U0MDAwMCwgMHhhY2U1MDAwNCwgMHg4ZWUyMDYwOCwgMHhhNGY4MDAwZSwKLTB4YWNlZjAwMTgsIDB4YWNlYTAwMWMsIDB4MjEwYzAsIDB4MjQ0MjA2MGMsCi0weDJlMjEwMjEsIDB4YWNlMjAwMDgsIDB4OGVlMjA0YzQsIDB4YWNlMjAwMTAsCi0weGFmODgwMTIwLCAweDkyZTI0ZTIwLCAweDE0NDAwMDMzLCAweDI0MTAwMDAxLAotMHg4ZWUyNGUzMCwgMHgyMTBjMCwgMHgyNDQyNTAzOCwgMHgyZTIyMDIxLAotMHg4YzgyMDAwMCwgMHgxNDRkMDAxZiwgMHgwLCAweDhlZTM0ZTMwLAotMHg4ZWUyNGUzNCwgMHgxMDYyMDAxYiwgMHgwLCAweDhjODIwMDA0LAotMHgyNDQyMDAwMSwgMHhhYzgyMDAwNCwgMHg4ZWUyNGUzNCwgMHg4ZWUzNGUzMCwKLTB4MjQ0MjAwMDEsIDB4MTA0YzAwMDcsIDB4MCwgMHg4ZWUyNGUzNCwKLTB4MjQ0MjAwMDEsIDB4MTA2MjAwMDUsIDB4MCwgMHg4MDAxN2UwLAotMHgwLCAweDE0NjAwMDA1LCAweDAsIDB4OGY4MjAxMjgsCi0weDI0NDIwMDIwLCAweGFmODIwMTI4LCAweDhmODIwMTI4LCAweDhjODIwMDA0LAotMHgyYzQyMDAxMSwgMHg1MDQwMDAxMCwgMHhhYzgwMDAwMCwgMHg4MDAxN2YzLAotMHgwLCAweDhlZTI0ZTMwLCAweDI0NDIwMDAxLCAweDUwNGMwMDAzLAotMHgxMDIxLCAweDhlZTI0ZTMwLCAweDI0NDIwMDAxLCAweGFlZTI0ZTMwLAotMHg4ZWUyNGUzMCwgMHgyMTBjMCwgMHgyNDQyNTAzOCwgMHgyZTIyMDIxLAotMHhhYzhkMDAwMCwgMHhhYzhlMDAwNCwgMHg1NjAwMDAwNiwgMHgyNDBiMDAwMSwKLTB4OGY4MjAwNTQsIDB4MTIyMTAyMywgMHgyYzQyMDAzMywgMHgxNDQwZmY5ZCwKLTB4MCwgMHgzMTYzMDBmZiwgMHgyNDAyMDAwMSwgMHgxNDYyMDA3NywKLTB4M2MwNTAwMDksIDB4YWVlYTA2MDgsIDB4OGY4MzAwNTQsIDB4OGY4MjAwNTQsCi0weDI0NjkwMDMyLCAweDEyMjEwMjMsIDB4MmM0MjAwMzMsIDB4MTA0MDAwNjEsCi0weDU4MjEsIDB4MjQwZDAwMDgsIDB4MjQwYzAwMTEsIDB4MjQwODAwMTIsCi0weDI0MDcwMDQwLCAweDI0MGEwMDAxLCAweDhmODMwMTIwLCAweDI3NjIzODAwLAotMHgyNDY2MDAyMCwgMHhjMjEwMmIsIDB4NTA0MDAwMDEsIDB4Mjc2NjMwMDAsCi0weDhmODIwMTI4LCAweDEwYzIwMDA0LCAweDAsIDB4OGY4MjAxMjQsCi0weDE0YzIwMDA3LCAweDAsIDB4OGVlMjAxYTQsIDB4ODAyMSwKLTB4MjQ0MjAwMDEsIDB4YWVlMjAxYTQsIDB4ODAwMTg1ZiwgMHg4ZWUyMDFhNCwKLTB4OGVlMjA2MDgsIDB4YWM2MjAwMWMsIDB4OGVlNDA0YTAsIDB4OGVlNTA0YTQsCi0weDI0NjIwMDFjLCAweGFjNjIwMDA4LCAweGE0NmQwMDBlLCAweGFjNmMwMDE4LAotMHhhYzY0MDAwMCwgMHhhYzY1MDAwNCwgMHg4ZWUyMDRjNCwgMHhhYzYyMDAxMCwKLTB4YWY4NjAxMjAsIDB4OTJlMjRlMjAsIDB4MTQ0MDAwMzMsIDB4MjQxMDAwMDEsCi0weDhlZTI0ZTMwLCAweDIxMGMwLCAweDI0NDI1MDM4LCAweDJlMjIwMjEsCi0weDhjODIwMDAwLCAweDE0NDgwMDFmLCAweDAsIDB4OGVlMzRlMzAsCi0weDhlZTI0ZTM0LCAweDEwNjIwMDFiLCAweDAsIDB4OGM4MjAwMDQsCi0weDI0NDIwMDAxLCAweGFjODIwMDA0LCAweDhlZTI0ZTM0LCAweDhlZTM0ZTMwLAotMHgyNDQyMDAwMSwgMHgxMDQ3MDAwNywgMHgwLCAweDhlZTI0ZTM0LAotMHgyNDQyMDAwMSwgMHgxMDYyMDAwNSwgMHgwLCAweDgwMDE4NGMsCi0weDAsIDB4MTQ2MDAwMDUsIDB4MCwgMHg4ZjgyMDEyOCwKLTB4MjQ0MjAwMjAsIDB4YWY4MjAxMjgsIDB4OGY4MjAxMjgsIDB4OGM4MjAwMDQsCi0weDJjNDIwMDExLCAweDUwNDAwMDEwLCAweGFjODAwMDAwLCAweDgwMDE4NWYsCi0weDAsIDB4OGVlMjRlMzAsIDB4MjQ0MjAwMDEsIDB4NTA0NzAwMDMsCi0weDEwMjEsIDB4OGVlMjRlMzAsIDB4MjQ0MjAwMDEsIDB4YWVlMjRlMzAsCi0weDhlZTI0ZTMwLCAweDIxMGMwLCAweDI0NDI1MDM4LCAweDJlMjIwMjEsCi0weGFjODgwMDAwLCAweGFjOGEwMDA0LCAweDU2MDAwMDA2LCAweDI0MGIwMDAxLAotMHg4ZjgyMDA1NCwgMHgxMjIxMDIzLCAweDJjNDIwMDMzLCAweDE0NDBmZmE2LAotMHgwLCAweDMxNjMwMGZmLCAweDI0MDIwMDAxLCAweDE0NjIwMDAzLAotMHgzYzA1MDAwOSwgMHg4MDAxOTdjLCAweDI0MTAwMDAxLCAweDNjMDQwMDAxLAotMHgyNDg0NTJhNCwgMHhhZmEwMDAxMCwgMHhhZmEwMDAxNCwgMHg4Zjg2MDEyMCwKLTB4OGY4NzAxMjQsIDB4ODAwMTg3YiwgMHgzNGE1ZjAxMSwgMHgzYzA0MDAwMSwKLTB4MjQ4NDUyYjAsIDB4YWZhMDAwMTAsIDB4YWZhMDAwMTQsIDB4OGY4NjAxMjAsCi0weDhmODcwMTI0LCAweDM0YTVmMDEwLCAweGMwMDI0MDMsIDB4ODAyMSwKLTB4ODAwMTk3YywgMHgwLCAweDNjMDQwMDAxLCAweDI0ODQ1MmJjLAotMHhhZmEwMDAxNCwgMHg4ZWU2MDYwOCwgMHg4ZjQ3MDIyOCwgMHgzYzA1MDAwOSwKLTB4ODAwMTk3NSwgMHgzNGE1ZjAwZiwgMHg4ZWUyMDYwOCwgMHg4ZjQzMDIyOCwKLTB4MjQ0MjAwMDEsIDB4MzA0OTAwZmYsIDB4NTEyMzAwZTIsIDB4YWZhMDAwMTAsCi0weDhlZTIwNjA4LCAweDIxMGMwLCAweDU3MTAyMSwgMHg4ZmEzMDAxOCwKLTB4OGZhNDAwMWMsIDB4YWM0MzA2MGMsIDB4YWM0NDA2MTAsIDB4OGY4NzAxMjAsCi0weDI3NjIzODAwLCAweDI0ZTgwMDIwLCAweDEwMjEwMmIsIDB4NTA0MDAwMDEsCi0weDI3NjgzMDAwLCAweDhmODIwMTI4LCAweDExMDIwMDA0LCAweDAsCi0weDhmODIwMTI0LCAweDE1MDIwMDA3LCAweDEwMjEsIDB4OGVlMjAxYTQsCi0weDgwMjEsIDB4MjQ0MjAwMDEsIDB4YWVlMjAxYTQsIDB4ODAwMThmNywKLTB4OGVlMjAxYTQsIDB4OGVlNDA2MDgsIDB4NDIwYzAsIDB4ODAxODIxLAotMHg4ZWU0MDQzMCwgMHg4ZWU1MDQzNCwgMHhhMzI4MjEsIDB4YTMzMDJiLAotMHg4MjIwMjEsIDB4ODYyMDIxLCAweGFjZTQwMDAwLCAweGFjZTUwMDA0LAotMHg4ZWUzMDYwOCwgMHgyNDAyMDAwOCwgMHhhNGUyMDAwZSwgMHgyNDAyMDAwZCwKLTB4YWNlMjAwMTgsIDB4YWNlOTAwMWMsIDB4MzE4YzAsIDB4MjQ2MzA2MGMsCi0weDJlMzEwMjEsIDB4YWNlMjAwMDgsIDB4OGVlMjA0YzQsIDB4YWNlMjAwMTAsCi0weGFmODgwMTIwLCAweDkyZTI0ZTIwLCAweDE0NDAwMDM3LCAweDI0MTAwMDAxLAotMHg4ZWUyNGUzMCwgMHgyMTBjMCwgMHgyNDQyNTAzOCwgMHgyZTIyMDIxLAotMHg4YzgzMDAwMCwgMHgyNDAyMDAwNywgMHgxNDYyMDAxZiwgMHgwLAotMHg4ZWUzNGUzMCwgMHg4ZWUyNGUzNCwgMHgxMDYyMDAxYiwgMHgyNDAzMDA0MCwKLTB4OGM4MjAwMDQsIDB4MjQ0MjAwMDEsIDB4YWM4MjAwMDQsIDB4OGVlMjRlMzQsCi0weDhlZTU0ZTMwLCAweDI0NDIwMDAxLCAweDEwNDMwMDA3LCAweDAsCi0weDhlZTI0ZTM0LCAweDI0NDIwMDAxLCAweDEwYTIwMDA1LCAweDAsCi0weDgwMDE4ZTEsIDB4MCwgMHgxNGEwMDAwNSwgMHgwLAotMHg4ZjgyMDEyOCwgMHgyNDQyMDAyMCwgMHhhZjgyMDEyOCwgMHg4ZjgyMDEyOCwKLTB4OGM4MjAwMDQsIDB4MmM0MjAwMTEsIDB4NTA0MDAwMTMsIDB4YWM4MDAwMDAsCi0weDgwMDE4ZjcsIDB4MCwgMHg4ZWUyNGUzMCwgMHgyNDAzMDA0MCwKLTB4MjQ0MjAwMDEsIDB4NTA0MzAwMDMsIDB4MTAyMSwgMHg4ZWUyNGUzMCwKLTB4MjQ0MjAwMDEsIDB4YWVlMjRlMzAsIDB4OGVlMjRlMzAsIDB4MjEwYzAsCi0weDI0NDI1MDM4LCAweDJlMjIwMjEsIDB4MjQwMjAwMDcsIDB4YWM4MjAwMDAsCi0weDI0MDIwMDAxLCAweGFjODIwMDA0LCAweDU2MDAwMDBjLCAweGFlZTkwNjA4LAotMHgzYzA0MDAwMSwgMHgyNDg0NTJjOCwgMHhhZmEwMDAxMCwgMHhhZmEwMDAxNCwKLTB4OGVlNjA2MDgsIDB4OGY0NzAyMjgsIDB4M2MwNTAwMDksIDB4YzAwMjQwMywKLTB4MzRhNWYwMDAsIDB4ODAwMTk3YywgMHgwLCAweDhmODMwMTIwLAotMHgyNzYyMzgwMCwgMHgyNDY2MDAyMCwgMHhjMjEwMmIsIDB4NTA0MDAwMDEsCi0weDI3NjYzMDAwLCAweDhmODIwMTI4LCAweDEwYzIwMDA0LCAweDAsCi0weDhmODIwMTI0LCAweDE0YzIwMDA3LCAweDAsIDB4OGVlMjAxYTQsCi0weDgwMjEsIDB4MjQ0MjAwMDEsIDB4YWVlMjAxYTQsIDB4ODAwMTk1ZSwKLTB4OGVlMjAxYTQsIDB4OGVlMjA2MDgsIDB4YWM2MjAwMWMsIDB4OGVlNDA0YTAsCi0weDhlZTUwNGE0LCAweDI0NjIwMDFjLCAweGFjNjIwMDA4LCAweDI0MDIwMDA4LAotMHhhNDYyMDAwZSwgMHgyNDAyMDAxMSwgMHhhYzYyMDAxOCwgMHhhYzY0MDAwMCwKLTB4YWM2NTAwMDQsIDB4OGVlMjA0YzQsIDB4YWM2MjAwMTAsIDB4YWY4NjAxMjAsCi0weDkyZTI0ZTIwLCAweDE0NDAwMDM3LCAweDI0MTAwMDAxLCAweDhlZTI0ZTMwLAotMHgyMTBjMCwgMHgyNDQyNTAzOCwgMHgyZTIyMDIxLCAweDhjODMwMDAwLAotMHgyNDAyMDAxMiwgMHgxNDYyMDAxZiwgMHgwLCAweDhlZTM0ZTMwLAotMHg4ZWUyNGUzNCwgMHgxMDYyMDAxYiwgMHgyNDAzMDA0MCwgMHg4YzgyMDAwNCwKLTB4MjQ0MjAwMDEsIDB4YWM4MjAwMDQsIDB4OGVlMjRlMzQsIDB4OGVlNTRlMzAsCi0weDI0NDIwMDAxLCAweDEwNDMwMDA3LCAweDAsIDB4OGVlMjRlMzQsCi0weDI0NDIwMDAxLCAweDEwYTIwMDA1LCAweDAsIDB4ODAwMTk0OCwKLTB4MCwgMHgxNGEwMDAwNSwgMHgwLCAweDhmODIwMTI4LAotMHgyNDQyMDAyMCwgMHhhZjgyMDEyOCwgMHg4ZjgyMDEyOCwgMHg4YzgyMDAwNCwKLTB4MmM0MjAwMTEsIDB4NTA0MDAwMTMsIDB4YWM4MDAwMDAsIDB4ODAwMTk1ZSwKLTB4MCwgMHg4ZWUyNGUzMCwgMHgyNDAzMDA0MCwgMHgyNDQyMDAwMSwKLTB4NTA0MzAwMDMsIDB4MTAyMSwgMHg4ZWUyNGUzMCwgMHgyNDQyMDAwMSwKLTB4YWVlMjRlMzAsIDB4OGVlMjRlMzAsIDB4MjEwYzAsIDB4MjQ0MjUwMzgsCi0weDJlMjIwMjEsIDB4MjQwMjAwMTIsIDB4YWM4MjAwMDAsIDB4MjQwMjAwMDEsCi0weGFjODIwMDA0LCAweDU2MDAwMDFkLCAweDI0MTAwMDAxLCAweDNjMDQwMDAxLAotMHgyNDg0NTJkMCwgMHhhZmEwMDAxMCwgMHhhZmEwMDAxNCwgMHg4ZWU2MDYwOCwKLTB4OGY0NzAyMjgsIDB4M2MwNTAwMDksIDB4YzAwMjQwMywgMHgzNGE1ZjAwMSwKLTB4OGVlMjAxYjAsIDB4MjQ0MjAwMDEsIDB4YWVlMjAxYjAsIDB4ODAwMTk3YywKLTB4OGVlMjAxYjAsIDB4M2MwNDAwMDEsIDB4MjQ4NDUyZGMsIDB4YWZhMDAwMTQsCi0weDhlZTYwNjA4LCAweDhmNDcwMjI4LCAweDNjMDUwMDA5LCAweDM0YTVmMDA1LAotMHhjMDAyNDAzLCAweDAsIDB4OGVlMjAxYWMsIDB4ODAyMSwKLTB4MjQ0MjAwMDEsIDB4YWVlMjAxYWMsIDB4OGVlMjAxYWMsIDB4MTIwMDAwMGMsCi0weDI0MDIwMDAxLCAweDNjMDEwMDAxLCAweDM3MDgyMSwgMHhhMDIwODNiMCwKLTB4OGY0MjAyMzgsIDB4OGVlMzAxNTgsIDB4MjQ2MzAwMDEsIDB4YWVlMzAxNTgsCi0weDhlZTMwMTU4LCAweDgwMDE5OGMsIDB4YWVlMjcyNzgsIDB4MjQwMjAwMDEsCi0weDNjMDEwMDAxLCAweDM3MDgyMSwgMHhhMDIyODNiMCwgMHgzYzAyMDAwMSwKLTB4OGM0MjVjZDgsIDB4MTA0MDAxODcsIDB4MCwgMHg4ZWUyN2I4NCwKLTB4MjQ0MzAwMDEsIDB4Mjg0MjAwYzksIDB4MTQ0MDAxYTQsIDB4YWVlMzdiODQsCi0weDhlZTIwNGQ0LCAweDMwNDIwMDAyLCAweDE0NDAwMTE5LCAweGFlZTA3Yjg0LAotMHg4ZWUyMDRkNCwgMHgzYzAzMDYwMCwgMHgzNDYzMTAwMCwgMHgzNDQyMDAwMiwKLTB4YWVlMjA0ZDQsIDB4YWZhMzAwMTgsIDB4OGVlMjA2MDgsIDB4OGY0MzAyMjgsCi0weDI0NDIwMDAxLCAweDMwNGEwMGZmLCAweDUxNDMwMGZkLCAweGFmYTAwMDEwLAotMHg4ZWUyMDYwOCwgMHgyMTBjMCwgMHg1NzEwMjEsIDB4OGZhMzAwMTgsCi0weDhmYTQwMDFjLCAweGFjNDMwNjBjLCAweGFjNDQwNjEwLCAweDhmODMwMDU0LAotMHg4ZjgyMDA1NCwgMHgyNDY5MDAzMiwgMHgxMjIxMDIzLCAweDJjNDIwMDMzLAotMHgxMDQwMDA2YSwgMHg1ODIxLCAweDI0MTgwMDA4LCAweDI0MGYwMDBkLAotMHgyNDBkMDAwNywgMHgyNDBjMDA0MCwgMHgyNDBlMDAwMSwgMHg4Zjg3MDEyMCwKLTB4Mjc2MjM4MDAsIDB4MjRlODAwMjAsIDB4MTAyMTAyYiwgMHg1MDQwMDAwMSwKLTB4Mjc2ODMwMDAsIDB4OGY4MjAxMjgsIDB4MTEwMjAwMDQsIDB4MCwKLTB4OGY4MjAxMjQsIDB4MTUwMjAwMDcsIDB4MTAyMSwgMHg4ZWUyMDFhNCwKLTB4ODAyMSwgMHgyNDQyMDAwMSwgMHhhZWUyMDFhNCwgMHg4MDAxYTE1LAotMHg4ZWUyMDFhNCwgMHg4ZWU0MDYwOCwgMHg0MjBjMCwgMHg4MDE4MjEsCi0weDhlZTQwNDMwLCAweDhlZTUwNDM0LCAweGEzMjgyMSwgMHhhMzMwMmIsCi0weDgyMjAyMSwgMHg4NjIwMjEsIDB4YWNlNDAwMDAsIDB4YWNlNTAwMDQsCi0weDhlZTIwNjA4LCAweGE0ZjgwMDBlLCAweGFjZWYwMDE4LCAweGFjZWEwMDFjLAotMHgyMTBjMCwgMHgyNDQyMDYwYywgMHgyZTIxMDIxLCAweGFjZTIwMDA4LAotMHg4ZWUyMDRjNCwgMHhhY2UyMDAxMCwgMHhhZjg4MDEyMCwgMHg5MmUyNGUyMCwKLTB4MTQ0MDAwMzMsIDB4MjQxMDAwMDEsIDB4OGVlMjRlMzAsIDB4MjEwYzAsCi0weDI0NDI1MDM4LCAweDJlMjIwMjEsIDB4OGM4MjAwMDAsIDB4MTQ0ZDAwMWYsCi0weDAsIDB4OGVlMzRlMzAsIDB4OGVlMjRlMzQsIDB4MTA2MjAwMWIsCi0weDAsIDB4OGM4MjAwMDQsIDB4MjQ0MjAwMDEsIDB4YWM4MjAwMDQsCi0weDhlZTI0ZTM0LCAweDhlZTM0ZTMwLCAweDI0NDIwMDAxLCAweDEwNGMwMDA3LAotMHgwLCAweDhlZTI0ZTM0LCAweDI0NDIwMDAxLCAweDEwNjIwMDA1LAotMHgwLCAweDgwMDFhMDIsIDB4MCwgMHgxNDYwMDAwNSwKLTB4MCwgMHg4ZjgyMDEyOCwgMHgyNDQyMDAyMCwgMHhhZjgyMDEyOCwKLTB4OGY4MjAxMjgsIDB4OGM4MjAwMDQsIDB4MmM0MjAwMTEsIDB4NTA0MDAwMTAsCi0weGFjODAwMDAwLCAweDgwMDFhMTUsIDB4MCwgMHg4ZWUyNGUzMCwKLTB4MjQ0MjAwMDEsIDB4NTA0YzAwMDMsIDB4MTAyMSwgMHg4ZWUyNGUzMCwKLTB4MjQ0MjAwMDEsIDB4YWVlMjRlMzAsIDB4OGVlMjRlMzAsIDB4MjEwYzAsCi0weDI0NDI1MDM4LCAweDJlMjIwMjEsIDB4YWM4ZDAwMDAsIDB4YWM4ZTAwMDQsCi0weDU2MDAwMDA2LCAweDI0MGIwMDAxLCAweDhmODIwMDU0LCAweDEyMjEwMjMsCi0weDJjNDIwMDMzLCAweDE0NDBmZjlkLCAweDAsIDB4MzE2MzAwZmYsCi0weDI0MDIwMDAxLCAweDU0NjIwMDc4LCAweGFmYTAwMDEwLCAweGFlZWEwNjA4LAotMHg4ZjgzMDA1NCwgMHg4ZjgyMDA1NCwgMHgyNDY5MDAzMiwgMHgxMjIxMDIzLAotMHgyYzQyMDAzMywgMHgxMDQwMDA2MSwgMHg1ODIxLCAweDI0MGQwMDA4LAotMHgyNDBjMDAxMSwgMHgyNDA4MDAxMiwgMHgyNDA3MDA0MCwgMHgyNDBhMDAwMSwKLTB4OGY4MzAxMjAsIDB4Mjc2MjM4MDAsIDB4MjQ2NjAwMjAsIDB4YzIxMDJiLAotMHg1MDQwMDAwMSwgMHgyNzY2MzAwMCwgMHg4ZjgyMDEyOCwgMHgxMGMyMDAwNCwKLTB4MCwgMHg4ZjgyMDEyNCwgMHgxNGMyMDAwNywgMHgwLAotMHg4ZWUyMDFhNCwgMHg4MDIxLCAweDI0NDIwMDAxLCAweGFlZTIwMWE0LAotMHg4MDAxYTgxLCAweDhlZTIwMWE0LCAweDhlZTIwNjA4LCAweGFjNjIwMDFjLAotMHg4ZWU0MDRhMCwgMHg4ZWU1MDRhNCwgMHgyNDYyMDAxYywgMHhhYzYyMDAwOCwKLTB4YTQ2ZDAwMGUsIDB4YWM2YzAwMTgsIDB4YWM2NDAwMDAsIDB4YWM2NTAwMDQsCi0weDhlZTIwNGM0LCAweGFjNjIwMDEwLCAweGFmODYwMTIwLCAweDkyZTI0ZTIwLAotMHgxNDQwMDAzMywgMHgyNDEwMDAwMSwgMHg4ZWUyNGUzMCwgMHgyMTBjMCwKLTB4MjQ0MjUwMzgsIDB4MmUyMjAyMSwgMHg4YzgyMDAwMCwgMHgxNDQ4MDAxZiwKLTB4MCwgMHg4ZWUzNGUzMCwgMHg4ZWUyNGUzNCwgMHgxMDYyMDAxYiwKLTB4MCwgMHg4YzgyMDAwNCwgMHgyNDQyMDAwMSwgMHhhYzgyMDAwNCwKLTB4OGVlMjRlMzQsIDB4OGVlMzRlMzAsIDB4MjQ0MjAwMDEsIDB4MTA0NzAwMDcsCi0weDAsIDB4OGVlMjRlMzQsIDB4MjQ0MjAwMDEsIDB4MTA2MjAwMDUsCi0weDAsIDB4ODAwMWE2ZSwgMHgwLCAweDE0NjAwMDA1LAotMHgwLCAweDhmODIwMTI4LCAweDI0NDIwMDIwLCAweGFmODIwMTI4LAotMHg4ZjgyMDEyOCwgMHg4YzgyMDAwNCwgMHgyYzQyMDAxMSwgMHg1MDQwMDAxMCwKLTB4YWM4MDAwMDAsIDB4ODAwMWE4MSwgMHgwLCAweDhlZTI0ZTMwLAotMHgyNDQyMDAwMSwgMHg1MDQ3MDAwMywgMHgxMDIxLCAweDhlZTI0ZTMwLAotMHgyNDQyMDAwMSwgMHhhZWUyNGUzMCwgMHg4ZWUyNGUzMCwgMHgyMTBjMCwKLTB4MjQ0MjUwMzgsIDB4MmUyMjAyMSwgMHhhYzg4MDAwMCwgMHhhYzhhMDAwNCwKLTB4NTYwMDAwMDYsIDB4MjQwYjAwMDEsIDB4OGY4MjAwNTQsIDB4MTIyMTAyMywKLTB4MmM0MjAwMzMsIDB4MTQ0MGZmYTYsIDB4MCwgMHgzMTYzMDBmZiwKLTB4MjQwMjAwMDEsIDB4MTA2MjAwMjIsIDB4MCwgMHgzYzA0MDAwMSwKLTB4MjQ4NDUyYTQsIDB4YWZhMDAwMTAsIDB4YWZhMDAwMTQsIDB4OGY4NjAxMjAsCi0weDhmODcwMTI0LCAweDNjMDUwMDA5LCAweGMwMDI0MDMsIDB4MzRhNWYwMTEsCi0weDgwMDFhYWQsIDB4MCwgMHgzYzA0MDAwMSwgMHgyNDg0NTJiMCwKLTB4YWZhMDAwMTQsIDB4OGY4NjAxMjAsIDB4OGY4NzAxMjQsIDB4M2MwNTAwMDksCi0weGMwMDI0MDMsIDB4MzRhNWYwMTAsIDB4ODAwMWFhZCwgMHgwLAotMHgzYzA0MDAwMSwgMHgyNDg0NTJiYywgMHhhZmEwMDAxNCwgMHg4ZWU2MDYwOCwKLTB4OGY0NzAyMjgsIDB4M2MwNTAwMDksIDB4YzAwMjQwMywgMHgzNGE1ZjAwZiwKLTB4OGVlMjAxYWMsIDB4MjQ0MjAwMDEsIDB4YWVlMjAxYWMsIDB4OGVlMjAxYWMsCi0weDhlZTIwMTVjLCAweDI0NDIwMDAxLCAweGFlZTIwMTVjLCAweDhlZTIwMTVjLAotMHg4ZWUyMDRkNCwgMHgzMDQyMDAwMSwgMHgxMDQwMDA1NSwgMHgwLAotMHg4ZjQyMDIxOCwgMHgzMDQyMDA4MCwgMHgxMDQwMDAyOSwgMHgwLAotMHg4ZjgyMDA0NCwgMHgzNDQyMDA0MCwgMHhhZjgyMDA0NCwgMHg4ZWUyN2I3YywKLTB4NDAyODIxLCAweDhlZTIwMGMwLCAweDhlZTMwMGM0LCAweDI0MDYwMDAwLAotMHgyNDA3ZmZmZiwgMHgyMDIxLCAweDQ2MTAyNCwgMHgxNDQ0MDAwZCwKLTB4NjcxODI0LCAweDE0NjUwMDBiLCAweDAsIDB4OGVlMjdiODAsCi0weDQwMjgyMSwgMHg4ZWUyMDBlMCwgMHg4ZWUzMDBlNCwgMHgyMDIxLAotMHg0NjEwMjQsIDB4MTQ0NDAwMDMsIDB4NjcxODI0LCAweDEwNjUwMDBiLAotMHgwLCAweDhlZTIwMGMwLCAweDhlZTMwMGM0LCAweDhlZTQwMGUwLAotMHg4ZWU1MDBlNCwgMHhhZWUzN2I3YywgMHhhZWU1N2I4MCwgMHg4ZjgyMDA0NCwKLTB4Mzg0MjAwMjAsIDB4ODAwMWIzOCwgMHhhZjgyMDA0NCwgMHg4ZjgyMDA0NCwKLTB4MjQwM2ZmZGYsIDB4NDMxMDI0LCAweDgwMDFiMzgsIDB4YWY4MjAwNDQsCi0weDhmODIwMDQ0LCAweDI0MDNmZmRmLCAweDQzMTAyNCwgMHhhZjgyMDA0NCwKLTB4OGVlMjdiN2MsIDB4NDAyODIxLCAweDhlZTIwMGMwLCAweDhlZTMwMGM0LAotMHgyNDA2MDAwMCwgMHgyNDA3ZmZmZiwgMHgyMDIxLCAweDQ2MTAyNCwKLTB4MTQ0NDAwMGQsIDB4NjcxODI0LCAweDE0NjUwMDBiLCAweDAsCi0weDhlZTI3YjgwLCAweDQwMjgyMSwgMHg4ZWUyMDBlMCwgMHg4ZWUzMDBlNCwKLTB4MjAyMSwgMHg0NjEwMjQsIDB4MTQ0NDAwMDMsIDB4NjcxODI0LAotMHgxMDY1MDAwYiwgMHgwLCAweDhlZTIwMGMwLCAweDhlZTMwMGM0LAotMHg4ZWU0MDBlMCwgMHg4ZWU1MDBlNCwgMHhhZWUzN2I3YywgMHhhZWU1N2I4MCwKLTB4OGY4MjAwNDQsIDB4Mzg0MjAwNDAsIDB4ODAwMWIzOCwgMHhhZjgyMDA0NCwKLTB4OGY4MjAwNDQsIDB4MzQ0MjAwNDAsIDB4ODAwMWIzOCwgMHhhZjgyMDA0NCwKLTB4OGY4MjAwNDQsIDB4MzQ0MjAwNDAsIDB4YWY4MjAwNDQsIDB4OGVlMjdiOGMsCi0weDI0NDMwMDAxLCAweDI4NDIwMDE1LCAweDE0NDAwMDI4LCAweGFlZTM3YjhjLAotMHg4ZjgyMDA0NCwgMHgzODQyMDAyMCwgMHhhZjgyMDA0NCwgMHg4MDAxYjM4LAotMHhhZWUwN2I4YywgMHg4ZWUyMDRkNCwgMHgzMDQyMDAwMSwgMHgxMDQwMDAxMSwKLTB4MCwgMHg4ZjQyMDIxOCwgMHgzMDQyMDA4MCwgMHgxMDQwMDAwOSwKLTB4MCwgMHg4ZjgyMDA0NCwgMHgzNDQyMDAyMCwgMHhhZjgyMDA0NCwKLTB4OGY4MjAwNDQsIDB4MjQwM2ZmYmYsIDB4NDMxMDI0LCAweDgwMDFiMzYsCi0weGFmODIwMDQ0LCAweDhmODIwMDQ0LCAweDM0NDIwMDYwLCAweDgwMDFiMzYsCi0weGFmODIwMDQ0LCAweDhmODIwMDQ0LCAweDM0NDIwMDQwLCAweGFmODIwMDQ0LAotMHg4ZWUyN2I4OCwgMHgyNDQzMDAwMSwgMHgyODQyMTM4OSwgMHgxNDQwMDAwNSwKLTB4YWVlMzdiODgsIDB4OGY4MjAwNDQsIDB4Mzg0MjAwMjAsIDB4YWY4MjAwNDQsCi0weGFlZTA3Yjg4LCAweGMwMDQ2MDMsIDB4MCwgMHg4ZmJmMDAyNCwKLTB4OGZiMDAwMjAsIDB4M2UwMDAwOCwgMHgyN2JkMDAyOCwgMHgyN2JkZmZiOCwKLTB4YWZiZjAwNDQsIDB4YWZiNjAwNDAsIDB4YWZiNTAwM2MsIDB4YWZiNDAwMzgsCi0weGFmYjMwMDM0LCAweGFmYjIwMDMwLCAweGFmYjEwMDJjLCAweGFmYjAwMDI4LAotMHg4Zjk2MDA2NCwgMHgzMmMyMDAwNCwgMHgxMDQwMDAwYywgMHgyNDAyMDAwNCwKLTB4YWY4MjAwNjQsIDB4OGY0MjAxMTQsIDB4YWVlMjA0ZTAsIDB4OGY4MjAwNjAsCi0weDM0NDIwMDA4LCAweGFmODIwMDYwLCAweDhlZTIwMTZjLCAweDI0NDIwMDAxLAotMHhhZWUyMDE2YywgMHg4MDAyMmY0LCAweDhlZTIwMTZjLCAweDMyYzIwMDAxLAotMHgxMDQwMDAwNCwgMHgyNDAyMDAwMSwgMHhhZjgyMDA2NCwgMHg4MDAyMmY0LAotMHgwLCAweDMyYzIwMDAyLCAweDE0NDAwMDBjLCAweDNjMDUwMDAzLAotMHgzYzA0MDAwMSwgMHgyNDg0NTM1NCwgMHgzNGE1MDAwMSwgMHgyYzAzMDIxLAotMHgzODIxLCAweGFmYTAwMDEwLCAweGMwMDI0MDMsIDB4YWZhMDAwMTQsCi0weDI0MDJmZmY4LCAweDgwMDIyZjQsIDB4YWY4MjAwNjQsIDB4OGY0MzAyMmMsCi0weDhmNDIwMTBjLCAweDUwNjIwMDBjLCAweGFmYTAwMDEwLCAweDhmNDIwMjJjLAotMHgyMTA4MCwgMHg1YTEwMjEsIDB4OGM0MjAzMDAsIDB4YWZhMjAwMjAsCi0weDhmNDIwMjJjLCAweDI0MDcwMDAxLCAweDI0NDIwMDAxLCAweDMwNDIwMDNmLAotMHg4MDAxYjgwLCAweGFmNDIwMjJjLCAweDNjMDQwMDAxLCAweDI0ODQ1MzYwLAotMHhhZmEwMDAxNCwgMHg4ZjQ2MDIyYywgMHg4ZjQ3MDEwYywgMHgzYzA1MDAwMywKLTB4YzAwMjQwMywgMHgzNGE1ZjAxZiwgMHgzODIxLCAweDE0ZTAwMDAzLAotMHgwLCAweDgwMDIyZWQsIDB4YWY5NjAwNjQsIDB4OTNhMjAwMjAsCi0weDI0NDNmZmZmLCAweDJjNjIwMDExLCAweDEwNDAwNjU4LCAweDMxMDgwLAotMHgzYzAxMDAwMSwgMHgyMjA4MjEsIDB4OGMyMjU0MTgsIDB4NDAwMDA4LAotMHgwLCAweDhmYTIwMDIwLCAweDMwNDIwZmZmLCAweGFlZTIwZTBjLAotMHg4ZjgyMDA2MCwgMHgzNDQyMDIwMCwgMHhhZjgyMDA2MCwgMHg4ZWUyMDExOCwKLTB4MjQ0MjAwMDEsIDB4YWVlMjAxMTgsIDB4ODAwMjJlOCwgMHg4ZWUyMDExOCwKLTB4OGZhMjAwMjAsIDB4MjQwMzAwMDEsIDB4M2MwMTAwMDEsIDB4MzcwODIxLAotMHhhMDIzODNiMSwgMHgzMDQyMGZmZiwgMHhhZWUyNTIzOCwgMHg4ZjgyMDA2MCwKLTB4MzQ0MjAxMDAsIDB4YWY4MjAwNjAsIDB4OGVlMjAxNDQsIDB4MjQ0MjAwMDEsCi0weGFlZTIwMTQ0LCAweDgwMDIyZTgsIDB4OGVlMjAxNDQsIDB4OGZhMjAwMjAsCi0weDIxMjAwLCAweDIyNTAyLCAweDI0MDIwMDAxLCAweDEwODIwMDA1LAotMHgyNDAyMDAwMiwgMHgxMDgyMDAwOSwgMHgyNDAyZmZmZSwgMHg4MDAxYmM5LAotMHhhZmEwMDAxMCwgMHg4ZWUyMDRkNCwgMHhhZWU0MDA3MCwgMHhhZWU0MDA3NCwKLTB4MzQ0MjAwMDEsIDB4ODAwMWJiZCwgMHhhZWUyMDRkNCwgMHg4ZWUzMDRkNCwKLTB4YWVlNDAwNzAsIDB4YWVlNDAwNzQsIDB4NjIxODI0LCAweGFlZTMwNGQ0LAotMHg4Zjg0MDA1NCwgMHg0MTQ0MiwgMHg0MWM4MiwgMHg0MzEwMjEsCi0weDQxY2MyLCAweDQzMTAyMywgMHg0MWQwMiwgMHg0MzEwMjEsCi0weDQxZDQyLCAweDQzMTAyMywgMHg4MDAxYmQwLCAweGFlZTIwMDc4LAotMHgzYzA0MDAwMSwgMHgyNDg0NTM2YywgMHhhZmEwMDAxNCwgMHg4ZmE2MDAyMCwKLTB4M2MwNTAwMDMsIDB4YzAwMjQwMywgMHgzNGE1MDAwNCwgMHg4ZWUyMDExMCwKLTB4MjQ0MjAwMDEsIDB4YWVlMjAxMTAsIDB4ODAwMjJlOCwgMHg4ZWUyMDExMCwKLTB4Mjc0NDAyMTIsIDB4YzAwMjJmZSwgMHgyNDA1MDAwNiwgMHgzMDQ5MDAxZiwKLTB4OTIwYzAsIDB4MmU0MTAyMSwgMHg5NDQyNzI3YywgMHgzMDQyNDAwMCwKLTB4MTA0MDAwMGEsIDB4OTcxMDIxLCAweDk3NDMwMjEyLCAweGE0NDM3MjdlLAotMHg4ZjQzMDIxNCwgMHg5NzEwMjEsIDB4YWM0MzcyODAsIDB4MmU0MTgyMSwKLTB4MzQwMjgwMDAsIDB4ODAwMWM3OSwgMHhhNDYyNzI3YywgMHg5NDQzNzI3ZSwKLTB4OTc0MjAyMTIsIDB4MTQ2MjAwMDYsIDB4MmU0MTAyMSwgMHg5NzEwMjEsCi0weDhjNDM3MjgwLCAweDhmNDIwMjE0LCAweDEwNjIwMDlmLCAweDJlNDEwMjEsCi0weDk0NDI3MjdjLCAweDMwNDI4MDAwLCAweDEwNDAwMDJhLCAweDI0MDZmZmZmLAotMHgyMDIxLCAweDQxMGMwLCAweDJlMjEwMjEsIDB4OTQ0MjczN2MsCi0weDMwNDI0MDAwLCAweDU0NDAwMDA1LCAweDgwMzAyMSwgMHgyNDg0MDAwMSwKLTB4MmM4MjAwODAsIDB4MTQ0MGZmZjgsIDB4NDEwYzAsIDB4NGMxMDAxMCwKLTB4NjE4YzAsIDB4NjEwYzAsIDB4NTcxODIxLCAweDhjNjM3MzdjLAotMHg1NzEwMjEsIDB4YWZhMzAwMTAsIDB4OGM0MjczODAsIDB4M2MwNDAwMDEsCi0weDI0ODQ1Mzc4LCAweGFmYTIwMDE0LCAweDhmNDcwMjE0LCAweDNjMDUwMDAzLAotMHhjMDAyNDAzLCAweDM0YTUwMDEzLCAweDgwMDFjOTAsIDB4M2MwMjA4MDAsCi0weDk3NDQwMjEyLCAweDc3MTAyMSwgMHhhNDQ0NzM3ZSwgMHg4ZjQ0MDIxNCwKLTB4NzcxMDIxLCAweDJlMzE4MjEsIDB4YWM0NDczODAsIDB4MzQwMjgwMDAsCi0weGE0NjI3MzdjLCAweDkxMGMwLCAweDJlMjEwMjEsIDB4ODAwMWM3OSwKLTB4YTQ0NjcyN2MsIDB4MmU0MTAyMSwgMHg5NDQ1NzI3YywgMHg4MDAxYzJlLAotMHg1MTBjMCwgMHg5NDQzNzM3ZSwgMHg5NzQyMDIxMiwgMHgxNDYyMDAwNiwKLTB4NTEwYzAsIDB4OTcxMDIxLCAweDhjNDM3MzgwLCAweDhmNDIwMjE0LAotMHgxMDYyMDA2NSwgMHg1MTBjMCwgMHgyZTIxMDIxLCAweDk0NDU3MzdjLAotMHg1MTBjMCwgMHgyZTIxMDIxLCAweDk0NDI3MzdjLCAweDMwNDI4MDAwLAotMHgxMDQwZmZmMCwgMHg5NzEwMjEsIDB4NTIwYzAsIDB4OTcxMDIxLAotMHg5NDQzNzM3ZSwgMHg5NzQyMDIxMiwgMHgxNDYyMDAwNiwgMHgyNDA2ZmZmZiwKLTB4OTcxMDIxLCAweDhjNDM3MzgwLCAweDhmNDIwMjE0LCAweDEwNjIwMDUzLAotMHgzYzAyMDgwMCwgMHgyMDIxLCAweDQxMGMwLCAweDJlMjEwMjEsCi0weDk0NDI3MzdjLCAweDMwNDI0MDAwLCAweDU0NDAwMDA1LCAweDgwMzAyMSwKLTB4MjQ4NDAwMDEsIDB4MmM4MjAwODAsIDB4MTQ0MGZmZjgsIDB4NDEwYzAsCi0weDRjMTAwMjMsIDB4NjE4YzAsIDB4OTEwYzAsIDB4NTcxODIxLAotMHg4YzYzNzI3YywgMHg1NzEwMjEsIDB4YWZhMzAwMTAsIDB4OGM0MjcyODAsCi0weDNjMDQwMDAxLCAweDI0ODQ1Mzg0LCAweGFmYTIwMDE0LCAweDhmNDcwMjE0LAotMHgzYzA1MDAwMywgMHhjMDAyNDAzLCAweDM0YTVmMDE3LCAweDgwMDFjOTAsCi0weDNjMDIwODAwLCAweDhmNDMwMjEwLCAweGI3MTAyMSwgMHhhYzQzNzc3YywKLTB4OGY0MzAyMTQsIDB4YjcxMDIxLCAweGFjNDM3NzgwLCAweDNjMDIwMDAxLAotMHg1NzEwMjEsIDB4OGM0MjgzYjQsIDB4MjQ0MjAwMDEsIDB4M2MwMTAwMDEsCi0weDM3MDgyMSwgMHhhYzIyODNiNCwgMHgzYzAzMDAwMSwgMHg3NzE4MjEsCi0weDhjNjM4M2I0LCAweDJlNTEwMjEsIDB4ODAwMWM4MiwgMHhhNDQzNzc3YywKLTB4OTc0NDAyMTIsIDB4NzcxMDIxLCAweGE0NDQ3MzdlLCAweDhmNDQwMjE0LAotMHg3NzEwMjEsIDB4MmUzMTgyMSwgMHhhYzQ0NzM4MCwgMHgzNDAyODAwMCwKLTB4YTQ2MjczN2MsIDB4NTEwYzAsIDB4MmUyMTAyMSwgMHhhNDQ2NzM3YywKLTB4MjAyMSwgMHg0MjhjMCwgMHgyZTUxMDIxLCAweDk0NDI3NzdjLAotMHgxMDQwZmZkYywgMHgyNDg0MDAwMSwgMHgyYzgyMDA4MCwgMHg1NDQwZmZmYSwKLTB4NDI4YzAsIDB4OTJlMjA0ZDgsIDB4MTA0MDAwMDYsIDB4MjQwMjAwMDEsCi0weDhlZTMwNGRjLCAweDEyMjEwMDQsIDB4NjIxODI1LCAweDgwMDFjOGYsCi0weGFlZTMwNGRjLCAweDhmODMwMjI4LCAweDI0MDIwMDAxLCAweDEyMjEwMDQsCi0weDYyMTgyNSwgMHhhZjgzMDIyOCwgMHgzYzAyMDgwMCwgMHgzNDQyMTAwMCwKLTB4YWZhMjAwMTgsIDB4OGVlMjA2MDgsIDB4OGY0MzAyMjgsIDB4MjQ0MjAwMDEsCi0weDMwNGEwMGZmLCAweDUxNDMwMGZkLCAweGFmYTAwMDEwLCAweDhlZTIwNjA4LAotMHgyMTBjMCwgMHg1NzEwMjEsIDB4OGZhMzAwMTgsIDB4OGZhNDAwMWMsCi0weGFjNDMwNjBjLCAweGFjNDQwNjEwLCAweDhmODMwMDU0LCAweDhmODIwMDU0LAotMHgyNDY5MDAzMiwgMHgxMjIxMDIzLCAweDJjNDIwMDMzLCAweDEwNDAwMDZhLAotMHg1ODIxLCAweDI0MTAwMDA4LCAweDI0MGYwMDBkLCAweDI0MGQwMDA3LAotMHgyNDBjMDA0MCwgMHgyNDBlMDAwMSwgMHg4Zjg3MDEyMCwgMHgyNzYyMzgwMCwKLTB4MjRlODAwMjAsIDB4MTAyMTAyYiwgMHg1MDQwMDAwMSwgMHgyNzY4MzAwMCwKLTB4OGY4MjAxMjgsIDB4MTEwMjAwMDQsIDB4MCwgMHg4ZjgyMDEyNCwKLTB4MTUwMjAwMDcsIDB4MTAyMSwgMHg4ZWUyMDFhNCwgMHgzODIxLAotMHgyNDQyMDAwMSwgMHhhZWUyMDFhNCwgMHg4MDAxZDA4LCAweDhlZTIwMWE0LAotMHg4ZWU0MDYwOCwgMHg0MjBjMCwgMHg4MDE4MjEsIDB4OGVlNDA0MzAsCi0weDhlZTUwNDM0LCAweGEzMjgyMSwgMHhhMzMwMmIsIDB4ODIyMDIxLAotMHg4NjIwMjEsIDB4YWNlNDAwMDAsIDB4YWNlNTAwMDQsIDB4OGVlMjA2MDgsCi0weGE0ZjAwMDBlLCAweGFjZWYwMDE4LCAweGFjZWEwMDFjLCAweDIxMGMwLAotMHgyNDQyMDYwYywgMHgyZTIxMDIxLCAweGFjZTIwMDA4LCAweDhlZTIwNGM0LAotMHhhY2UyMDAxMCwgMHhhZjg4MDEyMCwgMHg5MmUyNGUyMCwgMHgxNDQwMDAzMywKLTB4MjQwNzAwMDEsIDB4OGVlMjRlMzAsIDB4MjEwYzAsIDB4MjQ0MjUwMzgsCi0weDJlMjIwMjEsIDB4OGM4MjAwMDAsIDB4MTQ0ZDAwMWYsIDB4MCwKLTB4OGVlMzRlMzAsIDB4OGVlMjRlMzQsIDB4MTA2MjAwMWIsIDB4MCwKLTB4OGM4MjAwMDQsIDB4MjQ0MjAwMDEsIDB4YWM4MjAwMDQsIDB4OGVlMjRlMzQsCi0weDhlZTM0ZTMwLCAweDI0NDIwMDAxLCAweDEwNGMwMDA3LCAweDAsCi0weDhlZTI0ZTM0LCAweDI0NDIwMDAxLCAweDEwNjIwMDA1LCAweDAsCi0weDgwMDFjZjUsIDB4MCwgMHgxNDYwMDAwNSwgMHgwLAotMHg4ZjgyMDEyOCwgMHgyNDQyMDAyMCwgMHhhZjgyMDEyOCwgMHg4ZjgyMDEyOCwKLTB4OGM4MjAwMDQsIDB4MmM0MjAwMTEsIDB4NTA0MDAwMTAsIDB4YWM4MDAwMDAsCi0weDgwMDFkMDgsIDB4MCwgMHg4ZWUyNGUzMCwgMHgyNDQyMDAwMSwKLTB4NTA0YzAwMDMsIDB4MTAyMSwgMHg4ZWUyNGUzMCwgMHgyNDQyMDAwMSwKLTB4YWVlMjRlMzAsIDB4OGVlMjRlMzAsIDB4MjEwYzAsIDB4MjQ0MjUwMzgsCi0weDJlMjIwMjEsIDB4YWM4ZDAwMDAsIDB4YWM4ZTAwMDQsIDB4NTRlMDAwMDYsCi0weDI0MGIwMDAxLCAweDhmODIwMDU0LCAweDEyMjEwMjMsIDB4MmM0MjAwMzMsCi0weDE0NDBmZjlkLCAweDAsIDB4MzE2MzAwZmYsIDB4MjQwMjAwMDEsCi0weDU0NjIwMDc4LCAweGFmYTAwMDEwLCAweGFlZWEwNjA4LCAweDhmODMwMDU0LAotMHg4ZjgyMDA1NCwgMHgyNDY5MDAzMiwgMHgxMjIxMDIzLCAweDJjNDIwMDMzLAotMHgxMDQwMDA2MSwgMHg1ODIxLCAweDI0MGUwMDA4LCAweDI0MGQwMDExLAotMHgyNDBhMDAxMiwgMHgyNDA4MDA0MCwgMHgyNDBjMDAwMSwgMHg4ZjgzMDEyMCwKLTB4Mjc2MjM4MDAsIDB4MjQ2NjAwMjAsIDB4YzIxMDJiLCAweDUwNDAwMDAxLAotMHgyNzY2MzAwMCwgMHg4ZjgyMDEyOCwgMHgxMGMyMDAwNCwgMHgwLAotMHg4ZjgyMDEyNCwgMHgxNGMyMDAwNywgMHgwLCAweDhlZTIwMWE0LAotMHgzODIxLCAweDI0NDIwMDAxLCAweGFlZTIwMWE0LCAweDgwMDFkNzQsCi0weDhlZTIwMWE0LCAweDhlZTIwNjA4LCAweGFjNjIwMDFjLCAweDhlZTQwNGEwLAotMHg4ZWU1MDRhNCwgMHgyNDYyMDAxYywgMHhhYzYyMDAwOCwgMHhhNDZlMDAwZSwKLTB4YWM2ZDAwMTgsIDB4YWM2NDAwMDAsIDB4YWM2NTAwMDQsIDB4OGVlMjA0YzQsCi0weGFjNjIwMDEwLCAweGFmODYwMTIwLCAweDkyZTI0ZTIwLCAweDE0NDAwMDMzLAotMHgyNDA3MDAwMSwgMHg4ZWUyNGUzMCwgMHgyMTBjMCwgMHgyNDQyNTAzOCwKLTB4MmUyMjAyMSwgMHg4YzgyMDAwMCwgMHgxNDRhMDAxZiwgMHgwLAotMHg4ZWUzNGUzMCwgMHg4ZWUyNGUzNCwgMHgxMDYyMDAxYiwgMHgwLAotMHg4YzgyMDAwNCwgMHgyNDQyMDAwMSwgMHhhYzgyMDAwNCwgMHg4ZWUyNGUzNCwKLTB4OGVlMzRlMzAsIDB4MjQ0MjAwMDEsIDB4MTA0ODAwMDcsIDB4MCwKLTB4OGVlMjRlMzQsIDB4MjQ0MjAwMDEsIDB4MTA2MjAwMDUsIDB4MCwKLTB4ODAwMWQ2MSwgMHgwLCAweDE0NjAwMDA1LCAweDAsCi0weDhmODIwMTI4LCAweDI0NDIwMDIwLCAweGFmODIwMTI4LCAweDhmODIwMTI4LAotMHg4YzgyMDAwNCwgMHgyYzQyMDAxMSwgMHg1MDQwMDAxMCwgMHhhYzgwMDAwMCwKLTB4ODAwMWQ3NCwgMHgwLCAweDhlZTI0ZTMwLCAweDI0NDIwMDAxLAotMHg1MDQ4MDAwMywgMHgxMDIxLCAweDhlZTI0ZTMwLCAweDI0NDIwMDAxLAotMHhhZWUyNGUzMCwgMHg4ZWUyNGUzMCwgMHgyMTBjMCwgMHgyNDQyNTAzOCwKLTB4MmUyMjAyMSwgMHhhYzhhMDAwMCwgMHhhYzhjMDAwNCwgMHg1NGUwMDAwNiwKLTB4MjQwYjAwMDEsIDB4OGY4MjAwNTQsIDB4MTIyMTAyMywgMHgyYzQyMDAzMywKLTB4MTQ0MGZmYTYsIDB4MCwgMHgzMTYzMDBmZiwgMHgyNDAyMDAwMSwKLTB4MTA2MjAwMjIsIDB4MCwgMHgzYzA0MDAwMSwgMHgyNDg0NTM5MCwKLTB4YWZhMDAwMTAsIDB4YWZhMDAwMTQsIDB4OGY4NjAxMjAsIDB4OGY4NzAxMjQsCi0weDNjMDUwMDA5LCAweGMwMDI0MDMsIDB4MzRhNWYwMTEsIDB4ODAwMWRhMCwKLTB4MCwgMHgzYzA0MDAwMSwgMHgyNDg0NTM5YywgMHhhZmEwMDAxNCwKLTB4OGY4NjAxMjAsIDB4OGY4NzAxMjQsIDB4M2MwNTAwMDksIDB4YzAwMjQwMywKLTB4MzRhNWYwMTAsIDB4ODAwMWRhMCwgMHgwLCAweDNjMDQwMDAxLAotMHgyNDg0NTNhOCwgMHhhZmEwMDAxNCwgMHg4ZWU2MDYwOCwgMHg4ZjQ3MDIyOCwKLTB4M2MwNTAwMDksIDB4YzAwMjQwMywgMHgzNGE1ZjAwZiwgMHg4ZWUyMDFhYywKLTB4MjQ0MjAwMDEsIDB4YWVlMjAxYWMsIDB4OGVlMjAxYWMsIDB4OGVlMjAxMjQsCi0weDI0NDIwMDAxLCAweGFlZTIwMTI0LCAweDgwMDFmOTcsIDB4OGVlMjAxMjQsCi0weDI3NDQwMjEyLCAweGMwMDIyZmUsIDB4MjQwNTAwMDYsIDB4MzA0OTAwMWYsCi0weDkyOGMwLCAweDJlNTEwMjEsIDB4OTQ0MjcyN2MsIDB4MzA0MjgwMDAsCi0weDEwNDAwMDJmLCAweDJlNTEwMjEsIDB4OTQ0MjcyN2MsIDB4MzA0MjQwMDAsCi0weDE0NDAwMDFjLCAweGI3MTAyMSwgMHg5NDQzNzI3ZSwgMHg5NzQyMDIxMiwKLTB4MTQ2MjAwMTgsIDB4YjcxMDIxLCAweDhjNDM3MjgwLCAweDhmNDIwMjE0LAotMHg1NDYyMDAxNiwgMHhhZmEyMDAxMCwgMHg5MmUyMDRkOCwgMHgxMDQwMDAwNywKLTB4MjQwMjAwMDEsIDB4OGVlMzA0ZGMsIDB4MTIyMTAwNCwgMHgyMTAyNywKLTB4NjIxODI0LCAweDgwMDFkYzksIDB4YWVlMzA0ZGMsIDB4OGY4MzAyMjgsCi0weDEyMjEwMDQsIDB4MjEwMjcsIDB4NjIxODI0LCAweGFmODMwMjI4LAotMHg5MTBjMCwgMHgyZTIxODIxLCAweDM0MDJjMDAwLCAweDgwMDFlNGUsCi0weGE0NjI3MjdjLCAweDhmNDIwMjE0LCAweGFmYTIwMDEwLCAweDkxMGMwLAotMHg1NzEwMjEsIDB4OGM0MjcyN2MsIDB4M2MwNDAwMDEsIDB4MjQ4NDUzYjQsCi0weDNjMDUwMDAzLCAweGFmYTIwMDE0LCAweDhmNDcwMjEwLCAweDM0YTVmMDFjLAotMHhjMDAyNDAzLCAweDEyMDMwMjEsIDB4ODAwMWU4MywgMHgzYzAyMDgwMCwKLTB4YjcxMDIxLCAweDk0NDM3MjdlLCAweDk3NDIwMjEyLCAweDE0NjIwMDE5LAotMHg5MThjMCwgMHhiNzEwMjEsIDB4OGM0MzcyODAsIDB4OGY0MjAyMTQsCi0weDE0NjIwMDE0LCAweDkxOGMwLCAweDJlNTEwMjEsIDB4OTQ0NzcyN2MsCi0weDcyMGMwLCAweDk3MTAyMSwgMHg5NDQzNzM3ZSwgMHhiNzEwMjEsCi0weGE0NDM3MjdlLCAweDk3MTAyMSwgMHg4YzQzNzM4MCwgMHhiNzEwMjEsCi0weGFjNDM3MjgwLCAweDJlNDEwMjEsIDB4OTQ0MzczN2MsIDB4MmU1MTAyMSwKLTB4YTQ0MzcyN2MsIDB4MmU0MTgyMSwgMHgzNDAyYzAwMCwgMHg4MDAxZTRlLAotMHhhNDYyNzM3YywgMHgyZTMxMDIxLCAweDk0NDc3MjdjLCAweDMwMjEsCi0weDcyMGMwLCAweDJlNDEwMjEsIDB4OTQ0MjczN2MsIDB4NDAyMSwKLTB4MzA0MjgwMDAsIDB4MTQ0MDAwMjUsIDB4ZTAyODIxLCAweDYwNTAyMSwKLTB4MzQwYmMwMDAsIDB4OTcxMDIxLCAweDk0NDM3MzdlLCAweDk3NDIwMjEyLAotMHg1NDYyMDAxNSwgMHhlMDI4MjEsIDB4OTcxMDIxLCAweDhjNDM3MzgwLAotMHg4ZjQyMDIxNCwgMHg1NDYyMDAxMCwgMHhlMDI4MjEsIDB4MTEwMDAwMDYsCi0weDJlNDEwMjEsIDB4OTQ0MzczN2MsIDB4NTEwYzAsIDB4MmUyMTAyMSwKLTB4ODAwMWUxYSwgMHhhNDQzNzM3YywgMHg5NDQzNzM3YywgMHgyZWExMDIxLAotMHhhNDQzNzI3YywgMHg3MTBjMCwgMHgyZTIxMDIxLCAweGE0NGI3MzdjLAotMHg4MDAxZTI4LCAweDI0MDYwMDAxLCAweDUxMGMwLCAweDJlMjEwMjEsCi0weDk0NDc3MzdjLCAweDcyMGMwLCAweDJlNDEwMjEsIDB4OTQ0MjczN2MsCi0weDMwNDI4MDAwLCAweDEwNDBmZmRmLCAweDI1MDgwMDAxLCAweDMwYzIwMGZmLAotMHgxNDQwMDAyNSwgMHgyMDIxLCAweDcyMGMwLCAweDk3MTAyMSwKLTB4OTQ0MzczN2UsIDB4OTc0MjAyMTIsIDB4MTQ2MjAwMGYsIDB4OTEwYzAsCi0weDk3MTAyMSwgMHg4YzQzNzM4MCwgMHg4ZjQyMDIxNCwgMHgxNDYyMDAwYSwKLTB4OTEwYzAsIDB4MmU0MTgyMSwgMHgzNDAyYzAwMCwgMHgxNTAwMDAxNSwKLTB4YTQ2MjczN2MsIDB4OTEwYzAsIDB4MmUyMTgyMSwgMHgzNDAyODAwMCwKLTB4ODAwMWU0ZSwgMHhhNDYyNzI3YywgMHg1NzEwMjEsIDB4OGM0MjcyN2MsCi0weDNjMDQwMDAxLCAweDI0ODQ1M2MwLCAweDNjMDUwMDAzLCAweGFmYTIwMDEwLAotMHg3MTBjMCwgMHg1NzEwMjEsIDB4OGM0MjczN2MsIDB4MzRhNTAwMWUsCi0weDEyMDMwMjEsIDB4YzAwMjQwMywgMHhhZmEyMDAxNCwgMHg4MDAxZTgzLAotMHgzYzAyMDgwMCwgMHgyMDIxLCAweDQyOGMwLCAweGI3MTAyMSwKLTB4OTQ0Mzc3N2UsIDB4OTc0MjAyMTIsIDB4NTQ2MjAwMmIsIDB4MjQ4NDAwMDEsCi0weGI3MTAyMSwgMHg4YzQzNzc4MCwgMHg4ZjQyMDIxNCwgMHg1NDYyMDAyNiwKLTB4MjQ4NDAwMDEsIDB4M2MwMjAwMDEsIDB4NTcxMDIxLCAweDhjNDI4M2I0LAotMHgyNDQyZmZmZiwgMHgzYzAxMDAwMSwgMHgzNzA4MjEsIDB4YWMyMjgzYjQsCi0weDNjMDIwMDAxLCAweDU3MTAyMSwgMHg4YzQyODNiNCwgMHg4MDkwMjEsCi0weDI0MjEwMmIsIDB4MTA0MDAwMGUsIDB4MjRiMTc3N2MsIDB4MjRiMDc3ODQsCi0weDJmMDIwMjEsIDB4MmYxMjgyMSwgMHhjMDAyNDkwLCAweDI0MDYwMDA4LAotMHgyNjMxMDAwOCwgMHgzYzAyMDAwMSwgMHg1NzEwMjEsIDB4OGM0MjgzYjQsCi0weDI2NTIwMDAxLCAweDI0MjEwMmIsIDB4MTQ0MGZmZjUsIDB4MjYxMDAwMDgsCi0weDNjMDQwMDAxLCAweDk3MjAyMSwgMHg4Yzg0ODNiNCwgMHgyNDA1MDAwOCwKLTB4NDIwYzAsIDB4MjQ4NDc3N2MsIDB4YzAwMjQ4OCwgMHgyZTQyMDIxLAotMHg4MDAxZTgzLCAweDNjMDIwODAwLCAweDJjODIwMDgwLCAweDE0NDBmZmNmLAotMHg0MjhjMCwgMHgzYzAyMDgwMCwgMHgzNDQyMjAwMCwgMHhhZmEyMDAxOCwKLTB4OGVlMjA2MDgsIDB4OGY0MzAyMjgsIDB4MjQ0MjAwMDEsIDB4MzA0YTAwZmYsCi0weDUxNDMwMGZkLCAweGFmYTAwMDEwLCAweDhlZTIwNjA4LCAweDIxMGMwLAotMHg1NzEwMjEsIDB4OGZhMzAwMTgsIDB4OGZhNDAwMWMsIDB4YWM0MzA2MGMsCi0weGFjNDQwNjEwLCAweDhmODMwMDU0LCAweDhmODIwMDU0LCAweDI0NjkwMDMyLAotMHgxMjIxMDIzLCAweDJjNDIwMDMzLCAweDEwNDAwMDZhLCAweDU4MjEsCi0weDI0MTAwMDA4LCAweDI0MGYwMDBkLCAweDI0MGQwMDA3LCAweDI0MGMwMDQwLAotMHgyNDBlMDAwMSwgMHg4Zjg3MDEyMCwgMHgyNzYyMzgwMCwgMHgyNGU4MDAyMCwKLTB4MTAyMTAyYiwgMHg1MDQwMDAwMSwgMHgyNzY4MzAwMCwgMHg4ZjgyMDEyOCwKLTB4MTEwMjAwMDQsIDB4MCwgMHg4ZjgyMDEyNCwgMHgxNTAyMDAwNywKLTB4MTAyMSwgMHg4ZWUyMDFhNCwgMHgzODIxLCAweDI0NDIwMDAxLAotMHhhZWUyMDFhNCwgMHg4MDAxZWZiLCAweDhlZTIwMWE0LCAweDhlZTQwNjA4LAotMHg0MjBjMCwgMHg4MDE4MjEsIDB4OGVlNDA0MzAsIDB4OGVlNTA0MzQsCi0weGEzMjgyMSwgMHhhMzMwMmIsIDB4ODIyMDIxLCAweDg2MjAyMSwKLTB4YWNlNDAwMDAsIDB4YWNlNTAwMDQsIDB4OGVlMjA2MDgsIDB4YTRmMDAwMGUsCi0weGFjZWYwMDE4LCAweGFjZWEwMDFjLCAweDIxMGMwLCAweDI0NDIwNjBjLAotMHgyZTIxMDIxLCAweGFjZTIwMDA4LCAweDhlZTIwNGM0LCAweGFjZTIwMDEwLAotMHhhZjg4MDEyMCwgMHg5MmUyNGUyMCwgMHgxNDQwMDAzMywgMHgyNDA3MDAwMSwKLTB4OGVlMjRlMzAsIDB4MjEwYzAsIDB4MjQ0MjUwMzgsIDB4MmUyMjAyMSwKLTB4OGM4MjAwMDAsIDB4MTQ0ZDAwMWYsIDB4MCwgMHg4ZWUzNGUzMCwKLTB4OGVlMjRlMzQsIDB4MTA2MjAwMWIsIDB4MCwgMHg4YzgyMDAwNCwKLTB4MjQ0MjAwMDEsIDB4YWM4MjAwMDQsIDB4OGVlMjRlMzQsIDB4OGVlMzRlMzAsCi0weDI0NDIwMDAxLCAweDEwNGMwMDA3LCAweDAsIDB4OGVlMjRlMzQsCi0weDI0NDIwMDAxLCAweDEwNjIwMDA1LCAweDAsIDB4ODAwMWVlOCwKLTB4MCwgMHgxNDYwMDAwNSwgMHgwLCAweDhmODIwMTI4LAotMHgyNDQyMDAyMCwgMHhhZjgyMDEyOCwgMHg4ZjgyMDEyOCwgMHg4YzgyMDAwNCwKLTB4MmM0MjAwMTEsIDB4NTA0MDAwMTAsIDB4YWM4MDAwMDAsIDB4ODAwMWVmYiwKLTB4MCwgMHg4ZWUyNGUzMCwgMHgyNDQyMDAwMSwgMHg1MDRjMDAwMywKLTB4MTAyMSwgMHg4ZWUyNGUzMCwgMHgyNDQyMDAwMSwgMHhhZWUyNGUzMCwKLTB4OGVlMjRlMzAsIDB4MjEwYzAsIDB4MjQ0MjUwMzgsIDB4MmUyMjAyMSwKLTB4YWM4ZDAwMDAsIDB4YWM4ZTAwMDQsIDB4NTRlMDAwMDYsIDB4MjQwYjAwMDEsCi0weDhmODIwMDU0LCAweDEyMjEwMjMsIDB4MmM0MjAwMzMsIDB4MTQ0MGZmOWQsCi0weDAsIDB4MzE2MzAwZmYsIDB4MjQwMjAwMDEsIDB4NTQ2MjAwNzgsCi0weGFmYTAwMDEwLCAweGFlZWEwNjA4LCAweDhmODMwMDU0LCAweDhmODIwMDU0LAotMHgyNDY5MDAzMiwgMHgxMjIxMDIzLCAweDJjNDIwMDMzLCAweDEwNDAwMDYxLAotMHg1ODIxLCAweDI0MGUwMDA4LCAweDI0MGQwMDExLCAweDI0MGEwMDEyLAotMHgyNDA4MDA0MCwgMHgyNDBjMDAwMSwgMHg4ZjgzMDEyMCwgMHgyNzYyMzgwMCwKLTB4MjQ2NjAwMjAsIDB4YzIxMDJiLCAweDUwNDAwMDAxLCAweDI3NjYzMDAwLAotMHg4ZjgyMDEyOCwgMHgxMGMyMDAwNCwgMHgwLCAweDhmODIwMTI0LAotMHgxNGMyMDAwNywgMHgwLCAweDhlZTIwMWE0LCAweDM4MjEsCi0weDI0NDIwMDAxLCAweGFlZTIwMWE0LCAweDgwMDFmNjcsIDB4OGVlMjAxYTQsCi0weDhlZTIwNjA4LCAweGFjNjIwMDFjLCAweDhlZTQwNGEwLCAweDhlZTUwNGE0LAotMHgyNDYyMDAxYywgMHhhYzYyMDAwOCwgMHhhNDZlMDAwZSwgMHhhYzZkMDAxOCwKLTB4YWM2NDAwMDAsIDB4YWM2NTAwMDQsIDB4OGVlMjA0YzQsIDB4YWM2MjAwMTAsCi0weGFmODYwMTIwLCAweDkyZTI0ZTIwLCAweDE0NDAwMDMzLCAweDI0MDcwMDAxLAotMHg4ZWUyNGUzMCwgMHgyMTBjMCwgMHgyNDQyNTAzOCwgMHgyZTIyMDIxLAotMHg4YzgyMDAwMCwgMHgxNDRhMDAxZiwgMHgwLCAweDhlZTM0ZTMwLAotMHg4ZWUyNGUzNCwgMHgxMDYyMDAxYiwgMHgwLCAweDhjODIwMDA0LAotMHgyNDQyMDAwMSwgMHhhYzgyMDAwNCwgMHg4ZWUyNGUzNCwgMHg4ZWUzNGUzMCwKLTB4MjQ0MjAwMDEsIDB4MTA0ODAwMDcsIDB4MCwgMHg4ZWUyNGUzNCwKLTB4MjQ0MjAwMDEsIDB4MTA2MjAwMDUsIDB4MCwgMHg4MDAxZjU0LAotMHgwLCAweDE0NjAwMDA1LCAweDAsIDB4OGY4MjAxMjgsCi0weDI0NDIwMDIwLCAweGFmODIwMTI4LCAweDhmODIwMTI4LCAweDhjODIwMDA0LAotMHgyYzQyMDAxMSwgMHg1MDQwMDAxMCwgMHhhYzgwMDAwMCwgMHg4MDAxZjY3LAotMHgwLCAweDhlZTI0ZTMwLCAweDI0NDIwMDAxLCAweDUwNDgwMDAzLAotMHgxMDIxLCAweDhlZTI0ZTMwLCAweDI0NDIwMDAxLCAweGFlZTI0ZTMwLAotMHg4ZWUyNGUzMCwgMHgyMTBjMCwgMHgyNDQyNTAzOCwgMHgyZTIyMDIxLAotMHhhYzhhMDAwMCwgMHhhYzhjMDAwNCwgMHg1NGUwMDAwNiwgMHgyNDBiMDAwMSwKLTB4OGY4MjAwNTQsIDB4MTIyMTAyMywgMHgyYzQyMDAzMywgMHgxNDQwZmZhNiwKLTB4MCwgMHgzMTYzMDBmZiwgMHgyNDAyMDAwMSwgMHgxMDYyMDAyMiwKLTB4MCwgMHgzYzA0MDAwMSwgMHgyNDg0NTM5MCwgMHhhZmEwMDAxMCwKLTB4YWZhMDAwMTQsIDB4OGY4NjAxMjAsIDB4OGY4NzAxMjQsIDB4M2MwNTAwMDksCi0weGMwMDI0MDMsIDB4MzRhNWYwMTEsIDB4ODAwMWY5MywgMHgwLAotMHgzYzA0MDAwMSwgMHgyNDg0NTM5YywgMHhhZmEwMDAxNCwgMHg4Zjg2MDEyMCwKLTB4OGY4NzAxMjQsIDB4M2MwNTAwMDksIDB4YzAwMjQwMywgMHgzNGE1ZjAxMCwKLTB4ODAwMWY5MywgMHgwLCAweDNjMDQwMDAxLCAweDI0ODQ1M2E4LAotMHhhZmEwMDAxNCwgMHg4ZWU2MDYwOCwgMHg4ZjQ3MDIyOCwgMHgzYzA1MDAwOSwKLTB4YzAwMjQwMywgMHgzNGE1ZjAwZiwgMHg4ZWUyMDFhYywgMHgyNDQyMDAwMSwKLTB4YWVlMjAxYWMsIDB4OGVlMjAxYWMsIDB4OGVlMjAxMjgsIDB4MjQ0MjAwMDEsCi0weGFlZTIwMTI4LCAweDhlZTIwMTI4LCAweDhlZTIwMTY0LCAweDI0NDIwMDAxLAotMHhhZWUyMDE2NCwgMHg4MDAyMmU4LCAweDhlZTIwMTY0LCAweDhmYTIwMDIwLAotMHgyMTIwMCwgMHgyMWQwMiwgMHgyNDAyMDAwMSwgMHgxMDYyMDAwNSwKLTB4MjQwMjAwMDIsIDB4MTA2MjAwMGQsIDB4MCwgMHg4MDAxZmI3LAotMHhhZmEwMDAxMCwgMHg5MmUyMDRkOCwgMHgxNDQwMDAwNiwgMHgyNDAyMDAwMSwKLTB4OGY4MjAyMjgsIDB4YWVlMjA0ZGMsIDB4MjQwMmZmZmYsIDB4YWY4MjAyMjgsCi0weDI0MDIwMDAxLCAweDgwMDFmYmUsIDB4YTJlMjA0ZDgsIDB4OTJlMjA0ZDgsCi0weDUwNDAwMDBjLCAweGEyZTAwNGQ4LCAweDhlZTIwNGRjLCAweGFmODIwMjI4LAotMHg4MDAxZmJlLCAweGEyZTAwNGQ4LCAweDNjMDQwMDAxLCAweDI0ODQ1M2M4LAotMHhhZmEwMDAxNCwgMHg4ZmE2MDAyMCwgMHgzYzA1MDAwMywgMHhjMDAyNDAzLAotMHgzNGE1ZjAwOSwgMHg4ZWUyMDEzYywgMHgyNDQyMDAwMSwgMHhhZWUyMDEzYywKLTB4ODAwMjJlOCwgMHg4ZWUyMDEzYywgMHg4ZmEyMDAyMCwgMHgyMTIwMCwKLTB4MjI1MDIsIDB4MjQwMjAwMDEsIDB4MTA4MjAwMDUsIDB4MjQwMjAwMDIsCi0weDEwODIwMDBmLCAweDAsIDB4ODAwMWZlMywgMHhhZmEwMDAxMCwKLTB4OGY4MjAyMjAsIDB4M2MwMzA4ZmYsIDB4MzQ2M2ZmZmYsIDB4NDMxMDI0LAotMHgzNDQyMDAwOCwgMHhhZjgyMDIyMCwgMHgyNDAyMDAwMSwgMHgzYzAxMDAwMSwKLTB4MzcwODIxLCAweGEwMjI4M2IyLCAweDgwMDFmZWEsIDB4YWVlNDAxMDgsCi0weDhmODIwMjIwLCAweDNjMDMwOGZmLCAweDM0NjNmZmY3LCAweDQzMTAyNCwKLTB4YWY4MjAyMjAsIDB4M2MwMTAwMDEsIDB4MzcwODIxLCAweGEwMjA4M2IyLAotMHg4MDAxZmVhLCAweGFlZTQwMTA4LCAweDNjMDQwMDAxLCAweDI0ODQ1M2Q0LAotMHhhZmEwMDAxNCwgMHg4ZmE2MDAyMCwgMHgzYzA1MDAwMywgMHhjMDAyNDAzLAotMHgzNGE1ZjAwYSwgMHg4ZWUyMDEyYywgMHgyNDQyMDAwMSwgMHhhZWUyMDEyYywKLTB4ODAwMjJlOCwgMHg4ZWUyMDEyYywgMHg4ZmEyMDAyMCwgMHgyMTIwMCwKLTB4MjFkMDIsIDB4MjQwMjAwMDEsIDB4MTA2MjAwMDUsIDB4MjQwMjAwMDIsCi0weDEwNjIwMDBlLCAweDAsIDB4ODAwMjAxMSwgMHhhZmEwMDAxMCwKLTB4OGY4MjAyMjAsIDB4M2MwMzA4ZmYsIDB4MzQ2M2ZmZmYsIDB4NDMxMDI0LAotMHgzNDQyMDAwOCwgMHhhZjgyMDIyMCwgMHgyNDAyMDAwMSwgMHgzYzAxMDAwMSwKLTB4MzcwODIxLCAweDgwMDIwMTgsIDB4YTAyMjgzYjMsIDB4M2MwMjAwMDEsCi0weDU3MTAyMSwgMHg5MDQyODNiMiwgMHgzYzAxMDAwMSwgMHgzNzA4MjEsCi0weDE0NDAwMDBlLCAweGEwMjA4M2IzLCAweDhmODIwMjIwLCAweDNjMDMwOGZmLAotMHgzNDYzZmZmNywgMHg0MzEwMjQsIDB4ODAwMjAxOCwgMHhhZjgyMDIyMCwKLTB4M2MwNDAwMDEsIDB4MjQ4NDUzZTAsIDB4YWZhMDAwMTQsIDB4OGZhNjAwMjAsCi0weDNjMDUwMDAzLCAweGMwMDI0MDMsIDB4MzRhNWYwMGIsIDB4OGVlMjAxMTQsCi0weDI0NDIwMDAxLCAweGFlZTIwMTE0LCAweDgwMDIyZTgsIDB4OGVlMjAxMTQsCi0weDI3ODQwMjA4LCAweDI3NDUwMjAwLCAweGMwMDI0OWEsIDB4MjQwNjAwMDgsCi0weDI2ZTQwMDk0LCAweDI3NDUwMjAwLCAweGMwMDI0OWEsIDB4MjQwNjAwMDgsCi0weDhlZTIwMTM0LCAweDI0NDIwMDAxLCAweGFlZTIwMTM0LCAweDgwMDIyZTgsCi0weDhlZTIwMTM0LCAweDhmNDYwMjQ4LCAweDIwMjEsIDB4YzAwNTEwOCwKLTB4MjQwNTAwMDQsIDB4OGVlMjAxMzAsIDB4MjQ0MjAwMDEsIDB4YWVlMjAxMzAsCi0weDgwMDIyZTgsIDB4OGVlMjAxMzAsIDB4OGVmMzAxY2MsIDB4OGVmNDAxZDAsCi0weDhlZjUwMWQ4LCAweDhlZTIwMTQwLCAweDI2ZTQwMDMwLCAweDI0NDIwMDAxLAotMHhhZWUyMDE0MCwgMHg4ZWYwMDE0MCwgMHg4ZWYxMDA3NCwgMHg4ZWYyMDA3MCwKLTB4YzAwMjQ4OCwgMHgyNDA1MDQwMCwgMHhhZWYzMDFjYywgMHhhZWY0MDFkMCwKLTB4YWVmNTAxZDgsIDB4YWVmMDAxNDAsIDB4YWVmMTAwNzQsIDB4YWVmMjAwNzAsCi0weDhmNDIwMjVjLCAweDI2ZTQwMDk0LCAweGFlZTIwMDYwLCAweDhmNDIwMjYwLAotMHgyNzQ1MDIwMCwgMHgyNDA2MDAwOCwgMHhhZWUyMDA2OCwgMHgyNDAyMDAwNiwKLTB4YzAwMjQ5YSwgMHhhZWUyMDA2NCwgMHgzYzAyM2I5YSwgMHgzNDQyY2EwMCwKLTB4YWVlMjAwNmMsIDB4MjQwMjAzZTgsIDB4MjQwNDAwMDIsIDB4MjQwMzAwMDEsCi0weGFlZTIwMTA0LCAweGFlZTQwMTAwLCAweGFlZTMwMTBjLCAweDhmODIwMjIwLAotMHgzMDQyMDAwOCwgMHgxMDQwMDAwNCwgMHgwLCAweGFlZTMwMTA4LAotMHg4MDAyMDYxLCAweDIwMjEsIDB4YWVlNDAxMDgsIDB4MjAyMSwKLTB4M2MwMzAwMDEsIDB4NjQxODIxLCAweDkwNjM1YzMwLCAweDJlNDEwMjEsCi0weDI0ODQwMDAxLCAweGEwNDMwMDljLCAweDJjODIwMDBmLCAweDE0NDBmZmY4LAotMHgwLCAweDhmODIwMDQwLCAweDJlNDE4MjEsIDB4MjQ4NDAwMDEsCi0weDIxNzAyLCAweDI0NDIwMDMwLCAweGEwNjIwMDljLCAweDJlNDEwMjEsCi0weDgwMDIyZTgsIDB4YTA0MDAwOWMsIDB4MjQwMjAwMDEsIDB4M2MwMTAwMDEsCi0weDM3MDgyMSwgMHhhMDIyODNlMCwgMHgyNDBiMDQwMCwgMHgyNDA4MDAxNCwKLTB4MjQwYTAwNDAsIDB4MjQwOTAwMDEsIDB4OGY4MzAxMDAsIDB4Mjc2MjMwMDAsCi0weDI0NjYwMDIwLCAweGMyMTAyYiwgMHg1MDQwMDAwMSwgMHgyNzY2MjgwMCwKLTB4OGY4MjAxMDgsIDB4MTBjMjAwMDQsIDB4MCwgMHg4ZjgyMDEwNCwKLTB4MTRjMjAwMDcsIDB4MjZlMjAwMzAsIDB4OGVlMjAxYTgsIDB4MzgyMSwKLTB4MjQ0MjAwMDEsIDB4YWVlMjAxYTgsIDB4ODAwMjBhOCwgMHg4ZWUyMDFhOCwKLTB4OGVlNDA0YjgsIDB4OGVlNTA0YmMsIDB4YWM2MjAwMDgsIDB4YTQ2YjAwMGUsCi0weGFjNjgwMDE4LCAweGFjNjAwMDFjLCAweGFjNjQwMDAwLCAweGFjNjUwMDA0LAotMHg4ZWUyMDRjYywgMHhhYzYyMDAxMCwgMHhhZjg2MDEwMCwgMHg5MmUyMDRlYywKLTB4MTQ0MDAwMGUsIDB4MjQwNzAwMDEsIDB4OGVlMjRlMjgsIDB4MjQ0MjAwMDEsCi0weDUwNGEwMDAzLCAweDEwMjEsIDB4OGVlMjRlMjgsIDB4MjQ0MjAwMDEsCi0weGFlZTI0ZTI4LCAweDhlZTI0ZTI4LCAweDIxMGMwLCAweDI0NDI0ZTM4LAotMHgyZTIxMDIxLCAweGFjNDgwMDAwLCAweGFjNDkwMDA0LCAweDEwZTBmZmQyLAotMHgwLCAweDgwMDIyZTgsIDB4MCwgMHgzYzAyMDkwMCwKLTB4YWVlMDUyMzgsIDB4YWVlMDUyM2MsIDB4YWVlMDUyNDAsIDB4YWVlMDUyNDQsCi0weGFlZTAwMWQwLCAweDNjMDEwMDAxLCAweDM3MDgyMSwgMHhhMDIwODNiMSwKLTB4YWZhMjAwMTgsIDB4OGVlMjA2MDgsIDB4OGY0MzAyMjgsIDB4MjQ0MjAwMDEsCi0weDMwNGEwMGZmLCAweDUxNDMwMGZkLCAweGFmYTAwMDEwLCAweDhlZTIwNjA4LAotMHgyMTBjMCwgMHg1NzEwMjEsIDB4OGZhMzAwMTgsIDB4OGZhNDAwMWMsCi0weGFjNDMwNjBjLCAweGFjNDQwNjEwLCAweDhmODMwMDU0LCAweDhmODIwMDU0LAotMHgyNDY5MDAzMiwgMHgxMjIxMDIzLCAweDJjNDIwMDMzLCAweDEwNDAwMDZhLAotMHg1ODIxLCAweDI0MTAwMDA4LCAweDI0MGYwMDBkLCAweDI0MGQwMDA3LAotMHgyNDBjMDA0MCwgMHgyNDBlMDAwMSwgMHg4Zjg3MDEyMCwgMHgyNzYyMzgwMCwKLTB4MjRlODAwMjAsIDB4MTAyMTAyYiwgMHg1MDQwMDAwMSwgMHgyNzY4MzAwMCwKLTB4OGY4MjAxMjgsIDB4MTEwMjAwMDQsIDB4MCwgMHg4ZjgyMDEyNCwKLTB4MTUwMjAwMDcsIDB4MTAyMSwgMHg4ZWUyMDFhNCwgMHgzODIxLAotMHgyNDQyMDAwMSwgMHhhZWUyMDFhNCwgMHg4MDAyMTJjLCAweDhlZTIwMWE0LAotMHg4ZWU0MDYwOCwgMHg0MjBjMCwgMHg4MDE4MjEsIDB4OGVlNDA0MzAsCi0weDhlZTUwNDM0LCAweGEzMjgyMSwgMHhhMzMwMmIsIDB4ODIyMDIxLAotMHg4NjIwMjEsIDB4YWNlNDAwMDAsIDB4YWNlNTAwMDQsIDB4OGVlMjA2MDgsCi0weGE0ZjAwMDBlLCAweGFjZWYwMDE4LCAweGFjZWEwMDFjLCAweDIxMGMwLAotMHgyNDQyMDYwYywgMHgyZTIxMDIxLCAweGFjZTIwMDA4LCAweDhlZTIwNGM0LAotMHhhY2UyMDAxMCwgMHhhZjg4MDEyMCwgMHg5MmUyNGUyMCwgMHgxNDQwMDAzMywKLTB4MjQwNzAwMDEsIDB4OGVlMjRlMzAsIDB4MjEwYzAsIDB4MjQ0MjUwMzgsCi0weDJlMjIwMjEsIDB4OGM4MjAwMDAsIDB4MTQ0ZDAwMWYsIDB4MCwKLTB4OGVlMzRlMzAsIDB4OGVlMjRlMzQsIDB4MTA2MjAwMWIsIDB4MCwKLTB4OGM4MjAwMDQsIDB4MjQ0MjAwMDEsIDB4YWM4MjAwMDQsIDB4OGVlMjRlMzQsCi0weDhlZTM0ZTMwLCAweDI0NDIwMDAxLCAweDEwNGMwMDA3LCAweDAsCi0weDhlZTI0ZTM0LCAweDI0NDIwMDAxLCAweDEwNjIwMDA1LCAweDAsCi0weDgwMDIxMTksIDB4MCwgMHgxNDYwMDAwNSwgMHgwLAotMHg4ZjgyMDEyOCwgMHgyNDQyMDAyMCwgMHhhZjgyMDEyOCwgMHg4ZjgyMDEyOCwKLTB4OGM4MjAwMDQsIDB4MmM0MjAwMTEsIDB4NTA0MDAwMTAsIDB4YWM4MDAwMDAsCi0weDgwMDIxMmMsIDB4MCwgMHg4ZWUyNGUzMCwgMHgyNDQyMDAwMSwKLTB4NTA0YzAwMDMsIDB4MTAyMSwgMHg4ZWUyNGUzMCwgMHgyNDQyMDAwMSwKLTB4YWVlMjRlMzAsIDB4OGVlMjRlMzAsIDB4MjEwYzAsIDB4MjQ0MjUwMzgsCi0weDJlMjIwMjEsIDB4YWM4ZDAwMDAsIDB4YWM4ZTAwMDQsIDB4NTRlMDAwMDYsCi0weDI0MGIwMDAxLCAweDhmODIwMDU0LCAweDEyMjEwMjMsIDB4MmM0MjAwMzMsCi0weDE0NDBmZjlkLCAweDAsIDB4MzE2MzAwZmYsIDB4MjQwMjAwMDEsCi0weDU0NjIwMDc4LCAweGFmYTAwMDEwLCAweGFlZWEwNjA4LCAweDhmODMwMDU0LAotMHg4ZjgyMDA1NCwgMHgyNDY5MDAzMiwgMHgxMjIxMDIzLCAweDJjNDIwMDMzLAotMHgxMDQwMDA2MSwgMHg1ODIxLCAweDI0MGUwMDA4LCAweDI0MGQwMDExLAotMHgyNDBhMDAxMiwgMHgyNDA4MDA0MCwgMHgyNDBjMDAwMSwgMHg4ZjgzMDEyMCwKLTB4Mjc2MjM4MDAsIDB4MjQ2NjAwMjAsIDB4YzIxMDJiLCAweDUwNDAwMDAxLAotMHgyNzY2MzAwMCwgMHg4ZjgyMDEyOCwgMHgxMGMyMDAwNCwgMHgwLAotMHg4ZjgyMDEyNCwgMHgxNGMyMDAwNywgMHgwLCAweDhlZTIwMWE0LAotMHgzODIxLCAweDI0NDIwMDAxLCAweGFlZTIwMWE0LCAweDgwMDIxOTgsCi0weDhlZTIwMWE0LCAweDhlZTIwNjA4LCAweGFjNjIwMDFjLCAweDhlZTQwNGEwLAotMHg4ZWU1MDRhNCwgMHgyNDYyMDAxYywgMHhhYzYyMDAwOCwgMHhhNDZlMDAwZSwKLTB4YWM2ZDAwMTgsIDB4YWM2NDAwMDAsIDB4YWM2NTAwMDQsIDB4OGVlMjA0YzQsCi0weGFjNjIwMDEwLCAweGFmODYwMTIwLCAweDkyZTI0ZTIwLCAweDE0NDAwMDMzLAotMHgyNDA3MDAwMSwgMHg4ZWUyNGUzMCwgMHgyMTBjMCwgMHgyNDQyNTAzOCwKLTB4MmUyMjAyMSwgMHg4YzgyMDAwMCwgMHgxNDRhMDAxZiwgMHgwLAotMHg4ZWUzNGUzMCwgMHg4ZWUyNGUzNCwgMHgxMDYyMDAxYiwgMHgwLAotMHg4YzgyMDAwNCwgMHgyNDQyMDAwMSwgMHhhYzgyMDAwNCwgMHg4ZWUyNGUzNCwKLTB4OGVlMzRlMzAsIDB4MjQ0MjAwMDEsIDB4MTA0ODAwMDcsIDB4MCwKLTB4OGVlMjRlMzQsIDB4MjQ0MjAwMDEsIDB4MTA2MjAwMDUsIDB4MCwKLTB4ODAwMjE4NSwgMHgwLCAweDE0NjAwMDA1LCAweDAsCi0weDhmODIwMTI4LCAweDI0NDIwMDIwLCAweGFmODIwMTI4LCAweDhmODIwMTI4LAotMHg4YzgyMDAwNCwgMHgyYzQyMDAxMSwgMHg1MDQwMDAxMCwgMHhhYzgwMDAwMCwKLTB4ODAwMjE5OCwgMHgwLCAweDhlZTI0ZTMwLCAweDI0NDIwMDAxLAotMHg1MDQ4MDAwMywgMHgxMDIxLCAweDhlZTI0ZTMwLCAweDI0NDIwMDAxLAotMHhhZWUyNGUzMCwgMHg4ZWUyNGUzMCwgMHgyMTBjMCwgMHgyNDQyNTAzOCwKLTB4MmUyMjAyMSwgMHhhYzhhMDAwMCwgMHhhYzhjMDAwNCwgMHg1NGUwMDAwNiwKLTB4MjQwYjAwMDEsIDB4OGY4MjAwNTQsIDB4MTIyMTAyMywgMHgyYzQyMDAzMywKLTB4MTQ0MGZmYTYsIDB4MCwgMHgzMTYzMDBmZiwgMHgyNDAyMDAwMSwKLTB4MTA2MjAwMjIsIDB4MCwgMHgzYzA0MDAwMSwgMHgyNDg0NTM5MCwKLTB4YWZhMDAwMTAsIDB4YWZhMDAwMTQsIDB4OGY4NjAxMjAsIDB4OGY4NzAxMjQsCi0weDNjMDUwMDA5LCAweGMwMDI0MDMsIDB4MzRhNWYwMTEsIDB4ODAwMjFjNCwKLTB4MCwgMHgzYzA0MDAwMSwgMHgyNDg0NTM5YywgMHhhZmEwMDAxNCwKLTB4OGY4NjAxMjAsIDB4OGY4NzAxMjQsIDB4M2MwNTAwMDksIDB4YzAwMjQwMywKLTB4MzRhNWYwMTAsIDB4ODAwMjFjNCwgMHgwLCAweDNjMDQwMDAxLAotMHgyNDg0NTNhOCwgMHhhZmEwMDAxNCwgMHg4ZWU2MDYwOCwgMHg4ZjQ3MDIyOCwKLTB4M2MwNTAwMDksIDB4YzAwMjQwMywgMHgzNGE1ZjAwZiwgMHg4ZWUyMDFhYywKLTB4MjQ0MjAwMDEsIDB4YWVlMjAxYWMsIDB4OGVlMjAxYWMsIDB4OGVlMjAxMjAsCi0weDI0NDIwMDAxLCAweGFlZTIwMTIwLCAweDhlZTIwMTIwLCAweDhlZTIwMTY4LAotMHgyNDQyMDAwMSwgMHhhZWUyMDE2OCwgMHg4MDAyMmU4LCAweDhlZTIwMTY4LAotMHg4ZjQyMDI1YywgMHgyNmU0MDA5NCwgMHhhZWUyMDA2MCwgMHg4ZjQyMDI2MCwKLTB4Mjc0NTAyMDAsIDB4MjQwNjAwMDgsIDB4YzAwMjQ5YSwgMHhhZWUyMDA2OCwKLTB4OGY4MjAyMjAsIDB4MzA0MjAwMDgsIDB4MTQ0MDAwMDIsIDB4MjQwMjAwMDEsCi0weDI0MDIwMDAyLCAweGFlZTIwMTA4LCAweDhlZTIwMTFjLCAweDI0NDIwMDAxLAotMHhhZWUyMDExYywgMHg4MDAyMmU4LCAweDhlZTIwMTFjLCAweDNjMDQwMDAxLAotMHgyNDg0NTNlYywgMHhhZmEwMDAxMCwgMHhhZmEwMDAxNCwgMHg4ZmE2MDAyMCwKLTB4M2MwNTAwMDMsIDB4YzAwMjQwMywgMHgzNGE1ZjAwZiwgMHg5M2EyMDAyMCwKLTB4M2MwMzA3MDAsIDB4MzQ2MzEwMDAsIDB4NDMxMDI1LCAweGFmYTIwMDE4LAotMHg4ZWUyMDYwOCwgMHg4ZjQzMDIyOCwgMHgyNDQyMDAwMSwgMHgzMDQ5MDBmZiwKLTB4NTEyMzAwZTIsIDB4YWZhMDAwMTAsIDB4OGVlMjA2MDgsIDB4MjEwYzAsCi0weDU3MTAyMSwgMHg4ZmEzMDAxOCwgMHg4ZmE0MDAxYywgMHhhYzQzMDYwYywKLTB4YWM0NDA2MTAsIDB4OGY4NzAxMjAsIDB4Mjc2MjM4MDAsIDB4MjRlODAwMjAsCi0weDEwMjEwMmIsIDB4NTA0MDAwMDEsIDB4Mjc2ODMwMDAsIDB4OGY4MjAxMjgsCi0weDExMDIwMDA0LCAweDAsIDB4OGY4MjAxMjQsIDB4MTUwMjAwMDcsCi0weDEwMjEsIDB4OGVlMjAxYTQsIDB4MzgyMSwgMHgyNDQyMDAwMSwKLTB4YWVlMjAxYTQsIDB4ODAwMjI1ZCwgMHg4ZWUyMDFhNCwgMHg4ZWU0MDYwOCwKLTB4NDIwYzAsIDB4ODAxODIxLCAweDhlZTQwNDMwLCAweDhlZTUwNDM0LAotMHhhMzI4MjEsIDB4YTMzMDJiLCAweDgyMjAyMSwgMHg4NjIwMjEsCi0weGFjZTQwMDAwLCAweGFjZTUwMDA0LCAweDhlZTMwNjA4LCAweDI0MDIwMDA4LAotMHhhNGUyMDAwZSwgMHgyNDAyMDAwZCwgMHhhY2UyMDAxOCwgMHhhY2U5MDAxYywKLTB4MzE4YzAsIDB4MjQ2MzA2MGMsIDB4MmUzMTAyMSwgMHhhY2UyMDAwOCwKLTB4OGVlMjA0YzQsIDB4YWNlMjAwMTAsIDB4YWY4ODAxMjAsIDB4OTJlMjRlMjAsCi0weDE0NDAwMDM3LCAweDI0MDcwMDAxLCAweDhlZTI0ZTMwLCAweDIxMGMwLAotMHgyNDQyNTAzOCwgMHgyZTIyMDIxLCAweDhjODMwMDAwLCAweDI0MDIwMDA3LAotMHgxNDYyMDAxZiwgMHgwLCAweDhlZTM0ZTMwLCAweDhlZTI0ZTM0LAotMHgxMDYyMDAxYiwgMHgyNDAzMDA0MCwgMHg4YzgyMDAwNCwgMHgyNDQyMDAwMSwKLTB4YWM4MjAwMDQsIDB4OGVlMjRlMzQsIDB4OGVlNTRlMzAsIDB4MjQ0MjAwMDEsCi0weDEwNDMwMDA3LCAweDAsIDB4OGVlMjRlMzQsIDB4MjQ0MjAwMDEsCi0weDEwYTIwMDA1LCAweDAsIDB4ODAwMjI0NywgMHgwLAotMHgxNGEwMDAwNSwgMHgwLCAweDhmODIwMTI4LCAweDI0NDIwMDIwLAotMHhhZjgyMDEyOCwgMHg4ZjgyMDEyOCwgMHg4YzgyMDAwNCwgMHgyYzQyMDAxMSwKLTB4NTA0MDAwMTMsIDB4YWM4MDAwMDAsIDB4ODAwMjI1ZCwgMHgwLAotMHg4ZWUyNGUzMCwgMHgyNDAzMDA0MCwgMHgyNDQyMDAwMSwgMHg1MDQzMDAwMywKLTB4MTAyMSwgMHg4ZWUyNGUzMCwgMHgyNDQyMDAwMSwgMHhhZWUyNGUzMCwKLTB4OGVlMjRlMzAsIDB4MjEwYzAsIDB4MjQ0MjUwMzgsIDB4MmUyMjAyMSwKLTB4MjQwMjAwMDcsIDB4YWM4MjAwMDAsIDB4MjQwMjAwMDEsIDB4YWM4MjAwMDQsCi0weDU0ZTAwMDBjLCAweGFlZTkwNjA4LCAweDNjMDQwMDAxLCAweDI0ODQ1M2Y0LAotMHhhZmEwMDAxMCwgMHhhZmEwMDAxNCwgMHg4ZWU2MDYwOCwgMHg4ZjQ3MDIyOCwKLTB4M2MwNTAwMDksIDB4YzAwMjQwMywgMHgzNGE1ZjAwMCwgMHg4MDAyMmUwLAotMHgwLCAweDhmODMwMTIwLCAweDI3NjIzODAwLCAweDI0NjYwMDIwLAotMHhjMjEwMmIsIDB4NTA0MDAwMDEsIDB4Mjc2NjMwMDAsIDB4OGY4MjAxMjgsCi0weDEwYzIwMDA0LCAweDAsIDB4OGY4MjAxMjQsIDB4MTRjMjAwMDcsCi0weDAsIDB4OGVlMjAxYTQsIDB4MzgyMSwgMHgyNDQyMDAwMSwKLTB4YWVlMjAxYTQsIDB4ODAwMjJjNCwgMHg4ZWUyMDFhNCwgMHg4ZWUyMDYwOCwKLTB4YWM2MjAwMWMsIDB4OGVlNDA0YTAsIDB4OGVlNTA0YTQsIDB4MjQ2MjAwMWMsCi0weGFjNjIwMDA4LCAweDI0MDIwMDA4LCAweGE0NjIwMDBlLCAweDI0MDIwMDExLAotMHhhYzYyMDAxOCwgMHhhYzY0MDAwMCwgMHhhYzY1MDAwNCwgMHg4ZWUyMDRjNCwKLTB4YWM2MjAwMTAsIDB4YWY4NjAxMjAsIDB4OTJlMjRlMjAsIDB4MTQ0MDAwMzcsCi0weDI0MDcwMDAxLCAweDhlZTI0ZTMwLCAweDIxMGMwLCAweDI0NDI1MDM4LAotMHgyZTIyMDIxLCAweDhjODMwMDAwLCAweDI0MDIwMDEyLCAweDE0NjIwMDFmLAotMHgwLCAweDhlZTM0ZTMwLCAweDhlZTI0ZTM0LCAweDEwNjIwMDFiLAotMHgyNDAzMDA0MCwgMHg4YzgyMDAwNCwgMHgyNDQyMDAwMSwgMHhhYzgyMDAwNCwKLTB4OGVlMjRlMzQsIDB4OGVlNTRlMzAsIDB4MjQ0MjAwMDEsIDB4MTA0MzAwMDcsCi0weDAsIDB4OGVlMjRlMzQsIDB4MjQ0MjAwMDEsIDB4MTBhMjAwMDUsCi0weDAsIDB4ODAwMjJhZSwgMHgwLCAweDE0YTAwMDA1LAotMHgwLCAweDhmODIwMTI4LCAweDI0NDIwMDIwLCAweGFmODIwMTI4LAotMHg4ZjgyMDEyOCwgMHg4YzgyMDAwNCwgMHgyYzQyMDAxMSwgMHg1MDQwMDAxMywKLTB4YWM4MDAwMDAsIDB4ODAwMjJjNCwgMHgwLCAweDhlZTI0ZTMwLAotMHgyNDAzMDA0MCwgMHgyNDQyMDAwMSwgMHg1MDQzMDAwMywgMHgxMDIxLAotMHg4ZWUyNGUzMCwgMHgyNDQyMDAwMSwgMHhhZWUyNGUzMCwgMHg4ZWUyNGUzMCwKLTB4MjEwYzAsIDB4MjQ0MjUwMzgsIDB4MmUyMjAyMSwgMHgyNDAyMDAxMiwKLTB4YWM4MjAwMDAsIDB4MjQwMjAwMDEsIDB4YWM4MjAwMDQsIDB4MTRlMDAwMWIsCi0weDAsIDB4M2MwNDAwMDEsIDB4MjQ4NDUzZmMsIDB4YWZhMDAwMTAsCi0weGFmYTAwMDE0LCAweDhlZTYwNjA4LCAweDhmNDcwMjI4LCAweDNjMDUwMDA5LAotMHhjMDAyNDAzLCAweDM0YTVmMDAxLCAweDhlZTIwMWIwLCAweDI0NDIwMDAxLAotMHhhZWUyMDFiMCwgMHg4MDAyMmUwLCAweDhlZTIwMWIwLCAweDNjMDQwMDAxLAotMHgyNDg0NTQwOCwgMHhhZmEwMDAxNCwgMHg4ZWU2MDYwOCwgMHg4ZjQ3MDIyOCwKLTB4M2MwNTAwMDksIDB4YzAwMjQwMywgMHgzNGE1ZjAwNSwgMHg4ZWUyMDFhYywKLTB4MjQ0MjAwMDEsIDB4YWVlMjAxYWMsIDB4OGVlMjAxYWMsIDB4OGVlMjAxNTAsCi0weDI0NDIwMDAxLCAweGFlZTIwMTUwLCAweDhlZTIwMTUwLCAweDhlZTIwMTYwLAotMHgyNDQyMDAwMSwgMHhhZWUyMDE2MCwgMHg4ZWUyMDE2MCwgMHg4ZjQzMDIyYywKLTB4OGY0MjAxMGMsIDB4MTQ2MjAwMDksIDB4MjQwMjAwMDIsIDB4YWY4MjAwNjQsCi0weDhmODIwMDY0LCAweDE0NDAwMDA1LCAweDAsIDB4OGY0MzAyMmMsCi0weDhmNDIwMTBjLCAweDE0NjJmODc1LCAweDAsIDB4OGZiZjAwNDQsCi0weDhmYjYwMDQwLCAweDhmYjUwMDNjLCAweDhmYjQwMDM4LCAweDhmYjMwMDM0LAotMHg4ZmIyMDAzMCwgMHg4ZmIxMDAyYywgMHg4ZmIwMDAyOCwgMHgzZTAwMDA4LAotMHgyN2JkMDA0OCwgMHgyN2JkZmZmOCwgMHgyNDA4ZmZmZiwgMHgxMGEwMDAxNCwKLTB4NDgyMSwgMHgzYzBhZWRiOCwgMHgzNTRhODMyMCwgMHg5MDg3MDAwMCwKLTB4MjQ4NDAwMDEsIDB4MzAyMSwgMHgxMDcxMDI2LCAweDMwNDIwMDAxLAotMHgxMDQwMDAwMiwgMHg4MTg0MiwgMHg2YTE4MjYsIDB4NjA0MDIxLAotMHgyNGM2MDAwMSwgMHgyY2MyMDAwOCwgMHgxNDQwZmZmNywgMHg3Mzg0MiwKLTB4MjUyOTAwMDEsIDB4MTI1MTAyYiwgMHgxNDQwZmZmMCwgMHgwLAotMHgxMDAxMDIxLCAweDNlMDAwMDgsIDB4MjdiZDAwMDgsIDB4MjdiZGZmZTgsCi0weDI3NjQyODAwLCAweGFmYmYwMDEwLCAweGMwMDI0ODgsIDB4MjQwNTEwMDAsCi0weDI0MDIwMDIxLCAweGFmODAwMTAwLCAweGFmODAwMTA0LCAweGFmODAwMTA4LAotMHhhZjgwMDExMCwgMHhhZjgwMDExNCwgMHhhZjgwMDExOCwgMHhhZjgwMDEyMCwKLTB4YWY4MDAxMjQsIDB4YWY4MDAxMjgsIDB4YWY4MDAxMzAsIDB4YWY4MDAxMzQsCi0weGFmODAwMTM4LCAweGFlZTA0ZTI4LCAweGFlZTA0ZTJjLCAweGFlZTA0ZTMwLAotMHhhZWUwNGUzNCwgMHhhZjgyMDExYywgMHg4ZjQyMDIxOCwgMHgzMDQyMDA0MCwKLTB4MTA0MDAwMDQsIDB4MCwgMHg4ZjgyMDExYywgMHgzNDQyMDAwNCwKLTB4YWY4MjAxMWMsIDB4OGZiZjAwMTAsIDB4M2UwMDAwOCwgMHgyN2JkMDAxOCwKLTB4MjdiZGZmZTAsIDB4YWZiZjAwMTgsIDB4OGY4MjAxMDQsIDB4YWZhMjAwMTAsCi0weDhmODIwMTAwLCAweDNjMDUwMDAyLCAweGFmYTIwMDE0LCAweDhmODYwMGIwLAotMHg4Zjg3MDExYywgMHgzYzA0MDAwMSwgMHgyNDg0NTRjMCwgMHhjMDAyNDAzLAotMHgzNGE1ZjAwMCwgMHg4ZjgzMDBiMCwgMHgzYzAyN2YwMCwgMHg2MjE4MjQsCi0weDNjMDIwNDAwLCAweDEwNjIwMDI5LCAweDQzMTAyYiwgMHgxNDQwMDAwOCwKLTB4M2MwMjIwMDAsIDB4M2MwMjAxMDAsIDB4MTA2MjAwMjQsIDB4M2MwMjAyMDAsCi0weDEwNjIwMDExLCAweDAsIDB4ODAwMjM3NCwgMHgwLAotMHgxMDYyMDAwOCwgMHgzYzAyNDAwMCwgMHgxNDYyMDAxYywgMHgwLAotMHg4ZWUyMDE5MCwgMHgyNDQyMDAwMSwgMHhhZWUyMDE5MCwgMHg4MDAyMzc0LAotMHg4ZWUyMDE5MCwgMHg4ZWUyMDE4YywgMHgyNDQyMDAwMSwgMHhhZWUyMDE4YywKLTB4ODAwMjM3NCwgMHg4ZWUyMDE4YywgMHg4ZjgyMDExYywgMHgzNDQyMDAwMiwKLTB4YWY4MjAxMWMsIDB4OGY4MzAxMDQsIDB4OGY4MjAwYjAsIDB4MzQ0MjAwMDEsCi0weGFmODIwMGIwLCAweGFmODMwMTA0LCAweDhmODIwMTFjLCAweDI0MDNmZmZkLAotMHg0MzEwMjQsIDB4YWY4MjAxMWMsIDB4OGVlMjAxYTAsIDB4MjQ0MjAwMDEsCi0weGFlZTIwMWEwLCAweDgwMDIzNzcsIDB4OGVlMjAxYTAsIDB4OGY4MjAwYjAsCi0weDM0NDIwMDAxLCAweGFmODIwMGIwLCAweDhmYmYwMDE4LCAweDNlMDAwMDgsCi0weDI3YmQwMDIwLCAweDI3YmRmZmUwLCAweGFmYmYwMDFjLCAweGFmYjAwMDE4LAotMHg4ZjgyMDEyMCwgMHhhZmEyMDAxMCwgMHg4ZjgyMDEyNCwgMHgzYzA1MDAwMSwKLTB4YWZhMjAwMTQsIDB4OGY4NjAwYTAsIDB4OGY4NzAxMWMsIDB4M2MwNDAwMDEsCi0weDI0ODQ1NGNjLCAweGMwMDI0MDMsIDB4MzRhNWYwMDAsIDB4OGY4MzAwYTAsCi0weDNjMDI3ZjAwLCAweDYyMTgyNCwgMHgzYzAyMDQwMCwgMHgxMDYyMDA1MywKLTB4ODAyMSwgMHg0MzEwMmIsIDB4MTQ0MDAwMDgsIDB4M2MwNDIwMDAsCi0weDNjMDIwMTAwLCAweDEwNjIwMDRkLCAweDNjMDIwMjAwLCAweDEwNjIwMDNhLAotMHgwLCAweDgwMDIzZTAsIDB4MCwgMHgxMDY0MDAwMywKLTB4M2MwMjQwMDAsIDB4MTQ2MjAwNDUsIDB4MCwgMHg4ZjgyMDBhMCwKLTB4NDQxMDI0LCAweDEwNDAwMDA2LCAweDAsIDB4OGVlMjAxOTQsCi0weDI0NDIwMDAxLCAweGFlZTIwMTk0LCAweDgwMDIzYTksIDB4OGVlMjAxOTQsCi0weDhlZTIwMTk4LCAweDI0NDIwMDAxLCAweGFlZTIwMTk4LCAweDhlZTIwMTk4LAotMHg4ZjgyMDExYywgMHgzNDQyMDAwMiwgMHhhZjgyMDExYywgMHg4ZjgyMDExYywKLTB4MzA0MjAyMDAsIDB4MTA0MDAwMWIsIDB4MCwgMHg4ZjgzMDBhMCwKLTB4OGY4NDAxMjQsIDB4OGY4MjAwYWMsIDB4MTQ0MDAwMDcsIDB4MjQwMjAwMDEsCi0weDNjMDIwMDAxLCAweDM0NDJmMDAwLCAweDYyMTAyNCwgMHg1MDQwMDAwMSwKLTB4MjQxMDAwMDEsIDB4MjQwMjAwMDEsIDB4MTIwMDAwMGQsIDB4YWY4MjAwYTAsCi0weDhmODIwMTI0LCAweDI0NDJmZmUwLCAweGFmODIwMTI0LCAweDhmODIwMTI0LAotMHg4ZjgyMDEyNCwgMHgyNzYzMzAwMCwgMHg0MzEwMmIsIDB4MTA0MDAwMDUsCi0weDI3NjIzN2UwLCAweGFmODIwMTI0LCAweDgwMDIzY2EsIDB4MCwKLTB4YWY4NDAxMjQsIDB4OGY4MjAxMWMsIDB4MjQwM2ZmZmQsIDB4NDMxMDI0LAotMHg4MDAyM2UzLCAweGFmODIwMTFjLCAweDhmODIwMTFjLCAweDM0NDIwMDAyLAotMHhhZjgyMDExYywgMHg4ZjgzMDEyNCwgMHg4ZjgyMDBhMCwgMHgzNDQyMDAwMSwKLTB4YWY4MjAwYTAsIDB4YWY4MzAxMjQsIDB4OGY4MjAxMWMsIDB4MjQwM2ZmZmQsCi0weDQzMTAyNCwgMHhhZjgyMDExYywgMHg4ZWUyMDE5YywgMHgyNDQyMDAwMSwKLTB4YWVlMjAxOWMsIDB4ODAwMjNlMywgMHg4ZWUyMDE5YywgMHg4ZjgyMDBhMCwKLTB4MzQ0MjAwMDEsIDB4YWY4MjAwYTAsIDB4OGZiZjAwMWMsIDB4OGZiMDAwMTgsCi0weDNlMDAwMDgsIDB4MjdiZDAwMjAsIDB4MCwgMHgzYzAyMDAwMSwKLTB4OGM0MjVjNTgsIDB4MjdiZGZmZTgsIDB4YWZiZjAwMTQsIDB4MTQ0MDAwMTIsCi0weGFmYjAwMDEwLCAweDNjMTAwMDAxLCAweDI2MTA1ZGQwLCAweDIwMDIwMjEsCi0weGMwMDI0ODgsIDB4MjQwNTIwMDAsIDB4MjYwMjFmZTAsIDB4M2MwMTAwMDEsCi0weGFjMjI1ZDk0LCAweDNjMDEwMDAxLCAweGFjMjI1ZDkwLCAweGFmNDIwMjUwLAotMHgyNDAyMjAwMCwgMHhhZjUwMDI1NCwgMHhhZjQyMDI1OCwgMHgyNDAyMDAwMSwKLTB4M2MwMTAwMDEsIDB4YWMyMjVjNTgsIDB4OGZiZjAwMTQsIDB4OGZiMDAwMTAsCi0weDNlMDAwMDgsIDB4MjdiZDAwMTgsIDB4M2MwMzAwMDEsIDB4OGM2MzVkOTQsCi0weDhjODIwMDAwLCAweDhmYTgwMDEwLCAweDhmYTkwMDE0LCAweGFjNjIwMDAwLAotMHgzYzAyMDAwMSwgMHg4YzQyNWQ5NCwgMHg4YzgzMDAwNCwgMHhhYzQzMDAwNCwKLTB4YWM0NTAwMDgsIDB4OGY4NDAwNTQsIDB4MjQ0M2ZmZTAsIDB4YWM0NjAwMTAsCi0weGFjNDcwMDE0LCAweGFjNDgwMDE4LCAweGFjNDkwMDFjLCAweDNjMDEwMDAxLAotMHhhYzIzNWQ5NCwgMHhhYzQ0MDAwYywgMHgzYzAyMDAwMSwgMHgyNDQyNWRkMCwKLTB4NjIxODJiLCAweDEwNjAwMDA1LCAweDAsIDB4M2MwMjAwMDEsCi0weDhjNDI1ZDkwLCAweDNjMDEwMDAxLCAweGFjMjI1ZDk0LCAweDNjMDMwMDAxLAotMHg4YzYzNWQ5NCwgMHgzYzAyMDAwMSwgMHg4YzQyNWM0MCwgMHhhYzYyMDAwMCwKLTB4M2MwMzAwMDEsIDB4OGM2MzVkOTQsIDB4M2MwMjAwMDEsIDB4OGM0MjVjNDAsCi0weGFjNjIwMDA0LCAweDNlMDAwMDgsIDB4YWY0MzAyNTAsIDB4M2MwMzAwMDEsCi0weDhjNjM1ZDk0LCAweDNjMDIwMDAxLCAweDhjNDI1YzQwLCAweDI3YmRmZmQwLAotMHhhZmI0MDAyMCwgMHg4ZmI0MDA0MCwgMHhhZmIwMDAxMCwgMHg4MDgwMjEsCi0weGFmYjUwMDI0LCAweDhmYjUwMDQ0LCAweDhmYTQwMDQ4LCAweGFmYjEwMDE0LAotMHhhMDg4MjEsIDB4YWZiZjAwMjgsIDB4YWZiMzAwMWMsIDB4YWZiMjAwMTgsCi0weGFjNjIwMDAwLCAweDNjMDUwMDAxLCAweDhjYTU1ZDk0LCAweDNjMDIwMDAxLAotMHg4YzQyNWM0MCwgMHhjMDkwMjEsIDB4ZTA5ODIxLCAweDEwODAwMDA2LAotMHhhY2EyMDAwNCwgMHgyNGE1MDAwOCwgMHhjMDAyNDkwLCAweDI0MDYwMDE4LAotMHg4MDAyNDRlLCAweDAsIDB4MjRhNDAwMDgsIDB4YzAwMjQ4OCwKLTB4MjQwNTAwMTgsIDB4M2MwMjAwMDEsIDB4OGM0MjVkOTQsIDB4M2MwNTAwMDEsCi0weDI0YTU1ZGQwLCAweDI0NDJmZmUwLCAweDNjMDEwMDAxLCAweGFjMjI1ZDk0LAotMHg0NTEwMmIsIDB4MTA0MDAwMDUsIDB4MCwgMHgzYzAyMDAwMSwKLTB4OGM0MjVkOTAsIDB4M2MwMTAwMDEsIDB4YWMyMjVkOTQsIDB4M2MwMzAwMDEsCi0weDhjNjM1ZDk0LCAweDhlMDIwMDAwLCAweGFjNjIwMDAwLCAweDNjMDMwMDAxLAotMHg4YzYzNWQ5NCwgMHg4ZTAyMDAwNCwgMHhhYzYyMDAwNCwgMHhhYzcxMDAwOCwKLTB4OGY4NDAwNTQsIDB4MjQ2MmZmZTAsIDB4M2MwMTAwMDEsIDB4YWMyMjVkOTQsCi0weDQ1MTAyYiwgMHhhYzcyMDAxMCwgMHhhYzczMDAxNCwgMHhhYzc0MDAxOCwKLTB4YWM3NTAwMWMsIDB4MTA0MDAwMDUsIDB4YWM2NDAwMGMsIDB4M2MwMjAwMDEsCi0weDhjNDI1ZDkwLCAweDNjMDEwMDAxLCAweGFjMjI1ZDk0LCAweDNjMDMwMDAxLAotMHg4YzYzNWQ5NCwgMHgzYzAyMDAwMSwgMHg4YzQyNWM0MCwgMHhhYzYyMDAwMCwKLTB4M2MwMzAwMDEsIDB4OGM2MzVkOTQsIDB4M2MwMjAwMDEsIDB4OGM0MjVjNDAsCi0weGFjNjIwMDA0LCAweGFmNDMwMjUwLCAweDhmYmYwMDI4LCAweDhmYjUwMDI0LAotMHg4ZmI0MDAyMCwgMHg4ZmIzMDAxYywgMHg4ZmIyMDAxOCwgMHg4ZmIxMDAxNCwKLTB4OGZiMDAwMTAsIDB4M2UwMDAwOCwgMHgyN2JkMDAzMCwgMHgxMGEwMDAwNSwKLTB4MCwgMHhhYzgwMDAwMCwgMHgyNGE1ZmZmYywgMHgxNGEwZmZmZCwKLTB4MjQ4NDAwMDQsIDB4M2UwMDAwOCwgMHgwLCAweDEwYzAwMDA3LAotMHgwLCAweDhjODIwMDAwLCAweDI0ODQwMDA0LCAweDI0YzZmZmZjLAotMHhhY2EyMDAwMCwgMHgxNGMwZmZmYiwgMHgyNGE1MDAwNCwgMHgzZTAwMDA4LAotMHgwLCAweDEwYzAwMDA3LCAweDAsIDB4OGNhMjAwMDAsCi0weDI0YTUwMDA0LCAweDI0YzZmZmZjLCAweGFjODIwMDAwLCAweDE0YzBmZmZiLAotMHgyNDg0MDAwNCwgMHgzZTAwMDA4LCAweDAsIDB4M2UwMDAwOCwKLTB4MCwgMHgyN2JkZmZkOCwgMHhhZmJmMDAyMCwgMHg4ZWUzMDRlNCwKLTB4OGVlMjA0ZTAsIDB4MTA2MjA0MzYsIDB4MCwgMHg4ZWUyMDRlNCwKLTB4OGVlMzA0ZmMsIDB4MjExMDAsIDB4NjI2MDIxLCAweDk1ODcwMDA4LAotMHg4ZDhhMDAwMCwgMHg4ZDhiMDAwNCwgMHg5NThkMDAwYSwgMHg4ZWUyNzI1YywKLTB4OGVlMzcyNmMsIDB4MzBlNGZmZmYsIDB4NDQxMDIxLCAweDYyMTgyYiwKLTB4MTA2MDAwMTUsIDB4MzFhMjAwMDQsIDB4OGY4MjAwZDgsIDB4OGVlMzcyNTgsCi0weDQzMTAyMywgMHhhZWUyNzI2YywgMHg4ZWUyNzI2YywgMHgxYzQwMDAwMywKLTB4M2MwMzAwMDEsIDB4NDMxMDIxLCAweGFlZTI3MjZjLCAweDhlZTI3MjVjLAotMHg4ZWUzNzI2YywgMHg0NDEwMjEsIDB4NjIxODJiLCAweDEwNjAwMDA2LAotMHgzMWEyMDAwNCwgMHg4ZWUyMDFiOCwgMHgyNDQyMDAwMSwgMHhhZWUyMDFiOCwKLTB4ODAwMjhlMSwgMHg4ZWUyMDFiOCwgMHgxMDQwMDI0MCwgMHgzMWEyMDIwMCwKLTB4MTA0MDAxNGQsIDB4NDgyMSwgMHg5NmUyMDQ1YSwgMHgzMDQyMDAxMCwKLTB4MTA0MDAxNDksIDB4MCwgMHg4Zjg0MDEwMCwgMHgyNzYyMzAwMCwKLTB4MjQ4NTAwMjAsIDB4YTIxMDJiLCAweDUwNDAwMDAxLCAweDI3NjUyODAwLAotMHg4ZjgyMDEwOCwgMHgxMGEyMDAwNCwgMHgwLCAweDhmODIwMTA0LAotMHgxNGEyMDAwNiwgMHgyNDAyMDAwYywgMHg4ZWUyMDFhOCwgMHgyNDQyMDAwMSwKLTB4YWVlMjAxYTgsIDB4ODAwMjUyYywgMHg4ZWUyMDFhOCwgMHhhYzhhMDAwMCwKLTB4YWM4YjAwMDQsIDB4OGVlMzcyNjQsIDB4MjQwNjAwMDUsIDB4YTQ4MjAwMGUsCi0weGFjODYwMDE4LCAweGFjODMwMDA4LCAweDhlZTIwNGU0LCAweGFjODIwMDFjLAotMHg4ZWUyMDRjOCwgMHhhYzgyMDAxMCwgMHhhZjg1MDEwMCwgMHg5MmUyMDRlYywKLTB4MTQ0MDAwMzYsIDB4MjQwOTAwMDEsIDB4OGVlMjRlMjgsIDB4MjEwYzAsCi0weDI0NDI0ZTM4LCAweDJlMjIwMjEsIDB4OGM4MjAwMDAsIDB4MTQ0NjAwMWYsCi0weDAsIDB4OGVlMzRlMjgsIDB4OGVlMjRlMmMsIDB4MTA2MjAwMWIsCi0weDI0MDMwMDQwLCAweDhjODIwMDA0LCAweDI0NDIwMDAxLCAweGFjODIwMDA0LAotMHg4ZWUyNGUyYywgMHg4ZWU1NGUyOCwgMHgyNDQyMDAwMSwgMHgxMDQzMDAwNywKLTB4MCwgMHg4ZWUyNGUyYywgMHgyNDQyMDAwMSwgMHgxMGEyMDAwNSwKLTB4MCwgMHg4MDAyNTE2LCAweDAsIDB4MTRhMDAwMDUsCi0weDAsIDB4OGY4MjAxMDgsIDB4MjQ0MjAwMjAsIDB4YWY4MjAxMDgsCi0weDhmODIwMTA4LCAweDhjODIwMDA0LCAweDJjNDIwMDExLCAweDUwNDAwMDEzLAotMHhhYzgwMDAwMCwgMHg4MDAyNTJjLCAweDAsIDB4OGVlMjRlMjgsCi0weDI0MDMwMDQwLCAweDI0NDIwMDAxLCAweDUwNDMwMDAzLCAweDEwMjEsCi0weDhlZTI0ZTI4LCAweDI0NDIwMDAxLCAweGFlZTI0ZTI4LCAweDhlZTI0ZTI4LAotMHgyMTBjMCwgMHgyNDQyNGUzOCwgMHgyZTIyMDIxLCAweDI0MDIwMDA1LAotMHhhYzgyMDAwMCwgMHgyNDAyMDAwMSwgMHhhYzgyMDAwNCwgMHgxNTIwMDAwYSwKLTB4M2MwNDAwMDEsIDB4YWZhYjAwMTAsIDB4OGVlMjcyNjQsIDB4M2MwNDAwMDEsCi0weDI0ODQ1NzMwLCAweDNjMDUwMDA0LCAweGFmYTIwMDE0LCAweDhlZTYwNGU0LAotMHg4MDAyOGJlLCAweDM0YTVmMTE0LCAweDhlZTI3MjY0LCAweDM0ODQzODAwLAotMHgzNjQxODIxLCAweDI0NDIwMDEwLCAweDQzMTAyYiwgMHgxNDQwMDA3MywKLTB4MCwgMHg4ZWUyNzI2NCwgMHgyNDQ4MDAxMCwgMHgzNjQxMDIxLAotMHgxMDIxMDJiLCAweDE0NDAwMDAyLCAweDNjMDJmZmZmLCAweDEwMjQwMjEsCi0weDhmODUwMTAwLCAweDI3NjIzMDAwLCAweDI0YTYwMDIwLCAweGMyMTAyYiwKLTB4NTA0MDAwMDEsIDB4Mjc2NjI4MDAsIDB4OGY4MjAxMDgsIDB4MTBjMjAwMDQsCi0weDAsIDB4OGY4MjAxMDQsIDB4MTRjMjAwMDcsIDB4MjU2MzAwMGMsCi0weDhlZTIwMWE4LCAweDQ4MjEsIDB4MjQ0MjAwMDEsIDB4YWVlMjAxYTgsCi0weDgwMDI1YTAsIDB4OGVlMjAxYTgsIDB4MmM2NDAwMGMsIDB4MTQ0MTAyMSwKLTB4YWNhMjAwMDAsIDB4YWNhMzAwMDQsIDB4MjRlMmZmZjQsIDB4YTRhMjAwMGUsCi0weDI0MDIwMDA2LCAweGFjYTgwMDA4LCAweGFjYTIwMDE4LCAweDhlZTIwNGU0LAotMHhhY2EyMDAxYywgMHg4ZWUyMDRjOCwgMHgzYzAzMDAwMiwgMHg0MzEwMjUsCi0weGFjYTIwMDEwLCAweGFmODYwMTAwLCAweDkyZTIwNGVjLCAweDE0NDAwMDM3LAotMHgyNDA5MDAwMSwgMHg4ZWUyNGUyOCwgMHgyMTBjMCwgMHgyNDQyNGUzOCwKLTB4MmUyMjAyMSwgMHg4YzgzMDAwMCwgMHgyNDAyMDAwNSwgMHgxNDYyMDAxZiwKLTB4MCwgMHg4ZWUzNGUyOCwgMHg4ZWUyNGUyYywgMHgxMDYyMDAxYiwKLTB4MjQwMzAwNDAsIDB4OGM4MjAwMDQsIDB4MjQ0MjAwMDEsIDB4YWM4MjAwMDQsCi0weDhlZTI0ZTJjLCAweDhlZTU0ZTI4LCAweDI0NDIwMDAxLCAweDEwNDMwMDA3LAotMHgwLCAweDhlZTI0ZTJjLCAweDI0NDIwMDAxLCAweDEwYTIwMDA1LAotMHgwLCAweDgwMDI1OGEsIDB4MCwgMHgxNGEwMDAwNSwKLTB4MCwgMHg4ZjgyMDEwOCwgMHgyNDQyMDAyMCwgMHhhZjgyMDEwOCwKLTB4OGY4MjAxMDgsIDB4OGM4MjAwMDQsIDB4MmM0MjAwMTEsIDB4NTA0MDAwMTMsCi0weGFjODAwMDAwLCAweDgwMDI1YTAsIDB4MCwgMHg4ZWUyNGUyOCwKLTB4MjQwMzAwNDAsIDB4MjQ0MjAwMDEsIDB4NTA0MzAwMDMsIDB4MTAyMSwKLTB4OGVlMjRlMjgsIDB4MjQ0MjAwMDEsIDB4YWVlMjRlMjgsIDB4OGVlMjRlMjgsCi0weDIxMGMwLCAweDI0NDI0ZTM4LCAweDJlMjIwMjEsIDB4MjQwMjAwMDUsCi0weGFjODIwMDAwLCAweDI0MDIwMDAxLCAweGFjODIwMDA0LCAweDE1MjAwMDBhLAotMHgyNTA4ZmZmYywgMHhhZmFiMDAxMCwgMHg4ZWUyNzI2NCwgMHgzYzA0MDAwMSwKLTB4MjQ4NDU3MzAsIDB4M2MwNTAwMDQsIDB4YWZhMjAwMTQsIDB4OGVlNjA0ZTQsCi0weDgwMDI4YmUsIDB4MzRhNWYxMjUsIDB4MzQwMjgxMDAsIDB4YTUwMjAwMDAsCi0weDk1ODIwMDBlLCAweDgwMDI2MWQsIDB4YTUwMjAwMDIsIDB4OGY4NTAxMDAsCi0weDI3NjIzMDAwLCAweDI0YTYwMDIwLCAweGMyMTAyYiwgMHg1MDQwMDAwMSwKLTB4Mjc2NjI4MDAsIDB4OGY4MjAxMDgsIDB4MTBjMjAwMDQsIDB4MCwKLTB4OGY4MjAxMDQsIDB4MTRjMjAwMDcsIDB4MjU2MzAwMGMsIDB4OGVlMjAxYTgsCi0weDQ4MjEsIDB4MjQ0MjAwMDEsIDB4YWVlMjAxYTgsIDB4ODAwMjYwZCwKLTB4OGVlMjAxYTgsIDB4MmM2NDAwMGMsIDB4MTQ0MTAyMSwgMHhhY2EyMDAwMCwKLTB4YWNhMzAwMDQsIDB4OGVlMzcyNjQsIDB4MjRlMmZmZjQsIDB4YTRhMjAwMGUsCi0weDI0MDIwMDA2LCAweGFjYTIwMDE4LCAweDI0NjMwMDEwLCAweGFjYTMwMDA4LAotMHg4ZWUyMDRlNCwgMHhhY2EyMDAxYywgMHg4ZWUyMDRjOCwgMHgzYzAzMDAwMiwKLTB4NDMxMDI1LCAweGFjYTIwMDEwLCAweGFmODYwMTAwLCAweDkyZTIwNGVjLAotMHgxNDQwMDAzNywgMHgyNDA5MDAwMSwgMHg4ZWUyNGUyOCwgMHgyMTBjMCwKLTB4MjQ0MjRlMzgsIDB4MmUyMjAyMSwgMHg4YzgzMDAwMCwgMHgyNDAyMDAwNSwKLTB4MTQ2MjAwMWYsIDB4MCwgMHg4ZWUzNGUyOCwgMHg4ZWUyNGUyYywKLTB4MTA2MjAwMWIsIDB4MjQwMzAwNDAsIDB4OGM4MjAwMDQsIDB4MjQ0MjAwMDEsCi0weGFjODIwMDA0LCAweDhlZTI0ZTJjLCAweDhlZTU0ZTI4LCAweDI0NDIwMDAxLAotMHgxMDQzMDAwNywgMHgwLCAweDhlZTI0ZTJjLCAweDI0NDIwMDAxLAotMHgxMGEyMDAwNSwgMHgwLCAweDgwMDI1ZjcsIDB4MCwKLTB4MTRhMDAwMDUsIDB4MCwgMHg4ZjgyMDEwOCwgMHgyNDQyMDAyMCwKLTB4YWY4MjAxMDgsIDB4OGY4MjAxMDgsIDB4OGM4MjAwMDQsIDB4MmM0MjAwMTEsCi0weDUwNDAwMDEzLCAweGFjODAwMDAwLCAweDgwMDI2MGQsIDB4MCwKLTB4OGVlMjRlMjgsIDB4MjQwMzAwNDAsIDB4MjQ0MjAwMDEsIDB4NTA0MzAwMDMsCi0weDEwMjEsIDB4OGVlMjRlMjgsIDB4MjQ0MjAwMDEsIDB4YWVlMjRlMjgsCi0weDhlZTI0ZTI4LCAweDIxMGMwLCAweDI0NDI0ZTM4LCAweDJlMjIwMjEsCi0weDI0MDIwMDA1LCAweGFjODIwMDAwLCAweDI0MDIwMDAxLCAweGFjODIwMDA0LAotMHgxNTIwMDAwYSwgMHgzNDAyODEwMCwgMHhhZmFiMDAxMCwgMHg4ZWUyNzI2NCwKLTB4M2MwNDAwMDEsIDB4MjQ4NDU3MzAsIDB4M2MwNTAwMDQsIDB4YWZhMjAwMTQsCi0weDhlZTYwNGU0LCAweDgwMDI4YmUsIDB4MzRhNWYwMTUsIDB4OGVlMzcyNjQsCi0weGE0NjIwMDBjLCAweDhlZTM3MjY0LCAweDk1ODIwMDBlLCAweGE0NjIwMDBlLAotMHg4MDAyNjgxLCAweDI0ZTcwMDA0LCAweDhmODQwMTAwLCAweDI3NjIzMDAwLAotMHgyNDg1MDAyMCwgMHhhMjEwMmIsIDB4NTA0MDAwMDEsIDB4Mjc2NTI4MDAsCi0weDhmODIwMTA4LCAweDEwYTIwMDA0LCAweDAsIDB4OGY4MjAxMDQsCi0weDE0YTIwMDA3LCAweDI0MDIwMDA2LCAweDhlZTIwMWE4LCAweDQ4MjEsCi0weDI0NDIwMDAxLCAweGFlZTIwMWE4LCAweDgwMDI2NzcsIDB4OGVlMjAxYTgsCi0weGFjOGEwMDAwLCAweGFjOGIwMDA0LCAweDhlZTM3MjY0LCAweGE0ODcwMDBlLAotMHhhYzgyMDAxOCwgMHhhYzgzMDAwOCwgMHg4ZWUyMDRlNCwgMHhhYzgyMDAxYywKLTB4OGVlMjA0YzgsIDB4M2MwMzAwMDIsIDB4NDMxMDI1LCAweGFjODIwMDEwLAotMHhhZjg1MDEwMCwgMHg5MmUyMDRlYywgMHgxNDQwMDAzNywgMHgyNDA5MDAwMSwKLTB4OGVlMjRlMjgsIDB4MjEwYzAsIDB4MjQ0MjRlMzgsIDB4MmUyMjAyMSwKLTB4OGM4MzAwMDAsIDB4MjQwMjAwMDUsIDB4MTQ2MjAwMWYsIDB4MCwKLTB4OGVlMzRlMjgsIDB4OGVlMjRlMmMsIDB4MTA2MjAwMWIsIDB4MjQwMzAwNDAsCi0weDhjODIwMDA0LCAweDI0NDIwMDAxLCAweGFjODIwMDA0LCAweDhlZTI0ZTJjLAotMHg4ZWU1NGUyOCwgMHgyNDQyMDAwMSwgMHgxMDQzMDAwNywgMHgwLAotMHg4ZWUyNGUyYywgMHgyNDQyMDAwMSwgMHgxMGEyMDAwNSwgMHgwLAotMHg4MDAyNjYxLCAweDAsIDB4MTRhMDAwMDUsIDB4MCwKLTB4OGY4MjAxMDgsIDB4MjQ0MjAwMjAsIDB4YWY4MjAxMDgsIDB4OGY4MjAxMDgsCi0weDhjODIwMDA0LCAweDJjNDIwMDExLCAweDUwNDAwMDEzLCAweGFjODAwMDAwLAotMHg4MDAyNjc3LCAweDAsIDB4OGVlMjRlMjgsIDB4MjQwMzAwNDAsCi0weDI0NDIwMDAxLCAweDUwNDMwMDAzLCAweDEwMjEsIDB4OGVlMjRlMjgsCi0weDI0NDIwMDAxLCAweGFlZTI0ZTI4LCAweDhlZTI0ZTI4LCAweDIxMGMwLAotMHgyNDQyNGUzOCwgMHgyZTIyMDIxLCAweDI0MDIwMDA1LCAweGFjODIwMDAwLAotMHgyNDAyMDAwMSwgMHhhYzgyMDAwNCwgMHgxNTIwMDAwOSwgMHgzYzA1MDAwNCwKLTB4YWZhYjAwMTAsIDB4OGVlMjcyNjQsIDB4M2MwNDAwMDEsIDB4MjQ4NDU3MzAsCi0weGFmYTIwMDE0LCAweDhlZTYwNGU0LCAweDgwMDI4YmUsIDB4MzRhNWYwMDQsCi0weDhlZTI3MjVjLCAweDMwZTdmZmZmLCAweDQ3MTAyMSwgMHhhZWUyNzI1YywKLTB4OGVlMjA0ZTQsIDB4OGVlMzA0ZmMsIDB4OGVlNDcyNTgsIDB4MjExMDAsCi0weDQzMTAyMSwgMHhhYzQ0MDAwYywgMHg4ZWUyNzI1OCwgMHhhZmEyMDAxOCwKLTB4OGVlMzcyNWMsIDB4YWZhMzAwMWMsIDB4OGVlMjcyNWMsIDB4MmM0MjAwM2MsCi0weDEwNDAwMDA0LCAweDI0NjIwMDAxLCAweDI0MDNmZmZlLCAweDQzMTAyNCwKLTB4YWZhMjAwMWMsIDB4OGVlMjcyNjQsIDB4M2MwNjAwMDEsIDB4MzRjNjM4MDAsCi0weDhlZTM3MjVjLCAweDI0MDVmZmY4LCAweDQ3MTAyMSwgMHgyNDQyMDAwNywKLTB4NDUxMDI0LCAweDI0NjMwMDA3LCAweGFlZTI3MjU4LCAweDhlZTI3MjZjLAotMHg4ZWU0NzI1OCwgMHg2NTE4MjQsIDB4NDMxMDIzLCAweGFlZTI3MjZjLAotMHgzNjYxMDIxLCAweDgyMjAyYiwgMHgxNDgwMDAwNCwgMHgzYzAzZmZmZiwKLTB4OGVlMjcyNTgsIDB4NDMxMDIxLCAweGFlZTI3MjU4LCAweDhlZTI3MjU4LAotMHhhZWUyNzI2NCwgMHg4ZjgyMDBmMCwgMHgyNDQ3MDAwOCwgMHgyNzYyMTgwMCwKLTB4ZTIxMDJiLCAweDUwNDAwMDAxLCAweDI3NjcxMDAwLCAweDhmODIwMGY0LAotMHgxNGUyMDAwNywgMHgwLCAweDhlZTIwMWI0LCAweDQ4MjEsCi0weDI0NDIwMDAxLCAweGFlZTIwMWI0LCAweDgwMDI2YzQsIDB4OGVlMjAxYjQsCi0weDhmODIwMGYwLCAweDI0MDkwMDAxLCAweDhmYTMwMDE4LCAweDhmYTQwMDFjLAotMHhhYzQzMDAwMCwgMHhhYzQ0MDAwNCwgMHhhZjg3MDBmMCwgMHgxNTIwMDAxMiwKLTB4ZDExNDIsIDB4OGY4MjAwZjAsIDB4YWZhMjAwMTAsIDB4OGY4MjAwZjQsCi0weDNjMDQwMDAxLCAweDI0ODQ1NzNjLCAweGFmYTIwMDE0LCAweDhmYTYwMDE4LAotMHg4ZmE3MDAxYywgMHgzYzA1MDAwNCwgMHhjMDAyNDAzLCAweDM0YTVmMDA1LAotMHg4ZWUyMDA4OCwgMHgyNDQyMDAwMSwgMHhhZWUyMDA4OCwgMHg4ZWUyMDA4OCwKLTB4ODAwMjhkMywgMHhhZWUwNzI1YywgMHgzMDQzMDAwMywgMHgyNDAyMDAwMiwKLTB4MTA2MjAwMTYsIDB4Mjg2MjAwMDMsIDB4MTA0MDAwMDUsIDB4MjQwMjAwMDEsCi0weDEwNjIwMDA4LCAweDAsIDB4ODAwMjcwMywgMHgwLAotMHgyNDAyMDAwMywgMHgxMDYyMDAxNywgMHgwLCAweDgwMDI3MDMsCi0weDAsIDB4OGVlMjAwZTgsIDB4OGVlMzAwZWMsIDB4MjQ2MzAwMDEsCi0weDJjNjQwMDAxLCAweDQ0MTAyMSwgMHhhZWUyMDBlOCwgMHhhZWUzMDBlYywKLTB4OGVlMjAwZTgsIDB4ODAwMjcwMywgMHg4ZWUzMDBlYywgMHg4ZWUyMDBmMCwKLTB4OGVlMzAwZjQsIDB4MjQ2MzAwMDEsIDB4MmM2NDAwMDEsIDB4NDQxMDIxLAotMHhhZWUyMDBmMCwgMHhhZWUzMDBmNCwgMHg4ZWUyMDBmMCwgMHg4MDAyNzAzLAotMHg4ZWUzMDBmNCwgMHg4ZWUyMDBmOCwgMHg4ZWUzMDBmYywgMHgyNDYzMDAwMSwKLTB4MmM2NDAwMDEsIDB4NDQxMDIxLCAweGFlZTIwMGY4LCAweGFlZTMwMGZjLAotMHg4ZWUyMDBmOCwgMHg4ZWUzMDBmYywgMHg4ZWUyNzI1YywgMHg4ZWU0MDBlMCwKLTB4OGVlNTAwZTQsIDB4NDAxODIxLCAweDEwMjEsIDB4YTMyODIxLAotMHhhMzMwMmIsIDB4ODIyMDIxLCAweDg2MjAyMSwgMHhhZWU0MDBlMCwKLTB4YWVlNTAwZTQsIDB4ODAwMjhkMywgMHhhZWUwNzI1YywgMHgzMGUyZmZmZiwKLTB4MTA0MDAxYzEsIDB4MzFhMjAyMDAsIDB4MTA0MDAxNGQsIDB4NDgyMSwKLTB4OTZlMjA0NWEsIDB4MzA0MjAwMTAsIDB4MTA0MDAxNDksIDB4MCwKLTB4OGY4NDAxMDAsIDB4Mjc2MjMwMDAsIDB4MjQ4NTAwMjAsIDB4YTIxMDJiLAotMHg1MDQwMDAwMSwgMHgyNzY1MjgwMCwgMHg4ZjgyMDEwOCwgMHgxMGEyMDAwNCwKLTB4MCwgMHg4ZjgyMDEwNCwgMHgxNGEyMDAwNiwgMHgyNDAyMDAwYywKLTB4OGVlMjAxYTgsIDB4MjQ0MjAwMDEsIDB4YWVlMjAxYTgsIDB4ODAwMjc2ZSwKLTB4OGVlMjAxYTgsIDB4YWM4YTAwMDAsIDB4YWM4YjAwMDQsIDB4OGVlMzcyNjQsCi0weDI0MDYwMDA1LCAweGE0ODIwMDBlLCAweGFjODYwMDE4LCAweGFjODMwMDA4LAotMHg4ZWUyMDRlNCwgMHhhYzgyMDAxYywgMHg4ZWUyMDRjOCwgMHhhYzgyMDAxMCwKLTB4YWY4NTAxMDAsIDB4OTJlMjA0ZWMsIDB4MTQ0MDAwMzYsIDB4MjQwOTAwMDEsCi0weDhlZTI0ZTI4LCAweDIxMGMwLCAweDI0NDI0ZTM4LCAweDJlMjIwMjEsCi0weDhjODIwMDAwLCAweDE0NDYwMDFmLCAweDAsIDB4OGVlMzRlMjgsCi0weDhlZTI0ZTJjLCAweDEwNjIwMDFiLCAweDI0MDMwMDQwLCAweDhjODIwMDA0LAotMHgyNDQyMDAwMSwgMHhhYzgyMDAwNCwgMHg4ZWUyNGUyYywgMHg4ZWU1NGUyOCwKLTB4MjQ0MjAwMDEsIDB4MTA0MzAwMDcsIDB4MCwgMHg4ZWUyNGUyYywKLTB4MjQ0MjAwMDEsIDB4MTBhMjAwMDUsIDB4MCwgMHg4MDAyNzU4LAotMHgwLCAweDE0YTAwMDA1LCAweDAsIDB4OGY4MjAxMDgsCi0weDI0NDIwMDIwLCAweGFmODIwMTA4LCAweDhmODIwMTA4LCAweDhjODIwMDA0LAotMHgyYzQyMDAxMSwgMHg1MDQwMDAxMywgMHhhYzgwMDAwMCwgMHg4MDAyNzZlLAotMHgwLCAweDhlZTI0ZTI4LCAweDI0MDMwMDQwLCAweDI0NDIwMDAxLAotMHg1MDQzMDAwMywgMHgxMDIxLCAweDhlZTI0ZTI4LCAweDI0NDIwMDAxLAotMHhhZWUyNGUyOCwgMHg4ZWUyNGUyOCwgMHgyMTBjMCwgMHgyNDQyNGUzOCwKLTB4MmUyMjAyMSwgMHgyNDAyMDAwNSwgMHhhYzgyMDAwMCwgMHgyNDAyMDAwMSwKLTB4YWM4MjAwMDQsIDB4MTUyMDAwMGEsIDB4M2MwNDAwMDEsIDB4YWZhYjAwMTAsCi0weDhlZTI3MjY0LCAweDNjMDQwMDAxLCAweDI0ODQ1NzMwLCAweDNjMDUwMDA0LAotMHhhZmEyMDAxNCwgMHg4ZWU2MDRlNCwgMHg4MDAyOGJlLCAweDM0YTVmMDE0LAotMHg4ZWUyNzI2NCwgMHgzNDg0MzgwMCwgMHgzNjQxODIxLCAweDI0NDIwMDEwLAotMHg0MzEwMmIsIDB4MTQ0MDAwNzMsIDB4MCwgMHg4ZWUyNzI2NCwKLTB4MjQ0ODAwMTAsIDB4MzY0MTAyMSwgMHgxMDIxMDJiLCAweDE0NDAwMDAyLAotMHgzYzAyZmZmZiwgMHgxMDI0MDIxLCAweDhmODUwMTAwLCAweDI3NjIzMDAwLAotMHgyNGE2MDAyMCwgMHhjMjEwMmIsIDB4NTA0MDAwMDEsIDB4Mjc2NjI4MDAsCi0weDhmODIwMTA4LCAweDEwYzIwMDA0LCAweDAsIDB4OGY4MjAxMDQsCi0weDE0YzIwMDA3LCAweDI1NjMwMDBjLCAweDhlZTIwMWE4LCAweDQ4MjEsCi0weDI0NDIwMDAxLCAweGFlZTIwMWE4LCAweDgwMDI3ZTIsIDB4OGVlMjAxYTgsCi0weDJjNjQwMDBjLCAweDE0NDEwMjEsIDB4YWNhMjAwMDAsIDB4YWNhMzAwMDQsCi0weDI0ZTJmZmY0LCAweGE0YTIwMDBlLCAweDI0MDIwMDA2LCAweGFjYTgwMDA4LAotMHhhY2EyMDAxOCwgMHg4ZWUyMDRlNCwgMHhhY2EyMDAxYywgMHg4ZWUyMDRjOCwKLTB4M2MwMzAwMDIsIDB4NDMxMDI1LCAweGFjYTIwMDEwLCAweGFmODYwMTAwLAotMHg5MmUyMDRlYywgMHgxNDQwMDAzNywgMHgyNDA5MDAwMSwgMHg4ZWUyNGUyOCwKLTB4MjEwYzAsIDB4MjQ0MjRlMzgsIDB4MmUyMjAyMSwgMHg4YzgzMDAwMCwKLTB4MjQwMjAwMDUsIDB4MTQ2MjAwMWYsIDB4MCwgMHg4ZWUzNGUyOCwKLTB4OGVlMjRlMmMsIDB4MTA2MjAwMWIsIDB4MjQwMzAwNDAsIDB4OGM4MjAwMDQsCi0weDI0NDIwMDAxLCAweGFjODIwMDA0LCAweDhlZTI0ZTJjLCAweDhlZTU0ZTI4LAotMHgyNDQyMDAwMSwgMHgxMDQzMDAwNywgMHgwLCAweDhlZTI0ZTJjLAotMHgyNDQyMDAwMSwgMHgxMGEyMDAwNSwgMHgwLCAweDgwMDI3Y2MsCi0weDAsIDB4MTRhMDAwMDUsIDB4MCwgMHg4ZjgyMDEwOCwKLTB4MjQ0MjAwMjAsIDB4YWY4MjAxMDgsIDB4OGY4MjAxMDgsIDB4OGM4MjAwMDQsCi0weDJjNDIwMDExLCAweDUwNDAwMDEzLCAweGFjODAwMDAwLCAweDgwMDI3ZTIsCi0weDAsIDB4OGVlMjRlMjgsIDB4MjQwMzAwNDAsIDB4MjQ0MjAwMDEsCi0weDUwNDMwMDAzLCAweDEwMjEsIDB4OGVlMjRlMjgsIDB4MjQ0MjAwMDEsCi0weGFlZTI0ZTI4LCAweDhlZTI0ZTI4LCAweDIxMGMwLCAweDI0NDI0ZTM4LAotMHgyZTIyMDIxLCAweDI0MDIwMDA1LCAweGFjODIwMDAwLCAweDI0MDIwMDAxLAotMHhhYzgyMDAwNCwgMHgxNTIwMDAwYSwgMHgyNTA4ZmZmYywgMHhhZmFiMDAxMCwKLTB4OGVlMjcyNjQsIDB4M2MwNDAwMDEsIDB4MjQ4NDU3MzAsIDB4M2MwNTAwMDQsCi0weGFmYTIwMDE0LCAweDhlZTYwNGU0LCAweDgwMDI4YmUsIDB4MzRhNWYwMTUsCi0weDM0MDI4MTAwLCAweGE1MDIwMDAwLCAweDk1ODIwMDBlLCAweDgwMDI4NWYsCi0weGE1MDIwMDAyLCAweDhmODUwMTAwLCAweDI3NjIzMDAwLCAweDI0YTYwMDIwLAotMHhjMjEwMmIsIDB4NTA0MDAwMDEsIDB4Mjc2NjI4MDAsIDB4OGY4MjAxMDgsCi0weDEwYzIwMDA0LCAweDAsIDB4OGY4MjAxMDQsIDB4MTRjMjAwMDcsCi0weDI1NjMwMDBjLCAweDhlZTIwMWE4LCAweDQ4MjEsIDB4MjQ0MjAwMDEsCi0weGFlZTIwMWE4LCAweDgwMDI4NGYsIDB4OGVlMjAxYTgsIDB4MmM2NDAwMGMsCi0weDE0NDEwMjEsIDB4YWNhMjAwMDAsIDB4YWNhMzAwMDQsIDB4OGVlMzcyNjQsCi0weDI0ZTJmZmY0LCAweGE0YTIwMDBlLCAweDI0MDIwMDA2LCAweGFjYTIwMDE4LAotMHgyNDYzMDAxMCwgMHhhY2EzMDAwOCwgMHg4ZWUyMDRlNCwgMHhhY2EyMDAxYywKLTB4OGVlMjA0YzgsIDB4M2MwMzAwMDIsIDB4NDMxMDI1LCAweGFjYTIwMDEwLAotMHhhZjg2MDEwMCwgMHg5MmUyMDRlYywgMHgxNDQwMDAzNywgMHgyNDA5MDAwMSwKLTB4OGVlMjRlMjgsIDB4MjEwYzAsIDB4MjQ0MjRlMzgsIDB4MmUyMjAyMSwKLTB4OGM4MzAwMDAsIDB4MjQwMjAwMDUsIDB4MTQ2MjAwMWYsIDB4MCwKLTB4OGVlMzRlMjgsIDB4OGVlMjRlMmMsIDB4MTA2MjAwMWIsIDB4MjQwMzAwNDAsCi0weDhjODIwMDA0LCAweDI0NDIwMDAxLCAweGFjODIwMDA0LCAweDhlZTI0ZTJjLAotMHg4ZWU1NGUyOCwgMHgyNDQyMDAwMSwgMHgxMDQzMDAwNywgMHgwLAotMHg4ZWUyNGUyYywgMHgyNDQyMDAwMSwgMHgxMGEyMDAwNSwgMHgwLAotMHg4MDAyODM5LCAweDAsIDB4MTRhMDAwMDUsIDB4MCwKLTB4OGY4MjAxMDgsIDB4MjQ0MjAwMjAsIDB4YWY4MjAxMDgsIDB4OGY4MjAxMDgsCi0weDhjODIwMDA0LCAweDJjNDIwMDExLCAweDUwNDAwMDEzLCAweGFjODAwMDAwLAotMHg4MDAyODRmLCAweDAsIDB4OGVlMjRlMjgsIDB4MjQwMzAwNDAsCi0weDI0NDIwMDAxLCAweDUwNDMwMDAzLCAweDEwMjEsIDB4OGVlMjRlMjgsCi0weDI0NDIwMDAxLCAweGFlZTI0ZTI4LCAweDhlZTI0ZTI4LCAweDIxMGMwLAotMHgyNDQyNGUzOCwgMHgyZTIyMDIxLCAweDI0MDIwMDA1LCAweGFjODIwMDAwLAotMHgyNDAyMDAwMSwgMHhhYzgyMDAwNCwgMHgxNTIwMDAwYSwgMHgzNDAyODEwMCwKLTB4YWZhYjAwMTAsIDB4OGVlMjcyNjQsIDB4M2MwNDAwMDEsIDB4MjQ4NDU3MzAsCi0weDNjMDUwMDA0LCAweGFmYTIwMDE0LCAweDhlZTYwNGU0LCAweDgwMDI4YmUsCi0weDM0YTVmMDE2LCAweDhlZTM3MjY0LCAweGE0NjIwMDBjLCAweDhlZTM3MjY0LAotMHg5NTgyMDAwZSwgMHhhNDYyMDAwZSwgMHg4MDAyOGMyLCAweDI0ZTcwMDA0LAotMHg4ZjgzMDEwMCwgMHgyNzYyMzAwMCwgMHgyNDY0MDAyMCwgMHg4MjEwMmIsCi0weDUwNDAwMDAxLCAweDI3NjQyODAwLCAweDhmODIwMTA4LCAweDEwODIwMDA0LAotMHgwLCAweDhmODIwMTA0LCAweDE0ODIwMDA3LCAweDI0MDUwMDA1LAotMHg4ZWUyMDFhOCwgMHg0ODIxLCAweDI0NDIwMDAxLCAweGFlZTIwMWE4LAotMHg4MDAyOGI2LCAweDhlZTIwMWE4LCAweGFjNmEwMDAwLCAweGFjNmIwMDA0LAotMHg4ZWUyNzI2NCwgMHhhNDY3MDAwZSwgMHhhYzY1MDAxOCwgMHhhYzYyMDAwOCwKLTB4OGVlMjA0ZTQsIDB4YWM2MjAwMWMsIDB4OGVlMjA0YzgsIDB4YWM2MjAwMTAsCi0weGFmODQwMTAwLCAweDkyZTIwNGVjLCAweDE0NDAwMDM2LCAweDI0MDkwMDAxLAotMHg4ZWUyNGUyOCwgMHgyMTBjMCwgMHgyNDQyNGUzOCwgMHgyZTIyMDIxLAotMHg4YzgyMDAwMCwgMHgxNDQ1MDAxZiwgMHgwLCAweDhlZTM0ZTI4LAotMHg4ZWUyNGUyYywgMHgxMDYyMDAxYiwgMHgyNDAzMDA0MCwgMHg4YzgyMDAwNCwKLTB4MjQ0MjAwMDEsIDB4YWM4MjAwMDQsIDB4OGVlMjRlMmMsIDB4OGVlNTRlMjgsCi0weDI0NDIwMDAxLCAweDEwNDMwMDA3LCAweDAsIDB4OGVlMjRlMmMsCi0weDI0NDIwMDAxLCAweDEwYTIwMDA1LCAweDAsIDB4ODAwMjhhMCwKLTB4MCwgMHgxNGEwMDAwNSwgMHgwLCAweDhmODIwMTA4LAotMHgyNDQyMDAyMCwgMHhhZjgyMDEwOCwgMHg4ZjgyMDEwOCwgMHg4YzgyMDAwNCwKLTB4MmM0MjAwMTEsIDB4NTA0MDAwMTMsIDB4YWM4MDAwMDAsIDB4ODAwMjhiNiwKLTB4MCwgMHg4ZWUyNGUyOCwgMHgyNDAzMDA0MCwgMHgyNDQyMDAwMSwKLTB4NTA0MzAwMDMsIDB4MTAyMSwgMHg4ZWUyNGUyOCwgMHgyNDQyMDAwMSwKLTB4YWVlMjRlMjgsIDB4OGVlMjRlMjgsIDB4MjEwYzAsIDB4MjQ0MjRlMzgsCi0weDJlMjIwMjEsIDB4MjQwMjAwMDUsIDB4YWM4MjAwMDAsIDB4MjQwMjAwMDEsCi0weGFjODIwMDA0LCAweDE1MjAwMDBiLCAweDNjMDUwMDA0LCAweDNjMDQwMDAxLAotMHgyNDg0NTc0OCwgMHhhZmFiMDAxMCwgMHhhZmEwMDAxNCwgMHg4ZWU2MDRlNCwKLTB4MzRhNWYwMTcsIDB4YzAwMjQwMywgMHgzMGU3ZmZmZiwgMHg4MDAyOGUxLAotMHgwLCAweDhlZTI3MjY0LCAweDNjMDUwMDAxLCAweDMwZTRmZmZmLAotMHg0NDEwMjEsIDB4YWVlMjcyNjQsIDB4OGVlMjcyNWMsIDB4OGVlMzcyNjQsCi0weDM0YTUzODAwLCAweDQ0MTAyMSwgMHhhZWUyNzI1YywgMHgzNjUxMDIxLAotMHg2MjE4MmIsIDB4MTQ2MDAwMDQsIDB4M2MwM2ZmZmYsIDB4OGVlMjcyNjQsCi0weDQzMTAyMSwgMHhhZWUyNzI2NCwgMHg4ZWUzMDRlNCwgMHg5NmUyMDQ1OCwKLTB4MjQ2MzAwMDEsIDB4MjQ0MmZmZmYsIDB4NjIxODI0LCAweGFlZTMwNGU0LAotMHg4ZWUzMDRlNCwgMHg4ZWUyMDRlMCwgMHgxNDYyMDAwNSwgMHgwLAotMHg4ZjgyMDA2MCwgMHgyNDAzZmZmNywgMHg0MzEwMjQsIDB4YWY4MjAwNjAsCi0weDhmYmYwMDIwLCAweDNlMDAwMDgsIDB4MjdiZDAwMjgsIDB4MjdiZGZmZTAsCi0weGFmYmYwMDE4LCAweDhlZTMwNGU4LCAweDhlZTIwNGUwLCAweDEwNjIwMTg5LAotMHgwLCAweDhlZTIwNGU4LCAweDhlZTMwNGZjLCAweDIxMTAwLAotMHg2MjE4MjEsIDB4OTQ2NzAwMDgsIDB4OTJlMjA0ZWQsIDB4OGM2ODAwMDAsCi0weDhjNjkwMDA0LCAweDEwNDAwMDIzLCAweDk0NmEwMDBhLCAweDhlZTIwNGM4LAotMHgzNDQ2MDQwMCwgMHgzMTQyMDIwMCwgMHgxMDQwMDAxZiwgMHgwLAotMHg5NmUyMDQ1YSwgMHgzMDQyMDAxMCwgMHgxMDQwMDAxYiwgMHgzYzAyODAwMCwKLTB4M2MwMTAwMDEsIDB4MzcwODIxLCAweGFjMjI4M2Q4LCAweDhlZTI3MjY0LAotMHg5NDY0MDAwZSwgMHgzYzA1MDAwMSwgMHgzNGE1MzgwMCwgMHgyNDQyMDAwNCwKLTB4YWVlMjcyNjQsIDB4OGVlMzcyNjQsIDB4NDI0MDAsIDB4MzY1MTAyMSwKLTB4M2MwMTAwMDEsIDB4MzcwODIxLCAweGFjMjQ4M2RjLCAweDYyMTgyYiwKLTB4MTQ2MDAwMDUsIDB4MjRlNzAwMDQsIDB4OGVlMjcyNjQsIDB4M2MwM2ZmZmYsCi0weDQzMTAyMSwgMHhhZWUyNzI2NCwgMHg4ZWUyNzI2NCwgMHg4MDAyOTE3LAotMHhhZWUyNzI1OCwgMHg4ZWU2MDRjOCwgMHg4ZWUyNzI2YywgMHgzMGU0ZmZmZiwKLTB4NDQxMDJhLCAweDEwNDAwMDE1LCAweDAsIDB4OGY4MjAwZDgsCi0weDhlZTM3MjU4LCAweDQzMTAyMywgMHhhZWUyNzI2YywgMHg4ZWUyNzI2YywKLTB4MWM0MDAwMDcsIDB4NDQxMDJhLCAweDhlZTI3MjZjLCAweDNjMDMwMDAxLAotMHg0MzEwMjEsIDB4YWVlMjcyNmMsIDB4OGVlMjcyNmMsIDB4NDQxMDJhLAotMHgxMDQwMDAwNiwgMHgwLCAweDhlZTIwMWI4LCAweDI0NDIwMDAxLAotMHhhZWUyMDFiOCwgMHg4MDAyYTcyLCAweDhlZTIwMWI4LCAweDNjMDIwMDAxLAotMHg1NzEwMjEsIDB4OGM0MjgzZDgsIDB4NTQ0MDAwMDEsIDB4MjRlN2ZmZmMsCi0weDMxNDIwMDA0LCAweDEwNDAwMGI5LCAweDMwZTJmZmZmLCAweDNjMDIwMDAxLAotMHg1NzEwMjEsIDB4OGM0MjgzZDgsIDB4MTA0MDAwMmYsIDB4NTAyMSwKLTB4OGY4NDAxMDAsIDB4Mjc2MjMwMDAsIDB4MjQ4NTAwMjAsIDB4YTIxMDJiLAotMHg1MDQwMDAwMSwgMHgyNzY1MjgwMCwgMHg4ZjgyMDEwOCwgMHgxMGEyMDAzMiwKLTB4MCwgMHg4ZjgyMDEwNCwgMHgxMGEyMDAyZiwgMHgyNDAyMDAxNSwKLTB4YWM4ODAwMDAsIDB4YWM4OTAwMDQsIDB4OGVlMzcyNjQsIDB4YTQ4NzAwMGUsCi0weGFjODIwMDE4LCAweGFjODMwMDA4LCAweDhlZTIwNGU4LCAweDNjMDMwMDAxLAotMHg3NzE4MjEsIDB4OGM2MzgzZGMsIDB4YWM4NjAwMTAsIDB4NDMxMDI1LAotMHhhYzgyMDAxYywgMHhhZjg1MDEwMCwgMHg5MmUyMDRlYywgMHgxNDQwMDA2NiwKLTB4MjQwYTAwMDEsIDB4OGVlMjRlMjgsIDB4MjQwMzAwNDAsIDB4MjQ0MjAwMDEsCi0weDUwNDMwMDAzLCAweDEwMjEsIDB4OGVlMjRlMjgsIDB4MjQ0MjAwMDEsCi0weGFlZTI0ZTI4LCAweDhlZTI0ZTI4LCAweDIxMGMwLCAweDI0NDI0ZTM4LAotMHgyZTIxODIxLCAweDI0MDIwMDE1LCAweGFjNjIwMDAwLCAweDI0MDIwMDAxLAotMHg4MDAyOWJmLCAweGFjNjIwMDA0LCAweDhmODQwMTAwLCAweDI3NjIzMDAwLAotMHgyNDg1MDAyMCwgMHhhMjEwMmIsIDB4NTA0MDAwMDEsIDB4Mjc2NTI4MDAsCi0weDhmODIwMTA4LCAweDEwYTIwMDA0LCAweDAsIDB4OGY4MjAxMDQsCi0weDE0YTIwMDA2LCAweDI0MDIwMDA2LCAweDhlZTIwMWE4LCAweDI0NDIwMDAxLAotMHhhZWUyMDFhOCwgMHg4MDAyOWJmLCAweDhlZTIwMWE4LCAweGFjODgwMDAwLAotMHhhYzg5MDAwNCwgMHg4ZWUzNzI2NCwgMHhhNDg3MDAwZSwgMHhhYzgyMDAxOCwKLTB4YWM4MzAwMDgsIDB4OGVlMjA0ZTgsIDB4YWM4NjAwMTAsIDB4YWM4MjAwMWMsCi0weGFmODUwMTAwLCAweDkyZTIwNGVjLCAweDE0NDAwMDM3LCAweDI0MGEwMDAxLAotMHg4ZWUyNGUyOCwgMHgyMTBjMCwgMHgyNDQyNGUzOCwgMHgyZTIyMDIxLAotMHg4YzgzMDAwMCwgMHgyNDAyMDAwNSwgMHgxNDYyMDAxZiwgMHgwLAotMHg4ZWUzNGUyOCwgMHg4ZWUyNGUyYywgMHgxMDYyMDAxYiwgMHgyNDAzMDA0MCwKLTB4OGM4MjAwMDQsIDB4MjQ0MjAwMDEsIDB4YWM4MjAwMDQsIDB4OGVlMjRlMmMsCi0weDhlZTU0ZTI4LCAweDI0NDIwMDAxLCAweDEwNDMwMDA3LCAweDAsCi0weDhlZTI0ZTJjLCAweDI0NDIwMDAxLCAweDEwYTIwMDA1LCAweDAsCi0weDgwMDI5YTksIDB4MCwgMHgxNGEwMDAwNSwgMHgwLAotMHg4ZjgyMDEwOCwgMHgyNDQyMDAyMCwgMHhhZjgyMDEwOCwgMHg4ZjgyMDEwOCwKLTB4OGM4MjAwMDQsIDB4MmM0MjAwMTEsIDB4NTA0MDAwMTMsIDB4YWM4MDAwMDAsCi0weDgwMDI5YmYsIDB4MCwgMHg4ZWUyNGUyOCwgMHgyNDAzMDA0MCwKLTB4MjQ0MjAwMDEsIDB4NTA0MzAwMDMsIDB4MTAyMSwgMHg4ZWUyNGUyOCwKLTB4MjQ0MjAwMDEsIDB4YWVlMjRlMjgsIDB4OGVlMjRlMjgsIDB4MjEwYzAsCi0weDI0NDI0ZTM4LCAweDJlMjIwMjEsIDB4MjQwMjAwMDUsIDB4YWM4MjAwMDAsCi0weDI0MDIwMDAxLCAweGFjODIwMDA0LCAweDE1NDAwMDBhLCAweDI0MDIwMDAxLAotMHhhZmE5MDAxMCwgMHg4ZWUyNzI2NCwgMHgzYzA0MDAwMSwgMHgyNDg0NTczMCwKLTB4M2MwNTAwMDQsIDB4YWZhMjAwMTQsIDB4OGVlNjA0ZTQsIDB4ODAwMmE0ZiwKLTB4MzRhNWYyMDQsIDB4YTJlMjA0ZWQsIDB4OGVlMjA0ZTgsIDB4OGVlMzA0ZmMsCi0weDhlZTQ3MjU4LCAweDNjMDYwMDAxLCAweDM0YzYzODAwLCAweDNjMDEwMDAxLAotMHgzNzA4MjEsIDB4YWMyMDgzZDgsIDB4M2MwMTAwMDEsIDB4MzcwODIxLAotMHhhYzIwODNkYywgMHgyMTEwMCwgMHg0MzEwMjEsIDB4YWM0NDAwMGMsCi0weDhlZTI3MjY0LCAweDI0MDVmZmY4LCAweDMwZTNmZmZmLCAweDQzMTAyMSwKLTB4MjQ0MjAwMDcsIDB4NDUxMDI0LCAweDI0NjMwMDA3LCAweGFlZTI3MjU4LAotMHg4ZWUyNzI2YywgMHg4ZWU0NzI1OCwgMHg2NTE4MjQsIDB4NDMxMDIzLAotMHhhZWUyNzI2YywgMHgzNjYxMDIxLCAweDgyMjAyYiwgMHgxNDgwMDAwNCwKLTB4M2MwM2ZmZmYsIDB4OGVlMjcyNTgsIDB4NDMxMDIxLCAweGFlZTI3MjU4LAotMHg4ZWUyNzI1OCwgMHg4MDAyYTY0LCAweGFlZTI3MjY0LCAweDEwNDAwMDczLAotMHgwLCAweDhmODMwMTAwLCAweDI3NjIzMDAwLCAweDI0NjQwMDIwLAotMHg4MjEwMmIsIDB4MTQ0MDAwMDIsIDB4NTAyMSwgMHgyNzY0MjgwMCwKLTB4OGY4MjAxMDgsIDB4MTA4MjAwMDQsIDB4MCwgMHg4ZjgyMDEwNCwKLTB4MTQ4MjAwMDYsIDB4MjQwNTAwMDUsIDB4OGVlMjAxYTgsIDB4MjQ0MjAwMDEsCi0weGFlZTIwMWE4LCAweDgwMDJhNDYsIDB4OGVlMjAxYTgsIDB4YWM2ODAwMDAsCi0weGFjNjkwMDA0LCAweDhlZTI3MjY0LCAweGE0NjcwMDBlLCAweGFjNjUwMDE4LAotMHhhYzYyMDAwOCwgMHg4ZWUyMDRlOCwgMHhhYzY2MDAxMCwgMHhhYzYyMDAxYywKLTB4YWY4NDAxMDAsIDB4OTJlMjA0ZWMsIDB4MTQ0MDAwMzYsIDB4MjQwYTAwMDEsCi0weDhlZTI0ZTI4LCAweDIxMGMwLCAweDI0NDI0ZTM4LCAweDJlMjIwMjEsCi0weDhjODIwMDAwLCAweDE0NDUwMDFmLCAweDAsIDB4OGVlMzRlMjgsCi0weDhlZTI0ZTJjLCAweDEwNjIwMDFiLCAweDI0MDMwMDQwLCAweDhjODIwMDA0LAotMHgyNDQyMDAwMSwgMHhhYzgyMDAwNCwgMHg4ZWUyNGUyYywgMHg4ZWU1NGUyOCwKLTB4MjQ0MjAwMDEsIDB4MTA0MzAwMDcsIDB4MCwgMHg4ZWUyNGUyYywKLTB4MjQ0MjAwMDEsIDB4MTBhMjAwMDUsIDB4MCwgMHg4MDAyYTMwLAotMHgwLCAweDE0YTAwMDA1LCAweDAsIDB4OGY4MjAxMDgsCi0weDI0NDIwMDIwLCAweGFmODIwMTA4LCAweDhmODIwMTA4LCAweDhjODIwMDA0LAotMHgyYzQyMDAxMSwgMHg1MDQwMDAxMywgMHhhYzgwMDAwMCwgMHg4MDAyYTQ2LAotMHgwLCAweDhlZTI0ZTI4LCAweDI0MDMwMDQwLCAweDI0NDIwMDAxLAotMHg1MDQzMDAwMywgMHgxMDIxLCAweDhlZTI0ZTI4LCAweDI0NDIwMDAxLAotMHhhZWUyNGUyOCwgMHg4ZWUyNGUyOCwgMHgyMTBjMCwgMHgyNDQyNGUzOCwKLTB4MmUyMjAyMSwgMHgyNDAyMDAwNSwgMHhhYzgyMDAwMCwgMHgyNDAyMDAwMSwKLTB4YWM4MjAwMDQsIDB4MTU0MDAwMGMsIDB4MzBlNWZmZmYsIDB4M2MwNDAwMDEsCi0weDI0ODQ1NzQ4LCAweDNjMDUwMDA0LCAweGFmYTkwMDEwLCAweGFmYTAwMDE0LAotMHg4ZWU2MDRlNCwgMHgzNGE1ZjIzNywgMHhjMDAyNDAzLCAweDMwZTdmZmZmLAotMHg4MDAyYTcyLCAweDAsIDB4OGVlMjcyNjQsIDB4NDUxMDIxLAotMHhhZWUyNzI2NCwgMHg4ZWUyNzI2YywgMHg4ZWUzNzI2NCwgMHgzYzA0MDAwMSwKLTB4MzQ4NDM4MDAsIDB4YTJlMDA0ZWQsIDB4NDUxMDIzLCAweGFlZTI3MjZjLAotMHgzNjQxMDIxLCAweDYyMTgyYiwgMHgxNDYwMDAwNCwgMHgzYzAzZmZmZiwKLTB4OGVlMjcyNjQsIDB4NDMxMDIxLCAweGFlZTI3MjY0LCAweDhlZTMwNGU4LAotMHg5NmUyMDQ1OCwgMHgyNDYzMDAwMSwgMHgyNDQyZmZmZiwgMHg2MjE4MjQsCi0weGFlZTMwNGU4LCAweDhlZTMwNGU4LCAweDhlZTIwNGUwLCAweDE0NjIwMDA1LAotMHgwLCAweDhmODIwMDYwLCAweDI0MDNmZmY3LCAweDQzMTAyNCwKLTB4YWY4MjAwNjAsIDB4OGZiZjAwMTgsIDB4M2UwMDAwOCwgMHgyN2JkMDAyMCwKLTB4MjdiZGZmZTAsIDB4YWZiZjAwMWMsIDB4YWZiMDAwMTgsIDB4OGY4MjAxMDAsCi0weDhlZTM0ZTJjLCAweDhmODIwMTA0LCAweDhmODUwMTA4LCAweDI0MDIwMDQwLAotMHgyNDYzMDAwMSwgMHg1MDYyMDAwMywgMHgxMDIxLCAweDhlZTI0ZTJjLAotMHgyNDQyMDAwMSwgMHhhZWUyNGUyYywgMHg4ZWUyNGUyYywgMHg4ZWUzNGUyYywKLTB4MjEwYzAsIDB4MjQ0MjRlMzgsIDB4MmUyMjAyMSwgMHg4ZWUyNGUyOCwKLTB4OGM4NzAwMDQsIDB4MTQ2MjAwMDcsIDB4YTAzMDIxLCAweDhmODIwMTA4LAotMHgyNDQyMDAyMCwgMHhhZjgyMDEwOCwgMHg4ZjgyMDEwOCwgMHg4MDAyYWEyLAotMHhhYzgwMDAwMCwgMHg4ZWUyNGUyYywgMHgyNDAzMDA0MCwgMHgyNDQyMDAwMSwKLTB4NTA0MzAwMDMsIDB4MTAyMSwgMHg4ZWUyNGUyYywgMHgyNDQyMDAwMSwKLTB4MjEwYzAsIDB4MjQ0MjRlMzgsIDB4MmUyMjAyMSwgMHg4YzgyMDAwNCwKLTB4OGY4MzAxMDgsIDB4MjExNDAsIDB4NjIxODIxLCAweGFmODMwMTA4LAotMHhhYzgwMDAwMCwgMHg4Y2MyMDAxOCwgMHgyNDQzZmZmZSwgMHgyYzYyMDAxMywKLTB4MTA0MDAwYzEsIDB4MzEwODAsIDB4M2MwMTAwMDEsIDB4MjIwODIxLAotMHg4YzIyNTc3MCwgMHg0MDAwMDgsIDB4MCwgMHg4ZWUyMDRmMCwKLTB4NDcxMDIxLCAweGFlZTIwNGYwLCAweDhlZTIwNGYwLCAweDhmNDMwMjNjLAotMHg0MzEwMmIsIDB4MTQ0MDAwYmUsIDB4MCwgMHg4ZWUzMDRlNCwKLTB4OGVlMjA0ZjgsIDB4NTA2MjAwYmEsIDB4YTJlMDA0ZjQsIDB4OGY4MzAxMjAsCi0weDI3NjIzODAwLCAweDI0NjYwMDIwLCAweGMyMTAyYiwgMHg1MDQwMDAwMSwKLTB4Mjc2NjMwMDAsIDB4OGY4MjAxMjgsIDB4MTBjMjAwMDQsIDB4MCwKLTB4OGY4MjAxMjQsIDB4MTRjMjAwMDcsIDB4MCwgMHg4ZWUyMDFhNCwKLTB4ODAyMSwgMHgyNDQyMDAwMSwgMHhhZWUyMDFhNCwgMHg4MDAyYjEyLAotMHg4ZWUyMDFhNCwgMHg4ZWUyMDRlNCwgMHhhYzYyMDAxYywgMHg4ZWU0MDRiMCwKLTB4OGVlNTA0YjQsIDB4MjQ2MjAwMWMsIDB4YWM2MjAwMDgsIDB4MjQwMjAwMDgsCi0weGE0NjIwMDBlLCAweDI0MDIwMDExLCAweGFjNjIwMDE4LCAweGFjNjQwMDAwLAotMHhhYzY1MDAwNCwgMHg4ZWUyMDRjNCwgMHhhYzYyMDAxMCwgMHhhZjg2MDEyMCwKLTB4OTJlMjRlMjAsIDB4MTQ0MDAwMzcsIDB4MjQxMDAwMDEsIDB4OGVlMjRlMzAsCi0weDIxMGMwLCAweDI0NDI1MDM4LCAweDJlMjIwMjEsIDB4OGM4MzAwMDAsCi0weDI0MDIwMDEyLCAweDE0NjIwMDFmLCAweDAsIDB4OGVlMzRlMzAsCi0weDhlZTI0ZTM0LCAweDEwNjIwMDFiLCAweDI0MDMwMDQwLCAweDhjODIwMDA0LAotMHgyNDQyMDAwMSwgMHhhYzgyMDAwNCwgMHg4ZWUyNGUzNCwgMHg4ZWU1NGUzMCwKLTB4MjQ0MjAwMDEsIDB4MTA0MzAwMDcsIDB4MCwgMHg4ZWUyNGUzNCwKLTB4MjQ0MjAwMDEsIDB4MTBhMjAwMDUsIDB4MCwgMHg4MDAyYWZjLAotMHgwLCAweDE0YTAwMDA1LCAweDAsIDB4OGY4MjAxMjgsCi0weDI0NDIwMDIwLCAweGFmODIwMTI4LCAweDhmODIwMTI4LCAweDhjODIwMDA0LAotMHgyYzQyMDAxMSwgMHg1MDQwMDAxMywgMHhhYzgwMDAwMCwgMHg4MDAyYjEyLAotMHgwLCAweDhlZTI0ZTMwLCAweDI0MDMwMDQwLCAweDI0NDIwMDAxLAotMHg1MDQzMDAwMywgMHgxMDIxLCAweDhlZTI0ZTMwLCAweDI0NDIwMDAxLAotMHhhZWUyNGUzMCwgMHg4ZWUyNGUzMCwgMHgyMTBjMCwgMHgyNDQyNTAzOCwKLTB4MmUyMjAyMSwgMHgyNDAyMDAxMiwgMHhhYzgyMDAwMCwgMHgyNDAyMDAwMSwKLTB4YWM4MjAwMDQsIDB4NTYwMDAwMGIsIDB4MjQxMDAwMDEsIDB4OGVlMjA0ZTQsCi0weDNjMDQwMDAxLCAweDI0ODQ1NzU0LCAweGFmYTAwMDE0LCAweGFmYTIwMDEwLAotMHg4ZWU2MDYwOCwgMHg4ZjQ3MDIyOCwgMHgzYzA1MDAwOSwgMHhjMDAyNDAzLAotMHgzNGE1ZjAwNiwgMHgxNjAwMDAwMywgMHgyNDAyMDAwMSwgMHg4MDAyYjcxLAotMHhhMmUyMDRmNCwgMHg4ZWUyMDE3MCwgMHgyNDQyMDAwMSwgMHhhZWUyMDE3MCwKLTB4OGVlMjAxNzAsIDB4OGVlMjA0ZTQsIDB4YTJlMDA0ZjQsIDB4YWVlMDA0ZjAsCi0weGFlZTIwNGY4LCAweDhmNDIwMjNjLCAweDUwNDAwMDQ1LCAweGFlZTA3Mjc0LAotMHg4ZWUyMDE4NCwgMHgyNDQyMDAwMSwgMHhhZWUyMDE4NCwgMHg4ZWUyMDE4NCwKLTB4ODAwMmI3MSwgMHhhZWUwNzI3NCwgMHg4ZWUyMDUwNCwgMHgyNDAzMDA0MCwKLTB4MjQ0MjAwMDEsIDB4NTA0MzAwMDMsIDB4MTAyMSwgMHg4ZWUyMDUwNCwKLTB4MjQ0MjAwMDEsIDB4YWVlMjA1MDQsIDB4OGVlMjA1MDQsIDB4OGNjMzAwMTgsCi0weDIxMDgwLCAweDU3MTAyMSwgMHg4YzQ0MDUwOCwgMHgyNDAyMDAwMywKLTB4MTQ2MjAwMGYsIDB4MCwgMHgzYzAyMDAwMSwgMHg1NzEwMjEsCi0weDkwNDI4M2IxLCAweDEwNDAwMDE0LCAweDAsIDB4OGVlMjAxZDAsCi0weDhlZTM1MjQwLCAweDQ0MTAyMSwgMHhhZWUyMDFkMCwgMHg4ZWUyMDFkOCwKLTB4NjQxODIxLCAweDMwNjMwMGZmLCAweDgwMDJiNTksIDB4YWVlMzUyNDAsCi0weDhlZTIwMWNjLCAweDhlZTMwZTEwLCAweDQ0MTAyMSwgMHhhZWUyMDFjYywKLTB4OGVlMjAxZDgsIDB4NjQxODIxLCAweDMwNjMwMWZmLCAweGFlZTMwZTEwLAotMHg0NDEwMjEsIDB4YWVlMjAxZDgsIDB4OGVlMjAwMDAsIDB4MzQ0MjAwNDAsCi0weDgwMDJiNzEsIDB4YWVlMjAwMDAsIDB4OGVlMjAxNGMsIDB4M2MwMTAwMDEsCi0weDM3MDgyMSwgMHhhMDIwODNlMCwgMHgyNDQyMDAwMSwgMHhhZWUyMDE0YywKLTB4ODAwMmI3MSwgMHg4ZWUyMDE0YywgMHg5NGM3MDAwZSwgMHg4Y2MyMDAxYywKLTB4M2MwNDAwMDEsIDB4MjQ4NDU3NjAsIDB4YWZhNjAwMTQsIDB4YWZhMjAwMTAsCi0weDhjYzYwMDE4LCAweDNjMDUwMDA4LCAweGMwMDI0MDMsIDB4MzRhNTA5MTAsCi0weDhmYmYwMDFjLCAweDhmYjAwMDE4LCAweDNlMDAwMDgsIDB4MjdiZDAwMjAsCi0weDI3YmRmZjk4LCAweGFmYmYwMDYwLCAweGFmYmUwMDVjLCAweGFmYjYwMDU4LAotMHhhZmI1MDA1NCwgMHhhZmI0MDA1MCwgMHhhZmIzMDA0YywgMHhhZmIyMDA0OCwKLTB4YWZiMTAwNDQsIDB4YWZiMDAwNDAsIDB4OGY4MzAxMDgsIDB4OGY4MjAxMDQsCi0weGFmYTAwMDI0LCAweDEwNjIwM2U3LCAweGFmYTAwMDJjLCAweDNjMWUwMDAxLAotMHgzN2RlMzgwMCwgMHgzYzBiZmZmZiwgMHg4ZjkzMDEwOCwgMHg4ZTYyMDAxOCwKLTB4OGY4MzAxMDQsIDB4MjQ0M2ZmZmUsIDB4MmM2MjAwMTQsIDB4MTA0MDAzY2YsCi0weDMxMDgwLCAweDNjMDEwMDAxLCAweDIyMDgyMSwgMHg4YzIyNTdjMCwKLTB4NDAwMDA4LCAweDAsIDB4OTY2MzAwMGUsIDB4OGVlMjcyNWMsCi0weDhlZTQwNGYwLCAweDQzMTAyMSwgMHhhZWUyNzI1YywgMHg4ZTYzMDAxYywKLTB4OTZlMjA0NTgsIDB4MjQ4NDAwMDEsIDB4YWVlNDA0ZjAsIDB4MjQ2MzAwMDEsCi0weDI0NDJmZmZmLCAweDYyMTgyNCwgMHhhZWUzMDRlNCwgMHg4ZjQyMDIzYywKLTB4ODIyMDJiLCAweDE0ODAwM2I5LCAweDAsIDB4OGY4MzAxMjAsCi0weDI3NjIzODAwLCAweDI0NjYwMDIwLCAweGMyMTAyYiwgMHg1MDQwMDAwMSwKLTB4Mjc2NjMwMDAsIDB4OGY4MjAxMjgsIDB4MTBjMjAwMDQsIDB4MCwKLTB4OGY4MjAxMjQsIDB4MTRjMjAwMDcsIDB4MCwgMHg4ZWUyMDFhNCwKLTB4ODAyMSwgMHgyNDQyMDAwMSwgMHhhZWUyMDFhNCwgMHg4MDAyYmZlLAotMHg4ZWUyMDFhNCwgMHg4ZWUyMDRlNCwgMHhhYzYyMDAxYywgMHg4ZWU0MDRiMCwKLTB4OGVlNTA0YjQsIDB4MjQ2MjAwMWMsIDB4YWM2MjAwMDgsIDB4MjQwMjAwMDgsCi0weGE0NjIwMDBlLCAweDI0MDIwMDExLCAweGFjNjIwMDE4LCAweGFjNjQwMDAwLAotMHhhYzY1MDAwNCwgMHg4ZWUyMDRjNCwgMHhhYzYyMDAxMCwgMHhhZjg2MDEyMCwKLTB4OTJlMjRlMjAsIDB4MTQ0MDAwMzcsIDB4MjQxMDAwMDEsIDB4OGVlMjRlMzAsCi0weDIxMGMwLCAweDI0NDI1MDM4LCAweDJlMjIwMjEsIDB4OGM4MzAwMDAsCi0weDI0MDIwMDEyLCAweDE0NjIwMDFmLCAweDAsIDB4OGVlMzRlMzAsCi0weDhlZTI0ZTM0LCAweDEwNjIwMDFiLCAweDI0MGMwMDQwLCAweDhjODIwMDA0LAotMHgyNDQyMDAwMSwgMHhhYzgyMDAwNCwgMHg4ZWUyNGUzNCwgMHg4ZWUzNGUzMCwKLTB4MjQ0MjAwMDEsIDB4MTA0YzAwMDcsIDB4MCwgMHg4ZWUyNGUzNCwKLTB4MjQ0MjAwMDEsIDB4MTA2MjAwMDUsIDB4MCwgMHg4MDAyYmU4LAotMHgwLCAweDE0NjAwMDA1LCAweDAsIDB4OGY4MjAxMjgsCi0weDI0NDIwMDIwLCAweGFmODIwMTI4LCAweDhmODIwMTI4LCAweDhjODIwMDA0LAotMHgyYzQyMDAxMSwgMHg1MDQwMDAxMywgMHhhYzgwMDAwMCwgMHg4MDAyYmZlLAotMHgwLCAweDhlZTI0ZTMwLCAweDI0MGMwMDQwLCAweDI0NDIwMDAxLAotMHg1MDRjMDAwMywgMHgxMDIxLCAweDhlZTI0ZTMwLCAweDI0NDIwMDAxLAotMHhhZWUyNGUzMCwgMHg4ZWUyNGUzMCwgMHgyMTBjMCwgMHgyNDQyNTAzOCwKLTB4MmUyMjAyMSwgMHgyNDAyMDAxMiwgMHgyNDBjMDAwMSwgMHhhYzgyMDAwMCwKLTB4YWM4YzAwMDQsIDB4NTYwMDAwMGQsIDB4MjQxMDAwMDEsIDB4OGVlMjA0ZTQsCi0weDNjMDQwMDAxLCAweDI0ODQ1NzU0LCAweGFmYTAwMDE0LCAweGFmYTIwMDEwLAotMHg4ZWU2MDYwOCwgMHg4ZjQ3MDIyOCwgMHgzYzA1MDAwOSwgMHgzNGE1ZjAwNiwKLTB4YzAwMjQwMywgMHhhZmFiMDAzOCwgMHg4ZmFiMDAzOCwgMHgxMjAwMDMwYSwKLTB4MjQwYzAwMDEsIDB4ODAwMmYxOSwgMHgwLCAweDk2NmMwMDFjLAotMHhhZmFjMDAyYywgMHg5NjYyMDAxZSwgMHgzYzBjODAwMCwgMHhhZmFjMDAyNCwKLTB4YWU2MjAwMWMsIDB4OGU3NTAwMWMsIDB4OGVlMjA0ZmMsIDB4OGVlNDA0ZmMsCi0weDE1MTkwMCwgMHg2MjEwMjEsIDB4OGM1MjAwMGMsIDB4OTJlMjdiOTgsCi0weDY0MTgyMSwgMHg5NDc2MDAwYSwgMHgxNDQwMDAwMywgMHgzMmMyMDAwMiwKLTB4YWVmMjdiYTQsIDB4YWVmNTdiOWMsIDB4MTA0MDAwNGIsIDB4ODAyMSwKLTB4OTZlMjA0NWEsIDB4MzA0MjAwMDIsIDB4MTA0MDAwNDcsIDB4MCwKLTB4OGU2MzAwMWMsIDB4OGVlMjA0ZmMsIDB4MzIxMDAsIDB4ODIxMDIxLAotMHg4YzQyMDAwYywgMHgzN2UxODIxLCAweDI0NDIwMDIyLCAweDQzMTAyYiwKLTB4MTQ0MDAwMGEsIDB4MjQwNTAwMTQsIDB4OGVlMjA0ZmMsIDB4ODIxMDIxLAotMHg4YzQ0MDAwYywgMHhhZmFiMDAzOCwgMHhjMDAyZjc1LCAweDI0ODQwMDBlLAotMHg4ZmFiMDAzOCwgMHg4MDAyYzUyLCAweDMwNTBmZmZmLCAweDhlZTIwNGZjLAotMHg4MjEwMjEsIDB4OGM0MjAwMGMsIDB4OTQ1MDAwMGUsIDB4OTQ0MzAwMTAsCi0weDk0NDQwMDEyLCAweDk0NDUwMDE0LCAweDIwMzgwMjEsIDB4MjA0ODAyMSwKLTB4MjA1ODAyMSwgMHg5NDQzMDAxNiwgMHg5NDQ0MDAxOCwgMHg5NDQ1MDAxYSwKLTB4MjAzODAyMSwgMHgyMDQ4MDIxLCAweDIwNTgwMjEsIDB4OTQ0MzAwMWMsCi0weDk0NDQwMDFlLCAweDk0NDIwMDIwLCAweDIwMzgwMjEsIDB4MjA0ODAyMSwKLTB4MjAyODAyMSwgMHgxMDFjMDIsIDB4MzIwMmZmZmYsIDB4NjI4MDIxLAotMHg4ZTYzMDAxYywgMHg4ZWUyMDRmYywgMHgxMDI0MDIsIDB4MzI5MDAsCi0weGEyMTAyMSwgMHg4YzQzMDAwYywgMHgzMjAyZmZmZiwgMHg4MjgwMjEsCi0weDM3ZTEwMjEsIDB4MjQ2MzAwMTgsIDB4NjIxODJiLCAweDE0NjAwMDA5LAotMHgwLCAweDhlZTIwNGZjLCAweGEyMTAyMSwgMHg4YzQzMDAwYywKLTB4MTAxMDI3LCAweDNjMDFmZmZmLCAweDIzMDgyMSwgMHg4MDAyYzZmLAotMHhhNDIyMDAxOCwgMHg4ZWUyMDRmYywgMHhhMjEwMjEsIDB4OGM0MzAwMGMsCi0weDEwMTAyNywgMHhhNDYyMDAxOCwgMHg5NmUyMDQ1YSwgMHg4ODIxLAotMHgzMDQyMDAwOCwgMHgxNDQwMDA2MywgMHhhMDIxLCAweDhlNjMwMDFjLAotMHg4ZWUyMDRmYywgMHgzMzEwMCwgMHhjMjEwMjEsIDB4OGM0MjAwMGMsCi0weDM3ZTE4MjEsIDB4MjQ0MjAwMjIsIDB4NDMxMDJiLCAweDE0NDAwMDM1LAotMHgwLCAweDhlZTIwNGZjLCAweGMyMTAyMSwgMHg4YzQyMDAwYywKLTB4MjQ0NzAwMTAsIDB4MzdlMTAyMSwgMHhlMjEwMmIsIDB4NTA0MDAwMDEsCi0weGViMzgyMSwgMHg4ZWUyMDRmYywgMHg5NGYxMDAwMCwgMHhjMjEwMjEsCi0weDhjNDIwMDBjLCAweDI0NDcwMDE2LCAweDM3ZTEwMjEsIDB4ZTIxMDJiLAotMHgxNDQwMDAwMiwgMHgyNjM0ZmZlYywgMHhlYjM4MjEsIDB4OGVlMjA0ZmMsCi0weDkwZTMwMDAxLCAweGMyMTAyMSwgMHg4YzQyMDAwYywgMHgyNDQ3MDAxYSwKLTB4MzdlMTAyMSwgMHhlMjEwMmIsIDB4MTQ0MDAwMDIsIDB4MjgzODgyMSwKLTB4ZWIzODIxLCAweDk0ZTIwMDAwLCAweDI0ZTcwMDAyLCAweDIyMjg4MjEsCi0weDM3ZTEwMjEsIDB4ZTIxMDJiLCAweDUwNDAwMDAxLCAweGViMzgyMSwKLTB4OTRlMjAwMDAsIDB4MjRlNzAwMDIsIDB4MjIyODgyMSwgMHgzN2UxMDIxLAotMHhlMjEwMmIsIDB4NTA0MDAwMDEsIDB4ZWIzODIxLCAweDk0ZTIwMDAwLAotMHgyNGU3MDAwMiwgMHgyMjI4ODIxLCAweDM3ZTEwMjEsIDB4ZTIxMDJiLAotMHg1MDQwMDAwMSwgMHhlYjM4MjEsIDB4OTRlMjAwMDAsIDB4ODAwMmNkMCwKLTB4MjIyODgyMSwgMHg4ZWUyMDRmYywgMHhjMjEwMjEsIDB4OGM0MzAwMGMsCi0weDhlZTIwNGZjLCAweDk0NzEwMDEwLCAweDhlZTMwNGZjLCAweGMyMTAyMSwKLTB4OGM0NDAwMGMsIDB4YzMxODIxLCAweDhjNjIwMDBjLCAweDI2MzRmZmVjLAotMHg5MDg0MDAxNywgMHg4ZWUzMDRmYywgMHg5NDQyMDAxYSwgMHgyODQ4ODIxLAotMHhjMzE4MjEsIDB4OGM2NTAwMGMsIDB4OGVlMzA0ZmMsIDB4MjIyODgyMSwKLTB4OGVlMjA0ZmMsIDB4YzMxODIxLCAweGMyMTAyMSwgMHg4YzQ0MDAwYywKLTB4OGM2MjAwMGMsIDB4OTRhMzAwMWMsIDB4OTQ4NDAwMWUsIDB4OTQ0MjAwMjAsCi0weDIyMzg4MjEsIDB4MjI0ODgyMSwgMHgyMjI4ODIxLCAweDExMWMwMiwKLTB4MzIyMmZmZmYsIDB4NjI4ODIxLCAweDExMWMwMiwgMHgzMjIyZmZmZiwKLTB4NjI4ODIxLCAweDMyYzIwMDAxLCAweDEwNDAwMGIyLCAweDAsCi0weDk2ZTIwNDVhLCAweDMwNDIwMDAxLCAweDEwNDAwMGFlLCAweDMyYzIwMDgwLAotMHgxMDQwMDAwOCwgMHgwLCAweDkyZTI3Yjk4LCAweDE0NDAwMDA1LAotMHgwLCAweDI0MGMwMDAxLCAweGEyZWM3Yjk4LCAweGFlZjU3YjljLAotMHhhZWYyN2JhNCwgMHg4ZWUzMDRmYywgMHgxNTExMDAsIDB4NDMxMDIxLAotMHg4YzQ3MDAwYywgMHgzN2UxODIxLCAweDI0ZTIwMDBlLCAweDQzMTAyYiwKLTB4MTQ0MDAwMDgsIDB4ZTAyMDIxLCAweDI0MDUwMDBlLCAweGMwMDJmNzUsCi0weGFmYWIwMDM4LCAweDMwNDJmZmZmLCAweDhmYWIwMDM4LCAweDgwMDJkMDksCi0weDIwMjgwMjEsIDB4OTRlNjAwMDAsIDB4MjRlNzAwMDIsIDB4OTRlNTAwMDAsCi0weDI0ZTcwMDAyLCAweDk0ZTMwMDAwLCAweDI0ZTcwMDAyLCAweDk0ZTIwMDAwLAotMHgyNGU3MDAwMiwgMHg5NGU0MDAwMCwgMHgyNGU3MDAwMiwgMHgyMDY4MDIxLAotMHgyMDU4MDIxLCAweDIwMzgwMjEsIDB4MjAyODAyMSwgMHg5NGUyMDAwMCwKLTB4OTRlMzAwMDIsIDB4MjA0ODAyMSwgMHgyMDI4MDIxLCAweDIwMzgwMjEsCi0weDEwMWMwMiwgMHgzMjAyZmZmZiwgMHg2MjgwMjEsIDB4MTAxYzAyLAotMHgzMjAyZmZmZiwgMHg4ZWU0N2I5YywgMHg2MjgwMjEsIDB4MTQ5NTAwMDQsCi0weDMyMDVmZmZmLCAweDk2NjIwMDE2LCAweDgwMDJkMTcsIDB4NTEyMDIxLAotMHg5NjYyMDAxNiwgMHg1NDIwMjEsIDB4NDE0MDIsIDB4MzA4M2ZmZmYsCi0weDQzMjAyMSwgMHg4NTIwMjMsIDB4NDE0MDIsIDB4ODIyMDIxLAotMHgzMDg0ZmZmZiwgMHg1MDgwMDAwMSwgMHgzNDA0ZmZmZiwgMHg4ZWUyN2JhNCwKLTB4MjQ0MzAwMTcsIDB4MzdlMTAyMSwgMHg2MjEwMmIsIDB4NTA0MDAwMDEsCi0weDZiMTgyMSwgMHg5MDYzMDAwMCwgMHgyNDAyMDAxMSwgMHgxNDYyMDAzMSwKLTB4MjQwMjAwMDYsIDB4OGVlMjdiYTQsIDB4MzdlMTgyMSwgMHgyNDQyMDAyOCwKLTB4NDMxMDJiLCAweDE0NDAwMDE4LCAweDAsIDB4OGVlMjdiOWMsCi0weDEyYTIwMDBhLCAweDMyYzIwMTAwLCAweDhlZTI3YmE0LCAweDNjMDFmZmZmLAotMHgyMjA4MjEsIDB4OTQyMjAwMjgsIDB4ODIyMDIxLCAweDQxYzAyLAotMHgzMDgyZmZmZiwgMHg2MjIwMjEsIDB4MzJjMjAxMDAsIDB4MTQ0MDAwMDQsCi0weDQxMDI3LCAweDkyZTI3Yjk4LCAweDE0NDAwMDAyLCAweDQxMDI3LAotMHgzMDQ0ZmZmZiwgMHg4ZWUyN2JhNCwgMHgzYzAxZmZmZiwgMHgyMjA4MjEsCi0weDgwMDJkOGEsIDB4YTQyNDAwMjgsIDB4OGVlMjdiOWMsIDB4MTJhMjAwMDgsCi0weDMyYzIwMTAwLCAweDhlZTI3YmE0LCAweDk0NDIwMDI4LCAweDgyMjAyMSwKLTB4NDFjMDIsIDB4MzA4MmZmZmYsIDB4NjIyMDIxLCAweDMyYzIwMTAwLAotMHgxNDQwMDAwNCwgMHg0MTAyNywgMHg5MmUyN2I5OCwgMHgxNDQwMDAwMiwKLTB4NDEwMjcsIDB4MzA0NGZmZmYsIDB4OGVlMjdiYTQsIDB4ODAwMmQ4YSwKLTB4YTQ0NDAwMjgsIDB4MTQ2MjAwMmYsIDB4MzdlMTgyMSwgMHg4ZWUyN2JhNCwKLTB4MjQ0MjAwMzIsIDB4NDMxMDJiLCAweDE0NDAwMDE4LCAweDAsCi0weDhlZTI3YjljLCAweDEyYTIwMDBhLCAweDMyYzIwMTAwLCAweDhlZTI3YmE0LAotMHgzYzAxZmZmZiwgMHgyMjA4MjEsIDB4OTQyMjAwMzIsIDB4ODIyMDIxLAotMHg0MWMwMiwgMHgzMDgyZmZmZiwgMHg2MjIwMjEsIDB4MzJjMjAxMDAsCi0weDE0NDAwMDA0LCAweDQxMDI3LCAweDkyZTI3Yjk4LCAweDE0NDAwMDAyLAotMHg0MTAyNywgMHgzMDQ0ZmZmZiwgMHg4ZWUyN2JhNCwgMHgzYzAxZmZmZiwKLTB4MjIwODIxLCAweDgwMDJkOGEsIDB4YTQyNDAwMzIsIDB4OGVlMjdiOWMsCi0weDEyYTIwMDA4LCAweDMyYzIwMTAwLCAweDhlZTI3YmE0LCAweDk0NDIwMDMyLAotMHg4MjIwMjEsIDB4NDFjMDIsIDB4MzA4MmZmZmYsIDB4NjIyMDIxLAotMHgzMmMyMDEwMCwgMHgxNDQwMDAwNCwgMHg0MTAyNywgMHg5MmUyN2I5OCwKLTB4MTQ0MDAwMDIsIDB4NDEwMjcsIDB4MzA0NGZmZmYsIDB4OGVlMjdiYTQsCi0weGE0NDQwMDMyLCAweDhmYWMwMDI0LCAweDExODAwMDJjLCAweDM3ZTE4MjEsCi0weDhlNDIwMDAwLCAweGFlNDJmZmZjLCAweDI2NDIwMDBhLCAweDQzMTAyYiwKLTB4MTQ0MDAwMWIsIDB4MzQwMzgxMDAsIDB4MjY0MzAwMDQsIDB4MzdlMTAyMSwKLTB4NjIxMDJiLCAweDE0NDAwMDAzLCAweDYwMjAyMSwgMHg2YjE4MjEsCi0weDYwMjAyMSwgMHg4YzYyMDAwMCwgMHgyNDYzMDAwNCwgMHhhZTQyMDAwMCwKLTB4MzdlMTAyMSwgMHg2MjEwMmIsIDB4NTA0MDAwMDEsIDB4NmIxODIxLAotMHg4YzYyMDAwMCwgMHhhYzgyMDAwMCwgMHgzNDAyODEwMCwgMHhhNDYyMDAwMCwKLTB4MjQ2MzAwMDIsIDB4MzdlMTAyMSwgMHg2MjEwMmIsIDB4NTA0MDAwMDEsCi0weDZiMTgyMSwgMHg5N2FjMDAyZSwgMHg4MDAyZGI0LCAweGE0NmMwMDAwLAotMHg4ZTQyMDAwNCwgMHg4ZTQ0MDAwOCwgMHhhNjQzMDAwOCwgMHg5N2FjMDAyZSwKLTB4YTY0YzAwMGEsIDB4YWU0MjAwMDAsIDB4YWU0NDAwMDQsIDB4OTY2MjAwMGUsCi0weDI2NTJmZmZjLCAweDI0NDIwMDA0LCAweGE2NjIwMDBlLCAweDk2NjIwMDBlLAotMHg4ZWUzNzI1YywgMHg2MjE4MjEsIDB4YWVlMzcyNWMsIDB4YWZiMjAwMTgsCi0weDhlZTM3MjVjLCAweGFmYTMwMDFjLCAweDhlZTI3MjVjLCAweDJjNDIwMDNjLAotMHgxMDQwMDAwNCwgMHgyNDYyMDAwMSwgMHgyNDAzZmZmZSwgMHg0MzEwMjQsCi0weGFmYTIwMDFjLCAweDMyYzIwMDgwLCAweDEwNDAwMDBjLCAweDMyYzIwMTAwLAotMHg4ZWUyN2JhOCwgMHgyNDQzMDAwMSwgMHgyMTBjMCwgMHg1NzEwMjEsCi0weGFlZTM3YmE4LCAweDhmYTMwMDE4LCAweDhmYTQwMDFjLCAweGFjNDM3YmFjLAotMHhhYzQ0N2JiMCwgMHg4MDAyZWEwLCAweGFlZTA3MjVjLCAweDEwNDAwMDcyLAotMHgwLCAweDhlZTI3YmE4LCAweDI0NDMwMDAxLCAweDIxMGMwLAotMHg1NzEwMjEsIDB4YWVlMzdiYTgsIDB4OGZhMzAwMTgsIDB4OGZhNDAwMWMsCi0weGFjNDM3YmFjLCAweGFjNDQ3YmIwLCAweDhlZTI3YmE4LCAweDEwNDAwMDYzLAotMHg0ODIxLCAweDUwMjEsIDB4OGY4MjAwZjAsIDB4MjQ0ODAwMDgsCi0weDI3NjIxODAwLCAweDEwMjEwMmIsIDB4NTA0MDAwMDEsIDB4Mjc2ODEwMDAsCi0weDhmODIwMGY0LCAweDE1MDIwMDA3LCAweDAsIDB4OGVlMjAxYjQsCi0weDgwMjEsIDB4MjQ0MjAwMDEsIDB4YWVlMjAxYjQsIDB4ODAwMmRmYSwKLTB4OGVlMjAxYjQsIDB4OGY4MzAwZjAsIDB4MjQxMDAwMDEsIDB4MTU3MTAyMSwKLTB4OGM0NDdiYWMsIDB4OGM0NTdiYjAsIDB4YWM2NDAwMDAsIDB4YWM2NTAwMDQsCi0weGFmODgwMGYwLCAweDE2MDAwMDA2LCAweDJlYTEwMjEsIDB4OGVlMjAwODgsCi0weDI0NDIwMDAxLCAweGFlZTIwMDg4LCAweDgwMDJlM2YsIDB4OGVlMjAwODgsCi0weDhjNDI3YmIwLCAweDhlZTQwMGUwLCAweDhlZTUwMGU0LCAweDhlZTY3YjljLAotMHg0MDE4MjEsIDB4MTAyMSwgMHhhMzI4MjEsIDB4YTMzODJiLAotMHg4MjIwMjEsIDB4ODcyMDIxLCAweDhlZTIwNGZjLCAweGM5MzAyMSwKLTB4NjMxMDAsIDB4YWVlNDAwZTAsIDB4YWVlNTAwZTQsIDB4YzIzMDIxLAotMHg5NGMyMDAwYSwgMHgyNDBjMDAwMiwgMHgyMTE0MiwgMHgzMDQzMDAwMywKLTB4MTA2YzAwMTYsIDB4Mjg2MjAwMDMsIDB4MTA0MDAwMDUsIDB4MjQwYzAwMDEsCi0weDEwNmMwMDA4LCAweDAsIDB4ODAwMmUzZiwgMHgwLAotMHgyNDBjMDAwMywgMHgxMDZjMDAxNywgMHgwLCAweDgwMDJlM2YsCi0weDAsIDB4OGVlMjAwZTgsIDB4OGVlMzAwZWMsIDB4MjQ2MzAwMDEsCi0weDJjNjQwMDAxLCAweDQ0MTAyMSwgMHhhZWUyMDBlOCwgMHhhZWUzMDBlYywKLTB4OGVlMjAwZTgsIDB4ODAwMmUzZiwgMHg4ZWUzMDBlYywgMHg4ZWUyMDBmMCwKLTB4OGVlMzAwZjQsIDB4MjQ2MzAwMDEsIDB4MmM2NDAwMDEsIDB4NDQxMDIxLAotMHhhZWUyMDBmMCwgMHhhZWUzMDBmNCwgMHg4ZWUyMDBmMCwgMHg4MDAyZTNmLAotMHg4ZWUzMDBmNCwgMHg4ZWUyMDBmOCwgMHg4ZWUzMDBmYywgMHgyNDYzMDAwMSwKLTB4MmM2NDAwMDEsIDB4NDQxMDIxLCAweGFlZTIwMGY4LCAweGFlZTMwMGZjLAotMHg4ZWUyMDBmOCwgMHg4ZWUzMDBmYywgMHg4ZWUyN2JhOCwgMHgyNTI5MDAwMSwKLTB4MTIyMTAyYiwgMHgxNDQwZmZhMCwgMHgyNTRhMDAwOCwgMHhhMmUwN2I5OCwKLTB4ODAwMmU5ZiwgMHhhZWUwN2JhOCwgMHg4ZjgyMDBmMCwgMHgyNDQ3MDAwOCwKLTB4Mjc2MjE4MDAsIDB4ZTIxMDJiLCAweDUwNDAwMDAxLCAweDI3NjcxMDAwLAotMHg4ZjgyMDBmNCwgMHgxNGUyMDAwNywgMHgwLCAweDhlZTIwMWI0LAotMHg4MDIxLCAweDI0NDIwMDAxLCAweGFlZTIwMWI0LCAweDgwMDJlNWQsCi0weDhlZTIwMWI0LCAweDhmODIwMGYwLCAweDI0MTAwMDAxLCAweDhmYTMwMDE4LAotMHg4ZmE0MDAxYywgMHhhYzQzMDAwMCwgMHhhYzQ0MDAwNCwgMHhhZjg3MDBmMCwKLTB4MTYwMDAwMDcsIDB4MCwgMHg4ZWUyMDA4OCwgMHgyNDQyMDAwMSwKLTB4YWVlMjAwODgsIDB4OGVlMjAwODgsIDB4ODAwMmVhMCwgMHhhZWUwNzI1YywKLTB4OGVlMjcyNWMsIDB4OGVlNDAwZTAsIDB4OGVlNTAwZTQsIDB4MjQwYzAwMDIsCi0weDQwMTgyMSwgMHgxMDIxLCAweGEzMjgyMSwgMHhhMzMwMmIsCi0weDgyMjAyMSwgMHg4NjIwMjEsIDB4MTYxMTQyLCAweDMwNDMwMDAzLAotMHhhZWU0MDBlMCwgMHhhZWU1MDBlNCwgMHgxMDZjMDAxNywgMHgyYzYyMDAwMywKLTB4MTA0MDAwMDUsIDB4MjQwYzAwMDEsIDB4MTA2YzAwMDgsIDB4MCwKLTB4ODAwMmVhMCwgMHhhZWUwNzI1YywgMHgyNDBjMDAwMywgMHgxMDZjMDAxOSwKLTB4MCwgMHg4MDAyZWEwLCAweGFlZTA3MjVjLCAweDhlZTIwMGU4LAotMHg4ZWUzMDBlYywgMHgyNDYzMDAwMSwgMHgyYzY0MDAwMSwgMHg0NDEwMjEsCi0weGFlZTIwMGU4LCAweGFlZTMwMGVjLCAweDhlZTIwMGU4LCAweDhlZTMwMGVjLAotMHg4MDAyZWEwLCAweGFlZTA3MjVjLCAweDhlZTIwMGYwLCAweDhlZTMwMGY0LAotMHgyNDYzMDAwMSwgMHgyYzY0MDAwMSwgMHg0NDEwMjEsIDB4YWVlMjAwZjAsCi0weGFlZTMwMGY0LCAweDhlZTIwMGYwLCAweDhlZTMwMGY0LCAweDgwMDJlYTAsCi0weGFlZTA3MjVjLCAweDhlZTIwMGY4LCAweDhlZTMwMGZjLCAweDI0NjMwMDAxLAotMHgyYzY0MDAwMSwgMHg0NDEwMjEsIDB4YWVlMjAwZjgsIDB4YWVlMzAwZmMsCi0weDhlZTIwMGY4LCAweDhlZTMwMGZjLCAweGFlZTA3MjVjLCAweDhlNjIwMDFjLAotMHg5NmUzMDQ1OCwgMHg4ZWU0MDRmMCwgMHgyNDQyMDAwMSwgMHgyNDYzZmZmZiwKLTB4NDMxMDI0LCAweDI0ODQwMDAxLCAweGFlZTIwNGU0LCAweGFlZTQwNGYwLAotMHg4ZjQyMDIzYywgMHg4MjIwMmIsIDB4MTQ4MDAwYjAsIDB4MCwKLTB4OGY4MzAxMjAsIDB4Mjc2MjM4MDAsIDB4MjQ2NjAwMjAsIDB4YzIxMDJiLAotMHg1MDQwMDAwMSwgMHgyNzY2MzAwMCwgMHg4ZjgyMDEyOCwgMHgxMGMyMDAwNCwKLTB4MCwgMHg4ZjgyMDEyNCwgMHgxNGMyMDAwNywgMHgwLAotMHg4ZWUyMDFhNCwgMHg4MDIxLCAweDI0NDIwMDAxLCAweGFlZTIwMWE0LAotMHg4MDAyZjA3LCAweDhlZTIwMWE0LCAweDhlZTIwNGU0LCAweGFjNjIwMDFjLAotMHg4ZWU0MDRiMCwgMHg4ZWU1MDRiNCwgMHgyNDYyMDAxYywgMHhhYzYyMDAwOCwKLTB4MjQwMjAwMDgsIDB4YTQ2MjAwMGUsIDB4MjQwMjAwMTEsIDB4YWM2MjAwMTgsCi0weGFjNjQwMDAwLCAweGFjNjUwMDA0LCAweDhlZTIwNGM0LCAweGFjNjIwMDEwLAotMHhhZjg2MDEyMCwgMHg5MmUyNGUyMCwgMHgxNDQwMDAzNywgMHgyNDEwMDAwMSwKLTB4OGVlMjRlMzAsIDB4MjEwYzAsIDB4MjQ0MjUwMzgsIDB4MmUyMjAyMSwKLTB4OGM4MzAwMDAsIDB4MjQwMjAwMTIsIDB4MTQ2MjAwMWYsIDB4MCwKLTB4OGVlMzRlMzAsIDB4OGVlMjRlMzQsIDB4MTA2MjAwMWIsIDB4MjQwYzAwNDAsCi0weDhjODIwMDA0LCAweDI0NDIwMDAxLCAweGFjODIwMDA0LCAweDhlZTI0ZTM0LAotMHg4ZWUzNGUzMCwgMHgyNDQyMDAwMSwgMHgxMDRjMDAwNywgMHgwLAotMHg4ZWUyNGUzNCwgMHgyNDQyMDAwMSwgMHgxMDYyMDAwNSwgMHgwLAotMHg4MDAyZWYxLCAweDAsIDB4MTQ2MDAwMDUsIDB4MCwKLTB4OGY4MjAxMjgsIDB4MjQ0MjAwMjAsIDB4YWY4MjAxMjgsIDB4OGY4MjAxMjgsCi0weDhjODIwMDA0LCAweDJjNDIwMDExLCAweDUwNDAwMDEzLCAweGFjODAwMDAwLAotMHg4MDAyZjA3LCAweDAsIDB4OGVlMjRlMzAsIDB4MjQwYzAwNDAsCi0weDI0NDIwMDAxLCAweDUwNGMwMDAzLCAweDEwMjEsIDB4OGVlMjRlMzAsCi0weDI0NDIwMDAxLCAweGFlZTI0ZTMwLCAweDhlZTI0ZTMwLCAweDIxMGMwLAotMHgyNDQyNTAzOCwgMHgyZTIyMDIxLCAweDI0MDIwMDEyLCAweDI0MGMwMDAxLAotMHhhYzgyMDAwMCwgMHhhYzhjMDAwNCwgMHg1NjAwMDAwZCwgMHgyNDEwMDAwMSwKLTB4OGVlMjA0ZTQsIDB4M2MwNDAwMDEsIDB4MjQ4NDU3NTQsIDB4YWZhMDAwMTQsCi0weGFmYTIwMDEwLCAweDhlZTYwNjA4LCAweDhmNDcwMjI4LCAweDNjMDUwMDA5LAotMHgzNGE1ZjAwNiwgMHhjMDAyNDAzLCAweGFmYWIwMDM4LCAweDhmYWIwMDM4LAotMHgxNjAwMDAwMywgMHgyNDBjMDAwMSwgMHg4MDAyZjVjLCAweGEyZWMwNGY0LAotMHg4ZWUyMDE3MCwgMHgyNDQyMDAwMSwgMHhhZWUyMDE3MCwgMHg4ZWUyMDE3MCwKLTB4OGVlMjA0ZTQsIDB4YTJlMDA0ZjQsIDB4YWVlMDA0ZjAsIDB4YWVlMDcyNzQsCi0weGFlZTIwNGY4LCAweDhmNDIwMjNjLCAweDEwNDAwMDM4LCAweDAsCi0weDhlZTIwMTg0LCAweDI0NDIwMDAxLCAweGFlZTIwMTg0LCAweDgwMDJmNWMsCi0weDhlZTIwMTg0LCAweDhlZTIwNTA0LCAweDI0MGMwMDQwLCAweDI0NDIwMDAxLAotMHg1MDRjMDAwMywgMHgxMDIxLCAweDhlZTIwNTA0LCAweDI0NDIwMDAxLAotMHhhZWUyMDUwNCwgMHg4ZWUyMDUwNCwgMHg4ZTYzMDAxOCwgMHgyNDBjMDAwMywKLTB4MjEwODAsIDB4NTcxMDIxLCAweDE0NmMwMDBmLCAweDhjNDQwNTA4LAotMHgzYzAyMDAwMSwgMHg1NzEwMjEsIDB4OTA0MjgzYjEsIDB4MTA0MDAwMTQsCi0weDAsIDB4OGVlMjAxZDAsIDB4OGVlMzUyNDAsIDB4NDQxMDIxLAotMHhhZWUyMDFkMCwgMHg4ZWUyMDFkOCwgMHg2NDE4MjEsIDB4MzA2MzAwZmYsCi0weDgwMDJmNGYsIDB4YWVlMzUyNDAsIDB4OGVlMjAxY2MsIDB4OGVlMzBlMTAsCi0weDQ0MTAyMSwgMHhhZWUyMDFjYywgMHg4ZWUyMDFkOCwgMHg2NDE4MjEsCi0weDMwNjMwMWZmLCAweGFlZTMwZTEwLCAweDQ0MTAyMSwgMHhhZWUyMDFkOCwKLTB4OGVlMjAwMDAsIDB4MzQ0MjAwNDAsIDB4ODAwMmY1YywgMHhhZWUyMDAwMCwKLTB4OGVlMjAxNGMsIDB4M2MwMTAwMDEsIDB4MzcwODIxLCAweGEwMjA4M2UwLAotMHgyNDQyMDAwMSwgMHhhZWUyMDE0YywgMHg4ZWUyMDE0YywgMHg4ZjgyMDEwOCwKLTB4MjQ0MjAwMjAsIDB4YWY4MjAxMDgsIDB4OGY4MjAxMDgsIDB4OGY4MjAxMDgsCi0weDI3NjMzMDAwLCAweDQzMTAyYiwgMHgxNDQwMDAwMiwgMHgyNzYyMjgwMCwKLTB4YWY4MjAxMDgsIDB4OGY4MzAxMDgsIDB4OGY4MjAxMDQsIDB4MTQ2MmZjMWUsCi0weDAsIDB4OGZiZjAwNjAsIDB4OGZiZTAwNWMsIDB4OGZiNjAwNTgsCi0weDhmYjUwMDU0LCAweDhmYjQwMDUwLCAweDhmYjMwMDRjLCAweDhmYjIwMDQ4LAotMHg4ZmIxMDA0NCwgMHg4ZmIwMDA0MCwgMHgzZTAwMDA4LCAweDI3YmQwMDY4LAotMHg1Mjg0MywgMHgxMGEwMDAwZCwgMHgzMDIxLCAweDNjMDMwMDAxLAotMHgzNDYzMzgwMCwgMHgzYzA3ZmZmZiwgMHgzNjMxMDIxLCAweDgyMTAyYiwKLTB4NTA0MDAwMDEsIDB4ODcyMDIxLCAweDk0ODIwMDAwLCAweDI0ODQwMDAyLAotMHgyNGE1ZmZmZiwgMHgxNGEwZmZmOCwgMHhjMjMwMjEsIDB4NjFjMDIsCi0weDMwYzJmZmZmLCAweDYyMzAyMSwgMHg2MWMwMiwgMHgzMGMyZmZmZiwKLTB4NjIzMDIxLCAweDNlMDAwMDgsIDB4MzBjMmZmZmYsIDB4MjdiZGZmODgsCi0weDI0MGYwMDAxLCAweGFmYmYwMDcwLCAweGFmYmUwMDZjLCAweGFmYjYwMDY4LAotMHhhZmI1MDA2NCwgMHhhZmI0MDA2MCwgMHhhZmIzMDA1YywgMHhhZmIyMDA1OCwKLTB4YWZiMTAwNTQsIDB4YWZiMDAwNTAsIDB4YTNhMDAwMjcsIDB4YWZhZjAwMmMsCi0weDhlZTIwNGQ0LCAweDgwMjEsIDB4MzA0MjAwMDEsIDB4MTQ0MDAwMmEsCi0weGEzYTAwMDM3LCAweDhmODcwMGUwLCAweDhmODgwMGM0LCAweDhmODIwMGU4LAotMHhlMjIwMjMsIDB4MmM4MjEwMDAsIDB4NTA0MDAwMDEsIDB4MjQ4NDEwMDAsCi0weDQyMGMyLCAweDgwMTgyMSwgMHg4ZWU0MDBjOCwgMHg4ZWU1MDBjYywKLTB4MTAyMSwgMHhhMzI4MjEsIDB4YTMzMDJiLCAweDgyMjAyMSwKLTB4ODYyMDIxLCAweGFlZTQwMGM4LCAweGFlZTUwMGNjLCAweDhmODMwMGM4LAotMHgzYzAyMDAwYSwgMHgzNDQyZWZmZiwgMHgxMDMyMDIzLCAweDQ0MTAyYiwKLTB4MTA0MDAwMDMsIDB4M2MwMjAwMGEsIDB4MzQ0MmYwMDAsIDB4ODIyMDIxLAotMHg4MDE4MjEsIDB4OGVlNDAwYzAsIDB4OGVlNTAwYzQsIDB4MTAyMSwKLTB4YTMyODIxLCAweGEzMzAyYiwgMHg4MjIwMjEsIDB4ODYyMDIxLAotMHhhZWU0MDBjMCwgMHhhZWU1MDBjNCwgMHhhZjg4MDBjOCwgMHhhZjg3MDBlNCwKLTB4ODAwMzRjYywgMHhhZjg3MDBlOCwgMHgzYzAyMDAwMSwgMHg1NzEwMjEsCi0weDkwNDI4M2MwLCAweDEwNDAwMDBiLCAweDAsIDB4M2MxNDAwMDEsCi0weDI5N2EwMjEsIDB4OGU5NDgzYzQsIDB4M2MxMzAwMDEsIDB4Mjc3OTgyMSwKLTB4OGU3MzgzYzgsIDB4M2MxMjAwMDEsIDB4MjU3OTAyMSwgMHg4MDAzMTkzLAotMHg4ZTUyODNjYywgMHg4ZjgzMDBlMCwgMHg4ZjgyMDBlNCwgMHgxMDQzMDAwNywKLTB4ODgyMSwgMHg4ZjgyMDBlNCwgMHgyNDExMDAwMSwgMHg4YzQzMDAwMCwKLTB4OGM0NDAwMDQsIDB4YWZhMzAwMTgsIDB4YWZhNDAwMWMsIDB4MTYyMDAwMGUsCi0weDNjMDJmZmZmLCAweDhmODIwMGM0LCAweGFmYTIwMDEwLCAweDhmODIwMGM4LAotMHgzYzA0MDAwMSwgMHgyNDg0NTg3MCwgMHhhZmEyMDAxNCwgMHg4Zjg2MDBlMCwKLTB4OGY4NzAwZTQsIDB4M2MwNTAwMDYsIDB4YzAwMjQwMywgMHgzNGE1ZjAwMCwKLTB4ODAwMzRjYywgMHgwLCAweDhmYTMwMDFjLCAweDhmYjIwMDE4LAotMHgzMDc0ZmZmZiwgMHgyNjk0ZmZmYywgMHg2MjEwMjQsIDB4MTA0MDAwNTgsCi0weDI0MDk4MjEsIDB4M2MwMjAwODAsIDB4NjIxMDI0LCAweDEwNDAwMDBhLAotMHgzYzA0MDA0MCwgMHg4ZWUyMDA3YywgMHgyNDQyMDAwMSwgMHhhZWUyMDA3YywKLTB4OGVlMjAwN2MsIDB4OGVlMjAxZmMsIDB4MjQ0MjAwMDEsIDB4YWVlMjAxZmMsCi0weDgwMDM0YzYsIDB4OGVlMjAxZmMsIDB4M2MwNjAwMDQsIDB4M2MwYjAwMDEsCi0weDNjMGEwMDAyLCAweDNjMDUwMDEwLCAweDNjMDkwMDA4LCAweDhlZTIwMDgwLAotMHgzYzA4MDAyMCwgMHgzNDA3ODAwMCwgMHgyNDQyMDAwMSwgMHhhZWUyMDA4MCwKLTB4OGVlMjAwODAsIDB4OGZhMjAwMWMsIDB4NDQxODI0LCAweDEwNjYwMDIxLAotMHhjMzEwMmIsIDB4MTQ0MDAwMDcsIDB4MCwgMHgxMDZiMDAxMSwKLTB4MCwgMHgxMDZhMDAxNSwgMHgwLCAweDgwMDMwNDksCi0weDQyMDQyLCAweDEwNjUwMDIzLCAweGEzMTAyYiwgMHgxNDQwMDAwNSwKLTB4MCwgMHgxMDY5MDAxOSwgMHgwLCAweDgwMDMwNDksCi0weDQyMDQyLCAweDEwNjgwMDIxLCAweDAsIDB4ODAwMzA0OSwKLTB4NDIwNDIsIDB4OGVlMjAwMzQsIDB4MjQ0MjAwMDEsIDB4YWVlMjAwMzQsCi0weDhlZTIwMDM0LCAweDgwMDMwNDksIDB4NDIwNDIsIDB4OGVlMjAxZWMsCi0weDI0NDIwMDAxLCAweGFlZTIwMWVjLCAweDhlZTIwMWVjLCAweDgwMDMwNDksCi0weDQyMDQyLCAweDhlZTIwMWYwLCAweDI0NDIwMDAxLCAweGFlZTIwMWYwLAotMHg4ZWUyMDFmMCwgMHg4MDAzMDQ5LCAweDQyMDQyLCAweDhlZTIwMWY0LAotMHgyNDQyMDAwMSwgMHhhZWUyMDFmNCwgMHg4ZWUyMDFmNCwgMHg4MDAzMDQ5LAotMHg0MjA0MiwgMHg4ZWUyMDAzMCwgMHgyNDQyMDAwMSwgMHhhZWUyMDAzMCwKLTB4OGVlMjAwMzAsIDB4ODAwMzA0OSwgMHg0MjA0MiwgMHg4ZWUyMDFmOCwKLTB4MjQ0MjAwMDEsIDB4YWVlMjAxZjgsIDB4OGVlMjAxZjgsIDB4NDIwNDIsCi0weDEwODcwNDdjLCAweDAsIDB4ODAwMzAwZSwgMHgwLAotMHgzYzAyMDAwMSwgMHg1NzEwMjEsIDB4OTA0MjgzYjIsIDB4MTQ0MDAwODQsCi0weDI0MDIwMDAxLCAweDNjMDMwMDAxLCAweDc3MTgyMSwgMHg5MDYzODNiMywKLTB4MTQ2MjAwN2YsIDB4M2MwMjAxMDAsIDB4OGU0MzAwMDAsIDB4NjIxMDI0LAotMHgxMDQwMDA2ZiwgMHgyNDAyZmZmZiwgMHgxNDYyMDAwNSwgMHgyNDEwMDAwMSwKLTB4OTY0MzAwMDQsIDB4MzQwMmZmZmYsIDB4MTA2MjAwNzUsIDB4MCwKLTB4OTJlMjA0ZDgsIDB4MTQ0MDAwNzIsIDB4MCwgMHgzYzAyMDAwMSwKLTB4NTcxMDIxLCAweDhjNDI4M2I0LCAweDI4NDIwMDA1LCAweDEwNDAwMDIwLAotMHgzODIxLCAweDNjMDIwMDAxLCAweDU3MTAyMSwgMHg4YzQyODNiNCwKLTB4MTg0MDAwMTYsIDB4MjgyMSwgMHg5NjY2MDAwMCwgMHg1MjBjMCwKLTB4OTcxMDIxLCAweDk0NDI3NzdlLCAweDE0NDYwMDA5LCAweDk3MTAyMSwKLTB4OTQ0Mzc3ODAsIDB4OTY2MjAwMDIsIDB4MTQ2MjAwMDUsIDB4OTcxMDIxLAotMHg5NDQzNzc4MiwgMHg5NjYyMDAwNCwgMHg1MDYyMDAwOCwgMHgyNDA3MDAwMSwKLTB4M2MwMjAwMDEsIDB4NTcxMDIxLCAweDhjNDI4M2I0LCAweDI0YTUwMDAxLAotMHhhMjEwMmEsIDB4NTQ0MGZmZWUsIDB4NTIwYzAsIDB4MzBlMjAwZmYsCi0weDEwNDAwNDQwLCAweDAsIDB4ODAwMzBkNSwgMHgwLAotMHgyNDAyMDIxLCAweGMwMDIyZmUsIDB4MjQwNTAwMDYsIDB4MzA0NDAwMWYsCi0weDQyOGMwLCAweDJlNTEwMjEsIDB4OTQ0MjcyN2MsIDB4MzA0MjQwMDAsCi0weDE0NDAwNDM0LCAweGI3MTAyMSwgMHg5NDQzNzI3ZSwgMHg5NjYyMDAwMCwKLTB4MTQ2MjAwMGIsIDB4NDE4YzAsIDB4YjcxMDIxLCAweDk0NDM3MjgwLAotMHg5NjYyMDAwMiwgMHgxNDYyMDAwNiwgMHg0MThjMCwgMHhiNzEwMjEsCi0weDk0NDM3MjgyLCAweDk2NjIwMDA0LCAweDEwNjIwMDM1LCAweDQxOGMwLAotMHgyZTMxMDIxLCAweDk0NDI3MjdjLCAweDMwNDI4MDAwLCAweDE0NDAwNDIxLAotMHgyZTMxMDIxLCAweDk0NGI3MjdjLCAweDk2NjcwMDAwLCAweGIyOGMwLAotMHhiNzEwMjEsIDB4OTQ0MjczN2UsIDB4ODAwMzBiNywgMHgzMDIxLAotMHg0MjBjMCwgMHgyZTQxMDIxLCAweDk0NDM3MzdjLCAweDJlNDEwMjEsCi0weDk0NGI3MzdjLCAweDMwNjM4MDAwLCAweDE0NjAwMDEwLCAweGIyOGMwLAotMHhiNzEwMjEsIDB4OTQ0MjczN2UsIDB4MTQ0N2ZmZjUsIDB4MTYwMjAyMSwKLTB4YjcxMDIxLCAweDk0NDM3MzgwLCAweDk2NjIwMDAyLCAweDU0NjJmZmYxLAotMHg0MjBjMCwgMHhiNzEwMjEsIDB4OTQ0MzczODIsIDB4OTY2MjAwMDQsCi0weDU0NjJmZmVjLCAweDQyMGMwLCAweDI0MDYwMDAxLCAweDMwYzIwMGZmLAotMHgxMDQwMDQwMCwgMHgwLCAweDgwMDMwZDUsIDB4MCwKLTB4OTc0MzAyMDIsIDB4OTY0MjAwMDAsIDB4MTQ2MjAzZmEsIDB4MCwKLTB4OTc0MzAyMDQsIDB4OTY0MjAwMDIsIDB4MTQ2MjAzZjYsIDB4MCwKLTB4OTc0MzAyMDYsIDB4OTY0MjAwMDQsIDB4MTQ2MjAzZjIsIDB4MCwKLTB4OTI0MjAwMDAsIDB4M2EwMzAwMDEsIDB4MzA0MjAwMDEsIDB4NDMxMDI0LAotMHgxMDQwMDA3NCwgMHgyNDAyZmZmZiwgMHg4ZTYzMDAwMCwgMHgxNDYyMDAwNCwKLTB4MzQwMmZmZmYsIDB4OTY2MzAwMDQsIDB4MTA2MjAwNmYsIDB4MjQwZjAwMDIsCi0weDNjMDIwMDAxLCAweDU3MTAyMSwgMHg5MDQyODNiMiwgMHgxNDQwMDA2YSwKLTB4MjQwZjAwMDMsIDB4OTJlMjA0ZDgsIDB4NTQ0MDAwNjgsIDB4YWZhZjAwMmMsCi0weDNjMDIwMDAxLCAweDU3MTAyMSwgMHg4YzQyODNiNCwgMHgyODQyMDAwNSwKLTB4MTA0MDAwMjAsIDB4MzgyMSwgMHgzYzAyMDAwMSwgMHg1NzEwMjEsCi0weDhjNDI4M2I0LCAweDE4NDAwMDE2LCAweDI4MjEsIDB4OTY2NjAwMDAsCi0weDUyMGMwLCAweDk3MTAyMSwgMHg5NDQyNzc3ZSwgMHgxNDQ2MDAwOSwKLTB4OTcxMDIxLCAweDk0NDM3NzgwLCAweDk2NjIwMDAyLCAweDE0NjIwMDA1LAotMHg5NzEwMjEsIDB4OTQ0Mzc3ODIsIDB4OTY2MjAwMDQsIDB4NTA2MjAwMDgsCi0weDI0MDcwMDAxLCAweDNjMDIwMDAxLCAweDU3MTAyMSwgMHg4YzQyODNiNCwKLTB4MjRhNTAwMDEsIDB4YTIxMDJhLCAweDU0NDBmZmVlLCAweDUyMGMwLAotMHgzMGUyMDBmZiwgMHgxNDQwMDA0NCwgMHgyNDBmMDAwMywgMHg4MDAzNGM2LAotMHgwLCAweDI0MDIwMjEsIDB4YzAwMjJmZSwgMHgyNDA1MDAwNiwKLTB4MzA0NDAwMWYsIDB4NDI4YzAsIDB4MmU1MTAyMSwgMHg5NDQyNzI3YywKLTB4MzA0MjQwMDAsIDB4MTQ0MDAzYWYsIDB4YjcxMDIxLCAweDk0NDM3MjdlLAotMHg5NjYyMDAwMCwgMHgxNDYyMDAwYiwgMHg0MThjMCwgMHhiNzEwMjEsCi0weDk0NDM3MjgwLCAweDk2NjIwMDAyLCAweDE0NjIwMDA2LCAweDQxOGMwLAotMHhiNzEwMjEsIDB4OTQ0MzcyODIsIDB4OTY2MjAwMDQsIDB4MTA2MjAwMjcsCi0weDQxOGMwLCAweDJlMzEwMjEsIDB4OTQ0MjcyN2MsIDB4MzA0MjgwMDAsCi0weDE0NDAwMzljLCAweDJlMzEwMjEsIDB4OTQ0YjcyN2MsIDB4OTY2NzAwMDAsCi0weGIyOGMwLCAweGI3MTAyMSwgMHg5NDQyNzM3ZSwgMHg4MDAzMTNjLAotMHgzMDIxLCAweDQyMGMwLCAweDJlNDEwMjEsIDB4OTQ0MzczN2MsCi0weDJlNDEwMjEsIDB4OTQ0YjczN2MsIDB4MzA2MzgwMDAsIDB4MTQ2MDAwMTAsCi0weGIyOGMwLCAweGI3MTAyMSwgMHg5NDQyNzM3ZSwgMHgxNDQ3ZmZmNSwKLTB4MTYwMjAyMSwgMHhiNzEwMjEsIDB4OTQ0MzczODAsIDB4OTY2MjAwMDIsCi0weDU0NjJmZmYxLCAweDQyMGMwLCAweGI3MTAyMSwgMHg5NDQzNzM4MiwKLTB4OTY2MjAwMDQsIDB4NTQ2MmZmZWMsIDB4NDIwYzAsIDB4MjQwNjAwMDEsCi0weDMwYzIwMGZmLCAweDEwNDAwMzdiLCAweDAsIDB4ODAwMzE0ZiwKLTB4MjQwZjAwMDMsIDB4MjQwZjAwMDEsIDB4YWZhZjAwMmMsIDB4OGY0MjAyNjAsCi0weDU0MTAyYiwgMHgxMDQwMDAzYSwgMHgwLCAweDhmODMwMGU0LAotMHg4ZjgyMDBlMCwgMHgxMDYyMDAwMywgMHgyNDYzMDAwOCwgMHhhZjgzMDBlNCwKLTB4YWY4MzAwZTgsIDB4OGVlNDAwYzAsIDB4OGVlNTAwYzQsIDB4MjgwMTgyMSwKLTB4MTAyMSwgMHhhMzI4MjEsIDB4YTMzMDJiLCAweDgyMjAyMSwKLTB4ODYyMDIxLCAweGFlZTQwMGMwLCAweGFlZTUwMGM0LCAweDhlZTIwMDU4LAotMHgyNDQyMDAwMSwgMHhhZWUyMDA1OCwgMHg4ZWUyMDA1OCwgMHg4ZWUyMDA3YywKLTB4MjQ0MjAwMDEsIDB4YWVlMjAwN2MsIDB4OGVlMjAwN2MsIDB4OGY4MjAwZTAsCi0weGFmYTIwMDEwLCAweDhmODIwMGU0LCAweDNjMDQwMDAxLCAweDI0ODQ1ODc4LAotMHhhZmEyMDAxNCwgMHg4ZmE2MDAxOCwgMHg4ZmE3MDAxYywgMHgzYzA1MDAwNiwKLTB4YzAwMjQwMywgMHgzNGE1ZjAwMywgMHg4MDAzNGNjLCAweDAsCi0weDhlZTI1MjQwLCAweGFmYTIwMDEwLCAweDhlZTI1MjQ0LCAweDNjMDQwMDAxLAotMHgyNDg0NTg4NCwgMHhhZmEyMDAxNCwgMHg4ZWU2MGUxMCwgMHg4ZWU3MGUxOCwKLTB4M2MwNTAwMDYsIDB4YzAwMjQwMywgMHgzNGE1ZjAwMiwgMHg4ZWUyMDFjMCwKLTB4MjQ0MjAwMDEsIDB4YWVlMjAxYzAsIDB4OGVlMjAwMDAsIDB4OGVlMzAxYzAsCi0weDI0MDNmZmJmLCAweDQzMTAyNCwgMHg4MDAzNDcwLCAweGFlZTIwMDAwLAotMHg5NmUyMDQ2OCwgMHg1NDEwMmIsIDB4MTA0MDAwMDMsIDB4MCwKLTB4MjQwZjAwMDEsIDB4YTNhZjAwMjcsIDB4MTI4MDAzMDEsIDB4MjQxNjAwMDcsCi0weDI0MTUwMDQwLCAweDI0MWUwMDAxLCAweDI0MGUwMDEyLCAweDhlZTI3MjRjLAotMHg4ZjQzMDI4MCwgMHgyNDQyMDAwMSwgMHgzMDQyMDdmZiwgMHgxMDYyMDJkMywKLTB4MCwgMHg5M2EyMDAyNywgMHgxMDQwMDAxNCwgMHgwLAotMHg4ZWUzNTI0MCwgMHg4ZWUyNTI0NCwgMHgxMDYyMDAwOSwgMHgyNmVkNTI0NCwKLTB4OGVlNjUyNDQsIDB4OGVlMzUyNDQsIDB4MjExNDAsIDB4MjQ0MjUyNDgsCi0weDJlMjgwMjEsIDB4MjQ2MzAwMDEsIDB4ODAwMzFiZiwgMHgzMDZiMDBmZiwKLTB4OTJlMjcyNDgsIDB4MTQ0MGZmY2EsIDB4MCwgMHg4ZWUyMDFlMCwKLTB4MjQ0MjAwMDEsIDB4YWVlMjAxZTAsIDB4OGVlMjAxZTAsIDB4OGVlMzBlMTAsCi0weDhlZTIwZTE4LCAweDEwNjJmZmMyLCAweDI2ZWQwZTE4LCAweDhlZTYwZTE4LAotMHg4ZWUzMGUxOCwgMHgyMTE0MCwgMHgyNDQyMGUyMCwgMHgyZTI4MDIxLAotMHgyNDYzMDAwMSwgMHgzMDZiMDFmZiwgMHg5NmUyMDQ2YSwgMHgzMDQyMDAxMCwKLTB4MTA0MDAwMTksIDB4MCwgMHg5NjQyMDAwYywgMHgzNDBmODEwMCwKLTB4MTQ0ZjAwMTUsIDB4MCwgMHgzYzAyMDAwMSwgMHg1NzEwMjEsCi0weDkwNDI4M2MwLCAweDE0NDAwMDEwLCAweDAsIDB4OTY0MjAwMGUsCi0weGE2MDIwMDE2LCAweDhlNDIwMDA4LCAweDhlNDMwMDA0LCAweDhlNDQwMDAwLAotMHgyNjk0ZmZmYywgMHhhZTQyMDAwYywgMHhhZTQzMDAwOCwgMHhhZTQ0MDAwNCwKLTB4OTYwMjAwMGUsIDB4MjY3MzAwMDQsIDB4MjQwZjAwMDEsIDB4YTNhZjAwMzcsCi0weDM0NDIwMjAwLCAweGE2MDIwMDBlLCAweDhlMDIwMDAwLCAweDhlMDMwMDA0LAotMHgzYzA0MDAwMSwgMHgzNDg0MzgwMCwgMHgzMDZhMDAwNywgMHgyNmE5ODIzLAotMHgzNjQxMDIxLCAweDI2MjEwMmIsIDB4MTA0MDAwMDUsIDB4MjhhYTAyMSwKLTB4MjY0MTAyMywgMHgzNjIxODIzLCAweDNjMDIwMDIwLCAweDQzOTgyMywKLTB4MjY4MjAwMDcsIDB4MjQwNGZmZjgsIDB4OTYwMzAwMGEsIDB4NDQ2MDI0LAotMHg2YTE4MjEsIDB4NmMxMDJiLCAweDEwNDAwMDAyLCAweDE4MDM4MjEsCi0weDYwMzgyMSwgMHhhZTEzMDAxOCwgMHg4Zjg4MDEyMCwgMHgyNGUyMDAwNywKLTB4NDQzODI0LCAweDI3NjIzODAwLCAweDI1MDkwMDIwLCAweDEyMjEwMmIsCi0weDUwNDAwMDAxLCAweDI3NjkzMDAwLCAweDhmODIwMTI4LCAweDExMjIwMDA0LAotMHgwLCAweDhmODIwMTI0LCAweDE1MjIwMDA3LCAweDE0MDE4MjEsCi0weDhlZTIwMWE0LCAweDg4MjEsIDB4MjQ0MjAwMDEsIDB4YWVlMjAxYTQsCi0weDgwMDMyNGMsIDB4OGVlMjAxYTQsIDB4OGUwNDAwMDAsIDB4OGUwNTAwMDQsCi0weDEwMjEsIDB4YWQxMzAwMDgsIDB4YTUwNzAwMGUsIDB4YWQxNjAwMTgsCi0weGFkMDYwMDFjLCAweGEzMzAyYiwgMHhhMzI4MjMsIDB4ODIyMDIzLAotMHg4NjIwMjMsIDB4YWQwNDAwMDAsIDB4YWQwNTAwMDQsIDB4OGVlMjA0YzAsCi0weGFkMDIwMDEwLCAweGFmODkwMTIwLCAweDkyZTI0ZTIwLCAweDE0NDAwMDMzLAotMHgyNDExMDAwMSwgMHg4ZWUyNGUzMCwgMHgyMTBjMCwgMHgyNDQyNTAzOCwKLTB4MmUyMjAyMSwgMHg4YzgyMDAwMCwgMHgxNDU2MDAxZiwgMHgwLAotMHg4ZWUzNGUzMCwgMHg4ZWUyNGUzNCwgMHgxMDYyMDAxYiwgMHgwLAotMHg4YzgyMDAwNCwgMHgyNDQyMDAwMSwgMHhhYzgyMDAwNCwgMHg4ZWUyNGUzNCwKLTB4OGVlMzRlMzAsIDB4MjQ0MjAwMDEsIDB4MTA1NTAwMDcsIDB4MCwKLTB4OGVlMjRlMzQsIDB4MjQ0MjAwMDEsIDB4MTA2MjAwMDUsIDB4MCwKLTB4ODAwMzIzOSwgMHgwLCAweDE0NjAwMDA1LCAweDAsCi0weDhmODIwMTI4LCAweDI0NDIwMDIwLCAweGFmODIwMTI4LCAweDhmODIwMTI4LAotMHg4YzgyMDAwNCwgMHgyYzQyMDAxMSwgMHg1MDQwMDAxMCwgMHhhYzgwMDAwMCwKLTB4ODAwMzI0YywgMHgwLCAweDhlZTI0ZTMwLCAweDI0NDIwMDAxLAotMHg1MDU1MDAwMywgMHgxMDIxLCAweDhlZTI0ZTMwLCAweDI0NDIwMDAxLAotMHhhZWUyNGUzMCwgMHg4ZWUyNGUzMCwgMHgyMTBjMCwgMHgyNDQyNTAzOCwKLTB4MmUyMjAyMSwgMHhhYzk2MDAwMCwgMHhhYzllMDAwNCwgMHgxNjIwMDAxOCwKLTB4M2MwNTAwMDYsIDB4OGUwMjAwMTgsIDB4M2MwNDAwMDEsIDB4MjQ4NDU4OTAsCi0weGFmYTIwMDEwLCAweDhlMDIwMDAwLCAweDhlMDMwMDA0LCAweDM0YTVmMDA5LAotMHgyMDAzMDIxLCAweGMwMDI0MDMsIDB4YWZhMzAwMTQsIDB4OTNhMjAwMzcsCi0weDEwNDAwMjE2LCAweDM0MGY4MTAwLCAweDhlNDIwMDA0LCAweDhlNDMwMDA4LAotMHg4ZTQ0MDAwYywgMHhhNjRmMDAwYywgMHhhZTQyMDAwMCwgMHhhZTQzMDAwNCwKLTB4YWU0NDAwMDgsIDB4OTYwMjAwMTYsIDB4ODAwMzQ3MCwgMHhhNjQyMDAwZSwKLTB4MTRlYzAxNjgsIDB4MjhhMTgyMywgMHg5NjBjMDAwYSwgMHg5NjAzMDAwZSwKLTB4MjhhMTAyMywgMHhhNjAyMDAwYSwgMHgzNDYyMDAwNCwgMHhhNjAyMDAwZSwKLTB4OGY4ODAxMjAsIDB4Mjc2MjM4MDAsIDB4MjUwOTAwMjAsIDB4MTIyMTAyYiwKLTB4MTQ0MDAwMDIsIDB4MzA2YWZmZmYsIDB4Mjc2OTMwMDAsIDB4OGY4MjAxMjgsCi0weDExMjIwMDA0LCAweDAsIDB4OGY4MjAxMjQsIDB4MTUyMjAwMDcsCi0weDI0MDQwMDIwLCAweDhlZTIwMWE0LCAweDg4MjEsIDB4MjQ0MjAwMDEsCi0weGFlZTIwMWE0LCAweDgwMDMyY2EsIDB4OGVlMjAxYTQsIDB4OGVlNTcyNGMsCi0weDhlZTYwNDkwLCAweDhlZTcwNDk0LCAweGE1MDQwMDBlLCAweDI0MDQwMDA0LAotMHhhZDEwMDAwOCwgMHhhZDA0MDAxOCwgMHg1Mjk0MCwgMHhhMDE4MjEsCi0weDEwMjEsIDB4ZTMzODIxLCAweGUzMjAyYiwgMHhjMjMwMjEsCi0weGM0MzAyMSwgMHhhZDA2MDAwMCwgMHhhZDA3MDAwNCwgMHg4ZWUyNzI0YywKLTB4YWQwMjAwMWMsIDB4OGVlMjA0YzQsIDB4YWQwMjAwMTAsIDB4YWY4OTAxMjAsCi0weDkyZTI0ZTIwLCAweDE0NDAwMDMzLCAweDI0MTEwMDAxLCAweDhlZTI0ZTMwLAotMHgyMTBjMCwgMHgyNDQyNTAzOCwgMHgyZTIyMDIxLCAweDhjODIwMDAwLAotMHgxNDU2MDAxZiwgMHgwLCAweDhlZTM0ZTMwLCAweDhlZTI0ZTM0LAotMHgxMDYyMDAxYiwgMHgwLCAweDhjODIwMDA0LCAweDI0NDIwMDAxLAotMHhhYzgyMDAwNCwgMHg4ZWUyNGUzNCwgMHg4ZWUzNGUzMCwgMHgyNDQyMDAwMSwKLTB4MTA1NTAwMDcsIDB4MCwgMHg4ZWUyNGUzNCwgMHgyNDQyMDAwMSwKLTB4MTA2MjAwMDUsIDB4MCwgMHg4MDAzMmI3LCAweDAsCi0weDE0NjAwMDA1LCAweDAsIDB4OGY4MjAxMjgsIDB4MjQ0MjAwMjAsCi0weGFmODIwMTI4LCAweDhmODIwMTI4LCAweDhjODIwMDA0LCAweDJjNDIwMDExLAotMHg1MDQwMDAxMCwgMHhhYzgwMDAwMCwgMHg4MDAzMmNhLCAweDAsCi0weDhlZTI0ZTMwLCAweDI0NDIwMDAxLCAweDUwNTUwMDAzLCAweDEwMjEsCi0weDhlZTI0ZTMwLCAweDI0NDIwMDAxLCAweGFlZTI0ZTMwLCAweDhlZTI0ZTMwLAotMHgyMTBjMCwgMHgyNDQyNTAzOCwgMHgyZTIyMDIxLCAweGFjOTYwMDAwLAotMHhhYzllMDAwNCwgMHgxNjIwMDAwZCwgMHgwLCAweGE2MGMwMDBhLAotMHhhNjBhMDAwZSwgMHg4ZjgyMDEwMCwgMHhhZmEyMDAxMCwgMHg4ZjgyMDEwNCwKLTB4M2MwNDAwMDEsIDB4MjQ4NDU4OWMsIDB4M2MwNTAwMDYsIDB4YWZhMjAwMTQsCi0weDhlZTY3MjRjLCAweDgwMDM0M2IsIDB4MzRhNWYwMGIsIDB4M2MwMTAwMDEsCi0weDM3MDgyMSwgMHhhMDIwODNjMCwgMHhhZGFiMDAwMCwgMHg4ZWUyMDFkOCwKLTB4OGVlMzcyNGMsIDB4MjQ0MmZmZmYsIDB4YWVlMjAxZDgsIDB4OGVlMjAxZDgsCi0weDI0NjMwMDAxLCAweDMwNjMwN2ZmLCAweDI2ZTI1MjQ0LCAweDE1YTIwMDA2LAotMHhhZWUzNzI0YywgMHg4ZWUyMDFkMCwgMHgyNDQyZmZmZiwgMHhhZWUyMDFkMCwKLTB4ODAwMzJlZiwgMHg4ZWUyMDFkMCwgMHg4ZWUyMDFjYywgMHgyNDQyZmZmZiwKLTB4YWVlMjAxY2MsIDB4OGVlMjAxY2MsIDB4OGY0MjAyNDAsIDB4MTA0MDAwNzMsCi0weDAsIDB4OGVlMjBlMWMsIDB4MjQ0MjAwMDEsIDB4YWVlMjBlMWMsCi0weDhmNDMwMjQwLCAweDQzMTAyYiwgMHgxNDQwMDE3NiwgMHhhMDIxLAotMHg4ZjgzMDEyMCwgMHgyNzYyMzgwMCwgMHgyNDY2MDAyMCwgMHhjMjEwMmIsCi0weDUwNDAwMDAxLCAweDI3NjYzMDAwLCAweDhmODIwMTI4LCAweDEwYzIwMDA0LAotMHgwLCAweDhmODIwMTI0LCAweDE0YzIwMDA3LCAweDAsCi0weDhlZTIwMWE0LCAweDg4MjEsIDB4MjQ0MjAwMDEsIDB4YWVlMjAxYTQsCi0weDgwMDMzNGYsIDB4OGVlMjAxYTQsIDB4OGVlMjcyNGMsIDB4YWM2MjAwMWMsCi0weDhlZTQwNGE4LCAweDhlZTUwNGFjLCAweDI0NjIwMDFjLCAweGFjNjIwMDA4LAotMHgyNDAyMDAwOCwgMHhhNDYyMDAwZSwgMHgyNDAyMDAxMSwgMHhhYzYyMDAxOCwKLTB4YWM2NDAwMDAsIDB4YWM2NTAwMDQsIDB4OGVlMjA0YzQsIDB4YWM2MjAwMTAsCi0weGFmODYwMTIwLCAweDkyZTI0ZTIwLCAweDE0NDAwMDMzLCAweDI0MTEwMDAxLAotMHg4ZWUyNGUzMCwgMHgyMTBjMCwgMHgyNDQyNTAzOCwgMHgyZTIyMDIxLAotMHg4YzgyMDAwMCwgMHgxNDRlMDAxZiwgMHgwLCAweDhlZTM0ZTMwLAotMHg4ZWUyNGUzNCwgMHgxMDYyMDAxYiwgMHgwLCAweDhjODIwMDA0LAotMHgyNDQyMDAwMSwgMHhhYzgyMDAwNCwgMHg4ZWUyNGUzNCwgMHg4ZWUzNGUzMCwKLTB4MjQ0MjAwMDEsIDB4MTA1NTAwMDcsIDB4MCwgMHg4ZWUyNGUzNCwKLTB4MjQ0MjAwMDEsIDB4MTA2MjAwMDUsIDB4MCwgMHg4MDAzMzNjLAotMHgwLCAweDE0NjAwMDA1LCAweDAsIDB4OGY4MjAxMjgsCi0weDI0NDIwMDIwLCAweGFmODIwMTI4LCAweDhmODIwMTI4LCAweDhjODIwMDA0LAotMHgyYzQyMDAxMSwgMHg1MDQwMDAxMCwgMHhhYzgwMDAwMCwgMHg4MDAzMzRmLAotMHgwLCAweDhlZTI0ZTMwLCAweDI0NDIwMDAxLCAweDUwNTUwMDAzLAotMHgxMDIxLCAweDhlZTI0ZTMwLCAweDI0NDIwMDAxLCAweGFlZTI0ZTMwLAotMHg4ZWUyNGUzMCwgMHgyMTBjMCwgMHgyNDQyNTAzOCwgMHgyZTIyMDIxLAotMHhhYzhlMDAwMCwgMHhhYzllMDAwNCwgMHg1NjIwMDAwZCwgMHgyNDExMDAwMSwKLTB4OGVlMjcyNGMsIDB4M2MwNDAwMDEsIDB4MjQ4NDU4YTgsIDB4YWZhMDAwMTQsCi0weGFmYTIwMDEwLCAweDhlZTY3MjRjLCAweDhmNDcwMjgwLCAweDNjMDUwMDA5LAotMHgzNGE1ZjAwOCwgMHhjMDAyNDAzLCAweGFmYWUwMDQ4LCAweDhmYWUwMDQ4LAotMHg1NjIwMDAwMSwgMHhhZWUwMGUxYywgMHg4ZWUyMDE4OCwgMHgyNDQyMDAwMSwKLTB4YWVlMjAxODgsIDB4ODAwMzNjOCwgMHg4ZWUyMDE4OCwgMHg4ZjgzMDEyMCwKLTB4Mjc2MjM4MDAsIDB4MjQ2NjAwMjAsIDB4YzIxMDJiLCAweDUwNDAwMDAxLAotMHgyNzY2MzAwMCwgMHg4ZjgyMDEyOCwgMHgxMGMyMDAwNCwgMHgwLAotMHg4ZjgyMDEyNCwgMHgxNGMyMDAwNywgMHgwLCAweDhlZTIwMWE0LAotMHg4ODIxLCAweDI0NDIwMDAxLCAweGFlZTIwMWE0LCAweDgwMDMzYmEsCi0weDhlZTIwMWE0LCAweDhlZTI3MjRjLCAweGFjNjIwMDFjLCAweDhlZTQwNGE4LAotMHg4ZWU1MDRhYywgMHgyNDYyMDAxYywgMHhhYzYyMDAwOCwgMHgyNDAyMDAwOCwKLTB4YTQ2MjAwMGUsIDB4MjQwMjAwMTEsIDB4YWM2MjAwMTgsIDB4YWM2NDAwMDAsCi0weGFjNjUwMDA0LCAweDhlZTIwNGM0LCAweGFjNjIwMDEwLCAweGFmODYwMTIwLAotMHg5MmUyNGUyMCwgMHgxNDQwMDAzMywgMHgyNDExMDAwMSwgMHg4ZWUyNGUzMCwKLTB4MjEwYzAsIDB4MjQ0MjUwMzgsIDB4MmUyMjAyMSwgMHg4YzgyMDAwMCwKLTB4MTQ0ZTAwMWYsIDB4MCwgMHg4ZWUzNGUzMCwgMHg4ZWUyNGUzNCwKLTB4MTA2MjAwMWIsIDB4MCwgMHg4YzgyMDAwNCwgMHgyNDQyMDAwMSwKLTB4YWM4MjAwMDQsIDB4OGVlMjRlMzQsIDB4OGVlMzRlMzAsIDB4MjQ0MjAwMDEsCi0weDEwNTUwMDA3LCAweDAsIDB4OGVlMjRlMzQsIDB4MjQ0MjAwMDEsCi0weDEwNjIwMDA1LCAweDAsIDB4ODAwMzNhNywgMHgwLAotMHgxNDYwMDAwNSwgMHgwLCAweDhmODIwMTI4LCAweDI0NDIwMDIwLAotMHhhZjgyMDEyOCwgMHg4ZjgyMDEyOCwgMHg4YzgyMDAwNCwgMHgyYzQyMDAxMSwKLTB4NTA0MDAwMTAsIDB4YWM4MDAwMDAsIDB4ODAwMzNiYSwgMHgwLAotMHg4ZWUyNGUzMCwgMHgyNDQyMDAwMSwgMHg1MDU1MDAwMywgMHgxMDIxLAotMHg4ZWUyNGUzMCwgMHgyNDQyMDAwMSwgMHhhZWUyNGUzMCwgMHg4ZWUyNGUzMCwKLTB4MjEwYzAsIDB4MjQ0MjUwMzgsIDB4MmUyMjAyMSwgMHhhYzhlMDAwMCwKLTB4YWM5ZTAwMDQsIDB4MTYyMDAwMGQsIDB4MCwgMHg4ZWUyNzI0YywKLTB4M2MwNDAwMDEsIDB4MjQ4NDU4YTgsIDB4YWZhMDAwMTQsIDB4YWZhMjAwMTAsCi0weDhlZTY3MjRjLCAweDhmNDcwMjgwLCAweDNjMDUwMDA5LCAweDM0YTVmMDA4LAotMHhjMDAyNDAzLCAweGFmYWUwMDQ4LCAweDhmYWUwMDQ4LCAweDhlZTIwMTc0LAotMHgyNDQyMDAwMSwgMHhhZWUyMDE3NCwgMHg4ZWUyMDE3NCwgMHg4MDAzNDZlLAotMHhhMDIxLCAweDk2MGMwMDBhLCAweDE4MzEwMmIsIDB4NTQ0MDAwMDEsCi0weDE4MDE4MjEsIDB4YTYwMzAwMGEsIDB4OGY4ODAxMjAsIDB4Mjc2MjM4MDAsCi0weDI1MDkwMDIwLCAweDEyMjEwMmIsIDB4NTA0MDAwMDEsIDB4Mjc2OTMwMDAsCi0weDhmODIwMTI4LCAweDExMjIwMDA0LCAweDAsIDB4OGY4MjAxMjQsCi0weDE1MjIwMDA3LCAweDI0MDQwMDIwLCAweDhlZTIwMWE0LCAweDg4MjEsCi0weDI0NDIwMDAxLCAweGFlZTIwMWE0LCAweDgwMDM0MmYsIDB4OGVlMjAxYTQsCi0weDhlZTU3MjRjLCAweDhlZTYwNDkwLCAweDhlZTcwNDk0LCAweGE1MDQwMDBlLAotMHgyNDA0MDAwNCwgMHhhZDEwMDAwOCwgMHhhZDA0MDAxOCwgMHg1Mjk0MCwKLTB4YTAxODIxLCAweDEwMjEsIDB4ZTMzODIxLCAweGUzMjAyYiwKLTB4YzIzMDIxLCAweGM0MzAyMSwgMHhhZDA2MDAwMCwgMHhhZDA3MDAwNCwKLTB4OGVlMjcyNGMsIDB4YWQwMjAwMWMsIDB4OGVlMjA0YzQsIDB4YWQwMjAwMTAsCi0weGFmODkwMTIwLCAweDkyZTI0ZTIwLCAweDE0NDAwMDMzLCAweDI0MTEwMDAxLAotMHg4ZWUyNGUzMCwgMHgyMTBjMCwgMHgyNDQyNTAzOCwgMHgyZTIyMDIxLAotMHg4YzgyMDAwMCwgMHgxNDU2MDAxZiwgMHgwLCAweDhlZTM0ZTMwLAotMHg4ZWUyNGUzNCwgMHgxMDYyMDAxYiwgMHgwLCAweDhjODIwMDA0LAotMHgyNDQyMDAwMSwgMHhhYzgyMDAwNCwgMHg4ZWUyNGUzNCwgMHg4ZWUzNGUzMCwKLTB4MjQ0MjAwMDEsIDB4MTA1NTAwMDcsIDB4MCwgMHg4ZWUyNGUzNCwKLTB4MjQ0MjAwMDEsIDB4MTA2MjAwMDUsIDB4MCwgMHg4MDAzNDFjLAotMHgwLCAweDE0NjAwMDA1LCAweDAsIDB4OGY4MjAxMjgsCi0weDI0NDIwMDIwLCAweGFmODIwMTI4LCAweDhmODIwMTI4LCAweDhjODIwMDA0LAotMHgyYzQyMDAxMSwgMHg1MDQwMDAxMCwgMHhhYzgwMDAwMCwgMHg4MDAzNDJmLAotMHgwLCAweDhlZTI0ZTMwLCAweDI0NDIwMDAxLCAweDUwNTUwMDAzLAotMHgxMDIxLCAweDhlZTI0ZTMwLCAweDI0NDIwMDAxLCAweGFlZTI0ZTMwLAotMHg4ZWUyNGUzMCwgMHgyMTBjMCwgMHgyNDQyNTAzOCwgMHgyZTIyMDIxLAotMHhhYzk2MDAwMCwgMHhhYzllMDAwNCwgMHgxNjIwMDAxZCwgMHgwLAotMHhhNjBjMDAwYSwgMHg4ZjgyMDEwMCwgMHhhZmEyMDAxMCwgMHg4ZjgyMDEwNCwKLTB4M2MwNDAwMDEsIDB4MjQ4NDU4OWMsIDB4M2MwNTAwMDYsIDB4YWZhMjAwMTQsCi0weDhlZTY3MjRjLCAweDM0YTVmMDBkLCAweGMwMDI0MDMsIDB4MjAwMzgyMSwKLTB4OTNhMjAwMzcsIDB4MTA0MDAwMzEsIDB4MzQwZjgxMDAsIDB4OGU0MjAwMDQsCi0weDhlNDMwMDA4LCAweDhlNDQwMDBjLCAweGE2NGYwMDBjLCAweGFlNDIwMDAwLAotMHhhZTQzMDAwNCwgMHhhZTQ0MDAwOCwgMHg5NjAyMDAxNiwgMHhhNjQyMDAwZSwKLTB4OTYwMjAwMGUsIDB4MzA0MmZkZmYsIDB4ODAwMzQ3MCwgMHhhNjAyMDAwZSwKLTB4OGVlMjAxZDgsIDB4MjQ0MmZmZmYsIDB4YWVlMjAxZDgsIDB4OGVlMjAxZDgsCi0weDhlZTIwMWNjLCAweDNjMDQwMDFmLCAweDNjMDEwMDAxLCAweDM3MDgyMSwKLTB4YTAzZTgzYzAsIDB4MjQ0MmZmZmYsIDB4YWVlMjAxY2MsIDB4OTYwMzAwMGEsCi0weDM0ODRmZmZmLCAweDhlZTIwMWNjLCAweDZhMTgyMSwgMHgyNjM5ODIxLAotMHg5MzIwMmIsIDB4MTA4MDAwMDMsIDB4M2MwMmZmZjUsIDB4MzQ0MjEwMDAsCi0weDI2Mjk4MjEsIDB4YWRhYjAwMDAsIDB4OGVlMjcyNGMsIDB4MjQ0MjAwMDEsCi0weDMwNDIwN2ZmLCAweGFlZTI3MjRjLCAweDhmNDIwMjQwLCAweDEwNDAwMDA0LAotMHgyODNhMDIzLCAweDhlZTIwZTFjLCAweDI0NDIwMDAxLCAweGFlZTIwZTFjLAotMHhhM2EwMDAyNywgMHgxNjgwZmQyOSwgMHgwLCAweDEyODAwMDI0LAotMHgwLCAweDNjMDEwMDAxLCAweDM3MDgyMSwgMHhhYzM0ODNjNCwKLTB4M2MwMTAwMDEsIDB4MzcwODIxLCAweGFjMzM4M2M4LCAweDNjMDEwMDAxLAotMHgzNzA4MjEsIDB4YWMzMjgzY2MsIDB4OTNhMjAwMzcsIDB4MTA0MDAwMDgsCi0weDAsIDB4M2MwMjAwMDEsIDB4NTcxMDIxLCAweDhjNDI4M2NjLAotMHgyNDQyMDAwNCwgMHgzYzAxMDAwMSwgMHgzNzA4MjEsIDB4YWMyMjgzY2MsCi0weDhlZTI3MjRjLCAweDhmNDMwMjgwLCAweDI0NDIwMDAxLCAweDMwNDIwN2ZmLAotMHgxNDYyMDAwNiwgMHgwLCAweDhlZTIwMWM0LCAweDI0NDIwMDAxLAotMHhhZWUyMDFjNCwgMHg4MDAzNGNjLCAweDhlZTIwMWM0LCAweDhlZTIwMWJjLAotMHgyNDQyMDAwMSwgMHhhZWUyMDFiYywgMHg4MDAzNGNjLCAweDhlZTIwMWJjLAotMHg5N2E0MDAxZSwgMHgyNDg0ZmZmYywgMHg4MDE4MjEsIDB4OGVlNDAwYzAsCi0weDhlZTUwMGM0LCAweDEwMjEsIDB4YTMyODIxLCAweGEzMzAyYiwKLTB4ODIyMDIxLCAweDg2MjAyMSwgMHhhZWU0MDBjMCwgMHhhZWU1MDBjNCwKLTB4OGZhZjAwMmMsIDB4MjQwMjAwMDIsIDB4MTFlMjAwMGYsIDB4MjllMjAwMDMsCi0weDE0NDAwMDE3LCAweDI0MDIwMDAzLCAweDE1ZTIwMDE1LCAweDAsCi0weDhlZTIwMGQwLCAweDhlZTMwMGQ0LCAweDI0NjMwMDAxLCAweDJjNjQwMDAxLAotMHg0NDEwMjEsIDB4YWVlMjAwZDAsIDB4YWVlMzAwZDQsIDB4OGVlMjAwZDAsCi0weDgwMDM0YzYsIDB4OGVlMzAwZDQsIDB4OGVlMjAwZDgsIDB4OGVlMzAwZGMsCi0weDI0NjMwMDAxLCAweDJjNjQwMDAxLCAweDQ0MTAyMSwgMHhhZWUyMDBkOCwKLTB4YWVlMzAwZGMsIDB4OGVlMjAwZDgsIDB4ODAwMzRjNiwgMHg4ZWUzMDBkYywKLTB4OGVlMjAwYzgsIDB4OGVlMzAwY2MsIDB4MjQ2MzAwMDEsIDB4MmM2NDAwMDEsCi0weDQ0MTAyMSwgMHhhZWUyMDBjOCwgMHhhZWUzMDBjYywgMHg4ZWUyMDBjOCwKLTB4OGVlMzAwY2MsIDB4OGY4MzAwZTQsIDB4OGY4MjAwZTAsIDB4MTA2MjAwMDMsCi0weDI0NjMwMDA4LCAweGFmODMwMGU0LCAweGFmODMwMGU4LCAweDhmYmYwMDcwLAotMHg4ZmJlMDA2YywgMHg4ZmI2MDA2OCwgMHg4ZmI1MDA2NCwgMHg4ZmI0MDA2MCwKLTB4OGZiMzAwNWMsIDB4OGZiMjAwNTgsIDB4OGZiMTAwNTQsIDB4OGZiMDAwNTAsCi0weDNlMDAwMDgsIDB4MjdiZDAwNzgsIDB4MjdiZGZmYjAsIDB4YWZiNTAwNDQsCi0weGE4MjEsIDB4YWZiMDAwMzAsIDB4ODAyMSwgMHhhZmJmMDA0YywKLTB4YWZiNjAwNDgsIDB4YWZiNDAwNDAsIDB4YWZiMzAwM2MsIDB4YWZiMjAwMzgsCi0weGFmYjEwMDM0LCAweDhlZTIwNGQ0LCAweDI0MTQwMDAxLCAweDMwNDIwMDAxLAotMHgxNDQwMDAyYSwgMHhiMDIxLCAweDhmODcwMGUwLCAweDhmODgwMGM0LAotMHg4ZjgyMDBlOCwgMHhlMjIwMjMsIDB4MmM4MjEwMDAsIDB4NTA0MDAwMDEsCi0weDI0ODQxMDAwLCAweDQyMGMyLCAweDgwMTgyMSwgMHg4ZWU0MDBjOCwKLTB4OGVlNTAwY2MsIDB4MTAyMSwgMHhhMzI4MjEsIDB4YTMzMDJiLAotMHg4MjIwMjEsIDB4ODYyMDIxLCAweGFlZTQwMGM4LCAweGFlZTUwMGNjLAotMHg4ZjgzMDBjOCwgMHgzYzAyMDAwYSwgMHgzNDQyZWZmZiwgMHgxMDMyMDIzLAotMHg0NDEwMmIsIDB4MTA0MDAwMDMsIDB4M2MwMjAwMGEsIDB4MzQ0MmYwMDAsCi0weDgyMjAyMSwgMHg4MDE4MjEsIDB4OGVlNDAwYzAsIDB4OGVlNTAwYzQsCi0weDEwMjEsIDB4YTMyODIxLCAweGEzMzAyYiwgMHg4MjIwMjEsCi0weDg2MjAyMSwgMHhhZWU0MDBjMCwgMHhhZWU1MDBjNCwgMHhhZjg4MDBjOCwKLTB4YWY4NzAwZTQsIDB4ODAwMzg1MCwgMHhhZjg3MDBlOCwgMHgzYzAyMDAwMSwKLTB4NTcxMDIxLCAweDkwNDI4M2MwLCAweDEwNDAwMDBiLCAweDAsCi0weDNjMTMwMDAxLCAweDI3Nzk4MjEsIDB4OGU3MzgzYzQsIDB4M2MxMTAwMDEsCi0weDIzNzg4MjEsIDB4OGUzMTgzYzgsIDB4M2MxMjAwMDEsIDB4MjU3OTAyMSwKLTB4ODAwMzZlOCwgMHg4ZTUyODNjYywgMHg4ZjgzMDBlMCwgMHg4ZjgyMDBlNCwKLTB4MTA0MzAwMDcsIDB4NDgyMSwgMHg4ZjgyMDBlNCwgMHgyNDA5MDAwMSwKLTB4OGM0MzAwMDAsIDB4OGM0NDAwMDQsIDB4YWZhMzAwMTgsIDB4YWZhNDAwMWMsCi0weDE1MjAwMDBlLCAweDNjMDJmZmZmLCAweDhmODIwMGM0LCAweGFmYTIwMDEwLAotMHg4ZjgyMDBjOCwgMHgzYzA0MDAwMSwgMHgyNDg0NTg3MCwgMHhhZmEyMDAxNCwKLTB4OGY4NjAwZTAsIDB4OGY4NzAwZTQsIDB4M2MwNTAwMDYsIDB4YzAwMjQwMywKLTB4MzRhNWYwMDAsIDB4ODAwMzg1MCwgMHgwLCAweDhmYTMwMDFjLAotMHg4ZmIyMDAxOCwgMHgzMDczZmZmZiwgMHgyNjczZmZmYywgMHg2MjEwMjQsCi0weDEwNDAwMDU4LCAweDI0MDg4MjEsIDB4M2MwMjAwODAsIDB4NjIxMDI0LAotMHgxMDQwMDAwYSwgMHgzYzA0MDA0MCwgMHg4ZWUyMDA3YywgMHgyNDQyMDAwMSwKLTB4YWVlMjAwN2MsIDB4OGVlMjAwN2MsIDB4OGVlMjAxZmMsIDB4MjQ0MjAwMDEsCi0weGFlZTIwMWZjLCAweDgwMDM4NGEsIDB4OGVlMjAxZmMsIDB4M2MwNjAwMDQsCi0weDNjMGIwMDAxLCAweDNjMGEwMDAyLCAweDNjMDUwMDEwLCAweDNjMDkwMDA4LAotMHg4ZWUyMDA4MCwgMHgzYzA4MDAyMCwgMHgzNDA3ODAwMCwgMHgyNDQyMDAwMSwKLTB4YWVlMjAwODAsIDB4OGVlMjAwODAsIDB4OGZhMjAwMWMsIDB4NDQxODI0LAotMHgxMDY2MDAyMSwgMHhjMzEwMmIsIDB4MTQ0MDAwMDcsIDB4MCwKLTB4MTA2YjAwMTEsIDB4MCwgMHgxMDZhMDAxNSwgMHgwLAotMHg4MDAzNTkyLCAweDQyMDQyLCAweDEwNjUwMDIzLCAweGEzMTAyYiwKLTB4MTQ0MDAwMDUsIDB4MCwgMHgxMDY5MDAxOSwgMHgwLAotMHg4MDAzNTkyLCAweDQyMDQyLCAweDEwNjgwMDIxLCAweDAsCi0weDgwMDM1OTIsIDB4NDIwNDIsIDB4OGVlMjAwMzQsIDB4MjQ0MjAwMDEsCi0weGFlZTIwMDM0LCAweDhlZTIwMDM0LCAweDgwMDM1OTIsIDB4NDIwNDIsCi0weDhlZTIwMWVjLCAweDI0NDIwMDAxLCAweGFlZTIwMWVjLCAweDhlZTIwMWVjLAotMHg4MDAzNTkyLCAweDQyMDQyLCAweDhlZTIwMWYwLCAweDI0NDIwMDAxLAotMHhhZWUyMDFmMCwgMHg4ZWUyMDFmMCwgMHg4MDAzNTkyLCAweDQyMDQyLAotMHg4ZWUyMDFmNCwgMHgyNDQyMDAwMSwgMHhhZWUyMDFmNCwgMHg4ZWUyMDFmNCwKLTB4ODAwMzU5MiwgMHg0MjA0MiwgMHg4ZWUyMDAzMCwgMHgyNDQyMDAwMSwKLTB4YWVlMjAwMzAsIDB4OGVlMjAwMzAsIDB4ODAwMzU5MiwgMHg0MjA0MiwKLTB4OGVlMjAxZjgsIDB4MjQ0MjAwMDEsIDB4YWVlMjAxZjgsIDB4OGVlMjAxZjgsCi0weDQyMDQyLCAweDEwODcwMmI3LCAweDAsIDB4ODAwMzU1NywKLTB4MCwgMHgzYzAyMDAwMSwgMHg1NzEwMjEsIDB4OTA0MjgzYjIsCi0weDE0NDAwMDg0LCAweDI0MDIwMDAxLCAweDNjMDMwMDAxLCAweDc3MTgyMSwKLTB4OTA2MzgzYjMsIDB4MTQ2MjAwN2YsIDB4M2MwMjAxMDAsIDB4OGU0MzAwMDAsCi0weDYyMTAyNCwgMHgxMDQwMDA2ZiwgMHgyNDAyZmZmZiwgMHgxNDYyMDAwNSwKLTB4MjQxMDAwMDEsIDB4OTY0MzAwMDQsIDB4MzQwMmZmZmYsIDB4MTA2MjAwNzUsCi0weDAsIDB4OTJlMjA0ZDgsIDB4MTQ0MDAwNzIsIDB4MCwKLTB4M2MwMjAwMDEsIDB4NTcxMDIxLCAweDhjNDI4M2I0LCAweDI4NDIwMDA1LAotMHgxMDQwMDAyMCwgMHgzODIxLCAweDNjMDIwMDAxLCAweDU3MTAyMSwKLTB4OGM0MjgzYjQsIDB4MTg0MDAwMTYsIDB4MjgyMSwgMHg5NjI2MDAwMCwKLTB4NTIwYzAsIDB4OTcxMDIxLCAweDk0NDI3NzdlLCAweDE0NDYwMDA5LAotMHg5NzEwMjEsIDB4OTQ0Mzc3ODAsIDB4OTYyMjAwMDIsIDB4MTQ2MjAwMDUsCi0weDk3MTAyMSwgMHg5NDQzNzc4MiwgMHg5NjIyMDAwNCwgMHg1MDYyMDAwOCwKLTB4MjQwNzAwMDEsIDB4M2MwMjAwMDEsIDB4NTcxMDIxLCAweDhjNDI4M2I0LAotMHgyNGE1MDAwMSwgMHhhMjEwMmEsIDB4NTQ0MGZmZWUsIDB4NTIwYzAsCi0weDMwZTIwMGZmLCAweDEwNDAwMjdiLCAweDAsIDB4ODAwMzYxZSwKLTB4MCwgMHgyNDAyMDIxLCAweGMwMDIyZmUsIDB4MjQwNTAwMDYsCi0weDMwNDQwMDFmLCAweDQyOGMwLCAweDJlNTEwMjEsIDB4OTQ0MjcyN2MsCi0weDMwNDI0MDAwLCAweDE0NDAwMjZmLCAweGI3MTAyMSwgMHg5NDQzNzI3ZSwKLTB4OTYyMjAwMDAsIDB4MTQ2MjAwMGIsIDB4NDE4YzAsIDB4YjcxMDIxLAotMHg5NDQzNzI4MCwgMHg5NjIyMDAwMiwgMHgxNDYyMDAwNiwgMHg0MThjMCwKLTB4YjcxMDIxLCAweDk0NDM3MjgyLCAweDk2MjIwMDA0LCAweDEwNjIwMDM1LAotMHg0MThjMCwgMHgyZTMxMDIxLCAweDk0NDI3MjdjLCAweDMwNDI4MDAwLAotMHgxNDQwMDI1YywgMHgyZTMxMDIxLCAweDk0NDg3MjdjLCAweDk2MjcwMDAwLAotMHg4MjhjMCwgMHhiNzEwMjEsIDB4OTQ0MjczN2UsIDB4ODAwMzYwMCwKLTB4MzAyMSwgMHg0MjBjMCwgMHgyZTQxMDIxLCAweDk0NDM3MzdjLAotMHgyZTQxMDIxLCAweDk0NDg3MzdjLCAweDMwNjM4MDAwLCAweDE0NjAwMDEwLAotMHg4MjhjMCwgMHhiNzEwMjEsIDB4OTQ0MjczN2UsIDB4MTQ0N2ZmZjUsCi0weDEwMDIwMjEsIDB4YjcxMDIxLCAweDk0NDM3MzgwLCAweDk2MjIwMDAyLAotMHg1NDYyZmZmMSwgMHg0MjBjMCwgMHhiNzEwMjEsIDB4OTQ0MzczODIsCi0weDk2MjIwMDA0LCAweDU0NjJmZmVjLCAweDQyMGMwLCAweDI0MDYwMDAxLAotMHgzMGMyMDBmZiwgMHgxMDQwMDIzYiwgMHgwLCAweDgwMDM2MWUsCi0weDAsIDB4OTc0MzAyMDIsIDB4OTY0MjAwMDAsIDB4MTQ2MjAyMzUsCi0weDAsIDB4OTc0MzAyMDQsIDB4OTY0MjAwMDIsIDB4MTQ2MjAyMzEsCi0weDAsIDB4OTc0MzAyMDYsIDB4OTY0MjAwMDQsIDB4MTQ2MjAyMmQsCi0weDAsIDB4OTI0MjAwMDAsIDB4M2EwMzAwMDEsIDB4MzA0MjAwMDEsCi0weDQzMTAyNCwgMHgxMDQwMDA3NCwgMHgyNDAyZmZmZiwgMHg4ZTIzMDAwMCwKLTB4MTQ2MjAwMDQsIDB4MzQwMmZmZmYsIDB4OTYyMzAwMDQsIDB4MTA2MjAwNmYsCi0weDI0MTQwMDAyLCAweDNjMDIwMDAxLCAweDU3MTAyMSwgMHg5MDQyODNiMiwKLTB4MTQ0MDAwNmEsIDB4MjQxNDAwMDMsIDB4OTJlMjA0ZDgsIDB4MTQ0MDAwNjcsCi0weDAsIDB4M2MwMjAwMDEsIDB4NTcxMDIxLCAweDhjNDI4M2I0LAotMHgyODQyMDAwNSwgMHgxMDQwMDAyMCwgMHgzODIxLCAweDNjMDIwMDAxLAotMHg1NzEwMjEsIDB4OGM0MjgzYjQsIDB4MTg0MDAwMTYsIDB4MjgyMSwKLTB4OTYyNjAwMDAsIDB4NTIwYzAsIDB4OTcxMDIxLCAweDk0NDI3NzdlLAotMHgxNDQ2MDAwOSwgMHg5NzEwMjEsIDB4OTQ0Mzc3ODAsIDB4OTYyMjAwMDIsCi0weDE0NjIwMDA1LCAweDk3MTAyMSwgMHg5NDQzNzc4MiwgMHg5NjIyMDAwNCwKLTB4NTA2MjAwMDgsIDB4MjQwNzAwMDEsIDB4M2MwMjAwMDEsIDB4NTcxMDIxLAotMHg4YzQyODNiNCwgMHgyNGE1MDAwMSwgMHhhMjEwMmEsIDB4NTQ0MGZmZWUsCi0weDUyMGMwLCAweDMwZTIwMGZmLCAweDE0NDAwMDQ0LCAweDI0MTQwMDAzLAotMHg4MDAzODRhLCAweDAsIDB4MjQwMjAyMSwgMHhjMDAyMmZlLAotMHgyNDA1MDAwNiwgMHgzMDQ0MDAxZiwgMHg0MjhjMCwgMHgyZTUxMDIxLAotMHg5NDQyNzI3YywgMHgzMDQyNDAwMCwgMHgxNDQwMDFlYSwgMHhiNzEwMjEsCi0weDk0NDM3MjdlLCAweDk2MjIwMDAwLCAweDE0NjIwMDBiLCAweDQxOGMwLAotMHhiNzEwMjEsIDB4OTQ0MzcyODAsIDB4OTYyMjAwMDIsIDB4MTQ2MjAwMDYsCi0weDQxOGMwLCAweGI3MTAyMSwgMHg5NDQzNzI4MiwgMHg5NjIyMDAwNCwKLTB4MTA2MjAwMjcsIDB4NDE4YzAsIDB4MmUzMTAyMSwgMHg5NDQyNzI3YywKLTB4MzA0MjgwMDAsIDB4MTQ0MDAxZDcsIDB4MmUzMTAyMSwgMHg5NDQ4NzI3YywKLTB4OTYyNzAwMDAsIDB4ODI4YzAsIDB4YjcxMDIxLCAweDk0NDI3MzdlLAotMHg4MDAzNjg1LCAweDMwMjEsIDB4NDIwYzAsIDB4MmU0MTAyMSwKLTB4OTQ0MzczN2MsIDB4MmU0MTAyMSwgMHg5NDQ4NzM3YywgMHgzMDYzODAwMCwKLTB4MTQ2MDAwMTAsIDB4ODI4YzAsIDB4YjcxMDIxLCAweDk0NDI3MzdlLAotMHgxNDQ3ZmZmNSwgMHgxMDAyMDIxLCAweGI3MTAyMSwgMHg5NDQzNzM4MCwKLTB4OTYyMjAwMDIsIDB4NTQ2MmZmZjEsIDB4NDIwYzAsIDB4YjcxMDIxLAotMHg5NDQzNzM4MiwgMHg5NjIyMDAwNCwgMHg1NDYyZmZlYywgMHg0MjBjMCwKLTB4MjQwNjAwMDEsIDB4MzBjMjAwZmYsIDB4MTA0MDAxYjYsIDB4MCwKLTB4ODAwMzY5OCwgMHgyNDE0MDAwMywgMHgyNDE0MDAwMSwgMHg4ZjQyMDI2MCwKLTB4NTMxMDJiLCAweDEwNDAwMDQ5LCAweDAsIDB4OGY4MzAwZTQsCi0weDhmODIwMGUwLCAweDEwNjIwMDAzLCAweDI0NjMwMDA4LCAweGFmODMwMGU0LAotMHhhZjgzMDBlOCwgMHg4ZWU0MDBjMCwgMHg4ZWU1MDBjNCwgMHgyNjAxODIxLAotMHgxMDIxLCAweGEzMjgyMSwgMHhhMzMwMmIsIDB4ODIyMDIxLAotMHg4NjIwMjEsIDB4YWVlNDAwYzAsIDB4YWVlNTAwYzQsIDB4OGVlMjAwNTgsCi0weDI0NDIwMDAxLCAweGFlZTIwMDU4LCAweDhlZTIwMDU4LCAweDhlZTIwMDdjLAotMHgyNDQyMDAwMSwgMHhhZWUyMDA3YywgMHg4ZWUyMDA3YywgMHg4ZjgyMDBlMCwKLTB4YWZhMjAwMTAsIDB4OGY4MjAwZTQsIDB4M2MwNDAwMDEsIDB4MjQ4NDU4NzgsCi0weGFmYTIwMDE0LCAweDhmYTYwMDE4LCAweDhmYTcwMDFjLCAweDNjMDUwMDA2LAotMHhjMDAyNDAzLCAweDM0YTVmMDAzLCAweDgwMDM4NTAsIDB4MCwKLTB4OGVlMjUyNDAsIDB4YWZhMjAwMTAsIDB4OGVlMjUyNDQsIDB4M2MwNDAwMDEsCi0weDI0ODQ1ODg0LCAweGFmYTIwMDE0LCAweDhlZTYwZTEwLCAweDhlZTcwZTE4LAotMHhjMDAyNDAzLCAweDM0YTVmMDAyLCAweDhlZTIwMWMwLCAweDI0NDIwMDAxLAotMHhhZWUyMDFjMCwgMHg4ZWUyMDAwMCwgMHg4ZWUzMDFjMCwgMHgyNDAzZmZiZiwKLTB4NDMxMDI0LCAweDgwMDM3ZjgsIDB4YWVlMjAwMDAsIDB4OGVlMjUyNDAsCi0weGFmYTIwMDEwLCAweDhlZTI1MjQ0LCAweDNjMDQwMDAxLCAweDI0ODQ1ODg0LAotMHhhZmEyMDAxNCwgMHg4ZWU2MGUxMCwgMHg4ZWU3MGUxOCwgMHgzYzA1MDAwNiwKLTB4YzAwMjQwMywgMHgzNGE1ZjAwMiwgMHg4ZWUyMDFjMCwgMHgyNDQyMDAwMSwKLTB4YWVlMjAxYzAsIDB4ODAwMzdmOCwgMHg4ZWUyMDFjMCwgMHg5NmUyMDQ2OCwKLTB4NTMxMDJiLCAweDU0NDAwMDAxLCAweDNjMTU4MDAwLCAweDEyNjAwMTMxLAotMHgzYzBjMDAxZiwgMHgzNThjZmZmZiwgMHg4ZWUyNzI0YywgMHg4ZjQzMDI4MCwKLTB4MjQ0MjAwMDEsIDB4MzA0MjA3ZmYsIDB4MTA2MjAxMDgsIDB4MCwKLTB4MTJhMDAwMTQsIDB4MCwgMHg4ZWUzNTI0MCwgMHg4ZWUyNTI0NCwKLTB4MTA2MjAwMDksIDB4MjZlZTUyNDQsIDB4OGVlYjUyNDQsIDB4OGVlMzUyNDQsCi0weDIxMTQwLCAweDI0NDI1MjQ4LCAweDJlMjgwMjEsIDB4MjQ2MzAwMDEsCi0weDgwMDM3MTIsIDB4MzA2ODAwZmYsIDB4OTJlMjcyNDgsIDB4MTQ0MGZmYzAsCi0weDNjMDUwMDA2LCAweDhlZTIwMWUwLCAweDI0NDIwMDAxLCAweGFlZTIwMWUwLAotMHg4ZWUyMDFlMCwgMHg4ZWUzMGUxMCwgMHg4ZWUyMGUxOCwgMHgxMDYyZmZjYiwKLTB4MjZlZTBlMTgsIDB4OGVlYjBlMTgsIDB4YTgyMSwgMHg4ZWUzMGUxOCwKLTB4MjExNDAsIDB4MjQ0MjBlMjAsIDB4MmUyODAyMSwgMHgyNDYzMDAwMSwKLTB4MzA2ODAxZmYsIDB4OTZlMjA0NmEsIDB4MzA0MjAwMTAsIDB4MTA0MDAwMTcsCi0weDM0MDI4MTAwLCAweDk2NDMwMDBjLCAweDE0NjIwMDE0LCAweDAsCi0weDNjMDIwMDAxLCAweDU3MTAyMSwgMHg5MDQyODNjMCwgMHgxNDQwMDAwZiwKLTB4MCwgMHg5NjQyMDAwZSwgMHhhNjAyMDAxNiwgMHg4ZTQyMDAwOCwKLTB4OGU0MzAwMDQsIDB4OGU0NDAwMDAsIDB4MjY3M2ZmZmMsIDB4YWU0MjAwMGMsCi0weGFlNDMwMDA4LCAweGFlNDQwMDA0LCAweDk2MDIwMDBlLCAweDI2MzEwMDA0LAotMHgyNDE2MDAwMSwgMHgzNDQyMDIwMCwgMHhhNjAyMDAwZSwgMHg5NjAzMDAwYSwKLTB4MjYwNTAyMSwgMHg3MzEwMmIsIDB4MTA0MDAwMDIsIDB4MjYwNjgyMSwKLTB4NjA1MDIxLCAweDJkNDIwMDNkLCAweDEwNDAwMDJhLCAweDM4MjEsCi0weDk2MjMwMDBjLCAweDI0MDIwODAwLCAweDU0NjIwMDI3LCAweGFlMTEwMDE4LAotMHgzYzAyMDAwMSwgMHg1NzEwMjEsIDB4OTA0MjgzYzAsIDB4NTQ0MDAwMjIsCi0weGFlMTEwMDE4LCAweDI2MjIwMDE3LCAweDE4MjEwMmIsIDB4MTA0MDAwMTMsCi0weDAsIDB4M2MwMmZmZjUsIDB4NTExMDIxLCAweDkwNDIxMDE3LAotMHgzODQzMDAwNiwgMHgyYzYzMDAwMSwgMHgzODQyMDAxMSwgMHgyYzQyMDAwMSwKLTB4NjIxODI1LCAweDEwNjAwMDEzLCAweDI2MjIwMDEwLCAweDE4MjEwMmIsCi0weDEwNDAwMDBlLCAweDAsIDB4M2MwN2ZmZjUsIDB4ZjEzODIxLAotMHg5NGU3MTAxMCwgMHg4MDAzNzVlLCAweDI0ZTcwMDBlLCAweDkyMjIwMDE3LAotMHgzODQzMDAwNiwgMHgyYzYzMDAwMSwgMHgzODQyMDAxMSwgMHgyYzQyMDAwMSwKLTB4NjIxODI1LCAweDUwNjAwMDA0LCAweGFlMTEwMDE4LCAweDk2MjcwMDEwLAotMHgyNGU3MDAwZSwgMHhhZTExMDAxOCwgMHgzYzAyMDAwMSwgMHg1NzEwMjEsCi0weDkwNDI4M2MwLCAweDIxMDJiLCAweDE0ZTAwMDAyLCAweDI0ZWMwLAotMHgxNDAzODIxLCAweDhmODMwMTIwLCAweDI3NjIzODAwLCAweDI0NjYwMDIwLAotMHhjMjEwMmIsIDB4NTA0MDAwMDEsIDB4Mjc2NjMwMDAsIDB4OGY4MjAxMjgsCi0weDEwYzIwMDA0LCAweDAsIDB4OGY4MjAxMjQsIDB4MTRjMjAwMDcsCi0weDI0MDIwMDBiLCAweDhlZTIwMWE0LCAweDQ4MjEsIDB4MjQ0MjAwMDEsCi0weGFlZTIwMWE0LCAweDgwMDM3YmYsIDB4OGVlMjAxYTQsIDB4OGUwNDAwMDAsCi0weDhlMDUwMDA0LCAweGFjNjIwMDE4LCAweDE3NTEwMjUsIDB4NDkxMDI1LAotMHhhYzcxMDAwOCwgMHhhNDY3MDAwZSwgMHhhYzYyMDAxYywgMHhhYzY0MDAwMCwKLTB4YWM2NTAwMDQsIDB4OGVlMjA0YzAsIDB4YWM2MjAwMTAsIDB4YWY4NjAxMjAsCi0weDkyZTI0ZTIwLCAweDE0NDAwMDM4LCAweDI0MDkwMDAxLCAweDhlZTI0ZTMwLAotMHgyMTBjMCwgMHgyNDQyNTAzOCwgMHgyZTIyMDIxLCAweDhjODMwMDAwLAotMHgyNDAyMDAwNywgMHgxNDYyMDAyMCwgMHgwLCAweDhlZTM0ZTMwLAotMHg4ZWUyNGUzNCwgMHgxMDYyMDAxYywgMHgwLCAweDhjODIwMDA0LAotMHgyNDQyMDAwMSwgMHhhYzgyMDAwNCwgMHg4ZWUzNGUzNCwgMHg4ZWU1NGUzMCwKLTB4MjQwMjAwNDAsIDB4MjQ2MzAwMDEsIDB4MTA2MjAwMDcsIDB4MCwKLTB4OGVlMjRlMzQsIDB4MjQ0MjAwMDEsIDB4MTBhMjAwMDUsIDB4MCwKLTB4ODAwMzdhOSwgMHgwLCAweDE0YTAwMDA1LCAweDAsCi0weDhmODIwMTI4LCAweDI0NDIwMDIwLCAweGFmODIwMTI4LCAweDhmODIwMTI4LAotMHg4YzgyMDAwNCwgMHgyYzQyMDAxMSwgMHg1MDQwMDAxMywgMHhhYzgwMDAwMCwKLTB4ODAwMzdiZiwgMHgwLCAweDhlZTI0ZTMwLCAweDI0MDMwMDQwLAotMHgyNDQyMDAwMSwgMHg1MDQzMDAwMywgMHgxMDIxLCAweDhlZTI0ZTMwLAotMHgyNDQyMDAwMSwgMHhhZWUyNGUzMCwgMHg4ZWUyNGUzMCwgMHgyMTBjMCwKLTB4MjQ0MjUwMzgsIDB4MmUyMjAyMSwgMHgyNDAyMDAwNywgMHhhYzgyMDAwMCwKLTB4MjQwMjAwMDEsIDB4YWM4MjAwMDQsIDB4MTUyMDAwMTgsIDB4M2MwNTAwMDYsCi0weDhlMDIwMDE4LCAweDNjMDQwMDAxLCAweDI0ODQ1ODkwLCAweGFmYTIwMDEwLAotMHg4ZTAyMDAwMCwgMHg4ZTAzMDAwNCwgMHgzNGE1ZjAwOSwgMHgyMDAzMDIxLAotMHhjMDAyNDAzLCAweGFmYTMwMDE0LCAweDMyYzIwMGZmLCAweDEwNDAwMDJiLAotMHgzNDAyODEwMCwgMHg4ZTQzMDAwNCwgMHg4ZTQ0MDAwOCwgMHg4ZTQ1MDAwYywKLTB4YTY0MjAwMGMsIDB4YWU0MzAwMDAsIDB4YWU0NDAwMDQsIDB4YWU0NTAwMDgsCi0weDk2MDIwMDE2LCAweDgwMDM3ZjgsIDB4YTY0MjAwMGUsIDB4MTU0ZDAwMGEsCi0weDAsIDB4OTYwMjAwMGUsIDB4YTYxMzAwMGEsIDB4MzQ0MjAwMDQsCi0weGE2MDIwMDBlLCAweDNjMDEwMDAxLCAweDM3MDgyMSwgMHhhMDIwODNjMCwKLTB4ODAwMzdmNiwgMHg5ODIxLCAweDk2MDQwMDBhLCAweDkzMTAyYiwKLTB4MTA0MDAwMDIsIDB4MjYwMTgyMSwgMHg4MDE4MjEsIDB4MjQwMjAwMDEsCi0weGE2MDMwMDBhLCAweDNjMDEwMDAxLCAweDM3MDgyMSwgMHhhMDIyODNjMCwKLTB4OTYwNDAwMGEsIDB4MjI0ODgyMSwgMHgxOTExMDJiLCAweDEwNDAwMDAzLAotMHgzYzAyZmZmNSwgMHgzNDQyMTAwMCwgMHgyMjI4ODIxLCAweDI2NDk4MjMsCi0weGE4MjEsIDB4MTY2MGZlZjQsIDB4YWRjODAwMDAsIDB4MTI2MDAwMjEsCi0weDMyYzIwMGZmLCAweDNjMDEwMDAxLCAweDM3MDgyMSwgMHhhYzMzODNjNCwKLTB4M2MwMTAwMDEsIDB4MzcwODIxLCAweGFjMzE4M2M4LCAweDNjMDEwMDAxLAotMHgzNzA4MjEsIDB4MTA0MDAwMDgsIDB4YWMzMjgzY2MsIDB4M2MwMjAwMDEsCi0weDU3MTAyMSwgMHg4YzQyODNjYywgMHgyNDQyMDAwNCwgMHgzYzAxMDAwMSwKLTB4MzcwODIxLCAweGFjMjI4M2NjLCAweDhlZTI3MjRjLCAweDhmNDMwMjgwLAotMHgyNDQyMDAwMSwgMHgxNDYyMDAwNiwgMHgwLCAweDhlZTIwMWM0LAotMHgyNDQyMDAwMSwgMHhhZWUyMDFjNCwgMHg4MDAzODUwLCAweDhlZTIwMWM0LAotMHg4ZWUyMDFiYywgMHgyNDQyMDAwMSwgMHhhZWUyMDFiYywgMHg4MDAzODUwLAotMHg4ZWUyMDFiYywgMHg5N2E0MDAxZSwgMHgyNDg0ZmZmYywgMHg4MDE4MjEsCi0weDhlZTQwMGMwLCAweDhlZTUwMGM0LCAweDEwMjEsIDB4YTMyODIxLAotMHhhMzMwMmIsIDB4ODIyMDIxLCAweDg2MjAyMSwgMHgyNDAyMDAwMiwKLTB4YWVlNDAwYzAsIDB4YWVlNTAwYzQsIDB4MTI4MjAwMGYsIDB4MmE4MjAwMDMsCi0weDE0NDAwMDE3LCAweDI0MDIwMDAzLCAweDE2ODIwMDE1LCAweDAsCi0weDhlZTIwMGQwLCAweDhlZTMwMGQ0LCAweDI0NjMwMDAxLCAweDJjNjQwMDAxLAotMHg0NDEwMjEsIDB4YWVlMjAwZDAsIDB4YWVlMzAwZDQsIDB4OGVlMjAwZDAsCi0weDgwMDM4NGEsIDB4OGVlMzAwZDQsIDB4OGVlMjAwZDgsIDB4OGVlMzAwZGMsCi0weDI0NjMwMDAxLCAweDJjNjQwMDAxLCAweDQ0MTAyMSwgMHhhZWUyMDBkOCwKLTB4YWVlMzAwZGMsIDB4OGVlMjAwZDgsIDB4ODAwMzg0YSwgMHg4ZWUzMDBkYywKLTB4OGVlMjAwYzgsIDB4OGVlMzAwY2MsIDB4MjQ2MzAwMDEsIDB4MmM2NDAwMDEsCi0weDQ0MTAyMSwgMHhhZWUyMDBjOCwgMHhhZWUzMDBjYywgMHg4ZWUyMDBjOCwKLTB4OGVlMzAwY2MsIDB4OGY4MzAwZTQsIDB4OGY4MjAwZTAsIDB4MTA2MjAwMDMsCi0weDI0NjMwMDA4LCAweGFmODMwMGU0LCAweGFmODMwMGU4LCAweDhmYmYwMDRjLAotMHg4ZmI2MDA0OCwgMHg4ZmI1MDA0NCwgMHg4ZmI0MDA0MCwgMHg4ZmIzMDAzYywKLTB4OGZiMjAwMzgsIDB4OGZiMTAwMzQsIDB4OGZiMDAwMzAsIDB4M2UwMDAwOCwKLTB4MjdiZDAwNTAsIDB4MjdiZGZmOTAsIDB4YWZiNjAwNjAsIDB4YjAyMSwKLTB4YWZiZjAwNjgsIDB4YWZiZTAwNjQsIDB4YWZiNTAwNWMsIDB4YWZiNDAwNTgsCi0weGFmYjMwMDU0LCAweGFmYjIwMDUwLCAweGFmYjEwMDRjLCAweGFmYjAwMDQ4LAotMHg4ZWUyMDRkNCwgMHg4ODIxLCAweDI0MTUwMDAxLCAweDMwNDIwMDAxLAotMHgxNDQwMDAyYSwgMHhhM2EwMDAyZiwgMHg4Zjg3MDBlMCwgMHg4Zjg4MDBjNCwKLTB4OGY4MjAwZTgsIDB4ZTIyMDIzLCAweDJjODIxMDAwLCAweDUwNDAwMDAxLAotMHgyNDg0MTAwMCwgMHg0MjBjMiwgMHg4MDE4MjEsIDB4OGVlNDAwYzgsCi0weDhlZTUwMGNjLCAweDEwMjEsIDB4YTMyODIxLCAweGEzMzAyYiwKLTB4ODIyMDIxLCAweDg2MjAyMSwgMHhhZWU0MDBjOCwgMHhhZWU1MDBjYywKLTB4OGY4MzAwYzgsIDB4M2MwMjAwMGEsIDB4MzQ0MmVmZmYsIDB4MTAzMjAyMywKLTB4NDQxMDJiLCAweDEwNDAwMDAzLCAweDNjMDIwMDBhLCAweDM0NDJmMDAwLAotMHg4MjIwMjEsIDB4ODAxODIxLCAweDhlZTQwMGMwLCAweDhlZTUwMGM0LAotMHgxMDIxLCAweGEzMjgyMSwgMHhhMzMwMmIsIDB4ODIyMDIxLAotMHg4NjIwMjEsIDB4YWVlNDAwYzAsIDB4YWVlNTAwYzQsIDB4YWY4ODAwYzgsCi0weGFmODcwMGU0LCAweDgwMDNjNWIsIDB4YWY4NzAwZTgsIDB4M2MwMjAwMDEsCi0weDU3MTAyMSwgMHg5MDQyODNjMCwgMHgxMDQwMDAwYiwgMHgwLAotMHgzYzEzMDAwMSwgMHgyNzc5ODIxLCAweDhlNzM4M2M0LCAweDNjMTAwMDAxLAotMHgyMTc4MDIxLCAweDhlMTA4M2M4LCAweDNjMTIwMDAxLCAweDI1NzkwMjEsCi0weDgwMDNhNTksIDB4OGU1MjgzY2MsIDB4OGY4MzAwZTAsIDB4OGY4MjAwZTQsCi0weDEwNDMwMDA3LCAweDM4MjEsIDB4OGY4MjAwZTQsIDB4MjQwNzAwMDEsCi0weDhjNDMwMDAwLCAweDhjNDQwMDA0LCAweGFmYTMwMDE4LCAweGFmYTQwMDFjLAotMHgxNGUwMDAwZSwgMHgzYzAyZmZmZiwgMHg4ZjgyMDBjNCwgMHhhZmEyMDAxMCwKLTB4OGY4MjAwYzgsIDB4M2MwNDAwMDEsIDB4MjQ4NDU4YjQsIDB4YWZhMjAwMTQsCi0weDhmODYwMGUwLCAweDhmODcwMGU0LCAweDNjMDUwMDA2LCAweGMwMDI0MDMsCi0weDM0YTVmMjAwLCAweDgwMDNjNWIsIDB4MCwgMHg4ZmEzMDAxYywKLTB4OGZiMjAwMTgsIDB4MzA3M2ZmZmYsIDB4MjY3M2ZmZmMsIDB4NjIxMDI0LAotMHgxMDQwMDA1OCwgMHgyNDA4MDIxLCAweDNjMDIwMDgwLCAweDYyMTAyNCwKLTB4MTA0MDAwMGEsIDB4M2MwNDAwNDAsIDB4OGVlMjAwN2MsIDB4MjQ0MjAwMDEsCi0weGFlZTIwMDdjLCAweDhlZTIwMDdjLCAweDhlZTIwMWZjLCAweDI0NDIwMDAxLAotMHhhZWUyMDFmYywgMHg4MDAzYzU1LCAweDhlZTIwMWZjLCAweDNjMDYwMDA0LAotMHgzYzBiMDAwMSwgMHgzYzBhMDAwMiwgMHgzYzA1MDAxMCwgMHgzYzA5MDAwOCwKLTB4OGVlMjAwODAsIDB4M2MwODAwMjAsIDB4MzQwNzgwMDAsIDB4MjQ0MjAwMDEsCi0weGFlZTIwMDgwLCAweDhlZTIwMDgwLCAweDhmYTIwMDFjLCAweDQ0MTgyNCwKLTB4MTA2NjAwMjEsIDB4YzMxMDJiLCAweDE0NDAwMDA3LCAweDAsCi0weDEwNmIwMDExLCAweDAsIDB4MTA2YTAwMTUsIDB4MCwKLTB4ODAwMzkxNiwgMHg0MjA0MiwgMHgxMDY1MDAyMywgMHhhMzEwMmIsCi0weDE0NDAwMDA1LCAweDAsIDB4MTA2OTAwMTksIDB4MCwKLTB4ODAwMzkxNiwgMHg0MjA0MiwgMHgxMDY4MDAyMSwgMHgwLAotMHg4MDAzOTE2LCAweDQyMDQyLCAweDhlZTIwMDM0LCAweDI0NDIwMDAxLAotMHhhZWUyMDAzNCwgMHg4ZWUyMDAzNCwgMHg4MDAzOTE2LCAweDQyMDQyLAotMHg4ZWUyMDFlYywgMHgyNDQyMDAwMSwgMHhhZWUyMDFlYywgMHg4ZWUyMDFlYywKLTB4ODAwMzkxNiwgMHg0MjA0MiwgMHg4ZWUyMDFmMCwgMHgyNDQyMDAwMSwKLTB4YWVlMjAxZjAsIDB4OGVlMjAxZjAsIDB4ODAwMzkxNiwgMHg0MjA0MiwKLTB4OGVlMjAxZjQsIDB4MjQ0MjAwMDEsIDB4YWVlMjAxZjQsIDB4OGVlMjAxZjQsCi0weDgwMDM5MTYsIDB4NDIwNDIsIDB4OGVlMjAwMzAsIDB4MjQ0MjAwMDEsCi0weGFlZTIwMDMwLCAweDhlZTIwMDMwLCAweDgwMDM5MTYsIDB4NDIwNDIsCi0weDhlZTIwMWY4LCAweDI0NDIwMDAxLCAweGFlZTIwMWY4LCAweDhlZTIwMWY4LAotMHg0MjA0MiwgMHgxMDg3MDMzZSwgMHgwLCAweDgwMDM4ZGIsCi0weDAsIDB4M2MwMjAwMDEsIDB4NTcxMDIxLCAweDkwNDI4M2IyLAotMHgxNDQwMDA4NCwgMHgyNDAyMDAwMSwgMHgzYzAzMDAwMSwgMHg3NzE4MjEsCi0weDkwNjM4M2IzLCAweDE0NjIwMDdmLCAweDNjMDIwMTAwLCAweDhlNDMwMDAwLAotMHg2MjEwMjQsIDB4MTA0MDAwNmYsIDB4MjQwMmZmZmYsIDB4MTQ2MjAwMDUsCi0weDI0MTEwMDAxLCAweDk2NDMwMDA0LCAweDM0MDJmZmZmLCAweDEwNjIwMDc1LAotMHgwLCAweDkyZTIwNGQ4LCAweDE0NDAwMDcyLCAweDAsCi0weDNjMDIwMDAxLCAweDU3MTAyMSwgMHg4YzQyODNiNCwgMHgyODQyMDAwNSwKLTB4MTA0MDAwMjAsIDB4MzgyMSwgMHgzYzAyMDAwMSwgMHg1NzEwMjEsCi0weDhjNDI4M2I0LCAweDE4NDAwMDE2LCAweDI4MjEsIDB4OTYwNjAwMDAsCi0weDUyMGMwLCAweDk3MTAyMSwgMHg5NDQyNzc3ZSwgMHgxNDQ2MDAwOSwKLTB4OTcxMDIxLCAweDk0NDM3NzgwLCAweDk2MDIwMDAyLCAweDE0NjIwMDA1LAotMHg5NzEwMjEsIDB4OTQ0Mzc3ODIsIDB4OTYwMjAwMDQsIDB4NTA2MjAwMDgsCi0weDI0MDcwMDAxLCAweDNjMDIwMDAxLCAweDU3MTAyMSwgMHg4YzQyODNiNCwKLTB4MjRhNTAwMDEsIDB4YTIxMDJhLCAweDU0NDBmZmVlLCAweDUyMGMwLAotMHgzMGUyMDBmZiwgMHgxMDQwMDMwMiwgMHgwLCAweDgwMDM5YTIsCi0weDAsIDB4MjQwMjAyMSwgMHhjMDAyMmZlLCAweDI0MDUwMDA2LAotMHgzMDQ0MDAxZiwgMHg0MjhjMCwgMHgyZTUxMDIxLCAweDk0NDI3MjdjLAotMHgzMDQyNDAwMCwgMHgxNDQwMDJmNiwgMHhiNzEwMjEsIDB4OTQ0MzcyN2UsCi0weDk2MDIwMDAwLCAweDE0NjIwMDBiLCAweDQxOGMwLCAweGI3MTAyMSwKLTB4OTQ0MzcyODAsIDB4OTYwMjAwMDIsIDB4MTQ2MjAwMDYsIDB4NDE4YzAsCi0weGI3MTAyMSwgMHg5NDQzNzI4MiwgMHg5NjAyMDAwNCwgMHgxMDYyMDAzNSwKLTB4NDE4YzAsIDB4MmUzMTAyMSwgMHg5NDQyNzI3YywgMHgzMDQyODAwMCwKLTB4MTQ0MDAyZTMsIDB4MmUzMTAyMSwgMHg5NDRkNzI3YywgMHg5NjA3MDAwMCwKLTB4ZDI4YzAsIDB4YjcxMDIxLCAweDk0NDI3MzdlLCAweDgwMDM5ODQsCi0weDMwMjEsIDB4NDIwYzAsIDB4MmU0MTAyMSwgMHg5NDQzNzM3YywKLTB4MmU0MTAyMSwgMHg5NDRkNzM3YywgMHgzMDYzODAwMCwgMHgxNDYwMDAxMCwKLTB4ZDI4YzAsIDB4YjcxMDIxLCAweDk0NDI3MzdlLCAweDE0NDdmZmY1LAotMHgxYTAyMDIxLCAweGI3MTAyMSwgMHg5NDQzNzM4MCwgMHg5NjAyMDAwMiwKLTB4NTQ2MmZmZjEsIDB4NDIwYzAsIDB4YjcxMDIxLCAweDk0NDM3MzgyLAotMHg5NjAyMDAwNCwgMHg1NDYyZmZlYywgMHg0MjBjMCwgMHgyNDA2MDAwMSwKLTB4MzBjMjAwZmYsIDB4MTA0MDAyYzIsIDB4MCwgMHg4MDAzOWEyLAotMHgwLCAweDk3NDMwMjAyLCAweDk2NDIwMDAwLCAweDE0NjIwMmJjLAotMHgwLCAweDk3NDMwMjA0LCAweDk2NDIwMDAyLCAweDE0NjIwMmI4LAotMHgwLCAweDk3NDMwMjA2LCAweDk2NDIwMDA0LCAweDE0NjIwMmI0LAotMHgwLCAweDkyNDIwMDAwLCAweDNhMjMwMDAxLCAweDMwNDIwMDAxLAotMHg0MzEwMjQsIDB4MTA0MDAwNzQsIDB4MjQwMmZmZmYsIDB4OGUwMzAwMDAsCi0weDE0NjIwMDA0LCAweDM0MDJmZmZmLCAweDk2MDMwMDA0LCAweDEwNjIwMDZmLAotMHgyNDE1MDAwMiwgMHgzYzAyMDAwMSwgMHg1NzEwMjEsIDB4OTA0MjgzYjIsCi0weDE0NDAwMDZhLCAweDI0MTUwMDAzLCAweDkyZTIwNGQ4LCAweDE0NDAwMDY3LAotMHgwLCAweDNjMDIwMDAxLCAweDU3MTAyMSwgMHg4YzQyODNiNCwKLTB4Mjg0MjAwMDUsIDB4MTA0MDAwMjAsIDB4MzgyMSwgMHgzYzAyMDAwMSwKLTB4NTcxMDIxLCAweDhjNDI4M2I0LCAweDE4NDAwMDE2LCAweDI4MjEsCi0weDk2MDYwMDAwLCAweDUyMGMwLCAweDk3MTAyMSwgMHg5NDQyNzc3ZSwKLTB4MTQ0NjAwMDksIDB4OTcxMDIxLCAweDk0NDM3NzgwLCAweDk2MDIwMDAyLAotMHgxNDYyMDAwNSwgMHg5NzEwMjEsIDB4OTQ0Mzc3ODIsIDB4OTYwMjAwMDQsCi0weDUwNjIwMDA4LCAweDI0MDcwMDAxLCAweDNjMDIwMDAxLCAweDU3MTAyMSwKLTB4OGM0MjgzYjQsIDB4MjRhNTAwMDEsIDB4YTIxMDJhLCAweDU0NDBmZmVlLAotMHg1MjBjMCwgMHgzMGUyMDBmZiwgMHgxNDQwMDA0NCwgMHgyNDE1MDAwMywKLTB4ODAwM2M1NSwgMHgwLCAweDI0MDIwMjEsIDB4YzAwMjJmZSwKLTB4MjQwNTAwMDYsIDB4MzA0NDAwMWYsIDB4NDI4YzAsIDB4MmU1MTAyMSwKLTB4OTQ0MjcyN2MsIDB4MzA0MjQwMDAsIDB4MTQ0MDAyNzEsIDB4YjcxMDIxLAotMHg5NDQzNzI3ZSwgMHg5NjAyMDAwMCwgMHgxNDYyMDAwYiwgMHg0MThjMCwKLTB4YjcxMDIxLCAweDk0NDM3MjgwLCAweDk2MDIwMDAyLCAweDE0NjIwMDA2LAotMHg0MThjMCwgMHhiNzEwMjEsIDB4OTQ0MzcyODIsIDB4OTYwMjAwMDQsCi0weDEwNjIwMDI3LCAweDQxOGMwLCAweDJlMzEwMjEsIDB4OTQ0MjcyN2MsCi0weDMwNDI4MDAwLCAweDE0NDAwMjVlLCAweDJlMzEwMjEsIDB4OTQ0ZDcyN2MsCi0weDk2MDcwMDAwLCAweGQyOGMwLCAweGI3MTAyMSwgMHg5NDQyNzM3ZSwKLTB4ODAwM2EwOSwgMHgzMDIxLCAweDQyMGMwLCAweDJlNDEwMjEsCi0weDk0NDM3MzdjLCAweDJlNDEwMjEsIDB4OTQ0ZDczN2MsIDB4MzA2MzgwMDAsCi0weDE0NjAwMDEwLCAweGQyOGMwLCAweGI3MTAyMSwgMHg5NDQyNzM3ZSwKLTB4MTQ0N2ZmZjUsIDB4MWEwMjAyMSwgMHhiNzEwMjEsIDB4OTQ0MzczODAsCi0weDk2MDIwMDAyLCAweDU0NjJmZmYxLCAweDQyMGMwLCAweGI3MTAyMSwKLTB4OTQ0MzczODIsIDB4OTYwMjAwMDQsIDB4NTQ2MmZmZWMsIDB4NDIwYzAsCi0weDI0MDYwMDAxLCAweDMwYzIwMGZmLCAweDEwNDAwMjNkLCAweDAsCi0weDgwMDNhMWMsIDB4MjQxNTAwMDMsIDB4MjQxNTAwMDEsIDB4OGY0MjAyNjAsCi0weDUzMTAyYiwgMHgxMDQwMDAzNiwgMHgwLCAweDhmODMwMGU0LAotMHg4ZjgyMDBlMCwgMHgxMDYyMDAwMywgMHgyNDYzMDAwOCwgMHhhZjgzMDBlNCwKLTB4YWY4MzAwZTgsIDB4OGVlNDAwYzAsIDB4OGVlNTAwYzQsIDB4MjYwMTgyMSwKLTB4MTAyMSwgMHhhMzI4MjEsIDB4YTMzMDJiLCAweDgyMjAyMSwKLTB4ODYyMDIxLCAweGFlZTQwMGMwLCAweGFlZTUwMGM0LCAweDhlZTIwMDU4LAotMHgyNDQyMDAwMSwgMHhhZWUyMDA1OCwgMHg4ZWUyMDA1OCwgMHg4ZWUyMDA3YywKLTB4MjQ0MjAwMDEsIDB4YWVlMjAwN2MsIDB4OGVlMjAwN2MsIDB4OGY4MjAwZTAsCi0weGFmYTIwMDEwLCAweDhmODIwMGU0LCAweDNjMDQwMDAxLCAweDI0ODQ1OGMwLAotMHhhZmEyMDAxNCwgMHg4ZmE2MDAxOCwgMHg4ZmE3MDAxYywgMHgzYzA1MDAwNiwKLTB4YzAwMjQwMywgMHgzNGE1ZjIwMywgMHg4MDAzYzViLCAweDAsCi0weDhlZTI1MjQwLCAweGFmYTIwMDEwLCAweDhlZTI1MjQ0LCAweDNjMDQwMDAxLAotMHgyNDg0NThjYywgMHhhZmEyMDAxNCwgMHg4ZWU2MGUxMCwgMHg4ZWU3MGUxOCwKLTB4M2MwNTAwMDYsIDB4YzAwMjQwMywgMHgzNGE1ZjIwMiwgMHg4ZWUyMDFjMCwKLTB4MjQ0MjAwMDEsIDB4YWVlMjAxYzAsIDB4ODAwM2MwMiwgMHg4ZWUyMDFjMCwKLTB4OTZlMjA0NjgsIDB4NTMxMDJiLCAweDU0NDAwMDAxLCAweDNjMTY4MDAwLAotMHgxMjYwMDFjYiwgMHgzYzBlMDAxZiwgMHgzNWNlZmZmZiwgMHgzYzBmZmZmNSwKLTB4MzVlZjEwMDAsIDB4MjQxZTAwNDAsIDB4OGVlMjcyNGMsIDB4OGY0MzAyODAsCi0weDI0NDIwMDAxLCAweDMwNDIwN2ZmLCAweDEwNjIwMTllLCAweDAsCi0weDEyYzAwMDEyLCAweDAsIDB4OGVlMzUyNDAsIDB4OGVlMjUyNDQsCi0weDEwNjIwMDBhLCAweDI2Zjg1MjQ0LCAweDhlZjQ1MjQ0LCAweGFmYjgwMDI0LAotMHg4ZWUzNTI0NCwgMHgyMTE0MCwgMHgyNDQyNTI0OCwgMHgyZTI4ODIxLAotMHgyNDYzMDAwMSwgMHg4MDAzYTg1LCAweDMwNmQwMGZmLCAweDhlZTIwMWUwLAotMHgyNDQyMDAwMSwgMHhhZWUyMDFlMCwgMHg4ZWUyMDFlMCwgMHg4ZWUzMGUxMCwKLTB4OGVlMjBlMTgsIDB4MTA2MmZmY2EsIDB4MjZmODBlMTgsIDB4OGVmNDBlMTgsCi0weGIwMjEsIDB4YWZiODAwMjQsIDB4OGVlMzBlMTgsIDB4MjExNDAsCi0weDI0NDIwZTIwLCAweDJlMjg4MjEsIDB4MjQ2MzAwMDEsIDB4MzA2ZDAxZmYsCi0weDk2ZTIwNDZhLCAweDMwNDIwMDEwLCAweDEwNDAwMDE4LCAweDM0MDI4MTAwLAotMHg5NjQzMDAwYywgMHgxNDYyMDAxNSwgMHgwLCAweDNjMDIwMDAxLAotMHg1NzEwMjEsIDB4OTA0MjgzYzAsIDB4MTQ0MDAwMTAsIDB4MCwKLTB4OTY0MjAwMGUsIDB4YTYyMjAwMTYsIDB4OGU0MjAwMDgsIDB4OGU0MzAwMDQsCi0weDhlNDQwMDAwLCAweDI2NzNmZmZjLCAweGFlNDIwMDBjLCAweGFlNDMwMDA4LAotMHhhZTQ0MDAwNCwgMHg5NjIyMDAwZSwgMHgyNjEwMDAwNCwgMHgyNDE4MDAwMSwKLTB4YTNiODAwMmYsIDB4MzQ0MjAyMDAsIDB4YTYyMjAwMGUsIDB4OGUyMjAwMDAsCi0weDhlMjMwMDA0LCAweDNjMDQwMDAxLCAweDM0ODQzODAwLCAweDIwMDMwMjEsCi0weDMwNmEwMDA3LCAweDIwYTgwMjMsIDB4MzY0MTAyMSwgMHgyMDIxMDJiLAotMHgxMDQwMDAwNSwgMHgyNmE5ODIxLCAweDIwNDEwMjMsIDB4MzYyMTgyMywKLTB4M2MwMjAwMjAsIDB4NDM4MDIzLCAweDI2NjIwMDA3LCAweDk2MjMwMDBhLAotMHgyNDE4ZmZmOCwgMHg1OGM4MjQsIDB4NmExODIxLCAweDc5MTAyYiwKLTB4MTA0MDAwMDIsIDB4MzIwNjAyMSwgMHg2MDYwMjEsIDB4MTgwMTgyMSwKLTB4MjQ2MjAwMDcsIDB4MjQxOGZmZjgsIDB4NTg2MDI0LCAweDI2YzEwMmIsCi0weDE0NDAwMDA0LCAweDE5MzI4MjMsIDB4MTgzMjgyMywgMHg4MDAzYWMzLAotMHhjMzEwMjEsIDB4ZDMxMDIxLCAweDRhMjAyMywgMHgxYzQxMDJiLAotMHg1NDQwMDAwMSwgMHg4ZjIwMjEsIDB4MjU0MjAwNDAsIDB4NGMxMDJiLAotMHgxNDQwMDAzNSwgMHg1ODIxLCAweDk0YzMwMDBjLCAweDI0MDIwODAwLAotMHg1NDYyMDAzMiwgMHhhZTI2MDAxOCwgMHgzYzAyMDAwMSwgMHg1NzEwMjEsCi0weDkwNDI4M2MwLCAweDU0NDAwMDJkLCAweGFlMjYwMDE4LCAweDI0YzIwMDE3LAotMHgxYzIxMDJiLCAweDEwNDAwMDEzLCAweDAsIDB4M2MwMmZmZjUsCi0weDQ2MTAyMSwgMHg5MDQyMTAxNywgMHgzODQzMDAwNiwgMHgyYzYzMDAwMSwKLTB4Mzg0MjAwMTEsIDB4MmM0MjAwMDEsIDB4NjIxODI1LCAweDEwNjAwMDE0LAotMHgyNGMyMDAxMCwgMHgxYzIxMDJiLCAweDEwNDAwMDBlLCAweDAsCi0weDNjMGJmZmY1LCAweDE2NjU4MjEsIDB4OTU2YjEwMTAsIDB4ODAwM2FmNCwKLTB4MjU2MjAwMGUsIDB4OTBjMjAwMTcsIDB4Mzg0MzAwMDYsIDB4MmM2MzAwMDEsCi0weDM4NDIwMDExLCAweDJjNDIwMDAxLCAweDYyMTgyNSwgMHgxMDYwMDAwNSwKLTB4MTYwMTgyMSwgMHg5NGNiMDAxMCwgMHgyNTYyMDAwZSwgMHg0YTU4MjEsCi0weDE2MDE4MjEsIDB4MjQ2MjAwMDcsIDB4MjQxOGZmZjgsIDB4NTg1ODI0LAotMHhjMzEwMjEsIDB4NGEyMDIzLCAweDFjNDEwMmIsIDB4MTA0MDAwMDIsCi0weDE2MzI4MjMsIDB4OGYyMDIxLCAweGFlMjYwMDE4LCAweDNjMDIwMDAxLAotMHg1NzEwMjEsIDB4OTA0MjgzYzAsIDB4MjEwMmIsIDB4MjE2YzAsCi0weDE1NjAwMDAyLCAweGFmYTIwMDQ0LCAweDE4MDU4MjEsIDB4MzA4MjAwMDEsCi0weDEwNDAwMDA3LCAweDQwMjEsIDB4OTA4ODAwMDAsIDB4MjQ4NDAwMDEsCi0weDFjNDEwMmIsIDB4MTA0MDAwMDIsIDB4MjRhNWZmZmYsIDB4OGYyMDIxLAotMHg1MGEwMDAxMiwgMHg4MWMwMiwgMHgyY2EyMDAwMiwgMHg1NDQwMDAwOSwKLTB4MjRhNWZmZmYsIDB4OTQ4MjAwMDAsIDB4MjQ4NDAwMDIsIDB4MTAyNDAyMSwKLTB4MWM0MTAyYiwgMHgxMDQwMDAwNiwgMHgyNGE1ZmZmZSwgMHg4MDAzYjIxLAotMHg4ZjIwMjEsIDB4OTA4MjAwMDAsIDB4MjEyMDAsIDB4MTAyNDAyMSwKLTB4MTRhMGZmZjIsIDB4MmNhMjAwMDIsIDB4ODFjMDIsIDB4MzEwMmZmZmYsCi0weDYyNDAyMSwgMHgzMTA4ZmZmZiwgMHgxNDAyODIxLCAweDExNDAwMDExLAotMHgyMDAyMDIxLCAweDJjYTIwMDAyLCAweDU0NDAwMDA5LCAweDI0YTVmZmZmLAotMHg5NDgyMDAwMCwgMHgyNDg0MDAwMiwgMHgxMDI0MDIxLCAweDFjNDEwMmIsCi0weDEwNDAwMDA2LCAweDI0YTVmZmZlLCAweDgwMDNiMzgsIDB4OGYyMDIxLAotMHg5MDgyMDAwMCwgMHgyMTIwMCwgMHgxMDI0MDIxLCAweDE0YTBmZmYyLAotMHgyY2EyMDAwMiwgMHg4MWMwMiwgMHgzMTAyZmZmZiwgMHg2MjQwMjEsCi0weDgxYzAyLCAweDMxMDJmZmZmLCAweDhmODkwMTIwLCAweDYyNDAyMSwKLTB4Mjc2MjM4MDAsIDB4MjUyMzAwMjAsIDB4NjIxMDJiLCAweDE0NDAwMDAyLAotMHgzMTA4ZmZmZiwgMHgyNzYzMzAwMCwgMHg4ZjgyMDEyOCwgMHgxMDYyMDAwNCwKLTB4MCwgMHg4ZjgyMDEyNCwgMHgxNDYyMDAwNywgMHgxNDAyODIxLAotMHg4ZWUyMDFhNCwgMHgzODIxLCAweDI0NDIwMDAxLCAweGFlZTIwMWE0LAotMHg4MDAzYmM5LCAweDhlZTIwMWE0LCAweDhlMjYwMDAwLCAweDhlMjcwMDA0LAotMHg4MTQwMCwgMHgzNDQ4MDAwYiwgMHhhZDMwMDAwOCwgMHhhNTJiMDAwZSwKLTB4YWQyODAwMTgsIDB4OGZiODAwNDQsIDB4MjAyMSwgMHgyOTYxMDI1LAotMHg1ODEwMjUsIDB4YWQyMjAwMWMsIDB4ZTUxMDJiLCAweGU1MzgyMywKLTB4YzQzMDIzLCAweGMyMzAyMywgMHhhZDI2MDAwMCwgMHhhZDI3MDAwNCwKLTB4OGVlMjA0YzAsIDB4YWQyMjAwMTAsIDB4YWY4MzAxMjAsIDB4OTJlMjRlMjAsCi0weDE0NDAwMDVmLCAweDI0MDcwMDAxLCAweDI1MDJmZmVlLCAweDJjNDIwMDAyLAotMHgxNDQwMDAwMywgMHgyNDAyMDAxMSwgMHgxNTAyMDAyNCwgMHgwLAotMHg4ZWUyNGUzMCwgMHgyMTBjMCwgMHgyNDQyNTAzOCwgMHgyZTIyMDIxLAotMHg4YzgzMDAwMCwgMHgyNDAyMDAxMiwgMHgxNDYyMDAwZiwgMHgwLAotMHg4ZWUzNGUzMCwgMHg4ZWUyNGUzNCwgMHgxMDYyMDAwYiwgMHgwLAotMHg4YzgyMDAwNCwgMHgyNDQyMDAwMSwgMHhhYzgyMDAwNCwgMHg4ZWUyNGUzNCwKLTB4OGVlMzRlMzAsIDB4MjQ0MjAwMDEsIDB4MTA1ZTAwMmEsIDB4MCwKLTB4ODAwM2JhOCwgMHgwLCAweDhlZTI0ZTMwLCAweDI0NDIwMDAxLAotMHg1MDVlMDAwMywgMHgxMDIxLCAweDhlZTI0ZTMwLCAweDI0NDIwMDAxLAotMHhhZWUyNGUzMCwgMHg4ZWUyNGUzMCwgMHgyMTBjMCwgMHgyNDQyNTAzOCwKLTB4MmUyMjAyMSwgMHg4MDAzYmM2LCAweDI0MDIwMDEyLCAweDhlZTI0ZTMwLAotMHgyMTBjMCwgMHgyNDQyNTAzOCwgMHgyZTIyMDIxLCAweDhjODMwMDAwLAotMHgyNDAyMDAwNywgMHgxNDYyMDAxZiwgMHgwLCAweDhlZTM0ZTMwLAotMHg4ZWUyNGUzNCwgMHgxMDYyMDAxYiwgMHgwLCAweDhjODIwMDA0LAotMHgyNDQyMDAwMSwgMHhhYzgyMDAwNCwgMHg4ZWUyNGUzNCwgMHg4ZWUzNGUzMCwKLTB4MjQ0MjAwMDEsIDB4MTA1ZTAwMDcsIDB4MCwgMHg4ZWUyNGUzNCwKLTB4MjQ0MjAwMDEsIDB4MTA2MjAwMDUsIDB4MCwgMHg4MDAzYmI0LAotMHgwLCAweDE0NjAwMDA1LCAweDAsIDB4OGY4MjAxMjgsCi0weDI0NDIwMDIwLCAweGFmODIwMTI4LCAweDhmODIwMTI4LCAweDhjODIwMDA0LAotMHgyYzQyMDAxMSwgMHg1MDQwMDAxMiwgMHhhYzgwMDAwMCwgMHg4MDAzYmM5LAotMHgwLCAweDhlZTI0ZTMwLCAweDI0NDIwMDAxLCAweDUwNWUwMDAzLAotMHgxMDIxLCAweDhlZTI0ZTMwLCAweDI0NDIwMDAxLCAweGFlZTI0ZTMwLAotMHg4ZWUyNGUzMCwgMHgyMTBjMCwgMHgyNDQyNTAzOCwgMHgyZTIyMDIxLAotMHgyNDAyMDAwNywgMHhhYzgyMDAwMCwgMHgyNDAyMDAwMSwgMHhhYzgyMDAwNCwKLTB4MTRlMDAwMTksIDB4M2MwNTAwMDYsIDB4M2MwNDAwMDEsIDB4MjQ4NDU4OTAsCi0weDhlMjIwMDE4LCAweDM0YTVmMjA5LCAweGFmYTIwMDEwLCAweDhlMjIwMDAwLAotMHg4ZTIzMDAwNCwgMHgyMjAzMDIxLCAweDE2MDM4MjEsIDB4YzAwMjQwMywKLTB4YWZhMzAwMTQsIDB4OTNhMjAwMmYsIDB4MTA0MDAwMmEsIDB4MzQwMjgxMDAsCi0weDhlNDMwMDA0LCAweDhlNDQwMDA4LCAweDhlNDUwMDBjLCAweGE2NDIwMDBjLAotMHhhZTQzMDAwMCwgMHhhZTQ0MDAwNCwgMHhhZTQ1MDAwOCwgMHg5NjIyMDAxNiwKLTB4ODAwM2MwMiwgMHhhNjQyMDAwZSwgMHgxNTk5MDAwYSwgMHgyNmExODIzLAotMHg5NjIyMDAwZSwgMHhhNjIzMDAwYSwgMHgzNDQyMDAwNCwgMHhhNjIyMDAwZSwKLTB4M2MwMTAwMDEsIDB4MzcwODIxLCAweGEwMjA4M2MwLCAweDgwMDNiZmYsCi0weDk4MjEsIDB4OTYyNDAwMGEsIDB4ODMxMDJiLCAweDU0NDAwMDAxLAotMHg4MDE4MjEsIDB4MjQwMjAwMDEsIDB4YTYyMzAwMGEsIDB4M2MwMTAwMDEsCi0weDM3MDgyMSwgMHhhMDIyODNjMCwgMHg5NjIyMDAwYSwgMHg0YTE4MjEsCi0weDIwMzgwMjEsIDB4MWQwMTAyYiwgMHg1NDQwMDAwMSwgMHgyMGY4MDIxLAotMHgyNjM5ODIzLCAweGIwMjEsIDB4OGZiODAwMjQsIDB4MTY2MGZlNWUsCi0weGFmMGQwMDAwLCAweDEyNjAwMDIyLCAweDAsIDB4M2MwMTAwMDEsCi0weDM3MDgyMSwgMHhhYzMzODNjNCwgMHgzYzAxMDAwMSwgMHgzNzA4MjEsCi0weGFjMzA4M2M4LCAweDNjMDEwMDAxLCAweDM3MDgyMSwgMHhhYzMyODNjYywKLTB4OTNhMjAwMmYsIDB4MTA0MDAwMDgsIDB4MCwgMHgzYzAyMDAwMSwKLTB4NTcxMDIxLCAweDhjNDI4M2NjLCAweDI0NDIwMDA0LCAweDNjMDEwMDAxLAotMHgzNzA4MjEsIDB4YWMyMjgzY2MsIDB4OGY0MzAyODAsIDB4OGVlMjcyNGMsCi0weDE0NjIwMDA2LCAweDAsIDB4OGVlMjAxYzQsIDB4MjQ0MjAwMDEsCi0weGFlZTIwMWM0LCAweDgwMDNjNWIsIDB4OGVlMjAxYzQsIDB4OGVlMjAxYmMsCi0weDI0NDIwMDAxLCAweGFlZTIwMWJjLCAweDgwMDNjNWIsIDB4OGVlMjAxYmMsCi0weDk3YTQwMDFlLCAweDI0ODRmZmZjLCAweDgwMTgyMSwgMHg4ZWU0MDBjMCwKLTB4OGVlNTAwYzQsIDB4MTAyMSwgMHhhMzI4MjEsIDB4YTMzMDJiLAotMHg4MjIwMjEsIDB4ODYyMDIxLCAweDI0MDIwMDAyLCAweGFlZTQwMGMwLAotMHhhZWU1MDBjNCwgMHgxMmEyMDAwZiwgMHgyYWEyMDAwMywgMHgxNDQwMDAxNywKLTB4MjQwMjAwMDMsIDB4MTZhMjAwMTUsIDB4MCwgMHg4ZWUyMDBkMCwKLTB4OGVlMzAwZDQsIDB4MjQ2MzAwMDEsIDB4MmM2NDAwMDEsIDB4NDQxMDIxLAotMHhhZWUyMDBkMCwgMHhhZWUzMDBkNCwgMHg4ZWUyMDBkMCwgMHg4MDAzYzU1LAotMHg4ZWUzMDBkNCwgMHg4ZWUyMDBkOCwgMHg4ZWUzMDBkYywgMHgyNDYzMDAwMSwKLTB4MmM2NDAwMDEsIDB4NDQxMDIxLCAweGFlZTIwMGQ4LCAweGFlZTMwMGRjLAotMHg4ZWUyMDBkOCwgMHg4MDAzYzU1LCAweDhlZTMwMGRjLCAweDhlZTIwMGM4LAotMHg4ZWUzMDBjYywgMHgyNDYzMDAwMSwgMHgyYzY0MDAwMSwgMHg0NDEwMjEsCi0weGFlZTIwMGM4LCAweGFlZTMwMGNjLCAweDhlZTIwMGM4LCAweDhlZTMwMGNjLAotMHg4ZjgzMDBlNCwgMHg4ZjgyMDBlMCwgMHgxMDYyMDAwMywgMHgyNDYzMDAwOCwKLTB4YWY4MzAwZTQsIDB4YWY4MzAwZTgsIDB4OGZiZjAwNjgsIDB4OGZiZTAwNjQsCi0weDhmYjYwMDYwLCAweDhmYjUwMDVjLCAweDhmYjQwMDU4LCAweDhmYjMwMDU0LAotMHg4ZmIyMDA1MCwgMHg4ZmIxMDA0YywgMHg4ZmIwMDA0OCwgMHgzZTAwMDA4LAotMHgyN2JkMDA3MCwgMHgyN2JkZmZlMCwgMHhhZmJmMDAxOCwgMHg4ZWUzMGUxNCwKLTB4OGVlMjBlMGMsIDB4MTA2MjAwNzQsIDB4MCwgMHg4ZWUzMGUwYywKLTB4OGVlMjBlMTQsIDB4NjIyMDIzLCAweDQ4MjAwMDEsIDB4MjQ4NDAyMDAsCi0weDhlZTMwZTE4LCAweDhlZTIwZTE0LCAweDQzMTAyYiwgMHgxNDQwMDAwNCwKLTB4MjQwMjAyMDAsIDB4OGVlMzBlMTQsIDB4ODAwM2M3ZCwgMHg0MzE4MjMsCi0weDhlZTIwZTE4LCAweDhlZTMwZTE0LCAweDQzMTAyMywgMHgyNDQzZmZmZiwKLTB4ODA0ODIxLCAweDY5MTAyYSwgMHg1NDQwMDAwMSwgMHg2MDQ4MjEsCi0weDhmODcwMTAwLCAweDI3NjIzMDAwLCAweDI0ZTgwMDIwLCAweDEwMjEwMmIsCi0weDUwNDAwMDAxLCAweDI3NjgyODAwLCAweDhmODIwMTA4LCAweDExMDIwMDA0LAotMHgwLCAweDhmODIwMTA0LCAweDE1MDIwMDA3LCAweDEwMjEsCi0weDhlZTIwMWE4LCAweDIwMjEsIDB4MjQ0MjAwMDEsIDB4YWVlMjAxYTgsCi0weDgwMDNjYmYsIDB4OGVlMjAxYTgsIDB4OGVlNDBlMTQsIDB4NDIxNDAsCi0weDgwMTgyMSwgMHg4ZWU0MDQ2MCwgMHg4ZWU1MDQ2NCwgMHhhMzI4MjEsCi0weGEzMzAyYiwgMHg4MjIwMjEsIDB4ODYyMDIxLCAweGFjZTQwMDAwLAotMHhhY2U1MDAwNCwgMHg4ZWUzMGUxNCwgMHg5MTE0MCwgMHhhNGUyMDAwZSwKLTB4MjQwMjAwMDIsIDB4YWNlMjAwMTgsIDB4MzE5NDAsIDB4MjQ2MzBlMjAsCi0weDJlMzEwMjEsIDB4YWNlMjAwMDgsIDB4OGVlMjBlMTQsIDB4YWNlMjAwMWMsCi0weDhlZTIwNGNjLCAweGFjZTIwMDEwLCAweGFmODgwMTAwLCAweDkyZTIwNGVjLAotMHgxNDQwMDAxMSwgMHgyNDA0MDAwMSwgMHg4ZWUyNGUyOCwgMHgyNDAzMDA0MCwKLTB4MjQ0MjAwMDEsIDB4NTA0MzAwMDMsIDB4MTAyMSwgMHg4ZWUyNGUyOCwKLTB4MjQ0MjAwMDEsIDB4YWVlMjRlMjgsIDB4OGVlMjRlMjgsIDB4MjEwYzAsCi0weDI0NDI0ZTM4LCAweDJlMjE4MjEsIDB4MjQwMjAwMDIsIDB4YWM2MjAwMDAsCi0weDI0MDIwMDAxLCAweGFjNjIwMDA0LCAweDE0ODAwMDBlLCAweDI0MDMwMDQwLAotMHg4ZWUyMGUxNCwgMHhhZmEyMDAxMCwgMHg4ZWUyMGUxOCwgMHgzYzA1MDAwNywKLTB4YWZhMjAwMTQsIDB4OGVlNjBlMGMsIDB4OGVlNzBlMTAsIDB4M2MwNDAwMDEsCi0weDI0ODQ1OGQ0LCAweGMwMDI0MDMsIDB4MzRhNWYwMDEsIDB4ODAwM2NkZCwKLTB4MCwgMHg4ZWUyMDUwMCwgMHgyNDQyMDAwMSwgMHg1MDQzMDAwMywKLTB4MTAyMSwgMHg4ZWUyMDUwMCwgMHgyNDQyMDAwMSwgMHhhZWUyMDUwMCwKLTB4OGVlMjA1MDAsIDB4MjEwODAsIDB4NTcxMDIxLCAweGFjNDkwNTA4LAotMHg4ZWUyMGUxNCwgMHg0OTEwMjEsIDB4MzA0MjAxZmYsIDB4YWVlMjBlMTQsCi0weDhlZTMwZTE0LCAweDhlZTIwZTBjLCAweDE0NjIwMDA1LCAweDAsCi0weDhmODIwMDYwLCAweDI0MDNmZGZmLCAweDQzMTAyNCwgMHhhZjgyMDA2MCwKLTB4OGZiZjAwMTgsIDB4M2UwMDAwOCwgMHgyN2JkMDAyMCwgMHgyN2JkZmZlMCwKLTB4YWZiZjAwMTgsIDB4OGVlMzUyM2MsIDB4OGVlMjUyMzgsIDB4MTA2MjAwNzQsCi0weDAsIDB4OGVlMzUyMzgsIDB4OGVlMjUyM2MsIDB4NjIyMDIzLAotMHg0ODIwMDAxLCAweDI0ODQwMTAwLCAweDhlZTM1MjQ0LCAweDhlZTI1MjNjLAotMHg0MzEwMmIsIDB4MTQ0MDAwMDQsIDB4MjQwMjAxMDAsIDB4OGVlMzUyM2MsCi0weDgwMDNjZmYsIDB4NDMxODIzLCAweDhlZTI1MjQ0LCAweDhlZTM1MjNjLAotMHg0MzEwMjMsIDB4MjQ0M2ZmZmYsIDB4ODA0ODIxLCAweDY5MTAyYSwKLTB4NTQ0MDAwMDEsIDB4NjA0ODIxLCAweDhmODcwMTAwLCAweDI3NjIzMDAwLAotMHgyNGU4MDAyMCwgMHgxMDIxMDJiLCAweDUwNDAwMDAxLCAweDI3NjgyODAwLAotMHg4ZjgyMDEwOCwgMHgxMTAyMDAwNCwgMHgwLCAweDhmODIwMTA0LAotMHgxNTAyMDAwNywgMHgxMDIxLCAweDhlZTIwMWE4LCAweDIwMjEsCi0weDI0NDIwMDAxLCAweGFlZTIwMWE4LCAweDgwMDNkNDEsIDB4OGVlMjAxYTgsCi0weDhlZTQ1MjNjLCAweDQyMTQwLCAweDgwMTgyMSwgMHg4ZWU0MDQ3MCwKLTB4OGVlNTA0NzQsIDB4YTMyODIxLCAweGEzMzAyYiwgMHg4MjIwMjEsCi0weDg2MjAyMSwgMHhhY2U0MDAwMCwgMHhhY2U1MDAwNCwgMHg4ZWUzNTIzYywKLTB4OTExNDAsIDB4YTRlMjAwMGUsIDB4MjQwMjAwMDMsIDB4YWNlMjAwMTgsCi0weDMxOTQwLCAweDI0NjM1MjQ4LCAweDJlMzEwMjEsIDB4YWNlMjAwMDgsCi0weDhlZTI1MjNjLCAweGFjZTIwMDFjLCAweDhlZTIwNGNjLCAweGFjZTIwMDEwLAotMHhhZjg4MDEwMCwgMHg5MmUyMDRlYywgMHgxNDQwMDAxMSwgMHgyNDA0MDAwMSwKLTB4OGVlMjRlMjgsIDB4MjQwMzAwNDAsIDB4MjQ0MjAwMDEsIDB4NTA0MzAwMDMsCi0weDEwMjEsIDB4OGVlMjRlMjgsIDB4MjQ0MjAwMDEsIDB4YWVlMjRlMjgsCi0weDhlZTI0ZTI4LCAweDIxMGMwLCAweDI0NDI0ZTM4LCAweDJlMjE4MjEsCi0weDI0MDIwMDAzLCAweGFjNjIwMDAwLCAweDI0MDIwMDAxLCAweGFjNjIwMDA0LAotMHgxNDgwMDAwZSwgMHgyNDAzMDA0MCwgMHg4ZWUyNTIzYywgMHhhZmEyMDAxMCwKLTB4OGVlMjUyNDQsIDB4M2MwNTAwMDcsIDB4YWZhMjAwMTQsIDB4OGVlNjUyMzgsCi0weDhlZTc1MjQwLCAweDNjMDQwMDAxLCAweDI0ODQ1OGUwLCAweGMwMDI0MDMsCi0weDM0YTVmMDEwLCAweDgwMDNkNWYsIDB4MCwgMHg4ZWUyMDUwMCwKLTB4MjQ0MjAwMDEsIDB4NTA0MzAwMDMsIDB4MTAyMSwgMHg4ZWUyMDUwMCwKLTB4MjQ0MjAwMDEsIDB4YWVlMjA1MDAsIDB4OGVlMjA1MDAsIDB4MjEwODAsCi0weDU3MTAyMSwgMHhhYzQ5MDUwOCwgMHg4ZWUyNTIzYywgMHg0OTEwMjEsCi0weDMwNDIwMGZmLCAweGFlZTI1MjNjLCAweDhlZTM1MjNjLCAweDhlZTI1MjM4LAotMHgxNDYyMDAwNSwgMHgwLCAweDhmODIwMDYwLCAweDI0MDNmZWZmLAotMHg0MzEwMjQsIDB4YWY4MjAwNjAsIDB4OGZiZjAwMTgsIDB4M2UwMDAwOCwKLTB4MjdiZDAwMjAsIDB4OGY4MjAxMjAsIDB4OGVlMzRlMzQsIDB4OGY4MjAxMjQsCi0weDhmODYwMTI4LCAweDI0MDIwMDQwLCAweDI0NjMwMDAxLCAweDUwNjIwMDAzLAotMHgxMDIxLCAweDhlZTI0ZTM0LCAweDI0NDIwMDAxLCAweGFlZTI0ZTM0LAotMHg4ZWUyNGUzNCwgMHg4ZWU0NGUzNCwgMHg4ZWUzNGUzMCwgMHgyMTBjMCwKLTB4MjQ0MjUwMzgsIDB4MTQ4MzAwMDcsIDB4MmUyMjgyMSwgMHg4ZjgyMDEyOCwKLTB4MjQ0MjAwMjAsIDB4YWY4MjAxMjgsIDB4OGY4MjAxMjgsIDB4ODAwM2Q5MiwKLTB4YWNhMDAwMDAsIDB4OGVlMjRlMzQsIDB4MjQwMzAwNDAsIDB4MjQ0MjAwMDEsCi0weDUwNDMwMDAzLCAweDEwMjEsIDB4OGVlMjRlMzQsIDB4MjQ0MjAwMDEsCi0weDIxMGMwLCAweDI0NDI1MDM4LCAweDJlMjI4MjEsIDB4OGNhMjAwMDQsCi0weDhmODMwMTI4LCAweDIxMTQwLCAweDYyMTgyMSwgMHhhZjgzMDEyOCwKLTB4YWNhMDAwMDAsIDB4OGNjMjAwMTgsIDB4MjQ0M2ZmZmUsIDB4MmM2MjAwMTIsCi0weDEwNDAwMDA4LCAweDMxMDgwLCAweDNjMDEwMDAxLCAweDIyMDgyMSwKLTB4OGMyMjU4ZjAsIDB4NDAwMDA4LCAweDAsIDB4MjQwMjAwMDEsCi0weGFlZTI0ZTI0LCAweDNlMDAwMDgsIDB4MCwgMHgyN2JkZmZjOCwKLTB4YWZiZjAwMzAsIDB4YWZiNTAwMmMsIDB4YWZiNDAwMjgsIDB4YWZiMzAwMjQsCi0weGFmYjIwMDIwLCAweGFmYjEwMDFjLCAweGFmYjAwMDE4LCAweDhmODMwMTI4LAotMHg4ZjgyMDEyNCwgMHgxMDYyMDJiMCwgMHg5ODIxLCAweDNjMTEwMDFmLAotMHgzNjMxZmZmZiwgMHgzYzEyZmZmNSwgMHgzNjUyMTAwMCwgMHgyNDE1MDAxMiwKLTB4MjQxNDAwNDAsIDB4OGY4YzAxMjgsIDB4OGY4MjAxMjgsIDB4MjQ0MjAwMjAsCi0weGFmODIwMTI4LCAweDkxODIwMDFiLCAweDhmODMwMTI4LCAweDI0NDNmZmZlLAotMHgyYzYyMDAxMiwgMHgxMDQwMDI5YywgMHgzMTA4MCwgMHgzYzAxMDAwMSwKLTB4MjIwODIxLCAweDhjMjI1OTQ4LCAweDQwMDAwOCwgMHgwLAotMHg4ZjQyMDIxOCwgMHgzMDQyMDEwMCwgMHgxMDQwMDAwNywgMHgwLAotMHg5NTgzMDAxNiwgMHg5NTgyMDAxOCwgMHg2MjE4MjMsIDB4MzE0MDIsCi0weDQzMTAyMSwgMHhhNTgyMDAxNiwgMHg4ZDgyMDAxYywgMHgzYzAzODAwMCwKLTB4MzA0NGZmZmYsIDB4NDM2ODI0LCAweDNjMDMwODAwLCAweDQzMTgyNCwKLTB4MTFhMDAwMDQsIDB4YWQ4NDAwMWMsIDB4NDExNDAsIDB4ODAwM2RkOCwKLTB4MjQ0MjUyNDgsIDB4NDExNDAsIDB4MjQ0MjBlMjAsIDB4MmUyNTgyMSwKLTB4OTU2MjAwMGUsIDB4MzA0MmZmZmMsIDB4MTA2MDAwMDQsIDB4YTU2MjAwMGUsCi0weDk1ODQwMDE2LCAweDgwMDNlYzAsIDB4MCwgMHg4ZDY5MDAxOCwKLTB4NDAyMSwgMHg5NTJhMDAwMCwgMHgyNTI5MDAwMiwgMHg5NTI3MDAwMCwKLTB4MjUyOTAwMDIsIDB4OTUyNjAwMDAsIDB4MjUyOTAwMDIsIDB4OTUyNTAwMDAsCi0weDI1MjkwMDAyLCAweDk1MjQwMDAwLCAweDI1MjkwMDAyLCAweDk1MjMwMDAwLAotMHgyNTI5MDAwMiwgMHg5NTIyMDAwMCwgMHgyNTI5MDAwMiwgMHgxNDc1MDIxLAotMHgxNDY1MDIxLCAweDE0NTUwMjEsIDB4MTQ0NTAyMSwgMHgxNDM1MDIxLAotMHgxNDI1MDIxLCAweGExYzAyLCAweDMxNDJmZmZmLCAweDYyNTAyMSwKLTB4YTFjMDIsIDB4MzE0MmZmZmYsIDB4NjI1MDIxLCAweDk2ZTIwNDZhLAotMHgzMTRlZmZmZiwgMHgzMDQyMDAwMiwgMHgxMDQwMDA0NCwgMHg1MDIxLAotMHgyNTIyMDAxNCwgMHgyMjIxMDJiLCAweDEwNDAwMDE0LCAweDEyMDE4MjEsCi0weDI0MDUwMDBhLCAweDIwMjEsIDB4MjIzMTAyYiwgMHg1NDQwMDAwMSwKLTB4NzIxODIxLCAweDk0NjIwMDAwLCAweDI0NjMwMDAyLCAweDI0YTVmZmZmLAotMHgxNGEwZmZmOSwgMHg4MjIwMjEsIDB4NDFjMDIsIDB4MzA4MmZmZmYsCi0weDYyMjAyMSwgMHg0MTQwMiwgMHgzMDgzZmZmZiwgMHg0MzEwMjEsCi0weDMwNDJmZmZmLCAweDgwMDNlMzMsIDB4MTQyNTAyMSwgMHg5NTJhMDAwMCwKLTB4MjUyOTAwMDIsIDB4OTUyODAwMDAsIDB4MjUyOTAwMDIsIDB4OTUyNzAwMDAsCi0weDI1MjkwMDAyLCAweDk1MjYwMDAwLCAweDI1MjkwMDAyLCAweDk1MjUwMDAwLAotMHgyNTI5MDAwMiwgMHg5NTIzMDAwMCwgMHgyNTI5MDAwMiwgMHg5NTIyMDAwMCwKLTB4MjUyOTAwMDIsIDB4OTUyNDAwMDAsIDB4MjUyOTAwMDIsIDB4MTQ4NTAyMSwKLTB4MTQ3NTAyMSwgMHgxNDY1MDIxLCAweDE0NTUwMjEsIDB4MTQzNTAyMSwKLTB4MTQyNTAyMSwgMHg5NTIyMDAwMCwgMHg5NTIzMDAwMiwgMHgxNDQ1MDIxLAotMHgxNDI1MDIxLCAweDE0MzUwMjEsIDB4YTFjMDIsIDB4MzE0MmZmZmYsCi0weDYyNTAyMSwgMHhhMWMwMiwgMHgzMTQyZmZmZiwgMHg2MjUwMjEsCi0weDMxNDhmZmZmLCAweDUxMDAwMDAxLCAweDM0MDhmZmZmLCAweDhkNjIwMDE4LAotMHg5NDQzMDAwYywgMHgyNDAyMDgwMCwgMHg1NDYyMDAwNSwgMHhhNTY4MDAxMCwKLTB4OTU2MjAwMGUsIDB4MzQ0MjAwMDIsIDB4YTU2MjAwMGUsIDB4YTU2ODAwMTAsCi0weDk2ZTIwNDZhLCAweDI4MjEsIDB4MzA0MjAwMDgsIDB4MTQ0MDAwNTYsCi0weDMwMjEsIDB4OGQ2MzAwMTgsIDB4MjQ2MjAwMjQsIDB4MjIyMTAyYiwKLTB4MTA0MDAwMzQsIDB4MjQ2OTAwMTAsIDB4MjI5MTAyYiwgMHg1NDQwMDAwMSwKLTB4MTMyNDgyMSwgMHg5NTI1MDAwMCwgMHgyNDY5MDAxNCwgMHgyMjkxMDJiLAotMHgxMDQwMDAwMiwgMHgyNGE1ZmZlYywgMHgxMzI0ODIxLCAweDk1MjIwMDAwLAotMHgzMDQyMGZmZiwgMHgxNDQwMDAwMywgMHgyNTI5MDAwMiwgMHg4MDAzZTYwLAotMHgyNDEzMDAwMSwgMHg5ODIxLCAweGEwMzAyMSwgMHgyMjkxMDJiLAotMHg1NDQwMDAwMSwgMHgxMzI0ODIxLCAweDkxMjIwMDAxLCAweDI1MjkwMDAyLAotMHhhMjI4MjEsIDB4MjI5MTAyYiwgMHg1NDQwMDAwMSwgMHgxMzI0ODIxLAotMHgyNTI5MDAwMiwgMHgyMjkxMDJiLCAweDU0NDAwMDAxLCAweDEzMjQ4MjEsCi0weDk1MjIwMDAwLCAweDI1MjkwMDAyLCAweGEyMjgyMSwgMHgyMjkxMDJiLAotMHg1NDQwMDAwMSwgMHgxMzI0ODIxLCAweDk1MjIwMDAwLCAweDI1MjkwMDAyLAotMHhhMjI4MjEsIDB4MjI5MTAyYiwgMHg1NDQwMDAwMSwgMHgxMzI0ODIxLAotMHg5NTIyMDAwMCwgMHgyNTI5MDAwMiwgMHhhMjI4MjEsIDB4MjI5MTAyYiwKLTB4NTQ0MDAwMDEsIDB4MTMyNDgyMSwgMHg5NTIyMDAwMCwgMHg4MDAzZTk5LAotMHhhMjI4MjEsIDB4OTQ2NTAwMTAsIDB4OTQ2MjAwMTQsIDB4MjQ2OTAwMTYsCi0weDMwNDIwZmZmLCAweDE0NDAwMDAzLCAweDI0YTVmZmVjLCAweDgwMDNlOGMsCi0weDI0MTMwMDAxLCAweDk4MjEsIDB4YTAzMDIxLCAweDkxMjMwMDAxLAotMHgyNTI5MDAwNCwgMHg5NTIyMDAwMCwgMHgyNTI5MDAwMiwgMHg5NTI0MDAwMCwKLTB4MjUyOTAwMDIsIDB4YTMyODIxLCAweGEyMjgyMSwgMHg5NTIyMDAwMCwKLTB4OTUyMzAwMDIsIDB4YTQyODIxLCAweGEyMjgyMSwgMHhhMzI4MjEsCi0weDUxYzAyLCAweDMwYTJmZmZmLCAweDYyMjgyMSwgMHg1MWMwMiwKLTB4MzBhMmZmZmYsIDB4NjIyODIxLCAweDk2ZTIwNDZhLCAweDMwNDIwMDAxLAotMHgxMDQwMDAxZSwgMHgyMDIxLCAweDk1ODIwMDE2LCAweDRlMjAyMywKLTB4NDE0MDIsIDB4ODIyMDIxLCAweDMyNjIwMGZmLCAweDUwNDAwMDAyLAotMHg4NjIwMjEsIDB4ODUyMDIxLCAweDQxNDAyLCAweDgyMjAyMSwKLTB4MzA4NGZmZmYsIDB4NTA4MDAwMDEsIDB4MzQwNGZmZmYsIDB4OGQ2MjAwMTgsCi0weDI0NDMwMDE3LCAweDIyMzEwMmIsIDB4NTQ0MDAwMDEsIDB4NzIxODIxLAotMHg5MDYyMDAwMCwgMHgzODQzMDAxMSwgMHgyYzYzMDAwMSwgMHgzODQyMDAwNiwKLTB4MmM0MjAwMDEsIDB4NjIxODI1LCAweDEwNjAwMDA0LCAweDAsCi0weDk1NjIwMDBlLCAweDM0NDIwMDAxLCAweGE1NjIwMDBlLCAweDk1NjIwMDBlLAotMHgyNDBhMDAwMiwgMHgzMDQyMDAwNCwgMHgxMDQwMDAwMiwgMHhhNTY0MDAxMiwKLTB4MjQwYTAwMDQsIDB4OGY4ODAxMjAsIDB4Mjc2MjM4MDAsIDB4MjUwOTAwMjAsCi0weDEyMjEwMmIsIDB4NTA0MDAwMDEsIDB4Mjc2OTMwMDAsIDB4OGY4MjAxMjgsCi0weDExMjIwMDA0LCAweDAsIDB4OGY4MjAxMjQsIDB4MTUyMjAwMDcsCi0weDI0MDQwMDIwLCAweDhlZTIwMWE0LCAweDgwMjEsIDB4MjQ0MjAwMDEsCi0weGFlZTIwMWE0LCAweDgwMDNmNGYsIDB4OGVlMjAxYTQsIDB4OGVlNTcyNGMsCi0weDhlZTYwNDkwLCAweDhlZTcwNDk0LCAweGFkMGIwMDA4LCAweGE1MDQwMDBlLAotMHhhZDBhMDAxOCwgMHg1Mjk0MCwgMHhhMDE4MjEsIDB4MTAyMSwKLTB4ZTMzODIxLCAweGUzMjAyYiwgMHhjMjMwMjEsIDB4YzQzMDIxLAotMHhhZDA2MDAwMCwgMHhhZDA3MDAwNCwgMHg4ZWUyNzI0YywgMHg0ZDEwMjUsCi0weGFkMDIwMDFjLCAweDhlZTIwNGM0LCAweGFkMDIwMDEwLCAweGFmODkwMTIwLAotMHg5MmUyNGUyMCwgMHgxNDQwMDA2MCwgMHgyNDEwMDAwMSwgMHgyNTQzZmZlZSwKLTB4MmM2MzAwMDIsIDB4Mzk0MjAwMTEsIDB4MmM0MjAwMDEsIDB4NjIxODI1LAotMHgxMDYwMDAyNCwgMHgwLCAweDhlZTI0ZTMwLCAweDIxMGMwLAotMHgyNDQyNTAzOCwgMHgyZTIyMDIxLCAweDhjODIwMDAwLCAweDE0NTUwMDBmLAotMHgwLCAweDhlZTM0ZTMwLCAweDhlZTI0ZTM0LCAweDEwNjIwMDBiLAotMHgwLCAweDhjODIwMDA0LCAweDI0NDIwMDAxLCAweGFjODIwMDA0LAotMHg4ZWUyNGUzNCwgMHg4ZWUzNGUzMCwgMHgyNDQyMDAwMSwgMHgxMDU0MDAyYiwKLTB4MCwgMHg4MDAzZjJlLCAweDAsIDB4OGVlMjRlMzAsCi0weDI0NDIwMDAxLCAweDUwNTQwMDAzLCAweDEwMjEsIDB4OGVlMjRlMzAsCi0weDI0NDIwMDAxLCAweGFlZTI0ZTMwLCAweDhlZTI0ZTMwLCAweDIxMGMwLAotMHgyNDQyNTAzOCwgMHgyZTIyMDIxLCAweDI0MDIwMDAxLCAweDgwMDNmNGUsCi0weGFjOTUwMDAwLCAweDhlZTI0ZTMwLCAweDIxMGMwLCAweDI0NDI1MDM4LAotMHgyZTIyMDIxLCAweDhjODMwMDAwLCAweDI0MDIwMDA3LCAweDE0NjIwMDFmLAotMHgwLCAweDhlZTM0ZTMwLCAweDhlZTI0ZTM0LCAweDEwNjIwMDFiLAotMHgwLCAweDhjODIwMDA0LCAweDI0NDIwMDAxLCAweGFjODIwMDA0LAotMHg4ZWUyNGUzNCwgMHg4ZWUzNGUzMCwgMHgyNDQyMDAwMSwgMHgxMDU0MDAwNywKLTB4MCwgMHg4ZWUyNGUzNCwgMHgyNDQyMDAwMSwgMHgxMDYyMDAwNSwKLTB4MCwgMHg4MDAzZjNhLCAweDAsIDB4MTQ2MDAwMDUsCi0weDAsIDB4OGY4MjAxMjgsIDB4MjQ0MjAwMjAsIDB4YWY4MjAxMjgsCi0weDhmODIwMTI4LCAweDhjODIwMDA0LCAweDJjNDIwMDExLCAweDUwNDAwMDEyLAotMHhhYzgwMDAwMCwgMHg4MDAzZjRmLCAweDAsIDB4OGVlMjRlMzAsCi0weDI0NDIwMDAxLCAweDUwNTQwMDAzLCAweDEwMjEsIDB4OGVlMjRlMzAsCi0weDI0NDIwMDAxLCAweGFlZTI0ZTMwLCAweDhlZTI0ZTMwLCAweDIxMGMwLAotMHgyNDQyNTAzOCwgMHgyZTIyMDIxLCAweDI0MDIwMDA3LCAweGFjODIwMDAwLAotMHgyNDAyMDAwMSwgMHhhYzgyMDAwNCwgMHgxNjAwMDAwZCwgMHgwLAotMHg4ZjgyMDEyMCwgMHgzYzA0MDAwMSwgMHgyNDg0NTkzOCwgMHhhZmEwMDAxNCwKLTB4YWZhMjAwMTAsIDB4OGQ4NjAwMWMsIDB4OGY4NzAxMjQsIDB4M2MwNTAwMDgsCi0weGMwMDI0MDMsIDB4MzRhNTAwMDEsIDB4ODAwNDA1NywgMHgwLAotMHg4ZWUyNzI0YywgMHgyNDQyMDAwMSwgMHgzMDQyMDdmZiwgMHgxMWEwMDAwNiwKLTB4YWVlMjcyNGMsIDB4OGVlMjAxZDAsIDB4MjQ0MmZmZmYsIDB4YWVlMjAxZDAsCi0weDgwMDNmNmIsIDB4OGVlMjAxZDAsIDB4OGVlMjAxY2MsIDB4MjQ0MmZmZmYsCi0weGFlZTIwMWNjLCAweDhlZTIwMWNjLCAweDhlZTIwMWQ4LCAweDI0NDJmZmZmLAotMHhhZWUyMDFkOCwgMHg4MDA0MDU3LCAweDhlZTIwMWQ4LCAweDhmNDIwMjQwLAotMHgxMDQwMDBlNSwgMHgwLCAweDhlZTIwZTFjLCAweDI0NDIwMDAxLAotMHg4MDA0MDU3LCAweGFlZTIwZTFjLCAweDk1ODIwMDFlLCAweGFkODIwMDFjLAotMHg4ZjQyMDI0MCwgMHgxMDQwMDA3MiwgMHgwLCAweDhlZTIwZTFjLAotMHgyNDQyMDAwMSwgMHhhZWUyMGUxYywgMHg4ZjQzMDI0MCwgMHg0MzEwMmIsCi0weDE0NDAwMGQ1LCAweDAsIDB4OGY4MzAxMjAsIDB4Mjc2MjM4MDAsCi0weDI0NjYwMDIwLCAweGMyMTAyYiwgMHg1MDQwMDAwMSwgMHgyNzY2MzAwMCwKLTB4OGY4MjAxMjgsIDB4MTBjMjAwMDQsIDB4MCwgMHg4ZjgyMDEyNCwKLTB4MTRjMjAwMDcsIDB4MCwgMHg4ZWUyMDFhNCwgMHg4MDIxLAotMHgyNDQyMDAwMSwgMHhhZWUyMDFhNCwgMHg4MDAzZmRhLCAweDhlZTIwMWE0LAotMHg4ZWUyNzI0YywgMHhhYzYyMDAxYywgMHg4ZWU0MDRhOCwgMHg4ZWU1MDRhYywKLTB4MjQ2MjAwMWMsIDB4YWM2MjAwMDgsIDB4MjQwMjAwMDgsIDB4YTQ2MjAwMGUsCi0weDI0MDIwMDExLCAweGFjNjIwMDE4LCAweGFjNjQwMDAwLCAweGFjNjUwMDA0LAotMHg4ZWUyMDRjNCwgMHhhYzYyMDAxMCwgMHhhZjg2MDEyMCwgMHg5MmUyNGUyMCwKLTB4MTQ0MDAwMzQsIDB4MjQxMDAwMDEsIDB4OGVlMjRlMzAsIDB4MjEwYzAsCi0weDI0NDI1MDM4LCAweDJlMjIwMjEsIDB4OGM4MjAwMDAsIDB4MTQ1NTAwMWYsCi0weDAsIDB4OGVlMzRlMzAsIDB4OGVlMjRlMzQsIDB4MTA2MjAwMWIsCi0weDAsIDB4OGM4MjAwMDQsIDB4MjQ0MjAwMDEsIDB4YWM4MjAwMDQsCi0weDhlZTI0ZTM0LCAweDhlZTM0ZTMwLCAweDI0NDIwMDAxLCAweDEwNTQwMDA3LAotMHgwLCAweDhlZTI0ZTM0LCAweDI0NDIwMDAxLCAweDEwNjIwMDA1LAotMHgwLCAweDgwMDNmYzYsIDB4MCwgMHgxNDYwMDAwNSwKLTB4MCwgMHg4ZjgyMDEyOCwgMHgyNDQyMDAyMCwgMHhhZjgyMDEyOCwKLTB4OGY4MjAxMjgsIDB4OGM4MjAwMDQsIDB4MmM0MjAwMTEsIDB4NTA0MDAwMTEsCi0weGFjODAwMDAwLCAweDgwMDNmZGEsIDB4MCwgMHg4ZWUyNGUzMCwKLTB4MjQ0MjAwMDEsIDB4NTA1NDAwMDMsIDB4MTAyMSwgMHg4ZWUyNGUzMCwKLTB4MjQ0MjAwMDEsIDB4YWVlMjRlMzAsIDB4OGVlMjRlMzAsIDB4MjEwYzAsCi0weDI0NDI1MDM4LCAweDJlMjIwMjEsIDB4MjQwMjAwMDEsIDB4YWM5NTAwMDAsCi0weGFjODIwMDA0LCAweDU2MDAwMDBiLCAweDI0MTAwMDAxLCAweDhlZTI3MjRjLAotMHgzYzA0MDAwMSwgMHgyNDg0NThhOCwgMHhhZmEwMDAxNCwgMHhhZmEyMDAxMCwKLTB4OGVlNjcyNGMsIDB4OGY0NzAyODAsIDB4M2MwNTAwMDksIDB4YzAwMjQwMywKLTB4MzRhNWYwMDgsIDB4NTYwMDAwMDEsIDB4YWVlMDBlMWMsIDB4OGVlMjAxODgsCi0weDI0NDIwMDAxLCAweGFlZTIwMTg4LCAweDgwMDQwNTAsIDB4OGVlMjAxODgsCi0weDhmODMwMTIwLCAweDI3NjIzODAwLCAweDI0NjYwMDIwLCAweGMyMTAyYiwKLTB4NTA0MDAwMDEsIDB4Mjc2NjMwMDAsIDB4OGY4MjAxMjgsIDB4MTBjMjAwMDQsCi0weDAsIDB4OGY4MjAxMjQsIDB4MTRjMjAwMDcsIDB4MCwKLTB4OGVlMjAxYTQsIDB4ODAyMSwgMHgyNDQyMDAwMSwgMHhhZWUyMDFhNCwKLTB4ODAwNDA0NCwgMHg4ZWUyMDFhNCwgMHg4ZWUyNzI0YywgMHhhYzYyMDAxYywKLTB4OGVlNDA0YTgsIDB4OGVlNTA0YWMsIDB4MjQ2MjAwMWMsIDB4YWM2MjAwMDgsCi0weDI0MDIwMDA4LCAweGE0NjIwMDBlLCAweDI0MDIwMDExLCAweGFjNjIwMDE4LAotMHhhYzY0MDAwMCwgMHhhYzY1MDAwNCwgMHg4ZWUyMDRjNCwgMHhhYzYyMDAxMCwKLTB4YWY4NjAxMjAsIDB4OTJlMjRlMjAsIDB4MTQ0MDAwMzQsIDB4MjQxMDAwMDEsCi0weDhlZTI0ZTMwLCAweDIxMGMwLCAweDI0NDI1MDM4LCAweDJlMjIwMjEsCi0weDhjODIwMDAwLCAweDE0NTUwMDFmLCAweDAsIDB4OGVlMzRlMzAsCi0weDhlZTI0ZTM0LCAweDEwNjIwMDFiLCAweDAsIDB4OGM4MjAwMDQsCi0weDI0NDIwMDAxLCAweGFjODIwMDA0LCAweDhlZTI0ZTM0LCAweDhlZTM0ZTMwLAotMHgyNDQyMDAwMSwgMHgxMDU0MDAwNywgMHgwLCAweDhlZTI0ZTM0LAotMHgyNDQyMDAwMSwgMHgxMDYyMDAwNSwgMHgwLCAweDgwMDQwMzAsCi0weDAsIDB4MTQ2MDAwMDUsIDB4MCwgMHg4ZjgyMDEyOCwKLTB4MjQ0MjAwMjAsIDB4YWY4MjAxMjgsIDB4OGY4MjAxMjgsIDB4OGM4MjAwMDQsCi0weDJjNDIwMDExLCAweDUwNDAwMDExLCAweGFjODAwMDAwLCAweDgwMDQwNDQsCi0weDAsIDB4OGVlMjRlMzAsIDB4MjQ0MjAwMDEsIDB4NTA1NDAwMDMsCi0weDEwMjEsIDB4OGVlMjRlMzAsIDB4MjQ0MjAwMDEsIDB4YWVlMjRlMzAsCi0weDhlZTI0ZTMwLCAweDIxMGMwLCAweDI0NDI1MDM4LCAweDJlMjIwMjEsCi0weDI0MDIwMDAxLCAweGFjOTUwMDAwLCAweGFjODIwMDA0LCAweDE2MDAwMDBiLAotMHgwLCAweDhlZTI3MjRjLCAweDNjMDQwMDAxLCAweDI0ODQ1OGE4LAotMHhhZmEwMDAxNCwgMHhhZmEyMDAxMCwgMHg4ZWU2NzI0YywgMHg4ZjQ3MDI4MCwKLTB4M2MwNTAwMDksIDB4YzAwMjQwMywgMHgzNGE1ZjAwOCwgMHg4ZWUyMDE3NCwKLTB4MjQ0MjAwMDEsIDB4YWVlMjAxNzQsIDB4ODAwNDA1NywgMHg4ZWUyMDE3NCwKLTB4MjQwMjAwMDEsIDB4YWVlMjRlMjQsIDB4OGY4MzAxMjgsIDB4OGY4MjAxMjQsCi0weDE0NjJmZDU4LCAweDAsIDB4OGZiZjAwMzAsIDB4OGZiNTAwMmMsCi0weDhmYjQwMDI4LCAweDhmYjMwMDI0LCAweDhmYjIwMDIwLCAweDhmYjEwMDFjLAotMHg4ZmIwMDAxOCwgMHgzZTAwMDA4LCAweDI3YmQwMDM4LCAweDI3YmRmZmU4LAotMHgyNzg0MDIwOCwgMHgyNzQ1MDIwMCwgMHgyNDA2MDAwOCwgMHhhZmJmMDAxNCwKLTB4YzAwMjQ5YSwgMHhhZmIwMDAxMCwgMHgyMDIxLCAweDI0MTAwMDAxLAotMHgyNDAyMjQxZiwgMHhhZjkwMDIxMCwgMHhhZjkwMDIwMCwgMHhhZjgwMDIwNCwKLTB4YWY4MjAyMTQsIDB4OGY0NjAyNDgsIDB4MjQwMzAwMDQsIDB4M2MwMjAwNDAsCi0weDNjMDEwMDAxLCAweGFjMjM1Y2M0LCAweDNjMDEwMDAxLCAweGFjMjM1Y2M4LAotMHgzYzAxMDAwMSwgMHhhYzIwNWQ5YywgMHgzYzAxMDAwMSwgMHhhYzIyNWNjMCwKLTB4M2MwMTAwMDEsIDB4YWMyMzVjYzgsIDB4YzAwNTEwOCwgMHgyNDA1MDAwNCwKLTB4YzAwNDgyMiwgMHgwLCAweDhlZTIwMDAwLCAweDNjMDNmZWZmLAotMHgzNDYzZmZmZCwgMHg0MzEwMjQsIDB4YWVlMjAwMDAsIDB4M2MwMjNjMDAsCi0weGFmODIwMjFjLCAweDNjMDEwMDAxLCAweDM3MDgyMSwgMHhhYzMwODNhYywKLTB4OGZiZjAwMTQsIDB4OGZiMDAwMTAsIDB4M2UwMDAwOCwgMHgyN2JkMDAxOCwKLTB4MjdiZGZmZTAsIDB4M2MwNTAwMDgsIDB4MzRhNTA0MDAsIDB4YWZiZjAwMTgsCi0weGFmYTAwMDEwLCAweGFmYTAwMDE0LCAweDhmODYwMjAwLCAweDNjMDQwMDAxLAotMHgyNDg0NTlmMCwgMHhjMDAyNDAzLCAweDM4MjEsIDB4OGVlMjAyODAsCi0weDI0NDIwMDAxLCAweGFlZTIwMjgwLCAweDhlZTIwMjgwLCAweDhmODMwMjAwLAotMHgzYzAyM2YwMCwgMHg2MjE4MjQsIDB4OGZiZjAwMTgsIDB4M2MwMjA0MDAsCi0weDNlMDAwMDgsIDB4MjdiZDAwMjAsIDB4MjdiZGZmZDgsIDB4YWZiZjAwMjAsCi0weGFmYjEwMDFjLCAweGFmYjAwMDE4LCAweDhmOTAwMjIwLCAweDhlZTIwMjE0LAotMHgzODIxLCAweDI0NDIwMDAxLCAweGFlZTIwMjE0LCAweDhlZTIwMjE0LAotMHgzYzAyMDMwMCwgMHgyMDIxMDI0LCAweDEwNDAwMDI3LCAweDNjMTEwNDAwLAotMHhjMDA0MjliLCAweDAsIDB4M2MwMjAxMDAsIDB4MjAyMTAyNCwKLTB4MTA0MDAwMDcsIDB4MCwgMHg4ZWUyMDIxOCwgMHgyNDQyMDAwMSwKLTB4YWVlMjAyMTgsIDB4OGVlMjAyMTgsIDB4ODAwNDBjNiwgMHgzYzAzZmRmZiwKLTB4OGVlMjAyMWMsIDB4MjQ0MjAwMDEsIDB4YWVlMjAyMWMsIDB4OGVlMjAyMWMsCi0weDNjMDNmZGZmLCAweDM0NjNmZmZmLCAweDNjMDgwOGZmLCAweDM1MDhmZmZmLAotMHg4ZWUyMDAwMCwgMHgzYzA0MDAwMSwgMHgyNDg0NTlmYywgMHgzYzA1MDAwOCwKLTB4MjAwMzAyMSwgMHg0MzEwMjQsIDB4YWVlMjAwMDAsIDB4OGY4MjAyMjAsCi0weDM4MjEsIDB4M2MwMzAzMDAsIDB4NDgxMDI0LCAweDQzMTAyNSwKLTB4YWY4MjAyMjAsIDB4YWZhMDAwMTAsIDB4YzAwMjQwMywgMHhhZmEwMDAxNCwKLTB4ODAwNDI5NiwgMHgwLCAweDIxMTEwMjQsIDB4MTA0MDAwMWYsCi0weDNjMDI0MDAwLCAweDhmODMwMjI0LCAweDI0MDIxNDAyLCAweDE0NjIwMDBiLAotMHgzYzAzZmRmZiwgMHgzYzA0MDAwMSwgMHgyNDg0NWEwOCwgMHgzYzA1MDAwOCwKLTB4YWZhMDAwMTAsIDB4YWZhMDAwMTQsIDB4OGY4NjAyMjQsIDB4MzRhNWZmZmYsCi0weGMwMDI0MDMsIDB4MzgyMSwgMHgzYzAzZmRmZiwgMHg4ZWUyMDAwMCwKLTB4MzQ2M2ZmZmYsIDB4MjAwMjAyMSwgMHg0MzEwMjQsIDB4YzAwNGU1NCwKLTB4YWVlMjAwMDAsIDB4OGVlMjAyMjAsIDB4MjQ0MjAwMDEsIDB4YWVlMjAyMjAsCi0weDhlZTIwMjIwLCAweDhmODIwMjIwLCAweDNjMDMwOGZmLCAweDM0NjNmZmZmLAotMHg0MzEwMjQsIDB4ODAwNDI5NSwgMHg1MTEwMjUsIDB4MjAyMTAyNCwKLTB4MTA0MDAxNDIsIDB4MCwgMHg4ZWUyMDIyYywgMHgyNDQyMDAwMSwKLTB4YWVlMjAyMmMsIDB4OGVlMjAyMmMsIDB4OGY4MjAyMjAsIDB4M2MwMzA4ZmYsCi0weDM0NjNmZmZmLCAweDQzMTAyNCwgMHgzNDQyMDAwNCwgMHhhZjgyMDIyMCwKLTB4OGY4MzAwNTQsIDB4OGY4MjAwNTQsIDB4ODAwNDEwZSwgMHgyNDYzMDAwMiwKLTB4OGY4MjAwNTQsIDB4NjIxMDIzLCAweDJjNDIwMDAzLCAweDE0NDBmZmZjLAotMHgwLCAweDhmODYwMGUwLCAweDhmODQwMGU0LCAweDMwYzIwMDA3LAotMHgxMDQwMDAxMiwgMHgwLCAweDhmODMwMGU0LCAweDI0MDJmZmY4LAotMHhjMjEwMjQsIDB4MTA0MzAwMGQsIDB4MCwgMHg4ZjgyMDA1NCwKLTB4OGY4MzAwZTAsIDB4MTRjMzAwMDksIDB4MjQ0NDAwNTAsIDB4OGY4MjAwNTQsCi0weDgyMTAyMywgMHgyYzQyMDA1MSwgMHgxMDQwMDAwNCwgMHgwLAotMHg4ZjgyMDBlMCwgMHgxMGMyZmZmOSwgMHgwLCAweDhmODIwMjIwLAotMHgzYzAzMDhmZiwgMHgzNDYzZmZmZCwgMHg0MzEwMjQsIDB4YWY4MjAyMjAsCi0weDhmODYwMGUwLCAweDMwYzIwMDA3LCAweDEwNDAwMDAzLCAweDI0MDJmZmY4LAotMHhjMjMwMjQsIDB4YWY4NjAwZTAsIDB4OGY4MzAwYzQsIDB4M2MwMjAwMWYsCi0weDM0NDJmZmZmLCAweDI0NjgwMDA4LCAweDQ4MTAyYiwgMHgxMDQwMDAwMywKLTB4M2MwMmZmZjUsIDB4MzQ0MjEwMDAsIDB4MTAyNDAyMSwgMHg4ZjhiMDBjOCwKLTB4OGY4NTAxMjAsIDB4OGY4NDAxMjQsIDB4ODAwNDE0NSwgMHg2MDIxLAotMHgyNzYyMzgwMCwgMHg4MjEwMmIsIDB4NTA0MDAwMDEsIDB4Mjc2NDMwMDAsCi0weDEwYTQwMDEwLCAweDMxODIwMGZmLCAweDhjODIwMDE4LCAweDM4NDMwMDA3LAotMHgyYzYzMDAwMSwgMHgzODQyMDAwYiwgMHgyYzQyMDAwMSwgMHg2MjE4MjUsCi0weDUwNjBmZmYzLCAweDI0ODQwMDIwLCAweDhlZTIwMjQwLCAweDI0MGMwMDAxLAotMHgyNDQyMDAwMSwgMHhhZWUyMDI0MCwgMHg4ZWUyMDI0MCwgMHg4YzhiMDAwOCwKLTB4MzE4MjAwZmYsIDB4MTQ0MDAwNjUsIDB4MCwgMHgzYzAyMDAwMSwKLTB4NTcxMDIxLCAweDkwNDI4M2MwLCAweDE0NDAwMDYwLCAweDAsCi0weDhmODQwMGU0LCAweGM0MTAyMywgMHgyMThjMywgMHg0NjIwMDAxLAotMHgyNDYzMDIwMCwgMHg4Zjg5MDBjNCwgMHgxMDYwMDAwNSwgMHgyNDAyMDAwMSwKLTB4MTA2MjAwMDksIDB4MCwgMHg4MDA0MTg3LCAweDAsCi0weDhlZTIwMjMwLCAweDEyMDU4MjEsIDB4MjQ0MjAwMDEsIDB4YWVlMjAyMzAsCi0weDgwMDQxYmMsIDB4OGVlMjAyMzAsIDB4OGVlMjAyMzQsIDB4M2MwNTAwMGEsCi0weDI0NDIwMDAxLCAweGFlZTIwMjM0LCAweDhjOGIwMDAwLCAweDM0YTVmMDAwLAotMHg4ZWUyMDIzNCwgMHgxMmIxODIzLCAweGEzMTAyYiwgMHg1NDQwMDAwMSwKLTB4NjUxODIxLCAweDJjNjIyMzNmLCAweDE0NDAwMDQwLCAweDAsCi0weDhmODIwMGU4LCAweDI0NDIwMDA4LCAweGFmODIwMGU4LCAweDhmODIwMGU4LAotMHg4ZjgyMDBlNCwgMHgxMjA1ODIxLCAweDI0NDIwMDA4LCAweGFmODIwMGU0LAotMHg4MDA0MWJjLCAweDhmODIwMGU0LCAweDhlZTIwMjM4LCAweDNjMDMwMDBhLAotMHgyNDQyMDAwMSwgMHhhZWUyMDIzOCwgMHg4Yzg0MDAwMCwgMHgzNDYzZjAwMCwKLTB4OGVlMjAyMzgsIDB4ODgzODIzLCAweDY3MTAyYiwgMHg1NDQwMDAwMSwKLTB4ZTMzODIxLCAweDNjMDIwMDAzLCAweDM0NDIwZDQwLCAweDQ3MTAyYiwKLTB4MTA0MDAwMDMsIDB4MCwgMHg4MDA0MWJjLCAweDgwNTgyMSwKLTB4OGY4MjAwZTQsIDB4MjQ0NDAwMDgsIDB4YWY4NDAwZTQsIDB4OGY4NDAwZTQsCi0weDEwODYwMDE4LCAweDNjMDUwMDBhLCAweDM0YTVmMDAwLCAweDNjMGEwMDAzLAotMHgzNTRhMGQ0MCwgMHg4ZWUyMDA3YywgMHgyNDQyMDAwMSwgMHhhZWUyMDA3YywKLTB4OGM4MzAwMDAsIDB4OGVlMjAwN2MsIDB4NjgzODIzLCAweGE3MTAyYiwKLTB4NTQ0MDAwMDEsIDB4ZTUzODIxLCAweDE0NzEwMmIsIDB4NTQ0MDAwMDcsCi0weDYwNTgyMSwgMHg4ZjgyMDBlNCwgMHgyNDQ0MDAwOCwgMHhhZjg0MDBlNCwKLTB4OGY4NDAwZTQsIDB4MTQ4NmZmZWYsIDB4MCwgMHgxNDg2MDAwNSwKLTB4MCwgMHgxMjA1ODIxLCAweGFmODYwMGU0LCAweDgwMDQxYmMsCi0weGFmODYwMGU4LCAweGFmODQwMGU0LCAweGFmODQwMGU4LCAweDhmODIwMGM4LAotMHgzYzAzMDAwYSwgMHgzNDYzZjAwMCwgMHg0ODM4MjMsIDB4NjcxMDJiLAotMHg1NDQwMDAwMSwgMHhlMzM4MjEsIDB4M2MwMjAwMDMsIDB4MzQ0MjBkM2YsCi0weDQ3MTAyYiwgMHg1NDQwMDAwNywgMHg2MDIxLCAweDE2ODM4MjMsCi0weDY3MTAyYiwgMHg1NDQwMDAwMywgMHhlMzM4MjEsIDB4ODAwNDFjZiwKLTB4M2MwMjAwMDMsIDB4M2MwMjAwMDMsIDB4MzQ0MjBkM2YsIDB4NDcxMDJiLAotMHgxNDQwMDAxNiwgMHgzMTgyMDBmZiwgMHgxNDQwMDAwNiwgMHgwLAotMHgzYzAyMDAwMSwgMHg1NzEwMjEsIDB4OTA0MjgzYzAsIDB4MTA0MDAwMGYsCi0weDAsIDB4OGVlMjAyM2MsIDB4M2MwNGZkZmYsIDB4OGVlMzAwMDAsCi0weDM0ODRmZmZmLCAweDI0NDIwMDAxLCAweGFlZTIwMjNjLCAweDhlZTIwMjNjLAotMHgyNDAyMDAwMSwgMHg2NDE4MjQsIDB4M2MwMTAwMDEsIDB4MzcwODIxLAotMHhhMDIyODNiOCwgMHg4MDA0MjJjLCAweGFlZTMwMDAwLCAweGFmOGIwMGM4LAotMHg4ZjgzMDBjOCwgMHg4ZjgyMDBjNCwgMHgzYzA0MDAwYSwgMHgzNDg0ZjAwMCwKLTB4NjIzODIzLCAweDg3MTAyYiwgMHg1NDQwMDAwMSwgMHhlNDM4MjEsCi0weDNjMDIwMDAzLCAweDM0NDIwZDQwLCAweDQ3MTAyYiwgMHgyY2UzMDAwMSwKLTB4NDMxMDI1LCAweDEwNDAwMDA4LCAweDAsIDB4OGY4MjAyMjAsCi0weDNjMDMwOGZmLCAweDM0NjNmZmZmLCAweDQzMTAyNCwgMHgzYzAzNDAwMCwKLTB4NDMxMDI1LCAweGFmODIwMjIwLCAweDhmODYwMGUwLCAweDhmODQwMGU0LAotMHgxMGM0MDAyYSwgMHgwLCAweDhlZTIwMDdjLCAweDI0NDIwMDAxLAotMHhhZWUyMDA3YywgMHg4ZWUyMDA3YywgMHgyNGMyZmZmOCwgMHhhZjgyMDBlMCwKLTB4M2MwMjAwMDEsIDB4OGM0MjdlMzAsIDB4M2MwMzAwMDgsIDB4OGY4NjAwZTAsCi0weDQzMTAyNCwgMHgxMDQwMDAxZCwgMHgwLCAweDEwYzQwMDFiLAotMHgyNDBkZmZmOCwgMHgzYzBhMDAwYSwgMHgzNTRhZjAwMCwgMHgzYzBjMDA4MCwKLTB4MjQ4NTAwMDgsIDB4Mjc2MjI4MDAsIDB4NTBhMjAwMDEsIDB4Mjc2NTE4MDAsCi0weDhjODgwMDA0LCAweDhjODIwMDAwLCAweDhjYTkwMDAwLCAweDMxMDNmZmZmLAotMHg0MzEwMjEsIDB4NGQxMDI0LCAweDI0NDMwMDEwLCAweDZiMTAyYiwKLTB4NTQ0MDAwMDEsIDB4NmExODIxLCAweDEyYjEwMmIsIDB4NTQ0MDAwMDEsCi0weDEyYTQ4MjEsIDB4MTA2OTAwMDIsIDB4MTBjMTAyNSwgMHhhYzgyMDAwNCwKLTB4YTAyMDIxLCAweDE0YzRmZmViLCAweDI0ODUwMDA4LCAweDhmODIwMjIwLAotMHgzYzAzMDhmZiwgMHgzNDYzZmZmZiwgMHg0MzEwMjQsIDB4MzQ0MjAwMDIsCi0weGFmODIwMjIwLCAweDhmODMwMDU0LCAweDhmODIwMDU0LCAweDgwMDQyMzcsCi0weDI0NjMwMDAxLCAweDhmODIwMDU0LCAweDYyMTAyMywgMHgyYzQyMDAwMiwKLTB4MTQ0MGZmZmMsIDB4MCwgMHg4ZjgyMDIyMCwgMHgzYzAzMDhmZiwKLTB4MzQ2M2ZmZmIsIDB4NDMxMDI0LCAweGFmODIwMjIwLCAweDYwMTAwNTUsCi0weDAsIDB4OGVlMjAyMjgsIDB4MjQ0MjAwMDEsIDB4YWVlMjAyMjgsCi0weDhlZTIwMjI4LCAweDhmODIwMjIwLCAweDNjMDMwOGZmLCAweDM0NjNmZmZmLAotMHg0MzEwMjQsIDB4MzQ0MjAwMDQsIDB4YWY4MjAyMjAsIDB4OGY4MzAwNTQsCi0weDhmODIwMDU0LCAweDgwMDQyNTEsIDB4MjQ2MzAwMDIsIDB4OGY4MjAwNTQsCi0weDYyMTAyMywgMHgyYzQyMDAwMywgMHgxNDQwZmZmYywgMHgwLAotMHg4Zjg2MDBlMCwgMHgzMGMyMDAwNywgMHgxMDQwMDAxMiwgMHgwLAotMHg4ZjgzMDBlNCwgMHgyNDAyZmZmOCwgMHhjMjEwMjQsIDB4MTA0MzAwMGQsCi0weDAsIDB4OGY4MjAwNTQsIDB4OGY4MzAwZTAsIDB4MTRjMzAwMDksCi0weDI0NDQwMDMyLCAweDhmODIwMDU0LCAweDgyMTAyMywgMHgyYzQyMDAzMywKLTB4MTA0MDAwMDQsIDB4MCwgMHg4ZjgyMDBlMCwgMHgxMGMyZmZmOSwKLTB4MCwgMHg4ZjgyMDIyMCwgMHgzYzAzMDhmZiwgMHgzNDYzZmZmZCwKLTB4NDMxMDI0LCAweGFmODIwMjIwLCAweDhmODYwMGUwLCAweDMwYzIwMDA3LAotMHgxMDQwMDAwMywgMHgyNDAyZmZmOCwgMHhjMjMwMjQsIDB4YWY4NjAwZTAsCi0weDI0MDMwMWY1LCAweDhmODIwMGU4LCAweDY3MzgyMywgMHg3MThjMCwKLTB4NDMxMDIxLCAweGFmODIwMGU4LCAweDhmODIwMGU4LCAweGFmODIwMGU0LAotMHg4ZWUyMDA3YywgMHgzYzA0MDhmZiwgMHgzNDg0ZmZmZiwgMHg0NzEwMjEsCi0weGFlZTIwMDdjLCAweDhmODIwMjIwLCAweDNjMDM4MDAwLCAweDM0NjMwMDAyLAotMHg0NDEwMjQsIDB4NDMxMDI1LCAweGFmODIwMjIwLCAweDhmODMwMDU0LAotMHg4ZjgyMDA1NCwgMHg4MDA0MjhkLCAweDI0NjMwMDAxLCAweDhmODIwMDU0LAotMHg2MjEwMjMsIDB4MmM0MjAwMDIsIDB4MTQ0MGZmZmMsIDB4MCwKLTB4OGY4MjAyMjAsIDB4M2MwMzA4ZmYsIDB4MzQ2M2ZmZmIsIDB4NDMxMDI0LAotMHhhZjgyMDIyMCwgMHg4ZmJmMDAyMCwgMHg4ZmIxMDAxYywgMHg4ZmIwMDAxOCwKLTB4M2UwMDAwOCwgMHgyN2JkMDAyOCwgMHgzYzAyMDAwMSwgMHg4YzQyNWNkOCwKLTB4MjdiZGZmZDgsIDB4MTA0MDAwMTIsIDB4YWZiZjAwMjAsIDB4M2MwNDAwMDEsCi0weDI0ODQ1YTE0LCAweDNjMDUwMDA4LCAweDI0MDIwMDAxLCAweDNjMDEwMDAxLAotMHgzNzA4MjEsIDB4YWMyMjgzYWMsIDB4YWZhMDAwMTAsIDB4YWZhMDAwMTQsCi0weDhmODYwMjIwLCAweDM0YTUwNDk4LCAweDNjMDEwMDAxLCAweGFjMjA1Y2Q4LAotMHgzYzAxMDAwMSwgMHhhYzIyNWNjYywgMHhjMDAyNDAzLCAweDM4MjEsCi0weDhmNDIwMjY4LCAweDNjMDM3ZmZmLCAweDM0NjNmZmZmLCAweDQzMTAyNCwKLTB4YWY0MjAyNjgsIDB4OGVlMjA0ZDAsIDB4OGVlNDA0ZDQsIDB4MjQwM2ZmZmUsCi0weDQzMTAyNCwgMHgzMDg0MDAwMiwgMHgxMDgwMDExZSwgMHhhZWUyMDRkMCwKLTB4OGVlMjA0ZDQsIDB4MjQwM2ZmZmQsIDB4NDMxMDI0LCAweGFlZTIwNGQ0LAotMHg4ZjgyMDA0NCwgMHgzYzAzMDYwMCwgMHgzNDYzMjAwMCwgMHgzNDQyMDAyMCwKLTB4YWY4MjAwNDQsIDB4YWZhMzAwMTgsIDB4OGVlMjA2MDgsIDB4OGY0MzAyMjgsCi0weDI0NDIwMDAxLCAweDMwNGEwMGZmLCAweDUxNDMwMGZlLCAweGFmYTAwMDEwLAotMHg4ZWUyMDYwOCwgMHgyMTBjMCwgMHg1NzEwMjEsIDB4OGZhMzAwMTgsCi0weDhmYTQwMDFjLCAweGFjNDMwNjBjLCAweGFjNDQwNjEwLCAweDhmODMwMDU0LAotMHg4ZjgyMDA1NCwgMHgyNDY5MDAzMiwgMHgxMjIxMDIzLCAweDJjNDIwMDMzLAotMHgxMDQwMDA2YSwgMHg1ODIxLCAweDI0MTgwMDA4LCAweDI0MGYwMDBkLAotMHgyNDBkMDAwNywgMHgyNDBjMDA0MCwgMHgyNDBlMDAwMSwgMHg4Zjg3MDEyMCwKLTB4Mjc2MjM4MDAsIDB4MjRlODAwMjAsIDB4MTAyMTAyYiwgMHg1MDQwMDAwMSwKLTB4Mjc2ODMwMDAsIDB4OGY4MjAxMjgsIDB4MTEwMjAwMDQsIDB4MCwKLTB4OGY4MjAxMjQsIDB4MTUwMjAwMDcsIDB4MTAyMSwgMHg4ZWUyMDFhNCwKLTB4MjgyMSwgMHgyNDQyMDAwMSwgMHhhZWUyMDFhNCwgMHg4MDA0MzNkLAotMHg4ZWUyMDFhNCwgMHg4ZWU0MDYwOCwgMHg0MjBjMCwgMHg4MDE4MjEsCi0weDhlZTQwNDMwLCAweDhlZTUwNDM0LCAweGEzMjgyMSwgMHhhMzMwMmIsCi0weDgyMjAyMSwgMHg4NjIwMjEsIDB4YWNlNDAwMDAsIDB4YWNlNTAwMDQsCi0weDhlZTIwNjA4LCAweGE0ZjgwMDBlLCAweGFjZWYwMDE4LCAweGFjZWEwMDFjLAotMHgyMTBjMCwgMHgyNDQyMDYwYywgMHgyZTIxMDIxLCAweGFjZTIwMDA4LAotMHg4ZWUyMDRjNCwgMHhhY2UyMDAxMCwgMHhhZjg4MDEyMCwgMHg5MmUyNGUyMCwKLTB4MTQ0MDAwMzMsIDB4MjQwNTAwMDEsIDB4OGVlMjRlMzAsIDB4MjEwYzAsCi0weDI0NDI1MDM4LCAweDJlMjIwMjEsIDB4OGM4MjAwMDAsIDB4MTQ0ZDAwMWYsCi0weDAsIDB4OGVlMzRlMzAsIDB4OGVlMjRlMzQsIDB4MTA2MjAwMWIsCi0weDAsIDB4OGM4MjAwMDQsIDB4MjQ0MjAwMDEsIDB4YWM4MjAwMDQsCi0weDhlZTI0ZTM0LCAweDhlZTM0ZTMwLCAweDI0NDIwMDAxLCAweDEwNGMwMDA3LAotMHgwLCAweDhlZTI0ZTM0LCAweDI0NDIwMDAxLCAweDEwNjIwMDA1LAotMHgwLCAweDgwMDQzMmEsIDB4MCwgMHgxNDYwMDAwNSwKLTB4MCwgMHg4ZjgyMDEyOCwgMHgyNDQyMDAyMCwgMHhhZjgyMDEyOCwKLTB4OGY4MjAxMjgsIDB4OGM4MjAwMDQsIDB4MmM0MjAwMTEsIDB4NTA0MDAwMTAsCi0weGFjODAwMDAwLCAweDgwMDQzM2QsIDB4MCwgMHg4ZWUyNGUzMCwKLTB4MjQ0MjAwMDEsIDB4NTA0YzAwMDMsIDB4MTAyMSwgMHg4ZWUyNGUzMCwKLTB4MjQ0MjAwMDEsIDB4YWVlMjRlMzAsIDB4OGVlMjRlMzAsIDB4MjEwYzAsCi0weDI0NDI1MDM4LCAweDJlMjIwMjEsIDB4YWM4ZDAwMDAsIDB4YWM4ZTAwMDQsCi0weDU0YTAwMDA2LCAweDI0MGIwMDAxLCAweDhmODIwMDU0LCAweDEyMjEwMjMsCi0weDJjNDIwMDMzLCAweDE0NDBmZjlkLCAweDAsIDB4MzE2MzAwZmYsCi0weDI0MDIwMDAxLCAweDU0NjIwMDc5LCAweGFmYTAwMDEwLCAweGFlZWEwNjA4LAotMHg4ZjgzMDA1NCwgMHg4ZjgyMDA1NCwgMHgyNDY5MDAzMiwgMHgxMjIxMDIzLAotMHgyYzQyMDAzMywgMHgxMDQwMDA2MSwgMHg1ODIxLCAweDI0MGQwMDA4LAotMHgyNDBjMDAxMSwgMHgyNDA4MDAxMiwgMHgyNDA3MDA0MCwgMHgyNDBhMDAwMSwKLTB4OGY4MzAxMjAsIDB4Mjc2MjM4MDAsIDB4MjQ2NjAwMjAsIDB4YzIxMDJiLAotMHg1MDQwMDAwMSwgMHgyNzY2MzAwMCwgMHg4ZjgyMDEyOCwgMHgxMGMyMDAwNCwKLTB4MCwgMHg4ZjgyMDEyNCwgMHgxNGMyMDAwNywgMHgwLAotMHg4ZWUyMDFhNCwgMHgyODIxLCAweDI0NDIwMDAxLCAweGFlZTIwMWE0LAotMHg4MDA0M2E5LCAweDhlZTIwMWE0LCAweDhlZTIwNjA4LCAweGFjNjIwMDFjLAotMHg4ZWU0MDRhMCwgMHg4ZWU1MDRhNCwgMHgyNDYyMDAxYywgMHhhYzYyMDAwOCwKLTB4YTQ2ZDAwMGUsIDB4YWM2YzAwMTgsIDB4YWM2NDAwMDAsIDB4YWM2NTAwMDQsCi0weDhlZTIwNGM0LCAweGFjNjIwMDEwLCAweGFmODYwMTIwLCAweDkyZTI0ZTIwLAotMHgxNDQwMDAzMywgMHgyNDA1MDAwMSwgMHg4ZWUyNGUzMCwgMHgyMTBjMCwKLTB4MjQ0MjUwMzgsIDB4MmUyMjAyMSwgMHg4YzgyMDAwMCwgMHgxNDQ4MDAxZiwKLTB4MCwgMHg4ZWUzNGUzMCwgMHg4ZWUyNGUzNCwgMHgxMDYyMDAxYiwKLTB4MCwgMHg4YzgyMDAwNCwgMHgyNDQyMDAwMSwgMHhhYzgyMDAwNCwKLTB4OGVlMjRlMzQsIDB4OGVlMzRlMzAsIDB4MjQ0MjAwMDEsIDB4MTA0NzAwMDcsCi0weDAsIDB4OGVlMjRlMzQsIDB4MjQ0MjAwMDEsIDB4MTA2MjAwMDUsCi0weDAsIDB4ODAwNDM5NiwgMHgwLCAweDE0NjAwMDA1LAotMHgwLCAweDhmODIwMTI4LCAweDI0NDIwMDIwLCAweGFmODIwMTI4LAotMHg4ZjgyMDEyOCwgMHg4YzgyMDAwNCwgMHgyYzQyMDAxMSwgMHg1MDQwMDAxMCwKLTB4YWM4MDAwMDAsIDB4ODAwNDNhOSwgMHgwLCAweDhlZTI0ZTMwLAotMHgyNDQyMDAwMSwgMHg1MDQ3MDAwMywgMHgxMDIxLCAweDhlZTI0ZTMwLAotMHgyNDQyMDAwMSwgMHhhZWUyNGUzMCwgMHg4ZWUyNGUzMCwgMHgyMTBjMCwKLTB4MjQ0MjUwMzgsIDB4MmUyMjAyMSwgMHhhYzg4MDAwMCwgMHhhYzhhMDAwNCwKLTB4NTRhMDAwMDYsIDB4MjQwYjAwMDEsIDB4OGY4MjAwNTQsIDB4MTIyMTAyMywKLTB4MmM0MjAwMzMsIDB4MTQ0MGZmYTYsIDB4MCwgMHgzMTYzMDBmZiwKLTB4MjQwMjAwMDEsIDB4NTQ2MjAwMDMsIDB4YWZhMDAwMTAsIDB4ODAwNDNkNiwKLTB4MCwgMHgzYzA0MDAwMSwgMHgyNDg0NWEyMCwgMHhhZmEwMDAxNCwKLTB4OGY4NjAxMjAsIDB4OGY4NzAxMjQsIDB4M2MwNTAwMDksIDB4YzAwMjQwMywKLTB4MzRhNWYwMTEsIDB4ODAwNDNkNiwgMHgwLCAweDNjMDQwMDAxLAotMHgyNDg0NWEyYywgMHhhZmEwMDAxNCwgMHg4Zjg2MDEyMCwgMHg4Zjg3MDEyNCwKLTB4M2MwNTAwMDksIDB4YzAwMjQwMywgMHgzNGE1ZjAxMCwgMHg4MDA0M2Q2LAotMHgwLCAweDNjMDQwMDAxLCAweDI0ODQ1YTM4LCAweGFmYTAwMDE0LAotMHg4ZWU2MDYwOCwgMHg4ZjQ3MDIyOCwgMHgzYzA1MDAwOSwgMHhjMDAyNDAzLAotMHgzNGE1ZjAwZiwgMHg4ZWUyMDFhYywgMHgyNDQyMDAwMSwgMHhhZWUyMDFhYywKLTB4OGVlMjAxYWMsIDB4OGVlMjAxNWMsIDB4MjQ0MjAwMDEsIDB4YWVlMjAxNWMsCi0weDhlZTIwMTVjLCAweDhmYmYwMDIwLCAweDNlMDAwMDgsIDB4MjdiZDAwMjgsCi0weDNjMDIwMDAxLCAweDhjNDI1Y2Q4LCAweDI3YmRmZmUwLCAweDE0NDAwMDBkLAotMHhhZmJmMDAxOCwgMHgzYzA0MDAwMSwgMHgyNDg0NWE0NCwgMHgzYzA1MDAwOCwKLTB4YWZhMDAwMTAsIDB4YWZhMDAwMTQsIDB4OGY4NjAyMjAsIDB4MzRhNTA0OTksCi0weDI0MDIwMDAxLCAweDNjMDEwMDAxLCAweGFjMjI1Y2Q4LCAweGMwMDI0MDMsCi0weDM4MjEsIDB4OGVlMjA0ZDAsIDB4M2MwMzAwMDEsIDB4NzcxODIxLAotMHg5NDYzODNiMiwgMHgzNDQyMDAwMSwgMHgxMDYwMDAwNywgMHhhZWUyMDRkMCwKLTB4OGY4MjAyMjAsIDB4M2MwMzA4ZmYsIDB4MzQ2M2ZmZmYsIDB4NDMxMDI0LAotMHgzNDQyMDAwOCwgMHhhZjgyMDIyMCwgMHgyMDIxLCAweGMwMDUyYTIsCi0weDI0MDUwMDA0LCAweGFmNDIwMjY4LCAweDhmYmYwMDE4LCAweDNlMDAwMDgsCi0weDI3YmQwMDIwLCAweDAsIDB4MCwgMHgwLAotMHgwLCAweDAsIDB4MCwgMHgwLAotMHgwLCAweDAsIDB4MCwgMHgwLAotMHgwLCAweDAsIDB4MCwgMHgwLAotMHgwLCAweDAsIDB4MCwgMHgwLAotMHgwLCAweDAsIDB4MCwgMHgwLAotMHgwLCAweDAsIDB4MCwgMHgwLAotMHgwLCAweDAsIDB4MCwgMHgwLAotMHgwLCAweDAsIDB4MCwgMHgwLAotMHgwLCAweDAsIDB4MCwgMHgwLAotMHgwLCAweDAsIDB4MCwgMHgwLAotMHgwLCAweDAsIDB4MCwgMHgwLAotMHgwLCAweDAsIDB4MCwgMHgwLAotMHgwLCAweDAsIDB4MCwgMHgwLAotMHgwLCAweDAsIDB4MCwgMHgwLAotMHgwLCAweDAsIDB4MCwgMHgzYzEyMDAwMSwKLTB4MjY1MjEyMDAsIDB4M2MxNDAwMDEsIDB4OGU5NDVjNTAsIDB4M2MxMDAwMDEsCi0weDI2MTAxMTIwLCAweDNjMTVjMDAwLCAweDM2YjUwMDYwLCAweDhlOGEwMDAwLAotMHg4ZWIzMDAwMCwgMHgyNmE0MDBiLCAweDI0ODAwMGEsIDB4MjAwZjgyMSwKLTB4MCwgMHhkLCAweDAsIDB4MCwKLTB4MCwgMHgwLCAweDAsIDB4MCwKLTB4MCwgMHgwLCAweDAsIDB4MCwKLTB4MCwgMHgwLCAweDAsIDB4MCwKLTB4MCwgMHgwLCAweDAsIDB4MCwKLTB4MCwgMHgwLCAweDAsIDB4MCwKLTB4MCwgMHgwLCAweDAsIDB4MCwKLTB4MCwgMHgwLCAweDAsIDB4MCwKLTB4MCwgMHgwLCAweDAsIDB4MCwKLTB4MCwgMHgwLCAweDAsIDB4MCwKLTB4MCwgMHgwLCAweDAsIDB4MCwKLTB4MCwgMHgwLCAweDAsIDB4MCwKLTB4MCwgMHgwLCAweDAsIDB4ODAwMTRkNiwKLTB4MCwgMHg4MDAxNGQ4LCAweDNjMGEwMDAxLCAweDgwMDE0ZDgsCi0weDNjMGEwMDAyLCAweDgwMDE0ZDgsIDB4MCwgMHg4MDAyNGE2LAotMHgwLCAweDgwMDE0ZDgsIDB4M2MwYTAwMDMsIDB4ODAwMTRkOCwKLTB4M2MwYTAwMDQsIDB4ODAwMmY4YywgMHgwLCAweDgwMDE0ZDgsCi0weDNjMGEwMDA1LCAweDgwMDNjZTgsIDB4MCwgMHg4MDAzYzY2LAotMHgwLCAweDgwMDE0ZDgsIDB4M2MwYTAwMDYsIDB4ODAwMTRkOCwKLTB4M2MwYTAwMDcsIDB4ODAwMTRkOCwgMHgwLCAweDgwMDE0ZDgsCi0weDAsIDB4ODAwMTRkOCwgMHgwLCAweDgwMDJhNzUsCi0weDAsIDB4ODAwMTRkOCwgMHgzYzBhMDAwYiwgMHg4MDAxNGQ4LAotMHgzYzBhMDAwYywgMHg4MDAxNGQ4LCAweDNjMGEwMDBkLCAweDgwMDIzN2EsCi0weDAsIDB4ODAwMjMzOSwgMHgwLCAweDgwMDE0ZDgsCi0weDNjMGEwMDBlLCAweDgwMDFiM2MsIDB4MCwgMHg4MDAyNGE0LAotMHgwLCAweDgwMDE0ZDgsIDB4M2MwYTAwMGYsIDB4ODAwNDBhNywKLTB4MCwgMHg4MDA0MDkxLCAweDAsIDB4ODAwMTRkOCwKLTB4M2MwYTAwMTAsIDB4ODAwMTRlZSwgMHgwLCAweDgwMDE0ZDgsCi0weDNjMGEwMDExLCAweDgwMDE0ZDgsIDB4M2MwYTAwMTIsIDB4ODAwMTRkOCwKLTB4M2MwYTAwMTMsIDB4MCwgMHgwLCAweDAsCi0weDAsIDB4MCwgMHgwLCAweDAsCi0weDAsIDB4MCwgMHgwLCAweDAsCi0weDAsIDB4MCwgMHgwLCAweDAsCi0weDAsIDB4MCwgMHgwLCAweDAsCi0weDAsIDB4MCwgMHgwLCAweDAsCi0weDAsIDB4MCwgMHgwLCAweDAsCi0weDAsIDB4MCwgMHgwLCAweDAsCi0weDAsIDB4MCwgMHgwLCAweDAsCi0weDAsIDB4MCwgMHgwLCAweDAsCi0weDAsIDB4MCwgMHgwLCAweDAsCi0weDAsIDB4MCwgMHgwLCAweDAsCi0weDAsIDB4MCwgMHgwLCAweDAsCi0weDAsIDB4MCwgMHgwLCAweDAsCi0weDAsIDB4MCwgMHgwLCAweDAsCi0weDAsIDB4MCwgMHgwLCAweDNjMDMwMDAxLAotMHgzNDYzMzgwMCwgMHgyNDA1MDA4MCwgMHgyNDA0MDAxZiwgMHgyNDA2ZmZmZiwKLTB4MjQwMjAwMDEsIDB4YWY4MDAyMWMsIDB4YWY4MjAyMDAsIDB4YWY4MjAyMjAsCi0weDM2MzEwMjEsIDB4YWY4MjAwYzAsIDB4MzYzMTAyMSwgMHhhZjgyMDBjNCwKLTB4MzYzMTAyMSwgMHhhZjgyMDBjOCwgMHgyNzYyMzgwMCwgMHhhZjgyMDBkMCwKLTB4Mjc2MjM4MDAsIDB4YWY4MjAwZDQsIDB4Mjc2MjM4MDAsIDB4YWY4MjAwZDgsCi0weDI3NjIxODAwLCAweGFmODIwMGUwLCAweDI3NjIxODAwLCAweGFmODIwMGU0LAotMHgyNzYyMTgwMCwgMHhhZjgyMDBlOCwgMHgyNzYyMTAwMCwgMHhhZjgyMDBmMCwKLTB4Mjc2MjEwMDAsIDB4YWY4MjAwZjQsIDB4Mjc2MjEwMDAsIDB4YWY4MjAwZjgsCi0weGFjYTAwMDAwLCAweDI0ODRmZmZmLCAweDE0ODZmZmZkLCAweDI0YTUwMDA0LAotMHg4ZjgzMDA0MCwgMHgzYzAyZjAwMCwgMHg2MjE4MjQsIDB4M2MwMjUwMDAsCi0weDEwNjIwMDBjLCAweDQzMTAyYiwgMHgxNDQwMDAwNiwgMHgzYzAyNjAwMCwKLTB4M2MwMjQwMDAsIDB4MTA2MjAwMDgsIDB4MjQwMjA4MDAsIDB4ODAwNDUzOSwKLTB4MCwgMHgxMDYyMDAwNCwgMHgyNDAyMDgwMCwgMHg4MDA0NTM5LAotMHgwLCAweDI0MDIwNzAwLCAweDNjMDEwMDAxLCAweGFjMjI1Y2RjLAotMHgzZTAwMDA4LCAweDAsIDB4MjdiZGZmZDgsIDB4YWZiZjAwMjQsCi0weGFmYjAwMDIwLCAweDhmODMwMDU0LCAweDhmODIwMDU0LCAweDNjMDEwMDAxLAotMHhhYzIwNWNjNCwgMHg4MDA0NTQ1LCAweDI0NjMwMDY0LCAweDhmODIwMDU0LAotMHg2MjEwMjMsIDB4MmM0MjAwNjUsIDB4MTQ0MGZmZmMsIDB4MCwKLTB4YzAwNGQ3MSwgMHgwLCAweDI0MDQwMDAxLCAweDI4MjEsCi0weDI3YTYwMDE4LCAweDM0MDI4MDAwLCAweGMwMDQ5OGUsIDB4YTdhMjAwMTgsCi0weDhmODMwMDU0LCAweDhmODIwMDU0LCAweDgwMDQ1NTYsIDB4MjQ2MzAwNjQsCi0weDhmODIwMDU0LCAweDYyMTAyMywgMHgyYzQyMDA2NSwgMHgxNDQwZmZmYywKLTB4MjQwNDAwMDEsIDB4MjQwNTAwMDEsIDB4YzAwNDk0YywgMHgyN2E2MDAxOCwKLTB4OGY4MzAwNTQsIDB4OGY4MjAwNTQsIDB4ODAwNDU2MiwgMHgyNDYzMDA2NCwKLTB4OGY4MjAwNTQsIDB4NjIxMDIzLCAweDJjNDIwMDY1LCAweDE0NDBmZmZjLAotMHgyNDA0MDAwMSwgMHgyNDA1MDAwMSwgMHhjMDA0OTRjLCAweDI3YTYwMDE4LAotMHg4ZjgzMDA1NCwgMHg4ZjgyMDA1NCwgMHg4MDA0NTZlLCAweDI0NjMwMDY0LAotMHg4ZjgyMDA1NCwgMHg2MjEwMjMsIDB4MmM0MjAwNjUsIDB4MTQ0MGZmZmMsCi0weDI0MDQwMDAxLCAweDNjMDYwMDAxLCAweDI0YzY1ZGEwLCAweGMwMDQ5NGMsCi0weDI0MDUwMDAyLCAweDhmODMwMDU0LCAweDhmODIwMDU0LCAweDgwMDQ1N2IsCi0weDI0NjMwMDY0LCAweDhmODIwMDU0LCAweDYyMTAyMywgMHgyYzQyMDA2NSwKLTB4MTQ0MGZmZmMsIDB4MjQwNDAwMDEsIDB4MjQwNTAwMDMsIDB4M2MxMDAwMDEsCi0weDI2MTA1ZGEyLCAweGMwMDQ5NGMsIDB4MjAwMzAyMSwgMHg5N2E2MDAxOCwKLTB4M2MwNzAwMDEsIDB4OTRlNzVkYTAsIDB4M2MwNDAwMDEsIDB4MjQ4NDVhYjAsCi0weGFmYTAwMDE0LCAweDk2MDIwMDAwLCAweDNjMDUwMDBkLCAweDM0YTUwMTAwLAotMHhjMDAyNDAzLCAweGFmYTIwMDEwLCAweDk3YTIwMDE4LCAweDEwNDAwMDRjLAotMHgyNDAzNjA0MCwgMHg5NjAyMDAwMCwgMHgzMDQyZmZmMCwgMHgxNDQzMDAwYSwKLTB4MjQwMjAwMjAsIDB4M2MwMzAwMDEsIDB4OTQ2MzVkYTAsIDB4NTQ2MjAwMDksCi0weDI0MDI3ODMwLCAweDI0MDIwMDAzLCAweDNjMDEwMDAxLCAweGFjMjI1Y2M0LAotMHg4MDA0NWFjLCAweDI0MDIwMDA1LCAweDNjMDMwMDAxLCAweDk0NjM1ZGEwLAotMHgyNDAyNzgzMCwgMHgxNDYyMDAwZiwgMHgyNDAzMDAxMCwgMHgzYzAyMDAwMSwKLTB4OTQ0MjVkYTIsIDB4MzA0MmZmZjAsIDB4MTQ0MzAwMGEsIDB4MjQwMjAwMDMsCi0weDNjMDEwMDAxLCAweGFjMjI1Y2M0LCAweDI0MDIwMDA2LCAweDNjMDEwMDAxLAotMHhhYzIyNWRiMCwgMHgzYzAxMDAwMSwgMHhhYzIyNWRiYywgMHg4MDA0NWU2LAotMHgzYzA5ZmZmMCwgMHgzYzAyMDAwMSwgMHg4YzQyNWNjNCwgMHgzYzAzMDAwMSwKLTB4OTQ2MzVkYTAsIDB4MzQ0MjAwMDEsIDB4M2MwMTAwMDEsIDB4YWMyMjVjYzQsCi0weDI0MDIwMDE1LCAweDE0NjIwMDBmLCAweDAsIDB4M2MwMjAwMDEsCi0weDk0NDI1ZGEyLCAweDMwNDJmZmYwLCAweDM4NDNmNDIwLCAweDJjNjMwMDAxLAotMHgzODQyZjQzMCwgMHgyYzQyMDAwMSwgMHg2MjE4MjUsIDB4MTA2MDAwMDUsCi0weDI0MDIwMDAzLCAweDNjMDEwMDAxLCAweGFjMjI1ZGJjLCAweDgwMDQ1ZTYsCi0weDNjMDlmZmYwLCAweDNjMDMwMDAxLCAweDk0NjM1ZGEwLCAweDI0MDI3ODEwLAotMHgxNDYyMDAwYiwgMHgyNDAyMDAwMiwgMHgzYzAyMDAwMSwgMHg5NDQyNWRhMiwKLTB4MzA0MmZmZjAsIDB4MTQ0MDAwMDYsIDB4MjQwMjAwMDIsIDB4MjQwMjAwMDQsCi0weDNjMDEwMDAxLCAweGFjMjI1ZGJjLCAweDgwMDQ1ZTYsIDB4M2MwOWZmZjAsCi0weDNjMDEwMDAxLCAweGFjMjI1ZGJjLCAweDgwMDQ1ZTYsIDB4M2MwOWZmZjAsCi0weDNjMDIwMDAxLCAweDhjNDI1Y2M0LCAweDI0MDMwMDAxLCAweDNjMDEwMDAxLAotMHhhYzIzNWRiYywgMHgzNDQyMDAwNCwgMHgzYzAxMDAwMSwgMHhhYzIyNWNjNCwKLTB4M2MwOWZmZjAsIDB4MzUyOWJkYzAsIDB4M2MwNjAwMDEsIDB4OGNjNjVjYzQsCi0weDNjMDQwMDAxLCAweDI0ODQ1YWIwLCAweDI0MDIwMDAxLCAweDNjMDEwMDAxLAotMHhhYzIyNWNjYywgMHg4ZjgyMDA1NCwgMHgzYzA3MDAwMSwgMHg4Y2U3NWRiYywKLTB4M2MwMzAwMDEsIDB4OTQ2MzVkYTAsIDB4M2MwODAwMDEsIDB4OTUwODVkYTIsCi0weDNjMDUwMDBkLCAweDM0YTUwMTAwLCAweDNjMDEwMDAxLCAweGFjMjA1Y2M4LAotMHg0OTEwMjEsIDB4M2MwMTAwMDEsIDB4YWMyMjVkYWMsIDB4YWZhMzAwMTAsCi0weGMwMDI0MDMsIDB4YWZhODAwMTQsIDB4OGZiZjAwMjQsIDB4OGZiMDAwMjAsCi0weDNlMDAwMDgsIDB4MjdiZDAwMjgsIDB4MjdiZGZmZTgsIDB4M2MwNTAwMDEsCi0weDhjYTU1Y2M4LCAweDI0MDYwMDA0LCAweDI0MDIwMDAxLCAweDE0YTIwMDE0LAotMHhhZmJmMDAxMCwgMHgzYzAyMDAwMSwgMHg4YzQyN2UzYywgMHgzMDQyODAwMCwKLTB4MTA0MDAwMDUsIDB4M2MwNDAwMGYsIDB4M2MwMzAwMDEsIDB4OGM2MzVkYmMsCi0weDgwMDQ2MTcsIDB4MzQ4NDQyNDAsIDB4M2MwNDAwMDQsIDB4M2MwMzAwMDEsCi0weDhjNjM1ZGJjLCAweDM0ODQ5M2UwLCAweDI0MDIwMDA1LCAweDE0NjIwMDE2LAotMHgwLCAweDNjMDQwMDNkLCAweDgwMDQ2MmYsIDB4MzQ4NDA5MDAsCi0weDNjMDIwMDAxLCAweDhjNDI3ZTM4LCAweDMwNDI4MDAwLCAweDEwNDAwMDA1LAotMHgzYzA0MDAxZSwgMHgzYzAzMDAwMSwgMHg4YzYzNWRiYywgMHg4MDA0NjJhLAotMHgzNDg0ODQ4MCwgMHgzYzA0MDAwZiwgMHgzYzAzMDAwMSwgMHg4YzYzNWRiYywKLTB4MzQ4NDQyNDAsIDB4MjQwMjAwMDUsIDB4MTQ2MjAwMDMsIDB4MCwKLTB4M2MwNDAwN2EsIDB4MzQ4NDEyMDAsIDB4M2MwMjAwMDEsIDB4OGM0MjVkYWMsCi0weDhmODMwMDU0LCAweDQ0MTAyMSwgMHg0MzEwMjMsIDB4NDQxMDJiLAotMHgxNDQwMDAzNywgMHgwLCAweDNjMDIwMDAxLCAweDhjNDI1Y2QwLAotMHgxNDQwMDAzMywgMHgwLCAweDNjMDEwMDAxLCAweDEwYzAwMDI1LAotMHhhYzIwNWNlMCwgMHgzYzA5MDAwMSwgMHg4ZDI5NWNjNCwgMHgyNDA3MDAwMSwKLTB4M2MwNDQwMDAsIDB4M2MwODAwMDEsIDB4MjUwODdlM2MsIDB4MjUwYWZmZmMsCi0weDUyODQyLCAweDE0YTAwMDAyLCAweDI0YzZmZmZmLCAweDI0MDUwMDA4LAotMHhhOTEwMjQsIDB4MTA0MDAwMTAsIDB4MCwgMHgxNGE3MDAwOCwKLTB4MCwgMHg4ZDAyMDAwMCwgMHg0NDEwMjQsIDB4MTA0MDAwMGEsCi0weDAsIDB4M2MwMTAwMDEsIDB4ODAwNDY1YiwgMHhhYzI1NWNlMCwKLTB4OGQ0MjAwMDAsIDB4NDQxMDI0LCAweDEwNDAwMDAzLCAweDAsCi0weDNjMDEwMDAxLCAweGFjMjc1Y2UwLCAweDNjMDIwMDAxLCAweDhjNDI1Y2UwLAotMHg2MTgyYiwgMHgyYzQyMDAwMSwgMHg0MzEwMjQsIDB4NTQ0MGZmZTUsCi0weDUyODQyLCAweDhmODIwMDU0LCAweDNjMDMwMDAxLCAweDhjNjM1Y2UwLAotMHgzYzAxMDAwMSwgMHhhYzIyNWRhYywgMHgxMDYwMDAyYSwgMHgyNDAyMDAwMSwKLTB4M2MwMTAwMDEsIDB4YWMyNTVjYzgsIDB4M2MwMTAwMDEsIDB4YWMyMjVjY2MsCi0weDNjMDIwMDAxLCAweDhjNDI1Y2UwLCAweDEwNDAwMDIyLCAweDAsCi0weDNjMDIwMDAxLCAweDhjNDI1Y2NjLCAweDEwNDAwMDBhLCAweDI0MDIwMDAxLAotMHgzYzAxMDAwMSwgMHhhYzIwNWNjYywgMHgzYzAxMDAwMSwgMHgzNzA4MjEsCi0weGFjMjI4M2FjLCAweDNjMDEwMDAxLCAweGFjMjA1ZDRjLCAweDNjMDEwMDAxLAotMHhhYzIyNWQwNCwgMHgzYzAzMDAwMSwgMHg3NzE4MjEsIDB4OGM2MzgzYWMsCi0weDI0MDIwMDA4LCAweDEwNjIwMDA1LCAweDI0MDIwMDAxLCAweGMwMDQ2OTUsCi0weDAsIDB4ODAwNDY5MiwgMHgwLCAweDNjMDMwMDAxLAotMHg4YzYzNWNjOCwgMHgxMDYyMDAwNywgMHgyNDAyMDAwZSwgMHgzYzAzMDAwMSwKLTB4OGM2MzdkZDAsIDB4MTA2MjAwMDMsIDB4MCwgMHhjMDA0ZTU0LAotMHg4Zjg0MDIyMCwgMHg4ZmJmMDAxMCwgMHgzZTAwMDA4LCAweDI3YmQwMDE4LAotMHgyN2JkZmZlMCwgMHgzYzAyZmRmZiwgMHhhZmJmMDAxOCwgMHg4ZWUzMDAwMCwKLTB4M2MwNTAwMDEsIDB4OGNhNTVjYzgsIDB4M2MwNDAwMDEsIDB4OGM4NDVjZjAsCi0weDM0NDJmZmZmLCAweDYyMTgyNCwgMHgxNGE0MDAwOCwgMHhhZWUzMDAwMCwKLTB4M2MwMzAwMDEsIDB4NzcxODIxLCAweDhjNjM4M2FjLCAweDNjMDIwMDAxLAotMHg4YzQyNWNmNCwgMHgxMDYyMDAwOCwgMHgwLCAweDNjMDIwMDAxLAotMHg1NzEwMjEsIDB4OGM0MjgzYWMsIDB4M2MwMTAwMDEsIDB4YWMyNTVjZjAsCi0weDNjMDEwMDAxLCAweGFjMjI1Y2Y0LCAweDNjMDMwMDAxLCAweDhjNjM1Y2M4LAotMHgyNDAyMDAwMiwgMHgxMDYyMDE2OSwgMHgyYzYyMDAwMywgMHgxMDQwMDAwNSwKLTB4MjQwMjAwMDEsIDB4MTA2MjAwMDgsIDB4MCwgMHg4MDA0ODFjLAotMHgwLCAweDI0MDIwMDA0LCAweDEwNjIwMGIxLCAweDI0MDIwMDAxLAotMHg4MDA0ODFkLCAweDAsIDB4M2MwMjAwMDEsIDB4NTcxMDIxLAotMHg4YzQyODNhYywgMHgyNDQzZmZmZiwgMHgyYzYyMDAwOCwgMHgxMDQwMDE1YSwKLTB4MzEwODAsIDB4M2MwMTAwMDEsIDB4MjIwODIxLCAweDhjMjI1YWM4LAotMHg0MDAwMDgsIDB4MCwgMHgzYzAzMDAwMSwgMHg4YzYzNWRiYywKLTB4MjQwMjAwMDUsIDB4MTQ2MjAwMTQsIDB4MCwgMHgzYzAyMDAwMSwKLTB4OGM0MjVjZDQsIDB4MTA0MDAwMGEsIDB4MjQwMjAwMDMsIDB4YzAwNDgyMiwKLTB4MCwgMHgyNDAyMDAwMiwgMHgzYzAxMDAwMSwgMHgzNzA4MjEsCi0weGFjMjI4M2FjLCAweDNjMDEwMDAxLCAweDgwMDQ2ZTAsIDB4YWMyMDVjZDQsCi0weDNjMDEwMDAxLCAweDM3MDgyMSwgMHhhYzIyODNhYywgMHgzYzAxMDAwMSwKLTB4ODAwNDgxZiwgMHhhYzIwNWM2MCwgMHhjMDA0ODIyLCAweDAsCi0weDNjMDIwMDAxLCAweDhjNDI1Y2Q0LCAweDNjMDEwMDAxLCAweGFjMjA1YzYwLAotMHgxMDQwMDBkZCwgMHgyNDAyMDAwMiwgMHgzYzAxMDAwMSwgMHgzNzA4MjEsCi0weGFjMjI4M2FjLCAweDNjMDEwMDAxLCAweDgwMDQ4MWYsIDB4YWMyMDVjZDQsCi0weDNjMDMwMDAxLCAweDhjNjM1ZGJjLCAweDI0MDIwMDA1LCAweDE0NjIwMDAzLAotMHgyNDAyMDAwMSwgMHgzYzAxMDAwMSwgMHhhYzIyNWQwMCwgMHhjMDA0OWNmLAotMHgwLCAweDNjMDMwMDAxLCAweDhjNjM1ZDAwLCAweDgwMDQ3OGUsCi0weDI0MDIwMDExLCAweDNjMDUwMDAxLCAweDhjYTU1Y2M4LCAweDNjMDYwMDAxLAotMHg4Y2M2N2UzYywgMHhjMDA1MTA4LCAweDIwMjEsIDB4MjQwMjAwMDUsCi0weDNjMDEwMDAxLCAweGFjMjA1Y2Q0LCAweDNjMDEwMDAxLCAweDM3MDgyMSwKLTB4ODAwNDgxZiwgMHhhYzIyODNhYywgMHgzYzA0MDAwMSwgMHgyNDg0NWFiYywKLTB4M2MwNTAwMGYsIDB4MzRhNTAxMDAsIDB4MzAyMSwgMHgzODIxLAotMHhhZmEwMDAxMCwgMHhjMDAyNDAzLCAweGFmYTAwMDE0LCAweDgwMDQ4MWYsCi0weDAsIDB4OGY4MjAyMjAsIDB4M2MwM2Y3MDAsIDB4NDMxMDI1LAotMHg4MDA0N2I3LCAweGFmODIwMjIwLCAweDhmODIwMjIwLCAweDNjMDMwMDA0LAotMHg0MzEwMjQsIDB4MTQ0MDAwYTksIDB4MjQwMjAwMDcsIDB4OGY4MzAwNTQsCi0weDNjMDIwMDAxLCAweDhjNDI1ZGE0LCAweDI0NjNkOGYwLCAweDQzMTAyMywKLTB4MmM0MjI3MTAsIDB4MTQ0MDAwZjgsIDB4MjQwMjAwMDEsIDB4ODAwNDgxZCwKLTB4MCwgMHgzYzA1MDAwMSwgMHg4Y2E1NWNjOCwgMHhjMDA1MmEyLAotMHgyMDIxLCAweGMwMDUzODYsIDB4MjAyMSwgMHgzYzAzMDAwMSwKLTB4OGM2MzdlMzQsIDB4NDYxMDBlYSwgMHgyNDAyMDAwMSwgMHgzYzAyMDAwOCwKLTB4NjIxMDI0LCAweDEwNDAwMDA2LCAweDAsIDB4OGY4MjAyMTQsCi0weDNjMDNmZmZmLCAweDQzMTAyNCwgMHg4MDA0NzQxLCAweDM0NDIyNTFmLAotMHg4ZjgyMDIxNCwgMHgzYzAzZmZmZiwgMHg0MzEwMjQsIDB4MzQ0MjI0MWYsCi0weGFmODIwMjE0LCAweDhlZTIwMDAwLCAweDNjMDMwMjAwLCAweDQzMTAyNSwKLTB4YWVlMjAwMDAsIDB4OGY4MjAyMjAsIDB4MjQwM2ZmZmIsIDB4NDMxMDI0LAotMHhhZjgyMDIyMCwgMHg4ZjgyMDIyMCwgMHgzNDQyMDAwMiwgMHhhZjgyMDIyMCwKLTB4MjQwMjAwMDgsIDB4M2MwMTAwMDEsIDB4MzcwODIxLCAweGFjMjI4M2FjLAotMHg4ZjgyMDIyMCwgMHgzYzAzMDAwNCwgMHg0MzEwMjQsIDB4MTQ0MDAwMDUsCi0weDAsIDB4OGY4MjAyMjAsIDB4M2MwM2Y3MDAsIDB4NDMxMDI1LAotMHhhZjgyMDIyMCwgMHgzYzAzMDAwMSwgMHg4YzYzNWRiYywgMHgyNDAyMDAwNSwKLTB4MTQ2MjAwMGEsIDB4MCwgMHgzYzAyMDAwMSwgMHg5NDQyNWRhMiwKLTB4MjQ0MjlmYmMsIDB4MmM0MjAwMDQsIDB4MTA0MDAwMDQsIDB4MjQwNDAwMTgsCi0weDI0MDUwMDAyLCAweGMwMDRkOTMsIDB4MjQwNjAwMjAsIDB4YzAwNDNkZCwKLTB4MCwgMHgzYzAxMDAwMSwgMHg4MDA0ODFmLCAweGFjMjA1ZDUwLAotMHgzYzAyMDAwMSwgMHg1NzEwMjEsIDB4OGM0MjgzYWMsIDB4MjQ0M2ZmZmYsCi0weDJjNjIwMDA4LCAweDEwNDAwMGFjLCAweDMxMDgwLCAweDNjMDEwMDAxLAotMHgyMjA4MjEsIDB4OGMyMjVhZTgsIDB4NDAwMDA4LCAweDAsCi0weGMwMDQyOWIsIDB4MCwgMHgzYzAxMDAwMSwgMHhhYzIwNWNjYywKLTB4YWY4MDAyMDQsIDB4M2MwMTAwMDEsIDB4YzAwNDgyMiwgMHhhYzIwN2UyMCwKLTB4MjQwMjAwMDEsIDB4M2MwMTAwMDEsIDB4YWMyMjVjZTQsIDB4MjQwMjAwMDIsCi0weDNjMDEwMDAxLCAweDM3MDgyMSwgMHg4MDA0ODFmLCAweGFjMjI4M2FjLAotMHhjMDA0ODlmLCAweDAsIDB4M2MwMzAwMDEsIDB4OGM2MzVjZTQsCi0weDI0MDIwMDA5LCAweDE0NjIwMDkwLCAweDI0MDIwMDAzLCAweDNjMDEwMDAxLAotMHgzNzA4MjEsIDB4ODAwNDgxZiwgMHhhYzIyODNhYywgMHgzYzAyMDAwMSwKLTB4OGM0MjdlMzgsIDB4MzA0MjQwMDAsIDB4MTA0MDAwMDUsIDB4MCwKLTB4OGY4MjAwNDQsIDB4M2MwM2ZmZmYsIDB4ODAwNDc5ZiwgMHgzNDYzN2ZmZiwKLTB4OGY4MjAwNDQsIDB4MjQwM2ZmN2YsIDB4NDMxMDI0LCAweGFmODIwMDQ0LAotMHg4ZjgzMDA1NCwgMHg4MDA0N2I5LCAweDI0MDIwMDA0LCAweDhmODMwMDU0LAotMHgzYzAyMDAwMSwgMHg4YzQyNWRhNCwgMHgyNDYzZDhmMCwgMHg0MzEwMjMsCi0weDJjNDIyNzEwLCAweDE0NDAwMDc0LCAweDI0MDIwMDA1LCAweDNjMDEwMDAxLAotMHgzNzA4MjEsIDB4ODAwNDgxZiwgMHhhYzIyODNhYywgMHg4ZjgyMDIyMCwKLTB4M2MwM2Y3MDAsIDB4NDMxMDI1LCAweGFmODIwMjIwLCAweGFmODAwMjA0LAotMHgzYzAxMDAwMSwgMHhhYzIwN2UyMCwgMHg4ZjgzMDA1NCwgMHgyNDAyMDAwNiwKLTB4M2MwMTAwMDEsIDB4MzcwODIxLCAweGFjMjI4M2FjLCAweDNjMDEwMDAxLAotMHg4MDA0ODFmLCAweGFjMjM1ZGE0LCAweDhmODMwMDU0LCAweDNjMDIwMDAxLAotMHg4YzQyNWRhNCwgMHgyNDYzZmZmNiwgMHg0MzEwMjMsIDB4MmM0MjAwMGEsCi0weDE0NDAwMDU5LCAweDAsIDB4MjQwMjAwMDcsIDB4M2MwMTAwMDEsCi0weDM3MDgyMSwgMHg4MDA0ODFmLCAweGFjMjI4M2FjLCAweDhmODIwMjIwLAotMHgzYzA0ZjcwMCwgMHg0NDEwMjUsIDB4YWY4MjAyMjAsIDB4OGY4MjAyMjAsCi0weDNjMDMwMzAwLCAweDQzMTAyNCwgMHgxNDQwMDAwNSwgMHgxODIxLAotMHg4ZjgyMDIyMCwgMHgyNDAzMDAwMSwgMHg0NDEwMjUsIDB4YWY4MjAyMjAsCi0weDEwNjAwMDQzLCAweDI0MDIwMDAxLCAweDhmODIwMjE0LCAweDNjMDNmZmZmLAotMHgzYzA0MDAwMSwgMHg4Yzg0NWQ5OCwgMHg0MzEwMjQsIDB4MzQ0MjI1MWYsCi0weGFmODIwMjE0LCAweDI0MDIwMDA4LCAweDNjMDEwMDAxLCAweDM3MDgyMSwKLTB4MTA4MDAwMGIsIDB4YWMyMjgzYWMsIDB4M2MwMjAwMDEsIDB4OGM0MjVkNzQsCi0weDE0NDAwMDA3LCAweDI0MDIwMDAxLCAweDNjMDEwMDAxLCAweGFjMjI3ZGQwLAotMHhjMDA0ZTU0LCAweDhmODQwMjIwLCAweDgwMDQ4MGMsIDB4MCwKLTB4OGY4MjAyMjAsIDB4M2MwMzAwMDgsIDB4NDMxMDI0LCAweDE0NDAwMDE3LAotMHgyNDAyMDAwZSwgMHgzYzAxMDAwMSwgMHhhYzIyN2RkMCwgMHg4ZWUyMDAwMCwKLTB4MjAyMSwgMHgzYzAzMDIwMCwgMHg0MzEwMjUsIDB4YzAwNTM4NiwKLTB4YWVlMjAwMDAsIDB4OGY4MjAyMjAsIDB4MjQwM2ZmZmIsIDB4NDMxMDI0LAotMHhhZjgyMDIyMCwgMHg4ZjgyMDIyMCwgMHgzNDQyMDAwMiwgMHhjMDA0M2RkLAotMHhhZjgyMDIyMCwgMHgzYzA1MDAwMSwgMHg4Y2E1NWNjOCwgMHhjMDA1MmEyLAotMHgyMDIxLCAweDgwMDQ4MWYsIDB4MCwgMHgzYzAyMDAwMSwKLTB4OGM0MjVkNzQsIDB4MTA0MDAwMTAsIDB4MCwgMHgzYzAyMDAwMSwKLTB4OGM0MjVkNzAsIDB4MjQ0MmZmZmYsIDB4M2MwMTAwMDEsIDB4YWMyMjVkNzAsCi0weDE0NDAwMDA5LCAweDI0MDIwMDAyLCAweDNjMDEwMDAxLCAweGFjMjA1ZDc0LAotMHgzYzAxMDAwMSwgMHg4MDA0ODFmLCAweGFjMjI1ZDcwLCAweDI0MDIwMDAxLAotMHgzYzAxMDAwMSwgMHhhYzIyNWNjYywgMHg4ZmJmMDAxOCwgMHgzZTAwMDA4LAotMHgyN2JkMDAyMCwgMHg4ZjgyMDIwMCwgMHg4ZjgyMDIyMCwgMHg4ZjgyMDIyMCwKLTB4MzQ0MjAwMDQsIDB4YWY4MjAyMjAsIDB4OGY4MjAyMDAsIDB4M2MwNjAwMDEsCi0weDhjYzY1Y2M4LCAweDM0NDIwMDA0LCAweGFmODIwMjAwLCAweDI0MDIwMDAyLAotMHgxMGMyMDAzYSwgMHgyY2MyMDAwMywgMHgxMDQwMDAwNSwgMHgyNDAyMDAwMSwKLTB4MTBjMjAwMDgsIDB4MCwgMHg4MDA0ODY4LCAweDAsCi0weDI0MDIwMDA0LCAweDEwYzIwMDEzLCAweDI0MDIwMDAxLCAweDgwMDQ4NjgsCi0weDAsIDB4M2MwMzAwMDEsIDB4OGM2MzVjYjgsIDB4M2MwMjAwMDEsCi0weDhjNDI1Y2MwLCAweDNjMDQwMDAxLCAweDhjODQ1Y2RjLCAweDNjMDUwMDAxLAotMHg4Y2E1NWNiYywgMHhhZjg2MDIwMCwgMHhhZjg2MDIyMCwgMHgzNDYzMDAyMiwKLTB4NDQxMDI1LCAweDQ1MTAyNSwgMHgzNDQyMDAwMiwgMHg4MDA0ODY3LAotMHhhZjgzMDIwMCwgMHgzYzAzMDAwMSwgMHg4YzYzNWQ5OCwgMHhhZjgyMDIwMCwKLTB4MTA2MDAwMDksIDB4YWY4MjAyMjAsIDB4M2MwMjAwMDEsIDB4OGM0MjVkNzQsCi0weDE0NDAwMDA1LCAweDNjMDMzZjAwLCAweDNjMDIwMDAxLCAweDhjNDI1Y2IwLAotMHg4MDA0ODViLCAweDM0NjMwMGUwLCAweDNjMDIwMDAxLCAweDhjNDI1Y2IwLAotMHgzYzAzM2YwMCwgMHgzNDYzMDBlMiwgMHg0MzEwMjUsIDB4YWY4MjAyMDAsCi0weDNjMDMwMDAxLCAweDhjNjM1Y2I0LCAweDNjMDRmNzAwLCAweDNjMDIwMDAxLAotMHg4YzQyNWNjMCwgMHgzYzA1MDAwMSwgMHg4Y2E1NWNkYywgMHg2NDE4MjUsCi0weDQzMTAyNSwgMHg0NTEwMjUsIDB4YWY4MjAyMjAsIDB4M2UwMDAwOCwKLTB4MCwgMHg4ZjgyMDIyMCwgMHgzYzAzMDAwMSwgMHg4YzYzNWNjOCwKLTB4MzQ0MjAwMDQsIDB4YWY4MjAyMjAsIDB4MjQwMjAwMDEsIDB4MTA2MjAwMGYsCi0weDAsIDB4OGY4MzAwNTQsIDB4OGY4MjAwNTQsIDB4MjQ2MzAwMDIsCi0weDYyMTAyMywgMHgyYzQyMDAwMywgMHgxMDQwMDAxMSwgMHgwLAotMHg4ZjgyMDA1NCwgMHg2MjEwMjMsIDB4MmM0MjAwMDMsIDB4MTA0MDAwMGMsCi0weDAsIDB4ODAwNDg3OSwgMHgwLCAweDhmODMwMDU0LAotMHg4ZjgyMDA1NCwgMHg4MDA0ODg1LCAweDI0NjMwMDA3LCAweDhmODIwMDU0LAotMHg2MjEwMjMsIDB4MmM0MjAwMDgsIDB4MTQ0MGZmZmMsIDB4MCwKLTB4OGY4NDAwZTAsIDB4MzA4MjAwMDcsIDB4MTA0MDAwMGQsIDB4MCwKLTB4OGY4MjAwNTQsIDB4OGY4MzAwZTAsIDB4MTQ4MzAwMDksIDB4MjQ0NTAwMzIsCi0weDhmODIwMDU0LCAweGEyMTAyMywgMHgyYzQyMDAzMywgMHgxMDQwMDAwNCwKLTB4MCwgMHg4ZjgyMDBlMCwgMHgxMDgyZmZmOSwgMHgwLAotMHg4ZjgyMDIyMCwgMHgyNDAzZmZmZCwgMHg0MzEwMjQsIDB4YWY4MjAyMjAsCi0weDNlMDAwMDgsIDB4MCwgMHgzYzAzMDAwMSwgMHg4YzYzNWNlNCwKLTB4M2MwMjAwMDEsIDB4OGM0MjVjZTgsIDB4NTA2MjAwMDQsIDB4MjQ2M2ZmZmYsCi0weDNjMDEwMDAxLCAweGFjMjM1Y2U4LCAweDI0NjNmZmZmLCAweDJjNjIwMDA5LAotMHgxMDQwMDA5ZCwgMHgzMTA4MCwgMHgzYzAxMDAwMSwgMHgyMjA4MjEsCi0weDhjMjI1YjA4LCAweDQwMDAwOCwgMHgwLCAweDhmODIwMDQ0LAotMHgzNDQyODA4MCwgMHhhZjgyMDA0NCwgMHg4ZjgzMDA1NCwgMHg4MDA0OTM4LAotMHgyNDAyMDAwMiwgMHg4ZjgzMDA1NCwgMHgzYzAyMDAwMSwgMHg4YzQyNWRhOCwKLTB4MjQ2M2Q4ZjAsIDB4NDMxMDIzLCAweDJjNDIyNzEwLCAweDE0NDAwMDhhLAotMHgyNDAyMDAwMywgMHg4MDA0OTQ1LCAweDAsIDB4OGY4MjAwNDQsCi0weDNjMDNmZmZmLCAweDM0NjM3ZmZmLCAweDQzMTAyNCwgMHhhZjgyMDA0NCwKLTB4OGY4MzAwNTQsIDB4ODAwNDkzOCwgMHgyNDAyMDAwNCwgMHg4ZjgzMDA1NCwKLTB4M2MwMjAwMDEsIDB4OGM0MjVkYTgsIDB4MjQ2M2ZmZjYsIDB4NDMxMDIzLAotMHgyYzQyMDAwYSwgMHgxNDQwMDA3OCwgMHgyNDAyMDAwNSwgMHg4MDA0OTQ1LAotMHgwLCAweDhmODIwMjIwLCAweDNjMDNmNzAwLCAweDQzMTAyNSwKLTB4YWY4MjAyMjAsIDB4OGY4MjAyMjAsIDB4MjQwM2ZmZmIsIDB4NDMxMDI0LAotMHhhZjgyMDIyMCwgMHg4ZjgyMDIyMCwgMHgzNDQyMDAwMiwgMHhhZjgyMDIyMCwKLTB4M2MwMjNmMDAsIDB4MzQ0MjAwZTAsIDB4YWY4MjAyMDAsIDB4OGY4MjAyMDAsCi0weDI0MDNmZmZkLCAweDQzMTAyNCwgMHhhZjgyMDIwMCwgMHgyNDA0MDAwMSwKLTB4MzQwNWZmZmYsIDB4YWY4NDAyMDQsIDB4OGY4MzAwNTQsIDB4OGY4MjAwNTQsCi0weDgwMDQ4ZWMsIDB4MjQ2MzAwMDEsIDB4OGY4MjAwNTQsIDB4NjIxMDIzLAotMHgyYzQyMDAwMiwgMHgxNDQwZmZmYywgMHgwLCAweDhmODIwMjI0LAotMHg0MjA0MCwgMHhhNDEwMmIsIDB4MTA0MGZmZjIsIDB4MCwKLTB4OGY4MjAyMjAsIDB4M2MwM2Y3MDAsIDB4NDMxMDI1LCAweGFmODIwMjIwLAotMHg4ZjgyMDIxNCwgMHgzYzAzZmZmZiwgMHg0MzEwMjQsIDB4MzQ0MjI1MWYsCi0weGFmODIwMjE0LCAweDhmODIwMjIwLCAweDI0MDNmZmZiLCAweDQzMTAyNCwKLTB4YWY4MjAyMjAsIDB4OGY4MjAyMjAsIDB4M2MwNGY3MDAsIDB4MzQ4NDAwMDgsCi0weDM0NDIwMDAyLCAweGFmODIwMjIwLCAweDhmODIwMjIwLCAweDNjMDMzZjAwLAotMHgzNDYzMDBlMiwgMHg0NDEwMjUsIDB4YWY4MjAyMjAsIDB4YWY4MzAyMDAsCi0weDhmODQwMGYwLCAweDI3NjIxN2Y4LCAweDE0ODIwMDAyLCAweDI0ODUwMDA4LAotMHgyNzY1MTAwMCwgMHg4ZjgyMDBmNCwgMHgxMGEyMDAwNywgMHgzYzAzODAwMCwKLTB4MzQ2MzAwNDAsIDB4M2MwMjAwMDEsIDB4MjQ0MjVjNzAsIDB4YWM4MjAwMDAsCi0weGFjODMwMDA0LCAweGFmODUwMGYwLCAweDhmODMwMDU0LCAweDgwMDQ5MzgsCi0weDI0MDIwMDA2LCAweDhmODMwMDU0LCAweDNjMDIwMDAxLCAweDhjNDI1ZGE4LAotMHgyNDYzZmZmNiwgMHg0MzEwMjMsIDB4MmM0MjAwMGEsIDB4MTQ0MDAwMjIsCi0weDI0MDIwMDA3LCAweDgwMDQ5NDUsIDB4MCwgMHg4ZjgyMDBlMCwKLTB4YWY4MjAwZTQsIDB4OGY4MjAwZTAsIDB4YWY4MjAwZTgsIDB4OGY4MjAyMjAsCi0weDM0NDIwMDA0LCAweGFmODIwMjIwLCAweDhmODIwMjIwLCAweDI0MDNmZmY3LAotMHg0MzEwMjQsIDB4YWY4MjAyMjAsIDB4OGY4MjAwNDQsIDB4MzQ0MjgwODAsCi0weGFmODIwMDQ0LCAweDhmODMwMDU0LCAweDI0MDIwMDA4LCAweDNjMDEwMDAxLAotMHhhYzIyNWNlNCwgMHgzYzAxMDAwMSwgMHg4MDA0OTQ3LCAweGFjMjM1ZGE4LAotMHg4ZjgzMDA1NCwgMHgzYzAyMDAwMSwgMHg4YzQyNWRhOCwgMHgyNDYzZDhmMCwKLTB4NDMxMDIzLCAweDJjNDIyNzEwLCAweDE0NDAwMDAzLCAweDI0MDIwMDA5LAotMHgzYzAxMDAwMSwgMHhhYzIyNWNlNCwgMHgzZTAwMDA4LCAweDAsCi0weDAsIDB4MCwgMHgwLCAweDI3YmRmZmQ4LAotMHhhZmIyMDAxOCwgMHg4MDkwMjEsIDB4YWZiMzAwMWMsIDB4YTA5ODIxLAotMHhhZmIxMDAxNCwgMHhjMDg4MjEsIDB4YWZiMDAwMTAsIDB4ODAyMSwKLTB4YWZiZjAwMjAsIDB4YTYyMDAwMDAsIDB4YzAwNGQ0YiwgMHgyNDA0MDAwMSwKLTB4MjYxMDAwMDEsIDB4MmUwMjAwMjAsIDB4MTQ0MGZmZmIsIDB4MCwKLTB4YzAwNGQ0YiwgMHgyMDIxLCAweGMwMDRkNGIsIDB4MjQwNDAwMDEsCi0weGMwMDRkNGIsIDB4MjQwNDAwMDEsIDB4YzAwNGQ0YiwgMHgyMDIxLAotMHgyNDEwMDAxMCwgMHgyNTAxMDI0LCAweDEwNDAwMDAyLCAweDIwMjEsCi0weDI0MDQwMDAxLCAweGMwMDRkNGIsIDB4MTA4MDQyLCAweDE2MDBmZmZhLAotMHgyNTAxMDI0LCAweDI0MTAwMDEwLCAweDI3MDEwMjQsIDB4MTA0MDAwMDIsCi0weDIwMjEsIDB4MjQwNDAwMDEsIDB4YzAwNGQ0YiwgMHgxMDgwNDIsCi0weDE2MDBmZmZhLCAweDI3MDEwMjQsIDB4YzAwNGQ3MSwgMHgzNDEwODAwMCwKLTB4YzAwNGQ3MSwgMHgwLCAweGMwMDRkMmIsIDB4MCwKLTB4NTA0MDAwMDUsIDB4MTA4MDQyLCAweDk2MjIwMDAwLCAweDUwMTAyNSwKLTB4YTYyMjAwMDAsIDB4MTA4MDQyLCAweDE2MDBmZmY3LCAweDAsCi0weGMwMDRkNzEsIDB4MCwgMHg4ZmJmMDAyMCwgMHg4ZmIzMDAxYywKLTB4OGZiMjAwMTgsIDB4OGZiMTAwMTQsIDB4OGZiMDAwMTAsIDB4M2UwMDAwOCwKLTB4MjdiZDAwMjgsIDB4MjdiZGZmZDgsIDB4YWZiMTAwMTQsIDB4ODA4ODIxLAotMHhhZmIyMDAxOCwgMHhhMDkwMjEsIDB4YWZiMzAwMWMsIDB4YzA5ODIxLAotMHhhZmIwMDAxMCwgMHg4MDIxLCAweGFmYmYwMDIwLCAweGMwMDRkNGIsCi0weDI0MDQwMDAxLCAweDI2MTAwMDAxLCAweDJlMDIwMDIwLCAweDE0NDBmZmZiLAotMHgwLCAweGMwMDRkNGIsIDB4MjAyMSwgMHhjMDA0ZDRiLAotMHgyNDA0MDAwMSwgMHhjMDA0ZDRiLCAweDIwMjEsIDB4YzAwNGQ0YiwKLTB4MjQwNDAwMDEsIDB4MjQxMDAwMTAsIDB4MjMwMTAyNCwgMHgxMDQwMDAwMiwKLTB4MjAyMSwgMHgyNDA0MDAwMSwgMHhjMDA0ZDRiLCAweDEwODA0MiwKLTB4MTYwMGZmZmEsIDB4MjMwMTAyNCwgMHgyNDEwMDAxMCwgMHgyNTAxMDI0LAotMHgxMDQwMDAwMiwgMHgyMDIxLCAweDI0MDQwMDAxLCAweGMwMDRkNGIsCi0weDEwODA0MiwgMHgxNjAwZmZmYSwgMHgyNTAxMDI0LCAweGMwMDRkNGIsCi0weDI0MDQwMDAxLCAweGMwMDRkNGIsIDB4MjAyMSwgMHgzNDEwODAwMCwKLTB4OTY2MjAwMDAsIDB4NTAxMDI0LCAweDEwNDAwMDAyLCAweDIwMjEsCi0weDI0MDQwMDAxLCAweGMwMDRkNGIsIDB4MTA4MDQyLCAweDE2MDBmZmY4LAotMHgwLCAweGMwMDRkNzEsIDB4MCwgMHg4ZmJmMDAyMCwKLTB4OGZiMzAwMWMsIDB4OGZiMjAwMTgsIDB4OGZiMTAwMTQsIDB4OGZiMDAwMTAsCi0weDNlMDAwMDgsIDB4MjdiZDAwMjgsIDB4M2MwMzAwMDEsIDB4OGM2MzVkMDAsCi0weDNjMDIwMDAxLCAweDhjNDI1ZDQ4LCAweDI3YmRmZmQ4LCAweGFmYmYwMDIwLAotMHhhZmIxMDAxYywgMHgxMDYyMDAwMywgMHhhZmIwMDAxOCwgMHgzYzAxMDAwMSwKLTB4YWMyMzVkNDgsIDB4MjQ2M2ZmZmYsIDB4MmM2MjAwMTMsIDB4MTA0MDAzNDksCi0weDMxMDgwLCAweDNjMDEwMDAxLCAweDIyMDgyMSwgMHg4YzIyNWIzMCwKLTB4NDAwMDA4LCAweDAsIDB4YzAwNGQ3MSwgMHg4MDIxLAotMHgzNDAyODAwMCwgMHhhN2EyMDAxMCwgMHgyN2IxMDAxMCwgMHhjMDA0ZDRiLAotMHgyNDA0MDAwMSwgMHgyNjEwMDAwMSwgMHgyZTAyMDAyMCwgMHgxNDQwZmZmYiwKLTB4MCwgMHhjMDA0ZDRiLCAweDIwMjEsIDB4YzAwNGQ0YiwKLTB4MjQwNDAwMDEsIDB4YzAwNGQ0YiwgMHgyMDIxLCAweGMwMDRkNGIsCi0weDI0MDQwMDAxLCAweDI0MTAwMDEwLCAweDMyMDIwMDAxLCAweDEwNDAwMDAyLAotMHgyMDIxLCAweDI0MDQwMDAxLCAweGMwMDRkNGIsIDB4MTA4MDQyLAotMHgxNjAwZmZmYSwgMHgzMjAyMDAwMSwgMHgyNDEwMDAxMCwgMHhjMDA0ZDRiLAotMHgyMDIxLCAweDEwODA0MiwgMHgxNjAwZmZmYywgMHgwLAotMHhjMDA0ZDRiLCAweDI0MDQwMDAxLCAweGMwMDRkNGIsIDB4MjAyMSwKLTB4MzQxMDgwMDAsIDB4OTYyMjAwMDAsIDB4NTAxMDI0LCAweDEwNDAwMDAyLAotMHgyMDIxLCAweDI0MDQwMDAxLCAweGMwMDRkNGIsIDB4MTA4MDQyLAotMHgxNjAwZmZmOCwgMHgwLCAweGMwMDRkNzEsIDB4MCwKLTB4ODAwNGQyNCwgMHgyNDAyMDAwMiwgMHgyN2IxMDAxMCwgMHhhN2EwMDAxMCwKLTB4ODAyMSwgMHhjMDA0ZDRiLCAweDI0MDQwMDAxLCAweDI2MTAwMDAxLAotMHgyZTAyMDAyMCwgMHgxNDQwZmZmYiwgMHgwLCAweGMwMDRkNGIsCi0weDIwMjEsIDB4YzAwNGQ0YiwgMHgyNDA0MDAwMSwgMHhjMDA0ZDRiLAotMHgyNDA0MDAwMSwgMHhjMDA0ZDRiLCAweDIwMjEsIDB4MjQxMDAwMTAsCi0weDMyMDIwMDAxLCAweDEwNDAwMDAyLCAweDIwMjEsIDB4MjQwNDAwMDEsCi0weGMwMDRkNGIsIDB4MTA4MDQyLCAweDE2MDBmZmZhLCAweDMyMDIwMDAxLAotMHgyNDEwMDAxMCwgMHhjMDA0ZDRiLCAweDIwMjEsIDB4MTA4MDQyLAotMHgxNjAwZmZmYywgMHgwLCAweGMwMDRkNzEsIDB4MzQxMDgwMDAsCi0weGMwMDRkNzEsIDB4MCwgMHhjMDA0ZDJiLCAweDAsCi0weDUwNDAwMDA1LCAweDEwODA0MiwgMHg5NjIyMDAwMCwgMHg1MDEwMjUsCi0weGE2MjIwMDAwLCAweDEwODA0MiwgMHgxNjAwZmZmNywgMHgwLAotMHhjMDA0ZDcxLCAweDAsIDB4OTdhMjAwMTAsIDB4MzA0MjgwMDAsCi0weDE0NDAwMmRjLCAweDI0MDIwMDAzLCAweDgwMDRkMjQsIDB4MCwKLTB4MjQwMjEyMDAsIDB4YTdhMjAwMTAsIDB4MjdiMTAwMTAsIDB4ODAyMSwKLTB4YzAwNGQ0YiwgMHgyNDA0MDAwMSwgMHgyNjEwMDAwMSwgMHgyZTAyMDAyMCwKLTB4MTQ0MGZmZmIsIDB4MCwgMHhjMDA0ZDRiLCAweDIwMjEsCi0weGMwMDRkNGIsIDB4MjQwNDAwMDEsIDB4YzAwNGQ0YiwgMHgyMDIxLAotMHhjMDA0ZDRiLCAweDI0MDQwMDAxLCAweDI0MTAwMDEwLCAweDMyMDIwMDAxLAotMHgxMDQwMDAwMiwgMHgyMDIxLCAweDI0MDQwMDAxLCAweGMwMDRkNGIsCi0weDEwODA0MiwgMHgxNjAwZmZmYSwgMHgzMjAyMDAwMSwgMHgyNDEwMDAxMCwKLTB4YzAwNGQ0YiwgMHgyMDIxLCAweDEwODA0MiwgMHgxNjAwZmZmYywKLTB4MCwgMHhjMDA0ZDRiLCAweDI0MDQwMDAxLCAweGMwMDRkNGIsCi0weDIwMjEsIDB4MzQxMDgwMDAsIDB4OTYyMjAwMDAsIDB4NTAxMDI0LAotMHgxMDQwMDAwMiwgMHgyMDIxLCAweDI0MDQwMDAxLCAweGMwMDRkNGIsCi0weDEwODA0MiwgMHgxNjAwZmZmOCwgMHgwLCAweGMwMDRkNzEsCi0weDAsIDB4OGY4MzAwNTQsIDB4ODAwNGQxNiwgMHgyNDAyMDAwNCwKLTB4OGY4MzAwNTQsIDB4M2MwMjAwMDEsIDB4OGM0MjVkYjgsIDB4MjQ2M2ZmOWMsCi0weDQzMTAyMywgMHgyYzQyMDA2NCwgMHgxNDQwMDI5ZSwgMHgyNDAyMDAwMiwKLTB4M2MwMzAwMDEsIDB4OGM2MzVkYmMsIDB4MTA2MjAyOTcsIDB4MmM2MjAwMDMsCi0weDE0NDAwMjk2LCAweDI0MDIwMDExLCAweDI0MDIwMDAzLCAweDEwNjIwMDA1LAotMHgyNDAyMDAwNCwgMHgxMDYyMDI5MSwgMHgyNDAyMDAwZiwgMHg4MDA0ZDI0LAotMHgyNDAyMDAxMSwgMHg4MDA0ZDI0LCAweDI0MDIwMDA1LCAweDI0MDIwMDE0LAotMHhhN2EyMDAxMCwgMHgyN2IxMDAxMCwgMHg4MDIxLCAweGMwMDRkNGIsCi0weDI0MDQwMDAxLCAweDI2MTAwMDAxLCAweDJlMDIwMDIwLCAweDE0NDBmZmZiLAotMHgwLCAweGMwMDRkNGIsIDB4MjAyMSwgMHhjMDA0ZDRiLAotMHgyNDA0MDAwMSwgMHhjMDA0ZDRiLCAweDIwMjEsIDB4YzAwNGQ0YiwKLTB4MjQwNDAwMDEsIDB4MjQxMDAwMTAsIDB4MzIwMjAwMDEsIDB4MTA0MDAwMDIsCi0weDIwMjEsIDB4MjQwNDAwMDEsIDB4YzAwNGQ0YiwgMHgxMDgwNDIsCi0weDE2MDBmZmZhLCAweDMyMDIwMDAxLCAweDI0MTAwMDEwLCAweDMyMDIwMDEyLAotMHgxMDQwMDAwMiwgMHgyMDIxLCAweDI0MDQwMDAxLCAweGMwMDRkNGIsCi0weDEwODA0MiwgMHgxNjAwZmZmYSwgMHgzMjAyMDAxMiwgMHhjMDA0ZDRiLAotMHgyNDA0MDAwMSwgMHhjMDA0ZDRiLCAweDIwMjEsIDB4MzQxMDgwMDAsCi0weDk2MjIwMDAwLCAweDUwMTAyNCwgMHgxMDQwMDAwMiwgMHgyMDIxLAotMHgyNDA0MDAwMSwgMHhjMDA0ZDRiLCAweDEwODA0MiwgMHgxNjAwZmZmOCwKLTB4MCwgMHhjMDA0ZDcxLCAweDAsIDB4OGY4MzAwNTQsCi0weDgwMDRkMTYsIDB4MjQwMjAwMDYsIDB4OGY4MzAwNTQsIDB4M2MwMjAwMDEsCi0weDhjNDI1ZGI4LCAweDI0NjNmZjljLCAweDQzMTAyMywgMHgyYzQyMDA2NCwKLTB4MTQ0MDAyNTAsIDB4MjQwMjAwMDcsIDB4ODAwNGQyNCwgMHgwLAotMHgyNDAyMDAwNiwgMHhhN2EyMDAxMCwgMHgyN2IxMDAxMCwgMHg4MDIxLAotMHhjMDA0ZDRiLCAweDI0MDQwMDAxLCAweDI2MTAwMDAxLCAweDJlMDIwMDIwLAotMHgxNDQwZmZmYiwgMHgwLCAweGMwMDRkNGIsIDB4MjAyMSwKLTB4YzAwNGQ0YiwgMHgyNDA0MDAwMSwgMHhjMDA0ZDRiLCAweDIwMjEsCi0weGMwMDRkNGIsIDB4MjQwNDAwMDEsIDB4MjQxMDAwMTAsIDB4MzIwMjAwMDEsCi0weDEwNDAwMDAyLCAweDIwMjEsIDB4MjQwNDAwMDEsIDB4YzAwNGQ0YiwKLTB4MTA4MDQyLCAweDE2MDBmZmZhLCAweDMyMDIwMDAxLCAweDI0MTAwMDEwLAotMHgzMjAyMDAxMywgMHgxMDQwMDAwMiwgMHgyMDIxLCAweDI0MDQwMDAxLAotMHhjMDA0ZDRiLCAweDEwODA0MiwgMHgxNjAwZmZmYSwgMHgzMjAyMDAxMywKLTB4YzAwNGQ0YiwgMHgyNDA0MDAwMSwgMHhjMDA0ZDRiLCAweDIwMjEsCi0weDM0MTA4MDAwLCAweDk2MjIwMDAwLCAweDUwMTAyNCwgMHgxMDQwMDAwMiwKLTB4MjAyMSwgMHgyNDA0MDAwMSwgMHhjMDA0ZDRiLCAweDEwODA0MiwKLTB4MTYwMGZmZjgsIDB4MCwgMHhjMDA0ZDcxLCAweDAsCi0weDhmODMwMDU0LCAweDgwMDRkMTYsIDB4MjQwMjAwMDgsIDB4OGY4MzAwNTQsCi0weDNjMDIwMDAxLCAweDhjNDI1ZGI4LCAweDI0NjNmZjljLCAweDQzMTAyMywKLTB4MmM0MjAwNjQsIDB4MTQ0MDAyMGYsIDB4MjQwMjAwMDksIDB4ODAwNGQyNCwKLTB4MCwgMHgyN2IxMDAxMCwgMHhhN2EwMDAxMCwgMHg4MDIxLAotMHhjMDA0ZDRiLCAweDI0MDQwMDAxLCAweDI2MTAwMDAxLCAweDJlMDIwMDIwLAotMHgxNDQwZmZmYiwgMHgwLCAweGMwMDRkNGIsIDB4MjAyMSwKLTB4YzAwNGQ0YiwgMHgyNDA0MDAwMSwgMHhjMDA0ZDRiLCAweDI0MDQwMDAxLAotMHhjMDA0ZDRiLCAweDIwMjEsIDB4MjQxMDAwMTAsIDB4MzIwMjAwMDEsCi0weDEwNDAwMDAyLCAweDIwMjEsIDB4MjQwNDAwMDEsIDB4YzAwNGQ0YiwKLTB4MTA4MDQyLCAweDE2MDBmZmZhLCAweDMyMDIwMDAxLCAweDI0MTAwMDEwLAotMHgzMjAyMDAxOCwgMHgxMDQwMDAwMiwgMHgyMDIxLCAweDI0MDQwMDAxLAotMHhjMDA0ZDRiLCAweDEwODA0MiwgMHgxNjAwZmZmYSwgMHgzMjAyMDAxOCwKLTB4YzAwNGQ3MSwgMHgzNDEwODAwMCwgMHhjMDA0ZDcxLCAweDAsCi0weGMwMDRkMmIsIDB4MCwgMHg1MDQwMDAwNSwgMHgxMDgwNDIsCi0weDk2MjIwMDAwLCAweDUwMTAyNSwgMHhhNjIyMDAwMCwgMHgxMDgwNDIsCi0weDE2MDBmZmY3LCAweDAsIDB4YzAwNGQ3MSwgMHg4MDIxLAotMHg5N2EyMDAxMCwgMHgyN2IxMDAxMCwgMHgzNDQyMDAwMSwgMHhhN2EyMDAxMCwKLTB4YzAwNGQ0YiwgMHgyNDA0MDAwMSwgMHgyNjEwMDAwMSwgMHgyZTAyMDAyMCwKLTB4MTQ0MGZmZmIsIDB4MCwgMHhjMDA0ZDRiLCAweDIwMjEsCi0weGMwMDRkNGIsIDB4MjQwNDAwMDEsIDB4YzAwNGQ0YiwgMHgyMDIxLAotMHhjMDA0ZDRiLCAweDI0MDQwMDAxLCAweDI0MTAwMDEwLCAweDMyMDIwMDAxLAotMHgxMDQwMDAwMiwgMHgyMDIxLCAweDI0MDQwMDAxLCAweGMwMDRkNGIsCi0weDEwODA0MiwgMHgxNjAwZmZmYSwgMHgzMjAyMDAwMSwgMHgyNDEwMDAxMCwKLTB4MzIwMjAwMTgsIDB4MTA0MDAwMDIsIDB4MjAyMSwgMHgyNDA0MDAwMSwKLTB4YzAwNGQ0YiwgMHgxMDgwNDIsIDB4MTYwMGZmZmEsIDB4MzIwMjAwMTgsCi0weGMwMDRkNGIsIDB4MjQwNDAwMDEsIDB4YzAwNGQ0YiwgMHgyMDIxLAotMHgzNDEwODAwMCwgMHg5NjIyMDAwMCwgMHg1MDEwMjQsIDB4MTA0MDAwMDIsCi0weDIwMjEsIDB4MjQwNDAwMDEsIDB4YzAwNGQ0YiwgMHgxMDgwNDIsCi0weDE2MDBmZmY4LCAweDAsIDB4YzAwNGQ3MSwgMHgwLAotMHg4ZjgzMDA1NCwgMHg4MDA0ZDE2LCAweDI0MDIwMDBhLCAweDhmODMwMDU0LAotMHgzYzAyMDAwMSwgMHg4YzQyNWRiOCwgMHgyNDYzZmY5YywgMHg0MzEwMjMsCi0weDJjNDIwMDY0LCAweDE0NDAwMTliLCAweDI0MDIwMDBiLCAweDgwMDRkMjQsCi0weDAsIDB4MjdiMTAwMTAsIDB4YTdhMDAwMTAsIDB4ODAyMSwKLTB4YzAwNGQ0YiwgMHgyNDA0MDAwMSwgMHgyNjEwMDAwMSwgMHgyZTAyMDAyMCwKLTB4MTQ0MGZmZmIsIDB4MCwgMHhjMDA0ZDRiLCAweDIwMjEsCi0weGMwMDRkNGIsIDB4MjQwNDAwMDEsIDB4YzAwNGQ0YiwgMHgyNDA0MDAwMSwKLTB4YzAwNGQ0YiwgMHgyMDIxLCAweDI0MTAwMDEwLCAweDMyMDIwMDAxLAotMHgxMDQwMDAwMiwgMHgyMDIxLCAweDI0MDQwMDAxLCAweGMwMDRkNGIsCi0weDEwODA0MiwgMHgxNjAwZmZmYSwgMHgzMjAyMDAwMSwgMHgyNDEwMDAxMCwKLTB4MzIwMjAwMTcsIDB4MTA0MDAwMDIsIDB4MjAyMSwgMHgyNDA0MDAwMSwKLTB4YzAwNGQ0YiwgMHgxMDgwNDIsIDB4MTYwMGZmZmEsIDB4MzIwMjAwMTcsCi0weGMwMDRkNzEsIDB4MzQxMDgwMDAsIDB4YzAwNGQ3MSwgMHgwLAotMHhjMDA0ZDJiLCAweDAsIDB4NTA0MDAwMDUsIDB4MTA4MDQyLAotMHg5NjIyMDAwMCwgMHg1MDEwMjUsIDB4YTYyMjAwMDAsIDB4MTA4MDQyLAotMHgxNjAwZmZmNywgMHgwLCAweGMwMDRkNzEsIDB4ODAyMSwKLTB4OTdhMjAwMTAsIDB4MjdiMTAwMTAsIDB4MzQ0MjA3MDAsIDB4YTdhMjAwMTAsCi0weGMwMDRkNGIsIDB4MjQwNDAwMDEsIDB4MjYxMDAwMDEsIDB4MmUwMjAwMjAsCi0weDE0NDBmZmZiLCAweDAsIDB4YzAwNGQ0YiwgMHgyMDIxLAotMHhjMDA0ZDRiLCAweDI0MDQwMDAxLCAweGMwMDRkNGIsIDB4MjAyMSwKLTB4YzAwNGQ0YiwgMHgyNDA0MDAwMSwgMHgyNDEwMDAxMCwgMHgzMjAyMDAwMSwKLTB4MTA0MDAwMDIsIDB4MjAyMSwgMHgyNDA0MDAwMSwgMHhjMDA0ZDRiLAotMHgxMDgwNDIsIDB4MTYwMGZmZmEsIDB4MzIwMjAwMDEsIDB4MjQxMDAwMTAsCi0weDMyMDIwMDE3LCAweDEwNDAwMDAyLCAweDIwMjEsIDB4MjQwNDAwMDEsCi0weGMwMDRkNGIsIDB4MTA4MDQyLCAweDE2MDBmZmZhLCAweDMyMDIwMDE3LAotMHhjMDA0ZDRiLCAweDI0MDQwMDAxLCAweGMwMDRkNGIsIDB4MjAyMSwKLTB4MzQxMDgwMDAsIDB4OTYyMjAwMDAsIDB4NTAxMDI0LCAweDEwNDAwMDAyLAotMHgyMDIxLCAweDI0MDQwMDAxLCAweGMwMDRkNGIsIDB4MTA4MDQyLAotMHgxNjAwZmZmOCwgMHgwLCAweGMwMDRkNzEsIDB4MCwKLTB4OGY4MzAwNTQsIDB4ODAwNGQxNiwgMHgyNDAyMDAwYywgMHg4ZjgzMDA1NCwKLTB4M2MwMjAwMDEsIDB4OGM0MjVkYjgsIDB4MjQ2M2ZmOWMsIDB4NDMxMDIzLAotMHgyYzQyMDA2NCwgMHgxNDQwMDEyNywgMHgyNDAyMDAxMiwgMHg4MDA0ZDI0LAotMHgwLCAweDI3YjEwMDEwLCAweGE3YTAwMDEwLCAweDgwMjEsCi0weGMwMDRkNGIsIDB4MjQwNDAwMDEsIDB4MjYxMDAwMDEsIDB4MmUwMjAwMjAsCi0weDE0NDBmZmZiLCAweDAsIDB4YzAwNGQ0YiwgMHgyMDIxLAotMHhjMDA0ZDRiLCAweDI0MDQwMDAxLCAweGMwMDRkNGIsIDB4MjQwNDAwMDEsCi0weGMwMDRkNGIsIDB4MjAyMSwgMHgyNDEwMDAxMCwgMHgzMjAyMDAwMSwKLTB4MTA0MDAwMDIsIDB4MjAyMSwgMHgyNDA0MDAwMSwgMHhjMDA0ZDRiLAotMHgxMDgwNDIsIDB4MTYwMGZmZmEsIDB4MzIwMjAwMDEsIDB4MjQxMDAwMTAsCi0weDMyMDIwMDE0LCAweDEwNDAwMDAyLCAweDIwMjEsIDB4MjQwNDAwMDEsCi0weGMwMDRkNGIsIDB4MTA4MDQyLCAweDE2MDBmZmZhLCAweDMyMDIwMDE0LAotMHhjMDA0ZDcxLCAweDM0MTA4MDAwLCAweGMwMDRkNzEsIDB4MCwKLTB4YzAwNGQyYiwgMHgwLCAweDUwNDAwMDA1LCAweDEwODA0MiwKLTB4OTYyMjAwMDAsIDB4NTAxMDI1LCAweGE2MjIwMDAwLCAweDEwODA0MiwKLTB4MTYwMGZmZjcsIDB4MCwgMHhjMDA0ZDcxLCAweDgwMjEsCi0weDk3YTIwMDEwLCAweDI3YjEwMDEwLCAweDM0NDIwMDEwLCAweGE3YTIwMDEwLAotMHhjMDA0ZDRiLCAweDI0MDQwMDAxLCAweDI2MTAwMDAxLCAweDJlMDIwMDIwLAotMHgxNDQwZmZmYiwgMHgwLCAweGMwMDRkNGIsIDB4MjAyMSwKLTB4YzAwNGQ0YiwgMHgyNDA0MDAwMSwgMHhjMDA0ZDRiLCAweDIwMjEsCi0weGMwMDRkNGIsIDB4MjQwNDAwMDEsIDB4MjQxMDAwMTAsIDB4MzIwMjAwMDEsCi0weDEwNDAwMDAyLCAweDIwMjEsIDB4MjQwNDAwMDEsIDB4YzAwNGQ0YiwKLTB4MTA4MDQyLCAweDE2MDBmZmZhLCAweDMyMDIwMDAxLCAweDI0MTAwMDEwLAotMHgzMjAyMDAxNCwgMHgxMDQwMDAwMiwgMHgyMDIxLCAweDI0MDQwMDAxLAotMHhjMDA0ZDRiLCAweDEwODA0MiwgMHgxNjAwZmZmYSwgMHgzMjAyMDAxNCwKLTB4YzAwNGQ0YiwgMHgyNDA0MDAwMSwgMHhjMDA0ZDRiLCAweDIwMjEsCi0weDM0MTA4MDAwLCAweDk2MjIwMDAwLCAweDUwMTAyNCwgMHgxMDQwMDAwMiwKLTB4MjAyMSwgMHgyNDA0MDAwMSwgMHhjMDA0ZDRiLCAweDEwODA0MiwKLTB4MTYwMGZmZjgsIDB4MCwgMHhjMDA0ZDcxLCAweDAsCi0weDhmODMwMDU0LCAweDgwMDRkMTYsIDB4MjQwMjAwMTMsIDB4OGY4MzAwNTQsCi0weDNjMDIwMDAxLCAweDhjNDI1ZGI4LCAweDI0NjNmZjljLCAweDQzMTAyMywKLTB4MmM0MjAwNjQsIDB4MTQ0MDAwYjMsIDB4MjQwMjAwMGQsIDB4ODAwNGQyNCwKLTB4MCwgMHgyN2IxMDAxMCwgMHhhN2EwMDAxMCwgMHg4MDIxLAotMHhjMDA0ZDRiLCAweDI0MDQwMDAxLCAweDI2MTAwMDAxLCAweDJlMDIwMDIwLAotMHgxNDQwZmZmYiwgMHgwLCAweGMwMDRkNGIsIDB4MjAyMSwKLTB4YzAwNGQ0YiwgMHgyNDA0MDAwMSwgMHhjMDA0ZDRiLCAweDI0MDQwMDAxLAotMHhjMDA0ZDRiLCAweDIwMjEsIDB4MjQxMDAwMTAsIDB4MzIwMjAwMDEsCi0weDEwNDAwMDAyLCAweDIwMjEsIDB4MjQwNDAwMDEsIDB4YzAwNGQ0YiwKLTB4MTA4MDQyLCAweDE2MDBmZmZhLCAweDMyMDIwMDAxLCAweDI0MTAwMDEwLAotMHgzMjAyMDAxOCwgMHgxMDQwMDAwMiwgMHgyMDIxLCAweDI0MDQwMDAxLAotMHhjMDA0ZDRiLCAweDEwODA0MiwgMHgxNjAwZmZmYSwgMHgzMjAyMDAxOCwKLTB4YzAwNGQ3MSwgMHgzNDEwODAwMCwgMHhjMDA0ZDcxLCAweDAsCi0weGMwMDRkMmIsIDB4MCwgMHg1MDQwMDAwNSwgMHgxMDgwNDIsCi0weDk2MjIwMDAwLCAweDUwMTAyNSwgMHhhNjIyMDAwMCwgMHgxMDgwNDIsCi0weDE2MDBmZmY3LCAweDAsIDB4YzAwNGQ3MSwgMHg4MDIxLAotMHg5N2EyMDAxMCwgMHgyN2IxMDAxMCwgMHgzMDQyZmZmZSwgMHhhN2EyMDAxMCwKLTB4YzAwNGQ0YiwgMHgyNDA0MDAwMSwgMHgyNjEwMDAwMSwgMHgyZTAyMDAyMCwKLTB4MTQ0MGZmZmIsIDB4MCwgMHhjMDA0ZDRiLCAweDIwMjEsCi0weGMwMDRkNGIsIDB4MjQwNDAwMDEsIDB4YzAwNGQ0YiwgMHgyMDIxLAotMHhjMDA0ZDRiLCAweDI0MDQwMDAxLCAweDI0MTAwMDEwLCAweDMyMDIwMDAxLAotMHgxMDQwMDAwMiwgMHgyMDIxLCAweDI0MDQwMDAxLCAweGMwMDRkNGIsCi0weDEwODA0MiwgMHgxNjAwZmZmYSwgMHgzMjAyMDAwMSwgMHgyNDEwMDAxMCwKLTB4MzIwMjAwMTgsIDB4MTA0MDAwMDIsIDB4MjAyMSwgMHgyNDA0MDAwMSwKLTB4YzAwNGQ0YiwgMHgxMDgwNDIsIDB4MTYwMGZmZmEsIDB4MzIwMjAwMTgsCi0weGMwMDRkNGIsIDB4MjQwNDAwMDEsIDB4YzAwNGQ0YiwgMHgyMDIxLAotMHgzNDEwODAwMCwgMHg5NjIyMDAwMCwgMHg1MDEwMjQsIDB4MTA0MDAwMDIsCi0weDIwMjEsIDB4MjQwNDAwMDEsIDB4YzAwNGQ0YiwgMHgxMDgwNDIsCi0weDE2MDBmZmY4LCAweDAsIDB4YzAwNGQ3MSwgMHgwLAotMHg4ZjgzMDA1NCwgMHg4MDA0ZDE2LCAweDI0MDIwMDBlLCAweDI0MDIwODQwLAotMHhhN2EyMDAxMCwgMHgyN2IxMDAxMCwgMHg4MDIxLCAweGMwMDRkNGIsCi0weDI0MDQwMDAxLCAweDI2MTAwMDAxLCAweDJlMDIwMDIwLCAweDE0NDBmZmZiLAotMHgwLCAweGMwMDRkNGIsIDB4MjAyMSwgMHhjMDA0ZDRiLAotMHgyNDA0MDAwMSwgMHhjMDA0ZDRiLCAweDIwMjEsIDB4YzAwNGQ0YiwKLTB4MjQwNDAwMDEsIDB4MjQxMDAwMTAsIDB4MzIwMjAwMDEsIDB4MTA0MDAwMDIsCi0weDIwMjEsIDB4MjQwNDAwMDEsIDB4YzAwNGQ0YiwgMHgxMDgwNDIsCi0weDE2MDBmZmZhLCAweDMyMDIwMDAxLCAweDI0MTAwMDEwLCAweDMyMDIwMDEzLAotMHgxMDQwMDAwMiwgMHgyMDIxLCAweDI0MDQwMDAxLCAweGMwMDRkNGIsCi0weDEwODA0MiwgMHgxNjAwZmZmYSwgMHgzMjAyMDAxMywgMHhjMDA0ZDRiLAotMHgyNDA0MDAwMSwgMHhjMDA0ZDRiLCAweDIwMjEsIDB4MzQxMDgwMDAsCi0weDk2MjIwMDAwLCAweDUwMTAyNCwgMHgxMDQwMDAwMiwgMHgyMDIxLAotMHgyNDA0MDAwMSwgMHhjMDA0ZDRiLCAweDEwODA0MiwgMHgxNjAwZmZmOCwKLTB4MCwgMHhjMDA0ZDcxLCAweDAsIDB4OGY4MzAwNTQsCi0weDI0MDIwMDEwLCAweDNjMDEwMDAxLCAweGFjMjI1ZDAwLCAweDNjMDEwMDAxLAotMHg4MDA0ZDI2LCAweGFjMjM1ZGI4LCAweDhmODMwMDU0LCAweDNjMDIwMDAxLAotMHg4YzQyNWRiOCwgMHgyNDYzZmY5YywgMHg0MzEwMjMsIDB4MmM0MjAwNjQsCi0weDE0NDAwMDA0LCAweDAsIDB4MjQwMjAwMTEsIDB4M2MwMTAwMDEsCi0weGFjMjI1ZDAwLCAweDhmYmYwMDIwLCAweDhmYjEwMDFjLCAweDhmYjAwMDE4LAotMHgzZTAwMDA4LCAweDI3YmQwMDI4LCAweDhmODUwMDQ0LCAweDhmODIwMDQ0LAotMHgzYzAzMDAwMSwgMHg0MzEwMjUsIDB4M2MwMzAwMDgsIDB4YWY4MjAwNDQsCi0weDhmODQwMDU0LCAweDhmODIwMDU0LCAweGEzMjgyNCwgMHg4MDA0ZDM3LAotMHgyNDg0MDAwMSwgMHg4ZjgyMDA1NCwgMHg4MjEwMjMsIDB4MmM0MjAwMDIsCi0weDE0NDBmZmZjLCAweDAsIDB4OGY4MjAwNDQsIDB4M2MwM2ZmZmUsCi0weDM0NjNmZmZmLCAweDQzMTAyNCwgMHhhZjgyMDA0NCwgMHg4ZjgzMDA1NCwKLTB4OGY4MjAwNTQsIDB4ODAwNGQ0NSwgMHgyNDYzMDAwMSwgMHg4ZjgyMDA1NCwKLTB4NjIxMDIzLCAweDJjNDIwMDAyLCAweDE0NDBmZmZjLCAweDAsCi0weDNlMDAwMDgsIDB4YTAxMDIxLCAweDhmODMwMDQ0LCAweDNjMDJmZmYwLAotMHgzNDQyZmZmZiwgMHg0MjQ4MCwgMHg2MjE4MjQsIDB4M2MwMjAwMDIsCi0weDgyMjAyNSwgMHg2NDE4MjUsIDB4YWY4MzAwNDQsIDB4OGY4MjAwNDQsCi0weDNjMDNmZmZlLCAweDM0NjNmZmZmLCAweDQzMTAyNCwgMHhhZjgyMDA0NCwKLTB4OGY4MzAwNTQsIDB4OGY4MjAwNTQsIDB4ODAwNGQ1ZSwgMHgyNDYzMDAwMSwKLTB4OGY4MjAwNTQsIDB4NjIxMDIzLCAweDJjNDIwMDAyLCAweDE0NDBmZmZjLAotMHgwLCAweDhmODIwMDQ0LCAweDNjMDMwMDAxLCAweDQzMTAyNSwKLTB4YWY4MjAwNDQsIDB4OGY4MzAwNTQsIDB4OGY4MjAwNTQsIDB4ODAwNGQ2YiwKLTB4MjQ2MzAwMDEsIDB4OGY4MjAwNTQsIDB4NjIxMDIzLCAweDJjNDIwMDAyLAotMHgxNDQwZmZmYywgMHgwLCAweDNlMDAwMDgsIDB4MCwKLTB4OGY4MjAwNDQsIDB4M2MwM2ZmZjAsIDB4MzQ2M2ZmZmYsIDB4NDMxMDI0LAotMHhhZjgyMDA0NCwgMHg4ZjgyMDA0NCwgMHgzYzAzMDAwMSwgMHg0MzEwMjUsCi0weGFmODIwMDQ0LCAweDhmODMwMDU0LCAweDhmODIwMDU0LCAweDgwMDRkN2YsCi0weDI0NjMwMDAxLCAweDhmODIwMDU0LCAweDYyMTAyMywgMHgyYzQyMDAwMiwKLTB4MTQ0MGZmZmMsIDB4MCwgMHg4ZjgyMDA0NCwgMHgzYzAzZmZmZSwKLTB4MzQ2M2ZmZmYsIDB4NDMxMDI0LCAweGFmODIwMDQ0LCAweDhmODMwMDU0LAotMHg4ZjgyMDA1NCwgMHg4MDA0ZDhkLCAweDI0NjMwMDAxLCAweDhmODIwMDU0LAotMHg2MjEwMjMsIDB4MmM0MjAwMDIsIDB4MTQ0MGZmZmMsIDB4MCwKLTB4M2UwMDAwOCwgMHgwLCAweDI3YmRmZmM4LCAweGFmYjMwMDI0LAotMHg4MDk4MjEsIDB4YWZiNTAwMmMsIDB4YTBhODIxLCAweGFmYjIwMDIwLAotMHhjMDkwMjEsIDB4MzJhMmZmZmYsIDB4YWZiZjAwMzAsIDB4YWZiNDAwMjgsCi0weGFmYjEwMDFjLCAweGFmYjAwMDE4LCAweDE0NDAwMDM0LCAweGE3YjIwMDEwLAotMHgzMjcxZmZmZiwgMHgyN2IyMDAxMCwgMHg4MDIxLCAweGMwMDRkNGIsCi0weDI0MDQwMDAxLCAweDI2MTAwMDAxLCAweDJlMDIwMDIwLCAweDE0NDBmZmZiLAotMHgwLCAweGMwMDRkNGIsIDB4MjAyMSwgMHhjMDA0ZDRiLAotMHgyNDA0MDAwMSwgMHhjMDA0ZDRiLCAweDIwMjEsIDB4YzAwNGQ0YiwKLTB4MjQwNDAwMDEsIDB4MjQxMDAwMTAsIDB4MzIwMjAwMDEsIDB4MTA0MDAwMDIsCi0weDIwMjEsIDB4MjQwNDAwMDEsIDB4YzAwNGQ0YiwgMHgxMDgwNDIsCi0weDE2MDBmZmZhLCAweDMyMDIwMDAxLCAweDI0MTAwMDEwLCAweDIzMDEwMjQsCi0weDEwNDAwMDAyLCAweDIwMjEsIDB4MjQwNDAwMDEsIDB4YzAwNGQ0YiwKLTB4MTA4MDQyLCAweDE2MDBmZmZhLCAweDIzMDEwMjQsIDB4YzAwNGQ0YiwKLTB4MjQwNDAwMDEsIDB4YzAwNGQ0YiwgMHgyMDIxLCAweDM0MTA4MDAwLAotMHg5NjQyMDAwMCwgMHg1MDEwMjQsIDB4MTA0MDAwMDIsIDB4MjAyMSwKLTB4MjQwNDAwMDEsIDB4YzAwNGQ0YiwgMHgxMDgwNDIsIDB4MTIwMDAwNzUsCi0weDAsIDB4ODAwNGRjOSwgMHgwLCAweDMyNzRmZmZmLAotMHgyN2IxMDAxMCwgMHhhN2EwMDAxMCwgMHg4MDIxLCAweGMwMDRkNGIsCi0weDI0MDQwMDAxLCAweDI2MTAwMDAxLCAweDJlMDIwMDIwLCAweDE0NDBmZmZiLAotMHgwLCAweGMwMDRkNGIsIDB4MjAyMSwgMHhjMDA0ZDRiLAotMHgyNDA0MDAwMSwgMHhjMDA0ZDRiLCAweDI0MDQwMDAxLCAweGMwMDRkNGIsCi0weDIwMjEsIDB4MjQxMDAwMTAsIDB4MzIwMjAwMDEsIDB4MTA0MDAwMDIsCi0weDIwMjEsIDB4MjQwNDAwMDEsIDB4YzAwNGQ0YiwgMHgxMDgwNDIsCi0weDE2MDBmZmZhLCAweDMyMDIwMDAxLCAweDI0MTAwMDEwLCAweDI5MDEwMjQsCi0weDEwNDAwMDAyLCAweDIwMjEsIDB4MjQwNDAwMDEsIDB4YzAwNGQ0YiwKLTB4MTA4MDQyLCAweDE2MDBmZmZhLCAweDI5MDEwMjQsIDB4YzAwNGQ3MSwKLTB4MzQxMDgwMDAsIDB4YzAwNGQ3MSwgMHgwLCAweGMwMDRkMmIsCi0weDAsIDB4NTA0MDAwMDUsIDB4MTA4MDQyLCAweDk2MjIwMDAwLAotMHg1MDEwMjUsIDB4YTYyMjAwMDAsIDB4MTA4MDQyLCAweDE2MDBmZmY3LAotMHgwLCAweGMwMDRkNzEsIDB4MCwgMHgzMmE1ZmZmZiwKLTB4MjQwMjAwMDEsIDB4NTRhMjAwMDQsIDB4MjQwMjAwMDIsIDB4OTdhMjAwMTAsCi0weDgwMDRlMTQsIDB4NTIxMDI1LCAweDE0YTIwMDA2LCAweDMyNzFmZmZmLAotMHg5N2EyMDAxMCwgMHgxMjE4MjcsIDB4NDMxMDI0LCAweGE3YTIwMDEwLAotMHgzMjcxZmZmZiwgMHgyN2IyMDAxMCwgMHg4MDIxLCAweGMwMDRkNGIsCi0weDI0MDQwMDAxLCAweDI2MTAwMDAxLCAweDJlMDIwMDIwLCAweDE0NDBmZmZiLAotMHgwLCAweGMwMDRkNGIsIDB4MjAyMSwgMHhjMDA0ZDRiLAotMHgyNDA0MDAwMSwgMHhjMDA0ZDRiLCAweDIwMjEsIDB4YzAwNGQ0YiwKLTB4MjQwNDAwMDEsIDB4MjQxMDAwMTAsIDB4MzIwMjAwMDEsIDB4MTA0MDAwMDIsCi0weDIwMjEsIDB4MjQwNDAwMDEsIDB4YzAwNGQ0YiwgMHgxMDgwNDIsCi0weDE2MDBmZmZhLCAweDMyMDIwMDAxLCAweDI0MTAwMDEwLCAweDIzMDEwMjQsCi0weDEwNDAwMDAyLCAweDIwMjEsIDB4MjQwNDAwMDEsIDB4YzAwNGQ0YiwKLTB4MTA4MDQyLCAweDE2MDBmZmZhLCAweDIzMDEwMjQsIDB4YzAwNGQ0YiwKLTB4MjQwNDAwMDEsIDB4YzAwNGQ0YiwgMHgyMDIxLCAweDM0MTA4MDAwLAotMHg5NjQyMDAwMCwgMHg1MDEwMjQsIDB4MTA0MDAwMDIsIDB4MjAyMSwKLTB4MjQwNDAwMDEsIDB4YzAwNGQ0YiwgMHgxMDgwNDIsIDB4MTYwMGZmZjgsCi0weDAsIDB4YzAwNGQ3MSwgMHgwLCAweDhmYmYwMDMwLAotMHg4ZmI1MDAyYywgMHg4ZmI0MDAyOCwgMHg4ZmIzMDAyNCwgMHg4ZmIyMDAyMCwKLTB4OGZiMTAwMWMsIDB4OGZiMDAwMTgsIDB4M2UwMDAwOCwgMHgyN2JkMDAzOCwKLTB4MCwgMHgwLCAweDAsIDB4MjdiZGZmZTgsCi0weGFmYmYwMDEwLCAweDNjMDMwMDAxLCAweDc3MTgyMSwgMHg4YzYzODNhYywKLTB4MjQwMjAwMDgsIDB4MTQ2MjAyMmMsIDB4ODAzMDIxLCAweDNjMDIwMDAxLAotMHg4YzQyNWQ5OCwgMHgxNDQwMDAzMywgMHgwLCAweDhmODUwMjI0LAotMHgzOGEzMDAyMCwgMHgyYzYzMDAwMSwgMHgzOGEyMDAxMCwgMHgyYzQyMDAwMSwKLTB4NjIxODI1LCAweDE0NjAwMDBkLCAweDM4YTMwMDMwLCAweDJjNjMwMDAxLAotMHgzOGEyMDQwMCwgMHgyYzQyMDAwMSwgMHg2MjE4MjUsIDB4MTQ2MDAwMDcsCi0weDM4YTMwNDAyLCAweDJjNjMwMDAxLCAweDM4YTIwNDA0LCAweDJjNDIwMDAxLAotMHg2MjE4MjUsIDB4MTA2MDAwMDUsIDB4MCwgMHhjMDA0MjliLAotMHgwLCAweDgwMDRlOGQsIDB4MjQwMjAwMGUsIDB4YzAwNDNkZCwKLTB4MCwgMHgzYzA1MDAwMSwgMHg4Y2E1NWNjOCwgMHhjMDA1MmEyLAotMHgyMDIxLCAweDNjMDMwMDAxLCAweDhjNjM1Y2M4LCAweDI0MDIwMDA0LAotMHgxNDYyMDAwNSwgMHgyNDAzZmZmYiwgMHgzYzAyMDAwMSwgMHg4YzQyNWNjNCwKLTB4ODAwNGU4OSwgMHgyNDAzZmZmNywgMHgzYzAyMDAwMSwgMHg4YzQyNWNjNCwKLTB4NDMxMDI0LCAweDNjMDEwMDAxLCAweGFjMjI1Y2M0LCAweDI0MDIwMDBlLAotMHgzYzAxMDAwMSwgMHhjMDA0MjliLCAweGFjMjI3ZGQwLCAweDgwMDUwODcsCi0weDAsIDB4OGY4MjAyMjAsIDB4M2MwMzA0MDAsIDB4NDMxMDI0LAotMHgxMDQwMDAyNywgMHgyNDAzZmZiZiwgMHg4Zjg1MDIyNCwgMHgzYzAyMDAwMSwKLTB4OGM0MjdkZGMsIDB4YTMyMDI0LCAweDQzMTAyNCwgMHgxNDgyMDAwYywKLTB4MCwgMHgzYzAyMDAwMSwgMHg4YzQyN2RlMCwgMHgyNDQyMDAwMSwKLTB4M2MwMTAwMDEsIDB4YWMyMjdkZTAsIDB4MmM0MjAwMDIsIDB4MTQ0MDAwMDgsCi0weDI0MDIwMDAxLCAweDNjMDEwMDAxLCAweDgwMDRlYWQsIDB4YWMyMjdlMDAsCi0weDNjMDEwMDAxLCAweGFjMjA3ZGUwLCAweDNjMDEwMDAxLCAweGFjMjA3ZTAwLAotMHgzYzAyMDAwMSwgMHg4YzQyN2UwMCwgMHgxMDQwMDAwNiwgMHgzMGEyMDA0MCwKLTB4MTA0MDAwMDQsIDB4MjQwMjAwMDEsIDB4M2MwMTAwMDEsIDB4ODAwNGViOCwKLTB4YWMyMjdlMDQsIDB4M2MwMTAwMDEsIDB4YWMyMDdlMDQsIDB4M2MwMTAwMDEsCi0weGFjMjU3ZGRjLCAweDNjMDEwMDAxLCAweDgwMDRlYzgsIDB4YWMyMDdlMTAsCi0weDI0MDIwMDAxLCAweDNjMDEwMDAxLCAweGFjMjI3ZTEwLCAweDNjMDEwMDAxLAotMHhhYzIwN2UwMCwgMHgzYzAxMDAwMSwgMHhhYzIwN2RlMCwgMHgzYzAxMDAwMSwKLTB4YWMyMDdlMDQsIDB4M2MwMTAwMDEsIDB4YWMyMDdkZGMsIDB4M2MwMzAwMDEsCi0weDhjNjM3ZGQwLCAweDNjMDIwMDAxLCAweDhjNDI3ZGQ0LCAweDEwNjIwMDAzLAotMHgzYzAyMDIwMCwgMHgzYzAxMDAwMSwgMHhhYzIzN2RkNCwgMHhjMjEwMjQsCi0weDEwNDAwMDA3LCAweDI0NjNmZmZmLCAweDhmODIwMjIwLCAweDI0MDMwMDAxLAotMHgzYzAxMDAwMSwgMHhhYzIzNWNjYywgMHg4MDA1MDg1LCAweDNjMDNmNzAwLAotMHgyYzYyMDAwZSwgMHgxMDQwMDFhOCwgMHgzMTA4MCwgMHgzYzAxMDAwMSwKLTB4MjIwODIxLCAweDhjMjI1YjgwLCAweDQwMDAwOCwgMHgwLAotMHgzYzAxMDAwMSwgMHhhYzIwN2UwMCwgMHgzYzAxMDAwMSwgMHhhYzIwN2RlMCwKLTB4M2MwMTAwMDEsIDB4YWMyMDdkZGMsIDB4M2MwMTAwMDEsIDB4YWMyMDdlMDQsCi0weDNjMDEwMDAxLCAweGFjMjA3ZGY4LCAweDNjMDEwMDAxLCAweGFjMjA3ZGYwLAotMHhjMDA0ODZhLCAweGFmODAwMjI0LCAweDI0MDIwMDAyLCAweDNjMDEwMDAxLAotMHhhYzIyN2RkMCwgMHgzYzAyMDAwMSwgMHg4YzQyN2UxMCwgMHgxNDQwMDA1NiwKLTB4M2MwM2ZkZmYsIDB4OGVlMjAwMDAsIDB4MzQ2M2ZmZmYsIDB4NDMxMDI0LAotMHhjMDA0MjliLCAweGFlZTIwMDAwLCAweGFmODAwMjA0LCAweDhmODIwMjAwLAotMHgyNDAzZmZmZCwgMHg0MzEwMjQsIDB4YWY4MjAyMDAsIDB4M2MwMTAwMDEsCi0weGFjMjA3ZTIwLCAweDhmODMwMDU0LCAweDNjMDIwMDAxLCAweDhjNDI3ZGY4LAotMHgyNDA0MDAwMSwgMHgzYzAxMDAwMSwgMHhhYzI0N2UwYywgMHgyNDQyMDAwMSwKLTB4M2MwMTAwMDEsIDB4YWMyMjdkZjgsIDB4MmM0MjAwMDQsIDB4M2MwMTAwMDEsCi0weGFjMjM3ZGY0LCAweDE0NDAwMDA2LCAweDI0MDIwMDAzLCAweDNjMDEwMDAxLAotMHhhYzI0NWNjYywgMHgzYzAxMDAwMSwgMHg4MDA1MDgzLCAweGFjMjA3ZGY4LAotMHgzYzAxMDAwMSwgMHg4MDA1MDgzLCAweGFjMjI3ZGQwLCAweDhmODMwMDU0LAotMHgzYzAyMDAwMSwgMHg4YzQyN2RmNCwgMHgyNDYzZDhmMCwgMHg0MzEwMjMsCi0weDJjNDIyNzEwLCAweDE0NDAwMDAzLCAweDI0MDIwMDA0LCAweDNjMDEwMDAxLAotMHhhYzIyN2RkMCwgMHgzYzAyMDAwMSwgMHg4YzQyN2UxMCwgMHgxNDQwMDAyNiwKLTB4M2MwM2ZkZmYsIDB4OGVlMjAwMDAsIDB4MzQ2M2ZmZmYsIDB4NDMxMDI0LAotMHg4MDA1MDgzLCAweGFlZTIwMDAwLCAweDNjMDQwMDAxLCAweDhjODQ1ZDljLAotMHgzYzAxMDAwMSwgMHhjMDA1MDhhLCAweGFjMjA3ZGU4LCAweDNjMDIwMDAxLAotMHg4YzQyN2UxYywgMHhhZjgyMDIwNCwgMHgzYzAyMDAwMSwgMHg4YzQyN2UxMCwKLTB4MTQ0MDAwMTUsIDB4M2MwM2ZkZmYsIDB4OGVlMjAwMDAsIDB4MzQ2M2ZmZmYsCi0weDQzMTAyNCwgMHhhZWUyMDAwMCwgMHg4ZjgyMDIwNCwgMHgzMDQyMDAzMCwKLTB4MTQ0MDAxM2MsIDB4MjQwMjAwMDIsIDB4M2MwMzAwMDEsIDB4OGM2MzdlMWMsCi0weDI0MDIwMDA1LCAweDNjMDEwMDAxLCAweGFjMjI3ZGQwLCAweDNjMDEwMDAxLAotMHg4MDA1MDgzLCAweGFjMjM3ZTIwLCAweDNjMDIwMDAxLCAweDhjNDI3ZTEwLAotMHgxMDQwMDAxMCwgMHgzYzAzZmRmZiwgMHgzYzAyMDAwMSwgMHg4YzQyNWQ2YywKLTB4MjQ0MjAwMDEsIDB4M2MwMTAwMDEsIDB4YWMyMjVkNmMsIDB4MmM0MjAwMDIsCi0weDE0NDAwMTMxLCAweDI0MDIwMDAxLCAweDNjMDEwMDAxLCAweGFjMjI1ZDc0LAotMHgzYzAxMDAwMSwgMHhhYzIwNWQ2YywgMHgzYzAxMDAwMSwgMHg4MDA1MDgzLAotMHhhYzIyNWNjYywgMHg4ZWUyMDAwMCwgMHgzNDYzZmZmZiwgMHg0MzEwMjQsCi0weGFlZTIwMDAwLCAweDNjMDIwMDAxLCAweDhjNDI3ZTAwLCAweDEwNDAwMTIyLAotMHgwLCAweDNjMDIwMDAxLCAweDhjNDI3ZGRjLCAweDEwNDAwMTFlLAotMHgwLCAweDNjMDEwMDAxLCAweGFjMjI3ZTA4LCAweDI0MDIwMDAzLAotMHgzYzAxMDAwMSwgMHhhYzIyN2RlMCwgMHg4MDA1MDI0LCAweDI0MDIwMDA2LAotMHgzYzAxMDAwMSwgMHhhYzIwN2RlOCwgMHg4ZjgyMDIwNCwgMHgzNDQyMDA0MCwKLTB4YWY4MjAyMDQsIDB4M2MwMjAwMDEsIDB4OGM0MjdlMjAsIDB4MjQwMzAwMDcsCi0weDNjMDEwMDAxLCAweGFjMjM3ZGQwLCAweDM0NDIwMDQwLCAweDNjMDEwMDAxLAotMHhhYzIyN2UyMCwgMHgzYzAyMDAwMSwgMHg4YzQyN2UwMCwgMHgxMDQwMDAwNSwKLTB4MCwgMHgzYzAyMDAwMSwgMHg4YzQyN2RkYywgMHgxMDQwMDBmOSwKLTB4MjQwMjAwMDIsIDB4M2MwNTAwMDEsIDB4MjRhNTdkZTAsIDB4OGNhMjAwMDAsCi0weDJjNDI0ZTIxLCAweDEwNDAwMGYzLCAweDI0MDIwMDAyLCAweDNjMDIwMDAxLAotMHg4YzQyN2UwNCwgMHgxMDQwMDBmOCwgMHgyNDA0ZmZiZiwgMHgzYzAyMDAwMSwKLTB4OGM0MjdkZGMsIDB4M2MwMzAwMDEsIDB4OGM2MzdlMDgsIDB4NDQxMDI0LAotMHg2NDE4MjQsIDB4MTA0MzAwMDQsIDB4MjQwMjAwMDEsIDB4M2MwMTAwMDEsCi0weDgwMDUwODMsIDB4YWMyMjdkZDAsIDB4MjQwMjAwMDMsIDB4YWNhMjAwMDAsCi0weDI0MDIwMDA4LCAweDNjMDEwMDAxLCAweGFjMjI3ZGQwLCAweDNjMDIwMDAxLAotMHg4YzQyN2UwYywgMHgxMDQwMDAwYywgMHgyNDAyMDAwMSwgMHgzYzA0MDAwMSwKLTB4YzAwNTA5NywgMHg4Yzg0N2RkYywgMHgzYzAyMDAwMSwgMHg4YzQyN2UyOCwKLTB4MTQ0MDAwMDUsIDB4MjQwMjAwMDEsIDB4M2MwMjAwMDEsIDB4OGM0MjdlMjQsCi0weDEwNDAwMDA2LCAweDI0MDIwMDAxLCAweDNjMDEwMDAxLCAweGFjMjI1Y2NjLAotMHgzYzAxMDAwMSwgMHg4MDA1MDgzLCAweGFjMjA3ZGY4LCAweDNjMDIwMDAxLAotMHg4YzQyN2RmMCwgMHgzYzAzMDAwMSwgMHg4YzYzN2RkYywgMHgyYzQyMDAwMSwKLTB4MjEwYzAsIDB4MzA2MzAwMDgsIDB4M2MwMTAwMDEsIDB4YWMyMjdkZjAsCi0weDNjMDEwMDAxLCAweGFjMjM3ZGVjLCAweDhmODMwMDU0LCAweDI0MDIwMDA5LAotMHgzYzAxMDAwMSwgMHhhYzIyN2RkMCwgMHgzYzAxMDAwMSwgMHg4MDA1MDgzLAotMHhhYzIzN2RmNCwgMHg4ZjgzMDA1NCwgMHgzYzAyMDAwMSwgMHg4YzQyN2RmNCwKLTB4MjQ2M2Q4ZjAsIDB4NDMxMDIzLCAweDJjNDIyNzEwLCAweDE0NDAwMGE4LAotMHgwLCAweDNjMDIwMDAxLCAweDhjNDI3ZTAwLCAweDEwNDAwMDA1LAotMHgwLCAweDNjMDIwMDAxLCAweDhjNDI3ZGRjLCAweDEwNDAwMGE5LAotMHgyNDAyMDAwMiwgMHgzYzAzMDAwMSwgMHgyNDYzN2RlMCwgMHg4YzYyMDAwMCwKLTB4MmM0MjRlMjEsIDB4MTA0MDAwYTMsIDB4MjQwMjAwMDIsIDB4M2MwMjAwMDEsCi0weDhjNDI3ZTBjLCAweDEwNDAwMDBlLCAweDAsIDB4M2MwMjAwMDEsCi0weDhjNDI3ZGRjLCAweDNjMDEwMDAxLCAweGFjMjA3ZTBjLCAweDMwNDIwMDgwLAotMHgxMDQwMDAyZiwgMHgyNDAyMDAwYywgMHg4ZjgyMDIwNCwgMHgzMDQyMDA4MCwKLTB4MTQ0MDAwMGMsIDB4MjQwMjAwMDMsIDB4ODAwNTAxMSwgMHgyNDAyMDAwYywKLTB4M2MwMjAwMDEsIDB4OGM0MjdkZGMsIDB4MzA0MjAwODAsIDB4MTQ0MDAwMDUsCi0weDI0MDIwMDAzLCAweDhmODIwMjA0LCAweDMwNDIwMDgwLCAweDEwNDAwMDFmLAotMHgyNDAyMDAwMywgMHhhYzYyMDAwMCwgMHgyNDAyMDAwYSwgMHgzYzAxMDAwMSwKLTB4YWMyMjdkZDAsIDB4M2MwNDAwMDEsIDB4MjQ4NDdlMTgsIDB4OGM4MjAwMDAsCi0weDNjMDMwMDAxLCAweDhjNjM3ZGYwLCAweDQzMTAyNSwgMHhhZjgyMDIwNCwKLTB4OGM4MzAwMDAsIDB4M2MwNDAwMDEsIDB4OGM4NDdkZjAsIDB4MjQwMjAwMGIsCi0weDNjMDEwMDAxLCAweGFjMjI3ZGQwLCAweDY0MTgyNSwgMHgzYzAxMDAwMSwKLTB4YWMyMzdlMjAsIDB4M2MwNTAwMDEsIDB4MjRhNTdkZTAsIDB4OGNhMjAwMDAsCi0weDJjNDI0ZTIxLCAweDEwNDAwMDZmLCAweDI0MDIwMDAyLCAweDNjMDIwMDAxLAotMHg4YzQyN2UxMCwgMHgxMDQwMDAwNSwgMHgwLCAweDI0MDIwMDBjLAotMHgzYzAxMDAwMSwgMHg4MDA1MDgzLCAweGFjMjI3ZGQwLCAweDNjMDIwMDAxLAotMHg4YzQyN2UwMCwgMHgxMDQwMDA2YywgMHgwLCAweDNjMDQwMDAxLAotMHg4Yzg0N2RkYywgMHgxMDgwMDA1ZSwgMHgzMDgyMDAwOCwgMHgzYzAzMDAwMSwKLTB4OGM2MzdkZWMsIDB4MTA2MjAwNjQsIDB4MjQwMjAwMDMsIDB4M2MwMTAwMDEsCi0weGFjMjQ3ZTA4LCAweGFjYTIwMDAwLCAweDI0MDIwMDA2LCAweDNjMDEwMDAxLAotMHg4MDA1MDgzLCAweGFjMjI3ZGQwLCAweDhmODIwMjAwLCAweDM0NDIwMDAyLAotMHhhZjgyMDIwMCwgMHg4ZjgzMDA1NCwgMHgyNDAyMDAwZCwgMHgzYzAxMDAwMSwKLTB4YWMyMjdkZDAsIDB4M2MwMTAwMDEsIDB4YWMyMzdkZjQsIDB4OGY4MzAwNTQsCi0weDNjMDIwMDAxLCAweDhjNDI3ZGY0LCAweDI0NjNkOGYwLCAweDQzMTAyMywKLTB4MmM0MjI3MTAsIDB4MTQ0MDAwM2EsIDB4MCwgMHgzYzAyMDAwMSwKLTB4OGM0MjdlMTAsIDB4MTA0MDAwMjksIDB4MjQwMjAwMGUsIDB4M2MwMzAwMDEsCi0weDhjNjM3ZTI0LCAweDNjMDEwMDAxLCAweDE0NjAwMDE1LCAweGFjMjI3ZGQwLAotMHhjMDA0M2RkLCAweDAsIDB4M2MwNTAwMDEsIDB4OGNhNTVjYzgsCi0weGMwMDUyYTIsIDB4MjAyMSwgMHgzYzAzMDAwMSwgMHg4YzYzNWNjOCwKLTB4MjQwMjAwMDQsIDB4MTQ2MjAwMDUsIDB4MjQwM2ZmZmIsIDB4M2MwMjAwMDEsCi0weDhjNDI1Y2M0LCAweDgwMDUwNTIsIDB4MjQwM2ZmZjcsIDB4M2MwMjAwMDEsCi0weDhjNDI1Y2M0LCAweDQzMTAyNCwgMHgzYzAxMDAwMSwgMHhhYzIyNWNjNCwKLTB4OGVlMjAwMDAsIDB4M2MwMzAyMDAsIDB4NDMxMDI1LCAweGFlZTIwMDAwLAotMHg4ZjgyMDIyNCwgMHgzYzAxMDAwMSwgMHhhYzIyN2UyYywgMHg4ZjgyMDIyMCwKLTB4MjQwM2ZmZmIsIDB4NDMxMDI0LCAweGFmODIwMjIwLCAweDhmODIwMjIwLAotMHgzNDQyMDAwMiwgMHg4MDA1MDgzLCAweGFmODIwMjIwLCAweDNjMDIwMDAxLAotMHg4YzQyN2UwMCwgMHgxMDQwMDAwNSwgMHgwLCAweDNjMDIwMDAxLAotMHg4YzQyN2RkYywgMHgxMDQwMDAwZiwgMHgyNDAyMDAwMiwgMHgzYzAyMDAwMSwKLTB4OGM0MjdkZTAsIDB4MmM0MjRlMjEsIDB4MTA0MDAwMGEsIDB4MjQwMjAwMDIsCi0weDNjMDIwMDAxLCAweDhjNDI3ZTAwLCAweDEwNDAwMDBmLCAweDAsCi0weDNjMDIwMDAxLCAweDhjNDI3ZGRjLCAweDE0NDAwMDBiLCAweDAsCi0weDI0MDIwMDAyLCAweDNjMDEwMDAxLCAweDgwMDUwODMsIDB4YWMyMjdkZDAsCi0weDNjMDIwMDAxLCAweDhjNDI3ZTAwLCAweDEwNDAwMDAzLCAweDAsCi0weGMwMDQyOWIsIDB4MCwgMHg4ZjgyMDIyMCwgMHgzYzAzZjcwMCwKLTB4NDMxMDI1LCAweGFmODIwMjIwLCAweDhmYmYwMDEwLCAweDNlMDAwMDgsCi0weDI3YmQwMDE4LCAweDNjMDMwMDAxLCAweDI0NjM3ZTI4LCAweDhjNjIwMDAwLAotMHgxMDQwMDAwNSwgMHgzNDQyMjAwMCwgMHgzYzAxMDAwMSwgMHhhYzIyN2UxYywKLTB4ODAwNTA5NSwgMHhhYzYwMDAwMCwgMHgzYzAxMDAwMSwgMHhhYzI0N2UxYywKLTB4M2UwMDAwOCwgMHgwLCAweDI3YmRmZmUwLCAweDMwODIwMDMwLAotMHhhZmJmMDAxOCwgMHgzYzAxMDAwMSwgMHhhYzIyN2UyNCwgMHgxNDQwMDA2NywKLTB4M2MwMmZmZmYsIDB4MzQ0MjFmMGUsIDB4ODIxMDI0LCAweDE0NDAwMDYxLAotMHgyNDAyMDAzMCwgMHgzMDgyMjAwMCwgMHgxMDQwMDA1ZCwgMHgzMDgzODAwMCwKLTB4MzFhMDIsIDB4MzA4MjAwMDEsIDB4MjEyMDAsIDB4M2MwNDAwMDEsCi0weDhjODQ1ZDljLCAweDYyMTgyNSwgMHgzMzFjMiwgMHgzYzAzMDAwMSwKLTB4MjQ2MzVkNzgsIDB4MzA4MjgwMDAsIDB4MjEyMDIsIDB4MzA4NDAwMDEsCi0weDQyMjAwLCAweDQ0MTAyNSwgMHgyMzljMiwgMHg2MTA4MCwKLTB4NDMxMDIxLCAweDQ3MTAyMSwgMHg5MDQzMDAwMCwgMHgyNDAyMDAwMSwKLTB4MTA2MjAwMjUsIDB4MCwgMHgxMDYwMDAwNywgMHgyNDAyMDAwMiwKLTB4MTA2MjAwMTMsIDB4MjQwMjAwMDMsIDB4MTA2MjAwMmMsIDB4M2MwNTAwMGYsCi0weDgwMDUwZjksIDB4MCwgMHg4ZjgyMDIwMCwgMHgyNDAzZmVmZiwKLTB4NDMxMDI0LCAweGFmODIwMjAwLCAweDhmODIwMjIwLCAweDNjMDNmZmZlLAotMHgzNDYzZmZmZiwgMHg0MzEwMjQsIDB4YWY4MjAyMjAsIDB4M2MwMTAwMDEsCi0weGFjMjA3ZTQ0LCAweDNjMDEwMDAxLCAweDgwMDUxMDQsIDB4YWMyMDdlNGMsCi0weDhmODIwMjAwLCAweDM0NDIwMTAwLCAweGFmODIwMjAwLCAweDhmODIwMjIwLAotMHgzYzAzZmZmZSwgMHgzNDYzZmZmZiwgMHg0MzEwMjQsIDB4YWY4MjAyMjAsCi0weDI0MDIwMTAwLCAweDNjMDEwMDAxLCAweGFjMjI3ZTQ0LCAweDNjMDEwMDAxLAotMHg4MDA1MTA0LCAweGFjMjA3ZTRjLCAweDhmODIwMjAwLCAweDI0MDNmZWZmLAotMHg0MzEwMjQsIDB4YWY4MjAyMDAsIDB4OGY4MjAyMjAsIDB4M2MwMzAwMDEsCi0weDQzMTAyNSwgMHhhZjgyMDIyMCwgMHgzYzAxMDAwMSwgMHhhYzIwN2U0NCwKLTB4M2MwMTAwMDEsIDB4ODAwNTEwNCwgMHhhYzIzN2U0YywgMHg4ZjgyMDIwMCwKLTB4MzQ0MjAxMDAsIDB4YWY4MjAyMDAsIDB4OGY4MjAyMjAsIDB4M2MwMzAwMDEsCi0weDQzMTAyNSwgMHhhZjgyMDIyMCwgMHgyNDAyMDEwMCwgMHgzYzAxMDAwMSwKLTB4YWMyMjdlNDQsIDB4M2MwMTAwMDEsIDB4ODAwNTEwNCwgMHhhYzIzN2U0YywKLTB4MzRhNWZmZmYsIDB4M2MwNDAwMDEsIDB4MjQ4NDViYjgsIDB4YWZhMzAwMTAsCi0weGMwMDI0MDMsIDB4YWZhMDAwMTQsIDB4ODAwNTEwNCwgMHgwLAotMHgyNDAyMDAzMCwgMHgzYzAxMDAwMSwgMHhhYzIyN2UyOCwgMHg4ZmJmMDAxOCwKLTB4M2UwMDAwOCwgMHgyN2JkMDAyMCwgMHgwLCAweDI3YmRmZmM4LAotMHhhZmIyMDAyOCwgMHg4MDkwMjEsIDB4YWZiMzAwMmMsIDB4YTA5ODIxLAotMHhhZmIwMDAyMCwgMHhjMDgwMjEsIDB4M2MwNDAwMDEsIDB4MjQ4NDViZDAsCi0weDNjMDUwMDA5LCAweDNjMDIwMDAxLCAweDhjNDI1Y2M4LCAweDM0YTU5MDAxLAotMHgyNDAzMDIxLCAweDI2MDM4MjEsIDB4YWZiZjAwMzAsIDB4YWZiMTAwMjQsCi0weGE3YTAwMDFhLCAweGFmYjAwMDE0LCAweGMwMDI0MDMsIDB4YWZhMjAwMTAsCi0weDI0MDIwMDAyLCAweDEyNjIwMDgzLCAweDJlNjIwMDAzLCAweDEwNDAwMDA1LAotMHgyNDAyMDAwMSwgMHgxMjYyMDAwYSwgMHgwLCAweDgwMDUyOWIsCi0weDAsIDB4MjQwMjAwMDQsIDB4MTI2MjAwZmEsIDB4MjQwMjAwMDgsCi0weDEyNjIwMGY5LCAweDNjMDJmZmVjLCAweDgwMDUyOWIsIDB4MCwKLTB4M2MwMjAwMDEsIDB4OGM0MjVjYzQsIDB4MzA0MjAwMDIsIDB4MTQ0MDAwMDQsCi0weDEyODk0MCwgMHgzYzAyZmZmYiwgMHgzNDQyZmZmZiwgMHgyMDI4MDI0LAotMHgzYzAxMDAwMSwgMHgzMTA4MjEsIDB4YWMzMDdlM2MsIDB4M2MwMjQwMDAsCi0weDIwMjEwMjQsIDB4MTA0MDAwNGUsIDB4MTAyM2MyLCAweDMwODQwMDMwLAotMHgxMDEzODIsIDB4MzA0MjAwMWMsIDB4M2MwMzAwMDEsIDB4MjQ2MzVkMDgsCi0weDQzMTAyMSwgMHg4MjM4MjEsIDB4M2MwMjAwMjAsIDB4MjAyMTAyNCwKLTB4MTA0MDAwMDYsIDB4MjQwMjAxMDAsIDB4M2MwMTAwMDEsIDB4MzEwODIxLAotMHhhYzIyN2U0MCwgMHg4MDA1MTUwLCAweDNjMDIwMDgwLCAweDNjMDEwMDAxLAotMHgzMTA4MjEsIDB4YWMyMDdlNDAsIDB4M2MwMjAwODAsIDB4MjAyMTAyNCwKLTB4MTA0MDAwMDYsIDB4MTIxOTQwLCAweDNjMDIwMDAxLCAweDNjMDEwMDAxLAotMHgyMzA4MjEsIDB4ODAwNTE1YywgMHhhYzIyN2U0OCwgMHgxMjExNDAsCi0weDNjMDEwMDAxLCAweDIyMDgyMSwgMHhhYzIwN2U0OCwgMHg5NGU0MDAwMCwKLTB4M2MwMzAwMDEsIDB4OGM2MzVkYmMsIDB4MjQwMjAwMDUsIDB4MTA2MjAwMTAsCi0weGE3YTQwMDE4LCAweDMyMDI0MDAwLCAweDEwNDAwMDAyLCAweDM0ODI0MDAwLAotMHhhN2EyMDAxOCwgMHgyNDA0MDAwMSwgMHg5NGUyMDAwMiwgMHgyNDA1MDAwNCwKLTB4MjRlNjAwMDIsIDB4MzQ0MjAwMDEsIDB4YzAwNDk4ZSwgMHhhNGUyMDAwMiwKLTB4MjQwNDAwMDEsIDB4MjgyMSwgMHhjMDA0OThlLCAweDI3YTYwMDE4LAotMHgzYzAyMDAwMSwgMHg4YzQyNWNjOCwgMHgyNDExMDAwMSwgMHgzYzAxMDAwMSwKLTB4YWMzMTVjZDQsIDB4MTQ1MzAwMDQsIDB4MzIwMjgwMDAsIDB4YzAwNDI5YiwKLTB4MCwgMHgzMjAyODAwMCwgMHgxMDQwMDExZiwgMHgwLAotMHhjMDA0MjliLCAweDAsIDB4M2MwMzAwMDEsIDB4OGM2MzVkYmMsCi0weDI0MDIwMDA1LCAweDEwNjIwMTE4LCAweDI0MDIwMDAyLCAweDNjMDEwMDAxLAotMHhhYzMxNWNjYywgMHgzYzAxMDAwMSwgMHg4MDA1MjliLCAweGFjMjI1Y2M4LAotMHgyNDA0MDAwMSwgMHgyNDA1MDAwNCwgMHgyN2IwMDAxYSwgMHhjMDA0OThlLAotMHgyMDAzMDIxLCAweDI0MDQwMDAxLCAweDI4MjEsIDB4YzAwNDk4ZSwKLTB4MjAwMzAyMSwgMHgzYzAyMDAwMSwgMHg1MTEwMjEsIDB4OGM0MjdlMzQsCi0weDNjMDQwMDAxLCAweDhjODQ1Y2M4LCAweDNjMDNiZmZmLCAweDM0NjNmZmZmLAotMHgzYzAxMDAwMSwgMHhhYzMzNWNkNCwgMHg0MzEwMjQsIDB4M2MwMTAwMDEsCi0weDMxMDgyMSwgMHgxMDkzMDBmYSwgMHhhYzIyN2UzNCwgMHg4MDA1MjliLAotMHgwLCAweDNjMDIyMDAwLCAweDIwMjEwMjQsIDB4MTA0MDAwMDUsCi0weDI0MDIwMDAxLCAweDNjMDEwMDAxLCAweGFjMjI1ZDk4LCAweDgwMDUxYWQsCi0weDEyODk0MCwgMHgzYzAxMDAwMSwgMHhhYzIwNWQ5OCwgMHgxMjg5NDAsCi0weDNjMDEwMDAxLCAweDMxMDgyMSwgMHhhYzMwN2UzOCwgMHgzYzAyNDAwMCwKLTB4MjAyMTAyNCwgMHgxNDQwMDAxNiwgMHgwLCAweDNjMDIwMDAxLAotMHg4YzQyNWQ5OCwgMHgxMDQwMDAwOCwgMHgyNDA0MDAwNCwgMHgyNDA1MDAwMSwKLTB4YzAwNGQ5MywgMHgyNDA2MjAwMCwgMHgyNDAyMDAwMSwgMHgzYzAxMDAwMSwKLTB4MzcwODIxLCAweGFjMjI4M2FjLCAweDNjMDIwMDAxLCAweDUxMTAyMSwKLTB4OGM0MjdlMzAsIDB4M2MwM2JmZmYsIDB4MzQ2M2ZmZmYsIDB4NDMxMDI0LAotMHgzYzAxMDAwMSwgMHgzMTA4MjEsIDB4ODAwNTI5OSwgMHhhYzIyN2UzMCwKLTB4M2MwMjAwMDEsIDB4OGM0MjVkOTgsIDB4MTA0MDAwMjgsIDB4M2MwMzAwYTAsCi0weDIwMzEwMjQsIDB4NTQ0MzAwMGQsIDB4M2MwMjAwMjAsIDB4M2MwMjAwMDEsCi0weDhjNDI1ZDljLCAweDI0MDMwMTAwLCAweDNjMDEwMDAxLCAweDMxMDgyMSwKLTB4YWMyMzdlNDQsIDB4M2MwMzAwMDEsIDB4M2MwMTAwMDEsIDB4MzEwODIxLAotMHhhYzIzN2U0YywgMHg4MDA1MWYwLCAweDM0NDIwNDAwLCAweDIwMjEwMjQsCi0weDEwNDAwMDA4LCAweDI0MDMwMTAwLCAweDNjMDIwMDAxLCAweDhjNDI1ZDljLAotMHgzYzAxMDAwMSwgMHgzMTA4MjEsIDB4YWMyMzdlNDQsIDB4ODAwNTFmMCwKLTB4MzQ0MjA4MDAsIDB4M2MwMjAwODAsIDB4MjAyMTAyNCwgMHgxMDQwMDAyZSwKLTB4M2MwMzAwMDEsIDB4M2MwMjAwMDEsIDB4OGM0MjVkOWMsIDB4M2MwMTAwMDEsCi0weDMxMDgyMSwgMHhhYzIzN2U0YywgMHgzNDQyMGMwMCwgMHgzYzAxMDAwMSwKLTB4YWMyMjVkOWMsIDB4ODAwNTIxOCwgMHgyNDA0MDAwMSwgMHgzYzAyMDAyMCwKLTB4MjAyMTAyNCwgMHgxMDQwMDAwNiwgMHgyNDAyMDEwMCwgMHgzYzAxMDAwMSwKLTB4MzEwODIxLCAweGFjMjI3ZTQ0LCAweDgwMDUyMDEsIDB4M2MwMjAwODAsCi0weDNjMDEwMDAxLCAweDMxMDgyMSwgMHhhYzIwN2U0NCwgMHgzYzAyMDA4MCwKLTB4MjAyMTAyNCwgMHgxMDQwMDAwNywgMHgxMjE5NDAsIDB4M2MwMjAwMDEsCi0weDNjMDEwMDAxLCAweDIzMDgyMSwgMHhhYzIyN2U0YywgMHg4MDA1MjBmLAotMHgyNDA0MDAwMSwgMHgxMjExNDAsIDB4M2MwMTAwMDEsIDB4MjIwODIxLAotMHhhYzIwN2U0YywgMHgyNDA0MDAwMSwgMHgyODIxLCAweDI3YjAwMDFlLAotMHhjMDA0OTRjLCAweDIwMDMwMjEsIDB4MjQwNDAwMDEsIDB4MjgyMSwKLTB4YzAwNDk0YywgMHgyMDAzMDIxLCAweDI0MDQwMDAxLCAweDI0MDUwMDAxLAotMHgyN2IwMDAxYywgMHhjMDA0OTRjLCAweDIwMDMwMjEsIDB4MjQwNDAwMDEsCi0weDI0MDUwMDAxLCAweGMwMDQ5NGMsIDB4MjAwMzAyMSwgMHg4MDA1Mjk5LAotMHgwLCAweDNjMDJmZmVjLCAweDM0NDJmZmZmLCAweDIwMjgwMjQsCi0weDNjMDIwMDA4LCAweDIwMjgwMjUsIDB4MTIxMTQwLCAweDNjMDEwMDAxLAotMHgyMjA4MjEsIDB4YWMzMDdlMzgsIDB4M2MwMjIwMDAsIDB4MjAyMTAyNCwKLTB4MTA0MDAwMDksIDB4MCwgMHgzYzAyMDAwMSwgMHg4YzQyNWQ3NCwKLTB4MTQ0MDAwMDUsIDB4MjQwMjAwMDEsIDB4M2MwMTAwMDEsIDB4YWMyMjVkOTgsCi0weDgwMDUyM2EsIDB4M2MwMjQwMDAsIDB4M2MwMTAwMDEsIDB4YWMyMDVkOTgsCi0weDNjMDI0MDAwLCAweDIwMjEwMjQsIDB4MTQ0MDAwMWUsIDB4MCwKLTB4M2MwMjAwMDEsIDB4OGM0MjVkOTgsIDB4M2MwMTAwMDEsIDB4YWMyMDVjZTAsCi0weDEwNDAwMDA3LCAweDI0MDIyMDIwLCAweDNjMDEwMDAxLCAweGFjMjI1ZDljLAotMHgyNDAyMDAwMSwgMHgzYzAxMDAwMSwgMHgzNzA4MjEsIDB4YWMyMjgzYWMsCi0weDNjMDRiZmZmLCAweDEyMTk0MCwgMHgzYzAyMDAwMSwgMHg0MzEwMjEsCi0weDhjNDI3ZTMwLCAweDNjMDUwMDAxLCAweDhjYTU1Y2M4LCAweDM0ODRmZmZmLAotMHg0NDEwMjQsIDB4M2MwMTAwMDEsIDB4MjMwODIxLCAweGFjMjI3ZTMwLAotMHgyNDAyMDAwMSwgMHgxMGEyMDA0NCwgMHgwLCAweDgwMDUyOTksCi0weDAsIDB4M2MwMjAwMDEsIDB4OGM0MjVkOTgsIDB4MTA0MDAwMWMsCi0weDI0MDIyMDAwLCAweDNjMDEwMDAxLCAweGFjMjI1ZDljLCAweDNjMDMwMGEwLAotMHgyMDMxMDI0LCAweDE0NDMwMDA1LCAweDEyMTE0MCwgMHgzNDAyYTAwMCwKLTB4M2MwMTAwMDEsIDB4ODAwNTI5NCwgMHhhYzIyNWQ5YywgMHgzYzAzMDAwMSwKLTB4NjIxODIxLCAweDhjNjM3ZTM4LCAweDNjMDIwMDIwLCAweDYyMTAyNCwKLTB4MTA0MDAwMDQsIDB4MjQwMjIwMDEsIDB4M2MwMTAwMDEsIDB4ODAwNTI5NCwKLTB4YWMyMjVkOWMsIDB4M2MwMjAwODAsIDB4NjIxMDI0LCAweDEwNDAwMDFmLAotMHgzNDAyYTAwMSwgMHgzYzAxMDAwMSwgMHg4MDA1Mjk0LCAweGFjMjI1ZDljLAotMHgzYzAyMDAyMCwgMHgyMDIxMDI0LCAweDEwNDAwMDA3LCAweDEyMTk0MCwKLTB4MjQwMjAxMDAsIDB4M2MwMTAwMDEsIDB4MjMwODIxLCAweGFjMjI3ZTQ0LAotMHg4MDA1Mjg4LCAweDNjMDIwMDgwLCAweDEyMTE0MCwgMHgzYzAxMDAwMSwKLTB4MjIwODIxLCAweGFjMjA3ZTQ0LCAweDNjMDIwMDgwLCAweDIwMjEwMjQsCi0weDEwNDAwMDA2LCAweDEyMTk0MCwgMHgzYzAyMDAwMSwgMHgzYzAxMDAwMSwKLTB4MjMwODIxLCAweDgwMDUyOTQsIDB4YWMyMjdlNGMsIDB4MTIxMTQwLAotMHgzYzAxMDAwMSwgMHgyMjA4MjEsIDB4YWMyMDdlNGMsIDB4M2MwMzAwMDEsCi0weDhjNjM1Y2M4LCAweDI0MDIwMDAxLCAweDEwNjIwMDAzLCAweDAsCi0weGMwMDQyOWIsIDB4MCwgMHg4ZmJmMDAzMCwgMHg4ZmIzMDAyYywKLTB4OGZiMjAwMjgsIDB4OGZiMTAwMjQsIDB4OGZiMDAwMjAsIDB4M2UwMDAwOCwKLTB4MjdiZDAwMzgsIDB4MjdiZGZmZDgsIDB4YWZiMjAwMjAsIDB4ODA5MDIxLAotMHhhZmIxMDAxYywgMHg4ODIxLCAweDI0MDIwMDAyLCAweGFmYmYwMDI0LAotMHhhZmIwMDAxOCwgMHhhN2EwMDAxMiwgMHgxMGEyMDBkMywgMHhhN2EwMDAxMCwKLTB4MmNhMjAwMDMsIDB4MTA0MDAwMDUsIDB4MjQwMjAwMDEsIDB4MTBhMjAwMGEsCi0weDEyODE0MCwgMHg4MDA1MzgwLCAweDIyMDEwMjEsIDB4MjQwMjAwMDQsCi0weDEwYTIwMDdkLCAweDI0MDIwMDA4LCAweDEwYTIwMDdjLCAweDEyMjk0MCwKLTB4ODAwNTM4MCwgMHgyMjAxMDIxLCAweDNjMDMwMDAxLCAweDcwMTgyMSwKLTB4OGM2MzdlM2MsIDB4M2MwMjQwMDAsIDB4NjIxMDI0LCAweDE0NDAwMDA5LAotMHgyNDA0MDAwMSwgMHgzYzAyN2ZmZiwgMHgzNDQyZmZmZiwgMHg2Mjg4MjQsCi0weDNjMDEwMDAxLCAweDMwMDgyMSwgMHhhYzMxN2UzNCwgMHg4MDA1MzgwLAotMHgyMjAxMDIxLCAweDI0MDUwMDAxLCAweGMwMDQ5NGMsIDB4MjdhNjAwMTAsCi0weDI0MDQwMDAxLCAweDI0MDUwMDAxLCAweGMwMDQ5NGMsIDB4MjdhNjAwMTAsCi0weDk3YTIwMDEwLCAweDMwNDIwMDA0LCAweDEwNDAwMDM0LCAweDNjMTE0MDAwLAotMHgzYzAyMDAwMSwgMHg4YzQyNWRiYywgMHgyNDQzZmZmZiwgMHgyYzYyMDAwNiwKLTB4MTA0MDAwMzQsIDB4MzEwODAsIDB4M2MwMTAwMDEsIDB4MjIwODIxLAotMHg4YzIyNWJlMCwgMHg0MDAwMDgsIDB4MCwgMHgyNDA0MDAwMSwKLTB4MjQwNTAwMTEsIDB4MjdiMDAwMTIsIDB4YzAwNDk0YywgMHgyMDAzMDIxLAotMHgyNDA0MDAwMSwgMHgyNDA1MDAxMSwgMHhjMDA0OTRjLCAweDIwMDMwMjEsCi0weDk3YTUwMDEyLCAweDMwYTI0MDAwLCAweDEwNDAwMDAyLCAweDNjMDQwMDEwLAotMHgzYzA0MDAwOCwgMHgzYzAzMDAwMSwgMHg4MDA1MzAxLCAweDMwYTI4MDAwLAotMHgyNDA0MDAwMSwgMHgyNDA1MDAxNCwgMHgyN2IwMDAxMiwgMHhjMDA0OTRjLAotMHgyMDAzMDIxLCAweDI0MDQwMDAxLCAweDI0MDUwMDE0LCAweGMwMDQ5NGMsCi0weDIwMDMwMjEsIDB4OTdhNTAwMTIsIDB4MzBhMjEwMDAsIDB4MTA0MDAwMDIsCi0weDNjMDQwMDEwLCAweDNjMDQwMDA4LCAweDNjMDMwMDAxLCAweDMwYTIwODAwLAotMHg1NDQwMDAwMSwgMHgzYzAzMDAwMiwgMHgzYzAyODAwMCwgMHgyMjIxMDI1LAotMHg2NDE4MjUsIDB4ODAwNTMwZSwgMHg0Mzg4MjUsIDB4M2MxMTAwMDEsCi0weDIzMDg4MjEsIDB4OGUzMTdlM2MsIDB4M2MwMjdmZmYsIDB4MzQ0MmZmZmYsCi0weDIyMjg4MjQsIDB4M2MwMjAwMDEsIDB4OGM0MjVjZDgsIDB4MTA0MDAwMWQsCi0weDEyMTE0MCwgMHgzYzAyMDAwMSwgMHg4YzQyNWQ5OCwgMHgxMDQwMDAwMiwKLTB4M2MwMjIwMDAsIDB4MjIyODgyNSwgMHgxMjExNDAsIDB4M2MwMTAwMDEsCi0weDIyMDgyMSwgMHg4YzIyN2U0MCwgMHgxMDQwMDAwMywgMHgzYzAyMDAyMCwKLTB4ODAwNTMyMiwgMHgyMjI4ODI1LCAweDNjMDJmZmRmLCAweDM0NDJmZmZmLAotMHgyMjI4ODI0LCAweDEyMTE0MCwgMHgzYzAxMDAwMSwgMHgyMjA4MjEsCi0weDhjMjI3ZTQ4LCAweDEwNDAwMDAzLCAweDNjMDIwMDgwLCAweDgwMDUzMmQsCi0weDIyMjg4MjUsIDB4M2MwMmZmN2YsIDB4MzQ0MmZmZmYsIDB4MjIyODgyNCwKLTB4MTIxMTQwLCAweDNjMDEwMDAxLCAweDIyMDgyMSwgMHhhYzMxN2UzNCwKLTB4ODAwNTM4MCwgMHgyMjAxMDIxLCAweDEyMjk0MCwgMHgzYzAzMDAwMSwKLTB4NjUxODIxLCAweDhjNjM3ZTM4LCAweDNjMDI0MDAwLCAweDYyMTAyNCwKLTB4MTQ0MDAwMDgsIDB4M2MwMjdmZmYsIDB4MzQ0MmZmZmYsIDB4NjI4ODI0LAotMHgzYzAxMDAwMSwgMHgyNTA4MjEsIDB4YWMzMTdlMzAsIDB4ODAwNTM4MCwKLTB4MjIwMTAyMSwgMHgzYzAyMDAwMSwgMHg4YzQyNWNkOCwgMHgxMDQwMDAzMywKLTB4M2MxMWMwMGMsIDB4M2MwMjAwMDEsIDB4OGM0MjVkNzQsIDB4M2MwNGMwMGMsCi0weDM0ODQyMDAwLCAweDNjMDMwMDAxLCAweDhjNjM1ZDk4LCAweDIxMDJiLAotMHgyMTAyMywgMHg0NDEwMjQsIDB4MTA2MDAwMDMsIDB4NTE4ODI1LAotMHgzYzAyMjAwMCwgMHgyMjI4ODI1LCAweDNjMDIwMDAxLCAweDQ1MTAyMSwKLTB4OGM0MjdlNDQsIDB4MTA0MDAwMDMsIDB4M2MwMjAwMjAsIDB4ODAwNTM1ZCwKLTB4MjIyODgyNSwgMHgzYzAyZmZkZiwgMHgzNDQyZmZmZiwgMHgyMjI4ODI0LAotMHgxMjExNDAsIDB4M2MwMTAwMDEsIDB4MjIwODIxLCAweDhjMjI3ZTRjLAotMHgxMDQwMDAwMywgMHgzYzAyMDA4MCwgMHg4MDA1MzY4LCAweDIyMjg4MjUsCi0weDNjMDJmZjdmLCAweDM0NDJmZmZmLCAweDIyMjg4MjQsIDB4M2MwMjAwMDEsCi0weDhjNDI1ZDYwLCAweDEwNDAwMDAyLCAweDNjMDIwODAwLCAweDIyMjg4MjUsCi0weDNjMDIwMDAxLCAweDhjNDI1ZDY0LCAweDEwNDAwMDAyLCAweDNjMDIwNDAwLAotMHgyMjI4ODI1LCAweDNjMDIwMDAxLCAweDhjNDI1ZDY4LCAweDEwNDAwMDA2LAotMHgzYzAyMDEwMCwgMHg4MDA1MzdiLCAweDIyMjg4MjUsIDB4M2MwMjdmZmYsCi0weDM0NDJmZmZmLCAweDYyODgyNCwgMHgxMjExNDAsIDB4M2MwMTAwMDEsCi0weDIyMDgyMSwgMHhhYzMxN2UzMCwgMHgyMjAxMDIxLCAweDhmYmYwMDI0LAotMHg4ZmIyMDAyMCwgMHg4ZmIxMDAxYywgMHg4ZmIwMDAxOCwgMHgzZTAwMDA4LAotMHgyN2JkMDAyOCwgMHgyN2JkZmZkOCwgMHhhZmI0MDAyMCwgMHg4MGEwMjEsCi0weGFmYmYwMDI0LCAweGFmYjMwMDFjLCAweGFmYjIwMDE4LCAweGFmYjEwMDE0LAotMHhhZmIwMDAxMCwgMHg4ZjkwMDIwMCwgMHgzYzAzMDAwMSwgMHg4YzYzNWNjOCwKLTB4OGY5MzAyMjAsIDB4MjQwMjAwMDIsIDB4MTA2MjAwNjMsIDB4MmM2MjAwMDMsCi0weDEwNDAwMDA1LCAweDI0MDIwMDAxLCAweDEwNjIwMDBhLCAweDE0MTk0MCwKLTB4ODAwNTQ0OCwgMHgwLCAweDI0MDIwMDA0LCAweDEwNjIwMDVhLAotMHgyNDAyMDAwOCwgMHgxMDYyMDA1OSwgMHgxNDkxNDAsIDB4ODAwNTQ0OCwKLTB4MCwgMHgzYzA0MDAwMSwgMHg4MzIwMjEsIDB4OGM4NDdlM2MsCi0weDNjMTEwMDAxLCAweDIyMzg4MjEsIDB4OGUzMTdlMzQsIDB4M2MwMjQwMDAsCi0weDgyMTAyNCwgMHgxMDQwMDAzZSwgMHgzYzAyMDAwOCwgMHgyMjIxMDI0LAotMHgxMDQwMDAyMCwgMHgzNjEwMDAwMiwgMHgzYzAyMDAwMSwgMHg0MzEwMjEsCi0weDhjNDI3ZTQwLCAweDEwNDAwMDA1LCAweDM2MTAwMDIwLCAweDM2MTAwMTAwLAotMHgzYzAyMDAyMCwgMHg4MDA1M2JkLCAweDIyMjg4MjUsIDB4MjQwMmZlZmYsCi0weDIwMjgwMjQsIDB4M2MwMmZmZGYsIDB4MzQ0MmZmZmYsIDB4MjIyODgyNCwKLTB4MTQxMTQwLCAweDNjMDEwMDAxLCAweDIyMDgyMSwgMHg4YzIyN2U0OCwKLTB4MTA0MDAwMDUsIDB4M2MwMjAwMDEsIDB4MjYyOTgyNSwgMHgzYzAyMDA4MCwKLTB4ODAwNTNkYywgMHgyMjI4ODI1LCAweDNjMDJmZmZlLCAweDM0NDJmZmZmLAotMHgyNjI5ODI0LCAweDNjMDJmZjdmLCAweDM0NDJmZmZmLCAweDgwMDUzZGMsCi0weDIyMjg4MjQsIDB4MjQwMmZlZGYsIDB4MjAyODAyNCwgMHgzYzAyZmZmZSwKLTB4MzQ0MmZmZmYsIDB4MjYyOTgyNCwgMHgzYzAyZmY1ZiwgMHgzNDQyZmZmZiwKLTB4MjIyODgyNCwgMHgzYzAxMDAwMSwgMHgyMzA4MjEsIDB4YWMyMDdlNDAsCi0weDNjMDEwMDAxLCAweDIzMDgyMSwgMHhhYzIwN2U0OCwgMHhjMDA0ODZhLAotMHgwLCAweGFmOTAwMjAwLCAweGFmOTMwMjIwLCAweDhmODIwMjIwLAotMHgyNDAzZmZmYiwgMHg0MzEwMjQsIDB4YWY4MjAyMjAsIDB4OGY4MjAyMjAsCi0weDM0NDIwMDAyLCAweGFmODIwMjIwLCAweDgwMDUzZjMsIDB4MTQxMTQwLAotMHg4ZjgyMDIwMCwgMHgyNDAzZmZmZCwgMHg0MzEwMjQsIDB4YzAwNDg2YSwKLTB4YWY4MjAyMDAsIDB4M2MwMmJmZmYsIDB4MzQ0MmZmZmYsIDB4YzAwNDI5YiwKLTB4MjIyODgyNCwgMHgxNDExNDAsIDB4M2MwMTAwMDEsIDB4MjIwODIxLAotMHg4MDA1NDQ4LCAweGFjMzE3ZTM0LCAweDE0OTE0MCwgMHgzYzA0MDAwMSwKLTB4OTIyMDIxLCAweDhjODQ3ZTM4LCAweDNjMTEwMDAxLCAweDIzMjg4MjEsCi0weDhlMzE3ZTMwLCAweDNjMDI0MDAwLCAweDgyMTAyNCwgMHgxNDQwMDAxMSwKLTB4MCwgMHgzYzAyMDAwMSwgMHg4YzQyNWQ5OCwgMHgxNDQwMDAwNiwKLTB4M2MwMmJmZmYsIDB4OGY4MjAyMDAsIDB4MzQ0MjAwMDIsIDB4YzAwNDg2YSwKLTB4YWY4MjAyMDAsIDB4M2MwMmJmZmYsIDB4MzQ0MmZmZmYsIDB4YzAwNDI5YiwKLTB4MjIyODgyNCwgMHgzYzAxMDAwMSwgMHgzMjA4MjEsIDB4ODAwNTQ0OCwKLTB4YWMzMTdlMzAsIDB4M2MwMjAwMDEsIDB4OGM0MjVkOTgsIDB4MTA0MDAwMDUsCi0weDNjMDIwMDIwLCAweDNjMDIwMDAxLCAweDhjNDI1ZDc0LCAweDEwNDAwMDJiLAotMHgzYzAyMDAyMCwgMHg4MjEwMjQsIDB4MTA0MDAwMDcsIDB4MzYxMDAwMjAsCi0weDI0MDIwMTAwLCAweDNjMDEwMDAxLCAweDMyMDgyMSwgMHhhYzIyN2U0NCwKLTB4ODAwNTQyOCwgMHgzNjEwMDEwMCwgMHgzYzAxMDAwMSwgMHgzMjA4MjEsCi0weGFjMjA3ZTQ0LCAweDI0MDJmZWZmLCAweDIwMjgwMjQsIDB4M2MwMjAwODAsCi0weDgyMTAyNCwgMHgxMDQwMDAwNywgMHgxNDE5NDAsIDB4M2MwMjAwMDEsCi0weDNjMDEwMDAxLCAweDIzMDgyMSwgMHhhYzIyN2U0YywgMHg4MDA1NDM5LAotMHgyNjI5ODI1LCAweDE0MTE0MCwgMHgzYzAxMDAwMSwgMHgyMjA4MjEsCi0weGFjMjA3ZTRjLCAweDNjMDJmZmZlLCAweDM0NDJmZmZmLCAweDI2Mjk4MjQsCi0weGMwMDQ4NmEsIDB4MCwgMHhhZjkwMDIwMCwgMHhhZjkzMDIyMCwKLTB4OGY4MjAyMjAsIDB4MjQwM2ZmZmIsIDB4NDMxMDI0LCAweGFmODIwMjIwLAotMHg4ZjgyMDIyMCwgMHgzNDQyMDAwMiwgMHhhZjgyMDIyMCwgMHgxNDExNDAsCi0weDNjMDEwMDAxLCAweDIyMDgyMSwgMHhhYzMxN2UzMCwgMHg4ZmJmMDAyNCwKLTB4OGZiNDAwMjAsIDB4OGZiMzAwMWMsIDB4OGZiMjAwMTgsIDB4OGZiMTAwMTQsCi0weDhmYjAwMDEwLCAweDNlMDAwMDgsIDB4MjdiZDAwMjgsIDB4MCB9Owotc3RhdGljIHUzMiB0aWdvbkZ3Um9kYXRhWyhNQVhfUk9EQVRBX0xFTi80KSArIDFdIF9fZGV2aW5pdGRhdGEgPSB7Ci0weDI0NDg2NTYxLCAweDY0NjU3MjNhLCAweDIwMmY3MDcyLAotMHg2ZjZhNjU2MywgMHg3NDczMmY3MiwgMHg2MzczMmY3MywgMHg3NzJmNjc2NSwKLTB4MmYyZTJmNmUsIDB4Njk2MzJmNjYsIDB4NzcyZjYzNmYsIDB4NmQ2ZDZmNmUsCi0weDJmNjY3NzZkLCAweDYxNjk2ZTJlLCAweDYzMmM3NjIwLCAweDMxMmUzMTJlLAotMHgzMjJlMzEzMSwgMHgyMDMxMzkzOSwgMHgzODJmMzAzNCwgMHgyZjMyMzcyMCwKLTB4MzIzMjNhMzEsIDB4MzMzYTM0MzIsIDB4MjA3MzY4NzUsIDB4NjE2ZTY3MjAsCi0weDQ1Nzg3MDIwLCAweDI0MDAwMDAwLCAweDc0Njg2NTVmLCAweDQ0NDE1NzRlLAotMHgwLCAweDUzNTQ0MTQzLCAweDRiNWYzMTIwLCAweDAsCi0weDQyNjE2NDUzLCAweDZlNjQ1MjZlLCAweDY3MDAwMDAwLCAweDNmNDU2ZTcxLAotMHg0NTc2NzQwMCwgMHgzZjZlNmY1MSwgMHg2NDQ1NzY1MCwgMHgwLAotMHg2NTc2NTI2ZSwgMHg2NzQ2NzU2YywgMHg2YzAwMDAwMCwgMHg0OTZjNmM0MywKLTB4NmY2ZTY2NTIsIDB4NzgwMDAwMDAsIDB4NTM2NTZlNjQsIDB4NDM2YjUzNzUsCi0weDZkMDAwMDAwLCAweDUyNjU2Mzc2LCAweDU2NmM2MTZlLCAweDAsCi0weDAsIDB4MjQ0ODY1NjEsIDB4NjQ2NTcyM2EsIDB4MjAyZjcwNzIsCi0weDZmNmE2NTYzLCAweDc0NzMyZjcyLCAweDYzNzMyZjczLCAweDc3MmY2NzY1LAotMHgyZjJlMmY2ZSwgMHg2OTYzMmY2NiwgMHg3NzJmNjM2ZiwgMHg2ZDZkNmY2ZSwKLTB4MmY3NDY5NmQsIDB4NjU3MjJlNjMsIDB4MmM3NjIwMzEsIDB4MmUzMTJlMzIsCi0weDJlMzgyMDMxLCAweDM5MzkzODJmLCAweDMwMzcyZjMzLCAweDMxMjAzMTM3LAotMHgzYTM1MzgzYSwgMHgzNDM1MjA3MywgMHg2ODc1NjE2ZSwgMHg2NzIwNDU3OCwKLTB4NzAyMDI0MDAsIDB4NTQyZDQ0NmQsIDB4NjE1MjY0MzEsIDB4MCwKLTB4NTQyZDQ0NmQsIDB4NjE0MjQyMDAsIDB4NTQyZDQ0NmQsIDB4NjEzMjAwMDAsCi0weDNmNmU2ZjUxLCAweDY0NTQ3ODQ1LCAweDAsIDB4M2Y2ZTZmNTEsCi0weDY0NTI3ODQ1LCAweDAsIDB4NjU2ZTcxNGQsIDB4NDU3NjUwNDYsCi0weDYxNjk2YzAwLCAweDY1NmU3MTRkLCAweDQ1NzY0NjYxLCAweDY5NmMwMDAwLAotMHg2NjYxNjk2YywgMHg0NTZlNDU0ZCwgMHgwLCAweDNmNDU2ZTcxLAotMHg0NTc2NzQwMCwgMHgzZjZlNmY1MSwgMHg2NDQ1NzY1MCwgMHgwLAotMHg2NTc2NTI2ZSwgMHg2NzQ2NzU2YywgMHg2YzAwMDAwMCwgMHgwLAotMHgwLCAweDI0NDg2NTYxLCAweDY0NjU3MjNhLCAweDIwMmY3MDcyLAotMHg2ZjZhNjU2MywgMHg3NDczMmY3MiwgMHg2MzczMmY3MywgMHg3NzJmNjc2NSwKLTB4MmYyZTJmNmUsIDB4Njk2MzJmNjYsIDB4NzcyZjYzNmYsIDB4NmQ2ZDZmNmUsCi0weDJmNjM2ZjZkLCAweDZkNjE2ZTY0LCAweDJlNjMyYzc2LCAweDIwMzEyZTMxLAotMHgyZTMyMmUzMSwgMHgzMDIwMzEzOSwgMHgzOTM4MmYzMSwgMHgzMTJmMzEzOCwKLTB4MjAzMTM3M2EsIDB4MzEzMTNhMzEsIDB4MzgyMDczNjgsIDB4NzU2MTZlNjcsCi0weDIwNDU3ODcwLCAweDIwMjQwMDAwLCAweDNmNGQ2MjZmLCAweDc4NDU3Njc0LAotMHgwLCAweDRlNGY2MzZmLCAweDZkNjE2ZTY0LCAweDAsCi0weDY4NzM3NDY1LCAweDVmNDU1MjUyLCAweDAsIDB4NDEyZDQ1NzIsCi0weDcyNDI3NTYzLCAweDAsIDB4NDU1MjUyNGYsIDB4NTIyZDQxNjQsCi0weDY0MDAwMDAwLCAweDY1NmU3MTRkLCAweDQ1NzY1MDQ2LCAweDYxNjk2YzAwLAotMHg2NTZlNzE0ZCwgMHg0NTc2NDY2MSwgMHg2OTZjMDAwMCwgMHg2NjYxNjk2YywKLTB4NDU2ZTQ1NGQsIDB4MCwgMHg0NDJkNDU3MiwgMHg3MjRjNjE3MywKLTB4NzQwMDAwMDAsIDB4NDQyZDQ1NzIsIDB4NzIzMjAwMDAsIDB4NmQ0MzczNzQsCi0weDRkNjQ0NTUyLCAweDUyMDAwMDAwLCAweDcwNzI2ZjZkLCAweDRkNjQ0NTUyLAotMHg1MjAwMDAwMCwgMHg0NjY5NmM3NCwgMHg0ZDY0NDU1MiwgMHg1MjAwMDAwMCwKLTB4NjM2ZDY0NWYsIDB4NDU1MjUyMDAsIDB4M2Y0NTZlNzEsIDB4NDU3Njc0MDAsCi0weDNmNmU2ZjUxLCAweDY0NDU3NjUwLCAweDAsIDB4NjU3NjUyNmUsCi0weDY3NDY3NTZjLCAweDZjMDAwMDAwLCAweDAsIDB4NmVhMCwKLTB4N2ZiYywgMHg2ZTM4LCAweDg3MzQsIDB4ODJiMCwKLTB4ODc4MCwgMHg4NzgwLCAweDZmNTQsIDB4NzY5NCwKLTB4N2YwYywgMHg4MGE4LCAweDgwNzQsIDB4ODc4MCwKLTB4N2U3MCwgMHg4MGNjLCAweDZlNjQsIDB4ODFjYywKLTB4MCwgMHgyNDQ4NjU2MSwgMHg2NDY1NzIzYSwgMHgyMDJmNzA3MiwKLTB4NmY2YTY1NjMsIDB4NzQ3MzJmNzIsIDB4NjM3MzJmNzMsIDB4NzcyZjY3NjUsCi0weDJmMmUyZjZlLCAweDY5NjMyZjY2LCAweDc3MmY2MzZmLCAweDZkNmQ2ZjZlLAotMHgyZjY0NmQ2MSwgMHgyZTYzMmM3NiwgMHgyMDMxMmUzMSwgMHgyZTMyMmUzMywKLTB4MjAzMTM5MzksIDB4MzgyZjMwMzQsIDB4MmYzMjM3MjAsIDB4MzIzMjNhMzEsCi0weDMzM2EzNDMxLCAweDIwNzM2ODc1LCAweDYxNmU2NzIwLCAweDQ1Nzg3MDIwLAotMHgyNDAwMDAwMCwgMHg2NDZkNjE3MiwgMHg2NDQxNTQ0ZSwgMHgwLAotMHg2NDZkNjE3NywgMHg3MjQxNTQ0ZSwgMHgwLCAweDAsCi0weDAsIDB4MjQ0ODY1NjEsIDB4NjQ2NTcyM2EsIDB4MjAyZjcwNzIsCi0weDZmNmE2NTYzLCAweDc0NzMyZjcyLCAweDYzNzMyZjczLCAweDc3MmY2NzY1LAotMHgyZjJlMmY2ZSwgMHg2OTYzMmY2NiwgMHg3NzJmNjM2ZiwgMHg2ZDZkNmY2ZSwKLTB4MmY3NDcyNjEsIDB4NjM2NTJlNjMsIDB4MmM3NjIwMzEsIDB4MmUzMTJlMzIsCi0weDJlMzIyMDMxLCAweDM5MzkzODJmLCAweDMwMzQyZjMyLCAweDM3MjAzMjMyLAotMHgzYTMxMzMzYSwgMHgzNTMwMjA3MywgMHg2ODc1NjE2ZSwgMHg2NzIwNDU3OCwKLTB4NzAyMDI0MDAsIDB4MjQ0ODY1NjEsIDB4NjQ2NTcyM2EsIDB4MjAyZjcwNzIsCi0weDZmNmE2NTYzLCAweDc0NzMyZjcyLCAweDYzNzMyZjczLCAweDc3MmY2NzY1LAotMHgyZjJlMmY2ZSwgMHg2OTYzMmY2NiwgMHg3NzJmNjM2ZiwgMHg2ZDZkNmY2ZSwKLTB4MmY2NDYxNzQsIDB4NjEyZTYzMmMsIDB4NzYyMDMxMmUsIDB4MzEyZTMyMmUsCi0weDMyMjAzMTM5LCAweDM5MzgyZjMwLCAweDM0MmYzMjM3LCAweDIwMzIzMjNhLAotMHgzMTMzM2EzNCwgMHgzMDIwNzM2OCwgMHg3NTYxNmU2NywgMHgyMDQ1Nzg3MCwKLTB4MjAyNDAwMDAsIDB4NDY1NzVmNTYsIDB4NDU1MjUzNDksIDB4NGY0ZTNhMjAsCi0weDIzMzEyMDQ2LCAweDcyNjkyMDQxLCAweDcwNzIyMDM3LCAweDIwMzEzNzNhLAotMHgzNTM1M2EzNCwgMHgzODIwNTA0NCwgMHg1NDIwMzIzMCwgMHgzMDMwMDAwMCwKLTB4NDY1NzVmNDMsIDB4NGY0ZDUwNDksIDB4NGM0NTVmNTQsIDB4NDk0ZDQ1M2EsCi0weDIwMzEzNzNhLCAweDM1MzUzYTM0LCAweDM4MDAwMDAwLCAweDQ2NTc1ZjQzLAotMHg0ZjRkNTA0OSwgMHg0YzQ1NWY0MiwgMHg1OTNhMjA2NCwgMHg2NTc2NzI2MywKLTB4NzMwMDAwMDAsIDB4NDY1NzVmNDMsIDB4NGY0ZDUwNDksIDB4NGM0NTVmNDgsCi0weDRmNTM1NDNhLCAweDIwNjM2ZjZkLCAweDcwNzU3NDY1LCAweDAsCi0weDQ2NTc1ZjQzLCAweDRmNGQ1MDQ5LCAweDRjNDU1ZjQ0LCAweDRmNGQ0MTQ5LAotMHg0ZTNhMjA2NSwgMHg2ZTY3MmU2MSwgMHg2Mzc0NjU2ZiwgMHg2ZTJlNjM2ZiwKLTB4NmQwMDAwMDAsIDB4NDY1NzVmNDMsIDB4NGY0ZDUwNDksIDB4NGM0NTUyM2EsCi0weDIwNjc2MzYzLCAweDIwNzY2NTcyLCAweDczNjk2ZjZlLCAweDIwMzIyZTM3LAotMHgyZTMyMDAwMCwgMHgwLCAweDAsIDB4MCwKLTB4MCwgMHgyNDQ4NjU2MSwgMHg2NDY1NzIzYSwgMHgyMDJmNzA3MiwKLTB4NmY2YTY1NjMsIDB4NzQ3MzJmNzIsIDB4NjM3MzJmNzMsIDB4NzcyZjY3NjUsCi0weDJmMmUyZjZlLCAweDY5NjMyZjY2LCAweDc3MmY2MzZmLCAweDZkNmQ2ZjZlLAotMHgyZjZkNjU2ZCwgMHgyZTYzMmM3NiwgMHgyMDMxMmUzMSwgMHgyZTMyMmUzMiwKLTB4MjAzMTM5MzksIDB4MzgyZjMwMzQsIDB4MmYzMjM3MjAsIDB4MzIzMjNhMzEsCi0weDMzM2EzNDM0LCAweDIwNzM2ODc1LCAweDYxNmU2NzIwLCAweDQ1Nzg3MDIwLAotMHgyNDAwMDAwMCwgMHgyNDQ4NjU2MSwgMHg2NDY1NzIzYSwgMHgyMDJmNzA3MiwKLTB4NmY2YTY1NjMsIDB4NzQ3MzJmNzIsIDB4NjM3MzJmNzMsIDB4NzcyZjY3NjUsCi0weDJmMmUyZjZlLCAweDY5NjMyZjY2LCAweDc3MmY2MzZmLCAweDZkNmQ2ZjZlLAotMHgyZjczNjU2ZSwgMHg2NDJlNjMyYywgMHg3NjIwMzEyZSwgMHgzMTJlMzIyZSwKLTB4MzEzMTIwMzEsIDB4MzkzOTM4MmYsIDB4MzEzMjJmMzIsIDB4MzIyMDMxMzcsCi0weDNhMzEzNzNhLCAweDM1MzUyMDczLCAweDY4NzU2MTZlLCAweDY3MjA0NTc4LAotMHg3MDIwMjQwMCwgMHg3MzZlNjQ2NCwgMHg2NTRlNmY1MSwgMHgyMDAwMDAwMCwKLTB4NmU2ZjQ1NGUsIDB4NTE1ZjU0NTgsIDB4MCwgMHg3MzZlNjQ2NCwKLTB4NzQ0ZTZmNTEsIDB4MjAwMDAwMDAsIDB4M2Y2ZTZmNTEsIDB4NjQ1NDc4NDUsCi0weDAsIDB4NzU2ZTZiNzIsIDB4NjQ3NDc5NzAsIDB4NjUwMDAwMDAsCi0weDAsIDB4YWNjYywgMHhhY2NjLCAweGFkOWMsCi0weGFhYjAsIDB4YWFiMCwgMHhhZDljLCAweGFkOWMsCi0weGFkOWMsIDB4YWQ5YywgMHhhZDljLCAweGFkOWMsCi0weGFkOWMsIDB4YWQ5YywgMHhhZDljLCAweGFkOWMsCi0weGFkOWMsIDB4YWQ5YywgMHhhZDljLCAweGFkN2MsCi0weDAsIDB4YmNhOCwgMHhiY2E4LCAweGJkNzAsCi0weGFlNGMsIDB4YjA1OCwgMHhiZDcwLCAweGJkNzAsCi0weGJkNzAsIDB4YmQ3MCwgMHhiZDcwLCAweGJkNzAsCi0weGJkNzAsIDB4YmQ3MCwgMHhiZDcwLCAweGJkNzAsCi0weGJkNzAsIDB4YmQ3MCwgMHhiZDcwLCAweGJkNTQsCi0weGIwNDAsIDB4MjQ0ODY1NjEsIDB4NjQ2NTcyM2EsIDB4MjAyZjcwNzIsCi0weDZmNmE2NTYzLCAweDc0NzMyZjcyLCAweDYzNzMyZjczLCAweDc3MmY2NzY1LAotMHgyZjJlMmY2ZSwgMHg2OTYzMmY2NiwgMHg3NzJmNjM2ZiwgMHg2ZDZkNmY2ZSwKLTB4MmY3MjY1NjMsIDB4NzYyZTYzMmMsIDB4NzYyMDMxMmUsIDB4MzEyZTMyMmUsCi0weDMxMzkyMDMxLCAweDM5MzkzODJmLCAweDMwMzcyZjMyLCAweDM0MjAzMjMxLAotMHgzYTMzMzAzYSwgMHgzMDM1MjA3MywgMHg2ODc1NjE2ZSwgMHg2NzIwNDU3OCwKLTB4NzAyMDI0MDAsIDB4NzA2YjUyNzgsIDB4NDU1MjUyMDAsIDB4NjY3MjZkMzIsCi0weDRjNjE3MjY3LCAweDY1MDAwMDAwLCAweDcyNzg0ZTZmLCAweDUyNzg0MjY0LAotMHgwLCAweDcyNzg1MTQ0LCAweDZkNjE0NDQ2LCAweDAsCi0weDcyNzg1MTQ0LCAweDZkNjE0MjQ2LCAweDAsIDB4M2Y2ZTZmNTEsCi0weDY0NTI3ODQ1LCAweDAsIDB4NzA2YjUyNzgsIDB4NDU1MjUyNzMsCi0weDAsIDB4NjY3MjZkMzIsIDB4NGM3MjY3NTMsIDB4MCwKLTB4NzI3ODRlNmYsIDB4NDI2NDUzMDAsIDB4M2Y3MjQyNjQsIDB4NDQ2ZDYxNDYsCi0weDAsIDB4M2Y3MjRhNDIsIDB4NjQ0NDZkNDYsIDB4MCwKLTB4MCwgMHhmNjc4LCAweGY2NzgsIDB4ZjY3OCwKLTB4ZjY3OCwgMHhmNjc4LCAweGY2NzgsIDB4ZjY3OCwKLTB4ZjY3OCwgMHhmNjc4LCAweGY2NzgsIDB4ZjY3OCwKLTB4ZjY3OCwgMHhmNjc4LCAweGY2NzgsIDB4ZjY3OCwKLTB4ZjY3MCwgMHhmNjcwLCAweGY2NzAsIDB4NTcyZDQ0NGQsCi0weDQxNDU2ZTQ2LCAweDAsIDB4MCwgMHhmZGMwLAotMHgxMDE1YywgMHhmZGRjLCAweDEwMTVjLCAweDEwMTVjLAotMHgxMDE1YywgMHgxMDE1YywgMHgxMDE1YywgMHgxMDE1YywKLTB4ZjcwNCwgMHgxMDE1YywgMHgxMDE1YywgMHgxMDE1YywKLTB4MTAxNWMsIDB4MTAxNWMsIDB4MTAxNTQsIDB4MTAxNTQsCi0weDEwMTU0LCAweDI0NDg2NTYxLCAweDY0NjU3MjNhLCAweDIwMmY3MDcyLAotMHg2ZjZhNjU2MywgMHg3NDczMmY3MiwgMHg2MzczMmY3MywgMHg3NzJmNjc2NSwKLTB4MmYyZTJmNmUsIDB4Njk2MzJmNjYsIDB4NzcyZjYzNmYsIDB4NmQ2ZDZmNmUsCi0weDJmNmQ2MTYzLCAweDJlNjMyYzc2LCAweDIwMzEyZTMxLCAweDJlMzIyZTMxLAotMHgzMjIwMzEzOSwgMHgzOTM4MmYzMCwgMHgzNDJmMzIzNywgMHgyMDMyMzIzYSwKLTB4MzEzMzNhMzQsIDB4MzIyMDczNjgsIDB4NzU2MTZlNjcsIDB4MjA0NTc4NzAsCi0weDIwMjQwMDAwLCAweDZkNjE2Mzc0LCAweDc4NDE1NDRlLCAweDAsCi0weDRlNzQ1Mzc5LCAweDZlMjY0YzZiLCAweDAsIDB4NzI2NTZkNjEsCi0weDczNzM3Mjc0LCAweDAsIDB4NmM2OTZlNmIsIDB4NDQ0ZjU3NGUsCi0weDAsIDB4NjU2ZTcxNGQsIDB4NDU3NjUwNDYsIDB4NjE2OTZjMDAsCi0weDY1NmU3MTRkLCAweDQ1NzY0NjYxLCAweDY5NmMwMDAwLCAweDY2NjE2OTZjLAotMHg0NTZlNDU0ZCwgMHgwLCAweDZjNjk2ZTZiLCAweDU1NTAwMDAwLAotMHgwLCAweDI0NDg2NTYxLCAweDY0NjU3MjNhLCAweDIwMmY3MDcyLAotMHg2ZjZhNjU2MywgMHg3NDczMmY3MiwgMHg2MzczMmY3MywgMHg3NzJmNjc2NSwKLTB4MmYyZTJmNmUsIDB4Njk2MzJmNjYsIDB4NzcyZjYzNmYsIDB4NmQ2ZDZmNmUsCi0weDJmNjM2YjczLCAweDc1NmQyZTYzLCAweDJjNzYyMDMxLCAweDJlMzEyZTMyLAotMHgyZTMyMjAzMSwgMHgzOTM5MzgyZiwgMHgzMDM0MmYzMiwgMHgzNzIwMzIzMiwKLTB4M2EzMTMzM2EsIDB4MzMzOTIwNzMsIDB4Njg3NTYxNmUsIDB4NjcyMDQ1NzgsCi0weDcwMjAyNDAwLCAweDUwNzI2ZjYyLCAweDY1NTA2ODc5LCAweDAsCi0weDZjNmU2YjQxLCAweDUzNTM1MjU0LCAweDAsIDB4MTFiMmMsCi0weDExYmM0LCAweDExYmY4LCAweDExYzJjLCAweDExYzU4LAotMHgxMWM2YywgMHgxMWNhOCwgMHgxMjA3YywgMHgxMWRlNCwKLTB4MTFlMjQsIDB4MTFlNTAsIDB4MTFlOTAsIDB4MTFlYzAsCi0weDExZWZjLCAweDExZjMwLCAweDEyMDdjLCAweDEyMmMwLAotMHgxMjJkOCwgMHgxMjMwMCwgMHgxMjMyMCwgMHgxMjM0OCwKLTB4MTI0NzgsIDB4MTI0YTAsIDB4MTI0ZjQsIDB4MTI1MWMsCi0weDAsIDB4MTI3OGMsIDB4MTI4NWMsIDB4MTI5MzQsCi0weDEyYTA0LCAweDEyYTYwLCAweDEyYjNjLCAweDEyYjY0LAotMHgxMmM0MCwgMHgxMmM2OCwgMHgxMmUxMCwgMHgxMmUzOCwKLTB4MTJmZTAsIDB4MTMxZDgsIDB4MTM0NmMsIDB4MTMzODAsCi0weDEzNDZjLCAweDEzNDk4LCAweDEzMDA4LCAweDEzMWIwLAotMHgwLCAweDEzYjg0LCAweDEzYmM4LCAweDEzYzYwLAotMHgxM2NhYywgMHgxM2QxYywgMHgxM2RiNCwgMHgxM2RlOCwKLTB4MTNlNzAsIDB4MTNmMDgsIDB4MTNmZDgsIDB4MTQwMTgsCi0weDE0MDljLCAweDE0MGMwLCAweDE0MWY0LCAweDY0NmY0MjYxLAotMHg3MzY1NTA2NywgMHgwLCAweDAsIDB4MCwKLTB4MCwgMHg3Mzc0NmQ2MSwgMHg2MzRjNGU0YiwgMHgwLAotMHgwLCAweDE0YzM4LCAweDE0YzM4LCAweDE0YjgwLAotMHgxNGJjNCwgMHgxNGMzOCwgMHgxNGMzOCwgMHgwLAotMHgwLCAweDAgfTsKLXN0YXRpYyB1MzIgdGlnb25Gd0RhdGFbKE1BWF9EQVRBX0xFTi80KSArIDFdIF9fZGV2aW5pdGRhdGEgPSB7Ci0weDQxNmM3NDY1LAotMHg2ZjZlMjA0MSwgMHg2MzY1NGU0OSwgMHg0MzIwNTYwMCwgMHg0MTZjNzQ2NSwKLTB4NmY2ZTIwNDEsIDB4NjM2NTRlNDksIDB4NDMyMDU2MDAsIDB4NDI0MjQyNDIsCi0weDAsIDB4MCwgMHgwLCAweDEzNTQxOCwKLTB4MTNlN2ZjLCAweDAsIDB4MCwgMHgwLAotMHgwLCAweDAsIDB4MCwgMHg2MGNmMDAsCi0weDYwLCAweGNmMDAwMDAwLCAweDAsIDB4MCwKLTB4MCwgMHgwLCAweDAsIDB4MCwKLTB4MCwgMHgwLCAweDAsIDB4MCwKLTB4MCwgMHgwLCAweDAsIDB4MCwKLTB4MCwgMHgwLCAweDAsIDB4MCwKLTB4MCwgMHgwLCAweDMsIDB4MCwKLTB4MSwgMHgwLCAweDAsIDB4MCwKLTB4MSwgMHgwLCAweDEsIDB4MCwKLTB4MCwgMHgwLCAweDAsIDB4MSwKLTB4MSwgMHgwLCAweDAsIDB4MCwKLTB4MCwgMHgwLCAweDEwMDAwMDAsIDB4MjEwMDAwMDAsCi0weDEyMDAwMTQwLCAweDAsIDB4MCwgMHgyMDAwMDAwMCwKLTB4MTIwMDAwYTAsIDB4MCwgMHgxMjAwMDA2MCwgMHgxMjAwMDE4MCwKLTB4MTIwMDAxZTAsIDB4MCwgMHgwLCAweDAsCi0weDEsIDB4MCwgMHgwLCAweDAsCi0weDAsIDB4MCwgMHgwLCAweDIsCi0weDAsIDB4MCwgMHgzMDAwMSwgMHgxLAotMHgzMDIwMSwgMHgwLCAweDAsIDB4MCB9OwotI2VuZGlmCi0vKiBHZW5lcmF0ZWQgYnkgZ2VuZncuYyAqLwotI2RlZmluZSB0aWdvbjJGd1JlbGVhc2VNYWpvciAweGMKLSNkZWZpbmUgdGlnb24yRndSZWxlYXNlTWlub3IgMHg0Ci0jZGVmaW5lIHRpZ29uMkZ3UmVsZWFzZUZpeCAweGIKLSNkZWZpbmUgdGlnb24yRndTdGFydEFkZHIgMHgwMDAwNDAwMAotI2RlZmluZSB0aWdvbjJGd1RleHRBZGRyIDB4MDAwMDQwMDAKLSNkZWZpbmUgdGlnb24yRndUZXh0TGVuIDB4MTFiYzAKLSNkZWZpbmUgdGlnb24yRndSb2RhdGFBZGRyIDB4MDAwMTViYzAKLSNkZWZpbmUgdGlnb24yRndSb2RhdGFMZW4gMHgxMGQwCi0jZGVmaW5lIHRpZ29uMkZ3RGF0YUFkZHIgMHgwMDAxNmNjMAotI2RlZmluZSB0aWdvbjJGd0RhdGFMZW4gMHgxYzAKLSNkZWZpbmUgdGlnb24yRndTYnNzQWRkciAweDAwMDE2ZTgwCi0jZGVmaW5lIHRpZ29uMkZ3U2Jzc0xlbiAweGNjCi0jZGVmaW5lIHRpZ29uMkZ3QnNzQWRkciAweDAwMDE2ZjUwCi0jZGVmaW5lIHRpZ29uMkZ3QnNzTGVuIDB4MjBjMAotc3RhdGljIHUzMiB0aWdvbjJGd1RleHRbKE1BWF9URVhUX0xFTi80KSArIDFdIF9fZGV2aW5pdGRhdGEgPSB7Ci0weDAsCi0weDEwMDAwMDAzLCAweDAsIDB4ZCwgMHhkLAotMHgzYzFkMDAwMSwgMHg4ZmJkNmQyMCwgMHgzYTBmMDIxLCAweDNjMTAwMDAwLAotMHgyNjEwNDAwMCwgMHhjMDAxMGMwLCAweDAsIDB4ZCwKLTB4M2MxZDAwMDEsIDB4OGZiZDZkMjQsIDB4M2EwZjAyMSwgMHgzYzEwMDAwMCwKLTB4MjYxMDQwMDAsIDB4YzAwMTdlMCwgMHgwLCAweGQsCi0weDAsIDB4MCwgMHgwLCAweDAsCi0weDAsIDB4MCwgMHgwLCAweDAsCi0weDAsIDB4MCwgMHgwLCAweDAsCi0weDAsIDB4MCwgMHgwLCAweDAsCi0weDAsIDB4MCwgMHgwLCAweDAsCi0weDAsIDB4MCwgMHgwLCAweDAsCi0weDAsIDB4MCwgMHgwLCAweDAsCi0weDAsIDB4MCwgMHgwLCAweDAsCi0weDAsIDB4MCwgMHgwLCAweDAsCi0weDAsIDB4MCwgMHgwLCAweDAsCi0weDAsIDB4MCwgMHgwLCAweDIwMDAwMDgsCi0weDAsIDB4ODAwMTcyZiwgMHgzYzBhMDAwMSwgMHg4MDAxNzJmLAotMHgzYzBhMDAwMiwgMHg4MDAxNzJmLCAweDAsIDB4ODAwMmNhYywKLTB4MCwgMHg4MDAyYzRmLCAweDAsIDB4ODAwMTcyZiwKLTB4M2MwYTAwMDQsIDB4ODAwMzI4YSwgMHgwLCAweDgwMDFhNTIsCi0weDAsIDB4ODAwMzk0ZCwgMHgwLCAweDgwMDM4ZjQsCi0weDAsIDB4ODAwMTcyZiwgMHgzYzBhMDAwNiwgMHg4MDAzOWJiLAotMHgzYzBhMDAwNywgMHg4MDAxNzJmLCAweDNjMGEwMDA4LCAweDgwMDE3MmYsCi0weDNjMGEwMDA5LCAweDgwMDNhMTMsIDB4MCwgMHg4MDAyZWE2LAotMHgwLCAweDgwMDE3MmYsIDB4M2MwYTAwMGIsIDB4ODAwMTcyZiwKLTB4M2MwYTAwMGMsIDB4ODAwMTcyZiwgMHgzYzBhMDAwZCwgMHg4MDAyOGZiLAotMHgwLCAweDgwMDI4OTAsIDB4MCwgMHg4MDAxNzJmLAotMHgzYzBhMDAwZSwgMHg4MDAyMDhjLCAweDAsIDB4ODAwMTk2NCwKLTB4MCwgMHg4MDAxYTA0LCAweDAsIDB4ODAwM2NhNiwKLTB4MCwgMHg4MDAzYzk0LCAweDAsIDB4ODAwMTcyZiwKLTB4MCwgMHg4MDAxOTFhLCAweDAsIDB4ODAwMTcyZiwKLTB4MCwgMHg4MDAxNzJmLCAweDNjMGEwMDEzLCAweDgwMDE3MmYsCi0weDNjMGEwMDE0LCAweDAsIDB4MCwgMHgwLAotMHgwLCAweDAsIDB4MCwgMHgwLAotMHgwLCAweDAsIDB4MCwgMHgwLAotMHgwLCAweDAsIDB4MCwgMHgwLAotMHgwLCAweDAsIDB4MCwgMHgwLAotMHgwLCAweDAsIDB4MCwgMHgwLAotMHgwLCAweDAsIDB4MCwgMHgwLAotMHgwLCAweDAsIDB4MCwgMHgwLAotMHgwLCAweDAsIDB4MCwgMHgwLAotMHgwLCAweDAsIDB4MCwgMHgwLAotMHgwLCAweDAsIDB4MCwgMHgwLAotMHgwLCAweDAsIDB4MCwgMHgwLAotMHgwLCAweDAsIDB4MCwgMHgwLAotMHgwLCAweDAsIDB4MCwgMHgwLAotMHgwLCAweDAsIDB4MCwgMHgwLAotMHgwLCAweDAsIDB4MCwgMHgyN2JkZmZlMCwKLTB4M2MxY2MwMDAsIDB4YWZiZjAwMWMsIDB4YWZiMDAwMTgsIDB4OGY4MjAxNDAsCi0weDI0MDMwMDAzLCAweGFmODMwMGVjLCAweDM0NDIwMDA0LCAweGMwMDJiMjAsCi0weGFmODIwMTQwLCAweDNjMDEwMGMwLCAweGMwMDE3NjMsIDB4YWMyMDNmZmMsCi0weDQwMTgyMSwgMHgzYzAyMDAxMCwgMHgzYzAxMDAwMSwgMHhhYzIzNmU5YywKLTB4MTA2MjAwMTEsIDB4NDMxMDJiLCAweDE0NDAwMDAyLCAweDNjMDIwMDIwLAotMHgzYzAyMDAwOCwgMHgxMDYyMDAwYywgMHgyNDA1MDEwMCwgMHgzYzA2MDAwMSwKLTB4OGNjNjZlOWMsIDB4M2MwNDAwMDEsIDB4MjQ4NDVjNzQsIDB4MzgyMSwKLTB4YWZhMDAwMTAsIDB4YzAwMmIzYiwgMHhhZmEwMDAxNCwgMHgzYzAyMDAyMCwKLTB4M2MwMTAwMDEsIDB4YWMyMjZlOWMsIDB4MjQwMjAwMDgsIDB4M2MwMTAwMDEsCi0weGFjMjI2ZWI0LCAweDI0MDIwMDFmLCAweDNjMDEwMDAxLCAweGFjMjI2ZWM0LAotMHgyNDAyMDAxNiwgMHgzYzAxMDAwMSwgMHhhYzIyNmU5OCwgMHgzYzA1ZmZmZSwKLTB4MzRhNTZmMDgsIDB4M2MwMjAwMDEsIDB4OGM0MjZlOWMsIDB4M2MwMzAwMDIsCi0weDI0NjM5MDEwLCAweDNjMDQwMDAxLCAweDhjODQ2Y2M0LCAweDQzMTAyMywKLTB4MTQ4MDAwMDIsIDB4NDU4MDIxLCAweDI2MTBmYTM4LCAweDI0MDJmMDAwLAotMHgyMDI4MDI0LCAweGMwMDE3ODUsIDB4MjAwMjAyMSwgMHgyMDIyODIzLAotMHgzYzA0MDAyMCwgMHg4MjE4MjMsIDB4NjUxODIzLCAweDI0N2JiMDAwLAotMHgzYzAzZmZmZSwgMHgzNDYzYmYwOCwgMHgzNjNiODIxLCAweDNjMDYwMGJmLAotMHgzNGM2ZjAwMCwgMHgzYzA3MDAwMSwgMHg4Y2U3NmNjMCwgMHgzYzAzMDBiZiwKLTB4MzQ2M2UwMDAsIDB4ODUyMDIzLCAweDNjMDEwMDAxLCAweGFjMjQ2ZWE4LAotMHg4MjIwMjMsIDB4M2MwMTAwMDEsIDB4YWMyNTZlOTAsIDB4NTI4NDIsCi0weDNjMDEwMDAxLCAweGFjMjI2ZTg0LCAweDI3NjIwZmZjLCAweDNjMDEwMDAxLAotMHhhYzIyNmQyMCwgMHgyNzYyMWZmYywgMHhkYjMwMjMsIDB4N2IxODIzLAotMHgzYzAxMDAwMSwgMHhhYzI0NmU4OCwgMHgzYzAxMDAwMSwgMHhhYzI1NmVhYywKLTB4M2MwMTAwMDEsIDB4YWMyMjZkMjQsIDB4YWY4NjAxNTAsIDB4MTBlMDAwMTEsCi0weGFmODMwMjUwLCAweDNjMWQwMDAxLCAweDhmYmQ2Y2NjLCAweDNhMGYwMjEsCi0weGMwMDE3NDksIDB4MCwgMHgzYzAyMDAwMSwgMHg4YzQyNmNkMCwKLTB4M2MwMzAwMDEsIDB4OGM2MzZjZDQsIDB4MjQ0MmZlMDAsIDB4MjQ2MzAyMDAsCi0weDNjMDEwMDAxLCAweGFjMjI2Y2QwLCAweDNjMDEwMDAxLCAweDEwMDAwMDA0LAotMHhhYzIzNmNkNCwgMHgzYzFkMDAwMSwgMHg4ZmJkNmQyMCwgMHgzYTBmMDIxLAotMHgzYzAyMDAwMSwgMHg4YzQyNmNjNCwgMHgxMDQwMDAwZCwgMHgyNmZhZmEzOCwKLTB4M2MwMjAwMDEsIDB4OGM0MjZjZDAsIDB4M2MwMzAwMDEsIDB4OGM2MzZjZDQsCi0weDNjMWEwMDAxLCAweDhmNWE2Y2Q0LCAweDI0NDJmYTM4LCAweDI0NjMwNWM4LAotMHgzYzAxMDAwMSwgMHhhYzIyNmNkMCwgMHgzYzAxMDAwMSwgMHhhYzIzNmNkNCwKLTB4M2MwMjAwMDEsIDB4OGM0MjZjYzgsIDB4MTQ0MDAwMDMsIDB4MCwKLTB4M2MwMTAwMDEsIDB4YWMyMDZjZDAsIDB4YzAwMTE1MSwgMHgwLAotMHg4ZmJmMDAxYywgMHg4ZmIwMDAxOCwgMHgzZTAwMDA4LCAweDI3YmQwMDIwLAotMHgzYzAyMDAwMSwgMHg4YzQyNmNkMCwgMHgzYzAzMDAwMSwgMHg4YzYzNmNkNCwKLTB4MjdiZGZmOTgsIDB4YWZiMDAwNDgsIDB4M2MxMDAwMDEsIDB4OGUxMDY2YjgsCi0weGFmYjIwMDUwLCAweDNjMTIwMDAwLCAweDI2NTI0MTAwLCAweGFmYmYwMDYwLAotMHhhZmJlMDA1YywgMHhhZmI1MDA1OCwgMHhhZmIzMDA1NCwgMHhhZmIxMDA0YywKLTB4YWZhMjAwMzQsIDB4YWZhMzAwMzAsIDB4YWZhMDAwMTAsIDB4YWZhMDAwMTQsCi0weDhmODYwMDQwLCAweDNjMDQwMDAxLCAweDI0ODQ1YzgwLCAweDI0MDUwMjAwLAotMHgzYzAxMDAwMSwgMHhhYzMyNmU4MCwgMHhjMDAyYjNiLCAweDIwMDM4MjEsCi0weDhmODMwMDQwLCAweDNjMDJmMDAwLCAweDYyMTgyNCwgMHgzYzAyNjAwMCwKLTB4MTA2MjAwMGIsIDB4YTNhMDAwM2YsIDB4MjQwZTAwMDEsIDB4M2MwNDAwMDEsCi0weDI0ODQ1Yzg4LCAweGEzYWUwMDNmLCAweGFmYTAwMDEwLCAweGFmYTAwMDE0LAotMHg4Zjg2MDA0MCwgMHgyNDA1MDMwMCwgMHhjMDAyYjNiLCAweDIwMDM4MjEsCi0weDhmODIwMjQwLCAweDNjMDMwMDAxLCAweDQzMTAyNSwgMHhhZjgyMDI0MCwKLTB4YWY4MDAwNDgsIDB4OGY4MjAwNDgsIDB4MTQ0MDAwMDUsIDB4MCwKLTB4YWY4MDAwNDgsIDB4OGY4MjAwNDgsIDB4MTA0MDAwMDQsIDB4MCwKLTB4YWY4MDAwNDgsIDB4MTAwMDAwMDMsIDB4MmUwMjAyMSwgMHhhZjgwMDA0YywKLTB4MmUwMjAyMSwgMHgzYzA1MDAwMSwgMHhjMDAyYmE4LCAweDM0YTU0MGY4LAotMHgzNDAyMDIxLCAweGMwMDJiYTgsIDB4MjQwNTA1YzgsIDB4M2MwMjAwMDEsCi0weDhjNDI2ZWE4LCAweDNjMGQwMDAxLCAweDhkYWQ2ZTg4LCAweDNjMDMwMDAxLAotMHg4YzYzNmU4NCwgMHgzYzA4MDAwMSwgMHg4ZDA4NmU5MCwgMHgzYzA5MDAwMSwKLTB4OGQyOTZlYWMsIDB4M2MwYTAwMDEsIDB4OGQ0YTZlYjQsIDB4M2MwYjAwMDEsCi0weDhkNmI2ZWM0LCAweDNjMGMwMDAxLCAweDhkOGM2ZTk4LCAweDNjMDQwMDAxLAotMHgyNDg0NWM5NCwgMHgyNDA1MDQwMCwgMHhhZjQyMDEzYywgMHg4ZjQyMDEzYywKLTB4MjQwNjAwMDEsIDB4MjQwNzAwMDEsIDB4YWY0MDAwMDAsIDB4YWY0ZDAxMzgsCi0weGFmNDMwMTQ0LCAweGFmNDgwMTQ4LCAweGFmNDkwMTRjLCAweGFmNGEwMTUwLAotMHhhZjRiMDE1NCwgMHhhZjRjMDE1OCwgMHgyNDQyZmY4MCwgMHhhZjQyMDE0MCwKLTB4MjQwMjAwMDEsIDB4YWZhMjAwMTAsIDB4YzAwMmIzYiwgMHhhZmEwMDAxNCwKLTB4OGY0MjAxMzgsIDB4YWZhMjAwMTAsIDB4OGY0MjAxM2MsIDB4YWZhMjAwMTQsCi0weDhmNDYwMTQ0LCAweDhmNDcwMTQ4LCAweDNjMDQwMDAxLCAweDI0ODQ1Y2EwLAotMHhjMDAyYjNiLCAweDI0MDUwNTAwLCAweGFmYjcwMDEwLCAweGFmYmEwMDE0LAotMHg4ZjQ2MDE0YywgMHg4ZjQ3MDE1MCwgMHgzYzA0MDAwMSwgMHgyNDg0NWNhYywKLTB4YzAwMmIzYiwgMHgyNDA1MDYwMCwgMHgzYzAyMDAwMSwgMHg4YzQyNmU5YywKLTB4MzYwMzgyMSwgMHgzYzA2MDAwMiwgMHgyNGM2OTAxMCwgMHgyNDQ4ZmZmZiwKLTB4MTA2MTgyNCwgMHhlODEwMjQsIDB4NDMxMDJiLCAweDEwNDAwMDA2LAotMHgyNDA1MDkwMCwgMHgzYzA0MDAwMSwgMHgyNDg0NWNiOCwgMHhhZmE4MDAxMCwKLTB4YzAwMmIzYiwgMHhhZmEwMDAxNCwgMHg4ZjgyMDAwYywgMHhhZmEyMDAxMCwKLTB4OGY4MjAwM2MsIDB4YWZhMjAwMTQsIDB4OGY4NjAwMDAsIDB4OGY4NzAwMDQsCi0weDNjMDQwMDAxLCAweDI0ODQ1Y2M0LCAweGMwMDJiM2IsIDB4MjQwNTEwMDAsCi0weDhjMDIwMjIwLCAweDhjMDMwMjI0LCAweDhjMDYwMjE4LCAweDhjMDcwMjFjLAotMHgzYzA0MDAwMSwgMHgyNDg0NWNjYywgMHgyNDA1MTEwMCwgMHhhZmEyMDAxMCwKLTB4YzAwMmIzYiwgMHhhZmEzMDAxNCwgMHhhZjgwMDA1NCwgMHhhZjgwMDExYywKLTB4OGMwMjAyMTgsIDB4MzA0MjAwMDIsIDB4MTA0MDAwMDksIDB4MCwKLTB4OGMwMjAyMjAsIDB4M2MwMzAwMDIsIDB4MzQ2MzAwMDQsIDB4NDMxMDI1LAotMHhhZjQyMDAwYywgMHg4YzAyMDIxYywgMHgxMDAwMDAwOCwgMHgzNDQyMDAwNCwKLTB4OGMwMjAyMjAsIDB4M2MwMzAwMDIsIDB4MzQ2MzAwMDYsIDB4NDMxMDI1LAotMHhhZjQyMDAwYywgMHg4YzAyMDIxYywgMHgzNDQyMDAwNiwgMHhhZjQyMDAxNCwKLTB4OGMwMjAyMTgsIDB4MzA0MjAwMTAsIDB4MTA0MDAwMGEsIDB4MCwKLTB4OGMwMjAyMWMsIDB4MzQ0MjAwMDQsIDB4YWY0MjAwMTAsIDB4OGMwMjAyMjAsCi0weDNjMDMwMDBhLCAweDM0NjMwMDA0LCAweDQzMTAyNSwgMHgxMDAwMDAwOSwKLTB4YWY0MjAwMDgsIDB4OGMwMjAyMjAsIDB4M2MwMzAwMGEsIDB4MzQ2MzAwMDYsCi0weDQzMTAyNSwgMHhhZjQyMDAwOCwgMHg4YzAyMDIxYywgMHgzNDQyMDAwNiwKLTB4YWY0MjAwMTAsIDB4MjQwMjAwMDEsIDB4YWY4MjAwYTAsIDB4YWY4MjAwYjAsCi0weDhmODMwMDU0LCAweDhmODIwMDU0LCAweGFmODAwMGQwLCAweGFmODAwMGMwLAotMHgxMDAwMDAwMiwgMHgyNDYzMDA2NCwgMHg4ZjgyMDA1NCwgMHg2MjEwMjMsCi0weDJjNDIwMDY1LCAweDE0NDBmZmZjLCAweDAsIDB4OGMwNDAyMDgsCi0weDhjMDUwMjBjLCAweDI2ZTIwMDI4LCAweGFlZTIwMDIwLCAweDI0MDIwNDkwLAotMHhhZWUyMDAxMCwgMHhhZWU0MDAwOCwgMHhhZWU1MDAwYywgMHgyNmU0MDAwOCwKLTB4OGM4MjAwMDAsIDB4OGM4MzAwMDQsIDB4YWY4MjAwOTAsIDB4YWY4MzAwOTQsCi0weDhjODIwMDE4LCAweGFmODIwMGI0LCAweDk0ODIwMDBhLCAweGFmODIwMDljLAotMHg4ZjQyMDAxNCwgMHhhZjgyMDBiMCwgMHg4ZjgyMDBiMCwgMHgzMDQyMDAwNCwKLTB4MTQ0MGZmZmQsIDB4MCwgMHg4ZjgyMDBiMCwgMHgzYzAzZWYwMCwKLTB4NDMxMDI0LCAweDEwNDAwMDIxLCAweDAsIDB4OGY4MjAwYjQsCi0weGFmYTIwMDEwLCAweDhmODIwMDkwLCAweDhmODMwMDk0LCAweDNjMDQwMDAxLAotMHgyNDg0NWNkNCwgMHhhZmEzMDAxNCwgMHg4Zjg2MDBiMCwgMHg4Zjg3MDA5YywKLTB4M2MwNTAwMDEsIDB4YzAwMmIzYiwgMHgzNGE1MjAwZCwgMHgzYzA0MDAwMSwKLTB4MjQ4NDVjZTAsIDB4MjQwMjAzYzAsIDB4YWZhMjAwMTAsIDB4YWZhMDAwMTQsCi0weDhmODYwMTQ0LCAweDNjMDcwMDAxLCAweDI0ZTc1Y2U4LCAweGMwMDJiM2IsCi0weDM0MDVkZWFkLCAweDhmODIwMTFjLCAweDM0NDIwMDAyLCAweGFmODIwMTFjLAotMHg4ZjgyMDIyMCwgMHgzNDQyMDAwNCwgMHhhZjgyMDIyMCwgMHg4ZjgyMDE0MCwKLTB4M2MwMzAwMDEsIDB4NDMxMDI1LCAweGFmODIwMTQwLCAweDk2ZTIwNDcyLAotMHg5NmU2MDQ1MiwgMHg5NmU3MDQ2MiwgMHhhZmEyMDAxMCwgMHg5NmUyMDQ4MiwKLTB4M2MwNDAwMDEsIDB4MjQ4NDVkMTQsIDB4MjQwNTEyMDAsIDB4YzAwMmIzYiwKLTB4YWZhMjAwMTQsIDB4OTZmMDA0NTIsIDB4MzIwMjAwMDEsIDB4MTA0MDAwMDIsCi0weGIwMjEsIDB4MjQxNjAwMDEsIDB4MzIwMjAwMDIsIDB4NTQ0MDAwMDEsCi0weDM2ZDYwMDAyLCAweDMyMDIwMDA4LCAweDU0NDAwMDAxLCAweDM2ZDYwMDA0LAotMHgzMjAyMDAxMCwgMHg1NDQwMDAwMSwgMHgzNmQ2MDAwOCwgMHgzMjAyMDAyMCwKLTB4NTQ0MDAwMDEsIDB4MzZkNjAwMTAsIDB4MzIwMjAwNDAsIDB4NTQ0MDAwMDEsCi0weDM2ZDYwMDIwLCAweDMyMDIwMDgwLCAweDU0NDAwMDAxLCAweDM2ZDYwMDQwLAotMHg5NmU2MDQ4MiwgMHgzMGMyMDIwMCwgMHg1NDQwMDAwMSwgMHgzNmQ2NDAwMCwKLTB4OTZlMzA0NzIsIDB4MzA2MjAyMDAsIDB4MTA0MDAwMDMsIDB4MzA2MjAxMDAsCi0weDEwMDAwMDAzLCAweDM2ZDYyMDAwLCAweDU0NDAwMDAxLCAweDM2ZDYxMDAwLAotMHg5NmYwMDQ2MiwgMHgzMmMyNDAwMCwgMHgxNDQwMDAwNCwgMHgzMjA3MDA5YiwKLTB4MzBjMjAwOWIsIDB4MTRlMjAwMDcsIDB4MjQwZTAwMDEsIDB4MzJjMjIwMDAsCi0weDE0NDAwMDBkLCAweDMyMDIwMDAxLCAweDMwNjIwMDliLCAweDEwZTIwMDA5LAotMHgyNDBlMDAwMSwgMHgzYzA0MDAwMSwgMHgyNDg0NWQyMCwgMHgyNDA1MTMwMCwKLTB4MjAwMzgyMSwgMHhhM2FlMDAzZiwgMHhhZmEzMDAxMCwgMHhjMDAyYjNiLAotMHhhZmEwMDAxNCwgMHgzMjAyMDAwMSwgMHg1NDQwMDAwMSwgMHgzNmQ2MDA4MCwKLTB4MzIwMjAwMDIsIDB4NTQ0MDAwMDEsIDB4MzZkNjAxMDAsIDB4MzIwMjAwMDgsCi0weDU0NDAwMDAxLCAweDM2ZDYwMjAwLCAweDMyMDIwMDEwLCAweDU0NDAwMDAxLAotMHgzNmQ2MDQwMCwgMHgzMjAyMDA4MCwgMHg1NDQwMDAwMSwgMHgzNmQ2MDgwMCwKLTB4OGMwMjAyMTgsIDB4MzA0MjAyMDAsIDB4MTA0MDAwMDIsIDB4M2MwMjAwMDgsCi0weDJjMmIwMjUsIDB4OGMwMjAyMTgsIDB4MzA0MjA4MDAsIDB4MTA0MDAwMDIsCi0weDNjMDIwMDgwLCAweDJjMmIwMjUsIDB4OGMwMjAyMTgsIDB4MzA0MjA0MDAsCi0weDEwNDAwMDAyLCAweDNjMDIwMTAwLCAweDJjMmIwMjUsIDB4OGMwMjAyMTgsCi0weDMwNDIwMTAwLCAweDEwNDAwMDAyLCAweDNjMDIwMjAwLCAweDJjMmIwMjUsCi0weDhjMDIwMjE4LCAweDMwNDIwMDgwLCAweDEwNDAwMDAyLCAweDNjMDIwNDAwLAotMHgyYzJiMDI1LCAweDhjMDIwMjE4LCAweDMwNDIyMDAwLCAweDEwNDAwMDAyLAotMHgzYzAyMDAxMCwgMHgyYzJiMDI1LCAweDhjMDIwMjE4LCAweDMwNDI0MDAwLAotMHgxMDQwMDAwMiwgMHgzYzAyMDAyMCwgMHgyYzJiMDI1LCAweDhjMDIwMjE4LAotMHgzMDQyMTAwMCwgMHgxMDQwMDAwMiwgMHgzYzAyMDA0MCwgMHgyYzJiMDI1LAotMHg4ZWUyMDQ5OCwgMHg4ZWUzMDQ5YywgMHhhZjQyMDE2MCwgMHhhZjQzMDE2NCwKLTB4OGVlMjA0YTAsIDB4OGVlMzA0YTQsIDB4YWY0MjAxNjgsIDB4YWY0MzAxNmMsCi0weDhlZTIwNGE4LCAweDhlZTMwNGFjLCAweGFmNDIwMTcwLCAweGFmNDMwMTc0LAotMHg4ZWUyMDQyOCwgMHg4ZWUzMDQyYywgMHhhZjQyMDE3OCwgMHhhZjQzMDE3YywKLTB4OGVlMjA0NDgsIDB4OGVlMzA0NGMsIDB4YWY0MjAxODAsIDB4YWY0MzAxODQsCi0weDhlZTIwNDU4LCAweDhlZTMwNDVjLCAweGFmNDIwMTg4LCAweGFmNDMwMThjLAotMHg4ZWUyMDQ2OCwgMHg4ZWUzMDQ2YywgMHhhZjQyMDE5MCwgMHhhZjQzMDE5NCwKLTB4OGVlMjA0NzgsIDB4OGVlMzA0N2MsIDB4YWY0MjAxOTgsIDB4YWY0MzAxOWMsCi0weDhlZTIwNDg4LCAweDhlZTMwNDhjLCAweGFmNDIwMWEwLCAweGFmNDMwMWE0LAotMHg4ZWUyMDRiMCwgMHg4ZWUzMDRiNCwgMHgyNDA0MDA4MCwgMHhhZjQyMDFhOCwKLTB4YWY0MzAxYWMsIDB4YzAwMmJhOCwgMHgyNDA1MDA4MCwgMHg4YzAyMDI1YywKLTB4Mjc0NDAyMjQsIDB4YWY0MjAxZjAsIDB4OGMwMjAyNjAsIDB4MjQwNTAyMDAsCi0weDI0MDYwMDA4LCAweGMwMDJiYmYsIDB4YWY0MjAxZjgsIDB4M2MwNDNiOWEsCi0weDM0ODRjYTAwLCAweDM4MjEsIDB4MjQwMjAwMDYsIDB4MjQwMzAwMDIsCi0weGFmNDIwMWY0LCAweDI0MDIwM2U4LCAweGFmNDMwMjA0LCAweGFmNDMwMjAwLAotMHhhZjQ0MDFmYywgMHhhZjQyMDI5NCwgMHgyNDAyMDAwMSwgMHhhZjQzMDI5MCwKLTB4YWY0MjAyOWMsIDB4M2MwMzAwMDEsIDB4NjcxODIxLCAweDkwNjM2Y2Q4LAotMHgzNDcxMDIxLCAweDI0ZTcwMDAxLCAweGEwNDMwMjJjLCAweDJjZTIwMDBmLAotMHgxNDQwZmZmOCwgMHgzNDcxODIxLCAweDI0ZTcwMDAxLCAweDNjMDgwMDAxLAotMHgzNTA4NDBmOCwgMHg4ZjgyMDA0MCwgMHgzYzA0MDAwMSwgMHgyNDg0NWQyYywKLTB4MjQwNTE0MDAsIDB4MjE3MDIsIDB4MjQ0MjAwMzAsIDB4YTA2MjAyMmMsCi0weDM0NzEwMjEsIDB4YTA0MDAyMmMsIDB4OGMwNzAyMTgsIDB4MmMwMzAyMSwKLTB4MjQwMjA1YzgsIDB4YWZhMjAwMTAsIDB4YzAwMmIzYiwgMHhhZmE4MDAxNCwKLTB4M2MwNDAwMDEsIDB4MjQ4NDVkMzgsIDB4M2MwNTAwMDAsIDB4MjRhNTVjODAsCi0weDI0MDYwMDEwLCAweDI3YjEwMDMwLCAweDIyMDM4MjEsIDB4MjdiMzAwMzQsCi0weGMwMDE3YTMsIDB4YWZiMzAwMTAsIDB4M2MwMzAwMDEsIDB4OGM2MzZjYzgsCi0weDEwNjAwMDBhLCAweDQwODAyMSwgMHg4ZmEzMDAzMCwgMHgyNDA1ZmYwMCwKLTB4OGZhMjAwMzQsIDB4MjQ2NDAwZmYsIDB4ODUyMDI0LCAweDgzMTgyMywKLTB4NDMxMDIzLCAweGFmYTIwMDM0LCAweGFmYTQwMDMwLCAweDNjMDQwMDAxLAotMHgyNDg0NWQ0NCwgMHgzYzA1MDAwMCwgMHgyNGE1NDEwMCwgMHgyNDA2MDEwOCwKLTB4MjIwMzgyMSwgMHhjMDAxN2EzLCAweGFmYjMwMDEwLCAweDQwOTAyMSwKLTB4MzJjMjAwMDMsIDB4M2MwMTAwMDEsIDB4YWMzMjZlODAsIDB4MTA0MDAwNDUsCi0weDIyMDM4MjEsIDB4OGY4MjAwNTAsIDB4M2MwMzAwMTAsIDB4NDMxMDI0LAotMHgxMDQwMDAxNiwgMHgwLCAweDhjMDIwMjE4LCAweDMwNDIwMDQwLAotMHgxMDQwMDAwZiwgMHgyNDAyMDAwMSwgMHg4ZjgyMDA1MCwgMHg4YzAzMDIxOCwKLTB4MjQwZTAwMDEsIDB4M2MwNDAwMDEsIDB4MjQ4NDVkNTAsIDB4YTNhZTAwM2YsCi0weGFmYTIwMDEwLCAweGFmYTMwMDE0LCAweDhmODcwMDQwLCAweDI0MDUxNTAwLAotMHhjMDAyYjNiLCAweDJjMDMwMjEsIDB4MTAwMDAwMDQsIDB4MCwKLTB4M2MwMTAwMDEsIDB4MzcwODIxLCAweGEwMjI0MGY0LCAweDNjMDQwMDAxLAotMHgyNDg0NWQ1YywgMHgzYzA1MDAwMSwgMHgyNGE1NWI0MCwgMHgzYzA2MDAwMSwKLTB4MjRjNjViYWMsIDB4YzUzMDIzLCAweDhmNDIwMDEwLCAweDI3YjMwMDMwLAotMHgyNjAzODIxLCAweDI3YjEwMDM0LCAweDM0NDIwYTAwLCAweGFmNDIwMDEwLAotMHhjMDAxN2EzLCAweGFmYjEwMDEwLCAweDNjMDQwMDAxLCAweDI0ODQ1ZDcwLAotMHgzYzA1MDAwMSwgMHgyNGE1YjcxNCwgMHgzYzA2MDAwMSwgMHgyNGM2YmE5MCwKLTB4YzUzMDIzLCAweDI2MDM4MjEsIDB4YWY0MjAxMDgsIDB4YzAwMTdhMywKLTB4YWZiMTAwMTAsIDB4M2MwNDAwMDEsIDB4MjQ4NDVkOGMsIDB4M2MwNTAwMDEsCi0weDI0YTViZTU4LCAweDNjMDYwMDAxLCAweDI0YzZjOTAwLCAweGM1MzAyMywKLTB4MjYwMzgyMSwgMHgzYzAxMDAwMSwgMHhhYzIyNmVmNCwgMHhjMDAxN2EzLAotMHhhZmIxMDAxMCwgMHgzYzA0MDAwMSwgMHgyNDg0NWRhNCwgMHgxMDAwMDAyNCwKLTB4MjQwNTE2MDAsIDB4M2MwNDAwMDEsIDB4MjQ4NDVkYWMsIDB4M2MwNTAwMDEsCi0weDI0YTVhMTBjLCAweDNjMDYwMDAxLCAweDI0YzZhMjM4LCAweGM1MzAyMywKLTB4YzAwMTdhMywgMHhhZmIzMDAxMCwgMHgzYzA0MDAwMSwgMHgyNDg0NWRiYywKLTB4M2MwNTAwMDEsIDB4MjRhNWIyYjAsIDB4M2MwNjAwMDEsIDB4MjRjNmI3MGMsCi0weGM1MzAyMywgMHgyMjAzODIxLCAweGFmNDIwMTA4LCAweGMwMDE3YTMsCi0weGFmYjMwMDEwLCAweDNjMDQwMDAxLCAweDI0ODQ1ZGQwLCAweDNjMDUwMDAxLAotMHgyNGE1YmE5OCwgMHgzYzA2MDAwMSwgMHgyNGM2YmU1MCwgMHhjNTMwMjMsCi0weDIyMDM4MjEsIDB4M2MwMTAwMDEsIDB4YWMyMjZlZjQsIDB4YzAwMTdhMywKLTB4YWZiMzAwMTAsIDB4M2MwNDAwMDEsIDB4MjQ4NDVkZTQsIDB4MjQwNTE2NTAsCi0weDJjMDMwMjEsIDB4MzgyMSwgMHgzYzAxMDAwMSwgMHhhYzIyNmVmOCwKLTB4YWZhMDAwMTAsIDB4YzAwMmIzYiwgMHhhZmEwMDAxNCwgMHgzMmMyMDAyMCwKLTB4MTA0MDAwMjEsIDB4MjdhNzAwMzAsIDB4M2MwNDAwMDEsIDB4MjQ4NDVkZjAsCi0weDNjMDUwMDAxLCAweDI0YTViMTNjLCAweDNjMDYwMDAxLCAweDI0YzZiMmE4LAotMHhjNTMwMjMsIDB4MjQwMjIwMDAsIDB4YWY0MjAwMWMsIDB4MjdhMjAwMzQsCi0weGMwMDE3YTMsIDB4YWZhMjAwMTAsIDB4MjE5MDAsIDB4MzE5ODIsCi0weDNjMDQwODAwLCAweDY0MTgyNSwgMHhhZTQzMDAyOCwgMHgyNDAzMDAxMCwKLTB4YWY0MzAwM2MsIDB4OTZlMzA0NTAsIDB4YWY0MzAwNDAsIDB4OGY0MzAwNDAsCi0weDNjMDQwMDAxLCAweDI0ODQ1ZTA0LCAweGFmYTAwMDE0LCAweGFmYTMwMDEwLAotMHg4ZjQ3MDAxYywgMHgyNDA1MTY2MCwgMHgzYzAxMDAwMSwgMHhhYzIyNmVmMCwKLTB4MTAwMDAwMjUsIDB4MzJjNjAwMjAsIDB4OGVlMjA0NDgsIDB4OGVlMzA0NGMsCi0weGFmNDMwMDFjLCAweDhmNDIwMDFjLCAweDI0NDJlMDAwLCAweDJjNDIyMDAxLAotMHgxNDQwMDAwYSwgMHgyNDBlMDAwMSwgMHgzYzA0MDAwMSwgMHgyNDg0NWUxMCwKLTB4YTNhZTAwM2YsIDB4YWZhMDAwMTAsIDB4YWZhMDAwMTQsIDB4OGY0NjAwMWMsCi0weDI0MDUxNzAwLCAweGMwMDJiM2IsIDB4MzgyMSwgMHgzYzAyMDAwMCwKLTB4MjQ0MjVjYmMsIDB4MjExMDAsIDB4MjExODIsIDB4M2MwMzA4MDAsCi0weDQzMTAyNSwgMHhhZTQyMDAyOCwgMHgyNDAyMDAwOCwgMHhhZjQyMDAzYywKLTB4OTZlMjA0NTAsIDB4YWY0MjAwNDAsIDB4OGY0MjAwNDAsIDB4M2MwNDAwMDEsCi0weDI0ODQ1ZTFjLCAweGFmYTAwMDE0LCAweGFmYTIwMDEwLCAweDhmNDcwMDFjLAotMHgyNDA1MTgwMCwgMHgzMmM2MDAyMCwgMHhjMDAyYjNiLCAweDAsCi0weDNjMDUwZmZmLCAweDNjMDMwMDAxLCAweDhjNjM2ZWY0LCAweDM0YTVmZmZmLAotMHgyNDAzMDIxLCAweDNjMDIwMDAxLCAweDhjNDI2ZWY4LCAweDNjMDQwODAwLAotMHg2NTE4MjQsIDB4MzE4ODIsIDB4NjQxODI1LCAweDQ1MTAyNCwKLTB4MjEwODIsIDB4NDQxMDI1LCAweGFjYzIwMDgwLCAweDMyYzIwMTgwLAotMHgxMDQwMDA1NiwgMHhhY2MzMDAyMCwgMHg4ZjgyMDA1YywgMHgzYzAzMDA4MCwKLTB4NDMxMDI0LCAweDEwNDAwMDBkLCAweDAsIDB4OGY4MjAwNTAsCi0weGFmYTIwMDEwLCAweDhmODIwMDVjLCAweDI0MGUwMDAxLCAweDNjMDQwMDAxLAotMHgyNDg0NWUyOCwgMHhhM2FlMDAzZiwgMHhhZmEyMDAxNCwgMHg4Zjg3MDA0MCwKLTB4MjQwNTE5MDAsIDB4YzAwMmIzYiwgMHgyYzAzMDIxLCAweDhmODIwMDUwLAotMHgzYzAzMDAxMCwgMHg0MzEwMjQsIDB4MTA0MDAwMTYsIDB4MCwKLTB4OGMwMjAyMTgsIDB4MzA0MjAwNDAsIDB4MTA0MDAwMGYsIDB4MjQwMjAwMDEsCi0weDhmODIwMDUwLCAweDhjMDMwMjE4LCAweDI0MGUwMDAxLCAweDNjMDQwMDAxLAotMHgyNDg0NWQ1MCwgMHhhM2FlMDAzZiwgMHhhZmEyMDAxMCwgMHhhZmEzMDAxNCwKLTB4OGY4NzAwNDAsIDB4MjQwNTIwMDAsIDB4YzAwMmIzYiwgMHgyYzAzMDIxLAotMHgxMDAwMDAwNCwgMHgwLCAweDNjMDEwMDAxLCAweDM3MDgyMSwKLTB4YTAyMjQwZjQsIDB4M2MwNDAwMDEsIDB4MjQ4NDVlMzQsIDB4M2MwNTAwMDEsCi0weDI0YTU1YWMwLCAweDNjMDYwMDAxLCAweDI0YzY1YjM4LCAweGM1MzAyMywKLTB4OGY0MjAwMDgsIDB4MjdiMzAwMzAsIDB4MjYwMzgyMSwgMHgyN2IxMDAzNCwKLTB4MzQ0MjBlMDAsIDB4YWY0MjAwMDgsIDB4YzAwMTdhMywgMHhhZmIxMDAxMCwKLTB4M2MwNDAwMDEsIDB4MjQ4NDVlNGMsIDB4M2MwNTAwMDEsIDB4MjRhNWQ4YjQsCi0weDNjMDYwMDAxLCAweDI0YzZlM2M4LCAweGM1MzAyMywgMHgyNjAzODIxLAotMHhhZjQyMDEwYywgMHhjMDAxN2EzLCAweGFmYjEwMDEwLCAweDNjMDQwMDAxLAotMHgyNDg0NWU2NCwgMHgzYzA1MDAwMSwgMHgyNGE1ZTlhYywgMHgzYzA2MDAwMSwKLTB4MjRjNmYwZjAsIDB4YzUzMDIzLCAweDI2MDM4MjEsIDB4M2MwMTAwMDEsCi0weGFjMjI2ZjA0LCAweGMwMDE3YTMsIDB4YWZiMTAwMTAsIDB4M2MwNDAwMDEsCi0weDI0ODQ1ZTdjLCAweDEwMDAwMDI3LCAweDI0MDUyMTAwLCAweDNjMDQwMDAxLAotMHgyNDg0NWU4NCwgMHgzYzA1MDAwMSwgMHgyNGE1OWZjOCwgMHgzYzA2MDAwMSwKLTB4MjRjNmExMDQsIDB4YzUzMDIzLCAweDI3YjEwMDMwLCAweDIyMDM4MjEsCi0weDI3YjMwMDM0LCAweGMwMDE3YTMsIDB4YWZiMzAwMTAsIDB4M2MwNDAwMDEsCi0weDI0ODQ1ZTk0LCAweDNjMDUwMDAxLCAweDI0YTVjYWQ0LCAweDNjMDYwMDAxLAotMHgyNGM2ZDhhYywgMHhjNTMwMjMsIDB4MjIwMzgyMSwgMHhhZjQyMDEwYywKLTB4YzAwMTdhMywgMHhhZmIzMDAxMCwgMHgzYzA0MDAwMSwgMHgyNDg0NWVhNCwKLTB4M2MwNTAwMDEsIDB4MjRhNWU4NGMsIDB4M2MwNjAwMDEsIDB4MjRjNmU5YTQsCi0weGM1MzAyMywgMHgyMjAzODIxLCAweDNjMDEwMDAxLCAweGFjMjI2ZjA0LAotMHhjMDAxN2EzLCAweGFmYjMwMDEwLCAweDNjMDQwMDAxLCAweDI0ODQ1ZWI4LAotMHgyNDA1MjE1MCwgMHgyYzAzMDIxLCAweDM4MjEsIDB4M2MwMTAwMDEsCi0weGFjMjI2ZjEwLCAweGFmYTAwMDEwLCAweGMwMDJiM2IsIDB4YWZhMDAwMTQsCi0weDNjMTEwZmZmLCAweDNjMDMwMDAxLCAweDhjNjM2ZjA0LCAweDM2MzFmZmZmLAotMHgyNDA5ODIxLCAweDNjMDIwMDAxLCAweDhjNDI2ZjEwLCAweDNjMGUwODAwLAotMHg3MTE4MjQsIDB4MzE4ODIsIDB4NmUxODI1LCAweDUxMTAyNCwKLTB4MjEwODIsIDB4NGUxMDI1LCAweGFlNjMwMDM4LCAweGFlNjIwMDc4LAotMHg4YzAyMDIxOCwgMHgzMDQyMDA0MCwgMHgxNDQwMDAwNCwgMHgyNDAyMDAwMSwKLTB4M2MwMTAwMDEsIDB4MzcwODIxLCAweGEwMjI0MGY0LCAweDNjMDQwMDAxLAotMHgyNDg0NWVjNCwgMHgzYzA1MDAwMSwgMHgyNGE1ZTNkMCwgMHgzYzA2MDAwMSwKLTB4MjRjNmU1MmMsIDB4YzUzMDIzLCAweDI3YmUwMDMwLCAweDNjMDM4MjEsCi0weDI3YjUwMDM0LCAweGMwMDE3YTMsIDB4YWZiNTAwMTAsIDB4M2MwMTAwMDEsCi0weGFjMjI2ZWZjLCAweDUxMTAyNCwgMHgyMTA4MiwgMHgzYzBlMDgwMCwKLTB4NGUxMDI1LCAweGFlNjIwMDUwLCAweDMyYzIyMDAwLCAweDEwNDAwMDA2LAotMHgzYzAzODIxLCAweDNjMDIwMDAwLCAweDI0NDI1Y2JjLCAweDIyMjEwMjQsCi0weDEwMDAwMDBmLCAweDIxMDgyLCAweDNjMDQwMDAxLCAweDI0ODQ1ZWQ4LAotMHgzYzA1MDAwMSwgMHgyNGE1ZTUzNCwgMHgzYzA2MDAwMSwgMHgyNGM2ZTZlNCwKLTB4YzUzMDIzLCAweGMwMDE3YTMsIDB4YWZiNTAwMTAsIDB4M2MwMTAwMDEsCi0weGFjMjI2ZjE0LCAweDUxMTAyNCwgMHgyMTA4MiwgMHgzYzBlMDgwMCwKLTB4NGUxMDI1LCAweGFlNjIwMDQ4LCAweDMyYzI0MDAwLCAweDEwNDAwMDA1LAotMHgyN2E3MDAzMCwgMHgzYzAyMDAwMCwgMHgyNDQyNWNiYywgMHgxMDAwMDAwZSwKLTB4MjExMDAsIDB4M2MwNDAwMDEsIDB4MjQ4NDVlZjAsIDB4M2MwNTAwMDEsCi0weDI0YTVlNmVjLCAweDNjMDYwMDAxLCAweDI0YzZlODQ0LCAweGM1MzAyMywKLTB4MjdhMjAwMzQsIDB4YzAwMTdhMywgMHhhZmEyMDAxMCwgMHgzYzAxMDAwMSwKLTB4YWMyMjZmMDgsIDB4MjExMDAsIDB4MjExODIsIDB4M2MwMzA4MDAsCi0weDQzMTAyNSwgMHhhZTQyMDA2MCwgMHgzYzA0MDAwMSwgMHgyNDg0NWYwOCwKLTB4M2MwNTAwMDEsIDB4MjRhNTgyMzAsIDB4M2MwNjAwMDEsIDB4MjRjNjg2NTAsCi0weGM1MzAyMywgMHgyN2IxMDAzMCwgMHgyMjAzODIxLCAweDI3YjMwMDM0LAotMHhjMDAxN2EzLCAweGFmYjMwMDEwLCAweDNjMGUwZmZmLCAweDM1Y2VmZmZmLAotMHgzYzA0MDAwMSwgMHgyNDg0NWYxNCwgMHgzYzA1MDAwMCwgMHgyNGE1NjQ2OCwKLTB4M2MwNjAwMDAsIDB4MjRjNjY1ODgsIDB4YzUzMDIzLCAweDIyMDM4MjEsCi0weDI0MGYwMjEsIDB4M2MwMTAwMDEsIDB4YWMyMjZlZGMsIDB4NGUxMDI0LAotMHgyMTA4MiwgMHgzYzE1MDgwMCwgMHg1NTEwMjUsIDB4YWZhZTAwNDQsCi0weGFmYzIwMGI4LCAweGMwMDE3YTMsIDB4YWZiMzAwMTAsIDB4M2MwNDAwMDEsCi0weDI0ODQ1ZjIwLCAweDNjMDUwMDAwLCAweDI0YTU2NTkwLCAweDNjMDYwMDAwLAotMHgyNGM2NjgwOCwgMHg4ZmFlMDA0NCwgMHhjNTMwMjMsIDB4MjIwMzgyMSwKLTB4M2MwMTAwMDEsIDB4YWMyMjZlZDAsIDB4NGUxMDI0LCAweDIxMDgyLAotMHg1NTEwMjUsIDB4YWZjMjAwZTgsIDB4YzAwMTdhMywgMHhhZmIzMDAxMCwKLTB4M2MwNDAwMDEsIDB4MjQ4NDVmMzgsIDB4M2MwNTAwMDAsIDB4MjRhNTY4MTAsCi0weDNjMDYwMDAwLCAweDI0YzY2OTQwLCAweDhmYWUwMDQ0LCAweGM1MzAyMywKLTB4MjIwMzgyMSwgMHgzYzAxMDAwMSwgMHhhYzIyNmVjOCwgMHg0ZTEwMjQsCi0weDIxMDgyLCAweDU1MTAyNSwgMHhhZmMyMDBjMCwgMHhjMDAxN2EzLAotMHhhZmIzMDAxMCwgMHgzYzA0MDAwMSwgMHgyNDg0NWY1MCwgMHgzYzA1MDAwMSwKLTB4MjRhNWZhZDAsIDB4M2MwNjAwMDEsIDB4MjRjNmZiYTgsIDB4OGZhZTAwNDQsCi0weGM1MzAyMywgMHgyMjAzODIxLCAweDNjMDEwMDAxLCAweGFjMjI2ZWQ0LAotMHg0ZTEwMjQsIDB4MjEwODIsIDB4NTUxMDI1LCAweGFmYzIwMGM4LAotMHhjMDAxN2EzLCAweGFmYjMwMDEwLCAweDNjMDQwMDAxLCAweDI0ODQ1ZjVjLAotMHgzYzA1MDAwMSwgMHgyNGE1YzkzYywgMHgzYzA2MDAwMSwgMHgyNGM2Y2EyMCwKLTB4YzUzMDIzLCAweDIyMDM4MjEsIDB4YWY0MjAxMTAsIDB4YzAwMTdhMywKLTB4YWZiMzAwMTAsIDB4M2MwNDAwMDEsIDB4MjQ4NDVmNmMsIDB4M2MwNTAwMDEsCi0weDI0YTVjOTEwLCAweDNjMDYwMDAxLCAweDI0YzZjOTM0LCAweGM1MzAyMywKLTB4MjIwMzgyMSwgMHhhZjQyMDEyNCwgMHhjMDAxN2EzLCAweGFmYjMwMDEwLAotMHgzYzA0MDAwMSwgMHgyNDg0NWY3YywgMHgzYzA1MDAwMSwgMHgyNGE1NWE4MCwKLTB4M2MwNjAwMDEsIDB4MjRjNjVhYWMsIDB4YzUzMDIzLCAweDIyMDM4MjEsCi0weGFmNDIwMTIwLCAweGFmNDIwMTE0LCAweGMwMDE3YTMsIDB4YWZiMzAwMTAsCi0weDNjMDQwMDAxLCAweDI0ODQ1Zjg4LCAweDNjMDUwMDAxLCAweDI0YTVmMjk4LAotMHgzYzA2MDAwMSwgMHgyNGM2ZjZiNCwgMHhjNTMwMjMsIDB4MjIwMzgyMSwKLTB4YWY0MjAxMTgsIDB4YzAwMTdhMywgMHhhZmIzMDAxMCwgMHg4ZmFlMDA0NCwKLTB4M2MwMTAwMDEsIDB4YWMyMjZmMTgsIDB4NGUxMDI0LCAweDIxMDgyLAotMHg1NTEwMjUsIDB4YzAwM2ZjMywgMHhhZmMyMDBkMCwgMHhjMDAzYzQwLAotMHgwLCAweGMwMDI3YTgsIDB4MCwgMHhhYzAwMDIyOCwKLTB4YWMwMDAyMmMsIDB4OTZlMjA0NTAsIDB4MjQ0MmZmZmYsIDB4YWY0MjAwMzgsCi0weDk2ZTIwNDYwLCAweGFmNDIwMDgwLCAweDMyYzI0MDAwLCAweDE0NDAwMDAzLAotMHgwLCAweDk2ZTIwNDgwLCAweGFmNDIwMDg0LCAweDk2ZTcwNDkwLAotMHg1MGUwMDAwMSwgMHgyNDA3MDgwMCwgMHgyNGUyZmZmZiwgMHhhZjQyMDA4OCwKLTB4YWY0MjAwN2MsIDB4MjQwMjA4MDAsIDB4MTBlMjAwMGYsIDB4MzJjMjQwMDAsCi0weDEwNDAwMDAzLCAweDI0MDIwNDAwLCAweDEwZTIwMDBiLCAweDAsCi0weDI0MGUwMDAxLCAweDNjMDQwMDAxLCAweDI0ODQ1Zjk4LCAweGEzYWUwMDNmLAotMHg5NmU2MDQ5MCwgMHgyNDA1MjE3MCwgMHgyYzAzODIxLCAweGFmYTAwMDEwLAotMHhjMDAyYjNiLCAweGFmYTAwMDE0LCAweDhmNDMwMTM4LCAweDhmNDQwMTM4LAotMHgyNDAyMDAwMSwgMHhhMzQyMDVjMiwgMHhhZjQzMDA5NCwgMHhhZjQ0MDA5OCwKLTB4YWZhMDAwMTAsIDB4YWZhMDAwMTQsIDB4OGY0NjAwODAsIDB4OGY0NzAwODQsCi0weDNjMDQwMDAxLCAweDI0ODQ1ZmE0LCAweGMwMDJiM2IsIDB4MjQwNTIyMDAsCi0weGMwMDI0YTQsIDB4M2MxMTA4MDAsIDB4M2MxNDMzZDgsIDB4MzY5NGNiNTgsCi0weDNjMDIwODAwLCAweDM0NDIwMDgwLCAweDNjMDQwMDAxLCAweDI0ODQ1ZmIwLAotMHgzYzA1MDAwMCwgMHgyNGE1NWQwMCwgMHgzYzA2MDAwMCwgMHgyNGM2NWQxYywKLTB4YzUzMDIzLCAweDI3YTcwMDMwLCAweGFmODIwMDYwLCAweDI0MDJmZmZmLAotMHhhZjgyMDA2NCwgMHgyN2EyMDAzNCwgMHhjMDAxN2EzLCAweGFmYTIwMDEwLAotMHgzYzAxMDAwMSwgMHhhYzIyNmViOCwgMHgyMTEwMCwgMHgyMTE4MiwKLTB4NTExMDI1LCAweGMwMDE4ZmMsIDB4YWU0MjAwMDAsIDB4OGY4MjAyNDAsCi0weDNjMDMwMDAxLCAweDQzMTAyNSwgMHhhZjgyMDI0MCwgMHgzYzAyMDAwMCwKLTB4MjQ0MjQwMzQsIDB4YWY4MjAyNDQsIDB4YWY4MDAyNDAsIDB4OGY4MjAwNjAsCi0weDUxMTAyNCwgMHgxNDQwMDAwNSwgMHgzYzAzMDgwMCwgMHg4ZjgyMDA2MCwKLTB4NDMxMDI0LCAweDEwNDBmZmZkLCAweDAsIDB4YzAwM2M0ZCwKLTB4ODgyMSwgMHgzYzAyMDEwMCwgMHhhZmEyMDAyMCwgMHg4ZjUzMDAxOCwKLTB4MjQwMjAwZmYsIDB4NTY2MjAwMDEsIDB4MjY3MTAwMDEsIDB4OGMwMjAyMjgsCi0weDE2MjIwMDBlLCAweDEzMzBjMCwgMHg4ZjQyMDMzYywgMHgyNDQyMDAwMSwKLTB4YWY0MjAzM2MsIDB4OGY0MjAzM2MsIDB4OGMwMjAyMjgsIDB4M2MwNDAwMDEsCi0weDI0ODQ1YzI0LCAweDNjMDUwMDA5LCAweGFmYTAwMDE0LCAweGFmYTIwMDEwLAotMHg4ZmE2MDAyMCwgMHgxMDAwMDAzZiwgMHgzNGE1MDEwMCwgMHhkNzEwMjEsCi0weDhmYTMwMDIwLCAweDhmYTQwMDI0LCAweGFjNDMwNGMwLCAweGFjNDQwNGM0LAotMHhjMDE4MjEsIDB4OGY0NDAxNzgsIDB4OGY0NTAxN2MsIDB4MTAyMSwKLTB4MjQwNzAwMDQsIDB4YWZhNzAwMTAsIDB4YWZiMTAwMTQsIDB4OGY0ODAwMGMsCi0weDI0YzYwNGMwLCAweDJlNjMwMjEsIDB4YWZhODAwMTgsIDB4OGY0ODAxMGMsCi0weDI0MDcwMDA4LCAweGEzMjgyMSwgMHhhMzQ4MmIsIDB4ODIyMDIxLAotMHgxMDBmODA5LCAweDg5MjAyMSwgMHgxNDQwMDAwYiwgMHgyNDA3MDAwOCwKLTB4OGY4MjAxMjAsIDB4YWZhMjAwMTAsIDB4OGY4MjAxMjQsIDB4M2MwNDAwMDEsCi0weDI0ODQ1YzJjLCAweDNjMDUwMDA5LCAweGFmYTIwMDE0LCAweDhmYTYwMDIwLAotMHgxMDAwMDAxYywgMHgzNGE1MDIwMCwgMHg4ZjQ0MDE2MCwgMHg4ZjQ1MDE2NCwKLTB4OGY0MzAwMGMsIDB4YWY1MTAwMTgsIDB4OGY4NjAxMjAsIDB4MjQwMjAwMTAsCi0weGFmYTIwMDEwLCAweGFmYjEwMDE0LCAweGFmYTMwMDE4LCAweDhmNDIwMTBjLAotMHg0MGY4MDksIDB4MjRjNjAwMWMsIDB4MTQ0MDAwMTAsIDB4MCwKLTB4OGY0MjAzNDAsIDB4MjQ0MjAwMDEsIDB4YWY0MjAzNDAsIDB4OGY0MjAzNDAsCi0weDhmODIwMTIwLCAweGFmYTIwMDEwLCAweDhmODIwMTI0LCAweDNjMDQwMDAxLAotMHgyNDg0NWMzNCwgMHgzYzA1MDAwOSwgMHhhZmEyMDAxNCwgMHg4ZmE2MDAyMCwKLTB4MzRhNTAzMDAsIDB4YzAwMmIzYiwgMHgyNjAzODIxLCAweDhmNDIwMmU0LAotMHgyNDQyMDAwMSwgMHhhZjQyMDJlNCwgMHg4ZjQyMDJlNCwgMHg5M2EyMDAzZiwKLTB4MTA0MDAwNjksIDB4M2MwMjA3MDAsIDB4MzQ0MjMwMDAsIDB4YWZhMjAwMjgsCi0weDhmNTMwMDE4LCAweDI0MDIwMGZmLCAweDEyNjIwMDAyLCAweDg4MjEsCi0weDI2NzEwMDAxLCAweDhjMDIwMjI4LCAweDE2MjIwMDBlLCAweDEzMzBjMCwKLTB4OGY0MjAzM2MsIDB4MjQ0MjAwMDEsIDB4YWY0MjAzM2MsIDB4OGY0MjAzM2MsCi0weDhjMDIwMjI4LCAweDNjMDQwMDAxLCAweDI0ODQ1YzI0LCAweDNjMDUwMDA5LAotMHhhZmEwMDAxNCwgMHhhZmEyMDAxMCwgMHg4ZmE2MDAyOCwgMHgxMDAwMDAzZiwKLTB4MzRhNTAxMDAsIDB4ZDcxMDIxLCAweDhmYTMwMDI4LCAweDhmYTQwMDJjLAotMHhhYzQzMDRjMCwgMHhhYzQ0MDRjNCwgMHhjMDE4MjEsIDB4OGY0NDAxNzgsCi0weDhmNDUwMTdjLCAweDEwMjEsIDB4MjQwNzAwMDQsIDB4YWZhNzAwMTAsCi0weGFmYjEwMDE0LCAweDhmNDgwMDBjLCAweDI0YzYwNGMwLCAweDJlNjMwMjEsCi0weGFmYTgwMDE4LCAweDhmNDgwMTBjLCAweDI0MDcwMDA4LCAweGEzMjgyMSwKLTB4YTM0ODJiLCAweDgyMjAyMSwgMHgxMDBmODA5LCAweDg5MjAyMSwKLTB4MTQ0MDAwMGIsIDB4MjQwNzAwMDgsIDB4OGY4MjAxMjAsIDB4YWZhMjAwMTAsCi0weDhmODIwMTI0LCAweDNjMDQwMDAxLCAweDI0ODQ1YzJjLCAweDNjMDUwMDA5LAotMHhhZmEyMDAxNCwgMHg4ZmE2MDAyOCwgMHgxMDAwMDAxYywgMHgzNGE1MDIwMCwKLTB4OGY0NDAxNjAsIDB4OGY0NTAxNjQsIDB4OGY0MzAwMGMsIDB4YWY1MTAwMTgsCi0weDhmODYwMTIwLCAweDI0MDIwMDEwLCAweGFmYTIwMDEwLCAweGFmYjEwMDE0LAotMHhhZmEzMDAxOCwgMHg4ZjQyMDEwYywgMHg0MGY4MDksIDB4MjRjNjAwMWMsCi0weDE0NDAwMDEwLCAweDAsIDB4OGY0MjAzNDAsIDB4MjQ0MjAwMDEsCi0weGFmNDIwMzQwLCAweDhmNDIwMzQwLCAweDhmODIwMTIwLCAweGFmYTIwMDEwLAotMHg4ZjgyMDEyNCwgMHgzYzA0MDAwMSwgMHgyNDg0NWMzNCwgMHgzYzA1MDAwOSwKLTB4YWZhMjAwMTQsIDB4OGZhNjAwMjgsIDB4MzRhNTAzMDAsIDB4YzAwMmIzYiwKLTB4MjYwMzgyMSwgMHg4ZjQyMDJmMCwgMHgyNDQyMDAwMSwgMHhhZjQyMDJmMCwKLTB4OGY0MjAyZjAsIDB4M2MwNDAwMDEsIDB4MjQ4NDVmYzAsIDB4YWZhMDAwMTAsCi0weGFmYTAwMDE0LCAweDhmYTYwMDI4LCAweDI0MDUyMzAwLCAweGMwMDJiM2IsCi0weDM4MjEsIDB4MTAwMDAwMDQsIDB4MCwgMHg4YzAyMDI2NCwKLTB4MTA0MDAwMDUsIDB4MCwgMHg4ZjgyMDBhMCwgMHgzMDQyMDAwNCwKLTB4MTQ0MGZmZmEsIDB4MCwgMHg4ZjgyMDA0NCwgMHgzNDQyMDAwNCwKLTB4YWY4MjAwNDQsIDB4OGY0MjAzMDgsIDB4MjQ0MjAwMDEsIDB4YWY0MjAzMDgsCi0weDhmNDIwMzA4LCAweDhmODIwMGQ4LCAweDhmODMwMGQ0LCAweDQzMTAyMywKLTB4MjQ0MmZmODAsIDB4YWY0MjAwOTAsIDB4OGY0MjAwOTAsIDB4Mjg0MmZmODEsCi0weDEwNDAwMDA2LCAweDI0MDIwMDAxLCAweDhmNDIwMDkwLCAweDhmNDMwMTQ0LAotMHg0MzEwMjEsIDB4YWY0MjAwOTAsIDB4MjQwMjAwMDEsIDB4YWY0MjAwOGMsCi0weDMyYzIwMDA4LCAweDEwNDAwMDA2LCAweDAsIDB4OGY4MjAyMTQsCi0weDNjMDM4MTAwLCAweDMwNDJmZmZmLCAweDQzMTAyNSwgMHhhZjgyMDIxNCwKLTB4M2MwMzAwMDEsIDB4OGM2MzZkOTQsIDB4MzA2MjAwMDIsIDB4MTA0MDAwMDksCi0weDMwNjIwMDAxLCAweDNjMDQwMDAxLCAweDI0ODQ1ZmNjLCAweDNjMDUwMDAwLAotMHgyNGE1NmQ1MCwgMHgzYzA2MDAwMCwgMHgyNGM2NzFjOCwgMHgxMDAwMDAxMiwKLTB4YzUzMDIzLCAweDEwNDAwMDA5LCAweDAsIDB4M2MwNDAwMDEsCi0weDI0ODQ1ZmRjLCAweDNjMDUwMDAwLCAweDI0YTU3MWQwLCAweDNjMDYwMDAwLAotMHgyNGM2NzY3OCwgMHgxMDAwMDAwOCwgMHhjNTMwMjMsIDB4M2MwNDAwMDEsCi0weDI0ODQ1ZmVjLCAweDNjMDUwMDAwLCAweDI0YTU2OTQ4LCAweDNjMDYwMDAwLAotMHgyNGM2NmQ0OCwgMHhjNTMwMjMsIDB4MjdhNzAwMzAsIDB4MjdhMjAwMzQsCi0weGMwMDE3YTMsIDB4YWZhMjAwMTAsIDB4M2MwMTAwMDEsIDB4YWMyMjZlY2MsCi0weDNjMDIwMDAxLCAweDhjNDI2ZWNjLCAweDNjMDMwODAwLCAweDIxMTAwLAotMHgyMTE4MiwgMHg0MzEwMjUsIDB4YWU0MjAwNDAsIDB4OGY4MjAwYTAsCi0weGFmYTIwMDEwLCAweDhmODIwMGIwLCAweGFmYTIwMDE0LCAweDhmODYwMDVjLAotMHg4Zjg3MDExYywgMHgzYzA0MDAwMSwgMHgyNDg0NWZmYywgMHgzYzAxMDAwMSwKLTB4YWMzNjZlYTQsIDB4M2MwMTAwMDEsIDB4YWMyMDZlOTQsIDB4M2MwMTAwMDEsCi0weGFjM2M2ZThjLCAweDNjMDEwMDAxLCAweGFjM2I2ZWJjLCAweDNjMDEwMDAxLAotMHhhYzM3NmVjMCwgMHgzYzAxMDAwMSwgMHhhYzNhNmVhMCwgMHhjMDAyYjNiLAotMHgyNDA1MjQwMCwgMHg4ZjgyMDIwMCwgMHhhZmEyMDAxMCwgMHg4ZjgyMDIyMCwKLTB4YWZhMjAwMTQsIDB4OGY4NjAwNDQsIDB4OGY4NzAwNTAsIDB4M2MwNDAwMDEsCi0weDI0ODQ2MDA4LCAweGMwMDJiM2IsIDB4MjQwNTI1MDAsIDB4OGY4MzAwNjAsCi0weDc0MTAwYiwgMHgyNDIwMDBhLCAweDIwMGY4MjEsIDB4MCwKLTB4ZCwgMHg4ZmJmMDA2MCwgMHg4ZmJlMDA1YywgMHg4ZmI1MDA1OCwKLTB4OGZiMzAwNTQsIDB4OGZiMjAwNTAsIDB4OGZiMTAwNGMsIDB4OGZiMDAwNDgsCi0weDNlMDAwMDgsIDB4MjdiZDAwNjgsIDB4MjdiZGZmZTAsIDB4M2MwNDAwMDEsCi0weDI0ODQ2MDE0LCAweDI0MDUyNjAwLCAweDMwMjEsIDB4MzgyMSwKLTB4YWZiZjAwMTgsIDB4YWZhMDAwMTAsIDB4YzAwMmIzYiwgMHhhZmEwMDAxNCwKLTB4OGZiZjAwMTgsIDB4M2UwMDAwOCwgMHgyN2JkMDAyMCwgMHgzZTAwMDA4LAotMHgwLCAweDNlMDAwMDgsIDB4MCwgMHgwLAotMHgwLCAweDAsIDB4MCwgMHgwLAotMHgzZTAwMDA4LCAweDAsIDB4M2UwMDAwOCwgMHgwLAotMHgyN2JkZmRlMCwgMHgyN2E1MDAxOCwgMHgzYzA0ZGVhZCwgMHgzNDg0YmVlZiwKLTB4YWZiZjAyMTgsIDB4OGY4MjAxNTAsIDB4M2MwMzAwMWYsIDB4MzQ2M2ZmZmYsCi0weGFmYTQwMDE4LCAweGEyMjgyMywgMHhhMzI4MjQsIDB4OGNhMjAwMDAsCi0weDEwNDQwMDBhLCAweDAsIDB4YWZhNTAwMTAsIDB4OGNhMjAwMDAsCi0weGFmYTIwMDE0LCAweDhmODYwMTUwLCAweDhmODcwMjUwLCAweDNjMDQwMDAxLAotMHgyNDg0NjAxYywgMHhjMDAyYjNiLCAweDI0MDUyNzAwLCAweDhmYmYwMjE4LAotMHgzZTAwMDA4LCAweDI3YmQwMjIwLCAweDI3YmRmZmUwLCAweDNjMDZhYmJhLAotMHgzNGM2YmFiZSwgMHhhZmIwMDAxOCwgMHgzYzEwMDAwNCwgMHgzYzA3MDA3ZiwKLTB4MzRlN2ZmZmYsIDB4YWZiZjAwMWMsIDB4MTAyODQwLCAweDhlMDQwMDAwLAotMHg4Y2EzMDAwMCwgMHhhY2EwMDAwMCwgMHhhZTA2MDAwMCwgMHg4Y2EyMDAwMCwKLTB4YWNhMzAwMDAsIDB4MTA0NjAwMDUsIDB4YWUwNDAwMDAsIDB4YTA4MDIxLAotMHhmMDEwMmIsIDB4MTA0MGZmZjUsIDB4MTAyODQwLCAweDNjMDQwMDAxLAotMHgyNDg0NjAyOCwgMHgyNDA1MjgwMCwgMHgyMDAzMDIxLCAweDM4MjEsCi0weGFmYTAwMDEwLCAweGMwMDJiM2IsIDB4YWZhMDAwMTQsIDB4MjAwMTAyMSwKLTB4OGZiZjAwMWMsIDB4OGZiMDAwMTgsIDB4M2UwMDAwOCwgMHgyN2JkMDAyMCwKLTB4OGMwMjAyMjQsIDB4MzA0NzAwM2YsIDB4MTBlMDAwMTAsIDB4ODAzMDIxLAotMHgyODIxLCAweDI0MDMwMDIwLCAweGUzMTAyNCwgMHgxMDQwMDAwMiwKLTB4NjMwNDIsIDB4YTYyODIxLCAweDMxODQyLCAweDE0NjBmZmZiLAotMHhlMzEwMjQsIDB4MjQwMmYwMDAsIDB4YTIyODI0LCAweDM0MDJmZmZmLAotMHg0NTEwMmIsIDB4MTQ0MDAwMDMsIDB4M2MwMjAwMDEsIDB4MTAwMDAwMDgsCi0weDNjMDIwMDAxLCAweDM0NDJmZmZmLCAweDg1MTgyMywgMHg0MzEwMmIsCi0weDE0NDAwMDAzLCAweGEwMTAyMSwgMHgzYzAyZmZmZSwgMHg4MjEwMjEsCi0weDNlMDAwMDgsIDB4MCwgMHgyN2JkZmZkMCwgMHhhZmI1MDAyOCwKLTB4OGZiNTAwNDAsIDB4YWZiMjAwMjAsIDB4YTA5MDIxLCAweGFmYjEwMDFjLAotMHgyNGM2MDAwMywgMHhhZmJmMDAyYywgMHhhZmIzMDAyNCwgMHhhZmIwMDAxOCwKLTB4OGVhMjAwMDAsIDB4MjQwM2ZmZmMsIDB4YzM4MDI0LCAweDUwMTAyYiwKLTB4MTQ0MDAwMWIsIDB4ZTA4ODIxLCAweDhlMzMwMDAwLCAweGFmYjAwMDEwLAotMHg4ZWEyMDAwMCwgMHhhZmEyMDAxNCwgMHg4ZTI3MDAwMCwgMHgyNDA1MzAwMCwKLTB4YzAwMmIzYiwgMHgyNDAzMDIxLCAweDhlMjMwMDAwLCAweDcwMjAyMSwKLTB4NjQxMDJiLCAweDEwNDAwMDA3LCAweDI0MDI4MjEsIDB4OGNhMjAwMDAsCi0weGFjNjIwMDAwLCAweDI0NjMwMDA0LCAweDY0MTAyYiwgMHgxNDQwZmZmYiwKLTB4MjRhNTAwMDQsIDB4OGVhMjAwMDAsIDB4NTAxMDIzLCAweGFlYTIwMDAwLAotMHg4ZTIyMDAwMCwgMHg1MDEwMjEsIDB4MTAwMDAwMGIsIDB4YWUyMjAwMDAsCi0weDI0MDIwMDJkLCAweGEwODIwMDAwLCAweGFmYjAwMDEwLCAweDhlYTIwMDAwLAotMHgyNDA5ODIxLCAweGFmYTIwMDE0LCAweDhlMjcwMDAwLCAweDI0MDUzMTAwLAotMHhjMDAyYjNiLCAweDI2MDMwMjEsIDB4MjYwMTAyMSwgMHg4ZmJmMDAyYywKLTB4OGZiNTAwMjgsIDB4OGZiMzAwMjQsIDB4OGZiMjAwMjAsIDB4OGZiMTAwMWMsCi0weDhmYjAwMDE4LCAweDNlMDAwMDgsIDB4MjdiZDAwMzAsIDB4MjdiZGZmZTgsCi0weDNjMWNjMDAwLCAweDNjMDVmZmZlLCAweDNjMDMwMDAxLCAweDhjNjM2ZTg0LAotMHgzYzA0MDAwMSwgMHg4Yzg0NmU5MCwgMHgzNGE1YmYwOCwgMHgyNDAyMWZmYywKLTB4M2MwMTAwMDEsIDB4YWMyMjZjZDAsIDB4M2MwMjAwYzAsIDB4M2MwMTAwMDEsCi0weGFjMjI2Y2Q0LCAweDNjMDIwMDIwLCAweGFmYmYwMDEwLCAweDNjMDEwMGMwLAotMHhhYzIwMWZmYywgMHg0MzEwMjMsIDB4NDQxMDIzLCAweDI0NWJiMDAwLAotMHgzNjViODIxLCAweDNjMWQwMDAxLCAweDhmYmQ2Y2NjLCAweDNhMGYwMjEsCi0weDNjMDQwMGMwLCAweDM0ODQwMjAwLCAweDNjMWEwMGMwLCAweDNjMDMwMGMwLAotMHgzNDYzMDdjOCwgMHgyNDAyMWRmYywgMHgzYzAxMDAwMSwgMHhhYzIyNmNkMCwKLTB4MjQwMjE4MzQsIDB4M2MwMTAwMDEsIDB4YWMyNDZjZDQsIDB4M2MwMTAwMDEsCi0weGFjMjI2Y2QwLCAweDNjMDEwMDAxLCAweGFjMjM2Y2Q0LCAweGMwMDE4MGQsCi0weDM3NWEwMjAwLCAweDhmYmYwMDEwLCAweDNlMDAwMDgsIDB4MjdiZDAwMTgsCi0weDI3YmRmZmM4LCAweDNjMDQwMDAxLCAweDI0ODQ2MDM0LCAweDI0MDUzMjAwLAotMHgzYzAyMDAwMSwgMHg4YzQyNmNkMCwgMHgzYzAzMDAwMSwgMHg4YzYzNmNkNCwKLTB4MzAyMSwgMHgzNjAzODIxLCAweGFmYmYwMDMwLCAweGFmYjMwMDJjLAotMHhhZmIyMDAyOCwgMHhhZmIxMDAyNCwgMHhhZmIwMDAyMCwgMHhhZmEyMDAxYywKLTB4YWZhMzAwMTgsIDB4YWZiNzAwMTAsIDB4YzAwMmIzYiwgMHhhZmJhMDAxNCwKLTB4YzAwMTkxNiwgMHgwLCAweDhmODIwMjQwLCAweDM0NDIwMDA0LAotMHhhZjgyMDI0MCwgMHgyNDAyMDAwMSwgMHhhZjQyMDAwMCwgMHgzYzAyMDAwMSwKLTB4NTcxMDIxLCAweDkwNDI0MGY0LCAweDEwNDAwMDkyLCAweDI0MDNmZmZjLAotMHgzYzEwMDAwMSwgMHgyNjEwYWM3MywgMHgzYzEyMDAwMSwgMHgyNjUyYTg0YywKLTB4MjEyMTAyMywgMHg0MzgwMjQsIDB4OGZhMzAwMWMsIDB4M2MwNDAwMDEsCi0weDI0ODQ2MDQwLCAweDcwMTAyYiwgMHgxNDQwMDAxYSwgMHgyN2IzMDAxOCwKLTB4OGZiMTAwMTgsIDB4MjQwNTMwMDAsIDB4MjQwMzAyMSwgMHhhZmIwMDAxMCwKLTB4YWZhMzAwMTQsIDB4YzAwMmIzYiwgMHgyMjAzODIxLCAweDhmYTMwMDE4LAotMHg3MDIwMjEsIDB4NjQxMDJiLCAweDEwNDAwMDA3LCAweDI0MDMwMjEsCi0weDhjYzIwMDAwLCAweGFjNjIwMDAwLCAweDI0NjMwMDA0LCAweDY0MTAyYiwKLTB4MTQ0MGZmZmIsIDB4MjRjNjAwMDQsIDB4OGZhMjAwMWMsIDB4NTAxMDIzLAotMHhhZmEyMDAxYywgMHg4ZTYyMDAwMCwgMHg1MDEwMjEsIDB4MTAwMDAwMGEsCi0weGFlNjIwMDAwLCAweDI0MDg4MjEsIDB4MjQwNTMxMDAsIDB4YWZiMDAwMTAsCi0weGFmYTMwMDE0LCAweDhmYTcwMDE4LCAweDIyMDMwMjEsIDB4MjQwMjAwMmQsCi0weGMwMDJiM2IsIDB4YTA4MjAwMDAsIDB4MjQwNzAwMjAsIDB4OGZhMzAwMWMsCi0weDNjMDQwMDAxLCAweDI0ODQ2MDVjLCAweDI0MTIwMDIwLCAweDNjMDEwMDAxLAotMHhhYzMxNmViMCwgMHgyYzYyMDAyMCwgMHgxNDQwMDAxZCwgMHgyN2IxMDAxOCwKLTB4OGZiMDAwMTgsIDB4MjQwNTMwMDAsIDB4M2MwNjAwMDEsIDB4MjRjNjZmNTAsCi0weGFmYTcwMDEwLCAweGFmYTMwMDE0LCAweGMwMDJiM2IsIDB4MjAwMzgyMSwKLTB4OGZhMzAwMTgsIDB4M2MwNDAwMDEsIDB4MjQ4NDZmNTAsIDB4MjQ2NTAwMjAsCi0weDY1MTAyYiwgMHgxMDQwMDAwNywgMHgwLCAweDhjODIwMDAwLAotMHhhYzYyMDAwMCwgMHgyNDYzMDAwNCwgMHg2NTEwMmIsIDB4MTQ0MGZmZmIsCi0weDI0ODQwMDA0LCAweDhmYTIwMDFjLCAweDUyMTAyMywgMHhhZmEyMDAxYywKLTB4OGUyMjAwMDAsIDB4NTIxMDIxLCAweDEwMDAwMDBiLCAweGFlMjIwMDAwLAotMHgzYzEwMDAwMSwgMHgyNjEwNmY1MCwgMHgyNDA1MzEwMCwgMHhhZmE3MDAxMCwKLTB4YWZhMzAwMTQsIDB4OGZhNzAwMTgsIDB4MjAwMzAyMSwgMHgyNDAyMDAyZCwKLTB4YzAwMmIzYiwgMHhhMDgyMDAwMCwgMHgyNDA3MDAyMCwgMHgzYzA0MDAwMSwKLTB4MjQ4NDYwNzAsIDB4OGZhMzAwMWMsIDB4MjQxMjAwMjAsIDB4M2MwMTAwMDEsCi0weGFjMzA2ZWU0LCAweDJjNjIwMDIwLCAweDE0NDAwMDFkLCAweDI3YjEwMDE4LAotMHg4ZmIwMDAxOCwgMHgyNDA1MzAwMCwgMHgzYzA2MDAwMSwgMHgyNGM2NmY3MCwKLTB4YWZhNzAwMTAsIDB4YWZhMzAwMTQsIDB4YzAwMmIzYiwgMHgyMDAzODIxLAotMHg4ZmEzMDAxOCwgMHgzYzA0MDAwMSwgMHgyNDg0NmY3MCwgMHgyNDY1MDAyMCwKLTB4NjUxMDJiLCAweDEwNDAwMDA3LCAweDAsIDB4OGM4MjAwMDAsCi0weGFjNjIwMDAwLCAweDI0NjMwMDA0LCAweDY1MTAyYiwgMHgxNDQwZmZmYiwKLTB4MjQ4NDAwMDQsIDB4OGZhMjAwMWMsIDB4NTIxMDIzLCAweGFmYTIwMDFjLAotMHg4ZTIyMDAwMCwgMHg1MjEwMjEsIDB4MTAwMDAwMGIsIDB4YWUyMjAwMDAsCi0weDNjMTAwMDAxLCAweDI2MTA2ZjcwLCAweDI0MDUzMTAwLCAweGFmYTcwMDEwLAotMHhhZmEzMDAxNCwgMHg4ZmE3MDAxOCwgMHgyMDAzMDIxLCAweDI0MDIwMDJkLAotMHhjMDAyYjNiLCAweGEwODIwMDAwLCAweDNjMDEwMDAxLCAweDEwMDAwMDMxLAotMHhhYzMwNmVlMCwgMHgzYzEwMDAwMSwgMHgyNjEwODIxZiwgMHgzYzEyMDAwMSwKLTB4MjY1MjgwOWMsIDB4MjEyMTAyMywgMHg0MzgwMjQsIDB4OGZhMzAwMWMsCi0weDNjMDQwMDAxLCAweDI0ODQ2MDg0LCAweDcwMTAyYiwgMHgxNDQwMDAxYSwKLTB4MjdiMzAwMTgsIDB4OGZiMTAwMTgsIDB4MjQwNTMwMDAsIDB4MjQwMzAyMSwKLTB4YWZiMDAwMTAsIDB4YWZhMzAwMTQsIDB4YzAwMmIzYiwgMHgyMjAzODIxLAotMHg4ZmEzMDAxOCwgMHg3MDIwMjEsIDB4NjQxMDJiLCAweDEwNDAwMDA3LAotMHgyNDAzMDIxLCAweDhjYzIwMDAwLCAweGFjNjIwMDAwLCAweDI0NjMwMDA0LAotMHg2NDEwMmIsIDB4MTQ0MGZmZmIsIDB4MjRjNjAwMDQsIDB4OGZhMjAwMWMsCi0weDUwMTAyMywgMHhhZmEyMDAxYywgMHg4ZTYyMDAwMCwgMHg1MDEwMjEsCi0weDEwMDAwMDBhLCAweGFlNjIwMDAwLCAweDI0MDg4MjEsIDB4MjQwNTMxMDAsCi0weGFmYjAwMDEwLCAweGFmYTMwMDE0LCAweDhmYTcwMDE4LCAweDIyMDMwMjEsCi0weDI0MDIwMDJkLCAweGMwMDJiM2IsIDB4YTA4MjAwMDAsIDB4M2MwMTAwMDEsCi0weGFjMzE2ZWIwLCAweDNjMDMwMDAxLCAweDhjNjM2ZWIwLCAweDI0MDIwNDAwLAotMHg2MGY4MDksIDB4YWY4MjAwNzAsIDB4OGZiZjAwMzAsIDB4OGZiMzAwMmMsCi0weDhmYjIwMDI4LCAweDhmYjEwMDI0LCAweDhmYjAwMDIwLCAweDNlMDAwMDgsCi0weDI3YmQwMDM4LCAweDAsIDB4MCwgMHg4ZjgyMDA0MCwKLTB4M2MwM2YwMDAsIDB4NDMxMDI0LCAweDNjMDM2MDAwLCAweDE0NDMwMDA2LAotMHgwLCAweDhmODIwMDUwLCAweDI0MDNmZjgwLCAweDQzMTAyNCwKLTB4MzQ0MjAwNTUsIDB4YWY4MjAwNTAsIDB4OGY4MjAwNTQsIDB4MjQ0MjAzZTgsCi0weGFmODIwMDU4LCAweDI0MDIwMWY0LCAweGFmNDIwMGUwLCAweDI0MDIwMDA0LAotMHhhZjQyMDBlOCwgMHgyNDAyMDAwMiwgMHhhZjQwMDFiMCwgMHhhZjQwMDBlNCwKLTB4YWY0MjAwZGMsIDB4YWY0MDAwZDgsIDB4YWY0MDAwZDQsIDB4M2UwMDAwOCwKLTB4YWY0MDAwZDAsIDB4OGY4MjAwNTQsIDB4MjQ0MjAwMDUsIDB4M2UwMDAwOCwKLTB4YWY4MjAwNzgsIDB4MjdiZGZmZTgsIDB4YWZiZjAwMTAsIDB4OGY4MjAwNTQsCi0weDI0NDIwM2U4LCAweGFmODIwMDU4LCAweDNjMDIwODAwLCAweDJjMjEwMjQsCi0weDEwNDAwMDA0LCAweDNjMDJmN2ZmLCAweDM0NDJmZmZmLCAweDJjMmIwMjQsCi0weDM2OTQwMDQwLCAweDNjMDIwMDAxLCAweDhjNDI2ZGE4LCAweDEwNDAwMDE3LAotMHgzYzAyMDIwMCwgMHgzYzAzMDAwMSwgMHg4YzYzNmYxYywgMHgxMDYwMDAxNiwKLTB4MjgyYTAyNSwgMHgzYzAyMDAwMSwgMHg4YzQyNmU0NCwgMHgxNDQwMDAxMiwKLTB4M2MwMjAyMDAsIDB4M2MwMjAwMDEsIDB4OGM0MjZkOTQsIDB4MzA0MjAwMDMsCi0weDE0NDAwMDBkLCAweDNjMDIwMjAwLCAweDhmODMwMjI0LCAweDNjMDIwMDAyLAotMHg4YzQyOGZlYywgMHgxMDYyMDAwOCwgMHgzYzAyMDIwMCwgMHhjMDAzZGFmLAotMHgwLCAweDEwMDAwMDA0LCAweDNjMDIwMjAwLCAweGMwMDQxOTYsCi0weDAsIDB4M2MwMjAyMDAsIDB4MmMyMTAyNCwgMHgxMDQwMDAwMywKLTB4MCwgMHhjMDAxZjRiLCAweDAsIDB4OGY0MjAwZDgsCi0weDhmNDMwMGRjLCAweDI0NDIwMDAxLCAweGFmNDIwMGQ4LCAweDQzMTAyYiwKLTB4MTQ0MDAwMDMsIDB4MCwgMHhhZjQwMDBkOCwgMHgzNjk0MDA4MCwKLTB4OGMwMzAyMzgsIDB4MTA2MDAwMGMsIDB4MCwgMHg4ZjQyMDFiMCwKLTB4MjQ0MjAzZTgsIDB4YWY0MjAxYjAsIDB4NDMxMDJiLCAweDE0NDAwMDA2LAotMHgwLCAweDkzNDIwNWM1LCAweDE0NDAwMDAzLCAweDAsCi0weGMwMDFkYTAsIDB4MCwgMHg4ZmJmMDAxMCwgMHgzZTAwMDA4LAotMHgyN2JkMDAxOCwgMHgzZTAwMDA4LCAweDAsIDB4MjdiZGZmZDgsCi0weGFmYmYwMDIwLCAweDhmNDMwMDJjLCAweDhmNDIwMDM4LCAweDEwNjIwMDU5LAotMHgwLCAweDNjMDIwMDAxLCAweDU3MTAyMSwgMHg5MDQyNDBmMCwKLTB4MTA0MDAwMjYsIDB4MjQwNzAwMDgsIDB4OGY0NDAxNzAsIDB4OGY0NTAxNzQsCi0weDhmNDgwMDBjLCAweDhmODYwMTIwLCAweDI0MDIwMDIwLCAweGFmYTIwMDEwLAotMHhhZmEzMDAxNCwgMHhhZmE4MDAxOCwgMHg4ZjQyMDEwYywgMHg0MGY4MDksCi0weDI0YzYwMDFjLCAweDE0NDAwMDExLCAweDI0MDIwMDAxLCAweDNjMDEwMDAxLAotMHgzNzA4MjEsIDB4YTAyMjQwZjAsIDB4OGY4MjAxMjQsIDB4YWZhMjAwMTAsCi0weDhmODIwMTI4LCAweDNjMDQwMDAxLCAweDI0ODQ2MTI4LCAweGFmYTIwMDE0LAotMHg4ZjQ2MDAyYywgMHg4Zjg3MDEyMCwgMHgzYzA1MDAwOSwgMHhjMDAyYjNiLAotMHgzNGE1MDkwMCwgMHgxMDAwMDA1YywgMHgwLCAweDhmNDIwMzAwLAotMHgyNDQyMDAwMSwgMHhhZjQyMDMwMCwgMHg4ZjQyMDMwMCwgMHg4ZjQyMDAyYywKLTB4YTM0MDA1YzEsIDB4MTAwMDAwMjcsIDB4YWY0MjAwMzgsIDB4OGY0NDAxNzAsCi0weDhmNDUwMTc0LCAweDhmNDMwMDJjLCAweDhmNDgwMDBjLCAweDhmODYwMTIwLAotMHgyNDAyMDA4MCwgMHhhZmEyMDAxMCwgMHhhZmEzMDAxNCwgMHhhZmE4MDAxOCwKLTB4OGY0MjAxMGMsIDB4NDBmODA5LCAweDI0YzYwMDFjLCAweDE0NDAwMDExLAotMHgyNDAyMDAwMSwgMHgzYzAxMDAwMSwgMHgzNzA4MjEsIDB4YTAyMjQwZjEsCi0weDhmODIwMTI0LCAweGFmYTIwMDEwLCAweDhmODIwMTI4LCAweDNjMDQwMDAxLAotMHgyNDg0NjEzNCwgMHhhZmEyMDAxNCwgMHg4ZjQ2MDAyYywgMHg4Zjg3MDEyMCwKLTB4M2MwNTAwMDksIDB4YzAwMmIzYiwgMHgzNGE1MTEwMCwgMHgxMDAwMDAzNiwKLTB4MCwgMHg4ZjQyMDMwMCwgMHg4ZjQzMDAyYywgMHgyNDQyMDAwMSwKLTB4YWY0MjAzMDAsIDB4OGY0MjAzMDAsIDB4MjQwMjAwMDEsIDB4YTM0MjA1YzEsCi0weGFmNDMwMDM4LCAweDNjMDEwMDAxLCAweDM3MDgyMSwgMHhhMDIwNDBmMSwKLTB4M2MwMTAwMDEsIDB4MzcwODIxLCAweGEwMjA0MGYwLCAweDEwMDAwMDI2LAotMHhhZjQwMDAzNCwgMHg5MzQyMDVjMSwgMHgxMDQwMDAxZCwgMHgwLAotMHhhMzQwMDVjMSwgMHg4ZjgyMDA0MCwgMHgzMDQyMDAwMSwgMHgxNDQwMDAwOCwKLTB4MjAyMSwgMHg4YzAzMDEwNCwgMHgyNDAyMDAwMSwgMHg1MDYyMDAwNSwKLTB4MjQwNDAwMDEsIDB4OGMwMjAyNjQsIDB4MTA0MDAwMDMsIDB4ODAxMDIxLAotMHgyNDA0MDAwMSwgMHg4MDEwMjEsIDB4MTA0MDAwMDYsIDB4MCwKLTB4OGY0MjAzMGMsIDB4MjQ0MjAwMDEsIDB4YWY0MjAzMGMsIDB4MTAwMDAwMDgsCi0weDhmNDIwMzBjLCAweDhmODIwMDQ0LCAweDM0NDIwMDA0LCAweGFmODIwMDQ0LAotMHg4ZjQyMDMwOCwgMHgyNDQyMDAwMSwgMHhhZjQyMDMwOCwgMHg4ZjQyMDMwOCwKLTB4M2MwMTAwMDEsIDB4MzcwODIxLCAweGEwMjA0MGYwLCAweDNjMDEwMDAxLAotMHgzNzA4MjEsIDB4YTAyMDQwZjEsIDB4OGY0MjAwMDAsIDB4MTA0MDAwMDcsCi0weDAsIDB4YWY4MDAwNGMsIDB4OGY4MjAwNGMsIDB4MTA0MGZmZmQsCi0weDAsIDB4MTAwMDAwMDUsIDB4MCwgMHhhZjgwMDA0OCwKLTB4OGY4MjAwNDgsIDB4MTA0MGZmZmQsIDB4MCwgMHg4ZjgyMDA2MCwKLTB4M2MwM2ZmN2YsIDB4MzQ2M2ZmZmYsIDB4NDMxMDI0LCAweGFmODIwMDYwLAotMHg4ZjQyMDAwMCwgMHgxMDQwMDAwMywgMHgwLCAweDEwMDAwMDAyLAotMHhhZjgwMDA0YywgMHhhZjgwMDA0OCwgMHg4ZmJmMDAyMCwgMHgzZTAwMDA4LAotMHgyN2JkMDAyOCwgMHgzZTAwMDA4LCAweDAsIDB4MjdiZGZmZDgsCi0weGFmYmYwMDIwLCAweDhmNDMwMDQ0LCAweDhmNDIwMDdjLCAweDEwNjIwMDI5LAotMHgyNDA3MDAwOCwgMHg4ZjQ0MDE2OCwgMHg4ZjQ1MDE2YywgMHg4ZjQ4MDAwYywKLTB4OGY4NjAxMjAsIDB4MjQwMjAwNDAsIDB4YWZhMjAwMTAsIDB4YWZhMzAwMTQsCi0weGFmYTgwMDE4LCAweDhmNDIwMTBjLCAweDQwZjgwOSwgMHgyNGM2MDAxYywKLTB4MTQ0MDAwMTEsIDB4MjQwMjAwMDEsIDB4M2MwMTAwMDEsIDB4MzcwODIxLAotMHhhMDIyNDBmMiwgMHg4ZjgyMDEyNCwgMHhhZmEyMDAxMCwgMHg4ZjgyMDEyOCwKLTB4M2MwNDAwMDEsIDB4MjQ4NDYxM2MsIDB4YWZhMjAwMTQsIDB4OGY0NjAwNDQsCi0weDhmODcwMTIwLCAweDNjMDUwMDA5LCAweGMwMDJiM2IsIDB4MzRhNTEzMDAsCi0weDEwMDAwMDBmLCAweDAsIDB4OGY0MjAzMDQsIDB4MjQ0MjAwMDEsCi0weGFmNDIwMzA0LCAweDhmNDIwMzA0LCAweDhmNDIwMDQ0LCAweGFmNDIwMDdjLAotMHgzYzAxMDAwMSwgMHgzNzA4MjEsIDB4YTAyMDQwZjIsIDB4MTAwMDAwMDQsCi0weGFmNDAwMDc4LCAweDNjMDEwMDAxLCAweDM3MDgyMSwgMHhhMDIwNDBmMiwKLTB4OGY0MjAwMDAsIDB4MTA0MDAwMDcsIDB4MCwgMHhhZjgwMDA0YywKLTB4OGY4MjAwNGMsIDB4MTA0MGZmZmQsIDB4MCwgMHgxMDAwMDAwNSwKLTB4MCwgMHhhZjgwMDA0OCwgMHg4ZjgyMDA0OCwgMHgxMDQwZmZmZCwKLTB4MCwgMHg4ZjgyMDA2MCwgMHgzYzAzZmVmZiwgMHgzNDYzZmZmZiwKLTB4NDMxMDI0LCAweGFmODIwMDYwLCAweDhmNDIwMDAwLCAweDEwNDAwMDAzLAotMHgwLCAweDEwMDAwMDAyLCAweGFmODAwMDRjLCAweGFmODAwMDQ4LAotMHg4ZmJmMDAyMCwgMHgzZTAwMDA4LCAweDI3YmQwMDI4LCAweDNlMDAwMDgsCi0weDAsIDB4M2MwMjAwMDEsIDB4OGM0MjZkYTgsIDB4MjdiZGZmYTgsCi0weGFmYmYwMDUwLCAweGFmYmUwMDRjLCAweGFmYjUwMDQ4LCAweGFmYjMwMDQ0LAotMHhhZmIyMDA0MCwgMHhhZmIxMDAzYywgMHhhZmIwMDAzOCwgMHgxMDQwMDBkNSwKLTB4OGY5MDAwNDQsIDB4OGY0MjAwZDAsIDB4MjQ0MzAwMDEsIDB4Mjg0MjAwMGIsCi0weDE0NDAwMGU0LCAweGFmNDMwMGQwLCAweDhmNDIwMDA0LCAweDMwNDIwMDAyLAotMHgxNDQwMDA5YywgMHhhZjQwMDBkMCwgMHg4ZjQyMDAwNCwgMHgzYzAzMDAwMSwKLTB4OGM2MzZkOTgsIDB4MzQ0MjAwMDIsIDB4YWY0MjAwMDQsIDB4MjQwMjAwMDEsCi0weDE0NjIwMDAzLCAweDNjMDIwNjAwLCAweDEwMDAwMDAyLCAweDM0NDIzMDAwLAotMHgzNDQyMTAwMCwgMHhhZmEyMDAyMCwgMHg4ZjRhMDAxOCwgMHhhZmFhMDAzNCwKLTB4MjdhYTAwMjAsIDB4YWZhYTAwMmMsIDB4OGZhYTAwMzQsIDB4MjQwMjAwZmYsCi0weDExNDIwMDAyLCAweDE4MjEsIDB4MjU0MzAwMDEsIDB4OGMwMjAyMjgsCi0weDYwOTgyMSwgMHgxNjYyMDAwZSwgMHgzYzA1MDAwOSwgMHg4ZjQyMDMzYywKLTB4MjQ0MjAwMDEsIDB4YWY0MjAzM2MsIDB4OGY0MjAzM2MsIDB4OGMwMjAyMjgsCi0weDhmYTcwMDM0LCAweDNjMDQwMDAxLCAweDI0ODQ2MTBjLCAweGFmYTAwMDE0LAotMHhhZmEyMDAxMCwgMHg4ZmE2MDAyMCwgMHgxMDAwMDA3MCwgMHgzNGE1MDUwMCwKLTB4OGZhYTAwMzQsIDB4YTM4YzAsIDB4ZjcxMDIxLCAweDhmYTMwMDIwLAotMHg4ZmE0MDAyNCwgMHhhYzQzMDRjMCwgMHhhYzQ0MDRjNCwgMHg4ZjgzMDA1NCwKLTB4OGY4MjAwNTQsIDB4MjQ3MTAzZTgsIDB4MjIyMTAyMywgMHgyYzQyMDNlOSwKLTB4MTA0MDAwMWIsIDB4YTgyMSwgMHhlMDkwMjEsIDB4MjY1ZTA0YzAsCi0weDhmNDQwMTc4LCAweDhmNDUwMTdjLCAweDI0MDE4MjEsIDB4MjQwYTAwMDQsCi0weGFmYWEwMDEwLCAweGFmYjMwMDE0LCAweDhmNDgwMDBjLCAweDEwMjEsCi0weDJmZTMwMjEsIDB4YWZhODAwMTgsIDB4OGY0ODAxMGMsIDB4MjQwNzAwMDgsCi0weGEzMjgyMSwgMHhhMzQ4MmIsIDB4ODIyMDIxLCAweDEwMGY4MDksCi0weDg5MjAyMSwgMHg1NDQwMDAwNiwgMHgyNDE1MDAwMSwgMHg4ZjgyMDA1NCwKLTB4MjIyMTAyMywgMHgyYzQyMDNlOSwgMHgxNDQwZmZlOSwgMHgwLAotMHgzMmEyMDBmZiwgMHg1NDQwMDAxOCwgMHhhZjUzMDAxOCwgMHg4ZjQyMDM3OCwKLTB4MjQ0MjAwMDEsIDB4YWY0MjAzNzgsIDB4OGY0MjAzNzgsIDB4OGY4MjAxMjAsCi0weDhmYWEwMDJjLCAweDhmYTcwMDM0LCAweGFmYTIwMDEwLCAweDhmODIwMTI0LAotMHgzYzA0MDAwMSwgMHgyNDg0NjExOCwgMHhhZmEyMDAxNCwgMHg4ZDQ2MDAwMCwKLTB4M2MwNTAwMDksIDB4MTAwMDAwMzUsIDB4MzRhNTA2MDAsIDB4OGY0MjAzMDgsCi0weDI0MTUwMDAxLCAweDI0NDIwMDAxLCAweGFmNDIwMzA4LCAweDhmNDIwMzA4LAotMHgxMDAwMDAxZSwgMHgzMmEyMDBmZiwgMHg4ZjgzMDA1NCwgMHg4ZjgyMDA1NCwKLTB4MjQ3MTAzZTgsIDB4MjIyMTAyMywgMHgyYzQyMDNlOSwgMHgxMDQwMDAxNiwKLTB4YTgyMSwgMHgzYzFlMDAyMCwgMHgyNDEyMDAxMCwgMHg4ZjQyMDAwYywKLTB4OGY0NDAxNjAsIDB4OGY0NTAxNjQsIDB4OGY4NjAxMjAsIDB4YWZiMjAwMTAsCi0weGFmYjMwMDE0LCAweDVlMTAyNSwgMHhhZmEyMDAxOCwgMHg4ZjQyMDEwYywKLTB4MjQwNzAwMDgsIDB4NDBmODA5LCAweDI0YzYwMDFjLCAweDE0NDBmZmUzLAotMHgwLCAweDhmODIwMDU0LCAweDIyMjEwMjMsIDB4MmM0MjAzZTksCi0weDE0NDBmZmVlLCAweDAsIDB4MzJhMjAwZmYsIDB4MTQ0MDAwMTEsCi0weDNjMDUwMDA5LCAweDhmNDIwMzc4LCAweDI0NDIwMDAxLCAweGFmNDIwMzc4LAotMHg4ZjQyMDM3OCwgMHg4ZjgyMDEyMCwgMHg4ZmFhMDAyYywgMHg4ZmE3MDAzNCwKLTB4YWZhMjAwMTAsIDB4OGY4MjAxMjQsIDB4M2MwNDAwMDEsIDB4MjQ4NDYxMjAsCi0weGFmYTIwMDE0LCAweDhkNDYwMDAwLCAweDM0YTUwNzAwLCAweGMwMDJiM2IsCi0weDAsIDB4OGY0MjAyZWMsIDB4MjQ0MjAwMDEsIDB4YWY0MjAyZWMsCi0weDhmNDIwMmVjLCAweDhmNDIwMDA0LCAweDMwNDIwMDAxLCAweDUwNDAwMDI5LAotMHgzNjEwMDA0MCwgMHgzYzAyMDQwMCwgMHgyYzIxMDI0LCAweDEwNDAwMDEzLAotMHgyNDA0ZmZkZiwgMHg4ZjQyMDI1MCwgMHg4ZjQzMDI1NCwgMHg4ZjQ0MDFiNCwKLTB4MTQ2NDAwMDYsIDB4MzYxMDAwNDAsIDB4OGY0MjAyNzAsIDB4OGY0MzAyNzQsCi0weDhmNDQwMWI4LCAweDEwNjQwMDA3LCAweDI0MDJmZmRmLCAweDhmNDIwMjUwLAotMHg4ZjQzMDI1NCwgMHg4ZjQ0MDI3MCwgMHg4ZjQ1MDI3NCwgMHgxMDAwMDAxMiwKLTB4M2ExMDAwMjAsIDB4MTAwMDAwMmIsIDB4MjAyODAyNCwgMHg4ZjQyMDI1MCwKLTB4OGY0MzAyNTQsIDB4OGY0NTAxYjQsIDB4MTQ2NTAwMDYsIDB4MjA0ODAyNCwKLTB4OGY0MjAyNzAsIDB4OGY0MzAyNzQsIDB4OGY0NDAxYjgsIDB4NTA2NDAwMjEsCi0weDM2MTAwMDQwLCAweDhmNDIwMjUwLCAweDhmNDMwMjU0LCAweDhmNDQwMjcwLAotMHg4ZjQ1MDI3NCwgMHgzYTEwMDA0MCwgMHhhZjQzMDFiNCwgMHgxMDAwMDAxOSwKLTB4YWY0NTAxYjgsIDB4OGY0MjAwZDQsIDB4MjQ0MzAwMDEsIDB4MTAwMDAwMTEsCi0weDI4NDIwMDMzLCAweDhmNDIwMDA0LCAweDMwNDIwMDAxLCAweDEwNDAwMDA5LAotMHgzYzAyMDQwMCwgMHgyYzIxMDI0LCAweDEwNDAwMDA0LCAweDI0MDJmZmRmLAotMHgyMDI4MDI0LCAweDEwMDAwMDBiLCAweDM2MTAwMDQwLCAweDEwMDAwMDA5LAotMHgzNjEwMDA2MCwgMHg4ZjQyMDBkNCwgMHgzNjEwMDA0MCwgMHgyNDQzMDAwMSwKLTB4Mjg0MjAxZjUsIDB4MTQ0MDAwMDMsIDB4YWY0MzAwZDQsIDB4YWY0MDAwZDQsCi0weDNhMTAwMDIwLCAweGFmOTAwMDQ0LCAweDI0MDJmZjdmLCAweDI4MmEwMjQsCi0weDhmYmYwMDUwLCAweDhmYmUwMDRjLCAweDhmYjUwMDQ4LCAweDhmYjMwMDQ0LAotMHg4ZmIyMDA0MCwgMHg4ZmIxMDAzYywgMHg4ZmIwMDAzOCwgMHgzZTAwMDA4LAotMHgyN2JkMDA1OCwgMHgzZTAwMDA4LCAweDAsIDB4M2MwMjAwMDEsCi0weDhjNDI2ZGE4LCAweDI3YmRmZmIwLCAweGFmYmYwMDQ4LCAweGFmYmUwMDQ0LAotMHhhZmI1MDA0MCwgMHhhZmIzMDAzYywgMHhhZmIyMDAzOCwgMHhhZmIxMDAzNCwKLTB4MTA0MDAwYzcsIDB4YWZiMDAwMzAsIDB4OGY0MjAwZDAsIDB4MjQ0MzAwMDEsCi0weDI4NDIwMDBiLCAweDE0NDAwMGRhLCAweGFmNDMwMGQwLCAweDhmNDIwMDA0LAotMHgzMDQyMDAwMiwgMHgxNDQwMDA5NywgMHhhZjQwMDBkMCwgMHg4ZjQyMDAwNCwKLTB4M2MwMzAwMDEsIDB4OGM2MzZkOTgsIDB4MzQ0MjAwMDIsIDB4YWY0MjAwMDQsCi0weDI0MDIwMDAxLCAweDE0NjIwMDAzLCAweDNjMDIwNjAwLCAweDEwMDAwMDAyLAotMHgzNDQyMzAwMCwgMHgzNDQyMTAwMCwgMHhhZmEyMDAyMCwgMHgxODIxLAotMHg4ZjVlMDAxOCwgMHgyN2FhMDAyMCwgMHgyNDAyMDBmZiwgMHgxM2MyMDAwMiwKLTB4YWZhYTAwMmMsIDB4MjdjMzAwMDEsIDB4OGMwMjAyMjgsIDB4NjA5MDIxLAotMHgxNjQyMDAwZSwgMHgxZTM4YzAsIDB4OGY0MjAzM2MsIDB4MjQ0MjAwMDEsCi0weGFmNDIwMzNjLCAweDhmNDIwMzNjLCAweDhjMDIwMjI4LCAweDNjMDQwMDAxLAotMHgyNDg0NjEwYywgMHgzYzA1MDAwOSwgMHhhZmEwMDAxNCwgMHhhZmEyMDAxMCwKLTB4OGZhNjAwMjAsIDB4MTAwMDAwNmQsIDB4MzRhNTA1MDAsIDB4ZjcxMDIxLAotMHg4ZmEzMDAyMCwgMHg4ZmE0MDAyNCwgMHhhYzQzMDRjMCwgMHhhYzQ0MDRjNCwKLTB4OGY4MzAwNTQsIDB4OGY4MjAwNTQsIDB4MjQ3MDAzZTgsIDB4MjAyMTAyMywKLTB4MmM0MjAzZTksIDB4MTA0MDAwMWIsIDB4OTgyMSwgMHhlMDg4MjEsCi0weDI2MzUwNGMwLCAweDhmNDQwMTc4LCAweDhmNDUwMTdjLCAweDIyMDE4MjEsCi0weDI0MGEwMDA0LCAweGFmYWEwMDEwLCAweGFmYjIwMDE0LCAweDhmNDgwMDBjLAotMHgxMDIxLCAweDJmNTMwMjEsIDB4YWZhODAwMTgsIDB4OGY0ODAxMGMsCi0weDI0MDcwMDA4LCAweGEzMjgyMSwgMHhhMzQ4MmIsIDB4ODIyMDIxLAotMHgxMDBmODA5LCAweDg5MjAyMSwgMHg1NDQwMDAwNiwgMHgyNDEzMDAwMSwKLTB4OGY4MjAwNTQsIDB4MjAyMTAyMywgMHgyYzQyMDNlOSwgMHgxNDQwZmZlOSwKLTB4MCwgMHgzMjYyMDBmZiwgMHg1NDQwMDAxNywgMHhhZjUyMDAxOCwKLTB4OGY0MjAzNzgsIDB4MjQ0MjAwMDEsIDB4YWY0MjAzNzgsIDB4OGY0MjAzNzgsCi0weDhmODIwMTIwLCAweDhmYWEwMDJjLCAweGFmYTIwMDEwLCAweDhmODIwMTI0LAotMHgzYzA0MDAwMSwgMHgyNDg0NjExOCwgMHgzYzA1MDAwOSwgMHhhZmEyMDAxNCwKLTB4OGQ0NjAwMDAsIDB4MTAwMDAwMzUsIDB4MzRhNTA2MDAsIDB4OGY0MjAzMDgsCi0weDI0MTMwMDAxLCAweDI0NDIwMDAxLCAweGFmNDIwMzA4LCAweDhmNDIwMzA4LAotMHgxMDAwMDAxZSwgMHgzMjYyMDBmZiwgMHg4ZjgzMDA1NCwgMHg4ZjgyMDA1NCwKLTB4MjQ3MDAzZTgsIDB4MjAyMTAyMywgMHgyYzQyMDNlOSwgMHgxMDQwMDAxNiwKLTB4OTgyMSwgMHgzYzE1MDAyMCwgMHgyNDExMDAxMCwgMHg4ZjQyMDAwYywKLTB4OGY0NDAxNjAsIDB4OGY0NTAxNjQsIDB4OGY4NjAxMjAsIDB4YWZiMTAwMTAsCi0weGFmYjIwMDE0LCAweDU1MTAyNSwgMHhhZmEyMDAxOCwgMHg4ZjQyMDEwYywKLTB4MjQwNzAwMDgsIDB4NDBmODA5LCAweDI0YzYwMDFjLCAweDE0NDBmZmUzLAotMHgwLCAweDhmODIwMDU0LCAweDIwMjEwMjMsIDB4MmM0MjAzZTksCi0weDE0NDBmZmVlLCAweDAsIDB4MzI2MjAwZmYsIDB4MTQ0MDAwMTEsCi0weDAsIDB4OGY0MjAzNzgsIDB4MjQ0MjAwMDEsIDB4YWY0MjAzNzgsCi0weDhmNDIwMzc4LCAweDhmODIwMTIwLCAweDhmYWEwMDJjLCAweGFmYTIwMDEwLAotMHg4ZjgyMDEyNCwgMHgzYzA0MDAwMSwgMHgyNDg0NjEyMCwgMHgzYzA1MDAwOSwKLTB4YWZhMjAwMTQsIDB4OGQ0NjAwMDAsIDB4MzRhNTA3MDAsIDB4YzAwMmIzYiwKLTB4M2MwMzgyMSwgMHg4ZjQyMDJlYywgMHgyNDQyMDAwMSwgMHhhZjQyMDJlYywKLTB4OGY0MjAyZWMsIDB4OGY0MjAwMDQsIDB4MzA0MjAwMDEsIDB4MTA0MDAwMTgsCi0weDI0MDQwMDAxLCAweDhmNDIwMjUwLCAweDhmNDMwMjU0LCAweDhmNDUwMWI0LAotMHgzYzAxMDAwMSwgMHgxNDY1MDAwNiwgMHhhMDI0NmNmMSwgMHg4ZjQyMDI3MCwKLTB4OGY0MzAyNzQsIDB4OGY0NDAxYjgsIDB4MTA2NDAwMjEsIDB4MCwKLTB4OGY0MjAyNTAsIDB4OGY0MzAyNTQsIDB4M2MwNDAwMDEsIDB4OTA4NDZjZjAsCi0weDhmNDYwMjcwLCAweDhmNDcwMjc0LCAweDM4ODQwMDAxLCAweGFmNDMwMWI0LAotMHhhZjQ3MDFiOCwgMHgzYzAxMDAwMSwgMHgxMDAwMDAyNSwgMHhhMDI0NmNmMCwKLTB4OGY0MjAwZDQsIDB4M2MwMTAwMDEsIDB4YTAyMDZjZjAsIDB4MjQ0MzAwMDEsCi0weDI4NDIwMDMzLCAweDE0NDAwMDFlLCAweGFmNDMwMGQ0LCAweDNjMDIwMDAxLAotMHg5MDQyNmNmMSwgMHhhZjQwMDBkNCwgMHgxMDAwMDAxNywgMHgzODQyMDAwMSwKLTB4OGY0MjAwMDQsIDB4MzA0MjAwMDEsIDB4MTA0MDAwMDgsIDB4MCwKLTB4YzAwNTY1YSwgMHgyMDIxLCAweDNjMDEwMDAxLCAweGEwMjA2Y2YxLAotMHgzYzAxMDAwMSwgMHgxMDAwMDAwZSwgMHhhMDIwNmNmMCwgMHg4ZjQyMDBkNCwKLTB4M2MwMTAwMDEsIDB4YTAyMDZjZjAsIDB4MjQ0MzAwMDEsIDB4Mjg0MjAxZjUsCi0weDE0NDAwMDA3LCAweGFmNDMwMGQ0LCAweDNjMDIwMDAxLCAweDkwNDI2Y2YxLAotMHhhZjQwMDBkNCwgMHg0MjEwMjYsIDB4M2MwMTAwMDEsIDB4YTAyMjZjZjEsCi0weDNjMDMwMDAxLCAweDhjNjM2ZDk4LCAweDI0MDIwMDAyLCAweDE0NjIwMDBjLAotMHgzYzAzMDAwMiwgMHgzYzAzMDAwMSwgMHg5MDYzNmNmMSwgMHgyNDAyMDAwMSwKLTB4NTQ2MjAwMWYsIDB4MjAyMSwgMHgzYzAyMDAwMSwgMHg5MDQyNmNmMCwKLTB4MTQ0MzAwMWIsIDB4MjQwNDAwMDUsIDB4MTAwMDAwMTksIDB4MjQwNDAwMDYsCi0weDNjMDIwMDAyLCAweDhjNDI4ZmY0LCAweDQzMTAyNCwgMHgxMDQwMDAwYiwKLTB4MjQwMjAwMDEsIDB4M2MwMzAwMDEsIDB4OTA2MzZjZjEsIDB4NTQ2MjAwMTAsCi0weDIwMjEsIDB4M2MwMjAwMDEsIDB4OTA0MjZjZjAsIDB4MTQ0MzAwMGMsCi0weDI0MDQwMDAzLCAweDEwMDAwMDBhLCAweDI0MDQwMDA0LCAweDNjMDMwMDAxLAotMHg5MDYzNmNmMSwgMHgxNDYyMDAwNiwgMHgyMDIxLCAweDNjMDIwMDAxLAotMHg5MDQyNmNmMCwgMHgyNDA0MDAwMSwgMHg1MDQ0MDAwMSwgMHgyNDA0MDAwMiwKLTB4YzAwNTY1YSwgMHgwLCAweDI0MDJmZjdmLCAweDI4MmEwMjQsCi0weDhmYmYwMDQ4LCAweDhmYmUwMDQ0LCAweDhmYjUwMDQwLCAweDhmYjMwMDNjLAotMHg4ZmIyMDAzOCwgMHg4ZmIxMDAzNCwgMHg4ZmIwMDAzMCwgMHgzZTAwMDA4LAotMHgyN2JkMDA1MCwgMHgzZTAwMDA4LCAweDAsIDB4M2MwMjAwMDEsCi0weDhjNDI2ZGE4LCAweDI3YmRmZmIwLCAweGFmYmYwMDQ4LCAweGFmYmUwMDQ0LAotMHhhZmI1MDA0MCwgMHhhZmIzMDAzYywgMHhhZmIyMDAzOCwgMHhhZmIxMDAzNCwKLTB4MTA0MDAwZGUsIDB4YWZiMDAwMzAsIDB4OGY0MjAwZDAsIDB4M2MwNDAwMDEsCi0weDhjODQ2ZDk4LCAweDI0NDMwMDAxLCAweDI4NDIwMDBiLCAweGFmNDQwMGU4LAotMHgxNDQwMDBmZSwgMHhhZjQzMDBkMCwgMHg4ZjQyMDAwNCwgMHgzMDQyMDAwMiwKLTB4MTQ0MDAwOTUsIDB4YWY0MDAwZDAsIDB4OGY0MjAwMDQsIDB4MzQ0MjAwMDIsCi0weGFmNDIwMDA0LCAweDI0MDIwMDAxLCAweDE0ODIwMDAzLCAweDNjMDIwNjAwLAotMHgxMDAwMDAwMiwgMHgzNDQyMzAwMCwgMHgzNDQyMTAwMCwgMHhhZmEyMDAyMCwKLTB4MTgyMSwgMHg4ZjVlMDAxOCwgMHgyN2FhMDAyMCwgMHgyNDAyMDBmZiwKLTB4MTNjMjAwMDIsIDB4YWZhYTAwMmMsIDB4MjdjMzAwMDEsIDB4OGMwMjAyMjgsCi0weDYwOTAyMSwgMHgxNjQyMDAwZSwgMHgxZTM4YzAsIDB4OGY0MjAzM2MsCi0weDI0NDIwMDAxLCAweGFmNDIwMzNjLCAweDhmNDIwMzNjLCAweDhjMDIwMjI4LAotMHgzYzA0MDAwMSwgMHgyNDg0NjEwYywgMHgzYzA1MDAwOSwgMHhhZmEwMDAxNCwKLTB4YWZhMjAwMTAsIDB4OGZhNjAwMjAsIDB4MTAwMDAwNmQsIDB4MzRhNTA1MDAsCi0weGY3MTAyMSwgMHg4ZmEzMDAyMCwgMHg4ZmE0MDAyNCwgMHhhYzQzMDRjMCwKLTB4YWM0NDA0YzQsIDB4OGY4MzAwNTQsIDB4OGY4MjAwNTQsIDB4MjQ3MDAzZTgsCi0weDIwMjEwMjMsIDB4MmM0MjAzZTksIDB4MTA0MDAwMWIsIDB4OTgyMSwKLTB4ZTA4ODIxLCAweDI2MzUwNGMwLCAweDhmNDQwMTc4LCAweDhmNDUwMTdjLAotMHgyMjAxODIxLCAweDI0MGEwMDA0LCAweGFmYWEwMDEwLCAweGFmYjIwMDE0LAotMHg4ZjQ4MDAwYywgMHgxMDIxLCAweDJmNTMwMjEsIDB4YWZhODAwMTgsCi0weDhmNDgwMTBjLCAweDI0MDcwMDA4LCAweGEzMjgyMSwgMHhhMzQ4MmIsCi0weDgyMjAyMSwgMHgxMDBmODA5LCAweDg5MjAyMSwgMHg1NDQwMDAwNiwKLTB4MjQxMzAwMDEsIDB4OGY4MjAwNTQsIDB4MjAyMTAyMywgMHgyYzQyMDNlOSwKLTB4MTQ0MGZmZTksIDB4MCwgMHgzMjYyMDBmZiwgMHg1NDQwMDAxNywKLTB4YWY1MjAwMTgsIDB4OGY0MjAzNzgsIDB4MjQ0MjAwMDEsIDB4YWY0MjAzNzgsCi0weDhmNDIwMzc4LCAweDhmODIwMTIwLCAweDhmYWEwMDJjLCAweGFmYTIwMDEwLAotMHg4ZjgyMDEyNCwgMHgzYzA0MDAwMSwgMHgyNDg0NjExOCwgMHgzYzA1MDAwOSwKLTB4YWZhMjAwMTQsIDB4OGQ0NjAwMDAsIDB4MTAwMDAwMzUsIDB4MzRhNTA2MDAsCi0weDhmNDIwMzA4LCAweDI0MTMwMDAxLCAweDI0NDIwMDAxLCAweGFmNDIwMzA4LAotMHg4ZjQyMDMwOCwgMHgxMDAwMDAxZSwgMHgzMjYyMDBmZiwgMHg4ZjgzMDA1NCwKLTB4OGY4MjAwNTQsIDB4MjQ3MDAzZTgsIDB4MjAyMTAyMywgMHgyYzQyMDNlOSwKLTB4MTA0MDAwMTYsIDB4OTgyMSwgMHgzYzE1MDAyMCwgMHgyNDExMDAxMCwKLTB4OGY0MjAwMGMsIDB4OGY0NDAxNjAsIDB4OGY0NTAxNjQsIDB4OGY4NjAxMjAsCi0weGFmYjEwMDEwLCAweGFmYjIwMDE0LCAweDU1MTAyNSwgMHhhZmEyMDAxOCwKLTB4OGY0MjAxMGMsIDB4MjQwNzAwMDgsIDB4NDBmODA5LCAweDI0YzYwMDFjLAotMHgxNDQwZmZlMywgMHgwLCAweDhmODIwMDU0LCAweDIwMjEwMjMsCi0weDJjNDIwM2U5LCAweDE0NDBmZmVlLCAweDAsIDB4MzI2MjAwZmYsCi0weDE0NDAwMDExLCAweDAsIDB4OGY0MjAzNzgsIDB4MjQ0MjAwMDEsCi0weGFmNDIwMzc4LCAweDhmNDIwMzc4LCAweDhmODIwMTIwLCAweDhmYWEwMDJjLAotMHhhZmEyMDAxMCwgMHg4ZjgyMDEyNCwgMHgzYzA0MDAwMSwgMHgyNDg0NjEyMCwKLTB4M2MwNTAwMDksIDB4YWZhMjAwMTQsIDB4OGQ0NjAwMDAsIDB4MzRhNTA3MDAsCi0weGMwMDJiM2IsIDB4M2MwMzgyMSwgMHg4ZjQyMDJlYywgMHgyNDQyMDAwMSwKLTB4YWY0MjAyZWMsIDB4OGY0MjAyZWMsIDB4OGY0MjAwMDQsIDB4MzA0MjAwMDEsCi0weDEwNDAwMDMzLCAweDNjMDIwNDAwLCAweDJjMjEwMjQsIDB4MTA0MDAwMTcsCi0weDAsIDB4OTM0MjA1YzAsIDB4OGY0NDAyNTAsIDB4OGY0NTAyNTQsCi0weDhmNDMwMWI0LCAweDM0NDIwMDIwLCAweDE0YTMwMDA2LCAweGEzNDIwNWMwLAotMHg4ZjQyMDI3MCwgMHg4ZjQzMDI3NCwgMHg4ZjQ0MDFiOCwgMHgxMDY0MDAwOCwKLTB4MCwgMHg4ZjQyMDI1MCwgMHg4ZjQzMDI1NCwgMHg5MzQ0MDVjMCwKLTB4OGY0NjAyNzAsIDB4OGY0NzAyNzQsIDB4MTAwMDAwMTYsIDB4Mzg4NDAwNDAsCi0weDkzNDIwNWMwLCAweDEwMDAwMDQ4LCAweDMwNDIwMGJmLCAweDkzNDIwNWMwLAotMHg4ZjQ0MDI1MCwgMHg4ZjQ1MDI1NCwgMHg4ZjQzMDFiNCwgMHgzMDQyMDBiZiwKLTB4MTRhMzAwMDYsIDB4YTM0MjA1YzAsIDB4OGY0MjAyNzAsIDB4OGY0MzAyNzQsCi0weDhmNDQwMWI4LCAweDEwNjQwMDBiLCAweDAsIDB4OGY0MjAyNTAsCi0weDhmNDMwMjU0LCAweDkzNDQwNWMwLCAweDhmNDYwMjcwLCAweDhmNDcwMjc0LAotMHgzODg0MDAyMCwgMHhhZjQzMDFiNCwgMHhhZjQ3MDFiOCwgMHgxMDAwMDAzMywKLTB4YTM0NDA1YzAsIDB4OTM0MjA1YzAsIDB4MTAwMDAwMmYsIDB4MzQ0MjAwMjAsCi0weDkzNDIwNWMwLCAweDhmNDMwMGQ0LCAweDM0NDIwMDIwLCAweGEzNDIwNWMwLAotMHgyNDYyMDAwMSwgMHgxMDAwMDAyMywgMHgyODYzMDAzMywgMHg4ZjQyMDBlNCwKLTB4OGY0MzAwZTAsIDB4MjQ0MjAwMDEsIDB4YWY0MjAwZTQsIDB4NDMxMDJhLAotMHgxNDQwMDAwNiwgMHgyNDAzMDAwMSwgMHg4ZjQyMDBlOCwgMHgxNDQzMDAwMiwKLTB4YWY0MDAwZTQsIDB4MjQwMzAwMDQsIDB4YWY0MzAwZTgsIDB4OGY0MjAwMDQsCi0weDMwNDIwMDAxLCAweDEwNDAwMDBkLCAweDNjMDIwNDAwLCAweDJjMjEwMjQsCi0weDEwNDAwMDA3LCAweDAsIDB4OTM0MjA1YzAsIDB4MzQ0MjAwNDAsCi0weGEzNDIwNWMwLCAweDkzNDIwNWMwLCAweDEwMDAwMDBmLCAweDMwNDIwMGRmLAotMHg5MzQyMDVjMCwgMHgxMDAwMDAwYywgMHgzNDQyMDA2MCwgMHg5MzQyMDVjMCwKLTB4OGY0MzAwZDQsIDB4MzQ0MjAwMjAsIDB4YTM0MjA1YzAsIDB4MjQ2MjAwMDEsCi0weDI4NjMwMGZiLCAweDE0NjAwMDA1LCAweGFmNDIwMGQ0LCAweDkzNDIwNWMwLAotMHhhZjQwMDBkNCwgMHgzODQyMDA0MCwgMHhhMzQyMDVjMCwgMHg5MzQyMDVjMCwKLTB4OGY0MzAwZTgsIDB4MzA0MjAwN2YsIDB4YTM0MjA1YzAsIDB4MjQwMjAwMDEsCi0weDE0NjIwMDA1LCAweDAsIDB4OTM0NDA1YzAsIDB4NDIxMDIsCi0weDEwMDAwMDAzLCAweDM0ODQwMGYwLCAweDkzNDQwNWMwLCAweDM0ODQwMDBmLAotMHhjMDA1NjQwLCAweDAsIDB4MjQwMmZmN2YsIDB4MjgyYTAyNCwKLTB4OGZiZjAwNDgsIDB4OGZiZTAwNDQsIDB4OGZiNTAwNDAsIDB4OGZiMzAwM2MsCi0weDhmYjIwMDM4LCAweDhmYjEwMDM0LCAweDhmYjAwMDMwLCAweDNlMDAwMDgsCi0weDI3YmQwMDUwLCAweDNlMDAwMDgsIDB4MCwgMHgyN2JkZmZiMCwKLTB4Mjc0NDAxYzAsIDB4MjZlMzAwMjgsIDB4MjQ2NTA0MDAsIDB4NjUxMDJiLAotMHhhZmJmMDA0OCwgMHhhZmJlMDA0NCwgMHhhZmI1MDA0MCwgMHhhZmIzMDAzYywKLTB4YWZiMjAwMzgsIDB4YWZiMTAwMzQsIDB4MTA0MDAwMDcsIDB4YWZiMDAwMzAsCi0weDhjODIwMDAwLCAweGFjNjIwMDAwLCAweDI0NjMwMDA0LCAweDY1MTAyYiwKLTB4MTQ0MGZmZmIsIDB4MjQ4NDAwMDQsIDB4OGMwMjAwODAsIDB4YWVlMjAwNDQsCi0weDhjMDIwMGMwLCAweGFlZTIwMDQwLCAweDhjMDIwMDg0LCAweGFlZTIwMDMwLAotMHg4YzAyMDA4NCwgMHhhZWUyMDIzYywgMHg4YzAyMDA4OCwgMHhhZWUyMDI0MCwKLTB4OGMwMjAwOGMsIDB4YWVlMjAyNDQsIDB4OGMwMjAwOTAsIDB4YWVlMjAyNDgsCi0weDhjMDIwMDk0LCAweGFlZTIwMjRjLCAweDhjMDIwMDk4LCAweGFlZTIwMjUwLAotMHg4YzAyMDA5YywgMHhhZWUyMDI1NCwgMHg4YzAyMDBhMCwgMHhhZWUyMDI1OCwKLTB4OGMwMjAwYTQsIDB4YWVlMjAyNWMsIDB4OGMwMjAwYTgsIDB4YWVlMjAyNjAsCi0weDhjMDIwMGFjLCAweGFlZTIwMjY0LCAweDhjMDIwMGIwLCAweGFlZTIwMjY4LAotMHg4YzAyMDBiNCwgMHhhZWUyMDI2YywgMHg4YzAyMDBiOCwgMHhhZWUyMDI3MCwKLTB4OGMwMjAwYmMsIDB4MjQwNDAwMDEsIDB4YWVlMjAyNzQsIDB4YWVlMDAwMzQsCi0weDQxMDgwLCAweDU3MTAyMSwgMHg4ZWUzMDAzNCwgMHg4YzQyMDIzYywKLTB4MjQ4NDAwMDEsIDB4NjIxODIxLCAweDJjODIwMDBmLCAweGFlZTMwMDM0LAotMHgxNDQwZmZmOCwgMHg0MTA4MCwgMHg4YzAyMDBjYywgMHhhZWUyMDA0OCwKLTB4OGMwMjAwZDAsIDB4YWVlMjAwNGMsIDB4OGMwMjAwZTAsIDB4YWVlMjAxZjgsCi0weDhjMDIwMGU0LCAweGFlZTIwMWZjLCAweDhjMDIwMGU4LCAweGFlZTIwMjAwLAotMHg4YzAyMDBlYywgMHhhZWUyMDIwNCwgMHg4YzAyMDBmMCwgMHhhZWUyMDIwOCwKLTB4OGVlNDAwYzAsIDB4OGVlNTAwYzQsIDB4OGMwMjAwZmMsIDB4NDUxMDJiLAotMHgxMDQwMDAwYiwgMHgwLCAweDhlZTIwMGMwLCAweDhlZTMwMGM0LAotMHgyNDA0MDAwMSwgMHgyNDA1MDAwMCwgMHg2NTE4MjEsIDB4NjUzMDJiLAotMHg0NDEwMjEsIDB4NDYxMDIxLCAweGFlZTIwMGMwLCAweGFlZTMwMGM0LAotMHg4YzAyMDBmYywgMHg4ZWU0MDBjMCwgMHg4ZWU1MDBjNCwgMHgyNDA4ZmZmZiwKLTB4MjQwOTAwMDAsIDB4NDAxODIxLCAweDEwMjEsIDB4ODgyMDI0LAotMHhhOTI4MjQsIDB4ODIyMDI1LCAweGEzMjgyNSwgMHhhZWU0MDBjMCwKLTB4YWVlNTAwYzQsIDB4OGVlNDAwZDAsIDB4OGVlNTAwZDQsIDB4OGMwMjAwZjQsCi0weDQ1MTAyYiwgMHgxMDQwMDAwYiwgMHgwLCAweDhlZTIwMGQwLAotMHg4ZWUzMDBkNCwgMHgyNDA0MDAwMSwgMHgyNDA1MDAwMCwgMHg2NTE4MjEsCi0weDY1MzAyYiwgMHg0NDEwMjEsIDB4NDYxMDIxLCAweGFlZTIwMGQwLAotMHhhZWUzMDBkNCwgMHg4YzAyMDBmNCwgMHg4ZWU0MDBkMCwgMHg4ZWU1MDBkNCwKLTB4NDAxODIxLCAweDEwMjEsIDB4ODgyMDI0LCAweGE5MjgyNCwKLTB4ODIyMDI1LCAweGEzMjgyNSwgMHhhZWU0MDBkMCwgMHhhZWU1MDBkNCwKLTB4OGVlNDAwYzgsIDB4OGVlNTAwY2MsIDB4OGMwMjAwZjgsIDB4NDUxMDJiLAotMHgxMDQwMDAwYiwgMHgwLCAweDhlZTIwMGM4LCAweDhlZTMwMGNjLAotMHgyNDA0MDAwMSwgMHgyNDA1MDAwMCwgMHg2NTE4MjEsIDB4NjUzMDJiLAotMHg0NDEwMjEsIDB4NDYxMDIxLCAweGFlZTIwMGM4LCAweGFlZTMwMGNjLAotMHg4YzAyMDBmOCwgMHg4ZWU0MDBjOCwgMHg4ZWU1MDBjYywgMHg0MDE4MjEsCi0weDEwMjEsIDB4ODgyMDI0LCAweGE5MjgyNCwgMHg4MjIwMjUsCi0weGEzMjgyNSwgMHgyNDAyMDAwOCwgMHhhZWU0MDBjOCwgMHhhZWU1MDBjYywKLTB4YWZhMjAwMTAsIDB4YWZhMDAwMTQsIDB4OGY0MjAwMGMsIDB4OGMwNDAyMDgsCi0weDhjMDUwMjBjLCAweGFmYTIwMDE4LCAweDhmNDIwMTBjLCAweDI2ZTYwMDI4LAotMHg0MGY4MDksIDB4MjQwNzA0MDAsIDB4MTA0MDAwZjAsIDB4M2MwMjA0MDAsCi0weGFmYTIwMDIwLCAweDkzNDIwNWM2LCAweDEwNDAwMDg5LCAweDE4MjEsCi0weDhmNWUwMDE4LCAweDI3YWEwMDIwLCAweDI0MDIwMGZmLCAweDEzYzIwMDAyLAotMHhhZmFhMDAyYywgMHgyN2MzMDAwMSwgMHg4YzAyMDIyOCwgMHg2MDkwMjEsCi0weDE2NDIwMDBlLCAweDFlMzhjMCwgMHg4ZjQyMDMzYywgMHgyNDQyMDAwMSwKLTB4YWY0MjAzM2MsIDB4OGY0MjAzM2MsIDB4OGMwMjAyMjgsIDB4M2MwNDAwMDEsCi0weDI0ODQ2MTBjLCAweDNjMDUwMDA5LCAweGFmYTAwMDE0LCAweGFmYTIwMDEwLAotMHg4ZmE2MDAyMCwgMHgxMDAwMDA2YiwgMHgzNGE1MDUwMCwgMHhmNzEwMjEsCi0weDhmYTMwMDIwLCAweDhmYTQwMDI0LCAweGFjNDMwNGMwLCAweGFjNDQwNGM0LAotMHg4ZjgzMDA1NCwgMHg4ZjgyMDA1NCwgMHgyNDcwMDNlOCwgMHgyMDIxMDIzLAotMHgyYzQyMDNlOSwgMHgxMDQwMDAxYiwgMHg5ODIxLCAweGUwODgyMSwKLTB4MjYzNTA0YzAsIDB4OGY0NDAxNzgsIDB4OGY0NTAxN2MsIDB4MjIwMTgyMSwKLTB4MjQwYTAwMDQsIDB4YWZhYTAwMTAsIDB4YWZiMjAwMTQsIDB4OGY0ODAwMGMsCi0weDEwMjEsIDB4MmY1MzAyMSwgMHhhZmE4MDAxOCwgMHg4ZjQ4MDEwYywKLTB4MjQwNzAwMDgsIDB4YTMyODIxLCAweGEzNDgyYiwgMHg4MjIwMjEsCi0weDEwMGY4MDksIDB4ODkyMDIxLCAweDU0NDAwMDA2LCAweDI0MTMwMDAxLAotMHg4ZjgyMDA1NCwgMHgyMDIxMDIzLCAweDJjNDIwM2U5LCAweDE0NDBmZmU5LAotMHgwLCAweDMyNjIwMGZmLCAweDU0NDAwMDE3LCAweGFmNTIwMDE4LAotMHg4ZjQyMDM3OCwgMHgyNDQyMDAwMSwgMHhhZjQyMDM3OCwgMHg4ZjQyMDM3OCwKLTB4OGY4MjAxMjAsIDB4OGZhYTAwMmMsIDB4YWZhMjAwMTAsIDB4OGY4MjAxMjQsCi0weDNjMDQwMDAxLCAweDI0ODQ2MTE4LCAweDNjMDUwMDA5LCAweGFmYTIwMDE0LAotMHg4ZDQ2MDAwMCwgMHgxMDAwMDAzMywgMHgzNGE1MDYwMCwgMHg4ZjQyMDMwOCwKLTB4MjQxMzAwMDEsIDB4MjQ0MjAwMDEsIDB4YWY0MjAzMDgsIDB4OGY0MjAzMDgsCi0weDEwMDAwMDFjLCAweDMyNjIwMGZmLCAweDhmODMwMDU0LCAweDhmODIwMDU0LAotMHgyNDcwMDNlOCwgMHgyMDIxMDIzLCAweDJjNDIwM2U5LCAweDEwNDAwMDE0LAotMHg5ODIxLCAweDI0MTEwMDEwLCAweDhmNDIwMDBjLCAweDhmNDQwMTYwLAotMHg4ZjQ1MDE2NCwgMHg4Zjg2MDEyMCwgMHhhZmIxMDAxMCwgMHhhZmIyMDAxNCwKLTB4YWZhMjAwMTgsIDB4OGY0MjAxMGMsIDB4MjQwNzAwMDgsIDB4NDBmODA5LAotMHgyNGM2MDAxYywgMHgxNDQwZmZlNSwgMHgwLCAweDhmODIwMDU0LAotMHgyMDIxMDIzLCAweDJjNDIwM2U5LCAweDE0NDBmZmVmLCAweDAsCi0weDMyNjIwMGZmLCAweDU0NDAwMDEyLCAweDI0MDIwMDAxLCAweDhmNDIwMzc4LAotMHgyNDQyMDAwMSwgMHhhZjQyMDM3OCwgMHg4ZjQyMDM3OCwgMHg4ZjgyMDEyMCwKLTB4OGZhYTAwMmMsIDB4YWZhMjAwMTAsIDB4OGY4MjAxMjQsIDB4M2MwNDAwMDEsCi0weDI0ODQ2MTIwLCAweDNjMDUwMDA5LCAweGFmYTIwMDE0LCAweDhkNDYwMDAwLAotMHgzNGE1MDcwMCwgMHhjMDAyYjNiLCAweDNjMDM4MjEsIDB4MTAyMSwKLTB4MTQ0MDAwNWIsIDB4MjQwMjAwMDEsIDB4MTAwMDAwNjUsIDB4MCwKLTB4OGY1MTAwMTgsIDB4MjQwMjAwZmYsIDB4MTIyMjAwMDIsIDB4ODAyMSwKLTB4MjYzMDAwMDEsIDB4OGMwMjAyMjgsIDB4MTYwMjAwMGUsIDB4MTEzMGMwLAotMHg4ZjQyMDMzYywgMHgyNDQyMDAwMSwgMHhhZjQyMDMzYywgMHg4ZjQyMDMzYywKLTB4OGMwMjAyMjgsIDB4M2MwNDAwMDEsIDB4MjQ4NDYwZjQsIDB4M2MwNTAwMDksCi0weGFmYTAwMDE0LCAweGFmYTIwMDEwLCAweDhmYTYwMDIwLCAweDEwMDAwMDNmLAotMHgzNGE1MDEwMCwgMHhkNzEwMjEsIDB4OGZhMzAwMjAsIDB4OGZhNDAwMjQsCi0weGFjNDMwNGMwLCAweGFjNDQwNGM0LCAweGMwMTgyMSwgMHg4ZjQ0MDE3OCwKLTB4OGY0NTAxN2MsIDB4MTAyMSwgMHgyNDA3MDAwNCwgMHhhZmE3MDAxMCwKLTB4YWZiMDAwMTQsIDB4OGY0ODAwMGMsIDB4MjRjNjA0YzAsIDB4MmU2MzAyMSwKLTB4YWZhODAwMTgsIDB4OGY0ODAxMGMsIDB4MjQwNzAwMDgsIDB4YTMyODIxLAotMHhhMzQ4MmIsIDB4ODIyMDIxLCAweDEwMGY4MDksIDB4ODkyMDIxLAotMHgxNDQwMDAwYiwgMHgyNDA3MDAwOCwgMHg4ZjgyMDEyMCwgMHhhZmEyMDAxMCwKLTB4OGY4MjAxMjQsIDB4M2MwNDAwMDEsIDB4MjQ4NDYwZmMsIDB4M2MwNTAwMDksCi0weGFmYTIwMDE0LCAweDhmYTYwMDIwLCAweDEwMDAwMDFjLCAweDM0YTUwMjAwLAotMHg4ZjQ0MDE2MCwgMHg4ZjQ1MDE2NCwgMHg4ZjQzMDAwYywgMHhhZjUwMDAxOCwKLTB4OGY4NjAxMjAsIDB4MjQwMjAwMTAsIDB4YWZhMjAwMTAsIDB4YWZiMDAwMTQsCi0weGFmYTMwMDE4LCAweDhmNDIwMTBjLCAweDQwZjgwOSwgMHgyNGM2MDAxYywKLTB4NTQ0MDAwMTEsIDB4MjQwMjAwMDEsIDB4OGY0MjAzNDAsIDB4MjQ0MjAwMDEsCi0weGFmNDIwMzQwLCAweDhmNDIwMzQwLCAweDhmODIwMTIwLCAweGFmYTIwMDEwLAotMHg4ZjgyMDEyNCwgMHgzYzA0MDAwMSwgMHgyNDg0NjEwNCwgMHgzYzA1MDAwOSwKLTB4YWZhMjAwMTQsIDB4OGZhNjAwMjAsIDB4MzRhNTAzMDAsIDB4YzAwMmIzYiwKLTB4MjIwMzgyMSwgMHgxMDIxLCAweDEwNDAwMDBkLCAweDI0MDIwMDAxLAotMHg4ZjQyMDJlOCwgMHhhMzQwMDVjNiwgMHhhZjQwMDFiMCwgMHgyNDQyMDAwMSwKLTB4YWY0MjAyZTgsIDB4OGY0MjAyZTgsIDB4OGVlMjAxNTAsIDB4MjQ0MjAwMDEsCi0weGFlZTIwMTUwLCAweDEwMDAwMDAzLCAweDhlZTIwMTUwLCAweDI0MDIwMDAxLAotMHhhMzQyMDVjNiwgMHg4ZmJmMDA0OCwgMHg4ZmJlMDA0NCwgMHg4ZmI1MDA0MCwKLTB4OGZiMzAwM2MsIDB4OGZiMjAwMzgsIDB4OGZiMTAwMzQsIDB4OGZiMDAwMzAsCi0weDNlMDAwMDgsIDB4MjdiZDAwNTAsIDB4MjdiZGZmZDgsIDB4YWZiZjAwMjAsCi0weDhmODIwMGIwLCAweDMwNDIwMDA0LCAweDEwNDAwMDY4LCAweDAsCi0weDhmNDMwMTI4LCAweDhmODIwMTA0LCAweDE0NjIwMDA1LCAweDAsCi0weDhmNDMwMTMwLCAweDhmODIwMGI0LCAweDEwNjIwMDA2LCAweDAsCi0weDhmODIwMTA0LCAweGFmNDIwMTI4LCAweDhmODIwMGI0LCAweDEwMDAwMDViLAotMHhhZjQyMDEzMCwgMHg4ZjgyMDBiMCwgMHgzYzAzMDA4MCwgMHg0MzEwMjQsCi0weDEwNDAwMDBkLCAweDAsIDB4OGY4MjAxMWMsIDB4MzQ0MjAwMDIsCi0weGFmODIwMTFjLCAweDhmODIwMGIwLCAweDI0MDNmZmZiLCAweDQzMTAyNCwKLTB4YWY4MjAwYjAsIDB4OGY4MjAxMWMsIDB4MjQwM2ZmZmQsIDB4NDMxMDI0LAotMHgxMDAwMDA0YSwgMHhhZjgyMDExYywgMHg4ZjQzMDEyOCwgMHg4ZjgyMDEwNCwKLTB4MTQ2MjAwMDUsIDB4MCwgMHg4ZjQzMDEzMCwgMHg4ZjgyMDBiNCwKLTB4MTA2MjAwMTAsIDB4MCwgMHg4ZjgyMDEwNCwgMHhhZjQyMDEyOCwKLTB4OGY4MjAwYjQsIDB4OGY0MzAxMjgsIDB4YWY0MjAxMzAsIDB4YWZhMzAwMTAsCi0weDhmNDIwMTMwLCAweDNjMDQwMDAxLCAweDI0ODQ2MTQ0LCAweGFmYTIwMDE0LAotMHg4Zjg2MDExYywgMHg4Zjg3MDBiMCwgMHgzYzA1MDAwNSwgMHgxMDAwMDAzMSwKLTB4MzRhNTA5MDAsIDB4OGY0MjAxMjgsIDB4YWZhMjAwMTAsIDB4OGY0MjAxMzAsCi0weDNjMDQwMDAxLCAweDI0ODQ2MTUwLCAweGFmYTIwMDE0LCAweDhmODYwMTFjLAotMHg4Zjg3MDBiMCwgMHgzYzA1MDAwNSwgMHhjMDAyYjNiLCAweDM0YTUxMDAwLAotMHg4ZjgyMDExYywgMHgzNDQyMDAwMiwgMHhhZjgyMDExYywgMHg4ZjgzMDEwNCwKLTB4OGY4MjAwYjAsIDB4MzQ0MjAwMDEsIDB4YWY4MjAwYjAsIDB4MjQwMjAwMDgsCi0weGFmODMwMTA0LCAweGFmYTIwMDEwLCAweGFmYTAwMDE0LCAweDhmNDIwMDBjLAotMHg4YzA0MDIwOCwgMHg4YzA1MDIwYywgMHhhZmEyMDAxOCwgMHg4ZjQyMDEwYywKLTB4MjZlNjAwMjgsIDB4NDBmODA5LCAweDI0MDcwNDAwLCAweDhmODIwMTFjLAotMHgyNDAzZmZmZCwgMHg0MzEwMjQsIDB4YWY4MjAxMWMsIDB4OGVlMjAxZGMsCi0weDI0NDIwMDAxLCAweGFlZTIwMWRjLCAweDhlZTIwMWRjLCAweDhmNDIwMTI4LAotMHhhZmEyMDAxMCwgMHg4ZjQyMDEzMCwgMHgzYzA0MDAwMSwgMHgyNDg0NjE1YywKLTB4YWZhMjAwMTQsIDB4OGY4NjAxMWMsIDB4OGY4NzAwYjAsIDB4M2MwNTAwMDUsCi0weDM0YTUxMTAwLCAweGMwMDJiM2IsIDB4MCwgMHg4ZjgyMDBhMCwKLTB4MzA0MjAwMDQsIDB4MTA0MDAwNjksIDB4MCwgMHg4ZjQzMDEyYywKLTB4OGY4MjAxMjQsIDB4MTQ2MjAwMDUsIDB4MCwgMHg4ZjQzMDEzNCwKLTB4OGY4MjAwYTQsIDB4MTA2MjAwMDYsIDB4MCwgMHg4ZjgyMDEyNCwKLTB4YWY0MjAxMmMsIDB4OGY4MjAwYTQsIDB4MTAwMDAwNWMsIDB4YWY0MjAxMzQsCi0weDhmODIwMGEwLCAweDNjMDMwMDgwLCAweDQzMTAyNCwgMHgxMDQwMDAwZCwKLTB4MCwgMHg4ZjgyMDExYywgMHgzNDQyMDAwMiwgMHhhZjgyMDExYywKLTB4OGY4MjAwYTAsIDB4MjQwM2ZmZmIsIDB4NDMxMDI0LCAweGFmODIwMGEwLAotMHg4ZjgyMDExYywgMHgyNDAzZmZmZCwgMHg0MzEwMjQsIDB4MTAwMDAwNGIsCi0weGFmODIwMTFjLCAweDhmNDMwMTJjLCAweDhmODIwMTI0LCAweDE0NjIwMDA1LAotMHgwLCAweDhmNDMwMTM0LCAweDhmODIwMGE0LCAweDEwNjIwMDEwLAotMHgwLCAweDhmODIwMTI0LCAweGFmNDIwMTJjLCAweDhmODIwMGE0LAotMHg4ZjQzMDEyYywgMHhhZjQyMDEzNCwgMHhhZmEzMDAxMCwgMHg4ZjQyMDEzNCwKLTB4M2MwNDAwMDEsIDB4MjQ4NDYxNjgsIDB4YWZhMjAwMTQsIDB4OGY4NjAxMWMsCi0weDhmODcwMGEwLCAweDNjMDUwMDA1LCAweDEwMDAwMDMyLCAweDM0YTUxMjAwLAotMHg4ZjQyMDEyYywgMHhhZmEyMDAxMCwgMHg4ZjQyMDEzNCwgMHgzYzA0MDAwMSwKLTB4MjQ4NDYxNzQsIDB4YWZhMjAwMTQsIDB4OGY4NjAxMWMsIDB4OGY4NzAwYTAsCi0weDNjMDUwMDA1LCAweGMwMDJiM2IsIDB4MzRhNTEzMDAsIDB4OGY4MjAxMWMsCi0weDM0NDIwMDAyLCAweGFmODIwMTFjLCAweDhmODMwMTI0LCAweDhmODIwMGEwLAotMHgzNDQyMDAwMSwgMHhhZjgyMDBhMCwgMHgyNDAyMDA4MCwgMHhhZjgzMDEyNCwKLTB4YWZhMjAwMTAsIDB4YWZhMDAwMTQsIDB4OGY0MjAwMTQsIDB4OGMwNDAyMDgsCi0weDhjMDUwMjBjLCAweGFmYTIwMDE4LCAweDhmNDIwMTA4LCAweDNjMDYwMDAxLAotMHgyNGM2NmVkOCwgMHg0MGY4MDksIDB4MjQwNzAwMDQsIDB4OGY4MjAxMWMsCi0weDI0MDNmZmZkLCAweDQzMTAyNCwgMHhhZjgyMDExYywgMHg4ZWUyMDFkYywKLTB4MjQ0MjAwMDEsIDB4YWVlMjAxZGMsIDB4OGVlMjAxZGMsIDB4OGY0MjAxMmMsCi0weGFmYTIwMDEwLCAweDhmNDIwMTM0LCAweDNjMDQwMDAxLCAweDI0ODQ2MTgwLAotMHhhZmEyMDAxNCwgMHg4Zjg2MDExYywgMHg4Zjg3MDBhMCwgMHgzYzA1MDAwNSwKLTB4MzRhNTE0MDAsIDB4YzAwMmIzYiwgMHgwLCAweDhmYmYwMDIwLAotMHgzZTAwMDA4LCAweDI3YmQwMDI4LCAweDNjMDgxMDAwLCAweDI0MDcwMDAxLAotMHgzYzA2MDA4MCwgMHgzYzA1MDEwMCwgMHg4ZjgyMDA3MCwgMHg0ODEwMjQsCi0weDEwNDBmZmZkLCAweDAsIDB4OGY4MjAwNTQsIDB4MjQ0MjAwMDUsCi0weGFmODIwMDc4LCAweDhjMDQwMjM0LCAweDEwODAwMDE2LCAweDE4MjEsCi0weDNjMDIwMDAxLCAweDU3MTAyMSwgMHg4YzQyNDBlOCwgMHgyNDQyMDAwNSwKLTB4M2MwMTAwMDEsIDB4MzcwODIxLCAweGFjMjI0MGU4LCAweDNjMDIwMDAxLAotMHg1NzEwMjEsIDB4OGM0MjQwZTgsIDB4NDQxMDJiLCAweDE0NDAwMDA5LAotMHgwLCAweDNjMDMwMDgwLCAweDNjMDEwMDAxLCAweDM3MDgyMSwKLTB4YWMyMDQwZTgsIDB4M2MwMTAwMDEsIDB4MzcwODIxLCAweDEwMDAwMDBiLAotMHhhMDI3NDBmMCwgMHgzYzAyMDAwMSwgMHg1NzEwMjEsIDB4OTA0MjQwZjAsCi0weDU0NDAwMDA2LCAweDY2MTgyNSwgMHgzYzAyMDAwMSwgMHg1NzEwMjEsCi0weDkwNDI0MGYxLCAweDU0NDAwMDAxLCAweDY2MTgyNSwgMHg4YzA0MDIzMCwKLTB4MTA4MDAwMTMsIDB4MCwgMHgzYzAyMDAwMSwgMHg1NzEwMjEsCi0weDhjNDI0MGVjLCAweDI0NDIwMDA1LCAweDNjMDEwMDAxLCAweDM3MDgyMSwKLTB4YWMyMjQwZWMsIDB4M2MwMjAwMDEsIDB4NTcxMDIxLCAweDhjNDI0MGVjLAotMHg0NDEwMmIsIDB4MTQ0MDAwMDYsIDB4MCwgMHgzYzAxMDAwMSwKLTB4MzcwODIxLCAweGFjMjA0MGVjLCAweDEwMDAwMDA2LCAweDY1MTgyNSwKLTB4M2MwMjAwMDEsIDB4NTcxMDIxLCAweDkwNDI0MGYyLCAweDU0NDAwMDAxLAotMHg2NTE4MjUsIDB4MTA2MGZmYmMsIDB4MCwgMHg4ZjQyMDAwMCwKLTB4MTA0MDAwMDcsIDB4MCwgMHhhZjgwMDA0YywgMHg4ZjgyMDA0YywKLTB4MTA0MGZmZmQsIDB4MCwgMHgxMDAwMDAwNSwgMHgwLAotMHhhZjgwMDA0OCwgMHg4ZjgyMDA0OCwgMHgxMDQwZmZmZCwgMHgwLAotMHg4ZjgyMDA2MCwgMHg0MzEwMjUsIDB4YWY4MjAwNjAsIDB4OGY0MjAwMDAsCi0weDEwNDAwMDAzLCAweDAsIDB4MTAwMGZmYTcsIDB4YWY4MDAwNGMsCi0weDEwMDBmZmE1LCAweGFmODAwMDQ4LCAweDNlMDAwMDgsIDB4MCwKLTB4MCwgMHgwLCAweDAsIDB4MjdiZGZmZTAsCi0weGFmYmYwMDE4LCAweDhmODYwMDY0LCAweDMwYzIwMDA0LCAweDEwNDAwMDI1LAotMHgyNDA0MDAwNCwgMHg4YzAyMDExNCwgMHhhZjQyMDAyMCwgMHhhZjg0MDA2NCwKLTB4OGY0MjAyZmMsIDB4MjQ0MjAwMDEsIDB4YWY0MjAyZmMsIDB4OGY0MjAyZmMsCi0weDhmODIwMDY0LCAweDMwNDIwMDA0LCAweDE0NDAwMDA1LCAweDAsCi0weDhjMDMwMTE0LCAweDhmNDIwMDIwLCAweDE0NjJmZmYyLCAweDAsCi0weDhmNDIwMDAwLCAweDEwNDAwMDA3LCAweDhmNDMwMDNjLCAweGFmODAwMDRjLAotMHg4ZjgyMDA0YywgMHgxMDQwZmZmZCwgMHgwLCAweDEwMDAwMDA1LAotMHgwLCAweGFmODAwMDQ4LCAweDhmODIwMDQ4LCAweDEwNDBmZmZkLAotMHgwLCAweDhmODIwMDYwLCAweDQzMTAyNSwgMHhhZjgyMDA2MCwKLTB4OGY0MjAwMDAsIDB4MTA0MDAwNzMsIDB4MCwgMHgxMDAwMDA2ZiwKLTB4MCwgMHgzMGMyMDAwOCwgMHgxMDQwMDAyMCwgMHgyNDA0MDAwOCwKLTB4OGMwMjAxMWMsIDB4YWY0MjAwNDgsIDB4YWY4NDAwNjQsIDB4OGY0MjAyYTgsCi0weDI0NDIwMDAxLCAweGFmNDIwMmE4LCAweDhmNDIwMmE4LCAweDhmODIwMDY0LAotMHgzMDQyMDAwOCwgMHgxNDQwMDAwNSwgMHgwLCAweDhjMDMwMTFjLAotMHg4ZjQyMDA0OCwgMHgxNDYyZmZmMiwgMHgwLCAweDhmNDIwMDAwLAotMHgxMDQwMDAwNywgMHgwLCAweGFmODAwMDRjLCAweDhmODIwMDRjLAotMHgxMDQwZmZmZCwgMHgwLCAweDEwMDAwMDA1LCAweDAsCi0weGFmODAwMDQ4LCAweDhmODIwMDQ4LCAweDEwNDBmZmZkLCAweDAsCi0weDhmODIwMDYwLCAweDEwMDBmZmQ5LCAweDM0NDIwMjAwLCAweDMwYzIwMDIwLAotMHgxMDQwMDAyMywgMHgyNDA0MDAyMCwgMHg4YzAyMDEyYywgMHhhZjQyMDA2OCwKLTB4YWY4NDAwNjQsIDB4OGY0MjAyZDgsIDB4MjQ0MjAwMDEsIDB4YWY0MjAyZDgsCi0weDhmNDIwMmQ4LCAweDhmODIwMDY0LCAweDMwNDIwMDIwLCAweDE0NDAwMDA1LAotMHgzMmMyNDAwMCwgMHg4YzAzMDEyYywgMHg4ZjQyMDA2OCwgMHgxNDYyZmZmMiwKLTB4MzJjMjQwMDAsIDB4MTQ0MDAwMDIsIDB4M2MwMjAwMDEsIDB4MmMyYjAyNSwKLTB4OGY0MjAwMDAsIDB4MTA0MDAwMDcsIDB4MCwgMHhhZjgwMDA0YywKLTB4OGY4MjAwNGMsIDB4MTA0MGZmZmQsIDB4MCwgMHgxMDAwMDAwNSwKLTB4MCwgMHhhZjgwMDA0OCwgMHg4ZjgyMDA0OCwgMHgxMDQwZmZmZCwKLTB4MCwgMHg4ZjgyMDA2MCwgMHgxMDAwZmZiNCwgMHgzNDQyMDgwMCwKLTB4MzBjMjAwMTAsIDB4MTA0MDAwMjksIDB4MjQwNDAwMTAsIDB4OGMwMjAxMjQsCi0weGFmNDIwMDU4LCAweGFmODQwMDY0LCAweDhmNDIwMmQ0LCAweDI0NDIwMDAxLAotMHhhZjQyMDJkNCwgMHg4ZjQyMDJkNCwgMHg4ZjgyMDA2NCwgMHgzMDQyMDAxMCwKLTB4MTQ0MDAwMDUsIDB4MzJjMjIwMDAsIDB4OGMwMzAxMjQsIDB4OGY0MjAwNTgsCi0weDE0NjJmZmYyLCAweDMyYzIyMDAwLCAweDUwNDAwMDAxLCAweDM2ZDY4MDAwLAotMHg4ZjQyMDAwMCwgMHgxMDQwMDAwNywgMHgwLCAweGFmODAwMDRjLAotMHg4ZjgyMDA0YywgMHgxMDQwZmZmZCwgMHgwLCAweDEwMDAwMDA1LAotMHgwLCAweGFmODAwMDQ4LCAweDhmODIwMDQ4LCAweDEwNDBmZmZkLAotMHgwLCAweDhmODIwMDYwLCAweDM0NDIwMTAwLCAweGFmODIwMDYwLAotMHg4ZjQyMDAwMCwgMHgxMDQwMDAwMywgMHgwLCAweDEwMDAwMDZjLAotMHhhZjgwMDA0YywgMHgxMDAwMDA2YSwgMHhhZjgwMDA0OCwgMHgzMGMyMDAwMSwKLTB4MTA0MDAwMDQsIDB4MjQwMjAwMDEsIDB4YWY4MjAwNjQsIDB4MTAwMDAwNjQsCi0weDAsIDB4MzBjMjAwMDIsIDB4MTQ0MDAwMGIsIDB4M2MwNTAwMDMsCi0weDNjMDQwMDAxLCAweDI0ODQ2MjQ0LCAweDM0YTUwNTAwLCAweDM4MjEsCi0weGFmYTAwMDEwLCAweGMwMDJiM2IsIDB4YWZhMDAwMTQsIDB4MjQwMmZmYzAsCi0weDEwMDAwMDU3LCAweGFmODIwMDY0LCAweDhjMDUwMjJjLCAweDhjMDIwMTBjLAotMHgxMGEyMDA0OCwgMHg1MTA4MCwgMHg4YzQ2MDMwMCwgMHgyNGEyMDAwMSwKLTB4MzA0NTAwM2YsIDB4MjQwMjAwMDMsIDB4YWMwNTAyMmMsIDB4NjFlMDIsCi0weDEwNjIwMDA1LCAweDI0MDIwMDEwLCAweDEwNjIwMDFkLCAweDMwYzIwZmZmLAotMHgxMDAwMDAzOSwgMHgwLCAweDhmNDMwMmE4LCAweDhmNDQwMDAwLAotMHgzMGMyMGZmZiwgMHhhZjQyMDA0OCwgMHgyNDYzMDAwMSwgMHhhZjQzMDJhOCwKLTB4MTA4MDAwMDcsIDB4OGY0MjAyYTgsIDB4YWY4MDAwNGMsIDB4OGY4MjAwNGMsCi0weDEwNDBmZmZkLCAweDAsIDB4MTAwMDAwMDUsIDB4MCwKLTB4YWY4MDAwNDgsIDB4OGY4MjAwNDgsIDB4MTA0MGZmZmQsIDB4MCwKLTB4OGY4MjAwNjAsIDB4MzQ0MjAyMDAsIDB4YWY4MjAwNjAsIDB4OGY0MjAwMDAsCi0weDEwNDAwMDFmLCAweDAsIDB4MTAwMDAwMWIsIDB4MCwKLTB4YWY0MjAwNTgsIDB4MzJjMjIwMDAsIDB4NTA0MDAwMDEsIDB4MzZkNjgwMDAsCi0weDhmNDIwMmQ0LCAweDhmNDMwMDAwLCAweDI0NDIwMDAxLCAweGFmNDIwMmQ0LAotMHgxMDYwMDAwNywgMHg4ZjQyMDJkNCwgMHhhZjgwMDA0YywgMHg4ZjgyMDA0YywKLTB4MTA0MGZmZmQsIDB4MCwgMHgxMDAwMDAwNSwgMHgwLAotMHhhZjgwMDA0OCwgMHg4ZjgyMDA0OCwgMHgxMDQwZmZmZCwgMHgwLAotMHg4ZjgyMDA2MCwgMHgzNDQyMDEwMCwgMHhhZjgyMDA2MCwgMHg4ZjQyMDAwMCwKLTB4MTA0MDAwMDMsIDB4MCwgMHgxMDAwMDAwNiwgMHhhZjgwMDA0YywKLTB4MTAwMDAwMDQsIDB4YWY4MDAwNDgsIDB4YzAwMjE5NiwgMHhjMDIwMjEsCi0weDQwMjgyMSwgMHg4YzAyMDEwYywgMHgxNGEyMDAwMiwgMHgyNDAyMDAwMiwKLTB4YWY4MjAwNjQsIDB4OGY4MjAwNjQsIDB4MzA0MjAwMDIsIDB4MTQ0MDAwMDQsCi0weDAsIDB4OGMwMjAxMGMsIDB4MTRhMmZmYWMsIDB4MCwKLTB4OGZiZjAwMTgsIDB4M2UwMDAwOCwgMHgyN2JkMDAyMCwgMHgzZTAwMDA4LAotMHgwLCAweDI3YmRmZmEwLCAweGFmYjAwMDQwLCAweDgwODAyMSwKLTB4MTAxNjAyLCAweDI0NDJmZmZmLCAweDMwNDMwMGZmLCAweDJjNjIwMDEzLAotMHhhZmJmMDA1OCwgMHhhZmJlMDA1NCwgMHhhZmI1MDA1MCwgMHhhZmIzMDA0YywKLTB4YWZiMjAwNDgsIDB4YWZiMTAwNDQsIDB4MTA0MDAxZjMsIDB4YWZhNTAwMzQsCi0weDMxMDgwLCAweDNjMDEwMDAxLCAweDIyMDgyMSwgMHg4YzIyNjI4OCwKLTB4NDAwMDA4LCAweDAsIDB4MTAxMzAyLCAweDMwNDQwZmZmLAotMHgyNDAyMDAwMSwgMHgxMDgyMDAwNSwgMHgyNDAyMDAwMiwgMHgxMDgyMDAwYywKLTB4MjQwMmZmZmUsIDB4MTAwMDAwMjQsIDB4M2MwNTAwMDMsIDB4OGY0MzAwMDQsCi0weDNjMDIwMDAxLCAweDhjNDI2ZjA0LCAweGFmNDQwMjAwLCAweGFmNDQwMjA0LAotMHgzYzA0MDAwMSwgMHg4Yzg0NmU4MCwgMHgxMDAwMDAwOSwgMHgzNDYzMDAwMSwKLTB4OGY0MzAwMDQsIDB4YWY0NDAyMDAsIDB4YWY0NDAyMDQsIDB4M2MwNDAwMDEsCi0weDhjODQ2ZTgwLCAweDYyMTgyNCwgMHgzYzAyMDAwMSwgMHgyNDQyY2EyOCwKLTB4MjExMDAsIDB4MjExODIsIDB4YWY0MzAwMDQsIDB4M2MwMzA4MDAsCi0weDQzMTAyNSwgMHhhYzgyMDAzOCwgMHg4Zjg0MDA1NCwgMHg0MTQ0MiwKLTB4NDFjODIsIDB4NDMxMDIxLCAweDQxY2MyLCAweDQzMTAyMywKLTB4NDFkMDIsIDB4NDMxMDIxLCAweDQxZDQyLCAweDQzMTAyMywKLTB4MTAwMDAwMDksIDB4YWY0MjAyMDgsIDB4M2MwNDAwMDEsIDB4MjQ4NDYyNTAsCi0weDM0YTUxMDAwLCAweDIwMDMwMjEsIDB4MzgyMSwgMHhhZmEwMDAxMCwKLTB4YzAwMmIzYiwgMHhhZmEwMDAxNCwgMHg4ZjQyMDJhMCwgMHgyNDQyMDAwMSwKLTB4YWY0MjAyYTAsIDB4MTAwMDAyMWYsIDB4OGY0MjAyYTAsIDB4MjdiMDAwMjgsCi0weDIwMDIwMjEsIDB4MjQwNTAyMTAsIDB4YzAwMmJiZiwgMHgyNDA2MDAwOCwKLTB4YzAwMjUxOCwgMHgyMDAyMDIxLCAweDEwMDAwMjE2LCAweDAsCi0weDhmYWEwMDM0LCAweDI3YTQwMDI4LCAweGExODgwLCAweDI1NDIwMDAxLAotMHgzMDQyMDAzZiwgMHhhZmEyMDAzNCwgMHg4YzY1MDMwMCwgMHg4ZmFhMDAzNCwKLTB4MjEwODAsIDB4OGM0MzAzMDAsIDB4MjU0MjAwMDEsIDB4MzA0MjAwM2YsCi0weGFmYTIwMDM0LCAweGFjMDIwMjJjLCAweGFmYTUwMDI4LCAweGMwMDI1MTgsCi0weGFmYTMwMDJjLCAweDEwMDAwMjAzLCAweDAsIDB4MjdiMDAwMjgsCi0weDIwMDIwMjEsIDB4MjQwNTAyMTAsIDB4YzAwMmJiZiwgMHgyNDA2MDAwOCwKLTB4YzAwMjY1NywgMHgyMDAyMDIxLCAweDEwMDAwMWZhLCAweDAsCi0weDhmYWEwMDM0LCAweDI3YTQwMDI4LCAweGExODgwLCAweDI1NDIwMDAxLAotMHgzMDQyMDAzZiwgMHhhZmEyMDAzNCwgMHg4YzY1MDMwMCwgMHg4ZmFhMDAzNCwKLTB4MjEwODAsIDB4OGM0MzAzMDAsIDB4MjU0MjAwMDEsIDB4MzA0MjAwM2YsCi0weGFmYTIwMDM0LCAweGFjMDIwMjJjLCAweGFmYTUwMDI4LCAweGMwMDI2NTcsCi0weGFmYTMwMDJjLCAweDEwMDAwMWU3LCAweDAsIDB4MTAxMzAyLAotMHgzMDQzMGZmZiwgMHgyNDAyMDAwMSwgMHgxMDYyMDAwNSwgMHgyNDAyMDAwMiwKLTB4MTA2MjAwMWUsIDB4M2MwMjAwMDIsIDB4MTAwMDAwMzMsIDB4M2MwNTAwMDMsCi0weDNjMDMwMDAyLCAweDJjMzEwMjQsIDB4NTQ0MDAwMzcsIDB4MmMzYjAyNSwKLTB4OGY4MjAyMjgsIDB4M2MwMTAwMDEsIDB4MzcwODIxLCAweGFjMjIzOGQ4LAotMHg4ZjgyMDIyYywgMHgzYzAxMDAwMSwgMHgzNzA4MjEsIDB4YWMyMjM4ZGMsCi0weDhmODIwMjMwLCAweDNjMDEwMDAxLCAweDM3MDgyMSwgMHhhYzIyMzhlMCwKLTB4OGY4MjAyMzQsIDB4M2MwMTAwMDEsIDB4MzcwODIxLCAweGFjMjIzOGU0LAotMHgyNDAyZmZmZiwgMHhhZjgyMDIyOCwgMHhhZjgyMDIyYywgMHhhZjgyMDIzMCwKLTB4YWY4MjAyMzQsIDB4MTAwMDAwMjAsIDB4MmMzYjAyNSwgMHgyYzIxMDI0LAotMHgxMDQwMDAxMiwgMHgzYzAyZmZmZCwgMHgzYzAyMDAwMSwgMHg1NzEwMjEsCi0weDhjNDIzOGQ4LCAweGFmODIwMjI4LCAweDNjMDIwMDAxLCAweDU3MTAyMSwKLTB4OGM0MjM4ZGMsIDB4YWY4MjAyMmMsIDB4M2MwMjAwMDEsIDB4NTcxMDIxLAotMHg4YzQyMzhlMCwgMHhhZjgyMDIzMCwgMHgzYzAyMDAwMSwgMHg1NzEwMjEsCi0weDhjNDIzOGU0LCAweGFmODIwMjM0LCAweDNjMDJmZmZkLCAweDM0NDJmZmZmLAotMHgxMDAwMDAwOSwgMHgyYzJiMDI0LCAweDNjMDQwMDAxLCAweDI0ODQ2MjVjLAotMHgzNGE1MTEwMCwgMHgyMDAzMDIxLCAweDM4MjEsIDB4YWZhMDAwMTAsCi0weGMwMDJiM2IsIDB4YWZhMDAwMTQsIDB4OGY0MjAyY2MsIDB4MjQ0MjAwMDEsCi0weGFmNDIwMmNjLCAweDEwMDAwMTlmLCAweDhmNDIwMmNjLCAweDEwMTMwMiwKLTB4MzA0NTBmZmYsIDB4MjQwMjAwMDEsIDB4MTBhMjAwMDUsIDB4MjQwMjAwMDIsCi0weDEwYTIwMDBkLCAweDNjMDQwOGZmLCAweDEwMDAwMDE0LCAweDNjMDUwMDAzLAotMHgzYzAyMDhmZiwgMHgzNDQyZmZmZiwgMHg4ZjgzMDIyMCwgMHgzYzA0MDAwNCwKLTB4MmM0YjAyNSwgMHg2MjE4MjQsIDB4MzQ2MzAwMDgsIDB4YWY4MzAyMjAsCi0weDEwMDAwMDEyLCAweGFmNDUwMjk4LCAweDM0ODRmZmY3LCAweDNjMDNmZmZiLAotMHg4ZjgyMDIyMCwgMHgzNDYzZmZmZiwgMHgyYzNiMDI0LCAweDQ0MTAyNCwKLTB4YWY4MjAyMjAsIDB4MTAwMDAwMDksIDB4YWY0NTAyOTgsIDB4M2MwNDAwMDEsCi0weDI0ODQ2MjY4LCAweDM0YTUxMjAwLCAweDIwMDMwMjEsIDB4MzgyMSwKLTB4YWZhMDAwMTAsIDB4YzAwMmIzYiwgMHhhZmEwMDAxNCwgMHg4ZjQyMDJiYywKLTB4MjQ0MjAwMDEsIDB4YWY0MjAyYmMsIDB4MTAwMDAxNzYsIDB4OGY0MjAyYmMsCi0weDI3ODQwMjA4LCAweDI0MDUwMjAwLCAweGMwMDJiYmYsIDB4MjQwNjAwMDgsCi0weDI3NDQwMjI0LCAweDI0MDUwMjAwLCAweGMwMDJiYmYsIDB4MjQwNjAwMDgsCi0weDhmNDIwMmM0LCAweDI0NDIwMDAxLCAweGFmNDIwMmM0LCAweDEwMDAwMTY5LAotMHg4ZjQyMDJjNCwgMHgxMDEzMDIsIDB4MzA0MzBmZmYsIDB4MjQwMjAwMDEsCi0weDEwNjIwMDExLCAweDI4NjIwMDAyLCAweDUwNDAwMDA1LCAweDI0MDIwMDAyLAotMHgxMDYwMDAwNywgMHgwLCAweDEwMDAwMDE3LCAweDAsCi0weDEwNjIwMDBmLCAweDAsIDB4MTAwMDAwMTMsIDB4MCwKLTB4OGMwNjAyNDgsIDB4MjAyMSwgMHhjMDA1MTA0LCAweDI0MDUwMDA0LAotMHgxMDAwMDAwNywgMHgwLCAweDhjMDYwMjQ4LCAweDIwMjEsCi0weGMwMDUxMDQsIDB4MjQwNTAwMDQsIDB4MTAwMDAwMTAsIDB4MCwKLTB4OGMwNjAyNGMsIDB4MjAyMSwgMHhjMDA1MTA0LCAweDI0MDUwMDAxLAotMHgxMDAwMDAwYSwgMHgwLCAweDNjMDQwMDAxLCAweDI0ODQ2Mjc0LAotMHgzYzA1MDAwMywgMHgzNGE1MTMwMCwgMHgyMDAzMDIxLCAweDM4MjEsCi0weGFmYTAwMDEwLCAweGMwMDJiM2IsIDB4YWZhMDAwMTQsIDB4OGY0MjAyYzAsCi0weDI0NDIwMDAxLCAweGFmNDIwMmMwLCAweDEwMDAwMTNhLCAweDhmNDIwMmMwLAotMHhjMDAyNDI2LCAweDAsIDB4MTAwMDAxMzYsIDB4MCwKLTB4MjQwMjAwMDEsIDB4YTM0MjA1YzUsIDB4MjQxMDAxMDAsIDB4OGY0NDAxYTgsCi0weDhmNDUwMWFjLCAweGFmYjAwMDEwLCAweGFmYTAwMDE0LCAweDhmNDIwMDE0LAotMHhhZmEyMDAxOCwgMHg4ZjQyMDEwOCwgMHgyNmU2MDAyOCwgMHg0MGY4MDksCi0weDI0MDcwNDAwLCAweDEwNDBmZmY1LCAweDAsIDB4MTAwMDAxMjUsCi0weDAsIDB4M2MwM2ZmZmYsIDB4MzQ2MzdmZmYsIDB4OGY0MjAzNjgsCi0weDhmNDQwMzYwLCAweDJjM2IwMjQsIDB4MTgyMSwgMHhhZjQwMDA1OCwKLTB4YWY0MDAwNWMsIDB4YWY0MDAwNjAsIDB4YWY0MDAwNjQsIDB4NDQxMDIzLAotMHhhZjQyMDM2OCwgMHgzYzAyMDkwMCwgMHhhZjQwMDM2MCwgMHhhZmEyMDAyMCwKLTB4OGY1ZTAwMTgsIDB4MjdhYTAwMjAsIDB4MjQwMjAwZmYsIDB4MTNjMjAwMDIsCi0weGFmYWEwMDNjLCAweDI3YzMwMDAxLCAweDhjMDIwMjI4LCAweDYwOTAyMSwKLTB4MTY0MjAwMGUsIDB4MWUzOGMwLCAweDhmNDIwMzNjLCAweDI0NDIwMDAxLAotMHhhZjQyMDMzYywgMHg4ZjQyMDMzYywgMHg4YzAyMDIyOCwgMHgzYzA0MDAwMSwKLTB4MjQ4NDYyMGMsIDB4M2MwNTAwMDksIDB4YWZhMDAwMTQsIDB4YWZhMjAwMTAsCi0weDhmYTYwMDIwLCAweDEwMDAwMDZiLCAweDM0YTUwNTAwLCAweGY3MTAyMSwKLTB4OGZhMzAwMjAsIDB4OGZhNDAwMjQsIDB4YWM0MzA0YzAsIDB4YWM0NDA0YzQsCi0weDhmODMwMDU0LCAweDhmODIwMDU0LCAweDI0NzAwM2U4LCAweDIwMjEwMjMsCi0weDJjNDIwM2U5LCAweDEwNDAwMDFiLCAweDk4MjEsIDB4ZTA4ODIxLAotMHgyNjM1MDRjMCwgMHg4ZjQ0MDE3OCwgMHg4ZjQ1MDE3YywgMHgyMjAxODIxLAotMHgyNDBhMDAwNCwgMHhhZmFhMDAxMCwgMHhhZmIyMDAxNCwgMHg4ZjQ4MDAwYywKLTB4MTAyMSwgMHgyZjUzMDIxLCAweGFmYTgwMDE4LCAweDhmNDgwMTBjLAotMHgyNDA3MDAwOCwgMHhhMzI4MjEsIDB4YTM0ODJiLCAweDgyMjAyMSwKLTB4MTAwZjgwOSwgMHg4OTIwMjEsIDB4NTQ0MDAwMDYsIDB4MjQxMzAwMDEsCi0weDhmODIwMDU0LCAweDIwMjEwMjMsIDB4MmM0MjAzZTksIDB4MTQ0MGZmZTksCi0weDAsIDB4MzI2MjAwZmYsIDB4NTQ0MDAwMTcsIDB4YWY1MjAwMTgsCi0weDhmNDIwMzc4LCAweDI0NDIwMDAxLCAweGFmNDIwMzc4LCAweDhmNDIwMzc4LAotMHg4ZjgyMDEyMCwgMHg4ZmFhMDAzYywgMHhhZmEyMDAxMCwgMHg4ZjgyMDEyNCwKLTB4M2MwNDAwMDEsIDB4MjQ4NDYyMTgsIDB4M2MwNTAwMDksIDB4YWZhMjAwMTQsCi0weDhkNDYwMDAwLCAweDEwMDAwMDMzLCAweDM0YTUwNjAwLCAweDhmNDIwMzA4LAotMHgyNDEzMDAwMSwgMHgyNDQyMDAwMSwgMHhhZjQyMDMwOCwgMHg4ZjQyMDMwOCwKLTB4MTAwMDAwMWMsIDB4MzI2MjAwZmYsIDB4OGY4MzAwNTQsIDB4OGY4MjAwNTQsCi0weDI0NzAwM2U4LCAweDIwMjEwMjMsIDB4MmM0MjAzZTksIDB4MTA0MDAwMTQsCi0weDk4MjEsIDB4MjQxMTAwMTAsIDB4OGY0MjAwMGMsIDB4OGY0NDAxNjAsCi0weDhmNDUwMTY0LCAweDhmODYwMTIwLCAweGFmYjEwMDEwLCAweGFmYjIwMDE0LAotMHhhZmEyMDAxOCwgMHg4ZjQyMDEwYywgMHgyNDA3MDAwOCwgMHg0MGY4MDksCi0weDI0YzYwMDFjLCAweDE0NDBmZmU1LCAweDAsIDB4OGY4MjAwNTQsCi0weDIwMjEwMjMsIDB4MmM0MjAzZTksIDB4MTQ0MGZmZWYsIDB4MCwKLTB4MzI2MjAwZmYsIDB4MTQ0MDAwMTEsIDB4MCwgMHg4ZjQyMDM3OCwKLTB4MjQ0MjAwMDEsIDB4YWY0MjAzNzgsIDB4OGY0MjAzNzgsIDB4OGY4MjAxMjAsCi0weDhmYWEwMDNjLCAweGFmYTIwMDEwLCAweDhmODIwMTI0LCAweDNjMDQwMDAxLAotMHgyNDg0NjIyMCwgMHgzYzA1MDAwOSwgMHhhZmEyMDAxNCwgMHg4ZDQ2MDAwMCwKLTB4MzRhNTA3MDAsIDB4YzAwMmIzYiwgMHgzYzAzODIxLCAweDhmNDIwMmIwLAotMHgyNDQyMDAwMSwgMHhhZjQyMDJiMCwgMHg4ZjQyMDJiMCwgMHg4ZjQyMDJmOCwKLTB4MjQ0MjAwMDEsIDB4YWY0MjAyZjgsIDB4MTAwMDAwOGEsIDB4OGY0MjAyZjgsCi0weDhjMDIwMjVjLCAweDI3NDQwMjI0LCAweGFmNDIwMWYwLCAweDhjMDIwMjYwLAotMHgyNDA1MDIwMCwgMHgyNDA2MDAwOCwgMHhjMDAyYmJmLCAweGFmNDIwMWY4LAotMHg4ZjgyMDIyMCwgMHgzMDQyMDAwOCwgMHgxNDQwMDAwMiwgMHgyNDAyMDAwMSwKLTB4MjQwMjAwMDIsIDB4YWY0MjAyOTgsIDB4OGY0MjAyYWMsIDB4MjQ0MjAwMDEsCi0weGFmNDIwMmFjLCAweDEwMDAwMDc3LCAweDhmNDIwMmFjLCAweDNjMDIwMGZmLAotMHgzNDQyZmZmZiwgMHgyMDIxODI0LCAweDMyYzIwMTgwLCAweDE0NDAwMDA2LAotMHgzNDAyZmZmYiwgMHg0MzEwMmIsIDB4MTQ0MDAwMDMsIDB4MCwKLTB4MTAwMDAwNmMsIDB4YWY0MzAwYmMsIDB4M2MwNDAwMDEsIDB4MjQ4NDYyODAsCi0weDNjMDUwMDAzLCAweDM0YTUxNTAwLCAweDIwMDMwMjEsIDB4MzgyMSwKLTB4YWZhMDAwMTAsIDB4YzAwMmIzYiwgMHhhZmEwMDAxNCwgMHgzYzAyMDcwMCwKLTB4MzQ0MjEwMDAsIDB4MTAxZTAyLCAweDYyMTgyNSwgMHhhZmEzMDAyMCwKLTB4OGY1MTAwMTgsIDB4MjQwMjAwZmYsIDB4MTIyMjAwMDIsIDB4ODAyMSwKLTB4MjYzMDAwMDEsIDB4OGMwMjAyMjgsIDB4MTYwMjAwMGUsIDB4MTEzMGMwLAotMHg4ZjQyMDMzYywgMHgyNDQyMDAwMSwgMHhhZjQyMDMzYywgMHg4ZjQyMDMzYywKLTB4OGMwMjAyMjgsIDB4M2MwNDAwMDEsIDB4MjQ4NDYxZjQsIDB4M2MwNTAwMDksCi0weGFmYTAwMDE0LCAweGFmYTIwMDEwLCAweDhmYTYwMDIwLCAweDEwMDAwMDNmLAotMHgzNGE1MDEwMCwgMHhkNzEwMjEsIDB4OGZhMzAwMjAsIDB4OGZhNDAwMjQsCi0weGFjNDMwNGMwLCAweGFjNDQwNGM0LCAweGMwMTgyMSwgMHg4ZjQ0MDE3OCwKLTB4OGY0NTAxN2MsIDB4MTAyMSwgMHgyNDA3MDAwNCwgMHhhZmE3MDAxMCwKLTB4YWZiMDAwMTQsIDB4OGY0ODAwMGMsIDB4MjRjNjA0YzAsIDB4MmU2MzAyMSwKLTB4YWZhODAwMTgsIDB4OGY0ODAxMGMsIDB4MjQwNzAwMDgsIDB4YTMyODIxLAotMHhhMzQ4MmIsIDB4ODIyMDIxLCAweDEwMGY4MDksIDB4ODkyMDIxLAotMHgxNDQwMDAwYiwgMHgyNDA3MDAwOCwgMHg4ZjgyMDEyMCwgMHhhZmEyMDAxMCwKLTB4OGY4MjAxMjQsIDB4M2MwNDAwMDEsIDB4MjQ4NDYxZmMsIDB4M2MwNTAwMDksCi0weGFmYTIwMDE0LCAweDhmYTYwMDIwLCAweDEwMDAwMDFjLCAweDM0YTUwMjAwLAotMHg4ZjQ0MDE2MCwgMHg4ZjQ1MDE2NCwgMHg4ZjQzMDAwYywgMHhhZjUwMDAxOCwKLTB4OGY4NjAxMjAsIDB4MjQwMjAwMTAsIDB4YWZhMjAwMTAsIDB4YWZiMDAwMTQsCi0weGFmYTMwMDE4LCAweDhmNDIwMTBjLCAweDQwZjgwOSwgMHgyNGM2MDAxYywKLTB4MTQ0MDAwMTAsIDB4MCwgMHg4ZjQyMDM0MCwgMHgyNDQyMDAwMSwKLTB4YWY0MjAzNDAsIDB4OGY0MjAzNDAsIDB4OGY4MjAxMjAsIDB4YWZhMjAwMTAsCi0weDhmODIwMTI0LCAweDNjMDQwMDAxLCAweDI0ODQ2MjA0LCAweDNjMDUwMDA5LAotMHhhZmEyMDAxNCwgMHg4ZmE2MDAyMCwgMHgzNGE1MDMwMCwgMHhjMDAyYjNiLAotMHgyMjAzODIxLCAweDhmNDIwMmUwLCAweDI0NDIwMDAxLCAweGFmNDIwMmUwLAotMHg4ZjQyMDJlMCwgMHg4ZjQyMDJmMCwgMHgyNDQyMDAwMSwgMHhhZjQyMDJmMCwKLTB4OGY0MjAyZjAsIDB4OGZhMjAwMzQsIDB4OGZiZjAwNTgsIDB4OGZiZTAwNTQsCi0weDhmYjUwMDUwLCAweDhmYjMwMDRjLCAweDhmYjIwMDQ4LCAweDhmYjEwMDQ0LAotMHg4ZmIwMDA0MCwgMHgzZTAwMDA4LCAweDI3YmQwMDYwLCAweDI3YmRmZmY4LAotMHgyNDA4ZmZmZiwgMHgxMGEwMDAxNCwgMHg0ODIxLCAweDNjMGFlZGI4LAotMHgzNTRhODMyMCwgMHg5MDg3MDAwMCwgMHgyNDg0MDAwMSwgMHgzMDIxLAotMHgxMDcxMDI2LCAweDMwNDIwMDAxLCAweDEwNDAwMDAyLCAweDgxODQyLAotMHg2YTE4MjYsIDB4NjA0MDIxLCAweDI0YzYwMDAxLCAweDJjYzIwMDA4LAotMHgxNDQwZmZmNywgMHg3Mzg0MiwgMHgyNTI5MDAwMSwgMHgxMjUxMDJiLAotMHgxNDQwZmZmMCwgMHgwLCAweDEwMDEwMjEsIDB4M2UwMDAwOCwKLTB4MjdiZDAwMDgsIDB4MjdiZGZmYjAsIDB4YWZiZjAwNDgsIDB4YWZiZTAwNDQsCi0weGFmYjUwMDQwLCAweGFmYjMwMDNjLCAweGFmYjIwMDM4LCAweGFmYjEwMDM0LAotMHhhZmIwMDAzMCwgMHg4Zjg3MDIyMCwgMHhhZmE3MDAyNCwgMHg4Zjg3MDIwMCwKLTB4YWZhNzAwMmMsIDB4OGY4MjAyMjAsIDB4M2MwMzA4ZmYsIDB4MzQ2M2ZmZmYsCi0weDQzMTAyNCwgMHgzNDQyMDAwNCwgMHhhZjgyMDIyMCwgMHg4ZjgyMDIwMCwKLTB4M2MwM2MwZmYsIDB4MzQ2M2ZmZmYsIDB4NDMxMDI0LCAweDM0NDIwMDA0LAotMHhhZjgyMDIwMCwgMHg4ZjUzMDM1OCwgMHg4ZjU1MDM1YywgMHg4ZjVlMDM2MCwKLTB4OGY0NzAzNjQsIDB4YWZhNzAwMTQsIDB4OGY0NzAzNjgsIDB4YWZhNzAwMWMsCi0weDhmNDIwMmQwLCAweDI3NDQwMWMwLCAweDI0NDIwMDAxLCAweGFmNDIwMmQwLAotMHg4ZjUwMDJkMCwgMHg4ZjUxMDIwNCwgMHg4ZjUyMDIwMCwgMHhjMDAyYmE4LAotMHgyNDA1MDQwMCwgMHhhZjUzMDM1OCwgMHhhZjU1MDM1YywgMHhhZjVlMDM2MCwKLTB4OGZhNzAwMTQsIDB4YWY0NzAzNjQsIDB4OGZhNzAwMWMsIDB4YWY0NzAzNjgsCi0weGFmNTAwMmQwLCAweGFmNTEwMjA0LCAweGFmNTIwMjAwLCAweDhjMDIwMjVjLAotMHgyNzQ0MDIyNCwgMHhhZjQyMDFmMCwgMHg4YzAyMDI2MCwgMHgyNDA1MDIwMCwKLTB4MjQwNjAwMDgsIDB4YWY0MjAxZjgsIDB4MjQwMjAwMDYsIDB4YzAwMmJiZiwKLTB4YWY0MjAxZjQsIDB4M2MwMjNiOWEsIDB4MzQ0MmNhMDAsIDB4YWY0MjAxZmMsCi0weDI0MDIwM2U4LCAweDI0MDQwMDAyLCAweDI0MDMwMDAxLCAweGFmNDIwMjk0LAotMHhhZjQ0MDI5MCwgMHhhZjQzMDI5YywgMHg4ZjgyMDIyMCwgMHgzMDQyMDAwOCwKLTB4MTA0MDAwMDQsIDB4MCwgMHhhZjQzMDI5OCwgMHgxMDAwMDAwMywKLTB4MzAyMSwgMHhhZjQ0MDI5OCwgMHgzMDIxLCAweDNjMDMwMDAxLAotMHg2NjE4MjEsIDB4OTA2MzZkMDAsIDB4MzQ2MTAyMSwgMHgyNGM2MDAwMSwKLTB4YTA0MzAyMmMsIDB4MmNjMjAwMGYsIDB4MTQ0MGZmZjgsIDB4MzQ2MTgyMSwKLTB4MjRjNjAwMDEsIDB4OGY4MjAwNDAsIDB4MjQwNDAwODAsIDB4MjQwNTAwODAsCi0weDIxNzAyLCAweDI0NDIwMDMwLCAweGEwNjIwMjJjLCAweDM0NjEwMjEsCi0weGMwMDJiYTgsIDB4YTA0MDAyMmMsIDB4OGZhNzAwMjQsIDB4MzBlMjAwMDQsCi0weDE0NDAwMDA2LCAweDAsIDB4OGY4MjAyMjAsIDB4M2MwMzA4ZmYsCi0weDM0NjNmZmZiLCAweDQzMTAyNCwgMHhhZjgyMDIyMCwgMHg4ZmE3MDAyYywKLTB4MzBlMjAwMDQsIDB4MTQ0MDAwMDYsIDB4MCwgMHg4ZjgyMDIwMCwKLTB4M2MwM2MwZmYsIDB4MzQ2M2ZmZmIsIDB4NDMxMDI0LCAweGFmODIwMjAwLAotMHg4ZmJmMDA0OCwgMHg4ZmJlMDA0NCwgMHg4ZmI1MDA0MCwgMHg4ZmIzMDAzYywKLTB4OGZiMjAwMzgsIDB4OGZiMTAwMzQsIDB4OGZiMDAwMzAsIDB4M2UwMDAwOCwKLTB4MjdiZDAwNTAsIDB4MCwgMHgwLCAweGFmNDAwMTA0LAotMHgyNDA0MDAwMSwgMHg0MTBjMCwgMHgyZTIxODIxLCAweDI0ODIwMDAxLAotMHgzYzAxMDAwMSwgMHgyMzA4MjEsIDB4YTQyMjM0ZDAsIDB4NDAyMDIxLAotMHgyYzgyMDA4MCwgMHgxNDQwZmZmOCwgMHg0MTBjMCwgMHgyNDAyMDAwMSwKLTB4M2MwMTAwMDEsIDB4MzcwODIxLCAweGE0MjAzOGQwLCAweGFmNDIwMTAwLAotMHhhZjgwMDIyOCwgMHhhZjgwMDIyYywgMHhhZjgwMDIzMCwgMHhhZjgwMDIzNCwKLTB4M2UwMDAwOCwgMHgwLCAweDI3YmRmZmU4LCAweGFmYmYwMDE0LAotMHhhZmIwMDAxMCwgMHg4ZjQyMDEwNCwgMHgyODQyMDAwNSwgMHgxMDQwMDAyNiwKLTB4ODA4MDIxLCAweDNjMDIwMDAxLCAweDhmNDMwMTA0LCAweDM0NDIzMGQwLAotMHgyZTIyMDIxLCAweDMxOGMwLCAweDYyMTgyMSwgMHgyZTMxODIxLAotMHg4MzEwMmIsIDB4MTA0MDAwMTUsIDB4MTAyMSwgMHg5NjA3MDAwMCwKLTB4MjQ4NDAwMDYsIDB4MjQ2NjAwMDYsIDB4OTQ4MmZmZmMsIDB4MTQ0NzAwMDksCi0weDI4MjEsIDB4OTQ4M2ZmZmUsIDB4OTYwMjAwMDIsIDB4MTQ2MjAwMDYsCi0weGEwMTAyMSwgMHg5NDgyMDAwMCwgMHg5NjAzMDAwNCwgMHg0MzEwMjYsCi0weDJjNDUwMDAxLCAweGEwMTAyMSwgMHgxNDQwMDAwOSwgMHgyNDg0MDAwOCwKLTB4ODYxMDJiLCAweDE0NDBmZmYwLCAweDEwMjEsIDB4MzA0MjAwZmYsCi0weDE0NDAwMDMwLCAweDI0MDIwMDAxLCAweDEwMDAwMDJlLCAweDEwMjEsCi0weDEwMDBmZmZhLCAweDI0MDIwMDAxLCAweDIwMDIwMjEsIDB4YzAwMjQwYywKLTB4MjQwNTAwMDYsIDB4MzA0MjAwN2YsIDB4MjE4YzAsIDB4MmUzMTAyMSwKLTB4M2MwMTAwMDEsIDB4MjIwODIxLCAweDk0MjIzMGQwLCAweDEwNDBmZmYyLAotMHgyZTMxMDIxLCAweDNjMDYwMDAxLCAweGMyMzAyMSwgMHg5NGM2MzBkMCwKLTB4MTBjMGZmZWQsIDB4M2MwODAwMDEsIDB4MzUwODM0ZDIsIDB4OTYwNzAwMDAsCi0weDYxMGMwLCAweDU3MjAyMSwgMHg4ODIwMjEsIDB4OTQ4MjAwMDAsCi0weDE0NDcwMDA5LCAweDI4MjEsIDB4OTQ4MzAwMDIsIDB4OTYwMjAwMDIsCi0weDE0NjIwMDA2LCAweGEwMTAyMSwgMHg5NDgyMDAwNCwgMHg5NjAzMDAwNCwKLTB4NDMxMDI2LCAweDJjNDUwMDAxLCAweGEwMTAyMSwgMHgxNDQwMDAwNywKLTB4NjEwYzAsIDB4MmUyMTAyMSwgMHgzYzA2MDAwMSwgMHhjMjMwMjEsCi0weDk0YzYzNGQwLCAweDE0YzBmZmViLCAweDYxMGMwLCAweDEwYzBmZmQyLAotMHgyNDAyMDAwMSwgMHg4ZmJmMDAxNCwgMHg4ZmIwMDAxMCwgMHgzZTAwMDA4LAotMHgyN2JkMDAxOCwgMHgzZTAwMDA4LCAweDAsIDB4MjdiZGZmYjAsCi0weDgwMTAyMSwgMHhhZmIwMDAzMCwgMHgyNDUwMDAwMiwgMHgyMDAyMDIxLAotMHgyNDA1MDAwNiwgMHhhZmIxMDAzNCwgMHg0MDg4MjEsIDB4YWZiZjAwNDgsCi0weGFmYmUwMDQ0LCAweGFmYjUwMDQwLCAweGFmYjMwMDNjLCAweGMwMDI0MGMsCi0weGFmYjIwMDM4LCAweDMwNDcwMDdmLCAweDcxMGMwLCAweDJlMjEwMjEsCi0weDNjMDUwMDAxLCAweGEyMjgyMSwgMHg5NGE1MzBkMCwgMHg1MGEwMDAxYywKLTB4YTAzMDIxLCAweDNjMDkwMDAxLCAweDM1MjkzNGQyLCAweDk2MjgwMDAyLAotMHg1MTBjMCwgMHg1NzIwMjEsIDB4ODkyMDIxLCAweDk0ODIwMDAwLAotMHgxNDQ4MDAwOSwgMHgzMDIxLCAweDk0ODMwMDAyLCAweDk2MDIwMDAyLAotMHgxNDYyMDAwNiwgMHhjMDEwMjEsIDB4OTQ4MjAwMDQsIDB4OTYwMzAwMDQsCi0weDQzMTAyNiwgMHgyYzQ2MDAwMSwgMHhjMDEwMjEsIDB4MTQ0MDAwMDcsCi0weDUxMGMwLCAweDJlMjEwMjEsIDB4M2MwNTAwMDEsIDB4YTIyODIxLAotMHg5NGE1MzRkMCwgMHgxNGEwZmZlYiwgMHg1MTBjMCwgMHhhMDMwMjEsCi0weDEwYzAwMDE0LCAweDYxMGMwLCAweDU3MTgyMSwgMHgzYzAxMDAwMSwKLTB4MjMwODIxLCAweDhjMjMzNGQwLCAweDU3MTAyMSwgMHhhZmEzMDAxMCwKLTB4M2MwMTAwMDEsIDB4MjIwODIxLCAweDhjMjIzNGQ0LCAweDNjMDQwMDAxLAotMHgyNDg0NjM5NCwgMHhhZmEyMDAxNCwgMHg4ZTI2MDAwMCwgMHg4ZTI3MDAwNCwKLTB4M2MwNTAwMDQsIDB4YzAwMmIzYiwgMHgzNGE1MDQwMCwgMHgxMDAwMDA2MywKLTB4M2MwMjA4MDAsIDB4OGY0NTAxMDAsIDB4MTBhMDAwMDYsIDB4NTEwYzAsCi0weDJlMjEwMjEsIDB4M2MwMTAwMDEsIDB4MjIwODIxLCAweDk0MjIzNGQwLAotMHhhZjQyMDEwMCwgMHhhMDMwMjEsIDB4MTRjMDAwMTEsIDB4NjI4YzAsCi0weDcxMGMwLCAweDJlMjEwMjEsIDB4YWZhNzAwMTAsIDB4M2MwMTAwMDEsCi0weDIyMDgyMSwgMHg5NDIyMzBkMCwgMHgzYzA0MDAwMSwgMHgyNDg0NjNhMCwKLTB4YWZhMjAwMTQsIDB4OGUyNjAwMDAsIDB4OGUyNzAwMDQsIDB4M2MwNTAwMDQsCi0weGMwMDJiM2IsIDB4MzRhNTA1MDAsIDB4MTAwMDAwNDgsIDB4M2MwMjA4MDAsCi0weGI3MTgyMSwgMHgzYzAyMDAwMSwgMHg5NjA0MDAwMCwgMHgzNDQyMzRkMiwKLTB4NjIxODIxLCAweGE0NjQwMDAwLCAweDhlMDIwMDAyLCAweDcyMGMwLAotMHhhYzYyMDAwMiwgMHgyZTQxMDIxLCAweDNjMDMwMDAxLCAweDYyMTgyMSwKLTB4OTQ2MzMwZDAsIDB4MmU1MTAyMSwgMHgzYzAxMDAwMSwgMHgyMjA4MjEsCi0weGE0MjMzNGQwLCAweDJlNDEwMjEsIDB4M2MwMTAwMDEsIDB4MjIwODIxLAotMHhhNDI2MzBkMCwgMHg4ZjQyMDEwNCwgMHgyNDQyMDAwMSwgMHgyODQyMDA4MCwKLTB4MTA0MDAwMGYsIDB4M2MwMjAwMDIsIDB4OGY0MjAxMDQsIDB4M2MwNDAwMDEsCi0weDM0ODQzMGQyLCAweDk2MDMwMDAwLCAweDIxMGMwLCAweDU3MTAyMSwKLTB4NDQxMDIxLCAweGE0NDMwMDAwLCAweDhlMDMwMDAyLCAweGFjNDMwMDAyLAotMHg4ZjQyMDEwNCwgMHgyNDQyMDAwMSwgMHhhZjQyMDEwNCwgMHgzYzAyMDAwMiwKLTB4MmMyMTAyNCwgMHgxMDQwMDAxMSwgMHg3MjE0MiwgMHgzYzAzMDAwMSwKLTB4MzQ2MzM4ZDgsIDB4MjQwMjAwMDMsIDB4NDQxMDIzLCAweDIxMDgwLAotMHg1NzIwMjEsIDB4ODMyMDIxLCAweDU3MTAyMSwgMHg0MzEwMjEsCi0weDMwZTUwMDFmLCAweDhjNDMwMDAwLCAweDI0MDIwMDAxLCAweGEyMTAwNCwKLTB4NjIxODI1LCAweDEwMDAwMDBjLCAweGFjODMwMDAwLCAweDI0MDIwMDAzLAotMHg0NDEwMjMsIDB4MjEwODAsIDB4NWMyODIxLCAweDVjMTAyMSwKLTB4MzBlNDAwMWYsIDB4OGM0MzAyMjgsIDB4MjQwMjAwMDEsIDB4ODIxMDA0LAotMHg2MjE4MjUsIDB4YWNhMzAyMjgsIDB4M2MwMjA4MDAsIDB4MzQ0MjEwMDAsCi0weDE4MjEsIDB4YWZhMjAwMjAsIDB4OGY1ZTAwMTgsIDB4MjdhYTAwMjAsCi0weDI0MDIwMGZmLCAweDEzYzIwMDAyLCAweGFmYWEwMDJjLCAweDI3YzMwMDAxLAotMHg4YzAyMDIyOCwgMHg2MDkwMjEsIDB4MTY0MjAwMGUsIDB4MWUzOGMwLAotMHg4ZjQyMDMzYywgMHgyNDQyMDAwMSwgMHhhZjQyMDMzYywgMHg4ZjQyMDMzYywKLTB4OGMwMjAyMjgsIDB4M2MwNDAwMDEsIDB4MjQ4NDYzNWMsIDB4M2MwNTAwMDksCi0weGFmYTAwMDE0LCAweGFmYTIwMDEwLCAweDhmYTYwMDIwLCAweDEwMDAwMDZiLAotMHgzNGE1MDUwMCwgMHhmNzEwMjEsIDB4OGZhMzAwMjAsIDB4OGZhNDAwMjQsCi0weGFjNDMwNGMwLCAweGFjNDQwNGM0LCAweDhmODMwMDU0LCAweDhmODIwMDU0LAotMHgyNDcwMDNlOCwgMHgyMDIxMDIzLCAweDJjNDIwM2U5LCAweDEwNDAwMDFiLAotMHg5ODIxLCAweGUwODgyMSwgMHgyNjM1MDRjMCwgMHg4ZjQ0MDE3OCwKLTB4OGY0NTAxN2MsIDB4MjIwMTgyMSwgMHgyNDBhMDAwNCwgMHhhZmFhMDAxMCwKLTB4YWZiMjAwMTQsIDB4OGY0ODAwMGMsIDB4MTAyMSwgMHgyZjUzMDIxLAotMHhhZmE4MDAxOCwgMHg4ZjQ4MDEwYywgMHgyNDA3MDAwOCwgMHhhMzI4MjEsCi0weGEzNDgyYiwgMHg4MjIwMjEsIDB4MTAwZjgwOSwgMHg4OTIwMjEsCi0weDU0NDAwMDA2LCAweDI0MTMwMDAxLCAweDhmODIwMDU0LCAweDIwMjEwMjMsCi0weDJjNDIwM2U5LCAweDE0NDBmZmU5LCAweDAsIDB4MzI2MjAwZmYsCi0weDU0NDAwMDE3LCAweGFmNTIwMDE4LCAweDhmNDIwMzc4LCAweDI0NDIwMDAxLAotMHhhZjQyMDM3OCwgMHg4ZjQyMDM3OCwgMHg4ZjgyMDEyMCwgMHg4ZmFhMDAyYywKLTB4YWZhMjAwMTAsIDB4OGY4MjAxMjQsIDB4M2MwNDAwMDEsIDB4MjQ4NDYzNjgsCi0weDNjMDUwMDA5LCAweGFmYTIwMDE0LCAweDhkNDYwMDAwLCAweDEwMDAwMDMzLAotMHgzNGE1MDYwMCwgMHg4ZjQyMDMwOCwgMHgyNDEzMDAwMSwgMHgyNDQyMDAwMSwKLTB4YWY0MjAzMDgsIDB4OGY0MjAzMDgsIDB4MTAwMDAwMWMsIDB4MzI2MjAwZmYsCi0weDhmODMwMDU0LCAweDhmODIwMDU0LCAweDI0NzAwM2U4LCAweDIwMjEwMjMsCi0weDJjNDIwM2U5LCAweDEwNDAwMDE0LCAweDk4MjEsIDB4MjQxMTAwMTAsCi0weDhmNDIwMDBjLCAweDhmNDQwMTYwLCAweDhmNDUwMTY0LCAweDhmODYwMTIwLAotMHhhZmIxMDAxMCwgMHhhZmIyMDAxNCwgMHhhZmEyMDAxOCwgMHg4ZjQyMDEwYywKLTB4MjQwNzAwMDgsIDB4NDBmODA5LCAweDI0YzYwMDFjLCAweDE0NDBmZmU1LAotMHgwLCAweDhmODIwMDU0LCAweDIwMjEwMjMsIDB4MmM0MjAzZTksCi0weDE0NDBmZmVmLCAweDAsIDB4MzI2MjAwZmYsIDB4MTQ0MDAwMTEsCi0weDAsIDB4OGY0MjAzNzgsIDB4MjQ0MjAwMDEsIDB4YWY0MjAzNzgsCi0weDhmNDIwMzc4LCAweDhmODIwMTIwLCAweDhmYWEwMDJjLCAweGFmYTIwMDEwLAotMHg4ZjgyMDEyNCwgMHgzYzA0MDAwMSwgMHgyNDg0NjM3MCwgMHgzYzA1MDAwOSwKLTB4YWZhMjAwMTQsIDB4OGQ0NjAwMDAsIDB4MzRhNTA3MDAsIDB4YzAwMmIzYiwKLTB4M2MwMzgyMSwgMHg4ZjQyMDJiNCwgMHgyNDQyMDAwMSwgMHhhZjQyMDJiNCwKLTB4OGY0MjAyYjQsIDB4OGY0MjAyZjQsIDB4MjQ0MjAwMDEsIDB4YWY0MjAyZjQsCi0weDhmNDIwMmY0LCAweDhmYmYwMDQ4LCAweDhmYmUwMDQ0LCAweDhmYjUwMDQwLAotMHg4ZmIzMDAzYywgMHg4ZmIyMDAzOCwgMHg4ZmIxMDAzNCwgMHg4ZmIwMDAzMCwKLTB4M2UwMDAwOCwgMHgyN2JkMDA1MCwgMHgyN2JkZmZhMCwgMHg4MDEwMjEsCi0weGFmYjAwMDQwLCAweDI0NTAwMDAyLCAweDIwMDIwMjEsIDB4MjQwNTAwMDYsCi0weGFmYjEwMDQ0LCAweDQwODgyMSwgMHhhZmJmMDA1OCwgMHhhZmJlMDA1NCwKLTB4YWZiNTAwNTAsIDB4YWZiMzAwNGMsIDB4YzAwMjQwYywgMHhhZmIyMDA0OCwKLTB4MzA0ODAwN2YsIDB4ODEwYzAsIDB4MmUyMTAyMSwgMHgzYzA2MDAwMSwKLTB4YzIzMDIxLCAweDk0YzYzMGQwLCAweDEwYzAwMDFjLCAweDM4MjEsCi0weDNjMGEwMDAxLCAweDM1NGEzNGQyLCAweDk2MjkwMDAyLCAweDYxMGMwLAotMHg1NzIwMjEsIDB4OGEyMDIxLCAweDk0ODIwMDAwLCAweDE0NDkwMDA5LAotMHgyODIxLCAweDk0ODMwMDAyLCAweDk2MDIwMDAyLCAweDE0NjIwMDA2LAotMHhhMDEwMjEsIDB4OTQ4MjAwMDQsIDB4OTYwMzAwMDQsIDB4NDMxMDI2LAotMHgyYzQ1MDAwMSwgMHhhMDEwMjEsIDB4MTQ0MDAwMDgsIDB4NjEwYzAsCi0weGMwMzgyMSwgMHgyZTIxMDIxLCAweDNjMDYwMDAxLCAweGMyMzAyMSwKLTB4OTRjNjM0ZDAsIDB4MTRjMGZmZWEsIDB4NjEwYzAsIDB4MTRjMDAwMTEsCi0weGFmYTcwMDI4LCAweDgxMGMwLCAweDJlMjEwMjEsIDB4YWZhODAwMTAsCi0weDNjMDEwMDAxLCAweDIyMDgyMSwgMHg5NDIyMzBkMCwgMHgzYzA0MDAwMSwKLTB4MjQ4NDYzYWMsIDB4YWZhMjAwMTQsIDB4OGUyNjAwMDAsIDB4OGUyNzAwMDQsCi0weDNjMDUwMDA0LCAweGMwMDJiM2IsIDB4MzRhNTA5MDAsIDB4MTAwMDAwNzUsCi0weDNjMDIwODAwLCAweDEwZTAwMDBjLCAweDYxMGMwLCAweDJlMjEwMjEsCi0weDNjMDMwMDAxLCAweDYyMTgyMSwgMHg5NDYzMzRkMCwgMHg3MTBjMCwKLTB4MmUyMTAyMSwgMHgzYzAxMDAwMSwgMHgyMjA4MjEsIDB4YTQyMzM0ZDAsCi0weDEwMDAwMDBiLCAweDNjMDQwMDAxLCAweDJlMjEwMjEsIDB4M2MwMzAwMDEsCi0weDYyMTgyMSwgMHg5NDYzMzRkMCwgMHg4MTBjMCwgMHgyZTIxMDIxLAotMHgzYzAxMDAwMSwgMHgyMjA4MjEsIDB4YTQyMzMwZDAsIDB4M2MwNDAwMDEsCi0weDM0ODQzMGQwLCAweDhmNDMwMTAwLCAweDYxMGMwLCAweDJlMjEwMjEsCi0weDNjMDEwMDAxLCAweDIyMDgyMSwgMHhhNDIzMzRkMCwgMHg4ZjQyMDEwNCwKLTB4MmU0MzgyMSwgMHgyODIxLCAweDE4NDAwMDI5LCAweGFmNDYwMTAwLAotMHgyNGU2MDAwNiwgMHg5NGMzZmZmYywgMHg5NjAyMDAwMCwgMHgxNDYyMDAwOSwKLTB4MjAyMSwgMHg5NGMzZmZmZSwgMHg5NjAyMDAwMiwgMHgxNDYyMDAwNiwKLTB4ODAxMDIxLCAweDk0YzIwMDAwLCAweDk2MDMwMDA0LCAweDQzMTAyNiwKLTB4MmM0NDAwMDEsIDB4ODAxMDIxLCAweDUwNDAwMDE0LCAweDI0YTUwMDAxLAotMHg4ZjQyMDEwNCwgMHgyNDQyZmZmZiwgMHhhMjEwMmEsIDB4MTA0MDAwMGIsCi0weDI0ZTQwMDA0LCAweDk0ODIwMDA2LCAweDhjODMwMDA4LCAweGE0ODJmZmZlLAotMHhhYzgzMDAwMCwgMHg4ZjQyMDEwNCwgMHgyNGE1MDAwMSwgMHgyNDQyZmZmZiwKLTB4YTIxMDJhLCAweDE0NDBmZmY3LCAweDI0ODQwMDA4LCAweDhmNDIwMTA0LAotMHgyNDQyZmZmZiwgMHgxMDAwMDAwNiwgMHhhZjQyMDEwNCwgMHg4ZjQyMDEwNCwKLTB4MjRjNjAwMDgsIDB4YTIxMDJhLCAweDE0NDBmZmRhLCAweDI0ZTcwMDA4LAotMHg4MTBjMCwgMHgyZTIxMDIxLCAweDNjMDEwMDAxLCAweDIyMDgyMSwKLTB4OTQyMjMwZDAsIDB4MTQ0MDAwMjMsIDB4M2MwMjA4MDAsIDB4M2MwMjAwMDIsCi0weDJjMjEwMjQsIDB4MTA0MDAwMTIsIDB4ODIxNDIsIDB4M2MwMzAwMDEsCi0weDM0NjMzOGQ4LCAweDI0MDIwMDAzLCAweDQ0MTAyMywgMHgyMTA4MCwKLTB4NTcyMDIxLCAweDgzMjAyMSwgMHg1NzEwMjEsIDB4NDMxMDIxLAotMHgzMTA1MDAxZiwgMHgyNDAzMDAwMSwgMHg4YzQyMDAwMCwgMHhhMzE4MDQsCi0weDMxODI3LCAweDQzMTAyNCwgMHgxMDAwMDAwZCwgMHhhYzgyMDAwMCwKLTB4MjQwMjAwMDMsIDB4NDQxMDIzLCAweDIxMDgwLCAweDVjMjgyMSwKLTB4NWMxMDIxLCAweDMxMDQwMDFmLCAweDI0MDMwMDAxLCAweDhjNDIwMjI4LAotMHg4MzE4MDQsIDB4MzE4MjcsIDB4NDMxMDI0LCAweGFjYTIwMjI4LAotMHgzYzAyMDgwMCwgMHgzNDQyMjAwMCwgMHgxODIxLCAweGFmYTIwMDIwLAotMHg4ZjVlMDAxOCwgMHgyN2FiMDAyMCwgMHgyNDAyMDBmZiwgMHgxM2MyMDAwMiwKLTB4YWZhYjAwMzQsIDB4MjdjMzAwMDEsIDB4OGMwMjAyMjgsIDB4NjA5MDIxLAotMHgxNjQyMDAwZSwgMHgxZTM4YzAsIDB4OGY0MjAzM2MsIDB4MjQ0MjAwMDEsCi0weGFmNDIwMzNjLCAweDhmNDIwMzNjLCAweDhjMDIwMjI4LCAweDNjMDQwMDAxLAotMHgyNDg0NjM1YywgMHgzYzA1MDAwOSwgMHhhZmEwMDAxNCwgMHhhZmEyMDAxMCwKLTB4OGZhNjAwMjAsIDB4MTAwMDAwNmIsIDB4MzRhNTA1MDAsIDB4ZjcxMDIxLAotMHg4ZmEzMDAyMCwgMHg4ZmE0MDAyNCwgMHhhYzQzMDRjMCwgMHhhYzQ0MDRjNCwKLTB4OGY4MzAwNTQsIDB4OGY4MjAwNTQsIDB4MjQ3MDAzZTgsIDB4MjAyMTAyMywKLTB4MmM0MjAzZTksIDB4MTA0MDAwMWIsIDB4OTgyMSwgMHhlMDg4MjEsCi0weDI2MzUwNGMwLCAweDhmNDQwMTc4LCAweDhmNDUwMTdjLCAweDIyMDE4MjEsCi0weDI0MGIwMDA0LCAweGFmYWIwMDEwLCAweGFmYjIwMDE0LCAweDhmNDgwMDBjLAotMHgxMDIxLCAweDJmNTMwMjEsIDB4YWZhODAwMTgsIDB4OGY0ODAxMGMsCi0weDI0MDcwMDA4LCAweGEzMjgyMSwgMHhhMzQ4MmIsIDB4ODIyMDIxLAotMHgxMDBmODA5LCAweDg5MjAyMSwgMHg1NDQwMDAwNiwgMHgyNDEzMDAwMSwKLTB4OGY4MjAwNTQsIDB4MjAyMTAyMywgMHgyYzQyMDNlOSwgMHgxNDQwZmZlOSwKLTB4MCwgMHgzMjYyMDBmZiwgMHg1NDQwMDAxNywgMHhhZjUyMDAxOCwKLTB4OGY0MjAzNzgsIDB4MjQ0MjAwMDEsIDB4YWY0MjAzNzgsIDB4OGY0MjAzNzgsCi0weDhmODIwMTIwLCAweDhmYWIwMDM0LCAweGFmYTIwMDEwLCAweDhmODIwMTI0LAotMHgzYzA0MDAwMSwgMHgyNDg0NjM2OCwgMHgzYzA1MDAwOSwgMHhhZmEyMDAxNCwKLTB4OGQ2NjAwMDAsIDB4MTAwMDAwMzMsIDB4MzRhNTA2MDAsIDB4OGY0MjAzMDgsCi0weDI0MTMwMDAxLCAweDI0NDIwMDAxLCAweGFmNDIwMzA4LCAweDhmNDIwMzA4LAotMHgxMDAwMDAxYywgMHgzMjYyMDBmZiwgMHg4ZjgzMDA1NCwgMHg4ZjgyMDA1NCwKLTB4MjQ3MDAzZTgsIDB4MjAyMTAyMywgMHgyYzQyMDNlOSwgMHgxMDQwMDAxNCwKLTB4OTgyMSwgMHgyNDExMDAxMCwgMHg4ZjQyMDAwYywgMHg4ZjQ0MDE2MCwKLTB4OGY0NTAxNjQsIDB4OGY4NjAxMjAsIDB4YWZiMTAwMTAsIDB4YWZiMjAwMTQsCi0weGFmYTIwMDE4LCAweDhmNDIwMTBjLCAweDI0MDcwMDA4LCAweDQwZjgwOSwKLTB4MjRjNjAwMWMsIDB4MTQ0MGZmZTUsIDB4MCwgMHg4ZjgyMDA1NCwKLTB4MjAyMTAyMywgMHgyYzQyMDNlOSwgMHgxNDQwZmZlZiwgMHgwLAotMHgzMjYyMDBmZiwgMHgxNDQwMDAxMSwgMHgwLCAweDhmNDIwMzc4LAotMHgyNDQyMDAwMSwgMHhhZjQyMDM3OCwgMHg4ZjQyMDM3OCwgMHg4ZjgyMDEyMCwKLTB4OGZhYjAwMzQsIDB4YWZhMjAwMTAsIDB4OGY4MjAxMjQsIDB4M2MwNDAwMDEsCi0weDI0ODQ2MzcwLCAweDNjMDUwMDA5LCAweGFmYTIwMDE0LCAweDhkNjYwMDAwLAotMHgzNGE1MDcwMCwgMHhjMDAyYjNiLCAweDNjMDM4MjEsIDB4OGY0MjAyYjgsCi0weDI0NDIwMDAxLCAweGFmNDIwMmI4LCAweDhmNDIwMmI4LCAweDhmNDIwMmY0LAotMHgyNDQyMDAwMSwgMHhhZjQyMDJmNCwgMHg4ZjQyMDJmNCwgMHg4ZmJmMDA1OCwKLTB4OGZiZTAwNTQsIDB4OGZiNTAwNTAsIDB4OGZiMzAwNGMsIDB4OGZiMjAwNDgsCi0weDhmYjEwMDQ0LCAweDhmYjAwMDQwLCAweDNlMDAwMDgsIDB4MjdiZDAwNjAsCi0weDAsIDB4MCwgMHgwLCAweDI3YmRmZmUwLAotMHgyNzY0NDAwMCwgMHhhZmJmMDAxOCwgMHhjMDAyYmE4LCAweDI0MDUxMDAwLAotMHgzYzAzMDAwMSwgMHgzNDYzMmNjMCwgMHgzYzA0MDAwMSwgMHgzNDg0MmVjOCwKLTB4MjQwMjAwMjAsIDB4YWY4MjAxMWMsIDB4MmUzMTAyMSwgMHhhZjgwMDEwMCwKLTB4YWY4MDAxMDQsIDB4YWY4MDAxMDgsIDB4YWY4MDAxMTAsIDB4YWY4MDAxMTQsCi0weGFmODAwMTE4LCAweGFmODAwMTIwLCAweGFmODAwMTI0LCAweGFmODAwMTI4LAotMHhhZjgwMDEzMCwgMHhhZjgwMDEzNCwgMHhhZjgwMDEzOCwgMHhhZjQyMDBlYywKLTB4MmUzMTAyMSwgMHhhZjQyMDBmMCwgMHgyZTQxMDIxLCAweGFmNDIwMGY0LAotMHgyZTQxMDIxLCAweGFmNDIwMGY4LCAweDNjMDIwMDAxLCAweDU3MTAyMSwKLTB4OTA0MjQwZjQsIDB4MTQ0MDAwMWMsIDB4M2MwNTAwMDEsIDB4OGY4MjAxMWMsCi0weDNjMDQwMDAxLCAweDI0ODQ2NDcwLCAweDNjMDUwMDAxLCAweDM0NDIwMDAxLAotMHhhZjgyMDExYywgMHhhZmEwMDAxMCwgMHhhZmEwMDAxNCwgMHg4Zjg2MDExYywKLTB4MzRhNTAxMDAsIDB4YzAwMmIzYiwgMHgzODIxLCAweDhjMDIwMjE4LAotMHgzMDQyMDA0MCwgMHgxMDQwMDAxNCwgMHgwLCAweDhmODIwMTFjLAotMHgzYzA0MDAwMSwgMHgyNDg0NjQ3YywgMHgzYzA1MDAwMSwgMHgzNDQyMDAwNCwKLTB4YWY4MjAxMWMsIDB4YWZhMDAwMTAsIDB4YWZhMDAwMTQsIDB4OGY4NjAxMWMsCi0weDEwMDAwMDA3LCAweDM0YTUwMjAwLCAweDNjMDQwMDAxLCAweDI0ODQ2NDg0LAotMHhhZmEwMDAxMCwgMHhhZmEwMDAxNCwgMHg4Zjg2MDExYywgMHgzNGE1MDMwMCwKLTB4YzAwMmIzYiwgMHgzODIxLCAweDhmYmYwMDE4LCAweDNlMDAwMDgsCi0weDI3YmQwMDIwLCAweDhmYTkwMDEwLCAweDhmODMwMTJjLCAweDhmYWEwMDE0LAotMHg4ZmFiMDAxOCwgMHgxMDYwMDAwYSwgMHgyNzYyNGZlMCwgMHgxNDYyMDAwMiwKLTB4MjQ2ODAwMjAsIDB4Mjc2ODQ4MDAsIDB4OGY4MjAxMjgsIDB4MTEwMjAwMDQsCi0weDAsIDB4OGY4MjAxMjQsIDB4MTUwMjAwMDcsIDB4MCwKLTB4OGY0MzAzMzQsIDB4MTAyMSwgMHgyNDYzMDAwMSwgMHhhZjQzMDMzNCwKLTB4MTAwMDAwMzksIDB4OGY0MzAzMzQsIDB4YWM2NDAwMDAsIDB4YWM2NTAwMDQsCi0weGFjNjYwMDA4LCAweGE0NjcwMDBlLCAweGFjNjkwMDE4LCAweGFjNmEwMDFjLAotMHhhYzZiMDAxMCwgMHhhYzYyMDAxNCwgMHhhZjg4MDEyMCwgMHg4ZjQyMDBmYywKLTB4OGY0NDAwZjQsIDB4MjQ0MmZmZmYsIDB4YWY0MjAwZmMsIDB4OGM4MjAwMDAsCi0weDEwNDkwMDA1LCAweDMwNDJmZjhmLCAweDEwNDAwMDE5LCAweDMxMjJmZjhmLAotMHgxMDQwMDAxOCwgMHgzYzAyMDAwMSwgMHg4YzgzMDAwNCwgMHgyYzYyMDAxMCwKLTB4MTA0MDAwMTMsIDB4M2MwMjAwMDEsIDB4MjQ2MzAwMDEsIDB4YWM4MzAwMDQsCi0weDhmNDMwMGY4LCAweDM0NDIzMGM4LCAweDJlMjEwMjEsIDB4NTQ2MjAwMDQsCi0weDI0NjIwMDA4LCAweDNjMDIwMDAxLCAweDM0NDIyZWM4LCAweDJlMjEwMjEsCi0weDE0NDQwMDE1LCAweDI0MDIwMDAxLCAweDhmODIwMTI4LCAweDI0NDIwMDIwLAotMHhhZjgyMDEyOCwgMHg4ZjgyMDEyOCwgMHgxMDAwMDAwZiwgMHgyNDAyMDAwMSwKLTB4M2MwMjAwMDEsIDB4MzQ0MjMwYzgsIDB4MmUyMTAyMSwgMHg1NDgyMDAwNCwKLTB4MjQ4MjAwMDgsIDB4M2MwMjAwMDEsIDB4MzQ0MjJlYzgsIDB4MmUyMTAyMSwKLTB4NDAyMDIxLCAweDI0MDIwMDAxLCAweGFmNDQwMGY0LCAweGFjODkwMDAwLAotMHhhYzgyMDAwNCwgMHgyNDAyMDAwMSwgMHgzZTAwMDA4LCAweDAsCi0weDNlMDAwMDgsIDB4MCwgMHg4ZmE5MDAxMCwgMHg4ZjgzMDEwYywKLTB4OGZhYTAwMTQsIDB4OGZhYjAwMTgsIDB4MTA2MDAwMGEsIDB4Mjc2MjQ3ZTAsCi0weDE0NjIwMDAyLCAweDI0NjgwMDIwLCAweDI3Njg0MDAwLCAweDhmODIwMTA4LAotMHgxMTAyMDAwNCwgMHgwLCAweDhmODIwMTA0LCAweDE1MDIwMDA3LAotMHgwLCAweDhmNDMwMzM4LCAweDEwMjEsIDB4MjQ2MzAwMDEsCi0weGFmNDMwMzM4LCAweDEwMDAwMDM1LCAweDhmNDMwMzM4LCAweGFjNjQwMDAwLAotMHhhYzY1MDAwNCwgMHhhYzY2MDAwOCwgMHhhNDY3MDAwZSwgMHhhYzY5MDAxOCwKLTB4YWM2YTAwMWMsIDB4YWM2YjAwMTAsIDB4YWM2MjAwMTQsIDB4YWY4ODAxMDAsCi0weDhmNDQwMGVjLCAweDhjODIwMDAwLCAweDMwNDIwMDA2LCAweDEwNDAwMDE5LAotMHgzMTIyMDAwNiwgMHgxMDQwMDAxOCwgMHgzYzAyMDAwMSwgMHg4YzgzMDAwNCwKLTB4MmM2MjAwMTAsIDB4MTA0MDAwMTMsIDB4M2MwMjAwMDEsIDB4MjQ2MzAwMDEsCi0weGFjODMwMDA0LCAweDhmNDMwMGYwLCAweDM0NDIyZWMwLCAweDJlMjEwMjEsCi0weDU0NjIwMDA0LCAweDI0NjIwMDA4LCAweDNjMDIwMDAxLCAweDM0NDIyY2MwLAotMHgyZTIxMDIxLCAweDE0NDQwMDE1LCAweDI0MDIwMDAxLCAweDhmODIwMTA4LAotMHgyNDQyMDAyMCwgMHhhZjgyMDEwOCwgMHg4ZjgyMDEwOCwgMHgxMDAwMDAwZiwKLTB4MjQwMjAwMDEsIDB4M2MwMjAwMDEsIDB4MzQ0MjJlYzAsIDB4MmUyMTAyMSwKLTB4NTQ4MjAwMDQsIDB4MjQ4MjAwMDgsIDB4M2MwMjAwMDEsIDB4MzQ0MjJjYzAsCi0weDJlMjEwMjEsIDB4NDAyMDIxLCAweDI0MDIwMDAxLCAweGFmNDQwMGVjLAotMHhhYzg5MDAwMCwgMHhhYzgyMDAwNCwgMHgyNDAyMDAwMSwgMHgzZTAwMDA4LAotMHgwLCAweDNlMDAwMDgsIDB4MCwgMHgyN2JkZmZkOCwKLTB4M2MwNDAwMDEsIDB4MjQ4NDY0OGMsIDB4M2MwNTAwMDEsIDB4YWZiZjAwMjQsCi0weGFmYjIwMDIwLCAweGFmYjEwMDFjLCAweGFmYjAwMDE4LCAweDhmOTAwMTA0LAotMHg4ZjkxMDBiMCwgMHg4ZjkyMDExYywgMHgzNGE1MjUwMCwgMHg4ZjgyMDEwMCwKLTB4MjQwMzAyMSwgMHgyMjAzODIxLCAweGFmYTIwMDEwLCAweGMwMDJiM2IsCi0weGFmYjAwMDE0LCAweDhlMDIwMDA4LCAweGFmYTIwMDEwLCAweDhlMDIwMDBjLAotMHgzYzA0MDAwMSwgMHgyNDg0NjQ5OCwgMHhhZmEyMDAxNCwgMHg4ZTA2MDAwMCwKLTB4OGUwNzAwMDQsIDB4M2MwNTAwMDEsIDB4YzAwMmIzYiwgMHgzNGE1MjUxMCwKLTB4OGUwMjAwMTgsIDB4YWZhMjAwMTAsIDB4OGUwMjAwMWMsIDB4M2MwNDAwMDEsCi0weDI0ODQ2NGE0LCAweGFmYTIwMDE0LCAweDhlMDYwMDEwLCAweDhlMDcwMDE0LAotMHgzYzA1MDAwMSwgMHhjMDAyYjNiLCAweDM0YTUyNTIwLCAweDNjMDI3ZjAwLAotMHgyMjIxMDI0LCAweDNjMDMwODAwLCAweDU0NDMwMDE2LCAweDNjMDMwMjAwLAotMHg4ZjgyMDA5YywgMHgzMDQyZmZmZiwgMHgxNDQwMDAxMiwgMHgzYzAzMDIwMCwKLTB4M2MwNDAwMDEsIDB4MjQ4NDY0YjAsIDB4M2MwNTAwMDIsIDB4MzRhNWYwMzAsCi0weDMwMjEsIDB4MzgyMSwgMHgzNjQyMDAwMiwgMHhhZjgyMDExYywKLTB4MzYyMjAwMDEsIDB4YWY4MjAwYjAsIDB4YWY5MDAxMDQsIDB4YWY5MjAxMWMsCi0weGFmYTAwMDEwLCAweGMwMDJiM2IsIDB4YWZhMDAwMTQsIDB4MTAwMDAwMjQsCi0weDAsIDB4MmMzMTAyNCwgMHgxMDQwMDAwZCwgMHgyMjMxMDI0LAotMHgxMDQwMDAwYiwgMHgzNjQyMDAwMiwgMHhhZjgyMDExYywgMHgzNjIyMDAwMSwKLTB4YWY4MjAwYjAsIDB4YWY5MDAxMDQsIDB4YWY5MjAxMWMsIDB4OGY0MjAzMzAsCi0weDI0NDIwMDAxLCAweGFmNDIwMzMwLCAweDEwMDAwMDE1LCAweDhmNDIwMzMwLAotMHgzYzA0MDAwMSwgMHgyNDg0NjRiOCwgMHgyNDAyMDJhOSwgMHhhZmEyMDAxMCwKLTB4YWZhMDAwMTQsIDB4OGY4NjAxNDQsIDB4M2MwNzAwMDEsIDB4MjRlNzY0YzAsCi0weGMwMDJiM2IsIDB4MzQwNWRlYWQsIDB4OGY4MjAxMWMsIDB4MzQ0MjAwMDIsCi0weGFmODIwMTFjLCAweDhmODIwMjIwLCAweDM0NDIwMDA0LCAweGFmODIwMjIwLAotMHg4ZjgyMDE0MCwgMHgzYzAzMDAwMSwgMHg0MzEwMjUsIDB4YWY4MjAxNDAsCi0weDhmYmYwMDI0LCAweDhmYjIwMDIwLCAweDhmYjEwMDFjLCAweDhmYjAwMDE4LAotMHgzZTAwMDA4LCAweDI3YmQwMDI4LCAweDI3YmRmZmQ4LCAweDNjMDQwMDAxLAotMHgyNDg0NjRlOCwgMHgzYzA1MDAwMSwgMHhhZmJmMDAyNCwgMHhhZmIyMDAyMCwKLTB4YWZiMTAwMWMsIDB4YWZiMDAwMTgsIDB4OGY5MDAxMjQsIDB4OGY5MTAwYTAsCi0weDhmOTIwMTFjLCAweDM0YTUyNjAwLCAweDhmODIwMTIwLCAweDI0MDMwMjEsCi0weDIyMDM4MjEsIDB4YWZhMjAwMTAsIDB4YzAwMmIzYiwgMHhhZmIwMDAxNCwKLTB4OGUwMjAwMDgsIDB4YWZhMjAwMTAsIDB4OGUwMjAwMGMsIDB4M2MwNDAwMDEsCi0weDI0ODQ2NGY0LCAweGFmYTIwMDE0LCAweDhlMDYwMDAwLCAweDhlMDcwMDA0LAotMHgzYzA1MDAwMSwgMHhjMDAyYjNiLCAweDM0YTUyNjEwLCAweDhlMDIwMDE4LAotMHhhZmEyMDAxMCwgMHg4ZTAyMDAxYywgMHgzYzA0MDAwMSwgMHgyNDg0NjUwMCwKLTB4YWZhMjAwMTQsIDB4OGUwNjAwMTAsIDB4OGUwNzAwMTQsIDB4M2MwNTAwMDEsCi0weGMwMDJiM2IsIDB4MzRhNTI2MjAsIDB4M2MwMjdmMDAsIDB4MjIyMTAyNCwKLTB4M2MwMzA4MDAsIDB4NTQ0MzAwMTYsIDB4M2MwMzAyMDAsIDB4OGY4MjAwYWMsCi0weDMwNDJmZmZmLCAweDE0NDAwMDEyLCAweDNjMDMwMjAwLCAweDNjMDQwMDAxLAotMHgyNDg0NjUwYywgMHgzYzA1MDAwMSwgMHgzNGE1ZjAzMCwgMHgzMDIxLAotMHgzODIxLCAweDM2NDIwMDAyLCAweGFmODIwMTFjLCAweDM2MjIwMDAxLAotMHhhZjgyMDBhMCwgMHhhZjkwMDEyNCwgMHhhZjkyMDExYywgMHhhZmEwMDAxMCwKLTB4YzAwMmIzYiwgMHhhZmEwMDAxNCwgMHgxMDAwMDAyNCwgMHgwLAotMHgyYzMxMDI0LCAweDEwNDAwMDBkLCAweDIyMzEwMjQsIDB4MTA0MDAwMGIsCi0weDM2NDIwMDAyLCAweGFmODIwMTFjLCAweDM2MjIwMDAxLCAweGFmODIwMGEwLAotMHhhZjkwMDEyNCwgMHhhZjkyMDExYywgMHg4ZjQyMDMyYywgMHgyNDQyMDAwMSwKLTB4YWY0MjAzMmMsIDB4MTAwMDAwMTUsIDB4OGY0MjAzMmMsIDB4M2MwNDAwMDEsCi0weDI0ODQ2NGI4LCAweDI0MDIwMmUyLCAweGFmYTIwMDEwLCAweGFmYTAwMDE0LAotMHg4Zjg2MDE0NCwgMHgzYzA3MDAwMSwgMHgyNGU3NjRjMCwgMHhjMDAyYjNiLAotMHgzNDA1ZGVhZCwgMHg4ZjgyMDExYywgMHgzNDQyMDAwMiwgMHhhZjgyMDExYywKLTB4OGY4MjAyMjAsIDB4MzQ0MjAwMDQsIDB4YWY4MjAyMjAsIDB4OGY4MjAxNDAsCi0weDNjMDMwMDAxLCAweDQzMTAyNSwgMHhhZjgyMDE0MCwgMHg4ZmJmMDAyNCwKLTB4OGZiMjAwMjAsIDB4OGZiMTAwMWMsIDB4OGZiMDAwMTgsIDB4M2UwMDAwOCwKLTB4MjdiZDAwMjgsIDB4NjAyMSwgMHg1MDIxLCAweDMwMjEsCi0weDI4MjEsIDB4NjgyMSwgMHg0ODIxLCAweDc4MjEsCi0weDcwMjEsIDB4OGY4ODAxMjQsIDB4OGY4NzAxMDQsIDB4MTU4MDAwMmUsCi0weDhmOGIwMTFjLCAweDExYTAwMDE0LCAweDMxNjIwODAwLCAweDhmODIwMTIwLAotMHgxMDQ2MDAyOSwgMHgwLCAweDNjMDQwMDAxLCAweDhjODQ2ZWU0LAotMHg4Y2MyMDAwMCwgMHg4Y2MzMDAwNCwgMHhhYzgyMDAwMCwgMHhhYzgzMDAwNCwKLTB4OGNjMjAwMDgsIDB4YWM4MjAwMDgsIDB4OTRjMjAwMGUsIDB4YTQ4MjAwMGUsCi0weDhjYzIwMDEwLCAweDI0MGMwMDAxLCAweGFjODIwMDEwLCAweDhjYzIwMDE0LAotMHgxMDAwMDAxMiwgMHgyNGM2MDAyMCwgMHgxMDQwMDAxNywgMHgwLAotMHgzYzA0MDAwMSwgMHg4Yzg0NmVlNCwgMHg4ZDAyMDAwMCwgMHg4ZDAzMDAwNCwKLTB4YWM4MjAwMDAsIDB4YWM4MzAwMDQsIDB4OGQwMjAwMDgsIDB4YWM4MjAwMDgsCi0weDk1MDIwMDBlLCAweGE0ODIwMDBlLCAweDhkMDIwMDEwLCAweDI1MDYwMDIwLAotMHhhYzgyMDAxMCwgMHg4ZDAyMDAxNCwgMHgyNDBjMDAwMSwgMHhjMDE4MjEsCi0weGFjODIwMDE0LCAweDI3NjI0ZmUwLCAweDQzMTAyYiwgMHg1NDQwMDAwMSwKLTB4Mjc2MzQ4MDAsIDB4NjAzMDIxLCAweDE1NDAwMDJmLCAweDMxNjIwMTAwLAotMHgxMTIwMDAxNCwgMHgzMTYyODAwMCwgMHg4ZjgyMDEwMCwgMHgxMDQ1MDAyYSwKLTB4MzE2MjAxMDAsIDB4M2MwNDAwMDEsIDB4OGM4NDZlZTAsIDB4OGNhMjAwMDAsCi0weDhjYTMwMDA0LCAweGFjODIwMDAwLCAweGFjODMwMDA0LCAweDhjYTIwMDA4LAotMHhhYzgyMDAwOCwgMHg5NGEyMDAwZSwgMHhhNDgyMDAwZSwgMHg4Y2EyMDAxMCwKLTB4MjQwYTAwMDEsIDB4YWM4MjAwMTAsIDB4OGNhMjAwMTQsIDB4MTAwMDAwMTIsCi0weDI0YTUwMDIwLCAweDEwNDAwMDE4LCAweDMxNjIwMTAwLCAweDNjMDQwMDAxLAotMHg4Yzg0NmVlMCwgMHg4Y2UyMDAwMCwgMHg4Y2UzMDAwNCwgMHhhYzgyMDAwMCwKLTB4YWM4MzAwMDQsIDB4OGNlMjAwMDgsIDB4YWM4MjAwMDgsIDB4OTRlMjAwMGUsCi0weGE0ODIwMDBlLCAweDhjZTIwMDEwLCAweDI0ZTUwMDIwLCAweGFjODIwMDEwLAotMHg4Y2UyMDAxNCwgMHgyNDBhMDAwMSwgMHhhMDE4MjEsIDB4YWM4MjAwMTQsCi0weDI3NjI0N2UwLCAweDQzMTAyYiwgMHg1NDQwMDAwMSwgMHgyNzYzNDAwMCwKLTB4NjAyODIxLCAweDMxNjIwMTAwLCAweDU0NDAwMDFkLCAweDMxNjIxMDAwLAotMHgxMWEwMDAwOSwgMHgzMWEyMDgwMCwgMHgxMDQwMDAwNCwgMHgyNTAyMDAyMCwKLTB4OGY4MjAwYTgsIDB4YTVlMjAwMDAsIDB4MjUwMjAwMjAsIDB4YWY4MjAxMjQsCi0weDhmODgwMTI0LCAweDY4MjEsIDB4MTE4MDAwMTEsIDB4MzE2MjEwMDAsCi0weDNjMDQwMDAxLCAweDhjODQ2ZWU0LCAweDhjODIwMDAwLCAweDhjODMwMDA0LAotMHhhZjgyMDA4MCwgMHhhZjgzMDA4NCwgMHg4YzgyMDAwOCwgMHhhZjgyMDBhNCwKLTB4OTQ4MjAwMGUsIDB4YWY4MjAwYWMsIDB4OGM4MjAwMTAsIDB4NjAyMSwKLTB4YWY4MjAwYTAsIDB4OGM4ZDAwMTAsIDB4OGM4ZjAwMTQsIDB4MzE2MjEwMDAsCi0weDE0NDBmZjgyLCAweDAsIDB4MTEyMDAwMGYsIDB4MzEyMjA4MDAsCi0weDEwNDAwMDA0LCAweDNjMDIwMDAyLCAweDhmODIwMGI4LCAweGE1YzIwMDAwLAotMHgzYzAyMDAwMiwgMHgxMjIxMDI0LCAweDEwNDAwMDA0LCAweDI0ZTIwMDIwLAotMHg4ZjgyMDBiNCwgMHhhZjgyMDBkNCwgMHgyNGUyMDAyMCwgMHhhZjgyMDEwNCwKLTB4OGY4NzAxMDQsIDB4NDgyMSwgMHgxMTQwZmY3MCwgMHgwLAotMHgzYzA0MDAwMSwgMHg4Yzg0NmVlMCwgMHg4YzgyMDAwMCwgMHg4YzgzMDAwNCwKLTB4YWY4MjAwOTAsIDB4YWY4MzAwOTQsIDB4OGM4MjAwMDgsIDB4YWY4MjAwYjQsCi0weDk0ODIwMDBlLCAweGFmODIwMDljLCAweDhjODIwMDEwLCAweDUwMjEsCi0weGFmODIwMGIwLCAweDhjODkwMDEwLCAweDEwMDBmZjYwLCAweDhjOGUwMDE0LAotMHgzZTAwMDA4LCAweDAsIDB4NjAyMSwgMHg1ODIxLAotMHgzMDIxLCAweDI4MjEsIDB4NjgyMSwgMHg1MDIxLAotMHg3ODIxLCAweDcwMjEsIDB4OGY4ODAxMjQsIDB4OGY4NzAxMDQsCi0weDNjMTgwMTAwLCAweDE1ODAwMDJlLCAweDhmODkwMTFjLCAweDExYTAwMDE0LAotMHgzMTIyMDgwMCwgMHg4ZjgyMDEyMCwgMHgxMDQ2MDAyOSwgMHgwLAotMHgzYzA0MDAwMSwgMHg4Yzg0NmVlNCwgMHg4Y2MyMDAwMCwgMHg4Y2MzMDAwNCwKLTB4YWM4MjAwMDAsIDB4YWM4MzAwMDQsIDB4OGNjMjAwMDgsIDB4YWM4MjAwMDgsCi0weDk0YzIwMDBlLCAweGE0ODIwMDBlLCAweDhjYzIwMDEwLCAweDI0MGMwMDAxLAotMHhhYzgyMDAxMCwgMHg4Y2MyMDAxNCwgMHgxMDAwMDAxMiwgMHgyNGM2MDAyMCwKLTB4MTA0MDAwMTcsIDB4MCwgMHgzYzA0MDAwMSwgMHg4Yzg0NmVlNCwKLTB4OGQwMjAwMDAsIDB4OGQwMzAwMDQsIDB4YWM4MjAwMDAsIDB4YWM4MzAwMDQsCi0weDhkMDIwMDA4LCAweGFjODIwMDA4LCAweDk1MDIwMDBlLCAweGE0ODIwMDBlLAotMHg4ZDAyMDAxMCwgMHgyNTA2MDAyMCwgMHhhYzgyMDAxMCwgMHg4ZDAyMDAxNCwKLTB4MjQwYzAwMDEsIDB4YzAxODIxLCAweGFjODIwMDE0LCAweDI3NjI0ZmUwLAotMHg0MzEwMmIsIDB4NTQ0MDAwMDEsIDB4Mjc2MzQ4MDAsIDB4NjAzMDIxLAotMHgxNTYwMDAyZiwgMHgzMTIyMDEwMCwgMHgxMTQwMDAxNCwgMHgzMTIyODAwMCwKLTB4OGY4MjAxMDAsIDB4MTA0NTAwMmEsIDB4MzEyMjAxMDAsIDB4M2MwNDAwMDEsCi0weDhjODQ2ZWUwLCAweDhjYTIwMDAwLCAweDhjYTMwMDA0LCAweGFjODIwMDAwLAotMHhhYzgzMDAwNCwgMHg4Y2EyMDAwOCwgMHhhYzgyMDAwOCwgMHg5NGEyMDAwZSwKLTB4YTQ4MjAwMGUsIDB4OGNhMjAwMTAsIDB4MjQwYjAwMDEsIDB4YWM4MjAwMTAsCi0weDhjYTIwMDE0LCAweDEwMDAwMDEyLCAweDI0YTUwMDIwLCAweDEwNDAwMDE4LAotMHgzMTIyMDEwMCwgMHgzYzA0MDAwMSwgMHg4Yzg0NmVlMCwgMHg4Y2UyMDAwMCwKLTB4OGNlMzAwMDQsIDB4YWM4MjAwMDAsIDB4YWM4MzAwMDQsIDB4OGNlMjAwMDgsCi0weGFjODIwMDA4LCAweDk0ZTIwMDBlLCAweGE0ODIwMDBlLCAweDhjZTIwMDEwLAotMHgyNGU1MDAyMCwgMHhhYzgyMDAxMCwgMHg4Y2UyMDAxNCwgMHgyNDBiMDAwMSwKLTB4YTAxODIxLCAweGFjODIwMDE0LCAweDI3NjI0N2UwLCAweDQzMTAyYiwKLTB4NTQ0MDAwMDEsIDB4Mjc2MzQwMDAsIDB4NjAyODIxLCAweDMxMjIwMTAwLAotMHg1NDQwMDAxZCwgMHgzMTIyMTAwMCwgMHgxMWEwMDAwOSwgMHgzMWEyMDgwMCwKLTB4MTA0MDAwMDQsIDB4MjUwMjAwMjAsIDB4OGY4MjAwYTgsIDB4YTVlMjAwMDAsCi0weDI1MDIwMDIwLCAweGFmODIwMTI0LCAweDhmODgwMTI0LCAweDY4MjEsCi0weDExODAwMDExLCAweDMxMjIxMDAwLCAweDNjMDQwMDAxLCAweDhjODQ2ZWU0LAotMHg4YzgyMDAwMCwgMHg4YzgzMDAwNCwgMHhhZjgyMDA4MCwgMHhhZjgzMDA4NCwKLTB4OGM4MjAwMDgsIDB4YWY4MjAwYTQsIDB4OTQ4MjAwMGUsIDB4YWY4MjAwYWMsCi0weDhjODIwMDEwLCAweDYwMjEsIDB4YWY4MjAwYTAsIDB4OGM4ZDAwMTAsCi0weDhjOGYwMDE0LCAweDMxMjIxMDAwLCAweDE0NDAwMDIyLCAweDAsCi0weDExNDAwMDBmLCAweDMxNDIwODAwLCAweDEwNDAwMDA0LCAweDNjMDIwMDAyLAotMHg4ZjgyMDBiOCwgMHhhNWMyMDAwMCwgMHgzYzAyMDAwMiwgMHgxNDIxMDI0LAotMHgxMDQwMDAwNCwgMHgyNGUyMDAyMCwgMHg4ZjgyMDBiNCwgMHhhZjgyMDBkNCwKLTB4MjRlMjAwMjAsIDB4YWY4MjAxMDQsIDB4OGY4NzAxMDQsIDB4NTAyMSwKLTB4MTE2MDAwMTAsIDB4MCwgMHgzYzA0MDAwMSwgMHg4Yzg0NmVlMCwKLTB4OGM4MjAwMDAsIDB4OGM4MzAwMDQsIDB4YWY4MjAwOTAsIDB4YWY4MzAwOTQsCi0weDhjODIwMDA4LCAweGFmODIwMGI0LCAweDk0ODIwMDBlLCAweGFmODIwMDljLAotMHg4YzgyMDAxMCwgMHg1ODIxLCAweGFmODIwMGIwLCAweDhjOGEwMDEwLAotMHg4YzhlMDAxNCwgMHg4ZjgyMDA3MCwgMHgzYzAzMTAwMCwgMHg0MzEwMjQsCi0weDEwNDBmZjVjLCAweDAsIDB4OGY4MjAwNTQsIDB4MjQ0MjAwMDUsCi0weGFmODIwMDc4LCAweDhjMDQwMjM0LCAweDEwODAwMDE2LCAweDE4MjEsCi0weDNjMDIwMDAxLCAweDU3MTAyMSwgMHg4YzQyNDBlOCwgMHgyNDQyMDAwNSwKLTB4M2MwMTAwMDEsIDB4MzcwODIxLCAweGFjMjI0MGU4LCAweDNjMDIwMDAxLAotMHg1NzEwMjEsIDB4OGM0MjQwZTgsIDB4NDQxMDJiLCAweDE0NDAwMDA5LAotMHgyNDAyMDAwMSwgMHgzYzAzMDA4MCwgMHgzYzAxMDAwMSwgMHgzNzA4MjEsCi0weGFjMjA0MGU4LCAweDNjMDEwMDAxLCAweDM3MDgyMSwgMHgxMDAwMDAwYywKLTB4YTAyMjQwZjAsIDB4M2MwMjAwMDEsIDB4NTcxMDIxLCAweDkwNDI0MGYwLAotMHgxNDQwMDAwNiwgMHgzYzAyMDA4MCwgMHgzYzAyMDAwMSwgMHg1NzEwMjEsCi0weDkwNDI0MGYxLCAweDEwNDAwMDAyLCAweDNjMDIwMDgwLCAweDYyMTgyNSwKLTB4OGMwNDAyMzAsIDB4MTA4MDAwMTMsIDB4MCwgMHgzYzAyMDAwMSwKLTB4NTcxMDIxLCAweDhjNDI0MGVjLCAweDI0NDIwMDA1LCAweDNjMDEwMDAxLAotMHgzNzA4MjEsIDB4YWMyMjQwZWMsIDB4M2MwMjAwMDEsIDB4NTcxMDIxLAotMHg4YzQyNDBlYywgMHg0NDEwMmIsIDB4MTQ0MDAwMDYsIDB4MCwKLTB4M2MwMTAwMDEsIDB4MzcwODIxLCAweGFjMjA0MGVjLCAweDEwMDAwMDA2LAotMHg3ODE4MjUsIDB4M2MwMjAwMDEsIDB4NTcxMDIxLCAweDkwNDI0MGYyLAotMHg1NDQwMDAwMSwgMHg3ODE4MjUsIDB4MTA2MGZmMWEsIDB4MCwKLTB4OGY0MjAwMDAsIDB4MTA0MDAwMDcsIDB4MCwgMHhhZjgwMDA0YywKLTB4OGY4MjAwNGMsIDB4MTA0MGZmZmQsIDB4MCwgMHgxMDAwMDAwNSwKLTB4MCwgMHhhZjgwMDA0OCwgMHg4ZjgyMDA0OCwgMHgxMDQwZmZmZCwKLTB4MCwgMHg4ZjgyMDA2MCwgMHg0MzEwMjUsIDB4YWY4MjAwNjAsCi0weDhmNDIwMDAwLCAweDEwNDAwMDAzLCAweDAsIDB4MTAwMGZmMDUsCi0weGFmODAwMDRjLCAweDEwMDBmZjAzLCAweGFmODAwMDQ4LCAweDNlMDAwMDgsCi0weDAsIDB4MCwgMHgwLCAweDNjMDIwMDAxLAotMHg4YzQyNmQyOCwgMHgyN2JkZmZlOCwgMHhhZmJmMDAxNCwgMHgxNDQwMDAxMiwKLTB4YWZiMDAwMTAsIDB4M2MxMDAwMDEsIDB4MjYxMDZmOTAsIDB4MjAwMjAyMSwKLTB4YzAwMmJhOCwgMHgyNDA1MjAwMCwgMHgyNjAyMWZlMCwgMHgzYzAxMDAwMSwKLTB4YWMyMjZlZWMsIDB4M2MwMTAwMDEsIDB4YWMyMjZlZTgsIDB4YWMwMjAyNTAsCi0weDI0MDIyMDAwLCAweGFjMTAwMjU0LCAweGFjMDIwMjU4LCAweDI0MDIwMDAxLAotMHgzYzAxMDAwMSwgMHhhYzIyNmQyOCwgMHg4ZmJmMDAxNCwgMHg4ZmIwMDAxMCwKLTB4M2UwMDAwOCwgMHgyN2JkMDAxOCwgMHgzYzA5MDAwMSwgMHg4ZDI5NmVlYywKLTB4OGM4MjAwMDAsIDB4OGZhMzAwMTAsIDB4OGZhODAwMTQsIDB4YWQyMjAwMDAsCi0weDhjODIwMDA0LCAweGFkMjUwMDA4LCAweGFkMjIwMDA0LCAweDhmODIwMDU0LAotMHhhZDI2MDAxMCwgMHhhZDI3MDAxNCwgMHhhZDIzMDAxOCwgMHhhZDI4MDAxYywKLTB4YWQyMjAwMGMsIDB4MjUyOWZmZTAsIDB4M2MwMjAwMDEsIDB4MjQ0MjZmOTAsCi0weDEyMjEwMmIsIDB4MTA0MDAwMDMsIDB4MCwgMHgzYzA5MDAwMSwKLTB4OGQyOTZlZTgsIDB4M2MwMjAwMDEsIDB4OGM0MjZkMTAsIDB4YWQyMjAwMDAsCi0weDNjMDIwMDAxLCAweDhjNDI2ZDEwLCAweDNjMDEwMDAxLCAweGFjMjk2ZWVjLAotMHhhZDIyMDAwNCwgMHhhYzA5MDI1MCwgMHgzZTAwMDA4LCAweDAsCi0weDI3YmRmZmQwLCAweGFmYjAwMDEwLCAweDNjMTAwMDAxLCAweDhlMTA2ZWVjLAotMHgzYzAyMDAwMSwgMHg4YzQyNmQxMCwgMHhhZmIxMDAxNCwgMHg4MDg4MjEsCi0weGFmYmUwMDI0LCAweDhmYmUwMDQwLCAweDhmYTQwMDQ4LCAweGFmYjIwMDE4LAotMHhhMDkwMjEsIDB4YWZiZjAwMjgsIDB4YWZiNTAwMjAsIDB4YWZiMzAwMWMsCi0weGFlMDIwMDAwLCAweDNjMDIwMDAxLCAweDhjNDI2ZDEwLCAweGMwOTgyMSwKLTB4ZTBhODIxLCAweDEwODAwMDA2LCAweGFlMDIwMDA0LCAweDI2MDUwMDA4LAotMHhjMDAyYmIzLCAweDI0MDYwMDE4LCAweDEwMDAwMDA1LCAweDI2MTBmZmUwLAotMHgyNjA0MDAwOCwgMHhjMDAyYmE4LCAweDI0MDUwMDE4LCAweDI2MTBmZmUwLAotMHgzYzAzMDAwMSwgMHgyNDYzNmY5MCwgMHgyMDMxMDJiLCAweDEwNDAwMDAzLAotMHgwLCAweDNjMTAwMDAxLCAweDhlMTA2ZWU4LCAweDhlMjIwMDAwLAotMHhhZTAyMDAwMCwgMHg4ZTIyMDAwNCwgMHhhZTEyMDAwOCwgMHhhZTAyMDAwNCwKLTB4OGY4MjAwNTQsIDB4YWUxMzAwMTAsIDB4YWUxNTAwMTQsIDB4YWUxZTAwMTgsCi0weDhmYTgwMDQ0LCAweGFlMDgwMDFjLCAweGFlMDIwMDBjLCAweDI2MTBmZmUwLAotMHgyMDMxMDJiLCAweDEwNDAwMDAzLCAweDAsIDB4M2MxMDAwMDEsCi0weDhlMTA2ZWU4LCAweDNjMDIwMDAxLCAweDhjNDI2ZDEwLCAweGFlMDIwMDAwLAotMHgzYzAyMDAwMSwgMHg4YzQyNmQxMCwgMHgzYzAxMDAwMSwgMHhhYzMwNmVlYywKLTB4YWUwMjAwMDQsIDB4YWMxMDAyNTAsIDB4OGZiZjAwMjgsIDB4OGZiZTAwMjQsCi0weDhmYjUwMDIwLCAweDhmYjMwMDFjLCAweDhmYjIwMDE4LCAweDhmYjEwMDE0LAotMHg4ZmIwMDAxMCwgMHgzZTAwMDA4LCAweDI3YmQwMDMwLCAweDg1MTgyMSwKLTB4ODMxMDJiLCAweDEwNDAwMDA2LCAweDAsIDB4YWM4MDAwMDAsCi0weDI0ODQwMDA0LCAweDgzMTAyYiwgMHg1NDQwZmZmZCwgMHhhYzgwMDAwMCwKLTB4M2UwMDAwOCwgMHgwLCAweGE2MTgyMSwgMHhhMzEwMmIsCi0weDEwNDAwMDA3LCAweDAsIDB4OGM4MjAwMDAsIDB4YWNhMjAwMDAsCi0weDI0YTUwMDA0LCAweGEzMTAyYiwgMHgxNDQwZmZmYiwgMHgyNDg0MDAwNCwKLTB4M2UwMDAwOCwgMHgwLCAweDg2MTgyMSwgMHg4MzEwMmIsCi0weDEwNDAwMDA3LCAweDAsIDB4OGNhMjAwMDAsIDB4YWM4MjAwMDAsCi0weDI0ODQwMDA0LCAweDgzMTAyYiwgMHgxNDQwZmZmYiwgMHgyNGE1MDAwNCwKLTB4M2UwMDAwOCwgMHgwLCAweDYzMDgwLCAweDg2MTgyMSwKLTB4ODMxMDJiLCAweDEwNDAwMDA2LCAweDAsIDB4YWM4NTAwMDAsCi0weDI0ODQwMDA0LCAweDgzMTAyYiwgMHg1NDQwZmZmZCwgMHhhYzg1MDAwMCwKLTB4M2UwMDAwOCwgMHgwLCAweDAsIDB4MjZlNTAwMjgsCi0weGEwMzAyMSwgMHgyNzQzMDFjMCwgMHg4ZjRkMDM1OCwgMHg4ZjQ3MDM1YywKLTB4OGY0ODAzNjAsIDB4OGY0OTAzNjQsIDB4OGY0YTAzNjgsIDB4OGY0YjAyMDQsCi0weDhmNGMwMjAwLCAweDI0NjQwNDAwLCAweDY0MTAyYiwgMHgxMDQwMDAwOCwKLTB4M2MwMjA4ZmYsIDB4OGNjMjAwMDAsIDB4YWM2MjAwMDAsIDB4MjQ2MzAwMDQsCi0weDY0MTAyYiwgMHgxNDQwZmZmYiwgMHgyNGM2MDAwNCwgMHgzYzAyMDhmZiwKLTB4MzQ0MmZmZmYsIDB4M2MwM2MwZmYsIDB4YWY0ZDAzNTgsIDB4YWY0NzAzNWMsCi0weGFmNDgwMzYwLCAweGFmNDkwMzY0LCAweGFmNGEwMzY4LCAweGFmNGIwMjA0LAotMHhhZjRjMDIwMCwgMHg4Zjg0MDIyMCwgMHgzNDYzZmZmZiwgMHg4Zjg2MDIwMCwKLTB4ODIxMDI0LCAweDM0NDIwMDA0LCAweGMzMTgyNCwgMHgzNDYzMDAwNCwKLTB4YWY4MjAyMjAsIDB4YWY4MzAyMDAsIDB4OGNhMjAyMTQsIDB4YWMwMjAwODQsCi0weDhjYTIwMjE4LCAweGFjMDIwMDg4LCAweDhjYTIwMjFjLCAweGFjMDIwMDhjLAotMHg4Y2EyMDIyMCwgMHhhYzAyMDA5MCwgMHg4Y2EyMDIyNCwgMHhhYzAyMDA5NCwKLTB4OGNhMjAyMjgsIDB4YWMwMjAwOTgsIDB4OGNhMjAyMmMsIDB4YWMwMjAwOWMsCi0weDhjYTIwMjMwLCAweGFjMDIwMGEwLCAweDhjYTIwMjM0LCAweGFjMDIwMGE0LAotMHg4Y2EyMDIzOCwgMHhhYzAyMDBhOCwgMHg4Y2EyMDIzYywgMHhhYzAyMDBhYywKLTB4OGNhMjAyNDAsIDB4YWMwMjAwYjAsIDB4OGNhMjAyNDQsIDB4YWMwMjAwYjQsCi0weDhjYTIwMjQ4LCAweGFjMDIwMGI4LCAweDhjYTIwMjRjLCAweGFjMDIwMGJjLAotMHg4Y2EyMDAxYywgMHhhYzAyMDA4MCwgMHg4Y2EyMDAxOCwgMHhhYzAyMDBjMCwKLTB4OGNhMjAwMjAsIDB4YWMwMjAwY2MsIDB4OGNhMjAwMjQsIDB4YWMwMjAwZDAsCi0weDhjYTIwMWQwLCAweGFjMDIwMGUwLCAweDhjYTIwMWQ0LCAweGFjMDIwMGU0LAotMHg4Y2EyMDFkOCwgMHhhYzAyMDBlOCwgMHg4Y2EyMDFkYywgMHhhYzAyMDBlYywKLTB4OGNhMjAxZTAsIDB4YWMwMjAwZjAsIDB4OGNhMjAwOTgsIDB4OGNhMzAwOWMsCi0weGFjMDMwMGZjLCAweDhjYTIwMGE4LCAweDhjYTMwMGFjLCAweGFjMDMwMGY0LAotMHg4Y2EyMDBhMCwgMHg4Y2EzMDBhNCwgMHgzMDg0MDAwNCwgMHhhYzAzMDBmOCwKLTB4MTQ4MDAwMDcsIDB4MzBjMjAwMDQsIDB4OGY4MjAyMjAsIDB4M2MwMzA4ZmYsCi0weDM0NjNmZmZiLCAweDQzMTAyNCwgMHhhZjgyMDIyMCwgMHgzMGMyMDAwNCwKLTB4MTQ0MDAwMDYsIDB4MCwgMHg4ZjgyMDIwMCwgMHgzYzAzYzBmZiwKLTB4MzQ2M2ZmZmIsIDB4NDMxMDI0LCAweGFmODIwMjAwLCAweDhmNDIwMmRjLAotMHhhMzQwMDVjNSwgMHgyNDQyMDAwMSwgMHhhZjQyMDJkYywgMHg4ZjQyMDJkYywKLTB4M2UwMDAwOCwgMHgwLCAweDI3YmRmZmQ4LCAweGFmYmYwMDI0LAotMHhhZmIwMDAyMCwgMHg4ZjQzMDAyNCwgMHg4ZjQyMDAyMCwgMHgxMDYyMDAzOCwKLTB4MCwgMHg4ZjQzMDAyMCwgMHg4ZjQyMDAyNCwgMHg2MjIwMjMsCi0weDQ4MTAwMDMsIDB4MCwgMHg4ZjQyMDA0MCwgMHg4MjIwMjEsCi0weDhmNDMwMDMwLCAweDhmNDIwMDI0LCAweDQzMTAyYiwgMHgxNDQwMDAwNSwKLTB4MCwgMHg4ZjQzMDA0MCwgMHg4ZjQyMDAyNCwgMHgxMDAwMDAwNSwKLTB4NjIxMDIzLCAweDhmNDIwMDMwLCAweDhmNDMwMDI0LCAweDQzMTAyMywKLTB4MjQ0MmZmZmYsIDB4NDA2MDIxLCAweDhjMTAyYSwgMHg1NDQwMDAwMSwKLTB4ODA2MDIxLCAweDhmNGEwMDI0LCAweDhmNDkwMDQwLCAweDhmNDgwMDI0LAotMHg4ZjQ0MDE4MCwgMHg4ZjQ1MDE4NCwgMHg4ZjQ2MDAyNCwgMHg4ZjRiMDAxYywKLTB4MjQwNzAwMDEsIDB4YWZhNzAwMTAsIDB4ODQxMDAsIDB4MTAwMTgyMSwKLTB4MTRjNTAyMSwgMHgyNTI5ZmZmZiwgMHgxNDk4MDI0LCAweGFmYjAwMDE0LAotMHg4ZjQ3MDAxNCwgMHgxMDIxLCAweDYzMTAwLCAweGFmYTcwMDE4LAotMHhhMzI4MjEsIDB4YTMzODJiLCAweDgyMjAyMSwgMHg4NzIwMjEsCi0weDhmNDIwMTA4LCAweDE2NjMwMjEsIDB4NDBmODA5LCAweGMzOTAwLAotMHg1NDQwMDAwMSwgMHhhZjUwMDAyNCwgMHg4ZjQzMDAyNCwgMHg4ZjQyMDAyMCwKLTB4MTQ2MjAwMTgsIDB4MCwgMHg4ZjQyMDAwMCwgMHgxMDQwMDAwNywKLTB4MCwgMHhhZjgwMDA0YywgMHg4ZjgyMDA0YywgMHgxMDQwZmZmZCwKLTB4MCwgMHgxMDAwMDAwNSwgMHgwLCAweGFmODAwMDQ4LAotMHg4ZjgyMDA0OCwgMHgxMDQwZmZmZCwgMHgwLCAweDhmODIwMDYwLAotMHgyNDAzZmZlZiwgMHg0MzEwMjQsIDB4YWY4MjAwNjAsIDB4OGY0MjAwMDAsCi0weDEwNDAwMDAzLCAweDAsIDB4MTAwMDAwMDIsIDB4YWY4MDAwNGMsCi0weGFmODAwMDQ4LCAweDhmYmYwMDI0LCAweDhmYjAwMDIwLCAweDNlMDAwMDgsCi0weDI3YmQwMDI4LCAweDNlMDAwMDgsIDB4MCwgMHgyN2JkZmZjMCwKLTB4MzJjMjAwMjAsIDB4YWZiZjAwMzgsIDB4YWZiMzAwMzQsIDB4YWZiMjAwMzAsCi0weGFmYjEwMDJjLCAweDEwNDAwMDA0LCAweGFmYjAwMDI4LCAweDhmNTMwMDI4LAotMHgxMDAwMDAwMiwgMHgwLCAweDhmNTMwMDIwLCAweDhmNDIwMDMwLAotMHgxMDUzMDBlYiwgMHgyMTEwMCwgMHg4ZjQzMDAxYywgMHg2MjgwMjEsCi0weDhlMDQwMDAwLCAweDhlMDUwMDA0LCAweDk2MTIwMDA4LCAweDhmNDIwMDkwLAotMHg5NjExMDAwYSwgMHgzMjQ2ZmZmZiwgMHg0NjEwMmEsIDB4MTA0MDAwMTcsCi0weDAsIDB4OGY4MjAwZDgsIDB4OGY0MzAwOTgsIDB4NDMxMDIzLAotMHgyNDQyZGNiZSwgMHhhZjQyMDA5MCwgMHg4ZjQyMDA5MCwgMHgyODQyZGNiZiwKLTB4MTA0MDAwMDUsIDB4MCwgMHg4ZjQyMDA5MCwgMHg4ZjQzMDE0NCwKLTB4NDMxMDIxLCAweGFmNDIwMDkwLCAweDhmNDIwMDkwLCAweDQ2MTAyYSwKLTB4MTA0MDAwMDYsIDB4MCwgMHg4ZjQyMDM0OCwgMHgyNDQyMDAwMSwKLTB4YWY0MjAzNDgsIDB4MTAwMDAwZTEsIDB4OGY0MjAzNDgsIDB4OGY4MjAwZmMsCi0weDE0NDAwMDA2LCAweDAsIDB4OGY0MjAzNDQsIDB4MjQ0MjAwMDEsCi0weGFmNDIwMzQ0LCAweDEwMDAwMGQ5LCAweDhmNDIwMzQ0LCAweDkzNDIwNWMyLAotMHgxMDQwMDAwYiwgMHgzMmMyMDAwOCwgMHgxMDQwMDAwOCwgMHgzMjIyMDIwMCwKLTB4MTA0MDAwMDYsIDB4M2MwMzQwMDAsIDB4OTYwMjAwMGUsIDB4YWY0MzAwYWMsCi0weDIxNDAwLCAweDEwMDAwMDAyLCAweGFmNDIwMGIwLCAweGFmNDAwMGFjLAotMHgzMjIyMDAwNCwgMHgxMDQwMDA3ZiwgMHgzMjIyMDgwMCwgMHgxMDQwMDAwMywKLTB4MzI0N2ZmZmYsIDB4MTAwMDAwMDIsIDB4MjQwMjAwMjAsIDB4MjQwMjAwMDQsCi0weGFmYTIwMDEwLCAweDhmNDIwMDMwLCAweGFmYTIwMDE0LCAweDhmNDIwMDEwLAotMHgzYzAzMDAwMiwgMHg0MzEwMjUsIDB4YWZhMjAwMTgsIDB4OGY0NjAwOTgsCi0weDhmNDIwMTA4LCAweDQwZjgwOSwgMHgwLCAweDEwNDAwMGI3LAotMHgwLCAweDhmNDIwMDljLCAweDhmNDMwMDk0LCAweDI0MjEwMjEsCi0weGFmNDIwMDljLCAweGFlMDMwMDBjLCAweDhmNDIwMGFjLCAweDEwNDAwMDA4LAotMHgzYzAzNDAwMCwgMHg4ZjQyMDA5NCwgMHg0MzEwMjUsIDB4YWZhMjAwMjAsCi0weDhmNDIwMDljLCAweDhmNDMwMGIwLCAweDEwMDAwMDA0LCAweDQzMTAyNSwKLTB4OGY0MjAwOTQsIDB4YWZhMjAwMjAsIDB4OGY0MjAwOWMsIDB4YWZhMjAwMjQsCi0weDhmODIwMGZjLCAweDhmYTMwMDIwLCAweDhmYTQwMDI0LCAweGFjNDMwMDAwLAotMHhhYzQ0MDAwNCwgMHgyNDQyMDAwOCwgMHhhZjgyMDBmMCwgMHg4ZjQyMDA5YywKLTB4OGY0NDAyNzAsIDB4OGY0NTAyNzQsIDB4NDAxODIxLCAweDEwMjEsCi0weGEzMjgyMSwgMHhhMzMwMmIsIDB4ODIyMDIxLCAweDg2MjAyMSwKLTB4MzIyMzAwNjAsIDB4MjQwMjAwNDAsIDB4YWY0NDAyNzAsIDB4YWY0NTAyNzQsCi0weDEwNjIwMDE3LCAweDJjNjIwMDQxLCAweDEwNDAwMDA1LCAweDI0MDIwMDIwLAotMHgxMDYyMDAwOCwgMHgyNDAyMDAwMSwgMHgxMDAwMDAyNiwgMHgwLAotMHgyNDAyMDA2MCwgMHgxMDYyMDAxOSwgMHgyNDAyMDAwMSwgMHgxMDAwMDAyMSwKLTB4MCwgMHg4ZjQyMDI3OCwgMHg4ZjQzMDI3YywgMHgyNDYzMDAwMSwKLTB4MmM2NDAwMDEsIDB4NDQxMDIxLCAweGFmNDIwMjc4LCAweGFmNDMwMjdjLAotMHg4ZjQyMDI3OCwgMHg4ZjQzMDI3YywgMHgxMDAwMDAxNiwgMHgyNDAyMDAwMSwKLTB4OGY0MjAyODAsIDB4OGY0MzAyODQsIDB4MjQ2MzAwMDEsIDB4MmM2NDAwMDEsCi0weDQ0MTAyMSwgMHhhZjQyMDI4MCwgMHhhZjQzMDI4NCwgMHg4ZjQyMDI4MCwKLTB4OGY0MzAyODQsIDB4MTAwMDAwMGIsIDB4MjQwMjAwMDEsIDB4OGY0MjAyODgsCi0weDhmNDMwMjhjLCAweDI0NjMwMDAxLCAweDJjNjQwMDAxLCAweDQ0MTAyMSwKLTB4YWY0MjAyODgsIDB4YWY0MzAyOGMsIDB4OGY0MjAyODgsIDB4OGY0MzAyOGMsCi0weDI0MDIwMDAxLCAweGEzNDIwNWMyLCAweDhmNDIwMDk4LCAweDMyNDRmZmZmLAotMHgyNDA2ZmZmOCwgMHg4ZjQ1MDEzYywgMHg0NDEwMjEsIDB4MjQ0MjAwMDcsCi0weDQ2MTAyNCwgMHgyNDg0MDAwNywgMHhhZjQyMDA5NCwgMHg4ZjQyMDA5MCwKLTB4OGY0MzAwOTQsIDB4ODYyMDI0LCAweDQ0MTAyMywgMHg2NTE4MmIsCi0weDE0NjAwMDA1LCAweGFmNDIwMDkwLCAweDhmNDIwMDk0LCAweDhmNDMwMTQ0LAotMHg0MzEwMjMsIDB4YWY0MjAwOTQsIDB4OGY0MjAwOTQsIDB4MTAwMDAwMjMsCi0weGFmNDAwMDljLCAweDMyNDdmZmZmLCAweDUwZTAwMDIyLCAweDMyYzIwMDIwLAotMHgxNDQwMDAwMiwgMHgyNDAyMDAxMCwgMHgyNDAyMDAwMiwgMHhhZmEyMDAxMCwKLTB4OGY0MjAwMzAsIDB4YWZhMjAwMTQsIDB4OGY0MjAwMTAsIDB4YWZhMjAwMTgsCi0weDhmNDYwMDk4LCAweDhmNDIwMTA4LCAweDQwZjgwOSwgMHgwLAotMHgxMDQwMDAzYSwgMHgzMjQ1ZmZmZiwgMHg4ZjQyMDA5OCwgMHg4ZjQzMDA5MCwKLTB4OGY0NjAxM2MsIDB4NDUxMDIxLCAweGFmNDIwMDk4LCAweDhmNDIwMDljLAotMHg4ZjQ0MDA5OCwgMHhhMzQwMDVjMiwgMHg2NTE4MjMsIDB4YWY0MzAwOTAsCi0weDQ1MTAyMSwgMHg4NjIwMmIsIDB4MTQ4MDAwMDUsIDB4YWY0MjAwOWMsCi0weDhmNDIwMDk4LCAweDhmNDMwMTQ0LCAweDQzMTAyMywgMHhhZjQyMDA5OCwKLTB4MzJjMjAwMjAsIDB4MTA0MDAwMDUsIDB4MCwgMHg4ZjQyMDM1OCwKLTB4MjQ0MmZmZmYsIDB4YWY0MjAzNTgsIDB4OGY0MjAzNTgsIDB4OGY0MjAwMzAsCi0weDhmNDMwMDQwLCAweDI0NDIwMDAxLCAweDI0NjNmZmZmLCAweDQzMTAyNCwKLTB4YWY0MjAwMzAsIDB4OGY0MjAwMzAsIDB4MTQ1MzAwMTgsIDB4MCwKLTB4OGY0MjAwMDAsIDB4MTA0MDAwMDcsIDB4MCwgMHhhZjgwMDA0YywKLTB4OGY4MjAwNGMsIDB4MTA0MGZmZmQsIDB4MCwgMHgxMDAwMDAwNSwKLTB4MCwgMHhhZjgwMDA0OCwgMHg4ZjgyMDA0OCwgMHgxMDQwZmZmZCwKLTB4MCwgMHg4ZjgyMDA2MCwgMHgyNDAzZmZmNywgMHg0MzEwMjQsCi0weGFmODIwMDYwLCAweDhmNDIwMDAwLCAweDEwNDAwMDAzLCAweDAsCi0weDEwMDAwMDAyLCAweGFmODAwMDRjLCAweGFmODAwMDQ4LCAweDhmYmYwMDM4LAotMHg4ZmIzMDAzNCwgMHg4ZmIyMDAzMCwgMHg4ZmIxMDAyYywgMHg4ZmIwMDAyOCwKLTB4M2UwMDAwOCwgMHgyN2JkMDA0MCwgMHgzZTAwMDA4LCAweDAsCi0weDI3YmRmZmQwLCAweDMyYzIwMDIwLCAweGFmYmYwMDJjLCAweGFmYjIwMDI4LAotMHhhZmIxMDAyNCwgMHgxMDQwMDAwNCwgMHhhZmIwMDAyMCwgMHg4ZjUyMDAyOCwKLTB4MTAwMDAwMDIsIDB4MCwgMHg4ZjUyMDAyMCwgMHg4ZjQyMDAzMCwKLTB4MTA1MjAwYjUsIDB4MjExMDAsIDB4OGY0MzAwMWMsIDB4NjI4MDIxLAotMHg4ZTA0MDAwMCwgMHg4ZTA1MDAwNCwgMHg5NjExMDAwOCwgMHg4ZjQyMDA5MCwKLTB4OTYwNzAwMGEsIDB4MzIyNmZmZmYsIDB4NDYxMDJhLCAweDEwNDAwMDE3LAotMHgwLCAweDhmODIwMGQ4LCAweDhmNDMwMDk4LCAweDQzMTAyMywKLTB4MjQ0MmRjNDYsIDB4YWY0MjAwOTAsIDB4OGY0MjAwOTAsIDB4Mjg0MmRjNDcsCi0weDEwNDAwMDA1LCAweDAsIDB4OGY0MjAwOTAsIDB4OGY0MzAxNDQsCi0weDQzMTAyMSwgMHhhZjQyMDA5MCwgMHg4ZjQyMDA5MCwgMHg0NjEwMmEsCi0weDEwNDAwMDA2LCAweDAsIDB4OGY0MjAzNDgsIDB4MjQ0MjAwMDEsCi0weGFmNDIwMzQ4LCAweDEwMDAwMGFiLCAweDhmNDIwMzQ4LCAweDhmODYwMGZjLAotMHgxMGMwMDAwYywgMHgwLCAweDhmODIwMGY0LCAweDI0MDNmZmY4LAotMHg0MzEwMjQsIDB4NDYxMDIzLCAweDIxOGMzLCAweDU4NjAwMDAxLAotMHgyNDYzMDEwMCwgMHg4ZjQyMDA4YywgMHg0MzEwMmIsIDB4MTQ0MDAwMDYsCi0weDcxMmMyLCAweDhmNDIwMzQ0LCAweDI0NDIwMDAxLCAweGFmNDIwMzQ0LAotMHgxMDAwMDA5OCwgMHg4ZjQyMDM0NCwgMHg5MzQzMDVjMiwgMHgxMDYwMDAwZiwKLTB4MzA0NjAwMDEsIDB4OGY0MjAwMTAsIDB4MzQ0ODA0MDAsIDB4MzJjMjAwMDgsCi0weDEwNDAwMDA4LCAweDMwZTIwMjAwLCAweDEwNDAwMDA2LCAweDNjMDM0MDAwLAotMHg5NjAyMDAwZSwgMHhhZjQzMDBhYywgMHgyMTQwMCwgMHgxMDAwMDAwNCwKLTB4YWY0MjAwYjAsIDB4MTAwMDAwMDIsIDB4YWY0MDAwYWMsIDB4OGY0ODAwMTAsCi0weDMwZTIwMDA0LCAweDEwNDAwMDQ1LCAweDMyMjdmZmZmLCAweDhmNDkwMGFjLAotMHgxMTIwMDAwNSwgMHgzMGMyMDBmZiwgMHgxNDQwMDAwNiwgMHgyNDAyMDA0MCwKLTB4MTAwMDAwMDQsIDB4MjQwMjAwMDgsIDB4MTQ0MDAwMDIsIDB4MjQwMjAwMjAsCi0weDI0MDIwMDA0LCAweGFmYTIwMDEwLCAweDhmNDMwMDMwLCAweDExMjAwMDA0LAotMHhhZmEzMDAxNCwgMHg4ZjQyMDBiMCwgMHg2MjEwMjUsIDB4YWZhMjAwMTQsCi0weDNjMDIwMDAyLCAweDEwMjEwMjUsIDB4YWZhMjAwMTgsIDB4OGY0NjAwOTgsCi0weDhmNDIwMTA4LCAweDQwZjgwOSwgMHgwLCAweDEwNDAwMDY5LAotMHgzMjI0ZmZmZiwgMHg4ZjQyMDA4YywgMHg4ZjQzMDA5NCwgMHgyNDQyMDAwMSwKLTB4YWY0MjAwOGMsIDB4MjQwMjAwMDEsIDB4YWUwMzAwMGMsIDB4YTM0MjA1YzIsCi0weDhmNDIwMDk4LCAweDI0MDZmZmY4LCAweDhmNDUwMTNjLCAweDQ0MTAyMSwKLTB4MjQ0MjAwMDcsIDB4NDYxMDI0LCAweDI0ODQwMDA3LCAweGFmNDIwMDk0LAotMHg4ZjQyMDA5MCwgMHg4ZjQzMDA5NCwgMHg4NjIwMjQsIDB4NDQxMDIzLAotMHg2NTE4MmIsIDB4MTQ2MDAwMDUsIDB4YWY0MjAwOTAsIDB4OGY0MjAwOTQsCi0weDhmNDMwMTQ0LCAweDQzMTAyMywgMHhhZjQyMDA5NCwgMHg4ZjQzMDA5NCwKLTB4OGY0MjAxNDAsIDB4NDMxMDJiLCAweDEwNDAwMDA5LCAweDAsCi0weDhmNDMwMTNjLCAweDhmNDQwMDk0LCAweDhmNDIwMDkwLCAweDhmNDUwMTM4LAotMHg2NDE4MjMsIDB4NDMxMDIzLCAweGFmNDIwMDkwLCAweGFmNDUwMDk0LAotMHg4ZjQyMDA5NCwgMHgxMDAwMDAxZiwgMHhhZjQyMDA5OCwgMHgxMGUwMDAxZCwKLTB4MzBjMjAwZmYsIDB4MTQ0MDAwMDIsIDB4MjQwMjAwMTAsIDB4MjQwMjAwMDIsCi0weGFmYTIwMDEwLCAweDhmNDIwMDMwLCAweGFmYTgwMDE4LCAweGFmYTIwMDE0LAotMHg4ZjQ2MDA5OCwgMHg4ZjQyMDEwOCwgMHg0MGY4MDksIDB4MCwKLTB4MTA0MDAwMzAsIDB4MzIyNWZmZmYsIDB4OGY0MjAwOTgsIDB4OGY0NDAxM2MsCi0weDQ1MTAyMSwgMHhhZjQyMDA5OCwgMHg4ZjQyMDA5MCwgMHg4ZjQzMDA5OCwKLTB4YTM0MDA1YzIsIDB4NDUxMDIzLCAweDY0MTgyYiwgMHgxNDYwMDAwNSwKLTB4YWY0MjAwOTAsIDB4OGY0MjAwOTgsIDB4OGY0MzAxNDQsIDB4NDMxMDIzLAotMHhhZjQyMDA5OCwgMHg4ZjQyMDAzMCwgMHg4ZjQzMDA0MCwgMHgyNDQyMDAwMSwKLTB4MjQ2M2ZmZmYsIDB4NDMxMDI0LCAweGFmNDIwMDMwLCAweDhmNDIwMDMwLAotMHgxNDUyMDAxOCwgMHgwLCAweDhmNDIwMDAwLCAweDEwNDAwMDA3LAotMHgwLCAweGFmODAwMDRjLCAweDhmODIwMDRjLCAweDEwNDBmZmZkLAotMHgwLCAweDEwMDAwMDA1LCAweDAsIDB4YWY4MDAwNDgsCi0weDhmODIwMDQ4LCAweDEwNDBmZmZkLCAweDAsIDB4OGY4MjAwNjAsCi0weDI0MDNmZmY3LCAweDQzMTAyNCwgMHhhZjgyMDA2MCwgMHg4ZjQyMDAwMCwKLTB4MTA0MDAwMDMsIDB4MCwgMHgxMDAwMDAwMiwgMHhhZjgwMDA0YywKLTB4YWY4MDAwNDgsIDB4OGZiZjAwMmMsIDB4OGZiMjAwMjgsIDB4OGZiMTAwMjQsCi0weDhmYjAwMDIwLCAweDNlMDAwMDgsIDB4MjdiZDAwMzAsIDB4M2UwMDAwOCwKLTB4MCwgMHgyN2JkZmZkOCwgMHgzYzAyMDAwMSwgMHgzNDQyMmVjMCwKLTB4YWZiZjAwMjAsIDB4OGY0MzAwZjAsIDB4OGY4NDAxMDgsIDB4MmUyMTAyMSwKLTB4NTQ2MjAwMDQsIDB4MjQ2MjAwMDgsIDB4M2MwMjAwMDEsIDB4MzQ0MjJjYzAsCi0weDJlMjEwMjEsIDB4NDAxODIxLCAweGFmNDMwMGYwLCAweGFjNjAwMDAwLAotMHg4ZjQyMDBlYywgMHg4YzY2MDAwNCwgMHgxNDYyMDAwNCwgMHgzYzAyMDAwMSwKLTB4MjQ4MjAwMjAsIDB4MTAwMDAwMGYsIDB4YWY4MjAxMDgsIDB4OGY0MzAwZjAsCi0weDM0NDIyZWMwLCAweDJlMjEwMjEsIDB4NTQ2MjAwMDQsIDB4MjQ2MjAwMDgsCi0weDNjMDIwMDAxLCAweDM0NDIyY2MwLCAweDJlMjEwMjEsIDB4NDAxODIxLAotMHg4YzYyMDAwNCwgMHgyMTE0MCwgMHg4MjEwMjEsIDB4YWY4MjAxMDgsCi0weGFjNjAwMDAwLCAweDhjODUwMDE4LCAweDMwYTIwMDM2LCAweDEwNDAwMDZjLAotMHgzMGEyMDAwMSwgMHg4YzgyMDAxYywgMHg4ZjQzMDA0MCwgMHg4ZjQ0MDAzNCwKLTB4MjQ0MjAwMDEsIDB4MjQ2M2ZmZmYsIDB4NDMxMDI0LCAweDg2MjAyMSwKLTB4YWY0MjAwMmMsIDB4MzBhMjAwMzAsIDB4MTQ0MDAwMDYsIDB4YWY0NDAwMzQsCi0weDhmNDIwMDM0LCAweDhjMDMwMjNjLCAweDQzMTAyYiwgMHgxNDQwMDBiNCwKLTB4MCwgMHgzMmMyMDAxMCwgMHgxMDQwMDAyOCwgMHgyNDA3MDAwOCwKLTB4OGY0NDAxNzAsIDB4OGY0NTAxNzQsIDB4OGY0MzAwMmMsIDB4OGY0ODAwMGMsCi0weDhmODYwMTIwLCAweDI0MDIwMDgwLCAweGFmYTIwMDEwLCAweGFmYTMwMDE0LAotMHhhZmE4MDAxOCwgMHg4ZjQyMDEwYywgMHg0MGY4MDksIDB4MjRjNjAwMWMsCi0weDE0NDAwMDExLCAweDI0MDIwMDAxLCAweDNjMDEwMDAxLCAweDM3MDgyMSwKLTB4YTAyMjQwZjEsIDB4OGY4MjAxMjQsIDB4YWZhMjAwMTAsIDB4OGY4MjAxMjgsCi0weDNjMDQwMDAxLCAweDI0ODQ2N2M0LCAweGFmYTIwMDE0LCAweDhmNDYwMDJjLAotMHg4Zjg3MDEyMCwgMHgzYzA1MDAwOSwgMHhjMDAyYjNiLCAweDM0YTUxMTAwLAotMHgxMDAwMDAzNiwgMHgwLCAweDhmNDIwMzAwLCAweDhmNDMwMDJjLAotMHgyNDQyMDAwMSwgMHhhZjQyMDMwMCwgMHg4ZjQyMDMwMCwgMHgyNDAyMDAwMSwKLTB4YTM0MjA1YzEsIDB4MTAwMDAwMjYsIDB4YWY0MzAwMzgsIDB4OGY0NDAxNzAsCi0weDhmNDUwMTc0LCAweDhmNDMwMDJjLCAweDhmNDgwMDBjLCAweDhmODYwMTIwLAotMHgyNDAyMDAyMCwgMHhhZmEyMDAxMCwgMHhhZmEzMDAxNCwgMHhhZmE4MDAxOCwKLTB4OGY0MjAxMGMsIDB4NDBmODA5LCAweDI0YzYwMDFjLCAweDE0NDAwMDExLAotMHgyNDAyMDAwMSwgMHgzYzAxMDAwMSwgMHgzNzA4MjEsIDB4YTAyMjQwZjAsCi0weDhmODIwMTI0LCAweGFmYTIwMDEwLCAweDhmODIwMTI4LCAweDNjMDQwMDAxLAotMHgyNDg0NjdiOCwgMHhhZmEyMDAxNCwgMHg4ZjQ2MDAyYywgMHg4Zjg3MDEyMCwKLTB4M2MwNTAwMDksIDB4YzAwMmIzYiwgMHgzNGE1MDkwMCwgMHgxMDAwMDAwZiwKLTB4MCwgMHg4ZjQyMDMwMCwgMHgyNDQyMDAwMSwgMHhhZjQyMDMwMCwKLTB4OGY0MjAzMDAsIDB4OGY0MjAwMmMsIDB4YTM0MDA1YzEsIDB4YWY0MjAwMzgsCi0weDNjMDEwMDAxLCAweDM3MDgyMSwgMHhhMDIwNDBmMSwgMHgzYzAxMDAwMSwKLTB4MzcwODIxLCAweGEwMjA0MGYwLCAweGFmNDAwMDM0LCAweDhmNDIwMzE0LAotMHgyNDQyMDAwMSwgMHhhZjQyMDMxNCwgMHgxMDAwMDA1OSwgMHg4ZjQyMDMxNCwKLTB4MTA0MDAwMjIsIDB4MzBhMjcwMDAsIDB4OGM4NTAwMWMsIDB4OGY0MjAwMjgsCi0weGEyMjAyMywgMHg0ODEwMDAzLCAweDAsIDB4OGY0MjAwNDAsCi0weDgyMjAyMSwgMHg4ZjQyMDM1OCwgMHg4ZjQzMDAwMCwgMHhhZjQ1MDAyOCwKLTB4NDQxMDIxLCAweDEwNjAwMDA3LCAweGFmNDIwMzU4LCAweGFmODAwMDRjLAotMHg4ZjgyMDA0YywgMHgxMDQwZmZmZCwgMHgwLCAweDEwMDAwMDA1LAotMHgwLCAweGFmODAwMDQ4LCAweDhmODIwMDQ4LCAweDEwNDBmZmZkLAotMHgwLCAweDhmODIwMDYwLCAweDM0NDIwMDA4LCAweGFmODIwMDYwLAotMHg4ZjQyMDAwMCwgMHgxMDQwMDAwMywgMHgwLCAweDEwMDAwMDM4LAotMHhhZjgwMDA0YywgMHgxMDAwMDAzNiwgMHhhZjgwMDA0OCwgMHgxMDQwMDAyZiwKLTB4MzBhMjEwMDAsIDB4MTA0MDAwMGMsIDB4MzBhMjQwMDAsIDB4OGM4MzAwMWMsCi0weDhmNDIwMDUwLCAweDYyMjAyMywgMHg0ODIwMDAxLCAweDI0ODQwMjAwLAotMHg4ZjQyMDM1YywgMHg0NDEwMjEsIDB4YWY0MjAzNWMsIDB4OGY0MjAzNjgsCi0weDEwMDAwMDFhLCAweGFmNDMwMDUwLCAweDEwNDAwMDBjLCAweDMyYzI4MDAwLAotMHg4YzgzMDAxYywgMHg4ZjQyMDA3MCwgMHg2MjIwMjMsIDB4NDgyMDAwMSwKLTB4MjQ4NDA0MDAsIDB4OGY0MjAzNjQsIDB4NDQxMDIxLCAweGFmNDIwMzY0LAotMHg4ZjQyMDM2OCwgMHgxMDAwMDAwZCwgMHhhZjQzMDA3MCwgMHgxMDQwMDAwZSwKLTB4M2MwMjA4MDAsIDB4OGM4MzAwMWMsIDB4OGY0MjAwNjAsIDB4NjIyMDIzLAotMHg0ODIwMDAxLCAweDI0ODQwMTAwLCAweDhmNDIwMzYwLCAweDQ0MTAyMSwKLTB4YWY0MjAzNjAsIDB4OGY0MjAzNjgsIDB4YWY0MzAwNjAsIDB4NDQxMDIxLAotMHhhZjQyMDM2OCwgMHgzYzAyMDgwMCwgMHgyYzIxMDI0LCAweDUwNDAwMDA4LAotMHgzNjk0MDA0MCwgMHgxMDAwMDAwNiwgMHgwLCAweDMwYTIwMTAwLAotMHgxMDQwMDAwMywgMHgwLCAweGMwMDJiZDgsIDB4MCwKLTB4OGZiZjAwMjAsIDB4M2UwMDAwOCwgMHgyN2JkMDAyOCwgMHgzZTAwMDA4LAotMHgwLCAweDI3YmRmZmE4LCAweGFmYmYwMDUwLCAweGFmYmUwMDRjLAotMHhhZmI1MDA0OCwgMHhhZmIzMDA0NCwgMHhhZmIyMDA0MCwgMHhhZmIxMDAzYywKLTB4YWZiMDAwMzgsIDB4OGY5MTAxMDgsIDB4MjYyMjAwMjAsIDB4YWY4MjAxMDgsCi0weDhlMzIwMDE4LCAweGE4MjEsIDB4MzI0MjAwMjQsIDB4MTA0MDAxYmEsCi0weGYwMjEsIDB4OGUyNjAwMWMsIDB4OGY0MzAwMWMsIDB4NjExMDAsCi0weDYyMTgyMSwgMHg4YzcwMDAwYywgMHg5NjA0MDAwYywgMHg5NjJkMDAxNiwKLTB4OTQ3MzAwMGEsIDB4MmM4MzA1ZGQsIDB4Mzg4Mjg4NzAsIDB4MmM0MjAwMDEsCi0weDYyMTgyNSwgMHgxMDYwMDAxNSwgMHgyODIxLCAweDMyYzIwMDQwLAotMHgxMDQwMDAxNSwgMHgyNDAyMDgwMCwgMHg5NjAzMDAxNCwgMHgxNDYyMDAxMiwKLTB4MzQwMmFhYWEsIDB4OTYwMzAwMGUsIDB4MTQ2MjAwMDcsIDB4MjAyMSwKLTB4OTYwMzAwMTAsIDB4MjQwMjAzMDAsIDB4MTQ2MjAwMDQsIDB4ODAxMDIxLAotMHg5NjAyMDAxMiwgMHgyYzQ0MDAwMSwgMHg4MDEwMjEsIDB4NTQ0MDAwMDYsCi0weDI0MDUwMDE2LCAweDEwMDAwMDA0LCAweDAsIDB4MjQwMjA4MDAsCi0weDUwODIwMDAxLCAweDI0MDUwMDBlLCAweDkzNDIwNWMzLCAweDE0NDAwMDA4LAotMHg1ODIxLCAweDI0MGIwMDAxLCAweDMyNjIwMTgwLCAweGFmNDUwMGE4LAotMHhhZjUwMDBhMCwgMHgxMDQwMDAwMiwgMHhhZjQ2MDBhNCwgMHhhMzRiMDVjMywKLTB4MTBhMDAwODUsIDB4MjA1NDAyMSwgMHg5MTAyMDAwMCwgMHgzODIxLAotMHgzMDQyMDAwZiwgMHgyNTA4MCwgMHgzMmMyMDAwMiwgMHgxMDQwMDAxMiwKLTB4MTBhMTgyMSwgMHgzMjYyMDAwMiwgMHgxMDQwMDAxMCwgMHgzMmMyMDAwMSwKLTB4MTAwMjAyMSwgMHg5NDgyMDAwMCwgMHgyNDg0MDAwMiwgMHhlMjM4MjEsCi0weDgzMTAyYiwgMHgxNDQwZmZmYiwgMHgzMGUyZmZmZiwgMHg3MWMwMiwKLTB4NjIzODIxLCAweDcxYzAyLCAweDMwZTJmZmZmLCAweDYyMzgyMSwKLTB4NzEwMjcsIDB4YTUwMjAwMGEsIDB4MzJjMjAwMDEsIDB4MTA0MDAwNmEsCi0weDMyNjIwMDAxLCAweDEwNDAwMDY4LCAweDAsIDB4OGY0MjAwYTgsCi0weDEwNDAwMDY1LCAweDAsIDB4OGY0MjAwYTAsIDB4OGY0MzAwYTgsCi0weDQzMTAyMSwgMHg5MDRjMDAwOSwgMHgzMTg5MDBmZiwgMHgzOTIzMDAwNiwKLTB4MzE4MmIsIDB4MzkyMjAwMTEsIDB4MjEwMmIsIDB4NjIxODI0LAotMHgxMDYwMDAwYywgMHgzYzA1MDAwNiwgMHg4ZjQyMDBhNCwgMHgzYzA0MDAwMSwKLTB4MjQ4NDY3ZDQsIDB4YWZhMjAwMTAsIDB4OGY0MjAwYTAsIDB4MzRhNTQ2MDAsCi0weDEyMDM4MjEsIDB4YzAwMmIzYiwgMHhhZmEyMDAxNCwgMHgxMDAwMDA0ZSwKLTB4MCwgMHgzMmMyMDAwNCwgMHgxNDQwMDAxMywgMHgyODIxLAotMHgzMTYyMDBmZiwgMHgxNDQwMDAwNCwgMHgwLCAweDk1MDIwMDAyLAotMHgxMDAwMDAwZCwgMHg0YTI4MjMsIDB4OTUwNTAwMGMsIDB4OTUwMjAwMGUsCi0weDk1MDMwMDEwLCAweGEyMjgyMSwgMHhhMzI4MjEsIDB4OTUwMzAwMTIsCi0weDkxMDQwMDA5LCAweDk1MDIwMDAyLCAweGEzMjgyMSwgMHhhNDI4MjEsCi0weDRhMTAyMywgMHhhMjI4MjEsIDB4MjAwMjAyMSwgMHg5NDgyMDAwMCwKLTB4MjQ4NDAwMDIsIDB4ZTIzODIxLCAweDg4MTAyYiwgMHgxNDQwZmZmYiwKLTB4NzFjMDIsIDB4MzBlMmZmZmYsIDB4NjIzODIxLCAweDcxYzAyLAotMHgzMGUyZmZmZiwgMHg2MjM4MjEsIDB4MWE1MjgyMSwgMHg1MWMwMiwKLTB4MzBhMmZmZmYsIDB4NjIyODIxLCAweDUxYzAyLCAweDMwYTJmZmZmLAotMHg2MjI4MjEsIDB4YTcyODIzLCAweDUxNDAyLCAweGEyMjgyMSwKLTB4MzBhNWZmZmYsIDB4NTBhMDAwMDEsIDB4MzQwNWZmZmYsIDB4MzE2MjAwZmYsCi0weDE0NDAwMDA4LCAweDMxODMwMGZmLCAweDhmNDMwMGEwLCAweDhmNDIwMGE4LAotMHg2MjQwMjEsIDB4OTEwMjAwMDAsIDB4MzA0MjAwMGYsIDB4MjUwODAsCi0weDMxODMwMGZmLCAweDI0MDIwMDA2LCAweDE0NjIwMDAzLCAweDEwYTEwMjEsCi0weDEwMDAwMDAyLCAweDI0NDQwMDEwLCAweDI0NDQwMDA2LCAweDMxNjIwMGZmLAotMHgxNDQwMDAwNiwgMHgwLCAweDk0ODIwMDAwLCAweGEyMjgyMSwKLTB4NTFjMDIsIDB4MzBhMmZmZmYsIDB4NjIyODIxLCAweDkzNDIwNWMzLAotMHgxMDQwMDAwMywgMHgzMjYyMDEwMCwgMHg1MDQwMDAwMywgMHhhNDg1MDAwMCwKLTB4NTI4MjcsIDB4YTQ4NTAwMDAsIDB4OTYyMjAwMGUsIDB4OGY0MzAwOWMsCi0weDYyMTgyMSwgMHgzMmEyMDBmZiwgMHgxMDQwMDAwNywgMHhhZjQzMDA5YywKLTB4M2MwMjQwMDAsIDB4MjAyMTAyNSwgMHhhZmEyMDAyMCwgMHg4ZjQyMDA5YywKLTB4MTAwMDAwMDMsIDB4NWUxMDI1LCAweGFmYjAwMDIwLCAweDhmNDIwMDljLAotMHhhZmEyMDAyNCwgMHgzMjYyMDA4MCwgMHgxMDQwMDAxMCwgMHgzMjYyMDEwMCwKLTB4OGY0MjAwYjQsIDB4MjQ0MzAwMDEsIDB4MjEwYzAsIDB4NTcxMDIxLAotMHhhZjQzMDBiNCwgMHg4ZmEzMDAyMCwgMHg4ZmE0MDAyNCwgMHgzYzAxMDAwMSwKLTB4MjIwODIxLCAweGFjMjMzOGU4LCAweDNjMDEwMDAxLCAweDIyMDgyMSwKLTB4YWMyNDM4ZWMsIDB4MTAwMDAwYTUsIDB4MzJjMjAwMjAsIDB4MTA0MDAwNjQsCi0weDAsIDB4OGY0MjAwYjQsIDB4MjQ0MzAwMDEsIDB4MjEwYzAsCi0weDU3MTAyMSwgMHhhZjQzMDBiNCwgMHg4ZmEzMDAyMCwgMHg4ZmE0MDAyNCwKLTB4M2MwMTAwMDEsIDB4MjIwODIxLCAweGFjMjMzOGU4LCAweDNjMDEwMDAxLAotMHgyMjA4MjEsIDB4YWMyNDM4ZWMsIDB4OGY0MjAwYjQsIDB4MTA0MDAwNTEsCi0weDM4MjEsIDB4M2MwOTAwMDEsIDB4MzUyOTM4ZTgsIDB4M2MwODAwMWYsCi0weDM1MDhmZmZmLCAweDI0MGJmZmZmLCAweDM0MGFmZmZmLCAweDcxMGMwLAotMHg1NzEwMjEsIDB4NDkxMDIxLCAweDhjNDMwMDAwLCAweDhjNDQwMDA0LAotMHhhZmEzMDAyOCwgMHhhZmE0MDAyYywgMHg4ZjgyMDBmYywgMHg4ZmEzMDAyOCwKLTB4OGZhNDAwMmMsIDB4YWM0MzAwMDAsIDB4YWM0NDAwMDQsIDB4MjQ0MjAwMDgsCi0weGFmODIwMGYwLCAweDhmNDIwMDhjLCAweDI0NDJmZmZmLCAweGFmNDIwMDhjLAotMHg5N2EyMDAyZSwgMHg4ZjQ0MDI3MCwgMHg4ZjQ1MDI3NCwgMHg0MDE4MjEsCi0weDEwMjEsIDB4YTMyODIxLCAweGEzMzAyYiwgMHg4MjIwMjEsCi0weDg2MjAyMSwgMHhhZjQ0MDI3MCwgMHhhZjQ1MDI3NCwgMHg4ZmEyMDAyOCwKLTB4NDgxMDI0LCAweDkwNDMwMDAwLCAweDMwNjMwMDAxLCAweDE0NjAwMDBiLAotMHg0MDIwMjEsIDB4OGY0MjAyNzgsIDB4OGY0MzAyN2MsIDB4MjQ2MzAwMDEsCi0weDJjNjQwMDAxLCAweDQ0MTAyMSwgMHhhZjQyMDI3OCwgMHhhZjQzMDI3YywKLTB4OGY0MjAyNzgsIDB4MTAwMDAwMWEsIDB4OGY0MzAyN2MsIDB4OGM4MjAwMDAsCi0weDE0NGIwMDBlLCAweDAsIDB4OTQ4MjAwMDQsIDB4MTQ0YTAwMGIsCi0weDAsIDB4OGY0MjAyODgsIDB4OGY0MzAyOGMsIDB4MjQ2MzAwMDEsCi0weDJjNjQwMDAxLCAweDQ0MTAyMSwgMHhhZjQyMDI4OCwgMHhhZjQzMDI4YywKLTB4OGY0MjAyODgsIDB4MTAwMDAwMGEsIDB4OGY0MzAyOGMsIDB4OGY0MjAyODAsCi0weDhmNDMwMjg0LCAweDI0NjMwMDAxLCAweDJjNjQwMDAxLCAweDQ0MTAyMSwKLTB4YWY0MjAyODAsIDB4YWY0MzAyODQsIDB4OGY0MjAyODAsIDB4OGY0MzAyODQsCi0weDhmNDIwMGI0LCAweDI0ZTcwMDAxLCAweGUyMTAyYiwgMHgxNDQwZmZiOCwKLTB4NzEwYzAsIDB4YTM0MDA1YzMsIDB4MTAwMDAwM2YsIDB4YWY0MDAwYjQsCi0weDhmODIwMGZjLCAweDhmYTMwMDIwLCAweDhmYTQwMDI0LCAweGFjNDMwMDAwLAotMHhhYzQ0MDAwNCwgMHgyNDQyMDAwOCwgMHhhZjgyMDBmMCwgMHg4ZjQyMDA5YywKLTB4OGY0NjAwOGMsIDB4OGY0NDAyNzAsIDB4OGY0NTAyNzQsIDB4NDAxODIxLAotMHgxMDIxLCAweDI0YzZmZmZmLCAweGFmNDYwMDhjLCAweGEzMjgyMSwKLTB4YTMzMDJiLCAweDgyMjAyMSwgMHg4NjIwMjEsIDB4YWY0NDAyNzAsCi0weGFmNDUwMjc0LCAweDkyMDIwMDAwLCAweDMwNDIwMDAxLCAweDE0NDAwMDBjLAotMHgyNDAyZmZmZiwgMHg4ZjQyMDI3OCwgMHg4ZjQzMDI3YywgMHgyNDYzMDAwMSwKLTB4MmM2NDAwMDEsIDB4NDQxMDIxLCAweGFmNDIwMjc4LCAweGFmNDMwMjdjLAotMHg4ZjQyMDI3OCwgMHg4ZjQzMDI3YywgMHgxMDAwMDAxYywgMHgzMmMyMDAyMCwKLTB4OGUwMzAwMDAsIDB4MTQ2MjAwMGYsIDB4MzQwMmZmZmYsIDB4OTYwMzAwMDQsCi0weDE0NjIwMDBjLCAweDAsIDB4OGY0MjAyODgsIDB4OGY0MzAyOGMsCi0weDI0NjMwMDAxLCAweDJjNjQwMDAxLCAweDQ0MTAyMSwgMHhhZjQyMDI4OCwKLTB4YWY0MzAyOGMsIDB4OGY0MjAyODgsIDB4OGY0MzAyOGMsIDB4MTAwMDAwMGIsCi0weDMyYzIwMDIwLCAweDhmNDIwMjgwLCAweDhmNDMwMjg0LCAweDI0NjMwMDAxLAotMHgyYzY0MDAwMSwgMHg0NDEwMjEsIDB4YWY0MjAyODAsIDB4YWY0MzAyODQsCi0weDhmNDIwMjgwLCAweDhmNDMwMjg0LCAweDMyYzIwMDIwLCAweDEwNDAwMDA1LAotMHhhZjQwMDA5YywgMHg4ZjQyMDM1OCwgMHgyNDQyZmZmZiwgMHhhZjQyMDM1OCwKLTB4OGY0MjAzNTgsIDB4OGUyMjAwMWMsIDB4OGY0MzAwNDAsIDB4MjQ0MjAwMDEsCi0weDI0NjNmZmZmLCAweDQzMTAyNCwgMHhhZjQyMDAyYywgMHgzMjQyMDA2MCwKLTB4MTQ0MDAwMDgsIDB4MzJjMjAwMTAsIDB4OGY0MjAwMzQsIDB4MjQ0MjAwMDEsCi0weGFmNDIwMDM0LCAweDhjMDMwMjNjLCAweDQzMTAyYiwgMHgxNDQwMDEwMiwKLTB4MzJjMjAwMTAsIDB4MTA0MDAwMTgsIDB4MjQwNzAwMDgsIDB4OGY0NDAxNzAsCi0weDhmNDUwMTc0LCAweDhmNDMwMDJjLCAweDhmNDgwMDBjLCAweDhmODYwMTIwLAotMHgyNDAyMDA4MCwgMHhhZmEyMDAxMCwgMHhhZmEzMDAxNCwgMHhhZmE4MDAxOCwKLTB4OGY0MjAxMGMsIDB4NDBmODA5LCAweDI0YzYwMDFjLCAweDEwNDAwMDQ3LAotMHgyNDAyMDAwMSwgMHg4ZjQyMDMwMCwgMHg4ZjQzMDAyYywgMHgyNDQyMDAwMSwKLTB4YWY0MjAzMDAsIDB4OGY0MjAzMDAsIDB4MjQwMjAwMDEsIDB4YTM0MjA1YzEsCi0weDEwMDAwMDdjLCAweGFmNDMwMDM4LCAweDhmNDQwMTcwLCAweDhmNDUwMTc0LAotMHg4ZjQzMDAyYywgMHg4ZjQ4MDAwYywgMHg4Zjg2MDEyMCwgMHgyNDAyMDAyMCwKLTB4YWZhMjAwMTAsIDB4YWZhMzAwMTQsIDB4YWZhODAwMTgsIDB4OGY0MjAxMGMsCi0weDQwZjgwOSwgMHgyNGM2MDAxYywgMHgxMDQwMDA1NywgMHgyNDAyMDAwMSwKLTB4MTAwMDAwNjUsIDB4MCwgMHgzMjQyMDAxMiwgMHgxMDQwMDA3NSwKLTB4MzI0MjAwMDEsIDB4OTYyMjAwMGUsIDB4OGY0MzAwOWMsIDB4NjIxODIxLAotMHgzMmMyMDAyMCwgMHgxMDQwMDAwNSwgMHhhZjQzMDA5YywgMHg4ZjQyMDM1OCwKLTB4MjQ0MmZmZmYsIDB4YWY0MjAzNTgsIDB4OGY0MjAzNTgsIDB4OGUyMjAwMWMsCi0weDhmNDMwMDQwLCAweDI0NDIwMDAxLCAweDI0NjNmZmZmLCAweDQzMTAyNCwKLTB4YWY0MjAwMmMsIDB4MzI0MjAwMTAsIDB4MTQ0MDAwMDgsIDB4MzJjMjAwMTAsCi0weDhmNDIwMDM0LCAweDI0NDIwMDAxLCAweGFmNDIwMDM0LCAweDhjMDMwMjNjLAotMHg0MzEwMmIsIDB4MTQ0MDAwYmMsIDB4MzJjMjAwMTAsIDB4MTA0MDAwMjgsCi0weDI0MDcwMDA4LCAweDhmNDQwMTcwLCAweDhmNDUwMTc0LCAweDhmNDMwMDJjLAotMHg4ZjQ4MDAwYywgMHg4Zjg2MDEyMCwgMHgyNDAyMDA4MCwgMHhhZmEyMDAxMCwKLTB4YWZhMzAwMTQsIDB4YWZhODAwMTgsIDB4OGY0MjAxMGMsIDB4NDBmODA5LAotMHgyNGM2MDAxYywgMHgxNDQwMDAxMSwgMHgyNDAyMDAwMSwgMHgzYzAxMDAwMSwKLTB4MzcwODIxLCAweGEwMjI0MGYxLCAweDhmODIwMTI0LCAweGFmYTIwMDEwLAotMHg4ZjgyMDEyOCwgMHgzYzA0MDAwMSwgMHgyNDg0NjdjNCwgMHhhZmEyMDAxNCwKLTB4OGY0NjAwMmMsIDB4OGY4NzAxMjAsIDB4M2MwNTAwMDksIDB4YzAwMmIzYiwKLTB4MzRhNTExMDAsIDB4MTAwMDAwMzYsIDB4MCwgMHg4ZjQyMDMwMCwKLTB4OGY0MzAwMmMsIDB4MjQ0MjAwMDEsIDB4YWY0MjAzMDAsIDB4OGY0MjAzMDAsCi0weDI0MDIwMDAxLCAweGEzNDIwNWMxLCAweDEwMDAwMDI2LCAweGFmNDMwMDM4LAotMHg4ZjQ0MDE3MCwgMHg4ZjQ1MDE3NCwgMHg4ZjQzMDAyYywgMHg4ZjQ4MDAwYywKLTB4OGY4NjAxMjAsIDB4MjQwMjAwMjAsIDB4YWZhMjAwMTAsIDB4YWZhMzAwMTQsCi0weGFmYTgwMDE4LCAweDhmNDIwMTBjLCAweDQwZjgwOSwgMHgyNGM2MDAxYywKLTB4MTQ0MDAwMTEsIDB4MjQwMjAwMDEsIDB4M2MwMTAwMDEsIDB4MzcwODIxLAotMHhhMDIyNDBmMCwgMHg4ZjgyMDEyNCwgMHhhZmEyMDAxMCwgMHg4ZjgyMDEyOCwKLTB4M2MwNDAwMDEsIDB4MjQ4NDY3YjgsIDB4YWZhMjAwMTQsIDB4OGY0NjAwMmMsCi0weDhmODcwMTIwLCAweDNjMDUwMDA5LCAweGMwMDJiM2IsIDB4MzRhNTA5MDAsCi0weDEwMDAwMDBmLCAweDAsIDB4OGY0MjAzMDAsIDB4MjQ0MjAwMDEsCi0weGFmNDIwMzAwLCAweDhmNDIwMzAwLCAweDhmNDIwMDJjLCAweGEzNDAwNWMxLAotMHhhZjQyMDAzOCwgMHgzYzAxMDAwMSwgMHgzNzA4MjEsIDB4YTAyMDQwZjEsCi0weDNjMDEwMDAxLCAweDM3MDgyMSwgMHhhMDIwNDBmMCwgMHhhZjQwMDAzNCwKLTB4OGY0MjAzMTQsIDB4MjQ0MjAwMDEsIDB4YWY0MjAzMTQsIDB4MTAwMDAwNjIsCi0weDhmNDIwMzE0LCAweDEwNDAwMDIyLCAweDMyNDI3MDAwLCAweDhlMjUwMDFjLAotMHg4ZjQyMDAyOCwgMHhhMjIwMjMsIDB4NDgxMDAwMywgMHgwLAotMHg4ZjQyMDA0MCwgMHg4MjIwMjEsIDB4OGY0MjAzNTgsIDB4OGY0MzAwMDAsCi0weGFmNDUwMDI4LCAweDQ0MTAyMSwgMHgxMDYwMDAwNywgMHhhZjQyMDM1OCwKLTB4YWY4MDAwNGMsIDB4OGY4MjAwNGMsIDB4MTA0MGZmZmQsIDB4MCwKLTB4MTAwMDAwMDUsIDB4MCwgMHhhZjgwMDA0OCwgMHg4ZjgyMDA0OCwKLTB4MTA0MGZmZmQsIDB4MCwgMHg4ZjgyMDA2MCwgMHgzNDQyMDAwOCwKLTB4YWY4MjAwNjAsIDB4OGY0MjAwMDAsIDB4MTA0MDAwMDMsIDB4MCwKLTB4MTAwMDAwNDEsIDB4YWY4MDAwNGMsIDB4MTAwMDAwM2YsIDB4YWY4MDAwNDgsCi0weDEwNDAwMDJmLCAweDMyNDIxMDAwLCAweDEwNDAwMDBjLCAweDMyNDI0MDAwLAotMHg4ZTIzMDAxYywgMHg4ZjQyMDA1MCwgMHg2MjIwMjMsIDB4NDgyMDAwMSwKLTB4MjQ4NDAyMDAsIDB4OGY0MjAzNWMsIDB4NDQxMDIxLCAweGFmNDIwMzVjLAotMHg4ZjQyMDM2OCwgMHgxMDAwMDAxYSwgMHhhZjQzMDA1MCwgMHgxMDQwMDAwYywKLTB4MzJjMjgwMDAsIDB4OGUyMzAwMWMsIDB4OGY0MjAwNzAsIDB4NjIyMDIzLAotMHg0ODIwMDAxLCAweDI0ODQwNDAwLCAweDhmNDIwMzY0LCAweDQ0MTAyMSwKLTB4YWY0MjAzNjQsIDB4OGY0MjAzNjgsIDB4MTAwMDAwMGQsIDB4YWY0MzAwNzAsCi0weDEwNDAwMDBlLCAweDNjMDIwODAwLCAweDhlMjMwMDFjLCAweDhmNDIwMDYwLAotMHg2MjIwMjMsIDB4NDgyMDAwMSwgMHgyNDg0MDEwMCwgMHg4ZjQyMDM2MCwKLTB4NDQxMDIxLCAweGFmNDIwMzYwLCAweDhmNDIwMzY4LCAweGFmNDMwMDYwLAotMHg0NDEwMjEsIDB4YWY0MjAzNjgsIDB4M2MwMjA4MDAsIDB4MmMyMTAyNCwKLTB4NTA0MDAwMTEsIDB4MzY5NDAwNDAsIDB4MTAwMDAwMGYsIDB4MCwKLTB4MzI0MjAwNDgsIDB4MTA0MDAwMDcsIDB4MjQxNTAwMDEsIDB4OGUyMjAwMWMsCi0weDNjMDNmZmZmLCAweDQzZjAyNCwgMHgzMDQyZmZmZiwgMHgxMDAwZmQ3NSwKLTB4YWUyMjAwMWMsIDB4MzI0MjAxMDAsIDB4MTA0MDAwMDMsIDB4MCwKLTB4YzAwMmJkOCwgMHgwLCAweDhmYmYwMDUwLCAweDhmYmUwMDRjLAotMHg4ZmI1MDA0OCwgMHg4ZmIzMDA0NCwgMHg4ZmIyMDA0MCwgMHg4ZmIxMDAzYywKLTB4OGZiMDAwMzgsIDB4M2UwMDAwOCwgMHgyN2JkMDA1OCwgMHgzZTAwMDA4LAotMHgwLCAweDAsIDB4MCwgMHg4ZjgzMDBlNCwKLTB4OGY4MjAwZTAsIDB4MjQwNGZmZjgsIDB4NDQxMDI0LCAweDYyMTAyNiwKLTB4MjEwMmIsIDB4MjEwMjMsIDB4M2UwMDAwOCwgMHg2MjEwMjQsCi0weDNlMDAwMDgsIDB4MCwgMHgyN2JkZmZlMCwgMHhhZmJmMDAxYywKLTB4YWZiMDAwMTgsIDB4OGY4NjAwYzQsIDB4OGY4NDAwZTAsIDB4OGY4NTAwZTQsCi0weDI0MDJmZmY4LCAweDgyMTgyNCwgMHgxMGEzMDAwOSwgMHgyNzYyM2ZmOCwKLTB4MTRhMjAwMDIsIDB4MjRhMjAwMDgsIDB4Mjc2MjMwMDAsIDB4NDA4MDIxLAotMHgxNjAzMDAwNSwgMHgzMDgyMDAwNCwgMHgxMDQwMDAwNCwgMHhjMDIwMjEsCi0weDEwMDAwMDIyLCAweDEwMjEsIDB4OGUwNDAwMDAsIDB4OGY0MjAxMWMsCi0weDE0YTIwMDAzLCAweDAsIDB4OGY0MjAxMjAsIDB4YWY0MjAxMTQsCi0weDhjYTMwMDAwLCAweDhmNDIwMTQ4LCAweDgzMTgyMywgMHg0MzEwMmIsCi0weDEwNDAwMDAzLCAweDAsIDB4OGY0MjAxNDgsIDB4NjIxODIxLAotMHg5NGEyMDAwNiwgMHgyNDQyMDA1MCwgMHg2MjEwMmIsIDB4MTQ0MDAwMGYsCi0weGEwMTAyMSwgMHhhZmE0MDAxMCwgMHhhZmEzMDAxNCwgMHg4Y2E2MDAwMCwKLTB4OGNhNzAwMDQsIDB4M2MwNDAwMDEsIDB4YzAwMmIzYiwgMHgyNDg0Njg5NCwKLTB4OGY0MjAyMGMsIDB4MjQ0MjAwMDEsIDB4YWY0MjAyMGMsIDB4OGY0MjAyMGMsCi0weDEwMjEsIDB4YWY5MDAwZTgsIDB4YWY5MDAwZTQsIDB4OGZiZjAwMWMsCi0weDhmYjAwMDE4LCAweDNlMDAwMDgsIDB4MjdiZDAwMjAsIDB4M2UwMDAwOCwKLTB4MCwgMHg4Zjg0MDBlMCwgMHg4Zjg4MDBjNCwgMHg4ZjgzMDBlOCwKLTB4MjQwMmZmZjgsIDB4ODIzODI0LCAweGUzMjAyMywgMHgyYzgyMTAwMCwKLTB4NTA0MDAwMDEsIDB4MjQ4NDEwMDAsIDB4NDIwYzIsIDB4ODAxODIxLAotMHg4ZjQ0MDI1OCwgMHg4ZjQ1MDI1YywgMHgxMDIxLCAweGEzMjgyMSwKLTB4YTMzMDJiLCAweDgyMjAyMSwgMHg4NjIwMjEsIDB4YWY0NDAyNTgsCi0weGFmNDUwMjVjLCAweDhmODMwMGM4LCAweDhmNDIwMTQ4LCAweDEwMzIwMjMsCi0weDgyMTAyYiwgMHgxNDQwMDAwNCwgMHg4MDE4MjEsIDB4OGY0MjAxNDgsCi0weDgyMjAyMSwgMHg4MDE4MjEsIDB4OGY0NDAyNTAsIDB4OGY0NTAyNTQsCi0weDEwMjEsIDB4YTMyODIxLCAweGEzMzAyYiwgMHg4MjIwMjEsCi0weDg2MjAyMSwgMHhhZjQ0MDI1MCwgMHhhZjQ1MDI1NCwgMHhhZjg4MDBjOCwKLTB4YWY4NzAwZTQsIDB4YWY4NzAwZTgsIDB4M2UwMDAwOCwgMHgwLAotMHgyN2JkZmYzMCwgMHgyNDBhMDAwMSwgMHhhZmJmMDBjOCwgMHhhZmJlMDBjNCwKLTB4YWZiNTAwYzAsIDB4YWZiMzAwYmMsIDB4YWZiMjAwYjgsIDB4YWZiMTAwYjQsCi0weGFmYjAwMGIwLCAweGEzYTAwMDk3LCAweGFmYTAwMDQ0LCAweGFmYWEwMDVjLAotMHg5MzQyMDVjNCwgMHhhN2EwMDA4ZSwgMHgxMDQwMDAwYSwgMHhhN2EwMDA4NiwKLTB4OGY0YjAwYzQsIDB4YWZhYjAwNjQsIDB4OGY0YTAwYzAsIDB4YWZhYTAwNmMsCi0weDhmNGIwMGNjLCAweGFmYWIwMDc0LCAweDhmNGEwMGM4LCAweDEwMDAwMTI5LAotMHhhZmFhMDA3YywgMHg4ZjQyMDExNCwgMHg0MGY4MDksIDB4MCwKLTB4NDAzMDIxLCAweDEwYzAwMzRmLCAweDAsIDB4OGNjMjAwMDAsCi0weDhjYzMwMDA0LCAweGFmYTIwMDIwLCAweGFmYTMwMDI0LCAweDhmYWIwMDI0LAotMHg4ZmFhMDAyMCwgMHgzMTYyZmZmZiwgMHgyNDQyZmZmYywgMHhhZmEyMDA2YywKLTB4M2MwMjAwMDYsIDB4MmMyMTAyNCwgMHhhZmFiMDA3YywgMHgxNDQwMDAxNSwKLTB4YWZhYTAwNjQsIDB4OTE0MjAwMDAsIDB4MzA0MjAwMDEsIDB4MTA0MDAwMTEsCi0weDI0MDJmZmZmLCAweDhkNDMwMDAwLCAweDE0NjIwMDA0LCAweDM0MDJmZmZmLAotMHg5NTQzMDAwNCwgMHgxMDYyMDAwYiwgMHgwLCAweGMwMDI0YmIsCi0weDhmYTQwMDY0LCAweDMwNDIwMGZmLCAweDE0NDAwMDA2LCAweDAsCi0weDhmNDIwMTE4LCAweDQwZjgwOSwgMHgwLCAweDEwMDAwMzJkLAotMHgwLCAweDhmYTIwMDI0LCAweDNjMDNmZmJmLCAweDM0NjNmZmZmLAotMHg0MzEwMjQsIDB4M2MwM2ZmZmYsIDB4NDMxODI0LCAweDE0NjAwMDAzLAotMHhhZmEyMDAyNCwgMHgxMDAwMDA0MCwgMHgxODIxLCAweDNjMDIwMDgwLAotMHg2MjEwMjQsIDB4MTA0MDAwMDcsIDB4MCwgMHg4ZjQyMDM4YywKLTB4MjQ0MjAwMDEsIDB4YWY0MjAzOGMsIDB4OGY0MjAzOGMsIDB4MTAwMDAwMzYsCi0weDI0MDMwMDAxLCAweDhmNDIwMjEwLCAweDI0NDIwMDAxLCAweGFmNDIwMjEwLAotMHg4ZjQyMDIxMCwgMHgzYzAyMDAwMSwgMHg2MjEwMjQsIDB4MTA0MDAwMDYsCi0weDNjMDIwMDAyLCAweDhmNDIwMWM0LCAweDI0NDIwMDAxLCAweGFmNDIwMWM0LAotMHg4ZjQyMDFjNCwgMHgzYzAyMDAwMiwgMHg2MjEwMjQsIDB4MTA0MDAwMDYsCi0weDNjMDIwMDA0LCAweDhmNDIwMzdjLCAweDI0NDIwMDAxLCAweGFmNDIwMzdjLAotMHg4ZjQyMDM3YywgMHgzYzAyMDAwNCwgMHg2MjEwMjQsIDB4MTA0MDAwMDYsCi0weDNjMDIwMDA4LCAweDhmNDIwMzgwLCAweDI0NDIwMDAxLCAweGFmNDIwMzgwLAotMHg4ZjQyMDM4MCwgMHgzYzAyMDAwOCwgMHg2MjEwMjQsIDB4MTA0MDAwMDYsCi0weDNjMDIwMDEwLCAweDhmNDIwMzg0LCAweDI0NDIwMDAxLCAweGFmNDIwMzg0LAotMHg4ZjQyMDM4NCwgMHgzYzAyMDAxMCwgMHg2MjEwMjQsIDB4MTA0MDAwMDYsCi0weDNjMDIwMDIwLCAweDhmNDIwMWMwLCAweDI0NDIwMDAxLCAweGFmNDIwMWMwLAotMHg4ZjQyMDFjMCwgMHgzYzAyMDAyMCwgMHg2MjEwMjQsIDB4MTA0MDAwMDYsCi0weDI0MDMwMDAxLCAweDhmNDIwMzg4LCAweDI0NDIwMDAxLCAweGFmNDIwMzg4LAotMHg4ZjQyMDM4OCwgMHgyNDAzMDAwMSwgMHg4YzAyMDI2MCwgMHg4ZmFiMDA2YywKLTB4NGIxMDJiLCAweDEwNDAwMDE0LCAweDMwNzAwMGZmLCAweDhmNDIwMWU4LAotMHgyNDQyMDAwMSwgMHhhZjQyMDFlOCwgMHg4ZjQyMDFlOCwgMHg4ZmFhMDA3YywKLTB4OGY4MjAwZTAsIDB4MzU0YTAxMDAsIDB4YWZhYTAwN2MsIDB4YWZhMjAwMTAsCi0weDhmODIwMGU0LCAweDI0MTAwMDAxLCAweDNjMDQwMDAxLCAweDI0ODQ2OGEwLAotMHhhZmEyMDAxNCwgMHg4ZmE2MDAyMCwgMHg4ZmE3MDAyNCwgMHgzYzA1MDAwNywKLTB4YzAwMmIzYiwgMHgzNGE1MDgwMCwgMHgxMjAwMDAxMCwgMHgzYzAyMDA4MCwKLTB4MmMyMTAyNCwgMHgxNDQwMDAwZSwgMHgzMmMyMDQwMCwgMHg4ZmFiMDA3YywKLTB4M2MwMjAwODAsIDB4MzQ0MjAxMDAsIDB4MTYyMTAyNCwgMHgxMDQwMDAwNSwKLTB4MCwgMHg4ZjQyMDIwYywgMHgyNDQyMDAwMSwgMHhhZjQyMDIwYywKLTB4OGY0MjAyMGMsIDB4MTAwMDAyYjAsIDB4OGZhMzAwNmMsIDB4MzJjMjA0MDAsCi0weDEwNDAwMDE1LCAweDM0MDI4MTAwLCAweDhmYWEwMDY0LCAweDk1NDMwMDBjLAotMHgxNDYyMDAxMiwgMHgzYzAyMDEwMCwgMHgyNDBiMDIwMCwgMHhhN2FiMDA4ZSwKLTB4OTU0MjAwMGUsIDB4OGQ0MzAwMDgsIDB4OGQ0NDAwMDQsIDB4OGQ0NTAwMDAsCi0weDhmYWEwMDZjLCAweDhmYWIwMDY0LCAweDI1NGFmZmZjLCAweGFmYWEwMDZjLAotMHhhN2EyMDA4NiwgMHhhZDYzMDAwYywgMHhhZDY0MDAwOCwgMHhhZDY1MDAwNCwKLTB4MjU2YjAwMDQsIDB4YWZhYjAwNjQsIDB4M2MwMjAxMDAsIDB4MmMyMTAyNCwKLTB4MTA0MDAwMDQsIDB4MCwgMHg4ZmFhMDA2YywgMHgyNTRhMDAwNCwKLTB4YWZhYTAwNmMsIDB4OGY0MjAwYmMsIDB4NTA0MDAwMGEsIDB4YWZhMDAwNzQsCi0weDhmYWIwMDZjLCAweDRiMTAyYiwgMHg1MDQwMDAwNiwgMHhhZmEwMDA3NCwKLTB4OGY0MjAwYmMsIDB4MTYyMTAyMywgMHhhZmEyMDA3NCwgMHg4ZjRhMDBiYywKLTB4YWZhYTAwNmMsIDB4OGY0MjAwODAsIDB4OGZhYjAwNmMsIDB4NGIxMDJiLAotMHgxMDQwMDA1NiwgMHgzMmMyODAwMCwgMHgxMDQwMDA1ZSwgMHgyNDBhMDAwMywKLTB4MzJjMjEwMDAsIDB4MTA0MDAwNWIsIDB4YWZhYTAwNWMsIDB4MTAwMDAwNTgsCi0weDI0MGIwMDA0LCAweDhmNDIwMzUwLCAweDI0MDNmZmJmLCAweDI4M2EwMjQsCi0weDI0NDIwMDAxLCAweGFmNDIwMzUwLCAweDEwMDAwMjRmLCAweDhmNDIwMzUwLAotMHgyYzJiMDI1LCAweDI0MDJmZmJmLCAweDI4MmEwMjQsIDB4OGY4MzAxMjgsCi0weDNjMDQwMDAxLCAweDI0ODQ2OGQwLCAweDI2NjIwMDAxLCAweGFmYTIwMDE0LAotMHhhZmEzMDAxMCwgMHg4Zjg2MDEyMCwgMHg4Zjg3MDEyNCwgMHgzYzA1MDAwNywKLTB4YzAwMmIzYiwgMHgzNGE1MjI1MCwgMHgxMDAwMDIzZiwgMHgwLAotMHgyYzJiMDI1LCAweDI0MDJmZmJmLCAweDI4MmEwMjQsIDB4OGY4MzAxMjgsCi0weDNjMDQwMDAxLCAweDI0ODQ2OGQwLCAweDI0MDIwMDAyLCAweGFmYTIwMDE0LAotMHhhZmEzMDAxMCwgMHg4Zjg2MDEyMCwgMHg4Zjg3MDEyNCwgMHgzYzA1MDAwNywKLTB4YzAwMmIzYiwgMHgzNGE1MjQ1MCwgMHgxMDAwMDIyZiwgMHgwLAotMHg4ZWEyMDAwMCwgMHg4ZWEzMDAwNCwgMHgzYzA0MDAwMSwgMHgyNDg0NjhlOCwKLTB4YWZiMDAwMTAsIDB4YWZiZTAwMTQsIDB4OGVhNzAwMTgsIDB4MzRhNTI4MDAsCi0weGMwMDJiM2IsIDB4NjAzMDIxLCAweDEwMDAwMjIzLCAweDAsCi0weGE2YjEwMDBhLCAweDhmODIwMTI0LCAweDNjMDQwMDAxLCAweDI0ODQ2OGYwLAotMHhhZmJlMDAxNCwgMHhhZmEyMDAxMCwgMHg4ZjQ2MDA0NCwgMHg4Zjg3MDEyMCwKLTB4M2MwNTAwMDcsIDB4YzAwMmIzYiwgMHgzNGE1MzAwMCwgMHgxMDAwMDIxNiwKLTB4MCwgMHhhNmIxMDAwYSwgMHhhNmIyMDAwZSwgMHg4ZjgyMDEyNCwKLTB4M2MwNDAwMDEsIDB4MjQ4NDY4ZmMsIDB4YWZiZTAwMTQsIDB4YWZhMjAwMTAsCi0weDhmNDYwMDQ0LCAweDhmODcwMTIwLCAweDNjMDUwMDA3LCAweGMwMDJiM2IsCi0weDM0YTUzMjAwLCAweDEwMDAwMjA4LCAweDAsIDB4OGY0MjAwODQsCi0weDhmYWEwMDZjLCAweDRhMTAyYiwgMHgxNDQwMDAwNywgMHgzYzAyMDAwMSwKLTB4MmMyMTAyNCwgMHgxMDQwMDAwNCwgMHgwLCAweDI0MGIwMDAyLAotMHhhZmFiMDA1YywgMHg4ZmFhMDA2YywgMHgxMTQwMDIxYiwgMHgyN2FiMDAyMCwKLTB4YWZhYjAwYTQsIDB4M2MwYTAwMWYsIDB4MzU0YWZmZmYsIDB4YWZhYTAwOWMsCi0weDhmYWIwMDVjLCAweDI0MGEwMDAxLCAweDU1NmEwMDIxLCAweDI0MGEwMDAyLAotMHg4ZjQzMDA1NCwgMHg4ZjQyMDA1MCwgMHgxMDYyMDAwYiwgMHgyNzRiMDA1NCwKLTB4OGY1ZTAwNTQsIDB4MzQwM2VjYzAsIDB4YWZhYjAwNGMsIDB4MjdjMjAwMDEsCi0weDMwNDIwMWZmLCAweGFmYTIwMDU0LCAweDFlMTE0MCwgMHg0MzEwMjEsCi0weDEwMDAwMDZiLCAweDJlMmE4MjEsIDB4OGY0MjAwNDQsIDB4OGZhYTAwNmMsCi0weDNjMDQwMDAxLCAweDI0ODQ2OGFjLCAweGFmYWEwMDE0LCAweGFmYTIwMDEwLAotMHg4ZjQ2MDA1NCwgMHg4ZjQ3MDA1MCwgMHgzYzA1MDAwNywgMHhjMDAyYjNiLAotMHgzNGE1MTMwMCwgMHg4ZjQzMDM1MCwgMHgyNDAyZmZiZiwgMHgyODJhMDI0LAotMHgyNDYzMDAwMSwgMHhhZjQzMDM1MCwgMHgxMDAwMDFkMywgMHg4ZjQyMDM1MCwKLTB4MTU2YTAwMWQsIDB4MCwgMHg4ZjQzMDA3NCwgMHg4ZjQyMDA3MCwKLTB4MTA2MjAwMGEsIDB4Mjc0YjAwNzQsIDB4OGY1ZTAwNzQsIDB4YWZhYjAwNGMsCi0weDI3YzIwMDAxLCAweDMwNDIwM2ZmLCAweGFmYTIwMDU0LCAweDFlMTE0MCwKLTB4MjQ0MjZjYzAsIDB4MTAwMDAwNGEsIDB4MmUyYTgyMSwgMHg4ZjQyMDA0NCwKLTB4OGZhYTAwNmMsIDB4M2MwNDAwMDEsIDB4MjQ4NDY4YjgsIDB4M2MwNTAwMDcsCi0weGFmYWEwMDE0LCAweGFmYTIwMDEwLCAweDhmNDYwMDc0LCAweDhmNDcwMDcwLAotMHgzNGE1MTUwMCwgMHgyNDBiMDAwMSwgMHhjMDAyYjNiLCAweGFmYWIwMDVjLAotMHgxMDAwZmZjMywgMHgwLCAweDhmNDMwMDY0LCAweDhmNDIwMDYwLAotMHgxMDYyMDAxYSwgMHgyNzRhMDA2NCwgMHg4ZjVlMDA2NCwgMHg4ZmFiMDA1YywKLTB4YWZhYTAwNGMsIDB4MjdjMjAwMDEsIDB4MzA0MjAwZmYsIDB4YWZhMjAwNTQsCi0weDI0MDIwMDA0LCAweDE1NjIwMDBlLCAweDFlMTE0MCwgMHgxZTExODAsCi0weDI0NDIwY2MwLCAweDJlMjEwMjEsIDB4YWZhMjAwNDQsIDB4OTQ0MjAwMmEsCi0weDhmYWEwMDQ0LCAweDhmYWIwMDZjLCAweDRiMTAyYiwgMHgxMDQwMDAyNCwKLTB4MjU1NTAwMjAsIDB4MjQwYTAwMDEsIDB4MTAwMDAwMjEsIDB4YTNhYTAwOTcsCi0weDI0NDI0Y2MwLCAweDEwMDAwMDFlLCAweDJlMmE4MjEsIDB4OGY0MjAwNDQsCi0weDhmYWIwMDZjLCAweDNjMDQwMDAxLCAweDI0ODQ2OGM0LCAweGFmYWIwMDE0LAotMHhhZmEyMDAxMCwgMHg4ZjQ2MDA2NCwgMHg4ZjQ3MDA2MCwgMHgzYzA1MDAwNywKLTB4YzAwMmIzYiwgMHgzNGE1MTgwMCwgMHgzYzAyMDAwOCwgMHgyYzIxMDI0LAotMHgxNDQwZmYzNCwgMHgwLCAweDhmNDIwMzcwLCAweDI0MGEwMDAxLAotMHhhZmFhMDA1YywgMHgyNDQyMDAwMSwgMHhhZjQyMDM3MCwgMHgxMDAwZmY5MCwKLTB4OGY0MjAzNzAsIDB4MjdhMzAwMzYsIDB4MTMxMDQwLCAweDYyMTgyMSwKLTB4OTQ2MjAwMDAsIDB4NDQxMDIxLCAweDEwMDAwMDIwLCAweGE0NjIwMDAwLAotMHg4ZmFiMDA2NCwgMHhhZWFiMDAxOCwgMHg5M2EyMDA5NywgMHgxMDQwMDA3MiwKLTB4OTgyMSwgMHg4ZmFhMDA0NCwgMHg4ZmE0MDA2YywgMHg4ZmEzMDBhNCwKLTB4MjU0MjAwMjAsIDB4YWZhMjAwMjgsIDB4MjU0MjAwMDgsIDB4YWZhMjAwMzAsCi0weDI1NDIwMDEwLCAweGFmYWEwMDJjLCAweGFmYTIwMDM0LCAweDk1NDIwMDJhLAotMHhhN2EyMDAzOCwgMHg5NTQyMDAxOCwgMHhhN2EyMDAzYSwgMHg5NTQyMDAxYSwKLTB4YTdhMjAwM2MsIDB4OTU0MjAwMWMsIDB4YTdhMjAwM2UsIDB4OTQ2MjAwMTgsCi0weDI0NjMwMDAyLCAweDgyMjAyMywgMHgxODgwZmZkZSwgMHgyNjczMDAwMSwKLTB4MmU2MjAwMDQsIDB4MTQ0MGZmZjksIDB4MCwgMHg4ZjQyMDBmYywKLTB4MjY2NTAwMDEsIDB4YTIxMDJhLCAweDE0NDAwMDJiLCAweDI0MDMwMDAxLAotMHg4ZjgzMDEyYywgMHgxMDYwMDAyMywgMHgwLCAweDhmODIwMTI0LAotMHg0MzEwMjMsIDB4MjIxNDMsIDB4NTg4MDAwMDEsIDB4MjQ4NDAwNDAsCi0weDhmODIwMTI4LCAweDQzMTAyMywgMHgyMTk0MywgMHg1ODYwMDAwMSwKLTB4MjQ2MzAwNDAsIDB4NjQxMDJhLCAweDU0NDAwMDAxLCAweDYwMjAyMSwKLTB4YWY0NDAwZmMsIDB4OGY0MjAwZmMsIDB4YTIxMDJhLCAweDEwNDAwMDExLAotMHgyNDAzMDAwMSwgMHgxMDAwMDAxNSwgMHgzMDYyMDBmZiwgMHg4ZmFiMDA2NCwKLTB4OTYwNzAwMTgsIDB4YWZhYjAwMTAsIDB4OGUyMjAwMDgsIDB4M2MwNDAwMDEsCi0weDI0ODQ2OGRjLCAweDhjNDMwMDA0LCAweDhjNDIwMDAwLCAweDM0YTUyNDAwLAotMHgyNDAzMDIxLCAweGMwMDJiM2IsIDB4YWZhMzAwMTQsIDB4MTAwMDAwMmIsCi0weDAsIDB4OGY0MjAzMzQsIDB4MTgyMSwgMHgyNDQyMDAwMSwKLTB4YWY0MjAzMzQsIDB4OGY0MjAzMzQsIDB4MzA2MjAwZmYsIDB4NTA0MGZlZGMsCi0weDNjMDIwODAwLCAweDEyNjAwMDIxLCAweDkwMjEsIDB4OGZiMTAwYTQsCi0weDIyMDgwMjEsIDB4OGUyMjAwMDgsIDB4OTYwNzAwMTgsIDB4OGZhNjAwNjQsCi0weDhjNDQwMDAwLCAweDhjNDUwMDA0LCAweDI0MGEwMDAxLCAweGFmYWEwMDEwLAotMHhhZmJlMDAxNCwgMHg4ZjQyMDAwOCwgMHhhZmEyMDAxOCwgMHg4ZjQyMDEwYywKLTB4NDBmODA5LCAweDAsIDB4MTA0MGZmZDgsIDB4M2MwNTAwMDcsCi0weDk2MDIwMDE4LCAweDhmYWIwMDY0LCAweDhmYWEwMDljLCAweDE2MjU4MjEsCi0weDE0YjEwMmIsIDB4MTA0MDAwMDQsIDB4YWZhYjAwNjQsIDB4OGY0MjAxNDgsCi0weDE2MjU4MjMsIDB4YWZhYjAwNjQsIDB4MjYxMDAwMDIsIDB4MjY1MjAwMDEsCi0weDI1MzEwMmIsIDB4MTQ0MGZmZTMsIDB4MjYzMTAwMDQsIDB4OGZiMDAwNmMsCi0weDEwMDAwMDM2LCAweDk3YjEwMDM4LCAweDhmNDIwMGZjLCAweDI0MDUwMDAyLAotMHhhMjEwMmEsIDB4MTQ0MDAwMWIsIDB4MjQwMzAwMDEsIDB4OGY4MzAxMmMsCi0weDEwNjAwMDEzLCAweDAsIDB4OGY4MjAxMjQsIDB4NDMxMDIzLAotMHgyMjE0MywgMHg1ODgwMDAwMSwgMHgyNDg0MDA0MCwgMHg4ZjgyMDEyOCwKLTB4NDMxMDIzLCAweDIxOTQzLCAweDU4NjAwMDAxLCAweDI0NjMwMDQwLAotMHg2NDEwMmEsIDB4NTQ0MDAwMDEsIDB4NjAyMDIxLCAweGFmNDQwMGZjLAotMHg4ZjQyMDBmYywgMHhhMjEwMmEsIDB4MTQ0MDAwMDYsIDB4MjQwMzAwMDEsCi0weDhmNDIwMzM0LCAweDE4MjEsIDB4MjQ0MjAwMDEsIDB4YWY0MjAzMzQsCi0weDhmNDIwMzM0LCAweDMwNjIwMGZmLCAweDEwNDBmZWE1LCAweDNjMDIwODAwLAotMHg5NmIxMDAwYSwgMHg4ZmIwMDA2YywgMHgzMjIzZmZmZiwgMHg3MDEwMmIsCi0weDU0NDAwMDAxLCAweDYwODAyMSwgMHg4ZWE0MDAwMCwgMHg4ZWE1MDAwNCwKLTB4MjQwYjAwMDEsIDB4YWZhYjAwMTAsIDB4YWZiZTAwMTQsIDB4OGY0MjAwMDgsCi0weDhmYTYwMDY0LCAweGFmYTIwMDE4LCAweDhmNDIwMTBjLCAweDQwZjgwOSwKLTB4MjAwMzgyMSwgMHgxMDQwZmVhMiwgMHgzYzA1MDAwNywgMHg5NmEzMDAwZSwKLTB4OTdhYTAwOGUsIDB4MTE0MDAwMDcsIDB4NjA5MDIxLCAweDkzNDIwNWM0LAotMHgxNDQwMDAwNCwgMHgwLCAweDk3YWIwMDg2LCAweDZhMTgyNSwKLTB4YTZhYjAwMTYsIDB4OGZhYTAwN2MsIDB4M2MwMmZmZmYsIDB4MTQyMTAyNCwKLTB4MTA0MDAwMDMsIDB4YTE0MDIsIDB4MzQ2MzA0MDAsIDB4YTZhMjAwMTQsCi0weDhmYWIwMDZjLCAweDU2MGIwMDcyLCAweGE2YTMwMDBlLCAweDM0NjIwMDA0LAotMHhhNmEyMDAwZSwgMHg4ZmFhMDA3NCwgMHgxNmExMDIxLCAweGE2YTIwMDBhLAotMHg4ZjQzMDA0NCwgMHg4ZjQ0MDFhMCwgMHg4ZjQ1MDFhNCwgMHgzNDAyODAwMCwKLTB4YWZhMjAwMTAsIDB4OGY0MjAwNDQsIDB4MmEwMzAyMSwgMHgyNDA3MDAyMCwKLTB4YWZhMjAwMTQsIDB4OGY0MjAwMGMsIDB4MzE5NDAsIDB4NjA0ODIxLAotMHhhZmEyMDAxOCwgMHg4ZjQyMDEwYywgMHg0MDIxLCAweGE5MjgyMSwKLTB4YTkxODJiLCAweDg4MjAyMSwgMHg0MGY4MDksIDB4ODMyMDIxLAotMHg1MDQwZmU3ZiwgMHhhNmIyMDAwZSwgMHg4ZjQyMDM2OCwgMHhhZmEwMDA2YywKLTB4YTM0MDA1YzQsIDB4MjQ0MmZmZmYsIDB4YWY0MjAzNjgsIDB4OGZhYjAwNWMsCi0weDI0MGEwMDAxLCAweDhmNDIwMzY4LCAweDE1NmEwMDA2LCAweDI0MGEwMDAyLAotMHg4ZjQyMDM1YywgMHgyNDQyZmZmZiwgMHhhZjQyMDM1YywgMHgxMDAwMDAwYywKLTB4OGY0MjAzNWMsIDB4MTU2YTAwMDYsIDB4MCwgMHg4ZjQyMDM2NCwKLTB4MjQ0MmZmZmYsIDB4YWY0MjAzNjQsIDB4MTAwMDAwMDUsIDB4OGY0MjAzNjQsCi0weDhmNDIwMzYwLCAweDI0NDJmZmZmLCAweGFmNDIwMzYwLCAweDhmNDIwMzYwLAotMHg4ZmFhMDA1NCwgMHg4ZmFiMDA0YywgMHhhZDZhMDAwMCwgMHg4ZjQyMDA0NCwKLTB4OGY0NDAwODgsIDB4OGY0MzAwNzgsIDB4MjQ0MjAwMDEsIDB4NDQxMDI0LAotMHgyNDYzMDAwMSwgMHhhZjQyMDA0NCwgMHhhZjQzMDA3OCwgMHg4YzAyMDI0MCwKLTB4NjIxODJiLCAweDE0NjAwMDc1LCAweDI0MDcwMDA4LCAweDhmNDQwMTY4LAotMHg4ZjQ1MDE2YywgMHg4ZjQzMDA0NCwgMHg4ZjQ4MDAwYywgMHg4Zjg2MDEyMCwKLTB4MjQwMjAwNDAsIDB4YWZhMjAwMTAsIDB4YWZhMzAwMTQsIDB4YWZhODAwMTgsCi0weDhmNDIwMTBjLCAweDQwZjgwOSwgMHgyNGM2MDAxYywgMHgxNDQwMDAxMSwKLTB4MjQwYjAwMDEsIDB4M2MwMTAwMDEsIDB4MzcwODIxLCAweGEwMmI0MGYyLAotMHg4ZjgyMDEyNCwgMHhhZmEyMDAxMCwgMHg4ZjgyMDEyOCwgMHgzYzA0MDAwMSwKLTB4MjQ4NDY4OGMsIDB4YWZhMjAwMTQsIDB4OGY0NjAwNDQsIDB4OGY4NzAxMjAsCi0weDNjMDUwMDA5LCAweGMwMDJiM2IsIDB4MzRhNTEzMDAsIDB4MTAwMDAwMGIsCi0weDAsIDB4OGY0MjAzMDQsIDB4MjQ0MjAwMDEsIDB4YWY0MjAzMDQsCi0weDhmNDIwMzA0LCAweDhmNDIwMDQ0LCAweGFmNDIwMDdjLCAweDNjMDEwMDAxLAotMHgzNzA4MjEsIDB4YTAyMDQwZjIsIDB4YWY0MDAwNzgsIDB4OGY0MjAzMTgsCi0weDI0NDIwMDAxLCAweGFmNDIwMzE4LCAweDEwMDAwMDQ4LCAweDhmNDIwMzE4LAotMHhhNmIwMDAwYSwgMHg4ZjQzMDA0NCwgMHg4ZjQ0MDFhMCwgMHg4ZjQ1MDFhNCwKLTB4MzQwMjgwMDAsIDB4YWZhMjAwMTAsIDB4OGY0MjAwNDQsIDB4MmEwMzAyMSwKLTB4MjQwNzAwMjAsIDB4YWZhMjAwMTQsIDB4OGY0MjAwMGMsIDB4MzE5NDAsCi0weDYwNDgyMSwgMHhhZmEyMDAxOCwgMHg4ZjQyMDEwYywgMHg0MDIxLAotMHhhOTI4MjEsIDB4YTkxODJiLCAweDg4MjAyMSwgMHg0MGY4MDksCi0weDgzMjAyMSwgMHgxMDQwZmUxZiwgMHgyNDBhMDAwMSwgMHhhMzRhMDVjNCwKLTB4OGZhYjAwNmMsIDB4OGZhYTAwNjQsIDB4MTcwNTgyMywgMHhhZmFiMDA2YywKLTB4OGZhYjAwOWMsIDB4MTUwNTAyMSwgMHgxNmExMDJiLCAweDEwNDAwMDA0LAotMHhhZmFhMDA2NCwgMHg4ZjQyMDE0OCwgMHgxNDI1MDIzLCAweGFmYWEwMDY0LAotMHg4ZjQyMDM2OCwgMHgyNDQyZmZmZiwgMHhhZjQyMDM2OCwgMHg4ZmFhMDA1YywKLTB4MjQwYjAwMDEsIDB4OGY0MjAzNjgsIDB4MTU0YjAwMDYsIDB4MjQwYjAwMDIsCi0weDhmNDIwMzVjLCAweDI0NDJmZmZmLCAweGFmNDIwMzVjLCAweDEwMDAwMDBjLAotMHg4ZjQyMDM1YywgMHgxMTRiMDAwNiwgMHgwLCAweDhmNDIwMzYwLAotMHgyNDQyZmZmZiwgMHhhZjQyMDM2MCwgMHgxMDAwMDAwNSwgMHg4ZjQyMDM2MCwKLTB4OGY0MjAzNjQsIDB4MjQ0MmZmZmYsIDB4YWY0MjAzNjQsIDB4OGY0MjAzNjQsCi0weDhmYWIwMDU0LCAweDhmYWEwMDRjLCAweGFkNGIwMDAwLCAweDhmNDIwMDQ0LAotMHg4ZjQ0MDA4OCwgMHg4ZjQzMDA3OCwgMHgyNDQyMDAwMSwgMHg0NDEwMjQsCi0weDI0NjMwMDAxLCAweGFmNDIwMDQ0LCAweGFmNDMwMDc4LCAweDhmYWEwMDZjLAotMHgxNTQwZmUwYiwgMHgwLCAweDhmYWIwMDZjLCAweDExNjAwMDFlLAotMHgwLCAweDkzNDIwNWM0LCAweDEwNDAwMDA5LCAweDAsCi0weDhmYWEwMDY0LCAweGFmNGEwMGM0LCAweGFmNGIwMGMwLCAweDhmYWIwMDdjLAotMHhhZjRiMDBjOCwgMHg4ZmFhMDA3NCwgMHgxMDAwMDAwZSwgMHhhZjRhMDBjYywKLTB4OTdhYjAwOGUsIDB4MTE2MDAwMGIsIDB4MzQwMzgxMDAsIDB4OGZhMjAwMjAsCi0weDhjNDYwMDBjLCAweGE0NDMwMDBjLCAweDk3YWEwMDg2LCAweDhjNDQwMDA0LAotMHg4YzQ1MDAwOCwgMHhhNDRhMDAwZSwgMHhhYzQ0MDAwMCwgMHhhYzQ1MDAwNCwKLTB4YWM0NjAwMDgsIDB4OGY0MjAzNGMsIDB4MjQ0MjAwMDEsIDB4YWY0MjAzNGMsCi0weDEwMDAwMDEwLCAweDhmNDIwMzRjLCAweDhmYWIwMDdjLCAweDMxNjRmZmZmLAotMHgyNDg0ZmZmYywgMHg4MDE4MjEsIDB4OGY0NDAyNTAsIDB4OGY0NTAyNTQsCi0weDhmNDYwMTE4LCAweDEwMjEsIDB4YTMyODIxLCAweGEzMzgyYiwKLTB4ODIyMDIxLCAweDg3MjAyMSwgMHhhZjQ0MDI1MCwgMHhjMGY4MDksCi0weGFmNDUwMjU0LCAweDhmYmYwMGM4LCAweDhmYmUwMGM0LCAweDhmYjUwMGMwLAotMHg4ZmIzMDBiYywgMHg4ZmIyMDBiOCwgMHg4ZmIxMDBiNCwgMHg4ZmIwMDBiMCwKLTB4M2UwMDAwOCwgMHgyN2JkMDBkMCwgMHgzZTAwMDA4LCAweDAsCi0weDI3YmRmZjM4LCAweDI0MGIwMDAxLCAweGFmYmYwMGMwLCAweGFmYmUwMGJjLAotMHhhZmI1MDBiOCwgMHhhZmIzMDBiNCwgMHhhZmIyMDBiMCwgMHhhZmIxMDBhYywKLTB4YWZiMDAwYTgsIDB4YTNhMDAwODcsIDB4YWZhMDAwNDQsIDB4YWZhYjAwNWMsCi0weDkzNDIwNWM0LCAweGE3YTAwMDc2LCAweDEwNDAwMDA3LCAweGE3YTAwMDdlLAotMHg4ZjRjMDBjMCwgMHhhZmFjMDA2NCwgMHg4ZjRiMDBjOCwgMHg4ZjVlMDBjNCwKLTB4MTAwMDAxMzAsIDB4YWZhYjAwNmMsIDB4OGY0MjAxMTQsIDB4NDBmODA5LAotMHgwLCAweDQwMzAyMSwgMHgxMGMwMDJhMSwgMHgwLAotMHg4Y2MyMDAwMCwgMHg4Y2MzMDAwNCwgMHhhZmEyMDAyMCwgMHhhZmEzMDAyNCwKLTB4OGZhYzAwMjQsIDB4OGZiZTAwMjAsIDB4MzE4MmZmZmYsIDB4MjQ0MmZmZmMsCi0weGFmYTIwMDY0LCAweDNjMDIwMDA2LCAweDJjMjEwMjQsIDB4MTQ0MDAwMTUsCi0weGFmYWMwMDZjLCAweDkzYzIwMDAwLCAweDMwNDIwMDAxLCAweDEwNDAwMDExLAotMHgyNDAyZmZmZiwgMHg4ZmMzMDAwMCwgMHgxNDYyMDAwNCwgMHgzNDAyZmZmZiwKLTB4OTdjMzAwMDQsIDB4MTA2MjAwMGIsIDB4MCwgMHhjMDAyNGJiLAotMHgzYzAyMDIxLCAweDMwNDIwMGZmLCAweDE0NDAwMDA2LCAweDAsCi0weDhmNDIwMTE4LCAweDQwZjgwOSwgMHgwLCAweDEwMDAwMjgwLAotMHgwLCAweDhmYTIwMDI0LCAweDNjMDNmZmJmLCAweDM0NjNmZmZmLAotMHg0MzEwMjQsIDB4M2MwM2ZmZmYsIDB4NDMxODI0LCAweDE0NjAwMDAzLAotMHhhZmEyMDAyNCwgMHgxMDAwMDA0MCwgMHg4MDIxLCAweDNjMDIwMDgwLAotMHg2MjEwMjQsIDB4MTA0MDAwMDcsIDB4MCwgMHg4ZjQyMDM4YywKLTB4MjQ0MjAwMDEsIDB4YWY0MjAzOGMsIDB4OGY0MjAzOGMsIDB4MTAwMDAwMzYsCi0weDI0MTAwMDAxLCAweDhmNDIwMjEwLCAweDI0NDIwMDAxLCAweGFmNDIwMjEwLAotMHg4ZjQyMDIxMCwgMHgzYzAyMDAwMSwgMHg2MjEwMjQsIDB4MTA0MDAwMDYsCi0weDNjMDIwMDAyLCAweDhmNDIwMWM0LCAweDI0NDIwMDAxLCAweGFmNDIwMWM0LAotMHg4ZjQyMDFjNCwgMHgzYzAyMDAwMiwgMHg2MjEwMjQsIDB4MTA0MDAwMDYsCi0weDNjMDIwMDA0LCAweDhmNDIwMzdjLCAweDI0NDIwMDAxLCAweGFmNDIwMzdjLAotMHg4ZjQyMDM3YywgMHgzYzAyMDAwNCwgMHg2MjEwMjQsIDB4MTA0MDAwMDYsCi0weDNjMDIwMDA4LCAweDhmNDIwMzgwLCAweDI0NDIwMDAxLCAweGFmNDIwMzgwLAotMHg4ZjQyMDM4MCwgMHgzYzAyMDAwOCwgMHg2MjEwMjQsIDB4MTA0MDAwMDYsCi0weDNjMDIwMDEwLCAweDhmNDIwMzg0LCAweDI0NDIwMDAxLCAweGFmNDIwMzg0LAotMHg4ZjQyMDM4NCwgMHgzYzAyMDAxMCwgMHg2MjEwMjQsIDB4MTA0MDAwMDYsCi0weDNjMDIwMDIwLCAweDhmNDIwMWMwLCAweDI0NDIwMDAxLCAweGFmNDIwMWMwLAotMHg4ZjQyMDFjMCwgMHgzYzAyMDAyMCwgMHg2MjEwMjQsIDB4MTA0MDAwMDYsCi0weDI0MTAwMDAxLCAweDhmNDIwMzg4LCAweDI0NDIwMDAxLCAweGFmNDIwMzg4LAotMHg4ZjQyMDM4OCwgMHgyNDEwMDAwMSwgMHg4YzAyMDI2MCwgMHg4ZmFiMDA2NCwKLTB4NGIxMDJiLCAweDEwNDAwMDE1LCAweDMyMDIwMGZmLCAweDhmNDIwMWU4LAotMHgyNDQyMDAwMSwgMHhhZjQyMDFlOCwgMHg4ZjQyMDFlOCwgMHg4ZmFjMDA2YywKLTB4OGY4MjAwZTAsIDB4MzU4YzAxMDAsIDB4YWZhYzAwNmMsIDB4YWZhMjAwMTAsCi0weDhmODIwMGU0LCAweDI0MTAwMDAxLCAweDNjMDQwMDAxLCAweDI0ODQ2OGEwLAotMHhhZmEyMDAxNCwgMHg4ZmE2MDAyMCwgMHg4ZmE3MDAyNCwgMHgzYzA1MDAwNywKLTB4YzAwMmIzYiwgMHgzNGE1MzYwMCwgMHgzMjAyMDBmZiwgMHgxMDQwMDAxMCwKLTB4M2MwMjAwODAsIDB4MmMyMTAyNCwgMHgxNDQwMDAwZSwgMHgzMmMyMDQwMCwKLTB4OGZhYjAwNmMsIDB4M2MwMjAwODAsIDB4MzQ0MjAxMDAsIDB4MTYyMTAyNCwKLTB4MTA0MDAwMDUsIDB4MCwgMHg4ZjQyMDIwYywgMHgyNDQyMDAwMSwKLTB4YWY0MjAyMGMsIDB4OGY0MjAyMGMsIDB4MTAwMDAyMDIsIDB4OGZhMzAwNjQsCi0weDMyYzIwNDAwLCAweDEwNDAwMDEyLCAweDM0MDI4MTAwLCAweDk3YzMwMDBjLAotMHgxNDYyMDAwZiwgMHgwLCAweDI0MGMwMjAwLCAweGE3YWMwMDc2LAotMHg5N2MyMDAwZSwgMHg4ZmMzMDAwOCwgMHg4ZmM0MDAwNCwgMHg4ZmFiMDA2NCwKLTB4OGZjNTAwMDAsIDB4MjU2YmZmZmMsIDB4YWZhYjAwNjQsIDB4YTdhMjAwN2UsCi0weGFmYzMwMDBjLCAweGFmYzQwMDA4LCAweGFmYzUwMDA0LCAweDI3ZGUwMDA0LAotMHg4ZmE3MDA2NCwgMHgzMjAyMDBmZiwgMHgxNDQwMDAzNCwgMHgzYzAyMDEwMCwKLTB4OTdjNDAwMGMsIDB4MmM4MzA1ZGQsIDB4Mzg4Mjg4NzAsIDB4MmM0MjAwMDEsCi0weDYyMTgyNSwgMHgxMDYwMDAxNSwgMHgyODIxLCAweDMyYzIwODAwLAotMHgxMDQwMDAxNSwgMHgyNDAyMDgwMCwgMHg5N2MzMDAxNCwgMHgxNDYyMDAxMiwKLTB4MzQwMmFhYWEsIDB4OTdjMzAwMGUsIDB4MTQ2MjAwMDcsIDB4MjAyMSwKLTB4OTdjMzAwMTAsIDB4MjQwMjAzMDAsIDB4MTQ2MjAwMDQsIDB4ODAxMDIxLAotMHg5N2MyMDAxMiwgMHgyYzQ0MDAwMSwgMHg4MDEwMjEsIDB4NTQ0MDAwMDYsCi0weDI0MDUwMDE2LCAweDEwMDAwMDA0LCAweDAsIDB4MjQwMjA4MDAsCi0weDUwODIwMDAxLCAweDI0MDUwMDBlLCAweDEwYTAwMDEzLCAweDNjNTIwMjEsCi0weDI0ODMwMDA5LCAweDNjMDIwMDFmLCAweDM0NDJmZmZmLCAweDQzMTAyYiwKLTB4MTA0MDAwMDMsIDB4MCwgMHg4ZjQyMDE0OCwgMHg2MjE4MjMsCi0weDkwNjIwMDAwLCAweDM4NDMwMDA2LCAweDJjNjMwMDAxLCAweDM4NDIwMDExLAotMHgyYzQyMDAwMSwgMHg2MjE4MjUsIDB4MTA2MDAwMDQsIDB4M2MwMjAxMDAsCi0weDk0ODIwMDAyLCAweDQ1MzgyMSwgMHgzYzAyMDEwMCwgMHgyYzIxMDI0LAotMHg1MDQwMDAwZSwgMHhhZmE3MDA2NCwgMHg4ZmFjMDA2NCwgMHgxMGVjMDAwOCwKLTB4M2MwNTAwMDcsIDB4M2MwNDAwMDEsIDB4MjQ4NDY5MDgsIDB4OGZhNjAwNjQsCi0weDM0YTU0MDAwLCAweGFmYTAwMDEwLCAweGMwMDJiM2IsIDB4YWZhMDAwMTQsCi0weDhmYWIwMDY0LCAweDI1NmIwMDA0LCAweGFmYWIwMDY0LCAweDhmNDIwMDgwLAotMHg4ZmFjMDA2NCwgMHg0YzEwMmIsIDB4MTA0MDAwMmMsIDB4MzJjMjgwMDAsCi0weDEwNDAwMDM0LCAweDI0MGIwMDAzLCAweDMyYzIxMDAwLCAweDEwNDAwMDMxLAotMHhhZmFiMDA1YywgMHgxMDAwMDAyZSwgMHgyNDBjMDAwNCwgMHg4ZjQyMDM1MCwKLTB4MjQwM2ZmYmYsIDB4MjgzYTAyNCwgMHgyNDQyMDAwMSwgMHhhZjQyMDM1MCwKLTB4MTAwMDAxNzMsIDB4OGY0MjAzNTAsIDB4M2MwMjA4MDAsIDB4MmMyYjAyNSwKLTB4MjQwMmZmYmYsIDB4MjgyYTAyNCwgMHg4ZjgzMDEyOCwgMHgzYzA0MDAwMSwKLTB4MjQ4NDY4ZDAsIDB4MjY2MjAwMDEsIDB4YWZhMjAwMTQsIDB4YWZhMzAwMTAsCi0weDhmODYwMTIwLCAweDhmODcwMTI0LCAweDNjMDUwMDA3LCAweGMwMDJiM2IsCi0weDM0YTU1MzAwLCAweDEwMDAwMTYyLCAweDAsIDB4OGVhMjAwMDAsCi0weDhlYTMwMDA0LCAweDNjMDQwMDAxLCAweDI0ODQ2OGU4LCAweGFmYjAwMDEwLAotMHhhZmIxMDAxNCwgMHg4ZWE3MDAxOCwgMHgzNGE1NTkwMCwgMHhjMDAyYjNiLAotMHg2MDMwMjEsIDB4MTAwMDAxNTYsIDB4MCwgMHg4ZjQyMDA4NCwKLTB4OGZhYjAwNjQsIDB4NGIxMDJiLCAweDE0NDAwMDA3LCAweDNjMDIwMDAxLAotMHgyYzIxMDI0LCAweDEwNDAwMDA0LCAweDAsIDB4MjQwYzAwMDIsCi0weGFmYWMwMDVjLCAweDhmYWIwMDY0LCAweDExNjAwMTY2LCAweDI3YWMwMDIwLAotMHhhZmFjMDA4YywgMHg4ZmFiMDA1YywgMHgyNDBjMDAwMSwgMHg1NTZjMDAyMSwKLTB4MjQwYzAwMDIsIDB4OGY0MzAwNTQsIDB4OGY0MjAwNTAsIDB4MTA2MjAwMGIsCi0weDI3NGIwMDU0LCAweDhmNTEwMDU0LCAweDM0MDNlY2MwLCAweGFmYWIwMDRjLAotMHgyNjIyMDAwMSwgMHgzMDQyMDFmZiwgMHhhZmEyMDA1NCwgMHgxMTExNDAsCi0weDQzMTAyMSwgMHgxMDAwMDA2YiwgMHgyZTJhODIxLCAweDhmNDIwMDQ0LAotMHg4ZmFjMDA2NCwgMHgzYzA0MDAwMSwgMHgyNDg0NjhhYywgMHhhZmFjMDAxNCwKLTB4YWZhMjAwMTAsIDB4OGY0NjAwNTQsIDB4OGY0NzAwNTAsIDB4M2MwNTAwMDcsCi0weGMwMDJiM2IsIDB4MzRhNTQzMDAsIDB4OGY0MzAzNTAsIDB4MjQwMmZmYmYsCi0weDI4MmEwMjQsIDB4MjQ2MzAwMDEsIDB4YWY0MzAzNTAsIDB4MTAwMDAxMjQsCi0weDhmNDIwMzUwLCAweDE1NmMwMDFkLCAweDAsIDB4OGY0MzAwNzQsCi0weDhmNDIwMDcwLCAweDEwNjIwMDBhLCAweDI3NGIwMDc0LCAweDhmNTEwMDc0LAotMHhhZmFiMDA0YywgMHgyNjIyMDAwMSwgMHgzMDQyMDNmZiwgMHhhZmEyMDA1NCwKLTB4MTExMTQwLCAweDI0NDI2Y2MwLCAweDEwMDAwMDRhLCAweDJlMmE4MjEsCi0weDhmNDIwMDQ0LCAweDhmYWMwMDY0LCAweDNjMDQwMDAxLCAweDI0ODQ2OGI4LAotMHgzYzA1MDAwNywgMHhhZmFjMDAxNCwgMHhhZmEyMDAxMCwgMHg4ZjQ2MDA3NCwKLTB4OGY0NzAwNzAsIDB4MzRhNTQ1MDAsIDB4MjQwYjAwMDEsIDB4YzAwMmIzYiwKLTB4YWZhYjAwNWMsIDB4MTAwMGZmYzMsIDB4MCwgMHg4ZjQzMDA2NCwKLTB4OGY0MjAwNjAsIDB4MTA2MjAwMWEsIDB4Mjc0YzAwNjQsIDB4OGY1MTAwNjQsCi0weDhmYWIwMDVjLCAweGFmYWMwMDRjLCAweDI2MjIwMDAxLCAweDMwNDIwMGZmLAotMHhhZmEyMDA1NCwgMHgyNDAyMDAwNCwgMHgxNTYyMDAwZSwgMHgxMTExNDAsCi0weDExMTE4MCwgMHgyNDQyMGNjMCwgMHgyZTIxMDIxLCAweGFmYTIwMDQ0LAotMHg5NDQyMDAyYSwgMHg4ZmFjMDA0NCwgMHg4ZmFiMDA2NCwgMHg0YjEwMmIsCi0weDEwNDAwMDI0LCAweDI1OTUwMDIwLCAweDI0MGMwMDAxLCAweDEwMDAwMDIxLAotMHhhM2FjMDA4NywgMHgyNDQyNGNjMCwgMHgxMDAwMDAxZSwgMHgyZTJhODIxLAotMHg4ZjQyMDA0NCwgMHg4ZmFiMDA2NCwgMHgzYzA0MDAwMSwgMHgyNDg0NjhjNCwKLTB4YWZhYjAwMTQsIDB4YWZhMjAwMTAsIDB4OGY0NjAwNjQsIDB4OGY0NzAwNjAsCi0weDNjMDUwMDA3LCAweGMwMDJiM2IsIDB4MzRhNTQ4MDAsIDB4M2MwMjAwMDgsCi0weDJjMjEwMjQsIDB4MTQ0MGZmNjEsIDB4MCwgMHg4ZjQyMDM3MCwKLTB4MjQwYzAwMDEsIDB4YWZhYzAwNWMsIDB4MjQ0MjAwMDEsIDB4YWY0MjAzNzAsCi0weDEwMDBmZjkwLCAweDhmNDIwMzcwLCAweDI3YTMwMDM2LCAweDEzMTA0MCwKLTB4NjIxODIxLCAweDk0NjIwMDAwLCAweDQ0MTAyMSwgMHgxMDAwMDAxZiwKLTB4YTQ2MjAwMDAsIDB4YWViZTAwMTgsIDB4OTNhMjAwODcsIDB4MTA0MDAwODQsCi0weDk4MjEsIDB4OGZhYjAwNDQsIDB4OGZhNDAwNjQsIDB4OGZhMzAwOGMsCi0weDI1NjIwMDIwLCAweGFmYTIwMDI4LCAweDI1NjIwMDA4LCAweGFmYTIwMDMwLAotMHgyNTYyMDAxMCwgMHhhZmFiMDAyYywgMHhhZmEyMDAzNCwgMHg5NTYyMDAyYSwKLTB4YTdhMjAwMzgsIDB4OTU2MjAwMTgsIDB4YTdhMjAwM2EsIDB4OTU2MjAwMWEsCi0weGE3YTIwMDNjLCAweDk1NjIwMDFjLCAweGE3YTIwMDNlLCAweDk0NjIwMDE4LAotMHgyNDYzMDAwMiwgMHg4MjIwMjMsIDB4MTg4MGZmZGYsIDB4MjY3MzAwMDEsCi0weDJlNjIwMDA0LCAweDE0NDBmZmY5LCAweDAsIDB4OGY0MjAwZmMsCi0weDI2MjEwMmEsIDB4MTQ0MDAwMzAsIDB4MjQwMzAwMDEsIDB4OGY4MzAxMmMsCi0weDEwNjAwMDI4LCAweDAsIDB4OGY4MjAxMjQsIDB4NDMxMDIzLAotMHgyMjE0MywgMHg1ODgwMDAwMSwgMHgyNDg0MDA0MCwgMHg4ZjgyMDEyOCwKLTB4NDMxMDIzLCAweDIxOTQzLCAweDU4NjAwMDAxLCAweDI0NjMwMDQwLAotMHg2NDEwMmEsIDB4NTQ0MDAwMDEsIDB4NjAyMDIxLCAweGFmNDQwMGZjLAotMHg4ZjQyMDBmYywgMHgyNjIxMDJhLCAweDEwNDAwMDE2LCAweDI0MDMwMDAxLAotMHgxMDAwMDAxYSwgMHgzMDYyMDBmZiwgMHg4ZmFjMDA4YywgMHgxMDEwNDAsCi0weDRjMTAyMSwgMHg5NDQ3MDAxOCwgMHgxMDEwODAsIDB4NGMxMDIxLAotMHhhZmJlMDAxMCwgMHg4YzQyMDAwOCwgMHgzYzA0MDAwMSwgMHgyNDg0NjhkYywKLTB4M2MwNTAwMDcsIDB4OGM0MzAwMDQsIDB4OGM0MjAwMDAsIDB4MzRhNTU1MDAsCi0weDIwMDMwMjEsIDB4YzAwMmIzYiwgMHhhZmEzMDAxNCwgMHgxMDAwMDAzOSwKLTB4MCwgMHg4ZjQyMDMzNCwgMHgxODIxLCAweDI0NDIwMDAxLAotMHhhZjQyMDMzNCwgMHg4ZjQyMDMzNCwgMHgzMDYyMDBmZiwgMHgxMDQwZmYwNiwKLTB4ODAyMSwgMHg4ZjQzMDAwOCwgMHgyNDAyZmJmZiwgMHgxMjYwMDAyZCwKLTB4NjI1MDI0LCAweDNjMGI0MDAwLCAweDIyYjQwMjUsIDB4OGZiMTAwOGMsCi0weDI2NjlmZmZmLCAweDIyMDkwMjEsIDB4OGU0MjAwMDgsIDB4OTYyNzAwMTgsCi0weDhjNDQwMDAwLCAweDhjNDUwMDA0LCAweDU2MDkwMDA0LCAweDI0MGIwMDAxLAotMHgyNDBjMDAwMiwgMHgxMDAwMDAwMiwgMHhhZmFjMDAxMCwgMHhhZmFiMDAxMCwKLTB4MTYwMDAwMDQsIDB4YWZhODAwMTQsIDB4OGY0MjAwMDgsIDB4MTAwMDAwMDIsCi0weGFmYTIwMDE4LCAweGFmYWEwMDE4LCAweDhmNDIwMTBjLCAweDNjMDMwMjEsCi0weGFmYTgwMDk4LCAweGFmYTkwMDljLCAweDQwZjgwOSwgMHhhZmFhMDBhMCwKLTB4OGZhODAwOTgsIDB4OGZhOTAwOWMsIDB4OGZhYTAwYTAsIDB4MTA0MGZmYzIsCi0weDNjMDIwMDFmLCAweDk2MjMwMDE4LCAweDM0NDJmZmZmLCAweDNjM2YwMjEsCi0weDVlMTAyYiwgMHgxMDQwMDAwMywgMHgyNjMxMDAwMiwgMHg4ZjQyMDE0OCwKLTB4M2MyZjAyMywgMHgyNjEwMDAwMSwgMHgyMTMxMDJiLCAweDE0NDBmZmRhLAotMHgyNjUyMDAwNCwgMHg4ZmIwMDA2NCwgMHgxMDAwMDAxYSwgMHgwLAotMHg5NmEzMDAwYSwgMHg4ZmIwMDA2NCwgMHg3MDEwMmIsIDB4NTQ0MDAwMDEsCi0weDYwODAyMSwgMHg4ZWE0MDAwMCwgMHg4ZWE1MDAwNCwgMHg4ZmFiMDA1YywKLTB4MjQwYzAwMDIsIDB4YWZhYzAwMTAsIDB4OTM0MzA1YzQsIDB4YjE3MDAsCi0weDEwNjAwMDAzLCAweDIyMjMwMjUsIDB4M2MwMjA4MDAsIDB4YzIzMDI1LAotMHhhZmE2MDAxNCwgMHg4ZjQyMDAwOCwgMHhhZmEyMDAxOCwgMHg4ZjQyMDEwYywKLTB4M2MwMzAyMSwgMHg0MGY4MDksIDB4MjAwMzgyMSwgMHgxMDQwZmVjYiwKLTB4M2MwNTAwMDcsIDB4OTdhYzAwNzYsIDB4MTE4MDAwMDcsIDB4OTZhMzAwMGUsCi0weDkzNDIwNWM0LCAweDE0NDAwMDA0LCAweDAsIDB4OTdhYjAwN2UsCi0weDZjMTgyNSwgMHhhNmFiMDAxNiwgMHg4ZmFjMDA2YywgMHgzYzAyZmZmZiwKLTB4MTgyMTAyNCwgMHgxMDQwMDAwMywgMHhjMTQwMiwgMHgzNDYzMDQwMCwKLTB4YTZhMjAwMTQsIDB4YTZiMDAwMGEsIDB4OGZhYjAwNjQsIDB4NTYwYjAwMDYsCi0weDNkMGYwMjEsIDB4MzQ2MjAwMDQsIDB4YWZhMDAwNjQsIDB4YTZhMjAwMGUsCi0weDEwMDAwMDBkLCAweGEzNDAwNWM0LCAweDhmYWMwMDY0LCAweDNjMDIwMDFmLAotMHgzNDQyZmZmZiwgMHg1ZTEwMmIsIDB4MTkwNjAyMywgMHhhZmFjMDA2NCwKLTB4YTZhMzAwMGUsIDB4MjQwYjAwMDEsIDB4MTA0MDAwMDMsIDB4YTM0YjA1YzQsCi0weDhmNDIwMTQ4LCAweDNjMmYwMjMsIDB4OGZhYjAwNTQsIDB4OGZhYzAwNGMsCi0weGFkOGIwMDAwLCAweDhmYWMwMDY0LCAweDE1ODBmZWJhLCAweDAsCi0weDhmYWIwMDY0LCAweDExNjAwMDFiLCAweDAsIDB4OTM0MjA1YzQsCi0weDEwNDAwMDA2LCAweDAsIDB4YWY1ZTAwYzQsIDB4YWY0YjAwYzAsCi0weDhmYWMwMDZjLCAweDEwMDAwMDBlLCAweGFmNGMwMGM4LCAweDk3YWIwMDc2LAotMHgxMTYwMDAwYiwgMHgzNDAzODEwMCwgMHg4ZmEyMDAyMCwgMHg4YzQ2MDAwYywKLTB4YTQ0MzAwMGMsIDB4OTdhYzAwN2UsIDB4OGM0NDAwMDQsIDB4OGM0NTAwMDgsCi0weGE0NGMwMDBlLCAweGFjNDQwMDAwLCAweGFjNDUwMDA0LCAweGFjNDYwMDA4LAotMHg4ZjQyMDM0YywgMHgyNDQyMDAwMSwgMHhhZjQyMDM0YywgMHgxMDAwMDAxMCwKLTB4OGY0MjAzNGMsIDB4OGZhYjAwNmMsIDB4MzE2NGZmZmYsIDB4MjQ4NGZmZmMsCi0weDgwMTgyMSwgMHg4ZjQ0MDI1MCwgMHg4ZjQ1MDI1NCwgMHg4ZjQ2MDExOCwKLTB4MTAyMSwgMHhhMzI4MjEsIDB4YTMzODJiLCAweDgyMjAyMSwKLTB4ODcyMDIxLCAweGFmNDQwMjUwLCAweGMwZjgwOSwgMHhhZjQ1MDI1NCwKLTB4OGZiZjAwYzAsIDB4OGZiZTAwYmMsIDB4OGZiNTAwYjgsIDB4OGZiMzAwYjQsCi0weDhmYjIwMGIwLCAweDhmYjEwMGFjLCAweDhmYjAwMGE4LCAweDNlMDAwMDgsCi0weDI3YmQwMGM4LCAweDNlMDAwMDgsIDB4MCwgMHgyN2JkZmZkOCwKLTB4YWZiZjAwMjQsIDB4YWZiMDAwMjAsIDB4OGY0MzAwNGMsIDB4OGY0MjAwNDgsCi0weDEwNjIwMDM0LCAweDAsIDB4OGY0MzAwNDgsIDB4OGY0MjAwNGMsCi0weDYyMjAyMywgMHg0ODIwMDAxLCAweDI0ODQwMjAwLCAweDhmNDMwMDU0LAotMHg4ZjQyMDA0YywgMHg0MzEwMmIsIDB4MTQ0MDAwMDQsIDB4MjQwMjAyMDAsCi0weDhmNDMwMDRjLCAweDEwMDAwMDA1LCAweDQzMTAyMywgMHg4ZjQyMDA1NCwKLTB4OGY0MzAwNGMsIDB4NDMxMDIzLCAweDI0NDJmZmZmLCAweDQwNTAyMSwKLTB4OGExMDJhLCAweDU0NDAwMDAxLCAweDgwNTAyMSwgMHg4ZjQ5MDA0YywKLTB4OGY0ODAwNGMsIDB4OGY0NDAxODgsIDB4OGY0NTAxOGMsIDB4OGY0NjAwNGMsCi0weDI0MDcxMDAwLCAweGFmYTcwMDEwLCAweDg0MTQwLCAweDEwMDE4MjEsCi0weDEyYTQ4MjEsIDB4MzEzMDAxZmYsIDB4YWZiMDAwMTQsIDB4OGY0NzAwMTQsCi0weDEwMjEsIDB4NjMxNDAsIDB4YWZhNzAwMTgsIDB4YTMyODIxLAotMHhhMzM4MmIsIDB4ODIyMDIxLCAweDg3MjAyMSwgMHgzNDAyZWNjMCwKLTB4YzIzMDIxLCAweDhmNDIwMTA4LCAweDJlNjMwMjEsIDB4NDBmODA5LAotMHhhMzk0MCwgMHg1NDQwMDAwMSwgMHhhZjUwMDA0YywgMHg4ZjQzMDA0YywKLTB4OGY0MjAwNDgsIDB4MTQ2MjAwMTgsIDB4MCwgMHg4ZjQyMDAwMCwKLTB4MTA0MDAwMDcsIDB4MCwgMHhhZjgwMDA0YywgMHg4ZjgyMDA0YywKLTB4MTA0MGZmZmQsIDB4MCwgMHgxMDAwMDAwNSwgMHgwLAotMHhhZjgwMDA0OCwgMHg4ZjgyMDA0OCwgMHgxMDQwZmZmZCwgMHgwLAotMHg4ZjgyMDA2MCwgMHgyNDAzZmRmZiwgMHg0MzEwMjQsIDB4YWY4MjAwNjAsCi0weDhmNDIwMDAwLCAweDEwNDAwMDAzLCAweDAsIDB4MTAwMDAwMDIsCi0weGFmODAwMDRjLCAweGFmODAwMDQ4LCAweDhmYmYwMDI0LCAweDhmYjAwMDIwLAotMHgzZTAwMDA4LCAweDI3YmQwMDI4LCAweDNlMDAwMDgsIDB4MCwKLTB4MjdiZGZmZDgsIDB4YWZiZjAwMjQsIDB4YWZiMDAwMjAsIDB4OGY0MzAwNWMsCi0weDhmNDIwMDU4LCAweDEwNjIwMDQ5LCAweDAsIDB4OGY0MzAwNTgsCi0weDhmNDIwMDVjLCAweDYyMjAyMywgMHg0ODIwMDAxLCAweDI0ODQwMTAwLAotMHg4ZjQzMDA2NCwgMHg4ZjQyMDA1YywgMHg0MzEwMmIsIDB4MTQ0MDAwMDQsCi0weDI0MDIwMTAwLCAweDhmNDMwMDVjLCAweDEwMDAwMDA1LCAweDQzMTAyMywKLTB4OGY0MjAwNjQsIDB4OGY0MzAwNWMsIDB4NDMxMDIzLCAweDI0NDJmZmZmLAotMHg0MDM4MjEsIDB4ODcxMDJhLCAweDU0NDAwMDAxLCAweDgwMzgyMSwKLTB4OGY0MjAwNWMsIDB4NDcxMDIxLCAweDMwNTAwMGZmLCAweDMyYzIxMDAwLAotMHgxMDQwMDAxNSwgMHgyNDA4MjAwMCwgMHg4ZjQ5MDA1YywgMHg4ZjQ0MDE5MCwKLTB4OGY0NTAxOTQsIDB4OGY0NjAwNWMsIDB4NzM5ODAsIDB4YWZhODAwMTAsCi0weGFmYjAwMDE0LCAweDhmNDgwMDE0LCAweDk0OTgwLCAweDEyMDE4MjEsCi0weDEwMjEsIDB4YTMyODIxLCAweGEzNDgyYiwgMHg4MjIwMjEsCi0weDg5MjAyMSwgMHg2MzE4MCwgMHhhZmE4MDAxOCwgMHg4ZjQyMDEwOCwKLTB4MTAwMDAwMTQsIDB4MjRjNjBjYzAsIDB4OGY0OTAwNWMsIDB4OGY0NDAxOTAsCi0weDhmNDUwMTk0LCAweDhmNDYwMDVjLCAweDczOTQwLCAweGFmYTgwMDEwLAotMHhhZmIwMDAxNCwgMHg4ZjQ4MDAxNCwgMHg5NDk0MCwgMHgxMjAxODIxLAotMHgxMDIxLCAweGEzMjgyMSwgMHhhMzQ4MmIsIDB4ODIyMDIxLAotMHg4OTIwMjEsIDB4NjMxNDAsIDB4YWZhODAwMTgsIDB4OGY0MjAxMDgsCi0weDI0YzY0Y2MwLCAweDQwZjgwOSwgMHgyZTYzMDIxLCAweDU0NDAwMDAxLAotMHhhZjUwMDA1YywgMHg4ZjQzMDA1YywgMHg4ZjQyMDA1OCwgMHgxNDYyMDAxOCwKLTB4MCwgMHg4ZjQyMDAwMCwgMHgxMDQwMDAwNywgMHgwLAotMHhhZjgwMDA0YywgMHg4ZjgyMDA0YywgMHgxMDQwZmZmZCwgMHgwLAotMHgxMDAwMDAwNSwgMHgwLCAweGFmODAwMDQ4LCAweDhmODIwMDQ4LAotMHgxMDQwZmZmZCwgMHgwLCAweDhmODIwMDYwLCAweDI0MDNmZWZmLAotMHg0MzEwMjQsIDB4YWY4MjAwNjAsIDB4OGY0MjAwMDAsIDB4MTA0MDAwMDMsCi0weDAsIDB4MTAwMDAwMDIsIDB4YWY4MDAwNGMsIDB4YWY4MDAwNDgsCi0weDhmYmYwMDI0LCAweDhmYjAwMDIwLCAweDNlMDAwMDgsIDB4MjdiZDAwMjgsCi0weDNlMDAwMDgsIDB4MCwgMHgyN2JkZmZkOCwgMHhhZmJmMDAyNCwKLTB4YWZiMDAwMjAsIDB4OGY0MzAwNmMsIDB4OGY0MjAwNjgsIDB4MTA2MjAwMzMsCi0weDAsIDB4OGY0MzAwNjgsIDB4OGY0MjAwNmMsIDB4NjIyMDIzLAotMHg0ODIwMDAxLCAweDI0ODQwNDAwLCAweDhmNDMwMDc0LCAweDhmNDIwMDZjLAotMHg0MzEwMmIsIDB4MTQ0MDAwMDQsIDB4MjQwMjA0MDAsIDB4OGY0MzAwNmMsCi0weDEwMDAwMDA1LCAweDQzMTAyMywgMHg4ZjQyMDA3NCwgMHg4ZjQzMDA2YywKLTB4NDMxMDIzLCAweDI0NDJmZmZmLCAweDQwNTAyMSwgMHg4YTEwMmEsCi0weDU0NDAwMDAxLCAweDgwNTAyMSwgMHg4ZjQ5MDA2YywgMHg4ZjQ4MDA2YywKLTB4OGY0NDAxOTgsIDB4OGY0NTAxOWMsIDB4OGY0NjAwNmMsIDB4MjQwNzQwMDAsCi0weGFmYTcwMDEwLCAweDg0MTQwLCAweDEwMDE4MjEsIDB4MTJhNDgyMSwKLTB4MzEzMDAzZmYsIDB4YWZiMDAwMTQsIDB4OGY0NzAwMTQsIDB4MTAyMSwKLTB4NjMxNDAsIDB4MjRjNjZjYzAsIDB4YWZhNzAwMTgsIDB4YTMyODIxLAotMHhhMzM4MmIsIDB4ODIyMDIxLCAweDg3MjAyMSwgMHg4ZjQyMDEwOCwKLTB4MmU2MzAyMSwgMHg0MGY4MDksIDB4YTM5NDAsIDB4NTQ0MDAwMDEsCi0weGFmNTAwMDZjLCAweDhmNDMwMDZjLCAweDhmNDIwMDY4LCAweDE0NjIwMDE4LAotMHgwLCAweDhmNDIwMDAwLCAweDEwNDAwMDA3LCAweDAsCi0weGFmODAwMDRjLCAweDhmODIwMDRjLCAweDEwNDBmZmZkLCAweDAsCi0weDEwMDAwMDA1LCAweDAsIDB4YWY4MDAwNDgsIDB4OGY4MjAwNDgsCi0weDEwNDBmZmZkLCAweDAsIDB4OGY4MjAwNjAsIDB4MjQwM2Y3ZmYsCi0weDQzMTAyNCwgMHhhZjgyMDA2MCwgMHg4ZjQyMDAwMCwgMHgxMDQwMDAwMywKLTB4MCwgMHgxMDAwMDAwMiwgMHhhZjgwMDA0YywgMHhhZjgwMDA0OCwKLTB4OGZiZjAwMjQsIDB4OGZiMDAwMjAsIDB4M2UwMDAwOCwgMHgyN2JkMDAyOCwKLTB4M2UwMDAwOCwgMHgwLCAweDhmNDIwMGZjLCAweDNjMDMwMDAxLAotMHg4ZjQ0MDBmOCwgMHgzNDYzMzBjOCwgMHgyNDQyMDAwMSwgMHhhZjQyMDBmYywKLTB4OGY4NTAxMjgsIDB4MmUzMTAyMSwgMHg1NDgyMDAwNCwgMHgyNDgyMDAwOCwKLTB4M2MwMjAwMDEsIDB4MzQ0MjJlYzgsIDB4MmUyMTAyMSwgMHg0MDE4MjEsCi0weGFmNDMwMGY4LCAweGFjNjAwMDAwLCAweDhmNDIwMGY0LCAweDE0NjIwMDA0LAotMHgzYzAyMDAwMSwgMHgyNGEyMDAyMCwgMHgxMDAwMDAwZiwgMHhhZjgyMDEyOCwKLTB4OGY0MzAwZjgsIDB4MzQ0MjMwYzgsIDB4MmUyMTAyMSwgMHg1NDYyMDAwNCwKLTB4MjQ2MjAwMDgsIDB4M2MwMjAwMDEsIDB4MzQ0MjJlYzgsIDB4MmUyMTAyMSwKLTB4NDAxODIxLCAweDhjNjIwMDA0LCAweDIxMTQwLCAweGEyMTAyMSwKLTB4YWY4MjAxMjgsIDB4YWM2MDAwMDAsIDB4OGNhMzAwMTgsIDB4MzA2MjAwNzAsCi0weDEwNDAwMDJkLCAweDMwNjIwMDIwLCAweDEwNDAwMDA0LCAweDNjMDIwMDEwLAotMHgyYzIxMDI0LCAweDEwNDAwMDBkLCAweDAsIDB4MzA2MjAwNDAsCi0weDEwNDAwMDA0LCAweDNjMDIwMDIwLCAweDJjMjEwMjQsIDB4MTA0MDAwMDcsCi0weDAsIDB4MzA2MjAwMTAsIDB4MTA0MDAwMWYsIDB4M2MwMjAwNDAsCi0weDJjMjEwMjQsIDB4MTQ0MDAwMWMsIDB4MCwgMHg4ZjgyMDA0MCwKLTB4MzA0MjAwMDEsIDB4MTQ0MDAwMDgsIDB4MjAyMSwgMHg4YzAzMDEwNCwKLTB4MjQwMjAwMDEsIDB4NTA2MjAwMDUsIDB4MjQwNDAwMDEsIDB4OGMwMjAyNjQsCi0weDEwNDAwMDAzLCAweDgwMTAyMSwgMHgyNDA0MDAwMSwgMHg4MDEwMjEsCi0weDEwNDAwMDA2LCAweDAsIDB4OGY0MjAzMGMsIDB4MjQ0MjAwMDEsCi0weGFmNDIwMzBjLCAweDEwMDAwMDA4LCAweDhmNDIwMzBjLCAweDhmODIwMDQ0LAotMHgzNDQyMDAwNCwgMHhhZjgyMDA0NCwgMHg4ZjQyMDMwOCwgMHgyNDQyMDAwMSwKLTB4YWY0MjAzMDgsIDB4OGY0MjAzMDgsIDB4M2UwMDAwOCwgMHgwLAotMHgzZTAwMDA4LCAweDAsIDB4MjdiZGZmOTgsIDB4YWZiZjAwNjAsCi0weGFmYmUwMDVjLCAweGFmYjUwMDU4LCAweGFmYjMwMDU0LCAweGFmYjIwMDUwLAotMHhhZmIxMDA0YywgMHhhZmIwMDA0OCwgMHg4ZjQyMDBmYywgMHgyNDQyMDAwMSwKLTB4YWY0MjAwZmMsIDB4OGY4ODAxMjgsIDB4MjUwMjAwMjAsIDB4YWY4MjAxMjgsCi0weDhkMDMwMDE4LCAweDMwNjIwMDcwLCAweDEwNDAwMDJlLCAweDMwNjIwMDIwLAotMHgxMDQwMDAwNCwgMHgzYzAyMDAxMCwgMHgyYzIxMDI0LCAweDEwNDAwMDBkLAotMHgwLCAweDMwNjIwMDQwLCAweDEwNDAwMDA0LCAweDNjMDIwMDIwLAotMHgyYzIxMDI0LCAweDEwNDAwMDA3LCAweDAsIDB4MzA2MjAwMTAsCi0weDEwNDAwMWE5LCAweDNjMDIwMDQwLCAweDJjMjEwMjQsIDB4MTQ0MDAxYTYsCi0weDAsIDB4OGY4MjAwNDAsIDB4MzA0MjAwMDEsIDB4MTQ0MDAwMDgsCi0weDIwMjEsIDB4OGMwMzAxMDQsIDB4MjQwMjAwMDEsIDB4NTA2MjAwMDUsCi0weDI0MDQwMDAxLCAweDhjMDIwMjY0LCAweDEwNDAwMDAzLCAweDgwMTAyMSwKLTB4MjQwNDAwMDEsIDB4ODAxMDIxLCAweDEwNDAwMDA2LCAweDAsCi0weDhmNDIwMzBjLCAweDI0NDIwMDAxLCAweGFmNDIwMzBjLCAweDEwMDAwMTkyLAotMHg4ZjQyMDMwYywgMHg4ZjgyMDA0NCwgMHgzNDQyMDAwNCwgMHhhZjgyMDA0NCwKLTB4OGY0MjAzMDgsIDB4MjQ0MjAwMDEsIDB4YWY0MjAzMDgsIDB4MTAwMDAxOGEsCi0weDhmNDIwMzA4LCAweDMwNjIwMDAyLCAweDEwNDAwMTRiLCAweDNjMDIwODAwLAotMHg4ZDFlMDAxYywgMHgxZTU3MDIsIDB4YWZhYTAwMzQsIDB4OTUwYTAwMTYsCi0weDNjMjIwMjQsIDB4YWZhYTAwMjQsIDB4OGZhYTAwMzQsIDB4MjQwMjAwMDEsCi0weDE1NDIwMDA2LCAweDMzZGVmZmZmLCAweDFlMTE0MCwgMHgzNDAzZWNjMCwKLTB4NDMxMDIxLCAweDEwMDAwMDEwLCAweDJlMmE4MjEsIDB4MjQwMjAwMDIsCi0weDE1NDIwMDA1LCAweDI0MDIwMDAzLCAweDFlMTE0MCwgMHgyNDQyNmNjMCwKLTB4MTAwMDAwMDksIDB4MmUyYTgyMSwgMHgxNTQyMDAwNSwgMHgxZTExODAsCi0weDFlMTE0MCwgMHgyNDQyNGNjMCwgMHgxMDAwMDAwMywgMHgyZTJhODIxLAotMHg1NzEwMjEsIDB4MjQ1NTBjZTAsIDB4OTZhMjAwMGUsIDB4MzA0YWZmZmMsCi0weDMwNDIwNDAwLCAweDEwNDAwMDAzLCAweGFmYWEwMDJjLCAweDEwMDAwMGUxLAotMHg4ODIxLCAweDEwODAwMDA0LCAweDg4MjEsIDB4OTdiMTAwMjYsCi0weDEwMDAwMGRkLCAweGE2YjEwMDEyLCAweDhlYjMwMDE4LCAweDk2NmEwMDBjLAotMHhhN2FhMDAzZSwgMHg5N2E1MDAzZSwgMHgyY2EzMDVkZCwgMHgzOGEyODg3MCwKLTB4MmM0MjAwMDEsIDB4NjIxODI1LCAweDEwNjAwMDE1LCAweDIwMjEsCi0weDMyYzIwODAwLCAweDEwNDAwMDE1LCAweDI0MDIwODAwLCAweDk2NjMwMDE0LAotMHgxNDYyMDAxMiwgMHgzNDAyYWFhYSwgMHg5NjYzMDAwZSwgMHgxNDYyMDAwNywKLTB4MjgyMSwgMHg5NjYzMDAxMCwgMHgyNDAyMDMwMCwgMHgxNDYyMDAwNCwKLTB4YTAxMDIxLCAweDk2NjIwMDEyLCAweDJjNDUwMDAxLCAweGEwMTAyMSwKLTB4NTQ0MDAwMDYsIDB4MjQwNDAwMTYsIDB4MTAwMDAwMDQsIDB4MCwKLTB4MjQwMjA4MDAsIDB4NTBhMjAwMDEsIDB4MjQwNDAwMGUsIDB4MTA4MDAwYjksCi0weDI2NDkwMjEsIDB4OTI0MjAwMDAsIDB4MzA0MjAwMGYsIDB4MjgwODAsCi0weDMyYzIwMTAwLCAweDEwNDAwMDIwLCAweDI1MDE4MjEsIDB4M2MwMjAwMjAsCi0weDQzMTAyYiwgMHgxNDQwMDAwZSwgMHgyNDAyMDIxLCAweDI4MjEsCi0weDk0ODIwMDAwLCAweDI0ODQwMDAyLCAweGEyMjgyMSwgMHg4MzEwMmIsCi0weDE0NDBmZmZiLCAweDMwYTJmZmZmLCAweDUxYzAyLCAweDYyMjgyMSwKLTB4NTFjMDIsIDB4MzBhMmZmZmYsIDB4MTAwMDAwMDksIDB4NjIyODIxLAotMHg4ZjQ3MDE0OCwgMHg4ZjQyMDExMCwgMHgxMDI4NDIsIDB4M2MwNjAwMjAsCi0weDQwZjgwOSwgMHhhZmE4MDA0MCwgMHgzMDQ1ZmZmZiwgMHg4ZmE4MDA0MCwKLTB4NTBhMDAwMDEsIDB4MzQwNWZmZmYsIDB4OGZhYTAwMmMsIDB4MzU0YTAwMDIsCi0weDEwMDAwMDAyLCAweGFmYWEwMDJjLCAweDI4MjEsIDB4MzJjMjAwODAsCi0weDEwNDAwMDkwLCAweGE2YTUwMDEwLCAweDI2NDMwMDA5LCAweDNjMDIwMDFmLAotMHgzNDQyZmZmZiwgMHg0MzEwMmIsIDB4MTA0MDAwMDMsIDB4MCwKLTB4OGY0MjAxNDgsIDB4NjIxODIzLCAweDkwNjYwMDAwLCAweDMwYzIwMGZmLAotMHgzODQzMDAwNiwgMHgyYzYzMDAwMSwgMHgzODQyMDAxMSwgMHgyYzQyMDAwMSwKLTB4NjIxODI1LCAweDEwNjAwMDdmLCAweDI0MDIwODAwLCAweDg4MjEsCi0weDk3YTMwMDNlLCAweDE0NjIwMDBmLCAweDI2MDIwMjEsIDB4OTY3MTAwMDAsCi0weDk2NjIwMDAyLCAweDk2NjMwMDA0LCAweDk2NjQwMDA2LCAweDIyMjg4MjEsCi0weDIyMzg4MjEsIDB4MjI0ODgyMSwgMHg5NjYyMDAwOCwgMHg5NjYzMDAwYSwKLTB4OTY2NDAwMGMsIDB4MjIyODgyMSwgMHgyMjM4ODIxLCAweDEwMDAwMDA3LAotMHgyMjQ4ODIxLCAweDk0ODIwMDAwLCAweDI0ODQwMDAyLCAweDIyMjg4MjEsCi0weDkyMTAyYiwgMHgxNDQwZmZmYiwgMHgwLCAweDExMWMwMiwKLTB4MzIyMmZmZmYsIDB4NjI4ODIxLCAweDExMWMwMiwgMHgzMjIyZmZmZiwKLTB4NjI4ODIxLCAweDMyYzIwMjAwLCAweDEwNDAwMDAzLCAweDI2NDQwMDA2LAotMHgxMDAwMDAzZSwgMHg4MDIxLCAweDNjMDUwMDFmLCAweDM0YTVmZmZmLAotMHhhNDEwMmIsIDB4MTA0MDAwMDMsIDB4MCwgMHg4ZjQyMDE0OCwKLTB4ODIyMDIzLCAweDk0ODIwMDAwLCAweDMwNDIxZmZmLCAweDEwNDAwMDA0LAotMHgyNjQ0MDAwYywgMHg5NjQyMDAwMiwgMHgxMDAwMDAzMCwgMHg1MDgwMjMsCi0weDk2NDIwMDAyLCAweDI2NDMwMDE0LCAweDUwODAyMywgMHgzYzAyMDAyMCwKLTB4NDMxMDJiLCAweDE0NDAwMDBhLCAweGQwODAyMSwgMHg5NjQyMDAwYywKLTB4MjAyODAyMSwgMHg5NjQyMDAwZSwgMHg5NjQzMDAxMCwgMHg5NjQ0MDAxMiwKLTB4MjAyODAyMSwgMHgyMDM4MDIxLCAweDEwMDAwMDIwLCAweDIwNDgwMjEsCi0weGE0MTAyYiwgMHgxMDQwMDAwMywgMHgwLCAweDhmNDIwMTQ4LAotMHg4MjIwMjMsIDB4OTQ4MjAwMDAsIDB4MjQ4NDAwMDIsIDB4MjAyODAyMSwKLTB4YTQxMDJiLCAweDEwNDAwMDAzLCAweDAsIDB4OGY0MjAxNDgsCi0weDgyMjAyMywgMHg5NDgyMDAwMCwgMHgyNDg0MDAwMiwgMHgyMDI4MDIxLAotMHhhNDEwMmIsIDB4MTA0MDAwMDMsIDB4MCwgMHg4ZjQyMDE0OCwKLTB4ODIyMDIzLCAweDk0ODIwMDAwLCAweDI0ODQwMDAyLCAweDIwMjgwMjEsCi0weGE0MTAyYiwgMHgxMDQwMDAwMywgMHgwLCAweDhmNDIwMTQ4LAotMHg4MjIwMjMsIDB4OTQ4MjAwMDAsIDB4MjAyODAyMSwgMHgzYzAyMDEwMCwKLTB4MmMyMTAyNCwgMHgxMDQwMDAwZSwgMHgwLCAweDhmYWEwMDJjLAotMHgzMTQyMDAwNCwgMHgxMDQwMDAwYSwgMHgwLCAweDk1MDQwMDBlLAotMHgyNjQyMDIxLCAweGMwMDNlZWMsIDB4MjQ4NGZmZmMsIDB4MzA0MmZmZmYsCi0weDIyMjg4MjEsIDB4MTExYzAyLCAweDMyMjJmZmZmLCAweDYyODgyMSwKLTB4OGZhYTAwMjQsIDB4MTUxODgyMywgMHgxMTE0MDIsIDB4MjIyODgyMSwKLTB4MjMwODgyMSwgMHgxMTE0MDIsIDB4MjIyODgyMSwgMHgzMjMxZmZmZiwKLTB4NTIyMDAwMDEsIDB4MzQxMWZmZmYsIDB4OGZhYTAwMmMsIDB4MzU0YTAwMDEsCi0weGFmYWEwMDJjLCAweGE2YjEwMDEyLCAweDk3YWEwMDJlLCAweGE2YWEwMDBlLAotMHg4ZmFhMDAyYywgMHgzMTQyMDAwNCwgMHgxMDQwMDAwMiwgMHgyNDA5MTAwMCwKLTB4MzQwOTgwMDAsIDB4OGY0ODAwNDQsIDB4OGY0NDAxYTAsIDB4OGY0NTAxYTQsCi0weGFmYTkwMDEwLCAweDhmNDkwMDQ0LCAweDg0MTQwLCAweDEwMDE4MjEsCi0weGFmYTkwMDE0LCAweDhmNDgwMDBjLCAweDJhMDMwMjEsIDB4MjQwNzAwMjAsCi0weGFmYTgwMDE4LCAweDhmNDgwMTBjLCAweDEwMjEsIDB4YTMyODIxLAotMHhhMzQ4MmIsIDB4ODIyMDIxLCAweDEwMGY4MDksIDB4ODkyMDIxLAotMHgxNDQwMDAwYiwgMHgwLCAweDhmODIwMTI4LCAweDNjMDQwMDAxLAotMHgyNDg0NjkxNCwgMHhhZmJlMDAxNCwgMHhhZmEyMDAxMCwgMHg4Zjg2MDEyNCwKLTB4OGY4NzAxMjAsIDB4M2MwNTAwMDcsIDB4YzAwMmIzYiwgMHgzNGE1OTkyMCwKLTB4OGY0MjAzNjgsIDB4MjQ0MmZmZmYsIDB4YWY0MjAzNjgsIDB4OGY0MjAwNDQsCi0weDhmNDMwMDg4LCAweDI0NDIwMDAxLCAweDQzMTAyNCwgMHhhZjQyMDA0NCwKLTB4OGZhYTAwMzQsIDB4OGY0NDAzNjgsIDB4MjQwMjAwMDEsIDB4MTU0MjAwMDYsCi0weDI0MDIwMDAyLCAweDhmNDIwMzVjLCAweDI0NDJmZmZmLCAweGFmNDIwMzVjLAotMHgxMDAwMDA0OSwgMHg4ZjQyMDM1YywgMHgxNTQyMDAwNiwgMHgwLAotMHg4ZjQyMDM2NCwgMHgyNDQyZmZmZiwgMHhhZjQyMDM2NCwgMHgxMDAwMDA0MiwKLTB4OGY0MjAzNjQsIDB4OGY0MjAzNjAsIDB4MjQ0MmZmZmYsIDB4YWY0MjAzNjAsCi0weDEwMDAwMDNkLCAweDhmNDIwMzYwLCAweDMwNjIxMDAwLCAweDEwNDAwMDA1LAotMHgzMDYyODAwMCwgMHg4ZjQyMDA3OCwgMHgyNDQyMDAwMSwgMHgxMDAwMDAzNiwKLTB4YWY0MjAwNzgsIDB4MTA0MDAwMzQsIDB4MCwgMHg4ZjQyMDA3OCwKLTB4MjQ0MjAwMDEsIDB4YWY0MjAwNzgsIDB4OGMwMzAyNDAsIDB4NDMxMDJiLAotMHgxNDQwMDAyZCwgMHgyNDA3MDAwOCwgMHg4ZjQ0MDE2OCwgMHg4ZjQ1MDE2YywKLTB4OGY0MzAwNDQsIDB4OGY0ODAwMGMsIDB4OGY4NjAxMjAsIDB4MjQwMjAwNDAsCi0weGFmYTIwMDEwLCAweGFmYTMwMDE0LCAweGFmYTgwMDE4LCAweDhmNDIwMTBjLAotMHg0MGY4MDksIDB4MjRjNjAwMWMsIDB4MTQ0MDAwMTEsIDB4MjQwMjAwMDEsCi0weDNjMDEwMDAxLCAweDM3MDgyMSwgMHhhMDIyNDBmMiwgMHg4ZjgyMDEyNCwKLTB4YWZhMjAwMTAsIDB4OGY4MjAxMjgsIDB4M2MwNDAwMDEsIDB4MjQ4NDY4OGMsCi0weGFmYTIwMDE0LCAweDhmNDYwMDQ0LCAweDhmODcwMTIwLCAweDNjMDUwMDA5LAotMHhjMDAyYjNiLCAweDM0YTUxMzAwLCAweDEwMDAwMDBiLCAweDAsCi0weDhmNDIwMzA0LCAweDI0NDIwMDAxLCAweGFmNDIwMzA0LCAweDhmNDIwMzA0LAotMHg4ZjQyMDA0NCwgMHhhZjQyMDA3YywgMHgzYzAxMDAwMSwgMHgzNzA4MjEsCi0weGEwMjA0MGYyLCAweGFmNDAwMDc4LCAweDhmNDIwMzE4LCAweDI0NDIwMDAxLAotMHhhZjQyMDMxOCwgMHg4ZjQyMDMxOCwgMHg4ZmJmMDA2MCwgMHg4ZmJlMDA1YywKLTB4OGZiNTAwNTgsIDB4OGZiMzAwNTQsIDB4OGZiMjAwNTAsIDB4OGZiMTAwNGMsCi0weDhmYjAwMDQ4LCAweDNlMDAwMDgsIDB4MjdiZDAwNjgsIDB4M2UwMDAwOCwKLTB4MCwgMHgwLCAweDAsIDB4OGY0MjAxM2MsCi0weGFmODIwMGMwLCAweDhmNDIwMTNjLCAweGFmODIwMGM0LCAweDhmNDIwMTNjLAotMHhhZjgyMDBjOCwgMHg4ZjQyMDEzOCwgMHhhZjgyMDBkMCwgMHg4ZjQyMDEzOCwKLTB4YWY4MjAwZDQsIDB4OGY0MjAxMzgsIDB4M2UwMDAwOCwgMHhhZjgyMDBkOCwKLTB4MjdiZGZmZTAsIDB4Mjc4NDAyMDgsIDB4MjQwNTAyMDAsIDB4YWZiZjAwMTgsCi0weGMwMDJiYmYsIDB4MjQwNjAwMDgsIDB4OGMwMjAyMDQsIDB4YzAwNDAxMiwKLTB4YWY4MjAyMTAsIDB4M2MwMjAwMDEsIDB4OGM0MjZkOTQsIDB4MzA0MjAwMDIsCi0weDEwNDAwMDBlLCAweDIwMjEsIDB4OGMwNjAyNDgsIDB4MjQwMjAwMDIsCi0weDNjMDEwMDAxLCAweGFjMjI2ZDk4LCAweGMwMDUxMDQsIDB4MjQwNTAwMDIsCi0weDIwMjEsIDB4OGMwNjAyNDgsIDB4MjQwMjAwMDEsIDB4M2MwMTAwMDEsCi0weGFjMjI2ZDk4LCAweDEwMDAwMDExLCAweDI0MDUwMDAxLCAweDhjMDYwMjQ4LAotMHgyNDAyMDAwNCwgMHgzYzAxMDAwMSwgMHhhYzIyNmQ5OCwgMHhjMDA1MTA0LAotMHgyNDA1MDAwNCwgMHgzYzAyMDAwMSwgMHg4YzQyNmQ5NCwgMHgzMDQyMDAwMSwKLTB4MTA0MDAwMDgsIDB4MjQwMjAwMDEsIDB4M2MwMTAwMDEsIDB4YWMyMjZkOTgsCi0weDIwMjEsIDB4MjQwNTAwMDEsIDB4M2MwNjYwMWIsIDB4YzAwNTEwNCwKLTB4MCwgMHgzYzA0MDAwMSwgMHgyNDg0NjlkMCwgMHg4ZjQyMDE1MCwKLTB4OGY0MzAxNTQsIDB4M2MwNTAwMDgsIDB4OGY0NjAxNTgsIDB4MjE2NDAsCi0weDMxOTQwLCAweDM0NjMwNDAzLCAweDQzMTAyNSwgMHg2MzNjMCwKLTB4NDYxMDI1LCAweGFmODIwMjFjLCAweGFmYTAwMDEwLCAweGFmYTAwMDE0LAotMHg4Zjg2MDIxYywgMHgzNGE1MDIwMCwgMHhjMDAyYjNiLCAweDM4MjEsCi0weDNjMDEwMDAxLCAweGFjMjA2ZDkwLCAweDNjMDEwMDAxLCAweGFjMjA2ZGE4LAotMHg4ZmJmMDAxOCwgMHgzZTAwMDA4LCAweDI3YmQwMDIwLCAweDI3YmRmZmUwLAotMHgzYzA1MDAwOCwgMHgzNGE1MDMwMCwgMHhhZmJmMDAxOCwgMHhhZmEwMDAxMCwKLTB4YWZhMDAwMTQsIDB4OGY4NjAyMDAsIDB4M2MwNDAwMDEsIDB4MjQ4NDY5ZGMsCi0weGMwMDJiM2IsIDB4MzgyMSwgMHg4ZjQyMDQxMCwgMHgyNDQyMDAwMSwKLTB4YWY0MjA0MTAsIDB4OGY0MjA0MTAsIDB4OGZiZjAwMTgsIDB4M2UwMDAwOCwKLTB4MjdiZDAwMjAsIDB4MjdiZGZmZDgsIDB4YWZiZjAwMjAsIDB4YWZiMTAwMWMsCi0weGFmYjAwMDE4LCAweDhmNDIwM2E0LCAweDI0NDIwMDAxLCAweGFmNDIwM2E0LAotMHg4ZjQyMDNhNCwgMHg4ZjkwMDIyMCwgMHg4ZjgyMDBlMCwgMHhhZmEyMDAxMCwKLTB4OGY4MjAwZTQsIDB4YWZhMjAwMTQsIDB4OGY4NjAwYzQsIDB4OGY4NzAwYzgsCi0weDNjMDQwMDAxLCAweDI0ODQ2OWU4LCAweGMwMDJiM2IsIDB4MjAwMjgyMSwKLTB4M2MwNDQwMDAsIDB4MjA0MTAyNCwgMHg1MDQwMDBiNCwgMHgzYzA0MDEwMCwKLTB4OGY0MjAzYmMsIDB4MjQ0MjAwMDEsIDB4YWY0MjAzYmMsIDB4OGY0MjAzYmMsCi0weDhmODcwMGM0LCAweDhmODMwMGM4LCAweDhmNDIwMTQ4LCAweDY3MTgyMywKLTB4NDMxMDJiLCAweDEwNDAwMDAzLCAweDAsIDB4OGY0MjAxNDgsCi0weDYyMTgyMSwgMHgxMDYwMDAwNSwgMHgwLCAweDhmNDIwMTRjLAotMHg0MzEwMmIsIDB4MTA0MDAwMGIsIDB4MCwgMHg4ZjgyMDBlMCwKLTB4OGY0MzAxMjQsIDB4YWY0MjAxMWMsIDB4YWY0MzAxMTQsIDB4OGY4MjAyMjAsCi0weDNjMDMwOGZmLCAweDM0NjNmZmZiLCAweDQzMTAyNCwgMHgxMDAwMDBjZSwKLTB4NDQxMDI1LCAweDhmODIwMjIwLCAweDNjMDMwOGZmLCAweDM0NjNmZmZmLAotMHg0MzEwMjQsIDB4MzQ0MjAwMDQsIDB4YWY4MjAyMjAsIDB4OGY4MjAwZTAsCi0weDhmNDMwMTI0LCAweGFmNDIwMTFjLCAweGFmNDMwMTE0LCAweDhmODYwMGM4LAotMHg4Zjg0MDEyMCwgMHg4ZjgzMDEyNCwgMHgxMDAwMDAwNSwgMHgyODIxLAotMHgxNDYyMDAwMiwgMHgyNDYyMDAyMCwgMHgyNzYyNDgwMCwgMHg0MDE4MjEsCi0weDEwNjQwMDBjLCAweDMwYTIwMGZmLCAweDhjNjIwMDE4LCAweDMwNDIwMDAzLAotMHgxMDQwZmZmNywgMHgyNzYyNGZlMCwgMHg4ZjQyMDNkMCwgMHgyNDA1MDAwMSwKLTB4MjQ0MjAwMDEsIDB4YWY0MjAzZDAsIDB4OGY0MjAzZDAsIDB4OGM2NjAwMDgsCi0weDMwYTIwMGZmLCAweDE0NDAwMDU4LCAweDAsIDB4OTM0MjA1YzQsCi0weDE0NDAwMDU1LCAweDAsIDB4OGY4NzAwYzQsIDB4OGY4ODAwZTAsCi0weDhmODQwMGU0LCAweDI0MDJmZmY4LCAweDEwMjQwMjQsIDB4MTA0MTAyMywKLTB4MjE4YzMsIDB4NDYyMDAwMSwgMHgyNDYzMDIwMCwgMHgxMDYwMDAwNSwKLTB4MjQwMjAwMDEsIDB4MTA2MjAwMDksIDB4MCwgMHgxMDAwMDAxZiwKLTB4MCwgMHg4ZjQyMDNjMCwgMHhlMDMwMjEsIDB4MjQ0MjAwMDEsCi0weGFmNDIwM2MwLCAweDEwMDAwMDQwLCAweDhmNDIwM2MwLCAweDhmNDIwM2M0LAotMHgyNDQyMDAwMSwgMHhhZjQyMDNjNCwgMHg4Yzg2MDAwMCwgMHg4ZjQyMDE0OCwKLTB4OGY0MzAzYzQsIDB4ZTYxODIzLCAweDQzMTAyYiwgMHgxMDQwMDAwNCwKLTB4MmM2MjIzM2YsIDB4OGY0MjAxNDgsIDB4NjIxODIxLCAweDJjNjIyMzNmLAotMHgxNDQwMDAzMSwgMHgwLCAweDhmNDIwMjBjLCAweDI0NDIwMDAxLAotMHhhZjQyMDIwYywgMHg4ZjQyMDIwYywgMHhlMDMwMjEsIDB4MjQ4MjAwMDgsCi0weGFmODIwMGU0LCAweDEwMDAwMDI4LCAweGFmODIwMGU4LCAweDhmNDIwM2M4LAotMHgyNDQyMDAwMSwgMHhhZjQyMDNjOCwgMHg4ZjQyMDNjOCwgMHg4Yzg1MDAwMCwKLTB4OGY0MjAxNDgsIDB4YTcxODIzLCAweDQzMTAyYiwgMHgxMDQwMDAwMywKLTB4MCwgMHg4ZjQyMDE0OCwgMHg2MjE4MjEsIDB4OGY0MjAxNGMsCi0weDQzMTAyYiwgMHg1NDQwMDAwYSwgMHhhMDMwMjEsIDB4OGY0MjAyMGMsCi0weDI0NDIwMDAxLCAweGFmNDIwMjBjLCAweDhmNDIwMjBjLCAweDI0ODIwMDA4LAotMHhhZjgyMDBlNCwgMHg4Zjg0MDBlNCwgMHgxNDg4ZmZlYywgMHhhZjg0MDBlOCwKLTB4MTQ4ODAwMGQsIDB4Mjc2MjMwMDAsIDB4MTQ4MjAwMDIsIDB4MjQ4MmZmZjgsCi0weDI3NjIzZmY4LCAweDk0NDMwMDA2LCAweDNjMDIwMDFmLCAweDM0NDJmZmZmLAotMHhjMzMwMjEsIDB4NDYxMDJiLCAweDEwNDAwMDAzLCAweDAsCi0weDhmNDIwMTQ4LCAweGMyMzAyMywgMHhhZjg2MDBjOCwgMHg4ZjgzMDBjNCwKLTB4OGY0MjAxNDgsIDB4YzMxODIzLCAweDQzMTAyYiwgMHgxMDQwMDAwMywKLTB4MCwgMHg4ZjQyMDE0OCwgMHg2MjE4MjEsIDB4MTA2MDAwMDUsCi0weDAsIDB4OGY0MjAxNGMsIDB4NDMxMDJiLCAweDUwNDAwMDA4LAotMHgzYzAyZmRmZiwgMHg4ZjgyMDIyMCwgMHgzYzAzMDhmZiwgMHgzNDYzZmZmYiwKLTB4NDMxMDI0LCAweDNjMDM0MDAwLCAweDEwMDAwMDNmLCAweDQzMTAyNSwKLTB4OGY0MzAzY2MsIDB4MzQ0MmZmZmYsIDB4MjgyYTAyNCwgMHgyNDYzMDAwMSwKLTB4YWY0MzAzY2MsIDB4MTAwMDAwMzksIDB4OGY0MjAzY2MsIDB4MjA0MTAyNCwKLTB4MTA0MDAwMGUsIDB4M2MxMTAyMDAsIDB4OGY0MjAzYTgsIDB4MjQ0MjAwMDEsCi0weGFmNDIwM2E4LCAweDhmNDIwM2E4LCAweDhmODIwMjIwLCAweDNjMDMwOGZmLAotMHgzNDYzZmZmZiwgMHg0MzEwMjQsIDB4NDQxMDI1LCAweGMwMDNkYWYsCi0weGFmODIwMjIwLCAweDEwMDAwMDI5LCAweDAsIDB4MjExMTAyNCwKLTB4NTA0MDAwMDgsIDB4M2MxMTA0MDAsIDB4OGY0MjAzYWMsIDB4MjQ0MjAwMDEsCi0weGFmNDIwM2FjLCAweGMwMDNkYWYsIDB4OGY0MjAzYWMsIDB4MTAwMDAwMTksCi0weDAsIDB4MjExMTAyNCwgMHgxMDQwMDAxYywgMHgwLAotMHg4ZjgzMDIyNCwgMHgyNDAyMTQwMiwgMHgxNDYyMDAwOSwgMHgzYzA1MDAwOCwKLTB4M2MwNDAwMDEsIDB4MjQ4NDY5ZjQsIDB4YWZhMDAwMTAsIDB4YWZhMDAwMTQsCi0weDhmODYwMjI0LCAweDM0YTUwNTAwLCAweGMwMDJiM2IsIDB4MzgyMSwKLTB4OGY0MjAzYjAsIDB4MjQ0MjAwMDEsIDB4YWY0MjAzYjAsIDB4OGY0MjAzYjAsCi0weDhmODIwMjIwLCAweDIwMDIwMjEsIDB4MzQ0MjAwMDIsIDB4YzAwNGU5YywKLTB4YWY4MjAyMjAsIDB4OGY4MjAyMjAsIDB4M2MwMzA4ZmYsIDB4MzQ2M2ZmZmYsCi0weDQzMTAyNCwgMHg1MTEwMjUsIDB4YWY4MjAyMjAsIDB4OGZiZjAwMjAsCi0weDhmYjEwMDFjLCAweDhmYjAwMDE4LCAweDNlMDAwMDgsIDB4MjdiZDAwMjgsCi0weDNlMDAwMDgsIDB4MCwgMHgzYzAyMDAwMSwgMHg4YzQyNmRhOCwKLTB4MjdiZGZmYjAsIDB4YWZiZjAwNDgsIDB4YWZiZTAwNDQsIDB4YWZiNTAwNDAsCi0weGFmYjMwMDNjLCAweGFmYjIwMDM4LCAweGFmYjEwMDM0LCAweDEwNDAwMDBmLAotMHhhZmIwMDAzMCwgMHgzYzA0MDAwMSwgMHgyNDg0NmEwMCwgMHgzYzA1MDAwOCwKLTB4YWZhMDAwMTAsIDB4YWZhMDAwMTQsIDB4OGY4NjAyMjAsIDB4MzRhNTA2MDAsCi0weDI0MDIwMDAxLCAweDNjMDEwMDAxLCAweGFjMjA2ZGE4LCAweDNjMDEwMDAxLAotMHhhYzIyNmQ5YywgMHhjMDAyYjNiLCAweDM4MjEsIDB4M2MwMzdmZmYsCi0weDhjMDIwMjY4LCAweDM0NjNmZmZmLCAweDNjMDRmZGZmLCAweDQzMTAyNCwKLTB4YWMwMjAyNjgsIDB4OGY0MjAwMDQsIDB4MzQ4NGZmZmYsIDB4MzA0MjAwMDIsCi0weDEwNDAwMDkyLCAweDI4NGEwMjQsIDB4M2MwNDA2MDAsIDB4MzQ4NDIwMDAsCi0weDhmNDIwMDA0LCAweDI4MjEsIDB4MjQwM2ZmZmQsIDB4NDMxMDI0LAotMHhhZjQyMDAwNCwgMHhhZmE0MDAyMCwgMHg4ZjVlMDAxOCwgMHgyN2FhMDAyMCwKLTB4MjQwMjAwZmYsIDB4MTNjMjAwMDIsIDB4YWZhYTAwMmMsIDB4MjdjNTAwMDEsCi0weDhjMDIwMjI4LCAweGEwOTAyMSwgMHgxNjQyMDAwZSwgMHgxZTM4YzAsCi0weDhmNDIwMzNjLCAweDI0NDIwMDAxLCAweGFmNDIwMzNjLCAweDhmNDIwMzNjLAotMHg4YzAyMDIyOCwgMHgzYzA0MDAwMSwgMHgyNDg0Njk5OCwgMHgzYzA1MDAwOSwKLTB4YWZhMDAwMTQsIDB4YWZhMjAwMTAsIDB4OGZhNjAwMjAsIDB4MTAwMDAwNmQsCi0weDM0YTUwNTAwLCAweGY3MTAyMSwgMHg4ZmEzMDAyMCwgMHg4ZmE0MDAyNCwKLTB4YWM0MzA0YzAsIDB4YWM0NDA0YzQsIDB4OGY4MzAwNTQsIDB4OGY4MjAwNTQsCi0weDI0NzAwM2U4LCAweDIwMjEwMjMsIDB4MmM0MjAzZTksIDB4MTA0MDAwMWIsCi0weDk4MjEsIDB4ZTA4ODIxLCAweDI2MzUwNGMwLCAweDhmNDQwMTc4LAotMHg4ZjQ1MDE3YywgMHgyMjAxODIxLCAweDI0MGEwMDA0LCAweGFmYWEwMDEwLAotMHhhZmIyMDAxNCwgMHg4ZjQ4MDAwYywgMHgxMDIxLCAweDJmNTMwMjEsCi0weGFmYTgwMDE4LCAweDhmNDgwMTBjLCAweDI0MDcwMDA4LCAweGEzMjgyMSwKLTB4YTM0ODJiLCAweDgyMjAyMSwgMHgxMDBmODA5LCAweDg5MjAyMSwKLTB4NTQ0MDAwMDYsIDB4MjQxMzAwMDEsIDB4OGY4MjAwNTQsIDB4MjAyMTAyMywKLTB4MmM0MjAzZTksIDB4MTQ0MGZmZTksIDB4MCwgMHgzMjYyMDBmZiwKLTB4NTQ0MDAwMTcsIDB4YWY1MjAwMTgsIDB4OGY0MjAzNzgsIDB4MjQ0MjAwMDEsCi0weGFmNDIwMzc4LCAweDhmNDIwMzc4LCAweDhmODIwMTIwLCAweDhmYWEwMDJjLAotMHhhZmEyMDAxMCwgMHg4ZjgyMDEyNCwgMHgzYzA0MDAwMSwgMHgyNDg0NjlhNCwKLTB4M2MwNTAwMDksIDB4YWZhMjAwMTQsIDB4OGQ0NjAwMDAsIDB4MTAwMDAwMzUsCi0weDM0YTUwNjAwLCAweDhmNDIwMzA4LCAweDI0MTMwMDAxLCAweDI0NDIwMDAxLAotMHhhZjQyMDMwOCwgMHg4ZjQyMDMwOCwgMHgxMDAwMDAxZSwgMHgzMjYyMDBmZiwKLTB4OGY4MzAwNTQsIDB4OGY4MjAwNTQsIDB4MjQ3MDAzZTgsIDB4MjAyMTAyMywKLTB4MmM0MjAzZTksIDB4MTA0MDAwMTYsIDB4OTgyMSwgMHgzYzE1MDAyMCwKLTB4MjQxMTAwMTAsIDB4OGY0MjAwMGMsIDB4OGY0NDAxNjAsIDB4OGY0NTAxNjQsCi0weDhmODYwMTIwLCAweGFmYjEwMDEwLCAweGFmYjIwMDE0LCAweDU1MTAyNSwKLTB4YWZhMjAwMTgsIDB4OGY0MjAxMGMsIDB4MjQwNzAwMDgsIDB4NDBmODA5LAotMHgyNGM2MDAxYywgMHgxNDQwZmZlMywgMHgwLCAweDhmODIwMDU0LAotMHgyMDIxMDIzLCAweDJjNDIwM2U5LCAweDE0NDBmZmVlLCAweDAsCi0weDMyNjIwMGZmLCAweDE0NDAwMDExLCAweDAsIDB4OGY0MjAzNzgsCi0weDI0NDIwMDAxLCAweGFmNDIwMzc4LCAweDhmNDIwMzc4LCAweDhmODIwMTIwLAotMHg4ZmFhMDAyYywgMHhhZmEyMDAxMCwgMHg4ZjgyMDEyNCwgMHgzYzA0MDAwMSwKLTB4MjQ4NDY5YWMsIDB4M2MwNTAwMDksIDB4YWZhMjAwMTQsIDB4OGQ0NjAwMDAsCi0weDM0YTUwNzAwLCAweGMwMDJiM2IsIDB4M2MwMzgyMSwgMHg4ZjQyMDJlYywKLTB4MjQ0MjAwMDEsIDB4YWY0MjAyZWMsIDB4OGY0MjAyZWMsIDB4OGZiZjAwNDgsCi0weDhmYmUwMDQ0LCAweDhmYjUwMDQwLCAweDhmYjMwMDNjLCAweDhmYjIwMDM4LAotMHg4ZmIxMDAzNCwgMHg4ZmIwMDAzMCwgMHgzZTAwMDA4LCAweDI3YmQwMDUwLAotMHgzYzAyMDAwMSwgMHg4YzQyNmRhOCwgMHgyN2JkZmZlMCwgMHgxNDQwMDAwZCwKLTB4YWZiZjAwMTgsIDB4M2MwNDAwMDEsIDB4MjQ4NDZhMGMsIDB4M2MwNTAwMDgsCi0weGFmYTAwMDEwLCAweGFmYTAwMDE0LCAweDhmODYwMjIwLCAweDM0YTUwNzAwLAotMHgyNDAyMDAwMSwgMHgzYzAxMDAwMSwgMHhhYzIyNmRhOCwgMHhjMDAyYjNiLAotMHgzODIxLCAweDNjMDIwMDA0LCAweDJjMjEwMjQsIDB4MTA0MDAwMDcsCi0weDAsIDB4OGY4MjAyMjAsIDB4M2MwMzA4ZmYsIDB4MzQ2M2ZmZmYsCi0weDQzMTAyNCwgMHgzNDQyMDAwOCwgMHhhZjgyMDIyMCwgMHgzYzA1MDAwMSwKLTB4OGNhNTZkOTgsIDB4MjQwMjAwMDEsIDB4MTRhMjAwMDcsIDB4MjAyMSwKLTB4YzAwNTI5YiwgMHgyNDA1MDAwMSwgMHhhYzAyMDI2YywgMHg4YzAzMDI2YywKLTB4MTAwMDAwMDYsIDB4M2MwMjAwMDcsIDB4YzAwNTI5YiwgMHgyMDIxLAotMHhhYzAyMDI2OCwgMHg4YzAzMDI2OCwgMHgzYzAyMDAwNywgMHg2MjE4MjQsCi0weDNjMDIwMDAyLCAweDUwNjIwMDBkLCAweDNjMDIwNWY1LCAweDQzMTAyYiwKLTB4MTQ0MDAwMDYsIDB4M2MwMjAwMDQsIDB4M2MwMjAwMDEsIDB4MTA2MjAwMDksCi0weDNjMDIwMDk4LCAweDEwMDAwMDBiLCAweDAsIDB4MTQ2MjAwMDksCi0weDNjMDIzYjlhLCAweDEwMDAwMDA0LCAweDM0NDJjYTAwLCAweDEwMDAwMDAyLAotMHgzNDQyZTEwMCwgMHgzNDQyOTY4MCwgMHhhZjQyMDFmYywgMHg4ZjQyMDFmYywKLTB4YWVlMjAwNjQsIDB4OGZiZjAwMTgsIDB4M2UwMDAwOCwgMHgyN2JkMDAyMCwKLTB4MCwgMHgwLCAweDAsIDB4ODYxMDJiLAotMHg1MDQwMDAwMSwgMHg4NzIwMjMsIDB4YzQxMDIzLCAweDI0ODQzLAotMHgxMjUxMDJiLCAweDEwNDAwMDFiLCAweDkxMDQwLCAweDgyNDAyMSwKLTB4ODgxMDJiLCAweDEwNDAwMDA3LCAweDE4MjEsIDB4OTQ4MjAwMDAsCi0weDI0ODQwMDAyLCAweDYyMTgyMSwgMHg4ODEwMmIsIDB4MTQ0MGZmZmIsCi0weDAsIDB4NjAyMDIxLCAweGM3MzAyMywgMHhhOTEwMjMsCi0weDIxMDQwLCAweGMyMjgyMSwgMHhjNTEwMmIsIDB4MTA0MDAwMDcsCi0weDE4MjEsIDB4OTRjMjAwMDAsIDB4MjRjNjAwMDIsIDB4NjIxODIxLAotMHhjNTEwMmIsIDB4MTQ0MGZmZmIsIDB4MCwgMHgxMDAwMDAwZCwKLTB4ODMyMDIxLCAweDUxMDQwLCAweDgyMjgyMSwgMHg4NTEwMmIsCi0weDEwNDAwMDA3LCAweDE4MjEsIDB4OTQ4MjAwMDAsIDB4MjQ4NDAwMDIsCi0weDYyMTgyMSwgMHg4NTEwMmIsIDB4MTQ0MGZmZmIsIDB4MCwKLTB4NjAyMDIxLCAweDQxYzAyLCAweDMwODJmZmZmLCAweDYyMjAyMSwKLTB4NDFjMDIsIDB4MzA4MmZmZmYsIDB4NjIyMDIxLCAweDNlMDAwMDgsCi0weDMwODJmZmZmLCAweDNlMDAwMDgsIDB4MCwgMHg4MDI4MjEsCi0weDMwYTIwMDAxLCAweDEwNDAwMDJiLCAweDNjMDMwMDFmLCAweDM0NjNmZmZmLAotMHgyNGEyMDAwNCwgMHg2MjEwMmIsIDB4NTQ0MDAwMDcsIDB4NjUxMDJiLAotMHg5MGEyMDAwMSwgMHg5MGE0MDAwMywgMHg5MGEzMDAwMCwgMHg5MGE1MDAwMiwKLTB4MTAwMDAwMmEsIDB4NDQxMDIxLCAweDEwNDAwMDAzLCAweDAsCi0weDhmNDIwMTQ4LCAweGEyMjgyMywgMHg5MGE0MDAwMCwgMHgyNGE1MDAwMSwKLTB4NjUxMDJiLCAweDEwNDAwMDAzLCAweDAsIDB4OGY0MjAxNDgsCi0weGEyMjgyMywgMHg5MGEyMDAwMCwgMHgyNGE1MDAwMSwgMHgyMTIwMCwKLTB4ODIyMDIxLCAweDY1MTAyYiwgMHgxMDQwMDAwMywgMHgwLAotMHg4ZjQyMDE0OCwgMHhhMjI4MjMsIDB4OTBhMjAwMDAsIDB4MjRhNTAwMDEsCi0weDgyMjAyMSwgMHg2NTEwMmIsIDB4MTA0MDAwMDMsIDB4MCwKLTB4OGY0MjAxNDgsIDB4YTIyODIzLCAweDkwYTIwMDAwLCAweDEwMDAwMDJkLAotMHgyMTIwMCwgMHgzNDYzZmZmZiwgMHgyNGEyMDAwNCwgMHg2MjEwMmIsCi0weDU0NDAwMDBhLCAweDY1MTAyYiwgMHg5MGEyMDAwMCwgMHg5MGE0MDAwMiwKLTB4OTBhMzAwMDEsIDB4OTBhNTAwMDMsIDB4NDQxMDIxLCAweDIxMjAwLAotMHg2NTE4MjEsIDB4MTAwMDAwMjAsIDB4NDMyMDIxLCAweDEwNDAwMDAzLAotMHgwLCAweDhmNDIwMTQ4LCAweGEyMjgyMywgMHg5MGEyMDAwMCwKLTB4MjRhNTAwMDEsIDB4MjIyMDAsIDB4NjUxMDJiLCAweDEwNDAwMDAzLAotMHgwLCAweDhmNDIwMTQ4LCAweGEyMjgyMywgMHg5MGEyMDAwMCwKLTB4MjRhNTAwMDEsIDB4ODIyMDIxLCAweDY1MTAyYiwgMHgxMDQwMDAwMywKLTB4MCwgMHg4ZjQyMDE0OCwgMHhhMjI4MjMsIDB4OTBhMjAwMDAsCi0weDI0YTUwMDAxLCAweDIxMjAwLCAweDgyMjAyMSwgMHg2NTEwMmIsCi0weDEwNDAwMDAzLCAweDAsIDB4OGY0MjAxNDgsIDB4YTIyODIzLAotMHg5MGEyMDAwMCwgMHg4MjIwMjEsIDB4NDFjMDIsIDB4MzA4MmZmZmYsCi0weDYyMjAyMSwgMHg0MWMwMiwgMHgzMDgyZmZmZiwgMHg2MjIwMjEsCi0weDNlMDAwMDgsIDB4MzA4MmZmZmYsIDB4MCwgMHg4ZjgyMDIyMCwKLTB4MzQ0MjAwMDIsIDB4YWY4MjAyMjAsIDB4M2MwMjAwMDIsIDB4OGM0MjhmZjgsCi0weDMwNDI0MDAwLCAweDEwNDAwMDU0LCAweDI0MDQwMDAxLCAweDhmODIwMjAwLAotMHgyNDA2N2ZmZiwgMHg4ZjgzMDIwMCwgMHgzMDQ1MDAwMiwgMHgyNDAyZmZmZCwKLTB4NjIxODI0LCAweGFmODMwMjAwLCAweGFmODQwMjA0LCAweDhmODMwMDU0LAotMHg4ZjgyMDA1NCwgMHgxMDAwMDAwMiwgMHgyNDYzMDAwMSwgMHg4ZjgyMDA1NCwKLTB4NjIxMDIzLCAweDJjNDIwMDAyLCAweDE0NDBmZmZjLCAweDAsCi0weDhmODIwMjI0LCAweDE0NDQwMDRkLCAweDQyMDQwLCAweGM0MTAyYiwKLTB4MTA0MGZmZjEsIDB4MCwgMHg4ZjgyMDIwMCwgMHg0NTEwMjUsCi0weGFmODIwMjAwLCAweDhmODIwMjIwLCAweDM0NDI4MDAwLCAweGFmODIwMjIwLAotMHg4ZjgzMDA1NCwgMHg4ZjgyMDA1NCwgMHgxMDAwMDAwMiwgMHgyNDYzMDAwMSwKLTB4OGY4MjAwNTQsIDB4NjIxMDIzLCAweDJjNDIwMDAyLCAweDE0NDBmZmZjLAotMHgwLCAweDhmODIwMjIwLCAweDNjMDMwMDA0LCAweDQzMTAyNCwKLTB4MTQ0MDAwMGYsIDB4MCwgMHg4ZjgyMDIyMCwgMHgzYzAzZmZmZiwKLTB4MzQ2MzdmZmYsIDB4NDMxMDI0LCAweGFmODIwMjIwLCAweDhmODMwMDU0LAotMHg4ZjgyMDA1NCwgMHgxMDAwMDAwMiwgMHgyNDYzMDAwMSwgMHg4ZjgyMDA1NCwKLTB4NjIxMDIzLCAweDJjNDIwMDAyLCAweDE0NDBmZmZjLCAweDAsCi0weDhmODIwMjIwLCAweDNjMDMwMDA0LCAweDQzMTAyNCwgMHgxNDQwMDAwZCwKLTB4MCwgMHg4ZjgyMDIyMCwgMHgzNDQyODAwMCwgMHhhZjgyMDIyMCwKLTB4OGY4MzAwNTQsIDB4OGY4MjAwNTQsIDB4MTAwMDAwMDIsIDB4MjQ2MzAwMDEsCi0weDhmODIwMDU0LCAweDYyMTAyMywgMHgyYzQyMDAwMiwgMHgxNDQwZmZmYywKLTB4MCwgMHg4ZjgyMDIyMCwgMHgzYzAzMDAwNCwgMHg0MzEwMjQsCi0weDEwNDAwMDFiLCAweDEwMjEsIDB4OGY4MzAyMjAsIDB4MjQwMjAwMDEsCi0weDEwMDAwMDE1LCAweDNjMDRmNzAwLCAweDhmODIwMjIwLCAweDNjMDRmNzAwLAotMHg0NDEwMjUsIDB4YWY4MjAyMjAsIDB4OGY4MjAyMjAsIDB4MjQwM2ZmZmQsCi0weDQzMTAyNCwgMHhhZjgyMDIyMCwgMHg4ZjgyMDIyMCwgMHgzYzAzMDMwMCwKLTB4NDMxMDI0LCAweDE0NDAwMDAzLCAweDAsIDB4MTAwMDAwMDgsCi0weDEwMjEsIDB4OGY4MjAyMjAsIDB4MzQ0MjAwMDIsIDB4YWY4MjAyMjAsCi0weDhmODMwMjIwLCAweDI0MDIwMDAxLCAweDY0MTgyNSwgMHhhZjgzMDIyMCwKLTB4M2UwMDAwOCwgMHgwLCAweDIwMjEsIDB4M2MwNTAxMDAsCi0weDI0MDIwMDAxLCAweGFmODAwMjFjLCAweGFmODIwMjAwLCAweGFmODIwMjIwLAotMHgyNzYyNTAwMCwgMHhhZjgyMDBjMCwgMHgyNzYyNTAwMCwgMHhhZjgyMDBjNCwKLTB4Mjc2MjUwMDAsIDB4YWY4MjAwYzgsIDB4Mjc2MjUwMDAsIDB4YWY4MjAwZDAsCi0weDI3NjI1MDAwLCAweGFmODIwMGQ0LCAweDI3NjI1MDAwLCAweGFmODIwMGQ4LAotMHgyNzYyMzAwMCwgMHhhZjgyMDBlMCwgMHgyNzYyMzAwMCwgMHhhZjgyMDBlNCwKLTB4Mjc2MjMwMDAsIDB4YWY4MjAwZTgsIDB4Mjc2MjI4MDAsIDB4YWY4MjAwZjAsCi0weDI3NjIyODAwLCAweGFmODIwMGY0LCAweDI3NjIyODAwLCAweGFmODIwMGY4LAotMHg0MThjMCwgMHgyNDg0MDAwMSwgMHgzNjMxMDIxLCAweGFjNDUzMDA0LAotMHgzNjMxMDIxLCAweGFjNDAzMDAwLCAweDI4ODIwMjAwLCAweDE0NDBmZmY5LAotMHg0MThjMCwgMHgyMDIxLCAweDQxOGMwLCAweDI0ODQwMDAxLAotMHgzNjMxMDIxLCAweGFjNDAyODA0LCAweDM2MzEwMjEsIDB4YWM0MDI4MDAsCi0weDI4ODIwMTAwLCAweDE0NDBmZmY5LCAweDQxOGMwLCAweGFmODAwMjNjLAotMHgyNDAzMDA4MCwgMHgyNDA0MDEwMCwgMHhhYzYwMDAwMCwgMHgyNDYzMDAwNCwKLTB4NjQxMDJiLCAweDU0NDBmZmZkLCAweGFjNjAwMDAwLCAweDhmODMwMDQwLAotMHgzYzAyZjAwMCwgMHg2MjE4MjQsIDB4M2MwMjUwMDAsIDB4MTA2MjAwMGMsCi0weDQzMTAyYiwgMHgxNDQwMDAwNiwgMHgzYzAyNjAwMCwgMHgzYzAyNDAwMCwKLTB4MTA2MjAwMDgsIDB4MjQwMjA4MDAsIDB4MTAwMDAwMDgsIDB4MCwKLTB4MTA2MjAwMDQsIDB4MjQwMjA4MDAsIDB4MTAwMDAwMDQsIDB4MCwKLTB4MjQwMjA3MDAsIDB4M2MwMTAwMDEsIDB4YWMyMjZkYWMsIDB4M2UwMDAwOCwKLTB4MCwgMHgzYzAyMDAwMSwgMHg4YzQyNmRiYywgMHgyN2JkZmZkMCwKLTB4YWZiZjAwMmMsIDB4YWZiMjAwMjgsIDB4YWZiMTAwMjQsIDB4YWZiMDAwMjAsCi0weDNjMDEwMDAxLCAweDEwNDAwMDA1LCAweGFjMjA2ZDk0LCAweGMwMDRkOWUsCi0weDAsIDB4M2MwMTAwMDEsIDB4YWMyMDZkYmMsIDB4OGY4MzAwNTQsCi0weDhmODIwMDU0LCAweDEwMDAwMDAyLCAweDI0NjMwMDY0LCAweDhmODIwMDU0LAotMHg2MjEwMjMsIDB4MmM0MjAwNjUsIDB4MTQ0MGZmZmMsIDB4MCwKLTB4YzAwNGRiOSwgMHgwLCAweDI0MDQwMDAxLCAweDI4MjEsCi0weDI3YTYwMDE4LCAweDM0MDI4MDAwLCAweGMwMDQ1YmUsIDB4YTdhMjAwMTgsCi0weDhmODMwMDU0LCAweDhmODIwMDU0LCAweDEwMDAwMDAyLCAweDI0NjMwMDY0LAotMHg4ZjgyMDA1NCwgMHg2MjEwMjMsIDB4MmM0MjAwNjUsIDB4MTQ0MGZmZmMsCi0weDI0MDQwMDAxLCAweDI0MDUwMDAxLCAweGMwMDQ1N2MsIDB4MjdhNjAwMTgsCi0weDhmODMwMDU0LCAweDhmODIwMDU0LCAweDEwMDAwMDAyLCAweDI0NjMwMDY0LAotMHg4ZjgyMDA1NCwgMHg2MjEwMjMsIDB4MmM0MjAwNjUsIDB4MTQ0MGZmZmMsCi0weDI0MDQwMDAxLCAweDI0MDUwMDAxLCAweGMwMDQ1N2MsIDB4MjdhNjAwMTgsCi0weDhmODMwMDU0LCAweDhmODIwMDU0LCAweDEwMDAwMDAyLCAweDI0NjMwMDY0LAotMHg4ZjgyMDA1NCwgMHg2MjEwMjMsIDB4MmM0MjAwNjUsIDB4MTQ0MGZmZmMsCi0weDI0MDQwMDAxLCAweDNjMDYwMDAxLCAweDI0YzY2ZjI0LCAweGMwMDQ1N2MsCi0weDI0MDUwMDAyLCAweDhmODMwMDU0LCAweDhmODIwMDU0LCAweDEwMDAwMDAyLAotMHgyNDYzMDA2NCwgMHg4ZjgyMDA1NCwgMHg2MjEwMjMsIDB4MmM0MjAwNjUsCi0weDE0NDBmZmZjLCAweDI0MDQwMDAxLCAweDI0MDUwMDAzLCAweDNjMTAwMDAxLAotMHgyNjEwNmYyNiwgMHhjMDA0NTdjLCAweDIwMDMwMjEsIDB4OTdhNjAwMTgsCi0weDNjMDcwMDAxLCAweDk0ZTc2ZjI0LCAweDNjMDQwMDAxLCAweDI0ODQ2YWUwLAotMHhhZmEwMDAxNCwgMHg5NjAyMDAwMCwgMHgzYzA1MDAwZCwgMHgzNGE1MDEwMCwKLTB4YzAwMmIzYiwgMHhhZmEyMDAxMCwgMHg5N2EyMDAxOCwgMHgxMDQwMDA0ZCwKLTB4MjQwMzYwNDAsIDB4OTYwMjAwMDAsIDB4MzA0MmZmZjAsIDB4MTQ0MzAwMGMsCi0weDI0MDIwMDIwLCAweDNjMDMwMDAxLCAweDk0NjM2ZjI0LCAweDE0NjIwMDBiLAotMHgyNDAyNzgzMCwgMHgyNDAyMDAwMywgMHgzYzAxMDAwMSwgMHhhYzIyNmQ5NCwKLTB4MjQwMjAwMDUsIDB4M2MwMTAwMDEsIDB4MTAwMDAwM2YsIDB4YWMyMjZmMzQsCi0weDNjMDMwMDAxLCAweDk0NjM2ZjI0LCAweDI0MDI3ODMwLCAweDE0NjIwMDBjLAotMHgyNDAzMDAxMCwgMHgzYzAyMDAwMSwgMHg5NDQyNmYyNiwgMHgzMDQyZmZmMCwKLTB4MTQ0MzAwMDcsIDB4MjQwMjAwMDMsIDB4M2MwMTAwMDEsIDB4YWMyMjZkOTQsCi0weDI0MDIwMDA2LCAweDNjMDEwMDAxLCAweDEwMDAwMDJmLCAweGFjMjI2ZjM0LAotMHgzYzAyMDAwMSwgMHg4YzQyNmQ5NCwgMHgzYzAzMDAwMSwgMHg5NDYzNmYyNCwKLTB4MzQ0MjAwMDEsIDB4M2MwMTAwMDEsIDB4YWMyMjZkOTQsIDB4MjQwMjAwMTUsCi0weDE0NjIwMDBiLCAweDAsIDB4M2MwMjAwMDEsIDB4OTQ0MjZmMjYsCi0weDMwNDJmZmYwLCAweDM4NDNmNDIwLCAweDJjNjMwMDAxLCAweDM4NDJmNDMwLAotMHgyYzQyMDAwMSwgMHg2MjE4MjUsIDB4MTQ2MDAwMWIsIDB4MjQwMjAwMDMsCi0weDNjMDMwMDAxLCAweDk0NjM2ZjI0LCAweDI0MDI3ODEwLCAweDE0NjIwMDE2LAotMHgyNDAyMDAwMiwgMHgzYzAyMDAwMSwgMHg5NDQyNmYyNiwgMHgzMDQyZmZmMCwKLTB4MTQ0MDAwMTEsIDB4MjQwMjAwMDIsIDB4MTAwMDAwMGYsIDB4MjQwMjAwMDQsCi0weDNjMDIwMDAxLCAweDhjNDI2ZDk0LCAweDM0NDIwMDA4LCAweDNjMDEwMDAxLAotMHhhYzIyNmQ5NCwgMHgxMDAwMDA1ZSwgMHgyNDAyMDAwNCwgMHgzYzAyMDAwMSwKLTB4OGM0MjZkOTQsIDB4MzQ0MjAwMDQsIDB4M2MwMTAwMDEsIDB4MTAwMDAwYWYsCi0weGFjMjI2ZDk0LCAweDI0MDIwMDAxLCAweDNjMDEwMDAxLCAweGFjMjI2ZjQwLAotMHgzYzAyMDAwMSwgMHg4YzQyNmQ5NCwgMHgzMDQyMDAwMiwgMHgxNDQwMDBiMiwKLTB4M2MwOWZmZjAsIDB4MjQwMjBlMDAsIDB4YWY4MjAyMzgsIDB4OGY4NDAwNTQsCi0weDhmODIwMDU0LCAweDI0MDMwMDA4LCAweDNjMDEwMDAxLCAweGFjMjM2ZDk4LAotMHgxMDAwMDAwMiwgMHgyNDg0MDFmNCwgMHg4ZjgyMDA1NCwgMHg4MjEwMjMsCi0weDJjNDIwMWY1LCAweDE0NDBmZmZjLCAweDNjMDIwMGM4LCAweDM0NDIwMWZiLAotMHhhZjgyMDIzOCwgMHg4ZjgzMDA1NCwgMHg4ZjgyMDA1NCwgMHgxMDAwMDAwMiwKLTB4MjQ2MzAxZjQsIDB4OGY4MjAwNTQsIDB4NjIxMDIzLCAweDJjNDIwMWY1LAotMHgxNDQwZmZmYywgMHg4MDIxLCAweDI0MTIwMDAxLCAweDI0MTEwMDA5LAotMHhjMDA0NDgyLCAweDAsIDB4M2MwMTAwMDEsIDB4YWMzMjZkYjQsCi0weGMwMDQ1NDcsIDB4MCwgMHgzYzAyMDAwMSwgMHg4YzQyNmRiNCwKLTB4MTQ1MWZmZmIsIDB4M2MwMjAwYzgsIDB4MzQ0MjAxZjYsIDB4YWY4MjAyMzgsCi0weDhmODMwMDU0LCAweDhmODIwMDU0LCAweDEwMDAwMDAyLCAweDI0NjMwMDBhLAotMHg4ZjgyMDA1NCwgMHg2MjEwMjMsIDB4MmM0MjAwMGIsIDB4MTQ0MGZmZmMsCi0weDAsIDB4OGY4MjAyMjAsIDB4MjQwNDAwMDEsIDB4MzQ0MjAwMDIsCi0weGFmODIwMjIwLCAweDhmODMwMjAwLCAweDI0MDU3ZmZmLCAweDI0MDJmZmZkLAotMHg2MjE4MjQsIDB4YWY4MzAyMDAsIDB4YWY4NDAyMDQsIDB4OGY4MzAwNTQsCi0weDhmODIwMDU0LCAweDEwMDAwMDAyLCAweDI0NjMwMDAxLCAweDhmODIwMDU0LAotMHg2MjEwMjMsIDB4MmM0MjAwMDIsIDB4MTQ0MGZmZmMsIDB4MCwKLTB4OGY4MjAyMjQsIDB4MTQ0NDAwMDUsIDB4MzQwMjgwMDAsIDB4NDIwNDAsCi0weGE0MTAyYiwgMHgxMDQwZmZmMCwgMHgzNDAyODAwMCwgMHgxMDgyZmZhMCwKLTB4MjYxMDAwMDEsIDB4MmUwMjAwMTQsIDB4MTQ0MGZmY2QsIDB4MjQwMjAwMDQsCi0weDNjMDEwMDAxLCAweGFjMjI2ZDk4LCAweDgwMjEsIDB4MjQxMjAwMDksCi0weDNjMTFmZmZmLCAweDM2MzEzZjdmLCAweGMwMDQ0ODIsIDB4MCwKLTB4MjQwMjAwMDEsIDB4M2MwMTAwMDEsIDB4YWMyMjZkYjQsIDB4YzAwNDU0NywKLTB4MCwgMHgzYzAyMDAwMSwgMHg4YzQyNmRiNCwgMHgxNDUyZmZmYiwKLTB4MCwgMHg4ZjgyMDA0NCwgMHg1MTEwMjQsIDB4MzQ0MjUwODAsCi0weGFmODIwMDQ0LCAweDhmODMwMDU0LCAweDhmODIwMDU0LCAweDEwMDAwMDAyLAotMHgyNDYzMDAwYSwgMHg4ZjgyMDA1NCwgMHg2MjEwMjMsIDB4MmM0MjAwMGIsCi0weDE0NDBmZmZjLCAweDAsIDB4OGY4MjAwNDQsIDB4NTExMDI0LAotMHgzNDQyZjA4MCwgMHhhZjgyMDA0NCwgMHg4ZjgzMDA1NCwgMHg4ZjgyMDA1NCwKLTB4MTAwMDAwMDIsIDB4MjQ2MzAwMGEsIDB4OGY4MjAwNTQsIDB4NjIxMDIzLAotMHgyYzQyMDAwYiwgMHgxNDQwZmZmYywgMHgwLCAweDhmODIwMjIwLAotMHgzYzAzZjcwMCwgMHg0MzEwMjUsIDB4YWY4MjAyMjAsIDB4OGY4MzAwNTQsCi0weDhmODIwMDU0LCAweDEwMDAwMDAyLCAweDI0NjMwMDY0LCAweDhmODIwMDU0LAotMHg2MjEwMjMsIDB4MmM0MjAwNjUsIDB4MTQ0MGZmZmMsIDB4MCwKLTB4OGY4MjAyMjAsIDB4MjQwNDAwMDEsIDB4MzQ0MjAwMDIsIDB4YWY4MjAyMjAsCi0weDhmODMwMjAwLCAweDI0MDU3ZmZmLCAweDI0MDJmZmZkLCAweDYyMTgyNCwKLTB4YWY4MzAyMDAsIDB4YWY4NDAyMDQsIDB4OGY4MzAwNTQsIDB4OGY4MjAwNTQsCi0weDEwMDAwMDAyLCAweDI0NjMwMDAxLCAweDhmODIwMDU0LCAweDYyMTAyMywKLTB4MmM0MjAwMDIsIDB4MTQ0MGZmZmMsIDB4MCwgMHg4ZjgyMDIyNCwKLTB4MTQ0NDAwMDUsIDB4MzQwMjgwMDAsIDB4NDIwNDAsIDB4YTQxMDJiLAotMHgxMDQwZmZmMCwgMHgzNDAyODAwMCwgMHgxMDgyZmY1MCwgMHgyNjEwMDAwMSwKLTB4MmUwMjAwNjQsIDB4MTQ0MGZmYjAsIDB4MCwgMHgzYzAyMDAwMSwKLTB4OGM0MjZkOTQsIDB4MzA0MjAwMDQsIDB4MTQ0MDAwMDcsIDB4M2MwOWZmZjAsCi0weDhmODIwMDQ0LCAweDNjMDNmZmZmLCAweDM0NjMzZjdmLCAweDQzMTAyNCwKLTB4YWY4MjAwNDQsIDB4M2MwOWZmZjAsIDB4MzUyOWJkYzAsIDB4M2MwNjAwMDEsCi0weDhjYzY2ZDk0LCAweDNjMDQwMDAxLCAweDI0ODQ2YWUwLCAweDI0MDIwMDAxLAotMHgzYzAxMDAwMSwgMHhhYzIyNmQ5YywgMHg4ZjgyMDA1NCwgMHgzYzA3MDAwMSwKLTB4OGNlNzZmNDAsIDB4M2MwMzAwMDEsIDB4OTQ2MzZmMjQsIDB4M2MwODAwMDEsCi0weDk1MDg2ZjI2LCAweDNjMDUwMDBkLCAweDM0YTUwMTAwLCAweDNjMDEwMDAxLAotMHhhYzIwNmQ5OCwgMHg0OTEwMjEsIDB4M2MwMTAwMDEsIDB4YWMyMjZmMzAsCi0weGFmYTMwMDEwLCAweGMwMDJiM2IsIDB4YWZhODAwMTQsIDB4OGZiZjAwMmMsCi0weDhmYjIwMDI4LCAweDhmYjEwMDI0LCAweDhmYjAwMDIwLCAweDNlMDAwMDgsCi0weDI3YmQwMDMwLCAweDI3YmRmZmU4LCAweDNjMDUwMDAxLCAweDhjYTU2ZDk4LAotMHgyNDA2MDAwNCwgMHgyNDAyMDAwMSwgMHgxNGEyMDAxNCwgMHhhZmJmMDAxMCwKLTB4M2MwMjAwMDIsIDB4OGM0MjhmZmMsIDB4MzA0MjgwMDAsIDB4MTA0MDAwMDUsCi0weDNjMDQwMDBmLCAweDNjMDMwMDAxLCAweDhjNjM2ZjQwLCAweDEwMDAwMDA1LAotMHgzNDg0NDI0MCwgMHgzYzA0MDAwNCwgMHgzYzAzMDAwMSwgMHg4YzYzNmY0MCwKLTB4MzQ4NDkzZTAsIDB4MjQwMjAwMDUsIDB4MTQ2MjAwMTYsIDB4MCwKLTB4M2MwNDAwM2QsIDB4MTAwMDAwMTMsIDB4MzQ4NDA5MDAsIDB4M2MwMjAwMDIsCi0weDhjNDI4ZmY4LCAweDMwNDI4MDAwLCAweDEwNDAwMDA1LCAweDNjMDQwMDFlLAotMHgzYzAzMDAwMSwgMHg4YzYzNmY0MCwgMHgxMDAwMDAwNSwgMHgzNDg0ODQ4MCwKLTB4M2MwNDAwMGYsIDB4M2MwMzAwMDEsIDB4OGM2MzZmNDAsIDB4MzQ4NDQyNDAsCi0weDI0MDIwMDA1LCAweDE0NjIwMDAzLCAweDAsIDB4M2MwNDAwN2EsCi0weDM0ODQxMjAwLCAweDNjMDIwMDAxLCAweDhjNDI2ZjMwLCAweDhmODMwMDU0LAotMHg0NDEwMjEsIDB4NDMxMDIzLCAweDQ0MTAyYiwgMHgxNDQwMDA0YywKLTB4MCwgMHgzYzAyMDAwMSwgMHg4YzQyNmRhMCwgMHgxNDQwMDA0OCwKLTB4MCwgMHgzYzAxMDAwMSwgMHgxMGMwMDAyNSwgMHhhYzIwNmRiMCwKLTB4M2MwOTAwMDEsIDB4OGQyOTZkOTQsIDB4MjQwNzAwMDEsIDB4M2MwNDQwMDAsCi0weDNjMDgwMDAyLCAweDI1MDg4ZmZjLCAweDI1MGFmZmZjLCAweDUyODQyLAotMHgxNGEwMDAwMiwgMHgyNGM2ZmZmZiwgMHgyNDA1MDAwOCwgMHhhOTEwMjQsCi0weDEwNDAwMDEwLCAweDAsIDB4MTRhNzAwMDgsIDB4MCwKLTB4OGQwMjAwMDAsIDB4NDQxMDI0LCAweDEwNDAwMDBhLCAweDAsCi0weDNjMDEwMDAxLCAweDEwMDAwMDA3LCAweGFjMjU2ZGIwLCAweDhkNDIwMDAwLAotMHg0NDEwMjQsIDB4MTA0MDAwMDMsIDB4MCwgMHgzYzAxMDAwMSwKLTB4YWMyNzZkYjAsIDB4M2MwMjAwMDEsIDB4OGM0MjZkYjAsIDB4NjE4MmIsCi0weDJjNDIwMDAxLCAweDQzMTAyNCwgMHg1NDQwZmZlNSwgMHg1Mjg0MiwKLTB4OGY4MjAwNTQsIDB4M2MwMzAwMDEsIDB4OGM2MzZkYjAsIDB4M2MwMTAwMDEsCi0weGFjMjI2ZjMwLCAweDEwNjAwMDNiLCAweDI0MDIwMDA1LCAweDNjMDMwMDAxLAotMHg4YzYzNmY0MCwgMHgzYzAxMDAwMSwgMHhhYzI1NmQ5OCwgMHgxNDYyMDAxMiwKLTB4MjQwMjAwMDEsIDB4M2MwMjAwMDIsIDB4OGM0MjhmZjgsIDB4M2MwMzIwMDAsCi0weDM0NjM1MDAwLCAweDQzMTAyNCwgMHgxNDQwMDAwNiwgMHgyNDAyMDAwMSwKLTB4M2MwMTAwMDEsIDB4YWMyMDZmMWMsIDB4M2MwMTAwMDEsIDB4YWMyMjZkOTgsCi0weDI0MDIwMDAxLCAweDNjMDEwMDAxLCAweGFjMjI2ZTI0LCAweDNjMDEwMDAxLAotMHhhYzIyNmRhNCwgMHgyNDAyMDAwMSwgMHgzYzAxMDAwMSwgMHhhYzIyNmQ5YywKLTB4M2MwMjAwMDEsIDB4OGM0MjZkYjAsIDB4MTA0MDAwMWUsIDB4MCwKLTB4M2MwMjAwMDEsIDB4OGM0MjZkOWMsIDB4MTA0MDAwMDgsIDB4MjQwMjAwMDEsCi0weDNjMDEwMDAxLCAweGFjMjA2ZDljLCAweGFlZTIwNGI4LCAweDNjMDEwMDAxLAotMHhhYzIwNmUxYywgMHgzYzAxMDAwMSwgMHhhYzIyNmRkNCwgMHg4ZWUzMDRiOCwKLTB4MjQwMjAwMDgsIDB4MTA2MjAwMDUsIDB4MjQwMjAwMDEsIDB4YzAwNDIzOSwKLTB4MCwgMHgxMDAwMDAwYiwgMHgwLCAweDNjMDMwMDAxLAotMHg4YzYzNmQ5OCwgMHgxMDYyMDAwNywgMHgyNDAyMDAwZSwgMHgzYzAzMDAwMiwKLTB4OGM2MzhmOTAsIDB4MTA2MjAwMDMsIDB4MCwgMHhjMDA0ZTljLAotMHg4Zjg0MDIyMCwgMHg4ZmJmMDAxMCwgMHgzZTAwMDA4LCAweDI3YmQwMDE4LAotMHgyN2JkZmZlMCwgMHgzYzAzZmRmZiwgMHgzYzA0MDAwMSwgMHg4Yzg0NmQ5OCwKLTB4M2MwMjAwMDEsIDB4OGM0MjZkYzAsIDB4MzQ2M2ZmZmYsIDB4MjgzYTAyNCwKLTB4MTQ4MjAwMDYsIDB4YWZiZjAwMTgsIDB4OGVlMzA0YjgsIDB4M2MwMjAwMDEsCi0weDhjNDI2ZGM0LCAweDEwNjIwMDA2LCAweDAsIDB4OGVlMjA0YjgsCi0weDNjMDEwMDAxLCAweGFjMjQ2ZGMwLCAweDNjMDEwMDAxLCAweGFjMjI2ZGM0LAotMHgzYzAzMDAwMSwgMHg4YzYzNmQ5OCwgMHgyNDAyMDAwMiwgMHgxMDYyMDE5YywKLTB4MmM2MjAwMDMsIDB4MTA0MDAwMDUsIDB4MjQwMjAwMDEsIDB4MTA2MjAwMGEsCi0weDAsIDB4MTAwMDAyMjYsIDB4MCwgMHgyNDAyMDAwNCwKLTB4MTA2MjAwYjYsIDB4MjQwMjAwMDgsIDB4MTA2MjAxMGEsIDB4MjQwMjAwMDEsCi0weDEwMDAwMjFmLCAweDAsIDB4OGVlMjA0YjgsIDB4MjQ0M2ZmZmYsCi0weDJjNjIwMDA4LCAweDEwNDAwMjFjLCAweDMxMDgwLCAweDNjMDEwMDAxLAotMHgyMjA4MjEsIDB4OGMyMjZhZjgsIDB4NDAwMDA4LCAweDAsCi0weDNjMDMwMDAxLCAweDhjNjM2ZjQwLCAweDI0MDIwMDA1LCAweDE0NjIwMDEwLAotMHgwLCAweDNjMDIwMDAxLCAweDhjNDI2ZGE0LCAweDEwNDAwMDA4LAotMHgyNDAyMDAwMywgMHhjMDA0NDgyLCAweDAsIDB4MjQwMjAwMDIsCi0weGFlZTIwNGI4LCAweDNjMDEwMDAxLCAweDEwMDAwMDAyLCAweGFjMjA2ZGE0LAotMHhhZWUyMDRiOCwgMHgzYzAxMDAwMSwgMHgxMDAwMDIwMywgMHhhYzIwNmQzMCwKLTB4YzAwNDQ4MiwgMHgwLCAweDNjMDIwMDAxLCAweDhjNDI2ZGE0LAotMHgzYzAxMDAwMSwgMHhhYzIwNmQzMCwgMHgxNDQwMDE3YSwgMHgyNDAyMDAwMiwKLTB4MTAwMDAxOWQsIDB4MjQwMjAwMDcsIDB4M2MwMzAwMDEsIDB4OGM2MzZmNDAsCi0weDI0MDIwMDA1LCAweDE0NjIwMDAzLCAweDI0MDIwMDAxLCAweDNjMDEwMDAxLAotMHhhYzIyNmRkMCwgMHhjMDA0NWZmLCAweDAsIDB4M2MwMzAwMDEsCi0weDhjNjM2ZGQwLCAweDEwMDAwMTc0LCAweDI0MDIwMDExLCAweDNjMDUwMDAxLAotMHg4Y2E1NmQ5OCwgMHgzYzA2MDAwMiwgMHg4Y2M2OGZmYywgMHhjMDA1MTA0LAotMHgyMDIxLCAweDI0MDIwMDA1LCAweDNjMDEwMDAxLCAweGFjMjA2ZGE0LAotMHgxMDAwMDFlMSwgMHhhZWUyMDRiOCwgMHgzYzA0MDAwMSwgMHgyNDg0NmFlYywKLTB4M2MwNTAwMGYsIDB4MzRhNTAxMDAsIDB4MzAyMSwgMHgzODIxLAotMHhhZmEwMDAxMCwgMHhjMDAyYjNiLCAweGFmYTAwMDE0LCAweDEwMDAwMWQ2LAotMHgwLCAweDhmODIwMjIwLCAweDNjMDMwMDA0LCAweDQzMTAyNCwKLTB4MTQ0MDAxNzUsIDB4MjQwMjAwMDcsIDB4OGY4MzAwNTQsIDB4M2MwMjAwMDEsCi0weDhjNDI2ZjI4LCAweDI0NjNkOGYwLCAweDQzMTAyMywgMHgyYzQyMjcxMCwKLTB4MTQ0MDAwMDMsIDB4MjQwMjAwMDEsIDB4M2MwMTAwMDEsIDB4YWMyMjZkOWMsCi0weDNjMDIwMDAyLCAweDhjNDI4ZmZjLCAweDMwNDI1MDAwLCAweDEwNDAwMWMyLAotMHgwLCAweDhmODIwMjIwLCAweDMwNDI4MDAwLCAweDEwNDAwMTdkLAotMHgwLCAweDEwMDAwMTc1LCAweDAsIDB4M2MwNTAwMDEsCi0weDhjYTU2ZDk4LCAweGMwMDUyOWIsIDB4MjAyMSwgMHhjMDA1NTFiLAotMHgyMDIxLCAweDNjMDMwMDAyLCAweDhjNjM4ZmY0LCAweDQ2MTAxYjAsCi0weDI0MDIwMDAxLCAweDNjMDIwMDA4LCAweDYyMTAyNCwgMHgxMDQwMDAwNiwKLTB4MCwgMHg4ZjgyMDIxNCwgMHgzYzAzZmZmZiwgMHg0MzEwMjQsCi0weDEwMDAwMDA1LCAweDM0NDIyNTFmLCAweDhmODIwMjE0LCAweDNjMDNmZmZmLAotMHg0MzEwMjQsIDB4MzQ0MjI0MWYsIDB4YWY4MjAyMTQsIDB4OGY4MjAyMjAsCi0weDNjMDMwMjAwLCAweDM0NDIwMDAyLCAweGFmODIwMjIwLCAweDI0MDIwMDA4LAotMHhhZWUyMDRiOCwgMHg4ZjgyMDIyMCwgMHgyODNhMDI1LCAweDNjMDMwMDA0LAotMHg0MzEwMjQsIDB4MTQ0MDAwMTYsIDB4MCwgMHgzYzAyMDAwMiwKLTB4OGM0MjhmZmMsIDB4MzA0MjUwMDAsIDB4MTA0MDAwMGQsIDB4MCwKLTB4OGY4MjAyMjAsIDB4MzA0MjgwMDAsIDB4MTA0MDAwMDYsIDB4MCwKLTB4OGY4MjAyMjAsIDB4M2MwM2ZmZmYsIDB4MzQ2MzdmZmYsIDB4MTAwMDAwMDMsCi0weDQzMTAyNCwgMHg4ZjgyMDIyMCwgMHgzNDQyODAwMCwgMHhhZjgyMDIyMCwKLTB4OGY4MjAyMjAsIDB4M2MwM2Y3MDAsIDB4NDMxMDI1LCAweGFmODIwMjIwLAotMHgzYzAzMDAwMSwgMHg4YzYzNmY0MCwgMHgyNDAyMDAwNSwgMHgxNDYyMDAwYSwKLTB4MCwgMHgzYzAyMDAwMSwgMHg5NDQyNmYyNiwgMHgyNDQyOWZiYywKLTB4MmM0MjAwMDQsIDB4MTA0MDAwMDQsIDB4MjQwNDAwMTgsIDB4MjQwNTAwMDIsCi0weGMwMDRkZGIsIDB4MjQwNjAwMjAsIDB4YzAwM2U2ZCwgMHgwLAotMHgzYzAxMDAwMSwgMHgxMDAwMDE3MCwgMHhhYzIwNmUyMCwgMHg4ZWUyMDRiOCwKLTB4MjQ0M2ZmZmYsIDB4MmM2MjAwMDgsIDB4MTA0MDAxNmIsIDB4MzEwODAsCi0weDNjMDEwMDAxLCAweDIyMDgyMSwgMHg4YzIyNmIxOCwgMHg0MDAwMDgsCi0weDAsIDB4YzAwNDU0NywgMHgwLCAweDNjMDMwMDAxLAotMHg4YzYzNmRiNCwgMHgxMDAwMDBlOCwgMHgyNDAyMDAwOSwgMHgzYzAyMDAwMiwKLTB4OGM0MjhmZjgsIDB4MzA0MjQwMDAsIDB4MTA0MDAwMDQsIDB4MCwKLTB4OGY4MjAwNDQsIDB4MTAwMDAwMDYsIDB4MzQ0MmYwODAsIDB4OGY4MjAwNDQsCi0weDNjMDNmZmZmLCAweDM0NjMzZjdmLCAweDQzMTAyNCwgMHgzNDQyYTA4MCwKLTB4YWY4MjAwNDQsIDB4OGY4MzAwNTQsIDB4MTAwMDAwZWEsIDB4MjQwMjAwMDQsCi0weDhmODMwMDU0LCAweDNjMDIwMDAxLCAweDhjNDI2ZjI4LCAweDI0NjNkOGYwLAotMHg0MzEwMjMsIDB4MmM0MjI3MTAsIDB4MTQ0MDAxNDcsIDB4MjQwMjAwMDUsCi0weDEwMDAwMGQ4LCAweDAsIDB4OGY4MjAyMjAsIDB4M2MwM2Y3MDAsCi0weDQzMTAyNSwgMHhhZjgyMDIyMCwgMHhhZjgwMDIwNCwgMHgzYzAxMDAwMiwKLTB4MTAwMDAwZDYsIDB4YWMyMDhmZTAsIDB4OGY4MzAwNTQsIDB4M2MwMjAwMDEsCi0weDhjNDI2ZjI4LCAweDI0NjNmZmY2LCAweDQzMTAyMywgMHgyYzQyMDAwYSwKLTB4MTQ0MDAxMzUsIDB4MjQwMjAwMDcsIDB4MTAwMDAwZDcsIDB4MCwKLTB4YzAwM2Y1MCwgMHgwLCAweDEwNDAwMTJkLCAweDI0MDIwMDAxLAotMHg4ZjgyMDIxNCwgMHgzYzAzZmZmZiwgMHgzYzA0MDAwMSwgMHg4Yzg0NmYxYywKLTB4NDMxMDI0LCAweDM0NDIyNTFmLCAweGFmODIwMjE0LCAweDI0MDIwMDA4LAotMHgxMDgwMDAwNSwgMHhhZWUyMDRiOCwgMHgzYzAyMDAwMSwgMHg4YzQyNmU0NCwKLTB4MTA0MDAwNjQsIDB4MjQwMjAwMDEsIDB4OGY4MjAyMjAsIDB4M2MwMzAwMDgsCi0weDQzMTAyNCwgMHgxMDQwMDA2YSwgMHgzYzAyMDIwMCwgMHgxMDAwMDA3OCwKLTB4MCwgMHg4ZWUyMDRiOCwgMHgyNDQzZmZmZiwgMHgyYzYyMDAwNywKLTB4MTA0MDAxMTUsIDB4MzEwODAsIDB4M2MwMTAwMDEsIDB4MjIwODIxLAotMHg4YzIyNmIzOCwgMHg0MDAwMDgsIDB4MCwgMHhjMDAzZGFmLAotMHgwLCAweDNjMDEwMDAxLCAweGFjMjA2ZDljLCAweGFmODAwMjA0LAotMHgzYzAxMDAwMiwgMHhjMDA0NDgyLCAweGFjMjA4ZmUwLCAweDI0MDIwMDAxLAotMHgzYzAxMDAwMSwgMHhhYzIyNmRiNCwgMHgyNDAyMDAwMiwgMHgxMDAwMDEwMiwKLTB4YWVlMjA0YjgsIDB4YzAwNDU0NywgMHgwLCAweDNjMDMwMDAxLAotMHg4YzYzNmRiNCwgMHgxMDAwMDA4NCwgMHgyNDAyMDAwOSwgMHgzYzAyMDAwMiwKLTB4OGM0MjhmZjgsIDB4MzA0MjQwMDAsIDB4MTA0MDAwMDMsIDB4M2MwMjAwYzgsCi0weDEwMDAwMDAyLCAweDM0NDIwMWY2LCAweDM0NDIwMWZlLCAweGFmODIwMjM4LAotMHg4ZjgzMDA1NCwgMHgxMDAwMDA4YiwgMHgyNDAyMDAwNCwgMHg4ZjgzMDA1NCwKLTB4M2MwMjAwMDEsIDB4OGM0MjZmMjgsIDB4MjQ2M2Q4ZjAsIDB4NDMxMDIzLAotMHgyYzQyMjcxMCwgMHgxNDQwMDBlOCwgMHgyNDAyMDAwNSwgMHgxMDAwMDA3OSwKLTB4MCwgMHg4ZjgyMDIyMCwgMHgzYzAzZjcwMCwgMHg0MzEwMjUsCi0weGFmODIwMjIwLCAweGFmODAwMjA0LCAweDNjMDEwMDAyLCAweDEwMDAwMDc3LAotMHhhYzIwOGZlMCwgMHg4ZjgzMDA1NCwgMHgzYzAyMDAwMSwgMHg4YzQyNmYyOCwKLTB4MjQ2M2ZmZjYsIDB4NDMxMDIzLCAweDJjNDIwMDBhLCAweDE0NDAwMGQ2LAotMHgyNDAyMDAwNywgMHgxMDAwMDA3OCwgMHgwLCAweGMwMDNmNTAsCi0weDAsIDB4MTA0MDAwY2UsIDB4MjQwMjAwMDEsIDB4OGY4MjAyMTQsCi0weDNjMDNmZmZmLCAweDNjMDQwMDAxLCAweDhjODQ2ZjFjLCAweDQzMTAyNCwKLTB4MzQ0MjI1MWYsIDB4YWY4MjAyMTQsIDB4MjQwMjAwMDgsIDB4MTA4MDAwMGYsCi0weGFlZTIwNGI4LCAweDNjMDIwMDAxLCAweDhjNDI2ZTQ0LCAweDE0NDAwMDBiLAotMHgwLCAweDhmODIwMjIwLCAweDM0NDIwMDAyLCAweGFmODIwMjIwLAotMHgyNDAyMDAwMSwgMHgzYzAxMDAwMiwgMHhhYzIyOGY5MCwgMHhjMDA0ZTljLAotMHg4Zjg0MDIyMCwgMHgxMDAwMDAxNiwgMHgwLCAweDhmODIwMjIwLAotMHgzYzAzMDAwOCwgMHg0MzEwMjQsIDB4MTQ0MDAwMTEsIDB4M2MwMjAyMDAsCi0weDI4MmEwMjUsIDB4MjQwMjAwMGUsIDB4M2MwMTAwMDIsIDB4YWMyMjhmOTAsCi0weGMwMDU1MWIsIDB4MjAyMSwgMHg4ZjgyMDIyMCwgMHgzNDQyMDAwMiwKLTB4YzAwM2U2ZCwgMHhhZjgyMDIyMCwgMHgzYzA1MDAwMSwgMHg4Y2E1NmQ5OCwKLTB4YzAwNTI5YiwgMHgyMDIxLCAweDEwMDAwMGEzLCAweDAsCi0weDNjMDIwMDAxLCAweDhjNDI2ZTQ0LCAweDEwNDAwMDlmLCAweDAsCi0weDNjMDIwMDAxLCAweDhjNDI2ZTQwLCAweDI0NDJmZmZmLCAweDNjMDEwMDAxLAotMHhhYzIyNmU0MCwgMHgxNDQwMDA5OCwgMHgyNDAyMDAwMiwgMHgzYzAxMDAwMSwKLTB4YWMyMDZlNDQsIDB4M2MwMTAwMDEsIDB4MTAwMDAwOTMsIDB4YWMyMjZlNDAsCi0weDhlZTIwNGI4LCAweDI0NDNmZmZmLCAweDJjNjIwMDA3LCAweDEwNDAwMDhlLAotMHgzMTA4MCwgMHgzYzAxMDAwMSwgMHgyMjA4MjEsIDB4OGMyMjZiNTgsCi0weDQwMDAwOCwgMHgwLCAweDNjMDIwMDAxLCAweDhjNDI2ZGE0LAotMHgxMDQwMDAxOCwgMHgyNDAyMDAwNSwgMHhjMDA0NDgyLCAweDAsCi0weDI0MDIwMDAyLCAweGFlZTIwNGI4LCAweDNjMDEwMDAxLCAweDEwMDAwMDdlLAotMHhhYzIwNmRhNCwgMHhjMDA0OTYzLCAweDAsIDB4M2MwMzAwMDEsCi0weDhjNjM2ZGQ0LCAweDI0MDIwMDA2LCAweDE0NjIwMDc3LCAweDI0MDIwMDAzLAotMHgxMDAwMDA3NSwgMHhhZWUyMDRiOCwgMHgzYzA1MDAwMSwgMHg4Y2E1NmQ5OCwKLTB4M2MwNjAwMDIsIDB4OGNjNjhmZjgsIDB4YzAwNTEwNCwgMHgyMDIxLAotMHgyNDAyMDAwNSwgMHgxMDAwMDA2YywgMHhhZWUyMDRiOCwgMHg4ZjgyMDIyMCwKLTB4M2MwM2Y3MDAsIDB4NDMxMDI1LCAweGFmODIwMjIwLCAweDhmODMwMDU0LAotMHgyNDAyMDAwNiwgMHhhZWUyMDRiOCwgMHgzYzAxMDAwMSwgMHgxMDAwMDA2MiwKLTB4YWMyMzZmMjgsIDB4OGY4MjAyMjAsIDB4M2MwMzAwMDQsIDB4NDMxMDI0LAotMHgxMDQwMDAwMywgMHgyNDAyMDAwNywgMHgxMDAwMDA1YiwgMHhhZWUyMDRiOCwKLTB4OGY4MzAwNTQsIDB4M2MwMjAwMDEsIDB4OGM0MjZmMjgsIDB4MjQ2M2Q4ZjAsCi0weDQzMTAyMywgMHgyYzQyMjcxMCwgMHgxNDQwMDAwMywgMHgyNDAyMDAwMSwKLTB4M2MwMTAwMDEsIDB4YWMyMjZkOWMsIDB4M2MwMjAwMDIsIDB4OGM0MjhmZjgsCi0weDMwNDI1MDAwLCAweDEwNDAwMDRjLCAweDAsIDB4OGY4MjAyMjAsCi0weDMwNDI4MDAwLCAweDEwNDAwMDA3LCAweDAsIDB4OGY4MjAyMjAsCi0weDNjMDNmZmZmLCAweDM0NjM3ZmZmLCAweDQzMTAyNCwgMHgxMDAwMDA0MiwKLTB4YWY4MjAyMjAsIDB4OGY4MjAyMjAsIDB4MzQ0MjgwMDAsIDB4MTAwMDAwM2UsCi0weGFmODIwMjIwLCAweDNjMDUwMDAxLCAweDhjYTU2ZDk4LCAweGMwMDUyOWIsCi0weDIwMjEsIDB4YzAwNTUxYiwgMHgyMDIxLCAweDNjMDIwMDAyLAotMHg4YzQyOGZmMCwgMHg0NDEwMDMyLCAweDI0MDIwMDAxLCAweDhmODIwMjE0LAotMHgzYzAzZmZmZiwgMHg0MzEwMjQsIDB4MzQ0MjI1MWYsIDB4YWY4MjAyMTQsCi0weDI0MDIwMDA4LCAweGFlZTIwNGI4LCAweDhmODIwMjIwLCAweDM0NDIwMDAyLAotMHhhZjgyMDIyMCwgMHg4ZjgyMDIyMCwgMHgzYzAzMDAwNCwgMHg0MzEwMjQsCi0weDE0NDAwMDE2LCAweDAsIDB4M2MwMjAwMDIsIDB4OGM0MjhmZjgsCi0weDMwNDI1MDAwLCAweDEwNDAwMDBkLCAweDAsIDB4OGY4MjAyMjAsCi0weDMwNDI4MDAwLCAweDEwNDAwMDA2LCAweDAsIDB4OGY4MjAyMjAsCi0weDNjMDNmZmZmLCAweDM0NjM3ZmZmLCAweDEwMDAwMDAzLCAweDQzMTAyNCwKLTB4OGY4MjAyMjAsIDB4MzQ0MjgwMDAsIDB4YWY4MjAyMjAsIDB4OGY4MjAyMjAsCi0weDNjMDNmNzAwLCAweDQzMTAyNSwgMHhhZjgyMDIyMCwgMHgzYzAyMDAwMSwKLTB4OTQ0MjZmMjYsIDB4MjQ0MjlmYmMsIDB4MmM0MjAwMDQsIDB4MTA0MDAwMDQsCi0weDI0MDQwMDE4LCAweDI0MDUwMDAyLCAweGMwMDRkZGIsIDB4MjQwNjAwMjAsCi0weGMwMDNlNmQsIDB4MCwgMHgxMDAwMDAwMywgMHgwLAotMHgzYzAxMDAwMSwgMHhhYzIyNmQ5YywgMHg4ZmJmMDAxOCwgMHgzZTAwMDA4LAotMHgyN2JkMDAyMCwgMHg4ZjgyMDIwMCwgMHg4ZjgyMDIyMCwgMHg4ZjgyMDIyMCwKLTB4MzQ0MjAwMDQsIDB4YWY4MjAyMjAsIDB4OGY4MjAyMDAsIDB4M2MwNTAwMDEsCi0weDhjYTU2ZDk4LCAweDM0NDIwMDA0LCAweGFmODIwMjAwLCAweDI0MDIwMDAyLAotMHgxMGEyMDA0YiwgMHgyY2EyMDAwMywgMHgxMDQwMDAwNSwgMHgyNDAyMDAwMSwKLTB4MTBhMjAwMGEsIDB4MCwgMHgxMDAwMDBiMSwgMHgwLAotMHgyNDAyMDAwNCwgMHgxMGEyMDA3MiwgMHgyNDAyMDAwOCwgMHgxMGEyMDA4NSwKLTB4M2MwMmYwZmYsIDB4MTAwMDAwYWEsIDB4MCwgMHg4ZjgzMDA1MCwKLTB4M2MwMmYwZmYsIDB4MzQ0MmZmZmYsIDB4M2MwNDAwMDEsIDB4OGM4NDZmNDAsCi0weDYyMTgyNCwgMHgzYzAyMDcwMCwgMHg2MjE4MjUsIDB4MjQwMjBlMDAsCi0weDI0ODRmZmZiLCAweDJjODQwMDAyLCAweGFmODMwMDUwLCAweGFmODUwMjAwLAotMHhhZjg1MDIyMCwgMHgxNDgwMDAwNiwgMHhhZjgyMDIzOCwgMHg4ZjgyMDA0NCwKLTB4M2MwM2ZmZmYsIDB4MzQ2MzNmN2YsIDB4NDMxMDI0LCAweGFmODIwMDQ0LAotMHgzYzAzMDAwMSwgMHg4YzYzNmY0MCwgMHgyNDAyMDAwNSwgMHgxNDYyMDAwNCwKLTB4MCwgMHg4ZjgyMDA0NCwgMHgzNDQyNTAwMCwgMHhhZjgyMDA0NCwKLTB4M2MwMjAwMDEsIDB4OGM0MjZkODgsIDB4M2MwMzAwMDEsIDB4OGM2MzZmNDAsCi0weDM0NDIwMDIyLCAweDI0NjNmZmZjLCAweDJjNjMwMDAyLCAweDE0NjAwMDBjLAotMHhhZjgyMDIwMCwgMHgzYzAyMDAwMSwgMHg4YzQyNmRhYywgMHgzYzAzMDAwMSwKLTB4OGM2MzZkOTAsIDB4M2MwNDAwMDEsIDB4OGM4NDZkOGMsIDB4MzQ0MjgwMDAsCi0weDYyMTgyNSwgMHg2NDE4MjUsIDB4MTAwMDAwMGEsIDB4MzQ2MjAwMDIsCi0weDNjMDIwMDAxLCAweDhjNDI2ZDkwLCAweDNjMDMwMDAxLCAweDhjNjM2ZGFjLAotMHgzYzA0MDAwMSwgMHg4Yzg0NmQ4YywgMHg0MzEwMjUsIDB4NDQxMDI1LAotMHgzNDQyMDAwMiwgMHhhZjgyMDIyMCwgMHgxMDAwMDAyZiwgMHgyNDAyMDAwMSwKLTB4MjQwMjBlMDEsIDB4YWY4MjAyMzgsIDB4OGY4MzAwNTAsIDB4M2MwMmYwZmYsCi0weDM0NDJmZmZmLCAweDNjMDQwMDAxLCAweDhjODQ2ZjFjLCAweDYyMTgyNCwKLTB4M2MwMjBkMDAsIDB4NjIxODI1LCAweDI0MDIwMDAxLCAweGFmODMwMDUwLAotMHhhZjgyMDIwMCwgMHhhZjgyMDIyMCwgMHgxMDgwMDAwNSwgMHgzYzAzM2YwMCwKLTB4M2MwMjAwMDEsIDB4OGM0MjZkODAsIDB4MTAwMDAwMDQsIDB4MzQ2MzAwNzAsCi0weDNjMDIwMDAxLCAweDhjNDI2ZDgwLCAweDM0NjMwMDcyLCAweDQzMTAyNSwKLTB4YWY4MjAyMDAsIDB4M2MwMzAwMDEsIDB4OGM2MzZkODQsIDB4M2MwMmY3MDAsCi0weDYyMTgyNSwgMHgzYzAyMDAwMSwgMHg4YzQyNmQ5MCwgMHgzYzA0MDAwMSwKLTB4OGM4NDZkYWMsIDB4M2MwNTAwMDEsIDB4OGNhNTZmNDAsIDB4NDMxMDI1LAotMHg0NDEwMjUsIDB4YWY4MjAyMjAsIDB4MjQwMjAwMDUsIDB4MTRhMjAwMDYsCi0weDI0MDIwMDAxLCAweDhmODIwMDQ0LCAweDI0MDNhZmZmLCAweDQzMTAyNCwKLTB4YWY4MjAwNDQsIDB4MjQwMjAwMDEsIDB4MTAwMDAwM2QsIDB4YWY4MjAyMzgsCi0weDhmODMwMDUwLCAweDNjMDJmMGZmLCAweDM0NDJmZmZmLCAweDNjMDQwMDAxLAotMHg4Yzg0NmYxYywgMHg2MjE4MjQsIDB4M2MwMjBhMDAsIDB4NjIxODI1LAotMHgyNDAyMDAwMSwgMHhhZjgzMDA1MCwgMHhhZjgyMDIwMCwgMHgxMDgwMDAxZSwKLTB4YWY4MjAyMjAsIDB4M2MwMjAwMDEsIDB4OGM0MjZlNDQsIDB4MTQ0MDAwMWEsCi0weDNjMDMzZjAwLCAweDNjMDIwMDAxLCAweDhjNDI2ZDgwLCAweDEwMDAwMDFhLAotMHgzNDYzMDBlMCwgMHg4ZjgzMDA1MCwgMHgzYzA0MDAwMSwgMHg4Yzg0NmYxYywKLTB4MzQ0MmZmZmYsIDB4NjIxODI0LCAweDEwODAwMDBmLCAweGFmODMwMDUwLAotMHgzYzAyMDAwMSwgMHg4YzQyNmU0NCwgMHgxNDQwMDAwYiwgMHgzYzA0M2YwMCwKLTB4M2MwMzAwMDEsIDB4OGM2MzZkODAsIDB4MzQ4NDAwZTAsIDB4MjQwMjAwMDEsCi0weGFmODIwMjAwLCAweGFmODIwMjIwLCAweDY0MTgyNSwgMHhhZjgzMDIwMCwKLTB4MTAwMDAwMDgsIDB4M2MwNWY3MDAsIDB4M2MwMjAwMDEsIDB4OGM0MjZkODAsCi0weDNjMDMzZjAwLCAweDM0NjMwMGUyLCAweDQzMTAyNSwgMHhhZjgyMDIwMCwKLTB4M2MwNWY3MDAsIDB4MzRhNTgwMDAsIDB4M2MwMzAwMDEsIDB4OGM2MzZkODQsCi0weDNjMDIwMDAxLCAweDhjNDI2ZDkwLCAweDNjMDQwMDAxLCAweDhjODQ2ZGFjLAotMHg2NTE4MjUsIDB4NDMxMDI1LCAweDQ0MTAyNSwgMHhhZjgyMDIyMCwKLTB4M2UwMDAwOCwgMHgwLCAweDNjMDMwMDAxLCAweDhjNjM2ZGI0LAotMHgzYzAyMDAwMSwgMHg4YzQyNmRiOCwgMHgxMDYyMDAwMywgMHgyNDAyMDAwMiwKLTB4M2MwMTAwMDEsIDB4YWMyMzZkYjgsIDB4MTA2MjAwMWQsIDB4MmM2MjAwMDMsCi0weDEwNDAwMDI1LCAweDI0MDIwMDAxLCAweDE0NjIwMDIzLCAweDI0MDIwMDA0LAotMHgzYzAzMDAwMSwgMHg4YzYzNmQ5OCwgMHgxMDYyMDAwNiwgMHgyNDAyMDAwOCwKLTB4MTQ2MjAwMGMsIDB4M2MwMjAwYzgsIDB4MzQ0MjAxZmIsIDB4MTAwMDAwMDksCi0weGFmODIwMjM4LCAweDI0MDIwZTAxLCAweGFmODIwMjM4LCAweDhmODIwMDQ0LAotMHgzYzAzZmZmZiwgMHgzNDYzM2Y3ZiwgMHg0MzEwMjQsIDB4MzQ0MjAwODAsCi0weGFmODIwMDQ0LCAweDhmODMwMDU0LCAweDI0MDIwMDAyLCAweDNjMDEwMDAxLAotMHhhYzIyNmRiNCwgMHgzYzAxMDAwMSwgMHgxMDAwMDAwYiwgMHhhYzIzNmYyYywKLTB4OGY4MzAwNTQsIDB4M2MwMjAwMDEsIDB4OGM0MjZmMmMsIDB4MjQ2M2Q4ZjAsCi0weDQzMTAyMywgMHgyYzQyMjcxMCwgMHgxNDQwMDAwMywgMHgyNDAyMDAwOSwKLTB4M2MwMTAwMDEsIDB4YWMyMjZkYjQsIDB4M2UwMDAwOCwgMHgwLAotMHgwLCAweDAsIDB4MCwgMHgyN2JkZmZkOCwKLTB4YWZiMjAwMTgsIDB4ODA5MDIxLCAweGFmYjMwMDFjLCAweGEwOTgyMSwKLTB4YWZiMTAwMTQsIDB4YzA4ODIxLCAweGFmYjAwMDEwLCAweDgwMjEsCi0weGFmYmYwMDIwLCAweGE2MjAwMDAwLCAweGMwMDRkNzgsIDB4MjQwNDAwMDEsCi0weDI2MTAwMDAxLCAweDJlMDIwMDIwLCAweDE0NDBmZmZiLCAweDAsCi0weGMwMDRkNzgsIDB4MjAyMSwgMHhjMDA0ZDc4LCAweDI0MDQwMDAxLAotMHhjMDA0ZDc4LCAweDI0MDQwMDAxLCAweGMwMDRkNzgsIDB4MjAyMSwKLTB4MjQxMDAwMTAsIDB4MjUwMTAyNCwgMHgxMDQwMDAwMiwgMHgyMDIxLAotMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAweDEwODA0MiwgMHgxNjAwZmZmYSwKLTB4MjUwMTAyNCwgMHgyNDEwMDAxMCwgMHgyNzAxMDI0LCAweDEwNDAwMDAyLAotMHgyMDIxLCAweDI0MDQwMDAxLCAweGMwMDRkNzgsIDB4MTA4MDQyLAotMHgxNjAwZmZmYSwgMHgyNzAxMDI0LCAweGMwMDRkYjksIDB4MzQxMDgwMDAsCi0weGMwMDRkYjksIDB4MCwgMHhjMDA0ZDU4LCAweDAsCi0weDUwNDAwMDA1LCAweDEwODA0MiwgMHg5NjIyMDAwMCwgMHg1MDEwMjUsCi0weGE2MjIwMDAwLCAweDEwODA0MiwgMHgxNjAwZmZmNywgMHgwLAotMHhjMDA0ZGI5LCAweDAsIDB4OGZiZjAwMjAsIDB4OGZiMzAwMWMsCi0weDhmYjIwMDE4LCAweDhmYjEwMDE0LCAweDhmYjAwMDEwLCAweDNlMDAwMDgsCi0weDI3YmQwMDI4LCAweDI3YmRmZmQ4LCAweGFmYjEwMDE0LCAweDgwODgyMSwKLTB4YWZiMjAwMTgsIDB4YTA5MDIxLCAweGFmYjMwMDFjLCAweGMwOTgyMSwKLTB4YWZiMDAwMTAsIDB4ODAyMSwgMHhhZmJmMDAyMCwgMHhjMDA0ZDc4LAotMHgyNDA0MDAwMSwgMHgyNjEwMDAwMSwgMHgyZTAyMDAyMCwgMHgxNDQwZmZmYiwKLTB4MCwgMHhjMDA0ZDc4LCAweDIwMjEsIDB4YzAwNGQ3OCwKLTB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgMHgyMDIxLCAweGMwMDRkNzgsCi0weDI0MDQwMDAxLCAweDI0MTAwMDEwLCAweDIzMDEwMjQsIDB4MTA0MDAwMDIsCi0weDIwMjEsIDB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgMHgxMDgwNDIsCi0weDE2MDBmZmZhLCAweDIzMDEwMjQsIDB4MjQxMDAwMTAsIDB4MjUwMTAyNCwKLTB4MTA0MDAwMDIsIDB4MjAyMSwgMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LAotMHgxMDgwNDIsIDB4MTYwMGZmZmEsIDB4MjUwMTAyNCwgMHhjMDA0ZDc4LAotMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAweDIwMjEsIDB4MzQxMDgwMDAsCi0weDk2NjIwMDAwLCAweDUwMTAyNCwgMHgxMDQwMDAwMiwgMHgyMDIxLAotMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAweDEwODA0MiwgMHgxNjAwZmZmOCwKLTB4MCwgMHhjMDA0ZGI5LCAweDAsIDB4OGZiZjAwMjAsCi0weDhmYjMwMDFjLCAweDhmYjIwMDE4LCAweDhmYjEwMDE0LCAweDhmYjAwMDEwLAotMHgzZTAwMDA4LCAweDI3YmQwMDI4LCAweDNjMDQwMDAxLCAweDhjODQ2ZGQwLAotMHgzYzAyMDAwMSwgMHg4YzQyNmUxOCwgMHgyN2JkZmZkOCwgMHhhZmJmMDAyMCwKLTB4YWZiMTAwMWMsIDB4MTA4MjAwMDMsIDB4YWZiMDAwMTgsIDB4M2MwMTAwMDEsCi0weGFjMjQ2ZTE4LCAweDNjMDMwMDAxLCAweDhjNjM2ZjQwLCAweDI0MDIwMDA1LAotMHgxNDYyMDAwNSwgMHgyNDgzZmZmZiwgMHhjMDA0OTYzLCAweDAsCi0weDEwMDAwMzRjLCAweDAsIDB4MmM2MjAwMTMsIDB4MTA0MDAzNDksCi0weDMxMDgwLCAweDNjMDEwMDAxLCAweDIyMDgyMSwgMHg4YzIyNmI4MCwKLTB4NDAwMDA4LCAweDAsIDB4YzAwNGRiOSwgMHg4MDIxLAotMHgzNDAyODAwMCwgMHhhN2EyMDAxMCwgMHgyN2IxMDAxMCwgMHhjMDA0ZDc4LAotMHgyNDA0MDAwMSwgMHgyNjEwMDAwMSwgMHgyZTAyMDAyMCwgMHgxNDQwZmZmYiwKLTB4MCwgMHhjMDA0ZDc4LCAweDIwMjEsIDB4YzAwNGQ3OCwKLTB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgMHgyMDIxLCAweGMwMDRkNzgsCi0weDI0MDQwMDAxLCAweDI0MTAwMDEwLCAweDMyMDIwMDAxLCAweDEwNDAwMDAyLAotMHgyMDIxLCAweDI0MDQwMDAxLCAweGMwMDRkNzgsIDB4MTA4MDQyLAotMHgxNjAwZmZmYSwgMHgzMjAyMDAwMSwgMHgyNDEwMDAxMCwgMHhjMDA0ZDc4LAotMHgyMDIxLCAweDEwODA0MiwgMHgxNjAwZmZmYywgMHgwLAotMHhjMDA0ZDc4LCAweDI0MDQwMDAxLCAweGMwMDRkNzgsIDB4MjAyMSwKLTB4MzQxMDgwMDAsIDB4OTYyMjAwMDAsIDB4NTAxMDI0LCAweDEwNDAwMDAyLAotMHgyMDIxLCAweDI0MDQwMDAxLCAweGMwMDRkNzgsIDB4MTA4MDQyLAotMHgxNjAwZmZmOCwgMHgwLCAweGMwMDRkYjksIDB4MCwKLTB4MTAwMDAzMGUsIDB4MjQwMjAwMDIsIDB4MjdiMTAwMTAsIDB4YTdhMDAwMTAsCi0weDgwMjEsIDB4YzAwNGQ3OCwgMHgyNDA0MDAwMSwgMHgyNjEwMDAwMSwKLTB4MmUwMjAwMjAsIDB4MTQ0MGZmZmIsIDB4MCwgMHhjMDA0ZDc4LAotMHgyMDIxLCAweGMwMDRkNzgsIDB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwKLTB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgMHgyMDIxLCAweDI0MTAwMDEwLAotMHgzMjAyMDAwMSwgMHgxMDQwMDAwMiwgMHgyMDIxLCAweDI0MDQwMDAxLAotMHhjMDA0ZDc4LCAweDEwODA0MiwgMHgxNjAwZmZmYSwgMHgzMjAyMDAwMSwKLTB4MjQxMDAwMTAsIDB4YzAwNGQ3OCwgMHgyMDIxLCAweDEwODA0MiwKLTB4MTYwMGZmZmMsIDB4MCwgMHhjMDA0ZGI5LCAweDM0MTA4MDAwLAotMHhjMDA0ZGI5LCAweDAsIDB4YzAwNGQ1OCwgMHgwLAotMHg1MDQwMDAwNSwgMHgxMDgwNDIsIDB4OTYyMjAwMDAsIDB4NTAxMDI1LAotMHhhNjIyMDAwMCwgMHgxMDgwNDIsIDB4MTYwMGZmZjcsIDB4MCwKLTB4YzAwNGRiOSwgMHgwLCAweDk3YTIwMDEwLCAweDMwNDI4MDAwLAotMHgxNDQwMDJkYywgMHgyNDAyMDAwMywgMHgxMDAwMDJkOCwgMHgwLAotMHgyNDAyMTIwMCwgMHhhN2EyMDAxMCwgMHgyN2IxMDAxMCwgMHg4MDIxLAotMHhjMDA0ZDc4LCAweDI0MDQwMDAxLCAweDI2MTAwMDAxLCAweDJlMDIwMDIwLAotMHgxNDQwZmZmYiwgMHgwLCAweGMwMDRkNzgsIDB4MjAyMSwKLTB4YzAwNGQ3OCwgMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAweDIwMjEsCi0weGMwMDRkNzgsIDB4MjQwNDAwMDEsIDB4MjQxMDAwMTAsIDB4MzIwMjAwMDEsCi0weDEwNDAwMDAyLCAweDIwMjEsIDB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwKLTB4MTA4MDQyLCAweDE2MDBmZmZhLCAweDMyMDIwMDAxLCAweDI0MTAwMDEwLAotMHhjMDA0ZDc4LCAweDIwMjEsIDB4MTA4MDQyLCAweDE2MDBmZmZjLAotMHgwLCAweGMwMDRkNzgsIDB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwKLTB4MjAyMSwgMHgzNDEwODAwMCwgMHg5NjIyMDAwMCwgMHg1MDEwMjQsCi0weDEwNDAwMDAyLCAweDIwMjEsIDB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwKLTB4MTA4MDQyLCAweDE2MDBmZmY4LCAweDAsIDB4YzAwNGRiOSwKLTB4MCwgMHg4ZjgzMDA1NCwgMHgxMDAwMDI5NiwgMHgyNDAyMDAwNCwKLTB4OGY4MzAwNTQsIDB4M2MwMjAwMDEsIDB4OGM0MjZmM2MsIDB4MjQ2M2ZmOWMsCi0weDQzMTAyMywgMHgyYzQyMDA2NCwgMHgxNDQwMDI5ZSwgMHgyNDAyMDAwMiwKLTB4M2MwMzAwMDEsIDB4OGM2MzZmNDAsIDB4MTA2MjAyOTcsIDB4MmM2MjAwMDMsCi0weDE0NDAwMjk2LCAweDI0MDIwMDExLCAweDI0MDIwMDAzLCAweDEwNjIwMDA1LAotMHgyNDAyMDAwNCwgMHgxMDYyMDI5MSwgMHgyNDAyMDAwZiwgMHgxMDAwMDI4ZiwKLTB4MjQwMjAwMTEsIDB4MTAwMDAyOGQsIDB4MjQwMjAwMDUsIDB4MjQwMjAwMTQsCi0weGE3YTIwMDEwLCAweDI3YjEwMDEwLCAweDgwMjEsIDB4YzAwNGQ3OCwKLTB4MjQwNDAwMDEsIDB4MjYxMDAwMDEsIDB4MmUwMjAwMjAsIDB4MTQ0MGZmZmIsCi0weDAsIDB4YzAwNGQ3OCwgMHgyMDIxLCAweGMwMDRkNzgsCi0weDI0MDQwMDAxLCAweGMwMDRkNzgsIDB4MjAyMSwgMHhjMDA0ZDc4LAotMHgyNDA0MDAwMSwgMHgyNDEwMDAxMCwgMHgzMjAyMDAwMSwgMHgxMDQwMDAwMiwKLTB4MjAyMSwgMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAweDEwODA0MiwKLTB4MTYwMGZmZmEsIDB4MzIwMjAwMDEsIDB4MjQxMDAwMTAsIDB4MzIwMjAwMTIsCi0weDEwNDAwMDAyLCAweDIwMjEsIDB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwKLTB4MTA4MDQyLCAweDE2MDBmZmZhLCAweDMyMDIwMDEyLCAweGMwMDRkNzgsCi0weDI0MDQwMDAxLCAweGMwMDRkNzgsIDB4MjAyMSwgMHgzNDEwODAwMCwKLTB4OTYyMjAwMDAsIDB4NTAxMDI0LCAweDEwNDAwMDAyLCAweDIwMjEsCi0weDI0MDQwMDAxLCAweGMwMDRkNzgsIDB4MTA4MDQyLCAweDE2MDBmZmY4LAotMHgwLCAweGMwMDRkYjksIDB4MCwgMHg4ZjgzMDA1NCwKLTB4MTAwMDAyNDgsIDB4MjQwMjAwMDYsIDB4OGY4MzAwNTQsIDB4M2MwMjAwMDEsCi0weDhjNDI2ZjNjLCAweDI0NjNmZjljLCAweDQzMTAyMywgMHgyYzQyMDA2NCwKLTB4MTQ0MDAyNTAsIDB4MjQwMjAwMDcsIDB4MTAwMDAyNGMsIDB4MCwKLTB4MjQwMjAwMDYsIDB4YTdhMjAwMTAsIDB4MjdiMTAwMTAsIDB4ODAyMSwKLTB4YzAwNGQ3OCwgMHgyNDA0MDAwMSwgMHgyNjEwMDAwMSwgMHgyZTAyMDAyMCwKLTB4MTQ0MGZmZmIsIDB4MCwgMHhjMDA0ZDc4LCAweDIwMjEsCi0weGMwMDRkNzgsIDB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgMHgyMDIxLAotMHhjMDA0ZDc4LCAweDI0MDQwMDAxLCAweDI0MTAwMDEwLCAweDMyMDIwMDAxLAotMHgxMDQwMDAwMiwgMHgyMDIxLCAweDI0MDQwMDAxLCAweGMwMDRkNzgsCi0weDEwODA0MiwgMHgxNjAwZmZmYSwgMHgzMjAyMDAwMSwgMHgyNDEwMDAxMCwKLTB4MzIwMjAwMTMsIDB4MTA0MDAwMDIsIDB4MjAyMSwgMHgyNDA0MDAwMSwKLTB4YzAwNGQ3OCwgMHgxMDgwNDIsIDB4MTYwMGZmZmEsIDB4MzIwMjAwMTMsCi0weGMwMDRkNzgsIDB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgMHgyMDIxLAotMHgzNDEwODAwMCwgMHg5NjIyMDAwMCwgMHg1MDEwMjQsIDB4MTA0MDAwMDIsCi0weDIwMjEsIDB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgMHgxMDgwNDIsCi0weDE2MDBmZmY4LCAweDAsIDB4YzAwNGRiOSwgMHgwLAotMHg4ZjgzMDA1NCwgMHgxMDAwMDIwNywgMHgyNDAyMDAwOCwgMHg4ZjgzMDA1NCwKLTB4M2MwMjAwMDEsIDB4OGM0MjZmM2MsIDB4MjQ2M2ZmOWMsIDB4NDMxMDIzLAotMHgyYzQyMDA2NCwgMHgxNDQwMDIwZiwgMHgyNDAyMDAwOSwgMHgxMDAwMDIwYiwKLTB4MCwgMHgyN2IxMDAxMCwgMHhhN2EwMDAxMCwgMHg4MDIxLAotMHhjMDA0ZDc4LCAweDI0MDQwMDAxLCAweDI2MTAwMDAxLCAweDJlMDIwMDIwLAotMHgxNDQwZmZmYiwgMHgwLCAweGMwMDRkNzgsIDB4MjAyMSwKLTB4YzAwNGQ3OCwgMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAweDI0MDQwMDAxLAotMHhjMDA0ZDc4LCAweDIwMjEsIDB4MjQxMDAwMTAsIDB4MzIwMjAwMDEsCi0weDEwNDAwMDAyLCAweDIwMjEsIDB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwKLTB4MTA4MDQyLCAweDE2MDBmZmZhLCAweDMyMDIwMDAxLCAweDI0MTAwMDEwLAotMHgzMjAyMDAxOCwgMHgxMDQwMDAwMiwgMHgyMDIxLCAweDI0MDQwMDAxLAotMHhjMDA0ZDc4LCAweDEwODA0MiwgMHgxNjAwZmZmYSwgMHgzMjAyMDAxOCwKLTB4YzAwNGRiOSwgMHgzNDEwODAwMCwgMHhjMDA0ZGI5LCAweDAsCi0weGMwMDRkNTgsIDB4MCwgMHg1MDQwMDAwNSwgMHgxMDgwNDIsCi0weDk2MjIwMDAwLCAweDUwMTAyNSwgMHhhNjIyMDAwMCwgMHgxMDgwNDIsCi0weDE2MDBmZmY3LCAweDAsIDB4YzAwNGRiOSwgMHg4MDIxLAotMHg5N2EyMDAxMCwgMHgyN2IxMDAxMCwgMHgzNDQyMDAwMSwgMHhhN2EyMDAxMCwKLTB4YzAwNGQ3OCwgMHgyNDA0MDAwMSwgMHgyNjEwMDAwMSwgMHgyZTAyMDAyMCwKLTB4MTQ0MGZmZmIsIDB4MCwgMHhjMDA0ZDc4LCAweDIwMjEsCi0weGMwMDRkNzgsIDB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgMHgyMDIxLAotMHhjMDA0ZDc4LCAweDI0MDQwMDAxLCAweDI0MTAwMDEwLCAweDMyMDIwMDAxLAotMHgxMDQwMDAwMiwgMHgyMDIxLCAweDI0MDQwMDAxLCAweGMwMDRkNzgsCi0weDEwODA0MiwgMHgxNjAwZmZmYSwgMHgzMjAyMDAwMSwgMHgyNDEwMDAxMCwKLTB4MzIwMjAwMTgsIDB4MTA0MDAwMDIsIDB4MjAyMSwgMHgyNDA0MDAwMSwKLTB4YzAwNGQ3OCwgMHgxMDgwNDIsIDB4MTYwMGZmZmEsIDB4MzIwMjAwMTgsCi0weGMwMDRkNzgsIDB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgMHgyMDIxLAotMHgzNDEwODAwMCwgMHg5NjIyMDAwMCwgMHg1MDEwMjQsIDB4MTA0MDAwMDIsCi0weDIwMjEsIDB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgMHgxMDgwNDIsCi0weDE2MDBmZmY4LCAweDAsIDB4YzAwNGRiOSwgMHgwLAotMHg4ZjgzMDA1NCwgMHgxMDAwMDE5MywgMHgyNDAyMDAwYSwgMHg4ZjgzMDA1NCwKLTB4M2MwMjAwMDEsIDB4OGM0MjZmM2MsIDB4MjQ2M2ZmOWMsIDB4NDMxMDIzLAotMHgyYzQyMDA2NCwgMHgxNDQwMDE5YiwgMHgyNDAyMDAwYiwgMHgxMDAwMDE5NywKLTB4MCwgMHgyN2IxMDAxMCwgMHhhN2EwMDAxMCwgMHg4MDIxLAotMHhjMDA0ZDc4LCAweDI0MDQwMDAxLCAweDI2MTAwMDAxLCAweDJlMDIwMDIwLAotMHgxNDQwZmZmYiwgMHgwLCAweGMwMDRkNzgsIDB4MjAyMSwKLTB4YzAwNGQ3OCwgMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAweDI0MDQwMDAxLAotMHhjMDA0ZDc4LCAweDIwMjEsIDB4MjQxMDAwMTAsIDB4MzIwMjAwMDEsCi0weDEwNDAwMDAyLCAweDIwMjEsIDB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwKLTB4MTA4MDQyLCAweDE2MDBmZmZhLCAweDMyMDIwMDAxLCAweDI0MTAwMDEwLAotMHgzMjAyMDAxNywgMHgxMDQwMDAwMiwgMHgyMDIxLCAweDI0MDQwMDAxLAotMHhjMDA0ZDc4LCAweDEwODA0MiwgMHgxNjAwZmZmYSwgMHgzMjAyMDAxNywKLTB4YzAwNGRiOSwgMHgzNDEwODAwMCwgMHhjMDA0ZGI5LCAweDAsCi0weGMwMDRkNTgsIDB4MCwgMHg1MDQwMDAwNSwgMHgxMDgwNDIsCi0weDk2MjIwMDAwLCAweDUwMTAyNSwgMHhhNjIyMDAwMCwgMHgxMDgwNDIsCi0weDE2MDBmZmY3LCAweDAsIDB4YzAwNGRiOSwgMHg4MDIxLAotMHg5N2EyMDAxMCwgMHgyN2IxMDAxMCwgMHgzNDQyMDcwMCwgMHhhN2EyMDAxMCwKLTB4YzAwNGQ3OCwgMHgyNDA0MDAwMSwgMHgyNjEwMDAwMSwgMHgyZTAyMDAyMCwKLTB4MTQ0MGZmZmIsIDB4MCwgMHhjMDA0ZDc4LCAweDIwMjEsCi0weGMwMDRkNzgsIDB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgMHgyMDIxLAotMHhjMDA0ZDc4LCAweDI0MDQwMDAxLCAweDI0MTAwMDEwLCAweDMyMDIwMDAxLAotMHgxMDQwMDAwMiwgMHgyMDIxLCAweDI0MDQwMDAxLCAweGMwMDRkNzgsCi0weDEwODA0MiwgMHgxNjAwZmZmYSwgMHgzMjAyMDAwMSwgMHgyNDEwMDAxMCwKLTB4MzIwMjAwMTcsIDB4MTA0MDAwMDIsIDB4MjAyMSwgMHgyNDA0MDAwMSwKLTB4YzAwNGQ3OCwgMHgxMDgwNDIsIDB4MTYwMGZmZmEsIDB4MzIwMjAwMTcsCi0weGMwMDRkNzgsIDB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgMHgyMDIxLAotMHgzNDEwODAwMCwgMHg5NjIyMDAwMCwgMHg1MDEwMjQsIDB4MTA0MDAwMDIsCi0weDIwMjEsIDB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgMHgxMDgwNDIsCi0weDE2MDBmZmY4LCAweDAsIDB4YzAwNGRiOSwgMHgwLAotMHg4ZjgzMDA1NCwgMHgxMDAwMDExZiwgMHgyNDAyMDAwYywgMHg4ZjgzMDA1NCwKLTB4M2MwMjAwMDEsIDB4OGM0MjZmM2MsIDB4MjQ2M2ZmOWMsIDB4NDMxMDIzLAotMHgyYzQyMDA2NCwgMHgxNDQwMDEyNywgMHgyNDAyMDAxMiwgMHgxMDAwMDEyMywKLTB4MCwgMHgyN2IxMDAxMCwgMHhhN2EwMDAxMCwgMHg4MDIxLAotMHhjMDA0ZDc4LCAweDI0MDQwMDAxLCAweDI2MTAwMDAxLCAweDJlMDIwMDIwLAotMHgxNDQwZmZmYiwgMHgwLCAweGMwMDRkNzgsIDB4MjAyMSwKLTB4YzAwNGQ3OCwgMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAweDI0MDQwMDAxLAotMHhjMDA0ZDc4LCAweDIwMjEsIDB4MjQxMDAwMTAsIDB4MzIwMjAwMDEsCi0weDEwNDAwMDAyLCAweDIwMjEsIDB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwKLTB4MTA4MDQyLCAweDE2MDBmZmZhLCAweDMyMDIwMDAxLCAweDI0MTAwMDEwLAotMHgzMjAyMDAxNCwgMHgxMDQwMDAwMiwgMHgyMDIxLCAweDI0MDQwMDAxLAotMHhjMDA0ZDc4LCAweDEwODA0MiwgMHgxNjAwZmZmYSwgMHgzMjAyMDAxNCwKLTB4YzAwNGRiOSwgMHgzNDEwODAwMCwgMHhjMDA0ZGI5LCAweDAsCi0weGMwMDRkNTgsIDB4MCwgMHg1MDQwMDAwNSwgMHgxMDgwNDIsCi0weDk2MjIwMDAwLCAweDUwMTAyNSwgMHhhNjIyMDAwMCwgMHgxMDgwNDIsCi0weDE2MDBmZmY3LCAweDAsIDB4YzAwNGRiOSwgMHg4MDIxLAotMHg5N2EyMDAxMCwgMHgyN2IxMDAxMCwgMHgzNDQyMDAxMCwgMHhhN2EyMDAxMCwKLTB4YzAwNGQ3OCwgMHgyNDA0MDAwMSwgMHgyNjEwMDAwMSwgMHgyZTAyMDAyMCwKLTB4MTQ0MGZmZmIsIDB4MCwgMHhjMDA0ZDc4LCAweDIwMjEsCi0weGMwMDRkNzgsIDB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgMHgyMDIxLAotMHhjMDA0ZDc4LCAweDI0MDQwMDAxLCAweDI0MTAwMDEwLCAweDMyMDIwMDAxLAotMHgxMDQwMDAwMiwgMHgyMDIxLCAweDI0MDQwMDAxLCAweGMwMDRkNzgsCi0weDEwODA0MiwgMHgxNjAwZmZmYSwgMHgzMjAyMDAwMSwgMHgyNDEwMDAxMCwKLTB4MzIwMjAwMTQsIDB4MTA0MDAwMDIsIDB4MjAyMSwgMHgyNDA0MDAwMSwKLTB4YzAwNGQ3OCwgMHgxMDgwNDIsIDB4MTYwMGZmZmEsIDB4MzIwMjAwMTQsCi0weGMwMDRkNzgsIDB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgMHgyMDIxLAotMHgzNDEwODAwMCwgMHg5NjIyMDAwMCwgMHg1MDEwMjQsIDB4MTA0MDAwMDIsCi0weDIwMjEsIDB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgMHgxMDgwNDIsCi0weDE2MDBmZmY4LCAweDAsIDB4YzAwNGRiOSwgMHgwLAotMHg4ZjgzMDA1NCwgMHgxMDAwMDBhYiwgMHgyNDAyMDAxMywgMHg4ZjgzMDA1NCwKLTB4M2MwMjAwMDEsIDB4OGM0MjZmM2MsIDB4MjQ2M2ZmOWMsIDB4NDMxMDIzLAotMHgyYzQyMDA2NCwgMHgxNDQwMDBiMywgMHgyNDAyMDAwZCwgMHgxMDAwMDBhZiwKLTB4MCwgMHgyN2IxMDAxMCwgMHhhN2EwMDAxMCwgMHg4MDIxLAotMHhjMDA0ZDc4LCAweDI0MDQwMDAxLCAweDI2MTAwMDAxLCAweDJlMDIwMDIwLAotMHgxNDQwZmZmYiwgMHgwLCAweGMwMDRkNzgsIDB4MjAyMSwKLTB4YzAwNGQ3OCwgMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAweDI0MDQwMDAxLAotMHhjMDA0ZDc4LCAweDIwMjEsIDB4MjQxMDAwMTAsIDB4MzIwMjAwMDEsCi0weDEwNDAwMDAyLCAweDIwMjEsIDB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwKLTB4MTA4MDQyLCAweDE2MDBmZmZhLCAweDMyMDIwMDAxLCAweDI0MTAwMDEwLAotMHgzMjAyMDAxOCwgMHgxMDQwMDAwMiwgMHgyMDIxLCAweDI0MDQwMDAxLAotMHhjMDA0ZDc4LCAweDEwODA0MiwgMHgxNjAwZmZmYSwgMHgzMjAyMDAxOCwKLTB4YzAwNGRiOSwgMHgzNDEwODAwMCwgMHhjMDA0ZGI5LCAweDAsCi0weGMwMDRkNTgsIDB4MCwgMHg1MDQwMDAwNSwgMHgxMDgwNDIsCi0weDk2MjIwMDAwLCAweDUwMTAyNSwgMHhhNjIyMDAwMCwgMHgxMDgwNDIsCi0weDE2MDBmZmY3LCAweDAsIDB4YzAwNGRiOSwgMHg4MDIxLAotMHg5N2EyMDAxMCwgMHgyN2IxMDAxMCwgMHgzMDQyZmZmZSwgMHhhN2EyMDAxMCwKLTB4YzAwNGQ3OCwgMHgyNDA0MDAwMSwgMHgyNjEwMDAwMSwgMHgyZTAyMDAyMCwKLTB4MTQ0MGZmZmIsIDB4MCwgMHhjMDA0ZDc4LCAweDIwMjEsCi0weGMwMDRkNzgsIDB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgMHgyMDIxLAotMHhjMDA0ZDc4LCAweDI0MDQwMDAxLCAweDI0MTAwMDEwLCAweDMyMDIwMDAxLAotMHgxMDQwMDAwMiwgMHgyMDIxLCAweDI0MDQwMDAxLCAweGMwMDRkNzgsCi0weDEwODA0MiwgMHgxNjAwZmZmYSwgMHgzMjAyMDAwMSwgMHgyNDEwMDAxMCwKLTB4MzIwMjAwMTgsIDB4MTA0MDAwMDIsIDB4MjAyMSwgMHgyNDA0MDAwMSwKLTB4YzAwNGQ3OCwgMHgxMDgwNDIsIDB4MTYwMGZmZmEsIDB4MzIwMjAwMTgsCi0weGMwMDRkNzgsIDB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgMHgyMDIxLAotMHgzNDEwODAwMCwgMHg5NjIyMDAwMCwgMHg1MDEwMjQsIDB4MTA0MDAwMDIsCi0weDIwMjEsIDB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgMHgxMDgwNDIsCi0weDE2MDBmZmY4LCAweDAsIDB4YzAwNGRiOSwgMHgwLAotMHg4ZjgzMDA1NCwgMHgxMDAwMDAzNywgMHgyNDAyMDAwZSwgMHgyNDAyMDg0MCwKLTB4YTdhMjAwMTAsIDB4MjdiMTAwMTAsIDB4ODAyMSwgMHhjMDA0ZDc4LAotMHgyNDA0MDAwMSwgMHgyNjEwMDAwMSwgMHgyZTAyMDAyMCwgMHgxNDQwZmZmYiwKLTB4MCwgMHhjMDA0ZDc4LCAweDIwMjEsIDB4YzAwNGQ3OCwKLTB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgMHgyMDIxLCAweGMwMDRkNzgsCi0weDI0MDQwMDAxLCAweDI0MTAwMDEwLCAweDMyMDIwMDAxLCAweDEwNDAwMDAyLAotMHgyMDIxLCAweDI0MDQwMDAxLCAweGMwMDRkNzgsIDB4MTA4MDQyLAotMHgxNjAwZmZmYSwgMHgzMjAyMDAwMSwgMHgyNDEwMDAxMCwgMHgzMjAyMDAxMywKLTB4MTA0MDAwMDIsIDB4MjAyMSwgMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LAotMHgxMDgwNDIsIDB4MTYwMGZmZmEsIDB4MzIwMjAwMTMsIDB4YzAwNGQ3OCwKLTB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgMHgyMDIxLCAweDM0MTA4MDAwLAotMHg5NjIyMDAwMCwgMHg1MDEwMjQsIDB4MTA0MDAwMDIsIDB4MjAyMSwKLTB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgMHgxMDgwNDIsIDB4MTYwMGZmZjgsCi0weDAsIDB4YzAwNGRiOSwgMHgwLCAweDhmODMwMDU0LAotMHgyNDAyMDAxMCwgMHgzYzAxMDAwMSwgMHhhYzIyNmRkMCwgMHgzYzAxMDAwMSwKLTB4MTAwMDAwMGMsIDB4YWMyMzZmM2MsIDB4OGY4MzAwNTQsIDB4M2MwMjAwMDEsCi0weDhjNDI2ZjNjLCAweDI0NjNmZjljLCAweDQzMTAyMywgMHgyYzQyMDA2NCwKLTB4MTQ0MDAwMDQsIDB4MCwgMHgyNDAyMDAxMSwgMHgzYzAxMDAwMSwKLTB4YWMyMjZkZDAsIDB4OGZiZjAwMjAsIDB4OGZiMTAwMWMsIDB4OGZiMDAwMTgsCi0weDNlMDAwMDgsIDB4MjdiZDAwMjgsIDB4M2MwMzAwMDEsIDB4OGM2MzZkOTgsCi0weDI3YmRmZmM4LCAweDI0MDIwMDAyLCAweGFmYmYwMDM0LCAweGFmYjIwMDMwLAotMHhhZmIxMDAyYywgMHgxNDYyMDAwNCwgMHhhZmIwMDAyOCwgMHgzYzEyMDAwMiwKLTB4MTAwMDAwMDMsIDB4OGU1MjhmZjgsIDB4M2MxMjAwMDIsIDB4OGU1MjhmZmMsCi0weDNjMDMwMDAxLCAweDhjNjM2ZGQ0LCAweDNjMDIwMDAxLCAweDhjNDI2ZTFjLAotMHg1MDYyMDAwNCwgMHgyNDYzZmZmZiwgMHgzYzAxMDAwMSwgMHhhYzIzNmUxYywKLTB4MjQ2M2ZmZmYsIDB4MmM2MjAwMDYsIDB4MTA0MDAzNzcsIDB4MzEwODAsCi0weDNjMDEwMDAxLCAweDIyMDgyMSwgMHg4YzIyNmJkOCwgMHg0MDAwMDgsCi0weDAsIDB4MjAyMSwgMHgyODIxLCAweGMwMDRkZGIsCi0weDM0MDY4MDAwLCAweDI0MDQwMDEwLCAweDI0MDUwMDAyLCAweDI0MDYwMDAyLAotMHgyNDAyMDAwMiwgMHhjMDA0ZGRiLCAweGE3YTIwMDE4LCAweDI0MDIwMDAyLAotMHgzYzAxMDAwMSwgMHgxMDAwMDM2NCwgMHhhYzIyNmRkNCwgMHgyN2IxMDAxOCwKLTB4YTdhMDAwMTgsIDB4ODAyMSwgMHhjMDA0ZDc4LCAweDI0MDQwMDAxLAotMHgyNjEwMDAwMSwgMHgyZTAyMDAyMCwgMHgxNDQwZmZmYiwgMHgwLAotMHhjMDA0ZDc4LCAweDIwMjEsIDB4YzAwNGQ3OCwgMHgyNDA0MDAwMSwKLTB4YzAwNGQ3OCwgMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAweDIwMjEsCi0weDI0MTAwMDEwLCAweDMyMDIwMDAxLCAweDEwNDAwMDAyLCAweDIwMjEsCi0weDI0MDQwMDAxLCAweGMwMDRkNzgsIDB4MTA4MDQyLCAweDE2MDBmZmZhLAotMHgzMjAyMDAwMSwgMHgyNDEwMDAxMCwgMHhjMDA0ZDc4LCAweDIwMjEsCi0weDEwODA0MiwgMHgxNjAwZmZmYywgMHgwLCAweGMwMDRkYjksCi0weDM0MTA4MDAwLCAweGMwMDRkYjksIDB4MCwgMHhjMDA0ZDU4LAotMHgwLCAweDUwNDAwMDA1LCAweDEwODA0MiwgMHg5NjIyMDAwMCwKLTB4NTAxMDI1LCAweGE2MjIwMDAwLCAweDEwODA0MiwgMHgxNjAwZmZmNywKLTB4MCwgMHhjMDA0ZGI5LCAweDAsIDB4OTdhMjAwMTgsCi0weDMwNDI4MDAwLCAweDE0NDAwMDA0LCAweDI0MDIwMDAzLCAweDNjMDEwMDAxLAotMHhhYzIyNmRkNCwgMHgyNDAyMDAwMywgMHgzYzAxMDAwMSwgMHgxMDAwMDMyYSwKLTB4YWMyMjZkZDQsIDB4MjQwNDAwMTAsIDB4MjQwNTAwMDIsIDB4MjQwNjAwMDIsCi0weDI0MDIwMDAyLCAweGMwMDRkZGIsIDB4YTdhMjAwMTgsIDB4M2MwMzAwMDEsCi0weDhjNjM2ZTIwLCAweDI0MDIwMDAxLCAweDE0NjIwMWUxLCAweDgwMjEsCi0weDI3YjEwMDE4LCAweGE3YTAwMDE4LCAweGMwMDRkNzgsIDB4MjQwNDAwMDEsCi0weDI2MTAwMDAxLCAweDJlMDIwMDIwLCAweDE0NDBmZmZiLCAweDAsCi0weGMwMDRkNzgsIDB4MjAyMSwgMHhjMDA0ZDc4LCAweDI0MDQwMDAxLAotMHhjMDA0ZDc4LCAweDI0MDQwMDAxLCAweGMwMDRkNzgsIDB4MjAyMSwKLTB4MjQxMDAwMTAsIDB4MzIwMjAwMDEsIDB4MTA0MDAwMDIsIDB4MjAyMSwKLTB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgMHgxMDgwNDIsIDB4MTYwMGZmZmEsCi0weDMyMDIwMDAxLCAweDI0MTAwMDEwLCAweDMyMDIwMDE4LCAweDEwNDAwMDAyLAotMHgyMDIxLCAweDI0MDQwMDAxLCAweGMwMDRkNzgsIDB4MTA4MDQyLAotMHgxNjAwZmZmYSwgMHgzMjAyMDAxOCwgMHhjMDA0ZGI5LCAweDM0MTA4MDAwLAotMHhjMDA0ZGI5LCAweDAsIDB4YzAwNGQ1OCwgMHgwLAotMHg1MDQwMDAwNSwgMHgxMDgwNDIsIDB4OTYyMjAwMDAsIDB4NTAxMDI1LAotMHhhNjIyMDAwMCwgMHgxMDgwNDIsIDB4MTYwMGZmZjcsIDB4MCwKLTB4YzAwNGRiOSwgMHg4MDIxLCAweDI3YjEwMDE4LCAweGE3YTAwMDE4LAotMHhjMDA0ZDc4LCAweDI0MDQwMDAxLCAweDI2MTAwMDAxLCAweDJlMDIwMDIwLAotMHgxNDQwZmZmYiwgMHgwLCAweGMwMDRkNzgsIDB4MjAyMSwKLTB4YzAwNGQ3OCwgMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAweDI0MDQwMDAxLAotMHhjMDA0ZDc4LCAweDIwMjEsIDB4MjQxMDAwMTAsIDB4MzIwMjAwMDEsCi0weDEwNDAwMDAyLCAweDIwMjEsIDB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwKLTB4MTA4MDQyLCAweDE2MDBmZmZhLCAweDMyMDIwMDAxLCAweDI0MTAwMDEwLAotMHgzMjAyMDAxOCwgMHgxMDQwMDAwMiwgMHgyMDIxLCAweDI0MDQwMDAxLAotMHhjMDA0ZDc4LCAweDEwODA0MiwgMHgxNjAwZmZmYSwgMHgzMjAyMDAxOCwKLTB4YzAwNGRiOSwgMHgzNDEwODAwMCwgMHhjMDA0ZGI5LCAweDAsCi0weGMwMDRkNTgsIDB4MCwgMHg1MDQwMDAwNSwgMHgxMDgwNDIsCi0weDk2MjIwMDAwLCAweDUwMTAyNSwgMHhhNjIyMDAwMCwgMHgxMDgwNDIsCi0weDE2MDBmZmY3LCAweDAsIDB4YzAwNGRiOSwgMHg4MDIxLAotMHgyNDA0MDAxOCwgMHgyODIxLCAweGMwMDRkZGIsIDB4MjQwNjA0MDQsCi0weGE3YTAwMDFhLCAweGMwMDRkNzgsIDB4MjQwNDAwMDEsIDB4MjYxMDAwMDEsCi0weDJlMDIwMDIwLCAweDE0NDBmZmZiLCAweDAsIDB4YzAwNGQ3OCwKLTB4MjAyMSwgMHhjMDA0ZDc4LCAweDI0MDQwMDAxLCAweGMwMDRkNzgsCi0weDI0MDQwMDAxLCAweGMwMDRkNzgsIDB4MjAyMSwgMHgyNDEwMDAxMCwKLTB4MzIwMjAwMDEsIDB4MTA0MDAwMDIsIDB4MjAyMSwgMHgyNDA0MDAwMSwKLTB4YzAwNGQ3OCwgMHgxMDgwNDIsIDB4MTYwMGZmZmEsIDB4MzIwMjAwMDEsCi0weDI0MTAwMDEwLCAweDMyMDIwMDE4LCAweDEwNDAwMDAyLCAweDIwMjEsCi0weDI0MDQwMDAxLCAweGMwMDRkNzgsIDB4MTA4MDQyLCAweDE2MDBmZmZhLAotMHgzMjAyMDAxOCwgMHhjMDA0ZGI5LCAweDM0MTA4MDAwLCAweGMwMDRkYjksCi0weDAsIDB4YzAwNGQ1OCwgMHgwLCAweDUwNDAwMDA1LAotMHgxMDgwNDIsIDB4OTdhMjAwMWEsIDB4NTAxMDI1LCAweGE3YTIwMDFhLAotMHgxMDgwNDIsIDB4MTYwMGZmZjcsIDB4MCwgMHhjMDA0ZGI5LAotMHg4MDIxLCAweGE3YTAwMDFhLCAweGMwMDRkNzgsIDB4MjQwNDAwMDEsCi0weDI2MTAwMDAxLCAweDJlMDIwMDIwLCAweDE0NDBmZmZiLCAweDAsCi0weGMwMDRkNzgsIDB4MjAyMSwgMHhjMDA0ZDc4LCAweDI0MDQwMDAxLAotMHhjMDA0ZDc4LCAweDI0MDQwMDAxLCAweGMwMDRkNzgsIDB4MjAyMSwKLTB4MjQxMDAwMTAsIDB4MzIwMjAwMDEsIDB4MTA0MDAwMDIsIDB4MjAyMSwKLTB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgMHgxMDgwNDIsIDB4MTYwMGZmZmEsCi0weDMyMDIwMDAxLCAweDI0MTAwMDEwLCAweDMyMDIwMDE4LCAweDEwNDAwMDAyLAotMHgyMDIxLCAweDI0MDQwMDAxLCAweGMwMDRkNzgsIDB4MTA4MDQyLAotMHgxNjAwZmZmYSwgMHgzMjAyMDAxOCwgMHhjMDA0ZGI5LCAweDM0MTA4MDAwLAotMHhjMDA0ZGI5LCAweDAsIDB4YzAwNGQ1OCwgMHgwLAotMHg1MDQwMDAwNSwgMHgxMDgwNDIsIDB4OTdhMjAwMWEsIDB4NTAxMDI1LAotMHhhN2EyMDAxYSwgMHgxMDgwNDIsIDB4MTYwMGZmZjcsIDB4MCwKLTB4YzAwNGRiOSwgMHg4MDIxLCAweGE3YTAwMDFjLCAweGMwMDRkNzgsCi0weDI0MDQwMDAxLCAweDI2MTAwMDAxLCAweDJlMDIwMDIwLCAweDE0NDBmZmZiLAotMHgwLCAweGMwMDRkNzgsIDB4MjAyMSwgMHhjMDA0ZDc4LAotMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAweDI0MDQwMDAxLCAweGMwMDRkNzgsCi0weDIwMjEsIDB4MjQxMDAwMTAsIDB4YzAwNGQ3OCwgMHgyMDIxLAotMHgxMDgwNDIsIDB4MTYwMGZmZmMsIDB4MCwgMHgyNDEwMDAxMCwKLTB4MzIwMjAwMWUsIDB4MTA0MDAwMDIsIDB4MjAyMSwgMHgyNDA0MDAwMSwKLTB4YzAwNGQ3OCwgMHgxMDgwNDIsIDB4MTYwMGZmZmEsIDB4MzIwMjAwMWUsCi0weGMwMDRkYjksIDB4MzQxMDgwMDAsIDB4YzAwNGRiOSwgMHgwLAotMHhjMDA0ZDU4LCAweDAsIDB4NTA0MDAwMDUsIDB4MTA4MDQyLAotMHg5N2EyMDAxYywgMHg1MDEwMjUsIDB4YTdhMjAwMWMsIDB4MTA4MDQyLAotMHgxNjAwZmZmNywgMHgwLCAweGMwMDRkYjksIDB4ODAyMSwKLTB4YTdhMDAwMWMsIDB4YzAwNGQ3OCwgMHgyNDA0MDAwMSwgMHgyNjEwMDAwMSwKLTB4MmUwMjAwMjAsIDB4MTQ0MGZmZmIsIDB4MCwgMHhjMDA0ZDc4LAotMHgyMDIxLCAweGMwMDRkNzgsIDB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwKLTB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgMHgyMDIxLCAweDI0MTAwMDEwLAotMHhjMDA0ZDc4LCAweDIwMjEsIDB4MTA4MDQyLCAweDE2MDBmZmZjLAotMHgwLCAweDI0MTAwMDEwLCAweDMyMDIwMDFlLCAweDEwNDAwMDAyLAotMHgyMDIxLCAweDI0MDQwMDAxLCAweGMwMDRkNzgsIDB4MTA4MDQyLAotMHgxNjAwZmZmYSwgMHgzMjAyMDAxZSwgMHhjMDA0ZGI5LCAweDM0MTA4MDAwLAotMHhjMDA0ZGI5LCAweDAsIDB4YzAwNGQ1OCwgMHgwLAotMHg1MDQwMDAwNSwgMHgxMDgwNDIsIDB4OTdhMjAwMWMsIDB4NTAxMDI1LAotMHhhN2EyMDAxYywgMHgxMDgwNDIsIDB4MTYwMGZmZjcsIDB4MCwKLTB4YzAwNGRiOSwgMHg4MDIxLCAweDI0MDIwMDAyLCAweGE3YTIwMDFlLAotMHhjMDA0ZDc4LCAweDI0MDQwMDAxLCAweDI2MTAwMDAxLCAweDJlMDIwMDIwLAotMHgxNDQwZmZmYiwgMHgwLCAweGMwMDRkNzgsIDB4MjAyMSwKLTB4YzAwNGQ3OCwgMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAweDIwMjEsCi0weGMwMDRkNzgsIDB4MjQwNDAwMDEsIDB4MjQxMDAwMTAsIDB4YzAwNGQ3OCwKLTB4MjAyMSwgMHgxMDgwNDIsIDB4MTYwMGZmZmMsIDB4MCwKLTB4MjQxMDAwMTAsIDB4MzIwMjAwMWUsIDB4MTA0MDAwMDIsIDB4MjAyMSwKLTB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgMHgxMDgwNDIsIDB4MTYwMGZmZmEsCi0weDMyMDIwMDFlLCAweGMwMDRkNzgsIDB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwKLTB4MjAyMSwgMHgzNDEwODAwMCwgMHg5N2EyMDAxZSwgMHg1MDEwMjQsCi0weDEwNDAwMDAyLCAweDIwMjEsIDB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwKLTB4MTA4MDQyLCAweDE2MDBmZmY4LCAweDAsIDB4YzAwNGRiOSwKLTB4ODAyMSwgMHhhN2EwMDAyMCwgMHhjMDA0ZDc4LCAweDI0MDQwMDAxLAotMHgyNjEwMDAwMSwgMHgyZTAyMDAyMCwgMHgxNDQwZmZmYiwgMHgwLAotMHhjMDA0ZDc4LCAweDIwMjEsIDB4YzAwNGQ3OCwgMHgyNDA0MDAwMSwKLTB4YzAwNGQ3OCwgMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAweDIwMjEsCi0weDI0MTAwMDEwLCAweGMwMDRkNzgsIDB4MjAyMSwgMHgxMDgwNDIsCi0weDE2MDBmZmZjLCAweDAsIDB4MjQxMDAwMTAsIDB4MzIwMjAwMWUsCi0weDEwNDAwMDAyLCAweDIwMjEsIDB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwKLTB4MTA4MDQyLCAweDE2MDBmZmZhLCAweDMyMDIwMDFlLCAweGMwMDRkYjksCi0weDM0MTA4MDAwLCAweGMwMDRkYjksIDB4MCwgMHhjMDA0ZDU4LAotMHgwLCAweDUwNDAwMDA1LCAweDEwODA0MiwgMHg5N2EyMDAyMCwKLTB4NTAxMDI1LCAweGE3YTIwMDIwLCAweDEwODA0MiwgMHgxNjAwZmZmNywKLTB4MCwgMHhjMDA0ZGI5LCAweDgwMjEsIDB4YTdhMDAwMjAsCi0weGMwMDRkNzgsIDB4MjQwNDAwMDEsIDB4MjYxMDAwMDEsIDB4MmUwMjAwMjAsCi0weDE0NDBmZmZiLCAweDAsIDB4YzAwNGQ3OCwgMHgyMDIxLAotMHhjMDA0ZDc4LCAweDI0MDQwMDAxLCAweGMwMDRkNzgsIDB4MjQwNDAwMDEsCi0weGMwMDRkNzgsIDB4MjAyMSwgMHgyNDEwMDAxMCwgMHhjMDA0ZDc4LAotMHgyMDIxLCAweDEwODA0MiwgMHgxNjAwZmZmYywgMHgwLAotMHgyNDEwMDAxMCwgMHgzMjAyMDAxZSwgMHgxMDQwMDAwMiwgMHgyMDIxLAotMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAweDEwODA0MiwgMHgxNjAwZmZmYSwKLTB4MzIwMjAwMWUsIDB4YzAwNGRiOSwgMHgzNDEwODAwMCwgMHhjMDA0ZGI5LAotMHgwLCAweGMwMDRkNTgsIDB4MCwgMHg1MDQwMDAwNSwKLTB4MTA4MDQyLCAweDk3YTIwMDIwLCAweDUwMTAyNSwgMHhhN2EyMDAyMCwKLTB4MTA4MDQyLCAweDE2MDBmZmY3LCAweDAsIDB4YzAwNGRiOSwKLTB4ODAyMSwgMHhhN2EwMDAyMiwgMHhjMDA0ZDc4LCAweDI0MDQwMDAxLAotMHgyNjEwMDAwMSwgMHgyZTAyMDAyMCwgMHgxNDQwZmZmYiwgMHgwLAotMHhjMDA0ZDc4LCAweDIwMjEsIDB4YzAwNGQ3OCwgMHgyNDA0MDAwMSwKLTB4YzAwNGQ3OCwgMHgyMDIxLCAweGMwMDRkNzgsIDB4MjQwNDAwMDEsCi0weDI0MTAwMDEwLCAweGMwMDRkNzgsIDB4MjAyMSwgMHgxMDgwNDIsCi0weDE2MDBmZmZjLCAweDAsIDB4MjQxMDAwMTAsIDB4YzAwNGQ3OCwKLTB4MjAyMSwgMHgxMDgwNDIsIDB4MTYwMGZmZmMsIDB4MCwKLTB4YzAwNGQ3OCwgMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAweDIwMjEsCi0weDM0MTA4MDAwLCAweDk3YTIwMDIyLCAweDUwMTAyNCwgMHgxMDQwMDAwMiwKLTB4MjAyMSwgMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAweDEwODA0MiwKLTB4MTYwMGZmZjgsIDB4MCwgMHhjMDA0ZGI5LCAweDAsCi0weDI0MDQwMDE4LCAweDI0MDUwMDAyLCAweGMwMDRkZGIsIDB4MjQwNjAwMDQsCi0weDNjMTAwMDAxLCAweDhlMTA2ZTI0LCAweDI0MDIwMDAxLCAweDE2MDIwMTFkLAotMHgwLCAweDNjMDIwMDAxLCAweDk0NDI2ZjI2LCAweDNjMDEwMDAxLAotMHhhYzIwNmUyNCwgMHgyNDQyOWZiYywgMHgyYzQyMDAwNCwgMHgxMDQwMDAwYywKLTB4MjQwNDAwMDksIDB4MjQwNTAwMDEsIDB4YzAwNGRkYiwgMHgyNDA2MDQwMCwKLTB4MjQwNDAwMTgsIDB4MjQwNTAwMDEsIDB4YzAwNGRkYiwgMHgyNDA2MDAyMCwKLTB4MjQwNDAwMTgsIDB4MjQwNTAwMDEsIDB4YzAwNGRkYiwgMHgyNDA2MjAwMCwKLTB4M2MwMjQwMDAsIDB4MjQyMTAyNCwgMHgxMDQwMDEyMywgMHgzYzAyMjAwMCwKLTB4MjQyMTAyNCwgMHgxMDQwMDAwNCwgMHgwLCAweDNjMDEwMDAxLAotMHgxMDAwMDAwMywgMHhhYzMwNmYxYywgMHgzYzAxMDAwMSwgMHhhYzIwNmYxYywKLTB4M2MwMzAwMDEsIDB4OGM2MzZmMzQsIDB4MjQwMjAwMDUsIDB4MTQ2MjAwZjksCi0weDAsIDB4M2MwMjAwMDEsIDB4OGM0MjZmMWMsIDB4MTA0MDAwNjcsCi0weDNjMDIwMDA0LCAweDI0MjEwMjQsIDB4MTA0MDAwMTEsIDB4YTdhMDAwMTgsCi0weDNjMDIwMDA4LCAweDI0MjEwMjQsIDB4MTA0MDAwMDIsIDB4MjQwMjAyMDAsCi0weGE3YTIwMDE4LCAweDNjMDIwMDEwLCAweDI0MjEwMjQsIDB4MTA0MDAwMDQsCi0weDAsIDB4OTdhMjAwMTgsIDB4MzQ0MjAxMDAsIDB4YTdhMjAwMTgsCi0weDk3YTYwMDE4LCAweDI0MDQwMDA5LCAweDEwMDAwMDA0LCAweDI4MjEsCi0weDI0MDQwMDA5LCAweDI4MjEsIDB4MzAyMSwgMHhjMDA0ZGRiLAotMHgwLCAweDI0MDIwMDAxLCAweGE3YTIwMDFhLCAweDNjMDIwMDA4LAotMHgyNDIxMDI0LCAweDEwNDAwMDBjLCAweDNjMDIwMDAyLCAweDI0MjEwMjQsCi0weDEwNDAwMDAyLCAweDI0MDIwMTAxLCAweGE3YTIwMDFhLCAweDNjMDIwMDAxLAotMHgyNDIxMDI0LCAweDEwNDAwMDA1LCAweDNjMDIwMDEwLCAweDk3YTIwMDFhLAotMHgzNDQyMDA0MCwgMHhhN2EyMDAxYSwgMHgzYzAyMDAxMCwgMHgyNDIxMDI0LAotMHgxMDQwMDAwZSwgMHgzYzAyMDAwMiwgMHgyNDIxMDI0LCAweDEwNDAwMDA1LAotMHgzYzAyMDAwMSwgMHg5N2EyMDAxYSwgMHgzNDQyMDA4MCwgMHhhN2EyMDAxYSwKLTB4M2MwMjAwMDEsIDB4MjQyMTAyNCwgMHgxMDQwMDAwNSwgMHgzYzAzMDBhMCwKLTB4OTdhMjAwMWEsIDB4MzQ0MjAwMjAsIDB4YTdhMjAwMWEsIDB4M2MwMzAwYTAsCi0weDI0MzEwMjQsIDB4NTQ0MzAwMDQsIDB4M2MwMjAwMjAsIDB4OTdhMjAwMWEsCi0weDEwMDAwMDBjLCAweDM0NDIwNDAwLCAweDI0MjEwMjQsIDB4NTA0MDAwMDQsCi0weDNjMDIwMDgwLCAweDk3YTIwMDFhLCAweDEwMDAwMDA2LCAweDM0NDIwODAwLAotMHgyNDIxMDI0LCAweDEwNDAwMDA0LCAweDAsIDB4OTdhMjAwMWEsCi0weDM0NDIwYzAwLCAweGE3YTIwMDFhLCAweDk3YTYwMDFhLCAweDI0MDQwMDA0LAotMHhjMDA0ZGRiLCAweDI4MjEsIDB4M2MwMjAwMDQsIDB4MjQyMTAyNCwKLTB4MTA0MDAwMDQsIDB4YTdhMDAwMWMsIDB4MzI0MjUwMDAsIDB4MTQ0MDAwMDQsCi0weDAsIDB4MzI0MjQwMDAsIDB4MTA0MDAwMDUsIDB4MjAyMSwKLTB4YzAwNGNmOSwgMHgyNDAyMDIxLCAweDEwMDAwMDk2LCAweDAsCi0weDk3YTYwMDFjLCAweDI4MjEsIDB4MzRjNjEyMDAsIDB4YzAwNGRkYiwKLTB4YTdhNjAwMWMsIDB4MTAwMDAwOGYsIDB4MCwgMHgyNDIxMDI0LAotMHgxMDQwMDAwNCwgMHhhN2EwMDAxOCwgMHgzMjQyNTAwMCwgMHgxNDQwMDAwNCwKLTB4MCwgMHgzMjQyNDAwMCwgMHgxMDQwMDAwNSwgMHgzYzAyMDAxMCwKLTB4YzAwNGNmOSwgMHgyNDAyMDIxLCAweDEwMDAwMDE5LCAweGE3YTAwMDFhLAotMHgyNDIxMDI0LCAweDEwNDAwMDA0LCAweDAsIDB4OTdhMjAwMTgsCi0weDEwMDAwMDA0LCAweGE3YTIwMDE4LCAweDk3YTIwMDE4LCAweDM0NDIwMTAwLAotMHhhN2EyMDAxOCwgMHgzYzAyMDAwMSwgMHgyNDIxMDI0LCAweDEwNDAwMDA0LAotMHgwLCAweDk3YTIwMDE4LCAweDEwMDAwMDA0LCAweGE3YTIwMDE4LAotMHg5N2EyMDAxOCwgMHgzNDQyMjAwMCwgMHhhN2EyMDAxOCwgMHg5N2E2MDAxOCwKLTB4MjAyMSwgMHhjMDA0ZGRiLCAweDI4MjEsIDB4YTdhMDAwMWEsCi0weDgwMjEsIDB4YzAwNGQ3OCwgMHgyNDA0MDAwMSwgMHgyNjEwMDAwMSwKLTB4MmUwMjAwMjAsIDB4MTQ0MGZmZmIsIDB4MCwgMHhjMDA0ZDc4LAotMHgyMDIxLCAweGMwMDRkNzgsIDB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwKLTB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgMHgyMDIxLCAweDI0MTAwMDEwLAotMHgzMjAyMDAwMSwgMHgxMDQwMDAwMiwgMHgyMDIxLCAweDI0MDQwMDAxLAotMHhjMDA0ZDc4LCAweDEwODA0MiwgMHgxNjAwZmZmYSwgMHgzMjAyMDAwMSwKLTB4MjQxMDAwMTAsIDB4YzAwNGQ3OCwgMHgyMDIxLCAweDEwODA0MiwKLTB4MTYwMGZmZmMsIDB4MCwgMHhjMDA0ZGI5LCAweDM0MTA4MDAwLAotMHhjMDA0ZGI5LCAweDAsIDB4YzAwNGQ1OCwgMHgwLAotMHg1MDQwMDAwNSwgMHgxMDgwNDIsIDB4OTdhMjAwMWEsIDB4NTAxMDI1LAotMHhhN2EyMDAxYSwgMHgxMDgwNDIsIDB4MTYwMGZmZjcsIDB4MCwKLTB4YzAwNGRiOSwgMHg4MDIxLCAweGE3YTAwMDFhLCAweGMwMDRkNzgsCi0weDI0MDQwMDAxLCAweDI2MTAwMDAxLCAweDJlMDIwMDIwLCAweDE0NDBmZmZiLAotMHgwLCAweGMwMDRkNzgsIDB4MjAyMSwgMHhjMDA0ZDc4LAotMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAweDI0MDQwMDAxLCAweGMwMDRkNzgsCi0weDIwMjEsIDB4MjQxMDAwMTAsIDB4MzIwMjAwMDEsIDB4MTA0MDAwMDIsCi0weDIwMjEsIDB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgMHgxMDgwNDIsCi0weDE2MDBmZmZhLCAweDMyMDIwMDAxLCAweDI0MTAwMDEwLCAweGMwMDRkNzgsCi0weDIwMjEsIDB4MTA4MDQyLCAweDE2MDBmZmZjLCAweDAsCi0weGMwMDRkYjksIDB4MzQxMDgwMDAsIDB4YzAwNGRiOSwgMHgwLAotMHhjMDA0ZDU4LCAweDAsIDB4NTA0MDAwMDUsIDB4MTA4MDQyLAotMHg5N2EyMDAxYSwgMHg1MDEwMjUsIDB4YTdhMjAwMWEsIDB4MTA4MDQyLAotMHgxNjAwZmZmNywgMHgwLCAweGMwMDRkYjksIDB4MCwKLTB4M2MwNDAwMDEsIDB4MjQ4NDZiY2MsIDB4OTdhNjAwMTgsIDB4OTdhNzAwMWEsCi0weDNjMDIwMDAxLCAweDhjNDI2ZDk4LCAweDNjMDMwMDAxLCAweDhjNjM2ZjFjLAotMHgzYzA1MDAwZCwgMHgzNGE1MDIwNSwgMHhhZmEyMDAxMCwgMHhjMDAyYjNiLAotMHhhZmEzMDAxNCwgMHg4ZjgzMDA1NCwgMHgyNDAyMDAwNCwgMHgzYzAxMDAwMSwKLTB4YWMyMjZkZDQsIDB4M2MwMTAwMDEsIDB4MTAwMDAwMTcsIDB4YWMyMzZmMzgsCi0weDhmODMwMDU0LCAweDNjMDIwMDAxLCAweDhjNDI2ZjM4LCAweDI0NjNmZjljLAotMHg0MzEwMjMsIDB4MmM0MjAwNjQsIDB4MTQ0MDAwMGYsIDB4MCwKLTB4OGY4MjAyMjAsIDB4MjQwMzAwMDUsIDB4M2MwMTAwMDEsIDB4YWMyMzZkZDQsCi0weDNjMDNmNzAwLCAweDQzMTAyNSwgMHgxMDAwMDAwNywgMHhhZjgyMDIyMCwKLTB4MjQwMjAwMDYsIDB4M2MwMTAwMDEsIDB4YWMyMjZkZDQsIDB4MjQwMjAwMTEsCi0weDNjMDEwMDAxLCAweGFjMjI2ZGQwLCAweDhmYmYwMDM0LCAweDhmYjIwMDMwLAotMHg4ZmIxMDAyYywgMHg4ZmIwMDAyOCwgMHgzZTAwMDA4LCAweDI3YmQwMDM4LAotMHgyN2JkZmZkOCwgMHhhZmIwMDAxOCwgMHg4MDgwMjEsIDB4YWZiMTAwMWMsCi0weDg4MjEsIDB4MzIwMjQwMDAsIDB4MTA0MDAwMTMsIDB4YWZiZjAwMjAsCi0weDNjMDIwMDEwLCAweDIwMjEwMjQsIDB4MmM0MjAwMDEsIDB4MjEwMjMsCi0weDMwNDM0MTAwLCAweDNjMDIwMDAxLCAweDIwMjEwMjQsIDB4MTQ0MDAwMDYsCi0weDM0NzE0MDAwLCAweDNjMDIwMDAyLCAweDIwMjEwMjQsIDB4MTQ0MDAwMDIsCi0weDM0NzE2MDAwLCAweDM0NzE0MDQwLCAweDIwMjEsIDB4MjgyMSwKLTB4MTAwMDAwMzYsIDB4MjIwMzAyMSwgMHgzMjAyMTAwMCwgMHgxMDQwMDAzNSwKLTB4MjAyMSwgMHgyODIxLCAweGMwMDRkZGIsIDB4MjQwNjAwNDAsCi0weDI0MDQwMDE4LCAweDI4MjEsIDB4YzAwNGRkYiwgMHgyNDA2MGMwMCwKLTB4MjQwNDAwMTcsIDB4MjgyMSwgMHhjMDA0ZGRiLCAweDI0MDYwNDAwLAotMHgyNDA0MDAxNiwgMHgyODIxLCAweGMwMDRkZGIsIDB4MjQwNjAwMDYsCi0weDI0MDQwMDE3LCAweDI4MjEsIDB4YzAwNGRkYiwgMHgyNDA2MjUwMCwKLTB4MjQwNDAwMTYsIDB4MjgyMSwgMHhjMDA0ZGRiLCAweDI0MDYwMDA2LAotMHgyNDA0MDAxNywgMHgyODIxLCAweGMwMDRkZGIsIDB4MjQwNjQ2MDAsCi0weDI0MDQwMDE2LCAweDI4MjEsIDB4YzAwNGRkYiwgMHgyNDA2MDAwNiwKLTB4MjQwNDAwMTcsIDB4MjgyMSwgMHhjMDA0ZGRiLCAweDI0MDY2NzAwLAotMHgyNDA0MDAxNiwgMHgyODIxLCAweGMwMDRkZGIsIDB4MjQwNjAwMDYsCi0weDI0MDQwMDFmLCAweDI4MjEsIDB4YzAwNGRkYiwgMHgyNDA2MDAxMCwKLTB4MjQwNDAwMDksIDB4MjgyMSwgMHhjMDA0ZGRiLCAweDI0MDYxNTAwLAotMHgyNDA0MDAwOSwgMHgyODIxLCAweDI0MDYxZDAwLCAweGMwMDRkZGIsCi0weDAsIDB4M2MwNDAwMDEsIDB4MjQ4NDZiZjAsIDB4M2MwNTAwMGUsCi0weDM0YTUwMTAwLCAweDIwMDMwMjEsIDB4MjIwMzgyMSwgMHhhZmEwMDAxMCwKLTB4YzAwMmIzYiwgMHhhZmEwMDAxNCwgMHg4ZmJmMDAyMCwgMHg4ZmIxMDAxYywKLTB4OGZiMDAwMTgsIDB4M2UwMDAwOCwgMHgyN2JkMDAyOCwgMHg4Zjg1MDA0NCwKLTB4OGY4MjAwNDQsIDB4M2MwMzAwMDEsIDB4NDMxMDI1LCAweDNjMDMwMDA4LAotMHhhZjgyMDA0NCwgMHg4Zjg0MDA1NCwgMHg4ZjgyMDA1NCwgMHhhMzI4MjQsCi0weDEwMDAwMDAyLCAweDI0ODQwMDAxLCAweDhmODIwMDU0LCAweDgyMTAyMywKLTB4MmM0MjAwMDIsIDB4MTQ0MGZmZmMsIDB4MCwgMHg4ZjgyMDA0NCwKLTB4M2MwM2ZmZmUsIDB4MzQ2M2ZmZmYsIDB4NDMxMDI0LCAweGFmODIwMDQ0LAotMHg4ZjgzMDA1NCwgMHg4ZjgyMDA1NCwgMHgxMDAwMDAwMiwgMHgyNDYzMDAwMSwKLTB4OGY4MjAwNTQsIDB4NjIxMDIzLCAweDJjNDIwMDAyLCAweDE0NDBmZmZjLAotMHgwLCAweDNlMDAwMDgsIDB4YTAxMDIxLCAweDhmODMwMDQ0LAotMHgzYzAyZmZmMCwgMHgzNDQyZmZmZiwgMHg0MjQ4MCwgMHg2MjE4MjQsCi0weDNjMDIwMDAyLCAweDgyMjAyNSwgMHg2NDE4MjUsIDB4YWY4MzAwNDQsCi0weDhmODIwMDQ0LCAweDNjMDNmZmZlLCAweDM0NjNmZmZmLCAweDQzMTAyNCwKLTB4YWY4MjAwNDQsIDB4OGY4MzAwNTQsIDB4OGY4MjAwNTQsIDB4MTAwMDAwMDIsCi0weDI0NjMwMDAxLCAweDhmODIwMDU0LCAweDYyMTAyMywgMHgyYzQyMDAwMiwKLTB4MTQ0MGZmZmMsIDB4MCwgMHg4ZjgyMDA0NCwgMHgzYzAzMDAwMSwKLTB4NDMxMDI1LCAweGFmODIwMDQ0LCAweDhmODMwMDU0LCAweDhmODIwMDU0LAotMHgxMDAwMDAwMiwgMHgyNDYzMDAwMSwgMHg4ZjgyMDA1NCwgMHg2MjEwMjMsCi0weDJjNDIwMDAyLCAweDE0NDBmZmZjLCAweDAsIDB4M2UwMDAwOCwKLTB4MCwgMHg4ZjgyMDA0NCwgMHgyNDAzZmY3ZiwgMHg0MzEwMjQsCi0weGFmODIwMDQ0LCAweDhmODMwMDU0LCAweDhmODIwMDU0LCAweDEwMDAwMDAyLAotMHgyNDYzMDAwMSwgMHg4ZjgyMDA1NCwgMHg2MjEwMjMsIDB4MmM0MjAwMDIsCi0weDE0NDBmZmZjLCAweDAsIDB4OGY4MjAwNDQsIDB4MzQ0MjAwODAsCi0weGFmODIwMDQ0LCAweDhmODMwMDU0LCAweDhmODIwMDU0LCAweDEwMDAwMDAyLAotMHgyNDYzMDAwMSwgMHg4ZjgyMDA1NCwgMHg2MjEwMjMsIDB4MmM0MjAwMDIsCi0weDE0NDBmZmZjLCAweDAsIDB4M2UwMDAwOCwgMHgwLAotMHg4ZjgyMDA0NCwgMHgzYzAzZmZmMCwgMHgzNDYzZmZmZiwgMHg0MzEwMjQsCi0weGFmODIwMDQ0LCAweDhmODIwMDQ0LCAweDNjMDMwMDAxLCAweDQzMTAyNSwKLTB4YWY4MjAwNDQsIDB4OGY4MzAwNTQsIDB4OGY4MjAwNTQsIDB4MTAwMDAwMDIsCi0weDI0NjMwMDAxLCAweDhmODIwMDU0LCAweDYyMTAyMywgMHgyYzQyMDAwMiwKLTB4MTQ0MGZmZmMsIDB4MCwgMHg4ZjgyMDA0NCwgMHgzYzAzZmZmZSwKLTB4MzQ2M2ZmZmYsIDB4NDMxMDI0LCAweGFmODIwMDQ0LCAweDhmODMwMDU0LAotMHg4ZjgyMDA1NCwgMHgxMDAwMDAwMiwgMHgyNDYzMDAwMSwgMHg4ZjgyMDA1NCwKLTB4NjIxMDIzLCAweDJjNDIwMDAyLCAweDE0NDBmZmZjLCAweDAsCi0weDNlMDAwMDgsIDB4MCwgMHgyN2JkZmZjOCwgMHhhZmIzMDAyNCwKLTB4ODA5ODIxLCAweGFmYmUwMDJjLCAweGEwZjAyMSwgMHhhZmIyMDAyMCwKLTB4YzA5MDIxLCAweDMzYzJmZmZmLCAweGFmYmYwMDMwLCAweGFmYjUwMDI4LAotMHhhZmIxMDAxYywgMHhhZmIwMDAxOCwgMHgxNDQwMDAzNCwgMHhhN2IyMDAxMCwKLTB4MzI3MWZmZmYsIDB4MjdiMjAwMTAsIDB4ODAyMSwgMHhjMDA0ZDc4LAotMHgyNDA0MDAwMSwgMHgyNjEwMDAwMSwgMHgyZTAyMDAyMCwgMHgxNDQwZmZmYiwKLTB4MCwgMHhjMDA0ZDc4LCAweDIwMjEsIDB4YzAwNGQ3OCwKLTB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgMHgyMDIxLCAweGMwMDRkNzgsCi0weDI0MDQwMDAxLCAweDI0MTAwMDEwLCAweDMyMDIwMDAxLCAweDEwNDAwMDAyLAotMHgyMDIxLCAweDI0MDQwMDAxLCAweGMwMDRkNzgsIDB4MTA4MDQyLAotMHgxNjAwZmZmYSwgMHgzMjAyMDAwMSwgMHgyNDEwMDAxMCwgMHgyMzAxMDI0LAotMHgxMDQwMDAwMiwgMHgyMDIxLCAweDI0MDQwMDAxLCAweGMwMDRkNzgsCi0weDEwODA0MiwgMHgxNjAwZmZmYSwgMHgyMzAxMDI0LCAweGMwMDRkNzgsCi0weDI0MDQwMDAxLCAweGMwMDRkNzgsIDB4MjAyMSwgMHgzNDEwODAwMCwKLTB4OTY0MjAwMDAsIDB4NTAxMDI0LCAweDEwNDAwMDAyLCAweDIwMjEsCi0weDI0MDQwMDAxLCAweGMwMDRkNzgsIDB4MTA4MDQyLCAweDEyMDAwMDc1LAotMHgwLCAweDEwMDBmZmY2LCAweDAsIDB4MzI3NWZmZmYsCi0weDI3YjEwMDEwLCAweGE3YTAwMDEwLCAweDgwMjEsIDB4YzAwNGQ3OCwKLTB4MjQwNDAwMDEsIDB4MjYxMDAwMDEsIDB4MmUwMjAwMjAsIDB4MTQ0MGZmZmIsCi0weDAsIDB4YzAwNGQ3OCwgMHgyMDIxLCAweGMwMDRkNzgsCi0weDI0MDQwMDAxLCAweGMwMDRkNzgsIDB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwKLTB4MjAyMSwgMHgyNDEwMDAxMCwgMHgzMjAyMDAwMSwgMHgxMDQwMDAwMiwKLTB4MjAyMSwgMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAweDEwODA0MiwKLTB4MTYwMGZmZmEsIDB4MzIwMjAwMDEsIDB4MjQxMDAwMTAsIDB4MmIwMTAyNCwKLTB4MTA0MDAwMDIsIDB4MjAyMSwgMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LAotMHgxMDgwNDIsIDB4MTYwMGZmZmEsIDB4MmIwMTAyNCwgMHhjMDA0ZGI5LAotMHgzNDEwODAwMCwgMHhjMDA0ZGI5LCAweDAsIDB4YzAwNGQ1OCwKLTB4MCwgMHg1MDQwMDAwNSwgMHgxMDgwNDIsIDB4OTYyMjAwMDAsCi0weDUwMTAyNSwgMHhhNjIyMDAwMCwgMHgxMDgwNDIsIDB4MTYwMGZmZjcsCi0weDAsIDB4YzAwNGRiOSwgMHgwLCAweDMzYzVmZmZmLAotMHgyNDAyMDAwMSwgMHg1NGEyMDAwNCwgMHgyNDAyMDAwMiwgMHg5N2EyMDAxMCwKLTB4MTAwMDAwMDYsIDB4NTIxMDI1LCAweDE0YTIwMDA2LCAweDMyNzFmZmZmLAotMHg5N2EyMDAxMCwgMHgxMjE4MjcsIDB4NDMxMDI0LCAweGE3YTIwMDEwLAotMHgzMjcxZmZmZiwgMHgyN2IyMDAxMCwgMHg4MDIxLCAweGMwMDRkNzgsCi0weDI0MDQwMDAxLCAweDI2MTAwMDAxLCAweDJlMDIwMDIwLCAweDE0NDBmZmZiLAotMHgwLCAweGMwMDRkNzgsIDB4MjAyMSwgMHhjMDA0ZDc4LAotMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAweDIwMjEsIDB4YzAwNGQ3OCwKLTB4MjQwNDAwMDEsIDB4MjQxMDAwMTAsIDB4MzIwMjAwMDEsIDB4MTA0MDAwMDIsCi0weDIwMjEsIDB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgMHgxMDgwNDIsCi0weDE2MDBmZmZhLCAweDMyMDIwMDAxLCAweDI0MTAwMDEwLCAweDIzMDEwMjQsCi0weDEwNDAwMDAyLCAweDIwMjEsIDB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwKLTB4MTA4MDQyLCAweDE2MDBmZmZhLCAweDIzMDEwMjQsIDB4YzAwNGQ3OCwKLTB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgMHgyMDIxLCAweDM0MTA4MDAwLAotMHg5NjQyMDAwMCwgMHg1MDEwMjQsIDB4MTA0MDAwMDIsIDB4MjAyMSwKLTB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgMHgxMDgwNDIsIDB4MTYwMGZmZjgsCi0weDAsIDB4YzAwNGRiOSwgMHgwLCAweDhmYmYwMDMwLAotMHg4ZmJlMDAyYywgMHg4ZmI1MDAyOCwgMHg4ZmIzMDAyNCwgMHg4ZmIyMDAyMCwKLTB4OGZiMTAwMWMsIDB4OGZiMDAwMTgsIDB4M2UwMDAwOCwgMHgyN2JkMDAzOCwKLTB4MCwgMHgwLCAweDAsIDB4MjdiZGZmZTgsCi0weGFmYmYwMDEwLCAweDhlZTMwNGI4LCAweDI0MDIwMDA4LCAweDE0NjIwMWUwLAotMHgwLCAweDNjMDIwMDAxLCAweDhjNDI2ZjFjLCAweDE0NDAwMDA1LAotMHgwLCAweGMwMDNkYWYsIDB4OGY4NDAyMjQsIDB4MTAwMDAxZDgsCi0weDAsIDB4OGY4MjAyMjAsIDB4M2MwMzAwMDgsIDB4NDMxMDI0LAotMHgxMDQwMDAyNiwgMHgyNDAyMDAwMSwgMHg4Zjg0MDIyNCwgMHg4ZjgyMDIyMCwKLTB4M2MwMzA0MDAsIDB4NDMxMDI0LCAweDEwNDAwMDA2LCAweDAsCi0weDNjMDEwMDAyLCAweGFjMjA4ZmEwLCAweDNjMDEwMDAyLCAweDEwMDAwMDBiLAotMHhhYzIwOGZjMCwgMHgzYzAzMDAwMiwgMHgyNDYzOGZhMCwgMHg4YzYyMDAwMCwKLTB4MjQ0MjAwMDEsIDB4YWM2MjAwMDAsIDB4MmM0MjAwMDIsIDB4MTQ0MDAwMDMsCi0weDI0MDIwMDAxLCAweDNjMDEwMDAyLCAweGFjMjI4ZmMwLCAweDNjMDIwMDAyLAotMHg4YzQyOGZjMCwgMHgxMDQwMDAwNiwgMHgzMDgyMDA0MCwgMHgxMDQwMDAwNCwKLTB4MjQwMjAwMDEsIDB4M2MwMTAwMDIsIDB4MTAwMDAwMDMsIDB4YWMyMjhmYzQsCi0weDNjMDEwMDAyLCAweGFjMjA4ZmM0LCAweDNjMDEwMDAyLCAweGFjMjQ4ZjljLAotMHgzYzAxMDAwMiwgMHgxMDAwMDAwYiwgMHhhYzIwOGZkMCwgMHgzYzAxMDAwMiwKLTB4YWMyMjhmZDAsIDB4M2MwMTAwMDIsIDB4YWMyMDhmYzAsIDB4M2MwMTAwMDIsCi0weGFjMjA4ZmEwLCAweDNjMDEwMDAyLCAweGFjMjA4ZmM0LCAweDNjMDEwMDAyLAotMHhhYzIwOGY5YywgMHgzYzAzMDAwMiwgMHg4YzYzOGY5MCwgMHgzYzAyMDAwMiwKLTB4OGM0MjhmOTQsIDB4NTA2MjAwMDQsIDB4MjQ2M2ZmZmYsIDB4M2MwMTAwMDIsCi0weGFjMjM4Zjk0LCAweDI0NjNmZmZmLCAweDJjNjIwMDBlLCAweDEwNDAwMTk0LAotMHgzMTA4MCwgMHgzYzAxMDAwMSwgMHgyMjA4MjEsIDB4OGMyMjZjMDAsCi0weDQwMDAwOCwgMHgwLCAweDI0MDIwMDAyLCAweDNjMDEwMDAyLAotMHhhYzIwOGZjMCwgMHgzYzAxMDAwMiwgMHhhYzIwOGZhMCwgMHgzYzAxMDAwMiwKLTB4YWMyMDhmOWMsIDB4M2MwMTAwMDIsIDB4YWMyMDhmYzQsIDB4M2MwMTAwMDIsCi0weGFjMjA4ZmI4LCAweDNjMDEwMDAyLCAweGFjMjA4ZmIwLCAweGFmODAwMjI0LAotMHgzYzAxMDAwMiwgMHhhYzIyOGY5MCwgMHgzYzAyMDAwMiwgMHg4YzQyOGZkMCwKLTB4MTQ0MDAwNGYsIDB4M2MwMmZkZmYsIDB4MzQ0MmZmZmYsIDB4YzAwM2RhZiwKLTB4MjgyYTAyNCwgMHhhZjgwMDIwNCwgMHg4ZjgyMDIwMCwgMHgyNDAzZmZmZCwKLTB4NDMxMDI0LCAweGFmODIwMjAwLCAweDNjMDEwMDAyLCAweGFjMjA4ZmUwLAotMHg4ZjgzMDA1NCwgMHgzYzAyMDAwMiwgMHg4YzQyOGZiOCwgMHgyNDA0MDAwMSwKLTB4M2MwMTAwMDIsIDB4YWMyNDhmY2MsIDB4MjQ0MjAwMDEsIDB4M2MwMTAwMDIsCi0weGFjMjI4ZmI4LCAweDJjNDIwMDA0LCAweDNjMDEwMDAyLCAweGFjMjM4ZmI0LAotMHgxNDQwMDAwNiwgMHgyNDAyMDAwMywgMHgzYzAxMDAwMSwgMHhhYzI0NmQ5YywKLTB4M2MwMTAwMDIsIDB4MTAwMDAxNWUsIDB4YWMyMDhmYjgsIDB4M2MwMTAwMDIsCi0weDEwMDAwMTViLCAweGFjMjI4ZjkwLCAweDhmODMwMDU0LCAweDNjMDIwMDAyLAotMHg4YzQyOGZiNCwgMHgyNDYzZDhmMCwgMHg0MzEwMjMsIDB4MmM0MjI3MTAsCi0weDE0NDAwMDAzLCAweDI0MDIwMDA0LCAweDNjMDEwMDAyLCAweGFjMjI4ZjkwLAotMHgzYzAyMDAwMiwgMHg4YzQyOGZkMCwgMHgxNDQwMDAyMSwgMHgzYzAyZmRmZiwKLTB4MzQ0MmZmZmYsIDB4MTAwMDAxNGEsIDB4MjgyYTAyNCwgMHgzYzA0MDAwMSwKLTB4OGM4NDZmMjAsIDB4M2MwMTAwMDIsIDB4YzAwNTA4NCwgMHhhYzIwOGZhOCwKLTB4M2MwMjAwMDIsIDB4OGM0MjhmZGMsIDB4YWY4MjAyMDQsIDB4M2MwMjAwMDIsCi0weDhjNDI4ZmQwLCAweDE0NDAwMDEyLCAweDNjMDNmZGZmLCAweDhmODIwMjA0LAotMHgzNDYzZmZmZiwgMHgzMDQyMDAzMCwgMHgxNDQwMDEyZiwgMHgyODNhMDI0LAotMHgzYzAzMDAwMiwgMHg4YzYzOGZkYywgMHgyNDAyMDAwNSwgMHgzYzAxMDAwMiwKLTB4YWMyMjhmOTAsIDB4M2MwMTAwMDIsIDB4MTAwMDAxMzEsIDB4YWMyMzhmZTAsCi0weDNjMDIwMDAyLCAweDhjNDI4ZmQwLCAweDEwNDAwMDEwLCAweDNjMDJmZGZmLAotMHgzYzAyMDAwMSwgMHg4YzQyNmUzYywgMHgyNDQyMDAwMSwgMHgzYzAxMDAwMSwKLTB4YWMyMjZlM2MsIDB4MmM0MjAwMDIsIDB4MTQ0MDAxMjUsIDB4MjQwMjAwMDEsCi0weDNjMDEwMDAxLCAweGFjMjI2ZTQ0LCAweDNjMDEwMDAxLCAweGFjMjA2ZTNjLAotMHgzYzAxMDAwMSwgMHgxMDAwMDExZSwgMHhhYzIyNmQ5YywgMHgzYzAzMDAwMiwKLTB4OGM2MzhmYzAsIDB4MzQ0MmZmZmYsIDB4MTA2MDAxMTksIDB4MjgyYTAyNCwKLTB4M2MwMjAwMDIsIDB4OGM0MjhmOWMsIDB4MTA0MDAxMTUsIDB4MCwKLTB4M2MwMTAwMDIsIDB4YWMyMjhmYzgsIDB4MjQwMjAwMDMsIDB4M2MwMTAwMDIsCi0weGFjMjI4ZmEwLCAweDEwMDAwMGI4LCAweDI0MDIwMDA2LCAweDNjMDEwMDAyLAotMHhhYzIwOGZhOCwgMHg4ZjgyMDIwNCwgMHgzNDQyMDA0MCwgMHhhZjgyMDIwNCwKLTB4M2MwMjAwMDIsIDB4OGM0MjhmZTAsIDB4MjQwMzAwMDcsIDB4M2MwMTAwMDIsCi0weGFjMjM4ZjkwLCAweDM0NDIwMDQwLCAweDNjMDEwMDAyLCAweGFjMjI4ZmUwLAotMHgzYzAyMDAwMiwgMHg4YzQyOGZjMCwgMHgxMDQwMDAwNSwgMHgwLAotMHgzYzAyMDAwMiwgMHg4YzQyOGY5YywgMHgxMDQwMDBmMCwgMHgyNDAyMDAwMiwKLTB4M2MwNTAwMDIsIDB4MjRhNThmYTAsIDB4OGNhMjAwMDAsIDB4MmM0MjRlMjEsCi0weDEwNDAwMGVhLCAweDI0MDIwMDAyLCAweDNjMDIwMDAyLCAweDhjNDI4ZmM0LAotMHgxMDQwMDBlZiwgMHgyNDA0ZmZiZiwgMHgzYzAyMDAwMiwgMHg4YzQyOGY5YywKLTB4M2MwMzAwMDIsIDB4OGM2MzhmYzgsIDB4NDQxMDI0LCAweDY0MTgyNCwKLTB4MTA0MzAwMDQsIDB4MjQwMjAwMDEsIDB4M2MwMTAwMDIsIDB4MTAwMDAwZTQsCi0weGFjMjI4ZjkwLCAweDI0MDIwMDAzLCAweGFjYTIwMDAwLCAweDI0MDIwMDA4LAotMHgzYzAxMDAwMiwgMHhhYzIyOGY5MCwgMHgzYzAyMDAwMiwgMHg4YzQyOGZjYywKLTB4MTA0MDAwMGMsIDB4MjQwMjAwMDEsIDB4M2MwNDAwMDIsIDB4YzAwNTA5MSwKLTB4OGM4NDhmOWMsIDB4M2MwMjAwMDIsIDB4OGM0MjhmZTgsIDB4MTQ0MDAwMDUsCi0weDI0MDIwMDAxLCAweDNjMDIwMDAyLCAweDhjNDI4ZmU0LCAweDEwNDAwMDA2LAotMHgyNDAyMDAwMSwgMHgzYzAxMDAwMSwgMHhhYzIyNmQ5YywgMHgzYzAxMDAwMiwKLTB4MTAwMDAwY2IsIDB4YWMyMDhmYjgsIDB4M2MwMjAwMDIsIDB4OGM0MjhmYjAsCi0weDNjMDMwMDAyLCAweDhjNjM4ZjljLCAweDJjNDIwMDAxLCAweDIxMGMwLAotMHgzMDYzMDAwOCwgMHgzYzAxMDAwMiwgMHhhYzIyOGZiMCwgMHgzYzAxMDAwMiwKLTB4YWMyMzhmYWMsIDB4OGY4MzAwNTQsIDB4MjQwMjAwMDksIDB4M2MwMTAwMDIsCi0weGFjMjI4ZjkwLCAweDNjMDEwMDAyLCAweDEwMDAwMGI5LCAweGFjMjM4ZmI0LAotMHg4ZjgzMDA1NCwgMHgzYzAyMDAwMiwgMHg4YzQyOGZiNCwgMHgyNDYzZDhmMCwKLTB4NDMxMDIzLCAweDJjNDIyNzEwLCAweDE0NDAwMDlmLCAweDAsCi0weDNjMDIwMDAyLCAweDhjNDI4ZmMwLCAweDEwNDAwMDA1LCAweDAsCi0weDNjMDIwMDAyLCAweDhjNDI4ZjljLCAweDEwNDAwMGEwLCAweDI0MDIwMDAyLAotMHgzYzAzMDAwMiwgMHgyNDYzOGZhMCwgMHg4YzYyMDAwMCwgMHgyYzQyNGUyMSwKLTB4MTA0MDAwOWEsIDB4MjQwMjAwMDIsIDB4M2MwMjAwMDIsIDB4OGM0MjhmY2MsCi0weDEwNDAwMDBlLCAweDAsIDB4M2MwMjAwMDIsIDB4OGM0MjhmOWMsCi0weDNjMDEwMDAyLCAweGFjMjA4ZmNjLCAweDMwNDIwMDgwLCAweDEwNDAwMDJmLAotMHgyNDAyMDAwYywgMHg4ZjgyMDIwNCwgMHgzMDQyMDA4MCwgMHgxNDQwMDAwYywKLTB4MjQwMjAwMDMsIDB4MTAwMDAwMjksIDB4MjQwMjAwMGMsIDB4M2MwMjAwMDIsCi0weDhjNDI4ZjljLCAweDMwNDIwMDgwLCAweDE0NDAwMDA1LCAweDI0MDIwMDAzLAotMHg4ZjgyMDIwNCwgMHgzMDQyMDA4MCwgMHgxMDQwMDAxZiwgMHgyNDAyMDAwMywKLTB4YWM2MjAwMDAsIDB4MjQwMjAwMGEsIDB4M2MwMTAwMDIsIDB4YWMyMjhmOTAsCi0weDNjMDQwMDAyLCAweDI0ODQ4ZmQ4LCAweDhjODIwMDAwLCAweDNjMDMwMDAyLAotMHg4YzYzOGZiMCwgMHg0MzEwMjUsIDB4YWY4MjAyMDQsIDB4OGM4MzAwMDAsCi0weDNjMDQwMDAyLCAweDhjODQ4ZmIwLCAweDI0MDIwMDBiLCAweDNjMDEwMDAyLAotMHhhYzIyOGY5MCwgMHg2NDE4MjUsIDB4M2MwMTAwMDIsIDB4YWMyMzhmZTAsCi0weDNjMDUwMDAyLCAweDI0YTU4ZmEwLCAweDhjYTIwMDAwLCAweDJjNDI0ZTIxLAotMHgxMDQwMDA2NiwgMHgyNDAyMDAwMiwgMHgzYzAyMDAwMiwgMHg4YzQyOGZkMCwKLTB4MTA0MDAwMDUsIDB4MCwgMHgyNDAyMDAwYywgMHgzYzAxMDAwMiwKLTB4MTAwMDAwNjcsIDB4YWMyMjhmOTAsIDB4M2MwMjAwMDIsIDB4OGM0MjhmYzAsCi0weDEwNDAwMDYzLCAweDAsIDB4M2MwNDAwMDIsIDB4OGM4NDhmOWMsCi0weDEwODAwMDU1LCAweDMwODIwMDA4LCAweDNjMDMwMDAyLCAweDhjNjM4ZmFjLAotMHgxMDYyMDA1YiwgMHgyNDAyMDAwMywgMHgzYzAxMDAwMiwgMHhhYzI0OGZjOCwKLTB4YWNhMjAwMDAsIDB4MjQwMjAwMDYsIDB4M2MwMTAwMDIsIDB4MTAwMDAwNTQsCi0weGFjMjI4ZjkwLCAweDhmODIwMjAwLCAweDM0NDIwMDAyLCAweGFmODIwMjAwLAotMHg4ZjgzMDA1NCwgMHgyNDAyMDAwZCwgMHgzYzAxMDAwMiwgMHhhYzIyOGY5MCwKLTB4M2MwMTAwMDIsIDB4YWMyMzhmYjQsIDB4OGY4MzAwNTQsIDB4M2MwMjAwMDIsCi0weDhjNDI4ZmI0LCAweDI0NjNkOGYwLCAweDQzMTAyMywgMHgyYzQyMjcxMCwKLTB4MTQ0MDAwMzEsIDB4MCwgMHgzYzAyMDAwMiwgMHg4YzQyOGZkMCwKLTB4MTA0MDAwMjAsIDB4MjQwMjAwMGUsIDB4M2MwMzAwMDIsIDB4OGM2MzhmZTQsCi0weDNjMDEwMDAyLCAweDE0NjAwMDE1LCAweGFjMjI4ZjkwLCAweGMwMDNlNmQsCi0weDAsIDB4M2MwNTAwMDEsIDB4OGNhNTZkOTgsIDB4YzAwNTI5YiwKLTB4MjAyMSwgMHgzYzAzMDAwMSwgMHg4YzYzNmQ5OCwgMHgyNDAyMDAwNCwKLTB4MTQ2MjAwMDUsIDB4MjQwM2ZmZmIsIDB4M2MwMjAwMDEsIDB4OGM0MjZkOTQsCi0weDEwMDAwMDAzLCAweDI0MDNmZmY3LCAweDNjMDIwMDAxLCAweDhjNDI2ZDk0LAotMHg0MzEwMjQsIDB4M2MwMTAwMDEsIDB4YWMyMjZkOTQsIDB4OGY4MzAyMjQsCi0weDNjMDIwMjAwLCAweDNjMDEwMDAyLCAweGFjMjM4ZmVjLCAweDEwMDAwMDIwLAotMHgyODJhMDI1LCAweDNjMDIwMDAyLCAweDhjNDI4ZmMwLCAweDEwNDAwMDA1LAotMHgwLCAweDNjMDIwMDAyLCAweDhjNDI4ZjljLCAweDEwNDAwMDBmLAotMHgyNDAyMDAwMiwgMHgzYzAyMDAwMiwgMHg4YzQyOGZhMCwgMHgyYzQyNGUyMSwKLTB4MTA0MDAwMGEsIDB4MjQwMjAwMDIsIDB4M2MwMjAwMDIsIDB4OGM0MjhmYzAsCi0weDEwNDAwMDBmLCAweDAsIDB4M2MwMjAwMDIsIDB4OGM0MjhmOWMsCi0weDE0NDAwMDBiLCAweDAsIDB4MjQwMjAwMDIsIDB4M2MwMTAwMDIsCi0weDEwMDAwMDA3LCAweGFjMjI4ZjkwLCAweDNjMDIwMDAyLCAweDhjNDI4ZmMwLAotMHgxMDQwMDAwMywgMHgwLCAweGMwMDNkYWYsIDB4MCwKLTB4OGY4MjAyMjAsIDB4M2MwM2Y3MDAsIDB4NDMxMDI1LCAweGFmODIwMjIwLAotMHg4ZmJmMDAxMCwgMHgzZTAwMDA4LCAweDI3YmQwMDE4LCAweDNjMDMwMDAyLAotMHgyNDYzOGZlOCwgMHg4YzYyMDAwMCwgMHgxMDQwMDAwNSwgMHgzNDQyMjAwMCwKLTB4M2MwMTAwMDIsIDB4YWMyMjhmZGMsIDB4MTAwMDAwMDMsIDB4YWM2MDAwMDAsCi0weDNjMDEwMDAyLCAweGFjMjQ4ZmRjLCAweDNlMDAwMDgsIDB4MCwKLTB4MjdiZGZmZTAsIDB4MzA4MjAwMzAsIDB4YWZiZjAwMTgsIDB4M2MwMTAwMDIsCi0weGFjMjI4ZmU0LCAweDE0NDAwMDY3LCAweDNjMDJmZmZmLCAweDM0NDIxZjBlLAotMHg4MjEwMjQsIDB4MTQ0MDAwNjEsIDB4MjQwMjAwMzAsIDB4MzA4MjIwMDAsCi0weDEwNDAwMDVkLCAweDMwODM4MDAwLCAweDMxYTAyLCAweDMwODIwMDAxLAotMHgyMTIwMCwgMHgzYzA0MDAwMSwgMHg4Yzg0NmYyMCwgMHg2MjE4MjUsCi0weDMzMWMyLCAweDNjMDMwMDAxLCAweDI0NjM2ZTQ4LCAweDMwODI4MDAwLAotMHgyMTIwMiwgMHgzMDg0MDAwMSwgMHg0MjIwMCwgMHg0NDEwMjUsCi0weDIzOWMyLCAweDYxMDgwLCAweDQzMTAyMSwgMHg0NzEwMjEsCi0weDkwNDMwMDAwLCAweDI0MDIwMDAxLCAweDEwNjIwMDI1LCAweDAsCi0weDEwNjAwMDA3LCAweDI0MDIwMDAyLCAweDEwNjIwMDEzLCAweDI0MDIwMDAzLAotMHgxMDYyMDAyYywgMHgzYzA1MDAwZiwgMHgxMDAwMDAzNywgMHgwLAotMHg4ZjgyMDIwMCwgMHgyNDAzZmVmZiwgMHg0MzEwMjQsIDB4YWY4MjAyMDAsCi0weDhmODIwMjIwLCAweDNjMDNmZmZlLCAweDM0NjNmZmZmLCAweDQzMTAyNCwKLTB4YWY4MjAyMjAsIDB4M2MwMTAwMDIsIDB4YWMyMDkwMDQsIDB4M2MwMTAwMDIsCi0weDEwMDAwMDM0LCAweGFjMjA5MDBjLCAweDhmODIwMjAwLCAweDM0NDIwMTAwLAotMHhhZjgyMDIwMCwgMHg4ZjgyMDIyMCwgMHgzYzAzZmZmZSwgMHgzNDYzZmZmZiwKLTB4NDMxMDI0LCAweGFmODIwMjIwLCAweDI0MDIwMTAwLCAweDNjMDEwMDAyLAotMHhhYzIyOTAwNCwgMHgzYzAxMDAwMiwgMHgxMDAwMDAyNiwgMHhhYzIwOTAwYywKLTB4OGY4MjAyMDAsIDB4MjQwM2ZlZmYsIDB4NDMxMDI0LCAweGFmODIwMjAwLAotMHg4ZjgyMDIyMCwgMHgzYzAzMDAwMSwgMHg0MzEwMjUsIDB4YWY4MjAyMjAsCi0weDNjMDEwMDAyLCAweGFjMjA5MDA0LCAweDNjMDEwMDAyLCAweDEwMDAwMDE5LAotMHhhYzIzOTAwYywgMHg4ZjgyMDIwMCwgMHgzNDQyMDEwMCwgMHhhZjgyMDIwMCwKLTB4OGY4MjAyMjAsIDB4M2MwMzAwMDEsIDB4NDMxMDI1LCAweGFmODIwMjIwLAotMHgyNDAyMDEwMCwgMHgzYzAxMDAwMiwgMHhhYzIyOTAwNCwgMHgzYzAxMDAwMiwKLTB4MTAwMDAwMGMsIDB4YWMyMzkwMGMsIDB4MzRhNWZmZmYsIDB4M2MwNDAwMDEsCi0weDI0ODQ2YzM4LCAweGFmYTMwMDEwLCAweGMwMDJiM2IsIDB4YWZhMDAwMTQsCi0weDEwMDAwMDA0LCAweDAsIDB4MjQwMjAwMzAsIDB4M2MwMTAwMDIsCi0weGFjMjI4ZmU4LCAweDhmYmYwMDE4LCAweDNlMDAwMDgsIDB4MjdiZDAwMjAsCi0weDAsIDB4MCwgMHgwLCAweDI3YmRmZmM4LAotMHhhZmIyMDAyOCwgMHg4MDkwMjEsIDB4YWZiMzAwMmMsIDB4YTA5ODIxLAotMHhhZmIwMDAyMCwgMHhjMDgwMjEsIDB4M2MwNDAwMDEsIDB4MjQ4NDZjNTAsCi0weDNjMDUwMDA5LCAweDNjMDIwMDAxLCAweDhjNDI2ZDk4LCAweDM0YTU5MDAxLAotMHgyNDAzMDIxLCAweDI2MDM4MjEsIDB4YWZiZjAwMzAsIDB4YWZiMTAwMjQsCi0weGE3YTAwMDFhLCAweGFmYjAwMDE0LCAweGMwMDJiM2IsIDB4YWZhMjAwMTAsCi0weDI0MDIwMDAyLCAweDEyNjIwMDgzLCAweDJlNjIwMDAzLCAweDEwNDAwMDA1LAotMHgyNDAyMDAwMSwgMHgxMjYyMDAwYSwgMHgwLCAweDEwMDAwMTczLAotMHgwLCAweDI0MDIwMDA0LCAweDEyNjIwMGY4LCAweDI0MDIwMDA4LAotMHgxMjYyMDBmNywgMHgzYzAyZmZlYywgMHgxMDAwMDE2YywgMHgwLAotMHgzYzAyMDAwMSwgMHg4YzQyNmQ5NCwgMHgzMDQyMDAwMiwgMHgxNDQwMDAwNCwKLTB4MTI4OTQwLCAweDNjMDJmZmZiLCAweDM0NDJmZmZmLCAweDIwMjgwMjQsCi0weDNjMDEwMDAyLCAweDMxMDgyMSwgMHhhYzMwOGZmYywgMHgzYzAyNDAwMCwKLTB4MjAyMTAyNCwgMHgxMDQwMDA0ZSwgMHgxMDIzYzIsIDB4MzA4NDAwMzAsCi0weDEwMTM4MiwgMHgzMDQyMDAxYywgMHgzYzAzMDAwMSwgMHgyNDYzNmRkOCwKLTB4NDMxMDIxLCAweDgyMzgyMSwgMHgzYzAyMDAyMCwgMHgyMDIxMDI0LAotMHgxMDQwMDAwNiwgMHgyNDAyMDEwMCwgMHgzYzAxMDAwMiwgMHgzMTA4MjEsCi0weGFjMjI5MDAwLCAweDEwMDAwMDA1LCAweDNjMDIwMDgwLCAweDNjMDEwMDAyLAotMHgzMTA4MjEsIDB4YWMyMDkwMDAsIDB4M2MwMjAwODAsIDB4MjAyMTAyNCwKLTB4MTA0MDAwMDYsIDB4MTIxOTQwLCAweDNjMDIwMDAxLCAweDNjMDEwMDAyLAotMHgyMzA4MjEsIDB4MTAwMDAwMDUsIDB4YWMyMjkwMDgsIDB4MTIxMTQwLAotMHgzYzAxMDAwMiwgMHgyMjA4MjEsIDB4YWMyMDkwMDgsIDB4OTRlNDAwMDAsCi0weDNjMDMwMDAxLCAweDhjNjM2ZjQwLCAweDI0MDIwMDA1LCAweDEwNjIwMDEwLAotMHhhN2E0MDAxOCwgMHgzMjAyNDAwMCwgMHgxMDQwMDAwMiwgMHgzNDgyNDAwMCwKLTB4YTdhMjAwMTgsIDB4MjQwNDAwMDEsIDB4OTRlMjAwMDIsIDB4MjQwNTAwMDQsCi0weDI0ZTYwMDAyLCAweDM0NDIwMDAxLCAweGMwMDQ1YmUsIDB4YTRlMjAwMDIsCi0weDI0MDQwMDAxLCAweDI4MjEsIDB4YzAwNDViZSwgMHgyN2E2MDAxOCwKLTB4M2MwMjAwMDEsIDB4OGM0MjZkOTgsIDB4MjQxMTAwMDEsIDB4M2MwMTAwMDEsCi0weGFjMzE2ZGE0LCAweDE0NTMwMDA0LCAweDMyMDI4MDAwLCAweGMwMDNkYWYsCi0weDAsIDB4MzIwMjgwMDAsIDB4MTA0MDAxMWMsIDB4MCwKLTB4YzAwM2RhZiwgMHgwLCAweDNjMDMwMDAxLCAweDhjNjM2ZjQwLAotMHgyNDAyMDAwNSwgMHgxMDYyMDExNSwgMHgyNDAyMDAwMiwgMHgzYzAxMDAwMSwKLTB4YWMzMTZkOWMsIDB4M2MwMTAwMDEsIDB4MTAwMDAxMTAsIDB4YWMyMjZkOTgsCi0weDI0MDQwMDAxLCAweDI0MDUwMDA0LCAweDI3YjAwMDFhLCAweGMwMDQ1YmUsCi0weDIwMDMwMjEsIDB4MjQwNDAwMDEsIDB4MjgyMSwgMHhjMDA0NWJlLAotMHgyMDAzMDIxLCAweDNjMDIwMDAyLCAweDUxMTAyMSwgMHg4YzQyOGZmNCwKLTB4M2MwNDAwMDEsIDB4OGM4NDZkOTgsIDB4M2MwM2JmZmYsIDB4MzQ2M2ZmZmYsCi0weDNjMDEwMDAxLCAweGFjMzM2ZGE0LCAweDQzMTAyNCwgMHgzYzAxMDAwMiwKLTB4MzEwODIxLCAweDEwOTMwMGY3LCAweGFjMjI4ZmY0LCAweDEwMDAwMGY3LAotMHgwLCAweDNjMDIyMDAwLCAweDIwMjEwMjQsIDB4MTA0MDAwMDUsCi0weDI0MDIwMDAxLCAweDNjMDEwMDAxLCAweGFjMjI2ZjFjLCAweDEwMDAwMDA0LAotMHgxMjg5NDAsIDB4M2MwMTAwMDEsIDB4YWMyMDZmMWMsIDB4MTI4OTQwLAotMHgzYzAxMDAwMiwgMHgzMTA4MjEsIDB4YWMzMDhmZjgsIDB4M2MwMjQwMDAsCi0weDIwMjEwMjQsIDB4MTQ0MDAwMTQsIDB4MCwgMHgzYzAyMDAwMSwKLTB4OGM0MjZmMWMsIDB4MTA0MDAwMDYsIDB4MjQwNDAwMDQsIDB4MjQwNTAwMDEsCi0weGMwMDRkZGIsIDB4MjQwNjIwMDAsIDB4MjQwMjAwMDEsIDB4YWVlMjA0YjgsCi0weDNjMDIwMDAyLCAweDUxMTAyMSwgMHg4YzQyOGZmMCwgMHgzYzAzYmZmZiwKLTB4MzQ2M2ZmZmYsIDB4NDMxMDI0LCAweDNjMDEwMDAyLCAweDMxMDgyMSwKLTB4MTAwMDAwZDAsIDB4YWMyMjhmZjAsIDB4M2MwMjAwMDEsIDB4OGM0MjZmMWMsCi0weDEwNDAwMDI4LCAweDNjMDMwMGEwLCAweDIwMzEwMjQsIDB4NTQ0MzAwMGQsCi0weDNjMDIwMDIwLCAweDNjMDIwMDAxLCAweDhjNDI2ZjIwLCAweDI0MDMwMTAwLAotMHgzYzAxMDAwMiwgMHgzMTA4MjEsIDB4YWMyMzkwMDQsIDB4M2MwMzAwMDEsCi0weDNjMDEwMDAyLCAweDMxMDgyMSwgMHhhYzIzOTAwYywgMHgxMDAwMDAxNSwKLTB4MzQ0MjA0MDAsIDB4MjAyMTAyNCwgMHgxMDQwMDAwOCwgMHgyNDAzMDEwMCwKLTB4M2MwMjAwMDEsIDB4OGM0MjZmMjAsIDB4M2MwMTAwMDIsIDB4MzEwODIxLAotMHhhYzIzOTAwNCwgMHgxMDAwMDAwYiwgMHgzNDQyMDgwMCwgMHgzYzAyMDA4MCwKLTB4MjAyMTAyNCwgMHgxMDQwMDAyZSwgMHgzYzAzMDAwMSwgMHgzYzAyMDAwMSwKLTB4OGM0MjZmMjAsIDB4M2MwMTAwMDIsIDB4MzEwODIxLCAweGFjMjM5MDBjLAotMHgzNDQyMGMwMCwgMHgzYzAxMDAwMSwgMHhhYzIyNmYyMCwgMHgxMDAwMDAyNSwKLTB4MjQwNDAwMDEsIDB4M2MwMjAwMjAsIDB4MjAyMTAyNCwgMHgxMDQwMDAwNiwKLTB4MjQwMjAxMDAsIDB4M2MwMTAwMDIsIDB4MzEwODIxLCAweGFjMjI5MDA0LAotMHgxMDAwMDAwNSwgMHgzYzAyMDA4MCwgMHgzYzAxMDAwMiwgMHgzMTA4MjEsCi0weGFjMjA5MDA0LCAweDNjMDIwMDgwLCAweDIwMjEwMjQsIDB4MTA0MDAwMDcsCi0weDEyMTk0MCwgMHgzYzAyMDAwMSwgMHgzYzAxMDAwMiwgMHgyMzA4MjEsCi0weGFjMjI5MDBjLCAweDEwMDAwMDA2LCAweDI0MDQwMDAxLCAweDEyMTE0MCwKLTB4M2MwMTAwMDIsIDB4MjIwODIxLCAweGFjMjA5MDBjLCAweDI0MDQwMDAxLAotMHgyODIxLCAweDI3YjAwMDFlLCAweGMwMDQ1N2MsIDB4MjAwMzAyMSwKLTB4MjQwNDAwMDEsIDB4MjgyMSwgMHhjMDA0NTdjLCAweDIwMDMwMjEsCi0weDI0MDQwMDAxLCAweDI0MDUwMDAxLCAweDI3YjAwMDFjLCAweGMwMDQ1N2MsCi0weDIwMDMwMjEsIDB4MjQwNDAwMDEsIDB4MjQwNTAwMDEsIDB4YzAwNDU3YywKLTB4MjAwMzAyMSwgMHgxMDAwMDA3NywgMHgwLCAweDNjMDJmZmVjLAotMHgzNDQyZmZmZiwgMHgyMDI4MDI0LCAweDNjMDIwMDA4LCAweDIwMjgwMjUsCi0weDEyMTE0MCwgMHgzYzAxMDAwMiwgMHgyMjA4MjEsIDB4YWMzMDhmZjgsCi0weDNjMDIyMDAwLCAweDIwMjEwMjQsIDB4MTA0MDAwMDksIDB4MCwKLTB4M2MwMjAwMDEsIDB4OGM0MjZlNDQsIDB4MTQ0MDAwMDUsIDB4MjQwMjAwMDEsCi0weDNjMDEwMDAxLCAweGFjMjI2ZjFjLCAweDEwMDAwMDA0LCAweDNjMDI0MDAwLAotMHgzYzAxMDAwMSwgMHhhYzIwNmYxYywgMHgzYzAyNDAwMCwgMHgyMDIxMDI0LAotMHgxNDQwMDAxZCwgMHgyNDAyMGUwMSwgMHgzYzAzMDAwMSwgMHg4YzYzNmYxYywKLTB4YWY4MjAyMzgsIDB4M2MwMTAwMDEsIDB4YWMyMDZkYjAsIDB4MTA2MDAwMDUsCi0weDI0MDIyMDIwLCAweDNjMDEwMDAxLCAweGFjMjI2ZjIwLCAweDI0MDIwMDAxLAotMHhhZWUyMDRiOCwgMHgzYzA0YmZmZiwgMHgxMjE5NDAsIDB4M2MwMjAwMDIsCi0weDQzMTAyMSwgMHg4YzQyOGZmMCwgMHgzYzA1MDAwMSwgMHg4Y2E1NmQ5OCwKLTB4MzQ4NGZmZmYsIDB4NDQxMDI0LCAweDNjMDEwMDAyLCAweDIzMDgyMSwKLTB4YWMyMjhmZjAsIDB4MjQwMjAwMDEsIDB4MTBhMjAwNDQsIDB4MCwKLTB4MTAwMDAwNDAsIDB4MCwgMHgzYzAyMDAwMSwgMHg4YzQyNmYxYywKLTB4MTA0MDAwMWMsIDB4MjQwMjIwMDAsIDB4M2MwMTAwMDEsIDB4YWMyMjZmMjAsCi0weDNjMDMwMGEwLCAweDIwMzEwMjQsIDB4MTQ0MzAwMDUsIDB4MTIxMTQwLAotMHgzNDAyYTAwMCwgMHgzYzAxMDAwMSwgMHgxMDAwMDAyZCwgMHhhYzIyNmYyMCwKLTB4M2MwMzAwMDIsIDB4NjIxODIxLCAweDhjNjM4ZmY4LCAweDNjMDIwMDIwLAotMHg2MjEwMjQsIDB4MTA0MDAwMDQsIDB4MjQwMjIwMDEsIDB4M2MwMTAwMDEsCi0weDEwMDAwMDIzLCAweGFjMjI2ZjIwLCAweDNjMDIwMDgwLCAweDYyMTAyNCwKLTB4MTA0MDAwMWYsIDB4MzQwMmEwMDEsIDB4M2MwMTAwMDEsIDB4MTAwMDAwMWMsCi0weGFjMjI2ZjIwLCAweDNjMDIwMDIwLCAweDIwMjEwMjQsIDB4MTA0MDAwMDcsCi0weDEyMTk0MCwgMHgyNDAyMDEwMCwgMHgzYzAxMDAwMiwgMHgyMzA4MjEsCi0weGFjMjI5MDA0LCAweDEwMDAwMDA2LCAweDNjMDIwMDgwLCAweDEyMTE0MCwKLTB4M2MwMTAwMDIsIDB4MjIwODIxLCAweGFjMjA5MDA0LCAweDNjMDIwMDgwLAotMHgyMDIxMDI0LCAweDEwNDAwMDA2LCAweDEyMTk0MCwgMHgzYzAyMDAwMSwKLTB4M2MwMTAwMDIsIDB4MjMwODIxLCAweDEwMDAwMDA1LCAweGFjMjI5MDBjLAotMHgxMjExNDAsIDB4M2MwMTAwMDIsIDB4MjIwODIxLCAweGFjMjA5MDBjLAotMHgzYzAzMDAwMSwgMHg4YzYzNmQ5OCwgMHgyNDAyMDAwMSwgMHgxMDYyMDAwMywKLTB4MCwgMHhjMDAzZGFmLCAweDAsIDB4OGZiZjAwMzAsCi0weDhmYjMwMDJjLCAweDhmYjIwMDI4LCAweDhmYjEwMDI0LCAweDhmYjAwMDIwLAotMHgzZTAwMDA4LCAweDI3YmQwMDM4LCAweDI3YmRmZmIwLCAweGFmYjMwMDNjLAotMHg5ODIxLCAweGFmYjUwMDQwLCAweGE4MjEsIDB4YWZiMTAwMzQsCi0weDg4MjEsIDB4MjQwMjAwMDIsIDB4YWZiZjAwNDgsIDB4YWZiZTAwNDQsCi0weGFmYjIwMDM4LCAweGFmYjAwMDMwLCAweGFmYTQwMDJjLCAweGE3YTAwMDFhLAotMHhhN2EwMDAxOCwgMHhhN2EwMDAyMCwgMHhhN2EwMDAxZSwgMHhhN2EwMDAyMiwKLTB4MTBhMjAxMzAsIDB4YTdhMDAwMWMsIDB4MmNhMjAwMDMsIDB4MTA0MDAwMDUsCi0weDI0MDIwMDAxLCAweDEwYTIwMDBhLCAweDNjMDI0MDAwLCAweDEwMDAwMjVkLAotMHgyMjAxMDIxLCAweDI0MDIwMDA0LCAweDEwYTIwMjBhLCAweDI0MDIwMDA4LAotMHgxMGEyMDIwOCwgMHgyMjAxMDIxLCAweDEwMDAwMjU2LCAweDAsCi0weDhmYTgwMDJjLCAweDg4MTQwLCAweDNjMDMwMDAyLCAweDcwMTgyMSwKLTB4OGM2MzhmZmMsIDB4NjIxMDI0LCAweDE0NDAwMDA5LCAweDI0MDQwMDAxLAotMHgzYzAyN2ZmZiwgMHgzNDQyZmZmZiwgMHg2Mjg4MjQsIDB4M2MwMTAwMDIsCi0weDMwMDgyMSwgMHhhYzMxOGZmNCwgMHgxMDAwMDI0NiwgMHgyMjAxMDIxLAotMHgyNDA1MDAwMSwgMHhjMDA0NTdjLCAweDI3YTYwMDE4LCAweDI0MDQwMDAxLAotMHgyNDA1MDAwMSwgMHhjMDA0NTdjLCAweDI3YTYwMDE4LCAweDk3YTIwMDE4LAotMHgzMDQyMDAwNCwgMHgxMDQwMDBkOSwgMHgzYzExNDAwMCwgMHgzYzAyMDAwMSwKLTB4OGM0MjZmNDAsIDB4MjQ0M2ZmZmYsIDB4MmM2MjAwMDYsIDB4MTA0MDAwZDksCi0weDMxMDgwLCAweDNjMDEwMDAxLCAweDIyMDgyMSwgMHg4YzIyNmM2OCwKLTB4NDAwMDA4LCAweDAsIDB4MjQwNDAwMDEsIDB4MjQwNTAwMTEsCi0weDI3YjAwMDFhLCAweGMwMDQ1N2MsIDB4MjAwMzAyMSwgMHgyNDA0MDAwMSwKLTB4MjQwNTAwMTEsIDB4YzAwNDU3YywgMHgyMDAzMDIxLCAweDk3YTMwMDFhLAotMHgzMDYyNDAwMCwgMHgxMDQwMDAwMiwgMHgzYzE1MDAxMCwgMHgzYzE1MDAwOCwKLTB4MzA2MjgwMDAsIDB4MTA0MDAwYWEsIDB4M2MxMzAwMDEsIDB4MTAwMDAwYTgsCi0weDNjMTMwMDAyLCAweDI0MDQwMDAxLCAweDI0MDUwMDE0LCAweDI3YjAwMDFhLAotMHhjMDA0NTdjLCAweDIwMDMwMjEsIDB4MjQwNDAwMDEsIDB4MjQwNTAwMTQsCi0weGMwMDQ1N2MsIDB4MjAwMzAyMSwgMHg5N2EzMDAxYSwgMHgzMDYyMTAwMCwKLTB4MTA0MDAwMDIsIDB4M2MxNTAwMTAsIDB4M2MxNTAwMDgsIDB4MzA2MjA4MDAsCi0weDEwNDAwMDk3LCAweDNjMTMwMDAxLCAweDEwMDAwMDk1LCAweDNjMTMwMDAyLAotMHgyNDA0MDAwMSwgMHgyNDA1MDAxOSwgMHgyN2IwMDAxYywgMHhjMDA0NTdjLAotMHgyMDAzMDIxLCAweDI0MDQwMDAxLCAweDI0MDUwMDE5LCAweGMwMDQ1N2MsCi0weDIwMDMwMjEsIDB4OTdhMjAwMWMsIDB4MzA0MzA3MDAsIDB4MjQwMjA0MDAsCi0weDEwNjIwMDI3LCAweDI4NjIwNDAxLCAweDEwNDAwMDBlLCAweDI0MDIwMjAwLAotMHgxMDYyMDAxZiwgMHgyODYyMDIwMSwgMHgxMDQwMDAwNSwgMHgyNDAyMDEwMCwKLTB4NTA2MjAwMWUsIDB4M2MxMzAwMDEsIDB4MTAwMDAwMWUsIDB4MjQwNDAwMDEsCi0weDI0MDIwMzAwLCAweDUwNjIwMDE5LCAweDNjMTMwMDAyLCAweDEwMDAwMDE5LAotMHgyNDA0MDAwMSwgMHgyNDAyMDYwMCwgMHgxMDYyMDAwZCwgMHgyODYyMDYwMSwKLTB4MTA0MDAwMDUsIDB4MjQwMjA1MDAsIDB4NTA2MjAwMGIsIDB4M2MxMzAwMDIsCi0weDEwMDAwMDEwLCAweDI0MDQwMDAxLCAweDI0MDIwNzAwLCAweDE0NjIwMDBkLAotMHgyNDA0MDAwMSwgMHgzYzEzMDAwNCwgMHgxMDAwMDAwYSwgMHgzYzE1MDAwOCwKLTB4MTAwMDAwMDYsIDB4M2MxMzAwMDQsIDB4MTAwMDAwMDUsIDB4M2MxNTAwMDgsCi0weDNjMTMwMDAxLCAweDEwMDAwMDAyLCAweDNjMTUwMDA4LCAweDNjMTUwMDEwLAotMHgyNDA0MDAwMSwgMHgyNDA1MDAxOCwgMHgyN2IwMDAxZSwgMHhjMDA0NTdjLAotMHgyMDAzMDIxLCAweDI0MDQwMDAxLCAweDI0MDUwMDE4LCAweGMwMDQ1N2MsCi0weDIwMDMwMjEsIDB4OGZhODAwMmMsIDB4OTdhNzAwMWUsIDB4ODExNDAsCi0weDNjMDYwMDAyLCAweGMyMzAyMSwgMHg4Y2M2OGZmNCwgMHg5N2EyMDAyMiwKLTB4M2MxMDAwMDEsIDB4MjYxMDZjNWMsIDB4MjAwMjAyMSwgMHhhZmEyMDAxMCwKLTB4OTdhMjAwMWMsIDB4M2MwNTAwMGMsIDB4MzRhNTAzMDMsIDB4YzAwMmIzYiwKLTB4YWZhMjAwMTQsIDB4M2MwMjAwMDQsIDB4MTY2MjAwMTAsIDB4M2MwMjAwMDEsCi0weDhmODQwMDU0LCAweDI0MDMwMDAxLCAweDI0MDIwMDAyLCAweDNjMDEwMDAxLAotMHhhYzIzNmQ5YywgMHgzYzAxMDAwMSwgMHhhYzIyNmQ5OCwgMHgzYzAxMDAwMSwKLTB4YWMyMzZkYTQsIDB4M2MwMTAwMDEsIDB4YWMyMzZlMjQsIDB4M2MwMTAwMDEsCi0weGFjMjQ2ZjMwLCAweDEwMDAwMDRmLCAweDJiMzg4MjUsIDB4MTY2MjAwMzksCi0weDNjMDI4MDAwLCAweDNjMDIwMDAxLCAweDhjNDI2ZTIwLCAweDE0NDAwMDFlLAotMHgyNDA0MDAxOCwgMHgyMDIxLCAweDI4MjEsIDB4YzAwNGRkYiwKLTB4MzQwNjgwMDAsIDB4OGY4MzAwNTQsIDB4OGY4MjAwNTQsIDB4MmIzODgyNSwKLTB4MTAwMDAwMDIsIDB4MjQ2MzAwMzIsIDB4OGY4MjAwNTQsIDB4NjIxMDIzLAotMHgyYzQyMDAzMywgMHgxNDQwZmZmYywgMHgwLCAweDhmODMwMDU0LAotMHgyNDAyMDAwMSwgMHgzYzAxMDAwMSwgMHhhYzIyNmUyMCwgMHgzYzAxMDAwMSwKLTB4YWMyMjZkOWMsIDB4M2MwMTAwMDEsIDB4YWMyMjZkOTgsIDB4M2MwMTAwMDEsCi0weGFjMjI2ZGE0LCAweDNjMDEwMDAxLCAweGFjMjI2ZTI0LCAweDNjMDEwMDAxLAotMHgxMDAwMDAyYywgMHhhYzIzNmYzMCwgMHgyODIxLCAweGMwMDRkZGIsCi0weDI0MDYwNDA0LCAweDIwMjEsIDB4MjQwNTAwMWUsIDB4MjdhNjAwMTgsCi0weDI0MDIwMDAyLCAweGMwMDQ1YmUsIDB4YTdhMjAwMTgsIDB4MjAyMSwKLTB4MjgyMSwgMHgyN2E2MDAxOCwgMHhjMDA0NWJlLCAweGE3YTAwMDE4LAotMHgyNDA0MDAxOCwgMHgyNDA1MDAwMiwgMHhjMDA0ZGRiLCAweDI0MDYwMDA0LAotMHgzYzAyODAwMCwgMHgyMjIxMDI1LCAweDJiMzE4MjUsIDB4MTAwMDAwMTUsCi0weDQzODgyNSwgMHgyMjIxMDI1LCAweDI3NTE4MjUsIDB4NDM4ODI1LAotMHgyMDAyMDIxLCAweDk3YTYwMDFjLCAweDNjMDcwMDAxLCAweDhjZTc2ZDk4LAotMHgzYzA1MDAwYywgMHgzNGE1MDMyNiwgMHhhZmIzMDAxMCwgMHhjMDAyYjNiLAotMHhhZmIxMDAxNCwgMHgxMDAwMDAwNywgMHgwLCAweDNjMTEwMDAyLAotMHgyMzA4ODIxLCAweDhlMzE4ZmZjLCAweDNjMDI3ZmZmLCAweDM0NDJmZmZmLAotMHgyMjI4ODI0LCAweDNjMDIwMDAxLCAweDhjNDI2ZGE4LCAweDEwNDAwMDFlLAotMHgwLCAweDNjMDIwMDAxLCAweDhjNDI2ZjFjLCAweDEwNDAwMDAyLAotMHgzYzAyMjAwMCwgMHgyMjI4ODI1LCAweDhmYTgwMDJjLCAweDgxMTQwLAotMHgzYzAxMDAwMiwgMHgyMjA4MjEsIDB4OGMyMjkwMDAsIDB4MTA0MDAwMDMsCi0weDNjMDIwMDIwLCAweDEwMDAwMDA1LCAweDIyMjg4MjUsIDB4M2MwMmZmZGYsCi0weDM0NDJmZmZmLCAweDIyMjg4MjQsIDB4OGZhODAwMmMsIDB4ODExNDAsCi0weDNjMDEwMDAyLCAweDIyMDgyMSwgMHg4YzIyOTAwOCwgMHgxMDQwMDAwMywKLTB4M2MwMjAwODAsIDB4MTAwMDAwMDQsIDB4MjIyODgyNSwgMHgzYzAyZmY3ZiwKLTB4MzQ0MmZmZmYsIDB4MjIyODgyNCwgMHg4ZmE4MDAyYywgMHg4MTE0MCwKLTB4M2MwMTAwMDIsIDB4MjIwODIxLCAweGFjMzE4ZmY0LCAweDEwMDAwMTM1LAotMHgyMjAxMDIxLCAweDhmYTgwMDJjLCAweDhmMTQwLCAweDNjMDMwMDAyLAotMHg3ZTE4MjEsIDB4OGM2MzhmZjgsIDB4M2MwMjQwMDAsIDB4NjIxMDI0LAotMHgxNDQwMDAwOSwgMHgyNDA0MDAwMSwgMHgzYzAyN2ZmZiwgMHgzNDQyZmZmZiwKLTB4NjI4ODI0LCAweDNjMDEwMDAyLCAweDNlMDgyMSwgMHhhYzMxOGZmMCwKLTB4MTAwMDAxMjQsIDB4MjIwMTAyMSwgMHgyODIxLCAweGMwMDQ1N2MsCi0weDI3YTYwMDE4LCAweDI0MDQwMDAxLCAweDI4MjEsIDB4YzAwNDU3YywKLTB4MjdhNjAwMTgsIDB4MjQwNDAwMDEsIDB4MjQwNTAwMDEsIDB4MjdiMjAwMjAsCi0weGMwMDQ1N2MsIDB4MjQwMzAyMSwgMHgyNDA0MDAwMSwgMHgyNDA1MDAwMSwKLTB4YzAwNDU3YywgMHgyNDAzMDIxLCAweDI0MDQwMDAxLCAweDI0MDUwMDA0LAotMHgyN2IxMDAxZSwgMHhjMDA0NTdjLCAweDIyMDMwMjEsIDB4MjQwNDAwMDEsCi0weDI0MDUwMDA0LCAweGMwMDQ1N2MsIDB4MjIwMzAyMSwgMHgyNDA0MDAwMSwKLTB4MjQwNTAwMDUsIDB4MjdiMDAwMjIsIDB4YzAwNDU3YywgMHgyMDAzMDIxLAotMHgyNDA0MDAwMSwgMHgyNDA1MDAwNSwgMHhjMDA0NTdjLCAweDIwMDMwMjEsCi0weDI0MDQwMDAxLCAweDI0MDUwMDEwLCAweGMwMDQ1N2MsIDB4MjdhNjAwMTgsCi0weDI0MDQwMDAxLCAweDI0MDUwMDEwLCAweGMwMDQ1N2MsIDB4MjdhNjAwMTgsCi0weDI0MDQwMDAxLCAweDI0MDUwMDBhLCAweGMwMDQ1N2MsIDB4MjQwMzAyMSwKLTB4MjQwNDAwMDEsIDB4MjQwNTAwMGEsIDB4YzAwNDU3YywgMHgyNDAzMDIxLAotMHgyNDA0MDAwMSwgMHgyNDA1MDAxOCwgMHhjMDA0NTdjLCAweDIyMDMwMjEsCi0weDI0MDQwMDAxLCAweDI0MDUwMDE4LCAweGMwMDQ1N2MsIDB4MjIwMzAyMSwKLTB4MjQwNDAwMDEsIDB4MjQwNTAwMDEsIDB4YzAwNDU3YywgMHgyN2E2MDAxOCwKLTB4MjQwNDAwMDEsIDB4MjQwNTAwMDEsIDB4YzAwNDU3YywgMHgyN2E2MDAxOCwKLTB4OTdhMjAwMTgsIDB4MzA0MjAwMDQsIDB4MTA0MDAwNjYsIDB4M2MxMTQwMDAsCi0weDNjMDMwMDAxLCAweDhjNjM2ZjM0LCAweDI0MDIwMDA1LCAweDE0NjIwMDY3LAotMHgyNDA0MDAwMSwgMHgyNDA1MDAxOSwgMHgyN2IwMDAxYywgMHhjMDA0NTdjLAotMHgyMDAzMDIxLCAweDI0MDQwMDAxLCAweDI0MDUwMDE5LCAweGMwMDQ1N2MsCi0weDIwMDMwMjEsIDB4OTdhMjAwMWMsIDB4MzA0MzA3MDAsIDB4MjQwMjA0MDAsCi0weDEwNjIwMDI3LCAweDI4NjIwNDAxLCAweDEwNDAwMDBlLCAweDI0MDIwMjAwLAotMHgxMDYyMDAxZiwgMHgyODYyMDIwMSwgMHgxMDQwMDAwNSwgMHgyNDAyMDEwMCwKLTB4NTA2MjAwMWUsIDB4M2MxMzAwMDEsIDB4MTAwMDAwMWUsIDB4M2MwMjAwMDQsCi0weDI0MDIwMzAwLCAweDUwNjIwMDE5LCAweDNjMTMwMDAyLCAweDEwMDAwMDE5LAotMHgzYzAyMDAwNCwgMHgyNDAyMDYwMCwgMHgxMDYyMDAwZCwgMHgyODYyMDYwMSwKLTB4MTA0MDAwMDUsIDB4MjQwMjA1MDAsIDB4NTA2MjAwMGIsIDB4M2MxMzAwMDIsCi0weDEwMDAwMDEwLCAweDNjMDIwMDA0LCAweDI0MDIwNzAwLCAweDE0NjIwMDBkLAotMHgzYzAyMDAwNCwgMHgzYzEzMDAwNCwgMHgxMDAwMDAwYSwgMHgzYzE1MDAwOCwKLTB4MTAwMDAwMDYsIDB4M2MxMzAwMDQsIDB4MTAwMDAwMDUsIDB4M2MxNTAwMDgsCi0weDNjMTMwMDAxLCAweDEwMDAwMDAyLCAweDNjMTUwMDA4LCAweDNjMTUwMDEwLAotMHgzYzAyMDAwNCwgMHgxMjYyMDAxNywgMHgzYzAyODAwMCwgMHg4ZjgyMDA1NCwKLTB4MjQxMDAwMDEsIDB4M2MwMTAwMDEsIDB4YWMzMDZkOWMsIDB4M2MwMTAwMDEsCi0weGFjMzA2ZDk4LCAweDNjMDEwMDAxLCAweGFjMzA2ZGE0LCAweDNjMDEwMDAxLAotMHhhYzMwNmUyNCwgMHgzYzAxMDAwMSwgMHhhYzIyNmYzMCwgMHgzYzAyMDAwMSwKLTB4MTY2MjAwMjIsIDB4Mjc1ODgyNSwgMHgyMDIxLCAweDI4MjEsCi0weGMwMDRkZGIsIDB4MzQwNjgwMDAsIDB4M2MwMTAwMDEsIDB4MTAwMDAwMWIsCi0weGFjMzA2ZTIwLCAweDIyMjEwMjUsIDB4MmIzMTgyNSwgMHg0Mzg4MjUsCi0weDk3YTYwMDFjLCAweDNjMDIwMDAxLCAweDhjNDI2ZjFjLCAweDNjMDcwMDAxLAotMHg4Y2U3NmQ5OCwgMHgzYzA0MDAwMSwgMHgyNDg0NmM1YywgMHhhZmEyMDAxMCwKLTB4OTdhMjAwMWUsIDB4M2MwNTAwMGMsIDB4MzRhNTAzMjMsIDB4M2MwMTAwMDEsCi0weGFjMjA2ZTIwLCAweGMwMDJiM2IsIDB4YWZhMjAwMTQsIDB4MTAwMDAwMDcsCi0weDAsIDB4M2MxMTAwMDIsIDB4MjNlODgyMSwgMHg4ZTMxOGZmMCwKLTB4M2MwMjdmZmYsIDB4MzQ0MmZmZmYsIDB4MjIyODgyNCwgMHgzYzAyMDAwMSwKLTB4OGM0MjZkYTgsIDB4MTA0MDAwNjksIDB4MCwgMHgzYzAyMDAwMSwKLTB4OGM0MjZmMWMsIDB4MTA0MDAwMDIsIDB4M2MwMjIwMDAsIDB4MjIyODgyNSwKLTB4OGZhODAwMmMsIDB4ODExNDAsIDB4M2MwMTAwMDIsIDB4MjIwODIxLAotMHg4YzIyOTAwNCwgMHgxMDQwMDAwMywgMHgzYzAyMDAyMCwgMHgxMDAwMDAwNSwKLTB4MjIyODgyNSwgMHgzYzAyZmZkZiwgMHgzNDQyZmZmZiwgMHgyMjI4ODI0LAotMHg4ZmE4MDAyYywgMHg4MTE0MCwgMHgzYzAxMDAwMiwgMHgyMjA4MjEsCi0weDhjMjI5MDBjLCAweDEwNDAwMDAzLCAweDNjMDIwMDgwLCAweDEwMDAwMDRmLAotMHgyMjI4ODI1LCAweDNjMDJmZjdmLCAweDM0NDJmZmZmLCAweDEwMDAwMDRiLAotMHgyMjI4ODI0LCAweDhmYTgwMDJjLCAweDgyOTQwLCAweDNjMDMwMDAyLAotMHg2NTE4MjEsIDB4OGM2MzhmZjgsIDB4M2MwMjQwMDAsIDB4NjIxMDI0LAotMHgxNDQwMDAwOCwgMHgzYzAyN2ZmZiwgMHgzNDQyZmZmZiwgMHg2Mjg4MjQsCi0weDNjMDEwMDAyLCAweDI1MDgyMSwgMHhhYzMxOGZmMCwgMHgxMDAwMDA0MSwKLTB4MjIwMTAyMSwgMHgzYzAyMDAwMSwgMHg4YzQyNmRhOCwgMHgxMDQwMDAzNCwKLTB4M2MxMWMwMGMsIDB4M2MwMjAwMDEsIDB4OGM0MjZlNDQsIDB4M2MwNGMwMGMsCi0weDM0ODQyMDAwLCAweDNjMDMwMDAxLCAweDhjNjM2ZjFjLCAweDIxMDJiLAotMHgyMTAyMywgMHg0NDEwMjQsIDB4MTA2MDAwMDMsIDB4NTE4ODI1LAotMHgzYzAyMjAwMCwgMHgyMjI4ODI1LCAweDNjMDIwMDAyLCAweDQ1MTAyMSwKLTB4OGM0MjkwMDQsIDB4MTA0MDAwMDMsIDB4M2MwMjAwMjAsIDB4MTAwMDAwMDQsCi0weDIyMjg4MjUsIDB4M2MwMmZmZGYsIDB4MzQ0MmZmZmYsIDB4MjIyODgyNCwKLTB4OGZhODAwMmMsIDB4ODExNDAsIDB4M2MwMTAwMDIsIDB4MjIwODIxLAotMHg4YzIyOTAwYywgMHgxMDQwMDAwMywgMHgzYzAyMDA4MCwgMHgxMDAwMDAwNCwKLTB4MjIyODgyNSwgMHgzYzAyZmY3ZiwgMHgzNDQyZmZmZiwgMHgyMjI4ODI0LAotMHgzYzAyMDAwMSwgMHg4YzQyNmUzMCwgMHgxMDQwMDAwMiwgMHgzYzAyMDgwMCwKLTB4MjIyODgyNSwgMHgzYzAyMDAwMSwgMHg4YzQyNmUzNCwgMHgxMDQwMDAwMiwKLTB4M2MwMjA0MDAsIDB4MjIyODgyNSwgMHgzYzAyMDAwMSwgMHg4YzQyNmUzOCwKLTB4MTA0MDAwMDYsIDB4M2MwMjAxMDAsIDB4MTAwMDAwMDQsIDB4MjIyODgyNSwKLTB4M2MwMjdmZmYsIDB4MzQ0MmZmZmYsIDB4NjI4ODI0LCAweDhmYTgwMDJjLAotMHg4MTE0MCwgMHgzYzAxMDAwMiwgMHgyMjA4MjEsIDB4YWMzMThmZjAsCi0weDIyMDEwMjEsIDB4OGZiZjAwNDgsIDB4OGZiZTAwNDQsIDB4OGZiNTAwNDAsCi0weDhmYjMwMDNjLCAweDhmYjIwMDM4LCAweDhmYjEwMDM0LCAweDhmYjAwMDMwLAotMHgzZTAwMDA4LCAweDI3YmQwMDUwLCAweDI3YmRmZmQwLCAweGFmYjIwMDI4LAotMHg4MDkwMjEsIDB4YWZiZjAwMmMsIDB4YWZiMTAwMjQsIDB4YWZiMDAwMjAsCi0weDhmODQwMjAwLCAweDNjMTAwMDAxLCAweDhlMTA2ZDk4LCAweDhmODYwMjIwLAotMHgyNDAyMDAwMiwgMHgxMjAyMDA1YywgMHgyZTAyMDAwMywgMHgxMDQwMDAwNSwKLTB4MjQwMjAwMDEsIDB4MTIwMjAwMGEsIDB4MTIxOTQwLCAweDEwMDAwMTBjLAotMHgwLCAweDI0MDIwMDA0LCAweDEyMDIwMGJmLCAweDI0MDIwMDA4LAotMHgxMjAyMDBiZSwgMHgxMjg5NDAsIDB4MTAwMDAxMDUsIDB4MCwKLTB4M2MwNTAwMDIsIDB4YTMyODIxLCAweDhjYTU4ZmZjLCAweDNjMTAwMDAyLAotMHgyMDM4MDIxLCAweDhlMTA4ZmY0LCAweDNjMDI0MDAwLCAweGEyMTAyNCwKLTB4MTA0MDAwMzgsIDB4M2MwMjAwMDgsIDB4MjAyMTAyNCwgMHgxMDQwMDAyMCwKLTB4MzQ4NDAwMDIsIDB4M2MwMjAwMDIsIDB4NDMxMDIxLCAweDhjNDI5MDAwLAotMHgxMDQwMDAwNSwgMHgzNDg0MDAyMCwgMHgzNDg0MDEwMCwgMHgzYzAyMDAyMCwKLTB4MTAwMDAwMDYsIDB4MjAyODAyNSwgMHgyNDAyZmVmZiwgMHg4MjIwMjQsCi0weDNjMDJmZmRmLCAweDM0NDJmZmZmLCAweDIwMjgwMjQsIDB4MTIxMTQwLAotMHgzYzAxMDAwMiwgMHgyMjA4MjEsIDB4OGMyMjkwMDgsIDB4MTA0MDAwMDUsCi0weDNjMDIwMDAxLCAweGMyMzAyNSwgMHgzYzAyMDA4MCwgMHgxMDAwMDAxNiwKLTB4MjAyODAyNSwgMHgzYzAyZmZmZSwgMHgzNDQyZmZmZiwgMHhjMjMwMjQsCi0weDNjMDJmZjdmLCAweDM0NDJmZmZmLCAweDEwMDAwMDBmLCAweDIwMjgwMjQsCi0weDI0MDJmZWRmLCAweDgyMjAyNCwgMHgzYzAyZmZmZSwgMHgzNDQyZmZmZiwKLTB4YzIzMDI0LCAweDNjMDJmZjVmLCAweDM0NDJmZmZmLCAweDIwMjgwMjQsCi0weDNjMDEwMDAyLCAweDIzMDgyMSwgMHhhYzIwOTAwMCwgMHgzYzAxMDAwMiwKLTB4MjMwODIxLCAweGFjMjA5MDA4LCAweGFmODQwMjAwLCAweGFmODYwMjIwLAotMHg4ZjgyMDIyMCwgMHgzNDQyMDAwMiwgMHhhZjgyMDIyMCwgMHgxMDAwMDAwYSwKLTB4MTIxMTQwLCAweDNjMDJiZmZmLCAweDM0NDJmZmZmLCAweDhmODMwMjAwLAotMHgyMDI4MDI0LCAweDI0MDJmZmZkLCAweDYyMTgyNCwgMHhjMDAzZGFmLAotMHhhZjgzMDIwMCwgMHgxMjExNDAsIDB4M2MwMTAwMDIsIDB4MjIwODIxLAotMHgxMDAwMDBiNywgMHhhYzMwOGZmNCwgMHgzYzAyMDAwMSwgMHg4YzQyNmYxYywKLTB4MTA0MDAwNjksIDB4MjQwNTAwMDQsIDB4MjQwNDAwMDEsIDB4YzAwNDU3YywKLTB4MjdhNjAwMTgsIDB4MjQwNDAwMDEsIDB4MjQwNTAwMDUsIDB4YzAwNDU3YywKLTB4MjdhNjAwMWEsIDB4OTdhMzAwMTgsIDB4OTdhMjAwMWEsIDB4M2MwNDAwMDEsCi0weDI0ODQ2ZTQ4LCAweDMwNjMwYzAwLCAweDMxYTgyLCAweDMwNDIwYzAwLAotMHgyMTI4MiwgMHhhN2EyMDAxYSwgMHgyMTA4MCwgMHg0NDEwMjEsCi0weDQzMTAyMSwgMHhhN2EzMDAxOCwgMHg5MDQ4MDAwMCwgMHgyNDAyMDAwMSwKLTB4MzEwM2ZmZmYsIDB4MTA2MjAwMjksIDB4Mjg2MjAwMDIsIDB4MTA0MDAwMDUsCi0weDAsIDB4MTA2MDAwMDksIDB4MCwgMHgxMDAwMDAzZCwKLTB4MCwgMHgxMDcwMDAxMywgMHgyNDAyMDAwMywgMHgxMDYyMDAyYywKLTB4MCwgMHgxMDAwMDAzNywgMHgwLCAweDhmODIwMjAwLAotMHgyNDAzZmVmZiwgMHg0MzEwMjQsIDB4YWY4MjAyMDAsIDB4OGY4MjAyMjAsCi0weDNjMDNmZmZlLCAweDM0NjNmZmZmLCAweDQzMTAyNCwgMHhhZjgyMDIyMCwKLTB4M2MwMTAwMDIsIDB4YWMyMDkwMDQsIDB4M2MwMTAwMDIsIDB4MTAwMDAwMzIsCi0weGFjMjA5MDBjLCAweDhmODIwMjAwLCAweDM0NDIwMTAwLCAweGFmODIwMjAwLAotMHg4ZjgyMDIyMCwgMHgzYzAzZmZmZSwgMHgzNDYzZmZmZiwgMHg0MzEwMjQsCi0weGFmODIwMjIwLCAweDI0MDIwMTAwLCAweDNjMDEwMDAyLCAweGFjMjI5MDA0LAotMHgzYzAxMDAwMiwgMHgxMDAwMDAyNCwgMHhhYzIwOTAwYywgMHg4ZjgyMDIwMCwKLTB4MjQwM2ZlZmYsIDB4NDMxMDI0LCAweGFmODIwMjAwLCAweDhmODIwMjIwLAotMHgzYzAzMDAwMSwgMHg0MzEwMjUsIDB4YWY4MjAyMjAsIDB4M2MwMTAwMDIsCi0weGFjMjA5MDA0LCAweDNjMDEwMDAyLCAweDEwMDAwMDE3LCAweGFjMjM5MDBjLAotMHg4ZjgyMDIwMCwgMHgzNDQyMDEwMCwgMHhhZjgyMDIwMCwgMHg4ZjgyMDIyMCwKLTB4M2MwMzAwMDEsIDB4NDMxMDI1LCAweGFmODIwMjIwLCAweDI0MDIwMTAwLAotMHgzYzAxMDAwMiwgMHhhYzIyOTAwNCwgMHgzYzAxMDAwMiwgMHgxMDAwMDAwYSwKLTB4YWMyMzkwMGMsIDB4M2MwNDAwMDEsIDB4MjQ4NDZjODAsIDB4OTdhNjAwMWEsCi0weDk3YTcwMDE4LCAweDNjMDUwMDAxLCAweDM0YTVmZmZmLCAweGFmYTgwMDEwLAotMHhjMDAyYjNiLCAweGFmYTAwMDE0LCAweDhmODIwMjAwLCAweDM0NDIwMDAyLAotMHgxMDAwMDA0YiwgMHhhZjgyMDIwMCwgMHgxMjg5NDAsIDB4M2MwNTAwMDIsCi0weGIxMjgyMSwgMHg4Y2E1OGZmOCwgMHgzYzEwMDAwMiwgMHgyMTE4MDIxLAotMHg4ZTEwOGZmMCwgMHgzYzAyNDAwMCwgMHhhMjEwMjQsIDB4MTQ0MDAwMTAsCi0weDAsIDB4M2MwMjAwMDEsIDB4OGM0MjZmMWMsIDB4MTQ0MDAwMDUsCi0weDNjMDJiZmZmLCAweDhmODIwMjAwLCAweDM0NDIwMDAyLCAweGFmODIwMjAwLAotMHgzYzAyYmZmZiwgMHgzNDQyZmZmZiwgMHhjMDAzZGFmLCAweDIwMjgwMjQsCi0weDNjMDEwMDAyLCAweDMxMDgyMSwgMHgxMDAwMDAzMSwgMHhhYzMwOGZmMCwKLTB4M2MwMjAwMDEsIDB4OGM0MjZmMWMsIDB4MTA0MDAwMDUsIDB4M2MwMjAwMjAsCi0weDNjMDIwMDAxLCAweDhjNDI2ZTQ0LCAweDEwNDAwMDI1LCAweDNjMDIwMDIwLAotMHhhMjEwMjQsIDB4MTA0MDAwMDcsIDB4MzQ4NDAwMjAsIDB4MjQwMjAxMDAsCi0weDNjMDEwMDAyLCAweDMxMDgyMSwgMHhhYzIyOTAwNCwgMHgxMDAwMDAwNiwKLTB4MzQ4NDAxMDAsIDB4M2MwMTAwMDIsIDB4MzEwODIxLCAweGFjMjA5MDA0LAotMHgyNDAyZmVmZiwgMHg4MjIwMjQsIDB4M2MwMjAwODAsIDB4YTIxMDI0LAotMHgxMDQwMDAwNywgMHgxMjE5NDAsIDB4M2MwMjAwMDEsIDB4M2MwMTAwMDIsCi0weDIzMDgyMSwgMHhhYzIyOTAwYywgMHgxMDAwMDAwOCwgMHhjMjMwMjUsCi0weDEyMTE0MCwgMHgzYzAxMDAwMiwgMHgyMjA4MjEsIDB4YWMyMDkwMGMsCi0weDNjMDJmZmZlLCAweDM0NDJmZmZmLCAweGMyMzAyNCwgMHhhZjg0MDIwMCwKLTB4YWY4NjAyMjAsIDB4OGY4MjAyMjAsIDB4MzQ0MjAwMDIsIDB4YWY4MjAyMjAsCi0weDEyMTE0MCwgMHgzYzAxMDAwMiwgMHgyMjA4MjEsIDB4YWMzMDhmZjAsCi0weDhmYmYwMDJjLCAweDhmYjIwMDI4LCAweDhmYjEwMDI0LCAweDhmYjAwMDIwLAotMHgzZTAwMDA4LCAweDI3YmQwMDMwLCAweDAsIDB4MTgyMSwKLTB4MzA4NDAwZmYsIDB4MjQwNWZmZGYsIDB4MjQwNmZmYmYsIDB4NjQxMDA3LAotMHgzMDQyMDAwMSwgMHgxMDQwMDAwNCwgMHgwLCAweDhmODIwMDQ0LAotMHgxMDAwMDAwMywgMHgzNDQyMDA0MCwgMHg4ZjgyMDA0NCwgMHg0NjEwMjQsCi0weGFmODIwMDQ0LCAweDhmODIwMDQ0LCAweDM0NDIwMDIwLCAweGFmODIwMDQ0LAotMHg4ZjgyMDA0NCwgMHg0NTEwMjQsIDB4YWY4MjAwNDQsIDB4MjQ2MzAwMDEsCi0weDI4NjIwMDA4LCAweDU0NDBmZmVlLCAweDY0MTAwNywgMHgzZTAwMDA4LAotMHgwLCAweDJjODIwMDA4LCAweDEwNDAwMDFiLCAweDAsCi0weDI0MDVmZmRmLCAweDI0MDZmZmJmLCAweDQxODgwLCAweDNjMDIwMDAxLAotMHgyNDQyNmU2MCwgMHg2MjE4MjEsIDB4MjQ2NDAwMDQsIDB4OTA2MjAwMDAsCi0weDEwNDAwMDA0LCAweDAsIDB4OGY4MjAwNDQsIDB4MTAwMDAwMDMsCi0weDM0NDIwMDQwLCAweDhmODIwMDQ0LCAweDQ2MTAyNCwgMHhhZjgyMDA0NCwKLTB4OGY4MjAwNDQsIDB4MzQ0MjAwMjAsIDB4YWY4MjAwNDQsIDB4OGY4MjAwNDQsCi0weDQ1MTAyNCwgMHhhZjgyMDA0NCwgMHgyNDYzMDAwMSwgMHg2NDEwMmIsCi0weDE0NDBmZmVlLCAweDAsIDB4M2UwMDAwOCwgMHgwLAotMHgwLCAweDAsIDB4MCwgMHg4Zjg0MDBjNCwKLTB4OGY4NjAwZTAsIDB4OGY4NzAwZTQsIDB4MjQwMmZmZjgsIDB4YzIyODI0LAotMHgxMGU1MDAxYSwgMHgyNzYyM2ZmOCwgMHgxNGUyMDAwMiwgMHgyNGU4MDAwOCwKLTB4Mjc2ODMwMDAsIDB4NTUwNTAwMDQsIDB4OGQwYTAwMDAsIDB4MzBjMjAwMDQsCi0weDE0NDAwMDEyLCAweDgwNTAyMSwgMHg4Y2U5MDAwMCwgMHg4ZjQyMDEzYywKLTB4MTQ5NDgyMywgMHg0OTE4MmIsIDB4OTRlYjAwMDYsIDB4MTA2MDAwMDIsCi0weDI1NjMwMDUwLCAweDQ5NDgyMSwgMHgxMjMxODJiLCAweDUwNDAwMDAzLAotMHg4ZjQyMDFmYywgMHgzZTAwMDA4LCAweGUwMTAyMSwgMHhhZjg4MDBlOCwKLTB4MjQ0MjAwMDEsIDB4YWY0MjAxZmMsIDB4YWY4ODAwZTQsIDB4M2UwMDAwOCwKLTB4MTAyMSwgMHgzZTAwMDA4LCAweDAsIDB4OGY4MzAwZTQsCi0weDI3NjIzZmY4LCAweDEwNjIwMDA0LCAweDI0NjIwMDA4LCAweGFmODIwMGU4LAotMHgzZTAwMDA4LCAweGFmODIwMGU0LCAweDI3NjIzMDAwLCAweGFmODIwMGU4LAotMHgzZTAwMDA4LCAweGFmODIwMGU0LCAweDNlMDAwMDgsIDB4MCwKLTB4MCwgMHgwLCAweDAsIDB4OGY4ODAxMjAsCi0weDI3NjI0ZmUwLCAweDhmODMwMTI4LCAweDE1MDIwMDAyLCAweDI1MDkwMDIwLAotMHgyNzY5NDgwMCwgMHgxMTIzMDAxMiwgMHg4ZmEyMDAxMCwgMHhhZDA0MDAwMCwKLTB4YWQwNTAwMDQsIDB4YWQwNjAwMDgsIDB4YTUwNzAwMGUsIDB4OGZhMzAwMTQsCi0weGFkMDIwMDE4LCAweDhmYTIwMDE4LCAweGFkMDMwMDFjLCAweDI1MDMwMDE2LAotMHhhZDAyMDAxMCwgMHhhZDAzMDAxNCwgMHhhZjg5MDEyMCwgMHg4ZjQzMDBmYywKLTB4MjQwMjAwMDEsIDB4MjQ2M2ZmZmYsIDB4M2UwMDAwOCwgMHhhZjQzMDBmYywKLTB4OGY0MzAzMjQsIDB4MTAyMSwgMHgyNDYzMDAwMSwgMHgzZTAwMDA4LAotMHhhZjQzMDMyNCwgMHgzZTAwMDA4LCAweDAsIDB4OGY4ODAxMDAsCi0weDI3NjI0N2UwLCAweDhmODMwMTA4LCAweDE1MDIwMDAyLCAweDI1MDkwMDIwLAotMHgyNzY5NDAwMCwgMHgxMTIzMDAwZiwgMHg4ZmEyMDAxMCwgMHhhZDA0MDAwMCwKLTB4YWQwNTAwMDQsIDB4YWQwNjAwMDgsIDB4YTUwNzAwMGUsIDB4OGZhMzAwMTQsCi0weGFkMDIwMDE4LCAweDhmYTIwMDE4LCAweGFkMDMwMDFjLCAweDI1MDMwMDE2LAotMHhhZDAyMDAxMCwgMHhhZDAzMDAxNCwgMHhhZjg5MDEwMCwgMHgzZTAwMDA4LAotMHgyNDAyMDAwMSwgMHg4ZjQzMDMyOCwgMHgxMDIxLCAweDI0NjMwMDAxLAotMHgzZTAwMDA4LCAweGFmNDMwMzI4LCAweDNlMDAwMDgsIDB4MCwKLTB4MCwgMHgwLCAweDAsIDB4MCB9Owotc3RhdGljIHUzMiB0aWdvbjJGd1JvZGF0YVsoTUFYX1JPREFUQV9MRU4vNCkgKyAxXSBfX2RldmluaXRkYXRhID0gewotMHgyNDQ4NjU2MSwgMHg2NDY1NzIzYSwgMHgyMDJmNzA3MiwKLTB4NmY2YTY1NjMsIDB4NzQ3MzJmNzIsIDB4NjM3MzJmNzMsIDB4NzcyZjY3NjUsCi0weDJmMmUyZjZlLCAweDY5NjMyZjY2LCAweDc3MzIyZjYzLCAweDZmNmQ2ZDZmLAotMHg2ZTJmNjY3NywgMHg2ZDYxNjk2ZSwgMHgyZTYzMmM3NiwgMHgyMDMxMmUzMSwKLTB4MmUzMjJlMzQsIDB4MzUyMDMxMzksIDB4MzkzOTJmMzAsIDB4MzEyZjMyMzQsCi0weDIwMzAzMDNhLCAweDMxMzAzYTM1LCAweDM1MjA3MzY4LCAweDc1NjE2ZTY3LAotMHgyMDQ1Nzg3MCwgMHgyMDI0MDAwMCwgMHg2NTc2NzQ1MiwgMHg2ZTY3NDYwMCwKLTB4NTE2NTc2NzQsIDB4NDYwMDAwMDAsIDB4NTE2NTc2NzQsIDB4NTA1ZjQ2MDAsCi0weDRkNjU3Njc0LCAweDUyNmU2NzQ2LCAweDAsIDB4NGQ1MTY1NzYsCi0weDc0NDYwMDAwLCAweDRkNTE2NTc2LCAweDUwNWY0NjAwLCAweDUxNzM0MzZmLAotMHg2ZTQ5NWY0NiwgMHgwLCAweDUxNzM0MzZmLCAweDZlNzM0NjAwLAotMHg1MTcyNTA3MiwgMHg2ZjY0NDYwMCwgMHg2MjYxNjQ0ZCwgMHg2NTZkNTM3YSwKLTB4MCwgMHg2ODc3NTY2NSwgMHg3MjAwMDAwMCwgMHg2MjYxNjQ0OCwKLTB4Nzc1NjY1NzIsIDB4MCwgMHgyYTJhNDQ0MSwgMHg1NzRlNWY0MSwKLTB4MCwgMHg3NDc4NTI3OCwgMHg0MjY2NTM3YSwgMHgwLAotMHg2MjY2NDE3NCwgMHg2ZTRkNzI2YiwgMHgwLCAweDcyNjU2NDVhLAotMHg2ZjZlNjUzMSwgMHgwLCAweDcwNjM2OTQzLCAweDZmNmU2NjAwLAotMHg2NzY1NmU0MywgMHg2ZjZlNjYwMCwgMHgyYTY0NmQ2MSwgMHg1MjQ0NjY2YywKLTB4MCwgMHgyYTUwNDE0ZSwgMHg0OTQzMmEwMCwgMHgyZTJlMmYyZSwKLTB4MmUyZjJlMmUsIDB4MmYyZTJlMmYsIDB4MmUyZTJmNzMsIDB4NzI2MzJmNmUsCi0weDY5NjMyZjY2LCAweDc3MzIyZjYzLCAweDZmNmQ2ZDZmLCAweDZlMmY2Njc3LAotMHg2ZDYxNjk2ZSwgMHgyZTYzMDAwMCwgMHg3MjYzNjI0NiwgMHg2YzYxNjc3MywKLTB4MCwgMHg2MjYxNjQ1MiwgMHg3ODUyNjM2MiwgMHgwLAotMHg2NzZjNmY2MiwgMHg0NjZjNjc3MywgMHgwLCAweDJiNWY2NDY5LAotMHg3MzcwNWY2YywgMHg2ZjZmNzAwMCwgMHgyYjY1NzY1ZiwgMHg2ODYxNmU2NCwKLTB4NmM2NTcyMDAsIDB4NjM2MTZlNzQsIDB4MzE0NDZkNjEsIDB4MCwKLTB4MmI3MTVmNjQsIDB4NmQ2MTVmNzQsIDB4NmY1ZjZlNjksIDB4NjM1ZjYzNmIsCi0weDczNzU2ZDAwLCAweDJiNjg1ZjczLCAweDY1NmU2NDVmLCAweDY0NjE3NDYxLAotMHg1ZjcyNjU2MSwgMHg2NDc5NWY2MywgMHg2YjczNzU2ZCwgMHgwLAotMHgyYjY4NWY2NCwgMHg2ZDYxNWY3MiwgMHg2NDVmNjE3MywgMHg3MzY5NzM3NCwKLTB4NWY2MzZiNzMsIDB4NzU2ZDAwMDAsIDB4NzQ0MzZiNzMsIDB4NmQ0ZjZlMDAsCi0weDJiNzE1ZjY0LCAweDZkNjE1Zjc0LCAweDZmNWY2ZTY5LCAweDYzMDAwMDAwLAotMHgyYjY4NWY3MywgMHg2NTZlNjQ1ZiwgMHg2NDYxNzQ2MSwgMHg1ZjcyNjU2MSwKLTB4NjQ3OTAwMDAsIDB4MmI2ODVmNjQsIDB4NmQ2MTVmNzIsIDB4NjQ1ZjYxNzMsCi0weDczNjk3Mzc0LCAweDAsIDB4NzQ0MzZiNzMsIDB4NmQ0ZjY2NjYsCi0weDAsIDB4MmI2ODVmNzMsIDB4NjU2ZTY0NWYsIDB4NjI2NDVmNzIsCi0weDY1NjE2NDc5LCAweDAsIDB4Njg3Mzc0NTMsIDB4NTI2OTZlNjcsCi0weDAsIDB4NjI2MTY0NTMsIDB4NTI2OTZlNjcsIDB4MCwKLTB4NmU2OTYzNTMsIDB4NTI2OTZlNjcsIDB4MCwgMHg3NzQ0NmQ2MSwKLTB4NDE2YzZjNDEsIDB4MCwgMHgyYjcxNWY2NCwgMHg2ZDYxNWY3NCwKLTB4NmY1ZjY4NmYsIDB4NzM3NDVmNjMsIDB4NmI3Mzc1NmQsIDB4MCwKLTB4MmI2ODVmNmQsIDB4NjE2MzVmNzIsIDB4Nzg1ZjYzNmYsIDB4NmQ3MDVmNjMsCi0weDZiNzM3NTZkLCAweDAsIDB4MmI2ODVmNjQsIDB4NmQ2MTVmNzcsCi0weDcyNWY2MTczLCAweDczNjk3Mzc0LCAweDVmNjM2YjczLCAweDc1NmQwMDAwLAotMHg3MjQzNmI3MywgMHg2ZDRmNmUwMCwgMHgyYjcxNWY2NCwgMHg2ZDYxNWY3NCwKLTB4NmY1ZjY4NmYsIDB4NzM3NDAwMDAsIDB4MmI2ODVmNmQsIDB4NjE2MzVmNzIsCi0weDc4NWY2MzZmLCAweDZkNzAwMDAwLCAweDJiNjg1ZjY0LCAweDZkNjE1Zjc3LAotMHg3MjVmNjE3MywgMHg3MzY5NzM3NCwgMHgwLCAweDcyNDM2YjczLAotMHg2ZDRmNjY2NiwgMHgwLCAweDJiNjg1ZjcyLCAweDY1NjM3NjVmLAotMHg2MjY0NWY3MiwgMHg2NTYxNjQ3OSwgMHgwLCAweDJiNjg1ZjcyLAotMHg2NTYzNzY1ZiwgMHg2YTc1NmQ2MiwgMHg2ZjVmNjI2NCwgMHg1ZjcyNjU2MSwKLTB4NjQ3OTAwMDAsIDB4MmI2ODVmNzIsIDB4NjU2Mzc2NWYsIDB4NmQ2OTZlNjksCi0weDVmNjI2NDVmLCAweDcyNjU2MTY0LCAweDc5MDAwMDAwLCAweDJiNmQ2ODVmLAotMHg2MzZmNmQ2ZCwgMHg2MTZlNjQwMCwgMHgyYjY4NWY3NCwgMHg2OTZkNjU3MiwKLTB4MCwgMHgyYjY4NWY2NCwgMHg2ZjVmNzU3MCwgMHg2NDYxNzQ2NSwKLTB4NWY3NDc4NWYsIDB4NjM2ZjZlNzMsIDB4MCwgMHgyYjY4NWY2NCwKLTB4NmY1Zjc1NzAsIDB4NjQ2MTc0NjUsIDB4NWY3Mjc4NWYsIDB4NzA3MjZmNjQsCi0weDAsIDB4MmI2MzZiNzMsIDB4NzU2ZDMxMzYsIDB4MCwKLTB4MmI3MDY1NjUsIDB4NmI1ZjZkNjEsIDB4NjM1ZjcyNzgsIDB4NWY3NzYxMDAsCi0weDJiNzA2NTY1LCAweDZiNWY2ZDYxLCAweDYzNWY3Mjc4LCAweDAsCi0weDJiNjQ2NTcxLCAweDVmNmQ2MTYzLCAweDVmNzI3ODAwLCAweDJiNjg1ZjZkLAotMHg2MTYzNWY3MiwgMHg3ODVmNjE3NCwgMHg3NDZlMDAwMCwgMHg2MjYxNjQ1MiwKLTB4NjU3NDUzN2EsIDB4MCwgMHg3Mjc4NDI2NCwgMHg0MjY2NTM3YSwKLTB4MCwgMHgyYjZlNzU2YywgMHg2YzVmNjg2MSwgMHg2ZTY0NmM2NSwKLTB4NzIwMDAwMDAsIDB4NjY3NzRmNzAsIDB4NDY2MTY5NmMsIDB4MCwKLTB4MmI2ODVmNzUsIDB4NzA2NDYxNzQsIDB4NjU1ZjZjNjUsIDB4NjQzNDAwMDAsCi0weDJiNjg1Zjc1LCAweDcwNjQ2MTc0LCAweDY1NWY2YzY1LCAweDY0MzYwMDAwLAotMHgyYjY4NWY3NSwgMHg3MDY0NjE3NCwgMHg2NTVmNmM2NSwgMHg2NDMyMDAwMCwKLTB4Njk2ZTc0NTMsIDB4NzQ2MTc0NjUsIDB4MCwgMHgyYTJhNjk2ZSwKLTB4Njk3NDQzNzAsIDB4MCwgMHgyMzczNjM3MiwgMHg2NTYxNmQwMCwKLTB4Njk1Mzc0NjEsIDB4NjM2YjQ1NzIsIDB4MCwgMHg3MDcyNmY2MiwKLTB4NjU0ZDY1NmQsIDB4MCwgMHgyYTJhNDQ0MSwgMHg1NzRlNWY0MiwKLTB4MCwgMHgyYjczNzc1ZiwgMHg2NDZkNjE1ZiwgMHg2MTczNzM2OSwKLTB4NzM3NDVmNzAsIDB4NmM3NTczNWYsIDB4NzQ2OTZkNjUsIDB4NzIwMDAwMDAsCi0weDJiMjY3MDcyLCAweDY1NmM2ZjYxLCAweDY0NWY3NzcyLCAweDVmNjQ2NTczLAotMHg2MzcyMDAwMCwgMHgyYjI2NzA3MiwgMHg2NTZjNmY2MSwgMHg2NDVmNzI2NCwKLTB4NWY2NDY1NzMsIDB4NjM3MjAwMDAsIDB4MmI2ODVmNjgsIDB4NjY1Zjc0NjksCi0weDZkNjU3MjAwLCAweDI0NDg2NTYxLCAweDY0NjU3MjNhLCAweDIwMmY3MDcyLAotMHg2ZjZhNjU2MywgMHg3NDczMmY3MiwgMHg2MzczMmY3MywgMHg3NzJmNjc2NSwKLTB4MmYyZTJmNmUsIDB4Njk2MzJmNjYsIDB4NzczMjJmNjMsIDB4NmY2ZDZkNmYsCi0weDZlMmY3NDY5LCAweDZkNjU3MjJlLCAweDYzMmM3NjIwLCAweDMxMmUzMTJlLAotMHgzMjJlMzMzNSwgMHgyMDMxMzkzOSwgMHgzOTJmMzAzMSwgMHgyZjMyMzcyMCwKLTB4MzEzOTNhMzAsIDB4MzkzYTM1MzAsIDB4MjA2ODYxNzksIDB4NjU3MzIwNDUsCi0weDc4NzAyMDI0LCAweDAsIDB4NjU3Njc0NTIsIDB4NmU2NzQ2MDAsCi0weDUxNjU3Njc0LCAweDQ2MDAwMDAwLCAweDUxNjU3Njc0LCAweDUwNWY0NjAwLAotMHg0ZDY1NzY3NCwgMHg1MjZlNjc0NiwgMHgwLCAweDRkNTE2NTc2LAotMHg3NDQ2MDAwMCwgMHg0ZDUxNjU3NiwgMHg1MDVmNDYwMCwgMHg1MTczNDM2ZiwKLTB4NmU0OTVmNDYsIDB4MCwgMHg1MTczNDM2ZiwgMHg2ZTczNDYwMCwKLTB4NTE3MjUwNzIsIDB4NmY2NDQ2MDAsIDB4NTQyZDQ0NmQsIDB4NjE1MjY0MzIsCi0weDAsIDB4NTQyZDQ0NmQsIDB4NjE1MjY0MzEsIDB4MCwKLTB4NTQyZDQ0NmQsIDB4NjE1MjY0NDIsIDB4MCwgMHg1NDJkNDQ2ZCwKLTB4NjE1NzcyMzIsIDB4MCwgMHg1NDJkNDQ2ZCwgMHg2MTU3NzIzMSwKLTB4MCwgMHg1NDJkNDQ2ZCwgMHg2MTU3NzI0MiwgMHgwLAotMHgwLCAweDI0NDg2NTYxLCAweDY0NjU3MjNhLCAweDIwMmY3MDcyLAotMHg2ZjZhNjU2MywgMHg3NDczMmY3MiwgMHg2MzczMmY3MywgMHg3NzJmNjc2NSwKLTB4MmYyZTJmNmUsIDB4Njk2MzJmNjYsIDB4NzczMjJmNjMsIDB4NmY2ZDZkNmYsCi0weDZlMmY2MzZmLCAweDZkNmQ2MTZlLCAweDY0MmU2MzJjLCAweDc2MjAzMTJlLAotMHgzMTJlMzIyZSwgMHgzMjM4MjAzMSwgMHgzOTM5MzkyZiwgMHgzMDMxMmYzMiwKLTB4MzAyMDMxMzksIDB4M2EzNDM5M2EsIDB4MzQzOTIwNzMsIDB4Njg3NTYxNmUsCi0weDY3MjA0NTc4LCAweDcwMjAyNDAwLCAweDY1NzY3NDUyLCAweDZlNjc0NjAwLAotMHg1MTY1NzY3NCwgMHg0NjAwMDAwMCwgMHg1MTY1NzY3NCwgMHg1MDVmNDYwMCwKLTB4NGQ2NTc2NzQsIDB4NTI2ZTY3NDYsIDB4MCwgMHg0ZDUxNjU3NiwKLTB4NzQ0NjAwMDAsIDB4NGQ1MTY1NzYsIDB4NTA1ZjQ2MDAsIDB4NTE3MzQzNmYsCi0weDZlNDk1ZjQ2LCAweDAsIDB4NTE3MzQzNmYsIDB4NmU3MzQ2MDAsCi0weDUxNzI1MDcyLCAweDZmNjQ0NjAwLCAweDNmNDg2MzZkLCAweDY0NGQ2Mjc4LAotMHgwLCAweDNmNjM2ZDY0LCAweDQ4NzM3NDUzLCAweDAsCi0weDNmNjM2ZDY0LCAweDRkNjM0ZDY0LCAweDAsIDB4M2Y2MzZkNjQsCi0weDUwNzI2ZjZkLCAweDAsIDB4M2Y2MzZkNjQsIDB4NGM2OTZlNmIsCi0weDAsIDB4M2Y2MzZkNjQsIDB4NDU3MjcyMDAsIDB4ODZhYywKLTB4OGU1YywgMHg4ZTVjLCAweDhkZTQsIDB4OGI3OCwKLTB4OGUzMCwgMHg4ZTVjLCAweDg3OTAsIDB4ODgwMCwKLTB4ODk5MCwgMHg4YTY4LCAweDhhMzQsIDB4OGU1YywKLTB4ODg3MCwgMHg4YjI0LCAweDhlNWMsIDB4OGIzNCwKLTB4ODdiNCwgMHg4ODI0LCAweDAsIDB4MCwKLTB4MCwgMHgyNDQ4NjU2MSwgMHg2NDY1NzIzYSwgMHgyMDJmNzA3MiwKLTB4NmY2YTY1NjMsIDB4NzQ3MzJmNzIsIDB4NjM3MzJmNzMsIDB4NzcyZjY3NjUsCi0weDJmMmUyZjZlLCAweDY5NjMyZjY2LCAweDc3MzIyZjYzLCAweDZmNmQ2ZDZmLAotMHg2ZTJmNmQ2MywgMHg2MTczNzQyZSwgMHg2MzJjNzYyMCwgMHgzMTJlMzEyZSwKLTB4MzIyZTM4MjAsIDB4MzEzOTM5MzgsIDB4MmYzMTMyMmYsIDB4MzAzODIwMzAsCi0weDMyM2EzMzM2LCAweDNhMzMzNjIwLCAweDczNjg3NTYxLCAweDZlNjcyMDQ1LAotMHg3ODcwMjAyNCwgMHgwLCAweDY1NzY3NDUyLCAweDZlNjc0NjAwLAotMHg1MTY1NzY3NCwgMHg0NjAwMDAwMCwgMHg1MTY1NzY3NCwgMHg1MDVmNDYwMCwKLTB4NGQ2NTc2NzQsIDB4NTI2ZTY3NDYsIDB4MCwgMHg0ZDUxNjU3NiwKLTB4NzQ0NjAwMDAsIDB4NGQ1MTY1NzYsIDB4NTA1ZjQ2MDAsIDB4NTE3MzQzNmYsCi0weDZlNDk1ZjQ2LCAweDAsIDB4NTE3MzQzNmYsIDB4NmU3MzQ2MDAsCi0weDUxNzI1MDcyLCAweDZmNjQ0NjAwLCAweDYxNjQ2NDRkLCAweDYzNDQ3NTcwLAotMHgwLCAweDYxNjQ2NDRkLCAweDYzNDY3NTZjLCAweDAsCi0weDY0NjU2YzRkLCAweDYzNGU2ZjQ1LCAweDAsIDB4MCwKLTB4MCwgMHgyNDQ4NjU2MSwgMHg2NDY1NzIzYSwgMHgyMDJmNzA3MiwKLTB4NmY2YTY1NjMsIDB4NzQ3MzJmNzIsIDB4NjM3MzJmNzMsIDB4NzcyZjY3NjUsCi0weDJmMmUyZjZlLCAweDY5NjMyZjY2LCAweDc3MzIyZjYzLCAweDZmNmQ2ZDZmLAotMHg2ZTJmNjQ2ZCwgMHg2MTJlNjMyYywgMHg3NjIwMzEyZSwgMHgzMTJlMzIyZSwKLTB4MzIzNDIwMzEsIDB4MzkzOTM4MmYsIDB4MzEzMjJmMzIsIDB4MzEyMDMwMzAsCi0weDNhMzMzMzNhLCAweDMwMzkyMDczLCAweDY4NzU2MTZlLCAweDY3MjA0NTc4LAotMHg3MDIwMjQwMCwgMHg2NTc2NzQ1MiwgMHg2ZTY3NDYwMCwgMHg1MTY1NzY3NCwKLTB4NDYwMDAwMDAsIDB4NTE2NTc2NzQsIDB4NTA1ZjQ2MDAsIDB4NGQ2NTc2NzQsCi0weDUyNmU2NzQ2LCAweDAsIDB4NGQ1MTY1NzYsIDB4NzQ0NjAwMDAsCi0weDRkNTE2NTc2LCAweDUwNWY0NjAwLCAweDUxNzM0MzZmLCAweDZlNDk1ZjQ2LAotMHgwLCAweDUxNzM0MzZmLCAweDZlNzM0NjAwLCAweDUxNzI1MDcyLAotMHg2ZjY0NDYwMCwgMHg3Mzc3NDQ2ZCwgMHg2MTRmNjY2NiwgMHgwLAotMHgzMTQ0NmQ2MSwgMHg0ZjZlMDAwMCwgMHg3Mzc3NDQ2ZCwgMHg2MTRmNmUwMCwKLTB4MjM3MjQ0NmQsIDB4NjE0MTU0NGUsIDB4MCwgMHg3MjQ0NmQ2MSwKLTB4NDE1NDRlMzAsIDB4MCwgMHg3MjQ0NmQ2MSwgMHg0MTU0NGUzMSwKLTB4MCwgMHg3MjQ0NmQ2MSwgMHgzNDQ3NjIwMCwgMHgyYTUwNDE0ZSwKLTB4NDk0MzJhMDAsIDB4MmUyZTJmMmUsIDB4MmUyZjJlMmUsIDB4MmYyZTJlMmYsCi0weDJlMmUyZjczLCAweDcyNjMyZjZlLCAweDY5NjMyZjY2LCAweDc3MzIyZjYzLAotMHg2ZjZkNmQ2ZiwgMHg2ZTJmNjQ2ZCwgMHg2MTJlNjMwMCwgMHgyMzc3NDQ2ZCwKLTB4NjE0MTU0NGUsIDB4MCwgMHg3NzQ0NmQ2MSwgMHg0MTU0NGUzMCwKLTB4MCwgMHg3NzQ0NmQ2MSwgMHg0MTU0NGUzMSwgMHgwLAotMHg3NzQ0NmQ2MSwgMHgzNDQ3NjIwMCwgMHgwLCAweDAsCi0weDAsIDB4MjQ0ODY1NjEsIDB4NjQ2NTcyM2EsIDB4MjAyZjcwNzIsCi0weDZmNmE2NTYzLCAweDc0NzMyZjcyLCAweDYzNzMyZjczLCAweDc3MmY2NzY1LAotMHgyZjJlMmY2ZSwgMHg2OTYzMmY2NiwgMHg3NzMyMmY2MywgMHg2ZjZkNmQ2ZiwKLTB4NmUyZjc0NzIsIDB4NjE2MzY1MmUsIDB4NjMyYzc2MjAsIDB4MzEyZTMxMmUsCi0weDMyMmUzNTIwLCAweDMxMzkzOTM4LCAweDJmMzAzOTJmLCAweDMzMzAyMDMxLAotMHgzODNhMzUzMCwgMHgzYTMyMzgyMCwgMHg3MzY4NzU2MSwgMHg2ZTY3MjA0NSwKLTB4Nzg3MDIwMjQsIDB4MCwgMHgwLCAweDAsCi0weDAsIDB4MjQ0ODY1NjEsIDB4NjQ2NTcyM2EsIDB4MjAyZjcwNzIsCi0weDZmNmE2NTYzLCAweDc0NzMyZjcyLCAweDYzNzMyZjczLCAweDc3MmY2NzY1LAotMHgyZjJlMmY2ZSwgMHg2OTYzMmY2NiwgMHg3NzMyMmY2MywgMHg2ZjZkNmQ2ZiwKLTB4NmUyZjY0NjEsIDB4NzQ2MTJlNjMsIDB4MmM3NjIwMzEsIDB4MmUzMTJlMzIsCi0weDJlMzEzMjIwLCAweDMxMzkzOTM5LCAweDJmMzAzMTJmLCAweDMyMzAyMDMxLAotMHgzOTNhMzQzOSwgMHgzYTM1MzEyMCwgMHg3MzY4NzU2MSwgMHg2ZTY3MjA0NSwKLTB4Nzg3MDIwMjQsIDB4MCwgMHg0NjU3NWY1NiwgMHg0NTUyNTM0OSwKLTB4NGY0ZTNhMjAsIDB4MjMzMTIwNDYsIDB4NzI2OTIwNDEsIDB4NzA3MjIwMzcsCi0weDIwMzEzNzNhLCAweDM1MzczYTM1LCAweDMyMjA1MDQ0LCAweDU0MjAzMjMwLAotMHgzMDMwMDAwMCwgMHg0NjU3NWY0MywgMHg0ZjRkNTA0OSwgMHg0YzQ1NWY1NCwKLTB4NDk0ZDQ1M2EsIDB4MjAzMTM3M2EsIDB4MzUzNzNhMzUsIDB4MzIwMDAwMDAsCi0weDQ2NTc1ZjQzLCAweDRmNGQ1MDQ5LCAweDRjNDU1ZjQyLCAweDU5M2EyMDY0LAotMHg2NTc2NzI2MywgMHg3MzAwMDAwMCwgMHg0NjU3NWY0MywgMHg0ZjRkNTA0OSwKLTB4NGM0NTVmNDgsIDB4NGY1MzU0M2EsIDB4MjA2MzZmNmQsIDB4NzA3NTc0NjUsCi0weDAsIDB4NDY1NzVmNDMsIDB4NGY0ZDUwNDksIDB4NGM0NTVmNDQsCi0weDRmNGQ0MTQ5LCAweDRlM2EyMDY1LCAweDZlNjcyZTYxLCAweDYzNzQ2NTZmLAotMHg2ZTJlNjM2ZiwgMHg2ZDAwMDAwMCwgMHg0NjU3NWY0MywgMHg0ZjRkNTA0OSwKLTB4NGM0NTUyM2EsIDB4MjA2NzYzNjMsIDB4MjA3NjY1NzIsIDB4NzM2OTZmNmUsCi0weDIwMzIyZTM3LCAweDJlMzIwMDAwLCAweDAsIDB4MTIwNDExMDAsCi0weDAsIDB4MjQ0ODY1NjEsIDB4NjQ2NTcyM2EsIDB4MjAyZjcwNzIsCi0weDZmNmE2NTYzLCAweDc0NzMyZjcyLCAweDYzNzMyZjczLCAweDc3MmY2NzY1LAotMHgyZjJlMmY2ZSwgMHg2OTYzMmY2NiwgMHg3NzMyMmY2MywgMHg2ZjZkNmQ2ZiwKLTB4NmUyZjZkNjUsIDB4NmQyZTYzMmMsIDB4NzYyMDMxMmUsIDB4MzEyZTMyMmUsCi0weDM1MjAzMTM5LCAweDM5MzgyZjMwLCAweDM5MmYzMzMwLCAweDIwMzEzODNhLAotMHgzNTMwM2EzMCwgMHgzODIwNzM2OCwgMHg3NTYxNmU2NywgMHgyMDQ1Nzg3MCwKLTB4MjAyNDAwMDAsIDB4MjQ0ODY1NjEsIDB4NjQ2NTcyM2EsIDB4MjAyZjcwNzIsCi0weDZmNmE2NTYzLCAweDc0NzMyZjcyLCAweDYzNzMyZjczLCAweDc3MmY2NzY1LAotMHgyZjJlMmY2ZSwgMHg2OTYzMmY2NiwgMHg3NzMyMmY2MywgMHg2ZjZkNmQ2ZiwKLTB4NmUyZjczNjUsIDB4NmU2NDJlNjMsIDB4MmM3NjIwMzEsIDB4MmUzMTJlMzIsCi0weDJlMzQzNDIwLCAweDMxMzkzOTM4LCAweDJmMzEzMjJmLCAweDMyMzEyMDMwLAotMHgzMDNhMzMzMywgMHgzYTMxMzgyMCwgMHg3MzY4NzU2MSwgMHg2ZTY3MjA0NSwKLTB4Nzg3MDIwMjQsIDB4MCwgMHg2NTc2NzQ1MiwgMHg2ZTY3NDYwMCwKLTB4NTE2NTc2NzQsIDB4NDYwMDAwMDAsIDB4NTE2NTc2NzQsIDB4NTA1ZjQ2MDAsCi0weDRkNjU3Njc0LCAweDUyNmU2NzQ2LCAweDAsIDB4NGQ1MTY1NzYsCi0weDc0NDYwMDAwLCAweDRkNTE2NTc2LCAweDUwNWY0NjAwLCAweDUxNzM0MzZmLAotMHg2ZTQ5NWY0NiwgMHgwLCAweDUxNzM0MzZmLCAweDZlNzM0NjAwLAotMHg1MTcyNTA3MiwgMHg2ZjY0NDYwMCwgMHg2OTczNmU3NCwgMHg1NDYzNzA1NSwKLTB4MCwgMHgyNDQ4NjU2MSwgMHg2NDY1NzIzYSwgMHgyMDJmNzA3MiwKLTB4NmY2YTY1NjMsIDB4NzQ3MzJmNzIsIDB4NjM3MzJmNzMsIDB4NzcyZjY3NjUsCi0weDJmMmUyZjZlLCAweDY5NjMyZjY2LCAweDc3MzIyZjYzLCAweDZmNmQ2ZDZmLAotMHg2ZTJmNzI2NSwgMHg2Mzc2MmU2MywgMHgyYzc2MjAzMSwgMHgyZTMxMmUzMiwKLTB4MmUzNTMzMjAsIDB4MzEzOTM5MzksIDB4MmYzMDMxMmYsIDB4MzEzNjIwMzAsCi0weDMyM2EzNTM1LCAweDNhMzQzMzIwLCAweDczNjg3NTYxLCAweDZlNjcyMDQ1LAotMHg3ODcwMjAyNCwgMHgwLCAweDY1NzY3NDUyLCAweDZlNjc0NjAwLAotMHg1MTY1NzY3NCwgMHg0NjAwMDAwMCwgMHg1MTY1NzY3NCwgMHg1MDVmNDYwMCwKLTB4NGQ2NTc2NzQsIDB4NTI2ZTY3NDYsIDB4MCwgMHg0ZDUxNjU3NiwKLTB4NzQ0NjAwMDAsIDB4NGQ1MTY1NzYsIDB4NTA1ZjQ2MDAsIDB4NTE3MzQzNmYsCi0weDZlNDk1ZjQ2LCAweDAsIDB4NTE3MzQzNmYsIDB4NmU3MzQ2MDAsCi0weDUxNzI1MDcyLCAweDZmNjQ0NjAwLCAweDcyNGQ2MTYzLCAweDQzNjg2YjMwLAotMHgwLCAweDcyNzg0NjcyLCAweDZkMzI0YzY3LCAweDAsCi0weDcyNzg0ZTZmLCAweDUzNzQ0MjY0LCAweDAsIDB4NzI3ODRlNmYsCi0weDRkNjk0MjY0LCAweDAsIDB4NzI3ODRlNmYsIDB4NGE2ZDQyNjQsCi0weDAsIDB4NzI3ODQzNmIsIDB4NDQ2ZDYxNDYsIDB4MCwKLTB4NzI3ODUxNDQsIDB4NmQ0NTc4NDYsIDB4MCwgMHg3Mjc4NTE0NCwKLTB4NmQ2MTQ2MDAsIDB4NzI3ODUxNDQsIDB4NGM0MjY0NDYsIDB4MCwKLTB4NzI3ODUxNDQsIDB4NmQ0MjY0NDYsIDB4MCwgMHg3Mjc4NDM3MiwKLTB4NjM1MDYxNjQsIDB4MCwgMHg3MjUzNmQ1MSwgMHg0NDZkNjE0NiwKLTB4MCwgMHgyNDQ4NjU2MSwgMHg2NDY1NzIzYSwgMHgyMDJmNzA3MiwKLTB4NmY2YTY1NjMsIDB4NzQ3MzJmNzIsIDB4NjM3MzJmNzMsIDB4NzcyZjY3NjUsCi0weDJmMmUyZjZlLCAweDY5NjMyZjY2LCAweDc3MzIyZjYzLCAweDZmNmQ2ZDZmLAotMHg2ZTJmNmQ2MSwgMHg2MzJlNjMyYywgMHg3NjIwMzEyZSwgMHgzMTJlMzIyZSwKLTB4MzIzMjIwMzEsIDB4MzkzOTM4MmYsIDB4MzEzMjJmMzAsIDB4MzgyMDMwMzIsCi0weDNhMzMzNjNhLCAweDMzMzAyMDczLCAweDY4NzU2MTZlLCAweDY3MjA0NTc4LAotMHg3MDIwMjQwMCwgMHg2NTc2NzQ1MiwgMHg2ZTY3NDYwMCwgMHg1MTY1NzY3NCwKLTB4NDYwMDAwMDAsIDB4NTE2NTc2NzQsIDB4NTA1ZjQ2MDAsIDB4NGQ2NTc2NzQsCi0weDUyNmU2NzQ2LCAweDAsIDB4NGQ1MTY1NzYsIDB4NzQ0NjAwMDAsCi0weDRkNTE2NTc2LCAweDUwNWY0NjAwLCAweDUxNzM0MzZmLCAweDZlNDk1ZjQ2LAotMHgwLCAweDUxNzM0MzZmLCAweDZlNzM0NjAwLCAweDUxNzI1MDcyLAotMHg2ZjY0NDYwMCwgMHg2ZDYxNjM1NCwgMHg2ODcyNjU3MywgMHgwLAotMHgyMzc0NGQ2MSwgMHg2MzQxNTQ0ZSwgMHgwLCAweDIzNzI0ZDYxLAotMHg2MzQxNTQ0ZSwgMHgwLCAweDcyNjU2ZDQxLCAweDczNzM3Mjc0LAotMHgwLCAweDZjNjk2ZTZiLCAweDQ0NGY1NzRlLCAweDAsCi0weDZjNjk2ZTZiLCAweDU1NTAwMDAwLCAweDAsIDB4MCwKLTB4MCwgMHgyNDQ4NjU2MSwgMHg2NDY1NzIzYSwgMHgyMDJmNzA3MiwKLTB4NmY2YTY1NjMsIDB4NzQ3MzJmNzIsIDB4NjM3MzJmNzMsIDB4NzcyZjY3NjUsCi0weDJmMmUyZjZlLCAweDY5NjMyZjY2LCAweDc3MzIyZjYzLCAweDZmNmQ2ZDZmLAotMHg2ZTJmNjM2YiwgMHg3Mzc1NmQyZSwgMHg2MzJjNzYyMCwgMHgzMTJlMzEyZSwKLTB4MzIyZTM5MjAsIDB4MzEzOTM5MzksIDB4MmYzMDMxMmYsIDB4MzEzNDIwMzAsCi0weDMwM2EzMDMzLCAweDNhMzQzODIwLCAweDczNjg3NTYxLCAweDZlNjcyMDQ1LAotMHg3ODcwMjAyNCwgMHgwLCAweDY1NzY3NDUyLCAweDZlNjc0NjAwLAotMHg1MTY1NzY3NCwgMHg0NjAwMDAwMCwgMHg1MTY1NzY3NCwgMHg1MDVmNDYwMCwKLTB4NGQ2NTc2NzQsIDB4NTI2ZTY3NDYsIDB4MCwgMHg0ZDUxNjU3NiwKLTB4NzQ0NjAwMDAsIDB4NGQ1MTY1NzYsIDB4NTA1ZjQ2MDAsIDB4NTE3MzQzNmYsCi0weDZlNDk1ZjQ2LCAweDAsIDB4NTE3MzQzNmYsIDB4NmU3MzQ2MDAsCi0weDUxNzI1MDcyLCAweDZmNjQ0NjAwLCAweDAsIDB4MCwKLTB4MCwgMHg1MDcyNmY2MiwgMHg2NTUwNjg3OSwgMHgwLAotMHg2YzZlNmI0MSwgMHg1MzUzNTI1NCwgMHgwLCAweDEwOWE0LAotMHgxMGExYywgMHgxMGE1MCwgMHgxMGE3YywgMHgxMTA1MCwKLTB4MTBhYTgsIDB4MTBiMTAsIDB4MTExZmMsIDB4MTBkYzAsCi0weDEwYzY4LCAweDEwYzgwLCAweDEwY2M0LCAweDEwY2VjLAotMHgxMGQwYywgMHgxMGQzNCwgMHgxMTFmYywgMHgxMGRjMCwKLTB4MTBkZjgsIDB4MTBlMTAsIDB4MTBlNDAsIDB4MTBlNjgsCi0weDEwZTg4LCAweDEwZWIwLCAweDAsIDB4MTBmZGMsCi0weDExMDA4LCAweDExMDJjLCAweDExMWZjLCAweDExMDUwLAotMHgxMTA3OCwgMHgxMTEwOCwgMHgwLCAweDAsCi0weDAsIDB4MTE4NmMsIDB4MTE5M2MsIDB4MTFhMTQsCi0weDExYWU0LCAweDExYjQwLCAweDExYzFjLCAweDExYzQ0LAotMHgxMWQyMCwgMHgxMWQ0OCwgMHgxMWVmMCwgMHgxMWYxOCwKLTB4MTIwYzAsIDB4MTIyYjgsIDB4MTI1NGMsIDB4MTI0NjAsCi0weDEyNTRjLCAweDEyNTc4LCAweDEyMGU4LCAweDEyMjkwLAotMHg3MjczNzQ1ZiwgMHg2NzZkNjk2OSwgMHgwLCAweDEyNjA4LAotMHgxMjY0MCwgMHgxMjcyOCwgMHgxMzM3NCwgMHgxMzNiNCwKLTB4MTMzY2MsIDB4NzM2NTc0NmMsIDB4NmY2ZjcwMDAsIDB4MCwKLTB4MCwgMHgxM2JiYywgMHgxM2JmYywgMHgxM2M4YywKLTB4MTNjZDAsIDB4MTNkMzQsIDB4MTNkYzAsIDB4MTNkZjQsCi0weDEzZTdjLCAweDEzZjE0LCAweDEzZmU0LCAweDE0MDI0LAotMHgxNDBhOCwgMHgxNDBjYywgMHgxNDFkYywgMHg2NDZmNDI2MSwKLTB4NzM2NTUwNjcsIDB4MCwgMHgwLCAweDAsCi0weDAsIDB4NzM3NDZkNjEsIDB4NjM0YzRlNGIsIDB4MCwKLTB4Njc2NTc0NmQsIDB4NjM2YzZlNmIsIDB4MCwgMHgxNGVkOCwKLTB4MTRlZDgsIDB4MTRiOGMsIDB4MTRiZDgsIDB4MTRjMjQsCi0weDE0ZWQ4LCAweDczNjU3NDZkLCAweDYxNjM2MTYzLCAweDc0MDAwMDAwLAotMHgwLCAweDAgfTsKLXN0YXRpYyB1MzIgdGlnb24yRndEYXRhWyhNQVhfREFUQV9MRU4vNCkgKyAxXSBfX2RldmluaXRkYXRhID0gewotMHgxLAotMHgxLCAweDEsIDB4YzAwMWZjLCAweDNmZmMsCi0weGMwMDAwMCwgMHg0MTZjNzQ2NSwgMHg2ZjZlMjA0MSwgMHg2MzY1NGU0OSwKLTB4NDMyMDU2MDAsIDB4MCwgMHgwLCAweDAsCi0weDAsIDB4MCwgMHgwLCAweDQxNmM3NDY1LAotMHg2ZjZlMjA0MSwgMHg2MzY1NGU0OSwgMHg0MzIwNTYwMCwgMHg0MjQyNDI0MiwKLTB4MCwgMHgwLCAweDAsIDB4MWZmZmZjLAotMHgxZmZmN2MsIDB4MCwgMHgwLCAweDAsCi0weDAsIDB4MCwgMHgwLCAweDYwY2YwMCwKLTB4NjAsIDB4Y2YwMDAwMDAsIDB4MCwgMHgwLAotMHgwLCAweDAsIDB4MCwgMHgwLAotMHgwLCAweDAsIDB4MCwgMHgwLAotMHgwLCAweDAsIDB4MCwgMHgwLAotMHgwLCAweDAsIDB4MCwgMHgwLAotMHgwLCAweDAsIDB4MywgMHgwLAotMHgxLCAweDAsIDB4MCwgMHgwLAotMHgxLCAweDAsIDB4MSwgMHgwLAotMHgwLCAweDAsIDB4MCwgMHgxLAotMHgxLCAweDAsIDB4MCwgMHgwLAotMHgwLCAweDAsIDB4MTAwMDAwMCwgMHgyMTAwMDAwMCwKLTB4MTIwMDAxNDAsIDB4MCwgMHgwLCAweDIwMDAwMDAwLAotMHgxMjAwMDBhMCwgMHgwLCAweDEyMDAwMDYwLCAweDEyMDAwMTgwLAotMHgxMjAwMDFlMCwgMHgwLCAweDAsIDB4MCwKLTB4MSwgMHgwLCAweDAsIDB4MCwKLTB4MCwgMHgwLCAweDAsIDB4MiwKLTB4MCwgMHgwLCAweDMwMDAxLCAweDEsCi0weDMwMjAxLCAweDAsIDB4MCwgMHgxMDEwMTAxLAotMHgxMDEwMTAwLCAweDEwMTAwLCAweDEwMTAwMDEsIDB4MTAwMDEsCi0weDEwMDAxMDEsIDB4MTAxLCAweDAsIDB4MCB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYW1kODExMWUuYyBiL2RyaXZlcnMvbmV0L2FtZDgxMTFlLmMKaW5kZXggMTg3YWM2ZS4uNzcwOTk5MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYW1kODExMWUuYworKysgYi9kcml2ZXJzL25ldC9hbWQ4MTExZS5jCkBAIC0xODEzLDYgKzE4MTMsMjUgQEAKIAlscC0+ZXh0X3BoeV9hZGRyID0gMTsKIH0KIAorc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyBhbWQ4MTExZV9uZXRkZXZfb3BzID0geworCS5uZG9fb3BlbgkJPSBhbWQ4MTExZV9vcGVuLAorCS5uZG9fc3RvcAkJPSBhbWQ4MTExZV9jbG9zZSwKKwkubmRvX3N0YXJ0X3htaXQJCT0gYW1kODExMWVfc3RhcnRfeG1pdCwKKwkubmRvX3R4X3RpbWVvdXQJCT0gYW1kODExMWVfdHhfdGltZW91dCwKKwkubmRvX2dldF9zdGF0cwkJPSBhbWQ4MTExZV9nZXRfc3RhdHMsCisJLm5kb19zZXRfbXVsdGljYXN0X2xpc3QgPSBhbWQ4MTExZV9zZXRfbXVsdGljYXN0X2xpc3QsCisJLm5kb192YWxpZGF0ZV9hZGRyCT0gZXRoX3ZhbGlkYXRlX2FkZHIsCisJLm5kb19zZXRfbWFjX2FkZHJlc3MJPSBhbWQ4MTExZV9zZXRfbWFjX2FkZHJlc3MsCisJLm5kb19kb19pb2N0bAkJPSBhbWQ4MTExZV9pb2N0bCwKKwkubmRvX2NoYW5nZV9tdHUJCT0gYW1kODExMWVfY2hhbmdlX210dSwKKyNpZiBBTUQ4MTExRV9WTEFOX1RBR19VU0VECisJLm5kb192bGFuX3J4X3JlZ2lzdGVyCT0gYW1kODExMWVfdmxhbl9yeF9yZWdpc3RlciwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCisJLm5kb19wb2xsX2NvbnRyb2xsZXIJID0gYW1kODExMWVfcG9sbCwKKyNlbmRpZgorfTsKKwogc3RhdGljIGludCBfX2RldmluaXQgYW1kODExMWVfcHJvYmVfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAogCQkJCSAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKIHsKQEAgLTE4NzIsNyArMTg5MSw2IEBACiAKICNpZiBBTUQ4MTExRV9WTEFOX1RBR19VU0VECiAJZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX0hXX1ZMQU5fVFggfCBORVRJRl9GX0hXX1ZMQU5fUlggOwotCWRldi0+dmxhbl9yeF9yZWdpc3RlciA9YW1kODExMWVfdmxhbl9yeF9yZWdpc3RlcjsKICNlbmRpZgogCiAJbHAgPSBuZXRkZXZfcHJpdihkZXYpOwpAQCAtMTkwMSwyNyArMTkxOSwxNiBAQAogCWlmKGR5bmFtaWNfaXBnW2NhcmRfaWR4KytdKQogCQlscC0+b3B0aW9ucyB8PSBPUFRJT05fRFlOX0lQR19FTkFCTEU7CiAKKwogCS8qIEluaXRpYWxpemUgZHJpdmVyIGVudHJ5IHBvaW50cyAqLwotCWRldi0+b3BlbiA9IGFtZDgxMTFlX29wZW47Ci0JZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBhbWQ4MTExZV9zdGFydF94bWl0OwotCWRldi0+c3RvcCA9IGFtZDgxMTFlX2Nsb3NlOwotCWRldi0+Z2V0X3N0YXRzID0gYW1kODExMWVfZ2V0X3N0YXRzOwotCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gYW1kODExMWVfc2V0X211bHRpY2FzdF9saXN0OwotCWRldi0+c2V0X21hY19hZGRyZXNzID0gYW1kODExMWVfc2V0X21hY19hZGRyZXNzOwotCWRldi0+ZG9faW9jdGwgPSBhbWQ4MTExZV9pb2N0bDsKLQlkZXYtPmNoYW5nZV9tdHUgPSBhbWQ4MTExZV9jaGFuZ2VfbXR1OworCWRldi0+bmV0ZGV2X29wcyA9ICZhbWQ4MTExZV9uZXRkZXZfb3BzOwogCVNFVF9FVEhUT09MX09QUyhkZXYsICZvcHMpOwogCWRldi0+aXJxID1wZGV2LT5pcnE7Ci0JZGV2LT50eF90aW1lb3V0ID0gYW1kODExMWVfdHhfdGltZW91dDsKIAlkZXYtPndhdGNoZG9nX3RpbWVvID0gQU1EODExMUVfVFhfVElNRU9VVDsKIAluZXRpZl9uYXBpX2FkZChkZXYsICZscC0+bmFwaSwgYW1kODExMWVfcnhfcG9sbCwgMzIpOwotI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCi0JZGV2LT5wb2xsX2NvbnRyb2xsZXIgPSBhbWQ4MTExZV9wb2xsOwotI2VuZGlmCiAKICNpZiBBTUQ4MTExRV9WTEFOX1RBR19VU0VECiAJZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX0hXX1ZMQU5fVFggfCBORVRJRl9GX0hXX1ZMQU5fUlg7Ci0JZGV2LT52bGFuX3J4X3JlZ2lzdGVyID1hbWQ4MTExZV92bGFuX3J4X3JlZ2lzdGVyOwogI2VuZGlmCiAJLyogUHJvYmUgdGhlIGV4dGVybmFsIFBIWSAqLwogCWFtZDgxMTFlX3Byb2JlX2V4dF9waHkoZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2FwcGxldGFsay9pcGRkcC5jIGIvZHJpdmVycy9uZXQvYXBwbGV0YWxrL2lwZGRwLmMKaW5kZXggOWEwYmU5Yi4uZGE2NGJhOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYXBwbGV0YWxrL2lwZGRwLmMKKysrIGIvZHJpdmVycy9uZXQvYXBwbGV0YWxrL2lwZGRwLmMKQEAgLTQ4LDEyICs0OCwxOCBAQAogCiAvKiBJbmRleCB0byBmdW5jdGlvbnMsIGFzIGZ1bmN0aW9uIHByb3RvdHlwZXMuICovCiBzdGF0aWMgaW50IGlwZGRwX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Ci1zdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmlwZGRwX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIHN0YXRpYyBpbnQgaXBkZHBfY3JlYXRlKHN0cnVjdCBpcGRkcF9yb3V0ZSAqbmV3X3J0KTsKIHN0YXRpYyBpbnQgaXBkZHBfZGVsZXRlKHN0cnVjdCBpcGRkcF9yb3V0ZSAqcnQpOwogc3RhdGljIHN0cnVjdCBpcGRkcF9yb3V0ZSogaXBkZHBfZmluZF9yb3V0ZShzdHJ1Y3QgaXBkZHBfcm91dGUgKnJ0KTsKIHN0YXRpYyBpbnQgaXBkZHBfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICppZnIsIGludCBjbWQpOwogCitzdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIGlwZGRwX25ldGRldl9vcHMgPSB7CisJLm5kb19zdGFydF94bWl0CQk9IGlwZGRwX3htaXQsCisJLm5kb19kb19pb2N0bCAgIAk9IGlwZGRwX2lvY3RsLAorCS5uZG9fY2hhbmdlX210dQkJPSBldGhfY2hhbmdlX210dSwKKwkubmRvX3NldF9tYWNfYWRkcmVzcyAJPSBldGhfbWFjX2FkZHIsCisJLm5kb192YWxpZGF0ZV9hZGRyCT0gZXRoX3ZhbGlkYXRlX2FkZHIsCit9OwogCiBzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKiBfX2luaXQgaXBkZHBfaW5pdCh2b2lkKQogewpAQCAtNjEsNyArNjcsNyBAQAogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CiAJaW50IGVycjsKIAotCWRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cykpOworCWRldiA9IGFsbG9jX2V0aGVyZGV2KDApOwogCWlmICghZGV2KQogCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIApAQCAtNzEsOSArNzcsNyBAQAogICAgICAgICAgICAgICAgIHByaW50ayh2ZXJzaW9uKTsKIAogCS8qIEluaXRhbGl6ZSB0aGUgZGV2aWNlIHN0cnVjdHVyZS4gKi8KLSAgICAgICAgZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBpcGRkcF94bWl0OwotICAgICAgICBkZXYtPmdldF9zdGF0cyAgICAgID0gaXBkZHBfZ2V0X3N0YXRzOwotICAgICAgICBkZXYtPmRvX2lvY3RsICAgICAgID0gaXBkZHBfaW9jdGw7CisJZGV2LT5uZXRkZXZfb3BzID0gJmlwZGRwX25ldGRldl9vcHM7CiAKICAgICAgICAgZGV2LT50eXBlID0gQVJQSFJEX0lQRERQOyAgICAgICAJLyogSVAgb3ZlciBERFAgdHVubmVsICovCiAgICAgICAgIGRldi0+bXR1ID0gNTg1OwpAQCAtMTAzLDEzICsxMDcsNiBAQAogICAgICAgICByZXR1cm4gZGV2OwogfQogCi0vKgotICogR2V0IHRoZSBjdXJyZW50IHN0YXRpc3RpY3MuIFRoaXMgbWF5IGJlIGNhbGxlZCB3aXRoIHRoZSBjYXJkIG9wZW4gb3IgY2xvc2VkLgotICovCi1zdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmlwZGRwX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQotewotCXJldHVybiBuZXRkZXZfcHJpdihkZXYpOwotfQogCiAvKgogICogVHJhbnNtaXQgTExBUC9FTEFQIGZyYW1lIHVzaW5nIGFhcnBfc2VuZF9kZHAuCkBAIC0xNzAsOCArMTY3LDggQEAKIAogICAgICAgICBza2ItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfQVRBTEspOyAgICAgLyogUHJvdG9jb2wgaGFzIGNoYW5nZWQgKi8KIAotCSgoc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKikgbmV0ZGV2X3ByaXYoZGV2KSktPnR4X3BhY2tldHMrKzsKLQkoKHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICopIG5ldGRldl9wcml2KGRldikpLT50eF9ieXRlcyArPSBza2ItPmxlbjsKKwlkZXYtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwlkZXYtPnN0YXRzLnR4X2J5dGVzICs9IHNrYi0+bGVuOwogCiAgICAgICAgIGlmKGFhcnBfc2VuZF9kZHAocnQtPmRldiwgc2tiLCAmcnQtPmF0LCBOVUxMKSA8IDApCiAgICAgICAgICAgICAgICAgZGV2X2tmcmVlX3NrYihza2IpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYXRwLmMgYi9kcml2ZXJzL25ldC9hdHAuYwppbmRleCBlYTQ5M2NlLi40MzE3YjNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9hdHAuYworKysgYi9kcml2ZXJzL25ldC9hdHAuYwpAQCAtMjA0LDggKzIwNCw3IEBACiBzdGF0aWMgdm9pZCBuZXRfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiBzdGF0aWMgdm9pZCByZWFkX2Jsb2NrKGxvbmcgaW9hZGRyLCBpbnQgbGVuZ3RoLCB1bnNpZ25lZCBjaGFyICpidWZmZXIsIGludCBkYXRhX21vZGUpOwogc3RhdGljIGludCBuZXRfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Ci1zdGF0aWMgdm9pZCBzZXRfcnhfbW9kZV84MDAyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwotc3RhdGljIHZvaWQgc2V0X3J4X21vZGVfODAxMihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHNldF9yeF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogc3RhdGljIHZvaWQgdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIAogCkBAIC0yNDIsNiArMjQxLDE3IEBACiAJcmV0dXJuIC1FTk9ERVY7CiB9CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgYXRwX25ldGRldl9vcHMgPSB7CisJLm5kb19vcGVuCQk9IG5ldF9vcGVuLAorCS5uZG9fc3RvcAkJPSBuZXRfY2xvc2UsCisJLm5kb19zdGFydF94bWl0CQk9IGF0cF9zZW5kX3BhY2tldCwKKwkubmRvX3NldF9tdWx0aWNhc3RfbGlzdCA9IHNldF9yeF9tb2RlLAorCS5uZG9fdHhfdGltZW91dAkJPSB0eF90aW1lb3V0LAorCS5uZG9fY2hhbmdlX210dQkJPSBldGhfY2hhbmdlX210dSwKKwkubmRvX3NldF9tYWNfYWRkcmVzcyAJPSBldGhfbWFjX2FkZHIsCisJLm5kb192YWxpZGF0ZV9hZGRyCT0gZXRoX3ZhbGlkYXRlX2FkZHIsCit9OworCiBzdGF0aWMgaW50IF9faW5pdCBhdHBfcHJvYmUxKGxvbmcgaW9hZGRyKQogewogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBOVUxMOwpAQCAtMzQyLDEyICszNTIsNyBAQAogCWlmIChkZXYtPm1lbV9lbmQgJiAweGYpCiAJCW5ldF9kZWJ1ZyA9IGRldi0+bWVtX2VuZCAmIDc7CiAKLQlkZXYtPm9wZW4JCT0gbmV0X29wZW47Ci0JZGV2LT5zdG9wCQk9IG5ldF9jbG9zZTsKLQlkZXYtPmhhcmRfc3RhcnRfeG1pdAk9IGF0cF9zZW5kX3BhY2tldDsKLQlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9Ci0JICBscC0+Y2hpcF90eXBlID09IFJUTDgwMDIgPyAmc2V0X3J4X21vZGVfODAwMiA6ICZzZXRfcnhfbW9kZV84MDEyOwotCWRldi0+dHhfdGltZW91dAkJPSB0eF90aW1lb3V0OworCWRldi0+bmV0ZGV2X29wcyAJPSAmYXRwX25ldGRldl9vcHM7CiAJZGV2LT53YXRjaGRvZ190aW1lbwk9IFRYX1RJTUVPVVQ7CiAKIAlyZXMgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKQEAgLTkwMyw2ICs5MDgsMTcgQEAKICAgICB3cml0ZV9yZWcoaW9hZGRyLCBDTVIyLCBDTVIyX0lSUU9VVCk7IC8qIFN3aXRjaCBiYWNrIHRvIHBhZ2UgMCAqLwogfQogCitzdGF0aWMgdm9pZCBzZXRfcnhfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWlmIChscC0+Y2hpcF90eXBlID09IFJUTDgwMDIpCisJCXJldHVybiBzZXRfcnhfbW9kZV84MDAyKGRldik7CisJZWxzZQorCQlyZXR1cm4gc2V0X3J4X21vZGVfODAxMihkZXYpOworfQorCisKIHN0YXRpYyBpbnQgX19pbml0IGF0cF9pbml0X21vZHVsZSh2b2lkKSB7CiAJaWYgKGRlYnVnKQkJCQkJLyogRW1pdCB2ZXJzaW9uIGV2ZW4gaWYgbm8gY2FyZHMgZGV0ZWN0ZWQuICovCiAJCXByaW50ayhLRVJOX0lORk8gIiVzIiwgdmVyc2lvbik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9iNDQuYyBiL2RyaXZlcnMvbmV0L2I0NC5jCmluZGV4IDBlNzQ3MGEuLjY5MjZlYmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2I0NC5jCisrKyBiL2RyaXZlcnMvbmV0L2I0NC5jCkBAIC0yMTA4LDYgKzIxMDgsMjIgQEAKIAlyZXR1cm4gZXJyOwogfQogCitzdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIGI0NF9uZXRkZXZfb3BzID0geworCS5uZG9fb3BlbgkJPSBiNDRfb3BlbiwKKwkubmRvX3N0b3AJCT0gYjQ0X2Nsb3NlLAorCS5uZG9fc3RhcnRfeG1pdAkJPSBiNDRfc3RhcnRfeG1pdCwKKwkubmRvX2dldF9zdGF0cwkJPSBiNDRfZ2V0X3N0YXRzLAorCS5uZG9fc2V0X211bHRpY2FzdF9saXN0ID0gYjQ0X3NldF9yeF9tb2RlLAorCS5uZG9fc2V0X21hY19hZGRyZXNzCT0gYjQ0X3NldF9tYWNfYWRkciwKKwkubmRvX3ZhbGlkYXRlX2FkZHIJPSBldGhfdmFsaWRhdGVfYWRkciwKKwkubmRvX2RvX2lvY3RsCQk9IGI0NF9pb2N0bCwKKwkubmRvX3R4X3RpbWVvdXQJCT0gYjQ0X3R4X3RpbWVvdXQsCisJLm5kb19jaGFuZ2VfbXR1CQk9IGI0NF9jaGFuZ2VfbXR1LAorI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCisJLm5kb19wb2xsX2NvbnRyb2xsZXIJPSBiNDRfcG9sbF9jb250cm9sbGVyLAorI2VuZGlmCit9OworCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBiNDRfaW5pdF9vbmUoc3RydWN0IHNzYl9kZXZpY2UgKnNkZXYsCiAJCQkJICBjb25zdCBzdHJ1Y3Qgc3NiX2RldmljZV9pZCAqZW50KQogewpAQCAtMjE0NSwyMCArMjE2MSw5IEBACiAJYnAtPnJ4X3BlbmRpbmcgPSBCNDRfREVGX1JYX1JJTkdfUEVORElORzsKIAlicC0+dHhfcGVuZGluZyA9IEI0NF9ERUZfVFhfUklOR19QRU5ESU5HOwogCi0JZGV2LT5vcGVuID0gYjQ0X29wZW47Ci0JZGV2LT5zdG9wID0gYjQ0X2Nsb3NlOwotCWRldi0+aGFyZF9zdGFydF94bWl0ID0gYjQ0X3N0YXJ0X3htaXQ7Ci0JZGV2LT5nZXRfc3RhdHMgPSBiNDRfZ2V0X3N0YXRzOwotCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gYjQ0X3NldF9yeF9tb2RlOwotCWRldi0+c2V0X21hY19hZGRyZXNzID0gYjQ0X3NldF9tYWNfYWRkcjsKLQlkZXYtPmRvX2lvY3RsID0gYjQ0X2lvY3RsOwotCWRldi0+dHhfdGltZW91dCA9IGI0NF90eF90aW1lb3V0OworCWRldi0+bmV0ZGV2X29wcyA9ICZiNDRfbmV0ZGV2X29wczsKIAluZXRpZl9uYXBpX2FkZChkZXYsICZicC0+bmFwaSwgYjQ0X3BvbGwsIDY0KTsKIAlkZXYtPndhdGNoZG9nX3RpbWVvID0gQjQ0X1RYX1RJTUVPVVQ7Ci0jaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKLQlkZXYtPnBvbGxfY29udHJvbGxlciA9IGI0NF9wb2xsX2NvbnRyb2xsZXI7Ci0jZW5kaWYKLQlkZXYtPmNoYW5nZV9tdHUgPSBiNDRfY2hhbmdlX210dTsKIAlkZXYtPmlycSA9IHNkZXYtPmlycTsKIAlTRVRfRVRIVE9PTF9PUFMoZGV2LCAmYjQ0X2V0aHRvb2xfb3BzKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYm54MnhfbGluay5jIGIvZHJpdmVycy9uZXQvYm54MnhfbGluay5jCmluZGV4IDY3ZGU5NGYuLmZlZmE2YWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2JueDJ4X2xpbmsuYworKysgYi9kcml2ZXJzL25ldC9ibngyeF9saW5rLmMKQEAgLTMzNTksNyArMzM1OSw3IEBACiAJdTggc2hpZnQgPSA4KjQ7CiAJdTggZGlnaXQ7CiAJaWYgKGxlbiA8IDEwKSB7Ci0JCS8qIE5lZWQgbW9yZSB0aGVuIDEwY2hhcnMgZm9yIHRoaXMgZm9ybWF0ICovCisJCS8qIE5lZWQgbW9yZSB0aGFuIDEwY2hhcnMgZm9yIHRoaXMgZm9ybWF0ICovCiAJCSpzdHJfcHRyID0gJ1wwJzsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYm54MnhfbWFpbi5jIGIvZHJpdmVycy9uZXQvYm54MnhfbWFpbi5jCmluZGV4IGVmODEwM2IuLjRiZTA1ODQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2JueDJ4X21haW4uYworKysgYi9kcml2ZXJzL25ldC9ibngyeF9tYWluLmMKQEAgLTgyNDMsNiArODI0Myw5IEBACiAJc3RydWN0IGJueDJ4ICpicCA9IG5ldGRldl9wcml2KGRldik7CiAJaW50IHJjOwogCisJaWYgKCFuZXRpZl9ydW5uaW5nKGRldikpCisJCXJldHVybiAtRUFHQUlOOworCiAJRFAoQk5YMlhfTVNHX05WTSwgImV0aHRvb2xfZWVwcm9tOiBjbWQgJWRcbiIKIAkgICBEUF9MRVZFTCAiICBtYWdpYyAweCV4ICBvZmZzZXQgMHgleCAoJWQpICBsZW4gMHgleCAoJWQpXG4iLAogCSAgIGVlcHJvbS0+Y21kLCBlZXByb20tPm1hZ2ljLCBlZXByb20tPm9mZnNldCwgZWVwcm9tLT5vZmZzZXQsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRfbWFpbi5jIGIvZHJpdmVycy9uZXQvYm9uZGluZy9ib25kX21haW4uYwppbmRleCA0NjBjMmNhLi45ZmIzODgzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRfbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L2JvbmRpbmcvYm9uZF9tYWluLmMKQEAgLTQxNDgsNyArNDE0OCw3IEBACiAKIAlib25kX2Zvcl9lYWNoX3NsYXZlKGJvbmQsIHNsYXZlLCBpKSB7CiAJCXByX2RlYnVnKCJzICVwIHMtPnAgJXAgY19tICVwXG4iLCBzbGF2ZSwKLQkJCXNsYXZlLT5wcmV2LCBzbGF2ZS0+ZGV2LT5jaGFuZ2VfbXR1KTsKKwkJCXNsYXZlLT5wcmV2LCBzbGF2ZS0+ZGV2LT5uZXRkZXZfb3BzLT5uZG9fY2hhbmdlX210dSk7CiAKIAkJcmVzID0gZGV2X3NldF9tdHUoc2xhdmUtPmRldiwgbmV3X210dSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2Nhc3NpbmkuYyBiL2RyaXZlcnMvbmV0L2Nhc3NpbmkuYwppbmRleCAzMjFmNDNkLi44NDBiM2QxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9jYXNzaW5pLmMKKysrIGIvZHJpdmVycy9uZXQvY2Fzc2luaS5jCkBAIC00OTc3LDYgKzQ5NzcsMjIgQEAKIAlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgUENJX0xBVEVOQ1lfVElNRVIsIDB4ZmYpOwogfQogCitzdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIGNhc19uZXRkZXZfb3BzID0geworCS5uZG9fb3BlbgkJPSBjYXNfb3BlbiwKKwkubmRvX3N0b3AJCT0gY2FzX2Nsb3NlLAorCS5uZG9fc3RhcnRfeG1pdAkJPSBjYXNfc3RhcnRfeG1pdCwKKwkubmRvX2dldF9zdGF0cyAJCT0gY2FzX2dldF9zdGF0cywKKwkubmRvX3NldF9tdWx0aWNhc3RfbGlzdCA9IGNhc19zZXRfbXVsdGljYXN0LAorCS5uZG9fZG9faW9jdGwJCT0gY2FzX2lvY3RsLAorCS5uZG9fdHhfdGltZW91dAkJPSBjYXNfdHhfdGltZW91dCwKKwkubmRvX2NoYW5nZV9tdHUJCT0gY2FzX2NoYW5nZV9tdHUsCisJLm5kb19zZXRfbWFjX2FkZHJlc3MJPSBldGhfbWFjX2FkZHIsCisJLm5kb192YWxpZGF0ZV9hZGRyCT0gZXRoX3ZhbGlkYXRlX2FkZHIsCisjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKKwkubmRvX3BvbGxfY29udHJvbGxlcgk9IGNhc19uZXRwb2xsLAorI2VuZGlmCit9OworCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBjYXNfaW5pdF9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCiAJCQkJICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQogewpAQCAtNTE2NiwyMiArNTE4MiwxMyBAQAogCWZvciAoaSA9IDA7IGkgPCBOX1JYX0ZMT1dTOyBpKyspCiAJCXNrYl9xdWV1ZV9oZWFkX2luaXQoJmNwLT5yeF9mbG93c1tpXSk7CiAKLQlkZXYtPm9wZW4gPSBjYXNfb3BlbjsKLQlkZXYtPnN0b3AgPSBjYXNfY2xvc2U7Ci0JZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBjYXNfc3RhcnRfeG1pdDsKLQlkZXYtPmdldF9zdGF0cyA9IGNhc19nZXRfc3RhdHM7Ci0JZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSBjYXNfc2V0X211bHRpY2FzdDsKLQlkZXYtPmRvX2lvY3RsID0gY2FzX2lvY3RsOworCWRldi0+bmV0ZGV2X29wcyA9ICZjYXNfbmV0ZGV2X29wczsKIAlkZXYtPmV0aHRvb2xfb3BzID0gJmNhc19ldGh0b29sX29wczsKLQlkZXYtPnR4X3RpbWVvdXQgPSBjYXNfdHhfdGltZW91dDsKIAlkZXYtPndhdGNoZG9nX3RpbWVvID0gQ0FTX1RYX1RJTUVPVVQ7Ci0JZGV2LT5jaGFuZ2VfbXR1ID0gY2FzX2NoYW5nZV9tdHU7CisKICNpZmRlZiBVU0VfTkFQSQogCW5ldGlmX25hcGlfYWRkKGRldiwgJmNwLT5uYXBpLCBjYXNfcG9sbCwgNjQpOwogI2VuZGlmCi0jaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKLQlkZXYtPnBvbGxfY29udHJvbGxlciA9IGNhc19uZXRwb2xsOwotI2VuZGlmCiAJZGV2LT5pcnEgPSBwZGV2LT5pcnE7CiAJZGV2LT5kbWEgPSAwOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9kZTYwMC5jIGIvZHJpdmVycy9uZXQvZGU2MDAuYwppbmRleCA5NzBmODIwLi5kZTYzZjFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9kZTYwMC5jCisrKyBiL2RyaXZlcnMvbmV0L2RlNjAwLmMKQEAgLTM3OCw2ICszNzgsMTYgQEAKIAkgKi8KIH0KIAorc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyBkZTYwMF9uZXRkZXZfb3BzID0geworCS5uZG9fb3BlbgkJPSBkZTYwMF9vcGVuLAorCS5uZG9fc3RvcAkJPSBkZTYwMF9jbG9zZSwKKwkubmRvX3N0YXJ0X3htaXQJCT0gZGU2MDBfc3RhcnRfeG1pdCwKKwkubmRvX2NoYW5nZV9tdHUJCT0gZXRoX2NoYW5nZV9tdHUsCisJLm5kb19zZXRfbWFjX2FkZHJlc3MgCT0gZXRoX21hY19hZGRyLAorCS5uZG9fdmFsaWRhdGVfYWRkcgk9IGV0aF92YWxpZGF0ZV9hZGRyLAorfTsKKworCiBzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKiBfX2luaXQgZGU2MDBfcHJvYmUodm9pZCkKIHsKIAlpbnQJaTsKQEAgLTQzOSw5ICs0NDksNyBAQAogCiAJcHJpbnRrKCIsIEV0aGVybmV0IEFkZHJlc3M6ICVwTVxuIiwgZGV2LT5kZXZfYWRkcik7CiAKLQlkZXYtPm9wZW4gPSBkZTYwMF9vcGVuOwotCWRldi0+c3RvcCA9IGRlNjAwX2Nsb3NlOwotCWRldi0+aGFyZF9zdGFydF94bWl0ID0gJmRlNjAwX3N0YXJ0X3htaXQ7CisJZGV2LT5uZXRkZXZfb3BzID0gJmRlNjAwX25ldGRldl9vcHM7CiAKIAlkZXYtPmZsYWdzJj1+SUZGX01VTFRJQ0FTVDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZGU2MjAuYyBiL2RyaXZlcnMvbmV0L2RlNjIwLmMKaW5kZXggYmRmYTg5NC4uZDUyZjM0YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZGU2MjAuYworKysgYi9kcml2ZXJzL25ldC9kZTYyMC5jCkBAIC03ODQsNiArNzg0LDE3IEBACiAJcmV0dXJuIDA7IC8qIGFsbCBvayAqLwogfQogCitzdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIGRlNjIwX25ldGRldl9vcHMgPSB7CisJLm5kb19vcGVuIAkJPSBkZTYyMF9vcGVuLAorCS5uZG9fc3RvcCAJCT0gZGU2MjBfY2xvc2UsCisJLm5kb19zdGFydF94bWl0IAk9IGRlNjIwX3N0YXJ0X3htaXQsCisJLm5kb190eF90aW1lb3V0IAk9IGRlNjIwX3RpbWVvdXQsCisJLm5kb19zZXRfbXVsdGljYXN0X2xpc3QgPSBkZTYyMF9zZXRfbXVsdGljYXN0X2xpc3QsCisJLm5kb19jaGFuZ2VfbXR1CQk9IGV0aF9jaGFuZ2VfbXR1LAorCS5uZG9fc2V0X21hY19hZGRyZXNzIAk9IGV0aF9tYWNfYWRkciwKKwkubmRvX3ZhbGlkYXRlX2FkZHIJPSBldGhfdmFsaWRhdGVfYWRkciwKK307CisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBPbmx5IHN0YXJ0LXVwIGNvZGUgYmVsb3cKQEAgLTg2MSwxMiArODcyLDggQEAKIAllbHNlCiAJCXByaW50aygiIFVUUClcbiIpOwogCi0JZGV2LT5vcGVuIAkJPSBkZTYyMF9vcGVuOwotCWRldi0+c3RvcCAJCT0gZGU2MjBfY2xvc2U7Ci0JZGV2LT5oYXJkX3N0YXJ0X3htaXQgCT0gZGU2MjBfc3RhcnRfeG1pdDsKLQlkZXYtPnR4X3RpbWVvdXQgCT0gZGU2MjBfdGltZW91dDsKKwlkZXYtPm5ldGRldl9vcHMgPSAmZGU2MjBfbmV0ZGV2X29wczsKIAlkZXYtPndhdGNoZG9nX3RpbWVvCT0gSFoqMjsKLQlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9IGRlNjIwX3NldF9tdWx0aWNhc3RfbGlzdDsKIAogCS8qIGJhc2VfYWRkciBhbmQgaXJxIGFyZSBhbHJlYWR5IHNldCwgc2VlIGFib3ZlISAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9lMTAwLmMgYi9kcml2ZXJzL25ldC9lMTAwLmMKaW5kZXggOWYzOGIxNi4uODZiYjg3NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZTEwMC5jCisrKyBiL2RyaXZlcnMvbmV0L2UxMDAuYwpAQCAtMTYxLDYgKzE2MSw3IEBACiAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CiAjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CiAjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgogCiAKQEAgLTE3NCwxMCArMTc1LDE3IEBACiAjZGVmaW5lIEUxMDBfV0FUQ0hET0dfUEVSSU9ECSgyICogSFopCiAjZGVmaW5lIEUxMDBfTkFQSV9XRUlHSFQJMTYKIAorI2RlZmluZSBGSVJNV0FSRV9EMTAxTQkJImUxMDAvZDEwMW1fdWNvZGUuYmluIgorI2RlZmluZSBGSVJNV0FSRV9EMTAxUwkJImUxMDAvZDEwMXNfdWNvZGUuYmluIgorI2RlZmluZSBGSVJNV0FSRV9EMTAyRQkJImUxMDAvZDEwMmVfdWNvZGUuYmluIgorCiBNT0RVTEVfREVTQ1JJUFRJT04oRFJWX0RFU0NSSVBUSU9OKTsKIE1PRFVMRV9BVVRIT1IoRFJWX0NPUFlSSUdIVCk7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiBNT0RVTEVfVkVSU0lPTihEUlZfVkVSU0lPTik7CitNT0RVTEVfRklSTVdBUkUoRklSTVdBUkVfRDEwMU0pOworTU9EVUxFX0ZJUk1XQVJFKEZJUk1XQVJFX0QxMDFTKTsKK01PRFVMRV9GSVJNV0FSRShGSVJNV0FSRV9EMTAyRSk7CiAKIHN0YXRpYyBpbnQgZGVidWcgPSAzOwogc3RhdGljIGludCBlZXByb21fYmFkX2NzdW1fYWxsb3cgPSAwOwpAQCAtNjU4LDEyICs2NjYsMTIgQEAKIAllMTAwX2Rpc2FibGVfaXJxKG5pYyk7CiAKIAkvKiBDaGVjayByZXN1bHRzIG9mIHNlbGYtdGVzdCAqLwotCWlmKG5pYy0+bWVtLT5zZWxmdGVzdC5yZXN1bHQgIT0gMCkgeworCWlmIChuaWMtPm1lbS0+c2VsZnRlc3QucmVzdWx0ICE9IDApIHsKIAkJRFBSSU5USyhIVywgRVJSLCAiU2VsZi10ZXN0IGZhaWxlZDogcmVzdWx0PTB4JTA4WFxuIiwKIAkJCW5pYy0+bWVtLT5zZWxmdGVzdC5yZXN1bHQpOwogCQlyZXR1cm4gLUVUSU1FRE9VVDsKIAl9Ci0JaWYobmljLT5tZW0tPnNlbGZ0ZXN0LnNpZ25hdHVyZSA9PSAwKSB7CisJaWYgKG5pYy0+bWVtLT5zZWxmdGVzdC5zaWduYXR1cmUgPT0gMCkgewogCQlEUFJJTlRLKEhXLCBFUlIsICJTZWxmLXRlc3QgZmFpbGVkOiB0aW1lZCBvdXRcbiIpOwogCQlyZXR1cm4gLUVUSU1FRE9VVDsKIAl9CkBAIC02ODQsMTMgKzY5MiwxMyBAQAogCWNtZF9hZGRyX2RhdGFbMl0gPSBvcF9ld2RzIDw8IChhZGRyX2xlbiAtIDIpOwogCiAJLyogQml0LWJhbmcgY21kcyB0byB3cml0ZSB3b3JkIHRvIGVlcHJvbSAqLwotCWZvcihqID0gMDsgaiA8IDM7IGorKykgeworCWZvciAoaiA9IDA7IGogPCAzOyBqKyspIHsKIAogCQkvKiBDaGlwIHNlbGVjdCAqLwogCQlpb3dyaXRlOChlZWNzIHwgZWVzaywgJm5pYy0+Y3NyLT5lZXByb21fY3RybF9sbyk7CiAJCWUxMDBfd3JpdGVfZmx1c2gobmljKTsgdWRlbGF5KDQpOwogCi0JCWZvcihpID0gMzE7IGkgPj0gMDsgaS0tKSB7CisJCWZvciAoaSA9IDMxOyBpID49IDA7IGktLSkgewogCQkJY3RybCA9IChjbWRfYWRkcl9kYXRhW2pdICYgKDEgPDwgaSkpID8KIAkJCQllZWNzIHwgZWVkaSA6IGVlY3M7CiAJCQlpb3dyaXRlOChjdHJsLCAmbmljLT5jc3ItPmVlcHJvbV9jdHJsX2xvKTsKQEAgLTcyMyw3ICs3MzEsNyBAQAogCWUxMDBfd3JpdGVfZmx1c2gobmljKTsgdWRlbGF5KDQpOwogCiAJLyogQml0LWJhbmcgdG8gcmVhZCB3b3JkIGZyb20gZWVwcm9tICovCi0JZm9yKGkgPSAzMTsgaSA+PSAwOyBpLS0pIHsKKwlmb3IgKGkgPSAzMTsgaSA+PSAwOyBpLS0pIHsKIAkJY3RybCA9IChjbWRfYWRkcl9kYXRhICYgKDEgPDwgaSkpID8gZWVjcyB8IGVlZGkgOiBlZWNzOwogCQlpb3dyaXRlOChjdHJsLCAmbmljLT5jc3ItPmVlcHJvbV9jdHJsX2xvKTsKIAkJZTEwMF93cml0ZV9mbHVzaChuaWMpOyB1ZGVsYXkoNCk7CkBAIC03MzQsNyArNzQyLDcgQEAKIAkJLyogRWVwcm9tIGRyaXZlcyBhIGR1bW15IHplcm8gdG8gRUVETyBhZnRlciByZWNlaXZpbmcKIAkJICogY29tcGxldGUgYWRkcmVzcy4gIFVzZSB0aGlzIHRvIGFkanVzdCBhZGRyX2xlbi4gKi8KIAkJY3RybCA9IGlvcmVhZDgoJm5pYy0+Y3NyLT5lZXByb21fY3RybF9sbyk7Ci0JCWlmKCEoY3RybCAmIGVlZG8pICYmIGkgPiAxNikgeworCQlpZiAoIShjdHJsICYgZWVkbykgJiYgaSA+IDE2KSB7CiAJCQkqYWRkcl9sZW4gLT0gKGkgLSAxNik7CiAJCQlpID0gMTc7CiAJCX0KQEAgLTc1OCw5ICs3NjYsOSBAQAogCWUxMDBfZWVwcm9tX3JlYWQobmljLCAmYWRkcl9sZW4sIDApOwogCW5pYy0+ZWVwcm9tX3djID0gMSA8PCBhZGRyX2xlbjsKIAotCWZvcihhZGRyID0gMDsgYWRkciA8IG5pYy0+ZWVwcm9tX3djOyBhZGRyKyspIHsKKwlmb3IgKGFkZHIgPSAwOyBhZGRyIDwgbmljLT5lZXByb21fd2M7IGFkZHIrKykgewogCQluaWMtPmVlcHJvbVthZGRyXSA9IGUxMDBfZWVwcm9tX3JlYWQobmljLCAmYWRkcl9sZW4sIGFkZHIpOwotCQlpZihhZGRyIDwgbmljLT5lZXByb21fd2MgLSAxKQorCQlpZiAoYWRkciA8IG5pYy0+ZWVwcm9tX3djIC0gMSkKIAkJCWNoZWNrc3VtICs9IGxlMTZfdG9fY3B1KG5pYy0+ZWVwcm9tW2FkZHJdKTsKIAl9CiAKQEAgLTc4NCwxNSArNzkyLDE1IEBACiAJZTEwMF9lZXByb21fcmVhZChuaWMsICZhZGRyX2xlbiwgMCk7CiAJbmljLT5lZXByb21fd2MgPSAxIDw8IGFkZHJfbGVuOwogCi0JaWYoc3RhcnQgKyBjb3VudCA+PSBuaWMtPmVlcHJvbV93YykKKwlpZiAoc3RhcnQgKyBjb3VudCA+PSBuaWMtPmVlcHJvbV93YykKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlmb3IoYWRkciA9IHN0YXJ0OyBhZGRyIDwgc3RhcnQgKyBjb3VudDsgYWRkcisrKQorCWZvciAoYWRkciA9IHN0YXJ0OyBhZGRyIDwgc3RhcnQgKyBjb3VudDsgYWRkcisrKQogCQllMTAwX2VlcHJvbV93cml0ZShuaWMsIGFkZHJfbGVuLCBhZGRyLCBuaWMtPmVlcHJvbVthZGRyXSk7CiAKIAkvKiBUaGUgY2hlY2tzdW0sIHN0b3JlZCBpbiB0aGUgbGFzdCB3b3JkLCBpcyBjYWxjdWxhdGVkIHN1Y2ggdGhhdAogCSAqIHRoZSBzdW0gb2Ygd29yZHMgc2hvdWxkIGJlIDB4QkFCQSAqLwotCWZvcihhZGRyID0gMDsgYWRkciA8IG5pYy0+ZWVwcm9tX3djIC0gMTsgYWRkcisrKQorCWZvciAoYWRkciA9IDA7IGFkZHIgPCBuaWMtPmVlcHJvbV93YyAtIDE7IGFkZHIrKykKIAkJY2hlY2tzdW0gKz0gbGUxNl90b19jcHUobmljLT5lZXByb21bYWRkcl0pOwogCW5pYy0+ZWVwcm9tW25pYy0+ZWVwcm9tX3djIC0gMV0gPSBjcHVfdG9fbGUxNigweEJBQkEgLSBjaGVja3N1bSk7CiAJZTEwMF9lZXByb21fd3JpdGUobmljLCBhZGRyX2xlbiwgbmljLT5lZXByb21fd2MgLSAxLApAQCAtODEyLDE5ICs4MjAsMTkgQEAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmbmljLT5jbWRfbG9jaywgZmxhZ3MpOwogCiAJLyogUHJldmlvdXMgY29tbWFuZCBpcyBhY2NlcHRlZCB3aGVuIFNDQiBjbGVhcnMgKi8KLQlmb3IoaSA9IDA7IGkgPCBFMTAwX1dBSVRfU0NCX1RJTUVPVVQ7IGkrKykgewotCQlpZihsaWtlbHkoIWlvcmVhZDgoJm5pYy0+Y3NyLT5zY2IuY21kX2xvKSkpCisJZm9yIChpID0gMDsgaSA8IEUxMDBfV0FJVF9TQ0JfVElNRU9VVDsgaSsrKSB7CisJCWlmIChsaWtlbHkoIWlvcmVhZDgoJm5pYy0+Y3NyLT5zY2IuY21kX2xvKSkpCiAJCQlicmVhazsKIAkJY3B1X3JlbGF4KCk7Ci0JCWlmKHVubGlrZWx5KGkgPiBFMTAwX1dBSVRfU0NCX0ZBU1QpKQorCQlpZiAodW5saWtlbHkoaSA+IEUxMDBfV0FJVF9TQ0JfRkFTVCkpCiAJCQl1ZGVsYXkoNSk7CiAJfQotCWlmKHVubGlrZWx5KGkgPT0gRTEwMF9XQUlUX1NDQl9USU1FT1VUKSkgeworCWlmICh1bmxpa2VseShpID09IEUxMDBfV0FJVF9TQ0JfVElNRU9VVCkpIHsKIAkJZXJyID0gLUVBR0FJTjsKIAkJZ290byBlcnJfdW5sb2NrOwogCX0KIAotCWlmKHVubGlrZWx5KGNtZCAhPSBjdWNfcmVzdW1lKSkKKwlpZiAodW5saWtlbHkoY21kICE9IGN1Y19yZXN1bWUpKQogCQlpb3dyaXRlMzIoZG1hX2FkZHIsICZuaWMtPmNzci0+c2NiLmdlbl9wdHIpOwogCWlvd3JpdGU4KGNtZCwgJm5pYy0+Y3NyLT5zY2IuY21kX2xvKTsKIApAQCAtODQzLDcgKzg1MSw3IEBACiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmbmljLT5jYl9sb2NrLCBmbGFncyk7CiAKLQlpZih1bmxpa2VseSghbmljLT5jYnNfYXZhaWwpKSB7CisJaWYgKHVubGlrZWx5KCFuaWMtPmNic19hdmFpbCkpIHsKIAkJZXJyID0gLUVOT01FTTsKIAkJZ290byBlcnJfdW5sb2NrOwogCX0KQEAgLTg1Myw3ICs4NjEsNyBAQAogCW5pYy0+Y2JzX2F2YWlsLS07CiAJY2ItPnNrYiA9IHNrYjsKIAotCWlmKHVubGlrZWx5KCFuaWMtPmNic19hdmFpbCkpCisJaWYgKHVubGlrZWx5KCFuaWMtPmNic19hdmFpbCkpCiAJCWVyciA9IC1FTk9TUEM7CiAKIAljYl9wcmVwYXJlKG5pYywgY2IsIHNrYik7CkBAIC04NjQsMTUgKzg3MiwxNSBAQAogCXdtYigpOwogCWNiLT5wcmV2LT5jb21tYW5kICY9IGNwdV90b19sZTE2KH5jYl9zKTsKIAotCXdoaWxlKG5pYy0+Y2JfdG9fc2VuZCAhPSBuaWMtPmNiX3RvX3VzZSkgewotCQlpZih1bmxpa2VseShlMTAwX2V4ZWNfY21kKG5pYywgbmljLT5jdWNfY21kLAorCXdoaWxlIChuaWMtPmNiX3RvX3NlbmQgIT0gbmljLT5jYl90b191c2UpIHsKKwkJaWYgKHVubGlrZWx5KGUxMDBfZXhlY19jbWQobmljLCBuaWMtPmN1Y19jbWQsCiAJCQluaWMtPmNiX3RvX3NlbmQtPmRtYV9hZGRyKSkpIHsKIAkJCS8qIE9rLCBoZXJlJ3Mgd2hlcmUgdGhpbmdzIGdldCBzdGlja3kuICBJdCdzCiAJCQkgKiBwb3NzaWJsZSB0aGF0IHdlIGNhbid0IHNjaGVkdWxlIHRoZSBjb21tYW5kCiAJCQkgKiBiZWNhdXNlIHRoZSBjb250cm9sbGVyIGlzIHRvbyBidXN5LCBzbwogCQkJICogbGV0J3MganVzdCBxdWV1ZSB0aGUgY29tbWFuZCBhbmQgdHJ5IGFnYWluCiAJCQkgKiB3aGVuIGFub3RoZXIgY29tbWFuZCBpcyBzY2hlZHVsZWQuICovCi0JCQlpZihlcnIgPT0gLUVOT1NQQykgeworCQkJaWYgKGVyciA9PSAtRU5PU1BDKSB7CiAJCQkJLy9yZXF1ZXN0IGEgcmVzZXQKIAkJCQlzY2hlZHVsZV93b3JrKCZuaWMtPnR4X3RpbWVvdXRfdGFzayk7CiAJCQl9CkBAIC05NDUsNyArOTUzLDcgQEAKIAogCS8qIE1BQyB0eXBlIGlzIGVuY29kZWQgYXMgcmV2IElEOyBleGNlcHRpb246IElDSCBpcyB0cmVhdGVkIGFzIDgyNTU5ICovCiAJbmljLT5tYWMgPSAobmljLT5mbGFncyAmIGljaCkgPyBtYWNfODI1NTlfRDEwMU0gOiBuaWMtPnBkZXYtPnJldmlzaW9uOwotCWlmKG5pYy0+bWFjID09IG1hY191bmtub3duKQorCWlmIChuaWMtPm1hYyA9PSBtYWNfdW5rbm93bikKIAkJbmljLT5tYWMgPSBtYWNfODI1NTdfRDEwMF9BOwogCiAJbmljLT5wYXJhbXMucmZkcyA9IHJmZHM7CkBAIC0xMDA4LDIzICsxMDE2LDIzIEBACiAJY29uZmlnLT5hZGFwdGl2ZV9pZnMgPSBuaWMtPmFkYXB0aXZlX2lmczsKIAljb25maWctPmxvb3BiYWNrID0gbmljLT5sb29wYmFjazsKIAotCWlmKG5pYy0+bWlpLmZvcmNlX21lZGlhICYmIG5pYy0+bWlpLmZ1bGxfZHVwbGV4KQorCWlmIChuaWMtPm1paS5mb3JjZV9tZWRpYSAmJiBuaWMtPm1paS5mdWxsX2R1cGxleCkKIAkJY29uZmlnLT5mdWxsX2R1cGxleF9mb3JjZSA9IDB4MTsJLyogMT1mb3JjZSwgMD1hdXRvICovCiAKLQlpZihuaWMtPmZsYWdzICYgcHJvbWlzY3VvdXMgfHwgbmljLT5sb29wYmFjaykgeworCWlmIChuaWMtPmZsYWdzICYgcHJvbWlzY3VvdXMgfHwgbmljLT5sb29wYmFjaykgewogCQljb25maWctPnJ4X3NhdmVfYmFkX2ZyYW1lcyA9IDB4MTsJLyogMT1zYXZlLCAwPWRpc2NhcmQgKi8KIAkJY29uZmlnLT5yeF9kaXNjYXJkX3Nob3J0X2ZyYW1lcyA9IDB4MDsJLyogMT1kaXNjYXJkLCAwPXNhdmUgKi8KIAkJY29uZmlnLT5wcm9taXNjdW91c19tb2RlID0gMHgxOwkJLyogMT1vbiwgMD1vZmYgKi8KIAl9CiAKLQlpZihuaWMtPmZsYWdzICYgbXVsdGljYXN0X2FsbCkKKwlpZiAobmljLT5mbGFncyAmIG11bHRpY2FzdF9hbGwpCiAJCWNvbmZpZy0+bXVsdGljYXN0X2FsbCA9IDB4MTsJCS8qIDE9YWNjZXB0LCAwPW5vICovCiAKIAkvKiBkaXNhYmxlIFdvTCB3aGVuIHVwICovCi0JaWYobmV0aWZfcnVubmluZyhuaWMtPm5ldGRldikgfHwgIShuaWMtPmZsYWdzICYgd29sX21hZ2ljKSkKKwlpZiAobmV0aWZfcnVubmluZyhuaWMtPm5ldGRldikgfHwgIShuaWMtPmZsYWdzICYgd29sX21hZ2ljKSkKIAkJY29uZmlnLT5tYWdpY19wYWNrZXRfZGlzYWJsZSA9IDB4MTsJLyogMT1vZmYsIDA9b24gKi8KIAotCWlmKG5pYy0+bWFjID49IG1hY184MjU1OF9EMTAxX0E0KSB7CisJaWYgKG5pYy0+bWFjID49IG1hY184MjU1OF9EMTAxX0E0KSB7CiAJCWNvbmZpZy0+ZmNfZGlzYWJsZSA9IDB4MTsJLyogMT1UeCBmYyBvZmYsIDA9VHggZmMgb24gKi8KIAkJY29uZmlnLT5td2lfZW5hYmxlID0gMHgxOwkvKiAxPWVuYWJsZSwgMD1kaXNhYmxlICovCiAJCWNvbmZpZy0+c3RhbmRhcmRfdGNiID0gMHgwOwkvKiAxPXN0YW5kYXJkLCAwPWV4dGVuZGVkICovCkBAIC0xMDQ5LDE3OCArMTA1Nyw2IEBACiAJCWNbMTZdLCBjWzE3XSwgY1sxOF0sIGNbMTldLCBjWzIwXSwgY1syMV0sIGNbMjJdLCBjWzIzXSk7CiB9CiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICBNaWNybyBjb2RlIGZvciA4MDg2OjEyMjkgUmV2IDggICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogIFBhcmFtZXRlciB2YWx1ZXMgZm9yIHRoZSBEMTAxTSBCLXN0ZXAgICovCi0jZGVmaW5lIEQxMDFNX0NQVVNBVkVSX1RJTUVSX0RXT1JECQk3OAotI2RlZmluZSBEMTAxTV9DUFVTQVZFUl9CVU5ETEVfRFdPUkQJCTY1Ci0jZGVmaW5lIEQxMDFNX0NQVVNBVkVSX01JTl9TSVpFX0RXT1JECQkxMjYKLQotI2RlZmluZSBEMTAxTV9CX1JDVkJVTkRMRV9VQ09ERSBcCi17XAotMHgwMDU1MDIxNSwgMHhGRkZGMDQzNywgMHhGRkZGRkZGRiwgMHgwNkE3MDc4OSwgMHhGRkZGRkZGRiwgMHgwNTU4RkZGRiwgXAotMHgwMDBDMDAwMSwgMHgwMDEwMTMxMiwgMHgwMDBDMDAwOCwgMHgwMDM4MDIxNiwgXAotMHgwMDEwMDA5QywgMHgwMDIwNDA1NiwgMHgwMDIzODBDQywgMHgwMDM4MDA1NiwgXAotMHgwMDEwMDA5QywgMHgwMDI0NEMwQiwgMHgwMDAwMDgwMCwgMHgwMDEyNDgxOCwgXAotMHgwMDM4MDQzOCwgMHgwMDAwMDAwMCwgMHgwMDE0MDAwMCwgMHgwMDM4MDU1NSwgXAotMHgwMDMwODAwMCwgMHgwMDEwMDY2MiwgMHgwMDEwMDU2MSwgMHgwMDBFMDQwOCwgXAotMHgwMDEzNDg2MSwgMHgwMDBDMDAwMiwgMHgwMDEwMzA5MywgMHgwMDMwODAwMCwgXAotMHgwMDEwMDYyNCwgMHgwMDEwMDU2MSwgMHgwMDBFMDQwOCwgMHgwMDEwMDg2MSwgXAotMHgwMDBDMDA3RSwgMHgwMDIyMkMyMSwgMHgwMDBDMDAwMiwgMHgwMDEwMzA5MywgXAotMHgwMDM4MEM3QSwgMHgwMDA4MDAwMCwgMHgwMDEwMzA5MCwgMHgwMDM4MEM3QSwgXAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgXAotMHgwMDEwMDA5QywgMHgwMDI0NEMyRCwgMHgwMDAxMDAwNCwgMHgwMDA0MTAwMCwgXAotMHgwMDNBMDQzNywgMHgwMDA0NDAxMCwgMHgwMDM4MDc4QSwgMHgwMDAwMDAwMCwgXAotMHgwMDEwMDA5OSwgMHgwMDIwNkM3QSwgMHgwMDEwMDA5QywgMHgwMDI0NEM0OCwgXAotMHgwMDEzMDgyNCwgMHgwMDBDMDAwMSwgMHgwMDEwMTIxMywgMHgwMDI2MEM3NSwgXAotMHgwMDA0MTAwMCwgMHgwMDAxMDAwNCwgMHgwMDEzMDgyNiwgMHgwMDBDMDAwNiwgXAotMHgwMDIyMDZBOCwgMHgwMDEzQzkyNiwgMHgwMDEwMTMxMywgMHgwMDM4MDZBOCwgXAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgXAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgXAotMHgwMDA4MDYwMCwgMHgwMDEwMUIxMCwgMHgwMDA1MDAwNCwgMHgwMDEwMDgyNiwgXAotMHgwMDEwMTIxMCwgMHgwMDM4MEMzNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgXAotMHgwMDIxMTU1QiwgMHgwMDEwMDA5OSwgMHgwMDIwNjU1OSwgMHgwMDEwMDA5QywgXAotMHgwMDI0NDU1OSwgMHgwMDEzMDgzNiwgMHgwMDBDMDAwMCwgMHgwMDIyMEM2MiwgXAotMHgwMDBDMDAwMSwgMHgwMDEwMUIxMywgMHgwMDIyOUMwRSwgMHgwMDIxMEMwRSwgXAotMHgwMDIyNkMwRSwgMHgwMDIxNkMwRSwgMHgwMDIyRkMwRSwgMHgwMDIxNUMwRSwgXAotMHgwMDIxNEMwRSwgMHgwMDM4MDU1NSwgMHgwMDAxMDAwNCwgMHgwMDA0MTAwMCwgXAotMHgwMDI3OEM2NywgMHgwMDA0MDgwMCwgMHgwMDAxODEwMCwgMHgwMDNBMDQzNywgXAotMHgwMDEzMDgyNiwgMHgwMDBDMDAwMSwgMHgwMDIyMDU1OSwgMHgwMDEwMTMxMywgXAotMHgwMDM4MDU1OSwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgXAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgXAotMHgwMDAwMDAwMCwgMHgwMDEzMDgzMSwgMHgwMDEwMDkwQiwgMHgwMDEyNDgxMywgXAotMHgwMDBDRkY4MCwgMHgwMDI2MDZBQiwgMHgwMDA0MTAwMCwgMHgwMDAxMDAwNCwgXAotMHgwMDM4MDZBOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgXAotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgTWljcm8gY29kZSBmb3IgODA4NjoxMjI5IFJldiA5ICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qICBQYXJhbWV0ZXIgdmFsdWVzIGZvciB0aGUgRDEwMVMgICovCi0jZGVmaW5lIEQxMDFTX0NQVVNBVkVSX1RJTUVSX0RXT1JECQk3OAotI2RlZmluZSBEMTAxU19DUFVTQVZFUl9CVU5ETEVfRFdPUkQJCTY3Ci0jZGVmaW5lIEQxMDFTX0NQVVNBVkVSX01JTl9TSVpFX0RXT1JECQkxMjgKLQotI2RlZmluZSBEMTAxU19SQ1ZCVU5ETEVfVUNPREUgXAote1wKLTB4MDA1NTAyNDIsIDB4RkZGRjA0N0UsIDB4RkZGRkZGRkYsIDB4MDZGRjA4MTgsIDB4RkZGRkZGRkYsIDB4MDVBNkZGRkYsIFwKLTB4MDAwQzAwMDEsIDB4MDAxMDEzMTIsIDB4MDAwQzAwMDgsIDB4MDAzODAyNDMsIFwKLTB4MDAxMDAwOUMsIDB4MDAyMDQwNTYsIDB4MDAyMzgwRDAsIDB4MDAzODAwNTYsIFwKLTB4MDAxMDAwOUMsIDB4MDAyNDRGOEIsIDB4MDAwMDA4MDAsIDB4MDAxMjQ4MTgsIFwKLTB4MDAzODA0N0YsIDB4MDAwMDAwMDAsIDB4MDAxNDAwMDAsIDB4MDAzODA1QTMsIFwKLTB4MDAzMDgwMDAsIDB4MDAxMDA2MTAsIDB4MDAxMDA1NjEsIDB4MDAwRTA0MDgsIFwKLTB4MDAxMzQ4NjEsIDB4MDAwQzAwMDIsIDB4MDAxMDMwOTMsIDB4MDAzMDgwMDAsIFwKLTB4MDAxMDA2MjQsIDB4MDAxMDA1NjEsIDB4MDAwRTA0MDgsIDB4MDAxMDA4NjEsIFwKLTB4MDAwQzAwN0UsIDB4MDAyMjJGQTEsIDB4MDAwQzAwMDIsIDB4MDAxMDMwOTMsIFwKLTB4MDAzODBGOTAsIDB4MDAwODAwMDAsIDB4MDAxMDMwOTAsIDB4MDAzODBGOTAsIFwKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIFwKLTB4MDAxMDAwOUMsIDB4MDAyNDRGQUQsIDB4MDAwMTAwMDQsIDB4MDAwNDEwMDAsIFwKLTB4MDAzQTA0N0UsIDB4MDAwNDQwMTAsIDB4MDAzODA4MTksIDB4MDAwMDAwMDAsIFwKLTB4MDAxMDAwOTksIDB4MDAyMDZGRkQsIDB4MDAxMDAwOUEsIDB4MDAyMEFGRkQsIFwKLTB4MDAxMDAwOUMsIDB4MDAyNDRGQzgsIDB4MDAxMzA4MjQsIDB4MDAwQzAwMDEsIFwKLTB4MDAxMDEyMTMsIDB4MDAyNjBGRjcsIDB4MDAwNDEwMDAsIDB4MDAwMTAwMDQsIFwKLTB4MDAxMzA4MjYsIDB4MDAwQzAwMDYsIDB4MDAyMjA3MDAsIDB4MDAxM0M5MjYsIFwKLTB4MDAxMDEzMTMsIDB4MDAzODA3MDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIFwKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIFwKLTB4MDAwODA2MDAsIDB4MDAxMDFCMTAsIDB4MDAwNTAwMDQsIDB4MDAxMDA4MjYsIFwKLTB4MDAxMDEyMTAsIDB4MDAzODBGQjYsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIFwKLTB4MDAyMTE1QTksIDB4MDAxMDAwOTksIDB4MDAyMDY1QTcsIDB4MDAxMDAwOUEsIFwKLTB4MDAyMEE1QTcsIDB4MDAxMDAwOUMsIDB4MDAyNDQ1QTcsIDB4MDAxMzA4MzYsIFwKLTB4MDAwQzAwMDAsIDB4MDAyMjBGRTQsIDB4MDAwQzAwMDEsIDB4MDAxMDFCMTMsIFwKLTB4MDAyMjlGOEUsIDB4MDAyMTBGOEUsIDB4MDAyMjZGOEUsIDB4MDAyMTZGOEUsIFwKLTB4MDAyMkZGOEUsIDB4MDAyMTVGOEUsIDB4MDAyMTRGOEUsIDB4MDAzODA1QTMsIFwKLTB4MDAwMTAwMDQsIDB4MDAwNDEwMDAsIDB4MDAyNzhGRTksIDB4MDAwNDA4MDAsIFwKLTB4MDAwMTgxMDAsIDB4MDAzQTA0N0UsIDB4MDAxMzA4MjYsIDB4MDAwQzAwMDEsIFwKLTB4MDAyMjA1QTcsIDB4MDAxMDEzMTMsIDB4MDAzODA1QTcsIDB4MDAwMDAwMDAsIFwKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIFwKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAxMzA4MzEsIFwKLTB4MDAxMDA5MEIsIDB4MDAxMjQ4MTMsIDB4MDAwQ0ZGODAsIDB4MDAyNjA3MDMsIFwKLTB4MDAwNDEwMDAsIDB4MDAwMTAwMDQsIDB4MDAzODA3MDAgIFwKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogIE1pY3JvIGNvZGUgZm9yIHRoZSA4MDg2OjEyMjkgUmV2IEYvMTAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiAgUGFyYW1ldGVyIHZhbHVlcyBmb3IgdGhlIEQxMDIgRS1zdGVwICAqLwotI2RlZmluZSBEMTAyX0VfQ1BVU0FWRVJfVElNRVJfRFdPUkQJCTQyCi0jZGVmaW5lIEQxMDJfRV9DUFVTQVZFUl9CVU5ETEVfRFdPUkQJCTU0Ci0jZGVmaW5lIEQxMDJfRV9DUFVTQVZFUl9NSU5fU0laRV9EV09SRAkJNDYKLQotI2RlZmluZSAgICAgRDEwMl9FX1JDVkJVTkRMRV9VQ09ERSBcCi17XAotMHgwMDdEMDI4RiwgMHgwRTQyMDRGOSwgMHgxNEVEMEM4NSwgMHgxNEZBMTRFOSwgMHgwRUY3MEUzNiwgMHgxRkZGMUZGRiwgXAotMHgwMEUwMTRCOSwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgXAotMHgwMEUwMTRCRCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgXAotMHgwMEUwMTRENSwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgXAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgXAotMHgwMEUwMTRDMSwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgXAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgXAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgXAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgXAotMHgwMEUwMTRDOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgXAotMHgwMDIwMDYwMCwgMHgwMEUwMTRFRSwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgXAotMHgwMDMwRkY4MCwgMHgwMDk0MEU0NiwgMHgwMDAzODIwMCwgMHgwMDEwMjAwMCwgXAotMHgwMEUwMEU0MywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgXAotMHgwMDMwMDAwNiwgMHgwMEUwMTRGQiwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgXAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgXAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgXAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgXAotMHgwMDkwNkU0MSwgMHgwMDgwMEUzQywgMHgwMEUwMEUzOSwgMHgwMDAwMDAwMCwgXAotMHgwMDkwNkVGRCwgMHgwMDkwMEVGRCwgMHgwMEUwMEVGOCwgMHgwMDAwMDAwMCwgXAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgXAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgXAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgXAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgXAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgXAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgXAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgXAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgXAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgXAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgXAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgXAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgXAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgXAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgXAotfQotCi1zdGF0aWMgdm9pZCBlMTAwX3NldHVwX3Vjb2RlKHN0cnVjdCBuaWMgKm5pYywgc3RydWN0IGNiICpjYiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKLXsKLS8qICpJTkRFTlQtT0ZGKiAqLwotCXN0YXRpYyBzdHJ1Y3QgewotCQl1MzIgdWNvZGVbVUNPREVfU0laRSArIDFdOwotCQl1OCBtYWM7Ci0JCXU4IHRpbWVyX2R3b3JkOwotCQl1OCBidW5kbGVfZHdvcmQ7Ci0JCXU4IG1pbl9zaXplX2R3b3JkOwotCX0gdWNvZGVfb3B0c1tdID0gewotCQl7IEQxMDFNX0JfUkNWQlVORExFX1VDT0RFLAotCQkgIG1hY184MjU1OV9EMTAxTSwKLQkJICBEMTAxTV9DUFVTQVZFUl9USU1FUl9EV09SRCwKLQkJICBEMTAxTV9DUFVTQVZFUl9CVU5ETEVfRFdPUkQsCi0JCSAgRDEwMU1fQ1BVU0FWRVJfTUlOX1NJWkVfRFdPUkQgfSwKLQkJeyBEMTAxU19SQ1ZCVU5ETEVfVUNPREUsCi0JCSAgbWFjXzgyNTU5X0QxMDFTLAotCQkgIEQxMDFTX0NQVVNBVkVSX1RJTUVSX0RXT1JELAotCQkgIEQxMDFTX0NQVVNBVkVSX0JVTkRMRV9EV09SRCwKLQkJICBEMTAxU19DUFVTQVZFUl9NSU5fU0laRV9EV09SRCB9LAotCQl7IEQxMDJfRV9SQ1ZCVU5ETEVfVUNPREUsCi0JCSAgbWFjXzgyNTUxX0YsCi0JCSAgRDEwMl9FX0NQVVNBVkVSX1RJTUVSX0RXT1JELAotCQkgIEQxMDJfRV9DUFVTQVZFUl9CVU5ETEVfRFdPUkQsCi0JCSAgRDEwMl9FX0NQVVNBVkVSX01JTl9TSVpFX0RXT1JEIH0sCi0JCXsgRDEwMl9FX1JDVkJVTkRMRV9VQ09ERSwKLQkJICBtYWNfODI1NTFfMTAsCi0JCSAgRDEwMl9FX0NQVVNBVkVSX1RJTUVSX0RXT1JELAotCQkgIEQxMDJfRV9DUFVTQVZFUl9CVU5ETEVfRFdPUkQsCi0JCSAgRDEwMl9FX0NQVVNBVkVSX01JTl9TSVpFX0RXT1JEIH0sCi0JCXsgezB9LCAwLCAwLCAwLCAwfQotCX0sICpvcHRzOwotLyogKklOREVOVC1PTiogKi8KLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogIENQVVNhdmVyIHBhcmFtZXRlcnMKICoKQEAgLTEyODAsNDIgKzExMTYsMTAxIEBACiAjZGVmaW5lIEJVTkRMRU1BWCAodTE2KTYKICNkZWZpbmUgSU5UREVMQVkgKHUxNikxNTM2IC8qIDB4NjAwICovCiAKKy8qIEluaXRpYWxpemUgZmlybXdhcmUgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmUxMDBfcmVxdWVzdF9maXJtd2FyZShzdHJ1Y3QgbmljICpuaWMpCit7CisJY29uc3QgY2hhciAqZndfbmFtZTsKKwljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3OworCXU4IHRpbWVyLCBidW5kbGUsIG1pbl9zaXplOworCWludCBlcnI7CisKIAkvKiBkbyBub3QgbG9hZCB1LWNvZGUgZm9yIElDSCBkZXZpY2VzICovCiAJaWYgKG5pYy0+ZmxhZ3MgJiBpY2gpCi0JCWdvdG8gbm9sb2FkdWNvZGU7CisJCXJldHVybiBOVUxMOwogCiAJLyogU2VhcmNoIGZvciB1Y29kZSBtYXRjaCBhZ2FpbnN0IGgvdyByZXZpc2lvbiAqLwotCWZvciAob3B0cyA9IHVjb2RlX29wdHM7IG9wdHMtPm1hYzsgb3B0cysrKSB7Ci0JCWludCBpOwotCQl1MzIgKnVjb2RlID0gb3B0cy0+dWNvZGU7Ci0JCWlmIChuaWMtPm1hYyAhPSBvcHRzLT5tYWMpCi0JCQljb250aW51ZTsKKwlpZiAobmljLT5tYWMgPT0gbWFjXzgyNTU5X0QxMDFNKQorCQlmd19uYW1lID0gRklSTVdBUkVfRDEwMU07CisJZWxzZSBpZiAobmljLT5tYWMgPT0gbWFjXzgyNTU5X0QxMDFTKQorCQlmd19uYW1lID0gRklSTVdBUkVfRDEwMVM7CisJZWxzZSBpZiAobmljLT5tYWMgPT0gbWFjXzgyNTUxX0YgfHwgbmljLT5tYWMgPT0gbWFjXzgyNTUxXzEwKQorCQlmd19uYW1lID0gRklSTVdBUkVfRDEwMkU7CisJZWxzZSAvKiBObyB1Y29kZSBvbiBvdGhlciBkZXZpY2VzICovCisJCXJldHVybiBOVUxMOwogCi0JCS8qIEluc2VydCB1c2VyLXR1bmFibGUgc2V0dGluZ3MgKi8KLQkJdWNvZGVbb3B0cy0+dGltZXJfZHdvcmRdICY9IDB4RkZGRjAwMDA7Ci0JCXVjb2RlW29wdHMtPnRpbWVyX2R3b3JkXSB8PSBJTlRERUxBWTsKLQkJdWNvZGVbb3B0cy0+YnVuZGxlX2R3b3JkXSAmPSAweEZGRkYwMDAwOwotCQl1Y29kZVtvcHRzLT5idW5kbGVfZHdvcmRdIHw9IEJVTkRMRU1BWDsKLQkJdWNvZGVbb3B0cy0+bWluX3NpemVfZHdvcmRdICY9IDB4RkZGRjAwMDA7Ci0JCXVjb2RlW29wdHMtPm1pbl9zaXplX2R3b3JkXSB8PSAoQlVORExFU01BTEwpID8gMHhGRkZGIDogMHhGRjgwOwotCi0JCWZvciAoaSA9IDA7IGkgPCBVQ09ERV9TSVpFOyBpKyspCi0JCQljYi0+dS51Y29kZVtpXSA9IGNwdV90b19sZTMyKHVjb2RlW2ldKTsKLQkJY2ItPmNvbW1hbmQgPSBjcHVfdG9fbGUxNihjYl91Y29kZSB8IGNiX2VsKTsKLQkJcmV0dXJuOworCWVyciA9IHJlcXVlc3RfZmlybXdhcmUoJmZ3LCBmd19uYW1lLCAmbmljLT5wZGV2LT5kZXYpOworCWlmIChlcnIpIHsKKwkJRFBSSU5USyhQUk9CRSwgRVJSLCAiRmFpbGVkIHRvIGxvYWQgZmlybXdhcmUgXCIlc1wiOiAlZFxuIiwKKwkJCWZ3X25hbWUsIGVycik7CisJCXJldHVybiBFUlJfUFRSKGVycik7CisJfQorCS8qIEZpcm13YXJlIHNob3VsZCBiZSBwcmVjaXNlbHkgVUNPREVfU0laRSAod29yZHMpIHBsdXMgdGhyZWUgYnl0ZXMKKwkgICBpbmRpY2F0aW5nIHRoZSBvZmZzZXRzIGZvciBCVU5ETEVTTUFMTCwgQlVORExFTUFYLCBJTlRERUxBWSAqLworCWlmIChmdy0+c2l6ZSAhPSBVQ09ERV9TSVpFICogNCArIDMpIHsKKwkJRFBSSU5USyhQUk9CRSwgRVJSLCAiRmlybXdhcmUgXCIlc1wiIGhhcyB3cm9uZyBzaXplICV6dVxuIiwKKwkJCWZ3X25hbWUsIGZ3LT5zaXplKTsKKwkJcmVsZWFzZV9maXJtd2FyZShmdyk7CisJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwogCX0KIAotbm9sb2FkdWNvZGU6Ci0JY2ItPmNvbW1hbmQgPSBjcHVfdG9fbGUxNihjYl9ub3AgfCBjYl9lbCk7CisJLyogUmVhZCB0aW1lciwgYnVuZGxlIGFuZCBtaW5fc2l6ZSBmcm9tIGVuZCBvZiBmaXJtd2FyZSBibG9iICovCisJdGltZXIgPSBmdy0+ZGF0YVtVQ09ERV9TSVpFICogNF07CisJYnVuZGxlID0gZnctPmRhdGFbVUNPREVfU0laRSAqIDQgKyAxXTsKKwltaW5fc2l6ZSA9IGZ3LT5kYXRhW1VDT0RFX1NJWkUgKiA0ICsgMl07CisKKwlpZiAodGltZXIgPj0gVUNPREVfU0laRSB8fCBidW5kbGUgPj0gVUNPREVfU0laRSB8fAorCSAgICBtaW5fc2l6ZSA+PSBVQ09ERV9TSVpFKSB7CisJCURQUklOVEsoUFJPQkUsIEVSUiwKKwkJCSJcIiVzXCIgaGFzIGJvZ3VzIG9mZnNldCB2YWx1ZXMgKDB4JXgsMHgleCwweCV4KVxuIiwKKwkJCWZ3X25hbWUsIHRpbWVyLCBidW5kbGUsIG1pbl9zaXplKTsKKwkJcmVsZWFzZV9maXJtd2FyZShmdyk7CisJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCX0KKwkvKiBPSywgZmlybXdhcmUgaXMgdmFsaWRhdGVkIGFuZCByZWFkeSB0byB1c2UuLi4gKi8KKwlyZXR1cm4gZnc7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGUxMDBfZXhlY19jYl93YWl0KHN0cnVjdCBuaWMgKm5pYywgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQl2b2lkICgqY2JfcHJlcGFyZSkoc3RydWN0IG5pYyAqLCBzdHJ1Y3QgY2IgKiwgc3RydWN0IHNrX2J1ZmYgKikpCitzdGF0aWMgdm9pZCBlMTAwX3NldHVwX3Vjb2RlKHN0cnVjdCBuaWMgKm5pYywgc3RydWN0IGNiICpjYiwKKwkJCSAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKKwljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3ID0gKHZvaWQgKilza2I7CisJdTggdGltZXIsIGJ1bmRsZSwgbWluX3NpemU7CisKKwkvKiBJdCdzIG5vdCBhIHJlYWwgc2tiOyB3ZSBqdXN0IGFidXNlZCB0aGUgZmFjdCB0aGF0IGUxMDBfZXhlY19jYgorCSAgIHdpbGwgcGFzcyBpdCB0aHJvdWdoIHRvIGhlcmUuLi4gKi8KKwljYi0+c2tiID0gTlVMTDsKKworCS8qIGZpcm13YXJlIGlzIHN0b3JlZCBhcyBsaXR0bGUgZW5kaWFuIGFscmVhZHkgKi8KKwltZW1jcHkoY2ItPnUudWNvZGUsIGZ3LT5kYXRhLCBVQ09ERV9TSVpFICogNCk7CisKKwkvKiBSZWFkIHRpbWVyLCBidW5kbGUgYW5kIG1pbl9zaXplIGZyb20gZW5kIG9mIGZpcm13YXJlIGJsb2IgKi8KKwl0aW1lciA9IGZ3LT5kYXRhW1VDT0RFX1NJWkUgKiA0XTsKKwlidW5kbGUgPSBmdy0+ZGF0YVtVQ09ERV9TSVpFICogNCArIDFdOworCW1pbl9zaXplID0gZnctPmRhdGFbVUNPREVfU0laRSAqIDQgKyAyXTsKKworCS8qIEluc2VydCB1c2VyLXR1bmFibGUgc2V0dGluZ3MgaW4gY2ItPnUudWNvZGUgKi8KKwljYi0+dS51Y29kZVt0aW1lcl0gJj0gY3B1X3RvX2xlMzIoMHhGRkZGMDAwMCk7CisJY2ItPnUudWNvZGVbdGltZXJdIHw9IGNwdV90b19sZTMyKElOVERFTEFZKTsKKwljYi0+dS51Y29kZVtidW5kbGVdICY9IGNwdV90b19sZTMyKDB4RkZGRjAwMDApOworCWNiLT51LnVjb2RlW2J1bmRsZV0gfD0gY3B1X3RvX2xlMzIoQlVORExFTUFYKTsKKwljYi0+dS51Y29kZVttaW5fc2l6ZV0gJj0gY3B1X3RvX2xlMzIoMHhGRkZGMDAwMCk7CisJY2ItPnUudWNvZGVbbWluX3NpemVdIHw9IGNwdV90b19sZTMyKChCVU5ETEVTTUFMTCkgPyAweEZGRkYgOiAweEZGODApOworCisJY2ItPmNvbW1hbmQgPSBjcHVfdG9fbGUxNihjYl91Y29kZSB8IGNiX2VsKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgZTEwMF9sb2FkX3Vjb2RlX3dhaXQoc3RydWN0IG5pYyAqbmljKQoreworCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZnc7CiAJaW50IGVyciA9IDAsIGNvdW50ZXIgPSA1MDsKIAlzdHJ1Y3QgY2IgKmNiID0gbmljLT5jYl90b19jbGVhbjsKIAotCWlmICgoZXJyID0gZTEwMF9leGVjX2NiKG5pYywgTlVMTCwgZTEwMF9zZXR1cF91Y29kZSkpKQorCWZ3ID0gZTEwMF9yZXF1ZXN0X2Zpcm13YXJlKG5pYyk7CisJLyogSWYgaXQncyBOVUxMLCB0aGVuIG5vIHVjb2RlIGlzIHJlcXVpcmVkICovCisJaWYgKCFmdyB8fCBJU19FUlIoZncpKQorCQlyZXR1cm4gUFRSX0VSUihmdyk7CisKKwlpZiAoKGVyciA9IGUxMDBfZXhlY19jYihuaWMsICh2b2lkICopZncsIGUxMDBfc2V0dXBfdWNvZGUpKSkKIAkJRFBSSU5USyhQUk9CRSxFUlIsICJ1Y29kZSBjbWQgZmFpbGVkIHdpdGggZXJyb3IgJWRcbiIsIGVycik7CiAKIAkvKiBtdXN0IHJlc3RhcnQgY3VjICovCkBAIC0xMzY5LDIxICsxMjY0LDIxIEBACiAJdTE2IGJtY3IsIHN0YXQsIGlkX2xvLCBpZF9oaSwgY29uZzsKIAogCS8qIERpc2NvdmVyIHBoeSBhZGRyIGJ5IHNlYXJjaGluZyBhZGRycyBpbiBvcmRlciB7MSwwLDIsLi4uLCAzMX0gKi8KLQlmb3IoYWRkciA9IDA7IGFkZHIgPCAzMjsgYWRkcisrKSB7CisJZm9yIChhZGRyID0gMDsgYWRkciA8IDMyOyBhZGRyKyspIHsKIAkJbmljLT5taWkucGh5X2lkID0gKGFkZHIgPT0gMCkgPyAxIDogKGFkZHIgPT0gMSkgPyAwIDogYWRkcjsKIAkJYm1jciA9IG1kaW9fcmVhZChuZXRkZXYsIG5pYy0+bWlpLnBoeV9pZCwgTUlJX0JNQ1IpOwogCQlzdGF0ID0gbWRpb19yZWFkKG5ldGRldiwgbmljLT5taWkucGh5X2lkLCBNSUlfQk1TUik7CiAJCXN0YXQgPSBtZGlvX3JlYWQobmV0ZGV2LCBuaWMtPm1paS5waHlfaWQsIE1JSV9CTVNSKTsKLQkJaWYoISgoYm1jciA9PSAweEZGRkYpIHx8ICgoc3RhdCA9PSAwKSAmJiAoYm1jciA9PSAwKSkpKQorCQlpZiAoISgoYm1jciA9PSAweEZGRkYpIHx8ICgoc3RhdCA9PSAwKSAmJiAoYm1jciA9PSAwKSkpKQogCQkJYnJlYWs7CiAJfQogCURQUklOVEsoSFcsIERFQlVHLCAicGh5X2FkZHIgPSAlZFxuIiwgbmljLT5taWkucGh5X2lkKTsKLQlpZihhZGRyID09IDMyKQorCWlmIChhZGRyID09IDMyKQogCQlyZXR1cm4gLUVBR0FJTjsKIAogCS8qIFNlbGVjdGVkIHRoZSBwaHkgYW5kIGlzb2xhdGUgdGhlIHJlc3QgKi8KLQlmb3IoYWRkciA9IDA7IGFkZHIgPCAzMjsgYWRkcisrKSB7Ci0JCWlmKGFkZHIgIT0gbmljLT5taWkucGh5X2lkKSB7CisJZm9yIChhZGRyID0gMDsgYWRkciA8IDMyOyBhZGRyKyspIHsKKwkJaWYgKGFkZHIgIT0gbmljLT5taWkucGh5X2lkKSB7CiAJCQltZGlvX3dyaXRlKG5ldGRldiwgYWRkciwgTUlJX0JNQ1IsIEJNQ1JfSVNPTEFURSk7CiAJCX0gZWxzZSB7CiAJCQlibWNyID0gbWRpb19yZWFkKG5ldGRldiwgYWRkciwgTUlJX0JNQ1IpOwpAQCAtMTQwMCw3ICsxMjk1LDcgQEAKIAogCS8qIEhhbmRsZSBOYXRpb25hbCB0eCBwaHlzICovCiAjZGVmaW5lIE5DU19QSFlfTU9ERUxfTUFTSwkweEZGRjBGRkZGCi0JaWYoKG5pYy0+cGh5ICYgTkNTX1BIWV9NT0RFTF9NQVNLKSA9PSBwaHlfbnNjX3R4KSB7CisJaWYgKChuaWMtPnBoeSAmIE5DU19QSFlfTU9ERUxfTUFTSykgPT0gcGh5X25zY190eCkgewogCQkvKiBEaXNhYmxlIGNvbmdlc3Rpb24gY29udHJvbCAqLwogCQljb25nID0gbWRpb19yZWFkKG5ldGRldiwgbmljLT5taWkucGh5X2lkLCBNSUlfTlNDX0NPTkcpOwogCQljb25nIHw9IE5TQ19DT05HX1RYUkVBRFk7CkBAIC0xNDA4LDcgKzEzMDMsNyBAQAogCQltZGlvX3dyaXRlKG5ldGRldiwgbmljLT5taWkucGh5X2lkLCBNSUlfTlNDX0NPTkcsIGNvbmcpOwogCX0KIAotCWlmKChuaWMtPm1hYyA+PSBtYWNfODI1NTBfRDEwMikgfHwgKChuaWMtPmZsYWdzICYgaWNoKSAmJgorCWlmICgobmljLT5tYWMgPj0gbWFjXzgyNTUwX0QxMDIpIHx8ICgobmljLT5mbGFncyAmIGljaCkgJiYKIAkgICAobWRpb19yZWFkKG5ldGRldiwgbmljLT5taWkucGh5X2lkLCBNSUlfVFBJU1RBVFVTKSAmIDB4ODAwMCkgJiYKIAkJIShuaWMtPmVlcHJvbVtlZXByb21fY25mZ19tZGl4XSAmIGVlcHJvbV9tZGl4X2VuYWJsZWQpKSkgewogCQkvKiBlbmFibGUvZGlzYWJsZSBNREkvTURJLVggYXV0by1zd2l0Y2hpbmcuICovCkBAIC0xNDI2LDI1ICsxMzIxLDI1IEBACiAJZTEwMF9od19yZXNldChuaWMpOwogCiAJRFBSSU5USyhIVywgRVJSLCAiZTEwMF9od19pbml0XG4iKTsKLQlpZighaW5faW50ZXJydXB0KCkgJiYgKGVyciA9IGUxMDBfc2VsZl90ZXN0KG5pYykpKQorCWlmICghaW5faW50ZXJydXB0KCkgJiYgKGVyciA9IGUxMDBfc2VsZl90ZXN0KG5pYykpKQogCQlyZXR1cm4gZXJyOwogCi0JaWYoKGVyciA9IGUxMDBfcGh5X2luaXQobmljKSkpCisJaWYgKChlcnIgPSBlMTAwX3BoeV9pbml0KG5pYykpKQogCQlyZXR1cm4gZXJyOwotCWlmKChlcnIgPSBlMTAwX2V4ZWNfY21kKG5pYywgY3VjX2xvYWRfYmFzZSwgMCkpKQorCWlmICgoZXJyID0gZTEwMF9leGVjX2NtZChuaWMsIGN1Y19sb2FkX2Jhc2UsIDApKSkKIAkJcmV0dXJuIGVycjsKLQlpZigoZXJyID0gZTEwMF9leGVjX2NtZChuaWMsIHJ1Y19sb2FkX2Jhc2UsIDApKSkKKwlpZiAoKGVyciA9IGUxMDBfZXhlY19jbWQobmljLCBydWNfbG9hZF9iYXNlLCAwKSkpCiAJCXJldHVybiBlcnI7Ci0JaWYgKChlcnIgPSBlMTAwX2V4ZWNfY2Jfd2FpdChuaWMsIE5VTEwsIGUxMDBfc2V0dXBfdWNvZGUpKSkKKwlpZiAoKGVyciA9IGUxMDBfbG9hZF91Y29kZV93YWl0KG5pYykpKQogCQlyZXR1cm4gZXJyOwotCWlmKChlcnIgPSBlMTAwX2V4ZWNfY2IobmljLCBOVUxMLCBlMTAwX2NvbmZpZ3VyZSkpKQorCWlmICgoZXJyID0gZTEwMF9leGVjX2NiKG5pYywgTlVMTCwgZTEwMF9jb25maWd1cmUpKSkKIAkJcmV0dXJuIGVycjsKLQlpZigoZXJyID0gZTEwMF9leGVjX2NiKG5pYywgTlVMTCwgZTEwMF9zZXR1cF9pYWFkZHIpKSkKKwlpZiAoKGVyciA9IGUxMDBfZXhlY19jYihuaWMsIE5VTEwsIGUxMDBfc2V0dXBfaWFhZGRyKSkpCiAJCXJldHVybiBlcnI7Ci0JaWYoKGVyciA9IGUxMDBfZXhlY19jbWQobmljLCBjdWNfZHVtcF9hZGRyLAorCWlmICgoZXJyID0gZTEwMF9leGVjX2NtZChuaWMsIGN1Y19kdW1wX2FkZHIsCiAJCW5pYy0+ZG1hX2FkZHIgKyBvZmZzZXRvZihzdHJ1Y3QgbWVtLCBzdGF0cykpKSkKIAkJcmV0dXJuIGVycjsKLQlpZigoZXJyID0gZTEwMF9leGVjX2NtZChuaWMsIGN1Y19kdW1wX3Jlc2V0LCAwKSkpCisJaWYgKChlcnIgPSBlMTAwX2V4ZWNfY21kKG5pYywgY3VjX2R1bXBfcmVzZXQsIDApKSkKIAkJcmV0dXJuIGVycjsKIAogCWUxMDBfZGlzYWJsZV9pcnEobmljKTsKQEAgLTE0NjAsNyArMTM1NSw3IEBACiAKIAljYi0+Y29tbWFuZCA9IGNwdV90b19sZTE2KGNiX211bHRpKTsKIAljYi0+dS5tdWx0aS5jb3VudCA9IGNwdV90b19sZTE2KGNvdW50ICogRVRIX0FMRU4pOwotCWZvcihpID0gMDsgbGlzdCAmJiBpIDwgY291bnQ7IGkrKywgbGlzdCA9IGxpc3QtPm5leHQpCisJZm9yIChpID0gMDsgbGlzdCAmJiBpIDwgY291bnQ7IGkrKywgbGlzdCA9IGxpc3QtPm5leHQpCiAJCW1lbWNweSgmY2ItPnUubXVsdGkuYWRkcltpKkVUSF9BTEVOXSwgJmxpc3QtPmRtaV9hZGRyLAogCQkJRVRIX0FMRU4pOwogfQpAQCAtMTQ3MiwxMiArMTM2NywxMiBAQAogCURQUklOVEsoSFcsIERFQlVHLCAibWNfY291bnQ9JWQsIGZsYWdzPTB4JTA0WFxuIiwKIAkJbmV0ZGV2LT5tY19jb3VudCwgbmV0ZGV2LT5mbGFncyk7CiAKLQlpZihuZXRkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpCisJaWYgKG5ldGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykKIAkJbmljLT5mbGFncyB8PSBwcm9taXNjdW91czsKIAllbHNlCiAJCW5pYy0+ZmxhZ3MgJj0gfnByb21pc2N1b3VzOwogCi0JaWYobmV0ZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSB8fAorCWlmIChuZXRkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJIHx8CiAJCW5ldGRldi0+bWNfY291bnQgPiBFMTAwX01BWF9NVUxUSUNBU1RfQUREUlMpCiAJCW5pYy0+ZmxhZ3MgfD0gbXVsdGljYXN0X2FsbDsKIAllbHNlCkBAIC0xNTAwLDcgKzEzOTUsNyBAQAogCSAqIGNvbXBsZXRlLCBzbyB3ZSdyZSBhbHdheXMgd2FpdGluZyBmb3IgcmVzdWx0cyBvZiB0aGUKIAkgKiBwcmV2aW91cyBjb21tYW5kLiAqLwogCi0JaWYoKmNvbXBsZXRlID09IGNwdV90b19sZTMyKGN1Y19kdW1wX3Jlc2V0X2NvbXBsZXRlKSkgeworCWlmICgqY29tcGxldGUgPT0gY3B1X3RvX2xlMzIoY3VjX2R1bXBfcmVzZXRfY29tcGxldGUpKSB7CiAJCSpjb21wbGV0ZSA9IDA7CiAJCW5pYy0+dHhfZnJhbWVzID0gbGUzMl90b19jcHUocy0+dHhfZ29vZF9mcmFtZXMpOwogCQluaWMtPnR4X2NvbGxpc2lvbnMgPSBsZTMyX3RvX2NwdShzLT50eF90b3RhbF9jb2xsaXNpb25zKTsKQEAgLTE1MjcsMTIgKzE0MjIsMTIgQEAKIAkJCWxlMzJfdG9fY3B1KHMtPnR4X3NpbmdsZV9jb2xsaXNpb25zKTsKIAkJbmljLT50eF9tdWx0aXBsZV9jb2xsaXNpb25zICs9CiAJCQlsZTMyX3RvX2NwdShzLT50eF9tdWx0aXBsZV9jb2xsaXNpb25zKTsKLQkJaWYobmljLT5tYWMgPj0gbWFjXzgyNTU4X0QxMDFfQTQpIHsKKwkJaWYgKG5pYy0+bWFjID49IG1hY184MjU1OF9EMTAxX0E0KSB7CiAJCQluaWMtPnR4X2ZjX3BhdXNlICs9IGxlMzJfdG9fY3B1KHMtPmZjX3htdF9wYXVzZSk7CiAJCQluaWMtPnJ4X2ZjX3BhdXNlICs9IGxlMzJfdG9fY3B1KHMtPmZjX3Jjdl9wYXVzZSk7CiAJCQluaWMtPnJ4X2ZjX3Vuc3VwcG9ydGVkICs9CiAJCQkJbGUzMl90b19jcHUocy0+ZmNfcmN2X3Vuc3VwcG9ydGVkKTsKLQkJCWlmKG5pYy0+bWFjID49IG1hY184MjU1OV9EMTAxTSkgeworCQkJaWYgKG5pYy0+bWFjID49IG1hY184MjU1OV9EMTAxTSkgewogCQkJCW5pYy0+dHhfdGNvX2ZyYW1lcyArPQogCQkJCQlsZTE2X3RvX2NwdShzLT54bXRfdGNvX2ZyYW1lcyk7CiAJCQkJbmljLT5yeF90Y29fZnJhbWVzICs9CkBAIC0xNTQyLDcgKzE0MzcsNyBAQAogCX0KIAogCi0JaWYoZTEwMF9leGVjX2NtZChuaWMsIGN1Y19kdW1wX3Jlc2V0LCAwKSkKKwlpZiAoZTEwMF9leGVjX2NtZChuaWMsIGN1Y19kdW1wX3Jlc2V0LCAwKSkKIAkJRFBSSU5USyhUWF9FUlIsIERFQlVHLCAiZXhlYyBjdWNfZHVtcF9yZXNldCBmYWlsZWRcbiIpOwogfQogCkBAIC0xNTUxLDE5ICsxNDQ2LDE5IEBACiAJLyogQWRqdXN0IGludGVyLWZyYW1lLXNwYWNpbmcgKElGUykgYmV0d2VlbiB0d28gdHJhbnNtaXRzIGlmCiAJICogd2UncmUgZ2V0dGluZyBjb2xsaXNpb25zIG9uIGEgaGFsZi1kdXBsZXggY29ubmVjdGlvbi4gKi8KIAotCWlmKGR1cGxleCA9PSBEVVBMRVhfSEFMRikgeworCWlmIChkdXBsZXggPT0gRFVQTEVYX0hBTEYpIHsKIAkJdTMyIHByZXYgPSBuaWMtPmFkYXB0aXZlX2lmczsKIAkJdTMyIG1pbl9mcmFtZXMgPSAoc3BlZWQgPT0gU1BFRURfMTAwKSA/IDEwMDAgOiAxMDA7CiAKLQkJaWYoKG5pYy0+dHhfZnJhbWVzIC8gMzIgPCBuaWMtPnR4X2NvbGxpc2lvbnMpICYmCisJCWlmICgobmljLT50eF9mcmFtZXMgLyAzMiA8IG5pYy0+dHhfY29sbGlzaW9ucykgJiYKIAkJICAgKG5pYy0+dHhfZnJhbWVzID4gbWluX2ZyYW1lcykpIHsKLQkJCWlmKG5pYy0+YWRhcHRpdmVfaWZzIDwgNjApCisJCQlpZiAobmljLT5hZGFwdGl2ZV9pZnMgPCA2MCkKIAkJCQluaWMtPmFkYXB0aXZlX2lmcyArPSA1OwogCQl9IGVsc2UgaWYgKG5pYy0+dHhfZnJhbWVzIDwgbWluX2ZyYW1lcykgewotCQkJaWYobmljLT5hZGFwdGl2ZV9pZnMgPj0gNSkKKwkJCWlmIChuaWMtPmFkYXB0aXZlX2lmcyA+PSA1KQogCQkJCW5pYy0+YWRhcHRpdmVfaWZzIC09IDU7CiAJCX0KLQkJaWYobmljLT5hZGFwdGl2ZV9pZnMgIT0gcHJldikKKwkJaWYgKG5pYy0+YWRhcHRpdmVfaWZzICE9IHByZXYpCiAJCQllMTAwX2V4ZWNfY2IobmljLCBOVUxMLCBlMTAwX2NvbmZpZ3VyZSk7CiAJfQogfQpAQCAtMTU3OSwxMiArMTQ3NCwxMiBAQAogCiAJbWlpX2V0aHRvb2xfZ3NldCgmbmljLT5taWksICZjbWQpOwogCi0JaWYobWlpX2xpbmtfb2soJm5pYy0+bWlpKSAmJiAhbmV0aWZfY2Fycmllcl9vayhuaWMtPm5ldGRldikpIHsKKwlpZiAobWlpX2xpbmtfb2soJm5pYy0+bWlpKSAmJiAhbmV0aWZfY2Fycmllcl9vayhuaWMtPm5ldGRldikpIHsKIAkJcHJpbnRrKEtFUk5fSU5GTyAiZTEwMDogJXMgTklDIExpbmsgaXMgVXAgJXMgTWJwcyAlcyBEdXBsZXhcbiIsCiAJCSAgICAgICBuaWMtPm5ldGRldi0+bmFtZSwKIAkJICAgICAgIGNtZC5zcGVlZCA9PSBTUEVFRF8xMDAgPyAiMTAwIiA6ICIxMCIsCiAJCSAgICAgICBjbWQuZHVwbGV4ID09IERVUExFWF9GVUxMID8gIkZ1bGwiIDogIkhhbGYiKTsKLQl9IGVsc2UgaWYoIW1paV9saW5rX29rKCZuaWMtPm1paSkgJiYgbmV0aWZfY2Fycmllcl9vayhuaWMtPm5ldGRldikpIHsKKwl9IGVsc2UgaWYgKCFtaWlfbGlua19vaygmbmljLT5taWkpICYmIG5ldGlmX2NhcnJpZXJfb2sobmljLT5uZXRkZXYpKSB7CiAJCXByaW50ayhLRVJOX0lORk8gImUxMDA6ICVzIE5JQyBMaW5rIGlzIERvd25cbiIsCiAJCSAgICAgICBuaWMtPm5ldGRldi0+bmFtZSk7CiAJfQpAQCAtMTYwNCwxMSArMTQ5OSwxMSBAQAogCWUxMDBfdXBkYXRlX3N0YXRzKG5pYyk7CiAJZTEwMF9hZGp1c3RfYWRhcHRpdmVfaWZzKG5pYywgY21kLnNwZWVkLCBjbWQuZHVwbGV4KTsKIAotCWlmKG5pYy0+bWFjIDw9IG1hY184MjU1N19EMTAwX0MpCisJaWYgKG5pYy0+bWFjIDw9IG1hY184MjU1N19EMTAwX0MpCiAJCS8qIElzc3VlIGEgbXVsdGljYXN0IGNvbW1hbmQgdG8gd29ya2Fyb3VuZCBhIDU1NyBsb2NrIHVwICovCiAJCWUxMDBfc2V0X211bHRpY2FzdF9saXN0KG5pYy0+bmV0ZGV2KTsKIAotCWlmKG5pYy0+ZmxhZ3MgJiBpY2ggJiYgY21kLnNwZWVkPT1TUEVFRF8xMCAmJiBjbWQuZHVwbGV4PT1EVVBMRVhfSEFMRikKKwlpZiAobmljLT5mbGFncyAmIGljaCAmJiBjbWQuc3BlZWQ9PVNQRUVEXzEwICYmIGNtZC5kdXBsZXg9PURVUExFWF9IQUxGKQogCQkvKiBOZWVkIFNXIHdvcmthcm91bmQgZm9yIElDSFt4XSAxME1icHMvaGFsZiBkdXBsZXggVHggaGFuZy4gKi8KIAkJbmljLT5mbGFncyB8PSBpY2hfMTBoX3dvcmthcm91bmQ7CiAJZWxzZQpAQCAtMTYyMyw3ICsxNTE4LDcgQEAKIHsKIAljYi0+Y29tbWFuZCA9IG5pYy0+dHhfY29tbWFuZDsKIAkvKiBpbnRlcnJ1cHQgZXZlcnkgMTYgcGFja2V0cyByZWdhcmRsZXNzIG9mIGRlbGF5ICovCi0JaWYoKG5pYy0+Y2JzX2F2YWlsICYgfjE1KSA9PSBuaWMtPmNic19hdmFpbCkKKwlpZiAoKG5pYy0+Y2JzX2F2YWlsICYgfjE1KSA9PSBuaWMtPmNic19hdmFpbCkKIAkJY2ItPmNvbW1hbmQgfD0gY3B1X3RvX2xlMTYoY2JfaSk7CiAJY2ItPnUudGNiLnRiZF9hcnJheSA9IGNiLT5kbWFfYWRkciArIG9mZnNldG9mKHN0cnVjdCBjYiwgdS50Y2IudGJkKTsKIAljYi0+dS50Y2IudGNiX2J5dGVfY291bnQgPSAwOwpAQCAtMTY0MCwxOCArMTUzNSwxOCBAQAogCXN0cnVjdCBuaWMgKm5pYyA9IG5ldGRldl9wcml2KG5ldGRldik7CiAJaW50IGVycjsKIAotCWlmKG5pYy0+ZmxhZ3MgJiBpY2hfMTBoX3dvcmthcm91bmQpIHsKKwlpZiAobmljLT5mbGFncyAmIGljaF8xMGhfd29ya2Fyb3VuZCkgewogCQkvKiBTVyB3b3JrYXJvdW5kIGZvciBJQ0hbeF0gMTBNYnBzL2hhbGYgZHVwbGV4IFR4IGhhbmcuCiAJCSAgIElzc3VlIGEgTk9QIGNvbW1hbmQgZm9sbG93ZWQgYnkgYSAxdXMgZGVsYXkgYmVmb3JlCiAJCSAgIGlzc3VpbmcgdGhlIFR4IGNvbW1hbmQuICovCi0JCWlmKGUxMDBfZXhlY19jbWQobmljLCBjdWNfbm9wLCAwKSkKKwkJaWYgKGUxMDBfZXhlY19jbWQobmljLCBjdWNfbm9wLCAwKSkKIAkJCURQUklOVEsoVFhfRVJSLCBERUJVRywgImV4ZWMgY3VjX25vcCBmYWlsZWRcbiIpOwogCQl1ZGVsYXkoMSk7CiAJfQogCiAJZXJyID0gZTEwMF9leGVjX2NiKG5pYywgc2tiLCBlMTAwX3htaXRfcHJlcGFyZSk7CiAKLQlzd2l0Y2goZXJyKSB7CisJc3dpdGNoIChlcnIpIHsKIAljYXNlIC1FTk9TUEM6CiAJCS8qIFdlIHF1ZXVlZCB0aGUgc2tiLCBidXQgbm93IHdlJ3JlIG91dCBvZiBzcGFjZS4gKi8KIAkJRFBSSU5USyhUWF9FUlIsIERFQlVHLCAiTm8gc3BhY2UgZm9yIENCXG4iKTsKQEAgLTE2NzcsMTQgKzE1NzIsMTQgQEAKIAlzcGluX2xvY2soJm5pYy0+Y2JfbG9jayk7CiAKIAkvKiBDbGVhbiBDQnMgbWFya2VkIGNvbXBsZXRlICovCi0JZm9yKGNiID0gbmljLT5jYl90b19jbGVhbjsKKwlmb3IgKGNiID0gbmljLT5jYl90b19jbGVhbjsKIAkgICAgY2ItPnN0YXR1cyAmIGNwdV90b19sZTE2KGNiX2NvbXBsZXRlKTsKIAkgICAgY2IgPSBuaWMtPmNiX3RvX2NsZWFuID0gY2ItPm5leHQpIHsKIAkJRFBSSU5USyhUWF9ET05FLCBERUJVRywgImNiWyVkXS0+c3RhdHVzID0gMHglMDRYXG4iLAogCQkgICAgICAgIChpbnQpKCgodm9pZCopY2IgLSAodm9pZCopbmljLT5jYnMpL3NpemVvZihzdHJ1Y3QgY2IpKSwKIAkJICAgICAgICBjYi0+c3RhdHVzKTsKIAotCQlpZihsaWtlbHkoY2ItPnNrYiAhPSBOVUxMKSkgeworCQlpZiAobGlrZWx5KGNiLT5za2IgIT0gTlVMTCkpIHsKIAkJCWRldi0+c3RhdHMudHhfcGFja2V0cysrOwogCQkJZGV2LT5zdGF0cy50eF9ieXRlcyArPSBjYi0+c2tiLT5sZW47CiAKQEAgLTE3MDMsNyArMTU5OCw3IEBACiAJc3Bpbl91bmxvY2soJm5pYy0+Y2JfbG9jayk7CiAKIAkvKiBSZWNvdmVyIGZyb20gcnVubmluZyBvdXQgb2YgVHggcmVzb3VyY2VzIGluIHhtaXRfZnJhbWUgKi8KLQlpZih1bmxpa2VseSh0eF9jbGVhbmVkICYmIG5ldGlmX3F1ZXVlX3N0b3BwZWQobmljLT5uZXRkZXYpKSkKKwlpZiAodW5saWtlbHkodHhfY2xlYW5lZCAmJiBuZXRpZl9xdWV1ZV9zdG9wcGVkKG5pYy0+bmV0ZGV2KSkpCiAJCW5ldGlmX3dha2VfcXVldWUobmljLT5uZXRkZXYpOwogCiAJcmV0dXJuIHR4X2NsZWFuZWQ7CkBAIC0xNzExLDEwICsxNjA2LDEwIEBACiAKIHN0YXRpYyB2b2lkIGUxMDBfY2xlYW5fY2JzKHN0cnVjdCBuaWMgKm5pYykKIHsKLQlpZihuaWMtPmNicykgewotCQl3aGlsZShuaWMtPmNic19hdmFpbCAhPSBuaWMtPnBhcmFtcy5jYnMuY291bnQpIHsKKwlpZiAobmljLT5jYnMpIHsKKwkJd2hpbGUgKG5pYy0+Y2JzX2F2YWlsICE9IG5pYy0+cGFyYW1zLmNicy5jb3VudCkgewogCQkJc3RydWN0IGNiICpjYiA9IG5pYy0+Y2JfdG9fY2xlYW47Ci0JCQlpZihjYi0+c2tiKSB7CisJCQlpZiAoY2ItPnNrYikgewogCQkJCXBjaV91bm1hcF9zaW5nbGUobmljLT5wZGV2LAogCQkJCQlsZTMyX3RvX2NwdShjYi0+dS50Y2IudGJkLmJ1Zl9hZGRyKSwKIAkJCQkJbGUxNl90b19jcHUoY2ItPnUudGNiLnRiZC5zaXplKSwKQEAgLTE3NDYsMTAgKzE2NDEsMTAgQEAKIAogCW5pYy0+Y2JzID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQobmljLT5wZGV2LAogCQlzaXplb2Yoc3RydWN0IGNiKSAqIGNvdW50LCAmbmljLT5jYnNfZG1hX2FkZHIpOwotCWlmKCFuaWMtPmNicykKKwlpZiAoIW5pYy0+Y2JzKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCWZvcihjYiA9IG5pYy0+Y2JzLCBpID0gMDsgaSA8IGNvdW50OyBjYisrLCBpKyspIHsKKwlmb3IgKGNiID0gbmljLT5jYnMsIGkgPSAwOyBpIDwgY291bnQ7IGNiKyssIGkrKykgewogCQljYi0+bmV4dCA9IChpICsgMSA8IGNvdW50KSA/IGNiICsgMSA6IG5pYy0+Y2JzOwogCQljYi0+cHJldiA9IChpID09IDApID8gbmljLT5jYnMgKyBjb3VudCAtIDEgOiBjYiAtIDE7CiAKQEAgLTE3NjcsMTQgKzE2NjIsMTQgQEAKIAogc3RhdGljIGlubGluZSB2b2lkIGUxMDBfc3RhcnRfcmVjZWl2ZXIoc3RydWN0IG5pYyAqbmljLCBzdHJ1Y3QgcnggKnJ4KQogewotCWlmKCFuaWMtPnJ4cykgcmV0dXJuOwotCWlmKFJVX1NVU1BFTkRFRCAhPSBuaWMtPnJ1X3J1bm5pbmcpIHJldHVybjsKKwlpZiAoIW5pYy0+cnhzKSByZXR1cm47CisJaWYgKFJVX1NVU1BFTkRFRCAhPSBuaWMtPnJ1X3J1bm5pbmcpIHJldHVybjsKIAogCS8qIGhhbmRsZSBpbml0IHRpbWUgc3RhcnRzICovCi0JaWYoIXJ4KSByeCA9IG5pYy0+cnhzOworCWlmICghcngpIHJ4ID0gbmljLT5yeHM7CiAKIAkvKiAoUmUpc3RhcnQgUlUgaWYgc3VzcGVuZGVkIG9yIGlkbGUgYW5kIFJGQSBpcyBub24tTlVMTCAqLwotCWlmKHJ4LT5za2IpIHsKKwlpZiAocngtPnNrYikgewogCQllMTAwX2V4ZWNfY21kKG5pYywgcnVjX3N0YXJ0LCByeC0+ZG1hX2FkZHIpOwogCQluaWMtPnJ1X3J1bm5pbmcgPSBSVV9SVU5OSU5HOwogCX0KQEAgLTE3ODMsNyArMTY3OCw3IEBACiAjZGVmaW5lIFJGRF9CVUZfTEVOIChzaXplb2Yoc3RydWN0IHJmZCkgKyBWTEFOX0VUSF9GUkFNRV9MRU4pCiBzdGF0aWMgaW50IGUxMDBfcnhfYWxsb2Nfc2tiKHN0cnVjdCBuaWMgKm5pYywgc3RydWN0IHJ4ICpyeCkKIHsKLQlpZighKHJ4LT5za2IgPSBuZXRkZXZfYWxsb2Nfc2tiKG5pYy0+bmV0ZGV2LCBSRkRfQlVGX0xFTiArIE5FVF9JUF9BTElHTikpKQorCWlmICghKHJ4LT5za2IgPSBuZXRkZXZfYWxsb2Nfc2tiKG5pYy0+bmV0ZGV2LCBSRkRfQlVGX0xFTiArIE5FVF9JUF9BTElHTikpKQogCQlyZXR1cm4gLUVOT01FTTsKIAogCS8qIEFsaWduLCBpbml0LCBhbmQgbWFwIHRoZSBSRkQuICovCkBAIC0xODIwLDcgKzE3MTUsNyBAQAogCXN0cnVjdCByZmQgKnJmZCA9IChzdHJ1Y3QgcmZkICopc2tiLT5kYXRhOwogCXUxNiByZmRfc3RhdHVzLCBhY3R1YWxfc2l6ZTsKIAotCWlmKHVubGlrZWx5KHdvcmtfZG9uZSAmJiAqd29ya19kb25lID49IHdvcmtfdG9fZG8pKQorCWlmICh1bmxpa2VseSh3b3JrX2RvbmUgJiYgKndvcmtfZG9uZSA+PSB3b3JrX3RvX2RvKSkKIAkJcmV0dXJuIC1FQUdBSU47CiAKIAkvKiBOZWVkIHRvIHN5bmMgYmVmb3JlIHRha2luZyBhIHBlZWsgYXQgY2JfY29tcGxldGUgYml0ICovCkBAIC0xODQ3LDcgKzE3NDIsNyBAQAogCiAJLyogR2V0IGFjdHVhbCBkYXRhIHNpemUgKi8KIAlhY3R1YWxfc2l6ZSA9IGxlMTZfdG9fY3B1KHJmZC0+YWN0dWFsX3NpemUpICYgMHgzRkZGOwotCWlmKHVubGlrZWx5KGFjdHVhbF9zaXplID4gUkZEX0JVRl9MRU4gLSBzaXplb2Yoc3RydWN0IHJmZCkpKQorCWlmICh1bmxpa2VseShhY3R1YWxfc2l6ZSA+IFJGRF9CVUZfTEVOIC0gc2l6ZW9mKHN0cnVjdCByZmQpKSkKIAkJYWN0dWFsX3NpemUgPSBSRkRfQlVGX0xFTiAtIHNpemVvZihzdHJ1Y3QgcmZkKTsKIAogCS8qIEdldCBkYXRhICovCkBAIC0xODcyLDEwICsxNzY3LDEwIEBACiAJc2tiX3B1dChza2IsIGFjdHVhbF9zaXplKTsKIAlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBuaWMtPm5ldGRldik7CiAKLQlpZih1bmxpa2VseSghKHJmZF9zdGF0dXMgJiBjYl9vaykpKSB7CisJaWYgKHVubGlrZWx5KCEocmZkX3N0YXR1cyAmIGNiX29rKSkpIHsKIAkJLyogRG9uJ3QgaW5kaWNhdGUgaWYgaGFyZHdhcmUgaW5kaWNhdGVzIGVycm9ycyAqLwogCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOwotCX0gZWxzZSBpZihhY3R1YWxfc2l6ZSA+IEVUSF9EQVRBX0xFTiArIFZMQU5fRVRIX0hMRU4pIHsKKwl9IGVsc2UgaWYgKGFjdHVhbF9zaXplID4gRVRIX0RBVEFfTEVOICsgVkxBTl9FVEhfSExFTikgewogCQkvKiBEb24ndCBpbmRpY2F0ZSBvdmVyc2l6ZWQgZnJhbWVzICovCiAJCW5pYy0+cnhfb3Zlcl9sZW5ndGhfZXJyb3JzKys7CiAJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CkBAIC0xODgzLDcgKzE3NzgsNyBAQAogCQlkZXYtPnN0YXRzLnJ4X3BhY2tldHMrKzsKIAkJZGV2LT5zdGF0cy5yeF9ieXRlcyArPSBhY3R1YWxfc2l6ZTsKIAkJbmV0aWZfcmVjZWl2ZV9za2Ioc2tiKTsKLQkJaWYod29ya19kb25lKQorCQlpZiAod29ya19kb25lKQogCQkJKCp3b3JrX2RvbmUpKys7CiAJfQogCkBAIC0xOTAxLDcgKzE3OTYsNyBAQAogCXN0cnVjdCByZmQgKm9sZF9iZWZvcmVfbGFzdF9yZmQsICpuZXdfYmVmb3JlX2xhc3RfcmZkOwogCiAJLyogSW5kaWNhdGUgbmV3bHkgYXJyaXZlZCBwYWNrZXRzICovCi0JZm9yKHJ4ID0gbmljLT5yeF90b19jbGVhbjsgcngtPnNrYjsgcnggPSBuaWMtPnJ4X3RvX2NsZWFuID0gcngtPm5leHQpIHsKKwlmb3IgKHJ4ID0gbmljLT5yeF90b19jbGVhbjsgcngtPnNrYjsgcnggPSBuaWMtPnJ4X3RvX2NsZWFuID0gcngtPm5leHQpIHsKIAkJZXJyID0gZTEwMF9yeF9pbmRpY2F0ZShuaWMsIHJ4LCB3b3JrX2RvbmUsIHdvcmtfdG9fZG8pOwogCQkvKiBIaXQgcXVvdGEgb3Igbm8gbW9yZSB0byBjbGVhbiAqLwogCQlpZiAoLUVBR0FJTiA9PSBlcnIgfHwgLUVOT0RBVEEgPT0gZXJyKQpAQCAtMTkyMiw4ICsxODE3LDggQEAKIAlvbGRfYmVmb3JlX2xhc3RfcmZkID0gKHN0cnVjdCByZmQgKilvbGRfYmVmb3JlX2xhc3RfcngtPnNrYi0+ZGF0YTsKIAogCS8qIEFsbG9jIG5ldyBza2JzIHRvIHJlZmlsbCBsaXN0ICovCi0JZm9yKHJ4ID0gbmljLT5yeF90b191c2U7ICFyeC0+c2tiOyByeCA9IG5pYy0+cnhfdG9fdXNlID0gcngtPm5leHQpIHsKLQkJaWYodW5saWtlbHkoZTEwMF9yeF9hbGxvY19za2IobmljLCByeCkpKQorCWZvciAocnggPSBuaWMtPnJ4X3RvX3VzZTsgIXJ4LT5za2I7IHJ4ID0gbmljLT5yeF90b191c2UgPSByeC0+bmV4dCkgeworCQlpZiAodW5saWtlbHkoZTEwMF9yeF9hbGxvY19za2IobmljLCByeCkpKQogCQkJYnJlYWs7IC8qIEJldHRlciBsdWNrIG5leHQgdGltZSAoc2VlIHdhdGNoZG9nKSAqLwogCX0KIApAQCAtMTk1OSwxMSArMTg1NCwxMSBAQAogCQkJUENJX0RNQV9CSURJUkVDVElPTkFMKTsKIAl9CiAKLQlpZihyZXN0YXJ0X3JlcXVpcmVkKSB7CisJaWYgKHJlc3RhcnRfcmVxdWlyZWQpIHsKIAkJLy8gYWNrIHRoZSBybnI/CiAJCWlvd3JpdGU4KHN0YXRfYWNrX3JuciwgJm5pYy0+Y3NyLT5zY2Iuc3RhdF9hY2spOwogCQllMTAwX3N0YXJ0X3JlY2VpdmVyKG5pYywgbmljLT5yeF90b19jbGVhbik7Ci0JCWlmKHdvcmtfZG9uZSkKKwkJaWYgKHdvcmtfZG9uZSkKIAkJCSgqd29ya19kb25lKSsrOwogCX0KIH0KQEAgLTE5NzUsOSArMTg3MCw5IEBACiAKIAluaWMtPnJ1X3J1bm5pbmcgPSBSVV9VTklOSVRJQUxJWkVEOwogCi0JaWYobmljLT5yeHMpIHsKLQkJZm9yKHJ4ID0gbmljLT5yeHMsIGkgPSAwOyBpIDwgY291bnQ7IHJ4KyssIGkrKykgewotCQkJaWYocngtPnNrYikgeworCWlmIChuaWMtPnJ4cykgeworCQlmb3IgKHJ4ID0gbmljLT5yeHMsIGkgPSAwOyBpIDwgY291bnQ7IHJ4KyssIGkrKykgeworCQkJaWYgKHJ4LT5za2IpIHsKIAkJCQlwY2lfdW5tYXBfc2luZ2xlKG5pYy0+cGRldiwgcngtPmRtYV9hZGRyLAogCQkJCQlSRkRfQlVGX0xFTiwgUENJX0RNQV9CSURJUkVDVElPTkFMKTsKIAkJCQlkZXZfa2ZyZWVfc2tiKHJ4LT5za2IpOwpAQCAtMTk5OSwxMyArMTg5NCwxMyBAQAogCW5pYy0+cnhfdG9fdXNlID0gbmljLT5yeF90b19jbGVhbiA9IE5VTEw7CiAJbmljLT5ydV9ydW5uaW5nID0gUlVfVU5JTklUSUFMSVpFRDsKIAotCWlmKCEobmljLT5yeHMgPSBrY2FsbG9jKGNvdW50LCBzaXplb2Yoc3RydWN0IHJ4KSwgR0ZQX0FUT01JQykpKQorCWlmICghKG5pYy0+cnhzID0ga2NhbGxvYyhjb3VudCwgc2l6ZW9mKHN0cnVjdCByeCksIEdGUF9BVE9NSUMpKSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlmb3IocnggPSBuaWMtPnJ4cywgaSA9IDA7IGkgPCBjb3VudDsgcngrKywgaSsrKSB7CisJZm9yIChyeCA9IG5pYy0+cnhzLCBpID0gMDsgaSA8IGNvdW50OyByeCsrLCBpKyspIHsKIAkJcngtPm5leHQgPSAoaSArIDEgPCBjb3VudCkgPyByeCArIDEgOiBuaWMtPnJ4czsKIAkJcngtPnByZXYgPSAoaSA9PSAwKSA/IG5pYy0+cnhzICsgY291bnQgLSAxIDogcnggLSAxOwotCQlpZihlMTAwX3J4X2FsbG9jX3NrYihuaWMsIHJ4KSkgeworCQlpZiAoZTEwMF9yeF9hbGxvY19za2IobmljLCByeCkpIHsKIAkJCWUxMDBfcnhfY2xlYW5fbGlzdChuaWMpOwogCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0KQEAgLTIwMzgsNyArMTkzMyw3IEBACiAKIAlEUFJJTlRLKElOVFIsIERFQlVHLCAic3RhdF9hY2sgPSAweCUwMlhcbiIsIHN0YXRfYWNrKTsKIAotCWlmKHN0YXRfYWNrID09IHN0YXRfYWNrX25vdF9vdXJzIHx8CS8qIE5vdCBvdXIgaW50ZXJydXB0ICovCisJaWYgKHN0YXRfYWNrID09IHN0YXRfYWNrX25vdF9vdXJzIHx8CS8qIE5vdCBvdXIgaW50ZXJydXB0ICovCiAJICAgc3RhdF9hY2sgPT0gc3RhdF9hY2tfbm90X3ByZXNlbnQpCS8qIEhhcmR3YXJlIGlzIGVqZWN0ZWQgKi8KIAkJcmV0dXJuIElSUV9OT05FOwogCkBAIC0yMDQ2LDEwICsxOTQxLDEwIEBACiAJaW93cml0ZTgoc3RhdF9hY2ssICZuaWMtPmNzci0+c2NiLnN0YXRfYWNrKTsKIAogCS8qIFdlIGhpdCBSZWNlaXZlIE5vIFJlc291cmNlIChSTlIpOyByZXN0YXJ0IFJVIGFmdGVyIGNsZWFuaW5nICovCi0JaWYoc3RhdF9hY2sgJiBzdGF0X2Fja19ybnIpCisJaWYgKHN0YXRfYWNrICYgc3RhdF9hY2tfcm5yKQogCQluaWMtPnJ1X3J1bm5pbmcgPSBSVV9TVVNQRU5ERUQ7CiAKLQlpZihsaWtlbHkobmV0aWZfcnhfc2NoZWR1bGVfcHJlcCgmbmljLT5uYXBpKSkpIHsKKwlpZiAobGlrZWx5KG5ldGlmX3J4X3NjaGVkdWxlX3ByZXAoJm5pYy0+bmFwaSkpKSB7CiAJCWUxMDBfZGlzYWJsZV9pcnEobmljKTsKIAkJX19uZXRpZl9yeF9zY2hlZHVsZSgmbmljLT5uYXBpKTsKIAl9CkBAIC0yMTAyLDcgKzE5OTcsNyBAQAogCiBzdGF0aWMgaW50IGUxMDBfY2hhbmdlX210dShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBpbnQgbmV3X210dSkKIHsKLQlpZihuZXdfbXR1IDwgRVRIX1pMRU4gfHwgbmV3X210dSA+IEVUSF9EQVRBX0xFTikKKwlpZiAobmV3X210dSA8IEVUSF9aTEVOIHx8IG5ld19tdHUgPiBFVEhfREFUQV9MRU4pCiAJCXJldHVybiAtRUlOVkFMOwogCW5ldGRldi0+bXR1ID0gbmV3X210dTsKIAlyZXR1cm4gMDsKQEAgLTIxMjEsMTYgKzIwMTYsMTYgQEAKIHsKIAlpbnQgZXJyOwogCi0JaWYoKGVyciA9IGUxMDBfcnhfYWxsb2NfbGlzdChuaWMpKSkKKwlpZiAoKGVyciA9IGUxMDBfcnhfYWxsb2NfbGlzdChuaWMpKSkKIAkJcmV0dXJuIGVycjsKLQlpZigoZXJyID0gZTEwMF9hbGxvY19jYnMobmljKSkpCisJaWYgKChlcnIgPSBlMTAwX2FsbG9jX2NicyhuaWMpKSkKIAkJZ290byBlcnJfcnhfY2xlYW5fbGlzdDsKLQlpZigoZXJyID0gZTEwMF9od19pbml0KG5pYykpKQorCWlmICgoZXJyID0gZTEwMF9od19pbml0KG5pYykpKQogCQlnb3RvIGVycl9jbGVhbl9jYnM7CiAJZTEwMF9zZXRfbXVsdGljYXN0X2xpc3QobmljLT5uZXRkZXYpOwogCWUxMDBfc3RhcnRfcmVjZWl2ZXIobmljLCBOVUxMKTsKIAltb2RfdGltZXIoJm5pYy0+d2F0Y2hkb2csIGppZmZpZXMpOwotCWlmKChlcnIgPSByZXF1ZXN0X2lycShuaWMtPnBkZXYtPmlycSwgZTEwMF9pbnRyLCBJUlFGX1NIQVJFRCwKKwlpZiAoKGVyciA9IHJlcXVlc3RfaXJxKG5pYy0+cGRldi0+aXJxLCBlMTAwX2ludHIsIElSUUZfU0hBUkVELAogCQluaWMtPm5ldGRldi0+bmFtZSwgbmljLT5uZXRkZXYpKSkKIAkJZ290byBlcnJfbm9faXJxOwogCW5ldGlmX3dha2VfcXVldWUobmljLT5uZXRkZXYpOwpAQCAtMjE5MiwyNiArMjA4NywyNiBAQAogCSAqIGluIGxvb3BiYWNrIG1vZGUsIGFuZCB0aGUgdGVzdCBwYXNzZXMgaWYgdGhlIHJlY2VpdmVkCiAJICogcGFja2V0IGNvbXBhcmVzIGJ5dGUtZm9yLWJ5dGUgdG8gdGhlIHRyYW5zbWl0dGVkIHBhY2tldC4gKi8KIAotCWlmKChlcnIgPSBlMTAwX3J4X2FsbG9jX2xpc3QobmljKSkpCisJaWYgKChlcnIgPSBlMTAwX3J4X2FsbG9jX2xpc3QobmljKSkpCiAJCXJldHVybiBlcnI7Ci0JaWYoKGVyciA9IGUxMDBfYWxsb2NfY2JzKG5pYykpKQorCWlmICgoZXJyID0gZTEwMF9hbGxvY19jYnMobmljKSkpCiAJCWdvdG8gZXJyX2NsZWFuX3J4OwogCiAJLyogSUNIIFBIWSBsb29wYmFjayBpcyBicm9rZW4gc28gZG8gTUFDIGxvb3BiYWNrIGluc3RlYWQgKi8KLQlpZihuaWMtPmZsYWdzICYgaWNoICYmIGxvb3BiYWNrX21vZGUgPT0gbGJfcGh5KQorCWlmIChuaWMtPmZsYWdzICYgaWNoICYmIGxvb3BiYWNrX21vZGUgPT0gbGJfcGh5KQogCQlsb29wYmFja19tb2RlID0gbGJfbWFjOwogCiAJbmljLT5sb29wYmFjayA9IGxvb3BiYWNrX21vZGU7Ci0JaWYoKGVyciA9IGUxMDBfaHdfaW5pdChuaWMpKSkKKwlpZiAoKGVyciA9IGUxMDBfaHdfaW5pdChuaWMpKSkKIAkJZ290byBlcnJfbG9vcGJhY2tfbm9uZTsKIAotCWlmKGxvb3BiYWNrX21vZGUgPT0gbGJfcGh5KQorCWlmIChsb29wYmFja19tb2RlID09IGxiX3BoeSkKIAkJbWRpb193cml0ZShuaWMtPm5ldGRldiwgbmljLT5taWkucGh5X2lkLCBNSUlfQk1DUiwKIAkJCUJNQ1JfTE9PUEJBQ0spOwogCiAJZTEwMF9zdGFydF9yZWNlaXZlcihuaWMsIE5VTEwpOwogCi0JaWYoIShza2IgPSBuZXRkZXZfYWxsb2Nfc2tiKG5pYy0+bmV0ZGV2LCBFVEhfREFUQV9MRU4pKSkgeworCWlmICghKHNrYiA9IG5ldGRldl9hbGxvY19za2IobmljLT5uZXRkZXYsIEVUSF9EQVRBX0xFTikpKSB7CiAJCWVyciA9IC1FTk9NRU07CiAJCWdvdG8gZXJyX2xvb3BiYWNrX25vbmU7CiAJfQpAQCAtMjIyNCw3ICsyMTE5LDcgQEAKIAlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUobmljLT5wZGV2LCBuaWMtPnJ4X3RvX2NsZWFuLT5kbWFfYWRkciwKIAkJCVJGRF9CVUZfTEVOLCBQQ0lfRE1BX0JJRElSRUNUSU9OQUwpOwogCi0JaWYobWVtY21wKG5pYy0+cnhfdG9fY2xlYW4tPnNrYi0+ZGF0YSArIHNpemVvZihzdHJ1Y3QgcmZkKSwKKwlpZiAobWVtY21wKG5pYy0+cnhfdG9fY2xlYW4tPnNrYi0+ZGF0YSArIHNpemVvZihzdHJ1Y3QgcmZkKSwKIAkgICBza2ItPmRhdGEsIEVUSF9EQVRBX0xFTikpCiAJCWVyciA9IC1FQUdBSU47CiAKQEAgLTIzMDEsNyArMjE5Niw3IEBACiAJYnVmZlswXSA9IGlvcmVhZDgoJm5pYy0+Y3NyLT5zY2IuY21kX2hpKSA8PCAyNCB8CiAJCWlvcmVhZDgoJm5pYy0+Y3NyLT5zY2IuY21kX2xvKSA8PCAxNiB8CiAJCWlvcmVhZDE2KCZuaWMtPmNzci0+c2NiLnN0YXR1cyk7Ci0JZm9yKGkgPSBFMTAwX1BIWV9SRUdTOyBpID49IDA7IGktLSkKKwlmb3IgKGkgPSBFMTAwX1BIWV9SRUdTOyBpID49IDA7IGktLSkKIAkJYnVmZlsxICsgRTEwMF9QSFlfUkVHUyAtIGldID0KIAkJCW1kaW9fcmVhZChuZXRkZXYsIG5pYy0+bWlpLnBoeV9pZCwgaSk7CiAJbWVtc2V0KG5pYy0+bWVtLT5kdW1wX2J1ZiwgMCwgc2l6ZW9mKG5pYy0+bWVtLT5kdW1wX2J1ZikpOwpAQCAtMjMyNiw3ICsyMjIxLDcgQEAKIAkgICAgIWRldmljZV9jYW5fd2FrZXVwKCZuaWMtPnBkZXYtPmRldikpCiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIAotCWlmKHdvbC0+d29sb3B0cykKKwlpZiAod29sLT53b2xvcHRzKQogCQluaWMtPmZsYWdzIHw9IHdvbF9tYWdpYzsKIAllbHNlCiAJCW5pYy0+ZmxhZ3MgJj0gfndvbF9tYWdpYzsKQEAgLTIzODUsNyArMjI4MCw3IEBACiB7CiAJc3RydWN0IG5pYyAqbmljID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAotCWlmKGVlcHJvbS0+bWFnaWMgIT0gRTEwMF9FRVBST01fTUFHSUMpCisJaWYgKGVlcHJvbS0+bWFnaWMgIT0gRTEwMF9FRVBST01fTUFHSUMpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJbWVtY3B5KCYoKHU4ICopbmljLT5lZXByb20pW2VlcHJvbS0+b2Zmc2V0XSwgYnl0ZXMsIGVlcHJvbS0+bGVuKTsKQEAgLTI0MjEsNyArMjMxNiw3IEBACiAJaWYgKChyaW5nLT5yeF9taW5pX3BlbmRpbmcpIHx8IChyaW5nLT5yeF9qdW1ib19wZW5kaW5nKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlpZihuZXRpZl9ydW5uaW5nKG5ldGRldikpCisJaWYgKG5ldGlmX3J1bm5pbmcobmV0ZGV2KSkKIAkJZTEwMF9kb3duKG5pYyk7CiAJcmZkcy0+Y291bnQgPSBtYXgocmluZy0+cnhfcGVuZGluZywgcmZkcy0+bWluKTsKIAlyZmRzLT5jb3VudCA9IG1pbihyZmRzLT5jb3VudCwgcmZkcy0+bWF4KTsKQEAgLTI0MjksNyArMjMyNCw3IEBACiAJY2JzLT5jb3VudCA9IG1pbihjYnMtPmNvdW50LCBjYnMtPm1heCk7CiAJRFBSSU5USyhEUlYsIElORk8sICJSaW5nIFBhcmFtIHNldHRpbmdzOiByeDogJWQsIHR4ICVkXG4iLAogCSAgICAgICAgcmZkcy0+Y291bnQsIGNicy0+Y291bnQpOwotCWlmKG5ldGlmX3J1bm5pbmcobmV0ZGV2KSkKKwlpZiAobmV0aWZfcnVubmluZyhuZXRkZXYpKQogCQllMTAwX3VwKG5pYyk7CiAKIAlyZXR1cm4gMDsKQEAgLTI0NTQsMTIgKzIzNDksMTIgQEAKIAltZW1zZXQoZGF0YSwgMCwgRTEwMF9URVNUX0xFTiAqIHNpemVvZih1NjQpKTsKIAlkYXRhWzBdID0gIW1paV9saW5rX29rKCZuaWMtPm1paSk7CiAJZGF0YVsxXSA9IGUxMDBfZWVwcm9tX2xvYWQobmljKTsKLQlpZih0ZXN0LT5mbGFncyAmIEVUSF9URVNUX0ZMX09GRkxJTkUpIHsKKwlpZiAodGVzdC0+ZmxhZ3MgJiBFVEhfVEVTVF9GTF9PRkZMSU5FKSB7CiAKIAkJLyogc2F2ZSBzcGVlZCwgZHVwbGV4ICYgYXV0b25lZyBzZXR0aW5ncyAqLwogCQllcnIgPSBtaWlfZXRodG9vbF9nc2V0KCZuaWMtPm1paSwgJmNtZCk7CiAKLQkJaWYobmV0aWZfcnVubmluZyhuZXRkZXYpKQorCQlpZiAobmV0aWZfcnVubmluZyhuZXRkZXYpKQogCQkJZTEwMF9kb3duKG5pYyk7CiAJCWRhdGFbMl0gPSBlMTAwX3NlbGZfdGVzdChuaWMpOwogCQlkYXRhWzNdID0gZTEwMF9sb29wYmFja190ZXN0KG5pYywgbGJfbWFjKTsKQEAgLTI0NjgsMTAgKzIzNjMsMTAgQEAKIAkJLyogcmVzdG9yZSBzcGVlZCwgZHVwbGV4ICYgYXV0b25lZyBzZXR0aW5ncyAqLwogCQllcnIgPSBtaWlfZXRodG9vbF9zc2V0KCZuaWMtPm1paSwgJmNtZCk7CiAKLQkJaWYobmV0aWZfcnVubmluZyhuZXRkZXYpKQorCQlpZiAobmV0aWZfcnVubmluZyhuZXRkZXYpKQogCQkJZTEwMF91cChuaWMpOwogCX0KLQlmb3IoaSA9IDA7IGkgPCBFMTAwX1RFU1RfTEVOOyBpKyspCisJZm9yIChpID0gMDsgaSA8IEUxMDBfVEVTVF9MRU47IGkrKykKIAkJdGVzdC0+ZmxhZ3MgfD0gZGF0YVtpXSA/IEVUSF9URVNUX0ZMX0ZBSUxFRCA6IDA7CiAKIAltc2xlZXBfaW50ZXJydXB0aWJsZSg0ICogMTAwMCk7CkBAIC0yNDgxLDcgKzIzNzYsNyBAQAogewogCXN0cnVjdCBuaWMgKm5pYyA9IG5ldGRldl9wcml2KG5ldGRldik7CiAKLQlpZighZGF0YSB8fCBkYXRhID4gKHUzMikoTUFYX1NDSEVEVUxFX1RJTUVPVVQgLyBIWikpCisJaWYgKCFkYXRhIHx8IGRhdGEgPiAodTMyKShNQVhfU0NIRURVTEVfVElNRU9VVCAvIEhaKSkKIAkJZGF0YSA9ICh1MzIpKE1BWF9TQ0hFRFVMRV9USU1FT1VUIC8gSFopOwogCW1vZF90aW1lcigmbmljLT5ibGlua190aW1lciwgamlmZmllcyk7CiAJbXNsZWVwX2ludGVycnVwdGlibGUoZGF0YSAqIDEwMDApOwpAQCAtMjUyNCw3ICsyNDE5LDcgQEAKIAlzdHJ1Y3QgbmljICpuaWMgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCWludCBpOwogCi0JZm9yKGkgPSAwOyBpIDwgRTEwMF9ORVRfU1RBVFNfTEVOOyBpKyspCisJZm9yIChpID0gMDsgaSA8IEUxMDBfTkVUX1NUQVRTX0xFTjsgaSsrKQogCQlkYXRhW2ldID0gKCh1bnNpZ25lZCBsb25nICopJm5ldGRldi0+c3RhdHMpW2ldOwogCiAJZGF0YVtpKytdID0gbmljLT50eF9kZWZlcnJlZDsKQEAgLTI1MzksNyArMjQzNCw3IEBACiAKIHN0YXRpYyB2b2lkIGUxMDBfZ2V0X3N0cmluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdTMyIHN0cmluZ3NldCwgdTggKmRhdGEpCiB7Ci0Jc3dpdGNoKHN0cmluZ3NldCkgeworCXN3aXRjaCAoc3RyaW5nc2V0KSB7CiAJY2FzZSBFVEhfU1NfVEVTVDoKIAkJbWVtY3B5KGRhdGEsICplMTAwX2dzdHJpbmdzX3Rlc3QsIHNpemVvZihlMTAwX2dzdHJpbmdzX3Rlc3QpKTsKIAkJYnJlYWs7CkBAIC0yNTg5LDcgKzI0ODQsNyBAQAogCiBzdGF0aWMgdm9pZCBlMTAwX2ZyZWUoc3RydWN0IG5pYyAqbmljKQogewotCWlmKG5pYy0+bWVtKSB7CisJaWYgKG5pYy0+bWVtKSB7CiAJCXBjaV9mcmVlX2NvbnNpc3RlbnQobmljLT5wZGV2LCBzaXplb2Yoc3RydWN0IG1lbSksCiAJCQluaWMtPm1lbSwgbmljLT5kbWFfYWRkcik7CiAJCW5pYy0+bWVtID0gTlVMTDsKQEAgLTI2MDIsNyArMjQ5Nyw3IEBACiAJaW50IGVyciA9IDA7CiAKIAluZXRpZl9jYXJyaWVyX29mZihuZXRkZXYpOwotCWlmKChlcnIgPSBlMTAwX3VwKG5pYykpKQorCWlmICgoZXJyID0gZTEwMF91cChuaWMpKSkKIAkJRFBSSU5USyhJRlVQLCBFUlIsICJDYW5ub3Qgb3BlbiBpbnRlcmZhY2UsIGFib3J0aW5nLlxuIik7CiAJcmV0dXJuIGVycjsKIH0KQEAgLTI2MzUsOCArMjUzMCw4IEBACiAJc3RydWN0IG5pYyAqbmljOwogCWludCBlcnI7CiAKLQlpZighKG5ldGRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihzdHJ1Y3QgbmljKSkpKSB7Ci0JCWlmKCgoMSA8PCBkZWJ1ZykgLSAxKSAmIE5FVElGX01TR19QUk9CRSkKKwlpZiAoIShuZXRkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IG5pYykpKSkgeworCQlpZiAoKCgxIDw8IGRlYnVnKSAtIDEpICYgTkVUSUZfTVNHX1BST0JFKQogCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiRXRoZXJkZXYgYWxsb2MgZmFpbGVkLCBhYm9ydC5cbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CkBAIC0yNjUzLDI0ICsyNTQ4LDI0IEBACiAJbmljLT5tc2dfZW5hYmxlID0gKDEgPDwgZGVidWcpIC0gMTsKIAlwY2lfc2V0X2RydmRhdGEocGRldiwgbmV0ZGV2KTsKIAotCWlmKChlcnIgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KSkpIHsKKwlpZiAoKGVyciA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpKSkgewogCQlEUFJJTlRLKFBST0JFLCBFUlIsICJDYW5ub3QgZW5hYmxlIFBDSSBkZXZpY2UsIGFib3J0aW5nLlxuIik7CiAJCWdvdG8gZXJyX291dF9mcmVlX2RldjsKIAl9CiAKLQlpZighKHBjaV9yZXNvdXJjZV9mbGFncyhwZGV2LCAwKSAmIElPUkVTT1VSQ0VfTUVNKSkgeworCWlmICghKHBjaV9yZXNvdXJjZV9mbGFncyhwZGV2LCAwKSAmIElPUkVTT1VSQ0VfTUVNKSkgewogCQlEUFJJTlRLKFBST0JFLCBFUlIsICJDYW5ub3QgZmluZCBwcm9wZXIgUENJIGRldmljZSAiCiAJCQkiYmFzZSBhZGRyZXNzLCBhYm9ydGluZy5cbiIpOwogCQllcnIgPSAtRU5PREVWOwogCQlnb3RvIGVycl9vdXRfZGlzYWJsZV9wZGV2OwogCX0KIAotCWlmKChlcnIgPSBwY2lfcmVxdWVzdF9yZWdpb25zKHBkZXYsIERSVl9OQU1FKSkpIHsKKwlpZiAoKGVyciA9IHBjaV9yZXF1ZXN0X3JlZ2lvbnMocGRldiwgRFJWX05BTUUpKSkgewogCQlEUFJJTlRLKFBST0JFLCBFUlIsICJDYW5ub3Qgb2J0YWluIFBDSSByZXNvdXJjZXMsIGFib3J0aW5nLlxuIik7CiAJCWdvdG8gZXJyX291dF9kaXNhYmxlX3BkZXY7CiAJfQogCi0JaWYoKGVyciA9IHBjaV9zZXRfZG1hX21hc2socGRldiwgRE1BXzMyQklUX01BU0spKSkgeworCWlmICgoZXJyID0gcGNpX3NldF9kbWFfbWFzayhwZGV2LCBETUFfMzJCSVRfTUFTSykpKSB7CiAJCURQUklOVEsoUFJPQkUsIEVSUiwgIk5vIHVzYWJsZSBETUEgY29uZmlndXJhdGlvbiwgYWJvcnRpbmcuXG4iKTsKIAkJZ290byBlcnJfb3V0X2ZyZWVfcmVzOwogCX0KQEAgLTI2ODEsMTMgKzI1NzYsMTMgQEAKIAkJRFBSSU5USyhQUk9CRSwgSU5GTywgInVzaW5nIGkvbyBhY2Nlc3MgbW9kZVxuIik7CiAKIAluaWMtPmNzciA9IHBjaV9pb21hcChwZGV2LCAodXNlX2lvID8gMSA6IDApLCBzaXplb2Yoc3RydWN0IGNzcikpOwotCWlmKCFuaWMtPmNzcikgeworCWlmICghbmljLT5jc3IpIHsKIAkJRFBSSU5USyhQUk9CRSwgRVJSLCAiQ2Fubm90IG1hcCBkZXZpY2UgcmVnaXN0ZXJzLCBhYm9ydGluZy5cbiIpOwogCQllcnIgPSAtRU5PTUVNOwogCQlnb3RvIGVycl9vdXRfZnJlZV9yZXM7CiAJfQogCi0JaWYoZW50LT5kcml2ZXJfZGF0YSkKKwlpZiAoZW50LT5kcml2ZXJfZGF0YSkKIAkJbmljLT5mbGFncyB8PSBpY2g7CiAJZWxzZQogCQluaWMtPmZsYWdzICY9IH5pY2g7CkBAIC0yNzE1LDEyICsyNjEwLDEyIEBACiAKIAlJTklUX1dPUksoJm5pYy0+dHhfdGltZW91dF90YXNrLCBlMTAwX3R4X3RpbWVvdXRfdGFzayk7CiAKLQlpZigoZXJyID0gZTEwMF9hbGxvYyhuaWMpKSkgeworCWlmICgoZXJyID0gZTEwMF9hbGxvYyhuaWMpKSkgewogCQlEUFJJTlRLKFBST0JFLCBFUlIsICJDYW5ub3QgYWxsb2MgZHJpdmVyIG1lbW9yeSwgYWJvcnRpbmcuXG4iKTsKIAkJZ290byBlcnJfb3V0X2lvdW5tYXA7CiAJfQogCi0JaWYoKGVyciA9IGUxMDBfZWVwcm9tX2xvYWQobmljKSkpCisJaWYgKChlcnIgPSBlMTAwX2VlcHJvbV9sb2FkKG5pYykpKQogCQlnb3RvIGVycl9vdXRfZnJlZTsKIAogCWUxMDBfcGh5X2luaXQobmljKTsKQEAgLTI3NDAsNyArMjYzNSw3IEBACiAJfQogCiAJLyogV29sIG1hZ2ljIHBhY2tldCBjYW4gYmUgZW5hYmxlZCBmcm9tIGVlcHJvbSAqLwotCWlmKChuaWMtPm1hYyA+PSBtYWNfODI1NThfRDEwMV9BNCkgJiYKKwlpZiAoKG5pYy0+bWFjID49IG1hY184MjU1OF9EMTAxX0E0KSAmJgogCSAgIChuaWMtPmVlcHJvbVtlZXByb21faWRdICYgZWVwcm9tX2lkX3dvbCkpIHsKIAkJbmljLT5mbGFncyB8PSB3b2xfbWFnaWM7CiAJCWRldmljZV9zZXRfd2FrZXVwX2VuYWJsZSgmcGRldi0+ZGV2LCB0cnVlKTsKQEAgLTI3NTAsNyArMjY0NSw3IEBACiAJcGNpX3BtZV9hY3RpdmUocGRldiwgZmFsc2UpOwogCiAJc3RyY3B5KG5ldGRldi0+bmFtZSwgImV0aCVkIik7Ci0JaWYoKGVyciA9IHJlZ2lzdGVyX25ldGRldihuZXRkZXYpKSkgeworCWlmICgoZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KG5ldGRldikpKSB7CiAJCURQUklOVEsoUFJPQkUsIEVSUiwgIkNhbm5vdCByZWdpc3RlciBuZXQgZGV2aWNlLCBhYm9ydGluZy5cbiIpOwogCQlnb3RvIGVycl9vdXRfZnJlZTsKIAl9CkBAIC0yNzc5LDcgKzI2NzQsNyBAQAogewogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CiAKLQlpZihuZXRkZXYpIHsKKwlpZiAobmV0ZGV2KSB7CiAJCXN0cnVjdCBuaWMgKm5pYyA9IG5ldGRldl9wcml2KG5ldGRldik7CiAJCXVucmVnaXN0ZXJfbmV0ZGV2KG5ldGRldik7CiAJCWUxMDBfZnJlZShuaWMpOwpAQCAtMjkzMiw3ICsyODI3LDcgQEAKIAogc3RhdGljIGludCBfX2luaXQgZTEwMF9pbml0X21vZHVsZSh2b2lkKQogewotCWlmKCgoMSA8PCBkZWJ1ZykgLSAxKSAmIE5FVElGX01TR19EUlYpIHsKKwlpZiAoKCgxIDw8IGRlYnVnKSAtIDEpICYgTkVUSUZfTVNHX0RSVikgewogCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiJXMsICVzXG4iLCBEUlZfREVTQ1JJUFRJT04sIERSVl9WRVJTSU9OKTsKIAkJcHJpbnRrKEtFUk5fSU5GTyBQRlggIiVzXG4iLCBEUlZfQ09QWVJJR0hUKTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMF9ody5jIGIvZHJpdmVycy9uZXQvZTEwMDAvZTEwMDBfaHcuYwppbmRleCBkMDRlZWY1Li5lMWEzZmMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMF9ody5jCisrKyBiL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwX2h3LmMKQEAgLTY3NTgsNyArNjc1OCw3IEBACiAgKiByZXR1cm5zOiAtIEUxMDAwX0VSUl9YWFgKICAqICAgICAgICAgICAgRTEwMDBfU1VDQ0VTUwogICoKLSAqIEZvciBwaHkncyBvbGRlciB0aGVuIElHUCwgdGhpcyBmdW5jdGlvbiBzaW1wbHkgcmVhZHMgdGhlIHBvbGFyaXR5IGJpdCBpbiB0aGUKKyAqIEZvciBwaHkncyBvbGRlciB0aGFuIElHUCwgdGhpcyBmdW5jdGlvbiBzaW1wbHkgcmVhZHMgdGhlIHBvbGFyaXR5IGJpdCBpbiB0aGUKICAqIFBoeSBTdGF0dXMgcmVnaXN0ZXIuICBGb3IgSUdQIHBoeSdzLCB0aGlzIGJpdCBpcyB2YWxpZCBvbmx5IGlmIGxpbmsgc3BlZWQgaXMKICAqIDEwIE1icHMuICBJZiB0aGUgbGluayBzcGVlZCBpcyAxMDAgTWJwcyB0aGVyZSBpcyBubyBwb2xhcml0eSBzbyB0aGlzIGJpdCB3aWxsCiAgKiByZXR1cm4gMC4gIElmIHRoZSBsaW5rIHNwZWVkIGlzIDEwMDAgTWJwcyB0aGUgcG9sYXJpdHkgc3RhdHVzIGlzIGluIHRoZQpAQCAtNjgzNCw3ICs2ODM0LDcgQEAKICAqIHJldHVybnM6IC0gRTEwMDBfRVJSX1hYWAogICogICAgICAgICAgICBFMTAwMF9TVUNDRVNTCiAgKgotICogRm9yIHBoeSdzIG9sZGVyIHRoZW4gSUdQLCB0aGlzIGZ1bmN0aW9uIHJlYWRzIHRoZSBEb3duc2hpZnQgYml0IGluIHRoZSBQaHkKKyAqIEZvciBwaHkncyBvbGRlciB0aGFuIElHUCwgdGhpcyBmdW5jdGlvbiByZWFkcyB0aGUgRG93bnNoaWZ0IGJpdCBpbiB0aGUgUGh5CiAgKiBTcGVjaWZpYyBTdGF0dXMgcmVnaXN0ZXIuICBGb3IgSUdQIHBoeSdzLCBpdCByZWFkcyB0aGUgRG93bmdyYWRlIGJpdCBpbiB0aGUKICAqIExpbmsgSGVhbHRoIHJlZ2lzdGVyLiAgSW4gSUdQIHRoaXMgYml0IGlzIGxhdGNoZWQgaGlnaCwgc28gdGhlIGRyaXZlciBtdXN0CiAgKiByZWFkIGl0IGltbWVkaWF0ZWx5IGFmdGVyIGxpbmsgaXMgZXN0YWJsaXNoZWQuCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9lMTAwMGUvbmV0ZGV2LmMgYi9kcml2ZXJzL25ldC9lMTAwMGUvbmV0ZGV2LmMKaW5kZXggZDQ2MzlmYS4uOTE4MTdkMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZTEwMDBlL25ldGRldi5jCisrKyBiL2RyaXZlcnMvbmV0L2UxMDAwZS9uZXRkZXYuYwpAQCAtNDgwNyw3ICs0ODA3LDcgQEAKIAkJfQogCX0KIAotCWVyciA9IHBjaV9yZXF1ZXN0X3NlbGVjdGVkX3JlZ2lvbnMocGRldiwKKwllcnIgPSBwY2lfcmVxdWVzdF9zZWxlY3RlZF9yZWdpb25zX2V4Y2x1c2l2ZShwZGV2LAogCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwY2lfc2VsZWN0X2JhcnMocGRldiwgSU9SRVNPVVJDRV9NRU0pLAogCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlMTAwMGVfZHJpdmVyX25hbWUpOwogCWlmIChlcnIpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9laGVhL2VoZWEuaCBiL2RyaXZlcnMvbmV0L2VoZWEvZWhlYS5oCmluZGV4IDk5MzBkNWYuLjYyNzFiOTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2VoZWEvZWhlYS5oCisrKyBiL2RyaXZlcnMvbmV0L2VoZWEvZWhlYS5oCkBAIC00NzgsNyArNDc4LDcgQEAKIAlpbnQgbnVtX2FkZF90eF9xcHM7CiAJaW50IG51bV9tY3M7CiAJaW50IHJlc2V0czsKLQl1NjQgZmxhZ3M7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1NjQgbWFjX2FkZHI7CiAJdTMyIGxvZ2ljYWxfcG9ydF9pZDsKIAl1MzIgcG9ydF9zcGVlZDsKQEAgLTUxMCw3ICs1MTAsNiBAQAogaW50IGVoZWFfc2Vuc2VfcG9ydF9hdHRyKHN0cnVjdCBlaGVhX3BvcnQgKnBvcnQpOwogaW50IGVoZWFfc2V0X3BvcnRzcGVlZChzdHJ1Y3QgZWhlYV9wb3J0ICpwb3J0LCB1MzIgcG9ydF9zcGVlZCk7CiAKLWV4dGVybiB1NjQgZWhlYV9kcml2ZXJfZmxhZ3M7CiBleHRlcm4gc3RydWN0IHdvcmtfc3RydWN0IGVoZWFfcmVyZWdfbXJfdGFzazsKIAogI2VuZGlmCS8qIF9fRUhFQV9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2VoZWEvZWhlYV9tYWluLmMgYi9kcml2ZXJzL25ldC9laGVhL2VoZWFfbWFpbi5jCmluZGV4IGEyZjE5MDUuLmUzMTMxZWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2VoZWEvZWhlYV9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvZWhlYS9laGVhX21haW4uYwpAQCAtOTksNyArOTksNyBAQAogCiBzdGF0aWMgaW50IHBvcnRfbmFtZV9jbnQ7CiBzdGF0aWMgTElTVF9IRUFEKGFkYXB0ZXJfbGlzdCk7Ci11NjQgZWhlYV9kcml2ZXJfZmxhZ3M7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBlaGVhX2RyaXZlcl9mbGFnczsKIHN0cnVjdCB3b3JrX3N0cnVjdCBlaGVhX3JlcmVnX21yX3Rhc2s7CiBzdGF0aWMgREVGSU5FX01VVEVYKGRscGFyX21lbV9sb2NrKTsKIHN0cnVjdCBlaGVhX2Z3X2hhbmRsZV9hcnJheSBlaGVhX2Z3X2hhbmRsZXM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9laGVhL2VoZWFfcGh5cC5jIGIvZHJpdmVycy9uZXQvZWhlYS9laGVhX3BoeXAuYwppbmRleCAyYTMzYTYxLi44ZmU5ZGNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9laGVhL2VoZWFfcGh5cC5jCisrKyBiL2RyaXZlcnMvbmV0L2VoZWEvZWhlYV9waHlwLmMKQEAgLTIxNCw3ICsyMTQsNyBAQAogCQkJICAgICB1NjQgKnFwX2hhbmRsZSwgc3RydWN0IGhfZXBhcyAqaF9lcGFzKQogewogCXU2NCBocmV0OwotCXU2NCBvdXRzW1BMUEFSX0hDQUxMOV9CVUZTSVpFXTsKKwl1bnNpZ25lZCBsb25nIG91dHNbUExQQVJfSENBTEw5X0JVRlNJWkVdOwogCiAJdTY0IGFsbG9jYXRlX2NvbnRyb2xzID0KIAkgICAgRUhFQV9CTUFTS19TRVQoSF9BTExfUkVTX1FQX0VRUE8sIGluaXRfYXR0ci0+bG93X2xhdF9ycTEgPyAxIDogMCkKQEAgLTMxMiw3ICszMTIsNyBAQAogCQkJICAgICB1NjQgKmNxX2hhbmRsZSwgc3RydWN0IGhfZXBhcyAqZXBhcykKIHsKIAl1NjQgaHJldDsKLQl1NjQgb3V0c1tQTFBBUl9IQ0FMTDlfQlVGU0laRV07CisJdW5zaWduZWQgbG9uZyBvdXRzW1BMUEFSX0hDQUxMOV9CVUZTSVpFXTsKIAogCWhyZXQgPSBlaGVhX3BscGFyX2hjYWxsOShIX0FMTE9DX0hFQV9SRVNPVVJDRSwKIAkJCQkgb3V0cywKQEAgLTM3NCw3ICszNzQsNyBAQAogCQkJICAgICBzdHJ1Y3QgZWhlYV9lcV9hdHRyICplcV9hdHRyLCB1NjQgKmVxX2hhbmRsZSkKIHsKIAl1NjQgaHJldCwgYWxsb2NhdGVfY29udHJvbHM7Ci0JdTY0IG91dHNbUExQQVJfSENBTEw5X0JVRlNJWkVdOworCXVuc2lnbmVkIGxvbmcgb3V0c1tQTFBBUl9IQ0FMTDlfQlVGU0laRV07CiAKIAkvKiByZXNvdXJjZSB0eXBlICovCiAJYWxsb2NhdGVfY29udHJvbHMgPQpAQCAtNDA3LDcgKzQwNyw3IEBACiAJCQkgIHUxNiAqb3V0X3N3ciwgdTE2ICpvdXRfcndyKQogewogCXU2NCBocmV0OwotCXU2NCBvdXRzW1BMUEFSX0hDQUxMOV9CVUZTSVpFXTsKKwl1bnNpZ25lZCBsb25nIG91dHNbUExQQVJfSENBTEw5X0JVRlNJWkVdOwogCiAJaHJldCA9IGVoZWFfcGxwYXJfaGNhbGw5KEhfTU9ESUZZX0hFQV9RUCwKIAkJCQkgb3V0cywKQEAgLTQ0OSw3ICs0NDksNyBAQAogCQkJc3RydWN0IGVoZWFfbXIgKm1yKQogewogCXU2NCBocmV0OwotCXU2NCBvdXRzW1BMUEFSX0hDQUxMOV9CVUZTSVpFXTsKKwl1bnNpZ25lZCBsb25nIG91dHNbUExQQVJfSENBTEw5X0JVRlNJWkVdOwogCiAJaHJldCA9IGVoZWFfcGxwYXJfaGNhbGw5KEhfUkVHSVNURVJfU01SLAogCQkJCSBvdXRzLApAQCAtNDY4LDcgKzQ2OCw3IEBACiAKIHU2NCBlaGVhX2hfZGlzYWJsZV9hbmRfZ2V0X2hlYShjb25zdCB1NjQgYWRhcHRlcl9oYW5kbGUsIGNvbnN0IHU2NCBxcF9oYW5kbGUpCiB7Ci0JdTY0IG91dHNbUExQQVJfSENBTEw5X0JVRlNJWkVdOworCXVuc2lnbmVkIGxvbmcgb3V0c1tQTFBBUl9IQ0FMTDlfQlVGU0laRV07CiAKIAlyZXR1cm4gZWhlYV9wbHBhcl9oY2FsbDkoSF9ESVNBQkxFX0FORF9HRVRfSEVBLAogCQkJCSBvdXRzLApAQCAtNDkzLDcgKzQ5Myw3IEBACiAJCQkgICAgIGNvbnN0IHUzMiBwZCwgdTY0ICptcl9oYW5kbGUsIHUzMiAqbGtleSkKIHsKIAl1NjQgaHJldDsKLQl1NjQgb3V0c1tQTFBBUl9IQ0FMTDlfQlVGU0laRV07CisJdW5zaWduZWQgbG9uZyBvdXRzW1BMUEFSX0hDQUxMOV9CVUZTSVpFXTsKIAogCWhyZXQgPSBlaGVhX3BscGFyX2hjYWxsOShIX0FMTE9DX0hFQV9SRVNPVVJDRSwKIAkJCQkgb3V0cywKQEAgLTU2NCw3ICs1NjQsNyBAQAogCQkJICAgIGNvbnN0IHU4IGNiX2NhdCwgY29uc3QgdTY0IHNlbGVjdF9tYXNrLAogCQkJICAgIHZvaWQgKmNiX2FkZHIpCiB7Ci0JdTY0IG91dHNbUExQQVJfSENBTEw5X0JVRlNJWkVdOworCXVuc2lnbmVkIGxvbmcgb3V0c1tQTFBBUl9IQ0FMTDlfQlVGU0laRV07CiAJdTY0IHBvcnRfaW5mbzsKIAl1NjQgYXJyX2luZGV4ID0gMDsKIAl1NjQgY2JfbG9nYWRkciA9IHZpcnRfdG9fYWJzKGNiX2FkZHIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZW5jMjhqNjAuYyBiL2RyaXZlcnMvbmV0L2VuYzI4ajYwLmMKaW5kZXggYjBlZjQ2Yy4uZmM2Y2MwMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZW5jMjhqNjAuYworKysgYi9kcml2ZXJzL25ldC9lbmMyOGo2MC5jCkBAIC05NDQsNyArOTQ0LDcgQEAKIAlpZiAobmV0aWZfbXNnX3J4X3N0YXR1cyhwcml2KSkKIAkJZW5jMjhqNjBfZHVtcF9yc3YocHJpdiwgX19mdW5jX18sIG5leHRfcGFja2V0LCBsZW4sIHJ4c3RhdCk7CiAKLQlpZiAoIVJTVl9HRVRCSVQocnhzdGF0LCBSU1ZfUlhPSykpIHsKKwlpZiAoIVJTVl9HRVRCSVQocnhzdGF0LCBSU1ZfUlhPSykgfHwgbGVuID4gTUFYX0ZSQU1FTEVOKSB7CiAJCWlmIChuZXRpZl9tc2dfcnhfZXJyKHByaXYpKQogCQkJZGV2X2VycigmbmRldi0+ZGV2LCAiUnggRXJyb3IgKCUwNHgpXG4iLCByeHN0YXQpOwogCQluZGV2LT5zdGF0cy5yeF9lcnJvcnMrKzsKQEAgLTk1Miw2ICs5NTIsOCBAQAogCQkJbmRldi0+c3RhdHMucnhfY3JjX2Vycm9ycysrOwogCQlpZiAoUlNWX0dFVEJJVChyeHN0YXQsIFJTVl9MRU5DSEVDS0VSUikpCiAJCQluZGV2LT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKKwkJaWYgKGxlbiA+IE1BWF9GUkFNRUxFTikKKwkJCW5kZXYtPnN0YXRzLnJ4X292ZXJfZXJyb3JzKys7CiAJfSBlbHNlIHsKIAkJc2tiID0gZGV2X2FsbG9jX3NrYihsZW4gKyBORVRfSVBfQUxJR04pOwogCQlpZiAoIXNrYikgewpAQCAtMTUyOSw2ICsxNTMxLDE3IEBACiAJcmV0dXJuIGVuYzI4ajYwX2h3X2luaXQocHJpdik7CiB9CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgZW5jMjhqNjBfbmV0ZGV2X29wcyA9IHsKKwkubmRvX29wZW4JCT0gZW5jMjhqNjBfbmV0X29wZW4sCisJLm5kb19zdG9wCQk9IGVuYzI4ajYwX25ldF9jbG9zZSwKKwkubmRvX3N0YXJ0X3htaXQJCT0gZW5jMjhqNjBfc2VuZF9wYWNrZXQsCisJLm5kb19zZXRfbXVsdGljYXN0X2xpc3QgPSBlbmMyOGo2MF9zZXRfbXVsdGljYXN0X2xpc3QsCisJLm5kb19zZXRfbWFjX2FkZHJlc3MJPSBlbmMyOGo2MF9zZXRfbWFjX2FkZHJlc3MsCisJLm5kb190eF90aW1lb3V0CQk9IGVuYzI4ajYwX3R4X3RpbWVvdXQsCisJLm5kb19jaGFuZ2VfbXR1CQk9IGV0aF9jaGFuZ2VfbXR1LAorCS5uZG9fdmFsaWRhdGVfYWRkcgk9IGV0aF92YWxpZGF0ZV9hZGRyLAorfTsKKwogc3RhdGljIGludCBfX2RldmluaXQgZW5jMjhqNjBfcHJvYmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OwpAQCAtMTU4MywxMiArMTU5Niw3IEBACiAKIAlkZXYtPmlmX3BvcnQgPSBJRl9QT1JUXzEwQkFTRVQ7CiAJZGV2LT5pcnEgPSBzcGktPmlycTsKLQlkZXYtPm9wZW4gPSBlbmMyOGo2MF9uZXRfb3BlbjsKLQlkZXYtPnN0b3AgPSBlbmMyOGo2MF9uZXRfY2xvc2U7Ci0JZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBlbmMyOGo2MF9zZW5kX3BhY2tldDsKLQlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9ICZlbmMyOGo2MF9zZXRfbXVsdGljYXN0X2xpc3Q7Ci0JZGV2LT5zZXRfbWFjX2FkZHJlc3MgPSBlbmMyOGo2MF9zZXRfbWFjX2FkZHJlc3M7Ci0JZGV2LT50eF90aW1lb3V0ID0gJmVuYzI4ajYwX3R4X3RpbWVvdXQ7CisJZGV2LT5uZXRkZXZfb3BzID0gJmVuYzI4ajYwX25ldGRldl9vcHM7CiAJZGV2LT53YXRjaGRvZ190aW1lbyA9IFRYX1RJTUVPVVQ7CiAJU0VUX0VUSFRPT0xfT1BTKGRldiwgJmVuYzI4ajYwX2V0aHRvb2xfb3BzKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXBpYzEwMC5jIGIvZHJpdmVycy9uZXQvZXBpYzEwMC5jCmluZGV4IGY5YjM3YzguLmE1MzliYzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2VwaWMxMDAuYworKysgYi9kcml2ZXJzL25ldC9lcGljMTAwLmMKQEAgLTMwOCw3ICszMDgsMTggQEAKIHN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqZXBpY19nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiBzdGF0aWMgdm9pZCBzZXRfcnhfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIAotCitzdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIGVwaWNfbmV0ZGV2X29wcyA9IHsKKwkubmRvX29wZW4JCT0gZXBpY19vcGVuLAorCS5uZG9fc3RvcAkJPSBlcGljX2Nsb3NlLAorCS5uZG9fc3RhcnRfeG1pdAkJPSBlcGljX3N0YXJ0X3htaXQsCisJLm5kb190eF90aW1lb3V0IAk9IGVwaWNfdHhfdGltZW91dCwKKwkubmRvX2dldF9zdGF0cwkJPSBlcGljX2dldF9zdGF0cywKKwkubmRvX3NldF9tdWx0aWNhc3RfbGlzdCA9IHNldF9yeF9tb2RlLAorCS5uZG9fZG9faW9jdGwgCQk9IG5ldGRldl9pb2N0bCwKKwkubmRvX2NoYW5nZV9tdHUJCT0gZXRoX2NoYW5nZV9tdHUsCisJLm5kb19zZXRfbWFjX2FkZHJlc3MgCT0gZXRoX21hY19hZGRyLAorCS5uZG9fdmFsaWRhdGVfYWRkcgk9IGV0aF92YWxpZGF0ZV9hZGRyLAorfTsKIAogc3RhdGljIGludCBfX2RldmluaXQgZXBpY19pbml0X29uZSAoc3RydWN0IHBjaV9kZXYgKnBkZXYsCiAJCQkJICAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCkBAIC00ODMsMTUgKzQ5NCw5IEBACiAJZGV2LT5pZl9wb3J0ID0gZXAtPmRlZmF1bHRfcG9ydCA9IG9wdGlvbjsKIAogCS8qIFRoZSBFcGljLXNwZWNpZmljIGVudHJpZXMgaW4gdGhlIGRldmljZSBzdHJ1Y3R1cmUuICovCi0JZGV2LT5vcGVuID0gJmVwaWNfb3BlbjsKLQlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9ICZlcGljX3N0YXJ0X3htaXQ7Ci0JZGV2LT5zdG9wID0gJmVwaWNfY2xvc2U7Ci0JZGV2LT5nZXRfc3RhdHMgPSAmZXBpY19nZXRfc3RhdHM7Ci0JZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSAmc2V0X3J4X21vZGU7Ci0JZGV2LT5kb19pb2N0bCA9ICZuZXRkZXZfaW9jdGw7CisJZGV2LT5uZXRkZXZfb3BzID0gJmVwaWNfbmV0ZGV2X29wczsKIAlkZXYtPmV0aHRvb2xfb3BzID0gJm5ldGRldl9ldGh0b29sX29wczsKIAlkZXYtPndhdGNoZG9nX3RpbWVvID0gVFhfVElNRU9VVDsKLQlkZXYtPnR4X3RpbWVvdXQgPSAmZXBpY190eF90aW1lb3V0OwogCW5ldGlmX25hcGlfYWRkKGRldiwgJmVwLT5uYXBpLCBlcGljX3BvbGwsIDY0KTsKIAogCXJldCA9IHJlZ2lzdGVyX25ldGRldihkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZmVhbG54LmMgYi9kcml2ZXJzL25ldC9mZWFsbnguYwppbmRleCAzMWFiMWZmLi5kYWY3MjcyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9mZWFsbnguYworKysgYi9kcml2ZXJzL25ldC9mZWFsbnguYwpAQCAtNDY3LDYgKzQ2NywxOCBAQAogCX0KIH0KIAorc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyBuZXRkZXZfb3BzID0geworCS5uZG9fb3BlbgkJPSBuZXRkZXZfb3BlbiwKKwkubmRvX3N0b3AJCT0gbmV0ZGV2X2Nsb3NlLAorCS5uZG9fc3RhcnRfeG1pdAkJPSBzdGFydF90eCwKKwkubmRvX2dldF9zdGF0cyAJCT0gZ2V0X3N0YXRzLAorCS5uZG9fc2V0X211bHRpY2FzdF9saXN0ID0gc2V0X3J4X21vZGUsCisJLm5kb19kb19pb2N0bAkJPSBtaWlfaW9jdGwsCisJLm5kb190eF90aW1lb3V0CQk9IGZlYWxueF90eF90aW1lb3V0LAorCS5uZG9fY2hhbmdlX210dQkJPSBldGhfY2hhbmdlX210dSwKKwkubmRvX3NldF9tYWNfYWRkcmVzcyAJPSBldGhfbWFjX2FkZHIsCisJLm5kb192YWxpZGF0ZV9hZGRyCT0gZXRoX3ZhbGlkYXRlX2FkZHIsCit9OwogCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBmZWFsbnhfaW5pdF9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCiAJCQkJICAgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQpAQCAtNjQ5LDE1ICs2NjEsOCBAQAogCQlucC0+bWlpLmZvcmNlX21lZGlhID0gMTsKIAl9CiAKLQkvKiBUaGUgY2hpcC1zcGVjaWZpYyBlbnRyaWVzIGluIHRoZSBkZXZpY2Ugc3RydWN0dXJlLiAqLwotCWRldi0+b3BlbiA9ICZuZXRkZXZfb3BlbjsKLQlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9ICZzdGFydF90eDsKLQlkZXYtPnN0b3AgPSAmbmV0ZGV2X2Nsb3NlOwotCWRldi0+Z2V0X3N0YXRzID0gJmdldF9zdGF0czsKLQlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9ICZzZXRfcnhfbW9kZTsKLQlkZXYtPmRvX2lvY3RsID0gJm1paV9pb2N0bDsKKwlkZXYtPm5ldGRldl9vcHMgPSAmbmV0ZGV2X29wczsKIAlkZXYtPmV0aHRvb2xfb3BzID0gJm5ldGRldl9ldGh0b29sX29wczsKLQlkZXYtPnR4X3RpbWVvdXQgPSAmZmVhbG54X3R4X3RpbWVvdXQ7CiAJZGV2LT53YXRjaGRvZ190aW1lbyA9IFRYX1RJTUVPVVQ7CiAKIAllcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2dpYW5mYXIuYyBiL2RyaXZlcnMvbmV0L2dpYW5mYXIuYwppbmRleCBjNjcyZWNmLi4xYjhkZWNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9naWFuZmFyLmMKKysrIGIvZHJpdmVycy9uZXQvZ2lhbmZhci5jCkBAIC0yMzgsOCArMjM4LDggQEAKIAkJCWdvdG8gZXJyX291dDsKIAkJfQogCi0JCXNucHJpbnRmKHByaXYtPnBoeV9idXNfaWQsIEJVU19JRF9TSVpFLCBQSFlfSURfRk1ULCAiMCIsCi0JCQkJZml4ZWRfbGlua1swXSk7CisJCXNucHJpbnRmKHByaXYtPnBoeV9idXNfaWQsIHNpemVvZihwcml2LT5waHlfYnVzX2lkKSwKKwkJCQlQSFlfSURfRk1ULCAiMCIsIGZpeGVkX2xpbmtbMF0pOwogCX0gZWxzZSB7CiAJCXBoeSA9IG9mX2ZpbmRfbm9kZV9ieV9waGFuZGxlKCpwaCk7CiAKQEAgLTI1Niw3ICsyNTYsNyBAQAogCQlvZl9ub2RlX3B1dChtZGlvKTsKIAogCQlnZmFyX21kaW9fYnVzX25hbWUoYnVzX25hbWUsIG1kaW8pOwotCQlzbnByaW50Zihwcml2LT5waHlfYnVzX2lkLCBCVVNfSURfU0laRSwgIiVzOiUwMngiLAorCQlzbnByaW50Zihwcml2LT5waHlfYnVzX2lkLCBzaXplb2YocHJpdi0+cGh5X2J1c19pZCksICIlczolMDJ4IiwKIAkJCQlidXNfbmFtZSwgKmlkKTsKIAl9CiAKQEAgLTE5NzMsNiArMTk3Myw4IEBACiAJCQljYXNlIDEwMDA6CiAJCQkJdGVtcHZhbCA9CiAJCQkJICAgICgodGVtcHZhbCAmIH4oTUFDQ0ZHMl9JRikpIHwgTUFDQ0ZHMl9HTUlJKTsKKworCQkJCWVjbnRybCAmPSB+KEVDTlRSTF9SMTAwKTsKIAkJCQlicmVhazsKIAkJCWNhc2UgMTAwOgogCQkJY2FzZSAxMDoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2hwMTAwLmMgYi9kcml2ZXJzL25ldC9ocDEwMC5jCmluZGV4IGViZTc2NTEuLmFkOGJlN2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2hwMTAwLmMKKysrIGIvZHJpdmVycy9uZXQvaHAxMDAuYwpAQCAtNDI1LDYgKzQyNSwyOCBAQAogfQogI2VuZGlmIC8qICFNT0RVTEUgJiYgQ09ORklHX0lTQSAqLwogCitzdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIGhwMTAwX2JtX25ldGRldl9vcHMgPSB7CisJLm5kb19vcGVuCQk9IGhwMTAwX29wZW4sCisJLm5kb19zdG9wCQk9IGhwMTAwX2Nsb3NlLAorCS5uZG9fc3RhcnRfeG1pdAkJPSBocDEwMF9zdGFydF94bWl0X2JtLAorCS5uZG9fZ2V0X3N0YXRzIAkJPSBocDEwMF9nZXRfc3RhdHMsCisJLm5kb19zZXRfbXVsdGljYXN0X2xpc3QgPSBocDEwMF9zZXRfbXVsdGljYXN0X2xpc3QsCisJLm5kb19jaGFuZ2VfbXR1CQk9IGV0aF9jaGFuZ2VfbXR1LAorCS5uZG9fc2V0X21hY19hZGRyZXNzIAk9IGV0aF9tYWNfYWRkciwKKwkubmRvX3ZhbGlkYXRlX2FkZHIJPSBldGhfdmFsaWRhdGVfYWRkciwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgaHAxMDBfbmV0ZGV2X29wcyA9IHsKKwkubmRvX29wZW4JCT0gaHAxMDBfb3BlbiwKKwkubmRvX3N0b3AJCT0gaHAxMDBfY2xvc2UsCisJLm5kb19zdGFydF94bWl0CQk9IGhwMTAwX3N0YXJ0X3htaXQsCisJLm5kb19nZXRfc3RhdHMgCQk9IGhwMTAwX2dldF9zdGF0cywKKwkubmRvX3NldF9tdWx0aWNhc3RfbGlzdCA9IGhwMTAwX3NldF9tdWx0aWNhc3RfbGlzdCwKKwkubmRvX2NoYW5nZV9tdHUJCT0gZXRoX2NoYW5nZV9tdHUsCisJLm5kb19zZXRfbWFjX2FkZHJlc3MgCT0gZXRoX21hY19hZGRyLAorCS5uZG9fdmFsaWRhdGVfYWRkcgk9IGV0aF92YWxpZGF0ZV9hZGRyLAorfTsKKwogc3RhdGljIGludCBfX2RldmluaXQgaHAxMDBfcHJvYmUxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBpb2FkZHIsCiAJCQkJICB1X2NoYXIgYnVzLCBzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldikKIHsKQEAgLTY1NywxNiArNjc5LDEwIEBACiAJbHAtPnZpcnRfbWVtb3J5X3NpemUgPSB2aXJ0X21lbW9yeV9zaXplOwogCWxwLT5yeF9yYXRpbyA9IGhwMTAwX3J4X3JhdGlvOwkvKiBjYW4gYmUgY29uZidkIHdpdGggaW5zbW9kICovCiAKLQlkZXYtPm9wZW4gPSBocDEwMF9vcGVuOwotCWRldi0+c3RvcCA9IGhwMTAwX2Nsb3NlOwotCiAJaWYgKGxwLT5tb2RlID09IDEpCS8qIGJ1c21hc3RlciAqLwotCQlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9IGhwMTAwX3N0YXJ0X3htaXRfYm07CisJCWRldi0+bmV0ZGV2X29wcyA9ICZocDEwMF9ibV9uZXRkZXZfb3BzOwogCWVsc2UKLQkJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBocDEwMF9zdGFydF94bWl0OwotCi0JZGV2LT5nZXRfc3RhdHMgPSBocDEwMF9nZXRfc3RhdHM7Ci0JZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSAmaHAxMDBfc2V0X211bHRpY2FzdF9saXN0OworCQlkZXYtPm5ldGRldl9vcHMgPSAmaHAxMDBfbmV0ZGV2X29wczsKIAogCS8qIEFzayB0aGUgY2FyZCBmb3Igd2hpY2ggSVJRIGxpbmUgaXQgaXMgY29uZmlndXJlZCAqLwogCWlmIChidXMgPT0gSFAxMDBfQlVTX1BDSSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaWJtdmV0aC5jIGIvZHJpdmVycy9uZXQvaWJtdmV0aC5jCmluZGV4IDliYzBmMTcuLmNhM2JiOWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2libXZldGguYworKysgYi9kcml2ZXJzL25ldC9pYm12ZXRoLmMKQEAgLTc1NCw3ICs3NTQsNyBAQAogCQkJCSAgICB2b2lkICgqZG9uZSkgKHN0cnVjdCBuZXRfZGV2aWNlICosIHUzMikpCiB7CiAJc3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KGRldik7Ci0JdTY0IHNldF9hdHRyLCBjbHJfYXR0ciwgcmV0X2F0dHI7CisJdW5zaWduZWQgbG9uZyBzZXRfYXR0ciwgY2xyX2F0dHIsIHJldF9hdHRyOwogCWxvbmcgcmV0OwogCWludCByYzEgPSAwLCByYzIgPSAwOwogCWludCByZXN0YXJ0ID0gMDsKQEAgLTEyMDksNyArMTIwOSw3IEBACiAJbG9uZyByZXQ7CiAJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKIAlzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyOwotCXU2NCBzZXRfYXR0ciwgcmV0X2F0dHI7CisJdW5zaWduZWQgbG9uZyBzZXRfYXR0ciwgcmV0X2F0dHI7CiAKIAl1bnNpZ25lZCBjaGFyICptYWNfYWRkcl9wOwogCXVuc2lnbmVkIGludCAqbWNhc3RGaWx0ZXJTaXplX3A7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pYm12ZXRoLmggYi9kcml2ZXJzL25ldC9pYm12ZXRoLmgKaW5kZXggZDI4MTg2OS4uZWM3NmFjZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaWJtdmV0aC5oCisrKyBiL2RyaXZlcnMvbmV0L2libXZldGguaApAQCAtMzksMTEgKzM5LDExIEBACiAjZGVmaW5lIElibVZldGhNY2FzdFJlbW92ZUZpbHRlciAgICAgMHgyVUwKICNkZWZpbmUgSWJtVmV0aE1jYXN0Q2xlYXJGaWx0ZXJUYWJsZSAweDNVTAogCi0jZGVmaW5lIElCTVZFVEhfSUxMQU5fUEFEREVEX1BLVF9DU1VNCTB4MDAwMDAwMDAwMDAwMjAwMFVMTAotI2RlZmluZSBJQk1WRVRIX0lMTEFOX1RSVU5LX1BSSV9NQVNLCTB4MDAwMDAwMDAwMDAwMEYwMFVMTAotI2RlZmluZSBJQk1WRVRIX0lMTEFOX0lQVjZfVENQX0NTVU0JCTB4MDAwMDAwMDAwMDAwMDAwNFVMTAotI2RlZmluZSBJQk1WRVRIX0lMTEFOX0lQVjRfVENQX0NTVU0JCTB4MDAwMDAwMDAwMDAwMDAwMlVMTAotI2RlZmluZSBJQk1WRVRIX0lMTEFOX0FDVElWRV9UUlVOSwkJMHgwMDAwMDAwMDAwMDAwMDAxVUxMCisjZGVmaW5lIElCTVZFVEhfSUxMQU5fUEFEREVEX1BLVF9DU1VNCTB4MDAwMDAwMDAwMDAwMjAwMFVMCisjZGVmaW5lIElCTVZFVEhfSUxMQU5fVFJVTktfUFJJX01BU0sJMHgwMDAwMDAwMDAwMDAwRjAwVUwKKyNkZWZpbmUgSUJNVkVUSF9JTExBTl9JUFY2X1RDUF9DU1VNCQkweDAwMDAwMDAwMDAwMDAwMDRVTAorI2RlZmluZSBJQk1WRVRIX0lMTEFOX0lQVjRfVENQX0NTVU0JCTB4MDAwMDAwMDAwMDAwMDAwMlVMCisjZGVmaW5lIElCTVZFVEhfSUxMQU5fQUNUSVZFX1RSVU5LCQkweDAwMDAwMDAwMDAwMDAwMDFVTAogCiAvKiBoY2FsbCBtYWNyb3MgKi8KICNkZWZpbmUgaF9yZWdpc3Rlcl9sb2dpY2FsX2xhbih1YSwgYnVmbHN0LCByeHEsIGZsdGxzdCwgbWFjKSBcCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pZ2IvaWdiX21haW4uYyBiL2RyaXZlcnMvbmV0L2lnYi9pZ2JfbWFpbi5jCmluZGV4IDAyMjc5NGUuLmI4MmIwZmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2lnYi9pZ2JfbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L2lnYi9pZ2JfbWFpbi5jCkBAIC0xNDU3LDggKzE0NTcsOCBAQAogCiAJLyogTnVtYmVyIG9mIHN1cHBvcnRlZCBxdWV1ZXMuICovCiAJLyogSGF2aW5nIG1vcmUgcXVldWVzIHRoYW4gQ1BVcyBkb2Vzbid0IG1ha2Ugc2Vuc2UuICovCi0JYWRhcHRlci0+bnVtX3J4X3F1ZXVlcyA9IG1pbigodTMyKUlHQl9NQVhfUlhfUVVFVUVTLCAodTMyKW51bV9vbmxpbmVfY3B1cygpKTsKLQlhZGFwdGVyLT5udW1fdHhfcXVldWVzID0gbWluKElHQl9NQVhfVFhfUVVFVUVTLCBudW1fb25saW5lX2NwdXMoKSk7CisJYWRhcHRlci0+bnVtX3J4X3F1ZXVlcyA9IG1pbl90KHUzMiwgSUdCX01BWF9SWF9RVUVVRVMsIG51bV9vbmxpbmVfY3B1cygpKTsKKwlhZGFwdGVyLT5udW1fdHhfcXVldWVzID0gbWluX3QodTMyLCBJR0JfTUFYX1RYX1FVRVVFUywgbnVtX29ubGluZV9jcHVzKCkpOwogCiAJLyogVGhpcyBjYWxsIG1heSBkZWNyZWFzZSB0aGUgbnVtYmVyIG9mIHF1ZXVlcyBkZXBlbmRpbmcgb24KIAkgKiBpbnRlcnJ1cHQgbW9kZS4gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lwZy5jIGIvZHJpdmVycy9uZXQvaXBnLmMKaW5kZXggN2I2ZDQzNS4uMzYwYWE1ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaXBnLmMKKysrIGIvZHJpdmVycy9uZXQvaXBnLmMKQEAgLTIyMTAsNiArMjIxMCwxOSBAQAogCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKIH0KIAorc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyBpcGdfbmV0ZGV2X29wcyA9IHsKKwkubmRvX29wZW4JCT0gaXBnX25pY19vcGVuLAorCS5uZG9fc3RvcAkJPSBpcGdfbmljX3N0b3AsCisJLm5kb19zdGFydF94bWl0CQk9IGlwZ19uaWNfaGFyZF9zdGFydF94bWl0LAorCS5uZG9fZ2V0X3N0YXRzCQk9IGlwZ19uaWNfZ2V0X3N0YXRzLAorCS5uZG9fc2V0X211bHRpY2FzdF9saXN0ID0gaXBnX25pY19zZXRfbXVsdGljYXN0X2xpc3QsCisJLm5kb19kb19pb2N0bAkJPSBpcGdfaW9jdGwsCisJLm5kb190eF90aW1lb3V0IAk9IGlwZ190eF90aW1lb3V0LAorCS5uZG9fY2hhbmdlX210dSAJPSBpcGdfbmljX2NoYW5nZV9tdHUsCisJLm5kb19zZXRfbWFjX2FkZHJlc3MJPSBldGhfbWFjX2FkZHIsCisJLm5kb192YWxpZGF0ZV9hZGRyCT0gZXRoX3ZhbGlkYXRlX2FkZHIsCit9OworCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBpcGdfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCiAJCQkgICAgICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQogewpAQCAtMjI1OCwxNSArMjI3MSw3IEBACiAKIAkvKiBEZWNsYXJlIElQRyBOSUMgZnVuY3Rpb25zIGZvciBFdGhlcm5ldCBkZXZpY2UgbWV0aG9kcy4KIAkgKi8KLQlkZXYtPm9wZW4gPSAmaXBnX25pY19vcGVuOwotCWRldi0+c3RvcCA9ICZpcGdfbmljX3N0b3A7Ci0JZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSAmaXBnX25pY19oYXJkX3N0YXJ0X3htaXQ7Ci0JZGV2LT5nZXRfc3RhdHMgPSAmaXBnX25pY19nZXRfc3RhdHM7Ci0JZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSAmaXBnX25pY19zZXRfbXVsdGljYXN0X2xpc3Q7Ci0JZGV2LT5kb19pb2N0bCA9IGlwZ19pb2N0bDsKLQlkZXYtPnR4X3RpbWVvdXQgPSBpcGdfdHhfdGltZW91dDsKLQlkZXYtPmNoYW5nZV9tdHUgPSAmaXBnX25pY19jaGFuZ2VfbXR1OwotCisJZGV2LT5uZXRkZXZfb3BzID0gJmlwZ19uZXRkZXZfb3BzOwogCVNFVF9ORVRERVZfREVWKGRldiwgJnBkZXYtPmRldik7CiAJU0VUX0VUSFRPT0xfT1BTKGRldiwgJmlwZ19ldGh0b29sX29wcyk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lyZGEvYWxpLWlyY2MuYyBiL2RyaXZlcnMvbmV0L2lyZGEvYWxpLWlyY2MuYwppbmRleCAzYzU4ZTY3Li4xNzc3OWY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9pcmRhL2FsaS1pcmNjLmMKKysrIGIvZHJpdmVycy9uZXQvaXJkYS9hbGktaXJjYy5jCkBAIC0xMDksNyArMTA5LDYgQEAKIHN0YXRpYyBpbnQgIGFsaV9pcmNjX25ldF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIHN0YXRpYyBpbnQgIGFsaV9pcmNjX25ldF9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKTsKIHN0YXRpYyB2b2lkIGFsaV9pcmNjX2NoYW5nZV9zcGVlZChzdHJ1Y3QgYWxpX2lyY2NfY2IgKnNlbGYsIF9fdTMyIGJhdWQpOwotc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICphbGlfaXJjY19uZXRfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogCiAvKiBTSVIgZnVuY3Rpb24gKi8KIHN0YXRpYyBpbnQgIGFsaV9pcmNjX3Npcl9oYXJkX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CkBAIC0zNjYsNyArMzY1LDYgQEAKIAlkZXYtPm9wZW4gICAgICAgICAgICA9IGFsaV9pcmNjX25ldF9vcGVuOwogCWRldi0+c3RvcCAgICAgICAgICAgID0gYWxpX2lyY2NfbmV0X2Nsb3NlOwogCWRldi0+ZG9faW9jdGwgICAgICAgID0gYWxpX2lyY2NfbmV0X2lvY3RsOwotCWRldi0+Z2V0X3N0YXRzCSAgICAgPSBhbGlfaXJjY19uZXRfZ2V0X3N0YXRzOwogCiAJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CiAJaWYgKGVycikgewpAQCAtODc2LDcgKzg3NCw3IEBACiAgICAgICAgICAqIGFzeW5jX3Vud3JhcF9jaGFyIHdpbGwgZGVsaXZlciBhbGwgZm91bmQgZnJhbWVzICAKIAkgKi8KIAlkbyB7Ci0JCWFzeW5jX3Vud3JhcF9jaGFyKHNlbGYtPm5ldGRldiwgJnNlbGYtPnN0YXRzLCAmc2VsZi0+cnhfYnVmZiwgCisJCWFzeW5jX3Vud3JhcF9jaGFyKHNlbGYtPm5ldGRldiwgJnNlbGYtPm5ldGRldi0+c3RhdHMsICZzZWxmLT5yeF9idWZmLAogCQkJCSAgaW5iKGlvYmFzZStVQVJUX1JYKSk7CiAKIAkJLyogTWFrZSBzdXJlIHdlIGRvbid0IHN0YXkgaGVyZSB0b28gbG9uZyAqLwpAQCAtOTQzLDcgKzk0MSw3IEBACiAJCQluZXRpZl93YWtlX3F1ZXVlKHNlbGYtPm5ldGRldik7CQogCQl9CiAJCQkKLQkJc2VsZi0+c3RhdHMudHhfcGFja2V0cysrOworCQlzZWxmLT5uZXRkZXYtPnN0YXRzLnR4X3BhY2tldHMrKzsKIAkJCiAJCS8qIFR1cm4gb24gcmVjZWl2ZSBpbnRlcnJ1cHRzICovCiAJCW91dGIoVUFSVF9JRVJfUkRJLCBpb2Jhc2UrVUFSVF9JRVIpOwpAQCAtMTQ2Nyw3ICsxNDY1LDcgQEAKIAlzZWxmLT50eF9maWZvLnF1ZXVlW3NlbGYtPnR4X2ZpZm8uZnJlZV0ubGVuID0gc2tiLT5sZW47CiAJc2VsZi0+dHhfZmlmby50YWlsICs9IHNrYi0+bGVuOwogCi0Jc2VsZi0+c3RhdHMudHhfYnl0ZXMgKz0gc2tiLT5sZW47CisJZGV2LT5zdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKIAogCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGEoc2tiLCBzZWxmLT50eF9maWZvLnF1ZXVlW3NlbGYtPnR4X2ZpZm8uZnJlZV0uc3RhcnQsCiAJCSAgICAgIHNrYi0+bGVuKTsKQEAgLTE2NjEsMTIgKzE2NTksMTIgQEAKIAkKIAl7CiAJCUlSREFfRVJST1IoIiVzKCksICoqKioqKioqKiBMU1JfRlJBTUVfQUJPUlQgKioqKioqKioqXG4iLCBfX2Z1bmNfXyk7Ci0JCXNlbGYtPnN0YXRzLnR4X2Vycm9ycysrOwotCQlzZWxmLT5zdGF0cy50eF9maWZvX2Vycm9ycysrOwkJCisJCXNlbGYtPm5ldGRldi0+c3RhdHMudHhfZXJyb3JzKys7CisJCXNlbGYtPm5ldGRldi0+c3RhdHMudHhfZmlmb19lcnJvcnMrKzsKIAl9CiAJZWxzZSAKIAl7Ci0JCXNlbGYtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwkJc2VsZi0+bmV0ZGV2LT5zdGF0cy50eF9wYWNrZXRzKys7CiAJfQogCiAJLyogQ2hlY2sgaWYgd2UgbmVlZCB0byBjaGFuZ2UgdGhlIHNwZWVkICovCkBAIC0xODMxLDM1ICsxODI5LDM1IEBACiAJCQlJUkRBX0RFQlVHKDAsIiVzKCksICoqKioqKioqKioqKiogUlggRXJyb3JzICoqKioqKioqKioqKiBcbiIsIF9fZnVuY19fICk7CiAJCQkKIAkJCS8qIFNraXAgZnJhbWUgKi8KLQkJCXNlbGYtPnN0YXRzLnJ4X2Vycm9ycysrOworCQkJc2VsZi0+bmV0ZGV2LT5zdGF0cy5yeF9lcnJvcnMrKzsKIAkJCQogCQkJc2VsZi0+cnhfYnVmZi5kYXRhICs9IGxlbjsKIAkJCQogCQkJaWYgKHN0YXR1cyAmIExTUl9GSUZPX1VSKSAKIAkJCXsKLQkJCQlzZWxmLT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKKwkJCQlzZWxmLT5uZXRkZXYtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycysrOwogCQkJCUlSREFfREVCVUcoMCwiJXMoKSwgKioqKioqKioqKioqKiBGSUZPIEVycm9ycyAqKioqKioqKioqKiogXG4iLCBfX2Z1bmNfXyApOwogCQkJfQkKIAkJCWlmIChzdGF0dXMgJiBMU1JfRlJBTUVfRVJST1IpCiAJCQl7Ci0JCQkJc2VsZi0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CisJCQkJc2VsZi0+bmV0ZGV2LT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKIAkJCQlJUkRBX0RFQlVHKDAsIiVzKCksICoqKioqKioqKioqKiogRlJBTUUgRXJyb3JzICoqKioqKioqKioqKiBcbiIsIF9fZnVuY19fICk7CiAJCQl9CiAJCQkJCQkJCiAJCQlpZiAoc3RhdHVzICYgTFNSX0NSQ19FUlJPUikgCiAJCQl7Ci0JCQkJc2VsZi0+c3RhdHMucnhfY3JjX2Vycm9ycysrOworCQkJCXNlbGYtPm5ldGRldi0+c3RhdHMucnhfY3JjX2Vycm9ycysrOwogCQkJCUlSREFfREVCVUcoMCwiJXMoKSwgKioqKioqKioqKioqKiBDUkMgRXJyb3JzICoqKioqKioqKioqKiBcbiIsIF9fZnVuY19fICk7CiAJCQl9CiAJCQkKIAkJCWlmKHNlbGYtPnJjdkZyYW1lc092ZXJmbG93KQogCQkJewotCQkJCXNlbGYtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycysrOworCQkJCXNlbGYtPm5ldGRldi0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CiAJCQkJSVJEQV9ERUJVRygwLCIlcygpLCAqKioqKioqKioqKioqIE92ZXJyYW4gRE1BIGJ1ZmZlciAqKioqKioqKioqKiogXG4iLCBfX2Z1bmNfXyApOwogCQkJfQogCQkJaWYobGVuID09IDApCiAJCQl7Ci0JCQkJc2VsZi0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CisJCQkJc2VsZi0+bmV0ZGV2LT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKIAkJCQlJUkRBX0RFQlVHKDAsIiVzKCksICoqKioqKioqKiogUmVjZWl2ZSBGcmFtZSBTaXplID0gMCAqKioqKioqKiogXG4iLCBfX2Z1bmNfXyApOwogCQkJfQogCQl9CSAKQEAgLTE5MTAsNyArMTkwOCw3IEBACiAJCQkJSVJEQV9XQVJOSU5HKCIlcygpLCBtZW1vcnkgc3F1ZWV6ZSwgIgogCQkJCQkgICAgICJkcm9wcGluZyBmcmFtZS5cbiIsCiAJCQkJCSAgICAgX19mdW5jX18pOwotCQkJCXNlbGYtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJCQlzZWxmLT5uZXRkZXYtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKIAogCQkJCXJldHVybiBGQUxTRTsKIAkJCX0KQEAgLTE5MjQsOCArMTkyMiw4IEBACiAKIAkJCS8qIE1vdmUgdG8gbmV4dCBmcmFtZSAqLwogCQkJc2VsZi0+cnhfYnVmZi5kYXRhICs9IGxlbjsKLQkJCXNlbGYtPnN0YXRzLnJ4X2J5dGVzICs9IGxlbjsKLQkJCXNlbGYtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwkJCXNlbGYtPm5ldGRldi0+c3RhdHMucnhfYnl0ZXMgKz0gbGVuOworCQkJc2VsZi0+bmV0ZGV2LT5zdGF0cy5yeF9wYWNrZXRzKys7CiAKIAkJCXNrYi0+ZGV2ID0gc2VsZi0+bmV0ZGV2OwogCQkJc2tiX3Jlc2V0X21hY19oZWFkZXIoc2tiKTsKQEAgLTE5OTQsNyArMTk5Miw3IEBACiAJc2VsZi0+dHhfYnVmZi5sZW4gPSBhc3luY193cmFwX3NrYihza2IsIHNlbGYtPnR4X2J1ZmYuZGF0YSwgCiAJCQkJCSAgIHNlbGYtPnR4X2J1ZmYudHJ1ZXNpemUpOwogCQotCXNlbGYtPnN0YXRzLnR4X2J5dGVzICs9IHNlbGYtPnR4X2J1ZmYubGVuOworCXNlbGYtPm5ldGRldi0+c3RhdHMudHhfYnl0ZXMgKz0gc2VsZi0+dHhfYnVmZi5sZW47CiAKIAkvKiBUdXJuIG9uIHRyYW5zbWl0IGZpbmlzaGVkIGludGVycnVwdC4gV2lsbCBmaXJlIGltbWVkaWF0ZWx5ISAgKi8KIAlvdXRiKFVBUlRfSUVSX1RIUkksIGlvYmFzZStVQVJUX0lFUik7IApAQCAtMjExMSwxNyArMjEwOSw2IEBACiAJcmV0dXJuIHN0YXR1czsKIH0KIAotc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICphbGlfaXJjY19uZXRfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IGFsaV9pcmNjX2NiICpzZWxmID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQkKLQlJUkRBX0RFQlVHKDIsICIlcygpLCAtLS0tLS0tLS0tLS0tLS0tIFN0YXJ0IC0tLS0tLS0tLS0tLS0tLS1cbiIsIF9fZnVuY19fICk7Ci0JCQotCUlSREFfREVCVUcoMiwgIiVzKCksIC0tLS0tLS0tLS0tLS0tLS0tIEVuZCAtLS0tLS0tLS0tLS0tLS0tLS1cbiIsIF9fZnVuY19fICk7Ci0JCi0JcmV0dXJuICZzZWxmLT5zdGF0czsKLX0KLQogc3RhdGljIGludCBhbGlfaXJjY19zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQogewogCXN0cnVjdCBhbGlfaXJjY19jYiAqc2VsZiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKGRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pcmRhL2FsaS1pcmNjLmggYi9kcml2ZXJzL25ldC9pcmRhL2FsaS1pcmNjLmgKaW5kZXggZWQzNWQ5OS4uMGM4ZWRiNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaXJkYS9hbGktaXJjYy5oCisrKyBiL2RyaXZlcnMvbmV0L2lyZGEvYWxpLWlyY2MuaApAQCAtMTkxLDcgKzE5MSw2IEBACiAJc3RydWN0IHR4X2ZpZm8gdHhfZmlmbzsgICAgLyogSW5mbyBhYm91dCBmcmFtZXMgdG8gYmUgdHJhbnNtaXR0ZWQgKi8KIAogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7ICAgICAvKiBZZXMhIHdlIGFyZSBzb21lIGtpbmQgb2YgbmV0ZGV2aWNlICovCi0Jc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CiAJCiAJc3RydWN0IGlybGFwX2NiICppcmxhcDsgICAgLyogVGhlIGxpbmsgbGF5ZXIgd2UgYXJlIGJpbmRlZCB0byAqLwogCXN0cnVjdCBxb3NfaW5mbyBxb3M7ICAgICAgIC8qIFFvUyBjYXBhYmlsaXRpZXMgZm9yIHRoaXMgZGV2aWNlICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pcmRhL2F1MTAwMF9pcmNjLmggYi9kcml2ZXJzL25ldC9pcmRhL2F1MTAwMF9pcmNjLmgKaW5kZXggYjQ3NjNmMi4uYzA3MmMwOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaXJkYS9hdTEwMDBfaXJjYy5oCisrKyBiL2RyaXZlcnMvbmV0L2lyZGEvYXUxMDAwX2lyY2MuaApAQCAtMTA3LDcgKzEwNyw2IEBACiAJaW9idWZmX3QgcnhfYnVmZjsKIAogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7Ci0Jc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CiAJCiAJc3RydWN0IHRpbWV2YWwgc3RhbXA7CiAJc3RydWN0IHRpbWV2YWwgbm93OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXJkYS9hdTFrX2lyLmMgYi9kcml2ZXJzL25ldC9pcmRhL2F1MWtfaXIuYwppbmRleCA2YzRiNTNmLi43NWExZDBhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9pcmRhL2F1MWtfaXIuYworKysgYi9kcml2ZXJzL25ldC9pcmRhL2F1MWtfaXIuYwpAQCAtNTMsNyArNTMsNiBAQAogc3RhdGljIGludCBhdTFrX2lyZGFfcngoc3RydWN0IG5ldF9kZXZpY2UgKik7CiBzdGF0aWMgdm9pZCBhdTFrX2lyZGFfaW50ZXJydXB0KGludCwgdm9pZCAqKTsKIHN0YXRpYyB2b2lkIGF1MWtfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqKTsKLXN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqYXUxa19pcmRhX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICopOwogc3RhdGljIGludCBhdTFrX2lyZGFfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKiwgc3RydWN0IGlmcmVxICosIGludCk7CiBzdGF0aWMgaW50IGF1MWtfaXJkYV9zZXRfc3BlZWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHNwZWVkKTsKIApAQCAtMjEzLDcgKzIxMiw2IEBACiAJZGV2LT5vcGVuID0gYXUxa19pcmRhX3N0YXJ0OwogCWRldi0+aGFyZF9zdGFydF94bWl0ID0gYXUxa19pcmRhX2hhcmRfeG1pdDsKIAlkZXYtPnN0b3AgPSBhdTFrX2lyZGFfc3RvcDsKLQlkZXYtPmdldF9zdGF0cyA9IGF1MWtfaXJkYV9zdGF0czsKIAlkZXYtPmRvX2lvY3RsID0gYXUxa19pcmRhX2lvY3RsOwogCWRldi0+dHhfdGltZW91dCA9IGF1MWtfdHhfdGltZW91dDsKIApAQCAtODMyLDEzICs4MzAsNiBAQAogCXJldHVybiByZXQ7CiB9CiAKLQotc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICphdTFrX2lyZGFfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgYXUxa19wcml2YXRlICphdXAgPSBuZXRkZXZfcHJpdihkZXYpOwotCXJldHVybiAmYXVwLT5zdGF0czsKLX0KLQogTU9EVUxFX0FVVEhPUigiUGV0ZSBQb3BvdiA8cHBvcG92QG12aXN0YS5jb20+Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIkF1MTAwMCBJckRBIERldmljZSBEcml2ZXIiKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXJkYS9kb25hdWJvZS5oIGIvZHJpdmVycy9uZXQvaXJkYS9kb25hdWJvZS5oCmluZGV4IDFlNjc3MjAuLjBkYmQxOTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2lyZGEvZG9uYXVib2UuaAorKysgYi9kcml2ZXJzL25ldC9pcmRhL2RvbmF1Ym9lLmgKQEAgLTMwOCw3ICszMDgsNiBAQAogc3RydWN0IHRvc2hvYm9lX2NiCiB7CiAgIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7ICAgIC8qIFllcyEgd2UgYXJlIHNvbWUga2luZCBvZiBuZXRkZXZpY2UgKi8KLSAgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CiAgIHN0cnVjdCB0dHlfZHJpdmVyIHR0eWRldjsKIAogICBzdHJ1Y3QgaXJsYXBfY2IgKmlybGFwOyAgICAgICAvKiBUaGUgbGluayBsYXllciB3ZSBhcmUgYmluZGVkIHRvICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pcmRhL2lyZGEtdXNiLmMgYi9kcml2ZXJzL25ldC9pcmRhL2lyZGEtdXNiLmMKaW5kZXggMjA1ZTRlOC4uMjkxMThmNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaXJkYS9pcmRhLXVzYi5jCisrKyBiL2RyaXZlcnMvbmV0L2lyZGEvaXJkYS11c2IuYwpAQCAtMTIyLDcgKzEyMiw2IEBACiBzdGF0aWMgaW50IGlyZGFfdXNiX25ldF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIHN0YXRpYyBpbnQgaXJkYV91c2JfbmV0X2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqcnEsIGludCBjbWQpOwogc3RhdGljIHZvaWQgaXJkYV91c2JfbmV0X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Ci1zdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmlyZGFfdXNiX25ldF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKiogVFJBTlNNSVQgUk9VVElORVMgKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoKQEAgLTUyNSwxMyArNTI0LDEzIEBACiAJLyogQXNrIFVTQiB0byBzZW5kIHRoZSBwYWNrZXQgLSBJcnEgZGlzYWJsZWQgLT4gR0ZQX0FUT01JQyAqLwogCWlmICgocmVzID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfQVRPTUlDKSkpIHsKIAkJSVJEQV9XQVJOSU5HKCIlcygpLCBmYWlsZWQgVHggVVJCXG4iLCBfX2Z1bmNfXyk7Ci0JCXNlbGYtPnN0YXRzLnR4X2Vycm9ycysrOworCQluZXRkZXYtPnN0YXRzLnR4X2Vycm9ycysrOwogCQkvKiBMZXQgVVNCIHJlY292ZXIgOiBXZSB3aWxsIGNhdGNoIHRoYXQgaW4gdGhlIHdhdGNoZG9nICovCiAJCS8qbmV0aWZfc3RhcnRfcXVldWUobmV0ZGV2KTsqLwogCX0gZWxzZSB7CiAJCS8qIEluY3JlbWVudCBwYWNrZXQgc3RhdHMgKi8KLQkJc2VsZi0+c3RhdHMudHhfcGFja2V0cysrOwotICAgICAgICAgICAgICAgIHNlbGYtPnN0YXRzLnR4X2J5dGVzICs9IHNrYi0+bGVuOworCQluZXRkZXYtPnN0YXRzLnR4X3BhY2tldHMrKzsKKyAgICAgICAgICAgICAgICBuZXRkZXYtPnN0YXRzLnR4X2J5dGVzICs9IHNrYi0+bGVuOwogCQkKIAkJbmV0ZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CiAJfQpAQCAtNjc3LDcgKzY3Niw3IEBACiAJCUlSREFfREVCVUcoMCwgIiVzOiBUeCB0aW1lZCBvdXQsIHVyYi0+c3RhdHVzPSVkLCB1cmItPnRyYW5zZmVyX2ZsYWdzPTB4JTA0WFxuIiwgbmV0ZGV2LT5uYW1lLCB1cmItPnN0YXR1cywgdXJiLT50cmFuc2Zlcl9mbGFncyk7CiAKIAkJLyogSW5jcmVhc2UgZXJyb3IgY291bnQgKi8KLQkJc2VsZi0+c3RhdHMudHhfZXJyb3JzKys7CisJCW5ldGRldi0+c3RhdHMudHhfZXJyb3JzKys7CiAKICNpZmRlZiBJVV9CVUdfS0lDS19USU1FT1VUCiAJCS8qIENhbid0IGJlIGEgYmFkIGlkZWEgdG8gcmVzZXQgdGhlIHNwZWVkIDstKSAtIEplYW4gSUkgKi8KQEAgLTgyNiw3ICs4MjUsNyBAQAogCWlmICh1cmItPnN0YXR1cyAhPSAwKSB7CiAJCXN3aXRjaCAodXJiLT5zdGF0dXMpIHsKIAkJY2FzZSAtRUlMU0VROgotCQkJc2VsZi0+c3RhdHMucnhfY3JjX2Vycm9ycysrOwkKKwkJCXNlbGYtPm5ldGRldi0+c3RhdHMucnhfY3JjX2Vycm9ycysrOwogCQkJLyogQWxzbyBwcmVjdXJzb3IgdG8gYSBob3QtdW5wbHVnIG9uIFVIQ0kuICovCiAJCQkvKiBGYWxsdGhyb3VnaC4uLiAqLwogCQljYXNlIC1FQ09OTlJFU0VUOgpAQCAtODM5LDcgKzgzOCw3IEBACiAJCWNhc2UgLUVUSU1FOgogCQkJLyogVXN1YWxseSBwcmVjdXJzb3IgdG8gYSBob3QtdW5wbHVnIG9uIE9IQ0kuICovCiAJCWRlZmF1bHQ6Ci0JCQlzZWxmLT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJCXNlbGYtPm5ldGRldi0+c3RhdHMucnhfZXJyb3JzKys7CiAJCQlJUkRBX0RFQlVHKDAsICIlcygpLCBSWCBzdGF0dXMgJWQsIHRyYW5zZmVyX2ZsYWdzIDB4JTA0WCBcbiIsIF9fZnVuY19fLCB1cmItPnN0YXR1cywgdXJiLT50cmFuc2Zlcl9mbGFncyk7CiAJCQlicmVhazsKIAkJfQpAQCAtODkwLDcgKzg4OSw3IEBACiAJCQkJICAgICAgIElSREFfU0tCX01BWF9NVFUpOwogCiAJaWYgKCFuZXdza2IpICB7Ci0JCXNlbGYtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJc2VsZi0+bmV0ZGV2LT5zdGF0cy5yeF9kcm9wcGVkKys7CiAJCS8qIFdlIGNvdWxkIGRlbGl2ZXIgdGhlIGN1cnJlbnQgc2tiLCBidXQgdGhpcyB3b3VsZCBzdGFsbAogCQkgKiB0aGUgUnggcGF0aC4gQmV0dGVyIGRyb3AgdGhlIHBhY2tldC4uLiBKZWFuIElJICovCiAJCWdvdG8gZG9uZTsgIApAQCAtOTI3LDggKzkyNiw4IEBACiAJbmV0aWZfcngoZGF0YXNrYik7CiAKIAkvKiBLZWVwIHN0YXRzIHVwIHRvIGRhdGUgKi8KLQlzZWxmLT5zdGF0cy5yeF9ieXRlcyArPSBsZW47Ci0Jc2VsZi0+c3RhdHMucnhfcGFja2V0cysrOworCXNlbGYtPm5ldGRldi0+c3RhdHMucnhfYnl0ZXMgKz0gbGVuOworCXNlbGYtPm5ldGRldi0+c3RhdHMucnhfcGFja2V0cysrOwogCiBkb25lOgogCS8qIE5vdGUgOiBhdCB0aGlzIHBvaW50LCB0aGUgVVJCIHdlJ3ZlIGp1c3QgcmVjZWl2ZWQgKHVyYikKQEAgLTEzNDIsMTQgKzEzNDEsNiBAQAogfQogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKgotICogR2V0IGRldmljZSBzdGF0cyAoZm9yIC9wcm9jL25ldC9kZXYgYW5kIGlmY29uZmlnKQotICovCi1zdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmlyZGFfdXNiX25ldF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgaXJkYV91c2JfY2IgKnNlbGYgPSBuZXRkZXZfcHJpdihkZXYpOwotCXJldHVybiAmc2VsZi0+c3RhdHM7Ci19CiAKIC8qKioqKioqKioqKioqKioqKioqKiogSVJEQSBDT05GSUcgU1VCUk9VVElORVMgKioqKioqKioqKioqKioqKioqKioqLwogLyoKQEAgLTE0MjgsNyArMTQxOSw2IEBACiAJbmV0ZGV2LT53YXRjaGRvZ190aW1lbyAgPSAyNTAqSFovMTAwMDsJLyogMjUwIG1zID4gVVNCIHRpbWVvdXQgKi8KIAluZXRkZXYtPm9wZW4gICAgICAgICAgICA9IGlyZGFfdXNiX25ldF9vcGVuOwogCW5ldGRldi0+c3RvcCAgICAgICAgICAgID0gaXJkYV91c2JfbmV0X2Nsb3NlOwotCW5ldGRldi0+Z2V0X3N0YXRzCT0gaXJkYV91c2JfbmV0X2dldF9zdGF0czsKIAluZXRkZXYtPmRvX2lvY3RsICAgICAgICA9IGlyZGFfdXNiX25ldF9pb2N0bDsKIAogCXJldHVybiByZWdpc3Rlcl9uZXRkZXYobmV0ZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lyZGEvaXJkYS11c2IuaCBiL2RyaXZlcnMvbmV0L2lyZGEvaXJkYS11c2IuaAppbmRleCBhMGNhOWMxLi5hYzA0NDNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9pcmRhL2lyZGEtdXNiLmgKKysrIGIvZHJpdmVycy9uZXQvaXJkYS9pcmRhLXVzYi5oCkBAIC0xNTIsNyArMTUyLDYgQEAKIAlzdHJ1Y3QgdXJiICpzcGVlZF91cmI7CQkvKiBVUkIgdXNlZCB0byBzZW5kIHNwZWVkIGNvbW1hbmRzICovCiAJCiAJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsJLyogWWVzISB3ZSBhcmUgc29tZSBraW5kIG9mIG5ldGRldi4gKi8KLQlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKIAlzdHJ1Y3QgaXJsYXBfY2IgICAqaXJsYXA7CS8qIFRoZSBsaW5rIGxheWVyIHdlIGFyZSBiaW5kZWQgdG8gKi8KIAlzdHJ1Y3QgcW9zX2luZm8gcW9zOwogCWNoYXIgKnNwZWVkX2J1ZmY7CQkvKiBCdWZmZXIgZm9yIHNwZWVkIGNoYW5nZXMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lyZGEva2luZ3N1bi1zaXIuYyBiL2RyaXZlcnMvbmV0L2lyZGEva2luZ3N1bi1zaXIuYwppbmRleCBjNzQ3Yzg3Li5iNGE2MTcxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9pcmRhL2tpbmdzdW4tc2lyLmMKKysrIGIvZHJpdmVycy9uZXQvaXJkYS9raW5nc3VuLXNpci5jCkBAIC0xMDUsNyArMTA1LDcgQEAKIAlzdHJ1Y3QgdXNiX2RldmljZSAqdXNiZGV2OyAgICAgIC8qIGluaXQ6IHByb2JlX2lyZGEgKi8KIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2OyAgICAgIC8qIG5ldHdvcmsgbGF5ZXIgKi8KIAlzdHJ1Y3QgaXJsYXBfY2IgICAqaXJsYXA7ICAgICAgIC8qIFRoZSBsaW5rIGxheWVyIHdlIGFyZSBiaW5kZWQgdG8gKi8KLQlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsJLyogbmV0d29yayBzdGF0aXN0aWNzICovCisKIAlzdHJ1Y3QgcW9zX2luZm8gICBxb3M7CiAKIAlfX3U4CQkgICppbl9idWY7CS8qIHJlY2VpdmUgYnVmZmVyICovCkBAIC0xODYsMTIgKzE4NiwxMiBAQAogCQljYXNlIC1FUElQRToKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgotCQkJa2luZ3N1bi0+c3RhdHMudHhfZXJyb3JzKys7CisJCQluZXRkZXYtPnN0YXRzLnR4X2Vycm9ycysrOwogCQkJbmV0aWZfc3RhcnRfcXVldWUobmV0ZGV2KTsKIAkJfQogCX0gZWxzZSB7Ci0JCWtpbmdzdW4tPnN0YXRzLnR4X3BhY2tldHMrKzsKLQkJa2luZ3N1bi0+c3RhdHMudHhfYnl0ZXMgKz0gc2tiLT5sZW47CisJCW5ldGRldi0+c3RhdHMudHhfcGFja2V0cysrOworCQluZXRkZXYtPnN0YXRzLnR4X2J5dGVzICs9IHNrYi0+bGVuOwogCX0KIAogCWRldl9rZnJlZV9za2Ioc2tiKTsKQEAgLTIzMiw3ICsyMzIsNyBAQAogCQlpZiAoYnl0ZXNbMF0gPj0gMSAmJiBieXRlc1swXSA8IGtpbmdzdW4tPm1heF9yeCkgewogCQkJZm9yIChpID0gMTsgaSA8PSBieXRlc1swXTsgaSsrKSB7CiAJCQkJYXN5bmNfdW53cmFwX2NoYXIoa2luZ3N1bi0+bmV0ZGV2LAotCQkJCQkJICAma2luZ3N1bi0+c3RhdHMsCisJCQkJCQkgICZraW5nc3VuLT5uZXRkZXYtPnN0YXRzLAogCQkJCQkJICAma2luZ3N1bi0+cnhfYnVmZiwgYnl0ZXNbaV0pOwogCQkJfQogCQkJZG9fZ2V0dGltZW9mZGF5KCZraW5nc3VuLT5yeF90aW1lKTsKQEAgLTQxOCwxNSArNDE4LDYgQEAKIAlyZXR1cm4gcmV0OwogfQogCi0vKgotICogR2V0IGRldmljZSBzdGF0cyAoZm9yIC9wcm9jL25ldC9kZXYgYW5kIGlmY29uZmlnKQotICovCi1zdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKgota2luZ3N1bl9uZXRfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCi17Ci0Jc3RydWN0IGtpbmdzdW5fY2IgKmtpbmdzdW4gPSBuZXRkZXZfcHJpdihuZXRkZXYpOwotCXJldHVybiAma2luZ3N1bi0+c3RhdHM7Ci19CiAKIC8qCiAgKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGJ5IHRoZSBVU0Igc3Vic3lzdGVtIGZvciBlYWNoIG5ldyBkZXZpY2UKQEAgLTUzMiw3ICs1MjMsNiBAQAogCW5ldC0+aGFyZF9zdGFydF94bWl0ID0ga2luZ3N1bl9oYXJkX3htaXQ7CiAJbmV0LT5vcGVuICAgICAgICAgICAgPSBraW5nc3VuX25ldF9vcGVuOwogCW5ldC0+c3RvcCAgICAgICAgICAgID0ga2luZ3N1bl9uZXRfY2xvc2U7Ci0JbmV0LT5nZXRfc3RhdHMJICAgICA9IGtpbmdzdW5fbmV0X2dldF9zdGF0czsKIAluZXQtPmRvX2lvY3RsICAgICAgICA9IGtpbmdzdW5fbmV0X2lvY3RsOwogCiAJcmV0ID0gcmVnaXN0ZXJfbmV0ZGV2KG5ldCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pcmRhL2tzOTU5LXNpci5jIGIvZHJpdmVycy9uZXQvaXJkYS9rczk1OS1zaXIuYwppbmRleCA2MDBkOTZmLi41NTMyMmZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9pcmRhL2tzOTU5LXNpci5jCisrKyBiL2RyaXZlcnMvbmV0L2lyZGEva3M5NTktc2lyLmMKQEAgLTE3NCw3ICsxNzQsNyBAQAogCXN0cnVjdCB1c2JfZGV2aWNlICp1c2JkZXY7CS8qIGluaXQ6IHByb2JlX2lyZGEgKi8KIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2OwkvKiBuZXR3b3JrIGxheWVyICovCiAJc3RydWN0IGlybGFwX2NiICppcmxhcDsJLyogVGhlIGxpbmsgbGF5ZXIgd2UgYXJlIGJpbmRlZCB0byAqLwotCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOwkvKiBuZXR3b3JrIHN0YXRpc3RpY3MgKi8KKwogCXN0cnVjdCBxb3NfaW5mbyBxb3M7CiAKIAlzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0ICp0eF9zZXR1cHJlcXVlc3Q7CkBAIC0zNjYsNyArMzY2LDcgQEAKIAkJCQljYXNlIC1FUElQRToKIAkJCQkJYnJlYWs7CiAJCQkJZGVmYXVsdDoKLQkJCQkJa2luZ3N1bi0+c3RhdHMudHhfZXJyb3JzKys7CisJCQkJCW5ldGRldi0+c3RhdHMudHhfZXJyb3JzKys7CiAJCQkJCW5ldGlmX3N0YXJ0X3F1ZXVlKG5ldGRldik7CiAJCQkJfQogCQkJfQpAQCAtNDE2LDEyICs0MTYsMTIgQEAKIAkJY2FzZSAtRVBJUEU6CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKLQkJCWtpbmdzdW4tPnN0YXRzLnR4X2Vycm9ycysrOworCQkJbmV0ZGV2LT5zdGF0cy50eF9lcnJvcnMrKzsKIAkJCW5ldGlmX3N0YXJ0X3F1ZXVlKG5ldGRldik7CiAJCX0KIAl9IGVsc2UgewotCQlraW5nc3VuLT5zdGF0cy50eF9wYWNrZXRzKys7Ci0JCWtpbmdzdW4tPnN0YXRzLnR4X2J5dGVzICs9IHNrYi0+bGVuOworCQluZXRkZXYtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwkJbmV0ZGV2LT5zdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKIAogCX0KIApAQCAtNDY5LDcgKzQ2OSw3IEBACiAJCQkgKi8KIAkJCWlmIChraW5nc3VuLT5yeF92YXJpYWJsZV94b3JtYXNrICE9IDApIHsKIAkJCQlhc3luY191bndyYXBfY2hhcihraW5nc3VuLT5uZXRkZXYsCi0JCQkJCQkgICZraW5nc3VuLT5zdGF0cywKKwkJCQkJCSAgJmtpbmdzdW4tPm5ldGRldi0+c3RhdHMsCiAJCQkJCQkgICZraW5nc3VuLT5yeF91bndyYXBfYnVmZiwKIAkJCQkJCSAgYnl0ZXNbaV0pOwogCQkJfQpAQCAtNjY5LDE1ICs2NjksNiBAQAogfQogCiAvKgotICogR2V0IGRldmljZSBzdGF0cyAoZm9yIC9wcm9jL25ldC9kZXYgYW5kIGlmY29uZmlnKQotICovCi1zdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmtzOTU5X25ldF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKLXsKLQlzdHJ1Y3Qga3M5NTlfY2IgKmtpbmdzdW4gPSBuZXRkZXZfcHJpdihuZXRkZXYpOwotCXJldHVybiAma2luZ3N1bi0+c3RhdHM7Ci19Ci0KLS8qCiAgKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGJ5IHRoZSBVU0Igc3Vic3lzdGVtIGZvciBlYWNoIG5ldyBkZXZpY2UKICAqIGluIHRoZSBzeXN0ZW0uIFdlIG5lZWQgdG8gY2hlY2sgaWYgdGhlIGRldmljZSBpcyBvdXJzLCBhbmQgaW4KICAqIHRoaXMgY2FzZSBzdGFydCBoYW5kbGluZyBpdC4KQEAgLTc5Miw3ICs3ODMsNiBAQAogCW5ldC0+aGFyZF9zdGFydF94bWl0ID0ga3M5NTlfaGFyZF94bWl0OwogCW5ldC0+b3BlbiA9IGtzOTU5X25ldF9vcGVuOwogCW5ldC0+c3RvcCA9IGtzOTU5X25ldF9jbG9zZTsKLQluZXQtPmdldF9zdGF0cyA9IGtzOTU5X25ldF9nZXRfc3RhdHM7CiAJbmV0LT5kb19pb2N0bCA9IGtzOTU5X25ldF9pb2N0bDsKIAogCXJldCA9IHJlZ2lzdGVyX25ldGRldihuZXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXJkYS9rc2RhenpsZS1zaXIuYyBiL2RyaXZlcnMvbmV0L2lyZGEva3NkYXp6bGUtc2lyLmMKaW5kZXggMGU3Zjg5My4uNWIzMjdiMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaXJkYS9rc2RhenpsZS1zaXIuYworKysgYi9kcml2ZXJzL25ldC9pcmRhL2tzZGF6emxlLXNpci5jCkBAIC0xNDAsNyArMTQwLDcgQEAKIAlzdHJ1Y3QgdXNiX2RldmljZSAqdXNiZGV2OwkvKiBpbml0OiBwcm9iZV9pcmRhICovCiAJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsJLyogbmV0d29yayBsYXllciAqLwogCXN0cnVjdCBpcmxhcF9jYiAqaXJsYXA7CS8qIFRoZSBsaW5rIGxheWVyIHdlIGFyZSBiaW5kZWQgdG8gKi8KLQlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsJLyogbmV0d29yayBzdGF0aXN0aWNzICovCisKIAlzdHJ1Y3QgcW9zX2luZm8gcW9zOwogCiAJc3RydWN0IHVyYiAqdHhfdXJiOwpAQCAtMjc4LDcgKzI3OCw3IEBACiAJCQkJY2FzZSAtRVBJUEU6CiAJCQkJCWJyZWFrOwogCQkJCWRlZmF1bHQ6Ci0JCQkJCWtpbmdzdW4tPnN0YXRzLnR4X2Vycm9ycysrOworCQkJCQluZXRkZXYtPnN0YXRzLnR4X2Vycm9ycysrOwogCQkJCQluZXRpZl9zdGFydF9xdWV1ZShuZXRkZXYpOwogCQkJCX0KIAkJCX0KQEAgLTMyOSwxMiArMzI5LDEyIEBACiAJCWNhc2UgLUVQSVBFOgogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6Ci0JCQlraW5nc3VuLT5zdGF0cy50eF9lcnJvcnMrKzsKKwkJCW5ldGRldi0+c3RhdHMudHhfZXJyb3JzKys7CiAJCQluZXRpZl9zdGFydF9xdWV1ZShuZXRkZXYpOwogCQl9CiAJfSBlbHNlIHsKLQkJa2luZ3N1bi0+c3RhdHMudHhfcGFja2V0cysrOwotCQlraW5nc3VuLT5zdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKKwkJbmV0ZGV2LT5zdGF0cy50eF9wYWNrZXRzKys7CisJCW5ldGRldi0+c3RhdHMudHhfYnl0ZXMgKz0gc2tiLT5sZW47CiAKIAl9CiAKQEAgLTM0OCw5ICszNDgsMTAgQEAKIHN0YXRpYyB2b2lkIGtzZGF6emxlX3Jjdl9pcnEoc3RydWN0IHVyYiAqdXJiKQogewogCXN0cnVjdCBrc2RhenpsZV9jYiAqa2luZ3N1biA9IHVyYi0+Y29udGV4dDsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0ga2luZ3N1bi0+bmV0ZGV2OwogCiAJLyogaW4gcHJvY2VzcyBvZiBzdG9wcGluZywganVzdCBkcm9wIGRhdGEgKi8KLQlpZiAoIW5ldGlmX3J1bm5pbmcoa2luZ3N1bi0+bmV0ZGV2KSkgeworCWlmICghbmV0aWZfcnVubmluZyhuZXRkZXYpKSB7CiAJCWtpbmdzdW4tPnJlY2VpdmluZyA9IDA7CiAJCXJldHVybjsKIAl9CkBAIC0zNjgsNyArMzY5LDcgQEAKIAkJdW5zaWduZWQgaW50IGk7CiAKIAkJZm9yIChpID0gMDsgaSA8IHVyYi0+YWN0dWFsX2xlbmd0aDsgaSsrKSB7Ci0JCQlhc3luY191bndyYXBfY2hhcihraW5nc3VuLT5uZXRkZXYsICZraW5nc3VuLT5zdGF0cywKKwkJCWFzeW5jX3Vud3JhcF9jaGFyKG5ldGRldiwgJm5ldGRldi0+c3RhdHMsCiAJCQkJCSAgJmtpbmdzdW4tPnJ4X3Vud3JhcF9idWZmLCBieXRlc1tpXSk7CiAJCX0KIAkJa2luZ3N1bi0+cmVjZWl2aW5nID0KQEAgLTU2MiwxNiArNTYzLDYgQEAKIH0KIAogLyoKLSAqIEdldCBkZXZpY2Ugc3RhdHMgKGZvciAvcHJvYy9uZXQvZGV2IGFuZCBpZmNvbmZpZykKLSAqLwotc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICprc2RhenpsZV9uZXRfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlCi0JCQkJCQkgICAgICAgKm5ldGRldikKLXsKLQlzdHJ1Y3Qga3NkYXp6bGVfY2IgKmtpbmdzdW4gPSBuZXRkZXZfcHJpdihuZXRkZXYpOwotCXJldHVybiAma2luZ3N1bi0+c3RhdHM7Ci19Ci0KLS8qCiAgKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGJ5IHRoZSBVU0Igc3Vic3lzdGVtIGZvciBlYWNoIG5ldyBkZXZpY2UKICAqIGluIHRoZSBzeXN0ZW0uIFdlIG5lZWQgdG8gY2hlY2sgaWYgdGhlIGRldmljZSBpcyBvdXJzLCBhbmQgaW4KICAqIHRoaXMgY2FzZSBzdGFydCBoYW5kbGluZyBpdC4KQEAgLTY5Niw3ICs2ODcsNiBAQAogCW5ldC0+aGFyZF9zdGFydF94bWl0ID0ga3NkYXp6bGVfaGFyZF94bWl0OwogCW5ldC0+b3BlbiA9IGtzZGF6emxlX25ldF9vcGVuOwogCW5ldC0+c3RvcCA9IGtzZGF6emxlX25ldF9jbG9zZTsKLQluZXQtPmdldF9zdGF0cyA9IGtzZGF6emxlX25ldF9nZXRfc3RhdHM7CiAJbmV0LT5kb19pb2N0bCA9IGtzZGF6emxlX25ldF9pb2N0bDsKIAogCXJldCA9IHJlZ2lzdGVyX25ldGRldihuZXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXJkYS9tY3M3NzgwLmMgYi9kcml2ZXJzL25ldC9pcmRhL21jczc3ODAuYwppbmRleCA5MDRjOTYxLi43ZWFmZGNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9pcmRhL21jczc3ODAuYworKysgYi9kcml2ZXJzL25ldC9pcmRhL21jczc3ODAuYwpAQCAtNDAzLDggKzQwMyw4IEBACiAJaWYodW5saWtlbHkobmV3X2xlbiA8PSAwKSkgewogCQlJUkRBX0VSUk9SKCIlcyBzaG9ydCBmcmFtZSBsZW5ndGggJWRcbiIsCiAJCQkgICAgIG1jcy0+bmV0ZGV2LT5uYW1lLCBuZXdfbGVuKTsKLQkJKyttY3MtPnN0YXRzLnJ4X2Vycm9yczsKLQkJKyttY3MtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnM7CisJCSsrbWNzLT5uZXRkZXYtPnN0YXRzLnJ4X2Vycm9yczsKKwkJKyttY3MtPm5ldGRldi0+c3RhdHMucnhfbGVuZ3RoX2Vycm9yczsKIAkJcmV0dXJuOwogCX0KIAlmY3MgPSAwOwpAQCAtNDEzLDE0ICs0MTMsMTQgQEAKIAlpZihmY3MgIT0gR09PRF9GQ1MpIHsKIAkJSVJEQV9FUlJPUigiY3JjIGVycm9yIGNhbGMgMHgleCBsZW4gJWRcbiIsCiAJCQkgICBmY3MsIG5ld19sZW4pOwotCQltY3MtPnN0YXRzLnJ4X2Vycm9ycysrOwotCQltY3MtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKKwkJbWNzLT5uZXRkZXYtPnN0YXRzLnJ4X2Vycm9ycysrOworCQltY3MtPm5ldGRldi0+c3RhdHMucnhfY3JjX2Vycm9ycysrOwogCQlyZXR1cm47CiAJfQogCiAJc2tiID0gZGV2X2FsbG9jX3NrYihuZXdfbGVuICsgMSk7CiAJaWYodW5saWtlbHkoIXNrYikpIHsKLQkJKyttY3MtPnN0YXRzLnJ4X2Ryb3BwZWQ7CisJCSsrbWNzLT5uZXRkZXYtPnN0YXRzLnJ4X2Ryb3BwZWQ7CiAJCXJldHVybjsKIAl9CiAKQEAgLTQzMyw4ICs0MzMsOCBAQAogCiAJbmV0aWZfcngoc2tiKTsKIAotCW1jcy0+c3RhdHMucnhfcGFja2V0cysrOwotCW1jcy0+c3RhdHMucnhfYnl0ZXMgKz0gbmV3X2xlbjsKKwltY3MtPm5ldGRldi0+c3RhdHMucnhfcGFja2V0cysrOworCW1jcy0+bmV0ZGV2LT5zdGF0cy5yeF9ieXRlcyArPSBuZXdfbGVuOwogCiAJcmV0dXJuOwogfQpAQCAtNDU4LDIyICs0NTgsMjIgQEAKIAlpZih1bmxpa2VseShuZXdfbGVuIDw9IDApKSB7CiAJCUlSREFfRVJST1IoIiVzIHNob3J0IGZyYW1lIGxlbmd0aCAlZFxuIiwKIAkJCSAgIG1jcy0+bmV0ZGV2LT5uYW1lLCBuZXdfbGVuKTsKLQkJKyttY3MtPnN0YXRzLnJ4X2Vycm9yczsKLQkJKyttY3MtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnM7CisJCSsrbWNzLT5uZXRkZXYtPnN0YXRzLnJ4X2Vycm9yczsKKwkJKyttY3MtPm5ldGRldi0+c3RhdHMucnhfbGVuZ3RoX2Vycm9yczsKIAkJcmV0dXJuOwogCX0KIAogCWZjcyA9IH4oY3JjMzJfbGUofjAsIGJ1ZiwgbmV3X2xlbikpOwogCWlmKGZjcyAhPSBnZXRfdW5hbGlnbmVkX2xlMzIoYnVmICsgbmV3X2xlbikpIHsKIAkJSVJEQV9FUlJPUigiY3JjIGVycm9yIGNhbGMgMHgleCBsZW4gJWRcbiIsIGZjcywgbmV3X2xlbik7Ci0JCW1jcy0+c3RhdHMucnhfZXJyb3JzKys7Ci0JCW1jcy0+c3RhdHMucnhfY3JjX2Vycm9ycysrOworCQltY3MtPm5ldGRldi0+c3RhdHMucnhfZXJyb3JzKys7CisJCW1jcy0+bmV0ZGV2LT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7CiAJCXJldHVybjsKIAl9CiAKIAlza2IgPSBkZXZfYWxsb2Nfc2tiKG5ld19sZW4gKyAxKTsKIAlpZih1bmxpa2VseSghc2tiKSkgewotCQkrK21jcy0+c3RhdHMucnhfZHJvcHBlZDsKKwkJKyttY3MtPm5ldGRldi0+c3RhdHMucnhfZHJvcHBlZDsKIAkJcmV0dXJuOwogCX0KIApAQCAtNDg2LDggKzQ4Niw4IEBACiAKIAluZXRpZl9yeChza2IpOwogCi0JbWNzLT5zdGF0cy5yeF9wYWNrZXRzKys7Ci0JbWNzLT5zdGF0cy5yeF9ieXRlcyArPSBuZXdfbGVuOworCW1jcy0+bmV0ZGV2LT5zdGF0cy5yeF9wYWNrZXRzKys7CisJbWNzLT5uZXRkZXYtPnN0YXRzLnJ4X2J5dGVzICs9IG5ld19sZW47CiAKIAlyZXR1cm47CiB9CkBAIC03NTYsMTQgKzc1Niw2IEBACiAJCXJldHVybiByZXQ7CiB9CiAKLQotLyogR2V0IGRldmljZSBzdGF0cyBmb3IgL3Byb2MvbmV0L2RldiBhbmQgaWZjb25maWcgKi8KLXN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqbWNzX25ldF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKLXsKLQlzdHJ1Y3QgbWNzX2NiICptY3MgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwotCXJldHVybiAmbWNzLT5zdGF0czsKLX0KLQogLyogUmVjZWl2ZSBjYWxsYmFjayBmdW5jdGlvbi4gICovCiBzdGF0aWMgdm9pZCBtY3NfcmVjZWl2ZV9pcnEoc3RydWN0IHVyYiAqdXJiKQogewpAQCAtNzg2LDE0ICs3NzgsMTQgQEAKIAkJICovCiAJCS8qIFNJUiBzcGVlZCAqLwogCQlpZihtY3MtPnNwZWVkIDwgNTc2MDAwKSB7Ci0JCQlhc3luY191bndyYXBfY2hhcihtY3MtPm5ldGRldiwgJm1jcy0+c3RhdHMsCisJCQlhc3luY191bndyYXBfY2hhcihtY3MtPm5ldGRldiwgJm1jcy0+bmV0ZGV2LT5zdGF0cywKIAkJCQkgICZtY3MtPnJ4X2J1ZmYsIDB4YzApOwogCiAJCQlmb3IgKGkgPSAwOyBpIDwgdXJiLT5hY3R1YWxfbGVuZ3RoOyBpKyspCi0JCQkJYXN5bmNfdW53cmFwX2NoYXIobWNzLT5uZXRkZXYsICZtY3MtPnN0YXRzLAorCQkJCWFzeW5jX3Vud3JhcF9jaGFyKG1jcy0+bmV0ZGV2LCAmbWNzLT5uZXRkZXYtPnN0YXRzLAogCQkJCQkgICZtY3MtPnJ4X2J1ZmYsIGJ5dGVzW2ldKTsKIAotCQkJYXN5bmNfdW53cmFwX2NoYXIobWNzLT5uZXRkZXYsICZtY3MtPnN0YXRzLAorCQkJYXN5bmNfdW53cmFwX2NoYXIobWNzLT5uZXRkZXYsICZtY3MtPm5ldGRldi0+c3RhdHMsCiAJCQkJICAmbWNzLT5yeF9idWZmLCAweGMxKTsKIAkJfQogCQkvKiBNSVIgc3BlZWQgKi8KQEAgLTg2OCwxMiArODYwLDEyIEBACiAJCWNhc2UgLUVQSVBFOgogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6Ci0JCQltY3MtPnN0YXRzLnR4X2Vycm9ycysrOworCQkJbWNzLT5uZXRkZXYtPnN0YXRzLnR4X2Vycm9ycysrOwogCQkJbmV0aWZfc3RhcnRfcXVldWUobmRldik7CiAJCX0KIAl9IGVsc2UgewotCQltY3MtPnN0YXRzLnR4X3BhY2tldHMrKzsKLQkJbWNzLT5zdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKKwkJbWNzLT5uZXRkZXYtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwkJbWNzLT5uZXRkZXYtPnN0YXRzLnR4X2J5dGVzICs9IHNrYi0+bGVuOwogCX0KIAogCWRldl9rZnJlZV9za2Ioc2tiKTsKQEAgLTkzMSw3ICs5MjMsNiBAQAogCW5kZXYtPmhhcmRfc3RhcnRfeG1pdCA9IG1jc19oYXJkX3htaXQ7CiAJbmRldi0+b3BlbiA9IG1jc19uZXRfb3BlbjsKIAluZGV2LT5zdG9wID0gbWNzX25ldF9jbG9zZTsKLQluZGV2LT5nZXRfc3RhdHMgPSBtY3NfbmV0X2dldF9zdGF0czsKIAluZGV2LT5kb19pb2N0bCA9IG1jc19uZXRfaW9jdGw7CiAKIAlpZiAoIWludGYtPmN1cl9hbHRzZXR0aW5nKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXJkYS9tY3M3NzgwLmggYi9kcml2ZXJzL25ldC9pcmRhL21jczc3ODAuaAppbmRleCBiMTgxNDhjLi42YmRjNjIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9pcmRhL21jczc3ODAuaAorKysgYi9kcml2ZXJzL25ldC9pcmRhL21jczc3ODAuaApAQCAtMTA0LDcgKzEwNCw2IEBACiAJc3RydWN0IHVzYl9kZXZpY2UgKnVzYmRldjsJLyogaW5pdDogcHJvYmVfaXJkYSAqLwogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7CS8qIG5ldHdvcmsgbGF5ZXIgKi8KIAlzdHJ1Y3QgaXJsYXBfY2IgKmlybGFwOwkvKiBUaGUgbGluayBsYXllciB3ZSBhcmUgYmluZGVkIHRvICovCi0Jc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CS8qIG5ldHdvcmsgc3RhdGlzdGljcyAqLwogCXN0cnVjdCBxb3NfaW5mbyBxb3M7CiAJdW5zaWduZWQgaW50IHNwZWVkOwkvKiBDdXJyZW50IHNwZWVkICovCiAJdW5zaWduZWQgaW50IG5ld19zcGVlZDsJLyogbmV3IHNwZWVkICovCkBAIC0xNTQsNyArMTUzLDYgQEAKIHN0YXRpYyBpbnQgbWNzX25ldF9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKTsKIHN0YXRpYyBpbnQgbWNzX25ldF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KTsKIHN0YXRpYyBpbnQgbWNzX25ldF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpOwotc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICptY3NfbmV0X2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KTsKIAogc3RhdGljIHZvaWQgbWNzX3JlY2VpdmVfaXJxKHN0cnVjdCB1cmIgKnVyYik7CiBzdGF0aWMgdm9pZCBtY3Nfc2VuZF9pcnEoc3RydWN0IHVyYiAqdXJiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lyZGEvbnNjLWlyY2MuYyBiL2RyaXZlcnMvbmV0L2lyZGEvbnNjLWlyY2MuYwppbmRleCAyYzZiZjJkLi42MWU1MDljIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9pcmRhL25zYy1pcmNjLmMKKysrIGIvZHJpdmVycy9uZXQvaXJkYS9uc2MtaXJjYy5jCkBAIC0xODUsNyArMTg1LDYgQEAKIHN0YXRpYyBpbnQgIG5zY19pcmNjX25ldF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogc3RhdGljIGludCAgbnNjX2lyY2NfbmV0X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogc3RhdGljIGludCAgbnNjX2lyY2NfbmV0X2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqcnEsIGludCBjbWQpOwotc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpuc2NfaXJjY19uZXRfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogCiAvKiBHbG9iYWxzICovCiBzdGF0aWMgaW50IHBucF9yZWdpc3RlcmVkOwpAQCAtNDQ2LDcgKzQ0NSw2IEBACiAJZGV2LT5vcGVuICAgICAgICAgICAgPSBuc2NfaXJjY19uZXRfb3BlbjsKIAlkZXYtPnN0b3AgICAgICAgICAgICA9IG5zY19pcmNjX25ldF9jbG9zZTsKIAlkZXYtPmRvX2lvY3RsICAgICAgICA9IG5zY19pcmNjX25ldF9pb2N0bDsKLQlkZXYtPmdldF9zdGF0cwkgICAgID0gbnNjX2lyY2NfbmV0X2dldF9zdGF0czsKIAogCWVyciA9IHJlZ2lzdGVyX25ldGRldihkZXYpOwogCWlmIChlcnIpIHsKQEAgLTE0MDEsNyArMTM5OSw3IEBACiAJc2VsZi0+dHhfYnVmZi5sZW4gPSBhc3luY193cmFwX3NrYihza2IsIHNlbGYtPnR4X2J1ZmYuZGF0YSwgCiAJCQkJCSAgIHNlbGYtPnR4X2J1ZmYudHJ1ZXNpemUpOwogCi0Jc2VsZi0+c3RhdHMudHhfYnl0ZXMgKz0gc2VsZi0+dHhfYnVmZi5sZW47CisJZGV2LT5zdGF0cy50eF9ieXRlcyArPSBzZWxmLT50eF9idWZmLmxlbjsKIAkKIAkvKiBBZGQgaW50ZXJydXB0IG9uIHR4IGxvdyBsZXZlbCAod2lsbCBmaXJlIGltbWVkaWF0ZWx5KSAqLwogCXN3aXRjaF9iYW5rKGlvYmFzZSwgQkFOSzApOwpAQCAtMTQ3Myw3ICsxNDcxLDcgQEAKIAlzZWxmLT50eF9maWZvLnF1ZXVlW3NlbGYtPnR4X2ZpZm8uZnJlZV0ubGVuID0gc2tiLT5sZW47CiAJc2VsZi0+dHhfZmlmby50YWlsICs9IHNrYi0+bGVuOwogCi0Jc2VsZi0+c3RhdHMudHhfYnl0ZXMgKz0gc2tiLT5sZW47CisJZGV2LT5zdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKIAogCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGEoc2tiLCBzZWxmLT50eF9maWZvLnF1ZXVlW3NlbGYtPnR4X2ZpZm8uZnJlZV0uc3RhcnQsCiAJCSAgICAgIHNrYi0+bGVuKTsKQEAgLTE2NTIsMTMgKzE2NTAsMTMgQEAKIAkKIAkvKiBDaGVjayBmb3IgdW5kZXJycnVuISAqLwogCWlmIChpbmIoaW9iYXNlK0FTQ1IpICYgQVNDUl9UWFVSKSB7Ci0JCXNlbGYtPnN0YXRzLnR4X2Vycm9ycysrOwotCQlzZWxmLT5zdGF0cy50eF9maWZvX2Vycm9ycysrOworCQlzZWxmLT5uZXRkZXYtPnN0YXRzLnR4X2Vycm9ycysrOworCQlzZWxmLT5uZXRkZXYtPnN0YXRzLnR4X2ZpZm9fZXJyb3JzKys7CiAJCQogCQkvKiBDbGVhciBiaXQsIGJ5IHdyaXRpbmcgMSBpbnRvIGl0ICovCiAJCW91dGIoQVNDUl9UWFVSLCBpb2Jhc2UrQVNDUik7CiAJfSBlbHNlIHsKLQkJc2VsZi0+c3RhdHMudHhfcGFja2V0cysrOworCQlzZWxmLT5uZXRkZXYtPnN0YXRzLnR4X3BhY2tldHMrKzsKIAl9CiAKIAkvKiBGaW5pc2hlZCB3aXRoIHRoaXMgZnJhbWUsIHNvIHByZXBhcmUgZm9yIG5leHQgKi8KQEAgLTE3OTMsMjggKzE3OTEsMjggQEAKIAkJaWYgKHN0YXR1cyAmIEZSTV9TVF9FUlJfTVNLKSB7CiAJCQlpZiAoc3RhdHVzICYgRlJNX1NUX0xPU1RfRlIpIHsKIAkJCQkvKiBBZGQgbnVtYmVyIG9mIGxvc3QgZnJhbWVzIHRvIHN0YXRzICovCi0JCQkJc2VsZi0+c3RhdHMucnhfZXJyb3JzICs9IGxlbjsJCisJCQkJc2VsZi0+bmV0ZGV2LT5zdGF0cy5yeF9lcnJvcnMgKz0gbGVuOwogCQkJfSBlbHNlIHsKIAkJCQkvKiBTa2lwIGZyYW1lICovCi0JCQkJc2VsZi0+c3RhdHMucnhfZXJyb3JzKys7CisJCQkJc2VsZi0+bmV0ZGV2LT5zdGF0cy5yeF9lcnJvcnMrKzsKIAkJCQkKIAkJCQlzZWxmLT5yeF9idWZmLmRhdGEgKz0gbGVuOwogCQkJCiAJCQkJaWYgKHN0YXR1cyAmIEZSTV9TVF9NQVhfTEVOKQotCQkJCQlzZWxmLT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7CisJCQkJCXNlbGYtPm5ldGRldi0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOwogCQkJCQogCQkJCWlmIChzdGF0dXMgJiBGUk1fU1RfUEhZX0VSUikgCi0JCQkJCXNlbGYtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycysrOworCQkJCQlzZWxmLT5uZXRkZXYtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycysrOwogCQkJCQogCQkJCWlmIChzdGF0dXMgJiBGUk1fU1RfQkFEX0NSQykgCi0JCQkJCXNlbGYtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKKwkJCQkJc2VsZi0+bmV0ZGV2LT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7CiAJCQl9CiAJCQkvKiBUaGUgZXJyb3JzIGJlbG93IGNhbiBiZSByZXBvcnRlZCBpbiBib3RoIGNhc2VzICovCiAJCQlpZiAoc3RhdHVzICYgRlJNX1NUX09WUjEpCi0JCQkJc2VsZi0+c3RhdHMucnhfZmlmb19lcnJvcnMrKzsJCSAgICAgICAKKwkJCQlzZWxmLT5uZXRkZXYtPnN0YXRzLnJ4X2ZpZm9fZXJyb3JzKys7CiAJCQkKIAkJCWlmIChzdGF0dXMgJiBGUk1fU1RfT1ZSMikKLQkJCQlzZWxmLT5zdGF0cy5yeF9maWZvX2Vycm9ycysrOworCQkJCXNlbGYtPm5ldGRldi0+c3RhdHMucnhfZmlmb19lcnJvcnMrKzsKIAkJfSBlbHNlIHsKIAkJCS8qICAKIAkJCSAqIEZpcnN0IHdlIG11c3QgbWFrZSBzdXJlIHRoYXQgdGhlIGZyYW1lIHdlCkBAIC0xODYzLDcgKzE4NjEsNyBAQAogCQkJCUlSREFfV0FSTklORygiJXMoKSwgbWVtb3J5IHNxdWVlemUsICIKIAkJCQkJICAgICAiZHJvcHBpbmcgZnJhbWUuXG4iLAogCQkJCQkgICAgIF9fZnVuY19fKTsKLQkJCQlzZWxmLT5zdGF0cy5yeF9kcm9wcGVkKys7CisJCQkJc2VsZi0+bmV0ZGV2LT5zdGF0cy5yeF9kcm9wcGVkKys7CiAKIAkJCQkvKiBSZXN0b3JlIGJhbmsgcmVnaXN0ZXIgKi8KIAkJCQlvdXRiKGJhbmssIGlvYmFzZStCU1IpOwpAQCAtMTg4OSw4ICsxODg3LDggQEAKIAogCQkJLyogTW92ZSB0byBuZXh0IGZyYW1lICovCiAJCQlzZWxmLT5yeF9idWZmLmRhdGEgKz0gbGVuOwotCQkJc2VsZi0+c3RhdHMucnhfYnl0ZXMgKz0gbGVuOwotCQkJc2VsZi0+c3RhdHMucnhfcGFja2V0cysrOworCQkJc2VsZi0+bmV0ZGV2LT5zdGF0cy5yeF9ieXRlcyArPSBsZW47CisJCQlzZWxmLT5uZXRkZXYtPnN0YXRzLnJ4X3BhY2tldHMrKzsKIAogCQkJc2tiLT5kZXYgPSBzZWxmLT5uZXRkZXY7CiAJCQlza2JfcmVzZXRfbWFjX2hlYWRlcihza2IpOwpAQCAtMTkyMCw4ICsxOTE4LDggQEAKIAkvKiAgUmVjZWl2ZSBhbGwgY2hhcmFjdGVycyBpbiBSeCBGSUZPICovCiAJZG8gewogCQlieXRlID0gaW5iKGlvYmFzZStSWEQpOwotCQlhc3luY191bndyYXBfY2hhcihzZWxmLT5uZXRkZXYsICZzZWxmLT5zdGF0cywgJnNlbGYtPnJ4X2J1ZmYsIAotCQkJCSAgYnl0ZSk7CisJCWFzeW5jX3Vud3JhcF9jaGFyKHNlbGYtPm5ldGRldiwgJnNlbGYtPm5ldGRldi0+c3RhdHMsCisJCQkJICAmc2VsZi0+cnhfYnVmZiwgYnl0ZSk7CiAJfSB3aGlsZSAoaW5iKGlvYmFzZStMU1IpICYgTFNSX1JYREEpOyAvKiBEYXRhIGF2YWlsYWJsZSAqLwkKIH0KIApAQCAtMTk1Miw3ICsxOTUwLDcgQEAKIAkJCXNlbGYtPmllciA9IElFUl9UWExETF9JRTsKIAkJZWxzZSB7IAogCi0JCQlzZWxmLT5zdGF0cy50eF9wYWNrZXRzKys7CisJCQlzZWxmLT5uZXRkZXYtPnN0YXRzLnR4X3BhY2tldHMrKzsKIAkJCW5ldGlmX3dha2VfcXVldWUoc2VsZi0+bmV0ZGV2KTsKIAkJCXNlbGYtPmllciA9IElFUl9UWEVNUF9JRTsKIAkJfQpAQCAtMjMwNywxMyArMjMwNSw2IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpuc2NfaXJjY19uZXRfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IG5zY19pcmNjX2NiICpzZWxmID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQkKLQlyZXR1cm4gJnNlbGYtPnN0YXRzOwotfQotCiBzdGF0aWMgaW50IG5zY19pcmNjX3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCiB7CiAgICAgIAlzdHJ1Y3QgbnNjX2lyY2NfY2IgKnNlbGYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXJkYS9uc2MtaXJjYy5oIGIvZHJpdmVycy9uZXQvaXJkYS9uc2MtaXJjYy5oCmluZGV4IDcxY2QzYzUuLjdiYTc3MzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2lyZGEvbnNjLWlyY2MuaAorKysgYi9kcml2ZXJzL25ldC9pcmRhL25zYy1pcmNjLmgKQEAgLTI1MSw3ICsyNTEsNiBAQAogCXN0cnVjdCB0eF9maWZvIHR4X2ZpZm87ICAgIC8qIEluZm8gYWJvdXQgZnJhbWVzIHRvIGJlIHRyYW5zbWl0dGVkICovCiAKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2OyAgICAgLyogWWVzISB3ZSBhcmUgc29tZSBraW5kIG9mIG5ldGRldmljZSAqLwotCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOwogCQogCXN0cnVjdCBpcmxhcF9jYiAqaXJsYXA7ICAgIC8qIFRoZSBsaW5rIGxheWVyIHdlIGFyZSBiaW5kZWQgdG8gKi8KIAlzdHJ1Y3QgcW9zX2luZm8gcW9zOyAgICAgICAvKiBRb1MgY2FwYWJpbGl0aWVzIGZvciB0aGlzIGRldmljZSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXJkYS9weGFmaWNwX2lyLmMgYi9kcml2ZXJzL25ldC9pcmRhL3B4YWZpY3BfaXIuYwppbmRleCAwMDRhOWFhLi4zMTc5NGMyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9pcmRhL3B4YWZpY3BfaXIuYworKysgYi9kcml2ZXJzL25ldC9pcmRhL3B4YWZpY3BfaXIuYwpAQCAtMTA4LDcgKzEwOCw2IEBACiAJaW50CQkJdHhkbWE7CiAJaW50CQkJcnhkbWE7CiAKLQlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cwlzdGF0czsKIAlzdHJ1Y3QgaXJsYXBfY2IJCSppcmxhcDsKIAlzdHJ1Y3QgcW9zX2luZm8JCXFvczsKIApAQCAtMjU4LDE0ICsyNTcsMTUgQEAKIAkJCWRhdGEgPSBTVFJCUjsKIAkJCWlmIChsc3IgJiAoTFNSX09FIHwgTFNSX1BFIHwgTFNSX0ZFIHwgTFNSX0JJKSkgewogCQkJCXByaW50ayhLRVJOX0RFQlVHICJweGFfaXI6IHNpciByZWNlaXZpbmcgZXJyb3JcbiIpOwotCQkJCXNpLT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJCQlkZXYtPnN0YXRzLnJ4X2Vycm9ycysrOwogCQkJCWlmIChsc3IgJiBMU1JfRkUpCi0JCQkJCXNpLT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKKwkJCQkJZGV2LT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKIAkJCQlpZiAobHNyICYgTFNSX09FKQotCQkJCQlzaS0+c3RhdHMucnhfZmlmb19lcnJvcnMrKzsKKwkJCQkJZGV2LT5zdGF0cy5yeF9maWZvX2Vycm9ycysrOwogCQkJfSBlbHNlIHsKLQkJCQlzaS0+c3RhdHMucnhfYnl0ZXMrKzsKLQkJCQlhc3luY191bndyYXBfY2hhcihkZXYsICZzaS0+c3RhdHMsICZzaS0+cnhfYnVmZiwgZGF0YSk7CisJCQkJZGV2LT5zdGF0cy5yeF9ieXRlcysrOworCQkJCWFzeW5jX3Vud3JhcF9jaGFyKGRldiwgJmRldi0+c3RhdHMsCisJCQkJCQkgICZzaS0+cnhfYnVmZiwgZGF0YSk7CiAJCQl9CiAJCQlsc3IgPSBTVExTUjsKIAkJfQpAQCAtMjc3LDggKzI3Nyw4IEBACiAKIAljYXNlIDB4MEM6IC8qIENoYXJhY3RlciBUaW1lb3V0IEluZGljYXRpb24gKi8KIAkgIAlkbyAgewotCQkgICAgc2ktPnN0YXRzLnJ4X2J5dGVzKys7Ci0JICAgICAgICAgICAgYXN5bmNfdW53cmFwX2NoYXIoZGV2LCAmc2ktPnN0YXRzLCAmc2ktPnJ4X2J1ZmYsIFNUUkJSKTsKKwkJICAgIGRldi0+c3RhdHMucnhfYnl0ZXMrKzsKKwkgICAgICAgICAgICBhc3luY191bndyYXBfY2hhcihkZXYsICZkZXYtPnN0YXRzLCAmc2ktPnJ4X2J1ZmYsIFNUUkJSKTsKIAkgIAl9IHdoaWxlIChTVExTUiAmIExTUl9EUik7CiAJCXNpLT5sYXN0X29zY3IgPSBPU0NSOwogCSAgCWJyZWFrOwpAQCAtMjkwLDkgKzI5MCw4IEBACiAJICAgIAl9CiAKIAkJaWYgKHNpLT50eF9idWZmLmxlbiA9PSAwKSB7Ci0JCQlzaS0+c3RhdHMudHhfcGFja2V0cysrOwotCQkJc2ktPnN0YXRzLnR4X2J5dGVzICs9IHNpLT50eF9idWZmLmRhdGEgLQotCQkJCQkgICAgICBzaS0+dHhfYnVmZi5oZWFkOworCQkJZGV2LT5zdGF0cy50eF9wYWNrZXRzKys7CisJCQlkZXYtPnN0YXRzLnR4X2J5dGVzICs9IHNpLT50eF9idWZmLmRhdGEgLSBzaS0+dHhfYnVmZi5oZWFkOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAvKiBXZSBuZWVkIHRvIGVuc3VyZSB0aGF0IHRoZSB0cmFuc21pdHRlciBoYXMgZmluaXNoZWQuICovCiAJCQl3aGlsZSAoKFNUTFNSICYgTFNSX1RFTVQpID09IDApCkBAIC0zNDMsMTAgKzM0MiwxMCBAQAogCURDU1IoY2hhbm5lbCkgPSBkY3NyICYgfkRDU1JfUlVOOwogCiAJaWYgKGRjc3IgJiBEQ1NSX0VORElOVFIpICB7Ci0JCXNpLT5zdGF0cy50eF9wYWNrZXRzKys7Ci0JCXNpLT5zdGF0cy50eF9ieXRlcyArPSBzaS0+ZG1hX3R4X2J1ZmZfbGVuOworCQlkZXYtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwkJZGV2LT5zdGF0cy50eF9ieXRlcyArPSBzaS0+ZG1hX3R4X2J1ZmZfbGVuOwogCX0gZWxzZSB7Ci0JCXNpLT5zdGF0cy50eF9lcnJvcnMrKzsKKwkJZGV2LT5zdGF0cy50eF9lcnJvcnMrKzsKIAl9CiAKIAl3aGlsZSAoSUNTUjEgJiBJQ1NSMV9UQlkpCkBAIC0zOTIsMTQgKzM5MSwxNCBAQAogCQlkYXRhID0gSUNEUjsKIAogCQlpZiAoc3RhdCAmIChJQ1NSMV9DUkUgfCBJQ1NSMV9ST1IpKSB7Ci0JCQlzaS0+c3RhdHMucnhfZXJyb3JzKys7CisJCQlkZXYtPnN0YXRzLnJ4X2Vycm9ycysrOwogCQkJaWYgKHN0YXQgJiBJQ1NSMV9DUkUpIHsKIAkJCQlwcmludGsoS0VSTl9ERUJVRyAicHhhX2lyOiBmaXIgcmVjZWl2ZSBDUkMgZXJyb3JcbiIpOwotCQkJCXNpLT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7CisJCQkJZGV2LT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7CiAJCQl9CiAJCQlpZiAoc3RhdCAmIElDU1IxX1JPUikgewogCQkJCXByaW50ayhLRVJOX0RFQlVHICJweGFfaXI6IGZpciByZWNlaXZlIG92ZXJydW5cbiIpOwotCQkJCXNpLT5zdGF0cy5yeF9vdmVyX2Vycm9ycysrOworCQkJCWRldi0+c3RhdHMucnhfb3Zlcl9lcnJvcnMrKzsKIAkJCX0KIAkJfSBlbHNlCXsKIAkJCXNpLT5kbWFfcnhfYnVmZltsZW4rK10gPSBkYXRhOwpAQCAtNDE1LDE0ICs0MTQsMTQgQEAKIAogCQlpZiAoaWNzcjAgJiBJQ1NSMF9GUkUpIHsKIAkJCXByaW50ayhLRVJOX0VSUiAicHhhX2lyOiBkcm9wcGluZyBlcnJvbmVvdXMgZnJhbWVcbiIpOwotCQkJc2ktPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJCWRldi0+c3RhdHMucnhfZHJvcHBlZCsrOwogCQkJcmV0dXJuOwogCQl9CiAKIAkJc2tiID0gYWxsb2Nfc2tiKGxlbisxLEdGUF9BVE9NSUMpOwogCQlpZiAoIXNrYikgIHsKIAkJCXByaW50ayhLRVJOX0VSUiAicHhhX2lyOiBmaXIgb3V0IG9mIG1lbW9yeSBmb3IgcmVjZWl2ZSBza2JcbiIpOwotCQkJc2ktPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJCWRldi0+c3RhdHMucnhfZHJvcHBlZCsrOwogCQkJcmV0dXJuOwogCQl9CiAKQEAgLTQzNyw4ICs0MzYsOCBAQAogCQlza2ItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfSVJEQSk7CiAJCW5ldGlmX3J4KHNrYik7CiAKLQkJc2ktPnN0YXRzLnJ4X3BhY2tldHMrKzsKLQkJc2ktPnN0YXRzLnJ4X2J5dGVzICs9IGxlbjsKKwkJZGV2LT5zdGF0cy5yeF9wYWNrZXRzKys7CisJCWRldi0+c3RhdHMucnhfYnl0ZXMgKz0gbGVuOwogCX0KIH0KIApAQCAtNDU3LDEwICs0NTYsMTAgQEAKIAlpZiAoaWNzcjAgJiAoSUNTUjBfRlJFIHwgSUNTUjBfUkFCKSkgewogCQlpZiAoaWNzcjAgJiBJQ1NSMF9GUkUpIHsKIAkJICAgICAgICBwcmludGsoS0VSTl9ERUJVRyAicHhhX2lyOiBmaXIgcmVjZWl2ZSBmcmFtZSBlcnJvclxuIik7Ci0JCQlzaS0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CisJCQlkZXYtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycysrOwogCQl9IGVsc2UgewogCQkJcHJpbnRrKEtFUk5fREVCVUcgInB4YV9pcjogZmlyIHJlY2VpdmUgYWJvcnRcbiIpOwotCQkJc2ktPnN0YXRzLnJ4X2Vycm9ycysrOworCQkJZGV2LT5zdGF0cy5yeF9lcnJvcnMrKzsKIAkJfQogCQlJQ1NSMCA9IGljc3IwICYgKElDU1IwX0ZSRSB8IElDU1IwX1JBQik7CiAJfQpAQCAtNTg5LDEyICs1ODgsNiBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqcHhhX2lyZGFfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgcHhhX2lyZGEgKnNpID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQlyZXR1cm4gJnNpLT5zdGF0czsKLX0KLQogc3RhdGljIHZvaWQgcHhhX2lyZGFfc3RhcnR1cChzdHJ1Y3QgcHhhX2lyZGEgKnNpKQogewogCS8qIERpc2FibGUgU1RVQVJUIGludGVycnVwdHMgKi8KQEAgLTg1Nyw3ICs4NTAsNiBAQAogCWRldi0+b3BlbgkJPSBweGFfaXJkYV9zdGFydDsKIAlkZXYtPnN0b3AJCT0gcHhhX2lyZGFfc3RvcDsKIAlkZXYtPmRvX2lvY3RsCQk9IHB4YV9pcmRhX2lvY3RsOwotCWRldi0+Z2V0X3N0YXRzCQk9IHB4YV9pcmRhX3N0YXRzOwogCiAJaXJkYV9pbml0X21heF9xb3NfY2FwYWJpbGllcygmc2ktPnFvcyk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lyZGEvc2ExMTAwX2lyLmMgYi9kcml2ZXJzL25ldC9pcmRhL3NhMTEwMF9pci5jCmluZGV4IGQzMDJiY2YuLjdhMmIwMDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2lyZGEvc2ExMTAwX2lyLmMKKysrIGIvZHJpdmVycy9uZXQvaXJkYS9zYTExMDBfaXIuYwpAQCAtNjAsNyArNjAsNiBAQAogCWRtYV9yZWdzX3QJCSp0eGRtYTsKIAlkbWFfcmVnc190CQkqcnhkbWE7CiAKLQlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cwlzdGF0czsKIAlzdHJ1Y3QgZGV2aWNlCQkqZGV2OwogCXN0cnVjdCBpcmRhX3BsYXRmb3JtX2RhdGEgKnBkYXRhOwogCXN0cnVjdCBpcmxhcF9jYgkJKmlybGFwOwpAQCAtMzc1LDEzICszNzQsMTMgQEAKIAkJZGF0YSA9IFNlcjJVVERSOwogCiAJCWlmIChzdGF0ICYgKFVUU1IxX0ZSRSB8IFVUU1IxX1JPUikpIHsKLQkJCXNpLT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJCWRldi0+c3RhdHMucnhfZXJyb3JzKys7CiAJCQlpZiAoc3RhdCAmIFVUU1IxX0ZSRSkKLQkJCQlzaS0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CisJCQkJZGV2LT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKIAkJCWlmIChzdGF0ICYgVVRTUjFfUk9SKQotCQkJCXNpLT5zdGF0cy5yeF9maWZvX2Vycm9ycysrOworCQkJCWRldi0+c3RhdHMucnhfZmlmb19lcnJvcnMrKzsKIAkJfSBlbHNlCi0JCQlhc3luY191bndyYXBfY2hhcihkZXYsICZzaS0+c3RhdHMsICZzaS0+cnhfYnVmZiwgZGF0YSk7CisJCQlhc3luY191bndyYXBfY2hhcihkZXYsICZkZXYtPnN0YXRzLCAmc2ktPnJ4X2J1ZmYsIGRhdGEpOwogCiAJCXN0YXR1cyA9IFNlcjJVVFNSMDsKIAl9CkBAIC0zOTYsOSArMzk1LDkgQEAKIAkJICogVGhlcmUgYXJlIGF0IGxlYXN0IDQgYnl0ZXMgaW4gdGhlIEZJRk8uICBSZWFkIDMgYnl0ZXMKIAkJICogYW5kIGxlYXZlIHRoZSByZXN0IHRvIHRoZSBibG9jayBiZWxvdy4KIAkJICovCi0JCWFzeW5jX3Vud3JhcF9jaGFyKGRldiwgJnNpLT5zdGF0cywgJnNpLT5yeF9idWZmLCBTZXIyVVREUik7Ci0JCWFzeW5jX3Vud3JhcF9jaGFyKGRldiwgJnNpLT5zdGF0cywgJnNpLT5yeF9idWZmLCBTZXIyVVREUik7Ci0JCWFzeW5jX3Vud3JhcF9jaGFyKGRldiwgJnNpLT5zdGF0cywgJnNpLT5yeF9idWZmLCBTZXIyVVREUik7CisJCWFzeW5jX3Vud3JhcF9jaGFyKGRldiwgJmRldi0+c3RhdHMsICZzaS0+cnhfYnVmZiwgU2VyMlVURFIpOworCQlhc3luY191bndyYXBfY2hhcihkZXYsICZkZXYtPnN0YXRzLCAmc2ktPnJ4X2J1ZmYsIFNlcjJVVERSKTsKKwkJYXN5bmNfdW53cmFwX2NoYXIoZGV2LCAmZGV2LT5zdGF0cywgJnNpLT5yeF9idWZmLCBTZXIyVVREUik7CiAJfQogCiAJaWYgKHN0YXR1cyAmIChVVFNSMF9SRlMgfCBVVFNSMF9SSUQpKSB7CkBAIC00MDYsNyArNDA1LDcgQEAKIAkJICogRmlmbyBjb250YWlucyBtb3JlIHRoYW4gMSBjaGFyYWN0ZXIuCiAJCSAqLwogCQlkbyB7Ci0JCQlhc3luY191bndyYXBfY2hhcihkZXYsICZzaS0+c3RhdHMsICZzaS0+cnhfYnVmZiwKKwkJCWFzeW5jX3Vud3JhcF9jaGFyKGRldiwgJmRldi0+c3RhdHMsICZzaS0+cnhfYnVmZiwKIAkJCQkJICBTZXIyVVREUik7CiAJCX0gd2hpbGUgKFNlcjJVVFNSMSAmIFVUU1IxX1JORSk7CiAKQEAgLTQyMiw4ICs0MjEsOCBAQAogCQl9IHdoaWxlIChTZXIyVVRTUjEgJiBVVFNSMV9UTkYgJiYgc2ktPnR4X2J1ZmYubGVuKTsKIAogCQlpZiAoc2ktPnR4X2J1ZmYubGVuID09IDApIHsKLQkJCXNpLT5zdGF0cy50eF9wYWNrZXRzKys7Ci0JCQlzaS0+c3RhdHMudHhfYnl0ZXMgKz0gc2ktPnR4X2J1ZmYuZGF0YSAtCisJCQlkZXYtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwkJCWRldi0+c3RhdHMudHhfYnl0ZXMgKz0gc2ktPnR4X2J1ZmYuZGF0YSAtCiAJCQkJCSAgICAgIHNpLT50eF9idWZmLmhlYWQ7CiAKIAkJCS8qCkBAIC00ODIsMTEgKzQ4MSwxMSBAQAogCQlkYXRhID0gU2VyMkhTRFI7CiAKIAkJaWYgKHN0YXQgJiAoSFNTUjFfQ1JFIHwgSFNTUjFfUk9SKSkgewotCQkJc2ktPnN0YXRzLnJ4X2Vycm9ycysrOworCQkJZGV2LT5zdGF0cy5yeF9lcnJvcnMrKzsKIAkJCWlmIChzdGF0ICYgSFNTUjFfQ1JFKQotCQkJCXNpLT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7CisJCQkJZGV2LT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7CiAJCQlpZiAoc3RhdCAmIEhTU1IxX1JPUikKLQkJCQlzaS0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CisJCQkJZGV2LT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKIAkJfSBlbHNlCiAJCQlza2ItPmRhdGFbbGVuKytdID0gZGF0YTsKIApAQCAtNTA1LDggKzUwNCw4IEBACiAJCXNrYi0+ZGV2ID0gZGV2OwogCQlza2JfcmVzZXRfbWFjX2hlYWRlcihza2IpOwogCQlza2ItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfSVJEQSk7Ci0JCXNpLT5zdGF0cy5yeF9wYWNrZXRzKys7Ci0JCXNpLT5zdGF0cy5yeF9ieXRlcyArPSBsZW47CisJCWRldi0+c3RhdHMucnhfcGFja2V0cysrOworCQlkZXYtPnN0YXRzLnJ4X2J5dGVzICs9IGxlbjsKIAogCQkvKgogCQkgKiBCZWZvcmUgd2UgcGFzcyB0aGUgYnVmZmVyIHVwLCBhbGxvY2F0ZSBhIG5ldyBvbmUuCkBAIC01NDUsMTAgKzU0NCwxMCBAQAogCSAqIGZyb20gdGhlIGZpZm8uCiAJICovCiAJaWYgKFNlcjJIU1NSMCAmIChIU1NSMF9GUkUgfCBIU1NSMF9SQUIpKSB7Ci0JCXNpLT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJZGV2LT5zdGF0cy5yeF9lcnJvcnMrKzsKIAogCQlpZiAoU2VyMkhTU1IwICYgSFNTUjBfRlJFKQotCQkJc2ktPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycysrOworCQkJZGV2LT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKIAogCQkvKgogCQkgKiBDbGVhciBvdXQgdGhlIERNQS4uLgpAQCAtNjMzLDggKzYzMiw4IEBACiAJICovCiAJaWYgKHNrYikgewogCQlkbWFfdW5tYXBfc2luZ2xlKHNpLT5kZXYsIHNpLT50eGJ1Zl9kbWEsIHNrYi0+bGVuLCBETUFfVE9fREVWSUNFKTsKLQkJc2ktPnN0YXRzLnR4X3BhY2tldHMgKys7Ci0JCXNpLT5zdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKKwkJZGV2LT5zdGF0cy50eF9wYWNrZXRzICsrOworCQlkZXYtPnN0YXRzLnR4X2J5dGVzICs9IHNrYi0+bGVuOwogCQlkZXZfa2ZyZWVfc2tiX2lycShza2IpOwogCX0KIApAQCAtNzYyLDEyICs3NjEsNiBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc2ExMTAwX2lyZGFfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3Qgc2ExMTAwX2lyZGEgKnNpID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQlyZXR1cm4gJnNpLT5zdGF0czsKLX0KLQogc3RhdGljIGludCBzYTExMDBfaXJkYV9zdGFydChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCBzYTExMDBfaXJkYSAqc2kgPSBuZXRkZXZfcHJpdihkZXYpOwpAQCAtOTI0LDcgKzkxNyw2IEBACiAJZGV2LT5vcGVuCQk9IHNhMTEwMF9pcmRhX3N0YXJ0OwogCWRldi0+c3RvcAkJPSBzYTExMDBfaXJkYV9zdG9wOwogCWRldi0+ZG9faW9jdGwJCT0gc2ExMTAwX2lyZGFfaW9jdGw7Ci0JZGV2LT5nZXRfc3RhdHMJCT0gc2ExMTAwX2lyZGFfc3RhdHM7CiAJZGV2LT5pcnEJCT0gSVJRX1NlcjJJQ1A7CiAKIAlpcmRhX2luaXRfbWF4X3Fvc19jYXBhYmlsaWVzKCZzaS0+cW9zKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lyZGEvc2lyLWRldi5oIGIvZHJpdmVycy9uZXQvaXJkYS9zaXItZGV2LmgKaW5kZXggMmE1N2JjNi4uNmQ1YjFlMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaXJkYS9zaXItZGV2LmgKKysrIGIvZHJpdmVycy9uZXQvaXJkYS9zaXItZGV2LmgKQEAgLTE2MCw3ICsxNjAsNiBAQAogCiBzdHJ1Y3Qgc2lyX2RldiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKLQlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKIAogCXN0cnVjdCBpcmxhcF9jYiAgICAqaXJsYXA7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lyZGEvc2lyX2Rldi5jIGIvZHJpdmVycy9uZXQvaXJkYS9zaXJfZGV2LmMKaW5kZXggY2VlZjA0MC4uNWI1ODYyNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaXJkYS9zaXJfZGV2LmMKKysrIGIvZHJpdmVycy9uZXQvaXJkYS9zaXJfZGV2LmMKQEAgLTQ1NSw4ICs0NTUsOCBAQAogCQkJaWYgKChza2I9ZGV2LT50eF9za2IpICE9IE5VTEwpIHsKIAkJCQlkZXYtPnR4X3NrYiA9IE5VTEw7CiAJCQkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKLQkJCQlkZXYtPnN0YXRzLnR4X2Vycm9ycysrOwkJICAgICAgCi0JCQkJZGV2LT5zdGF0cy50eF9kcm9wcGVkKys7CQkgICAgICAKKwkJCQlkZXYtPm5ldGRldi0+c3RhdHMudHhfZXJyb3JzKys7CisJCQkJZGV2LT5uZXRkZXYtPnN0YXRzLnR4X2Ryb3BwZWQrKzsKIAkJCX0KIAkJCWRldi0+dHhfYnVmZi5sZW4gPSAwOwogCQl9CkBAIC00OTMsOCArNDkzLDggQEAKIAkJCiAJaWYgKChza2I9ZGV2LT50eF9za2IpICE9IE5VTEwpIHsKIAkJZGV2LT50eF9za2IgPSBOVUxMOwotCQlkZXYtPnN0YXRzLnR4X3BhY2tldHMrKzsJCSAgICAgIAotCQlkZXYtPnN0YXRzLnR4X2J5dGVzICs9IHNrYi0+bGVuOworCQlkZXYtPm5ldGRldi0+c3RhdHMudHhfcGFja2V0cysrOworCQlkZXYtPm5ldGRldi0+c3RhdHMudHhfYnl0ZXMgKz0gc2tiLT5sZW47CiAJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CiAJfQogCkBAIC01NDgsNyArNTQ4LDcgQEAKIAkJICoganVzdCB1cGRhdGUgc3RhdHMgYW5kIHNldCBtZWRpYSBidXN5CiAJCSAqLwogCQlpcmRhX2RldmljZV9zZXRfbWVkaWFfYnVzeShkZXYtPm5ldGRldiwgVFJVRSk7Ci0JCWRldi0+c3RhdHMucnhfZHJvcHBlZCsrOworCQlkZXYtPm5ldGRldi0+c3RhdHMucnhfZHJvcHBlZCsrOwogCQlJUkRBX0RFQlVHKDAsICIlczsgcngtZHJvcDogJXpkXG4iLCBfX2Z1bmNfXywgY291bnQpOwogCQlyZXR1cm4gMDsKIAl9CkBAIC01NTcsNyArNTU3LDcgQEAKIAlpZiAobGlrZWx5KGF0b21pY19yZWFkKCZkZXYtPmVuYWJsZV9yeCkpKSB7CiAJCXdoaWxlIChjb3VudC0tKQogCQkJLyogVW53cmFwIGFuZCBkZXN0dWZmIG9uZSBieXRlICovCi0JCQlhc3luY191bndyYXBfY2hhcihkZXYtPm5ldGRldiwgJmRldi0+c3RhdHMsIAorCQkJYXN5bmNfdW53cmFwX2NoYXIoZGV2LT5uZXRkZXYsICZkZXYtPm5ldGRldi0+c3RhdHMsCiAJCQkJCSAgJmRldi0+cnhfYnVmZiwgKmNwKyspOwogCX0gZWxzZSB7CiAJCXdoaWxlIChjb3VudC0tKSB7CkBAIC01ODIsMTMgKzU4Miw2IEBACiAKIC8qIGNhbGxiYWNrcyBmcm9tIG5ldHdvcmsgbGF5ZXIgKi8KIAotc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzaXJkZXZfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KQotewotCXN0cnVjdCBzaXJfZGV2ICpkZXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKLQotCXJldHVybiAoZGV2KSA/ICZkZXYtPnN0YXRzIDogTlVMTDsKLX0KLQogc3RhdGljIGludCBzaXJkZXZfaGFyZF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KQogewogCXN0cnVjdCBzaXJfZGV2ICpkZXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKQEAgLTY1NCw3ICs2NDcsNyBAQAogCSAqLwogCWF0b21pY19zZXQoJmRldi0+ZW5hYmxlX3J4LCAwKTsKIAlpZiAodW5saWtlbHkoc2lyZGV2X2lzX3JlY2VpdmluZyhkZXYpKSkKLQkJZGV2LT5zdGF0cy5jb2xsaXNpb25zKys7CisJCWRldi0+bmV0ZGV2LT5zdGF0cy5jb2xsaXNpb25zKys7CiAKIAlhY3R1YWwgPSBkZXYtPmRydi0+ZG9fd3JpdGUoZGV2LCBkZXYtPnR4X2J1ZmYuZGF0YSwgZGV2LT50eF9idWZmLmxlbik7CiAKQEAgLTY2OSw4ICs2NjIsOCBAQAogCQlJUkRBX0VSUk9SKCIlczogZHJ2LT5kb193cml0ZSBmYWlsZWQgKCVkKVxuIiwKIAkJCSAgIF9fZnVuY19fLCBhY3R1YWwpOwogCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOwotCQlkZXYtPnN0YXRzLnR4X2Vycm9ycysrOwkJICAgICAgCi0JCWRldi0+c3RhdHMudHhfZHJvcHBlZCsrOwkJICAgICAgCisJCWRldi0+bmV0ZGV2LT5zdGF0cy50eF9lcnJvcnMrKzsKKwkJZGV2LT5uZXRkZXYtPnN0YXRzLnR4X2Ryb3BwZWQrKzsKIAkJbmV0aWZfd2FrZV9xdWV1ZShuZGV2KTsKIAl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT50eF9sb2NrLCBmbGFncyk7CkBAIC05MTgsNyArOTExLDYgQEAKIAluZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBzaXJkZXZfaGFyZF94bWl0OwogCW5kZXYtPm9wZW4gPSBzaXJkZXZfb3BlbjsKIAluZGV2LT5zdG9wID0gc2lyZGV2X2Nsb3NlOwotCW5kZXYtPmdldF9zdGF0cyA9IHNpcmRldl9nZXRfc3RhdHM7CiAJbmRldi0+ZG9faW9jdGwgPSBzaXJkZXZfaW9jdGw7CiAKIAlpZiAocmVnaXN0ZXJfbmV0ZGV2KG5kZXYpKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pcmRhL3Ntc2MtaXJjYzIuYyBiL2RyaXZlcnMvbmV0L2lyZGEvc21zYy1pcmNjMi5jCmluZGV4IDVkMDllMTUuLmRkNzNjY2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2lyZGEvc21zYy1pcmNjMi5jCisrKyBiL2RyaXZlcnMvbmV0L2lyZGEvc21zYy1pcmNjMi5jCkBAIC0xNTAsNyArMTUwLDYgQEAKIC8qIFByaXZhdGUgZGF0YSBmb3IgZWFjaCBpbnN0YW5jZSAqLwogc3RydWN0IHNtc2NfaXJjY19jYiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsgICAgIC8qIFllcyEgd2UgYXJlIHNvbWUga2luZCBvZiBuZXRkZXZpY2UgKi8KLQlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKIAlzdHJ1Y3QgaXJsYXBfY2IgICAgKmlybGFwOyAvKiBUaGUgbGluayBsYXllciB3ZSBhcmUgYmluZGVkIHRvICovCiAKIAljaGlwaW9fdCBpbzsgICAgICAgICAgICAgICAvKiBJckRBIGNvbnRyb2xsZXIgaW5mb3JtYXRpb24gKi8KQEAgLTIxNSw3ICsyMTQsNiBAQAogI2lmIFNNU0NfSVJDQzJfQ19ORVRfVElNRU9VVAogc3RhdGljIHZvaWQgc21zY19pcmNjX3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiAjZW5kaWYKLXN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc21zY19pcmNjX25ldF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiBzdGF0aWMgaW50IHNtc2NfaXJjY19pc19yZWNlaXZpbmcoc3RydWN0IHNtc2NfaXJjY19jYiAqc2VsZik7CiBzdGF0aWMgdm9pZCBzbXNjX2lyY2NfcHJvYmVfdHJhbnNjZWl2ZXIoc3RydWN0IHNtc2NfaXJjY19jYiAqc2VsZik7CiBzdGF0aWMgdm9pZCBzbXNjX2lyY2Nfc2V0X3RyYW5zY2VpdmVyX2Zvcl9zcGVlZChzdHJ1Y3Qgc21zY19pcmNjX2NiICpzZWxmLCB1MzIgc3BlZWQpOwpAQCAtNTI5LDcgKzUyNyw2IEBACiAJZGV2LT5vcGVuICAgICAgICAgICAgPSBzbXNjX2lyY2NfbmV0X29wZW47CiAJZGV2LT5zdG9wICAgICAgICAgICAgPSBzbXNjX2lyY2NfbmV0X2Nsb3NlOwogCWRldi0+ZG9faW9jdGwgICAgICAgID0gc21zY19pcmNjX25ldF9pb2N0bDsKLQlkZXYtPmdldF9zdGF0cwkgICAgID0gc21zY19pcmNjX25ldF9nZXRfc3RhdHM7CiAKIAlzZWxmID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlzZWxmLT5uZXRkZXYgPSBkZXY7CkBAIC04MzQsMTMgKzgzMSw2IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzbXNjX2lyY2NfbmV0X2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQotewotCXN0cnVjdCBzbXNjX2lyY2NfY2IgKnNlbGYgPSBuZXRkZXZfcHJpdihkZXYpOwotCi0JcmV0dXJuICZzZWxmLT5zdGF0czsKLX0KLQogI2lmIFNNU0NfSVJDQzJfQ19ORVRfVElNRU9VVAogLyoKICAqIEZ1bmN0aW9uIHNtc2NfaXJjY190aW1lb3V0IChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQpAQCAtOTIwLDcgKzkxMCw3IEBACiAJc2VsZi0+dHhfYnVmZi5sZW4gPSBhc3luY193cmFwX3NrYihza2IsIHNlbGYtPnR4X2J1ZmYuZGF0YSwKIAkJCQkJICAgc2VsZi0+dHhfYnVmZi50cnVlc2l6ZSk7CiAKLQlzZWxmLT5zdGF0cy50eF9ieXRlcyArPSBzZWxmLT50eF9idWZmLmxlbjsKKwlkZXYtPnN0YXRzLnR4X2J5dGVzICs9IHNlbGYtPnR4X2J1ZmYubGVuOwogCiAJLyogVHVybiBvbiB0cmFuc21pdCBmaW5pc2hlZCBpbnRlcnJ1cHQuIFdpbGwgZmlyZSBpbW1lZGlhdGVseSEgICovCiAJb3V0YihVQVJUX0lFUl9USFJJLCBzZWxmLT5pby5zaXJfYmFzZSArIFVBUlRfSUVSKTsKQEAgLTEzMjAsMTYgKzEzMTAsMTYgQEAKIAkvKiBDaGVjayBmb3IgdW5kZXJydW4hICovCiAJcmVnaXN0ZXJfYmFuayhpb2Jhc2UsIDApOwogCWlmIChpbmIoaW9iYXNlICsgSVJDQ19MU1IpICYgSVJDQ19MU1JfVU5ERVJSVU4pIHsKLQkJc2VsZi0+c3RhdHMudHhfZXJyb3JzKys7Ci0JCXNlbGYtPnN0YXRzLnR4X2ZpZm9fZXJyb3JzKys7CisJCXNlbGYtPm5ldGRldi0+c3RhdHMudHhfZXJyb3JzKys7CisJCXNlbGYtPm5ldGRldi0+c3RhdHMudHhfZmlmb19lcnJvcnMrKzsKIAogCQkvKiBSZXNldCBlcnJvciBjb25kaXRpb24gKi8KIAkJcmVnaXN0ZXJfYmFuayhpb2Jhc2UsIDApOwogCQlvdXRiKElSQ0NfTUFTVEVSX0VSUk9SX1JFU0VULCBpb2Jhc2UgKyBJUkNDX01BU1RFUik7CiAJCW91dGIoMHgwMCwgaW9iYXNlICsgSVJDQ19NQVNURVIpOwogCX0gZWxzZSB7Ci0JCXNlbGYtPnN0YXRzLnR4X3BhY2tldHMrKzsKLQkJc2VsZi0+c3RhdHMudHhfYnl0ZXMgKz0gc2VsZi0+dHhfYnVmZi5sZW47CisJCXNlbGYtPm5ldGRldi0+c3RhdHMudHhfcGFja2V0cysrOworCQlzZWxmLT5uZXRkZXYtPnN0YXRzLnR4X2J5dGVzICs9IHNlbGYtPnR4X2J1ZmYubGVuOwogCX0KIAogCS8qIENoZWNrIGlmIGl0J3MgdGltZSB0byBjaGFuZ2UgdGhlIHNwZWVkICovCkBAIC0xNDI5LDE1ICsxNDE5LDE1IEBACiAKIAkvKiBMb29rIGZvciBlcnJvcnMgKi8KIAlpZiAobHNyICYgKElSQ0NfTFNSX0ZSQU1FX0VSUk9SIHwgSVJDQ19MU1JfQ1JDX0VSUk9SIHwgSVJDQ19MU1JfU0laRV9FUlJPUikpIHsKLQkJc2VsZi0+c3RhdHMucnhfZXJyb3JzKys7CisJCXNlbGYtPm5ldGRldi0+c3RhdHMucnhfZXJyb3JzKys7CiAJCWlmIChsc3IgJiBJUkNDX0xTUl9GUkFNRV9FUlJPUikKLQkJCXNlbGYtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycysrOworCQkJc2VsZi0+bmV0ZGV2LT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKIAkJaWYgKGxzciAmIElSQ0NfTFNSX0NSQ19FUlJPUikKLQkJCXNlbGYtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKKwkJCXNlbGYtPm5ldGRldi0+c3RhdHMucnhfY3JjX2Vycm9ycysrOwogCQlpZiAobHNyICYgSVJDQ19MU1JfU0laRV9FUlJPUikKLQkJCXNlbGYtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKKwkJCXNlbGYtPm5ldGRldi0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOwogCQlpZiAobHNyICYgKElSQ0NfTFNSX1VOREVSUlVOIHwgSVJDQ19MU1JfT1ZFUlJVTikpCi0JCQlzZWxmLT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7CisJCQlzZWxmLT5uZXRkZXYtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKIAkJcmV0dXJuOwogCX0KIApAQCAtMTQ2MCw4ICsxNDUwLDggQEAKIAlza2JfcmVzZXJ2ZShza2IsIDEpOwogCiAJbWVtY3B5KHNrYl9wdXQoc2tiLCBsZW4pLCBzZWxmLT5yeF9idWZmLmRhdGEsIGxlbik7Ci0Jc2VsZi0+c3RhdHMucnhfcGFja2V0cysrOwotCXNlbGYtPnN0YXRzLnJ4X2J5dGVzICs9IGxlbjsKKwlzZWxmLT5uZXRkZXYtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwlzZWxmLT5uZXRkZXYtPnN0YXRzLnJ4X2J5dGVzICs9IGxlbjsKIAogCXNrYi0+ZGV2ID0gc2VsZi0+bmV0ZGV2OwogCXNrYl9yZXNldF9tYWNfaGVhZGVyKHNrYik7CkBAIC0xNDg5LDcgKzE0NzksNyBAQAogICAgICAgICAgKiBhc3luY191bndyYXBfY2hhciB3aWxsIGRlbGl2ZXIgYWxsIGZvdW5kIGZyYW1lcwogCSAqLwogCWRvIHsKLQkJYXN5bmNfdW53cmFwX2NoYXIoc2VsZi0+bmV0ZGV2LCAmc2VsZi0+c3RhdHMsICZzZWxmLT5yeF9idWZmLAorCQlhc3luY191bndyYXBfY2hhcihzZWxmLT5uZXRkZXYsICZzZWxmLT5uZXRkZXYtPnN0YXRzLCAmc2VsZi0+cnhfYnVmZiwKIAkJCQkgIGluYihpb2Jhc2UgKyBVQVJUX1JYKSk7CiAKIAkJLyogTWFrZSBzdXJlIHdlIGRvbid0IHN0YXkgaGVyZSB0byBsb25nICovCkBAIC0xOTkyLDcgKzE5ODIsNyBAQAogCQkJLyogVGVsbCBuZXR3b3JrIGxheWVyIHRoYXQgd2Ugd2FudCBtb3JlIGZyYW1lcyAqLwogCQkJbmV0aWZfd2FrZV9xdWV1ZShzZWxmLT5uZXRkZXYpOwogCQl9Ci0JCXNlbGYtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwkJc2VsZi0+bmV0ZGV2LT5zdGF0cy50eF9wYWNrZXRzKys7CiAKIAkJaWYgKHNlbGYtPmlvLnNwZWVkIDw9IDExNTIwMCkgewogCQkJLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lyZGEvc3RpcjQyMDAuYyBiL2RyaXZlcnMvbmV0L2lyZGEvc3RpcjQyMDAuYwppbmRleCBjYTRjZDkyLi44YjE2NThjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9pcmRhL3N0aXI0MjAwLmMKKysrIGIvZHJpdmVycy9uZXQvaXJkYS9zdGlyNDIwMC5jCkBAIC0xNjQsNyArMTY0LDcgQEAKICAgICAgICAgc3RydWN0IHVzYl9kZXZpY2UgKnVzYmRldjsgICAgICAvKiBpbml0OiBwcm9iZV9pcmRhICovCiAgICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7ICAgICAgLyogbmV0d29yayBsYXllciAqLwogICAgICAgICBzdHJ1Y3QgaXJsYXBfY2IgICAqaXJsYXA7ICAgICAgIC8qIFRoZSBsaW5rIGxheWVyIHdlIGFyZSBiaW5kZWQgdG8gKi8KLSAgICAgICAgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CS8qIG5ldHdvcmsgc3RhdGlzdGljcyAqLworCiAgICAgICAgIHN0cnVjdCBxb3NfaW5mbyAgIHFvczsKIAl1bnNpZ25lZCAJICBzcGVlZDsJLyogQ3VycmVudCBzcGVlZCAqLwogCkBAIC0zMjMsMTYgKzMyMywxNiBAQAogCQlwcl9kZWJ1ZygiJXM6IHNob3J0IGZyYW1lIGxlbiAlZFxuIiwKIAkJCSBzdGlyLT5uZXRkZXYtPm5hbWUsIGxlbik7CiAKLQkJKytzdGlyLT5zdGF0cy5yeF9lcnJvcnM7Ci0JCSsrc3Rpci0+c3RhdHMucnhfbGVuZ3RoX2Vycm9yczsKKwkJKytzdGlyLT5uZXRkZXYtPnN0YXRzLnJ4X2Vycm9yczsKKwkJKytzdGlyLT5uZXRkZXYtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnM7CiAJCXJldHVybjsKIAl9CiAKIAlmY3MgPSB+KGNyYzMyX2xlKH4wLCByeF9idWZmLT5kYXRhLCBsZW4pKTsKIAlpZiAoZmNzICE9IGdldF91bmFsaWduZWRfbGUzMihyeF9idWZmLT5kYXRhICsgbGVuKSkgewogCQlwcl9kZWJ1ZygiY3JjIGVycm9yIGNhbGMgMHgleCBsZW4gJWRcbiIsIGZjcywgbGVuKTsKLQkJc3Rpci0+c3RhdHMucnhfZXJyb3JzKys7Ci0JCXN0aXItPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKKwkJc3Rpci0+bmV0ZGV2LT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJc3Rpci0+bmV0ZGV2LT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7CiAJCXJldHVybjsKIAl9CiAKQEAgLTM0MCw3ICszNDAsNyBAQAogCWlmIChsZW4gPCBJUkRBX1JYX0NPUFlfVEhSRVNIT0xEKSB7CiAJCW5za2IgPSBkZXZfYWxsb2Nfc2tiKGxlbiArIDEpOwogCQlpZiAodW5saWtlbHkoIW5za2IpKSB7Ci0JCQkrK3N0aXItPnN0YXRzLnJ4X2Ryb3BwZWQ7CisJCQkrK3N0aXItPm5ldGRldi0+c3RhdHMucnhfZHJvcHBlZDsKIAkJCXJldHVybjsKIAkJfQogCQlza2JfcmVzZXJ2ZShuc2tiLCAxKTsKQEAgLTM0OSw3ICszNDksNyBAQAogCX0gZWxzZSB7CiAJCW5za2IgPSBkZXZfYWxsb2Nfc2tiKHJ4X2J1ZmYtPnRydWVzaXplKTsKIAkJaWYgKHVubGlrZWx5KCFuc2tiKSkgewotCQkJKytzdGlyLT5zdGF0cy5yeF9kcm9wcGVkOworCQkJKytzdGlyLT5uZXRkZXYtPnN0YXRzLnJ4X2Ryb3BwZWQ7CiAJCQlyZXR1cm47CiAJCX0KIAkJc2tiX3Jlc2VydmUobnNrYiwgMSk7CkBAIC0zNjYsOCArMzY2LDggQEAKIAogCW5ldGlmX3J4KHNrYik7CiAKLQlzdGlyLT5zdGF0cy5yeF9wYWNrZXRzKys7Ci0Jc3Rpci0+c3RhdHMucnhfYnl0ZXMgKz0gbGVuOworCXN0aXItPm5ldGRldi0+c3RhdHMucnhfcGFja2V0cysrOworCXN0aXItPm5ldGRldi0+c3RhdHMucnhfYnl0ZXMgKz0gbGVuOwogCiAJcnhfYnVmZi0+ZGF0YSA9IHJ4X2J1ZmYtPmhlYWQ7CiAJcnhfYnVmZi0+bGVuID0gMDsKQEAgLTQzNyw3ICs0MzcsNyBAQAogCQlpZiAodW5saWtlbHkocnhfYnVmZi0+bGVuID49IHJ4X2J1ZmYtPnRydWVzaXplKSkgewogCQkJcHJfZGVidWcoIiVzOiBmaXIgZnJhbWUgZXhjZWVkcyAlZFxuIiwKIAkJCQkgc3Rpci0+bmV0ZGV2LT5uYW1lLCByeF9idWZmLT50cnVlc2l6ZSk7Ci0JCQkrK3N0aXItPnN0YXRzLnJ4X292ZXJfZXJyb3JzOworCQkJKytzdGlyLT5uZXRkZXYtPnN0YXRzLnJ4X292ZXJfZXJyb3JzOwogCQkJZ290byBlcnJvcl9yZWNvdmVyeTsKIAkJfQogCkBAIC00NDUsMTAgKzQ0NSwxMCBAQAogCQljb250aW51ZTsKIAogCWZyYW1lX2Vycm9yOgotCQkrK3N0aXItPnN0YXRzLnJ4X2ZyYW1lX2Vycm9yczsKKwkJKytzdGlyLT5uZXRkZXYtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9yczsKIAogCWVycm9yX3JlY292ZXJ5OgotCQkrK3N0aXItPnN0YXRzLnJ4X2Vycm9yczsKKwkJKytzdGlyLT5uZXRkZXYtPnN0YXRzLnJ4X2Vycm9yczsKIAkJcnhfYnVmZi0+c3RhdGUgPSBPVVRTSURFX0ZSQU1FOwogCQlyeF9idWZmLT5pbl9mcmFtZSA9IEZBTFNFOwogCX0KQEAgLTQ2MSw3ICs0NjEsNyBAQAogCWludCBpOwogCiAJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQotCQlhc3luY191bndyYXBfY2hhcihzdGlyLT5uZXRkZXYsICZzdGlyLT5zdGF0cywKKwkJYXN5bmNfdW53cmFwX2NoYXIoc3Rpci0+bmV0ZGV2LCAmc3Rpci0+bmV0ZGV2LT5zdGF0cywKIAkJCQkgICZzdGlyLT5yeF9idWZmLCBieXRlc1tpXSk7CiB9CiAKQEAgLTY5Miw3ICs2OTIsNyBAQAogCXVzYl9raWxsX3VyYihzdGlyLT5yeF91cmIpOwogCiAJaWYgKHN0aXItPnJ4X2J1ZmYuaW5fZnJhbWUpIAotCQlzdGlyLT5zdGF0cy5jb2xsaXNpb25zKys7CisJCXN0aXItPm5ldGRldi0+c3RhdHMuY29sbGlzaW9ucysrOwogfQogLyoKICAqIFdyYXAgZGF0YSBpbiBzb2NrZXQgYnVmZmVyIGFuZCBzZW5kIGl0LgpAQCAtNzE4LDE1ICs3MTgsMTUgQEAKIAlpZiAoIWZpcnN0X2ZyYW1lKQogCQlmaWZvX3R4d2FpdChzdGlyLCB3cmFwbGVuKTsKIAotCXN0aXItPnN0YXRzLnR4X3BhY2tldHMrKzsKLQlzdGlyLT5zdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKKwlzdGlyLT5uZXRkZXYtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwlzdGlyLT5uZXRkZXYtPnN0YXRzLnR4X2J5dGVzICs9IHNrYi0+bGVuOwogCXN0aXItPm5ldGRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOwogCXByX2RlYnVnKCJzZW5kICVkICglZClcbiIsIHNrYi0+bGVuLCB3cmFwbGVuKTsKIAogCWlmICh1c2JfYnVsa19tc2coc3Rpci0+dXNiZGV2LCB1c2Jfc25kYnVsa3BpcGUoc3Rpci0+dXNiZGV2LCAxKSwKIAkJCSBzdGlyLT5pb19idWYsIHdyYXBsZW4sCiAJCQkgTlVMTCwgVFJBTlNNSVRfVElNRU9VVCkpCi0JCXN0aXItPnN0YXRzLnR4X2Vycm9ycysrOworCQlzdGlyLT5uZXRkZXYtPnN0YXRzLnR4X2Vycm9ycysrOwogfQogCiAvKgpAQCAtMTAwOCwxNSArMTAwOCw2IEBACiB9CiAKIC8qCi0gKiBHZXQgZGV2aWNlIHN0YXRzIChmb3IgL3Byb2MvbmV0L2RldiBhbmQgaWZjb25maWcpCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3Rpcl9uZXRfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCi17Ci0Jc3RydWN0IHN0aXJfY2IgKnN0aXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwotCXJldHVybiAmc3Rpci0+c3RhdHM7Ci19Ci0KLS8qCiAgKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGJ5IHRoZSBVU0Igc3Vic3lzdGVtIGZvciBlYWNoIG5ldyBkZXZpY2UKICAqIGluIHRoZSBzeXN0ZW0uIFdlIG5lZWQgdG8gY2hlY2sgaWYgdGhlIGRldmljZSBpcyBvdXJzLCBhbmQgaW4KICAqIHRoaXMgY2FzZSBzdGFydCBoYW5kbGluZyBpdC4KQEAgLTEwNjYsNyArMTA1Nyw2IEBACiAJbmV0LT5oYXJkX3N0YXJ0X3htaXQgPSBzdGlyX2hhcmRfeG1pdDsKIAluZXQtPm9wZW4gICAgICAgICAgICA9IHN0aXJfbmV0X29wZW47CiAJbmV0LT5zdG9wICAgICAgICAgICAgPSBzdGlyX25ldF9jbG9zZTsKLQluZXQtPmdldF9zdGF0cwkgICAgID0gc3Rpcl9uZXRfZ2V0X3N0YXRzOwogCW5ldC0+ZG9faW9jdGwgICAgICAgID0gc3Rpcl9uZXRfaW9jdGw7CiAKIAlyZXQgPSByZWdpc3Rlcl9uZXRkZXYobmV0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lyZGEvdmlhLWlyY2MuYyBiL2RyaXZlcnMvbmV0L2lyZGEvdmlhLWlyY2MuYwppbmRleCA3NGM3OGNmLi44YjNlNTQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9pcmRhL3ZpYS1pcmNjLmMKKysrIGIvZHJpdmVycy9uZXQvaXJkYS92aWEtaXJjYy5jCkBAIC0xMDEsOCArMTAxLDYgQEAKIHN0YXRpYyBpbnQgdmlhX2lyY2NfbmV0X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogc3RhdGljIGludCB2aWFfaXJjY19uZXRfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICpycSwKIAkJCSAgICAgIGludCBjbWQpOwotc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICp2aWFfaXJjY19uZXRfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlCi0JCQkJCQkgICAgICAgKmRldik7CiBzdGF0aWMgdm9pZCB2aWFfaXJjY19jaGFuZ2VfZG9uZ2xlX3NwZWVkKGludCBpb2Jhc2UsIGludCBzcGVlZCwKIAkJCQkJIGludCBkb25nbGVfaWQpOwogc3RhdGljIGludCBSeFRpbWVySGFuZGxlcihzdHJ1Y3QgdmlhX2lyY2NfY2IgKnNlbGYsIGludCBpb2Jhc2UpOwpAQCAtNDM0LDcgKzQzMiw2IEBACiAJZGV2LT5vcGVuID0gdmlhX2lyY2NfbmV0X29wZW47CiAJZGV2LT5zdG9wID0gdmlhX2lyY2NfbmV0X2Nsb3NlOwogCWRldi0+ZG9faW9jdGwgPSB2aWFfaXJjY19uZXRfaW9jdGw7Ci0JZGV2LT5nZXRfc3RhdHMgPSB2aWFfaXJjY19uZXRfZ2V0X3N0YXRzOwogCiAJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CiAJaWYgKGVycikKQEAgLTg1NSw3ICs4NTIsNyBAQAogCSAgICBhc3luY193cmFwX3NrYihza2IsIHNlbGYtPnR4X2J1ZmYuZGF0YSwKIAkJCSAgIHNlbGYtPnR4X2J1ZmYudHJ1ZXNpemUpOwogCi0Jc2VsZi0+c3RhdHMudHhfYnl0ZXMgKz0gc2VsZi0+dHhfYnVmZi5sZW47CisJZGV2LT5zdGF0cy50eF9ieXRlcyArPSBzZWxmLT50eF9idWZmLmxlbjsKIAkvKiBTZW5kIHRoaXMgZnJhbWUgd2l0aCBvbGQgc3BlZWQgKi8KIAlTZXRCYXVkUmF0ZShpb2Jhc2UsIHNlbGYtPmlvLnNwZWVkKTsKIAlTZXRQdWxzZVdpZHRoKGlvYmFzZSwgMTIpOwpAQCAtOTIxLDcgKzkxOCw3IEBACiAJc2VsZi0+dHhfZmlmby5xdWV1ZVtzZWxmLT50eF9maWZvLmZyZWVdLmxlbiA9IHNrYi0+bGVuOwogCiAJc2VsZi0+dHhfZmlmby50YWlsICs9IHNrYi0+bGVuOwotCXNlbGYtPnN0YXRzLnR4X2J5dGVzICs9IHNrYi0+bGVuOworCWRldi0+c3RhdHMudHhfYnl0ZXMgKz0gc2tiLT5sZW47CiAJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShza2IsCiAJCSAgICAgIHNlbGYtPnR4X2ZpZm8ucXVldWVbc2VsZi0+dHhfZmlmby5mcmVlXS5zdGFydCwgc2tiLT5sZW4pOwogCXNlbGYtPnR4X2ZpZm8ubGVuKys7CkBAIC05OTAsMTIgKzk4NywxMiBAQAogCS8qIENsZWFyIGJpdCwgYnkgd3JpdGluZyAxIGludG8gaXQgKi8KIAlUeF9zdGF0dXMgPSBHZXRUWFN0YXR1cyhpb2Jhc2UpOwogCWlmIChUeF9zdGF0dXMgJiAweDA4KSB7Ci0JCXNlbGYtPnN0YXRzLnR4X2Vycm9ycysrOwotCQlzZWxmLT5zdGF0cy50eF9maWZvX2Vycm9ycysrOworCQlzZWxmLT5uZXRkZXYtPnN0YXRzLnR4X2Vycm9ycysrOworCQlzZWxmLT5uZXRkZXYtPnN0YXRzLnR4X2ZpZm9fZXJyb3JzKys7CiAJCWh3cmVzZXQoc2VsZik7CiAvLyBob3cgdG8gY2xlYXIgdW5kZXJycnVuID8KIAl9IGVsc2UgewotCQlzZWxmLT5zdGF0cy50eF9wYWNrZXRzKys7CisJCXNlbGYtPm5ldGRldi0+c3RhdHMudHhfcGFja2V0cysrOwogCQlSZXNldENoaXAoaW9iYXNlLCAzKTsKIAkJUmVzZXRDaGlwKGlvYmFzZSwgNCk7CiAJfQpAQCAtMTExOSw4ICsxMTE2LDggQEAKIAkJfQogCQkvLyBNb3ZlIHRvIG5leHQgZnJhbWUgCiAJCXNlbGYtPnJ4X2J1ZmYuZGF0YSArPSBsZW47Ci0JCXNlbGYtPnN0YXRzLnJ4X2J5dGVzICs9IGxlbjsKLQkJc2VsZi0+c3RhdHMucnhfcGFja2V0cysrOworCQlzZWxmLT5uZXRkZXYtPnN0YXRzLnJ4X2J5dGVzICs9IGxlbjsKKwkJc2VsZi0+bmV0ZGV2LT5zdGF0cy5yeF9wYWNrZXRzKys7CiAJCXNrYi0+ZGV2ID0gc2VsZi0+bmV0ZGV2OwogCQlza2JfcmVzZXRfbWFjX2hlYWRlcihza2IpOwogCQlza2ItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfSVJEQSk7CkBAIC0xMTgwLDcgKzExNzcsNyBAQAogCQkgKi8KIAkJaWYgKChza2IgPT0gTlVMTCkgfHwgKHNrYi0+ZGF0YSA9PSBOVUxMKQogCQkgICAgfHwgKHNlbGYtPnJ4X2J1ZmYuZGF0YSA9PSBOVUxMKSB8fCAobGVuIDwgNikpIHsKLQkJCXNlbGYtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJCXNlbGYtPm5ldGRldi0+c3RhdHMucnhfZHJvcHBlZCsrOwogCQkJcmV0dXJuIFRSVUU7CiAJCX0KIAkJc2tiX3Jlc2VydmUoc2tiLCAxKTsKQEAgLTExOTIsOCArMTE4OSw4IEBACiAKIAkJLy8gTW92ZSB0byBuZXh0IGZyYW1lIAogCQlzZWxmLT5yeF9idWZmLmRhdGEgKz0gbGVuOwotCQlzZWxmLT5zdGF0cy5yeF9ieXRlcyArPSBsZW47Ci0JCXNlbGYtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwkJc2VsZi0+bmV0ZGV2LT5zdGF0cy5yeF9ieXRlcyArPSBsZW47CisJCXNlbGYtPm5ldGRldi0+c3RhdHMucnhfcGFja2V0cysrOwogCQlza2ItPmRldiA9IHNlbGYtPm5ldGRldjsKIAkJc2tiX3Jlc2V0X21hY19oZWFkZXIoc2tiKTsKIAkJc2tiLT5wcm90b2NvbCA9IGh0b25zKEVUSF9QX0lSREEpOwpAQCAtMTIyMCwxMyArMTIxNywxMyBAQAogCUlSREFfREVCVUcoMiwgIiVzKCk6IGxlbj0leFxuIiwgX19mdW5jX18sIGxlbik7CiAKIAlpZiAoKGxlbiAtIDQpIDwgMikgewotCQlzZWxmLT5zdGF0cy5yeF9kcm9wcGVkKys7CisJCXNlbGYtPm5ldGRldi0+c3RhdHMucnhfZHJvcHBlZCsrOwogCQlyZXR1cm4gRkFMU0U7CiAJfQogCiAJc2tiID0gZGV2X2FsbG9jX3NrYihsZW4gKyAxKTsKIAlpZiAoc2tiID09IE5VTEwpIHsKLQkJc2VsZi0+c3RhdHMucnhfZHJvcHBlZCsrOworCQlzZWxmLT5uZXRkZXYtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKIAkJcmV0dXJuIEZBTFNFOwogCX0KIAlza2JfcmVzZXJ2ZShza2IsIDEpOwpAQCAtMTIzOCw4ICsxMjM1LDggQEAKIAkJc3RfZmlmby0+dGFpbCA9IDA7CiAJLy8gTW92ZSB0byBuZXh0IGZyYW1lIAogCXNlbGYtPnJ4X2J1ZmYuZGF0YSArPSBsZW47Ci0Jc2VsZi0+c3RhdHMucnhfYnl0ZXMgKz0gbGVuOwotCXNlbGYtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwlzZWxmLT5uZXRkZXYtPnN0YXRzLnJ4X2J5dGVzICs9IGxlbjsKKwlzZWxmLT5uZXRkZXYtPnN0YXRzLnJ4X3BhY2tldHMrKzsKIAlza2ItPmRldiA9IHNlbGYtPm5ldGRldjsKIAlza2JfcmVzZXRfbWFjX2hlYWRlcihza2IpOwogCXNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9JUkRBKTsKQEAgLTEyOTUsNyArMTI5Miw3IEBACiAJCQkgKi8KIAkJCWlmICgoc2tiID09IE5VTEwpIHx8IChza2ItPmRhdGEgPT0gTlVMTCkKIAkJCSAgICB8fCAoc2VsZi0+cnhfYnVmZi5kYXRhID09IE5VTEwpIHx8IChsZW4gPCA2KSkgewotCQkJCXNlbGYtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJCQlzZWxmLT5uZXRkZXYtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKIAkJCQljb250aW51ZTsKIAkJCX0KIAkJCXNrYl9yZXNlcnZlKHNrYiwgMSk7CkBAIC0xMzA3LDggKzEzMDQsOCBAQAogCiAJCQkvLyBNb3ZlIHRvIG5leHQgZnJhbWUgCiAJCQlzZWxmLT5yeF9idWZmLmRhdGEgKz0gbGVuOwotCQkJc2VsZi0+c3RhdHMucnhfYnl0ZXMgKz0gbGVuOwotCQkJc2VsZi0+c3RhdHMucnhfcGFja2V0cysrOworCQkJc2VsZi0+bmV0ZGV2LT5zdGF0cy5yeF9ieXRlcyArPSBsZW47CisJCQlzZWxmLT5uZXRkZXYtPnN0YXRzLnJ4X3BhY2tldHMrKzsKIAkJCXNrYi0+ZGV2ID0gc2VsZi0+bmV0ZGV2OwogCQkJc2tiX3Jlc2V0X21hY19oZWFkZXIoc2tiKTsKIAkJCXNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9JUkRBKTsKQEAgLTE1MjMsNyArMTUyMCw3IEBACiAKIAlJUkRBX0FTU0VSVChkZXYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CiAJc2VsZiA9IG5ldGRldl9wcml2KGRldik7Ci0Jc2VsZi0+c3RhdHMucnhfcGFja2V0cyA9IDA7CisJZGV2LT5zdGF0cy5yeF9wYWNrZXRzID0gMDsKIAlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAwOyk7CiAJaW9iYXNlID0gc2VsZi0+aW8uZmlyX2Jhc2U7CiAJaWYgKHJlcXVlc3RfaXJxKHNlbGYtPmlvLmlycSwgdmlhX2lyY2NfaW50ZXJydXB0LCAwLCBkZXYtPm5hbWUsIGRldikpIHsKQEAgLTE2NjAsMTQgKzE2NTcsNiBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqdmlhX2lyY2NfbmV0X2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZQotCQkJCQkJICAgICAgICpkZXYpCi17Ci0Jc3RydWN0IHZpYV9pcmNjX2NiICpzZWxmID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQotCXJldHVybiAmc2VsZi0+c3RhdHM7Ci19Ci0KIE1PRFVMRV9BVVRIT1IoIlZJQSBUZWNobm9sb2dpZXMsaW5jIik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIlZJQSBJckRBIERldmljZSBEcml2ZXIiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lyZGEvdmlhLWlyY2MuaCBiL2RyaXZlcnMvbmV0L2lyZGEvdmlhLWlyY2MuaAppbmRleCA0MDNjM2Y3Li5kOWQxZGIwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9pcmRhL3ZpYS1pcmNjLmgKKysrIGIvZHJpdmVycy9uZXQvaXJkYS92aWEtaXJjYy5oCkBAIC05NSw3ICs5NSw2IEBACiAJc3RydWN0IHR4X2ZpZm8gdHhfZmlmbzsJLyogSW5mbyBhYm91dCBmcmFtZXMgdG8gYmUgdHJhbnNtaXR0ZWQgKi8KIAogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7CS8qIFllcyEgd2UgYXJlIHNvbWUga2luZCBvZiBuZXRkZXZpY2UgKi8KLQlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKIAogCXN0cnVjdCBpcmxhcF9jYiAqaXJsYXA7CS8qIFRoZSBsaW5rIGxheWVyIHdlIGFyZSBiaW5kZWQgdG8gKi8KIAlzdHJ1Y3QgcW9zX2luZm8gcW9zOwkvKiBRb1MgY2FwYWJpbGl0aWVzIGZvciB0aGlzIGRldmljZSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXJkYS92bHNpX2lyLmMgYi9kcml2ZXJzL25ldC9pcmRhL3Zsc2lfaXIuYwppbmRleCAwZDMwZjhkLi43MjNjNDU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9pcmRhL3Zsc2lfaXIuYworKysgYi9kcml2ZXJzL25ldC9pcmRhL3Zsc2lfaXIuYwpAQCAtMjkxLDE0ICsyOTEsMTQgQEAKIAkJbm93LnR2X3NlYyAtIGlkZXYtPmxhc3RfcngudHZfc2VjIC0gZGVsdGExLCBkZWx0YTIpOwkKIAogCXNlcV9wcmludGYoc2VxLCAiUlg6IHBhY2tldHM9JWx1IC8gYnl0ZXM9JWx1IC8gZXJyb3JzPSVsdSAvIGRyb3BwZWQ9JWx1IiwKLQkJaWRldi0+c3RhdHMucnhfcGFja2V0cywgaWRldi0+c3RhdHMucnhfYnl0ZXMsIGlkZXYtPnN0YXRzLnJ4X2Vycm9ycywKLQkJaWRldi0+c3RhdHMucnhfZHJvcHBlZCk7CisJCW5kZXYtPnN0YXRzLnJ4X3BhY2tldHMsIG5kZXYtPnN0YXRzLnJ4X2J5dGVzLCBuZGV2LT5zdGF0cy5yeF9lcnJvcnMsCisJCW5kZXYtPnN0YXRzLnJ4X2Ryb3BwZWQpOwogCXNlcV9wcmludGYoc2VxLCAiIC8gb3ZlcnJ1bj0lbHUgLyBsZW5ndGg9JWx1IC8gZnJhbWU9JWx1IC8gY3JjPSVsdVxuIiwKLQkJaWRldi0+c3RhdHMucnhfb3Zlcl9lcnJvcnMsIGlkZXYtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMsCi0JCWlkZXYtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycywgaWRldi0+c3RhdHMucnhfY3JjX2Vycm9ycyk7CisJCW5kZXYtPnN0YXRzLnJ4X292ZXJfZXJyb3JzLCBuZGV2LT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzLAorCQluZGV2LT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMsIG5kZXYtPnN0YXRzLnJ4X2NyY19lcnJvcnMpOwogCXNlcV9wcmludGYoc2VxLCAiVFg6IHBhY2tldHM9JWx1IC8gYnl0ZXM9JWx1IC8gZXJyb3JzPSVsdSAvIGRyb3BwZWQ9JWx1IC8gZmlmbz0lbHVcbiIsCi0JCWlkZXYtPnN0YXRzLnR4X3BhY2tldHMsIGlkZXYtPnN0YXRzLnR4X2J5dGVzLCBpZGV2LT5zdGF0cy50eF9lcnJvcnMsCi0JCWlkZXYtPnN0YXRzLnR4X2Ryb3BwZWQsIGlkZXYtPnN0YXRzLnR4X2ZpZm9fZXJyb3JzKTsKKwkJbmRldi0+c3RhdHMudHhfcGFja2V0cywgbmRldi0+c3RhdHMudHhfYnl0ZXMsIG5kZXYtPnN0YXRzLnR4X2Vycm9ycywKKwkJbmRldi0+c3RhdHMudHhfZHJvcHBlZCwgbmRldi0+c3RhdHMudHhfZmlmb19lcnJvcnMpOwogCiB9CiAJCQpAQCAtNjUxLDIxICs2NTEsMjEgQEAKIAogCQlpZiAocmV0IDwgMCkgewogCQkJcmV0ID0gLXJldDsKLQkJCWlkZXYtPnN0YXRzLnJ4X2Vycm9ycysrOworCQkJbmRldi0+c3RhdHMucnhfZXJyb3JzKys7CiAJCQlpZiAocmV0ICYgVkxTSV9SWF9EUk9QKSAgCi0JCQkJaWRldi0+c3RhdHMucnhfZHJvcHBlZCsrOworCQkJCW5kZXYtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKIAkJCWlmIChyZXQgJiBWTFNJX1JYX09WRVIpICAKLQkJCQlpZGV2LT5zdGF0cy5yeF9vdmVyX2Vycm9ycysrOworCQkJCW5kZXYtPnN0YXRzLnJ4X292ZXJfZXJyb3JzKys7CiAJCQlpZiAocmV0ICYgVkxTSV9SWF9MRU5HVEgpICAKLQkJCQlpZGV2LT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7CisJCQkJbmRldi0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOwogCQkJaWYgKHJldCAmIFZMU0lfUlhfRlJBTUUpICAKLQkJCQlpZGV2LT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKKwkJCQluZGV2LT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKIAkJCWlmIChyZXQgJiBWTFNJX1JYX0NSQykgIAotCQkJCWlkZXYtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKKwkJCQluZGV2LT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7CiAJCX0KIAkJZWxzZSBpZiAocmV0ID4gMCkgewotCQkJaWRldi0+c3RhdHMucnhfcGFja2V0cysrOwotCQkJaWRldi0+c3RhdHMucnhfYnl0ZXMgKz0gcmV0OworCQkJbmRldi0+c3RhdHMucnhfcGFja2V0cysrOworCQkJbmRldi0+c3RhdHMucnhfYnl0ZXMgKz0gcmV0OwogCQl9CiAJfQogCkBAIC02ODYsNiArNjg2LDcgQEAKIAogc3RhdGljIHZvaWQgdmxzaV91bmFybV9yeCh2bHNpX2lyZGFfZGV2X3QgKmlkZXYpCiB7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYgPSBwY2lfZ2V0X2RydmRhdGEoaWRldi0+cGRldik7CiAJc3RydWN0IHZsc2lfcmluZyAqciA9IGlkZXYtPnJ4X3Jpbmc7CiAJc3RydWN0IHJpbmdfZGVzY3IgKnJkOwogCWludCByZXQ7CkBAIC03MTEsMjEgKzcxMiwyMSBAQAogCiAJCWlmIChyZXQgPCAwKSB7CiAJCQlyZXQgPSAtcmV0OwotCQkJaWRldi0+c3RhdHMucnhfZXJyb3JzKys7CisJCQluZGV2LT5zdGF0cy5yeF9lcnJvcnMrKzsKIAkJCWlmIChyZXQgJiBWTFNJX1JYX0RST1ApICAKLQkJCQlpZGV2LT5zdGF0cy5yeF9kcm9wcGVkKys7CisJCQkJbmRldi0+c3RhdHMucnhfZHJvcHBlZCsrOwogCQkJaWYgKHJldCAmIFZMU0lfUlhfT1ZFUikgIAotCQkJCWlkZXYtPnN0YXRzLnJ4X292ZXJfZXJyb3JzKys7CisJCQkJbmRldi0+c3RhdHMucnhfb3Zlcl9lcnJvcnMrKzsKIAkJCWlmIChyZXQgJiBWTFNJX1JYX0xFTkdUSCkgIAotCQkJCWlkZXYtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKKwkJCQluZGV2LT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7CiAJCQlpZiAocmV0ICYgVkxTSV9SWF9GUkFNRSkgIAotCQkJCWlkZXYtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycysrOworCQkJCW5kZXYtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycysrOwogCQkJaWYgKHJldCAmIFZMU0lfUlhfQ1JDKSAgCi0JCQkJaWRldi0+c3RhdHMucnhfY3JjX2Vycm9ycysrOworCQkJCW5kZXYtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKIAkJfQogCQllbHNlIGlmIChyZXQgPiAwKSB7Ci0JCQlpZGV2LT5zdGF0cy5yeF9wYWNrZXRzKys7Ci0JCQlpZGV2LT5zdGF0cy5yeF9ieXRlcyArPSByZXQ7CisJCQluZGV2LT5zdGF0cy5yeF9wYWNrZXRzKys7CisJCQluZGV2LT5zdGF0cy5yeF9ieXRlcyArPSByZXQ7CiAJCX0KIAl9CiB9CkBAIC0xMDUwLDggKzEwNTEsOCBAQAogZHJvcDoKIAlJUkRBX1dBUk5JTkcoIiVzOiBkcm9wcGluZyBwYWNrZXQgLSAlc1xuIiwgX19mdW5jX18sIG1zZyk7CiAJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKLQlpZGV2LT5zdGF0cy50eF9lcnJvcnMrKzsKLQlpZGV2LT5zdGF0cy50eF9kcm9wcGVkKys7CisJbmRldi0+c3RhdHMudHhfZXJyb3JzKys7CisJbmRldi0+c3RhdHMudHhfZHJvcHBlZCsrOwogCS8qIERvbid0IGV2ZW4gdGhpbmsgYWJvdXQgcmV0dXJuaW5nIE5FVF9YTUlUX0RST1AgKD0xKSBoZXJlIQogCSAqIEluIGZhY3QgYW55IHJldHZhbCE9MCBjYXVzZXMgdGhlIHBhY2tldCBzY2hlZHVsZXIgdG8gcmVxdWV1ZSB0aGUKIAkgKiBwYWNrZXQgZm9yIGxhdGVyIHJldHJ5IG9mIHRyYW5zbWlzc2lvbiAtIHdoaWNoIGlzbid0IGV4YWN0bHkKQEAgLTEwNzgsMTUgKzEwNzksMTUgQEAKIAogCQlpZiAocmV0IDwgMCkgewogCQkJcmV0ID0gLXJldDsKLQkJCWlkZXYtPnN0YXRzLnR4X2Vycm9ycysrOworCQkJbmRldi0+c3RhdHMudHhfZXJyb3JzKys7CiAJCQlpZiAocmV0ICYgVkxTSV9UWF9EUk9QKQotCQkJCWlkZXYtPnN0YXRzLnR4X2Ryb3BwZWQrKzsKKwkJCQluZGV2LT5zdGF0cy50eF9kcm9wcGVkKys7CiAJCQlpZiAocmV0ICYgVkxTSV9UWF9GSUZPKQotCQkJCWlkZXYtPnN0YXRzLnR4X2ZpZm9fZXJyb3JzKys7CisJCQkJbmRldi0+c3RhdHMudHhfZmlmb19lcnJvcnMrKzsKIAkJfQogCQllbHNlIGlmIChyZXQgPiAwKXsKLQkJCWlkZXYtPnN0YXRzLnR4X3BhY2tldHMrKzsKLQkJCWlkZXYtPnN0YXRzLnR4X2J5dGVzICs9IHJldDsKKwkJCW5kZXYtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwkJCW5kZXYtPnN0YXRzLnR4X2J5dGVzICs9IHJldDsKIAkJfQogCX0KIApAQCAtMTEyMiw2ICsxMTIzLDcgQEAKIAogc3RhdGljIHZvaWQgdmxzaV91bmFybV90eCh2bHNpX2lyZGFfZGV2X3QgKmlkZXYpCiB7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYgPSBwY2lfZ2V0X2RydmRhdGEoaWRldi0+cGRldik7CiAJc3RydWN0IHZsc2lfcmluZyAqciA9IGlkZXYtPnR4X3Jpbmc7CiAJc3RydWN0IHJpbmdfZGVzY3IgKnJkOwogCWludCByZXQ7CkBAIC0xMTQ1LDE1ICsxMTQ3LDE1IEBACiAKIAkJaWYgKHJldCA8IDApIHsKIAkJCXJldCA9IC1yZXQ7Ci0JCQlpZGV2LT5zdGF0cy50eF9lcnJvcnMrKzsKKwkJCW5kZXYtPnN0YXRzLnR4X2Vycm9ycysrOwogCQkJaWYgKHJldCAmIFZMU0lfVFhfRFJPUCkKLQkJCQlpZGV2LT5zdGF0cy50eF9kcm9wcGVkKys7CisJCQkJbmRldi0+c3RhdHMudHhfZHJvcHBlZCsrOwogCQkJaWYgKHJldCAmIFZMU0lfVFhfRklGTykKLQkJCQlpZGV2LT5zdGF0cy50eF9maWZvX2Vycm9ycysrOworCQkJCW5kZXYtPnN0YXRzLnR4X2ZpZm9fZXJyb3JzKys7CiAJCX0KIAkJZWxzZSBpZiAocmV0ID4gMCl7Ci0JCQlpZGV2LT5zdGF0cy50eF9wYWNrZXRzKys7Ci0JCQlpZGV2LT5zdGF0cy50eF9ieXRlcyArPSByZXQ7CisJCQluZGV2LT5zdGF0cy50eF9wYWNrZXRzKys7CisJCQluZGV2LT5zdGF0cy50eF9ieXRlcyArPSByZXQ7CiAJCX0KIAl9CiAKQEAgLTEzNzMsMTMgKzEzNzUsNiBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqIHZsc2lfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KQotewotCXZsc2lfaXJkYV9kZXZfdCAqaWRldiA9IG5ldGRldl9wcml2KG5kZXYpOwotCi0JcmV0dXJuICZpZGV2LT5zdGF0czsKLX0KLQogc3RhdGljIHZvaWQgdmxzaV90eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KQogewogCXZsc2lfaXJkYV9kZXZfdCAqaWRldiA9IG5ldGRldl9wcml2KG5kZXYpOwpAQCAtMTYxNSw3ICsxNjEwLDYgQEAKICAKIAluZGV2LT5vcGVuCSAgICAgID0gdmxzaV9vcGVuOwogCW5kZXYtPnN0b3AJICAgICAgPSB2bHNpX2Nsb3NlOwotCW5kZXYtPmdldF9zdGF0cwkgICAgICA9IHZsc2lfZ2V0X3N0YXRzOwogCW5kZXYtPmhhcmRfc3RhcnRfeG1pdCA9IHZsc2lfaGFyZF9zdGFydF94bWl0OwogCW5kZXYtPmRvX2lvY3RsCSAgICAgID0gdmxzaV9pb2N0bDsKIAluZGV2LT50eF90aW1lb3V0ICAgICAgPSB2bHNpX3R4X3RpbWVvdXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pcmRhL3Zsc2lfaXIuaCBiL2RyaXZlcnMvbmV0L2lyZGEvdmxzaV9pci5oCmluZGV4IDliMTg4NDMuLjMwNTBkMWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2lyZGEvdmxzaV9pci5oCisrKyBiL2RyaXZlcnMvbmV0L2lyZGEvdmxzaV9pci5oCkBAIC03MTIsNyArNzEyLDYgQEAKIAogdHlwZWRlZiBzdHJ1Y3QgdmxzaV9pcmRhX2RldiB7CiAJc3RydWN0IHBjaV9kZXYJCSpwZGV2OwotCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzCXN0YXRzOwogCiAJc3RydWN0IGlybGFwX2NiCQkqaXJsYXA7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lyZGEvdzgzOTc3YWZfaXIuYyBiL2RyaXZlcnMvbmV0L2lyZGEvdzgzOTc3YWZfaXIuYwppbmRleCAzMGVjOTEzLi5kYzBhMmU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9pcmRhL3c4Mzk3N2FmX2lyLmMKKysrIGIvZHJpdmVycy9uZXQvaXJkYS93ODM5NzdhZl9pci5jCkBAIC0xMDIsNyArMTAyLDYgQEAKIHN0YXRpYyBpbnQgIHc4Mzk3N2FmX25ldF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogc3RhdGljIGludCAgdzgzOTc3YWZfbmV0X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogc3RhdGljIGludCAgdzgzOTc3YWZfbmV0X2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqcnEsIGludCBjbWQpOwotc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICp3ODM5NzdhZl9uZXRfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogCiAvKgogICogRnVuY3Rpb24gdzgzOTc3YWZfaW5pdCAoKQpAQCAtMjM3LDcgKzIzNiw2IEBACiAJZGV2LT5vcGVuICAgICAgICAgICAgPSB3ODM5NzdhZl9uZXRfb3BlbjsKIAlkZXYtPnN0b3AgICAgICAgICAgICA9IHc4Mzk3N2FmX25ldF9jbG9zZTsKIAlkZXYtPmRvX2lvY3RsICAgICAgICA9IHc4Mzk3N2FmX25ldF9pb2N0bDsKLQlkZXYtPmdldF9zdGF0cwkgICAgID0gdzgzOTc3YWZfbmV0X2dldF9zdGF0czsKIAogCWVyciA9IHJlZ2lzdGVyX25ldGRldihkZXYpOwogCWlmIChlcnIpIHsKQEAgLTcwMiwxMyArNzAwLDEzIEBACiAJaWYgKGluYihpb2Jhc2UrQVVEUikgJiBBVURSX1VORFIpIHsKIAkJSVJEQV9ERUJVRygwLCAiJXMoKSwgVHJhbnNtaXQgdW5kZXJydW4hXG4iLCBfX2Z1bmNfXyApOwogCQkKLQkJc2VsZi0+c3RhdHMudHhfZXJyb3JzKys7Ci0JCXNlbGYtPnN0YXRzLnR4X2ZpZm9fZXJyb3JzKys7CisJCXNlbGYtPm5ldGRldi0+c3RhdHMudHhfZXJyb3JzKys7CisJCXNlbGYtPm5ldGRldi0+c3RhdHMudHhfZmlmb19lcnJvcnMrKzsKIAogCQkvKiBDbGVhciBiaXQsIGJ5IHdyaXRpbmcgMSB0byBpdCAqLwogCQlvdXRiKEFVRFJfVU5EUiwgaW9iYXNlK0FVRFIpOwogCX0gZWxzZQotCQlzZWxmLT5zdGF0cy50eF9wYWNrZXRzKys7CisJCXNlbGYtPm5ldGRldi0+c3RhdHMudHhfcGFja2V0cysrOwogCiAJCiAJaWYgKHNlbGYtPm5ld19zcGVlZCkgewpAQCAtODQ2LDI4ICs4NDQsMjggQEAKIAkJaWYgKHN0YXR1cyAmIEZTX0ZPX0VSUl9NU0spIHsKIAkJCWlmIChzdGF0dXMgJiBGU19GT19MU1RfRlIpIHsKIAkJCQkvKiBBZGQgbnVtYmVyIG9mIGxvc3QgZnJhbWVzIHRvIHN0YXRzICovCi0JCQkJc2VsZi0+c3RhdHMucnhfZXJyb3JzICs9IGxlbjsJCisJCQkJc2VsZi0+bmV0ZGV2LT5zdGF0cy5yeF9lcnJvcnMgKz0gbGVuOwogCQkJfSBlbHNlIHsKIAkJCQkvKiBTa2lwIGZyYW1lICovCi0JCQkJc2VsZi0+c3RhdHMucnhfZXJyb3JzKys7CisJCQkJc2VsZi0+bmV0ZGV2LT5zdGF0cy5yeF9lcnJvcnMrKzsKIAkJCQkKIAkJCQlzZWxmLT5yeF9idWZmLmRhdGEgKz0gbGVuOwogCQkJCQogCQkJCWlmIChzdGF0dXMgJiBGU19GT19NWF9MRVgpCi0JCQkJCXNlbGYtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKKwkJCQkJc2VsZi0+bmV0ZGV2LT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7CiAJCQkJCiAJCQkJaWYgKHN0YXR1cyAmIEZTX0ZPX1BIWV9FUlIpIAotCQkJCQlzZWxmLT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKKwkJCQkJc2VsZi0+bmV0ZGV2LT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKIAkJCQkKIAkJCQlpZiAoc3RhdHVzICYgRlNfRk9fQ1JDX0VSUikgCi0JCQkJCXNlbGYtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKKwkJCQkJc2VsZi0+bmV0ZGV2LT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7CiAJCQl9CiAJCQkvKiBUaGUgZXJyb3JzIGJlbG93IGNhbiBiZSByZXBvcnRlZCBpbiBib3RoIGNhc2VzICovCiAJCQlpZiAoc3RhdHVzICYgRlNfRk9fUlhfT1YpCi0JCQkJc2VsZi0+c3RhdHMucnhfZmlmb19lcnJvcnMrKzsKKwkJCQlzZWxmLT5uZXRkZXYtPnN0YXRzLnJ4X2ZpZm9fZXJyb3JzKys7CiAJCQkKIAkJCWlmIChzdGF0dXMgJiBGU19GT19GU0ZfT1YpCi0JCQkJc2VsZi0+c3RhdHMucnhfZmlmb19lcnJvcnMrKzsKKwkJCQlzZWxmLT5uZXRkZXYtPnN0YXRzLnJ4X2ZpZm9fZXJyb3JzKys7CiAJCQkKIAkJfSBlbHNlIHsKIAkJCS8qIENoZWNrIGlmIHdlIGhhdmUgdHJhbnNmZXJyZWQgYWxsIGRhdGEgdG8gbWVtb3J5ICovCkBAIC05MTcsNyArOTE1LDcgQEAKIAogCQkJLyogTW92ZSB0byBuZXh0IGZyYW1lICovCiAJCQlzZWxmLT5yeF9idWZmLmRhdGEgKz0gbGVuOwotCQkJc2VsZi0+c3RhdHMucnhfcGFja2V0cysrOworCQkJc2VsZi0+bmV0ZGV2LT5zdGF0cy5yeF9wYWNrZXRzKys7CiAJCQkKIAkJCXNrYi0+ZGV2ID0gc2VsZi0+bmV0ZGV2OwogCQkJc2tiX3Jlc2V0X21hY19oZWFkZXIoc2tiKTsKQEAgLTk1MSw3ICs5NDksNyBAQAogCS8qICBSZWNlaXZlIGFsbCBjaGFyYWN0ZXJzIGluIFJ4IEZJRk8gKi8KIAlkbyB7CiAJCWJ5dGUgPSBpbmIoaW9iYXNlK1JCUik7Ci0JCWFzeW5jX3Vud3JhcF9jaGFyKHNlbGYtPm5ldGRldiwgJnNlbGYtPnN0YXRzLCAmc2VsZi0+cnhfYnVmZiwgCisJCWFzeW5jX3Vud3JhcF9jaGFyKHNlbGYtPm5ldGRldiwgJnNlbGYtPm5ldGRldi0+c3RhdHMsICZzZWxmLT5yeF9idWZmLAogCQkJCSAgYnl0ZSk7CiAJfSB3aGlsZSAoaW5iKGlvYmFzZStVU1IpICYgVVNSX1JEUik7IC8qIERhdGEgYXZhaWxhYmxlICovCQogfQpAQCAtOTk0LDcgKzk5Miw3IEBACiAJCQlvdXRiKEFVRFJfU0ZFTkQsIGlvYmFzZStBVURSKTsKIAkJCW91dGIoc2V0LCBpb2Jhc2UrU1NSKTsgCiAKLQkJCXNlbGYtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwkJCXNlbGYtPm5ldGRldi0+c3RhdHMudHhfcGFja2V0cysrOwogCiAJCQkvKiBGZWVkIG1lIG1vcmUgcGFja2V0cyAqLwogCQkJbmV0aWZfd2FrZV9xdWV1ZShzZWxmLT5uZXRkZXYpOwpAQCAtMTMzNiwxMyArMTMzNCw2IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICp3ODM5NzdhZl9uZXRfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IHc4Mzk3N2FmX2lyICpzZWxmID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQkKLQlyZXR1cm4gJnNlbGYtPnN0YXRzOwotfQotCiBNT0RVTEVfQVVUSE9SKCJEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIldpbmJvbmQgVzgzOTc3QUYgSXJEQSBEZXZpY2UgRHJpdmVyIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pcmRhL3c4Mzk3N2FmX2lyLmggYi9kcml2ZXJzL25ldC9pcmRhL3c4Mzk3N2FmX2lyLmgKaW5kZXggODdjMzk3NS4uZmVmZTliMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaXJkYS93ODM5NzdhZl9pci5oCisrKyBiL2RyaXZlcnMvbmV0L2lyZGEvdzgzOTc3YWZfaXIuaApAQCAtMTcyLDcgKzE3Miw2IEBACiAJaW50IHR4X2xlbjsgICAgICAgICAgLyogTnVtYmVyIG9mIGZyYW1lcyBpbiB0eF9idWZmICovCiAKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2OyAvKiBZZXMhIHdlIGFyZSBzb21lIGtpbmQgb2YgbmV0ZGV2aWNlICovCi0Jc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CiAJCiAJc3RydWN0IGlybGFwX2NiICAgICppcmxhcDsgLyogVGhlIGxpbmsgbGF5ZXIgd2UgYXJlIGJpbmRlZCB0byAqLwogCXN0cnVjdCBxb3NfaW5mbyAgICAgcW9zOyAgIC8qIFFvUyBjYXBhYmlsaXRpZXMgZm9yIHRoaXMgZGV2aWNlICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9tbHg0L2VuX3BhcmFtcy5jIGIvZHJpdmVycy9uZXQvbWx4NC9lbl9wYXJhbXMuYwppbmRleCBjZmVlZjBmLi5jMWJkMDQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9tbHg0L2VuX3BhcmFtcy5jCisrKyBiL2RyaXZlcnMvbmV0L21seDQvZW5fcGFyYW1zLmMKQEAgLTM5OSw4ICszOTksMTAgQEAKIAogCXJ4X3NpemUgPSByb3VuZHVwX3Bvd19vZl90d28ocGFyYW0tPnJ4X3BlbmRpbmcpOwogCXJ4X3NpemUgPSBtYXhfdCh1MzIsIHJ4X3NpemUsIE1MWDRfRU5fTUlOX1JYX1NJWkUpOworCXJ4X3NpemUgPSBtaW5fdCh1MzIsIHJ4X3NpemUsIE1MWDRfRU5fTUFYX1JYX1NJWkUpOwogCXR4X3NpemUgPSByb3VuZHVwX3Bvd19vZl90d28ocGFyYW0tPnR4X3BlbmRpbmcpOwogCXR4X3NpemUgPSBtYXhfdCh1MzIsIHR4X3NpemUsIE1MWDRfRU5fTUlOX1RYX1NJWkUpOworCXR4X3NpemUgPSBtaW5fdCh1MzIsIHR4X3NpemUsIE1MWDRfRU5fTUFYX1RYX1NJWkUpOwogCiAJaWYgKHJ4X3NpemUgPT0gcHJpdi0+cHJvZi0+cnhfcmluZ19zaXplICYmCiAJICAgIHR4X3NpemUgPT0gcHJpdi0+cHJvZi0+dHhfcmluZ19zaXplKQpAQCAtNDQwLDggKzQ0Miw4IEBACiAJc3RydWN0IG1seDRfZW5fZGV2ICptZGV2ID0gcHJpdi0+bWRldjsKIAogCW1lbXNldChwYXJhbSwgMCwgc2l6ZW9mKCpwYXJhbSkpOwotCXBhcmFtLT5yeF9tYXhfcGVuZGluZyA9IG1kZXYtPmRldi0+Y2Fwcy5tYXhfcnFfc2c7Ci0JcGFyYW0tPnR4X21heF9wZW5kaW5nID0gbWRldi0+ZGV2LT5jYXBzLm1heF9zcV9zZzsKKwlwYXJhbS0+cnhfbWF4X3BlbmRpbmcgPSBNTFg0X0VOX01BWF9SWF9TSVpFOworCXBhcmFtLT50eF9tYXhfcGVuZGluZyA9IE1MWDRfRU5fTUFYX1RYX1NJWkU7CiAJcGFyYW0tPnJ4X3BlbmRpbmcgPSBtZGV2LT5wcm9maWxlLnByb2ZbcHJpdi0+cG9ydF0ucnhfcmluZ19zaXplOwogCXBhcmFtLT50eF9wZW5kaW5nID0gbWRldi0+cHJvZmlsZS5wcm9mW3ByaXYtPnBvcnRdLnR4X3Jpbmdfc2l6ZTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L21seDQvZW5fdHguYyBiL2RyaXZlcnMvbmV0L21seDQvZW5fdHguYwppbmRleCBmZjRkNzUyLi40YWZkNTk5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9tbHg0L2VuX3R4LmMKKysrIGIvZHJpdmVycy9uZXQvbWx4NC9lbl90eC5jCkBAIC0yMDMsMTkgKzIwMywyMSBAQAogCiAJLyogT3B0aW1pemUgdGhlIGNvbW1vbiBjYXNlIHdoZW4gdGhlcmUgYXJlIG5vIHdyYXBhcm91bmRzICovCiAJaWYgKGxpa2VseSgodm9pZCAqKSB0eF9kZXNjICsgdHhfaW5mby0+bnJfdHhiYiAqIFRYQkJfU0laRSA8PSBlbmQpKSB7Ci0JCWlmICh0eF9pbmZvLT5saW5lYXIpIHsKLQkJCXBjaV91bm1hcF9zaW5nbGUobWRldi0+cGRldiwKLQkJCQkJIChkbWFfYWRkcl90KSBiZTY0X3RvX2NwdShkYXRhLT5hZGRyKSwKKwkJaWYgKCF0eF9pbmZvLT5pbmwpIHsKKwkJCWlmICh0eF9pbmZvLT5saW5lYXIpIHsKKwkJCQlwY2lfdW5tYXBfc2luZ2xlKG1kZXYtPnBkZXYsCisJCQkJCShkbWFfYWRkcl90KSBiZTY0X3RvX2NwdShkYXRhLT5hZGRyKSwKIAkJCQkJIGJlMzJfdG9fY3B1KGRhdGEtPmJ5dGVfY291bnQpLAogCQkJCQkgUENJX0RNQV9UT0RFVklDRSk7Ci0JCQkrK2RhdGE7Ci0JCX0KKwkJCQkrK2RhdGE7CisJCQl9CiAKLQkJZm9yIChpID0gMDsgaSA8IGZyYWdzOyBpKyspIHsKLQkJCWZyYWcgPSAmc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpXTsKLQkJCXBjaV91bm1hcF9wYWdlKG1kZXYtPnBkZXYsCi0JCQkJICAgICAgIChkbWFfYWRkcl90KSBiZTY0X3RvX2NwdShkYXRhW2ldLmFkZHIpLAotCQkJCSAgICAgICBmcmFnLT5zaXplLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJCWZvciAoaSA9IDA7IGkgPCBmcmFnczsgaSsrKSB7CisJCQkJZnJhZyA9ICZza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ldOworCQkJCXBjaV91bm1hcF9wYWdlKG1kZXYtPnBkZXYsCisJCQkJCShkbWFfYWRkcl90KSBiZTY0X3RvX2NwdShkYXRhW2ldLmFkZHIpLAorCQkJCQlmcmFnLT5zaXplLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJCX0KIAkJfQogCQkvKiBTdGFtcCB0aGUgZnJlZWQgZGVzY3JpcHRvciAqLwogCQlmb3IgKGkgPSAwOyBpIDwgdHhfaW5mby0+bnJfdHhiYiAqIFRYQkJfU0laRTsgaSArPSBTVEFNUF9TVFJJREUpIHsKQEAgLTIyNCwyNyArMjI2LDI5IEBACiAJCX0KIAogCX0gZWxzZSB7Ci0JCWlmICgodm9pZCAqKSBkYXRhID49IGVuZCkgewotCQkJZGF0YSA9IChzdHJ1Y3QgbWx4NF93cWVfZGF0YV9zZWcgKikKLQkJCQkJKHJpbmctPmJ1ZiArICgodm9pZCAqKSBkYXRhIC0gZW5kKSk7Ci0JCX0KKwkJaWYgKCF0eF9pbmZvLT5pbmwpIHsKKwkJCWlmICgodm9pZCAqKSBkYXRhID49IGVuZCkgeworCQkJCWRhdGEgPSAoc3RydWN0IG1seDRfd3FlX2RhdGFfc2VnICopCisJCQkJCQkocmluZy0+YnVmICsgKCh2b2lkICopIGRhdGEgLSBlbmQpKTsKKwkJCX0KIAotCQlpZiAodHhfaW5mby0+bGluZWFyKSB7Ci0JCQlwY2lfdW5tYXBfc2luZ2xlKG1kZXYtPnBkZXYsCi0JCQkJCSAoZG1hX2FkZHJfdCkgYmU2NF90b19jcHUoZGF0YS0+YWRkciksCisJCQlpZiAodHhfaW5mby0+bGluZWFyKSB7CisJCQkJcGNpX3VubWFwX3NpbmdsZShtZGV2LT5wZGV2LAorCQkJCQkoZG1hX2FkZHJfdCkgYmU2NF90b19jcHUoZGF0YS0+YWRkciksCiAJCQkJCSBiZTMyX3RvX2NwdShkYXRhLT5ieXRlX2NvdW50KSwKIAkJCQkJIFBDSV9ETUFfVE9ERVZJQ0UpOwotCQkJKytkYXRhOwotCQl9CisJCQkJKytkYXRhOworCQkJfQogCi0JCWZvciAoaSA9IDA7IGkgPCBmcmFnczsgaSsrKSB7Ci0JCQkvKiBDaGVjayBmb3Igd3JhcGFyb3VuZCBiZWZvcmUgdW5tYXBwaW5nICovCi0JCQlpZiAoKHZvaWQgKikgZGF0YSA+PSBlbmQpCi0JCQkJZGF0YSA9IChzdHJ1Y3QgbWx4NF93cWVfZGF0YV9zZWcgKikgcmluZy0+YnVmOwotCQkJZnJhZyA9ICZza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ldOwotCQkJcGNpX3VubWFwX3BhZ2UobWRldi0+cGRldiwKKwkJCWZvciAoaSA9IDA7IGkgPCBmcmFnczsgaSsrKSB7CisJCQkJLyogQ2hlY2sgZm9yIHdyYXBhcm91bmQgYmVmb3JlIHVubWFwcGluZyAqLworCQkJCWlmICgodm9pZCAqKSBkYXRhID49IGVuZCkKKwkJCQkJZGF0YSA9IChzdHJ1Y3QgbWx4NF93cWVfZGF0YV9zZWcgKikgcmluZy0+YnVmOworCQkJCWZyYWcgPSAmc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpXTsKKwkJCQlwY2lfdW5tYXBfcGFnZShtZGV2LT5wZGV2LAogCQkJCQkoZG1hX2FkZHJfdCkgYmU2NF90b19jcHUoZGF0YS0+YWRkciksCiAJCQkJCSBmcmFnLT5zaXplLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJCX0KIAkJfQogCQkvKiBTdGFtcCB0aGUgZnJlZWQgZGVzY3JpcHRvciAqLwogCQlmb3IgKGkgPSAwOyBpIDwgdHhfaW5mby0+bnJfdHhiYiAqIFRYQkJfU0laRTsgaSArPSBTVEFNUF9TVFJJREUpIHsKQEAgLTc5MCw4ICs3OTQsMTEgQEAKIAkJCXdtYigpOwogCQkJZGF0YS0+Ynl0ZV9jb3VudCA9IGNwdV90b19iZTMyKHNrYl9oZWFkbGVuKHNrYikgLSBsc29faGVhZGVyX3NpemUpOwogCQl9Ci0JfSBlbHNlCisJCXR4X2luZm8tPmlubCA9IDA7CisJfSBlbHNlIHsKIAkJYnVpbGRfaW5saW5lX3dxZSh0eF9kZXNjLCBza2IsIHJlYWxfc2l6ZSwgJnZsYW5fdGFnLCB0eF9pbmQsIGZyYWdwdHIpOworCQl0eF9pbmZvLT5pbmwgPSAxOworCX0KIAogCXJpbmctPnByb2QgKz0gbnJfdHhiYjsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbWx4NC9tbHg0X2VuLmggYi9kcml2ZXJzL25ldC9tbHg0L21seDRfZW4uaAppbmRleCAyZTk2YzdiLi5lOWFmMzJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9tbHg0L21seDRfZW4uaAorKysgYi9kcml2ZXJzL25ldC9tbHg0L21seDRfZW4uaApAQCAtMTE1LDYgKzExNSwxMCBAQAogfTsKICNkZWZpbmUgTUxYNF9FTl9NQVhfUlhfRlJBR1MJNAogCisvKiBNYXhpbXVtIHJpbmcgc2l6ZXMgKi8KKyNkZWZpbmUgTUxYNF9FTl9NQVhfVFhfU0laRQk4MTkyCisjZGVmaW5lIE1MWDRfRU5fTUFYX1JYX1NJWkUJODE5MgorCiAvKiBNaW5pbXVtIHJpbmcgc2l6ZSBmb3Igb3VyIHBhZ2UtYWxsb2NhdGlvbiBzY2VtZSB0byB3b3JrICovCiAjZGVmaW5lIE1MWDRfRU5fTUlOX1JYX1NJWkUJKE1MWDRfRU5fQUxMT0NfU0laRSAvIFNNUF9DQUNIRV9CWVRFUykKICNkZWZpbmUgTUxYNF9FTl9NSU5fVFhfU0laRQkoNDA5NiAvIFRYQkJfU0laRSkKQEAgLTIwMiw2ICsyMDYsNyBAQAogCXUzMiBucl90eGJiOwogCXU4IGxpbmVhcjsKIAl1OCBkYXRhX29mZnNldDsKKwl1OCBpbmw7CiB9OwogCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L215cmkxMGdlL215cmkxMGdlLmMgYi9kcml2ZXJzL25ldC9teXJpMTBnZS9teXJpMTBnZS5jCmluZGV4IDVlNzAxODAuLjZiYjcxYjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L215cmkxMGdlL215cmkxMGdlLmMKKysrIGIvZHJpdmVycy9uZXQvbXlyaTEwZ2UvbXlyaTEwZ2UuYwpAQCAtNzUsNyArNzUsNyBAQAogI2luY2x1ZGUgIm15cmkxMGdlX21jcC5oIgogI2luY2x1ZGUgIm15cmkxMGdlX21jcF9nZW5faGVhZGVyLmgiCiAKLSNkZWZpbmUgTVlSSTEwR0VfVkVSU0lPTl9TVFIgIjEuNC40LTEuMzk1IgorI2RlZmluZSBNWVJJMTBHRV9WRVJTSU9OX1NUUiAiMS40LjQtMS4zOTgiCiAKIE1PRFVMRV9ERVNDUklQVElPTigiTXlyaWNvbSAxMEcgZHJpdmVyICgxMEdiRSkiKTsKIE1PRFVMRV9BVVRIT1IoIk1haW50YWluZXI6IGhlbHBAbXlyaS5jb20iKTsKQEAgLTM5MjksNiArMzkyOSwxMCBAQAogCW15cmkxMGdlX2R1bW15X3JkbWEobWdwLCAwKTsKIAogYWJvcnRfd2l0aF9pb3JlbWFwOgorCWlmIChtZ3AtPm1hY19hZGRyX3N0cmluZyAhPSBOVUxMKQorCQlkZXZfZXJyKCZwZGV2LT5kZXYsCisJCQkibXlyaTEwZ2VfcHJvYmUoKSBmYWlsZWQ6IE1BQz0lcywgU049JWxkXG4iLAorCQkJbWdwLT5tYWNfYWRkcl9zdHJpbmcsIG1ncC0+c2VyaWFsX251bWJlcik7CiAJaW91bm1hcChtZ3AtPnNyYW0pOwogCiBhYm9ydF93aXRoX210cnI6CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9uYXRzZW1pLmMgYi9kcml2ZXJzL25ldC9uYXRzZW1pLmMKaW5kZXggNDc4ZWRiOS4uYzVkZWM1NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbmF0c2VtaS5jCisrKyBiL2RyaXZlcnMvbmV0L25hdHNlbWkuYwpAQCAtNzc5LDYgKzc3OSwyMiBAQAogCiB9CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgbmF0c2VtaV9uZXRkZXZfb3BzID0geworCS5uZG9fb3BlbgkJPSBuZXRkZXZfb3BlbiwKKwkubmRvX3N0b3AJCT0gbmV0ZGV2X2Nsb3NlLAorCS5uZG9fc3RhcnRfeG1pdAkJPSBzdGFydF90eCwKKwkubmRvX2dldF9zdGF0cwkJPSBnZXRfc3RhdHMsCisJLm5kb19zZXRfbXVsdGljYXN0X2xpc3QgPSBzZXRfcnhfbW9kZSwKKwkubmRvX2NoYW5nZV9tdHUJCT0gbmF0c2VtaV9jaGFuZ2VfbXR1LAorCS5uZG9fZG9faW9jdGwJCT0gbmV0ZGV2X2lvY3RsLAorCS5uZG9fdHhfdGltZW91dCAJPSBuc190eF90aW1lb3V0LAorCS5uZG9fc2V0X21hY19hZGRyZXNzIAk9IGV0aF9tYWNfYWRkciwKKwkubmRvX3ZhbGlkYXRlX2FkZHIJPSBldGhfdmFsaWRhdGVfYWRkciwKKyNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgorCS5uZG9fcG9sbF9jb250cm9sbGVyCT0gbmF0c2VtaV9wb2xsX2NvbnRyb2xsZXIsCisjZW5kaWYKK307CisKIHN0YXRpYyBpbnQgX19kZXZpbml0IG5hdHNlbWlfcHJvYmUxIChzdHJ1Y3QgcGNpX2RldiAqcGRldiwKIAljb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQogewpAQCAtOTExLDIwICs5MjcsOSBAQAogCWlmIChmaW5kX2NudCA8IE1BWF9VTklUUyAgJiYgIGZ1bGxfZHVwbGV4W2ZpbmRfY250XSkKIAkJbnAtPmZ1bGxfZHVwbGV4ID0gMTsKIAotCS8qIFRoZSBjaGlwLXNwZWNpZmljIGVudHJpZXMgaW4gdGhlIGRldmljZSBzdHJ1Y3R1cmUuICovCi0JZGV2LT5vcGVuID0gJm5ldGRldl9vcGVuOwotCWRldi0+aGFyZF9zdGFydF94bWl0ID0gJnN0YXJ0X3R4OwotCWRldi0+c3RvcCA9ICZuZXRkZXZfY2xvc2U7Ci0JZGV2LT5nZXRfc3RhdHMgPSAmZ2V0X3N0YXRzOwotCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gJnNldF9yeF9tb2RlOwotCWRldi0+Y2hhbmdlX210dSA9ICZuYXRzZW1pX2NoYW5nZV9tdHU7Ci0JZGV2LT5kb19pb2N0bCA9ICZuZXRkZXZfaW9jdGw7Ci0JZGV2LT50eF90aW1lb3V0ID0gJm5zX3R4X3RpbWVvdXQ7CisJZGV2LT5uZXRkZXZfb3BzID0gJm5hdHNlbWlfbmV0ZGV2X29wczsKIAlkZXYtPndhdGNoZG9nX3RpbWVvID0gVFhfVElNRU9VVDsKIAotI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCi0JZGV2LT5wb2xsX2NvbnRyb2xsZXIgPSAmbmF0c2VtaV9wb2xsX2NvbnRyb2xsZXI7Ci0jZW5kaWYKIAlTRVRfRVRIVE9PTF9PUFMoZGV2LCAmZXRodG9vbF9vcHMpOwogCiAJaWYgKG10dSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L25zODM4MjAuYyBiL2RyaXZlcnMvbmV0L25zODM4MjAuYwppbmRleCA0NmIwNzcyLi40MjAyMWFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9uczgzODIwLmMKKysrIGIvZHJpdmVycy9uZXQvbnM4MzgyMC5jCkBAIC0xOTU3LDYgKzE5NTcsOSBAQAogCS5uZG9fc2V0X211bHRpY2FzdF9saXN0ID0gbnM4MzgyMF9zZXRfbXVsdGljYXN0LAogCS5uZG9fdmFsaWRhdGVfYWRkcgk9IGV0aF92YWxpZGF0ZV9hZGRyLAogCS5uZG9fdHhfdGltZW91dAkJPSBuczgzODIwX3R4X3RpbWVvdXQsCisjaWZkZWYgTlM4MzgyMF9WTEFOX0FDQ0VMX1NVUFBPUlQKKwkubmRvX3ZsYW5fcnhfcmVnaXN0ZXIJPSBuczgzODIwX3ZsYW5fcnhfcmVnaXN0ZXIsCisjZW5kaWYKIH07CiAKIHN0YXRpYyBpbnQgX19kZXZpbml0IG5zODM4MjBfaW5pdF9vbmUoc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYsCkBAIC0yMjE2LDcgKzIyMTksNiBAQAogI2lmZGVmIE5TODM4MjBfVkxBTl9BQ0NFTF9TVVBQT1JUCiAJLyogV2UgYWxzbyBzdXBwb3J0IGhhcmR3YXJlIHZsYW4gYWNjZWxlcmF0aW9uICovCiAJbmRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9IV19WTEFOX1RYIHwgTkVUSUZfRl9IV19WTEFOX1JYOwotCW5kZXYtPnZsYW5fcnhfcmVnaXN0ZXIgPSBuczgzODIwX3ZsYW5fcnhfcmVnaXN0ZXI7CiAjZW5kaWYKIAogCWlmICh1c2luZ19kYWMpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BjbmV0MzIuYyBiL2RyaXZlcnMvbmV0L3BjbmV0MzIuYwppbmRleCAwNDRiN2IwLi42NjVhNDI4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9wY25ldDMyLmMKKysrIGIvZHJpdmVycy9uZXQvcGNuZXQzMi5jCkBAIC0xNTY4LDYgKzE1NjgsMjIgQEAKIAlyZXR1cm4gZXJyOwogfQogCitzdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIHBjbmV0MzJfbmV0ZGV2X29wcyA9IHsKKwkubmRvX29wZW4JCT0gcGNuZXQzMl9vcGVuLAorCS5uZG9fc3RvcCAJCT0gcGNuZXQzMl9jbG9zZSwKKwkubmRvX3N0YXJ0X3htaXQJCT0gcGNuZXQzMl9zdGFydF94bWl0LAorCS5uZG9fdHhfdGltZW91dAkJPSBwY25ldDMyX3R4X3RpbWVvdXQsCisJLm5kb19nZXRfc3RhdHMJCT0gcGNuZXQzMl9nZXRfc3RhdHMsCisJLm5kb19zZXRfbXVsdGljYXN0X2xpc3QgPSBwY25ldDMyX3NldF9tdWx0aWNhc3RfbGlzdCwKKwkubmRvX2RvX2lvY3RsCQk9IHBjbmV0MzJfaW9jdGwsCisJLm5kb19jaGFuZ2VfbXR1CQk9IGV0aF9jaGFuZ2VfbXR1LAorCS5uZG9fc2V0X21hY19hZGRyZXNzIAk9IGV0aF9tYWNfYWRkciwKKwkubmRvX3ZhbGlkYXRlX2FkZHIJPSBldGhfdmFsaWRhdGVfYWRkciwKKyNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgorCS5uZG9fcG9sbF9jb250cm9sbGVyCT0gcGNuZXQzMl9wb2xsX2NvbnRyb2xsZXIsCisjZW5kaWYKK307CisKIC8qIHBjbmV0MzJfcHJvYmUxCiAgKiAgQ2FsbGVkIGZyb20gYm90aCBwY25ldDMyX3Byb2JlX3ZsYnVzIGFuZCBwY25ldF9wcm9iZV9wY2kuCiAgKiAgcGRldiB3aWxsIGJlIE5VTEwgd2hlbiBjYWxsZWQgZnJvbSBwY25ldDMyX3Byb2JlX3ZsYnVzLgpAQCAtMTkzNCwyMCArMTk1MCwxMCBAQAogCWxwLT53YXRjaGRvZ190aW1lci5mdW5jdGlvbiA9ICh2b2lkICopJnBjbmV0MzJfd2F0Y2hkb2c7CiAKIAkvKiBUaGUgUENORVQzMi1zcGVjaWZpYyBlbnRyaWVzIGluIHRoZSBkZXZpY2Ugc3RydWN0dXJlLiAqLwotCWRldi0+b3BlbiA9ICZwY25ldDMyX29wZW47Ci0JZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSAmcGNuZXQzMl9zdGFydF94bWl0OwotCWRldi0+c3RvcCA9ICZwY25ldDMyX2Nsb3NlOwotCWRldi0+Z2V0X3N0YXRzID0gJnBjbmV0MzJfZ2V0X3N0YXRzOwotCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gJnBjbmV0MzJfc2V0X211bHRpY2FzdF9saXN0OwotCWRldi0+ZG9faW9jdGwgPSAmcGNuZXQzMl9pb2N0bDsKKwlkZXYtPm5ldGRldl9vcHMgPSAmcGNuZXQzMl9uZXRkZXZfb3BzOwogCWRldi0+ZXRodG9vbF9vcHMgPSAmcGNuZXQzMl9ldGh0b29sX29wczsKLQlkZXYtPnR4X3RpbWVvdXQgPSBwY25ldDMyX3R4X3RpbWVvdXQ7CiAJZGV2LT53YXRjaGRvZ190aW1lbyA9ICg1ICogSFopOwogCi0jaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKLQlkZXYtPnBvbGxfY29udHJvbGxlciA9IHBjbmV0MzJfcG9sbF9jb250cm9sbGVyOwotI2VuZGlmCi0KIAkvKiBGaWxsIGluIHRoZSBnZW5lcmljIGZpZWxkcyBvZiB0aGUgZGV2aWNlIHN0cnVjdHVyZS4gKi8KIAlpZiAocmVnaXN0ZXJfbmV0ZGV2KGRldikpCiAJCWdvdG8gZXJyX2ZyZWVfcmluZzsKQEAgLTIyNzYsNyArMjI4Miw3IEBACiAJaWYgKGxwLT5jaGlwX3ZlcnNpb24gPj0gUENORVQzMl83OUM5NzBBKSB7CiAJCS8qIFByaW50IHRoZSBsaW5rIHN0YXR1cyBhbmQgc3RhcnQgdGhlIHdhdGNoZG9nICovCiAJCXBjbmV0MzJfY2hlY2tfbWVkaWEoZGV2LCAxKTsKLQkJbW9kX3RpbWVyKCYobHAtPndhdGNoZG9nX3RpbWVyKSwgUENORVQzMl9XQVRDSERPR19USU1FT1VUKTsKKwkJbW9kX3RpbWVyKCZscC0+d2F0Y2hkb2dfdGltZXIsIFBDTkVUMzJfV0FUQ0hET0dfVElNRU9VVCk7CiAJfQogCiAJaSA9IDA7CkBAIC0yOTExLDcgKzI5MTcsNyBAQAogCXBjbmV0MzJfY2hlY2tfbWVkaWEoZGV2LCAwKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+bG9jaywgZmxhZ3MpOwogCi0JbW9kX3RpbWVyKCYobHAtPndhdGNoZG9nX3RpbWVyKSwgUENORVQzMl9XQVRDSERPR19USU1FT1VUKTsKKwltb2RfdGltZXIoJmxwLT53YXRjaGRvZ190aW1lciwgcm91bmRfamlmZmllcyhQQ05FVDMyX1dBVENIRE9HX1RJTUVPVVQpKTsKIH0KIAogc3RhdGljIGludCBwY25ldDMyX3BtX3N1c3BlbmQoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BsaXAuYyBiL2RyaXZlcnMvbmV0L3BsaXAuYwppbmRleCAwYzQ2ZDYwLi4wYmUwZjBiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9wbGlwLmMKKysrIGIvZHJpdmVycy9uZXQvcGxpcC5jCkBAIC0yNjUsNiArMjY1LDEzIEBACiAJLmNhY2hlICA9IHBsaXBfaGFyZF9oZWFkZXJfY2FjaGUsCiB9OwogCitzdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIHBsaXBfbmV0ZGV2X29wcyA9IHsKKwkubmRvX29wZW4JCSA9IHBsaXBfb3BlbiwKKwkubmRvX3N0b3AJCSA9IHBsaXBfY2xvc2UsCisJLm5kb19zdGFydF94bWl0CQkgPSBwbGlwX3R4X3BhY2tldCwKKwkubmRvX2RvX2lvY3RsCQkgPSBwbGlwX2lvY3RsLAorfTsKKwogLyogRW50cnkgcG9pbnQgb2YgUExJUCBkcml2ZXIuCiAgICBQcm9iZSB0aGUgaGFyZHdhcmUsIGFuZCByZWdpc3Rlci9pbml0aWFsaXplIHRoZSBkcml2ZXIuCiAKQEAgLTI4MCwxNSArMjg3LDExIEBACiAJc3RydWN0IG5ldF9sb2NhbCAqbmwgPSBuZXRkZXZfcHJpdihkZXYpOwogCiAJLyogVGhlbiwgb3ZlcnJpZGUgcGFydHMgb2YgaXQgKi8KLQlkZXYtPmhhcmRfc3RhcnRfeG1pdAkgPSBwbGlwX3R4X3BhY2tldDsKLQlkZXYtPm9wZW4JCSA9IHBsaXBfb3BlbjsKLQlkZXYtPnN0b3AJCSA9IHBsaXBfY2xvc2U7Ci0JZGV2LT5kb19pb2N0bAkJID0gcGxpcF9pb2N0bDsKLQogCWRldi0+dHhfcXVldWVfbGVuIAkgPSAxMDsKIAlkZXYtPmZsYWdzCSAgICAgICAgID0gSUZGX1BPSU5UT1BPSU5UfElGRl9OT0FSUDsKIAltZW1zZXQoZGV2LT5kZXZfYWRkciwgMHhmYywgRVRIX0FMRU4pOwogCisJZGV2LT5uZXRkZXZfb3BzCQkgPSAmcGxpcF9uZXRkZXZfb3BzOwogCWRldi0+aGVhZGVyX29wcyAgICAgICAgICA9ICZwbGlwX2hlYWRlcl9vcHM7CiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcWxnZS9xbGdlLmggYi9kcml2ZXJzL25ldC9xbGdlL3FsZ2UuaAppbmRleCBiYTJlMWM1Yi4uNDU5NjYzYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcWxnZS9xbGdlLmgKKysrIGIvZHJpdmVycy9uZXQvcWxnZS9xbGdlLmgKQEAgLTgxOCwxNSArODE4LDYgQEAKIH07CiAKIC8qIERBVEEgU1RSVUNUVVJFUyBTSEFSRUQgV0lUSCBIQVJEV0FSRS4gKi8KLQotc3RydWN0IGJxX2VsZW1lbnQgewotCXUzMiBhZGRyX2xvOwotI2RlZmluZSBCUV9FTkQJMHgwMDAwMDAwMQotI2RlZmluZSBCUV9DT05UCTB4MDAwMDAwMDIKLSNkZWZpbmUgQlFfTUFTSwkweDAwMDAwMDAzCi0JdTMyIGFkZHJfaGk7Ci19IF9fYXR0cmlidXRlKChwYWNrZWQpKTsKLQogc3RydWN0IHR4X2J1Zl9kZXNjIHsKIAlfX2xlNjQgYWRkcjsKIAlfX2xlMzIgbGVuOwpAQCAtODYwLDggKzg1MSw4IEBACiAJX19sZTE2IGZyYW1lX2xlbjsKICNkZWZpbmUgT0JfTUFDX0lPQ0JfTEVOX01BU0sgMHgzZmZmZgogCV9fbGUxNiByZXNlcnZlZDI7Ci0JX19sZTMyIHRpZDsKLQlfX2xlMzIgdHhxX2lkeDsKKwl1MzIgdGlkOworCXUzMiB0eHFfaWR4OwogCV9fbGUzMiByZXNlcnZlZDM7CiAJX19sZTE2IHZsYW5fdGNpOwogCV9fbGUxNiByZXNlcnZlZDQ7CkBAIC04ODAsOCArODcxLDggQEAKIAl1OCBmbGFnczI7CQkvKiAqLwogCXU4IGZsYWdzMzsJCS8qICovCiAjZGVmaW5lIE9CX01BQ19JT0NCX1JTUF9CCTB4ODAJLyogKi8KLQlfX2xlMzIgdGlkOwotCV9fbGUzMiB0eHFfaWR4OworCXUzMiB0aWQ7CisJdTMyIHR4cV9pZHg7CiAJX19sZTMyIHJlc2VydmVkWzEzXTsKIH0gX19hdHRyaWJ1dGUoKHBhY2tlZCkpOwogCkBAIC05MDMsOCArODk0LDggQEAKICNkZWZpbmUgT0JfTUFDX1RTT19JT0NCX1YJMHgwNAogCV9fbGUzMiByZXNlcnZlZDFbMl07CiAJX19sZTMyIGZyYW1lX2xlbjsKLQlfX2xlMzIgdGlkOwotCV9fbGUzMiB0eHFfaWR4OworCXUzMiB0aWQ7CisJdTMyIHR4cV9pZHg7CiAJX19sZTE2IHRvdGFsX2hkcnNfbGVuOwogCV9fbGUxNiBuZXRfdHJhbnNfb2Zmc2V0OwogI2RlZmluZSBPQl9NQUNfVFJBTlNQT1JUX0hEUl9TSElGVCA2CkBAIC05MjUsOCArOTE2LDggQEAKIAl1OCBmbGFnczI7CQkvKiAqLwogCXU4IGZsYWdzMzsJCS8qICovCiAjZGVmaW5lIE9CX01BQ19UU09fSU9DQl9SU1BfQgkweDgwMDAKLQlfX2xlMzIgdGlkOwotCV9fbGUzMiB0eHFfaWR4OworCXUzMiB0aWQ7CisJdTMyIHR4cV9pZHg7CiAJX19sZTMyIHJlc2VydmVkMlsxM107CiB9IF9fYXR0cmlidXRlKChwYWNrZWQpKTsKIApAQCAtOTc5LDEwICs5NzAsMTEgQEAKIAogCV9fbGUxNiByZXNlcnZlZDE7CiAJX19sZTMyIHJlc2VydmVkMls2XTsKLQlfX2xlMzIgZmxhZ3M0OwotI2RlZmluZSBJQl9NQUNfSU9DQl9SU1BfSFYJMHgyMDAwMDAwMAkvKiAqLwotI2RlZmluZSBJQl9NQUNfSU9DQl9SU1BfSFMJMHg0MDAwMDAwMAkvKiAqLwotI2RlZmluZSBJQl9NQUNfSU9DQl9SU1BfSEwJMHg4MDAwMDAwMAkvKiAqLworCXU4IHJlc2VydmVkM1szXTsKKwl1OCBmbGFnczQ7CisjZGVmaW5lIElCX01BQ19JT0NCX1JTUF9IVgkweDIwCisjZGVmaW5lIElCX01BQ19JT0NCX1JTUF9IUwkweDQwCisjZGVmaW5lIElCX01BQ19JT0NCX1JTUF9ITAkweDgwCiAJX19sZTMyIGhkcl9sZW47CQkvKiAqLwogCV9fbGUzMiBoZHJfYWRkcl9sbzsJLyogKi8KIAlfX2xlMzIgaGRyX2FkZHJfaGk7CS8qICovCkBAIC0xMTI2LDcgKzExMTgsNyBAQAogc3RydWN0IHR4X3JpbmdfZGVzYyB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAlzdHJ1Y3Qgb2JfbWFjX2lvY2JfcmVxICpxdWV1ZV9lbnRyeTsKLQlpbnQgaW5kZXg7CisJdTMyIGluZGV4OwogCXN0cnVjdCBvYWwgb2FsOwogCXN0cnVjdCBtYXBfbGlzdCBtYXBbTUFYX1NLQl9GUkFHUyArIDFdOwogCWludCBtYXBfY250OwpAQCAtMTEzOCw4ICsxMTMwLDggQEAKIAkJc3RydWN0IHBhZ2UgKmxicV9wYWdlOwogCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCX0gcDsKLQlzdHJ1Y3QgYnFfZWxlbWVudCAqYnE7Ci0JaW50IGluZGV4OworCV9fbGU2NCAqYWRkcjsKKwl1MzIgaW5kZXg7CiAJIERFQ0xBUkVfUENJX1VOTUFQX0FERFIobWFwYWRkcik7CiAJIERFQ0xBUkVfUENJX1VOTUFQX0xFTihtYXBsZW4pOwogfTsKQEAgLTExODksNyArMTE4MSw3IEBACiAJdTMyIGNxX3NpemU7CiAJdTMyIGNxX2xlbjsKIAl1MTYgY3FfaWQ7Ci0JdTMyICpwcm9kX2lkeF9zaF9yZWc7CS8qIFNoYWRvd2VkIHByb2R1Y2VyIHJlZ2lzdGVyLiAqLworCXZvbGF0aWxlIF9fbGUzMiAqcHJvZF9pZHhfc2hfcmVnOwkvKiBTaGFkb3dlZCBwcm9kdWNlciByZWdpc3Rlci4gKi8KIAlkbWFfYWRkcl90IHByb2RfaWR4X3NoX3JlZ19kbWE7CiAJdm9pZCBfX2lvbWVtICpjbnNtcl9pZHhfZGJfcmVnOwkvKiBQQ0kgZG9vcmJlbGwgbWVtIGFyZWEgKyAwICovCiAJdTMyIGNuc21yX2lkeDsJCS8qIGN1cnJlbnQgc3cgaWR4ICovCkBAIC0xNDY3LDIxICsxNDU5LDYgQEAKIAltbWlvd2IoKTsKIH0KIAotLyoKLSAqIFNoYWRvdyBSZWdpc3RlcnM6Ci0gKiBPdXRib3VuZCBxdWV1ZXMgaGF2ZSBhIGNvbnN1bWVyIGluZGV4IHRoYXQgaXMgbWFpbnRhaW5lZCBieSB0aGUgY2hpcC4KLSAqIEluYm91bmQgcXVldWVzIGhhdmUgYSBwcm9kdWNlciBpbmRleCB0aGF0IGlzIG1haW50YWluZWQgYnkgdGhlIGNoaXAuCi0gKiBGb3IgbG93ZXIgb3ZlcmhlYWQsIHRoZXNlIHJlZ2lzdGVycyBhcmUgInNoYWRvd2VkIiB0byBob3N0IG1lbW9yeQotICogd2hpY2ggYWxsb3dzIHRoZSBkZXZpY2UgZHJpdmVyIHRvIHRyYWNrIHRoZSBxdWV1ZSBwcm9ncmVzcyB3aXRob3V0Ci0gKiBQQ0kgcmVhZHMuIFdoZW4gYW4gZW50cnkgaXMgcGxhY2VkIG9uIGFuIGluYm91bmQgcXVldWUsIHRoZSBjaGlwIHdpbGwKLSAqIHVwZGF0ZSB0aGUgcmVsZXZhbnQgaW5kZXggcmVnaXN0ZXIgYW5kIHRoZW4gY29weSB0aGUgdmFsdWUgdG8gdGhlCi0gKiBzaGFkb3cgcmVnaXN0ZXIgaW4gaG9zdCBtZW1vcnkuCi0gKi8KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHFsX3JlYWRfc2hfcmVnKGNvbnN0IHZvbGF0aWxlIHZvaWQgICphZGRyKQotewotCXJldHVybiAqKHZvbGF0aWxlIHVuc2lnbmVkIGludCBfX2ZvcmNlICopYWRkcjsKLX0KLQogZXh0ZXJuIGNoYXIgcWxnZV9kcml2ZXJfbmFtZVtdOwogZXh0ZXJuIGNvbnN0IGNoYXIgcWxnZV9kcml2ZXJfdmVyc2lvbltdOwogZXh0ZXJuIGNvbnN0IHN0cnVjdCBldGh0b29sX29wcyBxbGdlX2V0aHRvb2xfb3BzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcWxnZS9xbGdlX2RiZy5jIGIvZHJpdmVycy9uZXQvcWxnZS9xbGdlX2RiZy5jCmluZGV4IDQ3ZGYzMDQuLjNmNWUwMmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3FsZ2UvcWxnZV9kYmcuYworKysgYi9kcml2ZXJzL25ldC9xbGdlL3FsZ2VfZGJnLmMKQEAgLTgyMSwxNCArODIxLDExIEBACiAJCSAgICAgICBsZTE2X3RvX2NwdShpYl9tYWNfcnNwLT52bGFuX2lkKSk7CiAKIAlwcmludGsoS0VSTl9FUlIgUEZYICJmbGFnczQgPSAlcyVzJXMuXG4iLAotCSAgICAgICBsZTMyX3RvX2NwdShpYl9tYWNfcnNwLT4KLQkJCSAgIGZsYWdzNCkgJiBJQl9NQUNfSU9DQl9SU1BfSFYgPyAiSFYgIiA6ICIiLAotCSAgICAgICBsZTMyX3RvX2NwdShpYl9tYWNfcnNwLT4KLQkJCSAgIGZsYWdzNCkgJiBJQl9NQUNfSU9DQl9SU1BfSFMgPyAiSFMgIiA6ICIiLAotCSAgICAgICBsZTMyX3RvX2NwdShpYl9tYWNfcnNwLT4KLQkJCSAgIGZsYWdzNCkgJiBJQl9NQUNfSU9DQl9SU1BfSEwgPyAiSEwgIiA6ICIiKTsKKwkJaWJfbWFjX3JzcC0+ZmxhZ3M0ICYgSUJfTUFDX0lPQ0JfUlNQX0hWID8gIkhWICIgOiAiIiwKKwkJaWJfbWFjX3JzcC0+ZmxhZ3M0ICYgSUJfTUFDX0lPQ0JfUlNQX0hTID8gIkhTICIgOiAiIiwKKwkJaWJfbWFjX3JzcC0+ZmxhZ3M0ICYgSUJfTUFDX0lPQ0JfUlNQX0hMID8gIkhMICIgOiAiIik7CiAKLQlpZiAobGUzMl90b19jcHUoaWJfbWFjX3JzcC0+ZmxhZ3M0KSAmIElCX01BQ19JT0NCX1JTUF9IVikgeworCWlmIChpYl9tYWNfcnNwLT5mbGFnczQgJiBJQl9NQUNfSU9DQl9SU1BfSFYpIHsKIAkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiaGRyIGxlbmd0aAk9ICVkLlxuIiwKIAkJICAgICAgIGxlMzJfdG9fY3B1KGliX21hY19yc3AtPmhkcl9sZW4pKTsKIAkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiaGRyIGFkZHJfaGkgICAgPSAweCV4LlxuIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3FsZ2UvcWxnZV9ldGh0b29sLmMgYi9kcml2ZXJzL25ldC9xbGdlL3FsZ2VfZXRodG9vbC5jCmluZGV4IGVlZmI4MWIuLjlkOTIyZTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3FsZ2UvcWxnZV9ldGh0b29sLmMKKysrIGIvZHJpdmVycy9uZXQvcWxnZS9xbGdlX2V0aHRvb2wuYwpAQCAtNTYsOSArNTYsOSBAQAogCQlmb3IgKGkgPSAxOyBpIDwgcWRldi0+cnNzX3JpbmdfZmlyc3RfY3FfaWQ7IGkrKywgcnhfcmluZysrKSB7CiAJCQlyeF9yaW5nID0gJnFkZXYtPnJ4X3JpbmdbaV07CiAJCQljcWljYiA9IChzdHJ1Y3QgY3FpY2IgKilyeF9yaW5nOwotCQkJY3FpY2ItPmlycV9kZWxheSA9IGxlMTZfdG9fY3B1KHFkZXYtPnR4X2NvYWxlc2NlX3VzZWNzKTsKKwkJCWNxaWNiLT5pcnFfZGVsYXkgPSBjcHVfdG9fbGUxNihxZGV2LT50eF9jb2FsZXNjZV91c2Vjcyk7CiAJCQljcWljYi0+cGt0X2RlbGF5ID0KLQkJCSAgICBsZTE2X3RvX2NwdShxZGV2LT50eF9tYXhfY29hbGVzY2VkX2ZyYW1lcyk7CisJCQkgICAgY3B1X3RvX2xlMTYocWRldi0+dHhfbWF4X2NvYWxlc2NlZF9mcmFtZXMpOwogCQkJY3FpY2ItPmZsYWdzID0gRkxBR1NfTEk7CiAJCQlzdGF0dXMgPSBxbF93cml0ZV9jZmcocWRldiwgY3FpY2IsIHNpemVvZihjcWljYiksCiAJCQkJCQlDRkdfTENRLCByeF9yaW5nLT5jcV9pZCk7CkBAIC03OSw5ICs3OSw5IEBACiAJCSAgICAgaSsrKSB7CiAJCQlyeF9yaW5nID0gJnFkZXYtPnJ4X3JpbmdbaV07CiAJCQljcWljYiA9IChzdHJ1Y3QgY3FpY2IgKilyeF9yaW5nOwotCQkJY3FpY2ItPmlycV9kZWxheSA9IGxlMTZfdG9fY3B1KHFkZXYtPnJ4X2NvYWxlc2NlX3VzZWNzKTsKKwkJCWNxaWNiLT5pcnFfZGVsYXkgPSBjcHVfdG9fbGUxNihxZGV2LT5yeF9jb2FsZXNjZV91c2Vjcyk7CiAJCQljcWljYi0+cGt0X2RlbGF5ID0KLQkJCSAgICBsZTE2X3RvX2NwdShxZGV2LT5yeF9tYXhfY29hbGVzY2VkX2ZyYW1lcyk7CisJCQkgICAgY3B1X3RvX2xlMTYocWRldi0+cnhfbWF4X2NvYWxlc2NlZF9mcmFtZXMpOwogCQkJY3FpY2ItPmZsYWdzID0gRkxBR1NfTEk7CiAJCQlzdGF0dXMgPSBxbF93cml0ZV9jZmcocWRldiwgY3FpY2IsIHNpemVvZihjcWljYiksCiAJCQkJCQlDRkdfTENRLCByeF9yaW5nLT5jcV9pZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9xbGdlL3FsZ2VfbWFpbi5jIGIvZHJpdmVycy9uZXQvcWxnZS9xbGdlX21haW4uYwppbmRleCA3MThhN2JkLi5mNGMwMTYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9xbGdlL3FsZ2VfbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L3FsZ2UvcWxnZV9tYWluLmMKQEAgLTI1Nyw3ICsyNTcsNyBAQAogCQl7CiAJCQlzdGF0dXMgPQogCQkJICAgIHFsX3dhaXRfcmVnX3JkeShxZGV2LAotCQkJCU1BQ19BRERSX0lEWCwgTUFDX0FERFJfTVcsIE1BQ19BRERSX0UpOworCQkJCU1BQ19BRERSX0lEWCwgTUFDX0FERFJfTVcsIDApOwogCQkJaWYgKHN0YXR1cykKIAkJCQlnb3RvIGV4aXQ7CiAJCQlxbF93cml0ZTMyKHFkZXYsIE1BQ19BRERSX0lEWCwgKG9mZnNldCsrKSB8IC8qIG9mZnNldCAqLwpAQCAtMjY1LDEzICsyNjUsMTMgQEAKIAkJCQkgICBNQUNfQUREUl9BRFIgfCBNQUNfQUREUl9SUyB8IHR5cGUpOyAvKiB0eXBlICovCiAJCQlzdGF0dXMgPQogCQkJICAgIHFsX3dhaXRfcmVnX3JkeShxZGV2LAotCQkJCU1BQ19BRERSX0lEWCwgTUFDX0FERFJfTVIsIE1BQ19BRERSX0UpOworCQkJCU1BQ19BRERSX0lEWCwgTUFDX0FERFJfTVIsIDApOwogCQkJaWYgKHN0YXR1cykKIAkJCQlnb3RvIGV4aXQ7CiAJCQkqdmFsdWUrKyA9IHFsX3JlYWQzMihxZGV2LCBNQUNfQUREUl9EQVRBKTsKIAkJCXN0YXR1cyA9CiAJCQkgICAgcWxfd2FpdF9yZWdfcmR5KHFkZXYsCi0JCQkJTUFDX0FERFJfSURYLCBNQUNfQUREUl9NVywgTUFDX0FERFJfRSk7CisJCQkJTUFDX0FERFJfSURYLCBNQUNfQUREUl9NVywgMCk7CiAJCQlpZiAoc3RhdHVzKQogCQkJCWdvdG8gZXhpdDsKIAkJCXFsX3dyaXRlMzIocWRldiwgTUFDX0FERFJfSURYLCAob2Zmc2V0KyspIHwgLyogb2Zmc2V0ICovCkBAIC0yNzksMTQgKzI3OSwxNCBAQAogCQkJCSAgIE1BQ19BRERSX0FEUiB8IE1BQ19BRERSX1JTIHwgdHlwZSk7IC8qIHR5cGUgKi8KIAkJCXN0YXR1cyA9CiAJCQkgICAgcWxfd2FpdF9yZWdfcmR5KHFkZXYsCi0JCQkJTUFDX0FERFJfSURYLCBNQUNfQUREUl9NUiwgTUFDX0FERFJfRSk7CisJCQkJTUFDX0FERFJfSURYLCBNQUNfQUREUl9NUiwgMCk7CiAJCQlpZiAoc3RhdHVzKQogCQkJCWdvdG8gZXhpdDsKIAkJCSp2YWx1ZSsrID0gcWxfcmVhZDMyKHFkZXYsIE1BQ19BRERSX0RBVEEpOwogCQkJaWYgKHR5cGUgPT0gTUFDX0FERFJfVFlQRV9DQU1fTUFDKSB7CiAJCQkJc3RhdHVzID0KIAkJCQkgICAgcWxfd2FpdF9yZWdfcmR5KHFkZXYsCi0JCQkJCU1BQ19BRERSX0lEWCwgTUFDX0FERFJfTVcsIE1BQ19BRERSX0UpOworCQkJCQlNQUNfQUREUl9JRFgsIE1BQ19BRERSX01XLCAwKTsKIAkJCQlpZiAoc3RhdHVzKQogCQkJCQlnb3RvIGV4aXQ7CiAJCQkJcWxfd3JpdGUzMihxZGV2LCBNQUNfQUREUl9JRFgsIChvZmZzZXQrKykgfCAvKiBvZmZzZXQgKi8KQEAgLTI5NCw3ICsyOTQsNyBAQAogCQkJCQkgICBNQUNfQUREUl9BRFIgfCBNQUNfQUREUl9SUyB8IHR5cGUpOyAvKiB0eXBlICovCiAJCQkJc3RhdHVzID0KIAkJCQkgICAgcWxfd2FpdF9yZWdfcmR5KHFkZXYsIE1BQ19BRERSX0lEWCwKLQkJCQkJCSAgICBNQUNfQUREUl9NUiwgTUFDX0FERFJfRSk7CisJCQkJCQkgICAgTUFDX0FERFJfTVIsIDApOwogCQkJCWlmIChzdGF0dXMpCiAJCQkJCWdvdG8gZXhpdDsKIAkJCQkqdmFsdWUrKyA9IHFsX3JlYWQzMihxZGV2LCBNQUNfQUREUl9EQVRBKTsKQEAgLTM0NCw3ICszNDQsNyBAQAogCiAJCQlzdGF0dXMgPQogCQkJICAgIHFsX3dhaXRfcmVnX3JkeShxZGV2LAotCQkJCU1BQ19BRERSX0lEWCwgTUFDX0FERFJfTVcsIE1BQ19BRERSX0UpOworCQkJCU1BQ19BRERSX0lEWCwgTUFDX0FERFJfTVcsIDApOwogCQkJaWYgKHN0YXR1cykKIAkJCQlnb3RvIGV4aXQ7CiAJCQlxbF93cml0ZTMyKHFkZXYsIE1BQ19BRERSX0lEWCwgKG9mZnNldCsrKSB8IC8qIG9mZnNldCAqLwpAQCAtMzUzLDcgKzM1Myw3IEBACiAJCQlxbF93cml0ZTMyKHFkZXYsIE1BQ19BRERSX0RBVEEsIGxvd2VyKTsKIAkJCXN0YXR1cyA9CiAJCQkgICAgcWxfd2FpdF9yZWdfcmR5KHFkZXYsCi0JCQkJTUFDX0FERFJfSURYLCBNQUNfQUREUl9NVywgTUFDX0FERFJfRSk7CisJCQkJTUFDX0FERFJfSURYLCBNQUNfQUREUl9NVywgMCk7CiAJCQlpZiAoc3RhdHVzKQogCQkJCWdvdG8gZXhpdDsKIAkJCXFsX3dyaXRlMzIocWRldiwgTUFDX0FERFJfSURYLCAob2Zmc2V0KyspIHwgLyogb2Zmc2V0ICovCkBAIC0zNjIsNyArMzYyLDcgQEAKIAkJCXFsX3dyaXRlMzIocWRldiwgTUFDX0FERFJfREFUQSwgdXBwZXIpOwogCQkJc3RhdHVzID0KIAkJCSAgICBxbF93YWl0X3JlZ19yZHkocWRldiwKLQkJCQlNQUNfQUREUl9JRFgsIE1BQ19BRERSX01XLCBNQUNfQUREUl9FKTsKKwkJCQlNQUNfQUREUl9JRFgsIE1BQ19BRERSX01XLCAwKTsKIAkJCWlmIChzdGF0dXMpCiAJCQkJZ290byBleGl0OwogCQkJcWxfd3JpdGUzMihxZGV2LCBNQUNfQUREUl9JRFgsIChvZmZzZXQpIHwJLyogb2Zmc2V0ICovCkBAIC00MDAsNyArNDAwLDcgQEAKIAogCQkJc3RhdHVzID0KIAkJCSAgICBxbF93YWl0X3JlZ19yZHkocWRldiwKLQkJCQlNQUNfQUREUl9JRFgsIE1BQ19BRERSX01XLCBNQUNfQUREUl9FKTsKKwkJCQlNQUNfQUREUl9JRFgsIE1BQ19BRERSX01XLCAwKTsKIAkJCWlmIChzdGF0dXMpCiAJCQkJZ290byBleGl0OwogCQkJcWxfd3JpdGUzMihxZGV2LCBNQUNfQUREUl9JRFgsIG9mZnNldCB8CS8qIG9mZnNldCAqLwpAQCAtNDMxLDEzICs0MzEsMTMgQEAKIAlpZiAoc3RhdHVzKQogCQlnb3RvIGV4aXQ7CiAKLQlzdGF0dXMgPSBxbF93YWl0X3JlZ19yZHkocWRldiwgUlRfSURYLCBSVF9JRFhfTVcsIFJUX0lEWF9FKTsKKwlzdGF0dXMgPSBxbF93YWl0X3JlZ19yZHkocWRldiwgUlRfSURYLCBSVF9JRFhfTVcsIDApOwogCWlmIChzdGF0dXMpCiAJCWdvdG8gZXhpdDsKIAogCXFsX3dyaXRlMzIocWRldiwgUlRfSURYLAogCQkgICBSVF9JRFhfVFlQRV9OSUNRIHwgUlRfSURYX1JTIHwgKGluZGV4IDw8IFJUX0lEWF9JRFhfU0hJRlQpKTsKLQlzdGF0dXMgPSBxbF93YWl0X3JlZ19yZHkocWRldiwgUlRfSURYLCBSVF9JRFhfTVIsIFJUX0lEWF9FKTsKKwlzdGF0dXMgPSBxbF93YWl0X3JlZ19yZHkocWRldiwgUlRfSURYLCBSVF9JRFhfTVIsIDApOwogCWlmIChzdGF0dXMpCiAJCWdvdG8gZXhpdDsKIAkqdmFsdWUgPSBxbF9yZWFkMzIocWRldiwgUlRfREFUQSk7CkBAIC04NzQsNyArODc0LDYgQEAKIHsKIAlpbnQgY2xlYW5faWR4ID0gcnhfcmluZy0+bGJxX2NsZWFuX2lkeDsKIAlzdHJ1Y3QgYnFfZGVzYyAqbGJxX2Rlc2M7Ci0Jc3RydWN0IGJxX2VsZW1lbnQgKmJxOwogCXU2NCBtYXA7CiAJaW50IGk7CiAKQEAgLTg4NCw3ICs4ODMsNiBAQAogCQkJCSJsYnE6IHRyeSBjbGVhbmluZyBjbGVhbl9pZHggPSAlZC5cbiIsCiAJCQkJY2xlYW5faWR4KTsKIAkJCWxicV9kZXNjID0gJnJ4X3JpbmctPmxicVtjbGVhbl9pZHhdOwotCQkJYnEgPSBsYnFfZGVzYy0+YnE7CiAJCQlpZiAobGJxX2Rlc2MtPnAubGJxX3BhZ2UgPT0gTlVMTCkgewogCQkJCVFQUklOVEsocWRldiwgUlhfU1RBVFVTLCBERUJVRywKIAkJCQkJImxicTogZ2V0dGluZyBuZXcgcGFnZSBmb3IgaW5kZXggJWQuXG4iLApAQCAtOTA2LDEwICs5MDQsNyBAQAogCQkJCX0KIAkJCQlwY2lfdW5tYXBfYWRkcl9zZXQobGJxX2Rlc2MsIG1hcGFkZHIsIG1hcCk7CiAJCQkJcGNpX3VubWFwX2xlbl9zZXQobGJxX2Rlc2MsIG1hcGxlbiwgUEFHRV9TSVpFKTsKLQkJCQlicS0+YWRkcl9sbyA9CS8qbGJxX2Rlc2MtPmFkZHJfbG8gPSAqLwotCQkJCSAgICBjcHVfdG9fbGUzMihtYXApOwotCQkJCWJxLT5hZGRyX2hpID0JLypsYnFfZGVzYy0+YWRkcl9oaSA9ICovCi0JCQkJICAgIGNwdV90b19sZTMyKG1hcCA+PiAzMik7CisJCQkJKmxicV9kZXNjLT5hZGRyID0gY3B1X3RvX2xlNjQobWFwKTsKIAkJCX0KIAkJCWNsZWFuX2lkeCsrOwogCQkJaWYgKGNsZWFuX2lkeCA9PSByeF9yaW5nLT5sYnFfbGVuKQpAQCAtOTM0LDcgKzkyOSw2IEBACiB7CiAJaW50IGNsZWFuX2lkeCA9IHJ4X3JpbmctPnNicV9jbGVhbl9pZHg7CiAJc3RydWN0IGJxX2Rlc2MgKnNicV9kZXNjOwotCXN0cnVjdCBicV9lbGVtZW50ICpicTsKIAl1NjQgbWFwOwogCWludCBpOwogCkBAIC05NDQsNyArOTM4LDYgQEAKIAkJCVFQUklOVEsocWRldiwgUlhfU1RBVFVTLCBERUJVRywKIAkJCQkic2JxOiB0cnkgY2xlYW5pbmcgY2xlYW5faWR4ID0gJWQuXG4iLAogCQkJCWNsZWFuX2lkeCk7Ci0JCQlicSA9IHNicV9kZXNjLT5icTsKIAkJCWlmIChzYnFfZGVzYy0+cC5za2IgPT0gTlVMTCkgewogCQkJCVFQUklOVEsocWRldiwgUlhfU1RBVFVTLCBERUJVRywKIAkJCQkJInNicTogZ2V0dGluZyBuZXcgc2tiIGZvciBpbmRleCAlZC5cbiIsCkBAIC05NjMsMTEgKzk1NiwxNSBAQAogCQkJCQkJICAgICBzYnFfZGVzYy0+cC5za2ItPmRhdGEsCiAJCQkJCQkgICAgIHJ4X3JpbmctPnNicV9idWZfc2l6ZSAvCiAJCQkJCQkgICAgIDIsIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQkJaWYgKHBjaV9kbWFfbWFwcGluZ19lcnJvcihxZGV2LT5wZGV2LCBtYXApKSB7CisJCQkJCVFQUklOVEsocWRldiwgSUZVUCwgRVJSLCAiUENJIG1hcHBpbmcgZmFpbGVkLlxuIik7CisJCQkJCXJ4X3JpbmctPnNicV9jbGVhbl9pZHggPSBjbGVhbl9pZHg7CisJCQkJCXJldHVybjsKKwkJCQl9CiAJCQkJcGNpX3VubWFwX2FkZHJfc2V0KHNicV9kZXNjLCBtYXBhZGRyLCBtYXApOwogCQkJCXBjaV91bm1hcF9sZW5fc2V0KHNicV9kZXNjLCBtYXBsZW4sCiAJCQkJCQkgIHJ4X3JpbmctPnNicV9idWZfc2l6ZSAvIDIpOwotCQkJCWJxLT5hZGRyX2xvID0gY3B1X3RvX2xlMzIobWFwKTsKLQkJCQlicS0+YWRkcl9oaSA9IGNwdV90b19sZTMyKG1hcCA+PiAzMik7CisJCQkJKnNicV9kZXNjLT5hZGRyID0gY3B1X3RvX2xlNjQobWFwKTsKIAkJCX0KIAogCQkJY2xlYW5faWR4Kys7CkBAIC0xMzAzLDYgKzEzMDAsMTEgQEAKIAkJCQkJIk5vIHNrYiBhdmFpbGFibGUsIGRyb3AgdGhlIHBhY2tldC5cbiIpOwogCQkJCXJldHVybiBOVUxMOwogCQkJfQorCQkJcGNpX3VubWFwX3BhZ2UocWRldi0+cGRldiwKKwkJCQkgICAgICAgcGNpX3VubWFwX2FkZHIobGJxX2Rlc2MsCisJCQkJCQkgICAgICBtYXBhZGRyKSwKKwkJCQkgICAgICAgcGNpX3VubWFwX2xlbihsYnFfZGVzYywgbWFwbGVuKSwKKwkJCQkgICAgICAgUENJX0RNQV9GUk9NREVWSUNFKTsKIAkJCXNrYl9yZXNlcnZlKHNrYiwgTkVUX0lQX0FMSUdOKTsKIAkJCVFQUklOVEsocWRldiwgUlhfU1RBVFVTLCBERUJVRywKIAkJCQkiJWQgYnl0ZXMgb2YgaGVhZGVycyBhbmQgZGF0YSBpbiBsYXJnZS4gQ2hhaW4gcGFnZSB0byBuZXcgc2tiIGFuZCBwdWxsIHRhaWwuXG4iLCBsZW5ndGgpOwpAQCAtMTMzMCw3ICsxMzMyLDcgQEAKIAkJICogICAgICAgICAgZXZlbnR1YWxseSBiZSBpbiB0cm91YmxlLgogCQkgKi8KIAkJaW50IHNpemUsIG9mZnNldCwgaSA9IDA7Ci0JCXN0cnVjdCBicV9lbGVtZW50ICpicSwgYnFfYXJyYXlbOF07CisJCV9fbGU2NCAqYnEsIGJxX2FycmF5WzhdOwogCQlzYnFfZGVzYyA9IHFsX2dldF9jdXJyX3NidWYocnhfcmluZyk7CiAJCXBjaV91bm1hcF9zaW5nbGUocWRldi0+cGRldiwKIAkJCQkgcGNpX3VubWFwX2FkZHIoc2JxX2Rlc2MsIG1hcGFkZHIpLApAQCAtMTM1NiwxNiArMTM1OCwxMCBAQAogCQl9IGVsc2UgewogCQkJUVBSSU5USyhxZGV2LCBSWF9TVEFUVVMsIERFQlVHLAogCQkJCSJIZWFkZXJzIGluIHNtYWxsLCAlZCBieXRlcyBvZiBkYXRhIGluIGNoYWluIG9mIGxhcmdlLlxuIiwgbGVuZ3RoKTsKLQkJCWJxID0gKHN0cnVjdCBicV9lbGVtZW50ICopc2JxX2Rlc2MtPnAuc2tiLT5kYXRhOworCQkJYnEgPSAoX19sZTY0ICopc2JxX2Rlc2MtPnAuc2tiLT5kYXRhOwogCQl9CiAJCXdoaWxlIChsZW5ndGggPiAwKSB7CiAJCQlsYnFfZGVzYyA9IHFsX2dldF9jdXJyX2xidWYocnhfcmluZyk7Ci0JCQlpZiAoKGJxLT5hZGRyX2xvICYgfkJRX01BU0spICE9IGxicV9kZXNjLT5icS0+YWRkcl9sbykgewotCQkJCVFQUklOVEsocWRldiwgUlhfU1RBVFVTLCBFUlIsCi0JCQkJCSJQYW5pYyEhISBiYWQgbGFyZ2UgYnVmZmVyIGFkZHJlc3MsIGV4cGVjdGVkIDB4JS4wOHgsIGdvdCAweCUuMDh4LlxuIiwKLQkJCQkJbGJxX2Rlc2MtPmJxLT5hZGRyX2xvLCBicS0+YWRkcl9sbyk7Ci0JCQkJcmV0dXJuIE5VTEw7Ci0JCQl9CiAJCQlwY2lfdW5tYXBfcGFnZShxZGV2LT5wZGV2LAogCQkJCSAgICAgICBwY2lfdW5tYXBfYWRkcihsYnFfZGVzYywKIAkJCQkJCSAgICAgIG1hcGFkZHIpLApAQCAtMTU0OSw3ICsxNTQ1LDcgQEAKIHN0YXRpYyBpbnQgcWxfY2xlYW5fb3V0Ym91bmRfcnhfcmluZyhzdHJ1Y3QgcnhfcmluZyAqcnhfcmluZykKIHsKIAlzdHJ1Y3QgcWxfYWRhcHRlciAqcWRldiA9IHJ4X3JpbmctPnFkZXY7Ci0JdTMyIHByb2QgPSBxbF9yZWFkX3NoX3JlZyhyeF9yaW5nLT5wcm9kX2lkeF9zaF9yZWcpOworCXUzMiBwcm9kID0gbGUzMl90b19jcHUoKnJ4X3JpbmctPnByb2RfaWR4X3NoX3JlZyk7CiAJc3RydWN0IG9iX21hY19pb2NiX3JzcCAqbmV0X3JzcCA9IE5VTEw7CiAJaW50IGNvdW50ID0gMDsKIApAQCAtMTU3NSw3ICsxNTcxLDcgQEAKIAkJfQogCQljb3VudCsrOwogCQlxbF91cGRhdGVfY3EocnhfcmluZyk7Ci0JCXByb2QgPSBxbF9yZWFkX3NoX3JlZyhyeF9yaW5nLT5wcm9kX2lkeF9zaF9yZWcpOworCQlwcm9kID0gbGUzMl90b19jcHUoKnJ4X3JpbmctPnByb2RfaWR4X3NoX3JlZyk7CiAJfQogCXFsX3dyaXRlX2NxX2lkeChyeF9yaW5nKTsKIAlpZiAobmV0aWZfcXVldWVfc3RvcHBlZChxZGV2LT5uZGV2KSAmJiBuZXRfcnNwICE9IE5VTEwpIHsKQEAgLTE1OTUsNyArMTU5MSw3IEBACiBzdGF0aWMgaW50IHFsX2NsZWFuX2luYm91bmRfcnhfcmluZyhzdHJ1Y3QgcnhfcmluZyAqcnhfcmluZywgaW50IGJ1ZGdldCkKIHsKIAlzdHJ1Y3QgcWxfYWRhcHRlciAqcWRldiA9IHJ4X3JpbmctPnFkZXY7Ci0JdTMyIHByb2QgPSBxbF9yZWFkX3NoX3JlZyhyeF9yaW5nLT5wcm9kX2lkeF9zaF9yZWcpOworCXUzMiBwcm9kID0gbGUzMl90b19jcHUoKnJ4X3JpbmctPnByb2RfaWR4X3NoX3JlZyk7CiAJc3RydWN0IHFsX25ldF9yc3BfaW9jYiAqbmV0X3JzcDsKIAlpbnQgY291bnQgPSAwOwogCkBAIC0xNjI4LDcgKzE2MjQsNyBAQAogCQl9CiAJCWNvdW50Kys7CiAJCXFsX3VwZGF0ZV9jcShyeF9yaW5nKTsKLQkJcHJvZCA9IHFsX3JlYWRfc2hfcmVnKHJ4X3JpbmctPnByb2RfaWR4X3NoX3JlZyk7CisJCXByb2QgPSBsZTMyX3RvX2NwdSgqcnhfcmluZy0+cHJvZF9pZHhfc2hfcmVnKTsKIAkJaWYgKGNvdW50ID09IGJ1ZGdldCkKIAkJCWJyZWFrOwogCX0KQEAgLTE3OTEsNyArMTc4Nyw3IEBACiAJICogQ2hlY2sgdGhlIGRlZmF1bHQgcXVldWUgYW5kIHdha2UgaGFuZGxlciBpZiBhY3RpdmUuCiAJICovCiAJcnhfcmluZyA9ICZxZGV2LT5yeF9yaW5nWzBdOwotCWlmIChxbF9yZWFkX3NoX3JlZyhyeF9yaW5nLT5wcm9kX2lkeF9zaF9yZWcpICE9IHJ4X3JpbmctPmNuc21yX2lkeCkgeworCWlmIChsZTMyX3RvX2NwdSgqcnhfcmluZy0+cHJvZF9pZHhfc2hfcmVnKSAhPSByeF9yaW5nLT5jbnNtcl9pZHgpIHsKIAkJUVBSSU5USyhxZGV2LCBJTlRSLCBJTkZPLCAiV2FraW5nIGhhbmRsZXIgZm9yIHJ4X3JpbmdbMF0uXG4iKTsKIAkJcWxfZGlzYWJsZV9jb21wbGV0aW9uX2ludGVycnVwdChxZGV2LCBpbnRyX2NvbnRleHQtPmludHIpOwogCQlxdWV1ZV9kZWxheWVkX3dvcmtfb24oc21wX3Byb2Nlc3Nvcl9pZCgpLCBxZGV2LT5xX3dvcmtxdWV1ZSwKQEAgLTE4MDUsNyArMTgwMSw3IEBACiAJCSAqLwogCQlmb3IgKGkgPSAxOyBpIDwgcWRldi0+cnhfcmluZ19jb3VudDsgaSsrKSB7CiAJCQlyeF9yaW5nID0gJnFkZXYtPnJ4X3JpbmdbaV07Ci0JCQlpZiAocWxfcmVhZF9zaF9yZWcocnhfcmluZy0+cHJvZF9pZHhfc2hfcmVnKSAhPQorCQkJaWYgKGxlMzJfdG9fY3B1KCpyeF9yaW5nLT5wcm9kX2lkeF9zaF9yZWcpICE9CiAJCQkgICAgcnhfcmluZy0+Y25zbXJfaWR4KSB7CiAJCQkJUVBSSU5USyhxZGV2LCBJTlRSLCBJTkZPLAogCQkJCQkiV2FraW5nIGhhbmRsZXIgZm9yIHJ4X3JpbmdbJWRdLlxuIiwgaSk7CkBAIC0xODc0LDcgKzE4NzAsNyBAQAogewogCWludCBsZW47CiAJc3RydWN0IGlwaGRyICppcGggPSBpcF9oZHIoc2tiKTsKLQl1MTYgKmNoZWNrOworCV9fc3VtMTYgKmNoZWNrOwogCW1hY19pb2NiX3B0ci0+b3Bjb2RlID0gT1BDT0RFX09CX01BQ19UU09fSU9DQjsKIAltYWNfaW9jYl9wdHItPmZyYW1lX2xlbiA9IGNwdV90b19sZTMyKCh1MzIpIHNrYi0+bGVuKTsKIAltYWNfaW9jYl9wdHItPm5ldF90cmFuc19vZmZzZXQgPQpAQCAtMjA4Myw4ICsyMDc5LDYgQEAKIAkJCXB1dF9wYWdlKGxicV9kZXNjLT5wLmxicV9wYWdlKTsKIAkJCWxicV9kZXNjLT5wLmxicV9wYWdlID0gTlVMTDsKIAkJfQotCQlsYnFfZGVzYy0+YnEtPmFkZHJfbG8gPSAwOwotCQlsYnFfZGVzYy0+YnEtPmFkZHJfaGkgPSAwOwogCX0KIH0KIApAQCAtMjA5NywxMiArMjA5MSwxMiBAQAogCWludCBpOwogCXN0cnVjdCBicV9kZXNjICpsYnFfZGVzYzsKIAl1NjQgbWFwOwotCXN0cnVjdCBicV9lbGVtZW50ICpicSA9IHJ4X3JpbmctPmxicV9iYXNlOworCV9fbGU2NCAqYnEgPSByeF9yaW5nLT5sYnFfYmFzZTsKIAogCWZvciAoaSA9IDA7IGkgPCByeF9yaW5nLT5sYnFfbGVuOyBpKyspIHsKIAkJbGJxX2Rlc2MgPSAmcnhfcmluZy0+bGJxW2ldOwogCQltZW1zZXQobGJxX2Rlc2MsIDAsIHNpemVvZihsYnFfZGVzYykpOwotCQlsYnFfZGVzYy0+YnEgPSBicTsKKwkJbGJxX2Rlc2MtPmFkZHIgPSBicTsKIAkJbGJxX2Rlc2MtPmluZGV4ID0gaTsKIAkJbGJxX2Rlc2MtPnAubGJxX3BhZ2UgPSBhbGxvY19wYWdlKEdGUF9BVE9NSUMpOwogCQlpZiAodW5saWtlbHkoIWxicV9kZXNjLT5wLmxicV9wYWdlKSkgewpAQCAtMjExOSw4ICsyMTEzLDcgQEAKIAkJCX0KIAkJCXBjaV91bm1hcF9hZGRyX3NldChsYnFfZGVzYywgbWFwYWRkciwgbWFwKTsKIAkJCXBjaV91bm1hcF9sZW5fc2V0KGxicV9kZXNjLCBtYXBsZW4sIFBBR0VfU0laRSk7Ci0JCQlicS0+YWRkcl9sbyA9IGNwdV90b19sZTMyKG1hcCk7Ci0JCQlicS0+YWRkcl9oaSA9IGNwdV90b19sZTMyKG1hcCA+PiAzMik7CisJCQkqbGJxX2Rlc2MtPmFkZHIgPSBjcHVfdG9fbGU2NChtYXApOwogCQl9CiAJCWJxKys7CiAJfQpAQCAtMjE0OSwxMyArMjE0Miw2IEBACiAJCQlkZXZfa2ZyZWVfc2tiKHNicV9kZXNjLT5wLnNrYik7CiAJCQlzYnFfZGVzYy0+cC5za2IgPSBOVUxMOwogCQl9Ci0JCWlmIChzYnFfZGVzYy0+YnEgPT0gTlVMTCkgewotCQkJUVBSSU5USyhxZGV2LCBJRlVQLCBFUlIsICJzYnFfZGVzYy0+YnEgJWQgaXMgTlVMTC5cbiIsCi0JCQkJaSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc2JxX2Rlc2MtPmJxLT5hZGRyX2xvID0gMDsKLQkJc2JxX2Rlc2MtPmJxLT5hZGRyX2hpID0gMDsKIAl9CiB9CiAKQEAgLTIxNjcsMTMgKzIxNTMsMTMgQEAKIAlzdHJ1Y3QgYnFfZGVzYyAqc2JxX2Rlc2M7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAl1NjQgbWFwOwotCXN0cnVjdCBicV9lbGVtZW50ICpicSA9IHJ4X3JpbmctPnNicV9iYXNlOworCV9fbGU2NCAqYnEgPSByeF9yaW5nLT5zYnFfYmFzZTsKIAogCWZvciAoaSA9IDA7IGkgPCByeF9yaW5nLT5zYnFfbGVuOyBpKyspIHsKIAkJc2JxX2Rlc2MgPSAmcnhfcmluZy0+c2JxW2ldOwogCQltZW1zZXQoc2JxX2Rlc2MsIDAsIHNpemVvZihzYnFfZGVzYykpOwogCQlzYnFfZGVzYy0+aW5kZXggPSBpOwotCQlzYnFfZGVzYy0+YnEgPSBicTsKKwkJc2JxX2Rlc2MtPmFkZHIgPSBicTsKIAkJc2tiID0gbmV0ZGV2X2FsbG9jX3NrYihxZGV2LT5uZGV2LCByeF9yaW5nLT5zYnFfYnVmX3NpemUpOwogCQlpZiAodW5saWtlbHkoIXNrYikpIHsKIAkJCS8qIEJldHRlciBsdWNrIG5leHQgcm91bmQgKi8KQEAgLTIxOTksMTAgKzIxODUsNyBAQAogCQl9CiAJCXBjaV91bm1hcF9hZGRyX3NldChzYnFfZGVzYywgbWFwYWRkciwgbWFwKTsKIAkJcGNpX3VubWFwX2xlbl9zZXQoc2JxX2Rlc2MsIG1hcGxlbiwgcnhfcmluZy0+c2JxX2J1Zl9zaXplIC8gMik7Ci0JCWJxLT5hZGRyX2xvID0JLypzYnFfZGVzYy0+YWRkcl9sbyA9ICovCi0JCSAgICBjcHVfdG9fbGUzMihtYXApOwotCQlicS0+YWRkcl9oaSA9CS8qc2JxX2Rlc2MtPmFkZHJfaGkgPSAqLwotCQkgICAgY3B1X3RvX2xlMzIobWFwID4+IDMyKTsKKwkJKnNicV9kZXNjLT5hZGRyID0gY3B1X3RvX2xlNjQobWFwKTsKIAkJYnErKzsKIAl9CiAJcmV0dXJuIDA7CkBAIC0yNDgxLDcgKzI0NjQsOCBAQAogCW1lbXNldCgodm9pZCAqKWNxaWNiLCAwLCBzaXplb2Yoc3RydWN0IGNxaWNiKSk7CiAJY3FpY2ItPm1zaXhfdmVjdCA9IHJ4X3JpbmctPmlycTsKIAotCWNxaWNiLT5sZW4gPSBjcHVfdG9fbGUxNihyeF9yaW5nLT5jcV9sZW4gfCBMRU5fViB8IExFTl9DUFBfQ09OVCk7CisJYnFfbGVuID0gKHJ4X3JpbmctPmNxX2xlbiA9PSA2NTUzNikgPyAwIDogKHUxNikgcnhfcmluZy0+Y3FfbGVuOworCWNxaWNiLT5sZW4gPSBjcHVfdG9fbGUxNihicV9sZW4gfCBMRU5fViB8IExFTl9DUFBfQ09OVCk7CiAKIAljcWljYi0+YWRkcl9sbyA9IGNwdV90b19sZTMyKHJ4X3JpbmctPmNxX2Jhc2VfZG1hKTsKIAljcWljYi0+YWRkcl9oaSA9IGNwdV90b19sZTMyKCh1NjQpIHJ4X3JpbmctPmNxX2Jhc2VfZG1hID4+IDMyKTsKQEAgLTI1MDMsOCArMjQ4NywxMSBAQAogCQkgICAgY3B1X3RvX2xlMzIocnhfcmluZy0+bGJxX2Jhc2VfaW5kaXJlY3RfZG1hKTsKIAkJY3FpY2ItPmxicV9hZGRyX2hpID0KIAkJICAgIGNwdV90b19sZTMyKCh1NjQpIHJ4X3JpbmctPmxicV9iYXNlX2luZGlyZWN0X2RtYSA+PiAzMik7Ci0JCWNxaWNiLT5sYnFfYnVmX3NpemUgPSBjcHVfdG9fbGUzMihyeF9yaW5nLT5sYnFfYnVmX3NpemUpOwotCQlicV9sZW4gPSAodTE2KSByeF9yaW5nLT5sYnFfbGVuOworCQlicV9sZW4gPSAocnhfcmluZy0+bGJxX2J1Zl9zaXplID09IDY1NTM2KSA/IDAgOgorCQkJKHUxNikgcnhfcmluZy0+bGJxX2J1Zl9zaXplOworCQljcWljYi0+bGJxX2J1Zl9zaXplID0gY3B1X3RvX2xlMTYoYnFfbGVuKTsKKwkJYnFfbGVuID0gKHJ4X3JpbmctPmxicV9sZW4gPT0gNjU1MzYpID8gMCA6CisJCQkodTE2KSByeF9yaW5nLT5sYnFfbGVuOwogCQljcWljYi0+bGJxX2xlbiA9IGNwdV90b19sZTE2KGJxX2xlbik7CiAJCXJ4X3JpbmctPmxicV9wcm9kX2lkeCA9IHJ4X3JpbmctPmxicV9sZW4gLSAxNjsKIAkJcnhfcmluZy0+bGJxX2N1cnJfaWR4ID0gMDsKQEAgLTI1MjAsNyArMjUwNyw4IEBACiAJCSAgICBjcHVfdG9fbGUzMigodTY0KSByeF9yaW5nLT5zYnFfYmFzZV9pbmRpcmVjdF9kbWEgPj4gMzIpOwogCQljcWljYi0+c2JxX2J1Zl9zaXplID0KIAkJICAgIGNwdV90b19sZTE2KCgocnhfcmluZy0+c2JxX2J1Zl9zaXplIC8gMikgKyA4KSAmIDB4ZmZmZmZmZjgpOwotCQlicV9sZW4gPSAodTE2KSByeF9yaW5nLT5zYnFfbGVuOworCQlicV9sZW4gPSAocnhfcmluZy0+c2JxX2xlbiA9PSA2NTUzNikgPyAwIDoKKwkJCSh1MTYpIHJ4X3JpbmctPnNicV9sZW47CiAJCWNxaWNiLT5zYnFfbGVuID0gY3B1X3RvX2xlMTYoYnFfbGVuKTsKIAkJcnhfcmluZy0+c2JxX3Byb2RfaWR4ID0gcnhfcmluZy0+c2JxX2xlbiAtIDE2OwogCQlyeF9yaW5nLT5zYnFfY3Vycl9pZHggPSAwOwpAQCAtMzM0MSwxMSArMzMyOSwxMSBAQAogCQkJICAgIHJ4X3JpbmctPmNxX2xlbiAqIHNpemVvZihzdHJ1Y3QgcWxfbmV0X3JzcF9pb2NiKTsKIAkJCXJ4X3JpbmctPmxicV9sZW4gPSBOVU1fTEFSR0VfQlVGRkVSUzsKIAkJCXJ4X3JpbmctPmxicV9zaXplID0KLQkJCSAgICByeF9yaW5nLT5sYnFfbGVuICogc2l6ZW9mKHN0cnVjdCBicV9lbGVtZW50KTsKKwkJCSAgICByeF9yaW5nLT5sYnFfbGVuICogc2l6ZW9mKF9fbGU2NCk7CiAJCQlyeF9yaW5nLT5sYnFfYnVmX3NpemUgPSBMQVJHRV9CVUZGRVJfU0laRTsKIAkJCXJ4X3JpbmctPnNicV9sZW4gPSBOVU1fU01BTExfQlVGRkVSUzsKIAkJCXJ4X3JpbmctPnNicV9zaXplID0KLQkJCSAgICByeF9yaW5nLT5zYnFfbGVuICogc2l6ZW9mKHN0cnVjdCBicV9lbGVtZW50KTsKKwkJCSAgICByeF9yaW5nLT5zYnFfbGVuICogc2l6ZW9mKF9fbGU2NCk7CiAJCQlyeF9yaW5nLT5zYnFfYnVmX3NpemUgPSBTTUFMTF9CVUZGRVJfU0laRSAqIDI7CiAJCQlyeF9yaW5nLT50eXBlID0gREVGQVVMVF9ROwogCQl9IGVsc2UgaWYgKGkgPCBxZGV2LT5yc3NfcmluZ19maXJzdF9jcV9pZCkgewpAQCAtMzM3MiwxMSArMzM2MCwxMSBAQAogCQkJICAgIHJ4X3JpbmctPmNxX2xlbiAqIHNpemVvZihzdHJ1Y3QgcWxfbmV0X3JzcF9pb2NiKTsKIAkJCXJ4X3JpbmctPmxicV9sZW4gPSBOVU1fTEFSR0VfQlVGRkVSUzsKIAkJCXJ4X3JpbmctPmxicV9zaXplID0KLQkJCSAgICByeF9yaW5nLT5sYnFfbGVuICogc2l6ZW9mKHN0cnVjdCBicV9lbGVtZW50KTsKKwkJCSAgICByeF9yaW5nLT5sYnFfbGVuICogc2l6ZW9mKF9fbGU2NCk7CiAJCQlyeF9yaW5nLT5sYnFfYnVmX3NpemUgPSBMQVJHRV9CVUZGRVJfU0laRTsKIAkJCXJ4X3JpbmctPnNicV9sZW4gPSBOVU1fU01BTExfQlVGRkVSUzsKIAkJCXJ4X3JpbmctPnNicV9zaXplID0KLQkJCSAgICByeF9yaW5nLT5zYnFfbGVuICogc2l6ZW9mKHN0cnVjdCBicV9lbGVtZW50KTsKKwkJCSAgICByeF9yaW5nLT5zYnFfbGVuICogc2l6ZW9mKF9fbGU2NCk7CiAJCQlyeF9yaW5nLT5zYnFfYnVmX3NpemUgPSBTTUFMTF9CVUZGRVJfU0laRSAqIDI7CiAJCQlyeF9yaW5nLT50eXBlID0gUlhfUTsKIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcjYwNDAuYyBiL2RyaXZlcnMvbmV0L3I2MDQwLmMKaW5kZXggNTNiYmRkZi4uY2YzYTA4MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcjYwNDAuYworKysgYi9kcml2ZXJzL25ldC9yNjA0MC5jCkBAIC00OSw4ICs0OSw4IEBACiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgogCiAjZGVmaW5lIERSVl9OQU1FCSJyNjA0MCIKLSNkZWZpbmUgRFJWX1ZFUlNJT04JIjAuMTkiCi0jZGVmaW5lIERSVl9SRUxEQVRFCSIxOERlYzIwMDgiCisjZGVmaW5lIERSVl9WRVJTSU9OCSIwLjIwIgorI2RlZmluZSBEUlZfUkVMREFURQkiMDdKYW4yMDA5IgogCiAvKiBQSFkgQ0hJUCBBZGRyZXNzICovCiAjZGVmaW5lIFBIWTFfQUREUgkxCS8qIEZvciBNQUMxICovCkBAIC0yMDAsNyArMjAwLDcgQEAKIAogc3RhdGljIGNoYXIgdmVyc2lvbltdIF9fZGV2aW5pdGRhdGEgPSBLRVJOX0lORk8gRFJWX05BTUUKIAkiOiBSREMgUjYwNDAgTkFQSSBuZXQgZHJpdmVyLCIKLQkidmVyc2lvbiAiRFJWX1ZFUlNJT04gIiAoIiBEUlZfUkVMREFURSAiKVxuIjsKKwkidmVyc2lvbiAiRFJWX1ZFUlNJT04gIiAoIiBEUlZfUkVMREFURSAiKSI7CiAKIHN0YXRpYyBpbnQgcGh5X3RhYmxlW10gPSB7IFBIWTFfQUREUiwgUEhZMl9BRERSIH07CiAKQEAgLTMzMCw3ICszMzAsNyBAQAogCWRvIHsKIAkJc2tiID0gbmV0ZGV2X2FsbG9jX3NrYihkZXYsIE1BWF9CVUZfU0laRSk7CiAJCWlmICghc2tiKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgIiVzOiBmYWlsZWQgdG8gYWxsb2Mgc2tiIGZvciByeFxuIiwgZGV2LT5uYW1lKTsKKwkJCXByaW50ayhLRVJOX0VSUiBEUlZfTkFNRSAiJXM6IGZhaWxlZCB0byBhbGxvYyBza2IgZm9yIHJ4XG4iLCBkZXYtPm5hbWUpOwogCQkJcmMgPSAtRU5PTUVNOwogCQkJZ290byBlcnJfZXhpdDsKIAkJfQpAQCAtMTA3NywyMCArMTA3NywyMCBAQAogCS8qIHRoaXMgc2hvdWxkIGFsd2F5cyBiZSBzdXBwb3J0ZWQgKi8KIAllcnIgPSBwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV8zMkJJVF9NQVNLKTsKIAlpZiAoZXJyKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBEUlZfTkFNRSAiMzItYml0IFBDSSBETUEgYWRkcmVzc2VzIgorCQlwcmludGsoS0VSTl9FUlIgRFJWX05BTUUgIjogMzItYml0IFBDSSBETUEgYWRkcmVzc2VzIgogCQkJCSJub3Qgc3VwcG9ydGVkIGJ5IHRoZSBjYXJkXG4iKTsKIAkJZ290byBlcnJfb3V0OwogCX0KIAllcnIgPSBwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2socGRldiwgRE1BXzMyQklUX01BU0spOwogCWlmIChlcnIpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIERSVl9OQU1FICIzMi1iaXQgUENJIERNQSBhZGRyZXNzZXMiCisJCXByaW50ayhLRVJOX0VSUiBEUlZfTkFNRSAiOiAzMi1iaXQgUENJIERNQSBhZGRyZXNzZXMiCiAJCQkJIm5vdCBzdXBwb3J0ZWQgYnkgdGhlIGNhcmRcbiIpOwogCQlnb3RvIGVycl9vdXQ7CiAJfQogCiAJLyogSU8gU2l6ZSBjaGVjayAqLwogCWlmIChwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDApIDwgaW9fc2l6ZSkgewotCQlwcmludGsoS0VSTl9FUlIgRFJWX05BTUUgIkluc3VmZmljaWVudCBQQ0kgcmVzb3VyY2VzLCBhYm9ydGluZ1xuIik7CisJCXByaW50ayhLRVJOX0VSUiBEUlZfTkFNRSAiOiBJbnN1ZmZpY2llbnQgUENJIHJlc291cmNlcywgYWJvcnRpbmdcbiIpOwogCQllcnIgPSAtRUlPOwogCQlnb3RvIGVycl9vdXQ7CiAJfQpAQCAtMTEwMCw3ICsxMTAwLDcgQEAKIAogCWRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihzdHJ1Y3QgcjYwNDBfcHJpdmF0ZSkpOwogCWlmICghZGV2KSB7Ci0JCXByaW50ayhLRVJOX0VSUiBEUlZfTkFNRSAiRmFpbGVkIHRvIGFsbG9jYXRlIGV0aGVyZGV2XG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSIERSVl9OQU1FICI6IEZhaWxlZCB0byBhbGxvY2F0ZSBldGhlcmRldlxuIik7CiAJCWVyciA9IC1FTk9NRU07CiAJCWdvdG8gZXJyX291dDsKIAl9CkBAIC0xMTE2LDExICsxMTE2LDE1IEBACiAKIAlpb2FkZHIgPSBwY2lfaW9tYXAocGRldiwgYmFyLCBpb19zaXplKTsKIAlpZiAoIWlvYWRkcikgewotCQlwcmludGsoS0VSTl9FUlIgImlvcmVtYXAgZmFpbGVkIGZvciBkZXZpY2UgJXNcbiIsCisJCXByaW50ayhLRVJOX0VSUiBEUlZfTkFNRSAiOiBpb3JlbWFwIGZhaWxlZCBmb3IgZGV2aWNlICVzXG4iLAogCQkJcGNpX25hbWUocGRldikpOwogCQllcnIgPSAtRUlPOwogCQlnb3RvIGVycl9vdXRfZnJlZV9yZXM7CiAJfQorCS8qIElmIFBIWSBzdGF0dXMgY2hhbmdlIHJlZ2lzdGVyIGlzIHN0aWxsIHNldCB0byB6ZXJvIGl0IG1lYW5zIHRoZQorCSAqIGJvb3Rsb2FkZXIgZGlkbid0IGluaXRpYWxpemUgaXQgKi8KKwlpZiAoaW9yZWFkMTYoaW9hZGRyICsgUEhZX0NDKSA9PSAwKQorCQlpb3dyaXRlMTYoMHg5ZjA3LCBpb2FkZHIgKyBQSFlfQ0MpOwogCiAJLyogSW5pdCBzeXN0ZW0gJiBkZXZpY2UgKi8KIAlscC0+YmFzZSA9IGlvYWRkcjsKQEAgLTExMzcsNiArMTE0MSwxMSBAQAogCWFkcnBbMV0gPSBpb3JlYWQxNihpb2FkZHIgKyBNSURfME0pOwogCWFkcnBbMl0gPSBpb3JlYWQxNihpb2FkZHIgKyBNSURfMEgpOwogCisJLyogU29tZSBib290bG9hZGVyL0JJT1NlcyBkbyBub3QgaW5pdGlhbGl6ZQorCSAqIE1BQyBhZGRyZXNzLCB3YXJuIGFib3V0IHRoYXQgKi8KKwlpZiAoIShhZHJwWzBdIHx8IGFkcnBbMV0gfHwgYWRycFsyXSkpCisJCXByaW50ayhLRVJOX1dBUk5JTkcgRFJWX05BTUUgIjogTUFDIGFkZHJlc3Mgbm90IGluaXRpYWxpemVkXG4iKTsKKwogCS8qIExpbmsgbmV3IGRldmljZSBpbnRvIHI2MDQwX3Jvb3RfZGV2ICovCiAJbHAtPnBkZXYgPSBwZGV2OwogCWxwLT5kZXYgPSBkZXY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zYjEwMDAuYyBiL2RyaXZlcnMvbmV0L3NiMTAwMC5jCmluZGV4IGJlMzAyNTMuLmZjMGUzOGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3NiMTAwMC5jCisrKyBiL2RyaXZlcnMvbmV0L3NiMTAwMC5jCkBAIC0xMzQsNiArMTM0LDE2IEBACiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShwbnAsIHNiMTAwMF9wbnBfaWRzKTsKIAorc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyBzYjEwMDBfbmV0ZGV2X29wcyA9IHsKKwkubmRvX29wZW4JCT0gc2IxMDAwX29wZW4sCisJLm5kb19zdGFydF94bWl0CQk9IHNiMTAwMF9zdGFydF94bWl0LAorCS5uZG9fZG9faW9jdGwJCT0gc2IxMDAwX2Rldl9pb2N0bCwKKwkubmRvX3N0b3AJCT0gc2IxMDAwX2Nsb3NlLAorCS5uZG9fY2hhbmdlX210dQkJPSBldGhfY2hhbmdlX210dSwKKwkubmRvX3NldF9tYWNfYWRkcmVzcyAJPSBldGhfbWFjX2FkZHIsCisJLm5kb192YWxpZGF0ZV9hZGRyCT0gZXRoX3ZhbGlkYXRlX2FkZHIsCit9OworCiBzdGF0aWMgaW50CiBzYjEwMDBfcHJvYmVfb25lKHN0cnVjdCBwbnBfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcG5wX2RldmljZV9pZCAqaWQpCiB7CkBAIC0xOTIsMTEgKzIwMiw3IEBACiAJaWYgKHNiMTAwMF9kZWJ1ZyA+IDApCiAJCXByaW50ayhLRVJOX05PVElDRSAiJXMiLCB2ZXJzaW9uKTsKIAotCS8qIFRoZSBTQjEwMDAtc3BlY2lmaWMgZW50cmllcyBpbiB0aGUgZGV2aWNlIHN0cnVjdHVyZS4gKi8KLQlkZXYtPm9wZW4JCT0gc2IxMDAwX29wZW47Ci0JZGV2LT5kb19pb2N0bAkJPSBzYjEwMDBfZGV2X2lvY3RsOwotCWRldi0+aGFyZF9zdGFydF94bWl0CT0gc2IxMDAwX3N0YXJ0X3htaXQ7Ci0JZGV2LT5zdG9wCQk9IHNiMTAwMF9jbG9zZTsKKwlkZXYtPm5ldGRldl9vcHMJPSAmc2IxMDAwX25ldGRldl9vcHM7CiAKIAkvKiBoYXJkd2FyZSBhZGRyZXNzIGlzIDA6MDpzZXJpYWxfbnVtYmVyICovCiAJZGV2LT5kZXZfYWRkclsyXQk9IHNlcmlhbF9udW1iZXIgPj4gMjQgJiAweGZmOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2ZjL2ZhbGNvbi5jIGIvZHJpdmVycy9uZXQvc2ZjL2ZhbGNvbi5jCmluZGV4IDY4ODRkYzguLjViOWYyZDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3NmYy9mYWxjb24uYworKysgYi9kcml2ZXJzL25ldC9zZmMvZmFsY29uLmMKQEAgLTE0MDMsOSArMTQwMyw5IEBACiAJfQogCiAJLyogRGlzYWJsZSBib3RoIGRldmljZXMgKi8KLQlwY2lfZGlzYWJsZV9kZXZpY2UoZWZ4LT5wY2lfZGV2KTsKKwlwY2lfY2xlYXJfbWFzdGVyKGVmeC0+cGNpX2Rldik7CiAJaWYgKEZBTENPTl9JU19EVUFMX0ZVTkMoZWZ4KSkKLQkJcGNpX2Rpc2FibGVfZGV2aWNlKG5pY19kYXRhLT5wY2lfZGV2Mik7CisJCXBjaV9jbGVhcl9tYXN0ZXIobmljX2RhdGEtPnBjaV9kZXYyKTsKIAlmYWxjb25fZGlzYWJsZV9pbnRlcnJ1cHRzKGVmeCk7CiAKIAlpZiAoKytuX2ludF9lcnJvcnMgPCBGQUxDT05fTUFYX0lOVF9FUlJPUlMpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NpczE5MC5jIGIvZHJpdmVycy9uZXQvc2lzMTkwLmMKaW5kZXggODNjYzNjNS4uYTk3MzI2OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc2lzMTkwLmMKKysrIGIvZHJpdmVycy9uZXQvc2lzMTkwLmMKQEAgLTE3ODIsNiArMTc4MiwyMSBAQAogCQlnZW5lcmljX21paV9pb2N0bCgmdHAtPm1paV9pZiwgaWZfbWlpKGlmciksIGNtZCwgTlVMTCk7CiB9CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgc2lzMTkwX25ldGRldl9vcHMgPSB7CisJLm5kb19vcGVuCQk9IHNpczE5MF9vcGVuLAorCS5uZG9fc3RvcAkJPSBzaXMxOTBfY2xvc2UsCisJLm5kb19kb19pb2N0bAkJPSBzaXMxOTBfaW9jdGwsCisJLm5kb19zdGFydF94bWl0CQk9IHNpczE5MF9zdGFydF94bWl0LAorCS5uZG9fdHhfdGltZW91dAkJPSBzaXMxOTBfdHhfdGltZW91dCwKKwkubmRvX3NldF9tdWx0aWNhc3RfbGlzdCA9IHNpczE5MF9zZXRfcnhfbW9kZSwKKwkubmRvX2NoYW5nZV9tdHUJCT0gZXRoX2NoYW5nZV9tdHUsCisJLm5kb19zZXRfbWFjX2FkZHJlc3MgCT0gZXRoX21hY19hZGRyLAorCS5uZG9fdmFsaWRhdGVfYWRkcgk9IGV0aF92YWxpZGF0ZV9hZGRyLAorI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCisJLm5kb19wb2xsX2NvbnRyb2xsZXIJID0gc2lzMTkwX25ldHBvbGwsCisjZW5kaWYKK307CisKIHN0YXRpYyBpbnQgX19kZXZpbml0IHNpczE5MF9pbml0X29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKIAkJCQkgICAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCiB7CkBAIC0xODE1LDE5ICsxODMwLDEyIEBACiAKIAlJTklUX1dPUksoJnRwLT5waHlfdGFzaywgc2lzMTkwX3BoeV90YXNrKTsKIAotCWRldi0+b3BlbiA9IHNpczE5MF9vcGVuOwotCWRldi0+c3RvcCA9IHNpczE5MF9jbG9zZTsKLQlkZXYtPmRvX2lvY3RsID0gc2lzMTkwX2lvY3RsOwotCWRldi0+dHhfdGltZW91dCA9IHNpczE5MF90eF90aW1lb3V0OwotCWRldi0+d2F0Y2hkb2dfdGltZW8gPSBTSVMxOTBfVFhfVElNRU9VVDsKLQlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9IHNpczE5MF9zdGFydF94bWl0OwotI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCi0JZGV2LT5wb2xsX2NvbnRyb2xsZXIgPSBzaXMxOTBfbmV0cG9sbDsKLSNlbmRpZgotCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gc2lzMTkwX3NldF9yeF9tb2RlOworCWRldi0+bmV0ZGV2X29wcyA9ICZzaXMxOTBfbmV0ZGV2X29wczsKKwogCVNFVF9FVEhUT09MX09QUyhkZXYsICZzaXMxOTBfZXRodG9vbF9vcHMpOwogCWRldi0+aXJxID0gcGRldi0+aXJxOwogCWRldi0+YmFzZV9hZGRyID0gKHVuc2lnbmVkIGxvbmcpIDB4ZGVhZDsKKwlkZXYtPndhdGNoZG9nX3RpbWVvID0gU0lTMTkwX1RYX1RJTUVPVVQ7CiAKIAlzcGluX2xvY2tfaW5pdCgmdHAtPmxvY2spOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zbGlwLmMgYi9kcml2ZXJzL25ldC9zbGlwLmMKaW5kZXggOGUxYzBiYS4uNWM2MWQ1ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc2xpcC5jCisrKyBiL2RyaXZlcnMvbmV0L3NsaXAuYwpAQCAtNjAzLDcgKzYwMyw2IEBACiAJZGV2LT5tdHUJCT0gc2wtPm10dTsKIAlkZXYtPnR5cGUJCT0gQVJQSFJEX1NMSVAgKyBzbC0+bW9kZTsKICNpZmRlZiBTTF9DSEVDS19UUkFOU01JVAotCWRldi0+dHhfdGltZW91dAkJPSBzbF90eF90aW1lb3V0OwogCWRldi0+d2F0Y2hkb2dfdGltZW8JPSAyMCpIWjsKICNlbmRpZgogCXJldHVybiAwOwpAQCAtNjE3LDE5ICs2MTYsMjYgQEAKIAlzbF9mcmVlX2J1ZnMoc2wpOwogfQogCitzdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIHNsX25ldGRldl9vcHMgPSB7CisJLm5kb19pbml0CQk9IHNsX2luaXQsCisJLm5kb191bmluaXQJICAJPSBzbF91bmluaXQsCisJLm5kb19vcGVuCQk9IHNsX29wZW4sCisJLm5kb19zdG9wCQk9IHNsX2Nsb3NlLAorCS5uZG9fc3RhcnRfeG1pdAkJPSBzbF94bWl0LAorCS5uZG9fZ2V0X3N0YXRzCSAgICAgICAgPSBzbF9nZXRfc3RhdHMsCisJLm5kb19jaGFuZ2VfbXR1CQk9IHNsX2NoYW5nZV9tdHUsCisJLm5kb190eF90aW1lb3V0CQk9IHNsX3R4X3RpbWVvdXQsCisjaWZkZWYgQ09ORklHX1NMSVBfU01BUlQKKwkubmRvX2RvX2lvY3RsCQk9IHNsX2lvY3RsLAorI2VuZGlmCit9OworCisKIHN0YXRpYyB2b2lkIHNsX3NldHVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0JZGV2LT5pbml0CQk9IHNsX2luaXQ7Ci0JZGV2LT51bmluaXQJICAJPSBzbF91bmluaXQ7Ci0JZGV2LT5vcGVuCQk9IHNsX29wZW47CisJZGV2LT5uZXRkZXZfb3BzCQk9ICZzbF9uZXRkZXZfb3BzOwogCWRldi0+ZGVzdHJ1Y3RvcgkJPSBmcmVlX25ldGRldjsKLQlkZXYtPnN0b3AJCT0gc2xfY2xvc2U7Ci0JZGV2LT5nZXRfc3RhdHMJICAgICAgICA9IHNsX2dldF9zdGF0czsKLQlkZXYtPmNoYW5nZV9tdHUJCT0gc2xfY2hhbmdlX210dTsKLQlkZXYtPmhhcmRfc3RhcnRfeG1pdAk9IHNsX3htaXQ7Ci0jaWZkZWYgQ09ORklHX1NMSVBfU01BUlQKLQlkZXYtPmRvX2lvY3RsCQk9IHNsX2lvY3RsOwotI2VuZGlmCisKIAlkZXYtPmhhcmRfaGVhZGVyX2xlbgk9IDA7CiAJZGV2LT5hZGRyX2xlbgkJPSAwOwogCWRldi0+dHhfcXVldWVfbGVuCT0gMTA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zbGlwLmggYi9kcml2ZXJzL25ldC9zbGlwLmgKaW5kZXggODUzZTBmNi4uOWVhNWMxMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc2xpcC5oCisrKyBiL2RyaXZlcnMvbmV0L3NsaXAuaApAQCAtNzUsNyArNzUsNyBAQAogICB1bnNpZ25lZCBsb25nICAgICAgICAgdHhfZXJyb3JzOyAgICAgIC8qIFBsYW5uZWQgc3R1ZmYgICAgICAgICAgICAgICAgKi8KICAgdW5zaWduZWQgbG9uZyAgICAgICAgIHJ4X2Ryb3BwZWQ7ICAgICAvKiBObyBtZW1vcnkgZm9yIHNrYiAgICAgICAgICAgICovCiAgIHVuc2lnbmVkIGxvbmcgICAgICAgICB0eF9kcm9wcGVkOyAgICAgLyogV2hlbiBNVFUgY2hhbmdlICAgICAgICAgICAgICAqLwotICB1bnNpZ25lZCBsb25nICAgICAgICAgcnhfb3Zlcl9lcnJvcnM7IC8qIEZyYW1lIGJpZ2dlciB0aGVuIFNMSVAgYnVmLiAgKi8KKyAgdW5zaWduZWQgbG9uZyAgICAgICAgIHJ4X292ZXJfZXJyb3JzOyAvKiBGcmFtZSBiaWdnZXIgdGhhbiBTTElQIGJ1Zi4gICovCiAjaWZkZWYgU0xfSU5DTFVERV9DU0xJUAogICB1bnNpZ25lZCBsb25nCQl0eF9jb21wcmVzc2VkOwogICB1bnNpZ25lZCBsb25nCQlyeF9jb21wcmVzc2VkOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc3RhcmZpcmUuYyBiL2RyaXZlcnMvbmV0L3N0YXJmaXJlLmMKaW5kZXggZjU0YWMyMy4uZGEzYTc2YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc3RhcmZpcmUuYworKysgYi9kcml2ZXJzL25ldC9zdGFyZmlyZS5jCkBAIC00MiwxMSArNDIsMTEgQEAKICNpbmNsdWRlIDxsaW51eC9taWkuaD4KICNpbmNsdWRlIDxsaW51eC9pZl92bGFuLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4JCS8qIFByb2Nlc3NvciB0eXBlIGZvciBjYWNoZSBhbGlnbm1lbnQuICovCiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KIAotI2luY2x1ZGUgInN0YXJmaXJlX2Zpcm13YXJlLmgiCiAvKgogICogVGhlIGN1cnJlbnQgZnJhbWUgcHJvY2Vzc29yIGZpcm13YXJlIGZhaWxzIHRvIGNoZWNrc3VtIGEgZnJhZ21lbnQKICAqIG9mIGxlbmd0aCAxLiBJZiBhbmQgd2hlbiB0aGlzIGlzIGZpeGVkLCB0aGUgI2RlZmluZSBiZWxvdyBjYW4gYmUgcmVtb3ZlZC4KQEAgLTE3Myw2ICsxNzMsMTAgQEAKICNkZWZpbmUgc2tiX2ZpcnN0X2ZyYWdfbGVuKHNrYikJc2tiX2hlYWRsZW4oc2tiKQogI2RlZmluZSBza2JfbnVtX2ZyYWdzKHNrYikgKHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3MgKyAxKQogCisvKiBGaXJtd2FyZSBuYW1lcyAqLworI2RlZmluZSBGSVJNV0FSRV9SWAkiYWRhcHRlYy9zdGFyZmlyZV9yeC5iaW4iCisjZGVmaW5lIEZJUk1XQVJFX1RYCSJhZGFwdGVjL3N0YXJmaXJlX3R4LmJpbiIKKwogLyogVGhlc2UgaWRlbnRpZnkgdGhlIGRyaXZlciBiYXNlIHZlcnNpb24gYW5kIG1heSBub3QgYmUgcmVtb3ZlZC4gKi8KIHN0YXRpYyBjaGFyIHZlcnNpb25bXSA9CiBLRVJOX0lORk8gInN0YXJmaXJlLmM6djEuMDMgNy8yNi8yMDAwICBXcml0dGVuIGJ5IERvbmFsZCBCZWNrZXIgPGJlY2tlckBzY3lsZC5jb20+XG4iCkBAIC0xODIsNiArMTg2LDggQEAKIE1PRFVMRV9ERVNDUklQVElPTigiQWRhcHRlYyBTdGFyZmlyZSBFdGhlcm5ldCBkcml2ZXIiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIE1PRFVMRV9WRVJTSU9OKERSVl9WRVJTSU9OKTsKK01PRFVMRV9GSVJNV0FSRShGSVJNV0FSRV9SWCk7CitNT0RVTEVfRklSTVdBUkUoRklSTVdBUkVfVFgpOwogCiBtb2R1bGVfcGFyYW0obWF4X2ludGVycnVwdF93b3JrLCBpbnQsIDApOwogbW9kdWxlX3BhcmFtKG10dSwgaW50LCAwKTsKQEAgLTY0Miw2ICs2NDgsMjQgQEAKICNlbmRpZiAvKiBWTEFOX1NVUFBPUlQgKi8KIAogCitzdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIG5ldGRldl9vcHMgPSB7CisJLm5kb19vcGVuCQk9IG5ldGRldl9vcGVuLAorCS5uZG9fc3RvcAkJPSBuZXRkZXZfY2xvc2UsCisJLm5kb19zdGFydF94bWl0CQk9IHN0YXJ0X3R4LAorCS5uZG9fdHhfdGltZW91dCAJPSB0eF90aW1lb3V0LAorCS5uZG9fZ2V0X3N0YXRzIAkJPSBnZXRfc3RhdHMsCisJLm5kb19zZXRfbXVsdGljYXN0X2xpc3QgPSAmc2V0X3J4X21vZGUsCisJLm5kb19kb19pb2N0bCAJCT0gbmV0ZGV2X2lvY3RsLAorCS5uZG9fY2hhbmdlX210dQkJPSBldGhfY2hhbmdlX210dSwKKwkubmRvX3NldF9tYWNfYWRkcmVzcyAJPSBldGhfbWFjX2FkZHIsCisJLm5kb192YWxpZGF0ZV9hZGRyCT0gZXRoX3ZhbGlkYXRlX2FkZHIsCisjaWZkZWYgVkxBTl9TVVBQT1JUCisJLm5kb192bGFuX3J4X3JlZ2lzdGVyCT0gbmV0ZGV2X3ZsYW5fcnhfcmVnaXN0ZXIsCisJLm5kb192bGFuX3J4X2FkZF92aWQJPSBuZXRkZXZfdmxhbl9yeF9hZGRfdmlkLAorCS5uZG9fdmxhbl9yeF9raWxsX3ZpZAk9IG5ldGRldl92bGFuX3J4X2tpbGxfdmlkLAorI2VuZGlmCit9OworCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBzdGFyZmlyZV9pbml0X29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKIAkJCQkgICAgICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKIHsKQEAgLTcwNCwxMSArNzI4LDkgQEAKIAlpZiAoZW5hYmxlX2h3X2Nrc3VtKQogCQlkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfSVBfQ1NVTSB8IE5FVElGX0ZfU0c7CiAjZW5kaWYgLyogWkVST0NPUFkgKi8KKwogI2lmZGVmIFZMQU5fU1VQUE9SVAogCWRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9IV19WTEFOX1JYIHwgTkVUSUZfRl9IV19WTEFOX0ZJTFRFUjsKLQlkZXYtPnZsYW5fcnhfcmVnaXN0ZXIgPSBuZXRkZXZfdmxhbl9yeF9yZWdpc3RlcjsKLQlkZXYtPnZsYW5fcnhfYWRkX3ZpZCA9IG5ldGRldl92bGFuX3J4X2FkZF92aWQ7Ci0JZGV2LT52bGFuX3J4X2tpbGxfdmlkID0gbmV0ZGV2X3ZsYW5fcnhfa2lsbF92aWQ7CiAjZW5kaWYgLyogVkxBTl9SWF9LSUxMX1ZJRCAqLwogI2lmZGVmIEFERFJfNjRCSVRTCiAJZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX0hJR0hETUE7CkBAIC04MDQsMTggKzgyNiwxMiBAQAogCQl9CiAJfQogCi0JLyogVGhlIGNoaXAtc3BlY2lmaWMgZW50cmllcyBpbiB0aGUgZGV2aWNlIHN0cnVjdHVyZS4gKi8KLQlkZXYtPm9wZW4gPSAmbmV0ZGV2X29wZW47Ci0JZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSAmc3RhcnRfdHg7Ci0JZGV2LT50eF90aW1lb3V0ID0gdHhfdGltZW91dDsKKwlkZXYtPm5ldGRldl9vcHMgPSAmbmV0ZGV2X29wczsKIAlkZXYtPndhdGNoZG9nX3RpbWVvID0gVFhfVElNRU9VVDsKLQluZXRpZl9uYXBpX2FkZChkZXYsICZucC0+bmFwaSwgbmV0ZGV2X3BvbGwsIG1heF9pbnRlcnJ1cHRfd29yayk7Ci0JZGV2LT5zdG9wID0gJm5ldGRldl9jbG9zZTsKLQlkZXYtPmdldF9zdGF0cyA9ICZnZXRfc3RhdHM7Ci0JZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSAmc2V0X3J4X21vZGU7Ci0JZGV2LT5kb19pb2N0bCA9ICZuZXRkZXZfaW9jdGw7CiAJU0VUX0VUSFRPT0xfT1BTKGRldiwgJmV0aHRvb2xfb3BzKTsKIAorCW5ldGlmX25hcGlfYWRkKGRldiwgJm5wLT5uYXBpLCBuZXRkZXZfcG9sbCwgbWF4X2ludGVycnVwdF93b3JrKTsKKwogCWlmIChtdHUpCiAJCWRldi0+bXR1ID0gbXR1OwogCkBAIC05MDIsOSArOTE4LDEyIEBACiAKIHN0YXRpYyBpbnQgbmV0ZGV2X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKKwljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3X3J4LCAqZndfdHg7CisJY29uc3QgX19iZTMyICpmd19yeF9kYXRhLCAqZndfdHhfZGF0YTsKIAlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAl2b2lkIF9faW9tZW0gKmlvYWRkciA9IG5wLT5iYXNlOwogCWludCBpLCByZXR2YWw7CisJc2l6ZV90IHR4X3NpemUsIHJ4X3NpemU7CiAJc2l6ZV90IHR4X2RvbmVfcV9zaXplLCByeF9kb25lX3Ffc2l6ZSwgdHhfcmluZ19zaXplLCByeF9yaW5nX3NpemU7CiAKIAkvKiBEbyB3ZSBldmVyIG5lZWQgdG8gcmVzZXQgdGhlIGNoaXA/Pz8gKi8KQEAgLTEwNDAsMTEgKzEwNTksNDAgQEAKIAl3cml0ZWwoRVRIX1BfODAyMVEsIGlvYWRkciArIFZsYW5UeXBlKTsKICNlbmRpZiAvKiBWTEFOX1NVUFBPUlQgKi8KIAorCXJldHZhbCA9IHJlcXVlc3RfZmlybXdhcmUoJmZ3X3J4LCBGSVJNV0FSRV9SWCwgJm5wLT5wY2lfZGV2LT5kZXYpOworCWlmIChyZXR2YWwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJzdGFyZmlyZTogRmFpbGVkIHRvIGxvYWQgZmlybXdhcmUgXCIlc1wiXG4iLAorCQkgICAgICAgRklSTVdBUkVfUlgpOworCQlyZXR1cm4gcmV0dmFsOworCX0KKwlpZiAoZndfcngtPnNpemUgJSA0KSB7CisJCXByaW50ayhLRVJOX0VSUiAic3RhcmZpcmU6IGJvZ3VzIGxlbmd0aCAlenUgaW4gXCIlc1wiXG4iLAorCQkgICAgICAgZndfcngtPnNpemUsIEZJUk1XQVJFX1JYKTsKKwkJcmV0dmFsID0gLUVJTlZBTDsKKwkJZ290byBvdXRfcng7CisJfQorCXJldHZhbCA9IHJlcXVlc3RfZmlybXdhcmUoJmZ3X3R4LCBGSVJNV0FSRV9UWCwgJm5wLT5wY2lfZGV2LT5kZXYpOworCWlmIChyZXR2YWwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJzdGFyZmlyZTogRmFpbGVkIHRvIGxvYWQgZmlybXdhcmUgXCIlc1wiXG4iLAorCQkgICAgICAgRklSTVdBUkVfVFgpOworCQlnb3RvIG91dF9yeDsKKwl9CisJaWYgKGZ3X3R4LT5zaXplICUgNCkgeworCQlwcmludGsoS0VSTl9FUlIgInN0YXJmaXJlOiBib2d1cyBsZW5ndGggJXp1IGluIFwiJXNcIlxuIiwKKwkJICAgICAgIGZ3X3R4LT5zaXplLCBGSVJNV0FSRV9UWCk7CisJCXJldHZhbCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0X3R4OworCX0KKwlmd19yeF9kYXRhID0gKGNvbnN0IF9fYmUzMiAqKSZmd19yeC0+ZGF0YVswXTsKKwlmd190eF9kYXRhID0gKGNvbnN0IF9fYmUzMiAqKSZmd190eC0+ZGF0YVswXTsKKwlyeF9zaXplID0gZndfcngtPnNpemUgLyA0OworCXR4X3NpemUgPSBmd190eC0+c2l6ZSAvIDQ7CisKIAkvKiBMb2FkIFJ4L1R4IGZpcm13YXJlIGludG8gdGhlIGZyYW1lIHByb2Nlc3NvcnMgKi8KLQlmb3IgKGkgPSAwOyBpIDwgRklSTVdBUkVfUlhfU0laRSAqIDI7IGkrKykKLQkJd3JpdGVsKGZpcm13YXJlX3J4W2ldLCBpb2FkZHIgKyBSeEdmcE1lbSArIGkgKiA0KTsKLQlmb3IgKGkgPSAwOyBpIDwgRklSTVdBUkVfVFhfU0laRSAqIDI7IGkrKykKLQkJd3JpdGVsKGZpcm13YXJlX3R4W2ldLCBpb2FkZHIgKyBUeEdmcE1lbSArIGkgKiA0KTsKKwlmb3IgKGkgPSAwOyBpIDwgcnhfc2l6ZTsgaSsrKQorCQl3cml0ZWwoYmUzMl90b19jcHVwKCZmd19yeF9kYXRhW2ldKSwgaW9hZGRyICsgUnhHZnBNZW0gKyBpICogNCk7CisJZm9yIChpID0gMDsgaSA8IHR4X3NpemU7IGkrKykKKwkJd3JpdGVsKGJlMzJfdG9fY3B1cCgmZndfdHhfZGF0YVtpXSksIGlvYWRkciArIFR4R2ZwTWVtICsgaSAqIDQpOwogCWlmIChlbmFibGVfaHdfY2tzdW0pCiAJCS8qIEVuYWJsZSB0aGUgUnggYW5kIFR4IHVuaXRzLCBhbmQgdGhlIFJ4L1R4IGZyYW1lIHByb2Nlc3NvcnMuICovCiAJCXdyaXRlbChUeEVuYWJsZXxUeEdGUEVuYWJsZXxSeEVuYWJsZXxSeEdGUEVuYWJsZSwgaW9hZGRyICsgR2VuQ3RybCk7CkBAIC0xMDU2LDcgKzExMDQsMTEgQEAKIAkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBEb25lIG5ldGRldl9vcGVuKCkuXG4iLAogCQkgICAgICAgZGV2LT5uYW1lKTsKIAotCXJldHVybiAwOworb3V0X3R4OgorCXJlbGVhc2VfZmlybXdhcmUoZndfdHgpOworb3V0X3J4OgorCXJlbGVhc2VfZmlybXdhcmUoZndfcngpOworCXJldHVybiByZXR2YWw7CiB9CiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc3RhcmZpcmVfZmlybXdhcmUuaCBiL2RyaXZlcnMvbmV0L3N0YXJmaXJlX2Zpcm13YXJlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhNjY4NTIuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9uZXQvc3RhcmZpcmVfZmlybXdhcmUuaAorKysgL2Rldi9udWxsCkBAIC0xLDM0NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDMgQWRhcHRlYywgSW5jLgotICoKLSAqIFBsZWFzZSByZWFkIHRoZSBmb2xsb3dpbmcgbGljZW5zZSBiZWZvcmUgdXNpbmcgdGhlIEFkYXB0ZWMgU29mdHdhcmUKLSAqICgiUHJvZ3JhbSIpLiBJZiB5b3UgZG8gbm90IGFncmVlIHRvIHRoZSBsaWNlbnNlIHRlcm1zLCBkbyBub3QgdXNlIHRoZQotICogUHJvZ3JhbToKLSAqCi0gKiBZb3UgYWdyZWUgdG8gYmUgYm91bmQgYnkgdmVyc2lvbiAyIG9mIHRoZSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikKLSAqIGRhdGVkIEp1bmUgMTk5MSwgd2hpY2ggY2FuIGJlIGZvdW5kIGF0IGh0dHA6Ly93d3cuZnNmLm9yZy9saWNlbnNlcy9ncGwuaHRtbC4KLSAqIElmIHRoZSBsaW5rIGlzIGJyb2tlbiwgd3JpdGUgdG8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UsCi0gKiBCb3N0b24sIE1hc3NhY2h1c2V0dHMgMDIxMTEtMTMwNy4KLSAqCi0gKiBCRUNBVVNFIFRIRSBQUk9HUkFNIElTIExJQ0VOU0VEIEZSRUUgT0YgQ0hBUkdFIElUIElTIExJQ0VOU0VEICJBUyBJUyIgQU5ECi0gKiBUSEVSRSBJUyBOTyBXQVJSQU5UWSBGT1IgVEhFIFBST0dSQU0sIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCi0gKiAoVE8gVEhFIEVYVEVOVCBQRVJNSVRURUQgQlkgQVBQTElDQUJMRSBMQVcpLiBVU0UgT0YgVEhFIFBST0dSQU0gSVMgQVQgWU9VUgotICogT1dOIFJJU0suIElOIE5PIEVWRU5UIFdJTEwgQURBUFRFQyBPUiBJVFMgTElDRU5TT1JTIEJFIExJQUJMRSBUTyBZT1UgRk9SCi0gKiBEQU1BR0VTLCBJTkNMVURJTkcgQU5ZIEdFTkVSQUwsIFNQRUNJQUwsIElOQ0lERU5UQUwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0gKiBBUklTSU5HIE9VVCBPRiBUSEUgVVNFIE9SIElOQUJJTElUWSBUTyBVU0UgVEhFIFBST0dSQU0uCi0gKgotICovCi0KLXN0YXRpYyBjb25zdCB1MzIgZmlybXdhcmVfcnhbXSA9IHsKLSAgMHgwMTAwMDNkYywgMHgwMDAwMDAwMCwKLSAgMHgwNDAwMDQyMSwgMHgwMDAwMDA4NiwKLSAgMHg4MDAwMDAxNSwgMHgwMDAwMTgwZSwKLSAgMHg4MTAwMDAxNSwgMHgwMDAwNjY2NCwKLSAgMHgxYTAwNDBhYiwgMHgwMDAwMGIwNiwKLSAgMHgxNDIwMDAxMSwgMHgwMDAwMDAwMCwKLSAgMHgxNDIwNDAyMiwgMHgwMDAwYWFhYSwKLSAgMHgxNDIwNDAyMiwgMHgwMDAwMDMwMCwKLSAgMHgxNDIwNDAyMiwgMHgwMDAwMDAwMCwKLSAgMHgxYTAwNDBhYiwgMHgwMDAwMGIxNCwKLSAgMHgxNDIwMDAxMSwgMHgwMDAwMDAwMCwKLSAgMHg4MzAwMDAxNSwgMHgwMDAwMDAwMiwKLSAgMHgwNDAwMDAyMSwgMHgwMDAwMDAwMCwKLSAgMHgwMDAwMDAxMCwgMHgwMDAwMDAwMCwKLSAgMHgwNDAwMDQyMSwgMHgwMDAwMDA4NywKLSAgMHgwMDAwMDAxMCwgMHgwMDAwMDAwMCwKLSAgMHgwMDAwMDAxMCwgMHgwMDAwMDAwMCwKLSAgMHgwMDAwODAxNSwgMHgwMDAwMDAwMCwKLSAgMHgwMDAwMDAzZSwgMHgwMDAwMDAwMCwKLSAgMHgwMDAwMDAxMCwgMHgwMDAwMDAwMCwKLSAgMHg4MjAwMDAxNSwgMHgwMDAwNDAwMCwKLSAgMHgwMDllODA1MCwgMHgwMDAwMDAwMCwKLSAgMHgwMzAwODAxNSwgMHgwMDAwMDAwMCwKLSAgMHg4NjAwODAxNSwgMHgwMDAwMDAwMCwKLSAgMHg4MjAwMDAxNSwgMHgwMDAwODAwMCwKLSAgMHgwMTAwMDAxYywgMHgwMDAwMDAwMCwKLSAgMHgwMDAwNTBhMCwgMHgwMDAwMDEwYywKLSAgMHg0ZTIwZDAxMSwgMHgwMDAwNjAwOCwKLSAgMHgxNDIwZDAxMiwgMHgwMDAwNDAwOCwKLSAgMHgwMDAwZjA5MCwgMHgwMDAwNzAwMCwKLSAgMHgwMDAwYzhiMCwgMHgwMDAwMzAwMCwKLSAgMHgwMDAwNDA0MCwgMHgwMDAwMDAwMCwKLSAgMHgwMDEwODAxNSwgMHgwMDAwMDAwMCwKLSAgMHgwMGEyYzE1MCwgMHgwMDAwNDAwMCwKLSAgMHgwMGE0MDBiMCwgMHgwMDAwMDAxNCwKLSAgMHgwMDAwMDAyMCwgMHgwMDAwMDAwMCwKLSAgMHgyNTAwNDAwZCwgMHgwMDAwMjUyNSwKLSAgMHgwMDA0NzIyMCwgMHgwMDAwMzEwMCwKLSAgMHgwMDkzNDA3MCwgMHgwMDAwMDAwMCwKLSAgMHgwMDAwMDAyMCwgMHgwMDAwMDAwMCwKLSAgMHgwMDkyNDQ2MCwgMHgwMDAwMDE4NCwKLSAgMHgyYjIwYzAxMSwgMHgwMDAwMDAwMCwKLSAgMHgwMDAwYzQyMCwgMHgwMDAwMDU0MCwKLSAgMHgzNjAxNDAxOCwgMHgwMDAwNDIyZCwKLSAgMHgxNDIwMDAxMSwgMHgwMDAwMDAwMCwKLSAgMHgwMDkyNDQ2MCwgMHgwMDAwMDE4MywKLSAgMHgzMjAwMDAxZiwgMHgwMDAwMDAzNCwKLSAgMHgwMmFjMDAxNSwgMHgwMDAwMDAwMiwKLSAgMHgwMGE2MDExMCwgMHgwMDAwMDAwOCwKLSAgMHg0MjIwMDAxMSwgMHgwMDAwMDAwMCwKLSAgMHgwMDkyNDA2MCwgMHgwMDAwMDEwMywKLSAgMHgwMDAwMDAxZSwgMHgwMDAwMDAwMCwKLSAgMHgwMDAwMDAyMCwgMHgwMDAwMDEwMCwKLSAgMHgwMDAwMDAxZSwgMHgwMDAwMDAwMCwKLSAgMHgwMDkyNDQ2MCwgMHgwMDAwMDA4NiwKLSAgMHgwMDAwNDA4MCwgMHgwMDAwMDAwMCwKLSAgMHgwMDkyYzA3MCwgMHgwMDAwMDAwMCwKLSAgMHgwMDkyNDA2MCwgMHgwMDAwMDEwMCwKLSAgMHgwMDAwYzg5MCwgMHgwMDAwNTAwMCwKLSAgMHgwMGE2YzExMCwgMHgwMDAwMDAwMCwKLSAgMHgwMGIwYzA5MCwgMHgwMDAwMDAxMiwKLSAgMHgwMjFjMDAxNSwgMHgwMDAwMDAwMCwKLSAgMHgzMjAwMDAxZiwgMHgwMDAwMDAzNCwKLSAgMHgwMDkyNDQ2MCwgMHgwMDAwMDUxMCwKLSAgMHg0NDIxMDAxMSwgMHgwMDAwMDAwMCwKLSAgMHg0MjAwMDAxMSwgMHgwMDAwMDAwMCwKLSAgMHg4MzAwMDAxNSwgMHgwMDAwMDA0MCwKLSAgMHgwMDkyNDQ2MCwgMHgwMDAwMDUwOCwKLSAgMHg0NTAxNDAxOCwgMHgwMDAwNDU0NSwKLSAgMHgwMDgwODA1MCwgMHgwMDAwMDAwMCwKLSAgMHg2MjIwODAxMiwgMHgwMDAwMDAwMCwKLSAgMHg4MjAwMDAxNSwgMHgwMDAwMDgwMCwKLSAgMHgxNTIwMDAxMSwgMHgwMDAwMDAwMCwKLSAgMHgwMDAwMDAxMCwgMHgwMDAwMDAwMCwKLSAgMHgwMDAwMDAxMCwgMHgwMDAwMDAwMCwKLSAgMHgwMDAwMDAxMCwgMHgwMDAwMDAwMCwKLSAgMHgwMDAwMDAxMCwgMHgwMDAwMDAwMCwKLSAgMHgwMDAwMDAxMCwgMHgwMDAwMDAwMCwKLSAgMHg4MDAwMDAxNSwgMHgwMDAwZWVhNCwKLSAgMHg4MTAwMDAxNSwgMHgwMDAwMDA1ZiwKLSAgMHgwMDAwMDA2MCwgMHgwMDAwMDAwMCwKLSAgMHgwMDAwNDEyMCwgMHgwMDAwMDAwMCwKLSAgMHgwMDAwNGEwMCwgMHgwMDAwNDAwMCwKLSAgMHgwMDkyNDQ2MCwgMHgwMDAwMDE5MCwKLSAgMHg1NjAxNDAxYSwgMHgwMDAwNTk1NiwKLSAgMHgxNDAwMDAxMSwgMHgwMDAwMDAwMCwKLSAgMHgwMDkzNDA1MCwgMHgwMDAwMDAxOCwKLSAgMHgwMDkzMDA1MCwgMHgwMDAwMDAxOCwKLSAgMHgzNjAxNDAzYSwgMHgwMDAwMDAyZCwKLSAgMHgwMDA2NDNhOSwgMHgwMDAwMDAwMCwKLSAgMHgwMDAwYzQyMCwgMHgwMDAwMDE0MCwKLSAgMHg1NjAxNDAxYSwgMHgwMDAwNTk1NiwKLSAgMHgxNDAwMDAxMSwgMHgwMDAwMDAwMCwKLSAgMHgwMDAwMDAxMCwgMHgwMDAwMDAwMCwKLSAgMHgwMDAwMDAxMCwgMHgwMDAwMDAwMCwKLSAgMHgwMDA2NDJhOSwgMHgwMDAwMDAwMCwKLSAgMHgwMDAyNDQyMCwgMHgwMDAwMDE4MywKLSAgMHg1NjAxNDAxYSwgMHgwMDAwNTk1NiwKLSAgMHg4MjAwMDAxNSwgMHgwMDAwMjAwMCwKLSAgMHgxNTIwMDAxMSwgMHgwMDAwMDAwMCwKLSAgMHg4MjAwMDAxNSwgMHgwMDAwMDAxMCwKLSAgMHgxNTIwMDAxMSwgMHgwMDAwMDAwMCwKLSAgMHg4MjAwMDAxNSwgMHgwMDAwMDAxMCwKLSAgMHgxNTIwMDAxMSwgMHgwMDAwMDAwMCwKLX07CS8qIDEwNCBSeCBpbnN0cnVjdGlvbnMgKi8KLSNkZWZpbmUgRklSTVdBUkVfUlhfU0laRSAxMDQKLQotc3RhdGljIGNvbnN0IHUzMiBmaXJtd2FyZV90eFtdID0gewotICAweDAxMDAwM2RjLCAweDAwMDAwMDAwLAotICAweDA0MDAwNDIxLCAweDAwMDAwMDg2LAotICAweDgwMDAwMDE1LCAweDAwMDAxODBlLAotICAweDgxMDAwMDE1LCAweDAwMDA2NjY0LAotICAweDFhMDA0MGFiLCAweDAwMDAwYjA2LAotICAweDE0MjAwMDExLCAweDAwMDAwMDAwLAotICAweDE0MjA0MDIyLCAweDAwMDBhYWFhLAotICAweDE0MjA0MDIyLCAweDAwMDAwMzAwLAotICAweDE0MjA0MDIyLCAweDAwMDAwMDAwLAotICAweDFhMDA0MGFiLCAweDAwMDAwYjE0LAotICAweDE0MjAwMDExLCAweDAwMDAwMDAwLAotICAweDgzMDAwMDE1LCAweDAwMDAwMDAyLAotICAweDA0MDAwMDIxLCAweDAwMDAwMDAwLAotICAweDAwMDAwMDEwLCAweDAwMDAwMDAwLAotICAweDA0MDAwNDIxLCAweDAwMDAwMDg3LAotICAweDAwMDAwMDEwLCAweDAwMDAwMDAwLAotICAweDAwMDAwMDEwLCAweDAwMDAwMDAwLAotICAweDAwMDA4MDE1LCAweDAwMDAwMDAwLAotICAweDAwMDAwMDNlLCAweDAwMDAwMDAwLAotICAweDAwMDAwMDEwLCAweDAwMDAwMDAwLAotICAweDgyMDAwMDE1LCAweDAwMDA0MDAwLAotICAweDAwOWU4MDUwLCAweDAwMDAwMDAwLAotICAweDAzMDA4MDE1LCAweDAwMDAwMDAwLAotICAweDg2MDA4MDE1LCAweDAwMDAwMDAwLAotICAweDgyMDAwMDE1LCAweDAwMDA4MDAwLAotICAweDAxMDAwMDFjLCAweDAwMDAwMDAwLAotICAweDAwMDA1MGEwLCAweDAwMDAwMTBjLAotICAweDRlMjBkMDExLCAweDAwMDA2MDA4LAotICAweDE0MjBkMDEyLCAweDAwMDA0MDA4LAotICAweDAwMDBmMDkwLCAweDAwMDA3MDAwLAotICAweDAwMDBjOGIwLCAweDAwMDAzMDAwLAotICAweDAwMDA0MDQwLCAweDAwMDAwMDAwLAotICAweDAwMTA4MDE1LCAweDAwMDAwMDAwLAotICAweDAwYTJjMTUwLCAweDAwMDA0MDAwLAotICAweDAwYTQwMGIwLCAweDAwMDAwMDE0LAotICAweDAwMDAwMDIwLCAweDAwMDAwMDAwLAotICAweDI1MDA0MDBkLCAweDAwMDAyNTI1LAotICAweDAwMDQ3MjIwLCAweDAwMDAzMTAwLAotICAweDAwOTM0MDcwLCAweDAwMDAwMDAwLAotICAweDAwMDAwMDIwLCAweDAwMDAwMDAwLAotICAweDAwOTI0NDYwLCAweDAwMDAwMTg0LAotICAweDJiMjBjMDExLCAweDAwMDAwMDAwLAotICAweDAwMDBjNDIwLCAweDAwMDAwNTQwLAotICAweDM2MDE0MDE4LCAweDAwMDA0MjJkLAotICAweDE0MjAwMDExLCAweDAwMDAwMDAwLAotICAweDAwOTI0NDYwLCAweDAwMDAwMTgzLAotICAweDMyMDAwMDFmLCAweDAwMDAwMDM0LAotICAweDAyYWMwMDE1LCAweDAwMDAwMDAyLAotICAweDAwYTYwMTEwLCAweDAwMDAwMDA4LAotICAweDQyMjAwMDExLCAweDAwMDAwMDAwLAotICAweDAwOTI0MDYwLCAweDAwMDAwMTAzLAotICAweDAwMDAwMDFlLCAweDAwMDAwMDAwLAotICAweDAwMDAwMDIwLCAweDAwMDAwMTAwLAotICAweDAwMDAwMDFlLCAweDAwMDAwMDAwLAotICAweDAwOTI0NDYwLCAweDAwMDAwMDg2LAotICAweDAwMDA0MDgwLCAweDAwMDAwMDAwLAotICAweDAwOTJjMDcwLCAweDAwMDAwMDAwLAotICAweDAwOTI0MDYwLCAweDAwMDAwMTAwLAotICAweDAwMDBjODkwLCAweDAwMDA1MDAwLAotICAweDAwYTZjMTEwLCAweDAwMDAwMDAwLAotICAweDAwYjBjMDkwLCAweDAwMDAwMDEyLAotICAweDAyMWMwMDE1LCAweDAwMDAwMDAwLAotICAweDMyMDAwMDFmLCAweDAwMDAwMDM0LAotICAweDAwOTI0NDYwLCAweDAwMDAwNTEwLAotICAweDQ0MjEwMDExLCAweDAwMDAwMDAwLAotICAweDQyMDAwMDExLCAweDAwMDAwMDAwLAotICAweDgzMDAwMDE1LCAweDAwMDAwMDQwLAotICAweDAwOTI0NDYwLCAweDAwMDAwNTA4LAotICAweDQ1MDE0MDE4LCAweDAwMDA0NTQ1LAotICAweDAwODA4MDUwLCAweDAwMDAwMDAwLAotICAweDYyMjA4MDEyLCAweDAwMDAwMDAwLAotICAweDgyMDAwMDE1LCAweDAwMDAwODAwLAotICAweDE1MjAwMDExLCAweDAwMDAwMDAwLAotICAweDAwMDAwMDEwLCAweDAwMDAwMDAwLAotICAweDAwMDAwMDEwLCAweDAwMDAwMDAwLAotICAweDAwMDAwMDEwLCAweDAwMDAwMDAwLAotICAweDAwMDAwMDEwLCAweDAwMDAwMDAwLAotICAweDAwMDAwMDEwLCAweDAwMDAwMDAwLAotICAweDgwMDAwMDE1LCAweDAwMDBlZWE0LAotICAweDgxMDAwMDE1LCAweDAwMDAwMDVmLAotICAweDAwMDAwMDYwLCAweDAwMDAwMDAwLAotICAweDAwMDA0MTIwLCAweDAwMDAwMDAwLAotICAweDAwMDA0YTAwLCAweDAwMDA0MDAwLAotICAweDAwOTI0NDYwLCAweDAwMDAwMTkwLAotICAweDU2MDE0MDFhLCAweDAwMDA1OTU2LAotICAweDE0MDAwMDExLCAweDAwMDAwMDAwLAotICAweDAwOTM0MDUwLCAweDAwMDAwMDE4LAotICAweDAwOTMwMDUwLCAweDAwMDAwMDE4LAotICAweDM2MDE0MDNhLCAweDAwMDAwMDJkLAotICAweDAwMDY0M2E5LCAweDAwMDAwMDAwLAotICAweDAwMDBjNDIwLCAweDAwMDAwMTQwLAotICAweDU2MDE0MDFhLCAweDAwMDA1OTU2LAotICAweDE0MDAwMDExLCAweDAwMDAwMDAwLAotICAweDAwMDAwMDEwLCAweDAwMDAwMDAwLAotICAweDAwMDAwMDEwLCAweDAwMDAwMDAwLAotICAweDAwMDY0MmE5LCAweDAwMDAwMDAwLAotICAweDAwMDI0NDIwLCAweDAwMDAwMTgzLAotICAweDU2MDE0MDFhLCAweDAwMDA1OTU2LAotICAweDgyMDAwMDE1LCAweDAwMDAyMDAwLAotICAweDE1MjAwMDExLCAweDAwMDAwMDAwLAotICAweDgyMDAwMDE1LCAweDAwMDAwMDEwLAotICAweDE1MjAwMDExLCAweDAwMDAwMDAwLAotICAweDgyMDAwMDE1LCAweDAwMDAwMDEwLAotICAweDE1MjAwMDExLCAweDAwMDAwMDAwLAotfTsJLyogMTA0IFR4IGluc3RydWN0aW9ucyAqLwotI2RlZmluZSBGSVJNV0FSRV9UWF9TSVpFIDEwNAotI2lmIDAKLXN0YXRpYyBjb25zdCB1MzIgZmlybXdhcmVfd29sW10gPSB7Ci0gIDB4MDEwMDAzZGMsIDB4MDAwMDAwMDAsCi0gIDB4MTkwMDA0MjEsIDB4MDAwMDAwODcsCi0gIDB4ODAwMDAwMTUsIDB4MDAwMDFhMWEsCi0gIDB4ODEwMDAwMTUsIDB4MDAwMDFhMWEsCi0gIDB4MWEwMDQwYWIsIDB4MDAwMDBiMDYsCi0gIDB4MTUyMDAwMTEsIDB4MDAwMDAwMDAsCi0gIDB4MTUyMDQwMjIsIDB4MDAwMGFhYWEsCi0gIDB4MTUyMDQwMjIsIDB4MDAwMDAzMDAsCi0gIDB4MTUyMDQwMjIsIDB4MDAwMDAwMDAsCi0gIDB4MWEwMDQwYWIsIDB4MDAwMDBiMTUsCi0gIDB4MTUyMDAwMTEsIDB4MDAwMDAwMDAsCi0gIDB4ODMwMDAwMTUsIDB4MDAwMDAwMDIsCi0gIDB4MDQwMDAwMjEsIDB4MDAwMDAwMDAsCi0gIDB4MDAwMDAwMTAsIDB4MDAwMDAwMDAsCi0gIDB4MDQwMDA0MjEsIDB4MDAwMDAwODcsCi0gIDB4MDAwMDAwMTAsIDB4MDAwMDAwMDAsCi0gIDB4MDAwMDAwMTAsIDB4MDAwMDAwMDAsCi0gIDB4MDAwMDgwMTUsIDB4MDAwMDAwMDAsCi0gIDB4MDAwMDAwM2UsIDB4MDAwMDAwMDAsCi0gIDB4MDAwMDAwMTAsIDB4MDAwMDAwMDAsCi0gIDB4MDAwMDAwMTAsIDB4MDAwMDAwMDAsCi0gIDB4ODIwMDAwMTUsIDB4MDAwMDQwMDAsCi0gIDB4ODIwMDAwMTUsIDB4MDAwMDgwMDAsCi0gIDB4MDAwMDAwMGMsIDB4MDAwMDAwMDAsCi0gIDB4MDAwMDAwMTAsIDB4MDAwMDAwMDAsCi0gIDB4MDAwMDQwODAsIDB4MDAwMDAxMDAsCi0gIDB4MWYyMGMwMTEsIDB4MDAwMDExMjIsCi0gIDB4MjcyMGYwMTEsIDB4MDAwMDMwMTEsCi0gIDB4MTkyMDAwNzEsIDB4MDAwMDAwMDAsCi0gIDB4MWEyMDAwNTEsIDB4MDAwMDAwMDAsCi0gIDB4MDAwMDAwMTAsIDB4MDAwMDAwMDAsCi0gIDB4MDAwMDAwMTAsIDB4MDAwMDAwMDAsCi0gIDB4MWQyMDQwYTQsIDB4MDAwMDMzNDQsCi0gIDB4MWQyMDQwYTIsIDB4MDAwMDU1NjYsCi0gIDB4MDAwMDQwYTAsIDB4MDAwMDAxMDAsCi0gIDB4MDAxMDgwNTAsIDB4MDAwMDAwMDEsCi0gIDB4MWEyMDgwMTIsIDB4MDAwMDAwMDYsCi0gIDB4ODIwMDAwMTUsIDB4MDAwMDgwODAsCi0gIDB4MDEwMDAzZGMsIDB4MDAwMDAwMDAsCi0gIDB4MWQyMDQwYTQsIDB4MDAwMDIyMzMsCi0gIDB4MWQyMDQwYTQsIDB4MDAwMDQ0NTUsCi0gIDB4MmQyMDgwMTEsIDB4MDAwMDAwMDUsCi0gIDB4MWQyMDQwYTQsIDB4MDAwMDY2MTEsCi0gIDB4MDAxMDgwNTAsIDB4MDAwMDAwMDEsCi0gIDB4MjcyMDAwMTEsIDB4MDAwMDAwMDAsCi0gIDB4MWQyMDUwYTQsIDB4MDAwMDY2MDAsCi0gIDB4ODIwMDAwMTUsIDB4MDAwMDgwODAsCi0gIDB4MDEwMDAzZGMsIDB4MDAwMDAwMDAsCi0gIDB4MDAwMDAwNTAsIDB4MDAwMDAwMDAsCi0gIDB4MWIyMDAwMzEsIDB4MDAwMDAwMDAsCi0gIDB4MDAwMDAwMWUsIDB4MDAwMDAwMDAsCi0gIDB4MDAwMDAwMWUsIDB4MDAwMDAwMDAsCi0gIDB4MDAwMDAwMWUsIDB4MDAwMDAwMDAsCi0gIDB4MDAwMDAwMWUsIDB4MDAwMDAwMDAsCi0gIDB4MDA5MjQ0NjAsIDB4MDAwMDAwODYsCi0gIDB4MDAwMDQwODAsIDB4MDAwMDAwMDAsCi0gIDB4MDA5MmMwNzAsIDB4MDAwMDAwMDAsCi0gIDB4MDA5MjQwNjAsIDB4MDAwMDAxMDAsCi0gIDB4MDAwMGM4OTAsIDB4MDAwMDUwMDAsCi0gIDB4MDBhNmMxMTAsIDB4MDAwMDAwMDAsCi0gIDB4MDBiMGMwOTAsIDB4MDAwMDAwMTIsCi0gIDB4MDIxYzAwMTUsIDB4MDAwMDAwMDAsCi0gIDB4MzIwMDAwMWYsIDB4MDAwMDAwMzQsCi0gIDB4MDA5MjQ0NjAsIDB4MDAwMDA1MTAsCi0gIDB4NDQyMTAwMTEsIDB4MDAwMDAwMDAsCi0gIDB4NDIwMDAwMTEsIDB4MDAwMDAwMDAsCi0gIDB4ODMwMDAwMTUsIDB4MDAwMDAwNDAsCi0gIDB4MDA5MjQ0NjAsIDB4MDAwMDA1MDgsCi0gIDB4NDc2YTAwMTIsIDB4MDAwMDAxMDAsCi0gIDB4ODMwMDAwMTUsIDB4MDAwMDAwMDgsCi0gIDB4MTYyMDAwMTEsIDB4MDAwMDAwMDAsCi0gIDB4MDAxZTgwNTAsIDB4MDAwMDAwMDAsCi0gIDB4MDAxZTgwNTAsIDB4MDAwMDAwMDAsCi0gIDB4MDA4MDgwNTAsIDB4MDAwMDAwMDAsCi0gIDB4MDMwMDgwMTUsIDB4MDAwMDAwMDAsCi0gIDB4NjIyMDgwMTIsIDB4MDAwMDAwMDAsCi0gIDB4ODIwMDAwMTUsIDB4MDAwMDA4MDAsCi0gIDB4MTYyMDAwMTEsIDB4MDAwMDAwMDAsCi0gIDB4ODAwMDAwMTUsIDB4MDAwMGVlYTQsCi0gIDB4ODEwMDAwMTUsIDB4MDAwMDAwNWYsCi0gIDB4MDAwMDAwMjAsIDB4MDAwMDAwMDAsCi0gIDB4MDAwMDQxMjAsIDB4MDAwMDAwMDAsCi0gIDB4MDAwMDRhMDAsIDB4MDAwMDQwMDAsCi0gIDB4MDA5MjQ0NjAsIDB4MDAwMDAxOTAsCi0gIDB4NWMwMTQwMWEsIDB4MDAwMDU5NWMsCi0gIDB4MTUwMDAwMTEsIDB4MDAwMDAwMDAsCi0gIDB4MDA5MzQwNTAsIDB4MDAwMDAwMTgsCi0gIDB4MDA5MzAwNTAsIDB4MDAwMDAwMTgsCi0gIDB4MzYwMTQwM2EsIDB4MDAwMDAwMmQsCi0gIDB4MDAwNjQwMjksIDB4MDAwMDAwMDAsCi0gIDB4MDAwMGM0MjAsIDB4MDAwMDAxNDAsCi0gIDB4NWMwMTQwMWEsIDB4MDAwMDU5NWMsCi0gIDB4MTUwMDAwMTEsIDB4MDAwMDAwMDAsCi0gIDB4MDAwMDAwMTAsIDB4MDAwMDAwMDAsCi0gIDB4MDAwMDAwMTAsIDB4MDAwMDAwMDAsCi0gIDB4MDAwNjQwMjksIDB4MDAwMDAwMDAsCi0gIDB4MDAwMjQ0MjAsIDB4MDAwMDAxODMsCi0gIDB4NWMwMTQwMWEsIDB4MDAwMDU5NWMsCi0gIDB4ODIwMDAwMTUsIDB4MDAwMDIwMDAsCi0gIDB4MTYyMDAwMTEsIDB4MDAwMDAwMDAsCi0gIDB4ODIwMDAwMTUsIDB4MDAwMDAwMTAsCi0gIDB4MTYyMDAwMTEsIDB4MDAwMDAwMDAsCi0gIDB4ODIwMDAwMTUsIDB4MDAwMDAwMTAsCi0gIDB4MTYyMDAwMTEsIDB4MDAwMDAwMDAsCi19OwkvKiAxMDQgV29MIGluc3RydWN0aW9ucyAqLwotI2RlZmluZSBGSVJNV0FSRV9XT0xfU0laRSAxMDQKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc3RhcmZpcmVfZmlybXdhcmUucGwgYi9kcml2ZXJzL25ldC9zdGFyZmlyZV9maXJtd2FyZS5wbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGM4MmI4MC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL25ldC9zdGFyZmlyZV9maXJtd2FyZS5wbAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLSMhL3Vzci9iaW4vcGVybAotCi0jIFRoaXMgc2NyaXB0IGNhbiBiZSB1c2VkIHRvIGdlbmVyYXRlIGEgbmV3IHN0YXJmaXJlX2Zpcm13YXJlLmgKLSMgZnJvbSBHRlBfUlguREFUIGFuZCBHRlBfVFguREFULCBmaWxlcyBpbmNsdWRlZCB3aXRoIHRoZSBEREsKLSMgYW5kIGFsc28gd2l0aCB0aGUgTm92ZWxsIGRyaXZlcnMuCi0KLW9wZW4gRlcsICJHRlBfUlguREFUIiB8fCBkaWU7Ci1vcGVuIEZXSCwgIj5zdGFyZmlyZV9maXJtd2FyZS5oIiB8fCBkaWU7Ci0KLXByaW50ZihGV0ggInN0YXRpYyB1MzIgZmlybXdhcmVfcnhbXSA9IHtcbiIpOwotJGNvdW50ZXIgPSAwOwotd2hpbGUgKCRmb28gPSA8Rlc+KSB7Ci0gIGNob21wOwotICBwcmludGYoRldIICIgIDB4JXMsIDB4MDAwMCVzLFxuIiwgc3Vic3RyKCRmb28sIDQsIDgpLCBzdWJzdHIoJGZvbywgMCwgNCkpOwotICAkY291bnRlcisrOwotfQotCi1jbG9zZSBGVzsKLW9wZW4gRlcsICJHRlBfVFguREFUIiB8fCBkaWU7Ci0KLXByaW50ZihGV0ggIn07XHQvKiAlZCBSeCBpbnN0cnVjdGlvbnMgKi9cbiNkZWZpbmUgRklSTVdBUkVfUlhfU0laRSAlZFxuXG5zdGF0aWMgdTMyIGZpcm13YXJlX3R4W10gPSB7XG4iLCAkY291bnRlciwgJGNvdW50ZXIpOwotJGNvdW50ZXIgPSAwOwotd2hpbGUgKCRmb28gPSA8Rlc+KSB7Ci0gIGNob21wOwotICBwcmludGYoRldIICIgIDB4JXMsIDB4MDAwMCVzLFxuIiwgc3Vic3RyKCRmb28sIDQsIDgpLCBzdWJzdHIoJGZvbywgMCwgNCkpOwotICAkY291bnRlcisrOwotfQotCi1jbG9zZSBGVzsKLXByaW50ZihGV0ggIn07XHQvKiAlZCBUeCBpbnN0cnVjdGlvbnMgKi9cbiNkZWZpbmUgRklSTVdBUkVfVFhfU0laRSAlZFxuIiwgJGNvdW50ZXIsICRjb3VudGVyKTsKLWNsb3NlKEZXSCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zdW5kYW5jZS5jIGIvZHJpdmVycy9uZXQvc3VuZGFuY2UuYwppbmRleCA2OTg4OTNiLi5mZWFmMGUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zdW5kYW5jZS5jCisrKyBiL2RyaXZlcnMvbmV0L3N1bmRhbmNlLmMKQEAgLTQ0OSw2ICs0NDksMTkgQEAKIAl9CiB9CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgbmV0ZGV2X29wcyA9IHsKKwkubmRvX29wZW4JCT0gbmV0ZGV2X29wZW4sCisJLm5kb19zdG9wCQk9IG5ldGRldl9jbG9zZSwKKwkubmRvX3N0YXJ0X3htaXQJCT0gc3RhcnRfdHgsCisJLm5kb19nZXRfc3RhdHMgCQk9IGdldF9zdGF0cywKKwkubmRvX3NldF9tdWx0aWNhc3RfbGlzdCA9IHNldF9yeF9tb2RlLAorCS5uZG9fZG9faW9jdGwgCQk9IG5ldGRldl9pb2N0bCwKKwkubmRvX3R4X3RpbWVvdXQJCT0gdHhfdGltZW91dCwKKwkubmRvX2NoYW5nZV9tdHUJCT0gY2hhbmdlX210dSwKKwkubmRvX3NldF9tYWNfYWRkcmVzcyAJPSBldGhfbWFjX2FkZHIsCisJLm5kb192YWxpZGF0ZV9hZGRyCT0gZXRoX3ZhbGlkYXRlX2FkZHIsCit9OworCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBzdW5kYW5jZV9wcm9iZTEgKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAogCQkJCSAgICAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCiB7CkBAIC01MzAsMTYgKzU0MywxMCBAQAogCW5wLT5taWlfaWYucmVnX251bV9tYXNrID0gMHgxZjsKIAogCS8qIFRoZSBjaGlwLXNwZWNpZmljIGVudHJpZXMgaW4gdGhlIGRldmljZSBzdHJ1Y3R1cmUuICovCi0JZGV2LT5vcGVuID0gJm5ldGRldl9vcGVuOwotCWRldi0+aGFyZF9zdGFydF94bWl0ID0gJnN0YXJ0X3R4OwotCWRldi0+c3RvcCA9ICZuZXRkZXZfY2xvc2U7Ci0JZGV2LT5nZXRfc3RhdHMgPSAmZ2V0X3N0YXRzOwotCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gJnNldF9yeF9tb2RlOwotCWRldi0+ZG9faW9jdGwgPSAmbmV0ZGV2X2lvY3RsOworCWRldi0+bmV0ZGV2X29wcyA9ICZuZXRkZXZfb3BzOwogCVNFVF9FVEhUT09MX09QUyhkZXYsICZldGh0b29sX29wcyk7Ci0JZGV2LT50eF90aW1lb3V0ID0gJnR4X3RpbWVvdXQ7CiAJZGV2LT53YXRjaGRvZ190aW1lbyA9IFRYX1RJTUVPVVQ7Ci0JZGV2LT5jaGFuZ2VfbXR1ID0gJmNoYW5nZV9tdHU7CisKIAlwY2lfc2V0X2RydmRhdGEocGRldiwgZGV2KTsKIAogCWkgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3N1bmdlbS5jIGIvZHJpdmVycy9uZXQvc3VuZ2VtLmMKaW5kZXggOGE3NDYwNC4uODZjNzY1ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc3VuZ2VtLmMKKysrIGIvZHJpdmVycy9uZXQvc3VuZ2VtLmMKQEAgLTI5ODksNiArMjk4OSwxOSBAQAogCX0KIH0KIAorc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyBnZW1fbmV0ZGV2X29wcyA9IHsKKwkubmRvX29wZW4JCT0gZ2VtX29wZW4sCisJLm5kb19zdG9wCQk9IGdlbV9jbG9zZSwKKwkubmRvX3N0YXJ0X3htaXQJCT0gZ2VtX3N0YXJ0X3htaXQsCisJLm5kb19nZXRfc3RhdHMJCT0gZ2VtX2dldF9zdGF0cywKKwkubmRvX3NldF9tdWx0aWNhc3RfbGlzdCA9IGdlbV9zZXRfbXVsdGljYXN0LAorCS5uZG9fZG9faW9jdGwJCT0gZ2VtX2lvY3RsLAorCS5uZG9fdHhfdGltZW91dAkJPSBnZW1fdHhfdGltZW91dCwKKwkubmRvX2NoYW5nZV9tdHUJCT0gZ2VtX2NoYW5nZV9tdHUsCisJLm5kb19zZXRfbWFjX2FkZHJlc3MgCT0gZXRoX21hY19hZGRyLAorCS5uZG9fdmFsaWRhdGVfYWRkcgk9IGV0aF92YWxpZGF0ZV9hZGRyLAorfTsKKwogc3RhdGljIGludCBfX2RldmluaXQgZ2VtX2luaXRfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAogCQkJCSAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKIHsKQEAgLTMxNDIsMTcgKzMxNTUsMTAgQEAKIAlpZiAoZ2VtX2dldF9kZXZpY2VfYWRkcmVzcyhncCkpCiAJCWdvdG8gZXJyX291dF9mcmVlX2NvbnNpc3RlbnQ7CiAKLQlkZXYtPm9wZW4gPSBnZW1fb3BlbjsKLQlkZXYtPnN0b3AgPSBnZW1fY2xvc2U7Ci0JZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBnZW1fc3RhcnRfeG1pdDsKLQlkZXYtPmdldF9zdGF0cyA9IGdlbV9nZXRfc3RhdHM7Ci0JZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSBnZW1fc2V0X211bHRpY2FzdDsKLQlkZXYtPmRvX2lvY3RsID0gZ2VtX2lvY3RsOworCWRldi0+bmV0ZGV2X29wcyA9ICZnZW1fbmV0ZGV2X29wczsKIAluZXRpZl9uYXBpX2FkZChkZXYsICZncC0+bmFwaSwgZ2VtX3BvbGwsIDY0KTsKIAlkZXYtPmV0aHRvb2xfb3BzID0gJmdlbV9ldGh0b29sX29wczsKLQlkZXYtPnR4X3RpbWVvdXQgPSBnZW1fdHhfdGltZW91dDsKIAlkZXYtPndhdGNoZG9nX3RpbWVvID0gNSAqIEhaOwotCWRldi0+Y2hhbmdlX210dSA9IGdlbV9jaGFuZ2VfbXR1OwogCWRldi0+aXJxID0gcGRldi0+aXJxOwogCWRldi0+ZG1hID0gMDsKIAlkZXYtPnNldF9tYWNfYWRkcmVzcyA9IGdlbV9zZXRfbWFjX2FkZHJlc3M7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zdW5obWUuYyBiL2RyaXZlcnMvbmV0L3N1bmhtZS5jCmluZGV4IGIyMmQzMzUuLjdhNzJhMzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3N1bmhtZS5jCisrKyBiL2RyaXZlcnMvbmV0L3N1bmhtZS5jCkBAIC0yNjA3LDYgKzI2MDcsMTggQEAKIH0KICNlbmRpZiAvKiBDT05GSUdfUENJICovCiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgaG1lX25ldGRldl9vcHMgPSB7CisJLm5kb19vcGVuCQk9IGhhcHB5X21lYWxfb3BlbiwKKwkubmRvX3N0b3AJCT0gaGFwcHlfbWVhbF9jbG9zZSwKKwkubmRvX3N0YXJ0X3htaXQJCT0gaGFwcHlfbWVhbF9zdGFydF94bWl0LAorCS5uZG9fdHhfdGltZW91dAkJPSBoYXBweV9tZWFsX3R4X3RpbWVvdXQsCisJLm5kb19nZXRfc3RhdHMJCT0gaGFwcHlfbWVhbF9nZXRfc3RhdHMsCisJLm5kb19zZXRfbXVsdGljYXN0X2xpc3QgPSBoYXBweV9tZWFsX3NldF9tdWx0aWNhc3QsCisJLm5kb19jaGFuZ2VfbXR1CQk9IGV0aF9jaGFuZ2VfbXR1LAorCS5uZG9fc2V0X21hY19hZGRyZXNzIAk9IGV0aF9tYWNfYWRkciwKKwkubmRvX3ZhbGlkYXRlX2FkZHIJPSBldGhfdmFsaWRhdGVfYWRkciwKK307CisKICNpZmRlZiBDT05GSUdfU0JVUwogc3RhdGljIGludCBfX2RldmluaXQgaGFwcHlfbWVhbF9zYnVzX3Byb2JlX29uZShzdHJ1Y3Qgb2ZfZGV2aWNlICpvcCwgaW50IGlzX3FmZSkKIHsKQEAgLTI3NTAsMTIgKzI3NjIsNyBAQAogCWluaXRfdGltZXIoJmhwLT5oYXBweV90aW1lcik7CiAKIAlocC0+ZGV2ID0gZGV2OwotCWRldi0+b3BlbiA9ICZoYXBweV9tZWFsX29wZW47Ci0JZGV2LT5zdG9wID0gJmhhcHB5X21lYWxfY2xvc2U7Ci0JZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSAmaGFwcHlfbWVhbF9zdGFydF94bWl0OwotCWRldi0+Z2V0X3N0YXRzID0gJmhhcHB5X21lYWxfZ2V0X3N0YXRzOwotCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gJmhhcHB5X21lYWxfc2V0X211bHRpY2FzdDsKLQlkZXYtPnR4X3RpbWVvdXQgPSAmaGFwcHlfbWVhbF90eF90aW1lb3V0OworCWRldi0+bmV0ZGV2X29wcyA9ICZobWVfbmV0ZGV2X29wczsKIAlkZXYtPndhdGNoZG9nX3RpbWVvID0gNSpIWjsKIAlkZXYtPmV0aHRvb2xfb3BzID0gJmhtZV9ldGh0b29sX29wczsKIApAQCAtMzA3NiwxMiArMzA4Myw3IEBACiAJaW5pdF90aW1lcigmaHAtPmhhcHB5X3RpbWVyKTsKIAogCWhwLT5kZXYgPSBkZXY7Ci0JZGV2LT5vcGVuID0gJmhhcHB5X21lYWxfb3BlbjsKLQlkZXYtPnN0b3AgPSAmaGFwcHlfbWVhbF9jbG9zZTsKLQlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9ICZoYXBweV9tZWFsX3N0YXJ0X3htaXQ7Ci0JZGV2LT5nZXRfc3RhdHMgPSAmaGFwcHlfbWVhbF9nZXRfc3RhdHM7Ci0JZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSAmaGFwcHlfbWVhbF9zZXRfbXVsdGljYXN0OwotCWRldi0+dHhfdGltZW91dCA9ICZoYXBweV9tZWFsX3R4X3RpbWVvdXQ7CisJZGV2LT5uZXRkZXZfb3BzID0gJmhtZV9uZXRkZXZfb3BzOwogCWRldi0+d2F0Y2hkb2dfdGltZW8gPSA1KkhaOwogCWRldi0+ZXRodG9vbF9vcHMgPSAmaG1lX2V0aHRvb2xfb3BzOwogCWRldi0+aXJxID0gcGRldi0+aXJxOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc3Vudm5ldC5jIGIvZHJpdmVycy9uZXQvc3Vudm5ldC5jCmluZGV4IDIzM2YxY2QuLjYxMTIzMGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3N1bnZuZXQuYworKysgYi9kcml2ZXJzL25ldC9zdW52bmV0LmMKQEAgLTMzNiw3ICszMzYsNyBAQAogCWlmIChJU19FUlIoZGVzYykpCiAJCXJldHVybiBQVFJfRVJSKGRlc2MpOwogCi0JdmlvZGJnKERBVEEsICJ2aW9fd2Fsa19yeF9vbmUgZGVzY1slMDJ4OiUwMng6JTA4eDolMDh4OiVseDolbHhdXG4iLAorCXZpb2RiZyhEQVRBLCAidmlvX3dhbGtfcnhfb25lIGRlc2NbJTAyeDolMDJ4OiUwOHg6JTA4eDolbGx4OiVsbHhdXG4iLAogCSAgICAgICBkZXNjLT5oZHIuc3RhdGUsIGRlc2MtPmhkci5hY2ssCiAJICAgICAgIGRlc2MtPnNpemUsIGRlc2MtPm5jb29raWVzLAogCSAgICAgICBkZXNjLT5jb29raWVzWzBdLmNvb2tpZV9hZGRyLApAQCAtMzk0LDE0ICszOTQsMTQgQEAKIAlzdHJ1Y3QgdmlvX2RyaW5nX3N0YXRlICpkciA9ICZwb3J0LT52aW8uZHJpbmdzW1ZJT19EUklWRVJfUlhfUklOR107CiAJc3RydWN0IHZpb19kcml2ZXJfc3RhdGUgKnZpbyA9ICZwb3J0LT52aW87CiAKLQl2aW9kYmcoREFUQSwgInZuZXRfcnggc3R5cGVfZW52WyUwNHhdIHNlcVslMDE2bHhdIHJjdl9ueHRbJTAxNmx4XVxuIiwKKwl2aW9kYmcoREFUQSwgInZuZXRfcnggc3R5cGVfZW52WyUwNHhdIHNlcVslMDE2bGx4XSByY3Zfbnh0WyUwMTZsbHhdXG4iLAogCSAgICAgICBwa3QtPnRhZy5zdHlwZV9lbnYsIHBrdC0+c2VxLCBkci0+cmN2X254dCk7CiAKIAlpZiAodW5saWtlbHkocGt0LT50YWcuc3R5cGVfZW52ICE9IFZJT19EUklOR19EQVRBKSkKIAkJcmV0dXJuIDA7CiAJaWYgKHVubGlrZWx5KHBrdC0+c2VxICE9IGRyLT5yY3Zfbnh0KSkgewotCQlwcmludGsoS0VSTl9FUlIgUEZYICJSWCBvdXQgb2Ygc2VxdWVuY2Ugc2VxWzB4JWx4XSAiCi0JCSAgICAgICAicmN2X254dFsweCVseF1cbiIsIHBrdC0+c2VxLCBkci0+cmN2X254dCk7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIlJYIG91dCBvZiBzZXF1ZW5jZSBzZXFbMHglbGx4XSAiCisJCSAgICAgICAicmN2X254dFsweCVsbHhdXG4iLCBwa3QtPnNlcSwgZHItPnJjdl9ueHQpOwogCQlyZXR1cm4gMDsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3RlaHV0aS5jIGIvZHJpdmVycy9uZXQvdGVodXRpLmMKaW5kZXggYTEwYTgzYS4uYTdhNGRjNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdGVodXRpLmMKKysrIGIvZHJpdmVycy9uZXQvdGVodXRpLmMKQEAgLTEwMDQsNyArMTAwNCw3IEBACiAgKiBza2IgZm9yIHJ4LiBJdCBhc3N1bWVzIHRoYXQgUnggaXMgZGVzYWJsZWQgaW4gSFcKICAqIGZ1bmNzIGFyZSBncm91cGVkIGZvciBiZXR0ZXIgY2FjaGUgdXNhZ2UKICAqCi0gKiBSeEQgZmlmbyBpcyBzbWFsbGVyIHRoZW4gUnhGIGZpZm8gYnkgZGVzaWduLiBVcG9uIGhpZ2ggbG9hZCwgUnhEIHdpbGwgYmUKKyAqIFJ4RCBmaWZvIGlzIHNtYWxsZXIgdGhhbiBSeEYgZmlmbyBieSBkZXNpZ24uIFVwb24gaGlnaCBsb2FkLCBSeEQgd2lsbCBiZQogICogZmlsbGVkIGFuZCBwYWNrZXRzIHdpbGwgYmUgZHJvcHBlZCBieSBuaWMgd2l0aG91dCBnZXR0aW5nIGludG8gaG9zdCBvcgogICogY291c2luZyBpbnRlcnJ1cHQuIEFueXdheSwgaW4gdGhhdCBjb25kaXRpb24sIGhvc3QgaGFzIG5vIGNoYW5jZSB0byBwcm9jY2VzcwogICogYWxsIHBhY2tldHMsIGJ1dCBkcm9wcGluZyBpbiBuaWMgaXMgY2hlYXBlciwgc2luY2UgaXQgdGFrZXMgMCBjcHUgY3ljbGVzCkBAIC0xODI2LDcgKzE4MjYsNyBAQAogICoKICAqIFB1c2hlcyBkZXNjIHRvIFR4RCBmaWZvIGFuZCBvdmVybGFwcyBpdCBpZiBuZWVkZWQuCiAgKiBOT1RFOiB0aGlzIGZ1bmMgZG9lcyBub3QgY2hlY2sgZm9yIGF2YWlsYWJsZSBzcGFjZS4gdGhpcyBpcyByZXNwb25zaWJpbGl0eQotICogICAgb2YgdGhlIGNhbGxlci4gTmVpdGhlciBkb2VzIGl0IGNoZWNrIHRoYXQgZGF0YSBzaXplIGlzIHNtYWxsZXIgdGhlbgorICogICAgb2YgdGhlIGNhbGxlci4gTmVpdGhlciBkb2VzIGl0IGNoZWNrIHRoYXQgZGF0YSBzaXplIGlzIHNtYWxsZXIgdGhhbgogICogICAgZmlmbyBzaXplLgogICovCiBzdGF0aWMgdm9pZCBiZHhfdHhfcHVzaF9kZXNjKHN0cnVjdCBiZHhfcHJpdiAqcHJpdiwgdm9pZCAqZGF0YSwgaW50IHNpemUpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90ZzMuYyBiL2RyaXZlcnMvbmV0L3RnMy5jCmluZGV4IDA0YWUxZTguLjVlMmRiYWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3RnMy5jCisrKyBiL2RyaXZlcnMvbmV0L3RnMy5jCkBAIC00MCw2ICs0MCw3IEBACiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CiAjaW5jbHVkZSA8bGludXgvcHJlZmV0Y2guaD4KICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CiAKICNpbmNsdWRlIDxuZXQvY2hlY2tzdW0uaD4KICNpbmNsdWRlIDxuZXQvaXAuaD4KQEAgLTEzNyw2ICsxMzgsMTAgQEAKIAogI2RlZmluZSBURzNfTlVNX1RFU1QJCTYKIAorI2RlZmluZSBGSVJNV0FSRV9URzMJCSJ0aWdvbi90ZzMuYmluIgorI2RlZmluZSBGSVJNV0FSRV9URzNUU08JCSJ0aWdvbi90ZzNfdHNvLmJpbiIKKyNkZWZpbmUgRklSTVdBUkVfVEczVFNPNQkidGlnb24vdGczX3RzbzUuYmluIgorCiBzdGF0aWMgY2hhciB2ZXJzaW9uW10gX19kZXZpbml0ZGF0YSA9CiAJRFJWX01PRFVMRV9OQU1FICIuYzp2IiBEUlZfTU9EVUxFX1ZFUlNJT04gIiAoIiBEUlZfTU9EVUxFX1JFTERBVEUgIilcbiI7CiAKQEAgLTE0NCw2ICsxNDksMTAgQEAKIE1PRFVMRV9ERVNDUklQVElPTigiQnJvYWRjb20gVGlnb24zIGV0aGVybmV0IGRyaXZlciIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogTU9EVUxFX1ZFUlNJT04oRFJWX01PRFVMRV9WRVJTSU9OKTsKK01PRFVMRV9GSVJNV0FSRShGSVJNV0FSRV9URzMpOworTU9EVUxFX0ZJUk1XQVJFKEZJUk1XQVJFX1RHM1RTTyk7CitNT0RVTEVfRklSTVdBUkUoRklSTVdBUkVfVEczVFNPNSk7CisKIAogc3RhdGljIGludCB0ZzNfZGVidWcgPSAtMTsJLyogLTEgPT0gdXNlIFRHM19ERUZfTVNHX0VOQUJMRSBhcyB2YWx1ZSAqLwogbW9kdWxlX3BhcmFtKHRnM19kZWJ1ZywgaW50LCAwKTsKQEAgLTYyMDUsMTMwICs2MjE0LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotI2RlZmluZSBURzNfRldfUkVMRUFTRV9NQUpPUgkweDAKLSNkZWZpbmUgVEczX0ZXX1JFTEFTRV9NSU5PUgkweDAKLSNkZWZpbmUgVEczX0ZXX1JFTEVBU0VfRklYCTB4MAotI2RlZmluZSBURzNfRldfU1RBUlRfQUREUgkweDA4MDAwMDAwCi0jZGVmaW5lIFRHM19GV19URVhUX0FERFIJMHgwODAwMDAwMAotI2RlZmluZSBURzNfRldfVEVYVF9MRU4JCTB4OWMwCi0jZGVmaW5lIFRHM19GV19ST0RBVEFfQUREUgkweDA4MDAwOWMwCi0jZGVmaW5lIFRHM19GV19ST0RBVEFfTEVOCTB4NjAKLSNkZWZpbmUgVEczX0ZXX0RBVEFfQUREUgkweDA4MDAwYTQwCi0jZGVmaW5lIFRHM19GV19EQVRBX0xFTgkJMHgyMAotI2RlZmluZSBURzNfRldfU0JTU19BRERSCTB4MDgwMDBhNjAKLSNkZWZpbmUgVEczX0ZXX1NCU1NfTEVOCQkweGMKLSNkZWZpbmUgVEczX0ZXX0JTU19BRERSCQkweDA4MDAwYTcwCi0jZGVmaW5lIFRHM19GV19CU1NfTEVOCQkweDEwCi0KLXN0YXRpYyBjb25zdCB1MzIgdGczRndUZXh0WyhURzNfRldfVEVYVF9MRU4gLyBzaXplb2YodTMyKSkgKyAxXSA9IHsKLQkweDAwMDAwMDAwLCAweDEwMDAwMDAzLCAweDAwMDAwMDAwLCAweDAwMDAwMDBkLCAweDAwMDAwMDBkLCAweDNjMWQwODAwLAotCTB4MzdiZDNmZmMsIDB4MDNhMGYwMjEsIDB4M2MxMDA4MDAsIDB4MjYxMDAwMDAsIDB4MGUwMDAwMTgsIDB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwZCwgMHgzYzFkMDgwMCwgMHgzN2JkM2ZmYywgMHgwM2EwZjAyMSwgMHgzYzEwMDgwMCwgMHgyNjEwMDAzNCwKLQkweDBlMDAwMjFjLCAweDAwMDAwMDAwLCAweDAwMDAwMDBkLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotCTB4MjdiZGZmZTAsIDB4M2MxY2MwMDAsIDB4YWZiZjAwMTgsIDB4YWY4MDY4MGMsIDB4MGUwMDAwNGMsIDB4MjQxYjIxMDUsCi0JMHg5Nzg1MDAwMCwgMHg5Nzg3MDAwMiwgMHg5NzgyMDAyYywgMHg5NzgzMDAyZSwgMHgzYzA0MDgwMCwgMHgyNDg0MDljMCwKLQkweGFmYTAwMDE0LCAweDAwMDIxNDAwLCAweDAwNjIxODI1LCAweDAwMDUyYzAwLCAweGFmYTMwMDEwLCAweDhmODYwMDEwLAotCTB4MDBlNTI4MjUsIDB4MGUwMDAwNjAsIDB4MjQwNzAxMDIsIDB4M2MwMmFjMDAsIDB4MzQ0MjAxMDAsIDB4M2MwM2FjMDEsCi0JMHgzNDYzMDEwMCwgMHhhZjgyMDQ5MCwgMHgzYzAyZmZmZiwgMHhhZjgyMDQ5NCwgMHhhZjgzMDQ5OCwgMHhhZjgyMDQ5YywKLQkweDI0MDIwMDAxLCAweGFmODI1Y2UwLCAweDBlMDAwMDNmLCAweGFmODI1ZDAwLCAweDBlMDAwMTQwLCAweDAwMDAwMDAwLAotCTB4OGZiZjAwMTgsIDB4MDNlMDAwMDgsIDB4MjdiZDAwMjAsIDB4MjQwMmZmZmYsIDB4YWY4MjU0MDQsIDB4OGY4MzU0MDAsCi0JMHgzNDYzMDQwMCwgMHhhZjgzNTQwMCwgMHhhZjgyNTQwNCwgMHgzYzAyMDgwMCwgMHgyNDQyMDAzNCwgMHhhZjgyNTQxYywKLQkweDAzZTAwMDA4LCAweGFmODA1NDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDNjMDIwODAwLCAweDM0NDIzMDAwLAotCTB4M2MwMzA4MDAsIDB4MzQ2MzMwMDAsIDB4M2MwNDA4MDAsIDB4MzQ4NDM3ZmYsIDB4M2MwMTA4MDAsIDB4YWMyMjBhNjQsCi0JMHgyNDAyMDA0MCwgMHgzYzAxMDgwMCwgMHhhYzIyMGE2OCwgMHgzYzAxMDgwMCwgMHhhYzIwMGE2MCwgMHhhYzYwMDAwMCwKLQkweDI0NjMwMDA0LCAweDAwODMxMDJiLCAweDUwNDBmZmZkLCAweGFjNjAwMDAwLCAweDAzZTAwMDA4LCAweDAwMDAwMDAwLAotCTB4MDA4MDQ4MjEsIDB4OGZhYTAwMTAsIDB4M2MwMjA4MDAsIDB4OGM0MjBhNjAsIDB4M2MwNDA4MDAsIDB4OGM4NDBhNjgsCi0JMHg4ZmFiMDAxNCwgMHgyNDQzMDAwMSwgMHgwMDQ0MTAyYiwgMHgzYzAxMDgwMCwgMHhhYzIzMGE2MCwgMHgxNDQwMDAwMywKLQkweDAwMDA0MDIxLCAweDNjMDEwODAwLCAweGFjMjAwYTYwLCAweDNjMDIwODAwLCAweDhjNDIwYTYwLCAweDNjMDMwODAwLAotCTB4OGM2MzBhNjQsIDB4OTEyNDAwMDAsIDB4MDAwMjExNDAsIDB4MDA0MzEwMjEsIDB4MDA0ODEwMjEsIDB4MjUwODAwMDEsCi0JMHhhMDQ0MDAwMCwgMHgyOTAyMDAwOCwgMHgxNDQwZmZmNCwgMHgyNTI5MDAwMSwgMHgzYzAyMDgwMCwgMHg4YzQyMGE2MCwKLQkweDNjMDMwODAwLCAweDhjNjMwYTY0LCAweDhmODQ2ODBjLCAweDAwMDIxMTQwLCAweDAwNDMxMDIxLCAweGFjNDQwMDA4LAotCTB4YWM0NTAwMGMsIDB4YWM0NjAwMTAsIDB4YWM0NzAwMTQsIDB4YWM0YTAwMTgsIDB4MDNlMDAwMDgsIDB4YWM0YjAwMWMsCi0JMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLQkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAotCTAsIDAsIDAsIDAsIDAsIDAsCi0JMHgwMjAwMDAwOCwgMHgwMDAwMDAwMCwgMHgwYTAwMDFlMywgMHgzYzBhMDAwMSwgMHgwYTAwMDFlMywgMHgzYzBhMDAwMiwKLQkweDBhMDAwMWUzLCAweDAwMDAwMDAwLCAweDBhMDAwMWUzLCAweDAwMDAwMDAwLCAweDBhMDAwMWUzLCAweDAwMDAwMDAwLAotCTB4MGEwMDAxZTMsIDB4MDAwMDAwMDAsIDB4MGEwMDAxZTMsIDB4MDAwMDAwMDAsIDB4MGEwMDAxZTMsIDB4MDAwMDAwMDAsCi0JMHgwYTAwMDFlMywgMHgwMDAwMDAwMCwgMHgwYTAwMDFlMywgMHgwMDAwMDAwMCwgMHgwYTAwMDFlMywgMHgwMDAwMDAwMCwKLQkweDBhMDAwMWUzLCAweDNjMGEwMDA3LCAweDBhMDAwMWUzLCAweDNjMGEwMDA4LCAweDBhMDAwMWUzLCAweDNjMGEwMDA5LAotCTB4MGEwMDAxZTMsIDB4MDAwMDAwMDAsIDB4MGEwMDAxZTMsIDB4MDAwMDAwMDAsIDB4MGEwMDAxZTMsIDB4M2MwYTAwMGIsCi0JMHgwYTAwMDFlMywgMHgzYzBhMDAwYywgMHgwYTAwMDFlMywgMHgzYzBhMDAwZCwgMHgwYTAwMDFlMywgMHgwMDAwMDAwMCwKLQkweDBhMDAwMWUzLCAweDAwMDAwMDAwLCAweDBhMDAwMWUzLCAweDNjMGEwMDBlLCAweDBhMDAwMWUzLCAweDAwMDAwMDAwLAotCTB4MGEwMDAxZTMsIDB4MDAwMDAwMDAsIDB4MGEwMDAxZTMsIDB4MDAwMDAwMDAsIDB4MGEwMDAxZTMsIDB4MDAwMDAwMDAsCi0JMHgwYTAwMDFlMywgMHgwMDAwMDAwMCwgMHgwYTAwMDFlMywgMHgwMDAwMDAwMCwgMHgwYTAwMDFlMywgMHgwMDAwMDAwMCwKLQkweDBhMDAwMWUzLCAweDAwMDAwMDAwLCAweDBhMDAwMWUzLCAweDNjMGEwMDEzLCAweDBhMDAwMWUzLCAweDNjMGEwMDE0LAotCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCi0JMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLQkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAotCTB4MjdiZGZmZTAsIDB4MDAwMDE4MjEsIDB4MDAwMDEwMjEsIDB4YWZiZjAwMTgsIDB4YWZiMTAwMTQsIDB4YWZiMDAwMTAsCi0JMHgzYzAxMDgwMCwgMHgwMDIyMDgyMSwgMHhhYzIwMGE3MCwgMHgzYzAxMDgwMCwgMHgwMDIyMDgyMSwgMHhhYzIwMGE3NCwKLQkweDNjMDEwODAwLCAweDAwMjIwODIxLCAweGFjMjAwYTc4LCAweDI0NjMwMDAxLCAweDE4NjBmZmY1LCAweDI0NDIwMDBjLAotCTB4MjQxMTAwMDEsIDB4OGY5MDY4MTAsIDB4MzIwMjAwMDQsIDB4MTQ0MDAwMDUsIDB4MjQwNDAwMDEsIDB4M2MwMjA4MDAsCi0JMHg4YzQyMGE3OCwgMHgxODQwMDAwMywgMHgwMDAwMjAyMSwgMHgwZTAwMDE4MiwgMHgwMDAwMDAwMCwgMHgzMjAyMDAwMSwKLQkweDEwNDAwMDAzLCAweDAwMDAwMDAwLCAweDBlMDAwMTY5LCAweDAwMDAwMDAwLCAweDBhMDAwMTUzLCAweGFmOTE1MDI4LAotCTB4OGZiZjAwMTgsIDB4OGZiMTAwMTQsIDB4OGZiMDAwMTAsIDB4MDNlMDAwMDgsIDB4MjdiZDAwMjAsIDB4M2MwNTA4MDAsCi0JMHg4Y2E1MGE3MCwgMHgzYzA2MDgwMCwgMHg4Y2M2MGE4MCwgMHgzYzA3MDgwMCwgMHg4Y2U3MGE3OCwgMHgyN2JkZmZlMCwKLQkweDNjMDQwODAwLCAweDI0ODQwOWQwLCAweGFmYmYwMDE4LCAweGFmYTAwMDEwLCAweDBlMDAwMDYwLCAweGFmYTAwMDE0LAotCTB4MGUwMDAxN2IsIDB4MDAwMDIwMjEsIDB4OGZiZjAwMTgsIDB4MDNlMDAwMDgsIDB4MjdiZDAwMjAsIDB4MjQwMjAwMDEsCi0JMHg4ZjgzNjgxMCwgMHgwMDgyMTAwNCwgMHgwMDAyMTAyNywgMHgwMDYyMTgyNCwgMHgwM2UwMDAwOCwgMHhhZjgzNjgxMCwKLQkweDI3YmRmZmQ4LCAweGFmYmYwMDI0LCAweDEwODAwMDJlLCAweGFmYjAwMDIwLCAweDhmODI1Y2VjLCAweGFmYTIwMDE4LAotCTB4OGY4MjVjZWMsIDB4M2MxMDA4MDAsIDB4MjYxMDBhNzgsIDB4YWZhMjAwMWMsIDB4MzQwMjgwMDAsIDB4YWY4MjVjZWMsCi0JMHg4ZTAyMDAwMCwgMHgxODQwMDAxNiwgMHgwMDAwMDAwMCwgMHgzYzAyMDgwMCwgMHg5NDQyMGE3NCwgMHg4ZmEzMDAxYywKLQkweDAwMDIyMWMwLCAweGFjODMwMDA0LCAweDhmYTIwMDFjLCAweDNjMDEwODAwLCAweDBlMDAwMjAxLCAweGFjMjIwYTc0LAotCTB4MTA0MDAwMDUsIDB4MDAwMDAwMDAsIDB4OGUwMjAwMDAsIDB4MjQ0MjAwMDEsIDB4MGEwMDAxZGYsIDB4YWUwMjAwMDAsCi0JMHgzYzAyMDgwMCwgMHg4YzQyMGE3MCwgMHgwMDAyMWMwMiwgMHgwMDAzMjFjMCwgMHgwYTAwMDFjNSwgMHhhZmEyMDAxYywKLQkweDBlMDAwMjAxLCAweDAwMDAwMDAwLCAweDEwNDAwMDFmLCAweDAwMDAwMDAwLCAweDhlMDIwMDAwLCAweDhmYTMwMDFjLAotCTB4MjQ0MjAwMDEsIDB4M2MwMTA4MDAsIDB4YWMyMzBhNzAsIDB4M2MwMTA4MDAsIDB4YWMyMzBhNzQsIDB4MGEwMDAxZGYsCi0JMHhhZTAyMDAwMCwgMHgzYzEwMDgwMCwgMHgyNjEwMGE3OCwgMHg4ZTAyMDAwMCwgMHgxODQwMDAyOCwgMHgwMDAwMDAwMCwKLQkweDBlMDAwMjAxLCAweDAwMDAwMDAwLCAweDE0NDAwMDI0LCAweDAwMDAwMDAwLCAweDhlMDIwMDAwLCAweDNjMDMwODAwLAotCTB4OGM2MzBhNzAsIDB4MjQ0MmZmZmYsIDB4YWZhMzAwMWMsIDB4MTg0MDAwMDYsIDB4YWUwMjAwMDAsIDB4MDAwMzE0MDIsCi0JMHgwMDAyMjFjMCwgMHg4YzgyMDAwNCwgMHgzYzAxMDgwMCwgMHhhYzIyMGE3MCwgMHg5N2EyMDAxZSwgMHgyNDQyZmYwMCwKLQkweDJjNDIwMzAwLCAweDE0NDAwMDBiLCAweDI0MDI0MDAwLCAweDNjMDQwODAwLCAweDI0ODQwOWRjLCAweGFmYTAwMDEwLAotCTB4YWZhMDAwMTQsIDB4OGZhNjAwMWMsIDB4MjQwNTAwMDgsIDB4MGUwMDAwNjAsIDB4MDAwMDM4MjEsIDB4MGEwMDAxZGYsCi0JMHgwMDAwMDAwMCwgMHhhZjgyNWNmOCwgMHgzYzAyMDgwMCwgMHg4YzQyMGE0MCwgMHg4ZmEzMDAxYywgMHgyNDQyMDAwMSwKLQkweGFmODM1Y2Y4LCAweDNjMDEwODAwLCAweGFjMjIwYTQwLCAweDhmYmYwMDI0LCAweDhmYjAwMDIwLCAweDAzZTAwMDA4LAotCTB4MjdiZDAwMjgsIDB4MjdiZGZmZTAsIDB4M2MwNDA4MDAsIDB4MjQ4NDA5ZTgsIDB4MDAwMDI4MjEsIDB4MDAwMDMwMjEsCi0JMHgwMDAwMzgyMSwgMHhhZmJmMDAxOCwgMHhhZmEwMDAxMCwgMHgwZTAwMDA2MCwgMHhhZmEwMDAxNCwgMHg4ZmJmMDAxOCwKLQkweDAzZTAwMDA4LCAweDI3YmQwMDIwLCAweDhmODI2ODBjLCAweDhmODU2ODBjLCAweDAwMDIxODI3LCAweDAwMDMxODJiLAotCTB4MDAwMzE4MjMsIDB4MDA0MzEwMjQsIDB4MDA0NDEwMjEsIDB4MDBhMjI4MmIsIDB4MTBhMDAwMDYsIDB4MDAwMDAwMDAsCi0JMHgwMDQwMTgyMSwgMHg4ZjgyNjgwYywgMHgwMDQzMTAyYiwgMHgxNDQwZmZmZCwgMHgwMDAwMDAwMCwgMHgwM2UwMDAwOCwKLQkweDAwMDAwMDAwLCAweDNjMDQwODAwLCAweDhjODQwMDAwLCAweDNjMDMwODAwLCAweDhjNjMwYTQwLCAweDAwNjQxMDJiLAotCTB4NTQ0MDAwMDIsIDB4MDA4MzEwMjMsIDB4MDA2NDEwMjMsIDB4MmM0MjAwMDgsIDB4MDNlMDAwMDgsIDB4Mzg0MjAwMDEsCi0JMHgyN2JkZmZlMCwgMHgwMDgwMjgyMSwgMHgzYzA0MDgwMCwgMHgyNDg0MGEwMCwgMHgwMDAwMzAyMSwgMHgwMDAwMzgyMSwKLQkweGFmYmYwMDE4LCAweGFmYTAwMDEwLCAweDBlMDAwMDYwLCAweGFmYTAwMDE0LCAweDBhMDAwMjE2LCAweDAwMDAwMDAwLAotCTB4OGZiZjAwMTgsIDB4MDNlMDAwMDgsIDB4MjdiZDAwMjAsIDB4MDAwMDAwMDAsIDB4MjdiZGZmZTAsIDB4M2MxY2MwMDAsCi0JMHhhZmJmMDAxOCwgMHgwZTAwMDA0YywgMHhhZjgwNjgwYywgMHgzYzA0MDgwMCwgMHgyNDg0MGExMCwgMHgwMzgwMjgyMSwKLQkweDAwMDAzMDIxLCAweDAwMDAzODIxLCAweGFmYTAwMDEwLCAweDBlMDAwMDYwLCAweGFmYTAwMDE0LCAweDI0MDJmZmZmLAotCTB4YWY4MjU0MDQsIDB4M2MwMjAwYWEsIDB4MGUwMDAyMzQsIDB4YWY4MjU0MzQsIDB4OGZiZjAwMTgsIDB4MDNlMDAwMDgsCi0JMHgyN2JkMDAyMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgyN2JkZmZlOCwgMHhhZmIwMDAxMCwKLQkweDI0MTAwMDAxLCAweGFmYmYwMDE0LCAweDNjMDFjMDAzLCAweGFjMjAwMDAwLCAweDhmODI2ODEwLCAweDMwNDIyMDAwLAotCTB4MTA0MDAwMDMsIDB4MDAwMDAwMDAsIDB4MGUwMDAyNDYsIDB4MDAwMDAwMDAsIDB4MGEwMDAyM2EsIDB4YWY5MDU0MjgsCi0JMHg4ZmJmMDAxNCwgMHg4ZmIwMDAxMCwgMHgwM2UwMDAwOCwgMHgyN2JkMDAxOCwgMHgyN2JkZmZmOCwgMHg4Zjg0NWQwYywKLQkweDNjMDIwMGZmLCAweDNjMDMwODAwLCAweDhjNjMwYTUwLCAweDM0NDJmZmY4LCAweDAwODIxMDI0LCAweDEwNDMwMDFlLAotCTB4M2MwNTAwZmYsIDB4MzRhNWZmZjgsIDB4M2MwNmMwMDMsIDB4M2MwNzQwMDAsIDB4MDA4NTE4MjQsIDB4OGM2MjAwMTAsCi0JMHgzYzAxMDgwMCwgMHhhYzIzMGE1MCwgMHgzMDQyMDAwOCwgMHgxMDQwMDAwNSwgMHgwMDg3MTAyNSwgMHg4Y2MyMDAwMCwKLQkweDI0NDIwMDAxLCAweGFjYzIwMDAwLCAweDAwODcxMDI1LCAweGFmODI1ZDBjLCAweDhmYTIwMDAwLCAweDI0NDIwMDAxLAotCTB4YWZhMjAwMDAsIDB4OGZhMjAwMDAsIDB4OGZhMjAwMDAsIDB4MjQ0MjAwMDEsIDB4YWZhMjAwMDAsIDB4OGZhMjAwMDAsCi0JMHg4Zjg0NWQwYywgMHgzYzAzMDgwMCwgMHg4YzYzMGE1MCwgMHgwMDg1MTAyNCwgMHgxNDQzZmZlOCwgMHgwMDg1MTgyNCwKLQkweDI3YmQwMDA4LCAweDAzZTAwMDA4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwCi19OwotCi1zdGF0aWMgY29uc3QgdTMyIHRnM0Z3Um9kYXRhWyhURzNfRldfUk9EQVRBX0xFTiAvIHNpemVvZih1MzIpKSArIDFdID0gewotCTB4MzUzNzMwMzEsIDB4NzI2YzczNDEsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4NTM3NzQ1NzYsIDB4NjU2ZTc0MzAsCi0JMHgwMDAwMDAwMCwgMHg3MjZjNzA0NSwgMHg3NjY1NmU3NCwgMHgzMTAwMDAwMCwgMHg1NTZlNmI2ZSwgMHg0NTc2NmU3NCwKLQkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDY2NjE3NDYxLCAweDZjNDU3MjcyLAotCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4NGQ2MTY5NmUsIDB4NDM3MDc1NDIsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMAotfTsKLQotI2lmIDAgLyogQWxsIHplcm9zLCBkb24ndCBlYXQgdXAgc3BhY2Ugd2l0aCBpdC4gKi8KLXUzMiB0ZzNGd0RhdGFbKFRHM19GV19EQVRBX0xFTiAvIHNpemVvZih1MzIpKSArIDFdID0gewotCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMAotfTsKLSNlbmRpZgotCiAjZGVmaW5lIFJYX0NQVV9TQ1JBVENIX0JBU0UJMHgzMDAwMAogI2RlZmluZSBSWF9DUFVfU0NSQVRDSF9TSVpFCTB4MDQwMDAKICNkZWZpbmUgVFhfQ1BVX1NDUkFUQ0hfQkFTRQkweDM0MDAwCkBAIC02MzgzLDE1ICs2MjY4LDkgQEAKIH0KIAogc3RydWN0IGZ3X2luZm8gewotCXVuc2lnbmVkIGludCB0ZXh0X2Jhc2U7Ci0JdW5zaWduZWQgaW50IHRleHRfbGVuOwotCWNvbnN0IHUzMiAqdGV4dF9kYXRhOwotCXVuc2lnbmVkIGludCByb2RhdGFfYmFzZTsKLQl1bnNpZ25lZCBpbnQgcm9kYXRhX2xlbjsKLQljb25zdCB1MzIgKnJvZGF0YV9kYXRhOwotCXVuc2lnbmVkIGludCBkYXRhX2Jhc2U7Ci0JdW5zaWduZWQgaW50IGRhdGFfbGVuOwotCWNvbnN0IHUzMiAqZGF0YV9kYXRhOworCXVuc2lnbmVkIGludCBmd19iYXNlOworCXVuc2lnbmVkIGludCBmd19sZW47CisJY29uc3QgX19iZTMyICpmd19kYXRhOwogfTsKIAogLyogdHAtPmxvY2sgaXMgaGVsZC4gKi8KQEAgLTY0MjgsMjQgKzYzMDcsMTEgQEAKIAkJd3JpdGVfb3AodHAsIGNwdV9zY3JhdGNoX2Jhc2UgKyBpLCAwKTsKIAl0dzMyKGNwdV9iYXNlICsgQ1BVX1NUQVRFLCAweGZmZmZmZmZmKTsKIAl0dzMyKGNwdV9iYXNlICsgQ1BVX01PREUsIHRyMzIoY3B1X2Jhc2UrQ1BVX01PREUpfENQVV9NT0RFX0hBTFQpOwotCWZvciAoaSA9IDA7IGkgPCAoaW5mby0+dGV4dF9sZW4gLyBzaXplb2YodTMyKSk7IGkrKykKKwlmb3IgKGkgPSAwOyBpIDwgKGluZm8tPmZ3X2xlbiAvIHNpemVvZih1MzIpKTsgaSsrKQogCQl3cml0ZV9vcCh0cCwgKGNwdV9zY3JhdGNoX2Jhc2UgKwotCQkJICAgICAgKGluZm8tPnRleHRfYmFzZSAmIDB4ZmZmZikgKworCQkJICAgICAgKGluZm8tPmZ3X2Jhc2UgJiAweGZmZmYpICsKIAkJCSAgICAgIChpICogc2l6ZW9mKHUzMikpKSwKLQkJCSAoaW5mby0+dGV4dF9kYXRhID8KLQkJCSAgaW5mby0+dGV4dF9kYXRhW2ldIDogMCkpOwotCWZvciAoaSA9IDA7IGkgPCAoaW5mby0+cm9kYXRhX2xlbiAvIHNpemVvZih1MzIpKTsgaSsrKQotCQl3cml0ZV9vcCh0cCwgKGNwdV9zY3JhdGNoX2Jhc2UgKwotCQkJICAgICAgKGluZm8tPnJvZGF0YV9iYXNlICYgMHhmZmZmKSArCi0JCQkgICAgICAoaSAqIHNpemVvZih1MzIpKSksCi0JCQkgKGluZm8tPnJvZGF0YV9kYXRhID8KLQkJCSAgaW5mby0+cm9kYXRhX2RhdGFbaV0gOiAwKSk7Ci0JZm9yIChpID0gMDsgaSA8IChpbmZvLT5kYXRhX2xlbiAvIHNpemVvZih1MzIpKTsgaSsrKQotCQl3cml0ZV9vcCh0cCwgKGNwdV9zY3JhdGNoX2Jhc2UgKwotCQkJICAgICAgKGluZm8tPmRhdGFfYmFzZSAmIDB4ZmZmZikgKwotCQkJICAgICAgKGkgKiBzaXplb2YodTMyKSkpLAotCQkJIChpbmZvLT5kYXRhX2RhdGEgPwotCQkJICBpbmZvLT5kYXRhX2RhdGFbaV0gOiAwKSk7CisJCQkgICAgICBiZTMyX3RvX2NwdShpbmZvLT5md19kYXRhW2ldKSk7CiAKIAllcnIgPSAwOwogCkBAIC02NDU3LDE3ICs2MzIzLDIwIEBACiBzdGF0aWMgaW50IHRnM19sb2FkXzU3MDFfYTBfZmlybXdhcmVfZml4KHN0cnVjdCB0ZzMgKnRwKQogewogCXN0cnVjdCBmd19pbmZvIGluZm87CisJY29uc3QgX19iZTMyICpmd19kYXRhOwogCWludCBlcnIsIGk7CiAKLQlpbmZvLnRleHRfYmFzZSA9IFRHM19GV19URVhUX0FERFI7Ci0JaW5mby50ZXh0X2xlbiA9IFRHM19GV19URVhUX0xFTjsKLQlpbmZvLnRleHRfZGF0YSA9ICZ0ZzNGd1RleHRbMF07Ci0JaW5mby5yb2RhdGFfYmFzZSA9IFRHM19GV19ST0RBVEFfQUREUjsKLQlpbmZvLnJvZGF0YV9sZW4gPSBURzNfRldfUk9EQVRBX0xFTjsKLQlpbmZvLnJvZGF0YV9kYXRhID0gJnRnM0Z3Um9kYXRhWzBdOwotCWluZm8uZGF0YV9iYXNlID0gVEczX0ZXX0RBVEFfQUREUjsKLQlpbmZvLmRhdGFfbGVuID0gVEczX0ZXX0RBVEFfTEVOOwotCWluZm8uZGF0YV9kYXRhID0gTlVMTDsKKwlmd19kYXRhID0gKHZvaWQgKil0cC0+ZnctPmRhdGE7CisKKwkvKiBGaXJtd2FyZSBibG9iIHN0YXJ0cyB3aXRoIHZlcnNpb24gbnVtYmVycywgZm9sbG93ZWQgYnkKKwkgICBzdGFydCBhZGRyZXNzIGFuZCBsZW5ndGguIFdlIGFyZSBzZXR0aW5nIGNvbXBsZXRlIGxlbmd0aC4KKwkgICBsZW5ndGggPSBlbmRfYWRkcmVzc19vZl9ic3MgLSBzdGFydF9hZGRyZXNzX29mX3RleHQuCisJICAgUmVtYWluZGVyIGlzIHRoZSBibG9iIHRvIGJlIGxvYWRlZCBjb250aWd1b3VzbHkKKwkgICBmcm9tIHN0YXJ0IGFkZHJlc3MuICovCisKKwlpbmZvLmZ3X2Jhc2UgPSBiZTMyX3RvX2NwdShmd19kYXRhWzFdKTsKKwlpbmZvLmZ3X2xlbiA9IHRwLT5mdy0+c2l6ZSAtIDEyOworCWluZm8uZndfZGF0YSA9ICZmd19kYXRhWzNdOwogCiAJZXJyID0gdGczX2xvYWRfZmlybXdhcmVfY3B1KHRwLCBSWF9DUFVfQkFTRSwKIAkJCQkgICAgUlhfQ1BVX1NDUkFUQ0hfQkFTRSwgUlhfQ1BVX1NDUkFUQ0hfU0laRSwKQEAgLTY0ODMsMjEgKzYzNTIsMjEgQEAKIAogCS8qIE5vdyBzdGFydHVwIG9ubHkgdGhlIFJYIGNwdS4gKi8KIAl0dzMyKFJYX0NQVV9CQVNFICsgQ1BVX1NUQVRFLCAweGZmZmZmZmZmKTsKLQl0dzMyX2YoUlhfQ1BVX0JBU0UgKyBDUFVfUEMsICAgIFRHM19GV19URVhUX0FERFIpOworCXR3MzJfZihSWF9DUFVfQkFTRSArIENQVV9QQywgaW5mby5md19iYXNlKTsKIAogCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspIHsKLQkJaWYgKHRyMzIoUlhfQ1BVX0JBU0UgKyBDUFVfUEMpID09IFRHM19GV19URVhUX0FERFIpCisJCWlmICh0cjMyKFJYX0NQVV9CQVNFICsgQ1BVX1BDKSA9PSBpbmZvLmZ3X2Jhc2UpCiAJCQlicmVhazsKIAkJdHczMihSWF9DUFVfQkFTRSArIENQVV9TVEFURSwgMHhmZmZmZmZmZik7CiAJCXR3MzIoUlhfQ1BVX0JBU0UgKyBDUFVfTU9ERSwgIENQVV9NT0RFX0hBTFQpOwotCQl0dzMyX2YoUlhfQ1BVX0JBU0UgKyBDUFVfUEMsICAgIFRHM19GV19URVhUX0FERFIpOworCQl0dzMyX2YoUlhfQ1BVX0JBU0UgKyBDUFVfUEMsIGluZm8uZndfYmFzZSk7CiAJCXVkZWxheSgxMDAwKTsKIAl9CiAJaWYgKGkgPj0gNSkgewogCQlwcmludGsoS0VSTl9FUlIgUEZYICJ0ZzNfbG9hZF9maXJtd2FyZSBmYWlscyBmb3IgJXMgIgogCQkgICAgICAgInRvIHNldCBSWCBDUFUgUEMsIGlzICUwOHggc2hvdWxkIGJlICUwOHhcbiIsCiAJCSAgICAgICB0cC0+ZGV2LT5uYW1lLCB0cjMyKFJYX0NQVV9CQVNFICsgQ1BVX1BDKSwKLQkJICAgICAgIFRHM19GV19URVhUX0FERFIpOworCQkgICAgICAgaW5mby5md19iYXNlKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCXR3MzIoUlhfQ1BVX0JBU0UgKyBDUFVfU1RBVEUsIDB4ZmZmZmZmZmYpOwpAQCAtNjUwNiw1NDcgKzYzNzUsMzYgQEAKIAlyZXR1cm4gMDsKIH0KIAotCi0jZGVmaW5lIFRHM19UU09fRldfUkVMRUFTRV9NQUpPUgkweDEKLSNkZWZpbmUgVEczX1RTT19GV19SRUxBU0VfTUlOT1IJCTB4NgotI2RlZmluZSBURzNfVFNPX0ZXX1JFTEVBU0VfRklYCQkweDAKLSNkZWZpbmUgVEczX1RTT19GV19TVEFSVF9BRERSCQkweDA4MDAwMDAwCi0jZGVmaW5lIFRHM19UU09fRldfVEVYVF9BRERSCQkweDA4MDAwMDAwCi0jZGVmaW5lIFRHM19UU09fRldfVEVYVF9MRU4JCTB4MWFhMAotI2RlZmluZSBURzNfVFNPX0ZXX1JPREFUQV9BRERSCQkweDA4MDAxYWEwCi0jZGVmaW5lIFRHM19UU09fRldfUk9EQVRBX0xFTgkJMHg2MAotI2RlZmluZSBURzNfVFNPX0ZXX0RBVEFfQUREUgkJMHgwODAwMWIyMAotI2RlZmluZSBURzNfVFNPX0ZXX0RBVEFfTEVOCQkweDMwCi0jZGVmaW5lIFRHM19UU09fRldfU0JTU19BRERSCQkweDA4MDAxYjUwCi0jZGVmaW5lIFRHM19UU09fRldfU0JTU19MRU4JCTB4MmMKLSNkZWZpbmUgVEczX1RTT19GV19CU1NfQUREUgkJMHgwODAwMWI4MAotI2RlZmluZSBURzNfVFNPX0ZXX0JTU19MRU4JCTB4ODk0Ci0KLXN0YXRpYyBjb25zdCB1MzIgdGczVHNvRndUZXh0WyhURzNfVFNPX0ZXX1RFWFRfTEVOIC8gNCkgKyAxXSA9IHsKLQkweDBlMDAwMDAzLCAweDAwMDAwMDAwLCAweDA4MDAxYjI0LCAweDAwMDAwMDAwLCAweDEwMDAwMDAzLCAweDAwMDAwMDAwLAotCTB4MDAwMDAwMGQsIDB4MDAwMDAwMGQsIDB4M2MxZDA4MDAsIDB4MzdiZDQwMDAsIDB4MDNhMGYwMjEsIDB4M2MxMDA4MDAsCi0JMHgyNjEwMDAwMCwgMHgwZTAwMDAxMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwZCwgMHgyN2JkZmZlMCwgMHgzYzA0ZmVmZSwKLQkweGFmYmYwMDE4LCAweDBlMDAwNWQ4LCAweDM0ODQwMDAyLCAweDBlMDAwNjY4LCAweDAwMDAwMDAwLCAweDNjMDMwODAwLAotCTB4OTA2MzFiNjgsIDB4MjQwMjAwMDIsIDB4M2MwNDA4MDAsIDB4MjQ4NDFhYWMsIDB4MTQ2MjAwMDMsIDB4MjQwNTAwMDEsCi0JMHgzYzA0MDgwMCwgMHgyNDg0MWFhMCwgMHgyNDA2MDAwNiwgMHgwMDAwMzgyMSwgMHhhZmEwMDAxMCwgMHgwZTAwMDY3YywKLQkweGFmYTAwMDE0LCAweDhmNjI1YzUwLCAweDM0NDIwMDAxLCAweGFmNjI1YzUwLCAweDhmNjI1YzkwLCAweDM0NDIwMDAxLAotCTB4YWY2MjVjOTAsIDB4MjQwMmZmZmYsIDB4MGUwMDAwMzQsIDB4YWY2MjU0MDQsIDB4OGZiZjAwMTgsIDB4MDNlMDAwMDgsCi0JMHgyN2JkMDAyMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgyN2JkZmZlMCwgMHhhZmJmMDAxYywKLQkweGFmYjIwMDE4LCAweGFmYjEwMDE0LCAweDBlMDAwMDViLCAweGFmYjAwMDEwLCAweDI0MTIwMDAyLCAweDI0MTEwMDAxLAotCTB4OGY3MDY4MjAsIDB4MzIwMjAxMDAsIDB4MTA0MDAwMDMsIDB4MDAwMDAwMDAsIDB4MGUwMDAwYmIsIDB4MDAwMDAwMDAsCi0JMHg4ZjcwNjgyMCwgMHgzMjAyMjAwMCwgMHgxMDQwMDAwNCwgMHgzMjAyMDAwMSwgMHgwZTAwMDFmMCwgMHgyNDA0MDAwMSwKLQkweDMyMDIwMDAxLCAweDEwNDAwMDAzLCAweDAwMDAwMDAwLCAweDBlMDAwMGEzLCAweDAwMDAwMDAwLCAweDNjMDIwODAwLAotCTB4OTA0MjFiOTgsIDB4MTQ1MjAwMDMsIDB4MDAwMDAwMDAsIDB4MGUwMDA0YzAsIDB4MDAwMDAwMDAsIDB4MGEwMDAwM2MsCi0JMHhhZjcxNTAyOCwgMHg4ZmJmMDAxYywgMHg4ZmIyMDAxOCwgMHg4ZmIxMDAxNCwgMHg4ZmIwMDAxMCwgMHgwM2UwMDAwOCwKLQkweDI3YmQwMDIwLCAweDI3YmRmZmUwLCAweDNjMDQwODAwLCAweDI0ODQxYWMwLCAweDAwMDAyODIxLCAweDAwMDAzMDIxLAotCTB4MDAwMDM4MjEsIDB4YWZiZjAwMTgsIDB4YWZhMDAwMTAsIDB4MGUwMDA2N2MsIDB4YWZhMDAwMTQsIDB4M2MwNDA4MDAsCi0JMHgyNDg0MjNkOCwgMHhhNDgwMDAwMCwgMHgzYzAxMDgwMCwgMHhhMDIwMWI5OCwgMHgzYzAxMDgwMCwgMHhhYzIwMWI5YywKLQkweDNjMDEwODAwLCAweGFjMjAxYmEwLCAweDNjMDEwODAwLCAweGFjMjAxYmE0LCAweDNjMDEwODAwLCAweGFjMjAxYmFjLAotCTB4M2MwMTA4MDAsIDB4YWMyMDFiYjgsIDB4M2MwMTA4MDAsIDB4YWMyMDFiYmMsIDB4OGY2MjQ0MzQsIDB4M2MwMTA4MDAsCi0JMHhhYzIyMWI4OCwgMHg4ZjYyNDQzOCwgMHgzYzAxMDgwMCwgMHhhYzIyMWI4YywgMHg4ZjYyNDQxMCwgMHhhYzgwZjdhOCwKLQkweDNjMDEwODAwLCAweGFjMjAxYjg0LCAweDNjMDEwODAwLCAweGFjMjAyM2UwLCAweDNjMDEwODAwLCAweGFjMjAyM2M4LAotCTB4M2MwMTA4MDAsIDB4YWMyMDIzY2MsIDB4M2MwMTA4MDAsIDB4YWMyMDI0MDAsIDB4M2MwMTA4MDAsIDB4YWMyMjFiOTAsCi0JMHg4ZjYyMDA2OCwgMHgyNDAzMDAwNywgMHgwMDAyMTcwMiwgMHgxMDQzMDAwNSwgMHgwMDAwMDAwMCwgMHg4ZjYyMDA2OCwKLQkweDAwMDIxNzAyLCAweDE0NDAwMDA0LCAweDI0MDIwMDAxLCAweDNjMDEwODAwLCAweDBhMDAwMDk3LCAweGFjMjAyNDBjLAotCTB4YWM4MjAwMzQsIDB4M2MwNDA4MDAsIDB4MjQ4NDFhY2MsIDB4M2MwNTA4MDAsIDB4OGNhNTI0MGMsIDB4MDAwMDMwMjEsCi0JMHgwMDAwMzgyMSwgMHhhZmEwMDAxMCwgMHgwZTAwMDY3YywgMHhhZmEwMDAxNCwgMHg4ZmJmMDAxOCwgMHgwM2UwMDAwOCwKLQkweDI3YmQwMDIwLCAweDI3YmRmZmUwLCAweDNjMDQwODAwLCAweDI0ODQxYWQ4LCAweDAwMDAyODIxLCAweDAwMDAzMDIxLAotCTB4MDAwMDM4MjEsIDB4YWZiZjAwMTgsIDB4YWZhMDAwMTAsIDB4MGUwMDA2N2MsIDB4YWZhMDAwMTQsIDB4MGUwMDAwNWIsCi0JMHgwMDAwMDAwMCwgMHgwZTAwMDBiNCwgMHgwMDAwMjAyMSwgMHg4ZmJmMDAxOCwgMHgwM2UwMDAwOCwgMHgyN2JkMDAyMCwKLQkweDI0MDIwMDAxLCAweDhmNjM2ODIwLCAweDAwODIxMDA0LCAweDAwMDIxMDI3LCAweDAwNjIxODI0LCAweDAzZTAwMDA4LAotCTB4YWY2MzY4MjAsIDB4MjdiZGZmZDAsIDB4YWZiZjAwMmMsIDB4YWZiNjAwMjgsIDB4YWZiNTAwMjQsIDB4YWZiNDAwMjAsCi0JMHhhZmIzMDAxYywgMHhhZmIyMDAxOCwgMHhhZmIxMDAxNCwgMHhhZmIwMDAxMCwgMHg4ZjY3NWM1YywgMHgzYzAzMDgwMCwKLQkweDI0NjMxYmJjLCAweDhjNjIwMDAwLCAweDE0NDcwMDA1LCAweDNjMDIwMGZmLCAweDNjMDIwODAwLCAweDkwNDIxYjk4LAotCTB4MTQ0MDAxMTksIDB4M2MwMjAwZmYsIDB4MzQ0MmZmZjgsIDB4MDBlMjg4MjQsIDB4YWM2NzAwMDAsIDB4MDAxMTE5MDIsCi0JMHgzMDYzMDBmZiwgMHgzMGUyMDAwMywgMHgwMDAyMTFjMCwgMHgwMDYyMjgyNSwgMHgwMGEwNDAyMSwgMHgwMDA3MTYwMiwKLQkweDNjMDMwODAwLCAweDkwNjMxYjk4LCAweDMwNDQwMDBmLCAweDE0NjAwMDM2LCAweDAwODA0ODIxLCAweDI0MDIwMDAxLAotCTB4M2MwMTA4MDAsIDB4YTAyMjFiOTgsIDB4MDAwNTExMDAsIDB4MDA4MjEwMjUsIDB4M2MwMTA4MDAsIDB4YWMyMDFiOWMsCi0JMHgzYzAxMDgwMCwgMHhhYzIwMWJhMCwgMHgzYzAxMDgwMCwgMHhhYzIwMWJhNCwgMHgzYzAxMDgwMCwgMHhhYzIwMWJhYywKLQkweDNjMDEwODAwLCAweGFjMjAxYmI4LCAweDNjMDEwODAwLCAweGFjMjAxYmIwLCAweDNjMDEwODAwLCAweGFjMjAxYmI0LAotCTB4M2MwMTA4MDAsIDB4YTQyMjIzZDgsIDB4OTYyMjAwMGMsIDB4MzA0MzdmZmYsIDB4M2MwMTA4MDAsIDB4YTQyMjI0MTAsCi0JMHgzMDQyODAwMCwgMHgzYzAxMDgwMCwgMHhhNDIzMWJjNiwgMHgxMDQwMDAwNSwgMHgyNDAyMDAwMSwgMHgzYzAxMDgwMCwKLQkweGFjMjIyM2Y0LCAweDBhMDAwMTAyLCAweDI0MDYwMDNlLCAweDI0MDYwMDM2LCAweDNjMDEwODAwLCAweGFjMjAyM2Y0LAotCTB4OTYyMjAwMGEsIDB4M2MwMzA4MDAsIDB4OTQ2MzFiYzYsIDB4M2MwMTA4MDAsIDB4YWMyMDIzZjAsIDB4M2MwMTA4MDAsCi0JMHhhYzIwMjNmOCwgMHgwMDAyMTMwMiwgMHgwMDAyMTA4MCwgMHgwMGMyMTAyMSwgMHgwMDYyMTgyMSwgMHgzYzAxMDgwMCwKLQkweGE0MjIyM2QwLCAweDNjMDEwODAwLCAweDBhMDAwMTE1LCAweGE0MjMxYjk2LCAweDk2MjIwMDBjLCAweDNjMDEwODAwLAotCTB4YTQyMjIzZWMsIDB4M2MwNDA4MDAsIDB4MjQ4NDFiOWMsIDB4OGM4MjAwMDAsIDB4MDAwMjExMDAsIDB4M2MwMTA4MDAsCi0JMHgwMDIyMDgyMSwgMHhhYzMxMWJjOCwgMHg4YzgyMDAwMCwgMHgwMDAyMTEwMCwgMHgzYzAxMDgwMCwgMHgwMDIyMDgyMSwKLQkweGFjMjcxYmNjLCAweDhjODIwMDAwLCAweDI1MDMwMDAxLCAweDMwNjYwMWZmLCAweDAwMDIxMTAwLCAweDNjMDEwODAwLAotCTB4MDAyMjA4MjEsIDB4YWMyNjFiZDAsIDB4OGM4MjAwMDAsIDB4MDAwMjExMDAsIDB4M2MwMTA4MDAsIDB4MDAyMjA4MjEsCi0JMHhhYzI5MWJkNCwgMHg5NjIzMDAwOCwgMHgzYzAyMDgwMCwgMHg4YzQyMWJhYywgMHgwMDQzMjgyMSwgMHgzYzAxMDgwMCwKLQkweGFjMjUxYmFjLCAweDk2MjIwMDBhLCAweDMwNDIwMDA0LCAweDE0NDAwMDE4LCAweDAwMDYxMTAwLCAweDhmNjMwYzE0LAotCTB4MzA2MzAwMGYsIDB4MmM2MjAwMDIsIDB4MTQ0MDAwMGIsIDB4M2MwMmMwMDAsIDB4OGY2MzBjMTQsIDB4M2MwMjA4MDAsCi0JMHg4YzQyMWI0MCwgMHgzMDYzMDAwZiwgMHgyNDQyMDAwMSwgMHgzYzAxMDgwMCwgMHhhYzIyMWI0MCwgMHgyYzYyMDAwMiwKLQkweDEwNDBmZmY3LCAweDNjMDJjMDAwLCAweDAwZTIxODI1LCAweGFmNjM1YzVjLCAweDhmNjI1YzUwLCAweDMwNDIwMDAyLAotCTB4MTA0MDAwMTQsIDB4MDAwMDAwMDAsIDB4MGEwMDAxNDcsIDB4MDAwMDAwMDAsIDB4M2MwMzA4MDAsIDB4OGM2MzFiODAsCi0JMHgzYzA0MDgwMCwgMHg5NDg0MWI5NCwgMHgwMTIyMTAyNSwgMHgzYzAxMDgwMCwgMHhhNDIyMjNkYSwgMHgyNDAyMDAwMSwKLQkweDNjMDEwODAwLCAweGFjMjIxYmI4LCAweDI0NjMwMDAxLCAweDAwODUyMDJhLCAweDNjMDEwODAwLCAweDEwODAwMDAzLAotCTB4YWMyMzFiODAsIDB4M2MwMTA4MDAsIDB4YTQyNTFiOTQsIDB4M2MwNjA4MDAsIDB4MjRjNjFiOWMsIDB4OGNjMjAwMDAsCi0JMHgyNDQyMDAwMSwgMHhhY2MyMDAwMCwgMHgyODQyMDA4MCwgMHgxNDQwMDAwNSwgMHgwMDAwMDAwMCwgMHgwZTAwMDY1NiwKLQkweDI0MDQwMDAyLCAweDBhMDAwMWU2LCAweDAwMDAwMDAwLCAweDNjMDIwODAwLCAweDhjNDIxYmI4LCAweDEwNDAwMDc4LAotCTB4MjQwMjAwMDEsIDB4M2MwNTA4MDAsIDB4OTBhNTFiOTgsIDB4MTRhMjAwNzIsIDB4MDAwMDAwMDAsIDB4M2MxNTA4MDAsCi0JMHg5NmI1MWI5NiwgMHgzYzA0MDgwMCwgMHg4Yzg0MWJhYywgMHgzMmEzZmZmZiwgMHgwMDgzMTAyYSwgMHgxNDQwMDA2YywKLQkweDAwMDAwMDAwLCAweDE0ODMwMDAzLCAweDAwMDAwMDAwLCAweDNjMDEwODAwLCAweGFjMjUyM2YwLCAweDEwNjAwMDVjLAotCTB4MDAwMDkwMjEsIDB4MjRkNjAwMDQsIDB4MDA2MGEwMjEsIDB4MjRkMzAwMTQsIDB4OGVjMjAwMDAsIDB4MDAwMjgxMDAsCi0JMHgzYzExMDgwMCwgMHgwMjMwODgyMSwgMHgwZTAwMDYyNSwgMHg4ZTMxMWJjOCwgMHgwMDQwMjgyMSwgMHgxMGEwMDA1NCwKLQkweDAwMDAwMDAwLCAweDk2MjgwMDBhLCAweDMxMDIwMDQwLCAweDEwNDAwMDA1LCAweDI0MDcxODBjLCAweDhlMjIwMDBjLAotCTB4MjQwNzE4OGMsIDB4MDAwMjE0MDAsIDB4YWNhMjAwMTgsIDB4M2MwMzA4MDAsIDB4MDA3MDE4MjEsIDB4OGM2MzFiZDAsCi0JMHgzYzAyMDgwMCwgMHgwMDUwMTAyMSwgMHg4YzQyMWJkNCwgMHgwMDAzMWQwMCwgMHgwMDAyMTQwMCwgMHgwMDYyMTgyNSwKLQkweGFjYTMwMDE0LCAweDhlYzMwMDA0LCAweDk2MjIwMDA4LCAweDAwNDMyMDIzLCAweDMyNDJmZmZmLCAweDMwODNmZmZmLAotCTB4MDA0MzEwMjEsIDB4MDI4MjEwMmEsIDB4MTQ0MDAwMDIsIDB4MDJiMjMwMjMsIDB4MDA4MDMwMjEsIDB4OGU2MjAwMDAsCi0JMHgzMGM0ZmZmZiwgMHgwMDQ0MTAyMSwgMHhhZTYyMDAwMCwgMHg4ZTIyMDAwMCwgMHhhY2EyMDAwMCwgMHg4ZTIyMDAwNCwKLQkweDhlNjNmZmY0LCAweDAwNDMxMDIxLCAweGFjYTIwMDA0LCAweGE0YTYwMDBlLCAweDhlNjJmZmY0LCAweDAwNDQxMDIxLAotCTB4YWU2MmZmZjQsIDB4OTYyMzAwMDgsIDB4MDA0MzEwMmEsIDB4MTQ0MDAwMDUsIDB4MDI0NjkwMjEsIDB4OGU2MmZmZjAsCi0JMHhhZTYwZmZmNCwgMHgyNDQyMDAwMSwgMHhhZTYyZmZmMCwgMHhhY2EwMDAwOCwgMHgzMjQyZmZmZiwgMHgxNDU0MDAwOCwKLQkweDI0MDIwMzA1LCAweDMxMDIwMDgwLCAweDU0NDAwMDAxLCAweDM0ZTcwMDEwLCAweDI0MDIwOTA1LCAweGE0YTIwMDBjLAotCTB4MGEwMDAxY2IsIDB4MzRlNzAwMjAsIDB4YTRhMjAwMGMsIDB4M2MwMjA4MDAsIDB4OGM0MjIzZjAsIDB4MTA0MDAwMDMsCi0JMHgzYzAyNGI2NSwgMHgwYTAwMDFkMywgMHgzNDQyNzY1NCwgMHgzYzAyYjQ5YSwgMHgzNDQyODlhYiwgMHhhY2EyMDAxYywKLQkweDMwZTJmZmZmLCAweGFjYTIwMDEwLCAweDBlMDAwNWEyLCAweDAwYTAyMDIxLCAweDMyNDJmZmZmLCAweDAwNTQxMDJiLAotCTB4MTQ0MGZmYTksIDB4MDAwMDAwMDAsIDB4MjQwMjAwMDIsIDB4M2MwMTA4MDAsIDB4MGEwMDAxZTYsIDB4YTAyMjFiOTgsCi0JMHg4ZWMyMDgzYywgMHgyNDQyMDAwMSwgMHgwYTAwMDFlNiwgMHhhZWMyMDgzYywgMHgwZTAwMDRjMCwgMHgwMDAwMDAwMCwKLQkweDhmYmYwMDJjLCAweDhmYjYwMDI4LCAweDhmYjUwMDI0LCAweDhmYjQwMDIwLCAweDhmYjMwMDFjLCAweDhmYjIwMDE4LAotCTB4OGZiMTAwMTQsIDB4OGZiMDAwMTAsIDB4MDNlMDAwMDgsIDB4MjdiZDAwMzAsIDB4MjdiZGZmZDAsIDB4YWZiZjAwMjgsCi0JMHhhZmIzMDAyNCwgMHhhZmIyMDAyMCwgMHhhZmIxMDAxYywgMHhhZmIwMDAxOCwgMHg4ZjcyNWM5YywgMHgzYzAyMDBmZiwKLQkweDM0NDJmZmY4LCAweDNjMDcwODAwLCAweDI0ZTcxYmI0LCAweDAyNDI4ODI0LCAweDk2MjMwMDBlLCAweDhjZTIwMDAwLAotCTB4MDA0MzEwMjEsIDB4YWNlMjAwMDAsIDB4OGUyMjAwMTAsIDB4MzA0MjAwMjAsIDB4MTQ0MDAwMTEsIDB4MDA4MDk4MjEsCi0JMHgwZTAwMDYzYiwgMHgwMjIwMjAyMSwgMHgzYzAyYzAwMCwgMHgwMjQyMTgyNSwgMHhhZjYzNWM5YywgMHg4ZjYyNWM5MCwKLQkweDMwNDIwMDAyLCAweDEwNDAwMTFlLCAweDAwMDAwMDAwLCAweGFmNjM1YzljLCAweDhmNjI1YzkwLCAweDMwNDIwMDAyLAotCTB4MTA0MDAxMTksIDB4MDAwMDAwMDAsIDB4MGEwMDAyMGQsIDB4MDAwMDAwMDAsIDB4OGUyNDAwMDgsIDB4OGUyMzAwMTQsCi0JMHgwMDA0MTQwMiwgMHgwMDAyMzFjMCwgMHgwMDAzMTUwMiwgMHgzMDQyMDFmZiwgMHgyNDQyZmZmZiwgMHgzMDQyMDA3ZiwKLQkweDAwMDMxOTQyLCAweDMwNjM3ODAwLCAweDAwMDIxMTAwLCAweDI0NDI0MDAwLCAweDAwNjI0ODIxLCAweDk1MjIwMDBhLAotCTB4MzA4NGZmZmYsIDB4MzA0MjAwMDgsIDB4MTA0MDAwYjAsIDB4MDAwNDI5YzAsIDB4M2MwMjA4MDAsIDB4OGM0MjI0MDAsCi0JMHgxNDQwMDAyNCwgMHgyNGM1MDAwOCwgMHg5NGMyMDAxNCwgMHgzYzAxMDgwMCwgMHhhNDIyMjNkMCwgMHg4Y2M0MDAxMCwKLQkweDAwMDQxNDAyLCAweDNjMDEwODAwLCAweGE0MjIyM2QyLCAweDNjMDEwODAwLCAweGE0MjQyM2Q0LCAweDk0YzIwMDBlLAotCTB4MzA4M2ZmZmYsIDB4MDA0MzEwMjMsIDB4M2MwMTA4MDAsIDB4YWMyMjI0MDgsIDB4OTRjMjAwMWEsIDB4M2MwMTA4MDAsCi0JMHhhYzI2MjQwMCwgMHgzYzAxMDgwMCwgMHhhYzMyMjQwNCwgMHgzYzAxMDgwMCwgMHhhYzIyMjNmYywgMHgzYzAyYzAwMCwKLQkweDAyNDIxODI1LCAweGFmNjM1YzljLCAweDhmNjI1YzkwLCAweDMwNDIwMDAyLCAweDEwNDAwMGU1LCAweDAwMDAwMDAwLAotCTB4YWY2MzVjOWMsIDB4OGY2MjVjOTAsIDB4MzA0MjAwMDIsIDB4MTA0MDAwZTAsIDB4MDAwMDAwMDAsIDB4MGEwMDAyNDYsCi0JMHgwMDAwMDAwMCwgMHg5NGMyMDAwZSwgMHgzYzAzMDgwMCwgMHg5NDYzMjNkNCwgMHgwMDQzNDAyMywgMHgzMTAzZmZmZiwKLQkweDJjNjIwMDA4LCAweDEwNDAwMDFjLCAweDAwMDAwMDAwLCAweDk0YzIwMDE0LCAweDI0NDIwMDI4LCAweDAwYTIyODIxLAotCTB4MDAwMzEwNDIsIDB4MTg0MDAwMGIsIDB4MDAwMDIwMjEsIDB4MjRlNjA4NDgsIDB4MDA0MDM4MjEsIDB4OTRhMzAwMDAsCi0JMHg4Y2MyMDAwMCwgMHgyNDg0MDAwMSwgMHgwMDQzMTAyMSwgMHhhY2MyMDAwMCwgMHgwMDg3MTAyYSwgMHgxNDQwZmZmOSwKLQkweDI0YTUwMDAyLCAweDMxMDIwMDAxLCAweDEwNDAwMDFmLCAweDNjMDI0MDAwLCAweDNjMDQwODAwLCAweDI0ODQyM2ZjLAotCTB4YTBhMDAwMDEsIDB4OTRhMzAwMDAsIDB4OGM4MjAwMDAsIDB4MDA0MzEwMjEsIDB4MGEwMDAyODUsIDB4YWM4MjAwMDAsCi0JMHg4ZjYyNjgwMCwgMHgzYzAzMDAxMCwgMHgwMDQzMTAyNCwgMHgxMDQwMDAwOSwgMHgwMDAwMDAwMCwgMHg5NGMyMDAxYSwKLQkweDNjMDMwODAwLCAweDhjNjMyM2ZjLCAweDAwNDMxMDIxLCAweDNjMDEwODAwLCAweGFjMjIyM2ZjLCAweDBhMDAwMjg2LAotCTB4M2MwMjQwMDAsIDB4OTRjMjAwMWEsIDB4OTRjNDAwMWMsIDB4M2MwMzA4MDAsIDB4OGM2MzIzZmMsIDB4MDA0NDEwMjMsCi0JMHgwMDYyMTgyMSwgMHgzYzAxMDgwMCwgMHhhYzIzMjNmYywgMHgzYzAyNDAwMCwgMHgwMjQyMTgyNSwgMHhhZjYzNWM5YywKLQkweDhmNjI1YzkwLCAweDMwNDIwMDAyLCAweDE0NDBmZmZjLCAweDAwMDAwMDAwLCAweDk1MjIwMDBhLCAweDMwNDIwMDEwLAotCTB4MTA0MDAwOWIsIDB4MDAwMDAwMDAsIDB4M2MwMzA4MDAsIDB4OTQ2MzIzZDQsIDB4M2MwNzA4MDAsIDB4MjRlNzI0MDAsCi0JMHg4Y2U0MDAwMCwgMHg4ZjYyNjgwMCwgMHgyNDYzMDAzMCwgMHgwMDgzMjgyMSwgMHgzYzAzMDAxMCwgMHgwMDQzMTAyNCwKLQkweDE0NDAwMDBhLCAweDAwMDAwMDAwLCAweDk0YTIwMDA0LCAweDNjMDQwODAwLCAweDhjODQyNDA4LCAweDNjMDMwODAwLAotCTB4OGM2MzIzZmMsIDB4MDA0NDEwMjMsIDB4MDA2MjE4MjEsIDB4M2MwMTA4MDAsIDB4YWMyMzIzZmMsIDB4M2MwNDA4MDAsCi0JMHg4Yzg0MjNmYywgMHgwMDA0MWMwMiwgMHgzMDgyZmZmZiwgMHgwMDYyMjAyMSwgMHgwMDA0MTQwMiwgMHgwMDgyMjAyMSwKLQkweDAwMDQxMDI3LCAweGE0YTIwMDA2LCAweDNjMDMwODAwLCAweDhjNjMyNDA0LCAweDNjMDIwMGZmLCAweDM0NDJmZmY4LAotCTB4MDA2Mjg4MjQsIDB4OTYyMjAwMDgsIDB4MjQwNTAwMDEsIDB4MjQwMzQwMDAsIDB4MDAwMjMxYzAsIDB4MDA4MDEwMjEsCi0JMHhhNGMyMDAxYSwgMHhhNGMwMDAxYywgMHhhY2UwMDAwMCwgMHgzYzAxMDgwMCwgMHhhYzI1MWI2MCwgMHhhZjYzNWNiOCwKLQkweDhmNjI1Y2IwLCAweDMwNDIwMDAyLCAweDEwNDAwMDAzLCAweDAwMDAwMDAwLCAweDNjMDEwODAwLCAweGFjMjAxYjYwLAotCTB4OGUyMjAwMDgsIDB4YWY2MjVjYjgsIDB4OGY2MjVjYjAsIDB4MzA0MjAwMDIsIDB4MTA0MDAwMDMsIDB4MDAwMDAwMDAsCi0JMHgzYzAxMDgwMCwgMHhhYzIwMWI2MCwgMHgzYzAyMDgwMCwgMHg4YzQyMWI2MCwgMHgxMDQwZmZlYywgMHgwMDAwMDAwMCwKLQkweDNjMDQwODAwLCAweDBlMDAwNjNiLCAweDhjODQyNDA0LCAweDBhMDAwMzJhLCAweDAwMDAwMDAwLCAweDNjMDMwODAwLAotCTB4OTA2MzFiOTgsIDB4MjQwMjAwMDIsIDB4MTQ2MjAwMDMsIDB4M2MwMzRiNjUsIDB4MGEwMDAyZTEsIDB4MDAwMDgwMjEsCi0JMHg4ZTIyMDAxYywgMHgzNDYzNzY1NCwgMHgxMDQzMDAwMiwgMHgyNDEwMDAwMiwgMHgyNDEwMDAwMSwgMHgwMGMwMjAyMSwKLQkweDBlMDAwMzUwLCAweDAyMDAzMDIxLCAweDI0MDIwMDAzLCAweDNjMDEwODAwLCAweGEwMjIxYjk4LCAweDI0MDIwMDAyLAotCTB4MTIwMjAwMGEsIDB4MjQwMjAwMDEsIDB4M2MwMzA4MDAsIDB4OGM2MzIzZjAsIDB4MTA2MjAwMDYsIDB4MDAwMDAwMDAsCi0JMHgzYzAyMDgwMCwgMHg5NDQyMjNkOCwgMHgwMDAyMTQwMCwgMHgwYTAwMDMxZiwgMHhhZTIyMDAxNCwgMHgzYzA0MDgwMCwKLQkweDI0ODQyM2RhLCAweDk0ODIwMDAwLCAweDAwMDIxNDAwLCAweGFlMjIwMDE0LCAweDNjMDIwODAwLCAweDhjNDIxYmJjLAotCTB4M2MwM2MwMDAsIDB4M2MwMTA4MDAsIDB4YTAyMDFiOTgsIDB4MDA0MzEwMjUsIDB4YWY2MjVjNWMsIDB4OGY2MjVjNTAsCi0JMHgzMDQyMDAwMiwgMHgxMDQwMDAwOSwgMHgwMDAwMDAwMCwgMHgyNDg0ZjdlMiwgMHg4YzgyMDAwMCwgMHgwMDQzMTAyNSwKLQkweGFmNjI1YzVjLCAweDhmNjI1YzUwLCAweDMwNDIwMDAyLCAweDE0NDBmZmZhLCAweDAwMDAwMDAwLCAweDNjMDIwODAwLAotCTB4MjQ0MjFiODQsIDB4OGM0MzAwMDAsIDB4MjQ2MzAwMDEsIDB4YWM0MzAwMDAsIDB4OGY2MzBjMTQsIDB4MzA2MzAwMGYsCi0JMHgyYzYyMDAwMiwgMHgxNDQwMDAwYywgMHgzYzAyNDAwMCwgMHg4ZjYzMGMxNCwgMHgzYzAyMDgwMCwgMHg4YzQyMWI0MCwKLQkweDMwNjMwMDBmLCAweDI0NDIwMDAxLCAweDNjMDEwODAwLCAweGFjMjIxYjQwLCAweDJjNjIwMDAyLCAweDEwNDBmZmY3LAotCTB4MDAwMDAwMDAsIDB4M2MwMjQwMDAsIDB4MDI0MjE4MjUsIDB4YWY2MzVjOWMsIDB4OGY2MjVjOTAsIDB4MzA0MjAwMDIsCi0JMHgxNDQwZmZmYywgMHgwMDAwMDAwMCwgMHgxMjYwMDAwMywgMHgwMDAwMDAwMCwgMHgwZTAwMDRjMCwgMHgwMDAwMDAwMCwKLQkweDhmYmYwMDI4LCAweDhmYjMwMDI0LCAweDhmYjIwMDIwLCAweDhmYjEwMDFjLCAweDhmYjAwMDE4LCAweDAzZTAwMDA4LAotCTB4MjdiZDAwMzAsIDB4OGY2MzQ0NTAsIDB4M2MwNDA4MDAsIDB4MjQ4NDFiODgsIDB4OGM4MjAwMDAsIDB4MDAwMzFjMDIsCi0JMHgwMDQzMTAyYiwgMHgxNDQwMDAwNywgMHgzYzAzODAwMCwgMHg4Yzg0MDAwNCwgMHg4ZjYyNDQ1MCwgMHgwMDAyMWMwMiwKLQkweDAwODMxMDJiLCAweDEwNDBmZmZjLCAweDNjMDM4MDAwLCAweGFmNjM0NDQ0LCAweDhmNjI0NDQ0LCAweDAwNDMxMDI0LAotCTB4MTQ0MGZmZmQsIDB4MDAwMDAwMDAsIDB4OGY2MjQ0NDgsIDB4MDNlMDAwMDgsIDB4MzA0MmZmZmYsIDB4M2MwMjQwMDAsCi0JMHgwMDgyMjAyNSwgMHhhZjY0NWMzOCwgMHg4ZjYyNWMzMCwgMHgzMDQyMDAwMiwgMHgxNDQwZmZmYywgMHgwMDAwMDAwMCwKLQkweDAzZTAwMDA4LCAweDAwMDAwMDAwLCAweDI3YmRmZmUwLCAweDAwODA1ODIxLCAweDE0YzAwMDExLCAweDI1NmUwMDA4LAotCTB4M2MwMjA4MDAsIDB4OGM0MjIzZjQsIDB4MTA0MDAwMDcsIDB4MjQwMjAwMTYsIDB4M2MwMTA4MDAsIDB4YTQyMjIzZDIsCi0JMHgyNDAyMDAyYSwgMHgzYzAxMDgwMCwgMHgwYTAwMDM2NCwgMHhhNDIyMjNkNCwgMHg4ZDY3MDAxMCwgMHgwMDA3MTQwMiwKLQkweDNjMDEwODAwLCAweGE0MjIyM2QyLCAweDNjMDEwODAwLCAweGE0MjcyM2Q0LCAweDNjMDQwODAwLCAweDk0ODQyM2Q0LAotCTB4M2MwMzA4MDAsIDB4OTQ2MzIzZDIsIDB4OTVjZjAwMDYsIDB4M2MwMjA4MDAsIDB4OTQ0MjIzZDAsIDB4MDA4MzIwMjMsCi0JMHgwMWUyYzAyMywgMHgzMDY1ZmZmZiwgMHgyNGEyMDAyOCwgMHgwMWMyNDgyMSwgMHgzMDgyZmZmZiwgMHgxNGMwMDAxYSwKLQkweDAxMjI2MDIxLCAweDk1ODIwMDBjLCAweDMwNDIwMDNmLCAweDNjMDEwODAwLCAweGE0MjIyM2Q2LCAweDk1ODIwMDA0LAotCTB4OTU4MzAwMDYsIDB4M2MwMTA4MDAsIDB4YWMyMDIzZTQsIDB4M2MwMTA4MDAsIDB4YWMyMDIzZTgsIDB4MDAwMjE0MDAsCi0JMHgwMDQzMTAyNSwgMHgzYzAxMDgwMCwgMHhhYzIyMWJjMCwgMHg5NTIyMDAwNCwgMHgzYzAxMDgwMCwgMHhhNDIyMWJjNCwKLQkweDk1MjMwMDAyLCAweDAxZTUxMDIzLCAweDAwNDMxMDJhLCAweDEwNDAwMDEwLCAweDI0MDIwMDAxLCAweDNjMDEwODAwLAotCTB4MGEwMDAzOTgsIDB4YWMyMjIzZjgsIDB4M2MwMzA4MDAsIDB4OGM2MzIzZTgsIDB4M2MwMjA4MDAsIDB4OTQ0MjFiYzQsCi0JMHgwMDQzMTAyMSwgMHhhNTIyMDAwNCwgMHgzYzAyMDgwMCwgMHg5NDQyMWJjMCwgMHhhNTgyMDAwNCwgMHgzYzAyMDgwMCwKLQkweDhjNDIxYmMwLCAweGE1ODIwMDA2LCAweDNjMDIwODAwLCAweDhjNDIyM2YwLCAweDNjMGQwODAwLCAweDhkYWQyM2U0LAotCTB4M2MwYTA4MDAsIDB4MTQ0MDAwZTUsIDB4OGQ0YTIzZTgsIDB4M2MwMjA4MDAsIDB4OTQ0MjFiYzQsIDB4MDA0YTE4MjEsCi0JMHgzMDYzZmZmZiwgMHgwMDYyMTgyYiwgMHgyNDAyMDAwMiwgMHgxMGMyMDAwZCwgMHgwMTQzNTAyMywgMHgzYzAyMDgwMCwKLQkweDk0NDIyM2Q2LCAweDMwNDIwMDA5LCAweDEwNDAwMDA4LCAweDAwMDAwMDAwLCAweDk1ODIwMDBjLCAweDMwNDJmZmY2LAotCTB4YTU4MjAwMGMsIDB4M2MwMjA4MDAsIDB4OTQ0MjIzZDYsIDB4MzA0MjAwMDksIDB4MDFhMjY4MjMsIDB4M2MwMjA4MDAsCi0JMHg4YzQyMjNmOCwgMHgxMDQwMDA0YSwgMHgwMTIwMzgyMSwgMHgzYzAyMDgwMCwgMHg5NDQyMjNkMiwgMHgwMDAwNDAyMSwKLQkweGE1MjAwMDBhLCAweDAxZTIxMDIzLCAweGE1MjIwMDAyLCAweDMwODJmZmZmLCAweDAwMDIxMDQyLCAweDE4NDAwMDA4LAotCTB4MDAwMDMwMjEsIDB4MDA0MDE4MjEsIDB4OTRlMjAwMDAsIDB4MjUwODAwMDEsIDB4MDBjMjMwMjEsIDB4MDEwMzEwMmEsCi0JMHgxNDQwZmZmYiwgMHgyNGU3MDAwMiwgMHgwMDA2MWMwMiwgMHgzMGMyZmZmZiwgMHgwMDYyMzAyMSwgMHgwMDA2MTQwMiwKLQkweDAwYzIzMDIxLCAweDAwYzAyODIxLCAweDAwMDYxMDI3LCAweGE1MjIwMDBhLCAweDAwMDAzMDIxLCAweDI1MjcwMDBjLAotCTB4MDAwMDQwMjEsIDB4OTRlMjAwMDAsIDB4MjUwODAwMDEsIDB4MDBjMjMwMjEsIDB4MmQwMjAwMDQsIDB4MTQ0MGZmZmIsCi0JMHgyNGU3MDAwMiwgMHg5NTIyMDAwMiwgMHgwMDAwNDAyMSwgMHg5MTIzMDAwOSwgMHgwMDQ0MjAyMywgMHgwMTgwMzgyMSwKLQkweDMwODJmZmZmLCAweGE0ZTAwMDEwLCAweDAwNjIxODIxLCAweDAwMDIxMDQyLCAweDE4NDAwMDEwLCAweDAwYzMzMDIxLAotCTB4MDA0MDQ4MjEsIDB4OTRlMjAwMDAsIDB4MjRlNzAwMDIsIDB4MDBjMjMwMjEsIDB4MzBlMjAwN2YsIDB4MTQ0MDAwMDYsCi0JMHgyNTA4MDAwMSwgMHg4ZDYzMDAwMCwgMHgzYzAyMDA3ZiwgMHgzNDQyZmY4MCwgMHgwMDYyNTgyNCwgMHgyNTY3MDAwOCwKLQkweDAxMDkxMDJhLCAweDE0NDBmZmYzLCAweDAwMDAwMDAwLCAweDMwODIwMDAxLCAweDEwNDAwMDA1LCAweDAwMDYxYzAyLAotCTB4YTBlMDAwMDEsIDB4OTRlMjAwMDAsIDB4MDBjMjMwMjEsIDB4MDAwNjFjMDIsIDB4MzBjMmZmZmYsIDB4MDA2MjMwMjEsCi0JMHgwMDA2MTQwMiwgMHgwMGMyMzAyMSwgMHgwYTAwMDQ3ZCwgMHgzMGM2ZmZmZiwgMHgyNDAyMDAwMiwgMHgxNGMyMDA4MSwKLQkweDAwMDAwMDAwLCAweDNjMDIwODAwLCAweDhjNDIyNDBjLCAweDE0NDAwMDA3LCAweDAwMDAwMDAwLCAweDNjMDIwODAwLAotCTB4OTQ0MjIzZDIsIDB4OTUyMzAwMDIsIDB4MDFlMjEwMjMsIDB4MTA2MjAwNzcsIDB4MDAwMDAwMDAsIDB4M2MwMjA4MDAsCi0JMHg5NDQyMjNkMiwgMHgwMWUyMTAyMywgMHhhNTIyMDAwMiwgMHgzYzAyMDgwMCwgMHg4YzQyMjQwYywgMHgxMDQwMDAxYSwKLQkweDMxZTNmZmZmLCAweDhkYzcwMDEwLCAweDNjMDIwODAwLCAweDk0NDIxYjk2LCAweDAwZTA0MDIxLCAweDAwMDcyYzAyLAotCTB4MDBhYTIwMjEsIDB4MDA0MzEwMjMsIDB4MDA4MjM4MjMsIDB4MDAwNzI0MDIsIDB4MzBlMmZmZmYsIDB4MDA4MjM4MjEsCi0JMHgwMDA3MTAyNywgMHhhNTIyMDAwYSwgMHgzMTAyZmZmZiwgMHgzYzA0MDgwMCwgMHg5NDg0MjNkNCwgMHgwMDQ1MzAyMywKLQkweDAwZTAyODIxLCAweDAwNjQxODIzLCAweDAwNmQxODIxLCAweDAwYzMzMDIxLCAweDAwMDYxYzAyLCAweDMwYzJmZmZmLAotCTB4MGEwMDA0N2QsIDB4MDA2MjMwMjEsIDB4MDEyMDM4MjEsIDB4MDAwMDQwMjEsIDB4MzA4MmZmZmYsIDB4MDAwMjEwNDIsCi0JMHgxODQwMDAwOCwgMHgwMDAwMzAyMSwgMHgwMDQwMTgyMSwgMHg5NGUyMDAwMCwgMHgyNTA4MDAwMSwgMHgwMGMyMzAyMSwKLQkweDAxMDMxMDJhLCAweDE0NDBmZmZiLCAweDI0ZTcwMDAyLCAweDAwMDYxYzAyLCAweDMwYzJmZmZmLCAweDAwNjIzMDIxLAotCTB4MDAwNjE0MDIsIDB4MDBjMjMwMjEsIDB4MDBjMDI4MjEsIDB4MDAwNjEwMjcsIDB4YTUyMjAwMGEsIDB4MDAwMDMwMjEsCi0JMHgyNTI3MDAwYywgMHgwMDAwNDAyMSwgMHg5NGUyMDAwMCwgMHgyNTA4MDAwMSwgMHgwMGMyMzAyMSwgMHgyZDAyMDAwNCwKLQkweDE0NDBmZmZiLCAweDI0ZTcwMDAyLCAweDk1MjIwMDAyLCAweDAwMDA0MDIxLCAweDkxMjMwMDA5LCAweDAwNDQyMDIzLAotCTB4MDE4MDM4MjEsIDB4MzA4MmZmZmYsIDB4YTRlMDAwMTAsIDB4M2MwNDA4MDAsIDB4OTQ4NDIzZDQsIDB4MDA2MjE4MjEsCi0JMHgwMGMzMzAyMSwgMHgwMDA2MWMwMiwgMHgzMGMyZmZmZiwgMHgwMDYyMzAyMSwgMHgwMDA2MWMwMiwgMHgzYzAyMDgwMCwKLQkweDk0NDIyM2QwLCAweDAwYzM0ODIxLCAweDAwNDQxMDIzLCAweDAwMDIxZmMyLCAweDAwNDMxMDIxLCAweDAwMDIxMDQzLAotCTB4MTg0MDAwMTAsIDB4MDAwMDMwMjEsIDB4MDA0MDIwMjEsIDB4OTRlMjAwMDAsIDB4MjRlNzAwMDIsIDB4MDBjMjMwMjEsCi0JMHgzMGUyMDA3ZiwgMHgxNDQwMDAwNiwgMHgyNTA4MDAwMSwgMHg4ZDYzMDAwMCwgMHgzYzAyMDA3ZiwgMHgzNDQyZmY4MCwKLQkweDAwNjI1ODI0LCAweDI1NjcwMDA4LCAweDAxMDQxMDJhLCAweDE0NDBmZmYzLCAweDAwMDAwMDAwLCAweDNjMDIwODAwLAotCTB4OTQ0MjIzZWMsIDB4MDBjMjMwMjEsIDB4MzEyMmZmZmYsIDB4MDBjMjMwMjEsIDB4MDAwNjFjMDIsIDB4MzBjMmZmZmYsCi0JMHgwMDYyMzAyMSwgMHgwMDA2MTQwMiwgMHgwMGMyMzAyMSwgMHgwMGMwNDAyMSwgMHgwMDA2MTAyNywgMHhhNTgyMDAxMCwKLQkweGFkYzAwMDE0LCAweDBhMDAwNDlkLCAweGFkYzAwMDAwLCAweDhkYzcwMDEwLCAweDAwZTA0MDIxLCAweDExNDAwMDA3LAotCTB4MDAwNzJjMDIsIDB4MDBhYTMwMjEsIDB4MDAwNjE0MDIsIDB4MzBjM2ZmZmYsIDB4MDA0MzMwMjEsIDB4MDAwNjE0MDIsCi0JMHgwMGMyMjgyMSwgMHgwMDA1MTAyNywgMHhhNTIyMDAwYSwgMHgzYzAzMDgwMCwgMHg5NDYzMjNkNCwgMHgzMTAyZmZmZiwKLQkweDAxZTIxMDIxLCAweDAwNDMzMDIzLCAweDAwY2QzMDIxLCAweDAwMDYxYzAyLCAweDMwYzJmZmZmLCAweDAwNjIzMDIxLAotCTB4MDAwNjE0MDIsIDB4MDBjMjMwMjEsIDB4MDBjMDQwMjEsIDB4MDAwNjEwMjcsIDB4YTU4MjAwMTAsIDB4MzEwMmZmZmYsCi0JMHgwMDA1MWMwMCwgMHgwMDQzMTAyNSwgMHhhZGMyMDAxMCwgMHgzYzAyMDgwMCwgMHg4YzQyMjNmNCwgMHgxMDQwMDAwNSwKLQkweDJkZTIwNWViLCAweDE0NDAwMDAyLCAweDI1ZTJmZmYyLCAweDM0MDI4ODcwLCAweGE1YzIwMDM0LCAweDNjMDMwODAwLAotCTB4MjQ2MzIzZTgsIDB4OGM2MjAwMDAsIDB4MjQ0MjAwMDEsIDB4YWM2MjAwMDAsIDB4M2MwNDA4MDAsIDB4OGM4NDIzZTQsCi0JMHgzYzAyMDgwMCwgMHg4YzQyMWJjMCwgMHgzMzAzZmZmZiwgMHgwMDgzMjAyMSwgMHgwMDQzMTgyMSwgMHgwMDYyMTAyYiwKLQkweDNjMDEwODAwLCAweGFjMjQyM2U0LCAweDEwNDAwMDAzLCAweDI0ODJmZmZmLCAweDNjMDEwODAwLCAweGFjMjIyM2U0LAotCTB4M2MwMTA4MDAsIDB4YWMyMzFiYzAsIDB4MDNlMDAwMDgsIDB4MjdiZDAwMjAsIDB4MjdiZGZmYjgsIDB4M2MwNTA4MDAsCi0JMHgyNGE1MWI5NiwgMHhhZmJmMDA0NCwgMHhhZmJlMDA0MCwgMHhhZmI3MDAzYywgMHhhZmI2MDAzOCwgMHhhZmI1MDAzNCwKLQkweGFmYjQwMDMwLCAweGFmYjMwMDJjLCAweGFmYjIwMDI4LCAweGFmYjEwMDI0LCAweGFmYjAwMDIwLCAweDk0YTkwMDAwLAotCTB4M2MwMjA4MDAsIDB4OTQ0MjIzZDAsIDB4M2MwMzA4MDAsIDB4OGM2MzFiYjAsIDB4M2MwNDA4MDAsIDB4OGM4NDFiYWMsCi0JMHgwMTIyMTAyMywgMHgwMDY0MTgyYSwgMHhhN2E5MDAxZSwgMHgxMDYwMDBiZSwgMHhhN2EyMDAxNiwgMHgyNGJlMDAyMiwKLQkweDk3YjYwMDFlLCAweDI0YjMwMDFhLCAweDI0YjcwMDE2LCAweDhmYzIwMDAwLCAweDE0NDAwMDA4LCAweDAwMDAwMDAwLAotCTB4OGZjMmZmZjgsIDB4OTdhMzAwMTYsIDB4OGZjNGZmZjQsIDB4MDA0MzEwMjEsIDB4MDA4MjIwMmEsIDB4MTQ4MDAwYjAsCi0JMHgwMDAwMDAwMCwgMHg5N2Q1MDgxOCwgMHgzMmEyZmZmZiwgMHgxMDQwMDBhMywgMHgwMDAwOTAyMSwgMHgwMDQwYTAyMSwKLQkweDAwMDA4ODIxLCAweDBlMDAwNjI1LCAweDAwMDAwMDAwLCAweDAwNDAzMDIxLCAweDE0YzAwMDA3LCAweDAwMDAwMDAwLAotCTB4M2MwMjA4MDAsIDB4OGM0MjIzZGMsIDB4MjQ0MjAwMDEsIDB4M2MwMTA4MDAsIDB4MGEwMDA1OTYsIDB4YWMyMjIzZGMsCi0JMHgzYzEwMDgwMCwgMHgwMjExODAyMSwgMHg4ZTEwMWJjOCwgMHg5NjA4MDAwYSwgMHgzMTAyMDA0MCwgMHgxMDQwMDAwNSwKLQkweDI0MDcxODBjLCAweDhlMDIwMDBjLCAweDI0MDcxODhjLCAweDAwMDIxNDAwLCAweGFjYzIwMDE4LCAweDMxMDIwMDgwLAotCTB4NTQ0MDAwMDEsIDB4MzRlNzAwMTAsIDB4M2MwMjA4MDAsIDB4MDA1MTEwMjEsIDB4OGM0MjFiZDAsIDB4M2MwMzA4MDAsCi0JMHgwMDcxMTgyMSwgMHg4YzYzMWJkNCwgMHgwMDAyMTUwMCwgMHgwMDAzMWMwMCwgMHgwMDQzMTAyNSwgMHhhY2MyMDAxNCwKLQkweDk2MDQwMDA4LCAweDMyNDJmZmZmLCAweDAwODIxMDIxLCAweDAyODIxMDJhLCAweDE0NDAwMDAyLCAweDAyYjIyODIzLAotCTB4MDA4MDI4MjEsIDB4OGUwMjAwMDAsIDB4MDI0NTkwMjEsIDB4YWNjMjAwMDAsIDB4OGUwMjAwMDQsIDB4MDBjMDIwMjEsCi0JMHgyNjMxMDAxMCwgMHhhYzgyMDAwNCwgMHgzMGUyZmZmZiwgMHhhYzgwMDAwOCwgMHhhNDg1MDAwZSwgMHhhYzgyMDAxMCwKLQkweDI0MDIwMzA1LCAweDBlMDAwNWEyLCAweGE0ODIwMDBjLCAweDMyNDJmZmZmLCAweDAwNTQxMDJiLCAweDE0NDBmZmM1LAotCTB4MzI0MmZmZmYsIDB4MGEwMDA1OGUsIDB4MDAwMDAwMDAsIDB4OGU2MjAwMDAsIDB4OGU2M2ZmZmMsIDB4MDA0MzEwMmEsCi0JMHgxMDQwMDA2NywgMHgwMDAwMDAwMCwgMHg4ZTYyZmZmMCwgMHgwMDAyODkwMCwgMHgzYzEwMDgwMCwgMHgwMjExODAyMSwKLQkweDBlMDAwNjI1LCAweDhlMTAxYmM4LCAweDAwNDAzMDIxLCAweDE0YzAwMDA1LCAweDAwMDAwMDAwLCAweDhlNjIwODJjLAotCTB4MjQ0MjAwMDEsIDB4MGEwMDA1OTYsIDB4YWU2MjA4MmMsIDB4OTYwODAwMGEsIDB4MzEwMjAwNDAsIDB4MTA0MDAwMDUsCi0JMHgyNDA3MTgwYywgMHg4ZTAyMDAwYywgMHgyNDA3MTg4YywgMHgwMDAyMTQwMCwgMHhhY2MyMDAxOCwgMHgzYzAyMDgwMCwKLQkweDAwNTExMDIxLCAweDhjNDIxYmQwLCAweDNjMDMwODAwLCAweDAwNzExODIxLCAweDhjNjMxYmQ0LCAweDAwMDIxNTAwLAotCTB4MDAwMzFjMDAsIDB4MDA0MzEwMjUsIDB4YWNjMjAwMTQsIDB4OGU2M2ZmZjQsIDB4OTYwMjAwMDgsIDB4MDA0MzIwMjMsCi0JMHgzMjQyZmZmZiwgMHgzMDgzZmZmZiwgMHgwMDQzMTAyMSwgMHgwMmMyMTAyYSwgMHgxMDQwMDAwMywgMHgwMDgwMjgyMSwKLQkweDk3YTkwMDFlLCAweDAxMzIyODIzLCAweDhlNjIwMDAwLCAweDMwYTRmZmZmLCAweDAwNDQxMDIxLCAweGFlNjIwMDAwLAotCTB4YTRjNTAwMGUsIDB4OGUwMjAwMDAsIDB4YWNjMjAwMDAsIDB4OGUwMjAwMDQsIDB4OGU2M2ZmZjQsIDB4MDA0MzEwMjEsCi0JMHhhY2MyMDAwNCwgMHg4ZTYzZmZmNCwgMHg5NjAyMDAwOCwgMHgwMDY0MTgyMSwgMHgwMDYyMTAyYSwgMHgxNDQwMDAwNiwKLQkweDAyNDU5MDIxLCAweDhlNjJmZmYwLCAweGFlNjBmZmY0LCAweDI0NDIwMDAxLCAweDBhMDAwNTcxLCAweGFlNjJmZmYwLAotCTB4YWU2M2ZmZjQsIDB4YWNjMDAwMDgsIDB4MzI0MmZmZmYsIDB4MTA1NjAwMDMsIDB4MzEwMjAwMDQsIDB4MTA0MDAwMDYsCi0JMHgyNDAyMDMwNSwgMHgzMTAyMDA4MCwgMHg1NDQwMDAwMSwgMHgzNGU3MDAxMCwgMHgzNGU3MDAyMCwgMHgyNDAyMDkwNSwKLQkweGE0YzIwMDBjLCAweDhlZTMwMDAwLCAweDhlZTIwMDA0LCAweDE0NjIwMDA3LCAweDNjMDJiNDlhLCAweDhlZTIwODYwLAotCTB4NTQ0MDAwMDEsIDB4MzRlNzA0MDAsIDB4M2MwMjRiNjUsIDB4MGEwMDA1ODgsIDB4MzQ0Mjc2NTQsIDB4MzQ0Mjg5YWIsCi0JMHhhY2MyMDAxYywgMHgzMGUyZmZmZiwgMHhhY2MyMDAxMCwgMHgwZTAwMDVhMiwgMHgwMGMwMjAyMSwgMHgzMjQyZmZmZiwKLQkweDAwNTYxMDJiLCAweDE0NDBmZjliLCAweDAwMDAwMDAwLCAweDhlNjIwMDAwLCAweDhlNjNmZmZjLCAweDAwNDMxMDJhLAotCTB4MTQ0MGZmNDgsIDB4MDAwMDAwMDAsIDB4OGZiZjAwNDQsIDB4OGZiZTAwNDAsIDB4OGZiNzAwM2MsIDB4OGZiNjAwMzgsCi0JMHg4ZmI1MDAzNCwgMHg4ZmI0MDAzMCwgMHg4ZmIzMDAyYywgMHg4ZmIyMDAyOCwgMHg4ZmIxMDAyNCwgMHg4ZmIwMDAyMCwKLQkweDAzZTAwMDA4LCAweDI3YmQwMDQ4LCAweDI3YmRmZmU4LCAweGFmYmYwMDE0LCAweGFmYjAwMDEwLCAweDhmNjI0NDUwLAotCTB4OGY2MzQ0MTAsIDB4MGEwMDA1YjEsIDB4MDA4MDgwMjEsIDB4OGY2MjY4MjAsIDB4MzA0MjIwMDAsIDB4MTA0MDAwMDMsCi0JMHgwMDAwMDAwMCwgMHgwZTAwMDFmMCwgMHgwMDAwMjAyMSwgMHg4ZjYyNDQ1MCwgMHg4ZjYzNDQxMCwgMHgzMDQyZmZmZiwKLQkweDAwNDMxMDJiLCAweDE0NDBmZmY1LCAweDAwMDAwMDAwLCAweDhmNjMwYzE0LCAweDMwNjMwMDBmLCAweDJjNjIwMDAyLAotCTB4MTQ0MDAwMGIsIDB4MDAwMDAwMDAsIDB4OGY2MzBjMTQsIDB4M2MwMjA4MDAsIDB4OGM0MjFiNDAsIDB4MzA2MzAwMGYsCi0JMHgyNDQyMDAwMSwgMHgzYzAxMDgwMCwgMHhhYzIyMWI0MCwgMHgyYzYyMDAwMiwgMHgxMDQwZmZmNywgMHgwMDAwMDAwMCwKLQkweGFmNzA1YzE4LCAweDhmNjI1YzEwLCAweDMwNDIwMDAyLCAweDEwNDAwMDA5LCAweDAwMDAwMDAwLCAweDhmNjI2ODIwLAotCTB4MzA0MjIwMDAsIDB4MTA0MGZmZjgsIDB4MDAwMDAwMDAsIDB4MGUwMDAxZjAsIDB4MDAwMDIwMjEsIDB4MGEwMDA1YzQsCi0JMHgwMDAwMDAwMCwgMHg4ZmJmMDAxNCwgMHg4ZmIwMDAxMCwgMHgwM2UwMDAwOCwgMHgyN2JkMDAxOCwgMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDI3YmRmZmU4LCAweDNjMWJjMDAwLCAweGFmYmYwMDE0LCAweGFmYjAwMDEwLAotCTB4YWY2MDY4MGMsIDB4OGY2MjY4MDQsIDB4MzQ0MjAwODIsIDB4YWY2MjY4MDQsIDB4OGY2MzQwMDAsIDB4MjQwMjBiNTAsCi0JMHgzYzAxMDgwMCwgMHhhYzIyMWI1NCwgMHgyNDAyMGI3OCwgMHgzYzAxMDgwMCwgMHhhYzIyMWI2NCwgMHgzNDYzMDAwMiwKLQkweGFmNjM0MDAwLCAweDBlMDAwNjA1LCAweDAwODA4MDIxLCAweDNjMDEwODAwLCAweGEwMjIxYjY4LCAweDMwNDIwMGZmLAotCTB4MjQwMzAwMDIsIDB4MTQ0MzAwMDUsIDB4MDAwMDAwMDAsIDB4M2MwMjA4MDAsIDB4OGM0MjFiNTQsIDB4MGEwMDA1ZjgsCi0JMHhhYzUwMDBjMCwgMHgzYzAyMDgwMCwgMHg4YzQyMWI1NCwgMHhhYzUwMDBiYywgMHg4ZjYyNDQzNCwgMHg4ZjYzNDQzOCwKLQkweDhmNjQ0NDEwLCAweDNjMDEwODAwLCAweGFjMjIxYjVjLCAweDNjMDEwODAwLCAweGFjMjMxYjZjLCAweDNjMDEwODAwLAotCTB4YWMyNDFiNTgsIDB4OGZiZjAwMTQsIDB4OGZiMDAwMTAsIDB4MDNlMDAwMDgsIDB4MjdiZDAwMTgsIDB4M2MwNDA4MDAsCi0JMHg4Yzg3MDAwMCwgMHgzYzAzYWE1NSwgMHgzNDYzYWE1NSwgMHgzYzA2YzAwMywgMHhhYzgzMDAwMCwgMHg4Y2MyMDAwMCwKLQkweDE0NDMwMDA3LCAweDI0MDUwMDAyLCAweDNjMDM1NWFhLCAweDM0NjM1NWFhLCAweGFjODMwMDAwLCAweDhjYzIwMDAwLAotCTB4NTA0MzAwMDEsIDB4MjQwNTAwMDEsIDB4M2MwMjA4MDAsIDB4YWM0NzAwMDAsIDB4MDNlMDAwMDgsIDB4MDBhMDEwMjEsCi0JMHgyN2JkZmZmOCwgMHgxODgwMDAwOSwgMHgwMDAwMjgyMSwgMHg4ZjYzNjgwYywgMHg4ZjYyNjgwYywgMHgxMDQzZmZmZSwKLQkweDAwMDAwMDAwLCAweDI0YTUwMDAxLCAweDAwYTQxMDJhLCAweDE0NDBmZmY5LCAweDAwMDAwMDAwLCAweDAzZTAwMDA4LAotCTB4MjdiZDAwMDgsIDB4OGY2MzQ0NTAsIDB4M2MwMjA4MDAsIDB4OGM0MjFiNWMsIDB4MDAwMzFjMDIsIDB4MDA0MzEwMmIsCi0JMHgxNDQwMDAwOCwgMHgzYzAzODAwMCwgMHgzYzA0MDgwMCwgMHg4Yzg0MWI2YywgMHg4ZjYyNDQ1MCwgMHgwMDAyMWMwMiwKLQkweDAwODMxMDJiLCAweDEwNDBmZmZjLCAweDNjMDM4MDAwLCAweGFmNjM0NDQ0LCAweDhmNjI0NDQ0LCAweDAwNDMxMDI0LAotCTB4MTQ0MGZmZmQsIDB4MDAwMDAwMDAsIDB4OGY2MjQ0NDgsIDB4MDNlMDAwMDgsIDB4MzA0MmZmZmYsIDB4MzA4MmZmZmYsCi0JMHgyNDQyZTAwMCwgMHgyYzQyMjAwMSwgMHgxNDQwMDAwMywgMHgzYzAyNDAwMCwgMHgwYTAwMDY0OCwgMHgyNDAyZmZmZiwKLQkweDAwODIyMDI1LCAweGFmNjQ1YzM4LCAweDhmNjI1YzMwLCAweDMwNDIwMDAyLCAweDE0NDBmZmZjLCAweDAwMDAxMDIxLAotCTB4MDNlMDAwMDgsIDB4MDAwMDAwMDAsIDB4OGY2MjQ0NTAsIDB4M2MwMzA4MDAsIDB4OGM2MzFiNTgsIDB4MGEwMDA2NTEsCi0JMHgzMDQyZmZmZiwgMHg4ZjYyNDQ1MCwgMHgzMDQyZmZmZiwgMHgwMDQzMTAyYiwgMHgxNDQwZmZmYywgMHgwMDAwMDAwMCwKLQkweDAzZTAwMDA4LCAweDAwMDAwMDAwLCAweDI3YmRmZmUwLCAweDAwODAyODIxLCAweDNjMDQwODAwLCAweDI0ODQxYWYwLAotCTB4MDAwMDMwMjEsIDB4MDAwMDM4MjEsIDB4YWZiZjAwMTgsIDB4YWZhMDAwMTAsIDB4MGUwMDA2N2MsIDB4YWZhMDAwMTQsCi0JMHgwYTAwMDY2MCwgMHgwMDAwMDAwMCwgMHg4ZmJmMDAxOCwgMHgwM2UwMDAwOCwgMHgyN2JkMDAyMCwgMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDNjMDIwODAwLCAweDM0NDIzMDAwLCAweDNjMDMwODAwLCAweDM0NjMzMDAwLAotCTB4M2MwNDA4MDAsIDB4MzQ4NDM3ZmYsIDB4M2MwMTA4MDAsIDB4YWMyMjFiNzQsIDB4MjQwMjAwNDAsIDB4M2MwMTA4MDAsCi0JMHhhYzIyMWI3OCwgMHgzYzAxMDgwMCwgMHhhYzIwMWI3MCwgMHhhYzYwMDAwMCwgMHgyNDYzMDAwNCwgMHgwMDgzMTAyYiwKLQkweDUwNDBmZmZkLCAweGFjNjAwMDAwLCAweDAzZTAwMDA4LCAweDAwMDAwMDAwLCAweDAwODA0ODIxLCAweDhmYWEwMDEwLAotCTB4M2MwMjA4MDAsIDB4OGM0MjFiNzAsIDB4M2MwNDA4MDAsIDB4OGM4NDFiNzgsIDB4OGZhYjAwMTQsIDB4MjQ0MzAwMDEsCi0JMHgwMDQ0MTAyYiwgMHgzYzAxMDgwMCwgMHhhYzIzMWI3MCwgMHgxNDQwMDAwMywgMHgwMDAwNDAyMSwgMHgzYzAxMDgwMCwKLQkweGFjMjAxYjcwLCAweDNjMDIwODAwLCAweDhjNDIxYjcwLCAweDNjMDMwODAwLCAweDhjNjMxYjc0LCAweDkxMjQwMDAwLAotCTB4MDAwMjExNDAsIDB4MDA0MzEwMjEsIDB4MDA0ODEwMjEsIDB4MjUwODAwMDEsIDB4YTA0NDAwMDAsIDB4MjkwMjAwMDgsCi0JMHgxNDQwZmZmNCwgMHgyNTI5MDAwMSwgMHgzYzAyMDgwMCwgMHg4YzQyMWI3MCwgMHgzYzAzMDgwMCwgMHg4YzYzMWI3NCwKLQkweDhmNjQ2ODBjLCAweDAwMDIxMTQwLCAweDAwNDMxMDIxLCAweGFjNDQwMDA4LCAweGFjNDUwMDBjLCAweGFjNDYwMDEwLAotCTB4YWM0NzAwMTQsIDB4YWM0YTAwMTgsIDB4MDNlMDAwMDgsIDB4YWM0YjAwMWMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCi19OwotCi1zdGF0aWMgY29uc3QgdTMyIHRnM1Rzb0Z3Um9kYXRhW10gPSB7Ci0JMHg0ZDYxNjk2ZSwgMHg0MzcwNzU0MiwgMHgwMDAwMDAwMCwgMHg0ZDYxNjk2ZSwgMHg0MzcwNzU0MSwgMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDczNzQ2YjZmLCAweDY2NjY2YzY0LCAweDQ5NmUwMDAwLCAweDczNzQ2YjZmLAotCTB4NjY2NjJhMmEsIDB4MDAwMDAwMDAsIDB4NTM3NzQ1NzYsIDB4NjU2ZTc0MzAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHg2NjYxNzQ2MSwgMHg2YzQ1NzI3MiwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotfTsKLQotc3RhdGljIGNvbnN0IHUzMiB0ZzNUc29Gd0RhdGFbXSA9IHsKLQkweDAwMDAwMDAwLCAweDczNzQ2YjZmLCAweDY2NjY2YzY0LCAweDVmNzYzMTJlLCAweDM2MmUzMDAwLCAweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLX07Ci0KIC8qIDU3MDUgbmVlZHMgYSBzcGVjaWFsIHZlcnNpb24gb2YgdGhlIFRTTyBmaXJtd2FyZS4gICovCi0jZGVmaW5lIFRHM19UU081X0ZXX1JFTEVBU0VfTUFKT1IJMHgxCi0jZGVmaW5lIFRHM19UU081X0ZXX1JFTEFTRV9NSU5PUgkweDIKLSNkZWZpbmUgVEczX1RTTzVfRldfUkVMRUFTRV9GSVgJCTB4MAotI2RlZmluZSBURzNfVFNPNV9GV19TVEFSVF9BRERSCQkweDAwMDEwMDAwCi0jZGVmaW5lIFRHM19UU081X0ZXX1RFWFRfQUREUgkJMHgwMDAxMDAwMAotI2RlZmluZSBURzNfVFNPNV9GV19URVhUX0xFTgkJMHhlOTAKLSNkZWZpbmUgVEczX1RTTzVfRldfUk9EQVRBX0FERFIJCTB4MDAwMTBlOTAKLSNkZWZpbmUgVEczX1RTTzVfRldfUk9EQVRBX0xFTgkJMHg1MAotI2RlZmluZSBURzNfVFNPNV9GV19EQVRBX0FERFIJCTB4MDAwMTBmMDAKLSNkZWZpbmUgVEczX1RTTzVfRldfREFUQV9MRU4JCTB4MjAKLSNkZWZpbmUgVEczX1RTTzVfRldfU0JTU19BRERSCQkweDAwMDEwZjIwCi0jZGVmaW5lIFRHM19UU081X0ZXX1NCU1NfTEVOCQkweDI4Ci0jZGVmaW5lIFRHM19UU081X0ZXX0JTU19BRERSCQkweDAwMDEwZjUwCi0jZGVmaW5lIFRHM19UU081X0ZXX0JTU19MRU4JCTB4ODgKLQotc3RhdGljIGNvbnN0IHUzMiB0ZzNUc281RndUZXh0WyhURzNfVFNPNV9GV19URVhUX0xFTiAvIDQpICsgMV0gPSB7Ci0JMHgwYzAwNDAwMywgMHgwMDAwMDAwMCwgMHgwMDAxMGYwNCwgMHgwMDAwMDAwMCwgMHgxMDAwMDAwMywgMHgwMDAwMDAwMCwKLQkweDAwMDAwMDBkLCAweDAwMDAwMDBkLCAweDNjMWQwMDAxLCAweDM3YmRlMDAwLCAweDAzYTBmMDIxLCAweDNjMTAwMDAxLAotCTB4MjYxMDAwMDAsIDB4MGMwMDQwMTAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMGQsIDB4MjdiZGZmZTAsIDB4M2MwNGZlZmUsCi0JMHhhZmJmMDAxOCwgMHgwYzAwNDJlOCwgMHgzNDg0MDAwMiwgMHgwYzAwNDM2NCwgMHgwMDAwMDAwMCwgMHgzYzAzMDAwMSwKLQkweDkwNjMwZjM0LCAweDI0MDIwMDAyLCAweDNjMDQwMDAxLCAweDI0ODQwZTljLCAweDE0NjIwMDAzLCAweDI0MDUwMDAxLAotCTB4M2MwNDAwMDEsIDB4MjQ4NDBlOTAsIDB4MjQwNjAwMDIsIDB4MDAwMDM4MjEsIDB4YWZhMDAwMTAsIDB4MGMwMDQzNzgsCi0JMHhhZmEwMDAxNCwgMHgwYzAwNDAyYywgMHgwMDAwMDAwMCwgMHg4ZmJmMDAxOCwgMHgwM2UwMDAwOCwgMHgyN2JkMDAyMCwKLQkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDI3YmRmZmUwLCAweGFmYmYwMDFjLCAweGFmYjIwMDE4LCAweGFmYjEwMDE0LAotCTB4MGMwMDQyZDQsIDB4YWZiMDAwMTAsIDB4M2MxMjgwMDAsIDB4MjQxMTAwMDEsIDB4OGY3MDY4MTAsIDB4MzIwMjA0MDAsCi0JMHgxMDQwMDAwNywgMHgwMDAwMDAwMCwgMHg4ZjY0MTAwOCwgMHgwMDkyMTAyNCwgMHgxNDQwMDAwMywgMHgwMDAwMDAwMCwKLQkweDBjMDA0MDY0LCAweDAwMDAwMDAwLCAweDNjMDIwMDAxLCAweDkwNDIwZjU2LCAweDEwNTEwMDAzLCAweDMyMDIwMjAwLAotCTB4MTA0MGZmZjEsIDB4MDAwMDAwMDAsIDB4MGMwMDQxYjQsIDB4MDAwMDAwMDAsIDB4MDgwMDQwMzQsIDB4MDAwMDAwMDAsCi0JMHg4ZmJmMDAxYywgMHg4ZmIyMDAxOCwgMHg4ZmIxMDAxNCwgMHg4ZmIwMDAxMCwgMHgwM2UwMDAwOCwgMHgyN2JkMDAyMCwKLQkweDI3YmRmZmUwLCAweDNjMDQwMDAxLCAweDI0ODQwZWIwLCAweDAwMDAyODIxLCAweDAwMDAzMDIxLCAweDAwMDAzODIxLAotCTB4YWZiZjAwMTgsIDB4YWZhMDAwMTAsIDB4MGMwMDQzNzgsIDB4YWZhMDAwMTQsIDB4MDAwMGQwMjEsIDB4MjQwMjAxMzAsCi0JMHhhZjYyNTAwMCwgMHgzYzAxMDAwMSwgMHhhNDIwMGY1MCwgMHgzYzAxMDAwMSwgMHhhMDIwMGY1NywgMHg4ZmJmMDAxOCwKLQkweDAzZTAwMDA4LCAweDI3YmQwMDIwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDNjMDMwMDAxLCAweDI0NjMwZjYwLAotCTB4OTA2MjAwMDAsIDB4MjdiZGZmZjAsIDB4MTQ0MDAwMDMsIDB4MDA4MGMwMjEsIDB4MDgwMDQwNzMsIDB4MDAwMDQ4MjEsCi0JMHgzYzAyMjAwMCwgMHgwMzAyMTAyNCwgMHgxMDQwMDAwMywgMHgyNDA5MDAwMiwgMHgwODAwNDA3MywgMHhhMDYwMDAwMCwKLQkweDI0MDkwMDAxLCAweDAwMTgxMDQwLCAweDMwNDMxZjgwLCAweDM0NmY4MDA4LCAweDE1MjAwMDRiLCAweDI1ZWIwMDI4LAotCTB4M2MwNDAwMDEsIDB4MDA4MzIwMjEsIDB4OGM4NDgwMTAsIDB4M2MwNTAwMDEsIDB4MjRhNTBmN2EsIDB4MDAwNDE0MDIsCi0JMHhhMGEyMDAwMCwgMHgzYzAxMDAwMSwgMHhhMDI0MGY3YiwgMHgzYzAyMDAwMSwgMHgwMDQzMTAyMSwgMHg5NDQyODAxNCwKLQkweDNjMDEwMDAxLCAweGEwMjIwZjdjLCAweDNjMGMwMDAxLCAweDAxODM2MDIxLCAweDhkOGM4MDE4LCAweDMwNDIwMGZmLAotCTB4MjQ0MjAwMDgsIDB4MDAwMjIwYzMsIDB4MjQwMjAwMDEsIDB4M2MwMTAwMDEsIDB4YTAyMjBmNjAsIDB4MDEyNDEwMmIsCi0JMHgxMDQwMDAwYywgMHgwMDAwMzgyMSwgMHgyNGE2MDAwZSwgMHgwMTYwMjgyMSwgMHg4Y2EyMDAwMCwgMHg4Y2EzMDAwNCwKLQkweDI0YTUwMDA4LCAweDI0ZTcwMDAxLCAweGFjYzIwMDAwLCAweGFjYzMwMDA0LCAweDAwZTQxMDJiLCAweDE0NDBmZmY4LAotCTB4MjRjNjAwMDgsIDB4MDAwMDM4MjEsIDB4M2MwODAwMDEsIDB4MjUwODBmN2IsIDB4OTEwNjAwMDAsIDB4M2MwMjAwMDEsCi0JMHg5MDQyMGY3YywgMHgyNTAzMDAwZCwgMHgwMGMzMjgyMSwgMHgwMDQ2MTAyMywgMHgwMDAyMWZjMiwgMHgwMDQzMTAyMSwKLQkweDAwMDIxMDQzLCAweDE4NDAwMDBjLCAweDAwMDAyMDIxLCAweDkxMDIwMDAxLCAweDAwNDYxMDIzLCAweDAwMDIxZmMyLAotCTB4MDA0MzEwMjEsIDB4MDAwMjE4NDMsIDB4OTRhMjAwMDAsIDB4MjRlNzAwMDEsIDB4MDA4MjIwMjEsIDB4MDBlMzEwMmEsCi0JMHgxNDQwZmZmYiwgMHgyNGE1MDAwMiwgMHgwMDA0MWMwMiwgMHgzMDgyZmZmZiwgMHgwMDYyMjAyMSwgMHgwMDA0MTQwMiwKLQkweDAwODIyMDIxLCAweDNjMDJmZmZmLCAweDAxODIxMDI0LCAweDMwODNmZmZmLCAweDAwNDMxMDI1LCAweDNjMDEwMDAxLAotCTB4MDgwMDQwZmEsIDB4YWMyMjBmODAsIDB4M2MwNTAwMDEsIDB4MjRhNTBmN2MsIDB4OTBhMjAwMDAsIDB4M2MwYzAwMDEsCi0JMHgwMTgzNjAyMSwgMHg4ZDhjODAxOCwgMHgwMDAyMjBjMiwgMHgxMDgwMDAwZSwgMHgwMDAwMzgyMSwgMHgwMTYwMzAyMSwKLQkweDI0YTUwMDBjLCAweDhjYTIwMDAwLCAweDhjYTMwMDA0LCAweDI0YTUwMDA4LCAweDI0ZTcwMDAxLCAweGFjYzIwMDAwLAotCTB4YWNjMzAwMDQsIDB4MDBlNDEwMmIsIDB4MTQ0MGZmZjgsIDB4MjRjNjAwMDgsIDB4M2MwNTAwMDEsIDB4MjRhNTBmN2MsCi0JMHg5MGEyMDAwMCwgMHgzMDQzMDAwNywgMHgyNDAyMDAwNCwgMHgxMDYyMDAxMSwgMHgyODYyMDAwNSwgMHgxMDQwMDAwNSwKLQkweDI0MDIwMDAyLCAweDEwNjIwMDA4LCAweDAwMDcxMGMwLCAweDA4MDA0MGZhLCAweDAwMDAwMDAwLCAweDI0MDIwMDA2LAotCTB4MTA2MjAwMGUsIDB4MDAwNzEwYzAsIDB4MDgwMDQwZmEsIDB4MDAwMDAwMDAsIDB4MDBhMjE4MjEsIDB4OTQ2MzAwMGMsCi0JMHgwMDRiMTAyMSwgMHgwODAwNDBmYSwgMHhhNDQzMDAwMCwgMHgwMDA3MTBjMCwgMHgwMGEyMTgyMSwgMHg4YzYzMDAwYywKLQkweDAwNGIxMDIxLCAweDA4MDA0MGZhLCAweGFjNDMwMDAwLCAweDAwYTIxODIxLCAweDhjNjMwMDBjLCAweDAwNGIyMDIxLAotCTB4MDBhMjEwMjEsIDB4YWM4MzAwMDAsIDB4OTQ0MjAwMTAsIDB4YTQ4MjAwMDQsIDB4OTVlNzAwMDYsIDB4M2MwMjAwMDEsCi0JMHg5MDQyMGY3YywgMHgzYzAzMDAwMSwgMHg5MDYzMGY3YSwgMHgwMGUyYzgyMywgMHgzYzAyMDAwMSwgMHg5MDQyMGY3YiwKLQkweDI0NjMwMDI4LCAweDAxZTM0MDIxLCAweDI0NDIwMDI4LCAweDE1MjAwMDEyLCAweDAxZTIzMDIxLCAweDk0YzIwMDBjLAotCTB4M2MwMTAwMDEsIDB4YTQyMjBmNzgsIDB4OTRjMjAwMDQsIDB4OTRjMzAwMDYsIDB4M2MwMTAwMDEsIDB4YTQyMDBmNzYsCi0JMHgzYzAxMDAwMSwgMHhhNDIwMGY3MiwgMHgwMDAyMTQwMCwgMHgwMDQzMTAyNSwgMHgzYzAxMDAwMSwgMHhhYzIyMGY2YywKLQkweDk1MDIwMDA0LCAweDNjMDEwMDAxLCAweDA4MDA0MTI0LCAweGE0MjIwZjcwLCAweDNjMDIwMDAxLCAweDk0NDIwZjcwLAotCTB4M2MwMzAwMDEsIDB4OTQ2MzBmNzIsIDB4MDA0MzEwMjEsIDB4YTUwMjAwMDQsIDB4M2MwMjAwMDEsIDB4OTQ0MjBmNmMsCi0JMHhhNGMyMDAwNCwgMHgzYzAyMDAwMSwgMHg4YzQyMGY2YywgMHhhNGMyMDAwNiwgMHgzYzA0MDAwMSwgMHg5NDg0MGY3MiwKLQkweDNjMDIwMDAxLCAweDk0NDIwZjcwLCAweDNjMGEwMDAxLCAweDk1NGEwZjc2LCAweDAwNDQxODIxLCAweDMwNjNmZmZmLAotCTB4MDA2MjE4MmEsIDB4MjQwMjAwMDIsIDB4MTEyMjAwMGIsIDB4MDA4MzIwMjMsIDB4M2MwMzAwMDEsIDB4OTQ2MzBmNzgsCi0JMHgzMDYyMDAwOSwgMHgxMDQwMDAwNiwgMHgzMDYyZmZmNiwgMHhhNGMyMDAwYywgMHgzYzAyMDAwMSwgMHg5NDQyMGY3OCwKLQkweDMwNDIwMDA5LCAweDAxNDI1MDIzLCAweDI0MDIwMDAxLCAweDExMjIwMDFiLCAweDI5MjIwMDAyLCAweDUwNDAwMDA1LAotCTB4MjQwMjAwMDIsIDB4MTEyMDAwMDcsIDB4MzFhMmZmZmYsIDB4MDgwMDQxOTcsIDB4MDAwMDAwMDAsIDB4MTEyMjAwMWQsCi0JMHgyNDAyMDAxNiwgMHgwODAwNDE5NywgMHgzMWEyZmZmZiwgMHgzYzBlMDAwMSwgMHg5NWNlMGY4MCwgMHgxMDgwMDAwNSwKLQkweDAxODA2ODIxLCAweDAxYzQyMDIxLCAweDAwMDQxYzAyLCAweDMwODJmZmZmLCAweDAwNjI3MDIxLCAweDAwMGUxMDI3LAotCTB4YTUwMjAwMGEsIDB4M2MwMzAwMDEsIDB4OTA2MzBmN2IsIDB4MzFhMmZmZmYsIDB4MDBlMjEwMjEsIDB4MDgwMDQxOGQsCi0JMHgwMDQzMjAyMywgMHgzYzAyMDAwMSwgMHg5NDQyMGY4MCwgMHgwMDQ0MjAyMSwgMHgwMDA0MWMwMiwgMHgzMDgyZmZmZiwKLQkweDAwNjIyMDIxLCAweDAwODA3MDIxLCAweDAwMDQxMDI3LCAweDA4MDA0MTg1LCAweGE1MDIwMDBhLCAweDNjMDUwMDAxLAotCTB4MjRhNTBmN2EsIDB4OTBhMzAwMDAsIDB4MTQ2MjAwMDIsIDB4MjRlMmZmZjIsIDB4YTVlMjAwMzQsIDB4OTBhMjAwMDAsCi0JMHgwMGUyMTAyMywgMHhhNTAyMDAwMiwgMHgzYzAzMDAwMSwgMHg5NDYzMGY4MCwgMHgzYzAyMDAwMSwgMHg5NDQyMGY1YSwKLQkweDMwZTVmZmZmLCAweDAwNjQxODIxLCAweDAwNDUxMDIzLCAweDAwNjIyMDIzLCAweDAwMDQxYzAyLCAweDMwODJmZmZmLAotCTB4MDA2MjIwMjEsIDB4MDAwNDEwMjcsIDB4YTUwMjAwMGEsIDB4M2MwMzAwMDEsIDB4OTA2MzBmN2MsIDB4MjQ2MjAwMDEsCi0JMHgxNGEyMDAwNSwgMHgwMDgwNzAyMSwgMHgwMTYzMTAyMSwgMHg5MDQyMDAwMCwgMHgwODAwNDE4NSwgMHgwMDAyNjIwMCwKLQkweDI0NjIwMDAyLCAweDE0YTIwMDAzLCAweDMwNjIwMGZlLCAweDAwNGIxMDIxLCAweDk0NGMwMDAwLCAweDNjMDIwMDAxLAotCTB4OTQ0MjBmODIsIDB4MzE4M2ZmZmYsIDB4M2MwNDAwMDEsIDB4OTA4NDBmN2IsIDB4MDA0MzEwMjEsIDB4MDBlMjEwMjEsCi0JMHgwMDQ0MjAyMywgMHgwMDhhMjAyMSwgMHgwMDA0MWMwMiwgMHgzMDgyZmZmZiwgMHgwMDYyMjAyMSwgMHgwMDA0MTQwMiwKLQkweDAwODIyMDIxLCAweDAwODA2ODIxLCAweDAwMDQxMDI3LCAweGE0YzIwMDEwLCAweDMxYTJmZmZmLCAweDAwMGUxYzAwLAotCTB4MDA0MzEwMjUsIDB4M2MwNDAwMDEsIDB4MjQ4NDBmNzIsIDB4YWRlMjAwMTAsIDB4OTQ4MjAwMDAsIDB4M2MwNTAwMDEsCi0JMHg5NGE1MGY3NiwgMHgzYzAzMDAwMSwgMHg4YzYzMGY2YywgMHgyNDQyMDAwMSwgMHgwMGI5MjgyMSwgMHhhNDgyMDAwMCwKLQkweDMzMjJmZmZmLCAweDAwNjIyMDIxLCAweDAwODMxODJiLCAweDNjMDEwMDAxLCAweGE0MjUwZjc2LCAweDEwNjAwMDAzLAotCTB4MjRhMmZmZmYsIDB4M2MwMTAwMDEsIDB4YTQyMjBmNzYsIDB4M2MwMjQwMDAsIDB4MDMwMjEwMjUsIDB4M2MwMTAwMDEsCi0JMHhhYzI0MGY2YywgMHhhZjYyMTAwOCwgMHgwM2UwMDAwOCwgMHgyN2JkMDAxMCwgMHgzYzAzMDAwMSwgMHg5MDYzMGY1NiwKLQkweDI3YmRmZmU4LCAweDI0MDIwMDAxLCAweGFmYmYwMDE0LCAweDEwNjIwMDI2LCAweGFmYjAwMDEwLCAweDhmNjIwY2Y0LAotCTB4MjQ0MmZmZmYsIDB4MzA0MjAwN2YsIDB4MDAwMjExMDAsIDB4OGM0MzQwMDAsIDB4M2MwMTAwMDEsIDB4YWMyMzBmNjQsCi0JMHg4YzQzNDAwOCwgMHgyNDQ0NDAwMCwgMHg4YzVjNDAwNCwgMHgzMDYyMDA0MCwgMHgxNDQwMDAwMiwgMHgyNDAyMDA4OCwKLQkweDI0MDIwMDA4LCAweDNjMDEwMDAxLCAweGE0MjIwZjY4LCAweDMwNjIwMDA0LCAweDEwNDAwMDA1LCAweDI0MDIwMDAxLAotCTB4M2MwMTAwMDEsIDB4YTAyMjBmNTcsIDB4MDgwMDQxZDUsIDB4MDAwMzE0MDIsIDB4M2MwMTAwMDEsIDB4YTAyMDBmNTcsCi0JMHgwMDAzMTQwMiwgMHgzYzAxMDAwMSwgMHhhNDIyMGY1NCwgMHg5NDgzMDAwYywgMHgyNDAyMDAwMSwgMHgzYzAxMDAwMSwKLQkweGE0MjAwZjUwLCAweDNjMDEwMDAxLCAweGEwMjIwZjU2LCAweDNjMDEwMDAxLCAweGE0MjMwZjYyLCAweDI0MDIwMDAxLAotCTB4MTM0MjAwMWUsIDB4MDAwMDAwMDAsIDB4MTM0MDAwMDUsIDB4MjQwMjAwMDMsIDB4MTM0MjAwNjcsIDB4MDAwMDAwMDAsCi0JMHgwODAwNDJjZiwgMHgwMDAwMDAwMCwgMHgzYzAyMDAwMSwgMHg5NDQyMGY2MiwgMHgyNDFhMDAwMSwgMHgzYzAxMDAwMSwKLQkweGE0MjAwZjVlLCAweDNjMDEwMDAxLCAweGE0MjAwZjUyLCAweDMwNDQwN2ZmLCAweDAwMDIxYmMyLCAweDAwMDMxODIzLAotCTB4MzA2MzAwM2UsIDB4MzQ2MzAwMzYsIDB4MDAwMjEyNDIsIDB4MzA0MjAwM2MsIDB4MDA2MjE4MjEsIDB4M2MwMTAwMDEsCi0JMHhhNDI0MGY1OCwgMHgwMDgzMjAyMSwgMHgyNDYzMDAzMCwgMHgzYzAxMDAwMSwgMHhhNDI0MGY1YSwgMHgzYzAxMDAwMSwKLQkweGE0MjMwZjVjLCAweDNjMDYwMDAxLCAweDI0YzYwZjUyLCAweDk0YzUwMDAwLCAweDk0YzMwMDAyLCAweDNjMDQwMDAxLAotCTB4OTQ4NDBmNWEsIDB4MDA2NTEwMjEsIDB4MDA0NDEwMmEsIDB4MTA0MDAwMTMsIDB4M2MxMDgwMDAsIDB4MDBhMzEwMjEsCi0JMHhhNGMyMDAwMCwgMHgzYzAyYTAwMCwgMHhhZjYyMGNmNCwgMHgzYzAxMDAwMSwgMHhhMDIwMGY1NiwgMHg4ZjY0MTAwOCwKLQkweDAwOTAxMDI0LCAweDE0NDAwMDAzLCAweDAwMDAwMDAwLCAweDBjMDA0MDY0LCAweDAwMDAwMDAwLCAweDhmNjIwY2Y0LAotCTB4MDA1MDEwMjQsIDB4MTA0MDAwYjcsIDB4MDAwMDAwMDAsIDB4MDgwMDQyMGYsIDB4MDAwMDAwMDAsIDB4M2MwMzAwMDEsCi0JMHg5NDYzMGY1MCwgMHgwMDg1MTAyMywgMHhhNGM0MDAwMCwgMHgwMDYyMTgyMSwgMHgzMDQyZmZmZiwgMHgzYzAxMDAwMSwKLQkweGE0MjMwZjUwLCAweGFmNjIwY2U4LCAweDNjMDIwMDAxLCAweDk0NDIwZjY4LCAweDM0NDIwMDI0LCAweGFmNjIwY2VjLAotCTB4OTRjMzAwMDIsIDB4M2MwMjAwMDEsIDB4OTQ0MjBmNTAsIDB4MTQ2MjAwMTIsIDB4M2MwMjgwMDAsIDB4M2MxMDgwMDAsCi0JMHgzYzAyYTAwMCwgMHhhZjYyMGNmNCwgMHgzYzAxMDAwMSwgMHhhMDIwMGY1NiwgMHg4ZjY0MTAwOCwgMHgwMDkwMTAyNCwKLQkweDE0NDAwMDAzLCAweDAwMDAwMDAwLCAweDBjMDA0MDY0LCAweDAwMDAwMDAwLCAweDhmNjIwY2Y0LCAweDAwNTAxMDI0LAotCTB4MTQ0MGZmZjcsIDB4MDAwMDAwMDAsIDB4MDgwMDQyY2YsIDB4MjQxYTAwMDMsIDB4YWY2MjBjZjQsIDB4M2MxMDgwMDAsCi0JMHg4ZjY0MTAwOCwgMHgwMDkwMTAyNCwgMHgxNDQwMDAwMywgMHgwMDAwMDAwMCwgMHgwYzAwNDA2NCwgMHgwMDAwMDAwMCwKLQkweDhmNjIwY2Y0LCAweDAwNTAxMDI0LCAweDE0NDBmZmY3LCAweDAwMDAwMDAwLCAweDA4MDA0MmNmLCAweDI0MWEwMDAzLAotCTB4M2MwNzAwMDEsIDB4MjRlNzBmNTAsIDB4OTRlMjAwMDAsIDB4MDM4MjEwMjEsIDB4YWY2MjBjZTAsIDB4M2MwMjAwMDEsCi0JMHg4YzQyMGY2NCwgMHhhZjYyMGNlNCwgMHgzYzA1MDAwMSwgMHg5NGE1MGY1NCwgMHg5NGUzMDAwMCwgMHgzYzA0MDAwMSwKLQkweDk0ODQwZjU4LCAweDNjMDIwMDAxLCAweDk0NDIwZjVlLCAweDAwYTMyODIzLCAweDAwODIyMDIzLCAweDMwYTZmZmZmLAotCTB4MzA4M2ZmZmYsIDB4MDBjMzEwMmIsIDB4MTQ0MDAwNDMsIDB4MDAwMDAwMDAsIDB4M2MwMjAwMDEsIDB4OTQ0MjBmNWMsCi0JMHgwMDAyMTQwMCwgMHgwMDYyMTAyNSwgMHhhZjYyMGNlOCwgMHg5NGUyMDAwMCwgMHgzYzAzMDAwMSwgMHg5NDYzMGY1NCwKLQkweDAwNDQxMDIxLCAweGE0ZTIwMDAwLCAweDMwNDJmZmZmLCAweDE0NDMwMDIxLCAweDNjMDIwMDA4LCAweDNjMDIwMDAxLAotCTB4OTA0MjBmNTcsIDB4MTA0MDAwMDYsIDB4M2MwMzAwMGMsIDB4M2MwMjAwMDEsIDB4OTQ0MjBmNjgsIDB4MzQ2MzA2MjQsCi0JMHgwODAwNDI3YywgMHgwMDAwZDAyMSwgMHgzYzAyMDAwMSwgMHg5NDQyMGY2OCwgMHgzYzAzMDAwOCwgMHgzNDYzMDYyNCwKLQkweDAwNDMxMDI1LCAweGFmNjIwY2VjLCAweDNjMTA4MDAwLCAweDNjMDJhMDAwLCAweGFmNjIwY2Y0LCAweDNjMDEwMDAxLAotCTB4YTAyMDBmNTYsIDB4OGY2NDEwMDgsIDB4MDA5MDEwMjQsIDB4MTQ0MDAwMDMsIDB4MDAwMDAwMDAsIDB4MGMwMDQwNjQsCi0JMHgwMDAwMDAwMCwgMHg4ZjYyMGNmNCwgMHgwMDUwMTAyNCwgMHgxMDQwMDAxNSwgMHgwMDAwMDAwMCwgMHgwODAwNDI4MywKLQkweDAwMDAwMDAwLCAweDNjMDMwMDAxLCAweDk0NjMwZjY4LCAweDM0NDIwNjI0LCAweDNjMTA4MDAwLCAweDAwNjIxODI1LAotCTB4M2MwMjgwMDAsIDB4YWY2MzBjZWMsIDB4YWY2MjBjZjQsIDB4OGY2NDEwMDgsIDB4MDA5MDEwMjQsIDB4MTQ0MDAwMDMsCi0JMHgwMDAwMDAwMCwgMHgwYzAwNDA2NCwgMHgwMDAwMDAwMCwgMHg4ZjYyMGNmNCwgMHgwMDUwMTAyNCwgMHgxNDQwZmZmNywKLQkweDAwMDAwMDAwLCAweDNjMDEwMDAxLCAweDA4MDA0MmNmLCAweGE0MjAwZjVlLCAweDNjMDIwMDAxLCAweDk0NDIwZjVjLAotCTB4MDAwMjE0MDAsIDB4MDBjMjEwMjUsIDB4YWY2MjBjZTgsIDB4M2MwMjAwMDEsIDB4OTA0MjBmNTcsIDB4MTA0MDAwMDksCi0JMHgzYzAzMDAwYywgMHgzYzAyMDAwMSwgMHg5NDQyMGY2OCwgMHgzNDYzMDYyNCwgMHgwMDAwZDAyMSwgMHgwMDQzMTAyNSwKLQkweGFmNjIwY2VjLCAweDA4MDA0MmMxLCAweDNjMTA4MDAwLCAweDNjMDIwMDAxLCAweDk0NDIwZjY4LCAweDNjMDMwMDA4LAotCTB4MzQ2MzA2MDQsIDB4MDA0MzEwMjUsIDB4YWY2MjBjZWMsIDB4M2MwMjAwMDEsIDB4OTQ0MjBmNWUsIDB4MDA0NTEwMjEsCi0JMHgzYzAxMDAwMSwgMHhhNDIyMGY1ZSwgMHgzYzEwODAwMCwgMHgzYzAyYTAwMCwgMHhhZjYyMGNmNCwgMHgzYzAxMDAwMSwKLQkweGEwMjAwZjU2LCAweDhmNjQxMDA4LCAweDAwOTAxMDI0LCAweDE0NDAwMDAzLCAweDAwMDAwMDAwLCAweDBjMDA0MDY0LAotCTB4MDAwMDAwMDAsIDB4OGY2MjBjZjQsIDB4MDA1MDEwMjQsIDB4MTQ0MGZmZjcsIDB4MDAwMDAwMDAsIDB4OGZiZjAwMTQsCi0JMHg4ZmIwMDAxMCwgMHgwM2UwMDAwOCwgMHgyN2JkMDAxOCwgMHgwMDAwMDAwMCwgMHgyN2JkZmZlMCwgMHgzYzA0MDAwMSwKLQkweDI0ODQwZWMwLCAweDAwMDAyODIxLCAweDAwMDAzMDIxLCAweDAwMDAzODIxLCAweGFmYmYwMDE4LCAweGFmYTAwMDEwLAotCTB4MGMwMDQzNzgsIDB4YWZhMDAwMTQsIDB4MDAwMGQwMjEsIDB4MjQwMjAxMzAsIDB4YWY2MjUwMDAsIDB4M2MwMTAwMDEsCi0JMHhhNDIwMGY1MCwgMHgzYzAxMDAwMSwgMHhhMDIwMGY1NywgMHg4ZmJmMDAxOCwgMHgwM2UwMDAwOCwgMHgyN2JkMDAyMCwKLQkweDI3YmRmZmU4LCAweDNjMWJjMDAwLCAweGFmYmYwMDE0LCAweGFmYjAwMDEwLCAweGFmNjA2ODBjLCAweDhmNjI2ODA0LAotCTB4MzQ0MjAwODIsIDB4YWY2MjY4MDQsIDB4OGY2MzQwMDAsIDB4MjQwMjBiNTAsIDB4M2MwMTAwMDEsIDB4YWMyMjBmMjAsCi0JMHgyNDAyMGI3OCwgMHgzYzAxMDAwMSwgMHhhYzIyMGYzMCwgMHgzNDYzMDAwMiwgMHhhZjYzNDAwMCwgMHgwYzAwNDMxNSwKLQkweDAwODA4MDIxLCAweDNjMDEwMDAxLCAweGEwMjIwZjM0LCAweDMwNDIwMGZmLCAweDI0MDMwMDAyLCAweDE0NDMwMDA1LAotCTB4MDAwMDAwMDAsIDB4M2MwMjAwMDEsIDB4OGM0MjBmMjAsIDB4MDgwMDQzMDgsIDB4YWM1MDAwYzAsIDB4M2MwMjAwMDEsCi0JMHg4YzQyMGYyMCwgMHhhYzUwMDBiYywgMHg4ZjYyNDQzNCwgMHg4ZjYzNDQzOCwgMHg4ZjY0NDQxMCwgMHgzYzAxMDAwMSwKLQkweGFjMjIwZjI4LCAweDNjMDEwMDAxLCAweGFjMjMwZjM4LCAweDNjMDEwMDAxLCAweGFjMjQwZjI0LCAweDhmYmYwMDE0LAotCTB4OGZiMDAwMTAsIDB4MDNlMDAwMDgsIDB4MjdiZDAwMTgsIDB4MDNlMDAwMDgsIDB4MjQwMjAwMDEsIDB4MjdiZGZmZjgsCi0JMHgxODgwMDAwOSwgMHgwMDAwMjgyMSwgMHg4ZjYzNjgwYywgMHg4ZjYyNjgwYywgMHgxMDQzZmZmZSwgMHgwMDAwMDAwMCwKLQkweDI0YTUwMDAxLCAweDAwYTQxMDJhLCAweDE0NDBmZmY5LCAweDAwMDAwMDAwLCAweDAzZTAwMDA4LCAweDI3YmQwMDA4LAotCTB4OGY2MzQ0NTAsIDB4M2MwMjAwMDEsIDB4OGM0MjBmMjgsIDB4MDAwMzFjMDIsIDB4MDA0MzEwMmIsIDB4MTQ0MDAwMDgsCi0JMHgzYzAzODAwMCwgMHgzYzA0MDAwMSwgMHg4Yzg0MGYzOCwgMHg4ZjYyNDQ1MCwgMHgwMDAyMWMwMiwgMHgwMDgzMTAyYiwKLQkweDEwNDBmZmZjLCAweDNjMDM4MDAwLCAweGFmNjM0NDQ0LCAweDhmNjI0NDQ0LCAweDAwNDMxMDI0LCAweDE0NDBmZmZkLAotCTB4MDAwMDAwMDAsIDB4OGY2MjQ0NDgsIDB4MDNlMDAwMDgsIDB4MzA0MmZmZmYsIDB4MzA4MmZmZmYsIDB4MjQ0MmUwMDAsCi0JMHgyYzQyMjAwMSwgMHgxNDQwMDAwMywgMHgzYzAyNDAwMCwgMHgwODAwNDM0NywgMHgyNDAyZmZmZiwgMHgwMDgyMjAyNSwKLQkweGFmNjQ1YzM4LCAweDhmNjI1YzMwLCAweDMwNDIwMDAyLCAweDE0NDBmZmZjLCAweDAwMDAxMDIxLCAweDAzZTAwMDA4LAotCTB4MDAwMDAwMDAsIDB4OGY2MjQ0NTAsIDB4M2MwMzAwMDEsIDB4OGM2MzBmMjQsIDB4MDgwMDQzNTAsIDB4MzA0MmZmZmYsCi0JMHg4ZjYyNDQ1MCwgMHgzMDQyZmZmZiwgMHgwMDQzMTAyYiwgMHgxNDQwZmZmYywgMHgwMDAwMDAwMCwgMHgwM2UwMDAwOCwKLQkweDAwMDAwMDAwLCAweDI3YmRmZmUwLCAweDAwODAyODIxLCAweDNjMDQwMDAxLCAweDI0ODQwZWQwLCAweDAwMDAzMDIxLAotCTB4MDAwMDM4MjEsIDB4YWZiZjAwMTgsIDB4YWZhMDAwMTAsIDB4MGMwMDQzNzgsIDB4YWZhMDAwMTQsIDB4MDgwMDQzNWYsCi0JMHgwMDAwMDAwMCwgMHg4ZmJmMDAxOCwgMHgwM2UwMDAwOCwgMHgyN2JkMDAyMCwgMHgzYzAyMDAwMSwgMHgzNDQyZDYwMCwKLQkweDNjMDMwMDAxLCAweDM0NjNkNjAwLCAweDNjMDQwMDAxLCAweDM0ODRkZGZmLCAweDNjMDEwMDAxLCAweGFjMjIwZjQwLAotCTB4MjQwMjAwNDAsIDB4M2MwMTAwMDEsIDB4YWMyMjBmNDQsIDB4M2MwMTAwMDEsIDB4YWMyMDBmM2MsIDB4YWM2MDAwMDAsCi0JMHgyNDYzMDAwNCwgMHgwMDgzMTAyYiwgMHg1MDQwZmZmZCwgMHhhYzYwMDAwMCwgMHgwM2UwMDAwOCwgMHgwMDAwMDAwMCwKLQkweDAwODA0ODIxLCAweDhmYWEwMDEwLCAweDNjMDIwMDAxLCAweDhjNDIwZjNjLCAweDNjMDQwMDAxLCAweDhjODQwZjQ0LAotCTB4OGZhYjAwMTQsIDB4MjQ0MzAwMDEsIDB4MDA0NDEwMmIsIDB4M2MwMTAwMDEsIDB4YWMyMzBmM2MsIDB4MTQ0MDAwMDMsCi0JMHgwMDAwNDAyMSwgMHgzYzAxMDAwMSwgMHhhYzIwMGYzYywgMHgzYzAyMDAwMSwgMHg4YzQyMGYzYywgMHgzYzAzMDAwMSwKLQkweDhjNjMwZjQwLCAweDkxMjQwMDAwLCAweDAwMDIxMTQwLCAweDAwNDMxMDIxLCAweDAwNDgxMDIxLCAweDI1MDgwMDAxLAotCTB4YTA0NDAwMDAsIDB4MjkwMjAwMDgsIDB4MTQ0MGZmZjQsIDB4MjUyOTAwMDEsIDB4M2MwMjAwMDEsIDB4OGM0MjBmM2MsCi0JMHgzYzAzMDAwMSwgMHg4YzYzMGY0MCwgMHg4ZjY0NjgwYywgMHgwMDAyMTE0MCwgMHgwMDQzMTAyMSwgMHhhYzQ0MDAwOCwKLQkweGFjNDUwMDBjLCAweGFjNDYwMDEwLCAweGFjNDcwMDE0LCAweGFjNGEwMDE4LCAweDAzZTAwMDA4LCAweGFjNGIwMDFjLAotCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCi19OwotCi1zdGF0aWMgY29uc3QgdTMyIHRnM1RzbzVGd1JvZGF0YVsoVEczX1RTTzVfRldfUk9EQVRBX0xFTiAvIDQpICsgMV0gPSB7Ci0JMHg0ZDYxNjk2ZSwgMHg0MzcwNzU0MiwgMHgwMDAwMDAwMCwgMHg0ZDYxNjk2ZSwgMHg0MzcwNzU0MSwgMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDczNzQ2YjZmLCAweDY2NjY2YzY0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotCTB4NzM3NDZiNmYsIDB4NjY2NjZjNjQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4NjY2MTc0NjEsIDB4NmM0NTcyNzIsCi0JMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKLX07Ci0KLXN0YXRpYyBjb25zdCB1MzIgdGczVHNvNUZ3RGF0YVsoVEczX1RTTzVfRldfREFUQV9MRU4gLyA0KSArIDFdID0gewotCTB4MDAwMDAwMDAsIDB4NzM3NDZiNmYsIDB4NjY2NjZjNjQsIDB4NWY3NjMxMmUsIDB4MzIyZTMwMDAsIDB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKLX07CiAKIC8qIHRwLT5sb2NrIGlzIGhlbGQuICovCiBzdGF0aWMgaW50IHRnM19sb2FkX3Rzb19maXJtd2FyZShzdHJ1Y3QgdGczICp0cCkKIHsKIAlzdHJ1Y3QgZndfaW5mbyBpbmZvOworCWNvbnN0IF9fYmUzMiAqZndfZGF0YTsKIAl1bnNpZ25lZCBsb25nIGNwdV9iYXNlLCBjcHVfc2NyYXRjaF9iYXNlLCBjcHVfc2NyYXRjaF9zaXplOwogCWludCBlcnIsIGk7CiAKIAlpZiAodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl9IV19UU08pCiAJCXJldHVybiAwOwogCisJZndfZGF0YSA9ICh2b2lkICopdHAtPmZ3LT5kYXRhOworCisJLyogRmlybXdhcmUgYmxvYiBzdGFydHMgd2l0aCB2ZXJzaW9uIG51bWJlcnMsIGZvbGxvd2VkIGJ5CisJICAgc3RhcnQgYWRkcmVzcyBhbmQgbGVuZ3RoLiBXZSBhcmUgc2V0dGluZyBjb21wbGV0ZSBsZW5ndGguCisJICAgbGVuZ3RoID0gZW5kX2FkZHJlc3Nfb2ZfYnNzIC0gc3RhcnRfYWRkcmVzc19vZl90ZXh0LgorCSAgIFJlbWFpbmRlciBpcyB0aGUgYmxvYiB0byBiZSBsb2FkZWQgY29udGlndW91c2x5CisJICAgZnJvbSBzdGFydCBhZGRyZXNzLiAqLworCisJaW5mby5md19iYXNlID0gYmUzMl90b19jcHUoZndfZGF0YVsxXSk7CisJY3B1X3NjcmF0Y2hfc2l6ZSA9IHRwLT5md19sZW47CisJaW5mby5md19sZW4gPSB0cC0+ZnctPnNpemUgLSAxMjsKKwlpbmZvLmZ3X2RhdGEgPSAmZndfZGF0YVszXTsKKwogCWlmIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcwNSkgewotCQlpbmZvLnRleHRfYmFzZSA9IFRHM19UU081X0ZXX1RFWFRfQUREUjsKLQkJaW5mby50ZXh0X2xlbiA9IFRHM19UU081X0ZXX1RFWFRfTEVOOwotCQlpbmZvLnRleHRfZGF0YSA9ICZ0ZzNUc281RndUZXh0WzBdOwotCQlpbmZvLnJvZGF0YV9iYXNlID0gVEczX1RTTzVfRldfUk9EQVRBX0FERFI7Ci0JCWluZm8ucm9kYXRhX2xlbiA9IFRHM19UU081X0ZXX1JPREFUQV9MRU47Ci0JCWluZm8ucm9kYXRhX2RhdGEgPSAmdGczVHNvNUZ3Um9kYXRhWzBdOwotCQlpbmZvLmRhdGFfYmFzZSA9IFRHM19UU081X0ZXX0RBVEFfQUREUjsKLQkJaW5mby5kYXRhX2xlbiA9IFRHM19UU081X0ZXX0RBVEFfTEVOOwotCQlpbmZvLmRhdGFfZGF0YSA9ICZ0ZzNUc281RndEYXRhWzBdOwogCQljcHVfYmFzZSA9IFJYX0NQVV9CQVNFOwogCQljcHVfc2NyYXRjaF9iYXNlID0gTklDX1NSQU1fTUJVRl9QT09MX0JBU0U1NzA1OwotCQljcHVfc2NyYXRjaF9zaXplID0gKGluZm8udGV4dF9sZW4gKwotCQkJCSAgICBpbmZvLnJvZGF0YV9sZW4gKwotCQkJCSAgICBpbmZvLmRhdGFfbGVuICsKLQkJCQkgICAgVEczX1RTTzVfRldfU0JTU19MRU4gKwotCQkJCSAgICBURzNfVFNPNV9GV19CU1NfTEVOKTsKIAl9IGVsc2UgewotCQlpbmZvLnRleHRfYmFzZSA9IFRHM19UU09fRldfVEVYVF9BRERSOwotCQlpbmZvLnRleHRfbGVuID0gVEczX1RTT19GV19URVhUX0xFTjsKLQkJaW5mby50ZXh0X2RhdGEgPSAmdGczVHNvRndUZXh0WzBdOwotCQlpbmZvLnJvZGF0YV9iYXNlID0gVEczX1RTT19GV19ST0RBVEFfQUREUjsKLQkJaW5mby5yb2RhdGFfbGVuID0gVEczX1RTT19GV19ST0RBVEFfTEVOOwotCQlpbmZvLnJvZGF0YV9kYXRhID0gJnRnM1Rzb0Z3Um9kYXRhWzBdOwotCQlpbmZvLmRhdGFfYmFzZSA9IFRHM19UU09fRldfREFUQV9BRERSOwotCQlpbmZvLmRhdGFfbGVuID0gVEczX1RTT19GV19EQVRBX0xFTjsKLQkJaW5mby5kYXRhX2RhdGEgPSAmdGczVHNvRndEYXRhWzBdOwogCQljcHVfYmFzZSA9IFRYX0NQVV9CQVNFOwogCQljcHVfc2NyYXRjaF9iYXNlID0gVFhfQ1BVX1NDUkFUQ0hfQkFTRTsKIAkJY3B1X3NjcmF0Y2hfc2l6ZSA9IFRYX0NQVV9TQ1JBVENIX1NJWkU7CkBAIC03MDYwLDIxICs2NDE4LDIxIEBACiAKIAkvKiBOb3cgc3RhcnR1cCB0aGUgY3B1LiAqLwogCXR3MzIoY3B1X2Jhc2UgKyBDUFVfU1RBVEUsIDB4ZmZmZmZmZmYpOwotCXR3MzJfZihjcHVfYmFzZSArIENQVV9QQywgICAgaW5mby50ZXh0X2Jhc2UpOworCXR3MzJfZihjcHVfYmFzZSArIENQVV9QQywgaW5mby5md19iYXNlKTsKIAogCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspIHsKLQkJaWYgKHRyMzIoY3B1X2Jhc2UgKyBDUFVfUEMpID09IGluZm8udGV4dF9iYXNlKQorCQlpZiAodHIzMihjcHVfYmFzZSArIENQVV9QQykgPT0gaW5mby5md19iYXNlKQogCQkJYnJlYWs7CiAJCXR3MzIoY3B1X2Jhc2UgKyBDUFVfU1RBVEUsIDB4ZmZmZmZmZmYpOwogCQl0dzMyKGNwdV9iYXNlICsgQ1BVX01PREUsICBDUFVfTU9ERV9IQUxUKTsKLQkJdHczMl9mKGNwdV9iYXNlICsgQ1BVX1BDLCAgICBpbmZvLnRleHRfYmFzZSk7CisJCXR3MzJfZihjcHVfYmFzZSArIENQVV9QQywgaW5mby5md19iYXNlKTsKIAkJdWRlbGF5KDEwMDApOwogCX0KIAlpZiAoaSA+PSA1KSB7CiAJCXByaW50ayhLRVJOX0VSUiBQRlggInRnM19sb2FkX3Rzb19maXJtd2FyZSBmYWlscyBmb3IgJXMgIgogCQkgICAgICAgInRvIHNldCBDUFUgUEMsIGlzICUwOHggc2hvdWxkIGJlICUwOHhcbiIsCiAJCSAgICAgICB0cC0+ZGV2LT5uYW1lLCB0cjMyKGNwdV9iYXNlICsgQ1BVX1BDKSwKLQkJICAgICAgIGluZm8udGV4dF9iYXNlKTsKKwkJICAgICAgIGluZm8uZndfYmFzZSk7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIAl0dzMyKGNwdV9iYXNlICsgQ1BVX1NUQVRFLCAweGZmZmZmZmZmKTsKQEAgLTcyOTksMTEgKzY2NTcsNyBAQAogCWVsc2UgaWYgKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfVFNPX0NBUEFCTEUpIHsKIAkJaW50IGZ3X2xlbjsKIAotCQlmd19sZW4gPSAoVEczX1RTTzVfRldfVEVYVF9MRU4gKwotCQkJICBURzNfVFNPNV9GV19ST0RBVEFfTEVOICsKLQkJCSAgVEczX1RTTzVfRldfREFUQV9MRU4gKwotCQkJICBURzNfVFNPNV9GV19TQlNTX0xFTiArCi0JCQkgIFRHM19UU081X0ZXX0JTU19MRU4pOworCQlmd19sZW4gPSB0cC0+ZndfbGVuOwogCQlmd19sZW4gPSAoZndfbGVuICsgKDB4ODAgLSAxKSkgJiB+KDB4ODAgLSAxKTsKIAkJdHczMihCVUZNR1JfTUJfUE9PTF9BRERSLAogCQkgICAgIE5JQ19TUkFNX01CVUZfUE9PTF9CQVNFNTcwNSArIGZ3X2xlbik7CkBAIC0xMzU4MCw2ICsxMjkzNCw3IEBACiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKIAlzdHJ1Y3QgdGczICp0cDsKIAlpbnQgZXJyLCBwbV9jYXA7CisJY29uc3QgY2hhciAqZndfbmFtZSA9IE5VTEw7CiAJY2hhciBzdHJbNDBdOwogCXU2NCBkbWFfbWFzaywgcGVyc2lzdF9kbWFfbWFzazsKIApAQCAtMTM3MzUsNiArMTMwOTAsOSBAQAogCiAJdGczX2luaXRfYnVmbWdyX2NvbmZpZyh0cCk7CiAKKwlpZiAodHAtPnBjaV9jaGlwX3Jldl9pZCA9PSBDSElQUkVWX0lEXzU3MDFfQTApCisJCWZ3X25hbWUgPSBGSVJNV0FSRV9URzM7CisKIAlpZiAodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl9IV19UU08pIHsKIAkJdHAtPnRnM19mbGFnczIgfD0gVEczX0ZMRzJfVFNPX0NBUEFCTEU7CiAJfQpAQCAtMTM3NDcsNiArMTMxMDUsMzcgQEAKIAl9IGVsc2UgewogCQl0cC0+dGczX2ZsYWdzMiB8PSBURzNfRkxHMl9UU09fQ0FQQUJMRSB8IFRHM19GTEcyX1RTT19CVUc7CiAJfQorCWlmICh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyX1RTT19DQVBBQkxFKSB7CisJCWlmIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcwNSkKKwkJCWZ3X25hbWUgPSBGSVJNV0FSRV9URzNUU081OworCQllbHNlCisJCQlmd19uYW1lID0gRklSTVdBUkVfVEczVFNPOworCX0KKworCWlmIChmd19uYW1lKSB7CisJCWNvbnN0IF9fYmUzMiAqZndfZGF0YTsKKworCQllcnIgPSByZXF1ZXN0X2Zpcm13YXJlKCZ0cC0+ZncsIGZ3X25hbWUsICZ0cC0+cGRldi0+ZGV2KTsKKwkJaWYgKGVycikgeworCQkJcHJpbnRrKEtFUk5fRVJSICJ0ZzM6IEZhaWxlZCB0byBsb2FkIGZpcm13YXJlIFwiJXNcIlxuIiwKKwkJCSAgICAgICBmd19uYW1lKTsKKwkJCWdvdG8gZXJyX291dF9pb3VubWFwOworCQl9CisKKwkJZndfZGF0YSA9ICh2b2lkICopdHAtPmZ3LT5kYXRhOworCisJCS8qIEZpcm13YXJlIGJsb2Igc3RhcnRzIHdpdGggdmVyc2lvbiBudW1iZXJzLCBmb2xsb3dlZCBieQorCQkgICBzdGFydCBhZGRyZXNzIGFuZCBfZnVsbF8gbGVuZ3RoIGluY2x1ZGluZyBCU1Mgc2VjdGlvbnMKKwkJICAgKHdoaWNoIG11c3QgYmUgbG9uZ2VyIHRoYW4gdGhlIGFjdHVhbCBkYXRhLCBvZiBjb3Vyc2UgKi8KKworCQl0cC0+ZndfbGVuID0gYmUzMl90b19jcHUoZndfZGF0YVsyXSk7CS8qIGluY2x1ZGVzIGJzcyAqLworCQlpZiAodHAtPmZ3X2xlbiA8ICh0cC0+ZnctPnNpemUgLSAxMikpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAidGczOiBib2d1cyBsZW5ndGggJWQgaW4gXCIlc1wiXG4iLAorCQkJICAgICAgIHRwLT5md19sZW4sIGZ3X25hbWUpOworCQkJZXJyID0gLUVJTlZBTDsKKwkJCWdvdG8gZXJyX291dF9mdzsKKwkJfQorCX0KIAogCS8qIFRTTyBpcyBvbiBieSBkZWZhdWx0IG9uIGNoaXBzIHRoYXQgc3VwcG9ydCBoYXJkd2FyZSBUU08uCiAJICogRmlybXdhcmUgVFNPIG9uIG9sZGVyIGNoaXBzIGdpdmVzIGxvd2VyIHBlcmZvcm1hbmNlLCBzbyBpdApAQCAtMTM3NzgsNyArMTMxNjcsNyBAQAogCWlmIChlcnIpIHsKIAkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQ291bGQgbm90IG9idGFpbiB2YWxpZCBldGhlcm5ldCBhZGRyZXNzLCAiCiAJCSAgICAgICAiYWJvcnRpbmcuXG4iKTsKLQkJZ290byBlcnJfb3V0X2lvdW5tYXA7CisJCWdvdG8gZXJyX291dF9mdzsKIAl9CiAKIAlpZiAodHAtPnRnM19mbGFnczMgJiBURzNfRkxHM19FTkFCTEVfQVBFKSB7CkBAIC0xMzc4Nyw3ICsxMzE3Niw3IEBACiAJCQlwcmludGsoS0VSTl9FUlIgUEZYICJDYW5ub3QgbWFwIEFQRSByZWdpc3RlcnMsICIKIAkJCSAgICAgICAiYWJvcnRpbmcuXG4iKTsKIAkJCWVyciA9IC1FTk9NRU07Ci0JCQlnb3RvIGVycl9vdXRfaW91bm1hcDsKKwkJCWdvdG8gZXJyX291dF9mdzsKIAkJfQogCiAJCXRnM19hcGVfbG9ja19pbml0KHRwKTsKQEAgLTEzODY3LDYgKzEzMjU2LDEwIEBACiAJCXRwLT5hcGVyZWdzID0gTlVMTDsKIAl9CiAKK2Vycl9vdXRfZnc6CisJaWYgKHRwLT5mdykKKwkJcmVsZWFzZV9maXJtd2FyZSh0cC0+ZncpOworCiBlcnJfb3V0X2lvdW5tYXA6CiAJaWYgKHRwLT5yZWdzKSB7CiAJCWlvdW5tYXAodHAtPnJlZ3MpOwpAQCAtMTM4OTIsNiArMTMyODUsOSBAQAogCWlmIChkZXYpIHsKIAkJc3RydWN0IHRnMyAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOwogCisJCWlmICh0cC0+ZncpCisJCQlyZWxlYXNlX2Zpcm13YXJlKHRwLT5mdyk7CisKIAkJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKIAogCQlpZiAodHAtPnRnM19mbGFnczMgJiBURzNfRkxHM19VU0VfUEhZTElCKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90ZzMuaCBiL2RyaXZlcnMvbmV0L3RnMy5oCmluZGV4IDg5MzZlZGYuLmFlNWRhNjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3RnMy5oCisrKyBiL2RyaXZlcnMvbmV0L3RnMy5oCkBAIC0yNzYyLDYgKzI3NjIsMTAgQEAKICNkZWZpbmUgU1NUXzI1VkYwWDBfUEFHRV9TSVpFCQk0MDk4CiAKIAlzdHJ1Y3QgZXRodG9vbF9jb2FsZXNjZQkJY29hbDsKKworCS8qIGZpcm13YXJlIGluZm8gKi8KKwljb25zdCBzdHJ1Y3QgZmlybXdhcmUJCSpmdzsKKwl1MzIJCQkJZndfbGVuOyAvKiBpbmNsdWRlcyBCU1MgKi8KIH07CiAKICNlbmRpZiAvKiAhKF9UM19IKSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdGxhbi5jIGIvZHJpdmVycy9uZXQvdGxhbi5jCmluZGV4IDg1ZWY4YjcuLjY4Yjk2N2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3RsYW4uYworKysgYi9kcml2ZXJzL25ldC90bGFuLmMKQEAgLTgzMSw2ICs4MzEsMjEgQEAKIH0KICNlbmRpZgogCitzdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIFRMYW5fbmV0ZGV2X29wcyA9IHsKKwkubmRvX29wZW4gCQk9IFRMYW5fT3BlbiwKKwkubmRvX3N0b3AJCT0gVExhbl9DbG9zZSwKKwkubmRvX3N0YXJ0X3htaXQJCT0gVExhbl9TdGFydFR4LAorCS5uZG9fdHhfdGltZW91dAkJPSBUTGFuX3R4X3RpbWVvdXQsCisJLm5kb19nZXRfc3RhdHMJCT0gVExhbl9HZXRTdGF0cywKKwkubmRvX3NldF9tdWx0aWNhc3RfbGlzdCA9IFRMYW5fU2V0TXVsdGljYXN0TGlzdCwKKwkubmRvX2RvX2lvY3RsCQk9IFRMYW5faW9jdGwsCisJLm5kb19jaGFuZ2VfbXR1CQk9IGV0aF9jaGFuZ2VfbXR1LAorCS5uZG9fc2V0X21hY19hZGRyZXNzIAk9IGV0aF9tYWNfYWRkciwKKwkubmRvX3ZhbGlkYXRlX2FkZHIJPSBldGhfdmFsaWRhdGVfYWRkciwKKyNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgorCS5uZG9fcG9sbF9jb250cm9sbGVyCSA9IFRMYW5fUG9sbCwKKyNlbmRpZgorfTsKIAogCiAKQEAgLTg5MiwxNiArOTA3LDcgQEAKIAluZXRpZl9jYXJyaWVyX29mZihkZXYpOwogCiAJLyogRGV2aWNlIG1ldGhvZHMgKi8KLQlkZXYtPm9wZW4gPSAmVExhbl9PcGVuOwotCWRldi0+aGFyZF9zdGFydF94bWl0ID0gJlRMYW5fU3RhcnRUeDsKLQlkZXYtPnN0b3AgPSAmVExhbl9DbG9zZTsKLQlkZXYtPmdldF9zdGF0cyA9ICZUTGFuX0dldFN0YXRzOwotCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gJlRMYW5fU2V0TXVsdGljYXN0TGlzdDsKLQlkZXYtPmRvX2lvY3RsID0gJlRMYW5faW9jdGw7Ci0jaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKLQlkZXYtPnBvbGxfY29udHJvbGxlciA9ICZUTGFuX1BvbGw7Ci0jZW5kaWYKLQlkZXYtPnR4X3RpbWVvdXQgPSAmVExhbl90eF90aW1lb3V0OworCWRldi0+bmV0ZGV2X29wcyA9ICZUTGFuX25ldGRldl9vcHM7CiAJZGV2LT53YXRjaGRvZ190aW1lbyA9IFRYX1RJTUVPVVQ7CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3Rva2VucmluZy9zbWN0ci5jIGIvZHJpdmVycy9uZXQvdG9rZW5yaW5nL3NtY3RyLmMKaW5kZXggYTAxMTY2Ni4uNTBlYjI5YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdG9rZW5yaW5nL3NtY3RyLmMKKysrIGIvZHJpdmVycy9uZXQvdG9rZW5yaW5nL3NtY3RyLmMKQEAgLTMwNjQsNyArMzA2NCw3IEBACiAgKiB3aWxsIGNvbnNlcXVlbnRseSBjYXVzZSBhIHRpbWVvdXQuCiAgKgogICogTk9URSAxOiBJZiB0aGUgbW9uaXRvcl9zdGF0ZSBpcyBNU19CRUFDT05fVEVTVF9TVEFURSwgYWxsIHRyYW5zbWl0Ci0gKiBxdWV1ZXMgb3RoZXIgdGhlbiB0aGUgb25lIHVzZWQgZm9yIHRoZSBsb2JlX21lZGlhX3Rlc3Qgc2hvdWxkIGJlCisgKiBxdWV1ZXMgb3RoZXIgdGhhbiB0aGUgb25lIHVzZWQgZm9yIHRoZSBsb2JlX21lZGlhX3Rlc3Qgc2hvdWxkIGJlCiAgKiBkaXNhYmxlZC4hPwogICoKICAqIE5PVEUgMjogSWYgdGhlIG1vbml0b3Jfc3RhdGUgaXMgTVNfQkVBQ09OX1RFU1RfU1RBVEUgYW5kIHRoZSByZWNlaXZlX21hc2sKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3R1bGlwL2RlMjEwNHguYyBiL2RyaXZlcnMvbmV0L3R1bGlwL2RlMjEwNHguYwppbmRleCA1MTY2YmU5Li5kNWQ1M2I2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC90dWxpcC9kZTIxMDR4LmMKKysrIGIvZHJpdmVycy9uZXQvdHVsaXAvZGUyMTA0eC5jCkBAIC0xOTIyLDYgKzE5MjIsMTggQEAKIAlnb3RvIGZpbGxfZGVmYXVsdHM7CiB9CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgZGVfbmV0ZGV2X29wcyA9IHsKKwkubmRvX29wZW4JCT0gZGVfb3BlbiwKKwkubmRvX3N0b3AJCT0gZGVfY2xvc2UsCisJLm5kb19zZXRfbXVsdGljYXN0X2xpc3QgPSBkZV9zZXRfcnhfbW9kZSwKKwkubmRvX3N0YXJ0X3htaXQJCT0gZGVfc3RhcnRfeG1pdCwKKwkubmRvX2dldF9zdGF0cwkJPSBkZV9nZXRfc3RhdHMsCisJLm5kb190eF90aW1lb3V0IAk9IGRlX3R4X3RpbWVvdXQsCisJLm5kb19jaGFuZ2VfbXR1CQk9IGV0aF9jaGFuZ2VfbXR1LAorCS5uZG9fc2V0X21hY19hZGRyZXNzIAk9IGV0aF9tYWNfYWRkciwKKwkubmRvX3ZhbGlkYXRlX2FkZHIJPSBldGhfdmFsaWRhdGVfYWRkciwKK307CisKIHN0YXRpYyBpbnQgX19kZXZpbml0IGRlX2luaXRfb25lIChzdHJ1Y3QgcGNpX2RldiAqcGRldiwKIAkJCQkgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCiB7CkBAIC0xOTQ0LDE0ICsxOTU2LDkgQEAKIAlpZiAoIWRldikKIAkJcmV0dXJuIC1FTk9NRU07CiAKKwlkZXYtPm5ldGRldl9vcHMgPSAmZGVfbmV0ZGV2X29wczsKIAlTRVRfTkVUREVWX0RFVihkZXYsICZwZGV2LT5kZXYpOwotCWRldi0+b3BlbiA9IGRlX29wZW47Ci0JZGV2LT5zdG9wID0gZGVfY2xvc2U7Ci0JZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSBkZV9zZXRfcnhfbW9kZTsKLQlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9IGRlX3N0YXJ0X3htaXQ7Ci0JZGV2LT5nZXRfc3RhdHMgPSBkZV9nZXRfc3RhdHM7CiAJZGV2LT5ldGh0b29sX29wcyA9ICZkZV9ldGh0b29sX29wczsKLQlkZXYtPnR4X3RpbWVvdXQgPSBkZV90eF90aW1lb3V0OwogCWRldi0+d2F0Y2hkb2dfdGltZW8gPSBUWF9USU1FT1VUOwogCiAJZGUgPSBuZXRkZXZfcHJpdihkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdHVsaXAvZGU0eDUuYyBiL2RyaXZlcnMvbmV0L3R1bGlwL2RlNHg1LmMKaW5kZXggNjdiZmQ2Zi4uNjQxOGY3NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdHVsaXAvZGU0eDUuYworKysgYi9kcml2ZXJzL25ldC90dWxpcC9kZTR4NS5jCkBAIC0xMDc3LDYgKzEwNzcsMTggQEAKICAgICBtZGVsYXkoMik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogV2FpdCBmb3IgMm1zICovXAogfQogCitzdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIGRlNHg1X25ldGRldl9vcHMgPSB7CisgICAgLm5kb19vcGVuCQk9IGRlNHg1X29wZW4sCisgICAgLm5kb19zdG9wCQk9IGRlNHg1X2Nsb3NlLAorICAgIC5uZG9fc3RhcnRfeG1pdAk9IGRlNHg1X3F1ZXVlX3BrdCwKKyAgICAubmRvX2dldF9zdGF0cwk9IGRlNHg1X2dldF9zdGF0cywKKyAgICAubmRvX3NldF9tdWx0aWNhc3RfbGlzdCA9IHNldF9tdWx0aWNhc3RfbGlzdCwKKyAgICAubmRvX2RvX2lvY3RsCT0gZGU0eDVfaW9jdGwsCisgICAgLm5kb19jaGFuZ2VfbXR1CT0gZXRoX2NoYW5nZV9tdHUsCisgICAgLm5kb19zZXRfbWFjX2FkZHJlc3M9IGV0aF9tYWNfYWRkciwKKyAgICAubmRvX3ZhbGlkYXRlX2FkZHIJPSBldGhfdmFsaWRhdGVfYWRkciwKK307CisKIAogc3RhdGljIGludCBfX2RldmluaXQKIGRlNHg1X2h3X2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdV9sb25nIGlvYmFzZSwgc3RydWN0IGRldmljZSAqZ2VuZGV2KQpAQCAtMTI1OCwxMyArMTI3MCw3IEBACiAKICAgICAvKiBUaGUgREU0WDUtc3BlY2lmaWMgZW50cmllcyBpbiB0aGUgZGV2aWNlIHN0cnVjdHVyZS4gKi8KICAgICBTRVRfTkVUREVWX0RFVihkZXYsIGdlbmRldik7Ci0gICAgZGV2LT5vcGVuID0gJmRlNHg1X29wZW47Ci0gICAgZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSAmZGU0eDVfcXVldWVfcGt0OwotICAgIGRldi0+c3RvcCA9ICZkZTR4NV9jbG9zZTsKLSAgICBkZXYtPmdldF9zdGF0cyA9ICZkZTR4NV9nZXRfc3RhdHM7Ci0gICAgZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSAmc2V0X211bHRpY2FzdF9saXN0OwotICAgIGRldi0+ZG9faW9jdGwgPSAmZGU0eDVfaW9jdGw7Ci0KKyAgICBkZXYtPm5ldGRldl9vcHMgPSAmZGU0eDVfbmV0ZGV2X29wczsKICAgICBkZXYtPm1lbV9zdGFydCA9IDA7CiAKICAgICAvKiBGaWxsIGluIHRoZSBnZW5lcmljIGZpZWxkcyBvZiB0aGUgZGV2aWNlIHN0cnVjdHVyZS4gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3R1bGlwL2RtZmUuYyBiL2RyaXZlcnMvbmV0L3R1bGlwL2RtZmUuYwppbmRleCAyOGE1YzUxLi4yZTVjOTk5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC90dWxpcC9kbWZlLmMKKysrIGIvZHJpdmVycy9uZXQvdHVsaXAvZG1mZS5jCkBAIC0yNTcsOSArMjU3LDYgQEAKIAl1OCB3b2xfbW9kZTsJCQkvKiB1c2VyIFdPTCBzZXR0aW5ncyAqLwogCXN0cnVjdCB0aW1lcl9saXN0IHRpbWVyOwogCi0JLyogU3lzdGVtIGRlZmluZWQgc3RhdGlzdGljIGNvdW50ZXIgKi8KLQlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKLQogCS8qIERyaXZlciBkZWZpbmVkIHN0YXRpc3RpYyBjb3VudGVyICovCiAJdW5zaWduZWQgbG9uZyB0eF9maWZvX3VuZGVycnVuOwogCXVuc2lnbmVkIGxvbmcgdHhfbG9zc19jYXJyaWVyOwpAQCAtMzE2LDcgKzMxMyw2IEBACiBzdGF0aWMgaW50IGRtZmVfb3BlbihzdHJ1Y3QgREVWSUNFICopOwogc3RhdGljIGludCBkbWZlX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKiwgc3RydWN0IERFVklDRSAqKTsKIHN0YXRpYyBpbnQgZG1mZV9zdG9wKHN0cnVjdCBERVZJQ0UgKik7Ci1zdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKiBkbWZlX2dldF9zdGF0cyhzdHJ1Y3QgREVWSUNFICopOwogc3RhdGljIHZvaWQgZG1mZV9zZXRfZmlsdGVyX21vZGUoc3RydWN0IERFVklDRSAqKTsKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZXRodG9vbF9vcHMgbmV0ZGV2X2V0aHRvb2xfb3BzOwogc3RhdGljIHUxNiByZWFkX3Nyb21fd29yZChsb25nICxpbnQpOwpAQCAtMzUxLDYgKzM0NywxOSBAQAogCiAvKiBETTkxMFggbmV0d29yayBib2FyZCByb3V0aW5lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAorc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyBuZXRkZXZfb3BzID0geworCS5uZG9fb3BlbiAJCT0gZG1mZV9vcGVuLAorCS5uZG9fc3RvcAkJPSBkbWZlX3N0b3AsCisJLm5kb19zdGFydF94bWl0CQk9IGRtZmVfc3RhcnRfeG1pdCwKKwkubmRvX3NldF9tdWx0aWNhc3RfbGlzdCA9IGRtZmVfc2V0X2ZpbHRlcl9tb2RlLAorCS5uZG9fY2hhbmdlX210dQkJPSBldGhfY2hhbmdlX210dSwKKwkubmRvX3NldF9tYWNfYWRkcmVzcwk9IGV0aF9tYWNfYWRkciwKKwkubmRvX3ZhbGlkYXRlX2FkZHIJPSBldGhfdmFsaWRhdGVfYWRkciwKKyNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgorCS5uZG9fcG9sbF9jb250cm9sbGVyCT0gcG9sbF9kbWZlLAorI2VuZGlmCit9OworCiAvKgogICoJU2VhcmNoIERNOTEwWCBib2FyZCAsYWxsb2NhdGUgc3BhY2UgYW5kIHJlZ2lzdGVyIGl0CiAgKi8KQEAgLTQ0MiwxNCArNDUxLDcgQEAKIAlkZXYtPmJhc2VfYWRkciA9IGRiLT5pb2FkZHI7CiAJZGV2LT5pcnEgPSBwZGV2LT5pcnE7CiAJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGRldik7Ci0JZGV2LT5vcGVuID0gJmRtZmVfb3BlbjsKLQlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9ICZkbWZlX3N0YXJ0X3htaXQ7Ci0JZGV2LT5zdG9wID0gJmRtZmVfc3RvcDsKLQlkZXYtPmdldF9zdGF0cyA9ICZkbWZlX2dldF9zdGF0czsKLQlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9ICZkbWZlX3NldF9maWx0ZXJfbW9kZTsKLSNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgotCWRldi0+cG9sbF9jb250cm9sbGVyID0gJnBvbGxfZG1mZTsKLSNlbmRpZgorCWRldi0+bmV0ZGV2X29wcyA9ICZuZXRkZXZfb3BzOwogCWRldi0+ZXRodG9vbF9vcHMgPSAmbmV0ZGV2X2V0aHRvb2xfb3BzOwogCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7CiAJc3Bpbl9sb2NrX2luaXQoJmRiLT5sb2NrKTsKQEAgLTg2NywxNSArODY5LDE1IEBACiAKIAkJLyogQSBwYWNrZXQgc2VudCBjb21wbGV0ZWQgKi8KIAkJZGItPnR4X3BhY2tldF9jbnQtLTsKLQkJZGItPnN0YXRzLnR4X3BhY2tldHMrKzsKKwkJZGV2LT5zdGF0cy50eF9wYWNrZXRzKys7CiAKIAkJLyogVHJhbnNtaXQgc3RhdGlzdGljIGNvdW50ZXIgKi8KIAkJaWYgKCB0ZGVzMCAhPSAweDdmZmZmZmZmICkgewogCQkJLyogcHJpbnRrKERSVl9OQU1FICI6IHRkZXMwPSV4XG4iLCB0ZGVzMCk7ICovCi0JCQlkYi0+c3RhdHMuY29sbGlzaW9ucyArPSAodGRlczAgPj4gMykgJiAweGY7Ci0JCQlkYi0+c3RhdHMudHhfYnl0ZXMgKz0gbGUzMl90b19jcHUodHhwdHItPnRkZXMxKSAmIDB4N2ZmOworCQkJZGV2LT5zdGF0cy5jb2xsaXNpb25zICs9ICh0ZGVzMCA+PiAzKSAmIDB4ZjsKKwkJCWRldi0+c3RhdHMudHhfYnl0ZXMgKz0gbGUzMl90b19jcHUodHhwdHItPnRkZXMxKSAmIDB4N2ZmOwogCQkJaWYgKHRkZXMwICYgVERFUzBfRVJSX01BU0spIHsKLQkJCQlkYi0+c3RhdHMudHhfZXJyb3JzKys7CisJCQkJZGV2LT5zdGF0cy50eF9lcnJvcnMrKzsKIAogCQkJCWlmICh0ZGVzMCAmIDB4MDAwMikgewkvKiBVbmRlclJ1biAqLwogCQkJCQlkYi0+dHhfZmlmb191bmRlcnJ1bisrOwpAQCAtOTY5LDEzICs5NzEsMTMgQEAKIAkJCWlmIChyZGVzMCAmIDB4ODAwMCkgewogCQkJCS8qIFRoaXMgaXMgYSBlcnJvciBwYWNrZXQgKi8KIAkJCQkvL3ByaW50ayhEUlZfTkFNRSAiOiByZGVzMDogJWx4XG4iLCByZGVzMCk7Ci0JCQkJZGItPnN0YXRzLnJ4X2Vycm9ycysrOworCQkJCWRldi0+c3RhdHMucnhfZXJyb3JzKys7CiAJCQkJaWYgKHJkZXMwICYgMSkKLQkJCQkJZGItPnN0YXRzLnJ4X2ZpZm9fZXJyb3JzKys7CisJCQkJCWRldi0+c3RhdHMucnhfZmlmb19lcnJvcnMrKzsKIAkJCQlpZiAocmRlczAgJiAyKQotCQkJCQlkYi0+c3RhdHMucnhfY3JjX2Vycm9ycysrOworCQkJCQlkZXYtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKIAkJCQlpZiAocmRlczAgJiAweDgwKQotCQkJCQlkYi0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOworCQkJCQlkZXYtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKIAkJCX0KIAogCQkJaWYgKCAhKHJkZXMwICYgMHg4MDAwKSB8fApAQCAtMTAwOCw4ICsxMDEwLDggQEAKIAogCQkJCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBkZXYpOwogCQkJCQluZXRpZl9yeChza2IpOwotCQkJCQlkYi0+c3RhdHMucnhfcGFja2V0cysrOwotCQkJCQlkYi0+c3RhdHMucnhfYnl0ZXMgKz0gcnhsZW47CisJCQkJCWRldi0+c3RhdHMucnhfcGFja2V0cysrOworCQkJCQlkZXYtPnN0YXRzLnJ4X2J5dGVzICs9IHJ4bGVuOwogCQkJCX0KIAkJCX0gZWxzZSB7CiAJCQkJLyogUmV1c2UgU0tCIGJ1ZmZlciB3aGVuIHRoZSBwYWNrZXQgaXMgZXJyb3IgKi8KQEAgLTEwMjQsMjAgKzEwMjYsNiBAQAogCWRiLT5yeF9yZWFkeV9wdHIgPSByeHB0cjsKIH0KIAotCi0vKgotICoJR2V0IHN0YXRpc3RpY3MgZnJvbSBkcml2ZXIuCi0gKi8KLQotc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICogZG1mZV9nZXRfc3RhdHMoc3RydWN0IERFVklDRSAqZGV2KQotewotCXN0cnVjdCBkbWZlX2JvYXJkX2luZm8gKmRiID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQotCURNRkVfREJVRygwLCAiZG1mZV9nZXRfc3RhdHMiLCAwKTsKLQlyZXR1cm4gJmRiLT5zdGF0czsKLX0KLQotCiAvKgogICogU2V0IERNOTEwWCBtdWx0aWNhc3QgYWRkcmVzcwogICovCkBAIC0xMTYxLDcgKzExNDksNyBAQAogCiAJLyogT3BlcmF0aW5nIE1vZGUgQ2hlY2sgKi8KIAlpZiAoIChkYi0+ZG05MTB4X2Noa19tb2RlICYgMHgxKSAmJgotCQkoZGItPnN0YXRzLnJ4X3BhY2tldHMgPiBNQVhfQ0hFQ0tfUEFDS0VUKSApCisJCShkZXYtPnN0YXRzLnJ4X3BhY2tldHMgPiBNQVhfQ0hFQ0tfUEFDS0VUKSApCiAJCWRiLT5kbTkxMHhfY2hrX21vZGUgPSAweDQ7CiAKIAkvKiBEeW5hbWljIHJlc2V0IERNOTEwWCA6IHN5c3RlbSBlcnJvciBvciB0cmFuc21pdCB0aW1lLW91dCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdHVsaXAvdHVsaXBfY29yZS5jIGIvZHJpdmVycy9uZXQvdHVsaXAvdHVsaXBfY29yZS5jCmluZGV4IGZmODRiYWIuLmJlZTc1ZmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3R1bGlwL3R1bGlwX2NvcmUuYworKysgYi9kcml2ZXJzL25ldC90dWxpcC90dWxpcF9jb3JlLmMKQEAgLTEyMjUsNiArMTIyNSwyMiBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIHR1bGlwX25ldGRldl9vcHMgPSB7CisJLm5kb19vcGVuCQk9IHR1bGlwX29wZW4sCisJLm5kb19zdGFydF94bWl0CQk9IHR1bGlwX3N0YXJ0X3htaXQsCisJLm5kb190eF90aW1lb3V0CQk9IHR1bGlwX3R4X3RpbWVvdXQsCisJLm5kb19zdG9wCQk9IHR1bGlwX2Nsb3NlLAorCS5uZG9fZ2V0X3N0YXRzCQk9IHR1bGlwX2dldF9zdGF0cywKKwkubmRvX2RvX2lvY3RsIAkJPSBwcml2YXRlX2lvY3RsLAorCS5uZG9fc2V0X211bHRpY2FzdF9saXN0ID0gc2V0X3J4X21vZGUsCisJLm5kb19jaGFuZ2VfbXR1CQk9IGV0aF9jaGFuZ2VfbXR1LAorCS5uZG9fc2V0X21hY19hZGRyZXNzCT0gZXRoX21hY19hZGRyLAorCS5uZG9fdmFsaWRhdGVfYWRkcgk9IGV0aF92YWxpZGF0ZV9hZGRyLAorI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCisJLm5kb19wb2xsX2NvbnRyb2xsZXIJID0gcG9sbF90dWxpcCwKKyNlbmRpZgorfTsKKwogc3RhdGljIGludCBfX2RldmluaXQgdHVsaXBfaW5pdF9vbmUgKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAogCQkJCSAgICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKIHsKQEAgLTE2MDEsMjAgKzE2MTcsMTEgQEAKIAl9CiAKIAkvKiBUaGUgVHVsaXAtc3BlY2lmaWMgZW50cmllcyBpbiB0aGUgZGV2aWNlIHN0cnVjdHVyZS4gKi8KLQlkZXYtPm9wZW4gPSB0dWxpcF9vcGVuOwotCWRldi0+aGFyZF9zdGFydF94bWl0ID0gdHVsaXBfc3RhcnRfeG1pdDsKLQlkZXYtPnR4X3RpbWVvdXQgPSB0dWxpcF90eF90aW1lb3V0OworCWRldi0+bmV0ZGV2X29wcyA9ICZ0dWxpcF9uZXRkZXZfb3BzOwogCWRldi0+d2F0Y2hkb2dfdGltZW8gPSBUWF9USU1FT1VUOwogI2lmZGVmIENPTkZJR19UVUxJUF9OQVBJCiAJbmV0aWZfbmFwaV9hZGQoZGV2LCAmdHAtPm5hcGksIHR1bGlwX3BvbGwsIDE2KTsKICNlbmRpZgotCWRldi0+c3RvcCA9IHR1bGlwX2Nsb3NlOwotCWRldi0+Z2V0X3N0YXRzID0gdHVsaXBfZ2V0X3N0YXRzOwotCWRldi0+ZG9faW9jdGwgPSBwcml2YXRlX2lvY3RsOwotCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gc2V0X3J4X21vZGU7Ci0jaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKLQlkZXYtPnBvbGxfY29udHJvbGxlciA9ICZwb2xsX3R1bGlwOwotI2VuZGlmCiAJU0VUX0VUSFRPT0xfT1BTKGRldiwgJm9wcyk7CiAKIAlpZiAocmVnaXN0ZXJfbmV0ZGV2KGRldikpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90dWxpcC91bGk1MjZ4LmMgYi9kcml2ZXJzL25ldC90dWxpcC91bGk1MjZ4LmMKaW5kZXggMDBjYmM1Mi4uMDMwZTAyZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdHVsaXAvdWxpNTI2eC5jCisrKyBiL2RyaXZlcnMvbmV0L3R1bGlwL3VsaTUyNnguYwpAQCAtMTY4LDkgKzE2OCw2IEBACiAJdTggd2FpdF9yZXNldDsJCQkvKiBIYXJkd2FyZSBmYWlsZWQsIG5lZWQgdG8gcmVzZXQgKi8KIAlzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcjsKIAotCS8qIFN5c3RlbSBkZWZpbmVkIHN0YXRpc3RpYyBjb3VudGVyICovCi0Jc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7Ci0KIAkvKiBEcml2ZXIgZGVmaW5lZCBzdGF0aXN0aWMgY291bnRlciAqLwogCXVuc2lnbmVkIGxvbmcgdHhfZmlmb191bmRlcnJ1bjsKIAl1bnNpZ25lZCBsb25nIHR4X2xvc3NfY2FycmllcjsKQEAgLTIyMCw3ICsyMTcsNiBAQAogc3RhdGljIGludCB1bGk1MjZ4X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKik7CiBzdGF0aWMgaW50IHVsaTUyNnhfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqLCBzdHJ1Y3QgbmV0X2RldmljZSAqKTsKIHN0YXRpYyBpbnQgdWxpNTI2eF9zdG9wKHN0cnVjdCBuZXRfZGV2aWNlICopOwotc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICogdWxpNTI2eF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKik7CiBzdGF0aWMgdm9pZCB1bGk1MjZ4X3NldF9maWx0ZXJfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqKTsKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZXRodG9vbF9vcHMgbmV0ZGV2X2V0aHRvb2xfb3BzOwogc3RhdGljIHUxNiByZWFkX3Nyb21fd29yZChsb25nLCBpbnQpOwpAQCAtMjUxLDYgKzI0NywxOSBAQAogCiAvKiBVTEk1MjZYIG5ldHdvcmsgYm9hcmQgcm91dGluZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgbmV0ZGV2X29wcyA9IHsKKwkubmRvX29wZW4JCT0gdWxpNTI2eF9vcGVuLAorCS5uZG9fc3RvcAkJPSB1bGk1MjZ4X3N0b3AsCisJLm5kb19zdGFydF94bWl0CQk9IHVsaTUyNnhfc3RhcnRfeG1pdCwKKwkubmRvX3NldF9tdWx0aWNhc3RfbGlzdCA9IHVsaTUyNnhfc2V0X2ZpbHRlcl9tb2RlLAorCS5uZG9fY2hhbmdlX210dQkJPSBldGhfY2hhbmdlX210dSwKKwkubmRvX3NldF9tYWNfYWRkcmVzcwk9IGV0aF9tYWNfYWRkciwKKwkubmRvX3ZhbGlkYXRlX2FkZHIJPSBldGhfdmFsaWRhdGVfYWRkciwKKyNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgorCS5uZG9fcG9sbF9jb250cm9sbGVyIAk9IHVsaTUyNnhfcG9sbCwKKyNlbmRpZgorfTsKKwogLyoKICAqCVNlYXJjaCBVTEk1MjZYIGJvYXJkLCBhbGxvY2F0ZSBzcGFjZSBhbmQgcmVnaXN0ZXIgaXQKICAqLwpAQCAtMzM1LDE1ICszNDQsOSBAQAogCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBkZXYpOwogCiAJLyogUmVnaXN0ZXIgc29tZSBuZWNlc3NhcnkgZnVuY3Rpb25zICovCi0JZGV2LT5vcGVuID0gJnVsaTUyNnhfb3BlbjsKLQlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9ICZ1bGk1MjZ4X3N0YXJ0X3htaXQ7Ci0JZGV2LT5zdG9wID0gJnVsaTUyNnhfc3RvcDsKLQlkZXYtPmdldF9zdGF0cyA9ICZ1bGk1MjZ4X2dldF9zdGF0czsKLQlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9ICZ1bGk1MjZ4X3NldF9maWx0ZXJfbW9kZTsKKwlkZXYtPm5ldGRldl9vcHMgPSAmbmV0ZGV2X29wczsKIAlkZXYtPmV0aHRvb2xfb3BzID0gJm5ldGRldl9ldGh0b29sX29wczsKLSNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgotCWRldi0+cG9sbF9jb250cm9sbGVyID0gJnVsaTUyNnhfcG9sbDsKLSNlbmRpZgorCiAJc3Bpbl9sb2NrX2luaXQoJmRiLT5sb2NrKTsKIAogCkBAIC03MzMsNyArNzM2LDggQEAKICAqCUZyZWUgVFggcmVzb3VyY2UgYWZ0ZXIgVFggY29tcGxldGUKICAqLwogCi1zdGF0aWMgdm9pZCB1bGk1MjZ4X2ZyZWVfdHhfcGt0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCB1bGk1MjZ4X2JvYXJkX2luZm8gKiBkYikKK3N0YXRpYyB2b2lkIHVsaTUyNnhfZnJlZV90eF9wa3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQlzdHJ1Y3QgdWxpNTI2eF9ib2FyZF9pbmZvICogZGIpCiB7CiAJc3RydWN0IHR4X2Rlc2MgKnR4cHRyOwogCXUzMiB0ZGVzMDsKQEAgLTc0NywxNSArNzUxLDE1IEBACiAKIAkJLyogQSBwYWNrZXQgc2VudCBjb21wbGV0ZWQgKi8KIAkJZGItPnR4X3BhY2tldF9jbnQtLTsKLQkJZGItPnN0YXRzLnR4X3BhY2tldHMrKzsKKwkJZGV2LT5zdGF0cy50eF9wYWNrZXRzKys7CiAKIAkJLyogVHJhbnNtaXQgc3RhdGlzdGljIGNvdW50ZXIgKi8KIAkJaWYgKCB0ZGVzMCAhPSAweDdmZmZmZmZmICkgewogCQkJLyogcHJpbnRrKERSVl9OQU1FICI6IHRkZXMwPSV4XG4iLCB0ZGVzMCk7ICovCi0JCQlkYi0+c3RhdHMuY29sbGlzaW9ucyArPSAodGRlczAgPj4gMykgJiAweGY7Ci0JCQlkYi0+c3RhdHMudHhfYnl0ZXMgKz0gbGUzMl90b19jcHUodHhwdHItPnRkZXMxKSAmIDB4N2ZmOworCQkJZGV2LT5zdGF0cy5jb2xsaXNpb25zICs9ICh0ZGVzMCA+PiAzKSAmIDB4ZjsKKwkJCWRldi0+c3RhdHMudHhfYnl0ZXMgKz0gbGUzMl90b19jcHUodHhwdHItPnRkZXMxKSAmIDB4N2ZmOwogCQkJaWYgKHRkZXMwICYgVERFUzBfRVJSX01BU0spIHsKLQkJCQlkYi0+c3RhdHMudHhfZXJyb3JzKys7CisJCQkJZGV2LT5zdGF0cy50eF9lcnJvcnMrKzsKIAkJCQlpZiAodGRlczAgJiAweDAwMDIpIHsJLyogVW5kZXJSdW4gKi8KIAkJCQkJZGItPnR4X2ZpZm9fdW5kZXJydW4rKzsKIAkJCQkJaWYgKCAhKGRiLT5jcjZfZGF0YSAmIENSNl9TRlQpICkgewpAQCAtODI1LDEzICs4MjksMTMgQEAKIAkJCWlmIChyZGVzMCAmIDB4ODAwMCkgewogCQkJCS8qIFRoaXMgaXMgYSBlcnJvciBwYWNrZXQgKi8KIAkJCQkvL3ByaW50ayhEUlZfTkFNRSAiOiByZGVzMDogJWx4XG4iLCByZGVzMCk7Ci0JCQkJZGItPnN0YXRzLnJ4X2Vycm9ycysrOworCQkJCWRldi0+c3RhdHMucnhfZXJyb3JzKys7CiAJCQkJaWYgKHJkZXMwICYgMSkKLQkJCQkJZGItPnN0YXRzLnJ4X2ZpZm9fZXJyb3JzKys7CisJCQkJCWRldi0+c3RhdHMucnhfZmlmb19lcnJvcnMrKzsKIAkJCQlpZiAocmRlczAgJiAyKQotCQkJCQlkYi0+c3RhdHMucnhfY3JjX2Vycm9ycysrOworCQkJCQlkZXYtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKIAkJCQlpZiAocmRlczAgJiAweDgwKQotCQkJCQlkYi0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOworCQkJCQlkZXYtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKIAkJCX0KIAogCQkJaWYgKCAhKHJkZXMwICYgMHg4MDAwKSB8fApAQCAtODU0LDggKzg1OCw4IEBACiAKIAkJCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBkZXYpOwogCQkJCW5ldGlmX3J4KHNrYik7Ci0JCQkJZGItPnN0YXRzLnJ4X3BhY2tldHMrKzsKLQkJCQlkYi0+c3RhdHMucnhfYnl0ZXMgKz0gcnhsZW47CisJCQkJZGV2LT5zdGF0cy5yeF9wYWNrZXRzKys7CisJCQkJZGV2LT5zdGF0cy5yeF9ieXRlcyArPSByeGxlbjsKIAogCQkJfSBlbHNlIHsKIAkJCQkvKiBSZXVzZSBTS0IgYnVmZmVyIHdoZW4gdGhlIHBhY2tldCBpcyBlcnJvciAqLwpAQCAtODcyLDE5ICs4NzYsNiBAQAogCiAKIC8qCi0gKglHZXQgc3RhdGlzdGljcyBmcm9tIGRyaXZlci4KLSAqLwotCi1zdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKiB1bGk1MjZ4X2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQotewotCXN0cnVjdCB1bGk1MjZ4X2JvYXJkX2luZm8gKmRiID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQotCVVMSTUyNlhfREJVRygwLCAidWxpNTI2eF9nZXRfc3RhdHMiLCAwKTsKLQlyZXR1cm4gJmRiLT5zdGF0czsKLX0KLQotCi0vKgogICogU2V0IFVMSTUyNlggbXVsdGljYXN0IGFkZHJlc3MKICAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90dWxpcC93aW5ib25kLTg0MC5jIGIvZHJpdmVycy9uZXQvdHVsaXAvd2luYm9uZC04NDAuYwppbmRleCAwMjJkOTlhLi5mNDY3YmY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC90dWxpcC93aW5ib25kLTg0MC5jCisrKyBiL2RyaXZlcnMvbmV0L3R1bGlwL3dpbmJvbmQtODQwLmMKQEAgLTM0Myw3ICszNDMsMTggQEAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZXRodG9vbF9vcHMgbmV0ZGV2X2V0aHRvb2xfb3BzOwogc3RhdGljIGludCAgbmV0ZGV2X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogCi0KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgbmV0ZGV2X29wcyA9IHsKKwkubmRvX29wZW4JCT0gbmV0ZGV2X29wZW4sCisJLm5kb19zdG9wCQk9IG5ldGRldl9jbG9zZSwKKwkubmRvX3N0YXJ0X3htaXQJCT0gc3RhcnRfdHgsCisJLm5kb19nZXRfc3RhdHMJCT0gZ2V0X3N0YXRzLAorCS5uZG9fc2V0X211bHRpY2FzdF9saXN0ID0gc2V0X3J4X21vZGUsCisJLm5kb19kb19pb2N0bAkJPSBuZXRkZXZfaW9jdGwsCisJLm5kb190eF90aW1lb3V0CQk9IHR4X3RpbWVvdXQsCisJLm5kb19jaGFuZ2VfbXR1CQk9IGV0aF9jaGFuZ2VfbXR1LAorCS5uZG9fc2V0X21hY19hZGRyZXNzCT0gZXRoX21hY19hZGRyLAorCS5uZG9fdmFsaWRhdGVfYWRkcgk9IGV0aF92YWxpZGF0ZV9hZGRyLAorfTsKIAogc3RhdGljIGludCBfX2RldmluaXQgdzg0MF9wcm9iZTEgKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAogCQkJCSAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKQEAgLTQyMCwxNCArNDMxLDggQEAKIAkJbnAtPm1paV9pZi5mb3JjZV9tZWRpYSA9IDE7CiAKIAkvKiBUaGUgY2hpcC1zcGVjaWZpYyBlbnRyaWVzIGluIHRoZSBkZXZpY2Ugc3RydWN0dXJlLiAqLwotCWRldi0+b3BlbiA9ICZuZXRkZXZfb3BlbjsKLQlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9ICZzdGFydF90eDsKLQlkZXYtPnN0b3AgPSAmbmV0ZGV2X2Nsb3NlOwotCWRldi0+Z2V0X3N0YXRzID0gJmdldF9zdGF0czsKLQlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9ICZzZXRfcnhfbW9kZTsKLQlkZXYtPmRvX2lvY3RsID0gJm5ldGRldl9pb2N0bDsKKwlkZXYtPm5ldGRldl9vcHMgPSAmbmV0ZGV2X29wczsKIAlkZXYtPmV0aHRvb2xfb3BzID0gJm5ldGRldl9ldGh0b29sX29wczsKLQlkZXYtPnR4X3RpbWVvdXQgPSAmdHhfdGltZW91dDsKIAlkZXYtPndhdGNoZG9nX3RpbWVvID0gVFhfVElNRU9VVDsKIAogCWkgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKQEAgLTE1NTUsNyArMTU2MCw3IEBACiAgKiAJcnRubF9sb2NrLCAmIG5ldGlmX2RldmljZV9kZXRhY2ggYWZ0ZXIgdGhlIHJ0bmxfdW5sb2NrLgogICogLSBnZXRfc3RhdHM6CiAgKiAJc3Bpbl9sb2NrX2lycShucC0+bG9jayksIGRvZXNuJ3QgdG91Y2ggaHcgaWYgbm90IHByZXNlbnQKLSAqIC0gaGFyZF9zdGFydF94bWl0OgorICogLSBzdGFydF94bWl0OgogICogCXN5bmNocm9uaXplX2lycSArIG5ldGlmX3R4X2Rpc2FibGU7CiAgKiAtIHR4X3RpbWVvdXQ6CiAgKiAJbmV0aWZfZGV2aWNlX2RldGFjaCArIG5ldGlmX3R4X2Rpc2FibGU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90dWxpcC94aXJjb21fY2IuYyBiL2RyaXZlcnMvbmV0L3R1bGlwL3hpcmNvbV9jYi5jCmluZGV4IDEzYzg3MDMuLmMyY2E5ZjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3R1bGlwL3hpcmNvbV9jYi5jCisrKyBiL2RyaXZlcnMvbmV0L3R1bGlwL3hpcmNvbV9jYi5jCkBAIC0xMDQsMTAgKzEwNCw4IEBACiAJICovCiAJc3BpbmxvY2tfdCBsb2NrOwogCi0KIAlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OwotCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOwogfTsKIAogCkBAIC0xMTksNyArMTE3LDYgQEAKIHN0YXRpYyBpbnQgeGlyY29tX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiBzdGF0aWMgaW50IHhpcmNvbV9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIHN0YXRpYyB2b2lkIHhpcmNvbV91cChzdHJ1Y3QgeGlyY29tX3ByaXZhdGUgKmNhcmQpOwotc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICp4aXJjb21fZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCiBzdGF0aWMgdm9pZCB4aXJjb21fcG9sbF9jb250cm9sbGVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogI2VuZGlmCkBAIC0xOTQsNiArMTkxLDE4IEBACiAJLmdldF9kcnZpbmZvCQk9IG5ldGRldl9nZXRfZHJ2aW5mbywKIH07CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgbmV0ZGV2X29wcyA9IHsKKwkubmRvX29wZW4JCT0geGlyY29tX29wZW4sCisJLm5kb19zdG9wCQk9IHhpcmNvbV9jbG9zZSwKKwkubmRvX3N0YXJ0X3htaXQJCT0geGlyY29tX3N0YXJ0X3htaXQsCisJLm5kb19jaGFuZ2VfbXR1CQk9IGV0aF9jaGFuZ2VfbXR1LAorCS5uZG9fc2V0X21hY19hZGRyZXNzCT0gZXRoX21hY19hZGRyLAorCS5uZG9fdmFsaWRhdGVfYWRkcgk9IGV0aF92YWxpZGF0ZV9hZGRyLAorI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCisJLm5kb19wb2xsX2NvbnRyb2xsZXIJPSB4aXJjb21fcG9sbF9jb250cm9sbGVyLAorI2VuZGlmCit9OworCiAvKiB4aXJjb21fcHJvYmUgaXMgdGhlIGNvZGUgdGhhdCBnZXRzIGNhbGxlZCBvbiBkZXZpY2UgaW5zZXJ0aW9uLgogICAgaXQgc2V0cyB1cCB0aGUgaGFyZHdhcmUgYW5kIHJlZ2lzdGVycyB0aGUgZGV2aWNlIHRvIHRoZSBuZXR3b3JrbGF5ZXIuCiAKQEAgLTI2NiwxMyArMjc1LDcgQEAKIAlyZWFkX21hY19hZGRyZXNzKHByaXZhdGUpOwogCXNldHVwX2Rlc2NyaXB0b3JzKHByaXZhdGUpOwogCi0JZGV2LT5vcGVuID0gJnhpcmNvbV9vcGVuOwotCWRldi0+aGFyZF9zdGFydF94bWl0ID0gJnhpcmNvbV9zdGFydF94bWl0OwotCWRldi0+c3RvcCA9ICZ4aXJjb21fY2xvc2U7Ci0JZGV2LT5nZXRfc3RhdHMgPSAmeGlyY29tX2dldF9zdGF0czsKLSNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgotCWRldi0+cG9sbF9jb250cm9sbGVyID0gJnhpcmNvbV9wb2xsX2NvbnRyb2xsZXI7Ci0jZW5kaWYKKwlkZXYtPm5ldGRldl9vcHMgPSAmbmV0ZGV2X29wczsKIAlTRVRfRVRIVE9PTF9PUFMoZGV2LCAmbmV0ZGV2X2V0aHRvb2xfb3BzKTsKIAlwY2lfc2V0X2RydmRhdGEocGRldiwgZGV2KTsKIApAQCAtNDk3LDE0ICs1MDAsNiBAQAogfQogCiAKLQotc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICp4aXJjb21fZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0gICAgICAgIHN0cnVjdCB4aXJjb21fcHJpdmF0ZSAqY2FyZCA9IG5ldGRldl9wcml2KGRldik7Ci0gICAgICAgIHJldHVybiAmY2FyZC0+c3RhdHM7Ci19Ci0KLQogI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCiBzdGF0aWMgdm9pZCB4aXJjb21fcG9sbF9jb250cm9sbGVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CkBAIC0xMTkzLDcgKzExODgsNyBAQAogCiAJCQlza2IgPSBkZXZfYWxsb2Nfc2tiKHBrdF9sZW4gKyAyKTsKIAkJCWlmIChza2IgPT0gTlVMTCkgewotCQkJCWNhcmQtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJCQlkZXYtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKIAkJCQlnb3RvIG91dDsKIAkJCX0KIAkJCXNrYl9yZXNlcnZlKHNrYiwgMik7CkBAIC0xMjAxLDggKzExOTYsOCBAQAogCQkJc2tiX3B1dChza2IsIHBrdF9sZW4pOwogCQkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKIAkJCW5ldGlmX3J4KHNrYik7Ci0JCQljYXJkLT5zdGF0cy5yeF9wYWNrZXRzKys7Ci0JCQljYXJkLT5zdGF0cy5yeF9ieXRlcyArPSBwa3RfbGVuOworCQkJZGV2LT5zdGF0cy5yeF9wYWNrZXRzKys7CisJCQlkZXYtPnN0YXRzLnJ4X2J5dGVzICs9IHBrdF9sZW47CiAKIAkJICAgICAgb3V0OgogCQkJLyogZ2l2ZSB0aGUgYnVmZmVyIGJhY2sgdG8gdGhlIGNhcmQgKi8KQEAgLTEyMzIsMTYgKzEyMjcsMTYgQEAKICNlbmRpZgogCQlpZiAoc3RhdHVzID4gMCkgewkvKiBiaXQgMzEgaXMgMCB3aGVuIGRvbmUgKi8KIAkJCWlmIChjYXJkLT50eF9za2JbZGVzY25yXSE9TlVMTCkgewotCQkJCWNhcmQtPnN0YXRzLnR4X2J5dGVzICs9IGNhcmQtPnR4X3NrYltkZXNjbnJdLT5sZW47CisJCQkJZGV2LT5zdGF0cy50eF9ieXRlcyArPSBjYXJkLT50eF9za2JbZGVzY25yXS0+bGVuOwogCQkJCWRldl9rZnJlZV9za2JfaXJxKGNhcmQtPnR4X3NrYltkZXNjbnJdKTsKIAkJCX0KIAkJCWNhcmQtPnR4X3NrYltkZXNjbnJdID0gTlVMTDsKIAkJCS8qIEJpdCA4IGluIHRoZSBzdGF0dXMgZmllbGQgaXMgMSBpZiB0aGVyZSB3YXMgYSBjb2xsaXNpb24gKi8KIAkJCWlmIChzdGF0dXMmKDE8PDgpKQotCQkJCWNhcmQtPnN0YXRzLmNvbGxpc2lvbnMrKzsKKwkJCQlkZXYtPnN0YXRzLmNvbGxpc2lvbnMrKzsKIAkJCWNhcmQtPnR4X2J1ZmZlcls0KmRlc2Nucl0gPSAwOyAvKiBkZXNjcmlwdG9yIGlzIGZyZWUgYWdhaW4gKi8KIAkJCW5ldGlmX3dha2VfcXVldWUgKGRldik7Ci0JCQljYXJkLT5zdGF0cy50eF9wYWNrZXRzKys7CisJCQlkZXYtPnN0YXRzLnR4X3BhY2tldHMrKzsKIAkJfQogCiAJCWxlYXZlKCJpbnZlc3RpZ2F0ZV93cml0ZV9kZXNjcmlwdG9yIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90dW4uYyBiL2RyaXZlcnMvbmV0L3R1bi5jCmluZGV4IDY5ZjlhMGUuLmQ3YjgxZTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3R1bi5jCisrKyBiL2RyaXZlcnMvbmV0L3R1bi5jCkBAIC0yMTMsNyArMjEzLDcgQEAKIAogLyogTmV0d29yayBkZXZpY2UgcGFydCBvZiB0aGUgZHJpdmVyICovCiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgdHVuX25ldF9pZDsKK3N0YXRpYyBpbnQgdHVuX25ldF9pZDsKIHN0cnVjdCB0dW5fbmV0IHsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGRldl9saXN0OwogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3R5cGhvb24uYyBiL2RyaXZlcnMvbmV0L3R5cGhvb24uYwppbmRleCAwMDA5ZjRlLi4zYWY5YTk1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC90eXBob29uLmMKKysrIGIvZHJpdmVycy9uZXQvdHlwaG9vbi5jCkBAIC0yMjk2LDYgKzIyOTYsMTkgQEAKIAlyZXR1cm4gbW9kZTsKIH0KIAorc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyB0eXBob29uX25ldGRldl9vcHMgPSB7CisJLm5kb19vcGVuCQk9IHR5cGhvb25fb3BlbiwKKwkubmRvX3N0b3AJCT0gdHlwaG9vbl9jbG9zZSwKKwkubmRvX3N0YXJ0X3htaXQJCT0gdHlwaG9vbl9zdGFydF90eCwKKwkubmRvX3NldF9tdWx0aWNhc3RfbGlzdAk9IHR5cGhvb25fc2V0X3J4X21vZGUsCisJLm5kb190eF90aW1lb3V0CQk9IHR5cGhvb25fdHhfdGltZW91dCwKKwkubmRvX2dldF9zdGF0cwkJPSB0eXBob29uX2dldF9zdGF0cywKKwkubmRvX3ZhbGlkYXRlX2FkZHIJPSBldGhfdmFsaWRhdGVfYWRkciwKKwkubmRvX3NldF9tYWNfYWRkcmVzcwk9IHR5cGhvb25fc2V0X21hY19hZGRyZXNzLAorCS5uZG9fY2hhbmdlX210dQkJPSBldGhfY2hhbmdlX210dSwKKwkubmRvX3ZsYW5fcnhfcmVnaXN0ZXIJPSB0eXBob29uX3ZsYW5fcnhfcmVnaXN0ZXIsCit9OworCiBzdGF0aWMgaW50IF9fZGV2aW5pdAogdHlwaG9vbl9pbml0X29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKIHsKQEAgLTI0OTUsMTYgKzI1MDgsOSBAQAogCX0KIAogCS8qIFRoZSBjaGlwLXNwZWNpZmljIGVudHJpZXMgaW4gdGhlIGRldmljZSBzdHJ1Y3R1cmUuICovCi0JZGV2LT5vcGVuCQk9IHR5cGhvb25fb3BlbjsKLQlkZXYtPmhhcmRfc3RhcnRfeG1pdAk9IHR5cGhvb25fc3RhcnRfdHg7Ci0JZGV2LT5zdG9wCQk9IHR5cGhvb25fY2xvc2U7Ci0JZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QJPSB0eXBob29uX3NldF9yeF9tb2RlOwotCWRldi0+dHhfdGltZW91dAkJPSB0eXBob29uX3R4X3RpbWVvdXQ7CisJZGV2LT5uZXRkZXZfb3BzCQk9ICZ0eXBob29uX25ldGRldl9vcHM7CiAJbmV0aWZfbmFwaV9hZGQoZGV2LCAmdHAtPm5hcGksIHR5cGhvb25fcG9sbCwgMTYpOwogCWRldi0+d2F0Y2hkb2dfdGltZW8JPSBUWF9USU1FT1VUOwotCWRldi0+Z2V0X3N0YXRzCQk9IHR5cGhvb25fZ2V0X3N0YXRzOwotCWRldi0+c2V0X21hY19hZGRyZXNzCT0gdHlwaG9vbl9zZXRfbWFjX2FkZHJlc3M7Ci0JZGV2LT52bGFuX3J4X3JlZ2lzdGVyCT0gdHlwaG9vbl92bGFuX3J4X3JlZ2lzdGVyOwogCiAJU0VUX0VUSFRPT0xfT1BTKGRldiwgJnR5cGhvb25fZXRodG9vbF9vcHMpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC91c2IvZG05NjAxLmMgYi9kcml2ZXJzL25ldC91c2IvZG05NjAxLmMKaW5kZXggZWRkMjQ0Zi4uNWI2N2JiZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdXNiL2RtOTYwMS5jCisrKyBiL2RyaXZlcnMvbmV0L3VzYi9kbTk2MDEuYwpAQCAtMjMsNyArMjMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3VzYi91c2JuZXQuaD4KIAogLyogZGF0YXNoZWV0OgotIGh0dHA6Ly93d3cuZGF2aWNvbS5jb20udHcvYmlnNS9kb3dubG9hZC9EYXRhJTIwU2hlZXQvRE05NjAxLURTLVAwMS05MzA5MTQucGRmCisgaHR0cDovL3B0bTIuY2MudXR1LmZpL2Z0cC9uZXR3b3JrL2NhcmRzL0RNOTYwMS9Gcm9tX05FVC9ETTk2MDEtRFMtUDAxLTkzMDkxNC5wZGYKICovCiAKIC8qIGNvbnRyb2wgcmVxdWVzdHMgKi8KQEAgLTM5NywxNiArMzk3LDI0IEBACiAJZG1fd3JpdGVfcmVnX2FzeW5jKGRldiwgRE1fUlhfQ1RSTCwgcnhfY3RsKTsKIH0KIAorc3RhdGljIHZvaWQgX19kbTk2MDFfc2V0X21hY19hZGRyZXNzKHN0cnVjdCB1c2JuZXQgKmRldikKK3sKKwlkbV93cml0ZV9hc3luYyhkZXYsIERNX1BIWV9BRERSLCBFVEhfQUxFTiwgZGV2LT5uZXQtPmRldl9hZGRyKTsKK30KKwogc3RhdGljIGludCBkbTk2MDFfc2V0X21hY19hZGRyZXNzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXQsIHZvaWQgKnApCiB7CiAJc3RydWN0IHNvY2thZGRyICphZGRyID0gcDsKIAlzdHJ1Y3QgdXNibmV0ICpkZXYgPSBuZXRkZXZfcHJpdihuZXQpOwogCi0JaWYgKCFpc192YWxpZF9ldGhlcl9hZGRyKGFkZHItPnNhX2RhdGEpKQorCWlmICghaXNfdmFsaWRfZXRoZXJfYWRkcihhZGRyLT5zYV9kYXRhKSkgeworCQlkZXZfZXJyKCZuZXQtPmRldiwgIm5vdCBzZXR0aW5nIGludmFsaWQgbWFjIGFkZHJlc3MgJXBNXG4iLAorCQkJCQkJCQlhZGRyLT5zYV9kYXRhKTsKIAkJcmV0dXJuIC1FSU5WQUw7CisJfQogCiAJbWVtY3B5KG5ldC0+ZGV2X2FkZHIsIGFkZHItPnNhX2RhdGEsIG5ldC0+YWRkcl9sZW4pOwotCWRtX3dyaXRlX2FzeW5jKGRldiwgRE1fUEhZX0FERFIsIG5ldC0+YWRkcl9sZW4sIG5ldC0+ZGV2X2FkZHIpOworCV9fZG05NjAxX3NldF9tYWNfYWRkcmVzcyhkZXYpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC00MTQsNiArNDIyLDcgQEAKIHN0YXRpYyBpbnQgZG05NjAxX2JpbmQoc3RydWN0IHVzYm5ldCAqZGV2LCBzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKIHsKIAlpbnQgcmV0OworCXU4IG1hY1tFVEhfQUxFTl07CiAKIAlyZXQgPSB1c2JuZXRfZ2V0X2VuZHBvaW50cyhkZXYsIGludGYpOwogCWlmIChyZXQpCkBAIC00MzgsMTIgKzQ0NywyNCBAQAogCXVkZWxheSgyMCk7CiAKIAkvKiByZWFkIE1BQyAqLwotCWlmIChkbV9yZWFkKGRldiwgRE1fUEhZX0FERFIsIEVUSF9BTEVOLCBkZXYtPm5ldC0+ZGV2X2FkZHIpIDwgMCkgeworCWlmIChkbV9yZWFkKGRldiwgRE1fUEhZX0FERFIsIEVUSF9BTEVOLCBtYWMpIDwgMCkgewogCQlwcmludGsoS0VSTl9FUlIgIkVycm9yIHJlYWRpbmcgTUFDIGFkZHJlc3NcbiIpOwogCQlyZXQgPSAtRU5PREVWOwogCQlnb3RvIG91dDsKIAl9CiAKKwkvKgorCSAqIE92ZXJ3cml0ZSB0aGUgYXV0by1nZW5lcmF0ZWQgYWRkcmVzcyBvbmx5IHdpdGggZ29vZCBvbmVzLgorCSAqLworCWlmIChpc192YWxpZF9ldGhlcl9hZGRyKG1hYykpCisJCW1lbWNweShkZXYtPm5ldC0+ZGV2X2FkZHIsIG1hYywgRVRIX0FMRU4pOworCWVsc2UgeworCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkiZG05NjAxOiBObyB2YWxpZCBNQUMgYWRkcmVzcyBpbiBFRVBST00sIHVzaW5nICVwTVxuIiwKKwkJCWRldi0+bmV0LT5kZXZfYWRkcik7CisJCV9fZG05NjAxX3NldF9tYWNfYWRkcmVzcyhkZXYpOworCX0KKwogCS8qIHBvd2VyIHVwIHBoeSAqLwogCWRtX3dyaXRlX3JlZyhkZXYsIERNX0dQUl9DVFJMLCAxKTsKIAlkbV93cml0ZV9yZWcoZGV2LCBETV9HUFJfREFUQSwgMCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC91c2Iva2F3ZXRoLmMgYi9kcml2ZXJzL25ldC91c2Iva2F3ZXRoLmMKaW5kZXggMmVlMDM0Zi4uN2NiMTBhMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdXNiL2thd2V0aC5jCisrKyBiL2RyaXZlcnMvbmV0L3VzYi9rYXdldGguYwpAQCAtMjUxLDcgKzI1MSw2IEBACiAJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CiB9OwogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAga2F3ZXRoX2NvbnRyb2wKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMjgzLDkgKzI4Miw5IEBACiAKIAlkci0+YlJlcXVlc3RUeXBlPSByZXF1ZXN0dHlwZTsKIAlkci0+YlJlcXVlc3QgPSByZXF1ZXN0OwotCWRyLT53VmFsdWUgPSBjcHVfdG9fbGUxNnAoJnZhbHVlKTsKLQlkci0+d0luZGV4ID0gY3B1X3RvX2xlMTZwKCZpbmRleCk7Ci0JZHItPndMZW5ndGggPSBjcHVfdG9fbGUxNnAoJnNpemUpOworCWRyLT53VmFsdWUgPSBjcHVfdG9fbGUxNih2YWx1ZSk7CisJZHItPndJbmRleCA9IGNwdV90b19sZTE2KGluZGV4KTsKKwlkci0+d0xlbmd0aCA9IGNwdV90b19sZTE2KHNpemUpOwogCiAJcmV0dXJuIGthd2V0aF9pbnRlcm5hbF9jb250cm9sX21zZyhrYXdldGgtPmRldiwKIAkJCQkJcGlwZSwKQEAgLTk3NSw2ICs5NzQsMTcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAga2F3ZXRoX3Byb2JlCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCitzdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIGthd2V0aF9uZXRkZXZfb3BzID0geworCS5uZG9fb3BlbiA9CQkJa2F3ZXRoX29wZW4sCisJLm5kb19zdG9wID0JCQlrYXdldGhfY2xvc2UsCisJLm5kb19zdGFydF94bWl0ID0JCWthd2V0aF9zdGFydF94bWl0LAorCS5uZG9fdHhfdGltZW91dCA9CQlrYXdldGhfdHhfdGltZW91dCwKKwkubmRvX3NldF9tdWx0aWNhc3RfbGlzdCA9CWthd2V0aF9zZXRfcnhfbW9kZSwKKwkubmRvX2dldF9zdGF0cyA9CQlrYXdldGhfbmV0ZGV2X3N0YXRzLAorfTsKKwogc3RhdGljIGludCBrYXdldGhfcHJvYmUoCiAJCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLAogCQljb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQgICAgICAvKiBmcm9tIGlkX3RhYmxlICovCkBAIC0xMTQ3LDIyICsxMTU3LDEzIEBACiAJbWVtY3B5KG5ldGRldi0+ZGV2X2FkZHIsICZrYXdldGgtPmNvbmZpZ3VyYXRpb24uaHdfYWRkciwKICAgICAgICAgICAgICAgIHNpemVvZihrYXdldGgtPmNvbmZpZ3VyYXRpb24uaHdfYWRkcikpOwogCi0JbmV0ZGV2LT5vcGVuID0ga2F3ZXRoX29wZW47Ci0JbmV0ZGV2LT5zdG9wID0ga2F3ZXRoX2Nsb3NlOwotCisJbmV0ZGV2LT5uZXRkZXZfb3BzID0gJmthd2V0aF9uZXRkZXZfb3BzOwogCW5ldGRldi0+d2F0Y2hkb2dfdGltZW8gPSBLQVdFVEhfVFhfVElNRU9VVDsKLQluZXRkZXYtPnR4X3RpbWVvdXQgPSBrYXdldGhfdHhfdGltZW91dDsKLQotCW5ldGRldi0+aGFyZF9zdGFydF94bWl0ID0ga2F3ZXRoX3N0YXJ0X3htaXQ7Ci0JbmV0ZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSBrYXdldGhfc2V0X3J4X21vZGU7Ci0JbmV0ZGV2LT5nZXRfc3RhdHMgPSBrYXdldGhfbmV0ZGV2X3N0YXRzOwogCW5ldGRldi0+bXR1ID0gbGUxNl90b19jcHUoa2F3ZXRoLT5jb25maWd1cmF0aW9uLnNlZ21lbnRfc2l6ZSk7CiAJU0VUX0VUSFRPT0xfT1BTKG5ldGRldiwgJm9wcyk7CiAKIAkvKiBrYXdldGggaXMgemVyb2VkIGFzIHBhcnQgb2YgYWxsb2NfbmV0ZGV2ICovCi0KIAlJTklUX0RFTEFZRURfV09SSygma2F3ZXRoLT5sb3dtZW1fd29yaywga2F3ZXRoX3Jlc3VibWl0X3RsKTsKLQogCXVzYl9zZXRfaW50ZmRhdGEoaW50Ziwga2F3ZXRoKTsKIAogI2lmIDAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3VzYi9wZWdhc3VzLmMgYi9kcml2ZXJzL25ldC91c2IvcGVnYXN1cy5jCmluZGV4IDE2Njg4MGMuLmE4MjI4ZDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3VzYi9wZWdhc3VzLmMKKysrIGIvZHJpdmVycy9uZXQvdXNiL3BlZ2FzdXMuYwpAQCAtOTMsNiArOTMsNyBAQAogTU9EVUxFX1BBUk1fREVTQyAobXNnX2xldmVsLCAiT3ZlcnJpZGUgZGVmYXVsdCBtZXNzYWdlIGxldmVsIik7CiAKIE1PRFVMRV9ERVZJQ0VfVEFCTEUodXNiLCBwZWdhc3VzX2lkcyk7CitzdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIHBlZ2FzdXNfbmV0ZGV2X29wczsKIAogc3RhdGljIGludCB1cGRhdGVfZXRoX3JlZ3NfYXN5bmMocGVnYXN1c190ICopOwogLyogQWFyZ2ghISEgSSBfcmVhbGx5XyBoYXRlIHN1Y2ggdHdlYWtzICovCkBAIC0xNTAsOCArMTUxLDggQEAKIAlwZWdhc3VzLT5kci5iUmVxdWVzdFR5cGUgPSBQRUdBU1VTX1JFUVRfUkVBRDsKIAlwZWdhc3VzLT5kci5iUmVxdWVzdCA9IFBFR0FTVVNfUkVRX0dFVF9SRUdTOwogCXBlZ2FzdXMtPmRyLndWYWx1ZSA9IGNwdV90b19sZTE2KDApOwotCXBlZ2FzdXMtPmRyLndJbmRleCA9IGNwdV90b19sZTE2cCgmaW5keCk7Ci0JcGVnYXN1cy0+ZHIud0xlbmd0aCA9IGNwdV90b19sZTE2cCgmc2l6ZSk7CisJcGVnYXN1cy0+ZHIud0luZGV4ID0gY3B1X3RvX2xlMTYoaW5keCk7CisJcGVnYXN1cy0+ZHIud0xlbmd0aCA9IGNwdV90b19sZTE2KHNpemUpOwogCXBlZ2FzdXMtPmN0cmxfdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID0gc2l6ZTsKIAogCXVzYl9maWxsX2NvbnRyb2xfdXJiKHBlZ2FzdXMtPmN0cmxfdXJiLCBwZWdhc3VzLT51c2IsCkBAIC0yMDgsOCArMjA5LDggQEAKIAlwZWdhc3VzLT5kci5iUmVxdWVzdFR5cGUgPSBQRUdBU1VTX1JFUVRfV1JJVEU7CiAJcGVnYXN1cy0+ZHIuYlJlcXVlc3QgPSBQRUdBU1VTX1JFUV9TRVRfUkVHUzsKIAlwZWdhc3VzLT5kci53VmFsdWUgPSBjcHVfdG9fbGUxNigwKTsKLQlwZWdhc3VzLT5kci53SW5kZXggPSBjcHVfdG9fbGUxNnAoJmluZHgpOwotCXBlZ2FzdXMtPmRyLndMZW5ndGggPSBjcHVfdG9fbGUxNnAoJnNpemUpOworCXBlZ2FzdXMtPmRyLndJbmRleCA9IGNwdV90b19sZTE2KGluZHgpOworCXBlZ2FzdXMtPmRyLndMZW5ndGggPSBjcHVfdG9fbGUxNihzaXplKTsKIAlwZWdhc3VzLT5jdHJsX3VyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCA9IHNpemU7CiAKIAl1c2JfZmlsbF9jb250cm9sX3VyYihwZWdhc3VzLT5jdHJsX3VyYiwgcGVnYXN1cy0+dXNiLApAQCAtMjYxLDcgKzI2Miw3IEBACiAJcGVnYXN1cy0+ZHIuYlJlcXVlc3RUeXBlID0gUEVHQVNVU19SRVFUX1dSSVRFOwogCXBlZ2FzdXMtPmRyLmJSZXF1ZXN0ID0gUEVHQVNVU19SRVFfU0VUX1JFRzsKIAlwZWdhc3VzLT5kci53VmFsdWUgPSBjcHVfdG9fbGUxNihkYXRhKTsKLQlwZWdhc3VzLT5kci53SW5kZXggPSBjcHVfdG9fbGUxNnAoJmluZHgpOworCXBlZ2FzdXMtPmRyLndJbmRleCA9IGNwdV90b19sZTE2KGluZHgpOwogCXBlZ2FzdXMtPmRyLndMZW5ndGggPSBjcHVfdG9fbGUxNigxKTsKIAlwZWdhc3VzLT5jdHJsX3VyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCA9IDE7CiAKQEAgLTQ3Niw3ICs0NzcsNyBAQAogCiAJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgewogCQlyZWFkX2Vwcm9tX3dvcmQocGVnYXN1cywgaSwgJncxNik7Ci0JCSgoX19sZTE2ICopIGlkKVtpXSA9IGNwdV90b19sZTE2cCgmdzE2KTsKKwkJKChfX2xlMTYgKikgaWQpW2ldID0gY3B1X3RvX2xlMTYodzE2KTsKIAl9CiB9CiAKQEAgLTEzNjAsMTQgKzEzNjEsMTAgQEAKIAlwZWdhc3VzLT5pbnRmID0gaW50ZjsKIAlwZWdhc3VzLT51c2IgPSBkZXY7CiAJcGVnYXN1cy0+bmV0ID0gbmV0OwotCW5ldC0+b3BlbiA9IHBlZ2FzdXNfb3BlbjsKLQluZXQtPnN0b3AgPSBwZWdhc3VzX2Nsb3NlOworCisKIAluZXQtPndhdGNoZG9nX3RpbWVvID0gUEVHQVNVU19UWF9USU1FT1VUOwotCW5ldC0+dHhfdGltZW91dCA9IHBlZ2FzdXNfdHhfdGltZW91dDsKLQluZXQtPmRvX2lvY3RsID0gcGVnYXN1c19pb2N0bDsKLQluZXQtPmhhcmRfc3RhcnRfeG1pdCA9IHBlZ2FzdXNfc3RhcnRfeG1pdDsKLQluZXQtPnNldF9tdWx0aWNhc3RfbGlzdCA9IHBlZ2FzdXNfc2V0X211bHRpY2FzdDsKLQluZXQtPmdldF9zdGF0cyA9IHBlZ2FzdXNfbmV0ZGV2X3N0YXRzOworCW5ldC0+bmV0ZGV2X29wcyA9ICZwZWdhc3VzX25ldGRldl9vcHM7CiAJU0VUX0VUSFRPT0xfT1BTKG5ldCwgJm9wcyk7CiAJcGVnYXN1cy0+bWlpLmRldiA9IG5ldDsKIAlwZWdhc3VzLT5taWkubWRpb19yZWFkID0gbWRpb19yZWFkOwpAQCAtMTQ4Miw2ICsxNDc5LDE2IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgcGVnYXN1c19uZXRkZXZfb3BzID0geworCS5uZG9fb3BlbiA9CQkJcGVnYXN1c19vcGVuLAorCS5uZG9fc3RvcCA9CQkJcGVnYXN1c19jbG9zZSwKKwkubmRvX2RvX2lvY3RsID0JCQlwZWdhc3VzX2lvY3RsLAorCS5uZG9fc3RhcnRfeG1pdCA9CQlwZWdhc3VzX3N0YXJ0X3htaXQsCisJLm5kb19zZXRfbXVsdGljYXN0X2xpc3QgPQlwZWdhc3VzX3NldF9tdWx0aWNhc3QsCisJLm5kb19nZXRfc3RhdHMgPQkJcGVnYXN1c19uZXRkZXZfc3RhdHMsCisJLm5kb190eF90aW1lb3V0ID0JCXBlZ2FzdXNfdHhfdGltZW91dCwKK307CisKIHN0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciBwZWdhc3VzX2RyaXZlciA9IHsKIAkubmFtZSA9IGRyaXZlcl9uYW1lLAogCS5wcm9iZSA9IHBlZ2FzdXNfcHJvYmUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC92aXJ0aW9fbmV0LmMgYi9kcml2ZXJzL25ldC92aXJ0aW9fbmV0LmMKaW5kZXggYjcwMDRmZi4uNDNmNjUyMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdmlydGlvX25ldC5jCisrKyBiL2RyaXZlcnMvbmV0L3ZpcnRpb19uZXQuYwpAQCAtNjI0LDYgKzYyNCwxOCBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIHZpcnRuZXRfbmV0ZGV2ID0geworCS5uZG9fb3BlbiAgICAgICAgICAgID0gdmlydG5ldF9vcGVuLAorCS5uZG9fc3RvcCAgIAkgICAgID0gdmlydG5ldF9jbG9zZSwKKwkubmRvX3N0YXJ0X3htaXQgICAgICA9IHN0YXJ0X3htaXQsCisJLm5kb192YWxpZGF0ZV9hZGRyICAgPSBldGhfdmFsaWRhdGVfYWRkciwKKwkubmRvX3NldF9tYWNfYWRkcmVzcyA9IGV0aF9tYWNfYWRkciwKKwkubmRvX2NoYW5nZV9tdHUJICAgICA9IHZpcnRuZXRfY2hhbmdlX210dSwKKyNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgorCS5uZG9fcG9sbF9jb250cm9sbGVyID0gdmlydG5ldF9uZXRwb2xsLAorI2VuZGlmCit9OworCiBzdGF0aWMgaW50IHZpcnRuZXRfcHJvYmUoc3RydWN0IHZpcnRpb19kZXZpY2UgKnZkZXYpCiB7CiAJaW50IGVycjsKQEAgLTYzNiwxNCArNjQ4LDggQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAkvKiBTZXQgdXAgbmV0d29yayBkZXZpY2UgYXMgbm9ybWFsLiAqLwotCWRldi0+b3BlbiA9IHZpcnRuZXRfb3BlbjsKLQlkZXYtPnN0b3AgPSB2aXJ0bmV0X2Nsb3NlOwotCWRldi0+aGFyZF9zdGFydF94bWl0ID0gc3RhcnRfeG1pdDsKLQlkZXYtPmNoYW5nZV9tdHUgPSB2aXJ0bmV0X2NoYW5nZV9tdHU7CisJZGV2LT5uZXRkZXZfb3BzID0gJnZpcnRuZXRfbmV0ZGV2OwogCWRldi0+ZmVhdHVyZXMgPSBORVRJRl9GX0hJR0hETUE7Ci0jaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKLQlkZXYtPnBvbGxfY29udHJvbGxlciA9IHZpcnRuZXRfbmV0cG9sbDsKLSNlbmRpZgogCVNFVF9FVEhUT09MX09QUyhkZXYsICZ2aXJ0bmV0X2V0aHRvb2xfb3BzKTsKIAlTRVRfTkVUREVWX0RFVihkZXYsICZ2ZGV2LT5kZXYpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aW1heC9LY29uZmlnIGIvZHJpdmVycy9uZXQvd2ltYXgvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjUwMThlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2ltYXgvS2NvbmZpZwpAQCAtMCwwICsxLDE3IEBACisjCisjIFdpTUFYIExBTiBkZXZpY2UgZHJpdmVycyBjb25maWd1cmF0aW9uCisjCisKKworY29tbWVudCAiRW5hYmxlIFdpTUFYIChOZXR3b3JraW5nIG9wdGlvbnMpIHRvIHNlZSB0aGUgV2lNQVggZHJpdmVycyIKKwlkZXBlbmRzIG9uIFdJTUFYID0gbgorCitpZiBXSU1BWAorCittZW51ICJXaU1BWCBXaXJlbGVzcyBCcm9hZGJhbmQgZGV2aWNlcyIKKworc291cmNlICJkcml2ZXJzL25ldC93aW1heC9pMjQwMG0vS2NvbmZpZyIKKworZW5kbWVudQorCitlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2ltYXgvTWFrZWZpbGUgYi9kcml2ZXJzL25ldC93aW1heC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTJiYzAyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2ltYXgvTWFrZWZpbGUKQEAgLTAsMCArMSw1IEBACisKK29iai0kKENPTkZJR19XSU1BWF9JMjQwME0pCSs9IGkyNDAwbS8KKworIyAoZnJvbSBTYW0gUmF2bmJvcmcpIGZvcmNlIGtidWlsZCB0byBjcmVhdGUgYnVpbHQtaW4ubworb2JqLSA6PSBkdW1teS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aW1heC9pMjQwMG0vS2NvbmZpZyBiL2RyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2MjNiM2QKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aW1heC9pMjQwMG0vS2NvbmZpZwpAQCAtMCwwICsxLDQ5IEBACisKK2NvbmZpZyBXSU1BWF9JMjQwME0KKwl0cmlzdGF0ZQorCWRlcGVuZHMgb24gV0lNQVgKKwlzZWxlY3QgRldfTE9BREVSCisKK2NvbW1lbnQgIkVuYWJsZSBVU0Igc3VwcG9ydCB0byBzZWUgV2lNQVggVVNCIGRyaXZlcnMiCisJZGVwZW5kcyBvbiBVU0IgPSBuCisKK2NvbW1lbnQgIkVuYWJsZSBNTUMgc3VwcG9ydCB0byBzZWUgV2lNQVggU0RJTyBkcml2ZXJzIgorCWRlcGVuZHMgb24gTU1DID0gbgorCitjb25maWcgV0lNQVhfSTI0MDBNX1VTQgorCXRyaXN0YXRlICJJbnRlbCBXaXJlbGVzcyBXaU1BWCBDb25uZWN0aW9uIDI0MDAgb3ZlciBVU0IgKGluY2x1ZGluZyA1eDUwKSIKKwlkZXBlbmRzIG9uIFdJTUFYICYmIFVTQgorCXNlbGVjdCBXSU1BWF9JMjQwME0KKwloZWxwCisJICBTZWxlY3QgaWYgeW91IGhhdmUgYSBkZXZpY2UgYmFzZWQgb24gdGhlIEludGVsIFdpTUFYCisJICBDb25uZWN0aW9uIDI0MDAgb3ZlciBVU0IgKGxpa2UgYW55IG9mIHRoZSBJbnRlbCBXaXJlbGVzcworCSAgV2lNQVgvV2lGaSBMaW5rIDV4NTAgc2VyaWVzKS4KKworCSAgSWYgdW5zdXJlLCBpdCBpcyBzYWZlIHRvIHNlbGVjdCBNIChtb2R1bGUpLgorCitjb25maWcgV0lNQVhfSTI0MDBNX1NESU8KKwl0cmlzdGF0ZSAiSW50ZWwgV2lyZWxlc3MgV2lNQVggQ29ubmVjdGlvbiAyNDAwIG92ZXIgU0RJTyIKKwlkZXBlbmRzIG9uIFdJTUFYICYmIE1NQworCXNlbGVjdCBXSU1BWF9JMjQwME0KKwloZWxwCisJICBTZWxlY3QgaWYgeW91IGhhdmUgYSBkZXZpY2UgYmFzZWQgb24gdGhlIEludGVsIFdpTUFYCisJICBDb25uZWN0aW9uIDI0MDAgb3ZlciBTRElPLgorCisJICBJZiB1bnN1cmUsIGl0IGlzIHNhZmUgdG8gc2VsZWN0IE0gKG1vZHVsZSkuCisKK2NvbmZpZyBXSU1BWF9JMjQwME1fREVCVUdfTEVWRUwKKwlpbnQgIldpTUFYIGkyNDAwbSBkZWJ1ZyBsZXZlbCIKKwlkZXBlbmRzIG9uIFdJTUFYX0kyNDAwTQorCWRlZmF1bHQgOAorCWhlbHAKKworCSAgU2VsZWN0IHRoZSBtYXhpbXVtIGRlYnVnIHZlcmJvc2l0eSBsZXZlbCB0byBiZSBjb21waWxlZCBpbnRvCisJICB0aGUgV2lNQVggaTI0MDBtIGRyaXZlciBjb2RlLgorCisJICBCeSBkZWZhdWx0LCB0aGlzIGlzIGRpc2FibGVkIGF0IHJ1bnRpbWUgYW5kIGNhbiBiZQorCSAgc2VsZWN0aXZlbHkgZW5hYmxlZCBhdCBydW50aW1lIGZvciBkaWZmZXJlbnQgcGFydHMgb2YgdGhlCisJICBjb2RlIHVzaW5nIHRoZSBzeXNmcyBkZWJ1Zy1sZXZlbHMgZmlsZS4KKworCSAgSWYgc2V0IGF0IHplcm8sIHRoaXMgd2lsbCBjb21waWxlIG91dCBhbGwgdGhlIGRlYnVnIGNvZGUuCisKKwkgIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgaXQgaXMgbGVmdCBhdCA4LgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2ltYXgvaTI0MDBtL01ha2VmaWxlIGIvZHJpdmVycy9uZXQvd2ltYXgvaTI0MDBtL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2OTZlOTMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aW1heC9pMjQwMG0vTWFrZWZpbGUKQEAgLTAsMCArMSwyOSBAQAorCitvYmotJChDT05GSUdfV0lNQVhfSTI0MDBNKSArPSBpMjQwMG0ubworb2JqLSQoQ09ORklHX1dJTUFYX0kyNDAwTV9VU0IpICs9IGkyNDAwbS11c2Iubworb2JqLSQoQ09ORklHX1dJTUFYX0kyNDAwTV9TRElPKSArPSBpMjQwMG0tc2Rpby5vCisKK2kyNDAwbS15IDo9CQlcCisJY29udHJvbC5vCVwKKwlkcml2ZXIubwlcCisJZncubwkJXAorCW9wLXJma2lsbC5vCVwKKwluZXRkZXYubwlcCisJdHgubwkJXAorCXJ4Lm8KKworaTI0MDBtLSQoQ09ORklHX0RFQlVHX0ZTKSArPSBkZWJ1Z2ZzLm8KKworaTI0MDBtLXVzYi15IDo9CQkJXAorCXVzYi1mdy5vCQlcCisJdXNiLW5vdGlmLm8JCVwKKwl1c2ItdHgubwkJXAorCXVzYi1yeC5vCQlcCisJdXNiLm8KKworCitpMjQwMG0tc2Rpby15IDo9IAkJXAorCXNkaW8ubyAgICAgIAkJXAorCXNkaW8tdHgubyAgIAkJXAorCXNkaW8tZncubwkgCVwKKwlzZGlvLXJ4Lm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS9jb250cm9sLmMgYi9kcml2ZXJzL25ldC93aW1heC9pMjQwMG0vY29udHJvbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzZDM3ZmUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aW1heC9pMjQwMG0vY29udHJvbC5jCkBAIC0wLDAgKzEsMTI5MSBAQAorLyoKKyAqIEludGVsIFdpcmVsZXNzIFdpTUFYIENvbm5lY3Rpb24gMjQwMG0KKyAqIE1pc2NlbGxhbmVvdXMgY29udHJvbCBmdW5jdGlvbnMgZm9yIG1hbmFnaW5nIHRoZSBkZXZpY2UKKyAqCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgIGRpc3RyaWJ1dGlvbi4KKyAqICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICoKKyAqIEludGVsIENvcnBvcmF0aW9uIDxsaW51eC13aW1heEBpbnRlbC5jb20+CisgKiBJbmFreSBQZXJlei1Hb256YWxleiA8aW5ha3kucGVyZXotZ29uemFsZXpAaW50ZWwuY29tPgorICogIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICoKKyAqIFRoaXMgaXMgYSBjb2xsZWN0aW9uIG9mIGZ1bmN0aW9ucyB1c2VkIHRvIGNvbnRyb2wgdGhlIGRldmljZSAocGx1cworICogYSBmZXcgaGVscGVycykuCisgKgorICogVGhlcmUgYXJlIHV0aWxpdGllcyBmb3IgaGFuZGxpbmcgVExWIGJ1ZmZlcnMsIGhvb2tzIG9uIHRoZSBkZXZpY2UncworICogcmVwb3J0cyB0byBhY3Qgb24gZGV2aWNlIGNoYW5nZXMgb2Ygc3RhdGUgW2kyNDAwbV9yZXBvcnRfaG9vaygpXSwKKyAqIG9uIGFja3MgdG8gY29tbWFuZHMgW2kyNDAwbV9tc2dfYWNrX2hvb2soKV0sIGEgaGVscGVyIGZvciBzZW5kaW5nCisgKiBjb21tYW5kcyB0byB0aGUgZGV2aWNlIGFuZCBibG9ja2luZyB1bnRpbCBhIHJlcGx5IGFycml2ZXMKKyAqIFtpMjQwMG1fbXNnX3RvX2RldigpXSwgYSBmZXcgaGlnaCBsZXZlbCBjb21tYW5kcyBmb3IgbWFuaXB1bGF0aW5nCisgKiB0aGUgZGV2aWNlIHN0YXRlLCBwb3dlcnN2aW5nIG1vZGUgYW5kIGNvbmZpZ3VyYXRpb24gcGx1cyB0aGUKKyAqIHJvdXRpbmVzIHRvIHNldHVwIHRoZSBkZXZpY2Ugb25jZSBjb21tdW5pY2F0aW9uIGlzIHN0YWJsaXNoZWQgd2l0aAorICogaXQgW2kyNDAwbV9kZXZfaW5pdGlhbGl6ZSgpXS4KKyAqCisgKiBST0FETUFQCisgKgorICogaTI0MDBtX2Rldl9pbml0YWxpemUoKSAgICAgICBDYWxsZWQgYnkgaTI0MDBtX2Rldl9zdGFydCgpCisgKiAgIGkyNDAwbV9zZXRfaW5pdF9jb25maWcoKQorICogICBpMjQwMG1fZmlybXdhcmVfY2hlY2soKQorICogICBpMjQwMG1fY21kX2dldF9zdGF0ZSgpCisgKiBpMjQwMG1fZGV2X3NodXRkb3duKCkgICAgICAgIENhbGxlZCBieSBpMjQwMG1fZGV2X3N0b3AoKQorICogICBpMjQwMG0tPmJ1c19yZXNldCgpCisgKgorICogaTI0MDBtX3tjbWQsZ2V0LHNldH1fKigpCisgKiAgIGkyNDAwbV9tc2dfdG9fZGV2KCkKKyAqICAgaTI0MDBtX21zZ19jaGVja19zdGF0dXMoKQorICoKKyAqIGkyNDAwbV9yZXBvcnRfaG9vaygpICAgICAgICAgQ2FsbGVkIG9uIHJlY2VwdGlvbiBvZiBhbiBldmVudAorICogICBpMjQwMG1fcmVwb3J0X3N0YXRlX2hvb2soKQorICogICAgIGkyNDAwbV90bHZfYnVmZmVyX3dhbGsoKQorICogICAgIGkyNDAwbV90bHZfbWF0Y2goKQorICogICAgIGkyNDAwbV9yZXBvcnRfdGx2X3N5c3RlbV9zdGF0ZSgpCisgKiAgICAgaTI0MDBtX3JlcG9ydF90bHZfcmZfc3dpdGNoZXNfc3RhdHVzKCkKKyAqICAgICBpMjQwMG1fcmVwb3J0X3Rsdl9tZWRpYV9zdGF0dXMoKQorICogICBpMjQwMG1fY21kX2VudGVyX3Bvd2Vyc2F2ZSgpCisgKgorICogaTI0MDBtX21zZ19hY2tfaG9vaygpICAgICAgICBDYWxsZWQgb24gcmVjZXB0aW9uIG9mIGEgcmVwbHkgdG8gYQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kLCBnZXQgb3Igc2V0CisgKi8KKworI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgImkyNDAwbS5oIgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3dpbWF4L2kyNDAwbS5oPgorCisKKyNkZWZpbmUgRF9TVUJNT0RVTEUgY29udHJvbAorI2luY2x1ZGUgImRlYnVnLWxldmVscy5oIgorCisKKy8qCisgKiBSZXR1cm4gaWYgYSBUTFYgaXMgb2YgYSBnaXZlIHR5cGUgYW5kIHNpemUKKyAqCisgKiBAdGx2X2hkcjogcG9pbnRlciB0byB0aGUgVExWCisgKiBAdGx2X3R5cGU6IHR5cGUgb2YgdGhlIFRMViB3ZSBhcmUgbG9va2luZyBmb3IKKyAqIEB0bHZfc2l6ZTogZXhwZWN0ZWQgc2l6ZSBvZiB0aGUgVExWIHdlIGFyZSBsb29raW5nIGZvciAoaWYgLTEsCisgKiAgICAgICAgICAgIGRvbid0IGNoZWNrIHRoZSBzaXplKS4gVGhpcyBpbmNsdWRlcyB0aGUgaGVhZGVyCisgKiBSZXR1cm5zOiAwIGlmIHRoZSBUTFYgbWF0Y2hlcworICogICAgICAgICAgPCAwIGlmIGl0IGRvZXNuJ3QgbWF0Y2ggYXQgYWxsCisgKiAgICAgICAgICA+IDAgdG90YWwgVExWICsgcGF5bG9hZCBzaXplLCBpZiB0aGUgdHlwZSBtYXRjaGVzLCBidXQgbm90CisgKiAgICAgICAgICAgICAgdGhlIHNpemUKKyAqLworc3RhdGljCitzc2l6ZV90IGkyNDAwbV90bHZfbWF0Y2goY29uc3Qgc3RydWN0IGkyNDAwbV90bHZfaGRyICp0bHYsCisJCSAgICAgZW51bSBpMjQwMG1fdGx2IHRsdl90eXBlLCBzc2l6ZV90IHRsdl9zaXplKQoreworCWlmIChsZTE2X3RvX2NwdSh0bHYtPnR5cGUpICE9IHRsdl90eXBlKQkvKiBOb3Qgb3VyIHR5cGU/IHNraXAgKi8KKwkJcmV0dXJuIC0xOworCWlmICh0bHZfc2l6ZSAhPSAtMQorCSAgICAmJiBsZTE2X3RvX2NwdSh0bHYtPmxlbmd0aCkgKyBzaXplb2YoKnRsdikgIT0gdGx2X3NpemUpIHsKKwkJc2l6ZV90IHNpemUgPSBsZTE2X3RvX2NwdSh0bHYtPmxlbmd0aCkgKyBzaXplb2YoKnRsdik7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIlc6IHRsdiB0eXBlIDB4JXggbWlzbWF0Y2hlZCBiZWNhdXNlIG9mICIKKwkJICAgICAgICJzaXplIChnb3QgJXp1IHZzICV6dSBleHBlY3RlZClcbiIsCisJCSAgICAgICB0bHZfdHlwZSwgc2l6ZSwgdGx2X3NpemUpOworCQlyZXR1cm4gc2l6ZTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIEdpdmVuIGEgYnVmZmVyIG9mIFRMVnMsIGl0ZXJhdGUgb3ZlciB0aGVtCisgKgorICogQGkyNDAwbTogZGV2aWNlIGluc3RhbmNlCisgKiBAdGx2X2J1ZjogcG9pbnRlciB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBUTFYgYnVmZmVyCisgKiBAYnVmX3NpemU6IGJ1ZmZlciBzaXplIGluIGJ5dGVzCisgKiBAdGx2X3Bvczogc2VlayBwb3NpdGlvbjsgdGhpcyBpcyBhc3N1bWVkIHRvIGJlIGEgcG9pbnRlciByZXR1cm5lZAorICogICAgICAgICAgIGJ5IGkyNDAwbV90bHZfYnVmZmVyX3dhbGsoKSBbYW5kIHRodXMsIHZhbGlkYXRlZF0uIFRoZQorICogICAgICAgICAgIFRMViByZXR1cm5lZCB3aWxsIGJlIHRoZSBvbmUgZm9sbG93aW5nIHRoaXMgb25lLgorICoKKyAqIFVzYWdlOgorICoKKyAqIHRsdl9pdHIgPSBOVUxMOworICogd2hpbGUgKHRsdl9pdHIgPSBpMjQwMG1fdGx2X2J1ZmZlcl93YWxrKGkyNDAwbSwgYnVmLCBzaXplLCB0bHZfaXRyKSkgIHsKKyAqICAgICAgICAgLi4uCisgKiAgICAgICAgIC8vIERvIHN0dWZmIHdpdGggdGx2X2l0ciwgRE9OJ1QgTU9ESUZZIElUCisgKiAgICAgICAgIC4uLgorICogfQorICovCitzdGF0aWMKK2NvbnN0IHN0cnVjdCBpMjQwMG1fdGx2X2hkciAqaTI0MDBtX3Rsdl9idWZmZXJfd2FsaygKKwlzdHJ1Y3QgaTI0MDBtICppMjQwMG0sCisJY29uc3Qgdm9pZCAqdGx2X2J1Ziwgc2l6ZV90IGJ1Zl9zaXplLAorCWNvbnN0IHN0cnVjdCBpMjQwMG1fdGx2X2hkciAqdGx2X3BvcykKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBpMjQwMG1fZGV2KGkyNDAwbSk7CisJY29uc3Qgc3RydWN0IGkyNDAwbV90bHZfaGRyICp0bHZfdG9wID0gdGx2X2J1ZiArIGJ1Zl9zaXplOworCXNpemVfdCBvZmZzZXQsIGxlbmd0aCwgYXZhaWxfc2l6ZTsKKwl1bnNpZ25lZCB0eXBlOworCisJaWYgKHRsdl9wb3MgPT0gTlVMTCkJLyogVGFrZSB0aGUgZmlyc3Qgb25lPyAqLworCQl0bHZfcG9zID0gdGx2X2J1ZjsKKwllbHNlCQkJLyogTm9wZSwgdGhlIG5leHQgb25lICovCisJCXRsdl9wb3MgPSAodm9pZCAqKSB0bHZfcG9zCisJCQkrIGxlMTZfdG9fY3B1KHRsdl9wb3MtPmxlbmd0aCkgKyBzaXplb2YoKnRsdl9wb3MpOworCWlmICh0bHZfcG9zID09IHRsdl90b3ApIHsJLyogYnVmZmVyIGRvbmUgKi8KKwkJdGx2X3BvcyA9IE5VTEw7CisJCWdvdG8gZXJyb3JfYmV5b25kX2VuZDsKKwl9CisJaWYgKHRsdl9wb3MgPiB0bHZfdG9wKSB7CisJCXRsdl9wb3MgPSBOVUxMOworCQlXQVJOX09OKDEpOworCQlnb3RvIGVycm9yX2JleW9uZF9lbmQ7CisJfQorCW9mZnNldCA9ICh2b2lkICopIHRsdl9wb3MgLSAodm9pZCAqKSB0bHZfYnVmOworCWF2YWlsX3NpemUgPSBidWZfc2l6ZSAtIG9mZnNldDsKKwlpZiAoYXZhaWxfc2l6ZSA8IHNpemVvZigqdGx2X3BvcykpIHsKKwkJZGV2X2VycihkZXYsICJIVyBCVUc/IHRsdl9idWYgJXAgWyV6dSBieXRlc10sIHRsdiBAJXp1OiAiCisJCQkic2hvcnQgaGVhZGVyXG4iLCB0bHZfYnVmLCBidWZfc2l6ZSwgb2Zmc2V0KTsKKwkJZ290byBlcnJvcl9zaG9ydF9oZWFkZXI7CisJfQorCXR5cGUgPSBsZTE2X3RvX2NwdSh0bHZfcG9zLT50eXBlKTsKKwlsZW5ndGggPSBsZTE2X3RvX2NwdSh0bHZfcG9zLT5sZW5ndGgpOworCWlmIChhdmFpbF9zaXplIDwgc2l6ZW9mKCp0bHZfcG9zKSArIGxlbmd0aCkgeworCQlkZXZfZXJyKGRldiwgIkhXIEJVRz8gdGx2X2J1ZiAlcCBbJXp1IGJ5dGVzXSwgIgorCQkJInRsdiB0eXBlIDB4JTA0eCBAJXp1OiAiCisJCQkic2hvcnQgZGF0YSAoJXp1IGJ5dGVzIHZzICV6dSBuZWVkZWQpXG4iLAorCQkJdGx2X2J1ZiwgYnVmX3NpemUsIHR5cGUsIG9mZnNldCwgYXZhaWxfc2l6ZSwKKwkJCXNpemVvZigqdGx2X3BvcykgKyBsZW5ndGgpOworCQlnb3RvIGVycm9yX3Nob3J0X2hlYWRlcjsKKwl9CitlcnJvcl9zaG9ydF9oZWFkZXI6CitlcnJvcl9iZXlvbmRfZW5kOgorCXJldHVybiB0bHZfcG9zOworfQorCisKKy8qCisgKiBGaW5kIGEgVExWIGluIGEgYnVmZmVyIG9mIHNlcXVlbnRpYWwgVExWcworICoKKyAqIEBpMjQwMG06IGRldmljZSBkZXNjcmlwdG9yCisgKiBAdGx2X2hkcjogcG9pbnRlciB0byB0aGUgZmlyc3QgVExWIGluIHRoZSBzZXF1ZW5jZQorICogQHNpemU6IHNpemUgb2YgdGhlIGJ1ZmZlciBpbiBieXRlczsgYWxsIFRMVnMgYXJlIGFzc3VtZWQgdG8gZml0CisgKiAgICAgICAgZnVsbHkgaW4gdGhlIGJ1ZmZlciAob3RoZXJ3aXNlIHdlJ2xsIGNvbXBsYWluKS4KKyAqIEB0bHZfdHlwZTogdHlwZSBvZiB0aGUgVExWIHdlIGFyZSBsb29raW5nIGZvcgorICogQHRsdl9zaXplOiBleHBlY3RlZCBzaXplIG9mIHRoZSBUTFYgd2UgYXJlIGxvb2tpbmcgZm9yIChpZiAtMSwKKyAqICAgICAgICAgICAgZG9uJ3QgY2hlY2sgdGhlIHNpemUpLiBUaGlzIGluY2x1ZGVzIHRoZSBoZWFkZXIKKyAqCisgKiBSZXR1cm5zOiBOVUxMIGlmIHRoZSBUTFYgaXMgbm90IGZvdW5kLCBvdGhlcndpc2UgYSBwb2ludGVyIHRvCisgKiAgICAgICAgICBpdC4gSWYgdGhlIHNpemVzIGRvbid0IG1hdGNoLCBhbiBlcnJvciBpcyBwcmludGVkIGFuZCBOVUxMCisgKiAgICAgICAgICByZXR1cm5lZC4KKyAqLworc3RhdGljCitjb25zdCBzdHJ1Y3QgaTI0MDBtX3Rsdl9oZHIgKmkyNDAwbV90bHZfZmluZCgKKwlzdHJ1Y3QgaTI0MDBtICppMjQwMG0sCisJY29uc3Qgc3RydWN0IGkyNDAwbV90bHZfaGRyICp0bHZfaGRyLCBzaXplX3Qgc2l6ZSwKKwllbnVtIGkyNDAwbV90bHYgdGx2X3R5cGUsIHNzaXplX3QgdGx2X3NpemUpCit7CisJc3NpemVfdCBtYXRjaDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBpMjQwMG1fZGV2KGkyNDAwbSk7CisJY29uc3Qgc3RydWN0IGkyNDAwbV90bHZfaGRyICp0bHYgPSBOVUxMOworCXdoaWxlICgodGx2ID0gaTI0MDBtX3Rsdl9idWZmZXJfd2FsayhpMjQwMG0sIHRsdl9oZHIsIHNpemUsIHRsdikpKSB7CisJCW1hdGNoID0gaTI0MDBtX3Rsdl9tYXRjaCh0bHYsIHRsdl90eXBlLCB0bHZfc2l6ZSk7CisJCWlmIChtYXRjaCA9PSAwKQkJLyogZm91bmQgaXQgOikgKi8KKwkJCWJyZWFrOworCQlpZiAobWF0Y2ggPiAwKQorCQkJZGV2X3dhcm4oZGV2LCAiVExWIHR5cGUgMHglMDR4IGZvdW5kIHdpdGggc2l6ZSAiCisJCQkJICJtaXNtYXRjaCAoJXp1IHZzICV6dSBuZWVkZWQpXG4iLAorCQkJCSB0bHZfdHlwZSwgbWF0Y2gsIHRsdl9zaXplKTsKKwl9CisJcmV0dXJuIHRsdjsKK30KKworCitzdGF0aWMgY29uc3Qgc3RydWN0Cit7CisJY2hhciAqbXNnOworCWludCBlcnJubzsKK30gbXNfdG9fZXJybm9bSTI0MDBNX01TX01BWF0gPSB7CisJW0kyNDAwTV9NU19ET05FX09LXSA9IHsgIiIsIDAgfSwKKwlbSTI0MDBNX01TX0RPTkVfSU5fUFJPR1JFU1NdID0geyAiIiwgMCB9LAorCVtJMjQwME1fTVNfSU5WQUxJRF9PUF0gPSB7ICJpbnZhbGlkIG9wY29kZSIsIC1FTk9TWVMgfSwKKwlbSTI0MDBNX01TX0JBRF9TVEFURV0gPSB7ICJpbnZhbGlkIHN0YXRlIiwgLUVJTFNFUSB9LAorCVtJMjQwME1fTVNfSUxMRUdBTF9WQUxVRV0gPSB7ICJpbGxlZ2FsIHZhbHVlIiwgLUVJTlZBTCB9LAorCVtJMjQwME1fTVNfTUlTU0lOR19QQVJBTVNdID0geyAibWlzc2luZyBwYXJhbWV0ZXJzIiwgLUVOT01TRyB9LAorCVtJMjQwME1fTVNfVkVSU0lPTl9FUlJPUl0gPSB7ICJiYWQgdmVyc2lvbiIsIC1FSU8gfSwKKwlbSTI0MDBNX01TX0FDQ0VTU0lCSUxJVFlfRVJST1JdID0geyAiYWNjZXNpYmlsaXR5IGVycm9yIiwgLUVJTyB9LAorCVtJMjQwME1fTVNfQlVTWV0gPSB7ICJidXN5IiwgLUVCVVNZIH0sCisJW0kyNDAwTV9NU19DT1JSVVBURURfVExWXSA9IHsgImNvcnJ1cHRlZCBUTFYiLCAtRUlMU0VRIH0sCisJW0kyNDAwTV9NU19VTklOSVRJQUxJWkVEXSA9IHsgIm5vdCB1bml0aWFsaXplZCIsIC1FSUxTRVEgfSwKKwlbSTI0MDBNX01TX1VOS05PV05fRVJST1JdID0geyAidW5rbm93biBlcnJvciIsIC1FSU8gfSwKKwlbSTI0MDBNX01TX1BST0RVQ1RJT05fRVJST1JdID0geyAicHJvZHVjdGlvbiBlcnJvciIsIC1FSU8gfSwKKwlbSTI0MDBNX01TX05PX1JGXSA9IHsgIm5vIFJGIiwgLUVJTyB9LAorCVtJMjQwME1fTVNfTk9UX1JFQURZX0ZPUl9QT1dFUlNBVkVdID0KKwkJeyAibm90IHJlYWR5IGZvciBwb3dlcnNhdmUiLCAtRUFDQ0VTIH0sCisJW0kyNDAwTV9NU19USEVSTUFMX0NSSVRJQ0FMXSA9IHsgInRoZXJtYWwgY3JpdGljYWwiLCAtRUwzSExUIH0sCit9OworCisKKy8qCisgKiBpMjQwMG1fbXNnX2NoZWNrX3N0YXR1cyAtIHRyYW5zbGF0ZSBhIG1lc3NhZ2UncyBzdGF0dXMgY29kZQorICoKKyAqIEBpMjQwMG06IGRldmljZSBkZXNjcmlwdG9yCisgKiBAbDNsNF9oZHI6IG1lc3NhZ2UgaGVhZGVyCisgKiBAc3RyYnVmOiBidWZmZXIgdG8gcGxhY2UgYSBmb3JtYXR0ZWQgZXJyb3IgbWVzc2FnZSAodW5sZXNzIE5VTEwpLgorICogQHN0cmJ1Zl9zaXplOiBtYXggYW1vdW50IG9mIGF2YWlsYWJsZSBzcGFjZTsgbGFyZ2VyIG1lc3NhZ2VzIHdpbGwKKyAqIGJlIHRydW5jYXRlZC4KKyAqCisgKiBSZXR1cm5zOiBlcnJubyBjb2RlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHN0YXR1cyBjb2RlIGluIEBsM2w0X2hkcgorICogICAgICAgICAgYW5kIGEgbWVzc2FnZSBpbiBAc3RyYnVmIGRlc2NyaWJpbmcgdGhlIGVycm9yLgorICovCitpbnQgaTI0MDBtX21zZ19jaGVja19zdGF0dXMoY29uc3Qgc3RydWN0IGkyNDAwbV9sM2w0X2hkciAqbDNsNF9oZHIsCisJCQkgICAgY2hhciAqc3RyYnVmLCBzaXplX3Qgc3RyYnVmX3NpemUpCit7CisJaW50IHJlc3VsdDsKKwllbnVtIGkyNDAwbV9tcyBzdGF0dXMgPSBsZTE2X3RvX2NwdShsM2w0X2hkci0+c3RhdHVzKTsKKwljb25zdCBjaGFyICpzdHI7CisKKwlpZiAoc3RhdHVzID09IDApCisJCXJldHVybiAwOworCWlmIChzdGF0dXMgPiBBUlJBWV9TSVpFKG1zX3RvX2Vycm5vKSkgeworCQlzdHIgPSAidW5rbm93biBzdGF0dXMgY29kZSI7CisJCXJlc3VsdCA9IC1FQkFEUjsKKwl9IGVsc2UgeworCQlzdHIgPSBtc190b19lcnJub1tzdGF0dXNdLm1zZzsKKwkJcmVzdWx0ID0gbXNfdG9fZXJybm9bc3RhdHVzXS5lcnJubzsKKwl9CisJaWYgKHN0cmJ1ZikKKwkJc25wcmludGYoc3RyYnVmLCBzdHJidWZfc2l6ZSwgIiVzICglZCkiLCBzdHIsIHN0YXR1cyk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworCisvKgorICogQWN0IG9uIGEgVExWIFN5c3RlbSBTdGF0ZSByZXBvcnRlZCBieSB0aGUgZGV2aWNlCisgKgorICogQGkyNDAwbTogZGV2aWNlIGRlc2NyaXB0b3IKKyAqIEBzczogdmFsaWRhdGVkIFN5c3RlbSBTdGF0ZSBUTFYKKyAqLworc3RhdGljCit2b2lkIGkyNDAwbV9yZXBvcnRfdGx2X3N5c3RlbV9zdGF0ZShzdHJ1Y3QgaTI0MDBtICppMjQwMG0sCisJCQkJICAgIGNvbnN0IHN0cnVjdCBpMjQwMG1fdGx2X3N5c3RlbV9zdGF0ZSAqc3MpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gaTI0MDBtX2RldihpMjQwMG0pOworCXN0cnVjdCB3aW1heF9kZXYgKndpbWF4X2RldiA9ICZpMjQwMG0tPndpbWF4X2RldjsKKwllbnVtIGkyNDAwbV9zeXN0ZW1fc3RhdGUgaTI0MDBtX3N0YXRlID0gbGUzMl90b19jcHUoc3MtPnN0YXRlKTsKKworCWRfZm5zdGFydCgzLCBkZXYsICIoaTI0MDBtICVwIHNzICVwIFsldV0pXG4iLCBpMjQwMG0sIHNzLCBpMjQwMG1fc3RhdGUpOworCisJaWYgKHVubGlrZWx5KGkyNDAwbS0+cmVhZHkgPT0gMCkpCS8qIGFjdCBpZiB1cCAqLworCQlnb3RvIG91dDsKKwlpZiAoaTI0MDBtLT5zdGF0ZSAhPSBpMjQwMG1fc3RhdGUpIHsKKwkJaTI0MDBtLT5zdGF0ZSA9IGkyNDAwbV9zdGF0ZTsKKwkJd2FrZV91cF9hbGwoJmkyNDAwbS0+c3RhdGVfd3EpOworCX0KKwlzd2l0Y2ggKGkyNDAwbV9zdGF0ZSkgeworCWNhc2UgSTI0MDBNX1NTX1VOSU5JVElBTElaRUQ6CisJY2FzZSBJMjQwME1fU1NfSU5JVDoKKwljYXNlIEkyNDAwTV9TU19DT05GSUc6CisJY2FzZSBJMjQwME1fU1NfUFJPRFVDVElPTjoKKwkJd2ltYXhfc3RhdGVfY2hhbmdlKHdpbWF4X2RldiwgV0lNQVhfU1RfVU5JTklUSUFMSVpFRCk7CisJCWJyZWFrOworCisJY2FzZSBJMjQwME1fU1NfUkZfT0ZGOgorCWNhc2UgSTI0MDBNX1NTX1JGX1NIVVRET1dOOgorCQl3aW1heF9zdGF0ZV9jaGFuZ2Uod2ltYXhfZGV2LCBXSU1BWF9TVF9SQURJT19PRkYpOworCQlicmVhazsKKworCWNhc2UgSTI0MDBNX1NTX1JFQURZOgorCWNhc2UgSTI0MDBNX1NTX1NUQU5EQlk6CisJY2FzZSBJMjQwME1fU1NfU0xFRVBBQ1RJVkU6CisJCXdpbWF4X3N0YXRlX2NoYW5nZSh3aW1heF9kZXYsIFdJTUFYX1NUX1JFQURZKTsKKwkJYnJlYWs7CisKKwljYXNlIEkyNDAwTV9TU19DT05ORUNUSU5HOgorCWNhc2UgSTI0MDBNX1NTX1dJTUFYX0NPTk5FQ1RFRDoKKwkJd2ltYXhfc3RhdGVfY2hhbmdlKHdpbWF4X2RldiwgV0lNQVhfU1RfUkVBRFkpOworCQlicmVhazsKKworCWNhc2UgSTI0MDBNX1NTX1NDQU46CisJY2FzZSBJMjQwME1fU1NfT1VUX09GX1pPTkU6CisJCXdpbWF4X3N0YXRlX2NoYW5nZSh3aW1heF9kZXYsIFdJTUFYX1NUX1NDQU5OSU5HKTsKKwkJYnJlYWs7CisKKwljYXNlIEkyNDAwTV9TU19JRExFOgorCQlkX3ByaW50ZigxLCBkZXYsICJlbnRlcmluZyBCUy1uZWdvdGlhdGVkIGlkbGUgbW9kZVxuIik7CisJY2FzZSBJMjQwME1fU1NfRElTQ09OTkVDVElORzoKKwljYXNlIEkyNDAwTV9TU19EQVRBX1BBVEhfQ09OTkVDVEVEOgorCQl3aW1heF9zdGF0ZV9jaGFuZ2Uod2ltYXhfZGV2LCBXSU1BWF9TVF9DT05ORUNURUQpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCS8qIEh1aD8ganVzdCBpbiBjYXNlLCBzaHV0IGl0IGRvd24gKi8KKwkJZGV2X2VycihkZXYsICJIVyBCVUc/IHVua25vd24gc3RhdGUgJXU6IHNodXR0aW5nIGRvd25cbiIsCisJCQlpMjQwMG1fc3RhdGUpOworCQlpMjQwMG0tPmJ1c19yZXNldChpMjQwMG0sIEkyNDAwTV9SVF9XQVJNKTsKKwkJYnJlYWs7CisJfTsKK291dDoKKwlkX2ZuZW5kKDMsIGRldiwgIihpMjQwMG0gJXAgc3MgJXAgWyV1XSkgPSB2b2lkXG4iLAorCQlpMjQwMG0sIHNzLCBpMjQwMG1fc3RhdGUpOworfQorCisKKy8qCisgKiBQYXJzZSBhbmQgYWN0IG9uIGEgVExWIE1lZGlhIFN0YXR1cyBzZW50IGJ5IHRoZSBkZXZpY2UKKyAqCisgKiBAaTI0MDBtOiBkZXZpY2UgZGVzY3JpcHRvcgorICogQG1zOiB2YWxpZGF0ZWQgTWVkaWEgU3RhdHVzIFRMVgorICoKKyAqIFRoaXMgd2lsbCBzZXQgdGhlIGNhcnJpZXIgdXAgb24gZG93biBiYXNlZCBvbiB0aGUgZGV2aWNlJ3MgbGluaworICogcmVwb3J0LiBUaGlzIGlzIGRvbmUgYXNpZGVzIG9mIHdoYXQgdGhlIFdpTUFYIHN0YWNrIGRvZXMgYmFzZWQgb24KKyAqIHRoZSBkZXZpY2UncyBzdGF0ZSBhcyBzb21ldGltZXMgd2UgbmVlZCB0byBkbyBhIGxpbmstcmVuZXcgKHRoZSBCUworICogd2FudHMgdXMgdG8gcmVuZXcgYSBESENQIGxlYXNlLCBmb3IgZXhhbXBsZSkuCisgKgorICogSW4gZmFjdCwgZG9jIHNheXMgdGhhdCBldmVyeXRpbWUgd2UgZ2V0IGEgbGluay11cCwgd2Ugc2hvdWxkIGRvIGEKKyAqIERIQ1AgbmVnb3RpYXRpb24uLi4KKyAqLworc3RhdGljCit2b2lkIGkyNDAwbV9yZXBvcnRfdGx2X21lZGlhX3N0YXR1cyhzdHJ1Y3QgaTI0MDBtICppMjQwMG0sCisJCQkJICAgIGNvbnN0IHN0cnVjdCBpMjQwMG1fdGx2X21lZGlhX3N0YXR1cyAqbXMpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gaTI0MDBtX2RldihpMjQwMG0pOworCXN0cnVjdCB3aW1heF9kZXYgKndpbWF4X2RldiA9ICZpMjQwMG0tPndpbWF4X2RldjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiA9IHdpbWF4X2Rldi0+bmV0X2RldjsKKwllbnVtIGkyNDAwbV9tZWRpYV9zdGF0dXMgc3RhdHVzID0gbGUzMl90b19jcHUobXMtPm1lZGlhX3N0YXR1cyk7CisKKwlkX2Zuc3RhcnQoMywgZGV2LCAiKGkyNDAwbSAlcCBtcyAlcCBbJXVdKVxuIiwgaTI0MDBtLCBtcywgc3RhdHVzKTsKKworCWlmICh1bmxpa2VseShpMjQwMG0tPnJlYWR5ID09IDApKQkvKiBhY3QgaWYgdXAgKi8KKwkJZ290byBvdXQ7CisJc3dpdGNoIChzdGF0dXMpIHsKKwljYXNlIEkyNDAwTV9NRURJQV9TVEFUVVNfTElOS19VUDoKKwkJbmV0aWZfY2Fycmllcl9vbihuZXRfZGV2KTsKKwkJYnJlYWs7CisJY2FzZSBJMjQwME1fTUVESUFfU1RBVFVTX0xJTktfRE9XTjoKKwkJbmV0aWZfY2Fycmllcl9vZmYobmV0X2Rldik7CisJCWJyZWFrOworCS8qCisJICogVGhpcyBpcyB0aGUgbmV0d29yayB0ZWxsaW5nIHVzIHdlIG5lZWQgdG8gcmV0cmFpbiB0aGUgREhDUAorCSAqIGxlYXNlIC0tIHNvIGZhciwgd2UgYXJlIHRydXN0aW5nIHRoZSBXaU1BWCBOZXR3b3JrIFNlcnZpY2UKKwkgKiBpbiB1c2VyIHNwYWNlIHRvIHBpY2sgdGhpcyB1cCBhbmQgcG9rZSB0aGUgREhDUCBjbGllbnQuCisJICovCisJY2FzZSBJMjQwME1fTUVESUFfU1RBVFVTX0xJTktfUkVORVc6CisJCW5ldGlmX2NhcnJpZXJfb24obmV0X2Rldik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9lcnIoZGV2LCAiSFcgQlVHPyB1bmtub3duIG1lZGlhIHN0YXR1cyAldVxuIiwKKwkJCXN0YXR1cyk7CisJfTsKK291dDoKKwlkX2ZuZW5kKDMsIGRldiwgIihpMjQwMG0gJXAgbXMgJXAgWyV1XSkgPSB2b2lkXG4iLAorCQlpMjQwMG0sIG1zLCBzdGF0dXMpOworfQorCisKKy8qCisgKiBQYXJzZSBhICdzdGF0ZSByZXBvcnQnIGFuZCBleHRyYWN0IGNhcnJpZXIgb24vb2ZmIGluZm9ybWF0aW9uCisgKgorICogQGkyNDAwbTogZGV2aWNlIGRlc2NyaXB0b3IKKyAqIEBsM2w0X2hkcjogcG9pbnRlciB0byBtZXNzYWdlOyBpdCBoYXMgYmVlbiBhbHJlYWR5IHZhbGlkYXRlZCBmb3IKKyAqICAgICAgICAgICAgY29uc2lzdGVudCBzaXplLgorICogQHNpemU6IHNpemUgb2YgdGhlIG1lc3NhZ2UgKGhlYWRlciArIHBheWxvYWQpLiBUaGUgaGVhZGVyIGxlbmd0aAorICogICAgICAgIGRlY2xhcmF0aW9uIGlzIGFzc3VtZWQgdG8gYmUgY29uZ3J1ZW50IHdpdGggQHNpemUgKGFzIGluCisgKiAgICAgICAgc2l6ZW9mKCpsM2w0X2hkcikgKyBsM2w0X2hkci0+bGVuZ3RoID09IHNpemUpCisgKgorICogRXh0cmFjdCBmcm9tIHRoZSByZXBvcnQgc3RhdGUgdGhlIHN5c3RlbSBzdGF0ZSBUTFYgYW5kIGluZmVyIGZyb20KKyAqIHRoZXJlIGlmIHdlIGhhdmUgYSBjYXJyaWVyIG9yIG5vdC4gVXBkYXRlIG91ciBsb2NhbCBzdGF0ZSBhbmQgdGVsbAorICogbmV0ZGV2LgorICoKKyAqIFdoZW4gc2V0dGluZyB0aGUgY2FycmllciwgaXQncyBmaW5lIHRvIHNldCBPRkYgdHdpY2UgKGZvciBleGFtcGxlKSwKKyAqIGFzIG5ldGlmX2NhcnJpZXJfb2ZmKCkgd2lsbCBub3QgZ2VuZXJhdGUgdHdvIE9GRiBldmVudHMgKGp1c3Qgb24KKyAqIHRoZSB0cmFuc2l0aW9ucykuCisgKi8KK3N0YXRpYwordm9pZCBpMjQwMG1fcmVwb3J0X3N0YXRlX2hvb2soc3RydWN0IGkyNDAwbSAqaTI0MDBtLAorCQkJICAgICAgY29uc3Qgc3RydWN0IGkyNDAwbV9sM2w0X2hkciAqbDNsNF9oZHIsCisJCQkgICAgICBzaXplX3Qgc2l6ZSwgY29uc3QgY2hhciAqdGFnKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGkyNDAwbV9kZXYoaTI0MDBtKTsKKwljb25zdCBzdHJ1Y3QgaTI0MDBtX3Rsdl9oZHIgKnRsdjsKKwljb25zdCBzdHJ1Y3QgaTI0MDBtX3Rsdl9zeXN0ZW1fc3RhdGUgKnNzOworCWNvbnN0IHN0cnVjdCBpMjQwMG1fdGx2X3JmX3N3aXRjaGVzX3N0YXR1cyAqcmZzczsKKwljb25zdCBzdHJ1Y3QgaTI0MDBtX3Rsdl9tZWRpYV9zdGF0dXMgKm1zOworCXNpemVfdCB0bHZfc2l6ZSA9IGxlMTZfdG9fY3B1KGwzbDRfaGRyLT5sZW5ndGgpOworCisJZF9mbnN0YXJ0KDQsIGRldiwgIihpMjQwMG0gJXAsIGwzbDRfaGRyICVwLCBzaXplICV6dSwgJXMpXG4iLAorCQkgIGkyNDAwbSwgbDNsNF9oZHIsIHNpemUsIHRhZyk7CisJdGx2ID0gTlVMTDsKKworCXdoaWxlICgodGx2ID0gaTI0MDBtX3Rsdl9idWZmZXJfd2FsayhpMjQwMG0sICZsM2w0X2hkci0+cGwsCisJCQkJCSAgICAgdGx2X3NpemUsIHRsdikpKSB7CisJCWlmICgwID09IGkyNDAwbV90bHZfbWF0Y2godGx2LCBJMjQwME1fVExWX1NZU1RFTV9TVEFURSwKKwkJCQkJICBzaXplb2YoKnNzKSkpIHsKKwkJCXNzID0gY29udGFpbmVyX29mKHRsdiwgdHlwZW9mKCpzcyksIGhkcik7CisJCQlkX3ByaW50ZigyLCBkZXYsICIlczogc3lzdGVtIHN0YXRlIFRMViAiCisJCQkJICJmb3VuZCAoMHglMDR4KSwgc3RhdGUgMHglMDh4XG4iLAorCQkJCSB0YWcsIEkyNDAwTV9UTFZfU1lTVEVNX1NUQVRFLAorCQkJCSBsZTMyX3RvX2NwdShzcy0+c3RhdGUpKTsKKwkJCWkyNDAwbV9yZXBvcnRfdGx2X3N5c3RlbV9zdGF0ZShpMjQwMG0sIHNzKTsKKwkJfQorCQlpZiAoMCA9PSBpMjQwMG1fdGx2X21hdGNoKHRsdiwgSTI0MDBNX1RMVl9SRl9TVEFUVVMsCisJCQkJCSAgc2l6ZW9mKCpyZnNzKSkpIHsKKwkJCXJmc3MgPSBjb250YWluZXJfb2YodGx2LCB0eXBlb2YoKnJmc3MpLCBoZHIpOworCQkJZF9wcmludGYoMiwgZGV2LCAiJXM6IFJGIHN0YXR1cyBUTFYgIgorCQkJCSAiZm91bmQgKDB4JTA0eCksIHN3IDB4JTAyeCBodyAweCUwMnhcbiIsCisJCQkJIHRhZywgSTI0MDBNX1RMVl9SRl9TVEFUVVMsCisJCQkJIGxlMzJfdG9fY3B1KHJmc3MtPnN3X3JmX3N3aXRjaCksCisJCQkJIGxlMzJfdG9fY3B1KHJmc3MtPmh3X3JmX3N3aXRjaCkpOworCQkJaTI0MDBtX3JlcG9ydF90bHZfcmZfc3dpdGNoZXNfc3RhdHVzKGkyNDAwbSwgcmZzcyk7CisJCX0KKwkJaWYgKDAgPT0gaTI0MDBtX3Rsdl9tYXRjaCh0bHYsIEkyNDAwTV9UTFZfTUVESUFfU1RBVFVTLAorCQkJCQkgIHNpemVvZigqbXMpKSkgeworCQkJbXMgPSBjb250YWluZXJfb2YodGx2LCB0eXBlb2YoKm1zKSwgaGRyKTsKKwkJCWRfcHJpbnRmKDIsIGRldiwgIiVzOiBNZWRpYSBTdGF0dXMgVExWOiAldVxuIiwKKwkJCQkgdGFnLCBsZTMyX3RvX2NwdShtcy0+bWVkaWFfc3RhdHVzKSk7CisJCQlpMjQwMG1fcmVwb3J0X3Rsdl9tZWRpYV9zdGF0dXMoaTI0MDBtLCBtcyk7CisJCX0KKwl9CisJZF9mbmVuZCg0LCBkZXYsICIoaTI0MDBtICVwLCBsM2w0X2hkciAlcCwgc2l6ZSAlenUsICVzKSA9IHZvaWRcbiIsCisJCWkyNDAwbSwgbDNsNF9oZHIsIHNpemUsIHRhZyk7Cit9CisKKworLyoKKyAqIGkyNDAwbV9yZXBvcnRfaG9vayAtIChtYXliZSkgYWN0IG9uIGEgcmVwb3J0CisgKgorICogQGkyNDAwbTogZGV2aWNlIGRlc2NyaXB0b3IKKyAqIEBsM2w0X2hkcjogcG9pbnRlciB0byBtZXNzYWdlOyBpdCBoYXMgYmVlbiBhbHJlYWR5IHZhbGlkYXRlZCBmb3IKKyAqICAgICAgICAgICAgY29uc2lzdGVudCBzaXplLgorICogQHNpemU6IHNpemUgb2YgdGhlIG1lc3NhZ2UgKGhlYWRlciArIHBheWxvYWQpLiBUaGUgaGVhZGVyIGxlbmd0aAorICogICAgICAgIGRlY2xhcmF0aW9uIGlzIGFzc3VtZWQgdG8gYmUgY29uZ3J1ZW50IHdpdGggQHNpemUgKGFzIGluCisgKiAgICAgICAgc2l6ZW9mKCpsM2w0X2hkcikgKyBsM2w0X2hkci0+bGVuZ3RoID09IHNpemUpCisgKgorICogRXh0cmFjdCBpbmZvcm1hdGlvbiB3ZSBtaWdodCBuZWVkIChsaWtlIGNhcnJpZW4gb24vb2ZmKSBmcm9tIGEKKyAqIGRldmljZSByZXBvcnQuCisgKi8KK3ZvaWQgaTI0MDBtX3JlcG9ydF9ob29rKHN0cnVjdCBpMjQwMG0gKmkyNDAwbSwKKwkJCWNvbnN0IHN0cnVjdCBpMjQwMG1fbDNsNF9oZHIgKmwzbDRfaGRyLCBzaXplX3Qgc2l6ZSkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBpMjQwMG1fZGV2KGkyNDAwbSk7CisJdW5zaWduZWQgbXNnX3R5cGU7CisKKwlkX2Zuc3RhcnQoMywgZGV2LCAiKGkyNDAwbSAlcCBsM2w0X2hkciAlcCBzaXplICV6dSlcbiIsCisJCSAgaTI0MDBtLCBsM2w0X2hkciwgc2l6ZSk7CisJLyogQ2hldyBvbiB0aGUgbWVzc2FnZSwgd2UgbWlnaHQgbmVlZCBzb21lIGluZm9ybWF0aW9uIGZyb20KKwkgKiBoZXJlICovCisJbXNnX3R5cGUgPSBsZTE2X3RvX2NwdShsM2w0X2hkci0+dHlwZSk7CisJc3dpdGNoIChtc2dfdHlwZSkgeworCWNhc2UgSTI0MDBNX01UX1JFUE9SVF9TVEFURToJLyogY2FycmllciBkZXRlY3Rpb24uLi4gKi8KKwkJaTI0MDBtX3JlcG9ydF9zdGF0ZV9ob29rKGkyNDAwbSwKKwkJCQkJIGwzbDRfaGRyLCBzaXplLCAiUkVQT1JUIFNUQVRFIik7CisJCWJyZWFrOworCS8qIElmIHRoZSBkZXZpY2UgaXMgcmVhZHkgZm9yIHBvd2VyIHNhdmUsIHRoZW4gYXNrIGl0IHRvIGRvCisJICogaXQuICovCisJY2FzZSBJMjQwME1fTVRfUkVQT1JUX1BPV0VSU0FWRV9SRUFEWToJLyogenp6enogKi8KKwkJaWYgKGwzbDRfaGRyLT5zdGF0dXMgPT0gY3B1X3RvX2xlMTYoSTI0MDBNX01TX0RPTkVfT0spKSB7CisJCQlkX3ByaW50ZigxLCBkZXYsICJyZWFkeSBmb3IgcG93ZXJzYXZlLCByZXF1ZXN0aW5nXG4iKTsKKwkJCWkyNDAwbV9jbWRfZW50ZXJfcG93ZXJzYXZlKGkyNDAwbSk7CisJCX0KKwkJYnJlYWs7CisJfTsKKwlkX2ZuZW5kKDMsIGRldiwgIihpMjQwMG0gJXAgbDNsNF9oZHIgJXAgc2l6ZSAlenUpID0gdm9pZFxuIiwKKwkJaTI0MDBtLCBsM2w0X2hkciwgc2l6ZSk7Cit9CisKKworLyoKKyAqIGkyNDAwbV9tc2dfYWNrX2hvb2sgLSBwcm9jZXNzIGNtZC9zZXQvZ2V0IGFjayBmb3IgaW50ZXJuYWwgc3RhdHVzCisgKgorICogQGkyNDAwbTogZGV2aWNlIGRlc2NyaXB0b3IKKyAqIEBsM2w0X2hkcjogcG9pbnRlciB0byBtZXNzYWdlOyBpdCBoYXMgYmVlbiBhbHJlYWR5IHZhbGlkYXRlZCBmb3IKKyAqICAgICAgICAgICAgY29uc2lzdGVudCBzaXplLgorICogQHNpemU6IHNpemUgb2YgdGhlIG1lc3NhZ2UKKyAqCisgKiBFeHRyYWN0IGluZm9ybWF0aW9uIHdlIG1pZ2h0IG5lZWQgZnJvbSBhY2tzIHRvIGNvbW1hbmRzIGFuZCBhY3Qgb24KKyAqIGl0LiBUaGlzIGlzIGFraW4gdG8gaTI0MDBtX3JlcG9ydF9ob29rKCkuIE5vdGUgbW9zdCBvZiB0aGlzCisgKiBwcm9jZXNzaW5nIHNob3VsZCBiZSBkb25lIGluIHRoZSBmdW5jdGlvbiB0aGF0IGNhbGxzIHRoZQorICogY29tbWFuZC4gVGhpcyBpcyBoZXJlIGZvciBzb21lIGNhc2VzIHdoZXJlIGl0IGNhbid0IGhhcHBlbi4uLgorICovCit2b2lkIGkyNDAwbV9tc2dfYWNrX2hvb2soc3RydWN0IGkyNDAwbSAqaTI0MDBtLAorCQkJIGNvbnN0IHN0cnVjdCBpMjQwMG1fbDNsNF9oZHIgKmwzbDRfaGRyLCBzaXplX3Qgc2l6ZSkKK3sKKwlpbnQgcmVzdWx0OworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGkyNDAwbV9kZXYoaTI0MDBtKTsKKwl1bnNpZ25lZCBhY2tfdHlwZSwgYWNrX3N0YXR1czsKKwljaGFyIHN0cmVyclszMl07CisKKwkvKiBDaGV3IG9uIHRoZSBtZXNzYWdlLCB3ZSBtaWdodCBuZWVkIHNvbWUgaW5mb3JtYXRpb24gZnJvbQorCSAqIGhlcmUgKi8KKwlhY2tfdHlwZSA9IGxlMTZfdG9fY3B1KGwzbDRfaGRyLT50eXBlKTsKKwlhY2tfc3RhdHVzID0gbGUxNl90b19jcHUobDNsNF9oZHItPnN0YXR1cyk7CisJc3dpdGNoIChhY2tfdHlwZSkgeworCWNhc2UgSTI0MDBNX01UX0NNRF9FTlRFUl9QT1dFUlNBVkU6CisJCS8qIFRoaXMgaXMganVzdCBsZWZ0IGhlcmUgZm9yIHRoZSBzYWtlIG9mIGV4YW1wbGUsIGFzCisJCSAqIHRoZSBwcm9jZXNzaW5nIGlzIGRvbmUgc29tZXdoZXJlIGVsc2UuICovCisJCWlmICgwKSB7CisJCQlyZXN1bHQgPSBpMjQwMG1fbXNnX2NoZWNrX3N0YXR1cygKKwkJCQlsM2w0X2hkciwgc3RyZXJyLCBzaXplb2Yoc3RyZXJyKSk7CisJCQlpZiAocmVzdWx0ID49IDApCisJCQkJZF9wcmludGYoMSwgZGV2LCAicmVhZHkgZm9yIHBvd2VyIHNhdmU6ICV6ZFxuIiwKKwkJCQkJIHNpemUpOworCQl9CisJCWJyZWFrOworCX07CisJcmV0dXJuOworfQorCisKKy8qCisgKiBpMjQwMG1fbXNnX3NpemVfY2hlY2soKSAtIHZlcmlmeSBtZXNzYWdlIHNpemUgYW5kIGhlYWRlciBhcmUgY29uZ3J1ZW50CisgKgorICogSXQgaXMgb2sgaWYgdGhlIHRvdGFsIG1lc3NhZ2Ugc2l6ZSBpcyBsYXJnZXIgdGhhbiB0aGUgZXhwZWN0ZWQKKyAqIHNpemUsIGFzIHRoZXJlIGNhbiBiZSBwYWRkaW5nLgorICovCitpbnQgaTI0MDBtX21zZ19zaXplX2NoZWNrKHN0cnVjdCBpMjQwMG0gKmkyNDAwbSwKKwkJCSAgY29uc3Qgc3RydWN0IGkyNDAwbV9sM2w0X2hkciAqbDNsNF9oZHIsCisJCQkgIHNpemVfdCBtc2dfc2l6ZSkKK3sKKwlpbnQgcmVzdWx0OworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGkyNDAwbV9kZXYoaTI0MDBtKTsKKwlzaXplX3QgZXhwZWN0ZWRfc2l6ZTsKKwlkX2Zuc3RhcnQoNCwgZGV2LCAiKGkyNDAwbSAlcCBsM2w0X2hkciAlcCBtc2dfc2l6ZSAlenUpXG4iLAorCQkgIGkyNDAwbSwgbDNsNF9oZHIsIG1zZ19zaXplKTsKKwlpZiAobXNnX3NpemUgPCBzaXplb2YoKmwzbDRfaGRyKSkgeworCQlkZXZfZXJyKGRldiwgImJhZCBzaXplIGZvciBtZXNzYWdlIGhlYWRlciAiCisJCQkiKGV4cGVjdGVkIGF0IGxlYXN0ICV6dSwgZ290ICV6dSlcbiIsCisJCQkoc2l6ZV90KSBzaXplb2YoKmwzbDRfaGRyKSwgbXNnX3NpemUpOworCQlyZXN1bHQgPSAtRUlPOworCQlnb3RvIGVycm9yX2hkcl9zaXplOworCX0KKwlleHBlY3RlZF9zaXplID0gbGUxNl90b19jcHUobDNsNF9oZHItPmxlbmd0aCkgKyBzaXplb2YoKmwzbDRfaGRyKTsKKwlpZiAobXNnX3NpemUgPCBleHBlY3RlZF9zaXplKSB7CisJCWRldl9lcnIoZGV2LCAiYmFkIHNpemUgZm9yIG1lc3NhZ2UgY29kZSAweCUwNHggKGV4cGVjdGVkICV6dSwgIgorCQkJImdvdCAlenUpXG4iLCBsZTE2X3RvX2NwdShsM2w0X2hkci0+dHlwZSksCisJCQlleHBlY3RlZF9zaXplLCBtc2dfc2l6ZSk7CisJCXJlc3VsdCA9IC1FSU87CisJfSBlbHNlCisJCXJlc3VsdCA9IDA7CitlcnJvcl9oZHJfc2l6ZToKKwlkX2ZuZW5kKDQsIGRldiwKKwkJIihpMjQwMG0gJXAgbDNsNF9oZHIgJXAgbXNnX3NpemUgJXp1KSA9ICVkXG4iLAorCQlpMjQwMG0sIGwzbDRfaGRyLCBtc2dfc2l6ZSwgcmVzdWx0KTsKKwlyZXR1cm4gcmVzdWx0OworfQorCisKKworLyoKKyAqIENhbmNlbCBhIHdhaXQgZm9yIGEgY29tbWFuZCBBQ0sKKyAqCisgKiBAaTI0MDBtOiBkZXZpY2UgZGVzY3JpcHRvcgorICogQGNvZGU6IFtuZWdhdGl2ZV0gZXJybm8gY29kZSB0byBjYW5jZWwgd2l0aCAoZG9uJ3QgdXNlCisgKiAgICAgLUVJTlBST0dSRVNTKQorICoKKyAqIElmIHRoZXJlIGlzIGFuIGFjayBhbHJlYWR5IGZpbGxlZCBvdXQsIGZyZWUgaXQuCisgKi8KK3ZvaWQgaTI0MDBtX21zZ190b19kZXZfY2FuY2VsX3dhaXQoc3RydWN0IGkyNDAwbSAqaTI0MDBtLCBpbnQgY29kZSkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqYWNrX3NrYjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmkyNDAwbS0+cnhfbG9jaywgZmxhZ3MpOworCWFja19za2IgPSBpMjQwMG0tPmFja19za2I7CisJaWYgKGFja19za2IgJiYgIUlTX0VSUihhY2tfc2tiKSkKKwkJa2ZyZWUoYWNrX3NrYik7CisJaTI0MDBtLT5hY2tfc2tiID0gRVJSX1BUUihjb2RlKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpMjQwMG0tPnJ4X2xvY2ssIGZsYWdzKTsKK30KKworCisvKioKKyAqIGkyNDAwbV9tc2dfdG9fZGV2IC0gU2VuZCBhIGNvbnRyb2wgbWVzc2FnZSB0byB0aGUgZGV2aWNlIGFuZCBnZXQgYSByZXNwb25zZQorICoKKyAqIEBpMjQwMG06IGRldmljZSBkZXNjcmlwdG9yCisgKgorICogQG1zZ19za2I6IGFuIHNrYiAgKgorICoKKyAqIEBidWY6IHBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBjb250YWluaW5nIHRoZSBtZXNzYWdlIHRvIGJlIHNlbnQ7IGl0CisgKiAgICAgICAgICAgaGFzIHRvIHN0YXJ0IHdpdGggYSAmc3RydWN0IGkyNDAwTV9sM2w0X2hkciBhbmQgdGhlbgorICogICAgICAgICAgIGZvbGxvd2VkIGJ5IHRoZSBwYXlsb2FkLiBPbmNlIHRoaXMgZnVuY3Rpb24gcmV0dXJucywgdGhlCisgKiAgICAgICAgICAgYnVmZmVyIGNhbiBiZSByZXVzZWQuCisgKgorICogQGJ1Zl9sZW46IGJ1ZmZlciBzaXplCisgKgorICogUmV0dXJuczoKKyAqCisgKiBQb2ludGVyIHRvIHNrYiBjb250YWluaW5nIHRoZSBhY2sgbWVzc2FnZS4gWW91IG5lZWQgdG8gY2hlY2sgdGhlCisgKiBwb2ludGVyIHdpdGggSVNfRVJSKCksIGFzIGl0IG1pZ2h0IGJlIGFuIGVycm9yIGNvZGUuIEVycm9yIGNvZGVzCisgKiBjb3VsZCBoYXBwZW4gYmVjYXVzZToKKyAqCisgKiAgLSB0aGUgbWVzc2FnZSB3YXNuJ3QgZm9ybWF0dGVkIGNvcnJlY3RseQorICogIC0gY291bGRuJ3Qgc2VuZCB0aGUgbWVzc2FnZQorICogIC0gZmFpbGVkIHdhaXRpbmcgZm9yIGEgcmVzcG9uc2UKKyAqICAtIHRoZSBhY2sgbWVzc2FnZSB3YXNuJ3QgZm9ybWF0dGVkIGNvcnJlY3RseQorICoKKyAqIFRoZSByZXR1cm5lZCBza2IgaGFzIGJlZW4gYWxsb2NhdGVkIHdpdGggd2ltYXhfbXNnX3RvX3VzZXJfYWxsb2MoKSwKKyAqIGl0IGNvbnRhaW5zIHRoZSByZXBvbnNlIGluIGEgbmV0bGluayBhdHRyaWJ1dGUgYW5kIGlzIHJlYWR5IHRvIGJlCisgKiBwYXNzZWQgdXAgdG8gdXNlciBzcGFjZSB3aXRoIHdpbWF4X21zZ190b191c2VyX3NlbmQoKS4gVG8gYWNjZXNzCisgKiB0aGUgcGF5bG9hZCBhbmQgaXRzIGxlbmd0aCwgdXNlIHdpbWF4X21zZ197ZGF0YSxsZW59KCkgb24gdGhlIHNrYi4KKyAqCisgKiBUaGUgc2tiIGhhcyB0byBiZSBmcmVlZCB3aXRoIGtmcmVlX3NrYigpIG9uY2UgZG9uZS4KKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGRlbGl2ZXJzIGEgbWVzc2FnZS9jb21tYW5kIHRvIHRoZSBkZXZpY2UgYW5kIHdhaXRzCisgKiBmb3IgYW4gYWNrIHRvIGJlIHJlY2VpdmVkLiBUaGUgZm9ybWF0IGlzIGRlc2NyaWJlZCBpbgorICogbGludXgvd2ltYXgvaTI0MDBtLmguIEluIHN1bW1hcnksIGEgY29tbWFuZC9nZXQvc2V0IGlzIGZvbGxvd2VkIGJ5IGFuCisgKiBhY2suCisgKgorICogVGhpcyBmdW5jdGlvbiB3aWxsIG5vdCBjaGVjayB0aGUgYWNrIHN0YXR1cywgdGhhdCdzIGxlZnQgdXAgdG8gdGhlCisgKiBjYWxsZXIuICBPbmNlIGRvbmUgd2l0aCB0aGUgYWNrIHNrYiwgaXQgaGFzIHRvIGJlIGtmcmVlX3NrYigpZWQuCisgKgorICogVGhlIGkyNDAwbSBoYW5kbGVzIG9ubHkgb25lIG1lc3NhZ2UgYXQgdGhlIHNhbWUgdGltZSwgdGh1cyB3ZSBuZWVkCisgKiB0aGUgbXV0ZXggdG8gZXhjbHVkZSBvdGhlciBwbGF5ZXJzLgorICoKKyAqIFdlIHdyaXRlIHRoZSBtZXNzYWdlIGFuZCB0aGVuIHdhaXQgZm9yIGFuIGFuc3dlciB0byBjb21lIGJhY2suIFRoZQorICogUlggcGF0aCBpbnRlcmNlcHRzIGNvbnRyb2wgbWVzc2FnZXMgYW5kIGhhbmRsZXMgdGhlbSBpbgorICogaTI0MDBtX3J4X2N0bCgpLiBSZXBvcnRzIChub3RpZmljYXRpb25zKSBhcmUgKG1heWJlKSBwcm9jZXNzZWQKKyAqIGxvY2FsbHkgYW5kIHRoZW4gZm9yd2FyZGVkIChhcyBuZWVkZWQpIHRvIHVzZXIgc3BhY2Ugb24gdGhlIFdpTUFYCisgKiBzdGFjayBtZXNzYWdlIHBpcGUuIEFja3MgYXJlIHNhdmVkIGFuZCBwYXNzZWQgYmFjayB0byB1cyB0aHJvdWdoIGFuCisgKiBza2IgaW4gaTI0MDBtLT5hY2tfc2tiIHdoaWNoIGlzIHJlYWR5IHRvIGJlIGdpdmVuIHRvIGdlbmVyaWMKKyAqIG5ldGxpbmsgaWYgbmVlZCBiZS4KKyAqLworc3RydWN0IHNrX2J1ZmYgKmkyNDAwbV9tc2dfdG9fZGV2KHN0cnVjdCBpMjQwMG0gKmkyNDAwbSwKKwkJCQkgIGNvbnN0IHZvaWQgKmJ1Ziwgc2l6ZV90IGJ1Zl9sZW4pCit7CisJaW50IHJlc3VsdDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBpMjQwMG1fZGV2KGkyNDAwbSk7CisJY29uc3Qgc3RydWN0IGkyNDAwbV9sM2w0X2hkciAqbXNnX2wzbDRfaGRyOworCXN0cnVjdCBza19idWZmICphY2tfc2tiOworCWNvbnN0IHN0cnVjdCBpMjQwMG1fbDNsNF9oZHIgKmFja19sM2w0X2hkcjsKKwlzaXplX3QgYWNrX2xlbjsKKwlpbnQgYWNrX3RpbWVvdXQ7CisJdW5zaWduZWQgbXNnX3R5cGU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWRfZm5zdGFydCgzLCBkZXYsICIoaTI0MDBtICVwIGJ1ZiAlcCBsZW4gJXp1KVxuIiwKKwkJICBpMjQwMG0sIGJ1ZiwgYnVmX2xlbik7CisKKwlpZiAoaTI0MDBtLT5ib290X21vZGUpCisJCXJldHVybiBFUlJfUFRSKC1FTk9ERVYpOworCisJbXNnX2wzbDRfaGRyID0gYnVmOworCS8qIENoZWNrIG1zZyAmIHBheWxvYWQgY29uc2lzdGVuY3kgKi8KKwlyZXN1bHQgPSBpMjQwMG1fbXNnX3NpemVfY2hlY2soaTI0MDBtLCBtc2dfbDNsNF9oZHIsIGJ1Zl9sZW4pOworCWlmIChyZXN1bHQgPCAwKQorCQlnb3RvIGVycm9yX2JhZF9tc2c7CisJbXNnX3R5cGUgPSBsZTE2X3RvX2NwdShtc2dfbDNsNF9oZHItPnR5cGUpOworCWRfcHJpbnRmKDEsIGRldiwgIkNNRC9HRVQvU0VUIDB4JTA0eCAlenUgYnl0ZXNcbiIsCisJCSBtc2dfdHlwZSwgYnVmX2xlbik7CisJZF9kdW1wKDIsIGRldiwgYnVmLCBidWZfbGVuKTsKKworCS8qIFNldHVwIHRoZSBjb21wbGV0aW9uLCBhY2tfc2tiICgid2UgYXJlIHdhaXRpbmciKSBhbmQgc2VuZAorCSAqIHRoZSBtZXNzYWdlIHRvIHRoZSBkZXZpY2UgKi8KKwltdXRleF9sb2NrKCZpMjQwMG0tPm1zZ19tdXRleCk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmkyNDAwbS0+cnhfbG9jaywgZmxhZ3MpOworCWkyNDAwbS0+YWNrX3NrYiA9IEVSUl9QVFIoLUVJTlBST0dSRVNTKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpMjQwMG0tPnJ4X2xvY2ssIGZsYWdzKTsKKwlpbml0X2NvbXBsZXRpb24oJmkyNDAwbS0+bXNnX2NvbXBsZXRpb24pOworCXJlc3VsdCA9IGkyNDAwbV90eChpMjQwMG0sIGJ1ZiwgYnVmX2xlbiwgSTI0MDBNX1BUX0NUUkwpOworCWlmIChyZXN1bHQgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAiY2FuJ3Qgc2VuZCBtZXNzYWdlIDB4JTA0eDogJWRcbiIsCisJCQlsZTE2X3RvX2NwdShtc2dfbDNsNF9oZHItPnR5cGUpLCByZXN1bHQpOworCQlnb3RvIGVycm9yX3R4OworCX0KKworCS8qIFNvbWUgY29tbWFuZHMgdGFrZSBsb25nZXIgdG8gZXhlY3V0ZSBiZWNhdXNlIG9mIGNyeXB0byBvcHMsCisJICogc28gd2UgZ2l2ZSB0aGVtIHNvbWUgbW9yZSBsZWV3YXkgb24gdGltZW91dCAqLworCXN3aXRjaCAobXNnX3R5cGUpIHsKKwljYXNlIEkyNDAwTV9NVF9HRVRfVExTX09QRVJBVElPTl9SRVNVTFQ6CisJY2FzZSBJMjQwME1fTVRfQ01EX1NFTkRfRUFQX1JFU1BPTlNFOgorCQlhY2tfdGltZW91dCA9IDUgKiBIWjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYWNrX3RpbWVvdXQgPSBIWjsKKwl9OworCisJLyogVGhlIFJYIHBhdGggaW4gcnguYyB3aWxsIHB1dCBhbnkgcmVzcG9uc2UgZm9yIHRoaXMgbWVzc2FnZQorCSAqIGluIGkyNDAwbS0+YWNrX3NrYiBhbmQgd2FrZSB1cyB1cC4gSWYgd2UgY2FuY2VsIHRoZSB3YWl0LAorCSAqIHdlIG5lZWQgdG8gY2hhbmdlIHRoZSB2YWx1ZSBvZiBpMjQwMG0tPmFja19za2IgdG8gc29tZXRoaW5nCisJICogbm90IC1FSU5QUk9HUkVTUyBzbyBSWCBrbm93cyB0aGVyZSBpcyBubyBvbmUgd2FpdGluZy4gKi8KKwlyZXN1bHQgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX2ludGVycnVwdGlibGVfdGltZW91dCgKKwkJJmkyNDAwbS0+bXNnX2NvbXBsZXRpb24sIGFja190aW1lb3V0KTsKKwlpZiAocmVzdWx0ID09IDApIHsKKwkJZGV2X2VycihkZXYsICJ0aW1lb3V0IHdhaXRpbmcgZm9yIHJlcGx5IHRvIG1lc3NhZ2UgMHglMDR4XG4iLAorCQkJbXNnX3R5cGUpOworCQlyZXN1bHQgPSAtRVRJTUVET1VUOworCQlpMjQwMG1fbXNnX3RvX2Rldl9jYW5jZWxfd2FpdChpMjQwMG0sIHJlc3VsdCk7CisJCWdvdG8gZXJyb3Jfd2FpdF9mb3JfY29tcGxldGlvbjsKKwl9IGVsc2UgaWYgKHJlc3VsdCA8IDApIHsKKwkJZGV2X2VycihkZXYsICJlcnJvciB3YWl0aW5nIGZvciByZXBseSB0byBtZXNzYWdlIDB4JTA0eDogJWRcbiIsCisJCQltc2dfdHlwZSwgcmVzdWx0KTsKKwkJaTI0MDBtX21zZ190b19kZXZfY2FuY2VsX3dhaXQoaTI0MDBtLCByZXN1bHQpOworCQlnb3RvIGVycm9yX3dhaXRfZm9yX2NvbXBsZXRpb247CisJfQorCisJLyogUHVsbCBvdXQgdGhlIGFjayBkYXRhIGZyb20gaTI0MDBtLT5hY2tfc2tiIC0tIHNlZSBpZiBpdCBpcworCSAqIGFuIGVycm9yIGFuZCBhY3QgYWNjb3JkaW5nbHkgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmaTI0MDBtLT5yeF9sb2NrLCBmbGFncyk7CisJYWNrX3NrYiA9IGkyNDAwbS0+YWNrX3NrYjsKKwlpZiAoSVNfRVJSKGFja19za2IpKQorCQlyZXN1bHQgPSBQVFJfRVJSKGFja19za2IpOworCWVsc2UKKwkJcmVzdWx0ID0gMDsKKwlpMjQwMG0tPmFja19za2IgPSBOVUxMOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmkyNDAwbS0+cnhfbG9jaywgZmxhZ3MpOworCWlmIChyZXN1bHQgPCAwKQorCQlnb3RvIGVycm9yX2Fja19zdGF0dXM7CisJYWNrX2wzbDRfaGRyID0gd2ltYXhfbXNnX2RhdGFfbGVuKGFja19za2IsICZhY2tfbGVuKTsKKworCS8qIENoZWNrIHRoZSBhY2sgYW5kIGRlbGl2ZXIgaXQgaWYgaXQgaXMgb2sgKi8KKwlyZXN1bHQgPSBpMjQwMG1fbXNnX3NpemVfY2hlY2soaTI0MDBtLCBhY2tfbDNsNF9oZHIsIGFja19sZW4pOworCWlmIChyZXN1bHQgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAiSFcgQlVHPyByZXBseSB0byBtZXNzYWdlIDB4JTA0eDogJWRcbiIsCisJCQltc2dfdHlwZSwgcmVzdWx0KTsKKwkJZ290byBlcnJvcl9iYWRfYWNrX2xlbjsKKwl9CisJaWYgKG1zZ190eXBlICE9IGxlMTZfdG9fY3B1KGFja19sM2w0X2hkci0+dHlwZSkpIHsKKwkJZGV2X2VycihkZXYsICJIVyBCVUc/IGJhZCByZXBseSAweCUwNHggdG8gbWVzc2FnZSAweCUwNHhcbiIsCisJCQlsZTE2X3RvX2NwdShhY2tfbDNsNF9oZHItPnR5cGUpLCBtc2dfdHlwZSk7CisJCXJlc3VsdCA9IC1FSU87CisJCWdvdG8gZXJyb3JfYmFkX2Fja190eXBlOworCX0KKwlpMjQwMG1fbXNnX2Fja19ob29rKGkyNDAwbSwgYWNrX2wzbDRfaGRyLCBhY2tfbGVuKTsKKwltdXRleF91bmxvY2soJmkyNDAwbS0+bXNnX211dGV4KTsKKwlkX2ZuZW5kKDMsIGRldiwgIihpMjQwMG0gJXAgYnVmICVwIGxlbiAlenUpID0gJXBcbiIsCisJCWkyNDAwbSwgYnVmLCBidWZfbGVuLCBhY2tfc2tiKTsKKwlyZXR1cm4gYWNrX3NrYjsKKworZXJyb3JfYmFkX2Fja190eXBlOgorZXJyb3JfYmFkX2Fja19sZW46CisJa2ZyZWVfc2tiKGFja19za2IpOworZXJyb3JfYWNrX3N0YXR1czoKK2Vycm9yX3dhaXRfZm9yX2NvbXBsZXRpb246CitlcnJvcl90eDoKKwltdXRleF91bmxvY2soJmkyNDAwbS0+bXNnX211dGV4KTsKK2Vycm9yX2JhZF9tc2c6CisJZF9mbmVuZCgzLCBkZXYsICIoaTI0MDBtICVwIGJ1ZiAlcCBsZW4gJXp1KSA9ICVkXG4iLAorCQlpMjQwMG0sIGJ1ZiwgYnVmX2xlbiwgcmVzdWx0KTsKKwlyZXR1cm4gRVJSX1BUUihyZXN1bHQpOworfQorCisKKy8qCisgKiBEZWZpbml0aW9ucyBmb3IgdGhlIEVudGVyIFBvd2VyIFNhdmUgY29tbWFuZAorICoKKyAqIFRoZSBFbnRlciBQb3dlciBTYXZlIGNvbW1hbmQgcmVxdWVzdHMgdGhlIGRldmljZSB0byBnbyBpbnRvIHBvd2VyCisgKiBzYXZpbmcgbW9kZS4gVGhlIGRldmljZSB3aWxsIGFjayBvciBuYWsgdGhlIGNvbW1hbmQgZGVwZW5kaW5nIG9uIGl0CisgKiBiZWluZyByZWFkeSBmb3IgaXQuIElmIGl0IGFja3MsIHdlIHRlbGwgdGhlIFVTQiBzdWJzeXN0ZW0gdG8KKyAqCisgKiBBcyB3ZWxsLCB0aGUgZGV2aWNlIG1pZ2h0IHJlcXVlc3QgdG8gZ28gaW50byBwb3dlciBzYXZpbmcgbW9kZSBieQorICogc2VuZGluZyBhIHJlcG9ydCAoUkVQT1JUX1BPV0VSU0FWRV9SRUFEWSksIGluIHdoaWNoIGNhc2UsIHdlIGlzc3VlCisgKiB0aGlzIGNvbW1hbmQuIFRoZSBob29rdXBzIGluIHRoZSBSWCBjb2RlciBhbGxvdworICovCitlbnVtIHsKKwlJMjQwME1fV0FLRVVQX0VOQUJMRUQgID0gMHgwMSwKKwlJMjQwME1fV0FLRVVQX0RJU0FCTEVEID0gMHgwMiwKKwlJMjQwME1fVExWX1RZUEVfV0FLRVVQX01PREUgPSAxNDQsCit9OworCitzdHJ1Y3QgaTI0MDBtX2NtZF9lbnRlcl9wb3dlcl9zYXZlIHsKKwlzdHJ1Y3QgaTI0MDBtX2wzbDRfaGRyIGhkcjsKKwlzdHJ1Y3QgaTI0MDBtX3Rsdl9oZHIgdGx2OworCV9fbGUzMiB2YWw7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisKKy8qCisgKiBSZXF1ZXN0IGVudGVyaW5nIHBvd2VyIHNhdmUKKyAqCisgKiBUaGlzIGNvbW1hbmQgaXMgKG1haW5seSkgZXhlY3V0ZWQgd2hlbiB0aGUgZGV2aWNlIGluZGljYXRlcyB0aGF0IGl0CisgKiBpcyByZWFkeSB0byBnbyBpbnRvIHBvd2Vyc2F2ZSBtb2RlIHZpYSBhIFJFUE9SVF9QT1dFUlNBVkVfUkVBRFkuCisgKi8KK2ludCBpMjQwMG1fY21kX2VudGVyX3Bvd2Vyc2F2ZShzdHJ1Y3QgaTI0MDBtICppMjQwMG0pCit7CisJaW50IHJlc3VsdDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBpMjQwMG1fZGV2KGkyNDAwbSk7CisJc3RydWN0IHNrX2J1ZmYgKmFja19za2I7CisJc3RydWN0IGkyNDAwbV9jbWRfZW50ZXJfcG93ZXJfc2F2ZSAqY21kOworCWNoYXIgc3RyZXJyWzMyXTsKKworCXJlc3VsdCA9IC1FTk9NRU07CisJY21kID0ga3phbGxvYyhzaXplb2YoKmNtZCksIEdGUF9LRVJORUwpOworCWlmIChjbWQgPT0gTlVMTCkKKwkJZ290byBlcnJvcl9hbGxvYzsKKwljbWQtPmhkci50eXBlID0gY3B1X3RvX2xlMTYoSTI0MDBNX01UX0NNRF9FTlRFUl9QT1dFUlNBVkUpOworCWNtZC0+aGRyLmxlbmd0aCA9IGNwdV90b19sZTE2KHNpemVvZigqY21kKSAtIHNpemVvZihjbWQtPmhkcikpOworCWNtZC0+aGRyLnZlcnNpb24gPSBjcHVfdG9fbGUxNihJMjQwME1fTDNMNF9WRVJTSU9OKTsKKwljbWQtPnRsdi50eXBlID0gY3B1X3RvX2xlMTYoSTI0MDBNX1RMVl9UWVBFX1dBS0VVUF9NT0RFKTsKKwljbWQtPnRsdi5sZW5ndGggPSBjcHVfdG9fbGUxNihzaXplb2YoY21kLT52YWwpKTsKKwljbWQtPnZhbCA9IGNwdV90b19sZTMyKEkyNDAwTV9XQUtFVVBfRU5BQkxFRCk7CisKKwlhY2tfc2tiID0gaTI0MDBtX21zZ190b19kZXYoaTI0MDBtLCBjbWQsIHNpemVvZigqY21kKSk7CisJcmVzdWx0ID0gUFRSX0VSUihhY2tfc2tiKTsKKwlpZiAoSVNfRVJSKGFja19za2IpKSB7CisJCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIGlzc3VlICdFbnRlciBwb3dlciBzYXZlJyBjb21tYW5kOiAlZFxuIiwKKwkJCXJlc3VsdCk7CisJCWdvdG8gZXJyb3JfbXNnX3RvX2RldjsKKwl9CisJcmVzdWx0ID0gaTI0MDBtX21zZ19jaGVja19zdGF0dXMod2ltYXhfbXNnX2RhdGEoYWNrX3NrYiksCisJCQkJCSBzdHJlcnIsIHNpemVvZihzdHJlcnIpKTsKKwlpZiAocmVzdWx0ID09IC1FQUNDRVMpCisJCWRfcHJpbnRmKDEsIGRldiwgIkNhbm5vdCBlbnRlciBwb3dlciBzYXZlIG1vZGVcbiIpOworCWVsc2UgaWYgKHJlc3VsdCA8IDApCisJCWRldl9lcnIoZGV2LCAiJ0VudGVyIHBvd2VyIHNhdmUnICgweCUwNHgpIGNvbW1hbmQgZmFpbGVkOiAiCisJCQkiJWQgLSAlc1xuIiwgSTI0MDBNX01UX0NNRF9FTlRFUl9QT1dFUlNBVkUsCisJCQlyZXN1bHQsIHN0cmVycik7CisJZWxzZQorCQlkX3ByaW50ZigxLCBkZXYsICJkZXZpY2UgcmVhZHkgdG8gcG93ZXIgc2F2ZVxuIik7CisJa2ZyZWVfc2tiKGFja19za2IpOworZXJyb3JfbXNnX3RvX2RldjoKKwlrZnJlZShjbWQpOworZXJyb3JfYWxsb2M6CisJcmV0dXJuIHJlc3VsdDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGkyNDAwbV9jbWRfZW50ZXJfcG93ZXJzYXZlKTsKKworCisvKgorICogRGVmaW5pdGlvbnMgZm9yIGdldHRpbmcgZGV2aWNlIGluZm9ybWF0aW9uCisgKi8KK2VudW0geworCUkyNDAwTV9UTFZfREVUQUlMRURfREVWSUNFX0lORk8gPSAxNDAKK307CisKKy8qKgorICogaTI0MDBtX2dldF9kZXZpY2VfaW5mbyAtIFF1ZXJ5IHRoZSBkZXZpY2UgZm9yIGRldGFpbGVkIGRldmljZSBpbmZvcm1hdGlvbgorICoKKyAqIEBpMjQwMG06IGRldmljZSBkZXNjcmlwdG9yCisgKgorICogUmV0dXJuczogYW4gc2tiIHdob3NlIHNrYi0+ZGF0YSBwb2ludHMgdG8gYSAnc3RydWN0CisgKiAgICBpMjQwMG1fdGx2X2RldGFpbGVkX2RldmljZV9pbmZvJy4gV2hlbiBkb25lLCBrZnJlZV9za2IoKSBpdC4gVGhlCisgKiAgICBza2IgaXMgKmd1YXJhbnRlZWQqIHRvIGNvbnRhaW4gdGhlIHdob2xlIFRMViBkYXRhIHN0cnVjdHVyZS4KKyAqCisgKiAgICBPbiBlcnJvciwgSVNfRVJSKHNrYikgaXMgdHJ1ZSBhbmQgRVJSX1BUUihza2IpIGlzIHRoZSBlcnJvcgorICogICAgY29kZS4KKyAqLworc3RydWN0IHNrX2J1ZmYgKmkyNDAwbV9nZXRfZGV2aWNlX2luZm8oc3RydWN0IGkyNDAwbSAqaTI0MDBtKQoreworCWludCByZXN1bHQ7CisJc3RydWN0IGRldmljZSAqZGV2ID0gaTI0MDBtX2RldihpMjQwMG0pOworCXN0cnVjdCBza19idWZmICphY2tfc2tiOworCXN0cnVjdCBpMjQwMG1fbDNsNF9oZHIgKmNtZDsKKwljb25zdCBzdHJ1Y3QgaTI0MDBtX2wzbDRfaGRyICphY2s7CisJc2l6ZV90IGFja19sZW47CisJY29uc3Qgc3RydWN0IGkyNDAwbV90bHZfaGRyICp0bHY7CisJY29uc3Qgc3RydWN0IGkyNDAwbV90bHZfZGV0YWlsZWRfZGV2aWNlX2luZm8gKmRkaTsKKwljaGFyIHN0cmVyclszMl07CisKKwlhY2tfc2tiID0gRVJSX1BUUigtRU5PTUVNKTsKKwljbWQgPSBremFsbG9jKHNpemVvZigqY21kKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGNtZCA9PSBOVUxMKQorCQlnb3RvIGVycm9yX2FsbG9jOworCWNtZC0+dHlwZSA9IGNwdV90b19sZTE2KEkyNDAwTV9NVF9HRVRfREVWSUNFX0lORk8pOworCWNtZC0+bGVuZ3RoID0gMDsKKwljbWQtPnZlcnNpb24gPSBjcHVfdG9fbGUxNihJMjQwME1fTDNMNF9WRVJTSU9OKTsKKworCWFja19za2IgPSBpMjQwMG1fbXNnX3RvX2RldihpMjQwMG0sIGNtZCwgc2l6ZW9mKCpjbWQpKTsKKwlpZiAoSVNfRVJSKGFja19za2IpKSB7CisJCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIGlzc3VlICdnZXQgZGV2aWNlIGluZm8nIGNvbW1hbmQ6ICVsZFxuIiwKKwkJCVBUUl9FUlIoYWNrX3NrYikpOworCQlnb3RvIGVycm9yX21zZ190b19kZXY7CisJfQorCWFjayA9IHdpbWF4X21zZ19kYXRhX2xlbihhY2tfc2tiLCAmYWNrX2xlbik7CisJcmVzdWx0ID0gaTI0MDBtX21zZ19jaGVja19zdGF0dXMoYWNrLCBzdHJlcnIsIHNpemVvZihzdHJlcnIpKTsKKwlpZiAocmVzdWx0IDwgMCkgeworCQlkZXZfZXJyKGRldiwgIidnZXQgZGV2aWNlIGluZm8nICgweCUwNHgpIGNvbW1hbmQgZmFpbGVkOiAiCisJCQkiJWQgLSAlc1xuIiwgSTI0MDBNX01UX0dFVF9ERVZJQ0VfSU5GTywgcmVzdWx0LAorCQkJc3RyZXJyKTsKKwkJZ290byBlcnJvcl9jbWRfZmFpbGVkOworCX0KKwl0bHYgPSBpMjQwMG1fdGx2X2ZpbmQoaTI0MDBtLCBhY2stPnBsLCBhY2tfbGVuIC0gc2l6ZW9mKCphY2spLAorCQkJICAgICAgSTI0MDBNX1RMVl9ERVRBSUxFRF9ERVZJQ0VfSU5GTywgc2l6ZW9mKCpkZGkpKTsKKwlpZiAodGx2ID09IE5VTEwpIHsKKwkJZGV2X2VycihkZXYsICJHRVQgREVWSUNFIElORk86ICIKKwkJCSJkZXRhaWxlZCBkZXZpY2UgaW5mbyBUTFYgbm90IGZvdW5kICgweCUwNHgpXG4iLAorCQkJSTI0MDBNX1RMVl9ERVRBSUxFRF9ERVZJQ0VfSU5GTyk7CisJCXJlc3VsdCA9IC1FSU87CisJCWdvdG8gZXJyb3Jfbm9fdGx2OworCX0KKwlza2JfcHVsbChhY2tfc2tiLCAodm9pZCAqKSB0bHYgLSAodm9pZCAqKSBhY2tfc2tiLT5kYXRhKTsKK2Vycm9yX21zZ190b19kZXY6CisJa2ZyZWUoY21kKTsKK2Vycm9yX2FsbG9jOgorCXJldHVybiBhY2tfc2tiOworCitlcnJvcl9ub190bHY6CitlcnJvcl9jbWRfZmFpbGVkOgorCWtmcmVlX3NrYihhY2tfc2tiKTsKKwlrZnJlZShjbWQpOworCXJldHVybiBFUlJfUFRSKHJlc3VsdCk7Cit9CisKKworLyogRmlybXdhcmUgaW50ZXJmYWNlIHZlcnNpb25zIHdlIHN1cHBvcnQgKi8KK2VudW0geworCUkyNDAwTV9IREl2X01BSk9SID0gOSwKKwlJMjQwME1fSERJdl9NQUpPUl8yID0gOCwKKwlJMjQwME1fSERJdl9NSU5PUiA9IDEsCit9OworCisKKy8qKgorICogaTI0MDBtX2Zpcm13YXJlX2NoZWNrIC0gY2hlY2sgZmlybXdhcmUgdmVyc2lvbnMgYXJlIGNvbXBhdGlibGUgd2l0aAorICogdGhlIGRyaXZlcgorICoKKyAqIEBpMjQwMG06IGRldmljZSBkZXNjcmlwdG9yCisgKgorICogUmV0dXJuczogMCBpZiBvaywgPCAwIGVycm5vIGNvZGUgYW4gZXJyb3IgYW5kIGEgbWVzc2FnZSBpbiB0aGUKKyAqICAgIGtlcm5lbCBsb2cuCisgKgorICogTG9uZyBmdW5jdGlvbiwgYnV0IHF1aXRlIHNpbXBsZTsgZmlyc3QgY2h1bmsgbGF1bmNoZXMgdGhlIGNvbW1hbmQKKyAqIGFuZCBkb3VibGUgY2hlY2tzIHRoZSByZXBseSBmb3IgdGhlIHJpZ2h0IFRMVi4gVGhlbiB3ZSBwcm9jZXNzIHRoZQorICogVExWICh3aGVyZSB0aGUgbWVhdCBpcykuCisgKi8KK2ludCBpMjQwMG1fZmlybXdhcmVfY2hlY2soc3RydWN0IGkyNDAwbSAqaTI0MDBtKQoreworCWludCByZXN1bHQ7CisJc3RydWN0IGRldmljZSAqZGV2ID0gaTI0MDBtX2RldihpMjQwMG0pOworCXN0cnVjdCBza19idWZmICphY2tfc2tiOworCXN0cnVjdCBpMjQwMG1fbDNsNF9oZHIgKmNtZDsKKwljb25zdCBzdHJ1Y3QgaTI0MDBtX2wzbDRfaGRyICphY2s7CisJc2l6ZV90IGFja19sZW47CisJY29uc3Qgc3RydWN0IGkyNDAwbV90bHZfaGRyICp0bHY7CisJY29uc3Qgc3RydWN0IGkyNDAwbV90bHZfbDRfbWVzc2FnZV92ZXJzaW9ucyAqbDRtdjsKKwljaGFyIHN0cmVyclszMl07CisJdW5zaWduZWQgbWFqb3IsIG1pbm9yLCBicmFuY2g7CisKKwlyZXN1bHQgPSAtRU5PTUVNOworCWNtZCA9IGt6YWxsb2Moc2l6ZW9mKCpjbWQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoY21kID09IE5VTEwpCisJCWdvdG8gZXJyb3JfYWxsb2M7CisJY21kLT50eXBlID0gY3B1X3RvX2xlMTYoSTI0MDBNX01UX0dFVF9MTV9WRVJTSU9OKTsKKwljbWQtPmxlbmd0aCA9IDA7CisJY21kLT52ZXJzaW9uID0gY3B1X3RvX2xlMTYoSTI0MDBNX0wzTDRfVkVSU0lPTik7CisKKwlhY2tfc2tiID0gaTI0MDBtX21zZ190b19kZXYoaTI0MDBtLCBjbWQsIHNpemVvZigqY21kKSk7CisJaWYgKElTX0VSUihhY2tfc2tiKSkgeworCQlyZXN1bHQgPSBQVFJfRVJSKGFja19za2IpOworCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byBpc3N1ZSAnZ2V0IGxtIHZlcnNpb24nIGNvbW1hbmQ6ICUtZFxuIiwKKwkJCXJlc3VsdCk7CisJCWdvdG8gZXJyb3JfbXNnX3RvX2RldjsKKwl9CisJYWNrID0gd2ltYXhfbXNnX2RhdGFfbGVuKGFja19za2IsICZhY2tfbGVuKTsKKwlyZXN1bHQgPSBpMjQwMG1fbXNnX2NoZWNrX3N0YXR1cyhhY2ssIHN0cmVyciwgc2l6ZW9mKHN0cmVycikpOworCWlmIChyZXN1bHQgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAiJ2dldCBsbSB2ZXJzaW9uJyAoMHglMDR4KSBjb21tYW5kIGZhaWxlZDogIgorCQkJIiVkIC0gJXNcbiIsIEkyNDAwTV9NVF9HRVRfTE1fVkVSU0lPTiwgcmVzdWx0LAorCQkJc3RyZXJyKTsKKwkJZ290byBlcnJvcl9jbWRfZmFpbGVkOworCX0KKwl0bHYgPSBpMjQwMG1fdGx2X2ZpbmQoaTI0MDBtLCBhY2stPnBsLCBhY2tfbGVuIC0gc2l6ZW9mKCphY2spLAorCQkJICAgICAgSTI0MDBNX1RMVl9MNF9NRVNTQUdFX1ZFUlNJT05TLCBzaXplb2YoKmw0bXYpKTsKKwlpZiAodGx2ID09IE5VTEwpIHsKKwkJZGV2X2VycihkZXYsICJnZXQgbG0gdmVyc2lvbjogVExWIG5vdCBmb3VuZCAoMHglMDR4KVxuIiwKKwkJCUkyNDAwTV9UTFZfTDRfTUVTU0FHRV9WRVJTSU9OUyk7CisJCXJlc3VsdCA9IC1FSU87CisJCWdvdG8gZXJyb3Jfbm9fdGx2OworCX0KKwlsNG12ID0gY29udGFpbmVyX29mKHRsdiwgdHlwZW9mKCpsNG12KSwgaGRyKTsKKwltYWpvciA9IGxlMTZfdG9fY3B1KGw0bXYtPm1ham9yKTsKKwltaW5vciA9IGxlMTZfdG9fY3B1KGw0bXYtPm1pbm9yKTsKKwlicmFuY2ggPSBsZTE2X3RvX2NwdShsNG12LT5icmFuY2gpOworCXJlc3VsdCA9IC1FSU5WQUw7CisJaWYgKG1ham9yICE9IEkyNDAwTV9IREl2X01BSk9SCisJICAgICYmIG1ham9yICE9IEkyNDAwTV9IREl2X01BSk9SXzIpIHsKKwkJZGV2X2VycihkZXYsICJ1bnN1cHBvcnRlZCBtYWpvciBmdyBpbnRlcmZhY2UgdmVyc2lvbiAiCisJCQkiJXUuJXUuJXVcbiIsIG1ham9yLCBtaW5vciwgYnJhbmNoKTsKKwkJZ290byBlcnJvcl9iYWRfbWFqb3I7CisJfQorCWlmIChtYWpvciA9PSBJMjQwME1fSERJdl9NQUpPUl8yKQorCQlkZXZfZXJyKGRldiwgImRlcHJlY2F0ZWQgbWFqb3IgZncgaW50ZXJmYWNlIHZlcnNpb24gIgorCQkJIiV1LiV1LiV1XG4iLCBtYWpvciwgbWlub3IsIGJyYW5jaCk7CisJcmVzdWx0ID0gMDsKKwlpZiAobWlub3IgIT0gSTI0MDBNX0hESXZfTUlOT1IpCisJCWRldl93YXJuKGRldiwgInVudGVzdGVkIG1pbm9yIGZ3IGZpcm13YXJlIHZlcnNpb24gJXUuJXUuJXVcbiIsCisJCQkgbWFqb3IsIG1pbm9yLCBicmFuY2gpOworZXJyb3JfYmFkX21ham9yOgorCWRldl9pbmZvKGRldiwgImZpcm13YXJlIGludGVyZmFjZSB2ZXJzaW9uICV1LiV1LiV1XG4iLAorCQkgbWFqb3IsIG1pbm9yLCBicmFuY2gpOworZXJyb3Jfbm9fdGx2OgorZXJyb3JfY21kX2ZhaWxlZDoKKwlrZnJlZV9za2IoYWNrX3NrYik7CitlcnJvcl9tc2dfdG9fZGV2OgorCWtmcmVlKGNtZCk7CitlcnJvcl9hbGxvYzoKKwlyZXR1cm4gcmVzdWx0OworfQorCisKKy8qCisgKiBTZW5kIGFuIERvRXhpdElkbGUgY29tbWFuZCB0byB0aGUgZGV2aWNlIHRvIGFzayBpdCB0byBnbyBvdXQgb2YKKyAqIGJhc2VzdGF0aW9uLWlkbGUgbW9kZS4KKyAqCisgKiBAaTI0MDBtOiBkZXZpY2UgZGVzY3JpcHRvcgorICoKKyAqIFRoaXMgc3RhcnRzIGEgcmVuZWdvdGlhdGlvbiB3aXRoIHRoZSBiYXNlc3RhdGlvbiB0aGF0IG1pZ2h0IGludm9sdmUKKyAqIGFub3RoZXIgY3J5cHRvIGhhbmRzaGFrZSB3aXRoIHVzZXIgc3BhY2UuCisgKgorICogUmV0dXJuczogMCBpZiBvaywgPCAwIGVycm5vIGNvZGUgb24gZXJyb3IuCisgKi8KK2ludCBpMjQwMG1fY21kX2V4aXRfaWRsZShzdHJ1Y3QgaTI0MDBtICppMjQwMG0pCit7CisJaW50IHJlc3VsdDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBpMjQwMG1fZGV2KGkyNDAwbSk7CisJc3RydWN0IHNrX2J1ZmYgKmFja19za2I7CisJc3RydWN0IGkyNDAwbV9sM2w0X2hkciAqY21kOworCWNoYXIgc3RyZXJyWzMyXTsKKworCXJlc3VsdCA9IC1FTk9NRU07CisJY21kID0ga3phbGxvYyhzaXplb2YoKmNtZCksIEdGUF9LRVJORUwpOworCWlmIChjbWQgPT0gTlVMTCkKKwkJZ290byBlcnJvcl9hbGxvYzsKKwljbWQtPnR5cGUgPSBjcHVfdG9fbGUxNihJMjQwME1fTVRfQ01EX0VYSVRfSURMRSk7CisJY21kLT5sZW5ndGggPSAwOworCWNtZC0+dmVyc2lvbiA9IGNwdV90b19sZTE2KEkyNDAwTV9MM0w0X1ZFUlNJT04pOworCisJYWNrX3NrYiA9IGkyNDAwbV9tc2dfdG9fZGV2KGkyNDAwbSwgY21kLCBzaXplb2YoKmNtZCkpOworCXJlc3VsdCA9IFBUUl9FUlIoYWNrX3NrYik7CisJaWYgKElTX0VSUihhY2tfc2tiKSkgeworCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byBpc3N1ZSAnZXhpdCBpZGxlJyBjb21tYW5kOiAlZFxuIiwKKwkJCXJlc3VsdCk7CisJCWdvdG8gZXJyb3JfbXNnX3RvX2RldjsKKwl9CisJcmVzdWx0ID0gaTI0MDBtX21zZ19jaGVja19zdGF0dXMod2ltYXhfbXNnX2RhdGEoYWNrX3NrYiksCisJCQkJCSBzdHJlcnIsIHNpemVvZihzdHJlcnIpKTsKKwlrZnJlZV9za2IoYWNrX3NrYik7CitlcnJvcl9tc2dfdG9fZGV2OgorCWtmcmVlKGNtZCk7CitlcnJvcl9hbGxvYzoKKwlyZXR1cm4gcmVzdWx0OworCit9CisKKworLyoKKyAqIFF1ZXJ5IHRoZSBkZXZpY2UgZm9yIGl0cyBzdGF0ZSwgdXBkYXRlIHRoZSBXaU1BWCBzdGFjaydzIGlkZWEgb2YgaXQKKyAqCisgKiBAaTI0MDBtOiBkZXZpY2UgZGVzY3JpcHRvcgorICoKKyAqIFJldHVybnM6IDAgaWYgb2ssIDwgMCBlcnJubyBjb2RlIG9uIGVycm9yLgorICoKKyAqIEV4ZWN1dGVzIGEgJ0dldCBTdGF0ZScgY29tbWFuZCBhbmQgcGFyc2VzIHRoZSByZXR1cm5lZAorICogVExWcy4KKyAqCisgKiBCZWNhdXNlIHRoaXMgaXMgYWxtb3N0IGlkZW50aWNhbCB0byBhICdSZXBvcnQgU3RhdGUnLCB3ZSB1c2UKKyAqIGkyNDAwbV9yZXBvcnRfc3RhdGVfaG9vaygpIHRvIHBhcnNlIHRoZSBhbnN3ZXIuIFRoaXMgd2lsbCBzZXQgdGhlCisgKiBjYXJyaWVyIHN0YXRlLCBhcyB3ZWxsIGFzIHRoZSBSRiBLaWxsIHN3aXRjaGVzIHN0YXRlLgorICovCitpbnQgaTI0MDBtX2NtZF9nZXRfc3RhdGUoc3RydWN0IGkyNDAwbSAqaTI0MDBtKQoreworCWludCByZXN1bHQ7CisJc3RydWN0IGRldmljZSAqZGV2ID0gaTI0MDBtX2RldihpMjQwMG0pOworCXN0cnVjdCBza19idWZmICphY2tfc2tiOworCXN0cnVjdCBpMjQwMG1fbDNsNF9oZHIgKmNtZDsKKwljb25zdCBzdHJ1Y3QgaTI0MDBtX2wzbDRfaGRyICphY2s7CisJc2l6ZV90IGFja19sZW47CisJY2hhciBzdHJlcnJbMzJdOworCisJcmVzdWx0ID0gLUVOT01FTTsKKwljbWQgPSBremFsbG9jKHNpemVvZigqY21kKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGNtZCA9PSBOVUxMKQorCQlnb3RvIGVycm9yX2FsbG9jOworCWNtZC0+dHlwZSA9IGNwdV90b19sZTE2KEkyNDAwTV9NVF9HRVRfU1RBVEUpOworCWNtZC0+bGVuZ3RoID0gMDsKKwljbWQtPnZlcnNpb24gPSBjcHVfdG9fbGUxNihJMjQwME1fTDNMNF9WRVJTSU9OKTsKKworCWFja19za2IgPSBpMjQwMG1fbXNnX3RvX2RldihpMjQwMG0sIGNtZCwgc2l6ZW9mKCpjbWQpKTsKKwlpZiAoSVNfRVJSKGFja19za2IpKSB7CisJCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIGlzc3VlICdnZXQgc3RhdGUnIGNvbW1hbmQ6ICVsZFxuIiwKKwkJCVBUUl9FUlIoYWNrX3NrYikpOworCQlyZXN1bHQgPSBQVFJfRVJSKGFja19za2IpOworCQlnb3RvIGVycm9yX21zZ190b19kZXY7CisJfQorCWFjayA9IHdpbWF4X21zZ19kYXRhX2xlbihhY2tfc2tiLCAmYWNrX2xlbik7CisJcmVzdWx0ID0gaTI0MDBtX21zZ19jaGVja19zdGF0dXMoYWNrLCBzdHJlcnIsIHNpemVvZihzdHJlcnIpKTsKKwlpZiAocmVzdWx0IDwgMCkgeworCQlkZXZfZXJyKGRldiwgIidnZXQgc3RhdGUnICgweCUwNHgpIGNvbW1hbmQgZmFpbGVkOiAiCisJCQkiJWQgLSAlc1xuIiwgSTI0MDBNX01UX0dFVF9TVEFURSwgcmVzdWx0LCBzdHJlcnIpOworCQlnb3RvIGVycm9yX2NtZF9mYWlsZWQ7CisJfQorCWkyNDAwbV9yZXBvcnRfc3RhdGVfaG9vayhpMjQwMG0sIGFjaywgYWNrX2xlbiAtIHNpemVvZigqYWNrKSwKKwkJCQkgIkdFVCBTVEFURSIpOworCXJlc3VsdCA9IDA7CisJa2ZyZWVfc2tiKGFja19za2IpOworZXJyb3JfY21kX2ZhaWxlZDoKK2Vycm9yX21zZ190b19kZXY6CisJa2ZyZWUoY21kKTsKK2Vycm9yX2FsbG9jOgorCXJldHVybiByZXN1bHQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChpMjQwMG1fY21kX2dldF9zdGF0ZSk7CisKKworLyoqCisgKiBTZXQgYmFzaWMgY29uZmlndXJhdGlvbiBzZXR0aW5ncworICoKKyAqIEBpMjQwMG06IGRldmljZSBkZXNjcmlwdG9yCisgKiBAYXJnczogYXJyYXkgb2YgcG9pbnRlcnMgdG8gdGhlIFRMViBoZWFkZXJzIHRvIHNlbmQgZm9yCisgKiAgICAgY29uZmlndXJhdGlvbiAoZWFjaCBmb2xsb3dlZCBieSBpdHMgcGF5bG9hZCkuCisgKiAgICAgVExWIGhlYWRlcnMgYW5kIHBheWxvYWRzIG11c3QgYmUgcHJvcGVybHkgaW5pdGlhbGl6ZWQsIHdpdGggdGhlCisgKiAgICAgcmlnaHQgZW5kaWFuZXNzIChMRSkuCisgKiBAYXJnX3NpemU6IG51bWJlciBvZiBwb2ludGVycyBpbiB0aGUgQGFyZ3MgYXJyYXkKKyAqLworaW50IGkyNDAwbV9zZXRfaW5pdF9jb25maWcoc3RydWN0IGkyNDAwbSAqaTI0MDBtLAorCQkJICAgY29uc3Qgc3RydWN0IGkyNDAwbV90bHZfaGRyICoqYXJnLCBzaXplX3QgYXJncykKK3sKKwlpbnQgcmVzdWx0OworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGkyNDAwbV9kZXYoaTI0MDBtKTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqYWNrX3NrYjsKKwlzdHJ1Y3QgaTI0MDBtX2wzbDRfaGRyICpjbWQ7CisJY2hhciBzdHJlcnJbMzJdOworCXVuc2lnbmVkIGFyZ2MsIGFyZ3NpemUsIHRsdl9zaXplOworCWNvbnN0IHN0cnVjdCBpMjQwMG1fdGx2X2hkciAqdGx2X2hkcjsKKwl2b2lkICpidWYsICppdHI7CisKKwlkX2Zuc3RhcnQoMywgZGV2LCAiKGkyNDAwbSAlcCBhcmcgJXAgYXJncyAlenUpXG4iLCBpMjQwMG0sIGFyZywgYXJncyk7CisJcmVzdWx0ID0gMDsKKwlpZiAoYXJncyA9PSAwKQorCQlnb3RvIG5vbmU7CisJLyogQ29tcHV0ZSB0aGUgc2l6ZSBvZiBhbGwgdGhlIFRMVnMsIHNvIHdlIGNhbiBhbGxvYyBhCisJICogY29udGlndW91cyBjb21tYW5kIGJsb2NrIHRvIGNvcHkgdGhlbS4gKi8KKwlhcmdzaXplID0gMDsKKwlmb3IgKGFyZ2MgPSAwOyBhcmdjIDwgYXJnczsgYXJnYysrKSB7CisJCXRsdl9oZHIgPSBhcmdbYXJnY107CisJCWFyZ3NpemUgKz0gc2l6ZW9mKCp0bHZfaGRyKSArIGxlMTZfdG9fY3B1KHRsdl9oZHItPmxlbmd0aCk7CisJfQorCVdBUk5fT04oYXJnYyA+PSA5KTsJLyogQXMgcGVyIGh3IHNwZWMgKi8KKworCS8qIEFsbG9jIHRoZSBzcGFjZSBmb3IgdGhlIGNvbW1hbmQgYW5kIFRMVnMqLworCXJlc3VsdCA9IC1FTk9NRU07CisJYnVmID0ga3phbGxvYyhzaXplb2YoKmNtZCkgKyBhcmdzaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoYnVmID09IE5VTEwpCisJCWdvdG8gZXJyb3JfYWxsb2M7CisJY21kID0gYnVmOworCWNtZC0+dHlwZSA9IGNwdV90b19sZTE2KEkyNDAwTV9NVF9TRVRfSU5JVF9DT05GSUcpOworCWNtZC0+bGVuZ3RoID0gY3B1X3RvX2xlMTYoYXJnc2l6ZSk7CisJY21kLT52ZXJzaW9uID0gY3B1X3RvX2xlMTYoSTI0MDBNX0wzTDRfVkVSU0lPTik7CisKKwkvKiBDb3B5IHRoZSBUTFZzICovCisJaXRyID0gYnVmICsgc2l6ZW9mKCpjbWQpOworCWZvciAoYXJnYyA9IDA7IGFyZ2MgPCBhcmdzOyBhcmdjKyspIHsKKwkJdGx2X2hkciA9IGFyZ1thcmdjXTsKKwkJdGx2X3NpemUgPSBzaXplb2YoKnRsdl9oZHIpICsgbGUxNl90b19jcHUodGx2X2hkci0+bGVuZ3RoKTsKKwkJbWVtY3B5KGl0ciwgdGx2X2hkciwgdGx2X3NpemUpOworCQlpdHIgKz0gdGx2X3NpemU7CisJfQorCisJLyogU2VuZCB0aGUgbWVzc2FnZSEgKi8KKwlhY2tfc2tiID0gaTI0MDBtX21zZ190b19kZXYoaTI0MDBtLCBidWYsIHNpemVvZigqY21kKSArIGFyZ3NpemUpOworCXJlc3VsdCA9IFBUUl9FUlIoYWNrX3NrYik7CisJaWYgKElTX0VSUihhY2tfc2tiKSkgeworCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byBpc3N1ZSAnaW5pdCBjb25maWcnIGNvbW1hbmQ6ICVkXG4iLAorCQkJcmVzdWx0KTsKKworCQlnb3RvIGVycm9yX21zZ190b19kZXY7CisJfQorCXJlc3VsdCA9IGkyNDAwbV9tc2dfY2hlY2tfc3RhdHVzKHdpbWF4X21zZ19kYXRhKGFja19za2IpLAorCQkJCQkgc3RyZXJyLCBzaXplb2Yoc3RyZXJyKSk7CisJaWYgKHJlc3VsdCA8IDApCisJCWRldl9lcnIoZGV2LCAiJ2luaXQgY29uZmlnJyAoMHglMDR4KSBjb21tYW5kIGZhaWxlZDogJWQgLSAlc1xuIiwKKwkJCUkyNDAwTV9NVF9TRVRfSU5JVF9DT05GSUcsIHJlc3VsdCwgc3RyZXJyKTsKKwlrZnJlZV9za2IoYWNrX3NrYik7CitlcnJvcl9tc2dfdG9fZGV2OgorCWtmcmVlKGJ1Zik7CitlcnJvcl9hbGxvYzoKK25vbmU6CisJZF9mbmVuZCgzLCBkZXYsICIoaTI0MDBtICVwIGFyZyAlcCBhcmdzICV6dSkgPSAlZFxuIiwKKwkJaTI0MDBtLCBhcmcsIGFyZ3MsIHJlc3VsdCk7CisJcmV0dXJuIHJlc3VsdDsKKworfQorRVhQT1JUX1NZTUJPTF9HUEwoaTI0MDBtX3NldF9pbml0X2NvbmZpZyk7CisKKworLyoqCisgKiBpMjQwMG1fZGV2X2luaXRpYWxpemUgLSBJbml0aWFsaXplIHRoZSBkZXZpY2Ugb25jZSBjb21tdW5pY2F0aW9ucyBhcmUgcmVhZHkKKyAqCisgKiBAaTI0MDBtOiBkZXZpY2UgZGVzY3JpcHRvcgorICoKKyAqIFJldHVybnM6IDAgaWYgb2ssIDwgMCBlcnJubyBjb2RlIG9uIGVycm9yLgorICoKKyAqIENvbmZpZ3VyZXMgdGhlIGRldmljZSB0byB3b3JrIHRoZSB3YXkgd2UgbGlrZSBpdC4KKyAqCisgKiBBdCB0aGUgcG9pbnQgb2YgdGhpcyBjYWxsLCB0aGUgZGV2aWNlIGlzIHJlZ2lzdGVyZWQgd2l0aCB0aGUgV2lNQVgKKyAqIGFuZCBuZXRkZXYgc3RhY2tzLCBmaXJtd2FyZSBpcyB1cGxvYWRlZCBhbmQgd2UgY2FuIHRhbGsgdG8gdGhlCisgKiBkZXZpY2Ugbm9ybWFsbHkuCisgKi8KK2ludCBpMjQwMG1fZGV2X2luaXRpYWxpemUoc3RydWN0IGkyNDAwbSAqaTI0MDBtKQoreworCWludCByZXN1bHQ7CisJc3RydWN0IGRldmljZSAqZGV2ID0gaTI0MDBtX2RldihpMjQwMG0pOworCXN0cnVjdCBpMjQwMG1fdGx2X2NvbmZpZ19pZGxlX3BhcmFtZXRlcnMgaWRsZV9wYXJhbXM7CisJY29uc3Qgc3RydWN0IGkyNDAwbV90bHZfaGRyICphcmdzWzldOworCXVuc2lnbmVkIGFyZ2MgPSAwOworCisJZF9mbnN0YXJ0KDMsIGRldiwgIihpMjQwMG0gJXApXG4iLCBpMjQwMG0pOworCS8qIFVzZWxlc3MgZm9yIG5vdy4uLm1pZ2h0IGNoYW5nZSAqLworCWlmIChpMjQwMG1faWRsZV9tb2RlX2Rpc2FibGVkKSB7CisJCWlkbGVfcGFyYW1zLmhkci50eXBlID0KKwkJCWNwdV90b19sZTE2KEkyNDAwTV9UTFZfQ09ORklHX0lETEVfUEFSQU1FVEVSUyk7CisJCWlkbGVfcGFyYW1zLmhkci5sZW5ndGggPSBjcHVfdG9fbGUxNigKKwkJCXNpemVvZihpZGxlX3BhcmFtcykgLSBzaXplb2YoaWRsZV9wYXJhbXMuaGRyKSk7CisJCWlkbGVfcGFyYW1zLmlkbGVfdGltZW91dCA9IDA7CisJCWlkbGVfcGFyYW1zLmlkbGVfcGFnaW5nX2ludGVydmFsID0gMDsKKwkJYXJnc1thcmdjKytdID0gJmlkbGVfcGFyYW1zLmhkcjsKKwl9CisJcmVzdWx0ID0gaTI0MDBtX3NldF9pbml0X2NvbmZpZyhpMjQwMG0sIGFyZ3MsIGFyZ2MpOworCWlmIChyZXN1bHQgPCAwKQorCQlnb3RvIGVycm9yOworCXJlc3VsdCA9IGkyNDAwbV9maXJtd2FyZV9jaGVjayhpMjQwMG0pOwkvKiBmdyB2ZXJzaW9ucyBvaz8gKi8KKwlpZiAocmVzdWx0IDwgMCkKKwkJZ290byBlcnJvcjsKKwkvKgorCSAqIFVwZGF0ZSBzdGF0ZTogSGVyZSBpdCBqdXN0IGNhbGxzIGEgZ2V0IHN0YXRlOyBwYXJzaW5nIHRoZQorCSAqIHJlc3VsdCAoU3lzdGVtIFN0YXRlIFRMViBhbmQgUkYgU3RhdHVzIFRMViBbZG9uZSBpbiB0aGUgcngKKwkgKiBwYXRoIGhvb2tzXSkgd2lsbCBzZXQgdGhlIGhhcmR3YXJlIGFuZCBzb2Z0d2FyZSBSRi1LaWxsCisJICogc3RhdHVzLgorCSAqLworCXJlc3VsdCA9IGkyNDAwbV9jbWRfZ2V0X3N0YXRlKGkyNDAwbSk7CitlcnJvcjoKKwlkX2ZuZW5kKDMsIGRldiwgIihpMjQwMG0gJXApID0gJWRcbiIsIGkyNDAwbSwgcmVzdWx0KTsKKwlyZXR1cm4gcmVzdWx0OworfQorCisKKy8qKgorICogaTI0MDBtX2Rldl9zaHV0ZG93biAtIFNodXRkb3duIGEgcnVubmluZyBkZXZpY2UKKyAqCisgKiBAaTI0MDBtOiBkZXZpY2UgZGVzY3JpcHRvcgorICoKKyAqIEdyYWNlZnVsbHkgc3RvcHMgdGhlIGRldmljZSwgbW92aW5nIGl0IHRvIHRoZSBsb3dlc3QgcG93ZXIKKyAqIGNvbnN1bXB0aW9uIHN0YXRlIHBvc3NpYmxlLgorICovCit2b2lkIGkyNDAwbV9kZXZfc2h1dGRvd24oc3RydWN0IGkyNDAwbSAqaTI0MDBtKQoreworCWludCByZXN1bHQgPSAtRU5PREVWOworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGkyNDAwbV9kZXYoaTI0MDBtKTsKKworCWRfZm5zdGFydCgzLCBkZXYsICIoaTI0MDBtICVwKVxuIiwgaTI0MDBtKTsKKwlyZXN1bHQgPSBpMjQwMG0tPmJ1c19yZXNldChpMjQwMG0sIEkyNDAwTV9SVF9XQVJNKTsKKwlkX2ZuZW5kKDMsIGRldiwgIihpMjQwMG0gJXApID0gdm9pZCBbJWRdXG4iLCBpMjQwMG0sIHJlc3VsdCk7CisJcmV0dXJuOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2ltYXgvaTI0MDBtL2RlYnVnLWxldmVscy5oIGIvZHJpdmVycy9uZXQvd2ltYXgvaTI0MDBtL2RlYnVnLWxldmVscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxODNiYWEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aW1heC9pMjQwMG0vZGVidWctbGV2ZWxzLmgKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIEludGVsIFdpcmVsZXNzIFdpTUFYIENvbm5lY3Rpb24gMjQwMG0KKyAqIERlYnVnIGxldmVscyBjb250cm9sIGZpbGUgZm9yIHRoZSBpMjQwMG0gbW9kdWxlCisgKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEludGVsIENvcnBvcmF0aW9uIDxsaW51eC13aW1heEBpbnRlbC5jb20+CisgKiBJbmFreSBQZXJlei1Hb256YWxleiA8aW5ha3kucGVyZXotZ29uemFsZXpAaW50ZWwuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworI2lmbmRlZiBfX2RlYnVnX2xldmVsc19faF9fCisjZGVmaW5lIF9fZGVidWdfbGV2ZWxzX19oX18KKworLyogTWF4aW11bSBjb21waWxlIGFuZCBydW4gdGltZSBkZWJ1ZyBsZXZlbCBmb3IgYWxsIHN1Ym1vZHVsZXMgKi8KKyNkZWZpbmUgRF9NT0RVTEVOQU1FIGkyNDAwbQorI2RlZmluZSBEX01BU1RFUiBDT05GSUdfV0lNQVhfSTI0MDBNX0RFQlVHX0xFVkVMCisKKyNpbmNsdWRlIDxsaW51eC93aW1heC9kZWJ1Zy5oPgorCisvKiBMaXN0IG9mIGFsbCB0aGUgZW5hYmxlZCBtb2R1bGVzICovCitlbnVtIGRfbW9kdWxlIHsKKwlEX1NVQk1PRFVMRV9ERUNMQVJFKGNvbnRyb2wpLAorCURfU1VCTU9EVUxFX0RFQ0xBUkUoZHJpdmVyKSwKKwlEX1NVQk1PRFVMRV9ERUNMQVJFKGRlYnVnZnMpLAorCURfU1VCTU9EVUxFX0RFQ0xBUkUoZncpLAorCURfU1VCTU9EVUxFX0RFQ0xBUkUobmV0ZGV2KSwKKwlEX1NVQk1PRFVMRV9ERUNMQVJFKHJma2lsbCksCisJRF9TVUJNT0RVTEVfREVDTEFSRShyeCksCisJRF9TVUJNT0RVTEVfREVDTEFSRSh0eCksCit9OworCisKKyNlbmRpZiAvKiAjaWZuZGVmIF9fZGVidWdfbGV2ZWxzX19oX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS9kZWJ1Z2ZzLmMgYi9kcml2ZXJzL25ldC93aW1heC9pMjQwMG0vZGVidWdmcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyNjYzMjkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aW1heC9pMjQwMG0vZGVidWdmcy5jCkBAIC0wLDAgKzEsMzkyIEBACisvKgorICogSW50ZWwgV2lyZWxlc3MgV2lNQVggQ29ubmVjdGlvbiAyNDAwbQorICogRGVidWdmcyBpbnRlcmZhY2VzIHRvIG1hbmlwdWxhdGUgZHJpdmVyIGFuZCBkZXZpY2UgaW5mb3JtYXRpb24KKyAqCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IEludGVsIENvcnBvcmF0aW9uIDxsaW51eC13aW1heEBpbnRlbC5jb20+CisgKiBJbmFreSBQZXJlei1Hb256YWxleiA8aW5ha3kucGVyZXotZ29uemFsZXpAaW50ZWwuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlICJpMjQwMG0uaCIKKworCisjZGVmaW5lIERfU1VCTU9EVUxFIGRlYnVnZnMKKyNpbmNsdWRlICJkZWJ1Zy1sZXZlbHMuaCIKKworc3RhdGljCitpbnQgZGVidWdmc19uZXRkZXZfcXVldWVfc3RvcHBlZF9nZXQodm9pZCAqZGF0YSwgdTY0ICp2YWwpCit7CisJc3RydWN0IGkyNDAwbSAqaTI0MDBtID0gZGF0YTsKKwkqdmFsID0gbmV0aWZfcXVldWVfc3RvcHBlZChpMjQwMG0tPndpbWF4X2Rldi5uZXRfZGV2KTsKKwlyZXR1cm4gMDsKK30KK0RFRklORV9TSU1QTEVfQVRUUklCVVRFKGZvcHNfbmV0ZGV2X3F1ZXVlX3N0b3BwZWQsCisJCQlkZWJ1Z2ZzX25ldGRldl9xdWV1ZV9zdG9wcGVkX2dldCwKKwkJCU5VTEwsICIlbGx1XG4iKTsKKworCitzdGF0aWMKK3N0cnVjdCBkZW50cnkgKmRlYnVnZnNfY3JlYXRlX25ldGRldl9xdWV1ZV9zdG9wcGVkKAorCWNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCBkZW50cnkgKnBhcmVudCwgc3RydWN0IGkyNDAwbSAqaTI0MDBtKQoreworCXJldHVybiBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKG5hbWUsIDA0MDAsIHBhcmVudCwgaTI0MDBtLAorCQkJCSAgICZmb3BzX25ldGRldl9xdWV1ZV9zdG9wcGVkKTsKK30KKworCisvKgorICogaW5vZGUtPmlfcHJpdmF0ZSBoYXMgdGhlIEBkYXRhIGFyZ3VtZW50IHRvIGRlYnVnZnNfY3JlYXRlX2ZpbGUoKQorICovCitzdGF0aWMKK2ludCBpMjQwMG1fc3RhdHNfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlmaWxwLT5wcml2YXRlX2RhdGEgPSBpbm9kZS0+aV9wcml2YXRlOworCXJldHVybiAwOworfQorCisvKgorICogV2UgZG9uJ3QgYWxsb3cgcGFydGlhbCByZWFkcyBvZiB0aGlzIGZpbGUsIGFzIHRoZW4gdGhlIHJlYWRlciB3b3VsZAorICogZ2V0IHdlaXJkbHkgY29uZnVzZWQgZGF0YSBhcyBpdCBpcyB1cGRhdGVkLgorICoKKyAqIFNvIG9yIHlvdSByZWFkIGl0IGFsbCBvciBub3RoaW5nOyBpZiB5b3UgdHJ5IHRvIHJlYWQgd2l0aCBhbiBvZmZzZXQKKyAqICE9IDAsIHdlIGNvbnNpZGVyIHlvdSBhcmUgZG9uZSByZWFkaW5nLgorICovCitzdGF0aWMKK3NzaXplX3QgaTI0MDBtX3J4X3N0YXRzX3JlYWQoc3RydWN0IGZpbGUgKmZpbHAsIGNoYXIgX191c2VyICpidWZmZXIsCisJCQkgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBpMjQwMG0gKmkyNDAwbSA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwljaGFyIGJ1ZlsxMjhdOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoKnBwb3MgIT0gMCkKKwkJcmV0dXJuIDA7CisJaWYgKGNvdW50IDwgc2l6ZW9mKGJ1ZikpCisJCXJldHVybiAtRU5PU1BDOworCXNwaW5fbG9ja19pcnFzYXZlKCZpMjQwMG0tPnJ4X2xvY2ssIGZsYWdzKTsKKwlzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJXUgJXUgJXUgJXUgJXUgJXUgJXVcbiIsCisJCSBpMjQwMG0tPnJ4X3BsX251bSwgaTI0MDBtLT5yeF9wbF9taW4sCisJCSBpMjQwMG0tPnJ4X3BsX21heCwgaTI0MDBtLT5yeF9udW0sCisJCSBpMjQwMG0tPnJ4X3NpemVfYWNjLAorCQkgaTI0MDBtLT5yeF9zaXplX21pbiwgaTI0MDBtLT5yeF9zaXplX21heCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaTI0MDBtLT5yeF9sb2NrLCBmbGFncyk7CisJcmV0dXJuIHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKGJ1ZmZlciwgY291bnQsIHBwb3MsIGJ1Ziwgc3RybGVuKGJ1ZikpOworfQorCisKKy8qIEFueSB3cml0ZSBjbGVhcnMgdGhlIHN0YXRzICovCitzdGF0aWMKK3NzaXplX3QgaTI0MDBtX3J4X3N0YXRzX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxwLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLAorCQkJICAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IGkyNDAwbSAqaTI0MDBtID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaTI0MDBtLT5yeF9sb2NrLCBmbGFncyk7CisJaTI0MDBtLT5yeF9wbF9udW0gPSAwOworCWkyNDAwbS0+cnhfcGxfbWF4ID0gMDsKKwlpMjQwMG0tPnJ4X3BsX21pbiA9IFVJTlRfTUFYOworCWkyNDAwbS0+cnhfbnVtID0gMDsKKwlpMjQwMG0tPnJ4X3NpemVfYWNjID0gMDsKKwlpMjQwMG0tPnJ4X3NpemVfbWluID0gVUlOVF9NQVg7CisJaTI0MDBtLT5yeF9zaXplX21heCA9IDA7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaTI0MDBtLT5yeF9sb2NrLCBmbGFncyk7CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMKK2NvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaTI0MDBtX3J4X3N0YXRzX2ZvcHMgPSB7CisJLm93bmVyID0JVEhJU19NT0RVTEUsCisJLm9wZW4gPQkJaTI0MDBtX3N0YXRzX29wZW4sCisJLnJlYWQgPQkJaTI0MDBtX3J4X3N0YXRzX3JlYWQsCisJLndyaXRlID0JaTI0MDBtX3J4X3N0YXRzX3dyaXRlLAorfTsKKworCisvKiBTZWUgaTI0MDBtX3J4X3N0YXRzX3JlYWQoKSAqLworc3RhdGljCitzc2l6ZV90IGkyNDAwbV90eF9zdGF0c19yZWFkKHN0cnVjdCBmaWxlICpmaWxwLCBjaGFyIF9fdXNlciAqYnVmZmVyLAorCQkJICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgaTI0MDBtICppMjQwMG0gPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJY2hhciBidWZbMTI4XTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKCpwcG9zICE9IDApCisJCXJldHVybiAwOworCWlmIChjb3VudCA8IHNpemVvZihidWYpKQorCQlyZXR1cm4gLUVOT1NQQzsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaTI0MDBtLT50eF9sb2NrLCBmbGFncyk7CisJc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiV1ICV1ICV1ICV1ICV1ICV1ICV1XG4iLAorCQkgaTI0MDBtLT50eF9wbF9udW0sIGkyNDAwbS0+dHhfcGxfbWluLAorCQkgaTI0MDBtLT50eF9wbF9tYXgsIGkyNDAwbS0+dHhfbnVtLAorCQkgaTI0MDBtLT50eF9zaXplX2FjYywKKwkJIGkyNDAwbS0+dHhfc2l6ZV9taW4sIGkyNDAwbS0+dHhfc2l6ZV9tYXgpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmkyNDAwbS0+dHhfbG9jaywgZmxhZ3MpOworCXJldHVybiBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcihidWZmZXIsIGNvdW50LCBwcG9zLCBidWYsIHN0cmxlbihidWYpKTsKK30KKworLyogQW55IHdyaXRlIGNsZWFycyB0aGUgc3RhdHMgKi8KK3N0YXRpYworc3NpemVfdCBpMjQwMG1fdHhfc3RhdHNfd3JpdGUoc3RydWN0IGZpbGUgKmZpbHAsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsCisJCQkgICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgaTI0MDBtICppMjQwMG0gPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpMjQwMG0tPnR4X2xvY2ssIGZsYWdzKTsKKwlpMjQwMG0tPnR4X3BsX251bSA9IDA7CisJaTI0MDBtLT50eF9wbF9tYXggPSAwOworCWkyNDAwbS0+dHhfcGxfbWluID0gVUlOVF9NQVg7CisJaTI0MDBtLT50eF9udW0gPSAwOworCWkyNDAwbS0+dHhfc2l6ZV9hY2MgPSAwOworCWkyNDAwbS0+dHhfc2l6ZV9taW4gPSBVSU5UX01BWDsKKwlpMjQwMG0tPnR4X3NpemVfbWF4ID0gMDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpMjQwMG0tPnR4X2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYworY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBpMjQwMG1fdHhfc3RhdHNfZm9wcyA9IHsKKwkub3duZXIgPQlUSElTX01PRFVMRSwKKwkub3BlbiA9CQlpMjQwMG1fc3RhdHNfb3BlbiwKKwkucmVhZCA9CQlpMjQwMG1fdHhfc3RhdHNfcmVhZCwKKwkud3JpdGUgPQlpMjQwMG1fdHhfc3RhdHNfd3JpdGUsCit9OworCisKKy8qIFdyaXRlIDEgdG8gYXNrIHRoZSBkZXZpY2UgdG8gZ28gaW50byBzdXNwZW5kICovCitzdGF0aWMKK2ludCBkZWJ1Z2ZzX2kyNDAwbV9zdXNwZW5kX3NldCh2b2lkICpkYXRhLCB1NjQgdmFsKQoreworCWludCByZXN1bHQ7CisJc3RydWN0IGkyNDAwbSAqaTI0MDBtID0gZGF0YTsKKwlyZXN1bHQgPSBpMjQwMG1fY21kX2VudGVyX3Bvd2Vyc2F2ZShpMjQwMG0pOworCWlmIChyZXN1bHQgPj0gMCkKKwkJcmVzdWx0ID0gMDsKKwlyZXR1cm4gcmVzdWx0OworfQorREVGSU5FX1NJTVBMRV9BVFRSSUJVVEUoZm9wc19pMjQwMG1fc3VzcGVuZCwKKwkJCU5VTEwsIGRlYnVnZnNfaTI0MDBtX3N1c3BlbmRfc2V0LAorCQkJIiVsbHVcbiIpOworCitzdGF0aWMKK3N0cnVjdCBkZW50cnkgKmRlYnVnZnNfY3JlYXRlX2kyNDAwbV9zdXNwZW5kKAorCWNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCBkZW50cnkgKnBhcmVudCwgc3RydWN0IGkyNDAwbSAqaTI0MDBtKQoreworCXJldHVybiBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKG5hbWUsIDAyMDAsIHBhcmVudCwgaTI0MDBtLAorCQkJCSAgICZmb3BzX2kyNDAwbV9zdXNwZW5kKTsKK30KKworCisvKgorICogUmVzZXQgdGhlIGRldmljZQorICoKKyAqIFdyaXRlIDAgdG8gYXNrIHRoZSBkZXZpY2UgdG8gc29mdCByZXNldCwgMSB0byBjb2xkIHJlc2V0LCAyIHRvIGJ1cworICogcmVzZXQgKGFzIGRlZmluZWQgYnkgZW51bSBpMjQwMG1fcmVzZXRfdHlwZSkuCisgKi8KK3N0YXRpYworaW50IGRlYnVnZnNfaTI0MDBtX3Jlc2V0X3NldCh2b2lkICpkYXRhLCB1NjQgdmFsKQoreworCWludCByZXN1bHQ7CisJc3RydWN0IGkyNDAwbSAqaTI0MDBtID0gZGF0YTsKKwllbnVtIGkyNDAwbV9yZXNldF90eXBlIHJ0ID0gdmFsOworCXN3aXRjaChydCkgeworCWNhc2UgSTI0MDBNX1JUX1dBUk06CisJY2FzZSBJMjQwME1fUlRfQ09MRDoKKwljYXNlIEkyNDAwTV9SVF9CVVM6CisJCXJlc3VsdCA9IGkyNDAwbS0+YnVzX3Jlc2V0KGkyNDAwbSwgcnQpOworCQlpZiAocmVzdWx0ID49IDApCisJCQlyZXN1bHQgPSAwOworCWRlZmF1bHQ6CisJCXJlc3VsdCA9IC1FSU5WQUw7CisJfQorCXJldHVybiByZXN1bHQ7Cit9CitERUZJTkVfU0lNUExFX0FUVFJJQlVURShmb3BzX2kyNDAwbV9yZXNldCwKKwkJCU5VTEwsIGRlYnVnZnNfaTI0MDBtX3Jlc2V0X3NldCwKKwkJCSIlbGx1XG4iKTsKKworc3RhdGljCitzdHJ1Y3QgZGVudHJ5ICpkZWJ1Z2ZzX2NyZWF0ZV9pMjQwMG1fcmVzZXQoCisJY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IGRlbnRyeSAqcGFyZW50LCBzdHJ1Y3QgaTI0MDBtICppMjQwMG0pCit7CisJcmV0dXJuIGRlYnVnZnNfY3JlYXRlX2ZpbGUobmFtZSwgMDIwMCwgcGFyZW50LCBpMjQwMG0sCisJCQkJICAgJmZvcHNfaTI0MDBtX3Jlc2V0KTsKK30KKworLyoKKyAqIERlYnVnIGxldmVscyBjb250cm9sOyBzZWUgZGVidWcuaAorICovCitzdHJ1Y3QgZF9sZXZlbCBEX0xFVkVMW10gPSB7CisJRF9TVUJNT0RVTEVfREVGSU5FKGNvbnRyb2wpLAorCURfU1VCTU9EVUxFX0RFRklORShkcml2ZXIpLAorCURfU1VCTU9EVUxFX0RFRklORShkZWJ1Z2ZzKSwKKwlEX1NVQk1PRFVMRV9ERUZJTkUoZncpLAorCURfU1VCTU9EVUxFX0RFRklORShuZXRkZXYpLAorCURfU1VCTU9EVUxFX0RFRklORShyZmtpbGwpLAorCURfU1VCTU9EVUxFX0RFRklORShyeCksCisJRF9TVUJNT0RVTEVfREVGSU5FKHR4KSwKK307CitzaXplX3QgRF9MRVZFTF9TSVpFID0gQVJSQVlfU0laRShEX0xFVkVMKTsKKworI2RlZmluZSBfX2RlYnVnZnNfcmVnaXN0ZXIocHJlZml4LCBuYW1lLCBwYXJlbnQpCQkJXAorZG8gewkJCQkJCQkJCVwKKwlyZXN1bHQgPSBkX2xldmVsX3JlZ2lzdGVyX2RlYnVnZnMocHJlZml4LCBuYW1lLCBwYXJlbnQpOwlcCisJaWYgKHJlc3VsdCA8IDApCQkJCQkJCVwKKwkJZ290byBlcnJvcjsJCQkJCQlcCit9IHdoaWxlICgwKQorCisKK2ludCBpMjQwMG1fZGVidWdmc19hZGQoc3RydWN0IGkyNDAwbSAqaTI0MDBtKQoreworCWludCByZXN1bHQ7CisJc3RydWN0IGRldmljZSAqZGV2ID0gaTI0MDBtX2RldihpMjQwMG0pOworCXN0cnVjdCBkZW50cnkgKmRlbnRyeSA9IGkyNDAwbS0+d2ltYXhfZGV2LmRlYnVnZnNfZGVudHJ5OworCXN0cnVjdCBkZW50cnkgKmZkOworCisJZGVudHJ5ID0gZGVidWdmc19jcmVhdGVfZGlyKCJpMjQwMG0iLCBkZW50cnkpOworCXJlc3VsdCA9IFBUUl9FUlIoZGVudHJ5KTsKKwlpZiAoSVNfRVJSKGRlbnRyeSkpIHsKKwkJaWYgKHJlc3VsdCA9PSAtRU5PREVWKQorCQkJcmVzdWx0ID0gMDsJLyogTm8gZGVidWdmcyBzdXBwb3J0ICovCisJCWdvdG8gZXJyb3I7CisJfQorCWkyNDAwbS0+ZGVidWdmc19kZW50cnkgPSBkZW50cnk7CisJX19kZWJ1Z2ZzX3JlZ2lzdGVyKCJkbF8iLCBjb250cm9sLCBkZW50cnkpOworCV9fZGVidWdmc19yZWdpc3RlcigiZGxfIiwgZHJpdmVyLCBkZW50cnkpOworCV9fZGVidWdmc19yZWdpc3RlcigiZGxfIiwgZGVidWdmcywgZGVudHJ5KTsKKwlfX2RlYnVnZnNfcmVnaXN0ZXIoImRsXyIsIGZ3LCBkZW50cnkpOworCV9fZGVidWdmc19yZWdpc3RlcigiZGxfIiwgbmV0ZGV2LCBkZW50cnkpOworCV9fZGVidWdmc19yZWdpc3RlcigiZGxfIiwgcmZraWxsLCBkZW50cnkpOworCV9fZGVidWdmc19yZWdpc3RlcigiZGxfIiwgcngsIGRlbnRyeSk7CisJX19kZWJ1Z2ZzX3JlZ2lzdGVyKCJkbF8iLCB0eCwgZGVudHJ5KTsKKworCWZkID0gZGVidWdmc19jcmVhdGVfc2l6ZV90KCJ0eF9pbiIsIDA0MDAsIGRlbnRyeSwKKwkJCQkgICAmaTI0MDBtLT50eF9pbik7CisJcmVzdWx0ID0gUFRSX0VSUihmZCk7CisJaWYgKElTX0VSUihmZCkgJiYgcmVzdWx0ICE9IC1FTk9ERVYpIHsKKwkJZGV2X2VycihkZXYsICJDYW4ndCBjcmVhdGUgZGVidWdmcyBlbnRyeSAiCisJCQkidHhfaW46ICVkXG4iLCByZXN1bHQpOworCQlnb3RvIGVycm9yOworCX0KKworCWZkID0gZGVidWdmc19jcmVhdGVfc2l6ZV90KCJ0eF9vdXQiLCAwNDAwLCBkZW50cnksCisJCQkJICAgJmkyNDAwbS0+dHhfb3V0KTsKKwlyZXN1bHQgPSBQVFJfRVJSKGZkKTsKKwlpZiAoSVNfRVJSKGZkKSAmJiByZXN1bHQgIT0gLUVOT0RFVikgeworCQlkZXZfZXJyKGRldiwgIkNhbid0IGNyZWF0ZSBkZWJ1Z2ZzIGVudHJ5ICIKKwkJCSJ0eF9vdXQ6ICVkXG4iLCByZXN1bHQpOworCQlnb3RvIGVycm9yOworCX0KKworCWZkID0gZGVidWdmc19jcmVhdGVfdTMyKCJzdGF0ZSIsIDA2MDAsIGRlbnRyeSwKKwkJCQkmaTI0MDBtLT5zdGF0ZSk7CisJcmVzdWx0ID0gUFRSX0VSUihmZCk7CisJaWYgKElTX0VSUihmZCkgJiYgcmVzdWx0ICE9IC1FTk9ERVYpIHsKKwkJZGV2X2VycihkZXYsICJDYW4ndCBjcmVhdGUgZGVidWdmcyBlbnRyeSAiCisJCQkic3RhdGU6ICVkXG4iLCByZXN1bHQpOworCQlnb3RvIGVycm9yOworCX0KKworCS8qCisJICogVHJhY2UgcmVjZWl2ZWQgbWVzc2FnZXMgZnJvbSB1c2VyIHNwYWNlCisJICoKKwkgKiBJbiBvcmRlciB0byB0YXAgdGhlIGJpZGlyZWN0aW9uYWwgbWVzc2FnZSBzdHJlYW0gaW4gdGhlCisJICogJ21zZycgcGlwZSwgdXNlciBzcGFjZSBjYW4gcmVhZCBmcm9tIHRoZSAnbXNnJyBwaXBlOworCSAqIGhvd2V2ZXIsIGR1ZSB0byBsaW1pdGF0aW9ucyBpbiBsaWJubCwgd2UgY2FuJ3Qga25vdyB3aGF0CisJICogdGhlIGRpZmZlcmVudCBhcHBsaWNhdGlvbnMgYXJlIHNlbmRpbmcgZG93biB0byB0aGUga2VybmVsLgorCSAqCisJICogU28gd2UgaGF2ZSB0aGlzIGhhY2sgd2hlcmUgdGhlIGRyaXZlciB3aWxsIGVjaG8gYW55IG1lc3NhZ2UKKwkgKiByZWNlaXZlZCBvbiB0aGUgbXNnIHBpcGUgZnJvbSB1c2VyIHNwYWNlIFt0aHJvdWdoIGEgY2FsbCB0bworCSAqIHdpbWF4X2Rldi0+b3BfbXNnX2Zyb21fdXNlcigpIGludG8KKwkgKiBpMjQwMG1fb3BfbXNnX2Zyb21fdXNlcigpXSBpbnRvIHRoZSAndHJhY2UnIHBpcGUgdGhhdCB0aGlzCisJICogZHJpdmVyIGNyZWF0ZXMuCisJICoKKwkgKiBTbyB0aGVuLCByZWFkaW5nIGZyb20gYm90aCB0aGUgJ3RyYWNlJyBhbmQgJ21zZycgcGlwZXMgaW4KKwkgKiB1c2VyIHNwYWNlIHdpbGwgcHJvdmlkZSBhIGZ1bGwgZHVtcCBvZiB0aGUgdHJhZmZpYy4KKwkgKgorCSAqIFdyaXRlIDEgdG8gYWN0aXZhdGUsIDAgdG8gY2xlYXIuCisJICoKKwkgKiBJdCBpcyBub3QgcmVhbGx5IHZlcnkgYXRvbWljLCBidXQgaXQgaXMgYWxzbyBub3QgdG9vCisJICogY3JpdGljYWwuCisJICovCisJZmQgPSBkZWJ1Z2ZzX2NyZWF0ZV91OCgidHJhY2VfbXNnX2Zyb21fdXNlciIsIDA2MDAsIGRlbnRyeSwKKwkJCSAgICAgICAmaTI0MDBtLT50cmFjZV9tc2dfZnJvbV91c2VyKTsKKwlyZXN1bHQgPSBQVFJfRVJSKGZkKTsKKwlpZiAoSVNfRVJSKGZkKSAmJiByZXN1bHQgIT0gLUVOT0RFVikgeworCQlkZXZfZXJyKGRldiwgIkNhbid0IGNyZWF0ZSBkZWJ1Z2ZzIGVudHJ5ICIKKwkJCSJ0cmFjZV9tc2dfZnJvbV91c2VyOiAlZFxuIiwgcmVzdWx0KTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlmZCA9IGRlYnVnZnNfY3JlYXRlX25ldGRldl9xdWV1ZV9zdG9wcGVkKCJuZXRkZXZfcXVldWVfc3RvcHBlZCIsCisJCQkJCQkgZGVudHJ5LCBpMjQwMG0pOworCXJlc3VsdCA9IFBUUl9FUlIoZmQpOworCWlmIChJU19FUlIoZmQpICYmIHJlc3VsdCAhPSAtRU5PREVWKSB7CisJCWRldl9lcnIoZGV2LCAiQ2FuJ3QgY3JlYXRlIGRlYnVnZnMgZW50cnkgIgorCQkJIm5ldGRldl9xdWV1ZV9zdG9wcGVkOiAlZFxuIiwgcmVzdWx0KTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlmZCA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoInJ4X3N0YXRzIiwgMDYwMCwgZGVudHJ5LCBpMjQwMG0sCisJCQkJICZpMjQwMG1fcnhfc3RhdHNfZm9wcyk7CisJcmVzdWx0ID0gUFRSX0VSUihmZCk7CisJaWYgKElTX0VSUihmZCkgJiYgcmVzdWx0ICE9IC1FTk9ERVYpIHsKKwkJZGV2X2VycihkZXYsICJDYW4ndCBjcmVhdGUgZGVidWdmcyBlbnRyeSAiCisJCQkicnhfc3RhdHM6ICVkXG4iLCByZXN1bHQpOworCQlnb3RvIGVycm9yOworCX0KKworCWZkID0gZGVidWdmc19jcmVhdGVfZmlsZSgidHhfc3RhdHMiLCAwNjAwLCBkZW50cnksIGkyNDAwbSwKKwkJCQkgJmkyNDAwbV90eF9zdGF0c19mb3BzKTsKKwlyZXN1bHQgPSBQVFJfRVJSKGZkKTsKKwlpZiAoSVNfRVJSKGZkKSAmJiByZXN1bHQgIT0gLUVOT0RFVikgeworCQlkZXZfZXJyKGRldiwgIkNhbid0IGNyZWF0ZSBkZWJ1Z2ZzIGVudHJ5ICIKKwkJCSJ0eF9zdGF0czogJWRcbiIsIHJlc3VsdCk7CisJCWdvdG8gZXJyb3I7CisJfQorCisJZmQgPSBkZWJ1Z2ZzX2NyZWF0ZV9pMjQwMG1fc3VzcGVuZCgic3VzcGVuZCIsIGRlbnRyeSwgaTI0MDBtKTsKKwlyZXN1bHQgPSBQVFJfRVJSKGZkKTsKKwlpZiAoSVNfRVJSKGZkKSAmJiByZXN1bHQgIT0gLUVOT0RFVikgeworCQlkZXZfZXJyKGRldiwgIkNhbid0IGNyZWF0ZSBkZWJ1Z2ZzIGVudHJ5IHN1c3BlbmQ6ICVkXG4iLAorCQkJcmVzdWx0KTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlmZCA9IGRlYnVnZnNfY3JlYXRlX2kyNDAwbV9yZXNldCgicmVzZXQiLCBkZW50cnksIGkyNDAwbSk7CisJcmVzdWx0ID0gUFRSX0VSUihmZCk7CisJaWYgKElTX0VSUihmZCkgJiYgcmVzdWx0ICE9IC1FTk9ERVYpIHsKKwkJZGV2X2VycihkZXYsICJDYW4ndCBjcmVhdGUgZGVidWdmcyBlbnRyeSByZXNldDogJWRcbiIsIHJlc3VsdCk7CisJCWdvdG8gZXJyb3I7CisJfQorCisJcmVzdWx0ID0gMDsKK2Vycm9yOgorCXJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgaTI0MDBtX2RlYnVnZnNfcm0oc3RydWN0IGkyNDAwbSAqaTI0MDBtKQoreworCWRlYnVnZnNfcmVtb3ZlX3JlY3Vyc2l2ZShpMjQwMG0tPmRlYnVnZnNfZGVudHJ5KTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS9kcml2ZXIuYyBiL2RyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS9kcml2ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Zjk4MDQ3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2ltYXgvaTI0MDBtL2RyaXZlci5jCkBAIC0wLDAgKzEsNzI4IEBACisvKgorICogSW50ZWwgV2lyZWxlc3MgV2lNQVggQ29ubmVjdGlvbiAyNDAwbQorICogR2VuZXJpYyBwcm9iZS9kaXNjb25uZWN0LCByZXNldCBhbmQgbWVzc2FnZSBwYXNzaW5nCisgKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEludGVsIENvcnBvcmF0aW9uIDxsaW51eC13aW1heEBpbnRlbC5jb20+CisgKiBJbmFreSBQZXJlei1Hb256YWxleiA8aW5ha3kucGVyZXotZ29uemFsZXpAaW50ZWwuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEsIFVTQS4KKyAqCisgKgorICogU2VlIGkyNDAwbS5oIGZvciBkcml2ZXIgZG9jdW1lbnRhdGlvbi4gVGhpcyBjb250YWlucyBoZWxwZXJzIGZvcgorICogdGhlIGRyaXZlciBtb2RlbCBnbHVlIFtfc2V0dXAoKS9fcmVsZWFzZSgpXSwgaGFuZGxpbmcgZGV2aWNlIHJlc2V0cworICogW19kZXZfcmVzZXRfaGFuZGxlKCldLCBhbmQgdGhlIGJhY2tlbmRzIGZvciB0aGUgV2lNQVggc3RhY2sgb3BzCisgKiByZXNldCBbX29wX3Jlc2V0KCldIGFuZCBtZXNzYWdlIGZyb20gdXNlciBbX29wX21zZ19mcm9tX3VzZXIoKV0uCisgKgorICogUk9BRE1BUDoKKyAqCisgKiBpMjQwMG1fb3BfbXNnX2Zyb21fdXNlcigpCisgKiAgIGkyNDAwbV9tc2dfdG9fZGV2KCkKKyAqICAgd2ltYXhfbXNnX3RvX3VzZXJfc2VuZCgpCisgKgorICogaTI0MDBtX29wX3Jlc2V0KCkKKyAqICAgaTI0MG0tPmJ1c19yZXNldCgpCisgKgorICogaTI0MDBtX2Rldl9yZXNldF9oYW5kbGUoKQorICogICBfX2kyNDAwbV9kZXZfcmVzZXRfaGFuZGxlKCkKKyAqICAgICBfX2kyNDAwbV9kZXZfc3RvcCgpCisgKiAgICAgX19pMjQwMG1fZGV2X3N0YXJ0KCkKKyAqCisgKiBpMjQwMG1fc2V0dXAoKQorICogICBpMjQwMG1fYm9vdHJvbV9pbml0KCkKKyAqICAgcmVnaXN0ZXJfbmV0ZGV2KCkKKyAqICAgaTI0MDBtX2Rldl9zdGFydCgpCisgKiAgICAgX19pMjQwMG1fZGV2X3N0YXJ0KCkKKyAqICAgICAgIGkyNDAwbV9kZXZfYm9vdHN0cmFwKCkKKyAqICAgICAgIGkyNDAwbV90eF9zZXR1cCgpCisgKiAgICAgICBpMjQwMG0tPmJ1c19kZXZfc3RhcnQoKQorICogICAgICAgaTI0MDBtX2NoZWNrX21hY19hZGRyKCkKKyAqICAgd2ltYXhfZGV2X2FkZCgpCisgKgorICogaTI0MDBtX3JlbGVhc2UoKQorICogICB3aW1heF9kZXZfcm0oKQorICogICBpMjQwMG1fZGV2X3N0b3AoKQorICogICAgIF9faTI0MDBtX2Rldl9zdG9wKCkKKyAqICAgICAgIGkyNDAwbV9kZXZfc2h1dGRvd24oKQorICogICAgICAgaTI0MDBtLT5idXNfZGV2X3N0b3AoKQorICogICAgICAgaTI0MDBtX3R4X3JlbGVhc2UoKQorICogICB1bnJlZ2lzdGVyX25ldGRldigpCisgKi8KKyNpbmNsdWRlICJpMjQwMG0uaCIKKyNpbmNsdWRlIDxsaW51eC93aW1heC9pMjQwMG0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorCisjZGVmaW5lIERfU1VCTU9EVUxFIGRyaXZlcgorI2luY2x1ZGUgImRlYnVnLWxldmVscy5oIgorCisKK2ludCBpMjQwMG1faWRsZV9tb2RlX2Rpc2FibGVkOwkvKiAwIChpZGxlIG1vZGUgZW5hYmxlZCkgYnkgZGVmYXVsdCAqLworbW9kdWxlX3BhcmFtX25hbWVkKGlkbGVfbW9kZV9kaXNhYmxlZCwgaTI0MDBtX2lkbGVfbW9kZV9kaXNhYmxlZCwgaW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoaWRsZV9tb2RlX2Rpc2FibGVkLAorCQkgIklmIHRydWUsIHRoZSBkZXZpY2Ugd2lsbCBub3QgZW5hYmxlIGlkbGUgbW9kZSBuZWdvdGlhdGlvbiAiCisJCSAid2l0aCB0aGUgYmFzZSBzdGF0aW9uICh3aGVuIGNvbm5lY3RlZCkgdG8gc2F2ZSBwb3dlci4iKTsKKworLyoqCisgKiBpMjQwMG1fcXVldWVfd29yayAtIHNjaGVkdWxlIHdvcmsgb24gYSBpMjQwMG0ncyBxdWV1ZQorICoKKyAqIEBpMjQwMG06IGRldmljZSBkZXNjcmlwdG9yCisgKgorICogQGZuOiBmdW5jdGlvbiB0byBydW4gdG8gZXhlY3V0ZSB3b3JrLiBJdCBnZXRzIHBhc3NlZCBhICdzdHJ1Y3QKKyAqICAgICB3b3JrX3N0cnVjdCcgdGhhdCBpcyB3cmFwcGVkIGluIGEgJ3N0cnVjdCBpMjQwMG1fd29yaycuIE9uY2UKKyAqICAgICBkb25lLCB5b3UgaGF2ZSB0byAoMSkgaTI0MDBtX3B1dChpMjQwMG1fd29yay0+aTI0MDBtKSBhbmQgdGhlbgorICogICAgICgyKSBrZnJlZShpMjQwMG1fd29yaykuCisgKgorICogQGdmcF9mbGFnczogR0ZQIGZsYWdzIGZvciBtZW1vcnkgYWxsb2NhdGlvbi4KKyAqCisgKiBAcGw6IHBvaW50ZXIgdG8gYSBwYXlsb2FkIGJ1ZmZlciB0aGF0IHlvdSB3YW50IHRvIHBhc3MgdG8gdGhlIF93b3JrCisgKiAgICAgZnVuY3Rpb24uIFVzZSB0aGlzIHRvIHBhY2sgKGZvciBleGFtcGxlKSBhIHN0cnVjdCB3aXRoIGV4dHJhCisgKiAgICAgYXJndW1lbnRzLgorICoKKyAqIEBwbF9zaXplOiBzaXplIG9mIHRoZSBwYXlsb2FkIGJ1ZmZlci4KKyAqCisgKiBXZSBkbyB0aGlzIHF1aXRlIG9mdGVuLCBzbyB0aGlzIGp1c3Qgc2F2ZXMgdHlwaW5nOyBhbGxvY2F0ZSBhCisgKiB3cmFwcGVyIGZvciBhIGkyNDAwbSwgZ2V0IGEgcmVmIHRvIGl0LCBwYWNrIGFyZ3VtZW50cyBhbmQgbGF1bmNoCisgKiB0aGUgd29yay4KKyAqCisgKiBBIHVzdWFsIHdvcmtmbG93IGlzOgorICoKKyAqIHN0cnVjdCBteV93b3JrX2FyZ3MgeworICogICAgICAgICB2b2lkICpzb21ldGhpbmc7CisgKiAgICAgICAgIGludCB3aGF0ZXZlcjsKKyAqIH07CisgKiAuLi4KKyAqCisgKiBzdHJ1Y3QgbXlfd29ya19hcmdzIG15X2FyZ3MgPSB7CisgKiAgICAgICAgIC5zb21ldGhpbmcgPSBGT08sCisgKiAgICAgICAgIC53aGFldGV2ZXIgPSBCTEFICisgKiB9OworICogaTI0MDBtX3F1ZXVlX3dvcmsoaTI0MDBtLCAxLCBteV93b3JrX2Z1bmN0aW9uLCBHRlBfS0VSTkVMLAorICogICAgICAgICAgICAgICAgICAgJmFyZ3MsIHNpemVvZihhcmdzKSkKKyAqCisgKiBBbmQgbm93IHRoZSB3b3JrIGZ1bmN0aW9uIGNhbiB1bnBhY2sgdGhlIGFyZ3VtZW50cyBhbmQgY2FsbCB0aGUKKyAqIHJlYWwgZnVuY3Rpb24gKG9yIGRvIHRoZSBqb2IgaXRzZWxmKToKKyAqCisgKiBzdGF0aWMKKyAqIHZvaWQgbXlfd29ya19mbigoc3RydWN0IHdvcmtfc3RydWN0ICp3cykKKyAqIHsKKyAqICAgICAgICAgc3RydWN0IGkyNDAwbV93b3JrICppdyA9CisgKgkgICAgICAgICAgIGNvbnRhaW5lcl9vZih3cywgc3RydWN0IGkyNDAwbV93b3JrLCB3cyk7CisgKgkgICBzdHJ1Y3QgbXlfd29ya19hcmdzICpteV9hcmdzID0gKHZvaWQgKikgaXctPnBsOworICoKKyAqCSAgIG15X3dvcmsoaXctPmkyNDAwbSwgbXlfYXJncy0+c29tZXRoaW5nLCBteV9hcmdzLT53aGF0ZXZlcnQpOworICogfQorICovCitpbnQgaTI0MDBtX3F1ZXVlX3dvcmsoc3RydWN0IGkyNDAwbSAqaTI0MDBtLAorCQkgICAgICB2b2lkICgqZm4pKHN0cnVjdCB3b3JrX3N0cnVjdCAqKSwgZ2ZwX3QgZ2ZwX2ZsYWdzLAorCQkgICAgICBjb25zdCB2b2lkICpwbCwgc2l6ZV90IHBsX3NpemUpCit7CisJaW50IHJlc3VsdDsKKwlzdHJ1Y3QgaTI0MDBtX3dvcmsgKml3OworCisJQlVHX09OKGkyNDAwbS0+d29ya19xdWV1ZSA9PSBOVUxMKTsKKwlyZXN1bHQgPSAtRU5PTUVNOworCWl3ID0ga3phbGxvYyhzaXplb2YoKml3KSArIHBsX3NpemUsIGdmcF9mbGFncyk7CisJaWYgKGl3ID09IE5VTEwpCisJCWdvdG8gZXJyb3Jfa3phbGxvYzsKKwlpdy0+aTI0MDBtID0gaTI0MDBtX2dldChpMjQwMG0pOworCW1lbWNweShpdy0+cGwsIHBsLCBwbF9zaXplKTsKKwlJTklUX1dPUksoJml3LT53cywgZm4pOworCXJlc3VsdCA9IHF1ZXVlX3dvcmsoaTI0MDBtLT53b3JrX3F1ZXVlLCAmaXctPndzKTsKK2Vycm9yX2t6YWxsb2M6CisJcmV0dXJuIHJlc3VsdDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGkyNDAwbV9xdWV1ZV93b3JrKTsKKworCisvKgorICogU2NoZWR1bGUgaTI0MDBtJ3Mgc3BlY2lmaWMgd29yayBvbiB0aGUgc3lzdGVtJ3MgcXVldWUuCisgKgorICogVXNlZCBmb3IgYSBmZXcgY2FzZXMgd2hlcmUgd2UgcmVhbGx5IG5lZWQgaXQ7IG90aGVyd2lzZSwgaWRlbnRpY2FsCisgKiB0byBpMjQwMG1fcXVldWVfd29yaygpLgorICoKKyAqIFJldHVybnMgPCAwIGVycm5vIGNvZGUgb24gZXJyb3IsIDEgaWYgb2suCisgKgorICogSWYgaXQgcmV0dXJucyB6ZXJvLCBzb21ldGhpbmcgcmVhbGx5IGJhZCBoYXBwZW5lZCwgYXMgaXQgbWVhbnMgdGhlCisgKiB3b3JrcyBzdHJ1Y3Qgd2FzIGFscmVhZHkgcXVldWVkLCBidXQgd2UgaGF2ZSBqdXN0IGFsbG9jYXRlZCBpdCwgc28KKyAqIGl0IHNob3VsZCBub3QgaGFwcGVuLgorICovCitpbnQgaTI0MDBtX3NjaGVkdWxlX3dvcmsoc3RydWN0IGkyNDAwbSAqaTI0MDBtLAorCQkJIHZvaWQgKCpmbikoc3RydWN0IHdvcmtfc3RydWN0ICopLCBnZnBfdCBnZnBfZmxhZ3MpCit7CisJaW50IHJlc3VsdDsKKwlzdHJ1Y3QgaTI0MDBtX3dvcmsgKml3OworCisJQlVHX09OKGkyNDAwbS0+d29ya19xdWV1ZSA9PSBOVUxMKTsKKwlyZXN1bHQgPSAtRU5PTUVNOworCWl3ID0ga3phbGxvYyhzaXplb2YoKml3KSwgZ2ZwX2ZsYWdzKTsKKwlpZiAoaXcgPT0gTlVMTCkKKwkJZ290byBlcnJvcl9remFsbG9jOworCWl3LT5pMjQwMG0gPSBpMjQwMG1fZ2V0KGkyNDAwbSk7CisJSU5JVF9XT1JLKCZpdy0+d3MsIGZuKTsKKwlyZXN1bHQgPSBzY2hlZHVsZV93b3JrKCZpdy0+d3MpOworCWlmIChyZXN1bHQgPT0gMCkKKwkJcmVzdWx0ID0gLUVOWElPOworZXJyb3Jfa3phbGxvYzoKKwlyZXR1cm4gcmVzdWx0OworfQorCisKKy8qCisgKiBXaU1BWCBzdGFjayBvcGVyYXRpb246IHJlbGF5IGEgbWVzc2FnZSBmcm9tIHVzZXIgc3BhY2UKKyAqCisgKiBAd2ltYXhfZGV2OiBkZXZpY2UgZGVzY3JpcHRvcgorICogQHBpcGVfbmFtZTogbmFtZWQgcGlwZSB0aGUgbWVzc2FnZSBpcyBmb3IKKyAqIEBtc2dfYnVmOiBwb2ludGVyIHRvIHRoZSBtZXNzYWdlIGJ5dGVzCisgKiBAbXNnX2xlbjogbGVuZ3RoIG9mIHRoZSBidWZmZXIKKyAqIEBnZW5sX2luZm86IHBhc3NlZCBieSB0aGUgZ2VuZXJpYyBuZXRsaW5rIGxheWVyCisgKgorICogVGhlIFdpTUFYIHN0YWNrIHdpbGwgY2FsbCB0aGlzIGZ1bmN0aW9uIHdoZW4gYSBtZXNzYWdlIHdhcyByZWNlaXZlZAorICogZnJvbSB1c2VyIHNwYWNlLgorICoKKyAqIEZvciB0aGUgaTI0MDBtLCB0aGlzIGlzIGFuIEwzTDQgbWVzc2FnZSwgYXMgc3BlY2lmaWVkIGluCisgKiBpbmNsdWRlL2xpbnV4L3dpbWF4L2kyNDAwbS5oLCBhbmQgdGh1cyBwcmVmaXhlZCB3aXRoIGEgJ3N0cnVjdAorICogaTI0MDBtX2wzbDRfaGRyJy4gRHJpdmVyIChhbmQgZGV2aWNlKSBleHBlY3QgdGhlIG1lc3NhZ2VzIHRvIGJlCisgKiBjb2RlZCBpbiBMaXR0bGUgRW5kaWFuLgorICoKKyAqIFRoaXMgZnVuY3Rpb24ganVzdCB2ZXJpZmllcyB0aGF0IHRoZSBoZWFkZXIgZGVjbGFyYXRpb24gYW5kIHRoZQorICogcGF5bG9hZCBhcmUgY29uc2lzdGVudCBhbmQgdGhlbiBkZWFscyB3aXRoIGl0LCBlaXRoZXIgZm9yd2FyZGluZyBpdAorICogdG8gdGhlIGRldmljZSBvciBwcm9jZXNpbmcgaXQgbG9jYWxseS4KKyAqCisgKiBJbiB0aGUgaTI0MDBtLCBtZXNzYWdlcyBhcmUgYmFzaWNhbGx5IGNvbW1hbmRzIHRoYXQgd2lsbCBjYXJyeSBhbgorICogYWNrLCBzbyB3ZSB1c2UgaTI0MDBtX21zZ190b19kZXYoKSBhbmQgdGhlbiBkZWxpdmVyIHRoZSBhY2sgYmFjayB0bworICogdXNlciBzcGFjZS4gVGhlIHJ4LmMgY29kZSBtaWdodCBpbnRlcmNlcHQgdGhlIHJlc3BvbnNlIGFuZCB1c2UgaXQKKyAqIHRvIHVwZGF0ZSB0aGUgZHJpdmVyJ3Mgc3RhdGUsIGJ1dCB0aGVuIGl0IHdpbGwgcGFzcyBpdCBvbiBzbyBpdCBjYW4KKyAqIGJlIHJlbGF5ZWQgYmFjayB0byB1c2VyIHNwYWNlLgorICoKKyAqIE5vdGUgdGhhdCBhc3luY2hyb25vdXMgZXZlbnRzIGZyb20gdGhlIGRldmljZSBhcmUgcHJvY2Vzc2VkIGFuZAorICogc2VudCB0byB1c2VyIHNwYWNlIGluIHJ4LmMuCisgKi8KK3N0YXRpYworaW50IGkyNDAwbV9vcF9tc2dfZnJvbV91c2VyKHN0cnVjdCB3aW1heF9kZXYgKndpbWF4X2RldiwKKwkJCSAgICBjb25zdCBjaGFyICpwaXBlX25hbWUsCisJCQkgICAgY29uc3Qgdm9pZCAqbXNnX2J1Ziwgc2l6ZV90IG1zZ19sZW4sCisJCQkgICAgY29uc3Qgc3RydWN0IGdlbmxfaW5mbyAqZ2VubF9pbmZvKQoreworCWludCByZXN1bHQ7CisJc3RydWN0IGkyNDAwbSAqaTI0MDBtID0gd2ltYXhfZGV2X3RvX2kyNDAwbSh3aW1heF9kZXYpOworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGkyNDAwbV9kZXYoaTI0MDBtKTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqYWNrX3NrYjsKKworCWRfZm5zdGFydCg0LCBkZXYsICIod2ltYXhfZGV2ICVwIFtpMjQwMG0gJXBdIG1zZ19idWYgJXAgIgorCQkgICJtc2dfbGVuICV6dSBnZW5sX2luZm8gJXApXG4iLCB3aW1heF9kZXYsIGkyNDAwbSwKKwkJICBtc2dfYnVmLCBtc2dfbGVuLCBnZW5sX2luZm8pOworCWFja19za2IgPSBpMjQwMG1fbXNnX3RvX2RldihpMjQwMG0sIG1zZ19idWYsIG1zZ19sZW4pOworCXJlc3VsdCA9IFBUUl9FUlIoYWNrX3NrYik7CisJaWYgKElTX0VSUihhY2tfc2tiKSkKKwkJZ290byBlcnJvcl9tc2dfdG9fZGV2OworCWlmICh1bmxpa2VseShpMjQwMG0tPnRyYWNlX21zZ19mcm9tX3VzZXIpKQorCQl3aW1heF9tc2coJmkyNDAwbS0+d2ltYXhfZGV2LCAidHJhY2UiLAorCQkJICBtc2dfYnVmLCBtc2dfbGVuLCBHRlBfS0VSTkVMKTsKKwlyZXN1bHQgPSB3aW1heF9tc2dfc2VuZCgmaTI0MDBtLT53aW1heF9kZXYsIGFja19za2IpOworZXJyb3JfbXNnX3RvX2RldjoKKwlkX2ZuZW5kKDQsIGRldiwgIih3aW1heF9kZXYgJXAgW2kyNDAwbSAlcF0gbXNnX2J1ZiAlcCBtc2dfbGVuICV6dSAiCisJCSJnZW5sX2luZm8gJXApID0gJWRcbiIsIHdpbWF4X2RldiwgaTI0MDBtLCBtc2dfYnVmLCBtc2dfbGVuLAorCQlnZW5sX2luZm8sIHJlc3VsdCk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworCisvKgorICogQ29udGV4dCB0byB3YWl0IGZvciBhIHJlc2V0IHRvIGZpbmFsaXplCisgKi8KK3N0cnVjdCBpMjQwMG1fcmVzZXRfY3R4IHsKKwlzdHJ1Y3QgY29tcGxldGlvbiBjb21wbGV0aW9uOworCWludCByZXN1bHQ7Cit9OworCisKKy8qCisgKiBXaU1BWCBzdGFjayBvcGVyYXRpb246IHJlc2V0IGEgZGV2aWNlCisgKgorICogQHdpbWF4X2RldjogZGV2aWNlIGRlc2NyaXB0b3IKKyAqCisgKiBTZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIHdpbWF4X3Jlc2V0KCkgYW5kIHdpbWF4X2Rldi0+b3BfcmVzZXQgZm9yCisgKiB0aGUgcmVxdWlyZW1lbnRzIG9mIHRoaXMgZnVuY3Rpb24uIFRoZSBXaU1BWCBzdGFjayBndWFyYW50ZWVzCisgKiBzZXJpYWxpemF0aW9uIG9uIGNhbGxzIHRvIHRoaXMgZnVuY3Rpb24uCisgKgorICogRG8gYSB3YXJtIHJlc2V0IG9uIHRoZSBkZXZpY2U7IGlmIGl0IGZhaWxzLCByZXNvcnQgdG8gYSBjb2xkIHJlc2V0CisgKiBhbmQgcmV0dXJuIC1FTk9ERVYuIE9uIHN1Y2Nlc3NmdWwgd2FybSByZXNldCwgd2UgbmVlZCB0byBibG9jaworICogdW50aWwgaXQgaXMgY29tcGxldGUuCisgKgorICogVGhlIGJ1cy1kcml2ZXIgaW1wbGVtZW50YXRpb24gb2YgcmVzZXQgdGFrZXMgY2FyZSBvZiBmYWxsaW5nIGJhY2sKKyAqIHRvIGNvbGQgcmVzZXQgaWYgd2FybSBmYWlscy4KKyAqLworc3RhdGljCitpbnQgaTI0MDBtX29wX3Jlc2V0KHN0cnVjdCB3aW1heF9kZXYgKndpbWF4X2RldikKK3sKKwlpbnQgcmVzdWx0OworCXN0cnVjdCBpMjQwMG0gKmkyNDAwbSA9IHdpbWF4X2Rldl90b19pMjQwMG0od2ltYXhfZGV2KTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBpMjQwMG1fZGV2KGkyNDAwbSk7CisJc3RydWN0IGkyNDAwbV9yZXNldF9jdHggY3R4ID0geworCQkuY29tcGxldGlvbiA9IENPTVBMRVRJT05fSU5JVElBTElaRVJfT05TVEFDSyhjdHguY29tcGxldGlvbiksCisJCS5yZXN1bHQgPSAwLAorCX07CisKKwlkX2Zuc3RhcnQoNCwgZGV2LCAiKHdpbWF4X2RldiAlcClcbiIsIHdpbWF4X2Rldik7CisJbXV0ZXhfbG9jaygmaTI0MDBtLT5pbml0X211dGV4KTsKKwlpMjQwMG0tPnJlc2V0X2N0eCA9ICZjdHg7CisJbXV0ZXhfdW5sb2NrKCZpMjQwMG0tPmluaXRfbXV0ZXgpOworCXJlc3VsdCA9IGkyNDAwbS0+YnVzX3Jlc2V0KGkyNDAwbSwgSTI0MDBNX1JUX1dBUk0pOworCWlmIChyZXN1bHQgPCAwKQorCQlnb3RvIG91dDsKKwlyZXN1bHQgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJmN0eC5jb21wbGV0aW9uLCA0KkhaKTsKKwlpZiAocmVzdWx0ID09IDApCisJCXJlc3VsdCA9IC1FVElNRURPVVQ7CisJZWxzZSBpZiAocmVzdWx0ID4gMCkKKwkJcmVzdWx0ID0gY3R4LnJlc3VsdDsKKwkvKiBpZiByZXN1bHQgPCAwLCBwYXNzIGl0IG9uICovCisJbXV0ZXhfbG9jaygmaTI0MDBtLT5pbml0X211dGV4KTsKKwlpMjQwMG0tPnJlc2V0X2N0eCA9IE5VTEw7CisJbXV0ZXhfdW5sb2NrKCZpMjQwMG0tPmluaXRfbXV0ZXgpOworb3V0OgorCWRfZm5lbmQoNCwgZGV2LCAiKHdpbWF4X2RldiAlcCkgPSAlZFxuIiwgd2ltYXhfZGV2LCByZXN1bHQpOworCXJldHVybiByZXN1bHQ7Cit9CisKKworLyoKKyAqIENoZWNrIHRoZSBNQUMgYWRkcmVzcyB3ZSBnb3QgZnJvbSBib290IG1vZGUgaXMgb2sKKyAqCisgKiBAaTI0MDBtOiBkZXZpY2UgZGVzY3JpcHRvcgorICoKKyAqIFJldHVybnM6IDAgaWYgb2ssIDwgMCBlcnJubyBjb2RlIG9uIGVycm9yLgorICovCitzdGF0aWMKK2ludCBpMjQwMG1fY2hlY2tfbWFjX2FkZHIoc3RydWN0IGkyNDAwbSAqaTI0MDBtKQoreworCWludCByZXN1bHQ7CisJc3RydWN0IGRldmljZSAqZGV2ID0gaTI0MDBtX2RldihpMjQwMG0pOworCXN0cnVjdCBza19idWZmICpza2I7CisJY29uc3Qgc3RydWN0IGkyNDAwbV90bHZfZGV0YWlsZWRfZGV2aWNlX2luZm8gKmRkaTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiA9IGkyNDAwbS0+d2ltYXhfZGV2Lm5ldF9kZXY7CisJY29uc3QgdW5zaWduZWQgY2hhciB6ZXJvbWFjW0VUSF9BTEVOXSA9IHsgMCB9OworCisJZF9mbnN0YXJ0KDMsIGRldiwgIihpMjQwMG0gJXApXG4iLCBpMjQwMG0pOworCXNrYiA9IGkyNDAwbV9nZXRfZGV2aWNlX2luZm8oaTI0MDBtKTsKKwlpZiAoSVNfRVJSKHNrYikpIHsKKwkJcmVzdWx0ID0gUFRSX0VSUihza2IpOworCQlkZXZfZXJyKGRldiwgIkNhbm5vdCB2ZXJpZnkgTUFDIGFkZHJlc3MsIGVycm9yIHJlYWRpbmc6ICVkXG4iLAorCQkJcmVzdWx0KTsKKwkJZ290byBlcnJvcjsKKwl9CisJLyogRXh0cmFjdCBNQUMgYWRkcmVzc3MgKi8KKwlkZGkgPSAodm9pZCAqKSBza2ItPmRhdGE7CisJQlVJTERfQlVHX09OKEVUSF9BTEVOICE9IHNpemVvZihkZGktPm1hY19hZGRyZXNzKSk7CisJZF9wcmludGYoMiwgZGV2LCAiR0VUIERFVklDRSBJTkZPOiBtYWMgYWRkciAiCisJCSAiJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisJCSBkZGktPm1hY19hZGRyZXNzWzBdLCBkZGktPm1hY19hZGRyZXNzWzFdLAorCQkgZGRpLT5tYWNfYWRkcmVzc1syXSwgZGRpLT5tYWNfYWRkcmVzc1szXSwKKwkJIGRkaS0+bWFjX2FkZHJlc3NbNF0sIGRkaS0+bWFjX2FkZHJlc3NbNV0pOworCWlmICghbWVtY21wKG5ldF9kZXYtPnBlcm1fYWRkciwgZGRpLT5tYWNfYWRkcmVzcywKKwkJICAgc2l6ZW9mKGRkaS0+bWFjX2FkZHJlc3MpKSkKKwkJZ290byBvazsKKwlkZXZfd2FybihkZXYsICJ3YXJuaW5nOiBkZXZpY2UgcmVwb3J0cyBhIGRpZmZlcmVudCBNQUMgYWRkcmVzcyAiCisJCSAidG8gdGhhdCBvZiBib290IG1vZGUnc1xuIik7CisJZGV2X3dhcm4oZGV2LCAiZGV2aWNlIHJlcG9ydHMgICAgICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorCQkgZGRpLT5tYWNfYWRkcmVzc1swXSwgZGRpLT5tYWNfYWRkcmVzc1sxXSwKKwkJIGRkaS0+bWFjX2FkZHJlc3NbMl0sIGRkaS0+bWFjX2FkZHJlc3NbM10sCisJCSBkZGktPm1hY19hZGRyZXNzWzRdLCBkZGktPm1hY19hZGRyZXNzWzVdKTsKKwlkZXZfd2FybihkZXYsICJib290IG1vZGUgcmVwb3J0ZWQgJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisJCSBuZXRfZGV2LT5wZXJtX2FkZHJbMF0sIG5ldF9kZXYtPnBlcm1fYWRkclsxXSwKKwkJIG5ldF9kZXYtPnBlcm1fYWRkclsyXSwgbmV0X2Rldi0+cGVybV9hZGRyWzNdLAorCQkgbmV0X2Rldi0+cGVybV9hZGRyWzRdLCBuZXRfZGV2LT5wZXJtX2FkZHJbNV0pOworCWlmICghbWVtY21wKHplcm9tYWMsIGRkaS0+bWFjX2FkZHJlc3MsIHNpemVvZih6ZXJvbWFjKSkpCisJCWRldl9lcnIoZGV2LCAiZGV2aWNlIHJlcG9ydHMgYW4gaW52YWxpZCBNQUMgYWRkcmVzcywgIgorCQkJIm5vdCB1cGRhdGluZ1xuIik7CisJZWxzZSB7CisJCWRldl93YXJuKGRldiwgInVwZGF0aW5nIE1BQyBhZGRyZXNzXG4iKTsKKwkJbmV0X2Rldi0+YWRkcl9sZW4gPSBFVEhfQUxFTjsKKwkJbWVtY3B5KG5ldF9kZXYtPnBlcm1fYWRkciwgZGRpLT5tYWNfYWRkcmVzcywgRVRIX0FMRU4pOworCQltZW1jcHkobmV0X2Rldi0+ZGV2X2FkZHIsIGRkaS0+bWFjX2FkZHJlc3MsIEVUSF9BTEVOKTsKKwl9CitvazoKKwlyZXN1bHQgPSAwOworCWtmcmVlX3NrYihza2IpOworZXJyb3I6CisJZF9mbmVuZCgzLCBkZXYsICIoaTI0MDBtICVwKSA9ICVkXG4iLCBpMjQwMG0sIHJlc3VsdCk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworCisvKioKKyAqIF9faTI0MDBtX2Rldl9zdGFydCAtIEJyaW5nIHVwIGRyaXZlciBjb21tdW5pY2F0aW9uIHdpdGggdGhlIGRldmljZQorICoKKyAqIEBpMjQwMG06IGRldmljZSBkZXNjcmlwdG9yCisgKiBAZmxhZ3M6IGJvb3QgbW9kZSBmbGFncworICoKKyAqIFJldHVybnM6IDAgaWYgb2ssIDwgMCBlcnJubyBjb2RlIG9uIGVycm9yLgorICoKKyAqIFVwbG9hZHMgZmlybXdhcmUgYW5kIGJyaW5ncyB1cCBhbGwgdGhlIHJlc291cmNlcyBuZWVkZWQgdG8gYmUgYWJsZQorICogdG8gY29tbXVuaWNhdGUgd2l0aCB0aGUgZGV2aWNlLgorICoKKyAqIFRYIG5lZWRzIHRvIGJlIHNldHVwIGJlZm9yZSB0aGUgYnVzLXNwZWNpZmljIGNvZGUgKG90aGVyd2lzZSBvbgorICogc2h1dGRvd24sIHRoZSBidXMtdHggY29kZSBjb3VsZCB0cnkgdG8gYWNjZXNzIGl0KS4KKyAqLworc3RhdGljCitpbnQgX19pMjQwMG1fZGV2X3N0YXJ0KHN0cnVjdCBpMjQwMG0gKmkyNDAwbSwgZW51bSBpMjQwMG1fYnJpIGZsYWdzKQoreworCWludCByZXN1bHQ7CisJc3RydWN0IHdpbWF4X2RldiAqd2ltYXhfZGV2ID0gJmkyNDAwbS0+d2ltYXhfZGV2OworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2ID0gd2ltYXhfZGV2LT5uZXRfZGV2OworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGkyNDAwbV9kZXYoaTI0MDBtKTsKKwlpbnQgdGltZXMgPSAzOworCisJZF9mbnN0YXJ0KDMsIGRldiwgIihpMjQwMG0gJXApXG4iLCBpMjQwMG0pOworcmV0cnk6CisJcmVzdWx0ID0gaTI0MDBtX2Rldl9ib290c3RyYXAoaTI0MDBtLCBmbGFncyk7CisJaWYgKHJlc3VsdCA8IDApIHsKKwkJZGV2X2VycihkZXYsICJjYW5ub3QgYm9vdHN0cmFwIGRldmljZTogJWRcbiIsIHJlc3VsdCk7CisJCWdvdG8gZXJyb3JfYm9vdHN0cmFwOworCX0KKwlyZXN1bHQgPSBpMjQwMG1fdHhfc2V0dXAoaTI0MDBtKTsKKwlpZiAocmVzdWx0IDwgMCkKKwkJZ290byBlcnJvcl90eF9zZXR1cDsKKwlyZXN1bHQgPSBpMjQwMG0tPmJ1c19kZXZfc3RhcnQoaTI0MDBtKTsKKwlpZiAocmVzdWx0IDwgMCkKKwkJZ290byBlcnJvcl9idXNfZGV2X3N0YXJ0OworCWkyNDAwbS0+d29ya19xdWV1ZSA9IGNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlKHdpbWF4X2Rldi0+bmFtZSk7CisJaWYgKGkyNDAwbS0+d29ya19xdWV1ZSA9PSBOVUxMKSB7CisJCXJlc3VsdCA9IC1FTk9NRU07CisJCWRldl9lcnIoZGV2LCAiY2Fubm90IGNyZWF0ZSB3b3JrcXVldWVcbiIpOworCQlnb3RvIGVycm9yX2NyZWF0ZV93b3JrcXVldWU7CisJfQorCS8qIEF0IHRoaXMgcG9pbnQgaXMgb2sgdG8gc2VuZCBjb21tYW5kcyB0byB0aGUgZGV2aWNlICovCisJcmVzdWx0ID0gaTI0MDBtX2NoZWNrX21hY19hZGRyKGkyNDAwbSk7CisJaWYgKHJlc3VsdCA8IDApCisJCWdvdG8gZXJyb3JfY2hlY2tfbWFjX2FkZHI7CisJaTI0MDBtLT5yZWFkeSA9IDE7CisJd2ltYXhfc3RhdGVfY2hhbmdlKHdpbWF4X2RldiwgV0lNQVhfU1RfVU5JTklUSUFMSVpFRCk7CisJcmVzdWx0ID0gaTI0MDBtX2Rldl9pbml0aWFsaXplKGkyNDAwbSk7CisJaWYgKHJlc3VsdCA8IDApCisJCWdvdG8gZXJyb3JfZGV2X2luaXRpYWxpemU7CisJLyogQXQgdGhpcyBwb2ludCwgcmVwb3J0cyB3aWxsIGNvbWUgZm9yIHRoZSBkZXZpY2UgYW5kIHNldCBpdAorCSAqIHRvIHRoZSByaWdodCBzdGF0ZSBpZiBpdCBpcyBkaWZmZXJlbnQgdGhhbiBVTklOSVRJQUxJWkVEICovCisJZF9mbmVuZCgzLCBkZXYsICIobmV0X2RldiAlcCBbaTI0MDBtICVwXSkgPSAlZFxuIiwKKwkJbmV0X2RldiwgaTI0MDBtLCByZXN1bHQpOworCXJldHVybiByZXN1bHQ7CisKK2Vycm9yX2Rldl9pbml0aWFsaXplOgorZXJyb3JfY2hlY2tfbWFjX2FkZHI6CisJZGVzdHJveV93b3JrcXVldWUoaTI0MDBtLT53b3JrX3F1ZXVlKTsKK2Vycm9yX2NyZWF0ZV93b3JrcXVldWU6CisJaTI0MDBtLT5idXNfZGV2X3N0b3AoaTI0MDBtKTsKK2Vycm9yX2J1c19kZXZfc3RhcnQ6CisJaTI0MDBtX3R4X3JlbGVhc2UoaTI0MDBtKTsKK2Vycm9yX3R4X3NldHVwOgorZXJyb3JfYm9vdHN0cmFwOgorCWlmIChyZXN1bHQgPT0gLUVSRVNUQVJUU1lTICYmIHRpbWVzLS0gPiAwKSB7CisJCWZsYWdzID0gSTI0MDBNX0JSSV9TT0ZUOworCQlnb3RvIHJldHJ5OworCX0KKwlkX2ZuZW5kKDMsIGRldiwgIihuZXRfZGV2ICVwIFtpMjQwMG0gJXBdKSA9ICVkXG4iLAorCQluZXRfZGV2LCBpMjQwMG0sIHJlc3VsdCk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworCitzdGF0aWMKK2ludCBpMjQwMG1fZGV2X3N0YXJ0KHN0cnVjdCBpMjQwMG0gKmkyNDAwbSwgZW51bSBpMjQwMG1fYnJpIGJtX2ZsYWdzKQoreworCWludCByZXN1bHQ7CisJbXV0ZXhfbG9jaygmaTI0MDBtLT5pbml0X211dGV4KTsJLyogV2VsbCwgc3RhcnQgdGhlIGRldmljZSAqLworCXJlc3VsdCA9IF9faTI0MDBtX2Rldl9zdGFydChpMjQwMG0sIGJtX2ZsYWdzKTsKKwlpZiAocmVzdWx0ID49IDApCisJCWkyNDAwbS0+dXBkb3duID0gMTsKKwltdXRleF91bmxvY2soJmkyNDAwbS0+aW5pdF9tdXRleCk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworCisvKioKKyAqIGkyNDAwbV9kZXZfc3RvcCAtIFRlYXIgZG93biBkcml2ZXIgY29tbXVuaWNhdGlvbiB3aXRoIHRoZSBkZXZpY2UKKyAqCisgKiBAaTI0MDBtOiBkZXZpY2UgZGVzY3JpcHRvcgorICoKKyAqIFJldHVybnM6IDAgaWYgb2ssIDwgMCBlcnJubyBjb2RlIG9uIGVycm9yLgorICoKKyAqIFJlbGVhc2VzIGFsbCB0aGUgcmVzb3VyY2VzIGFsbG9jYXRlZCB0byBjb21tdW5pY2F0ZSB3aXRoIHRoZSBkZXZpY2UuCisgKi8KK3N0YXRpYwordm9pZCBfX2kyNDAwbV9kZXZfc3RvcChzdHJ1Y3QgaTI0MDBtICppMjQwMG0pCit7CisJc3RydWN0IHdpbWF4X2RldiAqd2ltYXhfZGV2ID0gJmkyNDAwbS0+d2ltYXhfZGV2OworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGkyNDAwbV9kZXYoaTI0MDBtKTsKKworCWRfZm5zdGFydCgzLCBkZXYsICIoaTI0MDBtICVwKVxuIiwgaTI0MDBtKTsKKwl3aW1heF9zdGF0ZV9jaGFuZ2Uod2ltYXhfZGV2LCBfX1dJTUFYX1NUX1FVSUVTQ0lORyk7CisJaTI0MDBtX2Rldl9zaHV0ZG93bihpMjQwMG0pOworCWkyNDAwbS0+cmVhZHkgPSAwOworCWRlc3Ryb3lfd29ya3F1ZXVlKGkyNDAwbS0+d29ya19xdWV1ZSk7CisJaTI0MDBtLT5idXNfZGV2X3N0b3AoaTI0MDBtKTsKKwlpMjQwMG1fdHhfcmVsZWFzZShpMjQwMG0pOworCXdpbWF4X3N0YXRlX2NoYW5nZSh3aW1heF9kZXYsIFdJTUFYX1NUX0RPV04pOworCWRfZm5lbmQoMywgZGV2LCAiKGkyNDAwbSAlcCkgPSAwXG4iLCBpMjQwMG0pOworfQorCisKKy8qCisgKiBXYXRjaCBvdXQgLS0gd2Ugb25seSBuZWVkIHRvIHN0b3AgaWYgdGhlcmUgaXMgYSBuZWVkIGZvciBpdC4gVGhlCisgKiBkZXZpY2UgY291bGQgaGF2ZSByZXNldCBpdHNlbGYgYW5kIGZhaWxlZCB0byBjb21lIHVwIGFnYWluIChzZWUKKyAqIF9pMjQwMG1fZGV2X3Jlc2V0X2hhbmRsZSgpKS4KKyAqLworc3RhdGljCit2b2lkIGkyNDAwbV9kZXZfc3RvcChzdHJ1Y3QgaTI0MDBtICppMjQwMG0pCit7CisJbXV0ZXhfbG9jaygmaTI0MDBtLT5pbml0X211dGV4KTsKKwlpZiAoaTI0MDBtLT51cGRvd24pIHsKKwkJX19pMjQwMG1fZGV2X3N0b3AoaTI0MDBtKTsKKwkJaTI0MDBtLT51cGRvd24gPSAwOworCX0KKwltdXRleF91bmxvY2soJmkyNDAwbS0+aW5pdF9tdXRleCk7Cit9CisKKworLyoKKyAqIFRoZSBkZXZpY2UgaGFzIHJlYm9vdGVkOyBmaXggdXAgdGhlIGRldmljZSBhbmQgdGhlIGRyaXZlcgorICoKKyAqIFRlYXIgZG93biB0aGUgZHJpdmVyIGNvbW11bmljYXRpb24gd2l0aCB0aGUgZGV2aWNlLCByZWxvYWQgdGhlCisgKiBmaXJtd2FyZSBhbmQgcmVpbml0aWFsaXplIHRoZSBjb21tdW5pY2F0aW9uIHdpdGggdGhlIGRldmljZS4KKyAqCisgKiBJZiBzb21lb25lIGNhbGxzIGEgcmVzZXQgd2hlbiB0aGUgZGV2aWNlJ3MgZmlybXdhcmUgaXMgZG93biwgaW4KKyAqIHRoZW9yeSB3ZSB3b24ndCBzZWUgaXQgYmVjYXVzZSB3ZSBhcmUgbm90IGxpc3RlbmluZy4gSG93ZXZlciwganVzdAorICogaW4gY2FzZSwgbGVhdmUgdGhlIGNvZGUgdG8gaGFuZGxlIGl0LgorICoKKyAqIElmIHRoZXJlIGlzIGEgcmVzZXQgY29udGV4dCwgdXNlIGl0OyB0aGlzIG1lYW5zIHNvbWVvbmUgaXMgd2FpdGluZworICogZm9yIHVzIHRvIHRlbGwgaGltIHdoZW4gdGhlIHJlc2V0IG9wZXJhdGlvbiBpcyBjb21wbGV0ZSBhbmQgdGhlCisgKiBkZXZpY2UgaXMgcmVhZHkgdG8gcm9jayBhZ2Fpbi4KKyAqCisgKiBOT1RFOiBpZiB3ZSBhcmUgaW4gdGhlIHByb2Nlc3Mgb2YgYnJpbmdpbmcgdXAgb3IgZG93biB0aGUKKyAqICAgICAgIGNvbW11bmljYXRpb24gd2l0aCB0aGUgZGV2aWNlIFtydW5uaW5nIGkyNDAwbV9kZXZfc3RhcnQoKSBvcgorICogICAgICAgX3N0b3AoKV0sIGRvbid0IGRvIGFueXRoaW5nLCBsZXQgaXQgZmFpbCBhbmQgaGFuZGxlIGl0LgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgcmFuIGFsd2F5cyBpbiBhIHRocmVhZCBjb250ZXh0CisgKi8KK3N0YXRpYwordm9pZCBfX2kyNDAwbV9kZXZfcmVzZXRfaGFuZGxlKHN0cnVjdCB3b3JrX3N0cnVjdCAqd3MpCit7CisJaW50IHJlc3VsdDsKKwlzdHJ1Y3QgaTI0MDBtX3dvcmsgKml3ID0gY29udGFpbmVyX29mKHdzLCBzdHJ1Y3QgaTI0MDBtX3dvcmssIHdzKTsKKwlzdHJ1Y3QgaTI0MDBtICppMjQwMG0gPSBpdy0+aTI0MDBtOworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGkyNDAwbV9kZXYoaTI0MDBtKTsKKwllbnVtIHdpbWF4X3N0IHdpbWF4X3N0YXRlOworCXN0cnVjdCBpMjQwMG1fcmVzZXRfY3R4ICpjdHggPSBpMjQwMG0tPnJlc2V0X2N0eDsKKworCWRfZm5zdGFydCgzLCBkZXYsICIod3MgJXAgaTI0MDBtICVwKVxuIiwgd3MsIGkyNDAwbSk7CisJcmVzdWx0ID0gMDsKKwlpZiAobXV0ZXhfdHJ5bG9jaygmaTI0MDBtLT5pbml0X211dGV4KSA9PSAwKSB7CisJCS8qIFdlIGFyZSBzdGlsbCBpbiBpMjQwMG1fZGV2X3N0YXJ0KCkgW2xldCBpdCBmYWlsXSBvcgorCQkgKiBpMjQwMG1fZGV2X3N0b3AoKSBbd2UgYXJlIHNodXR0aW5nIGRvd24gYW55d2F5LCBzbworCQkgKiBpZ25vcmUgaXRdIG9yIHdlIGFyZSByZXNldHRpbmcgc29tZXdoZXJlIGVsc2UuICovCisJCWRldl9lcnIoZGV2LCAiZGV2aWNlIHJlYm9vdGVkXG4iKTsKKwkJaTI0MDBtX21zZ190b19kZXZfY2FuY2VsX3dhaXQoaTI0MDBtLCAtRVJFU1RBUlRTWVMpOworCQljb21wbGV0ZSgmaTI0MDBtLT5tc2dfY29tcGxldGlvbik7CisJCWdvdG8gb3V0OworCX0KKwl3aW1heF9zdGF0ZSA9IHdpbWF4X3N0YXRlX2dldCgmaTI0MDBtLT53aW1heF9kZXYpOworCWlmICh3aW1heF9zdGF0ZSA8IFdJTUFYX1NUX1VOSU5JVElBTElaRUQpIHsKKwkJZGV2X2luZm8oZGV2LCAiZGV2aWNlIHJlYm9vdGVkOiBpdCBpcyBkb3duLCBpZ25vcmluZ1xuIik7CisJCWdvdG8gb3V0X3VubG9jazsJLyogaWZjb25maWcgdXAvZG93biB3YXNuJ3QgY2FsbGVkICovCisJfQorCWRldl9lcnIoZGV2LCAiZGV2aWNlIHJlYm9vdGVkOiByZWluaXRpYWxpemluZyBkcml2ZXJcbiIpOworCV9faTI0MDBtX2Rldl9zdG9wKGkyNDAwbSk7CisJaTI0MDBtLT51cGRvd24gPSAwOworCXJlc3VsdCA9IF9faTI0MDBtX2Rldl9zdGFydChpMjQwMG0sCisJCQkJICAgIEkyNDAwTV9CUklfU09GVCB8IEkyNDAwTV9CUklfTUFDX1JFSU5JVCk7CisJaWYgKHJlc3VsdCA8IDApIHsKKwkJZGV2X2VycihkZXYsICJkZXZpY2UgcmVib290OiBjYW5ub3Qgc3RhcnQgdGhlIGRldmljZTogJWRcbiIsCisJCQlyZXN1bHQpOworCQlyZXN1bHQgPSBpMjQwMG0tPmJ1c19yZXNldChpMjQwMG0sIEkyNDAwTV9SVF9CVVMpOworCQlpZiAocmVzdWx0ID49IDApCisJCQlyZXN1bHQgPSAtRU5PREVWOworCX0gZWxzZQorCQlpMjQwMG0tPnVwZG93biA9IDE7CitvdXRfdW5sb2NrOgorCWlmIChpMjQwMG0tPnJlc2V0X2N0eCkgeworCQljdHgtPnJlc3VsdCA9IHJlc3VsdDsKKwkJY29tcGxldGUoJmN0eC0+Y29tcGxldGlvbik7CisJfQorCW11dGV4X3VubG9jaygmaTI0MDBtLT5pbml0X211dGV4KTsKK291dDoKKwlpMjQwMG1fcHV0KGkyNDAwbSk7CisJa2ZyZWUoaXcpOworCWRfZm5lbmQoMywgZGV2LCAiKHdzICVwIGkyNDAwbSAlcCkgPSB2b2lkXG4iLCB3cywgaTI0MDBtKTsKKwlyZXR1cm47Cit9CisKKworLyoqCisgKiBpMjQwMG1fZGV2X3Jlc2V0X2hhbmRsZSAtIEhhbmRsZSBhIGRldmljZSdzIHJlc2V0IGluIGEgdGhyZWFkIGNvbnRleHQKKyAqCisgKiBTY2hlZHVsZSBhIGRldmljZSByZXNldCBoYW5kbGluZyBvdXQgb24gYSB0aHJlYWQgY29udGV4dCwgc28gaXQKKyAqIGlzIHNhZmUgdG8gY2FsbCBmcm9tIGF0b21pYyBjb250ZXh0LiBXZSBjYW4ndCB1c2UgdGhlIGkyNDAwbSdzCisgKiBxdWV1ZSBhcyB3ZSBhcmUgZ29pbmcgdG8gZGVzdHJveSBpdCBhbmQgcmVpbml0aWFsaXplIGl0IGFzIHBhcnQgb2YKKyAqIHRoZSBkcml2ZXIgYnJpbmd1cC9icmluZ3VwIHByb2Nlc3MuCisgKgorICogU2VlIF9faTI0MDBtX2Rldl9yZXNldF9oYW5kbGUoKSBmb3IgZGV0YWlsczsgdGhhdCB0YWtlcyBjYXJlIG9mCisgKiByZWluaXRpYWxpemluZyB0aGUgZHJpdmVyIHRvIGhhbmRsZSB0aGUgcmVzZXQsIGNhbGxpbmcgaW50byB0aGUKKyAqIGJ1cy1zcGVjaWZpYyBmdW5jdGlvbnMgb3BzIGFzIG5lZWRlZC4KKyAqLworaW50IGkyNDAwbV9kZXZfcmVzZXRfaGFuZGxlKHN0cnVjdCBpMjQwMG0gKmkyNDAwbSkKK3sKKwlyZXR1cm4gaTI0MDBtX3NjaGVkdWxlX3dvcmsoaTI0MDBtLCBfX2kyNDAwbV9kZXZfcmVzZXRfaGFuZGxlLAorCQkJCSAgICBHRlBfQVRPTUlDKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGkyNDAwbV9kZXZfcmVzZXRfaGFuZGxlKTsKKworCisvKioKKyAqIGkyNDAwbV9zZXR1cCAtIGJ1cy1nZW5lcmljIHNldHVwIGZ1bmN0aW9uIGZvciB0aGUgaTI0MDBtIGRldmljZQorICoKKyAqIEBpMjQwMG06IGRldmljZSBkZXNjcmlwdG9yIChidXMtc3BlY2lmaWMgcGFydHMgaGF2ZSBiZWVuIGluaXRpYWxpemVkKQorICoKKyAqIFJldHVybnM6IDAgaWYgb2ssIDwgMCBlcnJubyBjb2RlIG9uIGVycm9yLgorICoKKyAqIEluaXRpYWxpemVzIHRoZSBidXMtZ2VuZXJpYyBwYXJ0cyBvZiB0aGUgaTI0MDBtIGRyaXZlcjsgdGhlCisgKiBidXMtc3BlY2lmaWMgcGFydHMgaGF2ZSBiZWVuIGluaXRpYWxpemVkLCBmdW5jdGlvbiBwb2ludGVycyBmaWxsZWQKKyAqIG91dCBieSB0aGUgYnVzLXNwZWNpZmljIHByb2JlIGZ1bmN0aW9uLgorICoKKyAqIEFzIHdlbGwsIHRoaXMgcmVnaXN0ZXJzIHRoZSBXaU1BWCBhbmQgbmV0IGRldmljZSBub2Rlcy4gT25jZSB0aGlzCisgKiBmdW5jdGlvbiByZXR1cm5zLCB0aGUgZGV2aWNlIGlzIG9wZXJhdGl2ZSBhbmQgaGFzIHRvIGJlIHJlYWR5IHRvCisgKiByZWNlaXZlIGFuZCBzZW5kIG5ldHdvcmsgdHJhZmZpYyBhbmQgV2lNQVggY29udHJvbCBvcGVyYXRpb25zLgorICovCitpbnQgaTI0MDBtX3NldHVwKHN0cnVjdCBpMjQwMG0gKmkyNDAwbSwgZW51bSBpMjQwMG1fYnJpIGJtX2ZsYWdzKQoreworCWludCByZXN1bHQgPSAtRU5PREVWOworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGkyNDAwbV9kZXYoaTI0MDBtKTsKKwlzdHJ1Y3Qgd2ltYXhfZGV2ICp3aW1heF9kZXYgPSAmaTI0MDBtLT53aW1heF9kZXY7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYgPSBpMjQwMG0tPndpbWF4X2Rldi5uZXRfZGV2OworCisJZF9mbnN0YXJ0KDMsIGRldiwgIihpMjQwMG0gJXApXG4iLCBpMjQwMG0pOworCisJc25wcmludGYod2ltYXhfZGV2LT5uYW1lLCBzaXplb2Yod2ltYXhfZGV2LT5uYW1lKSwKKwkJICJpMjQwMG0tJXM6JXMiLCBkZXYtPmJ1cy0+bmFtZSwgZGV2LT5idXNfaWQpOworCisJaTI0MDBtLT5ibV9jbWRfYnVmID0ga3phbGxvYyhJMjQwME1fQk1fQ01EX0JVRl9TSVpFLCBHRlBfS0VSTkVMKTsKKwlpZiAoaTI0MDBtLT5ibV9jbWRfYnVmID09IE5VTEwpIHsKKwkJZGV2X2VycihkZXYsICJjYW5ub3QgYWxsb2NhdGUgVVNCIGNvbW1hbmQgYnVmZmVyXG4iKTsKKwkJZ290byBlcnJvcl9ibV9jbWRfa3phbGxvYzsKKwl9CisJaTI0MDBtLT5ibV9hY2tfYnVmID0ga3phbGxvYyhJMjQwME1fQk1fQUNLX0JVRl9TSVpFLCBHRlBfS0VSTkVMKTsKKwlpZiAoaTI0MDBtLT5ibV9hY2tfYnVmID09IE5VTEwpIHsKKwkJZGV2X2VycihkZXYsICJjYW5ub3QgYWxsb2NhdGUgVVNCIGFjayBidWZmZXJcbiIpOworCQlnb3RvIGVycm9yX2JtX2Fja19idWZfa3phbGxvYzsKKwl9CisJcmVzdWx0ID0gaTI0MDBtX2Jvb3Ryb21faW5pdChpMjQwMG0sIGJtX2ZsYWdzKTsKKwlpZiAocmVzdWx0IDwgMCkgeworCQlkZXZfZXJyKGRldiwgInJlYWQgbWFjIGFkZHI6IGJvb3Ryb20gaW5pdCAiCisJCQkiZmFpbGVkOiAlZFxuIiwgcmVzdWx0KTsKKwkJZ290byBlcnJvcl9ib290cm9tX2luaXQ7CisJfQorCXJlc3VsdCA9IGkyNDAwbV9yZWFkX21hY19hZGRyKGkyNDAwbSk7CisJaWYgKHJlc3VsdCA8IDApCisJCWdvdG8gZXJyb3JfcmVhZF9tYWNfYWRkcjsKKworCXJlc3VsdCA9IHJlZ2lzdGVyX25ldGRldihuZXRfZGV2KTsJLyogT2tleSBkb2tleSwgYnJpbmcgaXQgdXAgKi8KKwlpZiAocmVzdWx0IDwgMCkgeworCQlkZXZfZXJyKGRldiwgImNhbm5vdCByZWdpc3RlciBpMjQwMG0gbmV0d29yayBkZXZpY2U6ICVkXG4iLAorCQkJcmVzdWx0KTsKKwkJZ290byBlcnJvcl9yZWdpc3Rlcl9uZXRkZXY7CisJfQorCW5ldGlmX2NhcnJpZXJfb2ZmKG5ldF9kZXYpOworCisJcmVzdWx0ID0gaTI0MDBtX2Rldl9zdGFydChpMjQwMG0sIGJtX2ZsYWdzKTsKKwlpZiAocmVzdWx0IDwgMCkKKwkJZ290byBlcnJvcl9kZXZfc3RhcnQ7CisKKwlpMjQwMG0tPndpbWF4X2Rldi5vcF9tc2dfZnJvbV91c2VyID0gaTI0MDBtX29wX21zZ19mcm9tX3VzZXI7CisJaTI0MDBtLT53aW1heF9kZXYub3BfcmZraWxsX3N3X3RvZ2dsZSA9IGkyNDAwbV9vcF9yZmtpbGxfc3dfdG9nZ2xlOworCWkyNDAwbS0+d2ltYXhfZGV2Lm9wX3Jlc2V0ID0gaTI0MDBtX29wX3Jlc2V0OworCXJlc3VsdCA9IHdpbWF4X2Rldl9hZGQoJmkyNDAwbS0+d2ltYXhfZGV2LCBuZXRfZGV2KTsKKwlpZiAocmVzdWx0IDwgMCkKKwkJZ290byBlcnJvcl93aW1heF9kZXZfYWRkOworCS8qIFVzZXIgc3BhY2UgbmVlZHMgdG8gZG8gc29tZSBpbml0IHN0dWZmICovCisJd2ltYXhfc3RhdGVfY2hhbmdlKHdpbWF4X2RldiwgV0lNQVhfU1RfVU5JTklUSUFMSVpFRCk7CisKKwkvKiBOb3cgc2V0dXAgYWxsIHRoYXQgcmVxdWlyZXMgYSByZWdpc3RlcmVkIG5ldCBhbmQgd2ltYXggZGV2aWNlLiAqLworCXJlc3VsdCA9IGkyNDAwbV9kZWJ1Z2ZzX2FkZChpMjQwMG0pOworCWlmIChyZXN1bHQgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAiY2Fubm90IHNldHVwIGkyNDAwbSdzIGRlYnVnZnM6ICVkXG4iLCByZXN1bHQpOworCQlnb3RvIGVycm9yX2RlYnVnZnNfc2V0dXA7CisJfQorCWRfZm5lbmQoMywgZGV2LCAiKGkyNDAwbSAlcCkgPSAlZFxuIiwgaTI0MDBtLCByZXN1bHQpOworCXJldHVybiByZXN1bHQ7CisKK2Vycm9yX2RlYnVnZnNfc2V0dXA6CisJd2ltYXhfZGV2X3JtKCZpMjQwMG0tPndpbWF4X2Rldik7CitlcnJvcl93aW1heF9kZXZfYWRkOgorCWkyNDAwbV9kZXZfc3RvcChpMjQwMG0pOworZXJyb3JfZGV2X3N0YXJ0OgorCXVucmVnaXN0ZXJfbmV0ZGV2KG5ldF9kZXYpOworZXJyb3JfcmVnaXN0ZXJfbmV0ZGV2OgorZXJyb3JfcmVhZF9tYWNfYWRkcjoKK2Vycm9yX2Jvb3Ryb21faW5pdDoKKwlrZnJlZShpMjQwMG0tPmJtX2Fja19idWYpOworZXJyb3JfYm1fYWNrX2J1Zl9remFsbG9jOgorCWtmcmVlKGkyNDAwbS0+Ym1fY21kX2J1Zik7CitlcnJvcl9ibV9jbWRfa3phbGxvYzoKKwlkX2ZuZW5kKDMsIGRldiwgIihpMjQwMG0gJXApID0gJWRcbiIsIGkyNDAwbSwgcmVzdWx0KTsKKwlyZXR1cm4gcmVzdWx0OworfQorRVhQT1JUX1NZTUJPTF9HUEwoaTI0MDBtX3NldHVwKTsKKworCisvKioKKyAqIGkyNDAwbV9yZWxlYXNlIC0gcmVsZWFzZSB0aGUgYnVzLWdlbmVyaWMgZHJpdmVyIHJlc291cmNlcworICoKKyAqIFNlbmRzIGEgZGlzY29ubmVjdCBtZXNzYWdlIGFuZCB1bmRvZXMgYW55IHNldHVwIGRvbmUgYnkgaTI0MDBtX3NldHVwKCkKKyAqLwordm9pZCBpMjQwMG1fcmVsZWFzZShzdHJ1Y3QgaTI0MDBtICppMjQwMG0pCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gaTI0MDBtX2RldihpMjQwMG0pOworCisJZF9mbnN0YXJ0KDMsIGRldiwgIihpMjQwMG0gJXApXG4iLCBpMjQwMG0pOworCW5ldGlmX3N0b3BfcXVldWUoaTI0MDBtLT53aW1heF9kZXYubmV0X2Rldik7CisKKwlpMjQwMG1fZGVidWdmc19ybShpMjQwMG0pOworCXdpbWF4X2Rldl9ybSgmaTI0MDBtLT53aW1heF9kZXYpOworCWkyNDAwbV9kZXZfc3RvcChpMjQwMG0pOworCXVucmVnaXN0ZXJfbmV0ZGV2KGkyNDAwbS0+d2ltYXhfZGV2Lm5ldF9kZXYpOworCWtmcmVlKGkyNDAwbS0+Ym1fYWNrX2J1Zik7CisJa2ZyZWUoaTI0MDBtLT5ibV9jbWRfYnVmKTsKKwlkX2ZuZW5kKDMsIGRldiwgIihpMjQwMG0gJXApID0gdm9pZFxuIiwgaTI0MDBtKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGkyNDAwbV9yZWxlYXNlKTsKKworCitzdGF0aWMKK2ludCBfX2luaXQgaTI0MDBtX2RyaXZlcl9pbml0KHZvaWQpCit7CisJcmV0dXJuIDA7Cit9Cittb2R1bGVfaW5pdChpMjQwMG1fZHJpdmVyX2luaXQpOworCitzdGF0aWMKK3ZvaWQgX19leGl0IGkyNDAwbV9kcml2ZXJfZXhpdCh2b2lkKQoreworCS8qIGZvciBzY2hlZHMgaTI0MDBtX2Rldl9yZXNldF9oYW5kbGUoKSAqLworCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7CisJcmV0dXJuOworfQorbW9kdWxlX2V4aXQoaTI0MDBtX2RyaXZlcl9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiSW50ZWwgQ29ycG9yYXRpb24gPGxpbnV4LXdpbWF4QGludGVsLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiSW50ZWwgMjQwME0gV2lNQVggbmV0d29ya2luZyBidXMtZ2VuZXJpYyBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS9mdy5jIGIvZHJpdmVycy9uZXQvd2ltYXgvaTI0MDBtL2Z3LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ4MjcxZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS9mdy5jCkBAIC0wLDAgKzEsMTA5NSBAQAorLyoKKyAqIEludGVsIFdpcmVsZXNzIFdpTUFYIENvbm5lY3Rpb24gMjQwMG0KKyAqIEZpcm13YXJlIHVwbG9hZGVyCisgKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgICBkaXN0cmlidXRpb24uCisgKiAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqCisgKiBJbnRlbCBDb3Jwb3JhdGlvbiA8bGludXgtd2ltYXhAaW50ZWwuY29tPgorICogWWFuaXIgTHViZXRraW4gPHlhbmlyeC5sdWJldGtpbkBpbnRlbC5jb20+CisgKiBJbmFreSBQZXJlei1Hb256YWxleiA8aW5ha3kucGVyZXotZ29uemFsZXpAaW50ZWwuY29tPgorICogIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICoKKyAqCisgKiBUSEUgUFJPQ0VEVVJFCisgKgorICogKHRoaXMgaXMgZGVjcmliZWQgZm9yIFVTQiwgYnV0IGZvciBTRElPIGlzIHNpbWlsYXIpCisgKgorICogVGhlIDI0MDBtIHdvcmtzIGluIHR3byBtb2RlczogYm9vdC1tb2RlIG9yIG5vcm1hbCBtb2RlLiBJbiBib290CisgKiBtb2RlIHdlIGNhbiBleGVjdXRlIG9ubHkgYSBoYW5kZnVsIG9mIGNvbW1hbmRzIHRhcmdldGVkIGF0CisgKiB1cGxvYWRpbmcgdGhlIGZpcm13YXJlIGFuZCBsYXVuY2hpbmcgaXQuCisgKgorICogVGhlIDI0MDBtIGVudGVycyBib290IG1vZGUgd2hlbiBpdCBpcyBmaXJzdCBjb25uZWN0ZWQgdG8gdGhlCisgKiBzeXN0ZW0sIHdoZW4gaXQgY3Jhc2hlcyBhbmQgd2hlbiB5b3UgYXNrIGl0IHRvIHJlYm9vdC4gVGhlcmUgYXJlCisgKiB0d28gc3VibW9kZXMgb2YgdGhlIGJvb3QgbW9kZTogc2lnbmVkIGFuZCBub24tc2lnbmVkLiBTaWduZWQgdGFrZXMKKyAqIGZpcm13YXJlcyBzaWduZWQgd2l0aCBhIGNlcnRhaW4gcHJpdmF0ZSBrZXksIG5vbi1zaWduZWQgdGFrZXMgYW55CisgKiBmaXJtd2FyZS4gTm9ybWFsIGhhcmR3YXJlIHRha2VzIG9ubHkgc2lnbmVkIGZpcm13YXJlLgorICoKKyAqIFVwb24gZW50cmFuY2UgdG8gYm9vdCBtb2RlLCB0aGUgZGV2aWNlIHNlbmRzIGEgZmV3IHplcm8gbGVuZ3RoCisgKiBwYWNrZXRzIChaTFBzKSBvbiB0aGUgbm90aWZpY2F0aW9uIGVuZHBvaW50LCB0aGVuIGEgcmVib290IGJhcmtlcgorICogKDQgbGUzMiB3b3JkcyB3aXRoIHZhbHVlIEkyNDAwTV97UyxOfUJPT1RfQkFSS0VSKS4gV2UgYWNrIGl0IGJ5CisgKiBzZW5kaW5nIHRoZSBzYW1lIGJhcmtlciBvbiB0aGUgYnVsayBvdXQgZW5kcG9pbnQuIFRoZSBkZXZpY2UgYWNrcworICogd2l0aCBhIHJlYm9vdCBhY2sgYmFya2VyICg0IGxlMzIgd29yZHMgd2l0aCB2YWx1ZSAweGZlZWRiYWJlKSBhbmQKKyAqIHRoZW4gdGhlIGRldmljZSBpcyBmdWxseSByZWJvb3RlZC4gQXQgdGhpcyBwb2ludCB3ZSBjYW4gdXBsb2FkIHRoZQorICogZmlybXdhcmUuCisgKgorICogVGhpcyBwcm9jZXNzIGlzIGFjY29tcGxpc2hlZCBieSB0aGUgaTI0MDBtX2Jvb3Ryb21faW5pdCgpCisgKiBmdW5jdGlvbi4gQWxsIHRoZSBkZXZpY2UgaW50ZXJhY3Rpb24gaGFwcGVucyB0aHJvdWdoIHRoZQorICogaTI0MDBtX2JtX2NtZCgpIFtib290IG1vZGUgY29tbWFuZF0uIFNwZWNpYWwgcmV0dXJuIHZhbHVlcyB3aWxsCisgKiBpbmRpY2F0ZSBpZiB0aGUgZGV2aWNlIHJlc2V0cy4KKyAqCisgKiBBZnRlciB0aGlzLCB3ZSByZWFkIHRoZSBNQUMgYWRkcmVzcyBhbmQgdGhlbiAoaWYgbmVlZGVkKQorICogcmVpbml0aWFsaXplIHRoZSBkZXZpY2UuIFdlIG5lZWQgdG8gcmVhZCBpdCBhaGVhZCBvZiB0aW1lIGJlY2F1c2UKKyAqIGluIHRoZSBmdXR1cmUsIHdlIG1pZ2h0IG5vdCB1cGxvYWQgdGhlIGZpcm13YXJlIHVudGlsIHVzZXJzcGFjZQorICogJ2lmY29uZmlnIHVwJ3MgdGhlIGRldmljZS4KKyAqCisgKiBXZSBjYW4gdGhlbiB1cGxvYWQgdGhlIGZpcm13YXJlIGZpbGUuIFRoZSBmaWxlIGlzIGNvbXBvc2VkIG9mIGEgQkNGCisgKiBoZWFkZXIgKGJhc2ljIGRhdGEsIGtleXMgYW5kIHNpZ25hdHVyZXMpIGFuZCBhIGxpc3Qgb2Ygd3JpdGUKKyAqIGNvbW1hbmRzIGFuZCBwYXlsb2Fkcy4gV2UgZmlyc3QgdXBsb2FkIHRoZSBoZWFkZXIKKyAqIFtpMjQwMG1fZG5sb2FkX2luaXQoKV0gYW5kIHRoZW4gcGFzcyB0aGUgY29tbWFuZHMgYW5kIHBheWxvYWRzCisgKiB2ZXJiYXRpbSB0byB0aGUgaTI0MDBtX2JtX2NtZCgpIGZ1bmN0aW9uCisgKiBbaTI0MDBtX2RubG9hZF9iY2YoKV0uIFRoZW4gd2UgdGVsbCB0aGUgZGV2aWNlIHRvIGp1bXAgdG8gdGhlIG5ldworICogZmlybXdhcmUgW2kyNDAwbV9kbmxvYWRfZmluYWxpemUoKV0uCisgKgorICogT25jZSBmaXJtd2FyZSBpcyB1cGxvYWRlZCwgd2UgYXJlIGdvb2QgdG8gZ28gOikKKyAqCisgKiBXaGVuIHdlIGRvbid0IGtub3cgaW4gd2hpY2ggbW9kZSB3ZSBhcmUsIHdlIGZpcnN0IHRyeSBieSBzZW5kaW5nIGEKKyAqIHdhcm0gcmVzZXQgcmVxdWVzdCB0aGF0IHdpbGwgdGFrZSB1cyB0byBib290LW1vZGUuIElmIHdlIHRpbWUgb3V0CisgKiB3YWl0aW5nIGZvciBhIHJlYm9vdCBiYXJrZXIsIHRoYXQgbWVhbnMgbWF5YmUgd2UgYXJlIGFscmVhZHkgaW4KKyAqIGJvb3QgbW9kZSwgc28gd2Ugc2VuZCBhIHJlYm9vdCBiYXJrZXIuCisgKgorICogQ09NTUFORCBFWEVDVVRJT04KKyAqCisgKiBUaGlzIGNvZGUgKGFuZCBwcm9jZXNzKSBpcyBzaW5nbGUgdGhyZWFkZWQ7IGZvciBleGVjdXRpbmcgY29tbWFuZHMsCisgKiB3ZSBwb3N0IGEgVVJCIHRvIHRoZSBub3RpZmljYXRpb24gZW5kcG9pbnQsIHBvc3QgdGhlIGNvbW1hbmQsIHdhaXQKKyAqIGZvciBkYXRhIG9uIHRoZSBub3RpZmljYXRpb24gYnVmZmVyLiBXZSBkb24ndCBuZWVkIHRvIHdvcnJ5IGFib3V0CisgKiBvdGhlcnMgYXMgd2Uga25vdyB3ZSBhcmUgdGhlIG9ubHkgb25lcyBpbiB0aGVyZS4KKyAqCisgKiBCQUNLRU5EIElNUExFTUVOVEFUSU9OCisgKgorICogVGhpcyBjb2RlIGlzIGJ1cy1nZW5lcmljOyB0aGUgYnVzLXNwZWNpZmljIGRyaXZlciBwcm92aWRlcyBiYWNrIGVuZAorICogaW1wbGVtZW50YXRpb25zIHRvIHNlbmQgYSBib290IG1vZGUgY29tbWFuZCB0byB0aGUgZGV2aWNlIGFuZCB0bworICogcmVhZCBhbiBhY2tub2x3ZWRnZW1lbnQgZnJvbSBpdCAob3IgYW4gYXN5bmNocm9ub3VzIG5vdGlmaWNhdGlvbikKKyAqIGZyb20gaXQuCisgKgorICogUk9BRE1BUAorICoKKyAqIGkyNDAwbV9kZXZfYm9vdHN0cmFwICAgICAgICAgICAgICAgQ2FsbGVkIGJ5IF9faTI0MDBtX2Rldl9zdGFydCgpCisgKiAgIHJlcXVlc3RfZmlybXdhcmUKKyAqICAgaTI0MDBtX2Z3X2NoZWNrCisgKiAgIGkyNDAwbV9md19kbmxvYWQKKyAqICAgcmVsZWFzZV9maXJtd2FyZQorICoKKyAqIGkyNDAwbV9md19kbmxvYWQKKyAqICAgaTI0MDBtX2Jvb3Ryb21faW5pdAorICogICAgIGkyNDAwbV9ibV9jbWQKKyAqICAgICBpMjQwMG0tPmJ1c19yZXNldAorICogICBpMjQwMG1fZG5sb2FkX2luaXQKKyAqICAgICBpMjQwMG1fZG5sb2FkX2luaXRfc2lnbmVkCisgKiAgICAgaTI0MDBtX2RubG9hZF9pbml0X25vbnNpZ25lZAorICogICAgICAgaTI0MDBtX2Rvd25sb2FkX2NodW5rCisgKiAgICAgICAgIGkyNDAwbV9ibV9jbWQKKyAqICAgaTI0MDBtX2RubG9hZF9iY2YKKyAqICAgICBpMjQwMG1fYm1fY21kCisgKiAgIGkyNDAwbV9kbmxvYWRfZmluYWxpemUKKyAqICAgICBpMjQwMG1fYm1fY21kCisgKgorICogaTI0MDBtX2JtX2NtZAorICogICBpMjQwMG0tPmJ1c19ibV9jbWRfc2VuZCgpCisgKiAgIGkyNDAwbS0+YnVzX2JtX3dhaXRfZm9yX2FjaworICogICBfX2kyNDAwbV9ibV9hY2tfdmVyaWZ5CisgKgorICogaTI0MDBtX2JtX2NtZF9wcmVwYXJlICAgICAgICAgICAgICBVc2VkIGJ5IGJ1cy1kcml2ZXJzIHRvIHByZXAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZHMgYmVmb3JlIHNlbmRpbmcKKyAqLworI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC91c2IuaD4KKyNpbmNsdWRlICJpMjQwMG0uaCIKKworCisjZGVmaW5lIERfU1VCTU9EVUxFIGZ3CisjaW5jbHVkZSAiZGVidWctbGV2ZWxzLmgiCisKKworc3RhdGljIGNvbnN0IF9fbGUzMiBpMjQwMG1fQUNLX0JBUktFUls0XSA9IHsKKwlfX2NvbnN0YW50X2NwdV90b19sZTMyKEkyNDAwTV9BQ0tfQkFSS0VSKSwKKwlfX2NvbnN0YW50X2NwdV90b19sZTMyKEkyNDAwTV9BQ0tfQkFSS0VSKSwKKwlfX2NvbnN0YW50X2NwdV90b19sZTMyKEkyNDAwTV9BQ0tfQkFSS0VSKSwKKwlfX2NvbnN0YW50X2NwdV90b19sZTMyKEkyNDAwTV9BQ0tfQkFSS0VSKQorfTsKKworCisvKioKKyAqIFByZXBhcmUgYSBib290LW1vZGUgY29tbWFuZCBmb3IgZGVsaXZlcnkKKyAqCisgKiBAY21kOiBwb2ludGVyIHRvIGJvb3Ryb20gaGVhZGVyIHRvIHByZXBhcmUKKyAqCisgKiBDb21wdXRlcyBjaGVja3N1bSBpZiBzbyBuZWVkZWQuIEFmdGVyIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiwgRE8gTk9UCisgKiBtb2RpZnkgdGhlIGNvbW1hbmQgb3IgaGVhZGVyIGFzIHRoZSBjaGVja3N1bSB3b24ndCB3b3JrIGFueW1vcmUuCisgKgorICogV2UgZG8gaXQgZnJvbSBoZXJlIGJlY2F1c2Ugc29tZSB0aW1lcyB3ZSBjYW5ub3QgZG8gaXQgaW4gdGhlCisgKiBvcmlnaW5hbCBjb250ZXh0IHRoZSBjb21tYW5kIHdhcyBzZW50IChpdCBpcyBhIGNvbnN0KSwgc28gd2hlbiB3ZQorICogY29weSBpdCB0byBvdXIgc3RhZ2luZyBidWZmZXIsIHdlIGFkZCB0aGUgY2hlY2tzdW0gdGhlcmUuCisgKi8KK3ZvaWQgaTI0MDBtX2JtX2NtZF9wcmVwYXJlKHN0cnVjdCBpMjQwMG1fYm9vdHJvbV9oZWFkZXIgKmNtZCkKK3sKKwlpZiAoaTI0MDBtX2JyaF9nZXRfdXNlX2NoZWNrc3VtKGNtZCkpIHsKKwkJaW50IGk7CisJCXUzMiBjaGVja3N1bSA9IDA7CisJCWNvbnN0IHUzMiAqY2hlY2tzdW1fcHRyID0gKHZvaWQgKikgY21kLT5wYXlsb2FkOworCQlmb3IgKGkgPSAwOyBpIDwgY21kLT5kYXRhX3NpemUgLyA0OyBpKyspCisJCQljaGVja3N1bSArPSBjcHVfdG9fbGUzMigqY2hlY2tzdW1fcHRyKyspOworCQljaGVja3N1bSArPSBjbWQtPmNvbW1hbmQgKyBjbWQtPnRhcmdldF9hZGRyICsgY21kLT5kYXRhX3NpemU7CisJCWNtZC0+YmxvY2tfY2hlY2tzdW0gPSBjcHVfdG9fbGUzMihjaGVja3N1bSk7CisJfQorfQorRVhQT1JUX1NZTUJPTF9HUEwoaTI0MDBtX2JtX2NtZF9wcmVwYXJlKTsKKworCisvKgorICogVmVyaWZ5IHRoZSBhY2sgZGF0YSByZWNlaXZlZAorICoKKyAqIEdpdmVuIGEgcmVwbHkgdG8gYSBib290IG1vZGUgY29tbWFuZCwgY2hldyBpdCBhbmQgdmVyaWZ5IGV2ZXJ5dGhpbmcKKyAqIGlzIG9rLgorICoKKyAqIEBvcGNvZGU6IG9wY29kZSB3aGljaCBnZW5lcmF0ZWQgdGhpcyBhY2suIEZvciBlcnJvciBtZXNzYWdlcy4KKyAqIEBhY2s6IHBvaW50ZXIgdG8gYWNrIGRhdGEgd2UgcmVjZWl2ZWQKKyAqIEBhY2tfc2l6ZTogc2l6ZSBvZiB0aGF0IGRhdGEgYnVmZmVyCisgKiBAZmxhZ3M6IEkyNDAwTV9CTV9DTURfKiBmbGFncyB3ZSBjYWxsZWQgdGhlIGNvbW1hbmQgd2l0aC4KKyAqCisgKiBXYXkgdG9vIGxvbmcgZnVuY3Rpb24gLS0gbWF5YmUgaXQgc2hvdWxkIGJlIGZ1cnRoZXIgc3BsaXQKKyAqLworc3RhdGljCitzc2l6ZV90IF9faTI0MDBtX2JtX2Fja192ZXJpZnkoc3RydWN0IGkyNDAwbSAqaTI0MDBtLCBpbnQgb3Bjb2RlLAorCQkJICAgICAgIHN0cnVjdCBpMjQwMG1fYm9vdHJvbV9oZWFkZXIgKmFjaywKKwkJCSAgICAgICBzaXplX3QgYWNrX3NpemUsIGludCBmbGFncykKK3sKKwlzc2l6ZV90IHJlc3VsdCA9IC1FTk9NRU07CisJc3RydWN0IGRldmljZSAqZGV2ID0gaTI0MDBtX2RldihpMjQwMG0pOworCisJZF9mbnN0YXJ0KDgsIGRldiwgIihpMjQwMG0gJXAgb3Bjb2RlICVkIGFjayAlcCBzaXplICV6dSlcbiIsCisJCSAgaTI0MDBtLCBvcGNvZGUsIGFjaywgYWNrX3NpemUpOworCWlmIChhY2tfc2l6ZSA8IHNpemVvZigqYWNrKSkgeworCQlyZXN1bHQgPSAtRUlPOworCQlkZXZfZXJyKGRldiwgImJvb3QtbW9kZSBjbWQgJWQ6IEhXIEJVRz8gbm90aWZpY2F0aW9uIGRpZG4ndCAiCisJCQkicmV0dXJuIGVub3VnaCBkYXRhICglenUgYnl0ZXMgdnMgJXp1IGV4cGVjdGVkKVxuIiwKKwkJCW9wY29kZSwgYWNrX3NpemUsIHNpemVvZigqYWNrKSk7CisJCWdvdG8gZXJyb3JfYWNrX3Nob3J0OworCX0KKwlpZiAoYWNrX3NpemUgPT0gc2l6ZW9mKGkyNDAwbV9OQk9PVF9CQVJLRVIpCisJCSAmJiBtZW1jbXAoYWNrLCBpMjQwMG1fTkJPT1RfQkFSS0VSLCBzaXplb2YoKmFjaykpID09IDApIHsKKwkJcmVzdWx0ID0gLUVSRVNUQVJUU1lTOworCQlpMjQwMG0tPnNib290ID0gMDsKKwkJZF9wcmludGYoNiwgZGV2LCAiYm9vdC1tb2RlIGNtZCAlZDogIgorCQkJICJIVyBub24tc2lnbmVkIGJvb3QgYmFya2VyXG4iLCBvcGNvZGUpOworCQlnb3RvIGVycm9yX3JlYm9vdDsKKwl9CisJaWYgKGFja19zaXplID09IHNpemVvZihpMjQwMG1fU0JPT1RfQkFSS0VSKQorCQkgJiYgbWVtY21wKGFjaywgaTI0MDBtX1NCT09UX0JBUktFUiwgc2l6ZW9mKCphY2spKSA9PSAwKSB7CisJCXJlc3VsdCA9IC1FUkVTVEFSVFNZUzsKKwkJaTI0MDBtLT5zYm9vdCA9IDE7CisJCWRfcHJpbnRmKDYsIGRldiwgImJvb3QtbW9kZSBjbWQgJWQ6IEhXIHNpZ25lZCByZWJvb3QgYmFya2VyXG4iLAorCQkJIG9wY29kZSk7CisJCWdvdG8gZXJyb3JfcmVib290OworCX0KKwlpZiAoYWNrX3NpemUgPT0gc2l6ZW9mKGkyNDAwbV9BQ0tfQkFSS0VSKQorCQkgJiYgbWVtY21wKGFjaywgaTI0MDBtX0FDS19CQVJLRVIsIHNpemVvZigqYWNrKSkgPT0gMCkgeworCQlyZXN1bHQgPSAtRUlTQ09OTjsKKwkJZF9wcmludGYoMywgZGV2LCAiYm9vdC1tb2RlIGNtZCAlZDogSFcgcmVib290IGFjayBiYXJrZXJcbiIsCisJCQkgb3Bjb2RlKTsKKwkJZ290byBlcnJvcl9yZWJvb3RfYWNrOworCX0KKwlyZXN1bHQgPSAwOworCWlmIChmbGFncyAmIEkyNDAwTV9CTV9DTURfUkFXKQorCQlnb3RvIG91dF9yYXc7CisJYWNrLT5kYXRhX3NpemUgPSBsZTMyX3RvX2NwdShhY2stPmRhdGFfc2l6ZSk7CisJYWNrLT50YXJnZXRfYWRkciA9IGxlMzJfdG9fY3B1KGFjay0+dGFyZ2V0X2FkZHIpOworCWFjay0+YmxvY2tfY2hlY2tzdW0gPSBsZTMyX3RvX2NwdShhY2stPmJsb2NrX2NoZWNrc3VtKTsKKwlkX3ByaW50Zig1LCBkZXYsICJib290LW1vZGUgY21kICVkOiBub3RpZmljYXRpb24gZm9yIG9wY29kZSAldSAiCisJCSAicmVzcG9uc2UgJXUgY3N1bSAldSByciAldSBkYSAldVxuIiwKKwkJIG9wY29kZSwgaTI0MDBtX2JyaF9nZXRfb3Bjb2RlKGFjayksCisJCSBpMjQwMG1fYnJoX2dldF9yZXNwb25zZShhY2spLAorCQkgaTI0MDBtX2JyaF9nZXRfdXNlX2NoZWNrc3VtKGFjayksCisJCSBpMjQwMG1fYnJoX2dldF9yZXNwb25zZV9yZXF1aXJlZChhY2spLAorCQkgaTI0MDBtX2JyaF9nZXRfZGlyZWN0X2FjY2VzcyhhY2spKTsKKwlyZXN1bHQgPSAtRUlPOworCWlmIChpMjQwMG1fYnJoX2dldF9zaWduYXR1cmUoYWNrKSAhPSAweGNiYmMpIHsKKwkJZGV2X2VycihkZXYsICJib290LW1vZGUgY21kICVkOiBIVyBCVUc/IHdyb25nIHNpZ25hdHVyZSAiCisJCQkiMHglMDR4XG4iLCBvcGNvZGUsIGkyNDAwbV9icmhfZ2V0X3NpZ25hdHVyZShhY2spKTsKKwkJZ290byBlcnJvcl9hY2tfc2lnbmF0dXJlOworCX0KKwlpZiAob3Bjb2RlICE9IC0xICYmIG9wY29kZSAhPSBpMjQwMG1fYnJoX2dldF9vcGNvZGUoYWNrKSkgeworCQlkZXZfZXJyKGRldiwgImJvb3QtbW9kZSBjbWQgJWQ6IEhXIEJVRz8gIgorCQkJInJlY2VpdmVkIHJlc3BvbnNlIGZvciBvcGNvZGUgJXUsIGV4cGVjdGVkICV1XG4iLAorCQkJb3Bjb2RlLCBpMjQwMG1fYnJoX2dldF9vcGNvZGUoYWNrKSwgb3Bjb2RlKTsKKwkJZ290byBlcnJvcl9hY2tfb3Bjb2RlOworCX0KKwlpZiAoaTI0MDBtX2JyaF9nZXRfcmVzcG9uc2UoYWNrKSAhPSAwKSB7CS8qIGZhaWxlZD8gKi8KKwkJZGV2X2VycihkZXYsICJib290LW1vZGUgY21kICVkOiBlcnJvcjsgaHcgcmVzcG9uc2UgJXVcbiIsCisJCQlvcGNvZGUsIGkyNDAwbV9icmhfZ2V0X3Jlc3BvbnNlKGFjaykpOworCQlnb3RvIGVycm9yX2Fja19mYWlsZWQ7CisJfQorCWlmIChhY2tfc2l6ZSA8IGFjay0+ZGF0YV9zaXplICsgc2l6ZW9mKCphY2spKSB7CisJCWRldl9lcnIoZGV2LCAiYm9vdC1tb2RlIGNtZCAlZDogU1cgQlVHICIKKwkJCSJkcml2ZXIgcHJvdmlkZWQgb25seSAlenUgYnl0ZXMgZm9yICV6dSBieXRlcyAiCisJCQkib2YgZGF0YVxuIiwgb3Bjb2RlLCBhY2tfc2l6ZSwKKwkJCShzaXplX3QpIGxlMzJfdG9fY3B1KGFjay0+ZGF0YV9zaXplKSArIHNpemVvZigqYWNrKSk7CisJCWdvdG8gZXJyb3JfYWNrX3Nob3J0X2J1ZmZlcjsKKwl9CisJcmVzdWx0ID0gYWNrX3NpemU7CisJLyogRG9uJ3QgeW91IGxvdmUgdGhpcyBzdGFjayBvZiBlbXB0eSB0YXJnZXRzPyBXZWxsLCBJIGRvbid0CisJICogZWl0aGVyLCBidXQgaXQgaGVscHMgdHJhY2sgZXhhY3RseSB3aG8gY29tZXMgaW4gaGVyZSBhbmQKKwkgKiB3aHkgOikgKi8KK2Vycm9yX2Fja19zaG9ydF9idWZmZXI6CitlcnJvcl9hY2tfZmFpbGVkOgorZXJyb3JfYWNrX29wY29kZToKK2Vycm9yX2Fja19zaWduYXR1cmU6CitvdXRfcmF3OgorZXJyb3JfcmVib290X2FjazoKK2Vycm9yX3JlYm9vdDoKK2Vycm9yX2Fja19zaG9ydDoKKwlkX2ZuZW5kKDgsIGRldiwgIihpMjQwMG0gJXAgb3Bjb2RlICVkIGFjayAlcCBzaXplICV6dSkgPSAlZFxuIiwKKwkJaTI0MDBtLCBvcGNvZGUsIGFjaywgYWNrX3NpemUsIChpbnQpIHJlc3VsdCk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworCisvKioKKyAqIGkyNDAwbV9ibV9jbWQgLSBFeGVjdXRlIGEgYm9vdCBtb2RlIGNvbW1hbmQKKyAqCisgKiBAY21kOiBidWZmZXIgY29udGFpbmluZyB0aGUgY29tbWFuZCBkYXRhIChwb2ludGluZyBhdCB0aGUgaGVhZGVyKS4KKyAqICAgICBUaGlzIGRhdGEgY2FuIGJlIEFOWVdIRVJFIChmb3IgVVNCLCB3ZSB3aWxsIGNvcHkgaXQgdG8gYW4KKyAqICAgICBzcGVjaWZpYyBidWZmZXIpLiBNYWtlIHN1cmUgZXZlcnl0aGluZyBpcyBpbiBwcm9wZXIgbGl0dGxlCisgKiAgICAgZW5kaWFuLgorICoKKyAqICAgICBBIHJhdyBidWZmZXIgY2FuIGJlIGFsc28gc2VudCwganVzdCBjYXN0IGl0IGFuZCBzZXQgZmxhZ3MgdG8KKyAqICAgICBJMjQwME1fQk1fQ01EX1JBVy4KKyAqCisgKiAgICAgVGhpcyBmdW5jdGlvbiB3aWxsIGdlbmVyYXRlIGEgY2hlY2tzdW0gZm9yIHlvdSBpZiB0aGUKKyAqICAgICBjaGVja3N1bSBiaXQgaW4gdGhlIGNvbW1hbmQgaXMgc2V0ICh1bmxlc3MgSTI0MDBNX0JNX0NNRF9SQVcKKyAqICAgICBpcyBzZXQpLgorICoKKyAqICAgICBZb3UgY2FuIHVzZSB0aGUgaTI0MDBtLT5ibV9jbWRfYnVmIHRvIHN0YWdlIHlvdXIgY29tbWFuZHMgYW5kCisgKiAgICAgc2VuZCB0aGVtLgorICoKKyAqICAgICBJZiBOVUxMLCBubyBjb21tYW5kIGlzIHNlbnQgKHdlIGp1c3Qgd2FpdCBmb3IgYW4gYWNrKS4KKyAqCisgKiBAY21kX3NpemU6IHNpemUgb2YgdGhlIGNvbW1hbmQuIFdpbGwgYmUgYXV0byBwYWRkZWQgdG8gdGhlCisgKiAgICAgYnVzLXNwZWNpZmljIGRyaXZlcnMgcGFkZGluZyByZXF1aXJlbWVudHMuCisgKgorICogQGFjazogYnVmZmVyIHdoZXJlIHRvIHBsYWNlIHRoZSBhY2tub3dsZWRnZW1lbnQuIElmIGl0IGlzIGEgcmVndWxhcgorICogICAgIGNvbW1hbmQgcmVzcG9uc2UsIGFsbCBmaWVsZHMgd2lsbCBiZSByZXR1cm5lZCB3aXRoIHRoZSByaWdodCwKKyAqICAgICBuYXRpdmUgZW5kaWFuZXNzLgorICoKKyAqICAgICBZb3UgKmNhbm5vdCogdXNlIGkyNDAwbS0+Ym1fYWNrX2J1ZiBmb3IgdGhpcyBidWZmZXIuCisgKgorICogQGFja19zaXplOiBzaXplIG9mIEBhY2ssIDE2IGFsaWduZWQ7IHlvdSBuZWVkIHRvIHByb3ZpZGUgYXQgbGVhc3QKKyAqICAgICBzaXplb2YoKmFjaykgYnl0ZXMgYW5kIHRoZW4gZW5vdWdoIHRvIGNvbnRhaW4gdGhlIHJldHVybiBkYXRhCisgKiAgICAgZnJvbSB0aGUgY29tbWFuZAorICoKKyAqIEBmbGFnczogc2VlIEkyNDAwTV9CTV9DTURfKiBhYm92ZS4KKyAqCisgKiBAcmV0dXJuczogYnl0ZXMgcmVjZWl2ZWQgYnkgdGhlIG5vdGlmaWNhdGlvbjsgaWYgPCAwLCBhbiBlcnJubyBjb2RlCisgKiAgICAgZGVub3RpbmcgYW4gZXJyb3Igb3I6CisgKgorICogICAgIC1FUkVTVEFSVFNZUyAgVGhlIGRldmljZSBoYXMgcmVib290ZWQKKyAqCisgKiBFeGVjdXRlcyBhIGJvb3QtbW9kZSBjb21tYW5kIGFuZCB3YWl0cyBmb3IgYSByZXNwb25zZSwgZG9pbmcgYmFzaWMKKyAqIHZhbGlkYXRpb24gb24gaXQ7IGlmIGEgemVybyBsZW5ndGggcmVzcG9uc2UgaXMgcmVjZWl2ZWQsIGl0IHJldHJpZXMKKyAqIHdhaXRpbmcgZm9yIGEgcmVzcG9uc2UgdW50aWwgYSBub24temVybyBvbmUgaXMgcmVjZWl2ZWQgKHRpbWluZyBvdXQKKyAqIGFmdGVyICVJMjQwME1fQk9PVF9SRVRSSUVTIHJldHJpZXMpLgorICovCitzdGF0aWMKK3NzaXplX3QgaTI0MDBtX2JtX2NtZChzdHJ1Y3QgaTI0MDBtICppMjQwMG0sCisJCSAgICAgIGNvbnN0IHN0cnVjdCBpMjQwMG1fYm9vdHJvbV9oZWFkZXIgKmNtZCwgc2l6ZV90IGNtZF9zaXplLAorCQkgICAgICBzdHJ1Y3QgaTI0MDBtX2Jvb3Ryb21faGVhZGVyICphY2ssIHNpemVfdCBhY2tfc2l6ZSwKKwkJICAgICAgaW50IGZsYWdzKQoreworCXNzaXplX3QgcmVzdWx0ID0gLUVOT01FTSwgcnhfYnl0ZXM7CisJc3RydWN0IGRldmljZSAqZGV2ID0gaTI0MDBtX2RldihpMjQwMG0pOworCWludCBvcGNvZGUgPSBjbWQgPT0gTlVMTCA/IC0xIDogaTI0MDBtX2JyaF9nZXRfb3Bjb2RlKGNtZCk7CisKKwlkX2Zuc3RhcnQoNiwgZGV2LCAiKGkyNDAwbSAlcCBjbWQgJXAgc2l6ZSAlenUgYWNrICVwIHNpemUgJXp1KVxuIiwKKwkJICBpMjQwMG0sIGNtZCwgY21kX3NpemUsIGFjaywgYWNrX3NpemUpOworCUJVR19PTihhY2tfc2l6ZSA8IHNpemVvZigqYWNrKSk7CisJQlVHX09OKGkyNDAwbS0+Ym9vdF9tb2RlID09IDApOworCisJaWYgKGNtZCAhPSBOVUxMKSB7CQkvKiBzZW5kIHRoZSBjb21tYW5kICovCisJCW1lbWNweShpMjQwMG0tPmJtX2NtZF9idWYsIGNtZCwgY21kX3NpemUpOworCQlyZXN1bHQgPSBpMjQwMG0tPmJ1c19ibV9jbWRfc2VuZChpMjQwMG0sIGNtZCwgY21kX3NpemUsIGZsYWdzKTsKKwkJaWYgKHJlc3VsdCA8IDApCisJCQlnb3RvIGVycm9yX2NtZF9zZW5kOworCQlpZiAoKGZsYWdzICYgSTI0MDBNX0JNX0NNRF9SQVcpID09IDApCisJCQlkX3ByaW50Zig1LCBkZXYsCisJCQkJICJib290LW1vZGUgY21kICVkIGNzdW0gJXUgcnIgJXUgZGEgJXU6ICIKKwkJCQkgImFkZHIgMHglMDR4IHNpemUgJXUgYmxvY2sgY3N1bSAweCUwNHhcbiIsCisJCQkJIG9wY29kZSwgaTI0MDBtX2JyaF9nZXRfdXNlX2NoZWNrc3VtKGNtZCksCisJCQkJIGkyNDAwbV9icmhfZ2V0X3Jlc3BvbnNlX3JlcXVpcmVkKGNtZCksCisJCQkJIGkyNDAwbV9icmhfZ2V0X2RpcmVjdF9hY2Nlc3MoY21kKSwKKwkJCQkgY21kLT50YXJnZXRfYWRkciwgY21kLT5kYXRhX3NpemUsCisJCQkJIGNtZC0+YmxvY2tfY2hlY2tzdW0pOworCX0KKwlyZXN1bHQgPSBpMjQwMG0tPmJ1c19ibV93YWl0X2Zvcl9hY2soaTI0MDBtLCBhY2ssIGFja19zaXplKTsKKwlpZiAocmVzdWx0IDwgMCkgeworCQlkZXZfZXJyKGRldiwgImJvb3QtbW9kZSBjbWQgJWQ6IGVycm9yIHdhaXRpbmcgZm9yIGFuIGFjazogJWRcbiIsCisJCQlvcGNvZGUsIChpbnQpIHJlc3VsdCk7CS8qIGJhaCwgJXpkIGRvZXNuJ3Qgd29yayAqLworCQlnb3RvIGVycm9yX3dhaXRfZm9yX2FjazsKKwl9CisJcnhfYnl0ZXMgPSByZXN1bHQ7CisJLyogdmVyaWZ5IHRoZSBhY2sgYW5kIHJlYWQgbW9yZSBpZiBuZWNjZXNzYXJ5IFtyZXN1bHQgaXMgdGhlCisJICogZmluYWwgYW1vdW50IG9mIGJ5dGVzIHdlIGdldCBpbiB0aGUgYWNrXSAgKi8KKwlyZXN1bHQgPSBfX2kyNDAwbV9ibV9hY2tfdmVyaWZ5KGkyNDAwbSwgb3Bjb2RlLCBhY2ssIGFja19zaXplLCBmbGFncyk7CisJaWYgKHJlc3VsdCA8IDApCisJCWdvdG8gZXJyb3JfYmFkX2FjazsKKwkvKiBEb24ndCB5b3UgbG92ZSB0aGlzIHN0YWNrIG9mIGVtcHR5IHRhcmdldHM/IFdlbGwsIEkgZG9uJ3QKKwkgKiBlaXRoZXIsIGJ1dCBpdCBoZWxwcyB0cmFjayBleGFjdGx5IHdobyBjb21lcyBpbiBoZXJlIGFuZAorCSAqIHdoeSA6KSAqLworCXJlc3VsdCA9IHJ4X2J5dGVzOworZXJyb3JfYmFkX2FjazoKK2Vycm9yX3dhaXRfZm9yX2FjazoKK2Vycm9yX2NtZF9zZW5kOgorCWRfZm5lbmQoNiwgZGV2LCAiKGkyNDAwbSAlcCBjbWQgJXAgc2l6ZSAlenUgYWNrICVwIHNpemUgJXp1KSA9ICVkXG4iLAorCQlpMjQwMG0sIGNtZCwgY21kX3NpemUsIGFjaywgYWNrX3NpemUsIChpbnQpIHJlc3VsdCk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworCisvKioKKyAqIGkyNDAwbV9kb3dubG9hZF9jaHVuayAtIHdyaXRlIGEgc2luZ2xlIGNodW5rIG9mIGRhdGEgdG8gdGhlIGRldmljZSdzIG1lbW9yeQorICoKKyAqIEBpMjQwMG06IGRldmljZSBkZXNjcmlwdG9yCisgKiBAYnVmOiB0aGUgYnVmZmVyIHRvIHdyaXRlCisgKiBAYnVmX2xlbjogbGVuZ3RoIG9mIHRoZSBidWZmZXIgdG8gd3JpdGUKKyAqIEBhZGRyOiBhZGRyZXNzIGluIHRoZSBkZXZpY2UgbWVtb3J5IHNwYWNlCisgKiBAZGlyZWN0OiBib290cm9tIHdyaXRlIG1vZGUKKyAqIEBkb19jc3VtOiBzaG91bGQgYSBjaGVja3N1bSB2YWxpZGF0aW9uIGJlIHBlcmZvcm1lZAorICovCitzdGF0aWMgaW50IGkyNDAwbV9kb3dubG9hZF9jaHVuayhzdHJ1Y3QgaTI0MDBtICppMjQwMG0sIGNvbnN0IHZvaWQgKmNodW5rLAorCQkJCSBzaXplX3QgX19jaHVua19sZW4sIHVuc2lnbmVkIGxvbmcgYWRkciwKKwkJCQkgdW5zaWduZWQgaW50IGRpcmVjdCwgdW5zaWduZWQgaW50IGRvX2NzdW0pCit7CisJaW50IHJldDsKKwlzaXplX3QgY2h1bmtfbGVuID0gQUxJR04oX19jaHVua19sZW4sIEkyNDAwTV9QTF9QQUQpOworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGkyNDAwbV9kZXYoaTI0MDBtKTsKKwlzdHJ1Y3QgeworCQlzdHJ1Y3QgaTI0MDBtX2Jvb3Ryb21faGVhZGVyIGNtZDsKKwkJdTggY21kX3BheWxvYWRbY2h1bmtfbGVuXTsKKwl9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpICpidWY7CisJc3RydWN0IGkyNDAwbV9ib290cm9tX2hlYWRlciBhY2s7CisKKwlkX2Zuc3RhcnQoNSwgZGV2LCAiKGkyNDAwbSAlcCBjaHVuayAlcCBfX2NodW5rX2xlbiAlenUgYWRkciAweCUwOGx4ICIKKwkJICAiZGlyZWN0ICV1IGRvX2NzdW0gJXUpXG4iLCBpMjQwMG0sIGNodW5rLCBfX2NodW5rX2xlbiwKKwkJICBhZGRyLCBkaXJlY3QsIGRvX2NzdW0pOworCWJ1ZiA9IGkyNDAwbS0+Ym1fY21kX2J1ZjsKKwltZW1jcHkoYnVmLT5jbWRfcGF5bG9hZCwgY2h1bmssIF9fY2h1bmtfbGVuKTsKKwltZW1zZXQoYnVmLT5jbWRfcGF5bG9hZCArIF9fY2h1bmtfbGVuLCAweGFkLCBjaHVua19sZW4gLSBfX2NodW5rX2xlbik7CisKKwlidWYtPmNtZC5jb21tYW5kID0gaTI0MDBtX2JyaF9jb21tYW5kKEkyNDAwTV9CUkhfV1JJVEUsCisJCQkJCSAgICAgIF9fY2h1bmtfbGVuICYgMHgzID8gMCA6IGRvX2NzdW0sCisJCQkJCSAgICAgIF9fY2h1bmtfbGVuICYgMHhmID8gMCA6IGRpcmVjdCk7CisJYnVmLT5jbWQudGFyZ2V0X2FkZHIgPSBjcHVfdG9fbGUzMihhZGRyKTsKKwlidWYtPmNtZC5kYXRhX3NpemUgPSBjcHVfdG9fbGUzMihfX2NodW5rX2xlbik7CisJcmV0ID0gaTI0MDBtX2JtX2NtZChpMjQwMG0sICZidWYtPmNtZCwgc2l6ZW9mKGJ1Zi0+Y21kKSArIGNodW5rX2xlbiwKKwkJCSAgICAmYWNrLCBzaXplb2YoYWNrKSwgMCk7CisJaWYgKHJldCA+PSAwKQorCQlyZXQgPSAwOworCWRfZm5lbmQoNSwgZGV2LCAiKGkyNDAwbSAlcCBjaHVuayAlcCBfX2NodW5rX2xlbiAlenUgYWRkciAweCUwOGx4ICIKKwkJImRpcmVjdCAldSBkb19jc3VtICV1KSA9ICVkXG4iLCBpMjQwMG0sIGNodW5rLCBfX2NodW5rX2xlbiwKKwkJYWRkciwgZGlyZWN0LCBkb19jc3VtLCByZXQpOworCXJldHVybiByZXQ7Cit9CisKKworLyoKKyAqIERvd25sb2FkIGEgQkNGIGZpbGUncyBzZWN0aW9ucyB0byB0aGUgZGV2aWNlCisgKgorICogQGkyNDAwbTogZGV2aWNlIGRlc2NyaXB0b3IKKyAqIEBiY2Y6IHBvaW50ZXIgdG8gZmlybXdhcmUgZGF0YSAoZm9sbG93ZWQgYnkgdGhlIHBheWxvYWRzKS4gQXNzdW1lZAorICogICAgICAgdmVyaWZpZWQgYW5kIGNvbnNpc3RlbnQuCisgKiBAYmNmX2xlbjogbGVuZ3RoIChpbiBieXRlcykgb2YgdGhlIEBiY2YgYnVmZmVyLgorICoKKyAqIFJldHVybnM6IDwgMCBlcnJubyBjb2RlIG9uIGVycm9yIG9yIHRoZSBvZmZzZXQgdG8gdGhlIGp1bXAgaW5zdHJ1Y3Rpb24uCisgKgorICogR2l2ZW4gYSBCQ0YgZmlsZSwgZG93bmxvYWRzIGVhY2ggc2VjdGlvbiAoYSBjb21tYW5kIGFuZCBhIHBheWxvYWQpCisgKiB0byB0aGUgZGV2aWNlJ3MgYWRkcmVzcyBzcGFjZS4gQWN0dWFsbHksIGl0IGp1c3QgZXhlY3V0ZXMgZWFjaAorICogY29tbWFuZCBpIHRoZSBCQ0YgZmlsZS4KKyAqCisgKiBUaGUgc2VjdGlvbiBzaXplIGhhcyB0byBiZSBhbGlnbmVkIHRvIDQgYnl0ZXMgQU5EIHRoZSBwYWRkaW5nIGhhcworICogdG8gYmUgdGFrZW4gZnJvbSB0aGUgZmlybXdhcmUgZmlsZSwgYXMgdGhlIHNpZ25hdHVyZSB0YWtlcyBpdCBpbnRvCisgKiBhY2NvdW50LgorICovCitzdGF0aWMKK3NzaXplX3QgaTI0MDBtX2RubG9hZF9iY2Yoc3RydWN0IGkyNDAwbSAqaTI0MDBtLAorCQkJICBjb25zdCBzdHJ1Y3QgaTI0MDBtX2JjZl9oZHIgKmJjZiwgc2l6ZV90IGJjZl9sZW4pCit7CisJc3NpemVfdCByZXQ7CisJc3RydWN0IGRldmljZSAqZGV2ID0gaTI0MDBtX2RldihpMjQwMG0pOworCXNpemVfdCBvZmZzZXQsCQkvKiBpdGVyYXRvciBvZmZzZXQgKi8KKwkJZGF0YV9zaXplLAkvKiBTaXplIG9mIHRoZSBkYXRhIHBheWxvYWQgKi8KKwkJc2VjdGlvbl9zaXplLAkvKiBTaXplIG9mIHRoZSB3aG9sZSBzZWN0aW9uIChjbWQgKyBwYXlsb2FkKSAqLworCQlzZWN0aW9uID0gMTsKKwljb25zdCBzdHJ1Y3QgaTI0MDBtX2Jvb3Ryb21faGVhZGVyICpiaDsKKwlzdHJ1Y3QgaTI0MDBtX2Jvb3Ryb21faGVhZGVyIGFjazsKKworCWRfZm5zdGFydCgzLCBkZXYsICIoaTI0MDBtICVwIGJjZiAlcCBiY2ZfbGVuICV6dSlcbiIsCisJCSAgaTI0MDBtLCBiY2YsIGJjZl9sZW4pOworCS8qIEl0ZXJhdGUgb3ZlciB0aGUgY29tbWFuZCBibG9ja3MgaW4gdGhlIEJDRiBmaWxlIHRoYXQgc3RhcnQKKwkgKiBhZnRlciB0aGUgaGVhZGVyICovCisJb2Zmc2V0ID0gbGUzMl90b19jcHUoYmNmLT5oZWFkZXJfbGVuKSAqIHNpemVvZih1MzIpOworCXdoaWxlICgxKSB7CS8qIHN0YXJ0IHNlbmRpbmcgdGhlIGZpbGUgKi8KKwkJYmggPSAodm9pZCAqKSBiY2YgKyBvZmZzZXQ7CisJCWRhdGFfc2l6ZSA9IGxlMzJfdG9fY3B1KGJoLT5kYXRhX3NpemUpOworCQlzZWN0aW9uX3NpemUgPSBBTElHTihzaXplb2YoKmJoKSArIGRhdGFfc2l6ZSwgNCk7CisJCWRfcHJpbnRmKDcsIGRldiwKKwkJCSAiZG93bmxvYWRpbmcgc2VjdGlvbiAjJXp1IChAJXp1ICV6dSBCKSB0byAweCUwOHhcbiIsCisJCQkgc2VjdGlvbiwgb2Zmc2V0LCBzaXplb2YoKmJoKSArIGRhdGFfc2l6ZSwKKwkJCSBsZTMyX3RvX2NwdShiaC0+dGFyZ2V0X2FkZHIpKTsKKwkJaWYgKGkyNDAwbV9icmhfZ2V0X29wY29kZShiaCkgPT0gSTI0MDBNX0JSSF9TSUdORURfSlVNUCkgeworCQkJLyogU2VjdXJlIGJvb3QgbmVlZHMgdG8gc3RvcCBoZXJlICovCisJCQlkX3ByaW50Zig1LCBkZXYsICAic2lnbmVkIGp1bXAgZm91bmQgQCV6dVxuIiwgb2Zmc2V0KTsKKwkJCWJyZWFrOworCQl9CisJCWlmIChvZmZzZXQgKyBzZWN0aW9uX3NpemUgPT0gYmNmX2xlbikKKwkJCS8qIE5vbi1zZWN1cmUgYm9vdCBzdG9wcyBoZXJlICovCisJCQlicmVhazsKKwkJaWYgKG9mZnNldCArIHNlY3Rpb25fc2l6ZSA+IGJjZl9sZW4pIHsKKwkJCWRldl9lcnIoZGV2LCAiZncgJXM6IGJhZCBzZWN0aW9uICMlenUsICIKKwkJCQkiZW5kIChAJXp1KSBiZXlvbmQgRU9GIChAJXp1KVxuIiwKKwkJCQlpMjQwMG0tPmJ1c19md19uYW1lLCBzZWN0aW9uLAorCQkJCW9mZnNldCArIHNlY3Rpb25fc2l6ZSwgIGJjZl9sZW4pOworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWdvdG8gZXJyb3Jfc2VjdGlvbl9iZXlvbmRfZW9mOworCQl9CisJCV9faTI0MDBtX21zbGVlcCgyMCk7CisJCXJldCA9IGkyNDAwbV9ibV9jbWQoaTI0MDBtLCBiaCwgc2VjdGlvbl9zaXplLAorCQkJCSAgICAmYWNrLCBzaXplb2YoYWNrKSwgSTI0MDBNX0JNX0NNRF9SQVcpOworCQlpZiAocmV0IDwgMCkgeworCQkJZGV2X2VycihkZXYsICJmdyAlczogc2VjdGlvbiAjJXp1IChAJXp1ICV6dSBCKSAiCisJCQkJImZhaWxlZCAlZFxuIiwgaTI0MDBtLT5idXNfZndfbmFtZSwgc2VjdGlvbiwKKwkJCQlvZmZzZXQsIHNpemVvZigqYmgpICsgZGF0YV9zaXplLCAoaW50KSByZXQpOworCQkJZ290byBlcnJvcl9zZW5kOworCQl9CisJCW9mZnNldCArPSBzZWN0aW9uX3NpemU7CisJCXNlY3Rpb24rKzsKKwl9CisJcmV0ID0gb2Zmc2V0OworZXJyb3Jfc2VjdGlvbl9iZXlvbmRfZW9mOgorZXJyb3Jfc2VuZDoKKwlkX2ZuZW5kKDMsIGRldiwgIihpMjQwMG0gJXAgYmNmICVwIGJjZl9sZW4gJXp1KSA9ICVkXG4iLAorCQlpMjQwMG0sIGJjZiwgYmNmX2xlbiwgKGludCkgcmV0KTsKKwlyZXR1cm4gcmV0OworfQorCisKKy8qCisgKiBEbyB0aGUgZmluYWwgc3RlcHMgb2YgdXBsb2FkaW5nIGZpcm13YXJlCisgKgorICogRGVwZW5kaW5nIG9uIHRoZSBib290IG1vZGUgKHNpZ25lZCB2cyBub24tc2lnbmVkKSwgZGlmZmVyZW50CisgKiBhY3Rpb25zIG5lZWQgdG8gYmUgdGFrZW4uCisgKi8KK3N0YXRpYworaW50IGkyNDAwbV9kbmxvYWRfZmluYWxpemUoc3RydWN0IGkyNDAwbSAqaTI0MDBtLAorCQkJICAgY29uc3Qgc3RydWN0IGkyNDAwbV9iY2ZfaGRyICpiY2YsIHNpemVfdCBvZmZzZXQpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IGRldmljZSAqZGV2ID0gaTI0MDBtX2RldihpMjQwMG0pOworCXN0cnVjdCBpMjQwMG1fYm9vdHJvbV9oZWFkZXIgKmNtZCwgYWNrOworCXN0cnVjdCB7CisJCXN0cnVjdCBpMjQwMG1fYm9vdHJvbV9oZWFkZXIgY21kOworCQl1OCBjbWRfcGxbMF07CisJfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSAqY21kX2J1ZjsKKwlzaXplX3Qgc2lnbmF0dXJlX2Jsb2NrX29mZnNldCwgc2lnbmF0dXJlX2Jsb2NrX3NpemU7CisKKwlkX2Zuc3RhcnQoMywgZGV2LCAib2Zmc2V0ICV6dVxuIiwgb2Zmc2V0KTsKKwljbWQgPSAodm9pZCAqKSBiY2YgKyBvZmZzZXQ7CisJaWYgKGkyNDAwbS0+c2Jvb3QgPT0gMCkgeworCQlzdHJ1Y3QgaTI0MDBtX2Jvb3Ryb21faGVhZGVyIGp1bXBfYWNrOworCQlkX3ByaW50ZigzLCBkZXYsICJ1bnNlY3VyZSBib290LCBqdW1waW5nIHRvIDB4JTA4eFxuIiwKKwkJCWxlMzJfdG9fY3B1KGNtZC0+dGFyZ2V0X2FkZHIpKTsKKwkJaTI0MDBtX2JyaF9zZXRfb3Bjb2RlKGNtZCwgSTI0MDBNX0JSSF9KVU1QKTsKKwkJY21kLT5kYXRhX3NpemUgPSAwOworCQlyZXQgPSBpMjQwMG1fYm1fY21kKGkyNDAwbSwgY21kLCBzaXplb2YoKmNtZCksCisJCQkJICAgICZqdW1wX2Fjaywgc2l6ZW9mKGp1bXBfYWNrKSwgMCk7CisJfSBlbHNlIHsKKwkJZF9wcmludGYoMywgZGV2LCAic2VjdXJlIGJvb3QsIGp1bXBpbmcgdG8gMHglMDh4XG4iLAorCQkJIGxlMzJfdG9fY3B1KGNtZC0+dGFyZ2V0X2FkZHIpKTsKKwkJY21kX2J1ZiA9IGkyNDAwbS0+Ym1fY21kX2J1ZjsKKwkJbWVtY3B5KCZjbWRfYnVmLT5jbWQsIGNtZCwgc2l6ZW9mKCpjbWQpKTsKKwkJc2lnbmF0dXJlX2Jsb2NrX29mZnNldCA9CisJCQlzaXplb2YoKmJjZikKKwkJCSsgbGUzMl90b19jcHUoYmNmLT5rZXlfc2l6ZSkgKiBzaXplb2YodTMyKQorCQkJKyBsZTMyX3RvX2NwdShiY2YtPmV4cG9uZW50X3NpemUpICogc2l6ZW9mKHUzMik7CisJCXNpZ25hdHVyZV9ibG9ja19zaXplID0KKwkJCWxlMzJfdG9fY3B1KGJjZi0+bW9kdWx1c19zaXplKSAqIHNpemVvZih1MzIpOworCQltZW1jcHkoY21kX2J1Zi0+Y21kX3BsLCAodm9pZCAqKSBiY2YgKyBzaWduYXR1cmVfYmxvY2tfb2Zmc2V0LAorCQkgICAgICAgc2lnbmF0dXJlX2Jsb2NrX3NpemUpOworCQlyZXQgPSBpMjQwMG1fYm1fY21kKGkyNDAwbSwgJmNtZF9idWYtPmNtZCwKKwkJCQkgICAgc2l6ZW9mKGNtZF9idWYtPmNtZCkgKyBzaWduYXR1cmVfYmxvY2tfc2l6ZSwKKwkJCQkgICAgJmFjaywgc2l6ZW9mKGFjayksIEkyNDAwTV9CTV9DTURfUkFXKTsKKwl9CisJZF9mbmVuZCgzLCBkZXYsICJyZXR1cm5pbmcgJWRcbiIsIHJldCk7CisJcmV0dXJuIHJldDsKK30KKworCisvKioKKyAqIGkyNDAwbV9ib290cm9tX2luaXQgLSBSZWJvb3RzIGEgcG93ZXJlZCBkZXZpY2UgaW50byBib290IG1vZGUKKyAqCisgKiBAaTI0MDBtOiBkZXZpY2UgZGVzY3JpcHRvcgorICogQGZsYWdzOgorICogICAgICBJMjQwME1fQlJJX1NPRlQ6IGEgcmVib290IG5vdGlmaWNhdGlvbiBoYXMgYmVlbiBzZWVuCisgKiAgICAgICAgICBhbHJlYWR5LCBzbyBkb24ndCB3YWl0IGZvciBpdC4KKyAqCisgKiAgICAgIEkyNDAwTV9CUklfTk9fUkVCT09UOiBEb24ndCBzZW5kIGEgcmVib290IGNvbW1hbmQsIGJ1dCB3YWl0CisgKiAgICAgICAgICBmb3IgYSByZWJvb3QgYmFya2VyIG5vdGlmaWNhdGlvbi4gVGhpcyBpcyBhIG9uZSBzaG90OyBpZgorICogICAgICAgICAgdGhlIHN0YXRlIG1hY2hpbmUgbmVlZHMgdG8gc2VuZCBhIHJlYm9vdCBjb21tYW5kIGl0IHdpbGwuCisgKgorICogUmV0dXJuczoKKyAqCisgKiAgICAgPCAwIGVycm5vIGNvZGUgb24gZXJyb3IsIDAgaWYgb2suCisgKgorICogICAgIGkyNDAwbS0+c2Jvb3Qgc2V0IHRvIDAgZm9yIHVuc2VjdXJlIGJvb3QgcHJvY2VzcywgMSBmb3Igc2VjdXJlCisgKiAgICAgYm9vdCBwcm9jZXNzLgorICoKKyAqIERlc2NyaXB0aW9uOgorICoKKyAqIFRyaWVzIGhhcmQgZW5vdWdoIHRvIHB1dCB0aGUgZGV2aWNlIGluIGJvb3QtbW9kZS4gVGhlcmUgYXJlIHR3bworICogbWFpbiBwaGFzZXMgdG8gdGhpczoKKyAqCisgKiBhLiAoMSkgc2VuZCBhIHJlYm9vdCBjb21tYW5kIGFuZCAoMikgZ2V0IGEgcmVib290IGJhcmtlcgorICogYi4gKDEpIGFjayB0aGUgcmVib290IHNlbmRpbmcgYSByZWJvb3QgYmFya2VyIGFuZCAoMikgZ2V0dGluZyBhbgorICogICAgICAgIGFjayBiYXJrZXIgaW4gcmV0dXJuCisgKgorICogV2Ugd2FudCB0byBza2lwIChhKSBpbiBzb21lIGNhc2VzIFtzb2Z0XS4gVGhlIHN0YXRlIG1hY2hpbmUgaXMKKyAqIGhvcnJpYmxlLCBidXQgaXQgaXMgYmFzaWNhbGx5OiBvbiBlYWNoIHBoYXNlLCBzZW5kIHdoYXQgaGFzIHRvIGJlCisgKiBzZW50IChpZiBhbnkpLCB3YWl0IGZvciB0aGUgYW5zd2VyIGFuZCBhY3Qgb24gdGhlIGFuc3dlci4gV2UgbWlnaHQKKyAqIGhhdmUgdG8gYmFja3RyYWNrIGFuZCByZXRyeSwgc28gd2Uga2VlcCBhIG1heCB0cmllcyBjb3VudGVyIGZvcgorICogdGhhdC4KKyAqCisgKiBJZiB3ZSBnZXQgYSB0aW1lb3V0IGFmdGVyIHNlbmRpbmcgYSB3YXJtIHJlc2V0LCB3ZSBkbyBpdCBhZ2Fpbi4KKyAqLworaW50IGkyNDAwbV9ib290cm9tX2luaXQoc3RydWN0IGkyNDAwbSAqaTI0MDBtLCBlbnVtIGkyNDAwbV9icmkgZmxhZ3MpCit7CisJaW50IHJlc3VsdDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBpMjQwMG1fZGV2KGkyNDAwbSk7CisJc3RydWN0IGkyNDAwbV9ib290cm9tX2hlYWRlciAqY21kOworCXN0cnVjdCBpMjQwMG1fYm9vdHJvbV9oZWFkZXIgYWNrOworCWludCBjb3VudCA9IEkyNDAwTV9CT09UX1JFVFJJRVM7CisJaW50IGFja190aW1lb3V0X2NudCA9IDE7CisKKwlCVUlMRF9CVUdfT04oc2l6ZW9mKCpjbWQpICE9IHNpemVvZihpMjQwMG1fTkJPT1RfQkFSS0VSKSk7CisJQlVJTERfQlVHX09OKHNpemVvZihhY2spICE9IHNpemVvZihpMjQwMG1fQUNLX0JBUktFUikpOworCisJZF9mbnN0YXJ0KDQsIGRldiwgIihpMjQwMG0gJXAgZmxhZ3MgMHglMDh4KVxuIiwgaTI0MDBtLCBmbGFncyk7CisJcmVzdWx0ID0gLUVOT01FTTsKKwljbWQgPSBpMjQwMG0tPmJtX2NtZF9idWY7CisJaWYgKGZsYWdzICYgSTI0MDBNX0JSSV9TT0ZUKQorCQlnb3RvIGRvX3JlYm9vdF9hY2s7Citkb19yZWJvb3Q6CisJaWYgKC0tY291bnQgPCAwKQorCQlnb3RvIGVycm9yX3RpbWVvdXQ7CisJZF9wcmludGYoNCwgZGV2LCAiZGV2aWNlIHJlYm9vdDogcmVib290IGNvbW1hbmQgWyVkICMgbGVmdF1cbiIsCisJCSBjb3VudCk7CisJaWYgKChmbGFncyAmIEkyNDAwTV9CUklfTk9fUkVCT09UKSA9PSAwKQorCQlpMjQwMG0tPmJ1c19yZXNldChpMjQwMG0sIEkyNDAwTV9SVF9XQVJNKTsKKwlyZXN1bHQgPSBpMjQwMG1fYm1fY21kKGkyNDAwbSwgTlVMTCwgMCwgJmFjaywgc2l6ZW9mKGFjayksCisJCQkgICAgICAgSTI0MDBNX0JNX0NNRF9SQVcpOworCWZsYWdzICY9IH5JMjQwME1fQlJJX05PX1JFQk9PVDsKKwlzd2l0Y2ggKHJlc3VsdCkgeworCWNhc2UgLUVSRVNUQVJUU1lTOgorCQlkX3ByaW50Zig0LCBkZXYsICJkZXZpY2UgcmVib290OiBnb3QgcmVib290IGJhcmtlclxuIik7CisJCWJyZWFrOworCWNhc2UgLUVJU0NPTk46CS8qIHdlIGRvbid0IGtub3cgaG93IGl0IGdvdCBoZXJlLi4uYnV0IHdlIGZvbGxvdyBpdCAqLworCQlkX3ByaW50Zig0LCBkZXYsICJkZXZpY2UgcmVib290OiBnb3QgYWNrIGJhcmtlciAtIHdoYXRldmVyXG4iKTsKKwkJZ290byBkb19yZWJvb3Q7CisJY2FzZSAtRVRJTUVET1VUOgkvKiBkZXZpY2UgaGFzIHRpbWVkIG91dCwgd2UgbWlnaHQgYmUgaW4gYm9vdAorCQkJCSAqIG1vZGUgYWxyZWFkeSBhbmQgZXhwZWN0aW5nIGFuIGFjaywgbGV0J3MgdHJ5CisJCQkJICogdGhhdCAqLworCQlkZXZfaW5mbyhkZXYsICJ3YXJtIHJlc2V0IHRpbWVkIG91dCwgdHJ5aW5nIGFuIGFja1xuIik7CisJCWdvdG8gZG9fcmVib290X2FjazsKKwljYXNlIC1FUFJPVE86CisJY2FzZSAtRVNIVVRET1dOOgkvKiBkZXYgaXMgZ29uZSAqLworCWNhc2UgLUVJTlRSOgkJLyogdXNlciBjYW5jZWxsZWQgKi8KKwkJZ290byBlcnJvcl9kZXZfZ29uZTsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKGRldiwgImRldmljZSByZWJvb3Q6IGVycm9yICVkIHdoaWxlIHdhaXRpbmcgIgorCQkJImZvciByZWJvb3QgYmFya2VyIC0gcmVib290aW5nXG4iLCByZXN1bHQpOworCQlnb3RvIGRvX3JlYm9vdDsKKwl9CisJLyogQXQgdGhpcyBwb2ludCB3ZSBhY2sgYmFjayB3aXRoIDQgUkVCT09UIGJhcmtlcnMgYW5kIGV4cGVjdAorCSAqIDQgQUNLIGJhcmtlcnMuIFRoaXMgaXMgdWdseSwgYXMgd2Ugc2VuZCBhIHJhdyBjb21tYW5kIC0tCisJICogaGVuY2UgdGhlIGNhc3QuIF9ibV9jbWQoKSB3aWxsIGNhdGNoIHRoZSByZWJvb3QgYWNrCisJICogbm90aWZpY2F0aW9uIGFuZCByZXBvcnQgaXQgYXMgLUVJU0NPTk4uICovCitkb19yZWJvb3RfYWNrOgorCWRfcHJpbnRmKDQsIGRldiwgImRldmljZSByZWJvb3QgYWNrOiBzZW5kaW5nIGFjayBbJWQgIyBsZWZ0XVxuIiwgY291bnQpOworCWlmIChpMjQwMG0tPnNib290ID09IDApCisJCW1lbWNweShjbWQsIGkyNDAwbV9OQk9PVF9CQVJLRVIsCisJCSAgICAgICBzaXplb2YoaTI0MDBtX05CT09UX0JBUktFUikpOworCWVsc2UKKwkJbWVtY3B5KGNtZCwgaTI0MDBtX1NCT09UX0JBUktFUiwKKwkJICAgICAgIHNpemVvZihpMjQwMG1fU0JPT1RfQkFSS0VSKSk7CisJcmVzdWx0ID0gaTI0MDBtX2JtX2NtZChpMjQwMG0sIGNtZCwgc2l6ZW9mKCpjbWQpLAorCQkJICAgICAgICZhY2ssIHNpemVvZihhY2spLCBJMjQwME1fQk1fQ01EX1JBVyk7CisJc3dpdGNoIChyZXN1bHQpIHsKKwljYXNlIC1FUkVTVEFSVFNZUzoKKwkJZF9wcmludGYoNCwgZGV2LCAicmVib290IGFjazogZ290IHJlYm9vdCBiYXJrZXIgLSByZXRyeWluZ1xuIik7CisJCWlmICgtLWNvdW50IDwgMCkKKwkJCWdvdG8gZXJyb3JfdGltZW91dDsKKwkJZ290byBkb19yZWJvb3RfYWNrOworCWNhc2UgLUVJU0NPTk46CisJCWRfcHJpbnRmKDQsIGRldiwgInJlYm9vdCBhY2s6IGdvdCBhY2sgYmFya2VyIC0gZ29vZFxuIik7CisJCWJyZWFrOworCWNhc2UgLUVUSU1FRE9VVDoJLyogbm8gcmVzcG9uc2UsIG1heWJlIGl0IGlzIHRoZSBvdGhlciB0eXBlPyAqLworCQlpZiAoYWNrX3RpbWVvdXRfY250LS0gPj0gMCkgeworCQkJZF9wcmludGYoNCwgZGV2LCAicmVib290IGFjayB0aW1lZG91dDogIgorCQkJCSAidHJ5aW5nIHRoZSBvdGhlciB0eXBlP1xuIik7CisJCQlpMjQwMG0tPnNib290ID0gIWkyNDAwbS0+c2Jvb3Q7CisJCQlnb3RvIGRvX3JlYm9vdF9hY2s7CisJCX0gZWxzZSB7CisJCQlkZXZfZXJyKGRldiwgInJlYm9vdCBhY2sgdGltZWRvdXQgdG9vIGxvbmc6ICIKKwkJCQkidHJ5aW5nIHJlYm9vdFxuIik7CisJCQlnb3RvIGRvX3JlYm9vdDsKKwkJfQorCQlicmVhazsKKwljYXNlIC1FUFJPVE86CisJY2FzZSAtRVNIVVRET1dOOgkvKiBkZXYgaXMgZ29uZSAqLworCQlnb3RvIGVycm9yX2Rldl9nb25lOworCWRlZmF1bHQ6CisJCWRldl9lcnIoZGV2LCAiZGV2aWNlIHJlYm9vdCBhY2s6IGVycm9yICVkIHdoaWxlIHdhaXRpbmcgZm9yICIKKwkJCSJyZWJvb3QgYWNrIGJhcmtlciAtIHJlYm9vdGluZ1xuIiwgcmVzdWx0KTsKKwkJZ290byBkb19yZWJvb3Q7CisJfQorCWRfcHJpbnRmKDIsIGRldiwgImRldmljZSByZWJvb3QgYWNrOiBnb3QgYWNrIGJhcmtlciAtIGJvb3QgZG9uZVxuIik7CisJcmVzdWx0ID0gMDsKK2V4aXRfdGltZW91dDoKK2Vycm9yX2Rldl9nb25lOgorCWRfZm5lbmQoNCwgZGV2LCAiKGkyNDAwbSAlcCBmbGFncyAweCUwOHgpID0gJWRcbiIsCisJCWkyNDAwbSwgZmxhZ3MsIHJlc3VsdCk7CisJcmV0dXJuIHJlc3VsdDsKKworZXJyb3JfdGltZW91dDoKKwlkZXZfZXJyKGRldiwgIlRpbWVkIG91dCB3YWl0aW5nIGZvciByZWJvb3QgYWNrLCByZXNldHRpbmdcbiIpOworCWkyNDAwbS0+YnVzX3Jlc2V0KGkyNDAwbSwgSTI0MDBNX1JUX0JVUyk7CisJcmVzdWx0ID0gLUVUSU1FRE9VVDsKKwlnb3RvIGV4aXRfdGltZW91dDsKK30KKworCisvKgorICogUmVhZCB0aGUgTUFDIGFkZHIKKyAqCisgKiBUaGUgcG9zaXRpb24gdGhpcyBmdW5jdGlvbiByZWFkcyBpcyBmaXhlZCBpbiBkZXZpY2UgbWVtb3J5IGFuZAorICogYWx3YXlzIGF2YWlsYWJsZSwgZXZlbiB3aXRob3V0IGZpcm13YXJlLgorICoKKyAqIE5vdGUgd2Ugc3BlY2lmeSB3ZSB3YW50IHRvIHJlYWQgb25seSBzaXggYnl0ZXMsIGJ1dCBwcm92aWRlIHNwYWNlCisgKiBmb3IgMTYsIGFzIHdlIGFsd2F5cyBnZXQgaXQgcm91bmRlZCB1cC4KKyAqLworaW50IGkyNDAwbV9yZWFkX21hY19hZGRyKHN0cnVjdCBpMjQwMG0gKmkyNDAwbSkKK3sKKwlpbnQgcmVzdWx0OworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGkyNDAwbV9kZXYoaTI0MDBtKTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiA9IGkyNDAwbS0+d2ltYXhfZGV2Lm5ldF9kZXY7CisJc3RydWN0IGkyNDAwbV9ib290cm9tX2hlYWRlciAqY21kOworCXN0cnVjdCB7CisJCXN0cnVjdCBpMjQwMG1fYm9vdHJvbV9oZWFkZXIgYWNrOworCQl1OCBhY2tfcGxbMTZdOworCX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgYWNrX2J1ZjsKKworCWRfZm5zdGFydCg1LCBkZXYsICIoaTI0MDBtICVwKVxuIiwgaTI0MDBtKTsKKwljbWQgPSBpMjQwMG0tPmJtX2NtZF9idWY7CisJY21kLT5jb21tYW5kID0gaTI0MDBtX2JyaF9jb21tYW5kKEkyNDAwTV9CUkhfUkVBRCwgMCwgMSk7CisJY21kLT50YXJnZXRfYWRkciA9IGNwdV90b19sZTMyKDB4MDAyMDNmZTgpOworCWNtZC0+ZGF0YV9zaXplID0gY3B1X3RvX2xlMzIoNik7CisJcmVzdWx0ID0gaTI0MDBtX2JtX2NtZChpMjQwMG0sIGNtZCwgc2l6ZW9mKCpjbWQpLAorCQkJICAgICAgICZhY2tfYnVmLmFjaywgc2l6ZW9mKGFja19idWYpLCAwKTsKKwlpZiAocmVzdWx0IDwgMCkgeworCQlkZXZfZXJyKGRldiwgIkJNOiByZWFkIG1hYyBhZGRyIGZhaWxlZDogJWRcbiIsIHJlc3VsdCk7CisJCWdvdG8gZXJyb3JfcmVhZF9tYWM7CisJfQorCWRfcHJpbnRmKDIsIGRldiwKKwkJICJtYWMgYWRkciBpcyAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKwkJIGFja19idWYuYWNrX3BsWzBdLCBhY2tfYnVmLmFja19wbFsxXSwKKwkJIGFja19idWYuYWNrX3BsWzJdLCBhY2tfYnVmLmFja19wbFszXSwKKwkJIGFja19idWYuYWNrX3BsWzRdLCBhY2tfYnVmLmFja19wbFs1XSk7CisJaWYgKGkyNDAwbS0+YnVzX2JtX21hY19hZGRyX2ltcGFpcmVkID09IDEpIHsKKwkJYWNrX2J1Zi5hY2tfcGxbMF0gPSAweDAwOworCQlhY2tfYnVmLmFja19wbFsxXSA9IDB4MTY7CisJCWFja19idWYuYWNrX3BsWzJdID0gMHhkMzsKKwkJZ2V0X3JhbmRvbV9ieXRlcygmYWNrX2J1Zi5hY2tfcGxbM10sIDMpOworCQlkZXZfZXJyKGRldiwgIkJNIGlzIE1BQyBhZGRyIGltcGFpcmVkLCBmYWtpbmcgTUFDIGFkZHIgdG8gIgorCQkJIm1hYyBhZGRyIGlzICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorCQkJYWNrX2J1Zi5hY2tfcGxbMF0sIGFja19idWYuYWNrX3BsWzFdLAorCQkJYWNrX2J1Zi5hY2tfcGxbMl0sIGFja19idWYuYWNrX3BsWzNdLAorCQkJYWNrX2J1Zi5hY2tfcGxbNF0sIGFja19idWYuYWNrX3BsWzVdKTsKKwkJcmVzdWx0ID0gMDsKKwl9CisJbmV0X2Rldi0+YWRkcl9sZW4gPSBFVEhfQUxFTjsKKwltZW1jcHkobmV0X2Rldi0+cGVybV9hZGRyLCBhY2tfYnVmLmFja19wbCwgRVRIX0FMRU4pOworCW1lbWNweShuZXRfZGV2LT5kZXZfYWRkciwgYWNrX2J1Zi5hY2tfcGwsIEVUSF9BTEVOKTsKK2Vycm9yX3JlYWRfbWFjOgorCWRfZm5lbmQoNSwgZGV2LCAiKGkyNDAwbSAlcCkgPSAlZFxuIiwgaTI0MDBtLCByZXN1bHQpOworCXJldHVybiByZXN1bHQ7Cit9CisKKworLyoKKyAqIEluaXRpYWxpemUgYSBub24gc2lnbmVkIGJvb3QKKyAqCisgKiBUaGlzIGltcGxpZXMgc2VuZGluZyBzb21lIG1hZ2ljIHZhbHVlcyB0byB0aGUgZGV2aWNlJ3MgbWVtb3J5LiBOb3RlCisgKiB3ZSBjb252ZXJ0IHRoZSB2YWx1ZXMgdG8gbGl0dGxlIGVuZGlhbiBpbiB0aGUgc2FtZSBhcnJheQorICogZGVjbGFyYXRpb24uCisgKi8KK3N0YXRpYworaW50IGkyNDAwbV9kbmxvYWRfaW5pdF9ub25zaWduZWQoc3RydWN0IGkyNDAwbSAqaTI0MDBtKQoreworI2RlZmluZSBQT0tFKGEsIGQpIHsJCQkJCVwKKwkuYWRkcmVzcyA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMzIoYSksCQlcCisJLmRhdGEgPSBfX2NvbnN0YW50X2NwdV90b19sZTMyKGQpCQlcCit9CisJc3RhdGljIGNvbnN0IHN0cnVjdCB7CisJCV9fbGUzMiBhZGRyZXNzOworCQlfX2xlMzIgZGF0YTsKKwl9IGkyNDAwbV9wb2tlc1tdID0geworCQlQT0tFKDB4MDgxQTU4LCAweEE3ODEwMjMwKSwKKwkJUE9LRSgweDA4MDA0MCwgMHgwMDAwMDAwMCksCisJCVBPS0UoMHgwODAwNDgsIDB4MDAwMDAwODIpLAorCQlQT0tFKDB4MDgwMDRDLCAweDAwMDAwODFGKSwKKwkJUE9LRSgweDA4MDA1NCwgMHgwMDAwMDA4NSksCisJCVBPS0UoMHgwODAwNTgsIDB4MDAwMDAxODApLAorCQlQT0tFKDB4MDgwMDVDLCAweDAwMDAwMDE4KSwKKwkJUE9LRSgweDA4MDA2MCwgMHgwMDAwMDAxMCksCisJCVBPS0UoMHgwODA1NzQsIDB4MDAwMDAwMDEpLAorCQlQT0tFKDB4MDgwNTUwLCAweDAwMDAwMDA1KSwKKwkJUE9LRSgweEFFMDAwMCwgMHgwMDAwMDAwMCksCisJfTsKKyN1bmRlZiBQT0tFCisJdW5zaWduZWQgaTsKKwlpbnQgcmV0OworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGkyNDAwbV9kZXYoaTI0MDBtKTsKKworCWRldl93YXJuKGRldiwgIldBUk5JTkchISEgbm9uLXNpZ25lZCBib290IFVOVEVTVEVEIFBBVEghXG4iKTsKKworCWRfZm5zdGFydCg1LCBkZXYsICIoaTI0MDBtICVwKVxuIiwgaTI0MDBtKTsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShpMjQwMG1fcG9rZXMpOyBpKyspIHsKKwkJcmV0ID0gaTI0MDBtX2Rvd25sb2FkX2NodW5rKGkyNDAwbSwgJmkyNDAwbV9wb2tlc1tpXS5kYXRhLAorCQkJCQkgICAgc2l6ZW9mKGkyNDAwbV9wb2tlc1tpXS5kYXRhKSwKKwkJCQkJICAgIGkyNDAwbV9wb2tlc1tpXS5hZGRyZXNzLCAxLCAxKTsKKwkJaWYgKHJldCA8IDApCisJCQlicmVhazsKKwl9CisJZF9mbmVuZCg1LCBkZXYsICIoaTI0MDBtICVwKSA9ICVkXG4iLCBpMjQwMG0sIHJldCk7CisJcmV0dXJuIHJldDsKK30KKworCisvKgorICogSW5pdGlhbGl6ZSB0aGUgc2lnbmVkIGJvb3QgcHJvY2VzcworICoKKyAqIEBpMjQwMG06IGRldmljZSBkZXNjcmlwdG9yCisgKgorICogQGJjZl9oZHI6IHBvaW50ZXIgdG8gdGhlIGZpcm13YXJlIGhlYWRlcjsgYXNzdW1lcyBpdCBpcyBmdWxseSBpbgorICogICAgIG1lbW9yeSAoaXQgaGFzIGdvbmUgdGhyb3VnaCBiYXNpYyB2YWxpZGF0aW9uKS4KKyAqCisgKiBSZXR1cm5zOiAwIGlmIG9rLCA8IDAgZXJybm8gY29kZSBvbiBlcnJvciwgLUVSRVNUQVJUU1lTIGlmIHRoZSBodworICogICAgIHJlYm9vdGVkLgorICoKKyAqIFRoaXMgd3JpdGVzIHRoZSBmaXJtd2FyZSBCQ0YgaGVhZGVyIHRvIHRoZSBkZXZpY2UgdXNpbmcgdGhlCisgKiBIQVNIX1BBWUxPQURfT05MWSBjb21tYW5kLgorICovCitzdGF0aWMKK2ludCBpMjQwMG1fZG5sb2FkX2luaXRfc2lnbmVkKHN0cnVjdCBpMjQwMG0gKmkyNDAwbSwKKwkJCSAgICAgIGNvbnN0IHN0cnVjdCBpMjQwMG1fYmNmX2hkciAqYmNmX2hkcikKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGkyNDAwbV9kZXYoaTI0MDBtKTsKKwlzdHJ1Y3QgeworCQlzdHJ1Y3QgaTI0MDBtX2Jvb3Ryb21faGVhZGVyIGNtZDsKKwkJc3RydWN0IGkyNDAwbV9iY2ZfaGRyIGNtZF9wbDsKKwl9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpICpjbWRfYnVmOworCXN0cnVjdCBpMjQwMG1fYm9vdHJvbV9oZWFkZXIgYWNrOworCisJZF9mbnN0YXJ0KDUsIGRldiwgIihpMjQwMG0gJXAgYmNmX2hkciAlcClcbiIsIGkyNDAwbSwgYmNmX2hkcik7CisJY21kX2J1ZiA9IGkyNDAwbS0+Ym1fY21kX2J1ZjsKKwljbWRfYnVmLT5jbWQuY29tbWFuZCA9CisJCWkyNDAwbV9icmhfY29tbWFuZChJMjQwME1fQlJIX0hBU0hfUEFZTE9BRF9PTkxZLCAwLCAwKTsKKwljbWRfYnVmLT5jbWQudGFyZ2V0X2FkZHIgPSAwOworCWNtZF9idWYtPmNtZC5kYXRhX3NpemUgPSBjcHVfdG9fbGUzMihzaXplb2YoY21kX2J1Zi0+Y21kX3BsKSk7CisJbWVtY3B5KCZjbWRfYnVmLT5jbWRfcGwsIGJjZl9oZHIsIHNpemVvZigqYmNmX2hkcikpOworCXJldCA9IGkyNDAwbV9ibV9jbWQoaTI0MDBtLCAmY21kX2J1Zi0+Y21kLCBzaXplb2YoKmNtZF9idWYpLAorCQkJICAgICZhY2ssIHNpemVvZihhY2spLCAwKTsKKwlpZiAocmV0ID49IDApCisJCXJldCA9IDA7CisJZF9mbmVuZCg1LCBkZXYsICIoaTI0MDBtICVwIGJjZl9oZHIgJXApID0gJWRcbiIsIGkyNDAwbSwgYmNmX2hkciwgcmV0KTsKKwlyZXR1cm4gcmV0OworfQorCisKKy8qCisgKiBJbml0aWFsaXplIHRoZSBmaXJtd2FyZSBkb3dubG9hZCBhdCB0aGUgZGV2aWNlIHNpemUKKyAqCisgKiBNdWx0aXBsZXggdG8gdGhlIG9uZSB0aGF0IG1hdHRlcnMgYmFzZWQgb24gdGhlIGRldmljZSdzIG1vZGUKKyAqIChzaWduZWQgb3Igbm9uLXNpZ25lZCkuCisgKi8KK3N0YXRpYworaW50IGkyNDAwbV9kbmxvYWRfaW5pdChzdHJ1Y3QgaTI0MDBtICppMjQwMG0sIGNvbnN0IHN0cnVjdCBpMjQwMG1fYmNmX2hkciAqYmNmKQoreworCWludCByZXN1bHQ7CisJc3RydWN0IGRldmljZSAqZGV2ID0gaTI0MDBtX2RldihpMjQwMG0pOworCXUzMiBtb2R1bGVfaWQgPSBsZTMyX3RvX2NwdShiY2YtPm1vZHVsZV9pZCk7CisKKwlpZiAoaTI0MDBtLT5zYm9vdCA9PSAwCisJICAgICYmIChtb2R1bGVfaWQgJiBJMjQwME1fQkNGX01PRF9JRF9QT0tFUykgPT0gMCkgeworCQkvKiBub24tc2lnbmVkIGJvb3QgcHJvY2VzcyB3aXRob3V0IHBva2VzICovCisJCXJlc3VsdCA9IGkyNDAwbV9kbmxvYWRfaW5pdF9ub25zaWduZWQoaTI0MDBtKTsKKwkJaWYgKHJlc3VsdCA9PSAtRVJFU1RBUlRTWVMpCisJCQlyZXR1cm4gcmVzdWx0OworCQlpZiAocmVzdWx0IDwgMCkKKwkJCWRldl9lcnIoZGV2LCAiZncgJXM6IG5vbi1zaWduZWQgZG93bmxvYWQgIgorCQkJCSJpbml0aWFsaXphdGlvbiBmYWlsZWQ6ICVkXG4iLAorCQkJCWkyNDAwbS0+YnVzX2Z3X25hbWUsIHJlc3VsdCk7CisJfSBlbHNlIGlmIChpMjQwMG0tPnNib290ID09IDAKKwkJICYmIChtb2R1bGVfaWQgJiBJMjQwME1fQkNGX01PRF9JRF9QT0tFUykpIHsKKwkJLyogbm9uLXNpZ25lZCBib290IHByb2Nlc3Mgd2l0aCBwb2tlcywgbm90aGluZyB0byBkbyAqLworCQlyZXN1bHQgPSAwOworCX0gZWxzZSB7CQkgLyogc2lnbmVkIGJvb3QgcHJvY2VzcyAqLworCQlyZXN1bHQgPSBpMjQwMG1fZG5sb2FkX2luaXRfc2lnbmVkKGkyNDAwbSwgYmNmKTsKKwkJaWYgKHJlc3VsdCA9PSAtRVJFU1RBUlRTWVMpCisJCQlyZXR1cm4gcmVzdWx0OworCQlpZiAocmVzdWx0IDwgMCkKKwkJCWRldl9lcnIoZGV2LCAiZncgJXM6IHNpZ25lZCBib290IGRvd25sb2FkICIKKwkJCQkiaW5pdGlhbGl6YXRpb24gZmFpbGVkOiAlZFxuIiwKKwkJCQlpMjQwMG0tPmJ1c19md19uYW1lLCByZXN1bHQpOworCX0KKwlyZXR1cm4gcmVzdWx0OworfQorCisKKy8qCisgKiBSdW4gcXVpY2sgY29uc2lzdGVuY3kgdGVzdHMgb24gdGhlIGZpcm13YXJlIGZpbGUKKyAqCisgKiBDaGVjayBmb3IgdGhlIGZpcm13YXJlIGJlaW5nIG1hZGUgZm9yIHRoZSBpMjQwMG0gZGV2aWNlLAorICogZXRjLi4uVGhlc2UgY2hlY2tzIGFyZSBtb3N0bHkgaW5mb3JtYXRpdmUsIGFzIHRoZSBkZXZpY2Ugd2lsbCBtYWtlCisgKiB0aGVtIHRvbzsgYnV0IHRoZSBkcml2ZXIncyByZXNwb25zZSBpcyBtb3JlIGluZm9ybWF0aXZlIG9uIHdoYXQKKyAqIHdlbnQgd3JvbmcuCisgKi8KK3N0YXRpYworaW50IGkyNDAwbV9md19jaGVjayhzdHJ1Y3QgaTI0MDBtICppMjQwMG0sCisJCSAgICBjb25zdCBzdHJ1Y3QgaTI0MDBtX2JjZl9oZHIgKmJjZiwKKwkJICAgIHNpemVfdCBiY2Zfc2l6ZSkKK3sKKwlpbnQgcmVzdWx0OworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGkyNDAwbV9kZXYoaTI0MDBtKTsKKwl1bnNpZ25lZCBtb2R1bGVfdHlwZSwgaGVhZGVyX2xlbiwgbWFqb3JfdmVyc2lvbiwgbWlub3JfdmVyc2lvbiwKKwkJbW9kdWxlX2lkLCBtb2R1bGVfdmVuZG9yLCBkYXRlLCBzaXplOworCisJLyogQ2hlY2sgaGFyZCBlcnJvcnMgKi8KKwlyZXN1bHQgPSAtRUlOVkFMOworCWlmIChiY2Zfc2l6ZSA8IHNpemVvZigqYmNmKSkgewkvKiBiaWcgZW5vdWdoIGhlYWRlcj8gKi8KKwkJZGV2X2VycihkZXYsICJmaXJtd2FyZSAlcyB0b28gc2hvcnQ6ICIKKwkJCSIlenUgQiB2cyAlenUgKGF0IGxlYXN0KSBleHBlY3RlZFxuIiwKKwkJCWkyNDAwbS0+YnVzX2Z3X25hbWUsIGJjZl9zaXplLCBzaXplb2YoKmJjZikpOworCQlnb3RvIGVycm9yOworCX0KKworCW1vZHVsZV90eXBlID0gYmNmLT5tb2R1bGVfdHlwZTsKKwloZWFkZXJfbGVuID0gc2l6ZW9mKHUzMikgKiBsZTMyX3RvX2NwdShiY2YtPmhlYWRlcl9sZW4pOworCW1ham9yX3ZlcnNpb24gPSBsZTMyX3RvX2NwdShiY2YtPmhlYWRlcl92ZXJzaW9uKSAmIDB4ZmZmZjAwMDAgPj4gMTY7CisJbWlub3JfdmVyc2lvbiA9IGxlMzJfdG9fY3B1KGJjZi0+aGVhZGVyX3ZlcnNpb24pICYgMHgwMDAwZmZmZjsKKwltb2R1bGVfaWQgPSBsZTMyX3RvX2NwdShiY2YtPm1vZHVsZV9pZCk7CisJbW9kdWxlX3ZlbmRvciA9IGxlMzJfdG9fY3B1KGJjZi0+bW9kdWxlX3ZlbmRvcik7CisJZGF0ZSA9IGxlMzJfdG9fY3B1KGJjZi0+ZGF0ZSk7CisJc2l6ZSA9IHNpemVvZih1MzIpICogbGUzMl90b19jcHUoYmNmLT5zaXplKTsKKworCWlmIChiY2Zfc2l6ZSAhPSBzaXplKSB7CQkvKiBhbm5veWluZ2x5IHBhcmFub2lkICovCisJCWRldl9lcnIoZGV2LCAiZmlybXdhcmUgJXM6IGJhZCBzaXplLCBnb3QgIgorCQkJIiV6dSBCIHZzICV1IGV4cGVjdGVkXG4iLAorCQkJaTI0MDBtLT5idXNfZndfbmFtZSwgYmNmX3NpemUsIHNpemUpOworCQlnb3RvIGVycm9yOworCX0KKworCWRfcHJpbnRmKDIsIGRldiwgInR5cGUgMHgleCBpZCAweCV4IHZlbmRvciAweCV4OyBoZWFkZXIgdiV1LiV1ICglenUgQikgIgorCQkgImRhdGUgJTA4eCAoJXp1IEIpXG4iLAorCQkgbW9kdWxlX3R5cGUsIG1vZHVsZV9pZCwgbW9kdWxlX3ZlbmRvciwKKwkJIG1ham9yX3ZlcnNpb24sIG1pbm9yX3ZlcnNpb24sIChzaXplX3QpIGhlYWRlcl9sZW4sCisJCSBkYXRlLCAoc2l6ZV90KSBzaXplKTsKKworCWlmIChtb2R1bGVfdHlwZSAhPSA2KSB7CQkvKiBidWlsdCBmb3IgdGhlIHJpZ2h0IGhhcmR3YXJlPyAqLworCQlkZXZfZXJyKGRldiwgImJhZCBmdyAlczogdW5leHBlY3RlZCBtb2R1bGUgdHlwZSAweCV4OyAiCisJCQkiYWJvcnRpbmdcbiIsIGkyNDAwbS0+YnVzX2Z3X25hbWUsIG1vZHVsZV90eXBlKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwkvKiBDaGVjayBzb2Z0LWVyIGVycm9ycyAqLworCXJlc3VsdCA9IDA7CisJaWYgKG1vZHVsZV92ZW5kb3IgIT0gMHg4MDg2KQorCQlkZXZfZXJyKGRldiwgImJhZCBmdyAlcz8gdW5leHBlY3RlZCB2ZW5kb3IgMHglMDR4XG4iLAorCQkJaTI0MDBtLT5idXNfZndfbmFtZSwgbW9kdWxlX3ZlbmRvcik7CisJaWYgKGRhdGUgPCAweDIwMDgwMzAwKQorCQlkZXZfZXJyKGRldiwgImJhZCBmdyAlcz8gYnVpbGQgZGF0ZSB0b28gb2xkICUwOHhcbiIsCisJCQlpMjQwMG0tPmJ1c19md19uYW1lLCBkYXRlKTsKK2Vycm9yOgorCXJldHVybiByZXN1bHQ7Cit9CisKKworLyoKKyAqIERvd25sb2FkIHRoZSBmaXJtd2FyZSB0byB0aGUgZGV2aWNlCisgKgorICogQGkyNDAwbTogZGV2aWNlIGRlc2NyaXB0b3IKKyAqIEBiY2Y6IHBvaW50ZXIgdG8gbG9hZGVkIChhbmQgbWluaW1hbGx5IHZlcmlmaWVkIGZvciBjb25zaXN0ZW5jeSkKKyAqICAgIGZpcm13YXJlCisgKiBAYmNmX3NpemU6IHNpemUgb2YgdGhlIEBiY2YgYnVmZmVyIChoZWFkZXIgcGx1cyBwYXlsb2FkcykKKyAqCisgKiBUaGUgcHJvY2VzcyBmb3IgZG9pbmcgdGhpcyBpcyBkZXNjcmliZWQgaW4gdGhpcyBmaWxlJ3MgaGVhZGVyLgorICoKKyAqIE5vdGUgd2Ugb25seSByZWluaXRpYWxpemUgYm9vdC1tb2RlIGlmIHRoZSBmbGFncyBzYXkgc28uIFNvbWUgaHcKKyAqIGl0ZXJhdGlvbnMgbmVlZCBpdCwgc29tZSBkb24ndC4gSW4gYW55IGNhc2UsIGlmIHdlIGxvb3AsIHdlIGFsd2F5cworICogbmVlZCB0byByZWluaXRpYWxpemUgdGhlIGJvb3Qgcm9vbSwgaGVuY2UgdGhlIGZsYWdzIG1vZGlmaWNhdGlvbi4KKyAqLworc3RhdGljCitpbnQgaTI0MDBtX2Z3X2RubG9hZChzdHJ1Y3QgaTI0MDBtICppMjQwMG0sIGNvbnN0IHN0cnVjdCBpMjQwMG1fYmNmX2hkciAqYmNmLAorCQkgICAgIHNpemVfdCBiY2Zfc2l6ZSwgZW51bSBpMjQwMG1fYnJpIGZsYWdzKQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGkyNDAwbV9kZXYoaTI0MDBtKTsKKwlpbnQgY291bnQgPSBJMjQwME1fQk9PVF9SRVRSSUVTOworCisJZF9mbnN0YXJ0KDUsIGRldiwgIihpMjQwMG0gJXAgYmNmICVwIHNpemUgJXp1KVxuIiwKKwkJICBpMjQwMG0sIGJjZiwgYmNmX3NpemUpOworCWkyNDAwbS0+Ym9vdF9tb2RlID0gMTsKK2h3X3JlYm9vdDoKKwlpZiAoY291bnQtLSA9PSAwKSB7CisJCXJldCA9IC1FUkVTVEFSVFNZUzsKKwkJZGV2X2VycihkZXYsICJkZXZpY2UgcmVib290ZWQgdG9vIG1hbnkgdGltZXMsIGFib3J0aW5nXG4iKTsKKwkJZ290byBlcnJvcl90b29fbWFueV9yZWJvb3RzOworCX0KKwlpZiAoZmxhZ3MgJiBJMjQwME1fQlJJX01BQ19SRUlOSVQpIHsKKwkJcmV0ID0gaTI0MDBtX2Jvb3Ryb21faW5pdChpMjQwMG0sIGZsYWdzKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWRldl9lcnIoZGV2LCAiYm9vdHJvbSBpbml0IGZhaWxlZDogJWRcbiIsIHJldCk7CisJCQlnb3RvIGVycm9yX2Jvb3Ryb21faW5pdDsKKwkJfQorCX0KKwlmbGFncyB8PSBJMjQwME1fQlJJX01BQ19SRUlOSVQ7CisKKwkvKgorCSAqIEluaXRpYWxpemUgdGhlIGRvd25sb2FkLCBwdXNoIHRoZSBieXRlcyB0byB0aGUgZGV2aWNlIGFuZAorCSAqIHRoZW4ganVtcCB0byB0aGUgbmV3IGZpcm13YXJlLiBOb3RlIEByZXQgaXMgcGFzc2VkIHdpdGggdGhlCisJICogb2Zmc2V0IG9mIHRoZSBqdW1wIGluc3RydWN0aW9uIHRvIF9kbmxvYWRfZmluYWxpemUoKQorCSAqLworCXJldCA9IGkyNDAwbV9kbmxvYWRfaW5pdChpMjQwMG0sIGJjZik7CS8qIEluaXQgZGV2aWNlJ3MgZG5sb2FkICovCisJaWYgKHJldCA9PSAtRVJFU1RBUlRTWVMpCisJCWdvdG8gZXJyb3JfZGV2X3JlYm9vdGVkOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycm9yX2RubG9hZF9pbml0OworCisJcmV0ID0gaTI0MDBtX2RubG9hZF9iY2YoaTI0MDBtLCBiY2YsIGJjZl9zaXplKTsKKwlpZiAocmV0ID09IC1FUkVTVEFSVFNZUykKKwkJZ290byBlcnJvcl9kZXZfcmVib290ZWQ7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycihkZXYsICJmdyAlczogZG93bmxvYWQgZmFpbGVkOiAlZFxuIiwKKwkJCWkyNDAwbS0+YnVzX2Z3X25hbWUsIHJldCk7CisJCWdvdG8gZXJyb3JfZG5sb2FkX2JjZjsKKwl9CisKKwlyZXQgPSBpMjQwMG1fZG5sb2FkX2ZpbmFsaXplKGkyNDAwbSwgYmNmLCByZXQpOworCWlmIChyZXQgPT0gLUVSRVNUQVJUU1lTKQorCQlnb3RvIGVycm9yX2Rldl9yZWJvb3RlZDsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGRldiwgImZ3ICVzOiAiCisJCQkiZG93bmxvYWQgZmluYWxpemF0aW9uIGZhaWxlZDogJWRcbiIsCisJCQlpMjQwMG0tPmJ1c19md19uYW1lLCByZXQpOworCQlnb3RvIGVycm9yX2RubG9hZF9maW5hbGl6ZTsKKwl9CisKKwlkX3ByaW50ZigyLCBkZXYsICJmdyAlcyBzdWNjZXNzZnVsbHkgdXBsb2FkZWRcbiIsCisJCSBpMjQwMG0tPmJ1c19md19uYW1lKTsKKwlpMjQwMG0tPmJvb3RfbW9kZSA9IDA7CitlcnJvcl9kbmxvYWRfZmluYWxpemU6CitlcnJvcl9kbmxvYWRfYmNmOgorZXJyb3JfZG5sb2FkX2luaXQ6CitlcnJvcl9ib290cm9tX2luaXQ6CitlcnJvcl90b29fbWFueV9yZWJvb3RzOgorCWRfZm5lbmQoNSwgZGV2LCAiKGkyNDAwbSAlcCBiY2YgJXAgc2l6ZSAlenUpID0gJWRcbiIsCisJCWkyNDAwbSwgYmNmLCBiY2Zfc2l6ZSwgcmV0KTsKKwlyZXR1cm4gcmV0OworCitlcnJvcl9kZXZfcmVib290ZWQ6CisJZGV2X2VycihkZXYsICJkZXZpY2UgcmVib290ZWQsICVkIHRyaWVzIGxlZnRcbiIsIGNvdW50KTsKKwkvKiB3ZSBnb3QgdGhlIG5vdGlmaWNhdGlvbiBhbHJlYWR5LCBubyBuZWVkIHRvIHdhaXQgZm9yIGl0IGFnYWluICovCisJZmxhZ3MgfD0gSTI0MDBNX0JSSV9TT0ZUOworCWdvdG8gaHdfcmVib290OworfQorCisKKy8qKgorICogaTI0MDBtX2Rldl9ib290c3RyYXAgLSBCcmluZyB0aGUgZGV2aWNlIHRvIGEga25vd24gc3RhdGUgYW5kIHVwbG9hZCBmaXJtd2FyZQorICoKKyAqIEBpMjQwMG06IGRldmljZSBkZXNjcmlwdG9yCisgKgorICogUmV0dXJuczogPj0gMCBpZiBvaywgPCAwIGVycm5vIGNvZGUgb24gZXJyb3IuCisgKgorICogVGhpcyBzZXRzIHVwIHRoZSBmaXJtd2FyZSB1cGxvYWQgZW52aXJvbm1lbnQsIGxvYWRzIHRoZSBmaXJtd2FyZQorICogZmlsZSBmcm9tIGRpc2ssIHZlcmlmaWVzIGFuZCB0aGVuIGNhbGxzIHRoZSBmaXJtd2FyZSB1cGxvYWQgcHJvY2VzcworICogcGVyIHNlLgorICoKKyAqIENhbiBiZSBjYWxsZWQgZWl0aGVyIGZyb20gcHJvYmUsIG9yIGFmdGVyIGEgd2FybSByZXNldC4gIENhbiBub3QgYmUKKyAqIGNhbGxlZCBmcm9tIHdpdGhpbiBhbiBpbnRlcnJ1cHQuICBBbGwgdGhlIGZsb3cgaW4gdGhpcyBjb2RlIGlzCisgKiBzaW5nbGUtdGhyZWFkZTsgYWxsIEkvT3MgYXJlIHN5bmNocm9ub3VzLgorICovCitpbnQgaTI0MDBtX2Rldl9ib290c3RyYXAoc3RydWN0IGkyNDAwbSAqaTI0MDBtLCBlbnVtIGkyNDAwbV9icmkgZmxhZ3MpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IGRldmljZSAqZGV2ID0gaTI0MDBtX2RldihpMjQwMG0pOworCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZnc7CisJY29uc3Qgc3RydWN0IGkyNDAwbV9iY2ZfaGRyICpiY2Y7CS8qIEZpcm13YXJlIGRhdGEgKi8KKworCWRfZm5zdGFydCg1LCBkZXYsICIoaTI0MDBtICVwKVxuIiwgaTI0MDBtKTsKKwkvKiBMb2FkIGZpcm13YXJlIGZpbGVzIHRvIG1lbW9yeS4gKi8KKwlyZXQgPSByZXF1ZXN0X2Zpcm13YXJlKCZmdywgaTI0MDBtLT5idXNfZndfbmFtZSwgZGV2KTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZGV2LCAiZncgJXM6IHJlcXVlc3QgZmFpbGVkOiAlZFxuIiwKKwkJCWkyNDAwbS0+YnVzX2Z3X25hbWUsIHJldCk7CisJCWdvdG8gZXJyb3JfZndfcmVxOworCX0KKwliY2YgPSAodm9pZCAqKSBmdy0+ZGF0YTsKKworCXJldCA9IGkyNDAwbV9md19jaGVjayhpMjQwMG0sIGJjZiwgZnctPnNpemUpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycm9yX2Z3X2JhZDsKKwlyZXQgPSBpMjQwMG1fZndfZG5sb2FkKGkyNDAwbSwgYmNmLCBmdy0+c2l6ZSwgZmxhZ3MpOworZXJyb3JfZndfYmFkOgorCXJlbGVhc2VfZmlybXdhcmUoZncpOworZXJyb3JfZndfcmVxOgorCWRfZm5lbmQoNSwgZGV2LCAiKGkyNDAwbSAlcCkgPSAlZFxuIiwgaTI0MDBtLCByZXQpOworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChpMjQwMG1fZGV2X2Jvb3RzdHJhcCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aW1heC9pMjQwMG0vaTI0MDBtLXNkaW8uaCBiL2RyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS9pMjQwMG0tc2Rpby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4YzJmYjcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aW1heC9pMjQwMG0vaTI0MDBtLXNkaW8uaApAQCAtMCwwICsxLDEzMiBAQAorLyoKKyAqIEludGVsIFdpcmVsZXNzIFdpTUFYIENvbm5lY3Rpb24gMjQwMG0KKyAqIFNESU8tc3BlY2lmaWMgaTI0MDBtIGRyaXZlciBkZWZpbml0aW9ucworICoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICAgZGlzdHJpYnV0aW9uLgorICogICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKgorICogSW50ZWwgQ29ycG9yYXRpb24gPGxpbnV4LXdpbWF4QGludGVsLmNvbT4KKyAqIEJyaWFuIEJpYW4gPGJyaWFuLmJpYW5AaW50ZWwuY29tPgorICogRGlyayBCcmFuZGV3aWUgPGRpcmsuai5icmFuZGV3aWVAaW50ZWwuY29tPgorICogSW5ha3kgUGVyZXotR29uemFsZXogPGluYWt5LnBlcmV6LWdvbnphbGV6QGludGVsLmNvbT4KKyAqIFlhbmlyIEx1YmV0a2luIDx5YW5pcngubHViZXRraW5AaW50ZWwuY29tPgorICogIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICoKKyAqCisgKiBUaGlzIGRyaXZlciBpbXBsZW1lbnRzIHRoZSBidXMtc3BlY2lmaWMgcGFydCBvZiB0aGUgaTI0MDBtIGZvcgorICogU0RJTy4gQ2hlY2sgaTI0MDBtLmggZm9yIGEgZ2VuZXJpYyBkcml2ZXIgZGVzY3JpcHRpb24uCisgKgorICogQVJDSElURUNUVVJFCisgKgorICogVGhpcyBkcml2ZXIgc2l0cyB1bmRlciB0aGUgYnVzLWdlbmVyaWMgaTI0MDBtIGRyaXZlciwgcHJvdmlkaW5nIHRoZQorICogY29ubmVjdGlvbiB0byB0aGUgZGV2aWNlLgorICoKKyAqIFdoZW4gcHJvYmVkLCBhbGwgdGhlIGZ1bmN0aW9uIHBvaW50ZXJzIGFyZSBzZXR1cCBhbmQgdGhlbiB0aGUKKyAqIGJ1cy1nZW5lcmljIGNvZGUgY2FsbGVkLiBUaGUgZ2VuZXJpYyBkcml2ZXIgd2lsbCB0aGVuIHVzZSB0aGUKKyAqIHByb3ZpZGVkIHBvaW50ZXJzIGZvciB1cGxvYWRpbmcgZmlybXdhcmUgKGkyNDAwbXNfYnVzX2JtKigpIGluCisgKiBzZGlvLWZ3LmMpIGFuZCB0aGVuIHNldHRpbmcgdXAgdGhlIGRldmljZSAoaTI0MDBtc19kZXZfKigpIGluCisgKiBzZGlvLmMpLgorICoKKyAqIE9uY2UgZmlybXdhcmUgaXMgdXBsb2FkZWQsIFRYIGZ1bmN0aW9ucyAoc2Rpby10eC5jKSBhcmUgY2FsbGVkIHdoZW4KKyAqIGRhdGEgaXMgcmVhZHkgZm9yIHRyYW5zbWlzc2lvbiBpbiB0aGUgVFggZmlmbzsgdGhlbiB0aGUgU0RJTyBJUlEgaXMKKyAqIGZpcmVkIGFuZCBkYXRhIGlzIGF2YWlsYWJsZSAoc2Rpby1yeC5jKSwgaXQgaXMgc2VudCB0byB0aGUgZ2VuZXJpYworICogZHJpdmVyIGZvciBwcm9jZXNzaW5nIHdpdGggaTI0MDBtX3J4LgorICovCisKKyNpZm5kZWYgX19JMjQwME1fU0RJT19IX18KKyNkZWZpbmUgX19JMjQwME1fU0RJT19IX18KKworI2luY2x1ZGUgImkyNDAwbS5oIgorCisvKiBIb3N0LURldmljZSBpbnRlcmZhY2UgZm9yIFNESU8gKi8KK2VudW0geworCUkyNDAwTVNfQkxLX1NJWkUgPSAyNTYsCisJSTI0MDBNU19QTF9TSVpFX01BWCA9IDB4M0UwMCwKKworCUkyNDAwTVNfREFUQV9BRERSID0gMHgwLAorCUkyNDAwTVNfSU5UUl9TVEFUVVNfQUREUiA9IDB4MTMsCisJSTI0MDBNU19JTlRSX0NMRUFSX0FERFIgPSAweDEzLAorCUkyNDAwTVNfSU5UUl9FTkFCTEVfQUREUiA9IDB4MTQsCisJSTI0MDBNU19JTlRSX0dFVF9TSVpFX0FERFIgPSAweDJDLAorCS8qIFRoZSBudW1iZXIgb2YgdGlja3MgdG8gd2FpdCBmb3IgdGhlIGRldmljZSB0byBzaWduYWwgdGhhdAorCSAqIGl0IGlzIHJlYWR5ICovCisJSTI0MDBNU19JTklUX1NMRUVQX0lOVEVSVkFMID0gMTAsCit9OworCisKKy8qKgorICogc3RydWN0IGkyNDAwbXMgLSBkZXNjcmlwdG9yIGZvciBhIFNESU8gY29ubmVjdGVkIGkyNDAwbQorICoKKyAqIEBpMjQwMG06IGJ1cy1nZW5lcmljIGkyNDAwbSBpbXBsZW1lbnRhdGlvbjsgaGFzIHRvIGJlIGZpcnN0IChzZWUKKyAqICAgICBpdCdzIGRvY3VtZW50YXRpb24gaW4gaTI0MDBtLmgpLgorICoKKyAqIEBmdW5jOiBwb2ludGVyIHRvIG91ciBTRElPIGZ1bmN0aW9uCisgKgorICogQHR4X3dvcmtlcjogd29ya3F1ZXVlIHN0cnVjdCB1c2VkIHRvIFRYIGRhdGEgd2hlbiB0aGUgYnVzLWdlbmVyaWMKKyAqICAgICBjb2RlIHNpZ25hbHMgcGFja2V0cyBhcmUgcGVuZGluZyBmb3IgdHJhbnNtaXNzaW9uIHRvIHRoZSBkZXZpY2UuCisgKgorICogQHR4X3dvcmtxdWV1ZTogd29ya3FldWV1ZSB1c2VkIGZvciBkYXRhIFRYOyB3ZSBkb24ndCB1c2UgdGhlCisgKiAgICAgc3lzdGVtJ3Mgd29ya3F1ZXVlIGFzIHRoYXQgbWlnaHQgY2F1c2UgZGVhZGxvY2tzIHdpdGggY29kZSBpbgorICogICAgIHRoZSBidXMtZ2VuZXJpYyBkcml2ZXIuCisgKi8KK3N0cnVjdCBpMjQwMG1zIHsKKwlzdHJ1Y3QgaTI0MDBtIGkyNDAwbTsJCS8qIEZJUlNUISBTZWUgZG9jICovCisJc3RydWN0IHNkaW9fZnVuYyAqZnVuYzsKKworCXN0cnVjdCB3b3JrX3N0cnVjdCB0eF93b3JrZXI7CisJc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKnR4X3dvcmtxdWV1ZTsKKwljaGFyIHR4X3dxX25hbWVbMzJdOworCisJc3RydWN0IGRlbnRyeSAqZGVidWdmc19kZW50cnk7Cit9OworCisKK3N0YXRpYyBpbmxpbmUKK3ZvaWQgaTI0MDBtc19pbml0KHN0cnVjdCBpMjQwMG1zICppMjQwMG1zKQoreworCWkyNDAwbV9pbml0KCZpMjQwMG1zLT5pMjQwMG0pOworfQorCisKK2V4dGVybiBpbnQgaTI0MDBtc19yeF9zZXR1cChzdHJ1Y3QgaTI0MDBtcyAqKTsKK2V4dGVybiB2b2lkIGkyNDAwbXNfcnhfcmVsZWFzZShzdHJ1Y3QgaTI0MDBtcyAqKTsKK2V4dGVybiBzc2l6ZV90IF9faTI0MDBtc19yeF9nZXRfc2l6ZShzdHJ1Y3QgaTI0MDBtcyAqKTsKKworZXh0ZXJuIGludCBpMjQwMG1zX3R4X3NldHVwKHN0cnVjdCBpMjQwMG1zICopOworZXh0ZXJuIHZvaWQgaTI0MDBtc190eF9yZWxlYXNlKHN0cnVjdCBpMjQwMG1zICopOworZXh0ZXJuIHZvaWQgaTI0MDBtc19idXNfdHhfa2ljayhzdHJ1Y3QgaTI0MDBtICopOworCitleHRlcm4gc3NpemVfdCBpMjQwMG1zX2J1c19ibV9jbWRfc2VuZChzdHJ1Y3QgaTI0MDBtICosCisJCQkJICAgICAgIGNvbnN0IHN0cnVjdCBpMjQwMG1fYm9vdHJvbV9oZWFkZXIgKiwKKwkJCQkgICAgICAgc2l6ZV90LCBpbnQpOworZXh0ZXJuIHNzaXplX3QgaTI0MDBtc19idXNfYm1fd2FpdF9mb3JfYWNrKHN0cnVjdCBpMjQwMG0gKiwKKwkJCQkJICAgc3RydWN0IGkyNDAwbV9ib290cm9tX2hlYWRlciAqLAorCQkJCQkgICBzaXplX3QpOworI2VuZGlmIC8qICNpZm5kZWYgX19JMjQwME1fU0RJT19IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS9pMjQwMG0tdXNiLmggYi9kcml2ZXJzL25ldC93aW1heC9pMjQwMG0vaTI0MDBtLXVzYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmNzY1NTgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aW1heC9pMjQwMG0vaTI0MDBtLXVzYi5oCkBAIC0wLDAgKzEsMjY0IEBACisvKgorICogSW50ZWwgV2lyZWxlc3MgV2lNQVggQ29ubmVjdGlvbiAyNDAwbQorICogVVNCLXNwZWNpZmljIGkyNDAwbSBkcml2ZXIgZGVmaW5pdGlvbnMKKyAqCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgIGRpc3RyaWJ1dGlvbi4KKyAqICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICoKKyAqIEludGVsIENvcnBvcmF0aW9uIDxsaW51eC13aW1heEBpbnRlbC5jb20+CisgKiBJbmFreSBQZXJlei1Hb256YWxleiA8aW5ha3kucGVyZXotZ29uemFsZXpAaW50ZWwuY29tPgorICogWWFuaXIgTHViZXRraW4gPHlhbmlyeC5sdWJldGtpbkBpbnRlbC5jb20+CisgKiAgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uCisgKgorICoKKyAqIFRoaXMgZHJpdmVyIGltcGxlbWVudHMgdGhlIGJ1cy1zcGVjaWZpYyBwYXJ0IG9mIHRoZSBpMjQwMG0gZm9yCisgKiBVU0IuIENoZWNrIGkyNDAwbS5oIGZvciBhIGdlbmVyaWMgZHJpdmVyIGRlc2NyaXB0aW9uLgorICoKKyAqIEFSQ0hJVEVDVFVSRQorICoKKyAqIFRoaXMgZHJpdmVyIGxpc3RlbnMgdG8gbm90aWZpY2F0aW9ucyBzZW50IGZyb20gdGhlIG5vdGlmaWNhdGlvbgorICogZW5kcG9pbnQgKGluIHVzYi1ub3RpZi5jKTsgd2hlbiBkYXRhIGlzIHJlYWR5IHRvIHJlYWQsIHRoZSBjb2RlIGluCisgKiB0aGVyZSBzY2hlZHVsZXMgYSByZWFkIGZyb20gdGhlIGRldmljZSAodXNiLXJ4LmMpIGFuZCB0aGVuIHBhc3NlcworICogdGhlIGRhdGEgdG8gdGhlIGdlbmVyaWMgUlggY29kZSAocnguYykuCisgKgorICogV2hlbiB0aGUgZ2VuZXJpYyBkcml2ZXIgbmVlZHMgdG8gc2VuZCBkYXRhIChuZXR3b3JrIG9yIGNvbnRyb2wpLCBpdAorICogcXVldWVzIHVwIGluIHRoZSBUWCBGSUZPICh0eC5jKSBhbmQgdGhhdCB3aWxsIG5vdGlmeSB0aGUgZHJpdmVyCisgKiB0aHJvdWdoIHRoZSBpMjQwMG0tPmJ1c190eF9raWNrKCkgY2FsbGJhY2sKKyAqICh1c2ItdHguYzppMjQwMG11X2J1c190eF9raWNrKSB3aGljaCB3aWxsIHNlbmQgdGhlIGl0ZW1zIGluIHRoZQorICogRklGTyBxdWV1ZS4KKyAqCisgKiBUaGlzIGRyaXZlciwgYXMgd2VsbCwgaW1wbGVtZW50cyB0aGUgVVNCLXNwZWNpZmljIG9wcyBmb3IgdGhlIGdlbmVyaWMKKyAqIGRyaXZlciB0byBiZSBhYmxlIHRvIHNldHVwL3RlYXJkb3duIGNvbW11bmljYXRpb24gd2l0aCB0aGUgZGV2aWNlCisgKiBbaTI0MDBtX2J1c19kZXZfc3RhcnQoKSBhbmQgaTI0MDBtX2J1c19kZXZfc3RvcCgpXSwgcmVzZXRpbmcgdGhlCisgKiBkZXZpY2UgW2kyNDAwbV9idXNfcmVzZXQoKV0gYW5kIHBlcmZvcm1pbmcgZmlybXdhcmUgdXBsb2FkCisgKiBbaTI0MDBtX2J1c19ibV9jbWQoKSBhbmQgaTI0MDBfYnVzX2JtX3dhaXRfZm9yX2FjaygpXS4KKyAqLworCisjaWZuZGVmIF9fSTI0MDBNX1VTQl9IX18KKyNkZWZpbmUgX19JMjQwME1fVVNCX0hfXworCisjaW5jbHVkZSAiaTI0MDBtLmgiCisjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgorCisKKy8qCisgKiBFcnJvciBEZW5zaXR5IENvdW50OiBjaGVhcG8gZXJyb3IgZGVuc2l0eSAob3ZlciB0aW1lKSBjb3VudGVyCisgKgorICogT3JpZ2luYWxseSBieSBSZWluZXR0ZSBDaGF0cmUgPHJlaW5ldHRlLmNoYXRyZUBpbnRlbC5jb20+CisgKgorICogRW1iZWQgYW4gJ3N0cnVjdCBlZGMnIHNvbWV3aGVyZS4gRWFjaCB0aW1lIHRoZXJlIGlzIGEgc29mdCBvcgorICogcmV0cnlhYmxlIGVycm9yLCBjYWxsIGVkY19pbmMoKSBhbmQgY2hlY2sgaWYgdGhlIGVycm9yIHRvcAorICogd2F0ZXJtYXJrIGhhcyBiZWVuIHJlYWNoZWQuCisgKi8KK2VudW0geworCUVEQ19NQVhfRVJST1JTID0gMTAsCisJRURDX0VSUk9SX1RJTUVGUkFNRSA9IEhaLAorfTsKKworLyogZXJyb3IgZGVuc2l0eSBjb3VudGVyICovCitzdHJ1Y3QgZWRjIHsKKwl1bnNpZ25lZCBsb25nIHRpbWVzdGFydDsKKwl1MTYgZXJyb3Jjb3VudDsKK307CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBlZGNfaW5pdChzdHJ1Y3QgZWRjICplZGMpCit7CisJZWRjLT50aW1lc3RhcnQgPSBqaWZmaWVzOworfQorCisvKioKKyAqIGVkY19pbmMgLSByZXBvcnQgYSBzb2Z0IGVycm9yIGFuZCBjaGVjayBpZiB3ZSBhcmUgb3ZlciB0aGUgd2F0ZXJtYXJrCisgKgorICogQGVkYzogcG9pbnRlciB0byBlcnJvciBkZW5zaXR5IGNvdW50ZXIuCisgKiBAbWF4X2VycjogbWF4aW11bSBudW1iZXIgb2YgZXJyb3JzIHdlIGNhbiBhY2NlcHQgb3ZlciB0aGUgdGltZWZyYW1lCisgKiBAdGltZWZyYW1lOiBsZW5naHQgb2YgdGhlIHRpbWVmcmFtZSAoaW4gamlmZmllcykuCisgKgorICogUmV0dXJuczogITAgMSBpZiBtYXhpbXVtIGFjY2VwdGFibGUgZXJyb3JzIHBlciB0aW1lZnJhbWUgaGFzIGJlZW4KKyAqICAgICBleGNlZWRlZC4gMCBvdGhlcndpc2UuCisgKgorICogVGhpcyBpcyB3YXkgdG8gZGV0ZXJtaW5lIGlmIHRoZSBudW1iZXIgb2YgYWNjZXB0YWJsZSBlcnJvcnMgcGVyIHRpbWUKKyAqIHBlcmlvZCBoYXMgYmVlbiBleGNlZWRlZC4gSXQgaXMgbm90IGFjY3VyYXRlIGFzIHRoZXJlIGFyZSBjYXNlcyBpbiB3aGljaAorICogdGhpcyBzY2hlbWUgd2lsbCBub3Qgd29yaywgZm9yIGV4YW1wbGUgaWYgdGhlcmUgYXJlIHBlcmlvZGljIG9jY3VyZW5jZXMKKyAqIG9mIGVycm9ycyB0aGF0IHN0cmFkZGxlIHVwZGF0ZXMgdG8gdGhlIHN0YXJ0IHRpbWUuIFRoaXMgc2NoZW1lIGlzCisgKiBzdWZmaWNpZW50IGZvciBvdXIgdXNhZ2UuCisgKgorICogVG8gdXNlLCBlbWJlZCBhICdzdHJ1Y3QgZWRjJyBzb21ld2hlcmUsIGluaXRpYWxpemUgaXQgd2l0aAorICogZWRjX2luaXQoKSBhbmQgd2hlbiBhbiBlcnJvciBoaXRzOgorICoKKyAqIGlmIChkb19zb21ldGhpbmdfZmFpbHNfd2l0aF9hX3NvZnRfZXJyb3IpIHsKKyAqICAgICAgICBpZiAoZWRjX2luYygmbXktPmVkYywgTUFYX0VSUk9SUywgTUFYX1RJTUVGUkFNRSkpCisgKiAJICAgICAgICAgICBPcHMsIGhhcmQgZXJyb3IsIGRvIHNvbWV0aGluZyBhYm91dCBpdAorICogICAgICAgIGVsc2UKKyAqICAgICAgICAgICAgICAgICBSZXRyeSBvciBpZ25vcmUsIGRlcGVuZGluZyBvbiB3aGF0ZXZlcgorICogfQorICovCitzdGF0aWMgaW5saW5lIGludCBlZGNfaW5jKHN0cnVjdCBlZGMgKmVkYywgdTE2IG1heF9lcnIsIHUxNiB0aW1lZnJhbWUpCit7CisJdW5zaWduZWQgbG9uZyBub3c7CisKKwlub3cgPSBqaWZmaWVzOworCWlmIChub3cgLSBlZGMtPnRpbWVzdGFydCA+IHRpbWVmcmFtZSkgeworCQllZGMtPmVycm9yY291bnQgPSAxOworCQllZGMtPnRpbWVzdGFydCA9IG5vdzsKKwl9IGVsc2UgaWYgKCsrZWRjLT5lcnJvcmNvdW50ID4gbWF4X2VycikgeworCQllZGMtPmVycm9yY291bnQgPSAwOworCQllZGMtPnRpbWVzdGFydCA9IG5vdzsKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCisvKiBIb3N0LURldmljZSBpbnRlcmZhY2UgZm9yIFVTQiAqLworZW51bSB7CisJSTI0MDBNVV9NQVhfTk9USUZJQ0FUSU9OX0xFTiA9IDI1NiwKKwlJMjQwME1VX0JMS19TSVpFID0gMTYsCisJSTI0MDBNVV9QTF9TSVpFX01BWCA9IDB4M0VGRiwKKworCS8qIEVuZHBvaW50cyAqLworCUkyNDAwTVVfRVBfQlVMS19PVVQgPSAwLAorCUkyNDAwTVVfRVBfTk9USUZJQ0FUSU9OLAorCUkyNDAwTVVfRVBfUkVTRVRfQ09MRCwKKwlJMjQwME1VX0VQX0JVTEtfSU4sCit9OworCisKKy8qKgorICogc3RydWN0IGkyNDAwbXUgLSBkZXNjcmlwdG9yIGZvciBhIFVTQiBjb25uZWN0ZWQgaTI0MDBtCisgKgorICogQGkyNDAwbTogYnVzLWdlbmVyaWMgaTI0MDBtIGltcGxlbWVudGF0aW9uOyBoYXMgdG8gYmUgZmlyc3QgKHNlZQorICogICAgIGl0J3MgZG9jdW1lbnRhdGlvbiBpbiBpMjQwMG0uaCkuCisgKgorICogQHVzYl9kZXY6IHBvaW50ZXIgdG8gb3VyIFVTQiBkZXZpY2UKKyAqCisgKiBAdXNiX2lmYWNlOiBwb2ludGVyIHRvIG91ciBVU0IgaW50ZXJmYWNlCisgKgorICogQHVyYl9lZGM6IGVycm9yIGRlbnNpdHkgY291bnRlcjsgdXNlZCB0byBrZWVwIGEgZGVuc2l0eS1vbi10aW1lIHRhYgorICogICAgIG9uIGhvdyBtYW55IHNvZnQgKHJldHJ5YWJsZSBvciBpZ25vcmFibGUpIGVycm9ycyB3ZSBnZXQuIElmIHdlCisgKiAgICAgZ28gb3ZlciB0aGUgdGhyZXNob2xkLCB3ZSBjb25zaWRlciB0aGUgYnVzIHRyYW5zcG9ydCBpcyBmYWlsaW5nCisgKiAgICAgdG9vIG11Y2ggYW5kIHJlc2V0LgorICoKKyAqIEBub3RpZl91cmI6IFVSQiBmb3IgcmVjZWl2aW5nIG5vdGlmaWNhdGlvbnMgZnJvbSB0aGUgZGV2aWNlLgorICoKKyAqIEB0eF9rdGhyZWFkOiB0aHJlYWQgd2UgdXNlIGZvciBkYXRhIFRYLiBXZSB1c2UgYSB0aHJlYWQgYmVjYXVzZSBpbgorICogICAgIG9yZGVyIHRvIGRvIGRlZXAgcG93ZXIgc2F2aW5nIGFuZCBwdXQgdGhlIGRldmljZSB0byBzbGVlcCwgd2UKKyAqICAgICBuZWVkIHRvIGNhbGwgdXNiX2F1dG9wbV8qKCkgW2Jsb2NraW5nIGZ1bmN0aW9uc10uCisgKgorICogQHR4X3dxOiB3YWl0cXVldWUgZm9yIHRoZSBUWCBrdGhyZWFkIHRvIHNsZWVwIHdoZW4gdGhlcmUgaXMgbm8gZGF0YQorICogICAgIHRvIGJlIHNlbnQ7IHdoZW4gbW9yZSBkYXRhIGlzIGF2YWlsYWJsZSwgaXQgaXMgd29rZW4gdXAgYnkKKyAqICAgICBpMjQwMG11X2J1c190eF9raWNrKCkuCisgKgorICogQHJ4X2t0aHJlYWQ6IHRocmVhZCB3ZSB1c2UgZm9yIGRhdGEgUlguIFdlIHVzZSBhIHRocmVhZCBiZWNhdXNlIGluCisgKiAgICAgb3JkZXIgdG8gZG8gZGVlcCBwb3dlciBzYXZpbmcgYW5kIHB1dCB0aGUgZGV2aWNlIHRvIHNsZWVwLCB3ZQorICogICAgIG5lZWQgdG8gY2FsbCB1c2JfYXV0b3BtXyooKSBbYmxvY2tpbmcgZnVuY3Rpb25zXS4KKyAqCisgKiBAcnhfd3E6IHdhaXRxdWV1ZSBmb3IgdGhlIFJYIGt0aHJlYWQgdG8gc2xlZXAgd2hlbiB0aGVyZSBpcyBubyBkYXRhCisgKiAgICAgdG8gcmVjZWl2ZS4gV2hlbiBkYXRhIGlzIGF2YWlsYWJsZSwgaXQgaXMgd29rZW4gdXAgYnkKKyAqICAgICB1c2Itbm90aWYuYzppMjQwMG11X25vdGlmaWNhdGlvbl9ncm9rKCkuCisgKgorICogQHJ4X3BlbmRpbmdfY291bnQ6IG51bWJlciBvZiByeC1kYXRhLXJlYWR5IG5vdGlmaWNhdGlvbnMgdGhhdCB3ZXJlCisgKiAgICAgc3RpbGwgbm90IGhhbmRsZWQgYnkgdGhlIFJYIGt0aHJlYWQuCisgKgorICogQHJ4X3NpemU6IGN1cnJlbnQgUlggYnVmZmVyIHNpemUgdGhhdCBpcyBiZWluZyB1c2VkLgorICoKKyAqIEByeF9zaXplX2FjYzogYWNjdW11bGF0b3Igb2YgdGhlIHNpemVzIG9mIHRoZSBwcmV2aW91cyByZWFkCisgKiAgICAgdHJhbnNhY3Rpb25zLgorICoKKyAqIEByeF9zaXplX2NudDogbnVtYmVyIG9mIHJlYWQgdHJhbnNhY3Rpb25zIGFjY3VtdWxhdGVkIGluCisgKiAgICAgQHJ4X3NpemVfYWNjLgorICoKKyAqIEBkb19hdXRvcG06IGRpc2FibGUoMCkvZW5hYmxlKD4wKSBjYWxsaW5nIHRoZQorICogICAgIHVzYl9hdXRvcG1fZ2V0L3B1dF9pbnRlcmZhY2UoKSBiYXJyaWVycyB3aGVuIGV4ZWN1dGluZworICogICAgIGNvbW1hbmRzLiBTZWUgZG9jIGluIGkyNDAwbXVfc3VzcGVuZCgpIGZvciBtb3JlIGluZm9ybWF0aW9uLgorICoKKyAqIEByeF9zaXplX2F1dG9fc2hyaW5rOiBpZiB0cnVlLCB0aGUgcnhfc2l6ZSBpcyBzaHJpbmtlZAorICogICAgIGF1dG9tYXRpY2FsbHkgYmFzZWQgb24gdGhlIGF2ZXJhZ2Ugc2l6ZSBvZiB0aGUgcmVjZWl2ZWQKKyAqICAgICB0cmFuc2FjdGlvbnMuIFRoaXMgYWxsb3dzIHRoZSByZWNlaXZlIGNvZGUgdG8gYWxsb2NhdGUgc21hbGxlcgorICogICAgIGNodW5rcyBvZiBtZW1vcnkgYW5kIHRodXMgcmVkdWNlIHByZXNzdXJlIG9uIHRoZSBtZW1vcnkKKyAqICAgICBhbGxvY2F0b3IgYnkgbm90IHdhc3Rpbmcgc28gbXVjaCBzcGFjZS4gQnkgZGVmYXVsdCBpdCBpcworICogICAgIGVuYWJsZWQuCisgKgorICogQGRlYnVnZnNfZGVudHJ5OiBob29rdXAgZm9yIGRlYnVnZnMgZmlsZXMuCisgKiAgICAgVGhlc2UgaGF2ZSB0byBiZSBpbiBhIHNlcGFyYXRlIGRpcmVjdG9yeSwgYSBjaGlsZCBvZgorICogICAgICh3aW1heF9kZXYtPmRlYnVnZnNfZGVudHJ5KSBzbyB0aGV5IGNhbiBiZSByZW1vdmVkIHdoZW4gdGhlCisgKiAgICAgbW9kdWxlIHVubG9hZHMsIGFzIHdlIGRvbid0IGtlZXAgZWFjaCBkZW50cnkuCisgKi8KK3N0cnVjdCBpMjQwMG11IHsKKwlzdHJ1Y3QgaTI0MDBtIGkyNDAwbTsJCS8qIEZJUlNUISBTZWUgZG9jICovCisKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdXNiX2RldjsKKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqdXNiX2lmYWNlOworCXN0cnVjdCBlZGMgdXJiX2VkYzsJCS8qIEVycm9yIGRlbnNpdHkgY291bnRlciAqLworCisJc3RydWN0IHVyYiAqbm90aWZfdXJiOworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHhfa3RocmVhZDsKKwl3YWl0X3F1ZXVlX2hlYWRfdCB0eF93cTsKKworCXN0cnVjdCB0YXNrX3N0cnVjdCAqcnhfa3RocmVhZDsKKwl3YWl0X3F1ZXVlX2hlYWRfdCByeF93cTsKKwlhdG9taWNfdCByeF9wZW5kaW5nX2NvdW50OworCXNpemVfdCByeF9zaXplLCByeF9zaXplX2FjYywgcnhfc2l6ZV9jbnQ7CisJYXRvbWljX3QgZG9fYXV0b3BtOworCXU4IHJ4X3NpemVfYXV0b19zaHJpbms7CisKKwlzdHJ1Y3QgZGVudHJ5ICpkZWJ1Z2ZzX2RlbnRyeTsKK307CisKKworc3RhdGljIGlubGluZQordm9pZCBpMjQwMG11X2luaXQoc3RydWN0IGkyNDAwbXUgKmkyNDAwbXUpCit7CisJaTI0MDBtX2luaXQoJmkyNDAwbXUtPmkyNDAwbSk7CisJZWRjX2luaXQoJmkyNDAwbXUtPnVyYl9lZGMpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmkyNDAwbXUtPnR4X3dxKTsKKwlhdG9taWNfc2V0KCZpMjQwMG11LT5yeF9wZW5kaW5nX2NvdW50LCAwKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZpMjQwMG11LT5yeF93cSk7CisJaTI0MDBtdS0+cnhfc2l6ZSA9IFBBR0VfU0laRSAtIHNpemVvZihzdHJ1Y3Qgc2tiX3NoYXJlZF9pbmZvKTsKKwlhdG9taWNfc2V0KCZpMjQwMG11LT5kb19hdXRvcG0sIDEpOworCWkyNDAwbXUtPnJ4X3NpemVfYXV0b19zaHJpbmsgPSAxOworfQorCitleHRlcm4gaW50IGkyNDAwbXVfbm90aWZpY2F0aW9uX3NldHVwKHN0cnVjdCBpMjQwMG11ICopOworZXh0ZXJuIHZvaWQgaTI0MDBtdV9ub3RpZmljYXRpb25fcmVsZWFzZShzdHJ1Y3QgaTI0MDBtdSAqKTsKKworZXh0ZXJuIGludCBpMjQwMG11X3J4X3NldHVwKHN0cnVjdCBpMjQwMG11ICopOworZXh0ZXJuIHZvaWQgaTI0MDBtdV9yeF9yZWxlYXNlKHN0cnVjdCBpMjQwMG11ICopOworZXh0ZXJuIHZvaWQgaTI0MDBtdV9yeF9raWNrKHN0cnVjdCBpMjQwMG11ICopOworCitleHRlcm4gaW50IGkyNDAwbXVfdHhfc2V0dXAoc3RydWN0IGkyNDAwbXUgKik7CitleHRlcm4gdm9pZCBpMjQwMG11X3R4X3JlbGVhc2Uoc3RydWN0IGkyNDAwbXUgKik7CitleHRlcm4gdm9pZCBpMjQwMG11X2J1c190eF9raWNrKHN0cnVjdCBpMjQwMG0gKik7CisKK2V4dGVybiBzc2l6ZV90IGkyNDAwbXVfYnVzX2JtX2NtZF9zZW5kKHN0cnVjdCBpMjQwMG0gKiwKKwkJCQkgICAgICAgY29uc3Qgc3RydWN0IGkyNDAwbV9ib290cm9tX2hlYWRlciAqLAorCQkJCSAgICAgICBzaXplX3QsIGludCk7CitleHRlcm4gc3NpemVfdCBpMjQwMG11X2J1c19ibV93YWl0X2Zvcl9hY2soc3RydWN0IGkyNDAwbSAqLAorCQkJCQkgICBzdHJ1Y3QgaTI0MDBtX2Jvb3Ryb21faGVhZGVyICosCisJCQkJCSAgIHNpemVfdCk7CisjZW5kaWYgLyogI2lmbmRlZiBfX0kyNDAwTV9VU0JfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aW1heC9pMjQwMG0vaTI0MDBtLmggYi9kcml2ZXJzL25ldC93aW1heC9pMjQwMG0vaTI0MDBtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDY3Yzg3MQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS9pMjQwMG0uaApAQCAtMCwwICsxLDc1NSBAQAorLyoKKyAqIEludGVsIFdpcmVsZXNzIFdpTUFYIENvbm5lY3Rpb24gMjQwMG0KKyAqIERlY2xhcmF0aW9ucyBmb3IgYnVzLWdlbmVyaWMgaW50ZXJuYWwgQVBJcworICoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICAgZGlzdHJpYnV0aW9uLgorICogICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKgorICogSW50ZWwgQ29ycG9yYXRpb24gPGxpbnV4LXdpbWF4QGludGVsLmNvbT4KKyAqIEluYWt5IFBlcmV6LUdvbnphbGV6IDxpbmFreS5wZXJlei1nb256YWxlekBpbnRlbC5jb20+CisgKiBZYW5pciBMdWJldGtpbiA8eWFuaXJ4Lmx1YmV0a2luQGludGVsLmNvbT4KKyAqICAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqCisgKgorICogR0VORVJBTCBEUklWRVIgQVJDSElURUNUVVJFCisgKgorICogVGhlIGkyNDAwbSBkcml2ZXIgaXMgc3BsaXQgaW4gdGhlIGZvbGxvd2luZyB0d28gbWFqb3IgcGFydHM6CisgKgorICogIC0gYnVzIHNwZWNpZmljIGRyaXZlcgorICogIC0gYnVzIGdlbmVyaWMgZHJpdmVyICh0aGlzIHBhcnQpCisgKgorICogVGhlIGJ1cyBzcGVjaWZpYyBkcml2ZXIgc2V0cyB1cCBzdHVmZiBzcGVjaWZpYyB0byB0aGUgYnVzIHRoZQorICogZGV2aWNlIGlzIGNvbm5lY3RlZCB0byAoVVNCLCBTRElPLCBQQ0ksIHRhbS10YW0uLi5ub24tYXV0aG9yaXRhdGl2ZQorICogbm9yIGJpbmRpbmcgbGlzdCkgd2hpY2ggaXMgYmFzaWNhbGx5IHRoZSBkZXZpY2UtbW9kZWwgbWFuYWdlbWVudAorICogKHByb2JlL2Rpc2Nvbm5lY3QsIGV0YyksIG1vdmluZyBkYXRhIGZyb20gZGV2aWNlIHRvIGtlcm5lbCBhbmQKKyAqIGJhY2ssIGRvaW5nIHRoZSBwb3dlciBzYXZpbmcgZGV0YWlscyBhbmQgcmVzZXRpbmcgdGhlIGRldmljZS4KKyAqCisgKiBGb3IgZGV0YWlscyBvbiBlYWNoIGJ1cy1zcGVjaWZpYyBkcml2ZXIsIHNlZSBpdCdzIGluY2x1ZGUgZmlsZSwKKyAqIGkyNDAwbS1CVVNOQU1FLmgKKyAqCisgKiBUaGUgYnVzLWdlbmVyaWMgZnVuY3Rpb25hbGl0eSBicmVhayB1cCBpczoKKyAqCisgKiAgLSBGaXJtd2FyZSB1cGxvYWQ6IGZ3LmMgLSB0YWtlcyBjYXJlIG9mIHVwbG9hZGluZyBmaXJtd2FyZSB0byB0aGUKKyAqICAgICAgICBkZXZpY2UuIGJ1cy1zcGVjaWZpYyBkcml2ZXIganVzdCBuZWVkcyB0byBwcm92aWRlcyBhIHdheSB0bworICogICAgICAgIGV4ZWN1dGUgYm9vdC1tb2RlIGNvbW1hbmRzIGFuZCB0byByZXNldCB0aGUgZGV2aWNlLgorICoKKyAqICAtIFJYIGhhbmRsaW5nOiByeC5jIC0gcmVjZWl2ZXMgZGF0YSBmcm9tIHRoZSBidXMtc3BlY2lmaWMgY29kZSBhbmQKKyAqICAgICAgICBmZWVkcyBpdCB0byB0aGUgbmV0d29yayBvciBXaU1BWCBzdGFjayBvciB1c2VzIGl0IHRvIG1vZGlmeQorICogICAgICAgIHRoZSBkcml2ZXIgc3RhdGUuIGJ1cy1zcGVjaWZpYyBkcml2ZXIgb25seSBoYXMgdG8gcmVjZWl2ZQorICogICAgICAgIGZyYW1lcyBhbmQgcGFzcyB0aGVtIHRvIHRoaXMgbW9kdWxlLgorICoKKyAqICAtIFRYIGhhbmRsaW5nOiB0eC5jIC0gbWFuYWdlcyB0aGUgVFggRklGTyBxdWV1ZSBhbmQgcHJvdmlkZXMgbWVhbnMKKyAqICAgICAgICBmb3IgdGhlIGJ1cy1zcGVjaWZpYyBUWCBjb2RlIHRvIHB1bGwgZGF0YSBmcm9tIHRoZSBGSUZPCisgKiAgICAgICAgcXVldWUuIGJ1cy1zcGVjaWZpYyBjb2RlIGp1c3QgcHVsbHMgZnJhbWVzIGZyb20gdGhpcyBtb2R1bGUKKyAqICAgICAgICB0byBzZW5kcyB0aGVtIHRvIHRoZSBkZXZpY2UuCisgKgorICogIC0gbmV0ZGV2IGdsdWU6IG5ldGRldi5jIC0gaW50ZXJmYWNlIHdpdGggTGludXggbmV0d29ya2luZworICogICAgICAgIHN0YWNrLiBQYXNzIGFyb3VuZCBkYXRhIGZyYW1lcywgYW5kIGNvbmZpZ3VyZSB3aGVuIHRoZQorICogICAgICAgIGRldmljZSBpcyB1cCBhbmQgcnVubmluZyBvciBzaHV0ZG93biAodGhyb3VnaCBpZmNvbmZpZyB1cCAvCisgKiAgICAgICAgZG93bikuIEJ1cy1nZW5lcmljIG9ubHkuCisgKgorICogIC0gY29udHJvbCBvcHM6IGNvbnRyb2wuYyAtIGltcGxlbWVudHMgdmFyaW91cyBjb21tbWFuZHMgZm9yCisgKiAgICAgICAgY29udHJvbGxpbmcgdGhlIGRldmljZS4gYnVzLWdlbmVyaWMgb25seS4KKyAqCisgKiAgLSBkZXZpY2UgbW9kZWwgZ2x1ZTogZHJpdmVyLmMgLSBpbXBsZW1lbnRzIGhlbHBlcnMgZm9yIHRoZQorICogICAgICAgIGRldmljZS1tb2RlbCBnbHVlIGRvbmUgYnkgdGhlIGJ1cy1zcGVjaWZpYyBsYXllcgorICogICAgICAgIChzZXR1cC9yZWxlYXNlIHRoZSBkcml2ZXIgcmVzb3VyY2VzKSwgdHVybmluZyB0aGUgZGV2aWNlIG9uCisgKiAgICAgICAgYW5kIG9mZiwgaGFuZGxpbmcgdGhlIGRldmljZSByZWJvb3RzL3Jlc2V0cyBhbmQgYSBmZXcgc2ltcGxlCisgKiAgICAgICAgV2lNQVggc3RhY2sgb3BzLgorICoKKyAqIENvZGUgaXMgYWxzbyBicm9rZW4gdXAgaW4gbGludXgtZ2x1ZSAvIGRldmljZS1nbHVlLgorICoKKyAqIExpbnV4IGdsdWUgY29udGFpbnMgZnVuY3Rpb25zIHRoYXQgZGVhbCBtb3N0bHkgd2l0aCBnbHVpbmcgd2l0aCB0aGUKKyAqIHJlc3Qgb2YgdGhlIExpbnV4IGtlcm5lbC4KKyAqCisgKiBEZXZpY2UtZ2x1ZSBhcmUgZnVuY3Rpb25zIHRoYXQgZGVhbCBtb3N0bHkgd2l0aCB0aGUgd2F5IHRoZSBkZXZpY2UKKyAqIGRvZXMgdGhpbmdzIGFuZCB0YWxrIHRoZSBkZXZpY2UncyBsYW5ndWFnZS4KKyAqCisgKiBkZXZpY2UtZ2x1ZSBjb2RlIGlzIGxpY2Vuc2VkIEJTRCBzbyBvdGhlciBvcGVuIHNvdXJjZSBPU2VzIGNhbiB0YWtlCisgKiBpdCB0byBpbXBsZW1lbnQgdGhlaXIgZHJpdmVycy4KKyAqCisgKgorICogQVBJcyBBTkQgSEVBREVSIEZJTEVTCisgKgorICogVGhpcyBidXMgZ2VuZXJpYyBjb2RlIGV4cG9ydHMgdGhyZWUgQVBJczoKKyAqCisgKiAgLSBIREkgKGhvc3QtZGV2aWNlIGludGVyZmFjZSkgZGVmaW5pdGlvbnMgY29tbW9uIHRvIGFsbCBidXNzZXMKKyAqICAgIChpbmNsdWRlL2xpbnV4L3dpbWF4L2kyNDAwbS5oKTsgdGhlc2UgY2FuIGJlIGFsc28gdXNlZCBieSB1c2VyCisgKiAgICBzcGFjZSBjb2RlLgorICogIC0gaW50ZXJuYWwgQVBJIGZvciB0aGUgYnVzLWdlbmVyaWMgY29kZQorICogIC0gZXh0ZXJuYWwgQVBJIGZvciB0aGUgYnVzLXNwZWNpZmljIGRyaXZlcnMKKyAqCisgKgorICogTElGRSBDWUNMRToKKyAqCisgKiBXaGVuIHRoZSBidXMtc3BlY2lmaWMgZHJpdmVyIHByb2JlcywgaXQgYWxsb2NhdGVzIGEgbmV0d29yayBkZXZpY2UKKyAqIHdpdGggZW5vdWdoIHNwYWNlIGZvciBpdCdzIGRhdGEgc3RydWN0dWUsIHRoYXQgbXVzdCBjb250YWluIGEKKyAqICZzdHJ1Y3QgaTI0MDBtIGF0IHRoZSB0b3AuCisgKgorICogT24gcHJvYmUsIGl0IG5lZWRzIHRvIGZpbGwgdGhlIGkyNDAwbSBtZW1iZXJzIG1hcmtlZCBhcyBbZmlsbF0sIGFzCisgKiB3ZWxsIGFzIGkyNDAwbS0+d2ltYXhfZGV2Lm5ldF9kZXYgYW5kIGNhbGwgaTI0MDBtX3NldHVwKCkuIFRoZQorICogaTI0MDBtIGRyaXZlciB3aWxsIG9ubHkgcmVnaXN0ZXIgd2l0aCB0aGUgV2lNQVggYW5kIG5ldHdvcmsgc3RhY2tzOworICogdGhlIG9ubHkgYWNjZXNzIGRvbmUgdG8gdGhlIGRldmljZSBpcyB0byByZWFkIHRoZSBNQUMgYWRkcmVzcyBzbyB3ZQorICogY2FuIHJlZ2lzdGVyIGEgbmV0d29yayBkZXZpY2UuIFRoaXMgY2FsbHMgaTI0MDBtX2Rldl9zdGFydCgpIHRvCisgKiBsb2FkIGZpcm13YXJlLCBzZXR1cCBjb21tdW5pY2F0aW9uIHdpdGggdGhlIGRldmljZSBhbmQgY29uZmlndXJlIGl0CisgKiBmb3Igb3BlcmF0aW9uLgorICoKKyAqIEF0IHRoaXMgcG9pbnQsIGNvbnRyb2wgYW5kIGRhdGEgY29tbXVuaWNhdGlvbnMgYXJlIHBvc3NpYmxlLgorICoKKyAqIE9uIGRpc2Nvbm5lY3QvZHJpdmVyIHVubG9hZCwgdGhlIGJ1cy1zcGVjaWZpYyBkaXNjb25uZWN0IGZ1bmN0aW9uCisgKiBjYWxscyBpMjQwMG1fcmVsZWFzZSgpIHRvIHVuZG8gaTI0MDBtX3NldHVwKCkuIGkyNDAwbV9kZXZfc3RvcCgpCisgKiBzaHV0cyB0aGUgZmlybXdhcmUgZG93biBhbmQgcmVsZWFzZXMgcmVzb3VyY2VzIHVzZXMgdG8gY29tbXVuaWNhdGUKKyAqIHdpdGggdGhlIGRldmljZS4KKyAqCisgKiBXaGlsZSB0aGUgZGV2aWNlIGlzIHVwLCBpdCBtaWdodCByZXNldC4gVGhlIGJ1cy1zcGVjaWZpYyBkcml2ZXIgaGFzCisgKiB0byBjYXRjaCB0aGF0IHNpdHVhdGlvbiBhbmQgY2FsbCBpMjQwMG1fZGV2X3Jlc2V0X2hhbmRsZSgpIHRvIGRlYWwKKyAqIHdpdGggaXQgKHJlc2V0IHRoZSBpbnRlcm5hbCBkcml2ZXIgc3RydWN0dXJlcyBhbmQgZ28gYmFjayB0byBzcXVhcmUKKyAqIG9uZSkuCisgKi8KKworI2lmbmRlZiBfX0kyNDAwTV9IX18KKyNkZWZpbmUgX19JMjQwME1fSF9fCisKKyNpbmNsdWRlIDxsaW51eC91c2IuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CisjaW5jbHVkZSA8bGludXgvcndzZW0uaD4KKyNpbmNsdWRlIDxhc20vYXRvbWljLmg+CisjaW5jbHVkZSA8bmV0L3dpbWF4Lmg+CisjaW5jbHVkZSA8bGludXgvd2ltYXgvaTI0MDBtLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorCisvKiBNaXNjIGNvbnN0YW50cyAqLworZW51bSB7CisJLyogRmlybXdhcmUgdXBsb2FkaW5nICovCisJSTI0MDBNX0JPT1RfUkVUUklFUyA9IDMsCisJLyogU2l6ZSBvZiB0aGUgQm9vdCBNb2RlIENvbW1hbmQgYnVmZmVyICovCisJSTI0MDBNX0JNX0NNRF9CVUZfU0laRSA9IDE2ICogMTAyNCwKKwlJMjQwME1fQk1fQUNLX0JVRl9TSVpFID0gMjU2LAorfTsKKworCisvKiBGaXJtd2FyZSB2ZXJzaW9uIHdlIHJlcXVlc3Qgd2hlbiBwdWxsaW5nIHRoZSBmdyBpbWFnZSBmaWxlICovCisjZGVmaW5lIEkyNDAwTV9GV19WRVJTSU9OICIxLjMiCisKKworLyoqCisgKiBpMjQwMG1fcmVzZXRfdHlwZSAtIG1ldGhvZHMgdG8gcmVzZXQgYSBkZXZpY2UKKyAqCisgKiBASTI0MDBNX1JUX1dBUk06IFJlc2V0IHdpdGhvdXQgZGV2aWNlIGRpc2Nvbm5lY3Rpb24sIGRldmljZSBoYW5kbGVzCisgKiAgICAgYXJlIGtlcHQgdmFsaWQgYnV0IHN0YXRlIGlzIGJhY2sgdG8gcG93ZXIgb24sIHdpdGggZmlybXdhcmUKKyAqICAgICByZS11cGxvYWRlZC4KKyAqIEBJMjQwME1fUlRfQ09MRDogVGVsbCB0aGUgZGV2aWNlIHRvIGRpc2Nvbm5lY3QgaXRzZWxmIGZyb20gdGhlIGJ1cworICogICAgIGFuZCByZWNvbm5lY3QuIFJlbmRlcnMgYWxsIGRldmljZSBoYW5kbGVzIGludmFsaWQuCisgKiBASTI0MDBNX1JUX0JVUzogVGVsbHMgdGhlIGJ1cyB0byByZXNldCB0aGUgZGV2aWNlOyBsYXN0IG1lYXN1cmUKKyAqICAgICB1c2VkIHdoZW4gYm90aCB0eXBlcyBhYm92ZSBkb24ndCB3b3JrLgorICovCitlbnVtIGkyNDAwbV9yZXNldF90eXBlIHsKKwlJMjQwME1fUlRfV0FSTSwJLyogZmlyc3QgbWVhc3VyZSAqLworCUkyNDAwTV9SVF9DT0xELAkvKiBzZWNvbmQgbWVhc3VyZSAqLworCUkyNDAwTV9SVF9CVVMsCS8qIGNhbGwgaW4gYXJ0aWxsZXJ5ICovCit9OworCitzdHJ1Y3QgaTI0MDBtX3Jlc2V0X2N0eDsKKworLyoqCisgKiBzdHJ1Y3QgaTI0MDBtIC0gZGVzY3JpcHRvciBmb3IgYW4gSW50ZWwgMjQwMG0KKyAqCisgKiBNZW1iZXJzIG1hcmtlZCB3aXRoIFtmaWxsXSBtdXN0IGJlIGZpbGxlZCBvdXQvaW5pdGlhbGl6ZWQgYmVmb3JlCisgKiBjYWxsaW5nIGkyNDAwbV9zZXR1cCgpLgorICoKKyAqIEBidXNfdHhfYmxvY2tfc2l6ZTogW2ZpbGxdIFNESU8gaW1wb3NlcyBhIDI1NiBibG9jayBzaXplLCBVU0IgMTYsCisgKiAgICAgc28gd2UgaGF2ZSBhIHR4X2Jsa19zaXplIHZhcmlhYmxlIHRoYXQgdGhlIGJ1cyBsYXllciBzZXRzIHRvCisgKiAgICAgdGVsbCB0aGUgZW5naW5lIGhvdyBtdWNoIG9mIHRoYXQgd2UgbmVlZC4KKyAqCisgKiBAYnVzX3BsX3NpemVfbWF4OiBbZmlsbF0gTWF4aW11bSBwYXlsb2FkIHNpemUuCisgKgorICogQGJ1c19kZXZfc3RhcnQ6IFtmaWxsXSBGdW5jdGlvbiBjYWxsZWQgYnkgdGhlIGJ1cy1nZW5lcmljIGNvZGUKKyAqICAgICBbaTI0MDBtX2Rldl9zdGFydCgpXSB0byBzZXR1cCB0aGUgYnVzLXNwZWNpZmljIGNvbW11bmljYXRpb25zCisgKiAgICAgdG8gdGhlIHRoZSBkZXZpY2UuIFNlZSBMSUZFIENZQ0xFIGFib3ZlLgorICoKKyAqICAgICBOT1RFOiBEb2Vzbid0IG5lZWQgdG8gdXBsb2FkIHRoZSBmaXJtd2FyZSwgYXMgdGhhdCBpcyB0YWtlbgorICogICAgIGNhcmUgb2YgYnkgdGhlIGJ1cy1nZW5lcmljIGNvZGUuCisgKgorICogQGJ1c19kZXZfc3RvcDogW2ZpbGxdIEZ1bmN0aW9uIGNhbGxlZCBieSB0aGUgYnVzLWdlbmVyaWMgY29kZQorICogICAgIFtpMjQwMG1fZGV2X3N0b3AoKV0gdG8gc2h1dGRvd24gdGhlIGJ1cy1zcGVjaWZpYyBjb21tdW5pY2F0aW9ucworICogICAgIHRvIHRoZSB0aGUgZGV2aWNlLiBTZWUgTElGRSBDWUNMRSBhYm92ZS4KKyAqCisgKiAgICAgVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBuZWVkIHRvIHJlc2V0IHRoZSBkZXZpY2UsIGp1c3QgdGVhciBkb3duCisgKiAgICAgYWxsIHRoZSBob3N0IHJlc291cmNlcyBjcmVhdGVkIHRvICBoYW5kbGUgY29tbXVuaWNhdGlvbiB3aXRoCisgKiAgICAgdGhlIGRldmljZS4KKyAqCisgKiBAYnVzX3R4X2tpY2s6IFtmaWxsXSBGdW5jdGlvbiBjYWxsZWQgYnkgdGhlIGJ1cy1nZW5lcmljIGNvZGUgdG8gbGV0CisgKiAgICAgdGhlIGJ1cy1zcGVjaWZpYyBjb2RlIGtub3cgdGhhdCB0aGVyZSBpcyBkYXRhIGF2YWlsYWJsZSBpbiB0aGUKKyAqICAgICBUWCBGSUZPIGZvciB0cmFuc21pc3Npb24gdG8gdGhlIGRldmljZS4KKyAqCisgKiAgICAgVGhpcyBmdW5jdGlvbiBjYW5ub3Qgc2xlZXAuCisgKgorICogQGJ1c19yZXNldDogW2ZpbGxdIEZ1bmN0aW9uIGNhbGxlZCBieSB0aGUgYnVzLWdlbmVyaWMgY29kZSB0byByZXNldAorICogICAgIHRoZSBkZXZpY2UgaW4gaW4gdmFyaW91cyB3YXlzLiBEb2Vzbid0IG5lZWQgdG8gd2FpdCBmb3IgdGhlCisgKiAgICAgcmVzZXQgdG8gZmluaXNoLgorICoKKyAqICAgICBJZiB3YXJtIG9yIGNvbGQgcmVzZXQgZmFpbCwgdGhpcyBmdW5jdGlvbiBpcyBleHBlY3RlZCB0byBkbyBhCisgKiAgICAgYnVzLXNwZWNpZmljIHJlc2V0IChlZzogVVNCIHJlc2V0KSB0byBnZXQgdGhlIGRldmljZSB0byBhCisgKiAgICAgd29ya2luZyBzdGF0ZSAoZXZlbiBpZiBpdCBpbXBsaWVzIGRldmljZSBkaXNjb25lY2N0aW9uKS4KKyAqCisgKiAgICAgTm90ZSB0aGUgd2FybSByZXNldCBpcyB1c2VkIGJ5IHRoZSBmaXJtd2FyZSB1cGxvYWRlciB0bworICogICAgIHJlaW5pdGlhbGl6ZSB0aGUgZGV2aWNlLgorICoKKyAqICAgICBJTVBPUlRBTlQ6IHRoaXMgaXMgY2FsbGVkIHZlcnkgZWFybHkgaW4gdGhlIGRldmljZSBzZXR1cAorICogICAgIHByb2Nlc3MsIHNvIGl0IGNhbm5vdCByZWx5IG9uIGNvbW1vbiBpbmZyYXN0cnVjdHVyZSBiZWluZyBsYWlkCisgKiAgICAgb3V0LgorICoKKyAqIEBidXNfYm1fY21kX3NlbmQ6IFtmaWxsXSBGdW5jdGlvbiBjYWxsZWQgdG8gc2VuZCBhIGJvb3QtbW9kZQorICogICAgIGNvbW1hbmQuIEZsYWdzIGFyZSBkZWZpbmVkIGluICdlbnVtIGkyNDAwbV9ibV9jbWRfZmxhZ3MnLiBUaGlzCisgKiAgICAgaXMgc3luY2hyb25vdXMgYW5kIGhhcyB0byByZXR1cm4gMCBpZiBvayBvciA8IDAgZXJybm8gY29kZSBpbgorICogICAgIGFueSBlcnJvciBjb25kaXRpb24uCisgKgorICogQGJ1c19ibV93YWl0X2Zvcl9hY2s6IFtmaWxsXSBGdW5jdGlvbiBjYWxsZWQgdG8gd2FpdCBmb3IgYQorICogICAgIGJvb3QtbW9kZSBub3RpZmljYXRpb24gKHRoYXQgY2FuIGJlIGEgcmVzcG9uc2UgdG8gYSBwcmV2aW91c2x5CisgKiAgICAgaXNzdWVkIGNvbW1hbmQgb3IgYW4gYXN5bmNocm9ub3VzIG9uZSkuIFdpbGwgcmVhZCB1bnRpbCBhbGwgdGhlCisgKiAgICAgaW5kaWNhdGVkIHNpemUgaXMgcmVhZCBvciB0aW1lb3V0LiBSZWFkaW5nIG1vcmUgb3IgbGVzcyBkYXRhCisgKiAgICAgdGhhbiBhc2tlZCBmb3IgaXMgYW4gZXJyb3IgY29uZGl0aW9uLiBSZXR1cm4gMCBpZiBvaywgPCAwIGVycm5vCisgKiAgICAgY29kZSBvbiBlcnJvci4KKyAqCisgKiAgICAgVGhlIGNhbGxlciB0byB0aGlzIGZ1bmN0aW9uIHdpbGwgY2hlY2sgaWYgdGhlIHJlc3BvbnNlIGlzIGEKKyAqICAgICBiYXJrZXIgdGhhdCBpbmRpY2F0ZXMgdGhlIGRldmljZSBnb2luZyBpbnRvIHJlc2V0IG1vZGUuCisgKgorICogQGJ1c19md19uYW1lOiBbZmlsbF0gbmFtZSBvZiB0aGUgZmlybXdhcmUgaW1hZ2UgKGluIG1vc3QgY2FzZXMsCisgKiAgICAgdGhleSBhcmUgYWxsIHRoZSBzYW1lIGZvciBhIHNpbmdsZSByZWxlYXNlLCBleGNlcHQgdGhhdCB0aGV5CisgKiAgICAgaGF2ZSB0aGUgdHlwZSBvZiB0aGUgYnVzIGVtYmVkZGVkIGluIHRoZSBuYW1lIChlZzoKKyAqICAgICBpMjQwMG0tZnctWC1WRVJTSU9OLnNiY2YsIHdoZXJlIFggaXMgdGhlIGJ1cyBuYW1lKS4KKyAqCisgKiBAYnVzX2JtX21hY19hZGRyX2ltcGFpcmVkOiBbZmlsbF0gU2V0IHRvIHRydWUgaWYgdGhlIGRldmljZSdzIE1BQworICogICAgIGFkZHJlc3MgcHJvdmlkZWQgaW4gYm9vdCBtb2RlIGlzIGtpbmQgb2YgYnJva2VuIGFuZCBuZWVkcyB0bworICogICAgIGJlIHJlLXJlYWQgbGF0ZXIgb24uCisgKgorICoKKyAqIEB3aW1heF9kZXY6IFdpTUFYIGdlbmVyaWMgZGV2aWNlIGZvciBsaW5rYWdlIGludG8gdGhlIGtlcm5lbCBXaU1BWAorICogICAgIHN0YWNrLiBEdWUgdG8gdGhlIHdheSBhIG5ldF9kZXZpY2UgaXMgYWxsb2NhdGVkLCB3ZSBuZWVkIHRvCisgKiAgICAgZm9yY2UgdGhpcyB0byBiZSB0aGUgZmlyc3QgZmllbGQgc28gdGhhdCB3ZSBjYW4gZ2V0IGZyb20KKyAqICAgICBuZXRkZXZfcHJpdigpIHRoZSByaWdodCBwb2ludGVyLgorICoKKyAqIEBzdGF0ZTogZGV2aWNlJ3Mgc3RhdGUgKGFzIHJlcG9ydGVkIGJ5IGl0KQorICoKKyAqIEBzdGF0ZV93cTogd2FpdHF1ZXVlIHRoYXQgaXMgd29rZW4gdXAgd2hlbmV2ZXIgdGhlIHN0YXRlIGNoYW5nZXMKKyAqCisgKiBAdHhfbG9jazogc3BpbmxvY2sgdG8gcHJvdGVjdCBUWCBtZW1iZXJzCisgKgorICogQHR4X2J1ZjogRklGTyBidWZmZXIgZm9yIFRYOyB3ZSBxdWV1ZSBkYXRhIGhlcmUKKyAqCisgKiBAdHhfaW46IEZJRk8gaW5kZXggZm9yIGluY29taW5nIGRhdGEuIE5vdGUgdGhpcyBkb2Vzbid0IHdyYXAgYXJvdW5kCisgKiAgICAgYW5kIGl0IGlzIGFsd2F5cyBncmVhdGVyIHRoYW4gQHR4X291dC4KKyAqCisgKiBAdHhfb3V0OiBGSUZPIGluZGV4IGZvciBvdXRnb2luZyBkYXRhCisgKgorICogQHR4X21zZzogY3VycmVudCBUWCBtZXNzYWdlIHRoYXQgaXMgYWN0aXZlIGluIHRoZSBGSUZPIGZvcgorICogICAgIGFwcGVuZGluZyBwYXlsb2Fkcy4KKyAqCisgKiBAdHhfc2VxdWVuY2U6IGN1cnJlbnQgc2VxdWVuY2UgbnVtYmVyIGZvciBUWCBtZXNzYWdlcyBmcm9tIHRoZQorICogICAgIGRldmljZSB0byB0aGUgaG9zdC4KKyAqCisgKiBAdHhfbXNnX3NpemU6IHNpemUgb2YgdGhlIGN1cnJlbnQgbWVzc2FnZSBiZWluZyB0cmFuc21pdHRlZCBieSB0aGUKKyAqICAgICBidXMtc3BlY2lmaWMgY29kZS4KKyAqCisgKiBAdHhfcGxfbnVtOiB0b3RhbCBudW1iZXIgb2YgcGF5bG9hZHMgc2VudAorICoKKyAqIEB0eF9wbF9tYXg6IG1heGltdW0gbnVtYmVyIG9mIHBheWxvYWRzIHNlbnQgaW4gYSBUWCBtZXNzYWdlCisgKgorICogQHR4X3BsX21pbjogbWluaW11bSBudW1iZXIgb2YgcGF5bG9hZHMgc2VudCBpbiBhIFRYIG1lc3NhZ2UKKyAqCisgKiBAdHhfbnVtOiBudW1iZXIgb2YgVFggbWVzc2FnZXMgc2VudAorICoKKyAqIEB0eF9zaXplX2FjYzogbnVtYmVyIG9mIGJ5dGVzIGluIGFsbCBUWCBtZXNzYWdlcyBzZW50CisgKiAgICAgKHRoaXMgaXMgZGlmZmVyZW50IHRvIG5ldF9kZXYncyBzdGF0aXN0aWNzIGFzIGl0IGFsc28gY291bnRzCisgKiAgICAgY29udHJvbCBtZXNzYWdlcykuCisgKgorICogQHR4X3NpemVfbWluOiBzbWFsbGVzdCBUWCBtZXNzYWdlIHNlbnQuCisgKgorICogQHR4X3NpemVfbWF4OiBiaWdnZXN0IFRYIG1lc3NhZ2Ugc2VudC4KKyAqCisgKiBAcnhfbG9jazogc3BpbmxvY2sgdG8gcHJvdGVjdCBSWCBtZW1iZXJzCisgKgorICogQHJ4X3BsX251bTogdG90YWwgbnVtYmVyIG9mIHBheWxvYWRzIHJlY2VpdmVkCisgKgorICogQHJ4X3BsX21heDogbWF4aW11bSBudW1iZXIgb2YgcGF5bG9hZHMgcmVjZWl2ZWQgaW4gYSBSWCBtZXNzYWdlCisgKgorICogQHJ4X3BsX21pbjogbWluaW11bSBudW1iZXIgb2YgcGF5bG9hZHMgcmVjZWl2ZWQgaW4gYSBSWCBtZXNzYWdlCisgKgorICogQHJ4X251bTogbnVtYmVyIG9mIFJYIG1lc3NhZ2VzIHJlY2VpdmVkCisgKgorICogQHJ4X3NpemVfYWNjOiBudW1iZXIgb2YgYnl0ZXMgaW4gYWxsIFJYIG1lc3NhZ2VzIHJlY2VpdmVkCisgKiAgICAgKHRoaXMgaXMgZGlmZmVyZW50IHRvIG5ldF9kZXYncyBzdGF0aXN0aWNzIGFzIGl0IGFsc28gY291bnRzCisgKiAgICAgY29udHJvbCBtZXNzYWdlcykuCisgKgorICogQHJ4X3NpemVfbWluOiBzbWFsbGVzdCBSWCBtZXNzYWdlIHJlY2VpdmVkLgorICoKKyAqIEByeF9zaXplX21heDogYnVnZ2VzdCBSWCBtZXNzYWdlIHJlY2VpdmVkLgorICoKKyAqIEBpbml0X211dGV4OiBNdXRleCB1c2VkIGZvciBzZXJpYWxpemluZyB0aGUgZGV2aWNlIGJyaW5ndXAKKyAqICAgICBzZXF1ZW5jZTsgdGhpcyB3YXkgaWYgdGhlIGRldmljZSByZWJvb3RzIGluIHRoZSBtaWRkbGUsIHdlCisgKiAgICAgZG9uJ3QgdHJ5IHRvIGRvIGEgYnJpbmd1cCBhZ2FpbiB3aGlsZSB3ZSBhcmUgdGVhcmluZyBkb3duIHRoZQorICogICAgIG9uZSB0aGF0IGZhaWxlZC4KKyAqCisgKiAgICAgQ2FuJ3QgcmV1c2UgQG1zZ19tdXRleCBiZWNhdXNlIGZyb20gd2l0aGluIHRoZSBicmluZ3VwIHNlcXVlbmNlCisgKiAgICAgd2UgbmVlZCB0byBzZW5kIG1lc3NhZ2VzIHRvIHRoZSBkZXZpY2UgYW5kIHRodXMgdXNlIEBtc2dfbXV0ZXguCisgKgorICogQG1zZ19tdXRleDogbXV0ZXggdXNlZCB0byBzZW5kIGNvbnRyb2wgY29tbWFuZHMgdG8gdGhlIGRldmljZSAod2UKKyAqICAgICBvbmx5IGFsbG93IG9uZSBhdCBhIHRpbWUsIHBlciBob3N0LWRldmljZSBpbnRlcmZhY2UgZGVzaWduKS4KKyAqCisgKiBAbXNnX2NvbXBsZXRpb246IHVzZWQgdG8gd2FpdCBmb3IgYW4gYWNrIHRvIGEgY29udHJvbCBjb21tYW5kIHNlbnQKKyAqICAgICB0byB0aGUgZGV2aWNlLgorICoKKyAqIEBhY2tfc2tiOiB1c2VkIHRvIHN0b3JlIHRoZSBhY3R1YWwgYWNrIHRvIGEgY29udHJvbCBjb21tYW5kIGlmIHRoZQorICogICAgIHJlY2VwdGlvbiBvZiB0aGUgY29tbWFuZCB3YXMgc3VjY2Vzc2Z1bC4gT3RoZXJ3aXNlLCBhIEVSUl9QVFIoKQorICogICAgIGVycm5vIGNvZGUgdGhhdCBpbmRpY2F0ZXMgd2hhdCBmYWlsZWQgd2l0aCB0aGUgYWNrIHJlY2VwdGlvbi4KKyAqCisgKiAgICAgT25seSB2YWxpZCBhZnRlciBAbXNnX2NvbXBsZXRpb24gaXMgd29rZW4gdXAuIE9ubHkgdXBkYXRlYWJsZQorICogICAgIGlmIEBtc2dfY29tcGxldGlvbiBpcyBhcm1lZC4gT25seSB0b3VjaGVkIGJ5CisgKiAgICAgaTI0MDBtX21zZ190b19kZXYoKS4KKyAqCisgKiAgICAgUHJvdGVjdGVkIGJ5IEByeF9sb2NrLiBJbiB0aGVvcnkgdGhlIGNvbW1hbmQgZXhlY3V0aW9uIGZsb3cgaXMKKyAqICAgICBzZXF1ZW50aWFsLCBidXQgaW4gY2FzZSB0aGUgZGV2aWNlIHNlbmRzIGFuIG91dC1vZi1waGFzZSBvcgorICogICAgIHZlcnkgZGVsYXllZCByZXNwb25zZSwgd2UgbmVlZCB0byBhdm9pZCBpdCB0cmFtcGxpbmcgY3VycmVudAorICogICAgIGV4ZWN1dGlvbi4KKyAqCisgKiBAYm1fY21kX2J1ZjogYm9vdCBtb2RlIGNvbW1hbmQgYnVmZmVyIGZvciBjb21wb3NpbmcgZmlybXdhcmUgdXBsb2FkCisgKiAgICAgY29tbWFuZHMuCisgKgorICogICAgIFVTQiBjYW4ndCByL3cgdG8gc3RhY2ssIHZtYWxsb2MsIGV0Yy4uLmFzIHdlbGwsIHdlIGVuZCB1cAorICogICAgIGhhdmluZyB0byBhbGxvYy9mcmVlIGEgbG90IHRvIGNvbXBvc2UgY29tbWFuZHMsIHNvIHdlIHVzZSB0aGVzZQorICogICAgIGZvciBzdGFnZ2luZyBhbmQgbm90IGhhdmluZyB0byByZWFsbG9jIGFsbCB0aGUgdGltZS4KKyAqCisgKiAgICAgVGhpcyBhc3N1bWVzIHRoZSBjb2RlIGFsd2F5cyBydW5zIHNlcmlhbGl6ZWQuIE9ubHkgb25lIHRocmVhZAorICogICAgIGNhbiBjYWxsIGkyNDAwbV9ibV9jbWQoKSBhdCB0aGUgc2FtZSB0aW1lLgorICoKKyAqIEBibV9hY2tfYnVmOiBib290IG1vZGUgYWNrbm9sZWRnZSBidWZmZXIgZm9yIHN0YWdpbmcgcmVjZXB0aW9uIG9mCisgKiAgICAgcmVzcG9uc2VzIHRvIGNvbW1hbmRzLgorICoKKyAqICAgICBTZWUgQGJtX2NtZF9idWYuCisgKgorICogQHdvcmtfcXVldWU6IHdvcmsgcXVldWUgZm9yIHByb2Nlc3NpbmcgZGV2aWNlIHJlcG9ydHMuIFRoaXMKKyAqICAgICB3b3JrcXVldWUgY2Fubm90IGJlIHVzZWQgZm9yIHByb2Nlc3NpbmcgVFggb3IgUlggdG8gdGhlIGRldmljZSwKKyAqICAgICBhcyBmcm9tIGl0IHdlJ2xsIHByb2Nlc3MgZGV2aWNlIHJlcG9ydHMsIHdoaWNoIG1pZ2h0IHJlcXVpcmUKKyAqICAgICBmdXJ0aGVyIGNvbW11bmljYXRpb24gd2l0aCB0aGUgZGV2aWNlLgorICoKKyAqIEBkZWJ1Z2ZzX2RlbnRyeTogaG9va3VwIGZvciBkZWJ1Z2ZzIGZpbGVzLgorICogICAgIFRoZXNlIGhhdmUgdG8gYmUgaW4gYSBzZXBhcmF0ZSBkaXJlY3RvcnksIGEgY2hpbGQgb2YKKyAqICAgICAod2ltYXhfZGV2LT5kZWJ1Z2ZzX2RlbnRyeSkgc28gdGhleSBjYW4gYmUgcmVtb3ZlZCB3aGVuIHRoZQorICogICAgIG1vZHVsZSB1bmxvYWRzLCBhcyB3ZSBkb24ndCBrZWVwIGVhY2ggZGVudHJ5LgorICovCitzdHJ1Y3QgaTI0MDBtIHsKKwlzdHJ1Y3Qgd2ltYXhfZGV2IHdpbWF4X2RldjsJLyogRklSU1QhIFNlZSBkb2MgKi8KKworCXVuc2lnbmVkIHVwZG93bjoxOwkJLyogTmV0d29yayBkZXZpY2UgaXMgdXAgb3IgZG93biAqLworCXVuc2lnbmVkIGJvb3RfbW9kZToxOwkJLyogaXMgdGhlIGRldmljZSBpbiBib290IG1vZGU/ICovCisJdW5zaWduZWQgc2Jvb3Q6MTsJCS8qIHNpZ25lZCBvciB1bnNpZ25lZCBmdyBib290ICovCisJdW5zaWduZWQgcmVhZHk6MTsJCS8qIGFsbCBwcm9iaW5nIHN0ZXBzIGRvbmUgKi8KKwl1OCB0cmFjZV9tc2dfZnJvbV91c2VyOwkJLyogZWNobyByeCBtc2dzIHRvICd0cmFjZScgcGlwZSAqLworCQkJCQkvKiB0eXBlZCB1OCBzbyBkZWJ1Z2ZzL3U4IGNhbiB0d2VhayAqLworCWVudW0gaTI0MDBtX3N5c3RlbV9zdGF0ZSBzdGF0ZTsKKwl3YWl0X3F1ZXVlX2hlYWRfdCBzdGF0ZV93cTsJLyogV29rZW4gdXAgd2hlbiBvbiBzdGF0ZSB1cGRhdGVzICovCisKKwlzaXplX3QgYnVzX3R4X2Jsb2NrX3NpemU7CisJc2l6ZV90IGJ1c19wbF9zaXplX21heDsKKwlpbnQgKCpidXNfZGV2X3N0YXJ0KShzdHJ1Y3QgaTI0MDBtICopOworCXZvaWQgKCpidXNfZGV2X3N0b3ApKHN0cnVjdCBpMjQwMG0gKik7CisJdm9pZCAoKmJ1c190eF9raWNrKShzdHJ1Y3QgaTI0MDBtICopOworCWludCAoKmJ1c19yZXNldCkoc3RydWN0IGkyNDAwbSAqLCBlbnVtIGkyNDAwbV9yZXNldF90eXBlKTsKKwlzc2l6ZV90ICgqYnVzX2JtX2NtZF9zZW5kKShzdHJ1Y3QgaTI0MDBtICosCisJCQkJICAgY29uc3Qgc3RydWN0IGkyNDAwbV9ib290cm9tX2hlYWRlciAqLAorCQkJCSAgIHNpemVfdCwgaW50IGZsYWdzKTsKKwlzc2l6ZV90ICgqYnVzX2JtX3dhaXRfZm9yX2Fjaykoc3RydWN0IGkyNDAwbSAqLAorCQkJCSAgICAgICBzdHJ1Y3QgaTI0MDBtX2Jvb3Ryb21faGVhZGVyICosIHNpemVfdCk7CisJY29uc3QgY2hhciAqYnVzX2Z3X25hbWU7CisJdW5zaWduZWQgYnVzX2JtX21hY19hZGRyX2ltcGFpcmVkOjE7CisKKwlzcGlubG9ja190IHR4X2xvY2s7CQkvKiBwcm90ZWN0IFRYIHN0YXRlICovCisJdm9pZCAqdHhfYnVmOworCXNpemVfdCB0eF9pbiwgdHhfb3V0OworCXN0cnVjdCBpMjQwMG1fbXNnX2hkciAqdHhfbXNnOworCXNpemVfdCB0eF9zZXF1ZW5jZSwgdHhfbXNnX3NpemU7CisJLyogVFggc3RhdHMgKi8KKwl1bnNpZ25lZCB0eF9wbF9udW0sIHR4X3BsX21heCwgdHhfcGxfbWluLAorCQl0eF9udW0sIHR4X3NpemVfYWNjLCB0eF9zaXplX21pbiwgdHhfc2l6ZV9tYXg7CisKKwkvKiBSWCBzdGF0cyAqLworCXNwaW5sb2NrX3QgcnhfbG9jazsJCS8qIHByb3RlY3QgUlggc3RhdGUgKi8KKwl1bnNpZ25lZCByeF9wbF9udW0sIHJ4X3BsX21heCwgcnhfcGxfbWluLAorCQlyeF9udW0sIHJ4X3NpemVfYWNjLCByeF9zaXplX21pbiwgcnhfc2l6ZV9tYXg7CisKKwlzdHJ1Y3QgbXV0ZXggbXNnX211dGV4OwkJLyogc2VyaWFsaXplIGNvbW1hbmQgZXhlY3V0aW9uICovCisJc3RydWN0IGNvbXBsZXRpb24gbXNnX2NvbXBsZXRpb247CisJc3RydWN0IHNrX2J1ZmYgKmFja19za2I7CS8qIHByb3RlY3RlZCBieSByeF9sb2NrICovCisKKwl2b2lkICpibV9hY2tfYnVmOwkJLyogZm9yIHJlY2VpdmluZyBhY2tzIG92ZXIgVVNCICovCisJdm9pZCAqYm1fY21kX2J1ZjsJCS8qIGZvciBpc3N1aW5nIGNvbW1hbmRzIG92ZXIgVVNCICovCisKKwlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqd29ya19xdWV1ZTsKKworCXN0cnVjdCBtdXRleCBpbml0X211dGV4OwkvKiBwcm90ZWN0IGJyaW5ndXAgc2VxICovCisJc3RydWN0IGkyNDAwbV9yZXNldF9jdHggKnJlc2V0X2N0eDsJLyogcHJvdGVjdGVkIGJ5IGluaXRfbXV0ZXggKi8KKworCXN0cnVjdCB3b3JrX3N0cnVjdCB3YWtlX3R4X3dzOworCXN0cnVjdCBza19idWZmICp3YWtlX3R4X3NrYjsKKworCXN0cnVjdCBkZW50cnkgKmRlYnVnZnNfZGVudHJ5OworfTsKKworCisvKgorICogSW5pdGlhbGl6ZSBhICdzdHJ1Y3QgaTI0MDBtJyBmcm9tIGFsbCB6ZXJvZXMKKyAqCisgKiBUaGlzIGlzIGEgYnVzLWdlbmVyaWMgQVBJIGNhbGwuCisgKi8KK3N0YXRpYyBpbmxpbmUKK3ZvaWQgaTI0MDBtX2luaXQoc3RydWN0IGkyNDAwbSAqaTI0MDBtKQoreworCXdpbWF4X2Rldl9pbml0KCZpMjQwMG0tPndpbWF4X2Rldik7CisKKwlpMjQwMG0tPmJvb3RfbW9kZSA9IDE7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmaTI0MDBtLT5zdGF0ZV93cSk7CisKKwlzcGluX2xvY2tfaW5pdCgmaTI0MDBtLT50eF9sb2NrKTsKKwlpMjQwMG0tPnR4X3BsX21pbiA9IFVJTlRfTUFYOworCWkyNDAwbS0+dHhfc2l6ZV9taW4gPSBVSU5UX01BWDsKKworCXNwaW5fbG9ja19pbml0KCZpMjQwMG0tPnJ4X2xvY2spOworCWkyNDAwbS0+cnhfcGxfbWluID0gVUlOVF9NQVg7CisJaTI0MDBtLT5yeF9zaXplX21pbiA9IFVJTlRfTUFYOworCisJbXV0ZXhfaW5pdCgmaTI0MDBtLT5tc2dfbXV0ZXgpOworCWluaXRfY29tcGxldGlvbigmaTI0MDBtLT5tc2dfY29tcGxldGlvbik7CisKKwltdXRleF9pbml0KCZpMjQwMG0tPmluaXRfbXV0ZXgpOworCS8qIHdha2VfdHhfd3MgaXMgaW5pdGlhbGl6ZWQgaW4gaTI0MDBtX3R4X3NldHVwKCkgKi8KK30KKworCisvKgorICogQnVzLWdlbmVyaWMgaW50ZXJuYWwgQVBJcworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKK3N0YXRpYyBpbmxpbmUKK3N0cnVjdCBpMjQwMG0gKndpbWF4X2Rldl90b19pMjQwMG0oc3RydWN0IHdpbWF4X2RldiAqd2ltYXhfZGV2KQoreworCXJldHVybiBjb250YWluZXJfb2Yod2ltYXhfZGV2LCBzdHJ1Y3QgaTI0MDBtLCB3aW1heF9kZXYpOworfQorCitzdGF0aWMgaW5saW5lCitzdHJ1Y3QgaTI0MDBtICpuZXRfZGV2X3RvX2kyNDAwbShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldikKK3sKKwlyZXR1cm4gd2ltYXhfZGV2X3RvX2kyNDAwbShuZXRkZXZfcHJpdihuZXRfZGV2KSk7Cit9CisKKy8qCisgKiBCb290IG1vZGUgc3VwcG9ydAorICovCisKKy8qKgorICogaTI0MDBtX2JtX2NtZF9mbGFncyAtIGZsYWdzIHRvIGkyNDAwbV9ibV9jbWQoKQorICoKKyAqIEBJMjQwME1fQk1fQ01EX1JBVzogc2VuZCB0aGUgY29tbWFuZCBibG9jayBhcy1pcywgd2l0aG91dCBkb2luZyBhbnkKKyAqICAgICBleHRyYSBwcm9jZXNzaW5nIGZvciBhZGRpbmcgQ1JDLgorICovCitlbnVtIGkyNDAwbV9ibV9jbWRfZmxhZ3MgeworCUkyNDAwTV9CTV9DTURfUkFXCT0gMSA8PCAyLAorfTsKKworLyoqCisgKiBpMjQwMG1fYnJpIC0gQm9vdC1ST00gaW5kaWNhdG9ycworICoKKyAqIEZsYWdzIGZvciBpMjQwMG1fYm9vdHJvbV9pbml0KCkgYW5kIGkyNDAwbV9kZXZfYm9vdHN0cmFwKCkgW3doaWNoCisgKiBhcmUgcGFzc2VkIGZyb20gdGhpbmdzIGxpa2UgaTI0MDBtX3NldHVwKCldLiBDYW4gYmUgY29tYmluZWQgd2l0aAorICogfC4KKyAqCisgKiBASTI0MDBNX0JSSV9TT0ZUOiBUaGUgZGV2aWNlIHJlYm9vdGVkIGFscmVhZHkgYW5kIGEgcmVib290CisgKiAgICAgYmFya2VyIHJlY2VpdmVkLCBwcm9jZWVkIGRpcmVjdGx5IHRvIGFjayB0aGUgYm9vdCBzZXF1ZW5jZS4KKyAqIEBJMjQwME1fQlJJX05PX1JFQk9PVDogRG8gbm90IHJlYm9vdCB0aGUgZGV2aWNlIGFuZCBwcm9jZWVkCisgKiAgICAgZGlyZWN0bHkgdG8gd2FpdCBmb3IgYSByZWJvb3QgYmFya2VyIGZyb20gdGhlIGRldmljZS4KKyAqIEBJMjQwME1fQlJJX01BQ19SRUlOSVQ6IFdlIG5lZWQgdG8gcmVpbml0aWFsaXplIHRoZSBib290CisgKiAgICAgcm9tIGFmdGVyIHJlYWRpbmcgdGhlIE1BQyBhZHJlc3MuIFRoaXMgaXMgcXVpdGUgYSBkaXJ0eSBoYWNrLAorICogICAgIGlmIHlvdSBhc2sgbWUgLS0gdGhlIGRldmljZSByZXF1aXJlcyB0aGUgYm9vdHJvbSB0byBiZQorICogICAgIGludGlhbGl6ZWQgYWZ0ZXIgcmVhZGluZyB0aGUgTUFDIGFkZHJlc3MuCisgKi8KK2VudW0gaTI0MDBtX2JyaSB7CisJSTI0MDBNX0JSSV9TT0ZUICAgICAgID0gMSA8PCAxLAorCUkyNDAwTV9CUklfTk9fUkVCT09UICA9IDEgPDwgMiwKKwlJMjQwME1fQlJJX01BQ19SRUlOSVQgPSAxIDw8IDMsCit9OworCitleHRlcm4gdm9pZCBpMjQwMG1fYm1fY21kX3ByZXBhcmUoc3RydWN0IGkyNDAwbV9ib290cm9tX2hlYWRlciAqKTsKK2V4dGVybiBpbnQgaTI0MDBtX2Rldl9ib290c3RyYXAoc3RydWN0IGkyNDAwbSAqLCBlbnVtIGkyNDAwbV9icmkpOworZXh0ZXJuIGludCBpMjQwMG1fcmVhZF9tYWNfYWRkcihzdHJ1Y3QgaTI0MDBtICopOworZXh0ZXJuIGludCBpMjQwMG1fYm9vdHJvbV9pbml0KHN0cnVjdCBpMjQwMG0gKiwgZW51bSBpMjQwMG1fYnJpKTsKKworLyogTWFrZS9ncm9rIGJvb3Qtcm9tIGhlYWRlciBjb21tYW5kcyAqLworCitzdGF0aWMgaW5saW5lCitfX2xlMzIgaTI0MDBtX2JyaF9jb21tYW5kKGVudW0gaTI0MDBtX2JyaF9vcGNvZGUgb3Bjb2RlLCB1bnNpZ25lZCB1c2VfY2hlY2tzdW0sCisJCQkgIHVuc2lnbmVkIGRpcmVjdF9hY2Nlc3MpCit7CisJcmV0dXJuIGNwdV90b19sZTMyKAorCQlJMjQwME1fQlJIX1NJR05BVFVSRQorCQl8IChkaXJlY3RfYWNjZXNzID8gSTI0MDBNX0JSSF9ESVJFQ1RfQUNDRVNTIDogMCkKKwkJfCBJMjQwME1fQlJIX1JFU1BPTlNFX1JFUVVJUkVEIC8qIHJlc3BvbnNlIGFsd2F5cyByZXF1aXJlZCAqLworCQl8ICh1c2VfY2hlY2tzdW0gPyBJMjQwME1fQlJIX1VTRV9DSEVDS1NVTSA6IDApCisJCXwgKG9wY29kZSAmIEkyNDAwTV9CUkhfT1BDT0RFX01BU0spKTsKK30KKworc3RhdGljIGlubGluZQordm9pZCBpMjQwMG1fYnJoX3NldF9vcGNvZGUoc3RydWN0IGkyNDAwbV9ib290cm9tX2hlYWRlciAqaGRyLAorCQkJICAgZW51bSBpMjQwMG1fYnJoX29wY29kZSBvcGNvZGUpCit7CisJaGRyLT5jb21tYW5kID0gY3B1X3RvX2xlMzIoCisJCShsZTMyX3RvX2NwdShoZHItPmNvbW1hbmQpICYgfkkyNDAwTV9CUkhfT1BDT0RFX01BU0spCisJCXwgKG9wY29kZSAmIEkyNDAwTV9CUkhfT1BDT0RFX01BU0spKTsKK30KKworc3RhdGljIGlubGluZQordW5zaWduZWQgaTI0MDBtX2JyaF9nZXRfb3Bjb2RlKGNvbnN0IHN0cnVjdCBpMjQwMG1fYm9vdHJvbV9oZWFkZXIgKmhkcikKK3sKKwlyZXR1cm4gbGUzMl90b19jcHUoaGRyLT5jb21tYW5kKSAmIEkyNDAwTV9CUkhfT1BDT0RFX01BU0s7Cit9CisKK3N0YXRpYyBpbmxpbmUKK3Vuc2lnbmVkIGkyNDAwbV9icmhfZ2V0X3Jlc3BvbnNlKGNvbnN0IHN0cnVjdCBpMjQwMG1fYm9vdHJvbV9oZWFkZXIgKmhkcikKK3sKKwlyZXR1cm4gKGxlMzJfdG9fY3B1KGhkci0+Y29tbWFuZCkgJiBJMjQwME1fQlJIX1JFU1BPTlNFX01BU0spCisJCT4+IEkyNDAwTV9CUkhfUkVTUE9OU0VfU0hJRlQ7Cit9CisKK3N0YXRpYyBpbmxpbmUKK3Vuc2lnbmVkIGkyNDAwbV9icmhfZ2V0X3VzZV9jaGVja3N1bShjb25zdCBzdHJ1Y3QgaTI0MDBtX2Jvb3Ryb21faGVhZGVyICpoZHIpCit7CisJcmV0dXJuIGxlMzJfdG9fY3B1KGhkci0+Y29tbWFuZCkgJiBJMjQwME1fQlJIX1VTRV9DSEVDS1NVTTsKK30KKworc3RhdGljIGlubGluZQordW5zaWduZWQgaTI0MDBtX2JyaF9nZXRfcmVzcG9uc2VfcmVxdWlyZWQoCisJY29uc3Qgc3RydWN0IGkyNDAwbV9ib290cm9tX2hlYWRlciAqaGRyKQoreworCXJldHVybiBsZTMyX3RvX2NwdShoZHItPmNvbW1hbmQpICYgSTI0MDBNX0JSSF9SRVNQT05TRV9SRVFVSVJFRDsKK30KKworc3RhdGljIGlubGluZQordW5zaWduZWQgaTI0MDBtX2JyaF9nZXRfZGlyZWN0X2FjY2Vzcyhjb25zdCBzdHJ1Y3QgaTI0MDBtX2Jvb3Ryb21faGVhZGVyICpoZHIpCit7CisJcmV0dXJuIGxlMzJfdG9fY3B1KGhkci0+Y29tbWFuZCkgJiBJMjQwME1fQlJIX0RJUkVDVF9BQ0NFU1M7Cit9CisKK3N0YXRpYyBpbmxpbmUKK3Vuc2lnbmVkIGkyNDAwbV9icmhfZ2V0X3NpZ25hdHVyZShjb25zdCBzdHJ1Y3QgaTI0MDBtX2Jvb3Ryb21faGVhZGVyICpoZHIpCit7CisJcmV0dXJuIChsZTMyX3RvX2NwdShoZHItPmNvbW1hbmQpICYgSTI0MDBNX0JSSF9TSUdOQVRVUkVfTUFTSykKKwkJPj4gSTI0MDBNX0JSSF9TSUdOQVRVUkVfU0hJRlQ7Cit9CisKKworLyoKKyAqIERyaXZlciAvIGRldmljZSBzZXR1cCBhbmQgaW50ZXJuYWwgZnVuY3Rpb25zCisgKi8KK2V4dGVybiB2b2lkIGkyNDAwbV9uZXRkZXZfc2V0dXAoc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpOworZXh0ZXJuIGludCBpMjQwMG1fdHhfc2V0dXAoc3RydWN0IGkyNDAwbSAqKTsKK2V4dGVybiB2b2lkIGkyNDAwbV93YWtlX3R4X3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICopOworZXh0ZXJuIHZvaWQgaTI0MDBtX3R4X3JlbGVhc2Uoc3RydWN0IGkyNDAwbSAqKTsKKworZXh0ZXJuIHZvaWQgaTI0MDBtX25ldF9yeChzdHJ1Y3QgaTI0MDBtICosIHN0cnVjdCBza19idWZmICosIHVuc2lnbmVkLAorCQkJICBjb25zdCB2b2lkICosIGludCk7CitlbnVtIGkyNDAwbV9wdDsKK2V4dGVybiBpbnQgaTI0MDBtX3R4KHN0cnVjdCBpMjQwMG0gKiwgY29uc3Qgdm9pZCAqLCBzaXplX3QsIGVudW0gaTI0MDBtX3B0KTsKKworI2lmZGVmIENPTkZJR19ERUJVR19GUworZXh0ZXJuIGludCBpMjQwMG1fZGVidWdmc19hZGQoc3RydWN0IGkyNDAwbSAqKTsKK2V4dGVybiB2b2lkIGkyNDAwbV9kZWJ1Z2ZzX3JtKHN0cnVjdCBpMjQwMG0gKik7CisjZWxzZQorc3RhdGljIGlubGluZSBpbnQgaTI0MDBtX2RlYnVnZnNfYWRkKHN0cnVjdCBpMjQwMG0gKmkyNDAwbSkKK3sKKwlyZXR1cm4gMDsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCBpMjQwMG1fZGVidWdmc19ybShzdHJ1Y3QgaTI0MDBtICppMjQwMG0pIHt9CisjZW5kaWYKKworLyogQ2FsbGVkIGJ5IF9kZXZfc3RhcnQoKS9fZGV2X3N0b3AoKSB0byBpbml0aWFsaXplIHRoZSBkZXZpY2UgaXRzZWxmICovCitleHRlcm4gaW50IGkyNDAwbV9kZXZfaW5pdGlhbGl6ZShzdHJ1Y3QgaTI0MDBtICopOworZXh0ZXJuIHZvaWQgaTI0MDBtX2Rldl9zaHV0ZG93bihzdHJ1Y3QgaTI0MDBtICopOworCitleHRlcm4gc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBpMjQwMG1fZGV2X2F0dHJfZ3JvdXA7CisKK2V4dGVybiBpbnQgaTI0MDBtX3NjaGVkdWxlX3dvcmsoc3RydWN0IGkyNDAwbSAqLAorCQkJCXZvaWQgKCopKHN0cnVjdCB3b3JrX3N0cnVjdCAqKSwgZ2ZwX3QpOworCisvKiBIREkgbWVzc2FnZSdzIHBheWxvYWQgZGVzY3JpcHRpb24gaGFuZGxpbmcgKi8KKworc3RhdGljIGlubGluZQorc2l6ZV90IGkyNDAwbV9wbGRfc2l6ZShjb25zdCBzdHJ1Y3QgaTI0MDBtX3BsZCAqcGxkKQoreworCXJldHVybiBJMjQwME1fUExEX1NJWkVfTUFTSyAmIGxlMzJfdG9fY3B1KHBsZC0+dmFsKTsKK30KKworc3RhdGljIGlubGluZQorZW51bSBpMjQwMG1fcHQgaTI0MDBtX3BsZF90eXBlKGNvbnN0IHN0cnVjdCBpMjQwMG1fcGxkICpwbGQpCit7CisJcmV0dXJuIChJMjQwME1fUExEX1RZUEVfTUFTSyAmIGxlMzJfdG9fY3B1KHBsZC0+dmFsKSkKKwkJPj4gSTI0MDBNX1BMRF9UWVBFX1NISUZUOworfQorCitzdGF0aWMgaW5saW5lCit2b2lkIGkyNDAwbV9wbGRfc2V0KHN0cnVjdCBpMjQwMG1fcGxkICpwbGQsIHNpemVfdCBzaXplLAorCQkgICAgZW51bSBpMjQwMG1fcHQgdHlwZSkKK3sKKwlwbGQtPnZhbCA9IGNwdV90b19sZTMyKAorCQkoKHR5cGUgPDwgSTI0MDBNX1BMRF9UWVBFX1NISUZUKSAmIEkyNDAwTV9QTERfVFlQRV9NQVNLKQorCQl8ICAoc2l6ZSAmIEkyNDAwTV9QTERfU0laRV9NQVNLKSk7Cit9CisKKworLyoKKyAqIEFQSSBmb3IgdGhlIGJ1cy1zcGVjaWZpYyBkcml2ZXJzCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKK3N0YXRpYyBpbmxpbmUKK3N0cnVjdCBpMjQwMG0gKmkyNDAwbV9nZXQoc3RydWN0IGkyNDAwbSAqaTI0MDBtKQoreworCWRldl9ob2xkKGkyNDAwbS0+d2ltYXhfZGV2Lm5ldF9kZXYpOworCXJldHVybiBpMjQwMG07Cit9CisKK3N0YXRpYyBpbmxpbmUKK3ZvaWQgaTI0MDBtX3B1dChzdHJ1Y3QgaTI0MDBtICppMjQwMG0pCit7CisJZGV2X3B1dChpMjQwMG0tPndpbWF4X2Rldi5uZXRfZGV2KTsKK30KKworZXh0ZXJuIGludCBpMjQwMG1fZGV2X3Jlc2V0X2hhbmRsZShzdHJ1Y3QgaTI0MDBtICopOworCisvKgorICogX3NldHVwKCkvX3JlbGVhc2UoKSBhcmUgY2FsbGVkIGJ5IHRoZSBwcm9iZS9kaXNjb25uZWN0IGZ1bmN0aW9ucyBvZgorICogdGhlIGJ1cy1zcGVjaWZpYyBkcml2ZXJzLgorICovCitleHRlcm4gaW50IGkyNDAwbV9zZXR1cChzdHJ1Y3QgaTI0MDBtICosIGVudW0gaTI0MDBtX2JyaSBibV9mbGFncyk7CitleHRlcm4gdm9pZCBpMjQwMG1fcmVsZWFzZShzdHJ1Y3QgaTI0MDBtICopOworCitleHRlcm4gaW50IGkyNDAwbV9yeChzdHJ1Y3QgaTI0MDBtICosIHN0cnVjdCBza19idWZmICopOworZXh0ZXJuIHN0cnVjdCBpMjQwMG1fbXNnX2hkciAqaTI0MDBtX3R4X21zZ19nZXQoc3RydWN0IGkyNDAwbSAqLCBzaXplX3QgKik7CitleHRlcm4gdm9pZCBpMjQwMG1fdHhfbXNnX3NlbnQoc3RydWN0IGkyNDAwbSAqKTsKKworc3RhdGljIGNvbnN0IF9fbGUzMiBpMjQwMG1fTkJPT1RfQkFSS0VSWzRdID0geworCV9fY29uc3RhbnRfY3B1X3RvX2xlMzIoSTI0MDBNX05CT09UX0JBUktFUiksCisJX19jb25zdGFudF9jcHVfdG9fbGUzMihJMjQwME1fTkJPT1RfQkFSS0VSKSwKKwlfX2NvbnN0YW50X2NwdV90b19sZTMyKEkyNDAwTV9OQk9PVF9CQVJLRVIpLAorCV9fY29uc3RhbnRfY3B1X3RvX2xlMzIoSTI0MDBNX05CT09UX0JBUktFUikKK307CisKK3N0YXRpYyBjb25zdCBfX2xlMzIgaTI0MDBtX1NCT09UX0JBUktFUls0XSA9IHsKKwlfX2NvbnN0YW50X2NwdV90b19sZTMyKEkyNDAwTV9TQk9PVF9CQVJLRVIpLAorCV9fY29uc3RhbnRfY3B1X3RvX2xlMzIoSTI0MDBNX1NCT09UX0JBUktFUiksCisJX19jb25zdGFudF9jcHVfdG9fbGUzMihJMjQwME1fU0JPT1RfQkFSS0VSKSwKKwlfX2NvbnN0YW50X2NwdV90b19sZTMyKEkyNDAwTV9TQk9PVF9CQVJLRVIpCit9OworCisKKy8qCisgKiBVdGlsaXR5IGZ1bmN0aW9ucworICovCisKK3N0YXRpYyBpbmxpbmUKK3N0cnVjdCBkZXZpY2UgKmkyNDAwbV9kZXYoc3RydWN0IGkyNDAwbSAqaTI0MDBtKQoreworCXJldHVybiBpMjQwMG0tPndpbWF4X2Rldi5uZXRfZGV2LT5kZXYucGFyZW50OworfQorCisvKgorICogSGVscGVyIGZvciBzY2hlZHVsaW5nIHNpbXBsZSB3b3JrIGZ1bmN0aW9ucworICoKKyAqIFRoaXMgc3RydWN0IGNhbiBnZXQgYW55IGtpbmQgb2YgcGF5bG9hZCBhdHRhY2hlZCAobm9ybWFsbHkgaW4gdGhlCisgKiBmb3JtIG9mIGEgc3RydWN0IHdoZXJlIHlvdSBwYWNrIHRoZSBzdHVmZiB5b3Ugd2FudCB0byBwYXNzIHRvIHRoZQorICogX3dvcmsgZnVuY3Rpb24pLgorICovCitzdHJ1Y3QgaTI0MDBtX3dvcmsgeworCXN0cnVjdCB3b3JrX3N0cnVjdCB3czsKKwlzdHJ1Y3QgaTI0MDBtICppMjQwMG07CisJdTggcGxbMF07Cit9OworZXh0ZXJuIGludCBpMjQwMG1fcXVldWVfd29yayhzdHJ1Y3QgaTI0MDBtICosCisJCQkgICAgIHZvaWQgKCopKHN0cnVjdCB3b3JrX3N0cnVjdCAqKSwgZ2ZwX3QsCisJCQkJY29uc3Qgdm9pZCAqLCBzaXplX3QpOworCitleHRlcm4gaW50IGkyNDAwbV9tc2dfY2hlY2tfc3RhdHVzKGNvbnN0IHN0cnVjdCBpMjQwMG1fbDNsNF9oZHIgKiwKKwkJCQkgICBjaGFyICosIHNpemVfdCk7CitleHRlcm4gaW50IGkyNDAwbV9tc2dfc2l6ZV9jaGVjayhzdHJ1Y3QgaTI0MDBtICosCisJCQkJIGNvbnN0IHN0cnVjdCBpMjQwMG1fbDNsNF9oZHIgKiwgc2l6ZV90KTsKK2V4dGVybiBzdHJ1Y3Qgc2tfYnVmZiAqaTI0MDBtX21zZ190b19kZXYoc3RydWN0IGkyNDAwbSAqLCBjb25zdCB2b2lkICosIHNpemVfdCk7CitleHRlcm4gdm9pZCBpMjQwMG1fbXNnX3RvX2Rldl9jYW5jZWxfd2FpdChzdHJ1Y3QgaTI0MDBtICosIGludCk7CitleHRlcm4gdm9pZCBpMjQwMG1fbXNnX2Fja19ob29rKHN0cnVjdCBpMjQwMG0gKiwKKwkJCQljb25zdCBzdHJ1Y3QgaTI0MDBtX2wzbDRfaGRyICosIHNpemVfdCk7CitleHRlcm4gdm9pZCBpMjQwMG1fcmVwb3J0X2hvb2soc3RydWN0IGkyNDAwbSAqLAorCQkJICAgICAgIGNvbnN0IHN0cnVjdCBpMjQwMG1fbDNsNF9oZHIgKiwgc2l6ZV90KTsKK2V4dGVybiBpbnQgaTI0MDBtX2NtZF9lbnRlcl9wb3dlcnNhdmUoc3RydWN0IGkyNDAwbSAqKTsKK2V4dGVybiBpbnQgaTI0MDBtX2NtZF9nZXRfc3RhdGUoc3RydWN0IGkyNDAwbSAqKTsKK2V4dGVybiBpbnQgaTI0MDBtX2NtZF9leGl0X2lkbGUoc3RydWN0IGkyNDAwbSAqKTsKK2V4dGVybiBzdHJ1Y3Qgc2tfYnVmZiAqaTI0MDBtX2dldF9kZXZpY2VfaW5mbyhzdHJ1Y3QgaTI0MDBtICopOworZXh0ZXJuIGludCBpMjQwMG1fZmlybXdhcmVfY2hlY2soc3RydWN0IGkyNDAwbSAqKTsKK2V4dGVybiBpbnQgaTI0MDBtX3NldF9pbml0X2NvbmZpZyhzdHJ1Y3QgaTI0MDBtICosCisJCQkJICBjb25zdCBzdHJ1Y3QgaTI0MDBtX3Rsdl9oZHIgKiosIHNpemVfdCk7CisKK3N0YXRpYyBpbmxpbmUKK3N0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqdXNiX2dldF9lcGQoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmlmYWNlLCBpbnQgZXApCit7CisJcmV0dXJuICZpZmFjZS0+Y3VyX2FsdHNldHRpbmctPmVuZHBvaW50W2VwXS5kZXNjOworfQorCitleHRlcm4gaW50IGkyNDAwbV9vcF9yZmtpbGxfc3dfdG9nZ2xlKHN0cnVjdCB3aW1heF9kZXYgKiwKKwkJCQkgICAgICBlbnVtIHdpbWF4X3JmX3N0YXRlKTsKK2V4dGVybiB2b2lkIGkyNDAwbV9yZXBvcnRfdGx2X3JmX3N3aXRjaGVzX3N0YXR1cygKKwlzdHJ1Y3QgaTI0MDBtICosIGNvbnN0IHN0cnVjdCBpMjQwMG1fdGx2X3JmX3N3aXRjaGVzX3N0YXR1cyAqKTsKKworCisvKgorICogRG8gYSBtaWxsaXNlY29uZC1zbGVlcCBmb3IgYWxsb3dpbmcgd2lyZXNoYXJrIHRvIGR1bXAgYWxsIHRoZSBkYXRhCisgKiBwYWNrZXRzLiBVc2VkIG9ubHkgZm9yIGRlYnVnZ2luZy4KKyAqLworc3RhdGljIGlubGluZQordm9pZCBfX2kyNDAwbV9tc2xlZXAodW5zaWduZWQgbXMpCit7CisjaWYgMQorI2Vsc2UKKwltc2xlZXAobXMpOworI2VuZGlmCit9CisKKy8qIE1vZHVsZSBwYXJhbWV0ZXJzICovCisKK2V4dGVybiBpbnQgaTI0MDBtX2lkbGVfbW9kZV9kaXNhYmxlZDsKKworCisjZW5kaWYgLyogI2lmbmRlZiBfX0kyNDAwTV9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS9uZXRkZXYuYyBiL2RyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS9uZXRkZXYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42M2ZlNzA4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2ltYXgvaTI0MDBtL25ldGRldi5jCkBAIC0wLDAgKzEsNTI0IEBACisvKgorICogSW50ZWwgV2lyZWxlc3MgV2lNQVggQ29ubmVjdGlvbiAyNDAwbQorICogR2x1ZSB3aXRoIHRoZSBuZXR3b3JraW5nIHN0YWNrCisgKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBJbnRlbCBDb3Jwb3JhdGlvbiA8bGludXgtd2ltYXhAaW50ZWwuY29tPgorICogWWFuaXIgTHViZXRraW4gPHlhbmlyeC5sdWJldGtpbkBpbnRlbC5jb20+CisgKiBJbmFreSBQZXJlei1Hb256YWxleiA8aW5ha3kucGVyZXotZ29uemFsZXpAaW50ZWwuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEsIFVTQS4KKyAqCisgKgorICogVGhpcyBpbXBsZW1lbnRzIGFuIGV0aGVybmV0IGRldmljZSBmb3IgdGhlIGkyNDAwbS4KKyAqCisgKiBXZSBmYWtlIGJlaW5nIGFuIGV0aGVybmV0IGRldmljZSB0byBzaW1wbGlmeSB0aGUgc3VwcG9ydCBmcm9tIHVzZXIKKyAqIHNwYWNlIGFuZCBmcm9tIHRoZSBvdGhlciBzaWRlLiBUaGUgd29ybGQgaXMgKHNhZGx5KSBjb25maWd1cmVkIHRvCisgKiB0YWtlIGluIG9ubHkgRXRoZXJuZXQgZGV2aWNlcy4uLgorICoKKyAqIEJlY2F1c2Ugb2YgdGhpcywgY3VycmVudGx5IHRoZXJlIGlzIGFuIGNvcHktZWFjaC1yeGVkLXBhY2tldAorICogb3ZlcmhlYWQgb24gdGhlIFJYIHBhdGguIEVhY2ggSVAgcGFja2V0IGhhcyB0byBiZSByZWFsbG9jYXRlZCB0bworICogYWRkIGFuIGV0aGVybmV0IGhlYWRlciAoYXMgdGhlcmUgaXMgbm8gc3BhY2UgaW4gd2hhdCB3ZSBnZXQgZnJvbQorICogdGhlIGRldmljZSkuIFRoaXMgaXMgYSBrbm93biBkcmF3YmFjayBhbmQgY29taW5nIHZlcnNpb25zIG9mIHRoZQorICogZGV2aWNlJ3MgZmlybXdhcmUgYXJlIGJlaW5nIGNoYW5nZWQgdG8gYWRkIGhlYWRlciBzcGFjZSB0aGF0IGNhbiBiZQorICogdXNlZCB0byBpbnNlcnQgdGhlIGV0aGVybmV0IGhlYWRlciB3aXRob3V0IGhhdmluZyB0byByZWFsbG9jYXRlIGFuZAorICogY29weS4KKyAqCisgKiBUWCBlcnJvciBoYW5kbGluZyBpcyB0cmlja3k7IGJlY2F1c2Ugd2UgaGF2ZSB0byBGSUZPL3F1ZXVlIHRoZQorICogYnVmZmVycyBmb3IgdHJhbnNtaXNzaW9uIChhcyB0aGUgaGFyZHdhcmUgbGlrZXMgaXQgYWdncmVnYXRlZCksIHdlCisgKiBqdXN0IGdpdmUgdGhlIHNrYiB0byB0aGUgVFggc3Vic3lzdGVtIGFuZCBieSB0aGUgdGltZSBpdCBpcworICogdHJhbnNtaXR0ZWQsIHdlIGhhdmUgbG9uZyBmb3Jnb3R0ZW4gYWJvdXQgaXQuIFNvIHdlIGp1c3QgZG9uJ3QgY2FyZQorICogdG9vIG11Y2ggYWJvdXQgaXQuCisgKgorICogTm90ZSB0aGF0IHdoZW4gdGhlIGRldmljZSBpcyBpbiBpZGxlIG1vZGUgd2l0aCB0aGUgYmFzZXN0YXRpb24sIHdlCisgKiBuZWVkIHRvIG5lZ290aWF0ZSBjb21pbmcgYmFjayB1cCBvbmxpbmUuIFRoYXQgaW52b2x2ZXMgbmVnb3RpYXRpb24KKyAqIGFuZCBwb3NzaWJsZSB1c2VyIHNwYWNlIGludGVyYWN0aW9uLiBUaHVzLCB3ZSBkZWZlciB0byBhIHdvcmtxdWV1ZQorICogdG8gZG8gYWxsIHRoYXQuIEJ5IGRlZmF1bHQsIHdlIG9ubHkgcXVldWUgYSBzaW5nbGUgcGFja2V0IGFuZCBkcm9wCisgKiB0aGUgcmVzdCwgYXMgcG90ZW50aWFsbHkgdGhlIHRpbWUgdG8gZ28gYmFjayBmcm9tIGlkbGUgdG8gbm9ybWFsIGlzCisgKiBsb25nLgorICoKKyAqIFJPQURNQVAKKyAqCisgKiBpMjQwMG1fb3BlbiAgICAgICAgIENhbGxlZCBvbiBpZmNvbmZpZyB1cAorICogaTI0MDBtX3N0b3AgICAgICAgICBDYWxsZWQgb24gaWZjb25maWcgZG93bgorICoKKyAqIGkyNDAwbV9oYXJkX3N0YXJ0X3htaXQgQ2FsbGVkIGJ5IHRoZSBuZXR3b3JrIHN0YWNrIHRvIHNlbmQgYSBwYWNrZXQKKyAqICAgaTI0MDBtX25ldF93YWtlX3R4CSAgV2FrZSB1cCBkZXZpY2UgZnJvbSBiYXNlc3RhdGlvbi1JRExFICYgVFgKKyAqICAgICBpMjQwMG1fd2FrZV90eF93b3JrCisgKiAgICAgICBpMjQwMG1fY21kX2V4aXRfaWRsZQorICogICAgICAgaTI0MDBtX3R4CisgKiAgIGkyNDAwbV9uZXRfdHggICAgICAgIFRYIGEgZGF0YSBmcmFtZQorICogICAgIGkyNDAwbV90eAorICoKKyAqIGkyNDAwbV9jaGFuZ2VfbXR1ICAgICAgQ2FsbGVkIG9uIGlmY29uZmlnIG10dSBYWFgKKyAqCisgKiBpMjQwMG1fdHhfdGltZW91dCAgICAgIENhbGxlZCB3aGVuIHRoZSBkZXZpY2UgdGltZXMgb3V0CisgKgorICogaTI0MDBtX25ldF9yeCAgICAgICAgICBDYWxsZWQgYnkgdGhlIFJYIGNvZGUgd2hlbiBhIGRhdGEgZnJhbWUgaXMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlLgorICogaTI0MDBtX25ldGRldl9zZXR1cCAgICBDYWxsZWQgdG8gc2V0dXAgYWxsIHRoZSBuZXRkZXYgc3R1ZmYgZnJvbQorICogICAgICAgICAgICAgICAgICAgICAgICBhbGxvY19uZXRkZXYuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlICJpMjQwMG0uaCIKKworCisjZGVmaW5lIERfU1VCTU9EVUxFIG5ldGRldgorI2luY2x1ZGUgImRlYnVnLWxldmVscy5oIgorCitlbnVtIHsKKy8qIG5ldGRldiBpbnRlcmZhY2UgKi8KKwkvKgorCSAqIE91dCBvZiBOV0cgc3BlYyAoUjFfdjEuMi4yKSwgMy4zLjMgQVNOIEJlYXJlciBQbGFuZSBNVFUgU2l6ZQorCSAqCisJICogVGhlIE1UVSBpcyAxNDAwIG9yIGxlc3MKKwkgKi8KKwlJMjQwME1fTUFYX01UVSA9IDE0MDAsCisJSTI0MDBNX1RYX1RJTUVPVVQgPSBIWiwKKwlJMjQwME1fVFhfUUxFTiA9IDUsCit9OworCisKK3N0YXRpYworaW50IGkyNDAwbV9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2KQoreworCWludCByZXN1bHQ7CisJc3RydWN0IGkyNDAwbSAqaTI0MDBtID0gbmV0X2Rldl90b19pMjQwMG0obmV0X2Rldik7CisJc3RydWN0IGRldmljZSAqZGV2ID0gaTI0MDBtX2RldihpMjQwMG0pOworCisJZF9mbnN0YXJ0KDMsIGRldiwgIihuZXRfZGV2ICVwIFtpMjQwMG0gJXBdKVxuIiwgbmV0X2RldiwgaTI0MDBtKTsKKwlpZiAoaTI0MDBtLT5yZWFkeSA9PSAwKSB7CisJCWRldl9lcnIoZGV2LCAiRGV2aWNlIGlzIHN0aWxsIGluaXRpYWxpemluZ1xuIik7CisJCXJlc3VsdCA9IC1FQlVTWTsKKwl9IGVsc2UKKwkJcmVzdWx0ID0gMDsKKwlkX2ZuZW5kKDMsIGRldiwgIihuZXRfZGV2ICVwIFtpMjQwMG0gJXBdKSA9ICVkXG4iLAorCQluZXRfZGV2LCBpMjQwMG0sIHJlc3VsdCk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworCisvKgorICoKKyAqIE9uIGtlcm5lbCB2ZXJzaW9ucyB3aGVyZSBjYW5jZWxfd29ya19zeW5jKCkgZGlkbid0IHJldHVybiBhbnl0aGluZywKKyAqIHdlIHJlbHkgb24gd2FrZV90eF9za2IoKSBiZWluZyBub24tTlVMTC4KKyAqLworc3RhdGljCitpbnQgaTI0MDBtX3N0b3Aoc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpCit7CisJc3RydWN0IGkyNDAwbSAqaTI0MDBtID0gbmV0X2Rldl90b19pMjQwMG0obmV0X2Rldik7CisJc3RydWN0IGRldmljZSAqZGV2ID0gaTI0MDBtX2RldihpMjQwMG0pOworCisJZF9mbnN0YXJ0KDMsIGRldiwgIihuZXRfZGV2ICVwIFtpMjQwMG0gJXBdKVxuIiwgbmV0X2RldiwgaTI0MDBtKTsKKwkvKiBTZWUgaTI0MDBtX2hhcmRfc3RhcnRfeG1pdCgpLCByZWZlcmVuY2VzIGFyZSB0YWtlbiB0aGVyZQorCSAqIGFuZCBoZXJlIHdlIHJlbGVhc2UgdGhlbSBpZiB0aGUgd29yayB3YXMgc3RpbGwKKwkgKiBwZW5kaW5nLiBOb3RlIHdlIGNhbid0IGRpZmZlcmVudGlhdGUgd29yayBub3QgcGVuZGluZyB2cworCSAqIG5ldmVyIHNjaGVkdWxlZCwgc28gdGhlIE5VTEwgY2hlY2sgZG9lcyB0aGF0LiAqLworCWlmIChjYW5jZWxfd29ya19zeW5jKCZpMjQwMG0tPndha2VfdHhfd3MpID09IDAKKwkgICAgJiYgaTI0MDBtLT53YWtlX3R4X3NrYiAhPSBOVUxMKSB7CisJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCXN0cnVjdCBza19idWZmICp3YWtlX3R4X3NrYjsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmkyNDAwbS0+dHhfbG9jaywgZmxhZ3MpOworCQl3YWtlX3R4X3NrYiA9IGkyNDAwbS0+d2FrZV90eF9za2I7CS8qIGNvbXBhdCBoZWxwICovCisJCWkyNDAwbS0+d2FrZV90eF9za2IgPSBOVUxMOwkvKiBjb21wYXQgaGVscCAqLworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpMjQwMG0tPnR4X2xvY2ssIGZsYWdzKTsKKwkJaTI0MDBtX3B1dChpMjQwMG0pOworCQlrZnJlZV9za2Iod2FrZV90eF9za2IpOworCX0KKwlkX2ZuZW5kKDMsIGRldiwgIihuZXRfZGV2ICVwIFtpMjQwMG0gJXBdKSA9IDBcbiIsIG5ldF9kZXYsIGkyNDAwbSk7CisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIFdha2UgdXAgdGhlIGRldmljZSBhbmQgdHJhbnNtaXQgYSBoZWxkIFNLQiwgdGhlbiByZXN0YXJ0IHRoZSBuZXQgcXVldWUKKyAqCisgKiBXaGVuIHRoZSBkZXZpY2UgZ29lcyBpbnRvIGJhc2VzdGF0aW9uLWlkbGUgbW9kZSwgd2UgbmVlZCB0byB0ZWxsIGl0CisgKiB0byBleGl0IHRoYXQgbW9kZTsgaXQgd2lsbCBuZWdvdGlhdGUgd2l0aCB0aGUgYmFzZSBzdGF0aW9uLCB1c2VyCisgKiBzcGFjZSBtYXkgaGF2ZSB0byBpbnRlcnZlbmUgdG8gcmVoYW5kc2hha2UgY3J5cHRvIGFuZCB0aGVuIHRlbGwgdXMKKyAqIHdoZW4gaXQgaXMgcmVhZHkgdG8gdHJhbnNtaXQgdGhlIHBhY2tldCB3ZSBoYXZlICJxdWV1ZWQiLiBTdGlsbCB3ZQorICogbmVlZCB0byBnaXZlIGl0IHNvbWV0aW1lIGFmdGVyIGl0IHJlcG9ydHMgYmVpbmcgb2suCisgKgorICogT24gZXJyb3IsIHRoZXJlIGlzIG5vdCBtdWNoIHdlIGNhbiBkby4gSWYgdGhlIGVycm9yIHdhcyBvbiBUWCwgd2UKKyAqIHN0aWxsIHdha2UgdGhlIHF1ZXVlIHVwIHRvIHNlZSBpZiB0aGUgbmV4dCBwYWNrZXQgd2lsbCBiZSBsdWNraWVyLgorICoKKyAqIElmIF9jbWRfZXhpdF9pZGxlKCkgZmFpbHMuLi53ZWxsLCBpdCBjb3VsZCBiZSBtYW55IHRoaW5nczsgbW9zdAorICogY29tbW9ubHkgaXQgaXMgdGhhdCBzb21ldGhpbmcgZWxzZSB0b29rIHRoZSBkZXZpY2Ugb3V0IG9mIElETEUgbW9kZQorICogKGZvciBleGFtcGxlLCB0aGUgYmFzZSBzdGF0aW9uKS4gSW4gdGhhdCBjYXNlIHdlIGdldCBhbiAtRUlMU0VRIGFuZAorICogd2UgYXJlIGp1c3QgZ29pbmcgdG8gaWdub3JlIHRoYXQgb25lLiBJZiB0aGUgZGV2aWNlIGlzIGJhY2sgdG8KKyAqIGNvbm5lY3RlZCwgdGhlbiBmaW5lIC0tIGlmIGl0IGlzIHNvbWVvdGhlciBzdGF0ZSwgdGhlIHBhY2tldCB3aWxsCisgKiBiZSBkcm9wcGVkIGFueXdheS4KKyAqLwordm9pZCBpMjQwMG1fd2FrZV90eF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd3MpCit7CisJaW50IHJlc3VsdDsKKwlzdHJ1Y3QgaTI0MDBtICppMjQwMG0gPSBjb250YWluZXJfb2Yod3MsIHN0cnVjdCBpMjQwMG0sIHdha2VfdHhfd3MpOworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGkyNDAwbV9kZXYoaTI0MDBtKTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gaTI0MDBtLT53YWtlX3R4X3NrYjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmkyNDAwbS0+dHhfbG9jaywgZmxhZ3MpOworCXNrYiA9IGkyNDAwbS0+d2FrZV90eF9za2I7CisJaTI0MDBtLT53YWtlX3R4X3NrYiA9IE5VTEw7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaTI0MDBtLT50eF9sb2NrLCBmbGFncyk7CisKKwlkX2Zuc3RhcnQoMywgZGV2LCAiKHdzICVwIGkyNDAwbSAlcCBza2IgJXApXG4iLCB3cywgaTI0MDBtLCBza2IpOworCXJlc3VsdCA9IC1FSU5WQUw7CisJaWYgKHNrYiA9PSBOVUxMKSB7CisJCWRldl9lcnIoZGV2LCAiV0FLRSZUWDogc2tiIGRpc3NhcGVhcmVkIVxuIik7CisJCWdvdG8gb3V0X3B1dDsKKwl9CisJcmVzdWx0ID0gaTI0MDBtX2NtZF9leGl0X2lkbGUoaTI0MDBtKTsKKwlpZiAocmVzdWx0ID09IC1FSUxTRVEpCisJCXJlc3VsdCA9IDA7CisJaWYgKHJlc3VsdCA8IDApIHsKKwkJZGV2X2VycihkZXYsICJXQUtFJlRYOiBkZXZpY2UgZGlkbid0IGdldCBvdXQgb2YgaWRsZTogIgorCQkJIiVkXG4iLCByZXN1bHQpOworCQkJZ290byBlcnJvcjsKKwl9CisJcmVzdWx0ID0gd2FpdF9ldmVudF90aW1lb3V0KGkyNDAwbS0+c3RhdGVfd3EsCisJCQkJICAgIGkyNDAwbS0+c3RhdGUgIT0gSTI0MDBNX1NTX0lETEUsIDUgKiBIWik7CisJaWYgKHJlc3VsdCA9PSAwKQorCQlyZXN1bHQgPSAtRVRJTUVET1VUOworCWlmIChyZXN1bHQgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAiV0FLRSZUWDogZXJyb3Igd2FpdGluZyBmb3IgZGV2aWNlIHRvIGV4aXQgSURMRTogIgorCQkJIiVkXG4iLCByZXN1bHQpOworCQlnb3RvIGVycm9yOworCX0KKwltc2xlZXAoMjApOwkvKiBkZXZpY2Ugc3RpbGwgbmVlZHMgc29tZSB0aW1lIG9yIGl0IGRyb3BzIGl0ICovCisJcmVzdWx0ID0gaTI0MDBtX3R4KGkyNDAwbSwgc2tiLT5kYXRhLCBza2ItPmxlbiwgSTI0MDBNX1BUX0RBVEEpOworCW5ldGlmX3dha2VfcXVldWUoaTI0MDBtLT53aW1heF9kZXYubmV0X2Rldik7CitlcnJvcjoKKwlrZnJlZV9za2Ioc2tiKTsJLyogcmVmY291bnQgdHJhbnNmZXJyZWQgYnkgX2hhcmRfc3RhcnRfeG1pdCgpICovCitvdXRfcHV0OgorCWkyNDAwbV9wdXQoaTI0MDBtKTsKKwlkX2ZuZW5kKDMsIGRldiwgIih3cyAlcCBpMjQwMG0gJXAgc2tiICVwKSA9IHZvaWQgWyVkXVxuIiwKKwkJd3MsIGkyNDAwbSwgc2tiLCByZXN1bHQpOworfQorCisKKy8qCisgKiBQcmVwYXJlIHRoZSBkYXRhIHBheWxvYWQgVFggaGVhZGVyCisgKgorICogVGhlIGkyNDAwbSBleHBlY3RzIGEgNCBieXRlIGhlYWRlciBpbiBmcm9udCBvZiBhIGRhdGEgcGFja2V0LgorICoKKyAqIEJlY2F1c2Ugd2UgcHJldGVuZCB0byBiZSBhbiBldGhlcm5ldCBkZXZpY2UsIHRoaXMgcGFja2V0IGNvbWVzIHdpdGgKKyAqIGFuIGV0aGVybmV0IGhlYWRlci4gUHVsbCBpdCBhbmQgcHVzaCBvdXIgaGVhZGVyLgorICovCitzdGF0aWMKK3ZvaWQgaTI0MDBtX3R4X3ByZXBfaGVhZGVyKHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGkyNDAwbV9wbF9kYXRhX2hkciAqcGxfaGRyOworCXNrYl9wdWxsKHNrYiwgRVRIX0hMRU4pOworCXBsX2hkciA9IChzdHJ1Y3QgaTI0MDBtX3BsX2RhdGFfaGRyICopIHNrYl9wdXNoKHNrYiwgc2l6ZW9mKCpwbF9oZHIpKTsKKwlwbF9oZHItPnJlc2VydmVkID0gMDsKK30KKworCisvKgorICogVFggYW4gc2tiIHRvIGFuIGlkbGUgZGV2aWNlCisgKgorICogV2hlbiB0aGUgZGV2aWNlIGlzIGluIGJhc2VzdGF0aW9uLWlkbGUgbW9kZSwgd2UgbmVlZCB0byB3YWtlIGl0IHVwCisgKiBhbmQgdGhlbiBUWC4gU28gd2UgcXVldWUgYSB3b3JrX3N0cnVjdCBmb3IgZG9pbmcgc28uCisgKgorICogV2UgbmVlZCB0byBnZXQgYW4gZXh0cmEgcmVmIGZvciB0aGUgc2tiIChzbyBpdCBpcyBub3QgZHJvcHBlZCksIGFzCisgKiB3ZWxsIGFzIGJlIGNhcmVmdWwgbm90IHRvIHF1ZXVlIG1vcmUgdGhhbiBvbmUgcmVxdWVzdCAod29uJ3QgaGVscAorICogYXQgYWxsKS4gSWYgbW9yZSB0aGFuIG9uZSByZXF1ZXN0IGNvbWVzIG9yIHRoZXJlIGFyZSBlcnJvcnMsIHdlCisgKiBqdXN0IGRyb3AgdGhlIHBhY2tldHMgKHNlZSBpMjQwMG1faGFyZF9zdGFydF94bWl0KCkpLgorICovCitzdGF0aWMKK2ludCBpMjQwMG1fbmV0X3dha2VfdHgoc3RydWN0IGkyNDAwbSAqaTI0MDBtLCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiwKKwkJICAgICAgIHN0cnVjdCBza19idWZmICpza2IpCit7CisJaW50IHJlc3VsdDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBpMjQwMG1fZGV2KGkyNDAwbSk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWRfZm5zdGFydCgzLCBkZXYsICIoc2tiICVwIG5ldF9kZXYgJXApXG4iLCBza2IsIG5ldF9kZXYpOworCWlmIChuZXRfcmF0ZWxpbWl0KCkpIHsKKwkJZF9wcmludGYoMywgZGV2LCAiV0FLRSZORVRUWDogIgorCQkJICJza2IgJXAgc2VuZGluZyAlZCBieXRlcyB0byByYWRpb1xuIiwKKwkJCSBza2IsIHNrYi0+bGVuKTsKKwkJZF9kdW1wKDQsIGRldiwgc2tiLT5kYXRhLCBza2ItPmxlbik7CisJfQorCS8qIFdlIGhvbGQgYSByZWYgY291bnQgZm9yIGkyNDAwbSBhbmQgc2tiLCBzbyB3aGVuCisJICogc3RvcHBpbmcoKSB0aGUgZGV2aWNlLCB3ZSBuZWVkIHRvIGNhbmNlbCB0aGF0IHdvcmsKKwkgKiBhbmQgaWYgcGVuZGluZywgcmVsZWFzZSB0aG9zZSByZXNvdXJjZXMuICovCisJcmVzdWx0ID0gMDsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaTI0MDBtLT50eF9sb2NrLCBmbGFncyk7CisJaWYgKCF3b3JrX3BlbmRpbmcoJmkyNDAwbS0+d2FrZV90eF93cykpIHsKKwkJbmV0aWZfc3RvcF9xdWV1ZShuZXRfZGV2KTsKKwkJaTI0MDBtX2dldChpMjQwMG0pOworCQlpMjQwMG0tPndha2VfdHhfc2tiID0gc2tiX2dldChza2IpOwkvKiB0cmFuc2ZlciByZWYgY291bnQgKi8KKwkJaTI0MDBtX3R4X3ByZXBfaGVhZGVyKHNrYik7CisJCXJlc3VsdCA9IHNjaGVkdWxlX3dvcmsoJmkyNDAwbS0+d2FrZV90eF93cyk7CisJCVdBUk5fT04ocmVzdWx0ID09IDApOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpMjQwMG0tPnR4X2xvY2ssIGZsYWdzKTsKKwlpZiAocmVzdWx0ID09IDApIHsKKwkJLyogWWVzLCB0aGlzIGhhcHBlbnMgZXZlbiBpZiB3ZSBzdG9wcGVkIHRoZQorCQkgKiBxdWV1ZSAtLSBibGFtZSB0aGUgcXVldWUgZGlzY2lwbGluZXMgdGhhdAorCQkgKiBxdWV1ZSB3aXRob3V0IGxvb2tpbmcgLS0gSSBndWVzcyB0aGVyZSBpcyBhIHJlYXNvbgorCQkgKiBmb3IgdGhhdC4gKi8KKwkJaWYgKG5ldF9yYXRlbGltaXQoKSkKKwkJCWRfcHJpbnRmKDEsIGRldiwgIk5FVFRYOiBkZXZpY2UgZXhpdGluZyBpZGxlLCAiCisJCQkJICJkcm9wcGluZyBza2IgJXAsIHF1ZXVlIHJ1bm5pbmcgJWRcbiIsCisJCQkJIHNrYiwgbmV0aWZfcXVldWVfc3RvcHBlZChuZXRfZGV2KSk7CisJCXJlc3VsdCA9IC1FQlVTWTsKKwl9CisJZF9mbmVuZCgzLCBkZXYsICIoc2tiICVwIG5ldF9kZXYgJXApID0gJWRcbiIsIHNrYiwgbmV0X2RldiwgcmVzdWx0KTsKKwlyZXR1cm4gcmVzdWx0OworfQorCisKKy8qCisgKiBUcmFuc21pdCBhIHBhY2tldCB0byB0aGUgYmFzZSBzdGF0aW9uIG9uIGJlaGFsZiBvZiB0aGUgbmV0d29yayBzdGFjay4KKyAqCisgKiBSZXR1cm5zOiAwIGlmIG9rLCA8IDAgZXJybm8gY29kZSBvbiBlcnJvci4KKyAqCisgKiBXZSBuZWVkIHRvIHB1bGwgdGhlIGV0aGVybmV0IGhlYWRlciBhbmQgYWRkIHRoZSBoYXJkd2FyZSBoZWFkZXIsCisgKiB3aGljaCBpcyBjdXJyZW50bHkgc2V0IHRvIGFsbCB6ZXJvZXMgYW5kIHJlc2VydmVkLgorICovCitzdGF0aWMKK2ludCBpMjQwMG1fbmV0X3R4KHN0cnVjdCBpMjQwMG0gKmkyNDAwbSwgc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYsCisJCSAgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlpbnQgcmVzdWx0OworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGkyNDAwbV9kZXYoaTI0MDBtKTsKKworCWRfZm5zdGFydCgzLCBkZXYsICIoaTI0MDBtICVwIG5ldF9kZXYgJXAgc2tiICVwKVxuIiwKKwkJICBpMjQwMG0sIG5ldF9kZXYsIHNrYik7CisJLyogRklYTUU6IGNoZWNrIGV0aCBoZHIsIG9ubHkgSVB2NCBpcyByb3V0ZWQgYnkgdGhlIGRldmljZSBhcyBvZiBub3cgKi8KKwluZXRfZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJaTI0MDBtX3R4X3ByZXBfaGVhZGVyKHNrYik7CisJZF9wcmludGYoMywgZGV2LCAiTkVUVFg6IHNrYiAlcCBzZW5kaW5nICVkIGJ5dGVzIHRvIHJhZGlvXG4iLAorCQkgc2tiLCBza2ItPmxlbik7CisJZF9kdW1wKDQsIGRldiwgc2tiLT5kYXRhLCBza2ItPmxlbik7CisJcmVzdWx0ID0gaTI0MDBtX3R4KGkyNDAwbSwgc2tiLT5kYXRhLCBza2ItPmxlbiwgSTI0MDBNX1BUX0RBVEEpOworCWRfZm5lbmQoMywgZGV2LCAiKGkyNDAwbSAlcCBuZXRfZGV2ICVwIHNrYiAlcCkgPSAlZFxuIiwKKwkJaTI0MDBtLCBuZXRfZGV2LCBza2IsIHJlc3VsdCk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworCisvKgorICogVHJhbnNtaXQgYSBwYWNrZXQgdG8gdGhlIGJhc2Ugc3RhdGlvbiBvbiBiZWhhbGYgb2YgdGhlIG5ldHdvcmsgc3RhY2sKKyAqCisgKgorICogUmV0dXJuczogTkVUREVWX1RYX09LIChhbHdheXMsIGV2ZW4gaW4gY2FzZSBvZiBlcnJvcikKKyAqCisgKiBJbiBjYXNlIG9mIGVycm9yLCB3ZSBqdXN0IGRyb3AgaXQuIFJlYXNvbnM6CisgKgorICogIC0gd2UgYWRkIGEgaHcgaGVhZGVyIHRvIGVhY2ggc2tiLCBhbmQgaWYgdGhlIG5ldHdvcmsgc3RhY2sKKyAqICAgIHJldHJpZXMsIHdlIGhhdmUgbm8gd2F5IHRvIGtub3cgaWYgdGhhdCBza2IgaGFzIGl0IG9yIG5vdC4KKyAqCisgKiAgLSBuZXR3b3JrIHByb3RvY29scyBoYXZlIHRoZWlyIG93biBkcm9wLXJlY292ZXJ5IG1lY2hhbmlzbXMKKyAqCisgKiAgLSB0aGVyZSBpcyBub3QgbXVjaCBlbHNlIHdlIGNhbiBkbworICoKKyAqIElmIHRoZSBkZXZpY2UgaXMgaWRsZSwgd2UgbmVlZCB0byB3YWtlIGl0IHVwOyB0aGF0IGlzIGFuIG9wZXJhdGlvbgorICogdGhhdCB3aWxsIHNsZWVwLiBTZWUgaTI0MDBtX25ldF93YWtlX3R4KCkgZm9yIGRldGFpbHMuCisgKi8KK3N0YXRpYworaW50IGkyNDAwbV9oYXJkX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSAgIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2KQoreworCWludCByZXN1bHQ7CisJc3RydWN0IGkyNDAwbSAqaTI0MDBtID0gbmV0X2Rldl90b19pMjQwMG0obmV0X2Rldik7CisJc3RydWN0IGRldmljZSAqZGV2ID0gaTI0MDBtX2RldihpMjQwMG0pOworCisJZF9mbnN0YXJ0KDMsIGRldiwgIihza2IgJXAgbmV0X2RldiAlcClcbiIsIHNrYiwgbmV0X2Rldik7CisJaWYgKGkyNDAwbS0+c3RhdGUgPT0gSTI0MDBNX1NTX0lETEUpCisJCXJlc3VsdCA9IGkyNDAwbV9uZXRfd2FrZV90eChpMjQwMG0sIG5ldF9kZXYsIHNrYik7CisJZWxzZQorCQlyZXN1bHQgPSBpMjQwMG1fbmV0X3R4KGkyNDAwbSwgbmV0X2Rldiwgc2tiKTsKKwlpZiAocmVzdWx0IDwgIDApCisJCW5ldF9kZXYtPnN0YXRzLnR4X2Ryb3BwZWQrKzsKKwllbHNlIHsKKwkJbmV0X2Rldi0+c3RhdHMudHhfcGFja2V0cysrOworCQluZXRfZGV2LT5zdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKKwl9CisJa2ZyZWVfc2tiKHNrYik7CisJcmVzdWx0ID0gTkVUREVWX1RYX09LOworCWRfZm5lbmQoMywgZGV2LCAiKHNrYiAlcCBuZXRfZGV2ICVwKSA9ICVkXG4iLCBza2IsIG5ldF9kZXYsIHJlc3VsdCk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworCitzdGF0aWMKK2ludCBpMjQwMG1fY2hhbmdlX210dShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiwgaW50IG5ld19tdHUpCit7CisJaW50IHJlc3VsdDsKKwlzdHJ1Y3QgaTI0MDBtICppMjQwMG0gPSBuZXRfZGV2X3RvX2kyNDAwbShuZXRfZGV2KTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBpMjQwMG1fZGV2KGkyNDAwbSk7CisKKwlpZiAobmV3X210dSA+PSBJMjQwME1fTUFYX01UVSkgeworCQlkZXZfZXJyKGRldiwgIkNhbm5vdCBjaGFuZ2UgTVRVIHRvICVkIChtYXggaXMgJWQpXG4iLAorCQkJbmV3X210dSwgSTI0MDBNX01BWF9NVFUpOworCQlyZXN1bHQgPSAtRUlOVkFMOworCX0gZWxzZSB7CisJCW5ldF9kZXYtPm10dSA9IG5ld19tdHU7CisJCXJlc3VsdCA9IDA7CisJfQorCXJldHVybiByZXN1bHQ7Cit9CisKKworc3RhdGljCit2b2lkIGkyNDAwbV90eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2KQoreworCS8qCisJICogV2UgbWlnaHQgd2FudCB0byBraWNrIHRoZSBkZXZpY2UKKwkgKgorCSAqIFRoZXJlIGlzIG5vdCBtdWNoIHdlIGNhbiBkbyB0aG91Z2gsIGFzIHRoZSBkZXZpY2UgcmVxdWlyZXMKKwkgKiB0aGF0IHdlIHNlbmQgdGhlIGRhdGEgYWdncmVnYXRlZC4gQnkgdGhlIHRpbWUgd2UgcmVjZWl2ZQorCSAqIHRoaXMsIHRoZXJlIG1pZ2h0IGJlIGRhdGEgcGVuZGluZyB0byBiZSBzZW50IG9yIG5vdC4uLgorCSAqLworCW5ldF9kZXYtPnN0YXRzLnR4X2Vycm9ycysrOworCXJldHVybjsKK30KKworCisvKgorICogQ3JlYXRlIGEgZmFrZSBldGhlcm5ldCBoZWFkZXIKKyAqCisgKiBGb3IgZW11bGF0aW5nIGFuIGV0aGVybmV0IGRldmljZSwgZXZlcnkgcmVjZWl2ZWQgSVAgaGVhZGVyIGhhcyB0bworICogYmUgcHJlZml4ZWQgd2l0aCBhbiBldGhlcm5ldCBoZWFkZXIuCisgKgorICogV2hhdCB3ZSByZWNlaXZlIGhhcyAocG90ZW50aWFsbHkpIG1hbnkgSVAgcGFja2V0cyBjb25jYXRlbmF0ZWQgd2l0aAorICogbm8gRVRIX0hMRU4gYnl0ZXMgcHJlZml4ZWQuIFRodXMgdGhlcmUgaXMgbm8gc3BhY2UgZm9yIGFuIGV0aAorICogaGVhZGVyLgorICoKKyAqIFdlIHdvdWxkIGhhdmUgdG8gcmVhbGxvY2F0ZSBvciBkbyB1Z2x5IGZyYWdtZW50IHRyaWNrcyBpbiBvcmRlciB0bworICogYWRkIGl0LgorICoKKyAqIEJ1dCB3aGF0IHdlIGRvIGlzIHVzZSB0aGUgaGVhZGVyIHNwYWNlIG9mIHRoZSBSWCB0cmFuc2FjdGlvbgorICogKCptc2dfaGRyKSBhcyB3ZSBkb24ndCBuZWVkIGl0IGFueW1vcmU7IHRoZW4gd2UnbGwgcG9pbnQgYWxsIHRoZQorICogZGF0YSBza2JzIHRoZXJlLCBhcyB0aGV5IHNoYXJlIHRoZSBzYW1lIGJhY2tpbmcgc3RvcmUuCisgKgorICogV2Ugb25seSBzdXBwb3J0IElQdjQgZm9yIHYzIGZpcm13YXJlLgorICovCitzdGF0aWMKK3ZvaWQgaTI0MDBtX3J4X2Zha2VfZXRoX2hlYWRlcihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiwKKwkJCSAgICAgICB2b2lkICpfZXRoX2hkcikKK3sKKwlzdHJ1Y3QgZXRoaGRyICpldGhfaGRyID0gX2V0aF9oZHI7CisKKwltZW1jcHkoZXRoX2hkci0+aF9kZXN0LCBuZXRfZGV2LT5kZXZfYWRkciwgc2l6ZW9mKGV0aF9oZHItPmhfZGVzdCkpOworCW1lbXNldChldGhfaGRyLT5oX3NvdXJjZSwgMCwgc2l6ZW9mKGV0aF9oZHItPmhfZGVzdCkpOworCWV0aF9oZHItPmhfcHJvdG8gPSBfX2NvbnN0YW50X2NwdV90b19iZTE2KEVUSF9QX0lQKTsKK30KKworCisvKgorICogaTI0MDBtX25ldF9yeCAtIHBhc3MgYSBuZXR3b3JrIHBhY2tldCB0byB0aGUgc3RhY2sKKyAqCisgKiBAaTI0MDBtOiBkZXZpY2UgaW5zdGFuY2UKKyAqIEBza2Jfcng6IHRoZSBza2Igd2hlcmUgdGhlIGJ1ZmZlciBwb2ludGVkIHRvIGJ5IEBidWYgaXMKKyAqIEBpOiAxIGlmIHBheWxvYWQgaXMgdGhlIG9ubHkgb25lCisgKiBAYnVmOiBwb2ludGVyIHRvIHRoZSBidWZmZXIgY29udGFpbmluZyB0aGUgZGF0YQorICogQGxlbjogYnVmZmVyJ3MgbGVuZ3RoCisgKgorICogV2UganVzdCBjbG9uZSB0aGUgc2tiIGFuZCBzZXQgaXQgdXAgc28gdGhhdCBpdCdzIHNrYi0+ZGF0YSBwb2ludGVyCisgKiBwb2ludHMgdG8gImJ1ZiIgYW5kIGl0J3MgbGVuZ3RoLgorICoKKyAqIE5vdGUgdGhhdCBpZiB0aGUgcGF5bG9hZCBpcyB0aGUgbGFzdCAob3IgdGhlIG9ubHkgb25lKSBpbiBhCisgKiBtdWx0aS1wYXlsb2FkIG1lc3NhZ2UsIHdlIGRvbid0IGNsb25lIHRoZSBTS0IgYnV0IGp1c3QgcmV1c2UgaXQuCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBub3JtYWxseSBydW4gZnJvbSBhIHRocmVhZCBjb250ZXh0LiBIb3dldmVyLCB3ZQorICogc3RpbGwgdXNlIG5ldGlmX3J4KCkgaW5zdGVhZCBvZiBuZXRpZl9yZWNlaXZlX3NrYigpIGFzIHdhcworICogcmVjb21tZW5kZWQgaW4gdGhlIG1haWxpbmcgbGlzdC4gUmVhc29uIGlzIGluIHNvbWUgc3RyZXNzIHRlc3RzCisgKiB3aGVuIHNlbmRpbmcvcmVjZWl2aW5nIGEgbG90IG9mIGRhdGEgd2Ugc2VlbSB0byBoaXQgYSBzb2Z0bG9jayBpbgorICogdGhlIGtlcm5lbCdzIFRDUCBpbXBsZW1lbnRhdGlvbiBbYXJvdWRuIHRjcF9kZWxheV90aW1lcigpXS4gVXNpbmcKKyAqIG5ldGlmX3J4KCkgdG9vayBjYXJlIG9mIHRoZSBpc3N1ZS4KKyAqCisgKiBUaGlzIGlzLCBvZiBjb3Vyc2UsIHN0aWxsIG9wZW4gdG8gZG8gbW9yZSByZXNlYXJjaCBvbiB3aHkgcnVubmluZworICogd2l0aCBuZXRpZl9yZWNlaXZlX3NrYigpIGhpdHMgdGhpcyBzb2Z0bG9jay4gRklYTUUuCisgKgorICogRklYTUU6IGN1cnJlbnRseSB3ZSBkb24ndCBkbyBhbnkgZWZmb3J0cyBhdCBkaXN0aW5ndWlzaGluZyBpZiB3aGF0CisgKiB3ZSBnb3Qgd2FzIGFuIElQdjQgb3IgSVB2NiBoZWFkZXIsIHRvIHNldHVwIHRoZSBwcm90b2NvbCBmaWVsZAorICogY29ycmVjdGx5LgorICovCit2b2lkIGkyNDAwbV9uZXRfcngoc3RydWN0IGkyNDAwbSAqaTI0MDBtLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiX3J4LAorCQkgICB1bnNpZ25lZCBpLCBjb25zdCB2b2lkICpidWYsIGludCBidWZfbGVuKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2ID0gaTI0MDBtLT53aW1heF9kZXYubmV0X2RldjsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBpMjQwMG1fZGV2KGkyNDAwbSk7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCWRfZm5zdGFydCgyLCBkZXYsICIoaTI0MDBtICVwIGJ1ZiAlcCBidWZfbGVuICVkKVxuIiwKKwkJICBpMjQwMG0sIGJ1ZiwgYnVmX2xlbik7CisJaWYgKGkpIHsKKwkJc2tiID0gc2tiX2dldChza2JfcngpOworCQlkX3ByaW50ZigyLCBkZXYsICJSWDogcmV1c2luZyBmaXJzdCBwYXlsb2FkIHNrYiAlcFxuIiwgc2tiKTsKKwkJc2tiX3B1bGwoc2tiLCBidWYgLSAodm9pZCAqKSBza2ItPmRhdGEpOworCQlza2JfdHJpbShza2IsICh2b2lkICopIHNrYl9lbmRfcG9pbnRlcihza2IpIC0gYnVmKTsKKwl9IGVsc2UgeworCQkvKiBZZXMsIHRoaXMgaXMgYmFkIC0tIGEgbG90IG9mIG92ZXJoZWFkIC0tIHNlZQorCQkgKiBjb21tZW50cyBhdCB0aGUgdG9wIG9mIHRoZSBmaWxlICovCisJCXNrYiA9IF9fbmV0ZGV2X2FsbG9jX3NrYihuZXRfZGV2LCBidWZfbGVuLCBHRlBfS0VSTkVMKTsKKwkJaWYgKHNrYiA9PSBOVUxMKSB7CisJCQlkZXZfZXJyKGRldiwgIk5FVFJYOiBubyBtZW1vcnkgdG8gcmVhbGxvYyBza2JcbiIpOworCQkJbmV0X2Rldi0+c3RhdHMucnhfZHJvcHBlZCsrOworCQkJZ290byBlcnJvcl9za2JfcmVhbGxvYzsKKwkJfQorCQltZW1jcHkoc2tiX3B1dChza2IsIGJ1Zl9sZW4pLCBidWYsIGJ1Zl9sZW4pOworCX0KKwlpMjQwMG1fcnhfZmFrZV9ldGhfaGVhZGVyKGkyNDAwbS0+d2ltYXhfZGV2Lm5ldF9kZXYsCisJCQkJICBza2ItPmRhdGEgLSBFVEhfSExFTik7CisJc2tiX3NldF9tYWNfaGVhZGVyKHNrYiwgLUVUSF9ITEVOKTsKKwlza2ItPmRldiA9IGkyNDAwbS0+d2ltYXhfZGV2Lm5ldF9kZXY7CisJc2tiLT5wcm90b2NvbCA9IGh0b25zKEVUSF9QX0lQKTsKKwluZXRfZGV2LT5zdGF0cy5yeF9wYWNrZXRzKys7CisJbmV0X2Rldi0+c3RhdHMucnhfYnl0ZXMgKz0gYnVmX2xlbjsKKwlkX3ByaW50ZigzLCBkZXYsICJORVRSWDogcmVjZWl2aW5nICVkIGJ5dGVzIHRvIG5ldHdvcmsgc3RhY2tcbiIsCisJCWJ1Zl9sZW4pOworCWRfZHVtcCg0LCBkZXYsIGJ1ZiwgYnVmX2xlbik7CisJbmV0aWZfcnhfbmkoc2tiKTsJLyogc2VlIG5vdGVzIGluIGZ1bmN0aW9uIGhlYWRlciAqLworZXJyb3Jfc2tiX3JlYWxsb2M6CisJZF9mbmVuZCgyLCBkZXYsICIoaTI0MDBtICVwIGJ1ZiAlcCBidWZfbGVuICVkKSA9IHZvaWRcbiIsCisJCWkyNDAwbSwgYnVmLCBidWZfbGVuKTsKK30KKworCisvKioKKyAqIGkyNDAwbV9uZXRkZXZfc2V0dXAgLSBTZXR1cCBzZXR1cCBAbmV0X2RldidzIGkyNDAwbSBwcml2YXRlIGRhdGEKKyAqCisgKiBDYWxsZWQgYnkgYWxsb2NfbmV0ZGV2KCkKKyAqLwordm9pZCBpMjQwMG1fbmV0ZGV2X3NldHVwKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2KQoreworCWRfZm5zdGFydCgzLCBOVUxMLCAiKG5ldF9kZXYgJXApXG4iLCBuZXRfZGV2KTsKKwlldGhlcl9zZXR1cChuZXRfZGV2KTsKKwluZXRfZGV2LT5tdHUgPSBJMjQwME1fTUFYX01UVTsKKwluZXRfZGV2LT50eF9xdWV1ZV9sZW4gPSBJMjQwME1fVFhfUUxFTjsKKwluZXRfZGV2LT5mZWF0dXJlcyA9CisJCSAgTkVUSUZfRl9WTEFOX0NIQUxMRU5HRUQKKwkJfCBORVRJRl9GX0hJR0hETUE7CisJbmV0X2Rldi0+ZmxhZ3MgPQorCQlJRkZfTk9BUlAJCS8qIGkyNDAwbSBpcyBhcHVyZSBJUCBkZXZpY2UgKi8KKwkJJiAofklGRl9CUk9BRENBU1QJLyogaTI0MDBtIGlzIFAyUCAqLworCQkgICAmIH5JRkZfTVVMVElDQVNUKTsKKwluZXRfZGV2LT53YXRjaGRvZ190aW1lbyA9IEkyNDAwTV9UWF9USU1FT1VUOworCW5ldF9kZXYtPm9wZW4gPSBpMjQwMG1fb3BlbjsKKwluZXRfZGV2LT5zdG9wID0gaTI0MDBtX3N0b3A7CisJbmV0X2Rldi0+aGFyZF9zdGFydF94bWl0ID0gaTI0MDBtX2hhcmRfc3RhcnRfeG1pdDsKKwluZXRfZGV2LT5jaGFuZ2VfbXR1ID0gaTI0MDBtX2NoYW5nZV9tdHU7CisJbmV0X2Rldi0+dHhfdGltZW91dCA9IGkyNDAwbV90eF90aW1lb3V0OworCWRfZm5lbmQoMywgTlVMTCwgIihuZXRfZGV2ICVwKSA9IHZvaWRcbiIsIG5ldF9kZXYpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoaTI0MDBtX25ldGRldl9zZXR1cCk7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS9vcC1yZmtpbGwuYyBiL2RyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS9vcC1yZmtpbGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODdlYzU4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2ltYXgvaTI0MDBtL29wLXJma2lsbC5jCkBAIC0wLDAgKzEsMjA3IEBACisvKgorICogSW50ZWwgV2lyZWxlc3MgV2lNQVggQ29ubmVjdGlvbiAyNDAwbQorICogSW1wbGVtZW50IGJhY2tlbmQgZm9yIHRoZSBXaU1BWCBzdGFjayByZmtpbGwgc3VwcG9ydAorICoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBJbnRlbCBDb3Jwb3JhdGlvbiA8bGludXgtd2ltYXhAaW50ZWwuY29tPgorICogSW5ha3kgUGVyZXotR29uemFsZXogPGluYWt5LnBlcmV6LWdvbnphbGV6QGludGVsLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EuCisgKgorICoKKyAqIFRoZSBXaU1BWCBrZXJuZWwgc3RhY2sgaW50ZWdyYXRlcyBpbnRvIFJGLUtpbGwgYW5kIGtlZXBzIHRoZQorICogc3dpdGNoZXMncyBzdGF0dXMuIFdlIGp1c3QgbmVlZCB0bzoKKyAqCisgKiAtIHJlcG9ydCBjaGFuZ2VzIGluIHRoZSBIVyBSRiBLaWxsIHN3aXRjaCBbd2l0aAorICogICB3aW1heF9yZmtpbGxfe3N3LGh3fV9yZXBvcnQoKSwgd2hpY2ggaGFwcGVucyB3aGVuIHdlIGRldGVjdCB0aG9zZQorICogICBpbmRpY2F0aW9ucyBjb21pbmcgdGhyb3VnaCBoYXJkd2FyZSByZXBvcnRzXS4gV2UgYWxzbyBkbyBpdCBvbgorICogICBpbml0aWFsaXphdGlvbiB0byBsZXQgdGhlIHN0YWNrIGtub3cgdGhlIGludGlhbCBIVyBzdGF0ZS4KKyAqCisgKiAtIGltcGxlbWVudCBpbmRpY2F0aW9ucyBmcm9tIHRoZSBzdGFjayB0byBjaGFuZ2UgdGhlIFNXIFJGIEtpbGwKKyAqICAgc3dpdGNoIChjb21pbmcgZnJvbSBzeXNmcywgdGhlIHdpbWF4IHN0YWNrIG9yIHVzZXIgc3BhY2UpLgorICovCisjaW5jbHVkZSAiaTI0MDBtLmgiCisjaW5jbHVkZSA8bGludXgvd2ltYXgvaTI0MDBtLmg+CisKKworCisjZGVmaW5lIERfU1VCTU9EVUxFIHJma2lsbAorI2luY2x1ZGUgImRlYnVnLWxldmVscy5oIgorCisvKgorICogUmV0dXJuIHRydWUgaWYgdGhlIGkyNDAwbSByYWRpbyBpcyBpbiB0aGUgcmVxdWVzdGVkIHdpbWF4X3JmX3N0YXRlIHN0YXRlCisgKgorICovCitzdGF0aWMKK2ludCBpMjQwMG1fcmFkaW9faXMoc3RydWN0IGkyNDAwbSAqaTI0MDBtLCBlbnVtIHdpbWF4X3JmX3N0YXRlIHN0YXRlKQoreworCWlmIChzdGF0ZSA9PSBXSU1BWF9SRl9PRkYpCisJCXJldHVybiBpMjQwMG0tPnN0YXRlID09IEkyNDAwTV9TU19SRl9PRkYKKwkJCXx8IGkyNDAwbS0+c3RhdGUgPT0gSTI0MDBNX1NTX1JGX1NIVVRET1dOOworCWVsc2UgaWYgKHN0YXRlID09IFdJTUFYX1JGX09OKQorCQkvKiBzdGF0ZSA9PSBXSU1BWF9SRl9PTiAqLworCQlyZXR1cm4gaTI0MDBtLT5zdGF0ZSAhPSBJMjQwME1fU1NfUkZfT0ZGCisJCQkmJiBpMjQwMG0tPnN0YXRlICE9IEkyNDAwTV9TU19SRl9TSFVURE9XTjsKKwllbHNlCisJCUJVRygpOworfQorCisKKy8qCisgKiBXaU1BWCBzdGFjayBvcGVyYXRpb246IGltcGxlbWVudCBTVyBSRktpbGwgdG9nZ2xpbmcKKyAqCisgKiBAd2ltYXhfZGV2OiBkZXZpY2UgZGVzY3JpcHRvcgorICogQHNrYjogc2tiIHdoZXJlIHRoZSBtZXNzYWdlIGhhcyBiZWVuIHJlY2VpdmVkOyBza2ItPmRhdGEgaXMKKyAqICAgICAgIGV4cGVjdGVkIHRvIHBvaW50IHRvIHRoZSBtZXNzYWdlIHBheWxvYWQuCisgKiBAZ2VubF9pbmZvOiBwYXNzZWQgYnkgdGhlIGdlbmVyaWMgbmV0bGluayBsYXllcgorICoKKyAqIEdlbmVyaWMgTmV0bGluayB3aWxsIGNhbGwgdGhpcyBmdW5jdGlvbiB3aGVuIGEgbWVzc2FnZSBpcyBzZW50IGZyb20KKyAqIHVzZXJzcGFjZSB0byBjaGFuZ2UgdGhlIHNvZnR3YXJlIFJGLUtpbGwgc3dpdGNoIHN0YXR1cy4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgc2V0IHRoZSBkZXZpY2UncyBzb2Z3YXJlIFJGLUtpbGwgc3dpdGNoIHN0YXRlIHRvCisgKiBtYXRjaCB3aGF0IGlzIHJlcXVlc3RlZC4KKyAqCisgKiBOT1RFOiB0aGUgaTI0MDBtIGhhcyBhIHN0cmljdCBzdGF0ZSBtYWNoaW5lOyB3ZSBjYW4gb25seSBzZXQgdGhlCisgKiAgICAgICBSRi1LaWxsIHN3aXRjaCB3aGVuIGl0IGlzIG9uLCB0aGUgSFcgUkYtS2lsbCBpcyBvbiBhbmQgdGhlCisgKiAgICAgICBkZXZpY2UgaXMgaW5pdGlhbGl6ZWQuIFNvIHdlIGlnbm9yZSBlcnJvcnMgc3RlYW1pbmcgZnJvbSBub3QKKyAqICAgICAgIGJlaW5nIGluIHRoZSByaWdodCBzdGF0ZSAoLUVJTFNFUSkuCisgKi8KK2ludCBpMjQwMG1fb3BfcmZraWxsX3N3X3RvZ2dsZShzdHJ1Y3Qgd2ltYXhfZGV2ICp3aW1heF9kZXYsCisJCQkgICAgICAgZW51bSB3aW1heF9yZl9zdGF0ZSBzdGF0ZSkKK3sKKwlpbnQgcmVzdWx0OworCXN0cnVjdCBpMjQwMG0gKmkyNDAwbSA9IHdpbWF4X2Rldl90b19pMjQwMG0od2ltYXhfZGV2KTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBpMjQwMG1fZGV2KGkyNDAwbSk7CisJc3RydWN0IHNrX2J1ZmYgKmFja19za2I7CisJc3RydWN0IHsKKwkJc3RydWN0IGkyNDAwbV9sM2w0X2hkciBoZHI7CisJCXN0cnVjdCBpMjQwMG1fdGx2X3JmX29wZXJhdGlvbiBzd19yZjsKKwl9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpICpjbWQ7CisJY2hhciBzdHJlcnJbMzJdOworCisJZF9mbnN0YXJ0KDQsIGRldiwgIih3aW1heF9kZXYgJXAgc3RhdGUgJWQpXG4iLCB3aW1heF9kZXYsIHN0YXRlKTsKKworCXJlc3VsdCA9IC1FTk9NRU07CisJY21kID0ga3phbGxvYyhzaXplb2YoKmNtZCksIEdGUF9LRVJORUwpOworCWlmIChjbWQgPT0gTlVMTCkKKwkJZ290byBlcnJvcl9hbGxvYzsKKwljbWQtPmhkci50eXBlID0gY3B1X3RvX2xlMTYoSTI0MDBNX01UX0NNRF9SRl9DT05UUk9MKTsKKwljbWQtPmhkci5sZW5ndGggPSBzaXplb2YoY21kLT5zd19yZik7CisJY21kLT5oZHIudmVyc2lvbiA9IGNwdV90b19sZTE2KEkyNDAwTV9MM0w0X1ZFUlNJT04pOworCWNtZC0+c3dfcmYuaGRyLnR5cGUgPSBjcHVfdG9fbGUxNihJMjQwME1fVExWX1JGX09QRVJBVElPTik7CisJY21kLT5zd19yZi5oZHIubGVuZ3RoID0gY3B1X3RvX2xlMTYoc2l6ZW9mKGNtZC0+c3dfcmYuc3RhdHVzKSk7CisJc3dpdGNoIChzdGF0ZSkgeworCWNhc2UgV0lNQVhfUkZfT0ZGOgkvKiBSRktJTEwgT04sIHJhZGlvIE9GRiAqLworCQljbWQtPnN3X3JmLnN0YXR1cyA9IGNwdV90b19sZTMyKDIpOworCQlicmVhazsKKwljYXNlIFdJTUFYX1JGX09OOgkvKiBSRktJTEwgT0ZGLCByYWRpbyBPTiAqLworCQljbWQtPnN3X3JmLnN0YXR1cyA9IGNwdV90b19sZTMyKDEpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwl9CisKKwlhY2tfc2tiID0gaTI0MDBtX21zZ190b19kZXYoaTI0MDBtLCBjbWQsIHNpemVvZigqY21kKSk7CisJcmVzdWx0ID0gUFRSX0VSUihhY2tfc2tiKTsKKwlpZiAoSVNfRVJSKGFja19za2IpKSB7CisJCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIGlzc3VlICdSRiBDb250cm9sJyBjb21tYW5kOiAlZFxuIiwKKwkJCXJlc3VsdCk7CisJCWdvdG8gZXJyb3JfbXNnX3RvX2RldjsKKwl9CisJcmVzdWx0ID0gaTI0MDBtX21zZ19jaGVja19zdGF0dXMod2ltYXhfbXNnX2RhdGEoYWNrX3NrYiksCisJCQkJCSBzdHJlcnIsIHNpemVvZihzdHJlcnIpKTsKKwlpZiAocmVzdWx0IDwgMCkgeworCQlkZXZfZXJyKGRldiwgIidSRiBDb250cm9sJyAoMHglMDR4KSBjb21tYW5kIGZhaWxlZDogJWQgLSAlc1xuIiwKKwkJCUkyNDAwTV9NVF9DTURfUkZfQ09OVFJPTCwgcmVzdWx0LCBzdHJlcnIpOworCQlnb3RvIGVycm9yX2NtZDsKKwl9CisKKwkvKiBOb3cgd2Ugd2FpdCBmb3IgdGhlIHN0YXRlIHRvIGNoYW5nZSB0byBSQURJT19PRkYgb3IgUkFESU9fT04gKi8KKwlyZXN1bHQgPSB3YWl0X2V2ZW50X3RpbWVvdXQoCisJCWkyNDAwbS0+c3RhdGVfd3EsIGkyNDAwbV9yYWRpb19pcyhpMjQwMG0sIHN0YXRlKSwKKwkJNSAqIEhaKTsKKwlpZiAocmVzdWx0ID09IDApCisJCXJlc3VsdCA9IC1FVElNRURPVVQ7CisJaWYgKHJlc3VsdCA8IDApCisJCWRldl9lcnIoZGV2LCAiRXJyb3Igd2FpdGluZyBmb3IgZGV2aWNlIHRvIHRvZ2dsZSBSRiBzdGF0ZTogIgorCQkJIiVkXG4iLCByZXN1bHQpOworCXJlc3VsdCA9IDA7CitlcnJvcl9jbWQ6CisJa2ZyZWVfc2tiKGFja19za2IpOworZXJyb3JfbXNnX3RvX2RldjoKK2Vycm9yX2FsbG9jOgorCWRfZm5lbmQoNCwgZGV2LCAiKHdpbWF4X2RldiAlcCBzdGF0ZSAlZCkgPSAlZFxuIiwKKwkJd2ltYXhfZGV2LCBzdGF0ZSwgcmVzdWx0KTsKKwlyZXR1cm4gcmVzdWx0OworfQorCisKKy8qCisgKiBJbmZvcm0gdGhlIFdpTUFYIHN0YWNrIG9mIGNoYW5nZXMgaW4gdGhlIFJGIEtpbGwgc3dpdGNoZXMgcmVwb3J0ZWQKKyAqIGJ5IHRoZSBkZXZpY2UKKyAqCisgKiBAaTI0MDBtOiBkZXZpY2UgZGVzY3JpcHRvcgorICogQHJmc3M6IFRMViBmb3IgUkYgU3dpdGNoZXMgc3RhdHVzOyBhbHJlYWR5IHZhbGlkYXRlZAorICoKKyAqIE5PVEU6IHRoZSByZXBvcnRzIG9uIFJGIHN3aXRjaCBzdGF0dXMgY2Fubm90IGJlIHRydXN0ZWQKKyAqICAgICAgIG9yIHVzZWQgdW50aWwgdGhlIGRldmljZSBpcyBpbiBhIHN0YXRlIG9mIFJBRElPX09GRgorICogICAgICAgb3IgZ3JlYXRlci4KKyAqLwordm9pZCBpMjQwMG1fcmVwb3J0X3Rsdl9yZl9zd2l0Y2hlc19zdGF0dXMoCisJc3RydWN0IGkyNDAwbSAqaTI0MDBtLAorCWNvbnN0IHN0cnVjdCBpMjQwMG1fdGx2X3JmX3N3aXRjaGVzX3N0YXR1cyAqcmZzcykKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBpMjQwMG1fZGV2KGkyNDAwbSk7CisJZW51bSBpMjQwMG1fcmZfc3dpdGNoX3N0YXR1cyBodywgc3c7CisJZW51bSB3aW1heF9zdCB3aW1heF9zdGF0ZTsKKworCXN3ID0gbGUzMl90b19jcHUocmZzcy0+c3dfcmZfc3dpdGNoKTsKKwlodyA9IGxlMzJfdG9fY3B1KHJmc3MtPmh3X3JmX3N3aXRjaCk7CisKKwlkX2Zuc3RhcnQoMywgZGV2LCAiKGkyNDAwbSAlcCByZnNzICVwIFtodyAldSBzdyAldV0pXG4iLAorCQkgIGkyNDAwbSwgcmZzcywgaHcsIHN3KTsKKwkvKiBXZSBvbmx5IHByb2Nlc3Mgcncgc3dpdGNoIGV2ZW5zIHdoZW4gdGhlIGRldmljZSBoYXMgYmVlbgorCSAqIGZ1bGx5IGluaXRpYWxpemVkICovCisJd2ltYXhfc3RhdGUgPSB3aW1heF9zdGF0ZV9nZXQoJmkyNDAwbS0+d2ltYXhfZGV2KTsKKwlpZiAod2ltYXhfc3RhdGUgPCBXSU1BWF9TVF9SQURJT19PRkYpIHsKKwkJZF9wcmludGYoMywgZGV2LCAiaWdub3JpbmcgUkYgc3dpdGNoZXMgcmVwb3J0LCBzdGF0ZSAldVxuIiwKKwkJCSB3aW1heF9zdGF0ZSk7CisJCWdvdG8gb3V0OworCX0KKwlzd2l0Y2ggKHN3KSB7CisJY2FzZSBJMjQwME1fUkZfU1dJVENIX09OOgkvKiBSRiBLaWxsIGRpc2FibGVkIChyYWRpbyBvbikgKi8KKwkJd2ltYXhfcmVwb3J0X3Jma2lsbF9zdygmaTI0MDBtLT53aW1heF9kZXYsIFdJTUFYX1JGX09OKTsKKwkJYnJlYWs7CisJY2FzZSBJMjQwME1fUkZfU1dJVENIX09GRjoJLyogUkYgS2lsbCBlbmFibGVkIChyYWRpbyBvZmYpICovCisJCXdpbWF4X3JlcG9ydF9yZmtpbGxfc3coJmkyNDAwbS0+d2ltYXhfZGV2LCBXSU1BWF9SRl9PRkYpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKGRldiwgIkhXIEJVRz8gVW5rbm93biBSRiBTVyBzdGF0ZSAweCV4XG4iLCBzdyk7CisJfQorCisJc3dpdGNoIChodykgeworCWNhc2UgSTI0MDBNX1JGX1NXSVRDSF9PTjoJLyogUkYgS2lsbCBkaXNhYmxlZCAocmFkaW8gb24pICovCisJCXdpbWF4X3JlcG9ydF9yZmtpbGxfaHcoJmkyNDAwbS0+d2ltYXhfZGV2LCBXSU1BWF9SRl9PTik7CisJCWJyZWFrOworCWNhc2UgSTI0MDBNX1JGX1NXSVRDSF9PRkY6CS8qIFJGIEtpbGwgZW5hYmxlZCAocmFkaW8gb2ZmKSAqLworCQl3aW1heF9yZXBvcnRfcmZraWxsX2h3KCZpMjQwMG0tPndpbWF4X2RldiwgV0lNQVhfUkZfT0ZGKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2VycihkZXYsICJIVyBCVUc/IFVua25vd24gUkYgSFcgc3RhdGUgMHgleFxuIiwgaHcpOworCX0KK291dDoKKwlkX2ZuZW5kKDMsIGRldiwgIihpMjQwMG0gJXAgcmZzcyAlcCBbaHcgJXUgc3cgJXVdKSA9IHZvaWRcbiIsCisJCWkyNDAwbSwgcmZzcywgaHcsIHN3KTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS9yeC5jIGIvZHJpdmVycy9uZXQvd2ltYXgvaTI0MDBtL3J4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjkyMjAyMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS9yeC5jCkBAIC0wLDAgKzEsNTM0IEBACisvKgorICogSW50ZWwgV2lyZWxlc3MgV2lNQVggQ29ubmVjdGlvbiAyNDAwbQorICogSGFuZGxlIGluY29taW5nIHRyYWZmaWMgYW5kIGRlbGl2ZXIgaXQgdG8gdGhlIGNvbnRyb2wgb3IgZGF0YSBwbGFuZXMKKyAqCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgIGRpc3RyaWJ1dGlvbi4KKyAqICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICoKKyAqIEludGVsIENvcnBvcmF0aW9uIDxsaW51eC13aW1heEBpbnRlbC5jb20+CisgKiBZYW5pciBMdWJldGtpbiA8eWFuaXJ4Lmx1YmV0a2luQGludGVsLmNvbT4KKyAqICAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqIEluYWt5IFBlcmV6LUdvbnphbGV6IDxpbmFreS5wZXJlei1nb256YWxlekBpbnRlbC5jb20+CisgKiAgLSBVc2Ugc2tiX2Nsb25lKCksIGJyZWFrIHVwIHByb2Nlc3NpbmcgaW4gY2h1bmtzCisgKiAgLSBTcGxpdCB0cmFuc3BvcnQvZGV2aWNlIHNwZWNpZmljCisgKiAgLSBNYWtlIGJ1ZmZlciBzaXplIGR5bmFtaWMgdG8gZXhlcnQgbGVzcyBtZW1vcnkgcHJlc3N1cmUKKyAqCisgKgorICogVGhpcyBoYW5kbGVzIHRoZSBSWCBwYXRoLgorICoKKyAqIFdlIHJlY2VpdmUgYW4gUlggbWVzc2FnZSBmcm9tIHRoZSBidXMtc3BlY2lmaWMgZHJpdmVyLCB3aGljaAorICogY29udGFpbnMgb25lIG9yIG1vcmUgcGF5bG9hZHMgdGhhdCBoYXZlIHBvdGVudGlhbGx5IGRpZmZlcmVudAorICogZGVzdGluYXRhcmllcyAoZGF0YSBvciBjb250cm9sIHBhdGhzKS4KKyAqCisgKiBTbyB3ZSBqdXN0IHRha2UgdGhhdCBwYXlsb2FkIGZyb20gdGhlIHRyYW5zcG9ydCBzcGVjaWZpYyBjb2RlIGluCisgKiB0aGUgZm9ybSBvZiBhbiBza2IsIGJyZWFrIGl0IHVwIGluIGNodW5rcyAoYSBjbG9uZWQgc2tiIGVhY2ggaW4gdGhlCisgKiBjYXNlIG9mIG5ldHdvcmsgcGFja2V0cykgYW5kIHBhc3MgaXQgdG8gbmV0ZGV2IG9yIHRvIHRoZQorICogY29tbWFuZC9hY2sgaGFuZGxlciAoYW5kIGZyb20gdGhlcmUgdG8gdGhlIFdpTUFYIHN0YWNrKS4KKyAqCisgKiBQUk9UT0NPTCBGT1JNQVQKKyAqCisgKiBUaGUgZm9ybWF0IG9mIHRoZSBidWZmZXIgaXM6CisgKgorICogSEVBREVSICAgICAgICAgICAgICAgICAgICAgIChzdHJ1Y3QgaTI0MDBtX21zZ19oZHIpCisgKiBQQVlMT0FEIERFU0NSSVBUT1IgMCAgICAgICAgKHN0cnVjdCBpMjQwMG1fcGxkKQorICogUEFZTE9BRCBERVNDUklQVE9SIDEKKyAqIC4uLgorICogUEFZTE9BRCBERVNDUklQVE9SIE4KKyAqIFBBWUxPQUQgMCAgICAgICAgICAgICAgICAgICAocmF3IGJ5dGVzKQorICogUEFZTE9BRCAxCisgKiAuLi4KKyAqIFBBWUxPQUQgTgorICoKKyAqIFNlZSB0eC5jIGZvciBhIGRlZXBlciBkZXNjcmlwdGlvbiBvbiBhbGlnbm1lbnQgcmVxdWlyZW1lbnRzIGFuZAorICogb3RoZXIgZnVuIGZhY3RzIG9mIGl0LgorICoKKyAqIFJPQURNQVAKKyAqCisgKiBpMjQwMG1fcngKKyAqICAgaTI0MDBtX3J4X21zZ19oZHJfY2hlY2sKKyAqICAgaTI0MDBtX3J4X3BsX2Rlc2NyX2NoZWNrCisgKiAgIGkyNDAwbV9yeF9wYXlsb2FkCisgKiAgICAgaTI0MDBtX25ldF9yeAorICogICAgIGkyNDAwbV9yeF9jdGwKKyAqICAgICAgIGkyNDAwbV9tc2dfc2l6ZV9jaGVjaworICogICAgICAgaTI0MDBtX3JlcG9ydF9ob29rX3dvcmsgICAgW2luIGEgd29ya3F1ZXVlXQorICogICAgICAgICBpMjQwMG1fcmVwb3J0X2hvb2sKKyAqICAgICAgIHdpbWF4X21zZ190b191c2VyCisgKiAgICAgICBpMjQwMG1fcnhfY3RsX2FjaworICogICAgICAgICB3aW1heF9tc2dfdG9fdXNlcl9hbGxvYworICogICAgIGkyNDAwbV9yeF90cmFjZQorICogICAgICAgaTI0MDBtX21zZ19zaXplX2NoZWNrCisgKiAgICAgICB3aW1heF9tc2cKKyAqLworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgImkyNDAwbS5oIgorCisKKyNkZWZpbmUgRF9TVUJNT0RVTEUgcngKKyNpbmNsdWRlICJkZWJ1Zy1sZXZlbHMuaCIKKworc3RydWN0IGkyNDAwbV9yZXBvcnRfaG9va19hcmdzIHsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiX3J4OworCWNvbnN0IHN0cnVjdCBpMjQwMG1fbDNsNF9oZHIgKmwzbDRfaGRyOworCXNpemVfdCBzaXplOworfTsKKworCisvKgorICogRXhlY3V0ZSBpMjQwMG1fcmVwb3J0X2hvb2sgaW4gYSB3b3JrcXVldWUKKyAqCisgKiBVbnBhY2tzIGFyZ3VtZW50cyBmcm9tIHRoZSBkZWZlcnJlZCBjYWxsLCBleGVjdXRlcyBpdCBhbmQgdGhlbgorICogZHJvcHMgdGhlIHJlZmVyZW5jZXMuCisgKgorICogT2J2aW91cyBOT1RFOiBSZWZlcmVuY2VzIGFyZSBuZWVkZWQgYmVjYXVzZSB3ZSBhcmUgYSBzZXBhcmF0ZQorICogICAgIHRocmVhZDsgb3RoZXJ3aXNlIHRoZSBidWZmZXIgY2hhbmdlcyB1bmRlciB1cyBiZWNhdXNlIGl0IGlzCisgKiAgICAgcmVsZWFzZWQgYnkgdGhlIG9yaWdpbmFsIGNhbGxlci4KKyAqLworc3RhdGljCit2b2lkIGkyNDAwbV9yZXBvcnRfaG9va193b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd3MpCit7CisJc3RydWN0IGkyNDAwbV93b3JrICppdyA9CisJCWNvbnRhaW5lcl9vZih3cywgc3RydWN0IGkyNDAwbV93b3JrLCB3cyk7CisJc3RydWN0IGkyNDAwbV9yZXBvcnRfaG9va19hcmdzICphcmdzID0gKHZvaWQgKikgaXctPnBsOworCWkyNDAwbV9yZXBvcnRfaG9vayhpdy0+aTI0MDBtLCBhcmdzLT5sM2w0X2hkciwgYXJncy0+c2l6ZSk7CisJa2ZyZWVfc2tiKGFyZ3MtPnNrYl9yeCk7CisJaTI0MDBtX3B1dChpdy0+aTI0MDBtKTsKKwlrZnJlZShpdyk7Cit9CisKKworLyoKKyAqIFByb2Nlc3MgYW4gYWNrIHRvIGEgY29tbWFuZAorICoKKyAqIEBpMjQwMG06IGRldmljZSBkZXNjcmlwdG9yCisgKiBAcGF5bG9hZDogcG9pbnRlciB0byBtZXNzYWdlCisgKiBAc2l6ZTogc2l6ZSBvZiB0aGUgbWVzc2FnZQorICoKKyAqIFBhc3MgdGhlIGFja25vZGxlZGdtZW50IChpbiBhbiBza2IpIHRvIHRoZSB0aHJlYWQgdGhhdCBpcyB3YWl0aW5nCisgKiBmb3IgaXQgaW4gaTI0MDBtLT5tc2dfY29tcGxldGlvbi4KKyAqCisgKiBXZSBuZWVkIHRvIGNvb3JkaW5hdGUgcHJvcGVybHkgd2l0aCB0aGUgdGhyZWFkIHdhaXRpbmcgZm9yIHRoZQorICogYWNrLiBDaGVjayBpZiBpdCBpcyB3YWl0aW5nIG9yIGlmIGl0IGlzIGdvbmUuIFdlIGxvb3NlIHRoZSBzcGlubG9jaworICogdG8gYXZvaWQgYWxsb2NhdGluZyBvbiBhdG9taWMgY29udGV4dHMgKHllYWgsIGNvdWxkIHVzZSBHRlBfQVRPTUlDLAorICogYnV0IHRoaXMgaXMgbm90IHNvIHNwZWVkIGNyaXRpY2FsKS4KKyAqLworc3RhdGljCit2b2lkIGkyNDAwbV9yeF9jdGxfYWNrKHN0cnVjdCBpMjQwMG0gKmkyNDAwbSwKKwkJICAgICAgIGNvbnN0IHZvaWQgKnBheWxvYWQsIHNpemVfdCBzaXplKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGkyNDAwbV9kZXYoaTI0MDBtKTsKKwlzdHJ1Y3Qgd2ltYXhfZGV2ICp3aW1heF9kZXYgPSAmaTI0MDBtLT53aW1heF9kZXY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3Qgc2tfYnVmZiAqYWNrX3NrYjsKKworCS8qIEFueW9uZSB3YWl0aW5nIGZvciBhbiBhbnN3ZXI/ICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmkyNDAwbS0+cnhfbG9jaywgZmxhZ3MpOworCWlmIChpMjQwMG0tPmFja19za2IgIT0gRVJSX1BUUigtRUlOUFJPR1JFU1MpKSB7CisJCWRldl9lcnIoZGV2LCAiSHVoPyByZXBseSB0byBjb21tYW5kIHdpdGggbm8gd2FpdGVyc1xuIik7CisJCWdvdG8gZXJyb3Jfbm9fd2FpdGVyOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpMjQwMG0tPnJ4X2xvY2ssIGZsYWdzKTsKKworCWFja19za2IgPSB3aW1heF9tc2dfYWxsb2Mod2ltYXhfZGV2LCBOVUxMLCBwYXlsb2FkLCBzaXplLCBHRlBfS0VSTkVMKTsKKworCS8qIENoZWNrIHdhaXRlciBkaWRuJ3QgdGltZSBvdXQgd2FpdGluZyBmb3IgdGhlIGFuc3dlci4uLiAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZpMjQwMG0tPnJ4X2xvY2ssIGZsYWdzKTsKKwlpZiAoaTI0MDBtLT5hY2tfc2tiICE9IEVSUl9QVFIoLUVJTlBST0dSRVNTKSkgeworCQlkX3ByaW50ZigxLCBkZXYsICJIdWg/IHdhaXRlciBmb3IgY29tbWFuZCByZXBseSBjYW5jZWxsZWRcbiIpOworCQlnb3RvIGVycm9yX3dhaXRlcl9jYW5jZWxsZWQ7CisJfQorCWlmIChhY2tfc2tiID09IE5VTEwpIHsKKwkJZGV2X2VycihkZXYsICJDTUQvR0VUL1NFVCBhY2s6IGNhbm5vdCBhbGxvY2F0ZSBTS0JcbiIpOworCQlpMjQwMG0tPmFja19za2IgPSBFUlJfUFRSKC1FTk9NRU0pOworCX0gZWxzZQorCQlpMjQwMG0tPmFja19za2IgPSBhY2tfc2tiOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmkyNDAwbS0+cnhfbG9jaywgZmxhZ3MpOworCWNvbXBsZXRlKCZpMjQwMG0tPm1zZ19jb21wbGV0aW9uKTsKKwlyZXR1cm47CisKK2Vycm9yX3dhaXRlcl9jYW5jZWxsZWQ6CisJaWYgKGFja19za2IpCisJCWtmcmVlX3NrYihhY2tfc2tiKTsKK2Vycm9yX25vX3dhaXRlcjoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpMjQwMG0tPnJ4X2xvY2ssIGZsYWdzKTsKKwlyZXR1cm47Cit9CisKKworLyoKKyAqIFJlY2VpdmUgYW5kIHByb2Nlc3MgYSBjb250cm9sIHBheWxvYWQKKyAqCisgKiBAaTI0MDBtOiBkZXZpY2UgZGVzY3JpcHRvcgorICogQHNrYl9yeDogc2tiIHRoYXQgY29udGFpbnMgdGhlIHBheWxvYWQgKGZvciByZWZlcmVuY2UgY291bnRpbmcpCisgKiBAcGF5bG9hZDogcG9pbnRlciB0byBtZXNzYWdlCisgKiBAc2l6ZTogc2l6ZSBvZiB0aGUgbWVzc2FnZQorICoKKyAqIFRoZXJlIGFyZSB0d28gdHlwZXMgb2YgY29udHJvbCBSWCBtZXNzYWdlczogcmVwb3J0cyAoYXN5bmNocm9ub3VzLAorICogbGlrZSB5b3VyIGV2ZXJ5IGRheSBpbnRlcnJ1cHRzKSBhbmQgJ2Fja3MnIChyZXBvbnNlcyB0byBhIGNvbW1hbmQsCisgKiBnZXQgb3Igc2V0IHJlcXVlc3QpLgorICoKKyAqIElmIGl0IGlzIGEgcmVwb3J0LCB3ZSBydW4gaG9va3Mgb24gaXQgKHRvIGV4dHJhY3QgaW5mb3JtYXRpb24gZm9yCisgKiB0aGluZ3Mgd2UgbmVlZCB0byBkbyBpbiB0aGUgZHJpdmVyKSBhbmQgdGhlbiBwYXNzIGl0IG92ZXIgdG8gdGhlCisgKiBXaU1BWCBzdGFjayB0byBzZW5kIGl0IHRvIHVzZXIgc3BhY2UuCisgKgorICogTk9URTogcmVwb3J0IHByb2Nlc3NpbmcgaXMgZG9uZSBpbiBhIHdvcmtxdWV1ZSBzcGVjaWZpYyB0byB0aGUKKyAqICAgICBnZW5lcmljIGRyaXZlciwgdG8gYXZvaWQgZGVhZGxvY2tzIGluIHRoZSBzeXN0ZW0uCisgKgorICogSWYgaXQgaXMgbm90IGEgcmVwb3J0LCBpdCBpcyBhbiBhY2sgdG8gYSBwcmV2aW91c2x5IGV4ZWN1dGVkCisgKiBjb21tYW5kLCBzZXQgb3IgZ2V0LCBzbyB3YWtlIHVwIHdob2V2ZXIgaXMgd2FpdGluZyBmb3IgaXQgZnJvbQorICogaTI0MDBtX21zZ190b19kZXYoKS4gaTI0MDBtX3J4X2N0bF9hY2soKSB0YWtlcyBjYXJlIG9mIHRoYXQuCisgKgorICogTm90ZSB0aGF0IHRoZSBzaXplcyB3ZSBwYXNzIHRvIG90aGVyIGZ1bmN0aW9ucyBmcm9tIGhlcmUgYXJlIHRoZQorICogc2l6ZXMgb2YgdGhlIF9sM2w0X2hkciArIHBheWxvYWQsIG5vdCBmdWxsIGJ1ZmZlciBzaXplcywgYXMgd2UgaGF2ZQorICogdmVyaWZpZWQgaW4gX21zZ19zaXplX2NoZWNrKCkgdGhhdCB0aGV5IGFyZSBjb25ncnVlbnQuCisgKgorICogRm9yIHJlcG9ydHM6IFdlIGNhbid0IGNsb25lIHRoZSBvcmlnaW5hbCBza2Igd2hlcmUgdGhlIGRhdGEgaXMKKyAqIGJlY2F1c2Ugd2UgbmVlZCB0byBzZW5kIHRoaXMgdXAgdmlhIG5ldGxpbms7IG5ldGxpbmsgaGFzIHRvIGFkZAorICogaGVhZGVycyBhbmQgd2UgY2FuJ3Qgb3ZlcndyaXRlIHdoYXQncyBwcmVjZWVkaW5nIHRoZSBwYXlsb2FkLi4uYXMKKyAqIGl0IGlzIGFub3RoZXIgbWVzc2FnZS4gU28gd2UganVzdCBkdXAgdGhlbS4KKyAqLworc3RhdGljCit2b2lkIGkyNDAwbV9yeF9jdGwoc3RydWN0IGkyNDAwbSAqaTI0MDBtLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiX3J4LAorCQkgICBjb25zdCB2b2lkICpwYXlsb2FkLCBzaXplX3Qgc2l6ZSkKK3sKKwlpbnQgcmVzdWx0OworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGkyNDAwbV9kZXYoaTI0MDBtKTsKKwljb25zdCBzdHJ1Y3QgaTI0MDBtX2wzbDRfaGRyICpsM2w0X2hkciA9IHBheWxvYWQ7CisJdW5zaWduZWQgbXNnX3R5cGU7CisKKwlyZXN1bHQgPSBpMjQwMG1fbXNnX3NpemVfY2hlY2soaTI0MDBtLCBsM2w0X2hkciwgc2l6ZSk7CisJaWYgKHJlc3VsdCA8IDApIHsKKwkJZGV2X2VycihkZXYsICJIVyBCVUc/IGRldmljZSBzZW50IGEgYmFkIG1lc3NhZ2U6ICVkXG4iLAorCQkJcmVzdWx0KTsKKwkJZ290byBlcnJvcl9jaGVjazsKKwl9CisJbXNnX3R5cGUgPSBsZTE2X3RvX2NwdShsM2w0X2hkci0+dHlwZSk7CisJZF9wcmludGYoMSwgZGV2LCAiJXMgMHglMDR4OiAlenUgYnl0ZXNcbiIsCisJCSBtc2dfdHlwZSAmIEkyNDAwTV9NVF9SRVBPUlRfTUFTSyA/ICJSRVBPUlQiIDogIkNNRC9TRVQvR0VUIiwKKwkJIG1zZ190eXBlLCBzaXplKTsKKwlkX2R1bXAoMiwgZGV2LCBsM2w0X2hkciwgc2l6ZSk7CisJaWYgKG1zZ190eXBlICYgSTI0MDBNX01UX1JFUE9SVF9NQVNLKSB7CisJCS8qIFRoZXNlIGhvb2tzIGhhdmUgdG8gYmUgcmFuIHNlcmlhbGl6ZWQ7IGFzIHdlbGwsIHRoZQorCQkgKiBoYW5kbGluZyBtaWdodCBmb3JjZSB0aGUgZXhlY3V0aW9uIG9mIGNvbW1hbmRzLCBhbmQKKwkJICogdGhhdCBtaWdodCBjYXVzZSByZWVudHJhbmN5IGlzc3VlcyB3aXRoCisJCSAqIGJ1cy1zcGVjaWZpYyBzdWJkcml2ZXJzIGFuZCB3b3JrcXVldWVzLiBTbyB3ZSBydW4KKwkJICogaXQgaW4gYSBzZXBhcmF0ZSB3b3JrcXVldWUuICovCisJCXN0cnVjdCBpMjQwMG1fcmVwb3J0X2hvb2tfYXJncyBhcmdzID0geworCQkJLnNrYl9yeCA9IHNrYl9yeCwKKwkJCS5sM2w0X2hkciA9IGwzbDRfaGRyLAorCQkJLnNpemUgPSBzaXplCisJCX07CisJCWlmICh1bmxpa2VseShpMjQwMG0tPnJlYWR5ID09IDApKQkvKiBvbmx5IHNlbmQgaWYgdXAgKi8KKwkJCXJldHVybjsKKwkJc2tiX2dldChza2JfcngpOworCQlpMjQwMG1fcXVldWVfd29yayhpMjQwMG0sIGkyNDAwbV9yZXBvcnRfaG9va193b3JrLAorCQkJCSAgR0ZQX0tFUk5FTCwgJmFyZ3MsIHNpemVvZihhcmdzKSk7CisJCXJlc3VsdCA9IHdpbWF4X21zZygmaTI0MDBtLT53aW1heF9kZXYsIE5VTEwsIGwzbDRfaGRyLCBzaXplLAorCQkJCSAgIEdGUF9LRVJORUwpOworCQlpZiAocmVzdWx0IDwgMCkKKwkJCWRldl9lcnIoZGV2LCAiZXJyb3Igc2VuZGluZyByZXBvcnQgdG8gdXNlcnNwYWNlOiAlZFxuIiwKKwkJCQlyZXN1bHQpOworCX0gZWxzZQkJLyogYW4gYWNrIHRvIGEgQ01ELCBHRVQgb3IgU0VUICovCisJCWkyNDAwbV9yeF9jdGxfYWNrKGkyNDAwbSwgcGF5bG9hZCwgc2l6ZSk7CitlcnJvcl9jaGVjazoKKwlyZXR1cm47Cit9CisKKworCisKKy8qCisgKiBSZWNlaXZlIGFuZCBzZW5kIHVwIGEgdHJhY2UKKyAqCisgKiBAaTI0MDBtOiBkZXZpY2UgZGVzY3JpcHRvcgorICogQHNrYl9yeDogc2tiIHRoYXQgY29udGFpbnMgdGhlIHRyYWNlIChmb3IgcmVmZXJlbmNlIGNvdW50aW5nKQorICogQHBheWxvYWQ6IHBvaW50ZXIgdG8gdHJhY2UgbWVzc2FnZSBpbnNpZGUgdGhlIHNrYgorICogQHNpemU6IHNpemUgb2YgdGhlIG1lc3NhZ2UKKyAqCisgKiBUSGUgaTI0MDBtIG1pZ2h0IHByb2R1Y2UgdHJhY2UgaW5mb3JtYXRpb24gKGRpYWdub3N0aWNzKSBhbmQgd2UKKyAqIHNlbmQgdGhlbSB0aHJvdWdoIGEgZGlmZmVyZW50IGtlcm5lbC10by11c2VyIHBpcGUgKHRvIGF2b2lkCisgKiBjbG9nZ2luZyBpdCkuCisgKgorICogQXMgaW4gaTI0MDBtX3J4X2N0bCgpLCB3ZSBjYW4ndCBjbG9uZSB0aGUgb3JpZ2luYWwgc2tiIHdoZXJlIHRoZQorICogZGF0YSBpcyBiZWNhdXNlIHdlIG5lZWQgdG8gc2VuZCB0aGlzIHVwIHZpYSBuZXRsaW5rOyBuZXRsaW5rIGhhcyB0bworICogYWRkIGhlYWRlcnMgYW5kIHdlIGNhbid0IG92ZXJ3cml0ZSB3aGF0J3MgcHJlY2VlZGluZyB0aGUKKyAqIHBheWxvYWQuLi5hcyBpdCBpcyBhbm90aGVyIG1lc3NhZ2UuIFNvIHdlIGp1c3QgZHVwIHRoZW0uCisgKi8KK3N0YXRpYwordm9pZCBpMjQwMG1fcnhfdHJhY2Uoc3RydWN0IGkyNDAwbSAqaTI0MDBtLAorCQkgICAgIGNvbnN0IHZvaWQgKnBheWxvYWQsIHNpemVfdCBzaXplKQoreworCWludCByZXN1bHQ7CisJc3RydWN0IGRldmljZSAqZGV2ID0gaTI0MDBtX2RldihpMjQwMG0pOworCXN0cnVjdCB3aW1heF9kZXYgKndpbWF4X2RldiA9ICZpMjQwMG0tPndpbWF4X2RldjsKKwljb25zdCBzdHJ1Y3QgaTI0MDBtX2wzbDRfaGRyICpsM2w0X2hkciA9IHBheWxvYWQ7CisJdW5zaWduZWQgbXNnX3R5cGU7CisKKwlyZXN1bHQgPSBpMjQwMG1fbXNnX3NpemVfY2hlY2soaTI0MDBtLCBsM2w0X2hkciwgc2l6ZSk7CisJaWYgKHJlc3VsdCA8IDApIHsKKwkJZGV2X2VycihkZXYsICJIVyBCVUc/IGRldmljZSBzZW50IGEgYmFkIHRyYWNlIG1lc3NhZ2U6ICVkXG4iLAorCQkJcmVzdWx0KTsKKwkJZ290byBlcnJvcl9jaGVjazsKKwl9CisJbXNnX3R5cGUgPSBsZTE2X3RvX2NwdShsM2w0X2hkci0+dHlwZSk7CisJZF9wcmludGYoMSwgZGV2LCAiVHJhY2UgJXMgMHglMDR4OiAlenUgYnl0ZXNcbiIsCisJCSBtc2dfdHlwZSAmIEkyNDAwTV9NVF9SRVBPUlRfTUFTSyA/ICJSRVBPUlQiIDogIkNNRC9TRVQvR0VUIiwKKwkJIG1zZ190eXBlLCBzaXplKTsKKwlkX2R1bXAoMiwgZGV2LCBsM2w0X2hkciwgc2l6ZSk7CisJaWYgKHVubGlrZWx5KGkyNDAwbS0+cmVhZHkgPT0gMCkpCS8qIG9ubHkgc2VuZCBpZiB1cCAqLworCQlyZXR1cm47CisJcmVzdWx0ID0gd2ltYXhfbXNnKHdpbWF4X2RldiwgInRyYWNlIiwgbDNsNF9oZHIsIHNpemUsIEdGUF9LRVJORUwpOworCWlmIChyZXN1bHQgPCAwKQorCQlkZXZfZXJyKGRldiwgImVycm9yIHNlbmRpbmcgdHJhY2UgdG8gdXNlcnNwYWNlOiAlZFxuIiwKKwkJCXJlc3VsdCk7CitlcnJvcl9jaGVjazoKKwlyZXR1cm47Cit9CisKKworLyoKKyAqIEFjdCBvbiBhIHJlY2VpdmVkIHBheWxvYWQKKyAqCisgKiBAaTI0MDBtOiBkZXZpY2UgaW5zdGFuY2UKKyAqIEBza2Jfcng6IHNrYiB3aGVyZSB0aGUgdHJhbnNhY3Rpb24gd2FzIHJlY2VpdmVkCisgKiBAc2luZ2xlOiAxIGlmIHRoZXJlIGlzIG9ubHkgb25lIHBheWxvYWQsIDAgb3RoZXJ3aXNlCisgKiBAcGxkOiBwYXlsb2FkIGRlc2NyaXB0b3IKKyAqIEBwYXlsb2FkOiBwYXlsb2FkIGRhdGEKKyAqCisgKiBVcG9uIHJlY2VwdGlvbiBvZiBhIHBheWxvYWQsIGxvb2sgYXQgaXRzIGd1dHMgaW4gdGhlIHBheWxvYWQKKyAqIGRlc2NyaXB0b3IgYW5kIGRlY2lkZSB3aGF0IHRvIGRvIHdpdGggaXQuCisgKi8KK3N0YXRpYwordm9pZCBpMjQwMG1fcnhfcGF5bG9hZChzdHJ1Y3QgaTI0MDBtICppMjQwMG0sIHN0cnVjdCBza19idWZmICpza2JfcngsCisJCSAgICAgICB1bnNpZ25lZCBzaW5nbGUsIGNvbnN0IHN0cnVjdCBpMjQwMG1fcGxkICpwbGQsCisJCSAgICAgICBjb25zdCB2b2lkICpwYXlsb2FkKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGkyNDAwbV9kZXYoaTI0MDBtKTsKKwlzaXplX3QgcGxfc2l6ZSA9IGkyNDAwbV9wbGRfc2l6ZShwbGQpOworCWVudW0gaTI0MDBtX3B0IHBsX3R5cGUgPSBpMjQwMG1fcGxkX3R5cGUocGxkKTsKKworCXN3aXRjaCAocGxfdHlwZSkgeworCWNhc2UgSTI0MDBNX1BUX0RBVEE6CisJCWRfcHJpbnRmKDMsIGRldiwgIlJYOiBkYXRhIHBheWxvYWQgJXp1IGJ5dGVzXG4iLCBwbF9zaXplKTsKKwkJaTI0MDBtX25ldF9yeChpMjQwMG0sIHNrYl9yeCwgc2luZ2xlLCBwYXlsb2FkLCBwbF9zaXplKTsKKwkJYnJlYWs7CisJY2FzZSBJMjQwME1fUFRfQ1RSTDoKKwkJaTI0MDBtX3J4X2N0bChpMjQwMG0sIHNrYl9yeCwgcGF5bG9hZCwgcGxfc2l6ZSk7CisJCWJyZWFrOworCWNhc2UgSTI0MDBNX1BUX1RSQUNFOgorCQlpMjQwMG1fcnhfdHJhY2UoaTI0MDBtLCBwYXlsb2FkLCBwbF9zaXplKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoJLyogQW55dGhpbmcgZWxzZSBzaG91bGRuJ3QgY29tZSB0byB0aGUgaG9zdCAqLworCQlpZiAocHJpbnRrX3JhdGVsaW1pdCgpKQorCQkJZGV2X2VycihkZXYsICJSWDogSFcgQlVHPyB1bmV4cGVjdGVkIHBheWxvYWQgdHlwZSAldVxuIiwKKwkJCQlwbF90eXBlKTsKKwl9Cit9CisKKworLyoKKyAqIENoZWNrIGEgcmVjZWl2ZWQgdHJhbnNhY3Rpb24ncyBtZXNzYWdlIGhlYWRlcgorICoKKyAqIEBpMjQwMG06IGRldmljZSBkZXNjcmlwdG9yCisgKiBAbXNnX2hkcjogbWVzc2FnZSBoZWFkZXIKKyAqIEBidWZfc2l6ZTogc2l6ZSBvZiB0aGUgcmVjZWl2ZWQgYnVmZmVyCisgKgorICogQ2hlY2sgdGhhdCB0aGUgZGVjbGFyYXRpb25zIGRvbmUgYnkgYSBSWCBidWZmZXIgbWVzc2FnZSBoZWFkZXIgYXJlCisgKiBzYW5lIGFuZCBjb25zaXN0ZW50IHdpdGggdGhlIGFtb3VudCBvZiBkYXRhIHRoYXQgd2FzIHJlY2VpdmVkLgorICovCitzdGF0aWMKK2ludCBpMjQwMG1fcnhfbXNnX2hkcl9jaGVjayhzdHJ1Y3QgaTI0MDBtICppMjQwMG0sCisJCQkgICAgY29uc3Qgc3RydWN0IGkyNDAwbV9tc2dfaGRyICptc2dfaGRyLAorCQkJICAgIHNpemVfdCBidWZfc2l6ZSkKK3sKKwlpbnQgcmVzdWx0ID0gLUVJTzsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBpMjQwMG1fZGV2KGkyNDAwbSk7CisJaWYgKGJ1Zl9zaXplIDwgc2l6ZW9mKCptc2dfaGRyKSkgeworCQlkZXZfZXJyKGRldiwgIlJYOiBIVyBCVUc/IG1lc3NhZ2Ugd2l0aCBzaG9ydCBoZWFkZXIgKCV6dSAiCisJCQkidnMgJXp1IGJ5dGVzIGV4cGVjdGVkKVxuIiwgYnVmX3NpemUsIHNpemVvZigqbXNnX2hkcikpOworCQlnb3RvIGVycm9yOworCX0KKwlpZiAobXNnX2hkci0+YmFya2VyICE9IGNwdV90b19sZTMyKEkyNDAwTV9EMkhfTVNHX0JBUktFUikpIHsKKwkJZGV2X2VycihkZXYsICJSWDogSFcgQlVHPyBtZXNzYWdlIHJlY2VpdmVkIHdpdGggdW5rbm93biAiCisJCQkiYmFya2VyIDB4JTA4eCAoYnVmX3NpemUgJXp1IGJ5dGVzKVxuIiwKKwkJCWxlMzJfdG9fY3B1KG1zZ19oZHItPmJhcmtlciksIGJ1Zl9zaXplKTsKKwkJZ290byBlcnJvcjsKKwl9CisJaWYgKG1zZ19oZHItPm51bV9wbHMgPT0gMCkgeworCQlkZXZfZXJyKGRldiwgIlJYOiBIVyBCVUc/IHplcm8gcGF5bG9hZCBwYWNrZXRzIGluIG1lc3NhZ2VcbiIpOworCQlnb3RvIGVycm9yOworCX0KKwlpZiAobGUxNl90b19jcHUobXNnX2hkci0+bnVtX3BscykgPiBJMjQwME1fTUFYX1BMU19JTl9NU0cpIHsKKwkJZGV2X2VycihkZXYsICJSWDogSFcgQlVHPyBtZXNzYWdlIGNvbnRhaW5zIG1vcmUgcGF5bG9hZCAiCisJCQkidGhhbiBtYXhpbXVtOyBpZ25vcmluZy5cbiIpOworCQlnb3RvIGVycm9yOworCX0KKwlyZXN1bHQgPSAwOworZXJyb3I6CisJcmV0dXJuIHJlc3VsdDsKK30KKworCisvKgorICogQ2hlY2sgYSBwYXlsb2FkIGRlc2NyaXB0b3IgYWdhaW5zdCB0aGUgcmVjZWl2ZWQgZGF0YQorICoKKyAqIEBpMjQwMG06IGRldmljZSBkZXNjcmlwdG9yCisgKiBAcGxkOiBwYXlsb2FkIGRlc2NyaXB0b3IKKyAqIEBwbF9pdHI6IG9mZnNldCAoaW4gYnl0ZXMpIGluIHRoZSByZWNlaXZlZCBidWZmZXIgdGhlIHBheWxvYWQgaXMKKyAqICAgICAgICAgIGxvY2F0ZWQKKyAqIEBidWZfc2l6ZTogc2l6ZSBvZiB0aGUgcmVjZWl2ZWQgYnVmZmVyCisgKgorICogR2l2ZW4gYSBwYXlsb2FkIGRlc2NyaXB0b3IgKHBhcnQgb2YgYSBSWCBidWZmZXIpLCBjaGVjayBpdCBpcyBzYW5lCisgKiBhbmQgdGhhdCB0aGUgZGF0YSBpdCBkZWNsYXJlcyBmaXRzIGluIHRoZSBidWZmZXIuCisgKi8KK3N0YXRpYworaW50IGkyNDAwbV9yeF9wbF9kZXNjcl9jaGVjayhzdHJ1Y3QgaTI0MDBtICppMjQwMG0sCisJCQkgICAgICBjb25zdCBzdHJ1Y3QgaTI0MDBtX3BsZCAqcGxkLAorCQkJICAgICAgc2l6ZV90IHBsX2l0ciwgc2l6ZV90IGJ1Zl9zaXplKQoreworCWludCByZXN1bHQgPSAtRUlPOworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGkyNDAwbV9kZXYoaTI0MDBtKTsKKwlzaXplX3QgcGxfc2l6ZSA9IGkyNDAwbV9wbGRfc2l6ZShwbGQpOworCWVudW0gaTI0MDBtX3B0IHBsX3R5cGUgPSBpMjQwMG1fcGxkX3R5cGUocGxkKTsKKworCWlmIChwbF9zaXplID4gaTI0MDBtLT5idXNfcGxfc2l6ZV9tYXgpIHsKKwkJZGV2X2VycihkZXYsICJSWDogSFcgQlVHPyBwYXlsb2FkIEAlenU6IHNpemUgJXp1IGlzICIKKwkJCSJiaWdnZXIgdGhhbiBtYXhpbXVtICV6dTsgaWdub3JpbmcgbWVzc2FnZVxuIiwKKwkJCXBsX2l0ciwgcGxfc2l6ZSwgaTI0MDBtLT5idXNfcGxfc2l6ZV9tYXgpOworCQlnb3RvIGVycm9yOworCX0KKwlpZiAocGxfaXRyICsgcGxfc2l6ZSA+IGJ1Zl9zaXplKSB7CS8qIGVub3VnaD8gKi8KKwkJZGV2X2VycihkZXYsICJSWDogSFcgQlVHPyBwYXlsb2FkIEAlenU6IHNpemUgJXp1ICIKKwkJCSJnb2VzIGJleW9uZCB0aGUgcmVjZWl2ZWQgYnVmZmVyICIKKwkJCSJzaXplICglenUgYnl0ZXMpOyBpZ25vcmluZyBtZXNzYWdlXG4iLAorCQkJcGxfaXRyLCBwbF9zaXplLCBidWZfc2l6ZSk7CisJCWdvdG8gZXJyb3I7CisJfQorCWlmIChwbF90eXBlID49IEkyNDAwTV9QVF9JTExFR0FMKSB7CisJCWRldl9lcnIoZGV2LCAiUlg6IEhXIEJVRz8gaWxsZWdhbCBwYXlsb2FkIHR5cGUgJXU7ICIKKwkJCSJpZ25vcmluZyBtZXNzYWdlXG4iLCBwbF90eXBlKTsKKwkJZ290byBlcnJvcjsKKwl9CisJcmVzdWx0ID0gMDsKK2Vycm9yOgorCXJldHVybiByZXN1bHQ7Cit9CisKKworLyoqCisgKiBpMjQwMG1fcnggLSBSZWNlaXZlIGEgYnVmZmVyIG9mIGRhdGEgZnJvbSB0aGUgZGV2aWNlCisgKgorICogQGkyNDAwbTogZGV2aWNlIGRlc2NyaXB0b3IKKyAqIEBza2I6IHNrYnVmZiB3aGVyZSB0aGUgZGF0YSBoYXMgYmVlbiByZWNlaXZlZAorICoKKyAqIFBhcnNlIGluIGEgYnVmZmVyIG9mIGRhdGEgdGhhdCBjb250YWlucyBhbiBSWCBtZXNzYWdlIHNlbnQgZnJvbSB0aGUKKyAqIGRldmljZS4gU2VlIHRoZSBmaWxlIGhlYWRlciBmb3IgdGhlIGZvcm1hdC4gUnVuIGFsbCBjaGVja3Mgb24gdGhlCisgKiBidWZmZXIgaGVhZGVyLCB0aGVuIHJ1biBvdmVyIGVhY2ggcGF5bG9hZCdzIGRlc2NyaXB0b3JzLCB2ZXJpZnkKKyAqIHRoZWlyIGNvbnNpc3RlbmN5IGFuZCBhY3Qgb24gZWFjaCBwYXlsb2FkJ3MgY29udGVudHMuICBJZgorICogZXZlcnl0aGluZyBpcyBzdWNjZXNmdWwsIHVwZGF0ZSB0aGUgZGV2aWNlJ3Mgc3RhdGlzdGljcy4KKyAqCisgKiBOb3RlOiBZb3UgbmVlZCB0byBzZXQgdGhlIHNrYiB0byBjb250YWluIG9ubHkgdGhlIGxlbmd0aCBvZiB0aGUKKyAqIHJlY2VpdmVkIGJ1ZmZlcjsgZm9yIHRoYXQsIHVzZSBza2JfdHJpbShza2IsIFJFQ0VJVkVEX1NJWkUpLgorICoKKyAqIFJldHVybnM6CisgKgorICogMCBpZiBvaywgPCAwIGVycm5vIG9uIGVycm9yCisgKgorICogSWYgb2ssIHRoaXMgZnVuY3Rpb24gb3ducyBub3cgdGhlIHNrYiBhbmQgdGhlIGNhbGxlciBET0VTTidUIGhhdmUKKyAqIHRvIHJ1biBrZnJlZV9za2IoKSBvbiBpdC4gSG93ZXZlciwgb24gZXJyb3IsIHRoZSBjYWxsZXIgc3RpbGwgb3ducworICogdGhlIHNrYiBhbmQgaXQgaXMgcmVzcG9uc2libGUgZm9yIHJlbGVhc2luZyBpdC4KKyAqLworaW50IGkyNDAwbV9yeChzdHJ1Y3QgaTI0MDBtICppMjQwMG0sIHN0cnVjdCBza19idWZmICpza2IpCit7CisJaW50IGksIHJlc3VsdDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBpMjQwMG1fZGV2KGkyNDAwbSk7CisJY29uc3Qgc3RydWN0IGkyNDAwbV9tc2dfaGRyICptc2dfaGRyOworCXNpemVfdCBwbF9pdHIsIHBsX3NpemUsIHNrYl9sZW47CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBudW1fcGxzOworCisJc2tiX2xlbiA9IHNrYi0+bGVuOworCWRfZm5zdGFydCg0LCBkZXYsICIoaTI0MDBtICVwIHNrYiAlcCBbc2l6ZSAlenVdKVxuIiwKKwkJICBpMjQwMG0sIHNrYiwgc2tiX2xlbik7CisJcmVzdWx0ID0gLUVJTzsKKwltc2dfaGRyID0gKHZvaWQgKikgc2tiLT5kYXRhOworCXJlc3VsdCA9IGkyNDAwbV9yeF9tc2dfaGRyX2NoZWNrKGkyNDAwbSwgbXNnX2hkciwgc2tiLT5sZW4pOworCWlmIChyZXN1bHQgPCAwKQorCQlnb3RvIGVycm9yX21zZ19oZHJfY2hlY2s7CisJcmVzdWx0ID0gLUVJTzsKKwludW1fcGxzID0gbGUxNl90b19jcHUobXNnX2hkci0+bnVtX3Bscyk7CisJcGxfaXRyID0gc2l6ZW9mKCptc2dfaGRyKSArCS8qIENoZWNrIHBheWxvYWQgZGVzY3JpcHRvcihzKSAqLworCQludW1fcGxzICogc2l6ZW9mKG1zZ19oZHItPnBsZFswXSk7CisJcGxfaXRyID0gQUxJR04ocGxfaXRyLCBJMjQwME1fUExfUEFEKTsKKwlpZiAocGxfaXRyID4gc2tiLT5sZW4pIHsJLyogZ290IGFsbCB0aGUgcGF5bG9hZCBkZXNjcmlwdG9ycz8gKi8KKwkJZGV2X2VycihkZXYsICJSWDogSFcgQlVHPyBtZXNzYWdlIHRvbyBzaG9ydCAoJXUgYnl0ZXMpIGZvciAiCisJCQkiJXUgcGF5bG9hZCBkZXNjcmlwdG9ycyAoJXp1IGVhY2gsIHRvdGFsICV6dSlcbiIsCisJCQlza2ItPmxlbiwgbnVtX3Bscywgc2l6ZW9mKG1zZ19oZHItPnBsZFswXSksIHBsX2l0cik7CisJCWdvdG8gZXJyb3JfcGxfZGVzY3Jfc2hvcnQ7CisJfQorCS8qIFdhbGsgZWFjaCBwYXlsb2FkIHBheWxvYWQtLWNoZWNrIHdlIHJlYWxseSBnb3QgaXQgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbnVtX3BsczsgaSsrKSB7CisJCS8qIHdvcmsgYXJvdW5kIG9sZCBnY2Mgd2FybmluZ3MgKi8KKwkJcGxfc2l6ZSA9IGkyNDAwbV9wbGRfc2l6ZSgmbXNnX2hkci0+cGxkW2ldKTsKKwkJcmVzdWx0ID0gaTI0MDBtX3J4X3BsX2Rlc2NyX2NoZWNrKGkyNDAwbSwgJm1zZ19oZHItPnBsZFtpXSwKKwkJCQkJCSAgcGxfaXRyLCBza2ItPmxlbik7CisJCWlmIChyZXN1bHQgPCAwKQorCQkJZ290byBlcnJvcl9wbF9kZXNjcl9jaGVjazsKKwkJaTI0MDBtX3J4X3BheWxvYWQoaTI0MDBtLCBza2IsIG51bV9wbHMgPT0gMSwgJm1zZ19oZHItPnBsZFtpXSwKKwkJCQkgIHNrYi0+ZGF0YSArIHBsX2l0cik7CisJCXBsX2l0ciArPSBBTElHTihwbF9zaXplLCBJMjQwME1fUExfUEFEKTsKKwkJY29uZF9yZXNjaGVkKCk7CQkvKiBEb24ndCBtb25vcG9saXplICovCisJfQorCWtmcmVlX3NrYihza2IpOworCS8qIFVwZGF0ZSBkZXZpY2Ugc3RhdGlzdGljcyAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZpMjQwMG0tPnJ4X2xvY2ssIGZsYWdzKTsKKwlpMjQwMG0tPnJ4X3BsX251bSArPSBpOworCWlmIChpID4gaTI0MDBtLT5yeF9wbF9tYXgpCisJCWkyNDAwbS0+cnhfcGxfbWF4ID0gaTsKKwlpZiAoaSA8IGkyNDAwbS0+cnhfcGxfbWluKQorCQlpMjQwMG0tPnJ4X3BsX21pbiA9IGk7CisJaTI0MDBtLT5yeF9udW0rKzsKKwlpMjQwMG0tPnJ4X3NpemVfYWNjICs9IHNrYi0+bGVuOworCWlmIChza2ItPmxlbiA8IGkyNDAwbS0+cnhfc2l6ZV9taW4pCisJCWkyNDAwbS0+cnhfc2l6ZV9taW4gPSBza2ItPmxlbjsKKwlpZiAoc2tiLT5sZW4gPiBpMjQwMG0tPnJ4X3NpemVfbWF4KQorCQlpMjQwMG0tPnJ4X3NpemVfbWF4ID0gc2tiLT5sZW47CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaTI0MDBtLT5yeF9sb2NrLCBmbGFncyk7CitlcnJvcl9wbF9kZXNjcl9jaGVjazoKK2Vycm9yX3BsX2Rlc2NyX3Nob3J0OgorZXJyb3JfbXNnX2hkcl9jaGVjazoKKwlkX2ZuZW5kKDQsIGRldiwgIihpMjQwMG0gJXAgc2tiICVwIFtzaXplICV6dV0pID0gJWRcbiIsCisJCWkyNDAwbSwgc2tiLCBza2JfbGVuLCByZXN1bHQpOworCXJldHVybiByZXN1bHQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChpMjQwMG1fcngpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2ltYXgvaTI0MDBtL3NkaW8tZGVidWctbGV2ZWxzLmggYi9kcml2ZXJzL25ldC93aW1heC9pMjQwMG0vc2Rpby1kZWJ1Zy1sZXZlbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTE5OTg3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2ltYXgvaTI0MDBtL3NkaW8tZGVidWctbGV2ZWxzLmgKQEAgLTAsMCArMSwyMiBAQAorLyoKKyAqIGRlYnVnIGxldmVscyBjb250cm9sIGZpbGUgZm9yIHRoZSBpMjQwMG0gbW9kdWxlJ3MKKyAqLworI2lmbmRlZiBfX2RlYnVnX2xldmVsc19faF9fCisjZGVmaW5lIF9fZGVidWdfbGV2ZWxzX19oX18KKworLyogTWF4aW11bSBjb21waWxlIGFuZCBydW4gdGltZSBkZWJ1ZyBsZXZlbCBmb3IgYWxsIHN1Ym1vZHVsZXMgKi8KKyNkZWZpbmUgRF9NT0RVTEVOQU1FIGkyNDAwbV9zZGlvCisjZGVmaW5lIERfTUFTVEVSIENPTkZJR19XSU1BWF9JMjQwME1fREVCVUdfTEVWRUwKKworI2luY2x1ZGUgPGxpbnV4L3dpbWF4L2RlYnVnLmg+CisKKy8qIExpc3Qgb2YgYWxsIHRoZSBlbmFibGVkIG1vZHVsZXMgKi8KK2VudW0gZF9tb2R1bGUgeworCURfU1VCTU9EVUxFX0RFQ0xBUkUobWFpbiksCisJRF9TVUJNT0RVTEVfREVDTEFSRSh0eCksCisJRF9TVUJNT0RVTEVfREVDTEFSRShyeCksCisJRF9TVUJNT0RVTEVfREVDTEFSRShmdykKK307CisKKworI2VuZGlmIC8qICNpZm5kZWYgX19kZWJ1Z19sZXZlbHNfX2hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2ltYXgvaTI0MDBtL3NkaW8tZncuYyBiL2RyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS9zZGlvLWZ3LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ4NzIwNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS9zZGlvLWZ3LmMKQEAgLTAsMCArMSwyMjQgQEAKKy8qCisgKiBJbnRlbCBXaXJlbGVzcyBXaU1BWCBDb25uZWN0aW9uIDI0MDBtCisgKiBGaXJtd2FyZSB1cGxvYWRlcidzIFNESU8gc3BlY2lmaWNzCisgKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgICBkaXN0cmlidXRpb24uCisgKiAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqCisgKiBJbnRlbCBDb3Jwb3JhdGlvbiA8bGludXgtd2ltYXhAaW50ZWwuY29tPgorICogWWFuaXIgTHViZXRraW4gPHlhbmlyeC5sdWJldGtpbkBpbnRlbC5jb20+CisgKiBJbmFreSBQZXJlei1Hb256YWxleiA8aW5ha3kucGVyZXotZ29uemFsZXpAaW50ZWwuY29tPgorICogIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICoKKyAqIEluYWt5IFBlcmV6LUdvbnphbGV6IDxpbmFreS5wZXJlei1nb256YWxlekBpbnRlbC5jb20+CisgKiAgLSBCdXMgZ2VuZXJpYy9zcGVjaWZpYyBzcGxpdCBmb3IgVVNCCisgKgorICogRGlyayBCcmFuZGV3aWUgPGRpcmsuai5icmFuZGV3aWVAaW50ZWwuY29tPgorICogIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBmb3IgU0RJTworICoKKyAqIEluYWt5IFBlcmV6LUdvbnphbGV6IDxpbmFreS5wZXJlei1nb256YWxlekBpbnRlbC5jb20+CisgKiAgLSBTRElPIHJlaGFzaCBmb3IgY2hhbmdlcyBpbiB0aGUgYnVzLWRyaXZlciBtb2RlbAorICoKKyAqIFRIRSBQUk9DRURVUkUKKyAqCisgKiBTZWUgZncuYyBmb3IgdGhlIGdlbmVyaWMgZGVzY3JpcHRpb24gb2YgdGhpcyBwcm9jZWR1cmUuCisgKgorICogVGhpcyBmaWxlIGltcGxlbWVudHMgb25seSB0aGUgU0RJTyBzcGVjaWZpY3MuIEl0IGJvaWxzIGRvd24gdG8gaG93CisgKiB0byBzZW5kIGEgY29tbWFuZCBhbmQgd2FpdGluZyBmb3IgYW4gYWNrbm93bGVkZ2VtZW50IGZyb20gdGhlCisgKiBkZXZpY2UuIFdlIGRvIHBvbGxlZCByZWFkcy4KKyAqCisgKiBDT01NQU5EIEVYRUNVVElPTgorICoKKyAqIFRIZSBnZW5lcmljIGZpcm13YXJlIHVwbG9hZCBjb2RlIHdpbGwgY2FsbCBpMjQwMG1fYnVzX2JtX2NtZF9zZW5kKCkKKyAqIHRvIHNlbmQgY29tbWFuZHMuCisgKgorICogVGhlIFNESU8gZGV2aWNlcyBleHBlY3RzIHRoaW5ncyBpbiAyNTYgYnl0ZSBibG9ja3MsIHNvIGl0IHdpbGwgcGFkCisgKiBpdCwgY29tcHV0ZSB0aGUgY2hlY2tzdW0gKGlmIG5lZWRlZCkgYW5kIHBhc3MgaXQgdG8gU0RJTy4KKyAqCisgKiBBQ0sgUkVDRVBUSU9OCisgKgorICogVGhpcyB3b3JrcyBpbiBwb2xsaW5nIG1vZGUgLS0gdGhlIGZ3IGxvYWRlciBzYXlzIHdoZW4gdG8gd2FpdCBmb3IKKyAqIGRhdGEgYW5kIGZvciB0aGF0IGl0IGNhbGxzIGkyNDAwbXNfYnVzX2JtX3dhaXRfZm9yX2FjaygpLgorICoKKyAqIFRoaXMgd2lsbCBwb2xsIHRoZSBkZXZpY2UgZm9yIGRhdGEgdW50aWwgaXQgaXMgcmVjZWl2ZWQuIFdlIG5lZWQgdG8KKyAqIHJlY2VpdmUgYXQgbGVhc3QgYXMgbXVjaCBieXRlcyBhcyB3aGVyZSBhc2tlZCBmb3IgKGFsdGhvdWdoIGl0J2xsCisgKiBhbHdheXMgYmUgYSBtdWx0aXBsZSBvZiAyNTYgYnl0ZXMpLgorICovCisjaW5jbHVkZSA8bGludXgvbW1jL3NkaW9fZnVuYy5oPgorI2luY2x1ZGUgImkyNDAwbS1zZGlvLmgiCisKKworI2RlZmluZSBEX1NVQk1PRFVMRSBmdworI2luY2x1ZGUgInNkaW8tZGVidWctbGV2ZWxzLmgiCisKKy8qCisgKiBTZW5kIGEgYm9vdC1tb2RlIGNvbW1hbmQgdG8gdGhlIFNESU8gZnVuY3Rpb24KKyAqCisgKiBXZSB1c2UgYSBib3VuY2UgYnVmZmVyIChpMjQwMG0tPmJtX2NtZF9idWYpIGJlY2F1c2Ugd2UgbmVlZCB0bworICogdG91Y2ggdGhlIGhlYWRlciBpZiB0aGUgUkFXIGZsYWcgaXMgbm90IHNldC4KKyAqCisgKiBAZmxhZ3M6IHBhc3MgdGhydSBmcm9tIGkyNDAwbV9ibV9jbWQoKQorICogQHJldHVybjogY21kX3NpemUgaWYgb2ssIDwgMCBlcnJubyBjb2RlIG9uIGVycm9yLgorICoKKyAqIE5vdGUgdGhlIGNvbW1hbmQgaXMgcGFkZGVkIHRvIHRoZSBTRElPIGJsb2NrIHNpemUgZm9yIHRoZSBkZXZpY2UuCisgKi8KK3NzaXplX3QgaTI0MDBtc19idXNfYm1fY21kX3NlbmQoc3RydWN0IGkyNDAwbSAqaTI0MDBtLAorCQkJCWNvbnN0IHN0cnVjdCBpMjQwMG1fYm9vdHJvbV9oZWFkZXIgKl9jbWQsCisJCQkJc2l6ZV90IGNtZF9zaXplLCBpbnQgZmxhZ3MpCit7CisJc3NpemVfdCByZXN1bHQ7CisJc3RydWN0IGRldmljZSAqZGV2ID0gaTI0MDBtX2RldihpMjQwMG0pOworCXN0cnVjdCBpMjQwMG1zICppMjQwMG1zID0gY29udGFpbmVyX29mKGkyNDAwbSwgc3RydWN0IGkyNDAwbXMsIGkyNDAwbSk7CisJaW50IG9wY29kZSA9IF9jbWQgPT0gTlVMTCA/IC0xIDogaTI0MDBtX2JyaF9nZXRfb3Bjb2RlKF9jbWQpOworCXN0cnVjdCBpMjQwMG1fYm9vdHJvbV9oZWFkZXIgKmNtZDsKKwkvKiBTRElPIHJlc3RyaWN0aW9uICovCisJc2l6ZV90IGNtZF9zaXplX2EgPSBBTElHTihjbWRfc2l6ZSwgSTI0MDBNU19CTEtfU0laRSk7CisKKwlkX2Zuc3RhcnQoNSwgZGV2LCAiKGkyNDAwbSAlcCBjbWQgJXAgc2l6ZSAlenUpXG4iLAorCQkgIGkyNDAwbSwgX2NtZCwgY21kX3NpemUpOworCXJlc3VsdCA9IC1FMkJJRzsKKwlpZiAoY21kX3NpemUgPiBJMjQwME1fQk1fQ01EX0JVRl9TSVpFKQorCQlnb3RvIGVycm9yX3Rvb19iaWc7CisKKwltZW1jcHkoaTI0MDBtLT5ibV9jbWRfYnVmLCBfY21kLCBjbWRfc2l6ZSk7CS8qIFByZXAgY29tbWFuZCAqLworCWNtZCA9IGkyNDAwbS0+Ym1fY21kX2J1ZjsKKwlpZiAoY21kX3NpemVfYSA+IGNtZF9zaXplKQkJCS8qIFplcm8gcGFkIHNwYWNlICovCisJCW1lbXNldChpMjQwMG0tPmJtX2NtZF9idWYgKyBjbWRfc2l6ZSwgMCwgY21kX3NpemVfYSAtIGNtZF9zaXplKTsKKwlpZiAoKGZsYWdzICYgSTI0MDBNX0JNX0NNRF9SQVcpID09IDApIHsKKwkJaWYgKFdBUk5fT04oaTI0MDBtX2JyaF9nZXRfcmVzcG9uc2VfcmVxdWlyZWQoY21kKSA9PSAwKSkKKwkJCWRldl93YXJuKGRldiwgIlNXIEJVRzogcmVzcG9uc2VfcmVxdWlyZWQgPT0gMFxuIik7CisJCWkyNDAwbV9ibV9jbWRfcHJlcGFyZShjbWQpOworCX0KKwlkX3ByaW50Zig0LCBkZXYsICJCTSBjbWQgJWQ6ICV6dSBieXRlcyAoJXp1IHBhZGRlZClcbiIsCisJCSBvcGNvZGUsIGNtZF9zaXplLCBjbWRfc2l6ZV9hKTsKKwlkX2R1bXAoNSwgZGV2LCBjbWQsIGNtZF9zaXplKTsKKworCXNkaW9fY2xhaW1faG9zdChpMjQwMG1zLT5mdW5jKTsJCQkvKiBTZW5kICYgY2hlY2sgKi8KKwlyZXN1bHQgPSBzZGlvX21lbWNweV90b2lvKGkyNDAwbXMtPmZ1bmMsIEkyNDAwTVNfREFUQV9BRERSLAorCQkJCSAgaTI0MDBtLT5ibV9jbWRfYnVmLCBjbWRfc2l6ZV9hKTsKKwlzZGlvX3JlbGVhc2VfaG9zdChpMjQwMG1zLT5mdW5jKTsKKwlpZiAocmVzdWx0IDwgMCkgeworCQlkZXZfZXJyKGRldiwgIkJNIGNtZCAlZDogY2Fubm90IHNlbmQ6ICVsZFxuIiwKKwkJCW9wY29kZSwgKGxvbmcpIHJlc3VsdCk7CisJCWdvdG8gZXJyb3JfY21kX3NlbmQ7CisJfQorCXJlc3VsdCA9IGNtZF9zaXplOworZXJyb3JfY21kX3NlbmQ6CitlcnJvcl90b29fYmlnOgorCWRfZm5lbmQoNSwgZGV2LCAiKGkyNDAwbSAlcCBjbWQgJXAgc2l6ZSAlenUpID0gJWRcbiIsCisJCWkyNDAwbSwgX2NtZCwgY21kX3NpemUsIChpbnQpIHJlc3VsdCk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworCisvKgorICogUmVhZCBhbiBhY2sgZnJvbSB0aGUgZGV2aWNlJ3MgYm9vdC1tb2RlIChwb2xsaW5nKQorICoKKyAqIEBpMjQwMG06CisgKiBAX2FjazogcG9pbnRlciB0byB3aGVyZSB0byBzdG9yZSB0aGUgcmVhZCBkYXRhCisgKiBAYWNrX3NpemU6IGhvdyBtYW55IGJ5dGVzIHdlIHNob3VsZCByZWFkCisgKgorICogUmV0dXJuczogPCAwIGVycm5vIGNvZGUgb24gZXJyb3I7IG90aGVyd2lzZSwgYW1vdW50IG9mIHJlY2VpdmVkIGJ5dGVzLgorICoKKyAqIFRoZSBBQ0sgZm9yIGEgQk0gY29tbWFuZCBpcyBhbHdheXMgYXQgbGVhc3Qgc2l6ZW9mKCphY2spIGJ5dGVzLCBzbworICogY2hlY2sgZm9yIHRoYXQuIFdlIGRvbid0IG5lZWQgdG8gY2hlY2sgZm9yIGRldmljZSByZWJvb3RzCisgKgorICogTk9URTogV2UgZG8gYW4gYXJ0aWZpY2lhbCB0aW1lb3V0IG9mIDEgc2VjIG92ZXIgdGhlIFNESU8gdGltZW91dDsKKyAqICAgICB0aGlzIHdheSB3ZSBoYXZlIGNvbnRyb2wgb3ZlciBpdC4uLnRoZXJlIGlzIG5vIHdheSB0aGF0IEkga25vdworICogICAgIG9mIHNldHRpbmcgYW4gU0RJTyB0cmFuc2FjdGlvbiB0aW1lb3V0LgorICovCitzc2l6ZV90IGkyNDAwbXNfYnVzX2JtX3dhaXRfZm9yX2FjayhzdHJ1Y3QgaTI0MDBtICppMjQwMG0sCisJCQkJICAgIHN0cnVjdCBpMjQwMG1fYm9vdHJvbV9oZWFkZXIgKmFjaywKKwkJCQkgICAgc2l6ZV90IGFja19zaXplKQoreworCWludCByZXN1bHQ7CisJc3NpemVfdCByeF9zaXplOworCXU2NCB0aW1lb3V0OworCXN0cnVjdCBpMjQwMG1zICppMjQwMG1zID0gY29udGFpbmVyX29mKGkyNDAwbSwgc3RydWN0IGkyNDAwbXMsIGkyNDAwbSk7CisJc3RydWN0IHNkaW9fZnVuYyAqZnVuYyA9IGkyNDAwbXMtPmZ1bmM7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJmZ1bmMtPmRldjsKKworCUJVR19PTihzaXplb2YoKmFjaykgPiBhY2tfc2l6ZSk7CisKKwlkX2Zuc3RhcnQoNSwgZGV2LCAiKGkyNDAwbSAlcCBhY2sgJXAgc2l6ZSAlenUpXG4iLAorCQkgIGkyNDAwbSwgYWNrLCBhY2tfc2l6ZSk7CisKKwl0aW1lb3V0ID0gZ2V0X2ppZmZpZXNfNjQoKSArIDIgKiBIWjsKKwlzZGlvX2NsYWltX2hvc3QoZnVuYyk7CisJd2hpbGUgKDEpIHsKKwkJaWYgKHRpbWVfYWZ0ZXI2NChnZXRfamlmZmllc182NCgpLCB0aW1lb3V0KSkgeworCQkJcnhfc2l6ZSA9IC1FVElNRURPVVQ7CisJCQlkZXZfZXJyKGRldiwgInRpbWVvdXQgd2FpdGluZyBmb3IgYWNrIGRhdGFcbiIpOworCQkJZ290byBlcnJvcl90aW1lZG91dDsKKwkJfQorCisJCS8qIEZpbmQgdGhlIFJYIHNpemUsIGNoZWNrIGlmIGl0IGZpdHMgb3Igbm90IC0tIGl0IGlmCisJCSAqIGRvZXNuJ3QgZml0LCBmYWlsLCBhcyB3ZSBoYXZlIG5vIHdheSB0byBkaXNwb3NlIG9mCisJCSAqIHRoZSBleHRyYSBkYXRhLiAqLworCQlyeF9zaXplID0gX19pMjQwMG1zX3J4X2dldF9zaXplKGkyNDAwbXMpOworCQlpZiAocnhfc2l6ZSA8IDApCisJCQlnb3RvIGVycm9yX3J4X2dldF9zaXplOworCQlyZXN1bHQgPSAtRU5PU1BDOwkJLyogQ2hlY2sgaXQgZml0cyAqLworCQlpZiAocnhfc2l6ZSA8IHNpemVvZigqYWNrKSkgeworCQkJcnhfc2l6ZSA9IC1FSU87CisJCQlkZXZfZXJyKGRldiwgIkhXIEJVRz8gcmVjZWl2ZWQgaXMgdG9vIHNtYWxsICglenUgdnMgIgorCQkJCSIlenUgbmVlZGVkKVxuIiwgc2l6ZW9mKCphY2spLCByeF9zaXplKTsKKwkJCWdvdG8gZXJyb3JfdG9vX3NtYWxsOworCQl9CisJCWlmIChyeF9zaXplID4gSTI0MDBNX0JNX0FDS19CVUZfU0laRSkgeworCQkJZGV2X2VycihkZXYsICJTVyBCVUc/IEJNX0FDS19CVUYgaXMgdG9vIHNtYWxsICgldSB2cyAiCisJCQkJIiV6dSBuZWVkZWQpXG4iLCBJMjQwME1fQk1fQUNLX0JVRl9TSVpFLAorCQkJCXJ4X3NpemUpOworCQkJZ290byBlcnJvcl90b29fc21hbGw7CisJCX0KKworCQkvKiBSZWFkIGl0ICovCisJCXJlc3VsdCA9IHNkaW9fbWVtY3B5X2Zyb21pbyhmdW5jLCBpMjQwMG0tPmJtX2Fja19idWYsCisJCQkJCSAgICBJMjQwME1TX0RBVEFfQUREUiwgcnhfc2l6ZSk7CisJCWlmIChyZXN1bHQgPT0gLUVUSU1FRE9VVCB8fCByZXN1bHQgPT0gLUVUSU1FKQorCQkJY29udGludWU7CisJCWlmIChyZXN1bHQgPCAwKSB7CisJCQlkZXZfZXJyKGRldiwgIkJNIFNESU8gcmVjZWl2ZSAoJXp1IEIpIGZhaWxlZDogJWRcbiIsCisJCQkJcnhfc2l6ZSwgcmVzdWx0KTsKKwkJCWdvdG8gZXJyb3JfcmVhZDsKKwkJfSBlbHNlCisJCQlicmVhazsKKwl9CisJcnhfc2l6ZSA9IG1pbigoc3NpemVfdClhY2tfc2l6ZSwgcnhfc2l6ZSk7CisJbWVtY3B5KGFjaywgaTI0MDBtLT5ibV9hY2tfYnVmLCByeF9zaXplKTsKK2Vycm9yX3JlYWQ6CitlcnJvcl90b29fc21hbGw6CitlcnJvcl9yeF9nZXRfc2l6ZToKK2Vycm9yX3RpbWVkb3V0OgorCXNkaW9fcmVsZWFzZV9ob3N0KGZ1bmMpOworCWRfZm5lbmQoNSwgZGV2LCAiKGkyNDAwbSAlcCBhY2sgJXAgc2l6ZSAlenUpID0gJWxkXG4iLAorCQlpMjQwMG0sIGFjaywgYWNrX3NpemUsIChsb25nKSByeF9zaXplKTsKKwlyZXR1cm4gcnhfc2l6ZTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS9zZGlvLXJ4LmMgYi9kcml2ZXJzL25ldC93aW1heC9pMjQwMG0vc2Rpby1yeC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzMDA4YjkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aW1heC9pMjQwMG0vc2Rpby1yeC5jCkBAIC0wLDAgKzEsMjU1IEBACisvKgorICogSW50ZWwgV2lyZWxlc3MgV2lNQVggQ29ubmVjdGlvbiAyNDAwbQorICogU0RJTyBSWCBoYW5kbGluZworICoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICAgZGlzdHJpYnV0aW9uLgorICogICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKgorICogSW50ZWwgQ29ycG9yYXRpb24gPGxpbnV4LXdpbWF4QGludGVsLmNvbT4KKyAqIERpcmsgQnJhbmRld2llIDxkaXJrLmouYnJhbmRld2llQGludGVsLmNvbT4KKyAqICAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqCisgKgorICogVGhpcyBoYW5kbGVzIHRoZSBSWCBwYXRoIG9uIFNESU8uCisgKgorICogVGhlIFNESU8gYnVzIGRyaXZlciBjYWxscyB0aGUgImlycSIgcm91dGluZSB3aGVuIGRhdGEgaXMgYXZhaWxhYmxlLgorICogVGhpcyBpcyBub3QgYSB0cmFkaXRpb25hbCBpbnRlcnJ1cHQgcm91dGluZSBzaW5jZSB0aGUgU0RJTyBidXMKKyAqIGRyaXZlciBjYWxscyB1cyBmcm9tIGl0cyBpcnEgdGhyZWFkIGNvbnRleHQuICBCZWNhdXNlIG9mIHRoaXMKKyAqIHNsZWVwaW5nIGluIHRoZSBTRElPIFJYIElSUSByb3V0aW5lIGlzIG9rYXkuCisgKgorICogRnJvbSB0aGVyZSBvbiwgd2Ugb2J0YWluIHRoZSBzaXplIG9mIHRoZSBkYXRhIHRoYXQgaXMgYXZhaWxhYmxlLAorICogYWxsb2NhdGUgYW4gc2tiLCBjb3B5IGl0IGFuZCB0aGVuIHBhc3MgaXQgdG8gdGhlIGdlbmVyaWMgZHJpdmVyJ3MKKyAqIFJYIHJvdXRpbmUgW2kyNDAwbV9yeCgpXS4KKyAqCisgKiBST0FETUFQCisgKgorICogaTI0MDBtc19pcnEoKQorICogICBpMjQwMG1zX3J4KCkKKyAqICAgICBfX2kyNDAwbXNfcnhfZ2V0X3NpemUoKQorICogICAgIGkyNDAwbV9yeCgpCisgKgorICogaTI0MDBtc19yeF9zZXR1cCgpCisgKgorICogaTI0MDBtc19yeF9yZWxlYXNlKCkKKyAqLworI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9tbWMvc2Rpby5oPgorI2luY2x1ZGUgPGxpbnV4L21tYy9zZGlvX2Z1bmMuaD4KKyNpbmNsdWRlICJpMjQwMG0tc2Rpby5oIgorCisjZGVmaW5lIERfU1VCTU9EVUxFIHJ4CisjaW5jbHVkZSAic2Rpby1kZWJ1Zy1sZXZlbHMuaCIKKworCisvKgorICogUmVhZCBhbmQgcmV0dXJuIHRoZSBhbW91bnQgb2YgYnl0ZXMgYXZhaWxhYmxlIGZvciBSWAorICoKKyAqIFRoZSBSWCBzaXplIGhhcyB0byBiZSByZWFkIGxpa2UgdGhpczogYnl0ZSByZWFkcyBvZiB0aHJlZQorICogc2VxdWVudGlhbCBsb2NhdGlvbnM7IHRoZW4gZ2x1ZSdlbSB0b2dldGhlci4KKyAqCisgKiBzZGlvX3JlYWRsKCkgZG9lc24ndCB3b3JrLgorICovCitzc2l6ZV90IF9faTI0MDBtc19yeF9nZXRfc2l6ZShzdHJ1Y3QgaTI0MDBtcyAqaTI0MDBtcykKK3sKKwlpbnQgcmV0LCBjbnQsIHZhbDsKKwlzc2l6ZV90IHJ4X3NpemU7CisJdW5zaWduZWQgeGZlcl9zaXplX2FkZHI7CisJc3RydWN0IHNkaW9fZnVuYyAqZnVuYyA9IGkyNDAwbXMtPmZ1bmM7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJmkyNDAwbXMtPmZ1bmMtPmRldjsKKworCWRfZm5zdGFydCg3LCBkZXYsICIoaTI0MDBtcyAlcClcbiIsIGkyNDAwbXMpOworCXhmZXJfc2l6ZV9hZGRyID0gSTI0MDBNU19JTlRSX0dFVF9TSVpFX0FERFI7CisJcnhfc2l6ZSA9IDA7CisJZm9yIChjbnQgPSAwOyBjbnQgPCAzOyBjbnQrKykgeworCQl2YWwgPSBzZGlvX3JlYWRiKGZ1bmMsIHhmZXJfc2l6ZV9hZGRyICsgY250LCAmcmV0KTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWRldl9lcnIoZGV2LCAiUlg6IENhbid0IHJlYWQgYnl0ZSAlZCBvZiBSWCBzaXplIGZyb20gIgorCQkJCSIweCUwOHg6ICVkXG4iLCBjbnQsIHhmZXJfc2l6ZV9hZGRyICsgY250LCByZXQpOworCQkJcnhfc2l6ZSA9IHJldDsKKwkJCWdvdG8gZXJyb3JfcmVhZDsKKwkJfQorCQlyeF9zaXplID0gcnhfc2l6ZSA8PCA4IHwgKHZhbCAmIDB4ZmYpOworCX0KKwlkX3ByaW50Zig2LCBkZXYsICJSWDogcnhfc2l6ZSBpcyAlbGRcbiIsIChsb25nKSByeF9zaXplKTsKK2Vycm9yX3JlYWQ6CisJZF9mbmVuZCg3LCBkZXYsICIoaTI0MDBtcyAlcCkgPSAlbGRcbiIsIGkyNDAwbXMsIChsb25nKSByeF9zaXplKTsKKwlyZXR1cm4gcnhfc2l6ZTsKK30KKworCisvKgorICogUmVhZCBkYXRhIGZyb20gdGhlIGRldmljZSAod2hlbiBpbiBub3JtYWwpCisgKgorICogQWxsb2NhdGUgYW4gU0tCIG9mIHRoZSByaWdodCBzaXplLCByZWFkIHRoZSBkYXRhIGluIGFuZCB0aGVuCisgKiBkZWxpdmVyIGl0IHRvIHRoZSBnZW5lcmljIGxheWVyLgorICoKKyAqIFdlIGFsc28gY2hlY2sgZm9yIGEgcmVib290IGJhcmtlci4gVGhhdCBtZWFucyB0aGUgZGV2aWNlIGRpZWQgYW5kCisgKiB3ZSBoYXZlIHRvIHJlYm9vdCBpdC4KKyAqLworc3RhdGljCit2b2lkIGkyNDAwbXNfcngoc3RydWN0IGkyNDAwbXMgKmkyNDAwbXMpCit7CisJaW50IHJldDsKKwlzdHJ1Y3Qgc2Rpb19mdW5jICpmdW5jID0gaTI0MDBtcy0+ZnVuYzsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmZnVuYy0+ZGV2OworCXN0cnVjdCBpMjQwMG0gKmkyNDAwbSA9ICZpMjQwMG1zLT5pMjQwMG07CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzc2l6ZV90IHJ4X3NpemU7CisKKwlkX2Zuc3RhcnQoNywgZGV2LCAiKGkyNDAwbXMgJXApXG4iLCBpMjQwMG1zKTsKKwlyeF9zaXplID0gX19pMjQwMG1zX3J4X2dldF9zaXplKGkyNDAwbXMpOworCWlmIChyeF9zaXplIDwgMCkgeworCQlyZXQgPSByeF9zaXplOworCQlnb3RvIGVycm9yX2dldF9zaXplOworCX0KKwlyZXQgPSAtRU5PTUVNOworCXNrYiA9IGFsbG9jX3NrYihyeF9zaXplLCBHRlBfQVRPTUlDKTsKKwlpZiAoTlVMTCA9PSBza2IpIHsKKwkJZGV2X2VycihkZXYsICJSWDogdW5hYmxlIHRvIGFsbG9jIHNrYlxuIik7CisJCWdvdG8gZXJyb3JfYWxsb2Nfc2tiOworCX0KKworCXJldCA9IHNkaW9fbWVtY3B5X2Zyb21pbyhmdW5jLCBza2ItPmRhdGEsCisJCQkJIEkyNDAwTVNfREFUQV9BRERSLCByeF9zaXplKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGRldiwgIlJYOiBTRElPIGRhdGEgcmVhZCBmYWlsZWQ6ICVkXG4iLCByZXQpOworCQlnb3RvIGVycm9yX21lbWNweV9mcm9taW87CisJfQorCS8qIENoZWNrIGlmIGRldmljZSBoYXMgcmVzZXQgKi8KKwlpZiAoIW1lbWNtcChza2ItPmRhdGEsIGkyNDAwbV9OQk9PVF9CQVJLRVIsCisJCSAgICBzaXplb2YoaTI0MDBtX05CT09UX0JBUktFUikpCisJICAgIHx8ICFtZW1jbXAoc2tiLT5kYXRhLCBpMjQwMG1fU0JPT1RfQkFSS0VSLAorCQkgICAgICAgc2l6ZW9mKGkyNDAwbV9TQk9PVF9CQVJLRVIpKSkgeworCQlyZXQgPSBpMjQwMG1fZGV2X3Jlc2V0X2hhbmRsZShpMjQwMG0pOworCQlrZnJlZV9za2Ioc2tiKTsKKwl9IGVsc2UgeworCQlza2JfcHV0KHNrYiwgcnhfc2l6ZSk7CisJCWkyNDAwbV9yeChpMjQwMG0sIHNrYik7CisJfQorCWRfZm5lbmQoNywgZGV2LCAiKGkyNDAwbXMgJXApID0gdm9pZFxuIiwgaTI0MDBtcyk7CisJcmV0dXJuOworCitlcnJvcl9tZW1jcHlfZnJvbWlvOgorCWtmcmVlX3NrYihza2IpOworZXJyb3JfYWxsb2Nfc2tiOgorZXJyb3JfZ2V0X3NpemU6CisJZF9mbmVuZCg3LCBkZXYsICIoaTI0MDBtcyAlcCkgPSAlZFxuIiwgaTI0MDBtcywgcmV0KTsKKwlyZXR1cm47Cit9CisKKworLyoKKyAqIFByb2Nlc3MgYW4gaW50ZXJydXB0IGZyb20gdGhlIFNESU8gY2FyZAorICoKKyAqIEZJWE1FOiBuZWVkIHRvIHByb2Nlc3Mgb3RoZXIgZXZlbnRzIHRoYXQgYXJlIG5vdCBqdXN0IHJlYWR5LXRvLXJlYWQKKyAqCisgKiBDaGVja3MgdGhlcmUgaXMgZGF0YSByZWFkeSBhbmQgdGhlbiBwcm9jZWVkcyB0byByZWFkIGl0LgorICovCitzdGF0aWMKK3ZvaWQgaTI0MDBtc19pcnEoc3RydWN0IHNkaW9fZnVuYyAqZnVuYykKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBpMjQwMG1zICppMjQwMG1zID0gc2Rpb19nZXRfZHJ2ZGF0YShmdW5jKTsKKwlzdHJ1Y3QgaTI0MDBtICppMjQwMG0gPSAmaTI0MDBtcy0+aTI0MDBtOworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZmdW5jLT5kZXY7CisJaW50IHZhbDsKKworCWRfZm5zdGFydCg2LCBkZXYsICIoaTI0MDBtcyAlcClcbiIsIGkyNDAwbXMpOworCXZhbCA9IHNkaW9fcmVhZGIoZnVuYywgSTI0MDBNU19JTlRSX1NUQVRVU19BRERSLCAmcmV0KTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGRldiwgIlJYOiBDYW4ndCByZWFkIGludGVycnVwdCBzdGF0dXM6ICVkXG4iLCByZXQpOworCQlnb3RvIGVycm9yX25vX2lycTsKKwl9CisJaWYgKCF2YWwpIHsKKwkJZGV2X2VycihkZXYsICJSWDogQlVHPyBnb3QgSVJRIGJ1dCBubyBpbnRlcnJ1cHQgcmVhZHk/XG4iKTsKKwkJZ290byBlcnJvcl9ub19pcnE7CisJfQorCXNkaW9fd3JpdGViKGZ1bmMsIDEsIEkyNDAwTVNfSU5UUl9DTEVBUl9BRERSLCAmcmV0KTsKKwlpZiAoV0FSTl9PTihpMjQwMG0tPmJvb3RfbW9kZSAhPSAwKSkKKwkJZGV2X2VycihkZXYsICJSWDogU1cgQlVHPyBib290IG1vZGUgYW5kIElSUSBpcyB1cD9cbiIpOworCWVsc2UKKwkJaTI0MDBtc19yeChpMjQwMG1zKTsKK2Vycm9yX25vX2lycToKKwlkX2ZuZW5kKDYsIGRldiwgIihpMjQwMG1zICVwKSA9IHZvaWRcbiIsIGkyNDAwbXMpOworCXJldHVybjsKK30KKworCisvKgorICogU2V0dXAgU0RJTyBSWAorICoKKyAqIEhvb2tzIHVwIHRoZSBJUlEgaGFuZGxlciBhbmQgdGhlbiBlbmFibGVzIElSUXMuCisgKi8KK2ludCBpMjQwMG1zX3J4X3NldHVwKHN0cnVjdCBpMjQwMG1zICppMjQwMG1zKQoreworCWludCByZXN1bHQ7CisJc3RydWN0IHNkaW9fZnVuYyAqZnVuYyA9IGkyNDAwbXMtPmZ1bmM7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJmZ1bmMtPmRldjsKKworCWRfZm5zdGFydCg1LCBkZXYsICIoaTI0MDBtcyAlcClcbiIsIGkyNDAwbXMpOworCXNkaW9fY2xhaW1faG9zdChmdW5jKTsKKwlyZXN1bHQgPSBzZGlvX2NsYWltX2lycShmdW5jLCBpMjQwMG1zX2lycSk7CisJaWYgKHJlc3VsdCA8IDApIHsKKwkJZGV2X2VycihkZXYsICJDYW5ub3QgY2xhaW0gSVJROiAlZFxuIiwgcmVzdWx0KTsKKwkJZ290byBlcnJvcl9pcnFfY2xhaW07CisJfQorCXJlc3VsdCA9IDA7CisJc2Rpb193cml0ZWIoZnVuYywgMSwgSTI0MDBNU19JTlRSX0VOQUJMRV9BRERSLCAmcmVzdWx0KTsKKwlpZiAocmVzdWx0IDwgMCkgeworCQlzZGlvX3JlbGVhc2VfaXJxKGZ1bmMpOworCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byBlbmFibGUgaW50ZXJydXB0cyAlZFxuIiwgcmVzdWx0KTsKKwl9CitlcnJvcl9pcnFfY2xhaW06CisJc2Rpb19yZWxlYXNlX2hvc3QoZnVuYyk7CisJZF9mbmVuZCg1LCBkZXYsICIoaTI0MDBtcyAlcCkgPSAlZFxuIiwgaTI0MDBtcywgcmVzdWx0KTsKKwlyZXR1cm4gcmVzdWx0OworfQorCisKKy8qCisgKiBUZWFyIGRvd24gU0RJTyBSWAorICoKKyAqIERpc2FibGVzIElSUXMgaW4gdGhlIGRldmljZSBhbmQgcmVtb3ZlcyB0aGUgSVJRIGhhbmRsZXIuCisgKi8KK3ZvaWQgaTI0MDBtc19yeF9yZWxlYXNlKHN0cnVjdCBpMjQwMG1zICppMjQwMG1zKQoreworCWludCByZXN1bHQ7CisJc3RydWN0IHNkaW9fZnVuYyAqZnVuYyA9IGkyNDAwbXMtPmZ1bmM7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJmZ1bmMtPmRldjsKKworCWRfZm5zdGFydCg1LCBkZXYsICIoaTI0MDBtcyAlcClcbiIsIGkyNDAwbXMpOworCXNkaW9fY2xhaW1faG9zdChmdW5jKTsKKwlzZGlvX3dyaXRlYihmdW5jLCAwLCBJMjQwME1TX0lOVFJfRU5BQkxFX0FERFIsICZyZXN1bHQpOworCXNkaW9fcmVsZWFzZV9pcnEoZnVuYyk7CisJc2Rpb19yZWxlYXNlX2hvc3QoZnVuYyk7CisJZF9mbmVuZCg1LCBkZXYsICIoaTI0MDBtcyAlcCkgPSAlZFxuIiwgaTI0MDBtcywgcmVzdWx0KTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS9zZGlvLXR4LmMgYi9kcml2ZXJzL25ldC93aW1heC9pMjQwMG0vc2Rpby10eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxMDVhNWUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aW1heC9pMjQwMG0vc2Rpby10eC5jCkBAIC0wLDAgKzEsMTUzIEBACisvKgorICogSW50ZWwgV2lyZWxlc3MgV2lNQVggQ29ubmVjdGlvbiAyNDAwbQorICogU0RJTyBUWCB0cmFuc2FjdGlvbiBiYWNrZW5kcworICoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICAgZGlzdHJpYnV0aW9uLgorICogICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKgorICogSW50ZWwgQ29ycG9yYXRpb24gPGxpbnV4LXdpbWF4QGludGVsLmNvbT4KKyAqIERpcmsgQnJhbmRld2llIDxkaXJrLmouYnJhbmRld2llQGludGVsLmNvbT4KKyAqICAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqCisgKgorICogVGFrZXMgdGhlIFRYIG1lc3NhZ2VzIGluIHRoZSBpMjQwMG0ncyBkcml2ZXIgVFggRklGTyBhbmQgc2VuZHMgdGhlbQorICogdG8gdGhlIGRldmljZSB1bnRpbCB0aGVyZSBhcmUgbm8gbW9yZS4KKyAqCisgKiBJZiB3ZSBmYWlsIHNlbmRpbmcgdGhlIG1lc3NhZ2UsIHdlIGp1c3QgZHJvcCBpdC4gVGhlcmUgaXNuJ3QgbXVjaAorICogd2UgY2FuIGRvIGF0IHRoaXMgcG9pbnQuIE1vc3Qgb2YgdGhlIHRyYWZmaWMgaXMgbmV0d29yaywgd2hpY2ggaGFzCisgKiByZWNvdmVyeSBtZXRob2RzIGZvciBkcm9wcGVkIHBhY2tldHMuCisgKgorICogVGhlIFNESU8gZnVuY3Rpb25zIGFyZSBub3QgYXRvbWljLCBzbyB3ZSBjYW4ndCBydW4gZnJvbSB0aGUgY29udGV4dAorICogd2hlcmUgaTI0MDBtLT5idXNfdHhfa2ljaygpIFtpMjQwMG1zX2J1c190eF9raWNrKCldIGlzIGJlaW5nIGNhbGxlZAorICogKHNvbWUgdGltZXMgYXRvbWljKS4gVGh1cywgdGhlIGFjdHVhbCBUWCB3b3JrIGlzIGRlZmVycmVkIHRvIGEKKyAqIHdvcmtxdWV1ZS4KKyAqCisgKiBST0FETUFQCisgKgorICogaTI0MDBtc19idXNfdHhfa2ljaygpCisgKiAgIGkyNDAwbXNfdHhfc3VibWl0KCkgICAgIFt0aHJvdWdoIHdvcmtxdWV1ZV0KKyAqCisgKiBpMjQwMG1fdHhfc2V0dXAoKQorICoKKyAqIGkyNDAwbV90eF9yZWxlYXNlKCkKKyAqLworI2luY2x1ZGUgPGxpbnV4L21tYy9zZGlvX2Z1bmMuaD4KKyNpbmNsdWRlICJpMjQwMG0tc2Rpby5oIgorCisjZGVmaW5lIERfU1VCTU9EVUxFIHR4CisjaW5jbHVkZSAic2Rpby1kZWJ1Zy1sZXZlbHMuaCIKKworCisvKgorICogUHVsbCBUWCB0cmFuc2F0aW9ucyBmcm9tIHRoZSBUWCBGSUZPIGFuZCBzZW5kIHRoZW0gdG8gdGhlIGRldmljZQorICogdW50aWwgdGhlcmUgYXJlIG5vIG1vcmUuCisgKi8KK3N0YXRpYwordm9pZCBpMjQwMG1zX3R4X3N1Ym1pdChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndzKQoreworCWludCByZXN1bHQ7CisJc3RydWN0IGkyNDAwbXMgKmkyNDAwbXMgPSBjb250YWluZXJfb2Yod3MsIHN0cnVjdCBpMjQwMG1zLCB0eF93b3JrZXIpOworCXN0cnVjdCBpMjQwMG0gKmkyNDAwbSA9ICZpMjQwMG1zLT5pMjQwMG07CisJc3RydWN0IHNkaW9fZnVuYyAqZnVuYyA9IGkyNDAwbXMtPmZ1bmM7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJmZ1bmMtPmRldjsKKwlzdHJ1Y3QgaTI0MDBtX21zZ19oZHIgKnR4X21zZzsKKwlzaXplX3QgdHhfbXNnX3NpemU7CisKKwlkX2Zuc3RhcnQoNCwgZGV2LCAiKGkyNDAwbXMgJXAsIGkyNDAwbSAlcClcbiIsIGkyNDAwbXMsIGkyNDAwbXMpOworCisJd2hpbGUgKE5VTEwgIT0gKHR4X21zZyA9IGkyNDAwbV90eF9tc2dfZ2V0KGkyNDAwbSwgJnR4X21zZ19zaXplKSkpIHsKKwkJZF9wcmludGYoMiwgZGV2LCAiVFg6IHN1Ym1pdHRpbmcgJXp1IGJ5dGVzXG4iLCB0eF9tc2dfc2l6ZSk7CisJCWRfZHVtcCg1LCBkZXYsIHR4X21zZywgdHhfbXNnX3NpemUpOworCisJCXNkaW9fY2xhaW1faG9zdChmdW5jKTsKKwkJcmVzdWx0ID0gc2Rpb19tZW1jcHlfdG9pbyhmdW5jLCAwLCB0eF9tc2csIHR4X21zZ19zaXplKTsKKwkJc2Rpb19yZWxlYXNlX2hvc3QoZnVuYyk7CisKKwkJaTI0MDBtX3R4X21zZ19zZW50KGkyNDAwbSk7CisKKwkJaWYgKHJlc3VsdCA8IDApIHsKKwkJCWRldl9lcnIoZGV2LCAiVFg6IGNhbm5vdCBzdWJtaXQgVFg7IHR4X21zZyBAJXp1ICV6dSBCOiIKKwkJCQkiICVkXG4iLCAodm9pZCAqKSB0eF9tc2cgLSBpMjQwMG0tPnR4X2J1ZiwKKwkJCQl0eF9tc2dfc2l6ZSwgcmVzdWx0KTsKKwkJfQorCisJCWRfcHJpbnRmKDIsIGRldiwgIlRYOiAlenViIHN1Ym1pdHRlZFxuIiwgdHhfbXNnX3NpemUpOworCX0KKworCWRfZm5lbmQoNCwgZGV2LCAiKGkyNDAwbXMgJXApID0gdm9pZFxuIiwgaTI0MDBtcyk7Cit9CisKKworLyoKKyAqIFRoZSBnZW5lcmljIGRyaXZlciBub3RpZmllcyB1cyB0aGF0IHRoZXJlIGlzIGRhdGEgcmVhZHkgZm9yIFRYCisgKgorICogU2NoZWR1bGUgYSBydW4gb2YgaTI0MDBtc190eF9zdWJtaXQoKSB0byBoYW5kbGUgaXQuCisgKi8KK3ZvaWQgaTI0MDBtc19idXNfdHhfa2ljayhzdHJ1Y3QgaTI0MDBtICppMjQwMG0pCit7CisJc3RydWN0IGkyNDAwbXMgKmkyNDAwbXMgPSBjb250YWluZXJfb2YoaTI0MDBtLCBzdHJ1Y3QgaTI0MDBtcywgaTI0MDBtKTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmaTI0MDBtcy0+ZnVuYy0+ZGV2OworCisJZF9mbnN0YXJ0KDMsIGRldiwgIihpMjQwMG0gJXApID0gdm9pZFxuIiwgaTI0MDBtKTsKKworCS8qIHNjaGVkdWxlIHR4IHdvcmssIHRoaXMgaXMgYmVjYXVzZSB0eCBtYXkgYmxvY2ssIHRoZXJlZm9yZQorCSAqIGl0IGhhcyB0byBydW4gaW4gYSB0aHJlYWQgY29udGV4dC4KKwkgKi8KKwlxdWV1ZV93b3JrKGkyNDAwbXMtPnR4X3dvcmtxdWV1ZSwgJmkyNDAwbXMtPnR4X3dvcmtlcik7CisKKwlkX2ZuZW5kKDMsIGRldiwgIihpMjQwMG0gJXApID0gdm9pZFxuIiwgaTI0MDBtKTsKK30KKworaW50IGkyNDAwbXNfdHhfc2V0dXAoc3RydWN0IGkyNDAwbXMgKmkyNDAwbXMpCit7CisJaW50IHJlc3VsdDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmaTI0MDBtcy0+ZnVuYy0+ZGV2OworCXN0cnVjdCBpMjQwMG0gKmkyNDAwbSA9ICZpMjQwMG1zLT5pMjQwMG07CisKKwlkX2Zuc3RhcnQoNSwgZGV2LCAiKGkyNDAwbXMgJXApXG4iLCBpMjQwMG1zKTsKKworCUlOSVRfV09SSygmaTI0MDBtcy0+dHhfd29ya2VyLCBpMjQwMG1zX3R4X3N1Ym1pdCk7CisJc25wcmludGYoaTI0MDBtcy0+dHhfd3FfbmFtZSwgc2l6ZW9mKGkyNDAwbXMtPnR4X3dxX25hbWUpLAorCQkgIiVzLXR4IiwgaTI0MDBtLT53aW1heF9kZXYubmFtZSk7CisJaTI0MDBtcy0+dHhfd29ya3F1ZXVlID0KKwkJY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoaTI0MDBtcy0+dHhfd3FfbmFtZSk7CisJaWYgKE5VTEwgPT0gaTI0MDBtcy0+dHhfd29ya3F1ZXVlKSB7CisJCWRldl9lcnIoZGV2LCAiVFg6IGZhaWxlZCB0byBjcmVhdGUgd29ya3F1ZXVlXG4iKTsKKwkJcmVzdWx0ID0gLUVOT01FTTsKKwl9IGVsc2UKKwkJcmVzdWx0ID0gMDsKKwlkX2ZuZW5kKDUsIGRldiwgIihpMjQwMG1zICVwKSA9ICVkXG4iLCBpMjQwMG1zLCByZXN1bHQpOworCXJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgaTI0MDBtc190eF9yZWxlYXNlKHN0cnVjdCBpMjQwMG1zICppMjQwMG1zKQoreworCWRlc3Ryb3lfd29ya3F1ZXVlKGkyNDAwbXMtPnR4X3dvcmtxdWV1ZSk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aW1heC9pMjQwMG0vc2Rpby5jIGIvZHJpdmVycy9uZXQvd2ltYXgvaTI0MDBtL3NkaW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYmZhMjgzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2ltYXgvaTI0MDBtL3NkaW8uYwpAQCAtMCwwICsxLDUxMSBAQAorLyoKKyAqIEludGVsIFdpcmVsZXNzIFdpTUFYIENvbm5lY3Rpb24gMjQwMG0KKyAqIExpbnV4IGRyaXZlciBtb2RlbCBnbHVlIGZvciB0aGUgU0RJTyBkZXZpY2UsIHJlc2V0ICYgZncgdXBsb2FkCisgKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEludGVsIENvcnBvcmF0aW9uIDxsaW51eC13aW1heEBpbnRlbC5jb20+CisgKiBEaXJrIEJyYW5kZXdpZSA8ZGlyay5qLmJyYW5kZXdpZUBpbnRlbC5jb20+CisgKiBJbmFreSBQZXJlei1Hb256YWxleiA8aW5ha3kucGVyZXotZ29uemFsZXpAaW50ZWwuY29tPgorICogWWFuaXIgTHViZXRraW4gPHlhbmlyeC5sdWJldGtpbkBpbnRlbC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBLgorICoKKyAqCisgKiBTZWUgaTI0MDBtLXNkaW8uaCBmb3IgYSBnZW5lcmFsIGRlc2NyaXB0aW9uIG9mIHRoaXMgZHJpdmVyLgorICoKKyAqIFRoaXMgZmlsZSBpbXBsZW1lbnRzIGRyaXZlciBtb2RlbCBnbHVlLCBhbmQgaG9vayB1cHMgZm9yIHRoZQorICogZ2VuZXJpYyBkcml2ZXIgdG8gaW1wbGVtZW50IHRoZSBidXMtc3BlY2lmaWMgZnVuY3Rpb25zIChkZXZpY2UKKyAqIGNvbW11bmljYXRpb24gc2V0dXAvdGVhciBkb3duLCBmaXJtd2FyZSB1cGxvYWQgYW5kIHJlc2V0dGluZykuCisgKgorICogUk9BRE1BUAorICoKKyAqIGkyNDAwbV9wcm9iZSgpCisgKiAgIGFsbG9jX25ldGRldigpCisgKiAgICAgaTI0MDBtc19uZXRkZXZfc2V0dXAoKQorICogICAgICAgaTI0MDBtc19pbml0KCkKKyAqICAgICAgIGkyNDAwbV9uZXRkZXZfc2V0dXAoKQorICogICBpMjQwMG1zX2VuYWJsZV9mdW5jdGlvbigpCisgKiAgIGkyNDAwbV9zZXR1cCgpCisgKgorICogaTI0MDBtX3JlbW92ZSgpCisgKiAgICAgaTI0MDBtX3JlbGVhc2UoKQorICogICAgIGZyZWVfbmV0ZGV2KG5ldF9kZXYpCisgKgorICogaTI0MDBtc19idXNfcmVzZXQoKSAgICAgICAgICAgIENhbGxlZCBieSBpMjQwMG0tPmJ1c19yZXNldAorICogICBfX2kyNDAwbXNfcmVzZXQoKQorICogICAgIF9faTI0MDBtc19zZW5kX2JhcmtlcigpCisgKgorICogaTI0MDBtc19idXNfZGV2X3N0YXJ0KCkgICAgICAgIENhbGxlZCBieSBpMjQwMG1fZGV2X3N0YXJ0KCkgW3dobyBpcworICogICBpMjQwMG1zX3R4X3NldHVwKCkgICAgICAgICAgIGNhbGxlZCBieSBpMjQwMG1fc2V0dXAoKV0KKyAqICAgaTI0MDBtc19yeF9zZXR1cCgpCisgKgorICogaTI0MDBtc19idXNfZGV2X3N0b3AoKSAgICAgICAgIENhbGxlZCBieSBpMjQwMG1fZGV2X3N0b3AoKSBbd2hvIGlzCisgKiAgIGkyNDAwbXNfcnhfcmVsZWFzZSgpICAgICAgICAgaXMgY2FsbGVkIGJ5IGkyNDAwbV9yZWxlYXNlKCldCisgKiAgIGkyNDAwbXNfdHhfcmVsZWFzZSgpCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbW1jL3NkaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9tbWMvc2Rpb19mdW5jLmg+CisjaW5jbHVkZSAiaTI0MDBtLXNkaW8uaCIKKyNpbmNsdWRlIDxsaW51eC93aW1heC9pMjQwMG0uaD4KKworI2RlZmluZSBEX1NVQk1PRFVMRSBtYWluCisjaW5jbHVkZSAic2Rpby1kZWJ1Zy1sZXZlbHMuaCIKKworLyogSU9FIFdpTUFYIGZ1bmN0aW9uIHRpbWVvdXQgaW4gc2Vjb25kcyAqLworc3RhdGljIGludCBpb2VfdGltZW91dCA9IDI7Cittb2R1bGVfcGFyYW0oaW9lX3RpbWVvdXQsIGludCwgMCk7CisKKy8qIE91ciBmaXJtd2FyZSBmaWxlIG5hbWUgKi8KKyNkZWZpbmUgSTI0MDBNU19GV19GSUxFX05BTUUgImkyNDAwbS1mdy1zZGlvLSIgSTI0MDBNX0ZXX1ZFUlNJT04gIi5zYmNmIgorCisvKgorICogRW5hYmxlIHRoZSBTRElPIGZ1bmN0aW9uCisgKgorICogVHJpZXMgdG8gZW5hYmxlIHRoZSBTRElPIGZ1bmN0aW9uOyBtaWdodCBmYWlsIGlmIGl0IGlzIHN0aWxsIG5vdAorICogcmVhZHkgKGluIHNvbWUgaGFyZHdhcmUsIHRoZSBTRElPIFdpTUFYIGZ1bmN0aW9uIGlzIG9ubHkgZW5hYmxlZAorICogd2hlbiB3ZSBhc2sgaXQgdG8gZXhwbGljaXRseSBkb2luZykuIFRyaWVzIHVudGlsIGEgdGltZW91dCBpcworICogcmVhY2hlZC4KKyAqCisgKiBUaGUgcmV2ZXJzZSBvZiB0aGlzIGlzLi4uc2Rpb19kaXNhYmxlX2Z1bmN0aW9uKCkKKyAqCisgKiBSZXR1cm5zOiAwIGlmIHRoZSBTRElPIGZ1bmN0aW9uIHdhcyBlbmFibGVkLCA8IDAgZXJybm8gY29kZSBvbgorICogICAgIGVycm9yICgtRU5PREVWIHdoZW4gaXQgd2FzIHVuYWJsZSB0byBlbmFibGUgdGhlIGZ1bmN0aW9uKS4KKyAqLworc3RhdGljCitpbnQgaTI0MDBtc19lbmFibGVfZnVuY3Rpb24oc3RydWN0IHNkaW9fZnVuYyAqZnVuYykKK3sKKwl1NjQgdGltZW91dDsKKwlpbnQgZXJyOworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZmdW5jLT5kZXY7CisKKwlkX2Zuc3RhcnQoMywgZGV2LCAiKGZ1bmMgJXApXG4iLCBmdW5jKTsKKwkvKiBTZXR1cCB0aW1lb3V0IChGSVhNRTogVGhpcyBuZWVkcyB0byByZWFkIHRoZSBDSVMgdGFibGUgdG8KKwkgKiBnZXQgYSByZWFsIHRpbWVvdXQpIGFuZCB0aGVuIHdhaXQgZm9yIHRoZSBkZXZpY2UgdG8gc2lnbmFsCisJICogaXQgaXMgcmVhZHkgKi8KKwl0aW1lb3V0ID0gZ2V0X2ppZmZpZXNfNjQoKSArIGlvZV90aW1lb3V0ICogSFo7CisJZXJyID0gLUVOT0RFVjsKKwl3aGlsZSAoZXJyICE9IDAgJiYgdGltZV9iZWZvcmU2NChnZXRfamlmZmllc182NCgpLCB0aW1lb3V0KSkgeworCQlzZGlvX2NsYWltX2hvc3QoZnVuYyk7CisJCWVyciA9IHNkaW9fZW5hYmxlX2Z1bmMoZnVuYyk7CisJCWlmICgwID09IGVycikgeworCQkJc2Rpb19yZWxlYXNlX2hvc3QoZnVuYyk7CisJCQlkX3ByaW50ZigyLCBkZXYsICJTRElPIGZ1bmN0aW9uIGVuYWJsZWRcbiIpOworCQkJZ290byBmdW5jdGlvbl9lbmFibGVkOworCQl9CisJCWRfcHJpbnRmKDIsIGRldiwgIlNESU8gZnVuY3Rpb24gZmFpbGVkIHRvIGVuYWJsZTogJWRcbiIsIGVycik7CisJCXNkaW9fZGlzYWJsZV9mdW5jKGZ1bmMpOworCQlzZGlvX3JlbGVhc2VfaG9zdChmdW5jKTsKKwkJbXNsZWVwKEkyNDAwTVNfSU5JVF9TTEVFUF9JTlRFUlZBTCk7CisJfQorCS8qIElmIHRpbWVkIG91dCwgZGV2aWNlIGlzIG5vdCB0aGVyZSB5ZXQgLS0gZ2V0IC1FTk9ERVYgc28KKwkgKiB0aGUgZGV2aWNlIGRyaXZlciBjb3JlIHdpbGwgcmV0cnkgbGF0ZXIgb24uICovCisJaWYgKGVyciA9PSAtRVRJTUUpIHsKKwkJZGV2X2VycihkZXYsICJDYW4ndCBlbmFibGUgV2lNQVggZnVuY3Rpb247ICIKKwkJCSIgaGFzIHRoZSBmdW5jdGlvbiBiZWVuIGVuYWJsZWQ/XG4iKTsKKwkJZXJyID0gLUVOT0RFVjsKKwl9CitmdW5jdGlvbl9lbmFibGVkOgorCWRfZm5lbmQoMywgZGV2LCAiKGZ1bmMgJXApID0gJWRcbiIsIGZ1bmMsIGVycik7CisJcmV0dXJuIGVycjsKK30KKworCisvKgorICogU2V0dXAgZHJpdmVyIHJlc291cmNlcyBuZWVkZWQgdG8gY29tbXVuaWNhdGUgd2l0aCB0aGUgZGV2aWNlCisgKgorICogVGhlIGZ3IG5lZWRzIHNvbWUgdGltZSB0byBzZXR0bGUsIGFuZCBpdCB3YXMganVzdCB1cGxvYWRlZCwKKyAqIHNvIGdpdmUgaXQgYSBicmVhayBmaXJzdC4gSSdkIHByZWZlciB0byBqdXN0IHdhaXQgZm9yIHRoZSBkZXZpY2UgdG8KKyAqIHNlbmQgc29tZXRoaW5nLCBidXQgc2VlbXMgdGhlIHBva2luZyB3ZSBkbyB0byBlbmFibGUgU0RJTyBzdHVmZgorICogaW50ZXJmZXJlcyB3aXRoIGl0LCBzbyBqdXN0IGdpdmUgaXQgYSBicmVhayBiZWZvcmUgc3RhcnRpbmcuLi4KKyAqLworc3RhdGljCitpbnQgaTI0MDBtc19idXNfZGV2X3N0YXJ0KHN0cnVjdCBpMjQwMG0gKmkyNDAwbSkKK3sKKwlpbnQgcmVzdWx0OworCXN0cnVjdCBpMjQwMG1zICppMjQwMG1zID0gY29udGFpbmVyX29mKGkyNDAwbSwgc3RydWN0IGkyNDAwbXMsIGkyNDAwbSk7CisJc3RydWN0IHNkaW9fZnVuYyAqZnVuYyA9IGkyNDAwbXMtPmZ1bmM7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJmZ1bmMtPmRldjsKKworCWRfZm5zdGFydCgzLCBkZXYsICIoaTI0MDBtICVwKVxuIiwgaTI0MDBtKTsKKwltc2xlZXAoMjAwKTsKKwlyZXN1bHQgPSBpMjQwMG1zX3J4X3NldHVwKGkyNDAwbXMpOworCWlmIChyZXN1bHQgPCAwKQorCQlnb3RvIGVycm9yX3J4X3NldHVwOworCXJlc3VsdCA9IGkyNDAwbXNfdHhfc2V0dXAoaTI0MDBtcyk7CisJaWYgKHJlc3VsdCA8IDApCisJCWdvdG8gZXJyb3JfdHhfc2V0dXA7CisJZF9mbmVuZCgzLCBkZXYsICIoaTI0MDBtICVwKSA9ICVkXG4iLCBpMjQwMG0sIHJlc3VsdCk7CisJcmV0dXJuIHJlc3VsdDsKKworCWkyNDAwbXNfdHhfcmVsZWFzZShpMjQwMG1zKTsKK2Vycm9yX3R4X3NldHVwOgorCWkyNDAwbXNfcnhfcmVsZWFzZShpMjQwMG1zKTsKK2Vycm9yX3J4X3NldHVwOgorCWRfZm5lbmQoMywgZGV2LCAiKGkyNDAwbSAlcCkgPSB2b2lkXG4iLCBpMjQwMG0pOworCXJldHVybiByZXN1bHQ7Cit9CisKKworc3RhdGljCit2b2lkIGkyNDAwbXNfYnVzX2Rldl9zdG9wKHN0cnVjdCBpMjQwMG0gKmkyNDAwbSkKK3sKKwlzdHJ1Y3QgaTI0MDBtcyAqaTI0MDBtcyA9IGNvbnRhaW5lcl9vZihpMjQwMG0sIHN0cnVjdCBpMjQwMG1zLCBpMjQwMG0pOworCXN0cnVjdCBzZGlvX2Z1bmMgKmZ1bmMgPSBpMjQwMG1zLT5mdW5jOworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZmdW5jLT5kZXY7CisKKwlkX2Zuc3RhcnQoMywgZGV2LCAiKGkyNDAwbSAlcClcbiIsIGkyNDAwbSk7CisJaTI0MDBtc19yeF9yZWxlYXNlKGkyNDAwbXMpOworCWkyNDAwbXNfdHhfcmVsZWFzZShpMjQwMG1zKTsKKwlkX2ZuZW5kKDMsIGRldiwgIihpMjQwMG0gJXApID0gdm9pZFxuIiwgaTI0MDBtKTsKK30KKworCisvKgorICogU2VuZHMgYSBiYXJrZXIgYnVmZmVyIHRvIHRoZSBkZXZpY2UKKyAqCisgKiBUaGlzIGhlbHBlciB3aWxsIGFsbG9jYXRlIGEga21hbGxvY2VkIGJ1ZmZlciBhbmQgdXNlIGl0IHRvIHRyYW5zbWl0CisgKiAodGhlbiBmcmVlIGl0KS4gUmVhc29uIGZvciB0aGlzIGlzIHRoYXQgdGhlIFNESU8gaG9zdCBjb250cm9sbGVyCisgKiBleHBlY3RzIGFsaWdubWVudCAodW5rbm93biBleGFjdGx5IHdoaWNoKSB3aGljaCB0aGUgc3RhY2sgd29uJ3QKKyAqIHJlYWxseSBwcm92aWRlIGFuZCBjZXJ0YWluIGFyY2hlcy9ob3N0LWNvbnRyb2xsZXIgY29tYmluYXRpb25zCisgKiBjYW5ub3QgdXNlIHN0YWNrL3ZtYWxsb2MvdGV4dCBhcmVhcyBmb3IgRE1BIHRyYW5zZmVycy4KKyAqLworc3RhdGljCitpbnQgX19pMjQwMG1zX3NlbmRfYmFya2VyKHN0cnVjdCBpMjQwMG1zICppMjQwMG1zLAorCQkJICBjb25zdCBfX2xlMzIgKmJhcmtlciwgc2l6ZV90IGJhcmtlcl9zaXplKQoreworCWludCAgcmV0OworCXN0cnVjdCBzZGlvX2Z1bmMgKmZ1bmMgPSBpMjQwMG1zLT5mdW5jOworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZmdW5jLT5kZXY7CisJdm9pZCAqYnVmZmVyOworCisJcmV0ID0gLUVOT01FTTsKKwlidWZmZXIgPSBrbWFsbG9jKEkyNDAwTVNfQkxLX1NJWkUsIEdGUF9LRVJORUwpOworCWlmIChidWZmZXIgPT0gTlVMTCkKKwkJZ290byBlcnJvcl9remFsbG9jOworCisJbWVtY3B5KGJ1ZmZlciwgYmFya2VyLCBiYXJrZXJfc2l6ZSk7CisJc2Rpb19jbGFpbV9ob3N0KGZ1bmMpOworCXJldCA9IHNkaW9fbWVtY3B5X3RvaW8oZnVuYywgMCwgYnVmZmVyLCBJMjQwME1TX0JMS19TSVpFKTsKKwlzZGlvX3JlbGVhc2VfaG9zdChmdW5jKTsKKworCWlmIChyZXQgPCAwKQorCQlkX3ByaW50ZigwLCBkZXYsICJFOiBiYXJrZXIgZXJyb3I6ICVkXG4iLCByZXQpOworCisJa2ZyZWUoYnVmZmVyKTsKK2Vycm9yX2t6YWxsb2M6CisJcmV0dXJuIHJldDsKK30KKworCisvKgorICogUmVzZXQgYSBkZXZpY2UgYXQgZGlmZmVyZW50IGxldmVscyAod2FybSwgY29sZCBvciBidXMpCisgKgorICogQGkyNDAwbXM6IGRldmljZSBkZXNjcmlwdG9yCisgKiBAcmVzZXRfdHlwZTogc29mdCwgd2FybSBvciBidXMgcmVzZXQgKEkyNDAwTV9SVF9XQVJNL1NPRlQvQlVTKQorICoKKyAqIEZJWE1FOiBub3QgdGVzdGVkIC0tIG5lZWQgdG8gY29uZmlybSBleHBlY3RlZCBlZmZlY3RzCisgKgorICogV2FybSBhbmQgY29sZCByZXNldHMgZ2V0IGFuIFNESU8gcmVzZXQgaWYgdGhleSBmYWlsICh1bmltcGxlbWVudGVkKQorICoKKyAqIFdhcm0gcmVzZXQ6CisgKgorICogVGhlIGRldmljZSB3aWxsIGJlIGZ1bGx5IHJlc2V0IGludGVybmFsbHksIGJ1dCB3b24ndCBiZQorICogZGlzY29ubmVjdGVkIGZyb20gdGhlIFVTQiBidXMgKHNvIG5vIHJlZW51bWVyYXRpb24gd2lsbAorICogaGFwcGVuKS4gRmlybXdhcmUgdXBsb2FkIHdpbGwgYmUgbmVjY2Vzc2FyeS4KKyAqCisgKiBUaGUgZGV2aWNlIHdpbGwgc2VuZCBhIHJlYm9vdCBiYXJrZXIgaW4gdGhlIG5vdGlmaWNhdGlvbiBlbmRwb2ludAorICogdGhhdCB3aWxsIHRyaWdnZXIgdGhlIGRyaXZlciB0byByZWluaXRpYWxpemUgdGhlIHN0YXRlCisgKiBhdXRvbWF0aWNhbGx5IGZyb20gbm90aWYuYzppMjQwMG1fbm90aWZpY2F0aW9uX2dyb2soKSBpbnRvCisgKiBpMjQwMG1fZGV2X2Jvb3RzdHJhcF9kZWxheWVkKCkuCisgKgorICogQ29sZCBhbmQgYnVzIChVU0IpIHJlc2V0OgorICoKKyAqIFRoZSBkZXZpY2Ugd2lsbCBiZSBmdWxseSByZXNldCBpbnRlcm5hbGx5LCBkaXNjb25uZWN0ZWQgZnJvbSB0aGUKKyAqIFVTQiBidXMgYW4gYSByZWVudW1lcmF0aW9uIHdpbGwgaGFwcGVuLiBGaXJtd2FyZSB1cGxvYWQgd2lsbCBiZQorICogbmVjY2Vzc2FyeS4gVGh1cywgd2UgZG9uJ3QgZG8gYW55IGxvY2tpbmcgb3Igc3RydWN0CisgKiByZWluaXRpYWxpemF0aW9uLCBhcyB3ZSBhcmUgZ29pbmcgdG8gYmUgZnVsbHkgZGlzY29ubmVjdGVkIGFuZAorICogcmVlbnVtZXJhdGVkLgorICoKKyAqIE5vdGUgd2UgbmVlZCB0byByZXR1cm4gLUVOT0RFViBpZiBhIHdhcm0gcmVzZXQgd2FzIHJlcXVlc3RlZCBhbmQgd2UKKyAqIGhhZCB0byByZXNvcnQgdG8gYSBidXMgcmVzZXQuIFNlZSBpMjQwMG1fb3BfcmVzZXQoKSwgd2ltYXhfcmVzZXQoKQorICogYW5kIHdpbWF4X2Rldi0+b3BfcmVzZXQuCisgKgorICogV0FSTklORzogbm8gZHJpdmVyIHN0YXRlIHNhdmVkL2ZpeGVkCisgKi8KK3N0YXRpYworaW50IGkyNDAwbXNfYnVzX3Jlc2V0KHN0cnVjdCBpMjQwMG0gKmkyNDAwbSwgZW51bSBpMjQwMG1fcmVzZXRfdHlwZSBydCkKK3sKKwlpbnQgcmVzdWx0OworCXN0cnVjdCBpMjQwMG1zICppMjQwMG1zID0KKwkJY29udGFpbmVyX29mKGkyNDAwbSwgc3RydWN0IGkyNDAwbXMsIGkyNDAwbSk7CisJc3RydWN0IGRldmljZSAqZGV2ID0gaTI0MDBtX2RldihpMjQwMG0pOworCXN0YXRpYyBjb25zdCBfX2xlMzIgaTI0MDBtX1dBUk1fQk9PVF9CQVJLRVJbNF0gPSB7CisJCV9fY29uc3RhbnRfY3B1X3RvX2xlMzIoSTI0MDBNX1dBUk1fUkVTRVRfQkFSS0VSKSwKKwkJX19jb25zdGFudF9jcHVfdG9fbGUzMihJMjQwME1fV0FSTV9SRVNFVF9CQVJLRVIpLAorCQlfX2NvbnN0YW50X2NwdV90b19sZTMyKEkyNDAwTV9XQVJNX1JFU0VUX0JBUktFUiksCisJCV9fY29uc3RhbnRfY3B1X3RvX2xlMzIoSTI0MDBNX1dBUk1fUkVTRVRfQkFSS0VSKSwKKwl9OworCXN0YXRpYyBjb25zdCBfX2xlMzIgaTI0MDBtX0NPTERfQk9PVF9CQVJLRVJbNF0gPSB7CisJCV9fY29uc3RhbnRfY3B1X3RvX2xlMzIoSTI0MDBNX0NPTERfUkVTRVRfQkFSS0VSKSwKKwkJX19jb25zdGFudF9jcHVfdG9fbGUzMihJMjQwME1fQ09MRF9SRVNFVF9CQVJLRVIpLAorCQlfX2NvbnN0YW50X2NwdV90b19sZTMyKEkyNDAwTV9DT0xEX1JFU0VUX0JBUktFUiksCisJCV9fY29uc3RhbnRfY3B1X3RvX2xlMzIoSTI0MDBNX0NPTERfUkVTRVRfQkFSS0VSKSwKKwl9OworCisJaWYgKHJ0ID09IEkyNDAwTV9SVF9XQVJNKQorCQlyZXN1bHQgPSBfX2kyNDAwbXNfc2VuZF9iYXJrZXIoaTI0MDBtcywgaTI0MDBtX1dBUk1fQk9PVF9CQVJLRVIsCisJCQkJCSAgICAgICBzaXplb2YoaTI0MDBtX1dBUk1fQk9PVF9CQVJLRVIpKTsKKwllbHNlIGlmIChydCA9PSBJMjQwME1fUlRfQ09MRCkKKwkJcmVzdWx0ID0gX19pMjQwMG1zX3NlbmRfYmFya2VyKGkyNDAwbXMsIGkyNDAwbV9DT0xEX0JPT1RfQkFSS0VSLAorCQkJCQkgICAgICAgc2l6ZW9mKGkyNDAwbV9DT0xEX0JPT1RfQkFSS0VSKSk7CisJZWxzZSBpZiAocnQgPT0gSTI0MDBNX1JUX0JVUykgeworZG9fYnVzX3Jlc2V0OgorCQlkZXZfZXJyKGRldiwgIkZJWE1FOiBTRElPIGJ1cyByZXNldCBub3QgaW1wbGVtZW50ZWRcbiIpOworCQlyZXN1bHQgPSBydCA9PSBJMjQwME1fUlRfV0FSTSA/IC1FTk9ERVYgOiAtRU5PU1lTOworCX0gZWxzZQorCQlCVUcoKTsKKwlpZiAocmVzdWx0IDwgMCAmJiBydCAhPSBJMjQwME1fUlRfQlVTKSB7CisJCWRldl9lcnIoZGV2LCAiJXMgcmVzZXQgZmFpbGVkICglZCk7IHRyeWluZyBTRElPIHJlc2V0XG4iLAorCQkJcnQgPT0gSTI0MDBNX1JUX1dBUk0gPyAid2FybSIgOiAiY29sZCIsIHJlc3VsdCk7CisJCXJ0ID0gSTI0MDBNX1JUX0JVUzsKKwkJZ290byBkb19idXNfcmVzZXQ7CisJfQorCXJldHVybiByZXN1bHQ7Cit9CisKKworc3RhdGljCit2b2lkIGkyNDAwbXNfbmV0ZGV2X3NldHVwKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2KQoreworCXN0cnVjdCBpMjQwMG0gKmkyNDAwbSA9IG5ldF9kZXZfdG9faTI0MDBtKG5ldF9kZXYpOworCXN0cnVjdCBpMjQwMG1zICppMjQwMG1zID0gY29udGFpbmVyX29mKGkyNDAwbSwgc3RydWN0IGkyNDAwbXMsIGkyNDAwbSk7CisJaTI0MDBtc19pbml0KGkyNDAwbXMpOworCWkyNDAwbV9uZXRkZXZfc2V0dXAobmV0X2Rldik7Cit9CisKKworLyoKKyAqIERlYnVnIGxldmVscyBjb250cm9sOyBzZWUgZGVidWcuaAorICovCitzdHJ1Y3QgZF9sZXZlbCBEX0xFVkVMW10gPSB7CisJRF9TVUJNT0RVTEVfREVGSU5FKG1haW4pLAorCURfU1VCTU9EVUxFX0RFRklORSh0eCksCisJRF9TVUJNT0RVTEVfREVGSU5FKHJ4KSwKKwlEX1NVQk1PRFVMRV9ERUZJTkUoZncpLAorfTsKK3NpemVfdCBEX0xFVkVMX1NJWkUgPSBBUlJBWV9TSVpFKERfTEVWRUwpOworCisKKyNkZWZpbmUgX19kZWJ1Z2ZzX3JlZ2lzdGVyKHByZWZpeCwgbmFtZSwgcGFyZW50KQkJCVwKK2RvIHsJCQkJCQkJCQlcCisJcmVzdWx0ID0gZF9sZXZlbF9yZWdpc3Rlcl9kZWJ1Z2ZzKHByZWZpeCwgbmFtZSwgcGFyZW50KTsJXAorCWlmIChyZXN1bHQgPCAwKQkJCQkJCQlcCisJCWdvdG8gZXJyb3I7CQkJCQkJXAorfSB3aGlsZSAoMCkKKworCitzdGF0aWMKK2ludCBpMjQwMG1zX2RlYnVnZnNfYWRkKHN0cnVjdCBpMjQwMG1zICppMjQwMG1zKQoreworCWludCByZXN1bHQ7CisJc3RydWN0IGRlbnRyeSAqZGVudHJ5ID0gaTI0MDBtcy0+aTI0MDBtLndpbWF4X2Rldi5kZWJ1Z2ZzX2RlbnRyeTsKKworCWRlbnRyeSA9IGRlYnVnZnNfY3JlYXRlX2RpcigiaTI0MDBtLXVzYiIsIGRlbnRyeSk7CisJcmVzdWx0ID0gUFRSX0VSUihkZW50cnkpOworCWlmIChJU19FUlIoZGVudHJ5KSkgeworCQlpZiAocmVzdWx0ID09IC1FTk9ERVYpCisJCQlyZXN1bHQgPSAwOwkvKiBObyBkZWJ1Z2ZzIHN1cHBvcnQgKi8KKwkJZ290byBlcnJvcjsKKwl9CisJaTI0MDBtcy0+ZGVidWdmc19kZW50cnkgPSBkZW50cnk7CisJX19kZWJ1Z2ZzX3JlZ2lzdGVyKCJkbF8iLCBtYWluLCBkZW50cnkpOworCV9fZGVidWdmc19yZWdpc3RlcigiZGxfIiwgdHgsIGRlbnRyeSk7CisJX19kZWJ1Z2ZzX3JlZ2lzdGVyKCJkbF8iLCByeCwgZGVudHJ5KTsKKwlfX2RlYnVnZnNfcmVnaXN0ZXIoImRsXyIsIGZ3LCBkZW50cnkpOworCisJcmV0dXJuIDA7CisKK2Vycm9yOgorCWRlYnVnZnNfcmVtb3ZlX3JlY3Vyc2l2ZShpMjQwMG1zLT5kZWJ1Z2ZzX2RlbnRyeSk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworCisvKgorICogUHJvYmUgYSBpMjQwMG0gaW50ZXJmYWNlIGFuZCByZWdpc3RlciBpdAorICoKKyAqIEBmdW5jOiAgICBTRElPIGZ1bmN0aW9uCisgKiBAaWQ6ICAgICAgU0RJTyBkZXZpY2UgSUQKKyAqIEByZXR1cm5zOiAwIGlmIG9rLCA8IDAgZXJybm8gY29kZSBvbiBlcnJvci4KKyAqCisgKiBBbGxvYyBhIG5ldCBkZXZpY2UsIGluaXRpYWxpemUgdGhlIGJ1cy1zcGVjaWZpYyBkZXRhaWxzIGFuZCB0aGVuCisgKiBjYWxscyB0aGUgYnVzLWdlbmVyaWMgaW5pdGlhbGl6YXRpb24gcm91dGluZS4gVGhhdCB3aWxsIHJlZ2lzdGVyCisgKiB0aGUgd2ltYXggYW5kIG5ldGRldiBkZXZpY2VzLCB1cGxvYWQgdGhlIGZpcm13YXJlIFt1c2luZworICogX2J1c19ibV8qKCldLCBjYWxsIF9idXNfZGV2X3N0YXJ0KCkgdG8gZmluYWxpemUgdGhlIHNldHVwIG9mIHRoZQorICogY29tbXVuaWNhdGlvbiB3aXRoIHRoZSBkZXZpY2UgYW5kIHRoZW4gd2lsbCBzdGFydCB0byB0YWxrIHRvIGl0IHRvCisgKiBmaW5uaXNoIHNldHRpbmcgaXQgdXAuCisgKgorICogSW5pdGlhbGl6YXRpb24gaXMgdHJpY2t5OyBzb21lIGluc3RhbmNlcyBvZiB0aGUgaHcgYXJlIHBhY2tlZCB3aXRoCisgKiBvdGhlcnMgaW4gYSB3YXkgdGhhdCByZXF1aXJlcyBhIHRoaXJkIGRyaXZlciB0aGF0IGVuYWJsZXMgdGhlIFdpTUFYCisgKiBmdW5jdGlvbi4gSW4gdGhvc2UgY2FzZXMsIHdlIGNhbid0IGVuYWJsZSB0aGUgU0RJTyBmdW5jdGlvbiBhbmQKKyAqIHdlJ2xsIHJldHVybiB3aXRoIC1FTk9ERVYuIFdoZW4gdGhlIGRyaXZlciB0aGF0IGVuYWJsZXMgdGhlIFdpTUFYCisgKiBmdW5jdGlvbiBkb2VzIGl0cyB0aGluZywgaXQgaGFzIHRvIGRvIGEgYnVzX3Jlc2Nhbl9kZXZpY2VzKCkgb24gdGhlCisgKiBTRElPIGJ1cyBzbyB0aGlzIGRyaXZlciBpcyBjYWxsZWQgYWdhaW4gdG8gZW51bWVyYXRlIHRoZSBXaU1BWAorICogZnVuY3Rpb24uCisgKi8KK3N0YXRpYworaW50IGkyNDAwbXNfcHJvYmUoc3RydWN0IHNkaW9fZnVuYyAqZnVuYywKKwkJICBjb25zdCBzdHJ1Y3Qgc2Rpb19kZXZpY2VfaWQgKmlkKQoreworCWludCByZXN1bHQ7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXY7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJmZ1bmMtPmRldjsKKwlzdHJ1Y3QgaTI0MDBtICppMjQwMG07CisJc3RydWN0IGkyNDAwbXMgKmkyNDAwbXM7CisKKwkvKiBBbGxvY2F0ZSBpbnN0YW5jZSBbY2FsbHMgaTI0MDBtX25ldGRldl9zZXR1cCgpIG9uIGl0XS4gKi8KKwlyZXN1bHQgPSAtRU5PTUVNOworCW5ldF9kZXYgPSBhbGxvY19uZXRkZXYoc2l6ZW9mKCppMjQwMG1zKSwgIndteCVkIiwKKwkJCSAgICAgICBpMjQwMG1zX25ldGRldl9zZXR1cCk7CisJaWYgKG5ldF9kZXYgPT0gTlVMTCkgeworCQlkZXZfZXJyKGRldiwgIm5vIG1lbW9yeSBmb3IgbmV0d29yayBkZXZpY2UgaW5zdGFuY2VcbiIpOworCQlnb3RvIGVycm9yX2FsbG9jX25ldGRldjsKKwl9CisJU0VUX05FVERFVl9ERVYobmV0X2RldiwgZGV2KTsKKwlpMjQwMG0gPSBuZXRfZGV2X3RvX2kyNDAwbShuZXRfZGV2KTsKKwlpMjQwMG1zID0gY29udGFpbmVyX29mKGkyNDAwbSwgc3RydWN0IGkyNDAwbXMsIGkyNDAwbSk7CisJaTI0MDBtLT53aW1heF9kZXYubmV0X2RldiA9IG5ldF9kZXY7CisJaTI0MDBtcy0+ZnVuYyA9IGZ1bmM7CisJc2Rpb19zZXRfZHJ2ZGF0YShmdW5jLCBpMjQwMG1zKTsKKworCWkyNDAwbS0+YnVzX3R4X2Jsb2NrX3NpemUgPSBJMjQwME1TX0JMS19TSVpFOworCWkyNDAwbS0+YnVzX3BsX3NpemVfbWF4ID0gSTI0MDBNU19QTF9TSVpFX01BWDsKKwlpMjQwMG0tPmJ1c19kZXZfc3RhcnQgPSBpMjQwMG1zX2J1c19kZXZfc3RhcnQ7CisJaTI0MDBtLT5idXNfZGV2X3N0b3AgPSBpMjQwMG1zX2J1c19kZXZfc3RvcDsKKwlpMjQwMG0tPmJ1c190eF9raWNrID0gaTI0MDBtc19idXNfdHhfa2ljazsKKwlpMjQwMG0tPmJ1c19yZXNldCA9IGkyNDAwbXNfYnVzX3Jlc2V0OworCWkyNDAwbS0+YnVzX2JtX2NtZF9zZW5kID0gaTI0MDBtc19idXNfYm1fY21kX3NlbmQ7CisJaTI0MDBtLT5idXNfYm1fd2FpdF9mb3JfYWNrID0gaTI0MDBtc19idXNfYm1fd2FpdF9mb3JfYWNrOworCWkyNDAwbS0+YnVzX2Z3X25hbWUgPSBJMjQwME1TX0ZXX0ZJTEVfTkFNRTsKKwlpMjQwMG0tPmJ1c19ibV9tYWNfYWRkcl9pbXBhaXJlZCA9IDE7CisKKwlyZXN1bHQgPSBpMjQwMG1zX2VuYWJsZV9mdW5jdGlvbihpMjQwMG1zLT5mdW5jKTsKKwlpZiAocmVzdWx0IDwgMCkgeworCQlkZXZfZXJyKGRldiwgIkNhbm5vdCBlbmFibGUgU0RJTyBmdW5jdGlvbjogJWRcbiIsIHJlc3VsdCk7CisJCWdvdG8gZXJyb3JfZnVuY19lbmFibGU7CisJfQorCisJc2Rpb19jbGFpbV9ob3N0KGZ1bmMpOworCXJlc3VsdCA9IHNkaW9fc2V0X2Jsb2NrX3NpemUoZnVuYywgSTI0MDBNU19CTEtfU0laRSk7CisJaWYgKHJlc3VsdCA8IDApIHsKKwkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gc2V0IGJsb2NrIHNpemU6ICVkXG4iLCByZXN1bHQpOworCQlnb3RvIGVycm9yX3NldF9ibGtfc2l6ZTsKKwl9CisJc2Rpb19yZWxlYXNlX2hvc3QoZnVuYyk7CisKKwlyZXN1bHQgPSBpMjQwMG1fc2V0dXAoaTI0MDBtLCBJMjQwME1fQlJJX05PX1JFQk9PVCk7CisJaWYgKHJlc3VsdCA8IDApIHsKKwkJZGV2X2VycihkZXYsICJjYW5ub3Qgc2V0dXAgZGV2aWNlOiAlZFxuIiwgcmVzdWx0KTsKKwkJZ290byBlcnJvcl9zZXR1cDsKKwl9CisKKwlyZXN1bHQgPSBpMjQwMG1zX2RlYnVnZnNfYWRkKGkyNDAwbXMpOworCWlmIChyZXN1bHQgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAiY2Fubm90IGNyZWF0ZSBTRElPIGRlYnVnZnM6ICVkXG4iLAorCQkJcmVzdWx0KTsKKwkJZ290byBlcnJvcl9kZWJ1Z2ZzX2FkZDsKKwl9CisJcmV0dXJuIDA7CisKK2Vycm9yX2RlYnVnZnNfYWRkOgorCWkyNDAwbV9yZWxlYXNlKGkyNDAwbSk7CitlcnJvcl9zZXR1cDoKKwlzZGlvX3NldF9kcnZkYXRhKGZ1bmMsIE5VTEwpOworCXNkaW9fY2xhaW1faG9zdChmdW5jKTsKK2Vycm9yX3NldF9ibGtfc2l6ZToKKwlzZGlvX2Rpc2FibGVfZnVuYyhmdW5jKTsKKwlzZGlvX3JlbGVhc2VfaG9zdChmdW5jKTsKK2Vycm9yX2Z1bmNfZW5hYmxlOgorCWZyZWVfbmV0ZGV2KG5ldF9kZXYpOworZXJyb3JfYWxsb2NfbmV0ZGV2OgorCXJldHVybiByZXN1bHQ7Cit9CisKKworc3RhdGljCit2b2lkIGkyNDAwbXNfcmVtb3ZlKHN0cnVjdCBzZGlvX2Z1bmMgKmZ1bmMpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJmZ1bmMtPmRldjsKKwlzdHJ1Y3QgaTI0MDBtcyAqaTI0MDBtcyA9IHNkaW9fZ2V0X2RydmRhdGEoZnVuYyk7CisJc3RydWN0IGkyNDAwbSAqaTI0MDBtID0gJmkyNDAwbXMtPmkyNDAwbTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiA9IGkyNDAwbS0+d2ltYXhfZGV2Lm5ldF9kZXY7CisKKwlkX2Zuc3RhcnQoMywgZGV2LCAiU0RJTyBmdW5jICVwXG4iLCBmdW5jKTsKKwlkZWJ1Z2ZzX3JlbW92ZV9yZWN1cnNpdmUoaTI0MDBtcy0+ZGVidWdmc19kZW50cnkpOworCWkyNDAwbV9yZWxlYXNlKGkyNDAwbSk7CisJc2Rpb19zZXRfZHJ2ZGF0YShmdW5jLCBOVUxMKTsKKwlzZGlvX2NsYWltX2hvc3QoZnVuYyk7CisJc2Rpb19kaXNhYmxlX2Z1bmMoZnVuYyk7CisJc2Rpb19yZWxlYXNlX2hvc3QoZnVuYyk7CisJZnJlZV9uZXRkZXYobmV0X2Rldik7CisJZF9mbmVuZCgzLCBkZXYsICJTRElPIGZ1bmMgJXBcbiIsIGZ1bmMpOworfQorCitlbnVtIHsKKwlJMjQwME1TX0lOVEVMX1ZJRCA9IDB4ODksCit9OworCitzdGF0aWMKK2NvbnN0IHN0cnVjdCBzZGlvX2RldmljZV9pZCBpMjQwMG1zX3NkaW9faWRzW10gPSB7CisJLyogSW50ZWw6IGkyNDAwbSBXaU1BWCBvdmVyIFNESU8gKi8KKwl7IFNESU9fREVWSUNFKEkyNDAwTVNfSU5URUxfVklELCAweDE0MDIpIH0sCisJeyB9LCAJCQkvKiBlbmQ6IGFsbCB6ZXJvZXMgKi8KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHNkaW8sIGkyNDAwbXNfc2Rpb19pZHMpOworCisKK3N0YXRpYworc3RydWN0IHNkaW9fZHJpdmVyIGkyNDAwbV9zZGlvX2RyaXZlciA9IHsKKwkubmFtZQkJPSBLQlVJTERfTU9ETkFNRSwKKwkucHJvYmUJCT0gaTI0MDBtc19wcm9iZSwKKwkucmVtb3ZlCQk9IGkyNDAwbXNfcmVtb3ZlLAorCS5pZF90YWJsZQk9IGkyNDAwbXNfc2Rpb19pZHMsCit9OworCisKK3N0YXRpYworaW50IF9faW5pdCBpMjQwMG1zX2RyaXZlcl9pbml0KHZvaWQpCit7CisJcmV0dXJuIHNkaW9fcmVnaXN0ZXJfZHJpdmVyKCZpMjQwMG1fc2Rpb19kcml2ZXIpOworfQorbW9kdWxlX2luaXQoaTI0MDBtc19kcml2ZXJfaW5pdCk7CisKKworc3RhdGljCit2b2lkIF9fZXhpdCBpMjQwMG1zX2RyaXZlcl9leGl0KHZvaWQpCit7CisJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsJLyogZm9yIHRoZSBzdHVmZiB3ZSBzY2hlZHVsZSAqLworCXNkaW9fdW5yZWdpc3Rlcl9kcml2ZXIoJmkyNDAwbV9zZGlvX2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdChpMjQwMG1zX2RyaXZlcl9leGl0KTsKKworCitNT0RVTEVfQVVUSE9SKCJJbnRlbCBDb3Jwb3JhdGlvbiA8bGludXgtd2ltYXhAaW50ZWwuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJJbnRlbCAyNDAwTSBXaU1BWCBuZXR3b3JraW5nIGZvciBTRElPIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfRklSTVdBUkUoSTI0MDBNU19GV19GSUxFX05BTUUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2ltYXgvaTI0MDBtL3R4LmMgYi9kcml2ZXJzL25ldC93aW1heC9pMjQwMG0vdHguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTNhODhmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2ltYXgvaTI0MDBtL3R4LmMKQEAgLTAsMCArMSw4MTcgQEAKKy8qCisgKiBJbnRlbCBXaXJlbGVzcyBXaU1BWCBDb25uZWN0aW9uIDI0MDBtCisgKiBHZW5lcmljIChub24tYnVzIHNwZWNpZmljKSBUWCBoYW5kbGluZworICoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICAgZGlzdHJpYnV0aW9uLgorICogICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKgorICogSW50ZWwgQ29ycG9yYXRpb24gPGxpbnV4LXdpbWF4QGludGVsLmNvbT4KKyAqIFlhbmlyIEx1YmV0a2luIDx5YW5pcngubHViZXRraW5AaW50ZWwuY29tPgorICogIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICoKKyAqIEludGVsIENvcnBvcmF0aW9uIDxsaW51eC13aW1heEBpbnRlbC5jb20+CisgKiBJbmFreSBQZXJlei1Hb256YWxleiA8aW5ha3kucGVyZXotZ29uemFsZXpAaW50ZWwuY29tPgorICogIC0gUmV3cml0dGVuIHRvIHVzZSBhIHNpbmdsZSBGSUZPIHRvIGxvd2VyIHRoZSBtZW1vcnkgYWxsb2NhdGlvbgorICogICAgcHJlc3N1cmUgYW5kIG9wdGltaXplIGNhY2hlIGhpdHMgd2hlbiBjb3B5aW5nIHRvIHRoZSBxdWV1ZSwgYXMKKyAqICAgIHdlbGwgYXMgc3BsaXR0aW5nIG91dCBidXMtc3BlY2lmaWMgY29kZS4KKyAqCisgKgorICogSW1wbGVtZW50cyBkYXRhIHRyYW5zbWlzc2lvbiB0byB0aGUgZGV2aWNlOyB0aGlzIGlzIGRvbmUgdGhyb3VnaCBhCisgKiBzb2Z0d2FyZSBGSUZPLCBhcyBkYXRhL2NvbnRyb2wgZnJhbWVzIGNhbiBiZSBjb2FsZXNjZWQgKHdoaWxlIHRoZQorICogZGV2aWNlIGlzIHJlYWRpbmcgdGhlIHByZXZpb3VzIHR4IHRyYW5zYWN0aW9uLCBvdGhlcnMgYWNjdW11bGF0ZSkuCisgKgorICogQSBGSUZPIGlzIHVzZWQgYmVjYXVzZSBhdCB0aGUgZW5kIGl0IGlzIHJlc291cmNlLWNoZWFwZXIgdGhhdCB0cnlpbmcKKyAqIHRvIGltcGxlbWVudCBzY2F0dGVyL2dhdGhlciBvdmVyIFVTQi4gQXMgd2VsbCwgbW9zdCB0cmFmZmljIGlzIGdvaW5nCisgKiB0byBiZSBkb3dubG9hZCAodnMgdXBsb2FkKS4KKyAqCisgKiBUaGUgZm9ybWF0IGZvciBzZW5kaW5nL3JlY2VpdmluZyBkYXRhIHRvL2Zyb20gdGhlIGkyNDAwbSBpcworICogZGVzY3JpYmVkIGluIGRldGFpbCBpbiByeC5jOlBST1RPQ09MIEZPUk1BVC4gSW4gaGVyZSB3ZSBpbXBsZW1lbnQKKyAqIHRoZSB0cmFuc21pc3Npb24gb2YgdGhhdC4gVGhpcyBpcyBzcGxpdCBiZXR3ZWVuIGEgYnVzLWluZGVwZW5kZW50CisgKiBwYXJ0IHRoYXQganVzdCBwcmVwYXJlcyBldmVyeXRoaW5nIGFuZCBhIGJ1cy1zcGVjaWZpYyBwYXJ0IHRoYXQKKyAqIGRvZXMgdGhlIGFjdHVhbCB0cmFuc21pc3Npb24gb3ZlciB0aGUgYnVzIHRvIHRoZSBkZXZpY2UgKGluIHRoZQorICogYnVzLXNwZWNpZmljIGRyaXZlcikuCisgKgorICoKKyAqIFRoZSBnZW5lcmFsIGZvcm1hdCBvZiBhIGRldmljZS1ob3N0IHRyYW5zYWN0aW9uIGlzIE1TRy1IRFIsIFBMRDEsCisgKiBQTEQyLi4uUExETiwgUEwxLCBQTDIsLi4uUExOLCBQQURESU5HLgorICoKKyAqIEJlY2F1c2Ugd2UgbmVlZCB0aGUgc2VuZCBwYXlsb2FkIGRlc2NyaXB0b3JzIGFuZCB0aGVuIHBheWxvYWRzIGFuZAorICogYmVjYXVzZSBpdCBpcyBraW5kIG9mIGV4cGVuc2l2ZSB0byBkbyBzY2F0dGVybGlzdHMgaW4gVVNCIChvbmUgVVJCCisgKiBwZXIgbm9kZSksIGl0IGJlY29tZXMgY2hlYXBlciB0byBhcHBlbmQgYWxsIHRoZSBkYXRhIHRvIGEgRklGTworICogKGNvcHlpbmcgdG8gYSBGSUZPIHBvdGVudGlhbGx5IGluIGNhY2hlIGlzIGNoZWFwZXIpLgorICoKKyAqIFRoZW4gdGhlIGJ1cy1zcGVjaWZpYyBjb2RlIHRha2VzIHRoZSBwYXJ0cyBvZiB0aGF0IEZJRk8gdGhhdCBhcmUKKyAqIHdyaXR0ZW4gYW5kIHBhc3NlcyB0aGVtIHRvIHRoZSBkZXZpY2UuCisgKgorICogU28gdGhlIGNvbmNlcHRzIHRvIGtlZXAgaW4gbWluZCB0aGVyZSBhcmU6CisgKgorICogV2UgdXNlIGEgRklGTyB0byBxdWV1ZSB0aGUgZGF0YSBpbiBhIGxpbmVhciBidWZmZXIuIFdlIGZpcnN0IGFwcGVuZAorICogYSBNU0ctSERSLCBzcGFjZSBmb3IgSTI0MDBNX1RYX1BMRF9NQVggcGF5bG9hZCBkZXNjcmlwdG9ycyBhbmQgdGhlbgorICogZ28gYXBwZW5kaW5nIHBheWxvYWRzIHVudGlsIHdlIHJ1biBvdXQgb2Ygc3BhY2Ugb3Igb2YgcGF5bG9hZAorICogZGVzY3JpcHRvcnMuIFRoZW4gd2UgYXBwZW5kIHBhZGRpbmcgdG8gbWFrZSB0aGUgd2hvbGUgdHJhbnNhY3Rpb24gYQorICogbXVsdGlwbGUgb2YgaTI0MDBtLT5idXNfdHhfYmxvY2tfc2l6ZSAoYXMgZGVmaW5lZCBieSB0aGUgYnVzIGxheWVyKS4KKyAqCisgKiAtIEEgVFggbWVzc2FnZTogYSBjb21iaW5hdGlvbiBvZiBhIG1lc3NhZ2UgaGVhZGVyLCBwYXlsb2FkCisgKiAgIGRlc2NyaXB0b3JzIGFuZCBwYXlsb2Fkcy4KKyAqCisgKiAgICAgT3BlbjogaXQgaXMgbWFya2VkIGFzIGFjdGl2ZSAoaTI0MDBtLT50eF9tc2cgaXMgdmFsaWQpIGFuZCB3ZQorICogICAgICAgY2FuIGtlZXAgYWRkaW5nIHBheWxvYWRzIHRvIGl0LgorICoKKyAqICAgICBDbG9zZWQ6IHdlIGFyZSBub3QgYXBwZW5kaW5nIG1vcmUgcGF5bG9hZHMgdG8gdGhpcyBUWCBtZXNzYWdlCisgKiAgICAgICAoZXhhaHVzdGVkIHNwYWNlIGluIHRoZSBxdWV1ZSwgdG9vIG1hbnkgcGF5bG9hZHMgb3IKKyAqICAgICAgIHdoaWNoZXZlcikuICBXZSBoYXZlIGFwcGVuZGVkIHBhZGRpbmcgc28gdGhlIHdob2xlIG1lc3NhZ2UKKyAqICAgICAgIGxlbmd0aCBpcyBhbGlnbmVkIHRvIGkyNDAwbS0+YnVzX3R4X2Jsb2NrX3NpemUgKGFzIHNldCBieSB0aGUKKyAqICAgICAgIGJ1cy90cmFuc3BvcnQgbGF5ZXIpLgorICoKKyAqIC0gTW9zdCBvZiB0aGUgdGltZSB3ZSBrZWVwIGEgVFggbWVzc2FnZSBvcGVuIHRvIHdoaWNoIHdlIGFwcGVuZAorICogICBwYXlsb2Fkcy4KKyAqCisgKiAtIElmIHdlIGFyZSBnb2luZyB0byBhcHBlbmQgYW5kIHRoZXJlIGlzIG5vIG1vcmUgc3BhY2UgKHdlIGFyZSBhdAorICogICB0aGUgZW5kIG9mIHRoZSBGSUZPKSwgd2UgY2xvc2UgdGhlIG1lc3NhZ2UsIG1hcmsgdGhlIHJlc3Qgb2YgdGhlCisgKiAgIEZJRk8gc3BhY2UgdW51c2FibGUgKHNraXBfdGFpbCksIGNyZWF0ZSBhIG5ldyBtZXNzYWdlIGF0IHRoZQorICogICBiZWdpbm5pbmcgb2YgdGhlIEZJRk8gKGlmIHRoZXJlIGlzIHNwYWNlKSBhbmQgYXBwZW5kIHRoZSBtZXNzYWdlCisgKiAgIHRoZXJlLgorICoKKyAqICAgVGhpcyBpcyBiZWNhdXNlIHdlIG5lZWQgdG8gZ2l2ZSBsaW5lYXIgVFggbWVzc2FnZXMgdG8gdGhlIGJ1cworICogICBlbmdpbmUuIFNvIHdlIGRvbid0IHdyaXRlIGEgbWVzc2FnZSB0byB0aGUgcmVtYWluaW5nIEZJRk8gc3BhY2UKKyAqICAgdW50aWwgdGhlIHRhaWwgYW5kIGNvbnRpbnVlIGF0IHRoZSBoZWFkIG9mIGl0LgorICoKKyAqIC0gV2Ugb3ZlcmxvYWQgb25lIG9mIHRoZSBmaWVsZHMgaW4gdGhlIG1lc3NhZ2UgaGVhZGVyIHRvIHVzZSBpdCBhcworICogICAnc2l6ZScgb2YgdGhlIFRYIG1lc3NhZ2UsIHNvIHdlIGNhbiBpdGVyYXRlIG92ZXIgdGhlbS4gSXQgYWxzbworICogICBjb250YWlucyBhIGZsYWcgdGhhdCBpbmRpY2F0ZXMgaWYgd2UgaGF2ZSB0byBza2lwIGl0IG9yIG5vdC4KKyAqICAgV2hlbiB3ZSBzZW5kIHRoZSBidWZmZXIsIHdlIHVwZGF0ZSB0aGF0IHRvIGl0cyByZWFsIG9uLXRoZS13aXJlCisgKiAgIHZhbHVlLgorICoKKyAqIC0gVGhlIE1TRy1IRFIgUExEMS4uLlBMRDIgc3R1ZmYgaGFzIHRvIGJlIGEgc2l6ZSBtdWx0aXBsZSBvZiAxNi4KKyAqCisgKiAgIEl0IGZvbGxvd3MgdGhhdCBpZiBNU0ctSERSIHNheXMgd2UgaGF2ZSBOIG1lc3NhZ2VzLCB0aGUgd2hvbGUKKyAqICAgaGVhZGVyICsgZGVzY3JpcHRvcnMgaXMgMTYgKyA0Kk47IGZvciB0aG9zZSB0byBiZSBhIG11bHRpcGxlIG9mCisgKiAgIDE2LCBpdCBmb2xsb3dzIHRoYXQgTiBjYW4gYmUgNCwgOCwgMTIsIC4uLiAoMzIsIDQ4LCA2NCwgODAuLi4KKyAqICAgYnl0ZXMpLgorICoKKyAqICAgU28gaWYgd2UgaGF2ZSBvbmx5IDEgcGF5bG9hZCwgd2UgaGF2ZSB0byBzdWJtaXQgYSBoZWFkZXIgdGhhdCBpbgorICogICBhbGwgdHJ1dGggaGFzIHNwYWNlIGZvciA0LgorICoKKyAqICAgVGhlIGltcGxpY2F0aW9uIGlzIHRoYXQgd2UgcmVzZXJ2ZSBzcGFjZSBmb3IgMTIgKDY0IGJ5dGVzKTsgYnV0CisgKiAgIGlmIHdlIGZpbGwgdXAgb25seSAoZWcpIDIsIG91ciBoZWFkZXIgYmVjb21lcyAzMiBieXRlcyBvbmx5LiBTbworICogICB0aGUgVFggZW5naW5lIGhhcyB0byBzaGlmdCB0aG9zZSAzMiBieXRlcyBvZiBtc2cgaGVhZGVyIGFuZCAyCisgKiAgIHBheWxvYWRzIGFuZCBwYWRkaW5nIHNvIHRoYXQgcmlnaHQgYWZ0ZXIgaXQgdGhlIHBheWxvYWRzIHN0YXJ0CisgKiAgIGFuZCB0aGUgVFggZW5naW5lIGhhcyB0byBrbm93IGFib3V0IHRoYXQuCisgKgorICogICBJdCBpcyBjaGVhcGVyIHRvIG1vdmUgdGhlIGhlYWRlciB1cCB0aGFuIHRoZSB3aG9sZSBwYXlsb2FkcyBkb3duLgorICoKKyAqICAgV2UgZG8gdGhpcyBpbiBpMjQwMG1fdHhfY2xvc2UoKS4gU2VlICdpMjQwMG1fbXNnX2hkci0+b2Zmc2V0Jy4KKyAqCisgKiAtIEVhY2ggcGF5bG9hZCBoYXMgdG8gYmUgc2l6ZS1wYWRkZWQgdG8gMTYgYnl0ZXM7IGJlZm9yZSBhcHBlbmRpbmcKKyAqICAgaXQsIHdlIGp1c3QgZG8gaXQuCisgKgorICogLSBUaGUgd2hvbGUgbWVzc2FnZSBoYXMgdG8gYmUgcGFkZGVkIHRvIGkyNDAwbS0+YnVzX3R4X2Jsb2NrX3NpemU7CisgKiAgIHdlIGRvIHRoaXMgYXQgY2xvc2UgdGltZS4gVGh1cywgd2hlbiByZXNlcnZpbmcgc3BhY2UgZm9yIHRoZQorICogICBwYXlsb2FkLCB3ZSBhbHdheXMgbWFrZSBzdXJlIHRoZXJlIGlzIGFsc28gZnJlZSBzcGFjZSBmb3IgdGhpcworICogICBwYWRkaW5nIHRoYXQgc29vbmVyIG9yIGxhdGVyIHdpbGwgaGFwcGVuLgorICoKKyAqIFdoZW4gd2UgYXBwZW5kIGEgbWVzc2FnZSwgd2UgdGVsbCB0aGUgYnVzIHNwZWNpZmljIGNvZGUgdG8ga2ljayBpbgorICogVFhzLiBJdCB3aWxsIFRYIChpbiBwYXJhbGxlbCkgdW50aWwgdGhlIGJ1ZmZlciBpcyBleGhhdXN0ZWQtLWhlbmNlCisgKiB0aGUgbG9ja2luIHdlIGRvLiBUaGUgVFggY29kZSB3aWxsIG9ubHkgc2VuZCBhIFRYIG1lc3NhZ2UgYXQgdGhlCisgKiB0aW1lICh3aGljaCByZW1lbWJlciwgbWlnaHQgY29udGFpbiBtb3JlIHRoYW4gb25lIHBheWxvYWQpLiBPZgorICogY291cnNlLCB3aGVuIHRoZSBidXMtc3BlY2lmaWMgZHJpdmVyIGF0dGVtcHRzIHRvIFRYIGEgbWVzc2FnZSB0aGF0CisgKiBpcyBzdGlsbCBvcGVuLCBpdCBnZXRzIGNsb3NlZCBmaXJzdC4KKyAqCisgKiBHZWUsIHRoaXMgaXMgbWVzc3k7IHdlbGwgYSBwaWN0dXJlLiBJbiB0aGUgZXhhbXBsZSBiZWxvdyB3ZSBoYXZlIGEKKyAqIHBhcnRpYWxseSBmdWxsIEZJRk8sIHdpdGggYSBjbG9zZWQgbWVzc2FnZSByZWFkeSB0byBiZSBkZWxpdmVyZWQKKyAqICh3aXRoIGEgbW92ZWQgbWVzc2FnZSBoZWFkZXIgdG8gbWFrZSBzdXJlIGl0IGlzIHNpemUtYWxpZ25lZCB0bworICogMTYpLCBUQUlMIHJvb20gdGhhdCB3YXMgdW51c2FibGUgKGFuZCB0aHVzIGlzIG1hcmtlZCB3aXRoIGEgbWVzc2FnZQorICogaGVhZGVyIHRoYXQgc2F5cyAnc2tpcCB0aGlzJykgYW5kIGF0IHRoZSBoZWFkIG9mIHRoZSBidWZmZXIsIGFuCisgKiBpbWNvbXBsZXRlIG1lc3NhZ2Ugd2l0aCBhIGNvdXBsZSBvZiBwYXlsb2Fkcy4KKyAqCisgKiBOICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisgKiAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogICAgfCAgICAgVEFJTCByb29tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiAgICB8ICBtc2dfaGRyIHRvIHNraXAgKHNpemUgfD0gMHg4MDAwMCkgICAgICAgICAgICAgICAgfAorICogICAgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tCisgKiAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgL3xcCisgKiAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIHwKKyAqICAgIHwgIFRYIG1lc3NhZ2UgcGFkZGluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgfAorICogICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICB8CisgKiAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIHwKKyAqICAgIHwtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC18ICAgfAorICogICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICB8CisgKiAgICB8ICBwYXlsb2FkIDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIHwKKyAqICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IE4gKiB0eF9ibG9ja19zaXplCisgKiAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIHwKKyAqICAgIHwtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC18ICAgfAorICogICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICB8CisgKiAgICB8ICBwYXlsb2FkIDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIHwKKyAqICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgfAorICogICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICB8CisgKiAgICB8LSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtfC0gLXwtIC0gLSAtCisgKiAgICB8ICBwYWRkaW5nIDMgICAgICAgICAgICAgICAgICAvfFwgICAgICAgICAgICAgICAgICAgfCAgIHwgICAvfFwKKyAqICAgIHwgIHBhZGRpbmcgMiAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICB8ICAgfCAgICB8CisgKiAgICB8ICBwbGQgMSAgICAgICAgICAgICAgICAzMiBieXRlcyAoMiAqIDE2KSAgICAgICAgICAgfCAgIHwgICAgfAorICogICAgfCAgcGxkIDAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgIHwgICB8ICAgIHwKKyAqICAgIHwgIG1vdmVkIG1zZ19oZHIgICAgICAgICAgICAgIFx8LyAgICAgICAgICAgICAgICAgICB8ICBcfC8gICB8CisgKiAgICB8LSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtfC0gLSAtICAgfAorICogICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgX1BMRF9TSVpFCisgKiAgICB8ICB1bnVzZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgfAorICogICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgIHwKKyAqICAgIHwtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC18ICAgICAgICB8CisgKiAgICB8ICBtc2dfaGRyIChzaXplIFgpICAgICAgIFt0aGlzIG1lc3NhZ2UgaXMgY2xvc2VkXSAgfCAgICAgICBcfC8KKyAqICAgIHw9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT18PT09PT09PT09PSA8PT09IE9VVAorICogICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogICAgfCAgICAgICAgICBGcmVlIHJvb29tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICAgIHw9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT18PT09PT09PT09PSA8PT09IElOCisgKiAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogICAgfCAgcGF5bG9hZCAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogICAgfC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLXwKKyAqICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiAgICB8ICBwYXlsb2FkIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiAgICB8LSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtfAorICogICAgfCAgcGxkIDExICAgICAgICAgICAgICAgICAgICAgL3xcICAgICAgICAgICAgICAgICAgIHwKKyAqICAgIHwgIC4uLiAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICB8CisgKiAgICB8ICBwbGQgMSAgICAgICAgICAgICAgICA2NCBieXRlcyAoMiAqIDE2KSAgICAgICAgICAgfAorICogICAgfCAgcGxkIDAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgIHwKKyAqICAgIHwgIG1zZ19oZHIgKHNpemUgWCkgICAgICAgICAgIFx8LyBbbWVzc2FnZSBpcyBvcGVuXSB8CisgKiAwICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICoKKyAqIFJPQURNQVAKKyAqCisgKiBpMjQwMG1fdHhfc2V0dXAoKSAgICAgICAgICAgQ2FsbGVkIGJ5IGkyNDAwbV9zZXR1cAorICogaTI0MDBtX3R4X3JlbGVhc2UoKSAgICAgICAgIENhbGxlZCBieSBpMjQwMG1fcmVsZWFzZSgpCisgKgorICogIGkyNDAwbV90eCgpICAgICAgICAgICAgICAgICBDYWxsZWQgdG8gc2VuZCBkYXRhIG9yIGNvbnRyb2wgZnJhbWVzCisgKiAgICBpMjQwMG1fdHhfZmlmb19wdXNoKCkgICAgIEFsbG9jYXRlcyBhcHBlbmQtc3BhY2UgaW4gdGhlIEZJRk8KKyAqICAgIGkyNDAwbV90eF9uZXcoKSAgICAgICAgICAgT3BlbnMgYSBuZXcgbWVzc2FnZSBpbiB0aGUgRklGTworICogICAgaTI0MDBtX3R4X2ZpdHMoKSAgICAgICAgICBDaGVja3MgaWYgYSBuZXcgcGF5bG9hZCBmaXRzIGluIHRoZSBtZXNzYWdlCisgKiAgICBpMjQwMG1fdHhfY2xvc2UoKSAgICAgICAgIENsb3NlcyBhbiBvcGVuIG1lc3NhZ2UgaW4gdGhlIEZJRk8KKyAqICAgIGkyNDAwbV90eF9za2lwX3RhaWwoKSAgICAgTWFya3MgdW51c2FibGUgRklGTyB0YWlsIHNwYWNlCisgKiAgICBpMjQwMG0tPmJ1c190eF9raWNrKCkKKyAqCisgKiBOb3cgaTI0MDBtLT5idXNfdHhfa2ljaygpIGlzIHRoZSB0aGUgYnVzLXNwZWNpZmljIGRyaXZlciBiYWNrZW5kCisgKiBpbXBsZW1lbnRhdGlvbjsgdGhhdCB3b3VsZCBkbzoKKyAqCisgKiBpMjQwMG0tPmJ1c190eF9raWNrKCkKKyAqICAgaTI0MDBtX3R4X21zZ19nZXQoKQlHZXRzIGZpcnN0IG1lc3NhZ2UgcmVhZHkgdG8gZ28KKyAqICAgLi4uc2VuZHMgaXQuLi4KKyAqICAgaTI0MDBtX3R4X21zZ19zZW50KCkgICAgICAgQWNrIHRoZSBtZXNzYWdlIGlzIHNlbnQ7IHJlcGVhdCBmcm9tCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90eF9tc2dfZ2V0KCkgdW50aWwgaXQgcmV0dXJucyBOVUxMCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRklGTyBlbXB0eSkuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlICJpMjQwMG0uaCIKKworCisjZGVmaW5lIERfU1VCTU9EVUxFIHR4CisjaW5jbHVkZSAiZGVidWctbGV2ZWxzLmgiCisKK2VudW0geworCS8qKgorCSAqIFRYIEJ1ZmZlciBzaXplCisJICoKKwkgKiBEb2Mgc2F5cyBtYXhpbXVtIHRyYW5zYWN0aW9uIGlzIDE2S2lCLiBJZiB3ZSBoYWQgMTZLaUIgZW4KKwkgKiByb3V0ZSBhbmQgMTZLaUIgYmVpbmcgcXVldWVkLCBpdCBib2lscyBkb3duIHRvIG5lZWRpbmcKKwkgKiAzMktpQi4KKwkgKi8KKwlJMjQwME1fVFhfQlVGX1NJWkUgPSAzMjc2OCwKKwkvKioKKwkgKiBNZXNzYWdlIGhlYWRlciBhbmQgcGF5bG9hZCBkZXNjcmlwdG9ycyBoYXZlIHRvIGJlIDE2CisJICogYWxpZ25lZCAoMTYgKyA0ICogTiA9IDE2ICogTSkuIElmIHdlIHRha2UgdGhhdCBhdmVyYWdlIHNlbnQKKwkgKiBwYWNrZXRzIGFyZSBNVFUgc2l6ZSAofjE0MDAtfjE1MDApIGl0IGZvbGxvd3MgdGhhdCB3ZSBjb3VsZAorCSAqIGZpdCBhdCBtb3N0IDEwLTExIHBheWxvYWRzIGluIG9uZSB0cmFuc2FjdGlvbi4gVG8gbWVldCB0aGUKKwkgKiBhbGlnbm1lbnQgcmVxdWlyZW1lbnQsIHRoYXQgbWVhbnMgd2UgbmVlZCB0byBsZWF2ZSBzcGFjZQorCSAqIGZvciAxMiAoNjQgYnl0ZXMpLiBUbyBzaW1wbGlmeSwgd2UgbGVhdmUgc3BhY2UgZm9yIHRoYXQuIElmCisJICogYXQgdGhlIGVuZCB0aGVyZSBhcmUgbGVzcywgd2UgcGFkIHVwIHRvIHRoZSBuZWFyZXN0CisJICogbXVsdGlwbGUgb2YgMTYuCisJICovCisJSTI0MDBNX1RYX1BMRF9NQVggPSAxMiwKKwlJMjQwME1fVFhfUExEX1NJWkUgPSBzaXplb2Yoc3RydWN0IGkyNDAwbV9tc2dfaGRyKQorCSsgSTI0MDBNX1RYX1BMRF9NQVggKiBzaXplb2Yoc3RydWN0IGkyNDAwbV9wbGQpLAorCUkyNDAwTV9UWF9TS0lQID0gMHg4MDAwMDAwMCwKK307CisKKyNkZWZpbmUgVEFJTF9GVUxMICgodm9pZCAqKX4odW5zaWduZWQgbG9uZylOVUxMKQorCisvKgorICogQWxsb2NhdGUgQHNpemUgYnl0ZXMgaW4gdGhlIFRYIGZpZm8sIHJldHVybiBhIHBvaW50ZXIgdG8gaXQKKyAqCisgKiBAaTI0MDBtOiBkZXZpY2UgZGVzY3JpcHRvcgorICogQHNpemU6IHNpemUgb2YgdGhlIGJ1ZmZlciB3ZSBuZWVkIHRvIGFsbG9jYXRlCisgKiBAcGFkZGluZzogZW5zdXJlIHRoYXQgdGhlcmUgaXMgYXQgbGVhc3QgdGhpcyBtYW55IGJ5dGVzIG9mIGZyZWUKKyAqICAgICBjb250aWd1b3VzIHNwYWNlIGluIHRoZSBmaWZvLiBUaGlzIGlzIG5lZWRlZCBiZWNhdXNlIGxhdGVyIG9uCisgKiAgICAgd2UgbWlnaHQgbmVlZCB0byBhZGQgcGFkZGluZy4KKyAqCisgKiBSZXR1cm5zOgorICoKKyAqICAgICBQb2ludGVyIHRvIHRoZSBhbGxvY2F0ZWQgc3BhY2UuIE5VTEwgaWYgdGhlcmUgaXMgbm8KKyAqICAgICBzcGFjZS4gVEFJTF9GVUxMIGlmIHRoZXJlIGlzIG5vIHNwYWNlIGF0IHRoZSB0YWlsIGJ1dCB0aGVyZSBpcyBhdAorICogICAgIHRoZSBoZWFkIChDYXNlIEIgYmVsb3cpLgorICoKKyAqIFRoZXNlIGFyZSB0aGUgdHdvIGJhc2ljIGNhc2VzIHdlIG5lZWQgdG8ga2VlcCBhbiBleWUgZm9yIC0tIGl0IGlzCisgKiBtdWNoIGJldHRlciBleHBsYWluZWQgaW4gbGludXgva2VybmVsL2tmaWZvLmMsIGJ1dCB0aGlzIGNvZGUKKyAqIGJhc2ljYWxseSBkb2VzIHRoZSBzYW1lLiBObyByb2NrZXQgc2NpZW5jZSBoZXJlLgorICoKKyAqICAgICAgIENhc2UgQSAgICAgICAgICAgICAgIENhc2UgQgorICogTiAgX19fX19fX19fX18gICAgICAgICAgX19fX19fX19fX18KKyAqICAgfCB0YWlsIHJvb20gfCAgICAgICAgfCAgIGRhdGEgICAgfAorICogICB8ICAgICAgICAgICB8ICAgICAgICB8ICAgICAgICAgICB8CisgKiAgIHw8LSAgSU4gICAtPnwgICAgICAgIHw8LSAgT1VUICAtPnwKKyAqICAgfCAgICAgICAgICAgfCAgICAgICAgfCAgICAgICAgICAgfAorICogICB8ICAgZGF0YSAgICB8ICAgICAgICB8ICAgcm9vbSAgICB8CisgKiAgIHwgICAgICAgICAgIHwgICAgICAgIHwgICAgICAgICAgIHwKKyAqICAgfDwtICBPVVQgIC0+fCAgICAgICAgfDwtICBJTiAgIC0+fAorICogICB8ICAgICAgICAgICB8ICAgICAgICB8ICAgICAgICAgICB8CisgKiAgIHwgaGVhZCByb29tIHwgICAgICAgIHwgICBkYXRhICAgIHwKKyAqIDAgIC0tLS0tLS0tLS0tICAgICAgICAgIC0tLS0tLS0tLS0tCisgKgorICogV2UgYWxsb2NhdGUgb25seSAqY29udGlndW91cyogc3BhY2UuCisgKgorICogV2UgY2FuIGFsbG9jYXRlIG9ubHkgZnJvbSAncm9vbScuIEluIENhc2UgQiwgaXQgaXMgc2ltcGxlOyBpbiBjYXNlCisgKiBBLCB3ZSBvbmx5IHRyeSBmcm9tIHRoZSB0YWlsIHJvb207IGlmIGl0IGlzIG5vdCBlbm91Z2gsIHdlIGp1c3QKKyAqIGZhaWwgYW5kIHJldHVybiBUQUlMX0ZVTEwgYW5kIGxldCB0aGUgY2FsbGVyIGZpZ3VyZSBvdXQgaWYgd2Ugd2FudHMgdG8KKyAqIHNraXAgdGhlIHRhaWwgcm9vbSBhbmQgdHJ5IHRvIGFsbG9jYXRlIGZyb20gdGhlIGhlYWQuCisgKgorICogTm90ZToKKyAqCisgKiAgICAgQXNzdW1lcyBpMjQwMG0tPnR4X2xvY2sgaXMgdGFrZW4sIGFuZCB3ZSB1c2UgdGhhdCBhcyBhIGJhcnJpZXIKKyAqCisgKiAgICAgVGhlIGluZGV4ZXMga2VlcCBpbmNyZWFzaW5nIGFuZCB3ZSByZXNldCB0aGVtIHRvIHplcm8gd2hlbiB3ZQorICogICAgIHBvcCBkYXRhIG9mZiB0aGUgcXVldWUKKyAqLworc3RhdGljCit2b2lkICppMjQwMG1fdHhfZmlmb19wdXNoKHN0cnVjdCBpMjQwMG0gKmkyNDAwbSwgc2l6ZV90IHNpemUsIHNpemVfdCBwYWRkaW5nKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGkyNDAwbV9kZXYoaTI0MDBtKTsKKwlzaXplX3Qgcm9vbSwgdGFpbF9yb29tLCBuZWVkZWRfc2l6ZTsKKwl2b2lkICpwdHI7CisKKwluZWVkZWRfc2l6ZSA9IHNpemUgKyBwYWRkaW5nOworCXJvb20gPSBJMjQwME1fVFhfQlVGX1NJWkUgLSAoaTI0MDBtLT50eF9pbiAtIGkyNDAwbS0+dHhfb3V0KTsKKwlpZiAocm9vbSA8IG5lZWRlZF9zaXplKQl7IC8qIHRoaXMgdGFrZXMgY2FyZSBvZiBDYXNlIEIgKi8KKwkJZF9wcmludGYoMiwgZGV2LCAiZmlmbyBwdXNoICV6dS8lenU6IG5vIHNwYWNlXG4iLAorCQkJIHNpemUsIHBhZGRpbmcpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJLyogSXMgdGhlcmUgc3BhY2UgYXQgdGhlIHRhaWw/ICovCisJdGFpbF9yb29tID0gSTI0MDBNX1RYX0JVRl9TSVpFIC0gaTI0MDBtLT50eF9pbiAlIEkyNDAwTV9UWF9CVUZfU0laRTsKKwlpZiAodGFpbF9yb29tIDwgbmVlZGVkX3NpemUpIHsKKwkJaWYgKGkyNDAwbS0+dHhfb3V0ICUgSTI0MDBNX1RYX0JVRl9TSVpFCisJCSAgICA8IGkyNDAwbS0+dHhfaW4gJSBJMjQwME1fVFhfQlVGX1NJWkUpIHsKKwkJCWRfcHJpbnRmKDIsIGRldiwgImZpZm8gcHVzaCAlenUvJXp1OiB0YWlsIGZ1bGxcbiIsCisJCQkJIHNpemUsIHBhZGRpbmcpOworCQkJcmV0dXJuIFRBSUxfRlVMTDsJLyogVGhlcmUgbWlnaHQgYmUgaGVhZCBzcGFjZSAqLworCQl9IGVsc2UgeworCQkJZF9wcmludGYoMiwgZGV2LCAiZmlmbyBwdXNoICV6dS8lenU6IG5vIGhlYWQgc3BhY2VcbiIsCisJCQkJIHNpemUsIHBhZGRpbmcpOworCQkJcmV0dXJuIE5VTEw7CS8qIFRoZXJlIGlzIG5vIHNwYWNlICovCisJCX0KKwl9CisJcHRyID0gaTI0MDBtLT50eF9idWYgKyBpMjQwMG0tPnR4X2luICUgSTI0MDBNX1RYX0JVRl9TSVpFOworCWRfcHJpbnRmKDIsIGRldiwgImZpZm8gcHVzaCAlenUvJXp1OiBhdCBAJXp1XG4iLCBzaXplLCBwYWRkaW5nLAorCQkgaTI0MDBtLT50eF9pbiAlIEkyNDAwTV9UWF9CVUZfU0laRSk7CisJaTI0MDBtLT50eF9pbiArPSBzaXplOworCXJldHVybiBwdHI7Cit9CisKKworLyoKKyAqIE1hcmsgdGhlIHRhaWwgb2YgdGhlIEZJRk8gYnVmZmVyIGFzICd0by1za2lwJworICoKKyAqIFdlIHNob3VsZCBuZXZlciBoaXQgdGhlIEJVR19PTigpIGJlY2F1c2UgYWxsIHRoZSBzaXplcyB3ZSBwdXNoIHRvCisgKiB0aGUgRklGTyBhcmUgcGFkZGVkIHRvIGJlIGEgbXVsdGlwbGUgb2YgMTYgLS0gdGhlIHNpemUgb2YgKm1zZworICogKEkyNDAwTV9QTF9QQUQgZm9yIHRoZSBwYXlsb2FkcywgSTI0MDBNX1RYX1BMRF9TSVpFIGZvciB0aGUKKyAqIGhlYWRlcikuCisgKgorICogTm90ZToKKyAqCisgKiAgICAgQXNzdW1lcyBpMjQwMG0tPnR4X2xvY2sgaXMgdGFrZW4sIGFuZCB3ZSB1c2UgdGhhdCBhcyBhIGJhcnJpZXIKKyAqLworc3RhdGljCit2b2lkIGkyNDAwbV90eF9za2lwX3RhaWwoc3RydWN0IGkyNDAwbSAqaTI0MDBtKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGkyNDAwbV9kZXYoaTI0MDBtKTsKKwlzaXplX3QgdHhfaW4gPSBpMjQwMG0tPnR4X2luICUgSTI0MDBNX1RYX0JVRl9TSVpFOworCXNpemVfdCB0YWlsX3Jvb20gPSBJMjQwME1fVFhfQlVGX1NJWkUgLSB0eF9pbjsKKwlzdHJ1Y3QgaTI0MDBtX21zZ19oZHIgKm1zZyA9IGkyNDAwbS0+dHhfYnVmICsgdHhfaW47CisJQlVHX09OKHRhaWxfcm9vbSA8IHNpemVvZigqbXNnKSk7CisJbXNnLT5zaXplID0gdGFpbF9yb29tIHwgSTI0MDBNX1RYX1NLSVA7CisJZF9wcmludGYoMiwgZGV2LCAic2tpcCB0YWlsOiBza2lwcGluZyAlenUgYnl0ZXMgQCV6dVxuIiwKKwkJIHRhaWxfcm9vbSwgdHhfaW4pOworCWkyNDAwbS0+dHhfaW4gKz0gdGFpbF9yb29tOworfQorCisKKy8qCisgKiBDaGVjayBpZiBhIHNrYiB3aWxsIGZpdCBpbiB0aGUgVFggcXVldWUncyBjdXJyZW50IGFjdGl2ZSBUWAorICogbWVzc2FnZSAoaWYgdGhlcmUgYXJlIHN0aWxsIGRlc2NyaXB0b3JzIGxlZnQgdW51c2VkKS4KKyAqCisgKiBSZXR1cm5zOgorICogICAgIDAgaWYgdGhlIG1lc3NhZ2Ugd29uJ3QgZml0LCAxIGlmIGl0IHdpbGwuCisgKgorICogTm90ZToKKyAqCisgKiAgICAgQXNzdW1lcyBhIFRYIG1lc3NhZ2UgaXMgYWN0aXZlIChpMjQwMG0tPnR4X21zZykuCisgKgorICogICAgIEFzc3VtZXMgaTI0MDBtLT50eF9sb2NrIGlzIHRha2VuLCBhbmQgd2UgdXNlIHRoYXQgYXMgYSBiYXJyaWVyCisgKi8KK3N0YXRpYwordW5zaWduZWQgaTI0MDBtX3R4X2ZpdHMoc3RydWN0IGkyNDAwbSAqaTI0MDBtKQoreworCXN0cnVjdCBpMjQwMG1fbXNnX2hkciAqbXNnX2hkciA9IGkyNDAwbS0+dHhfbXNnOworCXJldHVybiBsZTE2X3RvX2NwdShtc2dfaGRyLT5udW1fcGxzKSA8IEkyNDAwTV9UWF9QTERfTUFYOworCit9CisKKworLyoKKyAqIFN0YXJ0IGEgbmV3IFRYIG1lc3NhZ2UgaGVhZGVyIGluIHRoZSBxdWV1ZS4KKyAqCisgKiBSZXNlcnZlIG1lbW9yeSBmcm9tIHRoZSBiYXNlIEZJRk8gZW5naW5lIGFuZCB0aGVuIGp1c3QgaW5pdGlhbGl6ZQorICogdGhlIG1lc3NhZ2UgaGVhZGVyLgorICoKKyAqIFdlIGFsbG9jYXRlIHRoZSBiaWdnZXN0IFRYIG1lc3NhZ2UgaGVhZGVyIHdlIG1pZ2h0IG5lZWQgKG9uZSB0aGF0J2QKKyAqIGZpdCBJMjQwME1fVFhfUExEX01BWCBwYXlsb2FkcykgLS0gd2hlbiBpdCBpcyBjbG9zZWQgaXQgd2lsbCBiZQorICogJ2lyb25lZCBpdCBvdXQnIGFuZCB0aGUgdW5uZWVkZWQgcGFydHMgcmVtb3ZlZC4KKyAqCisgKiBOT1RFOgorICoKKyAqICAgICBBc3N1bWVzIHRoYXQgdGhlIHByZXZpb3VzIG1lc3NhZ2UgaXMgQ0xPU0VEIChlZzogZWl0aGVyCisgKiAgICAgdGhlcmUgd2FzIG5vbmUgb3IgJ2kyNDAwbV90eF9jbG9zZSgpJyB3YXMgY2FsbGVkIG9uIGl0KS4KKyAqCisgKiAgICAgQXNzdW1lcyBpMjQwMG0tPnR4X2xvY2sgaXMgdGFrZW4sIGFuZCB3ZSB1c2UgdGhhdCBhcyBhIGJhcnJpZXIKKyAqLworc3RhdGljCit2b2lkIGkyNDAwbV90eF9uZXcoc3RydWN0IGkyNDAwbSAqaTI0MDBtKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGkyNDAwbV9kZXYoaTI0MDBtKTsKKwlzdHJ1Y3QgaTI0MDBtX21zZ19oZHIgKnR4X21zZzsKKwlCVUdfT04oaTI0MDBtLT50eF9tc2cgIT0gTlVMTCk7Cit0cnlfaGVhZDoKKwl0eF9tc2cgPSBpMjQwMG1fdHhfZmlmb19wdXNoKGkyNDAwbSwgSTI0MDBNX1RYX1BMRF9TSVpFLCAwKTsKKwlpZiAodHhfbXNnID09IE5VTEwpCisJCWdvdG8gb3V0OworCWVsc2UgaWYgKHR4X21zZyA9PSBUQUlMX0ZVTEwpIHsKKwkJaTI0MDBtX3R4X3NraXBfdGFpbChpMjQwMG0pOworCQlkX3ByaW50ZigyLCBkZXYsICJuZXcgVFggbWVzc2FnZTogdGFpbCBmdWxsLCB0cnlpbmcgaGVhZFxuIik7CisJCWdvdG8gdHJ5X2hlYWQ7CisJfQorCW1lbXNldCh0eF9tc2csIDAsIEkyNDAwTV9UWF9QTERfU0laRSk7CisJdHhfbXNnLT5zaXplID0gSTI0MDBNX1RYX1BMRF9TSVpFOworb3V0OgorCWkyNDAwbS0+dHhfbXNnID0gdHhfbXNnOworCWRfcHJpbnRmKDIsIGRldiwgIm5ldyBUWCBtZXNzYWdlOiAlcCBAJXp1XG4iLAorCQkgdHhfbXNnLCAodm9pZCAqKSB0eF9tc2cgLSBpMjQwMG0tPnR4X2J1Zik7Cit9CisKKworLyoKKyAqIEZpbmFsaXplIHRoZSBjdXJyZW50IFRYIG1lc3NhZ2UgaGVhZGVyCisgKgorICogU2V0cyB0aGUgbWVzc2FnZSBoZWFkZXIgdG8gYmUgYXQgdGhlIHByb3BlciBsb2NhdGlvbiBkZXBlbmRpbmcgb24KKyAqIGhvdyBtYW55IGRlc2NyaXB0b3JzIHdlIGhhdmUgKGNoZWNrIGRvY3VtZW50YXRpb24gYXQgdGhlIGZpbGUncworICogaGVhZGVyIGZvciBtb3JlIGluZm8gb24gdGhhdCkuCisgKgorICogQXBwZW5kcyBwYWRkaW5nIGJ5dGVzIHRvIG1ha2Ugc3VyZSB0aGUgd2hvbGUgVFggbWVzc2FnZSAoY291bnRpbmcKKyAqIGZyb20gdGhlICdyZWxvY2F0ZWQnIG1lc3NhZ2UgaGVhZGVyKSBpcyBhbGlnbmVkIHRvCisgKiB0eF9ibG9ja19zaXplLiBXZSBhc3N1bWUgdGhlIF9hcHBlbmQoKSBjb2RlIGhhcyBsZWZ0IGVub3VnaCBzcGFjZQorICogaW4gdGhlIEZJRk8gZm9yIHRoYXQuIElmIHRoZXJlIGFyZSBubyBwYXlsb2FkcywganVzdCBwYXNzLCBhcyBpdAorICogd29uJ3QgYmUgdHJhbnNmZXJyZWQuCisgKgorICogVGhlIGFtb3VudCBvZiBwYWRkaW5nIGJ5dGVzIGRlcGVuZHMgb24gaG93IG1hbnkgcGF5bG9hZHMgYXJlIGluIHRoZQorICogVFggbWVzc2FnZSwgYXMgdGhlICJtc2cgaGVhZGVyIGFuZCBwYXlsb2FkIGRlc2NyaXB0b3JzIiB3aWxsIGJlCisgKiBzaGlmdGVkIHVwIGluIHRoZSBidWZmZXIuCisgKi8KK3N0YXRpYwordm9pZCBpMjQwMG1fdHhfY2xvc2Uoc3RydWN0IGkyNDAwbSAqaTI0MDBtKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGkyNDAwbV9kZXYoaTI0MDBtKTsKKwlzdHJ1Y3QgaTI0MDBtX21zZ19oZHIgKnR4X21zZyA9IGkyNDAwbS0+dHhfbXNnOworCXN0cnVjdCBpMjQwMG1fbXNnX2hkciAqdHhfbXNnX21vdmVkOworCXNpemVfdCBhbGlnbmVkX3NpemUsIHBhZGRpbmcsIGhkcl9zaXplOworCXZvaWQgKnBhZF9idWY7CisKKwlpZiAodHhfbXNnLT5zaXplICYgSTI0MDBNX1RYX1NLSVApCS8qIGEgc2tpcHBlcj8gbm90aGluZyB0byBkbyAqLworCQlnb3RvIG91dDsKKworCS8qIFJlbG9jYXRlIHRoZSBtZXNzYWdlIGhlYWRlcgorCSAqCisJICogRmluZCB0aGUgY3VycmVudCBoZWFkZXIgc2l6ZSwgYWxpZ24gaXQgdG8gMTYgYW5kIGlmIHdlIG5lZWQKKwkgKiB0byBtb3ZlIGl0IHNvIHRoZSB0YWlsIGlzIG5leHQgdG8gdGhlIHBheWxvYWRzLCBtb3ZlIGl0IGFuZAorCSAqIHNldCB0aGUgb2Zmc2V0LgorCSAqCisJICogSWYgaXQgbW92ZWQsIHRoaXMgaGVhZGVyIGlzIGdvb2Qgb25seSBmb3IgdHJhbnNtaXNzaW9uOyB0aGUKKwkgKiBvcmlnaW5hbCBvbmUgKGl0IGlzIGtlcHQgaWYgd2UgbW92ZWQpIGlzIHN0aWxsIHVzZWQgdG8KKwkgKiBmaWd1cmUgb3V0IHdoZXJlIHRoZSBuZXh0IFRYIG1lc3NhZ2Ugc3RhcnRzIChhbmQgd2hlcmUgdGhlCisJICogb2Zmc2V0IHRvIHRoZSBtb3ZlZCBoZWFkZXIgaXMpLgorCSAqLworCWhkcl9zaXplID0gc2l6ZW9mKCp0eF9tc2cpCisJCSsgbGUxNl90b19jcHUodHhfbXNnLT5udW1fcGxzKSAqIHNpemVvZih0eF9tc2ctPnBsZFswXSk7CisJaGRyX3NpemUgPSBBTElHTihoZHJfc2l6ZSwgSTI0MDBNX1BMX1BBRCk7CisJdHhfbXNnLT5vZmZzZXQgPSBJMjQwME1fVFhfUExEX1NJWkUgLSBoZHJfc2l6ZTsKKwl0eF9tc2dfbW92ZWQgPSAodm9pZCAqKSB0eF9tc2cgKyB0eF9tc2ctPm9mZnNldDsKKwltZW1tb3ZlKHR4X21zZ19tb3ZlZCwgdHhfbXNnLCBoZHJfc2l6ZSk7CisJdHhfbXNnX21vdmVkLT5zaXplIC09IHR4X21zZy0+b2Zmc2V0OworCS8qCisJICogTm93IGZpZ3VyZSBvdXQgaG93IG11Y2ggd2UgaGF2ZSB0byBhZGQgdG8gdGhlIChtb3ZlZCEpCisJICogbWVzc2FnZSBzbyB0aGUgc2l6ZSBpcyBhIG11bHRpcGxlIG9mIGkyNDAwbS0+YnVzX3R4X2Jsb2NrX3NpemUuCisJICovCisJYWxpZ25lZF9zaXplID0gQUxJR04odHhfbXNnX21vdmVkLT5zaXplLCBpMjQwMG0tPmJ1c190eF9ibG9ja19zaXplKTsKKwlwYWRkaW5nID0gYWxpZ25lZF9zaXplIC0gdHhfbXNnX21vdmVkLT5zaXplOworCWlmIChwYWRkaW5nID4gMCkgeworCQlwYWRfYnVmID0gaTI0MDBtX3R4X2ZpZm9fcHVzaChpMjQwMG0sIHBhZGRpbmcsIDApOworCQlpZiAodW5saWtlbHkoV0FSTl9PTihwYWRfYnVmID09IE5VTEwKKwkJCQkgICAgIHx8IHBhZF9idWYgPT0gVEFJTF9GVUxMKSkpIHsKKwkJCS8qIFRoaXMgc2hvdWxkIG5vdCBoYXBwZW4gLS0gYXBwZW5kIHNob3VsZCB2ZXJpZnkKKwkJCSAqIHRoZXJlIGlzIGFsd2F5cyBzcGFjZSBsZWZ0IGF0IGxlYXN0IHRvIGFwcGVuZAorCQkJICogdHhfYmxvY2tfc2l6ZSAqLworCQkJZGV2X2VycihkZXYsCisJCQkJIlNXIEJVRyEgUG9zc2libGUgZGF0YSBsZWFrYWdlIGZyb20gbWVtb3J5IHRoZSAiCisJCQkJImRldmljZSBzaG91bGQgbm90IHJlYWQgZm9yIHBhZGRpbmcgLSAiCisJCQkJInNpemUgJWx1IGFsaWduZWRfc2l6ZSAlenUgdHhfYnVmICVwIGluICIKKwkJCQkiJXp1IG91dCAlenVcbiIsCisJCQkJKHVuc2lnbmVkIGxvbmcpIHR4X21zZ19tb3ZlZC0+c2l6ZSwKKwkJCQlhbGlnbmVkX3NpemUsIGkyNDAwbS0+dHhfYnVmLCBpMjQwMG0tPnR4X2luLAorCQkJCWkyNDAwbS0+dHhfb3V0KTsKKwkJfSBlbHNlCisJCQltZW1zZXQocGFkX2J1ZiwgMHhhZCwgcGFkZGluZyk7CisJfQorCXR4X21zZ19tb3ZlZC0+cGFkZGluZyA9IGNwdV90b19sZTE2KHBhZGRpbmcpOworCXR4X21zZ19tb3ZlZC0+c2l6ZSArPSBwYWRkaW5nOworCWlmICh0eF9tc2cgIT0gdHhfbXNnX21vdmVkKQorCQl0eF9tc2ctPnNpemUgKz0gcGFkZGluZzsKK291dDoKKwlpMjQwMG0tPnR4X21zZyA9IE5VTEw7Cit9CisKKworLyoqCisgKiBpMjQwMG1fdHggLSBzZW5kIHRoZSBkYXRhIGluIGEgYnVmZmVyIHRvIHRoZSBkZXZpY2UKKyAqCisgKiBAYnVmOiBwb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gdHJhbnNtaXQKKyAqCisgKiBAYnVmX2xlbjogYnVmZmVyIHNpemUKKyAqCisgKiBAcGxfdHlwZTogdHlwZSBvZiB0aGUgcGF5bG9hZCB3ZSBhcmUgc2VuZGluZy4KKyAqCisgKiBSZXR1cm5zOgorICogICAgIDAgaWYgb2ssIDwgMCBlcnJubyBjb2RlIG9uIGVycm9yICgtRU5PU1BDLCBpZiB0aGVyZSBpcyBubyBtb3JlCisgKiAgICAgcm9vbSBmb3IgdGhlIG1lc3NhZ2UgaW4gdGhlIHF1ZXVlKS4KKyAqCisgKiBBcHBlbmRzIHRoZSBidWZmZXIgdG8gdGhlIFRYIEZJRk8gYW5kIG5vdGlmaWVzIHRoZSBidXMtc3BlY2lmaWMKKyAqIHBhcnQgb2YgdGhlIGRyaXZlciB0aGF0IHRoZXJlIGlzIG5ldyBkYXRhIHJlYWR5IHRvIHRyYW5zbWl0LgorICogT25jZSB0aGlzIGZ1bmN0aW9uIHJldHVybnMsIHRoZSBidWZmZXIgaGFzIGJlZW4gY29waWVkLCBzbyBpdCBjYW4KKyAqIGJlIHJldXNlZC4KKyAqCisgKiBUaGUgc3RlcHMgZm9sbG93ZWQgdG8gYXBwZW5kIGFyZSBleHBsYWluZWQgaW4gZGV0YWlsIGluIHRoZSBmaWxlCisgKiBoZWFkZXIuCisgKgorICogV2hlbmV2ZXIgd2Ugd3JpdGUgdG8gYSBtZXNzYWdlLCB3ZSBpbmNyZWFzZSBtc2ctPnNpemUsIHNvIGl0CisgKiByZWZsZWN0cyBleGFjdGx5IGhvdyBiaWcgdGhlIG1lc3NhZ2UgaXMuIFRoaXMgaXMgbmVlZGVkIHNvIHRoYXQgaWYKKyAqIHdlIGNvbmNhdGVuYXRlIHR3byBtZXNzYWdlcyBiZWZvcmUgdGhleSBjYW4gYmUgc2VudCwgdGhlIGNvZGUgdGhhdAorICogc2VuZHMgdGhlIG1lc3NhZ2VzIGNhbiBmaW5kIHRoZSBib3VuZGFyaWVzIChhbmQgaXQgd2lsbCByZXBsYWNlIHRoZQorICogc2l6ZSB3aXRoIHRoZSByZWFsIGJhcmtlciBiZWZvcmUgc2VuZGluZykuCisgKgorICogTm90ZToKKyAqCisgKiAgICAgQ29sZCBhbmQgd2FybSByZXNldCBwYXlsb2FkcyBuZWVkIHRvIGJlIHNlbnQgYXMgYSBzaW5nbGUKKyAqICAgICBwYXlsb2FkLCBzbyB3ZSBoYW5kbGUgdGhhdC4KKyAqLworaW50IGkyNDAwbV90eChzdHJ1Y3QgaTI0MDBtICppMjQwMG0sIGNvbnN0IHZvaWQgKmJ1Ziwgc2l6ZV90IGJ1Zl9sZW4sCisJICAgICAgZW51bSBpMjQwMG1fcHQgcGxfdHlwZSkKK3sKKwlpbnQgcmVzdWx0ID0gLUVOT1NQQzsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBpMjQwMG1fZGV2KGkyNDAwbSk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzaXplX3QgcGFkZGVkX2xlbjsKKwl2b2lkICpwdHI7CisJdW5zaWduZWQgaXNfc2luZ2xldG9uID0gcGxfdHlwZSA9PSBJMjQwME1fUFRfUkVTRVRfV0FSTQorCQl8fCBwbF90eXBlID09IEkyNDAwTV9QVF9SRVNFVF9DT0xEOworCisJZF9mbnN0YXJ0KDMsIGRldiwgIihpMjQwMG0gJXAgc2tiICVwIFslenUgYnl0ZXNdIHB0ICV1KVxuIiwKKwkJICBpMjQwMG0sIGJ1ZiwgYnVmX2xlbiwgcGxfdHlwZSk7CisJcGFkZGVkX2xlbiA9IEFMSUdOKGJ1Zl9sZW4sIEkyNDAwTV9QTF9QQUQpOworCWRfcHJpbnRmKDUsIGRldiwgInBhZGRlZF9sZW4gJXpkIGJ1Zl9sZW4gJXpkXG4iLCBwYWRkZWRfbGVuLCBidWZfbGVuKTsKKwkvKiBJZiB0aGVyZSBpcyBubyBjdXJyZW50IFRYIG1lc3NhZ2UsIGNyZWF0ZSBvbmU7IGlmIHRoZQorCSAqIGN1cnJlbnQgb25lIGlzIG91dCBvZiBwYXlsb2FkIHNsb3RzIG9yIHdlIGhhdmUgYSBzaW5nbGV0b24sCisJICogY2xvc2UgaXQgYW5kIHN0YXJ0IGEgbmV3IG9uZSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZpMjQwMG0tPnR4X2xvY2ssIGZsYWdzKTsKK3RyeV9uZXc6CisJaWYgKHVubGlrZWx5KGkyNDAwbS0+dHhfbXNnID09IE5VTEwpKQorCQlpMjQwMG1fdHhfbmV3KGkyNDAwbSk7CisJZWxzZSBpZiAodW5saWtlbHkoIWkyNDAwbV90eF9maXRzKGkyNDAwbSkKKwkJCSAgfHwgKGlzX3NpbmdsZXRvbiAmJiBpMjQwMG0tPnR4X21zZy0+bnVtX3BscyAhPSAwKSkpIHsKKwkJZF9wcmludGYoMiwgZGV2LCAiY2xvc2luZyBUWCBtZXNzYWdlIChmaXRzICV1IHNpbmdsZXRvbiAiCisJCQkgIiV1IG51bV9wbHMgJXUpXG4iLCBpMjQwMG1fdHhfZml0cyhpMjQwMG0pLAorCQkJIGlzX3NpbmdsZXRvbiwgaTI0MDBtLT50eF9tc2ctPm51bV9wbHMpOworCQlpMjQwMG1fdHhfY2xvc2UoaTI0MDBtKTsKKwkJaTI0MDBtX3R4X25ldyhpMjQwMG0pOworCX0KKwlpZiAoaTI0MDBtLT50eF9tc2ctPnNpemUgKyBwYWRkZWRfbGVuID4gSTI0MDBNX1RYX0JVRl9TSVpFIC8gMikgeworCQlkX3ByaW50ZigyLCBkZXYsICJUWDogbWVzc2FnZSB0b28gYmlnLCBnb2luZyBuZXdcbiIpOworCQlpMjQwMG1fdHhfY2xvc2UoaTI0MDBtKTsKKwkJaTI0MDBtX3R4X25ldyhpMjQwMG0pOworCX0KKwlpZiAoaTI0MDBtLT50eF9tc2cgPT0gTlVMTCkKKwkJZ290byBlcnJvcl90eF9uZXc7CisJLyogU28gd2UgaGF2ZSBhIGN1cnJlbnQgbWVzc2FnZSBoZWFkZXI7IG5vdyBhcHBlbmQgc3BhY2UgZm9yCisJICogdGhlIG1lc3NhZ2UgLS0gaWYgdGhlcmUgaXMgbm90IGVub3VnaCwgdHJ5IHRoZSBoZWFkICovCisJcHRyID0gaTI0MDBtX3R4X2ZpZm9fcHVzaChpMjQwMG0sIHBhZGRlZF9sZW4sCisJCQkJICBpMjQwMG0tPmJ1c190eF9ibG9ja19zaXplKTsKKwlpZiAocHRyID09IFRBSUxfRlVMTCkgewkvKiBUYWlsIGlzIGZ1bGwsIHRyeSBoZWFkICovCisJCWRfcHJpbnRmKDIsIGRldiwgInBsIGFwcGVuZDogdGFpbCBmdWxsXG4iKTsKKwkJaTI0MDBtX3R4X2Nsb3NlKGkyNDAwbSk7CisJCWkyNDAwbV90eF9za2lwX3RhaWwoaTI0MDBtKTsKKwkJZ290byB0cnlfbmV3OworCX0gZWxzZSBpZiAocHRyID09IE5VTEwpIHsJLyogQWxsIGZ1bGwgKi8KKwkJcmVzdWx0ID0gLUVOT1NQQzsKKwkJZF9wcmludGYoMiwgZGV2LCAicGwgYXBwZW5kOiBhbGwgZnVsbFxuIik7CisJfSBlbHNlIHsJCQkvKiBHb3Qgc3BhY2UsIGNvcHkgaXQsIHNldCBwYWRkaW5nICovCisJCXN0cnVjdCBpMjQwMG1fbXNnX2hkciAqdHhfbXNnID0gaTI0MDBtLT50eF9tc2c7CisJCXVuc2lnbmVkIG51bV9wbHMgPSBsZTE2X3RvX2NwdSh0eF9tc2ctPm51bV9wbHMpOworCQltZW1jcHkocHRyLCBidWYsIGJ1Zl9sZW4pOworCQltZW1zZXQocHRyICsgYnVmX2xlbiwgMHhhZCwgcGFkZGVkX2xlbiAtIGJ1Zl9sZW4pOworCQlpMjQwMG1fcGxkX3NldCgmdHhfbXNnLT5wbGRbbnVtX3Bsc10sIGJ1Zl9sZW4sIHBsX3R5cGUpOworCQlkX3ByaW50ZigzLCBkZXYsICJwbGQgMHglMDh4ICh0eXBlIDB4JTF4IGxlbiAweCUwNHp4XG4iLAorCQkJIGxlMzJfdG9fY3B1KHR4X21zZy0+cGxkW251bV9wbHNdLnZhbCksCisJCQkgcGxfdHlwZSwgYnVmX2xlbik7CisJCXR4X21zZy0+bnVtX3BscyA9IGxlMTZfdG9fY3B1KG51bV9wbHMrMSk7CisJCXR4X21zZy0+c2l6ZSArPSBwYWRkZWRfbGVuOworCQlkX3ByaW50ZigyLCBkZXYsICJUWDogYXBwZW5kZWQgJXp1IGIgKHVwIHRvICV1IGIpIHBsICMldSBcbiIsCisJCQlwYWRkZWRfbGVuLCB0eF9tc2ctPnNpemUsIG51bV9wbHMrMSk7CisJCWRfcHJpbnRmKDIsIGRldiwKKwkJCSAiVFg6IGFwcGVuZGVkIGhkciBAJXp1ICV6dSBiIHBsICMldSBAJXp1ICV6dS8lenUgYlxuIiwKKwkJCSAodm9pZCAqKXR4X21zZyAtIGkyNDAwbS0+dHhfYnVmLCAoc2l6ZV90KXR4X21zZy0+c2l6ZSwKKwkJCSBudW1fcGxzKzEsIHB0ciAtIGkyNDAwbS0+dHhfYnVmLCBidWZfbGVuLCBwYWRkZWRfbGVuKTsKKwkJcmVzdWx0ID0gMDsKKwkJaWYgKGlzX3NpbmdsZXRvbikKKwkJCWkyNDAwbV90eF9jbG9zZShpMjQwMG0pOworCX0KK2Vycm9yX3R4X25ldzoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpMjQwMG0tPnR4X2xvY2ssIGZsYWdzKTsKKwlpMjQwMG0tPmJ1c190eF9raWNrKGkyNDAwbSk7CS8qIGFsd2F5cyBraWNrLCBtaWdodCBmcmVlIHVwIHNwYWNlICovCisJZF9mbmVuZCgzLCBkZXYsICIoaTI0MDBtICVwIHNrYiAlcCBbJXp1IGJ5dGVzXSBwdCAldSkgPSAlZFxuIiwKKwkJaTI0MDBtLCBidWYsIGJ1Zl9sZW4sIHBsX3R5cGUsIHJlc3VsdCk7CisJcmV0dXJuIHJlc3VsdDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGkyNDAwbV90eCk7CisKKworLyoqCisgKiBpMjQwMG1fdHhfbXNnX2dldCAtIEdldCB0aGUgZmlyc3QgVFggbWVzc2FnZSBpbiB0aGUgRklGTyB0byBzdGFydCBzZW5kaW5nIGl0CisgKgorICogQGkyNDAwbTogZGV2aWNlIGRlc2NyaXB0b3JzCisgKiBAYnVzX3NpemU6IHdoZXJlIHRvIHBsYWNlIHRoZSBzaXplIG9mIHRoZSBUWCBtZXNzYWdlCisgKgorICogQ2FsbGVkIGJ5IHRoZSBidXMtc3BlY2lmaWMgZHJpdmVyIHRvIGdldCB0aGUgZmlyc3QgVFggbWVzc2FnZSBhdAorICogdGhlIEZJRiB0aGF0IGlzIHJlYWR5IGZvciB0cmFuc21pc3Npb24uCisgKgorICogSXQgc2V0cyB0aGUgc3RhdGUgaW4gQGkyNDAwbSB0byBpbmRpY2F0ZSB0aGUgYnVzLXNwZWNpZmljIGRyaXZlciBpcworICogdHJhbnNmZXJpbmcgdGhhdCBtZXNzYWdlIChpMjQwMG0tPnR4X21zZ19zaXplKS4KKyAqCisgKiBPbmNlIHRoZSB0cmFuc2ZlciBpcyBjb21wbGV0ZWQsIGNhbGwgaTI0MDBtX3R4X21zZ19zZW50KCkuCisgKgorICogTm90ZXM6CisgKgorICogICAgIFRoZSBzaXplIG9mIHRoZSBUWCBtZXNzYWdlIHRvIGJlIHRyYW5zbWl0dGVkIG1pZ2h0IGJlIHNtYWxsZXIgdGhhbgorICogICAgIHRoYXQgb2YgdGhlIFRYIG1lc3NhZ2UgaW4gdGhlIEZJRk8gKGluIGNhc2UgdGhlIGhlYWRlciB3YXMKKyAqICAgICBzaG9ydGVyKS4gSGVuY2UsIHdlIGNvcHkgaXQgaW4gQGJ1c19zaXplLCBmb3IgdGhlIGJ1cyBsYXllciB0bworICogICAgIHVzZS4gV2Uga2VlcCB0aGUgbWVzc2FnZSdzIHNpemUgaW4gaTI0MDBtLT50eF9tc2dfc2l6ZSBzbyB0aGF0CisgKiAgICAgd2hlbiB0aGUgYnVzIGxhdGVyIGlzIGRvbmUgdHJhbnNmZXJyaW5nIHdlIGtub3cgaG93IG11Y2ggdG8KKyAqICAgICBhZHZhbmNlIHRoZSBmaWZvLgorICoKKyAqICAgICBXZSBjb2xsZWN0IHN0YXRpc3RpY3MgaGVyZSBhcyBhbGwgdGhlIGRhdGEgaXMgYXZhaWxhYmxlIGFuZCB3ZQorICogICAgIGFzc3VtZSBpdCBpcyBnb2luZyB0byB3b3JrIFtzZWUgaTI0MDBtX3R4X21zZ19zZW50KCldLgorICovCitzdHJ1Y3QgaTI0MDBtX21zZ19oZHIgKmkyNDAwbV90eF9tc2dfZ2V0KHN0cnVjdCBpMjQwMG0gKmkyNDAwbSwKKwkJCQkJIHNpemVfdCAqYnVzX3NpemUpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gaTI0MDBtX2RldihpMjQwMG0pOworCXN0cnVjdCBpMjQwMG1fbXNnX2hkciAqdHhfbXNnLCAqdHhfbXNnX21vdmVkOworCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIHBsczsKKworCWRfZm5zdGFydCgzLCBkZXYsICIoaTI0MDBtICVwIGJ1c19zaXplICVwKVxuIiwgaTI0MDBtLCBidXNfc2l6ZSk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmkyNDAwbS0+dHhfbG9jaywgZmxhZ3MpOworc2tpcDoKKwl0eF9tc2dfbW92ZWQgPSBOVUxMOworCWlmIChpMjQwMG0tPnR4X2luID09IGkyNDAwbS0+dHhfb3V0KSB7CS8qIEVtcHR5IEZJRk8/ICovCisJCWkyNDAwbS0+dHhfaW4gPSAwOworCQlpMjQwMG0tPnR4X291dCA9IDA7CisJCWRfcHJpbnRmKDIsIGRldiwgIlRYOiBGSUZPIGVtcHR5OiByZXNldHRpbmdcbiIpOworCQlnb3RvIG91dF91bmxvY2s7CisJfQorCXR4X21zZyA9IGkyNDAwbS0+dHhfYnVmICsgaTI0MDBtLT50eF9vdXQgJSBJMjQwME1fVFhfQlVGX1NJWkU7CisJaWYgKHR4X21zZy0+c2l6ZSAmIEkyNDAwTV9UWF9TS0lQKSB7CS8qIHNraXA/ICovCisJCWRfcHJpbnRmKDIsIGRldiwgIlRYOiBza2lwOiBtc2cgQCV6dSAoJXp1IGIpXG4iLAorCQkJIGkyNDAwbS0+dHhfb3V0ICUgSTI0MDBNX1RYX0JVRl9TSVpFLAorCQkJIChzaXplX3QpIHR4X21zZy0+c2l6ZSAmIH5JMjQwME1fVFhfU0tJUCk7CisJCWkyNDAwbS0+dHhfb3V0ICs9IHR4X21zZy0+c2l6ZSAmIH5JMjQwME1fVFhfU0tJUDsKKwkJZ290byBza2lwOworCX0KKworCWlmICh0eF9tc2ctPm51bV9wbHMgPT0gMCkgewkJLyogTm8gcGF5bG9hZHM/ICovCisJCWlmICh0eF9tc2cgPT0gaTI0MDBtLT50eF9tc2cpIHsJLyogb3Blbiwgd2UgYXJlIGRvbmUgKi8KKwkJCWRfcHJpbnRmKDIsIGRldiwKKwkJCQkgIlRYOiBGSUZPIGVtcHR5OiBvcGVuIG1zZyB3L28gcGF5bG9hZHMgQCV6dVxuIiwKKwkJCQkgKHZvaWQgKikgdHhfbXNnIC0gaTI0MDBtLT50eF9idWYpOworCQkJdHhfbXNnID0gTlVMTDsKKwkJCWdvdG8gb3V0X3VubG9jazsKKwkJfSBlbHNlIHsJCQkvKiBjbG9zZWQsIHNraXAgaXQgKi8KKwkJCWRfcHJpbnRmKDIsIGRldiwKKwkJCQkgIlRYOiBza2lwIG1zZyB3L28gcGF5bG9hZHMgQCV6dSAoJXp1IGIpXG4iLAorCQkJCSAodm9pZCAqKSB0eF9tc2cgLSBpMjQwMG0tPnR4X2J1ZiwKKwkJCQkgKHNpemVfdCkgdHhfbXNnLT5zaXplKTsKKwkJCWkyNDAwbS0+dHhfb3V0ICs9IHR4X21zZy0+c2l6ZSAmIH5JMjQwME1fVFhfU0tJUDsKKwkJCWdvdG8gc2tpcDsKKwkJfQorCX0KKwlpZiAodHhfbXNnID09IGkyNDAwbS0+dHhfbXNnKQkJLyogb3BlbiBtc2c/ICovCisJCWkyNDAwbV90eF9jbG9zZShpMjQwMG0pOworCisJLyogTm93IHdlIGhhdmUgYSB2YWxpZCBUWCBtZXNzYWdlICh3aXRoIHBheWxvYWRzKSB0byBUWCAqLworCXR4X21zZ19tb3ZlZCA9ICh2b2lkICopIHR4X21zZyArIHR4X21zZy0+b2Zmc2V0OworCWkyNDAwbS0+dHhfbXNnX3NpemUgPSB0eF9tc2ctPnNpemU7CisJKmJ1c19zaXplID0gdHhfbXNnX21vdmVkLT5zaXplOworCWRfcHJpbnRmKDIsIGRldiwgIlRYOiBwaWQgJWQgbXNnIGhkciBhdCBAJXp1IG9mZnNldCArQCV6dSAiCisJCSAic2l6ZSAlenUgYnVzX3NpemUgJXp1XG4iLAorCQkgY3VycmVudC0+cGlkLCAodm9pZCAqKSB0eF9tc2cgLSBpMjQwMG0tPnR4X2J1ZiwKKwkJIChzaXplX3QpIHR4X21zZy0+b2Zmc2V0LCAoc2l6ZV90KSB0eF9tc2ctPnNpemUsCisJCSAoc2l6ZV90KSB0eF9tc2dfbW92ZWQtPnNpemUpOworCXR4X21zZ19tb3ZlZC0+YmFya2VyID0gbGUzMl90b19jcHUoSTI0MDBNX0gyRF9QUkVWSUVXX0JBUktFUik7CisJdHhfbXNnX21vdmVkLT5zZXF1ZW5jZSA9IGxlMzJfdG9fY3B1KGkyNDAwbS0+dHhfc2VxdWVuY2UrKyk7CisKKwlwbHMgPSBsZTMyX3RvX2NwdSh0eF9tc2dfbW92ZWQtPm51bV9wbHMpOworCWkyNDAwbS0+dHhfcGxfbnVtICs9IHBsczsJCS8qIFVwZGF0ZSBzdGF0cyAqLworCWlmIChwbHMgPiBpMjQwMG0tPnR4X3BsX21heCkKKwkJaTI0MDBtLT50eF9wbF9tYXggPSBwbHM7CisJaWYgKHBscyA8IGkyNDAwbS0+dHhfcGxfbWluKQorCQlpMjQwMG0tPnR4X3BsX21pbiA9IHBsczsKKwlpMjQwMG0tPnR4X251bSsrOworCWkyNDAwbS0+dHhfc2l6ZV9hY2MgKz0gKmJ1c19zaXplOworCWlmICgqYnVzX3NpemUgPCBpMjQwMG0tPnR4X3NpemVfbWluKQorCQlpMjQwMG0tPnR4X3NpemVfbWluID0gKmJ1c19zaXplOworCWlmICgqYnVzX3NpemUgPiBpMjQwMG0tPnR4X3NpemVfbWF4KQorCQlpMjQwMG0tPnR4X3NpemVfbWF4ID0gKmJ1c19zaXplOworb3V0X3VubG9jazoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpMjQwMG0tPnR4X2xvY2ssIGZsYWdzKTsKKwlkX2Zuc3RhcnQoMywgZGV2LCAiKGkyNDAwbSAlcCBidXNfc2l6ZSAlcCBbJXp1XSkgPSAlcFxuIiwKKwkJICBpMjQwMG0sIGJ1c19zaXplLCAqYnVzX3NpemUsIHR4X21zZ19tb3ZlZCk7CisJcmV0dXJuIHR4X21zZ19tb3ZlZDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGkyNDAwbV90eF9tc2dfZ2V0KTsKKworCisvKioKKyAqIGkyNDAwbV90eF9tc2dfc2VudCAtIGluZGljYXRlIHRoZSB0cmFuc21pc3Npb24gb2YgYSBUWCBtZXNzYWdlCisgKgorICogQGkyNDAwbTogZGV2aWNlIGRlc2NyaXB0b3IKKyAqCisgKiBDYWxsZWQgYnkgdGhlIGJ1cy1zcGVjaWZpYyBkcml2ZXIgd2hlbiBhIG1lc3NhZ2UgaGFzIGJlZW4gc2VudDsKKyAqIHRoaXMgcG9wcyBpdCBmcm9tIHRoZSBGSUZPOyBhbmQgYXMgdGhlcmUgaXMgc3BhY2UsIHN0YXJ0IHRoZSBxdWV1ZQorICogaW4gY2FzZSBpdCB3YXMgc3RvcHBlZC4KKyAqCisgKiBTaG91bGQgYmUgY2FsbGVkIGV2ZW4gaWYgdGhlIG1lc3NhZ2Ugc2VuZCBmYWlsZWQgYW5kIHdlIGFyZQorICogZHJvcHBpbmcgdGhpcyBUWCBtZXNzYWdlLgorICovCit2b2lkIGkyNDAwbV90eF9tc2dfc2VudChzdHJ1Y3QgaTI0MDBtICppMjQwMG0pCit7CisJdW5zaWduZWQgbjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGkyNDAwbV9kZXYoaTI0MDBtKTsKKworCWRfZm5zdGFydCgzLCBkZXYsICIoaTI0MDBtICVwKVxuIiwgaTI0MDBtKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaTI0MDBtLT50eF9sb2NrLCBmbGFncyk7CisJaTI0MDBtLT50eF9vdXQgKz0gaTI0MDBtLT50eF9tc2dfc2l6ZTsKKwlkX3ByaW50ZigyLCBkZXYsICJUWDogc2VudCAlenUgYlxuIiwgKHNpemVfdCkgaTI0MDBtLT50eF9tc2dfc2l6ZSk7CisJaTI0MDBtLT50eF9tc2dfc2l6ZSA9IDA7CisJQlVHX09OKGkyNDAwbS0+dHhfb3V0ID4gaTI0MDBtLT50eF9pbik7CisJLyogbGV2ZWwgdGhlbSBGSUZPIG1hcmtlcnMgb2ZmICovCisJbiA9IGkyNDAwbS0+dHhfb3V0IC8gSTI0MDBNX1RYX0JVRl9TSVpFOworCWkyNDAwbS0+dHhfb3V0ICU9IEkyNDAwTV9UWF9CVUZfU0laRTsKKwlpMjQwMG0tPnR4X2luIC09IG4gKiBJMjQwME1fVFhfQlVGX1NJWkU7CisJbmV0aWZfc3RhcnRfcXVldWUoaTI0MDBtLT53aW1heF9kZXYubmV0X2Rldik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaTI0MDBtLT50eF9sb2NrLCBmbGFncyk7CisJZF9mbmVuZCgzLCBkZXYsICIoaTI0MDBtICVwKSA9IHZvaWRcbiIsIGkyNDAwbSk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChpMjQwMG1fdHhfbXNnX3NlbnQpOworCisKKy8qKgorICogaTI0MDBtX3R4X3NldHVwIC0gSW5pdGlhbGl6ZSB0aGUgVFggcXVldWUgYW5kIGluZnJhc3RydWN0dXJlCisgKgorICogTWFrZSBzdXJlIHdlIHJlc2V0IHRoZSBUWCBzZXF1ZW5jZSB0byB6ZXJvLCBhcyB3aGVuIHRoaXMgZnVuY3Rpb24KKyAqIGlzIGNhbGxlZCwgdGhlIGZpcm13YXJlIGhhcyBiZWVuIGp1c3QgcmVzdGFydGVkLgorICovCitpbnQgaTI0MDBtX3R4X3NldHVwKHN0cnVjdCBpMjQwMG0gKmkyNDAwbSkKK3sKKwlpbnQgcmVzdWx0OworCisJLyogRG8gdGhpcyBoZXJlIG9ubHkgb25jZSAtLSBjYW4ndCBkbyBvbgorCSAqIGkyNDAwbV9oYXJkX3N0YXJ0X3htaXQoKSBhcyB3ZSdsbCBjYXVzZSByYWNlIGNvbmRpdGlvbnMgaWYKKwkgKiB0aGUgV1Mgd2FzIHNjaGVkdWxlZCBvbiBhbm90aGVyIENQVSAqLworCUlOSVRfV09SSygmaTI0MDBtLT53YWtlX3R4X3dzLCBpMjQwMG1fd2FrZV90eF93b3JrKTsKKworCWkyNDAwbS0+dHhfc2VxdWVuY2UgPSAwOworCWkyNDAwbS0+dHhfYnVmID0ga21hbGxvYyhJMjQwME1fVFhfQlVGX1NJWkUsIEdGUF9LRVJORUwpOworCWlmIChpMjQwMG0tPnR4X2J1ZiA9PSBOVUxMKQorCQlyZXN1bHQgPSAtRU5PTUVNOworCWVsc2UKKwkJcmVzdWx0ID0gMDsKKwkvKiBIdWg/IHRoZSBidXMgbGF5ZXIgaGFzIHRvIGRlZmluZSB0aGlzLi4uICovCisJQlVHX09OKGkyNDAwbS0+YnVzX3R4X2Jsb2NrX3NpemUgPT0gMCk7CisJcmV0dXJuIHJlc3VsdDsKKworfQorCisKKy8qKgorICogaTI0MDBtX3R4X3JlbGVhc2UgLSBUZWFyIGRvd24gdGhlIFRYIHF1ZXVlIGFuZCBpbmZyYXN0cnVjdHVyZQorICovCit2b2lkIGkyNDAwbV90eF9yZWxlYXNlKHN0cnVjdCBpMjQwMG0gKmkyNDAwbSkKK3sKKwlrZnJlZShpMjQwMG0tPnR4X2J1Zik7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aW1heC9pMjQwMG0vdXNiLWRlYnVnLWxldmVscy5oIGIvZHJpdmVycy9uZXQvd2ltYXgvaTI0MDBtL3VzYi1kZWJ1Zy1sZXZlbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDM1OGJkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2ltYXgvaTI0MDBtL3VzYi1kZWJ1Zy1sZXZlbHMuaApAQCAtMCwwICsxLDQyIEBACisvKgorICogSW50ZWwgV2lyZWxlc3MgV2lNQVggQ29ubmVjdGlvbiAyNDAwbQorICogRGVidWcgbGV2ZWxzIGNvbnRyb2wgZmlsZSBmb3IgdGhlIGkyNDAwbS11c2IgbW9kdWxlCisgKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEludGVsIENvcnBvcmF0aW9uIDxsaW51eC13aW1heEBpbnRlbC5jb20+CisgKiBJbmFreSBQZXJlei1Hb256YWxleiA8aW5ha3kucGVyZXotZ29uemFsZXpAaW50ZWwuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworI2lmbmRlZiBfX2RlYnVnX2xldmVsc19faF9fCisjZGVmaW5lIF9fZGVidWdfbGV2ZWxzX19oX18KKworLyogTWF4aW11bSBjb21waWxlIGFuZCBydW4gdGltZSBkZWJ1ZyBsZXZlbCBmb3IgYWxsIHN1Ym1vZHVsZXMgKi8KKyNkZWZpbmUgRF9NT0RVTEVOQU1FIGkyNDAwbV91c2IKKyNkZWZpbmUgRF9NQVNURVIgQ09ORklHX1dJTUFYX0kyNDAwTV9ERUJVR19MRVZFTAorCisjaW5jbHVkZSA8bGludXgvd2ltYXgvZGVidWcuaD4KKworLyogTGlzdCBvZiBhbGwgdGhlIGVuYWJsZWQgbW9kdWxlcyAqLworZW51bSBkX21vZHVsZSB7CisJRF9TVUJNT0RVTEVfREVDTEFSRSh1c2IpLAorCURfU1VCTU9EVUxFX0RFQ0xBUkUoZncpLAorCURfU1VCTU9EVUxFX0RFQ0xBUkUobm90aWYpLAorCURfU1VCTU9EVUxFX0RFQ0xBUkUocngpLAorCURfU1VCTU9EVUxFX0RFQ0xBUkUodHgpLAorfTsKKworCisjZW5kaWYgLyogI2lmbmRlZiBfX2RlYnVnX2xldmVsc19faF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aW1heC9pMjQwMG0vdXNiLWZ3LmMgYi9kcml2ZXJzL25ldC93aW1heC9pMjQwMG0vdXNiLWZ3LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWFkMjg3YwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS91c2ItZncuYwpAQCAtMCwwICsxLDM0MCBAQAorLyoKKyAqIEludGVsIFdpcmVsZXNzIFdpTUFYIENvbm5lY3Rpb24gMjQwMG0KKyAqIEZpcm13YXJlIHVwbG9hZGVyJ3MgVVNCIHNwZWNpZmljcworICoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICAgZGlzdHJpYnV0aW9uLgorICogICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKgorICogSW50ZWwgQ29ycG9yYXRpb24gPGxpbnV4LXdpbWF4QGludGVsLmNvbT4KKyAqIFlhbmlyIEx1YmV0a2luIDx5YW5pcngubHViZXRraW5AaW50ZWwuY29tPgorICogSW5ha3kgUGVyZXotR29uemFsZXogPGluYWt5LnBlcmV6LWdvbnphbGV6QGludGVsLmNvbT4KKyAqICAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqCisgKiBJbmFreSBQZXJlei1Hb256YWxleiA8aW5ha3kucGVyZXotZ29uemFsZXpAaW50ZWwuY29tPgorICogIC0gYnVzIGdlbmVyaWMvc3BlY2lmaWMgc3BsaXQKKyAqCisgKiBUSEUgUFJPQ0VEVVJFCisgKgorICogU2VlIGZ3LmMgZm9yIHRoZSBnZW5lcmljIGRlc2NyaXB0aW9uIG9mIHRoaXMgcHJvY2VkdXJlLgorICoKKyAqIFRoaXMgZmlsZSBpbXBsZW1lbnRzIG9ubHkgdGhlIFVTQiBzcGVjaWZpY3MuIEl0IGJvaWxzIGRvd24gdG8gaG93CisgKiB0byBzZW5kIGEgY29tbWFuZCBhbmQgd2FpdGluZyBmb3IgYW4gYWNrbm93bGVkZ2VtZW50IGZyb20gdGhlCisgKiBkZXZpY2UuCisgKgorICogVGhpcyBjb2RlIChhbmQgcHJvY2VzcykgaXMgc2luZ2xlIHRocmVhZGVkLiBJdCBhc3N1bWVzIGl0IGlzIHRoZQorICogb25seSB0aHJlYWQgcG9raW5nIGFyb3VuZCAoZ3VhcmFudGVlZCBieSBmdy5jKS4KKyAqCisgKiBDT01NQU5EIEVYRUNVVElPTgorICoKKyAqIEEgd3JpdGUgVVJCIGlzIHBvc3RlZCB3aXRoIHRoZSBidWZmZXIgdG8gdGhlIGJ1bGsgb3V0cHV0IGVuZHBvaW50LgorICoKKyAqIEFDSyBSRUNFUFRJT04KKyAqCisgKiBXZSBqdXN0IHBvc3QgYSBVUkIgdG8gdGhlIG5vdGlmaWNhdGlvbiBlbmRwb2ludCBhbmQgd2FpdCBmb3IKKyAqIGRhdGEuIFdlIHJlcGVhdCB1bnRpbCB3ZSBnZXQgYWxsIHRoZSBkYXRhIHdlIGV4cGVjdCAoYXMgaW5kaWNhdGVkCisgKiBieSB0aGUgY2FsbCBmcm9tIHRoZSBidXMgZ2VuZXJpYyBjb2RlKS4KKyAqCisgKiBUaGUgZGF0YSBpcyBub3QgcmVhZCBmcm9tIHRoZSBidWxrIGluIGVuZHBvaW50IGZvciBib290IG1vZGUuCisgKgorICogUk9BRE1BUAorICoKKyAqIGkyNDAwbXVfYnVzX2JtX2NtZF9zZW5kCisgKiAgIGkyNDAwbV9ibV9jbWRfcHJlcGFyZS4uLgorICogICBpMjQwMG11X3R4X2J1bGtfb3V0CisgKgorICogaTI0MDBtdV9idXNfYm1fd2FpdF9mb3JfYWNrCisgKiAgIGkyNDAwbV9ub3RpZl9zdWJtaXQKKyAqLworI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorI2luY2x1ZGUgImkyNDAwbS11c2IuaCIKKworCisjZGVmaW5lIERfU1VCTU9EVUxFIGZ3CisjaW5jbHVkZSAidXNiLWRlYnVnLWxldmVscy5oIgorCisKKy8qCisgKiBTeW5jaHJvbm91cyB3cml0ZSB0byB0aGUgZGV2aWNlCisgKgorICogVGFrZXMgY2FyZSBvZiB1cGRhdGluZyBFREMgY291bnRzIGFuZCB0aHVzLCBoYW5kbGUgZGV2aWNlIGVycm9ycy4KKyAqLworc3RhdGljCitzc2l6ZV90IGkyNDAwbXVfdHhfYnVsa19vdXQoc3RydWN0IGkyNDAwbXUgKmkyNDAwbXUsIHZvaWQgKmJ1Ziwgc2l6ZV90IGJ1Zl9zaXplKQoreworCWludCByZXN1bHQ7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJmkyNDAwbXUtPnVzYl9pZmFjZS0+ZGV2OworCWludCBsZW47CisJc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplcGQ7CisJaW50IHBpcGUsIGRvX2F1dG9wbSA9IDE7CisKKwlyZXN1bHQgPSB1c2JfYXV0b3BtX2dldF9pbnRlcmZhY2UoaTI0MDBtdS0+dXNiX2lmYWNlKTsKKwlpZiAocmVzdWx0IDwgMCkgeworCQlkZXZfZXJyKGRldiwgIkJNLUNNRDogY2FuJ3QgZ2V0IGF1dG9wbTogJWRcbiIsIHJlc3VsdCk7CisJCWRvX2F1dG9wbSA9IDA7CisJfQorCWVwZCA9IHVzYl9nZXRfZXBkKGkyNDAwbXUtPnVzYl9pZmFjZSwgSTI0MDBNVV9FUF9CVUxLX09VVCk7CisJcGlwZSA9IHVzYl9zbmRidWxrcGlwZShpMjQwMG11LT51c2JfZGV2LCBlcGQtPmJFbmRwb2ludEFkZHJlc3MpOworcmV0cnk6CisJcmVzdWx0ID0gdXNiX2J1bGtfbXNnKGkyNDAwbXUtPnVzYl9kZXYsIHBpcGUsIGJ1ZiwgYnVmX3NpemUsICZsZW4sIEhaKTsKKwlzd2l0Y2ggKHJlc3VsdCkgeworCWNhc2UgMDoKKwkJaWYgKGxlbiAhPSBidWZfc2l6ZSkgeworCQkJZGV2X2VycihkZXYsICJCTS1DTUQ6IHNob3J0IHdyaXRlICgldSBCIHZzICV6dSAiCisJCQkJImV4cGVjdGVkKVxuIiwgbGVuLCBidWZfc2l6ZSk7CisJCQlyZXN1bHQgPSAtRUlPOworCQkJYnJlYWs7CisJCX0KKwkJcmVzdWx0ID0gbGVuOworCQlicmVhazsKKwljYXNlIC1FSU5WQUw6CQkJLyogd2hpbGUgcmVtb3ZpbmcgZHJpdmVyICovCisJY2FzZSAtRU5PREVWOgkJCS8qIGRldiBkaXNjb25uZWN0IC4uLiAqLworCWNhc2UgLUVOT0VOVDoJCQkvKiBqdXN0IGlnbm9yZSBpdCAqLworCWNhc2UgLUVTSFVURE9XTjoJCS8qIGFuZCBleGl0ICovCisJY2FzZSAtRUNPTk5SRVNFVDoKKwkJcmVzdWx0ID0gLUVTSFVURE9XTjsKKwkJYnJlYWs7CisJY2FzZSAtRVRJTUVET1VUOgkJCS8qIGJhaC4uLiAqLworCQlicmVhazsKKwlkZWZhdWx0OgkJCQkvKiBhbnkgb3RoZXI/ICovCisJCWlmIChlZGNfaW5jKCZpMjQwMG11LT51cmJfZWRjLAorCQkJICAgIEVEQ19NQVhfRVJST1JTLCBFRENfRVJST1JfVElNRUZSQU1FKSkgeworCQkJCWRldl9lcnIoZGV2LCAiQk0tQ01EOiBtYXhpbXVtIGVycm9ycyBpbiAiCisJCQkJCSJVUkIgZXhjZWVkZWQ7IHJlc2V0dGluZyBkZXZpY2VcbiIpOworCQkJCXVzYl9xdWV1ZV9yZXNldF9kZXZpY2UoaTI0MDBtdS0+dXNiX2lmYWNlKTsKKwkJCQlyZXN1bHQgPSAtRU5PREVWOworCQkJCWJyZWFrOworCQl9CisJCWRldl9lcnIoZGV2LCAiQk0tQ01EOiBVUkIgZXJyb3IgJWQsIHJldHJ5aW5nXG4iLAorCQkJcmVzdWx0KTsKKwkJZ290byByZXRyeTsKKwl9CisJcmVzdWx0ID0gbGVuOworCWlmIChkb19hdXRvcG0pCisJCXVzYl9hdXRvcG1fcHV0X2ludGVyZmFjZShpMjQwMG11LT51c2JfaWZhY2UpOworCXJldHVybiByZXN1bHQ7Cit9CisKKworLyoKKyAqIFNlbmQgYSBib290LW1vZGUgY29tbWFuZCBvdmVyIHRoZSBidWxrLW91dCBwaXBlCisgKgorICogQ29tbWFuZCBjYW4gYmUgYSByYXcgY29tbWFuZCwgd2hpY2ggcmVxdWlyZXMgbm8gcHJlcGFyYXRpb24gKGFuZAorICogd2hpY2ggbWlnaHQgbm90IGV2ZW4gYmUgZm9sbG93aW5nIHRoZSBjb21tYW5kIGZvcm1hdCkuIENoZWNrcyB0aGF0CisgKiB0aGUgcmlnaHQgYW1vdW50IG9mIGRhdGEgd2FzIHRyYW5zZmVyZWQuCisgKgorICogVG8gc2F0aXNmeSBVU0IgcmVxdWlyZW1lbnRzIChubyBvbnN0YWNrLCB2bWFsbG9jIG9yIGluIGRhdGEgc2VnbWVudAorICogYnVmZmVycyksIHdlIGNvcHkgdGhlIGNvbW1hbmQgdG8gaTI0MDBtLT5ibV9jbWRfYnVmIGFuZCBzZW5kIGl0IGZyb20KKyAqIHRoZXJlLgorICoKKyAqIEBmbGFnczogcGFzcyB0aHJ1IGZyb20gaTI0MDBtX2JtX2NtZCgpCisgKiBAcmV0dXJuOiBjbWRfc2l6ZSBpZiBvaywgPCAwIGVycm5vIGNvZGUgb24gZXJyb3IuCisgKi8KK3NzaXplX3QgaTI0MDBtdV9idXNfYm1fY21kX3NlbmQoc3RydWN0IGkyNDAwbSAqaTI0MDBtLAorCQkJCWNvbnN0IHN0cnVjdCBpMjQwMG1fYm9vdHJvbV9oZWFkZXIgKl9jbWQsCisJCQkJc2l6ZV90IGNtZF9zaXplLCBpbnQgZmxhZ3MpCit7CisJc3NpemVfdCByZXN1bHQ7CisJc3RydWN0IGRldmljZSAqZGV2ID0gaTI0MDBtX2RldihpMjQwMG0pOworCXN0cnVjdCBpMjQwMG11ICppMjQwMG11ID0gY29udGFpbmVyX29mKGkyNDAwbSwgc3RydWN0IGkyNDAwbXUsIGkyNDAwbSk7CisJaW50IG9wY29kZSA9IF9jbWQgPT0gTlVMTCA/IC0xIDogaTI0MDBtX2JyaF9nZXRfb3Bjb2RlKF9jbWQpOworCXN0cnVjdCBpMjQwMG1fYm9vdHJvbV9oZWFkZXIgKmNtZDsKKwlzaXplX3QgY21kX3NpemVfYSA9IEFMSUdOKGNtZF9zaXplLCAxNik7CS8qIFVTQiByZXN0cmljdGlvbiAqLworCisJZF9mbnN0YXJ0KDgsIGRldiwgIihpMjQwMG0gJXAgY21kICVwIHNpemUgJXp1KVxuIiwKKwkJICBpMjQwMG0sIF9jbWQsIGNtZF9zaXplKTsKKwlyZXN1bHQgPSAtRTJCSUc7CisJaWYgKGNtZF9zaXplID4gSTI0MDBNX0JNX0NNRF9CVUZfU0laRSkKKwkJZ290byBlcnJvcl90b29fYmlnOworCW1lbWNweShpMjQwMG0tPmJtX2NtZF9idWYsIF9jbWQsIGNtZF9zaXplKTsKKwljbWQgPSBpMjQwMG0tPmJtX2NtZF9idWY7CisJaWYgKGNtZF9zaXplX2EgPiBjbWRfc2l6ZSkJCQkvKiBaZXJvIHBhZCBzcGFjZSAqLworCQltZW1zZXQoaTI0MDBtLT5ibV9jbWRfYnVmICsgY21kX3NpemUsIDAsIGNtZF9zaXplX2EgLSBjbWRfc2l6ZSk7CisJaWYgKChmbGFncyAmIEkyNDAwTV9CTV9DTURfUkFXKSA9PSAwKSB7CisJCWlmIChXQVJOX09OKGkyNDAwbV9icmhfZ2V0X3Jlc3BvbnNlX3JlcXVpcmVkKGNtZCkgPT0gMCkpCisJCQlkZXZfd2FybihkZXYsICJTVyBCVUc6IHJlc3BvbnNlX3JlcXVpcmVkID09IDBcbiIpOworCQlpMjQwMG1fYm1fY21kX3ByZXBhcmUoY21kKTsKKwl9CisJcmVzdWx0ID0gaTI0MDBtdV90eF9idWxrX291dChpMjQwMG11LCBpMjQwMG0tPmJtX2NtZF9idWYsIGNtZF9zaXplKTsKKwlpZiAocmVzdWx0IDwgMCkgeworCQlkZXZfZXJyKGRldiwgImJvb3QtbW9kZSBjbWQgJWQ6IGNhbm5vdCBzZW5kOiAlemRcbiIsCisJCQlvcGNvZGUsIHJlc3VsdCk7CisJCWdvdG8gZXJyb3JfY21kX3NlbmQ7CisJfQorCWlmIChyZXN1bHQgIT0gY21kX3NpemUpIHsJCS8qIGFsbCB3YXMgdHJhbnNmZXJyZWQ/ICovCisJCWRldl9lcnIoZGV2LCAiYm9vdC1tb2RlIGNtZCAlZDogaW5jb21wbGV0ZSB0cmFuc2ZlciAiCisJCQkiKCV6dSB2cyAlenUgc3VibWl0dGVkKVxuIiwgIG9wY29kZSwgcmVzdWx0LCBjbWRfc2l6ZSk7CisJCXJlc3VsdCA9IC1FSU87CisJCWdvdG8gZXJyb3JfY21kX3NpemU7CisJfQorZXJyb3JfY21kX3NpemU6CitlcnJvcl9jbWRfc2VuZDoKK2Vycm9yX3Rvb19iaWc6CisJZF9mbmVuZCg4LCBkZXYsICIoaTI0MDBtICVwIGNtZCAlcCBzaXplICV6dSkgPSAlemRcbiIsCisJCWkyNDAwbSwgX2NtZCwgY21kX3NpemUsIHJlc3VsdCk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworCitzdGF0aWMKK3ZvaWQgX19pMjQwMG11X2JtX25vdGlmX2NiKHN0cnVjdCB1cmIgKnVyYikKK3sKKwljb21wbGV0ZSh1cmItPmNvbnRleHQpOworfQorCisKKy8qCisgKiBzdWJtaXQgYSByZWFkIHRvIHRoZSBub3RpZmljYXRpb24gZW5kcG9pbnQKKyAqCisgKiBAaTI0MDBtOiBkZXZpY2UgZGVzY3JpcHRvcgorICogQHVyYjogdXJiIHRvIHVzZQorICogQGNvbXBsZXRpb246IGNvbXBsZXRpb24gdmFyaWJsZSB0byBjb21wbGV0ZSB3aGVuIGRvbmUKKyAqCisgKiBEYXRhIGlzIGFsd2F5cyByZWFkIHRvIGkyNDAwbS0+Ym1fYWNrX2J1ZgorICovCitzdGF0aWMKK2ludCBpMjQwMG11X25vdGlmX3N1Ym1pdChzdHJ1Y3QgaTI0MDBtdSAqaTI0MDBtdSwgc3RydWN0IHVyYiAqdXJiLAorCQkJIHN0cnVjdCBjb21wbGV0aW9uICpjb21wbGV0aW9uKQoreworCXN0cnVjdCBpMjQwMG0gKmkyNDAwbSA9ICZpMjQwMG11LT5pMjQwMG07CisJc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplcGQ7CisJaW50IHBpcGU7CisKKwllcGQgPSB1c2JfZ2V0X2VwZChpMjQwMG11LT51c2JfaWZhY2UsIEkyNDAwTVVfRVBfTk9USUZJQ0FUSU9OKTsKKwlwaXBlID0gdXNiX3JjdmludHBpcGUoaTI0MDBtdS0+dXNiX2RldiwgZXBkLT5iRW5kcG9pbnRBZGRyZXNzKTsKKwl1c2JfZmlsbF9pbnRfdXJiKHVyYiwgaTI0MDBtdS0+dXNiX2RldiwgcGlwZSwKKwkJCSBpMjQwMG0tPmJtX2Fja19idWYsIEkyNDAwTV9CTV9BQ0tfQlVGX1NJWkUsCisJCQkgX19pMjQwMG11X2JtX25vdGlmX2NiLCBjb21wbGV0aW9uLAorCQkJIGVwZC0+YkludGVydmFsKTsKKwlyZXR1cm4gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfS0VSTkVMKTsKK30KKworCisvKgorICogUmVhZCBhbiBhY2sgZnJvbSAgdGhlIG5vdGlmaWNhdGlvbiBlbmRwb2ludAorICoKKyAqIEBpMjQwMG06CisgKiBAX2FjazogcG9pbnRlciB0byB3aGVyZSB0byBzdG9yZSB0aGUgcmVhZCBkYXRhCisgKiBAYWNrX3NpemU6IGhvdyBtYW55IGJ5dGVzIHdlIHNob3VsZCByZWFkCisgKgorICogUmV0dXJuczogPCAwIGVycm5vIGNvZGUgb24gZXJyb3I7IG90aGVyd2lzZSwgYW1vdW50IG9mIHJlY2VpdmVkIGJ5dGVzLgorICoKKyAqIFN1Ym1pdHMgYSBub3RpZmljYXRpb24gcmVhZCwgYXBwZW5kcyB0aGUgcmVhZCBkYXRhIHRvIHRoZSBnaXZlbiBhY2sKKyAqIGJ1ZmZlciBhbmQgdGhlbiByZXBlYXRzICh1bnRpbCBAYWNrX3NpemUgYnl0ZXMgaGF2ZSBiZWVuCisgKiByZWNlaXZlZCkuCisgKi8KK3NzaXplX3QgaTI0MDBtdV9idXNfYm1fd2FpdF9mb3JfYWNrKHN0cnVjdCBpMjQwMG0gKmkyNDAwbSwKKwkJCQkgICAgc3RydWN0IGkyNDAwbV9ib290cm9tX2hlYWRlciAqX2FjaywKKwkJCQkgICAgc2l6ZV90IGFja19zaXplKQoreworCXNzaXplX3QgcmVzdWx0ID0gLUVOT01FTTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBpMjQwMG1fZGV2KGkyNDAwbSk7CisJc3RydWN0IGkyNDAwbXUgKmkyNDAwbXUgPSBjb250YWluZXJfb2YoaTI0MDBtLCBzdHJ1Y3QgaTI0MDBtdSwgaTI0MDBtKTsKKwlzdHJ1Y3QgdXJiIG5vdGlmX3VyYjsKKwl2b2lkICphY2sgPSBfYWNrOworCXNpemVfdCBvZmZzZXQsIGxlbjsKKwlsb25nIHZhbDsKKwlpbnQgZG9fYXV0b3BtID0gMTsKKwlERUNMQVJFX0NPTVBMRVRJT05fT05TVEFDSyhub3RpZl9jb21wbGV0aW9uKTsKKworCWRfZm5zdGFydCg4LCBkZXYsICIoaTI0MDBtICVwIGFjayAlcCBzaXplICV6dSlcbiIsCisJCSAgaTI0MDBtLCBhY2ssIGFja19zaXplKTsKKwlCVUdfT04oX2FjayA9PSBpMjQwMG0tPmJtX2Fja19idWYpOworCXJlc3VsdCA9IHVzYl9hdXRvcG1fZ2V0X2ludGVyZmFjZShpMjQwMG11LT51c2JfaWZhY2UpOworCWlmIChyZXN1bHQgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAiQk0tQUNLOiBjYW4ndCBnZXQgYXV0b3BtOiAlZFxuIiwgKGludCkgcmVzdWx0KTsKKwkJZG9fYXV0b3BtID0gMDsKKwl9CisJdXNiX2luaXRfdXJiKCZub3RpZl91cmIpOwkvKiByZWFkeSBub3RpZmljYXRpb25zICovCisJdXNiX2dldF91cmIoJm5vdGlmX3VyYik7CisJb2Zmc2V0ID0gMDsKKwl3aGlsZSAob2Zmc2V0IDwgYWNrX3NpemUpIHsKKwkJaW5pdF9jb21wbGV0aW9uKCZub3RpZl9jb21wbGV0aW9uKTsKKwkJcmVzdWx0ID0gaTI0MDBtdV9ub3RpZl9zdWJtaXQoaTI0MDBtdSwgJm5vdGlmX3VyYiwKKwkJCQkJICAgICAgJm5vdGlmX2NvbXBsZXRpb24pOworCQlpZiAocmVzdWx0IDwgMCkKKwkJCWdvdG8gZXJyb3Jfbm90aWZfdXJiX3N1Ym1pdDsKKwkJdmFsID0gd2FpdF9mb3JfY29tcGxldGlvbl9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoCisJCQkmbm90aWZfY29tcGxldGlvbiwgSFopOworCQlpZiAodmFsID09IDApIHsKKwkJCXJlc3VsdCA9IC1FVElNRURPVVQ7CisJCQl1c2Jfa2lsbF91cmIoJm5vdGlmX3VyYik7CS8qIFRpbWVkb3V0ICovCisJCQlnb3RvIGVycm9yX25vdGlmX3dhaXQ7CisJCX0KKwkJaWYgKHZhbCA9PSAtRVJFU1RBUlRTWVMpIHsKKwkJCXJlc3VsdCA9IC1FSU5UUjsJCS8qIEludGVycnVwdGVkICovCisJCQl1c2Jfa2lsbF91cmIoJm5vdGlmX3VyYik7CisJCQlnb3RvIGVycm9yX25vdGlmX3dhaXQ7CisJCX0KKwkJcmVzdWx0ID0gbm90aWZfdXJiLnN0YXR1czsJCS8qIEhvdyB3YXMgdGhlIGFjaz8gKi8KKwkJc3dpdGNoIChyZXN1bHQpIHsKKwkJY2FzZSAwOgorCQkJYnJlYWs7CisJCWNhc2UgLUVJTlZBTDoJCQkvKiB3aGlsZSByZW1vdmluZyBkcml2ZXIgKi8KKwkJY2FzZSAtRU5PREVWOgkJCS8qIGRldiBkaXNjb25uZWN0IC4uLiAqLworCQljYXNlIC1FTk9FTlQ6CQkJLyoganVzdCBpZ25vcmUgaXQgKi8KKwkJY2FzZSAtRVNIVVRET1dOOgkJLyogYW5kIGV4aXQgKi8KKwkJY2FzZSAtRUNPTk5SRVNFVDoKKwkJCXJlc3VsdCA9IC1FU0hVVERPV047CisJCQlnb3RvIGVycm9yX2Rldl9nb25lOworCQlkZWZhdWx0OgkJCQkvKiBhbnkgb3RoZXI/ICovCisJCQl1c2Jfa2lsbF91cmIoJm5vdGlmX3VyYik7CS8qIFRpbWVkb3V0ICovCisJCQlpZiAoZWRjX2luYygmaTI0MDBtdS0+dXJiX2VkYywKKwkJCQkgICAgRURDX01BWF9FUlJPUlMsIEVEQ19FUlJPUl9USU1FRlJBTUUpKQorCQkJCWdvdG8gZXJyb3JfZXhjZWVkZWQ7CisJCQlkZXZfZXJyKGRldiwgIkJNLUFDSzogVVJCIGVycm9yICVkLCAiCisJCQkJInJldHJ5aW5nXG4iLCBub3RpZl91cmIuc3RhdHVzKTsKKwkJCWNvbnRpbnVlOwkvKiByZXRyeSAqLworCQl9CisJCWlmIChub3RpZl91cmIuYWN0dWFsX2xlbmd0aCA9PSAwKSB7CisJCQlkX3ByaW50Zig2LCBkZXYsICJaTFAgcmVjZWl2ZWQsIHJldHJ5aW5nXG4iKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCS8qIEdvdCBkYXRhLCBhcHBlbmQgaXQgdG8gdGhlIGJ1ZmZlciAqLworCQlsZW4gPSBtaW4oYWNrX3NpemUgLSBvZmZzZXQsIChzaXplX3QpIG5vdGlmX3VyYi5hY3R1YWxfbGVuZ3RoKTsKKwkJbWVtY3B5KGFjayArIG9mZnNldCwgaTI0MDBtLT5ibV9hY2tfYnVmLCBsZW4pOworCQlvZmZzZXQgKz0gbGVuOworCX0KKwlyZXN1bHQgPSBvZmZzZXQ7CitlcnJvcl9ub3RpZl91cmJfc3VibWl0OgorZXJyb3Jfbm90aWZfd2FpdDoKK2Vycm9yX2Rldl9nb25lOgorb3V0OgorCWlmIChkb19hdXRvcG0pCisJCXVzYl9hdXRvcG1fcHV0X2ludGVyZmFjZShpMjQwMG11LT51c2JfaWZhY2UpOworCWRfZm5lbmQoOCwgZGV2LCAiKGkyNDAwbSAlcCBhY2sgJXAgc2l6ZSAlenUpID0gJXpkXG4iLAorCQlpMjQwMG0sIGFjaywgYWNrX3NpemUsIHJlc3VsdCk7CisJcmV0dXJuIHJlc3VsdDsKKworZXJyb3JfZXhjZWVkZWQ6CisJZGV2X2VycihkZXYsICJibTogbWF4aW11bSBlcnJvcnMgaW4gbm90aWZpY2F0aW9uIFVSQiBleGNlZWRlZDsgIgorCQkicmVzZXR0aW5nIGRldmljZVxuIik7CisJdXNiX3F1ZXVlX3Jlc2V0X2RldmljZShpMjQwMG11LT51c2JfaWZhY2UpOworCWdvdG8gb3V0OworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2ltYXgvaTI0MDBtL3VzYi1ub3RpZi5jIGIvZHJpdmVycy9uZXQvd2ltYXgvaTI0MDBtL3VzYi1ub3RpZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3MDJjMjJiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2ltYXgvaTI0MDBtL3VzYi1ub3RpZi5jCkBAIC0wLDAgKzEsMjY5IEBACisvKgorICogSW50ZWwgV2lyZWxlc3MgV2lNQVggQ29ubmVjdGlvbiAyNDAwbSBvdmVyIFVTQgorICogTm90aWZpY2F0aW9uIGhhbmRsaW5nCisgKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgICBkaXN0cmlidXRpb24uCisgKiAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqCisgKiBJbnRlbCBDb3Jwb3JhdGlvbiA8bGludXgtd2ltYXhAaW50ZWwuY29tPgorICogWWFuaXIgTHViZXRraW4gPHlhbmlyeC5sdWJldGtpbkBpbnRlbC5jb20+CisgKiBJbmFreSBQZXJlei1Hb256YWxleiA8aW5ha3kucGVyZXotZ29uemFsZXpAaW50ZWwuY29tPgorICogIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICoKKyAqCisgKiBUaGUgbm90aWZpY2F0aW9uIGVuZHBvaW50IGlzIGFjdGl2ZSB3aGVuIHRoZSBkZXZpY2UgaXMgbm90IGluIGJvb3QKKyAqIG1vZGU7IGluIGhlcmUgd2UganVzdCByZWFkIGFuZCBnZXQgbm90aWZpY2F0aW9uczsgYmFzZWQgb24gdGhvc2UsCisgKiB3ZSBhY3QgdG8gZWl0aGVyIHJlaW5pdGlhbGl6ZSB0aGUgZGV2aWNlIGFmdGVyIGEgcmVib290IG9yIHRvCisgKiBzdWJtaXQgYSBSWCByZXF1ZXN0LgorICoKKyAqIFJPQURNQVAKKyAqCisgKiBpMjQwMG11X3VzYl9ub3RpZmljYXRpb25fc2V0dXAoKQorICoKKyAqIGkyNDAwbXVfdXNiX25vdGlmaWNhdGlvbl9yZWxlYXNlKCkKKyAqCisgKiBpMjQwMG11X3VzYl9ub3RpZmljYXRpb25fY2IoKQlDYWxsZWQgd2hlbiBhIFVSQiBpcyByZWFkeQorICogICBpMjQwMG11X25vdGlmX2dyb2soKQorICogICAgIGkyNDAwbV9kZXZfcmVzZXRfaGFuZGxlKCkKKyAqICAgICBpMjQwMG11X3J4X2tpY2soKQorICovCisjaW5jbHVkZSA8bGludXgvdXNiLmg+CisjaW5jbHVkZSAiaTI0MDBtLXVzYi5oIgorCisKKyNkZWZpbmUgRF9TVUJNT0RVTEUgbm90aWYKKyNpbmNsdWRlICJ1c2ItZGVidWctbGV2ZWxzLmgiCisKKworc3RhdGljIGNvbnN0CitfX2xlMzIgaTI0MDBtX1pFUk9fQkFSS0VSWzRdID0geyAwLCAwLCAwLCAwIH07CisKKworLyoKKyAqIFByb2Nlc3MgYSByZWNlaXZlZCBub3RpZmljYXRpb24KKyAqCisgKiBJbiBub3JtYWwgb3BlcmF0aW9uIG1vZGUsIHdlIGNhbiBvbmx5IHJlY2VpdmUgdHdvIHR5cGVzIG9mIHBheWxvYWRzCisgKiBvbiB0aGUgbm90aWZpY2F0aW9uIGVuZHBvaW50OgorICoKKyAqICAgLSBhIHJlYm9vdCBiYXJrZXIsIHdlIGRvIGEgYm9vdHN0cmFwICh0aGUgZGV2aWNlIGhhcyByZXNldGVkKS4KKyAqCisgKiAgIC0gYSBibG9jayBvZiB6ZXJvZXM6IHRoZXJlIGlzIHBlbmRpbmcgZGF0YSBpbiB0aGUgSU4gZW5kcG9pbnQKKyAqLworc3RhdGljCitpbnQgaTI0MDBtdV9ub3RpZmljYXRpb25fZ3JvayhzdHJ1Y3QgaTI0MDBtdSAqaTI0MDBtdSwgY29uc3Qgdm9pZCAqYnVmLAorCQkJCSBzaXplX3QgYnVmX2xlbikKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZpMjQwMG11LT51c2JfaWZhY2UtPmRldjsKKwlzdHJ1Y3QgaTI0MDBtICppMjQwMG0gPSAmaTI0MDBtdS0+aTI0MDBtOworCisJZF9mbnN0YXJ0KDQsIGRldiwgIihpMjQwMG0gJXAgYnVmICVwIGJ1Zl9sZW4gJXp1KVxuIiwKKwkJICBpMjQwMG11LCBidWYsIGJ1Zl9sZW4pOworCXJldCA9IC1FSU87CisJaWYgKGJ1Zl9sZW4gPCBzaXplb2YoaTI0MDBtX05CT09UX0JBUktFUikpCisJCS8qIE5vdCBhIGJ1ZywganVzdCBpZ25vcmUgKi8KKwkJZ290byBlcnJvcl9iYWRfc2l6ZTsKKwlpZiAoIW1lbWNtcChpMjQwMG1fTkJPT1RfQkFSS0VSLCBidWYsIHNpemVvZihpMjQwMG1fTkJPT1RfQkFSS0VSKSkKKwkgICAgfHwgIW1lbWNtcChpMjQwMG1fU0JPT1RfQkFSS0VSLCBidWYsIHNpemVvZihpMjQwMG1fU0JPT1RfQkFSS0VSKSkpCisJCXJldCA9IGkyNDAwbV9kZXZfcmVzZXRfaGFuZGxlKGkyNDAwbSk7CisJZWxzZSBpZiAoIW1lbWNtcChpMjQwMG1fWkVST19CQVJLRVIsIGJ1Ziwgc2l6ZW9mKGkyNDAwbV9aRVJPX0JBUktFUikpKSB7CisJCWkyNDAwbXVfcnhfa2ljayhpMjQwMG11KTsKKwkJcmV0ID0gMDsKKwl9IGVsc2UgewkvKiBVbmtub3duIG9yIHVuZXhwZWN0ZWQgZGF0YSBpbiB0aGUgbm90aWYgbWVzc2FnZSAqLworCQljaGFyIHByZWZpeFs2NF07CisJCXJldCA9IC1FSU87CisJCWRldl9lcnIoZGV2LCAiSFcgQlVHPyBVbmtub3duL3VuZXhwZWN0ZWQgZGF0YSBpbiBub3RpZmljYXRpb24gIgorCQkJIm1lc3NhZ2UgKCV6dSBieXRlcylcbiIsIGJ1Zl9sZW4pOworCQlzbnByaW50ZihwcmVmaXgsIHNpemVvZihwcmVmaXgpLCAiJXMgJXM6ICIsCisJCQkgZGV2X2RyaXZlcl9zdHJpbmcoZGV2KSAsIGRldi0+YnVzX2lkKTsKKwkJaWYgKGJ1Zl9sZW4gPiA2NCkgeworCQkJcHJpbnRfaGV4X2R1bXAoS0VSTl9FUlIsIHByZWZpeCwgRFVNUF9QUkVGSVhfT0ZGU0VULAorCQkJCSAgICAgICA4LCA0LCBidWYsIDY0LCAwKTsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXMuLi4gKG9ubHkgZmlyc3QgNjQgYnl0ZXMgIgorCQkJICAgICAgICJkdW1wZWQpXG4iLCBwcmVmaXgpOworCQl9IGVsc2UKKwkJCXByaW50X2hleF9kdW1wKEtFUk5fRVJSLCBwcmVmaXgsIERVTVBfUFJFRklYX09GRlNFVCwKKwkJCQkgICAgICAgOCwgNCwgYnVmLCBidWZfbGVuLCAwKTsKKwl9CitlcnJvcl9iYWRfc2l6ZToKKwlkX2ZuZW5kKDQsIGRldiwgIihpMjQwMG0gJXAgYnVmICVwIGJ1Zl9sZW4gJXp1KSA9ICVkXG4iLAorCQlpMjQwMG11LCBidWYsIGJ1Zl9sZW4sIHJldCk7CisJcmV0dXJuIHJldDsKK30KKworCisvKgorICogVVJCIGNhbGxiYWNrIGZvciB0aGUgbm90aWZpY2F0aW9uIGVuZHBvaW50CisgKgorICogQHVyYjogdGhlIHVyYiByZWNlaXZlZCBmcm9tIHRoZSBub3RpZmljYXRpb24gZW5kcG9pbnQKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwganVzdCBwcm9jZXNzIHRoZSBVU0Igc2lkZSBvZiB0aGUgdHJhbnNhY3Rpb24sCisgKiBjaGVja2luZyBldmVyeXRoaW5nIGlzIGZpbmUsIHBhc3MgdGhlIHByb2Nlc3NpbmcgdG8KKyAqIGkyNDAwbV9ub3RpZmljYXRpb25fZ3JvaygpIGFuZCByZXN1Ym1pdCB0aGUgVVJCLgorICovCitzdGF0aWMKK3ZvaWQgaTI0MDBtdV9ub3RpZmljYXRpb25fY2Ioc3RydWN0IHVyYiAqdXJiKQoreworCWludCByZXQ7CisJc3RydWN0IGkyNDAwbXUgKmkyNDAwbXUgPSB1cmItPmNvbnRleHQ7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJmkyNDAwbXUtPnVzYl9pZmFjZS0+ZGV2OworCisJZF9mbnN0YXJ0KDQsIGRldiwgIih1cmIgJXAgc3RhdHVzICVkIGFjdHVhbF9sZW5ndGggJWQpXG4iLAorCQkgIHVyYiwgdXJiLT5zdGF0dXMsIHVyYi0+YWN0dWFsX2xlbmd0aCk7CisJcmV0ID0gdXJiLT5zdGF0dXM7CisJc3dpdGNoIChyZXQpIHsKKwljYXNlIDA6CisJCXJldCA9IGkyNDAwbXVfbm90aWZpY2F0aW9uX2dyb2soaTI0MDBtdSwgdXJiLT50cmFuc2Zlcl9idWZmZXIsCisJCQkJCQl1cmItPmFjdHVhbF9sZW5ndGgpOworCQlpZiAocmV0ID09IC1FSU8gJiYgZWRjX2luYygmaTI0MDBtdS0+dXJiX2VkYywgRURDX01BWF9FUlJPUlMsCisJCQkJCSAgIEVEQ19FUlJPUl9USU1FRlJBTUUpKQorCQkJZ290byBlcnJvcl9leGNlZWRlZDsKKwkJaWYgKHJldCA9PSAtRU5PTUVNKQkvKiB1ZmYuLi5wb3dlciBjeWNsZT8gc2h1dGRvd24/ICovCisJCQlnb3RvIGVycm9yX2V4Y2VlZGVkOworCQlicmVhazsKKwljYXNlIC1FSU5WQUw6CQkJLyogd2hpbGUgcmVtb3ZpbmcgZHJpdmVyICovCisJY2FzZSAtRU5PREVWOgkJCS8qIGRldiBkaXNjb25uZWN0IC4uLiAqLworCWNhc2UgLUVOT0VOVDoJCQkvKiBkaXR0byAqLworCWNhc2UgLUVTSFVURE9XTjoJCS8qIFVSQiBraWxsZWQgKi8KKwljYXNlIC1FQ09OTlJFU0VUOgkJLyogZGlzY29ubmVjdGlvbiAqLworCQlnb3RvIG91dDsJCS8qIE5vdGlmeSBhcm91bmQgKi8KKwlkZWZhdWx0OgkJCS8qIFNvbWUgZXJyb3I/ICovCisJCWlmIChlZGNfaW5jKCZpMjQwMG11LT51cmJfZWRjLAorCQkJICAgIEVEQ19NQVhfRVJST1JTLCBFRENfRVJST1JfVElNRUZSQU1FKSkKKwkJCWdvdG8gZXJyb3JfZXhjZWVkZWQ7CisJCWRldl9lcnIoZGV2LCAibm90aWZpY2F0aW9uOiBVUkIgZXJyb3IgJWQsIHJldHJ5aW5nXG4iLAorCQkJdXJiLT5zdGF0dXMpOworCX0KKwl1c2JfbWFya19sYXN0X2J1c3koaTI0MDBtdS0+dXNiX2Rldik7CisJcmV0ID0gdXNiX3N1Ym1pdF91cmIoaTI0MDBtdS0+bm90aWZfdXJiLCBHRlBfQVRPTUlDKTsKKwlzd2l0Y2ggKHJldCkgeworCWNhc2UgMDoKKwljYXNlIC1FSU5WQUw6CQkJLyogd2hpbGUgcmVtb3ZpbmcgZHJpdmVyICovCisJY2FzZSAtRU5PREVWOgkJCS8qIGRldiBkaXNjb25uZWN0IC4uLiAqLworCWNhc2UgLUVOT0VOVDoJCQkvKiBkaXR0byAqLworCWNhc2UgLUVTSFVURE9XTjoJCS8qIFVSQiBraWxsZWQgKi8KKwljYXNlIC1FQ09OTlJFU0VUOgkJLyogZGlzY29ubmVjdGlvbiAqLworCQlicmVhazsJCQkvKiBqdXN0IGlnbm9yZSAqLworCWRlZmF1bHQ6CQkJLyogU29tZSBlcnJvcj8gKi8KKwkJZGV2X2VycihkZXYsICJub3RpZmljYXRpb246IGNhbm5vdCBzdWJtaXQgVVJCOiAlZFxuIiwgcmV0KTsKKwkJZ290byBlcnJvcl9zdWJtaXQ7CisJfQorCWRfZm5lbmQoNCwgZGV2LCAiKHVyYiAlcCBzdGF0dXMgJWQgYWN0dWFsX2xlbmd0aCAlZCkgPSB2b2lkXG4iLAorCQl1cmIsIHVyYi0+c3RhdHVzLCB1cmItPmFjdHVhbF9sZW5ndGgpOworCXJldHVybjsKKworZXJyb3JfZXhjZWVkZWQ6CisJZGV2X2VycihkZXYsICJtYXhpbXVtIGVycm9ycyBpbiBub3RpZmljYXRpb24gVVJCIGV4Y2VlZGVkOyAiCisJCSJyZXNldHRpbmcgZGV2aWNlXG4iKTsKK2Vycm9yX3N1Ym1pdDoKKwl1c2JfcXVldWVfcmVzZXRfZGV2aWNlKGkyNDAwbXUtPnVzYl9pZmFjZSk7CitvdXQ6CisJZF9mbmVuZCg0LCBkZXYsICIodXJiICVwIHN0YXR1cyAlZCBhY3R1YWxfbGVuZ3RoICVkKSA9IHZvaWRcbiIsCisJCXVyYiwgdXJiLT5zdGF0dXMsIHVyYi0+YWN0dWFsX2xlbmd0aCk7CisJcmV0dXJuOworfQorCisKKy8qCisgKiBzZXR1cCB0aGUgbm90aWZpY2F0aW9uIGVuZHBvaW50CisgKgorICogQGkyNDAwbTogZGV2aWNlIGRlc2NyaXB0b3IKKyAqCisgKiBUaGlzIHByb2NlZHVyZSBwcmVwYXJlcyB0aGUgbm90aWZpY2F0aW9uIHVyYiBhbmQgaGFuZGxlciBmb3IgcmVjZWl2aW5nCisgKiB1bnNvbGljaXRlZCBiYXJrZXJzIGZyb20gdGhlIGRldmljZS4KKyAqLworaW50IGkyNDAwbXVfbm90aWZpY2F0aW9uX3NldHVwKHN0cnVjdCBpMjQwMG11ICppMjQwMG11KQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZpMjQwMG11LT51c2JfaWZhY2UtPmRldjsKKwlpbnQgdXNiX3BpcGUsIHJldCA9IDA7CisJc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplcGQ7CisJY2hhciAqYnVmOworCisJZF9mbnN0YXJ0KDQsIGRldiwgIihpMjQwMG0gJXApXG4iLCBpMjQwMG11KTsKKwlidWYgPSBrbWFsbG9jKEkyNDAwTVVfTUFYX05PVElGSUNBVElPTl9MRU4sIEdGUF9LRVJORUwgfCBHRlBfRE1BKTsKKwlpZiAoYnVmID09IE5VTEwpIHsKKwkJZGV2X2VycihkZXYsICJub3RpZmljYXRpb246IGJ1ZmZlciBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3JfYnVmX2FsbG9jOworCX0KKworCWkyNDAwbXUtPm5vdGlmX3VyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7CisJaWYgKCFpMjQwMG11LT5ub3RpZl91cmIpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZGV2X2VycihkZXYsICJub3RpZmljYXRpb246IGNhbm5vdCBhbGxvY2F0ZSBVUkJcbiIpOworCQlnb3RvIGVycm9yX2FsbG9jX3VyYjsKKwl9CisJZXBkID0gdXNiX2dldF9lcGQoaTI0MDBtdS0+dXNiX2lmYWNlLCBJMjQwME1VX0VQX05PVElGSUNBVElPTik7CisJdXNiX3BpcGUgPSB1c2JfcmN2aW50cGlwZShpMjQwMG11LT51c2JfZGV2LCBlcGQtPmJFbmRwb2ludEFkZHJlc3MpOworCXVzYl9maWxsX2ludF91cmIoaTI0MDBtdS0+bm90aWZfdXJiLCBpMjQwMG11LT51c2JfZGV2LCB1c2JfcGlwZSwKKwkJCSBidWYsIEkyNDAwTVVfTUFYX05PVElGSUNBVElPTl9MRU4sCisJCQkgaTI0MDBtdV9ub3RpZmljYXRpb25fY2IsIGkyNDAwbXUsIGVwZC0+YkludGVydmFsKTsKKwlyZXQgPSB1c2Jfc3VibWl0X3VyYihpMjQwMG11LT5ub3RpZl91cmIsIEdGUF9LRVJORUwpOworCWlmIChyZXQgIT0gMCkgeworCQlkZXZfZXJyKGRldiwgIm5vdGlmaWNhdGlvbjogY2Fubm90IHN1Ym1pdCBVUkI6ICVkXG4iLCByZXQpOworCQlnb3RvIGVycm9yX3N1Ym1pdDsKKwl9CisJZF9mbmVuZCg0LCBkZXYsICIoaTI0MDBtICVwKSA9ICVkXG4iLCBpMjQwMG11LCByZXQpOworCXJldHVybiByZXQ7CisKK2Vycm9yX3N1Ym1pdDoKKwl1c2JfZnJlZV91cmIoaTI0MDBtdS0+bm90aWZfdXJiKTsKK2Vycm9yX2FsbG9jX3VyYjoKKwlrZnJlZShidWYpOworZXJyb3JfYnVmX2FsbG9jOgorCWRfZm5lbmQoNCwgZGV2LCAiKGkyNDAwbSAlcCkgPSAlZFxuIiwgaTI0MDBtdSwgcmV0KTsKKwlyZXR1cm4gcmV0OworfQorCisKKy8qCisgKiBUZWFyIGRvd24gb2YgdGhlIG5vdGlmaWNhdGlvbiBtZWNoYW5pc20KKyAqCisgKiBAaTI0MDBtOiBkZXZpY2UgZGVzY3JpcHRvcgorICoKKyAqIEtpbGwgdGhlIGludGVycnVwdCBlbmRwb2ludCB1cmIsIGZyZWUgYW55IGFsbG9jYXRlZCByZXNvdXJjZXMuCisgKgorICogV2UgbmVlZCB0byBjaGVjayBpZiB3ZSBoYXZlIGRvbmUgaXQgYmVmb3JlIGFzIGZvciBleGFtcGxlLAorICogX3N1c3BlbmQoKSBjYWxsIHRoaXM7IGlmIGFmdGVyIGEgc3VzcGVuZCgpIHdlIGdldCBhIF9kaXNjb25uZWN0KCkKKyAqIChhcyB0aGUgY2FzZSBpcyB3aGVuIGhpYmVybmF0aW5nKSwgbm90aGluZyBiYWQgaGFwcGVucy4KKyAqLwordm9pZCBpMjQwMG11X25vdGlmaWNhdGlvbl9yZWxlYXNlKHN0cnVjdCBpMjQwMG11ICppMjQwMG11KQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZpMjQwMG11LT51c2JfaWZhY2UtPmRldjsKKworCWRfZm5zdGFydCg0LCBkZXYsICIoaTI0MDBtdSAlcClcbiIsIGkyNDAwbXUpOworCWlmIChpMjQwMG11LT5ub3RpZl91cmIgIT0gTlVMTCkgeworCQl1c2Jfa2lsbF91cmIoaTI0MDBtdS0+bm90aWZfdXJiKTsKKwkJa2ZyZWUoaTI0MDBtdS0+bm90aWZfdXJiLT50cmFuc2Zlcl9idWZmZXIpOworCQl1c2JfZnJlZV91cmIoaTI0MDBtdS0+bm90aWZfdXJiKTsKKwkJaTI0MDBtdS0+bm90aWZfdXJiID0gTlVMTDsKKwl9CisJZF9mbmVuZCg0LCBkZXYsICIoaTI0MDBtdSAlcClcbiIsIGkyNDAwbXUpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2ltYXgvaTI0MDBtL3VzYi1yeC5jIGIvZHJpdmVycy9uZXQvd2ltYXgvaTI0MDBtL3VzYi1yeC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3NGNjMWYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aW1heC9pMjQwMG0vdXNiLXJ4LmMKQEAgLTAsMCArMSw0MTcgQEAKKy8qCisgKiBJbnRlbCBXaXJlbGVzcyBXaU1BWCBDb25uZWN0aW9uIDI0MDBtCisgKiBVU0IgUlggaGFuZGxpbmcKKyAqCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgIGRpc3RyaWJ1dGlvbi4KKyAqICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICoKKyAqIEludGVsIENvcnBvcmF0aW9uIDxsaW51eC13aW1heEBpbnRlbC5jb20+CisgKiBZYW5pciBMdWJldGtpbiA8eWFuaXJ4Lmx1YmV0a2luQGludGVsLmNvbT4KKyAqICAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqIEluYWt5IFBlcmV6LUdvbnphbGV6IDxpbmFreS5wZXJlei1nb256YWxlekBpbnRlbC5jb20+CisgKiAgLSBVc2Ugc2tiX2Nsb25lKCksIGJyZWFrIHVwIHByb2Nlc3NpbmcgaW4gY2h1bmtzCisgKiAgLSBTcGxpdCB0cmFuc3BvcnQvZGV2aWNlIHNwZWNpZmljCisgKiAgLSBNYWtlIGJ1ZmZlciBzaXplIGR5bmFtaWMgdG8gZXhlcnQgbGVzcyBtZW1vcnkgcHJlc3N1cmUKKyAqCisgKgorICogVGhpcyBoYW5kbGVzIHRoZSBSWCBwYXRoIG9uIFVTQi4KKyAqCisgKiBXaGVuIGEgbm90aWZpY2F0aW9uIGlzIHJlY2VpdmVkIHRoYXQgc2F5cyAndGhlcmUgaXMgUlggZGF0YSByZWFkeScsCisgKiB3ZSBjYWxsIGkyNDAwbXVfcnhfa2ljaygpOyB0aGF0IHdha2VzIHVwIHRoZSBSWCBrdGhyZWFkLCB3aGljaAorICogcmVhZHMgYSBidWZmZXIgZnJvbSBVU0IgYW5kIHBhc3NlcyBpdCB0byBpMjQwMG1fcngoKSBpbiB0aGUgZ2VuZXJpYworICogaGFuZGxpbmcgY29kZS4gVGhlIFJYIGJ1ZmZlciBoYXMgYW4gc3BlY2lmaWMgZm9ybWF0IHRoYXQgaXMKKyAqIGRlc2NyaWJlZCBpbiByeC5jLgorICoKKyAqIFdlIHVzZSBhIGtlcm5lbCB0aHJlYWQgaW4gYSBsb29wIGJlY2F1c2U6CisgKgorICogIC0gd2Ugd2FudCB0byBiZSBhYmxlIHRvIGNhbGwgdGhlIFVTQiBwb3dlciBtYW5hZ2VtZW50IGdldC9wdXQKKyAqICAgIGZ1bmN0aW9ucyAoYmxvY2tpbmcpIGJlZm9yZSBlYWNoIHRyYW5zYWN0aW9uLgorICoKKyAqICAtIFdlIG1pZ2h0IGdldCBhIGxvdCBvZiBub3RpZmljYXRpb25zIGFuZCB3ZSBkb24ndCB3YW50IHRvIHN1Ym1pdAorICogICAgYSB6aWxsaW9uIHJlYWRzOyBieSBzZXJpYWxpemluZywgd2UgYXJlIHRocm90dGxpbmcuCisgKgorICogIC0gUlggZGF0YSBwcm9jZXNzaW5nIGNhbiBnZXQgaGVhdnkgZW5vdWdoIHNvIHRoYXQgaXQgaXMgbm90CisgKiAgICBhcHByb3BpYXRlIGZvciBkb2luZyBpdCBpbiB0aGUgVVNCIGNhbGxiYWNrOyB0aHVzIHdlIHJ1biBpdCBpbiBhCisgKiAgICBwcm9jZXNzIGNvbnRleHQuCisgKgorICogV2UgcHJvdmlkZSBhIHJlYWQgYnVmZmVyIG9mIGFuIGFyYml0cmFyeSBzaXplIChzaG9ydCBvZiBhIHBhZ2UpOyBpZgorICogdGhlIGNhbGxiYWNrIHJlcG9ydHMgLUVPVkVSRkxPVywgaXQgbWVhbnMgaXQgd2FzIHRvbyBzbWFsbCwgc28gd2UKKyAqIGp1c3QgZG91YmxlIHRoZSBzaXplIGFuZCByZXRyeSAoYmVpbmcgY2FyZWZ1bCB0byBhcHBlbmQsIGFzCisgKiBzb21ldGltZXMgdGhlIGRldmljZSBwcm92aWRlZCBzb21lIGRhdGEpLiBFdmVyeSBub3cgYW5kIHRoZW4gd2UKKyAqIGNoZWNrIGlmIHRoZSBhdmVyYWdlIHBhY2tldCBzaXplIGlzIHNtYWxsZXIgdGhhbiB0aGUgY3VycmVudCBwYWNrZXQKKyAqIHNpemUgYW5kIGlmIHNvLCB3ZSBoYWx2ZSBpdC4gQXQgdGhlIGVuZCwgdGhlIHNpemUgb2YgdGhlCisgKiBwcmVhbGxvY2F0ZWQgYnVmZmVyIHNob3VsZCBiZSBmb2xsb3dpbmcgdGhlIGF2ZXJhZ2UgcmVjZWl2ZWQKKyAqIHRyYW5zYWN0aW9uIHNpemUsIGFkYXB0aW5nIGR5bmFtaWNhbGx5IHRvIGl0LgorICoKKyAqIFJPQURNQVAKKyAqCisgKiBpMjQwMG11X3J4X2tpY2soKQkJICAgQ2FsbGVkIGZyb20gbm90aWYuYyB3aGVuIHdlIGdldCBhCisgKiAgIAkJCSAgICAgICAgICAgJ2RhdGEgcmVhZHknIG5vdGlmaWNhdGlvbgorICogaTI0MDBtdV9yeGQoKSAgICAgICAgICAgICAgICAgICBLZXJuZWwgUlggZGFlbW9uCisgKiAgIGkyNDAwbXVfcngoKSAgICAgICAgICAgICAgICAgIFJlY2VpdmUgVVNCIGRhdGEKKyAqICAgaTI0MDBtX3J4KCkgICAgICAgICAgICAgICAgICAgU2VuZCBkYXRhIHRvIGdlbmVyaWMgaTI0MDBtIFJYIGhhbmRsaW5nCisgKgorICogaTI0MDBtdV9yeF9zZXR1cCgpICAgICAgICAgICAgICBjYWxsZWQgZnJvbSBpMjQwMG11X2J1c19kZXZfc3RhcnQoKQorICoKKyAqIGkyNDAwbXVfcnhfcmVsZWFzZSgpICAgICAgICAgICAgY2FsbGVkIGZyb20gaTI0MDBtdV9idXNfZGV2X3N0b3AoKQorICovCisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgvdXNiLmg+CisjaW5jbHVkZSAiaTI0MDBtLXVzYi5oIgorCisKKyNkZWZpbmUgRF9TVUJNT0RVTEUgcngKKyNpbmNsdWRlICJ1c2ItZGVidWctbGV2ZWxzLmgiCisKKy8qCisgKiBEeW5hbWljIFJYIHNpemUKKyAqCisgKiBXZSBjYW4ndCBsZXQgdGhlIHJ4X3NpemUgYmUgYSBtdWx0aXBsZSBvZiA1MTIgYnl0ZXMgKHRoZSBSWAorICogZW5kcG9pbnQncyBtYXggcGFja2V0IHNpemUpLiBPbiBzb21lIFVTQiBob3N0IGNvbnRyb2xsZXJzICh3ZQorICogaGF2ZW4ndCBiZWVuIGFibGUgdG8gZnVsbHkgY2hhcmFjdGVyaXplIHdoaWNoKSwgaWYgdGhlIGRldmljZSBpcworICogYWJvdXQgdG8gc2VuZCAoZm9yIGV4YW1wbGUpIFggYnl0ZXMgYW5kIHdlIG9ubHkgcG9zdCBhIGJ1ZmZlciB0bworICogcmVjZWl2ZSBuKjUxMiwgaXQgd2lsbCBmYWlsIHRvIG1hcmsgdGhhdCBhcyBiYWJibGUgKHNvIHRoYXQKKyAqIGkyNDAwbXVfcngoKSBbY2FzZSAtRU9WRVJGTE9XXSBjYW4gcmVzaXplIHRoZSBidWZmZXIgYW5kIGdldCB0aGUKKyAqIHJlc3QpLgorICoKKyAqIFNvIG9uIGdyb3dpbmcgb3Igc2hyaW5raW5nLCBpZiBpdCBpcyBhIG11bHRpcGxlIG9mIHRoZQorICogbWF4cGFja2V0c2l6ZSwgd2UgcmVtb3ZlIHNvbWUgKGluc3RlYWQgb2YgaW5jcmVzaW5nIHNvbWUsIHNvIGluIGEKKyAqIGJ1ZGR5IGFsbG9jYXRvciB3ZSB0cnkgdG8gd2FzdGUgbGVzcyBzcGFjZSkuCisgKgorICogTm90ZSB3ZSBhbHNvIG5lZWQgYSBob29rIGZvciB0aGlzIG9uIGkyNDAwbXVfcngoKSAtLSB3aGVuIHdlIGRvIHRoZQorICogZmlyc3QgcmVhZCwgd2UgYXJlIHN1cmUgd2Ugd29uJ3QgaGl0IHRoaXMgc3BvdCBiZWNhdXNlCisgKiBpMjQwbW0tPnJ4X3NpemUgaGFzIGJlZW4gc2V0IHByb3Blcmx5LiBIb3dldmVyLCBpZiB3ZSBoYXZlIHRvCisgKiBkb3VibGUgYmVjYXVzZSBvZiAtRU9WRVJGTE9XLCB3aGVuIHdlIGxhdW5jaCB0aGUgcmVhZCB0byBnZXQgdGhlCisgKiByZXN0IG9mIHRoZSBkYXRhLCB3ZSAqaGF2ZSogdG8gbWFrZSBzdXJlIHRoYXQgYWxzbyBpcyBub3QgYQorICogbXVsdGlwbGUgb2YgdGhlIG1heF9wa3Rfc2l6ZS4KKyAqLworCitzdGF0aWMKK3NpemVfdCBpMjQwMG11X3J4X3NpemVfZ3JvdyhzdHJ1Y3QgaTI0MDBtdSAqaTI0MDBtdSkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmaTI0MDBtdS0+dXNiX2lmYWNlLT5kZXY7CisJc2l6ZV90IHJ4X3NpemU7CisJY29uc3Qgc2l6ZV90IG1heF9wa3Rfc2l6ZSA9IDUxMjsKKworCXJ4X3NpemUgPSAyICogaTI0MDBtdS0+cnhfc2l6ZTsKKwlpZiAocnhfc2l6ZSAlIG1heF9wa3Rfc2l6ZSA9PSAwKSB7CisJCXJ4X3NpemUgLT0gODsKKwkJZF9wcmludGYoMSwgZGV2LAorCQkJICJSWDogZXhwZWN0ZWQgc2l6ZSBncmV3IHRvICV6dSBbYWRqdXN0ZWQgLThdICIKKwkJCSAiZnJvbSAlenVcbiIsCisJCQkgcnhfc2l6ZSwgaTI0MDBtdS0+cnhfc2l6ZSk7CisJfSBlbHNlCisJCWRfcHJpbnRmKDEsIGRldiwKKwkJCSAiUlg6IGV4cGVjdGVkIHNpemUgZ3JldyB0byAlenUgZnJvbSAlenVcbiIsCisJCQkgcnhfc2l6ZSwgaTI0MDBtdS0+cnhfc2l6ZSk7CisJcmV0dXJuIHJ4X3NpemU7Cit9CisKKworc3RhdGljCit2b2lkIGkyNDAwbXVfcnhfc2l6ZV9tYXliZV9zaHJpbmsoc3RydWN0IGkyNDAwbXUgKmkyNDAwbXUpCit7CisJY29uc3Qgc2l6ZV90IG1heF9wa3Rfc2l6ZSA9IDUxMjsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmaTI0MDBtdS0+dXNiX2lmYWNlLT5kZXY7CisKKwlpZiAodW5saWtlbHkoaTI0MDBtdS0+cnhfc2l6ZV9jbnQgPj0gMTAwCisJCSAgICAgJiYgaTI0MDBtdS0+cnhfc2l6ZV9hdXRvX3NocmluaykpIHsKKwkJc2l6ZV90IGF2Z19yeF9zaXplID0KKwkJCWkyNDAwbXUtPnJ4X3NpemVfYWNjIC8gaTI0MDBtdS0+cnhfc2l6ZV9jbnQ7CisJCXNpemVfdCBuZXdfcnhfc2l6ZSA9IGkyNDAwbXUtPnJ4X3NpemUgLyAyOworCQlpZiAoYXZnX3J4X3NpemUgPCBuZXdfcnhfc2l6ZSkgeworCQkJaWYgKG5ld19yeF9zaXplICUgbWF4X3BrdF9zaXplID09IDApIHsKKwkJCQluZXdfcnhfc2l6ZSAtPSA4OworCQkJCWRfcHJpbnRmKDEsIGRldiwKKwkJCQkJICJSWDogZXhwZWN0ZWQgc2l6ZSBzaHJhbmsgdG8gJXp1ICIKKwkJCQkJICJbYWRqdXN0ZWQgLThdIGZyb20gJXp1XG4iLAorCQkJCQkgbmV3X3J4X3NpemUsIGkyNDAwbXUtPnJ4X3NpemUpOworCQkJfSBlbHNlCisJCQkJZF9wcmludGYoMSwgZGV2LAorCQkJCQkgIlJYOiBleHBlY3RlZCBzaXplIHNocmFuayB0byAlenUgIgorCQkJCQkgImZyb20gJXp1XG4iLAorCQkJCQkgbmV3X3J4X3NpemUsIGkyNDAwbXUtPnJ4X3NpemUpOworCQkJaTI0MDBtdS0+cnhfc2l6ZSA9IG5ld19yeF9zaXplOworCQkJaTI0MDBtdS0+cnhfc2l6ZV9jbnQgPSAwOworCQkJaTI0MDBtdS0+cnhfc2l6ZV9hY2MgPSBpMjQwMG11LT5yeF9zaXplOworCQl9CisJfQorfQorCisvKgorICogUmVjZWl2ZSBhIG1lc3NhZ2Ugd2l0aCBwYXlsb2FkcyBmcm9tIHRoZSBVU0IgYnVzIGludG8gYW4gc2tiCisgKgorICogQGkyNDAwbXU6IFVTQiBkZXZpY2UgZGVzY3JpcHRvcgorICogQHJ4X3NrYjogc2tiIHdoZXJlIHRvIHBsYWNlIHRoZSByZWNlaXZlZCBtZXNzYWdlCisgKgorICogRGVhbHMgd2l0aCBhbGwgdGhlIFVTQi1zcGVjaWZpY3Mgb2YgcmVjZWl2aW5nLCBkeW5hbWljYWxseQorICogaW5jcmVhc2luZyB0aGUgYnVmZmVyIHNpemUgaWYgc28gbmVlZGVkLiBSZXR1cm5zIHRoZSBwYXlsb2FkIGluIHRoZQorICogc2tiLCByZWFkeSB0byBwcm9jZXNzLiBPbiBhIHplcm8tbGVuZ3RoIHBhY2tldCwgd2UgcmV0cnkuCisgKgorICogT24gc29mdCBVU0IgZXJyb3JzLCB3ZSByZXRyeSAodW50aWwgdGhleSBiZWNvbWUgdG9vIGZyZXF1ZW50IGFuZAorICogdGhlbiBhcmUgcHJvbW90ZWQgdG8gaGFyZCk7IG9uIGhhcmQgVVNCIGVycm9ycywgd2UgcmVzZXQgdGhlCisgKiBkZXZpY2UuIE9uIG90aGVyIGVycm9ycyAoc2tiIHJlYWxsb2FjYXRpb24sIHdlIGp1c3QgZHJvcCBpdCBhbmQKKyAqIGhvcGUgZm9yIHRoZSBuZXh0IGludm9jYXRpb24gdG8gc29sdmUgaXQpLgorICoKKyAqIFJldHVybnM6IHBvaW50ZXIgdG8gdGhlIHNrYiBpZiBvaywgRVJSX1BUUiBvbiBlcnJvci4KKyAqICAgTk9URTogdGhpcyBmdW5jdGlvbiBtaWdodCByZWFsbG9jIHRoZSBza2IgKGlmIGl0IGlzIHRvbyBzbWFsbCksCisgKiAgIHNvIGFsd2F5cyB1cGRhdGUgd2l0aCB0aGUgb25lIHJldHVybmVkLgorICogICBFUlJfUFRSKCkgaXMgPCAwIG9uIGVycm9yLgorICovCitzdGF0aWMKK3N0cnVjdCBza19idWZmICppMjQwMG11X3J4KHN0cnVjdCBpMjQwMG11ICppMjQwMG11LCBzdHJ1Y3Qgc2tfYnVmZiAqcnhfc2tiKQoreworCWludCByZXN1bHQgPSAwOworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZpMjQwMG11LT51c2JfaWZhY2UtPmRldjsKKwlpbnQgdXNiX3BpcGUsIHJlYWRfc2l6ZSwgcnhfc2l6ZSwgZG9fYXV0b3BtOworCXN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZXBkOworCWNvbnN0IHNpemVfdCBtYXhfcGt0X3NpemUgPSA1MTI7CisKKwlkX2Zuc3RhcnQoNCwgZGV2LCAiKGkyNDAwbXUgJXApXG4iLCBpMjQwMG11KTsKKwlkb19hdXRvcG0gPSBhdG9taWNfcmVhZCgmaTI0MDBtdS0+ZG9fYXV0b3BtKTsKKwlyZXN1bHQgPSBkb19hdXRvcG0gPworCQl1c2JfYXV0b3BtX2dldF9pbnRlcmZhY2UoaTI0MDBtdS0+dXNiX2lmYWNlKSA6IDA7CisJaWYgKHJlc3VsdCA8IDApIHsKKwkJZGV2X2VycihkZXYsICJSWDogY2FuJ3QgZ2V0IGF1dG9wbTogJWRcbiIsIHJlc3VsdCk7CisJCWRvX2F1dG9wbSA9IDA7CisJfQorCWVwZCA9IHVzYl9nZXRfZXBkKGkyNDAwbXUtPnVzYl9pZmFjZSwgSTI0MDBNVV9FUF9CVUxLX0lOKTsKKwl1c2JfcGlwZSA9IHVzYl9yY3ZidWxrcGlwZShpMjQwMG11LT51c2JfZGV2LCBlcGQtPmJFbmRwb2ludEFkZHJlc3MpOworcmV0cnk6CisJcnhfc2l6ZSA9IHNrYl9lbmRfcG9pbnRlcihyeF9za2IpIC0gcnhfc2tiLT5kYXRhIC0gcnhfc2tiLT5sZW47CisJaWYgKHVubGlrZWx5KHJ4X3NpemUgJSBtYXhfcGt0X3NpemUgPT0gMCkpIHsKKwkJcnhfc2l6ZSAtPSA4OworCQlkX3ByaW50ZigxLCBkZXYsICJSWDogcnhfc2l6ZSBhZGFwdGVkIHRvICVkIFstOF1cbiIsIHJ4X3NpemUpOworCX0KKwlyZXN1bHQgPSB1c2JfYnVsa19tc2coCisJCWkyNDAwbXUtPnVzYl9kZXYsIHVzYl9waXBlLCByeF9za2ItPmRhdGEgKyByeF9za2ItPmxlbiwKKwkJcnhfc2l6ZSwgJnJlYWRfc2l6ZSwgSFopOworCXVzYl9tYXJrX2xhc3RfYnVzeShpMjQwMG11LT51c2JfZGV2KTsKKwlzd2l0Y2ggKHJlc3VsdCkgeworCWNhc2UgMDoKKwkJaWYgKHJlYWRfc2l6ZSA9PSAwKQorCQkJZ290byByZXRyeTsJLyogWkxQLCBqdXN0IHJlc3VibWl0ICovCisJCXNrYl9wdXQocnhfc2tiLCByZWFkX3NpemUpOworCQlicmVhazsKKwljYXNlIC1FSU5WQUw6CQkJLyogd2hpbGUgcmVtb3ZpbmcgZHJpdmVyICovCisJY2FzZSAtRU5PREVWOgkJCS8qIGRldiBkaXNjb25uZWN0IC4uLiAqLworCWNhc2UgLUVOT0VOVDoJCQkvKiBqdXN0IGlnbm9yZSBpdCAqLworCWNhc2UgLUVTSFVURE9XTjoKKwljYXNlIC1FQ09OTlJFU0VUOgorCQlicmVhazsKKwljYXNlIC1FT1ZFUkZMT1c6IHsJCS8qIHRvbyBzbWFsbCwgcmVhbGxvY2F0ZSAqLworCQlzdHJ1Y3Qgc2tfYnVmZiAqbmV3X3NrYjsKKwkJcnhfc2l6ZSA9IGkyNDAwbXVfcnhfc2l6ZV9ncm93KGkyNDAwbXUpOworCQlpZiAocnhfc2l6ZSA8PSAoMSA8PCAxNikpCS8qIGNhcCBpdCAqLworCQkJaTI0MDBtdS0+cnhfc2l6ZSA9IHJ4X3NpemU7CisJCWVsc2UgaWYgKHByaW50a19yYXRlbGltaXQoKSkgeworCQkJZGV2X2VycihkZXYsICJCVUc/IHJ4X3NpemUgdXAgdG8gJWRcbiIsIHJ4X3NpemUpOworCQkJcmVzdWx0ID0gLUVJTlZBTDsKKwkJCWdvdG8gb3V0OworCQl9CisJCXNrYl9wdXQocnhfc2tiLCByZWFkX3NpemUpOworCQluZXdfc2tiID0gc2tiX2NvcHlfZXhwYW5kKHJ4X3NrYiwgMCwgcnhfc2l6ZSAtIHJ4X3NrYi0+bGVuLAorCQkJCQkgIEdGUF9LRVJORUwpOworCQlpZiAobmV3X3NrYiA9PSBOVUxMKSB7CisJCQlpZiAocHJpbnRrX3JhdGVsaW1pdCgpKQorCQkJCWRldl9lcnIoZGV2LCAiUlg6IENhbid0IHJlYWxsb2NhdGUgc2tiIHRvICVkOyAiCisJCQkJCSJSWCBkcm9wcGVkXG4iLCByeF9zaXplKTsKKwkJCWtmcmVlKHJ4X3NrYik7CisJCQlyZXN1bHQgPSAwOworCQkJZ290byBvdXQ7CS8qIGRyb3AgaXQuLi4qLworCQl9CisJCWtmcmVlX3NrYihyeF9za2IpOworCQlyeF9za2IgPSBuZXdfc2tiOworCQlpMjQwMG11LT5yeF9zaXplX2NudCA9IDA7CisJCWkyNDAwbXUtPnJ4X3NpemVfYWNjID0gaTI0MDBtdS0+cnhfc2l6ZTsKKwkJZF9wcmludGYoMSwgZGV2LCAiUlg6IHNpemUgY2hhbmdlZCB0byAlZCwgcmVjZWl2ZWQgJWQsICIKKwkJCSAiY29waWVkICVkLCBjYXBhY2l0eSAlbGRcbiIsCisJCQkgcnhfc2l6ZSwgcmVhZF9zaXplLCByeF9za2ItPmxlbiwKKwkJCSAobG9uZykgKHNrYl9lbmRfcG9pbnRlcihuZXdfc2tiKSAtIG5ld19za2ItPmhlYWQpKTsKKwkJZ290byByZXRyeTsKKwl9CisJCS8qIEluIG1vc3QgY2FzZXMsIGl0IGhhcHBlbnMgZHVlIHRvIHRoZSBoYXJkd2FyZSBzY2hlZHVsaW5nIGEKKwkJICogcmVhZCB3aGVuIHRoZXJlIHdhcyBubyBkYXRhIC0gdW5mb3J0dW5hdGVseSwgd2UgaGF2ZSBubyB3YXkKKwkJICogdG8gdGVsbCB0aGlzIHRpbWVvdXQgZnJvbSBhIFVTQiB0aW1lb3V0LiBTbyB3ZSBqdXN0IGlnbm9yZQorCQkgKiBpdC4gKi8KKwljYXNlIC1FVElNRURPVVQ6CisJCWRldl9lcnIoZGV2LCAiUlg6IHRpbWVvdXQ6ICVkXG4iLCByZXN1bHQpOworCQlyZXN1bHQgPSAwOworCQlicmVhazsKKwlkZWZhdWx0OgkJCS8qIEFueSBlcnJvciAqLworCQlpZiAoZWRjX2luYygmaTI0MDBtdS0+dXJiX2VkYywKKwkJCSAgICBFRENfTUFYX0VSUk9SUywgRURDX0VSUk9SX1RJTUVGUkFNRSkpCisJCQlnb3RvIGVycm9yX3Jlc2V0OworCQlkZXZfZXJyKGRldiwgIlJYOiBlcnJvciByZWNlaXZpbmcgVVJCOiAlZCwgcmV0cnlpbmdcbiIsIHJlc3VsdCk7CisJCWdvdG8gcmV0cnk7CisJfQorb3V0OgorCWlmIChkb19hdXRvcG0pCisJCXVzYl9hdXRvcG1fcHV0X2ludGVyZmFjZShpMjQwMG11LT51c2JfaWZhY2UpOworCWRfZm5lbmQoNCwgZGV2LCAiKGkyNDAwbXUgJXApID0gJXBcbiIsIGkyNDAwbXUsIHJ4X3NrYik7CisJcmV0dXJuIHJ4X3NrYjsKKworZXJyb3JfcmVzZXQ6CisJZGV2X2VycihkZXYsICJSWDogbWF4aW11bSBlcnJvcnMgaW4gVVJCIGV4Y2VlZGVkOyAiCisJCSJyZXNldHRpbmcgZGV2aWNlXG4iKTsKKwl1c2JfcXVldWVfcmVzZXRfZGV2aWNlKGkyNDAwbXUtPnVzYl9pZmFjZSk7CisJcnhfc2tiID0gRVJSX1BUUihyZXN1bHQpOworCWdvdG8gb3V0OworfQorCisKKy8qCisgKiBLZXJuZWwgdGhyZWFkIGZvciBVU0IgcmVjZXB0aW9uIG9mIGRhdGEKKyAqCisgKiBUaGlzIHRocmVhZCB3YWl0cyBmb3IgYSBraWNrOyBvbmNlIGtpY2tlZCwgaXQgd2lsbCBhbGxvY2F0ZSBhbiBza2IKKyAqIGFuZCByZWNlaXZlIGEgc2luZ2xlIG1lc3NhZ2UgdG8gaXQgZnJvbSBVU0IgKHVzaW5nCisgKiBpMjQwMG11X3J4KCkpLiBPbmNlIHJlY2VpdmVkLCBpdCBpcyBwYXNzZWQgdG8gdGhlIGdlbmVyaWMgaTI0MDBtIFJYCisgKiBjb2RlIGZvciBwcm9jZXNzaW5nLgorICoKKyAqIFdoZW4gZG9uZSBwcm9jZXNzaW5nLCBpdCBydW5zIHNvbWUgZGlydHkgc3RhdGlzdGljcyB0byB2ZXJpZnkgaWYKKyAqIHRoZSBsYXN0IDEwMCBtZXNzYWdlcyByZWNlaXZlZCB3ZXJlIHNtYWxsZXIgdGhhbiBoYWxmIG9mIHRoZQorICogY3VycmVudCBSWCBidWZmZXIgc2l6ZS4gSW4gdGhhdCBjYXNlLCB0aGUgUlggYnVmZmVyIHNpemUgaXMKKyAqIGhhbHZlZC4gVGhpcyB3aWxsIGhlbHBzIGxvd2VyaW5nIHRoZSBwcmVzc3VyZSBvbiB0aGUgbWVtb3J5CisgKiBhbGxvY2F0b3IuCisgKgorICogSGFyZCBlcnJvcnMgZm9yY2UgdGhlIHRocmVhZCB0byBleGl0LgorICovCitzdGF0aWMKK2ludCBpMjQwMG11X3J4ZCh2b2lkICpfaTI0MDBtdSkKK3sKKwlpbnQgcmVzdWx0ID0gMDsKKwlzdHJ1Y3QgaTI0MDBtdSAqaTI0MDBtdSA9IF9pMjQwMG11OworCXN0cnVjdCBpMjQwMG0gKmkyNDAwbSA9ICZpMjQwMG11LT5pMjQwMG07CisJc3RydWN0IGRldmljZSAqZGV2ID0gJmkyNDAwbXUtPnVzYl9pZmFjZS0+ZGV2OworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2ID0gaTI0MDBtLT53aW1heF9kZXYubmV0X2RldjsKKwlzaXplX3QgcGVuZGluZzsKKwlpbnQgcnhfc2l6ZTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqcnhfc2tiOworCisJZF9mbnN0YXJ0KDQsIGRldiwgIihpMjQwMG11ICVwKVxuIiwgaTI0MDBtdSk7CisJd2hpbGUgKDEpIHsKKwkJZF9wcmludGYoMiwgZGV2LCAiVFg6IHdhaXRpbmcgZm9yIG1lc3NhZ2VzXG4iKTsKKwkJcGVuZGluZyA9IDA7CisJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZSgKKwkJCWkyNDAwbXUtPnJ4X3dxLAorCQkJKGt0aHJlYWRfc2hvdWxkX3N0b3AoKQkvKiBjaGVjayB0aGlzIGZpcnN0ISAqLworCQkJIHx8IChwZW5kaW5nID0gYXRvbWljX3JlYWQoJmkyNDAwbXUtPnJ4X3BlbmRpbmdfY291bnQpKSkKKwkJCSk7CisJCWlmIChrdGhyZWFkX3Nob3VsZF9zdG9wKCkpCisJCQlicmVhazsKKwkJaWYgKHBlbmRpbmcgPT0gMCkKKwkJCWNvbnRpbnVlOworCQlyeF9zaXplID0gaTI0MDBtdS0+cnhfc2l6ZTsKKwkJZF9wcmludGYoMiwgZGV2LCAiUlg6IHJlYWRpbmcgdXAgdG8gJWQgYnl0ZXNcbiIsIHJ4X3NpemUpOworCQlyeF9za2IgPSBfX25ldGRldl9hbGxvY19za2IobmV0X2Rldiwgcnhfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJCWlmIChyeF9za2IgPT0gTlVMTCkgeworCQkJZGV2X2VycihkZXYsICJSWDogY2FuJ3QgYWxsb2NhdGUgc2tiIFslZCBieXRlc11cbiIsCisJCQkJcnhfc2l6ZSk7CisJCQltc2xlZXAoNTApOwkvKiBnaXZlIGl0IHNvbWUgdGltZT8gKi8KKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogUmVjZWl2ZSB0aGUgbWVzc2FnZSB3aXRoIHRoZSBwYXlsb2FkcyAqLworCQlyeF9za2IgPSBpMjQwMG11X3J4KGkyNDAwbXUsIHJ4X3NrYik7CisJCXJlc3VsdCA9IFBUUl9FUlIocnhfc2tiKTsKKwkJaWYgKElTX0VSUihyeF9za2IpKQorCQkJZ290byBvdXQ7CisJCWF0b21pY19kZWMoJmkyNDAwbXUtPnJ4X3BlbmRpbmdfY291bnQpOworCQlpZiAocnhfc2tiLT5sZW4gPT0gMCkgewkvKiBzb21lIGlnbm9yYWJsZSBjb25kaXRpb24gKi8KKwkJCWtmcmVlX3NrYihyeF9za2IpOworCQkJY29udGludWU7CisJCX0KKworCQkvKiBEZWxpdmVyIHRoZSBtZXNzYWdlIHRvIHRoZSBnZW5lcmljIGkyNDAwbSBjb2RlICovCisJCWkyNDAwbXUtPnJ4X3NpemVfY250Kys7CisJCWkyNDAwbXUtPnJ4X3NpemVfYWNjICs9IHJ4X3NrYi0+bGVuOworCQlyZXN1bHQgPSBpMjQwMG1fcngoaTI0MDBtLCByeF9za2IpOworCQlpZiAocmVzdWx0ID09IC1FSU8KKwkJICAgICYmIGVkY19pbmMoJmkyNDAwbXUtPnVyYl9lZGMsCisJCQkgICAgICAgRURDX01BWF9FUlJPUlMsIEVEQ19FUlJPUl9USU1FRlJBTUUpKSB7CisJCQlnb3RvIGVycm9yX3Jlc2V0OworCQl9CisKKwkJLyogTWF5YmUgYWRqdXN0IFJYIGJ1ZmZlciBzaXplICovCisJCWkyNDAwbXVfcnhfc2l6ZV9tYXliZV9zaHJpbmsoaTI0MDBtdSk7CisJfQorCXJlc3VsdCA9IDA7CitvdXQ6CisJZF9mbmVuZCg0LCBkZXYsICIoaTI0MDBtdSAlcCkgPSAlZFxuIiwgaTI0MDBtdSwgcmVzdWx0KTsKKwlyZXR1cm4gcmVzdWx0OworCitlcnJvcl9yZXNldDoKKwlkZXZfZXJyKGRldiwgIlJYOiBtYXhpbXVtIGVycm9ycyBpbiByZWNlaXZlZCBidWZmZXIgZXhjZWVkZWQ7ICIKKwkJInJlc2V0dGluZyBkZXZpY2VcbiIpOworCXVzYl9xdWV1ZV9yZXNldF9kZXZpY2UoaTI0MDBtdS0+dXNiX2lmYWNlKTsKKwlnb3RvIG91dDsKK30KKworCisvKgorICogU3RhcnQgcmVhZGluZyBmcm9tIHRoZSBkZXZpY2UKKyAqCisgKiBAaTI0MDBtOiBkZXZpY2UgaW5zdGFuY2UKKyAqCisgKiBOb3RpZnkgdGhlIFJYIHRocmVhZCB0aGF0IHRoZXJlIGlzIGRhdGEgcGVuZGluZy4KKyAqLwordm9pZCBpMjQwMG11X3J4X2tpY2soc3RydWN0IGkyNDAwbXUgKmkyNDAwbXUpCit7CisJc3RydWN0IGkyNDAwbSAqaTI0MDBtID0gJmkyNDAwbXUtPmkyNDAwbTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmaTI0MDBtdS0+dXNiX2lmYWNlLT5kZXY7CisKKwlkX2Zuc3RhcnQoMywgZGV2LCAiKGkyNDAwbXUgJXApXG4iLCBpMjQwMG0pOworCWF0b21pY19pbmMoJmkyNDAwbXUtPnJ4X3BlbmRpbmdfY291bnQpOworCXdha2VfdXBfYWxsKCZpMjQwMG11LT5yeF93cSk7CisJZF9mbmVuZCgzLCBkZXYsICIoaTI0MDBtICVwKSA9IHZvaWRcbiIsIGkyNDAwbSk7Cit9CisKKworaW50IGkyNDAwbXVfcnhfc2V0dXAoc3RydWN0IGkyNDAwbXUgKmkyNDAwbXUpCit7CisJaW50IHJlc3VsdCA9IDA7CisJc3RydWN0IGkyNDAwbSAqaTI0MDBtID0gJmkyNDAwbXUtPmkyNDAwbTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmaTI0MDBtdS0+dXNiX2lmYWNlLT5kZXY7CisJc3RydWN0IHdpbWF4X2RldiAqd2ltYXhfZGV2ID0gJmkyNDAwbS0+d2ltYXhfZGV2OworCisJaTI0MDBtdS0+cnhfa3RocmVhZCA9IGt0aHJlYWRfcnVuKGkyNDAwbXVfcnhkLCBpMjQwMG11LCAiJXMtcngiLAorCQkJCQkgIHdpbWF4X2Rldi0+bmFtZSk7CisJaWYgKElTX0VSUihpMjQwMG11LT5yeF9rdGhyZWFkKSkgeworCQlyZXN1bHQgPSBQVFJfRVJSKGkyNDAwbXUtPnJ4X2t0aHJlYWQpOworCQlkZXZfZXJyKGRldiwgIlJYOiBjYW5ub3Qgc3RhcnQgdGhyZWFkOiAlZFxuIiwgcmVzdWx0KTsKKwl9CisJcmV0dXJuIHJlc3VsdDsKK30KKwordm9pZCBpMjQwMG11X3J4X3JlbGVhc2Uoc3RydWN0IGkyNDAwbXUgKmkyNDAwbXUpCit7CisJa3RocmVhZF9zdG9wKGkyNDAwbXUtPnJ4X2t0aHJlYWQpOworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aW1heC9pMjQwMG0vdXNiLXR4LmMgYi9kcml2ZXJzL25ldC93aW1heC9pMjQwMG0vdXNiLXR4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGZkODkzMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS91c2ItdHguYwpAQCAtMCwwICsxLDIyOSBAQAorLyoKKyAqIEludGVsIFdpcmVsZXNzIFdpTUFYIENvbm5lY3Rpb24gMjQwMG0KKyAqIFVTQiBzcGVjaWZpYyBUWCBoYW5kbGluZworICoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICAgZGlzdHJpYnV0aW9uLgorICogICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKgorICogSW50ZWwgQ29ycG9yYXRpb24gPGxpbnV4LXdpbWF4QGludGVsLmNvbT4KKyAqIFlhbmlyIEx1YmV0a2luIDx5YW5pcngubHViZXRraW5AaW50ZWwuY29tPgorICogIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICogSW5ha3kgUGVyZXotR29uemFsZXogPGluYWt5LnBlcmV6LWdvbnphbGV6QGludGVsLmNvbT4KKyAqICAtIFNwbGl0IHRyYW5zcG9ydC9kZXZpY2Ugc3BlY2lmaWMKKyAqCisgKgorICogVGFrZXMgdGhlIFRYIG1lc3NhZ2VzIGluIHRoZSBpMjQwMG0ncyBkcml2ZXIgVFggRklGTyBhbmQgc2VuZHMgdGhlbQorICogdG8gdGhlIGRldmljZSB1bnRpbCB0aGVyZSBhcmUgbm8gbW9yZS4KKyAqCisgKiBJZiB3ZSBmYWlsIHNlbmRpbmcgdGhlIG1lc3NhZ2UsIHdlIGp1c3QgZHJvcCBpdC4gVGhlcmUgaXNuJ3QgbXVjaAorICogd2UgY2FuIGRvIGF0IHRoaXMgcG9pbnQuIFdlIGNvdWxkIGFsc28gcmV0cnksIGJ1dCB0aGUgVVNCIHN0YWNrIGhhcworICogYWxyZWFkeSByZXRyaWVkIGFuZCBzdGlsbCBmYWlsZWQsIHNvIHRoZXJlIGlzIG5vdCBtdWNoIG9mIGEKKyAqIHBvaW50LiBBcyB3ZWxsLCBtb3N0IG9mIHRoZSB0cmFmZmljIGlzIG5ldHdvcmssIHdoaWNoIGhhcyByZWNvdmVyeQorICogbWV0aG9kcyBmb3IgZHJvcHBlZCBwYWNrZXRzLgorICoKKyAqIEZvciBzZW5kaW5nIHdlIGp1c3Qgb2J0YWluIGEgRklGTyBidWZmZXIgdG8gc2VuZCwgc2VuZCBpdCB0byB0aGUKKyAqIFVTQiBidWxrIG91dCwgdGVsbCB0aGUgVFggRklGTyBjb2RlIHdlIGhhdmUgc2VudCBpdDsgcXVlcnkgZm9yCisgKiBhbm90aGVyIG9uZSwgZXRjLi4uIHVudGlsIGRvbmUuCisgKgorICogV2UgdXNlIGEgdGhyZWFkIHNvIHdlIGNhbiBjYWxsIHVzYl9hdXRvcG1fZW5hYmxlKCkgYW5kCisgKiB1c2JfYXV0b3BtX2Rpc2FibGUoKSBmb3IgZWFjaCB0cmFuc2FjdGlvbjsgdGhpcyB3YXkgd2hlbiB0aGUgZGV2aWNlCisgKiBnb2VzIGlkbGUsIGl0IHdpbGwgc3VzcGVuZC4gSXQgYWxzbyBoYXMgbGVzcyBvdmVyaGVhZCB0aGFuIGEKKyAqIGRlZGljYXRlZCB3b3JrcXVldWUsIGFzIGl0IGlzIGJlaW5nIHVzZWQgZm9yIGEgc2luZ2xlIHRhc2suCisgKgorICogUk9BRE1BUAorICoKKyAqIGkyNDAwbXVfdHhfc2V0dXAoKQorICogaTI0MDBtdV90eF9yZWxlYXNlKCkKKyAqCisgKiBpMjQwMG11X2J1c190eF9raWNrKCkJLSBDYWxsZWQgYnkgdGhlIHR4LmMgY29kZSB3aGVuIHRoZXJlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgbmV3IGRhdGEgaW4gdGhlIEZJRk8uCisgKiBpMjQwMG11X3R4ZCgpCisgKiAgIGkyNDAwbV90eF9tc2dfZ2V0KCkKKyAqICAgaTI0MDBtX3R4X21zZ19zZW50KCkKKyAqLworI2luY2x1ZGUgImkyNDAwbS11c2IuaCIKKworCisjZGVmaW5lIERfU1VCTU9EVUxFIHR4CisjaW5jbHVkZSAidXNiLWRlYnVnLWxldmVscy5oIgorCisKKy8qCisgKiBHZXQgdGhlIG5leHQgVFggbWVzc2FnZSBpbiB0aGUgVFggRklGTyBhbmQgc2VuZCBpdCB0byB0aGUgZGV2aWNlCisgKgorICogTm90ZSB0aGF0IGFueSBpdGVyYXRpb24gY29uc3VtZXMgYSBtZXNzYWdlIHRvIGJlIHNlbnQsIG5vIG1hdHRlciBpZgorICogaXQgc3VjY2VlZHMgb3IgZmFpbHMgKHdlIGhhdmUgbm8gcmVhbCB3YXkgdG8gcmV0cnkgb3IgY29tcGxhaW4pLgorICoKKyAqIFJldHVybjogMCBpZiBvaywgPCAwIGVycm5vIGNvZGUgb24gaGFyZCBlcnJvci4KKyAqLworc3RhdGljCitpbnQgaTI0MDBtdV90eChzdHJ1Y3QgaTI0MDBtdSAqaTI0MDBtdSwgc3RydWN0IGkyNDAwbV9tc2dfaGRyICp0eF9tc2csCisJICAgICAgIHNpemVfdCB0eF9tc2dfc2l6ZSkKK3sKKwlpbnQgcmVzdWx0ID0gMDsKKwlzdHJ1Y3QgaTI0MDBtICppMjQwMG0gPSAmaTI0MDBtdS0+aTI0MDBtOworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZpMjQwMG11LT51c2JfaWZhY2UtPmRldjsKKwlpbnQgdXNiX3BpcGUsIHNlbnRfc2l6ZSwgZG9fYXV0b3BtOworCXN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZXBkOworCisJZF9mbnN0YXJ0KDQsIGRldiwgIihpMjQwMG11ICVwKVxuIiwgaTI0MDBtdSk7CisJZG9fYXV0b3BtID0gYXRvbWljX3JlYWQoJmkyNDAwbXUtPmRvX2F1dG9wbSk7CisJcmVzdWx0ID0gZG9fYXV0b3BtID8KKwkJdXNiX2F1dG9wbV9nZXRfaW50ZXJmYWNlKGkyNDAwbXUtPnVzYl9pZmFjZSkgOiAwOworCWlmIChyZXN1bHQgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAiVFg6IGNhbid0IGdldCBhdXRvcG06ICVkXG4iLCByZXN1bHQpOworCQlkb19hdXRvcG0gPSAwOworCX0KKwllcGQgPSB1c2JfZ2V0X2VwZChpMjQwMG11LT51c2JfaWZhY2UsIEkyNDAwTVVfRVBfQlVMS19PVVQpOworCXVzYl9waXBlID0gdXNiX3NuZGJ1bGtwaXBlKGkyNDAwbXUtPnVzYl9kZXYsIGVwZC0+YkVuZHBvaW50QWRkcmVzcyk7CityZXRyeToKKwlyZXN1bHQgPSB1c2JfYnVsa19tc2coaTI0MDBtdS0+dXNiX2RldiwgdXNiX3BpcGUsCisJCQkgICAgICB0eF9tc2csIHR4X21zZ19zaXplLCAmc2VudF9zaXplLCBIWik7CisJdXNiX21hcmtfbGFzdF9idXN5KGkyNDAwbXUtPnVzYl9kZXYpOworCXN3aXRjaCAocmVzdWx0KSB7CisJY2FzZSAwOgorCQlpZiAoc2VudF9zaXplICE9IHR4X21zZ19zaXplKSB7CS8qIFRvbyBzaG9ydD8gZHJvcCBpdCAqLworCQkJZGV2X2VycihkZXYsICJUWDogc2hvcnQgd3JpdGUgKCVkIEIgdnMgJXp1ICIKKwkJCQkiZXhwZWN0ZWQpXG4iLCBzZW50X3NpemUsIHR4X21zZ19zaXplKTsKKwkJCXJlc3VsdCA9IC1FSU87CisJCX0KKwkJYnJlYWs7CisJY2FzZSAtRUlOVkFMOgkJCS8qIHdoaWxlIHJlbW92aW5nIGRyaXZlciAqLworCWNhc2UgLUVOT0RFVjoJCQkvKiBkZXYgZGlzY29ubmVjdCAuLi4gKi8KKwljYXNlIC1FTk9FTlQ6CQkJLyoganVzdCBpZ25vcmUgaXQgKi8KKwljYXNlIC1FU0hVVERPV046CQkvKiBhbmQgZXhpdCAqLworCWNhc2UgLUVDT05OUkVTRVQ6CisJCXJlc3VsdCA9IC1FU0hVVERPV047CisJCWJyZWFrOworCWRlZmF1bHQ6CQkJLyogU29tZSBlcnJvcj8gKi8KKwkJaWYgKGVkY19pbmMoJmkyNDAwbXUtPnVyYl9lZGMsCisJCQkgICAgRURDX01BWF9FUlJPUlMsIEVEQ19FUlJPUl9USU1FRlJBTUUpKSB7CisJCQlkZXZfZXJyKGRldiwgIlRYOiBtYXhpbXVtIGVycm9ycyBpbiBVUkIgIgorCQkJCSJleGNlZWRlZDsgcmVzZXR0aW5nIGRldmljZVxuIik7CisJCQl1c2JfcXVldWVfcmVzZXRfZGV2aWNlKGkyNDAwbXUtPnVzYl9pZmFjZSk7CisJCX0gZWxzZSB7CisJCQlkZXZfZXJyKGRldiwgIlRYOiBjYW5ub3Qgc2VuZCBVUkI7IHJldHJ5aW5nLiAiCisJCQkJInR4X21zZyBAJXp1ICV6dSBCIFslZCBzZW50XTogJWRcbiIsCisJCQkJKHZvaWQgKikgdHhfbXNnIC0gaTI0MDBtLT50eF9idWYsCisJCQkJdHhfbXNnX3NpemUsIHNlbnRfc2l6ZSwgcmVzdWx0KTsKKwkJCWdvdG8gcmV0cnk7CisJCX0KKwl9CisJaWYgKGRvX2F1dG9wbSkKKwkJdXNiX2F1dG9wbV9wdXRfaW50ZXJmYWNlKGkyNDAwbXUtPnVzYl9pZmFjZSk7CisJZF9mbmVuZCg0LCBkZXYsICIoaTI0MDBtdSAlcCkgPSByZXN1bHRcbiIsIGkyNDAwbXUpOworCXJldHVybiByZXN1bHQ7Cit9CisKKworLyoKKyAqIEdldCB0aGUgbmV4dCBUWCBtZXNzYWdlIGluIHRoZSBUWCBGSUZPIGFuZCBzZW5kIGl0IHRvIHRoZSBkZXZpY2UKKyAqCisgKiBOb3RlIHdlIGV4aXQgdGhlIGxvb3AgaWYgaTI0MDBtdV90eCgpIGZhaWxzOyB0aGF0IGZ1bnRpb24gb25seQorICogZmFpbHMgb24gaGFyZCBlcnJvciAoZmFpbGluZyB0byB0eCBhIGJ1ZmZlciBub3QgYmVpbmcgb25lIG9mIHRoZW0sCisgKiBzZWUgaXRzIGRvYykuCisgKgorICogUmV0dXJuOiAwCisgKi8KK3N0YXRpYworaW50IGkyNDAwbXVfdHhkKHZvaWQgKl9pMjQwMG11KQoreworCWludCByZXN1bHQgPSAwOworCXN0cnVjdCBpMjQwMG11ICppMjQwMG11ID0gX2kyNDAwbXU7CisJc3RydWN0IGkyNDAwbSAqaTI0MDBtID0gJmkyNDAwbXUtPmkyNDAwbTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmaTI0MDBtdS0+dXNiX2lmYWNlLT5kZXY7CisJc3RydWN0IGkyNDAwbV9tc2dfaGRyICp0eF9tc2c7CisJc2l6ZV90IHR4X21zZ19zaXplOworCisJZF9mbnN0YXJ0KDQsIGRldiwgIihpMjQwMG11ICVwKVxuIiwgaTI0MDBtdSk7CisKKwl3aGlsZSAoMSkgeworCQlkX3ByaW50ZigyLCBkZXYsICJUWDogd2FpdGluZyBmb3IgbWVzc2FnZXNcbiIpOworCQl0eF9tc2cgPSBOVUxMOworCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoCisJCQlpMjQwMG11LT50eF93cSwKKwkJCShrdGhyZWFkX3Nob3VsZF9zdG9wKCkJLyogY2hlY2sgdGhpcyBmaXJzdCEgKi8KKwkJCSB8fCAodHhfbXNnID0gaTI0MDBtX3R4X21zZ19nZXQoaTI0MDBtLCAmdHhfbXNnX3NpemUpKSkKKwkJCSk7CisJCWlmIChrdGhyZWFkX3Nob3VsZF9zdG9wKCkpCisJCQlicmVhazsKKwkJV0FSTl9PTih0eF9tc2cgPT0gTlVMTCk7CS8qIHNob3VsZCBub3QgaGFwcGVuLi4uKi8KKwkJZF9wcmludGYoMiwgZGV2LCAiVFg6IHN1Ym1pdHRpbmcgJXp1IGJ5dGVzXG4iLCB0eF9tc2dfc2l6ZSk7CisJCWRfZHVtcCg1LCBkZXYsIHR4X21zZywgdHhfbXNnX3NpemUpOworCQkvKiBZZWFoLCB3ZSBpZ25vcmUgZXJyb3JzIC4uLiBub3QgbXVjaCB3ZSBjYW4gZG8gKi8KKwkJaTI0MDBtdV90eChpMjQwMG11LCB0eF9tc2csIHR4X21zZ19zaXplKTsKKwkJaTI0MDBtX3R4X21zZ19zZW50KGkyNDAwbSk7CS8qIGFjayBpdCwgYWR2YW5jZSB0aGUgRklGTyAqLworCQlpZiAocmVzdWx0IDwgMCkKKwkJCWJyZWFrOworCX0KKwlkX2ZuZW5kKDQsIGRldiwgIihpMjQwMG11ICVwKSA9ICVkXG4iLCBpMjQwMG11LCByZXN1bHQpOworCXJldHVybiByZXN1bHQ7Cit9CisKKworLyoKKyAqIGkyNDAwbSBUWCBlbmdpbmUgbm90aWZpZXMgdXMgdGhhdCB0aGVyZSBpcyBkYXRhIGluIHRoZSBGSUZPIHJlYWR5CisgKiBmb3IgVFgKKyAqCisgKiBJZiB0aGVyZSBpcyBhIFVSQiBpbiBmbGlnaHQsIGRvbid0IGRvIGFueXRoaW5nOyB3aGVuIGl0IGZpbmlzaGVzLAorICogaXQgd2lsbCBzZWUgdGhlcmUgaXMgZGF0YSBpbiB0aGUgRklGTyBhbmQgc2VuZCBpdC4gRWxzZSwganVzdAorICogc3VibWl0IGEgd3JpdGUuCisgKi8KK3ZvaWQgaTI0MDBtdV9idXNfdHhfa2ljayhzdHJ1Y3QgaTI0MDBtICppMjQwMG0pCit7CisJc3RydWN0IGkyNDAwbXUgKmkyNDAwbXUgPSBjb250YWluZXJfb2YoaTI0MDBtLCBzdHJ1Y3QgaTI0MDBtdSwgaTI0MDBtKTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmaTI0MDBtdS0+dXNiX2lmYWNlLT5kZXY7CisKKwlkX2Zuc3RhcnQoMywgZGV2LCAiKGkyNDAwbSAlcCkgPSB2b2lkXG4iLCBpMjQwMG0pOworCXdha2VfdXBfYWxsKCZpMjQwMG11LT50eF93cSk7CisJZF9mbmVuZCgzLCBkZXYsICIoaTI0MDBtICVwKSA9IHZvaWRcbiIsIGkyNDAwbSk7Cit9CisKKworaW50IGkyNDAwbXVfdHhfc2V0dXAoc3RydWN0IGkyNDAwbXUgKmkyNDAwbXUpCit7CisJaW50IHJlc3VsdCA9IDA7CisJc3RydWN0IGkyNDAwbSAqaTI0MDBtID0gJmkyNDAwbXUtPmkyNDAwbTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmaTI0MDBtdS0+dXNiX2lmYWNlLT5kZXY7CisJc3RydWN0IHdpbWF4X2RldiAqd2ltYXhfZGV2ID0gJmkyNDAwbS0+d2ltYXhfZGV2OworCisJaTI0MDBtdS0+dHhfa3RocmVhZCA9IGt0aHJlYWRfcnVuKGkyNDAwbXVfdHhkLCBpMjQwMG11LCAiJXMtdHgiLAorCQkJCQkgIHdpbWF4X2Rldi0+bmFtZSk7CisJaWYgKElTX0VSUihpMjQwMG11LT50eF9rdGhyZWFkKSkgeworCQlyZXN1bHQgPSBQVFJfRVJSKGkyNDAwbXUtPnR4X2t0aHJlYWQpOworCQlkZXZfZXJyKGRldiwgIlRYOiBjYW5ub3Qgc3RhcnQgdGhyZWFkOiAlZFxuIiwgcmVzdWx0KTsKKwl9CisJcmV0dXJuIHJlc3VsdDsKK30KKwordm9pZCBpMjQwMG11X3R4X3JlbGVhc2Uoc3RydWN0IGkyNDAwbXUgKmkyNDAwbXUpCit7CisJa3RocmVhZF9zdG9wKGkyNDAwbXUtPnR4X2t0aHJlYWQpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2ltYXgvaTI0MDBtL3VzYi5jIGIvZHJpdmVycy9uZXQvd2ltYXgvaTI0MDBtL3VzYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2ZDkzNDYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aW1heC9pMjQwMG0vdXNiLmMKQEAgLTAsMCArMSw1OTcgQEAKKy8qCisgKiBJbnRlbCBXaXJlbGVzcyBXaU1BWCBDb25uZWN0aW9uIDI0MDBtCisgKiBMaW51eCBkcml2ZXIgbW9kZWwgZ2x1ZSBmb3IgVVNCIGRldmljZSwgcmVzZXQgJiBmdyB1cGxvYWQKKyAqCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggSW50ZWwgQ29ycG9yYXRpb24gPGxpbnV4LXdpbWF4QGludGVsLmNvbT4KKyAqIEluYWt5IFBlcmV6LUdvbnphbGV6IDxpbmFreS5wZXJlei1nb256YWxlekBpbnRlbC5jb20+CisgKiBZYW5pciBMdWJldGtpbiA8eWFuaXJ4Lmx1YmV0a2luQGludGVsLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EuCisgKgorICoKKyAqIFNlZSBpMjQwMG0tdXNiLmggZm9yIGEgZ2VuZXJhbCBkZXNjcmlwdGlvbiBvZiB0aGlzIGRyaXZlci4KKyAqCisgKiBUaGlzIGZpbGUgaW1wbGVtZW50cyBkcml2ZXIgbW9kZWwgZ2x1ZSwgYW5kIGhvb2sgdXBzIGZvciB0aGUKKyAqIGdlbmVyaWMgZHJpdmVyIHRvIGltcGxlbWVudCB0aGUgYnVzLXNwZWNpZmljIGZ1bmN0aW9ucyAoZGV2aWNlCisgKiBjb21tdW5pY2F0aW9uIHNldHVwL3RlYXIgZG93biwgZmlybXdhcmUgdXBsb2FkIGFuZCByZXNldHRpbmcpLgorICoKKyAqIFJPQURNQVAKKyAqCisgKiBpMjQwMG11X3Byb2JlKCkKKyAqICAgYWxsb2NfbmV0ZGV2KCkuLi4KKyAqICAgICBpMjQwMG11X25ldGRldl9zZXR1cCgpCisgKiAgICAgICBpMjQwMG11X2luaXQoKQorICogICAgICAgaTI0MDBtX25ldGRldl9zZXR1cCgpCisgKiAgIGkyNDAwbV9zZXR1cCgpLi4uCisgKgorICogaTI0MDBtdV9kaXNjb25uZWN0CisgKiAgIGkyNDAwbV9yZWxlYXNlKCkKKyAqICAgZnJlZV9uZXRkZXYoKQorICoKKyAqIGkyNDAwbXVfc3VzcGVuZCgpCisgKiAgIGkyNDAwbV9jbWRfZW50ZXJfcG93ZXJzYXZlKCkKKyAqICAgaTI0MDBtdV9ub3RpZmljYXRpb25fcmVsZWFzZSgpCisgKgorICogaTI0MDBtdV9yZXN1bWUoKQorICogICBpMjQwMG11X25vdGlmaWNhdGlvbl9zZXR1cCgpCisgKgorICogaTI0MDBtdV9idXNfZGV2X3N0YXJ0KCkgICAgICAgIENhbGxlZCBieSBpMjQwMG1fZGV2X3N0YXJ0KCkgW3dobyBpcworICogICBpMjQwMG11X3R4X3NldHVwKCkgICAgICAgICAgIGNhbGxlZCBieSBpMjQwMG1fc2V0dXAoKV0KKyAqICAgaTI0MDBtdV9yeF9zZXR1cCgpCisgKiAgIGkyNDAwbXVfbm90aWZpY2F0aW9uX3NldHVwKCkKKyAqCisgKiBpMjQwMG11X2J1c19kZXZfc3RvcCgpICAgICAgICAgQ2FsbGVkIGJ5IGkyNDAwbV9kZXZfc3RvcCgpIFt3aG8gaXMKKyAqICAgaTI0MDBtdV9ub3RpZmljYXRpb25fcmVsZWFzZSgpICBjYWxsZWQgYnkgaTI0MDBtX3JlbGVhc2UoKV0KKyAqICAgaTI0MDBtdV9yeF9yZWxlYXNlKCkKKyAqICAgaTI0MDBtdV90eF9yZWxlYXNlKCkKKyAqCisgKiBpMjQwMG11X2J1c19yZXNldCgpICAgICAgICAgICAgQ2FsbGVkIGJ5IGkyNDAwbS0+YnVzX3Jlc2V0CisgKiAgIF9faTI0MDBtdV9yZXNldCgpCisgKiAgICAgX19pMjQwMG11X3NlbmRfYmFya2VyKCkKKyAqICAgdXNiX3Jlc2V0X2RldmljZSgpCisgKi8KKyNpbmNsdWRlICJpMjQwMG0tdXNiLmgiCisjaW5jbHVkZSA8bGludXgvd2ltYXgvaTI0MDBtLmg+CisjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgorCisKKyNkZWZpbmUgRF9TVUJNT0RVTEUgdXNiCisjaW5jbHVkZSAidXNiLWRlYnVnLWxldmVscy5oIgorCisKKy8qIE91ciBmaXJtd2FyZSBmaWxlIG5hbWUgKi8KKyNkZWZpbmUgSTI0MDBNVV9GV19GSUxFX05BTUUgImkyNDAwbS1mdy11c2ItIiBJMjQwME1fRldfVkVSU0lPTiAiLnNiY2YiCisKK3N0YXRpYworaW50IGkyNDAwbXVfYnVzX2Rldl9zdGFydChzdHJ1Y3QgaTI0MDBtICppMjQwMG0pCit7CisJaW50IHJlc3VsdDsKKwlzdHJ1Y3QgaTI0MDBtdSAqaTI0MDBtdSA9IGNvbnRhaW5lcl9vZihpMjQwMG0sIHN0cnVjdCBpMjQwMG11LCBpMjQwMG0pOworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZpMjQwMG11LT51c2JfaWZhY2UtPmRldjsKKworCWRfZm5zdGFydCgzLCBkZXYsICIoaTI0MDBtICVwKVxuIiwgaTI0MDBtKTsKKwlyZXN1bHQgPSBpMjQwMG11X3R4X3NldHVwKGkyNDAwbXUpOworCWlmIChyZXN1bHQgPCAwKQorCQlnb3RvIGVycm9yX3VzYl90eF9zZXR1cDsKKwlyZXN1bHQgPSBpMjQwMG11X3J4X3NldHVwKGkyNDAwbXUpOworCWlmIChyZXN1bHQgPCAwKQorCQlnb3RvIGVycm9yX3VzYl9yeF9zZXR1cDsKKwlyZXN1bHQgPSBpMjQwMG11X25vdGlmaWNhdGlvbl9zZXR1cChpMjQwMG11KTsKKwlpZiAocmVzdWx0IDwgMCkKKwkJZ290byBlcnJvcl9ub3RpZl9zZXR1cDsKKwlkX2ZuZW5kKDMsIGRldiwgIihpMjQwMG0gJXApID0gJWRcbiIsIGkyNDAwbSwgcmVzdWx0KTsKKwlyZXR1cm4gcmVzdWx0OworCitlcnJvcl9ub3RpZl9zZXR1cDoKKwlpMjQwMG11X3J4X3JlbGVhc2UoaTI0MDBtdSk7CitlcnJvcl91c2Jfcnhfc2V0dXA6CisJaTI0MDBtdV90eF9yZWxlYXNlKGkyNDAwbXUpOworZXJyb3JfdXNiX3R4X3NldHVwOgorCWRfZm5lbmQoMywgZGV2LCAiKGkyNDAwbSAlcCkgPSB2b2lkXG4iLCBpMjQwMG0pOworCXJldHVybiByZXN1bHQ7Cit9CisKKworc3RhdGljCit2b2lkIGkyNDAwbXVfYnVzX2Rldl9zdG9wKHN0cnVjdCBpMjQwMG0gKmkyNDAwbSkKK3sKKwlzdHJ1Y3QgaTI0MDBtdSAqaTI0MDBtdSA9IGNvbnRhaW5lcl9vZihpMjQwMG0sIHN0cnVjdCBpMjQwMG11LCBpMjQwMG0pOworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZpMjQwMG11LT51c2JfaWZhY2UtPmRldjsKKworCWRfZm5zdGFydCgzLCBkZXYsICIoaTI0MDBtICVwKVxuIiwgaTI0MDBtKTsKKwlpMjQwMG11X25vdGlmaWNhdGlvbl9yZWxlYXNlKGkyNDAwbXUpOworCWkyNDAwbXVfcnhfcmVsZWFzZShpMjQwMG11KTsKKwlpMjQwMG11X3R4X3JlbGVhc2UoaTI0MDBtdSk7CisJZF9mbmVuZCgzLCBkZXYsICIoaTI0MDBtICVwKSA9IHZvaWRcbiIsIGkyNDAwbSk7Cit9CisKKworLyoKKyAqIFNlbmRzIGEgYmFya2VyIGJ1ZmZlciB0byB0aGUgZGV2aWNlCisgKgorICogVGhpcyBoZWxwZXIgd2lsbCBhbGxvY2F0ZSBhIGttYWxsb2NlZCBidWZmZXIgYW5kIHVzZSBpdCB0byB0cmFuc21pdAorICogKHRoZW4gZnJlZSBpdCkuIFJlYXNvbiBmb3IgdGhpcyBpcyB0aGF0IG90aGVyIGFyY2hlcyBjYW5ub3QgdXNlCisgKiBzdGFjay92bWFsbG9jL3RleHQgYXJlYXMgZm9yIERNQSB0cmFuc2ZlcnMuCisgKgorICogRXJyb3IgcmVjb3ZlcnkgaGVyZSBpcyBzaW1wbGVyOiBhbnl0aGluZyBpcyBjb25zaWRlcmVkIGEgaGFyZCBlcnJvcgorICogYW5kIHdpbGwgbW92ZSB0aGUgcmVzZXQgY29kZSB0byB1c2UgYSBsYXN0LXJlc29ydCBidXMtYmFzZWQgcmVzZXQuCisgKi8KK3N0YXRpYworaW50IF9faTI0MDBtdV9zZW5kX2JhcmtlcihzdHJ1Y3QgaTI0MDBtdSAqaTI0MDBtdSwKKwkJCSAgY29uc3QgX19sZTMyICpiYXJrZXIsCisJCQkgIHNpemVfdCBiYXJrZXJfc2l6ZSwKKwkJCSAgdW5zaWduZWQgZW5kcG9pbnQpCit7CisJc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplcGQgPSBOVUxMOworCWludCBwaXBlLCBhY3R1YWxfbGVuLCByZXQ7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJmkyNDAwbXUtPnVzYl9pZmFjZS0+ZGV2OworCXZvaWQgKmJ1ZmZlcjsKKwlpbnQgZG9fYXV0b3BtID0gMTsKKworCXJldCA9IHVzYl9hdXRvcG1fZ2V0X2ludGVyZmFjZShpMjQwMG11LT51c2JfaWZhY2UpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAiUkVTRVQ6IGNhbid0IGdldCBhdXRvcG06ICVkXG4iLCByZXQpOworCQlkb19hdXRvcG0gPSAwOworCX0KKwlyZXQgPSAtRU5PTUVNOworCWJ1ZmZlciA9IGttYWxsb2MoYmFya2VyX3NpemUsIEdGUF9LRVJORUwpOworCWlmIChidWZmZXIgPT0gTlVMTCkKKwkJZ290byBlcnJvcl9remFsbG9jOworCWVwZCA9IHVzYl9nZXRfZXBkKGkyNDAwbXUtPnVzYl9pZmFjZSwgZW5kcG9pbnQpOworCXBpcGUgPSB1c2Jfc25kYnVsa3BpcGUoaTI0MDBtdS0+dXNiX2RldiwgZXBkLT5iRW5kcG9pbnRBZGRyZXNzKTsKKwltZW1jcHkoYnVmZmVyLCBiYXJrZXIsIGJhcmtlcl9zaXplKTsKKwlyZXQgPSB1c2JfYnVsa19tc2coaTI0MDBtdS0+dXNiX2RldiwgcGlwZSwgYnVmZmVyLCBiYXJrZXJfc2l6ZSwKKwkJCSAgICZhY3R1YWxfbGVuLCBIWik7CisJaWYgKHJldCA8IDApIHsKKwkJaWYgKHJldCAhPSAtRUlOVkFMKQorCQkJZGV2X2VycihkZXYsICJFOiBiYXJrZXIgZXJyb3I6ICVkXG4iLCByZXQpOworCX0gZWxzZSBpZiAoYWN0dWFsX2xlbiAhPSBiYXJrZXJfc2l6ZSkgeworCQlkZXZfZXJyKGRldiwgIkU6IG9ubHkgJWQgYnl0ZXMgdHJhbnNtaXR0ZWRcbiIsIGFjdHVhbF9sZW4pOworCQlyZXQgPSAtRUlPOworCX0KKwlrZnJlZShidWZmZXIpOworZXJyb3Jfa3phbGxvYzoKKwlpZiAoZG9fYXV0b3BtKQorCQl1c2JfYXV0b3BtX3B1dF9pbnRlcmZhY2UoaTI0MDBtdS0+dXNiX2lmYWNlKTsKKwlyZXR1cm4gcmV0OworfQorCisKKy8qCisgKiBSZXNldCBhIGRldmljZSBhdCBkaWZmZXJlbnQgbGV2ZWxzICh3YXJtLCBjb2xkIG9yIGJ1cykKKyAqCisgKiBAaTI0MDBtOiBkZXZpY2UgZGVzY3JpcHRvcgorICogQHJlc2V0X3R5cGU6IHNvZnQsIHdhcm0gb3IgYnVzIHJlc2V0IChJMjQwME1fUlRfV0FSTS9TT0ZUL0JVUykKKyAqCisgKiBXYXJtIGFuZCBjb2xkIHJlc2V0cyBnZXQgYSBVU0IgcmVzZXQgaWYgdGhleSBmYWlsLgorICoKKyAqIFdhcm0gcmVzZXQ6CisgKgorICogVGhlIGRldmljZSB3aWxsIGJlIGZ1bGx5IHJlc2V0IGludGVybmFsbHksIGJ1dCB3b24ndCBiZQorICogZGlzY29ubmVjdGVkIGZyb20gdGhlIFVTQiBidXMgKHNvIG5vIHJlZW51bWVyYXRpb24gd2lsbAorICogaGFwcGVuKS4gRmlybXdhcmUgdXBsb2FkIHdpbGwgYmUgbmVjY2Vzc2FyeS4KKyAqCisgKiBUaGUgZGV2aWNlIHdpbGwgc2VuZCBhIHJlYm9vdCBiYXJrZXIgaW4gdGhlIG5vdGlmaWNhdGlvbiBlbmRwb2ludAorICogdGhhdCB3aWxsIHRyaWdnZXIgdGhlIGRyaXZlciB0byByZWluaXRpYWxpemUgdGhlIHN0YXRlCisgKiBhdXRvbWF0aWNhbGx5IGZyb20gbm90aWYuYzppMjQwMG1fbm90aWZpY2F0aW9uX2dyb2soKSBpbnRvCisgKiBpMjQwMG1fZGV2X2Jvb3RzdHJhcF9kZWxheWVkKCkuCisgKgorICogQ29sZCBhbmQgYnVzIChVU0IpIHJlc2V0OgorICoKKyAqIFRoZSBkZXZpY2Ugd2lsbCBiZSBmdWxseSByZXNldCBpbnRlcm5hbGx5LCBkaXNjb25uZWN0ZWQgZnJvbSB0aGUKKyAqIFVTQiBidXMgYW4gYSByZWVudW1lcmF0aW9uIHdpbGwgaGFwcGVuLiBGaXJtd2FyZSB1cGxvYWQgd2lsbCBiZQorICogbmVjY2Vzc2FyeS4gVGh1cywgd2UgZG9uJ3QgZG8gYW55IGxvY2tpbmcgb3Igc3RydWN0CisgKiByZWluaXRpYWxpemF0aW9uLCBhcyB3ZSBhcmUgZ29pbmcgdG8gYmUgZnVsbHkgZGlzY29ubmVjdGVkIGFuZAorICogcmVlbnVtZXJhdGVkLgorICoKKyAqIE5vdGUgd2UgbmVlZCB0byByZXR1cm4gLUVOT0RFViBpZiBhIHdhcm0gcmVzZXQgd2FzIHJlcXVlc3RlZCBhbmQgd2UKKyAqIGhhZCB0byByZXNvcnQgdG8gYSBidXMgcmVzZXQuIFNlZSBpMjQwMG1fb3BfcmVzZXQoKSwgd2ltYXhfcmVzZXQoKQorICogYW5kIHdpbWF4X2Rldi0+b3BfcmVzZXQuCisgKgorICogV0FSTklORzogbm8gZHJpdmVyIHN0YXRlIHNhdmVkL2ZpeGVkCisgKi8KK3N0YXRpYworaW50IGkyNDAwbXVfYnVzX3Jlc2V0KHN0cnVjdCBpMjQwMG0gKmkyNDAwbSwgZW51bSBpMjQwMG1fcmVzZXRfdHlwZSBydCkKK3sKKwlpbnQgcmVzdWx0OworCXN0cnVjdCBpMjQwMG11ICppMjQwMG11ID0KKwkJY29udGFpbmVyX29mKGkyNDAwbSwgc3RydWN0IGkyNDAwbXUsIGkyNDAwbSk7CisJc3RydWN0IGRldmljZSAqZGV2ID0gaTI0MDBtX2RldihpMjQwMG0pOworCXN0YXRpYyBjb25zdCBfX2xlMzIgaTI0MDBtX1dBUk1fQk9PVF9CQVJLRVJbNF0gPSB7CisJCV9fY29uc3RhbnRfY3B1X3RvX2xlMzIoSTI0MDBNX1dBUk1fUkVTRVRfQkFSS0VSKSwKKwkJX19jb25zdGFudF9jcHVfdG9fbGUzMihJMjQwME1fV0FSTV9SRVNFVF9CQVJLRVIpLAorCQlfX2NvbnN0YW50X2NwdV90b19sZTMyKEkyNDAwTV9XQVJNX1JFU0VUX0JBUktFUiksCisJCV9fY29uc3RhbnRfY3B1X3RvX2xlMzIoSTI0MDBNX1dBUk1fUkVTRVRfQkFSS0VSKSwKKwl9OworCXN0YXRpYyBjb25zdCBfX2xlMzIgaTI0MDBtX0NPTERfQk9PVF9CQVJLRVJbNF0gPSB7CisJCV9fY29uc3RhbnRfY3B1X3RvX2xlMzIoSTI0MDBNX0NPTERfUkVTRVRfQkFSS0VSKSwKKwkJX19jb25zdGFudF9jcHVfdG9fbGUzMihJMjQwME1fQ09MRF9SRVNFVF9CQVJLRVIpLAorCQlfX2NvbnN0YW50X2NwdV90b19sZTMyKEkyNDAwTV9DT0xEX1JFU0VUX0JBUktFUiksCisJCV9fY29uc3RhbnRfY3B1X3RvX2xlMzIoSTI0MDBNX0NPTERfUkVTRVRfQkFSS0VSKSwKKwl9OworCisJZF9mbnN0YXJ0KDMsIGRldiwgIihpMjQwMG0gJXAgcnQgJXUpXG4iLCBpMjQwMG0sIHJ0KTsKKwlpZiAocnQgPT0gSTI0MDBNX1JUX1dBUk0pCisJCXJlc3VsdCA9IF9faTI0MDBtdV9zZW5kX2JhcmtlcihpMjQwMG11LCBpMjQwMG1fV0FSTV9CT09UX0JBUktFUiwKKwkJCQkJICAgICAgIHNpemVvZihpMjQwMG1fV0FSTV9CT09UX0JBUktFUiksCisJCQkJCSAgICAgICBJMjQwME1VX0VQX0JVTEtfT1VUKTsKKwllbHNlIGlmIChydCA9PSBJMjQwME1fUlRfQ09MRCkKKwkJcmVzdWx0ID0gX19pMjQwMG11X3NlbmRfYmFya2VyKGkyNDAwbXUsIGkyNDAwbV9DT0xEX0JPT1RfQkFSS0VSLAorCQkJCQkgICAgICAgc2l6ZW9mKGkyNDAwbV9DT0xEX0JPT1RfQkFSS0VSKSwKKwkJCQkJICAgICAgIEkyNDAwTVVfRVBfUkVTRVRfQ09MRCk7CisJZWxzZSBpZiAocnQgPT0gSTI0MDBNX1JUX0JVUykgeworZG9fYnVzX3Jlc2V0OgorCQlyZXN1bHQgPSB1c2JfcmVzZXRfZGV2aWNlKGkyNDAwbXUtPnVzYl9kZXYpOworCQlzd2l0Y2ggKHJlc3VsdCkgeworCQljYXNlIDA6CisJCWNhc2UgLUVJTlZBTDoJLyogZGV2aWNlIGlzIGdvbmUgKi8KKwkJY2FzZSAtRU5PREVWOgorCQljYXNlIC1FTk9FTlQ6CisJCWNhc2UgLUVTSFVURE9XTjoKKwkJCXJlc3VsdCA9IHJ0ID09IEkyNDAwTV9SVF9XQVJNID8gLUVOT0RFViA6IDA7CisJCQlicmVhazsJLyogV2UgYXNzdW1lIHRoZSBkZXZpY2UgaXMgZGlzY29ubmVjdGVkICovCisJCWRlZmF1bHQ6CisJCQlkZXZfZXJyKGRldiwgIlVTQiByZXNldCBmYWlsZWQgKCVkKSwgZ2l2aW5nIHVwIVxuIiwKKwkJCQlyZXN1bHQpOworCQl9CisJfSBlbHNlCisJCUJVRygpOworCWlmIChyZXN1bHQgPCAwCisJICAgICYmIHJlc3VsdCAhPSAtRUlOVkFMCS8qIGRldmljZSBpcyBnb25lICovCisJICAgICYmIHJ0ICE9IEkyNDAwTV9SVF9CVVMpIHsKKwkJZGV2X2VycihkZXYsICIlcyByZXNldCBmYWlsZWQgKCVkKTsgdHJ5aW5nIFVTQiByZXNldFxuIiwKKwkJCXJ0ID09IEkyNDAwTV9SVF9XQVJNID8gIndhcm0iIDogImNvbGQiLCByZXN1bHQpOworCQlydCA9IEkyNDAwTV9SVF9CVVM7CisJCWdvdG8gZG9fYnVzX3Jlc2V0OworCX0KKwlkX2ZuZW5kKDMsIGRldiwgIihpMjQwMG0gJXAgcnQgJXUpID0gJWRcbiIsIGkyNDAwbSwgcnQsIHJlc3VsdCk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworCitzdGF0aWMKK3ZvaWQgaTI0MDBtdV9uZXRkZXZfc2V0dXAoc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpCit7CisJc3RydWN0IGkyNDAwbSAqaTI0MDBtID0gbmV0X2Rldl90b19pMjQwMG0obmV0X2Rldik7CisJc3RydWN0IGkyNDAwbXUgKmkyNDAwbXUgPSBjb250YWluZXJfb2YoaTI0MDBtLCBzdHJ1Y3QgaTI0MDBtdSwgaTI0MDBtKTsKKwlpMjQwMG11X2luaXQoaTI0MDBtdSk7CisJaTI0MDBtX25ldGRldl9zZXR1cChuZXRfZGV2KTsKK30KKworCisvKgorICogRGVidWcgbGV2ZWxzIGNvbnRyb2w7IHNlZSBkZWJ1Zy5oCisgKi8KK3N0cnVjdCBkX2xldmVsIERfTEVWRUxbXSA9IHsKKwlEX1NVQk1PRFVMRV9ERUZJTkUodXNiKSwKKwlEX1NVQk1PRFVMRV9ERUZJTkUoZncpLAorCURfU1VCTU9EVUxFX0RFRklORShub3RpZiksCisJRF9TVUJNT0RVTEVfREVGSU5FKHJ4KSwKKwlEX1NVQk1PRFVMRV9ERUZJTkUodHgpLAorfTsKK3NpemVfdCBEX0xFVkVMX1NJWkUgPSBBUlJBWV9TSVpFKERfTEVWRUwpOworCisKKyNkZWZpbmUgX19kZWJ1Z2ZzX3JlZ2lzdGVyKHByZWZpeCwgbmFtZSwgcGFyZW50KQkJCVwKK2RvIHsJCQkJCQkJCQlcCisJcmVzdWx0ID0gZF9sZXZlbF9yZWdpc3Rlcl9kZWJ1Z2ZzKHByZWZpeCwgbmFtZSwgcGFyZW50KTsJXAorCWlmIChyZXN1bHQgPCAwKQkJCQkJCQlcCisJCWdvdG8gZXJyb3I7CQkJCQkJXAorfSB3aGlsZSAoMCkKKworCitzdGF0aWMKK2ludCBpMjQwMG11X2RlYnVnZnNfYWRkKHN0cnVjdCBpMjQwMG11ICppMjQwMG11KQoreworCWludCByZXN1bHQ7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJmkyNDAwbXUtPnVzYl9pZmFjZS0+ZGV2OworCXN0cnVjdCBkZW50cnkgKmRlbnRyeSA9IGkyNDAwbXUtPmkyNDAwbS53aW1heF9kZXYuZGVidWdmc19kZW50cnk7CisJc3RydWN0IGRlbnRyeSAqZmQ7CisKKwlkZW50cnkgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIoImkyNDAwbS11c2IiLCBkZW50cnkpOworCXJlc3VsdCA9IFBUUl9FUlIoZGVudHJ5KTsKKwlpZiAoSVNfRVJSKGRlbnRyeSkpIHsKKwkJaWYgKHJlc3VsdCA9PSAtRU5PREVWKQorCQkJcmVzdWx0ID0gMDsJLyogTm8gZGVidWdmcyBzdXBwb3J0ICovCisJCWdvdG8gZXJyb3I7CisJfQorCWkyNDAwbXUtPmRlYnVnZnNfZGVudHJ5ID0gZGVudHJ5OworCV9fZGVidWdmc19yZWdpc3RlcigiZGxfIiwgdXNiLCBkZW50cnkpOworCV9fZGVidWdmc19yZWdpc3RlcigiZGxfIiwgZncsIGRlbnRyeSk7CisJX19kZWJ1Z2ZzX3JlZ2lzdGVyKCJkbF8iLCBub3RpZiwgZGVudHJ5KTsKKwlfX2RlYnVnZnNfcmVnaXN0ZXIoImRsXyIsIHJ4LCBkZW50cnkpOworCV9fZGVidWdmc19yZWdpc3RlcigiZGxfIiwgdHgsIGRlbnRyeSk7CisKKwkvKiBEb24ndCB0b3VjaCB0aGVzZSBpZiB5b3UgZG9uJ3Qga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcgKi8KKwlmZCA9IGRlYnVnZnNfY3JlYXRlX3U4KCJyeF9zaXplX2F1dG9fc2hyaW5rIiwgMDYwMCwgZGVudHJ5LAorCQkJICAgICAgICZpMjQwMG11LT5yeF9zaXplX2F1dG9fc2hyaW5rKTsKKwlyZXN1bHQgPSBQVFJfRVJSKGZkKTsKKwlpZiAoSVNfRVJSKGZkKSAmJiByZXN1bHQgIT0gLUVOT0RFVikgeworCQlkZXZfZXJyKGRldiwgIkNhbid0IGNyZWF0ZSBkZWJ1Z2ZzIGVudHJ5ICIKKwkJCSJyeF9zaXplX2F1dG9fc2hyaW5rOiAlZFxuIiwgcmVzdWx0KTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlmZCA9IGRlYnVnZnNfY3JlYXRlX3NpemVfdCgicnhfc2l6ZSIsIDA2MDAsIGRlbnRyeSwKKwkJCQkgICAmaTI0MDBtdS0+cnhfc2l6ZSk7CisJcmVzdWx0ID0gUFRSX0VSUihmZCk7CisJaWYgKElTX0VSUihmZCkgJiYgcmVzdWx0ICE9IC1FTk9ERVYpIHsKKwkJZGV2X2VycihkZXYsICJDYW4ndCBjcmVhdGUgZGVidWdmcyBlbnRyeSAiCisJCQkicnhfc2l6ZTogJWRcbiIsIHJlc3VsdCk7CisJCWdvdG8gZXJyb3I7CisJfQorCisJcmV0dXJuIDA7CisKK2Vycm9yOgorCWRlYnVnZnNfcmVtb3ZlX3JlY3Vyc2l2ZShpMjQwMG11LT5kZWJ1Z2ZzX2RlbnRyeSk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworCisvKgorICogUHJvYmUgYSBpMjQwMG0gaW50ZXJmYWNlIGFuZCByZWdpc3RlciBpdAorICoKKyAqIEBpZmFjZTogICBVU0IgaW50ZXJmYWNlIHRvIGxpbmsgdG8KKyAqIEBpZDogICAgICBVU0IgY2xhc3Mvc3ViY2xhc3MvcHJvdG9jb2wgaWQKKyAqIEByZXR1cm5zOiAwIGlmIG9rLCA8IDAgZXJybm8gY29kZSBvbiBlcnJvci4KKyAqCisgKiBBbGxvYyBhIG5ldCBkZXZpY2UsIGluaXRpYWxpemUgdGhlIGJ1cy1zcGVjaWZpYyBkZXRhaWxzIGFuZCB0aGVuCisgKiBjYWxscyB0aGUgYnVzLWdlbmVyaWMgaW5pdGlhbGl6YXRpb24gcm91dGluZS4gVGhhdCB3aWxsIHJlZ2lzdGVyCisgKiB0aGUgd2ltYXggYW5kIG5ldGRldiBkZXZpY2VzLCB1cGxvYWQgdGhlIGZpcm13YXJlIFt1c2luZworICogX2J1c19ibV8qKCldLCBjYWxsIF9idXNfZGV2X3N0YXJ0KCkgdG8gZmluYWxpemUgdGhlIHNldHVwIG9mIHRoZQorICogY29tbXVuaWNhdGlvbiB3aXRoIHRoZSBkZXZpY2UgYW5kIHRoZW4gd2lsbCBzdGFydCB0byB0YWxrIHRvIGl0IHRvCisgKiBmaW5uaXNoIHNldHRpbmcgaXQgdXAuCisgKi8KK3N0YXRpYworaW50IGkyNDAwbXVfcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmlmYWNlLAorCQkgIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKK3sKKwlpbnQgcmVzdWx0OworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2OworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZpZmFjZS0+ZGV2OworCXN0cnVjdCBpMjQwMG0gKmkyNDAwbTsKKwlzdHJ1Y3QgaTI0MDBtdSAqaTI0MDBtdTsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdXNiX2RldiA9IGludGVyZmFjZV90b191c2JkZXYoaWZhY2UpOworCisJaWYgKHVzYl9kZXYtPnNwZWVkICE9IFVTQl9TUEVFRF9ISUdIKQorCQlkZXZfZXJyKGRldiwgImRldmljZSBub3QgY29ubmVjdGVkIGFzIGhpZ2ggc3BlZWRcbiIpOworCisJLyogQWxsb2NhdGUgaW5zdGFuY2UgW2NhbGxzIGkyNDAwbV9uZXRkZXZfc2V0dXAoKSBvbiBpdF0uICovCisJcmVzdWx0ID0gLUVOT01FTTsKKwluZXRfZGV2ID0gYWxsb2NfbmV0ZGV2KHNpemVvZigqaTI0MDBtdSksICJ3bXglZCIsCisJCQkgICAgICAgaTI0MDBtdV9uZXRkZXZfc2V0dXApOworCWlmIChuZXRfZGV2ID09IE5VTEwpIHsKKwkJZGV2X2VycihkZXYsICJubyBtZW1vcnkgZm9yIG5ldHdvcmsgZGV2aWNlIGluc3RhbmNlXG4iKTsKKwkJZ290byBlcnJvcl9hbGxvY19uZXRkZXY7CisJfQorCVNFVF9ORVRERVZfREVWKG5ldF9kZXYsIGRldik7CisJaTI0MDBtID0gbmV0X2Rldl90b19pMjQwMG0obmV0X2Rldik7CisJaTI0MDBtdSA9IGNvbnRhaW5lcl9vZihpMjQwMG0sIHN0cnVjdCBpMjQwMG11LCBpMjQwMG0pOworCWkyNDAwbS0+d2ltYXhfZGV2Lm5ldF9kZXYgPSBuZXRfZGV2OworCWkyNDAwbXUtPnVzYl9kZXYgPSB1c2JfZ2V0X2Rldih1c2JfZGV2KTsKKwlpMjQwMG11LT51c2JfaWZhY2UgPSBpZmFjZTsKKwl1c2Jfc2V0X2ludGZkYXRhKGlmYWNlLCBpMjQwMG11KTsKKworCWkyNDAwbS0+YnVzX3R4X2Jsb2NrX3NpemUgPSBJMjQwME1VX0JMS19TSVpFOworCWkyNDAwbS0+YnVzX3BsX3NpemVfbWF4ID0gSTI0MDBNVV9QTF9TSVpFX01BWDsKKwlpMjQwMG0tPmJ1c19kZXZfc3RhcnQgPSBpMjQwMG11X2J1c19kZXZfc3RhcnQ7CisJaTI0MDBtLT5idXNfZGV2X3N0b3AgPSBpMjQwMG11X2J1c19kZXZfc3RvcDsKKwlpMjQwMG0tPmJ1c190eF9raWNrID0gaTI0MDBtdV9idXNfdHhfa2ljazsKKwlpMjQwMG0tPmJ1c19yZXNldCA9IGkyNDAwbXVfYnVzX3Jlc2V0OworCWkyNDAwbS0+YnVzX2JtX2NtZF9zZW5kID0gaTI0MDBtdV9idXNfYm1fY21kX3NlbmQ7CisJaTI0MDBtLT5idXNfYm1fd2FpdF9mb3JfYWNrID0gaTI0MDBtdV9idXNfYm1fd2FpdF9mb3JfYWNrOworCWkyNDAwbS0+YnVzX2Z3X25hbWUgPSBJMjQwME1VX0ZXX0ZJTEVfTkFNRTsKKwlpMjQwMG0tPmJ1c19ibV9tYWNfYWRkcl9pbXBhaXJlZCA9IDA7CisKKyNpZmRlZiBDT05GSUdfUE0KKwlpZmFjZS0+bmVlZHNfcmVtb3RlX3dha2V1cCA9IDE7CQkvKiBhdXRvc3VzcGVuZCAoMTVzIGRlbGF5KSAqLworCWRldmljZV9pbml0X3dha2V1cChkZXYsIDEpOworCXVzYl9hdXRvcG1fZW5hYmxlKGkyNDAwbXUtPnVzYl9pZmFjZSk7CisJdXNiX2Rldi0+YXV0b3N1c3BlbmRfZGVsYXkgPSAxNSAqIEhaOworCXVzYl9kZXYtPmF1dG9zdXNwZW5kX2Rpc2FibGVkID0gMDsKKyNlbmRpZgorCisJcmVzdWx0ID0gaTI0MDBtX3NldHVwKGkyNDAwbSwgSTI0MDBNX0JSSV9NQUNfUkVJTklUKTsKKwlpZiAocmVzdWx0IDwgMCkgeworCQlkZXZfZXJyKGRldiwgImNhbm5vdCBzZXR1cCBkZXZpY2U6ICVkXG4iLCByZXN1bHQpOworCQlnb3RvIGVycm9yX3NldHVwOworCX0KKwlyZXN1bHQgPSBpMjQwMG11X2RlYnVnZnNfYWRkKGkyNDAwbXUpOworCWlmIChyZXN1bHQgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAiQ2FuJ3QgcmVnaXN0ZXIgaTI0MDBtdSdzIGRlYnVnZnM6ICVkXG4iLCByZXN1bHQpOworCQlnb3RvIGVycm9yX2RlYnVnZnNfYWRkOworCX0KKwlyZXR1cm4gMDsKKworZXJyb3JfZGVidWdmc19hZGQ6CisJaTI0MDBtX3JlbGVhc2UoaTI0MDBtKTsKK2Vycm9yX3NldHVwOgorCXVzYl9zZXRfaW50ZmRhdGEoaWZhY2UsIE5VTEwpOworCXVzYl9wdXRfZGV2KGkyNDAwbXUtPnVzYl9kZXYpOworCWZyZWVfbmV0ZGV2KG5ldF9kZXYpOworZXJyb3JfYWxsb2NfbmV0ZGV2OgorCXJldHVybiByZXN1bHQ7Cit9CisKKworLyoKKyAqIERpc2NvbmVjdCBhIGkyNDAwbSBmcm9tIHRoZSBzeXN0ZW0uCisgKgorICogaTI0MDBtX3N0b3AoKSBoYXMgYmVlbiBjYWxsZWQgYmVmb3JlLCBzbyBhbCB0aGUgcnggYW5kIHR4IGNvbnRleHRzCisgKiBoYXZlIGJlZW4gdGFrZW4gZG93biBhbHJlYWR5LiBNYWtlIHN1cmUgdGhlIHF1ZXVlIGlzIHN0b3BwZWQsCisgKiB1bnJlZ2lzdGVyIG5ldGRldiBhbmQgaTI0MDBtLCBmcmVlIGFuZCBraWxsLgorICovCitzdGF0aWMKK3ZvaWQgaTI0MDBtdV9kaXNjb25uZWN0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICppZmFjZSkKK3sKKwlzdHJ1Y3QgaTI0MDBtdSAqaTI0MDBtdSA9IHVzYl9nZXRfaW50ZmRhdGEoaWZhY2UpOworCXN0cnVjdCBpMjQwMG0gKmkyNDAwbSA9ICZpMjQwMG11LT5pMjQwMG07CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYgPSBpMjQwMG0tPndpbWF4X2Rldi5uZXRfZGV2OworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZpZmFjZS0+ZGV2OworCisJZF9mbnN0YXJ0KDMsIGRldiwgIihpZmFjZSAlcCBpMjQwMG0gJXApXG4iLCBpZmFjZSwgaTI0MDBtKTsKKworCWRlYnVnZnNfcmVtb3ZlX3JlY3Vyc2l2ZShpMjQwMG11LT5kZWJ1Z2ZzX2RlbnRyeSk7CisJaTI0MDBtX3JlbGVhc2UoaTI0MDBtKTsKKwl1c2Jfc2V0X2ludGZkYXRhKGlmYWNlLCBOVUxMKTsKKwl1c2JfcHV0X2RldihpMjQwMG11LT51c2JfZGV2KTsKKwlmcmVlX25ldGRldihuZXRfZGV2KTsKKwlkX2ZuZW5kKDMsIGRldiwgIihpZmFjZSAlcCBpMjQwMG0gJXApID0gdm9pZFxuIiwgaWZhY2UsIGkyNDAwbSk7Cit9CisKKworLyoKKyAqIEdldCB0aGUgZGV2aWNlIHJlYWR5IGZvciBVU0IgcG9ydCBvciBzeXN0ZW0gc3RhbmRieSBhbmQgaGliZXJuYXRpb24KKyAqCisgKiBVU0IgcG9ydCBhbmQgc3lzdGVtIHN0YW5kYnkgYXJlIGhhbmRsZWQgdGhlIHNhbWUuCisgKgorICogV2hlbiB0aGUgc3lzdGVtIGhpYmVybmF0ZXMsIHRoZSBVU0IgZGV2aWNlIGlzIHBvd2VyZWQgZG93biBhbmQgdGhlbgorICogdXAsIHNvIHdlIGRvbid0IHJlYWxseSBoYXZlIHRvIGRvIG11Y2ggaGVyZSwgYXMgaXQgd2lsbCBiZSBzZWVuIGFzCisgKiBhIHJlY29ubmVjdC4gU3RpbGwgZm9yIHNpbXBsaWNpdHkgd2UgY29uc2lkZXIgdGhpcyBjYXNlIHRoZSBzYW1lIGFzCisgKiBzdXNwZW5kLCBzbyB0aGF0IHRoZSBkZXZpY2UgaGFzIGEgY2hhbmNlIHRvIGRvIG5vdGlmeSB0aGUgYmFzZQorICogc3RhdGlvbiAoaWYgY29ubmVjdGVkKS4KKyAqCisgKiBTbyBhdCB0aGUgZW5kLCB0aGUgdGhyZWUgY2FzZXMgcmVxdWlyZSBjb21tb24gaGFuZGxpbmcuCisgKgorICogSWYgYXQgdGhlIHRpbWUgb2YgdGhpcyBjYWxsIHRoZSBkZXZpY2UncyBmaXJtd2FyZSBpcyBub3QgbG9hZGVkLAorICogbm90aGluZyBoYXMgdG8gYmUgZG9uZS4KKyAqCisgKiBJZiB0aGUgZmlybXdhcmUgaXMgbG9hZGVkLCB3ZSBuZWVkIHRvOgorICoKKyAqICAtIHRlbGwgdGhlIGRldmljZSB0byBnbyBpbnRvIGhvc3QgaW50ZXJmYWNlIHBvd2VyIHNhdmUgbW9kZSwgd2FpdAorICogICAgZm9yIGl0IHRvIGFjaworICoKKyAqICAgIFRoaXMgaXMgcXVpdGUgbW9yZSBpbnRlcmVzdGluZyB0aGFuIGl0IGlzOyB3ZSBuZWVkIHRvIGV4ZWN1dGUgYQorICogICAgY29tbWFuZCwgYnV0IHRoaXMgdGltZSwgd2UgZG9uJ3Qgd2FudCB0aGUgY29kZSBpbiB1c2Ite3R4LHJ4fS5jCisgKiAgICB0byBjYWxsIHRoZSB1c2JfYXV0b3BtX2dldC9wdXRfaW50ZXJmYWNlKCkgYmFycmllcnMgYXMgaXQnZAorICogICAgZGVhZGxvY2ssIHNvIHdlIG5lZWQgdG8gZGVjcmVtZW50IGkyNDAwbXUtPmRvX2F1dG9wbSwgdGhhdCBhY3RzCisgKiAgICBhcyBhIHBvb3IgbWFuJ3Mgc2VtYXBob3JlLiBVZ2x5LCBidXQgaXQgd29ya3MuCisgKgorICogICAgQXMgd2VsbCwgdGhlIGRldmljZSBtaWdodCByZWZ1c2UgZ29pbmcgdG8gc2xlZXAgZm9yIHdoaWNoZXZlcgorICogICAgcmVhc29uLiBJbiB0aGlzIGNhc2Ugd2UganVzdCBmYWlsLiBGb3Igc3lzdGVtIHN1c3BlbmQvaGliZXJuYXRlLAorICogICAgd2UgKmNhbid0KiBmYWlsLiBXZSBsb29rIGF0IHVzYl9kZXYtPmF1dG9fcG0gdG8gc2VlIGlmIHRoZQorICogICAgc3VzcGVuZCBjYWxsIGNvbWVzIGZyb20gdGhlIFVTQiBzdGFjayBvciBmcm9tIHRoZSBzeXN0ZW0gYW5kIGFjdAorICogICAgaW4gY29uc2VxdWVuY2UuCisgKgorICogIC0gc3RvcCB0aGUgbm90aWZpY2F0aW9uIGVuZHBvaW50IHBvbGxpbmcKKyAqLworc3RhdGljCitpbnQgaTI0MDBtdV9zdXNwZW5kKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppZmFjZSwgcG1fbWVzc2FnZV90IHBtX21zZykKK3sKKwlpbnQgcmVzdWx0ID0gMDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmaWZhY2UtPmRldjsKKwlzdHJ1Y3QgaTI0MDBtdSAqaTI0MDBtdSA9IHVzYl9nZXRfaW50ZmRhdGEoaWZhY2UpOworI2lmZGVmIENPTkZJR19QTQorCXN0cnVjdCB1c2JfZGV2aWNlICp1c2JfZGV2ID0gaTI0MDBtdS0+dXNiX2RldjsKKyNlbmRpZgorCXN0cnVjdCBpMjQwMG0gKmkyNDAwbSA9ICZpMjQwMG11LT5pMjQwMG07CisKKwlkX2Zuc3RhcnQoMywgZGV2LCAiKGlmYWNlICVwIHBtX21zZyAldSlcbiIsIGlmYWNlLCBwbV9tc2cuZXZlbnQpOworCWlmIChpMjQwMG0tPnVwZG93biA9PSAwKQorCQlnb3RvIG5vX2Zpcm13YXJlOworCWRfcHJpbnRmKDEsIGRldiwgImZ3IHVwLCByZXF1ZXN0aW5nIHN0YW5kYnlcbiIpOworCWF0b21pY19kZWMoJmkyNDAwbXUtPmRvX2F1dG9wbSk7CisJcmVzdWx0ID0gaTI0MDBtX2NtZF9lbnRlcl9wb3dlcnNhdmUoaTI0MDBtKTsKKwlhdG9taWNfaW5jKCZpMjQwMG11LT5kb19hdXRvcG0pOworI2lmZGVmIENPTkZJR19QTQorCWlmIChyZXN1bHQgPCAwICYmIHVzYl9kZXYtPmF1dG9fcG0gPT0gMCkgeworCQkvKiBTeXN0ZW0gc3VzcGVuZCwgY2FuJ3QgZmFpbCAqLworCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBzdXNwZW5kLCB3aWxsIHJlc2V0IG9uIHJlc3VtZVxuIik7CisJCXJlc3VsdCA9IDA7CisJfQorI2VuZGlmCisJaWYgKHJlc3VsdCA8IDApCisJCWdvdG8gZXJyb3JfZW50ZXJfcG93ZXJzYXZlOworCWkyNDAwbXVfbm90aWZpY2F0aW9uX3JlbGVhc2UoaTI0MDBtdSk7CisJZF9wcmludGYoMSwgZGV2LCAiZncgdXAsIGdvdCBzdGFuZGJ5XG4iKTsKK2Vycm9yX2VudGVyX3Bvd2Vyc2F2ZToKK25vX2Zpcm13YXJlOgorCWRfZm5lbmQoMywgZGV2LCAiKGlmYWNlICVwIHBtX21zZyAldSkgPSAlZFxuIiwKKwkJaWZhY2UsIHBtX21zZy5ldmVudCwgcmVzdWx0KTsKKwlyZXR1cm4gcmVzdWx0OworfQorCisKK3N0YXRpYworaW50IGkyNDAwbXVfcmVzdW1lKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppZmFjZSkKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmaWZhY2UtPmRldjsKKwlzdHJ1Y3QgaTI0MDBtdSAqaTI0MDBtdSA9IHVzYl9nZXRfaW50ZmRhdGEoaWZhY2UpOworCXN0cnVjdCBpMjQwMG0gKmkyNDAwbSA9ICZpMjQwMG11LT5pMjQwMG07CisKKwlkX2Zuc3RhcnQoMywgZGV2LCAiKGlmYWNlICVwKVxuIiwgaWZhY2UpOworCWlmIChpMjQwMG0tPnVwZG93biA9PSAwKSB7CisJCWRfcHJpbnRmKDEsIGRldiwgImZ3IHdhcyBkb3duLCBubyByZXN1bWUgbmVlZWRcbiIpOworCQlnb3RvIG91dDsKKwl9CisJZF9wcmludGYoMSwgZGV2LCAiZncgd2FzIHVwLCByZXN1bWluZ1xuIik7CisJaTI0MDBtdV9ub3RpZmljYXRpb25fc2V0dXAoaTI0MDBtdSk7CisJLyogVVNCIGhhcyBmbG93IGNvbnRyb2wsIHNvIHdlIGRvbid0IG5lZWQgdG8gZ2l2ZSBpdCB0aW1lIHRvCisJICogY29tZSBiYWNrOyBvdGhlcndpc2UsIHdlJ2QgdXNlIHNvbWV0aGluZyBsaWtlIGEgZ2V0LXN0YXRlCisJICogY29tbWFuZC4uLiAqLworb3V0OgorCWRfZm5lbmQoMywgZGV2LCAiKGlmYWNlICVwKSA9ICVkXG4iLCBpZmFjZSwgcmV0KTsKKwlyZXR1cm4gcmV0OworfQorCisKK3N0YXRpYworc3RydWN0IHVzYl9kZXZpY2VfaWQgaTI0MDBtdV9pZF90YWJsZVtdID0geworCXsgVVNCX0RFVklDRSgweDgwODYsIDB4MDE4MSkgfSwKKwl7IFVTQl9ERVZJQ0UoMHg4MDg2LCAweDE0MDMpIH0sCisJeyBVU0JfREVWSUNFKDB4ODA4NiwgMHgxNDA1KSB9LAorCXsgVVNCX0RFVklDRSgweDgwODYsIDB4MDE4MCkgfSwKKwl7IFVTQl9ERVZJQ0UoMHg4MDg2LCAweDAxODIpIH0sCisJeyBVU0JfREVWSUNFKDB4ODA4NiwgMHgxNDA2KSB9LAorCXsgVVNCX0RFVklDRSgweDgwODYsIDB4MTQwMykgfSwKKwl7IH0sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRSh1c2IsIGkyNDAwbXVfaWRfdGFibGUpOworCisKK3N0YXRpYworc3RydWN0IHVzYl9kcml2ZXIgaTI0MDBtdV9kcml2ZXIgPSB7CisJLm5hbWUgPSBLQlVJTERfTU9ETkFNRSwKKwkuc3VzcGVuZCA9IGkyNDAwbXVfc3VzcGVuZCwKKwkucmVzdW1lID0gaTI0MDBtdV9yZXN1bWUsCisJLnByb2JlID0gaTI0MDBtdV9wcm9iZSwKKwkuZGlzY29ubmVjdCA9IGkyNDAwbXVfZGlzY29ubmVjdCwKKwkuaWRfdGFibGUgPSBpMjQwMG11X2lkX3RhYmxlLAorCS5zdXBwb3J0c19hdXRvc3VzcGVuZCA9IDEsCit9OworCitzdGF0aWMKK2ludCBfX2luaXQgaTI0MDBtdV9kcml2ZXJfaW5pdCh2b2lkKQoreworCXJldHVybiB1c2JfcmVnaXN0ZXIoJmkyNDAwbXVfZHJpdmVyKTsKK30KK21vZHVsZV9pbml0KGkyNDAwbXVfZHJpdmVyX2luaXQpOworCisKK3N0YXRpYwordm9pZCBfX2V4aXQgaTI0MDBtdV9kcml2ZXJfZXhpdCh2b2lkKQoreworCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7CS8qIGZvciB0aGUgc3R1ZmYgd2Ugc2NoZWR1bGUgZnJvbSBzeXNmcy5jICovCisJdXNiX2RlcmVnaXN0ZXIoJmkyNDAwbXVfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KGkyNDAwbXVfZHJpdmVyX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJJbnRlbCBDb3Jwb3JhdGlvbiA8bGludXgtd2ltYXhAaW50ZWwuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJJbnRlbCAyNDAwTSBXaU1BWCBuZXR3b3JraW5nIGZvciBVU0IiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9GSVJNV0FSRShJMjQwME1VX0ZXX0ZJTEVfTkFNRSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGg1ay9kbWEuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aDVrL2RtYS5jCmluZGV4IDdlMmIxYTYuLmI2NWI0ZmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aDVrL2RtYS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aDVrL2RtYS5jCkBAIC01OTQsNyArNTk0LDcgQEAKIAkJICogWFhYOiBCTUlTUyBpbnRlcnJ1cHRzIG1heSBvY2N1ciBhZnRlciBhc3NvY2lhdGlvbi4KIAkJICogSSBmb3VuZCB0aGlzIG9uIDUyMTAgY29kZSBidXQgaXQgbmVlZHMgdGVzdGluZy4gSWYgdGhpcyBpcwogCQkgKiB0cnVlIHdlIHNob3VsZCBkaXNhYmxlIHRoZW0gYmVmb3JlIGFzc29jIGFuZCByZS1lbmFibGUgdGhlbQotCQkgKiBhZnRlciBhIHN1Y2Nlc3NmdWxsIGFzc29jICsgc29tZSBqaWZmaWVzLgorCQkgKiBhZnRlciBhIHN1Y2Nlc3NmdWwgYXNzb2MgKyBzb21lIGppZmZpZXMuCiAJCQlpbnRlcnJ1cHRfbWFzayAmPSB+QVI1S19JTlRfQk1JU1M7CiAJCSAqLwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0bWVsLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdG1lbC5jCmluZGV4IDM1MDE1N2YuLjQyMjM2NzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0bWVsLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRtZWwuYwpAQCAtMzgzNiw3ICszODM2LDcgQEAKIAkgICBUaGlzIHJvdXRpbmUgaXMgYWxzbyByZXNwb25zaWJsZSBmb3IgaW5pdGlhbGlzaW5nIHNvbWUKIAkgICBoYXJkd2FyZS1zcGVjaWZpYyBmaWVsZHMgaW4gdGhlIGF0bWVsX3ByaXZhdGUgc3RydWN0dXJlLAogCSAgIGluY2x1ZGluZyBhIGNvcHkgb2YgdGhlIGZpcm13YXJlJ3MgaG9zdGluZm8gc3R1Y3R1cmUKLQkgICB3aGljaCBpcyB0aGUgcm91dGUgaW50byB0aGUgcmVzdCBvZiB0aGUgZmlybWFyZSBkYXRhc3RydWN0dXJlcy4gKi8KKwkgICB3aGljaCBpcyB0aGUgcm91dGUgaW50byB0aGUgcmVzdCBvZiB0aGUgZmlybXdhcmUgZGF0YXN0cnVjdHVyZXMuICovCiAKIAlzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CiAJdTggY29uZmlndXJhdGlvbjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2lwdzJ4MDAvaXB3MjEwMC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXB3MngwMC9pcHcyMTAwLmMKaW5kZXggMTY2NzA2NS4uODIzYzJiZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXB3MngwMC9pcHcyMTAwLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXB3MngwMC9pcHcyMTAwLmMKQEAgLTEzMzIsNyArMTMzMiw3IEBACiAJCSAgICAgICBJUFdfQVVYX0hPU1RfUkVTRVRfUkVHX1NUT1BfTUFTVEVSKTsKIAogCS8qIFN0ZXAgMi4gV2FpdCBmb3Igc3RvcCBNYXN0ZXIgQXNzZXJ0Ci0JICogICAgICAgICAobm90IG1vcmUgdGhlbiA1MHVzLCBvdGhlcndpc2UgcmV0IGVycm9yICovCisJICogICAgICAgICAobm90IG1vcmUgdGhhbiA1MHVzLCBvdGhlcndpc2UgcmV0IGVycm9yICovCiAJaSA9IDU7CiAJZG8gewogCQl1ZGVsYXkoSVBXX1dBSVRfUkVTRVRfTUFTVEVSX0FTU0VSVF9DT01QTEVURV9ERUxBWSk7CkBAIC0xODMwLDcgKzE4MzAsNyBAQAogCQljYW5jZWxfZGVsYXllZF93b3JrKCZwcml2LT5yZl9raWxsKTsKIAl9CiAKLQkvKiBLaWxsIHRoZSBmaXJtYXJlIGhhbmcgY2hlY2sgdGltZXIgKi8KKwkvKiBLaWxsIHRoZSBmaXJtd2FyZSBoYW5nIGNoZWNrIHRpbWVyICovCiAJaWYgKCFwcml2LT5zdG9wX2hhbmdfY2hlY2spIHsKIAkJcHJpdi0+c3RvcF9oYW5nX2NoZWNrID0gMTsKIAkJY2FuY2VsX2RlbGF5ZWRfd29yaygmcHJpdi0+aGFuZ19jaGVjayk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyeDAwY3J5cHRvLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyeDAwY3J5cHRvLmMKaW5kZXggMzdhZDBkMi4uYWVlOWNiYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MngwMGNyeXB0by5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDJ4MDBjcnlwdG8uYwpAQCAtMTg0LDggKzE4NCw4IEBACiAJICogTWFrZSByb29tIGZvciBuZXcgZGF0YSwgbm90ZSB0aGF0IHdlIGluY3JlYXNlIGJvdGgKIAkgKiBoZWFkc2l6ZSBhbmQgdGFpbHNpemUgd2hlbiByZXF1aXJlZC4gVGhlIHRhaWxzaXplIGlzCiAJICogb25seSBuZWVkZWQgd2hlbiBJQ1YgZGF0YSBuZWVkcyB0byBiZSBpbnNlcnRlZCBhbmQKLQkgKiB0aGUgcGFkZGluZyBpcyBzbWFsbGVyIHRoZW4gdGhlIElDViBkYXRhLgotCSAqIFdoZW4gYWxpZ25tZW50IHJlcXVpcmVtZW50cyBpcyBncmVhdGVyIHRoZW4gdGhlCisJICogdGhlIHBhZGRpbmcgaXMgc21hbGxlciB0aGFuIHRoZSBJQ1YgZGF0YS4KKwkgKiBXaGVuIGFsaWdubWVudCByZXF1aXJlbWVudHMgaXMgZ3JlYXRlciB0aGFuIHRoZQogCSAqIElDViBkYXRhIHdlIG11c3QgdHJpbSB0aGUgc2tiIHRvIHRoZSBjb3JyZWN0IHNpemUKIAkgKiBiZWNhdXNlIHdlIG5lZWQgdG8gcmVtb3ZlIHRoZSBleHRyYSBieXRlcy4KIAkgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3N0cmlwLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9zdHJpcC5jCmluZGV4IGRkMGRlM2EuLjcwMTVmMjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3N0cmlwLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvc3RyaXAuYwpAQCAtMjM2LDcgKzIzNiw3IEBACiAJdW5zaWduZWQgbG9uZyB0eF9lcnJvcnM7CS8qIFBsYW5uZWQgc3R1ZmYgICAgICAgICAgICAgICAgKi8KIAl1bnNpZ25lZCBsb25nIHJ4X2Ryb3BwZWQ7CS8qIE5vIG1lbW9yeSBmb3Igc2tiICAgICAgICAgICAgKi8KIAl1bnNpZ25lZCBsb25nIHR4X2Ryb3BwZWQ7CS8qIFdoZW4gTVRVIGNoYW5nZSAgICAgICAgICAgICAgKi8KLQl1bnNpZ25lZCBsb25nIHJ4X292ZXJfZXJyb3JzOwkvKiBGcmFtZSBiaWdnZXIgdGhlbiBTVFJJUCBidWYuICovCisJdW5zaWduZWQgbG9uZyByeF9vdmVyX2Vycm9yczsJLyogRnJhbWUgYmlnZ2VyIHRoYW4gU1RSSVAgYnVmLiAqLwogCiAJdW5zaWduZWQgbG9uZyBwcHNfdGltZXI7CS8qIFRpbWVyIHRvIGRldGVybWluZSBwcHMgICAgICAgKi8KIAl1bnNpZ25lZCBsb25nIHJ4X3Bwc19jb3VudDsJLyogQ291bnRlciB0byBkZXRlcm1pbmUgcHBzICAgICAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfbWFjLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9tYWMuYwppbmRleCA5Y2FhOTZhLi5hNjExYWQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9tYWMuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9tYWMuYwpAQCAtMjg3LDcgKzI4Nyw3IEBACiAgKiBAc2tiIC0gYSBzay1idWZmZXIKICAqIEBmbGFnczogZXh0cmEgZmxhZ3MgdG8gc2V0IGluIHRoZSBUWCBzdGF0dXMgaW5mbwogICogQGFja3NzaTogQUNLIHNpZ25hbCBzdHJlbmd0aAotICogQHN1Y2Nlc3MgLSBUcnVlIGZvciBzdWNjZXNzZnVsbCB0cmFuc21pc3Npb24gb2YgdGhlIGZyYW1lCisgKiBAc3VjY2VzcyAtIFRydWUgZm9yIHN1Y2Nlc3NmdWwgdHJhbnNtaXNzaW9uIG9mIHRoZSBmcmFtZQogICoKICAqIFRoaXMgaW5mb3JtYXRpb24gY2FsbHMgaWVlZTgwMjExX3R4X3N0YXR1c19pcnFzYWZlKCkgaWYgcmVxdWlyZWQgYnkgdGhlCiAgKiBjb250cm9sIGluZm9ybWF0aW9uLiBJdCBjb3BpZXMgdGhlIGNvbnRyb2wgaW5mb3JtYXRpb24gaW50byB0aGUgc3RhdHVzCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC94ZW4tbmV0ZnJvbnQuYyBiL2RyaXZlcnMvbmV0L3hlbi1uZXRmcm9udC5jCmluZGV4IDc2MTYzNWIuLmNkNjE4NGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3hlbi1uZXRmcm9udC5jCisrKyBiL2RyaXZlcnMvbmV0L3hlbi1uZXRmcm9udC5jCkBAIC0xMTA1LDYgKzExMDUsMTYgQEAKIAlnbnR0YWJfZnJlZV9ncmFudF9yZWZlcmVuY2VzKG5wLT5ncmVmX3J4X2hlYWQpOwogfQogCitzdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIHhlbm5ldF9uZXRkZXZfb3BzID0geworCS5uZG9fb3BlbiAgICAgICAgICAgID0geGVubmV0X29wZW4sCisJLm5kb191bmluaXQgICAgICAgICAgPSB4ZW5uZXRfdW5pbml0LAorCS5uZG9fc3RvcCAgICAgICAgICAgID0geGVubmV0X2Nsb3NlLAorCS5uZG9fc3RhcnRfeG1pdCAgICAgID0geGVubmV0X3N0YXJ0X3htaXQsCisJLm5kb19jaGFuZ2VfbXR1CSAgICAgPSB4ZW5uZXRfY2hhbmdlX210dSwKKwkubmRvX3NldF9tYWNfYWRkcmVzcyA9IGV0aF9tYWNfYWRkciwKKwkubmRvX3ZhbGlkYXRlX2FkZHIgICA9IGV0aF92YWxpZGF0ZV9hZGRyLAorfTsKKwogc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICogX19kZXZpbml0IHhlbm5ldF9jcmVhdGVfZGV2KHN0cnVjdCB4ZW5idXNfZGV2aWNlICpkZXYpCiB7CiAJaW50IGksIGVycjsKQEAgLTExNjEsMTIgKzExNzEsOSBAQAogCQlnb3RvIGV4aXRfZnJlZV90eDsKIAl9CiAKLQluZXRkZXYtPm9wZW4gICAgICAgICAgICA9IHhlbm5ldF9vcGVuOwotCW5ldGRldi0+aGFyZF9zdGFydF94bWl0ID0geGVubmV0X3N0YXJ0X3htaXQ7Ci0JbmV0ZGV2LT5zdG9wICAgICAgICAgICAgPSB4ZW5uZXRfY2xvc2U7CisJbmV0ZGV2LT5uZXRkZXZfb3BzCT0gJnhlbm5ldF9uZXRkZXZfb3BzOworCiAJbmV0aWZfbmFwaV9hZGQobmV0ZGV2LCAmbnAtPm5hcGksIHhlbm5ldF9wb2xsLCA2NCk7Ci0JbmV0ZGV2LT51bmluaXQgICAgICAgICAgPSB4ZW5uZXRfdW5pbml0OwotCW5ldGRldi0+Y2hhbmdlX210dQk9IHhlbm5ldF9jaGFuZ2VfbXR1OwogCW5ldGRldi0+ZmVhdHVyZXMgICAgICAgID0gTkVUSUZfRl9JUF9DU1VNOwogCiAJU0VUX0VUSFRPT0xfT1BTKG5ldGRldiwgJnhlbm5ldF9ldGh0b29sX29wcyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL29wcm9maWxlL29wcm9maWxlZnMuYyBiL2RyaXZlcnMvb3Byb2ZpbGUvb3Byb2ZpbGVmcy5jCmluZGV4IGRkYzRjNTkuLmI3ZTRjZWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvb3Byb2ZpbGUvb3Byb2ZpbGVmcy5jCisrKyBiL2RyaXZlcnMvb3Byb2ZpbGUvb3Byb2ZpbGVmcy5jCkBAIC0yOSw5ICsyOSw2IEBACiAKIAlpZiAoaW5vZGUpIHsKIAkJaW5vZGUtPmlfbW9kZSA9IG1vZGU7Ci0JCWlub2RlLT5pX3VpZCA9IDA7Ci0JCWlub2RlLT5pX2dpZCA9IDA7Ci0JCWlub2RlLT5pX2Jsb2NrcyA9IDA7CiAJCWlub2RlLT5pX2F0aW1lID0gaW5vZGUtPmlfbXRpbWUgPSBpbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRTsKIAl9CiAJcmV0dXJuIGlub2RlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wYXJpc2MvZGluby5jIGIvZHJpdmVycy9wYXJpc2MvZGluby5jCmluZGV4IDNiYzU0YjMuLjc3Y2M4YmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGFyaXNjL2Rpbm8uYworKysgYi9kcml2ZXJzL3BhcmlzYy9kaW5vLmMKQEAgLTU0Nyw3ICs1NDcsNyBAQAogCSoqIFRoZSBhZGRpdGlvbmFsICItMSIgYWRqdXN0cyBmb3Igc2tld2luZyB0aGUgSVJRPC0+c2xvdC4KIAkqLwogCWRpbm9fY2ZnX3JlYWQoZGV2LT5idXMsIGRldi0+ZGV2Zm4sIFBDSV9JTlRFUlJVUFRfUElOLCAxLCAmaXJxX3Bpbik7IAotCWRldi0+aXJxID0gKGlycV9waW4gKyBQQ0lfU0xPVChkZXYtPmRldmZuKSAtIDEpICUgNCA7CisJZGV2LT5pcnEgPSBwY2lfc3dpenpsZV9pbnRlcnJ1cHRfcGluKGRldiwgaXJxX3BpbikgLSAxOwogCiAJLyogU2hvdWxkbid0IHJlYWxseSBuZWVkIHRvIGRvIHRoaXMgYnV0IGl0J3MgaW4gY2FzZSBzb21lb25lIHRyaWVzCiAJKiogdG8gYnlwYXNzIFBDSSBzZXJ2aWNlcyBhbmQgbG9vayBhdCB0aGUgY2FyZCB0aGVtc2VsdmVzLgpAQCAtNjcyLDcgKzY3Miw3IEBACiAJCQkKIAkJCWRpbm9fY2ZnX3JlYWQoZGV2LT5idXMsIGRldi0+ZGV2Zm4sIAogCQkJCSAgICAgIFBDSV9JTlRFUlJVUFRfUElOLCAxLCAmaXJxX3Bpbik7Ci0JCQlpcnFfcGluID0gKGlycV9waW4gKyBQQ0lfU0xPVChkZXYtPmRldmZuKSAtIDEpICUgNCA7CisJCQlpcnFfcGluID0gcGNpX3N3aXp6bGVfaW50ZXJydXB0X3BpbihkZXYsIGlycV9waW4pIC0gMTsKIAkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkRldmljZSAlcyBoYXMgdW5kZWZpbmVkIElSUSwgIgogCQkJCQkic2V0dGluZyB0byAlZFxuIiwgcGNpX25hbWUoZGV2KSwgaXJxX3Bpbik7CiAJCQlkaW5vX2NmZ193cml0ZShkZXYtPmJ1cywgZGV2LT5kZXZmbiwgCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BhcmlzYy9pb3NhcGljLmMgYi9kcml2ZXJzL3BhcmlzYy9pb3NhcGljLmMKaW5kZXggOWRlZGJiZC4uMDc5NzY1OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wYXJpc2MvaW9zYXBpYy5jCisrKyBiL2RyaXZlcnMvcGFyaXNjL2lvc2FwaWMuYwpAQCAtNTE5LDggKzUxOSw3IEBACiAJCSoqCiAJCSoqIEFkdmFudGFnZSBpcyBpdCdzIHJlYWxseSBlYXN5IHRvIGltcGxlbWVudC4KIAkJKi8KLQkJaW50cl9waW4gPSAoKGludHJfcGluLTEpK1BDSV9TTE9UKHBjaWRldi0+ZGV2Zm4pKSAlIDQ7Ci0JCWludHJfcGluKys7CS8qIGNvbnZlcnQgYmFjayB0byBJTlRBLUQgKDEtNCkgKi8KKwkJaW50cl9waW4gPSBwY2lfc3dpenpsZV9pbnRlcnJ1cHRfcGluKHBjaWRldiwgaW50cl9waW4pOwogI2VuZGlmIC8qIFBDSV9CUklER0VfRlVOQ1MgKi8KIAogCQkvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wYXJwb3J0L2llZWUxMjg0LmMgYi9kcml2ZXJzL3BhcnBvcnQvaWVlZTEyODQuYwppbmRleCBhYzJhODA1Li44OTAxZWNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BhcnBvcnQvaWVlZTEyODQuYworKysgYi9kcml2ZXJzL3BhcnBvcnQvaWVlZTEyODQuYwpAQCAtODQsNyArODQsNyBAQAogCiAJYWRkX3RpbWVyICgmdGltZXIpOwogCXJldCA9IGRvd25faW50ZXJydXB0aWJsZSAoJnBvcnQtPnBoeXNwb3J0LT5pZWVlMTI4NC5pcnEpOwotCWlmICghZGVsX3RpbWVyICgmdGltZXIpICYmICFyZXQpCisJaWYgKCFkZWxfdGltZXJfc3luYygmdGltZXIpICYmICFyZXQpCiAJCS8qIFRpbWVkIG91dC4gKi8KIAkJcmV0ID0gMTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvS2NvbmZpZyBiL2RyaXZlcnMvcGNpL0tjb25maWcKaW5kZXggZTFjYTQyNS4uMmE0NTAxZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvS2NvbmZpZworKysgYi9kcml2ZXJzL3BjaS9LY29uZmlnCkBAIC00Miw2ICs0MiwxNSBAQAogCiAJICBXaGVuIGluIGRvdWJ0LCBzYXkgTi4KIAorY29uZmlnIFBDSV9TVFVCCisJdHJpc3RhdGUgIlBDSSBTdHViIGRyaXZlciIKKwlkZXBlbmRzIG9uIFBDSQorCWhlbHAKKwkgIFNheSBZIG9yIE0gaGVyZSBpZiB5b3Ugd2FudCBiZSBhYmxlIHRvIHJlc2VydmUgYSBQQ0kgZGV2aWNlCisJICB3aGVuIGl0IGlzIGdvaW5nIHRvIGJlIGFzc2lnbmVkIHRvIGEgZ3Vlc3Qgb3BlcmF0aW5nIHN5c3RlbS4KKworCSAgV2hlbiBpbiBkb3VidCwgc2F5IE4uCisKIGNvbmZpZyBIVF9JUlEKIAlib29sICJJbnRlcnJ1cHRzIG9uIGh5cGVydHJhbnNwb3J0IGRldmljZXMiCiAJZGVmYXVsdCB5CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9NYWtlZmlsZSBiL2RyaXZlcnMvcGNpL01ha2VmaWxlCmluZGV4IGFmM2JmZTIuLjNkMDdjZTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvcGNpL01ha2VmaWxlCkBAIC01Myw2ICs1Myw4IEBACiAKIG9iai0kKENPTkZJR19QQ0lfU1lTQ0FMTCkgKz0gc3lzY2FsbC5vCiAKK29iai0kKENPTkZJR19QQ0lfU1RVQikgKz0gcGNpLXN0dWIubworCiBpZmVxICgkKENPTkZJR19QQ0lfREVCVUcpLHkpCiBFWFRSQV9DRkxBR1MgKz0gLURERUJVRwogZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2FjY2Vzcy5jIGIvZHJpdmVycy9wY2kvYWNjZXNzLmMKaW5kZXggMzliYjk2Yi4uMzgxNDQ0NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvYWNjZXNzLmMKKysrIGIvZHJpdmVycy9wY2kvYWNjZXNzLmMKQEAgLTY2LDYgKzY2LDM5IEBACiBFWFBPUlRfU1lNQk9MKHBjaV9idXNfd3JpdGVfY29uZmlnX3dvcmQpOwogRVhQT1JUX1NZTUJPTChwY2lfYnVzX3dyaXRlX2NvbmZpZ19kd29yZCk7CiAKKworLyoqCisgKiBwY2lfcmVhZF92cGQgLSBSZWFkIG9uZSBlbnRyeSBmcm9tIFZpdGFsIFByb2R1Y3QgRGF0YQorICogQGRldjoJcGNpIGRldmljZSBzdHJ1Y3QKKyAqIEBwb3M6CW9mZnNldCBpbiB2cGQgc3BhY2UKKyAqIEBjb3VudDoJbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQKKyAqIEBidWY6CXBvaW50ZXIgdG8gd2hlcmUgdG8gc3RvcmUgcmVzdWx0CisgKgorICovCitzc2l6ZV90IHBjaV9yZWFkX3ZwZChzdHJ1Y3QgcGNpX2RldiAqZGV2LCBsb2ZmX3QgcG9zLCBzaXplX3QgY291bnQsIHZvaWQgKmJ1ZikKK3sKKwlpZiAoIWRldi0+dnBkIHx8ICFkZXYtPnZwZC0+b3BzKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlyZXR1cm4gZGV2LT52cGQtPm9wcy0+cmVhZChkZXYsIHBvcywgY291bnQsIGJ1Zik7Cit9CitFWFBPUlRfU1lNQk9MKHBjaV9yZWFkX3ZwZCk7CisKKy8qKgorICogcGNpX3dyaXRlX3ZwZCAtIFdyaXRlIGVudHJ5IHRvIFZpdGFsIFByb2R1Y3QgRGF0YQorICogQGRldjoJcGNpIGRldmljZSBzdHJ1Y3QKKyAqIEBwb3M6CW9mZnNldCBpbiB2cGQgc3BhY2UKKyAqIEBjb3VudDoJbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQKKyAqIEB2YWw6CXZhbHVlIHRvIHdyaXRlCisgKgorICovCitzc2l6ZV90IHBjaV93cml0ZV92cGQoc3RydWN0IHBjaV9kZXYgKmRldiwgbG9mZl90IHBvcywgc2l6ZV90IGNvdW50LCBjb25zdCB2b2lkICpidWYpCit7CisJaWYgKCFkZXYtPnZwZCB8fCAhZGV2LT52cGQtPm9wcykKKwkJcmV0dXJuIC1FTk9ERVY7CisJcmV0dXJuIGRldi0+dnBkLT5vcHMtPndyaXRlKGRldiwgcG9zLCBjb3VudCwgYnVmKTsKK30KK0VYUE9SVF9TWU1CT0wocGNpX3dyaXRlX3ZwZCk7CisKIC8qCiAgKiBUaGUgZm9sbG93aW5nIHJvdXRpbmVzIGFyZSB0byBwcmV2ZW50IHRoZSB1c2VyIGZyb20gYWNjZXNzaW5nIFBDSSBjb25maWcKICAqIHNwYWNlIHdoZW4gaXQncyB1bnNhZmUgdG8gZG8gc28uICBTb21lIGRldmljZXMgcmVxdWlyZSB0aGlzIGR1cmluZyBCSVNUIGFuZApAQCAtMTMzLDEyNSArMTY2LDE0NSBAQAogCiBzdHJ1Y3QgcGNpX3ZwZF9wY2kyMiB7CiAJc3RydWN0IHBjaV92cGQgYmFzZTsKLQlzcGlubG9ja190IGxvY2s7IC8qIGNvbnRyb2xzIGFjY2VzcyB0byBoYXJkd2FyZSBhbmQgdGhlIGZsYWdzICovCi0JdTgJY2FwOworCXN0cnVjdCBtdXRleCBsb2NrOworCXUxNglmbGFnOwogCWJvb2wJYnVzeTsKLQlib29sCWZsYWc7IC8qIHZhbHVlIG9mIEYgYml0IHRvIHdhaXQgZm9yICovCisJdTgJY2FwOwogfTsKIAotLyogV2FpdCBmb3IgbGFzdCBvcGVyYXRpb24gdG8gY29tcGxldGUgKi8KKy8qCisgKiBXYWl0IGZvciBsYXN0IG9wZXJhdGlvbiB0byBjb21wbGV0ZS4KKyAqIFRoaXMgY29kZSBoYXMgdG8gc3BpbiBzaW5jZSB0aGVyZSBpcyBubyBvdGhlciBub3RpZmljYXRpb24gZnJvbSB0aGUgUENJCisgKiBoYXJkd2FyZS4gU2luY2UgdGhlIFZQRCBpcyBvZnRlbiBpbXBsZW1lbnRlZCBieSBzZXJpYWwgYXR0YWNobWVudCB0byBhbgorICogRUVQUk9NLCBpdCBtYXkgdGFrZSBtYW55IG1pbGxpc2Vjb25kcyB0byBjb21wbGV0ZS4KKyAqLwogc3RhdGljIGludCBwY2lfdnBkX3BjaTIyX3dhaXQoc3RydWN0IHBjaV9kZXYgKmRldikKIHsKIAlzdHJ1Y3QgcGNpX3ZwZF9wY2kyMiAqdnBkID0KIAkJY29udGFpbmVyX29mKGRldi0+dnBkLCBzdHJ1Y3QgcGNpX3ZwZF9wY2kyMiwgYmFzZSk7Ci0JdTE2IGZsYWcsIHN0YXR1czsKLQlpbnQgd2FpdDsKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQgPSBqaWZmaWVzICsgSFovMjAgKyAyOworCXUxNiBzdGF0dXM7CiAJaW50IHJldDsKIAogCWlmICghdnBkLT5idXN5KQogCQlyZXR1cm4gMDsKIAotCWZsYWcgPSB2cGQtPmZsYWcgPyBQQ0lfVlBEX0FERFJfRiA6IDA7Ci0Jd2FpdCA9IHZwZC0+ZmxhZyA/IDEwIDogMTAwMDsgLyogcmVhZDogMTAwIHVzOyB3cml0ZTogMTAgbXMgKi8KIAlmb3IgKDs7KSB7Ci0JCXJldCA9IHBjaV91c2VyX3JlYWRfY29uZmlnX3dvcmQoZGV2LAotCQkJCQkJdnBkLT5jYXAgKyBQQ0lfVlBEX0FERFIsCisJCXJldCA9IHBjaV91c2VyX3JlYWRfY29uZmlnX3dvcmQoZGV2LCB2cGQtPmNhcCArIFBDSV9WUERfQUREUiwKIAkJCQkJCSZzdGF0dXMpOwotCQlpZiAocmV0IDwgMCkKKwkJaWYgKHJldCkKIAkJCXJldHVybiByZXQ7Ci0JCWlmICgoc3RhdHVzICYgUENJX1ZQRF9BRERSX0YpID09IGZsYWcpIHsKKworCQlpZiAoKHN0YXR1cyAmIFBDSV9WUERfQUREUl9GKSA9PSB2cGQtPmZsYWcpIHsKIAkJCXZwZC0+YnVzeSA9IGZhbHNlOwogCQkJcmV0dXJuIDA7CiAJCX0KLQkJaWYgKHdhaXQtLSA9PSAwKQorCisJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpKQogCQkJcmV0dXJuIC1FVElNRURPVVQ7Ci0JCXVkZWxheSgxMCk7CisJCWlmIChmYXRhbF9zaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJCXJldHVybiAtRUlOVFI7CisJCWlmICghY29uZF9yZXNjaGVkKCkpCisJCQl1ZGVsYXkoMTApOwogCX0KIH0KIAotc3RhdGljIGludCBwY2lfdnBkX3BjaTIyX3JlYWQoc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IHBvcywgaW50IHNpemUsCi0JCQkgICAgICBjaGFyICpidWYpCitzdGF0aWMgc3NpemVfdCBwY2lfdnBkX3BjaTIyX3JlYWQoc3RydWN0IHBjaV9kZXYgKmRldiwgbG9mZl90IHBvcywgc2l6ZV90IGNvdW50LAorCQkJCSAgdm9pZCAqYXJnKQogewogCXN0cnVjdCBwY2lfdnBkX3BjaTIyICp2cGQgPQogCQljb250YWluZXJfb2YoZGV2LT52cGQsIHN0cnVjdCBwY2lfdnBkX3BjaTIyLCBiYXNlKTsKLQl1MzIgdmFsOwogCWludCByZXQ7Ci0JaW50IGJlZ2luLCBlbmQsIGk7CisJbG9mZl90IGVuZCA9IHBvcyArIGNvdW50OworCXU4ICpidWYgPSBhcmc7CiAKLQlpZiAocG9zIDwgMCB8fCBwb3MgPiB2cGQtPmJhc2UubGVuIHx8IHNpemUgPiB2cGQtPmJhc2UubGVuICAtIHBvcykKKwlpZiAocG9zIDwgMCB8fCBwb3MgPiB2cGQtPmJhc2UubGVuIHx8IGVuZCA+IHZwZC0+YmFzZS5sZW4pCiAJCXJldHVybiAtRUlOVkFMOwotCWlmIChzaXplID09IDApCi0JCXJldHVybiAwOwogCi0Jc3Bpbl9sb2NrX2lycSgmdnBkLT5sb2NrKTsKKwlpZiAobXV0ZXhfbG9ja19raWxsYWJsZSgmdnBkLT5sb2NrKSkKKwkJcmV0dXJuIC1FSU5UUjsKKwogCXJldCA9IHBjaV92cGRfcGNpMjJfd2FpdChkZXYpOwogCWlmIChyZXQgPCAwKQogCQlnb3RvIG91dDsKLQlyZXQgPSBwY2lfdXNlcl93cml0ZV9jb25maWdfd29yZChkZXYsIHZwZC0+Y2FwICsgUENJX1ZQRF9BRERSLAotCQkJCQkgcG9zICYgfjMpOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIG91dDsKLQl2cGQtPmJ1c3kgPSB0cnVlOwotCXZwZC0+ZmxhZyA9IDE7Ci0JcmV0ID0gcGNpX3ZwZF9wY2kyMl93YWl0KGRldik7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gb3V0OwotCXJldCA9IHBjaV91c2VyX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgdnBkLT5jYXAgKyBQQ0lfVlBEX0RBVEEsCi0JCQkJCSAmdmFsKTsKLW91dDoKLQlzcGluX3VubG9ja19pcnEoJnZwZC0+bG9jayk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7CiAKLQkvKiBDb252ZXJ0IHRvIGJ5dGVzICovCi0JYmVnaW4gPSBwb3MgJiAzOwotCWVuZCA9IG1pbig0LCBiZWdpbiArIHNpemUpOwotCWZvciAoaSA9IDA7IGkgPCBlbmQ7ICsraSkgewotCQlpZiAoaSA+PSBiZWdpbikKLQkJCSpidWYrKyA9IHZhbDsKLQkJdmFsID4+PSA4OworCXdoaWxlIChwb3MgPCBlbmQpIHsKKwkJdTMyIHZhbDsKKwkJdW5zaWduZWQgaW50IGksIHNraXA7CisKKwkJcmV0ID0gcGNpX3VzZXJfd3JpdGVfY29uZmlnX3dvcmQoZGV2LCB2cGQtPmNhcCArIFBDSV9WUERfQUREUiwKKwkJCQkJCSBwb3MgJiB+Myk7CisJCWlmIChyZXQgPCAwKQorCQkJYnJlYWs7CisJCXZwZC0+YnVzeSA9IHRydWU7CisJCXZwZC0+ZmxhZyA9IFBDSV9WUERfQUREUl9GOworCQlyZXQgPSBwY2lfdnBkX3BjaTIyX3dhaXQoZGV2KTsKKwkJaWYgKHJldCA8IDApCisJCQlicmVhazsKKworCQlyZXQgPSBwY2lfdXNlcl9yZWFkX2NvbmZpZ19kd29yZChkZXYsIHZwZC0+Y2FwICsgUENJX1ZQRF9EQVRBLCAmdmFsKTsKKwkJaWYgKHJldCA8IDApCisJCQlicmVhazsKKworCQlza2lwID0gcG9zICYgMzsKKwkJZm9yIChpID0gMDsgIGkgPCBzaXplb2YodTMyKTsgaSsrKSB7CisJCQlpZiAoaSA+PSBza2lwKSB7CisJCQkJKmJ1ZisrID0gdmFsOworCQkJCWlmICgrK3BvcyA9PSBlbmQpCisJCQkJCWJyZWFrOworCQkJfQorCQkJdmFsID4+PSA4OworCQl9CiAJfQotCXJldHVybiBlbmQgLSBiZWdpbjsKK291dDoKKwltdXRleF91bmxvY2soJnZwZC0+bG9jayk7CisJcmV0dXJuIHJldCA/IHJldCA6IGNvdW50OwogfQogCi1zdGF0aWMgaW50IHBjaV92cGRfcGNpMjJfd3JpdGUoc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IHBvcywgaW50IHNpemUsCi0JCQkgICAgICAgY29uc3QgY2hhciAqYnVmKQorc3RhdGljIHNzaXplX3QgcGNpX3ZwZF9wY2kyMl93cml0ZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBsb2ZmX3QgcG9zLCBzaXplX3QgY291bnQsCisJCQkJICAgY29uc3Qgdm9pZCAqYXJnKQogewogCXN0cnVjdCBwY2lfdnBkX3BjaTIyICp2cGQgPQogCQljb250YWluZXJfb2YoZGV2LT52cGQsIHN0cnVjdCBwY2lfdnBkX3BjaTIyLCBiYXNlKTsKLQl1MzIgdmFsOwotCWludCByZXQ7CisJY29uc3QgdTggKmJ1ZiA9IGFyZzsKKwlsb2ZmX3QgZW5kID0gcG9zICsgY291bnQ7CisJaW50IHJldCA9IDA7CiAKLQlpZiAocG9zIDwgMCB8fCBwb3MgPiB2cGQtPmJhc2UubGVuIHx8IHBvcyAmIDMgfHwKLQkgICAgc2l6ZSA+IHZwZC0+YmFzZS5sZW4gLSBwb3MgfHwgc2l6ZSA8IDQpCisJaWYgKHBvcyA8IDAgfHwgKHBvcyAmIDMpIHx8IChjb3VudCAmIDMpIHx8IGVuZCA+IHZwZC0+YmFzZS5sZW4pCiAJCXJldHVybiAtRUlOVkFMOwogCi0JdmFsID0gKHU4KSAqYnVmKys7Ci0JdmFsIHw9ICgodTgpICpidWYrKykgPDwgODsKLQl2YWwgfD0gKCh1OCkgKmJ1ZisrKSA8PCAxNjsKLQl2YWwgfD0gKCh1MzIpKHU4KSAqYnVmKyspIDw8IDI0OworCWlmIChtdXRleF9sb2NrX2tpbGxhYmxlKCZ2cGQtPmxvY2spKQorCQlyZXR1cm4gLUVJTlRSOwogCi0Jc3Bpbl9sb2NrX2lycSgmdnBkLT5sb2NrKTsKIAlyZXQgPSBwY2lfdnBkX3BjaTIyX3dhaXQoZGV2KTsKIAlpZiAocmV0IDwgMCkKIAkJZ290byBvdXQ7Ci0JcmV0ID0gcGNpX3VzZXJfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgdnBkLT5jYXAgKyBQQ0lfVlBEX0RBVEEsCi0JCQkJCSAgdmFsKTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBvdXQ7Ci0JcmV0ID0gcGNpX3VzZXJfd3JpdGVfY29uZmlnX3dvcmQoZGV2LCB2cGQtPmNhcCArIFBDSV9WUERfQUREUiwKLQkJCQkJIHBvcyB8IFBDSV9WUERfQUREUl9GKTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBvdXQ7Ci0JdnBkLT5idXN5ID0gdHJ1ZTsKLQl2cGQtPmZsYWcgPSAwOwotCXJldCA9IHBjaV92cGRfcGNpMjJfd2FpdChkZXYpOworCisJd2hpbGUgKHBvcyA8IGVuZCkgeworCQl1MzIgdmFsOworCisJCXZhbCA9ICpidWYrKzsKKwkJdmFsIHw9ICpidWYrKyA8PCA4OworCQl2YWwgfD0gKmJ1ZisrIDw8IDE2OworCQl2YWwgfD0gKmJ1ZisrIDw8IDI0OworCisJCXJldCA9IHBjaV91c2VyX3dyaXRlX2NvbmZpZ19kd29yZChkZXYsIHZwZC0+Y2FwICsgUENJX1ZQRF9EQVRBLCB2YWwpOworCQlpZiAocmV0IDwgMCkKKwkJCWJyZWFrOworCQlyZXQgPSBwY2lfdXNlcl93cml0ZV9jb25maWdfd29yZChkZXYsIHZwZC0+Y2FwICsgUENJX1ZQRF9BRERSLAorCQkJCQkJIHBvcyB8IFBDSV9WUERfQUREUl9GKTsKKwkJaWYgKHJldCA8IDApCisJCQlicmVhazsKKworCQl2cGQtPmJ1c3kgPSB0cnVlOworCQl2cGQtPmZsYWcgPSAwOworCQlyZXQgPSBwY2lfdnBkX3BjaTIyX3dhaXQoZGV2KTsKKworCQlwb3MgKz0gc2l6ZW9mKHUzMik7CisJfQogb3V0OgotCXNwaW5fdW5sb2NrX2lycSgmdnBkLT5sb2NrKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCXJldHVybiA0OworCW11dGV4X3VubG9jaygmdnBkLT5sb2NrKTsKKwlyZXR1cm4gcmV0ID8gcmV0IDogY291bnQ7CiB9CiAKIHN0YXRpYyB2b2lkIHBjaV92cGRfcGNpMjJfcmVsZWFzZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQpAQCAtMjU5LDcgKzMxMiw3IEBACiAJa2ZyZWUoY29udGFpbmVyX29mKGRldi0+dnBkLCBzdHJ1Y3QgcGNpX3ZwZF9wY2kyMiwgYmFzZSkpOwogfQogCi1zdGF0aWMgc3RydWN0IHBjaV92cGRfb3BzIHBjaV92cGRfcGNpMjJfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfdnBkX29wcyBwY2lfdnBkX3BjaTIyX29wcyA9IHsKIAkucmVhZCA9IHBjaV92cGRfcGNpMjJfcmVhZCwKIAkud3JpdGUgPSBwY2lfdnBkX3BjaTIyX3dyaXRlLAogCS5yZWxlYXNlID0gcGNpX3ZwZF9wY2kyMl9yZWxlYXNlLApAQCAtMjc5LDcgKzMzMiw3IEBACiAKIAl2cGQtPmJhc2UubGVuID0gUENJX1ZQRF9QQ0kyMl9TSVpFOwogCXZwZC0+YmFzZS5vcHMgPSAmcGNpX3ZwZF9wY2kyMl9vcHM7Ci0Jc3Bpbl9sb2NrX2luaXQoJnZwZC0+bG9jayk7CisJbXV0ZXhfaW5pdCgmdnBkLT5sb2NrKTsKIAl2cGQtPmNhcCA9IGNhcDsKIAl2cGQtPmJ1c3kgPSBmYWxzZTsKIAlkZXYtPnZwZCA9ICZ2cGQtPmJhc2U7CkBAIC0yODcsNiArMzQwLDI5IEBACiB9CiAKIC8qKgorICogcGNpX3ZwZF90cnVuY2F0ZSAtIFNldCBhdmFpbGFibGUgVml0YWwgUHJvZHVjdCBEYXRhIHNpemUKKyAqIEBkZXY6CXBjaSBkZXZpY2Ugc3RydWN0CisgKiBAc2l6ZToJYXZhaWxhYmxlIG1lbW9yeSBpbiBieXRlcworICoKKyAqIEFkanVzdCBzaXplIG9mIGF2YWlsYWJsZSBWUEQgYXJlYS4KKyAqLworaW50IHBjaV92cGRfdHJ1bmNhdGUoc3RydWN0IHBjaV9kZXYgKmRldiwgc2l6ZV90IHNpemUpCit7CisJaWYgKCFkZXYtPnZwZCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBsaW1pdGVkIGJ5IHRoZSBhY2Nlc3MgbWV0aG9kICovCisJaWYgKHNpemUgPiBkZXYtPnZwZC0+bGVuKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRldi0+dnBkLT5sZW4gPSBzaXplOworCWRldi0+dnBkLT5hdHRyLT5zaXplID0gc2l6ZTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChwY2lfdnBkX3RydW5jYXRlKTsKKworLyoqCiAgKiBwY2lfYmxvY2tfdXNlcl9jZmdfYWNjZXNzIC0gQmxvY2sgdXNlcnNwYWNlIFBDSSBjb25maWcgcmVhZHMvd3JpdGVzCiAgKiBAZGV2OglwY2kgZGV2aWNlIHN0cnVjdAogICoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2J1cy5jIGIvZHJpdmVycy9wY2kvYnVzLmMKaW5kZXggOTk5Y2M0MC4uNTJiNTRmMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvYnVzLmMKKysrIGIvZHJpdmVycy9wY2kvYnVzLmMKQEAgLTcxLDcgKzcxLDcgQEAKIH0KIAogLyoqCi0gKiBhZGQgYSBzaW5nbGUgZGV2aWNlCisgKiBwY2lfYnVzX2FkZF9kZXZpY2UgLSBhZGQgYSBzaW5nbGUgZGV2aWNlCiAgKiBAZGV2OiBkZXZpY2UgdG8gYWRkCiAgKgogICogVGhpcyBhZGRzIGEgc2luZ2xlIHBjaSBkZXZpY2UgdG8gdGhlIGdsb2JhbApAQCAtOTEsNiArOTEsMzcgQEAKIH0KIAogLyoqCisgKiBwY2lfYnVzX2FkZF9jaGlsZCAtIGFkZCBhIGNoaWxkIGJ1cworICogQGJ1czogYnVzIHRvIGFkZAorICoKKyAqIFRoaXMgYWRkcyBzeXNmcyBlbnRyaWVzIGZvciBhIHNpbmdsZSBidXMKKyAqLworaW50IHBjaV9idXNfYWRkX2NoaWxkKHN0cnVjdCBwY2lfYnVzICpidXMpCit7CisJaW50IHJldHZhbDsKKworCWlmIChidXMtPmJyaWRnZSkKKwkJYnVzLT5kZXYucGFyZW50ID0gYnVzLT5icmlkZ2U7CisKKwlyZXR2YWwgPSBkZXZpY2VfcmVnaXN0ZXIoJmJ1cy0+ZGV2KTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCisJYnVzLT5pc19hZGRlZCA9IDE7CisKKwlyZXR2YWwgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJmJ1cy0+ZGV2LCAmZGV2X2F0dHJfY3B1YWZmaW5pdHkpOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisKKwlyZXR2YWwgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJmJ1cy0+ZGV2LCAmZGV2X2F0dHJfY3B1bGlzdGFmZmluaXR5KTsKKworCS8qIENyZWF0ZSBsZWdhY3lfaW8gYW5kIGxlZ2FjeV9tZW0gZmlsZXMgZm9yIHRoaXMgYnVzICovCisJcGNpX2NyZWF0ZV9sZWdhY3lfZmlsZXMoYnVzKTsKKworCXJldHVybiByZXR2YWw7Cit9CisKKy8qKgogICogcGNpX2J1c19hZGRfZGV2aWNlcyAtIGluc2VydCBuZXdseSBkaXNjb3ZlcmVkIFBDSSBkZXZpY2VzCiAgKiBAYnVzOiBidXMgdG8gY2hlY2sgZm9yIG5ldyBkZXZpY2VzCiAgKgpAQCAtMTA1LDcgKzEzNiw3IEBACiB2b2lkIHBjaV9idXNfYWRkX2RldmljZXMoc3RydWN0IHBjaV9idXMgKmJ1cykKIHsKIAlzdHJ1Y3QgcGNpX2RldiAqZGV2OwotCXN0cnVjdCBwY2lfYnVzICpjaGlsZF9idXM7CisJc3RydWN0IHBjaV9idXMgKmNoaWxkOwogCWludCByZXR2YWw7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRldiwgJmJ1cy0+ZGV2aWNlcywgYnVzX2xpc3QpIHsKQEAgLTEyMCw0NSArMTUxLDI5IEBACiAJbGlzdF9mb3JfZWFjaF9lbnRyeShkZXYsICZidXMtPmRldmljZXMsIGJ1c19saXN0KSB7CiAJCUJVR19PTighZGV2LT5pc19hZGRlZCk7CiAKKwkJY2hpbGQgPSBkZXYtPnN1Ym9yZGluYXRlOwogCQkvKgogCQkgKiBJZiB0aGVyZSBpcyBhbiB1bmF0dGFjaGVkIHN1Ym9yZGluYXRlIGJ1cywgYXR0YWNoCiAJCSAqIGl0IGFuZCB0aGVuIHNjYW4gZm9yIHVuYXR0YWNoZWQgUENJIGRldmljZXMuCiAJCSAqLwotCQlpZiAoZGV2LT5zdWJvcmRpbmF0ZSkgewotCQkgICAgICAgaWYgKGxpc3RfZW1wdHkoJmRldi0+c3Vib3JkaW5hdGUtPm5vZGUpKSB7Ci0JCQkgICAgICAgZG93bl93cml0ZSgmcGNpX2J1c19zZW0pOwotCQkJICAgICAgIGxpc3RfYWRkX3RhaWwoJmRldi0+c3Vib3JkaW5hdGUtPm5vZGUsCi0JCQkJCSAgICAgICAmZGV2LT5idXMtPmNoaWxkcmVuKTsKLQkJCSAgICAgICB1cF93cml0ZSgmcGNpX2J1c19zZW0pOwotCQkJfQotCQkJcGNpX2J1c19hZGRfZGV2aWNlcyhkZXYtPnN1Ym9yZGluYXRlKTsKLQotCQkJLyogcmVnaXN0ZXIgdGhlIGJ1cyB3aXRoIHN5c2ZzIGFzIHRoZSBwYXJlbnQgaXMgbm93Ci0JCQkgKiBwcm9wZXJseSByZWdpc3RlcmVkLiAqLwotCQkJY2hpbGRfYnVzID0gZGV2LT5zdWJvcmRpbmF0ZTsKLQkJCWlmIChjaGlsZF9idXMtPmlzX2FkZGVkKQotCQkJCWNvbnRpbnVlOwotCQkJY2hpbGRfYnVzLT5kZXYucGFyZW50ID0gY2hpbGRfYnVzLT5icmlkZ2U7Ci0JCQlyZXR2YWwgPSBkZXZpY2VfcmVnaXN0ZXIoJmNoaWxkX2J1cy0+ZGV2KTsKLQkJCWlmIChyZXR2YWwpCi0JCQkJZGV2X2VycigmZGV2LT5kZXYsICJFcnJvciByZWdpc3RlcmluZyBwY2lfYnVzLCIKLQkJCQkJIiBjb250aW51aW5nLi4uXG4iKTsKLQkJCWVsc2UgewotCQkJCWNoaWxkX2J1cy0+aXNfYWRkZWQgPSAxOwotCQkJCXJldHZhbCA9IGRldmljZV9jcmVhdGVfZmlsZSgmY2hpbGRfYnVzLT5kZXYsCi0JCQkJCQkJJmRldl9hdHRyX2NwdWFmZmluaXR5KTsKLQkJCX0KLQkJCWlmIChyZXR2YWwpCi0JCQkJZGV2X2VycigmZGV2LT5kZXYsICJFcnJvciBjcmVhdGluZyBjcHVhZmZpbml0eSIKLQkJCQkJIiBmaWxlLCBjb250aW51aW5nLi4uXG4iKTsKLQotCQkJcmV0dmFsID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZjaGlsZF9idXMtPmRldiwKLQkJCQkJCSZkZXZfYXR0cl9jcHVsaXN0YWZmaW5pdHkpOwotCQkJaWYgKHJldHZhbCkKLQkJCQlkZXZfZXJyKCZkZXYtPmRldiwKLQkJCQkJIkVycm9yIGNyZWF0aW5nIGNwdWxpc3RhZmZpbml0eSIKLQkJCQkJIiBmaWxlLCBjb250aW51aW5nLi4uXG4iKTsKKwkJaWYgKCFjaGlsZCkKKwkJCWNvbnRpbnVlOworCQlpZiAobGlzdF9lbXB0eSgmY2hpbGQtPm5vZGUpKSB7CisJCQlkb3duX3dyaXRlKCZwY2lfYnVzX3NlbSk7CisJCQlsaXN0X2FkZF90YWlsKCZjaGlsZC0+bm9kZSwgJmRldi0+YnVzLT5jaGlsZHJlbik7CisJCQl1cF93cml0ZSgmcGNpX2J1c19zZW0pOwogCQl9CisJCXBjaV9idXNfYWRkX2RldmljZXMoY2hpbGQpOworCisJCS8qCisJCSAqIHJlZ2lzdGVyIHRoZSBidXMgd2l0aCBzeXNmcyBhcyB0aGUgcGFyZW50IGlzIG5vdworCQkgKiBwcm9wZXJseSByZWdpc3RlcmVkLgorCQkgKi8KKwkJaWYgKGNoaWxkLT5pc19hZGRlZCkKKwkJCWNvbnRpbnVlOworCQlyZXR2YWwgPSBwY2lfYnVzX2FkZF9jaGlsZChjaGlsZCk7CisJCWlmIChyZXR2YWwpCisJCQlkZXZfZXJyKCZkZXYtPmRldiwgIkVycm9yIGFkZGluZyBidXMsIGNvbnRpbnVpbmdcbiIpOwogCX0KIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG90cGx1Zy9NYWtlZmlsZSBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvTWFrZWZpbGUKaW5kZXggOWJkYmUxYS4uZTMxZmI5MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvaG90cGx1Zy9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL01ha2VmaWxlCkBAIC01NSw2ICs1NSw5IEBACiAJCQkJcGNpZWhwX2N0cmwubwlcCiAJCQkJcGNpZWhwX3BjaS5vCVwKIAkJCQlwY2llaHBfaHBjLm8KK2lmZGVmIENPTkZJR19BQ1BJCitwY2llaHAtb2JqcwkJKz0JcGNpZWhwX2FjcGkubworZW5kaWYKIAogc2hwY2hwLW9ianMJCTo9CXNocGNocF9jb3JlLm8JXAogCQkJCXNocGNocF9jdHJsLm8JXApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG90cGx1Zy9hY3BpX3BjaWhwLmMgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL2FjcGlfcGNpaHAuYwppbmRleCBlMTdlZjU0Li5jNjJhYjhkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL2FjcGlfcGNpaHAuYworKysgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL2FjcGlfcGNpaHAuYwpAQCAtNTAxLDUgKzUwMSw3NCBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwoYWNwaV9yb290X2JyaWRnZSk7CiAKKworc3RhdGljIGludCBpc19lamVjdGFibGUoYWNwaV9oYW5kbGUgaGFuZGxlKQoreworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlhY3BpX2hhbmRsZSB0bXA7CisJdW5zaWduZWQgbG9uZyBsb25nIHJlbW92YWJsZTsKKwlzdGF0dXMgPSBhY3BpX2dldF9oYW5kbGUoaGFuZGxlLCAiX0FEUiIsICZ0bXApOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKKwkJcmV0dXJuIDA7CisJc3RhdHVzID0gYWNwaV9nZXRfaGFuZGxlKGhhbmRsZSwgIl9FSjAiLCAmdG1wKTsKKwlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpCisJCXJldHVybiAxOworCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfaW50ZWdlcihoYW5kbGUsICJfUk1WIiwgTlVMTCwgJnJlbW92YWJsZSk7CisJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpICYmIHJlbW92YWJsZSkKKwkJcmV0dXJuIDE7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogYWNwaV9wY2locF9jaGVja19lamVjdGFibGUgLSBjaGVjayBpZiBoYW5kbGUgaXMgZWplY3RhYmxlIEFDUEkgUENJIHNsb3QKKyAqIEBwYnVzOiB0aGUgUENJIGJ1cyBvZiB0aGUgUENJIHNsb3QgY29ycmVzcG9uZGluZyB0byAnaGFuZGxlJworICogQGhhbmRsZTogQUNQSSBoYW5kbGUgdG8gY2hlY2sKKyAqCisgKiBSZXR1cm4gMSBpZiBoYW5kbGUgaXMgZWplY3RhYmxlIFBDSSBzbG90LCAwIG90aGVyd2lzZS4KKyAqLworaW50IGFjcGlfcGNpX2NoZWNrX2VqZWN0YWJsZShzdHJ1Y3QgcGNpX2J1cyAqcGJ1cywgYWNwaV9oYW5kbGUgaGFuZGxlKQoreworCWFjcGlfaGFuZGxlIGJyaWRnZV9oYW5kbGUsIHBhcmVudF9oYW5kbGU7CisKKwlpZiAoIShicmlkZ2VfaGFuZGxlID0gYWNwaV9wY2lfZ2V0X2JyaWRnZV9oYW5kbGUocGJ1cykpKQorCQlyZXR1cm4gMDsKKwlpZiAoKEFDUElfRkFJTFVSRShhY3BpX2dldF9wYXJlbnQoaGFuZGxlLCAmcGFyZW50X2hhbmRsZSkpKSkKKwkJcmV0dXJuIDA7CisJaWYgKGJyaWRnZV9oYW5kbGUgIT0gcGFyZW50X2hhbmRsZSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIGlzX2VqZWN0YWJsZShoYW5kbGUpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoYWNwaV9wY2lfY2hlY2tfZWplY3RhYmxlKTsKKworc3RhdGljIGFjcGlfc3RhdHVzCitjaGVja19ob3RwbHVnKGFjcGlfaGFuZGxlIGhhbmRsZSwgdTMyIGx2bCwgdm9pZCAqY29udGV4dCwgdm9pZCAqKnJ2KQoreworCWludCAqZm91bmQgPSAoaW50ICopY29udGV4dDsKKwlpZiAoaXNfZWplY3RhYmxlKGhhbmRsZSkpIHsKKwkJKmZvdW5kID0gMTsKKwkJcmV0dXJuIEFFX0NUUkxfVEVSTUlOQVRFOworCX0KKwlyZXR1cm4gQUVfT0s7Cit9CisKKy8qKgorICogYWNwaV9wY2lfZGV0ZWN0X2VqZWN0YWJsZSAtIGNoZWNrIGlmIHRoZSBQQ0kgYnVzIGhhcyBlamVjdGFibGUgc2xvdHMKKyAqIEBwYnVzIC0gUENJIGJ1cyB0byBzY2FuCisgKgorICogUmV0dXJucyAxIGlmIHRoZSBQQ0kgYnVzIGhhcyBBQ1BJIGJhc2VkIGVqZWN0YWJsZSBzbG90cywgMCBvdGhlcndpc2UuCisgKi8KK2ludCBhY3BpX3BjaV9kZXRlY3RfZWplY3RhYmxlKHN0cnVjdCBwY2lfYnVzICpwYnVzKQoreworCWFjcGlfaGFuZGxlIGhhbmRsZTsKKwlpbnQgZm91bmQgPSAwOworCisJaWYgKCEoaGFuZGxlID0gYWNwaV9wY2lfZ2V0X2JyaWRnZV9oYW5kbGUocGJ1cykpKQorCQlyZXR1cm4gMDsKKwlhY3BpX3dhbGtfbmFtZXNwYWNlKEFDUElfVFlQRV9ERVZJQ0UsIGhhbmRsZSwgKHUzMikxLAorCQkJICAgIGNoZWNrX2hvdHBsdWcsICh2b2lkICopJmZvdW5kLCBOVUxMKTsKKwlyZXR1cm4gZm91bmQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChhY3BpX3BjaV9kZXRlY3RfZWplY3RhYmxlKTsKKwogbW9kdWxlX3BhcmFtKGRlYnVnX2FjcGksIGJvb2wsIDA2NDQpOwogTU9EVUxFX1BBUk1fREVTQyhkZWJ1Z19hY3BpLCAiRGVidWdnaW5nIG1vZGUgZm9yIEFDUEkgZW5hYmxlZCBvciBub3QiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvYWNwaXBocC5oIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9hY3BpcGhwLmgKaW5kZXggOWJjYjZjYi4uNGZjMTY4YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvaG90cGx1Zy9hY3BpcGhwLmgKKysrIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9hY3BpcGhwLmgKQEAgLTQ0LDcgKzQ0LDcgQEAKIAlkbyB7CQkJCQkJCVwKIAkJaWYgKGFjcGlwaHBfZGVidWcpCQkJCVwKIAkJCXByaW50ayhLRVJOX0RFQlVHICIlczogIiBmb3JtYXQsCVwKLQkJCQlNWV9OQU1FICwgIyMgYXJnKTsgCQlcCisJCQkJTVlfTkFNRSAsICMjIGFyZyk7CQlcCiAJfSB3aGlsZSAoMCkKICNkZWZpbmUgZXJyKGZvcm1hdCwgYXJnLi4uKSBwcmludGsoS0VSTl9FUlIgIiVzOiAiIGZvcm1hdCwgTVlfTkFNRSAsICMjIGFyZykKICNkZWZpbmUgaW5mbyhmb3JtYXQsIGFyZy4uLikgcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICIgZm9ybWF0LCBNWV9OQU1FICwgIyMgYXJnKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG90cGx1Zy9hY3BpcGhwX2dsdWUuYyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvYWNwaXBocF9nbHVlLmMKaW5kZXggM2FmZmM2NC4uZjA5YjEwMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvaG90cGx1Zy9hY3BpcGhwX2dsdWUuYworKysgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL2FjcGlwaHBfZ2x1ZS5jCkBAIC00Niw2ICs0Niw3IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpX2hvdHBsdWcuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2ktYWNwaS5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAKICNpbmNsdWRlICIuLi9wY2kuaCIKQEAgLTYyLDYxICs2Myw2IEBACiBzdGF0aWMgdm9pZCBhY3BpcGhwX3NldF9ocHBfdmFsdWVzKGFjcGlfaGFuZGxlIGhhbmRsZSwgc3RydWN0IHBjaV9idXMgKmJ1cyk7CiBzdGF0aWMgdm9pZCBoYW5kbGVfaG90cGx1Z19ldmVudF9mdW5jKGFjcGlfaGFuZGxlIGhhbmRsZSwgdTMyIHR5cGUsIHZvaWQgKmNvbnRleHQpOwogCi0KLS8qCi0gKiBpbml0aWFsaXphdGlvbiAmIHRlcm1pbmF0YXRpb24gcm91dGluZXMKLSAqLwotCi0vKioKLSAqIGlzX2VqZWN0YWJsZSAtIGRldGVybWluZSBpZiBhIHNsb3QgaXMgZWplY3RhYmxlCi0gKiBAaGFuZGxlOiBoYW5kbGUgdG8gYWNwaSBuYW1lc3BhY2UKLSAqCi0gKiBFamVjdGFibGUgc2xvdCBzaG91bGQgc2F0aXNmeSBhdCBsZWFzdCB0aGVzZSBjb25kaXRpb25zOgotICoKLSAqICAxLiBoYXMgX0FEUiBtZXRob2QKLSAqICAyLiBoYXMgX0VKMCBtZXRob2QKLSAqCi0gKiBvcHRpb25hbGx5Ci0gKgotICogIDEuIGhhcyBfU1RBIG1ldGhvZAotICogIDIuIGhhcyBfUFMwIG1ldGhvZAotICogIDMuIGhhcyBfUFMzIG1ldGhvZAotICogIDQuIC4uCi0gKi8KLXN0YXRpYyBpbnQgaXNfZWplY3RhYmxlKGFjcGlfaGFuZGxlIGhhbmRsZSkKLXsKLQlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0JYWNwaV9oYW5kbGUgdG1wOwotCi0Jc3RhdHVzID0gYWNwaV9nZXRfaGFuZGxlKGhhbmRsZSwgIl9BRFIiLCAmdG1wKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJcmV0dXJuIDA7Ci0JfQotCi0Jc3RhdHVzID0gYWNwaV9nZXRfaGFuZGxlKGhhbmRsZSwgIl9FSjAiLCAmdG1wKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JcmV0dXJuIDE7Ci19Ci0KLQotLyogY2FsbGJhY2sgcm91dGluZSB0byBjaGVjayBmb3IgdGhlIGV4aXN0ZW5jZSBvZiBlamVjdGFibGUgc2xvdHMgKi8KLXN0YXRpYyBhY3BpX3N0YXR1cwotaXNfZWplY3RhYmxlX3Nsb3QoYWNwaV9oYW5kbGUgaGFuZGxlLCB1MzIgbHZsLCB2b2lkICpjb250ZXh0LCB2b2lkICoqcnYpCi17Ci0JaW50ICpjb3VudCA9IChpbnQgKiljb250ZXh0OwotCi0JaWYgKGlzX2VqZWN0YWJsZShoYW5kbGUpKSB7Ci0JCSgqY291bnQpKys7Ci0JCS8qIG9ubHkgb25lIGVqZWN0YWJsZSBzbG90IGlzIGVub3VnaCAqLwotCQlyZXR1cm4gQUVfQ1RSTF9URVJNSU5BVEU7Ci0JfSBlbHNlIHsKLQkJcmV0dXJuIEFFX09LOwotCX0KLX0KLQogLyogY2FsbGJhY2sgcm91dGluZSB0byBjaGVjayBmb3IgdGhlIGV4aXN0ZW5jZSBvZiBhIHBjaSBkb2NrIGRldmljZSAqLwogc3RhdGljIGFjcGlfc3RhdHVzCiBpc19wY2lfZG9ja19kZXZpY2UoYWNwaV9oYW5kbGUgaGFuZGxlLCB1MzIgbHZsLCB2b2lkICpjb250ZXh0LCB2b2lkICoqcnYpCkBAIC0xMzEsOSArNzcsNiBAQAogCX0KIH0KIAotCi0KLQogLyoKICAqIHRoZSBfRENLIG1ldGhvZCBjYW4gZG8gZnVubnkgdGhpbmdzLi4uIGFuZCBzb21ldGltZXMgbm90CiAgKiBoYWgtaGFoIGZ1bm55LgpAQCAtMTYwLDkgKzEwMyw5IEBACiAKIAlpZiAoKChidXNlcyA+PiA4KSAmIDB4ZmYpICE9IGJ1cy0+c2Vjb25kYXJ5KSB7CiAJCWJ1c2VzID0gKGJ1c2VzICYgMHhmZjAwMDAwMCkKLQkgICAgIAkJfCAoKHVuc2lnbmVkIGludCkoYnVzLT5wcmltYXJ5KSAgICAgPDwgIDApCi0JICAgICAJCXwgKCh1bnNpZ25lZCBpbnQpKGJ1cy0+c2Vjb25kYXJ5KSAgIDw8ICA4KQotCSAgICAgCQl8ICgodW5zaWduZWQgaW50KShidXMtPnN1Ym9yZGluYXRlKSA8PCAxNik7CisJCQl8ICgodW5zaWduZWQgaW50KShidXMtPnByaW1hcnkpICAgICA8PCAgMCkKKwkJCXwgKCh1bnNpZ25lZCBpbnQpKGJ1cy0+c2Vjb25kYXJ5KSAgIDw8ICA4KQorCQkJfCAoKHVuc2lnbmVkIGludCkoYnVzLT5zdWJvcmRpbmF0ZSkgPDwgMTYpOwogCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGJ1cy0+c2VsZiwgUENJX1BSSU1BUllfQlVTLCBidXNlcyk7CiAJfQogCXJldHVybiBOT1RJRllfT0s7CkBAIC0xODQsMTcgKzEyNywxMiBAQAogCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOwogCXVuc2lnbmVkIGxvbmcgbG9uZyBhZHIsIHN1bjsKIAlpbnQgZGV2aWNlLCBmdW5jdGlvbiwgcmV0dmFsOworCXN0cnVjdCBwY2lfYnVzICpwYnVzID0gYnJpZGdlLT5wY2lfYnVzOwogCi0Jc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9pbnRlZ2VyKGhhbmRsZSwgIl9BRFIiLCBOVUxMLCAmYWRyKTsKLQotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKKwlpZiAoIWFjcGlfcGNpX2NoZWNrX2VqZWN0YWJsZShwYnVzLCBoYW5kbGUpICYmICFpc19kb2NrX2RldmljZShoYW5kbGUpKQogCQlyZXR1cm4gQUVfT0s7CiAKLQlzdGF0dXMgPSBhY3BpX2dldF9oYW5kbGUoaGFuZGxlLCAiX0VKMCIsICZ0bXApOwotCi0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpICYmICEoaXNfZG9ja19kZXZpY2UoaGFuZGxlKSkpCi0JCXJldHVybiBBRV9PSzsKLQorCWFjcGlfZXZhbHVhdGVfaW50ZWdlcihoYW5kbGUsICJfQURSIiwgTlVMTCwgJmFkcik7CiAJZGV2aWNlID0gKGFkciA+PiAxNikgJiAweGZmZmY7CiAJZnVuY3Rpb24gPSBhZHIgJiAweGZmZmY7CiAKQEAgLTIwNSw3ICsxNDMsOCBAQAogCUlOSVRfTElTVF9IRUFEKCZuZXdmdW5jLT5zaWJsaW5nKTsKIAluZXdmdW5jLT5oYW5kbGUgPSBoYW5kbGU7CiAJbmV3ZnVuYy0+ZnVuY3Rpb24gPSBmdW5jdGlvbjsKLQlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpCisKKwlpZiAoQUNQSV9TVUNDRVNTKGFjcGlfZ2V0X2hhbmRsZShoYW5kbGUsICJfRUowIiwgJnRtcCkpKQogCQluZXdmdW5jLT5mbGFncyA9IEZVTkNfSEFTX0VKMDsKIAogCWlmIChBQ1BJX1NVQ0NFU1MoYWNwaV9nZXRfaGFuZGxlKGhhbmRsZSwgIl9TVEEiLCAmdG1wKSkpCkBAIC0yNTYsOCArMTk1LDcgQEAKIAkJYnJpZGdlLT5ucl9zbG90cysrOwogCiAJCWRiZygiZm91bmQgQUNQSSBQQ0kgSG90cGx1ZyBzbG90ICVsbHUgYXQgUENJICUwNHg6JTAyeDolMDJ4XG4iLAotCQkJCXNsb3QtPnN1biwgcGNpX2RvbWFpbl9ucihicmlkZ2UtPnBjaV9idXMpLAotCQkJCWJyaWRnZS0+cGNpX2J1cy0+bnVtYmVyLCBzbG90LT5kZXZpY2UpOworCQkgICAgc2xvdC0+c3VuLCBwY2lfZG9tYWluX25yKHBidXMpLCBwYnVzLT5udW1iZXIsIGRldmljZSk7CiAJCXJldHZhbCA9IGFjcGlwaHBfcmVnaXN0ZXJfaG90cGx1Z19zbG90KHNsb3QpOwogCQlpZiAocmV0dmFsKSB7CiAJCQlpZiAocmV0dmFsID09IC1FQlVTWSkKQEAgLTI3NCw4ICsyMTIsNyBAQAogCWxpc3RfYWRkX3RhaWwoJm5ld2Z1bmMtPnNpYmxpbmcsICZzbG90LT5mdW5jcyk7CiAKIAkvKiBhc3NvY2lhdGUgY29ycmVzcG9uZGluZyBwY2lfZGV2ICovCi0JbmV3ZnVuYy0+cGNpX2RldiA9IHBjaV9nZXRfc2xvdChicmlkZ2UtPnBjaV9idXMsCi0JCQkJCSBQQ0lfREVWRk4oZGV2aWNlLCBmdW5jdGlvbikpOworCW5ld2Z1bmMtPnBjaV9kZXYgPSBwY2lfZ2V0X3Nsb3QocGJ1cywgUENJX0RFVkZOKGRldmljZSwgZnVuY3Rpb24pKTsKIAlpZiAobmV3ZnVuYy0+cGNpX2RldikgewogCQlzbG90LT5mbGFncyB8PSAoU0xPVF9FTkFCTEVEIHwgU0xPVF9QT1dFUkVET04pOwogCX0KQEAgLTMyNCwyNyArMjYxLDE1IEBACiAKIAogLyogc2VlIGlmIGl0J3Mgd29ydGggbG9va2luZyBhdCB0aGlzIGJyaWRnZSAqLwotc3RhdGljIGludCBkZXRlY3RfZWplY3RhYmxlX3Nsb3RzKGFjcGlfaGFuZGxlICpicmlkZ2VfaGFuZGxlKQorc3RhdGljIGludCBkZXRlY3RfZWplY3RhYmxlX3Nsb3RzKHN0cnVjdCBwY2lfYnVzICpwYnVzKQogewotCWFjcGlfc3RhdHVzIHN0YXR1czsKLQlpbnQgY291bnQ7Ci0KLQljb3VudCA9IDA7Ci0KLQkvKiBvbmx5IGNoZWNrIHNsb3RzIGRlZmluZWQgZGlyZWN0bHkgYmVsb3cgYnJpZGdlIG9iamVjdCAqLwotCXN0YXR1cyA9IGFjcGlfd2Fsa19uYW1lc3BhY2UoQUNQSV9UWVBFX0RFVklDRSwgYnJpZGdlX2hhbmRsZSwgKHUzMikxLAotCQkJCSAgICAgaXNfZWplY3RhYmxlX3Nsb3QsICh2b2lkICopJmNvdW50LCBOVUxMKTsKLQotCS8qCi0JICogd2UgYWxzbyBuZWVkIHRvIGFkZCB0aGlzIGJyaWRnZSBpZiB0aGVyZSBpcyBhIGRvY2sgYnJpZGdlIG9yCi0JICogb3RoZXIgcGNpIGRldmljZSBvbiBhIGRvY2sgc3RhdGlvbiAocmVtb3ZhYmxlKQotCSAqLwotCWlmICghY291bnQpCi0JCXN0YXR1cyA9IGFjcGlfd2Fsa19uYW1lc3BhY2UoQUNQSV9UWVBFX0RFVklDRSwgYnJpZGdlX2hhbmRsZSwKLQkJCQkodTMyKTEsIGlzX3BjaV9kb2NrX2RldmljZSwgKHZvaWQgKikmY291bnQsCi0JCQkJTlVMTCk7Ci0KLQlyZXR1cm4gY291bnQ7CisJaW50IGZvdW5kID0gYWNwaV9wY2lfZGV0ZWN0X2VqZWN0YWJsZShwYnVzKTsKKwlpZiAoIWZvdW5kKSB7CisJCWFjcGlfaGFuZGxlIGJyaWRnZV9oYW5kbGUgPSBhY3BpX3BjaV9nZXRfYnJpZGdlX2hhbmRsZShwYnVzKTsKKwkJYWNwaV93YWxrX25hbWVzcGFjZShBQ1BJX1RZUEVfREVWSUNFLCBicmlkZ2VfaGFuZGxlLCAodTMyKTEsCisJCQkJICAgIGlzX3BjaV9kb2NrX2RldmljZSwgKHZvaWQgKikmZm91bmQsIE5VTEwpOworCX0KKwlyZXR1cm4gZm91bmQ7CiB9CiAKIApAQCAtNTU0LDcgKzQ3OSw3IEBACiAJCWdvdG8gb3V0OwogCiAJLyogY2hlY2sgaWYgdGhpcyBicmlkZ2UgaGFzIGVqZWN0YWJsZSBzbG90cyAqLwotCWlmICgoZGV0ZWN0X2VqZWN0YWJsZV9zbG90cyhoYW5kbGUpID4gMCkpIHsKKwlpZiAoKGRldGVjdF9lamVjdGFibGVfc2xvdHMoZGV2LT5zdWJvcmRpbmF0ZSkgPiAwKSkgewogCQlkYmcoImZvdW5kIFBDSS10by1QQ0kgYnJpZGdlIGF0IFBDSSAlc1xuIiwgcGNpX25hbWUoZGV2KSk7CiAJCWFkZF9wMnBfYnJpZGdlKGhhbmRsZSwgZGV2KTsKIAl9CkBAIC02MTUsNyArNTQwLDcgQEAKIAl9CiAKIAkvKiBjaGVjayBpZiB0aGlzIGJyaWRnZSBoYXMgZWplY3RhYmxlIHNsb3RzICovCi0JaWYgKGRldGVjdF9lamVjdGFibGVfc2xvdHMoaGFuZGxlKSA+IDApIHsKKwlpZiAoZGV0ZWN0X2VqZWN0YWJsZV9zbG90cyhwY2lfYnVzKSA+IDApIHsKIAkJZGJnKCJmb3VuZCBQQ0kgaG9zdC1idXMgYnJpZGdlIHdpdGggaG90LXBsdWdnYWJsZSBzbG90c1xuIik7CiAJCWFkZF9ob3N0X2JyaWRnZShoYW5kbGUsIHBjaV9idXMpOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvYWNwaXBocF9pYm0uYyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvYWNwaXBocF9pYm0uYwppbmRleCA4ODFmZGQyLi41YmVmYTdlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL2FjcGlwaHBfaWJtLmMKKysrIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9hY3BpcGhwX2libS5jCkBAIC0yNzEsNyArMjcxLDcgQEAKIAkJZGJnKCIlczogZ2VuZXJhdGlvbmcgYnVzIGV2ZW50XG4iLCBfX2Z1bmNfXyk7CiAJCWFjcGlfYnVzX2dlbmVyYXRlX3Byb2NfZXZlbnQobm90ZS0+ZGV2aWNlLCBub3RlLT5ldmVudCwgZGV0YWlsKTsKIAkJYWNwaV9idXNfZ2VuZXJhdGVfbmV0bGlua19ldmVudChub3RlLT5kZXZpY2UtPnBucC5kZXZpY2VfY2xhc3MsCi0JCQkJCQkgIG5vdGUtPmRldmljZS0+ZGV2LmJ1c19pZCwKKwkJCQkJCSAgZGV2X25hbWUoJm5vdGUtPmRldmljZS0+ZGV2KSwKIAkJCQkJCSAgbm90ZS0+ZXZlbnQsIGRldGFpbCk7CiAJfSBlbHNlCiAJCW5vdGUtPmV2ZW50ID0gZXZlbnQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3RwbHVnL2NwcXBocF9jdHJsLmMgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL2NwcXBocF9jdHJsLmMKaW5kZXggYTYwYTI1Mi4uY2MyMjdhOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvaG90cGx1Zy9jcHFwaHBfY3RybC5jCisrKyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvY3BxcGhwX2N0cmwuYwpAQCAtMTk1NCw3ICsxOTU0LDcgQEAKIAkJCXJldHVybiA7CiAJCX0KIAotCQlpZiAoZnVuYyAhPSBOVUxMICYmIGN0cmwgIT0gTlVMTCkgeworCQlpZiAoY3RybCAhPSBOVUxMKSB7CiAJCQlpZiAoY3BxaHBfcHJvY2Vzc19TSShjdHJsLCBmdW5jKSAhPSAwKSB7CiAJCQkJYW1iZXJfTEVEX29uKGN0cmwsIGhwX3Nsb3QpOwogCQkJCWdyZWVuX0xFRF9vZmYoY3RybCwgaHBfc2xvdCk7CkBAIC0yNjA0LDcgKzI2MDQsNyBAQAogCQkJZm9yIChjbG9vcCA9IDA7IGNsb29wIDwgNDsgY2xvb3ArKykgewogCQkJCWlmIChpcnFzLnZhbGlkX0lOVCAmICgweDAxIDw8IGNsb29wKSkgewogCQkJCQlyYyA9IGNwcWhwX3NldF9pcnEoZnVuYy0+YnVzLCBmdW5jLT5kZXZpY2UsCi0JCQkJCQkJICAgMHgwQSArIGNsb29wLCBpcnFzLmludGVycnVwdFtjbG9vcF0pOworCQkJCQkJCSAgIGNsb29wICsgMSwgaXJxcy5pbnRlcnJ1cHRbY2xvb3BdKTsKIAkJCQkJaWYgKHJjKQogCQkJCQkJZ290byBmcmVlX2FuZF9vdXQ7CiAJCQkJfQpAQCAtMjk0NSw3ICsyOTQ1LDcgQEAKIAkJfQogCiAJCWlmICghYmVoaW5kX2JyaWRnZSkgewotCQkJcmMgPSBjcHFocF9zZXRfaXJxKGZ1bmMtPmJ1cywgZnVuYy0+ZGV2aWNlLCB0ZW1wX2J5dGUgKyAweDA5LCBJUlEpOworCQkJcmMgPSBjcHFocF9zZXRfaXJxKGZ1bmMtPmJ1cywgZnVuYy0+ZGV2aWNlLCB0ZW1wX2J5dGUsIElSUSk7CiAJCQlpZiAocmMpCiAJCQkJcmV0dXJuIDE7CiAJCX0gZWxzZSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3RwbHVnL2NwcXBocF9wY2kuYyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvY3BxcGhwX3BjaS5jCmluZGV4IGRmMTQ2YmUuLjZjMGVkMGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvY3BxcGhwX3BjaS5jCisrKyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvY3BxcGhwX3BjaS5jCkBAIC0xNzEsNyArMTcxLDcgQEAKIAkJZmFrZWJ1cy0+bnVtYmVyID0gYnVzX251bTsKIAkJZGJnKCIlczogZGV2ICVkLCBidXMgJWQsIHBpbiAlZCwgbnVtICVkXG4iLAogCQkgICAgX19mdW5jX18sIGRldl9udW0sIGJ1c19udW0sIGludF9waW4sIGlycV9udW0pOwotCQlyYyA9IHBjaWJpb3Nfc2V0X2lycV9yb3V0aW5nKGZha2VkZXYsIGludF9waW4gLSAweDBhLCBpcnFfbnVtKTsKKwkJcmMgPSBwY2liaW9zX3NldF9pcnFfcm91dGluZyhmYWtlZGV2LCBpbnRfcGluIC0gMSwgaXJxX251bSk7CiAJCWtmcmVlKGZha2VkZXYpOwogCQlrZnJlZShmYWtlYnVzKTsKIAkJZGJnKCIlczogcmMgJWRcbiIsIF9fZnVuY19fLCByYyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3RwbHVnL2Zha2VwaHAuYyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvZmFrZXBocC5jCmluZGV4IDNhMjYzN2EuLmIwZTdkZTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvZmFrZXBocC5jCisrKyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvZmFrZXBocC5jCkBAIC0zMjQsNiArMzI0LDcgQEAKIAogCQlpZiAodGVzdF9hbmRfc2V0X2JpdCgwLCAmZHNsb3QtPnJlbW92ZWQpKSB7CiAJCQlkYmcoIlNsb3QgYWxyZWFkeSBzY2hlZHVsZWQgZm9yIHJlbW92YWxcbiIpOworCQkJcGNpX2Rldl9wdXQoZGV2KTsKIAkJCXJldHVybiAtRU5PREVWOwogCQl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpZWhwLmggYi9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWVocC5oCmluZGV4IGIyODAxYTcuLjI3ZmQxOGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpZWhwLmgKKysrIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2llaHAuaApAQCAtMjIwLDExICsyMjAsMjMgQEAKICNpbmNsdWRlIDxhY3BpL2FjdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9wY2ktYWNwaS5oPgogCitleHRlcm4gdm9pZCBfX2luaXQgcGNpZWhwX2FjcGlfc2xvdF9kZXRlY3Rpb25faW5pdCh2b2lkKTsKK2V4dGVybiBpbnQgcGNpZWhwX2FjcGlfc2xvdF9kZXRlY3Rpb25fY2hlY2soc3RydWN0IHBjaV9kZXYgKmRldik7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwY2llaHBfZmlybXdhcmVfaW5pdCh2b2lkKQoreworCXBjaWVocF9hY3BpX3Nsb3RfZGV0ZWN0aW9uX2luaXQoKTsKK30KKwogc3RhdGljIGlubGluZSBpbnQgcGNpZWhwX2dldF9ocF9od19jb250cm9sX2Zyb21fZmlybXdhcmUoc3RydWN0IHBjaV9kZXYgKmRldikKIHsKKwlpbnQgcmV0dmFsOwogCXUzMiBmbGFncyA9IChPU0NfUENJX0VYUFJFU1NfTkFUSVZFX0hQX0NPTlRST0wgfAogCQkgICAgIE9TQ19QQ0lfRVhQUkVTU19DQVBfU1RSVUNUVVJFX0NPTlRST0wpOwotCXJldHVybiBhY3BpX2dldF9ocF9od19jb250cm9sX2Zyb21fZmlybXdhcmUoZGV2LCBmbGFncyk7CisJcmV0dmFsID0gYWNwaV9nZXRfaHBfaHdfY29udHJvbF9mcm9tX2Zpcm13YXJlKGRldiwgZmxhZ3MpOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisJcmV0dXJuIHBjaWVocF9hY3BpX3Nsb3RfZGV0ZWN0aW9uX2NoZWNrKGRldik7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IHBjaWVocF9nZXRfaHBfcGFyYW1zX2Zyb21fZmlybXdhcmUoc3RydWN0IHBjaV9kZXYgKmRldiwKQEAgLTIzNSw2ICsyNDcsNyBAQAogCXJldHVybiAwOwogfQogI2Vsc2UKKyNkZWZpbmUgcGNpZWhwX2Zpcm13YXJlX2luaXQoKQkJCQlkbyB7fSB3aGlsZSAoMCkKICNkZWZpbmUgcGNpZWhwX2dldF9ocF9od19jb250cm9sX2Zyb21fZmlybXdhcmUoZGV2KSAJMAogI2RlZmluZSBwY2llaHBfZ2V0X2hwX3BhcmFtc19mcm9tX2Zpcm13YXJlKGRldiwgaHBwKSAgICAoLUVOT0RFVikKICNlbmRpZiAJCQkJLyogQ09ORklHX0FDUEkgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpZWhwX2FjcGkuYyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpZWhwX2FjcGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzhkNzk1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2llaHBfYWNwaS5jCkBAIC0wLDAgKzEsMTQxIEBACisvKgorICogQUNQSSByZWxhdGVkIGZ1bmN0aW9ucyBmb3IgUENJIEV4cHJlc3MgSG90IFBsdWcgZHJpdmVyLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBLZW5qaSBLYW5lc2hpZ2UKKyAqIENvcHlyaWdodCAoQykgMjAwOCBGdWppdHN1IExpbWl0ZWQuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAorICogeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgR09PRCBUSVRMRSBvcgorICogTk9OIElORlJJTkdFTUVOVC4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUKKyAqIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2lfaG90cGx1Zy5oPgorI2luY2x1ZGUgInBjaWVocC5oIgorCisjZGVmaW5lIFBDSUVIUF9ERVRFQ1RfUENJRQkoMCkKKyNkZWZpbmUgUENJRUhQX0RFVEVDVF9BQ1BJCSgxKQorI2RlZmluZSBQQ0lFSFBfREVURUNUX0FVVE8JKDIpCisjZGVmaW5lIFBDSUVIUF9ERVRFQ1RfREVGQVVMVAlQQ0lFSFBfREVURUNUX0FVVE8KKworc3RhdGljIGludCBzbG90X2RldGVjdGlvbl9tb2RlOworc3RhdGljIGNoYXIgKnBjaWVocF9kZXRlY3RfbW9kZTsKK21vZHVsZV9wYXJhbShwY2llaHBfZGV0ZWN0X21vZGUsIGNoYXJwLCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MocGNpZWhwX2RldGVjdF9tb2RlLAorCSAiU2xvdCBkZXRlY3Rpb24gbW9kZTogcGNpZSwgYWNwaSwgYXV0b1xuIgorCSAiICBwY2llICAgICAgICAgIC0gVXNlIFBDSWUgYmFzZWQgc2xvdCBkZXRlY3Rpb25cbiIKKwkgIiAgYWNwaSAgICAgICAgICAtIFVzZSBBQ1BJIGZvciBzbG90IGRldGVjdGlvblxuIgorCSAiICBhdXRvKGRlZmF1bHQpIC0gQXV0byBzZWxlY3QgbW9kZS4gVXNlIGFjcGkgb3B0aW9uIGlmIGR1cGxpY2F0ZVxuIgorCSAiICAgICAgICAgICAgICAgICAgc2xvdCBpZHMgYXJlIGZvdW5kLiBPdGhlcndpc2UsIHVzZSBwY2llIG9wdGlvblxuIik7CisKK2ludCBwY2llaHBfYWNwaV9zbG90X2RldGVjdGlvbl9jaGVjayhzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCWlmIChzbG90X2RldGVjdGlvbl9tb2RlICE9IFBDSUVIUF9ERVRFQ1RfQUNQSSkKKwkJcmV0dXJuIDA7CisJaWYgKGFjcGlfcGNpX2RldGVjdF9lamVjdGFibGUoZGV2LT5zdWJvcmRpbmF0ZSkpCisJCXJldHVybiAwOworCXJldHVybiAtRU5PREVWOworfQorCitzdGF0aWMgaW50IF9faW5pdCBwYXJzZV9kZXRlY3RfbW9kZSh2b2lkKQoreworCWlmICghcGNpZWhwX2RldGVjdF9tb2RlKQorCQlyZXR1cm4gUENJRUhQX0RFVEVDVF9ERUZBVUxUOworCWlmICghc3RyY21wKHBjaWVocF9kZXRlY3RfbW9kZSwgInBjaWUiKSkKKwkJcmV0dXJuIFBDSUVIUF9ERVRFQ1RfUENJRTsKKwlpZiAoIXN0cmNtcChwY2llaHBfZGV0ZWN0X21vZGUsICJhY3BpIikpCisJCXJldHVybiBQQ0lFSFBfREVURUNUX0FDUEk7CisJaWYgKCFzdHJjbXAocGNpZWhwX2RldGVjdF9tb2RlLCAiYXV0byIpKQorCQlyZXR1cm4gUENJRUhQX0RFVEVDVF9BVVRPOworCXdhcm4oImJhZCBzcGVjaWZpZXIgJyVzJyBmb3IgcGNpZWhwX2RldGVjdF9tb2RlLiBVc2UgZGVmYXVsdFxuIiwKKwkgICAgIHBjaWVocF9kZXRlY3RfbW9kZSk7CisJcmV0dXJuIFBDSUVIUF9ERVRFQ1RfREVGQVVMVDsKK30KKworc3RhdGljIHN0cnVjdCBwY2llX3BvcnRfc2VydmljZV9pZCBfX2luaXRkYXRhIHBvcnRfcGNpX2lkc1tdID0geworCXsKKwkJLnZlbmRvciA9IFBDSV9BTllfSUQsCisJCS5kZXZpY2UgPSBQQ0lfQU5ZX0lELAorCQkucG9ydF90eXBlID0gUENJRV9BTllfUE9SVCwKKwkJLnNlcnZpY2VfdHlwZSA9IFBDSUVfUE9SVF9TRVJWSUNFX0hQLAorCQkuZHJpdmVyX2RhdGEgPSAgMCwKKyAgICAgICAgfSwgeyAvKiBlbmQ6IGFsbCB6ZXJvZXMgKi8gfQorfTsKKworc3RhdGljIGludCBfX2luaXRkYXRhIGR1cF9zbG90X2lkOworc3RhdGljIGludCBfX2luaXRkYXRhIGFjcGlfc2xvdF9kZXRlY3RlZDsKK3N0YXRpYyBzdHJ1Y3QgbGlzdF9oZWFkIF9faW5pdGRhdGEgZHVtbXlfc2xvdHMgPSBMSVNUX0hFQURfSU5JVChkdW1teV9zbG90cyk7CisKKy8qIER1bW15IGRyaXZlciBmb3IgZHVtcGxpY2F0ZSBuYW1lIGRldGVjdGlvbiAqLworc3RhdGljIGludCBfX2luaXQgZHVtbXlfcHJvYmUoc3RydWN0IHBjaWVfZGV2aWNlICpkZXYsCisJCQkgICAgICBjb25zdCBzdHJ1Y3QgcGNpZV9wb3J0X3NlcnZpY2VfaWQgKmlkKQoreworCWludCBwb3M7CisJdTMyIHNsb3RfY2FwOworCXN0cnVjdCBzbG90ICpzbG90LCAqdG1wOworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gZGV2LT5wb3J0OworCXN0cnVjdCBwY2lfYnVzICpwYnVzID0gcGRldi0+c3Vib3JkaW5hdGU7CisJaWYgKCEoc2xvdCA9IGt6YWxsb2Moc2l6ZW9mKCpzbG90KSwgR0ZQX0tFUk5FTCkpKQorCQlyZXR1cm4gLUVOT01FTTsKKwkvKiBOb3RlOiBwY2llaHBfZGV0ZWN0X21vZGUgIT0gUENJRUhQX0RFVEVDVF9BQ1BJIGhlcmUgKi8KKwlpZiAocGNpZWhwX2dldF9ocF9od19jb250cm9sX2Zyb21fZmlybXdhcmUocGRldikpCisJCXJldHVybiAtRU5PREVWOworCWlmICghKHBvcyA9IHBjaV9maW5kX2NhcGFiaWxpdHkocGRldiwgUENJX0NBUF9JRF9FWFApKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBkZXYsIHBvcyArIFBDSV9FWFBfU0xUQ0FQLCAmc2xvdF9jYXApOworCXNsb3QtPm51bWJlciA9IHNsb3RfY2FwID4+IDE5OworCWxpc3RfZm9yX2VhY2hfZW50cnkodG1wLCAmZHVtbXlfc2xvdHMsIHNsb3RfbGlzdCkgeworCQlpZiAodG1wLT5udW1iZXIgPT0gc2xvdC0+bnVtYmVyKQorCQkJZHVwX3Nsb3RfaWQrKzsKKwl9CisJbGlzdF9hZGRfdGFpbCgmc2xvdC0+c2xvdF9saXN0LCAmZHVtbXlfc2xvdHMpOworCWlmICghYWNwaV9zbG90X2RldGVjdGVkICYmIGFjcGlfcGNpX2RldGVjdF9lamVjdGFibGUocGJ1cykpCisJCWFjcGlfc2xvdF9kZXRlY3RlZCA9IDE7CisJcmV0dXJuIC1FTk9ERVY7ICAgICAgICAgLyogZHVtbXkgZHJpdmVyIGFsd2F5cyByZXR1cm5zIGVycm9yICovCit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpZV9wb3J0X3NlcnZpY2VfZHJpdmVyIF9faW5pdGRhdGEgZHVtbXlfZHJpdmVyID0geworICAgICAgICAubmFtZSAgICAgICAgICAgPSAicGNpZWhwX2R1bW15IiwKKyAgICAgICAgLmlkX3RhYmxlICAgICAgID0gcG9ydF9wY2lfaWRzLAorICAgICAgICAucHJvYmUgICAgICAgICAgPSBkdW1teV9wcm9iZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHNlbGVjdF9kZXRlY3Rpb25fbW9kZSh2b2lkKQoreworCXN0cnVjdCBzbG90ICpzbG90LCAqdG1wOworCXBjaWVfcG9ydF9zZXJ2aWNlX3JlZ2lzdGVyKCZkdW1teV9kcml2ZXIpOworCXBjaWVfcG9ydF9zZXJ2aWNlX3VucmVnaXN0ZXIoJmR1bW15X2RyaXZlcik7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHNsb3QsIHRtcCwgJmR1bW15X3Nsb3RzLCBzbG90X2xpc3QpIHsKKwkJbGlzdF9kZWwoJnNsb3QtPnNsb3RfbGlzdCk7CisJCWtmcmVlKHNsb3QpOworCX0KKwlpZiAoYWNwaV9zbG90X2RldGVjdGVkICYmIGR1cF9zbG90X2lkKQorCQlyZXR1cm4gUENJRUhQX0RFVEVDVF9BQ1BJOworCXJldHVybiBQQ0lFSFBfREVURUNUX1BDSUU7Cit9CisKK3ZvaWQgX19pbml0IHBjaWVocF9hY3BpX3Nsb3RfZGV0ZWN0aW9uX2luaXQodm9pZCkKK3sKKwlzbG90X2RldGVjdGlvbl9tb2RlID0gcGFyc2VfZGV0ZWN0X21vZGUoKTsKKwlpZiAoc2xvdF9kZXRlY3Rpb25fbW9kZSAhPSBQQ0lFSFBfREVURUNUX0FVVE8pCisJCWdvdG8gb3V0OworCXNsb3RfZGV0ZWN0aW9uX21vZGUgPSBzZWxlY3RfZGV0ZWN0aW9uX21vZGUoKTsKK291dDoKKwlpZiAoc2xvdF9kZXRlY3Rpb25fbW9kZSA9PSBQQ0lFSFBfREVURUNUX0FDUEkpCisJCWluZm8oIlVzaW5nIEFDUEkgZm9yIHNsb3QgZGV0ZWN0aW9uLlxuIik7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWVocF9jb3JlLmMgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWVocF9jb3JlLmMKaW5kZXggMzljZjI0OC4uNTQ4MmQ0ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2llaHBfY29yZS5jCisrKyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpZWhwX2NvcmUuYwpAQCAtNTIyLDYgKzUyMiw3IEBACiB7CiAJaW50IHJldHZhbCA9IDA7CiAKKwlwY2llaHBfZmlybXdhcmVfaW5pdCgpOwogCXJldHZhbCA9IHBjaWVfcG9ydF9zZXJ2aWNlX3JlZ2lzdGVyKCZocGRyaXZlcl9wb3J0ZHJ2KTsKICAJZGJnKCJwY2llX3BvcnRfc2VydmljZV9yZWdpc3RlciA9ICVkXG4iLCByZXR2YWwpOwogICAJaW5mbyhEUklWRVJfREVTQyAiIHZlcnNpb246ICIgRFJJVkVSX1ZFUlNJT04gIlxuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWVocF9jdHJsLmMgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWVocF9jdHJsLmMKaW5kZXggZmVhZDYzYy4uZmY0MDM0NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2llaHBfY3RybC5jCisrKyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpZWhwX2N0cmwuYwpAQCAtMTc4LDE1ICsxNzgsMTQgQEAKIAkJCQkgIklzc3VlIG9mIFNsb3QgUG93ZXIgT2ZmIGNvbW1hbmQgZmFpbGVkXG4iKTsKIAkJCXJldHVybjsKIAkJfQorCQkvKgorCQkgKiBBZnRlciB0dXJuaW5nIHBvd2VyIG9mZiwgd2UgbXVzdCB3YWl0IGZvciBhdCBsZWFzdCAxIHNlY29uZAorCQkgKiBiZWZvcmUgdGFraW5nIGFueSBhY3Rpb24gdGhhdCByZWxpZXMgb24gcG93ZXIgaGF2aW5nIGJlZW4KKwkJICogcmVtb3ZlZCBmcm9tIHRoZSBzbG90L2FkYXB0ZXIuCisJCSAqLworCQltc2xlZXAoMTAwMCk7CiAJfQogCi0JLyoKLQkgKiBBZnRlciB0dXJuaW5nIHBvd2VyIG9mZiwgd2UgbXVzdCB3YWl0IGZvciBhdCBsZWFzdCAxIHNlY29uZAotCSAqIGJlZm9yZSB0YWtpbmcgYW55IGFjdGlvbiB0aGF0IHJlbGllcyBvbiBwb3dlciBoYXZpbmcgYmVlbgotCSAqIHJlbW92ZWQgZnJvbSB0aGUgc2xvdC9hZGFwdGVyLgotCSAqLwotCW1zbGVlcCgxMDAwKTsKLQogCWlmIChQV1JfTEVEKGN0cmwpKQogCQlwc2xvdC0+aHBjX29wcy0+Z3JlZW5fbGVkX29mZihwc2xvdCk7CiAKQEAgLTI4NiwxNSArMjg1LDE0IEBACiAJCQkJICJJc3N1ZSBvZiBTbG90IERpc2FibGUgY29tbWFuZCBmYWlsZWRcbiIpOwogCQkJcmV0dXJuIHJldHZhbDsKIAkJfQorCQkvKgorCQkgKiBBZnRlciB0dXJuaW5nIHBvd2VyIG9mZiwgd2UgbXVzdCB3YWl0IGZvciBhdCBsZWFzdCAxIHNlY29uZAorCQkgKiBiZWZvcmUgdGFraW5nIGFueSBhY3Rpb24gdGhhdCByZWxpZXMgb24gcG93ZXIgaGF2aW5nIGJlZW4KKwkJICogcmVtb3ZlZCBmcm9tIHRoZSBzbG90L2FkYXB0ZXIuCisJCSAqLworCQltc2xlZXAoMTAwMCk7CiAJfQogCi0JLyoKLQkgKiBBZnRlciB0dXJuaW5nIHBvd2VyIG9mZiwgd2UgbXVzdCB3YWl0IGZvciBhdCBsZWFzdCAxIHNlY29uZAotCSAqIGJlZm9yZSB0YWtpbmcgYW55IGFjdGlvbiB0aGF0IHJlbGllcyBvbiBwb3dlciBoYXZpbmcgYmVlbgotCSAqIHJlbW92ZWQgZnJvbSB0aGUgc2xvdC9hZGFwdGVyLgotCSAqLwotCW1zbGVlcCgxMDAwKTsKLQogCWlmIChQV1JfTEVEKGN0cmwpKQogCQkvKiB0dXJuIG9mZiBHcmVlbiBMRUQgKi8KIAkJcF9zbG90LT5ocGNfb3BzLT5ncmVlbl9sZWRfb2ZmKHBfc2xvdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWVocF9ocGMuYyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpZWhwX2hwYy5jCmluZGV4IGI2NDNjYTEuLjcxYTgwMTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpZWhwX2hwYy5jCisrKyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpZWhwX2hwYy5jCkBAIC00Miw0MiArNDIsNiBAQAogCiBzdGF0aWMgYXRvbWljX3QgcGNpZWhwX251bV9jb250cm9sbGVycyA9IEFUT01JQ19JTklUKDApOwogCi1zdHJ1Y3QgY3RybF9yZWcgewotCXU4IGNhcF9pZDsKLQl1OCBueHRfcHRyOwotCXUxNiBjYXBfcmVnOwotCXUzMiBkZXZfY2FwOwotCXUxNiBkZXZfY3RybDsKLQl1MTYgZGV2X3N0YXR1czsKLQl1MzIgbG5rX2NhcDsKLQl1MTYgbG5rX2N0cmw7Ci0JdTE2IGxua19zdGF0dXM7Ci0JdTMyIHNsb3RfY2FwOwotCXUxNiBzbG90X2N0cmw7Ci0JdTE2IHNsb3Rfc3RhdHVzOwotCXUxNiByb290X2N0cmw7Ci0JdTE2IHJzdnA7Ci0JdTMyIHJvb3Rfc3RhdHVzOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0KLS8qIG9mZnNldHMgdG8gdGhlIGNvbnRyb2xsZXIgcmVnaXN0ZXJzIGJhc2VkIG9uIHRoZSBhYm92ZSBzdHJ1Y3R1cmUgbGF5b3V0ICovCi1lbnVtIGN0cmxfb2Zmc2V0cyB7Ci0JUENJRUNBUElECT0Jb2Zmc2V0b2Yoc3RydWN0IGN0cmxfcmVnLCBjYXBfaWQpLAotCU5YVENBUFBUUgk9CW9mZnNldG9mKHN0cnVjdCBjdHJsX3JlZywgbnh0X3B0ciksCi0JQ0FQUkVHCQk9CW9mZnNldG9mKHN0cnVjdCBjdHJsX3JlZywgY2FwX3JlZyksCi0JREVWQ0FQCQk9CW9mZnNldG9mKHN0cnVjdCBjdHJsX3JlZywgZGV2X2NhcCksCi0JREVWQ1RSTAkJPQlvZmZzZXRvZihzdHJ1Y3QgY3RybF9yZWcsIGRldl9jdHJsKSwKLQlERVZTVEFUVVMJPQlvZmZzZXRvZihzdHJ1Y3QgY3RybF9yZWcsIGRldl9zdGF0dXMpLAotCUxOS0NBUAkJPQlvZmZzZXRvZihzdHJ1Y3QgY3RybF9yZWcsIGxua19jYXApLAotCUxOS0NUUkwJCT0Jb2Zmc2V0b2Yoc3RydWN0IGN0cmxfcmVnLCBsbmtfY3RybCksCi0JTE5LU1RBVFVTCT0Jb2Zmc2V0b2Yoc3RydWN0IGN0cmxfcmVnLCBsbmtfc3RhdHVzKSwKLQlTTE9UQ0FQCQk9CW9mZnNldG9mKHN0cnVjdCBjdHJsX3JlZywgc2xvdF9jYXApLAotCVNMT1RDVFJMCT0Jb2Zmc2V0b2Yoc3RydWN0IGN0cmxfcmVnLCBzbG90X2N0cmwpLAotCVNMT1RTVEFUVVMJPQlvZmZzZXRvZihzdHJ1Y3QgY3RybF9yZWcsIHNsb3Rfc3RhdHVzKSwKLQlST09UQ1RSTAk9CW9mZnNldG9mKHN0cnVjdCBjdHJsX3JlZywgcm9vdF9jdHJsKSwKLQlST09UU1RBVFVTCT0Jb2Zmc2V0b2Yoc3RydWN0IGN0cmxfcmVnLCByb290X3N0YXR1cyksCi19OwotCiBzdGF0aWMgaW5saW5lIGludCBwY2llaHBfcmVhZHcoc3RydWN0IGNvbnRyb2xsZXIgKmN0cmwsIGludCByZWcsIHUxNiAqdmFsdWUpCiB7CiAJc3RydWN0IHBjaV9kZXYgKmRldiA9IGN0cmwtPnBjaV9kZXY7CkBAIC0xMDIsOTUgKzY2LDkgQEAKIAlyZXR1cm4gcGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZXYsIGN0cmwtPmNhcF9iYXNlICsgcmVnLCB2YWx1ZSk7CiB9CiAKLS8qIEZpZWxkIGRlZmluaXRpb25zIGluIFBDSSBFeHByZXNzIENhcGFiaWxpdGllcyBSZWdpc3RlciAqLwotI2RlZmluZSBDQVBfVkVSCQkJMHgwMDBGCi0jZGVmaW5lIERFVl9QT1JUX1RZUEUJCTB4MDBGMAotI2RlZmluZSBTTE9UX0lNUEwJCTB4MDEwMAotI2RlZmluZSBNU0dfTlVNCQkJMHgzRTAwCi0KLS8qIERldmljZSBvciBQb3J0IFR5cGUgKi8KLSNkZWZpbmUgTkFUX0VORFBUCQkweDAwCi0jZGVmaW5lIExFR19FTkRQVAkJMHgwMQotI2RlZmluZSBST09UX1BPUlQJCTB4MDQKLSNkZWZpbmUgVVBfU1RSRUFNCQkweDA1Ci0jZGVmaW5lCUROX1NUUkVBTQkJMHgwNgotI2RlZmluZSBQQ0lFX1BDSV9CUkRHCQkweDA3Ci0jZGVmaW5lIFBDSV9QQ0lFX0JSREcJCTB4MTAKLQotLyogRmllbGQgZGVmaW5pdGlvbnMgaW4gRGV2aWNlIENhcGFiaWxpdGllcyBSZWdpc3RlciAqLwotI2RlZmluZSBEQVRUTl9CVVRUTl9QUlNOCTB4MTAwMAotI2RlZmluZSBEQVRUTl9MRURfUFJTTgkJMHgyMDAwCi0jZGVmaW5lIERQV1JfTEVEX1BSU04JCTB4NDAwMAotCi0vKiBGaWVsZCBkZWZpbml0aW9ucyBpbiBMaW5rIENhcGFiaWxpdGllcyBSZWdpc3RlciAqLwotI2RlZmluZSBNQVhfTE5LX1NQRUVECQkweDAwMEYKLSNkZWZpbmUgTUFYX0xOS19XSURUSAkJMHgwM0YwCi0jZGVmaW5lIExJTktfQUNUSVZFX1JFUE9SVElORwkweDAwMTAwMDAwCi0KLS8qIExpbmsgV2lkdGggRW5jb2RpbmcgKi8KLSNkZWZpbmUgTE5LX1gxCQkweDAxCi0jZGVmaW5lIExOS19YMgkJMHgwMgotI2RlZmluZSBMTktfWDQJCTB4MDQKLSNkZWZpbmUgTE5LX1g4CQkweDA4Ci0jZGVmaW5lIExOS19YMTIJCTB4MEMKLSNkZWZpbmUgTE5LX1gxNgkJMHgxMAotI2RlZmluZSBMTktfWDMyCQkweDIwCi0KLS8qRmllbGQgZGVmaW5pdGlvbnMgb2YgTGluayBTdGF0dXMgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgTE5LX1NQRUVECTB4MDAwRgotI2RlZmluZSBORUdfTElOS19XRAkweDAzRjAKLSNkZWZpbmUgTE5LX1RSTl9FUlIJMHgwNDAwCi0jZGVmaW5lCUxOS19UUk4JCTB4MDgwMAotI2RlZmluZSBTTE9UX0NMS19DT05GCTB4MTAwMAotI2RlZmluZSBMSU5LX0FDVElWRQkweDIwMDAKLQotLyogRmllbGQgZGVmaW5pdGlvbnMgaW4gU2xvdCBDYXBhYmlsaXRpZXMgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgQVRUTl9CVVRUTl9QUlNOCTB4MDAwMDAwMDEKLSNkZWZpbmUJUFdSX0NUUkxfUFJTTgkweDAwMDAwMDAyCi0jZGVmaW5lIE1STF9TRU5TX1BSU04JMHgwMDAwMDAwNAotI2RlZmluZSBBVFROX0xFRF9QUlNOCTB4MDAwMDAwMDgKLSNkZWZpbmUgUFdSX0xFRF9QUlNOCTB4MDAwMDAwMTAKLSNkZWZpbmUgSFBfU1VQUl9STV9TVVAJMHgwMDAwMDAyMAotI2RlZmluZSBIUF9DQVAJCTB4MDAwMDAwNDAKLSNkZWZpbmUgU0xPVF9QV1JfVkFMVUUJMHgwMDAwMDNGOAotI2RlZmluZSBTTE9UX1BXUl9MSU1JVAkweDAwMDAwQzAwCi0jZGVmaW5lIFBTTgkJMHhGRkY4MDAwMAkvKiBQU046IFBoeXNpY2FsIFNsb3QgTnVtYmVyICovCi0KLS8qIEZpZWxkIGRlZmluaXRpb25zIGluIFNsb3QgQ29udHJvbCBSZWdpc3RlciAqLwotI2RlZmluZSBBVFROX0JVVFROX0VOQUJMRQkJMHgwMDAxCi0jZGVmaW5lIFBXUl9GQVVMVF9ERVRFQ1RfRU5BQkxFCQkweDAwMDIKLSNkZWZpbmUgTVJMX0RFVEVDVF9FTkFCTEUJCTB4MDAwNAotI2RlZmluZSBQUlNOX0RFVEVDVF9FTkFCTEUJCTB4MDAwOAotI2RlZmluZSBDTURfQ01QTF9JTlRSX0VOQUJMRQkJMHgwMDEwCi0jZGVmaW5lIEhQX0lOVFJfRU5BQkxFCQkJMHgwMDIwCi0jZGVmaW5lIEFUVE5fTEVEX0NUUkwJCQkweDAwQzAKLSNkZWZpbmUgUFdSX0xFRF9DVFJMCQkJMHgwMzAwCi0jZGVmaW5lIFBXUl9DVFJMCQkJMHgwNDAwCi0jZGVmaW5lIEVNSV9DVFJMCQkJMHgwODAwCi0KLS8qIEF0dGVudGlvbiBpbmRpY2F0b3IgYW5kIFBvd2VyIGluZGljYXRvciBzdGF0ZXMgKi8KLSNkZWZpbmUgTEVEX09OCQkweDAxCi0jZGVmaW5lIExFRF9CTElOSwkweDEwCi0jZGVmaW5lIExFRF9PRkYJCTB4MTEKLQogLyogUG93ZXIgQ29udHJvbCBDb21tYW5kICovCiAjZGVmaW5lIFBPV0VSX09OCTAKLSNkZWZpbmUgUE9XRVJfT0ZGCTB4MDQwMAotCi0vKiBFTUkgU3RhdHVzIGRlZmluZXMgKi8KLSNkZWZpbmUgRU1JX0RJU0VOR0FHRUQJMAotI2RlZmluZSBFTUlfRU5HQUdFRAkxCi0KLS8qIEZpZWxkIGRlZmluaXRpb25zIGluIFNsb3QgU3RhdHVzIFJlZ2lzdGVyICovCi0jZGVmaW5lIEFUVE5fQlVUVE5fUFJFU1NFRAkweDAwMDEKLSNkZWZpbmUgUFdSX0ZBVUxUX0RFVEVDVEVECTB4MDAwMgotI2RlZmluZSBNUkxfU0VOU19DSEFOR0VECTB4MDAwNAotI2RlZmluZSBQUlNOX0RFVEVDVF9DSEFOR0VECTB4MDAwOAotI2RlZmluZSBDTURfQ09NUExFVEVECQkweDAwMTAKLSNkZWZpbmUgTVJMX1NUQVRFCQkweDAwMjAKLSNkZWZpbmUgUFJTTl9TVEFURQkJMHgwMDQwCi0jZGVmaW5lIEVNSV9TVEFURQkJMHgwMDgwCi0jZGVmaW5lIEVNSV9TVEFUVVNfQklUCQk3CisjZGVmaW5lIFBPV0VSX09GRglQQ0lfRVhQX1NMVENUTF9QQ0MKIAogc3RhdGljIGlycXJldHVybl90IHBjaWVfaXNyKGludCBpcnEsIHZvaWQgKmRldl9pZCk7CiBzdGF0aWMgdm9pZCBzdGFydF9pbnRfcG9sbF90aW1lcihzdHJ1Y3QgY29udHJvbGxlciAqY3RybCwgaW50IHNlYyk7CkBAIC0yNTMsMjIgKzEzMSwyMCBAQAogc3RhdGljIGludCBwY2llX3BvbGxfY21kKHN0cnVjdCBjb250cm9sbGVyICpjdHJsKQogewogCXUxNiBzbG90X3N0YXR1czsKLQlpbnQgdGltZW91dCA9IDEwMDA7CisJaW50IGVyciwgdGltZW91dCA9IDEwMDA7CiAKLQlpZiAoIXBjaWVocF9yZWFkdyhjdHJsLCBTTE9UU1RBVFVTLCAmc2xvdF9zdGF0dXMpKSB7Ci0JCWlmIChzbG90X3N0YXR1cyAmIENNRF9DT01QTEVURUQpIHsKLQkJCXBjaWVocF93cml0ZXcoY3RybCwgU0xPVFNUQVRVUywgQ01EX0NPTVBMRVRFRCk7Ci0JCQlyZXR1cm4gMTsKLQkJfQorCWVyciA9IHBjaWVocF9yZWFkdyhjdHJsLCBQQ0lfRVhQX1NMVFNUQSwgJnNsb3Rfc3RhdHVzKTsKKwlpZiAoIWVyciAmJiAoc2xvdF9zdGF0dXMgJiBQQ0lfRVhQX1NMVFNUQV9DQykpIHsKKwkJcGNpZWhwX3dyaXRldyhjdHJsLCBQQ0lfRVhQX1NMVFNUQSwgUENJX0VYUF9TTFRTVEFfQ0MpOworCQlyZXR1cm4gMTsKIAl9CiAJd2hpbGUgKHRpbWVvdXQgPiAwKSB7CiAJCW1zbGVlcCgxMCk7CiAJCXRpbWVvdXQgLT0gMTA7Ci0JCWlmICghcGNpZWhwX3JlYWR3KGN0cmwsIFNMT1RTVEFUVVMsICZzbG90X3N0YXR1cykpIHsKLQkJCWlmIChzbG90X3N0YXR1cyAmIENNRF9DT01QTEVURUQpIHsKLQkJCQlwY2llaHBfd3JpdGV3KGN0cmwsIFNMT1RTVEFUVVMsIENNRF9DT01QTEVURUQpOwotCQkJCXJldHVybiAxOwotCQkJfQorCQllcnIgPSBwY2llaHBfcmVhZHcoY3RybCwgUENJX0VYUF9TTFRTVEEsICZzbG90X3N0YXR1cyk7CisJCWlmICghZXJyICYmIChzbG90X3N0YXR1cyAmIFBDSV9FWFBfU0xUU1RBX0NDKSkgeworCQkJcGNpZWhwX3dyaXRldyhjdHJsLCBQQ0lfRVhQX1NMVFNUQSwgUENJX0VYUF9TTFRTVEFfQ0MpOworCQkJcmV0dXJuIDE7CiAJCX0KIAl9CiAJcmV0dXJuIDA7CS8qIHRpbWVvdXQgKi8KQEAgLTMwMiwxNCArMTc4LDE0IEBACiAKIAltdXRleF9sb2NrKCZjdHJsLT5jdHJsX2xvY2spOwogCi0JcmV0dmFsID0gcGNpZWhwX3JlYWR3KGN0cmwsIFNMT1RTVEFUVVMsICZzbG90X3N0YXR1cyk7CisJcmV0dmFsID0gcGNpZWhwX3JlYWR3KGN0cmwsIFBDSV9FWFBfU0xUU1RBLCAmc2xvdF9zdGF0dXMpOwogCWlmIChyZXR2YWwpIHsKIAkJY3RybF9lcnIoY3RybCwgIiVzOiBDYW5ub3QgcmVhZCBTTE9UU1RBVFVTIHJlZ2lzdGVyXG4iLAogCQkJIF9fZnVuY19fKTsKIAkJZ290byBvdXQ7CiAJfQogCi0JaWYgKHNsb3Rfc3RhdHVzICYgQ01EX0NPTVBMRVRFRCkgeworCWlmIChzbG90X3N0YXR1cyAmIFBDSV9FWFBfU0xUU1RBX0NDKSB7CiAJCWlmICghY3RybC0+bm9fY21kX2NvbXBsZXRlKSB7CiAJCQkvKgogCQkJICogQWZ0ZXIgMSBzZWMgYW5kIENNRF9DT01QTEVURUQgc3RpbGwgbm90IHNldCwganVzdApAQCAtMzMyLDcgKzIwOCw3IEBACiAJCX0KIAl9CiAKLQlyZXR2YWwgPSBwY2llaHBfcmVhZHcoY3RybCwgU0xPVENUUkwsICZzbG90X2N0cmwpOworCXJldHZhbCA9IHBjaWVocF9yZWFkdyhjdHJsLCBQQ0lfRVhQX1NMVENUTCwgJnNsb3RfY3RybCk7CiAJaWYgKHJldHZhbCkgewogCQljdHJsX2VycihjdHJsLCAiJXM6IENhbm5vdCByZWFkIFNMT1RDVFJMIHJlZ2lzdGVyXG4iLCBfX2Z1bmNfXyk7CiAJCWdvdG8gb3V0OwpAQCAtMzQyLDcgKzIxOCw3IEBACiAJc2xvdF9jdHJsIHw9IChjbWQgJiBtYXNrKTsKIAljdHJsLT5jbWRfYnVzeSA9IDE7CiAJc21wX21iKCk7Ci0JcmV0dmFsID0gcGNpZWhwX3dyaXRldyhjdHJsLCBTTE9UQ1RSTCwgc2xvdF9jdHJsKTsKKwlyZXR2YWwgPSBwY2llaHBfd3JpdGV3KGN0cmwsIFBDSV9FWFBfU0xUQ1RMLCBzbG90X2N0cmwpOwogCWlmIChyZXR2YWwpCiAJCWN0cmxfZXJyKGN0cmwsICJDYW5ub3Qgd3JpdGUgdG8gU0xPVENUUkwgcmVnaXN0ZXJcbiIpOwogCkBAIC0zNTYsOCArMjMyLDggQEAKIAkJICogY29tcGxldGVkIGludGVycnVwdCBpcyBub3QgZW5hYmxlZCwgd2UgbmVlZCB0byBwb2xsCiAJCSAqIGNvbW1hbmQgY29tcGxldGVkIGV2ZW50LgogCQkgKi8KLQkJaWYgKCEoc2xvdF9jdHJsICYgSFBfSU5UUl9FTkFCTEUpIHx8Ci0JCSAgICAhKHNsb3RfY3RybCAmIENNRF9DTVBMX0lOVFJfRU5BQkxFKSkKKwkJaWYgKCEoc2xvdF9jdHJsICYgUENJX0VYUF9TTFRDVExfSFBJRSkgfHwKKwkJICAgICEoc2xvdF9jdHJsICYgUENJX0VYUF9TTFRDVExfQ0NJRSkpCiAJCQlwb2xsID0gMTsKICAgICAgICAgICAgICAgICBwY2llX3dhaXRfY21kKGN0cmwsIHBvbGwpOwogCX0KQEAgLTM3MCw5ICsyNDYsOSBAQAogewogCXUxNiBsaW5rX3N0YXR1czsKIAotCWlmIChwY2llaHBfcmVhZHcoY3RybCwgTE5LU1RBVFVTLCAmbGlua19zdGF0dXMpKQorCWlmIChwY2llaHBfcmVhZHcoY3RybCwgUENJX0VYUF9MTktTVEEsICZsaW5rX3N0YXR1cykpCiAJCXJldHVybiAwOwotCXJldHVybiAhIShsaW5rX3N0YXR1cyAmIExJTktfQUNUSVZFKTsKKwlyZXR1cm4gISEobGlua19zdGF0dXMgJiBQQ0lfRVhQX0xOS1NUQV9ETExMQSk7CiB9CiAKIHN0YXRpYyB2b2lkIHBjaWVfd2FpdF9saW5rX2FjdGl2ZShzdHJ1Y3QgY29udHJvbGxlciAqY3RybCkKQEAgLTQxMiwxNSArMjg4LDE1IEBACiAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgIG1zbGVlcCgxMDAwKTsKIAotCXJldHZhbCA9IHBjaWVocF9yZWFkdyhjdHJsLCBMTktTVEFUVVMsICZsbmtfc3RhdHVzKTsKKwlyZXR2YWwgPSBwY2llaHBfcmVhZHcoY3RybCwgUENJX0VYUF9MTktTVEEsICZsbmtfc3RhdHVzKTsKIAlpZiAocmV0dmFsKSB7CiAJCWN0cmxfZXJyKGN0cmwsICJDYW5ub3QgcmVhZCBMTktTVEFUVVMgcmVnaXN0ZXJcbiIpOwogCQlyZXR1cm4gcmV0dmFsOwogCX0KIAogCWN0cmxfZGJnKGN0cmwsICIlczogbG5rX3N0YXR1cyA9ICV4XG4iLCBfX2Z1bmNfXywgbG5rX3N0YXR1cyk7Ci0JaWYgKCAobG5rX3N0YXR1cyAmIExOS19UUk4pIHx8IChsbmtfc3RhdHVzICYgTE5LX1RSTl9FUlIpIHx8Ci0JCSEobG5rX3N0YXR1cyAmIE5FR19MSU5LX1dEKSkgeworCWlmICgobG5rX3N0YXR1cyAmIFBDSV9FWFBfTE5LU1RBX0xUKSB8fAorCSAgICAhKGxua19zdGF0dXMgJiBQQ0lfRVhQX0xOS1NUQV9OTFcpKSB7CiAJCWN0cmxfZXJyKGN0cmwsICJMaW5rIFRyYWluaW5nIEVycm9yIG9jY3VycyBcbiIpOwogCQlyZXR2YWwgPSAtMTsKIAkJcmV0dXJuIHJldHZhbDsKQEAgLTQzNiwxNiArMzEyLDE2IEBACiAJdTggYXR0ZW5fbGVkX3N0YXRlOwogCWludCByZXR2YWwgPSAwOwogCi0JcmV0dmFsID0gcGNpZWhwX3JlYWR3KGN0cmwsIFNMT1RDVFJMLCAmc2xvdF9jdHJsKTsKKwlyZXR2YWwgPSBwY2llaHBfcmVhZHcoY3RybCwgUENJX0VYUF9TTFRDVEwsICZzbG90X2N0cmwpOwogCWlmIChyZXR2YWwpIHsKIAkJY3RybF9lcnIoY3RybCwgIiVzOiBDYW5ub3QgcmVhZCBTTE9UQ1RSTCByZWdpc3RlclxuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gcmV0dmFsOwogCX0KIAogCWN0cmxfZGJnKGN0cmwsICIlczogU0xPVENUUkwgJXgsIHZhbHVlIHJlYWQgJXhcbiIsCi0JCSBfX2Z1bmNfXywgY3RybC0+Y2FwX2Jhc2UgKyBTTE9UQ1RSTCwgc2xvdF9jdHJsKTsKKwkJIF9fZnVuY19fLCBjdHJsLT5jYXBfYmFzZSArIFBDSV9FWFBfU0xUQ1RMLCBzbG90X2N0cmwpOwogCi0JYXR0ZW5fbGVkX3N0YXRlID0gKHNsb3RfY3RybCAmIEFUVE5fTEVEX0NUUkwpID4+IDY7CisJYXR0ZW5fbGVkX3N0YXRlID0gKHNsb3RfY3RybCAmIFBDSV9FWFBfU0xUQ1RMX0FJQykgPj4gNjsKIAogCXN3aXRjaCAoYXR0ZW5fbGVkX3N0YXRlKSB7CiAJY2FzZSAwOgpAQCAtNDc1LDE1ICszNTEsMTUgQEAKIAl1OCBwd3Jfc3RhdGU7CiAJaW50CXJldHZhbCA9IDA7CiAKLQlyZXR2YWwgPSBwY2llaHBfcmVhZHcoY3RybCwgU0xPVENUUkwsICZzbG90X2N0cmwpOworCXJldHZhbCA9IHBjaWVocF9yZWFkdyhjdHJsLCBQQ0lfRVhQX1NMVENUTCwgJnNsb3RfY3RybCk7CiAJaWYgKHJldHZhbCkgewogCQljdHJsX2VycihjdHJsLCAiJXM6IENhbm5vdCByZWFkIFNMT1RDVFJMIHJlZ2lzdGVyXG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiByZXR2YWw7CiAJfQogCWN0cmxfZGJnKGN0cmwsICIlczogU0xPVENUUkwgJXggdmFsdWUgcmVhZCAleFxuIiwKLQkJIF9fZnVuY19fLCBjdHJsLT5jYXBfYmFzZSArIFNMT1RDVFJMLCBzbG90X2N0cmwpOworCQkgX19mdW5jX18sIGN0cmwtPmNhcF9iYXNlICsgUENJX0VYUF9TTFRDVEwsIHNsb3RfY3RybCk7CiAKLQlwd3Jfc3RhdGUgPSAoc2xvdF9jdHJsICYgUFdSX0NUUkwpID4+IDEwOworCXB3cl9zdGF0ZSA9IChzbG90X2N0cmwgJiBQQ0lfRVhQX1NMVENUTF9QQ0MpID4+IDEwOwogCiAJc3dpdGNoIChwd3Jfc3RhdGUpIHsKIAljYXNlIDA6CkBAIC01MDQsMTcgKzM4MCwxNSBAQAogewogCXN0cnVjdCBjb250cm9sbGVyICpjdHJsID0gc2xvdC0+Y3RybDsKIAl1MTYgc2xvdF9zdGF0dXM7Ci0JaW50IHJldHZhbCA9IDA7CisJaW50IHJldHZhbDsKIAotCXJldHZhbCA9IHBjaWVocF9yZWFkdyhjdHJsLCBTTE9UU1RBVFVTLCAmc2xvdF9zdGF0dXMpOworCXJldHZhbCA9IHBjaWVocF9yZWFkdyhjdHJsLCBQQ0lfRVhQX1NMVFNUQSwgJnNsb3Rfc3RhdHVzKTsKIAlpZiAocmV0dmFsKSB7CiAJCWN0cmxfZXJyKGN0cmwsICIlczogQ2Fubm90IHJlYWQgU0xPVFNUQVRVUyByZWdpc3RlclxuIiwKIAkJCSBfX2Z1bmNfXyk7CiAJCXJldHVybiByZXR2YWw7CiAJfQotCi0JKnN0YXR1cyA9ICgoKHNsb3Rfc3RhdHVzICYgTVJMX1NUQVRFKSA+PiA1KSA9PSAwKSA/IDAgOiAxOwotCisJKnN0YXR1cyA9ICEhKHNsb3Rfc3RhdHVzICYgUENJX0VYUF9TTFRTVEFfTVJMU1MpOwogCXJldHVybiAwOwogfQogCkBAIC01MjIsMTggKzM5NiwxNSBAQAogewogCXN0cnVjdCBjb250cm9sbGVyICpjdHJsID0gc2xvdC0+Y3RybDsKIAl1MTYgc2xvdF9zdGF0dXM7Ci0JdTggY2FyZF9zdGF0ZTsKLQlpbnQgcmV0dmFsID0gMDsKKwlpbnQgcmV0dmFsOwogCi0JcmV0dmFsID0gcGNpZWhwX3JlYWR3KGN0cmwsIFNMT1RTVEFUVVMsICZzbG90X3N0YXR1cyk7CisJcmV0dmFsID0gcGNpZWhwX3JlYWR3KGN0cmwsIFBDSV9FWFBfU0xUU1RBLCAmc2xvdF9zdGF0dXMpOwogCWlmIChyZXR2YWwpIHsKIAkJY3RybF9lcnIoY3RybCwgIiVzOiBDYW5ub3QgcmVhZCBTTE9UU1RBVFVTIHJlZ2lzdGVyXG4iLAogCQkJIF9fZnVuY19fKTsKIAkJcmV0dXJuIHJldHZhbDsKIAl9Ci0JY2FyZF9zdGF0ZSA9ICh1OCkoKHNsb3Rfc3RhdHVzICYgUFJTTl9TVEFURSkgPj4gNik7Ci0JKnN0YXR1cyA9IChjYXJkX3N0YXRlID09IDEpID8gMSA6IDA7Ci0KKwkqc3RhdHVzID0gISEoc2xvdF9zdGF0dXMgJiBQQ0lfRVhQX1NMVFNUQV9QRFMpOwogCXJldHVybiAwOwogfQogCkBAIC01NDEsMzIgKzQxMiwyOCBAQAogewogCXN0cnVjdCBjb250cm9sbGVyICpjdHJsID0gc2xvdC0+Y3RybDsKIAl1MTYgc2xvdF9zdGF0dXM7Ci0JdTggcHdyX2ZhdWx0OwotCWludCByZXR2YWwgPSAwOworCWludCByZXR2YWw7CiAKLQlyZXR2YWwgPSBwY2llaHBfcmVhZHcoY3RybCwgU0xPVFNUQVRVUywgJnNsb3Rfc3RhdHVzKTsKKwlyZXR2YWwgPSBwY2llaHBfcmVhZHcoY3RybCwgUENJX0VYUF9TTFRTVEEsICZzbG90X3N0YXR1cyk7CiAJaWYgKHJldHZhbCkgewogCQljdHJsX2VycihjdHJsLCAiQ2Fubm90IGNoZWNrIGZvciBwb3dlciBmYXVsdFxuIik7CiAJCXJldHVybiByZXR2YWw7CiAJfQotCXB3cl9mYXVsdCA9ICh1OCkoKHNsb3Rfc3RhdHVzICYgUFdSX0ZBVUxUX0RFVEVDVEVEKSA+PiAxKTsKLQotCXJldHVybiBwd3JfZmF1bHQ7CisJcmV0dXJuICEhKHNsb3Rfc3RhdHVzICYgUENJX0VYUF9TTFRTVEFfUEZEKTsKIH0KIAogc3RhdGljIGludCBocGNfZ2V0X2VtaV9zdGF0dXMoc3RydWN0IHNsb3QgKnNsb3QsIHU4ICpzdGF0dXMpCiB7CiAJc3RydWN0IGNvbnRyb2xsZXIgKmN0cmwgPSBzbG90LT5jdHJsOwogCXUxNiBzbG90X3N0YXR1czsKLQlpbnQgcmV0dmFsID0gMDsKKwlpbnQgcmV0dmFsOwogCi0JcmV0dmFsID0gcGNpZWhwX3JlYWR3KGN0cmwsIFNMT1RTVEFUVVMsICZzbG90X3N0YXR1cyk7CisJcmV0dmFsID0gcGNpZWhwX3JlYWR3KGN0cmwsIFBDSV9FWFBfU0xUU1RBLCAmc2xvdF9zdGF0dXMpOwogCWlmIChyZXR2YWwpIHsKIAkJY3RybF9lcnIoY3RybCwgIkNhbm5vdCBjaGVjayBFTUkgc3RhdHVzXG4iKTsKIAkJcmV0dXJuIHJldHZhbDsKIAl9Ci0JKnN0YXR1cyA9IChzbG90X3N0YXR1cyAmIEVNSV9TVEFURSkgPj4gRU1JX1NUQVRVU19CSVQ7Ci0KKwkqc3RhdHVzID0gISEoc2xvdF9zdGF0dXMgJiBQQ0lfRVhQX1NMVFNUQV9FSVMpOwogCXJldHVybiByZXR2YWw7CiB9CiAKQEAgLTU3Niw4ICs0NDMsOCBAQAogCXUxNiBjbWRfbWFzazsKIAlpbnQgcmM7CiAKLQlzbG90X2NtZCA9IEVNSV9DVFJMOwotCWNtZF9tYXNrID0gRU1JX0NUUkw7CisJc2xvdF9jbWQgPSBQQ0lfRVhQX1NMVENUTF9FSUM7CisJY21kX21hc2sgPSBQQ0lfRVhQX1NMVENUTF9FSUM7CiAJcmMgPSBwY2llX3dyaXRlX2NtZChzbG90LT5jdHJsLCBzbG90X2NtZCwgY21kX21hc2spOwogCXNsb3QtPmxhc3RfZW1pX3RvZ2dsZSA9IGdldF9zZWNvbmRzKCk7CiAKQEAgLTU5MSw3ICs0NTgsNyBAQAogCXUxNiBjbWRfbWFzazsKIAlpbnQgcmM7CiAKLQljbWRfbWFzayA9IEFUVE5fTEVEX0NUUkw7CisJY21kX21hc2sgPSBQQ0lfRVhQX1NMVENUTF9BSUM7CiAJc3dpdGNoICh2YWx1ZSkgewogCQljYXNlIDAgOgkvKiB0dXJuIG9mZiAqLwogCQkJc2xvdF9jbWQgPSAweDAwQzA7CkBAIC02MDcsNyArNDc0LDcgQEAKIAl9CiAJcmMgPSBwY2llX3dyaXRlX2NtZChjdHJsLCBzbG90X2NtZCwgY21kX21hc2spOwogCWN0cmxfZGJnKGN0cmwsICIlczogU0xPVENUUkwgJXggd3JpdGUgY21kICV4XG4iLAotCQkgX19mdW5jX18sIGN0cmwtPmNhcF9iYXNlICsgU0xPVENUUkwsIHNsb3RfY21kKTsKKwkJIF9fZnVuY19fLCBjdHJsLT5jYXBfYmFzZSArIFBDSV9FWFBfU0xUQ1RMLCBzbG90X2NtZCk7CiAKIAlyZXR1cm4gcmM7CiB9CkBAIC02MTksMTAgKzQ4NiwxMCBAQAogCXUxNiBjbWRfbWFzazsKIAogCXNsb3RfY21kID0gMHgwMTAwOwotCWNtZF9tYXNrID0gUFdSX0xFRF9DVFJMOworCWNtZF9tYXNrID0gUENJX0VYUF9TTFRDVExfUElDOwogCXBjaWVfd3JpdGVfY21kKGN0cmwsIHNsb3RfY21kLCBjbWRfbWFzayk7CiAJY3RybF9kYmcoY3RybCwgIiVzOiBTTE9UQ1RSTCAleCB3cml0ZSBjbWQgJXhcbiIsCi0JCSBfX2Z1bmNfXywgY3RybC0+Y2FwX2Jhc2UgKyBTTE9UQ1RSTCwgc2xvdF9jbWQpOworCQkgX19mdW5jX18sIGN0cmwtPmNhcF9iYXNlICsgUENJX0VYUF9TTFRDVEwsIHNsb3RfY21kKTsKIH0KIAogc3RhdGljIHZvaWQgaHBjX3NldF9ncmVlbl9sZWRfb2ZmKHN0cnVjdCBzbG90ICpzbG90KQpAQCAtNjMyLDEwICs0OTksMTAgQEAKIAl1MTYgY21kX21hc2s7CiAKIAlzbG90X2NtZCA9IDB4MDMwMDsKLQljbWRfbWFzayA9IFBXUl9MRURfQ1RSTDsKKwljbWRfbWFzayA9IFBDSV9FWFBfU0xUQ1RMX1BJQzsKIAlwY2llX3dyaXRlX2NtZChjdHJsLCBzbG90X2NtZCwgY21kX21hc2spOwogCWN0cmxfZGJnKGN0cmwsICIlczogU0xPVENUUkwgJXggd3JpdGUgY21kICV4XG4iLAotCQkgX19mdW5jX18sIGN0cmwtPmNhcF9iYXNlICsgU0xPVENUUkwsIHNsb3RfY21kKTsKKwkJIF9fZnVuY19fLCBjdHJsLT5jYXBfYmFzZSArIFBDSV9FWFBfU0xUQ1RMLCBzbG90X2NtZCk7CiB9CiAKIHN0YXRpYyB2b2lkIGhwY19zZXRfZ3JlZW5fbGVkX2JsaW5rKHN0cnVjdCBzbG90ICpzbG90KQpAQCAtNjQ1LDEwICs1MTIsMTAgQEAKIAl1MTYgY21kX21hc2s7CiAKIAlzbG90X2NtZCA9IDB4MDIwMDsKLQljbWRfbWFzayA9IFBXUl9MRURfQ1RSTDsKKwljbWRfbWFzayA9IFBDSV9FWFBfU0xUQ1RMX1BJQzsKIAlwY2llX3dyaXRlX2NtZChjdHJsLCBzbG90X2NtZCwgY21kX21hc2spOwogCWN0cmxfZGJnKGN0cmwsICIlczogU0xPVENUUkwgJXggd3JpdGUgY21kICV4XG4iLAotCQkgX19mdW5jX18sIGN0cmwtPmNhcF9iYXNlICsgU0xPVENUUkwsIHNsb3RfY21kKTsKKwkJIF9fZnVuY19fLCBjdHJsLT5jYXBfYmFzZSArIFBDSV9FWFBfU0xUQ1RMLCBzbG90X2NtZCk7CiB9CiAKIHN0YXRpYyBpbnQgaHBjX3Bvd2VyX29uX3Nsb3Qoc3RydWN0IHNsb3QgKiBzbG90KQpAQCAtNjYyLDE1ICs1MjksMTUgQEAKIAljdHJsX2RiZyhjdHJsLCAiJXM6IHNsb3QtPmhwX3Nsb3QgJXhcbiIsIF9fZnVuY19fLCBzbG90LT5ocF9zbG90KTsKIAogCS8qIENsZWFyIHN0aWNreSBwb3dlci1mYXVsdCBiaXQgZnJvbSBwcmV2aW91cyBwb3dlciBmYWlsdXJlcyAqLwotCXJldHZhbCA9IHBjaWVocF9yZWFkdyhjdHJsLCBTTE9UU1RBVFVTLCAmc2xvdF9zdGF0dXMpOworCXJldHZhbCA9IHBjaWVocF9yZWFkdyhjdHJsLCBQQ0lfRVhQX1NMVFNUQSwgJnNsb3Rfc3RhdHVzKTsKIAlpZiAocmV0dmFsKSB7CiAJCWN0cmxfZXJyKGN0cmwsICIlczogQ2Fubm90IHJlYWQgU0xPVFNUQVRVUyByZWdpc3RlclxuIiwKIAkJCSBfX2Z1bmNfXyk7CiAJCXJldHVybiByZXR2YWw7CiAJfQotCXNsb3Rfc3RhdHVzICY9IFBXUl9GQVVMVF9ERVRFQ1RFRDsKKwlzbG90X3N0YXR1cyAmPSBQQ0lfRVhQX1NMVFNUQV9QRkQ7CiAJaWYgKHNsb3Rfc3RhdHVzKSB7Ci0JCXJldHZhbCA9IHBjaWVocF93cml0ZXcoY3RybCwgU0xPVFNUQVRVUywgc2xvdF9zdGF0dXMpOworCQlyZXR2YWwgPSBwY2llaHBfd3JpdGV3KGN0cmwsIFBDSV9FWFBfU0xUU1RBLCBzbG90X3N0YXR1cyk7CiAJCWlmIChyZXR2YWwpIHsKIAkJCWN0cmxfZXJyKGN0cmwsCiAJCQkJICIlczogQ2Fubm90IHdyaXRlIHRvIFNMT1RTVEFUVVMgcmVnaXN0ZXJcbiIsCkBAIC02ODAsMTMgKzU0NywxMyBAQAogCX0KIAogCXNsb3RfY21kID0gUE9XRVJfT047Ci0JY21kX21hc2sgPSBQV1JfQ1RSTDsKKwljbWRfbWFzayA9IFBDSV9FWFBfU0xUQ1RMX1BDQzsKIAkvKiBFbmFibGUgZGV0ZWN0aW9uIHRoYXQgd2UgdHVybmVkIG9mZiBhdCBzbG90IHBvd2VyLW9mZiB0aW1lICovCiAJaWYgKCFwY2llaHBfcG9sbF9tb2RlKSB7Ci0JCXNsb3RfY21kIHw9IChQV1JfRkFVTFRfREVURUNUX0VOQUJMRSB8IE1STF9ERVRFQ1RfRU5BQkxFIHwKLQkJCSAgICAgUFJTTl9ERVRFQ1RfRU5BQkxFKTsKLQkJY21kX21hc2sgfD0gKFBXUl9GQVVMVF9ERVRFQ1RfRU5BQkxFIHwgTVJMX0RFVEVDVF9FTkFCTEUgfAotCQkJICAgICBQUlNOX0RFVEVDVF9FTkFCTEUpOworCQlzbG90X2NtZCB8PSAoUENJX0VYUF9TTFRDVExfUEZERSB8IFBDSV9FWFBfU0xUQ1RMX01STFNDRSB8CisJCQkgICAgIFBDSV9FWFBfU0xUQ1RMX1BEQ0UpOworCQljbWRfbWFzayB8PSAoUENJX0VYUF9TTFRDVExfUEZERSB8IFBDSV9FWFBfU0xUQ1RMX01STFNDRSB8CisJCQkgICAgIFBDSV9FWFBfU0xUQ1RMX1BEQ0UpOwogCX0KIAogCXJldHZhbCA9IHBjaWVfd3JpdGVfY21kKGN0cmwsIHNsb3RfY21kLCBjbWRfbWFzayk7CkBAIC02OTYsNyArNTYzLDcgQEAKIAkJcmV0dXJuIC0xOwogCX0KIAljdHJsX2RiZyhjdHJsLCAiJXM6IFNMT1RDVFJMICV4IHdyaXRlIGNtZCAleFxuIiwKLQkJIF9fZnVuY19fLCBjdHJsLT5jYXBfYmFzZSArIFNMT1RDVFJMLCBzbG90X2NtZCk7CisJCSBfX2Z1bmNfXywgY3RybC0+Y2FwX2Jhc2UgKyBQQ0lfRVhQX1NMVENUTCwgc2xvdF9jbWQpOwogCiAJcmV0dXJuIHJldHZhbDsKIH0KQEAgLTc1Myw3ICs2MjAsNyBAQAogCWNoYW5nZWQgPSBwY2llX21hc2tfYmFkX2RsbHAoY3RybCk7CiAKIAlzbG90X2NtZCA9IFBPV0VSX09GRjsKLQljbWRfbWFzayA9IFBXUl9DVFJMOworCWNtZF9tYXNrID0gUENJX0VYUF9TTFRDVExfUENDOwogCS8qCiAJICogSWYgd2UgZ2V0IE1STCBvciBwcmVzZW5jZSBkZXRlY3QgaW50ZXJydXB0cyBub3csIHRoZSBpc3IKIAkgKiB3aWxsIG5vdGljZSB0aGUgc3RpY2t5IHBvd2VyLWZhdWx0IGJpdCB0b28gYW5kIGlzc3VlIHBvd2VyCkBAIC03NjIsMTAgKzYyOSwxMCBAQAogCSAqIHRpbGwgdGhlIHNsb3QgaXMgcG93ZXJlZCBvbiBhZ2Fpbi4KIAkgKi8KIAlpZiAoIXBjaWVocF9wb2xsX21vZGUpIHsKLQkJc2xvdF9jbWQgJj0gfihQV1JfRkFVTFRfREVURUNUX0VOQUJMRSB8IE1STF9ERVRFQ1RfRU5BQkxFIHwKLQkJCSAgICAgIFBSU05fREVURUNUX0VOQUJMRSk7Ci0JCWNtZF9tYXNrIHw9IChQV1JfRkFVTFRfREVURUNUX0VOQUJMRSB8IE1STF9ERVRFQ1RfRU5BQkxFIHwKLQkJCSAgICAgUFJTTl9ERVRFQ1RfRU5BQkxFKTsKKwkJc2xvdF9jbWQgJj0gfihQQ0lfRVhQX1NMVENUTF9QRkRFIHwgUENJX0VYUF9TTFRDVExfTVJMU0NFIHwKKwkJCSAgICAgIFBDSV9FWFBfU0xUQ1RMX1BEQ0UpOworCQljbWRfbWFzayB8PSAoUENJX0VYUF9TTFRDVExfUEZERSB8IFBDSV9FWFBfU0xUQ1RMX01STFNDRSB8CisJCQkgICAgIFBDSV9FWFBfU0xUQ1RMX1BEQ0UpOwogCX0KIAogCXJldHZhbCA9IHBjaWVfd3JpdGVfY21kKGN0cmwsIHNsb3RfY21kLCBjbWRfbWFzayk7CkBAIC03NzUsNyArNjQyLDcgQEAKIAkJZ290byBvdXQ7CiAJfQogCWN0cmxfZGJnKGN0cmwsICIlczogU0xPVENUUkwgJXggd3JpdGUgY21kICV4XG4iLAotCQkgX19mdW5jX18sIGN0cmwtPmNhcF9iYXNlICsgU0xPVENUUkwsIHNsb3RfY21kKTsKKwkJIF9fZnVuY19fLCBjdHJsLT5jYXBfYmFzZSArIFBDSV9FWFBfU0xUQ1RMLCBzbG90X2NtZCk7CiAgb3V0OgogCWlmIChjaGFuZ2VkKQogCQlwY2llX3VubWFza19iYWRfZGxscChjdHJsKTsKQEAgLTc5NiwxOSArNjYzLDE5IEBACiAJICovCiAJaW50cl9sb2MgPSAwOwogCWRvIHsKLQkJaWYgKHBjaWVocF9yZWFkdyhjdHJsLCBTTE9UU1RBVFVTLCAmZGV0ZWN0ZWQpKSB7CisJCWlmIChwY2llaHBfcmVhZHcoY3RybCwgUENJX0VYUF9TTFRTVEEsICZkZXRlY3RlZCkpIHsKIAkJCWN0cmxfZXJyKGN0cmwsICIlczogQ2Fubm90IHJlYWQgU0xPVFNUQVRVU1xuIiwKIAkJCQkgX19mdW5jX18pOwogCQkJcmV0dXJuIElSUV9OT05FOwogCQl9CiAKLQkJZGV0ZWN0ZWQgJj0gKEFUVE5fQlVUVE5fUFJFU1NFRCB8IFBXUl9GQVVMVF9ERVRFQ1RFRCB8Ci0JCQkgICAgIE1STF9TRU5TX0NIQU5HRUQgfCBQUlNOX0RFVEVDVF9DSEFOR0VEIHwKLQkJCSAgICAgQ01EX0NPTVBMRVRFRCk7CisJCWRldGVjdGVkICY9IChQQ0lfRVhQX1NMVFNUQV9BQlAgfCBQQ0lfRVhQX1NMVFNUQV9QRkQgfAorCQkJICAgICBQQ0lfRVhQX1NMVFNUQV9NUkxTQyB8IFBDSV9FWFBfU0xUU1RBX1BEQyB8CisJCQkgICAgIFBDSV9FWFBfU0xUU1RBX0NDKTsKIAkJaW50cl9sb2MgfD0gZGV0ZWN0ZWQ7CiAJCWlmICghaW50cl9sb2MpCiAJCQlyZXR1cm4gSVJRX05PTkU7Ci0JCWlmIChkZXRlY3RlZCAmJiBwY2llaHBfd3JpdGV3KGN0cmwsIFNMT1RTVEFUVVMsIGRldGVjdGVkKSkgeworCQlpZiAoZGV0ZWN0ZWQgJiYgcGNpZWhwX3dyaXRldyhjdHJsLCBQQ0lfRVhQX1NMVFNUQSwgZGV0ZWN0ZWQpKSB7CiAJCQljdHJsX2VycihjdHJsLCAiJXM6IENhbm5vdCB3cml0ZSB0byBTTE9UU1RBVFVTXG4iLAogCQkJCSBfX2Z1bmNfXyk7CiAJCQlyZXR1cm4gSVJRX05PTkU7CkBAIC04MTgsMzEgKzY4NSwzMSBAQAogCWN0cmxfZGJnKGN0cmwsICIlczogaW50cl9sb2MgJXhcbiIsIF9fZnVuY19fLCBpbnRyX2xvYyk7CiAKIAkvKiBDaGVjayBDb21tYW5kIENvbXBsZXRlIEludGVycnVwdCBQZW5kaW5nICovCi0JaWYgKGludHJfbG9jICYgQ01EX0NPTVBMRVRFRCkgeworCWlmIChpbnRyX2xvYyAmIFBDSV9FWFBfU0xUU1RBX0NDKSB7CiAJCWN0cmwtPmNtZF9idXN5ID0gMDsKIAkJc21wX21iKCk7CiAJCXdha2VfdXAoJmN0cmwtPnF1ZXVlKTsKIAl9CiAKLQlpZiAoIShpbnRyX2xvYyAmIH5DTURfQ09NUExFVEVEKSkKKwlpZiAoIShpbnRyX2xvYyAmIH5QQ0lfRVhQX1NMVFNUQV9DQykpCiAJCXJldHVybiBJUlFfSEFORExFRDsKIAogCXBfc2xvdCA9IHBjaWVocF9maW5kX3Nsb3QoY3RybCwgY3RybC0+c2xvdF9kZXZpY2Vfb2Zmc2V0KTsKIAogCS8qIENoZWNrIE1STCBTZW5zb3IgQ2hhbmdlZCAqLwotCWlmIChpbnRyX2xvYyAmIE1STF9TRU5TX0NIQU5HRUQpCisJaWYgKGludHJfbG9jICYgUENJX0VYUF9TTFRTVEFfTVJMU0MpCiAJCXBjaWVocF9oYW5kbGVfc3dpdGNoX2NoYW5nZShwX3Nsb3QpOwogCiAJLyogQ2hlY2sgQXR0ZW50aW9uIEJ1dHRvbiBQcmVzc2VkICovCi0JaWYgKGludHJfbG9jICYgQVRUTl9CVVRUTl9QUkVTU0VEKQorCWlmIChpbnRyX2xvYyAmIFBDSV9FWFBfU0xUU1RBX0FCUCkKIAkJcGNpZWhwX2hhbmRsZV9hdHRlbnRpb25fYnV0dG9uKHBfc2xvdCk7CiAKIAkvKiBDaGVjayBQcmVzZW5jZSBEZXRlY3QgQ2hhbmdlZCAqLwotCWlmIChpbnRyX2xvYyAmIFBSU05fREVURUNUX0NIQU5HRUQpCisJaWYgKGludHJfbG9jICYgUENJX0VYUF9TTFRTVEFfUERDKQogCQlwY2llaHBfaGFuZGxlX3ByZXNlbmNlX2NoYW5nZShwX3Nsb3QpOwogCiAJLyogQ2hlY2sgUG93ZXIgRmF1bHQgRGV0ZWN0ZWQgKi8KLQlpZiAoaW50cl9sb2MgJiBQV1JfRkFVTFRfREVURUNURUQpCisJaWYgKGludHJfbG9jICYgUENJX0VYUF9TTFRTVEFfUEZEKQogCQlwY2llaHBfaGFuZGxlX3Bvd2VyX2ZhdWx0KHBfc2xvdCk7CiAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CkBAIC04NTUsNyArNzIyLDcgQEAKIAl1MzIJbG5rX2NhcDsKIAlpbnQgcmV0dmFsID0gMDsKIAotCXJldHZhbCA9IHBjaWVocF9yZWFkbChjdHJsLCBMTktDQVAsICZsbmtfY2FwKTsKKwlyZXR2YWwgPSBwY2llaHBfcmVhZGwoY3RybCwgUENJX0VYUF9MTktDQVAsICZsbmtfY2FwKTsKIAlpZiAocmV0dmFsKSB7CiAJCWN0cmxfZXJyKGN0cmwsICIlczogQ2Fubm90IHJlYWQgTE5LQ0FQIHJlZ2lzdGVyXG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiByZXR2YWw7CkBAIC04ODQsMTMgKzc1MSwxMyBAQAogCXUzMglsbmtfY2FwOwogCWludCByZXR2YWwgPSAwOwogCi0JcmV0dmFsID0gcGNpZWhwX3JlYWRsKGN0cmwsIExOS0NBUCwgJmxua19jYXApOworCXJldHZhbCA9IHBjaWVocF9yZWFkbChjdHJsLCBQQ0lfRVhQX0xOS0NBUCwgJmxua19jYXApOwogCWlmIChyZXR2YWwpIHsKIAkJY3RybF9lcnIoY3RybCwgIiVzOiBDYW5ub3QgcmVhZCBMTktDQVAgcmVnaXN0ZXJcbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIHJldHZhbDsKIAl9CiAKLQlzd2l0Y2ggKChsbmtfY2FwICYgMHgwM0YwKSA+PiA0KXsKKwlzd2l0Y2ggKChsbmtfY2FwICYgUENJX0VYUF9MTktTVEFfTkxXKSA+PiA0KXsKIAljYXNlIDA6CiAJCWxua193ZHRoID0gUENJRV9MTktfV0lEVEhfUkVTUlY7CiAJCWJyZWFrOwpAQCAtOTMzLDE0ICs4MDAsMTQgQEAKIAlpbnQgcmV0dmFsID0gMDsKIAl1MTYgbG5rX3N0YXR1czsKIAotCXJldHZhbCA9IHBjaWVocF9yZWFkdyhjdHJsLCBMTktTVEFUVVMsICZsbmtfc3RhdHVzKTsKKwlyZXR2YWwgPSBwY2llaHBfcmVhZHcoY3RybCwgUENJX0VYUF9MTktTVEEsICZsbmtfc3RhdHVzKTsKIAlpZiAocmV0dmFsKSB7CiAJCWN0cmxfZXJyKGN0cmwsICIlczogQ2Fubm90IHJlYWQgTE5LU1RBVFVTIHJlZ2lzdGVyXG4iLAogCQkJIF9fZnVuY19fKTsKIAkJcmV0dXJuIHJldHZhbDsKIAl9CiAKLQlzd2l0Y2ggKGxua19zdGF0dXMgJiAweDBGKSB7CisJc3dpdGNoIChsbmtfc3RhdHVzICYgUENJX0VYUF9MTktTVEFfQ0xTKSB7CiAJY2FzZSAxOgogCQlsbmtfc3BlZWQgPSBQQ0lFXzJQVDVHQjsKIAkJYnJlYWs7CkBAIC05NjMsMTQgKzgzMCwxNCBAQAogCWludCByZXR2YWwgPSAwOwogCXUxNiBsbmtfc3RhdHVzOwogCi0JcmV0dmFsID0gcGNpZWhwX3JlYWR3KGN0cmwsIExOS1NUQVRVUywgJmxua19zdGF0dXMpOworCXJldHZhbCA9IHBjaWVocF9yZWFkdyhjdHJsLCBQQ0lfRVhQX0xOS1NUQSwgJmxua19zdGF0dXMpOwogCWlmIChyZXR2YWwpIHsKIAkJY3RybF9lcnIoY3RybCwgIiVzOiBDYW5ub3QgcmVhZCBMTktTVEFUVVMgcmVnaXN0ZXJcbiIsCiAJCQkgX19mdW5jX18pOwogCQlyZXR1cm4gcmV0dmFsOwogCX0KIAotCXN3aXRjaCAoKGxua19zdGF0dXMgJiAweDAzRjApID4+IDQpeworCXN3aXRjaCAoKGxua19zdGF0dXMgJiBQQ0lfRVhQX0xOS1NUQV9OTFcpID4+IDQpewogCWNhc2UgMDoKIAkJbG5rX3dkdGggPSBQQ0lFX0xOS19XSURUSF9SRVNSVjsKIAkJYnJlYWs7CkBAIC0xMDM2LDE4ICs5MDMsMTkgQEAKIHsKIAl1MTYgY21kLCBtYXNrOwogCi0JY21kID0gUFJTTl9ERVRFQ1RfRU5BQkxFOworCWNtZCA9IFBDSV9FWFBfU0xUQ1RMX1BEQ0U7CiAJaWYgKEFUVE5fQlVUVE4oY3RybCkpCi0JCWNtZCB8PSBBVFROX0JVVFROX0VOQUJMRTsKKwkJY21kIHw9IFBDSV9FWFBfU0xUQ1RMX0FCUEU7CiAJaWYgKFBPV0VSX0NUUkwoY3RybCkpCi0JCWNtZCB8PSBQV1JfRkFVTFRfREVURUNUX0VOQUJMRTsKKwkJY21kIHw9IFBDSV9FWFBfU0xUQ1RMX1BGREU7CiAJaWYgKE1STF9TRU5TKGN0cmwpKQotCQljbWQgfD0gTVJMX0RFVEVDVF9FTkFCTEU7CisJCWNtZCB8PSBQQ0lfRVhQX1NMVENUTF9NUkxTQ0U7CiAJaWYgKCFwY2llaHBfcG9sbF9tb2RlKQotCQljbWQgfD0gSFBfSU5UUl9FTkFCTEUgfCBDTURfQ01QTF9JTlRSX0VOQUJMRTsKKwkJY21kIHw9IFBDSV9FWFBfU0xUQ1RMX0hQSUUgfCBQQ0lfRVhQX1NMVENUTF9DQ0lFOwogCi0JbWFzayA9IFBSU05fREVURUNUX0VOQUJMRSB8IEFUVE5fQlVUVE5fRU5BQkxFIHwgTVJMX0RFVEVDVF9FTkFCTEUgfAotCSAgICAgICBQV1JfRkFVTFRfREVURUNUX0VOQUJMRSB8IEhQX0lOVFJfRU5BQkxFIHwgQ01EX0NNUExfSU5UUl9FTkFCTEU7CisJbWFzayA9IChQQ0lfRVhQX1NMVENUTF9QRENFIHwgUENJX0VYUF9TTFRDVExfQUJQRSB8CisJCVBDSV9FWFBfU0xUQ1RMX01STFNDRSB8IFBDSV9FWFBfU0xUQ1RMX1BGREUgfAorCQlQQ0lfRVhQX1NMVENUTF9IUElFIHwgUENJX0VYUF9TTFRDVExfQ0NJRSk7CiAKIAlpZiAocGNpZV93cml0ZV9jbWQoY3RybCwgY21kLCBtYXNrKSkgewogCQljdHJsX2VycihjdHJsLCAiQ2Fubm90IGVuYWJsZSBzb2Z0d2FyZSBub3RpZmljYXRpb25cbiIpOwpAQCAtMTA1OSw4ICs5MjcsOSBAQAogc3RhdGljIHZvaWQgcGNpZV9kaXNhYmxlX25vdGlmaWNhdGlvbihzdHJ1Y3QgY29udHJvbGxlciAqY3RybCkKIHsKIAl1MTYgbWFzazsKLQltYXNrID0gUFJTTl9ERVRFQ1RfRU5BQkxFIHwgQVRUTl9CVVRUTl9FTkFCTEUgfCBNUkxfREVURUNUX0VOQUJMRSB8Ci0JICAgICAgIFBXUl9GQVVMVF9ERVRFQ1RfRU5BQkxFIHwgSFBfSU5UUl9FTkFCTEUgfCBDTURfQ01QTF9JTlRSX0VOQUJMRTsKKwltYXNrID0gKFBDSV9FWFBfU0xUQ1RMX1BEQ0UgfCBQQ0lfRVhQX1NMVENUTF9BQlBFIHwKKwkJUENJX0VYUF9TTFRDVExfTVJMU0NFIHwgUENJX0VYUF9TTFRDVExfUEZERSB8CisJCVBDSV9FWFBfU0xUQ1RMX0hQSUUgfCBQQ0lfRVhQX1NMVENUTF9DQ0lFKTsKIAlpZiAocGNpZV93cml0ZV9jbWQoY3RybCwgMCwgbWFzaykpCiAJCWN0cmxfd2FybihjdHJsLCAiQ2Fubm90IGRpc2FibGUgc29mdHdhcmUgbm90aWZpY2F0aW9uXG4iKTsKIH0KQEAgLTExNTcsOSArMTAyNiw5IEBACiAJCSAgRU1JKGN0cmwpICAgICAgICA/ICJ5ZXMiIDogIm5vIik7CiAJY3RybF9pbmZvKGN0cmwsICIgIENvbW1hbmQgQ29tcGxldGVkICAgIDogJTNzXG4iLAogCQkgIE5PX0NNRF9DTVBMKGN0cmwpID8gIm5vIiA6ICJ5ZXMiKTsKLQlwY2llaHBfcmVhZHcoY3RybCwgU0xPVFNUQVRVUywgJnJlZzE2KTsKKwlwY2llaHBfcmVhZHcoY3RybCwgUENJX0VYUF9TTFRTVEEsICZyZWcxNik7CiAJY3RybF9pbmZvKGN0cmwsICJTbG90IFN0YXR1cyAgICAgICAgICAgIDogMHglMDR4XG4iLCByZWcxNik7Ci0JcGNpZWhwX3JlYWR3KGN0cmwsIFNMT1RDVFJMLCAmcmVnMTYpOworCXBjaWVocF9yZWFkdyhjdHJsLCBQQ0lfRVhQX1NMVENUTCwgJnJlZzE2KTsKIAljdHJsX2luZm8oY3RybCwgIlNsb3QgQ29udHJvbCAgICAgICAgICAgOiAweCUwNHhcbiIsIHJlZzE2KTsKIH0KIApAQCAtMTE4Myw3ICsxMDUyLDcgQEAKIAkJY3RybF9lcnIoY3RybCwgIkNhbm5vdCBmaW5kIFBDSSBFeHByZXNzIGNhcGFiaWxpdHlcbiIpOwogCQlnb3RvIGFib3J0X2N0cmw7CiAJfQotCWlmIChwY2llaHBfcmVhZGwoY3RybCwgU0xPVENBUCwgJnNsb3RfY2FwKSkgeworCWlmIChwY2llaHBfcmVhZGwoY3RybCwgUENJX0VYUF9TTFRDQVAsICZzbG90X2NhcCkpIHsKIAkJY3RybF9lcnIoY3RybCwgIkNhbm5vdCByZWFkIFNMT1RDQVAgcmVnaXN0ZXJcbiIpOwogCQlnb3RvIGFib3J0X2N0cmw7CiAJfQpAQCAtMTIwOCwxNyArMTA3NywxNyBAQAogCSAgICBjdHJsLT5ub19jbWRfY29tcGxldGUgPSAxOwogCiAgICAgICAgIC8qIENoZWNrIGlmIERhdGEgTGluayBMYXllciBMaW5rIEFjdGl2ZSBSZXBvcnRpbmcgaXMgaW1wbGVtZW50ZWQgKi8KLSAgICAgICAgaWYgKHBjaWVocF9yZWFkbChjdHJsLCBMTktDQVAsICZsaW5rX2NhcCkpIHsKKyAgICAgICAgaWYgKHBjaWVocF9yZWFkbChjdHJsLCBQQ0lfRVhQX0xOS0NBUCwgJmxpbmtfY2FwKSkgewogICAgICAgICAgICAgICAgIGN0cmxfZXJyKGN0cmwsICIlczogQ2Fubm90IHJlYWQgTE5LQ0FQIHJlZ2lzdGVyXG4iLCBfX2Z1bmNfXyk7CiAgICAgICAgICAgICAgICAgZ290byBhYm9ydF9jdHJsOwogICAgICAgICB9Ci0gICAgICAgIGlmIChsaW5rX2NhcCAmIExJTktfQUNUSVZFX1JFUE9SVElORykgeworICAgICAgICBpZiAobGlua19jYXAgJiBQQ0lfRVhQX0xOS0NBUF9ETExMQVJDKSB7CiAgICAgICAgICAgICAgICAgY3RybF9kYmcoY3RybCwgIkxpbmsgQWN0aXZlIFJlcG9ydGluZyBzdXBwb3J0ZWRcbiIpOwogICAgICAgICAgICAgICAgIGN0cmwtPmxpbmtfYWN0aXZlX3JlcG9ydGluZyA9IDE7CiAgICAgICAgIH0KIAogCS8qIENsZWFyIGFsbCByZW1haW5pbmcgZXZlbnQgYml0cyBpbiBTbG90IFN0YXR1cyByZWdpc3RlciAqLwotCWlmIChwY2llaHBfd3JpdGV3KGN0cmwsIFNMT1RTVEFUVVMsIDB4MWYpKQorCWlmIChwY2llaHBfd3JpdGV3KGN0cmwsIFBDSV9FWFBfU0xUU1RBLCAweDFmKSkKIAkJZ290byBhYm9ydF9jdHJsOwogCiAJLyogRGlzYWJsZSBzb3Rmd2FyZSBub3RpZmljYXRpb24gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2lycS5jIGIvZHJpdmVycy9wY2kvaXJxLmMKaW5kZXggNjQ0MWRmYS4uZGUwMTE3NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvaXJxLmMKKysrIGIvZHJpdmVycy9wY2kvaXJxLmMKQEAgLTE1LDcgKzE1LDcgQEAKIAogCWRldl9wcmludGsoS0VSTl9FUlIsICZwZGV2LT5kZXYsCiAJCSAgICJQb3RlbnRpYWxseSBtaXNyb3V0ZWQgSVJRIChCcmlkZ2UgJXMgJTA0eDolMDR4KVxuIiwKLQkJICAgcGFyZW50LT5kZXYuYnVzX2lkLCBwYXJlbnQtPnZlbmRvciwgcGFyZW50LT5kZXZpY2UpOworCQkgICBkZXZfbmFtZSgmcGFyZW50LT5kZXYpLCBwYXJlbnQtPnZlbmRvciwgcGFyZW50LT5kZXZpY2UpOwogCWRldl9wcmludGsoS0VSTl9FUlIsICZwZGV2LT5kZXYsICIlc1xuIiwgcmVhc29uKTsKIAlkZXZfcHJpbnRrKEtFUk5fRVJSLCAmcGRldi0+ZGV2LCAiUGxlYXNlIHJlcG9ydCB0byBsaW51eC1rZXJuZWxAdmdlci5rZXJuZWwub3JnXG4iKTsKIAlXQVJOX09OKDEpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvbXNpLmMgYi9kcml2ZXJzL3BjaS9tc2kuYwppbmRleCAxMWE1MWY4Li5iNGE5MGJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9tc2kuYworKysgYi9kcml2ZXJzL3BjaS9tc2kuYwpAQCAtNzc2LDI4ICs3NzYsMTkgQEAKIAlwY2lfbXNpX2VuYWJsZSA9IDA7CiB9CiAKKy8qKgorICogcGNpX21zaV9lbmFibGVkIC0gaXMgTVNJIGVuYWJsZWQ/CisgKgorICogUmV0dXJucyB0cnVlIGlmIE1TSSBoYXMgbm90IGJlZW4gZGlzYWJsZWQgYnkgdGhlIGNvbW1hbmQtbGluZSBvcHRpb24KKyAqIHBjaT1ub21zaS4KKyAqKi8KK2ludCBwY2lfbXNpX2VuYWJsZWQodm9pZCkKK3sKKwlyZXR1cm4gcGNpX21zaV9lbmFibGU7Cit9CitFWFBPUlRfU1lNQk9MKHBjaV9tc2lfZW5hYmxlZCk7CisKIHZvaWQgcGNpX21zaV9pbml0X3BjaV9kZXYoc3RydWN0IHBjaV9kZXYgKmRldikKIHsKIAlJTklUX0xJU1RfSEVBRCgmZGV2LT5tc2lfbGlzdCk7CiB9Ci0KLSNpZmRlZiBDT05GSUdfQUNQSQotI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2ktYWNwaS5oPgotc3RhdGljIHZvaWQgX19kZXZpbml0IG1zaV9hY3BpX2luaXQodm9pZCkKLXsKLQlpZiAoYWNwaV9wY2lfZGlzYWJsZWQpCi0JCXJldHVybjsKLQlwY2lfb3NjX3N1cHBvcnRfc2V0KE9TQ19NU0lfU1VQUE9SVCk7Ci0JcGNpZV9vc2Nfc3VwcG9ydF9zZXQoT1NDX01TSV9TVVBQT1JUKTsKLX0KLSNlbHNlCi1zdGF0aWMgaW5saW5lIHZvaWQgbXNpX2FjcGlfaW5pdCh2b2lkKSB7IH0KLSNlbmRpZiAvKiBDT05GSUdfQUNQSSAqLwotCi12b2lkIF9fZGV2aW5pdCBtc2lfaW5pdCh2b2lkKQotewotCWlmICghcGNpX21zaV9lbmFibGUpCi0JCXJldHVybjsKLQltc2lfYWNwaV9pbml0KCk7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9wY2ktYWNwaS5jIGIvZHJpdmVycy9wY2kvcGNpLWFjcGkuYwppbmRleCBhZTVlYzc2Li4zNTgyNTEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9wY2ktYWNwaS5jCisrKyBiL2RyaXZlcnMvcGNpL3BjaS1hY3BpLmMKQEAgLTI0LDEzICsyNCwxNCBAQAogCWFjcGlfaGFuZGxlIGhhbmRsZTsKIAl1MzIgc3VwcG9ydF9zZXQ7CiAJdTMyIGNvbnRyb2xfc2V0OworCXUzMiBjb250cm9sX3F1ZXJ5OworCWludCBpc19xdWVyaWVkOwogCXN0cnVjdCBsaXN0X2hlYWQgc2liaWxpbmc7CiB9Owogc3RhdGljIExJU1RfSEVBRChhY3BpX29zY19kYXRhX2xpc3QpOwogCiBzdHJ1Y3QgYWNwaV9vc2NfYXJncyB7CiAJdTMyIGNhcGJ1ZlszXTsKLQl1MzIgY3RybF9yZXN1bHQ7CiB9OwogCiBzdGF0aWMgREVGSU5FX01VVEVYKHBjaV9hY3BpX2xvY2spOwpAQCAtNTYsNyArNTcsNyBAQAogCQkJICAweDk2LCAweDU3LCAweDc0LCAweDQxLCAweEMwLCAweDNELCAweEQ3LCAweDY2fTsKIAogc3RhdGljIGFjcGlfc3RhdHVzIGFjcGlfcnVuX29zYyhhY3BpX2hhbmRsZSBoYW5kbGUsCi0JCQkJc3RydWN0IGFjcGlfb3NjX2FyZ3MgKm9zY19hcmdzKQorCQkJCXN0cnVjdCBhY3BpX29zY19hcmdzICpvc2NfYXJncywgdTMyICpyZXR2YWwpCiB7CiAJYWNwaV9zdGF0dXMgc3RhdHVzOwogCXN0cnVjdCBhY3BpX29iamVjdF9saXN0IGlucHV0OwpAQCAtMTEyLDggKzExMyw3IEBACiAJCWdvdG8gb3V0X2tmcmVlOwogCX0KIG91dF9zdWNjZXNzOgotCW9zY19hcmdzLT5jdHJsX3Jlc3VsdCA9Ci0JCSooKHUzMiAqKShvdXRfb2JqLT5idWZmZXIucG9pbnRlciArIDgpKTsKKwkqcmV0dmFsID0gKigodTMyICopKG91dF9vYmotPmJ1ZmZlci5wb2ludGVyICsgOCkpOwogCXN0YXR1cyA9IEFFX09LOwogCiBvdXRfa2ZyZWU6CkBAIC0xMjEsMTEgKzEyMSwxMCBAQAogCXJldHVybiBzdGF0dXM7CiB9CiAKLXN0YXRpYyBhY3BpX3N0YXR1cyBfX2FjcGlfcXVlcnlfb3NjKHUzMiBmbGFncywgc3RydWN0IGFjcGlfb3NjX2RhdGEgKm9zY19kYXRhLAotCQkJCSAgICB1MzIgKnJlc3VsdCkKK3N0YXRpYyBhY3BpX3N0YXR1cyBfX2FjcGlfcXVlcnlfb3NjKHUzMiBmbGFncywgc3RydWN0IGFjcGlfb3NjX2RhdGEgKm9zY19kYXRhKQogewogCWFjcGlfc3RhdHVzIHN0YXR1czsKLQl1MzIgc3VwcG9ydF9zZXQ7CisJdTMyIHN1cHBvcnRfc2V0LCByZXN1bHQ7CiAJc3RydWN0IGFjcGlfb3NjX2FyZ3Mgb3NjX2FyZ3M7CiAKIAkvKiBkbyBfT1NDIHF1ZXJ5IGZvciBhbGwgcG9zc2libGUgY29udHJvbHMgKi8KQEAgLTEzNCw1NiArMTMzLDQ1IEBACiAJb3NjX2FyZ3MuY2FwYnVmW09TQ19TVVBQT1JUX1RZUEVdID0gc3VwcG9ydF9zZXQ7CiAJb3NjX2FyZ3MuY2FwYnVmW09TQ19DT05UUk9MX1RZUEVdID0gT1NDX0NPTlRST0xfTUFTS1M7CiAKLQlzdGF0dXMgPSBhY3BpX3J1bl9vc2Mob3NjX2RhdGEtPmhhbmRsZSwgJm9zY19hcmdzKTsKKwlzdGF0dXMgPSBhY3BpX3J1bl9vc2Mob3NjX2RhdGEtPmhhbmRsZSwgJm9zY19hcmdzLCAmcmVzdWx0KTsKIAlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpIHsKIAkJb3NjX2RhdGEtPnN1cHBvcnRfc2V0ID0gc3VwcG9ydF9zZXQ7Ci0JCSpyZXN1bHQgPSBvc2NfYXJncy5jdHJsX3Jlc3VsdDsKKwkJb3NjX2RhdGEtPmNvbnRyb2xfcXVlcnkgPSByZXN1bHQ7CisJCW9zY19kYXRhLT5pc19xdWVyaWVkID0gMTsKIAl9CiAKIAlyZXR1cm4gc3RhdHVzOwogfQogCi1zdGF0aWMgYWNwaV9zdGF0dXMgYWNwaV9xdWVyeV9vc2MoYWNwaV9oYW5kbGUgaGFuZGxlLAotCQkJCSAgdTMyIGxldmVsLCB2b2lkICpjb250ZXh0LCB2b2lkICoqcmV0dmFsKQorLyoKKyAqIHBjaV9hY3BpX29zY19zdXBwb3J0OiBJbnZva2UgX09TQyBpbmRpY2F0aW5nIHN1cHBvcnQgZm9yIHRoZSBnaXZlbiBmZWF0dXJlCisgKiBAZmxhZ3M6IEJpdG1hc2sgb2YgZmxhZ3MgdG8gc3VwcG9ydAorICoKKyAqIFNlZSB0aGUgQUNQSSBzcGVjIGZvciB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgZmxhZ3MKKyAqLworaW50IHBjaV9hY3BpX29zY19zdXBwb3J0KGFjcGlfaGFuZGxlIGhhbmRsZSwgdTMyIGZsYWdzKQogewogCWFjcGlfc3RhdHVzIHN0YXR1czsKLQlzdHJ1Y3QgYWNwaV9vc2NfZGF0YSAqb3NjX2RhdGE7Ci0JdTMyIGZsYWdzID0gKHVuc2lnbmVkIGxvbmcpY29udGV4dCwgZHVtbXk7CiAJYWNwaV9oYW5kbGUgdG1wOworCXN0cnVjdCBhY3BpX29zY19kYXRhICpvc2NfZGF0YTsKKwlpbnQgcmMgPSAwOwogCiAJc3RhdHVzID0gYWNwaV9nZXRfaGFuZGxlKGhhbmRsZSwgIl9PU0MiLCAmdG1wKTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCi0JCXJldHVybiBBRV9PSzsKKwkJcmV0dXJuIC1FTk9UVFk7CiAKIAltdXRleF9sb2NrKCZwY2lfYWNwaV9sb2NrKTsKIAlvc2NfZGF0YSA9IGFjcGlfZ2V0X29zY19kYXRhKGhhbmRsZSk7CiAJaWYgKCFvc2NfZGF0YSkgewogCQlwcmludGsoS0VSTl9FUlIgImFjcGkgb3NjIGRhdGEgYXJyYXkgaXMgZnVsbFxuIik7CisJCXJjID0gLUVOT01FTTsKIAkJZ290byBvdXQ7CiAJfQogCi0JX19hY3BpX3F1ZXJ5X29zYyhmbGFncywgb3NjX2RhdGEsICZkdW1teSk7CisJX19hY3BpX3F1ZXJ5X29zYyhmbGFncywgb3NjX2RhdGEpOwogb3V0OgogCW11dGV4X3VubG9jaygmcGNpX2FjcGlfbG9jayk7Ci0JcmV0dXJuIEFFX09LOwotfQotCi0vKioKLSAqIF9fcGNpX29zY19zdXBwb3J0X3NldCAtIHJlZ2lzdGVyIE9TIHN1cHBvcnQgdG8gRmlybXdhcmUKLSAqIEBmbGFnczogT1Mgc3VwcG9ydCBiaXRzCi0gKiBAaGlkOiBoYXJkd2FyZSBJRAotICoKLSAqIFVwZGF0ZSBPUyBzdXBwb3J0IGZpZWxkcyBhbmQgZG9pbmcgYSBfT1NDIFF1ZXJ5IHRvIG9idGFpbiBhbiB1cGRhdGUKLSAqIGZyb20gRmlybXdhcmUgb24gc3VwcG9ydGVkIGNvbnRyb2wgYml0cy4KLSAqKi8KLWFjcGlfc3RhdHVzIF9fcGNpX29zY19zdXBwb3J0X3NldCh1MzIgZmxhZ3MsIGNvbnN0IGNoYXIgKmhpZCkKLXsKLQlpZiAoIShmbGFncyAmIE9TQ19TVVBQT1JUX01BU0tTKSkKLQkJcmV0dXJuIEFFX1RZUEU7Ci0KLQlhY3BpX2dldF9kZXZpY2VzKGhpZCwgYWNwaV9xdWVyeV9vc2MsCi0JCQkgKHZvaWQgKikodW5zaWduZWQgbG9uZylmbGFncywgTlVMTCk7Ci0JcmV0dXJuIEFFX09LOworCXJldHVybiByYzsKIH0KIAogLyoqCkBAIC0xOTYsNyArMTg0LDcgQEAKIGFjcGlfc3RhdHVzIHBjaV9vc2NfY29udHJvbF9zZXQoYWNwaV9oYW5kbGUgaGFuZGxlLCB1MzIgZmxhZ3MpCiB7CiAJYWNwaV9zdGF0dXMgc3RhdHVzOwotCXUzMiBjdHJsc2V0LCBjb250cm9sX3NldCwgcmVzdWx0OworCXUzMiBjb250cm9sX3JlcSwgY29udHJvbF9zZXQsIHJlc3VsdDsKIAlhY3BpX2hhbmRsZSB0bXA7CiAJc3RydWN0IGFjcGlfb3NjX2RhdGEgKm9zY19kYXRhOwogCXN0cnVjdCBhY3BpX29zY19hcmdzIG9zY19hcmdzOwpAQCAtMjEzLDI4ICsyMDEsMzQgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JY3RybHNldCA9IChmbGFncyAmIE9TQ19DT05UUk9MX01BU0tTKTsKLQlpZiAoIWN0cmxzZXQpIHsKKwljb250cm9sX3JlcSA9IChmbGFncyAmIE9TQ19DT05UUk9MX01BU0tTKTsKKwlpZiAoIWNvbnRyb2xfcmVxKSB7CiAJCXN0YXR1cyA9IEFFX1RZUEU7CiAJCWdvdG8gb3V0OwogCX0KIAotCXN0YXR1cyA9IF9fYWNwaV9xdWVyeV9vc2Mob3NjX2RhdGEtPnN1cHBvcnRfc2V0LCBvc2NfZGF0YSwgJnJlc3VsdCk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQorCS8qIE5vIG5lZWQgdG8gZXZhbHVhdGUgX09TQyBpZiB0aGUgY29udHJvbCB3YXMgYWxyZWFkeSBncmFudGVkLiAqLworCWlmICgob3NjX2RhdGEtPmNvbnRyb2xfc2V0ICYgY29udHJvbF9yZXEpID09IGNvbnRyb2xfcmVxKQogCQlnb3RvIG91dDsKIAotCWlmICgocmVzdWx0ICYgY3RybHNldCkgIT0gY3RybHNldCkgeworCWlmICghb3NjX2RhdGEtPmlzX3F1ZXJpZWQpIHsKKwkJc3RhdHVzID0gX19hY3BpX3F1ZXJ5X29zYyhvc2NfZGF0YS0+c3VwcG9ydF9zZXQsIG9zY19kYXRhKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQorCQkJZ290byBvdXQ7CisJfQorCisJaWYgKChvc2NfZGF0YS0+Y29udHJvbF9xdWVyeSAmIGNvbnRyb2xfcmVxKSAhPSBjb250cm9sX3JlcSkgewogCQlzdGF0dXMgPSBBRV9TVVBQT1JUOwogCQlnb3RvIG91dDsKIAl9CiAKLQljb250cm9sX3NldCA9IG9zY19kYXRhLT5jb250cm9sX3NldCB8IGN0cmxzZXQ7CisJY29udHJvbF9zZXQgPSBvc2NfZGF0YS0+Y29udHJvbF9zZXQgfCBjb250cm9sX3JlcTsKIAlvc2NfYXJncy5jYXBidWZbT1NDX1FVRVJZX1RZUEVdID0gMDsKIAlvc2NfYXJncy5jYXBidWZbT1NDX1NVUFBPUlRfVFlQRV0gPSBvc2NfZGF0YS0+c3VwcG9ydF9zZXQ7CiAJb3NjX2FyZ3MuY2FwYnVmW09TQ19DT05UUk9MX1RZUEVdID0gY29udHJvbF9zZXQ7Ci0Jc3RhdHVzID0gYWNwaV9ydW5fb3NjKGhhbmRsZSwgJm9zY19hcmdzKTsKKwlzdGF0dXMgPSBhY3BpX3J1bl9vc2MoaGFuZGxlLCAmb3NjX2FyZ3MsICZyZXN1bHQpOwogCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkKLQkJb3NjX2RhdGEtPmNvbnRyb2xfc2V0ID0gY29udHJvbF9zZXQ7CisJCW9zY19kYXRhLT5jb250cm9sX3NldCA9IHJlc3VsdDsKIG91dDoKIAltdXRleF91bmxvY2soJnBjaV9hY3BpX2xvY2spOwogCXJldHVybiBzdGF0dXM7CkBAIC0zNzUsNyArMzY5LDcgQEAKIAkgKiBUaGUgc3RyaW5nIHNob3VsZCBiZSB0aGUgc2FtZSBhcyByb290IGJyaWRnZSdzIG5hbWUKIAkgKiBQbGVhc2UgbG9vayBhdCAncGNpX3NjYW5fYnVzX3BhcmVudGVkJwogCSAqLwotCW51bSA9IHNzY2FuZihkZXYtPmJ1c19pZCwgInBjaSUwNHg6JTAyeCIsICZzZWcsICZidXMpOworCW51bSA9IHNzY2FuZihkZXZfbmFtZShkZXYpLCAicGNpJTA0eDolMDJ4IiwgJnNlZywgJmJ1cyk7CiAJaWYgKG51bSAhPSAyKQogCQlyZXR1cm4gLUVOT0RFVjsKIAkqaGFuZGxlID0gYWNwaV9nZXRfcGNpX3Jvb3RicmlkZ2VfaGFuZGxlKHNlZywgYnVzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3BjaS1kcml2ZXIuYyBiL2RyaXZlcnMvcGNpL3BjaS1kcml2ZXIuYwppbmRleCBiNGNkZDY5Li5jNjk3ZjI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9wY2ktZHJpdmVyLmMKKysrIGIvZHJpdmVycy9wY2kvcGNpLWRyaXZlci5jCkBAIC0xNiw2ICsxNiw3IEBACiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvY3B1Lmg+CiAjaW5jbHVkZSAicGNpLmgiCiAKIC8qCkBAIC00OCw3ICs0OSw3IEBACiAJCXN1YmRldmljZT1QQ0lfQU5ZX0lELCBjbGFzcz0wLCBjbGFzc19tYXNrPTA7CiAJdW5zaWduZWQgbG9uZyBkcml2ZXJfZGF0YT0wOwogCWludCBmaWVsZHM9MDsKLQlpbnQgcmV0dmFsOworCWludCByZXR2YWw9MDsKIAogCWZpZWxkcyA9IHNzY2FuZihidWYsICIleCAleCAleCAleCAleCAleCAlbHgiLAogCQkJJnZlbmRvciwgJmRldmljZSwgJnN1YnZlbmRvciwgJnN1YmRldmljZSwKQEAgLTU4LDE2ICs1OSwxOCBAQAogCiAJLyogT25seSBhY2NlcHQgZHJpdmVyX2RhdGEgdmFsdWVzIHRoYXQgbWF0Y2ggYW4gZXhpc3RpbmcgaWRfdGFibGUKIAkgICBlbnRyeSAqLwotCXJldHZhbCA9IC1FSU5WQUw7Ci0Jd2hpbGUgKGlkcy0+dmVuZG9yIHx8IGlkcy0+c3VidmVuZG9yIHx8IGlkcy0+Y2xhc3NfbWFzaykgewotCQlpZiAoZHJpdmVyX2RhdGEgPT0gaWRzLT5kcml2ZXJfZGF0YSkgewotCQkJcmV0dmFsID0gMDsKLQkJCWJyZWFrOworCWlmIChpZHMpIHsKKwkJcmV0dmFsID0gLUVJTlZBTDsKKwkJd2hpbGUgKGlkcy0+dmVuZG9yIHx8IGlkcy0+c3VidmVuZG9yIHx8IGlkcy0+Y2xhc3NfbWFzaykgeworCQkJaWYgKGRyaXZlcl9kYXRhID09IGlkcy0+ZHJpdmVyX2RhdGEpIHsKKwkJCQlyZXR2YWwgPSAwOworCQkJCWJyZWFrOworCQkJfQorCQkJaWRzKys7CiAJCX0KLQkJaWRzKys7CisJCWlmIChyZXR2YWwpCS8qIE5vIG1hdGNoICovCisJCQlyZXR1cm4gcmV0dmFsOwogCX0KLQlpZiAocmV0dmFsKQkvKiBObyBtYXRjaCAqLwotCQlyZXR1cm4gcmV0dmFsOwogCiAJZHluaWQgPSBremFsbG9jKHNpemVvZigqZHluaWQpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWR5bmlkKQpAQCAtMTgzLDMyICsxODYsNDMgQEAKIAlyZXR1cm4gcGNpX21hdGNoX2lkKGRydi0+aWRfdGFibGUsIGRldik7CiB9CiAKK3N0cnVjdCBkcnZfZGV2X2FuZF9pZCB7CisJc3RydWN0IHBjaV9kcml2ZXIgKmRydjsKKwlzdHJ1Y3QgcGNpX2RldiAqZGV2OworCWNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZDsKK307CisKK3N0YXRpYyBsb25nIGxvY2FsX3BjaV9wcm9iZSh2b2lkICpfZGRpKQoreworCXN0cnVjdCBkcnZfZGV2X2FuZF9pZCAqZGRpID0gX2RkaTsKKworCXJldHVybiBkZGktPmRydi0+cHJvYmUoZGRpLT5kZXYsIGRkaS0+aWQpOworfQorCiBzdGF0aWMgaW50IHBjaV9jYWxsX3Byb2JlKHN0cnVjdCBwY2lfZHJpdmVyICpkcnYsIHN0cnVjdCBwY2lfZGV2ICpkZXYsCiAJCQkgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKIHsKLQlpbnQgZXJyb3I7Ci0jaWZkZWYgQ09ORklHX05VTUEKLQkvKiBFeGVjdXRlIGRyaXZlciBpbml0aWFsaXphdGlvbiBvbiBub2RlIHdoZXJlIHRoZQotCSAgIGRldmljZSdzIGJ1cyBpcyBhdHRhY2hlZCB0by4gIFRoaXMgd2F5IHRoZSBkcml2ZXIgbGlrZWx5Ci0JICAgYWxsb2NhdGVzIGl0cyBsb2NhbCBtZW1vcnkgb24gdGhlIHJpZ2h0IG5vZGUgd2l0aG91dAotCSAgIGFueSBuZWVkIHRvIGNoYW5nZSBpdC4gKi8KLQlzdHJ1Y3QgbWVtcG9saWN5ICpvbGRwb2w7Ci0JY3B1bWFza190IG9sZG1hc2sgPSBjdXJyZW50LT5jcHVzX2FsbG93ZWQ7Ci0JaW50IG5vZGUgPSBkZXZfdG9fbm9kZSgmZGV2LT5kZXYpOworCWludCBlcnJvciwgbm9kZTsKKwlzdHJ1Y3QgZHJ2X2Rldl9hbmRfaWQgZGRpID0geyBkcnYsIGRldiwgaWQgfTsKIAorCS8qIEV4ZWN1dGUgZHJpdmVyIGluaXRpYWxpemF0aW9uIG9uIG5vZGUgd2hlcmUgdGhlIGRldmljZSdzCisJICAgYnVzIGlzIGF0dGFjaGVkIHRvLiAgVGhpcyB3YXkgdGhlIGRyaXZlciBsaWtlbHkgYWxsb2NhdGVzCisJICAgaXRzIGxvY2FsIG1lbW9yeSBvbiB0aGUgcmlnaHQgbm9kZSB3aXRob3V0IGFueSBuZWVkIHRvCisJICAgY2hhbmdlIGl0LiAqLworCW5vZGUgPSBkZXZfdG9fbm9kZSgmZGV2LT5kZXYpOwogCWlmIChub2RlID49IDApIHsKKwkJaW50IGNwdTsKIAkJbm9kZV90b19jcHVtYXNrX3B0cihub2RlY3B1bWFzaywgbm9kZSk7Ci0JCXNldF9jcHVzX2FsbG93ZWRfcHRyKGN1cnJlbnQsIG5vZGVjcHVtYXNrKTsKLQl9Ci0JLyogQW5kIHNldCBkZWZhdWx0IG1lbW9yeSBhbGxvY2F0aW9uIHBvbGljeSAqLwotCW9sZHBvbCA9IGN1cnJlbnQtPm1lbXBvbGljeTsKLQljdXJyZW50LT5tZW1wb2xpY3kgPSBOVUxMOwkvKiBmYWxsIGJhY2sgdG8gc3lzdGVtIGRlZmF1bHQgcG9saWN5ICovCi0jZW5kaWYKLQllcnJvciA9IGRydi0+cHJvYmUoZGV2LCBpZCk7Ci0jaWZkZWYgQ09ORklHX05VTUEKLQlzZXRfY3B1c19hbGxvd2VkX3B0cihjdXJyZW50LCAmb2xkbWFzayk7Ci0JY3VycmVudC0+bWVtcG9saWN5ID0gb2xkcG9sOwotI2VuZGlmCisKKwkJZ2V0X29ubGluZV9jcHVzKCk7CisJCWNwdSA9IGNwdW1hc2tfYW55X2FuZChub2RlY3B1bWFzaywgY3B1X29ubGluZV9tYXNrKTsKKwkJaWYgKGNwdSA8IG5yX2NwdV9pZHMpCisJCQllcnJvciA9IHdvcmtfb25fY3B1KGNwdSwgbG9jYWxfcGNpX3Byb2JlLCAmZGRpKTsKKwkJZWxzZQorCQkJZXJyb3IgPSBsb2NhbF9wY2lfcHJvYmUoJmRkaSk7CisJCXB1dF9vbmxpbmVfY3B1cygpOworCX0gZWxzZQorCQllcnJvciA9IGxvY2FsX3BjaV9wcm9iZSgmZGRpKTsKIAlyZXR1cm4gZXJyb3I7CiB9CiAKQEAgLTMwMiwxMSArMzE2LDEwIEBACiAKIC8qCiAgKiBEZWZhdWx0ICJzdXNwZW5kIiBtZXRob2QgZm9yIGRldmljZXMgdGhhdCBoYXZlIG5vIGRyaXZlciBwcm92aWRlZCBzdXNwZW5kLAotICogb3Igbm90IGV2ZW4gYSBkcml2ZXIgYXQgYWxsLgorICogb3Igbm90IGV2ZW4gYSBkcml2ZXIgYXQgYWxsIChzZWNvbmQgcGFydCkuCiAgKi8KLXN0YXRpYyB2b2lkIHBjaV9kZWZhdWx0X3BtX3N1c3BlbmQoc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYpCitzdGF0aWMgdm9pZCBwY2lfcG1fc2V0X3Vua25vd25fc3RhdGUoc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYpCiB7Ci0JcGNpX3NhdmVfc3RhdGUocGNpX2Rldik7CiAJLyoKIAkgKiBtYXJrIGl0cyBwb3dlciBzdGF0ZSBhcyAidW5rbm93biIsIHNpbmNlIHdlIGRvbid0IGtub3cgaWYKIAkgKiBlLmcuIHRoZSBCSU9TIHdpbGwgY2hhbmdlIGl0cyBkZXZpY2Ugc3RhdGUgd2hlbiB3ZSBzdXNwZW5kLgpAQCAtMzE3LDE0ICszMzAsMTIgQEAKIAogLyoKICAqIERlZmF1bHQgInJlc3VtZSIgbWV0aG9kIGZvciBkZXZpY2VzIHRoYXQgaGF2ZSBubyBkcml2ZXIgcHJvdmlkZWQgcmVzdW1lLAotICogb3Igbm90IGV2ZW4gYSBkcml2ZXIgYXQgYWxsLgorICogb3Igbm90IGV2ZW4gYSBkcml2ZXIgYXQgYWxsIChzZWNvbmQgcGFydCkuCiAgKi8KLXN0YXRpYyBpbnQgcGNpX2RlZmF1bHRfcG1fcmVzdW1lKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2KQorc3RhdGljIGludCBwY2lfcG1fcmVlbmFibGVfZGV2aWNlKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2KQogewotCWludCByZXR2YWwgPSAwOworCWludCByZXR2YWw7CiAKLQkvKiByZXN0b3JlIHRoZSBQQ0kgY29uZmlnIHNwYWNlICovCi0JcGNpX3Jlc3RvcmVfc3RhdGUocGNpX2Rldik7CiAJLyogaWYgdGhlIGRldmljZSB3YXMgZW5hYmxlZCBiZWZvcmUgc3VzcGVuZCwgcmVlbmFibGUgKi8KIAlyZXR2YWwgPSBwY2lfcmVlbmFibGVfZGV2aWNlKHBjaV9kZXYpOwogCS8qCkBAIC0zNDcsOCArMzU4LDE2IEBACiAJCWkgPSBkcnYtPnN1c3BlbmQocGNpX2Rldiwgc3RhdGUpOwogCQlzdXNwZW5kX3JlcG9ydF9yZXN1bHQoZHJ2LT5zdXNwZW5kLCBpKTsKIAl9IGVsc2UgewotCQlwY2lfZGVmYXVsdF9wbV9zdXNwZW5kKHBjaV9kZXYpOworCQlwY2lfc2F2ZV9zdGF0ZShwY2lfZGV2KTsKKwkJLyoKKwkJICogVGhpcyBpcyBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIGV4aXN0aW5nIGNvZGUgd2l0aCBsZWdhY3kgUE0KKwkJICogc3VwcG9ydC4KKwkJICovCisJCXBjaV9wbV9zZXRfdW5rbm93bl9zdGF0ZShwY2lfZGV2KTsKIAl9CisKKwlwY2lfZml4dXBfZGV2aWNlKHBjaV9maXh1cF9zdXNwZW5kLCBwY2lfZGV2KTsKKwogCXJldHVybiBpOwogfQogCkBAIC0zNjUsMzAgKzM4NCwxMzAgQEAKIAlyZXR1cm4gaTsKIH0KIAotc3RhdGljIGludCBwY2lfbGVnYWN5X3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0JaW50IGVycm9yOwotCXN0cnVjdCBwY2lfZGV2ICogcGNpX2RldiA9IHRvX3BjaV9kZXYoZGV2KTsKLQlzdHJ1Y3QgcGNpX2RyaXZlciAqIGRydiA9IHBjaV9kZXYtPmRyaXZlcjsKLQotCWlmIChkcnYgJiYgZHJ2LT5yZXN1bWUpCi0JCWVycm9yID0gZHJ2LT5yZXN1bWUocGNpX2Rldik7Ci0JZWxzZQotCQllcnJvciA9IHBjaV9kZWZhdWx0X3BtX3Jlc3VtZShwY2lfZGV2KTsKLQlyZXR1cm4gZXJyb3I7Ci19Ci0KIHN0YXRpYyBpbnQgcGNpX2xlZ2FjeV9yZXN1bWVfZWFybHkoc3RydWN0IGRldmljZSAqZGV2KQogewogCWludCBlcnJvciA9IDA7CiAJc3RydWN0IHBjaV9kZXYgKiBwY2lfZGV2ID0gdG9fcGNpX2RldihkZXYpOwogCXN0cnVjdCBwY2lfZHJpdmVyICogZHJ2ID0gcGNpX2Rldi0+ZHJpdmVyOwogCisJcGNpX2ZpeHVwX2RldmljZShwY2lfZml4dXBfcmVzdW1lX2Vhcmx5LCBwY2lfZGV2KTsKKwogCWlmIChkcnYgJiYgZHJ2LT5yZXN1bWVfZWFybHkpCiAJCWVycm9yID0gZHJ2LT5yZXN1bWVfZWFybHkocGNpX2Rldik7CiAJcmV0dXJuIGVycm9yOwogfQogCitzdGF0aWMgaW50IHBjaV9sZWdhY3lfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlpbnQgZXJyb3I7CisJc3RydWN0IHBjaV9kZXYgKiBwY2lfZGV2ID0gdG9fcGNpX2RldihkZXYpOworCXN0cnVjdCBwY2lfZHJpdmVyICogZHJ2ID0gcGNpX2Rldi0+ZHJpdmVyOworCisJcGNpX2ZpeHVwX2RldmljZShwY2lfZml4dXBfcmVzdW1lLCBwY2lfZGV2KTsKKworCWlmIChkcnYgJiYgZHJ2LT5yZXN1bWUpIHsKKwkJZXJyb3IgPSBkcnYtPnJlc3VtZShwY2lfZGV2KTsKKwl9IGVsc2UgeworCQkvKiByZXN0b3JlIHRoZSBQQ0kgY29uZmlnIHNwYWNlICovCisJCXBjaV9yZXN0b3JlX3N0YXRlKHBjaV9kZXYpOworCQllcnJvciA9IHBjaV9wbV9yZWVuYWJsZV9kZXZpY2UocGNpX2Rldik7CisJfQorCXJldHVybiBlcnJvcjsKK30KKworLyogQXV4aWxpYXJ5IGZ1bmN0aW9ucyB1c2VkIGJ5IHRoZSBuZXcgcG93ZXIgbWFuYWdlbWVudCBmcmFtZXdvcmsgKi8KKworc3RhdGljIGludCBwY2lfcmVzdG9yZV9zdGFuZGFyZF9jb25maWcoc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYpCit7CisJc3RydWN0IHBjaV9kZXYgKnBhcmVudCA9IHBjaV9kZXYtPmJ1cy0+c2VsZjsKKwlpbnQgZXJyb3IgPSAwOworCisJLyogQ2hlY2sgaWYgdGhlIGRldmljZSdzIGJ1cyBpcyBvcGVyYXRpb25hbCAqLworCWlmICghcGFyZW50IHx8IHBhcmVudC0+Y3VycmVudF9zdGF0ZSA9PSBQQ0lfRDApIHsKKwkJcGNpX3Jlc3RvcmVfc3RhdGUocGNpX2Rldik7CisJCXBjaV91cGRhdGVfY3VycmVudF9zdGF0ZShwY2lfZGV2LCBQQ0lfRDApOworCX0gZWxzZSB7CisJCWRldl93YXJuKCZwY2lfZGV2LT5kZXYsICJ1bmFibGUgdG8gcmVzdG9yZSBjb25maWcsICIKKwkJCSJicmlkZ2UgJXMgaW4gbG93IHBvd2VyIHN0YXRlIEQlZFxuIiwgcGNpX25hbWUocGFyZW50KSwKKwkJCXBhcmVudC0+Y3VycmVudF9zdGF0ZSk7CisJCXBjaV9kZXYtPmN1cnJlbnRfc3RhdGUgPSBQQ0lfVU5LTk9XTjsKKwkJZXJyb3IgPSAtRUFHQUlOOworCX0KKworCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIGJvb2wgcGNpX2lzX2JyaWRnZShzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldikKK3sKKwlyZXR1cm4gISEocGNpX2Rldi0+c3Vib3JkaW5hdGUpOworfQorCitzdGF0aWMgdm9pZCBwY2lfcG1fZGVmYXVsdF9yZXN1bWVfbm9pcnEoc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYpCit7CisJaWYgKHBjaV9yZXN0b3JlX3N0YW5kYXJkX2NvbmZpZyhwY2lfZGV2KSkKKwkJcGNpX2ZpeHVwX2RldmljZShwY2lfZml4dXBfcmVzdW1lX2Vhcmx5LCBwY2lfZGV2KTsKK30KKworc3RhdGljIGludCBwY2lfcG1fZGVmYXVsdF9yZXN1bWUoc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYpCit7CisJLyoKKwkgKiBwY2lfcmVzdG9yZV9zdGFuZGFyZF9jb25maWcoKSBzaG91bGQgaGF2ZSBiZWVuIGNhbGxlZCBvbmNlIGFscmVhZHksCisJICogYnV0IGl0IHdvdWxkIGhhdmUgZmFpbGVkIGlmIHRoZSBkZXZpY2UncyBwYXJlbnQgYnJpZGdlIGhhZCBub3QgYmVlbgorCSAqIGluIHBvd2VyIHN0YXRlIEQwIGF0IHRoYXQgdGltZS4gIENoZWNrIGl0IGFuZCB0cnkgYWdhaW4gaWYgbmVjZXNzYXJ5LgorCSAqLworCWlmIChwY2lfZGV2LT5jdXJyZW50X3N0YXRlID09IFBDSV9VTktOT1dOKSB7CisJCWludCBlcnJvciA9IHBjaV9yZXN0b3JlX3N0YW5kYXJkX2NvbmZpZyhwY2lfZGV2KTsKKwkJaWYgKGVycm9yKQorCQkJcmV0dXJuIGVycm9yOworCX0KKworCXBjaV9maXh1cF9kZXZpY2UocGNpX2ZpeHVwX3Jlc3VtZSwgcGNpX2Rldik7CisKKwlpZiAoIXBjaV9pc19icmlkZ2UocGNpX2RldikpCisJCXBjaV9lbmFibGVfd2FrZShwY2lfZGV2LCBQQ0lfRDAsIGZhbHNlKTsKKworCXJldHVybiBwY2lfcG1fcmVlbmFibGVfZGV2aWNlKHBjaV9kZXYpOworfQorCitzdGF0aWMgdm9pZCBwY2lfcG1fZGVmYXVsdF9zdXNwZW5kX2dlbmVyaWMoc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYpCit7CisJLyogSWYgZGV2aWNlIGlzIGVuYWJsZWQgYXQgdGhpcyBwb2ludCwgZGlzYWJsZSBpdCAqLworCXBjaV9kaXNhYmxlX2VuYWJsZWRfZGV2aWNlKHBjaV9kZXYpOworCS8qCisJICogU2F2ZSBzdGF0ZSB3aXRoIGludGVycnVwdHMgZW5hYmxlZCwgYmVjYXVzZSBpbiBwcmluY2lwbGUgdGhlIGJ1cyB0aGUKKwkgKiBkZXZpY2UgaXMgb24gbWF5IGJlIHB1dCBpbnRvIGEgbG93IHBvd2VyIHN0YXRlIGFmdGVyIHRoaXMgY29kZSBydW5zLgorCSAqLworCXBjaV9zYXZlX3N0YXRlKHBjaV9kZXYpOworfQorCitzdGF0aWMgdm9pZCBwY2lfcG1fZGVmYXVsdF9zdXNwZW5kKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2KQoreworCXBjaV9wbV9kZWZhdWx0X3N1c3BlbmRfZ2VuZXJpYyhwY2lfZGV2KTsKKworCWlmICghcGNpX2lzX2JyaWRnZShwY2lfZGV2KSkKKwkJcGNpX3ByZXBhcmVfdG9fc2xlZXAocGNpX2Rldik7CisKKwlwY2lfZml4dXBfZGV2aWNlKHBjaV9maXh1cF9zdXNwZW5kLCBwY2lfZGV2KTsKK30KKworc3RhdGljIGJvb2wgcGNpX2hhc19sZWdhY3lfcG1fc3VwcG9ydChzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldikKK3sKKwlzdHJ1Y3QgcGNpX2RyaXZlciAqZHJ2ID0gcGNpX2Rldi0+ZHJpdmVyOworCWJvb2wgcmV0ID0gZHJ2ICYmIChkcnYtPnN1c3BlbmQgfHwgZHJ2LT5zdXNwZW5kX2xhdGUgfHwgZHJ2LT5yZXN1bWUKKwkJfHwgZHJ2LT5yZXN1bWVfZWFybHkpOworCisJLyoKKwkgKiBMZWdhY3kgUE0gc3VwcG9ydCBpcyB1c2VkIGJ5IGRlZmF1bHQsIHNvIHdhcm4gaWYgdGhlIG5ldyBmcmFtZXdvcmsgaXMKKwkgKiBzdXBwb3J0ZWQgYXMgd2VsbC4gIERyaXZlcnMgYXJlIHN1cHBvc2VkIHRvIHN1cHBvcnQgZWl0aGVyIHRoZQorCSAqIGZvcm1lciwgb3IgdGhlIGxhdHRlciwgYnV0IG5vdCBib3RoIGF0IHRoZSBzYW1lIHRpbWUuCisJICovCisJV0FSTl9PTihyZXQgJiYgZHJ2LT5kcml2ZXIucG0pOworCisJcmV0dXJuIHJldDsKK30KKworLyogTmV3IHBvd2VyIG1hbmFnZW1lbnQgZnJhbWV3b3JrICovCisKIHN0YXRpYyBpbnQgcGNpX3BtX3ByZXBhcmUoc3RydWN0IGRldmljZSAqZGV2KQogewogCXN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnYgPSBkZXYtPmRyaXZlcjsKQEAgLTQxNiwxNyArNTM1LDE2IEBACiAJc3RydWN0IGRldmljZV9kcml2ZXIgKmRydiA9IGRldi0+ZHJpdmVyOwogCWludCBlcnJvciA9IDA7CiAKLQlpZiAoZHJ2ICYmIGRydi0+cG0pIHsKLQkJaWYgKGRydi0+cG0tPnN1c3BlbmQpIHsKLQkJCWVycm9yID0gZHJ2LT5wbS0+c3VzcGVuZChkZXYpOwotCQkJc3VzcGVuZF9yZXBvcnRfcmVzdWx0KGRydi0+cG0tPnN1c3BlbmQsIGVycm9yKTsKLQkJfSBlbHNlIHsKLQkJCXBjaV9kZWZhdWx0X3BtX3N1c3BlbmQocGNpX2Rldik7Ci0JCX0KLQl9IGVsc2UgewotCQllcnJvciA9IHBjaV9sZWdhY3lfc3VzcGVuZChkZXYsIFBNU0dfU1VTUEVORCk7CisJaWYgKHBjaV9oYXNfbGVnYWN5X3BtX3N1cHBvcnQocGNpX2RldikpCisJCXJldHVybiBwY2lfbGVnYWN5X3N1c3BlbmQoZGV2LCBQTVNHX1NVU1BFTkQpOworCisJaWYgKGRydiAmJiBkcnYtPnBtICYmIGRydi0+cG0tPnN1c3BlbmQpIHsKKwkJZXJyb3IgPSBkcnYtPnBtLT5zdXNwZW5kKGRldik7CisJCXN1c3BlbmRfcmVwb3J0X3Jlc3VsdChkcnYtPnBtLT5zdXNwZW5kLCBlcnJvcik7CiAJfQotCXBjaV9maXh1cF9kZXZpY2UocGNpX2ZpeHVwX3N1c3BlbmQsIHBjaV9kZXYpOworCisJaWYgKCFlcnJvcikKKwkJcGNpX3BtX2RlZmF1bHRfc3VzcGVuZChwY2lfZGV2KTsKIAogCXJldHVybiBlcnJvcjsKIH0KQEAgLTQzNCwxOCArNTUyLDM3IEBACiBzdGF0aWMgaW50IHBjaV9wbV9zdXNwZW5kX25vaXJxKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiA9IHRvX3BjaV9kZXYoZGV2KTsKLQlzdHJ1Y3QgcGNpX2RyaXZlciAqZHJ2ID0gcGNpX2Rldi0+ZHJpdmVyOworCXN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnYgPSBkZXYtPmRyaXZlcjsKIAlpbnQgZXJyb3IgPSAwOwogCi0JaWYgKGRydiAmJiBkcnYtPnBtKSB7Ci0JCWlmIChkcnYtPnBtLT5zdXNwZW5kX25vaXJxKSB7Ci0JCQllcnJvciA9IGRydi0+cG0tPnN1c3BlbmRfbm9pcnEoZGV2KTsKLQkJCXN1c3BlbmRfcmVwb3J0X3Jlc3VsdChkcnYtPnBtLT5zdXNwZW5kX25vaXJxLCBlcnJvcik7Ci0JCX0KLQl9IGVsc2UgewotCQllcnJvciA9IHBjaV9sZWdhY3lfc3VzcGVuZF9sYXRlKGRldiwgUE1TR19TVVNQRU5EKTsKKwlpZiAocGNpX2hhc19sZWdhY3lfcG1fc3VwcG9ydChwY2lfZGV2KSkKKwkJcmV0dXJuIHBjaV9sZWdhY3lfc3VzcGVuZF9sYXRlKGRldiwgUE1TR19TVVNQRU5EKTsKKworCWlmIChkcnYgJiYgZHJ2LT5wbSAmJiBkcnYtPnBtLT5zdXNwZW5kX25vaXJxKSB7CisJCWVycm9yID0gZHJ2LT5wbS0+c3VzcGVuZF9ub2lycShkZXYpOworCQlzdXNwZW5kX3JlcG9ydF9yZXN1bHQoZHJ2LT5wbS0+c3VzcGVuZF9ub2lycSwgZXJyb3IpOwogCX0KIAorCWlmICghZXJyb3IpCisJCXBjaV9wbV9zZXRfdW5rbm93bl9zdGF0ZShwY2lfZGV2KTsKKworCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIGludCBwY2lfcG1fcmVzdW1lX25vaXJxKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiA9IHRvX3BjaV9kZXYoZGV2KTsKKwlzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2ID0gZGV2LT5kcml2ZXI7CisJaW50IGVycm9yID0gMDsKKworCWlmIChwY2lfaGFzX2xlZ2FjeV9wbV9zdXBwb3J0KHBjaV9kZXYpKQorCQlyZXR1cm4gcGNpX2xlZ2FjeV9yZXN1bWVfZWFybHkoZGV2KTsKKworCXBjaV9wbV9kZWZhdWx0X3Jlc3VtZV9ub2lycShwY2lfZGV2KTsKKworCWlmIChkcnYgJiYgZHJ2LT5wbSAmJiBkcnYtPnBtLT5yZXN1bWVfbm9pcnEpCisJCWVycm9yID0gZHJ2LT5wbS0+cmVzdW1lX25vaXJxKGRldik7CisKIAlyZXR1cm4gZXJyb3I7CiB9CiAKQEAgLTQ1MywzNCArNTkwLDE1IEBACiB7CiAJc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYgPSB0b19wY2lfZGV2KGRldik7CiAJc3RydWN0IGRldmljZV9kcml2ZXIgKmRydiA9IGRldi0+ZHJpdmVyOwotCWludCBlcnJvcjsKLQotCXBjaV9maXh1cF9kZXZpY2UocGNpX2ZpeHVwX3Jlc3VtZSwgcGNpX2Rldik7Ci0KLQlpZiAoZHJ2ICYmIGRydi0+cG0pIHsKLQkJZXJyb3IgPSBkcnYtPnBtLT5yZXN1bWUgPyBkcnYtPnBtLT5yZXN1bWUoZGV2KSA6Ci0JCQlwY2lfZGVmYXVsdF9wbV9yZXN1bWUocGNpX2Rldik7Ci0JfSBlbHNlIHsKLQkJZXJyb3IgPSBwY2lfbGVnYWN5X3Jlc3VtZShkZXYpOwotCX0KLQotCXJldHVybiBlcnJvcjsKLX0KLQotc3RhdGljIGludCBwY2lfcG1fcmVzdW1lX25vaXJxKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiA9IHRvX3BjaV9kZXYoZGV2KTsKLQlzdHJ1Y3QgcGNpX2RyaXZlciAqZHJ2ID0gcGNpX2Rldi0+ZHJpdmVyOwogCWludCBlcnJvciA9IDA7CiAKLQlwY2lfZml4dXBfZGV2aWNlKHBjaV9maXh1cF9yZXN1bWVfZWFybHksIHBjaV9kZXYpOworCWlmIChwY2lfaGFzX2xlZ2FjeV9wbV9zdXBwb3J0KHBjaV9kZXYpKQorCQlyZXR1cm4gcGNpX2xlZ2FjeV9yZXN1bWUoZGV2KTsKIAotCWlmIChkcnYgJiYgZHJ2LT5wbSkgewotCQlpZiAoZHJ2LT5wbS0+cmVzdW1lX25vaXJxKQotCQkJZXJyb3IgPSBkcnYtPnBtLT5yZXN1bWVfbm9pcnEoZGV2KTsKLQl9IGVsc2UgewotCQllcnJvciA9IHBjaV9sZWdhY3lfcmVzdW1lX2Vhcmx5KGRldik7Ci0JfQorCWVycm9yID0gcGNpX3BtX2RlZmF1bHRfcmVzdW1lKHBjaV9kZXYpOworCisJaWYgKCFlcnJvciAmJiBkcnYgJiYgZHJ2LT5wbSAmJiBkcnYtPnBtLT5yZXN1bWUpCisJCWVycm9yID0gZHJ2LT5wbS0+cmVzdW1lKGRldik7CiAKIAlyZXR1cm4gZXJyb3I7CiB9CkBAIC01MDIsMTQxICs2MjAsMTQwIEBACiAJc3RydWN0IGRldmljZV9kcml2ZXIgKmRydiA9IGRldi0+ZHJpdmVyOwogCWludCBlcnJvciA9IDA7CiAKLQlpZiAoZHJ2ICYmIGRydi0+cG0pIHsKLQkJaWYgKGRydi0+cG0tPmZyZWV6ZSkgewotCQkJZXJyb3IgPSBkcnYtPnBtLT5mcmVlemUoZGV2KTsKLQkJCXN1c3BlbmRfcmVwb3J0X3Jlc3VsdChkcnYtPnBtLT5mcmVlemUsIGVycm9yKTsKLQkJfSBlbHNlIHsKLQkJCXBjaV9kZWZhdWx0X3BtX3N1c3BlbmQocGNpX2Rldik7Ci0JCX0KLQl9IGVsc2UgewotCQllcnJvciA9IHBjaV9sZWdhY3lfc3VzcGVuZChkZXYsIFBNU0dfRlJFRVpFKTsKLQkJcGNpX2ZpeHVwX2RldmljZShwY2lfZml4dXBfc3VzcGVuZCwgcGNpX2Rldik7CisJaWYgKHBjaV9oYXNfbGVnYWN5X3BtX3N1cHBvcnQocGNpX2RldikpCisJCXJldHVybiBwY2lfbGVnYWN5X3N1c3BlbmQoZGV2LCBQTVNHX0ZSRUVaRSk7CisKKwlpZiAoZHJ2ICYmIGRydi0+cG0gJiYgZHJ2LT5wbS0+ZnJlZXplKSB7CisJCWVycm9yID0gZHJ2LT5wbS0+ZnJlZXplKGRldik7CisJCXN1c3BlbmRfcmVwb3J0X3Jlc3VsdChkcnYtPnBtLT5mcmVlemUsIGVycm9yKTsKIAl9CiAKKwlpZiAoIWVycm9yKQorCQlwY2lfcG1fZGVmYXVsdF9zdXNwZW5kX2dlbmVyaWMocGNpX2Rldik7CisKIAlyZXR1cm4gZXJyb3I7CiB9CiAKIHN0YXRpYyBpbnQgcGNpX3BtX2ZyZWV6ZV9ub2lycShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYgPSB0b19wY2lfZGV2KGRldik7Ci0Jc3RydWN0IHBjaV9kcml2ZXIgKmRydiA9IHBjaV9kZXYtPmRyaXZlcjsKLQlpbnQgZXJyb3IgPSAwOwotCi0JaWYgKGRydiAmJiBkcnYtPnBtKSB7Ci0JCWlmIChkcnYtPnBtLT5mcmVlemVfbm9pcnEpIHsKLQkJCWVycm9yID0gZHJ2LT5wbS0+ZnJlZXplX25vaXJxKGRldik7Ci0JCQlzdXNwZW5kX3JlcG9ydF9yZXN1bHQoZHJ2LT5wbS0+ZnJlZXplX25vaXJxLCBlcnJvcik7Ci0JCX0KLQl9IGVsc2UgewotCQllcnJvciA9IHBjaV9sZWdhY3lfc3VzcGVuZF9sYXRlKGRldiwgUE1TR19GUkVFWkUpOwotCX0KLQotCXJldHVybiBlcnJvcjsKLX0KLQotc3RhdGljIGludCBwY2lfcG1fdGhhdyhzdHJ1Y3QgZGV2aWNlICpkZXYpCi17CiAJc3RydWN0IGRldmljZV9kcml2ZXIgKmRydiA9IGRldi0+ZHJpdmVyOwogCWludCBlcnJvciA9IDA7CiAKLQlpZiAoZHJ2ICYmIGRydi0+cG0pIHsKLQkJaWYgKGRydi0+cG0tPnRoYXcpCi0JCQllcnJvciA9ICBkcnYtPnBtLT50aGF3KGRldik7Ci0JfSBlbHNlIHsKLQkJcGNpX2ZpeHVwX2RldmljZShwY2lfZml4dXBfcmVzdW1lLCB0b19wY2lfZGV2KGRldikpOwotCQllcnJvciA9IHBjaV9sZWdhY3lfcmVzdW1lKGRldik7CisJaWYgKHBjaV9oYXNfbGVnYWN5X3BtX3N1cHBvcnQocGNpX2RldikpCisJCXJldHVybiBwY2lfbGVnYWN5X3N1c3BlbmRfbGF0ZShkZXYsIFBNU0dfRlJFRVpFKTsKKworCWlmIChkcnYgJiYgZHJ2LT5wbSAmJiBkcnYtPnBtLT5mcmVlemVfbm9pcnEpIHsKKwkJZXJyb3IgPSBkcnYtPnBtLT5mcmVlemVfbm9pcnEoZGV2KTsKKwkJc3VzcGVuZF9yZXBvcnRfcmVzdWx0KGRydi0+cG0tPmZyZWV6ZV9ub2lycSwgZXJyb3IpOwogCX0KIAorCWlmICghZXJyb3IpCisJCXBjaV9wbV9zZXRfdW5rbm93bl9zdGF0ZShwY2lfZGV2KTsKKwogCXJldHVybiBlcnJvcjsKIH0KIAogc3RhdGljIGludCBwY2lfcG1fdGhhd19ub2lycShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYgPSB0b19wY2lfZGV2KGRldik7Ci0Jc3RydWN0IHBjaV9kcml2ZXIgKmRydiA9IHBjaV9kZXYtPmRyaXZlcjsKKwlzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2ID0gZGV2LT5kcml2ZXI7CiAJaW50IGVycm9yID0gMDsKIAotCWlmIChkcnYgJiYgZHJ2LT5wbSkgewotCQlpZiAoZHJ2LT5wbS0+dGhhd19ub2lycSkKLQkJCWVycm9yID0gZHJ2LT5wbS0+dGhhd19ub2lycShkZXYpOwotCX0gZWxzZSB7Ci0JCXBjaV9maXh1cF9kZXZpY2UocGNpX2ZpeHVwX3Jlc3VtZV9lYXJseSwgcGNpX2Rldik7Ci0JCWVycm9yID0gcGNpX2xlZ2FjeV9yZXN1bWVfZWFybHkoZGV2KTsKLQl9CisJaWYgKHBjaV9oYXNfbGVnYWN5X3BtX3N1cHBvcnQocGNpX2RldikpCisJCXJldHVybiBwY2lfbGVnYWN5X3Jlc3VtZV9lYXJseShkZXYpOworCisJcGNpX3VwZGF0ZV9jdXJyZW50X3N0YXRlKHBjaV9kZXYsIFBDSV9EMCk7CisKKwlpZiAoZHJ2ICYmIGRydi0+cG0gJiYgZHJ2LT5wbS0+dGhhd19ub2lycSkKKwkJZXJyb3IgPSBkcnYtPnBtLT50aGF3X25vaXJxKGRldik7CisKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyBpbnQgcGNpX3BtX3RoYXcoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2ID0gdG9fcGNpX2RldihkZXYpOworCXN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnYgPSBkZXYtPmRyaXZlcjsKKwlpbnQgZXJyb3IgPSAwOworCisJaWYgKHBjaV9oYXNfbGVnYWN5X3BtX3N1cHBvcnQocGNpX2RldikpCisJCXJldHVybiBwY2lfbGVnYWN5X3Jlc3VtZShkZXYpOworCisJcGNpX3BtX3JlZW5hYmxlX2RldmljZShwY2lfZGV2KTsKKworCWlmIChkcnYgJiYgZHJ2LT5wbSAmJiBkcnYtPnBtLT50aGF3KQorCQllcnJvciA9ICBkcnYtPnBtLT50aGF3KGRldik7CiAKIAlyZXR1cm4gZXJyb3I7CiB9CiAKIHN0YXRpYyBpbnQgcGNpX3BtX3Bvd2Vyb2ZmKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKKwlzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiA9IHRvX3BjaV9kZXYoZGV2KTsKIAlzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2ID0gZGV2LT5kcml2ZXI7CiAJaW50IGVycm9yID0gMDsKIAotCXBjaV9maXh1cF9kZXZpY2UocGNpX2ZpeHVwX3N1c3BlbmQsIHRvX3BjaV9kZXYoZGV2KSk7CisJaWYgKHBjaV9oYXNfbGVnYWN5X3BtX3N1cHBvcnQocGNpX2RldikpCisJCXJldHVybiBwY2lfbGVnYWN5X3N1c3BlbmQoZGV2LCBQTVNHX0hJQkVSTkFURSk7CiAKLQlpZiAoZHJ2ICYmIGRydi0+cG0pIHsKLQkJaWYgKGRydi0+cG0tPnBvd2Vyb2ZmKSB7Ci0JCQllcnJvciA9IGRydi0+cG0tPnBvd2Vyb2ZmKGRldik7Ci0JCQlzdXNwZW5kX3JlcG9ydF9yZXN1bHQoZHJ2LT5wbS0+cG93ZXJvZmYsIGVycm9yKTsKLQkJfQotCX0gZWxzZSB7Ci0JCWVycm9yID0gcGNpX2xlZ2FjeV9zdXNwZW5kKGRldiwgUE1TR19ISUJFUk5BVEUpOworCWlmIChkcnYgJiYgZHJ2LT5wbSAmJiBkcnYtPnBtLT5wb3dlcm9mZikgeworCQllcnJvciA9IGRydi0+cG0tPnBvd2Vyb2ZmKGRldik7CisJCXN1c3BlbmRfcmVwb3J0X3Jlc3VsdChkcnYtPnBtLT5wb3dlcm9mZiwgZXJyb3IpOwogCX0KIAorCWlmICghZXJyb3IpCisJCXBjaV9wbV9kZWZhdWx0X3N1c3BlbmQocGNpX2Rldik7CisKIAlyZXR1cm4gZXJyb3I7CiB9CiAKIHN0YXRpYyBpbnQgcGNpX3BtX3Bvd2Vyb2ZmX25vaXJxKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiA9IHRvX3BjaV9kZXYoZGV2KTsKLQlzdHJ1Y3QgcGNpX2RyaXZlciAqZHJ2ID0gcGNpX2Rldi0+ZHJpdmVyOworCXN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnYgPSBkZXYtPmRyaXZlcjsKIAlpbnQgZXJyb3IgPSAwOwogCi0JaWYgKGRydiAmJiBkcnYtPnBtKSB7Ci0JCWlmIChkcnYtPnBtLT5wb3dlcm9mZl9ub2lycSkgewotCQkJZXJyb3IgPSBkcnYtPnBtLT5wb3dlcm9mZl9ub2lycShkZXYpOwotCQkJc3VzcGVuZF9yZXBvcnRfcmVzdWx0KGRydi0+cG0tPnBvd2Vyb2ZmX25vaXJxLCBlcnJvcik7Ci0JCX0KLQl9IGVsc2UgewotCQllcnJvciA9IHBjaV9sZWdhY3lfc3VzcGVuZF9sYXRlKGRldiwgUE1TR19ISUJFUk5BVEUpOworCWlmIChwY2lfaGFzX2xlZ2FjeV9wbV9zdXBwb3J0KHRvX3BjaV9kZXYoZGV2KSkpCisJCXJldHVybiBwY2lfbGVnYWN5X3N1c3BlbmRfbGF0ZShkZXYsIFBNU0dfSElCRVJOQVRFKTsKKworCWlmIChkcnYgJiYgZHJ2LT5wbSAmJiBkcnYtPnBtLT5wb3dlcm9mZl9ub2lycSkgeworCQllcnJvciA9IGRydi0+cG0tPnBvd2Vyb2ZmX25vaXJxKGRldik7CisJCXN1c3BlbmRfcmVwb3J0X3Jlc3VsdChkcnYtPnBtLT5wb3dlcm9mZl9ub2lycSwgZXJyb3IpOwogCX0KIAogCXJldHVybiBlcnJvcjsKIH0KIAorc3RhdGljIGludCBwY2lfcG1fcmVzdG9yZV9ub2lycShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYgPSB0b19wY2lfZGV2KGRldik7CisJc3RydWN0IGRldmljZV9kcml2ZXIgKmRydiA9IGRldi0+ZHJpdmVyOworCWludCBlcnJvciA9IDA7CisKKwlpZiAocGNpX2hhc19sZWdhY3lfcG1fc3VwcG9ydChwY2lfZGV2KSkKKwkJcmV0dXJuIHBjaV9sZWdhY3lfcmVzdW1lX2Vhcmx5KGRldik7CisKKwlwY2lfcG1fZGVmYXVsdF9yZXN1bWVfbm9pcnEocGNpX2Rldik7CisKKwlpZiAoZHJ2ICYmIGRydi0+cG0gJiYgZHJ2LT5wbS0+cmVzdG9yZV9ub2lycSkKKwkJZXJyb3IgPSBkcnYtPnBtLT5yZXN0b3JlX25vaXJxKGRldik7CisKKwlyZXR1cm4gZXJyb3I7Cit9CisKIHN0YXRpYyBpbnQgcGNpX3BtX3Jlc3RvcmUoc3RydWN0IGRldmljZSAqZGV2KQogewogCXN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2ID0gdG9fcGNpX2RldihkZXYpOwogCXN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnYgPSBkZXYtPmRyaXZlcjsKLQlpbnQgZXJyb3I7Ci0KLQlpZiAoZHJ2ICYmIGRydi0+cG0pIHsKLQkJZXJyb3IgPSBkcnYtPnBtLT5yZXN0b3JlID8gZHJ2LT5wbS0+cmVzdG9yZShkZXYpIDoKLQkJCXBjaV9kZWZhdWx0X3BtX3Jlc3VtZShwY2lfZGV2KTsKLQl9IGVsc2UgewotCQllcnJvciA9IHBjaV9sZWdhY3lfcmVzdW1lKGRldik7Ci0JfQotCXBjaV9maXh1cF9kZXZpY2UocGNpX2ZpeHVwX3Jlc3VtZSwgcGNpX2Rldik7Ci0KLQlyZXR1cm4gZXJyb3I7Ci19Ci0KLXN0YXRpYyBpbnQgcGNpX3BtX3Jlc3RvcmVfbm9pcnEoc3RydWN0IGRldmljZSAqZGV2KQotewotCXN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2ID0gdG9fcGNpX2RldihkZXYpOwotCXN0cnVjdCBwY2lfZHJpdmVyICpkcnYgPSBwY2lfZGV2LT5kcml2ZXI7CiAJaW50IGVycm9yID0gMDsKIAotCXBjaV9maXh1cF9kZXZpY2UocGNpX2ZpeHVwX3Jlc3VtZSwgcGNpX2Rldik7CisJaWYgKHBjaV9oYXNfbGVnYWN5X3BtX3N1cHBvcnQocGNpX2RldikpCisJCXJldHVybiBwY2lfbGVnYWN5X3Jlc3VtZShkZXYpOwogCi0JaWYgKGRydiAmJiBkcnYtPnBtKSB7Ci0JCWlmIChkcnYtPnBtLT5yZXN0b3JlX25vaXJxKQotCQkJZXJyb3IgPSBkcnYtPnBtLT5yZXN0b3JlX25vaXJxKGRldik7Ci0JfSBlbHNlIHsKLQkJZXJyb3IgPSBwY2lfbGVnYWN5X3Jlc3VtZV9lYXJseShkZXYpOwotCX0KLQlwY2lfZml4dXBfZGV2aWNlKHBjaV9maXh1cF9yZXN1bWVfZWFybHksIHBjaV9kZXYpOworCWVycm9yID0gcGNpX3BtX2RlZmF1bHRfcmVzdW1lKHBjaV9kZXYpOworCisJaWYgKCFlcnJvciAmJiBkcnYgJiYgZHJ2LT5wbSAmJiBkcnYtPnBtLT5yZXN0b3JlKQorCQllcnJvciA9IGRydi0+cG0tPnJlc3RvcmUoZGV2KTsKIAogCXJldHVybiBlcnJvcjsKIH0KQEAgLTY1NCwxNyArNzcxLDE1IEBACiAKICNlbmRpZiAvKiAhQ09ORklHX0hJQkVSTkFUSU9OICovCiAKLXN0cnVjdCBwbV9leHRfb3BzIHBjaV9wbV9vcHMgPSB7Ci0JLmJhc2UgPSB7Ci0JCS5wcmVwYXJlID0gcGNpX3BtX3ByZXBhcmUsCi0JCS5jb21wbGV0ZSA9IHBjaV9wbV9jb21wbGV0ZSwKLQkJLnN1c3BlbmQgPSBwY2lfcG1fc3VzcGVuZCwKLQkJLnJlc3VtZSA9IHBjaV9wbV9yZXN1bWUsCi0JCS5mcmVlemUgPSBwY2lfcG1fZnJlZXplLAotCQkudGhhdyA9IHBjaV9wbV90aGF3LAotCQkucG93ZXJvZmYgPSBwY2lfcG1fcG93ZXJvZmYsCi0JCS5yZXN0b3JlID0gcGNpX3BtX3Jlc3RvcmUsCi0JfSwKK3N0cnVjdCBkZXZfcG1fb3BzIHBjaV9kZXZfcG1fb3BzID0geworCS5wcmVwYXJlID0gcGNpX3BtX3ByZXBhcmUsCisJLmNvbXBsZXRlID0gcGNpX3BtX2NvbXBsZXRlLAorCS5zdXNwZW5kID0gcGNpX3BtX3N1c3BlbmQsCisJLnJlc3VtZSA9IHBjaV9wbV9yZXN1bWUsCisJLmZyZWV6ZSA9IHBjaV9wbV9mcmVlemUsCisJLnRoYXcgPSBwY2lfcG1fdGhhdywKKwkucG93ZXJvZmYgPSBwY2lfcG1fcG93ZXJvZmYsCisJLnJlc3RvcmUgPSBwY2lfcG1fcmVzdG9yZSwKIAkuc3VzcGVuZF9ub2lycSA9IHBjaV9wbV9zdXNwZW5kX25vaXJxLAogCS5yZXN1bWVfbm9pcnEgPSBwY2lfcG1fcmVzdW1lX25vaXJxLAogCS5mcmVlemVfbm9pcnEgPSBwY2lfcG1fZnJlZXplX25vaXJxLApAQCAtNjczLDcgKzc4OCw3IEBACiAJLnJlc3RvcmVfbm9pcnEgPSBwY2lfcG1fcmVzdG9yZV9ub2lycSwKIH07CiAKLSNkZWZpbmUgUENJX1BNX09QU19QVFIJJnBjaV9wbV9vcHMKKyNkZWZpbmUgUENJX1BNX09QU19QVFIJKCZwY2lfZGV2X3BtX29wcykKIAogI2Vsc2UgLyogIUNPTkZJR19QTV9TTEVFUCAqLwogCkBAIC03MDMsOSArODE4LDYgQEAKIAlkcnYtPmRyaXZlci5vd25lciA9IG93bmVyOwogCWRydi0+ZHJpdmVyLm1vZF9uYW1lID0gbW9kX25hbWU7CiAKLQlpZiAoZHJ2LT5wbSkKLQkJZHJ2LT5kcml2ZXIucG0gPSAmZHJ2LT5wbS0+YmFzZTsKLQogCXNwaW5fbG9ja19pbml0KCZkcnYtPmR5bmlkcy5sb2NrKTsKIAlJTklUX0xJU1RfSEVBRCgmZHJ2LT5keW5pZHMubGlzdCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3BjaS1zdHViLmMgYi9kcml2ZXJzL3BjaS9wY2ktc3R1Yi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0ZmJlYzAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3BjaS9wY2ktc3R1Yi5jCkBAIC0wLDAgKzEsNDcgQEAKKy8qIHBjaS1zdHViIC0gc2ltcGxlIHN0dWIgZHJpdmVyIHRvIHJlc2VydmUgYSBwY2kgZGV2aWNlCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFJlZCBIYXQsIEluYy4KKyAqIEF1dGhvcjoKKyAqIAlDaHJpcyBXcmlnaHQKKyAqCisgKiBUaGlzIHdvcmsgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMLCB2ZXJzaW9uIDIuCisgKgorICogVXNhZ2UgaXMgc2ltcGxlLCBhbGxvY2F0ZSBhIG5ldyBpZCB0byB0aGUgc3R1YiBkcml2ZXIgYW5kIGJpbmQgdGhlCisgKiBkZXZpY2UgdG8gaXQuICBGb3IgZXhhbXBsZToKKyAqIAorICogIyBlY2hvICI4MDg2IDEwZjUiID4gL3N5cy9idXMvcGNpL2RyaXZlcnMvcGNpLXN0dWIvbmV3X2lkCisgKiAjIGVjaG8gLW4gMDAwMDowMDoxOS4wID4gL3N5cy9idXMvcGNpL2RyaXZlcnMvZTEwMDBlL3VuYmluZAorICogIyBlY2hvIC1uIDAwMDA6MDA6MTkuMCA+IC9zeXMvYnVzL3BjaS9kcml2ZXJzL3BjaS1zdHViL2JpbmQKKyAqICMgbHMgLWwgL3N5cy9idXMvcGNpL2RldmljZXMvMDAwMDowMDoxOS4wL2RyaXZlcgorICogLi4uLzAwMDA6MDA6MTkuMC9kcml2ZXIgLT4gLi4vLi4vLi4vYnVzL3BjaS9kcml2ZXJzL3BjaS1zdHViCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorCitzdGF0aWMgaW50IHBjaV9zdHViX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIHN0dWJfZHJpdmVyID0geworCS5uYW1lCQk9ICJwY2ktc3R1YiIsCisJLmlkX3RhYmxlCT0gTlVMTCwJLyogb25seSBkeW5hbWljIGlkJ3MgKi8KKwkucHJvYmUJCT0gcGNpX3N0dWJfcHJvYmUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBwY2lfc3R1Yl9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJnN0dWJfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHBjaV9zdHViX2V4aXQodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJnN0dWJfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQocGNpX3N0dWJfaW5pdCk7Cittb2R1bGVfZXhpdChwY2lfc3R1Yl9leGl0KTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiQ2hyaXMgV3JpZ2h0IDxjaHJpc3dAc291cy1zb2wub3JnPiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvcGNpLXN5c2ZzLmMgYi9kcml2ZXJzL3BjaS9wY2ktc3lzZnMuYwppbmRleCBjODg0ODU4Li5jMjM2MTlmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9wY2ktc3lzZnMuYworKysgYi9kcml2ZXJzL3BjaS9wY2ktc3lzZnMuYwpAQCAtNTgsMTMgKzU4LDE0IEBACiAJCQkJCSAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7CiAJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGRldik7Ci0Jc3NpemVfdCBjb25zdW1lZCA9IC1FSU5WQUw7CisJdW5zaWduZWQgbG9uZyB2YWw7CiAKLQlpZiAoKGNvdW50ID4gMCkgJiYgKCpidWYgPT0gJzAnIHx8ICpidWYgPT0gJzEnKSkgewotCQlwZGV2LT5icm9rZW5fcGFyaXR5X3N0YXR1cyA9ICpidWYgPT0gJzEnID8gMSA6IDA7Ci0JCWNvbnN1bWVkID0gY291bnQ7Ci0JfQotCXJldHVybiBjb25zdW1lZDsKKwlpZiAoc3RyaWN0X3N0cnRvdWwoYnVmLCAwLCAmdmFsKSA8IDApCisJCXJldHVybiAtRUlOVkFMOworCisJcGRldi0+YnJva2VuX3Bhcml0eV9zdGF0dXMgPSAhIXZhbDsKKworCXJldHVybiBjb3VudDsKIH0KIAogc3RhdGljIHNzaXplX3QgbG9jYWxfY3B1c19zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKQEAgLTEwMSwxMSArMTAyLDEzIEBACiAJc3RydWN0IHBjaV9kZXYgKiBwY2lfZGV2ID0gdG9fcGNpX2RldihkZXYpOwogCWNoYXIgKiBzdHIgPSBidWY7CiAJaW50IGk7Ci0JaW50IG1heCA9IDc7CisJaW50IG1heDsKIAlyZXNvdXJjZV9zaXplX3Qgc3RhcnQsIGVuZDsKIAogCWlmIChwY2lfZGV2LT5zdWJvcmRpbmF0ZSkKIAkJbWF4ID0gREVWSUNFX0NPVU5UX1JFU09VUkNFOworCWVsc2UKKwkJbWF4ID0gUENJX0JSSURHRV9SRVNPVVJDRVM7CiAKIAlmb3IgKGkgPSAwOyBpIDwgbWF4OyBpKyspIHsKIAkJc3RydWN0IHJlc291cmNlICpyZXMgPSAgJnBjaV9kZXYtPnJlc291cmNlW2ldOwpAQCAtMTMzLDE5ICsxMzYsMjMgQEAKIAkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLAogCQkJCXNpemVfdCBjb3VudCkKIHsKLQlzc2l6ZV90IHJlc3VsdCA9IC1FSU5WQUw7CiAJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGRldik7CisJdW5zaWduZWQgbG9uZyB2YWw7CisJc3NpemVfdCByZXN1bHQgPSBzdHJpY3Rfc3RydG91bChidWYsIDAsICZ2YWwpOworCisJaWYgKHJlc3VsdCA8IDApCisJCXJldHVybiByZXN1bHQ7CiAKIAkvKiB0aGlzIGNhbiBjcmFzaCB0aGUgbWFjaGluZSB3aGVuIGRvbmUgb24gdGhlICJ3cm9uZyIgZGV2aWNlICovCiAJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQotCQlyZXR1cm4gY291bnQ7CisJCXJldHVybiAtRVBFUk07CiAKLQlpZiAoKmJ1ZiA9PSAnMCcpIHsKKwlpZiAoIXZhbCkgewogCQlpZiAoYXRvbWljX3JlYWQoJnBkZXYtPmVuYWJsZV9jbnQpICE9IDApCiAJCQlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CiAJCWVsc2UKIAkJCXJlc3VsdCA9IC1FSU87Ci0JfSBlbHNlIGlmICgqYnVmID09ICcxJykKKwl9IGVsc2UKIAkJcmVzdWx0ID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7CiAKIAlyZXR1cm4gcmVzdWx0IDwgMCA/IHJlc3VsdCA6IGNvdW50OwpAQCAtMTg1LDI1ICsxOTIsMjggQEAKIAkgICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKIAlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRvX3BjaV9kZXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nIHZhbDsKKworCWlmIChzdHJpY3Rfc3RydG91bChidWYsIDAsICZ2YWwpIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CiAKIAkvKiBiYWQgdGhpbmdzIG1heSBoYXBwZW4gaWYgdGhlIG5vX21zaSBmbGFnIGlzIGNoYW5nZWQKIAkgKiB3aGlsZSBzb21lIGRyaXZlcnMgYXJlIGxvYWRlZCAqLwogCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKLQkJcmV0dXJuIGNvdW50OworCQlyZXR1cm4gLUVQRVJNOwogCisJLyogTWF5YmUgcGNpIGRldmljZXMgd2l0aG91dCBzdWJvcmRpbmF0ZSBidXNzZXMgc2hvdWxkbid0IGV2ZW4gaGF2ZSB0aGlzCisJICogYXR0cmlidXRlIGluIHRoZSBmaXJzdCBwbGFjZT8gICovCiAJaWYgKCFwZGV2LT5zdWJvcmRpbmF0ZSkKIAkJcmV0dXJuIGNvdW50OwogCi0JaWYgKCpidWYgPT0gJzAnKSB7Ci0JCXBkZXYtPnN1Ym9yZGluYXRlLT5idXNfZmxhZ3MgfD0gUENJX0JVU19GTEFHU19OT19NU0k7Ci0JCWRldl93YXJuKCZwZGV2LT5kZXYsICJmb3JjZWQgc3Vib3JkaW5hdGUgYnVzIHRvIG5vdCBzdXBwb3J0IE1TSSwiCi0JCQkgIiBiYWQgdGhpbmdzIGNvdWxkIGhhcHBlbi5cbiIpOwotCX0KKwkvKiBJcyB0aGUgZmxhZyBnb2luZyB0byBjaGFuZ2UsIG9yIGtlZXAgdGhlIHZhbHVlIGl0IGFscmVhZHkgaGFkPyAqLworCWlmICghKHBkZXYtPnN1Ym9yZGluYXRlLT5idXNfZmxhZ3MgJiBQQ0lfQlVTX0ZMQUdTX05PX01TSSkgXgorCSAgICAhIXZhbCkgeworCQlwZGV2LT5zdWJvcmRpbmF0ZS0+YnVzX2ZsYWdzIF49IFBDSV9CVVNfRkxBR1NfTk9fTVNJOwogCi0JaWYgKCpidWYgPT0gJzEnKSB7Ci0JCXBkZXYtPnN1Ym9yZGluYXRlLT5idXNfZmxhZ3MgJj0gflBDSV9CVVNfRkxBR1NfTk9fTVNJOwotCQlkZXZfd2FybigmcGRldi0+ZGV2LCAiZm9yY2VkIHN1Ym9yZGluYXRlIGJ1cyB0byBzdXBwb3J0IE1TSSwiCi0JCQkgIiBiYWQgdGhpbmdzIGNvdWxkIGhhcHBlbi5cbiIpOworCQlkZXZfd2FybigmcGRldi0+ZGV2LCAiZm9yY2VkIHN1Ym9yZGluYXRlIGJ1cyB0byVzIHN1cHBvcnQgTVNJLCIKKwkJCSAiIGJhZCB0aGluZ3MgY291bGQgaGFwcGVuXG4iLCB2YWwgPyAiIiA6ICIgbm90Iik7CiAJfQogCiAJcmV0dXJuIGNvdW50OwpAQCAtMzYxLDU1ICszNzEsMzMgQEAKIH0KIAogc3RhdGljIHNzaXplX3QKLXBjaV9yZWFkX3ZwZChzdHJ1Y3Qga29iamVjdCAqa29iaiwgc3RydWN0IGJpbl9hdHRyaWJ1dGUgKmJpbl9hdHRyLAotCSAgICAgY2hhciAqYnVmLCBsb2ZmX3Qgb2ZmLCBzaXplX3QgY291bnQpCi17Ci0Jc3RydWN0IHBjaV9kZXYgKmRldiA9Ci0JCXRvX3BjaV9kZXYoY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBkZXZpY2UsIGtvYmopKTsKLQlpbnQgZW5kOwotCWludCByZXQ7Ci0KLQlpZiAob2ZmID4gYmluX2F0dHItPnNpemUpCi0JCWNvdW50ID0gMDsKLQllbHNlIGlmIChjb3VudCA+IGJpbl9hdHRyLT5zaXplIC0gb2ZmKQotCQljb3VudCA9IGJpbl9hdHRyLT5zaXplIC0gb2ZmOwotCWVuZCA9IG9mZiArIGNvdW50OwotCi0Jd2hpbGUgKG9mZiA8IGVuZCkgewotCQlyZXQgPSBkZXYtPnZwZC0+b3BzLT5yZWFkKGRldiwgb2ZmLCBlbmQgLSBvZmYsIGJ1Zik7Ci0JCWlmIChyZXQgPCAwKQotCQkJcmV0dXJuIHJldDsKLQkJYnVmICs9IHJldDsKLQkJb2ZmICs9IHJldDsKLQl9Ci0KLQlyZXR1cm4gY291bnQ7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90Ci1wY2lfd3JpdGVfdnBkKHN0cnVjdCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqYmluX2F0dHIsCityZWFkX3ZwZF9hdHRyKHN0cnVjdCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqYmluX2F0dHIsCiAJICAgICAgY2hhciAqYnVmLCBsb2ZmX3Qgb2ZmLCBzaXplX3QgY291bnQpCiB7CiAJc3RydWN0IHBjaV9kZXYgKmRldiA9CiAJCXRvX3BjaV9kZXYoY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBkZXZpY2UsIGtvYmopKTsKLQlpbnQgZW5kOwotCWludCByZXQ7CiAKIAlpZiAob2ZmID4gYmluX2F0dHItPnNpemUpCiAJCWNvdW50ID0gMDsKIAllbHNlIGlmIChjb3VudCA+IGJpbl9hdHRyLT5zaXplIC0gb2ZmKQogCQljb3VudCA9IGJpbl9hdHRyLT5zaXplIC0gb2ZmOwotCWVuZCA9IG9mZiArIGNvdW50OwogCi0Jd2hpbGUgKG9mZiA8IGVuZCkgewotCQlyZXQgPSBkZXYtPnZwZC0+b3BzLT53cml0ZShkZXYsIG9mZiwgZW5kIC0gb2ZmLCBidWYpOwotCQlpZiAocmV0IDwgMCkKLQkJCXJldHVybiByZXQ7Ci0JCWJ1ZiArPSByZXQ7Ci0JCW9mZiArPSByZXQ7Ci0JfQorCXJldHVybiBwY2lfcmVhZF92cGQoZGV2LCBvZmYsIGNvdW50LCBidWYpOworfQogCi0JcmV0dXJuIGNvdW50Oworc3RhdGljIHNzaXplX3QKK3dyaXRlX3ZwZF9hdHRyKHN0cnVjdCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqYmluX2F0dHIsCisJICAgICAgIGNoYXIgKmJ1ZiwgbG9mZl90IG9mZiwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBwY2lfZGV2ICpkZXYgPQorCQl0b19wY2lfZGV2KGNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgZGV2aWNlLCBrb2JqKSk7CisKKwlpZiAob2ZmID4gYmluX2F0dHItPnNpemUpCisJCWNvdW50ID0gMDsKKwllbHNlIGlmIChjb3VudCA+IGJpbl9hdHRyLT5zaXplIC0gb2ZmKQorCQljb3VudCA9IGJpbl9hdHRyLT5zaXplIC0gb2ZmOworCisJcmV0dXJuIHBjaV93cml0ZV92cGQoZGV2LCBvZmYsIGNvdW50LCBidWYpOwogfQogCiAjaWZkZWYgSEFWRV9QQ0lfTEVHQUNZCkBAIC01NjksNyArNTU3LDcgQEAKIAogI2lmZGVmIEhBVkVfUENJX01NQVAKIAotc3RhdGljIGludCBwY2lfbW1hcF9maXRzKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBpbnQgcmVzbm8sIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQoraW50IHBjaV9tbWFwX2ZpdHMoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGludCByZXNubywgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCiB7CiAJdW5zaWduZWQgbG9uZyBuciwgc3RhcnQsIHNpemU7CiAKQEAgLTYyMCw2ICs2MDgsOSBAQAogCXZtYS0+dm1fcGdvZmYgKz0gc3RhcnQgPj4gUEFHRV9TSElGVDsKIAltbWFwX3R5cGUgPSByZXMtPmZsYWdzICYgSU9SRVNPVVJDRV9NRU0gPyBwY2lfbW1hcF9tZW0gOiBwY2lfbW1hcF9pbzsKIAorCWlmIChyZXMtPmZsYWdzICYgSU9SRVNPVVJDRV9NRU0gJiYgaW9tZW1faXNfZXhjbHVzaXZlKHN0YXJ0KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKIAlyZXR1cm4gcGNpX21tYXBfcGFnZV9yYW5nZShwZGV2LCB2bWEsIG1tYXBfdHlwZSwgd3JpdGVfY29tYmluZSk7CiB9CiAKQEAgLTgzMiw4ICs4MjMsOCBAQAogCQlhdHRyLT5zaXplID0gZGV2LT52cGQtPmxlbjsKIAkJYXR0ci0+YXR0ci5uYW1lID0gInZwZCI7CiAJCWF0dHItPmF0dHIubW9kZSA9IFNfSVJVU1IgfCBTX0lXVVNSOwotCQlhdHRyLT5yZWFkID0gcGNpX3JlYWRfdnBkOwotCQlhdHRyLT53cml0ZSA9IHBjaV93cml0ZV92cGQ7CisJCWF0dHItPnJlYWQgPSByZWFkX3ZwZF9hdHRyOworCQlhdHRyLT53cml0ZSA9IHdyaXRlX3ZwZF9hdHRyOwogCQlyZXR2YWwgPSBzeXNmc19jcmVhdGVfYmluX2ZpbGUoJmRldi0+ZGV2LmtvYmosIGF0dHIpOwogCQlpZiAocmV0dmFsKSB7CiAJCQlrZnJlZShkZXYtPnZwZC0+YXR0cik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9wY2kuYyBiL2RyaXZlcnMvcGNpL3BjaS5jCmluZGV4IDA2MWQxZWUuLmMxMmY2YzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3BjaS5jCisrKyBiL2RyaXZlcnMvcGNpL3BjaS5jCkBAIC01Niw2ICs1NiwyMiBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwocGNpX2J1c19tYXhfYnVzbnIpOwogCisjaWZkZWYgQ09ORklHX0hBU19JT01FTQordm9pZCBfX2lvbWVtICpwY2lfaW9yZW1hcF9iYXIoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGludCBiYXIpCit7CisJLyoKKwkgKiBNYWtlIHN1cmUgdGhlIEJBUiBpcyBhY3R1YWxseSBhIG1lbW9yeSByZXNvdXJjZSwgbm90IGFuIElPIHJlc291cmNlCisJICovCisJaWYgKCEocGNpX3Jlc291cmNlX2ZsYWdzKHBkZXYsIGJhcikgJiBJT1JFU09VUkNFX01FTSkpIHsKKwkJV0FSTl9PTigxKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCXJldHVybiBpb3JlbWFwX25vY2FjaGUocGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIGJhciksCisJCQkJICAgICBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIGJhcikpOworfQorRVhQT1JUX1NZTUJPTF9HUEwocGNpX2lvcmVtYXBfYmFyKTsKKyNlbmRpZgorCiAjaWYgMAogLyoqCiAgKiBwY2lfbWF4X2J1c25yIC0gcmV0dXJucyBtYXhpbXVtIFBDSSBidXMgbnVtYmVyCkBAIC0zNjAsMjUgKzM3NiwxMCBAQAogc3RhdGljIHZvaWQKIHBjaV9yZXN0b3JlX2JhcnMoc3RydWN0IHBjaV9kZXYgKmRldikKIHsKLQlpbnQgaSwgbnVtcmVzOworCWludCBpOwogCi0Jc3dpdGNoIChkZXYtPmhkcl90eXBlKSB7Ci0JY2FzZSBQQ0lfSEVBREVSX1RZUEVfTk9STUFMOgotCQludW1yZXMgPSA2OwotCQlicmVhazsKLQljYXNlIFBDSV9IRUFERVJfVFlQRV9CUklER0U6Ci0JCW51bXJlcyA9IDI7Ci0JCWJyZWFrOwotCWNhc2UgUENJX0hFQURFUl9UWVBFX0NBUkRCVVM6Ci0JCW51bXJlcyA9IDE7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCS8qIFNob3VsZCBuZXZlciBnZXQgaGVyZSwgYnV0IGp1c3QgaW4gY2FzZS4uLiAqLwotCQlyZXR1cm47Ci0JfQotCi0JZm9yIChpID0gMDsgaSA8IG51bXJlczsgaSArKykKLQkJcGNpX3VwZGF0ZV9yZXNvdXJjZShkZXYsICZkZXYtPnJlc291cmNlW2ldLCBpKTsKKwlmb3IgKGkgPSAwOyBpIDwgUENJX0JSSURHRV9SRVNPVVJDRVM7IGkrKykKKwkJcGNpX3VwZGF0ZV9yZXNvdXJjZShkZXYsIGkpOwogfQogCiBzdGF0aWMgc3RydWN0IHBjaV9wbGF0Zm9ybV9wbV9vcHMgKnBjaV9wbGF0Zm9ybV9wbTsKQEAgLTUyNCwxNCArNTI1LDE3IEBACiAgKiBwY2lfdXBkYXRlX2N1cnJlbnRfc3RhdGUgLSBSZWFkIFBDSSBwb3dlciBzdGF0ZSBvZiBnaXZlbiBkZXZpY2UgZnJvbSBpdHMKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBDSSBQTSByZWdpc3RlcnMgYW5kIGNhY2hlIGl0CiAgKiBAZGV2OiBQQ0kgZGV2aWNlIHRvIGhhbmRsZS4KKyAqIEBzdGF0ZTogU3RhdGUgdG8gY2FjaGUgaW4gY2FzZSB0aGUgZGV2aWNlIGRvZXNuJ3QgaGF2ZSB0aGUgUE0gY2FwYWJpbGl0eQogICovCi1zdGF0aWMgdm9pZCBwY2lfdXBkYXRlX2N1cnJlbnRfc3RhdGUoc3RydWN0IHBjaV9kZXYgKmRldikKK3ZvaWQgcGNpX3VwZGF0ZV9jdXJyZW50X3N0YXRlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHBjaV9wb3dlcl90IHN0YXRlKQogewogCWlmIChkZXYtPnBtX2NhcCkgewogCQl1MTYgcG1jc3I7CiAKIAkJcGNpX3JlYWRfY29uZmlnX3dvcmQoZGV2LCBkZXYtPnBtX2NhcCArIFBDSV9QTV9DVFJMLCAmcG1jc3IpOwogCQlkZXYtPmN1cnJlbnRfc3RhdGUgPSAocG1jc3IgJiBQQ0lfUE1fQ1RSTF9TVEFURV9NQVNLKTsKKwl9IGVsc2UgeworCQlkZXYtPmN1cnJlbnRfc3RhdGUgPSBzdGF0ZTsKIAl9CiB9CiAKQEAgLTU3NCw3ICs1NzgsNyBAQAogCQkgKi8KIAkJaW50IHJldCA9IHBsYXRmb3JtX3BjaV9zZXRfcG93ZXJfc3RhdGUoZGV2LCBQQ0lfRDApOwogCQlpZiAoIXJldCkKLQkJCXBjaV91cGRhdGVfY3VycmVudF9zdGF0ZShkZXYpOworCQkJcGNpX3VwZGF0ZV9jdXJyZW50X3N0YXRlKGRldiwgUENJX0QwKTsKIAl9CiAJLyogVGhpcyBkZXZpY2UgaXMgcXVpcmtlZCBub3QgdG8gYmUgcHV0IGludG8gRDMsIHNvCiAJICAgZG9uJ3QgcHV0IGl0IGluIEQzICovCkBAIC01ODcsNyArNTkxLDcgQEAKIAkJLyogQWxsb3cgdGhlIHBsYXRmb3JtIHRvIGZpbmFsaXplIHRoZSB0cmFuc2l0aW9uICovCiAJCWludCByZXQgPSBwbGF0Zm9ybV9wY2lfc2V0X3Bvd2VyX3N0YXRlKGRldiwgc3RhdGUpOwogCQlpZiAoIXJldCkgewotCQkJcGNpX3VwZGF0ZV9jdXJyZW50X3N0YXRlKGRldik7CisJCQlwY2lfdXBkYXRlX2N1cnJlbnRfc3RhdGUoZGV2LCBzdGF0ZSk7CiAJCQllcnJvciA9IDA7CiAJCX0KIAl9CkBAIC02NDAsMTkgKzY0NCwxNCBAQAogCWludCBwb3MsIGkgPSAwOwogCXN0cnVjdCBwY2lfY2FwX3NhdmVkX3N0YXRlICpzYXZlX3N0YXRlOwogCXUxNiAqY2FwOwotCWludCBmb3VuZCA9IDA7CiAKIAlwb3MgPSBwY2lfZmluZF9jYXBhYmlsaXR5KGRldiwgUENJX0NBUF9JRF9FWFApOwogCWlmIChwb3MgPD0gMCkKIAkJcmV0dXJuIDA7CiAKIAlzYXZlX3N0YXRlID0gcGNpX2ZpbmRfc2F2ZWRfY2FwKGRldiwgUENJX0NBUF9JRF9FWFApOwotCWlmICghc2F2ZV9zdGF0ZSkKLQkJc2F2ZV9zdGF0ZSA9IGt6YWxsb2Moc2l6ZW9mKCpzYXZlX3N0YXRlKSArIHNpemVvZih1MTYpICogNCwgR0ZQX0tFUk5FTCk7Ci0JZWxzZQotCQlmb3VuZCA9IDE7CiAJaWYgKCFzYXZlX3N0YXRlKSB7Ci0JCWRldl9lcnIoJmRldi0+ZGV2LCAib3V0IG9mIG1lbW9yeSBpbiBwY2lfc2F2ZV9wY2llX3N0YXRlXG4iKTsKKwkJZGV2X2VycigmZGV2LT5kZXYsICJidWZmZXIgbm90IGZvdW5kIGluICVzXG4iLCBfX0ZVTkNUSU9OX18pOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAJY2FwID0gKHUxNiAqKSZzYXZlX3N0YXRlLT5kYXRhWzBdOwpAQCAtNjYxLDkgKzY2MCw3IEBACiAJcGNpX3JlYWRfY29uZmlnX3dvcmQoZGV2LCBwb3MgKyBQQ0lfRVhQX0xOS0NUTCwgJmNhcFtpKytdKTsKIAlwY2lfcmVhZF9jb25maWdfd29yZChkZXYsIHBvcyArIFBDSV9FWFBfU0xUQ1RMLCAmY2FwW2krK10pOwogCXBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgcG9zICsgUENJX0VYUF9SVENUTCwgJmNhcFtpKytdKTsKLQlzYXZlX3N0YXRlLT5jYXBfbnIgPSBQQ0lfQ0FQX0lEX0VYUDsKLQlpZiAoIWZvdW5kKQotCQlwY2lfYWRkX3NhdmVkX2NhcChkZXYsIHNhdmVfc3RhdGUpOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTY4OCwzMCArNjg1LDIxIEBACiAKIHN0YXRpYyBpbnQgcGNpX3NhdmVfcGNpeF9zdGF0ZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQogewotCWludCBwb3MsIGkgPSAwOworCWludCBwb3M7CiAJc3RydWN0IHBjaV9jYXBfc2F2ZWRfc3RhdGUgKnNhdmVfc3RhdGU7Ci0JdTE2ICpjYXA7Ci0JaW50IGZvdW5kID0gMDsKIAogCXBvcyA9IHBjaV9maW5kX2NhcGFiaWxpdHkoZGV2LCBQQ0lfQ0FQX0lEX1BDSVgpOwogCWlmIChwb3MgPD0gMCkKIAkJcmV0dXJuIDA7CiAKIAlzYXZlX3N0YXRlID0gcGNpX2ZpbmRfc2F2ZWRfY2FwKGRldiwgUENJX0NBUF9JRF9QQ0lYKTsKLQlpZiAoIXNhdmVfc3RhdGUpCi0JCXNhdmVfc3RhdGUgPSBremFsbG9jKHNpemVvZigqc2F2ZV9zdGF0ZSkgKyBzaXplb2YodTE2KSwgR0ZQX0tFUk5FTCk7Ci0JZWxzZQotCQlmb3VuZCA9IDE7CiAJaWYgKCFzYXZlX3N0YXRlKSB7Ci0JCWRldl9lcnIoJmRldi0+ZGV2LCAib3V0IG9mIG1lbW9yeSBpbiBwY2lfc2F2ZV9wY2llX3N0YXRlXG4iKTsKKwkJZGV2X2VycigmZGV2LT5kZXYsICJidWZmZXIgbm90IGZvdW5kIGluICVzXG4iLCBfX0ZVTkNUSU9OX18pOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9Ci0JY2FwID0gKHUxNiAqKSZzYXZlX3N0YXRlLT5kYXRhWzBdOwogCi0JcGNpX3JlYWRfY29uZmlnX3dvcmQoZGV2LCBwb3MgKyBQQ0lfWF9DTUQsICZjYXBbaSsrXSk7Ci0Jc2F2ZV9zdGF0ZS0+Y2FwX25yID0gUENJX0NBUF9JRF9QQ0lYOwotCWlmICghZm91bmQpCi0JCXBjaV9hZGRfc2F2ZWRfY2FwKGRldiwgc2F2ZV9zdGF0ZSk7CisJcGNpX3JlYWRfY29uZmlnX3dvcmQoZGV2LCBwb3MgKyBQQ0lfWF9DTUQsICh1MTYgKilzYXZlX3N0YXRlLT5kYXRhKTsKKwogCXJldHVybiAwOwogfQogCkBAIC05ODIsNiArOTcwLDMyIEBACiAgKi8KIHZvaWQgX19hdHRyaWJ1dGVfXyAoKHdlYWspKSBwY2liaW9zX2Rpc2FibGVfZGV2aWNlIChzdHJ1Y3QgcGNpX2RldiAqZGV2KSB7fQogCitzdGF0aWMgdm9pZCBkb19wY2lfZGlzYWJsZV9kZXZpY2Uoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwl1MTYgcGNpX2NvbW1hbmQ7CisKKwlwY2lfcmVhZF9jb25maWdfd29yZChkZXYsIFBDSV9DT01NQU5ELCAmcGNpX2NvbW1hbmQpOworCWlmIChwY2lfY29tbWFuZCAmIFBDSV9DT01NQU5EX01BU1RFUikgeworCQlwY2lfY29tbWFuZCAmPSB+UENJX0NPTU1BTkRfTUFTVEVSOworCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQoZGV2LCBQQ0lfQ09NTUFORCwgcGNpX2NvbW1hbmQpOworCX0KKworCXBjaWJpb3NfZGlzYWJsZV9kZXZpY2UoZGV2KTsKK30KKworLyoqCisgKiBwY2lfZGlzYWJsZV9lbmFibGVkX2RldmljZSAtIERpc2FibGUgZGV2aWNlIHdpdGhvdXQgdXBkYXRpbmcgZW5hYmxlX2NudAorICogQGRldjogUENJIGRldmljZSB0byBkaXNhYmxlCisgKgorICogTk9URTogVGhpcyBmdW5jdGlvbiBpcyBhIGJhY2tlbmQgb2YgUENJIHBvd2VyIG1hbmFnZW1lbnQgcm91dGluZXMgYW5kIGlzCisgKiBub3Qgc3VwcG9zZWQgdG8gYmUgY2FsbGVkIGRyaXZlcnMuCisgKi8KK3ZvaWQgcGNpX2Rpc2FibGVfZW5hYmxlZF9kZXZpY2Uoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwlpZiAoYXRvbWljX3JlYWQoJmRldi0+ZW5hYmxlX2NudCkpCisJCWRvX3BjaV9kaXNhYmxlX2RldmljZShkZXYpOworfQorCiAvKioKICAqIHBjaV9kaXNhYmxlX2RldmljZSAtIERpc2FibGUgUENJIGRldmljZSBhZnRlciB1c2UKICAqIEBkZXY6IFBDSSBkZXZpY2UgdG8gYmUgZGlzYWJsZWQKQEAgLTk5Niw3ICsxMDEwLDYgQEAKIHBjaV9kaXNhYmxlX2RldmljZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQogewogCXN0cnVjdCBwY2lfZGV2cmVzICpkcjsKLQl1MTYgcGNpX2NvbW1hbmQ7CiAKIAlkciA9IGZpbmRfcGNpX2RyKGRldik7CiAJaWYgKGRyKQpAQCAtMTAwNSwxNCArMTAxOCw5IEBACiAJaWYgKGF0b21pY19zdWJfcmV0dXJuKDEsICZkZXYtPmVuYWJsZV9jbnQpICE9IDApCiAJCXJldHVybjsKIAotCXBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgUENJX0NPTU1BTkQsICZwY2lfY29tbWFuZCk7Ci0JaWYgKHBjaV9jb21tYW5kICYgUENJX0NPTU1BTkRfTUFTVEVSKSB7Ci0JCXBjaV9jb21tYW5kICY9IH5QQ0lfQ09NTUFORF9NQVNURVI7Ci0JCXBjaV93cml0ZV9jb25maWdfd29yZChkZXYsIFBDSV9DT01NQU5ELCBwY2lfY29tbWFuZCk7Ci0JfQotCWRldi0+aXNfYnVzbWFzdGVyID0gMDsKKwlkb19wY2lfZGlzYWJsZV9kZXZpY2UoZGV2KTsKIAotCXBjaWJpb3NfZGlzYWJsZV9kZXZpY2UoZGV2KTsKKwlkZXYtPmlzX2J1c21hc3RlciA9IDA7CiB9CiAKIC8qKgpAQCAtMTEwNyw3ICsxMTE1LDcgQEAKIAlpbnQgZXJyb3IgPSAwOwogCWJvb2wgcG1lX2RvbmUgPSBmYWxzZTsKIAotCWlmICghZGV2aWNlX21heV93YWtldXAoJmRldi0+ZGV2KSkKKwlpZiAoZW5hYmxlICYmICFkZXZpY2VfbWF5X3dha2V1cCgmZGV2LT5kZXYpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCS8qCkBAIC0xMjUyLDE0ICsxMjYwLDE1IEBACiAJLyogZmluZCBQQ0kgUE0gY2FwYWJpbGl0eSBpbiBsaXN0ICovCiAJcG0gPSBwY2lfZmluZF9jYXBhYmlsaXR5KGRldiwgUENJX0NBUF9JRF9QTSk7CiAJaWYgKCFwbSkKLQkJcmV0dXJuOworCQlnb3RvIEV4aXQ7CisKIAkvKiBDaGVjayBkZXZpY2UncyBhYmlsaXR5IHRvIGdlbmVyYXRlIFBNRSMgKi8KIAlwY2lfcmVhZF9jb25maWdfd29yZChkZXYsIHBtICsgUENJX1BNX1BNQywgJnBtYyk7CiAKIAlpZiAoKHBtYyAmIFBDSV9QTV9DQVBfVkVSX01BU0spID4gMykgewogCQlkZXZfZXJyKCZkZXYtPmRldiwgInVuc3VwcG9ydGVkIFBNIGNhcCByZWdzIHZlcnNpb24gKCV1KVxuIiwKIAkJCXBtYyAmIFBDSV9QTV9DQVBfVkVSX01BU0spOwotCQlyZXR1cm47CisJCWdvdG8gRXhpdDsKIAl9CiAKIAlkZXYtPnBtX2NhcCA9IHBtOwpAQCAtMTI5OCw2ICsxMzA3LDc0IEBACiAJfSBlbHNlIHsKIAkJZGV2LT5wbWVfc3VwcG9ydCA9IDA7CiAJfQorCisgRXhpdDoKKwlwY2lfdXBkYXRlX2N1cnJlbnRfc3RhdGUoZGV2LCBQQ0lfRDApOworfQorCisvKioKKyAqIHBsYXRmb3JtX3BjaV93YWtldXBfaW5pdCAtIGluaXQgcGxhdGZvcm0gd2FrZXVwIGlmIHByZXNlbnQKKyAqIEBkZXY6IFBDSSBkZXZpY2UKKyAqCisgKiBTb21lIGRldmljZXMgZG9uJ3QgaGF2ZSBQQ0kgUE0gY2FwcyBidXQgY2FuIHN0aWxsIGdlbmVyYXRlIHdha2V1cAorICogZXZlbnRzIHRocm91Z2ggcGxhdGZvcm0gbWV0aG9kcyAobGlrZSBBQ1BJIGV2ZW50cykuICBJZiBAZGV2IHN1cHBvcnRzCisgKiBwbGF0Zm9ybSB3YWtldXAgZXZlbnRzLCBzZXQgdGhlIGRldmljZSBmbGFnIHRvIGluZGljYXRlIGFzIG11Y2guICBUaGlzCisgKiBtYXkgYmUgcmVkdW5kYW50IGlmIHRoZSBkZXZpY2UgYWxzbyBzdXBwb3J0cyBQQ0kgUE0gY2FwcywgYnV0IGRvdWJsZQorICogaW5pdGlhbGl6YXRpb24gc2hvdWxkIGJlIHNhZmUgaW4gdGhhdCBjYXNlLgorICovCit2b2lkIHBsYXRmb3JtX3BjaV93YWtldXBfaW5pdChzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCWlmICghcGxhdGZvcm1fcGNpX2Nhbl93YWtldXAoZGV2KSkKKwkJcmV0dXJuOworCisJZGV2aWNlX3NldF93YWtldXBfY2FwYWJsZSgmZGV2LT5kZXYsIHRydWUpOworCWRldmljZV9zZXRfd2FrZXVwX2VuYWJsZSgmZGV2LT5kZXYsIGZhbHNlKTsKKwlwbGF0Zm9ybV9wY2lfc2xlZXBfd2FrZShkZXYsIGZhbHNlKTsKK30KKworLyoqCisgKiBwY2lfYWRkX3NhdmVfYnVmZmVyIC0gYWxsb2NhdGUgYnVmZmVyIGZvciBzYXZpbmcgZ2l2ZW4gY2FwYWJpbGl0eSByZWdpc3RlcnMKKyAqIEBkZXY6IHRoZSBQQ0kgZGV2aWNlCisgKiBAY2FwOiB0aGUgY2FwYWJpbGl0eSB0byBhbGxvY2F0ZSB0aGUgYnVmZmVyIGZvcgorICogQHNpemU6IHJlcXVlc3RlZCBzaXplIG9mIHRoZSBidWZmZXIKKyAqLworc3RhdGljIGludCBwY2lfYWRkX2NhcF9zYXZlX2J1ZmZlcigKKwlzdHJ1Y3QgcGNpX2RldiAqZGV2LCBjaGFyIGNhcCwgdW5zaWduZWQgaW50IHNpemUpCit7CisJaW50IHBvczsKKwlzdHJ1Y3QgcGNpX2NhcF9zYXZlZF9zdGF0ZSAqc2F2ZV9zdGF0ZTsKKworCXBvcyA9IHBjaV9maW5kX2NhcGFiaWxpdHkoZGV2LCBjYXApOworCWlmIChwb3MgPD0gMCkKKwkJcmV0dXJuIDA7CisKKwlzYXZlX3N0YXRlID0ga3phbGxvYyhzaXplb2YoKnNhdmVfc3RhdGUpICsgc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzYXZlX3N0YXRlKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXNhdmVfc3RhdGUtPmNhcF9uciA9IGNhcDsKKwlwY2lfYWRkX3NhdmVkX2NhcChkZXYsIHNhdmVfc3RhdGUpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogcGNpX2FsbG9jYXRlX2NhcF9zYXZlX2J1ZmZlcnMgLSBhbGxvY2F0ZSBidWZmZXJzIGZvciBzYXZpbmcgY2FwYWJpbGl0aWVzCisgKiBAZGV2OiB0aGUgUENJIGRldmljZQorICovCit2b2lkIHBjaV9hbGxvY2F0ZV9jYXBfc2F2ZV9idWZmZXJzKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJaW50IGVycm9yOworCisJZXJyb3IgPSBwY2lfYWRkX2NhcF9zYXZlX2J1ZmZlcihkZXYsIFBDSV9DQVBfSURfRVhQLCA0ICogc2l6ZW9mKHUxNikpOworCWlmIChlcnJvcikKKwkJZGV2X2VycigmZGV2LT5kZXYsCisJCQkidW5hYmxlIHRvIHByZWFsbG9jYXRlIFBDSSBFeHByZXNzIHNhdmUgYnVmZmVyXG4iKTsKKworCWVycm9yID0gcGNpX2FkZF9jYXBfc2F2ZV9idWZmZXIoZGV2LCBQQ0lfQ0FQX0lEX1BDSVgsIHNpemVvZih1MTYpKTsKKwlpZiAoZXJyb3IpCisJCWRldl9lcnIoJmRldi0+ZGV2LAorCQkJInVuYWJsZSB0byBwcmVhbGxvY2F0ZSBQQ0ktWCBzYXZlIGJ1ZmZlclxuIik7CiB9CiAKIC8qKgpAQCAtMTMzNyw2ICsxNDE0LDIwIEBACiAJYnJpZGdlLT5hcmlfZW5hYmxlZCA9IDE7CiB9CiAKKy8qKgorICogcGNpX3N3aXp6bGVfaW50ZXJydXB0X3BpbiAtIHN3aXp6bGUgSU5UeCBmb3IgZGV2aWNlIGJlaGluZCBicmlkZ2UKKyAqIEBkZXY6IHRoZSBQQ0kgZGV2aWNlCisgKiBAcGluOiB0aGUgSU5UeCBwaW4gKDE9SU5UQSwgMj1JTlRCLCAzPUlOVEQsIDQ9SU5URCkKKyAqCisgKiBQZXJmb3JtIElOVHggc3dpenpsaW5nIGZvciBhIGRldmljZSBiZWhpbmQgb25lIGxldmVsIG9mIGJyaWRnZS4gIFRoaXMgaXMKKyAqIHJlcXVpcmVkIGJ5IHNlY3Rpb24gOS4xIG9mIHRoZSBQQ0ktdG8tUENJIGJyaWRnZSBzcGVjaWZpY2F0aW9uIGZvciBkZXZpY2VzCisgKiBiZWhpbmQgYnJpZGdlcyBvbiBhZGQtaW4gY2FyZHMuCisgKi8KK3U4IHBjaV9zd2l6emxlX2ludGVycnVwdF9waW4oc3RydWN0IHBjaV9kZXYgKmRldiwgdTggcGluKQoreworCXJldHVybiAoKChwaW4gLSAxKSArIFBDSV9TTE9UKGRldi0+ZGV2Zm4pKSAlIDQpICsgMTsKK30KKwogaW50CiBwY2lfZ2V0X2ludGVycnVwdF9waW4oc3RydWN0IHBjaV9kZXYgKmRldiwgc3RydWN0IHBjaV9kZXYgKipicmlkZ2UpCiB7CkBAIC0xMzQ1LDkgKzE0MzYsOSBAQAogCXBpbiA9IGRldi0+cGluOwogCWlmICghcGluKQogCQlyZXR1cm4gLTE7Ci0JcGluLS07CisKIAl3aGlsZSAoZGV2LT5idXMtPnNlbGYpIHsKLQkJcGluID0gKHBpbiArIFBDSV9TTE9UKGRldi0+ZGV2Zm4pKSAlIDQ7CisJCXBpbiA9IHBjaV9zd2l6emxlX2ludGVycnVwdF9waW4oZGV2LCBwaW4pOwogCQlkZXYgPSBkZXYtPmJ1cy0+c2VsZjsKIAl9CiAJKmJyaWRnZSA9IGRldjsKQEAgLTEzNTUsNiArMTQ0NiwyNiBAQAogfQogCiAvKioKKyAqIHBjaV9jb21tb25fc3dpenpsZSAtIHN3aXp6bGUgSU5UeCBhbGwgdGhlIHdheSB0byByb290IGJyaWRnZQorICogQGRldjogdGhlIFBDSSBkZXZpY2UKKyAqIEBwaW5wOiBwb2ludGVyIHRvIHRoZSBJTlR4IHBpbiB2YWx1ZSAoMT1JTlRBLCAyPUlOVEIsIDM9SU5URCwgND1JTlREKQorICoKKyAqIFBlcmZvcm0gSU5UeCBzd2l6emxpbmcgZm9yIGEgZGV2aWNlLiAgVGhpcyB0cmF2ZXJzZXMgdGhyb3VnaCBhbGwgUENJLXRvLVBDSQorICogYnJpZGdlcyBhbGwgdGhlIHdheSB1cCB0byBhIFBDSSByb290IGJ1cy4KKyAqLwordTggcGNpX2NvbW1vbl9zd2l6emxlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4ICpwaW5wKQoreworCXU4IHBpbiA9ICpwaW5wOworCisJd2hpbGUgKGRldi0+YnVzLT5zZWxmKSB7CisJCXBpbiA9IHBjaV9zd2l6emxlX2ludGVycnVwdF9waW4oZGV2LCBwaW4pOworCQlkZXYgPSBkZXYtPmJ1cy0+c2VsZjsKKwl9CisJKnBpbnAgPSBwaW47CisJcmV0dXJuIFBDSV9TTE9UKGRldi0+ZGV2Zm4pOworfQorCisvKioKICAqCXBjaV9yZWxlYXNlX3JlZ2lvbiAtIFJlbGVhc2UgYSBQQ0kgYmFyCiAgKglAcGRldjogUENJIGRldmljZSB3aG9zZSByZXNvdXJjZXMgd2VyZSBwcmV2aW91c2x5IHJlc2VydmVkIGJ5IHBjaV9yZXF1ZXN0X3JlZ2lvbgogICoJQGJhcjogQkFSIHRvIHJlbGVhc2UKQEAgLTEzOTUsNyArMTUwNiw4IEBACiAgKglSZXR1cm5zIDAgb24gc3VjY2Vzcywgb3IgJUVCVVNZIG9uIGVycm9yLiAgQSB3YXJuaW5nCiAgKgltZXNzYWdlIGlzIGFsc28gcHJpbnRlZCBvbiBmYWlsdXJlLgogICovCi1pbnQgcGNpX3JlcXVlc3RfcmVnaW9uKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBpbnQgYmFyLCBjb25zdCBjaGFyICpyZXNfbmFtZSkKK3N0YXRpYyBpbnQgX19wY2lfcmVxdWVzdF9yZWdpb24oc3RydWN0IHBjaV9kZXYgKnBkZXYsIGludCBiYXIsIGNvbnN0IGNoYXIgKnJlc19uYW1lLAorCQkJCQkJCQkJaW50IGV4Y2x1c2l2ZSkKIHsKIAlzdHJ1Y3QgcGNpX2RldnJlcyAqZHI7CiAKQEAgLTE0MDgsOCArMTUyMCw5IEBACiAJCQlnb3RvIGVycl9vdXQ7CiAJfQogCWVsc2UgaWYgKHBjaV9yZXNvdXJjZV9mbGFncyhwZGV2LCBiYXIpICYgSU9SRVNPVVJDRV9NRU0pIHsKLQkJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24ocGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIGJhciksCi0JCQkJICAgICAgICBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIGJhciksIHJlc19uYW1lKSkKKwkJaWYgKCFfX3JlcXVlc3RfbWVtX3JlZ2lvbihwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgYmFyKSwKKwkJCQkJcGNpX3Jlc291cmNlX2xlbihwZGV2LCBiYXIpLCByZXNfbmFtZSwKKwkJCQkJZXhjbHVzaXZlKSkKIAkJCWdvdG8gZXJyX291dDsKIAl9CiAKQEAgLTE0MjgsNiArMTU0MSw0NyBAQAogfQogCiAvKioKKyAqCXBjaV9yZXF1ZXN0X3JlZ2lvbiAtIFJlc2VydmVkIFBDSSBJL08gYW5kIG1lbW9yeSByZXNvdXJjZQorICoJQHBkZXY6IFBDSSBkZXZpY2Ugd2hvc2UgcmVzb3VyY2VzIGFyZSB0byBiZSByZXNlcnZlZAorICoJQGJhcjogQkFSIHRvIGJlIHJlc2VydmVkCisgKglAcmVzX25hbWU6IE5hbWUgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIHJlc291cmNlLgorICoKKyAqCU1hcmsgdGhlIFBDSSByZWdpb24gYXNzb2NpYXRlZCB3aXRoIFBDSSBkZXZpY2UgQHBkZXYgQlIgQGJhciBhcworICoJYmVpbmcgcmVzZXJ2ZWQgYnkgb3duZXIgQHJlc19uYW1lLiAgRG8gbm90IGFjY2VzcyBhbnkKKyAqCWFkZHJlc3MgaW5zaWRlIHRoZSBQQ0kgcmVnaW9ucyB1bmxlc3MgdGhpcyBjYWxsIHJldHVybnMKKyAqCXN1Y2Nlc3NmdWxseS4KKyAqCisgKglSZXR1cm5zIDAgb24gc3VjY2Vzcywgb3IgJUVCVVNZIG9uIGVycm9yLiAgQSB3YXJuaW5nCisgKgltZXNzYWdlIGlzIGFsc28gcHJpbnRlZCBvbiBmYWlsdXJlLgorICovCitpbnQgcGNpX3JlcXVlc3RfcmVnaW9uKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBpbnQgYmFyLCBjb25zdCBjaGFyICpyZXNfbmFtZSkKK3sKKwlyZXR1cm4gX19wY2lfcmVxdWVzdF9yZWdpb24ocGRldiwgYmFyLCByZXNfbmFtZSwgMCk7Cit9CisKKy8qKgorICoJcGNpX3JlcXVlc3RfcmVnaW9uX2V4Y2x1c2l2ZSAtIFJlc2VydmVkIFBDSSBJL08gYW5kIG1lbW9yeSByZXNvdXJjZQorICoJQHBkZXY6IFBDSSBkZXZpY2Ugd2hvc2UgcmVzb3VyY2VzIGFyZSB0byBiZSByZXNlcnZlZAorICoJQGJhcjogQkFSIHRvIGJlIHJlc2VydmVkCisgKglAcmVzX25hbWU6IE5hbWUgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIHJlc291cmNlLgorICoKKyAqCU1hcmsgdGhlIFBDSSByZWdpb24gYXNzb2NpYXRlZCB3aXRoIFBDSSBkZXZpY2UgQHBkZXYgQlIgQGJhciBhcworICoJYmVpbmcgcmVzZXJ2ZWQgYnkgb3duZXIgQHJlc19uYW1lLiAgRG8gbm90IGFjY2VzcyBhbnkKKyAqCWFkZHJlc3MgaW5zaWRlIHRoZSBQQ0kgcmVnaW9ucyB1bmxlc3MgdGhpcyBjYWxsIHJldHVybnMKKyAqCXN1Y2Nlc3NmdWxseS4KKyAqCisgKglSZXR1cm5zIDAgb24gc3VjY2Vzcywgb3IgJUVCVVNZIG9uIGVycm9yLiAgQSB3YXJuaW5nCisgKgltZXNzYWdlIGlzIGFsc28gcHJpbnRlZCBvbiBmYWlsdXJlLgorICoKKyAqCVRoZSBrZXkgZGlmZmVyZW5jZSB0aGF0IF9leGNsdXNpdmUgbWFrZXMgaXQgdGhhdCB1c2Vyc3BhY2UgaXMKKyAqCWV4cGxpY2l0bHkgbm90IGFsbG93ZWQgdG8gbWFwIHRoZSByZXNvdXJjZSB2aWEgL2Rldi9tZW0gb3IKKyAqIAlzeXNmcy4KKyAqLworaW50IHBjaV9yZXF1ZXN0X3JlZ2lvbl9leGNsdXNpdmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGludCBiYXIsIGNvbnN0IGNoYXIgKnJlc19uYW1lKQoreworCXJldHVybiBfX3BjaV9yZXF1ZXN0X3JlZ2lvbihwZGV2LCBiYXIsIHJlc19uYW1lLCBJT1JFU09VUkNFX0VYQ0xVU0lWRSk7Cit9CisvKioKICAqIHBjaV9yZWxlYXNlX3NlbGVjdGVkX3JlZ2lvbnMgLSBSZWxlYXNlIHNlbGVjdGVkIFBDSSBJL08gYW5kIG1lbW9yeSByZXNvdXJjZXMKICAqIEBwZGV2OiBQQ0kgZGV2aWNlIHdob3NlIHJlc291cmNlcyB3ZXJlIHByZXZpb3VzbHkgcmVzZXJ2ZWQKICAqIEBiYXJzOiBCaXRtYXNrIG9mIEJBUnMgdG8gYmUgcmVsZWFzZWQKQEAgLTE0NDQsMjAgKzE1OTgsMTQgQEAKIAkJCXBjaV9yZWxlYXNlX3JlZ2lvbihwZGV2LCBpKTsKIH0KIAotLyoqCi0gKiBwY2lfcmVxdWVzdF9zZWxlY3RlZF9yZWdpb25zIC0gUmVzZXJ2ZSBzZWxlY3RlZCBQQ0kgSS9PIGFuZCBtZW1vcnkgcmVzb3VyY2VzCi0gKiBAcGRldjogUENJIGRldmljZSB3aG9zZSByZXNvdXJjZXMgYXJlIHRvIGJlIHJlc2VydmVkCi0gKiBAYmFyczogQml0bWFzayBvZiBCQVJzIHRvIGJlIHJlcXVlc3RlZAotICogQHJlc19uYW1lOiBOYW1lIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCByZXNvdXJjZQotICovCi1pbnQgcGNpX3JlcXVlc3Rfc2VsZWN0ZWRfcmVnaW9ucyhzdHJ1Y3QgcGNpX2RldiAqcGRldiwgaW50IGJhcnMsCi0JCQkJIGNvbnN0IGNoYXIgKnJlc19uYW1lKQoraW50IF9fcGNpX3JlcXVlc3Rfc2VsZWN0ZWRfcmVnaW9ucyhzdHJ1Y3QgcGNpX2RldiAqcGRldiwgaW50IGJhcnMsCisJCQkJIGNvbnN0IGNoYXIgKnJlc19uYW1lLCBpbnQgZXhjbCkKIHsKIAlpbnQgaTsKIAogCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCiAJCWlmIChiYXJzICYgKDEgPDwgaSkpCi0JCQlpZihwY2lfcmVxdWVzdF9yZWdpb24ocGRldiwgaSwgcmVzX25hbWUpKQorCQkJaWYgKF9fcGNpX3JlcXVlc3RfcmVnaW9uKHBkZXYsIGksIHJlc19uYW1lLCBleGNsKSkKIAkJCQlnb3RvIGVycl9vdXQ7CiAJcmV0dXJuIDA7CiAKQEAgLTE0NjksNiArMTYxNywyNiBAQAogCXJldHVybiAtRUJVU1k7CiB9CiAKKworLyoqCisgKiBwY2lfcmVxdWVzdF9zZWxlY3RlZF9yZWdpb25zIC0gUmVzZXJ2ZSBzZWxlY3RlZCBQQ0kgSS9PIGFuZCBtZW1vcnkgcmVzb3VyY2VzCisgKiBAcGRldjogUENJIGRldmljZSB3aG9zZSByZXNvdXJjZXMgYXJlIHRvIGJlIHJlc2VydmVkCisgKiBAYmFyczogQml0bWFzayBvZiBCQVJzIHRvIGJlIHJlcXVlc3RlZAorICogQHJlc19uYW1lOiBOYW1lIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCByZXNvdXJjZQorICovCitpbnQgcGNpX3JlcXVlc3Rfc2VsZWN0ZWRfcmVnaW9ucyhzdHJ1Y3QgcGNpX2RldiAqcGRldiwgaW50IGJhcnMsCisJCQkJIGNvbnN0IGNoYXIgKnJlc19uYW1lKQoreworCXJldHVybiBfX3BjaV9yZXF1ZXN0X3NlbGVjdGVkX3JlZ2lvbnMocGRldiwgYmFycywgcmVzX25hbWUsIDApOworfQorCitpbnQgcGNpX3JlcXVlc3Rfc2VsZWN0ZWRfcmVnaW9uc19leGNsdXNpdmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCQkJIGludCBiYXJzLCBjb25zdCBjaGFyICpyZXNfbmFtZSkKK3sKKwlyZXR1cm4gX19wY2lfcmVxdWVzdF9zZWxlY3RlZF9yZWdpb25zKHBkZXYsIGJhcnMsIHJlc19uYW1lLAorCQkJSU9SRVNPVVJDRV9FWENMVVNJVkUpOworfQorCiAvKioKICAqCXBjaV9yZWxlYXNlX3JlZ2lvbnMgLSBSZWxlYXNlIHJlc2VydmVkIFBDSSBJL08gYW5kIG1lbW9yeSByZXNvdXJjZXMKICAqCUBwZGV2OiBQQ0kgZGV2aWNlIHdob3NlIHJlc291cmNlcyB3ZXJlIHByZXZpb3VzbHkgcmVzZXJ2ZWQgYnkgcGNpX3JlcXVlc3RfcmVnaW9ucwpAQCAtMTUwMiwyNyArMTY3MCw2NiBAQAogfQogCiAvKioKKyAqCXBjaV9yZXF1ZXN0X3JlZ2lvbnNfZXhjbHVzaXZlIC0gUmVzZXJ2ZWQgUENJIEkvTyBhbmQgbWVtb3J5IHJlc291cmNlcworICoJQHBkZXY6IFBDSSBkZXZpY2Ugd2hvc2UgcmVzb3VyY2VzIGFyZSB0byBiZSByZXNlcnZlZAorICoJQHJlc19uYW1lOiBOYW1lIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCByZXNvdXJjZS4KKyAqCisgKglNYXJrIGFsbCBQQ0kgcmVnaW9ucyBhc3NvY2lhdGVkIHdpdGggUENJIGRldmljZSBAcGRldiBhcworICoJYmVpbmcgcmVzZXJ2ZWQgYnkgb3duZXIgQHJlc19uYW1lLiAgRG8gbm90IGFjY2VzcyBhbnkKKyAqCWFkZHJlc3MgaW5zaWRlIHRoZSBQQ0kgcmVnaW9ucyB1bmxlc3MgdGhpcyBjYWxsIHJldHVybnMKKyAqCXN1Y2Nlc3NmdWxseS4KKyAqCisgKglwY2lfcmVxdWVzdF9yZWdpb25zX2V4Y2x1c2l2ZSgpIHdpbGwgbWFyayB0aGUgcmVnaW9uIHNvIHRoYXQKKyAqIAkvZGV2L21lbSBhbmQgdGhlIHN5c2ZzIE1NSU8gYWNjZXNzIHdpbGwgbm90IGJlIGFsbG93ZWQuCisgKgorICoJUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIG9yICVFQlVTWSBvbiBlcnJvci4gIEEgd2FybmluZworICoJbWVzc2FnZSBpcyBhbHNvIHByaW50ZWQgb24gZmFpbHVyZS4KKyAqLworaW50IHBjaV9yZXF1ZXN0X3JlZ2lvbnNfZXhjbHVzaXZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBjaGFyICpyZXNfbmFtZSkKK3sKKwlyZXR1cm4gcGNpX3JlcXVlc3Rfc2VsZWN0ZWRfcmVnaW9uc19leGNsdXNpdmUocGRldiwKKwkJCQkJKCgxIDw8IDYpIC0gMSksIHJlc19uYW1lKTsKK30KKworc3RhdGljIHZvaWQgX19wY2lfc2V0X21hc3RlcihzdHJ1Y3QgcGNpX2RldiAqZGV2LCBib29sIGVuYWJsZSkKK3sKKwl1MTYgb2xkX2NtZCwgY21kOworCisJcGNpX3JlYWRfY29uZmlnX3dvcmQoZGV2LCBQQ0lfQ09NTUFORCwgJm9sZF9jbWQpOworCWlmIChlbmFibGUpCisJCWNtZCA9IG9sZF9jbWQgfCBQQ0lfQ09NTUFORF9NQVNURVI7CisJZWxzZQorCQljbWQgPSBvbGRfY21kICYgflBDSV9DT01NQU5EX01BU1RFUjsKKwlpZiAoY21kICE9IG9sZF9jbWQpIHsKKwkJZGV2X2RiZygmZGV2LT5kZXYsICIlcyBidXMgbWFzdGVyaW5nXG4iLAorCQkJZW5hYmxlID8gImVuYWJsaW5nIiA6ICJkaXNhYmxpbmciKTsKKwkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGRldiwgUENJX0NPTU1BTkQsIGNtZCk7CisJfQorCWRldi0+aXNfYnVzbWFzdGVyID0gZW5hYmxlOworfQorCisvKioKICAqIHBjaV9zZXRfbWFzdGVyIC0gZW5hYmxlcyBidXMtbWFzdGVyaW5nIGZvciBkZXZpY2UgZGV2CiAgKiBAZGV2OiB0aGUgUENJIGRldmljZSB0byBlbmFibGUKICAqCiAgKiBFbmFibGVzIGJ1cy1tYXN0ZXJpbmcgb24gdGhlIGRldmljZSBhbmQgY2FsbHMgcGNpYmlvc19zZXRfbWFzdGVyKCkKICAqIHRvIGRvIHRoZSBuZWVkZWQgYXJjaCBzcGVjaWZpYyBzZXR0aW5ncy4KICAqLwotdm9pZAotcGNpX3NldF9tYXN0ZXIoc3RydWN0IHBjaV9kZXYgKmRldikKK3ZvaWQgcGNpX3NldF9tYXN0ZXIoc3RydWN0IHBjaV9kZXYgKmRldikKIHsKLQl1MTYgY21kOwotCi0JcGNpX3JlYWRfY29uZmlnX3dvcmQoZGV2LCBQQ0lfQ09NTUFORCwgJmNtZCk7Ci0JaWYgKCEgKGNtZCAmIFBDSV9DT01NQU5EX01BU1RFUikpIHsKLQkJZGV2X2RiZygmZGV2LT5kZXYsICJlbmFibGluZyBidXMgbWFzdGVyaW5nXG4iKTsKLQkJY21kIHw9IFBDSV9DT01NQU5EX01BU1RFUjsKLQkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGRldiwgUENJX0NPTU1BTkQsIGNtZCk7Ci0JfQotCWRldi0+aXNfYnVzbWFzdGVyID0gMTsKKwlfX3BjaV9zZXRfbWFzdGVyKGRldiwgdHJ1ZSk7CiAJcGNpYmlvc19zZXRfbWFzdGVyKGRldik7CiB9CiAKKy8qKgorICogcGNpX2NsZWFyX21hc3RlciAtIGRpc2FibGVzIGJ1cy1tYXN0ZXJpbmcgZm9yIGRldmljZSBkZXYKKyAqIEBkZXY6IHRoZSBQQ0kgZGV2aWNlIHRvIGRpc2FibGUKKyAqLwordm9pZCBwY2lfY2xlYXJfbWFzdGVyKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJX19wY2lfc2V0X21hc3RlcihkZXYsIGZhbHNlKTsKK30KKwogI2lmZGVmIFBDSV9ESVNBQkxFX01XSQogaW50IHBjaV9zZXRfbXdpKHN0cnVjdCBwY2lfZGV2ICpkZXYpCiB7CkBAIC0xNzUxLDI0ICsxOTU4LDcgQEAKIEVYUE9SVF9TWU1CT0wocGNpX3NldF9kbWFfc2VnX2JvdW5kYXJ5KTsKICNlbmRpZgogCi0vKioKLSAqIHBjaV9leGVjdXRlX3Jlc2V0X2Z1bmN0aW9uKCkgLSBSZXNldCBhIFBDSSBkZXZpY2UgZnVuY3Rpb24KLSAqIEBkZXY6IERldmljZSBmdW5jdGlvbiB0byByZXNldAotICoKLSAqIFNvbWUgZGV2aWNlcyBhbGxvdyBhbiBpbmRpdmlkdWFsIGZ1bmN0aW9uIHRvIGJlIHJlc2V0IHdpdGhvdXQgYWZmZWN0aW5nCi0gKiBvdGhlciBmdW5jdGlvbnMgaW4gdGhlIHNhbWUgZGV2aWNlLiAgVGhlIFBDSSBkZXZpY2UgbXVzdCBiZSByZXNwb25zaXZlCi0gKiB0byBQQ0kgY29uZmlnIHNwYWNlIGluIG9yZGVyIHRvIHVzZSB0aGlzIGZ1bmN0aW9uLgotICoKLSAqIFRoZSBkZXZpY2UgZnVuY3Rpb24gaXMgcHJlc3VtZWQgdG8gYmUgdW51c2VkIHdoZW4gdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQuCi0gKiBSZXNldHRpbmcgdGhlIGRldmljZSB3aWxsIG1ha2UgdGhlIGNvbnRlbnRzIG9mIFBDSSBjb25maWd1cmF0aW9uIHNwYWNlCi0gKiByYW5kb20sIHNvIGFueSBjYWxsZXIgb2YgdGhpcyBtdXN0IGJlIHByZXBhcmVkIHRvIHJlaW5pdGlhbGlzZSB0aGUKLSAqIGRldmljZSBpbmNsdWRpbmcgTVNJLCBidXMgbWFzdGVyaW5nLCBCQVJzLCBkZWNvZGluZyBJTyBhbmQgbWVtb3J5IHNwYWNlcywKLSAqIGV0Yy4KLSAqCi0gKiBSZXR1cm5zIDAgaWYgdGhlIGRldmljZSBmdW5jdGlvbiB3YXMgc3VjY2Vzc2Z1bGx5IHJlc2V0IG9yIC1FTk9UVFkgaWYgdGhlCi0gKiBkZXZpY2UgZG9lc24ndCBzdXBwb3J0IHJlc2V0dGluZyBhIHNpbmdsZSBmdW5jdGlvbi4KLSAqLwotaW50IHBjaV9leGVjdXRlX3Jlc2V0X2Z1bmN0aW9uKHN0cnVjdCBwY2lfZGV2ICpkZXYpCitzdGF0aWMgaW50IF9fcGNpZV9mbHIoc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IHByb2JlKQogewogCXUxNiBzdGF0dXM7CiAJdTMyIGNhcDsKQEAgLTE3ODAsNiArMTk3MCw5IEBACiAJaWYgKCEoY2FwICYgUENJX0VYUF9ERVZDQVBfRkxSKSkKIAkJcmV0dXJuIC1FTk9UVFk7CiAKKwlpZiAocHJvYmUpCisJCXJldHVybiAwOworCiAJcGNpX2Jsb2NrX3VzZXJfY2ZnX2FjY2VzcyhkZXYpOwogCiAJLyogV2FpdCBmb3IgVHJhbnNhY3Rpb24gUGVuZGluZyBiaXQgY2xlYW4gKi8KQEAgLTE4MDIsNiArMTk5NSw4MCBAQAogCXBjaV91bmJsb2NrX3VzZXJfY2ZnX2FjY2VzcyhkZXYpOwogCXJldHVybiAwOwogfQorCitzdGF0aWMgaW50IF9fcGNpX2FmX2ZscihzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgcHJvYmUpCit7CisJaW50IGNhcHBvcyA9IHBjaV9maW5kX2NhcGFiaWxpdHkoZGV2LCBQQ0lfQ0FQX0lEX0FGKTsKKwl1OCBzdGF0dXM7CisJdTggY2FwOworCisJaWYgKCFjYXBwb3MpCisJCXJldHVybiAtRU5PVFRZOworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgY2FwcG9zICsgUENJX0FGX0NBUCwgJmNhcCk7CisJaWYgKCEoY2FwICYgUENJX0FGX0NBUF9UUCkgfHwgIShjYXAgJiBQQ0lfQUZfQ0FQX0ZMUikpCisJCXJldHVybiAtRU5PVFRZOworCisJaWYgKHByb2JlKQorCQlyZXR1cm4gMDsKKworCXBjaV9ibG9ja191c2VyX2NmZ19hY2Nlc3MoZGV2KTsKKworCS8qIFdhaXQgZm9yIFRyYW5zYWN0aW9uIFBlbmRpbmcgYml0IGNsZWFuICovCisJbXNsZWVwKDEwMCk7CisJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCBjYXBwb3MgKyBQQ0lfQUZfU1RBVFVTLCAmc3RhdHVzKTsKKwlpZiAoc3RhdHVzICYgUENJX0FGX1NUQVRVU19UUCkgeworCQlkZXZfaW5mbygmZGV2LT5kZXYsICJCdXN5IGFmdGVyIDEwMG1zIHdoaWxlIHRyeWluZyB0byIKKwkJCQkiIHJlc2V0OyBzbGVlcGluZyBmb3IgMSBzZWNvbmRcbiIpOworCQlzc2xlZXAoMSk7CisJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwKKwkJCQljYXBwb3MgKyBQQ0lfQUZfU1RBVFVTLCAmc3RhdHVzKTsKKwkJaWYgKHN0YXR1cyAmIFBDSV9BRl9TVEFUVVNfVFApCisJCQlkZXZfaW5mbygmZGV2LT5kZXYsICJTdGlsbCBidXN5IGFmdGVyIDFzOyAiCisJCQkJCSJwcm9jZWVkaW5nIHdpdGggcmVzZXQgYW55d2F5XG4iKTsKKwl9CisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgY2FwcG9zICsgUENJX0FGX0NUUkwsIFBDSV9BRl9DVFJMX0ZMUik7CisJbWRlbGF5KDEwMCk7CisKKwlwY2lfdW5ibG9ja191c2VyX2NmZ19hY2Nlc3MoZGV2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX3BjaV9yZXNldF9mdW5jdGlvbihzdHJ1Y3QgcGNpX2RldiAqcGRldiwgaW50IHByb2JlKQoreworCWludCByZXM7CisKKwlyZXMgPSBfX3BjaWVfZmxyKHBkZXYsIHByb2JlKTsKKwlpZiAocmVzICE9IC1FTk9UVFkpCisJCXJldHVybiByZXM7CisKKwlyZXMgPSBfX3BjaV9hZl9mbHIocGRldiwgcHJvYmUpOworCWlmIChyZXMgIT0gLUVOT1RUWSkKKwkJcmV0dXJuIHJlczsKKworCXJldHVybiByZXM7Cit9CisKKy8qKgorICogcGNpX2V4ZWN1dGVfcmVzZXRfZnVuY3Rpb24oKSAtIFJlc2V0IGEgUENJIGRldmljZSBmdW5jdGlvbgorICogQGRldjogRGV2aWNlIGZ1bmN0aW9uIHRvIHJlc2V0CisgKgorICogU29tZSBkZXZpY2VzIGFsbG93IGFuIGluZGl2aWR1YWwgZnVuY3Rpb24gdG8gYmUgcmVzZXQgd2l0aG91dCBhZmZlY3RpbmcKKyAqIG90aGVyIGZ1bmN0aW9ucyBpbiB0aGUgc2FtZSBkZXZpY2UuICBUaGUgUENJIGRldmljZSBtdXN0IGJlIHJlc3BvbnNpdmUKKyAqIHRvIFBDSSBjb25maWcgc3BhY2UgaW4gb3JkZXIgdG8gdXNlIHRoaXMgZnVuY3Rpb24uCisgKgorICogVGhlIGRldmljZSBmdW5jdGlvbiBpcyBwcmVzdW1lZCB0byBiZSB1bnVzZWQgd2hlbiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZC4KKyAqIFJlc2V0dGluZyB0aGUgZGV2aWNlIHdpbGwgbWFrZSB0aGUgY29udGVudHMgb2YgUENJIGNvbmZpZ3VyYXRpb24gc3BhY2UKKyAqIHJhbmRvbSwgc28gYW55IGNhbGxlciBvZiB0aGlzIG11c3QgYmUgcHJlcGFyZWQgdG8gcmVpbml0aWFsaXNlIHRoZQorICogZGV2aWNlIGluY2x1ZGluZyBNU0ksIGJ1cyBtYXN0ZXJpbmcsIEJBUnMsIGRlY29kaW5nIElPIGFuZCBtZW1vcnkgc3BhY2VzLAorICogZXRjLgorICoKKyAqIFJldHVybnMgMCBpZiB0aGUgZGV2aWNlIGZ1bmN0aW9uIHdhcyBzdWNjZXNzZnVsbHkgcmVzZXQgb3IgLUVOT1RUWSBpZiB0aGUKKyAqIGRldmljZSBkb2Vzbid0IHN1cHBvcnQgcmVzZXR0aW5nIGEgc2luZ2xlIGZ1bmN0aW9uLgorICovCitpbnQgcGNpX2V4ZWN1dGVfcmVzZXRfZnVuY3Rpb24oc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwlyZXR1cm4gX19wY2lfcmVzZXRfZnVuY3Rpb24oZGV2LCAwKTsKK30KIEVYUE9SVF9TWU1CT0xfR1BMKHBjaV9leGVjdXRlX3Jlc2V0X2Z1bmN0aW9uKTsKIAogLyoqCkBAIC0xODIyLDE1ICsyMDg5LDEwIEBACiAgKi8KIGludCBwY2lfcmVzZXRfZnVuY3Rpb24oc3RydWN0IHBjaV9kZXYgKmRldikKIHsKLQl1MzIgY2FwOwotCWludCBleHBwb3MgPSBwY2lfZmluZF9jYXBhYmlsaXR5KGRldiwgUENJX0NBUF9JRF9FWFApOwotCWludCByOworCWludCByID0gX19wY2lfcmVzZXRfZnVuY3Rpb24oZGV2LCAxKTsKIAotCWlmICghZXhwcG9zKQotCQlyZXR1cm4gLUVOT1RUWTsKLQlwY2lfcmVhZF9jb25maWdfZHdvcmQoZGV2LCBleHBwb3MgKyBQQ0lfRVhQX0RFVkNBUCwgJmNhcCk7Ci0JaWYgKCEoY2FwICYgUENJX0VYUF9ERVZDQVBfRkxSKSkKLQkJcmV0dXJuIC1FTk9UVFk7CisJaWYgKHIgPCAwKQorCQlyZXR1cm4gcjsKIAogCWlmICghZGV2LT5tc2lfZW5hYmxlZCAmJiAhZGV2LT5tc2l4X2VuYWJsZWQgJiYgZGV2LT5pcnEgIT0gMCkKIAkJZGlzYWJsZV9pcnEoZGV2LT5pcnEpOwpAQCAtMjAyMiw2ICsyMjg0LDI4IEBACiAJcmV0dXJuIGJhcnM7CiB9CiAKKy8qKgorICogcGNpX3Jlc291cmNlX2JhciAtIGdldCBwb3NpdGlvbiBvZiB0aGUgQkFSIGFzc29jaWF0ZWQgd2l0aCBhIHJlc291cmNlCisgKiBAZGV2OiB0aGUgUENJIGRldmljZQorICogQHJlc25vOiB0aGUgcmVzb3VyY2UgbnVtYmVyCisgKiBAdHlwZTogdGhlIEJBUiB0eXBlIHRvIGJlIGZpbGxlZCBpbgorICoKKyAqIFJldHVybnMgQkFSIHBvc2l0aW9uIGluIGNvbmZpZyBzcGFjZSwgb3IgMCBpZiB0aGUgQkFSIGlzIGludmFsaWQuCisgKi8KK2ludCBwY2lfcmVzb3VyY2VfYmFyKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCByZXNubywgZW51bSBwY2lfYmFyX3R5cGUgKnR5cGUpCit7CisJaWYgKHJlc25vIDwgUENJX1JPTV9SRVNPVVJDRSkgeworCQkqdHlwZSA9IHBjaV9iYXJfdW5rbm93bjsKKwkJcmV0dXJuIFBDSV9CQVNFX0FERFJFU1NfMCArIDQgKiByZXNubzsKKwl9IGVsc2UgaWYgKHJlc25vID09IFBDSV9ST01fUkVTT1VSQ0UpIHsKKwkJKnR5cGUgPSBwY2lfYmFyX21lbTMyOworCQlyZXR1cm4gZGV2LT5yb21fYmFzZV9yZWc7CisJfQorCisJZGV2X2VycigmZGV2LT5kZXYsICJCQVI6IGludmFsaWQgcmVzb3VyY2UgIyVkXG4iLCByZXNubyk7CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyB2b2lkIF9fZGV2aW5pdCBwY2lfbm9fZG9tYWlucyh2b2lkKQogewogI2lmZGVmIENPTkZJR19QQ0lfRE9NQUlOUwpAQCAtMjAyOSw2ICsyMzEzLDE5IEBACiAjZW5kaWYKIH0KIAorLyoqCisgKiBwY2lfZXh0X2NmZ19lbmFibGVkIC0gY2FuIHdlIGFjY2VzcyBleHRlbmRlZCBQQ0kgY29uZmlnIHNwYWNlPworICogQGRldjogVGhlIFBDSSBkZXZpY2Ugb2YgdGhlIHJvb3QgYnJpZGdlLgorICoKKyAqIFJldHVybnMgMSBpZiB3ZSBjYW4gYWNjZXNzIFBDSSBleHRlbmRlZCBjb25maWcgc3BhY2UgKG9mZnNldHMKKyAqIGdyZWF0ZXIgdGhhbiAweGZmKS4gVGhpcyBpcyB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbi4gQXJjaGl0ZWN0dXJlCisgKiBpbXBsZW1lbnRhdGlvbnMgY2FuIG92ZXJyaWRlIHRoaXMuCisgKi8KK2ludCBfX2F0dHJpYnV0ZV9fICgod2VhaykpIHBjaV9leHRfY2ZnX2F2YWlsKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJcmV0dXJuIDE7Cit9CisKIHN0YXRpYyBpbnQgX19kZXZpbml0IHBjaV9pbml0KHZvaWQpCiB7CiAJc3RydWN0IHBjaV9kZXYgKmRldiA9IE5VTEw7CkBAIC0yMDM3LDggKzIzMzQsNiBAQAogCQlwY2lfZml4dXBfZGV2aWNlKHBjaV9maXh1cF9maW5hbCwgZGV2KTsKIAl9CiAKLQltc2lfaW5pdCgpOwotCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTIwODMsMTEgKzIzNzgsMTUgQEAKIEVYUE9SVF9TWU1CT0wocGNpX2J1c19maW5kX2NhcGFiaWxpdHkpOwogRVhQT1JUX1NZTUJPTChwY2lfcmVsZWFzZV9yZWdpb25zKTsKIEVYUE9SVF9TWU1CT0wocGNpX3JlcXVlc3RfcmVnaW9ucyk7CitFWFBPUlRfU1lNQk9MKHBjaV9yZXF1ZXN0X3JlZ2lvbnNfZXhjbHVzaXZlKTsKIEVYUE9SVF9TWU1CT0wocGNpX3JlbGVhc2VfcmVnaW9uKTsKIEVYUE9SVF9TWU1CT0wocGNpX3JlcXVlc3RfcmVnaW9uKTsKK0VYUE9SVF9TWU1CT0wocGNpX3JlcXVlc3RfcmVnaW9uX2V4Y2x1c2l2ZSk7CiBFWFBPUlRfU1lNQk9MKHBjaV9yZWxlYXNlX3NlbGVjdGVkX3JlZ2lvbnMpOwogRVhQT1JUX1NZTUJPTChwY2lfcmVxdWVzdF9zZWxlY3RlZF9yZWdpb25zKTsKK0VYUE9SVF9TWU1CT0wocGNpX3JlcXVlc3Rfc2VsZWN0ZWRfcmVnaW9uc19leGNsdXNpdmUpOwogRVhQT1JUX1NZTUJPTChwY2lfc2V0X21hc3Rlcik7CitFWFBPUlRfU1lNQk9MKHBjaV9jbGVhcl9tYXN0ZXIpOwogRVhQT1JUX1NZTUJPTChwY2lfc2V0X213aSk7CiBFWFBPUlRfU1lNQk9MKHBjaV90cnlfc2V0X213aSk7CiBFWFBPUlRfU1lNQk9MKHBjaV9jbGVhcl9td2kpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvcGNpLmggYi9kcml2ZXJzL3BjaS9wY2kuaAppbmRleCA5ZGU4N2U5Li4xMzUxYmI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9wY2kuaAorKysgYi9kcml2ZXJzL3BjaS9wY2kuaApAQCAtMTAsNiArMTAsMTAgQEAKIGV4dGVybiBpbnQgcGNpX2NyZWF0ZV9zeXNmc19kZXZfZmlsZXMoc3RydWN0IHBjaV9kZXYgKnBkZXYpOwogZXh0ZXJuIHZvaWQgcGNpX3JlbW92ZV9zeXNmc19kZXZfZmlsZXMoc3RydWN0IHBjaV9kZXYgKnBkZXYpOwogZXh0ZXJuIHZvaWQgcGNpX2NsZWFudXBfcm9tKHN0cnVjdCBwY2lfZGV2ICpkZXYpOworI2lmZGVmIEhBVkVfUENJX01NQVAKK2V4dGVybiBpbnQgcGNpX21tYXBfZml0cyhzdHJ1Y3QgcGNpX2RldiAqcGRldiwgaW50IHJlc25vLAorCQkJIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKTsKKyNlbmRpZgogCiAvKioKICAqIEZpcm13YXJlIFBNIGNhbGxiYWNrcwpAQCAtNDAsNyArNDQsMTEgQEAKIH07CiAKIGV4dGVybiBpbnQgcGNpX3NldF9wbGF0Zm9ybV9wbShzdHJ1Y3QgcGNpX3BsYXRmb3JtX3BtX29wcyAqb3BzKTsKK2V4dGVybiB2b2lkIHBjaV91cGRhdGVfY3VycmVudF9zdGF0ZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBwY2lfcG93ZXJfdCBzdGF0ZSk7CitleHRlcm4gdm9pZCBwY2lfZGlzYWJsZV9lbmFibGVkX2RldmljZShzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKIGV4dGVybiB2b2lkIHBjaV9wbV9pbml0KHN0cnVjdCBwY2lfZGV2ICpkZXYpOworZXh0ZXJuIHZvaWQgcGxhdGZvcm1fcGNpX3dha2V1cF9pbml0KHN0cnVjdCBwY2lfZGV2ICpkZXYpOworZXh0ZXJuIHZvaWQgcGNpX2FsbG9jYXRlX2NhcF9zYXZlX2J1ZmZlcnMoc3RydWN0IHBjaV9kZXYgKmRldik7CiAKIGV4dGVybiBpbnQgcGNpX3VzZXJfcmVhZF9jb25maWdfYnl0ZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgd2hlcmUsIHU4ICp2YWwpOwogZXh0ZXJuIGludCBwY2lfdXNlcl9yZWFkX2NvbmZpZ193b3JkKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCB3aGVyZSwgdTE2ICp2YWwpOwpAQCAtNTAsMTQgKzU4LDE0IEBACiBleHRlcm4gaW50IHBjaV91c2VyX3dyaXRlX2NvbmZpZ19kd29yZChzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgd2hlcmUsIHUzMiB2YWwpOwogCiBzdHJ1Y3QgcGNpX3ZwZF9vcHMgewotCWludCAoKnJlYWQpKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBwb3MsIGludCBzaXplLCBjaGFyICpidWYpOwotCWludCAoKndyaXRlKShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgcG9zLCBpbnQgc2l6ZSwgY29uc3QgY2hhciAqYnVmKTsKKwlzc2l6ZV90ICgqcmVhZCkoc3RydWN0IHBjaV9kZXYgKmRldiwgbG9mZl90IHBvcywgc2l6ZV90IGNvdW50LCB2b2lkICpidWYpOworCXNzaXplX3QgKCp3cml0ZSkoc3RydWN0IHBjaV9kZXYgKmRldiwgbG9mZl90IHBvcywgc2l6ZV90IGNvdW50LCBjb25zdCB2b2lkICpidWYpOwogCXZvaWQgKCpyZWxlYXNlKShzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKIH07CiAKIHN0cnVjdCBwY2lfdnBkIHsKIAl1bnNpZ25lZCBpbnQgbGVuOwotCXN0cnVjdCBwY2lfdnBkX29wcyAqb3BzOworCWNvbnN0IHN0cnVjdCBwY2lfdnBkX29wcyAqb3BzOwogCXN0cnVjdCBiaW5fYXR0cmlidXRlICphdHRyOyAvKiBkZXNjcmlwdG9yIGZvciBzeXNmcyBWUEQgZW50cnkgKi8KIH07CiAKQEAgLTk4LDExICsxMDYsOSBAQAogI2lmZGVmIENPTkZJR19QQ0lfTVNJCiB2b2lkIHBjaV9ub19tc2kodm9pZCk7CiBleHRlcm4gdm9pZCBwY2lfbXNpX2luaXRfcGNpX2RldihzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKLWV4dGVybiB2b2lkIF9fZGV2aW5pdCBtc2lfaW5pdCh2b2lkKTsKICNlbHNlCiBzdGF0aWMgaW5saW5lIHZvaWQgcGNpX25vX21zaSh2b2lkKSB7IH0KIHN0YXRpYyBpbmxpbmUgdm9pZCBwY2lfbXNpX2luaXRfcGNpX2RldihzdHJ1Y3QgcGNpX2RldiAqZGV2KSB7IH0KLXN0YXRpYyBpbmxpbmUgdm9pZCBtc2lfaW5pdCh2b2lkKSB7IH0KICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX1BDSUVBRVIKQEAgLTE1OSwxNiArMTY1LDI4IEBACiB9OwogI2RlZmluZSB0b19wY2lfc2xvdF9hdHRyKHMpIGNvbnRhaW5lcl9vZihzLCBzdHJ1Y3QgcGNpX3Nsb3RfYXR0cmlidXRlLCBhdHRyKQogCitlbnVtIHBjaV9iYXJfdHlwZSB7CisJcGNpX2Jhcl91bmtub3duLAkvKiBTdGFuZGFyZCBQQ0kgQkFSIHByb2JlICovCisJcGNpX2Jhcl9pbywJCS8qIEFuIGlvIHBvcnQgQkFSICovCisJcGNpX2Jhcl9tZW0zMiwJCS8qIEEgMzItYml0IG1lbW9yeSBCQVIgKi8KKwlwY2lfYmFyX21lbTY0LAkJLyogQSA2NC1iaXQgbWVtb3J5IEJBUiAqLworfTsKKworZXh0ZXJuIGludCBfX3BjaV9yZWFkX2Jhc2Uoc3RydWN0IHBjaV9kZXYgKmRldiwgZW51bSBwY2lfYmFyX3R5cGUgdHlwZSwKKwkJCQlzdHJ1Y3QgcmVzb3VyY2UgKnJlcywgdW5zaWduZWQgaW50IHJlZyk7CitleHRlcm4gaW50IHBjaV9yZXNvdXJjZV9iYXIoc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IHJlc25vLAorCQkJICAgIGVudW0gcGNpX2Jhcl90eXBlICp0eXBlKTsKK2V4dGVybiBpbnQgcGNpX2J1c19hZGRfY2hpbGQoc3RydWN0IHBjaV9idXMgKmJ1cyk7CiBleHRlcm4gdm9pZCBwY2lfZW5hYmxlX2FyaShzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKIC8qKgogICogcGNpX2FyaV9lbmFibGVkIC0gcXVlcnkgQVJJIGZvcndhcmRpbmcgc3RhdHVzCi0gKiBAZGV2OiB0aGUgUENJIGRldmljZQorICogQGJ1czogdGhlIFBDSSBidXMKICAqCiAgKiBSZXR1cm5zIDEgaWYgQVJJIGZvcndhcmRpbmcgaXMgZW5hYmxlZCwgb3IgMCBpZiBub3QgZW5hYmxlZDsKICAqLwotc3RhdGljIGlubGluZSBpbnQgcGNpX2FyaV9lbmFibGVkKHN0cnVjdCBwY2lfZGV2ICpkZXYpCitzdGF0aWMgaW5saW5lIGludCBwY2lfYXJpX2VuYWJsZWQoc3RydWN0IHBjaV9idXMgKmJ1cykKIHsKLQlyZXR1cm4gZGV2LT5hcmlfZW5hYmxlZDsKKwlyZXR1cm4gYnVzLT5zZWxmICYmIGJ1cy0+c2VsZi0+YXJpX2VuYWJsZWQ7CiB9CiAKICNlbmRpZiAvKiBEUklWRVJTX1BDSV9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9wY2llL2Flci9hZXJkcnZfYWNwaS5jIGIvZHJpdmVycy9wY2kvcGNpZS9hZXIvYWVyZHJ2X2FjcGkuYwppbmRleCA2ZGQ3YjEzLi5lYmNlMjZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9wY2llL2Flci9hZXJkcnZfYWNwaS5jCisrKyBiL2RyaXZlcnMvcGNpL3BjaWUvYWVyL2FlcmRydl9hY3BpLmMKQEAgLTM4LDcgKzM4LDYgQEAKIAogCWhhbmRsZSA9IGFjcGlfZmluZF9yb290X2JyaWRnZV9oYW5kbGUocGRldik7CiAJaWYgKGhhbmRsZSkgewotCQlwY2llX29zY19zdXBwb3J0X3NldChPU0NfRVhUX1BDSV9DT05GSUdfU1VQUE9SVCk7CiAJCXN0YXR1cyA9IHBjaV9vc2NfY29udHJvbF9zZXQoaGFuZGxlLAogCQkJCQlPU0NfUENJX0VYUFJFU1NfQUVSX0NPTlRST0wgfAogCQkJCQlPU0NfUENJX0VYUFJFU1NfQ0FQX1NUUlVDVFVSRV9DT05UUk9MKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3BjaWUvYWVyL2FlcmRydl9lcnJwcmludC5jIGIvZHJpdmVycy9wY2kvcGNpZS9hZXIvYWVyZHJ2X2VycnByaW50LmMKaW5kZXggMzkzM2Q0ZjMuLjBmYzI5YWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3BjaWUvYWVyL2FlcmRydl9lcnJwcmludC5jCisrKyBiL2RyaXZlcnMvcGNpL3BjaWUvYWVyL2FlcmRydl9lcnJwcmludC5jCkBAIC0yMzMsNyArMjMzLDcgQEAKIAogCQlpZiAoaW5mby0+ZmxhZ3MgJiBBRVJfVExQX0hFQURFUl9WQUxJRF9GTEFHKSB7CiAJCQl1bnNpZ25lZCBjaGFyICp0bHAgPSAodW5zaWduZWQgY2hhciAqKSAmaW5mby0+dGxwOwotCQkJcHJpbnRrKCIlc1RMQiBIZWFkZXI6XG4iLCBsb2dsZXZlbCk7CisJCQlwcmludGsoIiVzVExQIEhlYWRlcjpcbiIsIGxvZ2xldmVsKTsKIAkJCXByaW50aygiJXMlMDJ4JTAyeCUwMnglMDJ4ICUwMnglMDJ4JTAyeCUwMngiCiAJCQkJIiAlMDJ4JTAyeCUwMnglMDJ4ICUwMnglMDJ4JTAyeCUwMnhcbiIsCiAJCQkJbG9nbGV2ZWwsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9wY2llL2FzcG0uYyBiL2RyaXZlcnMvcGNpL3BjaWUvYXNwbS5jCmluZGV4IDlhYWQ2MDguLjU4NmI2ZjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3BjaWUvYXNwbS5jCisrKyBiL2RyaXZlcnMvcGNpL3BjaWUvYXNwbS5jCkBAIC0xNyw2ICsxNyw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9wY2ktYXNwbS5oPgogI2luY2x1ZGUgIi4uL3BjaS5oIgogCkBAIC0zMyw2ICszNCwxMSBAQAogc3RydWN0IHBjaWVfbGlua19zdGF0ZSB7CiAJc3RydWN0IGxpc3RfaGVhZCBzaWJpbGluZzsKIAlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKKwlib29sIGRvd25zdHJlYW1faGFzX3N3aXRjaDsKKworCXN0cnVjdCBwY2llX2xpbmtfc3RhdGUgKnBhcmVudDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGNoaWxkcmVuOworCXN0cnVjdCBsaXN0X2hlYWQgbGluazsKIAogCS8qIEFTUE0gc3RhdGUgKi8KIAl1bnNpZ25lZCBpbnQgc3VwcG9ydF9zdGF0ZTsKQEAgLTcwLDYgKzc2LDggQEAKIAlbUE9MSUNZX1BPV0VSU0FWRV0gPSAicG93ZXJzYXZlIgogfTsKIAorI2RlZmluZSBMSU5LX1JFVFJBSU5fVElNRU9VVCBIWgorCiBzdGF0aWMgaW50IHBvbGljeV90b19hc3BtX3N0YXRlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQogewogCXN0cnVjdCBwY2llX2xpbmtfc3RhdGUgKmxpbmtfc3RhdGUgPSBwZGV2LT5saW5rX3N0YXRlOwpAQCAtMTI1LDcgKzEzMyw3IEBACiAJbGlua19zdGF0ZS0+Y2xrX3BtX2VuYWJsZWQgPSAhIWVuYWJsZTsKIH0KIAotc3RhdGljIHZvaWQgcGNpZV9jaGVja19jbG9ja19wbShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3N0YXRpYyB2b2lkIHBjaWVfY2hlY2tfY2xvY2tfcG0oc3RydWN0IHBjaV9kZXYgKnBkZXYsIGludCBibGFja2xpc3QpCiB7CiAJaW50IHBvczsKIAl1MzIgcmVnMzI7CkBAIC0xNDksMTAgKzE1NywyNiBAQAogCQlpZiAoIShyZWcxNiAmIFBDSV9FWFBfTE5LQ1RMX0NMS1JFUV9FTikpCiAJCQllbmFibGVkID0gMDsKIAl9Ci0JbGlua19zdGF0ZS0+Y2xrX3BtX2NhcGFibGUgPSBjYXBhYmxlOwogCWxpbmtfc3RhdGUtPmNsa19wbV9lbmFibGVkID0gZW5hYmxlZDsKIAlsaW5rX3N0YXRlLT5iaW9zX2Nsa19zdGF0ZSA9IGVuYWJsZWQ7Ci0JcGNpZV9zZXRfY2xvY2tfcG0ocGRldiwgcG9saWN5X3RvX2Nsa3BtX3N0YXRlKHBkZXYpKTsKKwlpZiAoIWJsYWNrbGlzdCkgeworCQlsaW5rX3N0YXRlLT5jbGtfcG1fY2FwYWJsZSA9IGNhcGFibGU7CisJCXBjaWVfc2V0X2Nsb2NrX3BtKHBkZXYsIHBvbGljeV90b19jbGtwbV9zdGF0ZShwZGV2KSk7CisJfSBlbHNlIHsKKwkJbGlua19zdGF0ZS0+Y2xrX3BtX2NhcGFibGUgPSAwOworCQlwY2llX3NldF9jbG9ja19wbShwZGV2LCAwKTsKKwl9Cit9CisKK3N0YXRpYyBib29sIHBjaWVfYXNwbV9kb3duc3RyZWFtX2hhc19zd2l0Y2goc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IHBjaV9kZXYgKmNoaWxkX2RldjsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoY2hpbGRfZGV2LCAmcGRldi0+c3Vib3JkaW5hdGUtPmRldmljZXMsIGJ1c19saXN0KSB7CisJCWlmIChjaGlsZF9kZXYtPnBjaWVfdHlwZSA9PSBQQ0lfRVhQX1RZUEVfVVBTVFJFQU0pCisJCQlyZXR1cm4gdHJ1ZTsKKwl9CisJcmV0dXJuIGZhbHNlOwogfQogCiAvKgpAQCAtMjE3LDE2ICsyNDEsMTggQEAKIAlwY2lfd3JpdGVfY29uZmlnX3dvcmQocGRldiwgcG9zICsgUENJX0VYUF9MTktDVEwsIHJlZzE2KTsKIAogCS8qIFdhaXQgZm9yIGxpbmsgdHJhaW5pbmcgZW5kICovCi0JLyogYnJlYWsgb3V0IGFmdGVyIHdhaXRpbmcgZm9yIDEgc2Vjb25kICovCisJLyogYnJlYWsgb3V0IGFmdGVyIHdhaXRpbmcgZm9yIHRpbWVvdXQgKi8KIAlzdGFydF9qaWZmaWVzID0gamlmZmllczsKLQl3aGlsZSAoKGppZmZpZXMgLSBzdGFydF9qaWZmaWVzKSA8IEhaKSB7CisJZm9yICg7OykgewogCQlwY2lfcmVhZF9jb25maWdfd29yZChwZGV2LCBwb3MgKyBQQ0lfRVhQX0xOS1NUQSwgJnJlZzE2KTsKIAkJaWYgKCEocmVnMTYgJiBQQ0lfRVhQX0xOS1NUQV9MVCkpCiAJCQlicmVhazsKLQkJY3B1X3JlbGF4KCk7CisJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHN0YXJ0X2ppZmZpZXMgKyBMSU5LX1JFVFJBSU5fVElNRU9VVCkpCisJCQlicmVhazsKKwkJbXNsZWVwKDEpOwogCX0KIAkvKiB0cmFpbmluZyBmYWlsZWQgLT4gcmVjb3ZlciAqLwotCWlmICgoamlmZmllcyAtIHN0YXJ0X2ppZmZpZXMpID49IEhaKSB7CisJaWYgKHJlZzE2ICYgUENJX0VYUF9MTktTVEFfTFQpIHsKIAkJZGV2X3ByaW50ayAoS0VSTl9FUlIsICZwZGV2LT5kZXYsICJBU1BNOiBDb3VsZCBub3QgY29uZmlndXJlIgogCQkJICAgICIgY29tbW9uIGNsb2NrXG4iKTsKIAkJaSA9IDA7CkBAIC00MTksOSArNDQ1LDkgQEAKIHsKIAlzdHJ1Y3QgcGNpX2RldiAqY2hpbGRfZGV2OwogCi0JLyogSWYgbm8gY2hpbGQsIGRpc2FibGUgdGhlIGxpbmsgKi8KKwkvKiBJZiBubyBjaGlsZCwgaWdub3JlIHRoZSBsaW5rICovCiAJaWYgKGxpc3RfZW1wdHkoJnBkZXYtPnN1Ym9yZGluYXRlLT5kZXZpY2VzKSkKLQkJcmV0dXJuIDA7CisJCXJldHVybiBzdGF0ZTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNoaWxkX2RldiwgJnBkZXYtPnN1Ym9yZGluYXRlLT5kZXZpY2VzLCBidXNfbGlzdCkgewogCQlpZiAoY2hpbGRfZGV2LT5wY2llX3R5cGUgPT0gUENJX0VYUF9UWVBFX1BDSV9CUklER0UpIHsKIAkJCS8qCkBAIC00NjIsNiArNDg4LDkgQEAKIAlpbnQgdmFsaWQgPSAxOwogCXN0cnVjdCBwY2llX2xpbmtfc3RhdGUgKmxpbmtfc3RhdGUgPSBwZGV2LT5saW5rX3N0YXRlOwogCisJLyogSWYgbm8gY2hpbGQsIGRpc2FibGUgdGhlIGxpbmsgKi8KKwlpZiAobGlzdF9lbXB0eSgmcGRldi0+c3Vib3JkaW5hdGUtPmRldmljZXMpKQorCQlzdGF0ZSA9IDA7CiAJLyoKIAkgKiBpZiB0aGUgZG93bnN0cmVhbSBjb21wb25lbnQgaGFzIHBjaSBicmlkZ2UgZnVuY3Rpb24sIGRvbid0IGRvIEFTUE0KIAkgKiBub3cKQEAgLTQ5MywyMCArNTIyLDUyIEBACiAJbGlua19zdGF0ZS0+ZW5hYmxlZF9zdGF0ZSA9IHN0YXRlOwogfQogCitzdGF0aWMgc3RydWN0IHBjaWVfbGlua19zdGF0ZSAqZ2V0X3Jvb3RfcG9ydF9saW5rKHN0cnVjdCBwY2llX2xpbmtfc3RhdGUgKmxpbmspCit7CisJc3RydWN0IHBjaWVfbGlua19zdGF0ZSAqcm9vdF9wb3J0X2xpbmsgPSBsaW5rOworCXdoaWxlIChyb290X3BvcnRfbGluay0+cGFyZW50KQorCQlyb290X3BvcnRfbGluayA9IHJvb3RfcG9ydF9saW5rLT5wYXJlbnQ7CisJcmV0dXJuIHJvb3RfcG9ydF9saW5rOworfQorCisvKiBjaGVjayB0aGUgd2hvbGUgaGllcmFyY2h5LCBhbmQgY29uZmlndXJlIGVhY2ggbGluayBpbiB0aGUgaGllcmFyY2h5ICovCiBzdGF0aWMgdm9pZCBfX3BjaWVfYXNwbV9jb25maWd1cmVfbGlua19zdGF0ZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKIAl1bnNpZ25lZCBpbnQgc3RhdGUpCiB7CiAJc3RydWN0IHBjaWVfbGlua19zdGF0ZSAqbGlua19zdGF0ZSA9IHBkZXYtPmxpbmtfc3RhdGU7CisJc3RydWN0IHBjaWVfbGlua19zdGF0ZSAqcm9vdF9wb3J0X2xpbmsgPSBnZXRfcm9vdF9wb3J0X2xpbmsobGlua19zdGF0ZSk7CisJc3RydWN0IHBjaWVfbGlua19zdGF0ZSAqbGVhZjsKIAotCWlmIChsaW5rX3N0YXRlLT5zdXBwb3J0X3N0YXRlID09IDApCi0JCXJldHVybjsKIAlzdGF0ZSAmPSBQQ0lFX0xJTktfU1RBVEVfTDBTfFBDSUVfTElOS19TVEFURV9MMTsKIAotCS8qIHN0YXRlIDAgbWVhbnMgZGlzYWJsaW5nIGFzcG0gKi8KLQlzdGF0ZSA9IHBjaWVfYXNwbV9jaGVja19zdGF0ZShwZGV2LCBzdGF0ZSk7CisJLyogY2hlY2sgYWxsIGxpbmtzIHdobyBoYXZlIHNwZWNpZmljIHJvb3QgcG9ydCBsaW5rICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeShsZWFmLCAmbGlua19saXN0LCBzaWJpbGluZykgeworCQlpZiAoIWxpc3RfZW1wdHkoJmxlYWYtPmNoaWxkcmVuKSB8fAorCQkJZ2V0X3Jvb3RfcG9ydF9saW5rKGxlYWYpICE9IHJvb3RfcG9ydF9saW5rKQorCQkJY29udGludWU7CisJCXN0YXRlID0gcGNpZV9hc3BtX2NoZWNrX3N0YXRlKGxlYWYtPnBkZXYsIHN0YXRlKTsKKwl9CisJLyogY2hlY2sgcm9vdCBwb3J0IGxpbmsgdG9vIGluIGNhc2UgaXQgaGFzbid0IGNoaWxkcmVuICovCisJc3RhdGUgPSBwY2llX2FzcG1fY2hlY2tfc3RhdGUocm9vdF9wb3J0X2xpbmstPnBkZXYsIHN0YXRlKTsKKwogCWlmIChsaW5rX3N0YXRlLT5lbmFibGVkX3N0YXRlID09IHN0YXRlKQogCQlyZXR1cm47Ci0JX19wY2llX2FzcG1fY29uZmlnX2xpbmsocGRldiwgc3RhdGUpOworCisJLyoKKwkgKiB3ZSBtdXN0IGNoYW5nZSB0aGUgaGllcmFyY2h5LiBTZWUgY29tbWVudHMgaW4KKwkgKiBfX3BjaWVfYXNwbV9jb25maWdfbGluayBmb3IgdGhlIG9yZGVyCisJICoqLworCWlmIChzdGF0ZSAmIFBDSUVfTElOS19TVEFURV9MMSkgeworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGxlYWYsICZsaW5rX2xpc3QsIHNpYmlsaW5nKSB7CisJCQlpZiAoZ2V0X3Jvb3RfcG9ydF9saW5rKGxlYWYpID09IHJvb3RfcG9ydF9saW5rKQorCQkJCV9fcGNpZV9hc3BtX2NvbmZpZ19saW5rKGxlYWYtPnBkZXYsIHN0YXRlKTsKKwkJfQorCX0gZWxzZSB7CisJCWxpc3RfZm9yX2VhY2hfZW50cnlfcmV2ZXJzZShsZWFmLCAmbGlua19saXN0LCBzaWJpbGluZykgeworCQkJaWYgKGdldF9yb290X3BvcnRfbGluayhsZWFmKSA9PSByb290X3BvcnRfbGluaykKKwkJCQlfX3BjaWVfYXNwbV9jb25maWdfbGluayhsZWFmLT5wZGV2LCBzdGF0ZSk7CisJCX0KKwl9CiB9CiAKIC8qCkBAIC01NzAsNiArNjMxLDcgQEAKIAl1bnNpZ25lZCBpbnQgc3RhdGU7CiAJc3RydWN0IHBjaWVfbGlua19zdGF0ZSAqbGlua19zdGF0ZTsKIAlpbnQgZXJyb3IgPSAwOworCWludCBibGFja2xpc3Q7CiAKIAlpZiAoYXNwbV9kaXNhYmxlZCB8fCAhcGRldi0+aXNfcGNpZSB8fCBwZGV2LT5saW5rX3N0YXRlKQogCQlyZXR1cm47CkBAIC01ODAsMjkgKzY0Miw1OCBAQAogCWlmIChsaXN0X2VtcHR5KCZwZGV2LT5zdWJvcmRpbmF0ZS0+ZGV2aWNlcykpCiAJCWdvdG8gb3V0OwogCi0JaWYgKHBjaWVfYXNwbV9zYW5pdHlfY2hlY2socGRldikpCi0JCWdvdG8gb3V0OworCWJsYWNrbGlzdCA9ICEhcGNpZV9hc3BtX3Nhbml0eV9jaGVjayhwZGV2KTsKIAogCW11dGV4X2xvY2soJmFzcG1fbG9jayk7CiAKIAlsaW5rX3N0YXRlID0ga3phbGxvYyhzaXplb2YoKmxpbmtfc3RhdGUpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWxpbmtfc3RhdGUpCiAJCWdvdG8gdW5sb2NrX291dDsKKworCWxpbmtfc3RhdGUtPmRvd25zdHJlYW1faGFzX3N3aXRjaCA9IHBjaWVfYXNwbV9kb3duc3RyZWFtX2hhc19zd2l0Y2gocGRldik7CisJSU5JVF9MSVNUX0hFQUQoJmxpbmtfc3RhdGUtPmNoaWxkcmVuKTsKKwlJTklUX0xJU1RfSEVBRCgmbGlua19zdGF0ZS0+bGluayk7CisJaWYgKHBkZXYtPmJ1cy0+c2VsZikgey8qIHRoaXMgaXMgYSBzd2l0Y2ggKi8KKwkJc3RydWN0IHBjaWVfbGlua19zdGF0ZSAqcGFyZW50X2xpbmtfc3RhdGU7CisKKwkJcGFyZW50X2xpbmtfc3RhdGUgPSBwZGV2LT5idXMtPnBhcmVudC0+c2VsZi0+bGlua19zdGF0ZTsKKwkJaWYgKCFwYXJlbnRfbGlua19zdGF0ZSkgeworCQkJa2ZyZWUobGlua19zdGF0ZSk7CisJCQlnb3RvIHVubG9ja19vdXQ7CisJCX0KKwkJbGlzdF9hZGQoJmxpbmtfc3RhdGUtPmxpbmssICZwYXJlbnRfbGlua19zdGF0ZS0+Y2hpbGRyZW4pOworCQlsaW5rX3N0YXRlLT5wYXJlbnQgPSBwYXJlbnRfbGlua19zdGF0ZTsKKwl9CisKIAlwZGV2LT5saW5rX3N0YXRlID0gbGlua19zdGF0ZTsKIAotCXBjaWVfYXNwbV9jb25maWd1cmVfY29tbW9uX2Nsb2NrKHBkZXYpOwotCi0JcGNpZV9hc3BtX2NhcF9pbml0KHBkZXYpOwotCi0JLyogY29uZmlnIGxpbmsgc3RhdGUgdG8gYXZvaWQgQklPUyBlcnJvciAqLwotCXN0YXRlID0gcGNpZV9hc3BtX2NoZWNrX3N0YXRlKHBkZXYsIHBvbGljeV90b19hc3BtX3N0YXRlKHBkZXYpKTsKLQlfX3BjaWVfYXNwbV9jb25maWdfbGluayhwZGV2LCBzdGF0ZSk7Ci0KLQlwY2llX2NoZWNrX2Nsb2NrX3BtKHBkZXYpOworCWlmICghYmxhY2tsaXN0KSB7CisJCXBjaWVfYXNwbV9jb25maWd1cmVfY29tbW9uX2Nsb2NrKHBkZXYpOworCQlwY2llX2FzcG1fY2FwX2luaXQocGRldik7CisJfSBlbHNlIHsKKwkJbGlua19zdGF0ZS0+ZW5hYmxlZF9zdGF0ZSA9IFBDSUVfTElOS19TVEFURV9MMFN8UENJRV9MSU5LX1NUQVRFX0wxOworCQlsaW5rX3N0YXRlLT5iaW9zX2FzcG1fc3RhdGUgPSAwOworCQkvKiBTZXQgc3VwcG9ydCBzdGF0ZSB0byAwLCBzbyB3ZSB3aWxsIGRpc2FibGUgQVNQTSBsYXRlciAqLworCQlsaW5rX3N0YXRlLT5zdXBwb3J0X3N0YXRlID0gMDsKKwl9CiAKIAlsaW5rX3N0YXRlLT5wZGV2ID0gcGRldjsKIAlsaXN0X2FkZCgmbGlua19zdGF0ZS0+c2liaWxpbmcsICZsaW5rX2xpc3QpOwogCisJaWYgKGxpbmtfc3RhdGUtPmRvd25zdHJlYW1faGFzX3N3aXRjaCkgeworCQkvKgorCQkgKiBJZiBsaW5rIGhhcyBzd2l0Y2gsIGRlbGF5IHRoZSBsaW5rIGNvbmZpZy4gVGhlIGxlYWYgbGluaworCQkgKiBpbml0aWFsaXphdGlvbiB3aWxsIGNvbmZpZyB0aGUgd2hvbGUgaGllcmFyY2h5LiBidXQgd2UgbXVzdAorCQkgKiBtYWtlIHN1cmUgQklPUyBkb2Vzbid0IHNldCB1bnN1cHBvcnRlZCBsaW5rIHN0YXRlCisJCSAqKi8KKwkJc3RhdGUgPSBwY2llX2FzcG1fY2hlY2tfc3RhdGUocGRldiwgbGlua19zdGF0ZS0+Ymlvc19hc3BtX3N0YXRlKTsKKwkJX19wY2llX2FzcG1fY29uZmlnX2xpbmsocGRldiwgc3RhdGUpOworCX0gZWxzZQorCQlfX3BjaWVfYXNwbV9jb25maWd1cmVfbGlua19zdGF0ZShwZGV2LAorCQkJcG9saWN5X3RvX2FzcG1fc3RhdGUocGRldikpOworCisJcGNpZV9jaGVja19jbG9ja19wbShwZGV2LCBibGFja2xpc3QpOworCiB1bmxvY2tfb3V0OgogCWlmIChlcnJvcikKIAkJZnJlZV9saW5rX3N0YXRlKHBkZXYpOwpAQCAtNjM1LDYgKzcyNiw3IEBACiAJLyogQWxsIGZ1bmN0aW9ucyBhcmUgcmVtb3ZlZCwgc28ganVzdCBkaXNhYmxlIEFTUE0gZm9yIHRoZSBsaW5rICovCiAJX19wY2llX2FzcG1fY29uZmlnX29uZV9kZXYocGFyZW50LCAwKTsKIAlsaXN0X2RlbCgmbGlua19zdGF0ZS0+c2liaWxpbmcpOworCWxpc3RfZGVsKCZsaW5rX3N0YXRlLT5saW5rKTsKIAkvKiBDbG9jayBQTSBpcyBmb3IgZW5kcG9pbnQgZGV2aWNlICovCiAKIAlmcmVlX2xpbmtfc3RhdGUocGFyZW50KTsKQEAgLTg1NywyNCArOTQ5LDE1IEBACiAJCWFzcG1fZGlzYWJsZWQgPSAxOwogfQogCi0jaWZkZWYgQ09ORklHX0FDUEkKLSNpbmNsdWRlIDxhY3BpL2FjcGlfYnVzLmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLWFjcGkuaD4KLXN0YXRpYyB2b2lkIHBjaWVfYXNwbV9wbGF0Zm9ybV9pbml0KHZvaWQpCisvKioKKyAqIHBjaWVfYXNwbV9lbmFibGVkIC0gaXMgUENJZSBBU1BNIGVuYWJsZWQ/CisgKgorICogUmV0dXJucyB0cnVlIGlmIEFTUE0gaGFzIG5vdCBiZWVuIGRpc2FibGVkIGJ5IHRoZSBjb21tYW5kLWxpbmUgb3B0aW9uCisgKiBwY2llX2FzcG09b2ZmLgorICoqLworaW50IHBjaWVfYXNwbV9lbmFibGVkKHZvaWQpCiB7Ci0JcGNpZV9vc2Nfc3VwcG9ydF9zZXQoT1NDX0FDVElWRV9TVEFURV9QV1JfU1VQUE9SVHwKLQkJT1NDX0NMT0NLX1BXUl9DQVBBQklMSVRZX1NVUFBPUlQpOworICAgICAgIHJldHVybiAhYXNwbV9kaXNhYmxlZDsKIH0KLSNlbHNlCi1zdGF0aWMgaW5saW5lIHZvaWQgcGNpZV9hc3BtX3BsYXRmb3JtX2luaXQodm9pZCkgeyB9Ci0jZW5kaWYKK0VYUE9SVF9TWU1CT0wocGNpZV9hc3BtX2VuYWJsZWQpOwogCi1zdGF0aWMgaW50IF9faW5pdCBwY2llX2FzcG1faW5pdCh2b2lkKQotewotCWlmIChhc3BtX2Rpc2FibGVkKQotCQlyZXR1cm4gMDsKLQlwY2llX2FzcG1fcGxhdGZvcm1faW5pdCgpOwotCXJldHVybiAwOwotfQotCi1mc19pbml0Y2FsbChwY2llX2FzcG1faW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9wY2llL3BvcnRkcnZfYnVzLmMgYi9kcml2ZXJzL3BjaS9wY2llL3BvcnRkcnZfYnVzLmMKaW5kZXggMzU5ZmU1NS4uZWVjODliNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvcGNpZS9wb3J0ZHJ2X2J1cy5jCisrKyBiL2RyaXZlcnMvcGNpL3BjaWUvcG9ydGRydl9idXMuYwpAQCAtMTYsMTQgKzE2LDEwIEBACiAjaW5jbHVkZSAicG9ydGRydi5oIgogCiBzdGF0aWMgaW50IHBjaWVfcG9ydF9idXNfbWF0Y2goc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2KTsKLXN0YXRpYyBpbnQgcGNpZV9wb3J0X2J1c19zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlKTsKLXN0YXRpYyBpbnQgcGNpZV9wb3J0X2J1c19yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KTsKIAogc3RydWN0IGJ1c190eXBlIHBjaWVfcG9ydF9idXNfdHlwZSA9IHsKIAkubmFtZSAJCT0gInBjaV9leHByZXNzIiwKIAkubWF0Y2ggCQk9IHBjaWVfcG9ydF9idXNfbWF0Y2gsCi0JLnN1c3BlbmQJPSBwY2llX3BvcnRfYnVzX3N1c3BlbmQsCi0JLnJlc3VtZQkJPSBwY2llX3BvcnRfYnVzX3Jlc3VtZSwgCiB9OwogRVhQT1JUX1NZTUJPTF9HUEwocGNpZV9wb3J0X2J1c190eXBlKTsKIApAQCAtNDksMzIgKzQ1LDEyIEBACiAJcmV0dXJuIDE7CiB9CiAKLXN0YXRpYyBpbnQgcGNpZV9wb3J0X2J1c19zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQoraW50IHBjaWVfcG9ydF9idXNfcmVnaXN0ZXIodm9pZCkKIHsKLQlzdHJ1Y3QgcGNpZV9kZXZpY2UgKnBjaWVkZXY7Ci0Jc3RydWN0IHBjaWVfcG9ydF9zZXJ2aWNlX2RyaXZlciAqZHJpdmVyOwotCi0JaWYgKCFkZXYgfHwgIWRldi0+ZHJpdmVyKQotCQlyZXR1cm4gMDsKLQotCXBjaWVkZXYgPSB0b19wY2llX2RldmljZShkZXYpOwotIAlkcml2ZXIgPSB0b19zZXJ2aWNlX2RyaXZlcihkZXYtPmRyaXZlcik7Ci0JaWYgKGRyaXZlciAmJiBkcml2ZXItPnN1c3BlbmQpCi0JCWRyaXZlci0+c3VzcGVuZChwY2llZGV2LCBzdGF0ZSk7Ci0JcmV0dXJuIDA7CisJcmV0dXJuIGJ1c19yZWdpc3RlcigmcGNpZV9wb3J0X2J1c190eXBlKTsKIH0KIAotc3RhdGljIGludCBwY2llX3BvcnRfYnVzX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit2b2lkIHBjaWVfcG9ydF9idXNfdW5yZWdpc3Rlcih2b2lkKQogewotCXN0cnVjdCBwY2llX2RldmljZSAqcGNpZWRldjsKLQlzdHJ1Y3QgcGNpZV9wb3J0X3NlcnZpY2VfZHJpdmVyICpkcml2ZXI7Ci0KLQlpZiAoIWRldiB8fCAhZGV2LT5kcml2ZXIpCi0JCXJldHVybiAwOwotCi0JcGNpZWRldiA9IHRvX3BjaWVfZGV2aWNlKGRldik7Ci0gCWRyaXZlciA9IHRvX3NlcnZpY2VfZHJpdmVyKGRldi0+ZHJpdmVyKTsKLQlpZiAoZHJpdmVyICYmIGRyaXZlci0+cmVzdW1lKQotCQlkcml2ZXItPnJlc3VtZShwY2llZGV2KTsKLQlyZXR1cm4gMDsKKwlidXNfdW5yZWdpc3RlcigmcGNpZV9wb3J0X2J1c190eXBlKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3BjaWUvcG9ydGRydl9jb3JlLmMgYi9kcml2ZXJzL3BjaS9wY2llL3BvcnRkcnZfY29yZS5jCmluZGV4IDJlMDkxZTAuLjhiM2Y4YzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3BjaWUvcG9ydGRydl9jb3JlLmMKKysrIGIvZHJpdmVycy9wY2kvcGNpZS9wb3J0ZHJ2X2NvcmUuYwpAQCAtMTksOTEgKzE5LDE1IEBACiAKIGV4dGVybiBpbnQgcGNpZV9tY2hfcXVpcms7CS8qIE1TSS1xdWlyayBJbmRpY2F0b3IgKi8KIAotc3RhdGljIGludCBwY2llX3BvcnRfcHJvYmVfc2VydmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IHBjaWVfZGV2aWNlICpwY2llZGV2OwotCXN0cnVjdCBwY2llX3BvcnRfc2VydmljZV9kcml2ZXIgKmRyaXZlcjsKLQlpbnQgc3RhdHVzOwotCi0JaWYgKCFkZXYgfHwgIWRldi0+ZHJpdmVyKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotIAlkcml2ZXIgPSB0b19zZXJ2aWNlX2RyaXZlcihkZXYtPmRyaXZlcik7Ci0JaWYgKCFkcml2ZXIgfHwgIWRyaXZlci0+cHJvYmUpCi0JCXJldHVybiAtRU5PREVWOwotCi0JcGNpZWRldiA9IHRvX3BjaWVfZGV2aWNlKGRldik7Ci0Jc3RhdHVzID0gZHJpdmVyLT5wcm9iZShwY2llZGV2LCBkcml2ZXItPmlkX3RhYmxlKTsKLQlpZiAoIXN0YXR1cykgewotCQlkZXZfcHJpbnRrKEtFUk5fREVCVUcsIGRldiwgInNlcnZpY2UgZHJpdmVyICVzIGxvYWRlZFxuIiwKLQkJCWRyaXZlci0+bmFtZSk7Ci0JCWdldF9kZXZpY2UoZGV2KTsKLQl9Ci0JcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdGljIGludCBwY2llX3BvcnRfcmVtb3ZlX3NlcnZpY2Uoc3RydWN0IGRldmljZSAqZGV2KQotewotCXN0cnVjdCBwY2llX2RldmljZSAqcGNpZWRldjsKLQlzdHJ1Y3QgcGNpZV9wb3J0X3NlcnZpY2VfZHJpdmVyICpkcml2ZXI7Ci0KLQlpZiAoIWRldiB8fCAhZGV2LT5kcml2ZXIpCi0JCXJldHVybiAwOwotCi0JcGNpZWRldiA9IHRvX3BjaWVfZGV2aWNlKGRldik7Ci0gCWRyaXZlciA9IHRvX3NlcnZpY2VfZHJpdmVyKGRldi0+ZHJpdmVyKTsKLQlpZiAoZHJpdmVyICYmIGRyaXZlci0+cmVtb3ZlKSB7IAotCQlkZXZfcHJpbnRrKEtFUk5fREVCVUcsIGRldiwgInVubG9hZGluZyBzZXJ2aWNlIGRyaXZlciAlc1xuIiwKLQkJCWRyaXZlci0+bmFtZSk7Ci0JCWRyaXZlci0+cmVtb3ZlKHBjaWVkZXYpOwotCQlwdXRfZGV2aWNlKGRldik7Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBwY2llX3BvcnRfc2h1dGRvd25fc2VydmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpIHt9Ci0KLXN0YXRpYyBpbnQgcGNpZV9wb3J0X3N1c3BlbmRfc2VydmljZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKLXsKLQlzdHJ1Y3QgcGNpZV9kZXZpY2UgKnBjaWVkZXY7Ci0Jc3RydWN0IHBjaWVfcG9ydF9zZXJ2aWNlX2RyaXZlciAqZHJpdmVyOwotCi0JaWYgKCFkZXYgfHwgIWRldi0+ZHJpdmVyKQotCQlyZXR1cm4gMDsKLQotCXBjaWVkZXYgPSB0b19wY2llX2RldmljZShkZXYpOwotIAlkcml2ZXIgPSB0b19zZXJ2aWNlX2RyaXZlcihkZXYtPmRyaXZlcik7Ci0JaWYgKGRyaXZlciAmJiBkcml2ZXItPnN1c3BlbmQpCi0JCWRyaXZlci0+c3VzcGVuZChwY2llZGV2LCBzdGF0ZSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgcGNpZV9wb3J0X3Jlc3VtZV9zZXJ2aWNlKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgcGNpZV9kZXZpY2UgKnBjaWVkZXY7Ci0Jc3RydWN0IHBjaWVfcG9ydF9zZXJ2aWNlX2RyaXZlciAqZHJpdmVyOwotCi0JaWYgKCFkZXYgfHwgIWRldi0+ZHJpdmVyKQotCQlyZXR1cm4gMDsKLQotCXBjaWVkZXYgPSB0b19wY2llX2RldmljZShkZXYpOwotIAlkcml2ZXIgPSB0b19zZXJ2aWNlX2RyaXZlcihkZXYtPmRyaXZlcik7Ci0KLQlpZiAoZHJpdmVyICYmIGRyaXZlci0+cmVzdW1lKQotCQlkcml2ZXItPnJlc3VtZShwY2llZGV2KTsKLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIHJlbGVhc2VfcGNpZV9kZXZpY2UKLSAqCQotICoJQmVpbmcgaW52b2tlZCBhdXRvbWF0aWNhbGx5IHdoZW4gZGV2aWNlIGlzIGJlaW5nIHJlbW92ZWQgCi0gKglpbiByZXNwb25zZSB0byBkZXZpY2VfdW5yZWdpc3RlcihkZXYpIGNhbGwuCi0gKglSZWxlYXNlIGFsbCByZXNvdXJjZXMgYmVpbmcgY2xhaW1lZC4KKy8qKgorICogcmVsZWFzZV9wY2llX2RldmljZSAtIGZyZWUgUENJIEV4cHJlc3MgcG9ydCBzZXJ2aWNlIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEBkZXY6IFBvcnQgc2VydmljZSBkZXZpY2UgdG8gcmVsZWFzZQorICoKKyAqIEludm9rZWQgYXV0b21hdGljYWxseSB3aGVuIGRldmljZSBpcyBiZWluZyByZW1vdmVkIGluIHJlc3BvbnNlIHRvCisgKiBkZXZpY2VfdW5yZWdpc3RlcihkZXYpLiAgUmVsZWFzZSBhbGwgcmVzb3VyY2VzIGJlaW5nIGNsYWltZWQuCiAgKi8KIHN0YXRpYyB2b2lkIHJlbGVhc2VfcGNpZV9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KQogewotCWRldl9wcmludGsoS0VSTl9ERUJVRywgZGV2LCAiZnJlZSBwb3J0IHNlcnZpY2VcbiIpOwogCWtmcmVlKHRvX3BjaWVfZGV2aWNlKGRldikpOwkJCQogfQogCkBAIC0xMjgsNyArNTIsMTYgQEAKIAl9CiAJcmV0dXJuIHF1aXJrOwogfQotCQorCisvKioKKyAqIGFzc2lnbl9pbnRlcnJ1cHRfbW9kZSAtIGNob29zZSBpbnRlcnJ1cHQgbW9kZSBmb3IgUENJIEV4cHJlc3MgcG9ydCBzZXJ2aWNlcworICogICAgICAgICAgICAgICAgICAgICAgICAgKElOVHgsIE1TSS1YLCBNU0kpIGFuZCBzZXQgdXAgdmVjdG9ycworICogQGRldjogUENJIEV4cHJlc3MgcG9ydCB0byBoYW5kbGUKKyAqIEB2ZWN0b3JzOiBBcnJheSBvZiBpbnRlcnJ1cHQgdmVjdG9ycyB0byBwb3B1bGF0ZQorICogQG1hc2s6IEJpdG1hc2sgb2YgcG9ydCBjYXBhYmlsaXRpZXMgcmV0dXJuZWQgYnkgZ2V0X3BvcnRfZGV2aWNlX2NhcGFiaWxpdHkoKQorICoKKyAqIFJldHVybiB2YWx1ZTogSW50ZXJydXB0IG1vZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBwb3J0CisgKi8KIHN0YXRpYyBpbnQgYXNzaWduX2ludGVycnVwdF9tb2RlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCAqdmVjdG9ycywgaW50IG1hc2spCiB7CiAJaW50IGksIHBvcywgbnZlYywgc3RhdHVzID0gLUVJTlZBTDsKQEAgLTE1MCw3ICs4Myw2IEBACiAJaWYgKHBvcykgewogCQlzdHJ1Y3QgbXNpeF9lbnRyeSBtc2l4X2VudHJpZXNbUENJRV9QT1JUX0RFVklDRV9NQVhTRVJWSUNFU10gPSAKIAkJCXt7MCwgMH0sIHswLCAxfSwgezAsIDJ9LCB7MCwgM319OwotCQlkZXZfaW5mbygmZGV2LT5kZXYsICJmb3VuZCBNU0ktWCBjYXBhYmlsaXR5XG4iKTsKIAkJc3RhdHVzID0gcGNpX2VuYWJsZV9tc2l4KGRldiwgbXNpeF9lbnRyaWVzLCBudmVjKTsKIAkJaWYgKCFzdGF0dXMpIHsKIAkJCWludCBqID0gMDsKQEAgLTE2NSw3ICs5Nyw2IEBACiAJaWYgKHN0YXR1cykgewogCQlwb3MgPSBwY2lfZmluZF9jYXBhYmlsaXR5KGRldiwgUENJX0NBUF9JRF9NU0kpOwogCQlpZiAocG9zKSB7Ci0JCQlkZXZfaW5mbygmZGV2LT5kZXYsICJmb3VuZCBNU0kgY2FwYWJpbGl0eVxuIik7CiAJCQlzdGF0dXMgPSBwY2lfZW5hYmxlX21zaShkZXYpOwogCQkJaWYgKCFzdGF0dXMpIHsKIAkJCQlpbnRlcnJ1cHRfbW9kZSA9IFBDSUVfUE9SVF9NU0lfTU9ERTsKQEAgLTE3Nyw2ICsxMDgsMTYgQEAKIAlyZXR1cm4gaW50ZXJydXB0X21vZGU7CiB9CiAKKy8qKgorICogZ2V0X3BvcnRfZGV2aWNlX2NhcGFiaWxpdHkgLSBkaXNjb3ZlciBjYXBhYmlsaXRpZXMgb2YgYSBQQ0kgRXhwcmVzcyBwb3J0CisgKiBAZGV2OiBQQ0kgRXhwcmVzcyBwb3J0IHRvIGV4YW1pbmUKKyAqCisgKiBUaGUgY2FwYWJpbGl0aWVzIGFyZSByZWFkIGZyb20gdGhlIHBvcnQncyBQQ0kgRXhwcmVzcyBjb25maWd1cmF0aW9uIHJlZ2lzdGVycworICogYXMgZGVzY3JpYmVkIGluIFBDSSBFeHByZXNzIEJhc2UgU3BlY2lmaWNhdGlvbiAxLjBhIHNlY3Rpb25zIDcuOC4yLCA3LjguOSBhbmQKKyAqIDcuOSAtIDcuMTEuCisgKgorICogUmV0dXJuIHZhbHVlOiBCaXRtYXNrIG9mIGRpc2NvdmVyZWQgcG9ydCBjYXBhYmlsaXRpZXMKKyAqLwogc3RhdGljIGludCBnZXRfcG9ydF9kZXZpY2VfY2FwYWJpbGl0eShzdHJ1Y3QgcGNpX2RldiAqZGV2KQogewogCWludCBzZXJ2aWNlcyA9IDAsIHBvczsKQEAgLTIwNCw2ICsxNDUsMTUgQEAKIAlyZXR1cm4gc2VydmljZXM7CiB9CiAKKy8qKgorICogcGNpZV9kZXZpY2VfaW5pdCAtIGluaXRpYWxpemUgUENJIEV4cHJlc3MgcG9ydCBzZXJ2aWNlIGRldmljZQorICogQGRldjogUG9ydCBzZXJ2aWNlIGRldmljZSB0byBpbml0aWFsaXplCisgKiBAcGFyZW50OiBQQ0kgRXhwcmVzcyBwb3J0IHRvIGFzc29jaWF0ZSB0aGUgc2VydmljZSBkZXZpY2Ugd2l0aAorICogQHBvcnRfdHlwZTogVHlwZSBvZiB0aGUgcG9ydAorICogQHNlcnZpY2VfdHlwZTogVHlwZSBvZiBzZXJ2aWNlIHRvIGFzc29jaWF0ZSB3aXRoIHRoZSBzZXJ2aWNlIGRldmljZQorICogQGlycTogSW50ZXJydXB0IHZlY3RvciB0byBhc3NvY2lhdGUgd2l0aCB0aGUgc2VydmljZSBkZXZpY2UKKyAqIEBpcnFfbW9kZTogSW50ZXJydXB0IG1vZGUgb2YgdGhlIHNlcnZpY2UgKElOVHgsIE1TSS1YLCBNU0kpCisgKi8KIHN0YXRpYyB2b2lkIHBjaWVfZGV2aWNlX2luaXQoc3RydWN0IHBjaV9kZXYgKnBhcmVudCwgc3RydWN0IHBjaWVfZGV2aWNlICpkZXYsIAogCWludCBwb3J0X3R5cGUsIGludCBzZXJ2aWNlX3R5cGUsIGludCBpcnEsIGludCBpcnFfbW9kZSkKIHsKQEAgLTIyNCwxMSArMTc0LDE5IEBACiAJZGV2aWNlLT5kcml2ZXIgPSBOVUxMOwogCWRldmljZS0+ZHJpdmVyX2RhdGEgPSBOVUxMOwogCWRldmljZS0+cmVsZWFzZSA9IHJlbGVhc2VfcGNpZV9kZXZpY2U7CS8qIGNhbGxiYWNrIHRvIGZyZWUgcGNpZSBkZXYgKi8KLQlzbnByaW50ZihkZXZpY2UtPmJ1c19pZCwgc2l6ZW9mKGRldmljZS0+YnVzX2lkKSwgIiVzOnBjaWUlMDJ4IiwKKwlkZXZfc2V0X25hbWUoZGV2aWNlLCAiJXM6cGNpZSUwMngiLAogCQkgcGNpX25hbWUocGFyZW50KSwgZ2V0X2Rlc2NyaXB0b3JfaWQocG9ydF90eXBlLCBzZXJ2aWNlX3R5cGUpKTsKIAlkZXZpY2UtPnBhcmVudCA9ICZwYXJlbnQtPmRldjsKIH0KIAorLyoqCisgKiBhbGxvY19wY2llX2RldmljZSAtIGFsbG9jYXRlIFBDSSBFeHByZXNzIHBvcnQgc2VydmljZSBkZXZpY2Ugc3RydWN0dXJlCisgKiBAcGFyZW50OiBQQ0kgRXhwcmVzcyBwb3J0IHRvIGFzc29jaWF0ZSB0aGUgc2VydmljZSBkZXZpY2Ugd2l0aAorICogQHBvcnRfdHlwZTogVHlwZSBvZiB0aGUgcG9ydAorICogQHNlcnZpY2VfdHlwZTogVHlwZSBvZiBzZXJ2aWNlIHRvIGFzc29jaWF0ZSB3aXRoIHRoZSBzZXJ2aWNlIGRldmljZQorICogQGlycTogSW50ZXJydXB0IHZlY3RvciB0byBhc3NvY2lhdGUgd2l0aCB0aGUgc2VydmljZSBkZXZpY2UKKyAqIEBpcnFfbW9kZTogSW50ZXJydXB0IG1vZGUgb2YgdGhlIHNlcnZpY2UgKElOVHgsIE1TSS1YLCBNU0kpCisgKi8KIHN0YXRpYyBzdHJ1Y3QgcGNpZV9kZXZpY2UqIGFsbG9jX3BjaWVfZGV2aWNlKHN0cnVjdCBwY2lfZGV2ICpwYXJlbnQsCiAJaW50IHBvcnRfdHlwZSwgaW50IHNlcnZpY2VfdHlwZSwgaW50IGlycSwgaW50IGlycV9tb2RlKQogewpAQCAtMjM5LDEwICsxOTcsMTMgQEAKIAkJcmV0dXJuIE5VTEw7CiAKIAlwY2llX2RldmljZV9pbml0KHBhcmVudCwgZGV2aWNlLCBwb3J0X3R5cGUsIHNlcnZpY2VfdHlwZSwgaXJxLGlycV9tb2RlKTsKLQlkZXZfcHJpbnRrKEtFUk5fREVCVUcsICZkZXZpY2UtPmRldmljZSwgImFsbG9jYXRlIHBvcnQgc2VydmljZVxuIik7CiAJcmV0dXJuIGRldmljZTsKIH0KIAorLyoqCisgKiBwY2llX3BvcnRfZGV2aWNlX3Byb2JlIC0gY2hlY2sgaWYgZGV2aWNlIGlzIGEgUENJIEV4cHJlc3MgcG9ydAorICogQGRldjogRGV2aWNlIHRvIGNoZWNrCisgKi8KIGludCBwY2llX3BvcnRfZGV2aWNlX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpkZXYpCiB7CiAJaW50IHBvcywgdHlwZTsKQEAgLTI2MCw2ICsyMjEsMTMgQEAKIAlyZXR1cm4gLUVOT0RFVjsKIH0KIAorLyoqCisgKiBwY2llX3BvcnRfZGV2aWNlX3JlZ2lzdGVyIC0gcmVnaXN0ZXIgUENJIEV4cHJlc3MgcG9ydAorICogQGRldjogUENJIEV4cHJlc3MgcG9ydCB0byByZWdpc3RlcgorICoKKyAqIEFsbG9jYXRlIHRoZSBwb3J0IGV4dGVuc2lvbiBzdHJ1Y3R1cmUgYW5kIHJlZ2lzdGVyIHNlcnZpY2VzIGFzc29jaWF0ZWQgd2l0aAorICogdGhlIHBvcnQuCisgKi8KIGludCBwY2llX3BvcnRfZGV2aWNlX3JlZ2lzdGVyKHN0cnVjdCBwY2lfZGV2ICpkZXYpCiB7CiAJc3RydWN0IHBjaWVfcG9ydF9kZXZpY2VfZXh0ICpwX2V4dDsKQEAgLTMyMyw2ICsyOTEsMTEgQEAKIAlyZXR1cm4gMDsKIH0KIAorLyoqCisgKiBwY2llX3BvcnRfZGV2aWNlX3N1c3BlbmQgLSBzdXNwZW5kIHBvcnQgc2VydmljZXMgYXNzb2NpYXRlZCB3aXRoIGEgUENJZSBwb3J0CisgKiBAZGV2OiBQQ0kgRXhwcmVzcyBwb3J0IHRvIGhhbmRsZQorICogQHN0YXRlOiBSZXByZXNlbnRhdGlvbiBvZiBzeXN0ZW0gcG93ZXIgbWFuYWdlbWVudCB0cmFuc2l0aW9uIGluIHByb2dyZXNzCisgKi8KIGludCBwY2llX3BvcnRfZGV2aWNlX3N1c3BlbmQoc3RydWN0IHBjaV9kZXYgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQogewogCXJldHVybiBkZXZpY2VfZm9yX2VhY2hfY2hpbGQoJmRldi0+ZGV2LCAmc3RhdGUsIHN1c3BlbmRfaXRlcik7CkBAIC0zNDEsNiArMzE0LDEwIEBACiAJcmV0dXJuIDA7CiB9CiAKKy8qKgorICogcGNpZV9wb3J0X2RldmljZV9zdXNwZW5kIC0gcmVzdW1lIHBvcnQgc2VydmljZXMgYXNzb2NpYXRlZCB3aXRoIGEgUENJZSBwb3J0CisgKiBAZGV2OiBQQ0kgRXhwcmVzcyBwb3J0IHRvIGhhbmRsZQorICovCiBpbnQgcGNpZV9wb3J0X2RldmljZV9yZXN1bWUoc3RydWN0IHBjaV9kZXYgKmRldikKIHsKIAlyZXR1cm4gZGV2aWNlX2Zvcl9lYWNoX2NoaWxkKCZkZXYtPmRldiwgTlVMTCwgcmVzdW1lX2l0ZXIpOwpAQCAtMzYzLDYgKzM0MCwxMyBAQAogCXJldHVybiAwOwogfQogCisvKioKKyAqIHBjaWVfcG9ydF9kZXZpY2VfcmVtb3ZlIC0gdW5yZWdpc3RlciBQQ0kgRXhwcmVzcyBwb3J0IHNlcnZpY2UgZGV2aWNlcworICogQGRldjogUENJIEV4cHJlc3MgcG9ydCB0aGUgc2VydmljZSBkZXZpY2VzIHRvIHVucmVnaXN0ZXIgYXJlIGFzc29jaWF0ZWQgd2l0aAorICoKKyAqIFJlbW92ZSBQQ0kgRXhwcmVzcyBwb3J0IHNlcnZpY2UgZGV2aWNlcyBhc3NvY2lhdGVkIHdpdGggZ2l2ZW4gcG9ydCBhbmQKKyAqIGRpc2FibGUgTVNJLVggb3IgTVNJIGZvciB0aGUgcG9ydC4KKyAqLwogdm9pZCBwY2llX3BvcnRfZGV2aWNlX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQogewogCXN0cnVjdCBkZXZpY2UgKmRldmljZTsKQEAgLTM4NiwxNiArMzcwLDgwIEBACiAJCXBjaV9kaXNhYmxlX21zaShkZXYpOwogfQogCi1pbnQgcGNpZV9wb3J0X2J1c19yZWdpc3Rlcih2b2lkKQorLyoqCisgKiBwY2llX3BvcnRfcHJvYmVfc2VydmljZSAtIHByb2JlIGRyaXZlciBmb3IgZ2l2ZW4gUENJIEV4cHJlc3MgcG9ydCBzZXJ2aWNlCisgKiBAZGV2OiBQQ0kgRXhwcmVzcyBwb3J0IHNlcnZpY2UgZGV2aWNlIHRvIHByb2JlIGFnYWluc3QKKyAqCisgKiBJZiBQQ0kgRXhwcmVzcyBwb3J0IHNlcnZpY2UgZHJpdmVyIGlzIHJlZ2lzdGVyZWQgd2l0aAorICogcGNpZV9wb3J0X3NlcnZpY2VfcmVnaXN0ZXIoKSwgdGhpcyBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCBieSB0aGUgZHJpdmVyIGNvcmUKKyAqIHdoZW5ldmVyIG1hdGNoIGlzIGZvdW5kIGJldHdlZW4gdGhlIGRyaXZlciBhbmQgYSBwb3J0IHNlcnZpY2UgZGV2aWNlLgorICovCitzdGF0aWMgaW50IHBjaWVfcG9ydF9wcm9iZV9zZXJ2aWNlKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlyZXR1cm4gYnVzX3JlZ2lzdGVyKCZwY2llX3BvcnRfYnVzX3R5cGUpOworCXN0cnVjdCBwY2llX2RldmljZSAqcGNpZWRldjsKKwlzdHJ1Y3QgcGNpZV9wb3J0X3NlcnZpY2VfZHJpdmVyICpkcml2ZXI7CisJaW50IHN0YXR1czsKKworCWlmICghZGV2IHx8ICFkZXYtPmRyaXZlcikKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlkcml2ZXIgPSB0b19zZXJ2aWNlX2RyaXZlcihkZXYtPmRyaXZlcik7CisJaWYgKCFkcml2ZXIgfHwgIWRyaXZlci0+cHJvYmUpCisJCXJldHVybiAtRU5PREVWOworCisJcGNpZWRldiA9IHRvX3BjaWVfZGV2aWNlKGRldik7CisJc3RhdHVzID0gZHJpdmVyLT5wcm9iZShwY2llZGV2LCBkcml2ZXItPmlkX3RhYmxlKTsKKwlpZiAoIXN0YXR1cykgeworCQlkZXZfcHJpbnRrKEtFUk5fREVCVUcsIGRldiwgInNlcnZpY2UgZHJpdmVyICVzIGxvYWRlZFxuIiwKKwkJCWRyaXZlci0+bmFtZSk7CisJCWdldF9kZXZpY2UoZGV2KTsKKwl9CisJcmV0dXJuIHN0YXR1czsKIH0KIAotdm9pZCBwY2llX3BvcnRfYnVzX3VucmVnaXN0ZXIodm9pZCkKKy8qKgorICogcGNpZV9wb3J0X3JlbW92ZV9zZXJ2aWNlIC0gZGV0YWNoIGRyaXZlciBmcm9tIGdpdmVuIFBDSSBFeHByZXNzIHBvcnQgc2VydmljZQorICogQGRldjogUENJIEV4cHJlc3MgcG9ydCBzZXJ2aWNlIGRldmljZSB0byBoYW5kbGUKKyAqCisgKiBJZiBQQ0kgRXhwcmVzcyBwb3J0IHNlcnZpY2UgZHJpdmVyIGlzIHJlZ2lzdGVyZWQgd2l0aAorICogcGNpZV9wb3J0X3NlcnZpY2VfcmVnaXN0ZXIoKSwgdGhpcyBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCBieSB0aGUgZHJpdmVyIGNvcmUKKyAqIHdoZW4gZGV2aWNlX3VucmVnaXN0ZXIoKSBpcyBjYWxsZWQgZm9yIHRoZSBwb3J0IHNlcnZpY2UgZGV2aWNlIGFzc29jaWF0ZWQKKyAqIHdpdGggdGhlIGRyaXZlci4KKyAqLworc3RhdGljIGludCBwY2llX3BvcnRfcmVtb3ZlX3NlcnZpY2Uoc3RydWN0IGRldmljZSAqZGV2KQogewotCWJ1c191bnJlZ2lzdGVyKCZwY2llX3BvcnRfYnVzX3R5cGUpOworCXN0cnVjdCBwY2llX2RldmljZSAqcGNpZWRldjsKKwlzdHJ1Y3QgcGNpZV9wb3J0X3NlcnZpY2VfZHJpdmVyICpkcml2ZXI7CisKKwlpZiAoIWRldiB8fCAhZGV2LT5kcml2ZXIpCisJCXJldHVybiAwOworCisJcGNpZWRldiA9IHRvX3BjaWVfZGV2aWNlKGRldik7CisJZHJpdmVyID0gdG9fc2VydmljZV9kcml2ZXIoZGV2LT5kcml2ZXIpOworCWlmIChkcml2ZXIgJiYgZHJpdmVyLT5yZW1vdmUpIHsKKwkJZGV2X3ByaW50ayhLRVJOX0RFQlVHLCBkZXYsICJ1bmxvYWRpbmcgc2VydmljZSBkcml2ZXIgJXNcbiIsCisJCQlkcml2ZXItPm5hbWUpOworCQlkcml2ZXItPnJlbW92ZShwY2llZGV2KTsKKwkJcHV0X2RldmljZShkZXYpOworCX0KKwlyZXR1cm4gMDsKIH0KIAorLyoqCisgKiBwY2llX3BvcnRfc2h1dGRvd25fc2VydmljZSAtIHNodXQgZG93biBnaXZlbiBQQ0kgRXhwcmVzcyBwb3J0IHNlcnZpY2UKKyAqIEBkZXY6IFBDSSBFeHByZXNzIHBvcnQgc2VydmljZSBkZXZpY2UgdG8gaGFuZGxlCisgKgorICogSWYgUENJIEV4cHJlc3MgcG9ydCBzZXJ2aWNlIGRyaXZlciBpcyByZWdpc3RlcmVkIHdpdGgKKyAqIHBjaWVfcG9ydF9zZXJ2aWNlX3JlZ2lzdGVyKCksIHRoaXMgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgYnkgdGhlIGRyaXZlciBjb3JlCisgKiB3aGVuIGRldmljZV9zaHV0ZG93bigpIGlzIGNhbGxlZCBmb3IgdGhlIHBvcnQgc2VydmljZSBkZXZpY2UgYXNzb2NpYXRlZAorICogd2l0aCB0aGUgZHJpdmVyLgorICovCitzdGF0aWMgdm9pZCBwY2llX3BvcnRfc2h1dGRvd25fc2VydmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpIHt9CisKKy8qKgorICogcGNpZV9wb3J0X3NlcnZpY2VfcmVnaXN0ZXIgLSByZWdpc3RlciBQQ0kgRXhwcmVzcyBwb3J0IHNlcnZpY2UgZHJpdmVyCisgKiBAbmV3OiBQQ0kgRXhwcmVzcyBwb3J0IHNlcnZpY2UgZHJpdmVyIHRvIHJlZ2lzdGVyCisgKi8KIGludCBwY2llX3BvcnRfc2VydmljZV9yZWdpc3RlcihzdHJ1Y3QgcGNpZV9wb3J0X3NlcnZpY2VfZHJpdmVyICpuZXcpCiB7CiAJbmV3LT5kcml2ZXIubmFtZSA9IChjaGFyICopbmV3LT5uYW1lOwpAQCAtNDAzLDE1ICs0NTEsMTcgQEAKIAluZXctPmRyaXZlci5wcm9iZSA9IHBjaWVfcG9ydF9wcm9iZV9zZXJ2aWNlOwogCW5ldy0+ZHJpdmVyLnJlbW92ZSA9IHBjaWVfcG9ydF9yZW1vdmVfc2VydmljZTsKIAluZXctPmRyaXZlci5zaHV0ZG93biA9IHBjaWVfcG9ydF9zaHV0ZG93bl9zZXJ2aWNlOwotCW5ldy0+ZHJpdmVyLnN1c3BlbmQgPSBwY2llX3BvcnRfc3VzcGVuZF9zZXJ2aWNlOwotCW5ldy0+ZHJpdmVyLnJlc3VtZSA9IHBjaWVfcG9ydF9yZXN1bWVfc2VydmljZTsKIAogCXJldHVybiBkcml2ZXJfcmVnaXN0ZXIoJm5ldy0+ZHJpdmVyKTsKIH0KIAotdm9pZCBwY2llX3BvcnRfc2VydmljZV91bnJlZ2lzdGVyKHN0cnVjdCBwY2llX3BvcnRfc2VydmljZV9kcml2ZXIgKm5ldykKKy8qKgorICogcGNpZV9wb3J0X3NlcnZpY2VfdW5yZWdpc3RlciAtIHVucmVnaXN0ZXIgUENJIEV4cHJlc3MgcG9ydCBzZXJ2aWNlIGRyaXZlcgorICogQGRydjogUENJIEV4cHJlc3MgcG9ydCBzZXJ2aWNlIGRyaXZlciB0byB1bnJlZ2lzdGVyCisgKi8KK3ZvaWQgcGNpZV9wb3J0X3NlcnZpY2VfdW5yZWdpc3RlcihzdHJ1Y3QgcGNpZV9wb3J0X3NlcnZpY2VfZHJpdmVyICpkcnYpCiB7Ci0JZHJpdmVyX3VucmVnaXN0ZXIoJm5ldy0+ZHJpdmVyKTsKKwlkcml2ZXJfdW5yZWdpc3RlcigmZHJ2LT5kcml2ZXIpOwogfQogCiBFWFBPUlRfU1lNQk9MKHBjaWVfcG9ydF9zZXJ2aWNlX3JlZ2lzdGVyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3BjaWUvcG9ydGRydl9wY2kuYyBiL2RyaXZlcnMvcGNpL3BjaWUvcG9ydGRydl9wY2kuYwppbmRleCA1ODQ0MjJkLi45OWE5MTRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9wY2llL3BvcnRkcnZfcGNpLmMKKysrIGIvZHJpdmVycy9wY2kvcGNpZS9wb3J0ZHJ2X3BjaS5jCkBAIC00MSw3ICs0MSw2IEBACiB7CiAJaW50IHJldHZhbDsKIAotCXBjaV9yZXN0b3JlX3N0YXRlKGRldik7CiAJcmV0dmFsID0gcGNpX2VuYWJsZV9kZXZpY2UoZGV2KTsKIAlpZiAocmV0dmFsKQogCQlyZXR1cm4gcmV0dmFsOwpAQCAtNTIsMTEgKzUxLDE4IEBACiAjaWZkZWYgQ09ORklHX1BNCiBzdGF0aWMgaW50IHBjaWVfcG9ydGRydl9zdXNwZW5kKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKIHsKLQlpbnQgcmV0ID0gcGNpZV9wb3J0X2RldmljZV9zdXNwZW5kKGRldiwgc3RhdGUpOworCXJldHVybiBwY2llX3BvcnRfZGV2aWNlX3N1c3BlbmQoZGV2LCBzdGF0ZSk7CiAKLQlpZiAoIXJldCkKLQkJcmV0ID0gcGNpZV9wb3J0ZHJ2X3NhdmVfY29uZmlnKGRldik7Ci0JcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBwY2llX3BvcnRkcnZfc3VzcGVuZF9sYXRlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwlyZXR1cm4gcGNpX3NhdmVfc3RhdGUoZGV2KTsKK30KKworc3RhdGljIGludCBwY2llX3BvcnRkcnZfcmVzdW1lX2Vhcmx5KHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJcmV0dXJuIHBjaV9yZXN0b3JlX3N0YXRlKGRldik7CiB9CiAKIHN0YXRpYyBpbnQgcGNpZV9wb3J0ZHJ2X3Jlc3VtZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQpAQCAtNjYsNiArNzIsOCBAQAogfQogI2Vsc2UKICNkZWZpbmUgcGNpZV9wb3J0ZHJ2X3N1c3BlbmQgTlVMTAorI2RlZmluZSBwY2llX3BvcnRkcnZfc3VzcGVuZF9sYXRlIE5VTEwKKyNkZWZpbmUgcGNpZV9wb3J0ZHJ2X3Jlc3VtZV9lYXJseSBOVUxMCiAjZGVmaW5lIHBjaWVfcG9ydGRydl9yZXN1bWUgTlVMTAogI2VuZGlmCiAKQEAgLTIyMSw2ICsyMjksNyBAQAogCiAJLyogSWYgZmF0YWwsIHJlc3RvcmUgY2ZnIHNwYWNlIGZvciBwb3NzaWJsZSBsaW5rIHJlc2V0IGF0IHVwc3RyZWFtICovCiAJaWYgKGRldi0+ZXJyb3Jfc3RhdGUgPT0gcGNpX2NoYW5uZWxfaW9fZnJvemVuKSB7CisJCXBjaV9yZXN0b3JlX3N0YXRlKGRldik7CiAJCXBjaWVfcG9ydGRydl9yZXN0b3JlX2NvbmZpZyhkZXYpOwogCQlwY2lfZW5hYmxlX3BjaWVfZXJyb3JfcmVwb3J0aW5nKGRldik7CiAJfQpAQCAtMjgzLDYgKzI5Miw4IEBACiAJLnJlbW92ZQkJPSBwY2llX3BvcnRkcnZfcmVtb3ZlLAogCiAJLnN1c3BlbmQJPSBwY2llX3BvcnRkcnZfc3VzcGVuZCwKKwkuc3VzcGVuZF9sYXRlCT0gcGNpZV9wb3J0ZHJ2X3N1c3BlbmRfbGF0ZSwKKwkucmVzdW1lX2Vhcmx5CT0gcGNpZV9wb3J0ZHJ2X3Jlc3VtZV9lYXJseSwKIAkucmVzdW1lCQk9IHBjaWVfcG9ydGRydl9yZXN1bWUsCiAKIAkuZXJyX2hhbmRsZXIgCT0gJnBjaWVfcG9ydGRydl9lcnJfaGFuZGxlciwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3Byb2JlLmMgYi9kcml2ZXJzL3BjaS9wcm9iZS5jCmluZGV4IDViM2Y1OTMuLjMwMzY0NDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3Byb2JlLmMKKysrIGIvZHJpdmVycy9wY2kvcHJvYmUuYwpAQCAtMTM1LDEzICsxMzUsNiBAQAogCXJldHVybiBzaXplOwogfQogCi1lbnVtIHBjaV9iYXJfdHlwZSB7Ci0JcGNpX2Jhcl91bmtub3duLAkvKiBTdGFuZGFyZCBQQ0kgQkFSIHByb2JlICovCi0JcGNpX2Jhcl9pbywJCS8qIEFuIGlvIHBvcnQgQkFSICovCi0JcGNpX2Jhcl9tZW0zMiwJCS8qIEEgMzItYml0IG1lbW9yeSBCQVIgKi8KLQlwY2lfYmFyX21lbTY0LAkJLyogQSA2NC1iaXQgbWVtb3J5IEJBUiAqLwotfTsKLQogc3RhdGljIGlubGluZSBlbnVtIHBjaV9iYXJfdHlwZSBkZWNvZGVfYmFyKHN0cnVjdCByZXNvdXJjZSAqcmVzLCB1MzIgYmFyKQogewogCWlmICgoYmFyICYgUENJX0JBU0VfQUREUkVTU19TUEFDRSkgPT0gUENJX0JBU0VfQUREUkVTU19TUEFDRV9JTykgewpAQCAtMTU2LDExICsxNDksMTYgQEAKIAlyZXR1cm4gcGNpX2Jhcl9tZW0zMjsKIH0KIAotLyoKLSAqIElmIHRoZSB0eXBlIGlzIG5vdCB1bmtub3duLCB3ZSBhc3N1bWUgdGhhdCB0aGUgbG93ZXN0IGJpdCBpcyAnZW5hYmxlJy4KLSAqIFJldHVybnMgMSBpZiB0aGUgQkFSIHdhcyA2NC1iaXQgYW5kIDAgaWYgaXQgd2FzIDMyLWJpdC4KKy8qKgorICogcGNpX3JlYWRfYmFzZSAtIHJlYWQgYSBQQ0kgQkFSCisgKiBAZGV2OiB0aGUgUENJIGRldmljZQorICogQHR5cGU6IHR5cGUgb2YgdGhlIEJBUgorICogQHJlczogcmVzb3VyY2UgYnVmZmVyIHRvIGJlIGZpbGxlZCBpbgorICogQHBvczogQkFSIHBvc2l0aW9uIGluIHRoZSBjb25maWcgc3BhY2UKKyAqCisgKiBSZXR1cm5zIDEgaWYgdGhlIEJBUiBpcyA2NC1iaXQsIG9yIDAgaWYgMzItYml0LgogICovCi1zdGF0aWMgaW50IF9fcGNpX3JlYWRfYmFzZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBlbnVtIHBjaV9iYXJfdHlwZSB0eXBlLAoraW50IF9fcGNpX3JlYWRfYmFzZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBlbnVtIHBjaV9iYXJfdHlwZSB0eXBlLAogCQkJc3RydWN0IHJlc291cmNlICpyZXMsIHVuc2lnbmVkIGludCBwb3MpCiB7CiAJdTMyIGwsIHN6LCBtYXNrOwpAQCAtNDAwLDE5ICszOTgsMTcgQEAKIAlpZiAoIWNoaWxkKQogCQlyZXR1cm4gTlVMTDsKIAotCWNoaWxkLT5zZWxmID0gYnJpZGdlOwogCWNoaWxkLT5wYXJlbnQgPSBwYXJlbnQ7CiAJY2hpbGQtPm9wcyA9IHBhcmVudC0+b3BzOwogCWNoaWxkLT5zeXNkYXRhID0gcGFyZW50LT5zeXNkYXRhOwogCWNoaWxkLT5idXNfZmxhZ3MgPSBwYXJlbnQtPmJ1c19mbGFnczsKLQljaGlsZC0+YnJpZGdlID0gZ2V0X2RldmljZSgmYnJpZGdlLT5kZXYpOwogCiAJLyogaW5pdGlhbGl6ZSBzb21lIHBvcnRpb25zIG9mIHRoZSBidXMgZGV2aWNlLCBidXQgZG9uJ3QgcmVnaXN0ZXIgaXQKIAkgKiBub3cgYXMgdGhlIHBhcmVudCBpcyBub3QgcHJvcGVybHkgc2V0IHVwIHlldC4gIFRoaXMgZGV2aWNlIHdpbGwgZ2V0CiAJICogcmVnaXN0ZXJlZCBsYXRlciBpbiBwY2lfYnVzX2FkZF9kZXZpY2VzKCkKIAkgKi8KIAljaGlsZC0+ZGV2LmNsYXNzID0gJnBjaWJ1c19jbGFzczsKLQlzcHJpbnRmKGNoaWxkLT5kZXYuYnVzX2lkLCAiJTA0eDolMDJ4IiwgcGNpX2RvbWFpbl9ucihjaGlsZCksIGJ1c25yKTsKKwlkZXZfc2V0X25hbWUoJmNoaWxkLT5kZXYsICIlMDR4OiUwMngiLCBwY2lfZG9tYWluX25yKGNoaWxkKSwgYnVzbnIpOwogCiAJLyoKIAkgKiBTZXQgdXAgdGhlIHByaW1hcnksIHNlY29uZGFyeSBhbmQgc3Vib3JkaW5hdGUKQEAgLTQyMiw4ICs0MTgsMTQgQEAKIAljaGlsZC0+cHJpbWFyeSA9IHBhcmVudC0+c2Vjb25kYXJ5OwogCWNoaWxkLT5zdWJvcmRpbmF0ZSA9IDB4ZmY7CiAKKwlpZiAoIWJyaWRnZSkKKwkJcmV0dXJuIGNoaWxkOworCisJY2hpbGQtPnNlbGYgPSBicmlkZ2U7CisJY2hpbGQtPmJyaWRnZSA9IGdldF9kZXZpY2UoJmJyaWRnZS0+ZGV2KTsKKwogCS8qIFNldCB1cCBkZWZhdWx0IHJlc291cmNlIHBvaW50ZXJzIGFuZCBuYW1lcy4uICovCi0JZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBQQ0lfQlJJREdFX1JFU09VUkNFX05VTTsgaSsrKSB7CiAJCWNoaWxkLT5yZXNvdXJjZVtpXSA9ICZicmlkZ2UtPnJlc291cmNlW1BDSV9CUklER0VfUkVTT1VSQ0VTK2ldOwogCQljaGlsZC0+cmVzb3VyY2VbaV0tPm5hbWUgPSBjaGlsZC0+bmFtZTsKIAl9CkBAIC05NTgsOCArOTYwLDEyIEBACiAJLyogTVNJL01TSS1YIGxpc3QgKi8KIAlwY2lfbXNpX2luaXRfcGNpX2RldihkZXYpOwogCisJLyogQnVmZmVycyBmb3Igc2F2aW5nIFBDSWUgYW5kIFBDSS1YIGNhcGFiaWxpdGllcyAqLworCXBjaV9hbGxvY2F0ZV9jYXBfc2F2ZV9idWZmZXJzKGRldik7CisKIAkvKiBQb3dlciBNYW5hZ2VtZW50ICovCiAJcGNpX3BtX2luaXQoZGV2KTsKKwlwbGF0Zm9ybV9wY2lfd2FrZXVwX2luaXQoZGV2KTsKIAogCS8qIFZpdGFsIFByb2R1Y3QgRGF0YSAqLwogCXBjaV92cGRfcGNpMjJfaW5pdChkZXYpOwpAQCAtMTEzMCw3ICsxMTM2LDcgQEAKIAltZW1zZXQoZGV2LCAwLCBzaXplb2YoKmRldikpOwogCWRldi0+cGFyZW50ID0gcGFyZW50OwogCWRldi0+cmVsZWFzZSA9IHBjaV9yZWxlYXNlX2J1c19icmlkZ2VfZGV2OwotCXNwcmludGYoZGV2LT5idXNfaWQsICJwY2klMDR4OiUwMngiLCBwY2lfZG9tYWluX25yKGIpLCBidXMpOworCWRldl9zZXRfbmFtZShkZXYsICJwY2klMDR4OiUwMngiLCBwY2lfZG9tYWluX25yKGIpLCBidXMpOwogCWVycm9yID0gZGV2aWNlX3JlZ2lzdGVyKGRldik7CiAJaWYgKGVycm9yKQogCQlnb3RvIGRldl9yZWdfZXJyOwpAQCAtMTE0MSw3ICsxMTQ3LDcgQEAKIAogCWItPmRldi5jbGFzcyA9ICZwY2lidXNfY2xhc3M7CiAJYi0+ZGV2LnBhcmVudCA9IGItPmJyaWRnZTsKLQlzcHJpbnRmKGItPmRldi5idXNfaWQsICIlMDR4OiUwMngiLCBwY2lfZG9tYWluX25yKGIpLCBidXMpOworCWRldl9zZXRfbmFtZSgmYi0+ZGV2LCAiJTA0eDolMDJ4IiwgcGNpX2RvbWFpbl9ucihiKSwgYnVzKTsKIAllcnJvciA9IGRldmljZV9yZWdpc3RlcigmYi0+ZGV2KTsKIAlpZiAoZXJyb3IpCiAJCWdvdG8gY2xhc3NfZGV2X3JlZ19lcnI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9wcm9jLmMgYi9kcml2ZXJzL3BjaS9wcm9jLmMKaW5kZXggZTEwOThjMy4uNTkzYmI4NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvcHJvYy5jCisrKyBiL2RyaXZlcnMvcGNpL3Byb2MuYwpAQCAtMjUyLDExICsyNTIsMjAgQEAKIAljb25zdCBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmRwID0gUERFKGlub2RlKTsKIAlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gZHAtPmRhdGE7CiAJc3RydWN0IHBjaV9maWxwX3ByaXZhdGUgKmZwcml2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWludCByZXQ7CisJaW50IGksIHJldDsKIAogCWlmICghY2FwYWJsZShDQVBfU1lTX1JBV0lPKSkKIAkJcmV0dXJuIC1FUEVSTTsKIAorCS8qIE1ha2Ugc3VyZSB0aGUgY2FsbGVyIGlzIG1hcHBpbmcgYSByZWFsIHJlc291cmNlIGZvciB0aGlzIGRldmljZSAqLworCWZvciAoaSA9IDA7IGkgPCBQQ0lfUk9NX1JFU09VUkNFOyBpKyspIHsKKwkJaWYgKHBjaV9tbWFwX2ZpdHMoZGV2LCBpLCB2bWEpKQorCQkJYnJlYWs7CisJfQorCisJaWYgKGkgPj0gUENJX1JPTV9SRVNPVVJDRSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKIAlyZXQgPSBwY2lfbW1hcF9wYWdlX3JhbmdlKGRldiwgdm1hLAogCQkJCSAgZnByaXYtPm1tYXBfc3RhdGUsCiAJCQkJICBmcHJpdi0+d3JpdGVfY29tYmluZSk7CkBAIC0zNTIsMTUgKzM2MSwxNiBAQAogCQkJZGV2LT52ZW5kb3IsCiAJCQlkZXYtPmRldmljZSwKIAkJCWRldi0+aXJxKTsKLQkvKiBIZXJlIHNob3VsZCBiZSA3IGFuZCBub3QgUENJX05VTV9SRVNPVVJDRVMgYXMgd2UgbmVlZCB0byBwcmVzZXJ2ZSBjb21wYXRpYmlsaXR5ICovCi0JZm9yIChpPTA7IGk8NzsgaSsrKSB7CisKKwkvKiBvbmx5IHByaW50IHN0YW5kYXJkIGFuZCBST00gcmVzb3VyY2VzIHRvIHByZXNlcnZlIGNvbXBhdGliaWxpdHkgKi8KKwlmb3IgKGkgPSAwOyBpIDw9IFBDSV9ST01fUkVTT1VSQ0U7IGkrKykgewogCQlyZXNvdXJjZV9zaXplX3Qgc3RhcnQsIGVuZDsKIAkJcGNpX3Jlc291cmNlX3RvX3VzZXIoZGV2LCBpLCAmZGV2LT5yZXNvdXJjZVtpXSwgJnN0YXJ0LCAmZW5kKTsKIAkJc2VxX3ByaW50ZihtLCAiXHQlMTZsbHgiLAogCQkJKHVuc2lnbmVkIGxvbmcgbG9uZykoc3RhcnQgfAogCQkJKGRldi0+cmVzb3VyY2VbaV0uZmxhZ3MgJiBQQ0lfUkVHSU9OX0ZMQUdfTUFTSykpKTsKIAl9Ci0JZm9yIChpPTA7IGk8NzsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8PSBQQ0lfUk9NX1JFU09VUkNFOyBpKyspIHsKIAkJcmVzb3VyY2Vfc2l6ZV90IHN0YXJ0LCBlbmQ7CiAJCXBjaV9yZXNvdXJjZV90b191c2VyKGRldiwgaSwgJmRldi0+cmVzb3VyY2VbaV0sICZzdGFydCwgJmVuZCk7CiAJCXNlcV9wcmludGYobSwgIlx0JTE2bGx4IiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3F1aXJrcy5jIGIvZHJpdmVycy9wY2kvcXVpcmtzLmMKaW5kZXggY2UwOTg1Ni4uYmFhZDA5MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvcXVpcmtzLmMKKysrIGIvZHJpdmVycy9wY2kvcXVpcmtzLmMKQEAgLTU2LDcgKzU2LDcgQEAKIAl3aGlsZSAoKGQgPSBwY2lfZ2V0X2RldmljZShQQ0lfVkVORE9SX0lEX0lOVEVMLCBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyMzcxU0JfMCwgZCkpKSB7CiAJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGQsIDB4ODIsICZkbGMpOwogCQlpZiAoIShkbGMgJiAxPDwxKSkgewotCQkJZGV2X2VycigmZC0+ZGV2LCAiUElJWDM6IEVuYWJsaW5nIFBhc3NpdmUgUmVsZWFzZVxuIik7CisJCQlkZXZfaW5mbygmZC0+ZGV2LCAiUElJWDM6IEVuYWJsaW5nIFBhc3NpdmUgUmVsZWFzZVxuIik7CiAJCQlkbGMgfD0gMTw8MTsKIAkJCXBjaV93cml0ZV9jb25maWdfYnl0ZShkLCAweDgyLCBkbGMpOwogCQl9CkBAIC00NDksNyArNDQ5LDcgQEAKIERFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUihQQ0lfVkVORE9SX0lEX0lOVEVMLCAgICBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODAxRUJfMCwJCXF1aXJrX2ljaDRfbHBjX2FjcGkpOwogREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKFBDSV9WRU5ET1JfSURfSU5URUwsICAgIFBDSV9ERVZJQ0VfSURfSU5URUxfRVNCXzEsCQlxdWlya19pY2g0X2xwY19hY3BpKTsKIAotc3RhdGljIHZvaWQgX19kZXZpbml0IHF1aXJrX2ljaDZfbHBjX2FjcGkoc3RydWN0IHBjaV9kZXYgKmRldikKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBpY2g2X2xwY19hY3BpX2dwaW8oc3RydWN0IHBjaV9kZXYgKmRldikKIHsKIAl1MzIgcmVnaW9uOwogCkBAIC00NTksMjAgKzQ1OSw5NSBAQAogCXBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXYsIDB4NDgsICZyZWdpb24pOwogCXF1aXJrX2lvX3JlZ2lvbihkZXYsIHJlZ2lvbiwgNjQsIFBDSV9CUklER0VfUkVTT1VSQ0VTKzEsICJJQ0g2IEdQSU8iKTsKIH0KLURFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUihQQ0lfVkVORE9SX0lEX0lOVEVMLAlQQ0lfREVWSUNFX0lEX0lOVEVMX0lDSDZfMCwgcXVpcmtfaWNoNl9scGNfYWNwaSk7Ci1ERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoUENJX1ZFTkRPUl9JRF9JTlRFTCwJUENJX0RFVklDRV9JRF9JTlRFTF9JQ0g2XzEsIHF1aXJrX2ljaDZfbHBjX2FjcGkpOwotREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKFBDSV9WRU5ET1JfSURfSU5URUwsCVBDSV9ERVZJQ0VfSURfSU5URUxfSUNIN18wLCBxdWlya19pY2g2X2xwY19hY3BpKTsKLURFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUihQQ0lfVkVORE9SX0lEX0lOVEVMLAlQQ0lfREVWSUNFX0lEX0lOVEVMX0lDSDdfMSwgcXVpcmtfaWNoNl9scGNfYWNwaSk7Ci1ERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoUENJX1ZFTkRPUl9JRF9JTlRFTCwJUENJX0RFVklDRV9JRF9JTlRFTF9JQ0g3XzMxLCBxdWlya19pY2g2X2xwY19hY3BpKTsKLURFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUihQQ0lfVkVORE9SX0lEX0lOVEVMLAlQQ0lfREVWSUNFX0lEX0lOVEVMX0lDSDhfMCwgcXVpcmtfaWNoNl9scGNfYWNwaSk7Ci1ERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoUENJX1ZFTkRPUl9JRF9JTlRFTCwJUENJX0RFVklDRV9JRF9JTlRFTF9JQ0g4XzIsIHF1aXJrX2ljaDZfbHBjX2FjcGkpOwotREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKFBDSV9WRU5ET1JfSURfSU5URUwsCVBDSV9ERVZJQ0VfSURfSU5URUxfSUNIOF8zLCBxdWlya19pY2g2X2xwY19hY3BpKTsKLURFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUihQQ0lfVkVORE9SX0lEX0lOVEVMLAlQQ0lfREVWSUNFX0lEX0lOVEVMX0lDSDhfMSwgcXVpcmtfaWNoNl9scGNfYWNwaSk7Ci1ERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoUENJX1ZFTkRPUl9JRF9JTlRFTCwJUENJX0RFVklDRV9JRF9JTlRFTF9JQ0g4XzQsIHF1aXJrX2ljaDZfbHBjX2FjcGkpOwotREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKFBDSV9WRU5ET1JfSURfSU5URUwsCVBDSV9ERVZJQ0VfSURfSU5URUxfSUNIOV8yLCBxdWlya19pY2g2X2xwY19hY3BpKTsKLURFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUihQQ0lfVkVORE9SX0lEX0lOVEVMLAlQQ0lfREVWSUNFX0lEX0lOVEVMX0lDSDlfNCwgcXVpcmtfaWNoNl9scGNfYWNwaSk7Ci1ERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoUENJX1ZFTkRPUl9JRF9JTlRFTCwJUENJX0RFVklDRV9JRF9JTlRFTF9JQ0g5XzcsIHF1aXJrX2ljaDZfbHBjX2FjcGkpOwotREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKFBDSV9WRU5ET1JfSURfSU5URUwsCVBDSV9ERVZJQ0VfSURfSU5URUxfSUNIOV84LCBxdWlya19pY2g2X2xwY19hY3BpKTsKKworc3RhdGljIHZvaWQgX19kZXZpbml0IGljaDZfbHBjX2dlbmVyaWNfZGVjb2RlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHVuc2lnbmVkIHJlZywgY29uc3QgY2hhciAqbmFtZSwgaW50IGR5bnNpemUpCit7CisJdTMyIHZhbDsKKwl1MzIgc2l6ZSwgYmFzZTsKKworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXYsIHJlZywgJnZhbCk7CisKKwkvKiBFbmFibGVkPyAqLworCWlmICghKHZhbCAmIDEpKQorCQlyZXR1cm47CisJYmFzZSA9IHZhbCAmIDB4ZmZmYzsKKwlpZiAoZHluc2l6ZSkgeworCQkvKgorCQkgKiBUaGlzIGlzIG5vdCBjb3JyZWN0LiBJdCBpcyAxNiwgMzIgb3IgNjQgYnl0ZXMgZGVwZW5kaW5nIG9uCisJCSAqIHJlZ2lzdGVyIEQzMTpGMDpBRGggYml0cyA1OjQuCisJCSAqCisJCSAqIEJ1dCB0aGlzIGdldHMgdXMgYXQgbGVhc3QgX3BhcnRfIG9mIGl0LgorCQkgKi8KKwkJc2l6ZSA9IDE2OworCX0gZWxzZSB7CisJCXNpemUgPSAxMjg7CisJfQorCWJhc2UgJj0gfihzaXplLTEpOworCisJLyogSnVzdCBwcmludCBpdCBvdXQgZm9yIG5vdy4gV2Ugc2hvdWxkIHJlc2VydmUgaXQgYWZ0ZXIgbW9yZSBkZWJ1Z2dpbmcgKi8KKwlkZXZfaW5mbygmZGV2LT5kZXYsICIlcyBQSU8gYXQgJTA0eC0lMDR4XG4iLCBuYW1lLCBiYXNlLCBiYXNlK3NpemUtMSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBxdWlya19pY2g2X2xwYyhzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCS8qIFNoYXJlZCBBQ1BJL0dQSU8gZGVjb2RlIHdpdGggYWxsIElDSDYrICovCisJaWNoNl9scGNfYWNwaV9ncGlvKGRldik7CisKKwkvKiBJQ0g2LXNwZWNpZmljIGdlbmVyaWMgSU8gZGVjb2RlICovCisJaWNoNl9scGNfZ2VuZXJpY19kZWNvZGUoZGV2LCAweDg0LCAiTFBDIEdlbmVyaWMgSU8gZGVjb2RlIDEiLCAwKTsKKwlpY2g2X2xwY19nZW5lcmljX2RlY29kZShkZXYsIDB4ODgsICJMUEMgR2VuZXJpYyBJTyBkZWNvZGUgMiIsIDEpOworfQorREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKFBDSV9WRU5ET1JfSURfSU5URUwsCVBDSV9ERVZJQ0VfSURfSU5URUxfSUNINl8wLCBxdWlya19pY2g2X2xwYyk7CitERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoUENJX1ZFTkRPUl9JRF9JTlRFTCwJUENJX0RFVklDRV9JRF9JTlRFTF9JQ0g2XzEsIHF1aXJrX2ljaDZfbHBjKTsKKworc3RhdGljIHZvaWQgX19kZXZpbml0IGljaDdfbHBjX2dlbmVyaWNfZGVjb2RlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHVuc2lnbmVkIHJlZywgY29uc3QgY2hhciAqbmFtZSkKK3sKKwl1MzIgdmFsOworCXUzMiBtYXNrLCBiYXNlOworCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgcmVnLCAmdmFsKTsKKworCS8qIEVuYWJsZWQ/ICovCisJaWYgKCEodmFsICYgMSkpCisJCXJldHVybjsKKworCS8qCisJICogSU8gYmFzZSBpbiBiaXRzIDE1OjIsIG1hc2sgaW4gYml0cyAyMzoxOCwgYm90aAorCSAqIGFyZSBkd29yZC1iYXNlZAorCSAqLworCWJhc2UgPSB2YWwgJiAweGZmZmM7CisJbWFzayA9ICh2YWwgPj4gMTYpICYgMHhmYzsKKwltYXNrIHw9IDM7CisKKwkvKiBKdXN0IHByaW50IGl0IG91dCBmb3Igbm93LiBXZSBzaG91bGQgcmVzZXJ2ZSBpdCBhZnRlciBtb3JlIGRlYnVnZ2luZyAqLworCWRldl9pbmZvKCZkZXYtPmRldiwgIiVzIFBJTyBhdCAlMDR4IChtYXNrICUwNHgpXG4iLCBuYW1lLCBiYXNlLCBtYXNrKTsKK30KKworLyogSUNINy0xMCBoYXMgdGhlIHNhbWUgY29tbW9uIExQQyBnZW5lcmljIElPIGRlY29kZSByZWdpc3RlcnMgKi8KK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBxdWlya19pY2g3X2xwYyhzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCS8qIFdlIHNoYXJlIHRoZSBjb21tb24gQUNQSS9EUElPIGRlY29kZSB3aXRoIElDSDYgKi8KKwlpY2g2X2xwY19hY3BpX2dwaW8oZGV2KTsKKworCS8qIEFuZCBoYXZlIDQgSUNINysgZ2VuZXJpYyBkZWNvZGVzICovCisJaWNoN19scGNfZ2VuZXJpY19kZWNvZGUoZGV2LCAweDg0LCAiSUNINyBMUEMgR2VuZXJpYyBJTyBkZWNvZGUgMSIpOworCWljaDdfbHBjX2dlbmVyaWNfZGVjb2RlKGRldiwgMHg4OCwgIklDSDcgTFBDIEdlbmVyaWMgSU8gZGVjb2RlIDIiKTsKKwlpY2g3X2xwY19nZW5lcmljX2RlY29kZShkZXYsIDB4OGMsICJJQ0g3IExQQyBHZW5lcmljIElPIGRlY29kZSAzIik7CisJaWNoN19scGNfZ2VuZXJpY19kZWNvZGUoZGV2LCAweDkwLCAiSUNINyBMUEMgR2VuZXJpYyBJTyBkZWNvZGUgNCIpOworfQorREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKFBDSV9WRU5ET1JfSURfSU5URUwsCVBDSV9ERVZJQ0VfSURfSU5URUxfSUNIN18wLCBxdWlya19pY2g3X2xwYyk7CitERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoUENJX1ZFTkRPUl9JRF9JTlRFTCwJUENJX0RFVklDRV9JRF9JTlRFTF9JQ0g3XzEsIHF1aXJrX2ljaDdfbHBjKTsKK0RFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUihQQ0lfVkVORE9SX0lEX0lOVEVMLAlQQ0lfREVWSUNFX0lEX0lOVEVMX0lDSDdfMzEsIHF1aXJrX2ljaDdfbHBjKTsKK0RFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUihQQ0lfVkVORE9SX0lEX0lOVEVMLAlQQ0lfREVWSUNFX0lEX0lOVEVMX0lDSDhfMCwgcXVpcmtfaWNoN19scGMpOworREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKFBDSV9WRU5ET1JfSURfSU5URUwsCVBDSV9ERVZJQ0VfSURfSU5URUxfSUNIOF8yLCBxdWlya19pY2g3X2xwYyk7CitERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoUENJX1ZFTkRPUl9JRF9JTlRFTCwJUENJX0RFVklDRV9JRF9JTlRFTF9JQ0g4XzMsIHF1aXJrX2ljaDdfbHBjKTsKK0RFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUihQQ0lfVkVORE9SX0lEX0lOVEVMLAlQQ0lfREVWSUNFX0lEX0lOVEVMX0lDSDhfMSwgcXVpcmtfaWNoN19scGMpOworREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKFBDSV9WRU5ET1JfSURfSU5URUwsCVBDSV9ERVZJQ0VfSURfSU5URUxfSUNIOF80LCBxdWlya19pY2g3X2xwYyk7CitERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoUENJX1ZFTkRPUl9JRF9JTlRFTCwJUENJX0RFVklDRV9JRF9JTlRFTF9JQ0g5XzIsIHF1aXJrX2ljaDdfbHBjKTsKK0RFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUihQQ0lfVkVORE9SX0lEX0lOVEVMLAlQQ0lfREVWSUNFX0lEX0lOVEVMX0lDSDlfNCwgcXVpcmtfaWNoN19scGMpOworREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKFBDSV9WRU5ET1JfSURfSU5URUwsCVBDSV9ERVZJQ0VfSURfSU5URUxfSUNIOV83LCBxdWlya19pY2g3X2xwYyk7CitERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoUENJX1ZFTkRPUl9JRF9JTlRFTCwJUENJX0RFVklDRV9JRF9JTlRFTF9JQ0g5XzgsIHF1aXJrX2ljaDdfbHBjKTsKK0RFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUihQQ0lfVkVORE9SX0lEX0lOVEVMLCAgIFBDSV9ERVZJQ0VfSURfSU5URUxfSUNIMTBfMSwgcXVpcmtfaWNoN19scGMpOwogCiAvKgogICogVklBIEFDUEk6IE9uZSBJTyByZWdpb24gcG9pbnRlZCB0byBieSBsb25nd29yZCBhdApAQCAtMjA3NCwxMSArMjE0OSwxMiBAQAogCiAjZW5kaWYgLyogQ09ORklHX1BDSV9NU0kgKi8KIAotc3RhdGljIHZvaWQgcGNpX2RvX2ZpeHVwcyhzdHJ1Y3QgcGNpX2RldiAqZGV2LCBzdHJ1Y3QgcGNpX2ZpeHVwICpmLCBzdHJ1Y3QgcGNpX2ZpeHVwICplbmQpCitzdGF0aWMgdm9pZCBwY2lfZG9fZml4dXBzKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHN0cnVjdCBwY2lfZml4dXAgKmYsCisJCQkgIHN0cnVjdCBwY2lfZml4dXAgKmVuZCkKIHsKIAl3aGlsZSAoZiA8IGVuZCkgewogCQlpZiAoKGYtPnZlbmRvciA9PSBkZXYtPnZlbmRvciB8fCBmLT52ZW5kb3IgPT0gKHUxNikgUENJX0FOWV9JRCkgJiYKLSAJCSAgICAoZi0+ZGV2aWNlID09IGRldi0+ZGV2aWNlIHx8IGYtPmRldmljZSA9PSAodTE2KSBQQ0lfQU5ZX0lEKSkgeworCQkgICAgKGYtPmRldmljZSA9PSBkZXYtPmRldmljZSB8fCBmLT5kZXZpY2UgPT0gKHUxNikgUENJX0FOWV9JRCkpIHsKIAkJCWRldl9kYmcoJmRldi0+ZGV2LCAiY2FsbGluZyAlcEZcbiIsIGYtPmhvb2spOwogCQkJZi0+aG9vayhkZXYpOwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9zZXR1cC1idXMuYyBiL2RyaXZlcnMvcGNpL3NldHVwLWJ1cy5jCmluZGV4IGVhOTc5ZjIuLjcwNDYwODkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3NldHVwLWJ1cy5jCisrKyBiL2RyaXZlcnMvcGNpL3NldHVwLWJ1cy5jCkBAIC01MzYsOSArNTM2LDggQEAKICAgICAgICAgICAgICAgICBpZiAoIXJlcykKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogCi0JCXByaW50ayhLRVJOX0lORk8gImJ1czogJTAyeCBpbmRleCAleCAlczogJXBSXG4iLAotCQkgICAgICAgYnVzLT5udW1iZXIsIGksCi0JCSAgICAgICAocmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfSU8pID8gImlvIHBvcnQiIDogIm1taW8iLCByZXMpOworCQlkZXZfcHJpbnRrKEtFUk5fREVCVUcsICZidXMtPmRldiwgInJlc291cmNlICVkICVzICVwUlxuIiwgaSwKKwkJCSAgIChyZXMtPmZsYWdzICYgSU9SRVNPVVJDRV9JTykgPyAiaW86ICIgOiAibWVtOiIsIHJlcyk7CiAgICAgICAgIH0KIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvc2V0dXAtcmVzLmMgYi9kcml2ZXJzL3BjaS9zZXR1cC1yZXMuYwppbmRleCAyZGJkOTZjLi4zMmU4ZDg4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9zZXR1cC1yZXMuYworKysgYi9kcml2ZXJzL3BjaS9zZXR1cC1yZXMuYwpAQCAtMjYsMTEgKzI2LDEzIEBACiAjaW5jbHVkZSAicGNpLmgiCiAKIAotdm9pZCBwY2lfdXBkYXRlX3Jlc291cmNlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHN0cnVjdCByZXNvdXJjZSAqcmVzLCBpbnQgcmVzbm8pCit2b2lkIHBjaV91cGRhdGVfcmVzb3VyY2Uoc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IHJlc25vKQogewogCXN0cnVjdCBwY2lfYnVzX3JlZ2lvbiByZWdpb247CiAJdTMyIG5ldywgY2hlY2ssIG1hc2s7CiAJaW50IHJlZzsKKwllbnVtIHBjaV9iYXJfdHlwZSB0eXBlOworCXN0cnVjdCByZXNvdXJjZSAqcmVzID0gZGV2LT5yZXNvdXJjZSArIHJlc25vOwogCiAJLyoKIAkgKiBJZ25vcmUgcmVzb3VyY2VzIGZvciB1bmltcGxlbWVudGVkIEJBUnMgYW5kIHVudXNlZCByZXNvdXJjZSBzbG90cwpAQCAtNjEsMTcgKzYzLDEzIEBACiAJZWxzZQogCQltYXNrID0gKHUzMilQQ0lfQkFTRV9BRERSRVNTX01FTV9NQVNLOwogCi0JaWYgKHJlc25vIDwgNikgewotCQlyZWcgPSBQQ0lfQkFTRV9BRERSRVNTXzAgKyA0ICogcmVzbm87Ci0JfSBlbHNlIGlmIChyZXNubyA9PSBQQ0lfUk9NX1JFU09VUkNFKSB7CisJcmVnID0gcGNpX3Jlc291cmNlX2JhcihkZXYsIHJlc25vLCAmdHlwZSk7CisJaWYgKCFyZWcpCisJCXJldHVybjsKKwlpZiAodHlwZSAhPSBwY2lfYmFyX3Vua25vd24pIHsKIAkJaWYgKCEocmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfUk9NX0VOQUJMRSkpCiAJCQlyZXR1cm47CiAJCW5ldyB8PSBQQ0lfUk9NX0FERFJFU1NfRU5BQkxFOwotCQlyZWcgPSBkZXYtPnJvbV9iYXNlX3JlZzsKLQl9IGVsc2UgewotCQkvKiBIbW0sIG5vbi1zdGFuZGFyZCByZXNvdXJjZS4gKi8KLQkKLQkJcmV0dXJuOwkJLyoga2lsbCB1bmluaXRpYWxpc2VkIHZhciB3YXJuaW5nICovCiAJfQogCiAJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZXYsIHJlZywgbmV3KTsKQEAgLTEzNCw3ICsxMzIsNyBAQAogCiAJYWxpZ24gPSByZXNvdXJjZV9hbGlnbm1lbnQocmVzKTsKIAlpZiAoIWFsaWduKSB7Ci0JCWRldl9lcnIoJmRldi0+ZGV2LCAiQkFSICVkOiBjYW4ndCBhbGxvY2F0ZSByZXNvdXJjZSAoYm9ndXMgIgorCQlkZXZfaW5mbygmZGV2LT5kZXYsICJCQVIgJWQ6IGNhbid0IGFsbG9jYXRlIHJlc291cmNlIChib2d1cyAiCiAJCQkiYWxpZ25tZW50KSAlcFIgZmxhZ3MgJSNseFxuIiwKIAkJCXJlc25vLCByZXMsIHJlcy0+ZmxhZ3MpOwogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTE1NywxMiArMTU1LDEyIEBACiAJfQogCiAJaWYgKHJldCkgewotCQlkZXZfZXJyKCZkZXYtPmRldiwgIkJBUiAlZDogY2FuJ3QgYWxsb2NhdGUgJXMgcmVzb3VyY2UgJXBSXG4iLAorCQlkZXZfaW5mbygmZGV2LT5kZXYsICJCQVIgJWQ6IGNhbid0IGFsbG9jYXRlICVzIHJlc291cmNlICVwUlxuIiwKIAkJCXJlc25vLCByZXMtPmZsYWdzICYgSU9SRVNPVVJDRV9JTyA/ICJJL08iIDogIm1lbSIsIHJlcyk7CiAJfSBlbHNlIHsKIAkJcmVzLT5mbGFncyAmPSB+SU9SRVNPVVJDRV9TVEFSVEFMSUdOOwogCQlpZiAocmVzbm8gPCBQQ0lfQlJJREdFX1JFU09VUkNFUykKLQkJCXBjaV91cGRhdGVfcmVzb3VyY2UoZGV2LCByZXMsIHJlc25vKTsKKwkJCXBjaV91cGRhdGVfcmVzb3VyY2UoZGV2LCByZXNubyk7CiAJfQogCiAJcmV0dXJuIHJldDsKQEAgLTE5Nyw3ICsxOTUsNyBAQAogCQlkZXZfZXJyKCZkZXYtPmRldiwgIkJBUiAlZDogY2FuJ3QgYWxsb2NhdGUgJXMgcmVzb3VyY2UgJXBSXG4iLAogCQkJcmVzbm8sIHJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX0lPID8gIkkvTyIgOiAibWVtIiwgcmVzKTsKIAl9IGVsc2UgaWYgKHJlc25vIDwgUENJX0JSSURHRV9SRVNPVVJDRVMpIHsKLQkJcGNpX3VwZGF0ZV9yZXNvdXJjZShkZXYsIHJlcywgcmVzbm8pOworCQlwY2lfdXBkYXRlX3Jlc291cmNlKGRldiwgcmVzbm8pOwogCX0KIAogCXJldHVybiByZXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BucC9jYXJkLmMgYi9kcml2ZXJzL3BucC9jYXJkLmMKaW5kZXggZTc1YjA2MC4uZWZlYTEyOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbnAvY2FyZC5jCisrKyBiL2RyaXZlcnMvcG5wL2NhcmQuYwpAQCAtMTY1LDggKzE2NSw3IEBACiAJY2FyZC0+bnVtYmVyID0gaWQ7CiAKIAljYXJkLT5kZXYucGFyZW50ID0gJmNhcmQtPnByb3RvY29sLT5kZXY7Ci0Jc3ByaW50ZihjYXJkLT5kZXYuYnVzX2lkLCAiJTAyeDolMDJ4IiwgY2FyZC0+cHJvdG9jb2wtPm51bWJlciwKLQkJY2FyZC0+bnVtYmVyKTsKKwlkZXZfc2V0X25hbWUoJmNhcmQtPmRldiwgIiUwMng6JTAyeCIsIGNhcmQtPnByb3RvY29sLT5udW1iZXIsIGNhcmQtPm51bWJlcik7CiAKIAljYXJkLT5kZXYuY29oZXJlbnRfZG1hX21hc2sgPSBETUFfMjRCSVRfTUFTSzsKIAljYXJkLT5kZXYuZG1hX21hc2sgPSAmY2FyZC0+ZGV2LmNvaGVyZW50X2RtYV9tYXNrOwpAQCAtMjk1LDggKzI5NCw4IEBACiB7CiAJZGV2LT5kZXYucGFyZW50ID0gJmNhcmQtPmRldjsKIAlkZXYtPmNhcmRfbGluayA9IE5VTEw7Ci0Jc25wcmludGYoZGV2LT5kZXYuYnVzX2lkLCBCVVNfSURfU0laRSwgIiUwMng6JTAyeC4lMDJ4IiwKLQkJIGRldi0+cHJvdG9jb2wtPm51bWJlciwgY2FyZC0+bnVtYmVyLCBkZXYtPm51bWJlcik7CisJZGV2X3NldF9uYW1lKCZkZXYtPmRldiwgIiUwMng6JTAyeC4lMDJ4IiwKKwkJICAgICBkZXYtPnByb3RvY29sLT5udW1iZXIsIGNhcmQtPm51bWJlciwgZGV2LT5udW1iZXIpOwogCXNwaW5fbG9jaygmcG5wX2xvY2spOwogCWRldi0+Y2FyZCA9IGNhcmQ7CiAJbGlzdF9hZGRfdGFpbCgmZGV2LT5jYXJkX2xpc3QsICZjYXJkLT5kZXZpY2VzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG5wL2NvcmUuYyBiL2RyaXZlcnMvcG5wL2NvcmUuYwppbmRleCAxNmMwMWM2Li4xNDgxNGYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BucC9jb3JlLmMKKysrIGIvZHJpdmVycy9wbnAvY29yZS5jCkBAIC03MCw3ICs3MCw3IEBACiAJc3Bpbl91bmxvY2soJnBucF9sb2NrKTsKIAogCXByb3RvY29sLT5udW1iZXIgPSBub2RlbnVtOwotCXNwcmludGYocHJvdG9jb2wtPmRldi5idXNfaWQsICJwbnAlZCIsIG5vZGVudW0pOworCWRldl9zZXRfbmFtZSgmcHJvdG9jb2wtPmRldiwgInBucCVkIiwgbm9kZW51bSk7CiAJcmV0dXJuIGRldmljZV9yZWdpc3RlcigmcHJvdG9jb2wtPmRldik7CiB9CiAKQEAgLTE0NSw4ICsxNDUsNyBAQAogCWRldi0+ZGV2LmNvaGVyZW50X2RtYV9tYXNrID0gZGV2LT5kbWFfbWFzazsKIAlkZXYtPmRldi5yZWxlYXNlID0gJnBucF9yZWxlYXNlX2RldmljZTsKIAotCXNwcmludGYoZGV2LT5kZXYuYnVzX2lkLCAiJTAyeDolMDJ4IiwgZGV2LT5wcm90b2NvbC0+bnVtYmVyLAotCQlkZXYtPm51bWJlcik7CisJZGV2X3NldF9uYW1lKCZkZXYtPmRldiwgIiUwMng6JTAyeCIsIGRldi0+cHJvdG9jb2wtPm51bWJlciwgZGV2LT5udW1iZXIpOwogCiAJZGV2X2lkID0gcG5wX2FkZF9pZChkZXYsIHBucGlkKTsKIAlpZiAoIWRldl9pZCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbnAvc3lzdGVtLmMgYi9kcml2ZXJzL3BucC9zeXN0ZW0uYwppbmRleCA3NjRmM2EzLi41OWI5MDkyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BucC9zeXN0ZW0uYworKysgYi9kcml2ZXJzL3BucC9zeXN0ZW0uYwpAQCAtMjYsNyArMjYsNyBAQAogCQkJICByZXNvdXJjZV9zaXplX3QgZW5kLCBpbnQgcG9ydCkKIHsKIAljaGFyICpyZWdpb25pZDsKLQljb25zdCBjaGFyICpwbnBpZCA9IGRldi0+ZGV2LmJ1c19pZDsKKwljb25zdCBjaGFyICpwbnBpZCA9IGRldl9uYW1lKCZkZXYtPmRldik7CiAJc3RydWN0IHJlc291cmNlICpyZXM7CiAKIAlyZWdpb25pZCA9IGttYWxsb2MoMTYsIEdGUF9LRVJORUwpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlci9LY29uZmlnIGIvZHJpdmVycy9wb3dlci9LY29uZmlnCmluZGV4IDhlMGMyYjQuLjY2ODQ3MjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcG93ZXIvS2NvbmZpZworKysgYi9kcml2ZXJzL3Bvd2VyL0tjb25maWcKQEAgLTI5LDYgKzI5LDEzIEBACiAJICBTYXkgWSBoZXJlIHRvIGVuYWJsZSBzdXBwb3J0IEFQTSBzdGF0dXMgZW11bGF0aW9uIHVzaW5nCiAJICBiYXR0ZXJ5IGNsYXNzIGRldmljZXMuCiAKK2NvbmZpZyBXTTgzNTBfUE9XRVIKKyAgICAgICAgdHJpc3RhdGUgIldNODM1MCBQTVUgc3VwcG9ydCIKKyAgICAgICAgZGVwZW5kcyBvbiBNRkRfV004MzUwCisgICAgICAgIGhlbHAKKyAgICAgICAgICBTYXkgWSBoZXJlIHRvIGVuYWJsZSBzdXBwb3J0IGZvciB0aGUgcG93ZXIgbWFuYWdlbWVudCB1bml0CisJICBwcm92aWRlZCBieSB0aGUgV29sZnNvbiBNaWNyb2VsZWN0cm9uaWNzIFdNODM1MCBQTUlDLgorCiBjb25maWcgQkFUVEVSWV9EUzI3NjAKIAl0cmlzdGF0ZSAiRFMyNzYwIGJhdHRlcnkgZHJpdmVyIChIUCBpUEFRICYgb3RoZXJzKSIKIAlzZWxlY3QgVzEKQEAgLTY4LDQgKzc1LDExIEBACiAJaGVscAogCSAgU2F5IFkgaGVyZSB0byBlbmFibGUgc3VwcG9ydCBmb3IgYmF0dGVyaWVzIHdpdGggQlEyNzIwMChJMkMpIGNoaXAuCiAKK2NvbmZpZyBCQVRURVJZX0RBOTAzMAorCXRyaXN0YXRlICJEQTkwMzAgYmF0dGVyeSBkcml2ZXIiCisJZGVwZW5kcyBvbiBQTUlDX0RBOTAzWAorCWhlbHAKKwkgIFNheSBZIGhlcmUgdG8gZW5hYmxlIHN1cHBvcnQgZm9yIGJhdHRlcmllcyBjaGFyZ2VyIGludGVncmF0ZWQgaW50bworCSAgREE5MDMwIFBNSUMuCisKIGVuZGlmICMgUE9XRVJfU1VQUExZCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL01ha2VmaWxlIGIvZHJpdmVycy9wb3dlci9NYWtlZmlsZQppbmRleCBlOGYxZWNlLi5lZWJiMTU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Bvd2VyL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvcG93ZXIvTWFrZWZpbGUKQEAgLTE2LDYgKzE2LDcgQEAKIAogb2JqLSQoQ09ORklHX1BEQV9QT1dFUikJCSs9IHBkYV9wb3dlci5vCiBvYmotJChDT05GSUdfQVBNX1BPV0VSKQkJKz0gYXBtX3Bvd2VyLm8KK29iai0kKENPTkZJR19XTTgzNTBfUE9XRVIpCSs9IHdtODM1MF9wb3dlci5vCiAKIG9iai0kKENPTkZJR19CQVRURVJZX0RTMjc2MCkJKz0gZHMyNzYwX2JhdHRlcnkubwogb2JqLSQoQ09ORklHX0JBVFRFUllfUE1VKQkrPSBwbXVfYmF0dGVyeS5vCkBAIC0yMywzICsyNCw0IEBACiBvYmotJChDT05GSUdfQkFUVEVSWV9UT1NBKQkrPSB0b3NhX2JhdHRlcnkubwogb2JqLSQoQ09ORklHX0JBVFRFUllfV005N1hYKQkrPSB3bTk3eHhfYmF0dGVyeS5vCiBvYmotJChDT05GSUdfQkFUVEVSWV9CUTI3eDAwKQkrPSBicTI3eDAwX2JhdHRlcnkubworb2JqLSQoQ09ORklHX0JBVFRFUllfREE5MDMwKQkrPSBkYTkwMzBfYmF0dGVyeS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL2RhOTAzMF9iYXR0ZXJ5LmMgYi9kcml2ZXJzL3Bvd2VyL2RhOTAzMF9iYXR0ZXJ5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTY2MmJiMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvcG93ZXIvZGE5MDMwX2JhdHRlcnkuYwpAQCAtMCwwICsxLDYwMCBAQAorLyoKKyAqIEJhdHRlcnkgY2hhcmdlciBkcml2ZXIgZm9yIERpYWxvZyBTZW1pY29uZHVjdG9yIERBOTAzMAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBDb21wdWxhYiwgTHRkLgorICogCU1pa2UgUmFwb3BvcnQgPG1pa2VAY29tcHVsYWIuY28uaWw+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcG93ZXJfc3VwcGx5Lmg+CisjaW5jbHVkZSA8bGludXgvbWZkL2RhOTAzeC5oPgorCisjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisKKyNkZWZpbmUgREE5MDMwX1NUQVRVU19DSERFVAkoMSA8PCAzKQorCisjZGVmaW5lIERBOTAzMF9GQVVMVF9MT0cJCTB4MGEKKyNkZWZpbmUgREE5MDMwX0ZBVUxUX0xPR19PVkVSX1RFTVAJKDEgPDwgNykKKyNkZWZpbmUgREE5MDMwX0ZBVUxUX0xPR19WQkFUX09WRVIJKDEgPDwgNCkKKworI2RlZmluZSBEQTkwMzBfQ0hBUkdFX0NPTlRST0wJCTB4MjgKKyNkZWZpbmUgREE5MDMwX0NIUkdfQ0hBUkdFUl9FTkFCTEUJKDEgPDwgNykKKworI2RlZmluZSBEQTkwMzBfQURDX01BTl9DT05UUk9MCQkweDMwCisjZGVmaW5lIERBOTAzMF9BRENfVEJBVFJFRl9FTkFCTEUJKDEgPDwgNSkKKyNkZWZpbmUgREE5MDMwX0FEQ19MRE9fSU5UX0VOQUJMRQkoMSA8PCA0KQorCisjZGVmaW5lIERBOTAzMF9BRENfQVVUT19DT05UUk9MCQkweDMxCisjZGVmaW5lIERBOTAzMF9BRENfVEJBVF9FTkFCTEUJCSgxIDw8IDUpCisjZGVmaW5lIERBOTAzMF9BRENfVkJBVF9JTl9UWE9OCQkoMSA8PCA0KQorI2RlZmluZSBEQTkwMzBfQURDX1ZDSF9FTkFCTEUJCSgxIDw8IDMpCisjZGVmaW5lIERBOTAzMF9BRENfSUNIX0VOQUJMRQkJKDEgPDwgMikKKyNkZWZpbmUgREE5MDMwX0FEQ19WQkFUX0VOQUJMRQkJKDEgPDwgMSkKKyNkZWZpbmUgREE5MDMwX0FEQ19BVVRPX1NMRUVQX0VOQUJMRQkoMSA8PCAwKQorCisjZGVmaW5lIERBOTAzMF9WQkFUTU9OCQkweDMyCisjZGVmaW5lIERBOTAzMF9WQkFUTU9OVFhPTgkweDMzCisjZGVmaW5lIERBOTAzMF9UQkFUSElHSFAJMHgzNAorI2RlZmluZSBEQTkwMzBfVEJBVEhJR0hOCTB4MzUKKyNkZWZpbmUgREE5MDMwX1RCQVRMT1cJCTB4MzYKKworI2RlZmluZSBEQTkwMzBfVkJBVF9SRVMJCTB4NDEKKyNkZWZpbmUgREE5MDMwX1ZCQVRNSU5fUkVTCTB4NDIKKyNkZWZpbmUgREE5MDMwX1ZCQVRNSU5UWE9OX1JFUwkweDQzCisjZGVmaW5lIERBOTAzMF9JQ0hNQVhfUkVTCTB4NDQKKyNkZWZpbmUgREE5MDMwX0lDSE1JTl9SRVMJMHg0NQorI2RlZmluZSBEQTkwMzBfSUNIQVZFUkFHRV9SRVMJMHg0NgorI2RlZmluZSBEQTkwMzBfVkNITUFYX1JFUwkweDQ3CisjZGVmaW5lIERBOTAzMF9WQ0hNSU5fUkVTCTB4NDgKKyNkZWZpbmUgREE5MDMwX1RCQVRfUkVTCQkweDQ5CisKK3N0cnVjdCBkYTkwMzBfYWRjX3JlcyB7CisJdWludDhfdCB2YmF0X3JlczsKKwl1aW50OF90IHZiYXRtaW5fcmVzOworCXVpbnQ4X3QgdmJhdG1pbnR4b247CisJdWludDhfdCBpY2htYXhfcmVzOworCXVpbnQ4X3QgaWNobWluX3JlczsKKwl1aW50OF90IGljaGF2ZXJhZ2VfcmVzOworCXVpbnQ4X3QgdmNobWF4X3JlczsKKwl1aW50OF90IHZjaG1pbl9yZXM7CisJdWludDhfdCB0YmF0X3JlczsKKwl1aW50OF90IGFkY19pbjRfcmVzOworCXVpbnQ4X3QgYWRjX2luNV9yZXM7Cit9OworCitzdHJ1Y3QgZGE5MDMwX2JhdHRlcnlfdGhyZXNob2xkcyB7CisJaW50IHRiYXRfbG93OworCWludCB0YmF0X2hpZ2g7CisJaW50IHRiYXRfcmVzdGFydDsKKworCWludCB2YmF0X2xvdzsKKwlpbnQgdmJhdF9jcml0OworCWludCB2YmF0X2NoYXJnZV9zdGFydDsKKwlpbnQgdmJhdF9jaGFyZ2Vfc3RvcDsKKwlpbnQgdmJhdF9jaGFyZ2VfcmVzdGFydDsKKworCWludCB2Y2hhcmdlX21pbjsKKwlpbnQgdmNoYXJnZV9tYXg7Cit9OworCitzdHJ1Y3QgZGE5MDMwX2NoYXJnZXIgeworCXN0cnVjdCBwb3dlcl9zdXBwbHkgcHN5OworCisJc3RydWN0IGRldmljZSAqbWFzdGVyOworCisJc3RydWN0IGRhOTAzMF9hZGNfcmVzIGFkYzsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrIHdvcms7CisJdW5zaWduZWQgaW50IGludGVydmFsOworCisJc3RydWN0IHBvd2VyX3N1cHBseV9pbmZvICpiYXR0ZXJ5X2luZm87CisKKwlzdHJ1Y3QgZGE5MDMwX2JhdHRlcnlfdGhyZXNob2xkcyB0aHJlc2hvbGRzOworCisJdW5zaWduZWQgaW50IGNoYXJnZV9taWxsaWFtcDsKKwl1bnNpZ25lZCBpbnQgY2hhcmdlX21pbGxpdm9sdDsKKworCS8qIGNoYXJnZXIgc3RhdHVzICovCisJYm9vbCBjaGRldDsKKwl1aW50OF90IGZhdWx0OworCWludCBtQTsKKwlpbnQgbVY7CisJYm9vbCBpc19vbjsKKworCXN0cnVjdCBub3RpZmllcl9ibG9jayBuYjsKKworCS8qIHBsYXRmb3JtIGNhbGxiYWNrcyBmb3IgYmF0dGVyeSBsb3cgYW5kIGNyaXRpY2FsIGV2ZW50cyAqLworCXZvaWQgKCpiYXR0ZXJ5X2xvdykodm9pZCk7CisJdm9pZCAoKmJhdHRlcnlfY3JpdGljYWwpKHZvaWQpOworCisJc3RydWN0IGRlbnRyeSAqZGVidWdfZmlsZTsKK307CisKK3N0YXRpYyBpbmxpbmUgaW50IGRhOTAzMF9yZWdfdG9fbVYoaW50IHJlZykKK3sKKwlyZXR1cm4gKChyZWcgKiAyNjUwKSA+PiA4KSArIDI2NTA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGRhOTAzMF9taWxsaXZvbHRfdG9fcmVnKGludCBtVikKK3sKKwlyZXR1cm4gKChtViAtIDI2NTApIDw8IDgpIC8gMjY1MDsKK30KKworc3RhdGljIGlubGluZSBpbnQgZGE5MDMwX3JlZ190b19tQShpbnQgcmVnKQoreworCXJldHVybiAoKHJlZyAqIDI0MDAwKSA+PiA4KSAvIDE1OworfQorCisjaWZkZWYgQ09ORklHX0RFQlVHX0ZTCitzdGF0aWMgaW50IGJhdF9kZWJ1Z19zaG93KHN0cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgZGE5MDMwX2NoYXJnZXIgKmNoYXJnZXIgPSBzLT5wcml2YXRlOworCisJc2VxX3ByaW50ZihzLCAiY2hhcmdlciBpcyAlc1xuIiwgY2hhcmdlci0+aXNfb24gPyAib24iIDogIm9mZiIpOworCWlmIChjaGFyZ2VyLT5jaGRldCkgeworCQlzZXFfcHJpbnRmKHMsICJpc2V0ID0gJWRtQSwgdnNldCA9ICVkbVZcbiIsCisJCQkgICBjaGFyZ2VyLT5tQSwgY2hhcmdlci0+bVYpOworCX0KKworCXNlcV9wcmludGYocywgInZiYXRfcmVzID0gJWQgKCVkbVYpXG4iLAorCQkgICBjaGFyZ2VyLT5hZGMudmJhdF9yZXMsCisJCSAgIGRhOTAzMF9yZWdfdG9fbVYoY2hhcmdlci0+YWRjLnZiYXRfcmVzKSk7CisJc2VxX3ByaW50ZihzLCAidmJhdG1pbl9yZXMgPSAlZCAoJWRtVilcbiIsCisJCSAgIGNoYXJnZXItPmFkYy52YmF0bWluX3JlcywKKwkJICAgZGE5MDMwX3JlZ190b19tVihjaGFyZ2VyLT5hZGMudmJhdG1pbl9yZXMpKTsKKwlzZXFfcHJpbnRmKHMsICJ2YmF0bWludHhvbiA9ICVkICglZG1WKVxuIiwKKwkJICAgY2hhcmdlci0+YWRjLnZiYXRtaW50eG9uLAorCQkgICBkYTkwMzBfcmVnX3RvX21WKGNoYXJnZXItPmFkYy52YmF0bWludHhvbikpOworCXNlcV9wcmludGYocywgImljaG1heF9yZXMgPSAlZCAoJWRtQSlcbiIsCisJCSAgIGNoYXJnZXItPmFkYy5pY2htYXhfcmVzLAorCQkgICBkYTkwMzBfcmVnX3RvX21WKGNoYXJnZXItPmFkYy5pY2htYXhfcmVzKSk7CisJc2VxX3ByaW50ZihzLCAiaWNobWluX3JlcyA9ICVkICglZG1BKVxuIiwKKwkJICAgY2hhcmdlci0+YWRjLmljaG1pbl9yZXMsCisJCSAgIGRhOTAzMF9yZWdfdG9fbUEoY2hhcmdlci0+YWRjLmljaG1pbl9yZXMpKTsKKwlzZXFfcHJpbnRmKHMsICJpY2hhdmVyYWdlX3JlcyA9ICVkICglZG1BKVxuIiwKKwkJICAgY2hhcmdlci0+YWRjLmljaGF2ZXJhZ2VfcmVzLAorCQkgICBkYTkwMzBfcmVnX3RvX21BKGNoYXJnZXItPmFkYy5pY2hhdmVyYWdlX3JlcykpOworCXNlcV9wcmludGYocywgInZjaG1heF9yZXMgPSAlZCAoJWRtVilcbiIsCisJCSAgIGNoYXJnZXItPmFkYy52Y2htYXhfcmVzLAorCQkgICBkYTkwMzBfcmVnX3RvX21BKGNoYXJnZXItPmFkYy52Y2htYXhfcmVzKSk7CisJc2VxX3ByaW50ZihzLCAidmNobWluX3JlcyA9ICVkICglZG1WKVxuIiwKKwkJICAgY2hhcmdlci0+YWRjLnZjaG1pbl9yZXMsCisJCSAgIGRhOTAzMF9yZWdfdG9fbVYoY2hhcmdlci0+YWRjLnZjaG1pbl9yZXMpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRlYnVnX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIGJhdF9kZWJ1Z19zaG93LCBpbm9kZS0+aV9wcml2YXRlKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYmF0X2RlYnVnX2ZvcHMgPSB7CisJLm9wZW4JCT0gZGVidWdfb3BlbiwKKwkucmVhZAkJPSBzZXFfcmVhZCwKKwkubGxzZWVrCQk9IHNlcV9sc2VlaywKKwkucmVsZWFzZQk9IHNpbmdsZV9yZWxlYXNlLAorfTsKKworc3RhdGljIHN0cnVjdCBkZW50cnkgKmRhOTAzMF9iYXRfY3JlYXRlX2RlYnVnZnMoc3RydWN0IGRhOTAzMF9jaGFyZ2VyICpjaGFyZ2VyKQoreworCWNoYXJnZXItPmRlYnVnX2ZpbGUgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJjaGFyZ2VyIiwgMDY2NiwgMCwgY2hhcmdlciwKKwkJCQkJCSAmYmF0X2RlYnVnX2ZvcHMpOworCXJldHVybiBjaGFyZ2VyLT5kZWJ1Z19maWxlOworfQorCitzdGF0aWMgdm9pZCBkYTkwMzBfYmF0X3JlbW92ZV9kZWJ1Z2ZzKHN0cnVjdCBkYTkwMzBfY2hhcmdlciAqY2hhcmdlcikKK3sKKwlkZWJ1Z2ZzX3JlbW92ZShjaGFyZ2VyLT5kZWJ1Z19maWxlKTsKK30KKyNlbHNlCitzdGF0aWMgaW5saW5lIHN0cnVjdCBkZW50cnkgKmRhOTAzMF9iYXRfY3JlYXRlX2RlYnVnZnMoc3RydWN0IGRhOTAzMF9jaGFyZ2VyICpjaGFyZ2VyKQoreworCXJldHVybiBOVUxMOworfQorc3RhdGljIGlubGluZSB2b2lkIGRhOTAzMF9iYXRfcmVtb3ZlX2RlYnVnZnMoc3RydWN0IGRhOTAzMF9jaGFyZ2VyICpjaGFyZ2VyKQoreworfQorI2VuZGlmCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkYTkwMzBfcmVhZF9hZGMoc3RydWN0IGRhOTAzMF9jaGFyZ2VyICpjaGFyZ2VyLAorCQkJCSAgIHN0cnVjdCBkYTkwMzBfYWRjX3JlcyAqYWRjKQoreworCWRhOTAzeF9yZWFkcyhjaGFyZ2VyLT5tYXN0ZXIsIERBOTAzMF9WQkFUX1JFUywKKwkJICAgICBzaXplb2YoKmFkYyksICh1aW50OF90ICopYWRjKTsKK30KKworc3RhdGljIHZvaWQgZGE5MDMwX2NoYXJnZXJfdXBkYXRlX3N0YXRlKHN0cnVjdCBkYTkwMzBfY2hhcmdlciAqY2hhcmdlcikKK3sKKwl1aW50OF90IHZhbDsKKworCWRhOTAzeF9yZWFkKGNoYXJnZXItPm1hc3RlciwgREE5MDMwX0NIQVJHRV9DT05UUk9MLCAmdmFsKTsKKwljaGFyZ2VyLT5pc19vbiA9ICh2YWwgJiBEQTkwMzBfQ0hSR19DSEFSR0VSX0VOQUJMRSkgPyAxIDogMDsKKwljaGFyZ2VyLT5tQSA9ICgodmFsID4+IDMpICYgMHhmKSAqIDEwMDsKKwljaGFyZ2VyLT5tViA9ICh2YWwgJiAweDcpICogNTAgKyA0MDAwOworCisJZGE5MDMwX3JlYWRfYWRjKGNoYXJnZXIsICZjaGFyZ2VyLT5hZGMpOworCWRhOTAzeF9yZWFkKGNoYXJnZXItPm1hc3RlciwgREE5MDMwX0ZBVUxUX0xPRywgJmNoYXJnZXItPmZhdWx0KTsKKwljaGFyZ2VyLT5jaGRldCA9IGRhOTAzeF9xdWVyeV9zdGF0dXMoY2hhcmdlci0+bWFzdGVyLAorCQkJCQkJICAgICBEQTkwMzBfU1RBVFVTX0NIREVUKTsKK30KKworc3RhdGljIHZvaWQgZGE5MDMwX3NldF9jaGFyZ2Uoc3RydWN0IGRhOTAzMF9jaGFyZ2VyICpjaGFyZ2VyLCBpbnQgb24pCit7CisJdWludDhfdCB2YWw7CisKKwlpZiAob24pIHsKKwkJdmFsID0gREE5MDMwX0NIUkdfQ0hBUkdFUl9FTkFCTEU7CisJCXZhbCB8PSAoY2hhcmdlci0+Y2hhcmdlX21pbGxpYW1wIC8gMTAwKSA8PCAzOworCQl2YWwgfD0gKGNoYXJnZXItPmNoYXJnZV9taWxsaXZvbHQgLSA0MDAwKSAvIDUwOworCQljaGFyZ2VyLT5pc19vbiA9IDE7CisJfSBlbHNlIHsKKwkJdmFsID0gMDsKKwkJY2hhcmdlci0+aXNfb24gPSAwOworCX0KKworCWRhOTAzeF93cml0ZShjaGFyZ2VyLT5tYXN0ZXIsIERBOTAzMF9DSEFSR0VfQ09OVFJPTCwgdmFsKTsKK30KKworc3RhdGljIHZvaWQgZGE5MDMwX2NoYXJnZXJfY2hlY2tfc3RhdGUoc3RydWN0IGRhOTAzMF9jaGFyZ2VyICpjaGFyZ2VyKQoreworCWRhOTAzMF9jaGFyZ2VyX3VwZGF0ZV9zdGF0ZShjaGFyZ2VyKTsKKworCS8qIHdlIHdha2Ugb3IgYm9vdCB3aXRoIGV4dGVybmFsIHBvd2VyIG9uICovCisJaWYgKCFjaGFyZ2VyLT5pc19vbikgeworCQlpZiAoKGNoYXJnZXItPmNoZGV0KSAmJgorCQkgICAgKGNoYXJnZXItPmFkYy52YmF0X3JlcyA8CisJCSAgICAgY2hhcmdlci0+dGhyZXNob2xkcy52YmF0X2NoYXJnZV9zdGFydCkpIHsKKwkJCWRhOTAzMF9zZXRfY2hhcmdlKGNoYXJnZXIsIDEpOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKGNoYXJnZXItPmFkYy52YmF0X3JlcyA+PQorCQkgICAgY2hhcmdlci0+dGhyZXNob2xkcy52YmF0X2NoYXJnZV9zdG9wKSB7CisJCQlkYTkwMzBfc2V0X2NoYXJnZShjaGFyZ2VyLCAwKTsKKwkJCWRhOTAzeF93cml0ZShjaGFyZ2VyLT5tYXN0ZXIsIERBOTAzMF9WQkFUTU9OLAorCQkJCSAgICAgICBjaGFyZ2VyLT50aHJlc2hvbGRzLnZiYXRfY2hhcmdlX3Jlc3RhcnQpOworCQl9IGVsc2UgaWYgKGNoYXJnZXItPmFkYy52YmF0X3JlcyA+CisJCQkgICBjaGFyZ2VyLT50aHJlc2hvbGRzLnZiYXRfbG93KSB7CisJCQkvKiB3ZSBhcmUgY2hhcmdpbmcgYW5kIHBhc3NlZCBMT1dfVEhSRVNILAorCQkJICAgc28gdXBhdGUgREE5MDMwIFZCQVQgdGhyZXNob2xkCisJCQkgKi8KKwkJCWRhOTAzeF93cml0ZShjaGFyZ2VyLT5tYXN0ZXIsIERBOTAzMF9WQkFUTU9OLAorCQkJCSAgICAgY2hhcmdlci0+dGhyZXNob2xkcy52YmF0X2xvdyk7CisJCX0KKwkJaWYgKGNoYXJnZXItPmFkYy52Y2htYXhfcmVzID4gY2hhcmdlci0+dGhyZXNob2xkcy52Y2hhcmdlX21heCB8fAorCQkgICAgY2hhcmdlci0+YWRjLnZjaG1pbl9yZXMgPCBjaGFyZ2VyLT50aHJlc2hvbGRzLnZjaGFyZ2VfbWluIHx8CisJCSAgICAvKiBUZW1wcmV0dXJlIHJlYWRpbmdzIGFyZSBuZWdhdGl2ZSAqLworCQkgICAgY2hhcmdlci0+YWRjLnRiYXRfcmVzIDwgY2hhcmdlci0+dGhyZXNob2xkcy50YmF0X2hpZ2ggfHwKKwkJICAgIGNoYXJnZXItPmFkYy50YmF0X3JlcyA+IGNoYXJnZXItPnRocmVzaG9sZHMudGJhdF9sb3cpIHsKKwkJCS8qIGRpc2FibGUgY2hhcmdlciAqLworCQkJZGE5MDMwX3NldF9jaGFyZ2UoY2hhcmdlciwgMCk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIGRhOTAzMF9jaGFyZ2luZ19tb25pdG9yKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgZGE5MDMwX2NoYXJnZXIgKmNoYXJnZXI7CisKKwljaGFyZ2VyID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBkYTkwMzBfY2hhcmdlciwgd29yay53b3JrKTsKKworCWRhOTAzMF9jaGFyZ2VyX2NoZWNrX3N0YXRlKGNoYXJnZXIpOworCisJLyogcmVzY2hlZHVsZSBmb3IgdGhlIG5leHQgdGltZSAqLworCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmY2hhcmdlci0+d29yaywgY2hhcmdlci0+aW50ZXJ2YWwpOworfQorCitzdGF0aWMgZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgZGE5MDMwX2JhdHRlcnlfcHJvcHNbXSA9IHsKKwlQT1dFUl9TVVBQTFlfUFJPUF9NT0RFTF9OQU1FLAorCVBPV0VSX1NVUFBMWV9QUk9QX1NUQVRVUywKKwlQT1dFUl9TVVBQTFlfUFJPUF9IRUFMVEgsCisJUE9XRVJfU1VQUExZX1BST1BfVEVDSE5PTE9HWSwKKwlQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX01BWF9ERVNJR04sCisJUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9NSU5fREVTSUdOLAorCVBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfTk9XLAorCVBPV0VSX1NVUFBMWV9QUk9QX0NVUlJFTlRfQVZHLAorfTsKKworc3RhdGljIHZvaWQgZGE5MDMwX2JhdHRlcnlfY2hlY2tfc3RhdHVzKHN0cnVjdCBkYTkwMzBfY2hhcmdlciAqY2hhcmdlciwKKwkJCQkgICAgdW5pb24gcG93ZXJfc3VwcGx5X3Byb3B2YWwgKnZhbCkKK3sKKwlpZiAoY2hhcmdlci0+Y2hkZXQpIHsKKwkJaWYgKGNoYXJnZXItPmlzX29uKQorCQkJdmFsLT5pbnR2YWwgPSBQT1dFUl9TVVBQTFlfU1RBVFVTX0NIQVJHSU5HOworCQllbHNlCisJCQl2YWwtPmludHZhbCA9IFBPV0VSX1NVUFBMWV9TVEFUVVNfTk9UX0NIQVJHSU5HOworCX0gZWxzZSB7CisJCXZhbC0+aW50dmFsID0gUE9XRVJfU1VQUExZX1NUQVRVU19ESVNDSEFSR0lORzsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGRhOTAzMF9iYXR0ZXJ5X2NoZWNrX2hlYWx0aChzdHJ1Y3QgZGE5MDMwX2NoYXJnZXIgKmNoYXJnZXIsCisJCQkJICAgIHVuaW9uIHBvd2VyX3N1cHBseV9wcm9wdmFsICp2YWwpCit7CisJaWYgKGNoYXJnZXItPmZhdWx0ICYgREE5MDMwX0ZBVUxUX0xPR19PVkVSX1RFTVApCisJCXZhbC0+aW50dmFsID0gUE9XRVJfU1VQUExZX0hFQUxUSF9PVkVSSEVBVDsKKwllbHNlIGlmIChjaGFyZ2VyLT5mYXVsdCAmIERBOTAzMF9GQVVMVF9MT0dfVkJBVF9PVkVSKQorCQl2YWwtPmludHZhbCA9IFBPV0VSX1NVUFBMWV9IRUFMVEhfT1ZFUlZPTFRBR0U7CisJZWxzZQorCQl2YWwtPmludHZhbCA9IFBPV0VSX1NVUFBMWV9IRUFMVEhfR09PRDsKK30KKworc3RhdGljIGludCBkYTkwMzBfYmF0dGVyeV9nZXRfcHJvcGVydHkoc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5LAorCQkJCSAgIGVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IHBzcCwKKwkJCQkgICB1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZhbCAqdmFsKQoreworCXN0cnVjdCBkYTkwMzBfY2hhcmdlciAqY2hhcmdlcjsKKwljaGFyZ2VyID0gY29udGFpbmVyX29mKHBzeSwgc3RydWN0IGRhOTAzMF9jaGFyZ2VyLCBwc3kpOworCisJc3dpdGNoIChwc3ApIHsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1NUQVRVUzoKKwkJZGE5MDMwX2JhdHRlcnlfY2hlY2tfc3RhdHVzKGNoYXJnZXIsIHZhbCk7CisJCWJyZWFrOworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfSEVBTFRIOgorCQlkYTkwMzBfYmF0dGVyeV9jaGVja19oZWFsdGgoY2hhcmdlciwgdmFsKTsKKwkJYnJlYWs7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9URUNITk9MT0dZOgorCQl2YWwtPmludHZhbCA9IGNoYXJnZXItPmJhdHRlcnlfaW5mby0+dGVjaG5vbG9neTsKKwkJYnJlYWs7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX01BWF9ERVNJR046CisJCXZhbC0+aW50dmFsID0gY2hhcmdlci0+YmF0dGVyeV9pbmZvLT52b2x0YWdlX21heF9kZXNpZ247CisJCWJyZWFrOworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9NSU5fREVTSUdOOgorCQl2YWwtPmludHZhbCA9IGNoYXJnZXItPmJhdHRlcnlfaW5mby0+dm9sdGFnZV9taW5fZGVzaWduOworCQlicmVhazsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfTk9XOgorCQl2YWwtPmludHZhbCA9IGRhOTAzMF9yZWdfdG9fbVYoY2hhcmdlci0+YWRjLnZiYXRfcmVzKSAqIDEwMDA7CisJCWJyZWFrOworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ1VSUkVOVF9BVkc6CisJCXZhbC0+aW50dmFsID0KKwkJCWRhOTAzMF9yZWdfdG9fbUEoY2hhcmdlci0+YWRjLmljaGF2ZXJhZ2VfcmVzKSAqIDEwMDA7CisJCWJyZWFrOworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfTU9ERUxfTkFNRToKKwkJdmFsLT5zdHJ2YWwgPSBjaGFyZ2VyLT5iYXR0ZXJ5X2luZm8tPm5hbWU7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBkYTkwMzBfYmF0dGVyeV92YmF0X2V2ZW50KHN0cnVjdCBkYTkwMzBfY2hhcmdlciAqY2hhcmdlcikKK3sKKwlkYTkwMzBfcmVhZF9hZGMoY2hhcmdlciwgJmNoYXJnZXItPmFkYyk7CisKKwlpZiAoY2hhcmdlci0+aXNfb24pCisJCXJldHVybjsKKworCWlmIChjaGFyZ2VyLT5hZGMudmJhdF9yZXMgPCBjaGFyZ2VyLT50aHJlc2hvbGRzLnZiYXRfbG93KSB7CisJCS8qIHNldCBWQkFUIHRocmVzaG9sZCBmb3IgY3JpdGljYWwgKi8KKwkJZGE5MDN4X3dyaXRlKGNoYXJnZXItPm1hc3RlciwgREE5MDMwX1ZCQVRNT04sCisJCQkgICAgIGNoYXJnZXItPnRocmVzaG9sZHMudmJhdF9jcml0KTsKKwkJaWYgKGNoYXJnZXItPmJhdHRlcnlfbG93KQorCQkJY2hhcmdlci0+YmF0dGVyeV9sb3coKTsKKwl9IGVsc2UgaWYgKGNoYXJnZXItPmFkYy52YmF0X3JlcyA8CisJCSAgIGNoYXJnZXItPnRocmVzaG9sZHMudmJhdF9jcml0KSB7CisJCS8qIG5vdGlmeSB0aGUgc3lzdGVtIG9mIGJhdHRlcnkgY3JpdGljYWwgKi8KKwkJaWYgKGNoYXJnZXItPmJhdHRlcnlfY3JpdGljYWwpCisJCQljaGFyZ2VyLT5iYXR0ZXJ5X2NyaXRpY2FsKCk7CisJfQorfQorCitzdGF0aWMgaW50IGRhOTAzMF9iYXR0ZXJ5X2V2ZW50KHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIsIHVuc2lnbmVkIGxvbmcgZXZlbnQsCisJCQkJdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgZGE5MDMwX2NoYXJnZXIgKmNoYXJnZXIgPQorCQljb250YWluZXJfb2YobmIsIHN0cnVjdCBkYTkwMzBfY2hhcmdlciwgbmIpOworCWludCBzdGF0dXM7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBEQTkwMzBfRVZFTlRfQ0hERVQ6CisJCXN0YXR1cyA9IGRhOTAzeF9xdWVyeV9zdGF0dXMoY2hhcmdlci0+bWFzdGVyLAorCQkJCQkgICAgIERBOTAzMF9TVEFUVVNfQ0hERVQpOworCQlkYTkwMzBfc2V0X2NoYXJnZShjaGFyZ2VyLCBzdGF0dXMpOworCQlicmVhazsKKwljYXNlIERBOTAzMF9FVkVOVF9WQkFUTU9OOgorCQlkYTkwMzBfYmF0dGVyeV92YmF0X2V2ZW50KGNoYXJnZXIpOworCQlicmVhazsKKwljYXNlIERBOTAzMF9FVkVOVF9DSElPVkVSOgorCWNhc2UgREE5MDMwX0VWRU5UX1RCQVQ6CisJCWRhOTAzMF9zZXRfY2hhcmdlKGNoYXJnZXIsIDApOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZGE5MDMwX2JhdHRlcnlfY29udmVydF90aHJlc2hvbGRzKHN0cnVjdCBkYTkwMzBfY2hhcmdlciAqY2hhcmdlciwKKwkJCQkJICAgICAgc3RydWN0IGRhOTAzMF9iYXR0ZXJ5X2luZm8gKnBkYXRhKQoreworCWNoYXJnZXItPnRocmVzaG9sZHMudGJhdF9sb3cgPSBwZGF0YS0+dGJhdF9sb3c7CisJY2hhcmdlci0+dGhyZXNob2xkcy50YmF0X2hpZ2ggPSBwZGF0YS0+dGJhdF9oaWdoOworCWNoYXJnZXItPnRocmVzaG9sZHMudGJhdF9yZXN0YXJ0ICA9IHBkYXRhLT50YmF0X3Jlc3RhcnQ7CisKKwljaGFyZ2VyLT50aHJlc2hvbGRzLnZiYXRfbG93ID0KKwkJZGE5MDMwX21pbGxpdm9sdF90b19yZWcocGRhdGEtPnZiYXRfbG93KTsKKwljaGFyZ2VyLT50aHJlc2hvbGRzLnZiYXRfY3JpdCA9CisJCWRhOTAzMF9taWxsaXZvbHRfdG9fcmVnKHBkYXRhLT52YmF0X2NyaXQpOworCWNoYXJnZXItPnRocmVzaG9sZHMudmJhdF9jaGFyZ2Vfc3RhcnQgPQorCQlkYTkwMzBfbWlsbGl2b2x0X3RvX3JlZyhwZGF0YS0+dmJhdF9jaGFyZ2Vfc3RhcnQpOworCWNoYXJnZXItPnRocmVzaG9sZHMudmJhdF9jaGFyZ2Vfc3RvcCA9CisJCWRhOTAzMF9taWxsaXZvbHRfdG9fcmVnKHBkYXRhLT52YmF0X2NoYXJnZV9zdG9wKTsKKwljaGFyZ2VyLT50aHJlc2hvbGRzLnZiYXRfY2hhcmdlX3Jlc3RhcnQgPQorCQlkYTkwMzBfbWlsbGl2b2x0X3RvX3JlZyhwZGF0YS0+dmJhdF9jaGFyZ2VfcmVzdGFydCk7CisKKwljaGFyZ2VyLT50aHJlc2hvbGRzLnZjaGFyZ2VfbWluID0KKwkJZGE5MDMwX21pbGxpdm9sdF90b19yZWcocGRhdGEtPnZjaGFyZ2VfbWluKTsKKwljaGFyZ2VyLT50aHJlc2hvbGRzLnZjaGFyZ2VfbWF4ID0KKwkJZGE5MDMwX21pbGxpdm9sdF90b19yZWcocGRhdGEtPnZjaGFyZ2VfbWF4KTsKK30KKworc3RhdGljIHZvaWQgZGE5MDMwX2JhdHRlcnlfc2V0dXBfcHN5KHN0cnVjdCBkYTkwMzBfY2hhcmdlciAqY2hhcmdlcikKK3sKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3kgPSAmY2hhcmdlci0+cHN5OworCXN0cnVjdCBwb3dlcl9zdXBwbHlfaW5mbyAqaW5mbyA9IGNoYXJnZXItPmJhdHRlcnlfaW5mbzsKKworCXBzeS0+bmFtZSA9IGluZm8tPm5hbWU7CisJcHN5LT51c2VfZm9yX2FwbSA9IGluZm8tPnVzZV9mb3JfYXBtOworCXBzeS0+dHlwZSA9IFBPV0VSX1NVUFBMWV9UWVBFX0JBVFRFUlk7CisJcHN5LT5nZXRfcHJvcGVydHkgPSBkYTkwMzBfYmF0dGVyeV9nZXRfcHJvcGVydHk7CisKKwlwc3ktPnByb3BlcnRpZXMgPSBkYTkwMzBfYmF0dGVyeV9wcm9wczsKKwlwc3ktPm51bV9wcm9wZXJ0aWVzID0gQVJSQVlfU0laRShkYTkwMzBfYmF0dGVyeV9wcm9wcyk7Cit9OworCitzdGF0aWMgaW50IGRhOTAzMF9iYXR0ZXJ5X2NoYXJnZXJfaW5pdChzdHJ1Y3QgZGE5MDMwX2NoYXJnZXIgKmNoYXJnZXIpCit7CisJY2hhciB2WzVdOworCWludCByZXQ7CisKKwl2WzBdID0gdlsxXSA9IGNoYXJnZXItPnRocmVzaG9sZHMudmJhdF9sb3c7CisJdlsyXSA9IGNoYXJnZXItPnRocmVzaG9sZHMudGJhdF9oaWdoOworCXZbM10gPSBjaGFyZ2VyLT50aHJlc2hvbGRzLnRiYXRfcmVzdGFydDsKKwl2WzRdID0gY2hhcmdlci0+dGhyZXNob2xkcy50YmF0X2xvdzsKKworCXJldCA9IGRhOTAzeF93cml0ZXMoY2hhcmdlci0+bWFzdGVyLCBEQTkwMzBfVkJBVE1PTiwgNSwgdik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCS8qCisJICogRW5hYmxlIHJlZmVyZW5jZSB2b2x0YWdlIHN1cHBseSBmb3IgQURDIGZyb20gdGhlIExET19JTlRFUk5BTAorCSAqIHJlZ3VsYXRvci4gTXVzdCBiZSBzZXQgYmVmb3JlIEFEQyBtZWFzdXJlbWVudHMgY2FuIGJlIG1hZGUuCisJICovCisJcmV0ID0gZGE5MDN4X3dyaXRlKGNoYXJnZXItPm1hc3RlciwgREE5MDMwX0FEQ19NQU5fQ09OVFJPTCwKKwkJCSAgIERBOTAzMF9BRENfTERPX0lOVF9FTkFCTEUgfAorCQkJICAgREE5MDMwX0FEQ19UQkFUUkVGX0VOQUJMRSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCS8qIGVuYWJsZSBhdXRvIEFEQyBtZWFzdXJlbW50cyAqLworCXJldHVybiBkYTkwM3hfd3JpdGUoY2hhcmdlci0+bWFzdGVyLCBEQTkwMzBfQURDX0FVVE9fQ09OVFJPTCwKKwkJCSAgICBEQTkwMzBfQURDX1RCQVRfRU5BQkxFIHwgREE5MDMwX0FEQ19WQkFUX0lOX1RYT04gfAorCQkJICAgIERBOTAzMF9BRENfVkNIX0VOQUJMRSB8IERBOTAzMF9BRENfSUNIX0VOQUJMRSB8CisJCQkgICAgREE5MDMwX0FEQ19WQkFUX0VOQUJMRSB8CisJCQkgICAgREE5MDMwX0FEQ19BVVRPX1NMRUVQX0VOQUJMRSk7Cit9CisKK3N0YXRpYyBpbnQgZGE5MDMwX2JhdHRlcnlfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgZGE5MDMwX2NoYXJnZXIgKmNoYXJnZXI7CisJc3RydWN0IGRhOTAzMF9iYXR0ZXJ5X2luZm8gKnBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJaW50IHJldDsKKworCWlmIChwZGF0YSA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChwZGF0YS0+Y2hhcmdlX21pbGxpYW1wID49IDE1MDAgfHwKKwkgICAgcGRhdGEtPmNoYXJnZV9taWxsaXZvbHQgPCA0MDAwIHx8CisJICAgIHBkYXRhLT5jaGFyZ2VfbWlsbGl2b2x0ID4gNDM1MCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwljaGFyZ2VyID0ga3phbGxvYyhzaXplb2YoKmNoYXJnZXIpLCBHRlBfS0VSTkVMKTsKKwlpZiAoY2hhcmdlciA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWNoYXJnZXItPm1hc3RlciA9IHBkZXYtPmRldi5wYXJlbnQ7CisKKwkvKiAxMCBzZWNvbmRzIGJldHdlZW4gbW9ub3RvciBydW5zIHVubGVzcyBwbGF0ZnJvbSBkZWZpbmVzIG90aGVyCisJICAgaW50ZXJ2YWwgKi8KKwljaGFyZ2VyLT5pbnRlcnZhbCA9IG1zZWNzX3RvX2ppZmZpZXMoCisJCShwZGF0YS0+YmF0bW9uX2ludGVydmFsID8gOiAxMCkgKiAxMDAwKTsKKworCWNoYXJnZXItPmNoYXJnZV9taWxsaWFtcCA9IHBkYXRhLT5jaGFyZ2VfbWlsbGlhbXA7CisJY2hhcmdlci0+Y2hhcmdlX21pbGxpdm9sdCA9IHBkYXRhLT5jaGFyZ2VfbWlsbGl2b2x0OworCWNoYXJnZXItPmJhdHRlcnlfaW5mbyA9IHBkYXRhLT5iYXR0ZXJ5X2luZm87CisJY2hhcmdlci0+YmF0dGVyeV9sb3cgPSBwZGF0YS0+YmF0dGVyeV9sb3c7CisJY2hhcmdlci0+YmF0dGVyeV9jcml0aWNhbCA9IHBkYXRhLT5iYXR0ZXJ5X2NyaXRpY2FsOworCisJZGE5MDMwX2JhdHRlcnlfY29udmVydF90aHJlc2hvbGRzKGNoYXJnZXIsIHBkYXRhKTsKKworCXJldCA9IGRhOTAzMF9iYXR0ZXJ5X2NoYXJnZXJfaW5pdChjaGFyZ2VyKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9jaGFyZ2VyX2luaXQ7CisKKwlJTklUX0RFTEFZRURfV09SSygmY2hhcmdlci0+d29yaywgZGE5MDMwX2NoYXJnaW5nX21vbml0b3IpOworCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmY2hhcmdlci0+d29yaywgY2hhcmdlci0+aW50ZXJ2YWwpOworCisJY2hhcmdlci0+bmIubm90aWZpZXJfY2FsbCA9IGRhOTAzMF9iYXR0ZXJ5X2V2ZW50OworCXJldCA9IGRhOTAzeF9yZWdpc3Rlcl9ub3RpZmllcihjaGFyZ2VyLT5tYXN0ZXIsICZjaGFyZ2VyLT5uYiwKKwkJCQkgICAgICAgREE5MDMwX0VWRU5UX0NIREVUIHwKKwkJCQkgICAgICAgREE5MDMwX0VWRU5UX1ZCQVRNT04gfAorCQkJCSAgICAgICBEQTkwMzBfRVZFTlRfQ0hJT1ZFUiB8CisJCQkJICAgICAgIERBOTAzMF9FVkVOVF9UQkFUKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9ub3RpZmllcjsKKworCWRhOTAzMF9iYXR0ZXJ5X3NldHVwX3BzeShjaGFyZ2VyKTsKKwlyZXQgPSBwb3dlcl9zdXBwbHlfcmVnaXN0ZXIoJnBkZXYtPmRldiwgJmNoYXJnZXItPnBzeSk7CisJaWYgKHJldCkKKwkJZ290byBlcnJfcHNfcmVnaXN0ZXI7CisKKwljaGFyZ2VyLT5kZWJ1Z19maWxlID0gZGE5MDMwX2JhdF9jcmVhdGVfZGVidWdmcyhjaGFyZ2VyKTsKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBjaGFyZ2VyKTsKKwlyZXR1cm4gMDsKKworZXJyX3BzX3JlZ2lzdGVyOgorCWRhOTAzeF91bnJlZ2lzdGVyX25vdGlmaWVyKGNoYXJnZXItPm1hc3RlciwgJmNoYXJnZXItPm5iLAorCQkJCSAgIERBOTAzMF9FVkVOVF9DSERFVCB8IERBOTAzMF9FVkVOVF9WQkFUTU9OIHwKKwkJCQkgICBEQTkwMzBfRVZFTlRfQ0hJT1ZFUiB8IERBOTAzMF9FVkVOVF9UQkFUKTsKK2Vycl9ub3RpZmllcjoKKwljYW5jZWxfZGVsYXllZF93b3JrKCZjaGFyZ2VyLT53b3JrKTsKKworZXJyX2NoYXJnZXJfaW5pdDoKKwlrZnJlZShjaGFyZ2VyKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZGE5MDMwX2JhdHRlcnlfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZGE5MDMwX2NoYXJnZXIgKmNoYXJnZXIgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShkZXYpOworCisJZGE5MDMwX2JhdF9yZW1vdmVfZGVidWdmcyhjaGFyZ2VyKTsKKworCWRhOTAzeF91bnJlZ2lzdGVyX25vdGlmaWVyKGNoYXJnZXItPm1hc3RlciwgJmNoYXJnZXItPm5iLAorCQkJCSAgIERBOTAzMF9FVkVOVF9DSERFVCB8IERBOTAzMF9FVkVOVF9WQkFUTU9OIHwKKwkJCQkgICBEQTkwMzBfRVZFTlRfQ0hJT1ZFUiB8IERBOTAzMF9FVkVOVF9UQkFUKTsKKwljYW5jZWxfZGVsYXllZF93b3JrKCZjaGFyZ2VyLT53b3JrKTsKKwlwb3dlcl9zdXBwbHlfdW5yZWdpc3RlcigmY2hhcmdlci0+cHN5KTsKKworCWtmcmVlKGNoYXJnZXIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGRhOTAzeF9iYXR0ZXJ5X2RyaXZlciA9IHsKKwkuZHJpdmVyCT0geworCQkubmFtZQk9ICJkYTkwM3gtYmF0dGVyeSIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCX0sCisJLnByb2JlID0gZGE5MDMwX2JhdHRlcnlfcHJvYmUsCisJLnJlbW92ZSA9IGRhOTAzMF9iYXR0ZXJ5X3JlbW92ZSwKK307CisKK3N0YXRpYyBpbnQgZGE5MDN4X2JhdHRlcnlfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmRhOTAzeF9iYXR0ZXJ5X2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIGRhOTAzeF9iYXR0ZXJ5X2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmZGE5MDN4X2JhdHRlcnlfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoZGE5MDN4X2JhdHRlcnlfaW5pdCk7Cittb2R1bGVfZXhpdChkYTkwM3hfYmF0dGVyeV9leGl0KTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJEQTkwMzAgYmF0dGVyeSBjaGFyZ2VyIGRyaXZlciIpOworTU9EVUxFX0FVVEhPUigiTWlrZSBSYXBvcG9ydCwgQ29tcHVMYWIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG93ZXIvZHMyNzYwX2JhdHRlcnkuYyBiL2RyaXZlcnMvcG93ZXIvZHMyNzYwX2JhdHRlcnkuYwppbmRleCAzMDhkZGIyLi4xZDc2ODkyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Bvd2VyL2RzMjc2MF9iYXR0ZXJ5LmMKKysrIGIvZHJpdmVycy9wb3dlci9kczI3NjBfYmF0dGVyeS5jCkBAIC0zNTQsNyArMzU0LDcgQEAKIAlwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwogCWRpLT5kZXYJCT0gJnBkZXYtPmRldjsKIAlkaS0+dzFfZGV2CSAgICAgPSBwZGV2LT5kZXYucGFyZW50OwotCWRpLT5iYXQubmFtZQkgICA9IHBkZXYtPmRldi5idXNfaWQ7CisJZGktPmJhdC5uYW1lCSAgID0gZGV2X25hbWUoJnBkZXYtPmRldik7CiAJZGktPmJhdC50eXBlCSAgID0gUE9XRVJfU1VQUExZX1RZUEVfQkFUVEVSWTsKIAlkaS0+YmF0LnByb3BlcnRpZXMgICAgID0gZHMyNzYwX2JhdHRlcnlfcHJvcHM7CiAJZGktPmJhdC5udW1fcHJvcGVydGllcyA9IEFSUkFZX1NJWkUoZHMyNzYwX2JhdHRlcnlfcHJvcHMpOwpAQCAtMzcxLDcgKzM3MSw3IEBACiAJfQogCiAJSU5JVF9ERUxBWUVEX1dPUksoJmRpLT5tb25pdG9yX3dvcmssIGRzMjc2MF9iYXR0ZXJ5X3dvcmspOwotCWRpLT5tb25pdG9yX3dxdWV1ZSA9IGNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlKHBkZXYtPmRldi5idXNfaWQpOworCWRpLT5tb25pdG9yX3dxdWV1ZSA9IGNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlKGRldl9uYW1lKCZwZGV2LT5kZXYpKTsKIAlpZiAoIWRpLT5tb25pdG9yX3dxdWV1ZSkgewogCQlyZXR2YWwgPSAtRVNSQ0g7CiAJCWdvdG8gd29ya3F1ZXVlX2ZhaWxlZDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG93ZXIvcG93ZXJfc3VwcGx5X3N5c2ZzLmMgYi9kcml2ZXJzL3Bvd2VyL3Bvd2VyX3N1cHBseV9zeXNmcy5jCmluZGV4IDIzYWU4NDYuLmFjMDFlMDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcG93ZXIvcG93ZXJfc3VwcGx5X3N5c2ZzLmMKKysrIGIvZHJpdmVycy9wb3dlci9wb3dlcl9zdXBwbHlfc3lzZnMuYwpAQCAtNDUsNyArNDUsNyBAQAogCX07CiAJc3RhdGljIGNoYXIgKmhlYWx0aF90ZXh0W10gPSB7CiAJCSJVbmtub3duIiwgIkdvb2QiLCAiT3ZlcmhlYXQiLCAiRGVhZCIsICJPdmVyIHZvbHRhZ2UiLAotCQkiVW5zcGVjaWZpZWQgZmFpbHVyZSIKKwkJIlVuc3BlY2lmaWVkIGZhaWx1cmUiLCAiQ29sZCIsCiAJfTsKIAlzdGF0aWMgY2hhciAqdGVjaG5vbG9neV90ZXh0W10gPSB7CiAJCSJVbmtub3duIiwgIk5pTUgiLCAiTGktaW9uIiwgIkxpLXBvbHkiLCAiTGlGZSIsICJOaUNkIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG93ZXIvd204MzUwX3Bvd2VyLmMgYi9kcml2ZXJzL3Bvd2VyL3dtODM1MF9wb3dlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiMTZiZjMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Bvd2VyL3dtODM1MF9wb3dlci5jCkBAIC0wLDAgKzEsNTMyIEBACisvKgorICogQmF0dGVyeSBkcml2ZXIgZm9yIHdtODM1MCBQTUlDCisgKgorICogQ29weXJpZ2h0IDIwMDcsIDIwMDggV29sZnNvbiBNaWNyb2VsZWN0cm9uaWNzIFBMQy4KKyAqCisgKiBCYXNlZCBvbiBPTFBDIEJhdHRlcnkgRHJpdmVyCisgKgorICogQ29weXJpZ2h0IDIwMDYgIERhdmlkIFdvb2Rob3VzZSA8ZHdtdzJAaW5mcmFkZWFkLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wb3dlcl9zdXBwbHkuaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvd204MzUwL3N1cHBseS5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC93bTgzNTAvY29yZS5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC93bTgzNTAvY29tcGFyYXRvci5oPgorCitzdGF0aWMgaW50IHdtODM1MF9yZWFkX2JhdHRlcnlfdXZvbHRzKHN0cnVjdCB3bTgzNTAgKndtODM1MCkKK3sKKwlyZXR1cm4gd204MzUwX3JlYWRfYXV4YWRjKHdtODM1MCwgV004MzUwX0FVWEFEQ19CQVRULCAwLCAwKQorCQkqIFdNODM1MF9BVVhfQ09FRkY7Cit9CisKK3N0YXRpYyBpbnQgd204MzUwX3JlYWRfbGluZV91dm9sdHMoc3RydWN0IHdtODM1MCAqd204MzUwKQoreworCXJldHVybiB3bTgzNTBfcmVhZF9hdXhhZGMod204MzUwLCBXTTgzNTBfQVVYQURDX0xJTkUsIDAsIDApCisJCSogV004MzUwX0FVWF9DT0VGRjsKK30KKworc3RhdGljIGludCB3bTgzNTBfcmVhZF91c2JfdXZvbHRzKHN0cnVjdCB3bTgzNTAgKndtODM1MCkKK3sKKwlyZXR1cm4gd204MzUwX3JlYWRfYXV4YWRjKHdtODM1MCwgV004MzUwX0FVWEFEQ19VU0IsIDAsIDApCisJCSogV004MzUwX0FVWF9DT0VGRjsKK30KKworI2RlZmluZSBXTTgzNTBfQkFUVF9TVVBQTFkJMQorI2RlZmluZSBXTTgzNTBfVVNCX1NVUFBMWQkyCisjZGVmaW5lIFdNODM1MF9MSU5FX1NVUFBMWQk0CisKK3N0YXRpYyBpbmxpbmUgaW50IHdtODM1MF9jaGFyZ2VfdGltZV9taW4oc3RydWN0IHdtODM1MCAqd204MzUwLCBpbnQgbWluKQoreworCWlmICghd204MzUwLT5wb3dlci5yZXZfZ19jb2VmZikKKwkJcmV0dXJuICgoKG1pbiAtIDMwKSAvIDE1KSAmIDB4ZikgPDwgODsKKwllbHNlCisJCXJldHVybiAoKChtaW4gLSAzMCkgLyAzMCkgJiAweGYpIDw8IDg7Cit9CisKK3N0YXRpYyBpbnQgd204MzUwX2dldF9zdXBwbGllcyhzdHJ1Y3Qgd204MzUwICp3bTgzNTApCit7CisJdTE2IHNtLCBvdiwgY28sIGNocmc7CisJaW50IHN1cHBsaWVzID0gMDsKKworCXNtID0gd204MzUwX3JlZ19yZWFkKHdtODM1MCwgV004MzUwX1NUQVRFX01BQ0hJTkVfU1RBVFVTKTsKKwlvdiA9IHdtODM1MF9yZWdfcmVhZCh3bTgzNTAsIFdNODM1MF9NSVNDX09WRVJSSURFUyk7CisJY28gPSB3bTgzNTBfcmVnX3JlYWQod204MzUwLCBXTTgzNTBfQ09NUEFSQVRPUl9PVkVSUklERVMpOworCWNocmcgPSB3bTgzNTBfcmVnX3JlYWQod204MzUwLCBXTTgzNTBfQkFUVEVSWV9DSEFSR0VSX0NPTlRST0xfMik7CisKKwkvKiBVU0JfU00gKi8KKwlzbSA9IChzbSAmIFdNODM1MF9VU0JfU01fTUFTSykgPj4gV004MzUwX1VTQl9TTV9TSElGVDsKKworCS8qIENIR19JU0VMICovCisJY2hyZyAmPSBXTTgzNTBfQ0hHX0lTRUxfTUFTSzsKKworCS8qIElmIHRoZSBVU0Igc3RhdGUgbWFjaGluZSBpcyBhY3RpdmUgdGhlbiB3ZSdyZSB1c2luZyB0aGF0IHdpdGggb3IKKwkgKiB3aXRob3V0IGJhdHRlcnksIG90aGVyd2lzZSBjaGVjayBmb3Igd2FsbCBzdXBwbHkgKi8KKwlpZiAoKChzbSA9PSBXTTgzNTBfVVNCX1NNXzEwMF9TTFYpIHx8CisJICAgICAoc20gPT0gV004MzUwX1VTQl9TTV81MDBfU0xWKSB8fAorCSAgICAgKHNtID09IFdNODM1MF9VU0JfU01fU1REQllfU0xWKSkKKwkgICAgJiYgIShvdiAmIFdNODM1MF9VU0JfTElNSVRfT1ZSREUpKQorCQlzdXBwbGllcyA9IFdNODM1MF9VU0JfU1VQUExZOworCWVsc2UgaWYgKCgoc20gPT0gV004MzUwX1VTQl9TTV8xMDBfU0xWKSB8fAorCQkgIChzbSA9PSBXTTgzNTBfVVNCX1NNXzUwMF9TTFYpIHx8CisJCSAgKHNtID09IFdNODM1MF9VU0JfU01fU1REQllfU0xWKSkKKwkJICYmIChvdiAmIFdNODM1MF9VU0JfTElNSVRfT1ZSREUpICYmIChjaHJnID09IDApKQorCQlzdXBwbGllcyA9IFdNODM1MF9VU0JfU1VQUExZIHwgV004MzUwX0JBVFRfU1VQUExZOworCWVsc2UgaWYgKGNvICYgV004MzUwX1dBTExfRkJfT1ZSREUpCisJCXN1cHBsaWVzID0gV004MzUwX0xJTkVfU1VQUExZOworCWVsc2UKKwkJc3VwcGxpZXMgPSBXTTgzNTBfQkFUVF9TVVBQTFk7CisKKwlyZXR1cm4gc3VwcGxpZXM7Cit9CisKK3N0YXRpYyBpbnQgd204MzUwX2NoYXJnZXJfY29uZmlnKHN0cnVjdCB3bTgzNTAgKndtODM1MCwKKwkJCQkgc3RydWN0IHdtODM1MF9jaGFyZ2VyX3BvbGljeSAqcG9saWN5KQoreworCXUxNiByZWcsIGVvY19tQSwgZmFzdF9saW1pdF9tQTsKKworCWlmICghcG9saWN5KSB7CisJCWRldl93YXJuKHdtODM1MC0+ZGV2LAorCQkJICJObyBjaGFyZ2VyIHBvbGljeSwgY2hhcmdlciBub3QgY29uZmlndXJlZC5cbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBtYWtlIHN1cmUgVVNCIGZhc3QgY2hhcmdlIGN1cnJlbnQgaXMgbm90ID4gNTAwbUEgKi8KKwlpZiAocG9saWN5LT5mYXN0X2xpbWl0X1VTQl9tQSA+IDUwMCkgeworCQlkZXZfZXJyKHdtODM1MC0+ZGV2LCAiVVNCIGZhc3QgY2hhcmdlID4gNTAwbUFcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwllb2NfbUEgPSBXTTgzNTBfQ0hHX0VPQ19tQShwb2xpY3ktPmVvY19tQSk7CisKKwl3bTgzNTBfcmVnX3VubG9jayh3bTgzNTApOworCisJcmVnID0gd204MzUwX3JlZ19yZWFkKHdtODM1MCwgV004MzUwX0JBVFRFUllfQ0hBUkdFUl9DT05UUk9MXzEpCisJCSYgV004MzUwX0NIR19FTkFfUjE2ODsKKwl3bTgzNTBfcmVnX3dyaXRlKHdtODM1MCwgV004MzUwX0JBVFRFUllfQ0hBUkdFUl9DT05UUk9MXzEsCisJCQkgcmVnIHwgZW9jX21BIHwgcG9saWN5LT50cmlja2xlX3N0YXJ0X21WIHwKKwkJCSBXTTgzNTBfQ0hHX1RSSUNLTEVfVEVNUF9DSE9LRSB8CisJCQkgV004MzUwX0NIR19UUklDS0xFX1VTQl9DSE9LRSB8CisJCQkgV004MzUwX0NIR19GQVNUX1VTQl9USFJPVFRMRSk7CisKKwlpZiAod204MzUwX2dldF9zdXBwbGllcyh3bTgzNTApICYgV004MzUwX1VTQl9TVVBQTFkpIHsKKwkJZmFzdF9saW1pdF9tQSA9CisJCQlXTTgzNTBfQ0hHX0ZBU1RfTElNSVRfbUEocG9saWN5LT5mYXN0X2xpbWl0X1VTQl9tQSk7CisJCXdtODM1MF9yZWdfd3JpdGUod204MzUwLCBXTTgzNTBfQkFUVEVSWV9DSEFSR0VSX0NPTlRST0xfMiwKKwkJCSAgICBwb2xpY3ktPmNoYXJnZV9tViB8IHBvbGljeS0+dHJpY2tsZV9jaGFyZ2VfVVNCX21BIHwKKwkJCSAgICBmYXN0X2xpbWl0X21BIHwgd204MzUwX2NoYXJnZV90aW1lX21pbih3bTgzNTAsCisJCQkJCQlwb2xpY3ktPmNoYXJnZV90aW1lb3V0KSk7CisKKwl9IGVsc2UgeworCQlmYXN0X2xpbWl0X21BID0KKwkJCVdNODM1MF9DSEdfRkFTVF9MSU1JVF9tQShwb2xpY3ktPmZhc3RfbGltaXRfbUEpOworCQl3bTgzNTBfcmVnX3dyaXRlKHdtODM1MCwgV004MzUwX0JBVFRFUllfQ0hBUkdFUl9DT05UUk9MXzIsCisJCQkgICAgcG9saWN5LT5jaGFyZ2VfbVYgfCBwb2xpY3ktPnRyaWNrbGVfY2hhcmdlX21BIHwKKwkJCSAgICBmYXN0X2xpbWl0X21BIHwgd204MzUwX2NoYXJnZV90aW1lX21pbih3bTgzNTAsCisJCQkJCQlwb2xpY3ktPmNoYXJnZV90aW1lb3V0KSk7CisJfQorCisJd204MzUwX3JlZ19sb2NrKHdtODM1MCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd204MzUwX2JhdHRfc3RhdHVzKHN0cnVjdCB3bTgzNTAgKndtODM1MCkKK3sKKwl1MTYgc3RhdGU7CisKKwlzdGF0ZSA9IHdtODM1MF9yZWdfcmVhZCh3bTgzNTAsIFdNODM1MF9CQVRURVJZX0NIQVJHRVJfQ09OVFJPTF8yKTsKKwlzdGF0ZSAmPSBXTTgzNTBfQ0hHX1NUU19NQVNLOworCisJc3dpdGNoIChzdGF0ZSkgeworCWNhc2UgV004MzUwX0NIR19TVFNfT0ZGOgorCQlyZXR1cm4gUE9XRVJfU1VQUExZX1NUQVRVU19ESVNDSEFSR0lORzsKKworCWNhc2UgV004MzUwX0NIR19TVFNfVFJJQ0tMRToKKwljYXNlIFdNODM1MF9DSEdfU1RTX0ZBU1Q6CisJCXJldHVybiBQT1dFUl9TVVBQTFlfU1RBVFVTX0NIQVJHSU5HOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIFBPV0VSX1NVUFBMWV9TVEFUVVNfVU5LTk9XTjsKKwl9Cit9CisKK3N0YXRpYyBzc2l6ZV90IGNoYXJnZXJfc3RhdGVfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IHdtODM1MCAqd204MzUwID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJY2hhciAqY2hhcmdlOworCWludCBzdGF0ZTsKKworCXN0YXRlID0gd204MzUwX3JlZ19yZWFkKHdtODM1MCwgV004MzUwX0JBVFRFUllfQ0hBUkdFUl9DT05UUk9MXzIpICYKKwkgICAgV004MzUwX0NIR19TVFNfTUFTSzsKKwlzd2l0Y2ggKHN0YXRlKSB7CisJY2FzZSBXTTgzNTBfQ0hHX1NUU19PRkY6CisJCWNoYXJnZSA9ICJDaGFyZ2VyIE9mZiI7CisJCWJyZWFrOworCWNhc2UgV004MzUwX0NIR19TVFNfVFJJQ0tMRToKKwkJY2hhcmdlID0gIlRyaWNrbGUgQ2hhcmdpbmciOworCQlicmVhazsKKwljYXNlIFdNODM1MF9DSEdfU1RTX0ZBU1Q6CisJCWNoYXJnZSA9ICJGYXN0IENoYXJnaW5nIjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXNcbiIsIGNoYXJnZSk7Cit9CisKK3N0YXRpYyBERVZJQ0VfQVRUUihjaGFyZ2VyX3N0YXRlLCAwNDQ0LCBjaGFyZ2VyX3N0YXRlX3Nob3csIE5VTEwpOworCitzdGF0aWMgdm9pZCB3bTgzNTBfY2hhcmdlcl9oYW5kbGVyKHN0cnVjdCB3bTgzNTAgKndtODM1MCwgaW50IGlycSwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3Qgd204MzUwX3Bvd2VyICpwb3dlciA9ICZ3bTgzNTAtPnBvd2VyOworCXN0cnVjdCB3bTgzNTBfY2hhcmdlcl9wb2xpY3kgKnBvbGljeSA9IHBvd2VyLT5wb2xpY3k7CisKKwlzd2l0Y2ggKGlycSkgeworCWNhc2UgV004MzUwX0lSUV9DSEdfQkFUX0ZBSUw6CisJCWRldl9lcnIod204MzUwLT5kZXYsICJiYXR0ZXJ5IGZhaWxlZFxuIik7CisJCWJyZWFrOworCWNhc2UgV004MzUwX0lSUV9DSEdfVE86CisJCWRldl9lcnIod204MzUwLT5kZXYsICJjaGFyZ2VyIHRpbWVvdXRcbiIpOworCQlwb3dlcl9zdXBwbHlfY2hhbmdlZCgmcG93ZXItPmJhdHRlcnkpOworCQlicmVhazsKKworCWNhc2UgV004MzUwX0lSUV9DSEdfQkFUX0hPVDoKKwljYXNlIFdNODM1MF9JUlFfQ0hHX0JBVF9DT0xEOgorCWNhc2UgV004MzUwX0lSUV9DSEdfU1RBUlQ6CisJY2FzZSBXTTgzNTBfSVJRX0NIR19FTkQ6CisJCXBvd2VyX3N1cHBseV9jaGFuZ2VkKCZwb3dlci0+YmF0dGVyeSk7CisJCWJyZWFrOworCisJY2FzZSBXTTgzNTBfSVJRX0NIR19GQVNUX1JEWToKKwkJZGV2X2RiZyh3bTgzNTAtPmRldiwgImZhc3QgY2hhcmdlciByZWFkeVxuIik7CisJCXdtODM1MF9jaGFyZ2VyX2NvbmZpZyh3bTgzNTAsIHBvbGljeSk7CisJCXdtODM1MF9yZWdfdW5sb2NrKHdtODM1MCk7CisJCXdtODM1MF9zZXRfYml0cyh3bTgzNTAsIFdNODM1MF9CQVRURVJZX0NIQVJHRVJfQ09OVFJPTF8xLAorCQkJCVdNODM1MF9DSEdfRkFTVCk7CisJCXdtODM1MF9yZWdfbG9jayh3bTgzNTApOworCQlicmVhazsKKworCWNhc2UgV004MzUwX0lSUV9DSEdfVkJBVFRfTFRfM1A5OgorCQlkZXZfd2Fybih3bTgzNTAtPmRldiwgImJhdHRlcnkgPCAzLjlWXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBXTTgzNTBfSVJRX0NIR19WQkFUVF9MVF8zUDE6CisJCWRldl93YXJuKHdtODM1MC0+ZGV2LCAiYmF0dGVyeSA8IDMuMVZcbiIpOworCQlicmVhazsKKwljYXNlIFdNODM1MF9JUlFfQ0hHX1ZCQVRUX0xUXzJQODU6CisJCWRldl93YXJuKHdtODM1MC0+ZGV2LCAiYmF0dGVyeSA8IDIuODVWXG4iKTsKKwkJYnJlYWs7CisKKwkJLyogU3VwcGx5IGNoYW5nZS4gIFdlIHdpbGwgb3Zlcm5vdGlmeSBidXQgaXQgc2hvdWxkIGRvCisJCSAqIG5vIGhhcm0uICovCisJY2FzZSBXTTgzNTBfSVJRX0VYVF9VU0JfRkI6CisJY2FzZSBXTTgzNTBfSVJRX0VYVF9XQUxMX0ZCOgorCQl3bTgzNTBfY2hhcmdlcl9jb25maWcod204MzUwLCBwb2xpY3kpOworCWNhc2UgV004MzUwX0lSUV9FWFRfQkFUX0ZCOiAgIC8qIEZhbGwgdGhyb3VnaCAqLworCQlwb3dlcl9zdXBwbHlfY2hhbmdlZCgmcG93ZXItPmJhdHRlcnkpOworCQlwb3dlcl9zdXBwbHlfY2hhbmdlZCgmcG93ZXItPnVzYik7CisJCXBvd2VyX3N1cHBseV9jaGFuZ2VkKCZwb3dlci0+YWMpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWRldl9lcnIod204MzUwLT5kZXYsICJVbmtub3duIGludGVycnVwdCAlZFxuIiwgaXJxKTsKKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCQlBQyBQb3dlcgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgd204MzUwX2FjX2dldF9wcm9wKHN0cnVjdCBwb3dlcl9zdXBwbHkgKnBzeSwKKwkJCSAgICAgIGVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IHBzcCwKKwkJCSAgICAgIHVuaW9uIHBvd2VyX3N1cHBseV9wcm9wdmFsICp2YWwpCit7CisJc3RydWN0IHdtODM1MCAqd204MzUwID0gZGV2X2dldF9kcnZkYXRhKHBzeS0+ZGV2LT5wYXJlbnQpOworCWludCByZXQgPSAwOworCisJc3dpdGNoIChwc3ApIHsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX09OTElORToKKwkJdmFsLT5pbnR2YWwgPSAhISh3bTgzNTBfZ2V0X3N1cHBsaWVzKHdtODM1MCkgJgorCQkJCSBXTTgzNTBfTElORV9TVVBQTFkpOworCQlicmVhazsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfTk9XOgorCQl2YWwtPmludHZhbCA9IHdtODM1MF9yZWFkX2xpbmVfdXZvbHRzKHdtODM1MCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IC1FSU5WQUw7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgd204MzUwX2FjX3Byb3BzW10gPSB7CisJUE9XRVJfU1VQUExZX1BST1BfT05MSU5FLAorCVBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfTk9XLAorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJCVVTQiBQb3dlcgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgd204MzUwX3VzYl9nZXRfcHJvcChzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3ksCisJCQkgICAgICAgZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgcHNwLAorCQkJICAgICAgIHVuaW9uIHBvd2VyX3N1cHBseV9wcm9wdmFsICp2YWwpCit7CisJc3RydWN0IHdtODM1MCAqd204MzUwID0gZGV2X2dldF9kcnZkYXRhKHBzeS0+ZGV2LT5wYXJlbnQpOworCWludCByZXQgPSAwOworCisJc3dpdGNoIChwc3ApIHsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX09OTElORToKKwkJdmFsLT5pbnR2YWwgPSAhISh3bTgzNTBfZ2V0X3N1cHBsaWVzKHdtODM1MCkgJgorCQkJCSBXTTgzNTBfVVNCX1NVUFBMWSk7CisJCWJyZWFrOworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9OT1c6CisJCXZhbC0+aW50dmFsID0gd204MzUwX3JlYWRfdXNiX3V2b2x0cyh3bTgzNTApOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSAtRUlOVkFMOworCQlicmVhazsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IHdtODM1MF91c2JfcHJvcHNbXSA9IHsKKwlQT1dFUl9TVVBQTFlfUFJPUF9PTkxJTkUsCisJUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9OT1csCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkJQmF0dGVyeSBwcm9wZXJ0aWVzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50IHdtODM1MF9iYXRfY2hlY2tfaGVhbHRoKHN0cnVjdCB3bTgzNTAgKndtODM1MCkKK3sKKwl1MTYgcmVnOworCisJaWYgKHdtODM1MF9yZWFkX2JhdHRlcnlfdXZvbHRzKHdtODM1MCkgPCAyODUwMDAwKQorCQlyZXR1cm4gUE9XRVJfU1VQUExZX0hFQUxUSF9VTlNQRUNfRkFJTFVSRTsKKworCXJlZyA9IHdtODM1MF9yZWdfcmVhZCh3bTgzNTAsIFdNODM1MF9DSEFSR0VSX09WRVJSSURFUyk7CisJaWYgKHJlZyAmIFdNODM1MF9DSEdfQkFUVF9IT1RfT1ZSREUpCisJCXJldHVybiBQT1dFUl9TVVBQTFlfSEVBTFRIX09WRVJIRUFUOworCisJaWYgKHJlZyAmIFdNODM1MF9DSEdfQkFUVF9DT0xEX09WUkRFKQorCQlyZXR1cm4gUE9XRVJfU1VQUExZX0hFQUxUSF9DT0xEOworCisJcmV0dXJuIFBPV0VSX1NVUFBMWV9IRUFMVEhfR09PRDsKK30KKworc3RhdGljIGludCB3bTgzNTBfYmF0X2dldF9wcm9wZXJ0eShzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3ksCisJCQkJICAgZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgcHNwLAorCQkJCSAgIHVuaW9uIHBvd2VyX3N1cHBseV9wcm9wdmFsICp2YWwpCit7CisJc3RydWN0IHdtODM1MCAqd204MzUwID0gZGV2X2dldF9kcnZkYXRhKHBzeS0+ZGV2LT5wYXJlbnQpOworCWludCByZXQgPSAwOworCisJc3dpdGNoIChwc3ApIHsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1NUQVRVUzoKKwkJdmFsLT5pbnR2YWwgPSB3bTgzNTBfYmF0dF9zdGF0dXMod204MzUwKTsKKwkJYnJlYWs7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9PTkxJTkU6CisJCXZhbC0+aW50dmFsID0gISEod204MzUwX2dldF9zdXBwbGllcyh3bTgzNTApICYKKwkJCQkgV004MzUwX0JBVFRfU1VQUExZKTsKKwkJYnJlYWs7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX05PVzoKKwkJdmFsLT5pbnR2YWwgPSB3bTgzNTBfcmVhZF9iYXR0ZXJ5X3V2b2x0cyh3bTgzNTApOworCQlicmVhazsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0hFQUxUSDoKKwkJdmFsLT5pbnR2YWwgPSB3bTgzNTBfYmF0X2NoZWNrX2hlYWx0aCh3bTgzNTApOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSAtRUlOVkFMOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgd204MzUwX2JhdF9wcm9wc1tdID0geworCVBPV0VSX1NVUFBMWV9QUk9QX1NUQVRVUywKKwlQT1dFUl9TVVBQTFlfUFJPUF9PTkxJTkUsCisJUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9OT1csCisJUE9XRVJfU1VQUExZX1BST1BfSEVBTFRILAorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJCUluaXRpYWxpc2F0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCB3bTgzNTBfaW5pdF9jaGFyZ2VyKHN0cnVjdCB3bTgzNTAgKndtODM1MCkKK3sKKwkvKiByZWdpc3RlciBvdXIgaW50ZXJlc3QgaW4gY2hhcmdlciBldmVudHMgKi8KKwl3bTgzNTBfcmVnaXN0ZXJfaXJxKHdtODM1MCwgV004MzUwX0lSUV9DSEdfQkFUX0hPVCwKKwkJCSAgICB3bTgzNTBfY2hhcmdlcl9oYW5kbGVyLCBOVUxMKTsKKwl3bTgzNTBfdW5tYXNrX2lycSh3bTgzNTAsIFdNODM1MF9JUlFfQ0hHX0JBVF9IT1QpOworCXdtODM1MF9yZWdpc3Rlcl9pcnEod204MzUwLCBXTTgzNTBfSVJRX0NIR19CQVRfQ09MRCwKKwkJCSAgICB3bTgzNTBfY2hhcmdlcl9oYW5kbGVyLCBOVUxMKTsKKwl3bTgzNTBfdW5tYXNrX2lycSh3bTgzNTAsIFdNODM1MF9JUlFfQ0hHX0JBVF9DT0xEKTsKKwl3bTgzNTBfcmVnaXN0ZXJfaXJxKHdtODM1MCwgV004MzUwX0lSUV9DSEdfQkFUX0ZBSUwsCisJCQkgICAgd204MzUwX2NoYXJnZXJfaGFuZGxlciwgTlVMTCk7CisJd204MzUwX3VubWFza19pcnEod204MzUwLCBXTTgzNTBfSVJRX0NIR19CQVRfRkFJTCk7CisJd204MzUwX3JlZ2lzdGVyX2lycSh3bTgzNTAsIFdNODM1MF9JUlFfQ0hHX1RPLAorCQkJICAgIHdtODM1MF9jaGFyZ2VyX2hhbmRsZXIsIE5VTEwpOworCXdtODM1MF91bm1hc2tfaXJxKHdtODM1MCwgV004MzUwX0lSUV9DSEdfVE8pOworCXdtODM1MF9yZWdpc3Rlcl9pcnEod204MzUwLCBXTTgzNTBfSVJRX0NIR19FTkQsCisJCQkgICAgd204MzUwX2NoYXJnZXJfaGFuZGxlciwgTlVMTCk7CisJd204MzUwX3VubWFza19pcnEod204MzUwLCBXTTgzNTBfSVJRX0NIR19FTkQpOworCXdtODM1MF9yZWdpc3Rlcl9pcnEod204MzUwLCBXTTgzNTBfSVJRX0NIR19TVEFSVCwKKwkJCSAgICB3bTgzNTBfY2hhcmdlcl9oYW5kbGVyLCBOVUxMKTsKKwl3bTgzNTBfdW5tYXNrX2lycSh3bTgzNTAsIFdNODM1MF9JUlFfQ0hHX1NUQVJUKTsKKwl3bTgzNTBfcmVnaXN0ZXJfaXJxKHdtODM1MCwgV004MzUwX0lSUV9DSEdfRkFTVF9SRFksCisJCQkgICAgd204MzUwX2NoYXJnZXJfaGFuZGxlciwgTlVMTCk7CisJd204MzUwX3VubWFza19pcnEod204MzUwLCBXTTgzNTBfSVJRX0NIR19GQVNUX1JEWSk7CisJd204MzUwX3JlZ2lzdGVyX2lycSh3bTgzNTAsIFdNODM1MF9JUlFfQ0hHX1ZCQVRUX0xUXzNQOSwKKwkJCSAgICB3bTgzNTBfY2hhcmdlcl9oYW5kbGVyLCBOVUxMKTsKKwl3bTgzNTBfdW5tYXNrX2lycSh3bTgzNTAsIFdNODM1MF9JUlFfQ0hHX1ZCQVRUX0xUXzNQOSk7CisJd204MzUwX3JlZ2lzdGVyX2lycSh3bTgzNTAsIFdNODM1MF9JUlFfQ0hHX1ZCQVRUX0xUXzNQMSwKKwkJCSAgICB3bTgzNTBfY2hhcmdlcl9oYW5kbGVyLCBOVUxMKTsKKwl3bTgzNTBfdW5tYXNrX2lycSh3bTgzNTAsIFdNODM1MF9JUlFfQ0hHX1ZCQVRUX0xUXzNQMSk7CisJd204MzUwX3JlZ2lzdGVyX2lycSh3bTgzNTAsIFdNODM1MF9JUlFfQ0hHX1ZCQVRUX0xUXzJQODUsCisJCQkgICAgd204MzUwX2NoYXJnZXJfaGFuZGxlciwgTlVMTCk7CisJd204MzUwX3VubWFza19pcnEod204MzUwLCBXTTgzNTBfSVJRX0NIR19WQkFUVF9MVF8yUDg1KTsKKworCS8qIGFuZCBzdXBwbHkgY2hhbmdlIGV2ZW50cyAqLworCXdtODM1MF9yZWdpc3Rlcl9pcnEod204MzUwLCBXTTgzNTBfSVJRX0VYVF9VU0JfRkIsCisJCQkgICAgd204MzUwX2NoYXJnZXJfaGFuZGxlciwgTlVMTCk7CisJd204MzUwX3VubWFza19pcnEod204MzUwLCBXTTgzNTBfSVJRX0VYVF9VU0JfRkIpOworCXdtODM1MF9yZWdpc3Rlcl9pcnEod204MzUwLCBXTTgzNTBfSVJRX0VYVF9XQUxMX0ZCLAorCQkJICAgIHdtODM1MF9jaGFyZ2VyX2hhbmRsZXIsIE5VTEwpOworCXdtODM1MF91bm1hc2tfaXJxKHdtODM1MCwgV004MzUwX0lSUV9FWFRfV0FMTF9GQik7CisJd204MzUwX3JlZ2lzdGVyX2lycSh3bTgzNTAsIFdNODM1MF9JUlFfRVhUX0JBVF9GQiwKKwkJCSAgICB3bTgzNTBfY2hhcmdlcl9oYW5kbGVyLCBOVUxMKTsKKwl3bTgzNTBfdW5tYXNrX2lycSh3bTgzNTAsIFdNODM1MF9JUlFfRVhUX0JBVF9GQik7Cit9CisKK3N0YXRpYyB2b2lkIGZyZWVfY2hhcmdlcl9pcnEoc3RydWN0IHdtODM1MCAqd204MzUwKQoreworCXdtODM1MF9tYXNrX2lycSh3bTgzNTAsIFdNODM1MF9JUlFfQ0hHX0JBVF9IT1QpOworCXdtODM1MF9mcmVlX2lycSh3bTgzNTAsIFdNODM1MF9JUlFfQ0hHX0JBVF9IT1QpOworCXdtODM1MF9tYXNrX2lycSh3bTgzNTAsIFdNODM1MF9JUlFfQ0hHX0JBVF9DT0xEKTsKKwl3bTgzNTBfZnJlZV9pcnEod204MzUwLCBXTTgzNTBfSVJRX0NIR19CQVRfQ09MRCk7CisJd204MzUwX21hc2tfaXJxKHdtODM1MCwgV004MzUwX0lSUV9DSEdfQkFUX0ZBSUwpOworCXdtODM1MF9mcmVlX2lycSh3bTgzNTAsIFdNODM1MF9JUlFfQ0hHX0JBVF9GQUlMKTsKKwl3bTgzNTBfbWFza19pcnEod204MzUwLCBXTTgzNTBfSVJRX0NIR19UTyk7CisJd204MzUwX2ZyZWVfaXJxKHdtODM1MCwgV004MzUwX0lSUV9DSEdfVE8pOworCXdtODM1MF9tYXNrX2lycSh3bTgzNTAsIFdNODM1MF9JUlFfQ0hHX0VORCk7CisJd204MzUwX2ZyZWVfaXJxKHdtODM1MCwgV004MzUwX0lSUV9DSEdfRU5EKTsKKwl3bTgzNTBfbWFza19pcnEod204MzUwLCBXTTgzNTBfSVJRX0NIR19TVEFSVCk7CisJd204MzUwX2ZyZWVfaXJxKHdtODM1MCwgV004MzUwX0lSUV9DSEdfU1RBUlQpOworCXdtODM1MF9tYXNrX2lycSh3bTgzNTAsIFdNODM1MF9JUlFfQ0hHX1ZCQVRUX0xUXzNQOSk7CisJd204MzUwX2ZyZWVfaXJxKHdtODM1MCwgV004MzUwX0lSUV9DSEdfVkJBVFRfTFRfM1A5KTsKKwl3bTgzNTBfbWFza19pcnEod204MzUwLCBXTTgzNTBfSVJRX0NIR19WQkFUVF9MVF8zUDEpOworCXdtODM1MF9mcmVlX2lycSh3bTgzNTAsIFdNODM1MF9JUlFfQ0hHX1ZCQVRUX0xUXzNQMSk7CisJd204MzUwX21hc2tfaXJxKHdtODM1MCwgV004MzUwX0lSUV9DSEdfVkJBVFRfTFRfMlA4NSk7CisJd204MzUwX2ZyZWVfaXJxKHdtODM1MCwgV004MzUwX0lSUV9DSEdfVkJBVFRfTFRfMlA4NSk7CisJd204MzUwX21hc2tfaXJxKHdtODM1MCwgV004MzUwX0lSUV9FWFRfVVNCX0ZCKTsKKwl3bTgzNTBfZnJlZV9pcnEod204MzUwLCBXTTgzNTBfSVJRX0VYVF9VU0JfRkIpOworCXdtODM1MF9tYXNrX2lycSh3bTgzNTAsIFdNODM1MF9JUlFfRVhUX1dBTExfRkIpOworCXdtODM1MF9mcmVlX2lycSh3bTgzNTAsIFdNODM1MF9JUlFfRVhUX1dBTExfRkIpOworCXdtODM1MF9tYXNrX2lycSh3bTgzNTAsIFdNODM1MF9JUlFfRVhUX0JBVF9GQik7CisJd204MzUwX2ZyZWVfaXJxKHdtODM1MCwgV004MzUwX0lSUV9FWFRfQkFUX0ZCKTsKK30KKworc3RhdGljIF9fZGV2aW5pdCBpbnQgd204MzUwX3Bvd2VyX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHdtODM1MCAqd204MzUwID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IHdtODM1MF9wb3dlciAqcG93ZXIgPSAmd204MzUwLT5wb3dlcjsKKwlzdHJ1Y3Qgd204MzUwX2NoYXJnZXJfcG9saWN5ICpwb2xpY3kgPSBwb3dlci0+cG9saWN5OworCXN0cnVjdCBwb3dlcl9zdXBwbHkgKnVzYiA9ICZwb3dlci0+dXNiOworCXN0cnVjdCBwb3dlcl9zdXBwbHkgKmJhdHRlcnkgPSAmcG93ZXItPmJhdHRlcnk7CisJc3RydWN0IHBvd2VyX3N1cHBseSAqYWMgPSAmcG93ZXItPmFjOworCWludCByZXQ7CisKKwlhYy0+bmFtZSA9ICJ3bTgzNTAtYWMiOworCWFjLT50eXBlID0gUE9XRVJfU1VQUExZX1RZUEVfTUFJTlM7CisJYWMtPnByb3BlcnRpZXMgPSB3bTgzNTBfYWNfcHJvcHM7CisJYWMtPm51bV9wcm9wZXJ0aWVzID0gQVJSQVlfU0laRSh3bTgzNTBfYWNfcHJvcHMpOworCWFjLT5nZXRfcHJvcGVydHkgPSB3bTgzNTBfYWNfZ2V0X3Byb3A7CisJcmV0ID0gcG93ZXJfc3VwcGx5X3JlZ2lzdGVyKCZwZGV2LT5kZXYsIGFjKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJYmF0dGVyeS0+bmFtZSA9ICJ3bTgzNTAtYmF0dGVyeSI7CisJYmF0dGVyeS0+cHJvcGVydGllcyA9IHdtODM1MF9iYXRfcHJvcHM7CisJYmF0dGVyeS0+bnVtX3Byb3BlcnRpZXMgPSBBUlJBWV9TSVpFKHdtODM1MF9iYXRfcHJvcHMpOworCWJhdHRlcnktPmdldF9wcm9wZXJ0eSA9IHdtODM1MF9iYXRfZ2V0X3Byb3BlcnR5OworCWJhdHRlcnktPnVzZV9mb3JfYXBtID0gMTsKKwlyZXQgPSBwb3dlcl9zdXBwbHlfcmVnaXN0ZXIoJnBkZXYtPmRldiwgYmF0dGVyeSk7CisJaWYgKHJldCkKKwkJZ290byBiYXR0ZXJ5X2ZhaWxlZDsKKworCXVzYi0+bmFtZSA9ICJ3bTgzNTAtdXNiIiwKKwl1c2ItPnR5cGUgPSBQT1dFUl9TVVBQTFlfVFlQRV9VU0I7CisJdXNiLT5wcm9wZXJ0aWVzID0gd204MzUwX3VzYl9wcm9wczsKKwl1c2ItPm51bV9wcm9wZXJ0aWVzID0gQVJSQVlfU0laRSh3bTgzNTBfdXNiX3Byb3BzKTsKKwl1c2ItPmdldF9wcm9wZXJ0eSA9IHdtODM1MF91c2JfZ2V0X3Byb3A7CisJcmV0ID0gcG93ZXJfc3VwcGx5X3JlZ2lzdGVyKCZwZGV2LT5kZXYsIHVzYik7CisJaWYgKHJldCkKKwkJZ290byB1c2JfZmFpbGVkOworCisJcmV0ID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZwZGV2LT5kZXYsICZkZXZfYXR0cl9jaGFyZ2VyX3N0YXRlKTsKKwlpZiAocmV0IDwgMCkKKwkJZGV2X3dhcm4od204MzUwLT5kZXYsICJmYWlsZWQgdG8gYWRkIGNoYXJnZSBzeXNmczogJWRcbiIsIHJldCk7CisJcmV0ID0gMDsKKworCXdtODM1MF9pbml0X2NoYXJnZXIod204MzUwKTsKKwlpZiAod204MzUwX2NoYXJnZXJfY29uZmlnKHdtODM1MCwgcG9saWN5KSA9PSAwKSB7CisJCXdtODM1MF9yZWdfdW5sb2NrKHdtODM1MCk7CisJCXdtODM1MF9zZXRfYml0cyh3bTgzNTAsIFdNODM1MF9QT1dFUl9NR01UXzUsIFdNODM1MF9DSEdfRU5BKTsKKwkJd204MzUwX3JlZ19sb2NrKHdtODM1MCk7CisJfQorCisJcmV0dXJuIHJldDsKKwordXNiX2ZhaWxlZDoKKwlwb3dlcl9zdXBwbHlfdW5yZWdpc3RlcihiYXR0ZXJ5KTsKK2JhdHRlcnlfZmFpbGVkOgorCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKGFjKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBfX2RldmV4aXQgaW50IHdtODM1MF9wb3dlcl9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3Qgd204MzUwICp3bTgzNTAgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3Qgd204MzUwX3Bvd2VyICpwb3dlciA9ICZ3bTgzNTAtPnBvd2VyOworCisJZnJlZV9jaGFyZ2VyX2lycSh3bTgzNTApOworCWRldmljZV9yZW1vdmVfZmlsZSgmcGRldi0+ZGV2LCAmZGV2X2F0dHJfY2hhcmdlcl9zdGF0ZSk7CisJcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIoJnBvd2VyLT5iYXR0ZXJ5KTsKKwlwb3dlcl9zdXBwbHlfdW5yZWdpc3RlcigmcG93ZXItPmFjKTsKKwlwb3dlcl9zdXBwbHlfdW5yZWdpc3RlcigmcG93ZXItPnVzYik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHdtODM1MF9wb3dlcl9kcml2ZXIgPSB7CisJLnByb2JlID0gd204MzUwX3Bvd2VyX3Byb2JlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcCh3bTgzNTBfcG93ZXJfcmVtb3ZlKSwKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJ3bTgzNTAtcG93ZXIiLAorCX0sCit9OworCitzdGF0aWMgaW50IF9faW5pdCB3bTgzNTBfcG93ZXJfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJndtODM1MF9wb3dlcl9kcml2ZXIpOworfQorbW9kdWxlX2luaXQod204MzUwX3Bvd2VyX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgd204MzUwX3Bvd2VyX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3Rlcigmd204MzUwX3Bvd2VyX2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdCh3bTgzNTBfcG93ZXJfZXhpdCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9ERVNDUklQVElPTigiUG93ZXIgc3VwcGx5IGRyaXZlciBmb3IgV004MzUwIik7CitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOndtODM1MC1wb3dlciIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9yYXBpZGlvL3Jpby1kcml2ZXIuYyBiL2RyaXZlcnMvcmFwaWRpby9yaW8tZHJpdmVyLmMKaW5kZXggOTU2ZDNlNy4uYWRkYjg3YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9yYXBpZGlvL3Jpby1kcml2ZXIuYworKysgYi9kcml2ZXJzL3JhcGlkaW8vcmlvLWRyaXZlci5jCkBAIC03OSw3ICs3OSw2IEBACiAKIC8qKgogICogIHJpb19kZXZpY2VfcHJvYmUgLSBUZWxsIGlmIGEgUklPIGRldmljZSBzdHJ1Y3R1cmUgaGFzIGEgbWF0Y2hpbmcgUklPIGRldmljZSBpZCBzdHJ1Y3R1cmUKLSAqICBAaWQ6IHRoZSBSSU8gZGV2aWNlIGlkIHN0cnVjdHVyZSB0byBtYXRjaCBhZ2FpbnN0CiAgKiAgQGRldjogdGhlIFJJTyBkZXZpY2Ugc3RydWN0dXJlIHRvIG1hdGNoIGFnYWluc3QKICAqCiAgKiByZXR1cm4gMCBhbmQgc2V0IHJpb19kZXYtPmRyaXZlciB3aGVuIGRydiBjbGFpbXMgcmlvX2RldiwgZWxzZSBlcnJvcgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3IvY29yZS5jIGIvZHJpdmVycy9yZWd1bGF0b3IvY29yZS5jCmluZGV4IDAyYTc3NDQuLmY1MTFhNDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVndWxhdG9yL2NvcmUuYworKysgYi9kcml2ZXJzL3JlZ3VsYXRvci9jb3JlLmMKQEAgLTI5LDcgKzI5LDcgQEAKIHN0YXRpYyBMSVNUX0hFQUQocmVndWxhdG9yX2xpc3QpOwogc3RhdGljIExJU1RfSEVBRChyZWd1bGF0b3JfbWFwX2xpc3QpOwogCi0vKioKKy8qCiAgKiBzdHJ1Y3QgcmVndWxhdG9yX2RldgogICoKICAqIFZvbHRhZ2UgLyBDdXJyZW50IHJlZ3VsYXRvciBjbGFzcyBkZXZpY2UuIE9uZSBmb3IgZWFjaCByZWd1bGF0b3IuCkBAIC01Niw3ICs1Niw3IEBACiAJdm9pZCAqcmVnX2RhdGE7CQkvKiByZWd1bGF0b3JfZGV2IGRhdGEgKi8KIH07CiAKLS8qKgorLyoKICAqIHN0cnVjdCByZWd1bGF0b3JfbWFwCiAgKgogICogVXNlZCB0byBwcm92aWRlIHN5bWJvbGljIHN1cHBseSBuYW1lcyB0byBkZXZpY2VzLgpAQCAtNzksNyArNzksNyBAQAogCWludCB1QV9sb2FkOwogCWludCBtaW5fdVY7CiAJaW50IG1heF91VjsKLQlpbnQgZW5hYmxlZDsgLyogY2xpZW50IGhhcyBjYWxsZWQgZW5hYmxlZCAqLworCWludCBlbmFibGVkOyAvKiBjb3VudCBvZiBjbGllbnQgZW5hYmxlcyAqLwogCWNoYXIgKnN1cHBseV9uYW1lOwogCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIGRldl9hdHRyOwogCXN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2OwpAQCAtMTc0LDYgKzE3NCwxNiBAQAogLyogb3BlcmF0aW5nIG1vZGUgY29uc3RyYWludCBjaGVjayAqLwogc3RhdGljIGludCByZWd1bGF0b3JfY2hlY2tfbW9kZShzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldiwgaW50IG1vZGUpCiB7CisJc3dpdGNoIChtb2RlKSB7CisJY2FzZSBSRUdVTEFUT1JfTU9ERV9GQVNUOgorCWNhc2UgUkVHVUxBVE9SX01PREVfTk9STUFMOgorCWNhc2UgUkVHVUxBVE9SX01PREVfSURMRToKKwljYXNlIFJFR1VMQVRPUl9NT0RFX1NUQU5EQlk6CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKwogCWlmICghcmRldi0+Y29uc3RyYWludHMpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogbm8gY29uc3RyYWludHMgZm9yICVzXG4iLCBfX2Z1bmNfXywKIAkJICAgICAgIHJkZXYtPmRlc2MtPm5hbWUpOwpAQCAtMjMyLDYgKzI0Miw3IEBACiAKIAlyZXR1cm4gcmV0OwogfQorc3RhdGljIERFVklDRV9BVFRSKG1pY3Jvdm9sdHMsIDA0NDQsIHJlZ3VsYXRvcl91Vl9zaG93LCBOVUxMKTsKIAogc3RhdGljIHNzaXplX3QgcmVndWxhdG9yX3VBX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAogCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCkBAIC0yNDAsNiArMjUxLDcgQEAKIAogCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBfcmVndWxhdG9yX2dldF9jdXJyZW50X2xpbWl0KHJkZXYpKTsKIH0KK3N0YXRpYyBERVZJQ0VfQVRUUihtaWNyb2FtcHMsIDA0NDQsIHJlZ3VsYXRvcl91QV9zaG93LCBOVUxMKTsKIAogc3RhdGljIHNzaXplX3QgcmVndWxhdG9yX25hbWVfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCQkgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCkBAIC0yNTcsMTIgKzI2OSw4IEBACiAJcmV0dXJuIHNwcmludGYoYnVmLCAiJXNcbiIsIG5hbWUpOwogfQogCi1zdGF0aWMgc3NpemVfdCByZWd1bGF0b3Jfb3Btb2RlX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAotCQkJCSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQorc3RhdGljIHNzaXplX3QgcmVndWxhdG9yX3ByaW50X29wbW9kZShjaGFyICpidWYsIGludCBtb2RlKQogewotCXN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0JaW50IG1vZGUgPSBfcmVndWxhdG9yX2dldF9tb2RlKHJkZXYpOwotCiAJc3dpdGNoIChtb2RlKSB7CiAJY2FzZSBSRUdVTEFUT1JfTU9ERV9GQVNUOgogCQlyZXR1cm4gc3ByaW50ZihidWYsICJmYXN0XG4iKTsKQEAgLTI3NiwxMiArMjg0LDE3IEBACiAJcmV0dXJuIHNwcmludGYoYnVmLCAidW5rbm93blxuIik7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IHJlZ3VsYXRvcl9zdGF0ZV9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQorc3RhdGljIHNzaXplX3QgcmVndWxhdG9yX29wbW9kZV9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKIAlzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCWludCBzdGF0ZSA9IF9yZWd1bGF0b3JfaXNfZW5hYmxlZChyZGV2KTsKIAorCXJldHVybiByZWd1bGF0b3JfcHJpbnRfb3Btb2RlKGJ1ZiwgX3JlZ3VsYXRvcl9nZXRfbW9kZShyZGV2KSk7Cit9CitzdGF0aWMgREVWSUNFX0FUVFIob3Btb2RlLCAwNDQ0LCByZWd1bGF0b3Jfb3Btb2RlX3Nob3csIE5VTEwpOworCitzdGF0aWMgc3NpemVfdCByZWd1bGF0b3JfcHJpbnRfc3RhdGUoY2hhciAqYnVmLCBpbnQgc3RhdGUpCit7CiAJaWYgKHN0YXRlID4gMCkKIAkJcmV0dXJuIHNwcmludGYoYnVmLCAiZW5hYmxlZFxuIik7CiAJZWxzZSBpZiAoc3RhdGUgPT0gMCkKQEAgLTI5MCw2ICszMDMsMTUgQEAKIAkJcmV0dXJuIHNwcmludGYoYnVmLCAidW5rbm93blxuIik7CiB9CiAKK3N0YXRpYyBzc2l6ZV90IHJlZ3VsYXRvcl9zdGF0ZV9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisKKwlyZXR1cm4gcmVndWxhdG9yX3ByaW50X3N0YXRlKGJ1ZiwgX3JlZ3VsYXRvcl9pc19lbmFibGVkKHJkZXYpKTsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUihzdGF0ZSwgMDQ0NCwgcmVndWxhdG9yX3N0YXRlX3Nob3csIE5VTEwpOworCiBzdGF0aWMgc3NpemVfdCByZWd1bGF0b3JfbWluX3VBX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAogCQkJCSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewpAQCAtMzAwLDYgKzMyMiw3IEBACiAKIAlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgcmRldi0+Y29uc3RyYWludHMtPm1pbl91QSk7CiB9CitzdGF0aWMgREVWSUNFX0FUVFIobWluX21pY3JvYW1wcywgMDQ0NCwgcmVndWxhdG9yX21pbl91QV9zaG93LCBOVUxMKTsKIAogc3RhdGljIHNzaXplX3QgcmVndWxhdG9yX21heF91QV9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCQkgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKQEAgLTMxMSw2ICszMzQsNyBAQAogCiAJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHJkZXYtPmNvbnN0cmFpbnRzLT5tYXhfdUEpOwogfQorc3RhdGljIERFVklDRV9BVFRSKG1heF9taWNyb2FtcHMsIDA0NDQsIHJlZ3VsYXRvcl9tYXhfdUFfc2hvdywgTlVMTCk7CiAKIHN0YXRpYyBzc2l6ZV90IHJlZ3VsYXRvcl9taW5fdVZfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCQkJICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCkBAIC0zMjIsNiArMzQ2LDcgQEAKIAogCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCByZGV2LT5jb25zdHJhaW50cy0+bWluX3VWKTsKIH0KK3N0YXRpYyBERVZJQ0VfQVRUUihtaW5fbWljcm92b2x0cywgMDQ0NCwgcmVndWxhdG9yX21pbl91Vl9zaG93LCBOVUxMKTsKIAogc3RhdGljIHNzaXplX3QgcmVndWxhdG9yX21heF91Vl9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCQkgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKQEAgLTMzMyw2ICszNTgsNyBAQAogCiAJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHJkZXYtPmNvbnN0cmFpbnRzLT5tYXhfdVYpOwogfQorc3RhdGljIERFVklDRV9BVFRSKG1heF9taWNyb3ZvbHRzLCAwNDQ0LCByZWd1bGF0b3JfbWF4X3VWX3Nob3csIE5VTEwpOwogCiBzdGF0aWMgc3NpemVfdCByZWd1bGF0b3JfdG90YWxfdUFfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCQkJICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKQEAgLTM0Nyw2ICszNzMsNyBAQAogCW11dGV4X3VubG9jaygmcmRldi0+bXV0ZXgpOwogCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCB1QSk7CiB9CitzdGF0aWMgREVWSUNFX0FUVFIocmVxdWVzdGVkX21pY3JvYW1wcywgMDQ0NCwgcmVndWxhdG9yX3RvdGFsX3VBX3Nob3csIE5VTEwpOwogCiBzdGF0aWMgc3NpemVfdCByZWd1bGF0b3JfbnVtX3VzZXJzX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAogCQkJCSAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCkBAIC0zNzQsMTUzICs0MDEsMTA2IEBACiB7CiAJc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAotCWlmICghcmRldi0+Y29uc3RyYWludHMpCi0JCXJldHVybiBzcHJpbnRmKGJ1ZiwgIm5vdCBkZWZpbmVkXG4iKTsKIAlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgcmRldi0+Y29uc3RyYWludHMtPnN0YXRlX21lbS51Vik7CiB9CitzdGF0aWMgREVWSUNFX0FUVFIoc3VzcGVuZF9tZW1fbWljcm92b2x0cywgMDQ0NCwKKwkJcmVndWxhdG9yX3N1c3BlbmRfbWVtX3VWX3Nob3csIE5VTEwpOwogCiBzdGF0aWMgc3NpemVfdCByZWd1bGF0b3Jfc3VzcGVuZF9kaXNrX3VWX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAogCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7CiAJc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAotCWlmICghcmRldi0+Y29uc3RyYWludHMpCi0JCXJldHVybiBzcHJpbnRmKGJ1ZiwgIm5vdCBkZWZpbmVkXG4iKTsKIAlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgcmRldi0+Y29uc3RyYWludHMtPnN0YXRlX2Rpc2sudVYpOwogfQorc3RhdGljIERFVklDRV9BVFRSKHN1c3BlbmRfZGlza19taWNyb3ZvbHRzLCAwNDQ0LAorCQlyZWd1bGF0b3Jfc3VzcGVuZF9kaXNrX3VWX3Nob3csIE5VTEwpOwogCiBzdGF0aWMgc3NpemVfdCByZWd1bGF0b3Jfc3VzcGVuZF9zdGFuZGJ5X3VWX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAogCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7CiAJc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAotCWlmICghcmRldi0+Y29uc3RyYWludHMpCi0JCXJldHVybiBzcHJpbnRmKGJ1ZiwgIm5vdCBkZWZpbmVkXG4iKTsKIAlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgcmRldi0+Y29uc3RyYWludHMtPnN0YXRlX3N0YW5kYnkudVYpOwogfQotCi1zdGF0aWMgc3NpemVfdCBzdXNwZW5kX29wbW9kZV9zaG93KHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2LAotCXVuc2lnbmVkIGludCBtb2RlLCBjaGFyICpidWYpCi17Ci0Jc3dpdGNoIChtb2RlKSB7Ci0JY2FzZSBSRUdVTEFUT1JfTU9ERV9GQVNUOgotCQlyZXR1cm4gc3ByaW50ZihidWYsICJmYXN0XG4iKTsKLQljYXNlIFJFR1VMQVRPUl9NT0RFX05PUk1BTDoKLQkJcmV0dXJuIHNwcmludGYoYnVmLCAibm9ybWFsXG4iKTsKLQljYXNlIFJFR1VMQVRPUl9NT0RFX0lETEU6Ci0JCXJldHVybiBzcHJpbnRmKGJ1ZiwgImlkbGVcbiIpOwotCWNhc2UgUkVHVUxBVE9SX01PREVfU1RBTkRCWToKLQkJcmV0dXJuIHNwcmludGYoYnVmLCAic3RhbmRieVxuIik7Ci0JfQotCXJldHVybiBzcHJpbnRmKGJ1ZiwgInVua25vd25cbiIpOwotfQorc3RhdGljIERFVklDRV9BVFRSKHN1c3BlbmRfc3RhbmRieV9taWNyb3ZvbHRzLCAwNDQ0LAorCQlyZWd1bGF0b3Jfc3VzcGVuZF9zdGFuZGJ5X3VWX3Nob3csIE5VTEwpOwogCiBzdGF0aWMgc3NpemVfdCByZWd1bGF0b3Jfc3VzcGVuZF9tZW1fbW9kZV9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewogCXN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiAKLQlpZiAoIXJkZXYtPmNvbnN0cmFpbnRzKQotCQlyZXR1cm4gc3ByaW50ZihidWYsICJub3QgZGVmaW5lZFxuIik7Ci0JcmV0dXJuIHN1c3BlbmRfb3Btb2RlX3Nob3cocmRldiwKLQkJcmRldi0+Y29uc3RyYWludHMtPnN0YXRlX21lbS5tb2RlLCBidWYpOworCXJldHVybiByZWd1bGF0b3JfcHJpbnRfb3Btb2RlKGJ1ZiwKKwkJcmRldi0+Y29uc3RyYWludHMtPnN0YXRlX21lbS5tb2RlKTsKIH0KK3N0YXRpYyBERVZJQ0VfQVRUUihzdXNwZW5kX21lbV9tb2RlLCAwNDQ0LAorCQlyZWd1bGF0b3Jfc3VzcGVuZF9tZW1fbW9kZV9zaG93LCBOVUxMKTsKIAogc3RhdGljIHNzaXplX3QgcmVndWxhdG9yX3N1c3BlbmRfZGlza19tb2RlX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAogCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7CiAJc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAotCWlmICghcmRldi0+Y29uc3RyYWludHMpCi0JCXJldHVybiBzcHJpbnRmKGJ1ZiwgIm5vdCBkZWZpbmVkXG4iKTsKLQlyZXR1cm4gc3VzcGVuZF9vcG1vZGVfc2hvdyhyZGV2LAotCQlyZGV2LT5jb25zdHJhaW50cy0+c3RhdGVfZGlzay5tb2RlLCBidWYpOworCXJldHVybiByZWd1bGF0b3JfcHJpbnRfb3Btb2RlKGJ1ZiwKKwkJcmRldi0+Y29uc3RyYWludHMtPnN0YXRlX2Rpc2subW9kZSk7CiB9CitzdGF0aWMgREVWSUNFX0FUVFIoc3VzcGVuZF9kaXNrX21vZGUsIDA0NDQsCisJCXJlZ3VsYXRvcl9zdXNwZW5kX2Rpc2tfbW9kZV9zaG93LCBOVUxMKTsKIAogc3RhdGljIHNzaXplX3QgcmVndWxhdG9yX3N1c3BlbmRfc3RhbmRieV9tb2RlX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAogCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7CiAJc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAotCWlmICghcmRldi0+Y29uc3RyYWludHMpCi0JCXJldHVybiBzcHJpbnRmKGJ1ZiwgIm5vdCBkZWZpbmVkXG4iKTsKLQlyZXR1cm4gc3VzcGVuZF9vcG1vZGVfc2hvdyhyZGV2LAotCQlyZGV2LT5jb25zdHJhaW50cy0+c3RhdGVfc3RhbmRieS5tb2RlLCBidWYpOworCXJldHVybiByZWd1bGF0b3JfcHJpbnRfb3Btb2RlKGJ1ZiwKKwkJcmRldi0+Y29uc3RyYWludHMtPnN0YXRlX3N0YW5kYnkubW9kZSk7CiB9CitzdGF0aWMgREVWSUNFX0FUVFIoc3VzcGVuZF9zdGFuZGJ5X21vZGUsIDA0NDQsCisJCXJlZ3VsYXRvcl9zdXNwZW5kX3N0YW5kYnlfbW9kZV9zaG93LCBOVUxMKTsKIAogc3RhdGljIHNzaXplX3QgcmVndWxhdG9yX3N1c3BlbmRfbWVtX3N0YXRlX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAogCQkJCSAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7CiAJc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAotCWlmICghcmRldi0+Y29uc3RyYWludHMpCi0JCXJldHVybiBzcHJpbnRmKGJ1ZiwgIm5vdCBkZWZpbmVkXG4iKTsKLQotCWlmIChyZGV2LT5jb25zdHJhaW50cy0+c3RhdGVfbWVtLmVuYWJsZWQpCi0JCXJldHVybiBzcHJpbnRmKGJ1ZiwgImVuYWJsZWRcbiIpOwotCWVsc2UKLQkJcmV0dXJuIHNwcmludGYoYnVmLCAiZGlzYWJsZWRcbiIpOworCXJldHVybiByZWd1bGF0b3JfcHJpbnRfc3RhdGUoYnVmLAorCQkJcmRldi0+Y29uc3RyYWludHMtPnN0YXRlX21lbS5lbmFibGVkKTsKIH0KK3N0YXRpYyBERVZJQ0VfQVRUUihzdXNwZW5kX21lbV9zdGF0ZSwgMDQ0NCwKKwkJcmVndWxhdG9yX3N1c3BlbmRfbWVtX3N0YXRlX3Nob3csIE5VTEwpOwogCiBzdGF0aWMgc3NpemVfdCByZWd1bGF0b3Jfc3VzcGVuZF9kaXNrX3N0YXRlX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAogCQkJCSAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7CiAJc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAotCWlmICghcmRldi0+Y29uc3RyYWludHMpCi0JCXJldHVybiBzcHJpbnRmKGJ1ZiwgIm5vdCBkZWZpbmVkXG4iKTsKLQotCWlmIChyZGV2LT5jb25zdHJhaW50cy0+c3RhdGVfZGlzay5lbmFibGVkKQotCQlyZXR1cm4gc3ByaW50ZihidWYsICJlbmFibGVkXG4iKTsKLQllbHNlCi0JCXJldHVybiBzcHJpbnRmKGJ1ZiwgImRpc2FibGVkXG4iKTsKKwlyZXR1cm4gcmVndWxhdG9yX3ByaW50X3N0YXRlKGJ1ZiwKKwkJCXJkZXYtPmNvbnN0cmFpbnRzLT5zdGF0ZV9kaXNrLmVuYWJsZWQpOwogfQorc3RhdGljIERFVklDRV9BVFRSKHN1c3BlbmRfZGlza19zdGF0ZSwgMDQ0NCwKKwkJcmVndWxhdG9yX3N1c3BlbmRfZGlza19zdGF0ZV9zaG93LCBOVUxMKTsKIAogc3RhdGljIHNzaXplX3QgcmVndWxhdG9yX3N1c3BlbmRfc3RhbmRieV9zdGF0ZV9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewogCXN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiAKLQlpZiAoIXJkZXYtPmNvbnN0cmFpbnRzKQotCQlyZXR1cm4gc3ByaW50ZihidWYsICJub3QgZGVmaW5lZFxuIik7Ci0KLQlpZiAocmRldi0+Y29uc3RyYWludHMtPnN0YXRlX3N0YW5kYnkuZW5hYmxlZCkKLQkJcmV0dXJuIHNwcmludGYoYnVmLCAiZW5hYmxlZFxuIik7Ci0JZWxzZQotCQlyZXR1cm4gc3ByaW50ZihidWYsICJkaXNhYmxlZFxuIik7CisJcmV0dXJuIHJlZ3VsYXRvcl9wcmludF9zdGF0ZShidWYsCisJCQlyZGV2LT5jb25zdHJhaW50cy0+c3RhdGVfc3RhbmRieS5lbmFibGVkKTsKIH0KK3N0YXRpYyBERVZJQ0VfQVRUUihzdXNwZW5kX3N0YW5kYnlfc3RhdGUsIDA0NDQsCisJCXJlZ3VsYXRvcl9zdXNwZW5kX3N0YW5kYnlfc3RhdGVfc2hvdywgTlVMTCk7CiAKKworLyoKKyAqIFRoZXNlIGFyZSB0aGUgb25seSBhdHRyaWJ1dGVzIGFyZSBwcmVzZW50IGZvciBhbGwgcmVndWxhdG9ycy4KKyAqIE90aGVyIGF0dHJpYnV0ZXMgYXJlIGEgZnVuY3Rpb24gb2YgcmVndWxhdG9yIGZ1bmN0aW9uYWxpdHkuCisgKi8KIHN0YXRpYyBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSByZWd1bGF0b3JfZGV2X2F0dHJzW10gPSB7CiAJX19BVFRSKG5hbWUsIDA0NDQsIHJlZ3VsYXRvcl9uYW1lX3Nob3csIE5VTEwpLAotCV9fQVRUUihtaWNyb3ZvbHRzLCAwNDQ0LCByZWd1bGF0b3JfdVZfc2hvdywgTlVMTCksCi0JX19BVFRSKG1pY3JvYW1wcywgMDQ0NCwgcmVndWxhdG9yX3VBX3Nob3csIE5VTEwpLAotCV9fQVRUUihvcG1vZGUsIDA0NDQsIHJlZ3VsYXRvcl9vcG1vZGVfc2hvdywgTlVMTCksCi0JX19BVFRSKHN0YXRlLCAwNDQ0LCByZWd1bGF0b3Jfc3RhdGVfc2hvdywgTlVMTCksCi0JX19BVFRSKG1pbl9taWNyb3ZvbHRzLCAwNDQ0LCByZWd1bGF0b3JfbWluX3VWX3Nob3csIE5VTEwpLAotCV9fQVRUUihtaW5fbWljcm9hbXBzLCAwNDQ0LCByZWd1bGF0b3JfbWluX3VBX3Nob3csIE5VTEwpLAotCV9fQVRUUihtYXhfbWljcm92b2x0cywgMDQ0NCwgcmVndWxhdG9yX21heF91Vl9zaG93LCBOVUxMKSwKLQlfX0FUVFIobWF4X21pY3JvYW1wcywgMDQ0NCwgcmVndWxhdG9yX21heF91QV9zaG93LCBOVUxMKSwKLQlfX0FUVFIocmVxdWVzdGVkX21pY3JvYW1wcywgMDQ0NCwgcmVndWxhdG9yX3RvdGFsX3VBX3Nob3csIE5VTEwpLAogCV9fQVRUUihudW1fdXNlcnMsIDA0NDQsIHJlZ3VsYXRvcl9udW1fdXNlcnNfc2hvdywgTlVMTCksCiAJX19BVFRSKHR5cGUsIDA0NDQsIHJlZ3VsYXRvcl90eXBlX3Nob3csIE5VTEwpLAotCV9fQVRUUihzdXNwZW5kX21lbV9taWNyb3ZvbHRzLCAwNDQ0LAotCQlyZWd1bGF0b3Jfc3VzcGVuZF9tZW1fdVZfc2hvdywgTlVMTCksCi0JX19BVFRSKHN1c3BlbmRfZGlza19taWNyb3ZvbHRzLCAwNDQ0LAotCQlyZWd1bGF0b3Jfc3VzcGVuZF9kaXNrX3VWX3Nob3csIE5VTEwpLAotCV9fQVRUUihzdXNwZW5kX3N0YW5kYnlfbWljcm92b2x0cywgMDQ0NCwKLQkJcmVndWxhdG9yX3N1c3BlbmRfc3RhbmRieV91Vl9zaG93LCBOVUxMKSwKLQlfX0FUVFIoc3VzcGVuZF9tZW1fbW9kZSwgMDQ0NCwKLQkJcmVndWxhdG9yX3N1c3BlbmRfbWVtX21vZGVfc2hvdywgTlVMTCksCi0JX19BVFRSKHN1c3BlbmRfZGlza19tb2RlLCAwNDQ0LAotCQlyZWd1bGF0b3Jfc3VzcGVuZF9kaXNrX21vZGVfc2hvdywgTlVMTCksCi0JX19BVFRSKHN1c3BlbmRfc3RhbmRieV9tb2RlLCAwNDQ0LAotCQlyZWd1bGF0b3Jfc3VzcGVuZF9zdGFuZGJ5X21vZGVfc2hvdywgTlVMTCksCi0JX19BVFRSKHN1c3BlbmRfbWVtX3N0YXRlLCAwNDQ0LAotCQlyZWd1bGF0b3Jfc3VzcGVuZF9tZW1fc3RhdGVfc2hvdywgTlVMTCksCi0JX19BVFRSKHN1c3BlbmRfZGlza19zdGF0ZSwgMDQ0NCwKLQkJcmVndWxhdG9yX3N1c3BlbmRfZGlza19zdGF0ZV9zaG93LCBOVUxMKSwKLQlfX0FUVFIoc3VzcGVuZF9zdGFuZGJ5X3N0YXRlLCAwNDQ0LAotCQlyZWd1bGF0b3Jfc3VzcGVuZF9zdGFuZGJ5X3N0YXRlX3Nob3csIE5VTEwpLAogCV9fQVRUUl9OVUxMLAogfTsKIApAQCAtNjc1LDcgKzY1NSw4IEBACiAKIC8qKgogICogc2V0X21hY2hpbmVfY29uc3RyYWludHMgLSBzZXRzIHJlZ3VsYXRvciBjb25zdHJhaW50cwotICogQHJlZ3VsYXRvcjogcmVndWxhdG9yIHNvdXJjZQorICogQHJkZXY6IHJlZ3VsYXRvciBzb3VyY2UKKyAqIEBjb25zdHJhaW50czogY29uc3RyYWludHMgdG8gYXBwbHkKICAqCiAgKiBBbGxvd3MgcGxhdGZvcm0gaW5pdGlhbGlzYXRpb24gY29kZSB0byBkZWZpbmUgYW5kIGNvbnN0cmFpbgogICogcmVndWxhdG9yIGNpcmN1aXRzIGUuZy4gdmFsaWQgdm9sdGFnZS9jdXJyZW50IHJhbmdlcywgZXRjLiAgTk9URToKQEAgLTc1MCw4ICs3MzEsOCBAQAogCiAvKioKICAqIHNldF9zdXBwbHkgLSBzZXQgcmVndWxhdG9yIHN1cHBseSByZWd1bGF0b3IKLSAqIEByZWd1bGF0b3I6IHJlZ3VsYXRvciBuYW1lCi0gKiBAc3VwcGx5OiBzdXBwbHkgcmVndWxhdG9yIG5hbWUKKyAqIEByZGV2OiByZWd1bGF0b3IgbmFtZQorICogQHN1cHBseV9yZGV2OiBzdXBwbHkgcmVndWxhdG9yIG5hbWUKICAqCiAgKiBDYWxsZWQgYnkgcGxhdGZvcm0gaW5pdGlhbGlzYXRpb24gY29kZSB0byBzZXQgdGhlIHN1cHBseSByZWd1bGF0b3IgZm9yIHRoaXMKICAqIHJlZ3VsYXRvci4gVGhpcyBlbnN1cmVzIHRoYXQgYSByZWd1bGF0b3JzIHN1cHBseSB3aWxsIGFsc28gYmUgZW5hYmxlZCBieSB0aGUKQEAgLTc3OCw5ICs3NTksOSBAQAogCiAvKioKICAqIHNldF9jb25zdW1lcl9kZXZpY2Vfc3VwcGx5OiBCaW5kIGEgcmVndWxhdG9yIHRvIGEgc3ltYm9saWMgc3VwcGx5Ci0gKiBAcmVndWxhdG9yOiByZWd1bGF0b3Igc291cmNlCi0gKiBAZGV2OiAgICAgICBkZXZpY2UgdGhlIHN1cHBseSBhcHBsaWVzIHRvCi0gKiBAc3VwcGx5OiAgICBzeW1ib2xpYyBuYW1lIGZvciBzdXBwbHkKKyAqIEByZGV2OiAgICAgICAgIHJlZ3VsYXRvciBzb3VyY2UKKyAqIEBjb25zdW1lcl9kZXY6IGRldmljZSB0aGUgc3VwcGx5IGFwcGxpZXMgdG8KKyAqIEBzdXBwbHk6ICAgICAgIHN5bWJvbGljIG5hbWUgZm9yIHN1cHBseQogICoKICAqIEFsbG93cyBwbGF0Zm9ybSBpbml0aWFsaXNhdGlvbiBjb2RlIHRvIG1hcCBwaHlzaWNhbCByZWd1bGF0b3IKICAqIHNvdXJjZXMgdG8gc3ltYm9saWMgbmFtZXMgZm9yIHN1cHBsaWVzIGZvciB1c2UgYnkgZGV2aWNlcy4gIERldmljZXMKQEAgLTc5NSw2ICs3NzYsMjAgQEAKIAlpZiAoc3VwcGx5ID09IE5VTEwpCiAJCXJldHVybiAtRUlOVkFMOwogCisJbGlzdF9mb3JfZWFjaF9lbnRyeShub2RlLCAmcmVndWxhdG9yX21hcF9saXN0LCBsaXN0KSB7CisJCWlmIChjb25zdW1lcl9kZXYgIT0gbm9kZS0+ZGV2KQorCQkJY29udGludWU7CisJCWlmIChzdHJjbXAobm9kZS0+c3VwcGx5LCBzdXBwbHkpICE9IDApCisJCQljb250aW51ZTsKKworCQlkZXZfZGJnKGNvbnN1bWVyX2RldiwgIiVzLyVzIGlzICclcycgc3VwcGx5OyBmYWlsICVzLyVzXG4iLAorCQkJCWRldl9uYW1lKCZub2RlLT5yZWd1bGF0b3ItPmRldiksCisJCQkJbm9kZS0+cmVndWxhdG9yLT5kZXNjLT5uYW1lLAorCQkJCXN1cHBseSwKKwkJCQlkZXZfbmFtZSgmcmRldi0+ZGV2KSwgcmRldi0+ZGVzYy0+bmFtZSk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCiAJbm9kZSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCByZWd1bGF0b3JfbWFwKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKG5vZGUgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07CkBAIC05NjMsMTYgKzk1OCwxMyBAQAogCWlmIChyZWd1bGF0b3IgPT0gTlVMTCB8fCBJU19FUlIocmVndWxhdG9yKSkKIAkJcmV0dXJuOwogCi0JaWYgKHJlZ3VsYXRvci0+ZW5hYmxlZCkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJSZWxlYXNpbmcgc3VwcGx5ICVzIHdoaWxlIGVuYWJsZWRcbiIsCi0JCSAgICAgICByZWd1bGF0b3ItPnN1cHBseV9uYW1lKTsKLQkJV0FSTl9PTihyZWd1bGF0b3ItPmVuYWJsZWQpOwotCQlyZWd1bGF0b3JfZGlzYWJsZShyZWd1bGF0b3IpOwotCX0KLQogCW11dGV4X2xvY2soJnJlZ3VsYXRvcl9saXN0X211dGV4KTsKIAlyZGV2ID0gcmVndWxhdG9yLT5yZGV2OwogCisJaWYgKFdBUk4ocmVndWxhdG9yLT5lbmFibGVkLCAiUmVsZWFzaW5nIHN1cHBseSAlcyB3aGlsZSBlbmFibGVkXG4iLAorCQkJICAgICAgIHJlZ3VsYXRvci0+c3VwcGx5X25hbWUpKQorCQlfcmVndWxhdG9yX2Rpc2FibGUocmRldik7CisKIAkvKiByZW1vdmUgYW55IHN5c2ZzIGVudHJpZXMgKi8KIAlpZiAocmVndWxhdG9yLT5kZXYpIHsKIAkJc3lzZnNfcmVtb3ZlX2xpbmsoJnJkZXYtPmRldi5rb2JqLCByZWd1bGF0b3ItPnN1cHBseV9uYW1lKTsKQEAgLTEwMzQsMjkgKzEwMjYsMjYgQEAKICAqIHJlZ3VsYXRvcl9lbmFibGUgLSBlbmFibGUgcmVndWxhdG9yIG91dHB1dAogICogQHJlZ3VsYXRvcjogcmVndWxhdG9yIHNvdXJjZQogICoKLSAqIEVuYWJsZSB0aGUgcmVndWxhdG9yIG91dHB1dCBhdCB0aGUgcHJlZGVmaW5lZCB2b2x0YWdlIG9yIGN1cnJlbnQgdmFsdWUuCisgKiBSZXF1ZXN0IHRoYXQgdGhlIHJlZ3VsYXRvciBiZSBlbmFibGVkIHdpdGggdGhlIHJlZ3VsYXRvciBvdXRwdXQgYXQKKyAqIHRoZSBwcmVkZWZpbmVkIHZvbHRhZ2Ugb3IgY3VycmVudCB2YWx1ZS4gIENhbGxzIHRvIHJlZ3VsYXRvcl9lbmFibGUoKQorICogbXVzdCBiZSBiYWxhbmNlZCB3aXRoIGNhbGxzIHRvIHJlZ3VsYXRvcl9kaXNhYmxlKCkuCisgKgogICogTk9URTogdGhlIG91dHB1dCB2YWx1ZSBjYW4gYmUgc2V0IGJ5IG90aGVyIGRyaXZlcnMsIGJvb3QgbG9hZGVyIG9yIG1heSBiZQogICogaGFyZHdpcmVkIGluIHRoZSByZWd1bGF0b3IuCi0gKiBOT1RFOiBjYWxscyB0byByZWd1bGF0b3JfZW5hYmxlKCkgbXVzdCBiZSBiYWxhbmNlZCB3aXRoIGNhbGxzIHRvCi0gKiByZWd1bGF0b3JfZGlzYWJsZSgpLgogICovCiBpbnQgcmVndWxhdG9yX2VuYWJsZShzdHJ1Y3QgcmVndWxhdG9yICpyZWd1bGF0b3IpCiB7Ci0JaW50IHJldDsKKwlzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldiA9IHJlZ3VsYXRvci0+cmRldjsKKwlpbnQgcmV0ID0gMDsKIAotCWlmIChyZWd1bGF0b3ItPmVuYWJsZWQpIHsKLQkJcHJpbnRrKEtFUk5fQ1JJVCAiUmVndWxhdG9yICVzIGFscmVhZHkgZW5hYmxlZFxuIiwKLQkJICAgICAgIHJlZ3VsYXRvci0+c3VwcGx5X25hbWUpOwotCQlXQVJOX09OKHJlZ3VsYXRvci0+ZW5hYmxlZCk7Ci0JCXJldHVybiAwOwotCX0KLQotCW11dGV4X2xvY2soJnJlZ3VsYXRvci0+cmRldi0+bXV0ZXgpOwotCXJlZ3VsYXRvci0+ZW5hYmxlZCA9IDE7Ci0JcmV0ID0gX3JlZ3VsYXRvcl9lbmFibGUocmVndWxhdG9yLT5yZGV2KTsKLQlpZiAocmV0ICE9IDApCi0JCXJlZ3VsYXRvci0+ZW5hYmxlZCA9IDA7Ci0JbXV0ZXhfdW5sb2NrKCZyZWd1bGF0b3ItPnJkZXYtPm11dGV4KTsKKwltdXRleF9sb2NrKCZyZGV2LT5tdXRleCk7CisJaWYgKHJlZ3VsYXRvci0+ZW5hYmxlZCA9PSAwKQorCQlyZXQgPSBfcmVndWxhdG9yX2VuYWJsZShyZGV2KTsKKwllbHNlIGlmIChyZWd1bGF0b3ItPmVuYWJsZWQgPCAwKQorCQlyZXQgPSAtRUlPOworCWlmIChyZXQgPT0gMCkKKwkJcmVndWxhdG9yLT5lbmFibGVkKys7CisJbXV0ZXhfdW5sb2NrKCZyZGV2LT5tdXRleCk7CiAJcmV0dXJuIHJldDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHJlZ3VsYXRvcl9lbmFibGUpOwpAQCAtMTEwMCwyNyArMTA4OSwzMSBAQAogICogcmVndWxhdG9yX2Rpc2FibGUgLSBkaXNhYmxlIHJlZ3VsYXRvciBvdXRwdXQKICAqIEByZWd1bGF0b3I6IHJlZ3VsYXRvciBzb3VyY2UKICAqCi0gKiBEaXNhYmxlIHRoZSByZWd1bGF0b3Igb3V0cHV0IHZvbHRhZ2Ugb3IgY3VycmVudC4KLSAqIE5PVEU6IHRoaXMgd2lsbCBvbmx5IGRpc2FibGUgdGhlIHJlZ3VsYXRvciBvdXRwdXQgaWYgbm8gb3RoZXIgY29uc3VtZXIKLSAqIGRldmljZXMgaGF2ZSBpdCBlbmFibGVkLgotICogTk9URTogY2FsbHMgdG8gcmVndWxhdG9yX2VuYWJsZSgpIG11c3QgYmUgYmFsYW5jZWQgd2l0aCBjYWxscyB0bworICogRGlzYWJsZSB0aGUgcmVndWxhdG9yIG91dHB1dCB2b2x0YWdlIG9yIGN1cnJlbnQuICBDYWxscyB0bworICogcmVndWxhdG9yX2VuYWJsZSgpIG11c3QgYmUgYmFsYW5jZWQgd2l0aCBjYWxscyB0bwogICogcmVndWxhdG9yX2Rpc2FibGUoKS4KKyAqCisgKiBOT1RFOiB0aGlzIHdpbGwgb25seSBkaXNhYmxlIHRoZSByZWd1bGF0b3Igb3V0cHV0IGlmIG5vIG90aGVyIGNvbnN1bWVyCisgKiBkZXZpY2VzIGhhdmUgaXQgZW5hYmxlZCwgdGhlIHJlZ3VsYXRvciBkZXZpY2Ugc3VwcG9ydHMgZGlzYWJsaW5nIGFuZAorICogbWFjaGluZSBjb25zdHJhaW50cyBwZXJtaXQgdGhpcyBvcGVyYXRpb24uCiAgKi8KIGludCByZWd1bGF0b3JfZGlzYWJsZShzdHJ1Y3QgcmVndWxhdG9yICpyZWd1bGF0b3IpCiB7Ci0JaW50IHJldDsKKwlzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldiA9IHJlZ3VsYXRvci0+cmRldjsKKwlpbnQgcmV0ID0gMDsKIAotCWlmICghcmVndWxhdG9yLT5lbmFibGVkKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IG5vdCBpbiB1c2UgYnkgdGhpcyBjb25zdW1lclxuIiwKLQkJCV9fZnVuY19fKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JbXV0ZXhfbG9jaygmcmVndWxhdG9yLT5yZGV2LT5tdXRleCk7Ci0JcmVndWxhdG9yLT5lbmFibGVkID0gMDsKLQlyZWd1bGF0b3ItPnVBX2xvYWQgPSAwOwotCXJldCA9IF9yZWd1bGF0b3JfZGlzYWJsZShyZWd1bGF0b3ItPnJkZXYpOwotCW11dGV4X3VubG9jaygmcmVndWxhdG9yLT5yZGV2LT5tdXRleCk7CisJbXV0ZXhfbG9jaygmcmRldi0+bXV0ZXgpOworCWlmIChyZWd1bGF0b3ItPmVuYWJsZWQgPT0gMSkgeworCQlyZXQgPSBfcmVndWxhdG9yX2Rpc2FibGUocmRldik7CisJCWlmIChyZXQgPT0gMCkKKwkJCXJlZ3VsYXRvci0+dUFfbG9hZCA9IDA7CisJfSBlbHNlIGlmIChXQVJOKHJlZ3VsYXRvci0+ZW5hYmxlZCA8PSAwLAorCQkJInVuYmFsYW5jZWQgZGlzYWJsZXMgZm9yIHN1cHBseSAlc1xuIiwKKwkJCXJlZ3VsYXRvci0+c3VwcGx5X25hbWUpKQorCQlyZXQgPSAtRUlPOworCWlmIChyZXQgPT0gMCkKKwkJcmVndWxhdG9yLT5lbmFibGVkLS07CisJbXV0ZXhfdW5sb2NrKCZyZGV2LT5tdXRleCk7CiAJcmV0dXJuIHJldDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHJlZ3VsYXRvcl9kaXNhYmxlKTsKQEAgLTExOTYsNyArMTE4OSwxMyBAQAogICogcmVndWxhdG9yX2lzX2VuYWJsZWQgLSBpcyB0aGUgcmVndWxhdG9yIG91dHB1dCBlbmFibGVkCiAgKiBAcmVndWxhdG9yOiByZWd1bGF0b3Igc291cmNlCiAgKgotICogUmV0dXJucyB6ZXJvIGZvciBkaXNhYmxlZCBvdGhlcndpc2UgcmV0dXJuIG51bWJlciBvZiBlbmFibGUgcmVxdWVzdHMuCisgKiBSZXR1cm5zIHBvc2l0aXZlIGlmIHRoZSByZWd1bGF0b3IgZHJpdmVyIGJhY2tpbmcgdGhlIHNvdXJjZS9jbGllbnQKKyAqIGhhcyByZXF1ZXN0ZWQgdGhhdCB0aGUgZGV2aWNlIGJlIGVuYWJsZWQsIHplcm8gaWYgaXQgaGFzbid0LCBlbHNlIGEKKyAqIG5lZ2F0aXZlIGVycm5vIGNvZGUuCisgKgorICogTm90ZSB0aGF0IHRoZSBkZXZpY2UgYmFja2luZyB0aGlzIHJlZ3VsYXRvciBoYW5kbGUgY2FuIGhhdmUgbXVsdGlwbGUKKyAqIHVzZXJzLCBzbyBpdCBtaWdodCBiZSBlbmFibGVkIGV2ZW4gaWYgcmVndWxhdG9yX2VuYWJsZSgpIHdhcyBuZXZlcgorICogY2FsbGVkIGZvciB0aGlzIHBhcnRpY3VsYXIgc291cmNlLgogICovCiBpbnQgcmVndWxhdG9yX2lzX2VuYWJsZWQoc3RydWN0IHJlZ3VsYXRvciAqcmVndWxhdG9yKQogewpAQCAtMTIxOSw3ICsxMjE4LDcgQEAKICAqCiAgKiBOT1RFOiBJZiB0aGUgcmVndWxhdG9yIGlzIHNoYXJlZCBiZXR3ZWVuIHNldmVyYWwgZGV2aWNlcyB0aGVuIHRoZSBsb3dlc3QKICAqIHJlcXVlc3Qgdm9sdGFnZSB0aGF0IG1lZXRzIHRoZSBzeXN0ZW0gY29uc3RyYWludHMgd2lsbCBiZSB1c2VkLgotICogTk9URTogUmVndWxhdG9yIHN5c3RlbSBjb25zdHJhaW50cyBtdXN0IGJlIHNldCBmb3IgdGhpcyByZWd1bGF0b3IgYmVmb3JlCisgKiBSZWd1bGF0b3Igc3lzdGVtIGNvbnN0cmFpbnRzIG11c3QgYmUgc2V0IGZvciB0aGlzIHJlZ3VsYXRvciBiZWZvcmUKICAqIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiBvdGhlcndpc2UgdGhpcyBjYWxsIHdpbGwgZmFpbC4KICAqLwogaW50IHJlZ3VsYXRvcl9zZXRfdm9sdGFnZShzdHJ1Y3QgcmVndWxhdG9yICpyZWd1bGF0b3IsIGludCBtaW5fdVYsIGludCBtYXhfdVYpCkBAIC0xNDkzLDcgKzE0OTIsOCBAQAogCW1vZGUgPSByZGV2LT5kZXNjLT5vcHMtPmdldF9vcHRpbXVtX21vZGUocmRldiwKIAkJCQkJCSBpbnB1dF91Viwgb3V0cHV0X3VWLAogCQkJCQkJIHRvdGFsX3VBX2xvYWQpOwotCWlmIChyZXQgPD0gMCkgeworCXJldCA9IHJlZ3VsYXRvcl9jaGVja19tb2RlKHJkZXYsIG1vZGUpOworCWlmIChyZXQgPCAwKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiJXM6IGZhaWxlZCB0byBnZXQgb3B0aW11bSBtb2RlIGZvciAlcyBAIgogCQkJIiAlZCB1QSAlZCAtPiAlZCB1VlxuIiwgX19mdW5jX18sIHJkZXYtPmRlc2MtPm5hbWUsCiAJCQl0b3RhbF91QV9sb2FkLCBpbnB1dF91Viwgb3V0cHV0X3VWKTsKQEAgLTE1MDEsNyArMTUwMSw3IEBACiAJfQogCiAJcmV0ID0gcmRldi0+ZGVzYy0+b3BzLT5zZXRfbW9kZShyZGV2LCBtb2RlKTsKLQlpZiAocmV0IDw9IDApIHsKKwlpZiAocmV0IDwgMCkgewogCQlwcmludGsoS0VSTl9FUlIgIiVzOiBmYWlsZWQgdG8gc2V0IG9wdGltdW0gbW9kZSAleCBmb3IgJXNcbiIsCiAJCQlfX2Z1bmNfXywgbW9kZSwgcmRldi0+ZGVzYy0+bmFtZSk7CiAJCWdvdG8gb3V0OwpAQCAtMTUxNiw3ICsxNTE2LDcgQEAKIC8qKgogICogcmVndWxhdG9yX3JlZ2lzdGVyX25vdGlmaWVyIC0gcmVnaXN0ZXIgcmVndWxhdG9yIGV2ZW50IG5vdGlmaWVyCiAgKiBAcmVndWxhdG9yOiByZWd1bGF0b3Igc291cmNlCi0gKiBAbm90aWZpZXJfYmxvY2s6IG5vdGlmaWVyIGJsb2NrCisgKiBAbmI6IG5vdGlmaWVyIGJsb2NrCiAgKgogICogUmVnaXN0ZXIgbm90aWZpZXIgYmxvY2sgdG8gcmVjZWl2ZSByZWd1bGF0b3IgZXZlbnRzLgogICovCkBAIC0xNTMxLDcgKzE1MzEsNyBAQAogLyoqCiAgKiByZWd1bGF0b3JfdW5yZWdpc3Rlcl9ub3RpZmllciAtIHVucmVnaXN0ZXIgcmVndWxhdG9yIGV2ZW50IG5vdGlmaWVyCiAgKiBAcmVndWxhdG9yOiByZWd1bGF0b3Igc291cmNlCi0gKiBAbm90aWZpZXJfYmxvY2s6IG5vdGlmaWVyIGJsb2NrCisgKiBAbmI6IG5vdGlmaWVyIGJsb2NrCiAgKgogICogVW5yZWdpc3RlciByZWd1bGF0b3IgZXZlbnQgbm90aWZpZXIgYmxvY2suCiAgKi8KQEAgLTE2OTcsOSArMTY5Nyw5IEBACiAKIC8qKgogICogcmVndWxhdG9yX25vdGlmaWVyX2NhbGxfY2hhaW4gLSBjYWxsIHJlZ3VsYXRvciBldmVudCBub3RpZmllcgotICogQHJlZ3VsYXRvcjogcmVndWxhdG9yIHNvdXJjZQorICogQHJkZXY6IHJlZ3VsYXRvciBzb3VyY2UKICAqIEBldmVudDogbm90aWZpZXIgYmxvY2sKLSAqIEBkYXRhOgorICogQGRhdGE6IGNhbGxiYWNrLXNwZWNpZmljIGRhdGEuCiAgKgogICogQ2FsbGVkIGJ5IHJlZ3VsYXRvciBkcml2ZXJzIHRvIG5vdGlmeSBjbGllbnRzIGEgcmVndWxhdG9yIGV2ZW50IGhhcwogICogb2NjdXJyZWQuIFdlIGFsc28gbm90aWZ5IHJlZ3VsYXRvciBjbGllbnRzIGRvd25zdHJlYW0uCkBAIC0xNzEzLDEwICsxNzEzLDEyMiBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwocmVndWxhdG9yX25vdGlmaWVyX2NhbGxfY2hhaW4pOwogCisvKgorICogVG8gYXZvaWQgY2x1dHRlcmluZyBzeXNmcyAoYW5kIG1lbW9yeSkgd2l0aCB1c2VsZXNzIHN0YXRlLCBvbmx5CisgKiBjcmVhdGUgYXR0cmlidXRlcyB0aGF0IGNhbiBiZSBtZWFuaW5nZnVsbHkgZGlzcGxheWVkLgorICovCitzdGF0aWMgaW50IGFkZF9yZWd1bGF0b3JfYXR0cmlidXRlcyhzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldikKK3sKKwlzdHJ1Y3QgZGV2aWNlCQkqZGV2ID0gJnJkZXYtPmRldjsKKwlzdHJ1Y3QgcmVndWxhdG9yX29wcwkqb3BzID0gcmRldi0+ZGVzYy0+b3BzOworCWludAkJCXN0YXR1cyA9IDA7CisKKwkvKiBzb21lIGF0dHJpYnV0ZXMgbmVlZCBzcGVjaWZpYyBtZXRob2RzIHRvIGJlIGRpc3BsYXllZCAqLworCWlmIChvcHMtPmdldF92b2x0YWdlKSB7CisJCXN0YXR1cyA9IGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9taWNyb3ZvbHRzKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlyZXR1cm4gc3RhdHVzOworCX0KKwlpZiAob3BzLT5nZXRfY3VycmVudF9saW1pdCkgeworCQlzdGF0dXMgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfbWljcm9hbXBzKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlyZXR1cm4gc3RhdHVzOworCX0KKwlpZiAob3BzLT5nZXRfbW9kZSkgeworCQlzdGF0dXMgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfb3Btb2RlKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlyZXR1cm4gc3RhdHVzOworCX0KKwlpZiAob3BzLT5pc19lbmFibGVkKSB7CisJCXN0YXR1cyA9IGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9zdGF0ZSk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJcmV0dXJuIHN0YXR1czsKKwl9CisKKwkvKiBzb21lIGF0dHJpYnV0ZXMgYXJlIHR5cGUtc3BlY2lmaWMgKi8KKwlpZiAocmRldi0+ZGVzYy0+dHlwZSA9PSBSRUdVTEFUT1JfQ1VSUkVOVCkgeworCQlzdGF0dXMgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfcmVxdWVzdGVkX21pY3JvYW1wcyk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJcmV0dXJuIHN0YXR1czsKKwl9CisKKwkvKiBhbGwgdGhlIG90aGVyIGF0dHJpYnV0ZXMgZXhpc3QgdG8gc3VwcG9ydCBjb25zdHJhaW50czsKKwkgKiBkb24ndCBzaG93IHRoZW0gaWYgdGhlcmUgYXJlIG5vIGNvbnN0cmFpbnRzLCBvciBpZiB0aGUKKwkgKiByZWxldmFudCBzdXBwb3J0aW5nIG1ldGhvZHMgYXJlIG1pc3NpbmcuCisJICovCisJaWYgKCFyZGV2LT5jb25zdHJhaW50cykKKwkJcmV0dXJuIHN0YXR1czsKKworCS8qIGNvbnN0cmFpbnRzIG5lZWQgc3BlY2lmaWMgc3VwcG9ydGluZyBtZXRob2RzICovCisJaWYgKG9wcy0+c2V0X3ZvbHRhZ2UpIHsKKwkJc3RhdHVzID0gZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX21pbl9taWNyb3ZvbHRzKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlyZXR1cm4gc3RhdHVzOworCQlzdGF0dXMgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfbWF4X21pY3Jvdm9sdHMpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCXJldHVybiBzdGF0dXM7CisJfQorCWlmIChvcHMtPnNldF9jdXJyZW50X2xpbWl0KSB7CisJCXN0YXR1cyA9IGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9taW5fbWljcm9hbXBzKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlyZXR1cm4gc3RhdHVzOworCQlzdGF0dXMgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfbWF4X21pY3JvYW1wcyk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJcmV0dXJuIHN0YXR1czsKKwl9CisKKwkvKiBzdXNwZW5kIG1vZGUgY29uc3RyYWludHMgbmVlZCBtdWx0aXBsZSBzdXBwb3J0aW5nIG1ldGhvZHMgKi8KKwlpZiAoIShvcHMtPnNldF9zdXNwZW5kX2VuYWJsZSAmJiBvcHMtPnNldF9zdXNwZW5kX2Rpc2FibGUpKQorCQlyZXR1cm4gc3RhdHVzOworCisJc3RhdHVzID0gZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX3N1c3BlbmRfc3RhbmRieV9zdGF0ZSk7CisJaWYgKHN0YXR1cyA8IDApCisJCXJldHVybiBzdGF0dXM7CisJc3RhdHVzID0gZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX3N1c3BlbmRfbWVtX3N0YXRlKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJcmV0dXJuIHN0YXR1czsKKwlzdGF0dXMgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfc3VzcGVuZF9kaXNrX3N0YXRlKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJcmV0dXJuIHN0YXR1czsKKworCWlmIChvcHMtPnNldF9zdXNwZW5kX3ZvbHRhZ2UpIHsKKwkJc3RhdHVzID0gZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwKKwkJCQkmZGV2X2F0dHJfc3VzcGVuZF9zdGFuZGJ5X21pY3Jvdm9sdHMpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCXJldHVybiBzdGF0dXM7CisJCXN0YXR1cyA9IGRldmljZV9jcmVhdGVfZmlsZShkZXYsCisJCQkJJmRldl9hdHRyX3N1c3BlbmRfbWVtX21pY3Jvdm9sdHMpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCXJldHVybiBzdGF0dXM7CisJCXN0YXR1cyA9IGRldmljZV9jcmVhdGVfZmlsZShkZXYsCisJCQkJJmRldl9hdHRyX3N1c3BlbmRfZGlza19taWNyb3ZvbHRzKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlyZXR1cm4gc3RhdHVzOworCX0KKworCWlmIChvcHMtPnNldF9zdXNwZW5kX21vZGUpIHsKKwkJc3RhdHVzID0gZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwKKwkJCQkmZGV2X2F0dHJfc3VzcGVuZF9zdGFuZGJ5X21vZGUpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCXJldHVybiBzdGF0dXM7CisJCXN0YXR1cyA9IGRldmljZV9jcmVhdGVfZmlsZShkZXYsCisJCQkJJmRldl9hdHRyX3N1c3BlbmRfbWVtX21vZGUpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCXJldHVybiBzdGF0dXM7CisJCXN0YXR1cyA9IGRldmljZV9jcmVhdGVfZmlsZShkZXYsCisJCQkJJmRldl9hdHRyX3N1c3BlbmRfZGlza19tb2RlKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlyZXR1cm4gc3RhdHVzOworCX0KKworCXJldHVybiBzdGF0dXM7Cit9CisKIC8qKgogICogcmVndWxhdG9yX3JlZ2lzdGVyIC0gcmVnaXN0ZXIgcmVndWxhdG9yCi0gKiBAcmVndWxhdG9yOiByZWd1bGF0b3Igc291cmNlCi0gKiBAcmVnX2RhdGE6IHByaXZhdGUgcmVndWxhdG9yIGRhdGEKKyAqIEByZWd1bGF0b3JfZGVzYzogcmVndWxhdG9yIHRvIHJlZ2lzdGVyCisgKiBAZGV2OiBzdHJ1Y3QgZGV2aWNlIGZvciB0aGUgcmVndWxhdG9yCisgKiBAZHJpdmVyX2RhdGE6IHByaXZhdGUgcmVndWxhdG9yIGRhdGEKICAqCiAgKiBDYWxsZWQgYnkgcmVndWxhdG9yIGRyaXZlcnMgdG8gcmVnaXN0ZXIgYSByZWd1bGF0b3IuCiAgKiBSZXR1cm5zIDAgb24gc3VjY2Vzcy4KQEAgLTE3NjEsNDUgKzE4NzMsMzcgQEAKIAkvKiBwcmVmb3JtIGFueSByZWd1bGF0b3Igc3BlY2lmaWMgaW5pdCAqLwogCWlmIChpbml0X2RhdGEtPnJlZ3VsYXRvcl9pbml0KSB7CiAJCXJldCA9IGluaXRfZGF0YS0+cmVndWxhdG9yX2luaXQocmRldi0+cmVnX2RhdGEpOwotCQlpZiAocmV0IDwgMCkgewotCQkJa2ZyZWUocmRldik7Ci0JCQlyZGV2ID0gRVJSX1BUUihyZXQpOwotCQkJZ290byBvdXQ7Ci0JCX0KLQl9Ci0KLQkvKiBzZXQgcmVndWxhdG9yIGNvbnN0cmFpbnRzICovCi0JcmV0ID0gc2V0X21hY2hpbmVfY29uc3RyYWludHMocmRldiwgJmluaXRfZGF0YS0+Y29uc3RyYWludHMpOwotCWlmIChyZXQgPCAwKSB7Ci0JCWtmcmVlKHJkZXYpOwotCQlyZGV2ID0gRVJSX1BUUihyZXQpOwotCQlnb3RvIG91dDsKKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIGNsZWFuOwogCX0KIAogCS8qIHJlZ2lzdGVyIHdpdGggc3lzZnMgKi8KIAlyZGV2LT5kZXYuY2xhc3MgPSAmcmVndWxhdG9yX2NsYXNzOwogCXJkZXYtPmRldi5wYXJlbnQgPSBkZXY7Ci0Jc25wcmludGYocmRldi0+ZGV2LmJ1c19pZCwgc2l6ZW9mKHJkZXYtPmRldi5idXNfaWQpLAotCQkgInJlZ3VsYXRvci4lZCIsIGF0b21pY19pbmNfcmV0dXJuKCZyZWd1bGF0b3Jfbm8pIC0gMSk7CisJZGV2X3NldF9uYW1lKCZyZGV2LT5kZXYsICJyZWd1bGF0b3IuJWQiLAorCQkgICAgIGF0b21pY19pbmNfcmV0dXJuKCZyZWd1bGF0b3Jfbm8pIC0gMSk7CiAJcmV0ID0gZGV2aWNlX3JlZ2lzdGVyKCZyZGV2LT5kZXYpOwotCWlmIChyZXQgIT0gMCkgewotCQlrZnJlZShyZGV2KTsKLQkJcmRldiA9IEVSUl9QVFIocmV0KTsKLQkJZ290byBvdXQ7Ci0JfQorCWlmIChyZXQgIT0gMCkKKwkJZ290byBjbGVhbjsKIAogCWRldl9zZXRfZHJ2ZGF0YSgmcmRldi0+ZGV2LCByZGV2KTsKIAorCS8qIHNldCByZWd1bGF0b3IgY29uc3RyYWludHMgKi8KKwlyZXQgPSBzZXRfbWFjaGluZV9jb25zdHJhaW50cyhyZGV2LCAmaW5pdF9kYXRhLT5jb25zdHJhaW50cyk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gc2NydWI7CisKKwkvKiBhZGQgYXR0cmlidXRlcyBzdXBwb3J0ZWQgYnkgdGhpcyByZWd1bGF0b3IgKi8KKwlyZXQgPSBhZGRfcmVndWxhdG9yX2F0dHJpYnV0ZXMocmRldik7CisJaWYgKHJldCA8IDApCisJCWdvdG8gc2NydWI7CisKIAkvKiBzZXQgc3VwcGx5IHJlZ3VsYXRvciBpZiBpdCBleGlzdHMgKi8KIAlpZiAoaW5pdF9kYXRhLT5zdXBwbHlfcmVndWxhdG9yX2RldikgewogCQlyZXQgPSBzZXRfc3VwcGx5KHJkZXYsCiAJCQlkZXZfZ2V0X2RydmRhdGEoaW5pdF9kYXRhLT5zdXBwbHlfcmVndWxhdG9yX2RldikpOwotCQlpZiAocmV0IDwgMCkgewotCQkJZGV2aWNlX3VucmVnaXN0ZXIoJnJkZXYtPmRldik7Ci0JCQlrZnJlZShyZGV2KTsKLQkJCXJkZXYgPSBFUlJfUFRSKHJldCk7Ci0JCQlnb3RvIG91dDsKLQkJfQorCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gc2NydWI7CiAJfQogCiAJLyogYWRkIGNvbnN1bWVycyBkZXZpY2VzICovCkBAIC0xODExLDEwICsxOTE1LDcgQEAKIAkJCWZvciAoLS1pOyBpID49IDA7IGktLSkKIAkJCQl1bnNldF9jb25zdW1lcl9kZXZpY2Vfc3VwcGx5KHJkZXYsCiAJCQkJCWluaXRfZGF0YS0+Y29uc3VtZXJfc3VwcGxpZXNbaV0uZGV2KTsKLQkJCWRldmljZV91bnJlZ2lzdGVyKCZyZGV2LT5kZXYpOwotCQkJa2ZyZWUocmRldik7Ci0JCQlyZGV2ID0gRVJSX1BUUihyZXQpOwotCQkJZ290byBvdXQ7CisJCQlnb3RvIHNjcnViOwogCQl9CiAJfQogCkBAIC0xODIyLDEyICsxOTIzLDE5IEBACiBvdXQ6CiAJbXV0ZXhfdW5sb2NrKCZyZWd1bGF0b3JfbGlzdF9tdXRleCk7CiAJcmV0dXJuIHJkZXY7CisKK3NjcnViOgorCWRldmljZV91bnJlZ2lzdGVyKCZyZGV2LT5kZXYpOworY2xlYW46CisJa2ZyZWUocmRldik7CisJcmRldiA9IEVSUl9QVFIocmV0KTsKKwlnb3RvIG91dDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHJlZ3VsYXRvcl9yZWdpc3Rlcik7CiAKIC8qKgogICogcmVndWxhdG9yX3VucmVnaXN0ZXIgLSB1bnJlZ2lzdGVyIHJlZ3VsYXRvcgotICogQHJlZ3VsYXRvcjogcmVndWxhdG9yIHNvdXJjZQorICogQHJkZXY6IHJlZ3VsYXRvciB0byB1bnJlZ2lzdGVyCiAgKgogICogQ2FsbGVkIGJ5IHJlZ3VsYXRvciBkcml2ZXJzIHRvIHVucmVnaXN0ZXIgYSByZWd1bGF0b3IuCiAgKi8KQEAgLTE4NDYsNyArMTk1NCw3IEBACiBFWFBPUlRfU1lNQk9MX0dQTChyZWd1bGF0b3JfdW5yZWdpc3Rlcik7CiAKIC8qKgotICogcmVndWxhdG9yX3N1c3BlbmRfcHJlcGFyZTogcHJlcGFyZSByZWd1bGF0b3JzIGZvciBzeXN0ZW0gd2lkZSBzdXNwZW5kCisgKiByZWd1bGF0b3Jfc3VzcGVuZF9wcmVwYXJlIC0gcHJlcGFyZSByZWd1bGF0b3JzIGZvciBzeXN0ZW0gd2lkZSBzdXNwZW5kCiAgKiBAc3RhdGU6IHN5c3RlbSBzdXNwZW5kIHN0YXRlCiAgKgogICogQ29uZmlndXJlIGVhY2ggcmVndWxhdG9yIHdpdGggaXQncyBzdXNwZW5kIG9wZXJhdGluZyBwYXJhbWV0ZXJzIGZvciBzdGF0ZS4KQEAgLTE4ODIsNyArMTk5MCw3IEBACiAKIC8qKgogICogcmRldl9nZXRfZHJ2ZGF0YSAtIGdldCByZGV2IHJlZ3VsYXRvciBkcml2ZXIgZGF0YQotICogQHJlZ3VsYXRvcjogcmVndWxhdG9yCisgKiBAcmRldjogcmVndWxhdG9yCiAgKgogICogR2V0IHJkZXYgcmVndWxhdG9yIGRyaXZlciBwcml2YXRlIGRhdGEuIFRoaXMgY2FsbCBjYW4gYmUgdXNlZCBpbiB0aGUKICAqIHJlZ3VsYXRvciBkcml2ZXIgY29udGV4dC4KQEAgLTE5MTksNyArMjAyNyw3IEBACiAKIC8qKgogICogcmVndWxhdG9yX2dldF9pZCAtIGdldCByZWd1bGF0b3IgSUQKLSAqIEByZWd1bGF0b3I6IHJlZ3VsYXRvcgorICogQHJkZXY6IHJlZ3VsYXRvcgogICovCiBpbnQgcmRldl9nZXRfaWQoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci9kYTkwM3guYyBiL2RyaXZlcnMvcmVndWxhdG9yL2RhOTAzeC5jCmluZGV4IDc3M2IyOWMuLmZlNzc3MzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVndWxhdG9yL2RhOTAzeC5jCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL2RhOTAzeC5jCkBAIC0xMDIsNyArMTAyLDcgQEAKIAl1aW50OF90IHZhbCwgbWFzazsKIAogCWlmIChjaGVja19yYW5nZShpbmZvLCBtaW5fdVYsIG1heF91VikpIHsKLQkJcHJfZXJyKCJpbnZhbGlkIHZvbHRhZ2UgcmFuZ2UgKCVkLCAlZCkgdVYiLCBtaW5fdVYsIG1heF91Vik7CisJCXByX2VycigiaW52YWxpZCB2b2x0YWdlIHJhbmdlICglZCwgJWQpIHVWXG4iLCBtaW5fdVYsIG1heF91Vik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtMTU5LDcgKzE1OSw3IEBACiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAotCXJldHVybiByZWdfdmFsICYgKDEgPDwgaW5mby0+ZW5hYmxlX2JpdCk7CisJcmV0dXJuICEhKHJlZ192YWwgJiAoMSA8PCBpbmZvLT5lbmFibGVfYml0KSk7CiB9CiAKIC8qIERBOTAzMCBzcGVjaWZpYyBvcGVyYXRpb25zICovCkBAIC0xNzIsNyArMTcyLDcgQEAKIAlpbnQgcmV0OwogCiAJaWYgKGNoZWNrX3JhbmdlKGluZm8sIG1pbl91ViwgbWF4X3VWKSkgewotCQlwcl9lcnIoImludmFsaWQgdm9sdGFnZSByYW5nZSAoJWQsICVkKSB1ViIsIG1pbl91ViwgbWF4X3VWKTsKKwkJcHJfZXJyKCJpbnZhbGlkIHZvbHRhZ2UgcmFuZ2UgKCVkLCAlZCkgdVZcbiIsIG1pbl91ViwgbWF4X3VWKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0xOTksNyArMTk5LDcgQEAKIAlpbnQgdGhyZXNoOwogCiAJaWYgKGNoZWNrX3JhbmdlKGluZm8sIG1pbl91ViwgbWF4X3VWKSkgewotCQlwcl9lcnIoImludmFsaWQgdm9sdGFnZSByYW5nZSAoJWQsICVkKSB1ViIsIG1pbl91ViwgbWF4X3VWKTsKKwkJcHJfZXJyKCJpbnZhbGlkIHZvbHRhZ2UgcmFuZ2UgKCVkLCAlZCkgdVZcbiIsIG1pbl91ViwgbWF4X3VWKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0yNDgsNyArMjQ4LDcgQEAKIAlpbnQgcmV0OwogCiAJaWYgKGNoZWNrX3JhbmdlKGluZm8sIG1pbl91ViwgbWF4X3VWKSkgewotCQlwcl9lcnIoImludmFsaWQgdm9sdGFnZSByYW5nZSAoJWQsICVkKSB1ViIsIG1pbl91ViwgbWF4X3VWKTsKKwkJcHJfZXJyKCJpbnZhbGlkIHZvbHRhZ2UgcmFuZ2UgKCVkLCAlZCkgdVZcbiIsIG1pbl91ViwgbWF4X3VWKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0yNzMsNyArMjczLDcgQEAKIAl1aW50OF90IHZhbCwgbWFzazsKIAogCWlmIChjaGVja19yYW5nZShpbmZvLCBtaW5fdVYsIG1heF91VikpIHsKLQkJcHJfZXJyKCJpbnZhbGlkIHZvbHRhZ2UgcmFuZ2UgKCVkLCAlZCkgdVYiLCBtaW5fdVYsIG1heF91Vik7CisJCXByX2VycigiaW52YWxpZCB2b2x0YWdlIHJhbmdlICglZCwgJWQpIHVWXG4iLCBtaW5fdVYsIG1heF91Vik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3Ivd204MzUwLXJlZ3VsYXRvci5jIGIvZHJpdmVycy9yZWd1bGF0b3Ivd204MzUwLXJlZ3VsYXRvci5jCmluZGV4IDFmNDRiMTcuLmM2OGM0OTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVndWxhdG9yL3dtODM1MC1yZWd1bGF0b3IuYworKysgYi9kcml2ZXJzL3JlZ3VsYXRvci93bTgzNTAtcmVndWxhdG9yLmMKQEAgLTEzODAsNiArMTM4MCwxMyBAQAogCWlmICh3bTgzNTAtPnBtaWMucGRldltyZWddKQogCQlyZXR1cm4gLUVCVVNZOwogCisJaWYgKHJlZyA+PSBXTTgzNTBfRENEQ18xICYmIHJlZyA8PSBXTTgzNTBfRENEQ182ICYmCisJICAgIHJlZyA+IHdtODM1MC0+cG1pYy5tYXhfZGNkYykKKwkJcmV0dXJuIC1FTk9ERVY7CisJaWYgKHJlZyA+PSBXTTgzNTBfSVNJTktfQSAmJiByZWcgPD0gV004MzUwX0lTSU5LX0IgJiYKKwkgICAgcmVnID4gd204MzUwLT5wbWljLm1heF9pc2luaykKKwkJcmV0dXJuIC1FTk9ERVY7CisKIAlwZGV2ID0gcGxhdGZvcm1fZGV2aWNlX2FsbG9jKCJ3bTgzNTAtcmVndWxhdG9yIiwgcmVnKTsKIAlpZiAoIXBkZXYpCiAJCXJldHVybiAtRU5PTUVNOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvS2NvbmZpZyBiL2RyaXZlcnMvcnRjL0tjb25maWcKaW5kZXggMTY1YTgxOC4uNGFkODMxZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ydGMvS2NvbmZpZworKysgYi9kcml2ZXJzL3J0Yy9LY29uZmlnCkBAIC0zNSw4ICszNSw4IEBACiAJZGVmYXVsdCAicnRjMCIKIAloZWxwCiAJICBUaGUgUlRDIGRldmljZSB0aGF0IHdpbGwgYmUgdXNlZCB0byAocmUpaW5pdGlhbGl6ZSB0aGUgc3lzdGVtCi0JICBjbG9jaywgdXN1YWxseSBydGMwLiAgSW5pdGlhbGl6YXRpb24gaXMgZG9uZSB3aGVuIHRoZSBzeXN0ZW0KLQkgIHN0YXJ0cyB1cCwgYW5kIHdoZW4gaXQgcmVzdW1lcyBmcm9tIGEgbG93IHBvd2VyIHN0YXRlLiAgVGhpcworCSAgY2xvY2ssIHVzdWFsbHkgcnRjMC4gSW5pdGlhbGl6YXRpb24gaXMgZG9uZSB3aGVuIHRoZSBzeXN0ZW0KKwkgIHN0YXJ0cyB1cCwgYW5kIHdoZW4gaXQgcmVzdW1lcyBmcm9tIGEgbG93IHBvd2VyIHN0YXRlLiBUaGlzCiAJICBkZXZpY2Ugc2hvdWxkIHJlY29yZCB0aW1lIGluIFVUQywgc2luY2UgdGhlIGtlcm5lbCB3b24ndCBkbwogCSAgdGltZXpvbmUgY29ycmVjdGlvbi4KIApAQCAtNDQsNyArNDQsNyBAQAogCSAgZnVuY3Rpb25zIHJ1biwgc28gaXQgbXVzdCB1c3VhbGx5IGJlIHN0YXRpY2FsbHkgbGlua2VkLgogCiAJICBUaGlzIGNsb2NrIHNob3VsZCBiZSBiYXR0ZXJ5LWJhY2tlZCwgc28gdGhhdCBpdCByZWFkcyB0aGUgY29ycmVjdAotCSAgdGltZSB3aGVuIHRoZSBzeXN0ZW0gYm9vdHMgZnJvbSBhIHBvd2VyLW9mZiBzdGF0ZS4gIE90aGVyd2lzZSwgeW91cgorCSAgdGltZSB3aGVuIHRoZSBzeXN0ZW0gYm9vdHMgZnJvbSBhIHBvd2VyLW9mZiBzdGF0ZS4gT3RoZXJ3aXNlLCB5b3VyCiAJICBzeXN0ZW0gd2lsbCBuZWVkIGFuIGV4dGVybmFsIGNsb2NrIHNvdXJjZSAobGlrZSBhbiBOVFAgc2VydmVyKS4KIAogCSAgSWYgdGhlIGNsb2NrIHlvdSBzcGVjaWZ5IGhlcmUgaXMgbm90IGJhdHRlcnkgYmFja2VkLCBpdCBtYXkgc3RpbGwKQEAgLTY5LDggKzY5LDcgQEAKIAkgIFNheSB5ZXMgaGVyZSBpZiB5b3Ugd2FudCB0byB1c2UgeW91ciBSVENzIHVzaW5nIHN5c2ZzIGludGVyZmFjZXMsCiAJICAvc3lzL2NsYXNzL3J0Yy9ydGMwIHRocm91Z2ggL3N5cy8uLi4vcnRjTi4KIAotCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuIElmIHNvLCB0aGUgbW9kdWxlCi0JICB3aWxsIGJlIGNhbGxlZCBydGMtc3lzZnMuCisJICBJZiB1bnN1cmUsIHNheSBZLgogCiBjb25maWcgUlRDX0lOVEZfUFJPQwogCWJvb2xlYW4gIi9wcm9jL2RyaXZlci9ydGMgKHByb2NmcyBmb3IgcnRjMCkiCkBAIC03OCwxMSArNzcsMTAgQEAKIAlkZWZhdWx0IFJUQ19DTEFTUwogCWhlbHAKIAkgIFNheSB5ZXMgaGVyZSBpZiB5b3Ugd2FudCB0byB1c2UgeW91ciBmaXJzdCBSVEMgdGhyb3VnaCB0aGUgcHJvYwotCSAgaW50ZXJmYWNlLCAvcHJvYy9kcml2ZXIvcnRjLiAgT3RoZXIgUlRDcyB3aWxsIG5vdCBiZSBhdmFpbGFibGUKKwkgIGludGVyZmFjZSwgL3Byb2MvZHJpdmVyL3J0Yy4gT3RoZXIgUlRDcyB3aWxsIG5vdCBiZSBhdmFpbGFibGUKIAkgIHRocm91Z2ggdGhhdCBBUEkuCiAKLQkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiBJZiBzbywgdGhlIG1vZHVsZQotCSAgd2lsbCBiZSBjYWxsZWQgcnRjLXByb2MuCisJICBJZiB1bnN1cmUsIHNheSBZLgogCiBjb25maWcgUlRDX0lOVEZfREVWCiAJYm9vbGVhbiAiL2Rldi9ydGNOIChjaGFyYWN0ZXIgZGV2aWNlcykiCkBAIC05MCwxMiArODgsMTQgQEAKIAloZWxwCiAJICBTYXkgeWVzIGhlcmUgaWYgeW91IHdhbnQgdG8gdXNlIHlvdXIgUlRDcyB1c2luZyB0aGUgL2RldgogCSAgaW50ZXJmYWNlcywgd2hpY2ggInVkZXYiIHNldHMgdXAgYXMgL2Rldi9ydGMwIHRocm91Z2gKLQkgIC9kZXYvcnRjTi4gIFlvdSBtYXkgd2FudCB0byBzZXQgdXAgYSBzeW1ib2xpYyBsaW5rIHNvIG9uZQotCSAgb2YgdGhlc2UgY2FuIGJlIGFjY2Vzc2VkIGFzIC9kZXYvcnRjLCB3aGljaCBpcyBhIG5hbWUKLQkgIGV4cGVjdGVkIGJ5ICJod2Nsb2NrIiBhbmQgc29tZSBvdGhlciBwcm9ncmFtcy4KKwkgIC9kZXYvcnRjTi4KIAotCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuIElmIHNvLCB0aGUgbW9kdWxlCi0JICB3aWxsIGJlIGNhbGxlZCBydGMtZGV2LgorCSAgWW91IG1heSB3YW50IHRvIHNldCB1cCBhIHN5bWJvbGljIGxpbmsgc28gb25lIG9mIHRoZXNlCisJICBjYW4gYmUgYWNjZXNzZWQgYXMgL2Rldi9ydGMsIHdoaWNoIGlzIGEgbmFtZQorCSAgZXhwZWN0ZWQgYnkgImh3Y2xvY2siIGFuZCBzb21lIG90aGVyIHByb2dyYW1zLiBSZWNlbnQKKwkgIHZlcnNpb25zIG9mICJ1ZGV2IiBhcmUga25vd24gdG8gc2V0IHVwIHRoZSBzeW1saW5rIGZvciB5b3UuCisKKwkgIElmIHVuc3VyZSwgc2F5IFkuCiAKIGNvbmZpZyBSVENfSU5URl9ERVZfVUlFX0VNVUwKIAlib29sICJSVEMgVUlFIGVtdWxhdGlvbiBvbiBkZXYgaW50ZXJmYWNlIgpAQCAtMTMyLDE0ICsxMzIsMTQgQEAKIAl0cmlzdGF0ZSAiRGFsbGFzL01heGltIERTMTMwNy8zNy8zOC8zOS80MCwgU1QgTTQxVDAwIgogCWhlbHAKIAkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciB2YXJpb3VzIGNvbXBhdGlibGUgUlRDCi0JICBjaGlwcyAob2Z0ZW4gd2l0aCBiYXR0ZXJ5IGJhY2t1cCkgY29ubmVjdGVkIHdpdGggSTJDLiAgVGhpcyBkcml2ZXIKKwkgIGNoaXBzIChvZnRlbiB3aXRoIGJhdHRlcnkgYmFja3VwKSBjb25uZWN0ZWQgd2l0aCBJMkMuIFRoaXMgZHJpdmVyCiAJICBzaG91bGQgaGFuZGxlIERTMTMwNywgRFMxMzM3LCBEUzEzMzgsIERTMTMzOSwgRFMxMzQwLCBTVCBNNDFUMDAsCi0JICBhbmQgcHJvYmFibHkgb3RoZXIgY2hpcHMuICBJbiBzb21lIGNhc2VzIHRoZSBSVEMgbXVzdCBhbHJlYWR5CisJICBhbmQgcHJvYmFibHkgb3RoZXIgY2hpcHMuIEluIHNvbWUgY2FzZXMgdGhlIFJUQyBtdXN0IGFscmVhZHkKIAkgIGhhdmUgYmVlbiBpbml0aWFsaXplZCAoYnkgbWFudWZhY3R1cmluZyBvciBhIGJvb3Rsb2FkZXIpLgogCiAJICBUaGUgZmlyc3Qgc2V2ZW4gcmVnaXN0ZXJzIG9uIHRoZXNlIGNoaXBzIGhvbGQgYW4gUlRDLCBhbmQgb3RoZXIKIAkgIHJlZ2lzdGVycyBtYXkgYWRkIGZlYXR1cmVzIHN1Y2ggYXMgTlZSQU0sIGEgdHJpY2tsZSBjaGFyZ2VyIGZvcgotCSAgdGhlIFJUQy9OVlJBTSBiYWNrdXAgcG93ZXIsIGFuZCBhbGFybXMuICBOVlJBTSBpcyB2aXNpYmxlIGluCisJICB0aGUgUlRDL05WUkFNIGJhY2t1cCBwb3dlciwgYW5kIGFsYXJtcy4gTlZSQU0gaXMgdmlzaWJsZSBpbgogCSAgc3lzZnMsIGJ1dCBvdGhlciBjaGlwIGZlYXR1cmVzIG1heSBub3QgYmUgYXZhaWxhYmxlLgogCiAJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gSWYgc28sIHRoZSBtb2R1bGUKQEAgLTE1MCwxMCArMTUwLDEwIEBACiAJZGVwZW5kcyBvbiBSVENfQ0xBU1MgJiYgSTJDCiAJaGVscAogCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIERhbGxhcyBTZW1pY29uZHVjdG9yCi0JICBEUzEzNzQgcmVhbC10aW1lIGNsb2NrIGNoaXBzLiAgSWYgYW4gaW50ZXJydXB0IGlzIGFzc29jaWF0ZWQKKwkgIERTMTM3NCByZWFsLXRpbWUgY2xvY2sgY2hpcHMuIElmIGFuIGludGVycnVwdCBpcyBhc3NvY2lhdGVkCiAJICB3aXRoIHRoZSBkZXZpY2UsIHRoZSBhbGFybSBmdW5jdGlvbmFsaXR5IGlzIHN1cHBvcnRlZC4KIAotCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQorCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuIElmIHNvLCB0aGUgbW9kdWxlCiAJICB3aWxsIGJlIGNhbGxlZCBydGMtZHMxMzc0LgogCiBjb25maWcgUlRDX0RSVl9EUzE2NzIKQEAgLTI0Nyw3ICsyNDcsNyBAQAogCWhlbHAKIAkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciB0aGUgUlRDIG9uIHRoZQogCSAgVFdMOTIzMzAgIk1lbmVsYXVzIiBwb3dlciBtYW5hZ2VtZW50IGNoaXAsIHVzZWQgd2l0aCBPTUFQMgotCSAgcGxhdGZvcm1zLiAgVGhlIHN1cHBvcnQgaXMgaW50ZWdyYXRlZCB3aXRoIHRoZSByZXN0IG9mCisJICBwbGF0Zm9ybXMuIFRoZSBzdXBwb3J0IGlzIGludGVncmF0ZWQgd2l0aCB0aGUgcmVzdCBvZgogCSAgdGhlIE1lbmVsYXVzIGRyaXZlcjsgaXQncyBub3Qgc2VwYXJhdGUgbW9kdWxlLgogCiBjb25maWcgUlRDX0RSVl9UV0w0MDMwCkBAIC0zMDgsNyArMzA4LDcgQEAKIAl0cmlzdGF0ZSAiRGFsbGFzL01heGltIERTMTMwNS9EUzEzMDYiCiAJaGVscAogCSAgU2VsZWN0IHRoaXMgZHJpdmVyIHRvIGdldCBzdXBwb3J0IGZvciB0aGUgRGFsbGFzL01heGltIERTMTMwNQotCSAgYW5kIERTMTMwNiByZWFsIHRpbWUgY2xvY2sgY2hpcHMuICBUaGVzZSBzdXBwb3J0IGEgdHJpY2tsZQorCSAgYW5kIERTMTMwNiByZWFsIHRpbWUgY2xvY2sgY2hpcHMuIFRoZXNlIHN1cHBvcnQgYSB0cmlja2xlCiAJICBjaGFyZ2VyLCBhbGFybXMsIGFuZCBOVlJBTSBpbiBhZGRpdGlvbiB0byB0aGUgY2xvY2suCiAKIAkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiBJZiBzbywgdGhlIG1vZHVsZQpAQCAtMzE3LDcgKzMxNyw4IEBACiBjb25maWcgUlRDX0RSVl9EUzEzOTAKIAl0cmlzdGF0ZSAiRGFsbGFzL01heGltIERTMTM5MC85My85NCIKIAloZWxwCi0JICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgdGhlIERTMTM5MC85My85NCBjaGlwcy4KKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciB0aGUKKwkgIERhbGxhcy9NYXhpbSBEUzEzOTAvOTMvOTQgY2hpcHMuCiAKIAkgIFRoaXMgZHJpdmVyIG9ubHkgc3VwcG9ydHMgdGhlIFJUQyBmZWF0dXJlLCBhbmQgbm90IG90aGVyIGNoaXAKIAkgIGZlYXR1cmVzIHN1Y2ggYXMgYWxhcm1zIGFuZCB0cmlja2xlIGNoYXJnaW5nLgpAQCAtMzgxLDcgKzM4Miw3IEBACiAJICBvciBMUEMgYnVzIGNoaXBzLCBhbmQgc28gb24uCiAKIAkgIFlvdXIgc3lzdGVtIHdpbGwgbmVlZCB0byBkZWZpbmUgdGhlIHBsYXRmb3JtIGRldmljZSB1c2VkIGJ5Ci0JICB0aGlzIGRyaXZlciwgb3RoZXJ3aXNlIGl0IHdvbid0IGJlIGFjY2Vzc2libGUuICBUaGlzIG1lYW5zCisJICB0aGlzIGRyaXZlciwgb3RoZXJ3aXNlIGl0IHdvbid0IGJlIGFjY2Vzc2libGUuIFRoaXMgbWVhbnMKIAkgIHlvdSBjYW4gc2FmZWx5IGVuYWJsZSB0aGlzIGRyaXZlciBpZiB5b3UgZG9uJ3Qga25vdyB3aGV0aGVyCiAJICBvciBub3QgeW91ciBib2FyZCBoYXMgdGhpcyBraW5kIG9mIGhhcmR3YXJlLgogCkBAIC01OTgsNyArNTk5LDcgQEAKIAlkZXBlbmRzIG9uIEFSQ0hfQVQ5MVJNOTIwMCB8fCBBUkNIX0FUOTFTQU05UkwKIAloZWxwCiAJICBEcml2ZXIgZm9yIHRoZSBpbnRlcm5hbCBSVEMgKFJlYWx0aW1lIENsb2NrKSBtb2R1bGUgZm91bmQgb24KLQkgIEF0bWVsIEFUOTFSTTkyMDAncyBhbmQgQVQ5MVNBTTlSTCBjaGlwcy4gIE9uIFNBTTlSTCBjaGlwcworCSAgQXRtZWwgQVQ5MVJNOTIwMCdzIGFuZCBBVDkxU0FNOVJMIGNoaXBzLiBPbiBTQU05UkwgY2hpcHMKIAkgIHRoaXMgaXMgcG93ZXJlZCBieSB0aGUgYmFja3VwIHBvd2VyIHN1cHBseS4KIAogY29uZmlnIFJUQ19EUlZfQVQ5MVNBTTkKQEAgLTYyMCw4ICs2MjEsOCBAQAogCXByb21wdCAiUlRUIG1vZHVsZSBOdW1iZXIiIGlmIEFSQ0hfQVQ5MVNBTTkyNjMKIAlkZXBlbmRzIG9uIFJUQ19EUlZfQVQ5MVNBTTkKIAloZWxwCi0JICBNb3JlIHRoYW4gb25lIFJUVCBtb2R1bGUgaXMgYXZhaWxhYmxlLiAgWW91IGNhbiBjaG9vc2Ugd2hpY2gKLQkgIG9uZSB3aWxsIGJlIHVzZWQgYXMgYW4gUlRDLiAgVGhlIGRlZmF1bHQgb2YgemVybyBpcyBub3JtYWxseQorCSAgTW9yZSB0aGFuIG9uZSBSVFQgbW9kdWxlIGlzIGF2YWlsYWJsZS4gWW91IGNhbiBjaG9vc2Ugd2hpY2gKKwkgIG9uZSB3aWxsIGJlIHVzZWQgYXMgYW4gUlRDLiBUaGUgZGVmYXVsdCBvZiB6ZXJvIGlzIG5vcm1hbGx5CiAJICBPSyB0byB1c2UsIHRob3VnaCBzb21lIHN5c3RlbXMgdXNlIHRoYXQgZm9yIG5vbi1SVEMgcHVycG9zZXMuCiAKIGNvbmZpZyBSVENfRFJWX0FUOTFTQU05X0dQQlIKQEAgLTYzMywxMCArNjM0LDIwIEBACiAJZGVwZW5kcyBvbiBSVENfRFJWX0FUOTFTQU05CiAJaGVscAogCSAgVGhlIFJUQyBkcml2ZXIgbmVlZHMgdG8gdXNlIG9uZSBvZiB0aGUgR2VuZXJhbCBQdXJwb3NlIEJhY2t1cAotCSAgUmVnaXN0ZXJzIChHUEJScykgYXMgd2VsbCBhcyB0aGUgUlRULiAgWW91IGNhbiBjaG9vc2Ugd2hpY2ggb25lCi0JICB3aWxsIGJlIHVzZWQuICBUaGUgZGVmYXVsdCBvZiB6ZXJvIGlzIG5vcm1hbGx5IE9LIHRvIHVzZSwgYnV0CisJICBSZWdpc3RlcnMgKEdQQlJzKSBhcyB3ZWxsIGFzIHRoZSBSVFQuIFlvdSBjYW4gY2hvb3NlIHdoaWNoIG9uZQorCSAgd2lsbCBiZSB1c2VkLiBUaGUgZGVmYXVsdCBvZiB6ZXJvIGlzIG5vcm1hbGx5IE9LIHRvIHVzZSwgYnV0CiAJICBvbiBzb21lIHN5c3RlbXMgb3RoZXIgc29mdHdhcmUgbmVlZHMgdG8gdXNlIHRoYXQgcmVnaXN0ZXIuCiAKK2NvbmZpZyBSVENfRFJWX0FVMVhYWAorCXRyaXN0YXRlICJBdTF4eHggQ291bnRlcjAgUlRDIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBTT0NfQVUxWDAwCisJaGVscAorCSAgVGhpcyBpcyBhIGRyaXZlciBmb3IgdGhlIEF1MXh4eCBvbi1jaGlwIENvdW50ZXIwIChUaW1lLU9mLVllYXIKKwkgIGNvdW50ZXIpIHRvIGJlIHVzZWQgYXMgYSBSVEMuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgcnRjLWF1MXh4eC4KKwogY29uZmlnIFJUQ19EUlZfQkZJTgogCXRyaXN0YXRlICJCbGFja2ZpbiBPbi1DaGlwIFJUQyIKIAlkZXBlbmRzIG9uIEJMQUNLRklOICYmICFCRjU2MQpAQCAtNjY5LDYgKzY4MCwxNyBAQAogCSB0aGUgUlRDLiBUaGlzIGV4cG9zZXMgdGhhdCBmdW5jdGlvbmFsaXR5IHRocm91Z2ggdGhlIGdlbmVyaWMgUlRDCiAJIGNsYXNzLgogCitjb25maWcgUlRDX0RSVl9QWEEKKyAgICAgICB0cmlzdGF0ZSAiUFhBMjd4L1BYQTN4eCIKKyAgICAgICBkZXBlbmRzIG9uIEFSQ0hfUFhBCisgICAgICAgaGVscAorICAgICAgICAgSWYgeW91IHNheSBZIGhlcmUgeW91IHdpbGwgZ2V0IGFjY2VzcyB0byB0aGUgcmVhbCB0aW1lIGNsb2NrCisgICAgICAgICBidWlsdCBpbnRvIHlvdXIgUFhBMjd4IG9yIFBYQTN4eCBDUFUuCisKKyAgICAgICAgIFRoaXMgUlRDIGRyaXZlciB1c2VzIFBYQSBSVEMgcmVnaXN0ZXJzIGF2YWlsYWJsZSBzaW5jZSBweGEyN3gKKyAgICAgICAgIHNlcmllcyAoUkR4UiwgUll4UikgaW5zdGVhZCBvZiBsZWdhY3kgUkNOUiwgUlRBUi4KKworCiBjb25maWcgUlRDX0RSVl9TVU40VgogCWJvb2wgIlNVTjRWIEh5cGVydmlzb3IgUlRDIgogCWRlcGVuZHMgb24gU1BBUkM2NApAQCAtNjgzLDQgKzcwNSwyMiBAQAogCSAgSWYgeW91IHNheSBZIGhlcmUgeW91IHdpbGwgZ2V0IHN1cHBvcnQgZm9yIHRoZSBSVEMgZm91bmQgb24KIAkgIFN0YXJmaXJlIHN5c3RlbXMuCiAKK2NvbmZpZyBSVENfRFJWX1RYNDkzOQorCXRyaXN0YXRlICJUWDQ5MzkgU29DIgorCWRlcGVuZHMgb24gU09DX1RYNDkzOQorCWhlbHAKKwkgIERyaXZlciBmb3IgdGhlIGludGVybmFsIFJUQyAoUmVhbHRpbWUgQ2xvY2spIG1vZHVsZSBmb3VuZCBvbgorCSAgVG9zaGliYSBUWDQ5MzkgU29DLgorCitjb25maWcgUlRDX0RSVl9NVgorCXRyaXN0YXRlICJNYXJ2ZWxsIFNvQyBSVEMiCisJZGVwZW5kcyBvbiBBUkNIX0tJUktXT09ECisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3Ugd2lsbCBnZXQgc3VwcG9ydCBmb3IgdGhlIGluLWNoaXAgUlRDCisJICB0aGF0IGNhbiBiZSBmb3VuZCBpbiBzb21lIG9mIE1hcnZlbGwncyBTb0MgZGV2aWNlcywgc3VjaCBhcworCSAgdGhlIEtpcmt3b29kIDg4RjYyODEgYW5kIDg4RjYxOTIuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgcnRjLW12LgorCiBlbmRpZiAjIFJUQ19DTEFTUwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvTWFrZWZpbGUgYi9kcml2ZXJzL3J0Yy9NYWtlZmlsZQppbmRleCA2ZTc5YzkxLi45YTQzNDBkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3J0Yy9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3J0Yy9NYWtlZmlsZQpAQCAtMjAsNiArMjAsNyBAQAogb2JqLSQoQ09ORklHX1JUQ19EUlZfQVQzMkFQNzAwWCkrPSBydGMtYXQzMmFwNzAweC5vCiBvYmotJChDT05GSUdfUlRDX0RSVl9BVDkxUk05MjAwKSs9IHJ0Yy1hdDkxcm05MjAwLm8KIG9iai0kKENPTkZJR19SVENfRFJWX0FUOTFTQU05KQkrPSBydGMtYXQ5MXNhbTkubworb2JqLSQoQ09ORklHX1JUQ19EUlZfQVUxWFhYKQkrPSBydGMtYXUxeHh4Lm8KIG9iai0kKENPTkZJR19SVENfRFJWX0JGSU4pCSs9IHJ0Yy1iZmluLm8KIG9iai0kKENPTkZJR19SVENfRFJWX0NNT1MpCSs9IHJ0Yy1jbW9zLm8KIG9iai0kKENPTkZJR19SVENfRFJWX0RTMTIxNikJKz0gcnRjLWRzMTIxNi5vCkBAIC00Nyw2ICs0OCw3IEBACiBvYmotJChDT05GSUdfUlRDX0RSVl9TVEFSRklSRSkJKz0gcnRjLXN0YXJmaXJlLm8KIG9iai0kKENPTkZJR19SVENfRFJWX01BWDY5MDApCSs9IHJ0Yy1tYXg2OTAwLm8KIG9iai0kKENPTkZJR19SVENfRFJWX01BWDY5MDIpCSs9IHJ0Yy1tYXg2OTAyLm8KK29iai0kKENPTkZJR19SVENfRFJWX01WKQkrPSBydGMtbXYubwogb2JqLSQoQ09ORklHX1JUQ19EUlZfT01BUCkJKz0gcnRjLW9tYXAubwogb2JqLSQoQ09ORklHX1JUQ19EUlZfUENGODU2MykJKz0gcnRjLXBjZjg1NjMubwogb2JqLSQoQ09ORklHX1JUQ19EUlZfUENGODU4MykJKz0gcnRjLXBjZjg1ODMubwpAQCAtNTQsNiArNTYsNyBAQAogb2JqLSQoQ09ORklHX1JUQ19EUlZfUEwwMzEpCSs9IHJ0Yy1wbDAzMS5vCiBvYmotJChDT05GSUdfUlRDX0RSVl9QQVJJU0MpCSs9IHJ0Yy1wYXJpc2Mubwogb2JqLSQoQ09ORklHX1JUQ19EUlZfUFBDKQkrPSBydGMtcHBjLm8KK29iai0kKENPTkZJR19SVENfRFJWX1BYQSkJKz0gcnRjLXB4YS5vCiBvYmotJChDT05GSUdfUlRDX0RSVl9SOTcwMSkJKz0gcnRjLXI5NzAxLm8KIG9iai0kKENPTkZJR19SVENfRFJWX1JTNUMzMTMpCSs9IHJ0Yy1yczVjMzEzLm8KIG9iai0kKENPTkZJR19SVENfRFJWX1JTNUMzNDgpCSs9IHJ0Yy1yczVjMzQ4Lm8KQEAgLTY2LDYgKzY5LDcgQEAKIG9iai0kKENPTkZJR19SVENfRFJWX1NUSzE3VEE4KQkrPSBydGMtc3RrMTd0YTgubwogb2JqLSQoQ09ORklHX1JUQ19EUlZfVEVTVCkJKz0gcnRjLXRlc3Qubwogb2JqLSQoQ09ORklHX1JUQ19EUlZfVFdMNDAzMCkJKz0gcnRjLXR3bDQwMzAubworb2JqLSQoQ09ORklHX1JUQ19EUlZfVFg0OTM5KQkrPSBydGMtdHg0OTM5Lm8KIG9iai0kKENPTkZJR19SVENfRFJWX1YzMDIwKQkrPSBydGMtdjMwMjAubwogb2JqLSQoQ09ORklHX1JUQ19EUlZfVlI0MVhYKQkrPSBydGMtdnI0MXh4Lm8KIG9iai0kKENPTkZJR19SVENfRFJWX1dNODM1MCkJKz0gcnRjLXdtODM1MC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9jbGFzcy5jIGIvZHJpdmVycy9ydGMvY2xhc3MuYwppbmRleCA0ZGZkZjAxLi5iZTVhNmI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3J0Yy9jbGFzcy5jCisrKyBiL2RyaXZlcnMvcnRjL2NsYXNzLmMKQEAgLTQ4LDkgKzQ4LDcgQEAKIAlzdHJ1Y3QgcnRjX3RpbWUJCXRtOwogCXN0cnVjdCB0aW1lc3BlYwkJdHMgPSBjdXJyZW50X2tlcm5lbF90aW1lKCk7CiAKLQlpZiAoc3RybmNtcChydGMtPmRldi5idXNfaWQsCi0JCQkJQ09ORklHX1JUQ19IQ1RPU1lTX0RFVklDRSwKLQkJCQlCVVNfSURfU0laRSkgIT0gMCkKKwlpZiAoc3RyY21wKGRldl9uYW1lKCZydGMtPmRldiksIENPTkZJR19SVENfSENUT1NZU19ERVZJQ0UpICE9IDApCiAJCXJldHVybiAwOwogCiAJcnRjX3JlYWRfdGltZShydGMsICZ0bSk7CkBAIC03MSwyMCArNjksMTggQEAKIAl0aW1lX3QJCQluZXd0aW1lOwogCXN0cnVjdCB0aW1lc3BlYwkJdGltZTsKIAotCWlmIChzdHJuY21wKHJ0Yy0+ZGV2LmJ1c19pZCwKLQkJCQlDT05GSUdfUlRDX0hDVE9TWVNfREVWSUNFLAotCQkJCUJVU19JRF9TSVpFKSAhPSAwKQorCWlmIChzdHJjbXAoZGV2X25hbWUoJnJ0Yy0+ZGV2KSwgQ09ORklHX1JUQ19IQ1RPU1lTX0RFVklDRSkgIT0gMCkKIAkJcmV0dXJuIDA7CiAKIAlydGNfcmVhZF90aW1lKHJ0YywgJnRtKTsKIAlpZiAocnRjX3ZhbGlkX3RtKCZ0bSkgIT0gMCkgewotCQlwcl9kZWJ1ZygiJXM6ICBib2d1cyByZXN1bWUgdGltZVxuIiwgcnRjLT5kZXYuYnVzX2lkKTsKKwkJcHJfZGVidWcoIiVzOiAgYm9ndXMgcmVzdW1lIHRpbWVcbiIsIGRldl9uYW1lKCZydGMtPmRldikpOwogCQlyZXR1cm4gMDsKIAl9CiAJcnRjX3RtX3RvX3RpbWUoJnRtLCAmbmV3dGltZSk7CiAJaWYgKG5ld3RpbWUgPD0gb2xkdGltZSkgewogCQlpZiAobmV3dGltZSA8IG9sZHRpbWUpCi0JCQlwcl9kZWJ1ZygiJXM6ICB0aW1lIHRyYXZlbCFcbiIsIHJ0Yy0+ZGV2LmJ1c19pZCk7CisJCQlwcl9kZWJ1ZygiJXM6ICB0aW1lIHRyYXZlbCFcbiIsIGRldl9uYW1lKCZydGMtPmRldikpOwogCQlyZXR1cm4gMDsKIAl9CiAKQEAgLTE1Niw3ICsxNTIsNyBAQAogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnJ0Yy0+aXJxX3F1ZXVlKTsKIAogCXN0cmxjcHkocnRjLT5uYW1lLCBuYW1lLCBSVENfREVWSUNFX05BTUVfU0laRSk7Ci0Jc25wcmludGYocnRjLT5kZXYuYnVzX2lkLCBCVVNfSURfU0laRSwgInJ0YyVkIiwgaWQpOworCWRldl9zZXRfbmFtZSgmcnRjLT5kZXYsICJydGMlZCIsIGlkKTsKIAogCXJ0Y19kZXZfcHJlcGFyZShydGMpOwogCkBAIC0xNjksNyArMTY1LDcgQEAKIAlydGNfcHJvY19hZGRfZGV2aWNlKHJ0Yyk7CiAKIAlkZXZfaW5mbyhkZXYsICJydGMgY29yZTogcmVnaXN0ZXJlZCAlcyBhcyAlc1xuIiwKLQkJCXJ0Yy0+bmFtZSwgcnRjLT5kZXYuYnVzX2lkKTsKKwkJCXJ0Yy0+bmFtZSwgZGV2X25hbWUoJnJ0Yy0+ZGV2KSk7CiAKIAlyZXR1cm4gcnRjOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9pbnRlcmZhY2UuYyBiL2RyaXZlcnMvcnRjL2ludGVyZmFjZS5jCmluZGV4IGZkMmM2NTIuLjQzNDhjNGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcnRjL2ludGVyZmFjZS5jCisrKyBiL2RyaXZlcnMvcnRjL2ludGVyZmFjZS5jCkBAIC01MCwxMCArNTAsMTUgQEAKIAogCWlmICghcnRjLT5vcHMpCiAJCWVyciA9IC1FTk9ERVY7Ci0JZWxzZSBpZiAoIXJ0Yy0+b3BzLT5zZXRfdGltZSkKLQkJZXJyID0gLUVJTlZBTDsKLQllbHNlCisJZWxzZSBpZiAocnRjLT5vcHMtPnNldF90aW1lKQogCQllcnIgPSBydGMtPm9wcy0+c2V0X3RpbWUocnRjLT5kZXYucGFyZW50LCB0bSk7CisJZWxzZSBpZiAocnRjLT5vcHMtPnNldF9tbXNzKSB7CisJCXVuc2lnbmVkIGxvbmcgc2VjczsKKwkJZXJyID0gcnRjX3RtX3RvX3RpbWUodG0sICZzZWNzKTsKKwkJaWYgKGVyciA9PSAwKQorCQkJZXJyID0gcnRjLT5vcHMtPnNldF9tbXNzKHJ0Yy0+ZGV2LnBhcmVudCwgc2Vjcyk7CisJfSBlbHNlCisJCWVyciA9IC1FSU5WQUw7CiAKIAltdXRleF91bmxvY2soJnJ0Yy0+b3BzX2xvY2spOwogCXJldHVybiBlcnI7CkBAIC0zODksNyArMzk0LDcgQEAKIHsKIAljaGFyICpuYW1lID0gKGNoYXIgKilkYXRhOwogCi0JaWYgKHN0cm5jbXAoZGV2LT5idXNfaWQsIG5hbWUsIEJVU19JRF9TSVpFKSA9PSAwKQorCWlmIChzdHJjbXAoZGV2X25hbWUoZGV2KSwgbmFtZSkgPT0gMCkKIAkJcmV0dXJuIDE7CiAJcmV0dXJuIDA7CiB9CkBAIC01MDQsOSArNTA5LDYgQEAKIAlpZiAocnRjLT5vcHMtPmlycV9zZXRfZnJlcSA9PSBOVUxMKQogCQlyZXR1cm4gLUVOWElPOwogCi0JaWYgKCFpc19wb3dlcl9vZl8yKGZyZXEpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQogCXNwaW5fbG9ja19pcnFzYXZlKCZydGMtPmlycV90YXNrX2xvY2ssIGZsYWdzKTsKIAlpZiAocnRjLT5pcnFfdGFzayAhPSBOVUxMICYmIHRhc2sgPT0gTlVMTCkKIAkJZXJyID0gLUVCVVNZOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvcnRjLWF0MzJhcDcwMHguYyBiL2RyaXZlcnMvcnRjL3J0Yy1hdDMyYXA3MDB4LmMKaW5kZXggOTBiOWE2NS4uZTFlYzMzZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ydGMvcnRjLWF0MzJhcDcwMHguYworKysgYi9kcml2ZXJzL3J0Yy9ydGMtYXQzMmFwNzAweC5jCkBAIC0yMDUsNyArMjA1LDcgQEAKIHsKIAlzdHJ1Y3QgcmVzb3VyY2UJKnJlZ3M7CiAJc3RydWN0IHJ0Y19hdDMyYXA3MDB4ICpydGM7Ci0JaW50IGlycSA9IC0xOworCWludCBpcnE7CiAJaW50IHJldDsKIAogCXJ0YyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBydGNfYXQzMmFwNzAweCksIEdGUF9LRVJORUwpOwpAQCAtMjIyLDcgKzIyMiw3IEBACiAJfQogCiAJaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKLQlpZiAoaXJxIDwgMCkgeworCWlmIChpcnEgPD0gMCkgewogCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJjb3VsZCBub3QgZ2V0IGlycVxuIik7CiAJCXJldCA9IC1FTlhJTzsKIAkJZ290byBvdXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9ydGMtYXUxeHh4LmMgYi9kcml2ZXJzL3J0Yy9ydGMtYXUxeHh4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODkwNmE2OAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvcnRjL3J0Yy1hdTF4eHguYwpAQCAtMCwwICsxLDE1MyBAQAorLyoKKyAqIEF1MXh4eCBjb3VudGVyMCAoYWthIFRpbWUtT2YtWWVhciBjb3VudGVyKSBSVEMgaW50ZXJmYWNlIGRyaXZlci4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggTWFudWVsIExhdXNzIDxtYW5vQHJvYXJpbmVsay5ob21lbGludXgubmV0PgorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKy8qIEFsbCBjdXJyZW50IEF1MXh4eCBTb0NzIGhhdmUgMiBjb3VudGVycyBmZWQgYnkgYW4gZXh0ZXJuYWwgMzIuNzY4IGtIegorICogY3J5c3RhbC4gQ291bnRlciAwLCB3aGljaCBrZWVwcyBjb3VudGluZyBkdXJpbmcgc2xlZXAvcG93ZXJkb3duLCBpcworICogdXNlZCB0byBjb3VudCBzZWNvbmRzIHNpbmNlIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHVuaXggZXBvY2guCisgKgorICogVGhlIGNvdW50ZXJzIG11c3QgYmUgY29uZmlndXJlZCBhbmQgZW5hYmxlZCBieSBib290bG9hZGVyL2JvYXJkIGNvZGU7CisgKiBubyBjaGVja3MgYXMgdG8gd2hldGhlciB0aGV5IHJlYWxseSBnZXQgYSBwcm9wZXIgMzIuNzY4a0h6IGNsb2NrIGFyZQorICogbWFkZSBhcyB0aGlzIHdvdWxkIHRha2UgZmFyIHRvbyBsb25nLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9ydGMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxhc20vbWFjaC1hdTF4MDAvYXUxMDAwLmg+CisKKy8qIDMya0h6IGNsb2NrIGVuYWJsZWQgYW5kIGRldGVjdGVkICovCisjZGVmaW5lIENOVFJfT0sgKFNZU19DTlRSTF9FMCB8IFNZU19DTlRSTF8zMlMpCisKK3N0YXRpYyBpbnQgYXUxeHRveV9ydGNfcmVhZF90aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICp0bSkKK3sKKwl1bnNpZ25lZCBsb25nIHQ7CisKKwl0ID0gYXVfcmVhZGwoU1lTX1RPWVJFQUQpOworCisJcnRjX3RpbWVfdG9fdG0odCwgdG0pOworCisJcmV0dXJuIHJ0Y192YWxpZF90bSh0bSk7Cit9CisKK3N0YXRpYyBpbnQgYXUxeHRveV9ydGNfc2V0X3RpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKnRtKQoreworCXVuc2lnbmVkIGxvbmcgdDsKKworCXJ0Y190bV90b190aW1lKHRtLCAmdCk7CisKKwlhdV93cml0ZWwodCwgU1lTX1RPWVdSSVRFKTsKKwlhdV9zeW5jKCk7CisKKwkvKiB3YWl0IGZvciB0aGUgcGVuZGluZyByZWdpc3RlciB3cml0ZSB0byBzdWNjZWVkLiAgVGhpcyBjYW4KKwkgKiB0YWtlIHVwIHRvIDYgc2Vjb25kcy4uLgorCSAqLworCXdoaWxlIChhdV9yZWFkbChTWVNfQ09VTlRFUl9DTlRSTCkgJiBTWVNfQ05UUkxfQzBTKQorCQltc2xlZXAoMSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBydGNfY2xhc3Nfb3BzIGF1MXh0b3lfcnRjX29wcyA9IHsKKwkucmVhZF90aW1lCT0gYXUxeHRveV9ydGNfcmVhZF90aW1lLAorCS5zZXRfdGltZQk9IGF1MXh0b3lfcnRjX3NldF90aW1lLAorfTsKKworc3RhdGljIGludCBfX2RldmluaXQgYXUxeHRveV9ydGNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgcnRjX2RldmljZSAqcnRjZGV2OworCXVuc2lnbmVkIGxvbmcgdDsKKwlpbnQgcmV0OworCisJdCA9IGF1X3JlYWRsKFNZU19DT1VOVEVSX0NOVFJMKTsKKwlpZiAoISh0ICYgQ05UUl9PSykpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiY291bnRlcnMgbm90IHdvcmtpbmc7IGFib3J0aW5nLlxuIik7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gb3V0X2VycjsKKwl9CisKKwlyZXQgPSAtRVRJTUVET1VUOworCisJLyogc2V0IGNvdW50ZXIwIHRpY2tyYXRlIHRvIDFIeiBpZiBuZWNlc3NhcnkgKi8KKwlpZiAoYXVfcmVhZGwoU1lTX1RPWVRSSU0pICE9IDMyNzY3KSB7CisJCS8qIHdhaXQgdW50aWwgaGFyZHdhcmUgZ2l2ZXMgYWNjZXNzIHRvIFRSSU0gcmVnaXN0ZXIgKi8KKwkJdCA9IDB4MDAxMDAwMDA7CisJCXdoaWxlICgoYXVfcmVhZGwoU1lTX0NPVU5URVJfQ05UUkwpICYgU1lTX0NOVFJMX1QwUykgJiYgdC0tKQorCQkJbXNsZWVwKDEpOworCisJCWlmICghdCkgeworCQkJLyogdGltZWQgb3V0IHdhaXRpbmcgZm9yIHJlZ2lzdGVyIGFjY2VzczsgYXNzdW1lCisJCQkgKiBjb3VudGVycyBhcmUgdW51c2FibGUuCisJCQkgKi8KKwkJCWRldl9lcnIoJnBkZXYtPmRldiwgInRpbWVvdXQgd2FpdGluZyBmb3IgYWNjZXNzXG4iKTsKKwkJCWdvdG8gb3V0X2VycjsKKwkJfQorCisJCS8qIHNldCAxSHogVE9ZIHRpY2sgcmF0ZSAqLworCQlhdV93cml0ZWwoMzI3NjcsIFNZU19UT1lUUklNKTsKKwkJYXVfc3luYygpOworCX0KKworCS8qIHdhaXQgdW50aWwgdGhlIGhhcmR3YXJlIGFsbG93cyB3cml0ZXMgdG8gdGhlIGNvdW50ZXIgcmVnICovCisJd2hpbGUgKGF1X3JlYWRsKFNZU19DT1VOVEVSX0NOVFJMKSAmIFNZU19DTlRSTF9DMFMpCisJCW1zbGVlcCgxKTsKKworCXJ0Y2RldiA9IHJ0Y19kZXZpY2VfcmVnaXN0ZXIoInJ0Yy1hdTF4eHgiLCAmcGRldi0+ZGV2LAorCQkJCSAgICAgJmF1MXh0b3lfcnRjX29wcywgVEhJU19NT0RVTEUpOworCWlmIChJU19FUlIocnRjZGV2KSkgeworCQlyZXQgPSBQVFJfRVJSKHJ0Y2Rldik7CisJCWdvdG8gb3V0X2VycjsKKwl9CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBydGNkZXYpOworCisJcmV0dXJuIDA7CisKK291dF9lcnI6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgYXUxeHRveV9ydGNfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHJ0Y19kZXZpY2UgKnJ0Y2RldiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJcnRjX2RldmljZV91bnJlZ2lzdGVyKHJ0Y2Rldik7CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgYXUxeHJ0Y19kcml2ZXIgPSB7CisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gInJ0Yy1hdTF4eHgiLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9LAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoYXUxeHRveV9ydGNfcmVtb3ZlKSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGF1MXh0b3lfcnRjX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3Byb2JlKCZhdTF4cnRjX2RyaXZlciwgYXUxeHRveV9ydGNfcHJvYmUpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgYXUxeHRveV9ydGNfZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZhdTF4cnRjX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGF1MXh0b3lfcnRjX2luaXQpOworbW9kdWxlX2V4aXQoYXUxeHRveV9ydGNfZXhpdCk7CisKK01PRFVMRV9ERVNDUklQVElPTigiQXUxeHh4IFRPWS1jb3VudGVyLWJhc2VkIFJUQyBkcml2ZXIiKTsKK01PRFVMRV9BVVRIT1IoIk1hbnVlbCBMYXVzcyA8bWFudWVsLmxhdXNzQGdtYWlsLmNvbT4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBUygicGxhdGZvcm06cnRjLWF1MXh4eCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvcnRjLWJmaW4uYyBiL2RyaXZlcnMvcnRjL3J0Yy1iZmluLmMKaW5kZXggMzQ0MzljZS4uYWFmZDNlNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ydGMvcnRjLWJmaW4uYworKysgYi9kcml2ZXJzL3J0Yy9ydGMtYmZpbi5jCkBAIC0zOTAsNyArMzkwLDcgQEAKIAogCS8qIFJlZ2lzdGVyIG91ciBSVEMgd2l0aCB0aGUgUlRDIGZyYW1ld29yayAqLwogCXJ0Yy0+cnRjX2RldiA9IHJ0Y19kZXZpY2VfcmVnaXN0ZXIocGRldi0+bmFtZSwgZGV2LCAmYmZpbl9ydGNfb3BzLCBUSElTX01PRFVMRSk7Ci0JaWYgKHVubGlrZWx5KElTX0VSUihydGMpKSkgeworCWlmICh1bmxpa2VseShJU19FUlIocnRjLT5ydGNfZGV2KSkpIHsKIAkJcmV0ID0gUFRSX0VSUihydGMtPnJ0Y19kZXYpOwogCQlnb3RvIGVycl9pcnE7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvcnRjLWNtb3MuYyBiL2RyaXZlcnMvcnRjL3J0Yy1jbW9zLmMKaW5kZXggNmNmOGUyOC4uYjZkMzVmNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ydGMvcnRjLWNtb3MuYworKysgYi9kcml2ZXJzL3J0Yy9ydGMtY21vcy5jCkBAIC0zNSw2ICszNSw3IEBACiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9tb2RfZGV2aWNldGFibGUuaD4KKyNpbmNsdWRlIDxsaW51eC9sb2cyLmg+CiAKIC8qIHRoaXMgaXMgZm9yICJnZW5lcmljIGFjY2VzcyB0byBQQy1zdHlsZSBSVEMiIHVzaW5nIENNT1NfUkVBRC9DTU9TX1dSSVRFICovCiAjaW5jbHVkZSA8YXNtLWdlbmVyaWMvcnRjLmg+CkBAIC01OCw3ICs1OSw3IEBACiB9OwogCiAvKiBib3RoIHBsYXRmb3JtIGFuZCBwbnAgYnVzc2VzIHVzZSBuZWdhdGl2ZSBudW1iZXJzIGZvciBpbnZhbGlkIGlycXMgKi8KLSNkZWZpbmUgaXNfdmFsaWRfaXJxKG4pCQkoKG4pID49IDApCisjZGVmaW5lIGlzX3ZhbGlkX2lycShuKQkJKChuKSA+IDApCiAKIHN0YXRpYyBjb25zdCBjaGFyIGRyaXZlcl9uYW1lW10gPSAicnRjX2Ntb3MiOwogCkBAIC0zODQsNiArMzg1LDggQEAKIAlpZiAoIWlzX3ZhbGlkX2lycShjbW9zLT5pcnEpKQogCQlyZXR1cm4gLUVOWElPOwogCisJaWYgKCFpc19wb3dlcl9vZl8yKGZyZXEpKQorCQlyZXR1cm4gLUVJTlZBTDsKIAkvKiAwID0gbm8gaXJxczsgMSA9IDJeMTUgSHogLi4uIDE1ID0gMl4wIEh6ICovCiAJZiA9IGZmcyhmcmVxKTsKIAlpZiAoZi0tID4gMTYpCkBAIC03MjksNyArNzMyLDcgQEAKIAogCWNtb3NfcnRjLmRldiA9IGRldjsKIAlkZXZfc2V0X2RydmRhdGEoZGV2LCAmY21vc19ydGMpOwotCXJlbmFtZV9yZWdpb24ocG9ydHMsIGNtb3NfcnRjLnJ0Yy0+ZGV2LmJ1c19pZCk7CisJcmVuYW1lX3JlZ2lvbihwb3J0cywgZGV2X25hbWUoJmNtb3NfcnRjLnJ0Yy0+ZGV2KSk7CiAKIAlzcGluX2xvY2tfaXJxKCZydGNfbG9jayk7CiAKQEAgLTc3Nyw3ICs3ODAsNyBAQAogCQkJcnRjX2Ntb3NfaW50X2hhbmRsZXIgPSBjbW9zX2ludGVycnVwdDsKIAogCQlyZXR2YWwgPSByZXF1ZXN0X2lycShydGNfaXJxLCBydGNfY21vc19pbnRfaGFuZGxlciwKLQkJCQlJUlFGX0RJU0FCTEVELCBjbW9zX3J0Yy5ydGMtPmRldi5idXNfaWQsCisJCQkJSVJRRl9ESVNBQkxFRCwgZGV2X25hbWUoJmNtb3NfcnRjLnJ0Yy0+ZGV2KSwKIAkJCQljbW9zX3J0Yy5ydGMpOwogCQlpZiAocmV0dmFsIDwgMCkgewogCQkJZGV2X2RiZyhkZXYsICJJUlEgJWQgaXMgYWxyZWFkeSBpbiB1c2VcbiIsIHJ0Y19pcnEpOwpAQCAtNzk1LDcgKzc5OCw3IEBACiAJfQogCiAJcHJfaW5mbygiJXM6IGFsYXJtcyB1cCB0byBvbmUgJXMlcywgJXpkIGJ5dGVzIG52cmFtJXNcbiIsCi0JCQljbW9zX3J0Yy5ydGMtPmRldi5idXNfaWQsCisJCQlkZXZfbmFtZSgmY21vc19ydGMucnRjLT5kZXYpLAogCQkJaXNfdmFsaWRfaXJxKHJ0Y19pcnEpCiAJCQkJPyAgKGNtb3NfcnRjLm1vbl9hbHJtCiAJCQkJCT8gInllYXIiCkBAIC04ODUsNyArODg4LDcgQEAKIAl9CiAKIAlwcl9kZWJ1ZygiJXM6IHN1c3BlbmQlcywgY3RybCAlMDJ4XG4iLAotCQkJY21vc19ydGMucnRjLT5kZXYuYnVzX2lkLAorCQkJZGV2X25hbWUoJmNtb3NfcnRjLnJ0Yy0+ZGV2KSwKIAkJCSh0bXAgJiBSVENfQUlFKSA/ICIsIGFsYXJtIG1heSB3YWtlIiA6ICIiLAogCQkJdG1wKTsKIApAQCAtOTQxLDcgKzk0NCw3IEBACiAJfQogCiAJcHJfZGVidWcoIiVzOiByZXN1bWUsIGN0cmwgJTAyeFxuIiwKLQkJCWNtb3NfcnRjLnJ0Yy0+ZGV2LmJ1c19pZCwKKwkJCWRldl9uYW1lKCZjbW9zX3J0Yy5ydGMtPmRldiksCiAJCQl0bXApOwogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9ydGMtZHMxMjE2LmMgYi9kcml2ZXJzL3J0Yy9ydGMtZHMxMjE2LmMKaW5kZXggOWEyMzRhNC4uNGFlZGM3MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ydGMvcnRjLWRzMTIxNi5jCisrKyBiL2RyaXZlcnMvcnRjL3J0Yy1kczEyMTYuYwpAQCAtMTAsNyArMTAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2JjZC5oPgogCi0jZGVmaW5lIERSVl9WRVJTSU9OICIwLjEiCisjZGVmaW5lIERSVl9WRVJTSU9OICIwLjIiCiAKIHN0cnVjdCBkczEyMTZfcmVncyB7CiAJdTggdHNlYzsKQEAgLTEwMSw3ICsxMDEsOCBAQAogCXRtLT50bV95ZWFyID0gYmNkMmJpbihyZWdzLnllYXIpOwogCWlmICh0bS0+dG1feWVhciA8IDcwKQogCQl0bS0+dG1feWVhciArPSAxMDA7Ci0JcmV0dXJuIDA7CisKKwlyZXR1cm4gcnRjX3ZhbGlkX3RtKHRtKTsKIH0KIAogc3RhdGljIGludCBkczEyMTZfcnRjX3NldF90aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICp0bSkKQEAgLTEzOCw5ICsxMzksOCBAQAogCS5zZXRfdGltZQk9IGRzMTIxNl9ydGNfc2V0X3RpbWUsCiB9OwogCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBkczEyMTZfcnRjX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCitzdGF0aWMgaW50IF9faW5pdCBkczEyMTZfcnRjX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7Ci0Jc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YzsKIAlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKIAlzdHJ1Y3QgZHMxMjE2X3ByaXYgKnByaXY7CiAJaW50IHJldCA9IDA7CkBAIC0xNTIsNyArMTUyLDEwIEBACiAJcHJpdiA9IGt6YWxsb2Moc2l6ZW9mICpwcml2LCBHRlBfS0VSTkVMKTsKIAlpZiAoIXByaXYpCiAJCXJldHVybiAtRU5PTUVNOwotCXByaXYtPnNpemUgPSByZXMtPmVuZCAtIHJlcy0+c3RhcnQgKyAxOworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgcHJpdik7CisKKwlwcml2LT5zaXplID0gcmVzb3VyY2Vfc2l6ZShyZXMpOwogCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKHJlcy0+c3RhcnQsIHByaXYtPnNpemUsIHBkZXYtPm5hbWUpKSB7CiAJCXJldCA9IC1FQlVTWTsKIAkJZ290byBvdXQ7CkBAIC0xNjMsMjIgKzE2NiwxOCBAQAogCQlyZXQgPSAtRU5PTUVNOwogCQlnb3RvIG91dDsKIAl9Ci0JcnRjID0gcnRjX2RldmljZV9yZWdpc3RlcigiZHMxMjE2IiwgJnBkZXYtPmRldiwKKwlwcml2LT5ydGMgPSBydGNfZGV2aWNlX3JlZ2lzdGVyKCJkczEyMTYiLCAmcGRldi0+ZGV2LAogCQkJCSAgJmRzMTIxNl9ydGNfb3BzLCBUSElTX01PRFVMRSk7Ci0JaWYgKElTX0VSUihydGMpKSB7Ci0JCXJldCA9IFBUUl9FUlIocnRjKTsKKwlpZiAoSVNfRVJSKHByaXYtPnJ0YykpIHsKKwkJcmV0ID0gUFRSX0VSUihwcml2LT5ydGMpOwogCQlnb3RvIG91dDsKIAl9Ci0JcHJpdi0+cnRjID0gcnRjOwotCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHByaXYpOwogCiAJLyogZHVtbXkgcmVhZCB0byBnZXQgY2xvY2sgaW50byBhIGtub3duIHN0YXRlICovCiAJZHMxMjE2X3JlYWQocHJpdi0+aW9hZGRyLCBkdW1teSk7CiAJcmV0dXJuIDA7CiAKIG91dDoKLQlpZiAocHJpdi0+cnRjKQotCQlydGNfZGV2aWNlX3VucmVnaXN0ZXIocHJpdi0+cnRjKTsKIAlpZiAocHJpdi0+aW9hZGRyKQogCQlpb3VubWFwKHByaXYtPmlvYWRkcik7CiAJaWYgKHByaXYtPmJhc2VhZGRyKQpAQCAtMTg3LDcgKzE4Niw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBfX2RldmV4aXQgZHMxMjE2X3J0Y19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3N0YXRpYyBpbnQgX19leGl0IGRzMTIxNl9ydGNfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IGRzMTIxNl9wcml2ICpwcml2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CiAKQEAgLTIwMywxMyArMjAyLDEyIEBACiAJCS5uYW1lCT0gInJ0Yy1kczEyMTYiLAogCQkub3duZXIJPSBUSElTX01PRFVMRSwKIAl9LAotCS5wcm9iZQkJPSBkczEyMTZfcnRjX3Byb2JlLAotCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoZHMxMjE2X3J0Y19yZW1vdmUpLAorCS5yZW1vdmUJCT0gX19leGl0X3AoZHMxMjE2X3J0Y19yZW1vdmUpLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgZHMxMjE2X3J0Y19pbml0KHZvaWQpCiB7Ci0JcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmZHMxMjE2X3J0Y19wbGF0Zm9ybV9kcml2ZXIpOworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcHJvYmUoJmRzMTIxNl9ydGNfcGxhdGZvcm1fZHJpdmVyLCBkczEyMTZfcnRjX3Byb2JlKTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IGRzMTIxNl9ydGNfZXhpdCh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvcnRjLWRzMTMwNy5jIGIvZHJpdmVycy9ydGMvcnRjLWRzMTMwNy5jCmluZGV4IDE2MjMzMGIuLjdlNTE1NWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcnRjL3J0Yy1kczEzMDcuYworKysgYi9kcml2ZXJzL3J0Yy9ydGMtZHMxMzA3LmMKQEAgLTg2LDEzICs4NiwxMSBAQAogCiAKIHN0cnVjdCBkczEzMDcgewotCXU4CQkJcmVnX2FkZHI7CiAJdTgJCQlyZWdzWzExXTsKIAllbnVtIGRzX3R5cGUJCXR5cGU7CiAJdW5zaWduZWQgbG9uZwkJZmxhZ3M7CiAjZGVmaW5lIEhBU19OVlJBTQkwCQkvKiBiaXQgMCA9PSBzeXNmcyBmaWxlIGFjdGl2ZSAqLwogI2RlZmluZSBIQVNfQUxBUk0JMQkJLyogYml0IDEgPT0gaXJxIGNsYWltZWQgKi8KLQlzdHJ1Y3QgaTJjX21zZwkJbXNnWzJdOwogCXN0cnVjdCBpMmNfY2xpZW50CSpjbGllbnQ7CiAJc3RydWN0IHJ0Y19kZXZpY2UJKnJ0YzsKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3QJd29yazsKQEAgLTIwNCwxMyArMjAyLDkgQEAKIAlpbnQJCXRtcDsKIAogCS8qIHJlYWQgdGhlIFJUQyBkYXRlIGFuZCB0aW1lIHJlZ2lzdGVycyBhbGwgYXQgb25jZSAqLwotCWRzMTMwNy0+cmVnX2FkZHIgPSAwOwotCWRzMTMwNy0+bXNnWzFdLmZsYWdzID0gSTJDX01fUkQ7Ci0JZHMxMzA3LT5tc2dbMV0ubGVuID0gNzsKLQotCXRtcCA9IGkyY190cmFuc2Zlcih0b19pMmNfYWRhcHRlcihkczEzMDctPmNsaWVudC0+ZGV2LnBhcmVudCksCi0JCQlkczEzMDctPm1zZywgMik7Ci0JaWYgKHRtcCAhPSAyKSB7CisJdG1wID0gaTJjX3NtYnVzX3JlYWRfaTJjX2Jsb2NrX2RhdGEoZHMxMzA3LT5jbGllbnQsCisJCURTMTMwN19SRUdfU0VDUywgNywgZHMxMzA3LT5yZWdzKTsKKwlpZiAodG1wICE9IDcpIHsKIAkJZGV2X2VycihkZXYsICIlcyBlcnJvciAlZFxuIiwgInJlYWQiLCB0bXApOwogCQlyZXR1cm4gLUVJTzsKIAl9CkBAIC0yNTcsNyArMjUxLDYgQEAKIAkJdC0+dG1faG91ciwgdC0+dG1fbWRheSwKIAkJdC0+dG1fbW9uLCB0LT50bV95ZWFyLCB0LT50bV93ZGF5KTsKIAotCSpidWYrKyA9IDA7CQkvKiBmaXJzdCByZWdpc3RlciBhZGRyICovCiAJYnVmW0RTMTMwN19SRUdfU0VDU10gPSBiaW4yYmNkKHQtPnRtX3NlYyk7CiAJYnVmW0RTMTMwN19SRUdfTUlOXSA9IGJpbjJiY2QodC0+dG1fbWluKTsKIAlidWZbRFMxMzA3X1JFR19IT1VSXSA9IGJpbjJiY2QodC0+dG1faG91cik7CkBAIC0yODIsMjMgKzI3NSwxOSBAQAogCQlicmVhazsKIAl9CiAKLQlkczEzMDctPm1zZ1sxXS5mbGFncyA9IDA7Ci0JZHMxMzA3LT5tc2dbMV0ubGVuID0gODsKLQogCWRldl9kYmcoZGV2LCAiJXM6ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnhcbiIsCiAJCSJ3cml0ZSIsIGJ1ZlswXSwgYnVmWzFdLCBidWZbMl0sIGJ1ZlszXSwKIAkJYnVmWzRdLCBidWZbNV0sIGJ1Zls2XSk7CiAKLQlyZXN1bHQgPSBpMmNfdHJhbnNmZXIodG9faTJjX2FkYXB0ZXIoZHMxMzA3LT5jbGllbnQtPmRldi5wYXJlbnQpLAotCQkJJmRzMTMwNy0+bXNnWzFdLCAxKTsKLQlpZiAocmVzdWx0ICE9IDEpIHsKLQkJZGV2X2VycihkZXYsICIlcyBlcnJvciAlZFxuIiwgIndyaXRlIiwgdG1wKTsKLQkJcmV0dXJuIC1FSU87CisJcmVzdWx0ID0gaTJjX3NtYnVzX3dyaXRlX2kyY19ibG9ja19kYXRhKGRzMTMwNy0+Y2xpZW50LCAwLCA3LCBidWYpOworCWlmIChyZXN1bHQgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAiJXMgZXJyb3IgJWRcbiIsICJ3cml0ZSIsIHJlc3VsdCk7CisJCXJldHVybiByZXN1bHQ7CiAJfQogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGRzMTMwN19yZWFkX2FsYXJtKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y193a2Fscm0gKnQpCitzdGF0aWMgaW50IGRzMTMzN19yZWFkX2FsYXJtKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y193a2Fscm0gKnQpCiB7CiAJc3RydWN0IGkyY19jbGllbnQgICAgICAgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKIAlzdHJ1Y3QgZHMxMzA3CQkqZHMxMzA3ID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CkBAIC0zMDgsMTMgKzI5Nyw5IEBACiAJCXJldHVybiAtRUlOVkFMOwogCiAJLyogcmVhZCBhbGwgQUxBUk0xLCBBTEFSTTIsIGFuZCBzdGF0dXMgcmVnaXN0ZXJzIGF0IG9uY2UgKi8KLQlkczEzMDctPnJlZ19hZGRyID0gRFMxMzM5X1JFR19BTEFSTTFfU0VDUzsKLQlkczEzMDctPm1zZ1sxXS5mbGFncyA9IEkyQ19NX1JEOwotCWRzMTMwNy0+bXNnWzFdLmxlbiA9IDk7Ci0KLQlyZXQgPSBpMmNfdHJhbnNmZXIodG9faTJjX2FkYXB0ZXIoY2xpZW50LT5kZXYucGFyZW50KSwKLQkJCWRzMTMwNy0+bXNnLCAyKTsKLQlpZiAocmV0ICE9IDIpIHsKKwlyZXQgPSBpMmNfc21idXNfcmVhZF9pMmNfYmxvY2tfZGF0YShjbGllbnQsCisJCQlEUzEzMzlfUkVHX0FMQVJNMV9TRUNTLCA5LCBkczEzMDctPnJlZ3MpOworCWlmIChyZXQgIT0gOSkgewogCQlkZXZfZXJyKGRldiwgIiVzIGVycm9yICVkXG4iLCAiYWxhcm0gcmVhZCIsIHJldCk7CiAJCXJldHVybiAtRUlPOwogCX0KQEAgLTM1Myw3ICszMzgsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGRzMTMwN19zZXRfYWxhcm0oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3drYWxybSAqdCkKK3N0YXRpYyBpbnQgZHMxMzM3X3NldF9hbGFybShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfd2thbHJtICp0KQogewogCXN0cnVjdCBpMmNfY2xpZW50ICAgICAgICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CiAJc3RydWN0IGRzMTMwNwkJKmRzMTMwNyA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwpAQCAtMzcxLDEzICszNTYsOSBAQAogCQl0LT5lbmFibGVkLCB0LT5wZW5kaW5nKTsKIAogCS8qIHJlYWQgY3VycmVudCBzdGF0dXMgb2YgYm90aCBhbGFybXMgYW5kIHRoZSBjaGlwICovCi0JZHMxMzA3LT5yZWdfYWRkciA9IERTMTMzOV9SRUdfQUxBUk0xX1NFQ1M7Ci0JZHMxMzA3LT5tc2dbMV0uZmxhZ3MgPSBJMkNfTV9SRDsKLQlkczEzMDctPm1zZ1sxXS5sZW4gPSA5OwotCi0JcmV0ID0gaTJjX3RyYW5zZmVyKHRvX2kyY19hZGFwdGVyKGNsaWVudC0+ZGV2LnBhcmVudCksCi0JCQlkczEzMDctPm1zZywgMik7Ci0JaWYgKHJldCAhPSAyKSB7CisJcmV0ID0gaTJjX3NtYnVzX3JlYWRfaTJjX2Jsb2NrX2RhdGEoY2xpZW50LAorCQkJRFMxMzM5X1JFR19BTEFSTTFfU0VDUywgOSwgYnVmKTsKKwlpZiAocmV0ICE9IDkpIHsKIAkJZGV2X2VycihkZXYsICIlcyBlcnJvciAlZFxuIiwgImFsYXJtIHdyaXRlIiwgcmV0KTsKIAkJcmV0dXJuIC1FSU87CiAJfQpAQCAtMzkyLDcgKzM3Myw2IEBACiAJCQlkczEzMDctPnJlZ3NbNl0sIGNvbnRyb2wsIHN0YXR1cyk7CiAKIAkvKiBzZXQgQUxBUk0xLCB1c2luZyAyNCBob3VyIGFuZCBkYXktb2YtbW9udGggbW9kZXMgKi8KLQkqYnVmKysgPSBEUzEzMzlfUkVHX0FMQVJNMV9TRUNTOwkvKiBmaXJzdCByZWdpc3RlciBhZGRyICovCiAJYnVmWzBdID0gYmluMmJjZCh0LT50aW1lLnRtX3NlYyk7CiAJYnVmWzFdID0gYmluMmJjZCh0LT50aW1lLnRtX21pbik7CiAJYnVmWzJdID0gYmluMmJjZCh0LT50aW1lLnRtX2hvdXIpOwpAQCAtNDExLDE0ICszOTEsMTEgQEAKIAl9CiAJYnVmWzhdID0gc3RhdHVzICYgfihEUzEzMzdfQklUX0ExSSB8IERTMTMzN19CSVRfQTJJKTsKIAotCWRzMTMwNy0+bXNnWzFdLmZsYWdzID0gMDsKLQlkczEzMDctPm1zZ1sxXS5sZW4gPSAxMDsKLQotCXJldCA9IGkyY190cmFuc2Zlcih0b19pMmNfYWRhcHRlcihjbGllbnQtPmRldi5wYXJlbnQpLAotCQkJJmRzMTMwNy0+bXNnWzFdLCAxKTsKLQlpZiAocmV0ICE9IDEpIHsKKwlyZXQgPSBpMmNfc21idXNfd3JpdGVfaTJjX2Jsb2NrX2RhdGEoY2xpZW50LAorCQkJRFMxMzM5X1JFR19BTEFSTTFfU0VDUywgOSwgYnVmKTsKKwlpZiAocmV0IDwgMCkgewogCQlkZXZfZXJyKGRldiwgImNhbid0IHNldCBhbGFybSB0aW1lXG4iKTsKLQkJcmV0dXJuIC1FSU87CisJCXJldHVybiByZXQ7CiAJfQogCiAJcmV0dXJuIDA7CkBAIC00NzUsOCArNDUyLDggQEAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcnRjX2NsYXNzX29wcyBkczEzeHhfcnRjX29wcyA9IHsKIAkucmVhZF90aW1lCT0gZHMxMzA3X2dldF90aW1lLAogCS5zZXRfdGltZQk9IGRzMTMwN19zZXRfdGltZSwKLQkucmVhZF9hbGFybQk9IGRzMTMwN19yZWFkX2FsYXJtLAotCS5zZXRfYWxhcm0JPSBkczEzMDdfc2V0X2FsYXJtLAorCS5yZWFkX2FsYXJtCT0gZHMxMzM3X3JlYWRfYWxhcm0sCisJLnNldF9hbGFybQk9IGRzMTMzN19zZXRfYWxhcm0sCiAJLmlvY3RsCQk9IGRzMTMwN19pb2N0bCwKIH07CiAKQEAgLTQ5MCw3ICs0NjcsNiBAQAogewogCXN0cnVjdCBpMmNfY2xpZW50CSpjbGllbnQ7CiAJc3RydWN0IGRzMTMwNwkJKmRzMTMwNzsKLQlzdHJ1Y3QgaTJjX21zZwkJbXNnWzJdOwogCWludAkJCXJlc3VsdDsKIAogCWNsaWVudCA9IGtvYmpfdG9faTJjX2NsaWVudChrb2JqKTsKQEAgLTUwMywyNCArNDc5LDEwIEBACiAJaWYgKHVubGlrZWx5KCFjb3VudCkpCiAJCXJldHVybiBjb3VudDsKIAotCW1zZ1swXS5hZGRyID0gY2xpZW50LT5hZGRyOwotCW1zZ1swXS5mbGFncyA9IDA7Ci0JbXNnWzBdLmxlbiA9IDE7Ci0JbXNnWzBdLmJ1ZiA9IGJ1ZjsKLQotCWJ1ZlswXSA9IDggKyBvZmY7Ci0KLQltc2dbMV0uYWRkciA9IGNsaWVudC0+YWRkcjsKLQltc2dbMV0uZmxhZ3MgPSBJMkNfTV9SRDsKLQltc2dbMV0ubGVuID0gY291bnQ7Ci0JbXNnWzFdLmJ1ZiA9IGJ1ZjsKLQotCXJlc3VsdCA9IGkyY190cmFuc2Zlcih0b19pMmNfYWRhcHRlcihjbGllbnQtPmRldi5wYXJlbnQpLCBtc2csIDIpOwotCWlmIChyZXN1bHQgIT0gMikgeworCXJlc3VsdCA9IGkyY19zbWJ1c19yZWFkX2kyY19ibG9ja19kYXRhKGNsaWVudCwgOCArIG9mZiwgY291bnQsIGJ1Zik7CisJaWYgKHJlc3VsdCA8IDApCiAJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiJXMgZXJyb3IgJWRcbiIsICJudnJhbSByZWFkIiwgcmVzdWx0KTsKLQkJcmV0dXJuIC1FSU87Ci0JfQotCXJldHVybiBjb3VudDsKKwlyZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgc3NpemVfdApAQCAtNTI4LDggKzQ5MCw3IEBACiAJCWNoYXIgKmJ1ZiwgbG9mZl90IG9mZiwgc2l6ZV90IGNvdW50KQogewogCXN0cnVjdCBpMmNfY2xpZW50CSpjbGllbnQ7Ci0JdTgJCQlidWZmZXJbTlZSQU1fU0laRSArIDFdOwotCWludAkJCXJldDsKKwlpbnQJCQlyZXN1bHQ7CiAKIAljbGllbnQgPSBrb2JqX3RvX2kyY19jbGllbnQoa29iaik7CiAKQEAgLTU0MCwxMSArNTAxLDEyIEBACiAJaWYgKHVubGlrZWx5KCFjb3VudCkpCiAJCXJldHVybiBjb3VudDsKIAotCWJ1ZmZlclswXSA9IDggKyBvZmY7Ci0JbWVtY3B5KGJ1ZmZlciArIDEsIGJ1ZiwgY291bnQpOwotCi0JcmV0ID0gaTJjX21hc3Rlcl9zZW5kKGNsaWVudCwgYnVmZmVyLCBjb3VudCArIDEpOwotCXJldHVybiAocmV0IDwgMCkgPyByZXQgOiAocmV0IC0gMSk7CisJcmVzdWx0ID0gaTJjX3NtYnVzX3dyaXRlX2kyY19ibG9ja19kYXRhKGNsaWVudCwgOCArIG9mZiwgY291bnQsIGJ1Zik7CisJaWYgKHJlc3VsdCA8IDApIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICIlcyBlcnJvciAlZFxuIiwgIm52cmFtIHdyaXRlIiwgcmVzdWx0KTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisJcmV0dXJuIGNvdW50OwogfQogCiBzdGF0aWMgc3RydWN0IGJpbl9hdHRyaWJ1dGUgbnZyYW0gPSB7CkBAIC01NzEsOSArNTMzLDExIEBACiAJY29uc3Qgc3RydWN0IGNoaXBfZGVzYwkqY2hpcCA9ICZjaGlwc1tpZC0+ZHJpdmVyX2RhdGFdOwogCXN0cnVjdCBpMmNfYWRhcHRlcgkqYWRhcHRlciA9IHRvX2kyY19hZGFwdGVyKGNsaWVudC0+ZGV2LnBhcmVudCk7CiAJaW50CQkJd2FudF9pcnEgPSBmYWxzZTsKKwl1bnNpZ25lZCBjaGFyCQkqYnVmOwogCiAJaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShhZGFwdGVyLAotCQkJSTJDX0ZVTkNfSTJDIHwgSTJDX0ZVTkNfU01CVVNfV1JJVEVfQllURV9EQVRBKSkKKwkJCUkyQ19GVU5DX1NNQlVTX1dSSVRFX0JZVEVfREFUQSB8CisJCQlJMkNfRlVOQ19TTUJVU19JMkNfQkxPQ0spKQogCQlyZXR1cm4gLUVJTzsKIAogCWlmICghKGRzMTMwNyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBkczEzMDcpLCBHRlBfS0VSTkVMKSkpCkBAIC01ODEsMTggKzU0NSw4IEBACiAKIAlkczEzMDctPmNsaWVudCA9IGNsaWVudDsKIAlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBkczEzMDcpOwotCi0JZHMxMzA3LT5tc2dbMF0uYWRkciA9IGNsaWVudC0+YWRkcjsKLQlkczEzMDctPm1zZ1swXS5mbGFncyA9IDA7Ci0JZHMxMzA3LT5tc2dbMF0ubGVuID0gMTsKLQlkczEzMDctPm1zZ1swXS5idWYgPSAmZHMxMzA3LT5yZWdfYWRkcjsKLQotCWRzMTMwNy0+bXNnWzFdLmFkZHIgPSBjbGllbnQtPmFkZHI7Ci0JZHMxMzA3LT5tc2dbMV0uZmxhZ3MgPSBJMkNfTV9SRDsKLQlkczEzMDctPm1zZ1sxXS5sZW4gPSBzaXplb2YoZHMxMzA3LT5yZWdzKTsKLQlkczEzMDctPm1zZ1sxXS5idWYgPSBkczEzMDctPnJlZ3M7Ci0KIAlkczEzMDctPnR5cGUgPSBpZC0+ZHJpdmVyX2RhdGE7CisJYnVmID0gZHMxMzA3LT5yZWdzOwogCiAJc3dpdGNoIChkczEzMDctPnR5cGUpIHsKIAljYXNlIGRzXzEzMzc6CkBAIC02MDIsMjEgKzU1NiwxNSBAQAogCQkJSU5JVF9XT1JLKCZkczEzMDctPndvcmssIGRzMTMwN193b3JrKTsKIAkJCXdhbnRfaXJxID0gdHJ1ZTsKIAkJfQotCi0JCWRzMTMwNy0+cmVnX2FkZHIgPSBEUzEzMzdfUkVHX0NPTlRST0w7Ci0JCWRzMTMwNy0+bXNnWzFdLmxlbiA9IDI7Ci0KIAkJLyogZ2V0IHJlZ2lzdGVycyB0aGF0IHRoZSAicnRjIiByZWFkIGJlbG93IHdvbid0IHJlYWQuLi4gKi8KLQkJdG1wID0gaTJjX3RyYW5zZmVyKGFkYXB0ZXIsIGRzMTMwNy0+bXNnLCAyKTsKKwkJdG1wID0gaTJjX3NtYnVzX3JlYWRfaTJjX2Jsb2NrX2RhdGEoZHMxMzA3LT5jbGllbnQsCisJCQkJRFMxMzM3X1JFR19DT05UUk9MLCAyLCBidWYpOwogCQlpZiAodG1wICE9IDIpIHsKIAkJCXByX2RlYnVnKCJyZWFkIGVycm9yICVkXG4iLCB0bXApOwogCQkJZXJyID0gLUVJTzsKIAkJCWdvdG8gZXhpdF9mcmVlOwogCQl9CiAKLQkJZHMxMzA3LT5yZWdfYWRkciA9IDA7Ci0JCWRzMTMwNy0+bXNnWzFdLmxlbiA9IHNpemVvZihkczEzMDctPnJlZ3MpOwotCiAJCS8qIG9zY2lsbGF0b3Igb2ZmPyAgdHVybiBpdCBvbiwgc28gY2xvY2sgY2FuIHRpY2suICovCiAJCWlmIChkczEzMDctPnJlZ3NbMF0gJiBEUzEzMzdfQklUX25FT1NDKQogCQkJZHMxMzA3LT5yZWdzWzBdICY9IH5EUzEzMzdfQklUX25FT1NDOwpAQCAtNjQ3LDkgKzU5NSw4IEBACiAKIHJlYWRfcnRjOgogCS8qIHJlYWQgUlRDIHJlZ2lzdGVycyAqLwotCi0JdG1wID0gaTJjX3RyYW5zZmVyKGFkYXB0ZXIsIGRzMTMwNy0+bXNnLCAyKTsKLQlpZiAodG1wICE9IDIpIHsKKwl0bXAgPSBpMmNfc21idXNfcmVhZF9pMmNfYmxvY2tfZGF0YShkczEzMDctPmNsaWVudCwgMCwgOCwgYnVmKTsKKwlpZiAodG1wICE9IDgpIHsKIAkJcHJfZGVidWcoInJlYWQgZXJyb3IgJWRcbiIsIHRtcCk7CiAJCWVyciA9IC1FSU87CiAJCWdvdG8gZXhpdF9mcmVlOwpAQCAtNzA3LDIyICs2NTQsNiBAQAogCQlicmVhazsKIAl9CiAKLQl0bXAgPSBkczEzMDctPnJlZ3NbRFMxMzA3X1JFR19TRUNTXTsKLQl0bXAgPSBiY2QyYmluKHRtcCAmIDB4N2YpOwotCWlmICh0bXAgPiA2MCkKLQkJZ290byBleGl0X2JhZDsKLQl0bXAgPSBiY2QyYmluKGRzMTMwNy0+cmVnc1tEUzEzMDdfUkVHX01JTl0gJiAweDdmKTsKLQlpZiAodG1wID4gNjApCi0JCWdvdG8gZXhpdF9iYWQ7Ci0KLQl0bXAgPSBiY2QyYmluKGRzMTMwNy0+cmVnc1tEUzEzMDdfUkVHX01EQVldICYgMHgzZik7Ci0JaWYgKHRtcCA9PSAwIHx8IHRtcCA+IDMxKQotCQlnb3RvIGV4aXRfYmFkOwotCi0JdG1wID0gYmNkMmJpbihkczEzMDctPnJlZ3NbRFMxMzA3X1JFR19NT05USF0gJiAweDFmKTsKLQlpZiAodG1wID09IDAgfHwgdG1wID4gMTIpCi0JCWdvdG8gZXhpdF9iYWQ7Ci0KIAl0bXAgPSBkczEzMDctPnJlZ3NbRFMxMzA3X1JFR19IT1VSXTsKIAlzd2l0Y2ggKGRzMTMwNy0+dHlwZSkgewogCWNhc2UgZHNfMTM0MDoKQEAgLTc3OSwxMyArNzEwLDYgQEAKIAogCXJldHVybiAwOwogCi1leGl0X2JhZDoKLQlkZXZfZGJnKCZjbGllbnQtPmRldiwgIiVzOiAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4XG4iLAotCQkJImJvZ3VzIHJlZ2lzdGVyIiwKLQkJCWRzMTMwNy0+cmVnc1swXSwgZHMxMzA3LT5yZWdzWzFdLAotCQkJZHMxMzA3LT5yZWdzWzJdLCBkczEzMDctPnJlZ3NbM10sCi0JCQlkczEzMDctPnJlZ3NbNF0sIGRzMTMwNy0+cmVnc1s1XSwKLQkJCWRzMTMwNy0+cmVnc1s2XSk7CiBleGl0X2lycToKIAlpZiAoZHMxMzA3LT5ydGMpCiAJCXJ0Y19kZXZpY2VfdW5yZWdpc3RlcihkczEzMDctPnJ0Yyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9ydGMtZHMxMzkwLmMgYi9kcml2ZXJzL3J0Yy9ydGMtZHMxMzkwLmMKaW5kZXggNTk5ZTk3Ni4uZTU0YjVjNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ydGMvcnRjLWRzMTM5MC5jCisrKyBiL2RyaXZlcnMvcnRjL3J0Yy1kczEzOTAuYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBydGMtZHMxMzkwLmMgLS0gZHJpdmVyIGZvciBEUzEzOTAvOTMvOTQKKyAqIHJ0Yy1kczEzOTAuYyAtLSBkcml2ZXIgZm9yIHRoZSBEYWxsYXMvTWF4aW0gRFMxMzkwLzkzLzk0IFNQSSBSVEMKICAqCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDggTWVyY3VyeSBJTUMgTHRkCiAgKiBXcml0dGVuIGJ5IE1hcmsgSmFja3NvbiA8bXBmakBtaW1jLmNvLnVrPgpAQCAtOCwxMSArOCwxMyBAQAogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICoKLSAqIE5PVEUgOiBDdXJyZW50bHkgdGhpcyBkcml2ZXIgb25seSBzdXBwb3J0cyB0aGUgYmFyZSBtaW5pbXVtIGZvciByZWFkCi0gKiBhbmQgd3JpdGUgdGhlIFJUQy4gIFRoZSBleHRyYSBmZWF0dXJlcyBwcm92aWRlZCBieSB0aGUgY2hpcCBmYW1pbHkKKyAqIE5PVEU6IEN1cnJlbnRseSB0aGlzIGRyaXZlciBvbmx5IHN1cHBvcnRzIHRoZSBiYXJlIG1pbmltdW0gZm9yIHJlYWQKKyAqIGFuZCB3cml0ZSB0aGUgUlRDLiBUaGUgZXh0cmEgZmVhdHVyZXMgcHJvdmlkZWQgYnkgdGhlIGNoaXAgZmFtaWx5CiAgKiAoYWxhcm1zLCB0cmlja2xlIGNoYXJnZXIsIGRpZmZlcmVudCBjb250cm9sIHJlZ2lzdGVycykgYXJlIHVuYXZhaWxhYmxlLgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvcnRjLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgpAQCAtNDIsMjAgKzQ0LDYgQEAKIAl1OCB0eHJ4X2J1Zls5XTsJLyogY21kICsgOCByZWdpc3RlcnMgKi8KIH07CiAKLXN0YXRpYyB2b2lkIGRzMTM5MF9zZXRfcmVnKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgY2hhciBhZGRyZXNzLAotCQkJCXVuc2lnbmVkIGNoYXIgZGF0YSkKLXsKLQlzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpID0gdG9fc3BpX2RldmljZShkZXYpOwotCXN0cnVjdCBkczEzOTAgKmNoaXAgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQotCS8qIFNldCBNU0IgdG8gaW5kaWNhdGUgd3JpdGUgKi8KLQljaGlwLT50eHJ4X2J1ZlswXSA9IGFkZHJlc3MgfCAweDgwOwotCWNoaXAtPnR4cnhfYnVmWzFdID0gZGF0YTsKLQotCS8qIGRvIHRoZSBpL28gKi8KLQlzcGlfd3JpdGVfdGhlbl9yZWFkKHNwaSwgY2hpcC0+dHhyeF9idWYsIDIsIE5VTEwsIDApOwotfQotCiBzdGF0aWMgaW50IGRzMTM5MF9nZXRfcmVnKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgY2hhciBhZGRyZXNzLAogCQkJCXVuc2lnbmVkIGNoYXIgKmRhdGEpCiB7CkBAIC03OCw3ICs2Niw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZHMxMzkwX2dldF9kYXRldGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqZHQpCitzdGF0aWMgaW50IGRzMTM5MF9yZWFkX3RpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKmR0KQogewogCXN0cnVjdCBzcGlfZGV2aWNlICpzcGkgPSB0b19zcGlfZGV2aWNlKGRldik7CiAJc3RydWN0IGRzMTM5MCAqY2hpcCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwpAQCAtMTA3LDcgKzk1LDcgQEAKIAlyZXR1cm4gcnRjX3ZhbGlkX3RtKGR0KTsKIH0KIAotc3RhdGljIGludCBkczEzOTBfc2V0X2RhdGV0aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICpkdCkKK3N0YXRpYyBpbnQgZHMxMzkwX3NldF90aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICpkdCkKIHsKIAlzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpID0gdG9fc3BpX2RldmljZShkZXYpOwogCXN0cnVjdCBkczEzOTAgKmNoaXAgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKQEAgLTEyNywxNiArMTE1LDYgQEAKIAlyZXR1cm4gc3BpX3dyaXRlX3RoZW5fcmVhZChzcGksIGNoaXAtPnR4cnhfYnVmLCA4LCBOVUxMLCAwKTsKIH0KIAotc3RhdGljIGludCBkczEzOTBfcmVhZF90aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICp0bSkKLXsKLQlyZXR1cm4gZHMxMzkwX2dldF9kYXRldGltZShkZXYsIHRtKTsKLX0KLQotc3RhdGljIGludCBkczEzOTBfc2V0X3RpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKnRtKQotewotCXJldHVybiBkczEzOTBfc2V0X2RhdGV0aW1lKGRldiwgdG0pOwotfQotCiBzdGF0aWMgY29uc3Qgc3RydWN0IHJ0Y19jbGFzc19vcHMgZHMxMzkwX3J0Y19vcHMgPSB7CiAJLnJlYWRfdGltZQk9IGRzMTM5MF9yZWFkX3RpbWUsCiAJLnNldF90aW1lCT0gZHMxMzkwX3NldF90aW1lLApAQCAtMTQ5LDQ2ICsxMjcsNDAgQEAKIAlzdHJ1Y3QgZHMxMzkwICpjaGlwOwogCWludCByZXM7CiAKLQlwcmludGsoS0VSTl9ERUJVRyAiRFMxMzkwIFNQSSBSVEMgZHJpdmVyXG4iKTsKLQotCXJ0YyA9IHJ0Y19kZXZpY2VfcmVnaXN0ZXIoImRzMTM5MCIsCi0JCQkJJnNwaS0+ZGV2LCAmZHMxMzkwX3J0Y19vcHMsIFRISVNfTU9EVUxFKTsKLQlpZiAoSVNfRVJSKHJ0YykpIHsKLQkJcHJpbnRrKEtFUk5fQUxFUlQgIlJUQyA6IHVuYWJsZSB0byByZWdpc3RlciBkZXZpY2VcbiIpOwotCQlyZXR1cm4gUFRSX0VSUihydGMpOwotCX0KLQogCXNwaS0+bW9kZSA9IFNQSV9NT0RFXzM7CiAJc3BpLT5iaXRzX3Blcl93b3JkID0gODsKIAlzcGlfc2V0dXAoc3BpKTsKIAogCWNoaXAgPSBremFsbG9jKHNpemVvZiAqY2hpcCwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFjaGlwKSB7Ci0JCXByaW50ayhLRVJOX0FMRVJUICJSVEMgOiB1bmFibGUgdG8gYWxsb2NhdGUgZGV2aWNlIG1lbW9yeVxuIik7Ci0JCXJ0Y19kZXZpY2VfdW5yZWdpc3RlcihydGMpOworCQlkZXZfZXJyKCZzcGktPmRldiwgInVuYWJsZSB0byBhbGxvY2F0ZSBkZXZpY2UgbWVtb3J5XG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQotCWNoaXAtPnJ0YyA9IHJ0YzsKIAlkZXZfc2V0X2RydmRhdGEoJnNwaS0+ZGV2LCBjaGlwKTsKIAogCXJlcyA9IGRzMTM5MF9nZXRfcmVnKCZzcGktPmRldiwgRFMxMzkwX1JFR19TRUNPTkRTLCAmdG1wKTsKLQlpZiAocmVzKSB7Ci0JCXByaW50ayhLRVJOX0FMRVJUICJSVEMgOiB1bmFibGUgdG8gcmVhZCBkZXZpY2VcbiIpOwotCQlydGNfZGV2aWNlX3VucmVnaXN0ZXIocnRjKTsKKwlpZiAocmVzICE9IDApIHsKKwkJZGV2X2Vycigmc3BpLT5kZXYsICJ1bmFibGUgdG8gcmVhZCBkZXZpY2VcbiIpOworCQlrZnJlZShjaGlwKTsKIAkJcmV0dXJuIHJlczsKIAl9CiAKLQlyZXR1cm4gMDsKKwljaGlwLT5ydGMgPSBydGNfZGV2aWNlX3JlZ2lzdGVyKCJkczEzOTAiLAorCQkJCSZzcGktPmRldiwgJmRzMTM5MF9ydGNfb3BzLCBUSElTX01PRFVMRSk7CisJaWYgKElTX0VSUihjaGlwLT5ydGMpKSB7CisJCWRldl9lcnIoJnNwaS0+ZGV2LCAidW5hYmxlIHRvIHJlZ2lzdGVyIGRldmljZVxuIik7CisJCXJlcyA9IFBUUl9FUlIoY2hpcC0+cnRjKTsKKwkJa2ZyZWUoY2hpcCk7CisJfQorCisJcmV0dXJuIHJlczsKIH0KIAogc3RhdGljIGludCBfX2RldmV4aXQgZHMxMzkwX3JlbW92ZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQogewogCXN0cnVjdCBkczEzOTAgKmNoaXAgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShzcGkpOwotCXN0cnVjdCBydGNfZGV2aWNlICpydGMgPSBjaGlwLT5ydGM7CiAKLQlpZiAocnRjKQotCQlydGNfZGV2aWNlX3VucmVnaXN0ZXIocnRjKTsKLQorCXJ0Y19kZXZpY2VfdW5yZWdpc3RlcihjaGlwLT5ydGMpOwogCWtmcmVlKGNoaXApOwogCiAJcmV0dXJuIDA7CkBAIC0yMTUsNiArMTg3LDYgQEAKIH0KIG1vZHVsZV9leGl0KGRzMTM5MF9leGl0KTsKIAotTU9EVUxFX0RFU0NSSVBUSU9OKCJEUzEzOTAvOTMvOTQgU1BJIFJUQyBkcml2ZXIiKTsKK01PRFVMRV9ERVNDUklQVElPTigiRGFsbGFzL01heGltIERTMTM5MC85My85NCBTUEkgUlRDIGRyaXZlciIpOwogTU9EVUxFX0FVVEhPUigiTWFyayBKYWNrc29uIDxtcGZqQG1pbWMuY28udWs+Iik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9ydGMtZHMxNTExLmMgYi9kcml2ZXJzL3J0Yy9ydGMtZHMxNTExLmMKaW5kZXggMjVjYWFkYS4uMGI2Yjc3MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ydGMvcnRjLWRzMTUxMS5jCisrKyBiL2RyaXZlcnMvcnRjL3J0Yy1kczE1MTEuYwpAQCAtMzI2LDkgKzMyNiw5IEBACiAJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOwogCXN0cnVjdCBydGNfcGxhdF9kYXRhICpwZGF0YSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwogCi0JaWYgKHBkYXRhLT5pcnEgPCAwKSB7CisJaWYgKHBkYXRhLT5pcnEgPD0gMCkKIAkJcmV0dXJuIC1FSU5WQUw7Ci0JfQorCiAJcGRhdGEtPmFscm1fbWRheSA9IGFscm0tPnRpbWUudG1fbWRheTsKIAlwZGF0YS0+YWxybV9ob3VyID0gYWxybS0+dGltZS50bV9ob3VyOwogCXBkYXRhLT5hbHJtX21pbiA9IGFscm0tPnRpbWUudG1fbWluOwpAQCAtMzQ2LDkgKzM0Niw5IEBACiAJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOwogCXN0cnVjdCBydGNfcGxhdF9kYXRhICpwZGF0YSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwogCi0JaWYgKHBkYXRhLT5pcnEgPCAwKSB7CisJaWYgKHBkYXRhLT5pcnEgPD0gMCkKIAkJcmV0dXJuIC1FSU5WQUw7Ci0JfQorCiAJYWxybS0+dGltZS50bV9tZGF5ID0gcGRhdGEtPmFscm1fbWRheSA8IDAgPyAwIDogcGRhdGEtPmFscm1fbWRheTsKIAlhbHJtLT50aW1lLnRtX2hvdXIgPSBwZGF0YS0+YWxybV9ob3VyIDwgMCA/IDAgOiBwZGF0YS0+YWxybV9ob3VyOwogCWFscm0tPnRpbWUudG1fbWluID0gcGRhdGEtPmFscm1fbWluIDwgMCA/IDAgOiBwZGF0YS0+YWxybV9taW47CkBAIC0zODUsNyArMzg1LDcgQEAKIAlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CiAJc3RydWN0IHJ0Y19wbGF0X2RhdGEgKnBkYXRhID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CiAKLQlpZiAocGRhdGEtPmlycSA8IDApIHsKKwlpZiAocGRhdGEtPmlycSA8PSAwKSB7CiAJCXJldHVybiAtRU5PSU9DVExDTUQ7IC8qIGZhbGwgYmFjayBpbnRvIHJ0Yy1kZXYncyBlbXVsYXRpb24gKi8KIAl9CiAJc3dpdGNoIChjbWQpIHsKQEAgLTUwMyw3ICs1MDMsNiBAQAogCWlmICghcGRhdGEpIHsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQotCXBkYXRhLT5pcnEgPSAtMTsKIAlwZGF0YS0+c2l6ZSA9IHJlcy0+ZW5kIC0gcmVzLT5zdGFydCArIDE7CiAJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24ocmVzLT5zdGFydCwgcGRhdGEtPnNpemUsIHBkZXYtPm5hbWUpKSB7CiAJCXJldCA9IC1FQlVTWTsKQEAgLTU0NSwxMyArNTQ0LDEzIEBACiAJICogaWYgdGhlIHBsYXRmb3JtIGhhcyBhbiBpbnRlcnJ1cHQgaW4gbWluZCBmb3IgdGhpcyBkZXZpY2UsCiAJICogdGhlbiBieSBhbGwgbWVhbnMsIHNldCBpdAogCSAqLwotCWlmIChwZGF0YS0+aXJxID49IDApIHsKKwlpZiAocGRhdGEtPmlycSA+IDApIHsKIAkJcnRjX3JlYWQoUlRDX0NNRDEpOwogCQlpZiAocmVxdWVzdF9pcnEocGRhdGEtPmlycSwgZHMxNTExX2ludGVycnVwdCwKIAkJCUlSUUZfRElTQUJMRUQgfCBJUlFGX1NIQVJFRCwgcGRldi0+bmFtZSwgcGRldikgPCAwKSB7CiAKIAkJCWRldl93YXJuKCZwZGV2LT5kZXYsICJpbnRlcnJ1cHQgbm90IGF2YWlsYWJsZS5cbiIpOwotCQkJcGRhdGEtPmlycSA9IC0xOworCQkJcGRhdGEtPmlycSA9IDA7CiAJCX0KIAl9CiAKQEAgLTU3Miw3ICs1NzEsNyBAQAogCWlmIChwZGF0YS0+cnRjKSB7CiAJCXJ0Y19kZXZpY2VfdW5yZWdpc3RlcihwZGF0YS0+cnRjKTsKIAl9Ci0JaWYgKHBkYXRhLT5pcnEgPj0gMCkgeworCWlmIChwZGF0YS0+aXJxID4gMCkgewogCQlmcmVlX2lycShwZGF0YS0+aXJxLCBwZGV2KTsKIAl9CiAJaWYgKGRzMTUxMV9iYXNlKSB7CkBAIC01OTUsNyArNTk0LDcgQEAKIAlzeXNmc19yZW1vdmVfYmluX2ZpbGUoJnBkZXYtPmRldi5rb2JqLCAmZHMxNTExX252cmFtX2F0dHIpOwogCXJ0Y19kZXZpY2VfdW5yZWdpc3RlcihwZGF0YS0+cnRjKTsKIAlwZGF0YS0+cnRjID0gTlVMTDsKLQlpZiAocGRhdGEtPmlycSA+PSAwKSB7CisJaWYgKHBkYXRhLT5pcnEgPiAwKSB7CiAJCS8qCiAJCSAqIGRpc2FibGUgdGhlIGFsYXJtIGludGVycnVwdAogCQkgKi8KQEAgLTYzMSw3ICs2MzAsNyBAQAogIHN0YXRpYyB2b2lkIF9fZXhpdAogZHMxNTExX3J0Y19leGl0KHZvaWQpCiB7Ci0JcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZkczE1MTFfcnRjX2RyaXZlcik7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmRzMTUxMV9ydGNfZHJpdmVyKTsKIH0KIAogbW9kdWxlX2luaXQoZHMxNTExX3J0Y19pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL3J0Yy1kczE1NTMuYyBiL2RyaXZlcnMvcnRjL3J0Yy1kczE1NTMuYwppbmRleCBiOTQ3NWNkLi4zOGQ0NzJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3J0Yy9ydGMtZHMxNTUzLmMKKysrIGIvZHJpdmVycy9ydGMvcnRjLWRzMTU1My5jCkBAIC0xNjIsNyArMTYyLDcgQEAKIAlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CiAJc3RydWN0IHJ0Y19wbGF0X2RhdGEgKnBkYXRhID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CiAKLQlpZiAocGRhdGEtPmlycSA8IDApCisJaWYgKHBkYXRhLT5pcnEgPD0gMCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAJcGRhdGEtPmFscm1fbWRheSA9IGFscm0tPnRpbWUudG1fbWRheTsKIAlwZGF0YS0+YWxybV9ob3VyID0gYWxybS0+dGltZS50bV9ob3VyOwpAQCAtMTc5LDcgKzE3OSw3IEBACiAJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOwogCXN0cnVjdCBydGNfcGxhdF9kYXRhICpwZGF0YSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwogCi0JaWYgKHBkYXRhLT5pcnEgPCAwKQorCWlmIChwZGF0YS0+aXJxIDw9IDApCiAJCXJldHVybiAtRUlOVkFMOwogCWFscm0tPnRpbWUudG1fbWRheSA9IHBkYXRhLT5hbHJtX21kYXkgPCAwID8gMCA6IHBkYXRhLT5hbHJtX21kYXk7CiAJYWxybS0+dGltZS50bV9ob3VyID0gcGRhdGEtPmFscm1faG91ciA8IDAgPyAwIDogcGRhdGEtPmFscm1faG91cjsKQEAgLTIxMyw3ICsyMTMsNyBAQAogCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKIAlzdHJ1Y3QgcnRjX3BsYXRfZGF0YSAqcGRhdGEgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAotCWlmIChwZGF0YS0+aXJxIDwgMCkKKwlpZiAocGRhdGEtPmlycSA8PSAwKQogCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOyAvKiBmYWxsIGJhY2sgaW50byBydGMtZGV2J3MgZW11bGF0aW9uICovCiAJc3dpdGNoIChjbWQpIHsKIAljYXNlIFJUQ19BSUVfT0ZGOgpAQCAtMzAxLDcgKzMwMSw2IEBACiAJcGRhdGEgPSBremFsbG9jKHNpemVvZigqcGRhdGEpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXBkYXRhKQogCQlyZXR1cm4gLUVOT01FTTsKLQlwZGF0YS0+aXJxID0gLTE7CiAJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24ocmVzLT5zdGFydCwgUlRDX1JFR19TSVpFLCBwZGV2LT5uYW1lKSkgewogCQlyZXQgPSAtRUJVU1k7CiAJCWdvdG8gb3V0OwpAQCAtMzI3LDEzICszMjYsMTMgQEAKIAlpZiAocmVhZGIoaW9hZGRyICsgUlRDX0ZMQUdTKSAmIFJUQ19GTEFHU19CTEYpCiAJCWRldl93YXJuKCZwZGV2LT5kZXYsICJ2b2x0YWdlLWxvdyBkZXRlY3RlZC5cbiIpOwogCi0JaWYgKHBkYXRhLT5pcnEgPj0gMCkgeworCWlmIChwZGF0YS0+aXJxID4gMCkgewogCQl3cml0ZWIoMCwgaW9hZGRyICsgUlRDX0lOVEVSUlVQVFMpOwogCQlpZiAocmVxdWVzdF9pcnEocGRhdGEtPmlycSwgZHMxNTUzX3J0Y19pbnRlcnJ1cHQsCiAJCQkJSVJRRl9ESVNBQkxFRCB8IElSUUZfU0hBUkVELAogCQkJCXBkZXYtPm5hbWUsIHBkZXYpIDwgMCkgewogCQkJZGV2X3dhcm4oJnBkZXYtPmRldiwgImludGVycnVwdCBub3QgYXZhaWxhYmxlLlxuIik7Ci0JCQlwZGF0YS0+aXJxID0gLTE7CisJCQlwZGF0YS0+aXJxID0gMDsKIAkJfQogCX0KIApAQCAtMzUzLDcgKzM1Miw3IEBACiAgb3V0OgogCWlmIChwZGF0YS0+cnRjKQogCQlydGNfZGV2aWNlX3VucmVnaXN0ZXIocGRhdGEtPnJ0Yyk7Ci0JaWYgKHBkYXRhLT5pcnEgPj0gMCkKKwlpZiAocGRhdGEtPmlycSA+IDApCiAJCWZyZWVfaXJxKHBkYXRhLT5pcnEsIHBkZXYpOwogCWlmIChpb2FkZHIpCiAJCWlvdW5tYXAoaW9hZGRyKTsKQEAgLTM2OSw3ICszNjgsNyBAQAogCiAJc3lzZnNfcmVtb3ZlX2Jpbl9maWxlKCZwZGV2LT5kZXYua29iaiwgJmRzMTU1M19udnJhbV9hdHRyKTsKIAlydGNfZGV2aWNlX3VucmVnaXN0ZXIocGRhdGEtPnJ0Yyk7Ci0JaWYgKHBkYXRhLT5pcnEgPj0gMCkgeworCWlmIChwZGF0YS0+aXJxID4gMCkgewogCQl3cml0ZWIoMCwgcGRhdGEtPmlvYWRkciArIFJUQ19JTlRFUlJVUFRTKTsKIAkJZnJlZV9pcnEocGRhdGEtPmlycSwgcGRldik7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvcnRjLWRzMTY3Mi5jIGIvZHJpdmVycy9ydGMvcnRjLWRzMTY3Mi5jCmluZGV4IDRlOTE0MTkuLjA2ZGZiNTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcnRjL3J0Yy1kczE2NzIuYworKysgYi9kcml2ZXJzL3J0Yy9ydGMtZHMxNjcyLmMKQEAgLTgzLDMyICs4MywxMSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGRzMTY3Ml9zZXRfZGF0ZXRpbWUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgc3RydWN0IHJ0Y190aW1lICp0bSkKLXsKLQl1bnNpZ25lZCBsb25nIHNlY3M7Ci0KLQlkZXZfZGJnKCZjbGllbnQtPmRldiwKLQkJIiVzOiBzZWNzPSVkLCBtaW5zPSVkLCBob3Vycz0lZCwgIgotCQkibWRheT0lZCwgbW9uPSVkLCB5ZWFyPSVkLCB3ZGF5PSVkXG4iLAotCQlfX2Z1bmNfXywKLQkJdG0tPnRtX3NlYywgdG0tPnRtX21pbiwgdG0tPnRtX2hvdXIsCi0JCXRtLT50bV9tZGF5LCB0bS0+dG1fbW9uLCB0bS0+dG1feWVhciwgdG0tPnRtX3dkYXkpOwotCi0JcnRjX3RtX3RvX3RpbWUodG0sICZzZWNzKTsKLQotCXJldHVybiBkczE2NzJfc2V0X21tc3MoY2xpZW50LCBzZWNzKTsKLX0KLQogc3RhdGljIGludCBkczE2NzJfcnRjX3JlYWRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqdG0pCiB7CiAJcmV0dXJuIGRzMTY3Ml9nZXRfZGF0ZXRpbWUodG9faTJjX2NsaWVudChkZXYpLCB0bSk7CiB9CiAKLXN0YXRpYyBpbnQgZHMxNjcyX3J0Y19zZXRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqdG0pCi17Ci0JcmV0dXJuIGRzMTY3Ml9zZXRfZGF0ZXRpbWUodG9faTJjX2NsaWVudChkZXYpLCB0bSk7Ci19Ci0KIHN0YXRpYyBpbnQgZHMxNjcyX3J0Y19zZXRfbW1zcyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgc2VjcykKIHsKIAlyZXR1cm4gZHMxNjcyX3NldF9tbXNzKHRvX2kyY19jbGllbnQoZGV2KSwgc2Vjcyk7CkBAIC0xNTIsNyArMTMxLDYgQEAKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBydGNfY2xhc3Nfb3BzIGRzMTY3Ml9ydGNfb3BzID0gewogCS5yZWFkX3RpbWUgPSBkczE2NzJfcnRjX3JlYWRfdGltZSwKLQkuc2V0X3RpbWUgPSBkczE2NzJfcnRjX3NldF90aW1lLAogCS5zZXRfbW1zcyA9IGRzMTY3Ml9ydGNfc2V0X21tc3MsCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9ydGMtZHMzMjM0LmMgYi9kcml2ZXJzL3J0Yy9ydGMtZHMzMjM0LmMKaW5kZXggNDVlNWIxMC4uYzUxNTg5ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ydGMvcnRjLWRzMzIzNC5jCisrKyBiL2RyaXZlcnMvcnRjL3J0Yy1kczMyMzQuYwpAQCAtMSw0ICsxLDQgQEAKLS8qIGRyaXZlcnMvcnRjL3J0Yy1kczMyMzQuYworLyogcnRjLWRzMzIzNC5jCiAgKgogICogRHJpdmVyIGZvciBEYWxsYXMgU2VtaWNvbmR1Y3RvciAoRFMzMjM0KSBTUEkgUlRDIHdpdGggSW50ZWdyYXRlZCBDcnlzdGFsCiAgKiBhbmQgU1JBTS4KQEAgLTksMTMgKzksMTAgQEAKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqCi0gKiBDaGFuZ2Vsb2c6Ci0gKgotICogMDctTWF5LTIwMDg6IERlbm5pcyBBYmVyaWxsYSA8ZGVuenp6aG9tZUB5YWhvby5jb20+Ci0gKgkJLSBDcmVhdGVkIGJhc2VkIG9uIHRoZSBtYXg2OTAyIGNvZGUuIE9ubHkgaW1wbGVtZW50cyB0aGUKLSAqCQkgIGRhdGUvdGltZSBrZWVwaW5nIGZ1bmN0aW9uczsgbm8gU1JBTSB5ZXQuCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9ydGMuaD4KQEAgLTM0LDE2ICszMSw3IEBACiAjZGVmaW5lIERTMzIzNF9SRUdfQ09OVFJPTAkweDBFCiAjZGVmaW5lIERTMzIzNF9SRUdfQ09OVF9TVEFUCTB4MEYKIAotI3VuZGVmIERTMzIzNF9ERUJVRwotCi1zdHJ1Y3QgZHMzMjM0IHsKLQlzdHJ1Y3QgcnRjX2RldmljZSAqcnRjOwotCXU4IGJ1Zls4XTsgLyogQnVyc3QgcmVhZDogYWRkciArIDcgcmVncyAqLwotCXU4IHR4X2J1ZlsyXTsKLQl1OCByeF9idWZbMl07Ci19OwotCi1zdGF0aWMgdm9pZCBkczMyMzRfc2V0X3JlZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGNoYXIgYWRkcmVzcywKK3N0YXRpYyBpbnQgZHMzMjM0X3NldF9yZWcoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBjaGFyIGFkZHJlc3MsCiAJCQkJdW5zaWduZWQgY2hhciBkYXRhKQogewogCXN0cnVjdCBzcGlfZGV2aWNlICpzcGkgPSB0b19zcGlfZGV2aWNlKGRldik7CkBAIC01MywxMDcgKzQxLDQ1IEBACiAJYnVmWzBdID0gYWRkcmVzcyB8IDB4ODA7CiAJYnVmWzFdID0gZGF0YTsKIAotCXNwaV93cml0ZShzcGksIGJ1ZiwgMik7CisJcmV0dXJuIHNwaV93cml0ZV90aGVuX3JlYWQoc3BpLCBidWYsIDIsIE5VTEwsIDApOwogfQogCiBzdGF0aWMgaW50IGRzMzIzNF9nZXRfcmVnKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgY2hhciBhZGRyZXNzLAogCQkJCXVuc2lnbmVkIGNoYXIgKmRhdGEpCiB7CiAJc3RydWN0IHNwaV9kZXZpY2UgKnNwaSA9IHRvX3NwaV9kZXZpY2UoZGV2KTsKLQlzdHJ1Y3QgZHMzMjM0ICpjaGlwID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0Jc3RydWN0IHNwaV9tZXNzYWdlIG1lc3NhZ2U7Ci0Jc3RydWN0IHNwaV90cmFuc2ZlciB4ZmVyOwotCWludCBzdGF0dXM7CiAKLQlpZiAoIWRhdGEpCi0JCXJldHVybiAtRUlOVkFMOworCSpkYXRhID0gYWRkcmVzcyAmIDB4N2Y7CiAKLQkvKiBCdWlsZCBvdXIgc3BpIG1lc3NhZ2UgKi8KLQlzcGlfbWVzc2FnZV9pbml0KCZtZXNzYWdlKTsKLQltZW1zZXQoJnhmZXIsIDAsIHNpemVvZih4ZmVyKSk7Ci0KLQkvKiBBZGRyZXNzICsgZHVtbXkgdHggYnl0ZSAqLwotCXhmZXIubGVuID0gMjsKLQl4ZmVyLnR4X2J1ZiA9IGNoaXAtPnR4X2J1ZjsKLQl4ZmVyLnJ4X2J1ZiA9IGNoaXAtPnJ4X2J1ZjsKLQotCWNoaXAtPnR4X2J1ZlswXSA9IGFkZHJlc3M7Ci0JY2hpcC0+dHhfYnVmWzFdID0gMHhmZjsKLQotCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ4ZmVyLCAmbWVzc2FnZSk7Ci0KLQkvKiBkbyB0aGUgaS9vICovCi0Jc3RhdHVzID0gc3BpX3N5bmMoc3BpLCAmbWVzc2FnZSk7Ci0JaWYgKHN0YXR1cyA9PSAwKQotCQlzdGF0dXMgPSBtZXNzYWdlLnN0YXR1czsKLQllbHNlCi0JCXJldHVybiBzdGF0dXM7Ci0KLQkqZGF0YSA9IGNoaXAtPnJ4X2J1ZlsxXTsKLQotCXJldHVybiBzdGF0dXM7CisJcmV0dXJuIHNwaV93cml0ZV90aGVuX3JlYWQoc3BpLCBkYXRhLCAxLCBkYXRhLCAxKTsKIH0KIAotc3RhdGljIGludCBkczMyMzRfZ2V0X2RhdGV0aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICpkdCkKK3N0YXRpYyBpbnQgZHMzMjM0X3JlYWRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqZHQpCiB7CisJaW50IGVycjsKKwl1bnNpZ25lZCBjaGFyIGJ1Zls4XTsKIAlzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpID0gdG9fc3BpX2RldmljZShkZXYpOwotCXN0cnVjdCBkczMyMzQgKmNoaXAgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlzdHJ1Y3Qgc3BpX21lc3NhZ2UgbWVzc2FnZTsKLQlzdHJ1Y3Qgc3BpX3RyYW5zZmVyIHhmZXI7Ci0JaW50IHN0YXR1czsKIAotCS8qIGJ1aWxkIHRoZSBtZXNzYWdlICovCi0Jc3BpX21lc3NhZ2VfaW5pdCgmbWVzc2FnZSk7Ci0JbWVtc2V0KCZ4ZmVyLCAwLCBzaXplb2YoeGZlcikpOwotCXhmZXIubGVuID0gMSArIDc7CS8qIEFkZHIgKyA3IHJlZ2lzdGVycyAqLwotCXhmZXIudHhfYnVmID0gY2hpcC0+YnVmOwotCXhmZXIucnhfYnVmID0gY2hpcC0+YnVmOwotCWNoaXAtPmJ1ZlswXSA9IDB4MDA7CS8qIFN0YXJ0IGFkZHJlc3MgKi8KLQlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmeGZlciwgJm1lc3NhZ2UpOworCWJ1ZlswXSA9IDB4MDA7IC8qIFN0YXJ0IGFkZHJlc3MgKi8KIAotCS8qIGRvIHRoZSBpL28gKi8KLQlzdGF0dXMgPSBzcGlfc3luYyhzcGksICZtZXNzYWdlKTsKLQlpZiAoc3RhdHVzID09IDApCi0JCXN0YXR1cyA9IG1lc3NhZ2Uuc3RhdHVzOwotCWVsc2UKLQkJcmV0dXJuIHN0YXR1czsKKwllcnIgPSBzcGlfd3JpdGVfdGhlbl9yZWFkKHNwaSwgYnVmLCAxLCBidWYsIDgpOworCWlmIChlcnIgIT0gMCkKKwkJcmV0dXJuIGVycjsKIAogCS8qIFNlY29uZHMsIE1pbnV0ZXMsIEhvdXJzLCBEYXksIERhdGUsIE1vbnRoLCBZZWFyICovCi0JZHQtPnRtX3NlYwk9IGJjZDJiaW4oY2hpcC0+YnVmWzFdKTsKLQlkdC0+dG1fbWluCT0gYmNkMmJpbihjaGlwLT5idWZbMl0pOwotCWR0LT50bV9ob3VyCT0gYmNkMmJpbihjaGlwLT5idWZbM10gJiAweDNmKTsKLQlkdC0+dG1fd2RheQk9IGJjZDJiaW4oY2hpcC0+YnVmWzRdKSAtIDE7IC8qIDAgPSBTdW4gKi8KLQlkdC0+dG1fbWRheQk9IGJjZDJiaW4oY2hpcC0+YnVmWzVdKTsKLQlkdC0+dG1fbW9uCT0gYmNkMmJpbihjaGlwLT5idWZbNl0gJiAweDFmKSAtIDE7IC8qIDAgPSBKYW4gKi8KLQlkdC0+dG1feWVhciAJPSBiY2QyYmluKGNoaXAtPmJ1Zls3XSAmIDB4ZmYpICsgMTAwOyAvKiBBc3N1bWUgMjBZWSAqLworCWR0LT50bV9zZWMJPSBiY2QyYmluKGJ1ZlswXSk7CisJZHQtPnRtX21pbgk9IGJjZDJiaW4oYnVmWzFdKTsKKwlkdC0+dG1faG91cgk9IGJjZDJiaW4oYnVmWzJdICYgMHgzZik7CisJZHQtPnRtX3dkYXkJPSBiY2QyYmluKGJ1ZlszXSkgLSAxOyAvKiAwID0gU3VuICovCisJZHQtPnRtX21kYXkJPSBiY2QyYmluKGJ1Zls0XSk7CisJZHQtPnRtX21vbgk9IGJjZDJiaW4oYnVmWzVdICYgMHgxZikgLSAxOyAvKiAwID0gSmFuICovCisJZHQtPnRtX3llYXIgCT0gYmNkMmJpbihidWZbNl0gJiAweGZmKSArIDEwMDsgLyogQXNzdW1lIDIwWVkgKi8KIAotI2lmZGVmIERTMzIzNF9ERUJVRwotCWRldl9kYmcoZGV2LCAiXG4lcyA6IFJlYWQgUlRDIHZhbHVlc1xuIiwgX19mdW5jX18pOwotCWRldl9kYmcoZGV2LCAidG1faG91cjogJWlcbiIsIGR0LT50bV9ob3VyKTsKLQlkZXZfZGJnKGRldiwgInRtX21pbiA6ICVpXG4iLCBkdC0+dG1fbWluKTsKLQlkZXZfZGJnKGRldiwgInRtX3NlYyA6ICVpXG4iLCBkdC0+dG1fc2VjKTsKLQlkZXZfZGJnKGRldiwgInRtX3dkYXk6ICVpXG4iLCBkdC0+dG1fd2RheSk7Ci0JZGV2X2RiZyhkZXYsICJ0bV9tZGF5OiAlaVxuIiwgZHQtPnRtX21kYXkpOwotCWRldl9kYmcoZGV2LCAidG1fbW9uIDogJWlcbiIsIGR0LT50bV9tb24pOwotCWRldl9kYmcoZGV2LCAidG1feWVhcjogJWlcbiIsIGR0LT50bV95ZWFyKTsKLSNlbmRpZgotCi0JcmV0dXJuIDA7CisJcmV0dXJuIHJ0Y192YWxpZF90bShkdCk7CiB9CiAKLXN0YXRpYyBpbnQgZHMzMjM0X3NldF9kYXRldGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqZHQpCitzdGF0aWMgaW50IGRzMzIzNF9zZXRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqZHQpCiB7Ci0jaWZkZWYgRFMzMjM0X0RFQlVHCi0JZGV2X2RiZyhkZXYsICJcbiVzIDogU2V0dGluZyBSVEMgdmFsdWVzXG4iLCBfX2Z1bmNfXyk7Ci0JZGV2X2RiZyhkZXYsICJ0bV9zZWMgOiAlaVxuIiwgZHQtPnRtX3NlYyk7Ci0JZGV2X2RiZyhkZXYsICJ0bV9taW4gOiAlaVxuIiwgZHQtPnRtX21pbik7Ci0JZGV2X2RiZyhkZXYsICJ0bV9ob3VyOiAlaVxuIiwgZHQtPnRtX2hvdXIpOwotCWRldl9kYmcoZGV2LCAidG1fd2RheTogJWlcbiIsIGR0LT50bV93ZGF5KTsKLQlkZXZfZGJnKGRldiwgInRtX21kYXk6ICVpXG4iLCBkdC0+dG1fbWRheSk7Ci0JZGV2X2RiZyhkZXYsICJ0bV9tb24gOiAlaVxuIiwgZHQtPnRtX21vbik7Ci0JZGV2X2RiZyhkZXYsICJ0bV95ZWFyOiAlaVxuIiwgZHQtPnRtX3llYXIpOwotI2VuZGlmCi0KIAlkczMyMzRfc2V0X3JlZyhkZXYsIERTMzIzNF9SRUdfU0VDT05EUywgYmluMmJjZChkdC0+dG1fc2VjKSk7CiAJZHMzMjM0X3NldF9yZWcoZGV2LCBEUzMyMzRfUkVHX01JTlVURVMsIGJpbjJiY2QoZHQtPnRtX21pbikpOwogCWRzMzIzNF9zZXRfcmVnKGRldiwgRFMzMjM0X1JFR19IT1VSUywgYmluMmJjZChkdC0+dG1faG91cikgJiAweDNmKTsKQEAgLTE3NCwxNiArMTAwLDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBkczMyMzRfcmVhZF90aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICp0bSkKLXsKLQlyZXR1cm4gZHMzMjM0X2dldF9kYXRldGltZShkZXYsIHRtKTsKLX0KLQotc3RhdGljIGludCBkczMyMzRfc2V0X3RpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKnRtKQotewotCXJldHVybiBkczMyMzRfc2V0X2RhdGV0aW1lKGRldiwgdG0pOwotfQotCiBzdGF0aWMgY29uc3Qgc3RydWN0IHJ0Y19jbGFzc19vcHMgZHMzMjM0X3J0Y19vcHMgPSB7CiAJLnJlYWRfdGltZQk9IGRzMzIzNF9yZWFkX3RpbWUsCiAJLnNldF90aW1lCT0gZHMzMjM0X3NldF90aW1lLApAQCAtMTkzLDMxICsxMDksMTUgQEAKIHsKIAlzdHJ1Y3QgcnRjX2RldmljZSAqcnRjOwogCXVuc2lnbmVkIGNoYXIgdG1wOwotCXN0cnVjdCBkczMyMzQgKmNoaXA7CiAJaW50IHJlczsKIAotCXJ0YyA9IHJ0Y19kZXZpY2VfcmVnaXN0ZXIoImRzMzIzNCIsCi0JCQkJJnNwaS0+ZGV2LCAmZHMzMjM0X3J0Y19vcHMsIFRISVNfTU9EVUxFKTsKLQlpZiAoSVNfRVJSKHJ0YykpCi0JCXJldHVybiBQVFJfRVJSKHJ0Yyk7Ci0KIAlzcGktPm1vZGUgPSBTUElfTU9ERV8zOwogCXNwaS0+Yml0c19wZXJfd29yZCA9IDg7CiAJc3BpX3NldHVwKHNwaSk7CiAKLQljaGlwID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGRzMzIzNCksIEdGUF9LRVJORUwpOwotCWlmICghY2hpcCkgewotCQlydGNfZGV2aWNlX3VucmVnaXN0ZXIocnRjKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCWNoaXAtPnJ0YyA9IHJ0YzsKLQlkZXZfc2V0X2RydmRhdGEoJnNwaS0+ZGV2LCBjaGlwKTsKLQogCXJlcyA9IGRzMzIzNF9nZXRfcmVnKCZzcGktPmRldiwgRFMzMjM0X1JFR19TRUNPTkRTLCAmdG1wKTsKLQlpZiAocmVzKSB7Ci0JCXJ0Y19kZXZpY2VfdW5yZWdpc3RlcihydGMpOworCWlmIChyZXMgIT0gMCkKIAkJcmV0dXJuIHJlczsKLQl9CiAKIAkvKiBDb250cm9sIHNldHRpbmdzCiAJICoKQEAgLTI0NiwyNiArMTQ2LDI3IEBACiAJZHMzMjM0X2dldF9yZWcoJnNwaS0+ZGV2LCBEUzMyMzRfUkVHX0NPTlRfU1RBVCwgJnRtcCk7CiAJZGV2X2luZm8oJnNwaS0+ZGV2LCAiQ3RybC9TdGF0IFJlZzogMHglMDJ4XG4iLCB0bXApOwogCisJcnRjID0gcnRjX2RldmljZV9yZWdpc3RlcigiZHMzMjM0IiwKKwkJCQkmc3BpLT5kZXYsICZkczMyMzRfcnRjX29wcywgVEhJU19NT0RVTEUpOworCWlmIChJU19FUlIocnRjKSkKKwkJcmV0dXJuIFBUUl9FUlIocnRjKTsKKworCWRldl9zZXRfZHJ2ZGF0YSgmc3BpLT5kZXYsIHJ0Yyk7CisKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBfX2RldmV4aXQgZHMzMjM0X3JlbW92ZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQogewotCXN0cnVjdCBkczMyMzQgKmNoaXAgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShzcGkpOwotCXN0cnVjdCBydGNfZGV2aWNlICpydGMgPSBjaGlwLT5ydGM7CisJc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHNwaSk7CiAKLQlpZiAocnRjKQotCQlydGNfZGV2aWNlX3VucmVnaXN0ZXIocnRjKTsKLQotCWtmcmVlKGNoaXApOwotCisJcnRjX2RldmljZV91bnJlZ2lzdGVyKHJ0Yyk7CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBzdHJ1Y3Qgc3BpX2RyaXZlciBkczMyMzRfZHJpdmVyID0gewogCS5kcml2ZXIgPSB7CiAJCS5uYW1lCSA9ICJkczMyMzQiLAotCQkuYnVzCT0gJnNwaV9idXNfdHlwZSwKIAkJLm93bmVyCT0gVEhJU19NT0RVTEUsCiAJfSwKIAkucHJvYmUJID0gZHMzMjM0X3Byb2JlLApAQCAtMjc0LDcgKzE3NSw2IEBACiAKIHN0YXRpYyBfX2luaXQgaW50IGRzMzIzNF9pbml0KHZvaWQpCiB7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiRFMzMjM0IFNQSSBSVEMgRHJpdmVyXG4iKTsKIAlyZXR1cm4gc3BpX3JlZ2lzdGVyX2RyaXZlcigmZHMzMjM0X2RyaXZlcik7CiB9CiBtb2R1bGVfaW5pdChkczMyMzRfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9ydGMtZXA5M3h4LmMgYi9kcml2ZXJzL3J0Yy9ydGMtZXA5M3h4LmMKaW5kZXggMzZlNGFjMC4uZjdhMzI4MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ydGMvcnRjLWVwOTN4eC5jCisrKyBiL2RyaXZlcnMvcnRjL3J0Yy1lcDkzeHguYwpAQCAtNDksMTggKzQ5LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBlcDkzeHhfcnRjX3NldF90aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICp0bSkKLXsKLQlpbnQgZXJyOwotCXVuc2lnbmVkIGxvbmcgc2VjczsKLQotCWVyciA9IHJ0Y190bV90b190aW1lKHRtLCAmc2Vjcyk7Ci0JaWYgKGVyciAhPSAwKQotCQlyZXR1cm4gZXJyOwotCi0JcmV0dXJuIGVwOTN4eF9ydGNfc2V0X21tc3MoZGV2LCBzZWNzKTsKLX0KLQogc3RhdGljIGludCBlcDkzeHhfcnRjX3Byb2Moc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSkKIHsKIAl1bnNpZ25lZCBzaG9ydCBwcmVsb2FkLCBkZWxldGU7CkBAIC03NSw3ICs2Myw2IEBACiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcnRjX2NsYXNzX29wcyBlcDkzeHhfcnRjX29wcyA9IHsKIAkucmVhZF90aW1lCT0gZXA5M3h4X3J0Y19yZWFkX3RpbWUsCi0JLnNldF90aW1lCT0gZXA5M3h4X3J0Y19zZXRfdGltZSwKIAkuc2V0X21tc3MJPSBlcDkzeHhfcnRjX3NldF9tbXNzLAogCS5wcm9jCQk9IGVwOTN4eF9ydGNfcHJvYywKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9ydGMtbTQ4dDU5LmMgYi9kcml2ZXJzL3J0Yy9ydGMtbTQ4dDU5LmMKaW5kZXggNDNhZmI3YS4uMzM5MjFhNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ydGMvcnRjLW00OHQ1OS5jCisrKyBiL2RyaXZlcnMvcnRjL3J0Yy1tNDh0NTkuYwpAQCAtNDUwLDcgKzQ1MCw3IEBACiAJICogdGhlIG1vZGUgd2l0aG91dCBJUlEuCiAJICovCiAJbTQ4dDU5LT5pcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOwotCWlmIChtNDh0NTktPmlycSA8IDApCisJaWYgKG00OHQ1OS0+aXJxIDw9IDApCiAJCW00OHQ1OS0+aXJxID0gTk9fSVJROwogCiAJaWYgKG00OHQ1OS0+aXJxICE9IE5PX0lSUSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvcnRjLW1heDY5MDIuYyBiL2RyaXZlcnMvcnRjL3J0Yy1tYXg2OTAyLmMKaW5kZXggMmY2NTA3ZC4uMzZhOGVhOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ydGMvcnRjLW1heDY5MDIuYworKysgYi9kcml2ZXJzL3J0Yy9ydGMtbWF4NjkwMi5jCkBAIC05LDE0ICs5LDYgQEAKICAqCiAgKiBEcml2ZXIgZm9yIE1BWDY5MDIgc3BpIFJUQwogICoKLSAqIENoYW5nZWxvZzoKLSAqCi0gKiAyNC1NYXktMjAwNjogUmFwaGFlbCBBc3NlbmF0IDxyYXBoQDhkLmNvbT4KLSAqICAgICAgICAgICAgICAgIC0gTWFqb3IgcmV3b3JrCi0gKgkJCQlDb252ZXJ0ZWQgdG8gcnRjX2RldmljZSBhbmQgdXNlcyB0aGUgU1BJIGxheWVyLgotICoKLSAqID8/LT8/Py0yMDA1OiBTb21lb25lIGF0IENvbXB1bGFiCi0gKiAgICAgICAgICAgICAgICAtIEluaXRpYWwgZHJpdmVyIGNyZWF0aW9uLgogICovCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KQEAgLTI2LDcgKzE4LDYgQEAKICNpbmNsdWRlIDxsaW51eC9ydGMuaD4KICNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CiAjaW5jbHVkZSA8bGludXgvYmNkLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KIAogI2RlZmluZSBNQVg2OTAyX1JFR19TRUNPTkRTCQkweDAxCiAjZGVmaW5lIE1BWDY5MDJfUkVHX01JTlVURVMJCTB4MDMKQEAgLTM4LDE2ICsyOSw3IEBACiAjZGVmaW5lIE1BWDY5MDJfUkVHX0NPTlRST0wJCTB4MEYKICNkZWZpbmUgTUFYNjkwMl9SRUdfQ0VOVFVSWQkJMHgxMwogCi0jdW5kZWYgTUFYNjkwMl9ERUJVRwotCi1zdHJ1Y3QgbWF4NjkwMiB7Ci0Jc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YzsKLQl1OCBidWZbOV07IC8qIEJ1cnN0IHJlYWQgY21kICsgOCByZWdpc3RlcnMgKi8KLQl1OCB0eF9idWZbMl07Ci0JdTggcnhfYnVmWzJdOwotfTsKLQotc3RhdGljIHZvaWQgbWF4NjkwMl9zZXRfcmVnKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgY2hhciBhZGRyZXNzLAorc3RhdGljIGludCBtYXg2OTAyX3NldF9yZWcoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBjaGFyIGFkZHJlc3MsCiAJCQkJdW5zaWduZWQgY2hhciBkYXRhKQogewogCXN0cnVjdCBzcGlfZGV2aWNlICpzcGkgPSB0b19zcGlfZGV2aWNlKGRldik7CkBAIC01NywxMTMgKzM5LDU4IEBACiAJYnVmWzBdID0gYWRkcmVzcyAmIDB4N2Y7CiAJYnVmWzFdID0gZGF0YTsKIAotCXNwaV93cml0ZShzcGksIGJ1ZiwgMik7CisJcmV0dXJuIHNwaV93cml0ZV90aGVuX3JlYWQoc3BpLCBidWYsIDIsIE5VTEwsIDApOwogfQogCiBzdGF0aWMgaW50IG1heDY5MDJfZ2V0X3JlZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGNoYXIgYWRkcmVzcywKIAkJCQl1bnNpZ25lZCBjaGFyICpkYXRhKQogewogCXN0cnVjdCBzcGlfZGV2aWNlICpzcGkgPSB0b19zcGlfZGV2aWNlKGRldik7Ci0Jc3RydWN0IG1heDY5MDIgKmNoaXAgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlzdHJ1Y3Qgc3BpX21lc3NhZ2UgbWVzc2FnZTsKLQlzdHJ1Y3Qgc3BpX3RyYW5zZmVyIHhmZXI7Ci0JaW50IHN0YXR1czsKLQotCWlmICghZGF0YSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkvKiBCdWlsZCBvdXIgc3BpIG1lc3NhZ2UgKi8KLQlzcGlfbWVzc2FnZV9pbml0KCZtZXNzYWdlKTsKLQltZW1zZXQoJnhmZXIsIDAsIHNpemVvZih4ZmVyKSk7Ci0JeGZlci5sZW4gPSAyOwotCS8qIENhbiB0eF9idWYgYW5kIHJ4X2J1ZiBiZSBlcXVhbD8gVGhlIGRvYyBpbiBzcGkuaCBpcyBub3Qgc3VyZS4uLiAqLwotCXhmZXIudHhfYnVmID0gY2hpcC0+dHhfYnVmOwotCXhmZXIucnhfYnVmID0gY2hpcC0+cnhfYnVmOwogCiAJLyogU2V0IE1TQiB0byBpbmRpY2F0ZSByZWFkICovCi0JY2hpcC0+dHhfYnVmWzBdID0gYWRkcmVzcyB8IDB4ODA7CisJKmRhdGEgPSBhZGRyZXNzIHwgMHg4MDsKIAotCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ4ZmVyLCAmbWVzc2FnZSk7Ci0KLQkvKiBkbyB0aGUgaS9vICovCi0Jc3RhdHVzID0gc3BpX3N5bmMoc3BpLCAmbWVzc2FnZSk7Ci0KLQlpZiAoc3RhdHVzID09IDApCi0JCSpkYXRhID0gY2hpcC0+cnhfYnVmWzFdOwotCXJldHVybiBzdGF0dXM7CisJcmV0dXJuIHNwaV93cml0ZV90aGVuX3JlYWQoc3BpLCBkYXRhLCAxLCBkYXRhLCAxKTsKIH0KIAotc3RhdGljIGludCBtYXg2OTAyX2dldF9kYXRldGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqZHQpCitzdGF0aWMgaW50IG1heDY5MDJfcmVhZF90aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICpkdCkKIHsKLQl1bnNpZ25lZCBjaGFyIHRtcDsKLQlpbnQgY2VudHVyeTsKLQlpbnQgZXJyOworCWludCBlcnIsIGNlbnR1cnk7CiAJc3RydWN0IHNwaV9kZXZpY2UgKnNwaSA9IHRvX3NwaV9kZXZpY2UoZGV2KTsKLQlzdHJ1Y3QgbWF4NjkwMiAqY2hpcCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXN0cnVjdCBzcGlfbWVzc2FnZSBtZXNzYWdlOwotCXN0cnVjdCBzcGlfdHJhbnNmZXIgeGZlcjsKLQlpbnQgc3RhdHVzOworCXVuc2lnbmVkIGNoYXIgYnVmWzhdOwogCi0JZXJyID0gbWF4NjkwMl9nZXRfcmVnKGRldiwgTUFYNjkwMl9SRUdfQ0VOVFVSWSwgJnRtcCk7Ci0JaWYgKGVycikKKwlidWZbMF0gPSAweGJmOwkvKiBCdXJzdCByZWFkICovCisKKwllcnIgPSBzcGlfd3JpdGVfdGhlbl9yZWFkKHNwaSwgYnVmLCAxLCBidWYsIDgpOworCWlmIChlcnIgIT0gMCkKIAkJcmV0dXJuIGVycjsKIAotCS8qIGJ1aWxkIHRoZSBtZXNzYWdlICovCi0Jc3BpX21lc3NhZ2VfaW5pdCgmbWVzc2FnZSk7Ci0JbWVtc2V0KCZ4ZmVyLCAwLCBzaXplb2YoeGZlcikpOwotCXhmZXIubGVuID0gMSArIDc7CS8qIEJ1cnN0IHJlYWQgY29tbWFuZCArIDcgcmVnaXN0ZXJzICovCi0JeGZlci50eF9idWYgPSBjaGlwLT5idWY7Ci0JeGZlci5yeF9idWYgPSBjaGlwLT5idWY7Ci0JY2hpcC0+YnVmWzBdID0gMHhiZjsJLyogQnVyc3QgcmVhZCAqLwotCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ4ZmVyLCAmbWVzc2FnZSk7Ci0KLQkvKiBkbyB0aGUgaS9vICovCi0Jc3RhdHVzID0gc3BpX3N5bmMoc3BpLCAmbWVzc2FnZSk7Ci0JaWYgKHN0YXR1cykKLQkJcmV0dXJuIHN0YXR1czsKLQogCS8qIFRoZSBjaGlwIHNlbmRzIGRhdGEgaW4gdGhpcyBvcmRlcjoKIAkgKiBTZWNvbmRzLCBNaW51dGVzLCBIb3VycywgRGF0ZSwgTW9udGgsIERheSwgWWVhciAqLwotCWR0LT50bV9zZWMJPSBiY2QyYmluKGNoaXAtPmJ1ZlsxXSk7Ci0JZHQtPnRtX21pbgk9IGJjZDJiaW4oY2hpcC0+YnVmWzJdKTsKLQlkdC0+dG1faG91cgk9IGJjZDJiaW4oY2hpcC0+YnVmWzNdKTsKLQlkdC0+dG1fbWRheQk9IGJjZDJiaW4oY2hpcC0+YnVmWzRdKTsKLQlkdC0+dG1fbW9uCT0gYmNkMmJpbihjaGlwLT5idWZbNV0pIC0gMTsKLQlkdC0+dG1fd2RheQk9IGJjZDJiaW4oY2hpcC0+YnVmWzZdKTsKLQlkdC0+dG1feWVhciA9IGJjZDJiaW4oY2hpcC0+YnVmWzddKTsKKwlkdC0+dG1fc2VjCT0gYmNkMmJpbihidWZbMF0pOworCWR0LT50bV9taW4JPSBiY2QyYmluKGJ1ZlsxXSk7CisJZHQtPnRtX2hvdXIJPSBiY2QyYmluKGJ1ZlsyXSk7CisJZHQtPnRtX21kYXkJPSBiY2QyYmluKGJ1ZlszXSk7CisJZHQtPnRtX21vbgk9IGJjZDJiaW4oYnVmWzRdKSAtIDE7CisJZHQtPnRtX3dkYXkJPSBiY2QyYmluKGJ1Zls1XSk7CisJZHQtPnRtX3llYXIJPSBiY2QyYmluKGJ1Zls2XSk7CiAKLQljZW50dXJ5ID0gYmNkMmJpbih0bXApICogMTAwOworCS8qIFJlYWQgY2VudHVyeSAqLworCWVyciA9IG1heDY5MDJfZ2V0X3JlZyhkZXYsIE1BWDY5MDJfUkVHX0NFTlRVUlksICZidWZbMF0pOworCWlmIChlcnIgIT0gMCkKKwkJcmV0dXJuIGVycjsKKworCWNlbnR1cnkgPSBiY2QyYmluKGJ1ZlswXSkgKiAxMDA7CiAKIAlkdC0+dG1feWVhciArPSBjZW50dXJ5OwogCWR0LT50bV95ZWFyIC09IDE5MDA7CiAKLSNpZmRlZiBNQVg2OTAyX0RFQlVHCi0JcHJpbnRrKCJcbiVzIDogUmVhZCBSVEMgdmFsdWVzXG4iLF9fZnVuY19fKTsKLQlwcmludGsoInRtX2hvdXI6ICVpXG4iLGR0LT50bV9ob3VyKTsKLQlwcmludGsoInRtX21pbiA6ICVpXG4iLGR0LT50bV9taW4pOwotCXByaW50aygidG1fc2VjIDogJWlcbiIsZHQtPnRtX3NlYyk7Ci0JcHJpbnRrKCJ0bV95ZWFyOiAlaVxuIixkdC0+dG1feWVhcik7Ci0JcHJpbnRrKCJ0bV9tb24gOiAlaVxuIixkdC0+dG1fbW9uKTsKLQlwcmludGsoInRtX21kYXk6ICVpXG4iLGR0LT50bV9tZGF5KTsKLQlwcmludGsoInRtX3dkYXk6ICVpXG4iLGR0LT50bV93ZGF5KTsKLSNlbmRpZgotCi0JcmV0dXJuIDA7CisJcmV0dXJuIHJ0Y192YWxpZF90bShkdCk7CiB9CiAKLXN0YXRpYyBpbnQgbWF4NjkwMl9zZXRfZGF0ZXRpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKmR0KQorc3RhdGljIGludCBtYXg2OTAyX3NldF90aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICpkdCkKIHsKLQlkdC0+dG1feWVhciA9IGR0LT50bV95ZWFyKzE5MDA7Ci0KLSNpZmRlZiBNQVg2OTAyX0RFQlVHCi0JcHJpbnRrKCJcbiVzIDogU2V0dGluZyBSVEMgdmFsdWVzXG4iLF9fZnVuY19fKTsKLQlwcmludGsoInRtX3NlYyA6ICVpXG4iLGR0LT50bV9zZWMpOwotCXByaW50aygidG1fbWluIDogJWlcbiIsZHQtPnRtX21pbik7Ci0JcHJpbnRrKCJ0bV9ob3VyOiAlaVxuIixkdC0+dG1faG91cik7Ci0JcHJpbnRrKCJ0bV9tZGF5OiAlaVxuIixkdC0+dG1fbWRheSk7Ci0JcHJpbnRrKCJ0bV93ZGF5OiAlaVxuIixkdC0+dG1fd2RheSk7Ci0JcHJpbnRrKCJ0bV95ZWFyOiAlaVxuIixkdC0+dG1feWVhcik7Ci0jZW5kaWYKKwlkdC0+dG1feWVhciA9IGR0LT50bV95ZWFyICsgMTkwMDsKIAogCS8qIFJlbW92ZSB3cml0ZSBwcm90ZWN0aW9uICovCiAJbWF4NjkwMl9zZXRfcmVnKGRldiwgMHhGLCAwKTsKQEAgLTE3MywxMCArMTAwLDEwIEBACiAJbWF4NjkwMl9zZXRfcmVnKGRldiwgMHgwNSwgYmluMmJjZChkdC0+dG1faG91cikpOwogCiAJbWF4NjkwMl9zZXRfcmVnKGRldiwgMHgwNywgYmluMmJjZChkdC0+dG1fbWRheSkpOwotCW1heDY5MDJfc2V0X3JlZyhkZXYsIDB4MDksIGJpbjJiY2QoZHQtPnRtX21vbisxKSk7CisJbWF4NjkwMl9zZXRfcmVnKGRldiwgMHgwOSwgYmluMmJjZChkdC0+dG1fbW9uICsgMSkpOwogCW1heDY5MDJfc2V0X3JlZyhkZXYsIDB4MEIsIGJpbjJiY2QoZHQtPnRtX3dkYXkpKTsKLQltYXg2OTAyX3NldF9yZWcoZGV2LCAweDBELCBiaW4yYmNkKGR0LT50bV95ZWFyJTEwMCkpOwotCW1heDY5MDJfc2V0X3JlZyhkZXYsIDB4MTMsIGJpbjJiY2QoZHQtPnRtX3llYXIvMTAwKSk7CisJbWF4NjkwMl9zZXRfcmVnKGRldiwgMHgwRCwgYmluMmJjZChkdC0+dG1feWVhciAlIDEwMCkpOworCW1heDY5MDJfc2V0X3JlZyhkZXYsIDB4MTMsIGJpbjJiY2QoZHQtPnRtX3llYXIgLyAxMDApKTsKIAogCS8qIENvbXB1bGFiIHVzZWQgYSBkZWxheSBoZXJlLiBIb3dldmVyLCB0aGUgZGF0YXNoZWV0CiAJICogZG9lcyBub3QgbWVudGlvbiBhIGRlbGF5IGJlaW5nIHJlcXVpcmVkIGFueXdoZXJlLi4uICovCkBAIC0xODgsMTYgKzExNSw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgbWF4NjkwMl9yZWFkX3RpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKnRtKQotewotCXJldHVybiBtYXg2OTAyX2dldF9kYXRldGltZShkZXYsIHRtKTsKLX0KLQotc3RhdGljIGludCBtYXg2OTAyX3NldF90aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICp0bSkKLXsKLQlyZXR1cm4gbWF4NjkwMl9zZXRfZGF0ZXRpbWUoZGV2LCB0bSk7Ci19Ci0KIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcnRjX2NsYXNzX29wcyBtYXg2OTAyX3J0Y19vcHMgPSB7CiAJLnJlYWRfdGltZQk9IG1heDY5MDJfcmVhZF90aW1lLAogCS5zZXRfdGltZQk9IG1heDY5MDJfc2V0X3RpbWUsCkBAIC0yMDcsNDUgKzEyNCwyOSBAQAogewogCXN0cnVjdCBydGNfZGV2aWNlICpydGM7CiAJdW5zaWduZWQgY2hhciB0bXA7Ci0Jc3RydWN0IG1heDY5MDIgKmNoaXA7CiAJaW50IHJlczsKIAorCXNwaS0+bW9kZSA9IFNQSV9NT0RFXzM7CisJc3BpLT5iaXRzX3Blcl93b3JkID0gODsKKwlzcGlfc2V0dXAoc3BpKTsKKworCXJlcyA9IG1heDY5MDJfZ2V0X3JlZygmc3BpLT5kZXYsIE1BWDY5MDJfUkVHX1NFQ09ORFMsICZ0bXApOworCWlmIChyZXMgIT0gMCkKKwkJcmV0dXJuIHJlczsKKwogCXJ0YyA9IHJ0Y19kZXZpY2VfcmVnaXN0ZXIoIm1heDY5MDIiLAogCQkJCSZzcGktPmRldiwgJm1heDY5MDJfcnRjX29wcywgVEhJU19NT0RVTEUpOwogCWlmIChJU19FUlIocnRjKSkKIAkJcmV0dXJuIFBUUl9FUlIocnRjKTsKIAotCXNwaS0+bW9kZSA9IFNQSV9NT0RFXzM7Ci0Jc3BpLT5iaXRzX3Blcl93b3JkID0gODsKLQlzcGlfc2V0dXAoc3BpKTsKLQotCWNoaXAgPSBremFsbG9jKHNpemVvZiAqY2hpcCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFjaGlwKSB7Ci0JCXJ0Y19kZXZpY2VfdW5yZWdpc3RlcihydGMpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0JY2hpcC0+cnRjID0gcnRjOwotCWRldl9zZXRfZHJ2ZGF0YSgmc3BpLT5kZXYsIGNoaXApOwotCi0JcmVzID0gbWF4NjkwMl9nZXRfcmVnKCZzcGktPmRldiwgTUFYNjkwMl9SRUdfU0VDT05EUywgJnRtcCk7Ci0JaWYgKHJlcykgewotCQlydGNfZGV2aWNlX3VucmVnaXN0ZXIocnRjKTsKLQkJcmV0dXJuIHJlczsKLQl9Ci0KIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBfX2RldmV4aXQgbWF4NjkwMl9yZW1vdmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKIHsKLQlzdHJ1Y3QgbWF4NjkwMiAqY2hpcCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHNwaSk7Ci0Jc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YyA9IGNoaXAtPnJ0YzsKKwlzdHJ1Y3QgcnRjX2RldmljZSAqcnRjID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEoc3BpKTsKIAotCWlmIChydGMpCi0JCXJ0Y19kZXZpY2VfdW5yZWdpc3RlcihydGMpOwotCi0Ja2ZyZWUoY2hpcCk7Ci0KKwlydGNfZGV2aWNlX3VucmVnaXN0ZXIocnRjKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjYxLDcgKzE2Miw2IEBACiAKIHN0YXRpYyBfX2luaXQgaW50IG1heDY5MDJfaW5pdCh2b2lkKQogewotCXByaW50aygibWF4NjkwMiBzcGkgZHJpdmVyXG4iKTsKIAlyZXR1cm4gc3BpX3JlZ2lzdGVyX2RyaXZlcigmbWF4NjkwMl9kcml2ZXIpOwogfQogbW9kdWxlX2luaXQobWF4NjkwMl9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL3J0Yy1tdi5jIGIvZHJpdmVycy9ydGMvcnRjLW12LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDVmMTJkYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvcnRjL3J0Yy1tdi5jCkBAIC0wLDAgKzEsMTYzIEBACisvKgorICogRHJpdmVyIGZvciB0aGUgUlRDIGluIE1hcnZlbGwgU29Dcy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgdmVyc2lvbiAyLiAgVGhpcyBwcm9ncmFtIGlzIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkKKyAqIHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgorI2luY2x1ZGUgPGxpbnV4L2JjZC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisKKworI2RlZmluZSBSVENfVElNRV9SRUdfT0ZGUwkwCisjZGVmaW5lIFJUQ19TRUNPTkRTX09GRlMJMAorI2RlZmluZSBSVENfTUlOVVRFU19PRkZTCTgKKyNkZWZpbmUgUlRDX0hPVVJTX09GRlMJCTE2CisjZGVmaW5lIFJUQ19XREFZX09GRlMJCTI0CisjZGVmaW5lIFJUQ19IT1VSU18xMkhfTU9ERQkJKDEgPDwgMjIpIC8qIDEyIGhvdXJzIG1vZGUgKi8KKworI2RlZmluZSBSVENfREFURV9SRUdfT0ZGUwk0CisjZGVmaW5lIFJUQ19NREFZX09GRlMJCTAKKyNkZWZpbmUgUlRDX01PTlRIX09GRlMJCTgKKyNkZWZpbmUgUlRDX1lFQVJfT0ZGUwkJMTYKKworCitzdHJ1Y3QgcnRjX3BsYXRfZGF0YSB7CisJc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YzsKKwl2b2lkIF9faW9tZW0gKmlvYWRkcjsKK307CisKK3N0YXRpYyBpbnQgbXZfcnRjX3NldF90aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICp0bSkKK3sKKwlzdHJ1Y3QgcnRjX3BsYXRfZGF0YSAqcGRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IHBkYXRhLT5pb2FkZHI7CisJdTMyCXJ0Y19yZWc7CisKKwlydGNfcmVnID0gKGJpbjJiY2QodG0tPnRtX3NlYykgPDwgUlRDX1NFQ09ORFNfT0ZGUykgfAorCQkoYmluMmJjZCh0bS0+dG1fbWluKSA8PCBSVENfTUlOVVRFU19PRkZTKSB8CisJCShiaW4yYmNkKHRtLT50bV9ob3VyKSA8PCBSVENfSE9VUlNfT0ZGUykgfAorCQkoYmluMmJjZCh0bS0+dG1fd2RheSkgPDwgUlRDX1dEQVlfT0ZGUyk7CisJd3JpdGVsKHJ0Y19yZWcsIGlvYWRkciArIFJUQ19USU1FX1JFR19PRkZTKTsKKworCXJ0Y19yZWcgPSAoYmluMmJjZCh0bS0+dG1fbWRheSkgPDwgUlRDX01EQVlfT0ZGUykgfAorCQkoYmluMmJjZCh0bS0+dG1fbW9uICsgMSkgPDwgUlRDX01PTlRIX09GRlMpIHwKKwkJKGJpbjJiY2QodG0tPnRtX3llYXIgJSAxMDApIDw8IFJUQ19ZRUFSX09GRlMpOworCXdyaXRlbChydGNfcmVnLCBpb2FkZHIgKyBSVENfREFURV9SRUdfT0ZGUyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtdl9ydGNfcmVhZF90aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICp0bSkKK3sKKwlzdHJ1Y3QgcnRjX3BsYXRfZGF0YSAqcGRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IHBkYXRhLT5pb2FkZHI7CisJdTMyCXJ0Y190aW1lLCBydGNfZGF0ZTsKKwl1bnNpZ25lZCBpbnQgeWVhciwgbW9udGgsIGRheSwgaG91ciwgbWludXRlLCBzZWNvbmQsIHdkYXk7CisKKwlydGNfdGltZSA9IHJlYWRsKGlvYWRkciArIFJUQ19USU1FX1JFR19PRkZTKTsKKwlydGNfZGF0ZSA9IHJlYWRsKGlvYWRkciArIFJUQ19EQVRFX1JFR19PRkZTKTsKKworCXNlY29uZCA9IHJ0Y190aW1lICYgMHg3ZjsKKwltaW51dGUgPSAocnRjX3RpbWUgPj4gUlRDX01JTlVURVNfT0ZGUykgJiAweDdmOworCWhvdXIgPSAocnRjX3RpbWUgPj4gUlRDX0hPVVJTX09GRlMpICYgMHgzZjsgLyogYXNzdW1lIDI0IGhvdXJzIG1vZGUgKi8KKwl3ZGF5ID0gKHJ0Y190aW1lID4+IFJUQ19XREFZX09GRlMpICYgMHg3OworCisJZGF5ID0gcnRjX2RhdGUgJiAweDNmOworCW1vbnRoID0gKHJ0Y19kYXRlID4+IFJUQ19NT05USF9PRkZTKSAmIDB4M2Y7CisJeWVhciA9IChydGNfZGF0ZSA+PiBSVENfWUVBUl9PRkZTKSAmIDB4ZmY7CisKKwl0bS0+dG1fc2VjID0gYmNkMmJpbihzZWNvbmQpOworCXRtLT50bV9taW4gPSBiY2QyYmluKG1pbnV0ZSk7CisJdG0tPnRtX2hvdXIgPSBiY2QyYmluKGhvdXIpOworCXRtLT50bV9tZGF5ID0gYmNkMmJpbihkYXkpOworCXRtLT50bV93ZGF5ID0gYmNkMmJpbih3ZGF5KTsKKwl0bS0+dG1fbW9uID0gYmNkMmJpbihtb250aCkgLSAxOworCS8qIGh3IGNvdW50cyBmcm9tIHllYXIgMjAwMCwgYnV0IHRtX3llYXIgaXMgcmVsYXRpdmUgdG8gMTkwMCAqLworCXRtLT50bV95ZWFyID0gYmNkMmJpbih5ZWFyKSArIDEwMDsKKworCXJldHVybiBydGNfdmFsaWRfdG0odG0pOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHJ0Y19jbGFzc19vcHMgbXZfcnRjX29wcyA9IHsKKwkucmVhZF90aW1lCT0gbXZfcnRjX3JlYWRfdGltZSwKKwkuc2V0X3RpbWUJPSBtdl9ydGNfc2V0X3RpbWUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBtdl9ydGNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwlzdHJ1Y3QgcnRjX3BsYXRfZGF0YSAqcGRhdGE7CisJcmVzb3VyY2Vfc2l6ZV90IHNpemU7CisJdTMyIHJ0Y190aW1lOworCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlpZiAoIXJlcykKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlwZGF0YSA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKnBkYXRhKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwZGF0YSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlzaXplID0gcmVzb3VyY2Vfc2l6ZShyZXMpOworCWlmICghZGV2bV9yZXF1ZXN0X21lbV9yZWdpb24oJnBkZXYtPmRldiwgcmVzLT5zdGFydCwgc2l6ZSwKKwkJCQkgICAgIHBkZXYtPm5hbWUpKQorCQlyZXR1cm4gLUVCVVNZOworCisJcGRhdGEtPmlvYWRkciA9IGRldm1faW9yZW1hcCgmcGRldi0+ZGV2LCByZXMtPnN0YXJ0LCBzaXplKTsKKwlpZiAoIXBkYXRhLT5pb2FkZHIpCisJCXJldHVybiAtRU5PTUVNOworCisJLyogbWFrZSBzdXJlIHRoZSAyNCBob3VycyBtb2RlIGlzIGVuYWJsZWQgKi8KKwlydGNfdGltZSA9IHJlYWRsKHBkYXRhLT5pb2FkZHIgKyBSVENfVElNRV9SRUdfT0ZGUyk7CisJaWYgKHJ0Y190aW1lICYgUlRDX0hPVVJTXzEySF9NT0RFKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIjI0IEhvdXJzIG1vZGUgbm90IHN1cHBvcnRlZC5cbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBwZGF0YSk7CisJcGRhdGEtPnJ0YyA9IHJ0Y19kZXZpY2VfcmVnaXN0ZXIocGRldi0+bmFtZSwgJnBkZXYtPmRldiwKKwkJCQkJICZtdl9ydGNfb3BzLCBUSElTX01PRFVMRSk7CisJaWYgKElTX0VSUihwZGF0YS0+cnRjKSkKKwkJcmV0dXJuIFBUUl9FUlIocGRhdGEtPnJ0Yyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2V4aXQgbXZfcnRjX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBydGNfcGxhdF9kYXRhICpwZGF0YSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJcnRjX2RldmljZV91bnJlZ2lzdGVyKHBkYXRhLT5ydGMpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBtdl9ydGNfZHJpdmVyID0geworCS5yZW1vdmUJCT0gX19leGl0X3AobXZfcnRjX3JlbW92ZSksCisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gInJ0Yy1tdiIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCX0sCit9OworCitzdGF0aWMgX19pbml0IGludCBtdl9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9wcm9iZSgmbXZfcnRjX2RyaXZlciwgbXZfcnRjX3Byb2JlKTsKK30KKworc3RhdGljIF9fZXhpdCB2b2lkIG12X2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmbXZfcnRjX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KG12X2luaXQpOworbW9kdWxlX2V4aXQobXZfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIlNhZWVkIEJpc2hhcmEgPHNhZWVkQG1hcnZlbGwuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJNYXJ2ZWxsIFJUQyBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBUygicGxhdGZvcm06cnRjLW12Iik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9ydGMtcHhhLmMgYi9kcml2ZXJzL3J0Yy9ydGMtcHhhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2M3ZWI4NwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvcnRjL3J0Yy1weGEuYwpAQCAtMCwwICsxLDQ4OSBAQAorLyoKKyAqIFJlYWwgVGltZSBDbG9jayBpbnRlcmZhY2UgZm9yIFhTY2FsZSBQWEEyN3ggYW5kIFBYQTN4eAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBSb2JlcnQgSmFyem1paworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9ydGMuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisKKyNkZWZpbmUgVElNRVJfRlJFUQkJQ0xPQ0tfVElDS19SQVRFCisjZGVmaW5lIFJUQ19ERUZfRElWSURFUgkJKDMyNzY4IC0gMSkKKyNkZWZpbmUgUlRDX0RFRl9UUklNCQkwCisjZGVmaW5lIE1BWEZSRVFfUEVSSU9ESUMJMTAwMAorCisvKgorICogUFhBIFJlZ2lzdGVycyBhbmQgYml0cyBkZWZpbml0aW9ucworICovCisjZGVmaW5lIFJUU1JfUElDRQkoMSA8PCAxNSkJLyogUGVyaW9kaWMgaW50ZXJydXB0IGNvdW50IGVuYWJsZSAqLworI2RlZmluZSBSVFNSX1BJQUxFCSgxIDw8IDE0KQkvKiBQZXJpb2RpYyBpbnRlcnJ1cHQgQWxhcm0gZW5hYmxlICovCisjZGVmaW5lIFJUU1JfUElBTAkoMSA8PCAxMykJLyogUGVyaW9kaWMgaW50ZXJydXB0IGRldGVjdGVkICovCisjZGVmaW5lIFJUU1JfU1dBTEUyCSgxIDw8IDExKQkvKiBSVEMgc3RvcHdhdGNoIGFsYXJtMiBlbmFibGUgKi8KKyNkZWZpbmUgUlRTUl9TV0FMMgkoMSA8PCAxMCkJLyogUlRDIHN0b3B3YXRjaCBhbGFybTIgZGV0ZWN0ZWQgKi8KKyNkZWZpbmUgUlRTUl9TV0FMRTEJKDEgPDwgOSkJLyogUlRDIHN0b3B3YXRjaCBhbGFybTEgZW5hYmxlICovCisjZGVmaW5lIFJUU1JfU1dBTDEJKDEgPDwgOCkJLyogUlRDIHN0b3B3YXRjaCBhbGFybTEgZGV0ZWN0ZWQgKi8KKyNkZWZpbmUgUlRTUl9SREFMRTIJKDEgPDwgNykJLyogUlRDIGFsYXJtMiBlbmFibGUgKi8KKyNkZWZpbmUgUlRTUl9SREFMMgkoMSA8PCA2KQkvKiBSVEMgYWxhcm0yIGRldGVjdGVkICovCisjZGVmaW5lIFJUU1JfUkRBTEUxCSgxIDw8IDUpCS8qIFJUQyBhbGFybTEgZW5hYmxlICovCisjZGVmaW5lIFJUU1JfUkRBTDEJKDEgPDwgNCkJLyogUlRDIGFsYXJtMSBkZXRlY3RlZCAqLworI2RlZmluZSBSVFNSX0haRQkoMSA8PCAzKQkvKiBIWiBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lIFJUU1JfQUxFCSgxIDw8IDIpCS8qIFJUQyBhbGFybSBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lIFJUU1JfSFoJCSgxIDw8IDEpCS8qIEhaIHJpc2luZy1lZGdlIGRldGVjdGVkICovCisjZGVmaW5lIFJUU1JfQUwJCSgxIDw8IDApCS8qIFJUQyBhbGFybSBkZXRlY3RlZCAqLworI2RlZmluZSBSVFNSX1RSSUdfTUFTSwkoUlRTUl9BTCB8IFJUU1JfSFogfCBSVFNSX1JEQUwxIHwgUlRTUl9SREFMMlwKKwkJCSB8IFJUU1JfU1dBTDEgfCBSVFNSX1NXQUwyKQorI2RlZmluZSBSWXhSX1lFQVJfUwk5CisjZGVmaW5lIFJZeFJfWUVBUl9NQVNLCSgweGZmZiA8PCBSWXhSX1lFQVJfUykKKyNkZWZpbmUgUll4Ul9NT05USF9TCTUKKyNkZWZpbmUgUll4Ul9NT05USF9NQVNLCSgweGYgPDwgUll4Ul9NT05USF9TKQorI2RlZmluZSBSWXhSX0RBWV9NQVNLCTB4MWYKKyNkZWZpbmUgUkR4Ul9IT1VSX1MJMTIKKyNkZWZpbmUgUkR4Ul9IT1VSX01BU0sJKDB4MWYgPDwgUkR4Ul9IT1VSX1MpCisjZGVmaW5lIFJEeFJfTUlOX1MJNgorI2RlZmluZSBSRHhSX01JTl9NQVNLCSgweDNmIDw8IFJEeFJfTUlOX1MpCisjZGVmaW5lIFJEeFJfU0VDX01BU0sJMHgzZgorCisjZGVmaW5lIFJUU1IJCTB4MDgKKyNkZWZpbmUgUlRUUgkJMHgwYworI2RlZmluZSBSRENSCQkweDEwCisjZGVmaW5lIFJZQ1IJCTB4MTQKKyNkZWZpbmUgUkRBUjEJCTB4MTgKKyNkZWZpbmUgUllBUjEJCTB4MWMKKyNkZWZpbmUgUlRDUElDUgkJMHgzNAorI2RlZmluZSBQSUFSCQkweDM4CisKKyNkZWZpbmUgcnRjX3JlYWRsKHB4YV9ydGMsIHJlZykJXAorCV9fcmF3X3JlYWRsKChweGFfcnRjKS0+YmFzZSArIChyZWcpKQorI2RlZmluZSBydGNfd3JpdGVsKHB4YV9ydGMsIHJlZywgdmFsdWUpCVwKKwlfX3Jhd193cml0ZWwoKHZhbHVlKSwgKHB4YV9ydGMpLT5iYXNlICsgKHJlZykpCisKK3N0cnVjdCBweGFfcnRjIHsKKwlzdHJ1Y3QgcmVzb3VyY2UJKnJlc3M7CisJdm9pZCBfX2lvbWVtCQkqYmFzZTsKKwlpbnQJCQlpcnFfMUh6OworCWludAkJCWlycV9BbHJtOworCXN0cnVjdCBydGNfZGV2aWNlCSpydGM7CisJc3BpbmxvY2tfdAkJbG9jazsJCS8qIFByb3RlY3RzIHRoaXMgc3RydWN0dXJlICovCisJc3RydWN0IHJ0Y190aW1lCQlydGNfYWxhcm07Cit9OworCitzdGF0aWMgdTMyIHJ5eHJfY2FsYyhzdHJ1Y3QgcnRjX3RpbWUgKnRtKQoreworCXJldHVybiAoKHRtLT50bV95ZWFyICsgMTkwMCkgPDwgUll4Ul9ZRUFSX1MpCisJCXwgKCh0bS0+dG1fbW9uICsgMSkgPDwgUll4Ul9NT05USF9TKQorCQl8IHRtLT50bV9tZGF5OworfQorCitzdGF0aWMgdTMyIHJkeHJfY2FsYyhzdHJ1Y3QgcnRjX3RpbWUgKnRtKQoreworCXJldHVybiAodG0tPnRtX2hvdXIgPDwgUkR4Ul9IT1VSX1MpIHwgKHRtLT50bV9taW4gPDwgUkR4Ul9NSU5fUykKKwkJfCB0bS0+dG1fc2VjOworfQorCitzdGF0aWMgdm9pZCB0bV9jYWxjKHUzMiByeWNyLCB1MzIgcmRjciwgc3RydWN0IHJ0Y190aW1lICp0bSkKK3sKKwl0bS0+dG1feWVhciA9ICgocnljciAmIFJZeFJfWUVBUl9NQVNLKSA+PiBSWXhSX1lFQVJfUykgLSAxOTAwOworCXRtLT50bV9tb24gPSAoKChyeWNyICYgUll4Ul9NT05USF9NQVNLKSA+PiBSWXhSX01PTlRIX1MpKSAtIDE7CisJdG0tPnRtX21kYXkgPSAocnljciAmIFJZeFJfREFZX01BU0spOworCXRtLT50bV9ob3VyID0gKHJkY3IgJiBSRHhSX0hPVVJfTUFTSykgPj4gUkR4Ul9IT1VSX1M7CisJdG0tPnRtX21pbiA9IChyZGNyICYgUkR4Ul9NSU5fTUFTSykgPj4gUkR4Ul9NSU5fUzsKKwl0bS0+dG1fc2VjID0gcmRjciAmIFJEeFJfU0VDX01BU0s7Cit9CisKK3N0YXRpYyB2b2lkIHJ0c3JfY2xlYXJfYml0cyhzdHJ1Y3QgcHhhX3J0YyAqcHhhX3J0YywgdTMyIG1hc2spCit7CisJdTMyIHJ0c3I7CisKKwlydHNyID0gcnRjX3JlYWRsKHB4YV9ydGMsIFJUU1IpOworCXJ0c3IgJj0gflJUU1JfVFJJR19NQVNLOworCXJ0c3IgJj0gfm1hc2s7CisJcnRjX3dyaXRlbChweGFfcnRjLCBSVFNSLCBydHNyKTsKK30KKworc3RhdGljIHZvaWQgcnRzcl9zZXRfYml0cyhzdHJ1Y3QgcHhhX3J0YyAqcHhhX3J0YywgdTMyIG1hc2spCit7CisJdTMyIHJ0c3I7CisKKwlydHNyID0gcnRjX3JlYWRsKHB4YV9ydGMsIFJUU1IpOworCXJ0c3IgJj0gflJUU1JfVFJJR19NQVNLOworCXJ0c3IgfD0gbWFzazsKKwlydGNfd3JpdGVsKHB4YV9ydGMsIFJUU1IsIHJ0c3IpOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgcHhhX3J0Y19pcnEoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2X2lkKTsKKwlzdHJ1Y3QgcHhhX3J0YyAqcHhhX3J0YyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXUzMiBydHNyOworCXVuc2lnbmVkIGxvbmcgZXZlbnRzID0gMDsKKworCXNwaW5fbG9jaygmcHhhX3J0Yy0+bG9jayk7CisKKwkvKiBjbGVhciBpbnRlcnJ1cHQgc291cmNlcyAqLworCXJ0c3IgPSBydGNfcmVhZGwocHhhX3J0YywgUlRTUik7CisJcnRjX3dyaXRlbChweGFfcnRjLCBSVFNSLCBydHNyKTsKKworCS8qIHRlbXBvcmFyeSBkaXNhYmxlIHJ0YyBpbnRlcnJ1cHRzICovCisJcnRzcl9jbGVhcl9iaXRzKHB4YV9ydGMsIFJUU1JfUkRBTEUxIHwgUlRTUl9QSUFMRSB8IFJUU1JfSFpFKTsKKworCS8qIGNsZWFyIGFsYXJtIGludGVycnVwdCBpZiBpdCBoYXMgb2NjdXJyZWQgKi8KKwlpZiAocnRzciAmIFJUU1JfUkRBTDEpCisJCXJ0c3IgJj0gflJUU1JfUkRBTEUxOworCisJLyogdXBkYXRlIGlycSBkYXRhICYgY291bnRlciAqLworCWlmIChydHNyICYgUlRTUl9SREFMMSkKKwkJZXZlbnRzIHw9IFJUQ19BRiB8IFJUQ19JUlFGOworCWlmIChydHNyICYgUlRTUl9IWikKKwkJZXZlbnRzIHw9IFJUQ19VRiB8IFJUQ19JUlFGOworCWlmIChydHNyICYgUlRTUl9QSUFMKQorCQlldmVudHMgfD0gUlRDX1BGIHwgUlRDX0lSUUY7CisKKwlydGNfdXBkYXRlX2lycShweGFfcnRjLT5ydGMsIDEsIGV2ZW50cyk7CisKKwkvKiBlbmFibGUgYmFjayBydGMgaW50ZXJydXB0cyAqLworCXJ0Y193cml0ZWwocHhhX3J0YywgUlRTUiwgcnRzciAmIH5SVFNSX1RSSUdfTUFTSyk7CisKKwlzcGluX3VubG9jaygmcHhhX3J0Yy0+bG9jayk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaW50IHB4YV9ydGNfb3BlbihzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHB4YV9ydGMgKnB4YV9ydGMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlpbnQgcmV0OworCisJcmV0ID0gcmVxdWVzdF9pcnEocHhhX3J0Yy0+aXJxXzFIeiwgcHhhX3J0Y19pcnEsIElSUUZfRElTQUJMRUQsCisJCQkgICJydGMgMUh6IiwgZGV2KTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGRldiwgImNhbid0IGdldCBpcnEgJWksIGVyciAlZFxuIiwgcHhhX3J0Yy0+aXJxXzFIeiwKKwkJCXJldCk7CisJCWdvdG8gZXJyX2lycV8xSHo7CisJfQorCXJldCA9IHJlcXVlc3RfaXJxKHB4YV9ydGMtPmlycV9BbHJtLCBweGFfcnRjX2lycSwgSVJRRl9ESVNBQkxFRCwKKwkJCSAgInJ0YyBBbHJtIiwgZGV2KTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGRldiwgImNhbid0IGdldCBpcnEgJWksIGVyciAlZFxuIiwgcHhhX3J0Yy0+aXJxX0Fscm0sCisJCQlyZXQpOworCQlnb3RvIGVycl9pcnFfQWxybTsKKwl9CisKKwlyZXR1cm4gMDsKKworZXJyX2lycV9BbHJtOgorCWZyZWVfaXJxKHB4YV9ydGMtPmlycV8xSHosIGRldik7CitlcnJfaXJxXzFIejoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBweGFfcnRjX3JlbGVhc2Uoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBweGFfcnRjICpweGFfcnRjID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisKKwlzcGluX2xvY2tfaXJxKCZweGFfcnRjLT5sb2NrKTsKKwlydHNyX2NsZWFyX2JpdHMocHhhX3J0YywgUlRTUl9QSUFMRSB8IFJUU1JfUkRBTEUxIHwgUlRTUl9IWkUpOworCXNwaW5fdW5sb2NrX2lycSgmcHhhX3J0Yy0+bG9jayk7CisKKwlmcmVlX2lycShweGFfcnRjLT5pcnFfQWxybSwgZGV2KTsKKwlmcmVlX2lycShweGFfcnRjLT5pcnFfMUh6LCBkZXYpOworfQorCitzdGF0aWMgaW50IHB4YV9wZXJpb2RpY19pcnFfc2V0X2ZyZXEoc3RydWN0IGRldmljZSAqZGV2LCBpbnQgZnJlcSkKK3sKKwlzdHJ1Y3QgcHhhX3J0YyAqcHhhX3J0YyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCWludCBwZXJpb2RfbXM7CisKKwlpZiAoZnJlcSA8IDEgfHwgZnJlcSA+IE1BWEZSRVFfUEVSSU9ESUMpCisJCXJldHVybiAtRUlOVkFMOworCisJcGVyaW9kX21zID0gMTAwMCAvIGZyZXE7CisJcnRjX3dyaXRlbChweGFfcnRjLCBQSUFSLCBwZXJpb2RfbXMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHhhX3BlcmlvZGljX2lycV9zZXRfc3RhdGUoc3RydWN0IGRldmljZSAqZGV2LCBpbnQgZW5hYmxlZCkKK3sKKwlzdHJ1Y3QgcHhhX3J0YyAqcHhhX3J0YyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJaWYgKGVuYWJsZWQpCisJCXJ0c3Jfc2V0X2JpdHMocHhhX3J0YywgUlRTUl9QSUFMRSB8IFJUU1JfUElDRSk7CisJZWxzZQorCQlydHNyX2NsZWFyX2JpdHMocHhhX3J0YywgUlRTUl9QSUFMRSB8IFJUU1JfUElDRSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBweGFfcnRjX2lvY3RsKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IGNtZCwKKwkJdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IHB4YV9ydGMgKnB4YV9ydGMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlpbnQgcmV0ID0gMDsKKworCXNwaW5fbG9ja19pcnEoJnB4YV9ydGMtPmxvY2spOworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBSVENfQUlFX09GRjoKKwkJcnRzcl9jbGVhcl9iaXRzKHB4YV9ydGMsIFJUU1JfUkRBTEUxKTsKKwkJYnJlYWs7CisJY2FzZSBSVENfQUlFX09OOgorCQlydHNyX3NldF9iaXRzKHB4YV9ydGMsIFJUU1JfUkRBTEUxKTsKKwkJYnJlYWs7CisJY2FzZSBSVENfVUlFX09GRjoKKwkJcnRzcl9jbGVhcl9iaXRzKHB4YV9ydGMsIFJUU1JfSFpFKTsKKwkJYnJlYWs7CisJY2FzZSBSVENfVUlFX09OOgorCQlydHNyX3NldF9iaXRzKHB4YV9ydGMsIFJUU1JfSFpFKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVOT0lPQ1RMQ01EOworCX0KKworCXNwaW5fdW5sb2NrX2lycSgmcHhhX3J0Yy0+bG9jayk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBweGFfcnRjX3JlYWRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqdG0pCit7CisJc3RydWN0IHB4YV9ydGMgKnB4YV9ydGMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwl1MzIgcnljciwgcmRjcjsKKworCXJ5Y3IgPSBydGNfcmVhZGwocHhhX3J0YywgUllDUik7CisJcmRjciA9IHJ0Y19yZWFkbChweGFfcnRjLCBSRENSKTsKKworCXRtX2NhbGMocnljciwgcmRjciwgdG0pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHB4YV9ydGNfc2V0X3RpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKnRtKQoreworCXN0cnVjdCBweGFfcnRjICpweGFfcnRjID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisKKwlydGNfd3JpdGVsKHB4YV9ydGMsIFJZQ1IsIHJ5eHJfY2FsYyh0bSkpOworCXJ0Y193cml0ZWwocHhhX3J0YywgUkRDUiwgcmR4cl9jYWxjKHRtKSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBweGFfcnRjX3JlYWRfYWxhcm0oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3drYWxybSAqYWxybSkKK3sKKwlzdHJ1Y3QgcHhhX3J0YyAqcHhhX3J0YyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXUzMiBydHNyLCByeWFyLCByZGFyOworCisJcnlhciA9IHJ0Y19yZWFkbChweGFfcnRjLCBSWUFSMSk7CisJcmRhciA9IHJ0Y19yZWFkbChweGFfcnRjLCBSREFSMSk7CisJdG1fY2FsYyhyeWFyLCByZGFyLCAmYWxybS0+dGltZSk7CisKKwlydHNyID0gcnRjX3JlYWRsKHB4YV9ydGMsIFJUU1IpOworCWFscm0tPmVuYWJsZWQgPSAocnRzciAmIFJUU1JfUkRBTEUxKSA/IDEgOiAwOworCWFscm0tPnBlbmRpbmcgPSAocnRzciAmIFJUU1JfUkRBTDEpID8gMSA6IDA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHhhX3J0Y19zZXRfYWxhcm0oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3drYWxybSAqYWxybSkKK3sKKwlzdHJ1Y3QgcHhhX3J0YyAqcHhhX3J0YyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXUzMiBydHNyOworCisJc3Bpbl9sb2NrX2lycSgmcHhhX3J0Yy0+bG9jayk7CisKKwlydGNfd3JpdGVsKHB4YV9ydGMsIFJZQVIxLCByeXhyX2NhbGMoJmFscm0tPnRpbWUpKTsKKwlydGNfd3JpdGVsKHB4YV9ydGMsIFJEQVIxLCByZHhyX2NhbGMoJmFscm0tPnRpbWUpKTsKKworCXJ0c3IgPSBydGNfcmVhZGwocHhhX3J0YywgUlRTUik7CisJaWYgKGFscm0tPmVuYWJsZWQpCisJCXJ0c3IgfD0gUlRTUl9SREFMRTE7CisJZWxzZQorCQlydHNyICY9IH5SVFNSX1JEQUxFMTsKKwlydGNfd3JpdGVsKHB4YV9ydGMsIFJUU1IsIHJ0c3IpOworCisJc3Bpbl91bmxvY2tfaXJxKCZweGFfcnRjLT5sb2NrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHB4YV9ydGNfcHJvYyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBzZXFfZmlsZSAqc2VxKQoreworCXN0cnVjdCBweGFfcnRjICpweGFfcnRjID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisKKwlzZXFfcHJpbnRmKHNlcSwgInRyaW0vZGl2aWRlclx0OiAweCUwOHhcbiIsIHJ0Y19yZWFkbChweGFfcnRjLCBSVFRSKSk7CisJc2VxX3ByaW50ZihzZXEsICJ1cGRhdGVfSVJRXHQ6ICVzXG4iLAorCQkgICAocnRjX3JlYWRsKHB4YV9ydGMsIFJUU1IpICYgUlRTUl9IWkUpID8gInllcyIgOiAibm8iKTsKKwlzZXFfcHJpbnRmKHNlcSwgInBlcmlvZGljX0lSUVx0OiAlc1xuIiwKKwkJICAgKHJ0Y19yZWFkbChweGFfcnRjLCBSVFNSKSAmIFJUU1JfUElBTEUpID8gInllcyIgOiAibm8iKTsKKwlzZXFfcHJpbnRmKHNlcSwgInBlcmlvZGljX2ZyZXFcdDogJXVcbiIsIHJ0Y19yZWFkbChweGFfcnRjLCBQSUFSKSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBydGNfY2xhc3Nfb3BzIHB4YV9ydGNfb3BzID0geworCS5vcGVuID0gcHhhX3J0Y19vcGVuLAorCS5yZWxlYXNlID0gcHhhX3J0Y19yZWxlYXNlLAorCS5pb2N0bCA9IHB4YV9ydGNfaW9jdGwsCisJLnJlYWRfdGltZSA9IHB4YV9ydGNfcmVhZF90aW1lLAorCS5zZXRfdGltZSA9IHB4YV9ydGNfc2V0X3RpbWUsCisJLnJlYWRfYWxhcm0gPSBweGFfcnRjX3JlYWRfYWxhcm0sCisJLnNldF9hbGFybSA9IHB4YV9ydGNfc2V0X2FsYXJtLAorCS5wcm9jID0gcHhhX3J0Y19wcm9jLAorCS5pcnFfc2V0X3N0YXRlID0gcHhhX3BlcmlvZGljX2lycV9zZXRfc3RhdGUsCisJLmlycV9zZXRfZnJlcSA9IHB4YV9wZXJpb2RpY19pcnFfc2V0X2ZyZXEsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBweGFfcnRjX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKKwlzdHJ1Y3QgcHhhX3J0YyAqcHhhX3J0YzsKKwlpbnQgcmV0OworCXUzMiBydHRyOworCisJcHhhX3J0YyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBweGFfcnRjKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFweGFfcnRjKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXNwaW5fbG9ja19pbml0KCZweGFfcnRjLT5sb2NrKTsKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBweGFfcnRjKTsKKworCXJldCA9IC1FTlhJTzsKKwlweGFfcnRjLT5yZXNzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlpZiAoIXB4YV9ydGMtPnJlc3MpIHsKKwkJZGV2X2VycihkZXYsICJObyBJL08gbWVtb3J5IHJlc291cmNlIGRlZmluZWRcbiIpOworCQlnb3RvIGVycl9yZXNzOworCX0KKworCXB4YV9ydGMtPmlycV8xSHogPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOworCWlmIChweGFfcnRjLT5pcnFfMUh6IDwgMCkgeworCQlkZXZfZXJyKGRldiwgIk5vIDFIeiBJUlEgcmVzb3VyY2UgZGVmaW5lZFxuIik7CisJCWdvdG8gZXJyX3Jlc3M7CisJfQorCXB4YV9ydGMtPmlycV9BbHJtID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAxKTsKKwlpZiAocHhhX3J0Yy0+aXJxX0Fscm0gPCAwKSB7CisJCWRldl9lcnIoZGV2LCAiTm8gYWxhcm0gSVJRIHJlc291cmNlIGRlZmluZWRcbiIpOworCQlnb3RvIGVycl9yZXNzOworCX0KKworCXJldCA9IC1FTk9NRU07CisJcHhhX3J0Yy0+YmFzZSA9IGlvcmVtYXAocHhhX3J0Yy0+cmVzcy0+c3RhcnQsCisJCQkJcmVzb3VyY2Vfc2l6ZShweGFfcnRjLT5yZXNzKSk7CisJaWYgKCFweGFfcnRjLT5iYXNlKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIlVuYWJsZSB0byBtYXAgcHhhIFJUQyBJL08gbWVtb3J5XG4iKTsKKwkJZ290byBlcnJfbWFwOworCX0KKworCS8qCisJICogSWYgdGhlIGNsb2NrIGRpdmlkZXIgaXMgdW5pbml0aWFsaXplZCB0aGVuIHJlc2V0IGl0IHRvIHRoZQorCSAqIGRlZmF1bHQgdmFsdWUgdG8gZ2V0IHRoZSAxSHogY2xvY2suCisJICovCisJaWYgKHJ0Y19yZWFkbChweGFfcnRjLCBSVFRSKSA9PSAwKSB7CisJCXJ0dHIgPSBSVENfREVGX0RJVklERVIgKyAoUlRDX0RFRl9UUklNIDw8IDE2KTsKKwkJcnRjX3dyaXRlbChweGFfcnRjLCBSVFRSLCBydHRyKTsKKwkJZGV2X3dhcm4oZGV2LCAid2FybmluZzogaW5pdGlhbGl6aW5nIGRlZmF1bHQgY2xvY2siCisJCQkgIiBkaXZpZGVyL3RyaW0gdmFsdWVcbiIpOworCX0KKworCXJ0c3JfY2xlYXJfYml0cyhweGFfcnRjLCBSVFNSX1BJQUxFIHwgUlRTUl9SREFMRTEgfCBSVFNSX0haRSk7CisKKwlweGFfcnRjLT5ydGMgPSBydGNfZGV2aWNlX3JlZ2lzdGVyKCJweGEtcnRjIiwgJnBkZXYtPmRldiwgJnB4YV9ydGNfb3BzLAorCQkJCQkgICBUSElTX01PRFVMRSk7CisJcmV0ID0gUFRSX0VSUihweGFfcnRjLT5ydGMpOworCWlmIChJU19FUlIocHhhX3J0Yy0+cnRjKSkgeworCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byByZWdpc3RlciBSVEMgZGV2aWNlIC0+ICVkXG4iLCByZXQpOworCQlnb3RvIGVycl9ydGNfcmVnOworCX0KKworCWRldmljZV9pbml0X3dha2V1cChkZXYsIDEpOworCisJcmV0dXJuIDA7CisKK2Vycl9ydGNfcmVnOgorCSBpb3VubWFwKHB4YV9ydGMtPmJhc2UpOworZXJyX3Jlc3M6CitlcnJfbWFwOgorCWtmcmVlKHB4YV9ydGMpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19leGl0IHB4YV9ydGNfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHB4YV9ydGMgKnB4YV9ydGMgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCXJ0Y19kZXZpY2VfdW5yZWdpc3RlcihweGFfcnRjLT5ydGMpOworCisJc3Bpbl9sb2NrX2lycSgmcHhhX3J0Yy0+bG9jayk7CisJaW91bm1hcChweGFfcnRjLT5iYXNlKTsKKwlzcGluX3VubG9ja19pcnEoJnB4YV9ydGMtPmxvY2spOworCisJa2ZyZWUocHhhX3J0Yyk7CisKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIENPTkZJR19QTQorc3RhdGljIGludCBweGFfcnRjX3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQoreworCXN0cnVjdCBweGFfcnRjICpweGFfcnRjID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlpZiAoZGV2aWNlX21heV93YWtldXAoJnBkZXYtPmRldikpCisJCWVuYWJsZV9pcnFfd2FrZShweGFfcnRjLT5pcnFfQWxybSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHhhX3J0Y19yZXN1bWUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgcHhhX3J0YyAqcHhhX3J0YyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJaWYgKGRldmljZV9tYXlfd2FrZXVwKCZwZGV2LT5kZXYpKQorCQlkaXNhYmxlX2lycV93YWtlKHB4YV9ydGMtPmlycV9BbHJtKTsKKwlyZXR1cm4gMDsKK30KKyNlbHNlCisjZGVmaW5lIHB4YV9ydGNfc3VzcGVuZAlOVUxMCisjZGVmaW5lIHB4YV9ydGNfcmVzdW1lCU5VTEwKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBweGFfcnRjX2RyaXZlciA9IHsKKwkucmVtb3ZlCQk9IF9fZXhpdF9wKHB4YV9ydGNfcmVtb3ZlKSwKKwkuc3VzcGVuZAk9IHB4YV9ydGNfc3VzcGVuZCwKKwkucmVzdW1lCQk9IHB4YV9ydGNfcmVzdW1lLAorCS5kcml2ZXIJCT0geworCQkubmFtZQkJPSAicHhhLXJ0YyIsCisJfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHB4YV9ydGNfaW5pdCh2b2lkKQoreworCWlmIChjcHVfaXNfcHhhMjd4KCkgfHwgY3B1X2lzX3B4YTN4eCgpKQorCQlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3Byb2JlKCZweGFfcnRjX2RyaXZlciwgcHhhX3J0Y19wcm9iZSk7CisKKwlyZXR1cm4gLUVOT0RFVjsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHB4YV9ydGNfZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZweGFfcnRjX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHB4YV9ydGNfaW5pdCk7Cittb2R1bGVfZXhpdChweGFfcnRjX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJSb2JlcnQgSmFyem1payIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJQWEEyN3gvUFhBM3h4IFJlYWx0aW1lIENsb2NrIERyaXZlciAoUlRDKSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTpweGEtcnRjIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9ydGMtczNjLmMgYi9kcml2ZXJzL3J0Yy9ydGMtczNjLmMKaW5kZXggN2E1NjhiZS4uZTBkN2I5OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ydGMvcnRjLXMzYy5jCisrKyBiL2RyaXZlcnMvcnRjL3J0Yy1zM2MuYwpAQCAtOTQsNiArOTQsOSBAQAogewogCXVuc2lnbmVkIGludCB0bXA7CiAKKwlpZiAoIWlzX3Bvd2VyX29mXzIoZnJlcSkpCisJCXJldHVybiAtRUlOVkFMOworCiAJc3Bpbl9sb2NrX2lycSgmczNjX3J0Y19waWVfbG9jayk7CiAKIAl0bXAgPSByZWFkYihzM2NfcnRjX2Jhc2UgKyBTM0MyNDEwX1RJQ05UKSAmIFMzQzI0MTBfVElDTlRfRU5BQkxFOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvcnRjLXNoLmMgYi9kcml2ZXJzL3J0Yy9ydGMtc2guYwppbmRleCBhYWY5ZDZhLi4xYzNmYzZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3J0Yy9ydGMtc2guYworKysgYi9kcml2ZXJzL3J0Yy9ydGMtc2guYwpAQCAtMjQsNiArMjQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9sb2cyLmg+CiAjaW5jbHVkZSA8YXNtL3J0Yy5oPgogCiAjZGVmaW5lIERSVl9OQU1FCSJzaC1ydGMiCkBAIC04OSw3ICs5MCw5IEBACiAJdm9pZCBfX2lvbWVtICpyZWdiYXNlOwogCXVuc2lnbmVkIGxvbmcgcmVnc2l6ZTsKIAlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKLQl1bnNpZ25lZCBpbnQgYWxhcm1faXJxLCBwZXJpb2RpY19pcnEsIGNhcnJ5X2lycTsKKwlpbnQgYWxhcm1faXJxOworCWludCBwZXJpb2RpY19pcnE7CisJaW50IGNhcnJ5X2lycTsKIAlzdHJ1Y3QgcnRjX2RldmljZSAqcnRjX2RldjsKIAlzcGlubG9ja190IGxvY2s7CiAJdW5zaWduZWQgbG9uZyBjYXBhYmlsaXRpZXM7CS8qIFNlZSBhc20tc2gvcnRjLmggZm9yIGNhcCBiaXRzICovCkBAIC01NDksNiArNTUyLDggQEAKIAogc3RhdGljIGludCBzaF9ydGNfaXJxX3NldF9mcmVxKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IGZyZXEpCiB7CisJaWYgKCFpc19wb3dlcl9vZl8yKGZyZXEpKQorCQlyZXR1cm4gLUVJTlZBTDsKIAlyZXR1cm4gc2hfcnRjX2lvY3RsKGRldiwgUlRDX0lSUVBfU0VULCBmcmVxKTsKIH0KIApAQCAtNTc4LDcgKzU4Myw3IEBACiAKIAkvKiBnZXQgcGVyaW9kaWMvY2FycnkvYWxhcm0gaXJxcyAqLwogCXJldCA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7Ci0JaWYgKHVubGlrZWx5KHJldCA8IDApKSB7CisJaWYgKHVubGlrZWx5KHJldCA8PSAwKSkgewogCQlyZXQgPSAtRU5PRU5UOwogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJObyBJUlEgZm9yIHBlcmlvZFxuIik7CiAJCWdvdG8gZXJyX2JhZHJlczsKQEAgLTU4Niw3ICs1OTEsNyBAQAogCXJ0Yy0+cGVyaW9kaWNfaXJxID0gcmV0OwogCiAJcmV0ID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAxKTsKLQlpZiAodW5saWtlbHkocmV0IDwgMCkpIHsKKwlpZiAodW5saWtlbHkocmV0IDw9IDApKSB7CiAJCXJldCA9IC1FTk9FTlQ7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgIk5vIElSUSBmb3IgY2FycnlcbiIpOwogCQlnb3RvIGVycl9iYWRyZXM7CkBAIC01OTQsNyArNTk5LDcgQEAKIAlydGMtPmNhcnJ5X2lycSA9IHJldDsKIAogCXJldCA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMik7Ci0JaWYgKHVubGlrZWx5KHJldCA8IDApKSB7CisJaWYgKHVubGlrZWx5KHJldCA8PSAwKSkgewogCQlyZXQgPSAtRU5PRU5UOwogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJObyBJUlEgZm9yIGFsYXJtXG4iKTsKIAkJZ290byBlcnJfYmFkcmVzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvcnRjLXN0azE3dGE4LmMgYi9kcml2ZXJzL3J0Yy9ydGMtc3RrMTd0YTguYwppbmRleCBmNGNkNDZlLi43ZDE1NDdiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3J0Yy9ydGMtc3RrMTd0YTguYworKysgYi9kcml2ZXJzL3J0Yy9ydGMtc3RrMTd0YTguYwpAQCAtMTcwLDcgKzE3MCw3IEBACiAJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOwogCXN0cnVjdCBydGNfcGxhdF9kYXRhICpwZGF0YSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwogCi0JaWYgKHBkYXRhLT5pcnEgPCAwKQorCWlmIChwZGF0YS0+aXJxIDw9IDApCiAJCXJldHVybiAtRUlOVkFMOwogCXBkYXRhLT5hbHJtX21kYXkgPSBhbHJtLT50aW1lLnRtX21kYXk7CiAJcGRhdGEtPmFscm1faG91ciA9IGFscm0tPnRpbWUudG1faG91cjsKQEAgLTE4Nyw3ICsxODcsNyBAQAogCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKIAlzdHJ1Y3QgcnRjX3BsYXRfZGF0YSAqcGRhdGEgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAotCWlmIChwZGF0YS0+aXJxIDwgMCkKKwlpZiAocGRhdGEtPmlycSA8PSAwKQogCQlyZXR1cm4gLUVJTlZBTDsKIAlhbHJtLT50aW1lLnRtX21kYXkgPSBwZGF0YS0+YWxybV9tZGF5IDwgMCA/IDAgOiBwZGF0YS0+YWxybV9tZGF5OwogCWFscm0tPnRpbWUudG1faG91ciA9IHBkYXRhLT5hbHJtX2hvdXIgPCAwID8gMCA6IHBkYXRhLT5hbHJtX2hvdXI7CkBAIC0yMjEsNyArMjIxLDcgQEAKIAlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CiAJc3RydWN0IHJ0Y19wbGF0X2RhdGEgKnBkYXRhID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CiAKLQlpZiAocGRhdGEtPmlycSA8IDApCisJaWYgKHBkYXRhLT5pcnEgPD0gMCkKIAkJcmV0dXJuIC1FTk9JT0NUTENNRDsgLyogZmFsbCBiYWNrIGludG8gcnRjLWRldidzIGVtdWxhdGlvbiAqLwogCXN3aXRjaCAoY21kKSB7CiAJY2FzZSBSVENfQUlFX09GRjoKQEAgLTMwMyw3ICszMDMsNiBAQAogCXBkYXRhID0ga3phbGxvYyhzaXplb2YoKnBkYXRhKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFwZGF0YSkKIAkJcmV0dXJuIC1FTk9NRU07Ci0JcGRhdGEtPmlycSA9IC0xOwogCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKHJlcy0+c3RhcnQsIFJUQ19SRUdfU0laRSwgcGRldi0+bmFtZSkpIHsKIAkJcmV0ID0gLUVCVVNZOwogCQlnb3RvIG91dDsKQEAgLTMyOSwxMyArMzI4LDEzIEBACiAJaWYgKHJlYWRiKGlvYWRkciArIFJUQ19GTEFHUykgJiBSVENfRkxBR1NfUEYpCiAJCWRldl93YXJuKCZwZGV2LT5kZXYsICJ2b2x0YWdlLWxvdyBkZXRlY3RlZC5cbiIpOwogCi0JaWYgKHBkYXRhLT5pcnEgPj0gMCkgeworCWlmIChwZGF0YS0+aXJxID4gMCkgewogCQl3cml0ZWIoMCwgaW9hZGRyICsgUlRDX0lOVEVSUlVQVFMpOwogCQlpZiAocmVxdWVzdF9pcnEocGRhdGEtPmlycSwgc3RrMTd0YThfcnRjX2ludGVycnVwdCwKIAkJCQlJUlFGX0RJU0FCTEVEIHwgSVJRRl9TSEFSRUQsCiAJCQkJcGRldi0+bmFtZSwgcGRldikgPCAwKSB7CiAJCQlkZXZfd2FybigmcGRldi0+ZGV2LCAiaW50ZXJydXB0IG5vdCBhdmFpbGFibGUuXG4iKTsKLQkJCXBkYXRhLT5pcnEgPSAtMTsKKwkJCXBkYXRhLT5pcnEgPSAwOwogCQl9CiAJfQogCkBAIC0zNTUsNyArMzU0LDcgQEAKICBvdXQ6CiAJaWYgKHBkYXRhLT5ydGMpCiAJCXJ0Y19kZXZpY2VfdW5yZWdpc3RlcihwZGF0YS0+cnRjKTsKLQlpZiAocGRhdGEtPmlycSA+PSAwKQorCWlmIChwZGF0YS0+aXJxID4gMCkKIAkJZnJlZV9pcnEocGRhdGEtPmlycSwgcGRldik7CiAJaWYgKGlvYWRkcikKIAkJaW91bm1hcChpb2FkZHIpOwpAQCAtMzcxLDcgKzM3MCw3IEBACiAKIAlzeXNmc19yZW1vdmVfYmluX2ZpbGUoJnBkZXYtPmRldi5rb2JqLCAmc3RrMTd0YThfbnZyYW1fYXR0cik7CiAJcnRjX2RldmljZV91bnJlZ2lzdGVyKHBkYXRhLT5ydGMpOwotCWlmIChwZGF0YS0+aXJxID49IDApIHsKKwlpZiAocGRhdGEtPmlycSA+IDApIHsKIAkJd3JpdGViKDAsIHBkYXRhLT5pb2FkZHIgKyBSVENfSU5URVJSVVBUUyk7CiAJCWZyZWVfaXJxKHBkYXRhLT5pcnEsIHBkZXYpOwogCX0KQEAgLTQwMCw3ICszOTksNyBAQAogCiBzdGF0aWMgX19leGl0IHZvaWQgc3RrMTd0YThfZXhpdCh2b2lkKQogewotCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3Rlcigmc3RrMTd0YThfcnRjX2RyaXZlcik7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnN0azE3dGE4X3J0Y19kcml2ZXIpOwogfQogCiBtb2R1bGVfaW5pdChzdGsxN3RhOF9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL3J0Yy10ZXN0LmMgYi9kcml2ZXJzL3J0Yy9ydGMtdGVzdC5jCmluZGV4IGJjOTMwMDIuLmU0NzgyODAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcnRjL3J0Yy10ZXN0LmMKKysrIGIvZHJpdmVycy9ydGMvcnRjLXRlc3QuYwpAQCAtMzQsMTQgKzM0LDkgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCB0ZXN0X3J0Y19zZXRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsCi0Jc3RydWN0IHJ0Y190aW1lICp0bSkKLXsKLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIGludCB0ZXN0X3J0Y19zZXRfbW1zcyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgc2VjcykKIHsKKwlkZXZfaW5mbyhkZXYsICIlcywgc2VjcyA9ICVsdVxuIiwgX19mdW5jX18sIHNlY3MpOwogCXJldHVybiAwOwogfQogCkBAIC03OCw3ICs3Myw2IEBACiBzdGF0aWMgY29uc3Qgc3RydWN0IHJ0Y19jbGFzc19vcHMgdGVzdF9ydGNfb3BzID0gewogCS5wcm9jID0gdGVzdF9ydGNfcHJvYywKIAkucmVhZF90aW1lID0gdGVzdF9ydGNfcmVhZF90aW1lLAotCS5zZXRfdGltZSA9IHRlc3RfcnRjX3NldF90aW1lLAogCS5yZWFkX2FsYXJtID0gdGVzdF9ydGNfcmVhZF9hbGFybSwKIAkuc2V0X2FsYXJtID0gdGVzdF9ydGNfc2V0X2FsYXJtLAogCS5zZXRfbW1zcyA9IHRlc3RfcnRjX3NldF9tbXNzLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvcnRjLXR3bDQwMzAuYyBiL2RyaXZlcnMvcnRjL3J0Yy10d2w0MDMwLmMKaW5kZXggMDFkOGRhOS4uOGNlNWY3NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ydGMvcnRjLXR3bDQwMzAuYworKysgYi9kcml2ZXJzL3J0Yy9ydGMtdHdsNDAzMC5jCkBAIC0xOSw2ICsxOSw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CkBAIC00MTUsOCArNDE2LDggQEAKIAlpbnQgaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKIAl1OCByZF9yZWc7CiAKLQlpZiAoaXJxIDwgMCkKLQkJcmV0dXJuIGlycTsKKwlpZiAoaXJxIDw9IDApCisJCXJldHVybiAtRUlOVkFMOwogCiAJcnRjID0gcnRjX2RldmljZV9yZWdpc3RlcihwZGV2LT5uYW1lLAogCQkJCSAgJnBkZXYtPmRldiwgJnR3bDQwMzBfcnRjX29wcywgVEhJU19NT0RVTEUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvcnRjLXR4NDkzOS5jIGIvZHJpdmVycy9ydGMvcnRjLXR4NDkzOS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlZTQ4NTcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3J0Yy9ydGMtdHg0OTM5LmMKQEAgLTAsMCArMSwzMTcgQEAKKy8qCisgKiBUWDQ5MzkgaW50ZXJuYWwgUlRDIGRyaXZlcgorICogQmFzZWQgb24gUkJUWDQ5eHggcGF0Y2ggZnJvbSBDRUxGIHBhdGNoIGFyY2hpdmUuCisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogKEMpIENvcHlyaWdodCBUT1NISUJBIENPUlBPUkFUSU9OIDIwMDUtMjAwNworICovCisjaW5jbHVkZSA8bGludXgvcnRjLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxhc20vdHh4OS90eDQ5MzkuaD4KKworc3RydWN0IHR4NDkzOXJ0Y19wbGF0X2RhdGEgeworCXN0cnVjdCBydGNfZGV2aWNlICpydGM7CisJc3RydWN0IHR4NDkzOV9ydGNfcmVnIF9faW9tZW0gKnJ0Y3JlZzsKK307CisKK3N0YXRpYyBzdHJ1Y3QgdHg0OTM5cnRjX3BsYXRfZGF0YSAqZ2V0X3R4NDkzOXJ0Y19wbGF0X2RhdGEoc3RydWN0IGRldmljZSAqZGV2KQoreworCXJldHVybiBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YSh0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KSk7Cit9CisKK3N0YXRpYyBpbnQgdHg0OTM5X3J0Y19jbWQoc3RydWN0IHR4NDkzOV9ydGNfcmVnIF9faW9tZW0gKnJ0Y3JlZywgaW50IGNtZCkKK3sKKwlpbnQgaSA9IDA7CisKKwlfX3Jhd193cml0ZWwoY21kLCAmcnRjcmVnLT5jdGwpOworCS8qIFRoaXMgbWlnaHQgdGFrZSAzMHVzIChuZXh0IDMyLjc2OEtIeiBjbG9jaykgKi8KKwl3aGlsZSAoX19yYXdfcmVhZGwoJnJ0Y3JlZy0+Y3RsKSAmIFRYNDkzOV9SVENDVExfQlVTWSkgeworCQkvKiB0aW1lb3V0IG9uIGFwcHJveC4gMTAwdXMgKEAgR0JVUzIwME1IeikgKi8KKwkJaWYgKGkrKyA+IDIwMCAqIDEwMCkKKwkJCXJldHVybiAtRUJVU1k7CisJCWNwdV9yZWxheCgpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0eDQ5MzlfcnRjX3NldF9tbXNzKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyBzZWNzKQoreworCXN0cnVjdCB0eDQ5MzlydGNfcGxhdF9kYXRhICpwZGF0YSA9IGdldF90eDQ5MzlydGNfcGxhdF9kYXRhKGRldik7CisJc3RydWN0IHR4NDkzOV9ydGNfcmVnIF9faW9tZW0gKnJ0Y3JlZyA9IHBkYXRhLT5ydGNyZWc7CisJaW50IGksIHJldDsKKwl1bnNpZ25lZCBjaGFyIGJ1Zls2XTsKKworCWJ1ZlswXSA9IDA7CisJYnVmWzFdID0gMDsKKwlidWZbMl0gPSBzZWNzOworCWJ1ZlszXSA9IHNlY3MgPj4gODsKKwlidWZbNF0gPSBzZWNzID4+IDE2OworCWJ1Zls1XSA9IHNlY3MgPj4gMjQ7CisJc3Bpbl9sb2NrX2lycSgmcGRhdGEtPnJ0Yy0+aXJxX2xvY2spOworCV9fcmF3X3dyaXRlbCgwLCAmcnRjcmVnLT5hZHIpOworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCV9fcmF3X3dyaXRlbChidWZbaV0sICZydGNyZWctPmRhdCk7CisJcmV0ID0gdHg0OTM5X3J0Y19jbWQocnRjcmVnLAorCQkJICAgICBUWDQ5MzlfUlRDQ1RMX0NPTU1BTkRfU0VUVElNRSB8CisJCQkgICAgIChfX3Jhd19yZWFkbCgmcnRjcmVnLT5jdGwpICYgVFg0OTM5X1JUQ0NUTF9BTE1FKSk7CisJc3Bpbl91bmxvY2tfaXJxKCZwZGF0YS0+cnRjLT5pcnFfbG9jayk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB0eDQ5MzlfcnRjX3JlYWRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqdG0pCit7CisJc3RydWN0IHR4NDkzOXJ0Y19wbGF0X2RhdGEgKnBkYXRhID0gZ2V0X3R4NDkzOXJ0Y19wbGF0X2RhdGEoZGV2KTsKKwlzdHJ1Y3QgdHg0OTM5X3J0Y19yZWcgX19pb21lbSAqcnRjcmVnID0gcGRhdGEtPnJ0Y3JlZzsKKwlpbnQgaSwgcmV0OworCXVuc2lnbmVkIGxvbmcgc2VjOworCXVuc2lnbmVkIGNoYXIgYnVmWzZdOworCisJc3Bpbl9sb2NrX2lycSgmcGRhdGEtPnJ0Yy0+aXJxX2xvY2spOworCXJldCA9IHR4NDkzOV9ydGNfY21kKHJ0Y3JlZywKKwkJCSAgICAgVFg0OTM5X1JUQ0NUTF9DT01NQU5EX0dFVFRJTUUgfAorCQkJICAgICAoX19yYXdfcmVhZGwoJnJ0Y3JlZy0+Y3RsKSAmIFRYNDkzOV9SVENDVExfQUxNRSkpOworCWlmIChyZXQpIHsKKwkJc3Bpbl91bmxvY2tfaXJxKCZwZGF0YS0+cnRjLT5pcnFfbG9jayk7CisJCXJldHVybiByZXQ7CisJfQorCV9fcmF3X3dyaXRlbCgyLCAmcnRjcmVnLT5hZHIpOworCWZvciAoaSA9IDI7IGkgPCA2OyBpKyspCisJCWJ1ZltpXSA9IF9fcmF3X3JlYWRsKCZydGNyZWctPmRhdCk7CisJc3Bpbl91bmxvY2tfaXJxKCZwZGF0YS0+cnRjLT5pcnFfbG9jayk7CisJc2VjID0gKGJ1Zls1XSA8PCAyNCkgfCAoYnVmWzRdIDw8IDE2KSB8IChidWZbM10gPDwgOCkgfCBidWZbMl07CisJcnRjX3RpbWVfdG9fdG0oc2VjLCB0bSk7CisJcmV0dXJuIHJ0Y192YWxpZF90bSh0bSk7Cit9CisKK3N0YXRpYyBpbnQgdHg0OTM5X3J0Y19zZXRfYWxhcm0oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3drYWxybSAqYWxybSkKK3sKKwlzdHJ1Y3QgdHg0OTM5cnRjX3BsYXRfZGF0YSAqcGRhdGEgPSBnZXRfdHg0OTM5cnRjX3BsYXRfZGF0YShkZXYpOworCXN0cnVjdCB0eDQ5MzlfcnRjX3JlZyBfX2lvbWVtICpydGNyZWcgPSBwZGF0YS0+cnRjcmVnOworCWludCBpLCByZXQ7CisJdW5zaWduZWQgbG9uZyBzZWM7CisJdW5zaWduZWQgY2hhciBidWZbNl07CisKKwlpZiAoYWxybS0+dGltZS50bV9zZWMgPCAwIHx8CisJICAgIGFscm0tPnRpbWUudG1fbWluIDwgMCB8fAorCSAgICBhbHJtLT50aW1lLnRtX2hvdXIgPCAwIHx8CisJICAgIGFscm0tPnRpbWUudG1fbWRheSA8IDAgfHwKKwkgICAgYWxybS0+dGltZS50bV9tb24gPCAwIHx8CisJICAgIGFscm0tPnRpbWUudG1feWVhciA8IDApCisJCXJldHVybiAtRUlOVkFMOworCXJ0Y190bV90b190aW1lKCZhbHJtLT50aW1lLCAmc2VjKTsKKwlidWZbMF0gPSAwOworCWJ1ZlsxXSA9IDA7CisJYnVmWzJdID0gc2VjOworCWJ1ZlszXSA9IHNlYyA+PiA4OworCWJ1Zls0XSA9IHNlYyA+PiAxNjsKKwlidWZbNV0gPSBzZWMgPj4gMjQ7CisJc3Bpbl9sb2NrX2lycSgmcGRhdGEtPnJ0Yy0+aXJxX2xvY2spOworCV9fcmF3X3dyaXRlbCgwLCAmcnRjcmVnLT5hZHIpOworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCV9fcmF3X3dyaXRlbChidWZbaV0sICZydGNyZWctPmRhdCk7CisJcmV0ID0gdHg0OTM5X3J0Y19jbWQocnRjcmVnLCBUWDQ5MzlfUlRDQ1RMX0NPTU1BTkRfU0VUQUxBUk0gfAorCQkJICAgICAoYWxybS0+ZW5hYmxlZCA/IFRYNDkzOV9SVENDVExfQUxNRSA6IDApKTsKKwlzcGluX3VubG9ja19pcnEoJnBkYXRhLT5ydGMtPmlycV9sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHR4NDkzOV9ydGNfcmVhZF9hbGFybShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfd2thbHJtICphbHJtKQoreworCXN0cnVjdCB0eDQ5MzlydGNfcGxhdF9kYXRhICpwZGF0YSA9IGdldF90eDQ5MzlydGNfcGxhdF9kYXRhKGRldik7CisJc3RydWN0IHR4NDkzOV9ydGNfcmVnIF9faW9tZW0gKnJ0Y3JlZyA9IHBkYXRhLT5ydGNyZWc7CisJaW50IGksIHJldDsKKwl1bnNpZ25lZCBsb25nIHNlYzsKKwl1bnNpZ25lZCBjaGFyIGJ1Zls2XTsKKwl1MzIgY3RsOworCisJc3Bpbl9sb2NrX2lycSgmcGRhdGEtPnJ0Yy0+aXJxX2xvY2spOworCXJldCA9IHR4NDkzOV9ydGNfY21kKHJ0Y3JlZywKKwkJCSAgICAgVFg0OTM5X1JUQ0NUTF9DT01NQU5EX0dFVEFMQVJNIHwKKwkJCSAgICAgKF9fcmF3X3JlYWRsKCZydGNyZWctPmN0bCkgJiBUWDQ5MzlfUlRDQ1RMX0FMTUUpKTsKKwlpZiAocmV0KSB7CisJCXNwaW5fdW5sb2NrX2lycSgmcGRhdGEtPnJ0Yy0+aXJxX2xvY2spOworCQlyZXR1cm4gcmV0OworCX0KKwlfX3Jhd193cml0ZWwoMiwgJnJ0Y3JlZy0+YWRyKTsKKwlmb3IgKGkgPSAyOyBpIDwgNjsgaSsrKQorCQlidWZbaV0gPSBfX3Jhd19yZWFkbCgmcnRjcmVnLT5kYXQpOworCWN0bCA9IF9fcmF3X3JlYWRsKCZydGNyZWctPmN0bCk7CisJYWxybS0+ZW5hYmxlZCA9IChjdGwgJiBUWDQ5MzlfUlRDQ1RMX0FMTUUpID8gMSA6IDA7CisJYWxybS0+cGVuZGluZyA9IChjdGwgJiBUWDQ5MzlfUlRDQ1RMX0FMTUQpID8gMSA6IDA7CisJc3Bpbl91bmxvY2tfaXJxKCZwZGF0YS0+cnRjLT5pcnFfbG9jayk7CisJc2VjID0gKGJ1Zls1XSA8PCAyNCkgfCAoYnVmWzRdIDw8IDE2KSB8IChidWZbM10gPDwgOCkgfCBidWZbMl07CisJcnRjX3RpbWVfdG9fdG0oc2VjLCAmYWxybS0+dGltZSk7CisJcmV0dXJuIHJ0Y192YWxpZF90bSgmYWxybS0+dGltZSk7Cit9CisKK3N0YXRpYyBpbnQgdHg0OTM5X3J0Y19hbGFybV9pcnFfZW5hYmxlKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IGVuYWJsZWQpCit7CisJc3RydWN0IHR4NDkzOXJ0Y19wbGF0X2RhdGEgKnBkYXRhID0gZ2V0X3R4NDkzOXJ0Y19wbGF0X2RhdGEoZGV2KTsKKworCXNwaW5fbG9ja19pcnEoJnBkYXRhLT5ydGMtPmlycV9sb2NrKTsKKwl0eDQ5MzlfcnRjX2NtZChwZGF0YS0+cnRjcmVnLAorCQkgICAgICAgVFg0OTM5X1JUQ0NUTF9DT01NQU5EX05PUCB8CisJCSAgICAgICAoZW5hYmxlZCA/IFRYNDkzOV9SVENDVExfQUxNRSA6IDApKTsKKwlzcGluX3VubG9ja19pcnEoJnBkYXRhLT5ydGMtPmlycV9sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlycXJldHVybl90IHR4NDkzOV9ydGNfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3QgdHg0OTM5cnRjX3BsYXRfZGF0YSAqcGRhdGEgPSBnZXRfdHg0OTM5cnRjX3BsYXRfZGF0YShkZXZfaWQpOworCXN0cnVjdCB0eDQ5MzlfcnRjX3JlZyBfX2lvbWVtICpydGNyZWcgPSBwZGF0YS0+cnRjcmVnOworCXVuc2lnbmVkIGxvbmcgZXZlbnRzID0gUlRDX0lSUUY7CisKKwlzcGluX2xvY2soJnBkYXRhLT5ydGMtPmlycV9sb2NrKTsKKwlpZiAoX19yYXdfcmVhZGwoJnJ0Y3JlZy0+Y3RsKSAmIFRYNDkzOV9SVENDVExfQUxNRCkgeworCQlldmVudHMgfD0gUlRDX0FGOworCQl0eDQ5MzlfcnRjX2NtZChydGNyZWcsIFRYNDkzOV9SVENDVExfQ09NTUFORF9OT1ApOworCX0KKwlzcGluX3VubG9jaygmcGRhdGEtPnJ0Yy0+aXJxX2xvY2spOworCXJ0Y191cGRhdGVfaXJxKHBkYXRhLT5ydGMsIDEsIGV2ZW50cyk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHJ0Y19jbGFzc19vcHMgdHg0OTM5X3J0Y19vcHMgPSB7CisJLnJlYWRfdGltZQkJPSB0eDQ5MzlfcnRjX3JlYWRfdGltZSwKKwkucmVhZF9hbGFybQkJPSB0eDQ5MzlfcnRjX3JlYWRfYWxhcm0sCisJLnNldF9hbGFybQkJPSB0eDQ5MzlfcnRjX3NldF9hbGFybSwKKwkuc2V0X21tc3MJCT0gdHg0OTM5X3J0Y19zZXRfbW1zcywKKwkuYWxhcm1faXJxX2VuYWJsZQk9IHR4NDkzOV9ydGNfYWxhcm1faXJxX2VuYWJsZSwKK307CisKK3N0YXRpYyBzc2l6ZV90IHR4NDkzOV9ydGNfbnZyYW1fcmVhZChzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwkJCQkgICAgIHN0cnVjdCBiaW5fYXR0cmlidXRlICpiaW5fYXR0ciwKKwkJCQkgICAgIGNoYXIgKmJ1ZiwgbG9mZl90IHBvcywgc2l6ZV90IHNpemUpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBkZXZpY2UsIGtvYmopOworCXN0cnVjdCB0eDQ5MzlydGNfcGxhdF9kYXRhICpwZGF0YSA9IGdldF90eDQ5MzlydGNfcGxhdF9kYXRhKGRldik7CisJc3RydWN0IHR4NDkzOV9ydGNfcmVnIF9faW9tZW0gKnJ0Y3JlZyA9IHBkYXRhLT5ydGNyZWc7CisJc3NpemVfdCBjb3VudDsKKworCXNwaW5fbG9ja19pcnEoJnBkYXRhLT5ydGMtPmlycV9sb2NrKTsKKwlmb3IgKGNvdW50ID0gMDsgc2l6ZSA+IDAgJiYgcG9zIDwgVFg0OTM5X1JUQ19SRUdfUkFNU0laRTsKKwkgICAgIGNvdW50KyssIHNpemUtLSkgeworCQlfX3Jhd193cml0ZWwocG9zKyssICZydGNyZWctPmFkcik7CisJCSpidWYrKyA9IF9fcmF3X3JlYWRsKCZydGNyZWctPmRhdCk7CisJfQorCXNwaW5fdW5sb2NrX2lycSgmcGRhdGEtPnJ0Yy0+aXJxX2xvY2spOworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHNzaXplX3QgdHg0OTM5X3J0Y19udnJhbV93cml0ZShzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwkJCQkgICAgICBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqYmluX2F0dHIsCisJCQkJICAgICAgY2hhciAqYnVmLCBsb2ZmX3QgcG9zLCBzaXplX3Qgc2l6ZSkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBjb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGRldmljZSwga29iaik7CisJc3RydWN0IHR4NDkzOXJ0Y19wbGF0X2RhdGEgKnBkYXRhID0gZ2V0X3R4NDkzOXJ0Y19wbGF0X2RhdGEoZGV2KTsKKwlzdHJ1Y3QgdHg0OTM5X3J0Y19yZWcgX19pb21lbSAqcnRjcmVnID0gcGRhdGEtPnJ0Y3JlZzsKKwlzc2l6ZV90IGNvdW50OworCisJc3Bpbl9sb2NrX2lycSgmcGRhdGEtPnJ0Yy0+aXJxX2xvY2spOworCWZvciAoY291bnQgPSAwOyBzaXplID4gMCAmJiBwb3MgPCBUWDQ5MzlfUlRDX1JFR19SQU1TSVpFOworCSAgICAgY291bnQrKywgc2l6ZS0tKSB7CisJCV9fcmF3X3dyaXRlbChwb3MrKywgJnJ0Y3JlZy0+YWRyKTsKKwkJX19yYXdfd3JpdGVsKCpidWYrKywgJnJ0Y3JlZy0+ZGF0KTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxKCZwZGF0YS0+cnRjLT5pcnFfbG9jayk7CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3RydWN0IGJpbl9hdHRyaWJ1dGUgdHg0OTM5X3J0Y19udnJhbV9hdHRyID0geworCS5hdHRyID0geworCQkubmFtZSA9ICJudnJhbSIsCisJCS5tb2RlID0gU19JUlVHTyB8IFNfSVdVU1IsCisJfSwKKwkuc2l6ZSA9IFRYNDkzOV9SVENfUkVHX1JBTVNJWkUsCisJLnJlYWQgPSB0eDQ5MzlfcnRjX252cmFtX3JlYWQsCisJLndyaXRlID0gdHg0OTM5X3J0Y19udnJhbV93cml0ZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHR4NDkzOV9ydGNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgcnRjX2RldmljZSAqcnRjOworCXN0cnVjdCB0eDQ5MzlydGNfcGxhdF9kYXRhICpwZGF0YTsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwlpbnQgaXJxLCByZXQ7CisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWlmICghcmVzKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlpcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOworCWlmIChpcnEgPCAwKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlwZGF0YSA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKnBkYXRhKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwZGF0YSkKKwkJcmV0dXJuIC1FTk9NRU07CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgcGRhdGEpOworCisJaWYgKCFkZXZtX3JlcXVlc3RfbWVtX3JlZ2lvbigmcGRldi0+ZGV2LCByZXMtPnN0YXJ0LAorCQkJCSAgICAgcmVzb3VyY2Vfc2l6ZShyZXMpLCBwZGV2LT5uYW1lKSkKKwkJcmV0dXJuIC1FQlVTWTsKKwlwZGF0YS0+cnRjcmVnID0gZGV2bV9pb3JlbWFwKCZwZGV2LT5kZXYsIHJlcy0+c3RhcnQsCisJCQkJICAgICByZXNvdXJjZV9zaXplKHJlcykpOworCWlmICghcGRhdGEtPnJ0Y3JlZykKKwkJcmV0dXJuIC1FQlVTWTsKKworCXR4NDkzOV9ydGNfY21kKHBkYXRhLT5ydGNyZWcsIFRYNDkzOV9SVENDVExfQ09NTUFORF9OT1ApOworCWlmIChkZXZtX3JlcXVlc3RfaXJxKCZwZGV2LT5kZXYsIGlycSwgdHg0OTM5X3J0Y19pbnRlcnJ1cHQsCisJCQkgICAgIElSUUZfRElTQUJMRUQgfCBJUlFGX1NIQVJFRCwKKwkJCSAgICAgcGRldi0+bmFtZSwgJnBkZXYtPmRldikgPCAwKSB7CisJCXJldHVybiAtRUJVU1k7CisJfQorCXJ0YyA9IHJ0Y19kZXZpY2VfcmVnaXN0ZXIocGRldi0+bmFtZSwgJnBkZXYtPmRldiwKKwkJCQkgICZ0eDQ5MzlfcnRjX29wcywgVEhJU19NT0RVTEUpOworCWlmIChJU19FUlIocnRjKSkKKwkJcmV0dXJuIFBUUl9FUlIocnRjKTsKKwlwZGF0YS0+cnRjID0gcnRjOworCXJldCA9IHN5c2ZzX2NyZWF0ZV9iaW5fZmlsZSgmcGRldi0+ZGV2LmtvYmosICZ0eDQ5MzlfcnRjX252cmFtX2F0dHIpOworCWlmIChyZXQpCisJCXJ0Y19kZXZpY2VfdW5yZWdpc3RlcihydGMpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19leGl0IHR4NDkzOV9ydGNfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHR4NDkzOXJ0Y19wbGF0X2RhdGEgKnBkYXRhID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YyA9IHBkYXRhLT5ydGM7CisKKwlzcGluX2xvY2tfaXJxKCZydGMtPmlycV9sb2NrKTsKKwl0eDQ5MzlfcnRjX2NtZChwZGF0YS0+cnRjcmVnLCBUWDQ5MzlfUlRDQ1RMX0NPTU1BTkRfTk9QKTsKKwlzcGluX3VubG9ja19pcnEoJnJ0Yy0+aXJxX2xvY2spOworCXN5c2ZzX3JlbW92ZV9iaW5fZmlsZSgmcGRldi0+ZGV2LmtvYmosICZ0eDQ5MzlfcnRjX252cmFtX2F0dHIpOworCXJ0Y19kZXZpY2VfdW5yZWdpc3RlcihydGMpOworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciB0eDQ5MzlfcnRjX2RyaXZlciA9IHsKKwkucmVtb3ZlCQk9IF9fZXhpdF9wKHR4NDkzOV9ydGNfcmVtb3ZlKSwKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSAidHg0OTM5cnRjIiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHR4NDkzOXJ0Y19pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9wcm9iZSgmdHg0OTM5X3J0Y19kcml2ZXIsIHR4NDkzOV9ydGNfcHJvYmUpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgdHg0OTM5cnRjX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmdHg0OTM5X3J0Y19kcml2ZXIpOworfQorCittb2R1bGVfaW5pdCh0eDQ5MzlydGNfaW5pdCk7Cittb2R1bGVfZXhpdCh0eDQ5MzlydGNfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIkF0c3VzaGkgTmVtb3RvIDxhbmVtb0BtYmEub2NuLm5lLmpwPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJUWDQ5MzkgaW50ZXJuYWwgUlRDIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTp0eDQ5MzlydGMiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL3J0Yy12cjQxeHguYyBiL2RyaXZlcnMvcnRjL3J0Yy12cjQxeHguYwppbmRleCA4MzRkY2M2Li5mMTEyOTdhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3J0Yy9ydGMtdnI0MXh4LmMKKysrIGIvZHJpdmVycy9ydGMvcnRjLXZyNDF4eC5jCkBAIC0yNyw2ICsyNyw3IEBACiAjaW5jbHVkZSA8bGludXgvcnRjLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2xvZzIuaD4KIAogI2luY2x1ZGUgPGFzbS9kaXY2NC5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgpAQCAtODQsOCArODUsOCBAQAogc3RhdGljIGNoYXIgcnRjX25hbWVbXSA9ICJSVEMiOwogc3RhdGljIHVuc2lnbmVkIGxvbmcgcGVyaW9kaWNfY291bnQ7CiBzdGF0aWMgdW5zaWduZWQgaW50IGFsYXJtX2VuYWJsZWQ7Ci1zdGF0aWMgaW50IGFpZV9pcnEgPSAtMTsKLXN0YXRpYyBpbnQgcGllX2lycSA9IC0xOworc3RhdGljIGludCBhaWVfaXJxOworc3RhdGljIGludCBwaWVfaXJxOwogCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgcmVhZF9lbGFwc2VkX3NlY29uZCh2b2lkKQogewpAQCAtMjEwLDYgKzIxMSw4IEBACiB7CiAJdW5zaWduZWQgbG9uZyBjb3VudDsKIAorCWlmICghaXNfcG93ZXJfb2ZfMihmcmVxKSkKKwkJcmV0dXJuIC1FSU5WQUw7CiAJY291bnQgPSBSVENfRlJFUVVFTkNZOwogCWRvX2Rpdihjb3VudCwgZnJlcSk7CiAKQEAgLTM2MCw3ICszNjMsNyBAQAogCXNwaW5fdW5sb2NrX2lycSgmcnRjX2xvY2spOwogCiAJYWllX2lycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7Ci0JaWYgKGFpZV9pcnEgPCAwIHx8IGFpZV9pcnEgPj0gbnJfaXJxcykgeworCWlmIChhaWVfaXJxIDw9IDApIHsKIAkJcmV0dmFsID0gLUVCVVNZOwogCQlnb3RvIGVycl9kZXZpY2VfdW5yZWdpc3RlcjsKIAl9CkBAIC0zNzEsNyArMzc0LDcgQEAKIAkJZ290byBlcnJfZGV2aWNlX3VucmVnaXN0ZXI7CiAKIAlwaWVfaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAxKTsKLQlpZiAocGllX2lycSA8IDAgfHwgcGllX2lycSA+PSBucl9pcnFzKQorCWlmIChwaWVfaXJxIDw9IDApCiAJCWdvdG8gZXJyX2ZyZWVfaXJxOwogCiAJcmV0dmFsID0gcmVxdWVzdF9pcnEocGllX2lycSwgcnRjbG9uZzFfaW50ZXJydXB0LCBJUlFGX0RJU0FCTEVELApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL01ha2VmaWxlIGIvZHJpdmVycy9zMzkwL01ha2VmaWxlCmluZGV4IDRmNGU3Y2YuLmQwZWFlNTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3MzOTAvTWFrZWZpbGUKQEAgLTQsNyArNCw3IEBACiAKIENGTEFHU19zeXNpbmZvLm8gKz0gLUlpbmNsdWRlL21hdGgtZW11IC1JYXJjaC9zMzkwL21hdGgtZW11IC13CiAKLW9iai15ICs9IHMzOTBtYWNoLm8gc3lzaW5mby5vIHMzOTBfcmRldi5vCitvYmoteSArPSBzMzkwbWFjaC5vIHN5c2luZm8ubwogb2JqLXkgKz0gY2lvLyBibG9jay8gY2hhci8gY3J5cHRvLyBuZXQvIHNjc2kvIGt2bS8KIAogZHJpdmVycy15ICs9IGRyaXZlcnMvczM5MC9idWlsdC1pbi5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZF8zOTkwX2VycC5jIGIvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2RfMzk5MF9lcnAuYwppbmRleCBiOGY5YzAwLi5kODJhYWQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZF8zOTkwX2VycC5jCisrKyBiL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkXzM5OTBfZXJwLmMKQEAgLTI2MjEsNyArMjYyMSw3IEBACiAJCX0KIAl9CiAKLQkvKiBkb3VibGUtY2hlY2sgaWYgY3VycmVudCBlcnAvY3FyIHdhcyBzdWNjZXNzZnVsbCAqLworCS8qIGRvdWJsZS1jaGVjayBpZiBjdXJyZW50IGVycC9jcXIgd2FzIHN1Y2Nlc3NmdWwgKi8KIAlpZiAoKGNxci0+aXJiLnNjc3cuY21kLmNzdGF0ID09IDB4MDApICYmCiAJICAgIChjcXItPmlyYi5zY3N3LmNtZC5kc3RhdCA9PQogCSAgICAgKERFVl9TVEFUX0NITl9FTkQgfCBERVZfU1RBVF9ERVZfRU5EKSkpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkX2Vlci5jIGIvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2RfZWVyLmMKaW5kZXggODkyZTI4Ny4uZjhlMDVjZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2RfZWVyLmMKKysrIGIvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2RfZWVyLmMKQEAgLTUzNSw4ICs1MzUsOCBAQAogCSAgICBlZXJiLT5idWZmZXJfcGFnZV9jb3VudCA+IElOVF9NQVggLyBQQUdFX1NJWkUpIHsKIAkJa2ZyZWUoZWVyYik7CiAJCU1FU1NBR0UoS0VSTl9XQVJOSU5HLCAiY2FuJ3Qgb3BlbiBkZXZpY2Ugc2luY2UgbW9kdWxlICIKLQkJCSJwYXJhbWV0ZXIgZWVyX3BhZ2VzIGlzIHNtYWxsZXIgdGhlbiAxIG9yIgotCQkJIiBiaWdnZXIgdGhlbiAlZCIsIChpbnQpKElOVF9NQVggLyBQQUdFX1NJWkUpKTsKKwkJCSJwYXJhbWV0ZXIgZWVyX3BhZ2VzIGlzIHNtYWxsZXIgdGhhbiAxIG9yIgorCQkJIiBiaWdnZXIgdGhhbiAlZCIsIChpbnQpKElOVF9NQVggLyBQQUdFX1NJWkUpKTsKIAkJdW5sb2NrX2tlcm5lbCgpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZF9pbnQuaCBiL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkX2ludC5oCmluZGV4IDA1YTE0NTMuLjRhMzkwODQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkX2ludC5oCisrKyBiL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkX2ludC5oCkBAIC0xOTksNyArMTk5LDcgQEAKICNkZWZpbmUgREFTRF9DUVJfRVJST1IJCTB4ODIJLyogcmVxdWVzdCBpcyBjb21wbGV0ZWQgd2l0aCBlcnJvciAqLwogI2RlZmluZSBEQVNEX0NRUl9DTEVBUl9QRU5ESU5HCTB4ODMJLyogcmVxdWVzdCBpcyBjbGVhciBwZW5kaW5nICovCiAjZGVmaW5lIERBU0RfQ1FSX0NMRUFSRUQJMHg4NAkvKiByZXF1ZXN0IHdhcyBjbGVhcmVkICovCi0jZGVmaW5lIERBU0RfQ1FSX1NVQ0NFU1MJMHg4NQkvKiByZXF1ZXN0IHdhcyBzdWNjZXNzZnVsbCAqLworI2RlZmluZSBEQVNEX0NRUl9TVUNDRVNTCTB4ODUJLyogcmVxdWVzdCB3YXMgc3VjY2Vzc2Z1bCAqLwogCiAKIC8qIHBlciBkYXNkX2Njd19yZXEgZmxhZ3MgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9ibG9jay9kY3NzYmxrLmMgYi9kcml2ZXJzL3MzOTAvYmxvY2svZGNzc2Jsay5jCmluZGV4IDI2ZmZjNmEuLmNmZGNmMWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9ibG9jay9kY3NzYmxrLmMKKysrIGIvZHJpdmVycy9zMzkwL2Jsb2NrL2Rjc3NibGsuYwpAQCAtMTgsNyArMTgsNiBAQAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxhc20vczM5MF9yZGV2Lmg+CiAKICNkZWZpbmUgRENTU0JMS19OQU1FICJkY3NzYmxrIgogI2RlZmluZSBEQ1NTQkxLX01JTk9SU19QRVJfRElTSyAxCkBAIC05NDYsNyArOTQ1LDcgQEAKIHN0YXRpYyB2b2lkIF9fZXhpdAogZGNzc2Jsa19leGl0KHZvaWQpCiB7Ci0JczM5MF9yb290X2Rldl91bnJlZ2lzdGVyKGRjc3NibGtfcm9vdF9kZXYpOworCXJvb3RfZGV2aWNlX3VucmVnaXN0ZXIoZGNzc2Jsa19yb290X2Rldik7CiAJdW5yZWdpc3Rlcl9ibGtkZXYoZGNzc2Jsa19tYWpvciwgRENTU0JMS19OQU1FKTsKIH0KIApAQCAtOTU1LDIyICs5NTQsMjIgQEAKIHsKIAlpbnQgcmM7CiAKLQlkY3NzYmxrX3Jvb3RfZGV2ID0gczM5MF9yb290X2Rldl9yZWdpc3RlcigiZGNzc2JsayIpOworCWRjc3NibGtfcm9vdF9kZXYgPSByb290X2RldmljZV9yZWdpc3RlcigiZGNzc2JsayIpOwogCWlmIChJU19FUlIoZGNzc2Jsa19yb290X2RldikpCiAJCXJldHVybiBQVFJfRVJSKGRjc3NibGtfcm9vdF9kZXYpOwogCXJjID0gZGV2aWNlX2NyZWF0ZV9maWxlKGRjc3NibGtfcm9vdF9kZXYsICZkZXZfYXR0cl9hZGQpOwogCWlmIChyYykgewotCQlzMzkwX3Jvb3RfZGV2X3VucmVnaXN0ZXIoZGNzc2Jsa19yb290X2Rldik7CisJCXJvb3RfZGV2aWNlX3VucmVnaXN0ZXIoZGNzc2Jsa19yb290X2Rldik7CiAJCXJldHVybiByYzsKIAl9CiAJcmMgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoZGNzc2Jsa19yb290X2RldiwgJmRldl9hdHRyX3JlbW92ZSk7CiAJaWYgKHJjKSB7Ci0JCXMzOTBfcm9vdF9kZXZfdW5yZWdpc3RlcihkY3NzYmxrX3Jvb3RfZGV2KTsKKwkJcm9vdF9kZXZpY2VfdW5yZWdpc3RlcihkY3NzYmxrX3Jvb3RfZGV2KTsKIAkJcmV0dXJuIHJjOwogCX0KIAlyYyA9IHJlZ2lzdGVyX2Jsa2RldigwLCBEQ1NTQkxLX05BTUUpOwogCWlmIChyYyA8IDApIHsKLQkJczM5MF9yb290X2Rldl91bnJlZ2lzdGVyKGRjc3NibGtfcm9vdF9kZXYpOworCQlyb290X2RldmljZV91bnJlZ2lzdGVyKGRjc3NibGtfcm9vdF9kZXYpOwogCQlyZXR1cm4gcmM7CiAJfQogCWRjc3NibGtfbWFqb3IgPSByYzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaGFyL3RhcGVfMzU5MC5jIGIvZHJpdmVycy9zMzkwL2NoYXIvdGFwZV8zNTkwLmMKaW5kZXggNDAwNWM0NC4uNzE2MDVhMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2NoYXIvdGFwZV8zNTkwLmMKKysrIGIvZHJpdmVycy9zMzkwL2NoYXIvdGFwZV8zNTkwLmMKQEAgLTgwMSw3ICs4MDEsNyBAQAogc3RhdGljIGlubGluZSBpbnQKIHRhcGVfMzU5MF9lcnBfc3VjY2VkZWQoc3RydWN0IHRhcGVfZGV2aWNlICpkZXZpY2UsIHN0cnVjdCB0YXBlX3JlcXVlc3QgKnJlcXVlc3QpCiB7Ci0JREJGX0VWRU5UKDMsICJFcnJvciBSZWNvdmVyeSBzdWNjZXNzZnVsbCBmb3IgJXNcbiIsCisJREJGX0VWRU5UKDMsICJFcnJvciBSZWNvdmVyeSBzdWNjZXNzZnVsIGZvciAlc1xuIiwKIAkJICB0YXBlX29wX3ZlcmJvc2VbcmVxdWVzdC0+b3BdKTsKIAlyZXR1cm4gdGFwZV8zNTkwX2RvbmUoZGV2aWNlLCByZXF1ZXN0KTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaGFyL3ZtbG9ncmRyLmMgYi9kcml2ZXJzL3MzOTAvY2hhci92bWxvZ3Jkci5jCmluZGV4IGFhYmJlYjkuLmQ4YTIyODkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaGFyL3ZtbG9ncmRyLmMKKysrIGIvZHJpdmVycy9zMzkwL2NoYXIvdm1sb2dyZHIuYwpAQCAtNDI3LDcgKzQyNyw3IEBACiAJCQlidWZmZXIgPSBwcml2LT5idWZmZXIgKyBzaXplb2YoaW50KTsKIAkJfQogCQkvKgotCQkgKiBJZiB0aGUgcmVjb3JkIGlzIGJpZ2dlciB0aGVuIG91ciBidWZmZXIsIHdlIHJlY2VpdmUgb25seQorCQkgKiBJZiB0aGUgcmVjb3JkIGlzIGJpZ2dlciB0aGFuIG91ciBidWZmZXIsIHdlIHJlY2VpdmUgb25seQogCQkgKiBhIHBhcnQgb2YgaXQuIFdlIGNhbiBnZXQgdGhlIHJlc3QgbGF0ZXIuCiAJCSAqLwogCQlpZiAoaXVjdl9kYXRhX2NvdW50ID4gTkVUX0JVRkZFUl9TSVpFKQpAQCAtNDM3LDcgKzQzNyw3IEBACiAJCQkJCSAgMCwgYnVmZmVyLCBpdWN2X2RhdGFfY291bnQsCiAJCQkJCSAgJnByaXYtPnJlc2lkdWFsX2xlbmd0aCk7CiAJCXNwaW5fdW5sb2NrX2JoKCZwcml2LT5wcml2X2xvY2spOwotCQkvKiBBbiByYyBvZiA1IGluZGljYXRlcyB0aGF0IHRoZSByZWNvcmQgd2FzIGJpZ2dlciB0aGVuCisJCS8qIEFuIHJjIG9mIDUgaW5kaWNhdGVzIHRoYXQgdGhlIHJlY29yZCB3YXMgYmlnZ2VyIHRoYW4KIAkJICogdGhlIGJ1ZmZlciwgd2hpY2ggaXMgT0sgZm9yIHVzLiBBIDkgaW5kaWNhdGVzIHRoYXQgdGhlCiAJCSAqIHJlY29yZCB3YXMgcHVyZ2VkIGJlZm9yIHdlIGNvdWxkIHJlY2VpdmUgaXQuCiAJCSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2Npby9jaW8uYyBiL2RyaXZlcnMvczM5MC9jaW8vY2lvLmMKaW5kZXggMDZiNzE4Mi4uNjU5ZjhhNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Npby9jaW8uYworKysgYi9kcml2ZXJzL3MzOTAvY2lvL2Npby5jCkBAIC0zNzksNyArMzc5LDcgQEAKIAkJaWYgKGNjb2RlIDwgMCkgLyogLUVJTyBpZiBtc2NoIGdldHMgYSBwcm9ncmFtIGNoZWNrLiAqLwogCQkJcmV0dXJuIGNjb2RlOwogCQlzd2l0Y2ggKGNjb2RlKSB7Ci0JCWNhc2UgMDogLyogc3VjY2Vzc2Z1bGwgKi8KKwkJY2FzZSAwOiAvKiBzdWNjZXNzZnVsICovCiAJCQlpZiAoc3RzY2goc2NoLT5zY2hpZCwgJnNjaGliKSB8fAogCQkJICAgICFjc3Nfc2NoX2lzX3ZhbGlkKCZzY2hpYikpCiAJCQkJcmV0dXJuIC1FTk9ERVY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2lvL3FkaW9fbWFpbi5jIGIvZHJpdmVycy9zMzkwL2Npby9xZGlvX21haW4uYwppbmRleCA3NDRmOTI4Li4xMGNiMGY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY2lvL3FkaW9fbWFpbi5jCisrKyBiL2RyaXZlcnMvczM5MC9jaW8vcWRpb19tYWluLmMKQEAgLTExNCw3ICsxMTQsNyBAQAogICogQGNvdW50OiBjb3VudCBvZiBidWZmZXJzIHRvIGV4YW1pbmUKICAqIEBhdXRvX2FjazogYXV0b21hdGljYWxseSBhY2tub3dsZWRnZSBidWZmZXJzCiAgKgotICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHN1Y2Nlc3NmdWxsIGV4dHJhY3RlZCBlcXVhbCBidWZmZXIgc3RhdGVzLgorICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHN1Y2Nlc3NmdWxseSBleHRyYWN0ZWQgZXF1YWwgYnVmZmVyIHN0YXRlcy4KICAqIFN0b3BzIHByb2Nlc3NpbmcgaWYgYSBzdGF0ZSBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgbGFzdCBidWZmZXJzIHN0YXRlLgogICovCiBzdGF0aWMgaW50IHFkaW9fZG9fZXFicyhzdHJ1Y3QgcWRpb19xICpxLCB1bnNpZ25lZCBjaGFyICpzdGF0ZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jcnlwdG8vYXBfYnVzLmMgYi9kcml2ZXJzL3MzOTAvY3J5cHRvL2FwX2J1cy5jCmluZGV4IDFmNWY1ZDIuLjljMTQ4NDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jcnlwdG8vYXBfYnVzLmMKKysrIGIvZHJpdmVycy9zMzkwL2NyeXB0by9hcF9idXMuYwpAQCAtMzYsNyArMzYsNiBAQAogI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CiAjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+Ci0jaW5jbHVkZSA8YXNtL3MzOTBfcmRldi5oPgogI2luY2x1ZGUgPGFzbS9yZXNldC5oPgogI2luY2x1ZGUgPGFzbS9haXJxLmg+CiAjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgpAQCAtMTUyMiw3ICsxNTIxLDcgQEAKIAl9CiAKIAkvKiBDcmVhdGUgL3N5cy9kZXZpY2VzL2FwLiAqLwotCWFwX3Jvb3RfZGV2aWNlID0gczM5MF9yb290X2Rldl9yZWdpc3RlcigiYXAiKTsKKwlhcF9yb290X2RldmljZSA9IHJvb3RfZGV2aWNlX3JlZ2lzdGVyKCJhcCIpOwogCXJjID0gSVNfRVJSKGFwX3Jvb3RfZGV2aWNlKSA/IFBUUl9FUlIoYXBfcm9vdF9kZXZpY2UpIDogMDsKIAlpZiAocmMpCiAJCWdvdG8gb3V0X2J1czsKQEAgLTE1NjUsNyArMTU2NCw3IEBACiAJaHJ0aW1lcl9jYW5jZWwoJmFwX3BvbGxfdGltZXIpOwogCWRlc3Ryb3lfd29ya3F1ZXVlKGFwX3dvcmtfcXVldWUpOwogb3V0X3Jvb3Q6Ci0JczM5MF9yb290X2Rldl91bnJlZ2lzdGVyKGFwX3Jvb3RfZGV2aWNlKTsKKwlyb290X2RldmljZV91bnJlZ2lzdGVyKGFwX3Jvb3RfZGV2aWNlKTsKIG91dF9idXM6CiAJd2hpbGUgKGktLSkKIAkJYnVzX3JlbW92ZV9maWxlKCZhcF9idXNfdHlwZSwgYXBfYnVzX2F0dHJzW2ldKTsKQEAgLTE2MDAsNyArMTU5OSw3IEBACiAJaHJ0aW1lcl9jYW5jZWwoJmFwX3BvbGxfdGltZXIpOwogCWRlc3Ryb3lfd29ya3F1ZXVlKGFwX3dvcmtfcXVldWUpOwogCXRhc2tsZXRfa2lsbCgmYXBfdGFza2xldCk7Ci0JczM5MF9yb290X2Rldl91bnJlZ2lzdGVyKGFwX3Jvb3RfZGV2aWNlKTsKKwlyb290X2RldmljZV91bnJlZ2lzdGVyKGFwX3Jvb3RfZGV2aWNlKTsKIAl3aGlsZSAoKGRldiA9IGJ1c19maW5kX2RldmljZSgmYXBfYnVzX3R5cGUsIE5VTEwsIE5VTEwsCiAJCSAgICBfX2FwX21hdGNoX2FsbCkpKQogCXsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9rdm0va3ZtX3ZpcnRpby5jIGIvZHJpdmVycy9zMzkwL2t2bS9rdm1fdmlydGlvLmMKaW5kZXggMjhjOTBiOC4uY2JjODU2NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2t2bS9rdm1fdmlydGlvLmMKKysrIGIvZHJpdmVycy9zMzkwL2t2bS9rdm1fdmlydGlvLmMKQEAgLTI0LDcgKzI0LDYgQEAKICNpbmNsdWRlIDxhc20va3ZtX3ZpcnRpby5oPgogI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgogI2luY2x1ZGUgPGFzbS9zMzkwX2V4dC5oPgotI2luY2x1ZGUgPGFzbS9zMzkwX3JkZXYuaD4KIAogI2RlZmluZSBWSVJUSU9fU1VCQ09ERV82NCAweDBEMDAKIApAQCAtMzM1LDcgKzMzNCw3IEBACiAJaWYgKCFNQUNISU5FX0lTX0tWTSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQlrdm1fcm9vdCA9IHMzOTBfcm9vdF9kZXZfcmVnaXN0ZXIoImt2bV9zMzkwIik7CisJa3ZtX3Jvb3QgPSByb290X2RldmljZV9yZWdpc3Rlcigia3ZtX3MzOTAiKTsKIAlpZiAoSVNfRVJSKGt2bV9yb290KSkgewogCQlyYyA9IFBUUl9FUlIoa3ZtX3Jvb3QpOwogCQlwcmludGsoS0VSTl9FUlIgIkNvdWxkIG5vdCByZWdpc3RlciBrdm1fczM5MCByb290IGRldmljZSIpOwpAQCAtMzQ0LDcgKzM0Myw3IEBACiAKIAlyYyA9IHZtZW1fYWRkX21hcHBpbmcocmVhbF9tZW1vcnlfc2l6ZSwgUEFHRV9TSVpFKTsKIAlpZiAocmMpIHsKLQkJczM5MF9yb290X2Rldl91bnJlZ2lzdGVyKGt2bV9yb290KTsKKwkJcm9vdF9kZXZpY2VfdW5yZWdpc3Rlcihrdm1fcm9vdCk7CiAJCXJldHVybiByYzsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9uZXQvY3UzMDg4LmMgYi9kcml2ZXJzL3MzOTAvbmV0L2N1MzA4OC5jCmluZGV4IGY0YTMyMzcuLjQ4MzgzNDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9uZXQvY3UzMDg4LmMKKysrIGIvZHJpdmVycy9zMzkwL25ldC9jdTMwODguYwpAQCAtMjUsNyArMjUsNiBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogCi0jaW5jbHVkZSA8YXNtL3MzOTBfcmRldi5oPgogI2luY2x1ZGUgPGFzbS9jY3dkZXYuaD4KICNpbmNsdWRlIDxhc20vY2N3Z3JvdXAuaD4KIApAQCAtMTIwLDEyICsxMTksMTIgQEAKIHsKIAlpbnQgcmM7CiAKLQljdTMwODhfcm9vdF9kZXYgPSBzMzkwX3Jvb3RfZGV2X3JlZ2lzdGVyKCJjdTMwODgiKTsKKwljdTMwODhfcm9vdF9kZXYgPSByb290X2RldmljZV9yZWdpc3RlcigiY3UzMDg4Iik7CiAJaWYgKElTX0VSUihjdTMwODhfcm9vdF9kZXYpKQogCQlyZXR1cm4gUFRSX0VSUihjdTMwODhfcm9vdF9kZXYpOwogCXJjID0gY2N3X2RyaXZlcl9yZWdpc3RlcigmY3UzMDg4X2RyaXZlcik7CiAJaWYgKHJjKQotCQlzMzkwX3Jvb3RfZGV2X3VucmVnaXN0ZXIoY3UzMDg4X3Jvb3RfZGV2KTsKKwkJcm9vdF9kZXZpY2VfdW5yZWdpc3RlcihjdTMwODhfcm9vdF9kZXYpOwogCiAJcmV0dXJuIHJjOwogfQpAQCAtMTM0LDcgKzEzMyw3IEBACiBjdTMwODhfZXhpdCAodm9pZCkKIHsKIAljY3dfZHJpdmVyX3VucmVnaXN0ZXIoJmN1MzA4OF9kcml2ZXIpOwotCXMzOTBfcm9vdF9kZXZfdW5yZWdpc3RlcihjdTMwODhfcm9vdF9kZXYpOworCXJvb3RfZGV2aWNlX3VucmVnaXN0ZXIoY3UzMDg4X3Jvb3RfZGV2KTsKIH0KIAogTU9EVUxFX0RFVklDRV9UQUJMRShjY3csY3UzMDg4X2lkcyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvbmV0L3FldGhfY29yZS5oIGIvZHJpdmVycy9zMzkwL25ldC9xZXRoX2NvcmUuaAppbmRleCBkNWNjY2UxLi5lMGM0NTU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvbmV0L3FldGhfY29yZS5oCisrKyBiL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9jb3JlLmgKQEAgLTY0Myw3ICs2NDMsNiBAQAogCWludCBtYWNhZGRyX21vZGU7CiAJaW50IGZha2VfYnJvYWRjYXN0OwogCWludCBhZGRfaGhsZW47Ci0JaW50IGZha2VfbGw7CiAJaW50IGxheWVyMjsKIAllbnVtIHFldGhfbGFyZ2Vfc2VuZF90eXBlcyBsYXJnZV9zZW5kOwogCWludCBwZXJmb3JtYW5jZV9zdGF0czsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9jb3JlX21haW4uYyBiL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9jb3JlX21haW4uYwppbmRleCBlNzgzNjQ0Li5kMWI1YmViIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvbmV0L3FldGhfY29yZV9tYWluLmMKKysrIGIvZHJpdmVycy9zMzkwL25ldC9xZXRoX2NvcmVfbWFpbi5jCkBAIC0yNCw3ICsyNCw2IEBACiAKICNpbmNsdWRlIDxhc20vZWJjZGljLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8YXNtL3MzOTBfcmRldi5oPgogCiAjaW5jbHVkZSAicWV0aF9jb3JlLmgiCiAjaW5jbHVkZSAicWV0aF9jb3JlX29mZmwuaCIKQEAgLTI4Nyw4ICsyODYsMTUgQEAKIAljYXJkLT5vcHRpb25zLmxhcmdlX3NlbmQgPSB0eXBlOwogCXN3aXRjaCAoY2FyZC0+b3B0aW9ucy5sYXJnZV9zZW5kKSB7CiAJY2FzZSBRRVRIX0xBUkdFX1NFTkRfRUREUDoKLQkJY2FyZC0+ZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX1RTTyB8IE5FVElGX0ZfU0cgfAorCQlpZiAoY2FyZC0+aW5mby50eXBlICE9IFFFVEhfQ0FSRF9UWVBFX0lRRCkgeworCQkJY2FyZC0+ZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX1RTTyB8IE5FVElGX0ZfU0cgfAogCQkJCQlORVRJRl9GX0hXX0NTVU07CisJCX0gZWxzZSB7CisJCQljYXJkLT5kZXYtPmZlYXR1cmVzICY9IH4oTkVUSUZfRl9UU08gfCBORVRJRl9GX1NHIHwKKwkJCQkJCU5FVElGX0ZfSFdfQ1NVTSk7CisJCQljYXJkLT5vcHRpb25zLmxhcmdlX3NlbmQgPSBRRVRIX0xBUkdFX1NFTkRfTk87CisJCQlyYyA9IC1FT1BOT1RTVVBQOworCQl9CiAJCWJyZWFrOwogCWNhc2UgUUVUSF9MQVJHRV9TRU5EX1RTTzoKIAkJaWYgKHFldGhfaXNfc3VwcG9ydGVkKGNhcmQsIElQQV9PVVRCT1VORF9UU08pKSB7CkBAIC01NzIsNiArNTc4LDEwIEBACiAJY2FyZCA9IENBUkRfRlJPTV9DREVWKGNoYW5uZWwtPmNjd2Rldik7CiAJaWYgKHFldGhfY2hlY2tfaWR4X3Jlc3BvbnNlKGlvYi0+ZGF0YSkpIHsKIAkJcWV0aF9jbGVhcl9pcGFjbWRfbGlzdChjYXJkKTsKKwkJaWYgKCgoaW9iLT5kYXRhWzJdICYgMHhjMCkgPT0gMHhjMCkgJiYgaW9iLT5kYXRhWzRdID09IDB4ZjYpCisJCQlkZXZfZXJyKCZjYXJkLT5nZGV2LT5kZXYsCisJCQkJIlRoZSBxZXRoIGRldmljZSBpcyBub3QgY29uZmlndXJlZCAiCisJCQkJImZvciB0aGUgT1NJIGxheWVyIHJlcXVpcmVkIGJ5IHovVk1cbiIpOwogCQlxZXRoX3NjaGVkdWxlX3JlY292ZXJ5KGNhcmQpOwogCQlnb3RvIG91dDsKIAl9CkBAIC0xMDcyLDcgKzEwODIsNiBAQAogCWNhcmQtPm9wdGlvbnMubWFjYWRkcl9tb2RlID0gUUVUSF9UUl9NQUNBRERSX05PTkNBTk9OSUNBTDsKIAljYXJkLT5vcHRpb25zLmZha2VfYnJvYWRjYXN0ID0gMDsKIAljYXJkLT5vcHRpb25zLmFkZF9oaGxlbiA9IERFRkFVTFRfQUREX0hITEVOOwotCWNhcmQtPm9wdGlvbnMuZmFrZV9sbCA9IDA7CiAJY2FyZC0+b3B0aW9ucy5wZXJmb3JtYW5jZV9zdGF0cyA9IDA7CiAJY2FyZC0+b3B0aW9ucy5yeF9zZ19jYiA9IFFFVEhfUlhfU0dfQ0I7CiB9CkBAIC0xNjgyLDYgKzE2OTEsNyBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJc3RydWN0IHFldGhfcmVwbHkgKnJlcGx5ID0gTlVMTDsKIAl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CisJc3RydWN0IHFldGhfaXBhX2NtZCAqY21kOwogCiAJUUVUSF9EQkZfVEVYVChUUkFDRSwgMiwgInNlbmRjdGwiKTsKIApAQCAtMTcyOCwxNyArMTczOCwzNCBAQAogCQl3YWtlX3VwKCZjYXJkLT53YWl0X3EpOwogCQlyZXR1cm4gcmM7CiAJfQotCXdoaWxlICghYXRvbWljX3JlYWQoJnJlcGx5LT5yZWNlaXZlZCkpIHsKLQkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgdGltZW91dCkpIHsKLQkJCXNwaW5fbG9ja19pcnFzYXZlKCZyZXBseS0+Y2FyZC0+bG9jaywgZmxhZ3MpOwotCQkJbGlzdF9kZWxfaW5pdCgmcmVwbHktPmxpc3QpOwotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcmVwbHktPmNhcmQtPmxvY2ssIGZsYWdzKTsKLQkJCXJlcGx5LT5yYyA9IC1FVElNRTsKLQkJCWF0b21pY19pbmMoJnJlcGx5LT5yZWNlaXZlZCk7Ci0JCQl3YWtlX3VwKCZyZXBseS0+d2FpdF9xKTsKLQkJfQotCQljcHVfcmVsYXgoKTsKLQl9OworCisJLyogd2UgaGF2ZSBvbmx5IG9uZSBsb25nIHJ1bm5pbmcgaXBhc3Npc3QsIHNpbmNlIHdlIGNhbiBlbnN1cmUKKwkgICBwcm9jZXNzIGNvbnRleHQgb2YgdGhpcyBjb21tYW5kIHdlIGNhbiBzbGVlcCAqLworCWNtZCA9IChzdHJ1Y3QgcWV0aF9pcGFfY21kICopKGlvYi0+ZGF0YStJUEFfUERVX0hFQURFUl9TSVpFKTsKKwlpZiAoKGNtZC0+aGRyLmNvbW1hbmQgPT0gSVBBX0NNRF9TRVRJUCkgJiYKKwkgICAgKGNtZC0+aGRyLnByb3RfdmVyc2lvbiA9PSBRRVRIX1BST1RfSVBWNCkpIHsKKwkJaWYgKCF3YWl0X2V2ZW50X3RpbWVvdXQocmVwbHktPndhaXRfcSwKKwkJICAgIGF0b21pY19yZWFkKCZyZXBseS0+cmVjZWl2ZWQpLCB0aW1lb3V0KSkKKwkJCWdvdG8gdGltZV9lcnI7CisJfSBlbHNlIHsKKwkJd2hpbGUgKCFhdG9taWNfcmVhZCgmcmVwbHktPnJlY2VpdmVkKSkgeworCQkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgdGltZW91dCkpCisJCQkJZ290byB0aW1lX2VycjsKKwkJCWNwdV9yZWxheCgpOworCQl9OworCX0KKworCXJjID0gcmVwbHktPnJjOworCXFldGhfcHV0X3JlcGx5KHJlcGx5KTsKKwlyZXR1cm4gcmM7CisKK3RpbWVfZXJyOgorCXNwaW5fbG9ja19pcnFzYXZlKCZyZXBseS0+Y2FyZC0+bG9jaywgZmxhZ3MpOworCWxpc3RfZGVsX2luaXQoJnJlcGx5LT5saXN0KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyZXBseS0+Y2FyZC0+bG9jaywgZmxhZ3MpOworCXJlcGx5LT5yYyA9IC1FVElNRTsKKwlhdG9taWNfaW5jKCZyZXBseS0+cmVjZWl2ZWQpOworCXdha2VfdXAoJnJlcGx5LT53YWl0X3EpOwogCXJjID0gcmVwbHktPnJjOwogCXFldGhfcHV0X3JlcGx5KHJlcGx5KTsKIAlyZXR1cm4gcmM7CkBAIC0yMjUwLDcgKzIyNzcsOCBAQAogCQl9CiAJCS8qIGZhbGx0aHJvdWdoICovCiAJY2FzZSBRRVRIX0NBUkRfVFlQRV9JUUQ6Ci0JCWlmIChjYXJkLT5pbmZvLmd1ZXN0bGFuKSB7CisJCWlmICgoY2FyZC0+aW5mby5ndWVzdGxhbikgfHwKKwkJICAgIChjYXJkLT5pbmZvLm1jbF9sZXZlbFswXSAmIDB4ODApKSB7CiAJCQljYXJkLT5pbmZvLm1jbF9sZXZlbFswXSA9IChjaGFyKSBfZWJjYXNjWyhfX3U4KQogCQkJCWNhcmQtPmluZm8ubWNsX2xldmVsWzBdXTsKIAkJCWNhcmQtPmluZm8ubWNsX2xldmVsWzFdID0gKGNoYXIpIF9lYmNhc2NbKF9fdTgpCkBAIC00NDk2LDcgKzQ1MjQsNyBAQAogCQkJCSZkcml2ZXJfYXR0cl9ncm91cCk7CiAJaWYgKHJjKQogCQlnb3RvIGRyaXZlcl9lcnI7Ci0JcWV0aF9jb3JlX3Jvb3RfZGV2ID0gczM5MF9yb290X2Rldl9yZWdpc3RlcigicWV0aCIpOworCXFldGhfY29yZV9yb290X2RldiA9IHJvb3RfZGV2aWNlX3JlZ2lzdGVyKCJxZXRoIik7CiAJcmMgPSBJU19FUlIocWV0aF9jb3JlX3Jvb3RfZGV2KSA/IFBUUl9FUlIocWV0aF9jb3JlX3Jvb3RfZGV2KSA6IDA7CiAJaWYgKHJjKQogCQlnb3RvIHJlZ2lzdGVyX2VycjsKQEAgLTQ1MTAsNyArNDUzOCw3IEBACiAKIAlyZXR1cm4gMDsKIHNsYWJfZXJyOgotCXMzOTBfcm9vdF9kZXZfdW5yZWdpc3RlcihxZXRoX2NvcmVfcm9vdF9kZXYpOworCXJvb3RfZGV2aWNlX3VucmVnaXN0ZXIocWV0aF9jb3JlX3Jvb3RfZGV2KTsKIHJlZ2lzdGVyX2VycjoKIAlkcml2ZXJfcmVtb3ZlX2ZpbGUoJnFldGhfY29yZV9jY3dncm91cF9kcml2ZXIuZHJpdmVyLAogCQkJICAgJmRyaXZlcl9hdHRyX2dyb3VwKTsKQEAgLTQ1MjgsNyArNDU1Niw3IEBACiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBxZXRoX2NvcmVfZXhpdCh2b2lkKQogewotCXMzOTBfcm9vdF9kZXZfdW5yZWdpc3RlcihxZXRoX2NvcmVfcm9vdF9kZXYpOworCXJvb3RfZGV2aWNlX3VucmVnaXN0ZXIocWV0aF9jb3JlX3Jvb3RfZGV2KTsKIAlkcml2ZXJfcmVtb3ZlX2ZpbGUoJnFldGhfY29yZV9jY3dncm91cF9kcml2ZXIuZHJpdmVyLAogCQkJICAgJmRyaXZlcl9hdHRyX2dyb3VwKTsKIAljY3dncm91cF9kcml2ZXJfdW5yZWdpc3RlcigmcWV0aF9jb3JlX2Njd2dyb3VwX2RyaXZlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvbmV0L3FldGhfbDJfbWFpbi5jIGIvZHJpdmVycy9zMzkwL25ldC9xZXRoX2wyX21haW4uYwppbmRleCAyYzQ4NTkxLi5jNGYxYjA0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvbmV0L3FldGhfbDJfbWFpbi5jCisrKyBiL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9sMl9tYWluLmMKQEAgLTIwLDggKzIwLDYgQEAKICNpbmNsdWRlIDxsaW51eC9taWkuaD4KICNpbmNsdWRlIDxsaW51eC9pcC5oPgogCi0jaW5jbHVkZSA8YXNtL3MzOTBfcmRldi5oPgotCiAjaW5jbHVkZSAicWV0aF9jb3JlLmgiCiAjaW5jbHVkZSAicWV0aF9jb3JlX29mZmwuaCIKIApAQCAtOTE4LDYgKzkxNiwyMSBAQAogCS5nZXRfZHJ2aW5mbyA9IHFldGhfY29yZV9nZXRfZHJ2aW5mbywKIH07CiAKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgcWV0aF9sMl9uZXRkZXZfb3BzID0geworCS5uZG9fb3BlbgkJPSBxZXRoX2wyX29wZW4sCisJLm5kb19zdG9wCQk9IHFldGhfbDJfc3RvcCwKKwkubmRvX2dldF9zdGF0cwkJPSBxZXRoX2dldF9zdGF0cywKKwkubmRvX3N0YXJ0X3htaXQJCT0gcWV0aF9sMl9oYXJkX3N0YXJ0X3htaXQsCisJLm5kb192YWxpZGF0ZV9hZGRyCT0gZXRoX3ZhbGlkYXRlX2FkZHIsCisJLm5kb19zZXRfbXVsdGljYXN0X2xpc3QgPSBxZXRoX2wyX3NldF9tdWx0aWNhc3RfbGlzdCwKKwkubmRvX2RvX2lvY3RsCSAgIAk9IHFldGhfbDJfZG9faW9jdGwsCisJLm5kb19zZXRfbWFjX2FkZHJlc3MgICAgPSBxZXRoX2wyX3NldF9tYWNfYWRkcmVzcywKKwkubmRvX2NoYW5nZV9tdHUJICAgCT0gcWV0aF9jaGFuZ2VfbXR1LAorCS5uZG9fdmxhbl9yeF9hZGRfdmlkCT0gcWV0aF9sMl92bGFuX3J4X2FkZF92aWQsCisJLm5kb192bGFuX3J4X2tpbGxfdmlkICAgPSBxZXRoX2wyX3ZsYW5fcnhfa2lsbF92aWQsCisJLm5kb190eF90aW1lb3V0CSAgIAk9IHFldGhfdHhfdGltZW91dCwKK307CisKIHN0YXRpYyBpbnQgcWV0aF9sMl9zZXR1cF9uZXRkZXYoc3RydWN0IHFldGhfY2FyZCAqY2FyZCkKIHsKIAlzd2l0Y2ggKGNhcmQtPmluZm8udHlwZSkgewpAQCAtOTM5LDE5ICs5NTIsOSBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAogCWNhcmQtPmRldi0+bWxfcHJpdiA9IGNhcmQ7Ci0JY2FyZC0+ZGV2LT50eF90aW1lb3V0ID0gJnFldGhfdHhfdGltZW91dDsKIAljYXJkLT5kZXYtPndhdGNoZG9nX3RpbWVvID0gUUVUSF9UWF9USU1FT1VUOwotCWNhcmQtPmRldi0+b3BlbiA9IHFldGhfbDJfb3BlbjsKLQljYXJkLT5kZXYtPnN0b3AgPSBxZXRoX2wyX3N0b3A7Ci0JY2FyZC0+ZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBxZXRoX2wyX2hhcmRfc3RhcnRfeG1pdDsKLQljYXJkLT5kZXYtPmRvX2lvY3RsID0gcWV0aF9sMl9kb19pb2N0bDsKLQljYXJkLT5kZXYtPmdldF9zdGF0cyA9IHFldGhfZ2V0X3N0YXRzOwotCWNhcmQtPmRldi0+Y2hhbmdlX210dSA9IHFldGhfY2hhbmdlX210dTsKLQljYXJkLT5kZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9IHFldGhfbDJfc2V0X211bHRpY2FzdF9saXN0OwotCWNhcmQtPmRldi0+dmxhbl9yeF9raWxsX3ZpZCA9IHFldGhfbDJfdmxhbl9yeF9raWxsX3ZpZDsKLQljYXJkLT5kZXYtPnZsYW5fcnhfYWRkX3ZpZCA9IHFldGhfbDJfdmxhbl9yeF9hZGRfdmlkOwotCWNhcmQtPmRldi0+c2V0X21hY19hZGRyZXNzID0gcWV0aF9sMl9zZXRfbWFjX2FkZHJlc3M7CiAJY2FyZC0+ZGV2LT5tdHUgPSBjYXJkLT5pbmZvLmluaXRpYWxfbXR1OworCWNhcmQtPmRldi0+bmV0ZGV2X29wcyA9ICZxZXRoX2wyX25ldGRldl9vcHM7CiAJaWYgKGNhcmQtPmluZm8udHlwZSAhPSBRRVRIX0NBUkRfVFlQRV9PU04pCiAJCVNFVF9FVEhUT09MX09QUyhjYXJkLT5kZXYsICZxZXRoX2wyX2V0aHRvb2xfb3BzKTsKIAllbHNlCkBAIC0xMTI2LDkgKzExMjksMTEgQEAKIAkJZGV2X2luZm8oJmNhcmQtPmdkZXYtPmRldiwKIAkJCSJEZXZpY2Ugc3VjY2Vzc2Z1bGx5IHJlY292ZXJlZCFcbiIpOwogCWVsc2UgewotCQlydG5sX2xvY2soKTsKLQkJZGV2X2Nsb3NlKGNhcmQtPmRldik7Ci0JCXJ0bmxfdW5sb2NrKCk7CisJCWlmIChjYXJkLT5kZXYpIHsKKwkJCXJ0bmxfbG9jaygpOworCQkJZGV2X2Nsb3NlKGNhcmQtPmRldik7CisJCQlydG5sX3VubG9jaygpOworCQl9CiAJCWRldl93YXJuKCZjYXJkLT5nZGV2LT5kZXYsICJUaGUgcWV0aCBkZXZpY2UgZHJpdmVyICIKIAkJCSJmYWlsZWQgdG8gcmVjb3ZlciBhbiBlcnJvciBvbiB0aGUgZGV2aWNlXG4iKTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvbmV0L3FldGhfbDNfbWFpbi5jIGIvZHJpdmVycy9zMzkwL25ldC9xZXRoX2wzX21haW4uYwppbmRleCBjMGIzMGIyLi42OGQ2MjNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvbmV0L3FldGhfbDNfbWFpbi5jCisrKyBiL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9sM19tYWluLmMKQEAgLTI2LDggKzI2LDYgQEAKICNpbmNsdWRlIDxuZXQvaXAuaD4KICNpbmNsdWRlIDxuZXQvYXJwLmg+CiAKLSNpbmNsdWRlIDxhc20vczM5MF9yZGV2Lmg+Ci0KICNpbmNsdWRlICJxZXRoX2wzLmgiCiAjaW5jbHVkZSAicWV0aF9jb3JlX29mZmwuaCIKIApAQCAtMTA0Nyw3ICsxMDQ1LDcgQEAKIAkJcmMgPSBxZXRoX3NldGFkcHBhcm1zX2NoYW5nZV9tYWNhZGRyKGNhcmQpOwogCQlpZiAocmMpCiAJCQlkZXZfd2FybigmY2FyZC0+Z2Rldi0+ZGV2LCAiUmVhZGluZyB0aGUgYWRhcHRlciBNQUMiCi0JCQkJIiBhZGRyZXNzIGZhaWxlZFxuIiwgcmMpOworCQkJCSIgYWRkcmVzcyBmYWlsZWRcbiIpOwogCX0KIAogCWlmICgoY2FyZC0+aW5mby5saW5rX3R5cGUgPT0gUUVUSF9MSU5LX1RZUEVfSFNUUikgfHwKQEAgLTEyMDcsMTIgKzEyMDUsOSBAQAogCiAJUUVUSF9EQkZfVEVYVChUUkFDRSwgMywgInN0c3JjbWFjIik7CiAKLQlpZiAoIWNhcmQtPm9wdGlvbnMuZmFrZV9sbCkKLQkJcmV0dXJuIC1FT1BOT1RTVVBQOwotCiAJaWYgKCFxZXRoX2lzX3N1cHBvcnRlZChjYXJkLCBJUEFfU09VUkNFX01BQykpIHsKIAkJZGV2X2luZm8oJmNhcmQtPmdkZXYtPmRldiwKLQkJCSJJbmJvdW5kIHNvdXJjZSBhZGRyZXNzIG5vdCBzdXBwb3J0ZWQgb24gJXNcbiIsCisJCQkiSW5ib3VuZCBzb3VyY2UgTUFDLWFkZHJlc3Mgbm90IHN1cHBvcnRlZCBvbiAlc1xuIiwKIAkJCVFFVEhfQ0FSRF9JRk5BTUUoY2FyZCkpOwogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAJfQpAQCAtMTIyMSw3ICsxMjE2LDcgQEAKIAkJCQkJICBJUEFfQ01EX0FTU19TVEFSVCwgMCk7CiAJaWYgKHJjKQogCQlkZXZfd2FybigmY2FyZC0+Z2Rldi0+ZGV2LAotCQkJIlN0YXJ0aW5nIHByb3h5IEFSUCBzdXBwb3J0IGZvciAlcyBmYWlsZWRcbiIsCisJCQkiU3RhcnRpbmcgc291cmNlIE1BQy1hZGRyZXNzIHN1cHBvcnQgZm9yICVzIGZhaWxlZFxuIiwKIAkJCVFFVEhfQ0FSRF9JRk5BTUUoY2FyZCkpOwogCXJldHVybiByYzsKIH0KQEAgLTE4MzQsMjggKzE4MjksNiBAQAogCiBzdGF0aWMgdm9pZCBxZXRoX2wzX3ZsYW5fcnhfYWRkX3ZpZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBzaG9ydCB2aWQpCiB7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKnZsYW5kZXY7Ci0Jc3RydWN0IHFldGhfY2FyZCAqY2FyZCA9IGRldi0+bWxfcHJpdjsKLQlzdHJ1Y3QgaW5fZGV2aWNlICppbl9kZXY7Ci0KLQlpZiAoY2FyZC0+aW5mby50eXBlID09IFFFVEhfQ0FSRF9UWVBFX0lRRCkKLQkJcmV0dXJuOwotCi0JdmxhbmRldiA9IHZsYW5fZ3JvdXBfZ2V0X2RldmljZShjYXJkLT52bGFuZ3JwLCB2aWQpOwotCXZsYW5kZXYtPm5laWdoX3NldHVwID0gcWV0aF9sM19uZWlnaF9zZXR1cDsKLQotCWluX2RldiA9IGluX2Rldl9nZXQodmxhbmRldik7Ci0jaWZkZWYgQ09ORklHX1NZU0NUTAotCW5laWdoX3N5c2N0bF91bnJlZ2lzdGVyKGluX2Rldi0+YXJwX3Bhcm1zKTsKLSNlbmRpZgotCW5laWdoX3Bhcm1zX3JlbGVhc2UoJmFycF90YmwsIGluX2Rldi0+YXJwX3Bhcm1zKTsKLQotCWluX2Rldi0+YXJwX3Bhcm1zID0gbmVpZ2hfcGFybXNfYWxsb2ModmxhbmRldiwgJmFycF90YmwpOwotI2lmZGVmIENPTkZJR19TWVNDVEwKLQluZWlnaF9zeXNjdGxfcmVnaXN0ZXIodmxhbmRldiwgaW5fZGV2LT5hcnBfcGFybXMsIE5FVF9JUFY0LAotCQkJICAgICAgTkVUX0lQVjRfTkVJR0gsICJpcHY0IiwgTlVMTCwgTlVMTCk7Ci0jZW5kaWYKLQlpbl9kZXZfcHV0KGluX2Rldik7CiAJcmV0dXJuOwogfQogCkBAIC0xOTIxLDggKzE4OTQsMTMgQEAKIAkJCW1lbWNweSh0Z19hZGRyLCBjYXJkLT5kZXYtPmRldl9hZGRyLAogCQkJCWNhcmQtPmRldi0+YWRkcl9sZW4pOwogCQl9Ci0JCWNhcmQtPmRldi0+aGVhZGVyX29wcy0+Y3JlYXRlKHNrYiwgY2FyZC0+ZGV2LCBwcm90LCB0Z19hZGRyLAotCQkJCQkgICAgICAiRkFLRUxMIiwgY2FyZC0+ZGV2LT5hZGRyX2xlbik7CisJCWlmIChoZHItPmhkci5sMy5leHRfZmxhZ3MgJiBRRVRIX0hEUl9FWFRfU1JDX01BQ19BRERSKQorCQkJY2FyZC0+ZGV2LT5oZWFkZXJfb3BzLT5jcmVhdGUoc2tiLCBjYXJkLT5kZXYsIHByb3QsCisJCQkJdGdfYWRkciwgJmhkci0+aGRyLmwzLmRlc3RfYWRkclsyXSwKKwkJCQljYXJkLT5kZXYtPmFkZHJfbGVuKTsKKwkJZWxzZQorCQkJY2FyZC0+ZGV2LT5oZWFkZXJfb3BzLT5jcmVhdGUoc2tiLCBjYXJkLT5kZXYsIHByb3QsCisJCQkJdGdfYWRkciwgIkZBS0VMTCIsIGNhcmQtPmRldi0+YWRkcl9sZW4pOwogCX0KIAogI2lmZGVmIENPTkZJR19UUgpAQCAtMjA4MCw5ICsyMDU4LDExIEBACiAJCWlmIChyZWNvdmVyeV9tb2RlKQogCQkJcWV0aF9sM19zdG9wKGNhcmQtPmRldik7CiAJCWVsc2UgewotCQkJcnRubF9sb2NrKCk7Ci0JCQlkZXZfY2xvc2UoY2FyZC0+ZGV2KTsKLQkJCXJ0bmxfdW5sb2NrKCk7CisJCQlpZiAoY2FyZC0+ZGV2KSB7CisJCQkJcnRubF9sb2NrKCk7CisJCQkJZGV2X2Nsb3NlKGNhcmQtPmRldik7CisJCQkJcnRubF91bmxvY2soKTsKKwkJCX0KIAkJfQogCQlpZiAoIWNhcmQtPnVzZV9oYXJkX3N0b3ApIHsKIAkJCXJjID0gcWV0aF9zZW5kX3N0b3BsYW4oY2FyZCk7CkBAIC0yOTE0LDYgKzI4OTQsMjEgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX29wcyBxZXRoX2wzX25ldGRldl9vcHMgPSB7CisJLm5kb19vcGVuCQk9IHFldGhfbDNfb3BlbiwKKwkubmRvX3N0b3AJCT0gcWV0aF9sM19zdG9wLAorCS5uZG9fZ2V0X3N0YXRzCQk9IHFldGhfZ2V0X3N0YXRzLAorCS5uZG9fc3RhcnRfeG1pdAkJPSBxZXRoX2wzX2hhcmRfc3RhcnRfeG1pdCwKKwkubmRvX3ZhbGlkYXRlX2FkZHIJPSBldGhfdmFsaWRhdGVfYWRkciwKKwkubmRvX3NldF9tdWx0aWNhc3RfbGlzdCA9IHFldGhfbDNfc2V0X211bHRpY2FzdF9saXN0LAorCS5uZG9fZG9faW9jdGwJICAgCT0gcWV0aF9sM19kb19pb2N0bCwKKwkubmRvX2NoYW5nZV9tdHUJICAgCT0gcWV0aF9jaGFuZ2VfbXR1LAorCS5uZG9fdmxhbl9yeF9yZWdpc3Rlcgk9IHFldGhfbDNfdmxhbl9yeF9yZWdpc3RlciwKKwkubmRvX3ZsYW5fcnhfYWRkX3ZpZAk9IHFldGhfbDNfdmxhbl9yeF9hZGRfdmlkLAorCS5uZG9fdmxhbl9yeF9raWxsX3ZpZCAgID0gcWV0aF9sM192bGFuX3J4X2tpbGxfdmlkLAorCS5uZG9fdHhfdGltZW91dAkgICAJPSBxZXRoX3R4X3RpbWVvdXQsCit9OworCiBzdGF0aWMgaW50IHFldGhfbDNfc2V0dXBfbmV0ZGV2KHN0cnVjdCBxZXRoX2NhcmQgKmNhcmQpCiB7CiAJaWYgKGNhcmQtPmluZm8udHlwZSA9PSBRRVRIX0NBUkRfVFlQRV9PU0FFKSB7CkBAIC0yOTI4LDcgKzI5MjMsOCBAQAogCQkJY2FyZC0+ZGV2ID0gYWxsb2NfZXRoZXJkZXYoMCk7CiAJCQlpZiAoIWNhcmQtPmRldikKIAkJCQlyZXR1cm4gLUVOT0RFVjsKLQkJCWNhcmQtPmRldi0+bmVpZ2hfc2V0dXAgPSBxZXRoX2wzX25laWdoX3NldHVwOworCQkJcWV0aF9sM19uZXRkZXZfb3BzLm5kb19uZWlnaF9zZXR1cCA9CisJCQkJcWV0aF9sM19uZWlnaF9zZXR1cDsKIAogCQkJLypJUHY2IGFkZHJlc3MgYXV0b2NvbmZpZ3VyYXRpb24gc3R1ZmYqLwogCQkJcWV0aF9sM19nZXRfdW5pcXVlX2lkKGNhcmQpOwpAQCAtMjk0NSwyMSArMjk0MSwxMCBAQAogCX0gZWxzZQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCWNhcmQtPmRldi0+aGFyZF9zdGFydF94bWl0ID0gcWV0aF9sM19oYXJkX3N0YXJ0X3htaXQ7CiAJY2FyZC0+ZGV2LT5tbF9wcml2ID0gY2FyZDsKLQljYXJkLT5kZXYtPnR4X3RpbWVvdXQgPSAmcWV0aF90eF90aW1lb3V0OwogCWNhcmQtPmRldi0+d2F0Y2hkb2dfdGltZW8gPSBRRVRIX1RYX1RJTUVPVVQ7Ci0JY2FyZC0+ZGV2LT5vcGVuID0gcWV0aF9sM19vcGVuOwotCWNhcmQtPmRldi0+c3RvcCA9IHFldGhfbDNfc3RvcDsKLQljYXJkLT5kZXYtPmRvX2lvY3RsID0gcWV0aF9sM19kb19pb2N0bDsKLQljYXJkLT5kZXYtPmdldF9zdGF0cyA9IHFldGhfZ2V0X3N0YXRzOwotCWNhcmQtPmRldi0+Y2hhbmdlX210dSA9IHFldGhfY2hhbmdlX210dTsKLQljYXJkLT5kZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9IHFldGhfbDNfc2V0X211bHRpY2FzdF9saXN0OwotCWNhcmQtPmRldi0+dmxhbl9yeF9yZWdpc3RlciA9IHFldGhfbDNfdmxhbl9yeF9yZWdpc3RlcjsKLQljYXJkLT5kZXYtPnZsYW5fcnhfYWRkX3ZpZCA9IHFldGhfbDNfdmxhbl9yeF9hZGRfdmlkOwotCWNhcmQtPmRldi0+dmxhbl9yeF9raWxsX3ZpZCA9IHFldGhfbDNfdmxhbl9yeF9raWxsX3ZpZDsKIAljYXJkLT5kZXYtPm10dSA9IGNhcmQtPmluZm8uaW5pdGlhbF9tdHU7Ci0JY2FyZC0+ZGV2LT5zZXRfbWFjX2FkZHJlc3MgPSBOVUxMOworCWNhcmQtPmRldi0+bmV0ZGV2X29wcyA9ICZxZXRoX2wzX25ldGRldl9vcHM7CiAJU0VUX0VUSFRPT0xfT1BTKGNhcmQtPmRldiwgJnFldGhfbDNfZXRodG9vbF9vcHMpOwogCWNhcmQtPmRldi0+ZmVhdHVyZXMgfD0JTkVUSUZfRl9IV19WTEFOX1RYIHwKIAkJCQlORVRJRl9GX0hXX1ZMQU5fUlggfApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL3MzOTBfcmRldi5jIGIvZHJpdmVycy9zMzkwL3MzOTBfcmRldi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDM3MWMwLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvczM5MC9zMzkwX3JkZXYuYworKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qCi0gKiAgZHJpdmVycy9zMzkwL3MzOTBfcmRldi5jCi0gKiAgczM5MCByb290IGRldmljZQotICoKLSAqICAgIENvcHlyaWdodCAoQykgMjAwMiwgMjAwNSBJQk0gRGV1dHNjaGxhbmQgRW50d2lja2x1bmcgR21iSCwKLSAqCQkJIElCTSBDb3Jwb3JhdGlvbgotICogICAgQXV0aG9yKHMpOiBDb3JuZWxpYSBIdWNrIChjb3JuZWxpYS5odWNrQGRlLmlibS5jb20pCi0gKgkJICBDYXJzdGVuIE90dGUgIChjb3R0ZUBkZS5pYm0uY29tKQotICovCi0KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvZXJyLmg+Ci0jaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+Ci0jaW5jbHVkZSA8YXNtL3MzOTBfcmRldi5oPgotCi1zdGF0aWMgdm9pZAotczM5MF9yb290X2Rldl9yZWxlYXNlKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlrZnJlZShkZXYpOwotfQotCi1zdHJ1Y3QgZGV2aWNlICoKLXMzOTBfcm9vdF9kZXZfcmVnaXN0ZXIoY29uc3QgY2hhciAqbmFtZSkKLXsKLQlzdHJ1Y3QgZGV2aWNlICpkZXY7Ci0JaW50IHJldDsKLQotCWlmICghc3RybGVuKG5hbWUpKQotCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKLQlkZXYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZGV2aWNlKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFkZXYpCi0JCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwotCWRldl9zZXRfbmFtZShkZXYsIG5hbWUpOwotCWRldi0+cmVsZWFzZSA9IHMzOTBfcm9vdF9kZXZfcmVsZWFzZTsKLQlyZXQgPSBkZXZpY2VfcmVnaXN0ZXIoZGV2KTsKLQlpZiAocmV0KSB7Ci0JCWtmcmVlKGRldik7Ci0JCXJldHVybiBFUlJfUFRSKHJldCk7Ci0JfQotCXJldHVybiBkZXY7Ci19Ci0KLXZvaWQKLXMzOTBfcm9vdF9kZXZfdW5yZWdpc3RlcihzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0JaWYgKGRldikKLQkJZGV2aWNlX3VucmVnaXN0ZXIoZGV2KTsKLX0KLQotRVhQT1JUX1NZTUJPTChzMzkwX3Jvb3RfZGV2X3JlZ2lzdGVyKTsKLUVYUE9SVF9TWU1CT0woczM5MF9yb290X2Rldl91bnJlZ2lzdGVyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2J1cy9jaGFyL2Rpc3BsYXk3c2VnLmMgYi9kcml2ZXJzL3NidXMvY2hhci9kaXNwbGF5N3NlZy5jCmluZGV4IDI1NTBhZjQuLjQ0MzE1NzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2J1cy9jaGFyL2Rpc3BsYXk3c2VnLmMKKysrIGIvZHJpdmVycy9zYnVzL2NoYXIvZGlzcGxheTdzZWcuYwpAQCAtMjE0LDcgKzIxNCw3IEBACiAKIAl3cml0ZWIocmVncywgIHAtPnJlZ3MpOwogCi0JcHJpbnRrKEtFUk5fSU5GTyBQRlggIjctU2VnbWVudCBEaXNwbGF5JXMgYXQgWyVzOjB4JWx4XSAlc1xuIiwgCisJcHJpbnRrKEtFUk5fSU5GTyBQRlggIjctU2VnbWVudCBEaXNwbGF5JXMgYXQgWyVzOjB4JWxseF0gJXNcbiIsCiAJICAgICAgIG9wLT5ub2RlLT5mdWxsX25hbWUsCiAJICAgICAgIChyZWdzICYgRDdTX0ZMSVApID8gIiAoRkxJUFBFRCkiIDogIiIsCiAJICAgICAgIG9wLT5yZXNvdXJjZVswXS5zdGFydCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9LY29uZmlnIGIvZHJpdmVycy9zY3NpL0tjb25maWcKaW5kZXggYjczMjI5Ny4uMjU2YzdiZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL0tjb25maWcKKysrIGIvZHJpdmVycy9zY3NpL0tjb25maWcKQEAgLTg4NCw2ICs4ODQsNyBAQAogCXRyaXN0YXRlICJJQk0gVmlydHVhbCBTQ1NJIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBQUENfUFNFUklFUyB8fCBQUENfSVNFUklFUwogCXNlbGVjdCBTQ1NJX1NSUF9BVFRSUworCXNlbGVjdCBWSU9QQVRIIGlmIFBQQ19JU0VSSUVTCiAJaGVscAogCSAgVGhpcyBpcyB0aGUgSUJNIFBPV0VSIFZpcnR1YWwgU0NTSSBDbGllbnQKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL05DUl9ENzAwLmMgYi9kcml2ZXJzL3Njc2kvTkNSX0Q3MDAuYwppbmRleCA5ZTY0YjIxLi5jODg5ZDg0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvTkNSX0Q3MDAuYworKysgYi9kcml2ZXJzL3Njc2kvTkNSX0Q3MDAuYwpAQCAtMzE4LDcgKzMxOCw3IEBACiAJCXJldHVybiAtRU5PTUVNOwogCiAJcC0+ZGV2ID0gZGV2OwotCXNucHJpbnRmKHAtPm5hbWUsIHNpemVvZihwLT5uYW1lKSwgIkQ3MDAoJXMpIiwgZGV2LT5idXNfaWQpOworCXNucHJpbnRmKHAtPm5hbWUsIHNpemVvZihwLT5uYW1lKSwgIkQ3MDAoJXMpIiwgZGV2X25hbWUoZGV2KSk7CiAJaWYgKHJlcXVlc3RfaXJxKGlycSwgTkNSX0Q3MDBfaW50ciwgSVJRRl9TSEFSRUQsIHAtPm5hbWUsIHApKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiRDcwMDogcmVxdWVzdF9pcnEgZmFpbGVkXG4iKTsKIAkJa2ZyZWUocCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYTEwMHUydy5jIGIvZHJpdmVycy9zY3NpL2ExMDB1MncuYwppbmRleCAzYzI5OGM3Li45NjQ3NjlmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYTEwMHUydy5jCisrKyBiL2RyaXZlcnMvc2NzaS9hMTAwdTJ3LmMKQEAgLTYzMyw3ICs2MzMsNyBAQAogCQlyZXR1cm4gRkFJTEVEOwogCX0KIAotCS8qIFJlc2V0IGRldmljZSBpcyBoYW5kbGVkIGJ5IHRoZSBmaXJtYXJlLCB3ZSBmaWxsIGluIGFuIFNDQiBhbmQKKwkvKiBSZXNldCBkZXZpY2UgaXMgaGFuZGxlZCBieSB0aGUgZmlybXdhcmUsIHdlIGZpbGwgaW4gYW4gU0NCIGFuZAogCSAgIGZpcmUgaXQgYXQgdGhlIGNvbnRyb2xsZXIsIGl0IGRvZXMgdGhlIHJlc3QgKi8KIAlzY2ItPm9wY29kZSA9IE9SQ19CVVNERVZSU1Q7CiAJc2NiLT50YXJnZXQgPSB0YXJnZXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYTIwOTEuYyBiL2RyaXZlcnMvc2NzaS9hMjA5MS5jCmluZGV4IDA3ZDU3MmYuLjM3ZGQ0NzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9hMjA5MS5jCisrKyBiL2RyaXZlcnMvc2NzaS9hMjA5MS5jCkBAIC0xNjksMTAgKzE2OSw4IEBACiAJICAgIGNvbnRpbnVlOwogCiAJaW5zdGFuY2UgPSBzY3NpX3JlZ2lzdGVyICh0cG50LCBzaXplb2YgKHN0cnVjdCBXRDMzQzkzX2hvc3RkYXRhKSk7Ci0JaWYgKGluc3RhbmNlID09IE5VTEwpIHsKLQkgICAgcmVsZWFzZV9tZW1fcmVnaW9uKGFkZHJlc3MsIDI1Nik7Ci0JICAgIGNvbnRpbnVlOwotCX0KKwlpZiAoaW5zdGFuY2UgPT0gTlVMTCkKKwkgICAgZ290byByZWxlYXNlOwogCWluc3RhbmNlLT5iYXNlID0gWlRXT19WQUREUihhZGRyZXNzKTsKIAlpbnN0YW5jZS0+aXJxID0gSVJRX0FNSUdBX1BPUlRTOwogCWluc3RhbmNlLT51bmlxdWVfaWQgPSB6LT5zbG90YWRkcjsKQEAgLTE4MywxMCArMTgxLDE4IEBACiAJSERBVEEoaW5zdGFuY2UpLT5mYXN0ID0gMDsKIAlIREFUQShpbnN0YW5jZSktPmRtYV9tb2RlID0gQ1RSTF9ETUE7CiAJd2QzM2M5M19pbml0KGluc3RhbmNlLCByZWdzLCBkbWFfc2V0dXAsIGRtYV9zdG9wLCBXRDMzQzkzX0ZTXzhfMTApOwotCXJlcXVlc3RfaXJxKElSUV9BTUlHQV9QT1JUUywgYTIwOTFfaW50ciwgSVJRRl9TSEFSRUQsICJBMjA5MSBTQ1NJIiwKLQkJICAgIGluc3RhbmNlKTsKKwlpZiAocmVxdWVzdF9pcnEoSVJRX0FNSUdBX1BPUlRTLCBhMjA5MV9pbnRyLCBJUlFGX1NIQVJFRCwgIkEyMDkxIFNDU0kiLAorCQkJaW5zdGFuY2UpKQorCSAgICBnb3RvIHVucmVnaXN0ZXI7CiAJRE1BKGluc3RhbmNlKS0+Q05UUiA9IENOVFJfUERNRCB8IENOVFJfSU5URU47CiAJbnVtX2EyMDkxKys7CisJY29udGludWU7CisKK3VucmVnaXN0ZXI6CisJc2NzaV91bnJlZ2lzdGVyKGluc3RhbmNlKTsKKwl3ZDMzYzkzX3JlbGVhc2UoKTsKK3JlbGVhc2U6CisJcmVsZWFzZV9tZW1fcmVnaW9uKGFkZHJlc3MsIDI1Nik7CiAgICAgfQogCiAgICAgcmV0dXJuIG51bV9hMjA5MTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9hZHZhbnN5cy5jIGIvZHJpdmVycy9zY3NpL2FkdmFuc3lzLmMKaW5kZXggMmY2MDI3Mi4uNzUwN2Q4YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2FkdmFuc3lzLmMKKysrIGIvZHJpdmVycy9zY3NpL2FkdmFuc3lzLmMKQEAgLTI1MjcsNyArMjUyNyw3IEBACiB7CiAJc3RydWN0IGFzY19ib2FyZCAqYm9hcmRwID0gc2hvc3RfcHJpdihzKTsKIAotCXByaW50aygiU2NzaV9Ib3N0IGF0IGFkZHIgMHglcCwgZGV2aWNlICVzXG4iLCBzLCBib2FyZHAtPmRldi0+YnVzX2lkKTsKKwlwcmludGsoIlNjc2lfSG9zdCBhdCBhZGRyIDB4JXAsIGRldmljZSAlc1xuIiwgcywgZGV2X25hbWUoYm9hcmRwLT5kZXYpKTsKIAlwcmludGsoIiBob3N0X2J1c3kgJXUsIGhvc3Rfbm8gJWQsIGxhc3RfcmVzZXQgJWQsXG4iLAogCSAgICAgICBzLT5ob3N0X2J1c3ksIHMtPmhvc3Rfbm8sICh1bnNpZ25lZClzLT5sYXN0X3Jlc2V0KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FpYzk0eHgvYWljOTR4eF90bWYuYyBiL2RyaXZlcnMvc2NzaS9haWM5NHh4L2FpYzk0eHhfdG1mLmMKaW5kZXggZDQ2NDBlZi4uNzhlYjg2ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2FpYzk0eHgvYWljOTR4eF90bWYuYworKysgYi9kcml2ZXJzL3Njc2kvYWljOTR4eC9haWM5NHh4X3RtZi5jCkBAIC0xODksNyArMTg5LDcgQEAKIAlhc2RfY2xlYXJfbmV4dXNfSV9UKGRldiwgTkVYVVNfUEhBU0VfUFJFKTsKIAkvKiBzZW5kIGEgaGFyZCByZXNldCAqLwogCUFTRF9EUFJJTlRLKCJzZW5kaW5nICVzIHJlc2V0IHRvICVzXG4iLAotCQkgICAgcmVzZXRfdHlwZSA/ICJoYXJkIiA6ICJzb2Z0IiwgcGh5LT5kZXYuYnVzX2lkKTsKKwkJICAgIHJlc2V0X3R5cGUgPyAiaGFyZCIgOiAic29mdCIsIGRldl9uYW1lKCZwaHktPmRldikpOwogCXJlcyA9IHNhc19waHlfcmVzZXQocGh5LCByZXNldF90eXBlKTsKIAlpZiAocmVzID09IFRNRl9SRVNQX0ZVTkNfQ09NUExFVEUpIHsKIAkJLyogd2FpdCBmb3IgdGhlIG1heGltdW0gc2V0dGxlIHRpbWUgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9jeGdiM2kvY3hnYjNpX2RkcC5jIGIvZHJpdmVycy9zY3NpL2N4Z2IzaS9jeGdiM2lfZGRwLmMKaW5kZXggMWE0MWYwNC4uMDhmM2EwOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2N4Z2IzaS9jeGdiM2lfZGRwLmMKKysrIGIvZHJpdmVycy9zY3NpL2N4Z2IzaS9jeGdiM2lfZGRwLmMKQEAgLTExLDYgKzExLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvc2NhdHRlcmxpc3QuaD4KIAogLyogZnJvbSBjeGdiMyBMTEQgKi8KICNpbmNsdWRlICJjb21tb24uaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9ndnAxMS5jIGIvZHJpdmVycy9zY3NpL2d2cDExLmMKaW5kZXggY2E3MzYzNy4uNWQxYmY3ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2d2cDExLmMKKysrIGIvZHJpdmVycy9zY3NpL2d2cDExLmMKQEAgLTMyOSwxMiArMzI5LDE2IEBACiAJCSAgICAgKGVwYyAmIEdWUF9TQ1NJQ0xLTUFTSykgPyBXRDMzQzkzX0ZTXzhfMTAKIAkJCQkJICAgICA6IFdEMzNDOTNfRlNfMTJfMTUpOwogCi0JcmVxdWVzdF9pcnEoSVJRX0FNSUdBX1BPUlRTLCBndnAxMV9pbnRyLCBJUlFGX1NIQVJFRCwgIkdWUDExIFNDU0kiLAotCQkgICAgaW5zdGFuY2UpOworCWlmIChyZXF1ZXN0X2lycShJUlFfQU1JR0FfUE9SVFMsIGd2cDExX2ludHIsIElSUUZfU0hBUkVELCAiR1ZQMTEgU0NTSSIsCisJCQlpbnN0YW5jZSkpCisJCWdvdG8gdW5yZWdpc3RlcjsKIAlETUEoaW5zdGFuY2UpLT5DTlRSID0gR1ZQMTFfRE1BQ19JTlRfRU5BQkxFOwogCW51bV9ndnAxMSsrOwogCWNvbnRpbnVlOwogCit1bnJlZ2lzdGVyOgorCXNjc2lfdW5yZWdpc3RlcihpbnN0YW5jZSk7CisJd2QzM2M5M19yZWxlYXNlKCk7CiByZWxlYXNlOgogCXJlbGVhc2VfbWVtX3JlZ2lvbihhZGRyZXNzLCAyNTYpOwogICAgIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9ob3N0cy5jIGIvZHJpdmVycy9zY3NpL2hvc3RzLmMKaW5kZXggM2ZkYmIxMy4uYWE2NzBhMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2hvc3RzLmMKKysrIGIvZHJpdmVycy9zY3NpL2hvc3RzLmMKQEAgLTM4OCw4ICszODgsNyBAQAogCQlzaG9zdC0+ZG1hX2JvdW5kYXJ5ID0gMHhmZmZmZmZmZjsKIAogCWRldmljZV9pbml0aWFsaXplKCZzaG9zdC0+c2hvc3RfZ2VuZGV2KTsKLQlzbnByaW50ZihzaG9zdC0+c2hvc3RfZ2VuZGV2LmJ1c19pZCwgQlVTX0lEX1NJWkUsICJob3N0JWQiLAotCQlzaG9zdC0+aG9zdF9ubyk7CisJZGV2X3NldF9uYW1lKCZzaG9zdC0+c2hvc3RfZ2VuZGV2LCAiaG9zdCVkIiwgc2hvc3QtPmhvc3Rfbm8pOwogI2lmbmRlZiBDT05GSUdfU1lTRlNfREVQUkVDQVRFRAogCXNob3N0LT5zaG9zdF9nZW5kZXYuYnVzID0gJnNjc2lfYnVzX3R5cGU7CiAjZW5kaWYKQEAgLTM5OCw4ICszOTcsNyBAQAogCWRldmljZV9pbml0aWFsaXplKCZzaG9zdC0+c2hvc3RfZGV2KTsKIAlzaG9zdC0+c2hvc3RfZGV2LnBhcmVudCA9ICZzaG9zdC0+c2hvc3RfZ2VuZGV2OwogCXNob3N0LT5zaG9zdF9kZXYuY2xhc3MgPSAmc2hvc3RfY2xhc3M7Ci0Jc25wcmludGYoc2hvc3QtPnNob3N0X2Rldi5idXNfaWQsIEJVU19JRF9TSVpFLCAiaG9zdCVkIiwKLQkJIHNob3N0LT5ob3N0X25vKTsKKwlkZXZfc2V0X25hbWUoJnNob3N0LT5zaG9zdF9kZXYsICJob3N0JWQiLCBzaG9zdC0+aG9zdF9ubyk7CiAJc2hvc3QtPnNob3N0X2Rldi5ncm91cHMgPSBzY3NpX3N5c2ZzX3Nob3N0X2F0dHJfZ3JvdXBzOwogCiAJc2hvc3QtPmVoYW5kbGVyID0ga3RocmVhZF9ydW4oc2NzaV9lcnJvcl9oYW5kbGVyLCBzaG9zdCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9pYm12c2NzaS9pYm12ZmMuYyBiL2RyaXZlcnMvc2NzaS9pYm12c2NzaS9pYm12ZmMuYwppbmRleCA0NGYyMDJmLi5lZTA3MzliIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvaWJtdnNjc2kvaWJtdmZjLmMKKysrIGIvZHJpdmVycy9zY3NpL2libXZzY3NpL2libXZmYy5jCkBAIC0xMDEsNyArMTAxLDcgQEAKIAl7IElCTVZGQ19GQUJSSUNfTUFQUEVELCBJQk1WRkNfVU5BQkxFX1RPX0VTVEFCTElTSCwgRElEX0VSUk9SLCAxLCAxLCAidW5hYmxlIHRvIGVzdGFibGlzaCIgfSwKIAl7IElCTVZGQ19GQUJSSUNfTUFQUEVELCBJQk1WRkNfWFBPUlRfRkFVTFQsIERJRF9PSywgMSwgMCwgInRyYW5zcG9ydCBmYXVsdCIgfSwKIAl7IElCTVZGQ19GQUJSSUNfTUFQUEVELCBJQk1WRkNfQ01EX1RJTUVPVVQsIERJRF9USU1FX09VVCwgMSwgMSwgImNvbW1hbmQgdGltZW91dCIgfSwKLQl7IElCTVZGQ19GQUJSSUNfTUFQUEVELCBJQk1WRkNfRU5FVERPV04sIERJRF9OT19DT05ORUNULCAxLCAxLCAibmV0d29yayBkb3duIiB9LAorCXsgSUJNVkZDX0ZBQlJJQ19NQVBQRUQsIElCTVZGQ19FTkVURE9XTiwgRElEX1RSQU5TUE9SVF9ESVNSVVBURUQsIDEsIDEsICJuZXR3b3JrIGRvd24iIH0sCiAJeyBJQk1WRkNfRkFCUklDX01BUFBFRCwgSUJNVkZDX0hXX0ZBSUxVUkUsIERJRF9FUlJPUiwgMSwgMSwgImhhcmR3YXJlIGZhaWx1cmUiIH0sCiAJeyBJQk1WRkNfRkFCUklDX01BUFBFRCwgSUJNVkZDX0xJTktfRE9XTl9FUlIsIERJRF9SRVFVRVVFLCAwLCAwLCAibGluayBkb3duIiB9LAogCXsgSUJNVkZDX0ZBQlJJQ19NQVBQRUQsIElCTVZGQ19MSU5LX0RFQURfRVJSLCBESURfRVJST1IsIDAsIDAsICJsaW5rIGRlYWQiIH0sCkBAIC0xMTUsMTEgKzExNSwxMSBAQAogCiAJeyBJQk1WRkNfVklPU19GQUlMVVJFLCBJQk1WRkNfQ1JRX0ZBSUxVUkUsIERJRF9SRVFVRVVFLCAxLCAxLCAiQ1JRIGZhaWx1cmUiIH0sCiAJeyBJQk1WRkNfVklPU19GQUlMVVJFLCBJQk1WRkNfU1dfRkFJTFVSRSwgRElEX0VSUk9SLCAwLCAxLCAic29mdHdhcmUgZmFpbHVyZSIgfSwKLQl7IElCTVZGQ19WSU9TX0ZBSUxVUkUsIElCTVZGQ19JTlZBTElEX1BBUkFNRVRFUiwgRElEX0FCT1JULCAwLCAxLCAiaW52YWxpZCBwYXJhbWV0ZXIiIH0sCi0JeyBJQk1WRkNfVklPU19GQUlMVVJFLCBJQk1WRkNfTUlTU0lOR19QQVJBTUVURVIsIERJRF9BQk9SVCwgMCwgMSwgIm1pc3NpbmcgcGFyYW1ldGVyIiB9LAorCXsgSUJNVkZDX1ZJT1NfRkFJTFVSRSwgSUJNVkZDX0lOVkFMSURfUEFSQU1FVEVSLCBESURfRVJST1IsIDAsIDEsICJpbnZhbGlkIHBhcmFtZXRlciIgfSwKKwl7IElCTVZGQ19WSU9TX0ZBSUxVUkUsIElCTVZGQ19NSVNTSU5HX1BBUkFNRVRFUiwgRElEX0VSUk9SLCAwLCAxLCAibWlzc2luZyBwYXJhbWV0ZXIiIH0sCiAJeyBJQk1WRkNfVklPU19GQUlMVVJFLCBJQk1WRkNfSE9TVF9JT19CVVMsIERJRF9FUlJPUiwgMSwgMSwgImhvc3QgSS9PIGJ1cyBmYWlsdXJlIiB9LAotCXsgSUJNVkZDX1ZJT1NfRkFJTFVSRSwgSUJNVkZDX1RSQU5TX0NBTkNFTExFRCwgRElEX0FCT1JULCAwLCAxLCAidHJhbnNhY3Rpb24gY2FuY2VsbGVkIiB9LAotCXsgSUJNVkZDX1ZJT1NfRkFJTFVSRSwgSUJNVkZDX1RSQU5TX0NBTkNFTExFRF9JTVBMSUNJVCwgRElEX0FCT1JULCAwLCAxLCAidHJhbnNhY3Rpb24gY2FuY2VsbGVkIGltcGxpY2l0IiB9LAorCXsgSUJNVkZDX1ZJT1NfRkFJTFVSRSwgSUJNVkZDX1RSQU5TX0NBTkNFTExFRCwgRElEX0VSUk9SLCAwLCAxLCAidHJhbnNhY3Rpb24gY2FuY2VsbGVkIiB9LAorCXsgSUJNVkZDX1ZJT1NfRkFJTFVSRSwgSUJNVkZDX1RSQU5TX0NBTkNFTExFRF9JTVBMSUNJVCwgRElEX0VSUk9SLCAwLCAxLCAidHJhbnNhY3Rpb24gY2FuY2VsbGVkIGltcGxpY2l0IiB9LAogCXsgSUJNVkZDX1ZJT1NfRkFJTFVSRSwgSUJNVkZDX0lOU1VGRklDSUVOVF9SRVNPVVJDRSwgRElEX1JFUVVFVUUsIDEsIDEsICJpbnN1ZmZpY2llbnQgcmVzb3VyY2VzIiB9LAogCXsgSUJNVkZDX1ZJT1NfRkFJTFVSRSwgSUJNVkZDX1BMT0dJX1JFUVVJUkVELCBESURfRVJST1IsIDAsIDEsICJwb3J0IGxvZ2luIHJlcXVpcmVkIiB9LAogCXsgSUJNVkZDX1ZJT1NfRkFJTFVSRSwgSUJNVkZDX0NPTU1BTkRfRkFJTEVELCBESURfRVJST1IsIDEsIDEsICJjb21tYW5kIGZhaWxlZCIgfSwKQEAgLTExNDUsMTAgKzExNDUsMTAgQEAKIAlsb2dpbl9pbmZvLT5hc3luYy5sZW4gPSB2aG9zdC0+YXN5bmNfY3JxLnNpemUgKiBzaXplb2YoKnZob3N0LT5hc3luY19jcnEubXNncyk7CiAJc3RybmNweShsb2dpbl9pbmZvLT5wYXJ0aXRpb25fbmFtZSwgdmhvc3QtPnBhcnRpdGlvbl9uYW1lLCBJQk1WRkNfTUFYX05BTUUpOwogCXN0cm5jcHkobG9naW5faW5mby0+ZGV2aWNlX25hbWUsCi0JCXZob3N0LT5ob3N0LT5zaG9zdF9nZW5kZXYuYnVzX2lkLCBJQk1WRkNfTUFYX05BTUUpOworCQlkZXZfbmFtZSgmdmhvc3QtPmhvc3QtPnNob3N0X2dlbmRldiksIElCTVZGQ19NQVhfTkFNRSk7CiAKIAlsb2NhdGlvbiA9IG9mX2dldF9wcm9wZXJ0eShvZl9ub2RlLCAiaWJtLGxvYy1jb2RlIiwgTlVMTCk7Ci0JbG9jYXRpb24gPSBsb2NhdGlvbiA/IGxvY2F0aW9uIDogdmhvc3QtPmRldi0+YnVzX2lkOworCWxvY2F0aW9uID0gbG9jYXRpb24gPyBsb2NhdGlvbiA6IGRldl9uYW1lKHZob3N0LT5kZXYpOwogCXN0cm5jcHkobG9naW5faW5mby0+ZHJjX25hbWUsIGxvY2F0aW9uLCBJQk1WRkNfTUFYX05BTUUpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvaWJtdnNjc2kvaWJtdnNjc2kuYyBiL2RyaXZlcnMvc2NzaS9pYm12c2NzaS9pYm12c2NzaS5jCmluZGV4IDg2OGQzNWUuLjVjNTQxZjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9pYm12c2NzaS9pYm12c2NzaS5jCisrKyBiL2RyaXZlcnMvc2NzaS9pYm12c2NzaS9pYm12c2NzaS5jCkBAIC04OSw2ICs4OSw3IEBACiBzdGF0aWMgaW50IG1heF9jaGFubmVsID0gMzsKIHN0YXRpYyBpbnQgaW5pdF90aW1lb3V0ID0gNTsKIHN0YXRpYyBpbnQgbWF4X3JlcXVlc3RzID0gSUJNVlNDU0lfTUFYX1JFUVVFU1RTX0RFRkFVTFQ7CitzdGF0aWMgaW50IG1heF9ldmVudHMgPSBJQk1WU0NTSV9NQVhfUkVRVUVTVFNfREVGQVVMVCArIDI7CiAKIHN0YXRpYyBzdHJ1Y3Qgc2NzaV90cmFuc3BvcnRfdGVtcGxhdGUgKmlibXZzY3NpX3RyYW5zcG9ydF90ZW1wbGF0ZTsKIApAQCAtMTYzMyw3ICsxNjM0LDcgQEAKIHN0YXRpYyB1bnNpZ25lZCBsb25nIGlibXZzY3NpX2dldF9kZXNpcmVkX2RtYShzdHJ1Y3QgdmlvX2RldiAqdmRldikKIHsKIAkvKiBpdV9zdG9yYWdlIGRhdGEgYWxsb2NhdGVkIGluIGluaXRpYWxpemVfZXZlbnRfcG9vbCAqLwotCXVuc2lnbmVkIGxvbmcgZGVzaXJlZF9pbyA9IG1heF9yZXF1ZXN0cyAqIHNpemVvZih1bmlvbiB2aW9zcnBfaXUpOworCXVuc2lnbmVkIGxvbmcgZGVzaXJlZF9pbyA9IG1heF9ldmVudHMgKiBzaXplb2YodW5pb24gdmlvc3JwX2l1KTsKIAogCS8qIGFkZCBpbyBzcGFjZSBmb3Igc2cgZGF0YSAqLwogCWRlc2lyZWRfaW8gKz0gKElCTVZTQ1NJX01BWF9TRUNUT1JTX0RFRkFVTFQgKiA1MTIgKgpAQCAtMTY1Nyw3ICsxNjU4LDYgQEAKIAogCXZkZXYtPmRldi5kcml2ZXJfZGF0YSA9IE5VTEw7CiAKLQlkcml2ZXJfdGVtcGxhdGUuY2FuX3F1ZXVlID0gbWF4X3JlcXVlc3RzIC0gMjsKIAlob3N0ID0gc2NzaV9ob3N0X2FsbG9jKCZkcml2ZXJfdGVtcGxhdGUsIHNpemVvZigqaG9zdGRhdGEpKTsKIAlpZiAoIWhvc3QpIHsKIAkJZGV2X2VycigmdmRldi0+ZGV2LCAiY291bGRuJ3QgYWxsb2NhdGUgaG9zdCBkYXRhXG4iKTsKQEAgLTE2NzMsMTIgKzE2NzMsMTIgQEAKIAlhdG9taWNfc2V0KCZob3N0ZGF0YS0+cmVxdWVzdF9saW1pdCwgLTEpOwogCWhvc3RkYXRhLT5ob3N0LT5tYXhfc2VjdG9ycyA9IElCTVZTQ1NJX01BWF9TRUNUT1JTX0RFRkFVTFQ7CiAKLQlyYyA9IGlibXZzY3NpX29wcy0+aW5pdF9jcnFfcXVldWUoJmhvc3RkYXRhLT5xdWV1ZSwgaG9zdGRhdGEsIG1heF9yZXF1ZXN0cyk7CisJcmMgPSBpYm12c2NzaV9vcHMtPmluaXRfY3JxX3F1ZXVlKCZob3N0ZGF0YS0+cXVldWUsIGhvc3RkYXRhLCBtYXhfZXZlbnRzKTsKIAlpZiAocmMgIT0gMCAmJiByYyAhPSBIX1JFU09VUkNFKSB7CiAJCWRldl9lcnIoJnZkZXYtPmRldiwgImNvdWxkbid0IGluaXRpYWxpemUgY3JxLiByYz0lZFxuIiwgcmMpOwogCQlnb3RvIGluaXRfY3JxX2ZhaWxlZDsKIAl9Ci0JaWYgKGluaXRpYWxpemVfZXZlbnRfcG9vbCgmaG9zdGRhdGEtPnBvb2wsIG1heF9yZXF1ZXN0cywgaG9zdGRhdGEpICE9IDApIHsKKwlpZiAoaW5pdGlhbGl6ZV9ldmVudF9wb29sKCZob3N0ZGF0YS0+cG9vbCwgbWF4X2V2ZW50cywgaG9zdGRhdGEpICE9IDApIHsKIAkJZGV2X2VycigmdmRldi0+ZGV2LCAiY291bGRuJ3QgaW5pdGlhbGl6ZSBldmVudCBwb29sXG4iKTsKIAkJZ290byBpbml0X3Bvb2xfZmFpbGVkOwogCX0KQEAgLTE3MzAsNyArMTczMCw3IEBACiAgICAgICBhZGRfaG9zdF9mYWlsZWQ6CiAJcmVsZWFzZV9ldmVudF9wb29sKCZob3N0ZGF0YS0+cG9vbCwgaG9zdGRhdGEpOwogICAgICAgaW5pdF9wb29sX2ZhaWxlZDoKLQlpYm12c2NzaV9vcHMtPnJlbGVhc2VfY3JxX3F1ZXVlKCZob3N0ZGF0YS0+cXVldWUsIGhvc3RkYXRhLCBtYXhfcmVxdWVzdHMpOworCWlibXZzY3NpX29wcy0+cmVsZWFzZV9jcnFfcXVldWUoJmhvc3RkYXRhLT5xdWV1ZSwgaG9zdGRhdGEsIG1heF9ldmVudHMpOwogICAgICAgaW5pdF9jcnFfZmFpbGVkOgogCXNjc2lfaG9zdF9wdXQoaG9zdCk7CiAgICAgICBzY3NpX2hvc3RfYWxsb2NfZmFpbGVkOgpAQCAtMTc0Miw3ICsxNzQyLDcgQEAKIAlzdHJ1Y3QgaWJtdnNjc2lfaG9zdF9kYXRhICpob3N0ZGF0YSA9IHZkZXYtPmRldi5kcml2ZXJfZGF0YTsKIAlyZWxlYXNlX2V2ZW50X3Bvb2woJmhvc3RkYXRhLT5wb29sLCBob3N0ZGF0YSk7CiAJaWJtdnNjc2lfb3BzLT5yZWxlYXNlX2NycV9xdWV1ZSgmaG9zdGRhdGEtPnF1ZXVlLCBob3N0ZGF0YSwKLQkJCQkJbWF4X3JlcXVlc3RzKTsKKwkJCQkJbWF4X2V2ZW50cyk7CiAKIAlzcnBfcmVtb3ZlX2hvc3QoaG9zdGRhdGEtPmhvc3QpOwogCXNjc2lfcmVtb3ZlX2hvc3QoaG9zdGRhdGEtPmhvc3QpOwpAQCAtMTc3OSw2ICsxNzc5LDEwIEBACiB7CiAJaW50IHJldDsKIAorCS8qIEVuc3VyZSB3ZSBoYXZlIHR3byByZXF1ZXN0cyB0byBkbyBlcnJvciByZWNvdmVyeSAqLworCWRyaXZlcl90ZW1wbGF0ZS5jYW5fcXVldWUgPSBtYXhfcmVxdWVzdHM7CisJbWF4X2V2ZW50cyA9IG1heF9yZXF1ZXN0cyArIDI7CisKIAlpZiAoZmlybXdhcmVfaGFzX2ZlYXR1cmUoRldfRkVBVFVSRV9JU0VSSUVTKSkKIAkJaWJtdnNjc2lfb3BzID0gJmlzZXJpZXN2c2NzaV9vcHM7CiAJZWxzZSBpZiAoZmlybXdhcmVfaGFzX2ZlYXR1cmUoRldfRkVBVFVSRV9WSU8pKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2lwci5jIGIvZHJpdmVycy9zY3NpL2lwci5jCmluZGV4IDBlZGZiMWYuLjg0MWY0NjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9pcHIuYworKysgYi9kcml2ZXJzL3Njc2kvaXByLmMKQEAgLTIxODQsNyArMjE4NCw3IEBACiAJCXNpemVvZihzdHJ1Y3QgaXByX2R1bXBfZW50cnlfaGVhZGVyKTsKIAlkcml2ZXJfZHVtcC0+bG9jYXRpb25fZW50cnkuaGRyLmRhdGFfdHlwZSA9IElQUl9EVU1QX0RBVEFfVFlQRV9BU0NJSTsKIAlkcml2ZXJfZHVtcC0+bG9jYXRpb25fZW50cnkuaGRyLmlkID0gSVBSX0RVTVBfTE9DQVRJT05fSUQ7Ci0Jc3RyY3B5KGRyaXZlcl9kdW1wLT5sb2NhdGlvbl9lbnRyeS5sb2NhdGlvbiwgaW9hX2NmZy0+cGRldi0+ZGV2LmJ1c19pZCk7CisJc3RyY3B5KGRyaXZlcl9kdW1wLT5sb2NhdGlvbl9lbnRyeS5sb2NhdGlvbiwgZGV2X25hbWUoJmlvYV9jZmctPnBkZXYtPmRldikpOwogCWRyaXZlcl9kdW1wLT5oZHIubnVtX2VudHJpZXMrKzsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2lwci5oIGIvZHJpdmVycy9zY3NpL2lwci5oCmluZGV4IDU5NDU5MTQuLjhmODcyZjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9pcHIuaAorKysgYi9kcml2ZXJzL3Njc2kvaXByLmgKQEAgLTEyNzIsNyArMTI3Miw3IEBACiAKIHN0cnVjdCBpcHJfZHVtcF9sb2NhdGlvbl9lbnRyeSB7CiAJc3RydWN0IGlwcl9kdW1wX2VudHJ5X2hlYWRlciBoZHI7Ci0JdTggbG9jYXRpb25bQlVTX0lEX1NJWkVdOworCXU4IGxvY2F0aW9uWzIwXTsKIH1fX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAogc3RydWN0IGlwcl9kdW1wX3RyYWNlX2VudHJ5IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9sYXNpNzAwLmMgYi9kcml2ZXJzL3Njc2kvbGFzaTcwMC5jCmluZGV4IDMxMjY4MjQuLjRhNGU2OTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9sYXNpNzAwLmMKKysrIGIvZHJpdmVycy9zY3NpL2xhc2k3MDAuYwpAQCAtMTAzLDggKzEwMyw3IEBACiAKIAlob3N0ZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKCpob3N0ZGF0YSksIEdGUF9LRVJORUwpOwogCWlmICghaG9zdGRhdGEpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogRmFpbGVkIHRvIGFsbG9jYXRlIGhvc3QgZGF0YVxuIiwKLQkJICAgICAgIGRldi0+ZGV2LmJ1c19pZCk7CisJCWRldl9wcmludGsoS0VSTl9FUlIsIGRldiwgIkZhaWxlZCB0byBhbGxvY2F0ZSBob3N0IGRhdGFcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9saWJzYXMvc2FzX2Rpc2NvdmVyLmMgYi9kcml2ZXJzL3Njc2kvbGlic2FzL3Nhc19kaXNjb3Zlci5jCmluZGV4IDcwOWE2ZjcuLmZhY2M1YmZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbGlic2FzL3Nhc19kaXNjb3Zlci5jCisrKyBiL2RyaXZlcnMvc2NzaS9saWJzYXMvc2FzX2Rpc2NvdmVyLmMKQEAgLTE2OSw3ICsxNjksNyBAQAogCQlpZiAocmVzKSB7CiAJCQlwcmludGsoInNhczogZHJpdmVyIG9uIHBjaWRldiAlcyBjYW5ub3QgaGFuZGxlICIKIAkJCSAgICAgICAiZGV2aWNlICVsbHgsIGVycm9yOiVkXG4iLAotCQkJICAgICAgIHNhc19oYS0+ZGV2LT5idXNfaWQsCisJCQkgICAgICAgZGV2X25hbWUoc2FzX2hhLT5kZXYpLAogCQkJICAgICAgIFNBU19BRERSKGRldi0+c2FzX2FkZHIpLCByZXMpOwogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xpYnNhcy9zYXNfZHVtcC5jIGIvZHJpdmVycy9zY3NpL2xpYnNhcy9zYXNfZHVtcC5jCmluZGV4IGJmMzRhMjMuLmMxN2MyNTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9saWJzYXMvc2FzX2R1bXAuYworKysgYi9kcml2ZXJzL3Njc2kvbGlic2FzL3Nhc19kdW1wLmMKQEAgLTU2LDcgKzU2LDcgQEAKIAogdm9pZCBzYXNfZHByaW50X2hhZShzdHJ1Y3Qgc2FzX2hhX3N0cnVjdCAqc2FzX2hhLCBlbnVtIGhhX2V2ZW50IGhlKQogewotCVNBU19EUFJJTlRLKCJoYSAlczogJXMgZXZlbnRcbiIsIHNhc19oYS0+ZGV2LT5idXNfaWQsCisJU0FTX0RQUklOVEsoImhhICVzOiAlcyBldmVudFxuIiwgZGV2X25hbWUoc2FzX2hhLT5kZXYpLAogCQkgICAgc2FzX2hhZV9zdHJbaGVdKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xpYnNhcy9zYXNfaG9zdF9zbXAuYyBiL2RyaXZlcnMvc2NzaS9saWJzYXMvc2FzX2hvc3Rfc21wLmMKaW5kZXggMTZmOTMxMi4uZDExMGEzNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xpYnNhcy9zYXNfaG9zdF9zbXAuYworKysgYi9kcml2ZXJzL3Njc2kvbGlic2FzL3Nhc19ob3N0X3NtcC5jCkBAIC0xOTksOCArMTk5LDggQEAKIAkJYnJlYWs7CiAKIAljYXNlIFNNUF9ESVNDT1ZFUjoKLQkJcmVxLT5kYXRhX2xlbiA9LSAxNjsKLQkJaWYgKHJlcS0+ZGF0YV9sZW4gPCAwKSB7CisJCXJlcS0+ZGF0YV9sZW4gLT0gMTY7CisJCWlmICgoaW50KXJlcS0+ZGF0YV9sZW4gPCAwKSB7CiAJCQlyZXEtPmRhdGFfbGVuID0gMDsKIAkJCWVycm9yID0gLUVJTlZBTDsKIAkJCWdvdG8gb3V0OwpAQCAtMjE1LDggKzIxNSw4IEBACiAJCWJyZWFrOwogCiAJY2FzZSBTTVBfUkVQT1JUX1BIWV9TQVRBOgotCQlyZXEtPmRhdGFfbGVuID0tIDE2OwotCQlpZiAocmVxLT5kYXRhX2xlbiA8IDApIHsKKwkJcmVxLT5kYXRhX2xlbiAtPSAxNjsKKwkJaWYgKChpbnQpcmVxLT5kYXRhX2xlbiA8IDApIHsKIAkJCXJlcS0+ZGF0YV9sZW4gPSAwOwogCQkJZXJyb3IgPSAtRUlOVkFMOwogCQkJZ290byBvdXQ7CkBAIC0yMzgsOCArMjM4LDggQEAKIAkJYnJlYWs7CiAKIAljYXNlIFNNUF9QSFlfQ09OVFJPTDoKLQkJcmVxLT5kYXRhX2xlbiA9LSA0NDsKLQkJaWYgKHJlcS0+ZGF0YV9sZW4gPCAwKSB7CisJCXJlcS0+ZGF0YV9sZW4gLT0gNDQ7CisJCWlmICgoaW50KXJlcS0+ZGF0YV9sZW4gPCAwKSB7CiAJCQlyZXEtPmRhdGFfbGVuID0gMDsKIAkJCWVycm9yID0gLUVJTlZBTDsKIAkJCWdvdG8gb3V0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xpYnNhcy9zYXNfcG9ydC5jIGIvZHJpdmVycy9zY3NpL2xpYnNhcy9zYXNfcG9ydC5jCmluZGV4IDEzOTkzNWEuLmU2YWM1OWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9saWJzYXMvc2FzX3BvcnQuYworKysgYi9kcml2ZXJzL3Njc2kvbGlic2FzL3Nhc19wb3J0LmMKQEAgLTExMyw3ICsxMTMsNyBAQAogCXNhc19wb3J0X2FkZF9waHkocG9ydC0+cG9ydCwgcGh5LT5waHkpOwogCiAJU0FTX0RQUklOVEsoIiVzIGFkZGVkIHRvICVzLCBwaHlfbWFzazoweCV4ICglMTZsbHgpXG4iLAotCQkgICAgcGh5LT5waHktPmRldi5idXNfaWQscG9ydC0+cG9ydC0+ZGV2LmJ1c19pZCwKKwkJICAgIGRldl9uYW1lKCZwaHktPnBoeS0+ZGV2KSwgZGV2X25hbWUoJnBvcnQtPnBvcnQtPmRldiksCiAJCSAgICBwb3J0LT5waHlfbWFzaywKIAkJICAgIFNBU19BRERSKHBvcnQtPmF0dGFjaGVkX3Nhc19hZGRyKSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfaGJhZGlzYy5jIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19oYmFkaXNjLmMKaW5kZXggOGM2NDQ5NC4uMzExZWQ2ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19oYmFkaXNjLmMKKysrIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19oYmFkaXNjLmMKQEAgLTE5NjQsMTAgKzE5NjQsMTAgQEAKIAl1aW50MzJfdCB0bW87CiAKIAlpZiAodnBvcnQtPnBvcnRfc3RhdGUgPT0gTFBGQ19MT0NBTF9DRkdfTElOSykgewotCQkvKiBGb3IgRkFOLCB0aW1lb3V0IHNob3VsZCBiZSBncmVhdGVyIHRoZW4gZWR0b3YgKi8KKwkJLyogRm9yIEZBTiwgdGltZW91dCBzaG91bGQgYmUgZ3JlYXRlciB0aGFuIGVkdG92ICovCiAJCXRtbyA9ICgoKHBoYmEtPmZjX2VkdG92ICsgOTk5KSAvIDEwMDApICsgMSk7CiAJfSBlbHNlIHsKLQkJLyogTm9ybWFsIGRpc2NvdmVyeSB0aW1lb3V0IHNob3VsZCBiZSA+IHRoZW4gRUxTL0NUIHRpbWVvdXQKKwkJLyogTm9ybWFsIGRpc2NvdmVyeSB0aW1lb3V0IHNob3VsZCBiZSA+IHRoYW4gRUxTL0NUIHRpbWVvdXQKIAkJICogRkMgc3BlYyBzdGF0ZXMgd2UgbmVlZCAzICogcmF0b3YgZm9yIENUIHJlcXVlc3RzCiAJCSAqLwogCQl0bW8gPSAoKHBoYmEtPmZjX3JhdG92ICogMykgKyAzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfaW5pdC5jIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19pbml0LmMKaW5kZXggNGM3NzAzOC4uNmM4NjczMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19pbml0LmMKKysrIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19pbml0LmMKQEAgLTE3OTUsMTIgKzE3OTUsMTMgQEAKIGludAogbHBmY19vbmxpbmUoc3RydWN0IGxwZmNfaGJhICpwaGJhKQogewotCXN0cnVjdCBscGZjX3Zwb3J0ICp2cG9ydCA9IHBoYmEtPnBwb3J0OworCXN0cnVjdCBscGZjX3Zwb3J0ICp2cG9ydDsKIAlzdHJ1Y3QgbHBmY192cG9ydCAqKnZwb3J0czsKIAlpbnQgaTsKIAogCWlmICghcGhiYSkKIAkJcmV0dXJuIDA7CisJdnBvcnQgPSBwaGJhLT5wcG9ydDsKIAogCWlmICghKHZwb3J0LT5mY19mbGFnICYgRkNfT0ZGTElORV9NT0RFKSkKIAkJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX3NsaS5jIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19zbGkuYwppbmRleCAwMWRmZGM4Li5hMzZhMTIwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX3NsaS5jCisrKyBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfc2xpLmMKQEAgLTQyMCw3ICs0MjAsNyBAQAogCQlpZiAodW5saWtlbHkocHJpbmctPmxvY2FsX2dldGlkeCA+PSBtYXhfY21kX2lkeCkpIHsKIAkJCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX0VSUiwgTE9HX1NMSSwKIAkJCQkJIjAzMTUgUmluZyAlZCBpc3N1ZTogcG9ydENtZEdldCAlZCAiCi0JCQkJCSJpcyBiaWdnZXIgdGhlbiBjbWQgcmluZyAlZFxuIiwKKwkJCQkJImlzIGJpZ2dlciB0aGFuIGNtZCByaW5nICVkXG4iLAogCQkJCQlwcmluZy0+cmluZ25vLAogCQkJCQlwcmluZy0+bG9jYWxfZ2V0aWR4LCBtYXhfY21kX2lkeCk7CiAKQEAgLTE2MjgsMTIgKzE2MjgsMTIgQEAKIHsKIAlzdHJ1Y3QgbHBmY19wZ3AgKnBncCA9ICZwaGJhLT5wb3J0X2dwW3ByaW5nLT5yaW5nbm9dOwogCS8qCi0JICogUmluZyA8cmluZ25vPiBoYW5kbGVyOiBwb3J0UnNwUHV0IDxwb3J0UnNwUHV0PiBpcyBiaWdnZXIgdGhlbgorCSAqIFJpbmcgPHJpbmdubz4gaGFuZGxlcjogcG9ydFJzcFB1dCA8cG9ydFJzcFB1dD4gaXMgYmlnZ2VyIHRoYW4KIAkgKiByc3AgcmluZyA8cG9ydFJzcE1heD4KIAkgKi8KIAlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9FUlIsIExPR19TTEksCiAJCQkiMDMxMiBSaW5nICVkIGhhbmRsZXI6IHBvcnRSc3BQdXQgJWQgIgotCQkJImlzIGJpZ2dlciB0aGVuIHJzcCByaW5nICVkXG4iLAorCQkJImlzIGJpZ2dlciB0aGFuIHJzcCByaW5nICVkXG4iLAogCQkJcHJpbmctPnJpbmdubywgbGUzMl90b19jcHUocGdwLT5yc3BQdXRJbngpLAogCQkJcHJpbmctPm51bVJpb2NiKTsKIApAQCAtMjA4MywxMiArMjA4MywxMiBAQAogCXBvcnRSc3BQdXQgPSBsZTMyX3RvX2NwdShwZ3AtPnJzcFB1dElueCk7CiAJaWYgKHBvcnRSc3BQdXQgPj0gcG9ydFJzcE1heCkgewogCQkvKgotCQkgKiBSaW5nIDxyaW5nbm8+IGhhbmRsZXI6IHBvcnRSc3BQdXQgPHBvcnRSc3BQdXQ+IGlzIGJpZ2dlciB0aGVuCisJCSAqIFJpbmcgPHJpbmdubz4gaGFuZGxlcjogcG9ydFJzcFB1dCA8cG9ydFJzcFB1dD4gaXMgYmlnZ2VyIHRoYW4KIAkJICogcnNwIHJpbmcgPHBvcnRSc3BNYXg+CiAJCSAqLwogCQlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9FUlIsIExPR19TTEksCiAJCQkJIjAzMDMgUmluZyAlZCBoYW5kbGVyOiBwb3J0UnNwUHV0ICVkICIKLQkJCQkiaXMgYmlnZ2VyIHRoZW4gcnNwIHJpbmcgJWRcbiIsCisJCQkJImlzIGJpZ2dlciB0aGFuIHJzcCByaW5nICVkXG4iLAogCQkJCXByaW5nLT5yaW5nbm8sIHBvcnRSc3BQdXQsIHBvcnRSc3BNYXgpOwogCiAJCXBoYmEtPmxpbmtfc3RhdGUgPSBMUEZDX0hCQV9FUlJPUjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC5jIGIvZHJpdmVycy9zY3NpL21lZ2FyYWlkLmMKaW5kZXggN2RjNjJkZS4uOWZkY2Q2MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL21lZ2FyYWlkLmMKKysrIGIvZHJpdmVycy9zY3NpL21lZ2FyYWlkLmMKQEAgLTE5NjcsOCArMTk2Nyw4IEBACiAJCQlzY2ItPnN0YXRlIHw9IGFvcjsKIAogCQkJLyoKLQkJCSAqIENoZWNrIGlmIHRoaXMgY29tbWFuZCBoYXMgZmlybWFyZSBvd2VuZXJzaGlwLiBJZgotCQkJICogeWVzLCB3ZSBjYW5ub3QgcmVzZXQgdGhpcyBjb21tYW5kLiBXaGVuZXZlciwgZi93CisJCQkgKiBDaGVjayBpZiB0aGlzIGNvbW1hbmQgaGFzIGZpcm13YXJlIG93bmVyc2hpcC4gSWYKKwkJCSAqIHllcywgd2UgY2Fubm90IHJlc2V0IHRoaXMgY29tbWFuZC4gV2hlbmV2ZXIgZi93CiAJCQkgKiBjb21wbGV0ZXMgdGhpcyBjb21tYW5kLCB3ZSB3aWxsIHJldHVybiBhcHByb3ByaWF0ZQogCQkJICogc3RhdHVzIGZyb20gSVNSLgogCQkJICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbXZzYXMuYyBiL2RyaXZlcnMvc2NzaS9tdnNhcy5jCmluZGV4IDFkZDcwZDcuLjIzZTVhODcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9tdnNhcy5jCisrKyBiL2RyaXZlcnMvc2NzaS9tdnNhcy5jCkBAIC0yOTU5LDcgKzI5NTksNyBAQAogCiAJLyogZW5hYmxlIGF1dG8gcG9ydCBkZXRlY3Rpb24gKi8KIAltdzMyKEdCTF9QT1JUX1RZUEUsIE1PREVfQVVUT19ERVRfRU4pOwotCW1zbGVlcCgxMDApOworCW1zbGVlcCgxMTAwKTsKIAkvKiBpbml0IGFuZCByZXNldCBwaHlzICovCiAJZm9yIChpID0gMDsgaSA8IG12aS0+Y2hpcC0+bl9waHk7IGkrKykgewogCQl1MzIgbG8gPSBiZTMyX3RvX2NwdSgqKHUzMiAqKSZtdmktPnNhc19hZGRyWzRdKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9wY21jaWEvYWhhMTUyeF9zdHViLmMgYi9kcml2ZXJzL3Njc2kvcGNtY2lhL2FoYTE1Mnhfc3R1Yi5jCmluZGV4IDE2NWZmODguLjY3Y2RlMDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9wY21jaWEvYWhhMTUyeF9zdHViLmMKKysrIGIvZHJpdmVycy9zY3NpL3BjbWNpYS9haGExNTJ4X3N0dWIuYwpAQCAtMTE0LDcgKzExNCw3IEBACiAgICAgbGluay0+aW8uTnVtUG9ydHMxID0gMHgyMDsKICAgICBsaW5rLT5pby5BdHRyaWJ1dGVzMSA9IElPX0RBVEFfUEFUSF9XSURUSF9BVVRPOwogICAgIGxpbmstPmlvLklPQWRkckxpbmVzID0gMTA7Ci0gICAgbGluay0+aXJxLkF0dHJpYnV0ZXMgPSBJUlFfVFlQRV9FWENMVVNJVkU7CisgICAgbGluay0+aXJxLkF0dHJpYnV0ZXMgPSBJUlFfVFlQRV9EWU5BTUlDX1NIQVJJTkc7CiAgICAgbGluay0+aXJxLklSUUluZm8xID0gSVJRX0xFVkVMX0lEOwogICAgIGxpbmstPmNvbmYuQXR0cmlidXRlcyA9IENPTkZfRU5BQkxFX0lSUTsKICAgICBsaW5rLT5jb25mLkludFR5cGUgPSBJTlRfTUVNT1JZX0FORF9JTzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGExMjgwLmMgYi9kcml2ZXJzL3Njc2kvcWxhMTI4MC5jCmluZGV4IDhjYjkyNDAuLmRmMDk4MjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGExMjgwLmMKKysrIGIvZHJpdmVycy9zY3NpL3FsYTEyODAuYwpAQCAtMTI4LDcgKzEyOCw3IEBACiAJLSBJbnRlZ3JhdGUgcWwxMjE2MF9zZXRfdGFyZ2V0X3BhcmFtZXRlcnMoKSB3aXRoIDEyODAgdmVyc2lvbgogCS0gTWFrZSBxbGExMjgwX3NldHVwKCkgbm9uIHN0YXRpYwogCS0gRG8gbm90IGNhbGwgcWxhMTI4MF9jaGVja19mb3JfZGVhZF9zY3NpX2J1cygpIG9uIGV2ZXJ5IEkvTyByZXF1ZXN0Ci0JICBzZW50IHRvIHRoZSBjYXJkIC0gdGhpcyBjb21tYW5kIHBhdXNlcyB0aGUgZmlybWFyZSEhIQorCSAgc2VudCB0byB0aGUgY2FyZCAtIHRoaXMgY29tbWFuZCBwYXVzZXMgdGhlIGZpcm13YXJlISEhCiAgICAgUmV2ICAzLjIzLjE1IEJldGEgTWFyY2ggMTksIDIwMDIsIEplcyBTb3JlbnNlbgogCS0gQ2xlYW4gdXAgcWxhMTI4MC5oIC0gcmVtb3ZlIG9ic29sZXRlIFFMX0RFQlVHX0xFVkVMX3ggZGVmaW5pdGlvbnMKIAktIFJlbW92ZSBhIHBpbGUgb2YgcG9pbnRsZXNzIGFuZCBjb25mdXNpbmcgKHNyYl90ICoqKSBhbmQKQEAgLTY1OSw3ICs2NTksNyBAQAogCS8qIFRoZSBmaXJtd2FyZSBpbnRlcmZhY2UgaXMsIHVtLCBpbnRlcmVzdGluZywgaW4gdGhhdCB0aGUKIAkgKiBhY3R1YWwgZmlybXdhcmUgaW1hZ2Ugb24gdGhlIGNoaXAgaXMgbGl0dGxlIGVuZGlhbiwgdGh1cywKIAkgKiB0aGUgcHJvY2VzcyBvZiB0YWtpbmcgdGhhdCBpbWFnZSB0byB0aGUgQ1BVIHdvdWxkIGVuZCB1cAotCSAqIGxpdHRsZSBlbmRpYW4uICBIb3dldmVyLCB0aGUgZmlybWFyZSBpbnRlcmZhY2UgcmVxdWlyZXMgaXQKKwkgKiBsaXR0bGUgZW5kaWFuLiAgSG93ZXZlciwgdGhlIGZpcm13YXJlIGludGVyZmFjZSByZXF1aXJlcyBpdAogCSAqIHRvIGJlIHJlYWQgYSB3b3JkICh0d28gYnl0ZXMpIGF0IGEgdGltZS4KIAkgKgogCSAqIFRoZSBuZXQgcmVzdWx0IG9mIHRoaXMgd291bGQgYmUgdGhhdCB0aGUgd29yZCAoYW5kCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfYXR0ci5jIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2F0dHIuYwppbmRleCBjZDUzNjI3Li5jN2FjZWY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfYXR0ci5jCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9hdHRyLmMKQEAgLTMwMyw3ICszMDMsNyBAQAogCQllbHNlIGlmIChzdGFydCA9PSAoaGEtPmZsdF9yZWdpb25fYm9vdCAqIDQpIHx8CiAJCSAgICBzdGFydCA9PSAoaGEtPmZsdF9yZWdpb25fZncgKiA0KSkKIAkJCXZhbGlkID0gMTsKLQkJZWxzZSBpZiAoSVNfUUxBMjVYWChoYSkgJiYKKwkJZWxzZSBpZiAoKElTX1FMQTI1WFgoaGEpIHx8IElTX1FMQTgxWFgoaGEpKSAmJgogCQkgICAgc3RhcnQgPT0gKGhhLT5mbHRfcmVnaW9uX3ZwZF9udnJhbSAqIDQpKQogCQkgICAgdmFsaWQgPSAxOwogCQlpZiAoIXZhbGlkKSB7CkBAIC04MTUsNiArODE1LDIxIEBACiAJICAgIGhhLT5xbGFfc3RhdHMudG90YWxfaXNwX2Fib3J0cyk7CiB9CiAKK3N0YXRpYyBzc2l6ZV90CitxbGEyeDAwX21waV92ZXJzaW9uX3Nob3coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKyAgICBjaGFyICpidWYpCit7CisJc2NzaV9xbGFfaG9zdF90ICp2aGEgPSBzaG9zdF9wcml2KGNsYXNzX3RvX3Nob3N0KGRldikpOworCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OworCisJaWYgKCFJU19RTEE4MVhYKGhhKSkKKwkJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiXG4iKTsKKworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiUwMnguJTAyeC4lMDJ4LiUwMnggKCV4KVxuIiwKKwkgICAgaGEtPm1waV92ZXJzaW9uWzBdLCBoYS0+bXBpX3ZlcnNpb25bMV0sIGhhLT5tcGlfdmVyc2lvblsyXSwKKwkgICAgaGEtPm1waV92ZXJzaW9uWzNdLCBoYS0+bXBpX2NhcGFiaWxpdGllcyk7Cit9CisKIHN0YXRpYyBERVZJQ0VfQVRUUihkcml2ZXJfdmVyc2lvbiwgU19JUlVHTywgcWxhMngwMF9kcnZyX3ZlcnNpb25fc2hvdywgTlVMTCk7CiBzdGF0aWMgREVWSUNFX0FUVFIoZndfdmVyc2lvbiwgU19JUlVHTywgcWxhMngwMF9md192ZXJzaW9uX3Nob3csIE5VTEwpOwogc3RhdGljIERFVklDRV9BVFRSKHNlcmlhbF9udW0sIFNfSVJVR08sIHFsYTJ4MDBfc2VyaWFsX251bV9zaG93LCBOVUxMKTsKQEAgLTgzOSw2ICs4NTQsNyBAQAogCQkgICBOVUxMKTsKIHN0YXRpYyBERVZJQ0VfQVRUUih0b3RhbF9pc3BfYWJvcnRzLCBTX0lSVUdPLCBxbGEyeDAwX3RvdGFsX2lzcF9hYm9ydHNfc2hvdywKIAkJICAgTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFIobXBpX3ZlcnNpb24sIFNfSVJVR08sIHFsYTJ4MDBfbXBpX3ZlcnNpb25fc2hvdywgTlVMTCk7CiAKIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpxbGEyeDAwX2hvc3RfYXR0cnNbXSA9IHsKIAkmZGV2X2F0dHJfZHJpdmVyX3ZlcnNpb24sCkBAIC04NTgsNiArODc0LDcgQEAKIAkmZGV2X2F0dHJfb3B0cm9tX2Zjb2RlX3ZlcnNpb24sCiAJJmRldl9hdHRyX29wdHJvbV9md192ZXJzaW9uLAogCSZkZXZfYXR0cl90b3RhbF9pc3BfYWJvcnRzLAorCSZkZXZfYXR0cl9tcGlfdmVyc2lvbiwKIAlOVUxMLAogfTsKIApAQCAtODkyLDYgKzkwOSw5IEBACiAJY2FzZSBQT1JUX1NQRUVEXzhHQjoKIAkJc3BlZWQgPSBGQ19QT1JUU1BFRURfOEdCSVQ7CiAJCWJyZWFrOworCWNhc2UgUE9SVF9TUEVFRF8xMEdCOgorCQlzcGVlZCA9IEZDX1BPUlRTUEVFRF8xMEdCSVQ7CisJCWJyZWFrOwogCX0KIAlmY19ob3N0X3NwZWVkKHNob3N0KSA9IHNwZWVkOwogfQpAQCAtMTM4Miw3ICsxNDAyLDkgQEAKIAlmY19ob3N0X21heF9ucGl2X3Zwb3J0cyh2aGEtPmhvc3QpID0gaGEtPm1heF9ucGl2X3Zwb3J0czsKIAlmY19ob3N0X25waXZfdnBvcnRzX2ludXNlKHZoYS0+aG9zdCkgPSBoYS0+Y3VyX3Zwb3J0X2NvdW50OwogCi0JaWYgKElTX1FMQTI1WFgoaGEpKQorCWlmIChJU19RTEE4MVhYKGhhKSkKKwkJc3BlZWQgPSBGQ19QT1JUU1BFRURfMTBHQklUOworCWVsc2UgaWYgKElTX1FMQTI1WFgoaGEpKQogCQlzcGVlZCA9IEZDX1BPUlRTUEVFRF84R0JJVCB8IEZDX1BPUlRTUEVFRF80R0JJVCB8CiAJCSAgICBGQ19QT1JUU1BFRURfMkdCSVQgfCBGQ19QT1JUU1BFRURfMUdCSVQ7CiAJZWxzZSBpZiAoSVNfUUxBMjRYWF9UWVBFKGhhKSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9kYmcuYyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9kYmcuYwppbmRleCAxY2Y3Nzc3Li4zNDc2MGY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZGJnLmMKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2RiZy5jCkBAIC0zMTAsNiArMzEwLDc2IEBACiAJCSpidWYrKyA9IGh0b25zKFJEX1JFR19XT1JEKGRtcF9yZWcrKykpOwogfQogCitzdGF0aWMgaW5saW5lIHZvaWQgKgorcWxhMjR4eF9jb3B5X2VmdChzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhLCB2b2lkICpwdHIpCit7CisJaWYgKCFoYS0+ZWZ0KQorCQlyZXR1cm4gcHRyOworCisJbWVtY3B5KHB0ciwgaGEtPmVmdCwgbnRvaGwoaGEtPmZ3X2R1bXAtPmVmdF9zaXplKSk7CisJcmV0dXJuIHB0ciArIG50b2hsKGhhLT5md19kdW1wLT5lZnRfc2l6ZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCAqCitxbGEyNXh4X2NvcHlfZmNlKHN0cnVjdCBxbGFfaHdfZGF0YSAqaGEsIHZvaWQgKnB0ciwgdWludDMyX3QgKipsYXN0X2NoYWluKQoreworCXVpbnQzMl90IGNudDsKKwl1aW50MzJfdCAqaXRlcl9yZWc7CisJc3RydWN0IHFsYTJ4eHhfZmNlX2NoYWluICpmY2VjID0gcHRyOworCisJaWYgKCFoYS0+ZmNlKQorCQlyZXR1cm4gcHRyOworCisJKmxhc3RfY2hhaW4gPSAmZmNlYy0+dHlwZTsKKwlmY2VjLT50eXBlID0gX19jb25zdGFudF9odG9ubChEVU1QX0NIQUlOX0ZDRSk7CisJZmNlYy0+Y2hhaW5fc2l6ZSA9IGh0b25sKHNpemVvZihzdHJ1Y3QgcWxhMnh4eF9mY2VfY2hhaW4pICsKKwkgICAgZmNlX2NhbGNfc2l6ZShoYS0+ZmNlX2J1ZnMpKTsKKwlmY2VjLT5zaXplID0gaHRvbmwoZmNlX2NhbGNfc2l6ZShoYS0+ZmNlX2J1ZnMpKTsKKwlmY2VjLT5hZGRyX2wgPSBodG9ubChMU0QoaGEtPmZjZV9kbWEpKTsKKwlmY2VjLT5hZGRyX2ggPSBodG9ubChNU0QoaGEtPmZjZV9kbWEpKTsKKworCWl0ZXJfcmVnID0gZmNlYy0+ZXJlZ3M7CisJZm9yIChjbnQgPSAwOyBjbnQgPCA4OyBjbnQrKykKKwkJKml0ZXJfcmVnKysgPSBodG9ubChoYS0+ZmNlX21iW2NudF0pOworCisJbWVtY3B5KGl0ZXJfcmVnLCBoYS0+ZmNlLCBudG9obChmY2VjLT5zaXplKSk7CisKKwlyZXR1cm4gaXRlcl9yZWc7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCAqCitxbGEyNXh4X2NvcHlfbXEoc3RydWN0IHFsYV9od19kYXRhICpoYSwgdm9pZCAqcHRyLCB1aW50MzJfdCAqKmxhc3RfY2hhaW4pCit7CisJdWludDMyX3QgY250LCBxdWVfaWR4OworCXVpbnQ4X3QgcmVxX2NudCwgcnNwX2NudCwgcXVlX2NudDsKKwlzdHJ1Y3QgcWxhMnh4eF9tcV9jaGFpbiAqbXEgPSBwdHI7CisJc3RydWN0IGRldmljZV9yZWdfMjV4eG1xIF9faW9tZW0gKnJlZzsKKworCWlmICghaGEtPm1xZW5hYmxlKQorCQlyZXR1cm4gcHRyOworCisJbXEgPSBwdHI7CisJKmxhc3RfY2hhaW4gPSAmbXEtPnR5cGU7CisJbXEtPnR5cGUgPSBfX2NvbnN0YW50X2h0b25sKERVTVBfQ0hBSU5fTVEpOworCW1xLT5jaGFpbl9zaXplID0gX19jb25zdGFudF9odG9ubChzaXplb2Yoc3RydWN0IHFsYTJ4eHhfbXFfY2hhaW4pKTsKKworCXJlcV9jbnQgPSBmaW5kX2ZpcnN0X3plcm9fYml0KGhhLT5yZXFfcWlkX21hcCwgaGEtPm1heF9xdWV1ZXMpOworCXJzcF9jbnQgPSBmaW5kX2ZpcnN0X3plcm9fYml0KGhhLT5yc3BfcWlkX21hcCwgaGEtPm1heF9xdWV1ZXMpOworCXF1ZV9jbnQgPSByZXFfY250ID4gcnNwX2NudCA/IHJlcV9jbnQgOiByc3BfY250OworCW1xLT5jb3VudCA9IGh0b25sKHF1ZV9jbnQpOworCWZvciAoY250ID0gMDsgY250IDwgcXVlX2NudDsgY250KyspIHsKKwkJcmVnID0gKHN0cnVjdCBkZXZpY2VfcmVnXzI1eHhtcSAqKSAoKHZvaWQgKikKKwkJCWhhLT5tcWlvYmFzZSArIGNudCAqIFFMQV9RVUVfUEFHRSk7CisJCXF1ZV9pZHggPSBjbnQgKiA0OworCQltcS0+cXJlZ3NbcXVlX2lkeF0gPSBodG9ubChSRF9SRUdfRFdPUkQoJnJlZy0+cmVxX3FfaW4pKTsKKwkJbXEtPnFyZWdzW3F1ZV9pZHgrMV0gPSBodG9ubChSRF9SRUdfRFdPUkQoJnJlZy0+cmVxX3Ffb3V0KSk7CisJCW1xLT5xcmVnc1txdWVfaWR4KzJdID0gaHRvbmwoUkRfUkVHX0RXT1JEKCZyZWctPnJzcF9xX2luKSk7CisJCW1xLT5xcmVnc1txdWVfaWR4KzNdID0gaHRvbmwoUkRfUkVHX0RXT1JEKCZyZWctPnJzcF9xX291dCkpOworCX0KKworCXJldHVybiBwdHIgKyBzaXplb2Yoc3RydWN0IHFsYTJ4eHhfbXFfY2hhaW4pOworfQorCiAvKioKICAqIHFsYTIzMDBfZndfZHVtcCgpIC0gRHVtcHMgYmluYXJ5IGRhdGEgZnJvbSB0aGUgMjMwMCBmaXJtd2FyZS4KICAqIEBoYTogSEEgY29udGV4dApAQCAtOTEzLDggKzk4Myw4IEBACiAJCWdvdG8gcWxhMjR4eF9md19kdW1wX2ZhaWxlZF8wOwogCiAJbnh0ID0gcWxhMnh4eF9jb3B5X3F1ZXVlcyhoYSwgbnh0KTsKLQlpZiAoaGEtPmVmdCkKLQkJbWVtY3B5KG54dCwgaGEtPmVmdCwgbnRvaGwoaGEtPmZ3X2R1bXAtPmVmdF9zaXplKSk7CisKKwlxbGEyNHh4X2NvcHlfZWZ0KGhhLCBueHQpOwogCiBxbGEyNHh4X2Z3X2R1bXBfZmFpbGVkXzA6CiAJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKQEAgLTk0MiwxOSArMTAxMiwxNCBAQAogCXVpbnQzMl90CXJpc2NfYWRkcmVzczsKIAlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKIAlzdHJ1Y3QgZGV2aWNlX3JlZ18yNHh4IF9faW9tZW0gKnJlZyA9ICZoYS0+aW9iYXNlLT5pc3AyNDsKLQlzdHJ1Y3QgZGV2aWNlX3JlZ18yNXh4bXEgX19pb21lbSAqcmVnMjU7CiAJdWludDMyX3QgX19pb21lbSAqZG1wX3JlZzsKIAl1aW50MzJfdAkqaXRlcl9yZWc7CiAJdWludDE2X3QgX19pb21lbSAqbWJ4X3JlZzsKIAl1bnNpZ25lZCBsb25nCWZsYWdzOwogCXN0cnVjdCBxbGEyNXh4X2Z3X2R1bXAgKmZ3OwogCXVpbnQzMl90CWV4dF9tZW1fY250OwotCXZvaWQJCSpueHQ7Ci0Jc3RydWN0IHFsYTJ4eHhfZmNlX2NoYWluICpmY2VjOwotCXN0cnVjdCBxbGEyeHh4X21xX2NoYWluICptcSA9IE5VTEw7Ci0JdWludDMyX3QJcXJlZ19zaXplOwotCXVpbnQ4X3QJCXJlcV9jbnQsIHJzcF9jbnQsIHF1ZV9jbnQ7Ci0JdWludDMyX3QJcXVlX2lkeDsKKwl2b2lkCQkqbnh0LCAqbnh0X2NoYWluOworCXVpbnQzMl90CSpsYXN0X2NoYWluID0gTlVMTDsKIAlzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqYmFzZV92aGEgPSBwY2lfZ2V0X2RydmRhdGEoaGEtPnBkZXYpOwogCiAJcmlzY19hZGRyZXNzID0gZXh0X21lbV9jbnQgPSAwOwpAQCAtMTAwMSwyOCArMTA2Niw2IEBACiAJZnctPnBjaWVfcmVnc1syXSA9IGh0b25sKFJEX1JFR19EV09SRChkbXBfcmVnKSk7CiAJZnctPnBjaWVfcmVnc1szXSA9IGh0b25sKFJEX1JFR19EV09SRCgmcmVnLT5pb2Jhc2Vfd2luZG93KSk7CiAKLQkvKiBNdWx0aSBxdWV1ZSByZWdpc3RlcnMgKi8KLQlpZiAoaGEtPm1xZW5hYmxlKSB7Ci0JCXFyZWdfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgcWxhMnh4eF9tcV9jaGFpbik7Ci0JCW1xID0ga3phbGxvYyhxcmVnX3NpemUsIEdGUF9LRVJORUwpOwotCQlpZiAoIW1xKQotCQkJZ290byBxbGEyNXh4X2Z3X2R1bXBfZmFpbGVkXzA7Ci0JCXJlcV9jbnQgPSBmaW5kX2ZpcnN0X3plcm9fYml0KGhhLT5yZXFfcWlkX21hcCwgaGEtPm1heF9xdWV1ZXMpOwotCQlyc3BfY250ID0gZmluZF9maXJzdF96ZXJvX2JpdChoYS0+cnNwX3FpZF9tYXAsIGhhLT5tYXhfcXVldWVzKTsKLQkJcXVlX2NudCA9IHJlcV9jbnQgPiByc3BfY250ID8gcmVxX2NudCA6IHJzcF9jbnQ7Ci0JCW1xLT5jb3VudCA9IGh0b25sKHF1ZV9jbnQpOwotCQltcS0+Y2hhaW5fc2l6ZSA9IGh0b25sKHFyZWdfc2l6ZSk7Ci0JCW1xLT50eXBlID0gX19jb25zdGFudF9odG9ubChEVU1QX0NIQUlOX01RKTsKLQkJZm9yIChjbnQgPSAwOyBjbnQgPCBxdWVfY250OyBjbnQrKykgewotCQkJcmVnMjUgPSAoc3RydWN0IGRldmljZV9yZWdfMjV4eG1xICopICgodm9pZCAqKQotCQkJCWhhLT5tcWlvYmFzZSArIGNudCAqIFFMQV9RVUVfUEFHRSk7Ci0JCQlxdWVfaWR4ID0gY250ICogNDsKLQkJCW1xLT5xcmVnc1txdWVfaWR4XSA9IGh0b25sKHJlZzI1LT5yZXFfcV9pbik7Ci0JCQltcS0+cXJlZ3NbcXVlX2lkeCsxXSA9IGh0b25sKHJlZzI1LT5yZXFfcV9vdXQpOwotCQkJbXEtPnFyZWdzW3F1ZV9pZHgrMl0gPSBodG9ubChyZWcyNS0+cnNwX3FfaW4pOwotCQkJbXEtPnFyZWdzW3F1ZV9pZHgrM10gPSBodG9ubChyZWcyNS0+cnNwX3Ffb3V0KTsKLQkJfQotCX0KIAlXUlRfUkVHX0RXT1JEKCZyZWctPmlvYmFzZV93aW5kb3csIDB4MDApOwogCVJEX1JFR19EV09SRCgmcmVnLT5pb2Jhc2Vfd2luZG93KTsKIApAQCAtMTI0MCw2ICsxMjgzLDEwIEBACiAJaXRlcl9yZWcgPSBxbGEyNHh4X3JlYWRfd2luZG93KHJlZywgMHg2MUIwLCAxNiwgaXRlcl9yZWcpOwogCXFsYTI0eHhfcmVhZF93aW5kb3cocmVnLCAweDZGMDAsIDE2LCBpdGVyX3JlZyk7CiAKKwkvKiBNdWx0aSBxdWV1ZSByZWdpc3RlcnMgKi8KKwlueHRfY2hhaW4gPSBxbGEyNXh4X2NvcHlfbXEoaGEsICh2b2lkICopaGEtPmZ3X2R1bXAgKyBoYS0+Y2hhaW5fb2Zmc2V0LAorCSAgICAmbGFzdF9jaGFpbik7CisKIAlydmFsID0gcWxhMjR4eF9zb2Z0X3Jlc2V0KGhhKTsKIAlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykKIAkJZ290byBxbGEyNXh4X2Z3X2R1bXBfZmFpbGVkXzA7CkBAIC0xMjQ5LDM3ICsxMjk2LDE2IEBACiAJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpCiAJCWdvdG8gcWxhMjV4eF9md19kdW1wX2ZhaWxlZF8wOwogCi0JLyogRmlicmUgQ2hhbm5lbCBUcmFjZSBCdWZmZXIuICovCiAJbnh0ID0gcWxhMnh4eF9jb3B5X3F1ZXVlcyhoYSwgbnh0KTsKLQlpZiAoaGEtPmVmdCkKLQkJbWVtY3B5KG54dCwgaGEtPmVmdCwgbnRvaGwoaGEtPmZ3X2R1bXAtPmVmdF9zaXplKSk7CiAKLQkvKiBGaWJyZSBDaGFubmVsIEV2ZW50IEJ1ZmZlci4gKi8KLQlpZiAoIWhhLT5mY2UpCi0JCWdvdG8gcWxhMjV4eF9md19kdW1wX2ZhaWxlZF8wOworCW54dCA9IHFsYTI0eHhfY29weV9lZnQoaGEsIG54dCk7CiAKLQloYS0+ZndfZHVtcC0+dmVyc2lvbiB8PSBfX2NvbnN0YW50X2h0b25sKERVTVBfQ0hBSU5fVkFSSUFOVCk7Ci0KLQlpZiAoaGEtPm1xZW5hYmxlKSB7Ci0JCW54dCA9IG54dCArIG50b2hsKGhhLT5md19kdW1wLT5lZnRfc2l6ZSk7Ci0JCW1lbWNweShueHQsIG1xLCBxcmVnX3NpemUpOwotCQlrZnJlZShtcSk7Ci0JCWZjZWMgPSBueHQgKyBxcmVnX3NpemU7Ci0JfSBlbHNlIHsKLQkJZmNlYyA9IG54dCArIG50b2hsKGhhLT5md19kdW1wLT5lZnRfc2l6ZSk7CisJLyogQ2hhaW4gZW50cmllcyAtLSBzdGFydGVkIHdpdGggTVEuICovCisJcWxhMjV4eF9jb3B5X2ZjZShoYSwgbnh0X2NoYWluLCAmbGFzdF9jaGFpbik7CisJaWYgKGxhc3RfY2hhaW4pIHsKKwkJaGEtPmZ3X2R1bXAtPnZlcnNpb24gfD0gX19jb25zdGFudF9odG9ubChEVU1QX0NIQUlOX1ZBUklBTlQpOworCQkqbGFzdF9jaGFpbiB8PSBfX2NvbnN0YW50X2h0b25sKERVTVBfQ0hBSU5fTEFTVCk7CiAJfQotCWZjZWMtPnR5cGUgPSBfX2NvbnN0YW50X2h0b25sKERVTVBfQ0hBSU5fRkNFIHwgRFVNUF9DSEFJTl9MQVNUKTsKLQlmY2VjLT5jaGFpbl9zaXplID0gaHRvbmwoc2l6ZW9mKHN0cnVjdCBxbGEyeHh4X2ZjZV9jaGFpbikgKwotCSAgICBmY2VfY2FsY19zaXplKGhhLT5mY2VfYnVmcykpOwotCWZjZWMtPnNpemUgPSBodG9ubChmY2VfY2FsY19zaXplKGhhLT5mY2VfYnVmcykpOwotCWZjZWMtPmFkZHJfbCA9IGh0b25sKExTRChoYS0+ZmNlX2RtYSkpOwotCWZjZWMtPmFkZHJfaCA9IGh0b25sKE1TRChoYS0+ZmNlX2RtYSkpOwotCi0JaXRlcl9yZWcgPSBmY2VjLT5lcmVnczsKLQlmb3IgKGNudCA9IDA7IGNudCA8IDg7IGNudCsrKQotCQkqaXRlcl9yZWcrKyA9IGh0b25sKGhhLT5mY2VfbWJbY250XSk7Ci0KLQltZW1jcHkoaXRlcl9yZWcsIGhhLT5mY2UsIG50b2hsKGZjZWMtPnNpemUpKTsKIAogcWxhMjV4eF9md19kdW1wX2ZhaWxlZF8wOgogCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7CkBAIC0xMjk4LDYgKzEzMjQsMzMwIEBACiAJaWYgKCFoYXJkd2FyZV9sb2NrZWQpCiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7CiB9CisKK3ZvaWQKK3FsYTgxeHhfZndfZHVtcChzY3NpX3FsYV9ob3N0X3QgKnZoYSwgaW50IGhhcmR3YXJlX2xvY2tlZCkKK3sKKwlpbnQJCXJ2YWw7CisJdWludDMyX3QJY250OworCXVpbnQzMl90CXJpc2NfYWRkcmVzczsKKwlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKKwlzdHJ1Y3QgZGV2aWNlX3JlZ18yNHh4IF9faW9tZW0gKnJlZyA9ICZoYS0+aW9iYXNlLT5pc3AyNDsKKwl1aW50MzJfdCBfX2lvbWVtICpkbXBfcmVnOworCXVpbnQzMl90CSppdGVyX3JlZzsKKwl1aW50MTZfdCBfX2lvbWVtICptYnhfcmVnOworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisJc3RydWN0IHFsYTgxeHhfZndfZHVtcCAqZnc7CisJdWludDMyX3QJZXh0X21lbV9jbnQ7CisJdm9pZAkJKm54dCwgKm54dF9jaGFpbjsKKwl1aW50MzJfdAkqbGFzdF9jaGFpbiA9IE5VTEw7CisJc3RydWN0IHNjc2lfcWxhX2hvc3QgKmJhc2VfdmhhID0gcGNpX2dldF9kcnZkYXRhKGhhLT5wZGV2KTsKKworCXJpc2NfYWRkcmVzcyA9IGV4dF9tZW1fY250ID0gMDsKKwlmbGFncyA9IDA7CisKKwlpZiAoIWhhcmR3YXJlX2xvY2tlZCkKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmhhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7CisKKwlpZiAoIWhhLT5md19kdW1wKSB7CisJCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKKwkJICAgICJObyBidWZmZXIgYXZhaWxhYmxlIGZvciBkdW1wISEhXG4iKTsKKwkJZ290byBxbGE4MXh4X2Z3X2R1bXBfZmFpbGVkOworCX0KKworCWlmIChoYS0+ZndfZHVtcGVkKSB7CisJCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKKwkJICAgICJGaXJtd2FyZSBoYXMgYmVlbiBwcmV2aW91c2x5IGR1bXBlZCAoJXApIC0tIGlnbm9yaW5nICIKKwkJICAgICJyZXF1ZXN0Li4uXG4iLCBoYS0+ZndfZHVtcCk7CisJCWdvdG8gcWxhODF4eF9md19kdW1wX2ZhaWxlZDsKKwl9CisJZncgPSAmaGEtPmZ3X2R1bXAtPmlzcC5pc3A4MTsKKwlxbGEyeHh4X3ByZXBfZHVtcChoYSwgaGEtPmZ3X2R1bXApOworCisJZnctPmhvc3Rfc3RhdHVzID0gaHRvbmwoUkRfUkVHX0RXT1JEKCZyZWctPmhvc3Rfc3RhdHVzKSk7CisKKwkvKiBQYXVzZSBSSVNDLiAqLworCXJ2YWwgPSBxbGEyNHh4X3BhdXNlX3Jpc2MocmVnKTsKKwlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykKKwkJZ290byBxbGE4MXh4X2Z3X2R1bXBfZmFpbGVkXzA7CisKKwkvKiBIb3N0L1Jpc2MgcmVnaXN0ZXJzLiAqLworCWl0ZXJfcmVnID0gZnctPmhvc3RfcmlzY19yZWc7CisJaXRlcl9yZWcgPSBxbGEyNHh4X3JlYWRfd2luZG93KHJlZywgMHg3MDAwLCAxNiwgaXRlcl9yZWcpOworCXFsYTI0eHhfcmVhZF93aW5kb3cocmVnLCAweDcwMTAsIDE2LCBpdGVyX3JlZyk7CisKKwkvKiBQQ0llIHJlZ2lzdGVycy4gKi8KKwlXUlRfUkVHX0RXT1JEKCZyZWctPmlvYmFzZV9hZGRyLCAweDdDMDApOworCVJEX1JFR19EV09SRCgmcmVnLT5pb2Jhc2VfYWRkcik7CisJV1JUX1JFR19EV09SRCgmcmVnLT5pb2Jhc2Vfd2luZG93LCAweDAxKTsKKwlkbXBfcmVnID0gJnJlZy0+aW9iYXNlX2M0OworCWZ3LT5wY2llX3JlZ3NbMF0gPSBodG9ubChSRF9SRUdfRFdPUkQoZG1wX3JlZysrKSk7CisJZnctPnBjaWVfcmVnc1sxXSA9IGh0b25sKFJEX1JFR19EV09SRChkbXBfcmVnKyspKTsKKwlmdy0+cGNpZV9yZWdzWzJdID0gaHRvbmwoUkRfUkVHX0RXT1JEKGRtcF9yZWcpKTsKKwlmdy0+cGNpZV9yZWdzWzNdID0gaHRvbmwoUkRfUkVHX0RXT1JEKCZyZWctPmlvYmFzZV93aW5kb3cpKTsKKworCVdSVF9SRUdfRFdPUkQoJnJlZy0+aW9iYXNlX3dpbmRvdywgMHgwMCk7CisJUkRfUkVHX0RXT1JEKCZyZWctPmlvYmFzZV93aW5kb3cpOworCisJLyogSG9zdCBpbnRlcmZhY2UgcmVnaXN0ZXJzLiAqLworCWRtcF9yZWcgPSAmcmVnLT5mbGFzaF9hZGRyOworCWZvciAoY250ID0gMDsgY250IDwgc2l6ZW9mKGZ3LT5ob3N0X3JlZykgLyA0OyBjbnQrKykKKwkJZnctPmhvc3RfcmVnW2NudF0gPSBodG9ubChSRF9SRUdfRFdPUkQoZG1wX3JlZysrKSk7CisKKwkvKiBEaXNhYmxlIGludGVycnVwdHMuICovCisJV1JUX1JFR19EV09SRCgmcmVnLT5pY3RybCwgMCk7CisJUkRfUkVHX0RXT1JEKCZyZWctPmljdHJsKTsKKworCS8qIFNoYWRvdyByZWdpc3RlcnMuICovCisJV1JUX1JFR19EV09SRCgmcmVnLT5pb2Jhc2VfYWRkciwgMHgwRjcwKTsKKwlSRF9SRUdfRFdPUkQoJnJlZy0+aW9iYXNlX2FkZHIpOworCVdSVF9SRUdfRFdPUkQoJnJlZy0+aW9iYXNlX3NlbGVjdCwgMHhCMDAwMDAwMCk7CisJZnctPnNoYWRvd19yZWdbMF0gPSBodG9ubChSRF9SRUdfRFdPUkQoJnJlZy0+aW9iYXNlX3NkYXRhKSk7CisKKwlXUlRfUkVHX0RXT1JEKCZyZWctPmlvYmFzZV9zZWxlY3QsIDB4QjAxMDAwMDApOworCWZ3LT5zaGFkb3dfcmVnWzFdID0gaHRvbmwoUkRfUkVHX0RXT1JEKCZyZWctPmlvYmFzZV9zZGF0YSkpOworCisJV1JUX1JFR19EV09SRCgmcmVnLT5pb2Jhc2Vfc2VsZWN0LCAweEIwMjAwMDAwKTsKKwlmdy0+c2hhZG93X3JlZ1syXSA9IGh0b25sKFJEX1JFR19EV09SRCgmcmVnLT5pb2Jhc2Vfc2RhdGEpKTsKKworCVdSVF9SRUdfRFdPUkQoJnJlZy0+aW9iYXNlX3NlbGVjdCwgMHhCMDMwMDAwMCk7CisJZnctPnNoYWRvd19yZWdbM10gPSBodG9ubChSRF9SRUdfRFdPUkQoJnJlZy0+aW9iYXNlX3NkYXRhKSk7CisKKwlXUlRfUkVHX0RXT1JEKCZyZWctPmlvYmFzZV9zZWxlY3QsIDB4QjA0MDAwMDApOworCWZ3LT5zaGFkb3dfcmVnWzRdID0gaHRvbmwoUkRfUkVHX0RXT1JEKCZyZWctPmlvYmFzZV9zZGF0YSkpOworCisJV1JUX1JFR19EV09SRCgmcmVnLT5pb2Jhc2Vfc2VsZWN0LCAweEIwNTAwMDAwKTsKKwlmdy0+c2hhZG93X3JlZ1s1XSA9IGh0b25sKFJEX1JFR19EV09SRCgmcmVnLT5pb2Jhc2Vfc2RhdGEpKTsKKworCVdSVF9SRUdfRFdPUkQoJnJlZy0+aW9iYXNlX3NlbGVjdCwgMHhCMDYwMDAwMCk7CisJZnctPnNoYWRvd19yZWdbNl0gPSBodG9ubChSRF9SRUdfRFdPUkQoJnJlZy0+aW9iYXNlX3NkYXRhKSk7CisKKwlXUlRfUkVHX0RXT1JEKCZyZWctPmlvYmFzZV9zZWxlY3QsIDB4QjA3MDAwMDApOworCWZ3LT5zaGFkb3dfcmVnWzddID0gaHRvbmwoUkRfUkVHX0RXT1JEKCZyZWctPmlvYmFzZV9zZGF0YSkpOworCisJV1JUX1JFR19EV09SRCgmcmVnLT5pb2Jhc2Vfc2VsZWN0LCAweEIwODAwMDAwKTsKKwlmdy0+c2hhZG93X3JlZ1s4XSA9IGh0b25sKFJEX1JFR19EV09SRCgmcmVnLT5pb2Jhc2Vfc2RhdGEpKTsKKworCVdSVF9SRUdfRFdPUkQoJnJlZy0+aW9iYXNlX3NlbGVjdCwgMHhCMDkwMDAwMCk7CisJZnctPnNoYWRvd19yZWdbOV0gPSBodG9ubChSRF9SRUdfRFdPUkQoJnJlZy0+aW9iYXNlX3NkYXRhKSk7CisKKwlXUlRfUkVHX0RXT1JEKCZyZWctPmlvYmFzZV9zZWxlY3QsIDB4QjBBMDAwMDApOworCWZ3LT5zaGFkb3dfcmVnWzEwXSA9IGh0b25sKFJEX1JFR19EV09SRCgmcmVnLT5pb2Jhc2Vfc2RhdGEpKTsKKworCS8qIFJJU0MgSS9PIHJlZ2lzdGVyLiAqLworCVdSVF9SRUdfRFdPUkQoJnJlZy0+aW9iYXNlX2FkZHIsIDB4MDAxMCk7CisJZnctPnJpc2NfaW9fcmVnID0gaHRvbmwoUkRfUkVHX0RXT1JEKCZyZWctPmlvYmFzZV93aW5kb3cpKTsKKworCS8qIE1haWxib3ggcmVnaXN0ZXJzLiAqLworCW1ieF9yZWcgPSAmcmVnLT5tYWlsYm94MDsKKwlmb3IgKGNudCA9IDA7IGNudCA8IHNpemVvZihmdy0+bWFpbGJveF9yZWcpIC8gMjsgY250KyspCisJCWZ3LT5tYWlsYm94X3JlZ1tjbnRdID0gaHRvbnMoUkRfUkVHX1dPUkQobWJ4X3JlZysrKSk7CisKKwkvKiBUcmFuc2ZlciBzZXF1ZW5jZSByZWdpc3RlcnMuICovCisJaXRlcl9yZWcgPSBmdy0+eHNlcV9ncF9yZWc7CisJaXRlcl9yZWcgPSBxbGEyNHh4X3JlYWRfd2luZG93KHJlZywgMHhCRjAwLCAxNiwgaXRlcl9yZWcpOworCWl0ZXJfcmVnID0gcWxhMjR4eF9yZWFkX3dpbmRvdyhyZWcsIDB4QkYxMCwgMTYsIGl0ZXJfcmVnKTsKKwlpdGVyX3JlZyA9IHFsYTI0eHhfcmVhZF93aW5kb3cocmVnLCAweEJGMjAsIDE2LCBpdGVyX3JlZyk7CisJaXRlcl9yZWcgPSBxbGEyNHh4X3JlYWRfd2luZG93KHJlZywgMHhCRjMwLCAxNiwgaXRlcl9yZWcpOworCWl0ZXJfcmVnID0gcWxhMjR4eF9yZWFkX3dpbmRvdyhyZWcsIDB4QkY0MCwgMTYsIGl0ZXJfcmVnKTsKKwlpdGVyX3JlZyA9IHFsYTI0eHhfcmVhZF93aW5kb3cocmVnLCAweEJGNTAsIDE2LCBpdGVyX3JlZyk7CisJaXRlcl9yZWcgPSBxbGEyNHh4X3JlYWRfd2luZG93KHJlZywgMHhCRjYwLCAxNiwgaXRlcl9yZWcpOworCXFsYTI0eHhfcmVhZF93aW5kb3cocmVnLCAweEJGNzAsIDE2LCBpdGVyX3JlZyk7CisKKwlpdGVyX3JlZyA9IGZ3LT54c2VxXzBfcmVnOworCWl0ZXJfcmVnID0gcWxhMjR4eF9yZWFkX3dpbmRvdyhyZWcsIDB4QkZDMCwgMTYsIGl0ZXJfcmVnKTsKKwlpdGVyX3JlZyA9IHFsYTI0eHhfcmVhZF93aW5kb3cocmVnLCAweEJGRDAsIDE2LCBpdGVyX3JlZyk7CisJcWxhMjR4eF9yZWFkX3dpbmRvdyhyZWcsIDB4QkZFMCwgMTYsIGl0ZXJfcmVnKTsKKworCXFsYTI0eHhfcmVhZF93aW5kb3cocmVnLCAweEJGRjAsIDE2LCBmdy0+eHNlcV8xX3JlZyk7CisKKwkvKiBSZWNlaXZlIHNlcXVlbmNlIHJlZ2lzdGVycy4gKi8KKwlpdGVyX3JlZyA9IGZ3LT5yc2VxX2dwX3JlZzsKKwlpdGVyX3JlZyA9IHFsYTI0eHhfcmVhZF93aW5kb3cocmVnLCAweEZGMDAsIDE2LCBpdGVyX3JlZyk7CisJaXRlcl9yZWcgPSBxbGEyNHh4X3JlYWRfd2luZG93KHJlZywgMHhGRjEwLCAxNiwgaXRlcl9yZWcpOworCWl0ZXJfcmVnID0gcWxhMjR4eF9yZWFkX3dpbmRvdyhyZWcsIDB4RkYyMCwgMTYsIGl0ZXJfcmVnKTsKKwlpdGVyX3JlZyA9IHFsYTI0eHhfcmVhZF93aW5kb3cocmVnLCAweEZGMzAsIDE2LCBpdGVyX3JlZyk7CisJaXRlcl9yZWcgPSBxbGEyNHh4X3JlYWRfd2luZG93KHJlZywgMHhGRjQwLCAxNiwgaXRlcl9yZWcpOworCWl0ZXJfcmVnID0gcWxhMjR4eF9yZWFkX3dpbmRvdyhyZWcsIDB4RkY1MCwgMTYsIGl0ZXJfcmVnKTsKKwlpdGVyX3JlZyA9IHFsYTI0eHhfcmVhZF93aW5kb3cocmVnLCAweEZGNjAsIDE2LCBpdGVyX3JlZyk7CisJcWxhMjR4eF9yZWFkX3dpbmRvdyhyZWcsIDB4RkY3MCwgMTYsIGl0ZXJfcmVnKTsKKworCWl0ZXJfcmVnID0gZnctPnJzZXFfMF9yZWc7CisJaXRlcl9yZWcgPSBxbGEyNHh4X3JlYWRfd2luZG93KHJlZywgMHhGRkMwLCAxNiwgaXRlcl9yZWcpOworCXFsYTI0eHhfcmVhZF93aW5kb3cocmVnLCAweEZGRDAsIDE2LCBpdGVyX3JlZyk7CisKKwlxbGEyNHh4X3JlYWRfd2luZG93KHJlZywgMHhGRkUwLCAxNiwgZnctPnJzZXFfMV9yZWcpOworCXFsYTI0eHhfcmVhZF93aW5kb3cocmVnLCAweEZGRjAsIDE2LCBmdy0+cnNlcV8yX3JlZyk7CisKKwkvKiBBdXhpbGlhcnkgc2VxdWVuY2UgcmVnaXN0ZXJzLiAqLworCWl0ZXJfcmVnID0gZnctPmFzZXFfZ3BfcmVnOworCWl0ZXJfcmVnID0gcWxhMjR4eF9yZWFkX3dpbmRvdyhyZWcsIDB4QjAwMCwgMTYsIGl0ZXJfcmVnKTsKKwlpdGVyX3JlZyA9IHFsYTI0eHhfcmVhZF93aW5kb3cocmVnLCAweEIwMTAsIDE2LCBpdGVyX3JlZyk7CisJaXRlcl9yZWcgPSBxbGEyNHh4X3JlYWRfd2luZG93KHJlZywgMHhCMDIwLCAxNiwgaXRlcl9yZWcpOworCWl0ZXJfcmVnID0gcWxhMjR4eF9yZWFkX3dpbmRvdyhyZWcsIDB4QjAzMCwgMTYsIGl0ZXJfcmVnKTsKKwlpdGVyX3JlZyA9IHFsYTI0eHhfcmVhZF93aW5kb3cocmVnLCAweEIwNDAsIDE2LCBpdGVyX3JlZyk7CisJaXRlcl9yZWcgPSBxbGEyNHh4X3JlYWRfd2luZG93KHJlZywgMHhCMDUwLCAxNiwgaXRlcl9yZWcpOworCWl0ZXJfcmVnID0gcWxhMjR4eF9yZWFkX3dpbmRvdyhyZWcsIDB4QjA2MCwgMTYsIGl0ZXJfcmVnKTsKKwlxbGEyNHh4X3JlYWRfd2luZG93KHJlZywgMHhCMDcwLCAxNiwgaXRlcl9yZWcpOworCisJaXRlcl9yZWcgPSBmdy0+YXNlcV8wX3JlZzsKKwlpdGVyX3JlZyA9IHFsYTI0eHhfcmVhZF93aW5kb3cocmVnLCAweEIwQzAsIDE2LCBpdGVyX3JlZyk7CisJcWxhMjR4eF9yZWFkX3dpbmRvdyhyZWcsIDB4QjBEMCwgMTYsIGl0ZXJfcmVnKTsKKworCXFsYTI0eHhfcmVhZF93aW5kb3cocmVnLCAweEIwRTAsIDE2LCBmdy0+YXNlcV8xX3JlZyk7CisJcWxhMjR4eF9yZWFkX3dpbmRvdyhyZWcsIDB4QjBGMCwgMTYsIGZ3LT5hc2VxXzJfcmVnKTsKKworCS8qIENvbW1hbmQgRE1BIHJlZ2lzdGVycy4gKi8KKwlxbGEyNHh4X3JlYWRfd2luZG93KHJlZywgMHg3MTAwLCAxNiwgZnctPmNtZF9kbWFfcmVnKTsKKworCS8qIFF1ZXVlcy4gKi8KKwlpdGVyX3JlZyA9IGZ3LT5yZXEwX2RtYV9yZWc7CisJaXRlcl9yZWcgPSBxbGEyNHh4X3JlYWRfd2luZG93KHJlZywgMHg3MjAwLCA4LCBpdGVyX3JlZyk7CisJZG1wX3JlZyA9ICZyZWctPmlvYmFzZV9xOworCWZvciAoY250ID0gMDsgY250IDwgNzsgY250KyspCisJCSppdGVyX3JlZysrID0gaHRvbmwoUkRfUkVHX0RXT1JEKGRtcF9yZWcrKykpOworCisJaXRlcl9yZWcgPSBmdy0+cmVzcDBfZG1hX3JlZzsKKwlpdGVyX3JlZyA9IHFsYTI0eHhfcmVhZF93aW5kb3cocmVnLCAweDczMDAsIDgsIGl0ZXJfcmVnKTsKKwlkbXBfcmVnID0gJnJlZy0+aW9iYXNlX3E7CisJZm9yIChjbnQgPSAwOyBjbnQgPCA3OyBjbnQrKykKKwkJKml0ZXJfcmVnKysgPSBodG9ubChSRF9SRUdfRFdPUkQoZG1wX3JlZysrKSk7CisKKwlpdGVyX3JlZyA9IGZ3LT5yZXExX2RtYV9yZWc7CisJaXRlcl9yZWcgPSBxbGEyNHh4X3JlYWRfd2luZG93KHJlZywgMHg3NDAwLCA4LCBpdGVyX3JlZyk7CisJZG1wX3JlZyA9ICZyZWctPmlvYmFzZV9xOworCWZvciAoY250ID0gMDsgY250IDwgNzsgY250KyspCisJCSppdGVyX3JlZysrID0gaHRvbmwoUkRfUkVHX0RXT1JEKGRtcF9yZWcrKykpOworCisJLyogVHJhbnNtaXQgRE1BIHJlZ2lzdGVycy4gKi8KKwlpdGVyX3JlZyA9IGZ3LT54bXQwX2RtYV9yZWc7CisJaXRlcl9yZWcgPSBxbGEyNHh4X3JlYWRfd2luZG93KHJlZywgMHg3NjAwLCAxNiwgaXRlcl9yZWcpOworCXFsYTI0eHhfcmVhZF93aW5kb3cocmVnLCAweDc2MTAsIDE2LCBpdGVyX3JlZyk7CisKKwlpdGVyX3JlZyA9IGZ3LT54bXQxX2RtYV9yZWc7CisJaXRlcl9yZWcgPSBxbGEyNHh4X3JlYWRfd2luZG93KHJlZywgMHg3NjIwLCAxNiwgaXRlcl9yZWcpOworCXFsYTI0eHhfcmVhZF93aW5kb3cocmVnLCAweDc2MzAsIDE2LCBpdGVyX3JlZyk7CisKKwlpdGVyX3JlZyA9IGZ3LT54bXQyX2RtYV9yZWc7CisJaXRlcl9yZWcgPSBxbGEyNHh4X3JlYWRfd2luZG93KHJlZywgMHg3NjQwLCAxNiwgaXRlcl9yZWcpOworCXFsYTI0eHhfcmVhZF93aW5kb3cocmVnLCAweDc2NTAsIDE2LCBpdGVyX3JlZyk7CisKKwlpdGVyX3JlZyA9IGZ3LT54bXQzX2RtYV9yZWc7CisJaXRlcl9yZWcgPSBxbGEyNHh4X3JlYWRfd2luZG93KHJlZywgMHg3NjYwLCAxNiwgaXRlcl9yZWcpOworCXFsYTI0eHhfcmVhZF93aW5kb3cocmVnLCAweDc2NzAsIDE2LCBpdGVyX3JlZyk7CisKKwlpdGVyX3JlZyA9IGZ3LT54bXQ0X2RtYV9yZWc7CisJaXRlcl9yZWcgPSBxbGEyNHh4X3JlYWRfd2luZG93KHJlZywgMHg3NjgwLCAxNiwgaXRlcl9yZWcpOworCXFsYTI0eHhfcmVhZF93aW5kb3cocmVnLCAweDc2OTAsIDE2LCBpdGVyX3JlZyk7CisKKwlxbGEyNHh4X3JlYWRfd2luZG93KHJlZywgMHg3NkEwLCAxNiwgZnctPnhtdF9kYXRhX2RtYV9yZWcpOworCisJLyogUmVjZWl2ZSBETUEgcmVnaXN0ZXJzLiAqLworCWl0ZXJfcmVnID0gZnctPnJjdnQwX2RhdGFfZG1hX3JlZzsKKwlpdGVyX3JlZyA9IHFsYTI0eHhfcmVhZF93aW5kb3cocmVnLCAweDc3MDAsIDE2LCBpdGVyX3JlZyk7CisJcWxhMjR4eF9yZWFkX3dpbmRvdyhyZWcsIDB4NzcxMCwgMTYsIGl0ZXJfcmVnKTsKKworCWl0ZXJfcmVnID0gZnctPnJjdnQxX2RhdGFfZG1hX3JlZzsKKwlpdGVyX3JlZyA9IHFsYTI0eHhfcmVhZF93aW5kb3cocmVnLCAweDc3MjAsIDE2LCBpdGVyX3JlZyk7CisJcWxhMjR4eF9yZWFkX3dpbmRvdyhyZWcsIDB4NzczMCwgMTYsIGl0ZXJfcmVnKTsKKworCS8qIFJJU0MgcmVnaXN0ZXJzLiAqLworCWl0ZXJfcmVnID0gZnctPnJpc2NfZ3BfcmVnOworCWl0ZXJfcmVnID0gcWxhMjR4eF9yZWFkX3dpbmRvdyhyZWcsIDB4MEYwMCwgMTYsIGl0ZXJfcmVnKTsKKwlpdGVyX3JlZyA9IHFsYTI0eHhfcmVhZF93aW5kb3cocmVnLCAweDBGMTAsIDE2LCBpdGVyX3JlZyk7CisJaXRlcl9yZWcgPSBxbGEyNHh4X3JlYWRfd2luZG93KHJlZywgMHgwRjIwLCAxNiwgaXRlcl9yZWcpOworCWl0ZXJfcmVnID0gcWxhMjR4eF9yZWFkX3dpbmRvdyhyZWcsIDB4MEYzMCwgMTYsIGl0ZXJfcmVnKTsKKwlpdGVyX3JlZyA9IHFsYTI0eHhfcmVhZF93aW5kb3cocmVnLCAweDBGNDAsIDE2LCBpdGVyX3JlZyk7CisJaXRlcl9yZWcgPSBxbGEyNHh4X3JlYWRfd2luZG93KHJlZywgMHgwRjUwLCAxNiwgaXRlcl9yZWcpOworCWl0ZXJfcmVnID0gcWxhMjR4eF9yZWFkX3dpbmRvdyhyZWcsIDB4MEY2MCwgMTYsIGl0ZXJfcmVnKTsKKwlxbGEyNHh4X3JlYWRfd2luZG93KHJlZywgMHgwRjcwLCAxNiwgaXRlcl9yZWcpOworCisJLyogTG9jYWwgbWVtb3J5IGNvbnRyb2xsZXIgcmVnaXN0ZXJzLiAqLworCWl0ZXJfcmVnID0gZnctPmxtY19yZWc7CisJaXRlcl9yZWcgPSBxbGEyNHh4X3JlYWRfd2luZG93KHJlZywgMHgzMDAwLCAxNiwgaXRlcl9yZWcpOworCWl0ZXJfcmVnID0gcWxhMjR4eF9yZWFkX3dpbmRvdyhyZWcsIDB4MzAxMCwgMTYsIGl0ZXJfcmVnKTsKKwlpdGVyX3JlZyA9IHFsYTI0eHhfcmVhZF93aW5kb3cocmVnLCAweDMwMjAsIDE2LCBpdGVyX3JlZyk7CisJaXRlcl9yZWcgPSBxbGEyNHh4X3JlYWRfd2luZG93KHJlZywgMHgzMDMwLCAxNiwgaXRlcl9yZWcpOworCWl0ZXJfcmVnID0gcWxhMjR4eF9yZWFkX3dpbmRvdyhyZWcsIDB4MzA0MCwgMTYsIGl0ZXJfcmVnKTsKKwlpdGVyX3JlZyA9IHFsYTI0eHhfcmVhZF93aW5kb3cocmVnLCAweDMwNTAsIDE2LCBpdGVyX3JlZyk7CisJaXRlcl9yZWcgPSBxbGEyNHh4X3JlYWRfd2luZG93KHJlZywgMHgzMDYwLCAxNiwgaXRlcl9yZWcpOworCXFsYTI0eHhfcmVhZF93aW5kb3cocmVnLCAweDMwNzAsIDE2LCBpdGVyX3JlZyk7CisKKwkvKiBGaWJyZSBQcm90b2NvbCBNb2R1bGUgcmVnaXN0ZXJzLiAqLworCWl0ZXJfcmVnID0gZnctPmZwbV9oZHdfcmVnOworCWl0ZXJfcmVnID0gcWxhMjR4eF9yZWFkX3dpbmRvdyhyZWcsIDB4NDAwMCwgMTYsIGl0ZXJfcmVnKTsKKwlpdGVyX3JlZyA9IHFsYTI0eHhfcmVhZF93aW5kb3cocmVnLCAweDQwMTAsIDE2LCBpdGVyX3JlZyk7CisJaXRlcl9yZWcgPSBxbGEyNHh4X3JlYWRfd2luZG93KHJlZywgMHg0MDIwLCAxNiwgaXRlcl9yZWcpOworCWl0ZXJfcmVnID0gcWxhMjR4eF9yZWFkX3dpbmRvdyhyZWcsIDB4NDAzMCwgMTYsIGl0ZXJfcmVnKTsKKwlpdGVyX3JlZyA9IHFsYTI0eHhfcmVhZF93aW5kb3cocmVnLCAweDQwNDAsIDE2LCBpdGVyX3JlZyk7CisJaXRlcl9yZWcgPSBxbGEyNHh4X3JlYWRfd2luZG93KHJlZywgMHg0MDUwLCAxNiwgaXRlcl9yZWcpOworCWl0ZXJfcmVnID0gcWxhMjR4eF9yZWFkX3dpbmRvdyhyZWcsIDB4NDA2MCwgMTYsIGl0ZXJfcmVnKTsKKwlpdGVyX3JlZyA9IHFsYTI0eHhfcmVhZF93aW5kb3cocmVnLCAweDQwNzAsIDE2LCBpdGVyX3JlZyk7CisJaXRlcl9yZWcgPSBxbGEyNHh4X3JlYWRfd2luZG93KHJlZywgMHg0MDgwLCAxNiwgaXRlcl9yZWcpOworCWl0ZXJfcmVnID0gcWxhMjR4eF9yZWFkX3dpbmRvdyhyZWcsIDB4NDA5MCwgMTYsIGl0ZXJfcmVnKTsKKwlpdGVyX3JlZyA9IHFsYTI0eHhfcmVhZF93aW5kb3cocmVnLCAweDQwQTAsIDE2LCBpdGVyX3JlZyk7CisJaXRlcl9yZWcgPSBxbGEyNHh4X3JlYWRfd2luZG93KHJlZywgMHg0MEIwLCAxNiwgaXRlcl9yZWcpOworCWl0ZXJfcmVnID0gcWxhMjR4eF9yZWFkX3dpbmRvdyhyZWcsIDB4NDBDMCwgMTYsIGl0ZXJfcmVnKTsKKwlxbGEyNHh4X3JlYWRfd2luZG93KHJlZywgMHg0MEQwLCAxNiwgaXRlcl9yZWcpOworCisJLyogRnJhbWUgQnVmZmVyIHJlZ2lzdGVycy4gKi8KKwlpdGVyX3JlZyA9IGZ3LT5mYl9oZHdfcmVnOworCWl0ZXJfcmVnID0gcWxhMjR4eF9yZWFkX3dpbmRvdyhyZWcsIDB4NjAwMCwgMTYsIGl0ZXJfcmVnKTsKKwlpdGVyX3JlZyA9IHFsYTI0eHhfcmVhZF93aW5kb3cocmVnLCAweDYwMTAsIDE2LCBpdGVyX3JlZyk7CisJaXRlcl9yZWcgPSBxbGEyNHh4X3JlYWRfd2luZG93KHJlZywgMHg2MDIwLCAxNiwgaXRlcl9yZWcpOworCWl0ZXJfcmVnID0gcWxhMjR4eF9yZWFkX3dpbmRvdyhyZWcsIDB4NjAzMCwgMTYsIGl0ZXJfcmVnKTsKKwlpdGVyX3JlZyA9IHFsYTI0eHhfcmVhZF93aW5kb3cocmVnLCAweDYwNDAsIDE2LCBpdGVyX3JlZyk7CisJaXRlcl9yZWcgPSBxbGEyNHh4X3JlYWRfd2luZG93KHJlZywgMHg2MTAwLCAxNiwgaXRlcl9yZWcpOworCWl0ZXJfcmVnID0gcWxhMjR4eF9yZWFkX3dpbmRvdyhyZWcsIDB4NjEzMCwgMTYsIGl0ZXJfcmVnKTsKKwlpdGVyX3JlZyA9IHFsYTI0eHhfcmVhZF93aW5kb3cocmVnLCAweDYxNTAsIDE2LCBpdGVyX3JlZyk7CisJaXRlcl9yZWcgPSBxbGEyNHh4X3JlYWRfd2luZG93KHJlZywgMHg2MTcwLCAxNiwgaXRlcl9yZWcpOworCWl0ZXJfcmVnID0gcWxhMjR4eF9yZWFkX3dpbmRvdyhyZWcsIDB4NjE5MCwgMTYsIGl0ZXJfcmVnKTsKKwlpdGVyX3JlZyA9IHFsYTI0eHhfcmVhZF93aW5kb3cocmVnLCAweDYxQjAsIDE2LCBpdGVyX3JlZyk7CisJaXRlcl9yZWcgPSBxbGEyNHh4X3JlYWRfd2luZG93KHJlZywgMHg2MUMwLCAxNiwgaXRlcl9yZWcpOworCXFsYTI0eHhfcmVhZF93aW5kb3cocmVnLCAweDZGMDAsIDE2LCBpdGVyX3JlZyk7CisKKwkvKiBNdWx0aSBxdWV1ZSByZWdpc3RlcnMgKi8KKwlueHRfY2hhaW4gPSBxbGEyNXh4X2NvcHlfbXEoaGEsICh2b2lkICopaGEtPmZ3X2R1bXAgKyBoYS0+Y2hhaW5fb2Zmc2V0LAorCSAgICAmbGFzdF9jaGFpbik7CisKKwlydmFsID0gcWxhMjR4eF9zb2Z0X3Jlc2V0KGhhKTsKKwlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykKKwkJZ290byBxbGE4MXh4X2Z3X2R1bXBfZmFpbGVkXzA7CisKKwlydmFsID0gcWxhMjR4eF9kdW1wX21lbW9yeShoYSwgZnctPmNvZGVfcmFtLCBzaXplb2YoZnctPmNvZGVfcmFtKSwKKwkgICAgJm54dCk7CisJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpCisJCWdvdG8gcWxhODF4eF9md19kdW1wX2ZhaWxlZF8wOworCisJbnh0ID0gcWxhMnh4eF9jb3B5X3F1ZXVlcyhoYSwgbnh0KTsKKworCW54dCA9IHFsYTI0eHhfY29weV9lZnQoaGEsIG54dCk7CisKKwkvKiBDaGFpbiBlbnRyaWVzIC0tIHN0YXJ0ZWQgd2l0aCBNUS4gKi8KKwlxbGEyNXh4X2NvcHlfZmNlKGhhLCBueHRfY2hhaW4sICZsYXN0X2NoYWluKTsKKwlpZiAobGFzdF9jaGFpbikgeworCQloYS0+ZndfZHVtcC0+dmVyc2lvbiB8PSBfX2NvbnN0YW50X2h0b25sKERVTVBfQ0hBSU5fVkFSSUFOVCk7CisJCSpsYXN0X2NoYWluIHw9IF9fY29uc3RhbnRfaHRvbmwoRFVNUF9DSEFJTl9MQVNUKTsKKwl9CisKK3FsYTgxeHhfZndfZHVtcF9mYWlsZWRfMDoKKwlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgeworCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCisJCSAgICAiRmFpbGVkIHRvIGR1bXAgZmlybXdhcmUgKCV4KSEhIVxuIiwgcnZhbCk7CisJCWhhLT5md19kdW1wZWQgPSAwOworCisJfSBlbHNlIHsKKwkJcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLAorCQkgICAgIkZpcm13YXJlIGR1bXAgc2F2ZWQgdG8gdGVtcCBidWZmZXIgKCVsZC8lcCkuXG4iLAorCQkgICAgYmFzZV92aGEtPmhvc3Rfbm8sIGhhLT5md19kdW1wKTsKKwkJaGEtPmZ3X2R1bXBlZCA9IDE7CisJfQorCitxbGE4MXh4X2Z3X2R1bXBfZmFpbGVkOgorCWlmICghaGFyZHdhcmVfbG9ja2VkKQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOworfQorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgIERyaXZlciBEZWJ1ZyBGdW5jdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZGJnLmggYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZGJnLmgKaW5kZXggYzE3OTRhNy4uZjY2MGRkNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2RiZy5oCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9kYmcuaApAQCAtMjUxLDYgKzI1MSw0NSBAQAogCXVpbnQzMl90IGV4dF9tZW1bMV07CiB9OwogCitzdHJ1Y3QgcWxhODF4eF9md19kdW1wIHsKKwl1aW50MzJfdCBob3N0X3N0YXR1czsKKwl1aW50MzJfdCBob3N0X3Jpc2NfcmVnWzMyXTsKKwl1aW50MzJfdCBwY2llX3JlZ3NbNF07CisJdWludDMyX3QgaG9zdF9yZWdbMzJdOworCXVpbnQzMl90IHNoYWRvd19yZWdbMTFdOworCXVpbnQzMl90IHJpc2NfaW9fcmVnOworCXVpbnQxNl90IG1haWxib3hfcmVnWzMyXTsKKwl1aW50MzJfdCB4c2VxX2dwX3JlZ1sxMjhdOworCXVpbnQzMl90IHhzZXFfMF9yZWdbNDhdOworCXVpbnQzMl90IHhzZXFfMV9yZWdbMTZdOworCXVpbnQzMl90IHJzZXFfZ3BfcmVnWzEyOF07CisJdWludDMyX3QgcnNlcV8wX3JlZ1szMl07CisJdWludDMyX3QgcnNlcV8xX3JlZ1sxNl07CisJdWludDMyX3QgcnNlcV8yX3JlZ1sxNl07CisJdWludDMyX3QgYXNlcV9ncF9yZWdbMTI4XTsKKwl1aW50MzJfdCBhc2VxXzBfcmVnWzMyXTsKKwl1aW50MzJfdCBhc2VxXzFfcmVnWzE2XTsKKwl1aW50MzJfdCBhc2VxXzJfcmVnWzE2XTsKKwl1aW50MzJfdCBjbWRfZG1hX3JlZ1sxNl07CisJdWludDMyX3QgcmVxMF9kbWFfcmVnWzE1XTsKKwl1aW50MzJfdCByZXNwMF9kbWFfcmVnWzE1XTsKKwl1aW50MzJfdCByZXExX2RtYV9yZWdbMTVdOworCXVpbnQzMl90IHhtdDBfZG1hX3JlZ1szMl07CisJdWludDMyX3QgeG10MV9kbWFfcmVnWzMyXTsKKwl1aW50MzJfdCB4bXQyX2RtYV9yZWdbMzJdOworCXVpbnQzMl90IHhtdDNfZG1hX3JlZ1szMl07CisJdWludDMyX3QgeG10NF9kbWFfcmVnWzMyXTsKKwl1aW50MzJfdCB4bXRfZGF0YV9kbWFfcmVnWzE2XTsKKwl1aW50MzJfdCByY3Z0MF9kYXRhX2RtYV9yZWdbMzJdOworCXVpbnQzMl90IHJjdnQxX2RhdGFfZG1hX3JlZ1szMl07CisJdWludDMyX3QgcmlzY19ncF9yZWdbMTI4XTsKKwl1aW50MzJfdCBsbWNfcmVnWzEyOF07CisJdWludDMyX3QgZnBtX2hkd19yZWdbMjI0XTsKKwl1aW50MzJfdCBmYl9oZHdfcmVnWzIwOF07CisJdWludDMyX3QgY29kZV9yYW1bMHgyMDAwXTsKKwl1aW50MzJfdCBleHRfbWVtWzFdOworfTsKKwogI2RlZmluZSBFRlRfTlVNX0JVRkZFUlMJCTQKICNkZWZpbmUgRUZUX0JZVEVTX1BFUl9CVUZGRVIJMHg0MDAwCiAjZGVmaW5lIEVGVF9TSVpFCQkoKEVGVF9CWVRFU19QRVJfQlVGRkVSKSAqIChFRlRfTlVNX0JVRkZFUlMpKQpAQCAtMzEzLDUgKzM1Miw2IEBACiAJCXN0cnVjdCBxbGEyMzAwX2Z3X2R1bXAgaXNwMjM7CiAJCXN0cnVjdCBxbGEyNHh4X2Z3X2R1bXAgaXNwMjQ7CiAJCXN0cnVjdCBxbGEyNXh4X2Z3X2R1bXAgaXNwMjU7CisJCXN0cnVjdCBxbGE4MXh4X2Z3X2R1bXAgaXNwODE7CiAJfSBpc3A7CiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2RlZi5oIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2RlZi5oCmluZGV4IGEyOWM5NTIuLjAyM2VlNzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9kZWYuaAorKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZGVmLmgKQEAgLTE4Nyw3ICsxODcsNiBAQAogICogU0NTSSBSZXF1ZXN0IEJsb2NrCiAgKi8KIHR5cGVkZWYgc3RydWN0IHNyYiB7Ci0Jc3RydWN0IHNjc2lfcWxhX2hvc3QgKnZoYTsJLyogSEEgdGhlIFNQIGlzIHF1ZXVlZCBvbiAqLwogCXN0cnVjdCByZXFfcXVlICpxdWU7CiAJc3RydWN0IGZjX3BvcnQgKmZjcG9ydDsKIApAQCAtMjEzNiw3ICsyMTM1LDYgQEAKIC8qIFdvcmsgZXZlbnRzLiAgKi8KIGVudW0gcWxhX3dvcmtfdHlwZSB7CiAJUUxBX0VWVF9BRU4sCi0JUUxBX0VWVF9IV0VfTE9HLAogfTsKIAogCkBAIC0yMTUxLDEwICsyMTQ5LDYgQEAKIAkJCWVudW0gZmNfaG9zdF9ldmVudF9jb2RlIGNvZGU7CiAJCQl1MzIgZGF0YTsKIAkJfSBhZW47Ci0JCXN0cnVjdCB7Ci0JCQl1aW50MTZfdCBjb2RlOwotCQkJdWludDE2X3QgZDEsIGQyLCBkMzsKLQkJfSBod2U7CiAJfSB1OwogfTsKIApAQCAtMjMwOSw2ICsyMzAzLDcgQEAKICNkZWZpbmUgUE9SVF9TUEVFRF8yR0IgIDB4MDEKICNkZWZpbmUgUE9SVF9TUEVFRF80R0IgIDB4MDMKICNkZWZpbmUgUE9SVF9TUEVFRF84R0IgIDB4MDQKKyNkZWZpbmUgUE9SVF9TUEVFRF8xMEdCCTB4MTMKIAl1aW50MTZfdAlsaW5rX2RhdGFfcmF0ZTsgICAgICAgICAvKiBGL1cgb3BlcmF0aW5nIHNwZWVkICovCiAKIAl1aW50OF90CQljdXJyZW50X3RvcG9sb2d5OwpAQCAtMjMyOCw2ICsyMzIzLDcgQEAKIAogI2RlZmluZSBQQ0lfREVWSUNFX0lEX1FMT0dJQ19JU1AyNTMyICAgIDB4MjUzMgogI2RlZmluZSBQQ0lfREVWSUNFX0lEX1FMT0dJQ19JU1A4NDMyICAgIDB4ODQzMgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1FMT0dJQ19JU1A4MDAxCTB4ODAwMQogCXVpbnQzMl90CWRldmljZV90eXBlOwogI2RlZmluZSBEVF9JU1AyMTAwICAgICAgICAgICAgICAgICAgICAgIEJJVF8wCiAjZGVmaW5lIERUX0lTUDIyMDAgICAgICAgICAgICAgICAgICAgICAgQklUXzEKQEAgLTIzNDIsNyArMjMzOCw4IEBACiAjZGVmaW5lIERUX0lTUDU0MzIgICAgICAgICAgICAgICAgICAgICAgQklUXzEwCiAjZGVmaW5lIERUX0lTUDI1MzIgICAgICAgICAgICAgICAgICAgICAgQklUXzExCiAjZGVmaW5lIERUX0lTUDg0MzIgICAgICAgICAgICAgICAgICAgICAgQklUXzEyCi0jZGVmaW5lIERUX0lTUF9MQVNUICAgICAgICAgICAgICAgICAgICAgKERUX0lTUDg0MzIgPDwgMSkKKyNkZWZpbmUgRFRfSVNQODAwMQkJCUJJVF8xMworI2RlZmluZSBEVF9JU1BfTEFTVAkJCShEVF9JU1A4MDAxIDw8IDEpCiAKICNkZWZpbmUgRFRfSUlETUEgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMjYKICNkZWZpbmUgRFRfRldJMiAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMjcKQEAgLTIzNjQsNiArMjM2MSw3IEBACiAjZGVmaW5lIElTX1FMQTU0MzIoaGEpICAoRFRfTUFTSyhoYSkgJiBEVF9JU1A1NDMyKQogI2RlZmluZSBJU19RTEEyNTMyKGhhKSAgKERUX01BU0soaGEpICYgRFRfSVNQMjUzMikKICNkZWZpbmUgSVNfUUxBODQzMihoYSkgIChEVF9NQVNLKGhhKSAmIERUX0lTUDg0MzIpCisjZGVmaW5lIElTX1FMQTgwMDEoaGEpCShEVF9NQVNLKGhhKSAmIERUX0lTUDgwMDEpCiAKICNkZWZpbmUgSVNfUUxBMjNYWChoYSkgIChJU19RTEEyMzAwKGhhKSB8fCBJU19RTEEyMzEyKGhhKSB8fCBJU19RTEEyMzIyKGhhKSB8fCBcCiAJCQlJU19RTEE2MzEyKGhhKSB8fCBJU19RTEE2MzIyKGhhKSkKQEAgLTIzNzMsOCArMjM3MSwxMSBAQAogI2RlZmluZSBJU19RTEE4NFhYKGhhKSAgKElTX1FMQTg0MzIoaGEpKQogI2RlZmluZSBJU19RTEEyNFhYX1RZUEUoaGEpICAgICAoSVNfUUxBMjRYWChoYSkgfHwgSVNfUUxBNTRYWChoYSkgfHwgXAogCQkJCUlTX1FMQTg0WFgoaGEpKQorI2RlZmluZSBJU19RTEE4MVhYKGhhKQkJKElTX1FMQTgwMDEoaGEpKQogI2RlZmluZSBJU19RTEEyWFhYX01JRFRZUEUoaGEpCShJU19RTEEyNFhYKGhhKSB8fCBJU19RTEE4NFhYKGhhKSB8fCBcCi0JCQkJSVNfUUxBMjVYWChoYSkpCisJCQkJSVNfUUxBMjVYWChoYSkgfHwgSVNfUUxBODFYWChoYSkpCisjZGVmaW5lIElTX05PUE9MTElOR19UWVBFKGhhKQkoKElTX1FMQTI1WFgoaGEpIHx8IElTX1FMQTgxWFgoaGEpKSAmJiBcCisJCQkJKGhhKS0+ZmxhZ3MubXNpeF9lbmFibGVkKQogCiAjZGVmaW5lIElTX0lJRE1BX0NBUEFCTEUoaGEpICAgICgoaGEpLT5kZXZpY2VfdHlwZSAmIERUX0lJRE1BKQogI2RlZmluZSBJU19GV0kyX0NBUEFCTEUoaGEpICAgICAoKGhhKS0+ZGV2aWNlX3R5cGUgJiBEVF9GV0kyKQpAQCAtMjQ3Miw2ICsyNDczLDkgQEAKIAl1aW50OF90CQlmd19zZXJpYWxsaW5rX29wdGlvbnNbNF07CiAJdWludDE2X3QJZndfc2VyaWFsbGlua19vcHRpb25zMjRbNF07CiAKKwl1aW50OF90CQltcGlfdmVyc2lvbls0XTsKKwl1aW50MzJfdAltcGlfY2FwYWJpbGl0aWVzOworCiAJLyogRmlybXdhcmUgZHVtcCBpbmZvcm1hdGlvbi4gKi8KIAlzdHJ1Y3QgcWxhMnh4eF9md19kdW1wICpmd19kdW1wOwogCXVpbnQzMl90CWZ3X2R1bXBfbGVuOwpAQCAtMjQ4MCw2ICsyNDg0LDcgQEAKIAlkbWFfYWRkcl90CWVmdF9kbWE7CiAJdm9pZAkJKmVmdDsKIAorCXVpbnQzMl90CWNoYWluX29mZnNldDsKIAlzdHJ1Y3QgZGVudHJ5ICpkZnNfZGlyOwogCXN0cnVjdCBkZW50cnkgKmRmc19mY2U7CiAJZG1hX2FkZHJfdAlmY2VfZG1hOwpAQCAtMjQ4OSwxMCArMjQ5NCw2IEBACiAJdWludDY0X3QJZmNlX3dyLCBmY2VfcmQ7CiAJc3RydWN0IG11dGV4CWZjZV9tdXRleDsKIAotCXVpbnQzMl90CWh3X2V2ZW50X3N0YXJ0OwotCXVpbnQzMl90CWh3X2V2ZW50X3B0cjsKLQl1aW50MzJfdAlod19ldmVudF9wYXVzZV9lcnJvcnM7Ci0KIAl1aW50MzJfdAlwY2lfYXR0cjsKIAl1aW50MTZfdAljaGlwX3JldmlzaW9uOwogCkBAIC0yNTIyLDYgKzI1MjMsMTIgQEAKIAl1aW50OF90IAlmY29kZV9yZXZpc2lvblsxNl07CiAJdWludDMyX3QJZndfcmV2aXNpb25bNF07CiAKKwkvKiBPZmZzZXRzIGZvciBmbGFzaC9udnJhbSBhY2Nlc3MgKHNldCB0byB+MCBpZiBub3QgdXNlZCkuICovCisJdWludDMyX3QJZmxhc2hfY29uZl9vZmY7CisJdWludDMyX3QJZmxhc2hfZGF0YV9vZmY7CisJdWludDMyX3QJbnZyYW1fY29uZl9vZmY7CisJdWludDMyX3QJbnZyYW1fZGF0YV9vZmY7CisKIAl1aW50MzJfdAlmZHRfd3J0X2Rpc2FibGU7CiAJdWludDMyX3QJZmR0X2VyYXNlX2NtZDsKIAl1aW50MzJfdAlmZHRfYmxvY2tfc2l6ZTsKQEAgLTI1MzMsNyArMjU0MCw2IEBACiAJdWludDMyX3QgICAgICAgIGZsdF9yZWdpb25fYm9vdDsKIAl1aW50MzJfdCAgICAgICAgZmx0X3JlZ2lvbl9mdzsKIAl1aW50MzJfdCAgICAgICAgZmx0X3JlZ2lvbl92cGRfbnZyYW07Ci0JdWludDMyX3QgICAgICAgIGZsdF9yZWdpb25faHdfZXZlbnQ7CiAJdWludDMyX3QgICAgICAgIGZsdF9yZWdpb25fbnBpdl9jb25mOwogCiAJLyogTmVlZGVkIGZvciBCRUFDT04gKi8KQEAgLTI3MzcsNiArMjc0Myw3IEBACiAjZGVmaW5lIE9QVFJPTV9TSVpFXzIzMjIJMHgxMDAwMDAKICNkZWZpbmUgT1BUUk9NX1NJWkVfMjRYWAkweDEwMDAwMAogI2RlZmluZSBPUFRST01fU0laRV8yNVhYCTB4MjAwMDAwCisjZGVmaW5lIE9QVFJPTV9TSVpFXzgxWFgJMHg0MDAwMDAKIAogI2luY2x1ZGUgInFsYV9nYmwuaCIKICNpbmNsdWRlICJxbGFfZGJnLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZGZzLmMgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZGZzLmMKaW5kZXggMGUzNjZhMS4uYzY2MDM2ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2Rmcy5jCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9kZnMuYwpAQCAtMTEzLDcgKzExMyw4IEBACiBxbGEyeDAwX2Rmc19zZXR1cChzY3NpX3FsYV9ob3N0X3QgKnZoYSkKIHsKIAlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKLQlpZiAoIUlTX1FMQTI1WFgoaGEpKQorCisJaWYgKCFJU19RTEEyNVhYKGhhKSAmJiAhSVNfUUxBODFYWChoYSkpCiAJCWdvdG8gb3V0OwogCWlmICghaGEtPmZjZSkKIAkJZ290byBvdXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZncuaCBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9mdy5oCmluZGV4IGVlMWYxZTcuLjdhYmIwNDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9mdy5oCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9mdy5oCkBAIC0xMjE1LDkgKzEyMTUsMTAgQEAKIAogc3RydWN0IHFsYV9mbHRfbG9jYXRpb24gewogCXVpbnQ4X3Qgc2lnWzRdOwotCXVpbnQzMl90IHN0YXJ0X2xvOwotCXVpbnQzMl90IHN0YXJ0X2hpOwotCXVpbnQxNl90IHVudXNlZDsKKwl1aW50MTZfdCBzdGFydF9sbzsKKwl1aW50MTZfdCBzdGFydF9oaTsKKwl1aW50OF90IHZlcnNpb247CisJdWludDhfdCB1bnVzZWRbNV07CiAJdWludDE2X3QgY2hlY2tzdW07CiB9OwogCkBAIC0xMzkwLDQgKzEzOTEsMjkxIEBACiAKIAl1aW50MzJfdCByZXNlcnZlZFsxMl07CiB9OworCisvKiA4MVhYIFN1cHBvcnQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgTUJBX0RDQlhfU1RBUlQJCTB4ODAxNgorI2RlZmluZSBNQkFfRENCWF9DT01QTEVURQkweDgwMzAKKyNkZWZpbmUgTUJBX0ZDRl9DT05GX0VSUgkweDgwMzEKKyNkZWZpbmUgTUJBX0RDQlhfUEFSQU1fVVBEQVRFCTB4ODAzMgorI2RlZmluZSBNQkFfSURDX0NPTVBMRVRFCTB4ODEwMAorI2RlZmluZSBNQkFfSURDX05PVElGWQkJMHg4MTAxCisjZGVmaW5lIE1CQV9JRENfVElNRV9FWFQJMHg4MTAyCisKK3N0cnVjdCBudnJhbV84MXh4IHsKKwkvKiBOVlJBTSBoZWFkZXIuICovCisJdWludDhfdCBpZFs0XTsKKwl1aW50MTZfdCBudnJhbV92ZXJzaW9uOworCXVpbnQxNl90IHJlc2VydmVkXzA7CisKKwkvKiBGaXJtd2FyZSBJbml0aWFsaXphdGlvbiBDb250cm9sIEJsb2NrLiAqLworCXVpbnQxNl90IHZlcnNpb247CisJdWludDE2X3QgcmVzZXJ2ZWRfMTsKKwl1aW50MTZfdCBmcmFtZV9wYXlsb2FkX3NpemU7CisJdWludDE2X3QgZXhlY3V0aW9uX3Rocm90dGxlOworCXVpbnQxNl90IGV4Y2hhbmdlX2NvdW50OworCXVpbnQxNl90IHJlc2VydmVkXzI7CisKKwl1aW50OF90IHBvcnRfbmFtZVtXV05fU0laRV07CisJdWludDhfdCBub2RlX25hbWVbV1dOX1NJWkVdOworCisJdWludDE2X3QgbG9naW5fcmV0cnlfY291bnQ7CisJdWludDE2X3QgcmVzZXJ2ZWRfMzsKKwl1aW50MTZfdCBpbnRlcnJ1cHRfZGVsYXlfdGltZXI7CisJdWludDE2X3QgbG9naW5fdGltZW91dDsKKworCXVpbnQzMl90IGZpcm13YXJlX29wdGlvbnNfMTsKKwl1aW50MzJfdCBmaXJtd2FyZV9vcHRpb25zXzI7CisJdWludDMyX3QgZmlybXdhcmVfb3B0aW9uc18zOworCisJdWludDE2X3QgcmVzZXJ2ZWRfNFs0XTsKKworCS8qIE9mZnNldCA2NC4gKi8KKwl1aW50OF90IGVub2RlX21hY1s2XTsKKwl1aW50MTZfdCByZXNlcnZlZF81WzVdOworCisJLyogT2Zmc2V0IDgwLiAqLworCXVpbnQxNl90IHJlc2VydmVkXzZbMjRdOworCisJLyogT2Zmc2V0IDEyOC4gKi8KKwl1aW50MTZfdCByZXNlcnZlZF83WzY0XTsKKworCS8qCisJICogQklUIDAgID0gRW5hYmxlIHNwaW51cCBkZWxheQorCSAqIEJJVCAxICA9IERpc2FibGUgQklPUworCSAqIEJJVCAyICA9IEVuYWJsZSBNZW1vcnkgTWFwIEJJT1MKKwkgKiBCSVQgMyAgPSBFbmFibGUgU2VsZWN0YWJsZSBCb290CisJICogQklUIDQgID0gRGlzYWJsZSBSSVNDIGNvZGUgbG9hZAorCSAqIEJJVCA1ICA9IERpc2FibGUgU2VyZGVzCisJICogQklUIDYgID0gT3B0IGJvb3QgbW9kZQorCSAqIEJJVCA3ICA9IEludGVycnVwdCBlbmFibGUKKwkgKgorCSAqIEJJVCA4ICA9IEVWIENvbnRyb2wgZW5hYmxlCisJICogQklUIDkgID0gRW5hYmxlIGxpcCByZXNldAorCSAqIEJJVCAxMCA9IEVuYWJsZSBsaXAgZnVsbCBsb2dpbgorCSAqIEJJVCAxMSA9IEVuYWJsZSB0YXJnZXQgcmVzZXQKKwkgKiBCSVQgMTIgPSBTdG9wIGZpcm13YXJlCisJICogQklUIDEzID0gRW5hYmxlIG5vZGVuYW1lIG9wdGlvbgorCSAqIEJJVCAxNCA9IERlZmF1bHQgV1dQTiB2YWxpZAorCSAqIEJJVCAxNSA9IEVuYWJsZSBhbHRlcm5hdGUgV1dOCisJICoKKwkgKiBCSVQgMTYgPSBDTFAgTFVOIHN0cmluZworCSAqIEJJVCAxNyA9IENMUCBUYXJnZXQgc3RyaW5nCisJICogQklUIDE4ID0gQ0xQIEJJT1MgZW5hYmxlIHN0cmluZworCSAqIEJJVCAxOSA9IENMUCBTZXJkZXMgc3RyaW5nCisJICogQklUIDIwID0gQ0xQIFdXUE4gc3RyaW5nCisJICogQklUIDIxID0gQ0xQIFdXTk4gc3RyaW5nCisJICogQklUIDIyID0KKwkgKiBCSVQgMjMgPQorCSAqIEJJVCAyNCA9IEtlZXAgV1dQTgorCSAqIEJJVCAyNSA9IFRlbXAgV1dQTgorCSAqIEJJVCAyNi0zMSA9CisJICovCisJdWludDMyX3QgaG9zdF9wOworCisJdWludDhfdCBhbHRlcm5hdGVfcG9ydF9uYW1lW1dXTl9TSVpFXTsKKwl1aW50OF90IGFsdGVybmF0ZV9ub2RlX25hbWVbV1dOX1NJWkVdOworCisJdWludDhfdCBib290X3BvcnRfbmFtZVtXV05fU0laRV07CisJdWludDE2X3QgYm9vdF9sdW5fbnVtYmVyOworCXVpbnQxNl90IHJlc2VydmVkXzg7CisKKwl1aW50OF90IGFsdDFfYm9vdF9wb3J0X25hbWVbV1dOX1NJWkVdOworCXVpbnQxNl90IGFsdDFfYm9vdF9sdW5fbnVtYmVyOworCXVpbnQxNl90IHJlc2VydmVkXzk7CisKKwl1aW50OF90IGFsdDJfYm9vdF9wb3J0X25hbWVbV1dOX1NJWkVdOworCXVpbnQxNl90IGFsdDJfYm9vdF9sdW5fbnVtYmVyOworCXVpbnQxNl90IHJlc2VydmVkXzEwOworCisJdWludDhfdCBhbHQzX2Jvb3RfcG9ydF9uYW1lW1dXTl9TSVpFXTsKKwl1aW50MTZfdCBhbHQzX2Jvb3RfbHVuX251bWJlcjsKKwl1aW50MTZfdCByZXNlcnZlZF8xMTsKKworCS8qCisJICogQklUIDAgPSBTZWxlY3RpdmUgTG9naW4KKwkgKiBCSVQgMSA9IEFsdC1Cb290IEVuYWJsZQorCSAqIEJJVCAyID0gUmVzZXJ2ZWQKKwkgKiBCSVQgMyA9IEJvb3QgT3JkZXIgTGlzdAorCSAqIEJJVCA0ID0gUmVzZXJ2ZWQKKwkgKiBCSVQgNSA9IFNlbGVjdGl2ZSBMVU4KKwkgKiBCSVQgNiA9IFJlc2VydmVkCisJICogQklUIDctMzEgPQorCSAqLworCXVpbnQzMl90IGVmaV9wYXJhbWV0ZXJzOworCisJdWludDhfdCByZXNldF9kZWxheTsKKwl1aW50OF90IHJlc2VydmVkXzEyOworCXVpbnQxNl90IHJlc2VydmVkXzEzOworCisJdWludDE2X3QgYm9vdF9pZF9udW1iZXI7CisJdWludDE2X3QgcmVzZXJ2ZWRfMTQ7CisKKwl1aW50MTZfdCBtYXhfbHVuc19wZXJfdGFyZ2V0OworCXVpbnQxNl90IHJlc2VydmVkXzE1OworCisJdWludDE2X3QgcG9ydF9kb3duX3JldHJ5X2NvdW50OworCXVpbnQxNl90IGxpbmtfZG93bl90aW1lb3V0OworCisJLyogRkNvZGUgcGFyYW1ldGVycy4gKi8KKwl1aW50MTZfdCBmY29kZV9wYXJhbWV0ZXI7CisKKwl1aW50MTZfdCByZXNlcnZlZF8xNlszXTsKKworCS8qIE9mZnNldCAzNTIuICovCisJdWludDhfdCByZXNlcnZlZF8xN1s0XTsKKwl1aW50MTZfdCByZXNlcnZlZF8xOFs1XTsKKwl1aW50OF90IHJlc2VydmVkXzE5WzJdOworCXVpbnQxNl90IHJlc2VydmVkXzIwWzhdOworCisJLyogT2Zmc2V0IDM4NC4gKi8KKwl1aW50OF90IHJlc2VydmVkXzIxWzE2XTsKKwl1aW50MTZfdCByZXNlcnZlZF8yMls4XTsKKworCS8qIE9mZnNldCA0MTYuICovCisJdWludDE2X3QgcmVzZXJ2ZWRfMjNbMzJdOworCisJLyogT2Zmc2V0IDQ4MC4gKi8KKwl1aW50OF90IG1vZGVsX25hbWVbMTZdOworCisJLyogT2Zmc2V0IDQ5Ni4gKi8KKwl1aW50MTZfdCBmZWF0dXJlX21hc2tfbDsKKwl1aW50MTZfdCBmZWF0dXJlX21hc2tfaDsKKwl1aW50MTZfdCByZXNlcnZlZF8yNFsyXTsKKworCXVpbnQxNl90IHN1YnN5c3RlbV92ZW5kb3JfaWQ7CisJdWludDE2X3Qgc3Vic3lzdGVtX2RldmljZV9pZDsKKworCXVpbnQzMl90IGNoZWNrc3VtOworfTsKKworLyoKKyAqIElTUCBJbml0aWFsaXphdGlvbiBDb250cm9sIEJsb2NrLgorICogTGl0dGxlIGVuZGlhbiBleGNlcHQgd2hlcmUgbm90ZWQuCisgKi8KKyNkZWZpbmUJSUNCX1ZFUlNJT04gMQorc3RydWN0IGluaXRfY2JfODF4eCB7CisJdWludDE2X3QgdmVyc2lvbjsKKwl1aW50MTZfdCByZXNlcnZlZF8xOworCisJdWludDE2X3QgZnJhbWVfcGF5bG9hZF9zaXplOworCXVpbnQxNl90IGV4ZWN1dGlvbl90aHJvdHRsZTsKKwl1aW50MTZfdCBleGNoYW5nZV9jb3VudDsKKworCXVpbnQxNl90IHJlc2VydmVkXzI7CisKKwl1aW50OF90IHBvcnRfbmFtZVtXV05fU0laRV07CQkvKiBCaWcgZW5kaWFuLiAqLworCXVpbnQ4X3Qgbm9kZV9uYW1lW1dXTl9TSVpFXTsJCS8qIEJpZyBlbmRpYW4uICovCisKKwl1aW50MTZfdCByZXNwb25zZV9xX2lucG9pbnRlcjsKKwl1aW50MTZfdCByZXF1ZXN0X3Ffb3V0cG9pbnRlcjsKKworCXVpbnQxNl90IGxvZ2luX3JldHJ5X2NvdW50OworCisJdWludDE2X3QgcHJpb19yZXF1ZXN0X3Ffb3V0cG9pbnRlcjsKKworCXVpbnQxNl90IHJlc3BvbnNlX3FfbGVuZ3RoOworCXVpbnQxNl90IHJlcXVlc3RfcV9sZW5ndGg7CisKKwl1aW50MTZfdCByZXNlcnZlZF8zOworCisJdWludDE2X3QgcHJpb19yZXF1ZXN0X3FfbGVuZ3RoOworCisJdWludDMyX3QgcmVxdWVzdF9xX2FkZHJlc3NbMl07CisJdWludDMyX3QgcmVzcG9uc2VfcV9hZGRyZXNzWzJdOworCXVpbnQzMl90IHByaW9fcmVxdWVzdF9xX2FkZHJlc3NbMl07CisKKwl1aW50OF90IHJlc2VydmVkXzRbOF07CisKKwl1aW50MTZfdCBhdGlvX3FfaW5wb2ludGVyOworCXVpbnQxNl90IGF0aW9fcV9sZW5ndGg7CisJdWludDMyX3QgYXRpb19xX2FkZHJlc3NbMl07CisKKwl1aW50MTZfdCBpbnRlcnJ1cHRfZGVsYXlfdGltZXI7CQkvKiAxMDB1cyBpbmNyZW1lbnRzLiAqLworCXVpbnQxNl90IGxvZ2luX3RpbWVvdXQ7CisKKwkvKgorCSAqIEJJVCAwLTMgPSBSZXNlcnZlZAorCSAqIEJJVCA0ICA9IEVuYWJsZSBUYXJnZXQgTW9kZQorCSAqIEJJVCA1ICA9IERpc2FibGUgSW5pdGlhdG9yIE1vZGUKKwkgKiBCSVQgNiAgPSBSZXNlcnZlZAorCSAqIEJJVCA3ICA9IFJlc2VydmVkCisJICoKKwkgKiBCSVQgOC0xMyA9IFJlc2VydmVkCisJICogQklUIDE0ID0gTm9kZSBOYW1lIE9wdGlvbgorCSAqIEJJVCAxNS0zMSA9IFJlc2VydmVkCisJICovCisJdWludDMyX3QgZmlybXdhcmVfb3B0aW9uc18xOworCisJLyoKKwkgKiBCSVQgMCAgPSBPcGVyYXRpb24gTW9kZSBiaXQgMAorCSAqIEJJVCAxICA9IE9wZXJhdGlvbiBNb2RlIGJpdCAxCisJICogQklUIDIgID0gT3BlcmF0aW9uIE1vZGUgYml0IDIKKwkgKiBCSVQgMyAgPSBPcGVyYXRpb24gTW9kZSBiaXQgMworCSAqIEJJVCA0LTcgPSBSZXNlcnZlZAorCSAqCisJICogQklUIDggID0gRW5hYmxlIENsYXNzIDIKKwkgKiBCSVQgOSAgPSBFbmFibGUgQUNLMAorCSAqIEJJVCAxMCA9IFJlc2VydmVkCisJICogQklUIDExID0gRW5hYmxlIEZDLVNQIFNlY3VyaXR5CisJICogQklUIDEyID0gRkMgVGFwZSBFbmFibGUKKwkgKiBCSVQgMTMgPSBSZXNlcnZlZAorCSAqIEJJVCAxNCA9IEVuYWJsZSBUYXJnZXQgUFJMSSBDb250cm9sCisJICogQklUIDE1LTMxID0gUmVzZXJ2ZWQKKwkgKi8KKwl1aW50MzJfdCBmaXJtd2FyZV9vcHRpb25zXzI7CisKKwkvKgorCSAqIEJJVCAwLTMgPSBSZXNlcnZlZAorCSAqIEJJVCA0ICA9IEZDUCBSU1AgUGF5bG9hZCBiaXQgMAorCSAqIEJJVCA1ICA9IEZDUCBSU1AgUGF5bG9hZCBiaXQgMQorCSAqIEJJVCA2ICA9IEVuYWJsZSBSZWNlaXZlIE91dC1vZi1PcmRlciBkYXRhIGZyYW1lIGhhbmRsaW5nCisJICogQklUIDcgID0gUmVzZXJ2ZWQKKwkgKgorCSAqIEJJVCA4ICA9IFJlc2VydmVkCisJICogQklUIDkgID0gRW5hYmxlIE91dC1vZi1PcmRlciBGQ1BfWEZFUl9SRFkgcmVsYXRpdmUgb2Zmc2V0IGhhbmRsaW5nCisJICogQklUIDEwLTE2ID0gUmVzZXJ2ZWQKKwkgKiBCSVQgMTcgPSBFbmFibGUgbXVsdGlwbGUgRkNGcworCSAqIEJJVCAxOC0yMCA9IE1BQyBhZGRyZXNzaW5nIG1vZGUKKwkgKiBCSVQgMjEtMjUgPSBFdGhlcm5ldCBkYXRhIHJhdGUKKwkgKiBCSVQgMjYgPSBFbmFibGUgZXRoZXJuZXQgaGVhZGVyIHJ4IElPQ0IgZm9yIEFUSU8gcQorCSAqIEJJVCAyNyA9IEVuYWJsZSBldGhlcm5ldCBoZWFkZXIgcnggSU9DQiBmb3IgcmVzcG9uc2UgcQorCSAqIEJJVCAyOCA9IFNQTUEgc2VsZWN0aW9uIGJpdCAwCisJICogQklUIDI4ID0gU1BNQSBzZWxlY3Rpb24gYml0IDEKKwkgKiBCSVQgMzAtMzEgPSBSZXNlcnZlZAorCSAqLworCXVpbnQzMl90IGZpcm13YXJlX29wdGlvbnNfMzsKKworCXVpbnQ4X3QgIHJlc2VydmVkXzVbOF07CisKKwl1aW50OF90IGVub2RlX21hY1s2XTsKKworCXVpbnQ4X3QgcmVzZXJ2ZWRfNlsxMF07Cit9OworCitzdHJ1Y3QgbWlkX2luaXRfY2JfODF4eCB7CisJc3RydWN0IGluaXRfY2JfODF4eCBpbml0X2NiOworCisJdWludDE2X3QgY291bnQ7CisJdWludDE2X3Qgb3B0aW9uczsKKworCXN0cnVjdCBtaWRfY29uZl9lbnRyeV8yNHh4IGVudHJpZXNbTUFYX01VTFRJX0lEX0ZBQlJJQ107Cit9OworCisjZGVmaW5lIEZBUlhfQUNDRVNTX0ZMQVNIX0NPTkZfODFYWAkweDdGRkQwMDAwCisjZGVmaW5lIEZBUlhfQUNDRVNTX0ZMQVNIX0RBVEFfODFYWAkweDdGODAwMDAwCisKKy8qIDgxWFggRmxhc2ggbG9jYXRpb25zIC0tIG9jY3VwaWVzIHNlY29uZCAyTUIgcmVnaW9uLiAqLworI2RlZmluZSBGQV9CT09UX0NPREVfQUREUl84MQkweDgwMDAwCisjZGVmaW5lIEZBX1JJU0NfQ09ERV9BRERSXzgxCTB4QTAwMDAKKyNkZWZpbmUgRkFfRldfQVJFQV9BRERSXzgxCTB4QzAwMDAKKyNkZWZpbmUgRkFfVlBEX05WUkFNX0FERFJfODEJMHhEMDAwMAorI2RlZmluZSBGQV9GRUFUVVJFX0FERFJfODEJMHhENDAwMAorI2RlZmluZSBGQV9GTEFTSF9ERVNDUl9BRERSXzgxCTB4RDgwMDAKKyNkZWZpbmUgRkFfRkxBU0hfTEFZT1VUX0FERFJfODEJMHhEODQwMAorI2RlZmluZSBGQV9IV19FVkVOVDBfQUREUl84MQkweERDMDAwCisjZGVmaW5lIEZBX0hXX0VWRU5UMV9BRERSXzgxCTB4REM0MDAKKyNkZWZpbmUgRkFfTlBJVl9DT05GMF9BRERSXzgxCTB4RDEwMDAKKyNkZWZpbmUgRkFfTlBJVl9DT05GMV9BRERSXzgxCTB4RDIwMDAKKwogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZ2JsLmggYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZ2JsLmgKaW5kZXggMDAxMWUzMS4uYmE0OTEzMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2dibC5oCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9nYmwuaApAQCAtMjgsOCArMjgsMTAgQEAKIGV4dGVybiB2b2lkIHFsYTI0eHhfcmVzZXRfYWRhcHRlcihzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqKTsKIGV4dGVybiBpbnQgcWxhMngwMF9udnJhbV9jb25maWcoc3RydWN0IHNjc2lfcWxhX2hvc3QgKik7CiBleHRlcm4gaW50IHFsYTI0eHhfbnZyYW1fY29uZmlnKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICopOworZXh0ZXJuIGludCBxbGE4MXh4X252cmFtX2NvbmZpZyhzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqKTsKIGV4dGVybiB2b2lkIHFsYTJ4MDBfdXBkYXRlX2Z3X29wdGlvbnMoc3RydWN0IHNjc2lfcWxhX2hvc3QgKik7CiBleHRlcm4gdm9pZCBxbGEyNHh4X3VwZGF0ZV9md19vcHRpb25zKHNjc2lfcWxhX2hvc3RfdCAqKTsKK2V4dGVybiB2b2lkIHFsYTgxeHhfdXBkYXRlX2Z3X29wdGlvbnMoc2NzaV9xbGFfaG9zdF90ICopOwogZXh0ZXJuIGludCBxbGEyeDAwX2xvYWRfcmlzYyhzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqLCB1aW50MzJfdCAqKTsKIGV4dGVybiBpbnQgcWxhMjR4eF9sb2FkX3Jpc2Moc2NzaV9xbGFfaG9zdF90ICosIHVpbnQzMl90ICopOwogCkBAIC02OSw4ICs3MSw2IEBACiBleHRlcm4gdm9pZCBxbGEyeDAwX2Fib3J0X2FsbF9jbWRzKHNjc2lfcWxhX2hvc3RfdCAqLCBpbnQpOwogZXh0ZXJuIGludCBxbGEyeDAwX3Bvc3RfYWVuX3dvcmsoc3RydWN0IHNjc2lfcWxhX2hvc3QgKiwgZW51bQogICAgIGZjX2hvc3RfZXZlbnRfY29kZSwgdTMyKTsKLWV4dGVybiBpbnQgcWxhMngwMF9wb3N0X2h3ZV93b3JrKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICosIHVpbnQxNl90ICwgdWludDE2X3QsCi0gICAgdWludDE2X3QsIHVpbnQxNl90KTsKIAogZXh0ZXJuIHZvaWQgcWxhMngwMF9hYm9ydF9mY3BvcnRfY21kcyhmY19wb3J0X3QgKik7CiBleHRlcm4gc3RydWN0IHNjc2lfcWxhX2hvc3QgKnFsYTJ4MDBfY3JlYXRlX2hvc3Qoc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSAqLApAQCAtMTQzLDcgKzE0Myw3IEBACiAKIGV4dGVybiB2b2lkCiBxbGEyeDAwX2dldF9md192ZXJzaW9uKHNjc2lfcWxhX2hvc3RfdCAqLCB1aW50MTZfdCAqLAotICAgIHVpbnQxNl90ICosIHVpbnQxNl90ICosIHVpbnQxNl90ICosIHVpbnQzMl90ICopOworICAgIHVpbnQxNl90ICosIHVpbnQxNl90ICosIHVpbnQxNl90ICosIHVpbnQzMl90ICosIHVpbnQ4X3QgKiwgdWludDMyX3QgKik7CiAKIGV4dGVybiBpbnQKIHFsYTJ4MDBfZ2V0X2Z3X29wdGlvbnMoc2NzaV9xbGFfaG9zdF90ICosIHVpbnQxNl90ICopOwpAQCAtMzE3LDkgKzMxNyw2IEBACiBleHRlcm4gaW50IHFsYTJ4MDBfZ2V0X2ZsYXNoX3ZlcnNpb24oc2NzaV9xbGFfaG9zdF90ICosIHZvaWQgKik7CiBleHRlcm4gaW50IHFsYTI0eHhfZ2V0X2ZsYXNoX3ZlcnNpb24oc2NzaV9xbGFfaG9zdF90ICosIHZvaWQgKik7CiAKLWV4dGVybiBpbnQgcWxhMnh4eF9od19ldmVudF9sb2coc2NzaV9xbGFfaG9zdF90ICosIHVpbnQxNl90ICwgdWludDE2X3QsCi0gICAgdWludDE2X3QsIHVpbnQxNl90KTsKLQogZXh0ZXJuIGludCBxbGEyeHh4X2dldF9mbGFzaF9pbmZvKHNjc2lfcWxhX2hvc3RfdCAqKTsKIGV4dGVybiBpbnQgcWxhMnh4eF9nZXRfdnBkX2ZpZWxkKHNjc2lfcWxhX2hvc3RfdCAqLCBjaGFyICosIGNoYXIgKiwgc2l6ZV90KTsKIApAQCAtMzMyLDYgKzMyOSw3IEBACiBleHRlcm4gdm9pZCBxbGEyMzAwX2Z3X2R1bXAoc2NzaV9xbGFfaG9zdF90ICosIGludCk7CiBleHRlcm4gdm9pZCBxbGEyNHh4X2Z3X2R1bXAoc2NzaV9xbGFfaG9zdF90ICosIGludCk7CiBleHRlcm4gdm9pZCBxbGEyNXh4X2Z3X2R1bXAoc2NzaV9xbGFfaG9zdF90ICosIGludCk7CitleHRlcm4gdm9pZCBxbGE4MXh4X2Z3X2R1bXAoc2NzaV9xbGFfaG9zdF90ICosIGludCk7CiBleHRlcm4gdm9pZCBxbGEyeDAwX2R1bXBfcmVncyhzY3NpX3FsYV9ob3N0X3QgKik7CiBleHRlcm4gdm9pZCBxbGEyeDAwX2R1bXBfYnVmZmVyKHVpbnQ4X3QgKiwgdWludDMyX3QpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZ3MuYyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9ncy5jCmluZGV4IDBhNmY3Mjk3Li41NTdmNThkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZ3MuYworKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZ3MuYwpAQCAtMTUzNSw3ICsxNTM1LDEwIEBACiAJZWl0ZXIgPSAoc3RydWN0IGN0X2ZkbWlfcG9ydF9hdHRyICopIChlbnRyaWVzICsgc2l6ZSk7CiAJZWl0ZXItPnR5cGUgPSBfX2NvbnN0YW50X2NwdV90b19iZTE2KEZETUlfUE9SVF9TVVBQT1JUX1NQRUVEKTsKIAllaXRlci0+bGVuID0gX19jb25zdGFudF9jcHVfdG9fYmUxNig0ICsgNCk7Ci0JaWYgKElTX1FMQTI1WFgoaGEpKQorCWlmIChJU19RTEE4MVhYKGhhKSkKKwkJZWl0ZXItPmEuc3VwX3NwZWVkID0gX19jb25zdGFudF9jcHVfdG9fYmUzMigKKwkJICAgIEZETUlfUE9SVF9TUEVFRF8xMEdCKTsKKwllbHNlIGlmIChJU19RTEEyNVhYKGhhKSkKIAkJZWl0ZXItPmEuc3VwX3NwZWVkID0gX19jb25zdGFudF9jcHVfdG9fYmUzMigKIAkJICAgIEZETUlfUE9SVF9TUEVFRF8xR0J8RkRNSV9QT1JUX1NQRUVEXzJHQnwKIAkJICAgIEZETUlfUE9SVF9TUEVFRF80R0J8RkRNSV9QT1JUX1NQRUVEXzhHQik7CkBAIC0xNTc1LDYgKzE1NzgsMTAgQEAKIAkJZWl0ZXItPmEuY3VyX3NwZWVkID0KIAkJICAgIF9fY29uc3RhbnRfY3B1X3RvX2JlMzIoRkRNSV9QT1JUX1NQRUVEXzhHQik7CiAJCWJyZWFrOworCWNhc2UgUE9SVF9TUEVFRF8xMEdCOgorCQllaXRlci0+YS5jdXJfc3BlZWQgPQorCQkgICAgX19jb25zdGFudF9jcHVfdG9fYmUzMihGRE1JX1BPUlRfU1BFRURfMTBHQik7CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCWVpdGVyLT5hLmN1cl9zcGVlZCA9CiAJCSAgICBfX2NvbnN0YW50X2NwdV90b19iZTMyKEZETUlfUE9SVF9TUEVFRF9VTktOT1dOKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9pbml0LmMgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfaW5pdC5jCmluZGV4IDUyZWQ1NmUuLjJkNGYzMmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9pbml0LmMKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2luaXQuYwpAQCAtNTUyLDEwICs1NTIsNiBAQAogCQlkMiA9IFJEX1JFR19EV09SRCgmcmVnLT5jdHJsX3N0YXR1cyk7CiAJCWJhcnJpZXIoKTsKIAl9Ci0JaWYgKGNudCA9PSAwIHx8IGh3X2V2dCkKLQkJcWxhMnh4eF9od19ldmVudF9sb2codmhhLCBIV19FVkVOVF9SRVNFVF9FUlIsCi0JCSAgICBSRF9SRUdfV09SRCgmcmVnLT5tYWlsYm94MSksIFJEX1JFR19XT1JEKCZyZWctPm1haWxib3gyKSwKLQkJICAgIFJEX1JFR19XT1JEKCZyZWctPm1haWxib3gzKSk7CiAKIAlXUlRfUkVHX0RXT1JEKCZyZWctPmhjY3IsIEhDQ1JYX1NFVF9SSVNDX1JFU0VUKTsKIAlSRF9SRUdfRFdPUkQoJnJlZy0+aGNjcik7CkBAIC01NzQsNiArNTcwLDkgQEAKIAl9CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOworCisJaWYgKElTX05PUE9MTElOR19UWVBFKGhhKSkKKwkJaGEtPmlzcF9vcHMtPmVuYWJsZV9pbnRycyhoYSk7CiB9CiAKIC8qKgpAQCAtNzc5LDE2ICs3NzgsMTkgQEAKIAkJbWVtX3NpemUgPSAoaGEtPmZ3X21lbW9yeV9zaXplIC0gMHgxMTAwMCArIDEpICoKIAkJICAgIHNpemVvZih1aW50MTZfdCk7CiAJfSBlbHNlIGlmIChJU19GV0kyX0NBUEFCTEUoaGEpKSB7Ci0JCWZpeGVkX3NpemUgPSBJU19RTEEyNVhYKGhhKSA/Ci0JCQlvZmZzZXRvZihzdHJ1Y3QgcWxhMjV4eF9md19kdW1wLCBleHRfbWVtKSA6Ci0JCQlvZmZzZXRvZihzdHJ1Y3QgcWxhMjR4eF9md19kdW1wLCBleHRfbWVtKTsKKwkJaWYgKElTX1FMQTgxWFgoaGEpKQorCQkJZml4ZWRfc2l6ZSA9IG9mZnNldG9mKHN0cnVjdCBxbGE4MXh4X2Z3X2R1bXAsIGV4dF9tZW0pOworCQllbHNlIGlmIChJU19RTEEyNVhYKGhhKSkKKwkJCWZpeGVkX3NpemUgPSBvZmZzZXRvZihzdHJ1Y3QgcWxhMjV4eF9md19kdW1wLCBleHRfbWVtKTsKKwkJZWxzZQorCQkJZml4ZWRfc2l6ZSA9IG9mZnNldG9mKHN0cnVjdCBxbGEyNHh4X2Z3X2R1bXAsIGV4dF9tZW0pOwogCQltZW1fc2l6ZSA9IChoYS0+ZndfbWVtb3J5X3NpemUgLSAweDEwMDAwMCArIDEpICoKIAkJICAgIHNpemVvZih1aW50MzJfdCk7CiAJCWlmIChoYS0+bXFlbmFibGUpCiAJCQltcV9zaXplID0gc2l6ZW9mKHN0cnVjdCBxbGEyeHh4X21xX2NoYWluKTsKIAogCQkvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIEZpYnJlIENoYW5uZWwgRXZlbnQgQnVmZmVyLiAqLwotCQlpZiAoIUlTX1FMQTI1WFgoaGEpKQorCQlpZiAoIUlTX1FMQTI1WFgoaGEpICYmICFJU19RTEE4MVhYKGhhKSkKIAkJCWdvdG8gdHJ5X2VmdDsKIAogCQl0YyA9IGRtYV9hbGxvY19jb2hlcmVudCgmaGEtPnBkZXYtPmRldiwgRkNFX1NJWkUsICZ0Y19kbWEsCkBAIC04NTEsNyArODUzLDkgQEAKIAogCWR1bXBfc2l6ZSA9IG9mZnNldG9mKHN0cnVjdCBxbGEyeHh4X2Z3X2R1bXAsIGlzcCk7CiAJZHVtcF9zaXplICs9IGZpeGVkX3NpemUgKyBtZW1fc2l6ZSArIHJlcV9xX3NpemUgKyByc3BfcV9zaXplICsKLQkgICAgbXFfc2l6ZSArIGVmdF9zaXplICsgZmNlX3NpemU7CisJICAgIGVmdF9zaXplOworCWhhLT5jaGFpbl9vZmZzZXQgPSBkdW1wX3NpemU7CisJZHVtcF9zaXplICs9IG1xX3NpemUgKyBmY2Vfc2l6ZTsKIAogCWhhLT5md19kdW1wID0gdm1hbGxvYyhkdW1wX3NpemUpOwogCWlmICghaGEtPmZ3X2R1bXApIHsKQEAgLTk4Nyw3ICs5OTEsOCBAQAogCQkJCSAgICAmaGEtPmZ3X21ham9yX3ZlcnNpb24sCiAJCQkJICAgICZoYS0+ZndfbWlub3JfdmVyc2lvbiwKIAkJCQkgICAgJmhhLT5md19zdWJtaW5vcl92ZXJzaW9uLAotCQkJCSAgICAmaGEtPmZ3X2F0dHJpYnV0ZXMsICZoYS0+ZndfbWVtb3J5X3NpemUpOworCQkJCSAgICAmaGEtPmZ3X2F0dHJpYnV0ZXMsICZoYS0+ZndfbWVtb3J5X3NpemUsCisJCQkJICAgIGhhLT5tcGlfdmVyc2lvbiwgJmhhLT5tcGlfY2FwYWJpbGl0aWVzKTsKIAkJCQloYS0+ZmxhZ3MubnBpdl9zdXBwb3J0ZWQgPSAwOwogCQkJCWlmIChJU19RTEEyWFhYX01JRFRZUEUoaGEpICYmCiAJCQkJCSAoaGEtPmZ3X2F0dHJpYnV0ZXMgJiBCSVRfMikpIHsKQEAgLTE2NjUsMTAgKzE2NzAsNiBAQAogCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsICJGYWxsaW5nIGJhY2sgdG8gZnVuY3Rpb25pbmcgKHlldCAiCiAJCSAgICAiaW52YWxpZCAtLSBXV1BOKSBkZWZhdWx0cy5cbiIpOwogCi0JCWlmIChjaGtzdW0pCi0JCQlxbGEyeHh4X2h3X2V2ZW50X2xvZyh2aGEsIEhXX0VWRU5UX05WUkFNX0NIS1NVTV9FUlIsIDAsCi0JCQkgICAgTVNXKGNoa3N1bSksIExTVyhjaGtzdW0pKTsKLQogCQkvKgogCQkgKiBTZXQgZGVmYXVsdCBpbml0aWFsaXphdGlvbiBjb250cm9sIGJsb2NrLgogCQkgKi8KQEAgLTQyNTUsMyArNDI1NiwyNjkgQEAKIAlyZXR1cm4gcnZhbCAhPSBRTEFfU1VDQ0VTUyB8fCBzdGF0dXNbMF0gPyBRTEFfRlVOQ1RJT05fRkFJTEVEOgogCSAgICBRTEFfU1VDQ0VTUzsKIH0KKworLyogODFYWCBTdXBwb3J0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbnQKK3FsYTgxeHhfbnZyYW1fY29uZmlnKHNjc2lfcWxhX2hvc3RfdCAqdmhhKQoreworCWludCAgIHJ2YWw7CisJc3RydWN0IGluaXRfY2JfODF4eCAqaWNiOworCXN0cnVjdCBudnJhbV84MXh4ICpudjsKKwl1aW50MzJfdCAqZHB0cjsKKwl1aW50OF90ICAqZHB0cjEsICpkcHRyMjsKKwl1aW50MzJfdCBjaGtzdW07CisJdWludDE2X3QgY250OworCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OworCisJcnZhbCA9IFFMQV9TVUNDRVNTOworCWljYiA9IChzdHJ1Y3QgaW5pdF9jYl84MXh4ICopaGEtPmluaXRfY2I7CisJbnYgPSBoYS0+bnZyYW07CisKKwkvKiBEZXRlcm1pbmUgTlZSQU0gc3RhcnRpbmcgYWRkcmVzcy4gKi8KKwloYS0+bnZyYW1fc2l6ZSA9IHNpemVvZihzdHJ1Y3QgbnZyYW1fODF4eCk7CisJaGEtPm52cmFtX2Jhc2UgPSBGQV9OVlJBTV9GVU5DMF9BRERSOworCWhhLT52cGRfc2l6ZSA9IEZBX05WUkFNX1ZQRF9TSVpFOworCWhhLT52cGRfYmFzZSA9IEZBX05WUkFNX1ZQRDBfQUREUjsKKwlpZiAoUENJX0ZVTkMoaGEtPnBkZXYtPmRldmZuKSAmIDEpIHsKKwkJaGEtPm52cmFtX2Jhc2UgPSBGQV9OVlJBTV9GVU5DMV9BRERSOworCQloYS0+dnBkX2Jhc2UgPSBGQV9OVlJBTV9WUEQxX0FERFI7CisJfQorCisJLyogR2V0IFZQRCBkYXRhIGludG8gY2FjaGUgKi8KKwloYS0+dnBkID0gaGEtPm52cmFtICsgVlBEX09GRlNFVDsKKwloYS0+aXNwX29wcy0+cmVhZF9udnJhbSh2aGEsICh1aW50OF90ICopaGEtPnZwZCwKKwkgICAgaGEtPm52cmFtX2Jhc2UgLSBGQV9OVlJBTV9GVU5DMF9BRERSLCBGQV9OVlJBTV9WUERfU0laRSAqIDQpOworCisJLyogR2V0IE5WUkFNIGRhdGEgaW50byBjYWNoZSBhbmQgY2FsY3VsYXRlIGNoZWNrc3VtLiAqLworCWRwdHIgPSAodWludDMyX3QgKiludjsKKwloYS0+aXNwX29wcy0+cmVhZF9udnJhbSh2aGEsICh1aW50OF90ICopZHB0ciwgaGEtPm52cmFtX2Jhc2UsCisJICAgIGhhLT5udnJhbV9zaXplKTsKKwlmb3IgKGNudCA9IDAsIGNoa3N1bSA9IDA7IGNudCA8IGhhLT5udnJhbV9zaXplID4+IDI7IGNudCsrKQorCQljaGtzdW0gKz0gbGUzMl90b19jcHUoKmRwdHIrKyk7CisKKwlERUJVRzUocHJpbnRrKCJzY3NpKCVsZCk6IENvbnRlbnRzIG9mIE5WUkFNXG4iLCBoYS0+aG9zdF9ubykpOworCURFQlVHNShxbGEyeDAwX2R1bXBfYnVmZmVyKCh1aW50OF90ICopbnYsIGhhLT5udnJhbV9zaXplKSk7CisKKwkvKiBCYWQgTlZSQU0gZGF0YSwgc2V0IGRlZmF1bHRzIHBhcmFtZXRlcnMuICovCisJaWYgKGNoa3N1bSB8fCBudi0+aWRbMF0gIT0gJ0knIHx8IG52LT5pZFsxXSAhPSAnUycgfHwgbnYtPmlkWzJdICE9ICdQJworCSAgICB8fCBudi0+aWRbM10gIT0gJyAnIHx8CisJICAgIG52LT5udnJhbV92ZXJzaW9uIDwgX19jb25zdGFudF9jcHVfdG9fbGUxNihJQ0JfVkVSU0lPTikpIHsKKwkJLyogUmVzZXQgTlZSQU0gZGF0YS4gKi8KKwkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLCAiSW5jb25zaXN0ZW50IE5WUkFNIGRldGVjdGVkOiAiCisJCSAgICAiY2hlY2tzdW09MHgleCBpZD0lYyB2ZXJzaW9uPTB4JXguXG4iLCBjaGtzdW0sIG52LT5pZFswXSwKKwkJICAgIGxlMTZfdG9fY3B1KG52LT5udnJhbV92ZXJzaW9uKSk7CisJCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwgIkZhbGxpbmcgYmFjayB0byBmdW5jdGlvbmluZyAoeWV0ICIKKwkJICAgICJpbnZhbGlkIC0tIFdXUE4pIGRlZmF1bHRzLlxuIik7CisKKwkJLyoKKwkJICogU2V0IGRlZmF1bHQgaW5pdGlhbGl6YXRpb24gY29udHJvbCBibG9jay4KKwkJICovCisJCW1lbXNldChudiwgMCwgaGEtPm52cmFtX3NpemUpOworCQludi0+bnZyYW1fdmVyc2lvbiA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMTYoSUNCX1ZFUlNJT04pOworCQludi0+dmVyc2lvbiA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMTYoSUNCX1ZFUlNJT04pOworCQludi0+ZnJhbWVfcGF5bG9hZF9zaXplID0gX19jb25zdGFudF9jcHVfdG9fbGUxNigyMDQ4KTsKKwkJbnYtPmV4ZWN1dGlvbl90aHJvdHRsZSA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMTYoMHhGRkZGKTsKKwkJbnYtPmV4Y2hhbmdlX2NvdW50ID0gX19jb25zdGFudF9jcHVfdG9fbGUxNigwKTsKKwkJbnYtPnBvcnRfbmFtZVswXSA9IDB4MjE7CisJCW52LT5wb3J0X25hbWVbMV0gPSAweDAwICsgUENJX0ZVTkMoaGEtPnBkZXYtPmRldmZuKTsKKwkJbnYtPnBvcnRfbmFtZVsyXSA9IDB4MDA7CisJCW52LT5wb3J0X25hbWVbM10gPSAweGUwOworCQludi0+cG9ydF9uYW1lWzRdID0gMHg4YjsKKwkJbnYtPnBvcnRfbmFtZVs1XSA9IDB4MWM7CisJCW52LT5wb3J0X25hbWVbNl0gPSAweDU1OworCQludi0+cG9ydF9uYW1lWzddID0gMHg4NjsKKwkJbnYtPm5vZGVfbmFtZVswXSA9IDB4MjA7CisJCW52LT5ub2RlX25hbWVbMV0gPSAweDAwOworCQludi0+bm9kZV9uYW1lWzJdID0gMHgwMDsKKwkJbnYtPm5vZGVfbmFtZVszXSA9IDB4ZTA7CisJCW52LT5ub2RlX25hbWVbNF0gPSAweDhiOworCQludi0+bm9kZV9uYW1lWzVdID0gMHgxYzsKKwkJbnYtPm5vZGVfbmFtZVs2XSA9IDB4NTU7CisJCW52LT5ub2RlX25hbWVbN10gPSAweDg2OworCQludi0+bG9naW5fcmV0cnlfY291bnQgPSBfX2NvbnN0YW50X2NwdV90b19sZTE2KDgpOworCQludi0+aW50ZXJydXB0X2RlbGF5X3RpbWVyID0gX19jb25zdGFudF9jcHVfdG9fbGUxNigwKTsKKwkJbnYtPmxvZ2luX3RpbWVvdXQgPSBfX2NvbnN0YW50X2NwdV90b19sZTE2KDApOworCQludi0+ZmlybXdhcmVfb3B0aW9uc18xID0KKwkJICAgIF9fY29uc3RhbnRfY3B1X3RvX2xlMzIoQklUXzE0fEJJVF8xM3xCSVRfMnxCSVRfMSk7CisJCW52LT5maXJtd2FyZV9vcHRpb25zXzIgPSBfX2NvbnN0YW50X2NwdV90b19sZTMyKDIgPDwgNCk7CisJCW52LT5maXJtd2FyZV9vcHRpb25zXzIgfD0gX19jb25zdGFudF9jcHVfdG9fbGUzMihCSVRfMTIpOworCQludi0+ZmlybXdhcmVfb3B0aW9uc18zID0gX19jb25zdGFudF9jcHVfdG9fbGUzMigyIDw8IDEzKTsKKwkJbnYtPmhvc3RfcCA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMzIoQklUXzExfEJJVF8xMCk7CisJCW52LT5lZmlfcGFyYW1ldGVycyA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMzIoMCk7CisJCW52LT5yZXNldF9kZWxheSA9IDU7CisJCW52LT5tYXhfbHVuc19wZXJfdGFyZ2V0ID0gX19jb25zdGFudF9jcHVfdG9fbGUxNigxMjgpOworCQludi0+cG9ydF9kb3duX3JldHJ5X2NvdW50ID0gX19jb25zdGFudF9jcHVfdG9fbGUxNigzMCk7CisJCW52LT5saW5rX2Rvd25fdGltZW91dCA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMTYoMzApOworCQludi0+ZW5vZGVfbWFjWzBdID0gMHgwMTsKKwkJbnYtPmVub2RlX21hY1sxXSA9IDB4MDI7CisJCW52LT5lbm9kZV9tYWNbMl0gPSAweDAzOworCQludi0+ZW5vZGVfbWFjWzNdID0gMHgwNDsKKwkJbnYtPmVub2RlX21hY1s0XSA9IDB4MDU7CisJCW52LT5lbm9kZV9tYWNbNV0gPSAweDA2ICsgUENJX0ZVTkMoaGEtPnBkZXYtPmRldmZuKTsKKworCQlydmFsID0gMTsKKwl9CisKKwkvKiBSZXNldCBJbml0aWFsaXphdGlvbiBjb250cm9sIGJsb2NrICovCisJbWVtc2V0KGljYiwgMCwgc2l6ZW9mKHN0cnVjdCBpbml0X2NiXzgxeHgpKTsKKworCS8qIENvcHkgMXN0IHNlZ21lbnQuICovCisJZHB0cjEgPSAodWludDhfdCAqKWljYjsKKwlkcHRyMiA9ICh1aW50OF90ICopJm52LT52ZXJzaW9uOworCWNudCA9ICh1aW50OF90ICopJmljYi0+cmVzcG9uc2VfcV9pbnBvaW50ZXIgLSAodWludDhfdCAqKSZpY2ItPnZlcnNpb247CisJd2hpbGUgKGNudC0tKQorCQkqZHB0cjErKyA9ICpkcHRyMisrOworCisJaWNiLT5sb2dpbl9yZXRyeV9jb3VudCA9IG52LT5sb2dpbl9yZXRyeV9jb3VudDsKKworCS8qIENvcHkgMm5kIHNlZ21lbnQuICovCisJZHB0cjEgPSAodWludDhfdCAqKSZpY2ItPmludGVycnVwdF9kZWxheV90aW1lcjsKKwlkcHRyMiA9ICh1aW50OF90ICopJm52LT5pbnRlcnJ1cHRfZGVsYXlfdGltZXI7CisJY250ID0gKHVpbnQ4X3QgKikmaWNiLT5yZXNlcnZlZF81IC0KKwkgICAgKHVpbnQ4X3QgKikmaWNiLT5pbnRlcnJ1cHRfZGVsYXlfdGltZXI7CisJd2hpbGUgKGNudC0tKQorCQkqZHB0cjErKyA9ICpkcHRyMisrOworCisJbWVtY3B5KGljYi0+ZW5vZGVfbWFjLCBudi0+ZW5vZGVfbWFjLCBzaXplb2YoaWNiLT5lbm9kZV9tYWMpKTsKKwkvKiBTb21lIGJvYXJkcyAod2l0aCB2YWxpZCBOVlJBTXMpIHN0aWxsIGhhdmUgTlVMTCBlbm9kZV9tYWMhISAqLworCWlmICghbWVtY21wKGljYi0+ZW5vZGVfbWFjLCAiXDBcMFwwXDBcMFwwIiwgc2l6ZW9mKGljYi0+ZW5vZGVfbWFjKSkpIHsKKwkJaWNiLT5lbm9kZV9tYWNbMF0gPSAweDAxOworCQlpY2ItPmVub2RlX21hY1sxXSA9IDB4MDI7CisJCWljYi0+ZW5vZGVfbWFjWzJdID0gMHgwMzsKKwkJaWNiLT5lbm9kZV9tYWNbM10gPSAweDA0OworCQlpY2ItPmVub2RlX21hY1s0XSA9IDB4MDU7CisJCWljYi0+ZW5vZGVfbWFjWzVdID0gMHgwNiArIFBDSV9GVU5DKGhhLT5wZGV2LT5kZXZmbik7CisJfQorCisJLyoKKwkgKiBTZXR1cCBkcml2ZXIgTlZSQU0gb3B0aW9ucy4KKwkgKi8KKwlxbGEyeDAwX3NldF9tb2RlbF9pbmZvKHZoYSwgbnYtPm1vZGVsX25hbWUsIHNpemVvZihudi0+bW9kZWxfbmFtZSksCisJICAgICJRTEU4MVhYIik7CisKKwkvKiBVc2UgYWx0ZXJuYXRlIFdXTj8gKi8KKwlpZiAobnYtPmhvc3RfcCAmIF9fY29uc3RhbnRfY3B1X3RvX2xlMzIoQklUXzE1KSkgeworCQltZW1jcHkoaWNiLT5ub2RlX25hbWUsIG52LT5hbHRlcm5hdGVfbm9kZV9uYW1lLCBXV05fU0laRSk7CisJCW1lbWNweShpY2ItPnBvcnRfbmFtZSwgbnYtPmFsdGVybmF0ZV9wb3J0X25hbWUsIFdXTl9TSVpFKTsKKwl9CisKKwkvKiBQcmVwYXJlIG5vZGVuYW1lICovCisJaWYgKChpY2ItPmZpcm13YXJlX29wdGlvbnNfMSAmIF9fY29uc3RhbnRfY3B1X3RvX2xlMzIoQklUXzE0KSkgPT0gMCkgeworCQkvKgorCQkgKiBGaXJtd2FyZSB3aWxsIGFwcGx5IHRoZSBmb2xsb3dpbmcgbWFzayBpZiB0aGUgbm9kZW5hbWUgd2FzCisJCSAqIG5vdCBwcm92aWRlZC4KKwkJICovCisJCW1lbWNweShpY2ItPm5vZGVfbmFtZSwgaWNiLT5wb3J0X25hbWUsIFdXTl9TSVpFKTsKKwkJaWNiLT5ub2RlX25hbWVbMF0gJj0gMHhGMDsKKwl9CisKKwkvKiBTZXQgaG9zdCBhZGFwdGVyIHBhcmFtZXRlcnMuICovCisJaGEtPmZsYWdzLmRpc2FibGVfcmlzY19jb2RlX2xvYWQgPSAwOworCWhhLT5mbGFncy5lbmFibGVfbGlwX3Jlc2V0ID0gMDsKKwloYS0+ZmxhZ3MuZW5hYmxlX2xpcF9mdWxsX2xvZ2luID0KKwkgICAgbGUzMl90b19jcHUobnYtPmhvc3RfcCkgJiBCSVRfMTAgPyAxOiAwOworCWhhLT5mbGFncy5lbmFibGVfdGFyZ2V0X3Jlc2V0ID0KKwkgICAgbGUzMl90b19jcHUobnYtPmhvc3RfcCkgJiBCSVRfMTEgPyAxOiAwOworCWhhLT5mbGFncy5lbmFibGVfbGVkX3NjaGVtZSA9IDA7CisJaGEtPmZsYWdzLmRpc2FibGVfc2VyZGVzID0gbGUzMl90b19jcHUobnYtPmhvc3RfcCkgJiBCSVRfNSA/IDE6IDA7CisKKwloYS0+b3BlcmF0aW5nX21vZGUgPSAobGUzMl90b19jcHUoaWNiLT5maXJtd2FyZV9vcHRpb25zXzIpICYKKwkgICAgKEJJVF82IHwgQklUXzUgfCBCSVRfNCkpID4+IDQ7CisKKwkvKiBzYXZlIEhCQSBzZXJpYWwgbnVtYmVyICovCisJaGEtPnNlcmlhbDAgPSBpY2ItPnBvcnRfbmFtZVs1XTsKKwloYS0+c2VyaWFsMSA9IGljYi0+cG9ydF9uYW1lWzZdOworCWhhLT5zZXJpYWwyID0gaWNiLT5wb3J0X25hbWVbN107CisJbWVtY3B5KHZoYS0+bm9kZV9uYW1lLCBpY2ItPm5vZGVfbmFtZSwgV1dOX1NJWkUpOworCW1lbWNweSh2aGEtPnBvcnRfbmFtZSwgaWNiLT5wb3J0X25hbWUsIFdXTl9TSVpFKTsKKworCWljYi0+ZXhlY3V0aW9uX3Rocm90dGxlID0gX19jb25zdGFudF9jcHVfdG9fbGUxNigweEZGRkYpOworCisJaGEtPnJldHJ5X2NvdW50ID0gbGUxNl90b19jcHUobnYtPmxvZ2luX3JldHJ5X2NvdW50KTsKKworCS8qIFNldCBtaW5pbXVtIGxvZ2luX3RpbWVvdXQgdG8gNCBzZWNvbmRzLiAqLworCWlmIChsZTE2X3RvX2NwdShudi0+bG9naW5fdGltZW91dCkgPCBxbDJ4bG9naW50aW1lb3V0KQorCQludi0+bG9naW5fdGltZW91dCA9IGNwdV90b19sZTE2KHFsMnhsb2dpbnRpbWVvdXQpOworCWlmIChsZTE2X3RvX2NwdShudi0+bG9naW5fdGltZW91dCkgPCA0KQorCQludi0+bG9naW5fdGltZW91dCA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMTYoNCk7CisJaGEtPmxvZ2luX3RpbWVvdXQgPSBsZTE2X3RvX2NwdShudi0+bG9naW5fdGltZW91dCk7CisJaWNiLT5sb2dpbl90aW1lb3V0ID0gbnYtPmxvZ2luX3RpbWVvdXQ7CisKKwkvKiBTZXQgbWluaW11bSBSQVRPViB0byAxMDAgdGVudGhzIG9mIGEgc2Vjb25kLiAqLworCWhhLT5yX2FfdG92ID0gMTAwOworCisJaGEtPmxvb3BfcmVzZXRfZGVsYXkgPSBudi0+cmVzZXRfZGVsYXk7CisKKwkvKiBMaW5rIERvd24gVGltZW91dCA9IDA6CisJICoKKwkgKiAJV2hlbiBQb3J0IERvd24gdGltZXIgZXhwaXJlcyB3ZSB3aWxsIHN0YXJ0IHJldHVybmluZworCSAqCUkvTydzIHRvIE9TIHdpdGggIkRJRF9OT19DT05ORUNUIi4KKwkgKgorCSAqIExpbmsgRG93biBUaW1lb3V0ICE9IDA6CisJICoKKwkgKgkgVGhlIGRyaXZlciB3YWl0cyBmb3IgdGhlIGxpbmsgdG8gY29tZSB1cCBhZnRlciBsaW5rIGRvd24KKwkgKgkgYmVmb3JlIHJldHVybmluZyBJL09zIHRvIE9TIHdpdGggIkRJRF9OT19DT05ORUNUIi4KKwkgKi8KKwlpZiAobGUxNl90b19jcHUobnYtPmxpbmtfZG93bl90aW1lb3V0KSA9PSAwKSB7CisJCWhhLT5sb29wX2Rvd25fYWJvcnRfdGltZSA9CisJCSAgICAoTE9PUF9ET1dOX1RJTUUgLSBMT09QX0RPV05fVElNRU9VVCk7CisJfSBlbHNlIHsKKwkJaGEtPmxpbmtfZG93bl90aW1lb3V0ID0JbGUxNl90b19jcHUobnYtPmxpbmtfZG93bl90aW1lb3V0KTsKKwkJaGEtPmxvb3BfZG93bl9hYm9ydF90aW1lID0KKwkJICAgIChMT09QX0RPV05fVElNRSAtIGhhLT5saW5rX2Rvd25fdGltZW91dCk7CisJfQorCisJLyogTmVlZCBlbm91Z2ggdGltZSB0byB0cnkgYW5kIGdldCB0aGUgcG9ydCBiYWNrLiAqLworCWhhLT5wb3J0X2Rvd25fcmV0cnlfY291bnQgPSBsZTE2X3RvX2NwdShudi0+cG9ydF9kb3duX3JldHJ5X2NvdW50KTsKKwlpZiAocWxwb3J0X2Rvd25fcmV0cnkpCisJCWhhLT5wb3J0X2Rvd25fcmV0cnlfY291bnQgPSBxbHBvcnRfZG93bl9yZXRyeTsKKworCS8qIFNldCBsb2dpbl9yZXRyeV9jb3VudCAqLworCWhhLT5sb2dpbl9yZXRyeV9jb3VudCAgPSBsZTE2X3RvX2NwdShudi0+bG9naW5fcmV0cnlfY291bnQpOworCWlmIChoYS0+cG9ydF9kb3duX3JldHJ5X2NvdW50ID09CisJICAgIGxlMTZfdG9fY3B1KG52LT5wb3J0X2Rvd25fcmV0cnlfY291bnQpICYmCisJICAgIGhhLT5wb3J0X2Rvd25fcmV0cnlfY291bnQgPiAzKQorCQloYS0+bG9naW5fcmV0cnlfY291bnQgPSBoYS0+cG9ydF9kb3duX3JldHJ5X2NvdW50OworCWVsc2UgaWYgKGhhLT5wb3J0X2Rvd25fcmV0cnlfY291bnQgPiAoaW50KWhhLT5sb2dpbl9yZXRyeV9jb3VudCkKKwkJaGEtPmxvZ2luX3JldHJ5X2NvdW50ID0gaGEtPnBvcnRfZG93bl9yZXRyeV9jb3VudDsKKwlpZiAocWwyeGxvZ2lucmV0cnljb3VudCkKKwkJaGEtPmxvZ2luX3JldHJ5X2NvdW50ID0gcWwyeGxvZ2lucmV0cnljb3VudDsKKworCS8qIEVuYWJsZSBaSU8uICovCisJaWYgKCF2aGEtPmZsYWdzLmluaXRfZG9uZSkgeworCQloYS0+emlvX21vZGUgPSBsZTMyX3RvX2NwdShpY2ItPmZpcm13YXJlX29wdGlvbnNfMikgJgorCQkgICAgKEJJVF8zIHwgQklUXzIgfCBCSVRfMSB8IEJJVF8wKTsKKwkJaGEtPnppb190aW1lciA9IGxlMTZfdG9fY3B1KGljYi0+aW50ZXJydXB0X2RlbGF5X3RpbWVyKSA/CisJCSAgICBsZTE2X3RvX2NwdShpY2ItPmludGVycnVwdF9kZWxheV90aW1lcik6IDI7CisJfQorCWljYi0+ZmlybXdhcmVfb3B0aW9uc18yICY9IF9fY29uc3RhbnRfY3B1X3RvX2xlMzIoCisJICAgIH4oQklUXzMgfCBCSVRfMiB8IEJJVF8xIHwgQklUXzApKTsKKwl2aGEtPmZsYWdzLnByb2Nlc3NfcmVzcG9uc2VfcXVldWUgPSAwOworCWlmIChoYS0+emlvX21vZGUgIT0gUUxBX1pJT19ESVNBQkxFRCkgeworCQloYS0+emlvX21vZGUgPSBRTEFfWklPX01PREVfNjsKKworCQlERUJVRzIocHJpbnRrKCJzY3NpKCVsZCk6IFpJTyBtb2RlICVkIGVuYWJsZWQ7IHRpbWVyIGRlbGF5ICIKKwkJICAgICIoJWQgdXMpLlxuIiwgdmhhLT5ob3N0X25vLCBoYS0+emlvX21vZGUsCisJCSAgICBoYS0+emlvX3RpbWVyICogMTAwKSk7CisJCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwKKwkJICAgICJaSU8gbW9kZSAlZCBlbmFibGVkOyB0aW1lciBkZWxheSAoJWQgdXMpLlxuIiwKKwkJICAgIGhhLT56aW9fbW9kZSwgaGEtPnppb190aW1lciAqIDEwMCk7CisKKwkJaWNiLT5maXJtd2FyZV9vcHRpb25zXzIgfD0gY3B1X3RvX2xlMzIoCisJCSAgICAodWludDMyX3QpaGEtPnppb19tb2RlKTsKKwkJaWNiLT5pbnRlcnJ1cHRfZGVsYXlfdGltZXIgPSBjcHVfdG9fbGUxNihoYS0+emlvX3RpbWVyKTsKKwkJdmhhLT5mbGFncy5wcm9jZXNzX3Jlc3BvbnNlX3F1ZXVlID0gMTsKKwl9CisKKwlpZiAocnZhbCkgeworCQlERUJVRzJfMyhwcmludGsoS0VSTl9XQVJOSU5HCisJCSAgICAic2NzaSglbGQpOiBOVlJBTSBjb25maWd1cmF0aW9uIGZhaWxlZCFcbiIsIHZoYS0+aG9zdF9ubykpOworCX0KKwlyZXR1cm4gKHJ2YWwpOworfQorCit2b2lkCitxbGE4MXh4X3VwZGF0ZV9md19vcHRpb25zKHNjc2lfcWxhX2hvc3RfdCAqaGEpCit7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfaW9jYi5jIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2lvY2IuYwppbmRleCA1YmVkYzlkLi4yMjU4MTUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfaW9jYi5jCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9pb2NiLmMKQEAgLTE3Myw3ICsxNzMsNyBAQAogCQlyZXR1cm47CiAJfQogCi0JdmhhID0gc3AtPnZoYTsKKwl2aGEgPSBzcC0+ZmNwb3J0LT52aGE7CiAJcmVxID0gc3AtPnF1ZTsKIAogCWNtZF9wa3QtPmNvbnRyb2xfZmxhZ3MgfD0gY3B1X3RvX2xlMTYocWxhMngwMF9nZXRfY21kX2RpcmVjdGlvbihzcCkpOwpAQCAtMjM0LDcgKzIzNCw3IEBACiAJCXJldHVybjsKIAl9CiAKLQl2aGEgPSBzcC0+dmhhOworCXZoYSA9IHNwLT5mY3BvcnQtPnZoYTsKIAlyZXEgPSBzcC0+cXVlOwogCiAJY21kX3BrdC0+Y29udHJvbF9mbGFncyB8PSBjcHVfdG9fbGUxNihxbGEyeDAwX2dldF9jbWRfZGlyZWN0aW9uKHNwKSk7CkBAIC0yOTQsNyArMjk0LDcgQEAKIAogCS8qIFNldHVwIGRldmljZSBwb2ludGVycy4gKi8KIAlyZXQgPSAwOwotCXZoYSA9IHNwLT52aGE7CisJdmhhID0gc3AtPmZjcG9ydC0+dmhhOwogCWhhID0gdmhhLT5odzsKIAlyZWcgPSAmaGEtPmlvYmFzZS0+aXNwOwogCWNtZCA9IHNwLT5jbWQ7CkBAIC0zNTMsNyArMzUzLDYgQEAKIAkvKiBCdWlsZCBjb21tYW5kIHBhY2tldCAqLwogCXJlcS0+Y3VycmVudF9vdXRzdGFuZGluZ19jbWQgPSBoYW5kbGU7CiAJcmVxLT5vdXRzdGFuZGluZ19jbWRzW2hhbmRsZV0gPSBzcDsKLQlzcC0+dmhhID0gdmhhOwogCXNwLT5xdWUgPSByZXE7CiAJc3AtPmNtZC0+aG9zdF9zY3JpYmJsZSA9ICh1bnNpZ25lZCBjaGFyICopKHVuc2lnbmVkIGxvbmcpaGFuZGxlOwogCXJlcS0+Y250IC09IHJlcV9jbnQ7CkBAIC02NTYsNyArNjU1LDcgQEAKIAkJcmV0dXJuOwogCX0KIAotCXZoYSA9IHNwLT52aGE7CisJdmhhID0gc3AtPmZjcG9ydC0+dmhhOwogCXJlcSA9IHNwLT5xdWU7CiAKIAkvKiBTZXQgdHJhbnNmZXIgZGlyZWN0aW9uICovCkBAIC03MjMsNyArNzIyLDcgQEAKIAlzdHJ1Y3QgcmVxX3F1ZSAqcmVxID0gTlVMTDsKIAlzdHJ1Y3QgcnNwX3F1ZSAqcnNwID0gTlVMTDsKIAlzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQgPSBzcC0+Y21kOwotCXN0cnVjdCBzY3NpX3FsYV9ob3N0ICp2aGEgPSBzcC0+dmhhOworCXN0cnVjdCBzY3NpX3FsYV9ob3N0ICp2aGEgPSBzcC0+ZmNwb3J0LT52aGE7CiAJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CiAJdWludDE2X3QgcXVlX2lkOwogCkBAIC03OTEsNyArNzkwLDYgQEAKIAkvKiBCdWlsZCBjb21tYW5kIHBhY2tldC4gKi8KIAlyZXEtPmN1cnJlbnRfb3V0c3RhbmRpbmdfY21kID0gaGFuZGxlOwogCXJlcS0+b3V0c3RhbmRpbmdfY21kc1toYW5kbGVdID0gc3A7Ci0Jc3AtPnZoYSA9IHZoYTsKIAlzcC0+Y21kLT5ob3N0X3NjcmliYmxlID0gKHVuc2lnbmVkIGNoYXIgKikodW5zaWduZWQgbG9uZyloYW5kbGU7CiAJcmVxLT5jbnQgLT0gcmVxX2NudDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2lzci5jIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2lzci5jCmluZGV4IGQ1ZmI3OWEuLjc4OWZjNTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9pc3IuYworKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfaXNyLmMKQEAgLTI3NSw3ICsyNzUsNyBAQAogcWxhMngwMF9hc3luY19ldmVudChzY3NpX3FsYV9ob3N0X3QgKnZoYSwgc3RydWN0IHJzcF9xdWUgKnJzcCwgdWludDE2X3QgKm1iKQogewogI2RlZmluZSBMU19VTktOT1dOCTIKLQlzdGF0aWMgY2hhcgkqbGlua19zcGVlZHNbNV0gPSB7ICIxIiwgIjIiLCAiPyIsICI0IiwgIjgiIH07CisJc3RhdGljIGNoYXIJKmxpbmtfc3BlZWRzW10gPSB7ICIxIiwgIjIiLCAiPyIsICI0IiwgIjgiLCAiMTAiIH07CiAJY2hhcgkJKmxpbmtfc3BlZWQ7CiAJdWludDE2X3QJaGFuZGxlX2NudDsKIAl1aW50MTZfdAljbnQ7CkBAIC0yODgsNiArMjg4LDggQEAKIAogCS8qIFNldHVwIHRvIHByb2Nlc3MgUklPIGNvbXBsZXRpb24uICovCiAJaGFuZGxlX2NudCA9IDA7CisJaWYgKElTX1FMQTgxWFgoaGEpKQorCQlnb3RvIHNraXBfcmlvOwogCXN3aXRjaCAobWJbMF0pIHsKIAljYXNlIE1CQV9TQ1NJX0NPTVBMRVRJT046CiAJCWhhbmRsZXNbMF0gPSBsZTMyX3RvX2NwdSgodWludDMyX3QpKChtYlsyXSA8PCAxNikgfCBtYlsxXSkpOwpAQCAtMzM5LDcgKzM0MSw3IEBACiAJZGVmYXVsdDoKIAkJYnJlYWs7CiAJfQotCitza2lwX3JpbzoKIAlzd2l0Y2ggKG1iWzBdKSB7CiAJY2FzZSBNQkFfU0NTSV9DT01QTEVUSU9OOgkvKiBGYXN0IFBvc3QgKi8KIAkJaWYgKCF2aGEtPmZsYWdzLm9ubGluZSkKQEAgLTM2Miw3ICszNjQsNiBAQAogCQkgICAgIklTUCBTeXN0ZW0gRXJyb3IgLSBtYngxPSV4aCBtYngyPSV4aCBtYngzPSV4aC5cbiIsCiAJCSAgICBtYlsxXSwgbWJbMl0sIG1iWzNdKTsKIAotCQlxbGEyeDAwX3Bvc3RfaHdlX3dvcmsodmhhLCBtYlswXSwgbWJbMV0sIG1iWzJdLCBtYlszXSk7CiAJCWhhLT5pc3Bfb3BzLT5md19kdW1wKHZoYSwgMSk7CiAKIAkJaWYgKElTX0ZXSTJfQ0FQQUJMRShoYSkpIHsKQEAgLTM4Nyw3ICszODgsNiBAQAogCQkgICAgdmhhLT5ob3N0X25vKSk7CiAJCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwgIklTUCBSZXF1ZXN0IFRyYW5zZmVyIEVycm9yLlxuIik7CiAKLQkJcWxhMngwMF9wb3N0X2h3ZV93b3JrKHZoYSwgbWJbMF0sIG1iWzFdLCBtYlsyXSwgbWJbM10pOwogCQlzZXRfYml0KElTUF9BQk9SVF9ORUVERUQsICZ2aGEtPmRwY19mbGFncyk7CiAJCWJyZWFrOwogCkBAIC0zOTYsNyArMzk2LDYgQEAKIAkJICAgIHZoYS0+aG9zdF9ubykpOwogCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsICJJU1AgUmVzcG9uc2UgVHJhbnNmZXIgRXJyb3IuXG4iKTsKIAotCQlxbGEyeDAwX3Bvc3RfaHdlX3dvcmsodmhhLCBtYlswXSwgbWJbMV0sIG1iWzJdLCBtYlszXSk7CiAJCXNldF9iaXQoSVNQX0FCT1JUX05FRURFRCwgJnZoYS0+ZHBjX2ZsYWdzKTsKIAkJYnJlYWs7CiAKQEAgLTQzNiw2ICs0MzUsOCBAQAogCQkJbGlua19zcGVlZCA9IGxpbmtfc3BlZWRzW0xTX1VOS05PV05dOwogCQkJaWYgKG1iWzFdIDwgNSkKIAkJCQlsaW5rX3NwZWVkID0gbGlua19zcGVlZHNbbWJbMV1dOworCQkJZWxzZSBpZiAobWJbMV0gPT0gMHgxMykKKwkJCQlsaW5rX3NwZWVkID0gbGlua19zcGVlZHNbNV07CiAJCQloYS0+bGlua19kYXRhX3JhdGUgPSBtYlsxXTsKIAkJfQogCkBAIC00OTUsMTIgKzQ5NiwxNyBAQAogCQlxbGEyeDAwX3Bvc3RfYWVuX3dvcmsodmhhLCBGQ0hfRVZUX0xJUFJFU0VULCBtYlsxXSk7CiAJCWJyZWFrOwogCisJLyogY2FzZSBNQkFfRENCWF9DT01QTEVURTogKi8KIAljYXNlIE1CQV9QT0lOVF9UT19QT0lOVDoJLyogUG9pbnQtdG8tUG9pbnQgKi8KIAkJaWYgKElTX1FMQTIxMDAoaGEpKQogCQkJYnJlYWs7CiAKLQkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBBc3luY2hyb25vdXMgUDJQIE1PREUgcmVjZWl2ZWQuXG4iLAotCQkgICAgdmhhLT5ob3N0X25vKSk7CisJCWlmIChJU19RTEE4MVhYKGhhKSkKKwkJCURFQlVHMihwcmludGsoInNjc2koJWxkKTogRENCWCBDb21wbGV0ZWQgLS0gJTA0eCAlMDR4ICIKKwkJCSAgICAiJTA0eFxuIiwgdmhhLT5ob3N0X25vLCBtYlsxXSwgbWJbMl0sIG1iWzNdKSk7CisJCWVsc2UKKwkJCURFQlVHMihwcmludGsoInNjc2koJWxkKTogQXN5bmNocm9ub3VzIFAyUCBNT0RFICIKKwkJCSAgICAicmVjZWl2ZWQuXG4iLCB2aGEtPmhvc3Rfbm8pKTsKIAogCQkvKgogCQkgKiBVbnRpbCB0aGVyZSdzIGEgdHJhbnNpdGlvbiBmcm9tIGxvb3AgZG93biB0byBsb29wIHVwLCB0cmVhdApAQCAtNjQxLDEwICs2NDcsNyBAQAogCiAJLyogY2FzZSBNQkFfUklPX1JFU1BPTlNFOiAqLwogCWNhc2UgTUJBX1pJT19SRVNQT05TRToKLQkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBbUnxaXUlPIHVwZGF0ZSBjb21wbGV0aW9uLlxuIiwKLQkJICAgIHZoYS0+aG9zdF9ubykpOwotCQlERUJVRyhwcmludGsoS0VSTl9JTkZPCi0JCSAgICAic2NzaSglbGQpOiBbUnxaXUlPIHVwZGF0ZSBjb21wbGV0aW9uLlxuIiwKKwkJREVCVUczKHByaW50aygic2NzaSglbGQpOiBbUnxaXUlPIHVwZGF0ZSBjb21wbGV0aW9uLlxuIiwKIAkJICAgIHZoYS0+aG9zdF9ubykpOwogCiAJCWlmIChJU19GV0kyX0NBUEFCTEUoaGEpKQpAQCAtNjk4LDYgKzcwMSwzNSBAQAogCQl9CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhhLT5jczg0eHgtPmFjY2Vzc19sb2NrLCBmbGFncyk7CiAJCWJyZWFrOworCWNhc2UgTUJBX0RDQlhfU1RBUlQ6CisJCURFQlVHMihwcmludGsoInNjc2koJWxkKTogRENCWCBTdGFydGVkIC0tICUwNHggJTA0eCAlMDR4XG4iLAorCQkgICAgdmhhLT5ob3N0X25vLCBtYlsxXSwgbWJbMl0sIG1iWzNdKSk7CisJCWJyZWFrOworCWNhc2UgTUJBX0RDQlhfUEFSQU1fVVBEQVRFOgorCQlERUJVRzIocHJpbnRrKCJzY3NpKCVsZCk6IERDQlggUGFyYW1ldGVycyBVcGRhdGVkIC0tICIKKwkJICAgICIlMDR4ICUwNHggJTA0eFxuIiwgdmhhLT5ob3N0X25vLCBtYlsxXSwgbWJbMl0sIG1iWzNdKSk7CisJCWJyZWFrOworCWNhc2UgTUJBX0ZDRl9DT05GX0VSUjoKKwkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBGQ0YgQ29uZmlndXJhdGlvbiBFcnJvciAtLSAiCisJCSAgICAiJTA0eCAlMDR4ICUwNHhcbiIsIHZoYS0+aG9zdF9ubywgbWJbMV0sIG1iWzJdLCBtYlszXSkpOworCQlicmVhazsKKwljYXNlIE1CQV9JRENfQ09NUExFVEU6CisJCURFQlVHMihwcmludGsoInNjc2koJWxkKTogSW50ZXItRHJpdmVyIENvbW11Y2F0aW9uICIKKwkJICAgICJDb21wbGV0ZSAtLSAlMDR4ICUwNHggJTA0eFxuIiwgdmhhLT5ob3N0X25vLCBtYlsxXSwgbWJbMl0sCisJCSAgICBtYlszXSkpOworCQlicmVhazsKKwljYXNlIE1CQV9JRENfTk9USUZZOgorCQlERUJVRzIocHJpbnRrKCJzY3NpKCVsZCk6IEludGVyLURyaXZlciBDb21tdWNhdGlvbiAiCisJCSAgICAiUmVxdWVzdCBOb3RpZmljYXRpb24gLS0gJTA0eCAlMDR4ICUwNHhcbiIsIHZoYS0+aG9zdF9ubywKKwkJICAgIG1iWzFdLCBtYlsyXSwgbWJbM10pKTsKKwkJLyoqKiogTWFpbGJveCByZWdpc3RlcnMgNCAtIDcgdmFsaWQhISEgKi8KKwkJYnJlYWs7CisJY2FzZSBNQkFfSURDX1RJTUVfRVhUOgorCQlERUJVRzIocHJpbnRrKCJzY3NpKCVsZCk6IEludGVyLURyaXZlciBDb21tdWNhdGlvbiAiCisJCSAgICAiVGltZSBFeHRlbnNpb24gLS0gJTA0eCAlMDR4ICUwNHhcbiIsIHZoYS0+aG9zdF9ubywgbWJbMV0sCisJCSAgICBtYlsyXSwgbWJbM10pKTsKKwkJLyoqKiogTWFpbGJveCByZWdpc3RlcnMgNCAtIDcgdmFsaWQhISEgKi8KKwkJYnJlYWs7CiAJfQogCiAJaWYgKCF2aGEtPnZwX2lkeCAmJiBoYS0+bnVtX3Zob3N0cykKQEAgLTE1MTAsNyArMTU0Miw3IEBACiAJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CiAJc3RydWN0IGRldmljZV9yZWdfMjR4eCBfX2lvbWVtICpyZWcgPSAmaGEtPmlvYmFzZS0+aXNwMjQ7CiAKLQlpZiAoIUlTX1FMQTI1WFgoaGEpKQorCWlmICghSVNfUUxBMjVYWChoYSkgJiYgIUlTX1FMQTgxWFgoaGEpKQogCQlyZXR1cm47CiAKIAlydmFsID0gUUxBX1NVQ0NFU1M7CkBAIC0xNTkwLDEyICsxNjIyLDYgQEAKIAkJCWlmIChwY2lfY2hhbm5lbF9vZmZsaW5lKGhhLT5wZGV2KSkKIAkJCQlicmVhazsKIAotCQkJaWYgKGhhLT5od19ldmVudF9wYXVzZV9lcnJvcnMgPT0gMCkKLQkJCQlxbGEyeDAwX3Bvc3RfaHdlX3dvcmsodmhhLCBIV19FVkVOVF9QQVJJVFlfRVJSLAotCQkJCSAgICAwLCBNU1coc3RhdCksIExTVyhzdGF0KSk7Ci0JCQllbHNlIGlmIChoYS0+aHdfZXZlbnRfcGF1c2VfZXJyb3JzIDwgMHhmZmZmZmZmZikKLQkJCQloYS0+aHdfZXZlbnRfcGF1c2VfZXJyb3JzKys7Ci0KIAkJCWhjY3IgPSBSRF9SRUdfRFdPUkQoJnJlZy0+aGNjcik7CiAKIAkJCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwgIlJJU0MgcGF1c2VkIC0tIEhDQ1I9JXgsICIKQEAgLTE3NDAsMTIgKzE3NjYsNiBAQAogCQkJaWYgKHBjaV9jaGFubmVsX29mZmxpbmUoaGEtPnBkZXYpKQogCQkJCWJyZWFrOwogCi0JCQlpZiAoaGEtPmh3X2V2ZW50X3BhdXNlX2Vycm9ycyA9PSAwKQotCQkJCXFsYTJ4MDBfcG9zdF9od2Vfd29yayh2aGEsIEhXX0VWRU5UX1BBUklUWV9FUlIsCi0JCQkJICAgIDAsIE1TVyhzdGF0KSwgTFNXKHN0YXQpKTsKLQkJCWVsc2UgaWYgKGhhLT5od19ldmVudF9wYXVzZV9lcnJvcnMgPCAweGZmZmZmZmZmKQotCQkJCWhhLT5od19ldmVudF9wYXVzZV9lcnJvcnMrKzsKLQogCQkJaGNjciA9IFJEX1JFR19EV09SRCgmcmVnLT5oY2NyKTsKIAogCQkJcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLCAiUklTQyBwYXVzZWQgLS0gSENDUj0leCwgIgpAQCAtMTk0NCw3ICsxOTY0LDggQEAKIAlkZXZpY2VfcmVnX3QgX19pb21lbSAqcmVnID0gaGEtPmlvYmFzZTsKIAogCS8qIElmIHBvc3NpYmxlLCBlbmFibGUgTVNJLVguICovCi0JaWYgKCFJU19RTEEyNDMyKGhhKSAmJiAhSVNfUUxBMjUzMihoYSkgJiYgIUlTX1FMQTg0MzIoaGEpKQorCWlmICghSVNfUUxBMjQzMihoYSkgJiYgIUlTX1FMQTI1MzIoaGEpICYmCisJICAgICFJU19RTEE4NDMyKGhhKSAmJiAhSVNfUUxBODAwMShoYSkpCiAJCWdvdG8gc2tpcF9tc2l4OwogCiAJaWYgKElTX1FMQTI0MzIoaGEpICYmIChoYS0+cGRldi0+cmV2aXNpb24gPCBRTEFfTVNJWF9DSElQX1JFVl8yNFhYIHx8CkBAIC0xOTc5LDcgKzIwMDAsOCBAQAogCSAgICAiTVNJLVg6IEZhbGxpbmcgYmFjay10byBJTlRhIG1vZGUgLS0gJWQuXG4iLCByZXQpOwogc2tpcF9tc2l4OgogCi0JaWYgKCFJU19RTEEyNFhYKGhhKSAmJiAhSVNfUUxBMjUzMihoYSkgJiYgIUlTX1FMQTg0MzIoaGEpKQorCWlmICghSVNfUUxBMjRYWChoYSkgJiYgIUlTX1FMQTI1MzIoaGEpICYmICFJU19RTEE4NDMyKGhhKSAmJgorCSAgICAhSVNfUUxBODAwMShoYSkpCiAJCWdvdG8gc2tpcF9tc2k7CiAKIAlyZXQgPSBwY2lfZW5hYmxlX21zaShoYS0+cGRldik7CkBAIC0yMDAwLDYgKzIwMjIsMTIgQEAKIAloYS0+ZmxhZ3MuaW50YV9lbmFibGVkID0gMTsKIGNsZWFyX3Jpc2NfaW50czoKIAorCS8qCisJICogRklYTUU6IE5vdGVkIHRoYXQgODAxNHMgd2VyZSBiZWluZyBkcm9wcGVkIGR1cmluZyBOSyB0ZXN0aW5nLgorCSAqIFRpbWluZyBkZWx0YXMgZHVyaW5nIE1TSS1YL0lOVGEgdHJhbnNpdGlvbnM/CisJICovCisJaWYgKElTX1FMQTgxWFgoaGEpKQorCQlnb3RvIGZhaWw7CiAJc3Bpbl9sb2NrX2lycSgmaGEtPmhhcmR3YXJlX2xvY2spOwogCWlmIChJU19GV0kyX0NBUEFCTEUoaGEpKSB7CiAJCVdSVF9SRUdfRFdPUkQoJnJlZy0+aXNwMjQuaGNjciwgSENDUlhfQ0xSX0hPU1RfSU5UKTsKQEAgLTIwNDQsNyArMjA3Miw3IEBACiAJCWlmIChwa3QgJiYgcGt0LT5oYW5kbGUgPCBNQVhfT1VUU1RBTkRJTkdfQ09NTUFORFMpIHsKIAkJCXNwID0gcmVxLT5vdXRzdGFuZGluZ19jbWRzW3BrdC0+aGFuZGxlXTsKIAkJCWlmIChzcCkKLQkJCQl2aGEgPSBzcC0+dmhhOworCQkJCXZoYSA9IHNwLT5mY3BvcnQtPnZoYTsKIAkJfQogCX0KIAlpZiAoIXZoYSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9tYnguYyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9tYnguYwppbmRleCBhOTk5NzZmLi5kYjRkZjQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfbWJ4LmMKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX21ieC5jCkBAIC0xMjMsOCArMTIzLDcgQEAKIAogCS8qIFdhaXQgZm9yIG1ieCBjbWQgY29tcGxldGlvbiB1bnRpbCB0aW1lb3V0ICovCiAKLQlpZiAoIWFib3J0X2FjdGl2ZSAmJiBpb19sb2NrX29uKSB7Ci0KKwlpZiAoKCFhYm9ydF9hY3RpdmUgJiYgaW9fbG9ja19vbikgfHwgSVNfTk9QT0xMSU5HX1RZUEUoaGEpKSB7CiAJCXNldF9iaXQoTUJYX0lOVFJfV0FJVCwgJmhhLT5tYnhfY21kX2ZsYWdzKTsKIAogCQlpZiAoSVNfRldJMl9DQVBBQkxFKGhhKSkKQEAgLTIxOCw3ICsyMTcsNyBAQAogCS8qIENsZWFuIHVwICovCiAJaGEtPm1jcCA9IE5VTEw7CiAKLQlpZiAoYWJvcnRfYWN0aXZlIHx8ICFpb19sb2NrX29uKSB7CisJaWYgKChhYm9ydF9hY3RpdmUgfHwgIWlvX2xvY2tfb24pICYmICFJU19OT1BPTExJTkdfVFlQRShoYSkpIHsKIAkJREVCVUcxMShwcmludGsoIiVzKCVsZCk6IGNoZWNraW5nIGZvciBhZGRpdGlvbmFsIHJlc3AgIgogCQkgICAgImludGVycnVwdC5cbiIsIF9fZnVuY19fLCBiYXNlX3ZoYS0+aG9zdF9ubykpOwogCkBAIC00MTIsNyArNDExLDggQEAKICAqLwogdm9pZAogcWxhMngwMF9nZXRfZndfdmVyc2lvbihzY3NpX3FsYV9ob3N0X3QgKnZoYSwgdWludDE2X3QgKm1ham9yLCB1aW50MTZfdCAqbWlub3IsCi0gICAgdWludDE2X3QgKnN1Ym1pbm9yLCB1aW50MTZfdCAqYXR0cmlidXRlcywgdWludDMyX3QgKm1lbW9yeSkKKyAgICB1aW50MTZfdCAqc3VibWlub3IsIHVpbnQxNl90ICphdHRyaWJ1dGVzLCB1aW50MzJfdCAqbWVtb3J5LCB1aW50OF90ICptcGksCisgICAgdWludDMyX3QgKm1waV9jYXBzKQogewogCWludAkJcnZhbDsKIAltYnhfY21kX3QJbWM7CkBAIC00MjMsNiArNDIzLDggQEAKIAltY3AtPm1iWzBdID0gTUJDX0dFVF9GSVJNV0FSRV9WRVJTSU9OOwogCW1jcC0+b3V0X21iID0gTUJYXzA7CiAJbWNwLT5pbl9tYiA9IE1CWF82fE1CWF81fE1CWF80fE1CWF8zfE1CWF8yfE1CWF8xfE1CWF8wOworCWlmIChJU19RTEE4MVhYKHZoYS0+aHcpKQorCQltY3AtPmluX21iIHw9IE1CWF8xM3xNQlhfMTJ8TUJYXzExfE1CWF8xMDsKIAltY3AtPmZsYWdzID0gMDsKIAltY3AtPnRvdiA9IE1CWF9UT1ZfU0VDT05EUzsKIAlydmFsID0gcWxhMngwMF9tYWlsYm94X2NvbW1hbmQodmhhLCBtY3ApOwpAQCAtNDM2LDYgKzQzOCwxMyBAQAogCQkqbWVtb3J5ID0gMHgxRkZGRjsJCQkvKiBEZWZhdWx0cyB0byAxMjhLQi4gKi8KIAllbHNlCiAJCSptZW1vcnkgPSAobWNwLT5tYls1XSA8PCAxNikgfCBtY3AtPm1iWzRdOworCWlmIChJU19RTEE4MVhYKHZoYS0+aHcpKSB7CisJCW1waVswXSA9IG1jcC0+bWJbMTBdID4+IDg7CisJCW1waVsxXSA9IG1jcC0+bWJbMTBdICYgMHhmZjsKKwkJbXBpWzJdID0gbWNwLT5tYlsxMV0gPj4gODsKKwkJbXBpWzNdID0gbWNwLT5tYlsxMV0gJiAweGZmOworCQkqbXBpX2NhcHMgPSAobWNwLT5tYlsxMl0gPDwgMTYpIHwgbWNwLT5tYlsxM107CisJfQogCiAJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKIAkJLypFTVBUWSovCkBAIC01NjgsNyArNTc3LDYgQEAKIHFsYTJ4MDBfbWJ4X3JlZ190ZXN0KHNjc2lfcWxhX2hvc3RfdCAqdmhhKQogewogCWludCBydmFsOwotCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OwogCW1ieF9jbWRfdCBtYzsKIAltYnhfY21kX3QgKm1jcCA9ICZtYzsKIApAQCAtNTk1LDE0ICs2MDMsNiBAQAogCQlpZiAobWNwLT5tYls1XSAhPSAweEE1QTUgfHwgbWNwLT5tYls2XSAhPSAweDVBNUEgfHwKIAkJICAgIG1jcC0+bWJbN10gIT0gMHgyNTI1KQogCQkJcnZhbCA9IFFMQV9GVU5DVElPTl9GQUlMRUQ7Ci0JCWlmIChydmFsID09IFFMQV9GVU5DVElPTl9GQUlMRUQpIHsKLQkJCXN0cnVjdCBkZXZpY2VfcmVnXzI0eHggX19pb21lbSAqcmVnID0KLQkJCSAgICAmaGEtPmlvYmFzZS0+aXNwMjQ7Ci0KLQkJCXFsYTJ4eHhfaHdfZXZlbnRfbG9nKHZoYSwgSFdfRVZFTlRfSVNQX0VSUiwgMCwKLQkJCSAgICBMU1coUkRfUkVHX0RXT1JEKCZyZWctPmhjY3IpKSwKLQkJCSAgICBMU1coUkRfUkVHX0RXT1JEKCZyZWctPmlzdGF0dXMpKSk7Ci0JCX0KIAl9CiAKIAlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgewpAQCAtMTM2Myw3ICsxMzYzLDEzIEBACiAKIAlERUJVRzExKHByaW50aygiJXMoJWxkKTogZW50ZXJlZC5cbiIsIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8pKTsKIAotCWlmIChJU19GV0kyX0NBUEFCTEUodmhhLT5odykpIHsKKwlpZiAoSVNfUUxBODFYWCh2aGEtPmh3KSkgeworCQkvKiBMb2dvdXQgYWNyb3NzIGFsbCBGQ0ZzLiAqLworCQltY3AtPm1iWzBdID0gTUJDX0xJUF9GVUxMX0xPR0lOOworCQltY3AtPm1iWzFdID0gQklUXzE7CisJCW1jcC0+bWJbMl0gPSAwOworCQltY3AtPm91dF9tYiA9IE1CWF8yfE1CWF8xfE1CWF8wOworCX0gZWxzZSBpZiAoSVNfRldJMl9DQVBBQkxFKHZoYS0+aHcpKSB7CiAJCW1jcC0+bWJbMF0gPSBNQkNfTElQX0ZVTExfTE9HSU47CiAJCW1jcC0+bWJbMV0gPSBCSVRfNjsKIAkJbWNwLT5tYlsyXSA9IDA7CkBAIC0xODUzLDYgKzE4NTksOSBAQAogCW1ieF9jbWRfdCBtYzsKIAltYnhfY21kX3QgKm1jcCA9ICZtYzsKIAorCWlmIChJU19RTEE4MVhYKHZoYS0+aHcpKQorCSAgICByZXR1cm4gUUxBX1NVQ0NFU1M7CisKIAlERUJVRzExKHByaW50aygicWxhMngwMF9mdWxsX2xvZ2luX2xpcCglbGQpOiBlbnRlcmVkLlxuIiwKIAkgICAgdmhhLT5ob3N0X25vKSk7CiAKQEAgLTI1MTIsNyArMjUyMSw3IEBACiAJbWJ4X2NtZF90IG1jOwogCW1ieF9jbWRfdCAqbWNwID0gJm1jOwogCi0JaWYgKCFJU19RTEEyNVhYKHZoYS0+aHcpKQorCWlmICghSVNfUUxBMjVYWCh2aGEtPmh3KSAmJiAhSVNfUUxBODFYWCh2aGEtPmh3KSkKIAkJcmV0dXJuIFFMQV9GVU5DVElPTl9GQUlMRUQ7CiAKIAlERUJVRzExKHByaW50aygiJXMoJWxkKTogZW50ZXJlZC5cbiIsIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8pKTsKQEAgLTMxNTUsNyArMzE2NCw3IEBACiAJbWNwLT5tYls3XSA9IExTVyhNU0QocnNwLT5kbWEpKTsKIAltY3AtPm1iWzVdID0gcnNwLT5sZW5ndGg7CiAJbWNwLT5tYlsxMV0gPSByc3AtPnZwX2lkeDsKLQltY3AtPm1iWzE0XSA9IHJzcC0+bXNpeC0+dmVjdG9yOworCW1jcC0+bWJbMTRdID0gcnNwLT5tc2l4LT5lbnRyeTsKIAltY3AtPm1iWzEzXSA9IHJzcC0+cmlkOwogCiAJcmVnID0gKHN0cnVjdCBkZXZpY2VfcmVnXzI1eHhtcSAqKSgodm9pZCAqKShoYS0+bXFpb2Jhc2UpICsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9taWQuYyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9taWQuYwppbmRleCAzODZmZmVhLi44ODYzMjMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfbWlkLmMKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX21pZC5jCkBAIC02MTQsOCArNjE0LDEwIEBACiAJcmVxLT52cF9pZHggPSB2cF9pZHg7CiAJcmVxLT5xb3MgPSBxb3M7CiAKLQlpZiAoaGEtPnJzcF9xX21hcFtyc3BfcXVlXSkKKwlpZiAoaGEtPnJzcF9xX21hcFtyc3BfcXVlXSkgewogCQlyZXEtPnJzcCA9IGhhLT5yc3BfcV9tYXBbcnNwX3F1ZV07CisJCXJlcS0+cnNwLT5yZXEgPSByZXE7CisJfQogCS8qIFVzZSBhbHRlcm5hdGUgUENJIGJ1cyBudW1iZXIgKi8KIAlpZiAoTVNCKHJlcS0+cmlkKSkKIAkJb3B0aW9ucyB8PSBCSVRfNDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9vcy5jIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX29zLmMKaW5kZXggOGVhOTI3Ny4uNGE3MWY1MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX29zLmMKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX29zLmMKQEAgLTQwNCwyNiArNDA0LDkgQEAKIHFsYTI0eHhfZndfdmVyc2lvbl9zdHIoc3RydWN0IHNjc2lfcWxhX2hvc3QgKnZoYSwgY2hhciAqc3RyKQogewogCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OwotCXNwcmludGYoc3RyLCAiJWQuJTAyZC4lMDJkICIsIGhhLT5md19tYWpvcl92ZXJzaW9uLAotCSAgICBoYS0+ZndfbWlub3JfdmVyc2lvbiwKLQkgICAgaGEtPmZ3X3N1Ym1pbm9yX3ZlcnNpb24pOwogCi0JaWYgKGhhLT5md19hdHRyaWJ1dGVzICYgQklUXzApCi0JCXN0cmNhdChzdHIsICJbQ2xhc3MgMl0gIik7Ci0JaWYgKGhhLT5md19hdHRyaWJ1dGVzICYgQklUXzEpCi0JCXN0cmNhdChzdHIsICJbSVBdICIpOwotCWlmIChoYS0+ZndfYXR0cmlidXRlcyAmIEJJVF8yKQotCQlzdHJjYXQoc3RyLCAiW011bHRpLUlEXSAiKTsKLQlpZiAoaGEtPmZ3X2F0dHJpYnV0ZXMgJiBCSVRfMykKLQkJc3RyY2F0KHN0ciwgIltTQi0yXSAiKTsKLQlpZiAoaGEtPmZ3X2F0dHJpYnV0ZXMgJiBCSVRfNCkKLQkJc3RyY2F0KHN0ciwgIltUMTAgQ1JDXSAiKTsKLQlpZiAoaGEtPmZ3X2F0dHJpYnV0ZXMgJiBCSVRfNSkKLQkJc3RyY2F0KHN0ciwgIltWSV0gIik7Ci0JaWYgKGhhLT5md19hdHRyaWJ1dGVzICYgQklUXzEwKQotCQlzdHJjYXQoc3RyLCAiWzg0WFhdICIpOwotCWlmIChoYS0+ZndfYXR0cmlidXRlcyAmIEJJVF8xMykKLQkJc3RyY2F0KHN0ciwgIltFeHBlcmltZW50YWxdIik7CisJc3ByaW50ZihzdHIsICIlZC4lMDJkLiUwMmQgKCV4KSIsIGhhLT5md19tYWpvcl92ZXJzaW9uLAorCSAgICBoYS0+ZndfbWlub3JfdmVyc2lvbiwgaGEtPmZ3X3N1Ym1pbm9yX3ZlcnNpb24sIGhhLT5md19hdHRyaWJ1dGVzKTsKIAlyZXR1cm4gc3RyOwogfQogCkBAIC00MzgsNyArNDIxLDYgQEAKIAlpZiAoIXNwKQogCQlyZXR1cm4gc3A7CiAKLQlzcC0+dmhhID0gdmhhOwogCXNwLT5mY3BvcnQgPSBmY3BvcnQ7CiAJc3AtPmNtZCA9IGNtZDsKIAlzcC0+cXVlID0gaGEtPnJlcV9xX21hcFswXTsKQEAgLTExODIsNyArMTE2NCw3IEBACiAJCQljb250aW51ZTsKIAkJZm9yIChjbnQgPSAxOyBjbnQgPCBNQVhfT1VUU1RBTkRJTkdfQ09NTUFORFM7IGNudCsrKSB7CiAJCQlzcCA9IHJlcS0+b3V0c3RhbmRpbmdfY21kc1tjbnRdOwotCQkJaWYgKHNwICYmIHNwLT52aGEgPT0gdmhhKSB7CisJCQlpZiAoc3AgJiYgc3AtPmZjcG9ydC0+dmhhID09IHZoYSkgewogCQkJCXJlcS0+b3V0c3RhbmRpbmdfY21kc1tjbnRdID0gTlVMTDsKIAkJCQlzcC0+Y21kLT5yZXN1bHQgPSByZXM7CiAJCQkJcWxhMngwMF9zcF9jb21wbChoYSwgc3ApOwpAQCAtMTMyOSw2ICsxMzExLDggQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzID0gMDsKIAlzdHJ1Y3QgZGV2aWNlX3JlZ18yNHh4IF9faW9tZW0gKnJlZyA9ICZoYS0+aW9iYXNlLT5pc3AyNDsKIAorCWlmIChJU19OT1BPTExJTkdfVFlQRShoYSkpCisJCXJldHVybjsKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKIAloYS0+aW50ZXJydXB0c19vbiA9IDA7CiAJV1JUX1JFR19EV09SRCgmcmVnLT5pY3RybCwgMCk7CkBAIC0xNDg4LDYgKzE0NzIsNDQgQEAKIAkucmRfcmVxX3JlZwkJPSBxbGEyNHh4X3JkX3JlcV9yZWcsCiB9OwogCitzdGF0aWMgc3RydWN0IGlzcF9vcGVyYXRpb25zIHFsYTgxeHhfaXNwX29wcyA9IHsKKwkucGNpX2NvbmZpZwkJPSBxbGEyNXh4X3BjaV9jb25maWcsCisJLnJlc2V0X2NoaXAJCT0gcWxhMjR4eF9yZXNldF9jaGlwLAorCS5jaGlwX2RpYWcJCT0gcWxhMjR4eF9jaGlwX2RpYWcsCisJLmNvbmZpZ19yaW5ncwkJPSBxbGEyNHh4X2NvbmZpZ19yaW5ncywKKwkucmVzZXRfYWRhcHRlcgkJPSBxbGEyNHh4X3Jlc2V0X2FkYXB0ZXIsCisJLm52cmFtX2NvbmZpZwkJPSBxbGE4MXh4X252cmFtX2NvbmZpZywKKwkudXBkYXRlX2Z3X29wdGlvbnMJPSBxbGE4MXh4X3VwZGF0ZV9md19vcHRpb25zLAorCS5sb2FkX3Jpc2MJCT0gcWxhMjR4eF9sb2FkX3Jpc2MsCisJLnBjaV9pbmZvX3N0cgkJPSBxbGEyNHh4X3BjaV9pbmZvX3N0ciwKKwkuZndfdmVyc2lvbl9zdHIJCT0gcWxhMjR4eF9md192ZXJzaW9uX3N0ciwKKwkuaW50cl9oYW5kbGVyCQk9IHFsYTI0eHhfaW50cl9oYW5kbGVyLAorCS5lbmFibGVfaW50cnMJCT0gcWxhMjR4eF9lbmFibGVfaW50cnMsCisJLmRpc2FibGVfaW50cnMJCT0gcWxhMjR4eF9kaXNhYmxlX2ludHJzLAorCS5hYm9ydF9jb21tYW5kCQk9IHFsYTI0eHhfYWJvcnRfY29tbWFuZCwKKwkudGFyZ2V0X3Jlc2V0CQk9IHFsYTI0eHhfYWJvcnRfdGFyZ2V0LAorCS5sdW5fcmVzZXQJCT0gcWxhMjR4eF9sdW5fcmVzZXQsCisJLmZhYnJpY19sb2dpbgkJPSBxbGEyNHh4X2xvZ2luX2ZhYnJpYywKKwkuZmFicmljX2xvZ291dAkJPSBxbGEyNHh4X2ZhYnJpY19sb2dvdXQsCisJLmNhbGNfcmVxX2VudHJpZXMJPSBOVUxMLAorCS5idWlsZF9pb2NicwkJPSBOVUxMLAorCS5wcmVwX21zX2lvY2IJCT0gcWxhMjR4eF9wcmVwX21zX2lvY2IsCisJLnByZXBfbXNfZmRtaV9pb2NiCT0gcWxhMjR4eF9wcmVwX21zX2ZkbWlfaW9jYiwKKwkucmVhZF9udnJhbQkJPSBxbGEyNXh4X3JlYWRfbnZyYW1fZGF0YSwKKwkud3JpdGVfbnZyYW0JCT0gcWxhMjV4eF93cml0ZV9udnJhbV9kYXRhLAorCS5md19kdW1wCQk9IHFsYTgxeHhfZndfZHVtcCwKKwkuYmVhY29uX29uCQk9IHFsYTI0eHhfYmVhY29uX29uLAorCS5iZWFjb25fb2ZmCQk9IHFsYTI0eHhfYmVhY29uX29mZiwKKwkuYmVhY29uX2JsaW5rCQk9IHFsYTI0eHhfYmVhY29uX2JsaW5rLAorCS5yZWFkX29wdHJvbQkJPSBxbGEyNXh4X3JlYWRfb3B0cm9tX2RhdGEsCisJLndyaXRlX29wdHJvbQkJPSBxbGEyNHh4X3dyaXRlX29wdHJvbV9kYXRhLAorCS5nZXRfZmxhc2hfdmVyc2lvbgk9IHFsYTI0eHhfZ2V0X2ZsYXNoX3ZlcnNpb24sCisJLnN0YXJ0X3Njc2kJCT0gcWxhMjR4eF9zdGFydF9zY3NpLAorCS53cnRfcmVxX3JlZwkJPSBxbGEyNHh4X3dydF9yZXFfcmVnLAorCS53cnRfcnNwX3JlZwkJPSBxbGEyNHh4X3dydF9yc3BfcmVnLAorCS5yZF9yZXFfcmVnCQk9IHFsYTI0eHhfcmRfcmVxX3JlZywKK307CisKIHN0YXRpYyBpbmxpbmUgdm9pZAogcWxhMngwMF9zZXRfaXNwX2ZsYWdzKHN0cnVjdCBxbGFfaHdfZGF0YSAqaGEpCiB7CkBAIC0xNTY3LDYgKzE1ODksMTMgQEAKIAkJaGEtPmRldmljZV90eXBlIHw9IERUX0lJRE1BOwogCQloYS0+Zndfc3Jpc2NfYWRkcmVzcyA9IFJJU0NfU1RBUlRfQUREUkVTU18yNDAwOwogCQlicmVhazsKKwljYXNlIFBDSV9ERVZJQ0VfSURfUUxPR0lDX0lTUDgwMDE6CisJCWhhLT5kZXZpY2VfdHlwZSB8PSBEVF9JU1A4MDAxOworCQloYS0+ZGV2aWNlX3R5cGUgfD0gRFRfWklPX1NVUFBPUlRFRDsKKwkJaGEtPmRldmljZV90eXBlIHw9IERUX0ZXSTI7CisJCWhhLT5kZXZpY2VfdHlwZSB8PSBEVF9JSURNQTsKKwkJaGEtPmZ3X3NyaXNjX2FkZHJlc3MgPSBSSVNDX1NUQVJUX0FERFJFU1NfMjQwMDsKKwkJYnJlYWs7CiAJfQogfQogCkBAIC0xNjI5LDcgKzE2NTgsNyBAQAogCiAJLyogRGV0ZXJtaW5lIHF1ZXVlIHJlc291cmNlcyAqLwogCWhhLT5tYXhfcXVldWVzID0gMTsKLQlpZiAocWwyeG1heHF1ZXVlcyA8PSAxIHx8ICFJU19RTEEyNVhYKGhhKSkKKwlpZiAocWwyeG1heHF1ZXVlcyA8PSAxIHx8ICghSVNfUUxBMjVYWChoYSkgJiYgIUlTX1FMQTgxWFgoaGEpKSkKIAkJZ290byBtcWlvYmFzZV9leGl0OwogCWhhLT5tcWlvYmFzZSA9IGlvcmVtYXAocGNpX3Jlc291cmNlX3N0YXJ0KGhhLT5wZGV2LCAzKSwKIAkJCXBjaV9yZXNvdXJjZV9sZW4oaGEtPnBkZXYsIDMpKTsKQEAgLTE3MDYsNyArMTczNSw4IEBACiAJICAgIHBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX1FMT0dJQ19JU1A4NDMyIHx8CiAJICAgIHBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX1FMT0dJQ19JU1A1NDIyIHx8CiAJICAgIHBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX1FMT0dJQ19JU1A1NDMyIHx8Ci0JICAgIHBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX1FMT0dJQ19JU1AyNTMyKSB7CisJICAgIHBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX1FMT0dJQ19JU1AyNTMyIHx8CisJICAgIHBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX1FMT0dJQ19JU1A4MDAxKSB7CiAJCWJhcnMgPSBwY2lfc2VsZWN0X2JhcnMocGRldiwgSU9SRVNPVVJDRV9NRU0pOwogCQlzaHQgPSAmcWxhMjR4eF9kcml2ZXJfdGVtcGxhdGU7CiAJCW1lbV9vbmx5ID0gMTsKQEAgLTE3NjAsNiArMTc5MCwxMCBAQAogCQlyc3BfbGVuZ3RoID0gUkVTUE9OU0VfRU5UUllfQ05UXzIxMDA7CiAJCWhhLT5tYXhfbG9vcF9pZCA9IFNOU19MQVNUX0xPT1BfSURfMjEwMDsKIAkJaGEtPmdpZF9saXN0X2luZm9fc2l6ZSA9IDQ7CisJCWhhLT5mbGFzaF9jb25mX29mZiA9IH4wOworCQloYS0+Zmxhc2hfZGF0YV9vZmYgPSB+MDsKKwkJaGEtPm52cmFtX2NvbmZfb2ZmID0gfjA7CisJCWhhLT5udnJhbV9kYXRhX29mZiA9IH4wOwogCQloYS0+aXNwX29wcyA9ICZxbGEyMTAwX2lzcF9vcHM7CiAJfSBlbHNlIGlmIChJU19RTEEyMjAwKGhhKSkgewogCQloYS0+bWJ4X2NvdW50ID0gTUFJTEJPWF9SRUdJU1RFUl9DT1VOVDsKQEAgLTE3NjcsNiArMTgwMSwxMCBAQAogCQlyc3BfbGVuZ3RoID0gUkVTUE9OU0VfRU5UUllfQ05UXzIxMDA7CiAJCWhhLT5tYXhfbG9vcF9pZCA9IFNOU19MQVNUX0xPT1BfSURfMjEwMDsKIAkJaGEtPmdpZF9saXN0X2luZm9fc2l6ZSA9IDQ7CisJCWhhLT5mbGFzaF9jb25mX29mZiA9IH4wOworCQloYS0+Zmxhc2hfZGF0YV9vZmYgPSB+MDsKKwkJaGEtPm52cmFtX2NvbmZfb2ZmID0gfjA7CisJCWhhLT5udnJhbV9kYXRhX29mZiA9IH4wOwogCQloYS0+aXNwX29wcyA9ICZxbGEyMTAwX2lzcF9vcHM7CiAJfSBlbHNlIGlmIChJU19RTEEyM1hYKGhhKSkgewogCQloYS0+bWJ4X2NvdW50ID0gTUFJTEJPWF9SRUdJU1RFUl9DT1VOVDsKQEAgLTE3NzYsNiArMTgxNCwxMCBAQAogCQloYS0+Z2lkX2xpc3RfaW5mb19zaXplID0gNjsKIAkJaWYgKElTX1FMQTIzMjIoaGEpIHx8IElTX1FMQTYzMjIoaGEpKQogCQkJaGEtPm9wdHJvbV9zaXplID0gT1BUUk9NX1NJWkVfMjMyMjsKKwkJaGEtPmZsYXNoX2NvbmZfb2ZmID0gfjA7CisJCWhhLT5mbGFzaF9kYXRhX29mZiA9IH4wOworCQloYS0+bnZyYW1fY29uZl9vZmYgPSB+MDsKKwkJaGEtPm52cmFtX2RhdGFfb2ZmID0gfjA7CiAJCWhhLT5pc3Bfb3BzID0gJnFsYTIzMDBfaXNwX29wczsKIAl9IGVsc2UgaWYgKElTX1FMQTI0WFhfVFlQRShoYSkpIHsKIAkJaGEtPm1ieF9jb3VudCA9IE1BSUxCT1hfUkVHSVNURVJfQ09VTlQ7CkBAIC0xNzg3LDYgKzE4MjksMTAgQEAKIAkJaGEtPm9wdHJvbV9zaXplID0gT1BUUk9NX1NJWkVfMjRYWDsKIAkJaGEtPm52cmFtX25waXZfc2l6ZSA9IFFMQV9NQVhfVlBPUlRTX1FMQTI0WFg7CiAJCWhhLT5pc3Bfb3BzID0gJnFsYTI0eHhfaXNwX29wczsKKwkJaGEtPmZsYXNoX2NvbmZfb2ZmID0gRkFSWF9BQ0NFU1NfRkxBU0hfQ09ORjsKKwkJaGEtPmZsYXNoX2RhdGFfb2ZmID0gRkFSWF9BQ0NFU1NfRkxBU0hfREFUQTsKKwkJaGEtPm52cmFtX2NvbmZfb2ZmID0gRkFSWF9BQ0NFU1NfTlZSQU1fQ09ORjsKKwkJaGEtPm52cmFtX2RhdGFfb2ZmID0gRkFSWF9BQ0NFU1NfTlZSQU1fREFUQTsKIAl9IGVsc2UgaWYgKElTX1FMQTI1WFgoaGEpKSB7CiAJCWhhLT5tYnhfY291bnQgPSBNQUlMQk9YX1JFR0lTVEVSX0NPVU5UOwogCQlyZXFfbGVuZ3RoID0gUkVRVUVTVF9FTlRSWV9DTlRfMjRYWDsKQEAgLTE3OTcsNiArMTg0MywyMyBAQAogCQloYS0+b3B0cm9tX3NpemUgPSBPUFRST01fU0laRV8yNVhYOwogCQloYS0+bnZyYW1fbnBpdl9zaXplID0gUUxBX01BWF9WUE9SVFNfUUxBMjVYWDsKIAkJaGEtPmlzcF9vcHMgPSAmcWxhMjV4eF9pc3Bfb3BzOworCQloYS0+Zmxhc2hfY29uZl9vZmYgPSBGQVJYX0FDQ0VTU19GTEFTSF9DT05GOworCQloYS0+Zmxhc2hfZGF0YV9vZmYgPSBGQVJYX0FDQ0VTU19GTEFTSF9EQVRBOworCQloYS0+bnZyYW1fY29uZl9vZmYgPSBGQVJYX0FDQ0VTU19OVlJBTV9DT05GOworCQloYS0+bnZyYW1fZGF0YV9vZmYgPSBGQVJYX0FDQ0VTU19OVlJBTV9EQVRBOworCX0gZWxzZSBpZiAoSVNfUUxBODFYWChoYSkpIHsKKwkJaGEtPm1ieF9jb3VudCA9IE1BSUxCT1hfUkVHSVNURVJfQ09VTlQ7CisJCXJlcV9sZW5ndGggPSBSRVFVRVNUX0VOVFJZX0NOVF8yNFhYOworCQlyc3BfbGVuZ3RoID0gUkVTUE9OU0VfRU5UUllfQ05UXzIzMDA7CisJCWhhLT5tYXhfbG9vcF9pZCA9IFNOU19MQVNUX0xPT1BfSURfMjMwMDsKKwkJaGEtPmluaXRfY2Jfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgbWlkX2luaXRfY2JfODF4eCk7CisJCWhhLT5naWRfbGlzdF9pbmZvX3NpemUgPSA4OworCQloYS0+b3B0cm9tX3NpemUgPSBPUFRST01fU0laRV84MVhYOworCQloYS0+aXNwX29wcyA9ICZxbGE4MXh4X2lzcF9vcHM7CisJCWhhLT5mbGFzaF9jb25mX29mZiA9IEZBUlhfQUNDRVNTX0ZMQVNIX0NPTkZfODFYWDsKKwkJaGEtPmZsYXNoX2RhdGFfb2ZmID0gRkFSWF9BQ0NFU1NfRkxBU0hfREFUQV84MVhYOworCQloYS0+bnZyYW1fY29uZl9vZmYgPSB+MDsKKwkJaGEtPm52cmFtX2RhdGFfb2ZmID0gfjA7CiAJfQogCiAJbXV0ZXhfaW5pdCgmaGEtPnZwb3J0X2xvY2spOwpAQCAtMjQ1OCwyMyArMjUyMSw2IEBACiAJcmV0dXJuIHFsYTJ4MDBfcG9zdF93b3JrKHZoYSwgZSwgMSk7CiB9CiAKLWludAotcWxhMngwMF9wb3N0X2h3ZV93b3JrKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICp2aGEsIHVpbnQxNl90IGNvZGUsIHVpbnQxNl90IGQxLAotICAgIHVpbnQxNl90IGQyLCB1aW50MTZfdCBkMykKLXsKLQlzdHJ1Y3QgcWxhX3dvcmtfZXZ0ICplOwotCi0JZSA9IHFsYTJ4MDBfYWxsb2Nfd29yayh2aGEsIFFMQV9FVlRfSFdFX0xPRywgMSk7Ci0JaWYgKCFlKQotCQlyZXR1cm4gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKLQotCWUtPnUuaHdlLmNvZGUgPSBjb2RlOwotCWUtPnUuaHdlLmQxID0gZDE7Ci0JZS0+dS5od2UuZDIgPSBkMjsKLQllLT51Lmh3ZS5kMyA9IGQzOwotCXJldHVybiBxbGEyeDAwX3Bvc3Rfd29yayh2aGEsIGUsIDEpOwotfQotCiBzdGF0aWMgdm9pZAogcWxhMngwMF9kb193b3JrKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICp2aGEpCiB7CkBAIC0yNDkyLDEwICsyNTM4LDYgQEAKIAkJCWZjX2hvc3RfcG9zdF9ldmVudCh2aGEtPmhvc3QsIGZjX2dldF9ldmVudF9udW1iZXIoKSwKIAkJCSAgICBlLT51LmFlbi5jb2RlLCBlLT51LmFlbi5kYXRhKTsKIAkJCWJyZWFrOwotCQljYXNlIFFMQV9FVlRfSFdFX0xPRzoKLQkJCXFsYTJ4eHhfaHdfZXZlbnRfbG9nKHZoYSwgZS0+dS5od2UuY29kZSwgZS0+dS5od2UuZDEsCi0JCQkgICAgZS0+dS5od2UuZDIsIGUtPnUuaHdlLmQzKTsKLQkJCWJyZWFrOwogCQl9CiAJCWlmIChlLT5mbGFncyAmIFFMQV9FVlRfRkxBR19GUkVFKQogCQkJa2ZyZWUoZSk7CkBAIC0yOTE0LDEzICsyOTU2LDE0IEBACiAKIC8qIEZpcm13YXJlIGludGVyZmFjZSByb3V0aW5lcy4gKi8KIAotI2RlZmluZSBGV19CTE9CUwk2CisjZGVmaW5lIEZXX0JMT0JTCTcKICNkZWZpbmUgRldfSVNQMjFYWAkwCiAjZGVmaW5lIEZXX0lTUDIyWFgJMQogI2RlZmluZSBGV19JU1AyMzAwCTIKICNkZWZpbmUgRldfSVNQMjMyMgkzCiAjZGVmaW5lIEZXX0lTUDI0WFgJNAogI2RlZmluZSBGV19JU1AyNVhYCTUKKyNkZWZpbmUgRldfSVNQODFYWAk2CiAKICNkZWZpbmUgRldfRklMRV9JU1AyMVhYCSJxbDIxMDBfZncuYmluIgogI2RlZmluZSBGV19GSUxFX0lTUDIyWFgJInFsMjIwMF9mdy5iaW4iCkBAIC0yOTI4LDYgKzI5NzEsNyBAQAogI2RlZmluZSBGV19GSUxFX0lTUDIzMjIJInFsMjMyMl9mdy5iaW4iCiAjZGVmaW5lIEZXX0ZJTEVfSVNQMjRYWAkicWwyNDAwX2Z3LmJpbiIKICNkZWZpbmUgRldfRklMRV9JU1AyNVhYCSJxbDI1MDBfZncuYmluIgorI2RlZmluZSBGV19GSUxFX0lTUDgxWFgJInFsODEwMF9mdy5iaW4iCiAKIHN0YXRpYyBERUZJTkVfTVVURVgocWxhX2Z3X2xvY2spOwogCkBAIC0yOTM4LDYgKzI5ODIsNyBAQAogCXsgLm5hbWUgPSBGV19GSUxFX0lTUDIzMjIsIC5zZWdzID0geyAweDgwMCwgMHgxYzAwMCwgMHgxZTAwMCwgMCB9LCB9LAogCXsgLm5hbWUgPSBGV19GSUxFX0lTUDI0WFgsIH0sCiAJeyAubmFtZSA9IEZXX0ZJTEVfSVNQMjVYWCwgfSwKKwl7IC5uYW1lID0gRldfRklMRV9JU1A4MVhYLCB9LAogfTsKIAogc3RydWN0IGZ3X2Jsb2IgKgpAQCAtMjk1OSw2ICszMDA0LDggQEAKIAkJYmxvYiA9ICZxbGFfZndfYmxvYnNbRldfSVNQMjRYWF07CiAJfSBlbHNlIGlmIChJU19RTEEyNVhYKGhhKSkgewogCQlibG9iID0gJnFsYV9md19ibG9ic1tGV19JU1AyNVhYXTsKKwl9IGVsc2UgaWYgKElTX1FMQTgxWFgoaGEpKSB7CisJCWJsb2IgPSAmcWxhX2Z3X2Jsb2JzW0ZXX0lTUDgxWFhdOwogCX0KIAogCW11dGV4X2xvY2soJnFsYV9md19sb2NrKTsKQEAgLTMxMTIsNiArMzE1OSw3IEBACiAJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfUUxPR0lDLCBQQ0lfREVWSUNFX0lEX1FMT0dJQ19JU1A1NDIyKSB9LAogCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX1FMT0dJQywgUENJX0RFVklDRV9JRF9RTE9HSUNfSVNQNTQzMikgfSwKIAl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9RTE9HSUMsIFBDSV9ERVZJQ0VfSURfUUxPR0lDX0lTUDI1MzIpIH0sCisJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfUUxPR0lDLCBQQ0lfREVWSUNFX0lEX1FMT0dJQ19JU1A4MDAxKSB9LAogCXsgMCB9LAogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBxbGEyeHh4X3BjaV90YmwpOwpAQCAtMzIwMCwzICszMjQ4LDQgQEAKIE1PRFVMRV9GSVJNV0FSRShGV19GSUxFX0lTUDIzMjIpOwogTU9EVUxFX0ZJUk1XQVJFKEZXX0ZJTEVfSVNQMjRYWCk7CiBNT0RVTEVfRklSTVdBUkUoRldfRklMRV9JU1AyNVhYKTsKK01PRFVMRV9GSVJNV0FSRShGV19GSUxFX0lTUDgxWFgpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX3N1cC5jIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX3N1cC5jCmluZGV4IGM1MzhlZTEuLjMwM2Y4ZWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9zdXAuYworKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfc3VwLmMKQEAgLTQyNSwyNyArNDI1LDI3IEBACiAjZGVmaW5lIE9QVFJPTV9CVVJTVF9EV09SRFMJKE9QVFJPTV9CVVJTVF9TSVpFIC8gNCkKIAogc3RhdGljIGlubGluZSB1aW50MzJfdAotZmxhc2hfY29uZl90b19hY2Nlc3NfYWRkcih1aW50MzJfdCBmYWRkcikKK2ZsYXNoX2NvbmZfYWRkcihzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhLCB1aW50MzJfdCBmYWRkcikKIHsKLQlyZXR1cm4gRkFSWF9BQ0NFU1NfRkxBU0hfQ09ORiB8IGZhZGRyOworCXJldHVybiBoYS0+Zmxhc2hfY29uZl9vZmYgfCBmYWRkcjsKIH0KIAogc3RhdGljIGlubGluZSB1aW50MzJfdAotZmxhc2hfZGF0YV90b19hY2Nlc3NfYWRkcih1aW50MzJfdCBmYWRkcikKK2ZsYXNoX2RhdGFfYWRkcihzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhLCB1aW50MzJfdCBmYWRkcikKIHsKLQlyZXR1cm4gRkFSWF9BQ0NFU1NfRkxBU0hfREFUQSB8IGZhZGRyOworCXJldHVybiBoYS0+Zmxhc2hfZGF0YV9vZmYgfCBmYWRkcjsKIH0KIAogc3RhdGljIGlubGluZSB1aW50MzJfdAotbnZyYW1fY29uZl90b19hY2Nlc3NfYWRkcih1aW50MzJfdCBuYWRkcikKK252cmFtX2NvbmZfYWRkcihzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhLCB1aW50MzJfdCBuYWRkcikKIHsKLQlyZXR1cm4gRkFSWF9BQ0NFU1NfTlZSQU1fQ09ORiB8IG5hZGRyOworCXJldHVybiBoYS0+bnZyYW1fY29uZl9vZmYgfCBuYWRkcjsKIH0KIAogc3RhdGljIGlubGluZSB1aW50MzJfdAotbnZyYW1fZGF0YV90b19hY2Nlc3NfYWRkcih1aW50MzJfdCBuYWRkcikKK252cmFtX2RhdGFfYWRkcihzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhLCB1aW50MzJfdCBuYWRkcikKIHsKLQlyZXR1cm4gRkFSWF9BQ0NFU1NfTlZSQU1fREFUQSB8IG5hZGRyOworCXJldHVybiBoYS0+bnZyYW1fZGF0YV9vZmYgfCBuYWRkcjsKIH0KIAogc3RhdGljIHVpbnQzMl90CkBAIC00ODEsMTAgKzQ4MSwxMiBAQAogICAgIHVpbnQzMl90IGR3b3JkcykKIHsKIAl1aW50MzJfdCBpOworCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OworCiAJLyogRHdvcmQgcmVhZHMgdG8gZmxhc2guICovCiAJZm9yIChpID0gMDsgaSA8IGR3b3JkczsgaSsrLCBmYWRkcisrKQotCQlkd3B0cltpXSA9IGNwdV90b19sZTMyKHFsYTI0eHhfcmVhZF9mbGFzaF9kd29yZCh2aGEtPmh3LAotCQkgICAgZmxhc2hfZGF0YV90b19hY2Nlc3NfYWRkcihmYWRkcikpKTsKKwkJZHdwdHJbaV0gPSBjcHVfdG9fbGUzMihxbGEyNHh4X3JlYWRfZmxhc2hfZHdvcmQoaGEsCisJCSAgICBmbGFzaF9kYXRhX2FkZHIoaGEsIGZhZGRyKSkpOwogCiAJcmV0dXJuIGR3cHRyOwogfQpAQCAtNTE4LDcgKzUyMCw3IEBACiB7CiAJdWludDMyX3QgaWRzOwogCi0JaWRzID0gcWxhMjR4eF9yZWFkX2ZsYXNoX2R3b3JkKGhhLCBmbGFzaF9kYXRhX3RvX2FjY2Vzc19hZGRyKDB4ZDAzYWIpKTsKKwlpZHMgPSBxbGEyNHh4X3JlYWRfZmxhc2hfZHdvcmQoaGEsIGZsYXNoX2NvbmZfYWRkcihoYSwgMHgwM2FiKSk7CiAJKm1hbl9pZCA9IExTQihpZHMpOwogCSpmbGFzaF9pZCA9IE1TQihpZHMpOwogCkBAIC01MzAsOCArNTMyLDcgQEAKIAkJICogRXhhbXBsZTogQVRNRUwgMHgwMCAwMSA0NSAxRgogCQkgKiBFeHRyYWN0IE1GRyBhbmQgRGV2IElEIGZyb20gbGFzdCB0d28gYnl0ZXMuCiAJCSAqLwotCQlpZHMgPSBxbGEyNHh4X3JlYWRfZmxhc2hfZHdvcmQoaGEsCi0JCSAgICBmbGFzaF9kYXRhX3RvX2FjY2Vzc19hZGRyKDB4ZDAwOWYpKTsKKwkJaWRzID0gcWxhMjR4eF9yZWFkX2ZsYXNoX2R3b3JkKGhhLCBmbGFzaF9jb25mX2FkZHIoaGEsIDB4MDA5ZikpOwogCQkqbWFuX2lkID0gTFNCKGlkcyk7CiAJCSpmbGFzaF9pZCA9IE1TQihpZHMpOwogCX0KQEAgLTU1NSw5ICs1NTYsMTMgQEAKIAogCS8qIEJlZ2luIHdpdGggc2FuZSBkZWZhdWx0cy4gKi8KIAlsb2MgPSBsb2NhdGlvbnNbMF07Ci0JKnN0YXJ0ID0gSVNfUUxBMjRYWF9UWVBFKGhhKSA/IEZBX0ZMQVNIX0xBWU9VVF9BRERSXzI0OgotCSAgICBGQV9GTEFTSF9MQVlPVVRfQUREUjsKLQorCSpzdGFydCA9IDA7CisJaWYgKElTX1FMQTI0WFhfVFlQRShoYSkpCisJCSpzdGFydCA9IEZBX0ZMQVNIX0xBWU9VVF9BRERSXzI0OworCWVsc2UgaWYgKElTX1FMQTI1WFgoaGEpKQorCQkqc3RhcnQgPSBGQV9GTEFTSF9MQVlPVVRfQUREUjsKKwllbHNlIGlmIChJU19RTEE4MVhYKGhhKSkKKwkJKnN0YXJ0ID0gRkFfRkxBU0hfTEFZT1VUX0FERFJfODE7CiAJLyogQmVnaW4gd2l0aCBmaXJzdCBQQ0kgZXhwYW5zaW9uIFJPTSBoZWFkZXIuICovCiAJYnVmID0gKHVpbnQ4X3QgKilyZXEtPnJpbmc7CiAJZGNvZGUgPSAodWludDMyX3QgKilyZXEtPnJpbmc7CkBAIC02MTgsNiArNjIzLDIyIEBACiBxbGEyeHh4X2dldF9mbHRfaW5mbyhzY3NpX3FsYV9ob3N0X3QgKnZoYSwgdWludDMyX3QgZmx0X2FkZHIpCiB7CiAJY29uc3QgY2hhciAqbG9jLCAqbG9jYXRpb25zW10gPSB7ICJERUYiLCAiRkxUIiB9OworCWNvbnN0IHVpbnQzMl90IGRlZl9md1tdID0KKwkJeyBGQV9SSVNDX0NPREVfQUREUiwgRkFfUklTQ19DT0RFX0FERFIsIEZBX1JJU0NfQ09ERV9BRERSXzgxIH07CisJY29uc3QgdWludDMyX3QgZGVmX2Jvb3RbXSA9CisJCXsgRkFfQk9PVF9DT0RFX0FERFIsIEZBX0JPT1RfQ09ERV9BRERSLCBGQV9CT09UX0NPREVfQUREUl84MSB9OworCWNvbnN0IHVpbnQzMl90IGRlZl92cGRfbnZyYW1bXSA9CisJCXsgRkFfVlBEX05WUkFNX0FERFIsIEZBX1ZQRF9OVlJBTV9BRERSLCBGQV9WUERfTlZSQU1fQUREUl84MSB9OworCWNvbnN0IHVpbnQzMl90IGRlZl9mZHRbXSA9CisJCXsgRkFfRkxBU0hfREVTQ1JfQUREUl8yNCwgRkFfRkxBU0hfREVTQ1JfQUREUiwKKwkJCUZBX0ZMQVNIX0RFU0NSX0FERFJfODEgfTsKKwljb25zdCB1aW50MzJfdCBkZWZfbnBpdl9jb25mMFtdID0KKwkJeyBGQV9OUElWX0NPTkYwX0FERFJfMjQsIEZBX05QSVZfQ09ORjBfQUREUiwKKwkJCUZBX05QSVZfQ09ORjBfQUREUl84MSB9OworCWNvbnN0IHVpbnQzMl90IGRlZl9ucGl2X2NvbmYxW10gPQorCQl7IEZBX05QSVZfQ09ORjFfQUREUl8yNCwgRkFfTlBJVl9DT05GMV9BRERSLAorCQkJRkFfTlBJVl9DT05GMV9BRERSXzgxIH07CisJdWludDMyX3QgZGVmOwogCXVpbnQxNl90ICp3cHRyOwogCXVpbnQxNl90IGNudCwgY2hrc3VtOwogCXVpbnQzMl90IHN0YXJ0OwpAQCAtNjc2LDIwICs2OTcsMTIgQEAKIAkJY2FzZSBGTFRfUkVHX0ZEVDoKIAkJCWhhLT5mbHRfcmVnaW9uX2ZkdCA9IHN0YXJ0OwogCQkJYnJlYWs7Ci0JCWNhc2UgRkxUX1JFR19IV19FVkVOVF8wOgotCQkJaWYgKCFQQ0lfRlVOQyhoYS0+cGRldi0+ZGV2Zm4pKQotCQkJCWhhLT5mbHRfcmVnaW9uX2h3X2V2ZW50ID0gc3RhcnQ7Ci0JCQlicmVhazsKLQkJY2FzZSBGTFRfUkVHX0hXX0VWRU5UXzE6Ci0JCQlpZiAoUENJX0ZVTkMoaGEtPnBkZXYtPmRldmZuKSkKLQkJCQloYS0+Zmx0X3JlZ2lvbl9od19ldmVudCA9IHN0YXJ0OwotCQkJYnJlYWs7CiAJCWNhc2UgRkxUX1JFR19OUElWX0NPTkZfMDoKLQkJCWlmICghUENJX0ZVTkMoaGEtPnBkZXYtPmRldmZuKSkKKwkJCWlmICghKFBDSV9GVU5DKGhhLT5wZGV2LT5kZXZmbikgJiAxKSkKIAkJCQloYS0+Zmx0X3JlZ2lvbl9ucGl2X2NvbmYgPSBzdGFydDsKIAkJCWJyZWFrOwogCQljYXNlIEZMVF9SRUdfTlBJVl9DT05GXzE6Ci0JCQlpZiAoUENJX0ZVTkMoaGEtPnBkZXYtPmRldmZuKSkKKwkJCWlmIChQQ0lfRlVOQyhoYS0+cGRldi0+ZGV2Zm4pICYgMSkKIAkJCQloYS0+Zmx0X3JlZ2lvbl9ucGl2X2NvbmYgPSBzdGFydDsKIAkJCWJyZWFrOwogCQl9CkBAIC02OTksMjIgKzcxMiwyNCBAQAogbm9fZmxhc2hfZGF0YToKIAkvKiBVc2UgaGFyZGNvZGVkIGRlZmF1bHRzLiAqLwogCWxvYyA9IGxvY2F0aW9uc1swXTsKLQloYS0+Zmx0X3JlZ2lvbl9mdyA9IEZBX1JJU0NfQ09ERV9BRERSOwotCWhhLT5mbHRfcmVnaW9uX2Jvb3QgPSBGQV9CT09UX0NPREVfQUREUjsKLQloYS0+Zmx0X3JlZ2lvbl92cGRfbnZyYW0gPSBGQV9WUERfTlZSQU1fQUREUjsKLQloYS0+Zmx0X3JlZ2lvbl9mZHQgPSBJU19RTEEyNFhYX1RZUEUoaGEpID8gRkFfRkxBU0hfREVTQ1JfQUREUl8yNDoKLQkgICAgRkFfRkxBU0hfREVTQ1JfQUREUjsKLQloYS0+Zmx0X3JlZ2lvbl9od19ldmVudCA9ICFQQ0lfRlVOQyhoYS0+cGRldi0+ZGV2Zm4pID8KLQkgICAgRkFfSFdfRVZFTlQwX0FERFI6IEZBX0hXX0VWRU5UMV9BRERSOwotCWhhLT5mbHRfcmVnaW9uX25waXZfY29uZiA9ICFQQ0lfRlVOQyhoYS0+cGRldi0+ZGV2Zm4pID8KLQkgICAgKElTX1FMQTI0WFhfVFlQRShoYSkgPyBGQV9OUElWX0NPTkYwX0FERFJfMjQ6IEZBX05QSVZfQ09ORjBfQUREUik6Ci0JICAgIChJU19RTEEyNFhYX1RZUEUoaGEpID8gRkFfTlBJVl9DT05GMV9BRERSXzI0OiBGQV9OUElWX0NPTkYxX0FERFIpOworCWRlZiA9IDA7CisJaWYgKElTX1FMQTI0WFhfVFlQRShoYSkpCisJCWRlZiA9IDA7CisJZWxzZSBpZiAoSVNfUUxBMjVYWChoYSkpCisJCWRlZiA9IDE7CisJZWxzZSBpZiAoSVNfUUxBODFYWChoYSkpCisJCWRlZiA9IDI7CisJaGEtPmZsdF9yZWdpb25fZncgPSBkZWZfZndbZGVmXTsKKwloYS0+Zmx0X3JlZ2lvbl9ib290ID0gZGVmX2Jvb3RbZGVmXTsKKwloYS0+Zmx0X3JlZ2lvbl92cGRfbnZyYW0gPSBkZWZfdnBkX252cmFtW2RlZl07CisJaGEtPmZsdF9yZWdpb25fZmR0ID0gZGVmX2ZkdFtkZWZdOworCWhhLT5mbHRfcmVnaW9uX25waXZfY29uZiA9ICEoUENJX0ZVTkMoaGEtPnBkZXYtPmRldmZuKSAmIDEpID8KKwkgICAgZGVmX25waXZfY29uZjBbZGVmXTogZGVmX25waXZfY29uZjFbZGVmXTsKIGRvbmU6CiAJREVCVUcyKHFsYV9wcmludGsoS0VSTl9ERUJVRywgaGEsICJGTFRbJXNdOiBib290PTB4JXggZnc9MHgleCAiCi0JICAgICJ2cGRfbnZyYW09MHgleCBmZHQ9MHgleCBmbHQ9MHgleCBod2U9MHgleCBucGl2PTB4JXguXG4iLCBsb2MsCisJICAgICJ2cGRfbnZyYW09MHgleCBmZHQ9MHgleCBmbHQ9MHgleCBucGl2PTB4JXguXG4iLCBsb2MsCiAJICAgIGhhLT5mbHRfcmVnaW9uX2Jvb3QsIGhhLT5mbHRfcmVnaW9uX2Z3LCBoYS0+Zmx0X3JlZ2lvbl92cGRfbnZyYW0sCi0JICAgIGhhLT5mbHRfcmVnaW9uX2ZkdCwgaGEtPmZsdF9yZWdpb25fZmx0LCBoYS0+Zmx0X3JlZ2lvbl9od19ldmVudCwKLQkgICAgaGEtPmZsdF9yZWdpb25fbnBpdl9jb25mKSk7CisJICAgIGhhLT5mbHRfcmVnaW9uX2ZkdCwgaGEtPmZsdF9yZWdpb25fZmx0LCBoYS0+Zmx0X3JlZ2lvbl9ucGl2X2NvbmYpKTsKIH0KIAogc3RhdGljIHZvaWQKQEAgLTc1NywxNCArNzcyLDE0IEBACiAJbWlkID0gbGUxNl90b19jcHUoZmR0LT5tYW5faWQpOwogCWZpZCA9IGxlMTZfdG9fY3B1KGZkdC0+aWQpOwogCWhhLT5mZHRfd3J0X2Rpc2FibGUgPSBmZHQtPndydF9kaXNhYmxlX2JpdHM7Ci0JaGEtPmZkdF9lcmFzZV9jbWQgPSBmbGFzaF9jb25mX3RvX2FjY2Vzc19hZGRyKDB4MDMwMCB8IGZkdC0+ZXJhc2VfY21kKTsKKwloYS0+ZmR0X2VyYXNlX2NtZCA9IGZsYXNoX2NvbmZfYWRkcihoYSwgMHgwMzAwIHwgZmR0LT5lcmFzZV9jbWQpOwogCWhhLT5mZHRfYmxvY2tfc2l6ZSA9IGxlMzJfdG9fY3B1KGZkdC0+YmxvY2tfc2l6ZSk7CiAJaWYgKGZkdC0+dW5wcm90ZWN0X3NlY19jbWQpIHsKLQkJaGEtPmZkdF91bnByb3RlY3Rfc2VjX2NtZCA9IGZsYXNoX2NvbmZfdG9fYWNjZXNzX2FkZHIoMHgwMzAwIHwKKwkJaGEtPmZkdF91bnByb3RlY3Rfc2VjX2NtZCA9IGZsYXNoX2NvbmZfYWRkcihoYSwgMHgwMzAwIHwKIAkJICAgIGZkdC0+dW5wcm90ZWN0X3NlY19jbWQpOwogCQloYS0+ZmR0X3Byb3RlY3Rfc2VjX2NtZCA9IGZkdC0+cHJvdGVjdF9zZWNfY21kID8KLQkJICAgIGZsYXNoX2NvbmZfdG9fYWNjZXNzX2FkZHIoMHgwMzAwIHwgZmR0LT5wcm90ZWN0X3NlY19jbWQpOgotCQkgICAgZmxhc2hfY29uZl90b19hY2Nlc3NfYWRkcigweDAzMzYpOworCQkgICAgZmxhc2hfY29uZl9hZGRyKGhhLCAweDAzMDAgfCBmZHQtPnByb3RlY3Rfc2VjX2NtZCk6CisJCSAgICBmbGFzaF9jb25mX2FkZHIoaGEsIDB4MDMzNik7CiAJfQogCWdvdG8gZG9uZTsKIG5vX2ZsYXNoX2RhdGE6CkBAIC03NzMsNyArNzg4LDcgQEAKIAltaWQgPSBtYW5faWQ7CiAJZmlkID0gZmxhc2hfaWQ7CiAJaGEtPmZkdF93cnRfZGlzYWJsZSA9IDB4OWM7Ci0JaGEtPmZkdF9lcmFzZV9jbWQgPSBmbGFzaF9jb25mX3RvX2FjY2Vzc19hZGRyKDB4MDNkOCk7CisJaGEtPmZkdF9lcmFzZV9jbWQgPSBmbGFzaF9jb25mX2FkZHIoaGEsIDB4MDNkOCk7CiAJc3dpdGNoIChtYW5faWQpIHsKIAljYXNlIDB4YmY6IC8qIFNUVCBmbGFzaC4gKi8KIAkJaWYgKGZsYXNoX2lkID09IDB4OGUpCkBAIC03ODIsMTYgKzc5NywxNiBAQAogCQkJaGEtPmZkdF9ibG9ja19zaXplID0gRkxBU0hfQkxLX1NJWkVfMzJLOwogCiAJCWlmIChmbGFzaF9pZCA9PSAweDgwKQotCQkJaGEtPmZkdF9lcmFzZV9jbWQgPSBmbGFzaF9jb25mX3RvX2FjY2Vzc19hZGRyKDB4MDM1Mik7CisJCQloYS0+ZmR0X2VyYXNlX2NtZCA9IGZsYXNoX2NvbmZfYWRkcihoYSwgMHgwMzUyKTsKIAkJYnJlYWs7CiAJY2FzZSAweDEzOiAvKiBTVCBNMjVQODAuICovCiAJCWhhLT5mZHRfYmxvY2tfc2l6ZSA9IEZMQVNIX0JMS19TSVpFXzY0SzsKIAkJYnJlYWs7CiAJY2FzZSAweDFmOiAvKiBBdG1lbCAyNkRGMDgxQS4gKi8KIAkJaGEtPmZkdF9ibG9ja19zaXplID0gRkxBU0hfQkxLX1NJWkVfNEs7Ci0JCWhhLT5mZHRfZXJhc2VfY21kID0gZmxhc2hfY29uZl90b19hY2Nlc3NfYWRkcigweDAzMjApOwotCQloYS0+ZmR0X3VucHJvdGVjdF9zZWNfY21kID0gZmxhc2hfY29uZl90b19hY2Nlc3NfYWRkcigweDAzMzkpOwotCQloYS0+ZmR0X3Byb3RlY3Rfc2VjX2NtZCA9IGZsYXNoX2NvbmZfdG9fYWNjZXNzX2FkZHIoMHgwMzM2KTsKKwkJaGEtPmZkdF9lcmFzZV9jbWQgPSBmbGFzaF9jb25mX2FkZHIoaGEsIDB4MDMyMCk7CisJCWhhLT5mZHRfdW5wcm90ZWN0X3NlY19jbWQgPSBmbGFzaF9jb25mX2FkZHIoaGEsIDB4MDMzOSk7CisJCWhhLT5mZHRfcHJvdGVjdF9zZWNfY21kID0gZmxhc2hfY29uZl9hZGRyKGhhLCAweDAzMzYpOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQkvKiBEZWZhdWx0IHRvIDY0IGtiIHNlY3RvciBzaXplLiAqLwpAQCAtODEzLDcgKzgyOCw3IEBACiAJdWludDMyX3QgZmx0X2FkZHI7CiAJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CiAKLQlpZiAoIUlTX1FMQTI0WFhfVFlQRShoYSkgJiYgIUlTX1FMQTI1WFgoaGEpKQorCWlmICghSVNfUUxBMjRYWF9UWVBFKGhhKSAmJiAhSVNfUUxBMjVYWChoYSkgJiYgIUlTX1FMQTgxWFgoaGEpKQogCQlyZXR1cm4gUUxBX1NVQ0NFU1M7CiAKIAlyZXQgPSBxbGEyeHh4X2ZpbmRfZmx0X3N0YXJ0KHZoYSwgJmZsdF9hZGRyKTsKQEAgLTgzOCw3ICs4NTMsNyBAQAogCXN0cnVjdCBxbGFfbnBpdl9lbnRyeSAqZW50cnk7CiAJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CiAKLQlpZiAoIUlTX1FMQTI0WFhfVFlQRShoYSkgJiYgIUlTX1FMQTI1WFgoaGEpKQorCWlmICghSVNfUUxBMjRYWF9UWVBFKGhhKSAmJiAhSVNfUUxBMjVYWChoYSkgJiYgIUlTX1FMQTgxWFgoaGEpKQogCQlyZXR1cm47CiAKIAloYS0+aXNwX29wcy0+cmVhZF9vcHRyb20odmhhLCAodWludDhfdCAqKSZoZHIsCkBAIC05MzAsOSArOTQ1LDkgQEAKIAkJcmV0dXJuOwogCiAJLyogRGlzYWJsZSBmbGFzaCB3cml0ZS1wcm90ZWN0aW9uLiAqLwotCXFsYTI0eHhfd3JpdGVfZmxhc2hfZHdvcmQoaGEsIGZsYXNoX2NvbmZfdG9fYWNjZXNzX2FkZHIoMHgxMDEpLCAwKTsKKwlxbGEyNHh4X3dyaXRlX2ZsYXNoX2R3b3JkKGhhLCBmbGFzaF9jb25mX2FkZHIoaGEsIDB4MTAxKSwgMCk7CiAJLyogU29tZSBmbGFzaCBwYXJ0cyBuZWVkIGFuIGFkZGl0aW9uYWwgemVyby13cml0ZSB0byBjbGVhciBiaXRzLiovCi0JcWxhMjR4eF93cml0ZV9mbGFzaF9kd29yZChoYSwgZmxhc2hfY29uZl90b19hY2Nlc3NfYWRkcigweDEwMSksIDApOworCXFsYTI0eHhfd3JpdGVfZmxhc2hfZHdvcmQoaGEsIGZsYXNoX2NvbmZfYWRkcihoYSwgMHgxMDEpLCAwKTsKIH0KIAogc3RhdGljIHZvaWQKQEAgLTk0NSwxMSArOTYwLDEwIEBACiAJCWdvdG8gc2tpcF93cnRfcHJvdGVjdDsKIAogCS8qIEVuYWJsZSBmbGFzaCB3cml0ZS1wcm90ZWN0aW9uIGFuZCB3YWl0IGZvciBjb21wbGV0aW9uLiAqLwotCXFsYTI0eHhfd3JpdGVfZmxhc2hfZHdvcmQoaGEsIGZsYXNoX2NvbmZfdG9fYWNjZXNzX2FkZHIoMHgxMDEpLAorCXFsYTI0eHhfd3JpdGVfZmxhc2hfZHdvcmQoaGEsIGZsYXNoX2NvbmZfYWRkcihoYSwgMHgxMDEpLAogCSAgICBoYS0+ZmR0X3dydF9kaXNhYmxlKTsKIAlmb3IgKGNudCA9IDMwMDsgY250ICYmCi0JICAgIHFsYTI0eHhfcmVhZF9mbGFzaF9kd29yZChoYSwKLQkJICAgIGZsYXNoX2NvbmZfdG9fYWNjZXNzX2FkZHIoMHgwMDUpKSAmIEJJVF8wOworCSAgICBxbGEyNHh4X3JlYWRfZmxhc2hfZHdvcmQoaGEsIGZsYXNoX2NvbmZfYWRkcihoYSwgMHgwMDUpKSAmIEJJVF8wOwogCSAgICBjbnQtLSkgewogCQl1ZGVsYXkoMTApOwogCX0KQEAgLTk3Nyw3ICs5OTEsNyBAQAogCXJldCA9IFFMQV9TVUNDRVNTOwogCiAJLyogUHJlcGFyZSBidXJzdC1jYXBhYmxlIHdyaXRlIG9uIHN1cHBvcnRlZCBJU1BzLiAqLwotCWlmIChJU19RTEEyNVhYKGhhKSAmJiAhKGZhZGRyICYgMHhmZmYpICYmCisJaWYgKChJU19RTEEyNVhYKGhhKSB8fCBJU19RTEE4MVhYKGhhKSkgJiYgIShmYWRkciAmIDB4ZmZmKSAmJgogCSAgICBkd29yZHMgPiBPUFRST01fQlVSU1RfRFdPUkRTKSB7CiAJCW9wdHJvbSA9IGRtYV9hbGxvY19jb2hlcmVudCgmaGEtPnBkZXYtPmRldiwgT1BUUk9NX0JVUlNUX1NJWkUsCiAJCSAgICAmb3B0cm9tX2RtYSwgR0ZQX0tFUk5FTCk7CkBAIC05ODksNyArMTAwMyw3IEBACiAJfQogCiAJcmVzdF9hZGRyID0gKGhhLT5mZHRfYmxvY2tfc2l6ZSA+PiAyKSAtIDE7Ci0Jc2VjX21hc2sgPSAweDgwMDAwIC0gKGhhLT5mZHRfYmxvY2tfc2l6ZSA+PiAyKTsKKwlzZWNfbWFzayA9IChoYS0+b3B0cm9tX3NpemUgPj4gMikgLSAoaGEtPmZkdF9ibG9ja19zaXplID4+IDIpOwogCiAJcWxhMjR4eF91bnByb3RlY3RfZmxhc2goaGEpOwogCkBAIC0xMDI0LDEzICsxMDM4LDEzIEBACiAJCQkJKnMgPSBjcHVfdG9fbGUzMigqZCk7CiAKIAkJCXJldCA9IHFsYTJ4MDBfbG9hZF9yYW0odmhhLCBvcHRyb21fZG1hLAotCQkJICAgIGZsYXNoX2RhdGFfdG9fYWNjZXNzX2FkZHIoZmFkZHIpLAorCQkJICAgIGZsYXNoX2RhdGFfYWRkcihoYSwgZmFkZHIpLAogCQkJICAgIE9QVFJPTV9CVVJTVF9EV09SRFMpOwogCQkJaWYgKHJldCAhPSBRTEFfU1VDQ0VTUykgewogCQkJCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKIAkJCQkgICAgIlVuYWJsZSB0byBidXJzdC13cml0ZSBvcHRyb20gc2VnbWVudCAiCiAJCQkJICAgICIoJXgvJXgvJWxseCkuXG4iLCByZXQsCi0JCQkJICAgIGZsYXNoX2RhdGFfdG9fYWNjZXNzX2FkZHIoZmFkZHIpLAorCQkJCSAgICBmbGFzaF9kYXRhX2FkZHIoaGEsIGZhZGRyKSwKIAkJCQkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylvcHRyb21fZG1hKTsKIAkJCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCiAJCQkJICAgICJSZXZlcnRpbmcgdG8gc2xvdy13cml0ZS5cbiIpOwpAQCAtMTA0Nyw3ICsxMDYxLDcgQEAKIAkJfQogCiAJCXJldCA9IHFsYTI0eHhfd3JpdGVfZmxhc2hfZHdvcmQoaGEsCi0JCSAgICBmbGFzaF9kYXRhX3RvX2FjY2Vzc19hZGRyKGZhZGRyKSwgY3B1X3RvX2xlMzIoKmR3cHRyKSk7CisJCSAgICBmbGFzaF9kYXRhX2FkZHIoaGEsIGZhZGRyKSwgY3B1X3RvX2xlMzIoKmR3cHRyKSk7CiAJCWlmIChyZXQgIT0gUUxBX1NVQ0NFU1MpIHsKIAkJCURFQlVHOShwcmludGsoIiVzKCVsZCkgVW5hYmxlIHRvIHByb2dyYW0gZmxhc2ggIgogCQkJICAgICJhZGRyZXNzPSV4IGRhdGE9JXguXG4iLCBfX2Z1bmNfXywKQEAgLTEwOTgsMTIgKzExMTIsMTMgQEAKIHsKIAl1aW50MzJfdCBpOwogCXVpbnQzMl90ICpkd3B0cjsKKwlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKIAogCS8qIER3b3JkIHJlYWRzIHRvIGZsYXNoLiAqLwogCWR3cHRyID0gKHVpbnQzMl90ICopYnVmOwogCWZvciAoaSA9IDA7IGkgPCBieXRlcyA+PiAyOyBpKyssIG5hZGRyKyspCi0JCWR3cHRyW2ldID0gY3B1X3RvX2xlMzIocWxhMjR4eF9yZWFkX2ZsYXNoX2R3b3JkKHZoYS0+aHcsCi0JCSAgICBudnJhbV9kYXRhX3RvX2FjY2Vzc19hZGRyKG5hZGRyKSkpOworCQlkd3B0cltpXSA9IGNwdV90b19sZTMyKHFsYTI0eHhfcmVhZF9mbGFzaF9kd29yZChoYSwKKwkJICAgIG52cmFtX2RhdGFfYWRkcihoYSwgbmFkZHIpKSk7CiAKIAlyZXR1cm4gYnVmOwogfQpAQCAtMTE2MCwxNyArMTE3NSwxNCBAQAogCVJEX1JFR19EV09SRCgmcmVnLT5jdHJsX3N0YXR1cyk7CS8qIFBDSSBQb3N0aW5nLiAqLwogCiAJLyogRGlzYWJsZSBOVlJBTSB3cml0ZS1wcm90ZWN0aW9uLiAqLwotCXFsYTI0eHhfd3JpdGVfZmxhc2hfZHdvcmQoaGEsIG52cmFtX2NvbmZfdG9fYWNjZXNzX2FkZHIoMHgxMDEpLAotCSAgICAwKTsKLQlxbGEyNHh4X3dyaXRlX2ZsYXNoX2R3b3JkKGhhLCBudnJhbV9jb25mX3RvX2FjY2Vzc19hZGRyKDB4MTAxKSwKLQkgICAgMCk7CisJcWxhMjR4eF93cml0ZV9mbGFzaF9kd29yZChoYSwgbnZyYW1fY29uZl9hZGRyKGhhLCAweDEwMSksIDApOworCXFsYTI0eHhfd3JpdGVfZmxhc2hfZHdvcmQoaGEsIG52cmFtX2NvbmZfYWRkcihoYSwgMHgxMDEpLCAwKTsKIAogCS8qIER3b3JkIHdyaXRlcyB0byBmbGFzaC4gKi8KIAlkd3B0ciA9ICh1aW50MzJfdCAqKWJ1ZjsKIAlmb3IgKGkgPSAwOyBpIDwgYnl0ZXMgPj4gMjsgaSsrLCBuYWRkcisrLCBkd3B0cisrKSB7CiAJCXJldCA9IHFsYTI0eHhfd3JpdGVfZmxhc2hfZHdvcmQoaGEsCi0JCSAgICBudnJhbV9kYXRhX3RvX2FjY2Vzc19hZGRyKG5hZGRyKSwKLQkJICAgIGNwdV90b19sZTMyKCpkd3B0cikpOworCQkgICAgbnZyYW1fZGF0YV9hZGRyKGhhLCBuYWRkciksIGNwdV90b19sZTMyKCpkd3B0cikpOwogCQlpZiAocmV0ICE9IFFMQV9TVUNDRVNTKSB7CiAJCQlERUJVRzkocWxhX3ByaW50aygiVW5hYmxlIHRvIHByb2dyYW0gbnZyYW0gYWRkcmVzcz0leCAiCiAJCQkgICAgImRhdGE9JXguXG4iLCBuYWRkciwgKmR3cHRyKSk7CkBAIC0xMTc5LDggKzExOTEsNyBAQAogCX0KIAogCS8qIEVuYWJsZSBOVlJBTSB3cml0ZS1wcm90ZWN0aW9uLiAqLwotCXFsYTI0eHhfd3JpdGVfZmxhc2hfZHdvcmQoaGEsIG52cmFtX2NvbmZfdG9fYWNjZXNzX2FkZHIoMHgxMDEpLAotCSAgICAweDhjKTsKKwlxbGEyNHh4X3dyaXRlX2ZsYXNoX2R3b3JkKGhhLCBudnJhbV9jb25mX2FkZHIoaGEsIDB4MTAxKSwgMHg4Yyk7CiAKIAkvKiBEaXNhYmxlIGZsYXNoIHdyaXRlLiAqLwogCVdSVF9SRUdfRFdPUkQoJnJlZy0+Y3RybF9zdGF0dXMsCkBAIC0xMjAyLDggKzEyMTMsNyBAQAogCWR3cHRyID0gKHVpbnQzMl90ICopYnVmOwogCWZvciAoaSA9IDA7IGkgPCBieXRlcyA+PiAyOyBpKyssIG5hZGRyKyspCiAJCWR3cHRyW2ldID0gY3B1X3RvX2xlMzIocWxhMjR4eF9yZWFkX2ZsYXNoX2R3b3JkKGhhLAotCQkgICAgZmxhc2hfZGF0YV90b19hY2Nlc3NfYWRkcihoYS0+Zmx0X3JlZ2lvbl92cGRfbnZyYW0gfAotCQkgICAgbmFkZHIpKSk7CisJCSAgICBmbGFzaF9kYXRhX2FkZHIoaGEsIGhhLT5mbHRfcmVnaW9uX3ZwZF9udnJhbSB8IG5hZGRyKSkpOwogCiAJcmV0dXJuIGJ1ZjsKIH0KQEAgLTIyNDYsMTIgKzIyNTYsMTIgQEAKIAkJCWJ1cnN0ID0gbGVmdDsKIAogCQlydmFsID0gcWxhMngwMF9kdW1wX3JhbSh2aGEsIG9wdHJvbV9kbWEsCi0JCSAgICBmbGFzaF9kYXRhX3RvX2FjY2Vzc19hZGRyKGZhZGRyKSwgYnVyc3QpOworCQkgICAgZmxhc2hfZGF0YV9hZGRyKGhhLCBmYWRkciksIGJ1cnN0KTsKIAkJaWYgKHJ2YWwpIHsKIAkJCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKIAkJCSAgICAiVW5hYmxlIHRvIGJ1cnN0LXJlYWQgb3B0cm9tIHNlZ21lbnQgIgogCQkJICAgICIoJXgvJXgvJWxseCkuXG4iLCBydmFsLAotCQkJICAgIGZsYXNoX2RhdGFfdG9fYWNjZXNzX2FkZHIoZmFkZHIpLAorCQkJICAgIGZsYXNoX2RhdGFfYWRkcihoYSwgZmFkZHIpLAogCQkJICAgICh1bnNpZ25lZCBsb25nIGxvbmcpb3B0cm9tX2RtYSk7CiAJCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCiAJCQkgICAgIlJldmVydGluZyB0byBzbG93LXJlYWQuXG4iKTsKQEAgLTI2NDgsMTA4ICsyNjU4LDMgQEAKIAogCXJldHVybiAwOwogfQotCi1zdGF0aWMgaW50Ci1xbGEyeHh4X2h3X2V2ZW50X3N0b3JlKHNjc2lfcWxhX2hvc3RfdCAqdmhhLCB1aW50MzJfdCAqZmRhdGEpCi17Ci0JdWludDMyX3QgZFsyXSwgZmFkZHI7Ci0Jc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7Ci0KLQkvKiBMb2NhdGUgZmlyc3QgZW1wdHkgZW50cnkuICovCi0JZm9yICg7OykgewotCQlpZiAoaGEtPmh3X2V2ZW50X3B0ciA+PQotCQkgICAgaGEtPmZsdF9yZWdpb25faHdfZXZlbnQgKyBGQV9IV19FVkVOVF9TSVpFKSB7Ci0JCQlERUJVRzIocWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAotCQkJICAgICJIVyBldmVudCAtLSBMb2cgRnVsbCFcbiIpKTsKLQkJCXJldHVybiBRTEFfTUVNT1JZX0FMTE9DX0ZBSUxFRDsKLQkJfQotCi0JCXFsYTI0eHhfcmVhZF9mbGFzaF9kYXRhKHZoYSwgZCwgaGEtPmh3X2V2ZW50X3B0ciwgMik7Ci0JCWZhZGRyID0gZmxhc2hfZGF0YV90b19hY2Nlc3NfYWRkcihoYS0+aHdfZXZlbnRfcHRyKTsKLQkJaGEtPmh3X2V2ZW50X3B0ciArPSBGQV9IV19FVkVOVF9FTlRSWV9TSVpFOwotCQlpZiAoZFswXSA9PSBfX2NvbnN0YW50X2NwdV90b19sZTMyKDB4ZmZmZmZmZmYpICYmCi0JCSAgICBkWzFdID09IF9fY29uc3RhbnRfY3B1X3RvX2xlMzIoMHhmZmZmZmZmZikpIHsKLQkJCXFsYTI0eHhfdW5wcm90ZWN0X2ZsYXNoKGhhKTsKLQotCQkJcWxhMjR4eF93cml0ZV9mbGFzaF9kd29yZChoYSwgZmFkZHIrKywKLQkJCSAgICBjcHVfdG9fbGUzMihqaWZmaWVzKSk7Ci0JCQlxbGEyNHh4X3dyaXRlX2ZsYXNoX2R3b3JkKGhhLCBmYWRkcisrLCAwKTsKLQkJCXFsYTI0eHhfd3JpdGVfZmxhc2hfZHdvcmQoaGEsIGZhZGRyKyssICpmZGF0YSsrKTsKLQkJCXFsYTI0eHhfd3JpdGVfZmxhc2hfZHdvcmQoaGEsIGZhZGRyKyssICpmZGF0YSk7Ci0KLQkJCXFsYTI0eHhfcHJvdGVjdF9mbGFzaChoYSk7Ci0JCQlicmVhazsKLQkJfQotCX0KLQlyZXR1cm4gUUxBX1NVQ0NFU1M7Ci19Ci0KLWludAotcWxhMnh4eF9od19ldmVudF9sb2coc2NzaV9xbGFfaG9zdF90ICp2aGEsIHVpbnQxNl90IGNvZGUsIHVpbnQxNl90IGQxLAotICAgIHVpbnQxNl90IGQyLCB1aW50MTZfdCBkMykKLXsKLSNkZWZpbmUgUU1BUksoYSwgYiwgYywgZCkgXAotICAgIGNwdV90b19sZTMyKExTQihhKSA8PCAyNCB8IExTQihiKSA8PCAxNiB8IExTQihjKSA8PCA4IHwgTFNCKGQpKQotCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OwotCWludCBydmFsOwotCXVpbnQzMl90IG1hcmtlclsyXSwgZmRhdGFbNF07Ci0KLQlpZiAoaGEtPmZsdF9yZWdpb25faHdfZXZlbnQgPT0gMCkKLQkJcmV0dXJuIFFMQV9GVU5DVElPTl9GQUlMRUQ7Ci0KLQlERUJVRzIocWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAotCSAgICAiSFcgZXZlbnQgLS0gY29kZT0leCwgZDE9JXgsIGQyPSV4LCBkMz0leC5cbiIsIGNvZGUsIGQxLCBkMiwgZDMpKTsKLQotCS8qIElmIG1hcmtlciBub3QgYWxyZWFkeSBmb3VuZCwgbG9jYXRlIG9yIHdyaXRlLiAgKi8KLQlpZiAoIWhhLT5mbGFncy5od19ldmVudF9tYXJrZXJfZm91bmQpIHsKLQkJLyogQ3JlYXRlIG1hcmtlci4gKi8KLQkJbWFya2VyWzBdID0gUU1BUksoJ0wnLCBoYS0+ZndfbWFqb3JfdmVyc2lvbiwKLQkJICAgIGhhLT5md19taW5vcl92ZXJzaW9uLCBoYS0+Zndfc3VibWlub3JfdmVyc2lvbik7Ci0JCW1hcmtlclsxXSA9IFFNQVJLKFFMQV9EUklWRVJfTUFKT1JfVkVSLCBRTEFfRFJJVkVSX01JTk9SX1ZFUiwKLQkJICAgIFFMQV9EUklWRVJfUEFUQ0hfVkVSLCBRTEFfRFJJVkVSX0JFVEFfVkVSKTsKLQotCQkvKiBMb2NhdGUgbWFya2VyLiAqLwotCQloYS0+aHdfZXZlbnRfcHRyID0gaGEtPmZsdF9yZWdpb25faHdfZXZlbnQ7Ci0JCWZvciAoOzspIHsKLQkJCXFsYTI0eHhfcmVhZF9mbGFzaF9kYXRhKHZoYSwgZmRhdGEsIGhhLT5od19ldmVudF9wdHIsCi0JCQkgICAgNCk7Ci0JCQlpZiAoZmRhdGFbMF0gPT0gX19jb25zdGFudF9jcHVfdG9fbGUzMigweGZmZmZmZmZmKSAmJgotCQkJICAgIGZkYXRhWzFdID09IF9fY29uc3RhbnRfY3B1X3RvX2xlMzIoMHhmZmZmZmZmZikpCi0JCQkJYnJlYWs7Ci0JCQloYS0+aHdfZXZlbnRfcHRyICs9IEZBX0hXX0VWRU5UX0VOVFJZX1NJWkU7Ci0JCQlpZiAoaGEtPmh3X2V2ZW50X3B0ciA+PQotCQkJICAgIGhhLT5mbHRfcmVnaW9uX2h3X2V2ZW50ICsgRkFfSFdfRVZFTlRfU0laRSkgewotCQkJCURFQlVHMihxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCi0JCQkJICAgICJIVyBldmVudCAtLSBMb2cgRnVsbCFcbiIpKTsKLQkJCQlyZXR1cm4gUUxBX01FTU9SWV9BTExPQ19GQUlMRUQ7Ci0JCQl9Ci0JCQlpZiAoZmRhdGFbMl0gPT0gbWFya2VyWzBdICYmIGZkYXRhWzNdID09IG1hcmtlclsxXSkgewotCQkJCWhhLT5mbGFncy5od19ldmVudF9tYXJrZXJfZm91bmQgPSAxOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCS8qIE5vIG1hcmtlciwgd3JpdGUgaXQuICovCi0JCWlmICghaGEtPmZsYWdzLmh3X2V2ZW50X21hcmtlcl9mb3VuZCkgewotCQkJcnZhbCA9IHFsYTJ4eHhfaHdfZXZlbnRfc3RvcmUodmhhLCBtYXJrZXIpOwotCQkJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKLQkJCQlERUJVRzIocWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAotCQkJCSAgICAiSFcgZXZlbnQgLS0gRmFpbGVkIG1hcmtlciB3cml0ZT0leC4hXG4iLAotCQkJCSAgICBydmFsKSk7Ci0JCQkJcmV0dXJuIHJ2YWw7Ci0JCQl9Ci0JCQloYS0+ZmxhZ3MuaHdfZXZlbnRfbWFya2VyX2ZvdW5kID0gMTsKLQkJfQotCX0KLQotCS8qIFN0b3JlIGVycm9yLiAgKi8KLQlmZGF0YVswXSA9IGNwdV90b19sZTMyKGNvZGUgPDwgMTYgfCBkMSk7Ci0JZmRhdGFbMV0gPSBjcHVfdG9fbGUzMihkMiA8PCAxNiB8IGQzKTsKLQlydmFsID0gcWxhMnh4eF9od19ldmVudF9zdG9yZSh2aGEsIGZkYXRhKTsKLQlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgewotCQlERUJVRzIocWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAotCQkgICAgIkhXIGV2ZW50IC0tIEZhaWxlZCBlcnJvciB3cml0ZT0leC4hXG4iLAotCQkgICAgcnZhbCkpOwotCX0KLQotCXJldHVybiBydmFsOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX3ZlcnNpb24uaCBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV92ZXJzaW9uLmgKaW5kZXggYmUyMmYzYS4uODA4YmFiNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX3ZlcnNpb24uaAorKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfdmVyc2lvbi5oCkBAIC03LDkgKzcsOSBAQAogLyoKICAqIERyaXZlciB2ZXJzaW9uCiAgKi8KLSNkZWZpbmUgUUxBMlhYWF9WRVJTSU9OICAgICAgIjguMDIuMDMtazEiCisjZGVmaW5lIFFMQTJYWFhfVkVSU0lPTiAgICAgICI4LjAzLjAwLWsxIgogCiAjZGVmaW5lIFFMQV9EUklWRVJfTUFKT1JfVkVSCTgKLSNkZWZpbmUgUUxBX0RSSVZFUl9NSU5PUl9WRVIJMgotI2RlZmluZSBRTEFfRFJJVkVSX1BBVENIX1ZFUgkzCisjZGVmaW5lIFFMQV9EUklWRVJfTUlOT1JfVkVSCTMKKyNkZWZpbmUgUUxBX0RSSVZFUl9QQVRDSF9WRVIJMAogI2RlZmluZSBRTEFfRFJJVkVSX0JFVEFfVkVSCTAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF9tYnguYyBiL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF9tYnguYwppbmRleCBjNTc3ZDc5Li4wNTFiMGY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfbWJ4LmMKKysrIGIvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X21ieC5jCkBAIC0zOTIsNyArMzkyLDcgQEAKIAkJaGEtPmlvY2JfaGl3YXQgLT0gSU9DQl9ISVdBVF9DVVNISU9OOwogCWVsc2UKIAkJZGV2X2luZm8oJmhhLT5wZGV2LT5kZXYsICJXQVJOSU5HISEhICBZb3UgaGF2ZSBsZXNzIHRoYW4gJWQgIgotCQkJICAgImZpcm1hcmUgSU9DQnMgYXZhaWxhYmxlICglZCkuXG4iLAorCQkJICAgImZpcm13YXJlIElPQ0JzIGF2YWlsYWJsZSAoJWQpLlxuIiwKIAkJCSAgIElPQ0JfSElXQVRfQ1VTSElPTiwgaGEtPmlvY2JfaGl3YXQpOwogCiAJcmV0dXJuIFFMQV9TVUNDRVNTOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3JhaWRfY2xhc3MuYyBiL2RyaXZlcnMvc2NzaS9yYWlkX2NsYXNzLmMKaW5kZXggOTEzYTkzMS4uOGU1YzE2OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3JhaWRfY2xhc3MuYworKysgYi9kcml2ZXJzL3Njc2kvcmFpZF9jbGFzcy5jCkBAIC0yMzcsOCArMjM3LDcgQEAKIAlyYy0+ZGV2LnBhcmVudCA9IGdldF9kZXZpY2UoY29tcG9uZW50X2Rldik7CiAJcmMtPm51bSA9IHJkLT5jb21wb25lbnRfY291bnQrKzsKIAotCXNucHJpbnRmKHJjLT5kZXYuYnVzX2lkLCBzaXplb2YocmMtPmRldi5idXNfaWQpLAotCQkgImNvbXBvbmVudC0lZCIsIHJjLT5udW0pOworCWRldl9zZXRfbmFtZSgmcmMtPmRldiwgImNvbXBvbmVudC0lZCIsIHJjLT5udW0pOwogCWxpc3RfYWRkX3RhaWwoJnJjLT5ub2RlLCAmcmQtPmNvbXBvbmVudF9saXN0KTsKIAlyYy0+ZGV2LmNsYXNzID0gJnJhaWRfY2xhc3MuY2xhc3M7CiAJZXJyID0gZGV2aWNlX2FkZCgmcmMtPmRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2NzaS5jIGIvZHJpdmVycy9zY3NpL3Njc2kuYwppbmRleCBmOGI3OWQ0Li40MmU3MmEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc2NzaS5jCisrKyBiL2RyaXZlcnMvc2NzaS9zY3NpLmMKQEAgLTY1MSwxMCArNjUxLDYgQEAKIAl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CiAJaW50IHJ0biA9IDA7CiAKLQkvKgotCSAqIFdlIHdpbGwgdXNlIGEgcXVldWVkIGNvbW1hbmQgaWYgcG9zc2libGUsIG90aGVyd2lzZSB3ZSB3aWxsCi0JICogZW11bGF0ZSB0aGUgcXVldWluZyBhbmQgY2FsbGluZyBvZiBjb21wbGV0aW9uIGZ1bmN0aW9uIG91cnNlbHZlcy4KLQkgKi8KIAlhdG9taWNfaW5jKCZjbWQtPmRldmljZS0+aW9yZXF1ZXN0X2NudCk7CiAKIAkvKiBjaGVjayBpZiB0aGUgZGV2aWNlIGlzIHN0aWxsIHVzYWJsZSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3Njc2lfZGVidWcuYyBiL2RyaXZlcnMvc2NzaS9zY3NpX2RlYnVnLmMKaW5kZXggMjdjNjMzZi4uNmVlYmQwYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3Njc2lfZGVidWcuYworKysgYi9kcml2ZXJzL3Njc2kvc2NzaV9kZWJ1Zy5jCkBAIC0yNTA4LDcgKzI1MDgsNyBAQAogfQogCiBzdGF0aWMgc3RydWN0IGRldmljZSBwc2V1ZG9fcHJpbWFyeSA9IHsKLQkuYnVzX2lkCQk9ICJwc2V1ZG9fMCIsCisJLmluaXRfbmFtZQk9ICJwc2V1ZG9fMCIsCiAJLnJlbGVhc2UJPSBwc2V1ZG9fMF9yZWxlYXNlLAogfTsKIApAQCAtMjY4MCw3ICsyNjgwLDcgQEAKICAgICAgICAgc2RiZ19ob3N0LT5kZXYuYnVzID0gJnBzZXVkb19sbGRfYnVzOwogICAgICAgICBzZGJnX2hvc3QtPmRldi5wYXJlbnQgPSAmcHNldWRvX3ByaW1hcnk7CiAgICAgICAgIHNkYmdfaG9zdC0+ZGV2LnJlbGVhc2UgPSAmc2RlYnVnX3JlbGVhc2VfYWRhcHRlcjsKLSAgICAgICAgc3ByaW50ZihzZGJnX2hvc3QtPmRldi5idXNfaWQsICJhZGFwdGVyJWQiLCBzY3NpX2RlYnVnX2FkZF9ob3N0KTsKKyAgICAgICAgZGV2X3NldF9uYW1lKCZzZGJnX2hvc3QtPmRldiwgImFkYXB0ZXIlZCIsIHNjc2lfZGVidWdfYWRkX2hvc3QpOwogCiAgICAgICAgIGVycm9yID0gZGV2aWNlX3JlZ2lzdGVyKCZzZGJnX2hvc3QtPmRldik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zY3NpX2Vycm9yLmMgYi9kcml2ZXJzL3Njc2kvc2NzaV9lcnJvci5jCmluZGV4IDM4MTgzOGUuLmFkNmExMzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zY3NpX2Vycm9yLmMKKysrIGIvZHJpdmVycy9zY3NpL3Njc2lfZXJyb3IuYwpAQCAtMTI0LDM0ICsxMjQsMjIgQEAKIGVudW0gYmxrX2VoX3RpbWVyX3JldHVybiBzY3NpX3RpbWVzX291dChzdHJ1Y3QgcmVxdWVzdCAqcmVxKQogewogCXN0cnVjdCBzY3NpX2NtbmQgKnNjbWQgPSByZXEtPnNwZWNpYWw7Ci0JZW51bSBibGtfZWhfdGltZXJfcmV0dXJuICgqZWhfdGltZWRfb3V0KShzdHJ1Y3Qgc2NzaV9jbW5kICopOwogCWVudW0gYmxrX2VoX3RpbWVyX3JldHVybiBydG4gPSBCTEtfRUhfTk9UX0hBTkRMRUQ7CiAKIAlzY3NpX2xvZ19jb21wbGV0aW9uKHNjbWQsIFRJTUVPVVRfRVJST1IpOwogCiAJaWYgKHNjbWQtPmRldmljZS0+aG9zdC0+dHJhbnNwb3J0dC0+ZWhfdGltZWRfb3V0KQotCQllaF90aW1lZF9vdXQgPSBzY21kLT5kZXZpY2UtPmhvc3QtPnRyYW5zcG9ydHQtPmVoX3RpbWVkX291dDsKKwkJcnRuID0gc2NtZC0+ZGV2aWNlLT5ob3N0LT50cmFuc3BvcnR0LT5laF90aW1lZF9vdXQoc2NtZCk7CiAJZWxzZSBpZiAoc2NtZC0+ZGV2aWNlLT5ob3N0LT5ob3N0dC0+ZWhfdGltZWRfb3V0KQotCQllaF90aW1lZF9vdXQgPSBzY21kLT5kZXZpY2UtPmhvc3QtPmhvc3R0LT5laF90aW1lZF9vdXQ7Ci0JZWxzZQotCQllaF90aW1lZF9vdXQgPSBOVUxMOworCQlydG4gPSBzY21kLT5kZXZpY2UtPmhvc3QtPmhvc3R0LT5laF90aW1lZF9vdXQoc2NtZCk7CiAKLQlpZiAoZWhfdGltZWRfb3V0KSB7Ci0JCXJ0biA9IGVoX3RpbWVkX291dChzY21kKTsKLQkJc3dpdGNoIChydG4pIHsKLQkJY2FzZSBCTEtfRUhfTk9UX0hBTkRMRUQ6Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXJldHVybiBydG47Ci0JCX0KLQl9Ci0KLQlpZiAodW5saWtlbHkoIXNjc2lfZWhfc2NtZF9hZGQoc2NtZCwgU0NTSV9FSF9DQU5DRUxfQ01EKSkpIHsKKwlpZiAodW5saWtlbHkocnRuID09IEJMS19FSF9OT1RfSEFORExFRCAmJgorCQkgICAgICFzY3NpX2VoX3NjbWRfYWRkKHNjbWQsIFNDU0lfRUhfQ0FOQ0VMX0NNRCkpKSB7CiAJCXNjbWQtPnJlc3VsdCB8PSBESURfVElNRV9PVVQgPDwgMTY7Ci0JCXJldHVybiBCTEtfRUhfSEFORExFRDsKKwkJcnRuID0gQkxLX0VIX0hBTkRMRUQ7CiAJfQogCi0JcmV0dXJuIEJMS19FSF9OT1RfSEFORExFRDsKKwlyZXR1cm4gcnRuOwogfQogCiAvKioKQEAgLTE2NTAsNyArMTYzOCw3IEBACiAJICogV2UgdXNlIFRBU0tfSU5URVJSVVBUSUJMRSBzbyB0aGF0IHRoZSB0aHJlYWQgaXMgbm90CiAJICogY291bnRlZCBhZ2FpbnN0IHRoZSBsb2FkIGF2ZXJhZ2UgYXMgYSBydW5uaW5nIHByb2Nlc3MuCiAJICogV2UgbmV2ZXIgYWN0dWFsbHkgZ2V0IGludGVycnVwdGVkIGJlY2F1c2Uga3RocmVhZF9ydW4KLQkgKiBkaXNhYmxlcyBzaW5nYWwgZGVsaXZlcnkgZm9yIHRoZSBjcmVhdGVkIHRocmVhZC4KKwkgKiBkaXNhYmxlcyBzaWduYWwgZGVsaXZlcnkgZm9yIHRoZSBjcmVhdGVkIHRocmVhZC4KIAkgKi8KIAlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwogCXdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2NzaV9pb2N0bC5jIGIvZHJpdmVycy9zY3NpL3Njc2lfaW9jdGwuYwppbmRleCAyYWU0ZjhmLi5iOThmNzYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc2NzaV9pb2N0bC5jCisrKyBiL2RyaXZlcnMvc2NzaS9zY3NpX2lvY3RsLmMKQEAgLTE2NywxMCArMTY3LDE3IEBACiBzdGF0aWMgaW50IHNjc2lfaW9jdGxfZ2V0X3BjaShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsIHZvaWQgX191c2VyICphcmcpCiB7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gc2NzaV9nZXRfZGV2aWNlKHNkZXYtPmhvc3QpOworCWNvbnN0IGNoYXIgKm5hbWU7CiAKICAgICAgICAgaWYgKCFkZXYpCiAJCXJldHVybiAtRU5YSU87Ci0gICAgICAgIHJldHVybiBjb3B5X3RvX3VzZXIoYXJnLCBkZXYtPmJ1c19pZCwgc2l6ZW9mKGRldi0+YnVzX2lkKSk/IC1FRkFVTFQ6IDA7CisKKwluYW1lID0gZGV2X25hbWUoZGV2KTsKKworCS8qIGNvbXBhdGliaWxpdHkgd2l0aCBvbGQgaW9jdGwgd2hpY2ggb25seSByZXR1cm5lZAorCSAqIDIwIGNoYXJhY3RlcnMgKi8KKyAgICAgICAgcmV0dXJuIGNvcHlfdG9fdXNlcihhcmcsIG5hbWUsIG1pbihzdHJsZW4obmFtZSksIChzaXplX3QpMjApKQorCQk/IC1FRkFVTFQ6IDA7CiB9CiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3Njc2lfbGliLmMgYi9kcml2ZXJzL3Njc2kvc2NzaV9saWIuYwppbmRleCBmMmY1MWUwLi45NDBkYzMyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc2NzaV9saWIuYworKysgYi9kcml2ZXJzL3Njc2kvc2NzaV9saWIuYwpAQCAtOTEsMjYgKzkxLDE5IEBACiAJc2NzaV9wdXRfY29tbWFuZChjbWQpOwogfQogCi0vKgotICogRnVuY3Rpb246ICAgIHNjc2lfcXVldWVfaW5zZXJ0KCkKKy8qKgorICogX19zY3NpX3F1ZXVlX2luc2VydCAtIHByaXZhdGUgcXVldWUgaW5zZXJ0aW9uCisgKiBAY21kOiBUaGUgU0NTSSBjb21tYW5kIGJlaW5nIHJlcXVldWVkCisgKiBAcmVhc29uOiAgVGhlIHJlYXNvbiBmb3IgdGhlIHJlcXVldWUKKyAqIEB1bmJ1c3k6IFdoZXRoZXIgdGhlIHF1ZXVlIHNob3VsZCBiZSB1bmJ1c2llZAogICoKLSAqIFB1cnBvc2U6ICAgICBJbnNlcnQgYSBjb21tYW5kIGluIHRoZSBtaWRsZXZlbCBxdWV1ZS4KLSAqCi0gKiBBcmd1bWVudHM6ICAgY21kICAgIC0gY29tbWFuZCB0aGF0IHdlIGFyZSBhZGRpbmcgdG8gcXVldWUuCi0gKiAgICAgICAgICAgICAgcmVhc29uIC0gd2h5IHdlIGFyZSBpbnNlcnRpbmcgY29tbWFuZCB0byBxdWV1ZS4KLSAqCi0gKiBMb2NrIHN0YXR1czogQXNzdW1lZCB0aGF0IGxvY2sgaXMgbm90IGhlbGQgdXBvbiBlbnRyeS4KLSAqCi0gKiBSZXR1cm5zOiAgICAgTm90aGluZy4KLSAqCi0gKiBOb3RlczogICAgICAgV2UgZG8gdGhpcyBmb3Igb25lIG9mIHR3byBjYXNlcy4gIEVpdGhlciB0aGUgaG9zdCBpcyBidXN5Ci0gKiAgICAgICAgICAgICAgYW5kIGl0IGNhbm5vdCBhY2NlcHQgYW55IG1vcmUgY29tbWFuZHMgZm9yIHRoZSB0aW1lIGJlaW5nLAotICogICAgICAgICAgICAgIG9yIHRoZSBkZXZpY2UgcmV0dXJuZWQgUVVFVUVfRlVMTCBhbmQgY2FuIGFjY2VwdCBubyBtb3JlCi0gKiAgICAgICAgICAgICAgY29tbWFuZHMuCi0gKiBOb3RlczogICAgICAgVGhpcyBjb3VsZCBiZSBjYWxsZWQgZWl0aGVyIGZyb20gYW4gaW50ZXJydXB0IGNvbnRleHQgb3IgYQotICogICAgICAgICAgICAgIG5vcm1hbCBwcm9jZXNzIGNvbnRleHQuCisgKiBUaGlzIGlzIGEgcHJpdmF0ZSBxdWV1ZSBpbnNlcnRpb24uICBUaGUgcHVibGljIGludGVyZmFjZQorICogc2NzaV9xdWV1ZV9pbnNlcnQoKSBhbHdheXMgYXNzdW1lcyB0aGUgcXVldWUgc2hvdWxkIGJlIHVuYnVzaWVkCisgKiBiZWNhdXNlIGl0J3MgYWx3YXlzIGNhbGxlZCBiZWZvcmUgdGhlIGNvbXBsZXRpb24uICBUaGlzIGZ1bmN0aW9uIGlzCisgKiBmb3IgYSByZXF1ZXVlIGFmdGVyIGNvbXBsZXRpb24sIHdoaWNoIHNob3VsZCBvbmx5IG9jY3VyIGluIHRoaXMKKyAqIGZpbGUuCiAgKi8KLWludCBzY3NpX3F1ZXVlX2luc2VydChzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQsIGludCByZWFzb24pCitzdGF0aWMgaW50IF9fc2NzaV9xdWV1ZV9pbnNlcnQoc3RydWN0IHNjc2lfY21uZCAqY21kLCBpbnQgcmVhc29uLCBpbnQgdW5idXN5KQogewogCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3QgPSBjbWQtPmRldmljZS0+aG9zdDsKIAlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKmRldmljZSA9IGNtZC0+ZGV2aWNlOwpAQCAtMTUwLDcgKzE0Myw4IEBACiAJICogRGVjcmVtZW50IHRoZSBjb3VudGVycywgc2luY2UgdGhlc2UgY29tbWFuZHMgYXJlIG5vIGxvbmdlcgogCSAqIGFjdGl2ZSBvbiB0aGUgaG9zdC9kZXZpY2UuCiAJICovCi0Jc2NzaV9kZXZpY2VfdW5idXN5KGRldmljZSk7CisJaWYgKHVuYnVzeSkKKwkJc2NzaV9kZXZpY2VfdW5idXN5KGRldmljZSk7CiAKIAkvKgogCSAqIFJlcXVldWUgdGhpcyBjb21tYW5kLiAgSXQgd2lsbCBnbyBiZWZvcmUgYWxsIG90aGVyIGNvbW1hbmRzCkBAIC0xNzIsNiArMTY2LDI5IEBACiAJcmV0dXJuIDA7CiB9CiAKKy8qCisgKiBGdW5jdGlvbjogICAgc2NzaV9xdWV1ZV9pbnNlcnQoKQorICoKKyAqIFB1cnBvc2U6ICAgICBJbnNlcnQgYSBjb21tYW5kIGluIHRoZSBtaWRsZXZlbCBxdWV1ZS4KKyAqCisgKiBBcmd1bWVudHM6ICAgY21kICAgIC0gY29tbWFuZCB0aGF0IHdlIGFyZSBhZGRpbmcgdG8gcXVldWUuCisgKiAgICAgICAgICAgICAgcmVhc29uIC0gd2h5IHdlIGFyZSBpbnNlcnRpbmcgY29tbWFuZCB0byBxdWV1ZS4KKyAqCisgKiBMb2NrIHN0YXR1czogQXNzdW1lZCB0aGF0IGxvY2sgaXMgbm90IGhlbGQgdXBvbiBlbnRyeS4KKyAqCisgKiBSZXR1cm5zOiAgICAgTm90aGluZy4KKyAqCisgKiBOb3RlczogICAgICAgV2UgZG8gdGhpcyBmb3Igb25lIG9mIHR3byBjYXNlcy4gIEVpdGhlciB0aGUgaG9zdCBpcyBidXN5CisgKiAgICAgICAgICAgICAgYW5kIGl0IGNhbm5vdCBhY2NlcHQgYW55IG1vcmUgY29tbWFuZHMgZm9yIHRoZSB0aW1lIGJlaW5nLAorICogICAgICAgICAgICAgIG9yIHRoZSBkZXZpY2UgcmV0dXJuZWQgUVVFVUVfRlVMTCBhbmQgY2FuIGFjY2VwdCBubyBtb3JlCisgKiAgICAgICAgICAgICAgY29tbWFuZHMuCisgKiBOb3RlczogICAgICAgVGhpcyBjb3VsZCBiZSBjYWxsZWQgZWl0aGVyIGZyb20gYW4gaW50ZXJydXB0IGNvbnRleHQgb3IgYQorICogICAgICAgICAgICAgIG5vcm1hbCBwcm9jZXNzIGNvbnRleHQuCisgKi8KK2ludCBzY3NpX3F1ZXVlX2luc2VydChzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQsIGludCByZWFzb24pCit7CisJcmV0dXJuIF9fc2NzaV9xdWV1ZV9pbnNlcnQoY21kLCByZWFzb24sIDEpOworfQogLyoqCiAgKiBzY3NpX2V4ZWN1dGUgLSBpbnNlcnQgcmVxdWVzdCBhbmQgd2FpdCBmb3IgdGhlIHJlc3VsdAogICogQHNkZXY6CXNjc2kgZGV2aWNlCkBAIC02ODQsNiArNzAxLDggQEAKIAkJc2NzaV9ydW5fcXVldWUoc2Rldi0+cmVxdWVzdF9xdWV1ZSk7CiB9CiAKK3N0YXRpYyB2b2lkIF9fc2NzaV9yZWxlYXNlX2J1ZmZlcnMoc3RydWN0IHNjc2lfY21uZCAqLCBpbnQpOworCiAvKgogICogRnVuY3Rpb246ICAgIHNjc2lfZW5kX3JlcXVlc3QoKQogICoKQEAgLTczMiw2ICs3NTEsNyBAQAogCQkJCSAqIGxlZnRvdmVycyBpbiB0aGUgZnJvbnQgb2YgdGhlCiAJCQkJICogcXVldWUsIGFuZCBnb29zZSB0aGUgcXVldWUgYWdhaW4uCiAJCQkJICovCisJCQkJc2NzaV9yZWxlYXNlX2J1ZmZlcnMoY21kKTsKIAkJCQlzY3NpX3JlcXVldWVfY29tbWFuZChxLCBjbWQpOwogCQkJCWNtZCA9IE5VTEw7CiAJCQl9CkBAIC03NDMsNiArNzYzLDcgQEAKIAkgKiBUaGlzIHdpbGwgZ29vc2UgdGhlIHF1ZXVlIHJlcXVlc3QgZnVuY3Rpb24gYXQgdGhlIGVuZCwgc28gd2UgZG9uJ3QKIAkgKiBuZWVkIHRvIHdvcnJ5IGFib3V0IGxhdW5jaGluZyBhbm90aGVyIGNvbW1hbmQuCiAJICovCisJX19zY3NpX3JlbGVhc2VfYnVmZmVycyhjbWQsIDApOwogCXNjc2lfbmV4dF9jb21tYW5kKGNtZCk7CiAJcmV0dXJuIE5VTEw7CiB9CkBAIC03OTgsNiArODE5LDI2IEBACiAJX19zZ19mcmVlX3RhYmxlKCZzZGItPnRhYmxlLCBTQ1NJX01BWF9TR19TRUdNRU5UUywgc2NzaV9zZ19mcmVlKTsKIH0KIAorc3RhdGljIHZvaWQgX19zY3NpX3JlbGVhc2VfYnVmZmVycyhzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQsIGludCBkb19iaWRpX2NoZWNrKQoreworCisJaWYgKGNtZC0+c2RiLnRhYmxlLm5lbnRzKQorCQlzY3NpX2ZyZWVfc2d0YWJsZSgmY21kLT5zZGIpOworCisJbWVtc2V0KCZjbWQtPnNkYiwgMCwgc2l6ZW9mKGNtZC0+c2RiKSk7CisKKwlpZiAoZG9fYmlkaV9jaGVjayAmJiBzY3NpX2JpZGlfY21uZChjbWQpKSB7CisJCXN0cnVjdCBzY3NpX2RhdGFfYnVmZmVyICpiaWRpX3NkYiA9CisJCQljbWQtPnJlcXVlc3QtPm5leHRfcnEtPnNwZWNpYWw7CisJCXNjc2lfZnJlZV9zZ3RhYmxlKGJpZGlfc2RiKTsKKwkJa21lbV9jYWNoZV9mcmVlKHNjc2lfc2RiX2NhY2hlLCBiaWRpX3NkYik7CisJCWNtZC0+cmVxdWVzdC0+bmV4dF9ycS0+c3BlY2lhbCA9IE5VTEw7CisJfQorCisJaWYgKHNjc2lfcHJvdF9zZ19jb3VudChjbWQpKQorCQlzY3NpX2ZyZWVfc2d0YWJsZShjbWQtPnByb3Rfc2RiKTsKK30KKwogLyoKICAqIEZ1bmN0aW9uOiAgICBzY3NpX3JlbGVhc2VfYnVmZmVycygpCiAgKgpAQCAtODE3LDIxICs4NTgsNyBAQAogICovCiB2b2lkIHNjc2lfcmVsZWFzZV9idWZmZXJzKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKIHsKLQlpZiAoY21kLT5zZGIudGFibGUubmVudHMpCi0JCXNjc2lfZnJlZV9zZ3RhYmxlKCZjbWQtPnNkYik7Ci0KLQltZW1zZXQoJmNtZC0+c2RiLCAwLCBzaXplb2YoY21kLT5zZGIpKTsKLQotCWlmIChzY3NpX2JpZGlfY21uZChjbWQpKSB7Ci0JCXN0cnVjdCBzY3NpX2RhdGFfYnVmZmVyICpiaWRpX3NkYiA9Ci0JCQljbWQtPnJlcXVlc3QtPm5leHRfcnEtPnNwZWNpYWw7Ci0JCXNjc2lfZnJlZV9zZ3RhYmxlKGJpZGlfc2RiKTsKLQkJa21lbV9jYWNoZV9mcmVlKHNjc2lfc2RiX2NhY2hlLCBiaWRpX3NkYik7Ci0JCWNtZC0+cmVxdWVzdC0+bmV4dF9ycS0+c3BlY2lhbCA9IE5VTEw7Ci0JfQotCi0JaWYgKHNjc2lfcHJvdF9zZ19jb3VudChjbWQpKQotCQlzY3NpX2ZyZWVfc2d0YWJsZShjbWQtPnByb3Rfc2RiKTsKKwlfX3Njc2lfcmVsZWFzZV9idWZmZXJzKGNtZCwgMSk7CiB9CiBFWFBPUlRfU1lNQk9MKHNjc2lfcmVsZWFzZV9idWZmZXJzKTsKIApAQCAtOTQ1LDcgKzk3Miw2IEBACiAJfQogCiAJQlVHX09OKGJsa19iaWRpX3JxKHJlcSkpOyAvKiBiaWRpIG5vdCBzdXBwb3J0IGZvciAhYmxrX3BjX3JlcXVlc3QgeWV0ICovCi0Jc2NzaV9yZWxlYXNlX2J1ZmZlcnMoY21kKTsKIAogCS8qCiAJICogTmV4dCBkZWFsIHdpdGggYW55IHNlY3RvcnMgd2hpY2ggd2Ugd2VyZSBhYmxlIHRvIGNvcnJlY3RseQpAQCAtOTYzLDYgKzk4OSw4IEBACiAJCXJldHVybjsKIAl0aGlzX2NvdW50ID0gYmxrX3JxX2J5dGVzKHJlcSk7CiAKKwllcnJvciA9IC1FSU87CisKIAlpZiAoaG9zdF9ieXRlKHJlc3VsdCkgPT0gRElEX1JFU0VUKSB7CiAJCS8qIFRoaXJkIHBhcnR5IGJ1cyByZXNldCBvciByZXNldCBmb3IgZXJyb3IgcmVjb3ZlcnkKIAkJICogcmVhc29ucy4gIEp1c3QgcmV0cnkgdGhlIGNvbW1hbmQgYW5kIHNlZSB3aGF0CkBAIC0xMDA0LDEzICsxMDMyLDE4IEBACiAJCQkJLyogVGhpcyB3aWxsIGlzc3VlIGEgbmV3IDYtYnl0ZSBjb21tYW5kLiAqLwogCQkJCWNtZC0+ZGV2aWNlLT51c2VfMTBfZm9yX3J3ID0gMDsKIAkJCQlhY3Rpb24gPSBBQ1RJT05fUkVQUkVQOworCQkJfSBlbHNlIGlmIChzc2hkci5hc2MgPT0gMHgxMCkgLyogRElYICovIHsKKwkJCQlkZXNjcmlwdGlvbiA9ICJIb3N0IERhdGEgSW50ZWdyaXR5IEZhaWx1cmUiOworCQkJCWFjdGlvbiA9IEFDVElPTl9GQUlMOworCQkJCWVycm9yID0gLUVJTFNFUTsKIAkJCX0gZWxzZQogCQkJCWFjdGlvbiA9IEFDVElPTl9GQUlMOwogCQkJYnJlYWs7CiAJCWNhc2UgQUJPUlRFRF9DT01NQU5EOgogCQkJaWYgKHNzaGRyLmFzYyA9PSAweDEwKSB7IC8qIERJRiAqLworCQkJCWRlc2NyaXB0aW9uID0gIlRhcmdldCBEYXRhIEludGVncml0eSBGYWlsdXJlIjsKIAkJCQlhY3Rpb24gPSBBQ1RJT05fRkFJTDsKLQkJCQlkZXNjcmlwdGlvbiA9ICJEYXRhIEludGVncml0eSBGYWlsdXJlIjsKKwkJCQllcnJvciA9IC1FSUxTRVE7CiAJCQl9IGVsc2UKIAkJCQlhY3Rpb24gPSBBQ1RJT05fUkVUUlk7CiAJCQlicmVhazsKQEAgLTEwMjksNiArMTA2MiwxMCBAQAogCQkJCWNhc2UgMHgwOTogLyogc2VsZiB0ZXN0IGluIHByb2dyZXNzICovCiAJCQkJCWFjdGlvbiA9IEFDVElPTl9ERUxBWUVEX1JFVFJZOwogCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQlkZXNjcmlwdGlvbiA9ICJEZXZpY2Ugbm90IHJlYWR5IjsKKwkJCQkJYWN0aW9uID0gQUNUSU9OX0ZBSUw7CisJCQkJCWJyZWFrOwogCQkJCX0KIAkJCX0gZWxzZSB7CiAJCQkJZGVzY3JpcHRpb24gPSAiRGV2aWNlIG5vdCByZWFkeSI7CkBAIC0xMDUyLDkgKzEwODksMTAgQEAKIAlzd2l0Y2ggKGFjdGlvbikgewogCWNhc2UgQUNUSU9OX0ZBSUw6CiAJCS8qIEdpdmUgdXAgYW5kIGZhaWwgdGhlIHJlbWFpbmRlciBvZiB0aGUgcmVxdWVzdCAqLworCQlzY3NpX3JlbGVhc2VfYnVmZmVycyhjbWQpOwogCQlpZiAoIShyZXEtPmNtZF9mbGFncyAmIFJFUV9RVUlFVCkpIHsKIAkJCWlmIChkZXNjcmlwdGlvbikKLQkJCQlzY21kX3ByaW50ayhLRVJOX0lORk8sIGNtZCwgIiVzIiwKKwkJCQlzY21kX3ByaW50ayhLRVJOX0lORk8sIGNtZCwgIiVzXG4iLAogCQkJCQkgICAgZGVzY3JpcHRpb24pOwogCQkJc2NzaV9wcmludF9yZXN1bHQoY21kKTsKIAkJCWlmIChkcml2ZXJfYnl0ZShyZXN1bHQpICYgRFJJVkVSX1NFTlNFKQpAQCAtMTA2NywxNSArMTEwNSwxNiBAQAogCQkvKiBVbnByZXAgdGhlIHJlcXVlc3QgYW5kIHB1dCBpdCBiYWNrIGF0IHRoZSBoZWFkIG9mIHRoZSBxdWV1ZS4KIAkJICogQSBuZXcgY29tbWFuZCB3aWxsIGJlIHByZXBhcmVkIGFuZCBpc3N1ZWQuCiAJCSAqLworCQlzY3NpX3JlbGVhc2VfYnVmZmVycyhjbWQpOwogCQlzY3NpX3JlcXVldWVfY29tbWFuZChxLCBjbWQpOwogCQlicmVhazsKIAljYXNlIEFDVElPTl9SRVRSWToKIAkJLyogUmV0cnkgdGhlIHNhbWUgY29tbWFuZCBpbW1lZGlhdGVseSAqLwotCQlzY3NpX3F1ZXVlX2luc2VydChjbWQsIFNDU0lfTUxRVUVVRV9FSF9SRVRSWSk7CisJCV9fc2NzaV9xdWV1ZV9pbnNlcnQoY21kLCBTQ1NJX01MUVVFVUVfRUhfUkVUUlksIDApOwogCQlicmVhazsKIAljYXNlIEFDVElPTl9ERUxBWUVEX1JFVFJZOgogCQkvKiBSZXRyeSB0aGUgc2FtZSBjb21tYW5kIGFmdGVyIGEgZGVsYXkgKi8KLQkJc2NzaV9xdWV1ZV9pbnNlcnQoY21kLCBTQ1NJX01MUVVFVUVfREVWSUNFX0JVU1kpOworCQlfX3Njc2lfcXVldWVfaW5zZXJ0KGNtZCwgU0NTSV9NTFFVRVVFX0RFVklDRV9CVVNZLCAwKTsKIAkJYnJlYWs7CiAJfQogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3Njc2lfc2Nhbi5jIGIvZHJpdmVycy9zY3NpL3Njc2lfc2Nhbi5jCmluZGV4IDE4NDg2YjUuLjY2NTA1YmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zY3NpX3NjYW4uYworKysgYi9kcml2ZXJzL3Njc2kvc2NzaV9zY2FuLmMKQEAgLTMyLDYgKzMyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2FzeW5jLmg+CiAKICNpbmNsdWRlIDxzY3NpL3Njc2kuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2lfY21uZC5oPgpAQCAtMTc5LDYgKzE4MCw4IEBACiAJc3Bpbl91bmxvY2soJmFzeW5jX3NjYW5fbG9jayk7CiAKIAlrZnJlZShkYXRhKTsKKwkvKiBTeW5jaHJvbml6ZSBhc3luYyBvcGVyYXRpb25zIGdsb2JhbGx5ICovCisJYXN5bmNfc3luY2hyb25pemVfZnVsbCgpOwogCXJldHVybiAwOwogfQogCkBAIC00MTEsOCArNDE0LDcgQEAKIAlkZXZpY2VfaW5pdGlhbGl6ZShkZXYpOwogCXN0YXJnZXQtPnJlYXBfcmVmID0gMTsKIAlkZXYtPnBhcmVudCA9IGdldF9kZXZpY2UocGFyZW50KTsKLQlzcHJpbnRmKGRldi0+YnVzX2lkLCAidGFyZ2V0JWQ6JWQ6JWQiLAotCQlzaG9zdC0+aG9zdF9ubywgY2hhbm5lbCwgaWQpOworCWRldl9zZXRfbmFtZShkZXYsICJ0YXJnZXQlZDolZDolZCIsIHNob3N0LT5ob3N0X25vLCBjaGFubmVsLCBpZCk7CiAjaWZuZGVmIENPTkZJR19TWVNGU19ERVBSRUNBVEVECiAJZGV2LT5idXMgPSAmc2NzaV9idXNfdHlwZTsKICNlbmRpZgpAQCAtMTAyMSw3ICsxMDIzLDcgQEAKIAkJaWYgKHJlc2NhbiB8fCAhc2NzaV9kZXZpY2VfY3JlYXRlZChzZGV2KSkgewogCQkJU0NTSV9MT0dfU0NBTl9CVVMoMywgcHJpbnRrKEtFUk5fSU5GTwogCQkJCSJzY3NpIHNjYW46IGRldmljZSBleGlzdHMgb24gJXNcbiIsCi0JCQkJc2Rldi0+c2Rldl9nZW5kZXYuYnVzX2lkKSk7CisJCQkJZGV2X25hbWUoJnNkZXYtPnNkZXZfZ2VuZGV2KSkpOwogCQkJaWYgKHNkZXZwKQogCQkJCSpzZGV2cCA9IHNkZXY7CiAJCQllbHNlCkBAIC0xMTYwLDcgKzExNjIsNyBAQAogCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gZGV2X3RvX3Nob3N0KHN0YXJnZXQtPmRldi5wYXJlbnQpOwogCiAJU0NTSV9MT0dfU0NBTl9CVVMoMywgcHJpbnRrKEtFUk5fSU5GTyAic2NzaSBzY2FuOiBTZXF1ZW50aWFsIHNjYW4gb2YiCi0JCQkJICAgICIlc1xuIiwgc3RhcmdldC0+ZGV2LmJ1c19pZCkpOworCQkJCSAgICAiJXNcbiIsIGRldl9uYW1lKCZzdGFyZ2V0LT5kZXYpKSk7CiAKIAltYXhfZGV2X2x1biA9IG1pbihtYXhfc2NzaV9sdW5zLCBzaG9zdC0+bWF4X2x1bik7CiAJLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zY3NpX3N5c2ZzLmMgYi9kcml2ZXJzL3Njc2kvc2NzaV9zeXNmcy5jCmluZGV4IDkzYzI4ZjMuLmRhNjM4MDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zY3NpX3N5c2ZzLmMKKysrIGIvZHJpdmVycy9zY3NpL3Njc2lfc3lzZnMuYwpAQCAtMTA3OSwxNiArMTA3OSwxNCBAQAogCWRldmljZV9pbml0aWFsaXplKCZzZGV2LT5zZGV2X2dlbmRldik7CiAJc2Rldi0+c2Rldl9nZW5kZXYuYnVzID0gJnNjc2lfYnVzX3R5cGU7CiAJc2Rldi0+c2Rldl9nZW5kZXYudHlwZSA9ICZzY3NpX2Rldl90eXBlOwotCXNwcmludGYoc2Rldi0+c2Rldl9nZW5kZXYuYnVzX2lkLCIlZDolZDolZDolZCIsCi0JCXNkZXYtPmhvc3QtPmhvc3Rfbm8sIHNkZXYtPmNoYW5uZWwsIHNkZXYtPmlkLAotCQlzZGV2LT5sdW4pOwotCQorCWRldl9zZXRfbmFtZSgmc2Rldi0+c2Rldl9nZW5kZXYsICIlZDolZDolZDolZCIsCisJCSAgICAgc2Rldi0+aG9zdC0+aG9zdF9ubywgc2Rldi0+Y2hhbm5lbCwgc2Rldi0+aWQsIHNkZXYtPmx1bik7CisKIAlkZXZpY2VfaW5pdGlhbGl6ZSgmc2Rldi0+c2Rldl9kZXYpOwogCXNkZXYtPnNkZXZfZGV2LnBhcmVudCA9ICZzZGV2LT5zZGV2X2dlbmRldjsKIAlzZGV2LT5zZGV2X2Rldi5jbGFzcyA9ICZzZGV2X2NsYXNzOwotCXNucHJpbnRmKHNkZXYtPnNkZXZfZGV2LmJ1c19pZCwgQlVTX0lEX1NJWkUsCi0JCSAiJWQ6JWQ6JWQ6JWQiLCBzZGV2LT5ob3N0LT5ob3N0X25vLAotCQkgc2Rldi0+Y2hhbm5lbCwgc2Rldi0+aWQsIHNkZXYtPmx1bik7CisJZGV2X3NldF9uYW1lKCZzZGV2LT5zZGV2X2RldiwgIiVkOiVkOiVkOiVkIiwKKwkJICAgICBzZGV2LT5ob3N0LT5ob3N0X25vLCBzZGV2LT5jaGFubmVsLCBzZGV2LT5pZCwgc2Rldi0+bHVuKTsKIAlzZGV2LT5zY3NpX2xldmVsID0gc3RhcmdldC0+c2NzaV9sZXZlbDsKIAl0cmFuc3BvcnRfc2V0dXBfZGV2aWNlKCZzZGV2LT5zZGV2X2dlbmRldik7CiAJc3Bpbl9sb2NrX2lycXNhdmUoc2hvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3Njc2lfdHJhbnNwb3J0X2ZjLmMgYi9kcml2ZXJzL3Njc2kvc2NzaV90cmFuc3BvcnRfZmMuYwppbmRleCAwNjIzMDRkLi41Zjc3NDE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc2NzaV90cmFuc3BvcnRfZmMuYworKysgYi9kcml2ZXJzL3Njc2kvc2NzaV90cmFuc3BvcnRfZmMuYwpAQCAtMjQwNyw4ICsyNDA3LDEyIEBACiAJLyoKIAkgKiBOb3RpZnkgdGhlIGRyaXZlciB0aGF0IHRoZSBycG9ydCBpcyBub3cgZGVhZC4gVGhlIExMREQgd2lsbAogCSAqIGFsc28gZ3VhcmFudGVlIHRoYXQgYW55IGNvbW11bmljYXRpb24gdG8gdGhlIHJwb3J0IGlzIHRlcm1pbmF0ZWQKKwkgKgorCSAqIEF2b2lkIHRoaXMgY2FsbCBpZiB3ZSBhbHJlYWR5IGNhbGxlZCBpdCB3aGVuIHdlIHByZXNlcnZlZCB0aGUKKwkgKiBycG9ydCBmb3IgdGhlIGJpbmRpbmcuCiAJICovCi0JaWYgKGktPmYtPmRldl9sb3NzX3Rtb19jYWxsYmspCisJaWYgKCEocnBvcnQtPmZsYWdzICYgRkNfUlBPUlRfREVWTE9TU19DQUxMQktfRE9ORSkgJiYKKwkgICAgKGktPmYtPmRldl9sb3NzX3Rtb19jYWxsYmspKQogCQlpLT5mLT5kZXZfbG9zc190bW9fY2FsbGJrKHJwb3J0KTsKIAogCXRyYW5zcG9ydF9yZW1vdmVfZGV2aWNlKGRldik7CkBAIC0yNDg2LDggKzI0OTAsOCBAQAogCWRldmljZV9pbml0aWFsaXplKGRldik7CQkJLyogdGFrZXMgc2VsZiByZWZlcmVuY2UgKi8KIAlkZXYtPnBhcmVudCA9IGdldF9kZXZpY2UoJnNob3N0LT5zaG9zdF9nZW5kZXYpOyAvKiBwYXJlbnQgcmVmZXJlbmNlICovCiAJZGV2LT5yZWxlYXNlID0gZmNfcnBvcnRfZGV2X3JlbGVhc2U7Ci0Jc3ByaW50ZihkZXYtPmJ1c19pZCwgInJwb3J0LSVkOiVkLSVkIiwKLQkJc2hvc3QtPmhvc3Rfbm8sIGNoYW5uZWwsIHJwb3J0LT5udW1iZXIpOworCWRldl9zZXRfbmFtZShkZXYsICJycG9ydC0lZDolZC0lZCIsCisJCSAgICAgc2hvc3QtPmhvc3Rfbm8sIGNoYW5uZWwsIHJwb3J0LT5udW1iZXIpOwogCXRyYW5zcG9ydF9zZXR1cF9kZXZpY2UoZGV2KTsKIAogCWVycm9yID0gZGV2aWNlX2FkZChkZXYpOwpAQCAtMjY0Nyw3ICsyNjUxLDggQEAKIAkJCQlzcGluX2xvY2tfaXJxc2F2ZShzaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CiAKIAkJCQlycG9ydC0+ZmxhZ3MgJj0gfihGQ19SUE9SVF9GQVNUX0ZBSUxfVElNRURPVVQgfAotCQkJCQkJICBGQ19SUE9SVF9ERVZMT1NTX1BFTkRJTkcpOworCQkJCQkJICBGQ19SUE9SVF9ERVZMT1NTX1BFTkRJTkcgfAorCQkJCQkJICBGQ19SUE9SVF9ERVZMT1NTX0NBTExCS19ET05FKTsKIAogCQkJCS8qIGlmIHRhcmdldCwgaW5pdGlhdGUgYSBzY2FuICovCiAJCQkJaWYgKHJwb3J0LT5zY3NpX3RhcmdldF9pZCAhPSAtMSkgewpAQCAtMjk0NCw2ICsyOTQ5LDcgQEAKIAlzdHJ1Y3QgZmNfcnBvcnQgKnJwb3J0ID0KIAkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBmY19ycG9ydCwgZGV2X2xvc3Nfd29yay53b3JrKTsKIAlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IHJwb3J0X3RvX3Nob3N0KHJwb3J0KTsKKwlzdHJ1Y3QgZmNfaW50ZXJuYWwgKmkgPSB0b19mY19pbnRlcm5hbChzaG9zdC0+dHJhbnNwb3J0dCk7CiAJc3RydWN0IGZjX2hvc3RfYXR0cnMgKmZjX2hvc3QgPSBzaG9zdF90b19mY19ob3N0KHNob3N0KTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCkBAIC0zMDExLDYgKzMwMTcsNyBAQAogCXJwb3J0LT5yb2xlcyA9IEZDX1BPUlRfUk9MRV9VTktOT1dOOwogCXJwb3J0LT5wb3J0X3N0YXRlID0gRkNfUE9SVFNUQVRFX05PVFBSRVNFTlQ7CiAJcnBvcnQtPmZsYWdzICY9IH5GQ19SUE9SVF9GQVNUX0ZBSUxfVElNRURPVVQ7CisJcnBvcnQtPmZsYWdzIHw9IEZDX1JQT1JUX0RFVkxPU1NfQ0FMTEJLX0RPTkU7CiAKIAkvKgogCSAqIFByZS1lbXB0aXZlbHkga2lsbCBJL08gcmF0aGVyIHRoYW4gd2FpdGluZyBmb3IgdGhlIHdvcmsgcXVldWUKQEAgLTMwNDYsOCArMzA1MywxOCBAQAogCSAqIGFsbCBhdHRhY2hlZCBzY3NpIGRldmljZXMuCiAJICovCiAJZmNfcXVldWVfd29yayhzaG9zdCwgJnJwb3J0LT5zdGd0X2RlbGV0ZV93b3JrKTsKKworCS8qCisJICogTm90aWZ5IHRoZSBkcml2ZXIgdGhhdCB0aGUgcnBvcnQgaXMgbm93IGRlYWQuIFRoZSBMTEREIHdpbGwKKwkgKiBhbHNvIGd1YXJhbnRlZSB0aGF0IGFueSBjb21tdW5pY2F0aW9uIHRvIHRoZSBycG9ydCBpcyB0ZXJtaW5hdGVkCisJICoKKwkgKiBOb3RlOiB3ZSBzZXQgdGhlIENBTExCS19ET05FIGZsYWcgYWJvdmUgdG8gY29ycmVzcG9uZAorCSAqLworCWlmIChpLT5mLT5kZXZfbG9zc190bW9fY2FsbGJrKQorCQlpLT5mLT5kZXZfbG9zc190bW9fY2FsbGJrKHJwb3J0KTsKIH0KIAorCiAvKioKICAqIGZjX3RpbWVvdXRfZmFpbF9ycG9ydF9pbyAtIFRpbWVvdXQgaGFuZGxlciBmb3IgYSBmYXN0IGlvIGZhaWxpbmcgb24gYSBkaXNjb25uZWN0ZWQgU0NTSSB0YXJnZXQuCiAgKiBAd29yazoJcnBvcnQgdG8gdGVybWluYXRlIGlvIG9uLgpAQCAtMzE2NCw4ICszMTgxLDggQEAKIAlkZXZpY2VfaW5pdGlhbGl6ZShkZXYpOwkJCS8qIHRha2VzIHNlbGYgcmVmZXJlbmNlICovCiAJZGV2LT5wYXJlbnQgPSBnZXRfZGV2aWNlKHBkZXYpOwkJLyogdGFrZXMgcGFyZW50IHJlZmVyZW5jZSAqLwogCWRldi0+cmVsZWFzZSA9IGZjX3Zwb3J0X2Rldl9yZWxlYXNlOwotCXNwcmludGYoZGV2LT5idXNfaWQsICJ2cG9ydC0lZDolZC0lZCIsCi0JCXNob3N0LT5ob3N0X25vLCBjaGFubmVsLCB2cG9ydC0+bnVtYmVyKTsKKwlkZXZfc2V0X25hbWUoZGV2LCAidnBvcnQtJWQ6JWQtJWQiLAorCQkgICAgIHNob3N0LT5ob3N0X25vLCBjaGFubmVsLCB2cG9ydC0+bnVtYmVyKTsKIAl0cmFuc3BvcnRfc2V0dXBfZGV2aWNlKGRldik7CiAKIAllcnJvciA9IGRldmljZV9hZGQoZGV2KTsKQEAgLTMxODgsMTkgKzMyMDUsMTkgQEAKIAkgKi8KIAlpZiAocGRldiAhPSAmc2hvc3QtPnNob3N0X2dlbmRldikgewogCQllcnJvciA9IHN5c2ZzX2NyZWF0ZV9saW5rKCZzaG9zdC0+c2hvc3RfZ2VuZGV2LmtvYmosCi0JCQkJICZkZXYtPmtvYmosIGRldi0+YnVzX2lkKTsKKwkJCQkgJmRldi0+a29iaiwgZGV2X25hbWUoZGV2KSk7CiAJCWlmIChlcnJvcikKIAkJCXByaW50ayhLRVJOX0VSUgogCQkJCSIlczogQ2Fubm90IGNyZWF0ZSB2cG9ydCBzeW1saW5rcyBmb3IgIgogCQkJCSIlcywgZXJyPSVkXG4iLAotCQkJCV9fZnVuY19fLCBkZXYtPmJ1c19pZCwgZXJyb3IpOworCQkJCV9fZnVuY19fLCBkZXZfbmFtZShkZXYpLCBlcnJvcik7CiAJfQogCXNwaW5fbG9ja19pcnFzYXZlKHNob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKIAl2cG9ydC0+ZmxhZ3MgJj0gfkZDX1ZQT1JUX0NSRUFUSU5HOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoc2hvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOwogCiAJZGV2X3ByaW50ayhLRVJOX05PVElDRSwgcGRldiwKLQkJCSIlcyBjcmVhdGVkIHZpYSBzaG9zdCVkIGNoYW5uZWwgJWRcbiIsIGRldi0+YnVzX2lkLAorCQkJIiVzIGNyZWF0ZWQgdmlhIHNob3N0JWQgY2hhbm5lbCAlZFxuIiwgZGV2X25hbWUoZGV2KSwKIAkJCXNob3N0LT5ob3N0X25vLCBjaGFubmVsKTsKIAogCSpyZXRfdnBvcnQgPSB2cG9ydDsKQEAgLTMyOTcsNyArMzMxNCw3IEBACiAJCXJldHVybiBzdGF0OwogCiAJaWYgKGRldi0+cGFyZW50ICE9ICZzaG9zdC0+c2hvc3RfZ2VuZGV2KQotCQlzeXNmc19yZW1vdmVfbGluaygmc2hvc3QtPnNob3N0X2dlbmRldi5rb2JqLCBkZXYtPmJ1c19pZCk7CisJCXN5c2ZzX3JlbW92ZV9saW5rKCZzaG9zdC0+c2hvc3RfZ2VuZGV2LmtvYmosIGRldl9uYW1lKGRldikpOwogCXRyYW5zcG9ydF9yZW1vdmVfZGV2aWNlKGRldik7CiAJZGV2aWNlX2RlbChkZXYpOwogCXRyYW5zcG9ydF9kZXN0cm95X2RldmljZShkZXYpOwpAQCAtMzMyOSw3ICszMzQ2LDcgQEAKIAkJZGV2X3ByaW50ayhLRVJOX0VSUiwgdnBvcnQtPmRldi5wYXJlbnQsCiAJCQkiJXM6ICVzIGNvdWxkIG5vdCBiZSBkZWxldGVkIGNyZWF0ZWQgdmlhICIKIAkJCSJzaG9zdCVkIGNoYW5uZWwgJWQgLSBlcnJvciAlZFxuIiwgX19mdW5jX18sCi0JCQl2cG9ydC0+ZGV2LmJ1c19pZCwgdnBvcnQtPnNob3N0LT5ob3N0X25vLAorCQkJZGV2X25hbWUoJnZwb3J0LT5kZXYpLCB2cG9ydC0+c2hvc3QtPmhvc3Rfbm8sCiAJCQl2cG9ydC0+Y2hhbm5lbCwgc3RhdCk7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zY3NpX3RyYW5zcG9ydF9pc2NzaS5jIGIvZHJpdmVycy9zY3NpL3Njc2lfdHJhbnNwb3J0X2lzY3NpLmMKaW5kZXggNGE4MDNlYi4uNzVjOTI5NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3Njc2lfdHJhbnNwb3J0X2lzY3NpLmMKKysrIGIvZHJpdmVycy9zY3NpL3Njc2lfdHJhbnNwb3J0X2lzY3NpLmMKQEAgLTE4Nyw4ICsxODcsNyBAQAogCiAJZXAtPmlkID0gaWQ7CiAJZXAtPmRldi5jbGFzcyA9ICZpc2NzaV9lbmRwb2ludF9jbGFzczsKLQlzbnByaW50ZihlcC0+ZGV2LmJ1c19pZCwgQlVTX0lEX1NJWkUsICJlcC0lbGx1IiwKLQkJICh1bnNpZ25lZCBsb25nIGxvbmcpIGlkKTsKKwlkZXZfc2V0X25hbWUoJmVwLT5kZXYsICJlcC0lbGx1IiwgKHVuc2lnbmVkIGxvbmcgbG9uZykgaWQpOwogCWVyciA9IGRldmljZV9yZWdpc3RlcigmZXAtPmRldik7CiAgICAgICAgIGlmIChlcnIpCiAgICAgICAgICAgICAgICAgZ290byBmcmVlX2VwOwpAQCAtNzI0LDggKzcyMyw3IEBACiAJfQogCXNlc3Npb24tPnRhcmdldF9pZCA9IGlkOwogCi0Jc25wcmludGYoc2Vzc2lvbi0+ZGV2LmJ1c19pZCwgQlVTX0lEX1NJWkUsICJzZXNzaW9uJXUiLAotCQkgc2Vzc2lvbi0+c2lkKTsKKwlkZXZfc2V0X25hbWUoJnNlc3Npb24tPmRldiwgInNlc3Npb24ldSIsIHNlc3Npb24tPnNpZCk7CiAJZXJyID0gZGV2aWNlX2FkZCgmc2Vzc2lvbi0+ZGV2KTsKIAlpZiAoZXJyKSB7CiAJCWlzY3NpX2Nsc19zZXNzaW9uX3ByaW50ayhLRVJOX0VSUiwgc2Vzc2lvbiwKQEAgLTg5OCw4ICs4OTYsNyBAQAogCWlmICghZ2V0X2RldmljZSgmc2Vzc2lvbi0+ZGV2KSkKIAkJZ290byBmcmVlX2Nvbm47CiAKLQlzbnByaW50Zihjb25uLT5kZXYuYnVzX2lkLCBCVVNfSURfU0laRSwgImNvbm5lY3Rpb24lZDoldSIsCi0JCSBzZXNzaW9uLT5zaWQsIGNpZCk7CisJZGV2X3NldF9uYW1lKCZjb25uLT5kZXYsICJjb25uZWN0aW9uJWQ6JXUiLCBzZXNzaW9uLT5zaWQsIGNpZCk7CiAJY29ubi0+ZGV2LnBhcmVudCA9ICZzZXNzaW9uLT5kZXY7CiAJY29ubi0+ZGV2LnJlbGVhc2UgPSBpc2NzaV9jb25uX3JlbGVhc2U7CiAJZXJyID0gZGV2aWNlX3JlZ2lzdGVyKCZjb25uLT5kZXYpOwpAQCAtMTgxNiw3ICsxODEzLDcgQEAKIAkJcHJpdi0+dC5jcmVhdGVfd29ya19xdWV1ZSA9IDE7CiAKIAlwcml2LT5kZXYuY2xhc3MgPSAmaXNjc2lfdHJhbnNwb3J0X2NsYXNzOwotCXNucHJpbnRmKHByaXYtPmRldi5idXNfaWQsIEJVU19JRF9TSVpFLCAiJXMiLCB0dC0+bmFtZSk7CisJZGV2X3NldF9uYW1lKCZwcml2LT5kZXYsICIlcyIsIHR0LT5uYW1lKTsKIAllcnIgPSBkZXZpY2VfcmVnaXN0ZXIoJnByaXYtPmRldik7CiAJaWYgKGVycikKIAkJZ290byBmcmVlX3ByaXY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2NzaV90cmFuc3BvcnRfc2FzLmMgYi9kcml2ZXJzL3Njc2kvc2NzaV90cmFuc3BvcnRfc2FzLmMKaW5kZXggMzY2NjA5My4uNTA5ODhjYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3Njc2lfdHJhbnNwb3J0X3Nhcy5jCisrKyBiL2RyaXZlcnMvc2NzaS9zY3NpX3RyYW5zcG9ydF9zYXMuYwpAQCAtMjA3LDcgKzIwNyw3IEBACiAJc3RydWN0IHJlcXVlc3RfcXVldWUgKnE7CiAJaW50IGVycm9yOwogCXN0cnVjdCBkZXZpY2UgKmRldjsKLQljaGFyIG5hbWVidWZbQlVTX0lEX1NJWkVdOworCWNoYXIgbmFtZWJ1ZlsyMF07CiAJY29uc3QgY2hhciAqbmFtZTsKIAl2b2lkICgqcmVsZWFzZSkoc3RydWN0IGRldmljZSAqKTsKIApAQCAtMjE5LDcgKzIxOSw3IEBACiAJaWYgKHJwaHkpIHsKIAkJcSA9IGJsa19pbml0X3F1ZXVlKHNhc19ub25faG9zdF9zbXBfcmVxdWVzdCwgTlVMTCk7CiAJCWRldiA9ICZycGh5LT5kZXY7Ci0JCW5hbWUgPSBkZXYtPmJ1c19pZDsKKwkJbmFtZSA9IGRldl9uYW1lKGRldik7CiAJCXJlbGVhc2UgPSBOVUxMOwogCX0gZWxzZSB7CiAJCXEgPSBibGtfaW5pdF9xdWV1ZShzYXNfaG9zdF9zbXBfcmVxdWVzdCwgTlVMTCk7CkBAIC02MjksMTAgKzYyOSwxMCBAQAogCUlOSVRfTElTVF9IRUFEKCZwaHktPnBvcnRfc2libGluZ3MpOwogCWlmIChzY3NpX2lzX3Nhc19leHBhbmRlcl9kZXZpY2UocGFyZW50KSkgewogCQlzdHJ1Y3Qgc2FzX3JwaHkgKnJwaHkgPSBkZXZfdG9fcnBoeShwYXJlbnQpOwotCQlzcHJpbnRmKHBoeS0+ZGV2LmJ1c19pZCwgInBoeS0lZDolZDolZCIsIHNob3N0LT5ob3N0X25vLAorCQlkZXZfc2V0X25hbWUoJnBoeS0+ZGV2LCAicGh5LSVkOiVkOiVkIiwgc2hvc3QtPmhvc3Rfbm8sCiAJCQlycGh5LT5zY3NpX3RhcmdldF9pZCwgbnVtYmVyKTsKIAl9IGVsc2UKLQkJc3ByaW50ZihwaHktPmRldi5idXNfaWQsICJwaHktJWQ6JWQiLCBzaG9zdC0+aG9zdF9ubywgbnVtYmVyKTsKKwkJZGV2X3NldF9uYW1lKCZwaHktPmRldiwgInBoeS0lZDolZCIsIHNob3N0LT5ob3N0X25vLCBudW1iZXIpOwogCiAJdHJhbnNwb3J0X3NldHVwX2RldmljZSgmcGh5LT5kZXYpOwogCkBAIC03NzAsNyArNzcwLDcgQEAKIAlpbnQgcmVzOwogCiAJcmVzID0gc3lzZnNfY3JlYXRlX2xpbmsoJnBvcnQtPmRldi5rb2JqLCAmcGh5LT5kZXYua29iaiwKLQkJCQlwaHktPmRldi5idXNfaWQpOworCQkJCWRldl9uYW1lKCZwaHktPmRldikpOwogCWlmIChyZXMpCiAJCWdvdG8gZXJyOwogCXJlcyA9IHN5c2ZzX2NyZWF0ZV9saW5rKCZwaHktPmRldi5rb2JqLCAmcG9ydC0+ZGV2LmtvYmosICJwb3J0Iik7CkBAIC03ODUsNyArNzg1LDcgQEAKIHN0YXRpYyB2b2lkIHNhc19wb3J0X2RlbGV0ZV9saW5rKHN0cnVjdCBzYXNfcG9ydCAqcG9ydCwKIAkJCQkgc3RydWN0IHNhc19waHkgKnBoeSkKIHsKLQlzeXNmc19yZW1vdmVfbGluaygmcG9ydC0+ZGV2LmtvYmosIHBoeS0+ZGV2LmJ1c19pZCk7CisJc3lzZnNfcmVtb3ZlX2xpbmsoJnBvcnQtPmRldi5rb2JqLCBkZXZfbmFtZSgmcGh5LT5kZXYpKTsKIAlzeXNmc19yZW1vdmVfbGluaygmcGh5LT5kZXYua29iaiwgInBvcnQiKTsKIH0KIApAQCAtODIxLDExICs4MjEsMTEgQEAKIAogCWlmIChzY3NpX2lzX3Nhc19leHBhbmRlcl9kZXZpY2UocGFyZW50KSkgewogCQlzdHJ1Y3Qgc2FzX3JwaHkgKnJwaHkgPSBkZXZfdG9fcnBoeShwYXJlbnQpOwotCQlzcHJpbnRmKHBvcnQtPmRldi5idXNfaWQsICJwb3J0LSVkOiVkOiVkIiwgc2hvc3QtPmhvc3Rfbm8sCi0JCQlycGh5LT5zY3NpX3RhcmdldF9pZCwgcG9ydC0+cG9ydF9pZGVudGlmaWVyKTsKKwkJZGV2X3NldF9uYW1lKCZwb3J0LT5kZXYsICJwb3J0LSVkOiVkOiVkIiwgc2hvc3QtPmhvc3Rfbm8sCisJCQkgICAgIHJwaHktPnNjc2lfdGFyZ2V0X2lkLCBwb3J0LT5wb3J0X2lkZW50aWZpZXIpOwogCX0gZWxzZQotCQlzcHJpbnRmKHBvcnQtPmRldi5idXNfaWQsICJwb3J0LSVkOiVkIiwgc2hvc3QtPmhvc3Rfbm8sCi0JCQlwb3J0LT5wb3J0X2lkZW50aWZpZXIpOworCQlkZXZfc2V0X25hbWUoJnBvcnQtPmRldiwgInBvcnQtJWQ6JWQiLCBzaG9zdC0+aG9zdF9ubywKKwkJCSAgICAgcG9ydC0+cG9ydF9pZGVudGlmaWVyKTsKIAogCXRyYW5zcG9ydF9zZXR1cF9kZXZpY2UoJnBvcnQtPmRldik7CiAKQEAgLTkzNSw3ICs5MzUsNyBAQAogCWlmIChwb3J0LT5pc19iYWNrbGluaykgewogCQlzdHJ1Y3QgZGV2aWNlICpwYXJlbnQgPSBwb3J0LT5kZXYucGFyZW50OwogCi0JCXN5c2ZzX3JlbW92ZV9saW5rKCZwb3J0LT5kZXYua29iaiwgcGFyZW50LT5idXNfaWQpOworCQlzeXNmc19yZW1vdmVfbGluaygmcG9ydC0+ZGV2LmtvYmosIGRldl9uYW1lKHBhcmVudCkpOwogCQlwb3J0LT5pc19iYWNrbGluayA9IDA7CiAJfQogCkBAIC05ODQsNyArOTg0LDggQEAKIAkJLyogSWYgdGhpcyB0cmlwcywgeW91IGFkZGVkIGEgcGh5IHRoYXQgd2FzIGFscmVhZHkKIAkJICogcGFydCBvZiBhIGRpZmZlcmVudCBwb3J0ICovCiAJCWlmICh1bmxpa2VseSh0bXAgIT0gcGh5KSkgewotCQkJZGV2X3ByaW50ayhLRVJOX0VSUiwgJnBvcnQtPmRldiwgInRyeWluZyB0byBhZGQgcGh5ICVzIGZhaWxzOiBpdCdzIGFscmVhZHkgcGFydCBvZiBhbm90aGVyIHBvcnRcbiIsIHBoeS0+ZGV2LmJ1c19pZCk7CisJCQlkZXZfcHJpbnRrKEtFUk5fRVJSLCAmcG9ydC0+ZGV2LCAidHJ5aW5nIHRvIGFkZCBwaHkgJXMgZmFpbHM6IGl0J3MgYWxyZWFkeSBwYXJ0IG9mIGFub3RoZXIgcG9ydFxuIiwKKwkJCQkgICBkZXZfbmFtZSgmcGh5LT5kZXYpKTsKIAkJCUJVRygpOwogCQl9CiAJfSBlbHNlIHsKQEAgLTEwMjMsNyArMTAyNCw3IEBACiAJCXJldHVybjsKIAlwb3J0LT5pc19iYWNrbGluayA9IDE7CiAJcmVzID0gc3lzZnNfY3JlYXRlX2xpbmsoJnBvcnQtPmRldi5rb2JqLCAmcGFyZW50LT5rb2JqLAotCQkJCXBhcmVudC0+YnVzX2lkKTsKKwkJCQlkZXZfbmFtZShwYXJlbnQpKTsKIAlpZiAocmVzKQogCQlnb3RvIGVycjsKIAlyZXR1cm47CkBAIC0xMzY3LDExICsxMzY4LDEyIEBACiAJcmRldi0+cnBoeS5kZXYucmVsZWFzZSA9IHNhc19lbmRfZGV2aWNlX3JlbGVhc2U7CiAJaWYgKHNjc2lfaXNfc2FzX2V4cGFuZGVyX2RldmljZShwYXJlbnQtPmRldi5wYXJlbnQpKSB7CiAJCXN0cnVjdCBzYXNfcnBoeSAqcnBoeSA9IGRldl90b19ycGh5KHBhcmVudC0+ZGV2LnBhcmVudCk7Ci0JCXNwcmludGYocmRldi0+cnBoeS5kZXYuYnVzX2lkLCAiZW5kX2RldmljZS0lZDolZDolZCIsCi0JCQlzaG9zdC0+aG9zdF9ubywgcnBoeS0+c2NzaV90YXJnZXRfaWQsIHBhcmVudC0+cG9ydF9pZGVudGlmaWVyKTsKKwkJZGV2X3NldF9uYW1lKCZyZGV2LT5ycGh5LmRldiwgImVuZF9kZXZpY2UtJWQ6JWQ6JWQiLAorCQkJICAgICBzaG9zdC0+aG9zdF9ubywgcnBoeS0+c2NzaV90YXJnZXRfaWQsCisJCQkgICAgIHBhcmVudC0+cG9ydF9pZGVudGlmaWVyKTsKIAl9IGVsc2UKLQkJc3ByaW50ZihyZGV2LT5ycGh5LmRldi5idXNfaWQsICJlbmRfZGV2aWNlLSVkOiVkIiwKLQkJCXNob3N0LT5ob3N0X25vLCBwYXJlbnQtPnBvcnRfaWRlbnRpZmllcik7CisJCWRldl9zZXRfbmFtZSgmcmRldi0+cnBoeS5kZXYsICJlbmRfZGV2aWNlLSVkOiVkIiwKKwkJCSAgICAgc2hvc3QtPmhvc3Rfbm8sIHBhcmVudC0+cG9ydF9pZGVudGlmaWVyKTsKIAlyZGV2LT5ycGh5LmlkZW50aWZ5LmRldmljZV90eXBlID0gU0FTX0VORF9ERVZJQ0U7CiAJc2FzX3JwaHlfaW5pdGlhbGl6ZSgmcmRldi0+cnBoeSk7CiAJdHJhbnNwb3J0X3NldHVwX2RldmljZSgmcmRldi0+cnBoeS5kZXYpOwpAQCAtMTQxMSw4ICsxNDEzLDggQEAKIAltdXRleF9sb2NrKCZzYXNfaG9zdC0+bG9jayk7CiAJcmRldi0+cnBoeS5zY3NpX3RhcmdldF9pZCA9IHNhc19ob3N0LT5uZXh0X2V4cGFuZGVyX2lkKys7CiAJbXV0ZXhfdW5sb2NrKCZzYXNfaG9zdC0+bG9jayk7Ci0Jc3ByaW50ZihyZGV2LT5ycGh5LmRldi5idXNfaWQsICJleHBhbmRlci0lZDolZCIsCi0JCXNob3N0LT5ob3N0X25vLCByZGV2LT5ycGh5LnNjc2lfdGFyZ2V0X2lkKTsKKwlkZXZfc2V0X25hbWUoJnJkZXYtPnJwaHkuZGV2LCAiZXhwYW5kZXItJWQ6JWQiLAorCQkgICAgIHNob3N0LT5ob3N0X25vLCByZGV2LT5ycGh5LnNjc2lfdGFyZ2V0X2lkKTsKIAlyZGV2LT5ycGh5LmlkZW50aWZ5LmRldmljZV90eXBlID0gdHlwZTsKIAlzYXNfcnBoeV9pbml0aWFsaXplKCZyZGV2LT5ycGh5KTsKIAl0cmFuc3BvcnRfc2V0dXBfZGV2aWNlKCZyZGV2LT5ycGh5LmRldik7CkBAIC0xNDQ1LDcgKzE0NDcsNyBAQAogCXRyYW5zcG9ydF9hZGRfZGV2aWNlKCZycGh5LT5kZXYpOwogCXRyYW5zcG9ydF9jb25maWd1cmVfZGV2aWNlKCZycGh5LT5kZXYpOwogCWlmIChzYXNfYnNnX2luaXRpYWxpemUoc2hvc3QsIHJwaHkpKQotCQlwcmludGsoImZhaWwgdG8gYSBic2cgZGV2aWNlICVzXG4iLCBycGh5LT5kZXYuYnVzX2lkKTsKKwkJcHJpbnRrKCJmYWlsIHRvIGEgYnNnIGRldmljZSAlc1xuIiwgZGV2X25hbWUoJnJwaHktPmRldikpOwogCiAKIAltdXRleF9sb2NrKCZzYXNfaG9zdC0+bG9jayk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2NzaV90cmFuc3BvcnRfc3JwLmMgYi9kcml2ZXJzL3Njc2kvc2NzaV90cmFuc3BvcnRfc3JwLmMKaW5kZXggOGE3YWY5NS4uMjFhMDQ1ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3Njc2lfdHJhbnNwb3J0X3NycC5jCisrKyBiL2RyaXZlcnMvc2NzaS9zY3NpX3RyYW5zcG9ydF9zcnAuYwpAQCAtMjEyLDcgKzIxMiw3IEBACiAJcnBvcnQtPnJvbGVzID0gaWRzLT5yb2xlczsKIAogCWlkID0gYXRvbWljX2luY19yZXR1cm4oJnRvX3NycF9ob3N0X2F0dHJzKHNob3N0KS0+bmV4dF9wb3J0X2lkKTsKLQlzcHJpbnRmKHJwb3J0LT5kZXYuYnVzX2lkLCAicG9ydC0lZDolZCIsIHNob3N0LT5ob3N0X25vLCBpZCk7CisJZGV2X3NldF9uYW1lKCZycG9ydC0+ZGV2LCAicG9ydC0lZDolZCIsIHNob3N0LT5ob3N0X25vLCBpZCk7CiAKIAl0cmFuc3BvcnRfc2V0dXBfZGV2aWNlKCZycG9ydC0+ZGV2KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3NkLmMgYi9kcml2ZXJzL3Njc2kvc2QuYwppbmRleCA2MmIyOGQ1Li5kNTc1NjZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc2QuYworKysgYi9kcml2ZXJzL3Njc2kvc2QuYwpAQCAtNDgsNiArNDgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmdfaGVscGVycy5oPgorI2luY2x1ZGUgPGxpbnV4L2FzeW5jLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KIAogI2luY2x1ZGUgPHNjc2kvc2NzaS5oPgpAQCAtMTgwMiw2ICsxODAzLDcxIEBACiAJcmV0dXJuIDA7CiB9CiAKKy8qCisgKiBUaGUgYXN5bmNocm9ub3VzIHBhcnQgb2Ygc2RfcHJvYmUKKyAqLworc3RhdGljIHZvaWQgc2RfcHJvYmVfYXN5bmModm9pZCAqZGF0YSwgYXN5bmNfY29va2llX3QgY29va2llKQoreworCXN0cnVjdCBzY3NpX2Rpc2sgKnNka3AgPSBkYXRhOworCXN0cnVjdCBzY3NpX2RldmljZSAqc2RwOworCXN0cnVjdCBnZW5kaXNrICpnZDsKKwl1MzIgaW5kZXg7CisJc3RydWN0IGRldmljZSAqZGV2OworCisJc2RwID0gc2RrcC0+ZGV2aWNlOworCWdkID0gc2RrcC0+ZGlzazsKKwlpbmRleCA9IHNka3AtPmluZGV4OworCWRldiA9ICZzZHAtPnNkZXZfZ2VuZGV2OworCisJaWYgKCFzZHAtPnJlcXVlc3RfcXVldWUtPnJxX3RpbWVvdXQpIHsKKwkJaWYgKHNkcC0+dHlwZSAhPSBUWVBFX01PRCkKKwkJCWJsa19xdWV1ZV9ycV90aW1lb3V0KHNkcC0+cmVxdWVzdF9xdWV1ZSwgU0RfVElNRU9VVCk7CisJCWVsc2UKKwkJCWJsa19xdWV1ZV9ycV90aW1lb3V0KHNkcC0+cmVxdWVzdF9xdWV1ZSwKKwkJCQkJICAgICBTRF9NT0RfVElNRU9VVCk7CisJfQorCisJZGV2aWNlX2luaXRpYWxpemUoJnNka3AtPmRldik7CisJc2RrcC0+ZGV2LnBhcmVudCA9ICZzZHAtPnNkZXZfZ2VuZGV2OworCXNka3AtPmRldi5jbGFzcyA9ICZzZF9kaXNrX2NsYXNzOworCWRldl9zZXRfbmFtZSgmc2RrcC0+ZGV2LCBkZXZfbmFtZSgmc2RwLT5zZGV2X2dlbmRldikpOworCisJaWYgKGRldmljZV9hZGQoJnNka3AtPmRldikpCisJCWdvdG8gb3V0X2ZyZWVfaW5kZXg7CisKKwlnZXRfZGV2aWNlKCZzZHAtPnNkZXZfZ2VuZGV2KTsKKworCWlmIChpbmRleCA8IFNEX01BWF9ESVNLUykgeworCQlnZC0+bWFqb3IgPSBzZF9tYWpvcigoaW5kZXggJiAweGYwKSA+PiA0KTsKKwkJZ2QtPmZpcnN0X21pbm9yID0gKChpbmRleCAmIDB4ZikgPDwgNCkgfCAoaW5kZXggJiAweGZmZjAwKTsKKwkJZ2QtPm1pbm9ycyA9IFNEX01JTk9SUzsKKwl9CisJZ2QtPmZvcHMgPSAmc2RfZm9wczsKKwlnZC0+cHJpdmF0ZV9kYXRhID0gJnNka3AtPmRyaXZlcjsKKwlnZC0+cXVldWUgPSBzZGtwLT5kZXZpY2UtPnJlcXVlc3RfcXVldWU7CisKKwlzZF9yZXZhbGlkYXRlX2Rpc2soZ2QpOworCisJYmxrX3F1ZXVlX3ByZXBfcnEoc2RwLT5yZXF1ZXN0X3F1ZXVlLCBzZF9wcmVwX2ZuKTsKKworCWdkLT5kcml2ZXJmc19kZXYgPSAmc2RwLT5zZGV2X2dlbmRldjsKKwlnZC0+ZmxhZ3MgPSBHRU5IRF9GTF9FWFRfREVWVCB8IEdFTkhEX0ZMX0RSSVZFUkZTOworCWlmIChzZHAtPnJlbW92YWJsZSkKKwkJZ2QtPmZsYWdzIHw9IEdFTkhEX0ZMX1JFTU9WQUJMRTsKKworCWRldl9zZXRfZHJ2ZGF0YShkZXYsIHNka3ApOworCWFkZF9kaXNrKGdkKTsKKwlzZF9kaWZfY29uZmlnX2hvc3Qoc2RrcCk7CisKKwlzZF9wcmludGsoS0VSTl9OT1RJQ0UsIHNka3AsICJBdHRhY2hlZCBTQ1NJICVzZGlza1xuIiwKKwkJICBzZHAtPnJlbW92YWJsZSA/ICJyZW1vdmFibGUgIiA6ICIiKTsKKworCXJldHVybjsKKworIG91dF9mcmVlX2luZGV4OgorCWlkYV9yZW1vdmUoJnNkX2luZGV4X2lkYSwgaW5kZXgpOworfQorCiAvKioKICAqCXNkX3Byb2JlIC0gY2FsbGVkIGR1cmluZyBkcml2ZXIgaW5pdGlhbGl6YXRpb24gYW5kIHdoZW5ldmVyIGEKICAqCW5ldyBzY3NpIGRldmljZSBpcyBhdHRhY2hlZCB0byB0aGUgc3lzdGVtLiBJdCBpcyBjYWxsZWQgb25jZQpAQCAtMTg2NSw0OCArMTkzMSw3IEBACiAJc2RrcC0+b3BlbmVycyA9IDA7CiAJc2RrcC0+cHJldmlvdXNfc3RhdGUgPSAxOwogCi0JaWYgKCFzZHAtPnJlcXVlc3RfcXVldWUtPnJxX3RpbWVvdXQpIHsKLQkJaWYgKHNkcC0+dHlwZSAhPSBUWVBFX01PRCkKLQkJCWJsa19xdWV1ZV9ycV90aW1lb3V0KHNkcC0+cmVxdWVzdF9xdWV1ZSwgU0RfVElNRU9VVCk7Ci0JCWVsc2UKLQkJCWJsa19xdWV1ZV9ycV90aW1lb3V0KHNkcC0+cmVxdWVzdF9xdWV1ZSwKLQkJCQkJICAgICBTRF9NT0RfVElNRU9VVCk7Ci0JfQotCi0JZGV2aWNlX2luaXRpYWxpemUoJnNka3AtPmRldik7Ci0Jc2RrcC0+ZGV2LnBhcmVudCA9ICZzZHAtPnNkZXZfZ2VuZGV2OwotCXNka3AtPmRldi5jbGFzcyA9ICZzZF9kaXNrX2NsYXNzOwotCXN0cm5jcHkoc2RrcC0+ZGV2LmJ1c19pZCwgc2RwLT5zZGV2X2dlbmRldi5idXNfaWQsIEJVU19JRF9TSVpFKTsKLQotCWlmIChkZXZpY2VfYWRkKCZzZGtwLT5kZXYpKQotCQlnb3RvIG91dF9mcmVlX2luZGV4OwotCi0JZ2V0X2RldmljZSgmc2RwLT5zZGV2X2dlbmRldik7Ci0KLQlpZiAoaW5kZXggPCBTRF9NQVhfRElTS1MpIHsKLQkJZ2QtPm1ham9yID0gc2RfbWFqb3IoKGluZGV4ICYgMHhmMCkgPj4gNCk7Ci0JCWdkLT5maXJzdF9taW5vciA9ICgoaW5kZXggJiAweGYpIDw8IDQpIHwgKGluZGV4ICYgMHhmZmYwMCk7Ci0JCWdkLT5taW5vcnMgPSBTRF9NSU5PUlM7Ci0JfQotCWdkLT5mb3BzID0gJnNkX2ZvcHM7Ci0JZ2QtPnByaXZhdGVfZGF0YSA9ICZzZGtwLT5kcml2ZXI7Ci0JZ2QtPnF1ZXVlID0gc2RrcC0+ZGV2aWNlLT5yZXF1ZXN0X3F1ZXVlOwotCi0Jc2RfcmV2YWxpZGF0ZV9kaXNrKGdkKTsKLQotCWJsa19xdWV1ZV9wcmVwX3JxKHNkcC0+cmVxdWVzdF9xdWV1ZSwgc2RfcHJlcF9mbik7Ci0KLQlnZC0+ZHJpdmVyZnNfZGV2ID0gJnNkcC0+c2Rldl9nZW5kZXY7Ci0JZ2QtPmZsYWdzID0gR0VOSERfRkxfRVhUX0RFVlQgfCBHRU5IRF9GTF9EUklWRVJGUzsKLQlpZiAoc2RwLT5yZW1vdmFibGUpCi0JCWdkLT5mbGFncyB8PSBHRU5IRF9GTF9SRU1PVkFCTEU7Ci0KLQlkZXZfc2V0X2RydmRhdGEoZGV2LCBzZGtwKTsKLQlhZGRfZGlzayhnZCk7Ci0Jc2RfZGlmX2NvbmZpZ19ob3N0KHNka3ApOwotCi0Jc2RfcHJpbnRrKEtFUk5fTk9USUNFLCBzZGtwLCAiQXR0YWNoZWQgU0NTSSAlc2Rpc2tcbiIsCi0JCSAgc2RwLT5yZW1vdmFibGUgPyAicmVtb3ZhYmxlICIgOiAiIik7CisJYXN5bmNfc2NoZWR1bGUoc2RfcHJvYmVfYXN5bmMsIHNka3ApOwogCiAJcmV0dXJuIDA7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zZF9kaWYuYyBiL2RyaXZlcnMvc2NzaS9zZF9kaWYuYwppbmRleCAzZWJiMWYyLi4xODRkZmY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc2RfZGlmLmMKKysrIGIvZHJpdmVycy9zY3NpL3NkX2RpZi5jCkBAIC0xNDIsNyArMTQyLDcgQEAKIHN0YXRpYyB2b2lkIHNkX2RpZl90eXBlMV9zZXRfdGFnKHZvaWQgKnByb3QsIHZvaWQgKnRhZ19idWYsIHVuc2lnbmVkIGludCBzZWN0b3JzKQogewogCXN0cnVjdCBzZF9kaWZfdHVwbGUgKnNkdCA9IHByb3Q7Ci0JY2hhciAqdGFnID0gdGFnX2J1ZjsKKwl1OCAqdGFnID0gdGFnX2J1ZjsKIAl1bnNpZ25lZCBpbnQgaSwgajsKIAogCWZvciAoaSA9IDAsIGogPSAwIDsgaSA8IHNlY3RvcnMgOyBpKyssIGogKz0gMiwgc2R0KyspIHsKQEAgLTE1NCw3ICsxNTQsNyBAQAogc3RhdGljIHZvaWQgc2RfZGlmX3R5cGUxX2dldF90YWcodm9pZCAqcHJvdCwgdm9pZCAqdGFnX2J1ZiwgdW5zaWduZWQgaW50IHNlY3RvcnMpCiB7CiAJc3RydWN0IHNkX2RpZl90dXBsZSAqc2R0ID0gcHJvdDsKLQljaGFyICp0YWcgPSB0YWdfYnVmOworCXU4ICp0YWcgPSB0YWdfYnVmOwogCXVuc2lnbmVkIGludCBpLCBqOwogCiAJZm9yIChpID0gMCwgaiA9IDAgOyBpIDwgc2VjdG9ycyA7IGkrKywgaiArPSAyLCBzZHQrKykgewpAQCAtMjU2LDcgKzI1Niw3IEBACiBzdGF0aWMgdm9pZCBzZF9kaWZfdHlwZTNfc2V0X3RhZyh2b2lkICpwcm90LCB2b2lkICp0YWdfYnVmLCB1bnNpZ25lZCBpbnQgc2VjdG9ycykKIHsKIAlzdHJ1Y3Qgc2RfZGlmX3R1cGxlICpzZHQgPSBwcm90OwotCWNoYXIgKnRhZyA9IHRhZ19idWY7CisJdTggKnRhZyA9IHRhZ19idWY7CiAJdW5zaWduZWQgaW50IGksIGo7CiAKIAlmb3IgKGkgPSAwLCBqID0gMCA7IGkgPCBzZWN0b3JzIDsgaSsrLCBqICs9IDYsIHNkdCsrKSB7CkBAIC0yNjksNyArMjY5LDcgQEAKIHN0YXRpYyB2b2lkIHNkX2RpZl90eXBlM19nZXRfdGFnKHZvaWQgKnByb3QsIHZvaWQgKnRhZ19idWYsIHVuc2lnbmVkIGludCBzZWN0b3JzKQogewogCXN0cnVjdCBzZF9kaWZfdHVwbGUgKnNkdCA9IHByb3Q7Ci0JY2hhciAqdGFnID0gdGFnX2J1ZjsKKwl1OCAqdGFnID0gdGFnX2J1ZjsKIAl1bnNpZ25lZCBpbnQgaSwgajsKIAogCWZvciAoaSA9IDAsIGogPSAwIDsgaSA8IHNlY3RvcnMgOyBpKyssIGogKz0gMiwgc2R0KyspIHsKQEAgLTM3NCw3ICszNzQsMTAgQEAKIAllbHNlCiAJCWNzdW1fY29udmVydCA9IDA7CiAKKwlCVUdfT04oZGlmICYmIChzY21kLT5jbW5kWzBdID09IFJFQURfNiB8fCBzY21kLT5jbW5kWzBdID09IFdSSVRFXzYpKTsKKwogCXN3aXRjaCAoc2NtZC0+Y21uZFswXSkgeworCWNhc2UgUkVBRF82OgogCWNhc2UgUkVBRF8xMDoKIAljYXNlIFJFQURfMTI6CiAJY2FzZSBSRUFEXzE2OgpAQCAtMzkwLDYgKzM5Myw3IEBACiAKIAkJYnJlYWs7CiAKKwljYXNlIFdSSVRFXzY6CiAJY2FzZSBXUklURV8xMDoKIAljYXNlIFdSSVRFXzEyOgogCWNhc2UgV1JJVEVfMTY6CkBAIC00NzUsOCArNDc5LDkgQEAKIAogZXJyb3I6CiAJa3VubWFwX2F0b21pYyhzZHQsIEtNX1VTRVIwKTsKLQlzZF9wcmludGsoS0VSTl9FUlIsIHNka3AsICIlczogdmlydCAldSwgcGh5cyAldSwgcmVmICV1XG4iLAotCQkgIF9fZnVuY19fLCB2aXJ0LCBwaHlzLCBiZTMyX3RvX2NwdShzZHQtPnJlZl90YWcpKTsKKwlzZF9wcmludGsoS0VSTl9FUlIsIHNka3AsICIlczogdmlydCAldSwgcGh5cyAldSwgcmVmICV1LCBhcHAgJTR4XG4iLAorCQkgIF9fZnVuY19fLCB2aXJ0LCBwaHlzLCBiZTMyX3RvX2NwdShzZHQtPnJlZl90YWcpLAorCQkgIGJlMTZfdG9fY3B1KHNkdC0+YXBwX3RhZykpOwogCiAJcmV0dXJuIC1FSU87CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2VzLmMgYi9kcml2ZXJzL3Njc2kvc2VzLmMKaW5kZXggN2YwZGYyOS4uZTk0NmUwNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3Nlcy5jCisrKyBiL2RyaXZlcnMvc2NzaS9zZXMuYwpAQCAtNTI2LDcgKzUyNiw3IEBACiAJaWYgKCFzY29tcCkKIAkJZ290byBlcnJfZnJlZTsKIAotCWVkZXYgPSBlbmNsb3N1cmVfcmVnaXN0ZXIoY2Rldi0+cGFyZW50LCBzZGV2LT5zZGV2X2dlbmRldi5idXNfaWQsCisJZWRldiA9IGVuY2xvc3VyZV9yZWdpc3RlcihjZGV2LT5wYXJlbnQsIGRldl9uYW1lKCZzZGV2LT5zZGV2X2dlbmRldiksCiAJCQkJICBjb21wb25lbnRzLCAmc2VzX2VuY2xvc3VyZV9jYWxsYmFja3MpOwogCWlmIChJU19FUlIoZWRldikpIHsKIAkJZXJyID0gUFRSX0VSUihlZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zZy5jIGIvZHJpdmVycy9zY3NpL3NnLmMKaW5kZXggNTEwMzg1NS4uOGYwYmQzZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3NnLmMKKysrIGIvZHJpdmVycy9zY3NpL3NnLmMKQEAgLTE2NjksNiArMTY2OSw4IEBACiAJCW1kLT5wYWdlcyA9IHJlcV9zY2hwLT5wYWdlczsKIAkJbWQtPnBhZ2Vfb3JkZXIgPSByZXFfc2NocC0+cGFnZV9vcmRlcjsKIAkJbWQtPm5yX2VudHJpZXMgPSByZXFfc2NocC0+a191c2Vfc2c7CisJCW1kLT5vZmZzZXQgPSAwOworCQltZC0+bnVsbF9tYXBwZWQgPSBocC0+ZHhmZXJwID8gMCA6IDE7CiAJfQogCiAJaWYgKGlvdl9jb3VudCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zZ2l3ZDkzLmMgYi9kcml2ZXJzL3Njc2kvc2dpd2Q5My5jCmluZGV4IDMxZmU2MDUuLjA4MDdiMjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zZ2l3ZDkzLmMKKysrIGIvZHJpdmVycy9zY3NpL3NnaXdkOTMuYwpAQCAtMjk3LDcgKzI5Nyw3IEBACiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIHZvaWQgX19leGl0IHNnaXdkOTNfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCitzdGF0aWMgaW50IF9fZXhpdCBzZ2l3ZDkzX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3QgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAlzdHJ1Y3QgaXAyMl9ob3N0ZGF0YSAqaGRhdGEgPSAoc3RydWN0IGlwMjJfaG9zdGRhdGEgKikgaG9zdC0+aG9zdGRhdGE7CkBAIC0zMDcsNiArMzA3LDcgQEAKIAlmcmVlX2lycShwZC0+aXJxLCBob3N0KTsKIAlkbWFfZnJlZV9ub25jb2hlcmVudCgmcGRldi0+ZGV2LCBIUENfRE1BX1NJWkUsIGhkYXRhLT5jcHUsIGhkYXRhLT5kbWEpOwogCXNjc2lfaG9zdF9wdXQoaG9zdCk7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHNnaXdkOTNfZHJpdmVyID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3NpbTcxMC5jIGIvZHJpdmVycy9zY3NpL3NpbTcxMC5jCmluZGV4IGQ2M2QyMjkuLjZkYzhiODQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zaW03MTAuYworKysgYi9kcml2ZXJzL3Njc2kvc2ltNzEwLmMKQEAgLTEwMiw3ICsxMDIsNyBAQAogCXN0cnVjdCBOQ1JfNzAwX0hvc3RfUGFyYW1ldGVycyAqaG9zdGRhdGEgPQogCQlremFsbG9jKHNpemVvZihzdHJ1Y3QgTkNSXzcwMF9Ib3N0X1BhcmFtZXRlcnMpLAlHRlBfS0VSTkVMKTsKIAotCXByaW50ayhLRVJOX05PVElDRSAic2ltNzEwOiAlc1xuIiwgZGV2LT5idXNfaWQpOworCXByaW50ayhLRVJOX05PVElDRSAic2ltNzEwOiAlc1xuIiwgZGV2X25hbWUoZGV2KSk7CiAJcHJpbnRrKEtFUk5fTk9USUNFICJzaW03MTA6IGlycSA9ICVkLCBjbG9jayA9ICVkLCBiYXNlID0gMHglbHgsIHNjc2lfaWQgPSAlZFxuIiwKIAkgICAgICAgaXJxLCBjbG9jaywgYmFzZV9hZGRyLCBzY3NpX2lkKTsKIApAQCAtMzA1LDcgKzMwNSw3IEBACiAJCXNjc2lfaWQgPSBmZnModmFsKSAtIDE7CiAKIAkJaWYoc2NzaV9pZCA+IDcgfHwgKHZhbCAmIH4oMTw8c2NzaV9pZCkpICE9IDApIHsKLQkJCXByaW50ayhLRVJOX0VSUiAic2ltNzEwLmMsIEVJU0EgY2FyZCAlcyBoYXMgaW5jb3JyZWN0IHNjc2lfaWQsIHNldHRpbmcgdG8gN1xuIiwgZGV2LT5idXNfaWQpOworCQkJcHJpbnRrKEtFUk5fRVJSICJzaW03MTAuYywgRUlTQSBjYXJkICVzIGhhcyBpbmNvcnJlY3Qgc2NzaV9pZCwgc2V0dGluZyB0byA3XG4iLCBkZXZfbmFtZShkZXYpKTsKIAkJCXNjc2lfaWQgPSA3OwogCQl9CiAJfSBlbHNlIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zbmlfNTNjNzEwLmMgYi9kcml2ZXJzL3Njc2kvc25pXzUzYzcxMC5jCmluZGV4IDJiYmVmNGMuLjc3ZjBiMmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zbmlfNTNjNzEwLmMKKysrIGIvZHJpdmVycy9zY3NpL3NuaV81M2M3MTAuYwpAQCAtNzgsOCArNzgsNyBAQAogCWJhc2UgPSByZXMtPnN0YXJ0OwogCWhvc3RkYXRhID0ga3phbGxvYyhzaXplb2YoKmhvc3RkYXRhKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFob3N0ZGF0YSkgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBGYWlsZWQgdG8gYWxsb2NhdGUgaG9zdCBkYXRhXG4iLAotCQkgICAgICAgZGV2LT5kZXYuYnVzX2lkKTsKKwkJZGV2X3ByaW50ayhLRVJOX0VSUiwgZGV2LCAiRmFpbGVkIHRvIGFsbG9jYXRlIGhvc3QgZGF0YVxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3N0LmMgYi9kcml2ZXJzL3Njc2kvc3QuYwppbmRleCA3ZjNmMzE3Li5jNmYxOWVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc3QuYworKysgYi9kcml2ZXJzL3Njc2kvc3QuYwpAQCAtMTcsNyArMTcsNyBAQAogICAgTGFzdCBtb2RpZmllZDogMTgtSkFOLTE5OTggUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+IERldmZzIHN1cHBvcnQKICAqLwogCi1zdGF0aWMgY29uc3QgY2hhciAqdmVyc3RyID0gIjIwMDgwNTA0IjsKK3N0YXRpYyBjb25zdCBjaGFyICp2ZXJzdHIgPSAiMjAwODEyMTUiOwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKQEAgLTE4MiwxOCArMTgyLDE2IEBACiAKIHN0YXRpYyBpbnQgbW9kZXNfZGVmaW5lZDsKIAotc3RhdGljIHN0cnVjdCBzdF9idWZmZXIgKm5ld190YXBlX2J1ZmZlcihpbnQsIGludCwgaW50KTsKIHN0YXRpYyBpbnQgZW5sYXJnZV9idWZmZXIoc3RydWN0IHN0X2J1ZmZlciAqLCBpbnQsIGludCk7CiBzdGF0aWMgdm9pZCBjbGVhcl9idWZmZXIoc3RydWN0IHN0X2J1ZmZlciAqKTsKIHN0YXRpYyB2b2lkIG5vcm1hbGl6ZV9idWZmZXIoc3RydWN0IHN0X2J1ZmZlciAqKTsKIHN0YXRpYyBpbnQgYXBwZW5kX3RvX2J1ZmZlcihjb25zdCBjaGFyIF9fdXNlciAqLCBzdHJ1Y3Qgc3RfYnVmZmVyICosIGludCk7CiBzdGF0aWMgaW50IGZyb21fYnVmZmVyKHN0cnVjdCBzdF9idWZmZXIgKiwgY2hhciBfX3VzZXIgKiwgaW50KTsKIHN0YXRpYyB2b2lkIG1vdmVfYnVmZmVyX2RhdGEoc3RydWN0IHN0X2J1ZmZlciAqLCBpbnQpOwotc3RhdGljIHZvaWQgYnVmX3RvX3NnKHN0cnVjdCBzdF9idWZmZXIgKiwgdW5zaWduZWQgaW50KTsKIAotc3RhdGljIGludCBzZ2xfbWFwX3VzZXJfcGFnZXMoc3RydWN0IHNjYXR0ZXJsaXN0ICosIGNvbnN0IHVuc2lnbmVkIGludCwgCitzdGF0aWMgaW50IHNnbF9tYXBfdXNlcl9wYWdlcyhzdHJ1Y3Qgc3RfYnVmZmVyICosIGNvbnN0IHVuc2lnbmVkIGludCwKIAkJCSAgICAgIHVuc2lnbmVkIGxvbmcsIHNpemVfdCwgaW50KTsKLXN0YXRpYyBpbnQgc2dsX3VubWFwX3VzZXJfcGFnZXMoc3RydWN0IHNjYXR0ZXJsaXN0ICosIGNvbnN0IHVuc2lnbmVkIGludCwgaW50KTsKK3N0YXRpYyBpbnQgc2dsX3VubWFwX3VzZXJfcGFnZXMoc3RydWN0IHN0X2J1ZmZlciAqLCBjb25zdCB1bnNpZ25lZCBpbnQsIGludCk7CiAKIHN0YXRpYyBpbnQgc3RfcHJvYmUoc3RydWN0IGRldmljZSAqKTsKIHN0YXRpYyBpbnQgc3RfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKik7CkBAIC00MzUsMjIgKzQzMyw2IEBACiAJcmV0dXJuICgtRUlPKTsKIH0KIAotCi0vKiBXYWtldXAgZnJvbSBpbnRlcnJ1cHQgKi8KLXN0YXRpYyB2b2lkIHN0X3NsZWVwX2RvbmUodm9pZCAqZGF0YSwgY2hhciAqc2Vuc2UsIGludCByZXN1bHQsIGludCByZXNpZCkKLXsKLQlzdHJ1Y3Qgc3RfcmVxdWVzdCAqU1JwbnQgPSBkYXRhOwotCXN0cnVjdCBzY3NpX3RhcGUgKlNUcCA9IFNScG50LT5zdHA7Ci0KLQltZW1jcHkoU1JwbnQtPnNlbnNlLCBzZW5zZSwgU0NTSV9TRU5TRV9CVUZGRVJTSVpFKTsKLQkoU1RwLT5idWZmZXIpLT5jbWRzdGF0Lm1pZGxldmVsX3Jlc3VsdCA9IFNScG50LT5yZXN1bHQgPSByZXN1bHQ7Ci0JKFNUcC0+YnVmZmVyKS0+Y21kc3RhdC5yZXNpZHVhbCA9IHJlc2lkOwotCURFQiggU1RwLT53cml0ZV9wZW5kaW5nID0gMDsgKQotCi0JaWYgKFNScG50LT53YWl0aW5nKQotCQljb21wbGV0ZShTUnBudC0+d2FpdGluZyk7Ci19Ci0KIHN0YXRpYyBzdHJ1Y3Qgc3RfcmVxdWVzdCAqc3RfYWxsb2NhdGVfcmVxdWVzdChzdHJ1Y3Qgc2NzaV90YXBlICpzdHApCiB7CiAJc3RydWN0IHN0X3JlcXVlc3QgKnN0cmVxOwpAQCAtNDc1LDYgKzQ1Nyw2MyBAQAogCWtmcmVlKHN0cmVxKTsKIH0KIAorc3RhdGljIHZvaWQgc3Rfc2NzaV9leGVjdXRlX2VuZChzdHJ1Y3QgcmVxdWVzdCAqcmVxLCBpbnQgdXB0b2RhdGUpCit7CisJc3RydWN0IHN0X3JlcXVlc3QgKlNScG50ID0gcmVxLT5lbmRfaW9fZGF0YTsKKwlzdHJ1Y3Qgc2NzaV90YXBlICpTVHAgPSBTUnBudC0+c3RwOworCisJU1RwLT5idWZmZXItPmNtZHN0YXQubWlkbGV2ZWxfcmVzdWx0ID0gU1JwbnQtPnJlc3VsdCA9IHJlcS0+ZXJyb3JzOworCVNUcC0+YnVmZmVyLT5jbWRzdGF0LnJlc2lkdWFsID0gcmVxLT5kYXRhX2xlbjsKKworCWlmIChTUnBudC0+d2FpdGluZykKKwkJY29tcGxldGUoU1JwbnQtPndhaXRpbmcpOworCisJYmxrX3JxX3VubWFwX3VzZXIoU1JwbnQtPmJpbyk7CisJX19ibGtfcHV0X3JlcXVlc3QocmVxLT5xLCByZXEpOworfQorCitzdGF0aWMgaW50IHN0X3Njc2lfZXhlY3V0ZShzdHJ1Y3Qgc3RfcmVxdWVzdCAqU1JwbnQsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmNtZCwKKwkJCSAgIGludCBkYXRhX2RpcmVjdGlvbiwgdm9pZCAqYnVmZmVyLCB1bnNpZ25lZCBidWZmbGVuLAorCQkJICAgaW50IHRpbWVvdXQsIGludCByZXRyaWVzKQoreworCXN0cnVjdCByZXF1ZXN0ICpyZXE7CisJc3RydWN0IHJxX21hcF9kYXRhICptZGF0YSA9ICZTUnBudC0+c3RwLT5idWZmZXItPm1hcF9kYXRhOworCWludCBlcnIgPSAwOworCWludCB3cml0ZSA9IChkYXRhX2RpcmVjdGlvbiA9PSBETUFfVE9fREVWSUNFKTsKKworCXJlcSA9IGJsa19nZXRfcmVxdWVzdChTUnBudC0+c3RwLT5kZXZpY2UtPnJlcXVlc3RfcXVldWUsIHdyaXRlLAorCQkJICAgICAgR0ZQX0tFUk5FTCk7CisJaWYgKCFyZXEpCisJCXJldHVybiBEUklWRVJfRVJST1IgPDwgMjQ7CisKKwlyZXEtPmNtZF90eXBlID0gUkVRX1RZUEVfQkxPQ0tfUEM7CisJcmVxLT5jbWRfZmxhZ3MgfD0gUkVRX1FVSUVUOworCisJbWRhdGEtPm51bGxfbWFwcGVkID0gMTsKKworCWlmIChidWZmbGVuKSB7CisJCWVyciA9IGJsa19ycV9tYXBfdXNlcihyZXEtPnEsIHJlcSwgbWRhdGEsIE5VTEwsIGJ1ZmZsZW4sCisJCQkJICAgICAgR0ZQX0tFUk5FTCk7CisJCWlmIChlcnIpIHsKKwkJCWJsa19wdXRfcmVxdWVzdChyZXEpOworCQkJcmV0dXJuIERSSVZFUl9FUlJPUiA8PCAyNDsKKwkJfQorCX0KKworCVNScG50LT5iaW8gPSByZXEtPmJpbzsKKwlyZXEtPmNtZF9sZW4gPSBDT01NQU5EX1NJWkUoY21kWzBdKTsKKwltZW1zZXQocmVxLT5jbWQsIDAsIEJMS19NQVhfQ0RCKTsKKwltZW1jcHkocmVxLT5jbWQsIGNtZCwgcmVxLT5jbWRfbGVuKTsKKwlyZXEtPnNlbnNlID0gU1JwbnQtPnNlbnNlOworCXJlcS0+c2Vuc2VfbGVuID0gMDsKKwlyZXEtPnRpbWVvdXQgPSB0aW1lb3V0OworCXJlcS0+cmV0cmllcyA9IHJldHJpZXM7CisJcmVxLT5lbmRfaW9fZGF0YSA9IFNScG50OworCisJYmxrX2V4ZWN1dGVfcnFfbm93YWl0KHJlcS0+cSwgTlVMTCwgcmVxLCAxLCBzdF9zY3NpX2V4ZWN1dGVfZW5kKTsKKwlyZXR1cm4gMDsKK30KKwogLyogRG8gdGhlIHNjc2kgY29tbWFuZC4gV2FpdHMgdW50aWwgY29tbWFuZCBwZXJmb3JtZWQgaWYgZG9fd2FpdCBpcyB0cnVlLgogICAgT3RoZXJ3aXNlIHdyaXRlX2JlaGluZF9jaGVjaygpIGlzIHVzZWQgdG8gY2hlY2sgdGhhdCB0aGUgY29tbWFuZAogICAgaGFzIGZpbmlzaGVkLiAqLwpAQCAtNDgzLDYgKzUyMiw4IEBACiAJICAgaW50IGJ5dGVzLCBpbnQgZGlyZWN0aW9uLCBpbnQgdGltZW91dCwgaW50IHJldHJpZXMsIGludCBkb193YWl0KQogewogCXN0cnVjdCBjb21wbGV0aW9uICp3YWl0aW5nOworCXN0cnVjdCBycV9tYXBfZGF0YSAqbWRhdGEgPSAmU1RwLT5idWZmZXItPm1hcF9kYXRhOworCWludCByZXQ7CiAKIAkvKiBpZiBhc3luYywgbWFrZSBzdXJlIHRoZXJlJ3Mgbm8gY29tbWFuZCBvdXRzdGFuZGluZyAqLwogCWlmICghZG9fd2FpdCAmJiAoKFNUcC0+YnVmZmVyKS0+bGFzdF9TUnBudCkpIHsKQEAgLTUxMCwyMSArNTUxLDI3IEBACiAJaW5pdF9jb21wbGV0aW9uKHdhaXRpbmcpOwogCVNScG50LT53YWl0aW5nID0gd2FpdGluZzsKIAotCWlmICghU1RwLT5idWZmZXItPmRvX2RpbykKLQkJYnVmX3RvX3NnKFNUcC0+YnVmZmVyLCBieXRlcyk7CisJaWYgKFNUcC0+YnVmZmVyLT5kb19kaW8pIHsKKwkJbWRhdGEtPm5yX2VudHJpZXMgPSBTVHAtPmJ1ZmZlci0+c2dfc2VnczsKKwkJbWRhdGEtPnBhZ2VzID0gU1RwLT5idWZmZXItPm1hcHBlZF9wYWdlczsKKwl9IGVsc2UgeworCQltZGF0YS0+bnJfZW50cmllcyA9CisJCQlESVZfUk9VTkRfVVAoYnl0ZXMsIFBBR0VfU0laRSA8PCBtZGF0YS0+cGFnZV9vcmRlcik7CisJCVNUcC0+YnVmZmVyLT5tYXBfZGF0YS5wYWdlcyA9IFNUcC0+YnVmZmVyLT5yZXNlcnZlZF9wYWdlczsKKwkJU1RwLT5idWZmZXItPm1hcF9kYXRhLm9mZnNldCA9IDA7CisJfQogCiAJbWVtY3B5KFNScG50LT5jbWQsIGNtZCwgc2l6ZW9mKFNScG50LT5jbWQpKTsKIAlTVHAtPmJ1ZmZlci0+Y21kc3RhdC5oYXZlX3NlbnNlID0gMDsKIAlTVHAtPmJ1ZmZlci0+c3lzY2FsbF9yZXN1bHQgPSAwOwogCi0JaWYgKHNjc2lfZXhlY3V0ZV9hc3luYyhTVHAtPmRldmljZSwgY21kLCBDT01NQU5EX1NJWkUoY21kWzBdKSwgZGlyZWN0aW9uLAotCQkJJigoU1RwLT5idWZmZXIpLT5zZ1swXSksIGJ5dGVzLCAoU1RwLT5idWZmZXIpLT5zZ19zZWdzLAotCQkJICAgICAgIHRpbWVvdXQsIHJldHJpZXMsIFNScG50LCBzdF9zbGVlcF9kb25lLCBHRlBfS0VSTkVMKSkgeworCXJldCA9IHN0X3Njc2lfZXhlY3V0ZShTUnBudCwgY21kLCBkaXJlY3Rpb24sIE5VTEwsIGJ5dGVzLCB0aW1lb3V0LAorCQkJICAgICAgcmV0cmllcyk7CisJaWYgKHJldCkgewogCQkvKiBjb3VsZCBub3QgYWxsb2NhdGUgdGhlIGJ1ZmZlciBvciByZXF1ZXN0IHdhcyB0b28gbGFyZ2UgKi8KIAkJKFNUcC0+YnVmZmVyKS0+c3lzY2FsbF9yZXN1bHQgPSAoLUVCVVNZKTsKIAkJKFNUcC0+YnVmZmVyKS0+bGFzdF9TUnBudCA9IE5VTEw7Ci0JfQotCWVsc2UgaWYgKGRvX3dhaXQpIHsKKwl9IGVsc2UgaWYgKGRvX3dhaXQpIHsKIAkJd2FpdF9mb3JfY29tcGxldGlvbih3YWl0aW5nKTsKIAkJU1JwbnQtPndhaXRpbmcgPSBOVUxMOwogCQkoU1RwLT5idWZmZXIpLT5zeXNjYWxsX3Jlc3VsdCA9IHN0X2Noa19yZXN1bHQoU1RwLCBTUnBudCk7CkBAIC01MzMsMjggKzU4MCw2IEBACiAJcmV0dXJuIFNScG50OwogfQogCi1zdGF0aWMgaW50IHN0X3Njc2lfa2Vybl9leGVjdXRlKHN0cnVjdCBzdF9yZXF1ZXN0ICpzdHJlcSwKLQkJCQljb25zdCB1bnNpZ25lZCBjaGFyICpjbWQsIGludCBkYXRhX2RpcmVjdGlvbiwKLQkJCQl2b2lkICpidWZmZXIsIHVuc2lnbmVkIGJ1ZmZsZW4sIGludCB0aW1lb3V0LAotCQkJCWludCByZXRyaWVzKQotewotCXN0cnVjdCBzY3NpX3RhcGUgKnN0cCA9IHN0cmVxLT5zdHA7Ci0JaW50IHJldCwgcmVzaWQ7Ci0KLQlzdHAtPmJ1ZmZlci0+Y21kc3RhdC5oYXZlX3NlbnNlID0gMDsKLQltZW1jcHkoc3RyZXEtPmNtZCwgY21kLCBzaXplb2Yoc3RyZXEtPmNtZCkpOwotCi0JcmV0ID0gc2NzaV9leGVjdXRlKHN0cC0+ZGV2aWNlLCBjbWQsIGRhdGFfZGlyZWN0aW9uLCBidWZmZXIsIGJ1ZmZsZW4sCi0JCQkgICBzdHJlcS0+c2Vuc2UsIHRpbWVvdXQsIHJldHJpZXMsIDAsICZyZXNpZCk7Ci0JaWYgKGRyaXZlcl9ieXRlKHJldCkgJiBEUklWRVJfRVJST1IpCi0JCXJldHVybiAtRUJVU1k7Ci0KLQlzdHAtPmJ1ZmZlci0+Y21kc3RhdC5taWRsZXZlbF9yZXN1bHQgPSBzdHJlcS0+cmVzdWx0ID0gcmV0OwotCXN0cC0+YnVmZmVyLT5jbWRzdGF0LnJlc2lkdWFsID0gcmVzaWQ7Ci0Jc3RwLT5idWZmZXItPnN5c2NhbGxfcmVzdWx0ID0gc3RfY2hrX3Jlc3VsdChzdHAsIHN0cmVxKTsKLQotCXJldHVybiAwOwotfQogCiAvKiBIYW5kbGUgdGhlIHdyaXRlLWJlaGluZCBjaGVja2luZyAod2FpdHMgZm9yIGNvbXBsZXRpb24pLiBSZXR1cm5zIC1FTk9TUEMgaWYKICAgIHdyaXRlIGhhcyBiZWVuIGNvcnJlY3QgYnV0IEVPTSBlYXJseSB3YXJuaW5nIHJlYWNoZWQsIC1FSU8gaWYgd3JpdGUgZW5kZWQgaW4KQEAgLTYyNyw3ICs2NTIsNiBAQAogewogCXN0cnVjdCBzdF9yZXF1ZXN0ICpTUnBudDsKIAl1bnNpZ25lZCBjaGFyIGNtZFtNQVhfQ09NTUFORF9TSVpFXTsKLQlpbnQgcmV0OwogCiAJY21kWzBdID0gU1BBQ0U7CiAJY21kWzFdID0gMHgwMTsJCS8qIFNwYWNlIEZpbGVNYXJrcyAqLwpAQCAtNjQxLDI2ICs2NjUsMjAgQEAKICAgICAgICAgREVCQyhwcmludGsoU1RfREVCX01TRyAiJXM6IFN0ZXBwaW5nIG92ZXIgZmlsZW1hcmsgJXMuXG4iLAogCQkgICB0YXBlX25hbWUoU1RwKSwgZm9yd2FyZCA/ICJmb3J3YXJkIiA6ICJiYWNrd2FyZCIpKTsKIAotCVNScG50ID0gc3RfYWxsb2NhdGVfcmVxdWVzdChTVHApOworCVNScG50ID0gc3RfZG9fc2NzaShOVUxMLCBTVHAsIGNtZCwgMCwgRE1BX05PTkUsCisJCQkgICBTVHAtPmRldmljZS0+cmVxdWVzdF9xdWV1ZS0+cnFfdGltZW91dCwKKwkJCSAgIE1BWF9SRVRSSUVTLCAxKTsKIAlpZiAoIVNScG50KQotCQlyZXR1cm4gU1RwLT5idWZmZXItPnN5c2NhbGxfcmVzdWx0OworCQlyZXR1cm4gKFNUcC0+YnVmZmVyKS0+c3lzY2FsbF9yZXN1bHQ7CiAKLQlyZXQgPSBzdF9zY3NpX2tlcm5fZXhlY3V0ZShTUnBudCwgY21kLCBETUFfTk9ORSwgTlVMTCwgMCwKLQkJCQkgICBTVHAtPmRldmljZS0+cmVxdWVzdF9xdWV1ZS0+cnFfdGltZW91dCwKLQkJCQkgICBNQVhfUkVUUklFUyk7Ci0JaWYgKHJldCkKLQkJZ290byBvdXQ7Ci0KLQlyZXQgPSBTVHAtPmJ1ZmZlci0+c3lzY2FsbF9yZXN1bHQ7CisJc3RfcmVsZWFzZV9yZXF1ZXN0KFNScG50KTsKKwlTUnBudCA9IE5VTEw7CiAKIAlpZiAoKFNUcC0+YnVmZmVyKS0+Y21kc3RhdC5taWRsZXZlbF9yZXN1bHQgIT0gMCkKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogU3RlcHBpbmcgb3ZlciBmaWxlbWFyayAlcyBmYWlsZWQuXG4iLAogCQkgICB0YXBlX25hbWUoU1RwKSwgZm9yd2FyZCA/ICJmb3J3YXJkIiA6ICJiYWNrd2FyZCIpOwogCi1vdXQ6Ci0Jc3RfcmVsZWFzZV9yZXF1ZXN0KFNScG50KTsKLQotCXJldHVybiByZXQ7CisJcmV0dXJuIChTVHAtPmJ1ZmZlciktPnN5c2NhbGxfcmVzdWx0OwogfQogCiAKQEAgLTg4MSwyNCArODk5LDIxIEBACiAJaW50IGF0dGVudGlvbnMsIHdhaXRzLCBtYXhfd2FpdCwgc2NvZGU7CiAJaW50IHJldHZhbCA9IENIS1JFU19SRUFEWSwgbmV3X3Nlc3Npb24gPSAwOwogCXVuc2lnbmVkIGNoYXIgY21kW01BWF9DT01NQU5EX1NJWkVdOwotCXN0cnVjdCBzdF9yZXF1ZXN0ICpTUnBudDsKKwlzdHJ1Y3Qgc3RfcmVxdWVzdCAqU1JwbnQgPSBOVUxMOwogCXN0cnVjdCBzdF9jbWRzdGF0dXMgKmNtZHN0YXRwID0gJlNUcC0+YnVmZmVyLT5jbWRzdGF0OwogCi0JU1JwbnQgPSBzdF9hbGxvY2F0ZV9yZXF1ZXN0KFNUcCk7Ci0JaWYgKCFTUnBudCkKLQkJcmV0dXJuIFNUcC0+YnVmZmVyLT5zeXNjYWxsX3Jlc3VsdDsKLQogCW1heF93YWl0ID0gZG9fd2FpdCA/IFNUX0JMT0NLX1NFQ09ORFMgOiAwOwogCiAJZm9yIChhdHRlbnRpb25zPXdhaXRzPTA7IDsgKSB7CiAJCW1lbXNldCgodm9pZCAqKSAmY21kWzBdLCAwLCBNQVhfQ09NTUFORF9TSVpFKTsKIAkJY21kWzBdID0gVEVTVF9VTklUX1JFQURZOworCQlTUnBudCA9IHN0X2RvX3Njc2koU1JwbnQsIFNUcCwgY21kLCAwLCBETUFfTk9ORSwKKwkJCQkgICBTVHAtPmxvbmdfdGltZW91dCwgTUFYX1JFQURZX1JFVFJJRVMsIDEpOwogCi0JCXJldHZhbCA9IHN0X3Njc2lfa2Vybl9leGVjdXRlKFNScG50LCBjbWQsIERNQV9OT05FLCBOVUxMLCAwLAotCQkJCQkgICAgICBTVHAtPmxvbmdfdGltZW91dCwKLQkJCQkJICAgICAgTUFYX1JFQURZX1JFVFJJRVMpOwotCQlpZiAocmV0dmFsKQorCQlpZiAoIVNScG50KSB7CisJCQlyZXR2YWwgPSAoU1RwLT5idWZmZXIpLT5zeXNjYWxsX3Jlc3VsdDsKIAkJCWJyZWFrOworCQl9CiAKIAkJaWYgKGNtZHN0YXRwLT5oYXZlX3NlbnNlKSB7CiAKQEAgLTk0Miw4ICs5NTcsOCBAQAogCQlicmVhazsKIAl9CiAKLQlzdF9yZWxlYXNlX3JlcXVlc3QoU1JwbnQpOwotCisJaWYgKFNScG50ICE9IE5VTEwpCisJCXN0X3JlbGVhc2VfcmVxdWVzdChTUnBudCk7CiAJcmV0dXJuIHJldHZhbDsKIH0KIApAQCAtMTAyMCwyNCArMTAzNSwxNyBAQAogCQl9CiAJfQogCi0JU1JwbnQgPSBzdF9hbGxvY2F0ZV9yZXF1ZXN0KFNUcCk7Ci0JaWYgKCFTUnBudCkgewotCQlyZXR2YWwgPSBTVHAtPmJ1ZmZlci0+c3lzY2FsbF9yZXN1bHQ7Ci0JCWdvdG8gZXJyX291dDsKLQl9Ci0KIAlpZiAoU1RwLT5vbWl0X2Jsa2xpbXMpCiAJCVNUcC0+bWluX2Jsb2NrID0gU1RwLT5tYXhfYmxvY2sgPSAoLTEpOwogCWVsc2UgewogCQltZW1zZXQoKHZvaWQgKikgJmNtZFswXSwgMCwgTUFYX0NPTU1BTkRfU0laRSk7CiAJCWNtZFswXSA9IFJFQURfQkxPQ0tfTElNSVRTOwogCi0JCXJldHZhbCA9IHN0X3Njc2lfa2Vybl9leGVjdXRlKFNScG50LCBjbWQsIERNQV9GUk9NX0RFVklDRSwKLQkJCQkJICAgICAgU1RwLT5idWZmZXItPmJfZGF0YSwgNiwKLQkJCQkJICAgICAgU1RwLT5kZXZpY2UtPnJlcXVlc3RfcXVldWUtPnJxX3RpbWVvdXQsCi0JCQkJCSAgICAgIE1BWF9SRUFEWV9SRVRSSUVTKTsKLQkJaWYgKHJldHZhbCkgewotCQkJc3RfcmVsZWFzZV9yZXF1ZXN0KFNScG50KTsKKwkJU1JwbnQgPSBzdF9kb19zY3NpKFNScG50LCBTVHAsIGNtZCwgNiwgRE1BX0ZST01fREVWSUNFLAorCQkJCSAgIFNUcC0+ZGV2aWNlLT5yZXF1ZXN0X3F1ZXVlLT5ycV90aW1lb3V0LAorCQkJCSAgIE1BWF9SRUFEWV9SRVRSSUVTLCAxKTsKKwkJaWYgKCFTUnBudCkgeworCQkJcmV0dmFsID0gKFNUcC0+YnVmZmVyKS0+c3lzY2FsbF9yZXN1bHQ7CiAJCQlnb3RvIGVycl9vdXQ7CiAJCX0KIApAQCAtMTA2MSwxMiArMTA2OSwxMSBAQAogCWNtZFswXSA9IE1PREVfU0VOU0U7CiAJY21kWzRdID0gMTI7CiAKLQlyZXR2YWwgPSBzdF9zY3NpX2tlcm5fZXhlY3V0ZShTUnBudCwgY21kLCBETUFfRlJPTV9ERVZJQ0UsCi0JCQkJICAgICAgU1RwLT5idWZmZXItPmJfZGF0YSwgMTIsCi0JCQkJICAgICAgU1RwLT5kZXZpY2UtPnJlcXVlc3RfcXVldWUtPnJxX3RpbWVvdXQsCi0JCQkJICAgICAgTUFYX1JFQURZX1JFVFJJRVMpOwotCWlmIChyZXR2YWwpIHsKLQkJc3RfcmVsZWFzZV9yZXF1ZXN0KFNScG50KTsKKwlTUnBudCA9IHN0X2RvX3Njc2koU1JwbnQsIFNUcCwgY21kLCAxMiwgRE1BX0ZST01fREVWSUNFLAorCQkJICAgU1RwLT5kZXZpY2UtPnJlcXVlc3RfcXVldWUtPnJxX3RpbWVvdXQsCisJCQkgICBNQVhfUkVBRFlfUkVUUklFUywgMSk7CisJaWYgKCFTUnBudCkgeworCQlyZXR2YWwgPSAoU1RwLT5idWZmZXIpLT5zeXNjYWxsX3Jlc3VsdDsKIAkJZ290byBlcnJfb3V0OwogCX0KIApAQCAtMTI5NiwxNyArMTMwMywxMSBAQAogCQljbWRbMF0gPSBXUklURV9GSUxFTUFSS1M7CiAJCWNtZFs0XSA9IDEgKyBTVHAtPnR3b19mbTsKIAotCQlTUnBudCA9IHN0X2FsbG9jYXRlX3JlcXVlc3QoU1RwKTsKKwkJU1JwbnQgPSBzdF9kb19zY3NpKE5VTEwsIFNUcCwgY21kLCAwLCBETUFfTk9ORSwKKwkJCQkgICBTVHAtPmRldmljZS0+cmVxdWVzdF9xdWV1ZS0+cnFfdGltZW91dCwKKwkJCQkgICBNQVhfV1JJVEVfUkVUUklFUywgMSk7CiAJCWlmICghU1JwbnQpIHsKLQkJCXJlc3VsdCA9IFNUcC0+YnVmZmVyLT5zeXNjYWxsX3Jlc3VsdDsKLQkJCWdvdG8gb3V0OwotCQl9Ci0KLQkJcmVzdWx0ID0gc3Rfc2NzaV9rZXJuX2V4ZWN1dGUoU1JwbnQsIGNtZCwgRE1BX05PTkUsIE5VTEwsIDAsCi0JCQkJCSAgICAgIFNUcC0+ZGV2aWNlLT5yZXF1ZXN0X3F1ZXVlLT5ycV90aW1lb3V0LAotCQkJCQkgICAgICBNQVhfV1JJVEVfUkVUUklFUyk7Ci0JCWlmIChyZXN1bHQpIHsKLQkJCXN0X3JlbGVhc2VfcmVxdWVzdChTUnBudCk7CisJCQlyZXN1bHQgPSAoU1RwLT5idWZmZXIpLT5zeXNjYWxsX3Jlc3VsdDsKIAkJCWdvdG8gb3V0OwogCQl9CiAKQEAgLTE0NzEsOCArMTQ3Miw4IEBACiAKIAlpZiAoaSAmJiAoKHVuc2lnbmVkIGxvbmcpYnVmICYgcXVldWVfZG1hX2FsaWdubWVudCgKIAkJCQkJU1RwLT5kZXZpY2UtPnJlcXVlc3RfcXVldWUpKSA9PSAwKSB7Ci0JCWkgPSBzZ2xfbWFwX3VzZXJfcGFnZXMoJihTVGJwLT5zZ1swXSksIFNUYnAtPnVzZV9zZywKLQkJCQkgICAgICAodW5zaWduZWQgbG9uZylidWYsIGNvdW50LCAoaXNfcmVhZCA/IFJFQUQgOiBXUklURSkpOworCQlpID0gc2dsX21hcF91c2VyX3BhZ2VzKFNUYnAsIFNUYnAtPnVzZV9zZywgKHVuc2lnbmVkIGxvbmcpYnVmLAorCQkJCSAgICAgICBjb3VudCwgKGlzX3JlYWQgPyBSRUFEIDogV1JJVEUpKTsKIAkJaWYgKGkgPiAwKSB7CiAJCQlTVGJwLT5kb19kaW8gPSBpOwogCQkJU1RicC0+YnVmZmVyX2J5dGVzID0gMDsgICAvKiBjYW4gYmUgdXNlZCBhcyB0cmFuc2ZlciBjb3VudGVyICovCkBAIC0xNDgwLDcgKzE0ODEsNiBAQAogCQllbHNlCiAJCQlTVGJwLT5kb19kaW8gPSAwOyAgLyogZmFsbCBiYWNrIHRvIGJ1ZmZlcmluZyB3aXRoIGFueSBlcnJvciAqLwogCQlTVGJwLT5zZ19zZWdzID0gU1RicC0+ZG9fZGlvOwotCQlTVGJwLT5mcnBfc2dfY3VycmVudCA9IDA7CiAJCURFQigKIAkJICAgICBpZiAoU1RicC0+ZG9fZGlvKSB7CiAJCQlTVHAtPm5icl9kaW8rKzsKQEAgLTE1MjYsNyArMTUyNiw3IEBACiAKIAlTVGJwID0gU1RwLT5idWZmZXI7CiAJaWYgKFNUYnAtPmRvX2RpbykgewotCQlzZ2xfdW5tYXBfdXNlcl9wYWdlcygmKFNUYnAtPnNnWzBdKSwgU1RicC0+ZG9fZGlvLCBpc19yZWFkKTsKKwkJc2dsX3VubWFwX3VzZXJfcGFnZXMoU1RicCwgU1RicC0+ZG9fZGlvLCBpc19yZWFkKTsKIAkJU1RicC0+ZG9fZGlvID0gMDsKIAkJU1RicC0+c2dfc2VncyA9IDA7CiAJfQpAQCAtMjM3Miw3ICsyMzcyLDYgQEAKIHsKIAl1bnNpZ25lZCBjaGFyIGNtZFtNQVhfQ09NTUFORF9TSVpFXTsKIAlzdHJ1Y3Qgc3RfcmVxdWVzdCAqU1JwbnQ7Ci0JaW50IHJldDsKIAogCW1lbXNldChjbWQsIDAsIE1BWF9DT01NQU5EX1NJWkUpOwogCWNtZFswXSA9IE1PREVfU0VOU0U7CkBAIC0yMzgxLDE3ICsyMzgwLDE0IEBACiAJY21kWzJdID0gcGFnZTsKIAljbWRbNF0gPSAyNTU7CiAKLQlTUnBudCA9IHN0X2FsbG9jYXRlX3JlcXVlc3QoU1RwKTsKLQlpZiAoIVNScG50KQotCQlyZXR1cm4gU1RwLT5idWZmZXItPnN5c2NhbGxfcmVzdWx0OworCVNScG50ID0gc3RfZG9fc2NzaShOVUxMLCBTVHAsIGNtZCwgY21kWzRdLCBETUFfRlJPTV9ERVZJQ0UsCisJCQkgICBTVHAtPmRldmljZS0+cmVxdWVzdF9xdWV1ZS0+cnFfdGltZW91dCwgMCwgMSk7CisJaWYgKFNScG50ID09IE5VTEwpCisJCXJldHVybiAoU1RwLT5idWZmZXIpLT5zeXNjYWxsX3Jlc3VsdDsKIAotCXJldCA9IHN0X3Njc2lfa2Vybl9leGVjdXRlKFNScG50LCBjbWQsIERNQV9GUk9NX0RFVklDRSwKLQkJCQkgICBTVHAtPmJ1ZmZlci0+Yl9kYXRhLCBjbWRbNF0sCi0JCQkJICAgU1RwLT5kZXZpY2UtPnJlcXVlc3RfcXVldWUtPnJxX3RpbWVvdXQsCi0JCQkJICAgTUFYX1JFVFJJRVMpOwogCXN0X3JlbGVhc2VfcmVxdWVzdChTUnBudCk7CiAKLQlyZXR1cm4gcmV0ID8gOiBTVHAtPmJ1ZmZlci0+c3lzY2FsbF9yZXN1bHQ7CisJcmV0dXJuIFNUcC0+YnVmZmVyLT5zeXNjYWxsX3Jlc3VsdDsKIH0KIAogCkBAIC0yMzk5LDkgKzIzOTUsMTAgQEAKICAgIGluIHRoZSBidWZmZXIgaXMgY29ycmVjdGx5IGZvcm1hdHRlZC4gVGhlIGxvbmcgdGltZW91dCBpcyB1c2VkIGlmIHNsb3cgaXMgbm9uLXplcm8uICovCiBzdGF0aWMgaW50IHdyaXRlX21vZGVfcGFnZShzdHJ1Y3Qgc2NzaV90YXBlICpTVHAsIGludCBwYWdlLCBpbnQgc2xvdykKIHsKLQlpbnQgcGdvLCB0aW1lb3V0LCByZXQgPSAwOworCWludCBwZ287CiAJdW5zaWduZWQgY2hhciBjbWRbTUFYX0NPTU1BTkRfU0laRV07CiAJc3RydWN0IHN0X3JlcXVlc3QgKlNScG50OworCWludCB0aW1lb3V0OwogCiAJbWVtc2V0KGNtZCwgMCwgTUFYX0NPTU1BTkRfU0laRSk7CiAJY21kWzBdID0gTU9ERV9TRUxFQ1Q7CkBAIC0yNDE1LDIxICsyNDEyLDE2IEBACiAJKFNUcC0+YnVmZmVyKS0+Yl9kYXRhW01IX09GRl9ERVZfU1BFQ0lGSUNdICY9IH5NSF9CSVRfV1A7CiAJKFNUcC0+YnVmZmVyKS0+Yl9kYXRhW3BnbyArIE1QX09GRl9QQUdFX05CUl0gJj0gTVBfTVNLX1BBR0VfTkJSOwogCi0JU1JwbnQgPSBzdF9hbGxvY2F0ZV9yZXF1ZXN0KFNUcCk7Ci0JaWYgKCFTUnBudCkKLQkJcmV0dXJuIHJldDsKLQotCXRpbWVvdXQgPSBzbG93ID8gU1RwLT5sb25nX3RpbWVvdXQgOgotCQlTVHAtPmRldmljZS0+cmVxdWVzdF9xdWV1ZS0+cnFfdGltZW91dDsKLQotCXJldCA9IHN0X3Njc2lfa2Vybl9leGVjdXRlKFNScG50LCBjbWQsIERNQV9UT19ERVZJQ0UsCi0JCQkJICAgU1RwLT5idWZmZXItPmJfZGF0YSwgY21kWzRdLCB0aW1lb3V0LCAwKTsKLQlpZiAoIXJldCkKLQkJcmV0ID0gU1RwLT5idWZmZXItPnN5c2NhbGxfcmVzdWx0OworCXRpbWVvdXQgPSBzbG93ID8KKwkJU1RwLT5sb25nX3RpbWVvdXQgOiBTVHAtPmRldmljZS0+cmVxdWVzdF9xdWV1ZS0+cnFfdGltZW91dDsKKwlTUnBudCA9IHN0X2RvX3Njc2koTlVMTCwgU1RwLCBjbWQsIGNtZFs0XSwgRE1BX1RPX0RFVklDRSwKKwkJCSAgIHRpbWVvdXQsIDAsIDEpOworCWlmIChTUnBudCA9PSBOVUxMKQorCQlyZXR1cm4gKFNUcC0+YnVmZmVyKS0+c3lzY2FsbF9yZXN1bHQ7CiAKIAlzdF9yZWxlYXNlX3JlcXVlc3QoU1JwbnQpOwogCi0JcmV0dXJuIHJldDsKKwlyZXR1cm4gU1RwLT5idWZmZXItPnN5c2NhbGxfcmVzdWx0OwogfQogCiAKQEAgLTI1NDcsMTYgKzI1MzksMTMgQEAKIAkJcHJpbnRrKFNUX0RFQl9NU0cgIiVzOiBMb2FkaW5nIHRhcGUuXG4iLCBuYW1lKTsKIAkJKTsKIAotCVNScG50ID0gc3RfYWxsb2NhdGVfcmVxdWVzdChTVHApOworCVNScG50ID0gc3RfZG9fc2NzaShOVUxMLCBTVHAsIGNtZCwgMCwgRE1BX05PTkUsCisJCQkgICB0aW1lb3V0LCBNQVhfUkVUUklFUywgMSk7CiAJaWYgKCFTUnBudCkKLQkJcmV0dXJuIFNUcC0+YnVmZmVyLT5zeXNjYWxsX3Jlc3VsdDsKLQotCXJldHZhbCA9IHN0X3Njc2lfa2Vybl9leGVjdXRlKFNScG50LCBjbWQsIERNQV9OT05FLCBOVUxMLCAwLCB0aW1lb3V0LAotCQkJCSAgICAgIE1BWF9SRVRSSUVTKTsKLQlpZiAocmV0dmFsKQotCQlnb3RvIG91dDsKKwkJcmV0dXJuIChTVHAtPmJ1ZmZlciktPnN5c2NhbGxfcmVzdWx0OwogCiAJcmV0dmFsID0gKFNUcC0+YnVmZmVyKS0+c3lzY2FsbF9yZXN1bHQ7CisJc3RfcmVsZWFzZV9yZXF1ZXN0KFNScG50KTsKIAogCWlmICghcmV0dmFsKSB7CS8qIFNDU0kgY29tbWFuZCBzdWNjZXNzZnVsICovCiAKQEAgLTI1NzUsOCArMjU2NCw2IEBACiAJCVNUcHMgPSAmKFNUcC0+cHNbU1RwLT5wYXJ0aXRpb25dKTsKIAkJU1Rwcy0+ZHJ2X2ZpbGUgPSBTVHBzLT5kcnZfYmxvY2sgPSAoLTEpOwogCX0KLW91dDoKLQlzdF9yZWxlYXNlX3JlcXVlc3QoU1JwbnQpOwogCiAJcmV0dXJuIHJldHZhbDsKIH0KQEAgLTI4NTIsMTUgKzI4MzksMTIgQEAKIAkJcmV0dXJuICgtRU5PU1lTKTsKIAl9CiAKLQlTUnBudCA9IHN0X2FsbG9jYXRlX3JlcXVlc3QoU1RwKTsKKwlTUnBudCA9IHN0X2RvX3Njc2koTlVMTCwgU1RwLCBjbWQsIGRhdGFsZW4sIGRpcmVjdGlvbiwKKwkJCSAgIHRpbWVvdXQsIE1BWF9SRVRSSUVTLCAxKTsKIAlpZiAoIVNScG50KQogCQlyZXR1cm4gKFNUcC0+YnVmZmVyKS0+c3lzY2FsbF9yZXN1bHQ7CiAKLQlpb2N0bF9yZXN1bHQgPSBzdF9zY3NpX2tlcm5fZXhlY3V0ZShTUnBudCwgY21kLCBkaXJlY3Rpb24sCi0JCQkJCSAgICBTVHAtPmJ1ZmZlci0+Yl9kYXRhLCBkYXRhbGVuLAotCQkJCQkgICAgdGltZW91dCwgTUFYX1JFVFJJRVMpOwotCWlmICghaW9jdGxfcmVzdWx0KQotCQlpb2N0bF9yZXN1bHQgPSAoU1RwLT5idWZmZXIpLT5zeXNjYWxsX3Jlc3VsdDsKKwlpb2N0bF9yZXN1bHQgPSAoU1RwLT5idWZmZXIpLT5zeXNjYWxsX3Jlc3VsdDsKIAogCWlmICghaW9jdGxfcmVzdWx0KSB7CS8qIFNDU0kgY29tbWFuZCBzdWNjZXNzZnVsICovCiAJCXN0X3JlbGVhc2VfcmVxdWVzdChTUnBudCk7CkBAIC0zMDIyLDE3ICszMDA2LDExIEBACiAJCWlmICghbG9naWNhbCAmJiAhU1RwLT5zY3NpMl9sb2dpY2FsKQogCQkJc2NtZFsxXSA9IDE7CiAJfQotCi0JU1JwbnQgPSBzdF9hbGxvY2F0ZV9yZXF1ZXN0KFNUcCk7CisJU1JwbnQgPSBzdF9kb19zY3NpKE5VTEwsIFNUcCwgc2NtZCwgMjAsIERNQV9GUk9NX0RFVklDRSwKKwkJCSAgIFNUcC0+ZGV2aWNlLT5yZXF1ZXN0X3F1ZXVlLT5ycV90aW1lb3V0LAorCQkJICAgTUFYX1JFQURZX1JFVFJJRVMsIDEpOwogCWlmICghU1JwbnQpCi0JCXJldHVybiBTVHAtPmJ1ZmZlci0+c3lzY2FsbF9yZXN1bHQ7Ci0KLQlyZXN1bHQgPSBzdF9zY3NpX2tlcm5fZXhlY3V0ZShTUnBudCwgc2NtZCwgRE1BX0ZST01fREVWSUNFLAotCQkJCSAgICAgIFNUcC0+YnVmZmVyLT5iX2RhdGEsIDIwLAotCQkJCSAgICAgIFNUcC0+ZGV2aWNlLT5yZXF1ZXN0X3F1ZXVlLT5ycV90aW1lb3V0LAotCQkJCSAgICAgIE1BWF9SRUFEWV9SRVRSSUVTKTsKLQlpZiAocmVzdWx0KQotCQlnb3RvIG91dDsKKwkJcmV0dXJuIChTVHAtPmJ1ZmZlciktPnN5c2NhbGxfcmVzdWx0OwogCiAJaWYgKChTVHAtPmJ1ZmZlciktPnN5c2NhbGxfcmVzdWx0ICE9IDAgfHwKIAkgICAgKFNUcC0+ZGV2aWNlLT5zY3NpX2xldmVsID49IFNDU0lfMiAmJgpAQCAtMzA2MCw3ICszMDM4LDYgQEAKICAgICAgICAgICAgICAgICBERUJDKHByaW50ayhTVF9ERUJfTVNHICIlczogR290IHRhcGUgcG9zLiBibGsgJWQgcGFydCAlZC5cbiIsIG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJsb2NrLCAqcGFydGl0aW9uKSk7CiAJfQotb3V0OgogCXN0X3JlbGVhc2VfcmVxdWVzdChTUnBudCk7CiAJU1JwbnQgPSBOVUxMOwogCkBAIC0zMTM1LDE0ICszMTEyLDEwIEBACiAJCXRpbWVvdXQgPSBTVHAtPmRldmljZS0+cmVxdWVzdF9xdWV1ZS0+cnFfdGltZW91dDsKIAl9CiAKLQlTUnBudCA9IHN0X2FsbG9jYXRlX3JlcXVlc3QoU1RwKTsKKwlTUnBudCA9IHN0X2RvX3Njc2koTlVMTCwgU1RwLCBzY21kLCAwLCBETUFfTk9ORSwKKwkJCSAgIHRpbWVvdXQsIE1BWF9SRUFEWV9SRVRSSUVTLCAxKTsKIAlpZiAoIVNScG50KQotCQlyZXR1cm4gU1RwLT5idWZmZXItPnN5c2NhbGxfcmVzdWx0OwotCi0JcmVzdWx0ID0gc3Rfc2NzaV9rZXJuX2V4ZWN1dGUoU1JwbnQsIHNjbWQsIERNQV9OT05FLCBOVUxMLCAwLAotCQkJCSAgICAgIHRpbWVvdXQsIE1BWF9SRUFEWV9SRVRSSUVTKTsKLQlpZiAocmVzdWx0KQotCQlnb3RvIG91dDsKKwkJcmV0dXJuIChTVHAtPmJ1ZmZlciktPnN5c2NhbGxfcmVzdWx0OwogCiAJU1Rwcy0+ZHJ2X2Jsb2NrID0gU1Rwcy0+ZHJ2X2ZpbGUgPSAoLTEpOwogCVNUcHMtPmVvZiA9IFNUX05PRU9GOwpAQCAtMzE2Nyw3ICszMTQwLDcgQEAKIAkJCVNUcHMtPmRydl9ibG9jayA9IFNUcHMtPmRydl9maWxlID0gMDsKIAkJcmVzdWx0ID0gMDsKIAl9Ci1vdXQ6CisKIAlzdF9yZWxlYXNlX3JlcXVlc3QoU1JwbnQpOwogCVNScG50ID0gTlVMTDsKIApAQCAtMzY5NiwzOCArMzY2OSwzNCBAQAogCiAvKiBUcnkgdG8gYWxsb2NhdGUgYSBuZXcgdGFwZSBidWZmZXIuIENhbGxpbmcgZnVuY3Rpb24gbXVzdCBub3QgaG9sZAogICAgZGV2X2Fycl9sb2NrLiAqLwotc3RhdGljIHN0cnVjdCBzdF9idWZmZXIgKgotIG5ld190YXBlX2J1ZmZlcihpbnQgZnJvbV9pbml0aWFsaXphdGlvbiwgaW50IG5lZWRfZG1hLCBpbnQgbWF4X3NnKQorc3RhdGljIHN0cnVjdCBzdF9idWZmZXIgKm5ld190YXBlX2J1ZmZlcihpbnQgbmVlZF9kbWEsIGludCBtYXhfc2cpCiB7Ci0JaW50IGksIGdvdCA9IDA7Ci0JZ2ZwX3QgcHJpb3JpdHk7CiAJc3RydWN0IHN0X2J1ZmZlciAqdGI7CiAKLQlpZiAoZnJvbV9pbml0aWFsaXphdGlvbikKLQkJcHJpb3JpdHkgPSBHRlBfQVRPTUlDOwotCWVsc2UKLQkJcHJpb3JpdHkgPSBHRlBfS0VSTkVMOwotCi0JaSA9IHNpemVvZihzdHJ1Y3Qgc3RfYnVmZmVyKSArIChtYXhfc2cgLSAxKSAqIHNpemVvZihzdHJ1Y3Qgc2NhdHRlcmxpc3QpICsKLQkJbWF4X3NnICogc2l6ZW9mKHN0cnVjdCBzdF9idWZfZnJhZ21lbnQpOwotCXRiID0ga3phbGxvYyhpLCBwcmlvcml0eSk7CisJdGIgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgc3RfYnVmZmVyKSwgR0ZQX0FUT01JQyk7CiAJaWYgKCF0YikgewogCQlwcmludGsoS0VSTl9OT1RJQ0UgInN0OiBDYW4ndCBhbGxvY2F0ZSBuZXcgdGFwZSBidWZmZXIuXG4iKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQotCXRiLT5mcnBfc2VncyA9IHRiLT5vcmlnX2ZycF9zZWdzID0gMDsKKwl0Yi0+ZnJwX3NlZ3MgPSAwOwogCXRiLT51c2Vfc2cgPSBtYXhfc2c7Ci0JdGItPmZycCA9IChzdHJ1Y3Qgc3RfYnVmX2ZyYWdtZW50ICopKCYodGItPnNnWzBdKSArIG1heF9zZyk7Ci0KIAl0Yi0+ZG1hID0gbmVlZF9kbWE7Ci0JdGItPmJ1ZmZlcl9zaXplID0gZ290OwotCXNnX2luaXRfdGFibGUodGItPnNnLCBtYXhfc2cpOworCXRiLT5idWZmZXJfc2l6ZSA9IDA7CisKKwl0Yi0+cmVzZXJ2ZWRfcGFnZXMgPSBremFsbG9jKG1heF9zZyAqIHNpemVvZihzdHJ1Y3QgcGFnZSAqKSwKKwkJCQkgICAgIEdGUF9BVE9NSUMpOworCWlmICghdGItPnJlc2VydmVkX3BhZ2VzKSB7CisJCWtmcmVlKHRiKTsKKwkJcmV0dXJuIE5VTEw7CisJfQogCiAJcmV0dXJuIHRiOwogfQogCiAKIC8qIFRyeSB0byBhbGxvY2F0ZSBlbm91Z2ggc3BhY2UgaW4gdGhlIHRhcGUgYnVmZmVyICovCisjZGVmaW5lIFNUX01BWF9PUkRFUiA2CisKIHN0YXRpYyBpbnQgZW5sYXJnZV9idWZmZXIoc3RydWN0IHN0X2J1ZmZlciAqIFNUYnVmZmVyLCBpbnQgbmV3X3NpemUsIGludCBuZWVkX2RtYSkKIHsKIAlpbnQgc2VncywgbmJyLCBtYXhfc2VncywgYl9zaXplLCBvcmRlciwgZ290OwpAQCAtMzc0NywzMyArMzcxNiw0NSBAQAogCXByaW9yaXR5ID0gR0ZQX0tFUk5FTCB8IF9fR0ZQX05PV0FSTjsKIAlpZiAobmVlZF9kbWEpCiAJCXByaW9yaXR5IHw9IEdGUF9ETUE7Ci0JZm9yIChiX3NpemUgPSBQQUdFX1NJWkUsIG9yZGVyPTA7IG9yZGVyIDw9IDYgJiYKLQkgICAgIGJfc2l6ZSA8IG5ld19zaXplIC0gU1RidWZmZXItPmJ1ZmZlcl9zaXplOwotCSAgICAgb3JkZXIrKywgYl9zaXplICo9IDIpCi0JCTsgIC8qIGVtcHR5ICovCisKKwlpZiAoU1RidWZmZXItPmNsZWFyZWQpCisJCXByaW9yaXR5IHw9IF9fR0ZQX1pFUk87CisKKwlpZiAoU1RidWZmZXItPmZycF9zZWdzKSB7CisJCW9yZGVyID0gU1RidWZmZXItPm1hcF9kYXRhLnBhZ2Vfb3JkZXI7CisJCWJfc2l6ZSA9IFBBR0VfU0laRSA8PCBvcmRlcjsKKwl9IGVsc2UgeworCQlmb3IgKGJfc2l6ZSA9IFBBR0VfU0laRSwgb3JkZXIgPSAwOworCQkgICAgIG9yZGVyIDwgU1RfTUFYX09SREVSICYmIGJfc2l6ZSA8IG5ld19zaXplOworCQkgICAgIG9yZGVyKyssIGJfc2l6ZSAqPSAyKQorCQkJOyAgLyogZW1wdHkgKi8KKwl9CisJaWYgKG1heF9zZWdzICogKFBBR0VfU0laRSA8PCBvcmRlcikgPCBuZXdfc2l6ZSkgeworCQlpZiAob3JkZXIgPT0gU1RfTUFYX09SREVSKQorCQkJcmV0dXJuIDA7CisJCW5vcm1hbGl6ZV9idWZmZXIoU1RidWZmZXIpOworCQlyZXR1cm4gZW5sYXJnZV9idWZmZXIoU1RidWZmZXIsIG5ld19zaXplLCBuZWVkX2RtYSk7CisJfQogCiAJZm9yIChzZWdzID0gU1RidWZmZXItPmZycF9zZWdzLCBnb3QgPSBTVGJ1ZmZlci0+YnVmZmVyX3NpemU7CiAJICAgICBzZWdzIDwgbWF4X3NlZ3MgJiYgZ290IDwgbmV3X3NpemU7KSB7Ci0JCVNUYnVmZmVyLT5mcnBbc2Vnc10ucGFnZSA9IGFsbG9jX3BhZ2VzKHByaW9yaXR5LCBvcmRlcik7Ci0JCWlmIChTVGJ1ZmZlci0+ZnJwW3NlZ3NdLnBhZ2UgPT0gTlVMTCkgewotCQkJaWYgKG5ld19zaXplIC0gZ290IDw9IChtYXhfc2VncyAtIHNlZ3MpICogYl9zaXplIC8gMikgewotCQkJCWJfc2l6ZSAvPSAyOyAvKiBMYXJnZSBlbm91Z2ggZm9yIHRoZSByZXN0IG9mIHRoZSBidWZmZXJzICovCi0JCQkJb3JkZXItLTsKLQkJCQljb250aW51ZTsKLQkJCX0KKwkJc3RydWN0IHBhZ2UgKnBhZ2U7CisKKwkJcGFnZSA9IGFsbG9jX3BhZ2VzKHByaW9yaXR5LCBvcmRlcik7CisJCWlmICghcGFnZSkgewogCQkJREVCKFNUYnVmZmVyLT5idWZmZXJfc2l6ZSA9IGdvdCk7CiAJCQlub3JtYWxpemVfYnVmZmVyKFNUYnVmZmVyKTsKIAkJCXJldHVybiAwOwogCQl9Ci0JCVNUYnVmZmVyLT5mcnBbc2Vnc10ubGVuZ3RoID0gYl9zaXplOworCiAJCVNUYnVmZmVyLT5mcnBfc2VncyArPSAxOwogCQlnb3QgKz0gYl9zaXplOwogCQlTVGJ1ZmZlci0+YnVmZmVyX3NpemUgPSBnb3Q7Ci0JCWlmIChTVGJ1ZmZlci0+Y2xlYXJlZCkKLQkJCW1lbXNldChwYWdlX2FkZHJlc3MoU1RidWZmZXItPmZycFtzZWdzXS5wYWdlKSwgMCwgYl9zaXplKTsKKwkJU1RidWZmZXItPnJlc2VydmVkX3BhZ2VzW3NlZ3NdID0gcGFnZTsKIAkJc2VncysrOwogCX0KLQlTVGJ1ZmZlci0+Yl9kYXRhID0gcGFnZV9hZGRyZXNzKFNUYnVmZmVyLT5mcnBbMF0ucGFnZSk7CisJU1RidWZmZXItPmJfZGF0YSA9IHBhZ2VfYWRkcmVzcyhTVGJ1ZmZlci0+cmVzZXJ2ZWRfcGFnZXNbMF0pOworCVNUYnVmZmVyLT5tYXBfZGF0YS5wYWdlX29yZGVyID0gb3JkZXI7CiAKIAlyZXR1cm4gMTsKIH0KQEAgLTM3ODUsNyArMzc2Niw4IEBACiAJaW50IGk7CiAKIAlmb3IgKGk9MDsgaSA8IHN0X2JwLT5mcnBfc2VnczsgaSsrKQotCQltZW1zZXQocGFnZV9hZGRyZXNzKHN0X2JwLT5mcnBbaV0ucGFnZSksIDAsIHN0X2JwLT5mcnBbaV0ubGVuZ3RoKTsKKwkJbWVtc2V0KHBhZ2VfYWRkcmVzcyhzdF9icC0+cmVzZXJ2ZWRfcGFnZXNbaV0pLCAwLAorCQkgICAgICAgUEFHRV9TSVpFIDw8IHN0X2JwLT5tYXBfZGF0YS5wYWdlX29yZGVyKTsKIAlzdF9icC0+Y2xlYXJlZCA9IDE7CiB9CiAKQEAgLTM3OTMsMTYgKzM3NzUsMTYgQEAKIC8qIFJlbGVhc2UgdGhlIGV4dHJhIGJ1ZmZlciAqLwogc3RhdGljIHZvaWQgbm9ybWFsaXplX2J1ZmZlcihzdHJ1Y3Qgc3RfYnVmZmVyICogU1RidWZmZXIpCiB7Ci0JaW50IGksIG9yZGVyOworCWludCBpLCBvcmRlciA9IFNUYnVmZmVyLT5tYXBfZGF0YS5wYWdlX29yZGVyOwogCi0JZm9yIChpID0gU1RidWZmZXItPm9yaWdfZnJwX3NlZ3M7IGkgPCBTVGJ1ZmZlci0+ZnJwX3NlZ3M7IGkrKykgewotCQlvcmRlciA9IGdldF9vcmRlcihTVGJ1ZmZlci0+ZnJwW2ldLmxlbmd0aCk7Ci0JCV9fZnJlZV9wYWdlcyhTVGJ1ZmZlci0+ZnJwW2ldLnBhZ2UsIG9yZGVyKTsKLQkJU1RidWZmZXItPmJ1ZmZlcl9zaXplIC09IFNUYnVmZmVyLT5mcnBbaV0ubGVuZ3RoOworCWZvciAoaSA9IDA7IGkgPCBTVGJ1ZmZlci0+ZnJwX3NlZ3M7IGkrKykgeworCQlfX2ZyZWVfcGFnZXMoU1RidWZmZXItPnJlc2VydmVkX3BhZ2VzW2ldLCBvcmRlcik7CisJCVNUYnVmZmVyLT5idWZmZXJfc2l6ZSAtPSAoUEFHRV9TSVpFIDw8IG9yZGVyKTsKIAl9Ci0JU1RidWZmZXItPmZycF9zZWdzID0gU1RidWZmZXItPm9yaWdfZnJwX3NlZ3M7Ci0JU1RidWZmZXItPmZycF9zZ19jdXJyZW50ID0gMDsKKwlTVGJ1ZmZlci0+ZnJwX3NlZ3MgPSAwOwogCVNUYnVmZmVyLT5zZ19zZWdzID0gMDsKKwlTVGJ1ZmZlci0+bWFwX2RhdGEucGFnZV9vcmRlciA9IDA7CisJU1RidWZmZXItPm1hcF9kYXRhLm9mZnNldCA9IDA7CiB9CiAKIApAQCAtMzgxMSwxOCArMzc5MywxOSBAQAogc3RhdGljIGludCBhcHBlbmRfdG9fYnVmZmVyKGNvbnN0IGNoYXIgX191c2VyICp1YnAsIHN0cnVjdCBzdF9idWZmZXIgKiBzdF9icCwgaW50IGRvX2NvdW50KQogewogCWludCBpLCBjbnQsIHJlcywgb2Zmc2V0OworCWludCBsZW5ndGggPSBQQUdFX1NJWkUgPDwgc3RfYnAtPm1hcF9kYXRhLnBhZ2Vfb3JkZXI7CiAKIAlmb3IgKGkgPSAwLCBvZmZzZXQgPSBzdF9icC0+YnVmZmVyX2J5dGVzOwotCSAgICAgaSA8IHN0X2JwLT5mcnBfc2VncyAmJiBvZmZzZXQgPj0gc3RfYnAtPmZycFtpXS5sZW5ndGg7IGkrKykKLQkJb2Zmc2V0IC09IHN0X2JwLT5mcnBbaV0ubGVuZ3RoOworCSAgICAgaSA8IHN0X2JwLT5mcnBfc2VncyAmJiBvZmZzZXQgPj0gbGVuZ3RoOyBpKyspCisJCW9mZnNldCAtPSBsZW5ndGg7CiAJaWYgKGkgPT0gc3RfYnAtPmZycF9zZWdzKSB7CS8qIFNob3VsZCBuZXZlciBoYXBwZW4gKi8KIAkJcHJpbnRrKEtFUk5fV0FSTklORyAic3Q6IGFwcGVuZF90b19idWZmZXIgb2Zmc2V0IG92ZXJmbG93LlxuIik7CiAJCXJldHVybiAoLUVJTyk7CiAJfQogCWZvciAoOyBpIDwgc3RfYnAtPmZycF9zZWdzICYmIGRvX2NvdW50ID4gMDsgaSsrKSB7Ci0JCWNudCA9IHN0X2JwLT5mcnBbaV0ubGVuZ3RoIC0gb2Zmc2V0IDwgZG9fY291bnQgPwotCQkgICAgc3RfYnAtPmZycFtpXS5sZW5ndGggLSBvZmZzZXQgOiBkb19jb3VudDsKLQkJcmVzID0gY29weV9mcm9tX3VzZXIocGFnZV9hZGRyZXNzKHN0X2JwLT5mcnBbaV0ucGFnZSkgKyBvZmZzZXQsIHVicCwgY250KTsKKwkJc3RydWN0IHBhZ2UgKnBhZ2UgPSBzdF9icC0+cmVzZXJ2ZWRfcGFnZXNbaV07CisJCWNudCA9IGxlbmd0aCAtIG9mZnNldCA8IGRvX2NvdW50ID8gbGVuZ3RoIC0gb2Zmc2V0IDogZG9fY291bnQ7CisJCXJlcyA9IGNvcHlfZnJvbV91c2VyKHBhZ2VfYWRkcmVzcyhwYWdlKSArIG9mZnNldCwgdWJwLCBjbnQpOwogCQlpZiAocmVzKQogCQkJcmV0dXJuICgtRUZBVUxUKTsKIAkJZG9fY291bnQgLT0gY250OwpAQCAtMzg0MiwxOCArMzgyNSwxOSBAQAogc3RhdGljIGludCBmcm9tX2J1ZmZlcihzdHJ1Y3Qgc3RfYnVmZmVyICogc3RfYnAsIGNoYXIgX191c2VyICp1YnAsIGludCBkb19jb3VudCkKIHsKIAlpbnQgaSwgY250LCByZXMsIG9mZnNldDsKKwlpbnQgbGVuZ3RoID0gUEFHRV9TSVpFIDw8IHN0X2JwLT5tYXBfZGF0YS5wYWdlX29yZGVyOwogCiAJZm9yIChpID0gMCwgb2Zmc2V0ID0gc3RfYnAtPnJlYWRfcG9pbnRlcjsKLQkgICAgIGkgPCBzdF9icC0+ZnJwX3NlZ3MgJiYgb2Zmc2V0ID49IHN0X2JwLT5mcnBbaV0ubGVuZ3RoOyBpKyspCi0JCW9mZnNldCAtPSBzdF9icC0+ZnJwW2ldLmxlbmd0aDsKKwkgICAgIGkgPCBzdF9icC0+ZnJwX3NlZ3MgJiYgb2Zmc2V0ID49IGxlbmd0aDsgaSsrKQorCQlvZmZzZXQgLT0gbGVuZ3RoOwogCWlmIChpID09IHN0X2JwLT5mcnBfc2VncykgewkvKiBTaG91bGQgbmV2ZXIgaGFwcGVuICovCiAJCXByaW50ayhLRVJOX1dBUk5JTkcgInN0OiBmcm9tX2J1ZmZlciBvZmZzZXQgb3ZlcmZsb3cuXG4iKTsKIAkJcmV0dXJuICgtRUlPKTsKIAl9CiAJZm9yICg7IGkgPCBzdF9icC0+ZnJwX3NlZ3MgJiYgZG9fY291bnQgPiAwOyBpKyspIHsKLQkJY250ID0gc3RfYnAtPmZycFtpXS5sZW5ndGggLSBvZmZzZXQgPCBkb19jb3VudCA/Ci0JCSAgICBzdF9icC0+ZnJwW2ldLmxlbmd0aCAtIG9mZnNldCA6IGRvX2NvdW50OwotCQlyZXMgPSBjb3B5X3RvX3VzZXIodWJwLCBwYWdlX2FkZHJlc3Moc3RfYnAtPmZycFtpXS5wYWdlKSArIG9mZnNldCwgY250KTsKKwkJc3RydWN0IHBhZ2UgKnBhZ2UgPSBzdF9icC0+cmVzZXJ2ZWRfcGFnZXNbaV07CisJCWNudCA9IGxlbmd0aCAtIG9mZnNldCA8IGRvX2NvdW50ID8gbGVuZ3RoIC0gb2Zmc2V0IDogZG9fY291bnQ7CisJCXJlcyA9IGNvcHlfdG9fdXNlcih1YnAsIHBhZ2VfYWRkcmVzcyhwYWdlKSArIG9mZnNldCwgY250KTsKIAkJaWYgKHJlcykKIAkJCXJldHVybiAoLUVGQVVMVCk7CiAJCWRvX2NvdW50IC09IGNudDsKQEAgLTM4NzQsNiArMzg1OCw3IEBACiB7CiAJaW50IHNyY19zZWcsIGRzdF9zZWcsIHNyY19vZmZzZXQgPSAwLCBkc3Rfb2Zmc2V0OwogCWludCBjb3VudCwgdG90YWw7CisJaW50IGxlbmd0aCA9IFBBR0VfU0laRSA8PCBzdF9icC0+bWFwX2RhdGEucGFnZV9vcmRlcjsKIAogCWlmIChvZmZzZXQgPT0gMCkKIAkJcmV0dXJuOwpAQCAtMzg4MSwyNCArMzg2NiwyNiBAQAogCXRvdGFsPXN0X2JwLT5idWZmZXJfYnl0ZXMgLSBvZmZzZXQ7CiAJZm9yIChzcmNfc2VnPTA7IHNyY19zZWcgPCBzdF9icC0+ZnJwX3NlZ3M7IHNyY19zZWcrKykgewogCQlzcmNfb2Zmc2V0ID0gb2Zmc2V0OwotCQlpZiAoc3JjX29mZnNldCA8IHN0X2JwLT5mcnBbc3JjX3NlZ10ubGVuZ3RoKQorCQlpZiAoc3JjX29mZnNldCA8IGxlbmd0aCkKIAkJCWJyZWFrOwotCQlvZmZzZXQgLT0gc3RfYnAtPmZycFtzcmNfc2VnXS5sZW5ndGg7CisJCW9mZnNldCAtPSBsZW5ndGg7CiAJfQogCiAJc3RfYnAtPmJ1ZmZlcl9ieXRlcyA9IHN0X2JwLT5yZWFkX3BvaW50ZXIgPSB0b3RhbDsKIAlmb3IgKGRzdF9zZWc9ZHN0X29mZnNldD0wOyB0b3RhbCA+IDA7ICkgewotCQljb3VudCA9IG1pbihzdF9icC0+ZnJwW2RzdF9zZWddLmxlbmd0aCAtIGRzdF9vZmZzZXQsCi0JCQkgICAgc3RfYnAtPmZycFtzcmNfc2VnXS5sZW5ndGggLSBzcmNfb2Zmc2V0KTsKLQkJbWVtbW92ZShwYWdlX2FkZHJlc3Moc3RfYnAtPmZycFtkc3Rfc2VnXS5wYWdlKSArIGRzdF9vZmZzZXQsCi0JCQlwYWdlX2FkZHJlc3Moc3RfYnAtPmZycFtzcmNfc2VnXS5wYWdlKSArIHNyY19vZmZzZXQsIGNvdW50KTsKKwkJc3RydWN0IHBhZ2UgKmRwYWdlID0gc3RfYnAtPnJlc2VydmVkX3BhZ2VzW2RzdF9zZWddOworCQlzdHJ1Y3QgcGFnZSAqc3BhZ2UgPSBzdF9icC0+cmVzZXJ2ZWRfcGFnZXNbc3JjX3NlZ107CisKKwkJY291bnQgPSBtaW4obGVuZ3RoIC0gZHN0X29mZnNldCwgbGVuZ3RoIC0gc3JjX29mZnNldCk7CisJCW1lbW1vdmUocGFnZV9hZGRyZXNzKGRwYWdlKSArIGRzdF9vZmZzZXQsCisJCQlwYWdlX2FkZHJlc3Moc3BhZ2UpICsgc3JjX29mZnNldCwgY291bnQpOwogCQlzcmNfb2Zmc2V0ICs9IGNvdW50OwotCQlpZiAoc3JjX29mZnNldCA+PSBzdF9icC0+ZnJwW3NyY19zZWddLmxlbmd0aCkgeworCQlpZiAoc3JjX29mZnNldCA+PSBsZW5ndGgpIHsKIAkJCXNyY19zZWcrKzsKIAkJCXNyY19vZmZzZXQgPSAwOwogCQl9CiAJCWRzdF9vZmZzZXQgKz0gY291bnQ7Ci0JCWlmIChkc3Rfb2Zmc2V0ID49IHN0X2JwLT5mcnBbZHN0X3NlZ10ubGVuZ3RoKSB7CisJCWlmIChkc3Rfb2Zmc2V0ID49IGxlbmd0aCkgewogCQkJZHN0X3NlZysrOwogCQkJZHN0X29mZnNldCA9IDA7CiAJCX0KQEAgLTM5MDYsMzIgKzM4OTMsNiBAQAogCX0KIH0KIAotCi0vKiBGaWxsIHRoZSBzL2cgbGlzdCB1cCB0byB0aGUgbGVuZ3RoIHJlcXVpcmVkIGZvciB0aGlzIHRyYW5zZmVyICovCi1zdGF0aWMgdm9pZCBidWZfdG9fc2coc3RydWN0IHN0X2J1ZmZlciAqU1RicCwgdW5zaWduZWQgaW50IGxlbmd0aCkKLXsKLQlpbnQgaTsKLQl1bnNpZ25lZCBpbnQgY291bnQ7Ci0Jc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsKLQlzdHJ1Y3Qgc3RfYnVmX2ZyYWdtZW50ICpmcnA7Ci0KLQlpZiAobGVuZ3RoID09IFNUYnAtPmZycF9zZ19jdXJyZW50KQotCQlyZXR1cm47ICAgLyogd29yayBhbHJlYWR5IGRvbmUgKi8KLQotCXNnID0gJihTVGJwLT5zZ1swXSk7Ci0JZnJwID0gU1RicC0+ZnJwOwotCWZvciAoaT1jb3VudD0wOyBjb3VudCA8IGxlbmd0aDsgaSsrKSB7Ci0JCWlmIChsZW5ndGggLSBjb3VudCA+IGZycFtpXS5sZW5ndGgpCi0JCQlzZ19zZXRfcGFnZSgmc2dbaV0sIGZycFtpXS5wYWdlLCBmcnBbaV0ubGVuZ3RoLCAwKTsKLQkJZWxzZQotCQkJc2dfc2V0X3BhZ2UoJnNnW2ldLCBmcnBbaV0ucGFnZSwgbGVuZ3RoIC0gY291bnQsIDApOwotCQljb3VudCArPSBzZ1tpXS5sZW5ndGg7Ci0JfQotCVNUYnAtPnNnX3NlZ3MgPSBpOwotCVNUYnAtPmZycF9zZ19jdXJyZW50ID0gbGVuZ3RoOwotfQotCi0KIC8qIFZhbGlkYXRlIHRoZSBvcHRpb25zIGZyb20gY29tbWFuZCBsaW5lIG9yIG1vZHVsZSBwYXJhbWV0ZXJzICovCiBzdGF0aWMgdm9pZCB2YWxpZGF0ZV9vcHRpb25zKHZvaWQpCiB7CkBAIC00MDI2LDcgKzM5ODcsNyBAQAogCQlTRHAtPnJlcXVlc3RfcXVldWUtPm1heF9waHlzX3NlZ21lbnRzKTsKIAlpZiAoc3RfbWF4X3NnX3NlZ3MgPCBpKQogCQlpID0gc3RfbWF4X3NnX3NlZ3M7Ci0JYnVmZmVyID0gbmV3X3RhcGVfYnVmZmVyKDEsIChTRHAtPmhvc3QpLT51bmNoZWNrZWRfaXNhX2RtYSwgaSk7CisJYnVmZmVyID0gbmV3X3RhcGVfYnVmZmVyKChTRHAtPmhvc3QpLT51bmNoZWNrZWRfaXNhX2RtYSwgaSk7CiAJaWYgKGJ1ZmZlciA9PSBOVUxMKSB7CiAJCXByaW50ayhLRVJOX0VSUgogCQkgICAgICAgInN0OiBDYW4ndCBhbGxvY2F0ZSBuZXcgdGFwZSBidWZmZXIuIERldmljZSBub3QgYXR0YWNoZWQuXG4iKTsKQEAgLTQyODAsOCArNDI0MSw4IEBACiAJdHBudC0+ZGV2aWNlID0gTlVMTDsKIAogCWlmICh0cG50LT5idWZmZXIpIHsKLQkJdHBudC0+YnVmZmVyLT5vcmlnX2ZycF9zZWdzID0gMDsKIAkJbm9ybWFsaXplX2J1ZmZlcih0cG50LT5idWZmZXIpOworCQlrZnJlZSh0cG50LT5idWZmZXItPnJlc2VydmVkX3BhZ2VzKTsKIAkJa2ZyZWUodHBudC0+YnVmZmVyKTsKIAl9CiAKQEAgLTQ1NjcsMTQgKzQ1MjgsMTYgQEAKIH0KIAogLyogVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgbWF5IGJlIHVzZWZ1bCBmb3IgYSBsYXJnZXIgYXVkaWVuY2UuICovCi1zdGF0aWMgaW50IHNnbF9tYXBfdXNlcl9wYWdlcyhzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnbCwgY29uc3QgdW5zaWduZWQgaW50IG1heF9wYWdlcywgCi0JCQkgICAgICB1bnNpZ25lZCBsb25nIHVhZGRyLCBzaXplX3QgY291bnQsIGludCBydykKK3N0YXRpYyBpbnQgc2dsX21hcF91c2VyX3BhZ2VzKHN0cnVjdCBzdF9idWZmZXIgKlNUYnAsCisJCQkgICAgICBjb25zdCB1bnNpZ25lZCBpbnQgbWF4X3BhZ2VzLCB1bnNpZ25lZCBsb25nIHVhZGRyLAorCQkJICAgICAgc2l6ZV90IGNvdW50LCBpbnQgcncpCiB7CiAJdW5zaWduZWQgbG9uZyBlbmQgPSAodWFkZHIgKyBjb3VudCArIFBBR0VfU0laRSAtIDEpID4+IFBBR0VfU0hJRlQ7CiAJdW5zaWduZWQgbG9uZyBzdGFydCA9IHVhZGRyID4+IFBBR0VfU0hJRlQ7CiAJY29uc3QgaW50IG5yX3BhZ2VzID0gZW5kIC0gc3RhcnQ7CiAJaW50IHJlcywgaSwgajsKIAlzdHJ1Y3QgcGFnZSAqKnBhZ2VzOworCXN0cnVjdCBycV9tYXBfZGF0YSAqbWRhdGEgPSAmU1RicC0+bWFwX2RhdGE7CiAKIAkvKiBVc2VyIGF0dGVtcHRlZCBPdmVyZmxvdyEgKi8KIAlpZiAoKHVhZGRyICsgY291bnQpIDwgdWFkZHIpCkBAIC00NjE2LDI0ICs0NTc5LDExIEBACiAJCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2VzW2ldKTsKICAgICAgICAgfQogCi0JLyogUG9wdWxhdGUgdGhlIHNjYXR0ZXIvZ2F0aGVyIGxpc3QgKi8KLQlzZ19zZXRfcGFnZSgmc2dsWzBdLCBwYWdlc1swXSwgMCwgdWFkZHIgJiB+UEFHRV9NQVNLKTsKLQlpZiAobnJfcGFnZXMgPiAxKSB7Ci0JCXNnbFswXS5sZW5ndGggPSBQQUdFX1NJWkUgLSBzZ2xbMF0ub2Zmc2V0OwotCQljb3VudCAtPSBzZ2xbMF0ubGVuZ3RoOwotCQlmb3IgKGk9MTsgaSA8IG5yX3BhZ2VzIDsgaSsrKSB7Ci0JCQlzZ19zZXRfcGFnZSgmc2dsW2ldLCBwYWdlc1tpXSwKLQkJCQkgICAgY291bnQgPCBQQUdFX1NJWkUgPyBjb3VudCA6IFBBR0VfU0laRSwgMCk7OwotCQkJY291bnQgLT0gUEFHRV9TSVpFOwotCQl9Ci0JfQotCWVsc2UgewotCQlzZ2xbMF0ubGVuZ3RoID0gY291bnQ7Ci0JfQorCW1kYXRhLT5vZmZzZXQgPSB1YWRkciAmIH5QQUdFX01BU0s7CisJbWRhdGEtPnBhZ2Vfb3JkZXIgPSAwOworCVNUYnAtPm1hcHBlZF9wYWdlcyA9IHBhZ2VzOwogCi0Ja2ZyZWUocGFnZXMpOwogCXJldHVybiBucl9wYWdlczsKLQogIG91dF91bm1hcDoKIAlpZiAocmVzID4gMCkgewogCQlmb3IgKGo9MDsgaiA8IHJlczsgaisrKQpAQCAtNDY0NiwxMyArNDU5NiwxMyBAQAogCiAKIC8qIEFuZCB1bm1hcCB0aGVtLi4uICovCi1zdGF0aWMgaW50IHNnbF91bm1hcF91c2VyX3BhZ2VzKHN0cnVjdCBzY2F0dGVybGlzdCAqc2dsLCBjb25zdCB1bnNpZ25lZCBpbnQgbnJfcGFnZXMsCi0JCQkJaW50IGRpcnRpZWQpCitzdGF0aWMgaW50IHNnbF91bm1hcF91c2VyX3BhZ2VzKHN0cnVjdCBzdF9idWZmZXIgKlNUYnAsCisJCQkJY29uc3QgdW5zaWduZWQgaW50IG5yX3BhZ2VzLCBpbnQgZGlydGllZCkKIHsKIAlpbnQgaTsKIAogCWZvciAoaT0wOyBpIDwgbnJfcGFnZXM7IGkrKykgewotCQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IHNnX3BhZ2UoJnNnbFtpXSk7CisJCXN0cnVjdCBwYWdlICpwYWdlID0gU1RicC0+bWFwcGVkX3BhZ2VzW2ldOwogCiAJCWlmIChkaXJ0aWVkKQogCQkJU2V0UGFnZURpcnR5KHBhZ2UpOwpAQCAtNDY2MSw2ICs0NjExLDggQEAKIAkJICovCiAJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKIAl9CisJa2ZyZWUoU1RicC0+bWFwcGVkX3BhZ2VzKTsKKwlTVGJwLT5tYXBwZWRfcGFnZXMgPSBOVUxMOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc3QuaCBiL2RyaXZlcnMvc2NzaS9zdC5oCmluZGV4IGI5MjcxMmYuLjU0NGRjNmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zdC5oCisrKyBiL2RyaXZlcnMvc2NzaS9zdC5oCkBAIC0yOSw2ICsyOSw3IEBACiAJaW50IHJlc3VsdDsKIAlzdHJ1Y3Qgc2NzaV90YXBlICpzdHA7CiAJc3RydWN0IGNvbXBsZXRpb24gKndhaXRpbmc7CisJc3RydWN0IGJpbyAqYmlvOwogfTsKIAogLyogVGhlIHRhcGUgYnVmZmVyIGRlc2NyaXB0b3IuICovCkBAIC00NCwyMCArNDUsMTMgQEAKIAlpbnQgc3lzY2FsbF9yZXN1bHQ7CiAJc3RydWN0IHN0X3JlcXVlc3QgKmxhc3RfU1JwbnQ7CiAJc3RydWN0IHN0X2NtZHN0YXR1cyBjbWRzdGF0OworCXN0cnVjdCBwYWdlICoqcmVzZXJ2ZWRfcGFnZXM7CisJc3RydWN0IHBhZ2UgKiptYXBwZWRfcGFnZXM7CisJc3RydWN0IHJxX21hcF9kYXRhIG1hcF9kYXRhOwogCXVuc2lnbmVkIGNoYXIgKmJfZGF0YTsKIAl1bnNpZ25lZCBzaG9ydCB1c2Vfc2c7CS8qIHplcm8gb3IgbWF4IG51bWJlciBvZiBzL2cgc2VnbWVudHMgZm9yIHRoaXMgYWRhcHRlciAqLwogCXVuc2lnbmVkIHNob3J0IHNnX3NlZ3M7CQkvKiBudW1iZXIgb2Ygc2VnbWVudHMgaW4gcy9nIGxpc3QgKi8KLQl1bnNpZ25lZCBzaG9ydCBvcmlnX2ZycF9zZWdzOwkvKiBudW1iZXIgb2Ygc2VnbWVudHMgYWxsb2NhdGVkIGF0IGZpcnN0IHRyeSAqLwogCXVuc2lnbmVkIHNob3J0IGZycF9zZWdzOwkvKiBudW1iZXIgb2YgYnVmZmVyIHNlZ21lbnRzICovCi0JdW5zaWduZWQgaW50IGZycF9zZ19jdXJyZW50OwkvKiBkcml2ZXIgYnVmZmVyIGxlbmd0aCBjdXJyZW50bHkgaW4gcy9nIGxpc3QgKi8KLQlzdHJ1Y3Qgc3RfYnVmX2ZyYWdtZW50ICpmcnA7CS8qIHRoZSBhbGxvY2F0ZWQgYnVmZmVyIGZyYWdtZW50IGxpc3QgKi8KLQlzdHJ1Y3Qgc2NhdHRlcmxpc3Qgc2dbMV07CS8qIE1VU1QgQkUgbGFzdCBpdGVtICovCi19OwotCi0vKiBUaGUgdGFwZSBidWZmZXIgZnJhZ21lbnQgZGVzY3JpcHRvciAqLwotc3RydWN0IHN0X2J1Zl9mcmFnbWVudCB7Ci0Jc3RydWN0IHBhZ2UgKnBhZ2U7Ci0JdW5zaWduZWQgaW50IGxlbmd0aDsKIH07CiAKIC8qIFRoZSB0YXBlIG1vZGUgZGVmaW5pdGlvbiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3phbG9uLmMgYi9kcml2ZXJzL3Njc2kvemFsb24uYwppbmRleCAzYzRhMzAwLi5hOGQ2MWE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvemFsb24uYworKysgYi9kcml2ZXJzL3Njc2kvemFsb24uYwpAQCAtMTM3LDggKzEzNyw4IEBACiAJCWdvdG8gZmFpbDsKIAogCWlmIChyZXF1ZXN0X2lycShkZXYtPmlycSwgbmNyNTNjOHh4X2ludHIsIElSUUZfU0hBUkVELCAiemFsb24iLCBob3N0KSkgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBpcnEgcHJvYmxlbSB3aXRoICVkLCBkZXRhY2hpbmdcbiAiLAotCQkJZGV2LT5kZXYuYnVzX2lkLCBkZXYtPmlycSk7CisJICBkZXZfcHJpbnRrKEtFUk5fRVJSLCBkZXYsICJpcnEgcHJvYmxlbSB3aXRoICVkLCBkZXRhY2hpbmdcbiAiLAorCQkgICAgIGRldi0+aXJxKTsKIAkJZ290byBmYWlsOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvODI1MC5jIGIvZHJpdmVycy9zZXJpYWwvODI1MC5jCmluZGV4IGRhYTAwNTYuLjE4ODlhNjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsLzgyNTAuYworKysgYi9kcml2ZXJzL3NlcmlhbC84MjUwLmMKQEAgLTMxMjMsNyArMzEyMyw3IEBACiAJaWYgKG5yX3VhcnRzID4gVUFSVF9OUikKIAkJbnJfdWFydHMgPSBVQVJUX05SOwogCi0JcHJpbnRrKEtFUk5fSU5GTyAiU2VyaWFsOiA4MjUwLzE2NTUwIGRyaXZlciIKKwlwcmludGsoS0VSTl9JTkZPICJTZXJpYWw6IDgyNTAvMTY1NTAgZHJpdmVyLCAiCiAJCSIlZCBwb3J0cywgSVJRIHNoYXJpbmcgJXNhYmxlZFxuIiwgbnJfdWFydHMsCiAJCXNoYXJlX2lycXMgPyAiZW4iIDogImRpcyIpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC9LY29uZmlnIGIvZHJpdmVycy9zZXJpYWwvS2NvbmZpZwppbmRleCBiNjk1YWIzLi4zZTUyNWUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC9LY29uZmlnCisrKyBiL2RyaXZlcnMvc2VyaWFsL0tjb25maWcKQEAgLTQ1Nyw3ICs0NTcsNyBAQAogCiBjb25maWcgU0VSSUFMX1NBTVNVTkdfVUFSVFMKIAlpbnQKLQlkZXBlbmRzIG9uIFNFUklBTF9TQU1TVU5HCisJZGVwZW5kcyBvbiBBUk0gJiYgUExBVF9TM0MKIAlkZWZhdWx0IDIgaWYgQVJDSF9TM0MyNDAwCiAJZGVmYXVsdCA0IGlmIEFSQ0hfUzNDNjRYWCB8fCBDUFVfUzNDMjQ0MwogCWRlZmF1bHQgMwpAQCAtMTMyMCwxMyArMTMyMCwzMCBAQAogY29uZmlnIFNFUklBTF9PRl9QTEFURk9STQogCXRyaXN0YXRlICJTZXJpYWwgcG9ydCBvbiBPcGVuIEZpcm13YXJlIHBsYXRmb3JtIGJ1cyIKIAlkZXBlbmRzIG9uIFBQQ19PRgotCWRlcGVuZHMgb24gU0VSSUFMXzgyNTAKKwlkZXBlbmRzIG9uIFNFUklBTF84MjUwIHx8IFNFUklBTF9PRl9QTEFURk9STV9OV1BTRVJJQUwKIAloZWxwCiAJICBJZiB5b3UgaGF2ZSBhIFBvd2VyUEMgYmFzZWQgc3lzdGVtIHRoYXQgaGFzIHNlcmlhbCBwb3J0cwogCSAgb24gYSBwbGF0Zm9ybSBzcGVjaWZpYyBidXMsIHlvdSBzaG91bGQgZW5hYmxlIHRoaXMgb3B0aW9uLgogCSAgQ3VycmVudGx5LCBvbmx5IDgyNTAgY29tcGF0aWJsZSBwb3J0cyBhcmUgc3VwcG9ydGVkLCBidXQKIAkgIG90aGVycyBjYW4gZWFzaWx5IGJlIGFkZGVkLgogCitjb25maWcgU0VSSUFMX09GX1BMQVRGT1JNX05XUFNFUklBTAorCXRyaXN0YXRlICJOV1Agc2VyaWFsIHBvcnQgZHJpdmVyIgorCWRlcGVuZHMgb24gUFBDX09GICYmIFBQQ19EQ1IKKwlzZWxlY3QgU0VSSUFMX09GX1BMQVRGT1JNCisJc2VsZWN0IFNFUklBTF9DT1JFX0NPTlNPTEUKKwlzZWxlY3QgU0VSSUFMX0NPUkUKKwloZWxwCisJICBUaGlzIGRyaXZlciBzdXBwb3J0cyB0aGUgY2VsbCBuZXR3b3JrIHByb2Nlc3NvciBud3Agc2VyaWFsCisJICBkZXZpY2UuCisKK2NvbmZpZyBTRVJJQUxfT0ZfUExBVEZPUk1fTldQU0VSSUFMX0NPTlNPTEUKKwlib29sICJDb25zb2xlIG9uIE5XUCBzZXJpYWwgcG9ydCIKKwlkZXBlbmRzIG9uIFNFUklBTF9PRl9QTEFURk9STV9OV1BTRVJJQUw9eQorCXNlbGVjdCBTRVJJQUxfQ09SRV9DT05TT0xFCisJaGVscAorCSAgU3VwcG9ydCBmb3IgQ29uc29sZSBvbiB0aGUgTldQIHNlcmlhbCBwb3J0cy4KKwogY29uZmlnIFNFUklBTF9RRQogCXRyaXN0YXRlICJGcmVlc2NhbGUgUVVJQ0MgRW5naW5lIHNlcmlhbCBwb3J0IHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBRVUlDQ19FTkdJTkUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL01ha2VmaWxlIGIvZHJpdmVycy9zZXJpYWwvTWFrZWZpbGUKaW5kZXggZGZlNzc1YS4uODg0NGMwYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9zZXJpYWwvTWFrZWZpbGUKQEAgLTcyLDYgKzcyLDcgQEAKIG9iai0kKENPTkZJR19TRVJJQUxfVUFSVExJVEUpICs9IHVhcnRsaXRlLm8KIG9iai0kKENPTkZJR19TRVJJQUxfTkVUWCkgKz0gbmV0eC1zZXJpYWwubwogb2JqLSQoQ09ORklHX1NFUklBTF9PRl9QTEFURk9STSkgKz0gb2Zfc2VyaWFsLm8KK29iai0kKENPTkZJR19TRVJJQUxfT0ZfUExBVEZPUk1fTldQU0VSSUFMKSArPSBud3BzZXJpYWwubwogb2JqLSQoQ09ORklHX1NFUklBTF9LUzg2OTUpICs9IHNlcmlhbF9rczg2OTUubwogb2JqLSQoQ09ORklHX0tHREJfU0VSSUFMX0NPTlNPTEUpICs9IGtnZGJvYy5vCiBvYmotJChDT05GSUdfU0VSSUFMX1FFKSArPSB1Y2NfdWFydC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC9jcmlzdjEwLmMgYi9kcml2ZXJzL3NlcmlhbC9jcmlzdjEwLmMKaW5kZXggOGIyYzYxOS4uZTY0MmMyMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvY3Jpc3YxMC5jCisrKyBiL2RyaXZlcnMvc2VyaWFsL2NyaXN2MTAuYwpAQCAtMTIwMyw3ICsxMjAzLDcgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJLyogRGlzYWJsZSBvdXRwdXQgRE1BIGNoYW5uZWwgZm9yIHRoZSBzZXJpYWwgcG9ydCBpbiBxdWVzdGlvbgotCSAqICggc2V0IHRvIHNvbWV0aGluZyBvdGhlciB0aGVuIHNlcmlhbFgpCisJICogKCBzZXQgdG8gc29tZXRoaW5nIG90aGVyIHRoYW4gc2VyaWFsWCkKIAkgKi8KIAlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CiAJREZMT1coREVCVUdfTE9HKGluZm8tPmxpbmUsICJkaXNhYmxlX3R4ZG1hX2NoYW5uZWwgJWlcbiIsIGluZm8tPmxpbmUpKTsKQEAgLTEyNjYsNyArMTI2Niw3IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCS8qIERpc2FibGUgaW5wdXQgRE1BIGNoYW5uZWwgZm9yIHRoZSBzZXJpYWwgcG9ydCBpbiBxdWVzdGlvbgotCSAqICggc2V0IHRvIHNvbWV0aGluZyBvdGhlciB0aGVuIHNlcmlhbFgpCisJICogKCBzZXQgdG8gc29tZXRoaW5nIG90aGVyIHRoYW4gc2VyaWFsWCkKIAkgKi8KIAlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CiAJaWYgKGluZm8tPmxpbmUgPT0gMCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvbndwc2VyaWFsLmMgYi9kcml2ZXJzL3NlcmlhbC9ud3BzZXJpYWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMmYzZWFmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zZXJpYWwvbndwc2VyaWFsLmMKQEAgLTAsMCArMSw0NzUgQEAKKy8qCisgKiAgU2VyaWFsIFBvcnQgZHJpdmVyIGZvciBhIE5XUCB1YXJ0IGRldmljZQorICoKKyAqICAgIENvcHlyaWdodCAoQykgMjAwOCBJQk0gQ29ycC4sIEJlbmphbWluIEtyaWxsIDxiZW5AY29kaWVydC5vcmc+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICovCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbnNvbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWxfcmVnLmg+CisjaW5jbHVkZSA8bGludXgvc2VyaWFsX2NvcmUuaD4KKyNpbmNsdWRlIDxsaW51eC90dHkuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnFyZXR1cm4uaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L29mX3BsYXRmb3JtLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbndwc2VyaWFsLmg+CisjaW5jbHVkZSA8YXNtL3Byb20uaD4KKyNpbmNsdWRlIDxhc20vZGNyLmg+CisKKyNkZWZpbmUgTldQU0VSSUFMX05SICAgICAgICAgICAgICAgMgorCisjZGVmaW5lIE5XUFNFUklBTF9TVEFUVVNfUlhWQUxJRCAweDEKKyNkZWZpbmUgTldQU0VSSUFMX1NUQVRVU19UWEZVTEwgIDB4MgorCitzdHJ1Y3Qgbndwc2VyaWFsX3BvcnQgeworCXN0cnVjdCB1YXJ0X3BvcnQgcG9ydDsKKwlkY3JfaG9zdF90IGRjcl9ob3N0OworCXVuc2lnbmVkIGludCBpZXI7CisJdW5zaWduZWQgaW50IG1jcjsKK307CisKK3N0YXRpYyBERUZJTkVfTVVURVgobndwc2VyaWFsX211dGV4KTsKK3N0YXRpYyBzdHJ1Y3Qgbndwc2VyaWFsX3BvcnQgbndwc2VyaWFsX3BvcnRzW05XUFNFUklBTF9OUl07CisKK3N0YXRpYyB2b2lkIHdhaXRfZm9yX2JpdHMoc3RydWN0IG53cHNlcmlhbF9wb3J0ICp1cCwgaW50IGJpdHMpCit7CisJdW5zaWduZWQgaW50IHN0YXR1cywgdG1vdXQgPSAxMDAwMDsKKworCS8qIFdhaXQgdXAgdG8gMTBtcyBmb3IgdGhlIGNoYXJhY3RlcihzKSB0byBiZSBzZW50LiAqLworCWRvIHsKKwkJc3RhdHVzID0gZGNyX3JlYWQodXAtPmRjcl9ob3N0LCBVQVJUX0xTUik7CisKKwkJaWYgKC0tdG1vdXQgPT0gMCkKKwkJCWJyZWFrOworCQl1ZGVsYXkoMSk7CisJfSB3aGlsZSAoKHN0YXR1cyAmIGJpdHMpICE9IGJpdHMpOworfQorCisjaWZkZWYgQ09ORklHX1NFUklBTF9PRl9QTEFURk9STV9OV1BTRVJJQUxfQ09OU09MRQorc3RhdGljIHZvaWQgbndwc2VyaWFsX2NvbnNvbGVfcHV0Y2hhcihzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCBpbnQgYykKK3sKKwlzdHJ1Y3Qgbndwc2VyaWFsX3BvcnQgKnVwOworCXVwID0gY29udGFpbmVyX29mKHBvcnQsIHN0cnVjdCBud3BzZXJpYWxfcG9ydCwgcG9ydCk7CisJLyogY2hlY2sgaWYgdHggYnVmZmVyIGlzIGZ1bGwgKi8KKwl3YWl0X2Zvcl9iaXRzKHVwLCBVQVJUX0xTUl9USFJFKTsKKwlkY3Jfd3JpdGUodXAtPmRjcl9ob3N0LCBVQVJUX1RYLCBjKTsKKwl1cC0+cG9ydC5pY291bnQudHgrKzsKK30KKworc3RhdGljIHZvaWQKK253cHNlcmlhbF9jb25zb2xlX3dyaXRlKHN0cnVjdCBjb25zb2xlICpjbywgY29uc3QgY2hhciAqcywgdW5zaWduZWQgaW50IGNvdW50KQoreworCXN0cnVjdCBud3BzZXJpYWxfcG9ydCAqdXAgPSAmbndwc2VyaWFsX3BvcnRzW2NvLT5pbmRleF07CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgbG9ja2VkID0gMTsKKworCWlmIChvb3BzX2luX3Byb2dyZXNzKQorCQlsb2NrZWQgPSBzcGluX3RyeWxvY2tfaXJxc2F2ZSgmdXAtPnBvcnQubG9jaywgZmxhZ3MpOworCWVsc2UKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnVwLT5wb3J0LmxvY2ssIGZsYWdzKTsKKworCS8qIHNhdmUgYW5kIGRpc2FibGUgaW50ZXJydXB0ICovCisJdXAtPmllciA9IGRjcl9yZWFkKHVwLT5kY3JfaG9zdCwgVUFSVF9JRVIpOworCWRjcl93cml0ZSh1cC0+ZGNyX2hvc3QsIFVBUlRfSUVSLCB1cC0+aWVyICYgflVBUlRfSUVSX1JESSk7CisKKwl1YXJ0X2NvbnNvbGVfd3JpdGUoJnVwLT5wb3J0LCBzLCBjb3VudCwgbndwc2VyaWFsX2NvbnNvbGVfcHV0Y2hhcik7CisKKwkvKiB3YWl0IGZvciB0cmFuc21pdHRlciB0byBiZWNvbWUgZW10cHkgKi8KKwl3aGlsZSAoKGRjcl9yZWFkKHVwLT5kY3JfaG9zdCwgVUFSVF9MU1IpICYgVUFSVF9MU1JfVEhSRSkgPT0gMCkKKwkJY3B1X3JlbGF4KCk7CisKKwkvKiByZXN0b3JlIGludGVycnVwdCBzdGF0ZSAqLworCWRjcl93cml0ZSh1cC0+ZGNyX2hvc3QsIFVBUlRfSUVSLCB1cC0+aWVyKTsKKworCWlmIChsb2NrZWQpCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnVwLT5wb3J0LmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHN0cnVjdCB1YXJ0X2RyaXZlciBud3BzZXJpYWxfcmVnOworc3RhdGljIHN0cnVjdCBjb25zb2xlIG53cHNlcmlhbF9jb25zb2xlID0geworCS5uYW1lCQk9ICJ0dHlTUSIsCisJLndyaXRlCQk9IG53cHNlcmlhbF9jb25zb2xlX3dyaXRlLAorCS5kZXZpY2UJCT0gdWFydF9jb25zb2xlX2RldmljZSwKKwkuZmxhZ3MJCT0gQ09OX1BSSU5UQlVGRkVSLAorCS5pbmRleAkJPSAtMSwKKwkuZGF0YQkJPSAmbndwc2VyaWFsX3JlZywKK307CisjZGVmaW5lIE5XUFNFUklBTF9DT05TT0xFCSgmbndwc2VyaWFsX2NvbnNvbGUpCisjZWxzZQorI2RlZmluZSBOV1BTRVJJQUxfQ09OU09MRQlOVUxMCisjZW5kaWYgLyogQ09ORklHX1NFUklBTF9PRl9QTEFURk9STV9OV1BTRVJJQUxfQ09OU09MRSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQgbndwc2VyaWFsX3JlcXVlc3RfcG9ydChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBud3BzZXJpYWxfcmVsZWFzZV9wb3J0KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCit7CisJLyogTi9BICovCit9CisKK3N0YXRpYyB2b2lkIG53cHNlcmlhbF9jb25maWdfcG9ydChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCBpbnQgZmxhZ3MpCit7CisJcG9ydC0+dHlwZSA9IFBPUlRfTldQU0VSSUFMOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3Qgbndwc2VyaWFsX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJc3RydWN0IG53cHNlcmlhbF9wb3J0ICp1cCA9IGRldl9pZDsKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5ID0gdXAtPnBvcnQuaW5mby0+cG9ydC50dHk7CisJaXJxcmV0dXJuX3QgcmV0OworCXVuc2lnbmVkIGludCBpaXI7CisJdW5zaWduZWQgY2hhciBjaDsKKworCXNwaW5fbG9jaygmdXAtPnBvcnQubG9jayk7CisKKwkvKiBjaGVjayBpZiB0aGUgdWFydCB3YXMgdGhlIGludGVycnVwdCBzb3VyY2UuICovCisJaWlyID0gZGNyX3JlYWQodXAtPmRjcl9ob3N0LCBVQVJUX0lJUik7CisJaWYgKCFpaXIpIHsKKwkJcmV0ID0gSVJRX05PTkU7CisJCWdvdG8gb3V0OworCX0KKworCWRvIHsKKwkJdXAtPnBvcnQuaWNvdW50LnJ4Kys7CisJCWNoID0gZGNyX3JlYWQodXAtPmRjcl9ob3N0LCBVQVJUX1JYKTsKKwkJaWYgKHVwLT5wb3J0Lmlnbm9yZV9zdGF0dXNfbWFzayAhPSBOV1BTRVJJQUxfU1RBVFVTX1JYVkFMSUQpCisJCQl0dHlfaW5zZXJ0X2ZsaXBfY2hhcih0dHksIGNoLCBUVFlfTk9STUFMKTsKKwl9IHdoaWxlIChkY3JfcmVhZCh1cC0+ZGNyX2hvc3QsIFVBUlRfUlgpICYgVUFSVF9MU1JfRFIpOworCisJdHR5X2ZsaXBfYnVmZmVyX3B1c2godHR5KTsKKwlyZXQgPSBJUlFfSEFORExFRDsKKworb3V0OgorCXNwaW5fdW5sb2NrKCZ1cC0+cG9ydC5sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG53cHNlcmlhbF9zdGFydHVwKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCit7CisJc3RydWN0IG53cHNlcmlhbF9wb3J0ICp1cDsKKwlpbnQgZXJyOworCisJdXAgPSBjb250YWluZXJfb2YocG9ydCwgc3RydWN0IG53cHNlcmlhbF9wb3J0LCBwb3J0KTsKKworCS8qIGRpc2FibGUgZmxvdyBjb250cm9sIGJ5IGRlZmF1bHQgKi8KKwl1cC0+bWNyID0gZGNyX3JlYWQodXAtPmRjcl9ob3N0LCBVQVJUX01DUikgJiB+VUFSVF9NQ1JfQUZFOworCWRjcl93cml0ZSh1cC0+ZGNyX2hvc3QsIFVBUlRfTUNSLCB1cC0+bWNyKTsKKworCS8qIHJlZ2lzdGVyIGludGVycnVwdCBoYW5kbGVyICovCisJZXJyID0gcmVxdWVzdF9pcnEodXAtPnBvcnQuaXJxLCBud3BzZXJpYWxfaW50ZXJydXB0LAorCQkJSVJRRl9TSEFSRUQsICJud3BzZXJpYWwiLCB1cCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCS8qIGVuYWJsZSBpbnRlcnJ1cHRzICovCisJdXAtPmllciA9IFVBUlRfSUVSX1JESTsKKwlkY3Jfd3JpdGUodXAtPmRjcl9ob3N0LCBVQVJUX0lFUiwgdXAtPmllcik7CisKKwkvKiBlbmFibGUgcmVjZWl2aW5nICovCisJdXAtPnBvcnQuaWdub3JlX3N0YXR1c19tYXNrICY9IH5OV1BTRVJJQUxfU1RBVFVTX1JYVkFMSUQ7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbndwc2VyaWFsX3NodXRkb3duKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCit7CisJc3RydWN0IG53cHNlcmlhbF9wb3J0ICp1cDsKKwl1cCA9IGNvbnRhaW5lcl9vZihwb3J0LCBzdHJ1Y3Qgbndwc2VyaWFsX3BvcnQsIHBvcnQpOworCisJLyogZGlzYWJsZSByZWNlaXZpbmcgKi8KKwl1cC0+cG9ydC5pZ25vcmVfc3RhdHVzX21hc2sgfD0gTldQU0VSSUFMX1NUQVRVU19SWFZBTElEOworCisJLyogZGlzYWJsZSBpbnRlcnJ1cHRzIGZyb20gdGhpcyBwb3J0ICovCisJdXAtPmllciA9IDA7CisJZGNyX3dyaXRlKHVwLT5kY3JfaG9zdCwgVUFSVF9JRVIsIHVwLT5pZXIpOworCisJLyogZnJlZSBpcnEgKi8KKwlmcmVlX2lycSh1cC0+cG9ydC5pcnEsIHBvcnQpOworfQorCitzdGF0aWMgaW50IG53cHNlcmlhbF92ZXJpZnlfcG9ydChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LAorCQkJc3RydWN0IHNlcmlhbF9zdHJ1Y3QgKnNlcikKK3sKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKm53cHNlcmlhbF90eXBlKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCit7CisJcmV0dXJuIHBvcnQtPnR5cGUgPT0gUE9SVF9OV1BTRVJJQUwgPyAibndwc2VyaWFsIiA6IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIG53cHNlcmlhbF9zZXRfdGVybWlvcyhzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LAorCQkJc3RydWN0IGt0ZXJtaW9zICp0ZXJtaW9zLCBzdHJ1Y3Qga3Rlcm1pb3MgKm9sZCkKK3sKKwlzdHJ1Y3Qgbndwc2VyaWFsX3BvcnQgKnVwOworCXVwID0gY29udGFpbmVyX29mKHBvcnQsIHN0cnVjdCBud3BzZXJpYWxfcG9ydCwgcG9ydCk7CisKKwl1cC0+cG9ydC5yZWFkX3N0YXR1c19tYXNrID0gTldQU0VSSUFMX1NUQVRVU19SWFZBTElECisJCQkJfCBOV1BTRVJJQUxfU1RBVFVTX1RYRlVMTDsKKworCXVwLT5wb3J0Lmlnbm9yZV9zdGF0dXNfbWFzayA9IDA7CisJLyogaWdub3JlIGFsbCBjaGFyYWN0ZXJzIGlmIENSRUFEIGlzIG5vdCBzZXQgKi8KKwlpZiAoKHRlcm1pb3MtPmNfY2ZsYWcgJiBDUkVBRCkgPT0gMCkKKwkJdXAtPnBvcnQuaWdub3JlX3N0YXR1c19tYXNrIHw9IE5XUFNFUklBTF9TVEFUVVNfUlhWQUxJRDsKKworCS8qIENvcHkgYmFjayB0aGUgb2xkIGhhcmR3YXJlIHNldHRpbmdzICovCisJaWYgKG9sZCkKKwkJdHR5X3Rlcm1pb3NfY29weV9odyh0ZXJtaW9zLCBvbGQpOworfQorCitzdGF0aWMgdm9pZCBud3BzZXJpYWxfYnJlYWtfY3RsKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIGludCBjdGwpCit7CisJLyogTi9BICovCit9CisKK3N0YXRpYyB2b2lkIG53cHNlcmlhbF9lbmFibGVfbXMoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKK3sKKwkvKiBOL0EgKi8KK30KKworc3RhdGljIHZvaWQgbndwc2VyaWFsX3N0b3Bfcngoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKK3sKKwlzdHJ1Y3Qgbndwc2VyaWFsX3BvcnQgKnVwOworCXVwID0gY29udGFpbmVyX29mKHBvcnQsIHN0cnVjdCBud3BzZXJpYWxfcG9ydCwgcG9ydCk7CisJLyogZG9uJ3QgZm9yd2FyZCBhbnkgbW9yZSBkYXRhIChsaWtlICFDUkVBRCkgKi8KKwl1cC0+cG9ydC5pZ25vcmVfc3RhdHVzX21hc2sgPSBOV1BTRVJJQUxfU1RBVFVTX1JYVkFMSUQ7Cit9CisKK3N0YXRpYyB2b2lkIG53cHNlcmlhbF9wdXRjaGFyKHN0cnVjdCBud3BzZXJpYWxfcG9ydCAqdXAsIHVuc2lnbmVkIGNoYXIgYykKK3sKKwkvKiBjaGVjayBpZiB0eCBidWZmZXIgaXMgZnVsbCAqLworCXdhaXRfZm9yX2JpdHModXAsIFVBUlRfTFNSX1RIUkUpOworCWRjcl93cml0ZSh1cC0+ZGNyX2hvc3QsIFVBUlRfVFgsIGMpOworCXVwLT5wb3J0Lmljb3VudC50eCsrOworfQorCitzdGF0aWMgdm9pZCBud3BzZXJpYWxfc3RhcnRfdHgoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKK3sKKwlzdHJ1Y3Qgbndwc2VyaWFsX3BvcnQgKnVwOworCXN0cnVjdCBjaXJjX2J1ZiAqeG1pdDsKKwl1cCA9IGNvbnRhaW5lcl9vZihwb3J0LCBzdHJ1Y3Qgbndwc2VyaWFsX3BvcnQsIHBvcnQpOworCXhtaXQgID0gJnVwLT5wb3J0LmluZm8tPnhtaXQ7CisKKwlpZiAocG9ydC0+eF9jaGFyKSB7CisJCW53cHNlcmlhbF9wdXRjaGFyKHVwLCB1cC0+cG9ydC54X2NoYXIpOworCQlwb3J0LT54X2NoYXIgPSAwOworCX0KKworCXdoaWxlICghKHVhcnRfY2lyY19lbXB0eSh4bWl0KSB8fCB1YXJ0X3R4X3N0b3BwZWQoJnVwLT5wb3J0KSkpIHsKKwkJbndwc2VyaWFsX3B1dGNoYXIodXAsIHhtaXQtPmJ1Zlt4bWl0LT50YWlsXSk7CisJCXhtaXQtPnRhaWwgPSAoeG1pdC0+dGFpbCArIDEpICYgKFVBUlRfWE1JVF9TSVpFLTEpOworCX0KK30KKworc3RhdGljIHVuc2lnbmVkIGludCBud3BzZXJpYWxfZ2V0X21jdHJsKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG53cHNlcmlhbF9zZXRfbWN0cmwoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgdW5zaWduZWQgaW50IG1jdHJsKQoreworCS8qIE4vQSAqLworfQorCitzdGF0aWMgdm9pZCBud3BzZXJpYWxfc3RvcF90eChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQoreworCS8qIE4vQSAqLworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IG53cHNlcmlhbF90eF9lbXB0eShzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQoreworCXN0cnVjdCBud3BzZXJpYWxfcG9ydCAqdXA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0OworCXVwID0gY29udGFpbmVyX29mKHBvcnQsIHN0cnVjdCBud3BzZXJpYWxfcG9ydCwgcG9ydCk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdXAtPnBvcnQubG9jaywgZmxhZ3MpOworCXJldCA9IGRjcl9yZWFkKHVwLT5kY3JfaG9zdCwgVUFSVF9MU1IpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnVwLT5wb3J0LmxvY2ssIGZsYWdzKTsKKworCXJldHVybiByZXQgJiBVQVJUX0xTUl9URU1UID8gVElPQ1NFUl9URU1UIDogMDsKK30KKworc3RhdGljIHN0cnVjdCB1YXJ0X29wcyBud3BzZXJpYWxfcG9wcyA9IHsKKwkudHhfZW1wdHkgICAgID0gbndwc2VyaWFsX3R4X2VtcHR5LAorCS5zZXRfbWN0cmwgICAgPSBud3BzZXJpYWxfc2V0X21jdHJsLAorCS5nZXRfbWN0cmwgICAgPSBud3BzZXJpYWxfZ2V0X21jdHJsLAorCS5zdG9wX3R4ICAgICAgPSBud3BzZXJpYWxfc3RvcF90eCwKKwkuc3RhcnRfdHggICAgID0gbndwc2VyaWFsX3N0YXJ0X3R4LAorCS5zdG9wX3J4ICAgICAgPSBud3BzZXJpYWxfc3RvcF9yeCwKKwkuZW5hYmxlX21zICAgID0gbndwc2VyaWFsX2VuYWJsZV9tcywKKwkuYnJlYWtfY3RsICAgID0gbndwc2VyaWFsX2JyZWFrX2N0bCwKKwkuc3RhcnR1cCAgICAgID0gbndwc2VyaWFsX3N0YXJ0dXAsCisJLnNodXRkb3duICAgICA9IG53cHNlcmlhbF9zaHV0ZG93biwKKwkuc2V0X3Rlcm1pb3MgID0gbndwc2VyaWFsX3NldF90ZXJtaW9zLAorCS50eXBlICAgICAgICAgPSBud3BzZXJpYWxfdHlwZSwKKwkucmVsZWFzZV9wb3J0ID0gbndwc2VyaWFsX3JlbGVhc2VfcG9ydCwKKwkucmVxdWVzdF9wb3J0ID0gbndwc2VyaWFsX3JlcXVlc3RfcG9ydCwKKwkuY29uZmlnX3BvcnQgID0gbndwc2VyaWFsX2NvbmZpZ19wb3J0LAorCS52ZXJpZnlfcG9ydCAgPSBud3BzZXJpYWxfdmVyaWZ5X3BvcnQsCit9OworCitzdGF0aWMgc3RydWN0IHVhcnRfZHJpdmVyIG53cHNlcmlhbF9yZWcgPSB7CisJLm93bmVyICAgICAgID0gVEhJU19NT0RVTEUsCisJLmRyaXZlcl9uYW1lID0gIm53cHNlcmlhbCIsCisJLmRldl9uYW1lICAgID0gInR0eVNRIiwKKwkubWFqb3IgICAgICAgPSBUVFlfTUFKT1IsCisJLm1pbm9yICAgICAgID0gNjgsCisJLm5yICAgICAgICAgID0gTldQU0VSSUFMX05SLAorCS5jb25zICAgICAgICA9IE5XUFNFUklBTF9DT05TT0xFLAorfTsKKworaW50IG53cHNlcmlhbF9yZWdpc3Rlcl9wb3J0KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCit7CisJc3RydWN0IG53cHNlcmlhbF9wb3J0ICp1cCA9IE5VTEw7CisJaW50IHJldCA9IC0xOworCWludCBpOworCXN0YXRpYyBpbnQgZmlyc3QgPSAxOworCWludCBkY3JfbGVuOworCWludCBkY3JfYmFzZTsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuOworCisJbXV0ZXhfbG9jaygmbndwc2VyaWFsX211dGV4KTsKKworCWRuID0gdG9fb2ZfZGV2aWNlKHBvcnQtPmRldiktPm5vZGU7CisJaWYgKGRuID09IE5VTEwpCisJCWdvdG8gb3V0OworCisJLyogZ2V0IGRjciBiYXNlLiAqLworCWRjcl9iYXNlID0gZGNyX3Jlc291cmNlX3N0YXJ0KGRuLCAwKTsKKworCS8qIGZpbmQgbWF0Y2hpbmcgZW50cnkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTldQU0VSSUFMX05SOyBpKyspCisJCWlmIChud3BzZXJpYWxfcG9ydHNbaV0ucG9ydC5pb2Jhc2UgPT0gZGNyX2Jhc2UpIHsKKwkJCXVwID0gJm53cHNlcmlhbF9wb3J0c1tpXTsKKwkJCWJyZWFrOworCQl9CisKKwkvKiB3ZSBkaWRuJ3QgZmluZCBhIG10Y2hpbmcgZW50cnksIHNlYXJjaCBmb3IgYSBmcmVlIHBvcnQgKi8KKwlpZiAodXAgPT0gTlVMTCkKKwkJZm9yIChpID0gMDsgaSA8IE5XUFNFUklBTF9OUjsgaSsrKQorCQkJaWYgKG53cHNlcmlhbF9wb3J0c1tpXS5wb3J0LnR5cGUgPT0gUE9SVF9VTktOT1dOICYmCisJCQkJbndwc2VyaWFsX3BvcnRzW2ldLnBvcnQuaW9iYXNlID09IDApIHsKKwkJCQl1cCA9ICZud3BzZXJpYWxfcG9ydHNbaV07CisJCQkJYnJlYWs7CisJCQl9CisKKwlpZiAodXAgPT0gTlVMTCkgeworCQlyZXQgPSAtRUJVU1k7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChmaXJzdCkKKwkJdWFydF9yZWdpc3Rlcl9kcml2ZXIoJm53cHNlcmlhbF9yZWcpOworCWZpcnN0ID0gMDsKKworCXVwLT5wb3J0Lm1lbWJhc2UgICAgICA9IHBvcnQtPm1lbWJhc2U7CisJdXAtPnBvcnQuaXJxICAgICAgICAgID0gcG9ydC0+aXJxOworCXVwLT5wb3J0LnVhcnRjbGsgICAgICA9IHBvcnQtPnVhcnRjbGs7CisJdXAtPnBvcnQuZmlmb3NpemUgICAgID0gcG9ydC0+Zmlmb3NpemU7CisJdXAtPnBvcnQucmVnc2hpZnQgICAgID0gcG9ydC0+cmVnc2hpZnQ7CisJdXAtPnBvcnQuaW90eXBlICAgICAgID0gcG9ydC0+aW90eXBlOworCXVwLT5wb3J0LmZsYWdzICAgICAgICA9IHBvcnQtPmZsYWdzOworCXVwLT5wb3J0Lm1hcGJhc2UgICAgICA9IHBvcnQtPm1hcGJhc2U7CisJdXAtPnBvcnQucHJpdmF0ZV9kYXRhID0gcG9ydC0+cHJpdmF0ZV9kYXRhOworCisJaWYgKHBvcnQtPmRldikKKwkJdXAtPnBvcnQuZGV2ID0gcG9ydC0+ZGV2OworCisJaWYgKHVwLT5wb3J0LmlvYmFzZSAhPSBkY3JfYmFzZSkgeworCQl1cC0+cG9ydC5vcHMgICAgICAgICAgPSAmbndwc2VyaWFsX3BvcHM7CisJCXVwLT5wb3J0LmZpZm9zaXplICAgICA9IDE2OworCisJCXNwaW5fbG9ja19pbml0KCZ1cC0+cG9ydC5sb2NrKTsKKworCQl1cC0+cG9ydC5pb2Jhc2UgPSBkY3JfYmFzZTsKKwkJZGNyX2xlbiA9IGRjcl9yZXNvdXJjZV9sZW4oZG4sIDApOworCisJCXVwLT5kY3JfaG9zdCA9IGRjcl9tYXAoZG4sIGRjcl9iYXNlLCBkY3JfbGVuKTsKKwkJaWYgKCFEQ1JfTUFQX09LKHVwLT5kY3JfaG9zdCkpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiQ2Fubm90IG1hcCBEQ1IgcmVzb3VyY2VzIGZvciBOV1BTRVJJQUwiKTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJcmV0ID0gdWFydF9hZGRfb25lX3BvcnQoJm53cHNlcmlhbF9yZWcsICZ1cC0+cG9ydCk7CisJaWYgKHJldCA9PSAwKQorCQlyZXQgPSB1cC0+cG9ydC5saW5lOworCitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZud3BzZXJpYWxfbXV0ZXgpOworCisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0wobndwc2VyaWFsX3JlZ2lzdGVyX3BvcnQpOworCit2b2lkIG53cHNlcmlhbF91bnJlZ2lzdGVyX3BvcnQoaW50IGxpbmUpCit7CisJc3RydWN0IG53cHNlcmlhbF9wb3J0ICp1cCA9ICZud3BzZXJpYWxfcG9ydHNbbGluZV07CisJbXV0ZXhfbG9jaygmbndwc2VyaWFsX211dGV4KTsKKwl1YXJ0X3JlbW92ZV9vbmVfcG9ydCgmbndwc2VyaWFsX3JlZywgJnVwLT5wb3J0KTsKKworCXVwLT5wb3J0LnR5cGUgPSBQT1JUX1VOS05PV047CisKKwltdXRleF91bmxvY2soJm53cHNlcmlhbF9tdXRleCk7Cit9CitFWFBPUlRfU1lNQk9MKG53cHNlcmlhbF91bnJlZ2lzdGVyX3BvcnQpOworCisjaWZkZWYgQ09ORklHX1NFUklBTF9PRl9QTEFURk9STV9OV1BTRVJJQUxfQ09OU09MRQorc3RhdGljIGludCBfX2luaXQgbndwc2VyaWFsX2NvbnNvbGVfaW5pdCh2b2lkKQoreworCXN0cnVjdCBud3BzZXJpYWxfcG9ydCAqdXAgPSBOVUxMOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZG47CisJY29uc3QgY2hhciAqbmFtZTsKKwlpbnQgZGNyX2Jhc2U7CisJaW50IGRjcl9sZW47CisJaW50IGk7CisKKwkvKiBzZWFyY2ggZm9yIGEgZnJlZSBwb3J0ICovCisJZm9yIChpID0gMDsgaSA8IE5XUFNFUklBTF9OUjsgaSsrKQorCQlpZiAobndwc2VyaWFsX3BvcnRzW2ldLnBvcnQudHlwZSA9PSBQT1JUX1VOS05PV04pIHsKKwkJCXVwID0gJm53cHNlcmlhbF9wb3J0c1tpXTsKKwkJCWJyZWFrOworCQl9CisKKwlpZiAodXAgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCisJbmFtZSA9IG9mX2dldF9wcm9wZXJ0eShvZl9jaG9zZW4sICJsaW51eCxzdGRvdXQtcGF0aCIsIE5VTEwpOworCWlmIChuYW1lID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCWRuID0gb2ZfZmluZF9ub2RlX2J5X3BhdGgobmFtZSk7CisJaWYgKCFkbikKKwkJcmV0dXJuIC0xOworCisJc3Bpbl9sb2NrX2luaXQoJnVwLT5wb3J0LmxvY2spOworCXVwLT5wb3J0Lm9wcyA9ICZud3BzZXJpYWxfcG9wczsKKwl1cC0+cG9ydC50eXBlID0gUE9SVF9OV1BTRVJJQUw7CisJdXAtPnBvcnQuZmlmb3NpemUgPSAxNjsKKworCWRjcl9iYXNlID0gZGNyX3Jlc291cmNlX3N0YXJ0KGRuLCAwKTsKKwlkY3JfbGVuID0gZGNyX3Jlc291cmNlX2xlbihkbiwgMCk7CisJdXAtPnBvcnQuaW9iYXNlID0gZGNyX2Jhc2U7CisKKwl1cC0+ZGNyX2hvc3QgPSBkY3JfbWFwKGRuLCBkY3JfYmFzZSwgZGNyX2xlbik7CisJaWYgKCFEQ1JfTUFQX09LKHVwLT5kY3JfaG9zdCkpIHsKKwkJcHJpbnRrKCJDYW5ub3QgbWFwIERDUiByZXNvdXJjZXMgZm9yIFNFUklBTCIpOworCQlyZXR1cm4gLTE7CisJfQorCXJlZ2lzdGVyX2NvbnNvbGUoJm53cHNlcmlhbF9jb25zb2xlKTsKKwlyZXR1cm4gMDsKK30KK2NvbnNvbGVfaW5pdGNhbGwobndwc2VyaWFsX2NvbnNvbGVfaW5pdCk7CisjZW5kaWYgLyogQ09ORklHX1NFUklBTF9PRl9QTEFURk9STV9OV1BTRVJJQUxfQ09OU09MRSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvb2Zfc2VyaWFsLmMgYi9kcml2ZXJzL3NlcmlhbC9vZl9zZXJpYWwuYwppbmRleCA4ZmEwZmY1Li5hODIxZTNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC9vZl9zZXJpYWwuYworKysgYi9kcml2ZXJzL3NlcmlhbC9vZl9zZXJpYWwuYwpAQCAtMTQsNiArMTQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9jb3JlLmg+CiAjaW5jbHVkZSA8bGludXgvc2VyaWFsXzgyNTAuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPgorI2luY2x1ZGUgPGxpbnV4L253cHNlcmlhbC5oPgogCiAjaW5jbHVkZSA8YXNtL3Byb20uaD4KIApAQCAtOTksOSArMTAwLDE2IEBACiAJCWdvdG8gb3V0OwogCiAJc3dpdGNoIChwb3J0X3R5cGUpIHsKKyNpZmRlZiBDT05GSUdfU0VSSUFMXzgyNTAKIAljYXNlIFBPUlRfODI1MCAuLi4gUE9SVF9NQVhfODI1MDoKIAkJcmV0ID0gc2VyaWFsODI1MF9yZWdpc3Rlcl9wb3J0KCZwb3J0KTsKIAkJYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfU0VSSUFMX09GX1BMQVRGT1JNX05XUFNFUklBTAorCWNhc2UgUE9SVF9OV1BTRVJJQUw6CisJCXJldCA9IG53cHNlcmlhbF9yZWdpc3Rlcl9wb3J0KCZwb3J0KTsKKwkJYnJlYWs7CisjZW5kaWYKIAlkZWZhdWx0OgogCQkvKiBuZWVkIHRvIGFkZCBjb2RlIGZvciB0aGVzZSAqLwogCWNhc2UgUE9SVF9VTktOT1dOOgpAQCAtMTI5LDkgKzEzNywxNiBAQAogewogCXN0cnVjdCBvZl9zZXJpYWxfaW5mbyAqaW5mbyA9IG9mZGV2LT5kZXYuZHJpdmVyX2RhdGE7CiAJc3dpdGNoIChpbmZvLT50eXBlKSB7CisjaWZkZWYgQ09ORklHX1NFUklBTF84MjUwCiAJY2FzZSBQT1JUXzgyNTAgLi4uIFBPUlRfTUFYXzgyNTA6CiAJCXNlcmlhbDgyNTBfdW5yZWdpc3Rlcl9wb3J0KGluZm8tPmxpbmUpOwogCQlicmVhazsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19TRVJJQUxfT0ZfUExBVEZPUk1fTldQU0VSSUFMCisJY2FzZSBQT1JUX05XUFNFUklBTDoKKwkJbndwc2VyaWFsX3VucmVnaXN0ZXJfcG9ydChpbmZvLT5saW5lKTsKKwkJYnJlYWs7CisjZW5kaWYKIAlkZWZhdWx0OgogCQkvKiBuZWVkIHRvIGFkZCBjb2RlIGZvciB0aGVzZSAqLwogCQlicmVhazsKQEAgLTE0OCw2ICsxNjMsMTAgQEAKIAl7IC50eXBlID0gInNlcmlhbCIsIC5jb21wYXRpYmxlID0gIm5zMTY0NTAiLCAgLmRhdGEgPSAodm9pZCAqKVBPUlRfMTY0NTAsIH0sCiAJeyAudHlwZSA9ICJzZXJpYWwiLCAuY29tcGF0aWJsZSA9ICJuczE2NTUwIiwgIC5kYXRhID0gKHZvaWQgKilQT1JUXzE2NTUwLCB9LAogCXsgLnR5cGUgPSAic2VyaWFsIiwgLmNvbXBhdGlibGUgPSAibnMxNjc1MCIsICAuZGF0YSA9ICh2b2lkICopUE9SVF8xNjc1MCwgfSwKKyNpZmRlZiBDT05GSUdfU0VSSUFMX09GX1BMQVRGT1JNX05XUFNFUklBTAorCXsgLnR5cGUgPSAic2VyaWFsIiwgLmNvbXBhdGlibGUgPSAiaWJtLHFwYWNlLW53cC1zZXJpYWwiLAorCQkJCQkuZGF0YSA9ICh2b2lkICopUE9SVF9OV1BTRVJJQUwsIH0sCisjZW5kaWYKIAl7IC50eXBlID0gInNlcmlhbCIsCQkJICAgICAgLmRhdGEgPSAodm9pZCAqKVBPUlRfVU5LTk9XTiwgfSwKIAl7IC8qIGVuZCBvZiBsaXN0ICovIH0sCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvc2VyaWFsX2NvcmUuYyBiL2RyaXZlcnMvc2VyaWFsL3NlcmlhbF9jb3JlLmMKaW5kZXggZGM2OGI3ZS4uNDJmNGU2NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvc2VyaWFsX2NvcmUuYworKysgYi9kcml2ZXJzL3NlcmlhbC9zZXJpYWxfY29yZS5jCkBAIC0yMDMwLDcgKzIwMzAsNyBAQAogCQlpZiAoIXRyaWVzKQogCQkJcHJpbnRrKEtFUk5fRVJSICIlcyVzJXMlZDogVW5hYmxlIHRvIGRyYWluICIKIAkJCQkJInRyYW5zbWl0dGVyXG4iLAotCQkJICAgICAgIHBvcnQtPmRldiA/IHBvcnQtPmRldi0+YnVzX2lkIDogIiIsCisJCQkgICAgICAgcG9ydC0+ZGV2ID8gZGV2X25hbWUocG9ydC0+ZGV2KSA6ICIiLAogCQkJICAgICAgIHBvcnQtPmRldiA/ICI6ICIgOiAiIiwKIAkJCSAgICAgICBkcnYtPmRldl9uYW1lLAogCQkJICAgICAgIGRydi0+dHR5X2RyaXZlci0+bmFtZV9iYXNlICsgcG9ydC0+bGluZSk7CkBAIC0yMTU2LDcgKzIxNTYsNyBAQAogCX0KIAogCXByaW50ayhLRVJOX0lORk8gIiVzJXMlcyVkIGF0ICVzIChpcnEgPSAlZCkgaXMgYSAlc1xuIiwKLQkgICAgICAgcG9ydC0+ZGV2ID8gcG9ydC0+ZGV2LT5idXNfaWQgOiAiIiwKKwkgICAgICAgcG9ydC0+ZGV2ID8gZGV2X25hbWUocG9ydC0+ZGV2KSA6ICIiLAogCSAgICAgICBwb3J0LT5kZXYgPyAiOiAiIDogIiIsCiAJICAgICAgIGRydi0+ZGV2X25hbWUsCiAJICAgICAgIGRydi0+dHR5X2RyaXZlci0+bmFtZV9iYXNlICsgcG9ydC0+bGluZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL0tjb25maWcgYi9kcml2ZXJzL3NwaS9LY29uZmlnCmluZGV4IGI5ZDBlZmIuLjRhNmZlMDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL0tjb25maWcKKysrIGIvZHJpdmVycy9zcGkvS2NvbmZpZwpAQCAtNzgsNyArNzgsNyBAQAogCSAgd2lsbCBiZSBjYWxsZWQgYXUxNTUwX3NwaS4KIAogY29uZmlnIFNQSV9CSVRCQU5HCi0JdHJpc3RhdGUgIkJpdGJhbmdpbmcgU1BJIG1hc3RlciIKKwl0cmlzdGF0ZSAiVXRpbGl0aWVzIGZvciBCaXRiYW5naW5nIFNQSSBtYXN0ZXJzIgogCWhlbHAKIAkgIFdpdGggYSBmZXcgR1BJTyBwaW5zLCB5b3VyIHN5c3RlbSBjYW4gYml0YmFuZyB0aGUgU1BJIHByb3RvY29sLgogCSAgU2VsZWN0IHRoaXMgdG8gZ2V0IFNQSSBzdXBwb3J0IHRocm91Z2ggSS9PIHBpbnMgKEdQSU8sIHBhcmFsbGVsCkBAIC0xMDAsNiArMTAwLDIyIEBACiAJICBpbmV4cGVuc2l2ZSBiYXR0ZXJ5IHBvd2VyZWQgbWljcm9jb250cm9sbGVyIGV2YWx1YXRpb24gYm9hcmQuCiAJICBUaGlzIHNhbWUgY2FibGUgY2FuIGJlIHVzZWQgdG8gZmxhc2ggbmV3IGZpcm13YXJlLgogCitjb25maWcgU1BJX0dQSU8KKwl0cmlzdGF0ZSAiR1BJTy1iYXNlZCBiaXRiYW5naW5nIFNQSSBNYXN0ZXIiCisJZGVwZW5kcyBvbiBHRU5FUklDX0dQSU8KKwlzZWxlY3QgU1BJX0JJVEJBTkcKKwloZWxwCisJICBUaGlzIHNpbXBsZSBHUElPIGJpdGJhbmdpbmcgU1BJIG1hc3RlciB1c2VzIHRoZSBhcmNoLW5ldXRyYWwgR1BJTworCSAgaW50ZXJmYWNlIHRvIG1hbmFnZSBNT1NJLCBNSVNPLCBTQ0ssIGFuZCBjaGlwc2VsZWN0IHNpZ25hbHMuICBTUEkKKwkgIHNsYXZlcyBjb25uZWN0ZWQgdG8gYSBidXMgdXNpbmcgdGhpcyBkcml2ZXIgYXJlIGNvbmZpZ3VyZWQgYXMgdXN1YWwsCisJICBleGNlcHQgdGhhdCB0aGUgc3BpX2JvYXJkX2luZm8uY29udHJvbGxlcl9kYXRhIGhvbGRzIHRoZSBHUElPIG51bWJlcgorCSAgZm9yIHRoZSBjaGlwc2VsZWN0IHVzZWQgYnkgdGhpcyBjb250cm9sbGVyIGRyaXZlci4KKworCSAgTm90ZSB0aGF0IHRoaXMgZHJpdmVyIG9mdGVuIHdvbid0IGFjaGlldmUgZXZlbiAxIE1iaXQvc2VjIHNwZWVkcywKKwkgIG1ha2luZyBpdCB1bnVzdWFsbHkgc2xvdyBmb3IgU1BJLiAgSWYgeW91ciBwbGF0Zm9ybSBjYW4gaW5saW5lCisJICBHUElPIG9wZXJhdGlvbnMsIHlvdSBzaG91bGQgYmUgYWJsZSB0byBsZXZlcmFnZSB0aGF0IGZvciBiZXR0ZXIKKwkgIHNwZWVkIHdpdGggYSBjdXN0b20gdmVyc2lvbiBvZiB0aGlzIGRyaXZlcjsgc2VlIHRoZSBzb3VyY2UgY29kZS4KKwogY29uZmlnIFNQSV9JTVgKIAl0cmlzdGF0ZSAiRnJlZXNjYWxlIGlNWCBTUEkgY29udHJvbGxlciIKIAlkZXBlbmRzIG9uIEFSQ0hfSU1YICYmIEVYUEVSSU1FTlRBTApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvTWFrZWZpbGUgYi9kcml2ZXJzL3NwaS9NYWtlZmlsZQppbmRleCBjY2YxOGRlLi41ZTlmNTIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3NwaS9NYWtlZmlsZQpAQCAtMTYsNiArMTYsNyBAQAogb2JqLSQoQ09ORklHX1NQSV9CSVRCQU5HKQkJKz0gc3BpX2JpdGJhbmcubwogb2JqLSQoQ09ORklHX1NQSV9BVTE1NTApCQkrPSBhdTE1NTBfc3BpLm8KIG9iai0kKENPTkZJR19TUElfQlVUVEVSRkxZKQkJKz0gc3BpX2J1dHRlcmZseS5vCitvYmotJChDT05GSUdfU1BJX0dQSU8pCQkJKz0gc3BpX2dwaW8ubwogb2JqLSQoQ09ORklHX1NQSV9JTVgpCQkJKz0gc3BpX2lteC5vCiBvYmotJChDT05GSUdfU1BJX0xNNzBfTExQKQkJKz0gc3BpX2xtNzBsbHAubwogb2JqLSQoQ09ORklHX1NQSV9QWEEyWFgpCQkrPSBweGEyeHhfc3BpLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL2F0bWVsX3NwaS5jIGIvZHJpdmVycy9zcGkvYXRtZWxfc3BpLmMKaW5kZXggOGFiYWU0YS4uNWUzOWJhYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvYXRtZWxfc3BpLmMKKysrIGIvZHJpdmVycy9zcGkvYXRtZWxfc3BpLmMKQEAgLTMwLDEzICszMCw2IEBACiAgKiBUaGUgY29yZSBTUEkgdHJhbnNmZXIgZW5naW5lIGp1c3QgdGFsa3MgdG8gYSByZWdpc3RlciBiYW5rIHRvIHNldCB1cAogICogRE1BIHRyYW5zZmVyczsgdHJhbnNmZXIgcXVldWUgcHJvZ3Jlc3MgaXMgZHJpdmVuIGJ5IElSUXMuICBUaGUgY2xvY2sKICAqIGZyYW1ld29yayBwcm92aWRlcyB0aGUgYmFzZSBjbG9jaywgc3ViZGl2aWRlZCBmb3IgZWFjaCBzcGlfZGV2aWNlLgotICoKLSAqIE5ld2VyIGNvbnRyb2xsZXJzLCBtYXJrZWQgd2l0aCAibmV3XzEiIGZsYWcsIGhhdmU6Ci0gKiAgLSBDUi5MQVNUWEZFUgotICogIC0gU1BJX01SLkRJVjMyIG1heSBiZWNvbWUgRkRJViBvciBtdXN0LWJlLXplcm8gKGhlcmU6IGFsd2F5cyB6ZXJvKQotICogIC0gU1BJX1NSLlRYRU1QVFksIFNQSV9TUi5OU1NSIChhbmQgY29ycmVzcG9uZGluZyBpcnFzKQotICogIC0gU1BJX0NTUnguQ1NBQVQKLSAqICAtIFNQSV9DU1J4LlNCQ1IgYWxsb3dzIGZhc3RlciBjbG9ja2luZwogICovCiBzdHJ1Y3QgYXRtZWxfc3BpIHsKIAlzcGlubG9ja190CQlsb2NrOwpAQCAtNDUsNyArMzgsNiBAQAogCWludAkJCWlycTsKIAlzdHJ1Y3QgY2xrCQkqY2xrOwogCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UJKnBkZXY7Ci0JdW5zaWduZWQJCW5ld18xOjE7CiAJc3RydWN0IHNwaV9kZXZpY2UJKnN0YXk7CiAKIAl1OAkJCXN0b3BwaW5nOwpAQCAtNTksMTAgKzUxLDMzIEBACiAJZG1hX2FkZHJfdAkJYnVmZmVyX2RtYTsKIH07CiAKKy8qIENvbnRyb2xsZXItc3BlY2lmaWMgcGVyLXNsYXZlIHN0YXRlICovCitzdHJ1Y3QgYXRtZWxfc3BpX2RldmljZSB7CisJdW5zaWduZWQgaW50CQlucGNzX3BpbjsKKwl1MzIJCQljc3I7Cit9OworCiAjZGVmaW5lIEJVRkZFUl9TSVpFCQlQQUdFX1NJWkUKICNkZWZpbmUgSU5WQUxJRF9ETUFfQUREUkVTUwkweGZmZmZmZmZmCiAKIC8qCisgKiBWZXJzaW9uIDIgb2YgdGhlIFNQSSBjb250cm9sbGVyIGhhcworICogIC0gQ1IuTEFTVFhGRVIKKyAqICAtIFNQSV9NUi5ESVYzMiBtYXkgYmVjb21lIEZESVYgb3IgbXVzdC1iZS16ZXJvIChoZXJlOiBhbHdheXMgemVybykKKyAqICAtIFNQSV9TUi5UWEVNUFRZLCBTUElfU1IuTlNTUiAoYW5kIGNvcnJlc3BvbmRpbmcgaXJxcykKKyAqICAtIFNQSV9DU1J4LkNTQUFUCisgKiAgLSBTUElfQ1NSeC5TQkNSIGFsbG93cyBmYXN0ZXIgY2xvY2tpbmcKKyAqCisgKiBXZSBjYW4gZGV0ZXJtaW5lIHRoZSBjb250cm9sbGVyIHZlcnNpb24gYnkgcmVhZGluZyB0aGUgVkVSU0lPTgorICogcmVnaXN0ZXIsIGJ1dCBJIGhhdmVuJ3QgY2hlY2tlZCB0aGF0IGl0IGV4aXN0cyBvbiBhbGwgY2hpcHMsIGFuZAorICogdGhpcyBpcyBjaGVhcGVyIGFueXdheS4KKyAqLworc3RhdGljIGJvb2wgYXRtZWxfc3BpX2lzX3YyKHZvaWQpCit7CisJcmV0dXJuICFjcHVfaXNfYXQ5MXJtOTIwMCgpOworfQorCisvKgogICogRWFybGllciBTUEkgY29udHJvbGxlcnMgKGUuZy4gb24gYXQ5MXJtOTIwMCkgaGF2ZSBhIGRlc2lnbiBidWcgd2hlcmVieQogICogdGhleSBhc3N1bWUgdGhhdCBzcGkgc2xhdmUgZGV2aWNlIHN0YXRlIHdpbGwgbm90IGNoYW5nZSBvbiBkZXNlbGVjdCwgc28KICAqIHRoYXQgYXV0b21hZ2ljIGRlc2VsZWN0aW9uIGlzIE9LLiAgKCJOUENTeCByaXNlcyBpZiBubyBkYXRhIGlzIHRvIGJlCkBAIC04MCwzOSArOTUsNTggQEAKICAqIE1hc3RlciBvbiBDaGlwIFNlbGVjdCAwLiIpICBObyB3b3JrYXJvdW5kIGV4aXN0cyBmb3IgdGhhdCAuLi4gc28gZm9yCiAgKiBuQ1MwIG9uIHRoYXQgY2hpcCwgd2UgKGEpIGRvbid0IHVzZSB0aGUgR1BJTywgKGIpIGNhbid0IHN1cHBvcnQgQ1NfSElHSCwKICAqIGFuZCAoYykgd2lsbCB0cmlnZ2VyIHRoYXQgZmlyc3QgZXJyYXR1bSBpbiBzb21lIGNhc2VzLgorICoKKyAqIFRPRE86IFRlc3QgaWYgdGhlIGF0bWVsX3NwaV9pc192MigpIGJyYW5jaCBiZWxvdyB3b3JrcyBvbgorICogQVQ5MVJNOTIwMCBpZiB3ZSB1c2Ugc29tZSBvdGhlciByZWdpc3RlciB0aGFuIENTUjAuIEhvd2V2ZXIsIGRvbid0CisgKiBkbyB0aGlzIHVuY29uZGl0aW9uYWxseSBzaW5jZSBBUDcwMDAgaGFzIGFuIGVycmF0YSB3aGVyZSB0aGUgQklUUworICogZmllbGQgaW4gQ1NSMCBvdmVycmlkZXMgYWxsIG90aGVyIENTUnMuCiAgKi8KIAogc3RhdGljIHZvaWQgY3NfYWN0aXZhdGUoc3RydWN0IGF0bWVsX3NwaSAqYXMsIHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCiB7Ci0JdW5zaWduZWQgZ3BpbyA9ICh1bnNpZ25lZCkgc3BpLT5jb250cm9sbGVyX2RhdGE7CisJc3RydWN0IGF0bWVsX3NwaV9kZXZpY2UgKmFzZCA9IHNwaS0+Y29udHJvbGxlcl9zdGF0ZTsKIAl1bnNpZ25lZCBhY3RpdmUgPSBzcGktPm1vZGUgJiBTUElfQ1NfSElHSDsKIAl1MzIgbXI7Ci0JaW50IGk7Ci0JdTMyIGNzcjsKLQl1MzIgY3BvbCA9IChzcGktPm1vZGUgJiBTUElfQ1BPTCkgPyBTUElfQklUKENQT0wpIDogMDsKIAotCS8qIE1ha2Ugc3VyZSBjbG9jayBwb2xhcml0eSBpcyBjb3JyZWN0ICovCi0JZm9yIChpID0gMDsgaSA8IHNwaS0+bWFzdGVyLT5udW1fY2hpcHNlbGVjdDsgaSsrKSB7Ci0JCWNzciA9IHNwaV9yZWFkbChhcywgQ1NSMCArIDQgKiBpKTsKLQkJaWYgKChjc3IgXiBjcG9sKSAmIFNQSV9CSVQoQ1BPTCkpCi0JCQlzcGlfd3JpdGVsKGFzLCBDU1IwICsgNCAqIGksIGNzciBeIFNQSV9CSVQoQ1BPTCkpOworCWlmIChhdG1lbF9zcGlfaXNfdjIoKSkgeworCQkvKgorCQkgKiBBbHdheXMgdXNlIENTUjAuIFRoaXMgZW5zdXJlcyB0aGF0IHRoZSBjbG9jaworCQkgKiBzd2l0Y2hlcyB0byB0aGUgY29ycmVjdCBpZGxlIHBvbGFyaXR5IGJlZm9yZSB3ZQorCQkgKiB0b2dnbGUgdGhlIENTLgorCQkgKi8KKwkJc3BpX3dyaXRlbChhcywgQ1NSMCwgYXNkLT5jc3IpOworCQlzcGlfd3JpdGVsKGFzLCBNUiwgU1BJX0JGKFBDUywgMHgwZSkgfCBTUElfQklUKE1PREZESVMpCisJCQkJfCBTUElfQklUKE1TVFIpKTsKKwkJbXIgPSBzcGlfcmVhZGwoYXMsIE1SKTsKKwkJZ3Bpb19zZXRfdmFsdWUoYXNkLT5ucGNzX3BpbiwgYWN0aXZlKTsKKwl9IGVsc2UgeworCQl1MzIgY3BvbCA9IChzcGktPm1vZGUgJiBTUElfQ1BPTCkgPyBTUElfQklUKENQT0wpIDogMDsKKwkJaW50IGk7CisJCXUzMiBjc3I7CisKKwkJLyogTWFrZSBzdXJlIGNsb2NrIHBvbGFyaXR5IGlzIGNvcnJlY3QgKi8KKwkJZm9yIChpID0gMDsgaSA8IHNwaS0+bWFzdGVyLT5udW1fY2hpcHNlbGVjdDsgaSsrKSB7CisJCQljc3IgPSBzcGlfcmVhZGwoYXMsIENTUjAgKyA0ICogaSk7CisJCQlpZiAoKGNzciBeIGNwb2wpICYgU1BJX0JJVChDUE9MKSkKKwkJCQlzcGlfd3JpdGVsKGFzLCBDU1IwICsgNCAqIGksCisJCQkJCQljc3IgXiBTUElfQklUKENQT0wpKTsKKwkJfQorCisJCW1yID0gc3BpX3JlYWRsKGFzLCBNUik7CisJCW1yID0gU1BJX0JGSU5TKFBDUywgfigxIDw8IHNwaS0+Y2hpcF9zZWxlY3QpLCBtcik7CisJCWlmIChzcGktPmNoaXBfc2VsZWN0ICE9IDApCisJCQlncGlvX3NldF92YWx1ZShhc2QtPm5wY3NfcGluLCBhY3RpdmUpOworCQlzcGlfd3JpdGVsKGFzLCBNUiwgbXIpOwogCX0KIAotCW1yID0gc3BpX3JlYWRsKGFzLCBNUik7Ci0JbXIgPSBTUElfQkZJTlMoUENTLCB+KDEgPDwgc3BpLT5jaGlwX3NlbGVjdCksIG1yKTsKLQogCWRldl9kYmcoJnNwaS0+ZGV2LCAiYWN0aXZhdGUgJXUlcywgbXIgJTA4eFxuIiwKLQkJCWdwaW8sIGFjdGl2ZSA/ICIgKGhpZ2gpIiA6ICIiLAorCQkJYXNkLT5ucGNzX3BpbiwgYWN0aXZlID8gIiAoaGlnaCkiIDogIiIsCiAJCQltcik7Ci0KLQlpZiAoIShjcHVfaXNfYXQ5MXJtOTIwMCgpICYmIHNwaS0+Y2hpcF9zZWxlY3QgPT0gMCkpCi0JCWdwaW9fc2V0X3ZhbHVlKGdwaW8sIGFjdGl2ZSk7Ci0Jc3BpX3dyaXRlbChhcywgTVIsIG1yKTsKIH0KIAogc3RhdGljIHZvaWQgY3NfZGVhY3RpdmF0ZShzdHJ1Y3QgYXRtZWxfc3BpICphcywgc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKIHsKLQl1bnNpZ25lZCBncGlvID0gKHVuc2lnbmVkKSBzcGktPmNvbnRyb2xsZXJfZGF0YTsKKwlzdHJ1Y3QgYXRtZWxfc3BpX2RldmljZSAqYXNkID0gc3BpLT5jb250cm9sbGVyX3N0YXRlOwogCXVuc2lnbmVkIGFjdGl2ZSA9IHNwaS0+bW9kZSAmIFNQSV9DU19ISUdIOwogCXUzMiBtcjsKIApAQCAtMTI2LDExICsxNjAsMTEgQEAKIAl9CiAKIAlkZXZfZGJnKCZzcGktPmRldiwgIkRFYWN0aXZhdGUgJXUlcywgbXIgJTA4eFxuIiwKLQkJCWdwaW8sIGFjdGl2ZSA/ICIgKGxvdykiIDogIiIsCisJCQlhc2QtPm5wY3NfcGluLCBhY3RpdmUgPyAiIChsb3cpIiA6ICIiLAogCQkJbXIpOwogCi0JaWYgKCEoY3B1X2lzX2F0OTFybTkyMDAoKSAmJiBzcGktPmNoaXBfc2VsZWN0ID09IDApKQotCQlncGlvX3NldF92YWx1ZShncGlvLCAhYWN0aXZlKTsKKwlpZiAoYXRtZWxfc3BpX2lzX3YyKCkgfHwgc3BpLT5jaGlwX3NlbGVjdCAhPSAwKQorCQlncGlvX3NldF92YWx1ZShhc2QtPm5wY3NfcGluLCAhYWN0aXZlKTsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgYXRtZWxfc3BpX3hmZXJfaXNfbGFzdChzdHJ1Y3Qgc3BpX21lc3NhZ2UgKm1zZywKQEAgLTUwMiw2ICs1MzYsNyBAQAogc3RhdGljIGludCBhdG1lbF9zcGlfc2V0dXAoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKIHsKIAlzdHJ1Y3QgYXRtZWxfc3BpCSphczsKKwlzdHJ1Y3QgYXRtZWxfc3BpX2RldmljZQkqYXNkOwogCXUzMgkJCXNjYnIsIGNzcjsKIAl1bnNpZ25lZCBpbnQJCWJpdHMgPSBzcGktPmJpdHNfcGVyX3dvcmQ7CiAJdW5zaWduZWQgbG9uZwkJYnVzX2h6OwpAQCAtNTM2LDE5ICs1NzEsMTYgQEAKIAl9CiAKIAkvKiBzZWUgbm90ZXMgYWJvdmUgcmUgY2hpcHNlbGVjdCAqLwotCWlmIChjcHVfaXNfYXQ5MXJtOTIwMCgpCisJaWYgKCFhdG1lbF9zcGlfaXNfdjIoKQogCQkJJiYgc3BpLT5jaGlwX3NlbGVjdCA9PSAwCiAJCQkmJiAoc3BpLT5tb2RlICYgU1BJX0NTX0hJR0gpKSB7CiAJCWRldl9kYmcoJnNwaS0+ZGV2LCAic2V0dXA6IGNhbid0IGJlIGFjdGl2ZS1oaWdoXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JLyoKLQkgKiBQcmUtbmV3XzEgY2hpcHMgc3RhcnQgb3V0IGF0IGhhbGYgdGhlIHBlcmlwaGVyYWwKLQkgKiBidXMgc3BlZWQuCi0JICovCisJLyogdjEgY2hpcHMgc3RhcnQgb3V0IGF0IGhhbGYgdGhlIHBlcmlwaGVyYWwgYnVzIHNwZWVkLiAqLwogCWJ1c19oeiA9IGNsa19nZXRfcmF0ZShhcy0+Y2xrKTsKLQlpZiAoIWFzLT5uZXdfMSkKKwlpZiAoIWF0bWVsX3NwaV9pc192MigpKQogCQlidXNfaHogLz0gMjsKIAogCWlmIChzcGktPm1heF9zcGVlZF9oeikgewpAQCAtNTg5LDExICs2MjEsMjAgQEAKIAogCS8qIGNoaXBzZWxlY3QgbXVzdCBoYXZlIGJlZW4gbXV4ZWQgYXMgR1BJTyAoZS5nLiBpbiBib2FyZCBzZXR1cCkgKi8KIAlucGNzX3BpbiA9ICh1bnNpZ25lZCBpbnQpc3BpLT5jb250cm9sbGVyX2RhdGE7Ci0JaWYgKCFzcGktPmNvbnRyb2xsZXJfc3RhdGUpIHsKKwlhc2QgPSBzcGktPmNvbnRyb2xsZXJfc3RhdGU7CisJaWYgKCFhc2QpIHsKKwkJYXNkID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGF0bWVsX3NwaV9kZXZpY2UpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFhc2QpCisJCQlyZXR1cm4gLUVOT01FTTsKKwogCQlyZXQgPSBncGlvX3JlcXVlc3QobnBjc19waW4sIHNwaS0+ZGV2LmJ1c19pZCk7Ci0JCWlmIChyZXQpCisJCWlmIChyZXQpIHsKKwkJCWtmcmVlKGFzZCk7CiAJCQlyZXR1cm4gcmV0OwotCQlzcGktPmNvbnRyb2xsZXJfc3RhdGUgPSAodm9pZCAqKW5wY3NfcGluOworCQl9CisKKwkJYXNkLT5ucGNzX3BpbiA9IG5wY3NfcGluOworCQlzcGktPmNvbnRyb2xsZXJfc3RhdGUgPSBhc2Q7CiAJCWdwaW9fZGlyZWN0aW9uX291dHB1dChucGNzX3BpbiwgIShzcGktPm1vZGUgJiBTUElfQ1NfSElHSCkpOwogCX0gZWxzZSB7CiAJCXVuc2lnbmVkIGxvbmcJCWZsYWdzOwpAQCAtNjA1LDExICs2NDYsMTQgQEAKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXMtPmxvY2ssIGZsYWdzKTsKIAl9CiAKKwlhc2QtPmNzciA9IGNzcjsKKwogCWRldl9kYmcoJnNwaS0+ZGV2LAogCQkic2V0dXA6ICVsdSBIeiBicHcgJXUgbW9kZSAweCV4IC0+IGNzciVkICUwOHhcbiIsCiAJCWJ1c19oeiAvIHNjYnIsIGJpdHMsIHNwaS0+bW9kZSwgc3BpLT5jaGlwX3NlbGVjdCwgY3NyKTsKIAotCXNwaV93cml0ZWwoYXMsIENTUjAgKyA0ICogc3BpLT5jaGlwX3NlbGVjdCwgY3NyKTsKKwlpZiAoIWF0bWVsX3NwaV9pc192MigpKQorCQlzcGlfd3JpdGVsKGFzLCBDU1IwICsgNCAqIHNwaS0+Y2hpcF9zZWxlY3QsIGNzcik7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTY4NCwxMCArNzI4LDExIEBACiBzdGF0aWMgdm9pZCBhdG1lbF9zcGlfY2xlYW51cChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQogewogCXN0cnVjdCBhdG1lbF9zcGkJKmFzID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShzcGktPm1hc3Rlcik7CisJc3RydWN0IGF0bWVsX3NwaV9kZXZpY2UJKmFzZCA9IHNwaS0+Y29udHJvbGxlcl9zdGF0ZTsKIAl1bnNpZ25lZAkJZ3BpbyA9ICh1bnNpZ25lZCkgc3BpLT5jb250cm9sbGVyX2RhdGE7CiAJdW5zaWduZWQgbG9uZwkJZmxhZ3M7CiAKLQlpZiAoIXNwaS0+Y29udHJvbGxlcl9zdGF0ZSkKKwlpZiAoIWFzZCkKIAkJcmV0dXJuOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmFzLT5sb2NrLCBmbGFncyk7CkBAIC02OTcsNyArNzQyLDkgQEAKIAl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXMtPmxvY2ssIGZsYWdzKTsKIAorCXNwaS0+Y29udHJvbGxlcl9zdGF0ZSA9IE5VTEw7CiAJZ3Bpb19mcmVlKGdwaW8pOworCWtmcmVlKGFzZCk7CiB9CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCkBAIC03NTUsOCArODAyLDYgQEAKIAkJZ290byBvdXRfZnJlZV9idWZmZXI7CiAJYXMtPmlycSA9IGlycTsKIAlhcy0+Y2xrID0gY2xrOwotCWlmICghY3B1X2lzX2F0OTFybTkyMDAoKSkKLQkJYXMtPm5ld18xID0gMTsKIAogCXJldCA9IHJlcXVlc3RfaXJxKGlycSwgYXRtZWxfc3BpX2ludGVycnVwdCwgMCwKIAkJCXBkZXYtPmRldi5idXNfaWQsIG1hc3Rlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9weGEyeHhfc3BpLmMgYi9kcml2ZXJzL3NwaS9weGEyeHhfc3BpLmMKaW5kZXggNjEwNGY0Ni4uZDBmYzRjYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvcHhhMnh4X3NwaS5jCisrKyBiL2RyaXZlcnMvc3BpL3B4YTJ4eF9zcGkuYwpAQCAtMTU2MSwxMSArMTU2MSwxMiBAQAogc3RhdGljIGludCBweGEyeHhfc3BpX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXN0cnVjdCBkcml2ZXJfZGF0YSAqZHJ2X2RhdGEgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQlzdHJ1Y3Qgc3NwX2RldmljZSAqc3NwID0gZHJ2X2RhdGEtPnNzcDsKKwlzdHJ1Y3Qgc3NwX2RldmljZSAqc3NwOwogCWludCBzdGF0dXMgPSAwOwogCiAJaWYgKCFkcnZfZGF0YSkKIAkJcmV0dXJuIDA7CisJc3NwID0gZHJ2X2RhdGEtPnNzcDsKIAogCS8qIFJlbW92ZSB0aGUgcXVldWUgKi8KIAlzdGF0dXMgPSBkZXN0cm95X3F1ZXVlKGRydl9kYXRhKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS5jIGIvZHJpdmVycy9zcGkvc3BpLmMKaW5kZXggMzczNGRjOS4uNjQzOTA4YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLmMKKysrIGIvZHJpdmVycy9zcGkvc3BpLmMKQEAgLTQ3LDcgKzQ3LDcgQEAKIHsKIAljb25zdCBzdHJ1Y3Qgc3BpX2RldmljZQkqc3BpID0gdG9fc3BpX2RldmljZShkZXYpOwogCi0JcmV0dXJuIHNucHJpbnRmKGJ1ZiwgQlVTX0lEX1NJWkUgKyAxLCAiJXNcbiIsIHNwaS0+bW9kYWxpYXMpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVzXG4iLCBzcGktPm1vZGFsaWFzKTsKIH0KIAogc3RhdGljIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIHNwaV9kZXZfYXR0cnNbXSA9IHsKQEAgLTYzLDcgKzYzLDcgQEAKIHsKIAljb25zdCBzdHJ1Y3Qgc3BpX2RldmljZQkqc3BpID0gdG9fc3BpX2RldmljZShkZXYpOwogCi0JcmV0dXJuIHN0cm5jbXAoc3BpLT5tb2RhbGlhcywgZHJ2LT5uYW1lLCBCVVNfSURfU0laRSkgPT0gMDsKKwlyZXR1cm4gc3RyY21wKHNwaS0+bW9kYWxpYXMsIGRydi0+bmFtZSkgPT0gMDsKIH0KIAogc3RhdGljIGludCBzcGlfdWV2ZW50KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGtvYmpfdWV2ZW50X2VudiAqZW52KQpAQCAtMjQzLDggKzI0Myw3IEBACiAJfQogCiAJLyogU2V0IHRoZSBidXMgSUQgc3RyaW5nICovCi0Jc25wcmludGYoc3BpLT5kZXYuYnVzX2lkLCBzaXplb2Ygc3BpLT5kZXYuYnVzX2lkLAotCQkJIiVzLiV1Iiwgc3BpLT5tYXN0ZXItPmRldi5idXNfaWQsCisJZGV2X3NldF9uYW1lKCZzcGktPmRldiwgIiVzLiV1IiwgZGV2X25hbWUoJnNwaS0+bWFzdGVyLT5kZXYpLAogCQkJc3BpLT5jaGlwX3NlbGVjdCk7CiAKIApAQCAtMjU0LDcgKzI1Myw3IEBACiAJICovCiAJbXV0ZXhfbG9jaygmc3BpX2FkZF9sb2NrKTsKIAotCWlmIChidXNfZmluZF9kZXZpY2VfYnlfbmFtZSgmc3BpX2J1c190eXBlLCBOVUxMLCBzcGktPmRldi5idXNfaWQpCisJaWYgKGJ1c19maW5kX2RldmljZV9ieV9uYW1lKCZzcGlfYnVzX3R5cGUsIE5VTEwsIGRldl9uYW1lKCZzcGktPmRldikpCiAJCQkhPSBOVUxMKSB7CiAJCWRldl9lcnIoZGV2LCAiY2hpcHNlbGVjdCAlZCBhbHJlYWR5IGluIHVzZVxuIiwKIAkJCQlzcGktPmNoaXBfc2VsZWN0KTsKQEAgLTI2OSw3ICsyNjgsNyBAQAogCXN0YXR1cyA9IHNwaS0+bWFzdGVyLT5zZXR1cChzcGkpOwogCWlmIChzdGF0dXMgPCAwKSB7CiAJCWRldl9lcnIoZGV2LCAiY2FuJ3QgJXMgJXMsIHN0YXR1cyAlZFxuIiwKLQkJCQkic2V0dXAiLCBzcGktPmRldi5idXNfaWQsIHN0YXR1cyk7CisJCQkJInNldHVwIiwgZGV2X25hbWUoJnNwaS0+ZGV2KSwgc3RhdHVzKTsKIAkJZ290byBkb25lOwogCX0KIApAQCAtMjc3LDkgKzI3Niw5IEBACiAJc3RhdHVzID0gZGV2aWNlX2FkZCgmc3BpLT5kZXYpOwogCWlmIChzdGF0dXMgPCAwKQogCQlkZXZfZXJyKGRldiwgImNhbid0ICVzICVzLCBzdGF0dXMgJWRcbiIsCi0JCQkJImFkZCIsIHNwaS0+ZGV2LmJ1c19pZCwgc3RhdHVzKTsKKwkJCQkiYWRkIiwgZGV2X25hbWUoJnNwaS0+ZGV2KSwgc3RhdHVzKTsKIAllbHNlCi0JCWRldl9kYmcoZGV2LCAicmVnaXN0ZXJlZCBjaGlsZCAlc1xuIiwgc3BpLT5kZXYuYnVzX2lkKTsKKwkJZGV2X2RiZyhkZXYsICJyZWdpc3RlcmVkIGNoaWxkICVzXG4iLCBkZXZfbmFtZSgmc3BpLT5kZXYpKTsKIAogZG9uZToKIAltdXRleF91bmxvY2soJnNwaV9hZGRfbG9jayk7CkBAIC01MDQsMTIgKzUwMywxMSBAQAogCS8qIHJlZ2lzdGVyIHRoZSBkZXZpY2UsIHRoZW4gdXNlcnNwYWNlIHdpbGwgc2VlIGl0LgogCSAqIHJlZ2lzdHJhdGlvbiBmYWlscyBpZiB0aGUgYnVzIElEIGlzIGluIHVzZS4KIAkgKi8KLQlzbnByaW50ZihtYXN0ZXItPmRldi5idXNfaWQsIHNpemVvZiBtYXN0ZXItPmRldi5idXNfaWQsCi0JCSJzcGkldSIsIG1hc3Rlci0+YnVzX251bSk7CisJZGV2X3NldF9uYW1lKCZtYXN0ZXItPmRldiwgInNwaSV1IiwgbWFzdGVyLT5idXNfbnVtKTsKIAlzdGF0dXMgPSBkZXZpY2VfYWRkKCZtYXN0ZXItPmRldik7CiAJaWYgKHN0YXR1cyA8IDApCiAJCWdvdG8gZG9uZTsKLQlkZXZfZGJnKGRldiwgInJlZ2lzdGVyZWQgbWFzdGVyICVzJXNcbiIsIG1hc3Rlci0+ZGV2LmJ1c19pZCwKKwlkZXZfZGJnKGRldiwgInJlZ2lzdGVyZWQgbWFzdGVyICVzJXNcbiIsIGRldl9uYW1lKCZtYXN0ZXItPmRldiksCiAJCQlkeW5hbWljID8gIiAoZHluYW1pYykiIDogIiIpOwogCiAJLyogcG9wdWxhdGUgY2hpbGRyZW4gZnJvbSBhbnkgc3BpIGRldmljZSB0YWJsZXMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaV9iaXRiYW5nLmMgYi9kcml2ZXJzL3NwaS9zcGlfYml0YmFuZy5jCmluZGV4IDk2Y2MzOWUuLjg1ZTYxZjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaV9iaXRiYW5nLmMKKysrIGIvZHJpdmVycy9zcGkvc3BpX2JpdGJhbmcuYwpAQCAtNDc1LDcgKzQ3NSw3IEBACiAJLyogdGhpcyB0YXNrIGlzIHRoZSBvbmx5IHRoaW5nIHRvIHRvdWNoIHRoZSBTUEkgYml0cyAqLwogCWJpdGJhbmctPmJ1c3kgPSAwOwogCWJpdGJhbmctPndvcmtxdWV1ZSA9IGNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlKAotCQkJYml0YmFuZy0+bWFzdGVyLT5kZXYucGFyZW50LT5idXNfaWQpOworCQkJZGV2X25hbWUoYml0YmFuZy0+bWFzdGVyLT5kZXYucGFyZW50KSk7CiAJaWYgKGJpdGJhbmctPndvcmtxdWV1ZSA9PSBOVUxMKSB7CiAJCXN0YXR1cyA9IC1FQlVTWTsKIAkJZ290byBlcnIxOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpX2J1dHRlcmZseS5jIGIvZHJpdmVycy9zcGkvc3BpX2J1dHRlcmZseS5jCmluZGV4IDBlZTJiMjAuLmMyMTg0ODYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaV9idXR0ZXJmbHkuYworKysgYi9kcml2ZXJzL3NwaS9zcGlfYnV0dGVyZmx5LmMKQEAgLTI4Nyw3ICsyODcsNyBAQAogCXBwLT5kYXRhZmxhc2ggPSBzcGlfbmV3X2RldmljZShwcC0+Yml0YmFuZy5tYXN0ZXIsICZwcC0+aW5mb1swXSk7CiAJaWYgKHBwLT5kYXRhZmxhc2gpCiAJCXByX2RlYnVnKCIlczogZGF0YWZsYXNoIGF0ICVzXG4iLCBwLT5uYW1lLAotCQkJCXBwLT5kYXRhZmxhc2gtPmRldi5idXNfaWQpOworCQkJCWRldl9uYW1lKCZwcC0+ZGF0YWZsYXNoLT5kZXYpKTsKIAogCS8vIGRldl9pbmZvKF93aGF0P18sIC4uLikKIAlwcl9pbmZvKCIlczogQVZSIEJ1dHRlcmZseVxuIiwgcC0+bmFtZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGlfZ3Bpby5jIGIvZHJpdmVycy9zcGkvc3BpX2dwaW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTY5OGNhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zcGkvc3BpX2dwaW8uYwpAQCAtMCwwICsxLDM2MCBAQAorLyoKKyAqIHNwaV9ncGlvLmMgLSBTUEkgbWFzdGVyIGRyaXZlciB1c2luZyBnZW5lcmljIGJpdGJhbmdlZCBHUElPCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA2LDIwMDggRGF2aWQgQnJvd25lbGwKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisKKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaV9iaXRiYW5nLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaV9ncGlvLmg+CisKKworLyoKKyAqIFRoaXMgYml0YmFuZ2luZyBTUEkgbWFzdGVyIGRyaXZlciBzaG91bGQgaGVscCBtYWtlIHN5c3RlbXMgdXNhYmxlCisgKiB3aGVuIGEgbmF0aXZlIGhhcmR3YXJlIFNQSSBlbmdpbmUgaXMgbm90IGF2YWlsYWJsZSwgcGVyaGFwcyBiZWNhdXNlCisgKiBpdHMgZHJpdmVyIGlzbid0IHlldCB3b3JraW5nIG9yIGJlY2F1c2UgdGhlIEkvTyBwaW5zIGl0IHJlcXVpcmVzCisgKiBhcmUgdXNlZCBmb3Igb3RoZXIgcHVycG9zZXMuCisgKgorICogcGxhdGZvcm1fZGV2aWNlLT5kcml2ZXJfZGF0YSAuLi4gcG9pbnRzIHRvIHNwaV9ncGlvCisgKgorICogc3BpLT5jb250cm9sbGVyX3N0YXRlIC4uLiByZXNlcnZlZCBmb3IgYml0YmFuZyBmcmFtZXdvcmsgY29kZQorICogc3BpLT5jb250cm9sbGVyX2RhdGEgLi4uIGhvbGRzIGNoaXBzZWxlY3QgR1BJTworICoKKyAqIHNwaS0+bWFzdGVyLT5kZXYuZHJpdmVyX2RhdGEgLi4uIHBvaW50cyB0byBzcGlfZ3Bpby0+Yml0YmFuZworICovCisKK3N0cnVjdCBzcGlfZ3BpbyB7CisJc3RydWN0IHNwaV9iaXRiYW5nCQliaXRiYW5nOworCXN0cnVjdCBzcGlfZ3Bpb19wbGF0Zm9ybV9kYXRhCXBkYXRhOworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UJCSpwZGV2OworfTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoKKyAqIEJlY2F1c2UgdGhlIG92ZXJoZWFkIG9mIGdvaW5nIHRocm91Z2ggZm91ciBHUElPIHByb2NlZHVyZSBjYWxscworICogcGVyIHRyYW5zZmVycmVkIGJpdCBjYW4gbWFrZSBwZXJmb3JtYW5jZSBhIHByb2JsZW0sIHRoaXMgY29kZQorICogaXMgc2V0IHVwIHNvIHRoYXQgeW91IGNhbiB1c2UgaXQgaW4gZWl0aGVyIG9mIHR3byB3YXlzOgorICoKKyAqICAgLSBUaGUgc2xvdyBnZW5lcmljIHdheTogIHNldCB1cCBwbGF0Zm9ybV9kYXRhIHRvIGhvbGQgdGhlIEdQSU8KKyAqICAgICBudW1iZXJzIHVzZWQgZm9yIE1JU08vTU9TSS9TQ0ssIGFuZCBpc3N1ZSBwcm9jZWR1cmUgY2FsbHMgZm9yCisgKiAgICAgZWFjaCBvZiB0aGVtLiAgVGhpcyBkcml2ZXIgY2FuIGhhbmRsZSBzZXZlcmFsIHN1Y2ggYnVzc2VzLgorICoKKyAqICAgLSBUaGUgcXVpY2tlciBpbmxpbmVkIHdheTogIG9ubHkgaGVscHMgd2l0aCBwbGF0Zm9ybSBHUElPIGNvZGUKKyAqICAgICB0aGF0IGlubGluZXMgb3BlcmF0aW9ucyBmb3IgY29uc3RhbnQgR1BJT3MuICBUaGlzIGNhbiBnaXZlCisgKiAgICAgeW91IHRpZ2h0IChmYXN0ISkgaW5uZXIgbG9vcHMsIGJ1dCBlYWNoIHN1Y2ggYnVzIG5lZWRzIGEKKyAqICAgICBuZXcgZHJpdmVyLiAgWW91J2xsIGRlZmluZSBhIG5ldyBDIGZpbGUsIHdpdGggTWFrZWZpbGUgYW5kCisgKiAgICAgS2NvbmZpZyBzdXBwb3J0OyB0aGUgQyBjb2RlIGNhbiBiZSBhIHRvdGFsIG9mIHNpeCBsaW5lczoKKyAqCisgKgkJI2RlZmluZSBEUklWRVJfTkFNRQkibXlib2FyZF9zcGkyIgorICoJCSNkZWZpbmUJU1BJX01JU09fR1BJTwkxMTkKKyAqCQkjZGVmaW5lCVNQSV9NT1NJX0dQSU8JMTIwCisgKgkJI2RlZmluZQlTUElfU0NLX0dQSU8JMTIxCisgKgkJI2RlZmluZQlTUElfTl9DSElQU0VMCTQKKyAqCQkjaW5jbHVkZSAic3BpX2dwaW8uYyIKKyAqLworCisjaWZuZGVmIERSSVZFUl9OQU1FCisjZGVmaW5lIERSSVZFUl9OQU1FCSJzcGlfZ3BpbyIKKworI2RlZmluZSBHRU5FUklDX0JJVEJBTkcJLyogdnMgdGlnaHQgaW5saW5lcyAqLworCisvKiBhbGwgZnVuY3Rpb25zIHJlZmVyZW5jaW5nIHRoZXNlIHN5bWJvbHMgbXVzdCBkZWZpbmUgcGRhdGEgKi8KKyNkZWZpbmUgU1BJX01JU09fR1BJTwkoKHBkYXRhKS0+bWlzbykKKyNkZWZpbmUgU1BJX01PU0lfR1BJTwkoKHBkYXRhKS0+bW9zaSkKKyNkZWZpbmUgU1BJX1NDS19HUElPCSgocGRhdGEpLT5zY2spCisKKyNkZWZpbmUgU1BJX05fQ0hJUFNFTAkoKHBkYXRhKS0+bnVtX2NoaXBzZWxlY3QpCisKKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaW5saW5lIGNvbnN0IHN0cnVjdCBzcGlfZ3Bpb19wbGF0Zm9ybV9kYXRhICogX19wdXJlCitzcGlfdG9fcGRhdGEoY29uc3Qgc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwljb25zdCBzdHJ1Y3Qgc3BpX2JpdGJhbmcJKmJhbmc7CisJY29uc3Qgc3RydWN0IHNwaV9ncGlvCQkqc3BpX2dwaW87CisKKwliYW5nID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShzcGktPm1hc3Rlcik7CisJc3BpX2dwaW8gPSBjb250YWluZXJfb2YoYmFuZywgc3RydWN0IHNwaV9ncGlvLCBiaXRiYW5nKTsKKwlyZXR1cm4gJnNwaV9ncGlvLT5wZGF0YTsKK30KKworLyogdGhpcyBpcyAjZGVmaW5lZCB0byBhdm9pZCB1bnVzZWQtdmFyaWFibGUgd2FybmluZ3Mgd2hlbiBpbmxpbmluZyAqLworI2RlZmluZSBwZGF0YQkJc3BpX3RvX3BkYXRhKHNwaSkKKworc3RhdGljIGlubGluZSB2b2lkIHNldHNjayhjb25zdCBzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBpbnQgaXNfb24pCit7CisJZ3Bpb19zZXRfdmFsdWUoU1BJX1NDS19HUElPLCBpc19vbik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRtb3NpKGNvbnN0IHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIGludCBpc19vbikKK3sKKwlncGlvX3NldF92YWx1ZShTUElfTU9TSV9HUElPLCBpc19vbik7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGdldG1pc28oY29uc3Qgc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlyZXR1cm4gZ3Bpb19nZXRfdmFsdWUoU1BJX01JU09fR1BJTyk7Cit9CisKKyN1bmRlZiBwZGF0YQorCisvKgorICogTk9URTogIHRoaXMgY2xvY2tzICJhcyBmYXN0IGFzIHdlIGNhbiIuICBJdCAic2hvdWxkIiBiZSBhIGZ1bmN0aW9uIG9mIHRoZQorICogcmVxdWVzdGVkIGRldmljZSBjbG9jay4gIFNvZnR3YXJlIG92ZXJoZWFkIG1lYW5zIHdlIHVzdWFsbHkgaGF2ZSB0cm91YmxlCisgKiByZWFjaGluZyBldmVuIG9uZSBNYml0L3NlYyAoZXhjZXB0IHdoZW4gd2UgY2FuIGlubGluZSBiaXRvcHMpLCBzbyBmb3Igbm93CisgKiB3ZSdsbCBqdXN0IGFzc3VtZSB3ZSBuZXZlciBuZWVkIGFkZGl0aW9uYWwgcGVyLWJpdCBzbG93ZG93bnMuCisgKi8KKyNkZWZpbmUgc3BpZGVsYXkobnNlY3MpCWRvIHt9IHdoaWxlICgwKQorCisjZGVmaW5lCUVYUEFORF9CSVRCQU5HX1RYUlgKKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpX2JpdGJhbmcuaD4KKworLyoKKyAqIFRoZXNlIGZ1bmN0aW9ucyBjYW4gbGV2ZXJhZ2UgaW5saW5lIGV4cGFuc2lvbiBvZiBHUElPIGNhbGxzIHRvIHNocmluaworICogY29zdHMgZm9yIGEgdHhyeCBiaXQsIG9mdGVuIGJ5IGZhY3RvcnMgb2YgYXJvdW5kIHRlbiAoYnkgaW5zdHJ1Y3Rpb24KKyAqIGNvdW50KS4gIFRoYXQgaXMgcGFydGljdWxhcmx5IHZpc2libGUgZm9yIGxhcmdlciB3b3JkIHNpemVzLCBidXQgaGVscHMKKyAqIGV2ZW4gd2l0aCBkZWZhdWx0IDgtYml0IHdvcmRzLgorICoKKyAqIFJFVklTSVQgb3ZlcmhlYWRzIGNhbGxpbmcgdGhlc2UgZnVuY3Rpb25zIGZvciBlYWNoIHdvcmQgYWxzbyBoYXZlCisgKiBzaWduaWZpY2FudCBwZXJmb3JtYW5jZSBjb3N0cy4gIEhhdmluZyB0eHJ4X2J1ZnMoKSBjYWxscyB0aGF0IGlubGluZQorICogdGhlIHR4cnhfd29yZCgpIGxvZ2ljIHdvdWxkIGhlbHAgcGVyZm9ybWFuY2UsIGUuZy4gb24gbGFyZ2VyIGJsb2NrcworICogdXNlZCB3aXRoIGZsYXNoIHN0b3JhZ2Ugb3IgTU1DL1NELiAgVGhlcmUgc2hvdWxkIGFsc28gYmUgd2F5cyB0byBtYWtlCisgKiBHQ0MgYmUgbGVzcyBzdHVwaWQgYWJvdXQgcmVsb2FkaW5nIHJlZ2lzdGVycyBpbnNpZGUgdGhlIEkvTyBsb29wcywKKyAqIGV2ZW4gd2l0aG91dCBpbmxpbmVkIEdQSU8gY2FsbHM7IF9fYXR0cmlidXRlX18oKGhvdCkpIG9uIEdDQyA0LjM/CisgKi8KKworc3RhdGljIHUzMiBzcGlfZ3Bpb190eHJ4X3dvcmRfbW9kZTAoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwKKwkJdW5zaWduZWQgbnNlY3MsIHUzMiB3b3JkLCB1OCBiaXRzKQoreworCXJldHVybiBiaXRiYW5nX3R4cnhfYmVfY3BoYTAoc3BpLCBuc2VjcywgMCwgd29yZCwgYml0cyk7Cit9CisKK3N0YXRpYyB1MzIgc3BpX2dwaW9fdHhyeF93b3JkX21vZGUxKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksCisJCXVuc2lnbmVkIG5zZWNzLCB1MzIgd29yZCwgdTggYml0cykKK3sKKwlyZXR1cm4gYml0YmFuZ190eHJ4X2JlX2NwaGExKHNwaSwgbnNlY3MsIDAsIHdvcmQsIGJpdHMpOworfQorCitzdGF0aWMgdTMyIHNwaV9ncGlvX3R4cnhfd29yZF9tb2RlMihzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLAorCQl1bnNpZ25lZCBuc2VjcywgdTMyIHdvcmQsIHU4IGJpdHMpCit7CisJcmV0dXJuIGJpdGJhbmdfdHhyeF9iZV9jcGhhMChzcGksIG5zZWNzLCAxLCB3b3JkLCBiaXRzKTsKK30KKworc3RhdGljIHUzMiBzcGlfZ3Bpb190eHJ4X3dvcmRfbW9kZTMoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwKKwkJdW5zaWduZWQgbnNlY3MsIHUzMiB3b3JkLCB1OCBiaXRzKQoreworCXJldHVybiBiaXRiYW5nX3R4cnhfYmVfY3BoYTEoc3BpLCBuc2VjcywgMSwgd29yZCwgYml0cyk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyB2b2lkIHNwaV9ncGlvX2NoaXBzZWxlY3Qoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgaW50IGlzX2FjdGl2ZSkKK3sKKwl1bnNpZ25lZCBsb25nIGNzID0gKHVuc2lnbmVkIGxvbmcpIHNwaS0+Y29udHJvbGxlcl9kYXRhOworCisJLyogc2V0IGluaXRpYWwgY2xvY2sgcG9sYXJpdHkgKi8KKwlpZiAoaXNfYWN0aXZlKQorCQlzZXRzY2soc3BpLCBzcGktPm1vZGUgJiBTUElfQ1BPTCk7CisKKwkvKiBTUEkgaXMgbm9ybWFsbHkgYWN0aXZlLWxvdyAqLworCWdwaW9fc2V0X3ZhbHVlKGNzLCAoc3BpLT5tb2RlICYgU1BJX0NTX0hJR0gpID8gaXNfYWN0aXZlIDogIWlzX2FjdGl2ZSk7Cit9CisKK3N0YXRpYyBpbnQgc3BpX2dwaW9fc2V0dXAoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwl1bnNpZ25lZCBsb25nCWNzID0gKHVuc2lnbmVkIGxvbmcpIHNwaS0+Y29udHJvbGxlcl9kYXRhOworCWludAkJc3RhdHVzID0gMDsKKworCWlmIChzcGktPmJpdHNfcGVyX3dvcmQgPiAzMikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoIXNwaS0+Y29udHJvbGxlcl9zdGF0ZSkgeworCQlzdGF0dXMgPSBncGlvX3JlcXVlc3QoY3MsIHNwaS0+ZGV2LmJ1c19pZCk7CisJCWlmIChzdGF0dXMpCisJCQlyZXR1cm4gc3RhdHVzOworCQlzdGF0dXMgPSBncGlvX2RpcmVjdGlvbl9vdXRwdXQoY3MsIHNwaS0+bW9kZSAmIFNQSV9DU19ISUdIKTsKKwl9CisJaWYgKCFzdGF0dXMpCisJCXN0YXR1cyA9IHNwaV9iaXRiYW5nX3NldHVwKHNwaSk7CisJaWYgKHN0YXR1cykgeworCQlpZiAoIXNwaS0+Y29udHJvbGxlcl9zdGF0ZSkKKwkJCWdwaW9fZnJlZShjcyk7CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyB2b2lkIHNwaV9ncGlvX2NsZWFudXAoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwl1bnNpZ25lZCBsb25nCWNzID0gKHVuc2lnbmVkIGxvbmcpIHNwaS0+Y29udHJvbGxlcl9kYXRhOworCisJZ3Bpb19mcmVlKGNzKTsKKwlzcGlfYml0YmFuZ19jbGVhbnVwKHNwaSk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHNwaV9ncGlvX2FsbG9jKHVuc2lnbmVkIHBpbiwgY29uc3QgY2hhciAqbGFiZWwsIGJvb2wgaXNfaW4pCit7CisJaW50IHZhbHVlOworCisJdmFsdWUgPSBncGlvX3JlcXVlc3QocGluLCBsYWJlbCk7CisJaWYgKHZhbHVlID09IDApIHsKKwkJaWYgKGlzX2luKQorCQkJdmFsdWUgPSBncGlvX2RpcmVjdGlvbl9pbnB1dChwaW4pOworCQllbHNlCisJCQl2YWx1ZSA9IGdwaW9fZGlyZWN0aW9uX291dHB1dChwaW4sIDApOworCX0KKwlyZXR1cm4gdmFsdWU7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0CitzcGlfZ3Bpb19yZXF1ZXN0KHN0cnVjdCBzcGlfZ3Bpb19wbGF0Zm9ybV9kYXRhICpwZGF0YSwgY29uc3QgY2hhciAqbGFiZWwpCit7CisJaW50IHZhbHVlOworCisJLyogTk9URTogIFNQSV8qX0dQSU8gc3ltYm9scyBtYXkgcmVmZXJlbmNlICJwZGF0YSIgKi8KKworCXZhbHVlID0gc3BpX2dwaW9fYWxsb2MoU1BJX01PU0lfR1BJTywgbGFiZWwsIGZhbHNlKTsKKwlpZiAodmFsdWUpCisJCWdvdG8gZG9uZTsKKworCXZhbHVlID0gc3BpX2dwaW9fYWxsb2MoU1BJX01JU09fR1BJTywgbGFiZWwsIHRydWUpOworCWlmICh2YWx1ZSkKKwkJZ290byBmcmVlX21vc2k7CisKKwl2YWx1ZSA9IHNwaV9ncGlvX2FsbG9jKFNQSV9TQ0tfR1BJTywgbGFiZWwsIGZhbHNlKTsKKwlpZiAodmFsdWUpCisJCWdvdG8gZnJlZV9taXNvOworCisJZ290byBkb25lOworCitmcmVlX21pc286CisJZ3Bpb19mcmVlKFNQSV9NSVNPX0dQSU8pOworZnJlZV9tb3NpOgorCWdwaW9fZnJlZShTUElfTU9TSV9HUElPKTsKK2RvbmU6CisJcmV0dXJuIHZhbHVlOworfQorCitzdGF0aWMgaW50IF9faW5pdCBzcGlfZ3Bpb19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCWludAkJCQlzdGF0dXM7CisJc3RydWN0IHNwaV9tYXN0ZXIJCSptYXN0ZXI7CisJc3RydWN0IHNwaV9ncGlvCQkJKnNwaV9ncGlvOworCXN0cnVjdCBzcGlfZ3Bpb19wbGF0Zm9ybV9kYXRhCSpwZGF0YTsKKworCXBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisjaWZkZWYgR0VORVJJQ19CSVRCQU5HCisJaWYgKCFwZGF0YSB8fCAhcGRhdGEtPm51bV9jaGlwc2VsZWN0KQorCQlyZXR1cm4gLUVOT0RFVjsKKyNlbmRpZgorCisJc3RhdHVzID0gc3BpX2dwaW9fcmVxdWVzdChwZGF0YSwgZGV2X25hbWUoJnBkZXYtPmRldikpOworCWlmIChzdGF0dXMgPCAwKQorCQlyZXR1cm4gc3RhdHVzOworCisJbWFzdGVyID0gc3BpX2FsbG9jX21hc3RlcigmcGRldi0+ZGV2LCBzaXplb2YgKnNwaV9ncGlvKTsKKwlpZiAoIW1hc3RlcikgeworCQlzdGF0dXMgPSAtRU5PTUVNOworCQlnb3RvIGdwaW9fZnJlZTsKKwl9CisJc3BpX2dwaW8gPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgc3BpX2dwaW8pOworCisJc3BpX2dwaW8tPnBkZXYgPSBwZGV2OworCWlmIChwZGF0YSkKKwkJc3BpX2dwaW8tPnBkYXRhID0gKnBkYXRhOworCisJbWFzdGVyLT5idXNfbnVtID0gcGRldi0+aWQ7CisJbWFzdGVyLT5udW1fY2hpcHNlbGVjdCA9IFNQSV9OX0NISVBTRUw7CisJbWFzdGVyLT5zZXR1cCA9IHNwaV9ncGlvX3NldHVwOworCW1hc3Rlci0+Y2xlYW51cCA9IHNwaV9ncGlvX2NsZWFudXA7CisKKwlzcGlfZ3Bpby0+Yml0YmFuZy5tYXN0ZXIgPSBzcGlfbWFzdGVyX2dldChtYXN0ZXIpOworCXNwaV9ncGlvLT5iaXRiYW5nLmNoaXBzZWxlY3QgPSBzcGlfZ3Bpb19jaGlwc2VsZWN0OworCXNwaV9ncGlvLT5iaXRiYW5nLnR4cnhfd29yZFtTUElfTU9ERV8wXSA9IHNwaV9ncGlvX3R4cnhfd29yZF9tb2RlMDsKKwlzcGlfZ3Bpby0+Yml0YmFuZy50eHJ4X3dvcmRbU1BJX01PREVfMV0gPSBzcGlfZ3Bpb190eHJ4X3dvcmRfbW9kZTE7CisJc3BpX2dwaW8tPmJpdGJhbmcudHhyeF93b3JkW1NQSV9NT0RFXzJdID0gc3BpX2dwaW9fdHhyeF93b3JkX21vZGUyOworCXNwaV9ncGlvLT5iaXRiYW5nLnR4cnhfd29yZFtTUElfTU9ERV8zXSA9IHNwaV9ncGlvX3R4cnhfd29yZF9tb2RlMzsKKwlzcGlfZ3Bpby0+Yml0YmFuZy5zZXR1cF90cmFuc2ZlciA9IHNwaV9iaXRiYW5nX3NldHVwX3RyYW5zZmVyOworCXNwaV9ncGlvLT5iaXRiYW5nLmZsYWdzID0gU1BJX0NTX0hJR0g7CisKKwlzdGF0dXMgPSBzcGlfYml0YmFuZ19zdGFydCgmc3BpX2dwaW8tPmJpdGJhbmcpOworCWlmIChzdGF0dXMgPCAwKSB7CisJCXNwaV9tYXN0ZXJfcHV0KHNwaV9ncGlvLT5iaXRiYW5nLm1hc3Rlcik7CitncGlvX2ZyZWU6CisJCWdwaW9fZnJlZShTUElfTUlTT19HUElPKTsKKwkJZ3Bpb19mcmVlKFNQSV9NT1NJX0dQSU8pOworCQlncGlvX2ZyZWUoU1BJX1NDS19HUElPKTsKKwkJc3BpX21hc3Rlcl9wdXQobWFzdGVyKTsKKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IF9fZXhpdCBzcGlfZ3Bpb19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3Qgc3BpX2dwaW8JCQkqc3BpX2dwaW87CisJc3RydWN0IHNwaV9ncGlvX3BsYXRmb3JtX2RhdGEJKnBkYXRhOworCWludAkJCQlzdGF0dXM7CisKKwlzcGlfZ3BpbyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisKKwkvKiBzdG9wKCkgdW5yZWdpc3RlcnMgY2hpbGQgZGV2aWNlcyB0b28gKi8KKwlzdGF0dXMgPSBzcGlfYml0YmFuZ19zdG9wKCZzcGlfZ3Bpby0+Yml0YmFuZyk7CisJc3BpX21hc3Rlcl9wdXQoc3BpX2dwaW8tPmJpdGJhbmcubWFzdGVyKTsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCisJZ3Bpb19mcmVlKFNQSV9NSVNPX0dQSU8pOworCWdwaW9fZnJlZShTUElfTU9TSV9HUElPKTsKKwlncGlvX2ZyZWUoU1BJX1NDS19HUElPKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKK01PRFVMRV9BTElBUygicGxhdGZvcm06IiBEUklWRVJfTkFNRSk7CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHNwaV9ncGlvX2RyaXZlciA9IHsKKwkuZHJpdmVyLm5hbWUJPSBEUklWRVJfTkFNRSwKKwkuZHJpdmVyLm93bmVyCT0gVEhJU19NT0RVTEUsCisJLnJlbW92ZQkJPSBfX2V4aXRfcChzcGlfZ3Bpb19yZW1vdmUpLAorfTsKKworc3RhdGljIGludCBfX2luaXQgc3BpX2dwaW9faW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcHJvYmUoJnNwaV9ncGlvX2RyaXZlciwgc3BpX2dwaW9fcHJvYmUpOworfQorbW9kdWxlX2luaXQoc3BpX2dwaW9faW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBzcGlfZ3Bpb19leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnNwaV9ncGlvX2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdChzcGlfZ3Bpb19leGl0KTsKKworCitNT0RVTEVfREVTQ1JJUFRJT04oIlNQSSBtYXN0ZXIgZHJpdmVyIHVzaW5nIGdlbmVyaWMgYml0YmFuZ2VkIEdQSU8gIik7CitNT0RVTEVfQVVUSE9SKCJEYXZpZCBCcm93bmVsbCIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpX2xtNzBsbHAuYyBiL2RyaXZlcnMvc3BpL3NwaV9sbTcwbGxwLmMKaW5kZXggMzlkOGQ4YS4uNTY4Yzc4MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpX2xtNzBsbHAuYworKysgYi9kcml2ZXJzL3NwaS9zcGlfbG03MGxscC5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIHNwaV9sbTcwbGxwLmMgLSBkcml2ZXIgZm9yIGxtNzBsbHAgZXZhbCBib2FyZCBmb3IgdGhlIExNNzAgc2Vuc29yCisgKiBzcGlfbG03MGxscC5jIC0gZHJpdmVyIGZvciBMTTcwRVZBTC1MTFAgYm9hcmQgZm9yIHRoZSBMTTcwIHNlbnNvcgogICoKICAqIENvcHlyaWdodCAoQykgMjAwNiBLYWl3YW4gTiBCaWxsaW1vcmlhIDxrYWl3YW5AZGVzaWduZXJncmFwaGl4LmNvbT4KICAqCkBAIC00MCw4ICs0MCwxMiBAQAogICogbWFzdGVyIGNvbnRyb2xsZXIgZHJpdmVyLiAgVGhlIGh3bW9uL2xtNzAgZHJpdmVyIGlzIGEgIlNQSSBwcm90b2NvbAogICogZHJpdmVyIiwgbGF5ZXJlZCBvbiB0b3Agb2YgdGhpcyBvbmUgYW5kIHVzYWJsZSB3aXRob3V0IHRoZSBsbTcwbGxwLgogICoKKyAqIERhdGFzaGVldCBhbmQgU2NoZW1hdGljOgogICogVGhlIExNNzAgaXMgYSB0ZW1wZXJhdHVyZSBzZW5zb3IgY2hpcCBmcm9tIE5hdGlvbmFsIFNlbWljb25kdWN0b3I7IGl0cwogICogZGF0YXNoZWV0IGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm5hdGlvbmFsLmNvbS9wZi9MTS9MTTcwLmh0bWwKKyAqIFRoZSBzY2hlbWF0aWMgZm9yIHRoaXMgcGFydGljdWxhciBib2FyZCAodGhlIExNNzBFVkFMLUxMUCkgaXMKKyAqIGF2YWlsYWJsZSAob24gcGFnZSA0KSBoZXJlOgorICogIGh0dHA6Ly93d3cubmF0aW9uYWwuY29tL2FwcGluZm8vdGVtcHNlbnNvcnMvZmlsZXMvTE03MExMUEVWQUxtYW51YWwucGRmCiAgKgogICogQWxzbyBzZWUgRG9jdW1lbnRhdGlvbi9zcGkvc3BpLWxtNzBsbHAuICBUaGUgU1BJPC0+cGFycG9ydCBjb2RlIGhlcmUgaXMKICAqIChoZWF2aWx5KSBiYXNlZCBvbiBzcGktYnV0dGVyZmx5IGJ5IERhdmlkIEJyb3duZWxsLgpAQCAtNjQsNyArNjgsNyBAQAogICoKICAqIE5vdGUgdGhhdCBwYXJwb3J0IHBpbiAxMyBhY3R1YWxseSBnZXRzIGludmVydGVkIGJ5IHRoZSB0cmFuc2lzdG9yCiAgKiBhcnJhbmdlbWVudCB3aGljaCBsZXRzIGVpdGhlciB0aGUgcGFycG9ydCBvciB0aGUgTE03MCBkcml2ZSB0aGUKLSAqIFNJL1NPIHNpZ25hbC4KKyAqIFNJL1NPIHNpZ25hbCAoc2VlIHRoZSBzY2hlbWF0aWMgZm9yIGRldGFpbHMpLgogICovCiAKICNkZWZpbmUgRFJWTkFNRQkJInNwaS1sbTcwbGxwIgpAQCAtMTA2LDEyICsxMTAsMTYgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBkZWFzc2VydENTKHN0cnVjdCBzcGlfbG03MGxscCAqcHApCiB7CiAJdTggZGF0YSA9IHBhcnBvcnRfcmVhZF9kYXRhKHBwLT5wb3J0KTsKKworCWRhdGEgJj0gfjB4ODA7CQkvKiBwdWxsIEQ3L1NJLW91dCBsb3cgd2hpbGUgZGUtYXNzZXJ0ZWQgKi8KIAlwYXJwb3J0X3dyaXRlX2RhdGEocHAtPnBvcnQsIGRhdGEgfCBuQ1MpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgYXNzZXJ0Q1Moc3RydWN0IHNwaV9sbTcwbGxwICpwcCkKIHsKIAl1OCBkYXRhID0gcGFycG9ydF9yZWFkX2RhdGEocHAtPnBvcnQpOworCisJZGF0YSB8PSAweDgwOwkJLyogcHVsbCBENy9TSS1vdXQgaGlnaCBzbyBsbTcwIGRyaXZlcyBTTy1pbiAqLwogCXBhcnBvcnRfd3JpdGVfZGF0YShwcC0+cG9ydCwgZGF0YSAmIH5uQ1MpOwogfQogCkBAIC0xODQsMjIgKzE5Miw3IEBACiAgKi8KIHN0YXRpYyB1MzIgbG03MF90eHJ4KHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIHVuc2lnbmVkIG5zZWNzLCB1MzIgd29yZCwgdTggYml0cykKIHsKLQlzdGF0aWMgdTMyIHNpbz0wOwotCXN0YXRpYyBpbnQgZmlyc3RfdGltZT0xOwotCi0JLyogRmlyc3QgdGltZTogcGVyZm9ybSBTUEkgYml0YmFuZyBhbmQgcmV0dXJuIHRoZSBMU0Igb2YKLQkgKiB0aGUgcmVzdWx0IG9mIHRoZSBTUEkgY2FsbC4KLQkgKi8KLQlpZiAoZmlyc3RfdGltZSkgewotCQlzaW8gPSBiaXRiYW5nX3R4cnhfYmVfY3BoYTAoc3BpLCBuc2VjcywgMCwgd29yZCwgYml0cyk7Ci0JCWZpcnN0X3RpbWU9MDsKLQkJcmV0dXJuIChzaW8gJiAweDAwZmYpOwotCX0KLQkvKiBSZXR1cm4gdGhlIE1TQiBvZiB0aGUgcmVzdWx0IG9mIHRoZSBTUEkgY2FsbCAqLwotCWVsc2UgewotCQlmaXJzdF90aW1lPTE7Ci0JCXJldHVybiAoc2lvID4+IDgpOwotCX0KKwlyZXR1cm4gYml0YmFuZ190eHJ4X2JlX2NwaGEwKHNwaSwgbnNlY3MsIDAsIHdvcmQsIGJpdHMpOwogfQogCiBzdGF0aWMgdm9pZCBzcGlfbG03MGxscF9hdHRhY2goc3RydWN0IHBhcnBvcnQgKnApCkBAIC0yODcsMTYgKzI4MCwxNSBAQAogCXBwLT5zcGlkZXZfbG03MCA9IHNwaV9uZXdfZGV2aWNlKHBwLT5iaXRiYW5nLm1hc3RlciwgJnBwLT5pbmZvKTsKIAlpZiAocHAtPnNwaWRldl9sbTcwKQogCQlkZXZfZGJnKCZwcC0+c3BpZGV2X2xtNzAtPmRldiwgInNwaWRldl9sbTcwIGF0ICVzXG4iLAotCQkJCXBwLT5zcGlkZXZfbG03MC0+ZGV2LmJ1c19pZCk7CisJCQkJZGV2X25hbWUoJnBwLT5zcGlkZXZfbG03MC0+ZGV2KSk7CiAJZWxzZSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBzcGlfbmV3X2RldmljZSBmYWlsZWRcbiIsIERSVk5BTUUpOwogCQlzdGF0dXMgPSAtRU5PREVWOwogCQlnb3RvIG91dF9iaXRiYW5nX3N0b3A7CiAJfQotCXBwLT5zcGlkZXZfbG03MC0+Yml0c19wZXJfd29yZCA9IDE2OworCXBwLT5zcGlkZXZfbG03MC0+Yml0c19wZXJfd29yZCA9IDg7CiAKIAlsbTcwbGxwID0gcHA7Ci0KIAlyZXR1cm47CiAKIG91dF9iaXRiYW5nX3N0b3A6CkBAIC0zMjYsNyArMzE4LDYgQEAKIAogCS8qIHBvd2VyIGRvd24gKi8KIAlwYXJwb3J0X3dyaXRlX2RhdGEocHAtPnBvcnQsIDApOwotCW1zbGVlcCgxMCk7CiAKIAlwYXJwb3J0X3JlbGVhc2UocHAtPnBkKTsKIAlwYXJwb3J0X3VucmVnaXN0ZXJfZGV2aWNlKHBwLT5wZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGlfczNjMjR4eC5jIGIvZHJpdmVycy9zcGkvc3BpX3MzYzI0eHguYwppbmRleCAyNTZkMTgzLi5iM2ViYzFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGlfczNjMjR4eC5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaV9zM2MyNHh4LmMKQEAgLTE5LDYgKzE5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAKICNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpL3NwaV9iaXRiYW5nLmg+CkBAIC0yNyw3ICsyOCw2IEBACiAjaW5jbHVkZSA8YXNtL2RtYS5oPgogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KIAotI2luY2x1ZGUgPG1hY2gvcmVncy1ncGlvLmg+CiAjaW5jbHVkZSA8cGxhdC9yZWdzLXNwaS5oPgogI2luY2x1ZGUgPG1hY2gvc3BpLmg+CiAKQEAgLTY2LDcgKzY2LDcgQEAKIAogc3RhdGljIHZvaWQgczNjMjR4eF9zcGlfZ3Bpb2NzKHN0cnVjdCBzM2MyNDEwX3NwaV9pbmZvICpzcGksIGludCBjcywgaW50IHBvbCkKIHsKLQlzM2MyNDEwX2dwaW9fc2V0cGluKHNwaS0+cGluX2NzLCBwb2wpOworCWdwaW9fc2V0X3ZhbHVlKHNwaS0+cGluX2NzLCBwb2wpOwogfQogCiBzdGF0aWMgdm9pZCBzM2MyNHh4X3NwaV9jaGlwc2VsKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIGludCB2YWx1ZSkKQEAgLTI0OCw4ICsyNDgsMTMgQEAKIAl3cml0ZWIoU1BQSU5fREVGQVVMVCwgaHctPnJlZ3MgKyBTM0MyNDEwX1NQUElOKTsKIAl3cml0ZWIoU1BDT05fREVGQVVMVCwgaHctPnJlZ3MgKyBTM0MyNDEwX1NQQ09OKTsKIAotCWlmIChody0+cGRhdGEgJiYgaHctPnBkYXRhLT5ncGlvX3NldHVwKQotCQlody0+cGRhdGEtPmdwaW9fc2V0dXAoaHctPnBkYXRhLCAxKTsKKwlpZiAoaHctPnBkYXRhKSB7CisJCWlmIChody0+c2V0X2NzID09IHMzYzI0eHhfc3BpX2dwaW9jcykKKwkJCWdwaW9fZGlyZWN0aW9uX291dHB1dChody0+cGRhdGEtPnBpbl9jcywgMSk7CisKKwkJaWYgKGh3LT5wZGF0YS0+Z3Bpb19zZXR1cCkKKwkJCWh3LT5wZGF0YS0+Z3Bpb19zZXR1cChody0+cGRhdGEsIDEpOworCX0KIH0KIAogc3RhdGljIGludCBfX2luaXQgczNjMjR4eF9zcGlfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKQEAgLTM0MywxOCArMzQ4LDI3IEBACiAJCWdvdG8gZXJyX25vX2NsazsKIAl9CiAKLQlzM2MyNHh4X3NwaV9pbml0aWFsc2V0dXAoaHcpOwotCiAJLyogc2V0dXAgYW55IGdwaW8gd2UgY2FuICovCiAKIAlpZiAoIXBkYXRhLT5zZXRfY3MpIHsKLQkJaHctPnNldF9jcyA9IHMzYzI0eHhfc3BpX2dwaW9jczsKKwkJaWYgKHBkYXRhLT5waW5fY3MgPCAwKSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJObyBjaGlwc2VsZWN0IHBpblxuIik7CisJCQlnb3RvIGVycl9yZWdpc3RlcjsKKwkJfQogCi0JCXMzYzI0MTBfZ3Bpb19zZXRwaW4ocGRhdGEtPnBpbl9jcywgMSk7Ci0JCXMzYzI0MTBfZ3Bpb19jZmdwaW4ocGRhdGEtPnBpbl9jcywgUzNDMjQxMF9HUElPX09VVFBVVCk7CisJCWVyciA9IGdwaW9fcmVxdWVzdChwZGF0YS0+cGluX2NzLCBkZXZfbmFtZSgmcGRldi0+ZGV2KSk7CisJCWlmIChlcnIpIHsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0byBnZXQgZ3BpbyBmb3IgY3NcbiIpOworCQkJZ290byBlcnJfcmVnaXN0ZXI7CisJCX0KKworCQlody0+c2V0X2NzID0gczNjMjR4eF9zcGlfZ3Bpb2NzOworCQlncGlvX2RpcmVjdGlvbl9vdXRwdXQocGRhdGEtPnBpbl9jcywgMSk7CiAJfSBlbHNlCiAJCWh3LT5zZXRfY3MgPSBwZGF0YS0+c2V0X2NzOwogCisJczNjMjR4eF9zcGlfaW5pdGlhbHNldHVwKGh3KTsKKwogCS8qIHJlZ2lzdGVyIG91ciBzcGkgY29udHJvbGxlciAqLwogCiAJZXJyID0gc3BpX2JpdGJhbmdfc3RhcnQoJmh3LT5iaXRiYW5nKTsKQEAgLTM2Niw2ICszODAsOSBAQAogCXJldHVybiAwOwogCiAgZXJyX3JlZ2lzdGVyOgorCWlmIChody0+c2V0X2NzID09IHMzYzI0eHhfc3BpX2dwaW9jcykKKwkJZ3Bpb19mcmVlKHBkYXRhLT5waW5fY3MpOworCiAJY2xrX2Rpc2FibGUoaHctPmNsayk7CiAJY2xrX3B1dChody0+Y2xrKTsKIApAQCAtNDAxLDYgKzQxOCw5IEBACiAJZnJlZV9pcnEoaHctPmlycSwgaHcpOwogCWlvdW5tYXAoaHctPnJlZ3MpOwogCisJaWYgKGh3LT5zZXRfY3MgPT0gczNjMjR4eF9zcGlfZ3Bpb2NzKQorCQlncGlvX2ZyZWUoaHctPnBkYXRhLT5waW5fY3MpOworCiAJcmVsZWFzZV9yZXNvdXJjZShody0+aW9hcmVhKTsKIAlrZnJlZShody0+aW9hcmVhKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvS2NvbmZpZwppbmRleCA1ZDQ1N2M5Li5jZTZiYWRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvS2NvbmZpZworKysgYi9kcml2ZXJzL3N0YWdpbmcvS2NvbmZpZwpAQCAtNDksNiArNDksOCBAQAogCiBzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9tZTQwMDAvS2NvbmZpZyIKIAorc291cmNlICJkcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvS2NvbmZpZyIKKwogc291cmNlICJkcml2ZXJzL3N0YWdpbmcvZ283MDA3L0tjb25maWciCiAKIHNvdXJjZSAiZHJpdmVycy9zdGFnaW5nL3VzYmlwL0tjb25maWciCkBAIC02Myw1ICs2NSwzNSBAQAogCiBzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9wb2NoL0tjb25maWciCiAKK3NvdXJjZSAiZHJpdmVycy9zdGFnaW5nL2FnbngvS2NvbmZpZyIKKworc291cmNlICJkcml2ZXJzL3N0YWdpbmcvb3R1cy9LY29uZmlnIgorCitzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9ydDI4NjAvS2NvbmZpZyIKKworc291cmNlICJkcml2ZXJzL3N0YWdpbmcvcnQyODcwL0tjb25maWciCisKK3NvdXJjZSAiZHJpdmVycy9zdGFnaW5nL2JlbmV0L0tjb25maWciCisKK3NvdXJjZSAiZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9LY29uZmlnIgorCitzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9hc3VzX29sZWQvS2NvbmZpZyIKKworc291cmNlICJkcml2ZXJzL3N0YWdpbmcvcGFuZWwvS2NvbmZpZyIKKworc291cmNlICJkcml2ZXJzL3N0YWdpbmcvYWx0cGNpZWNoZG1hL0tjb25maWciCisKK3NvdXJjZSAiZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9LY29uZmlnIgorCitzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9yc3BpdXNiL0tjb25maWciCisKK3NvdXJjZSAiZHJpdmVycy9zdGFnaW5nL21pbWlvL0tjb25maWciCisKK3NvdXJjZSAiZHJpdmVycy9zdGFnaW5nL2Zyb250aWVyL0tjb25maWciCisKK3NvdXJjZSAiZHJpdmVycy9zdGFnaW5nL2VwbC9LY29uZmlnIgorCitzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL0tjb25maWciCisKIGVuZGlmICMgIVNUQUdJTkdfRVhDTFVERV9CVUlMRAogZW5kaWYgIyBTVEFHSU5HCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvTWFrZWZpbGUKaW5kZXggNzFjNGQ1My4uOWRkY2MyYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9NYWtlZmlsZQpAQCAtNyw2ICs3LDcgQEAKIG9iai0kKENPTkZJR19TTElDT1NTKQkJKz0gc2xpY29zcy8KIG9iai0kKENPTkZJR19TWEcpCQkrPSBzeGcvCiBvYmotJChDT05GSUdfTUU0MDAwKQkJKz0gbWU0MDAwLworb2JqLSQoQ09ORklHX01FSUxIQVVTKQkJKz0gbWVpbGhhdXMvCiBvYmotJChDT05GSUdfVklERU9fR083MDA3KQkrPSBnbzcwMDcvCiBvYmotJChDT05GSUdfVVNCX0lQX0NPTU1PTikJKz0gdXNiaXAvCiBvYmotJChDT05GSUdfVzM1VU5EKQkJKz0gd2luYm9uZC8KQEAgLTE0LDMgKzE1LDE4IEBACiBvYmotJChDT05GSUdfRUNITykJCSs9IGVjaG8vCiBvYmotJChDT05GSUdfVVNCX0FUTUVMKQkJKz0gYXQ3Nl91c2IvCiBvYmotJChDT05GSUdfUE9DSCkJCSs9IHBvY2gvCitvYmotJChDT05GSUdfQUdOWCkJCSs9IGFnbngvCitvYmotJChDT05GSUdfT1RVUykJCSs9IG90dXMvCitvYmotJChDT05GSUdfUlQyODYwKQkJKz0gcnQyODYwLworb2JqLSQoQ09ORklHX1JUMjg3MCkJCSs9IHJ0Mjg3MC8KK29iai0kKENPTkZJR19CRU5FVCkJCSs9IGJlbmV0Lworb2JqLSQoQ09ORklHX0NPTUVESSkJCSs9IGNvbWVkaS8KK29iai0kKENPTkZJR19BU1VTX09MRUQpCQkrPSBhc3VzX29sZWQvCitvYmotJChDT05GSUdfUEFORUwpCQkrPSBwYW5lbC8KK29iai0kKENPTkZJR19BTFRFUkFfUENJRV9DSERNQSkJKz0gYWx0cGNpZWNoZG1hLworb2JqLSQoQ09ORklHX1JUTDgxODdTRSkJCSs9IHJ0bDgxODdzZS8KK29iai0kKENPTkZJR19VU0JfUlNQSSkJCSs9IHJzcGl1c2IvCitvYmotJChDT05GSUdfSU5QVVRfTUlNSU8pCSs9IG1pbWlvLworb2JqLSQoQ09ORklHX1RSQU5aUE9SVCkJCSs9IGZyb250aWVyLworb2JqLSQoQ09ORklHX0VQTCkJCSs9IGVwbC8KK29iai0kKENPTkZJR19BTkRST0lEKQkJKz0gYW5kcm9pZC8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hZ254L0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvYWdueC9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmNDM1NDkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYWdueC9LY29uZmlnCkBAIC0wLDAgKzEsNSBAQAorY29uZmlnIEFHTlgKKwl0cmlzdGF0ZSAiV2lyZWxlc3MgQWlyZ28gQUdOWCBzdXBwb3J0IgorCWRlcGVuZHMgb24gV0xBTl84MDIxMSAmJiBNQUM4MDIxMQorCS0tLWhlbHAtLS0KKwkgIFRoaXMgaXMgYW4gZXhwZXJpbWVudGFsIGRyaXZlciBmb3IgQWlyZ28gQUdOWDAwIHdpcmVsZXNzIGNoaXAuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYWdueC9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy9hZ254L01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyMTY1NjQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYWdueC9NYWtlZmlsZQpAQCAtMCwwICsxLDggQEAKK29iai0kKENPTkZJR19BR05YKQkrPSBhZ254Lm8KKworYWdueC1vYmpzIDo9CXJmLm8JXAorCQlwY2kubwlcCisJCXhtaXQubwlcCisJCXRhYmxlLm8JXAorCQlzdGEubwlcCisJCXBoeS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYWdueC9UT0RPIGIvZHJpdmVycy9zdGFnaW5nL2FnbngvVE9ETwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OWJlYzc0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2FnbngvVE9ETwpAQCAtMCwwICsxLDIyIEBACisyMDA4IDcvMTgKKworVGhlIFJYIGhhcyBjYW4ndCByZWNlaXZlIE9GRE0gcGFja2V0IGNvcnJlY3RseSwKK0d1ZXNzIGl0IG5lZWQgYmUgZG8gUlggY2FsaWJyYXRlLgorCisKK2JlZm9yZSAyMDA4IDMvMQorCisxOiBUaGUgUlggZ2V0IHRvbyBtdWNoICJDUkMgZmFpbGVkIiBwYWtldHMsIGl0IG1ha2UgdGhlIGNhcmQgd29yayB2ZXJ5IHVuc3RhYmxlLAorMjogQWZ0ZXIgcnVubmluZyBhIHdoaWxlLCB0aGUgY2FyZCB3aWxsIGdldCBpbmZpbml0eSAiUlggRnJhbWUiIGFuZCAiRXJyb3IiCitpbnRlcnJ1cHQsIG5vdCBrbm93IHRoZSByb290IHJlYXNvbiBzbyBmYXIsIHRyeSB0byBmaXggaXQKKzM6IFVzaW5nIHR3byB0eCBxdWV1ZSB0eGQgYW5kIHR4bSBidXQgbm90IG9ubHkgdHhtLgorNDogU2V0IHRoZSBoZHIgY29ycmVjdGx5LgorNTogVHJ5IHRvIGRvIHJlY2FsaWJyYXRlIGNvcnJldnRseQorNjogVG8gc3VwcG9ydCBHIG1vZGUgaW4gZnV0dXJlCis3OiBGaXggdGhlIG1hYyBhZGRyZXNzIGNhbid0IGJlIHJlYWRlZCBhbmQgc2V0IGNvcnJlY3RseSBpbiBCRSBtYWNoaW5lLgorODogRml4IGluY2x1ZGUgYW5kIGV4Y2x1ZGUgRkNTIGluIHByb21pc291cyBtb2RlIGFuZCBtYW5hZ2UgbW9kZQorOTogVXNpbmcgc3RhX25vdGlmeSB0byBub3RpY2Ugc3RhIGNoYW5nZQorMTA6IFR1cm4gb24gZnJhbWUgcmVjZXB0aW9uIGF0IHRoZSBlbmQgb2Ygc3RhcnQKKzExOiBHdWVzcyB0aGUgY2FyZCBzdXBwb3J0IEhXX01VTFRJQ0FTVF9GSUxURVIKKzEyOiBUaGUgdHggcHJvY2VzcyBzaG91bGQgYmUgaW1wbG1lbnQgYXRvbWljPworMTM6IFVzaW5nIG1hYzgwMjExIGZ1bmN0aW9uIHRvIGNvbnRyb2wgdGhlIFRYJlJYIExFRC4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hZ254L2FnbnguaCBiL2RyaXZlcnMvc3RhZ2luZy9hZ254L2FnbnguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzViMGRiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2FnbngvYWdueC5oCkBAIC0wLDAgKzEsMTU0IEBACisjaWZuZGVmIEFHTlhfSF8KKyNkZWZpbmUgQUdOWF9IXworCisjaW5jbHVkZSAieG1pdC5oIgorCisjZGVmaW5lIFBGWAkJCQlLQlVJTERfTU9ETkFNRSAiOiAiCisKK3N0YXRpYyBpbmxpbmUgdTMyIGFnbnhfcmVhZDMyKHZvaWQgX19pb21lbSAqbWVtX3JlZ2lvbiwgdTMyIG9mZnNldCkKK3sKKwlyZXR1cm4gaW9yZWFkMzIobWVtX3JlZ2lvbiArIG9mZnNldCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhZ254X3dyaXRlMzIodm9pZCBfX2lvbWVtICptZW1fcmVnaW9uLCB1MzIgb2Zmc2V0LCB1MzIgdmFsKQoreworCWlvd3JpdGUzMih2YWwsIG1lbV9yZWdpb24gKyBvZmZzZXQpOworfQorCisvKiBzdGF0aWMgY29uc3Qgc3RydWN0IGllZWU4MDIxMV9yYXRlIGFnbnhfcmF0ZXNfODAyMTFiW10gPSB7ICovCisvKiAJeyAucmF0ZSA9IDEwLCAqLworLyogCSAgLnZhbCA9IDB4YSwgKi8KKy8qIAkgIC5mbGFncyA9IElFRUU4MDIxMV9SQVRFX0NDSyB9LCAqLworLyogCXsgLnJhdGUgPSAyMCwgKi8KKy8qIAkgIC52YWwgPSAweDE0LCAqLworLyogCSAgLmh3X3ZhbHVlID0gLTB4MTQsICovCisvKiAJICAuZmxhZ3MgPSBJRUVFODAyMTFfUkFURV9DQ0tfMiB9LCAqLworLyogCXsgLnJhdGUgPSA1NSwgKi8KKy8qIAkgIC52YWwgPSAweDM3LCAqLworLyogCSAgLnZhbDIgPSAtMHgzNywgKi8KKy8qIAkgIC5mbGFncyA9IElFRUU4MDIxMV9SQVRFX0NDS18yIH0sICovCisvKiAJeyAucmF0ZSA9IDExMCwgKi8KKy8qIAkgIC52YWwgPSAweDZlLCAqLworLyogCSAgLnZhbDIgPSAtMHg2ZSwgKi8KKy8qIAkgIC5mbGFncyA9IElFRUU4MDIxMV9SQVRFX0NDS18yIH0gKi8KKy8qIH07ICovCisKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfcmF0ZSBhZ254X3JhdGVzXzgwMjExZ1tdID0geworLyogCXsgLmJpdHJhdGUgPSAxMCwgLmh3X3ZhbHVlID0gMSwgLmZsYWdzID0gSUVFRTgwMjExX1JBVEVfU0hPUlRfUFJFQU1CTEUgfSwgKi8KKy8qIAl7IC5iaXRyYXRlID0gMjAsIC5od192YWx1ZSA9IDIsIC5mbGFncyA9IElFRUU4MDIxMV9SQVRFX1NIT1JUX1BSRUFNQkxFIH0sICovCisvKiAJeyAuYml0cmF0ZSA9IDU1LCAuaHdfdmFsdWUgPSAzLCAuZmxhZ3MgPSBJRUVFODAyMTFfUkFURV9TSE9SVF9QUkVBTUJMRSB9LCAqLworLyogCXsgLmJpdHJhdGUgPSAxMTAsIC5od192YWx1ZSA9IDQsIC5mbGFncyA9IElFRUU4MDIxMV9SQVRFX1NIT1JUX1BSRUFNQkxFIH0sICovCisgCXsgLmJpdHJhdGUgPSAxMCwgLmh3X3ZhbHVlID0gMSwgfSwKKyAJeyAuYml0cmF0ZSA9IDIwLCAuaHdfdmFsdWUgPSAyLCB9LAorIAl7IC5iaXRyYXRlID0gNTUsIC5od192YWx1ZSA9IDMsIH0sCisgCXsgLmJpdHJhdGUgPSAxMTAsIC5od192YWx1ZSA9IDQsfSwKKworCXsgLmJpdHJhdGUgPSA2MCwgLmh3X3ZhbHVlID0gMHhCLCB9LAorCXsgLmJpdHJhdGUgPSA5MCwgLmh3X3ZhbHVlID0gMHhGLCB9LAorCXsgLmJpdHJhdGUgPSAxMjAsIC5od192YWx1ZSA9IDB4QSB9LAorCXsgLmJpdHJhdGUgPSAxODAsIC5od192YWx1ZSA9IDB4RSwgfSwKKy8vCXsgLmJpdHJhdGUgPSAyNDAsIC5od192YWx1ZSA9IDB4ZCwgfSwKKwl7IC5iaXRyYXRlID0gMzYwLCAuaHdfdmFsdWUgPSAweEQsIH0sCisJeyAuYml0cmF0ZSA9IDQ4MCwgLmh3X3ZhbHVlID0gMHg4LCB9LAorCXsgLmJpdHJhdGUgPSA1NDAsIC5od192YWx1ZSA9IDB4QywgfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgYWdueF9jaGFubmVsc1tdID0geworCXsgLmNlbnRlcl9mcmVxID0gMjQxMiwgLmh3X3ZhbHVlID0gMSwgfSwKKwl7IC5jZW50ZXJfZnJlcSA9IDI0MTcsIC5od192YWx1ZSA9IDIsIH0sCisJeyAuY2VudGVyX2ZyZXEgPSAyNDIyLCAuaHdfdmFsdWUgPSAzLCB9LAorCXsgLmNlbnRlcl9mcmVxID0gMjQyNywgLmh3X3ZhbHVlID0gNCwgfSwKKwl7IC5jZW50ZXJfZnJlcSA9IDI0MzIsIC5od192YWx1ZSA9IDUsIH0sCisJeyAuY2VudGVyX2ZyZXEgPSAyNDM3LCAuaHdfdmFsdWUgPSA2LCB9LAorCXsgLmNlbnRlcl9mcmVxID0gMjQ0MiwgLmh3X3ZhbHVlID0gNywgfSwKKwl7IC5jZW50ZXJfZnJlcSA9IDI0NDcsIC5od192YWx1ZSA9IDgsIH0sCisJeyAuY2VudGVyX2ZyZXEgPSAyNDUyLCAuaHdfdmFsdWUgPSA5LCB9LAorCXsgLmNlbnRlcl9mcmVxID0gMjQ1NywgLmh3X3ZhbHVlID0gMTAsIH0sCisJeyAuY2VudGVyX2ZyZXEgPSAyNDYyLCAuaHdfdmFsdWUgPSAxMSwgfSwKKwl7IC5jZW50ZXJfZnJlcSA9IDI0NjcsIC5od192YWx1ZSA9IDEyLCB9LAorCXsgLmNlbnRlcl9mcmVxID0gMjQ3MiwgLmh3X3ZhbHVlID0gMTMsIH0sCisJeyAuY2VudGVyX2ZyZXEgPSAyNDg0LCAuaHdfdmFsdWUgPSAxNCwgfSwKK307CisKKyNkZWZpbmUgTlVNX0RSSVZFX01PREVTCTIKKy8qIEFnbnggb3BlcmF0ZSBtb2RlICovCitlbnVtIHsKKwlBR05YX01PREVfODAyMTFBLAorCUFHTlhfTU9ERV84MDIxMUFfT09CLAorCUFHTlhfTU9ERV84MDIxMUFfTUlNTywKKwlBR05YX01PREVfODAyMTFCX1NIT1JULAorCUFHTlhfTU9ERV84MDIxMUJfTE9ORywKKwlBR05YX01PREVfODAyMTFHLAorCUFHTlhfTU9ERV84MDIxMUdfT09CLAorCUFHTlhfTU9ERV84MDIxMUdfTUlNTywKK307CisKK2VudW0geworCUFHTlhfVU5JTklULAorCUFHTlhfU1RBUlQsCisJQUdOWF9TVE9QLAorfTsKKworc3RydWN0IGFnbnhfcHJpdiB7CisJc3RydWN0IHBjaV9kZXYgKnBkZXY7CisJc3RydWN0IGllZWU4MDIxMV9odyAqaHc7CisKKwlzcGlubG9ja190IGxvY2s7CisJc3RydWN0IG11dGV4IG11dGV4OworCXVuc2lnbmVkIGludCBpbml0X3N0YXR1czsKKworCXZvaWQgX19pb21lbSAqY3RsOwkvKiBwb2ludGVyIHRvIGJhc2UgcmFtIGFkZHJlc3MgKi8KKwl2b2lkIF9faW9tZW0gKmRhdGE7CS8qIHBvaW50ZXIgdG8gbWVtIHJlZ2lvbiAjMiAqLworCisJc3RydWN0IGFnbnhfcmluZyByeDsKKwlzdHJ1Y3QgYWdueF9yaW5nIHR4bTsKKwlzdHJ1Y3QgYWdueF9yaW5nIHR4ZDsKKworCS8qIE5lZWQgdm9sYXRpbGU/ICovCisJdTMyIGlycV9zdGF0dXM7CisKKyAgICAgICAgc3RydWN0IGRlbGF5ZWRfd29yayBwZXJpb2RpY193b3JrOyAvKiBQZXJpb2RpYyB0YXNrcyBsaWtlIHJlY2FsaWJyYXRlKi8KKwlzdHJ1Y3QgaWVlZTgwMjExX2xvd19sZXZlbF9zdGF0cyBzdGF0czsKKworLy8gICAgICAgIHVuc2lnbmVkIGludCBwaHltb2RlOworCWludCBtb2RlOworCWludCBjaGFubmVsOworCXU4IGJzc2lkW0VUSF9BTEVOXTsKKworCXU4IG1hY19hZGRyW0VUSF9BTEVOXTsKKwl1OCByZXZpZDsKKworCXN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgYmFuZDsKK307CisKKworI2RlZmluZSBBR05YX0NIQUlOU19NQVgJNgorI2RlZmluZSBBR05YX1BFUklPRElDX0RFTEFZIDYwMDAwIC8qIHVuaXQ6IG1zICovCisjZGVmaW5lIExPQ0FMX1NUQUlECTAJLyogdGhlIHN0YXRpb24gZW50cnkgZm9yIHRoZSBjYXJkIGl0c2VsZiAqLworI2RlZmluZSBCU1NJRF9TVEFJRAkxCS8qIHRoZSBzdGF0aW9uIGVudHJ5IGZvciB0aGUgYnNzc2lkIEFQICovCisjZGVmaW5lCXNwaV9kZWxheSgpCXVkZWxheSg0MCkKKyNkZWZpbmUgZWVwcm9tX2RlbGF5KCkJdWRlbGF5KDQwKQorI2RlZmluZQlyb3V0aW5nX3RhYmxlX2RlbGF5KCkJdWRlbGF5KDUwKQorCisvKiBQRFUgcG9vbCBNRU0gcmVnaW9uICMyICovCisjZGVmaW5lIEFHTlhfUERVUE9PTAkJMHg0MDAwMAkvKiBQRFUgcG9vbCAqLworI2RlZmluZSBBR05YX1BEVVBPT0xfU0laRQkweDgwMDAJLyogUERVIHBvb2wgc2l6ZSovCisjZGVmaW5lIEFHTlhfUERVX1RYX1dRCQkweDQxMDAwCS8qIFBEVSBsaXN0IFRYIHdvcmtxdWV1ZSAqLworI2RlZmluZSBBR05YX1BEVV9GUkVFCQkweDQxODAwCS8qIEZyZWUgUG9vbCAqLworI2RlZmluZSBQRFVfU0laRQkJMHg4MAkvKiBGcmVlIFBvb2wgbm9kZSBzaXplICovCisjZGVmaW5lIFBEVV9GUkVFX0NOVAkJMHhkMCAvKiBGcmVlIHBvb2wgbm9kZSBjb3VudCAqLworCisKKy8qIFJGIHN0dWZmcyAqLworZXh0ZXJuIHZvaWQgcmZfY2hpcHNfaW5pdChzdHJ1Y3QgYWdueF9wcml2ICpwcml2KTsKK2V4dGVybiB2b2lkIHNwaV9yY193cml0ZSh2b2lkIF9faW9tZW0gKm1lbV9yZWdpb24sIHUzMiBjaGlwX2lkcywgdTMyIHN3KTsKK2V4dGVybiB2b2lkIGNhbGlicmF0ZV9vc2NpbGxhdG9yKHN0cnVjdCBhZ254X3ByaXYgKnByaXYpOworZXh0ZXJuIHZvaWQgZG9fY2FsaWJyYXRpb24oc3RydWN0IGFnbnhfcHJpdiAqcHJpdik7CitleHRlcm4gdm9pZCBhbnRlbm5hX2NhbGlicmF0ZShzdHJ1Y3QgYWdueF9wcml2ICpwcml2KTsKK2V4dGVybiB2b2lkIF9fYW50ZW5uYV9jYWxpYnJhdGUoc3RydWN0IGFnbnhfcHJpdiAqcHJpdik7CitleHRlcm4gdm9pZCBwcmludF9vZmZzZXRzKHN0cnVjdCBhZ254X3ByaXYgKnByaXYpOworZXh0ZXJuIGludCBhZ254X3NldF9jaGFubmVsKHN0cnVjdCBhZ254X3ByaXYgKnByaXYsIHVuc2lnbmVkIGludCBjaGFubmVsKTsKKworCisjZW5kaWYgLyogQUdOWF9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FnbngvZGVidWcuaCBiL2RyaXZlcnMvc3RhZ2luZy9hZ254L2RlYnVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTNlMjVkZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9hZ254L2RlYnVnLmgKQEAgLTAsMCArMSw0MTggQEAKKyNpZm5kZWYgQUdOWF9ERUJVR19IXworI2RlZmluZSBBR05YX0RFQlVHX0hfCisKKyNpbmNsdWRlICJhZ254LmgiCisjaW5jbHVkZSAicGh5LmgiCisjaW5jbHVkZSAic3RhLmgiCisjaW5jbHVkZSAieG1pdC5oIgorCisjZGVmaW5lIEFHTlhfVFJBQ0UgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiBQRlggImZ1bmN0aW9uOiVzIGxpbmU6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXykKKworI2RlZmluZSBQUklOVEtfTEUxNihwcmVmaXgsIHZhcikJcHJpbnRrKEtFUk5fREVCVUcgUEZYICNwcmVmaXggIjogIiAjdmFyICIgMHglLjR4XG4iLCBsZTE2X3RvX2NwdSh2YXIpKQorI2RlZmluZSBQUklOVEtfTEUzMihwcmVmaXgsIHZhcikJcHJpbnRrKEtFUk5fREVCVUcgUEZYICNwcmVmaXggIjogIiAjdmFyICIgMHglLjh4XG4iLCBsZTMyX3RvX2NwdSh2YXIpKQorI2RlZmluZSBQUklOVEtfVTgocHJlZml4LCB2YXIpIAkJcHJpbnRrKEtFUk5fREVCVUcgUEZYICNwcmVmaXggIjogIiAjdmFyICIgMHglLjJ4XG4iLCB2YXIpCisjZGVmaW5lIFBSSU5US19CRTE2KHByZWZpeCwgdmFyKQlwcmludGsoS0VSTl9ERUJVRyBQRlggI3ByZWZpeCAiOiAiICN2YXIgIiAweCUuNHhcbiIsIGJlMTZfdG9fY3B1KHZhcikpCisjZGVmaW5lIFBSSU5US19CRTMyKHByZWZpeCwgdmFyKQlwcmludGsoS0VSTl9ERUJVRyBQRlggI3ByZWZpeCAiOiAiICN2YXIgIiAweCUuOHhcbiIsIGJlMzJfdG9fY3B1KHZhcikpCisjZGVmaW5lIFBSSU5US19CSVRTKHByZWZpeCwgZmllbGQpICAgIAlwcmludGsoS0VSTl9ERUJVRyBQRlggI3ByZWZpeCAiOiAiICNmaWVsZCAiOiAweCV4XG4iLCAocmVnICYgZmllbGQpID4+IGZpZWxkIyNfU0hJRlQpCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhZ254X2J1ZyhjaGFyICpyZWFzb24pCit7CisJcHJpbnRrKEtFUk5fRVJSIFBGWCAiJXNcbiIsIHJlYXNvbik7CisJQlVHKCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhZ254X3ByaW50X2Rlc2Moc3RydWN0IGFnbnhfZGVzYyAqZGVzYykKK3sKKyAgICAgICAgdTMyIHJlZyA9IGJlMzJfdG9fY3B1KGRlc2MtPmZyYWcpOworCisJUFJJTlRLX0JJVFMoREVTQywgUEFDS0VUX0xFTik7CisKKwlpZiAocmVnICYgRklSU1RfRlJBRykgeworCQlQUklOVEtfQklUUyhERVNDLCBGSVJTVF9QQUNLRVRfTUFTSyk7CisJCVBSSU5US19CSVRTKERFU0MsIEZJUlNUX1JFU0VSVjIpOworCQlQUklOVEtfQklUUyhERVNDLCBGSVJTVF9US0lQX0VSUk9SKTsKKwkJUFJJTlRLX0JJVFMoREVTQywgRklSU1RfVEtJUF9QQUNLRVQpOworCQlQUklOVEtfQklUUyhERVNDLCBGSVJTVF9SRVNFUlYxKTsKKwkJUFJJTlRLX0JJVFMoREVTQywgRklSU1RfRlJBR19MRU4pOworCX0gZWxzZSB7CisJCVBSSU5US19CSVRTKERFU0MsIFNVQl9SRVNFUlYyKTsKKwkJUFJJTlRLX0JJVFMoREVTQywgU1VCX1RLSVBfRVJST1IpOworCQlQUklOVEtfQklUUyhERVNDLCBTVUJfVEtJUF9QQUNLRVQpOworCQlQUklOVEtfQklUUyhERVNDLCBTVUJfUkVTRVJWMSk7CisJCVBSSU5US19CSVRTKERFU0MsIFNVQl9GUkFHX0xFTik7CisJfQorCisJUFJJTlRLX0JJVFMoREVTQywgRklSU1RfRlJBRyk7CisJUFJJTlRLX0JJVFMoREVTQywgTEFTVF9GUkFHKTsKKwlQUklOVEtfQklUUyhERVNDLCBPV05FUik7Cit9CisKKworc3RhdGljIGlubGluZSB2b2lkIGR1bXBfaWVlZTgwMjExYl9waHlfaGRyKF9fYmUzMiBfMTFiMCwgX19iZTMyIF8xMWIxKQoreworCit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhZ254X3ByaW50X2hkcihzdHJ1Y3QgYWdueF9oZHIgKmhkcikKK3sKKwl1MzIgcmVnOworCWludCBpOworCisJcmVnID0gYmUzMl90b19jcHUoaGRyLT5yZWcwKTsKKwlQUklOVEtfQklUUyhIRFIsIFJUUyk7CisJUFJJTlRLX0JJVFMoSERSLCBNVUxUSUNBU1QpOworCVBSSU5US19CSVRTKEhEUiwgQUNLKTsKKwlQUklOVEtfQklUUyhIRFIsIFRNKTsKKwlQUklOVEtfQklUUyhIRFIsIFJFTEFZKTsKKwlQUklOVEtfQklUUyhIRFIsIFJFVklTRURfRkNTKTsKKwlQUklOVEtfQklUUyhIRFIsIE5FWFRfQlVGRkVSX0FERFIpOworCisJcmVnID0gYmUzMl90b19jcHUoaGRyLT5yZWcxKTsKKwlQUklOVEtfQklUUyhIRFIsIE1BQ19IRFJfTEVOKTsKKwlQUklOVEtfQklUUyhIRFIsIERVUkFUSU9OX09WRVJJREUpOworCVBSSU5US19CSVRTKEhEUiwgUEhZX0hEUl9PVkVSSURFKTsKKwlQUklOVEtfQklUUyhIRFIsIENSQ19GQUlMKTsKKwlQUklOVEtfQklUUyhIRFIsIFNFUVVFTkNFX05VTUJFUik7CisJUFJJTlRLX0JJVFMoSERSLCBCVUZGX0hFQURfQUREUik7CisKKwlyZWcgPSBiZTMyX3RvX2NwdShoZHItPnJlZzIpOworCVBSSU5US19CSVRTKEhEUiwgUERVX0NPVU5UKTsKKwlQUklOVEtfQklUUyhIRFIsIFdFUF9LRVkpOworCVBSSU5US19CSVRTKEhEUiwgVVNFU19XRVBfS0VZKTsKKwlQUklOVEtfQklUUyhIRFIsIEtFRVBfQUxJVkUpOworCVBSSU5US19CSVRTKEhEUiwgQlVGRl9UQUlMX0FERFIpOworCisJcmVnID0gYmUzMl90b19jcHUoaGRyLT5yZWczKTsKKwlQUklOVEtfQklUUyhIRFIsIENUU18xMUcpOworCVBSSU5US19CSVRTKEhEUiwgUlRTXzExRyk7CisJUFJJTlRLX0JJVFMoSERSLCBGUkFHX1NJWkUpOworCVBSSU5US19CSVRTKEhEUiwgUEFZTE9BRF9MRU4pOworCVBSSU5US19CSVRTKEhEUiwgRlJBR19OVU0pOworCisJcmVnID0gYmUzMl90b19jcHUoaGRyLT5yZWc0KTsKKwlQUklOVEtfQklUUyhIRFIsIFJFTEFZX1NUQUlEKTsKKwlQUklOVEtfQklUUyhIRFIsIFNUQVRJT05fSUQpOworCVBSSU5US19CSVRTKEhEUiwgV09SS1FVRVVFX0lEKTsKKworCXJlZyA9IGJlMzJfdG9fY3B1KGhkci0+cmVnNSk7CisJLyogcHJpbnRmIHRoZSByb3V0ZSBmbGFnICovCisJUFJJTlRLX0JJVFMoSERSLCBST1VURV9IT1NUKTsKKwlQUklOVEtfQklUUyhIRFIsIFJPVVRFX0NBUkRfQ1BVKTsKKwlQUklOVEtfQklUUyhIRFIsIFJPVVRFX0VOQ1JZUFRJT04pOworCVBSSU5US19CSVRTKEhEUiwgUk9VVEVfVFgpOworCVBSSU5US19CSVRTKEhEUiwgUk9VVEVfUlgxKTsKKwlQUklOVEtfQklUUyhIRFIsIFJPVVRFX1JYMik7CisJUFJJTlRLX0JJVFMoSERSLCBST1VURV9DT01QUkVTU0lPTik7CisKKwlQUklOVEtfQkUzMihIRFIsIGhkci0+XzExZzApOworCVBSSU5US19CRTMyKEhEUiwgaGRyLT5fMTFnMSk7CisJUFJJTlRLX0JFMzIoSERSLCBoZHItPl8xMWIwKTsKKwlQUklOVEtfQkUzMihIRFIsIGhkci0+XzExYjEpOworCisJZHVtcF9pZWVlODAyMTFiX3BoeV9oZHIoaGRyLT5fMTFiMCwgaGRyLT5fMTFiMSk7CisKKwkvKiBGaXhtZSAqLworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGhkci0+bWFjX2hkcik7IGkrKykgeworCQlpZiAoaSA9PSAwKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgUEZYICJJRUVFODAyMTEgSERSOiAiKTsKKwkJcHJpbnRrKCIlLjJ4ICIsIGhkci0+bWFjX2hkcltpXSk7CisJCWlmIChpICsgMSA9PSBBUlJBWV9TSVpFKGhkci0+bWFjX2hkcikpCisJCQlwcmludGsoIlxuIik7CisJfQorCisJUFJJTlRLX0JFMTYoSERSLCBoZHItPnJ0c19kdXJhdGlvbik7CisJUFJJTlRLX0JFMTYoSERSLCBoZHItPmxhc3RfZHVyYXRpb24pOworCVBSSU5US19CRTE2KEhEUiwgaGRyLT5zZWNfbGFzdF9kdXJhdGlvbik7CisJUFJJTlRLX0JFMTYoSERSLCBoZHItPm90aGVyX2R1cmF0aW9uKTsKKwlQUklOVEtfQkUxNihIRFIsIGhkci0+dHhfb3RoZXJfZHVyYXRpb24pOworCVBSSU5US19CRTE2KEhEUiwgaGRyLT5sYXN0XzExZ19sZW4pOworCVBSSU5US19CRTE2KEhEUiwgaGRyLT5vdGhlcl8xMWdfbGVuKTsKKwlQUklOVEtfQkUxNihIRFIsIGhkci0+bGFzdF8xMWJfbGVuKTsKKwlQUklOVEtfQkUxNihIRFIsIGhkci0+b3RoZXJfMTFiX2xlbik7CisKKwkvKiBGSVhNRSAqLworCXJlZyA9IGJlMTZfdG9fY3B1KGhkci0+cmVnNik7CisJUFJJTlRLX0JJVFMoSERSLCBNQkYpOworCVBSSU5US19CSVRTKEhEUiwgUlNWRDQpOworCisJUFJJTlRLX0JFMTYoSERSLCBoZHItPnJ4X2ZyYWdfc3RhdCk7CisKKwlQUklOVEtfQkUzMihIRFIsIGhkci0+dGltZV9zdGFtcCk7CisJUFJJTlRLX0JFMzIoSERSLCBoZHItPnBoeV9zdGF0c19oaSk7CisJUFJJTlRLX0JFMzIoSERSLCBoZHItPnBoeV9zdGF0c19sbyk7CisJUFJJTlRLX0JFMzIoSERSLCBoZHItPm1pY19rZXkwKTsKKwlQUklOVEtfQkUzMihIRFIsIGhkci0+bWljX2tleTEpOworfSAvKiBhZ254X3ByaW50X2hkciAqLworCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhZ254X3ByaW50X3J4X2hkcihzdHJ1Y3QgYWdueF9oZHIgKmhkcikKK3sKKwlhZ254X3ByaW50X2hkcihoZHIpOworCisJUFJJTlRLX0JFMTYoSERSLCBoZHItPnJ4LnJ4X3BhY2tldF9kdXJhdGlvbik7CisJUFJJTlRLX0JFMTYoSERSLCBoZHItPnJ4LnJlcGxheV9jbnQpOworCisJUFJJTlRLX1U4KEhEUiwgaGRyLT5yeF9jaGFubmVsKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGFnbnhfcHJpbnRfdHhfaGRyKHN0cnVjdCBhZ254X2hkciAqaGRyKQoreworCWFnbnhfcHJpbnRfaGRyKGhkcik7CisKKwlQUklOVEtfVTgoSERSLCBoZHItPnR4LmxvbmdfcmV0cnlfbGltaXQpOworCVBSSU5US19VOChIRFIsIGhkci0+dHguc2hvcnRfcmV0cnlfbGltaXQpOworCVBSSU5US19VOChIRFIsIGhkci0+dHgubG9uZ19yZXRyeV9jbnQpOworCVBSSU5US19VOChIRFIsIGhkci0+dHguc2hvcnRfcmV0cnlfY250KTsKKworCVBSSU5US19VOChIRFIsIGhkci0+cnhfY2hhbm5lbCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorYWdueF9wcmludF9zdGFfcG93ZXIoc3RydWN0IGFnbnhfcHJpdiAqcHJpdiwgdW5zaWduZWQgaW50IHN0YV9pZHgpCit7CisJc3RydWN0IGFnbnhfc3RhX3Bvd2VyIHBvd2VyOworCXUzMiByZWc7CisKKwlnZXRfc3RhX3Bvd2VyKHByaXYsICZwb3dlciwgc3RhX2lkeCk7CisKKwlyZWcgPSBsZTMyX3RvX2NwdShwb3dlci5yZWcpOworCVBSSU5US19CSVRTKFNUQV9QT1dFUiwgU0lHTkFMKTsKKwlQUklOVEtfQklUUyhTVEFfUE9XRVIsIFJBVEUpOworCVBSSU5US19CSVRTKFNUQV9QT1dFUiwgVElGUyk7CisJUFJJTlRLX0JJVFMoU1RBX1BPV0VSLCBFRENGKTsKKwlQUklOVEtfQklUUyhTVEFfUE9XRVIsIENIQU5ORUxfQk9ORCk7CisJUFJJTlRLX0JJVFMoU1RBX1BPV0VSLCBQSFlfTU9ERSk7CisJUFJJTlRLX0JJVFMoU1RBX1BPV0VSLCBQT1dFUl9MRVZFTCk7CisJUFJJTlRLX0JJVFMoU1RBX1BPV0VSLCBOVU1fVFJBTlNNSVRURVJTKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCithZ254X3ByaW50X3N0YV90eF93cShzdHJ1Y3QgYWdueF9wcml2ICpwcml2LCB1bnNpZ25lZCBpbnQgc3RhX2lkeCwgdW5zaWduZWQgaW50IHdxX2lkeCkKK3sKKwlzdHJ1Y3QgYWdueF9zdGFfdHhfd3EgdHhfd3E7CisJdTMyIHJlZzsKKworCWdldF9zdGFfdHhfd3EocHJpdiwgJnR4X3dxLCBzdGFfaWR4LCB3cV9pZHgpOworCisJcmVnID0gbGUzMl90b19jcHUodHhfd3EucmVnMCk7CisJUFJJTlRLX0JJVFMoU1RBX1RYX1dRLCBUQUlMX1BPSU5URVIpOworCVBSSU5US19CSVRTKFNUQV9UWF9XUSwgSEVBRF9QT0lOVEVSX0xPVyk7CisKKwlyZWcgPSBsZTMyX3RvX2NwdSh0eF93cS5yZWczKTsKKwlQUklOVEtfQklUUyhTVEFfVFhfV1EsIEhFQURfUE9JTlRFUl9ISUdIKTsKKwlQUklOVEtfQklUUyhTVEFfVFhfV1EsIEFDS19QT0lOVEVSX0xPVyk7CisKKwlyZWcgPSBsZTMyX3RvX2NwdSh0eF93cS5yZWcxKTsKKwlQUklOVEtfQklUUyhTVEFfVFhfV1EsIEFDS19QT0lOVEVSX0hJR0gpOworCVBSSU5US19CSVRTKFNUQV9UWF9XUSwgSEVBRF9USU1PVVRfVEFJTF9QQUNLX0NOVCk7CisJUFJJTlRLX0JJVFMoU1RBX1RYX1dRLCBBQ0tfVElNT1VUX1RBSUxfUEFDS19DTlQpOworCisJcmVnID0gbGUzMl90b19jcHUodHhfd3EucmVnMik7CisJUFJJTlRLX0JJVFMoU1RBX1RYX1dRLCBIRUFEX1RJTU9VVF9XSU5fTElNX0JZVEVfQ05UKTsKKwlQUklOVEtfQklUUyhTVEFfVFhfV1EsIEhFQURfVElNT1VUX1dJTl9MSU1fRlJBR19DTlQpOworCVBSSU5US19CSVRTKFNUQV9UWF9XUSwgV09SS19RVUVVRV9BQ0tfVFlQRSk7CisJUFJJTlRLX0JJVFMoU1RBX1RYX1dRLCBXT1JLX1FVRVVFX1ZBTElEKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGFnbnhfcHJpbnRfc3RhX3RyYWZmaWMoc3RydWN0IGFnbnhfc3RhX3RyYWZmaWMgKnRyYWZmaWMpCit7CisJdTMyIHJlZzsKKworCXJlZyA9IGxlMzJfdG9fY3B1KHRyYWZmaWMtPnJlZzApOworCVBSSU5US19CSVRTKFNUQV9UUkFGRklDLCBBQ0tfVElNT1VUX0NOVCk7CisJUFJJTlRLX0JJVFMoU1RBX1RSQUZGSUMsIFRSQUZGSUNfQUNLX1RZUEUpOworCVBSSU5US19CSVRTKFNUQV9UUkFGRklDLCBORVdfUEFDS0VUKTsKKwlQUklOVEtfQklUUyhTVEFfVFJBRkZJQywgVFJBRkZJQ19WQUxJRCk7CisJUFJJTlRLX0JJVFMoU1RBX1RSQUZGSUMsIFJYX0hEUl9ERVNDX1BPSU5URVIpOworCisJcmVnID0gbGUzMl90b19jcHUodHJhZmZpYy0+cmVnMSk7CisJUFJJTlRLX0JJVFMoU1RBX1RSQUZGSUMsIFJYX1BBQ0tFVF9USU1FU1RBTVApOworCVBSSU5US19CSVRTKFNUQV9UUkFGRklDLCBUUkFGRklDX1JFU0VSVkVEKTsKKwlQUklOVEtfQklUUyhTVEFfVFJBRkZJQywgU1YpOworCVBSSU5US19CSVRTKFNUQV9UUkFGRklDLCBSWF9TRVFVRU5DRV9OVU0pOworCisJUFJJTlRLX0xFMzIoU1RBX1RSQUZGSUMsIHRyYWZmaWMtPnR4X3JlcGxheV9jbnRfbG93KTsKKworCVBSSU5US19MRTE2KFNUQV9UUkFGRklDLCB0cmFmZmljLT50eF9yZXBsYXlfY250X2hpZ2gpOworCVBSSU5US19MRTE2KFNUQV9UUkFGRklDLCB0cmFmZmljLT5yeF9yZXBsYXlfY250X2hpZ2gpOworCisJUFJJTlRLX0xFMzIoU1RBX1RSQUZGSUMsIHRyYWZmaWMtPnJ4X3JlcGxheV9jbnRfbG93KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGFnbnhfcHJpbnRfc3RhKHN0cnVjdCBhZ254X3ByaXYgKnByaXYsIHVuc2lnbmVkIGludCBzdGFfaWR4KQoreworCXN0cnVjdCBhZ254X3N0YSBzdGF0aW9uOworCXN0cnVjdCBhZ254X3N0YSAqc3RhID0gJnN0YXRpb247CisJdTMyIHJlZzsKKwl1bnNpZ25lZCBpbnQgaTsKKworCWdldF9zdGEocHJpdiwgc3RhLCBzdGFfaWR4KTsKKworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisJCVBSSU5US19MRTMyKFNUQSwgc3RhLT50eF9zZXNzaW9uX2tleXNbaV0pOworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisJCVBSSU5US19MRTMyKFNUQSwgc3RhLT5yeF9zZXNzaW9uX2tleXNbaV0pOworCisJcmVnID0gbGUzMl90b19jcHUoc3RhLT5yZWcpOworCVBSSU5US19CSVRTKFNUQSwgSURfMSk7CisJUFJJTlRLX0JJVFMoU1RBLCBJRF8wKTsKKwlQUklOVEtfQklUUyhTVEEsIEVOQUJMRV9DT05DQVRFTkFUSU9OKTsKKwlQUklOVEtfQklUUyhTVEEsIEVOQUJMRV9ERUNPTVBSRVNTSU9OKTsKKwlQUklOVEtfQklUUyhTVEEsIFNUQV9SRVNFUlZFRCk7CisJUFJJTlRLX0JJVFMoU1RBLCBFQVApOworCVBSSU5US19CSVRTKFNUQSwgRURfTlVMTCk7CisJUFJJTlRLX0JJVFMoU1RBLCBFTkNSWVBUSU9OX1BPTElDWSk7CisJUFJJTlRLX0JJVFMoU1RBLCBERUZJTkVEX0tFWV9JRCk7CisJUFJJTlRLX0JJVFMoU1RBLCBGSVhFRF9LRVkpOworCVBSSU5US19CSVRTKFNUQSwgS0VZX1ZBTElEKTsKKwlQUklOVEtfQklUUyhTVEEsIFNUQVRJT05fVkFMSUQpOworCisJUFJJTlRLX0xFMzIoU1RBLCBzdGEtPnR4X2Flc19ibGtzX3VuaWNhc3QpOworCVBSSU5US19MRTMyKFNUQSwgc3RhLT5yeF9hZXNfYmxrc191bmljYXN0KTsKKworCVBSSU5US19MRTE2KFNUQSwgc3RhLT5hZXNfZm9ybWF0X2Vycl91bmljYXN0X2NudCk7CisJUFJJTlRLX0xFMTYoU1RBLCBzdGEtPmFlc19yZXBsYXlfdW5pY2FzdCk7CisKKwlQUklOVEtfTEUxNihTVEEsIHN0YS0+YWVzX2RlY3J5cHRfZXJyX3VuaWNhc3QpOworCVBSSU5US19MRTE2KFNUQSwgc3RhLT5hZXNfZGVjcnlwdF9lcnJfZGVmYXVsdCk7CisKKwlQUklOVEtfTEUxNihTVEEsIHN0YS0+c2luZ2xlX3JldHJ5X3BhY2tldHMpOworCVBSSU5US19MRTE2KFNUQSwgc3RhLT5mYWlsZWRfdHhfcGFja2V0cyk7CisKKwlQUklOVEtfTEUxNihTVEEsIHN0YS0+bXV0aV9yZXRyeV9wYWNrZXRzKTsKKwlQUklOVEtfTEUxNihTVEEsIHN0YS0+YWNrX3RpbWVvdXRzKTsKKworCVBSSU5US19MRTE2KFNUQSwgc3RhLT5mcmFnX3R4X2NudCk7CisJUFJJTlRLX0xFMTYoU1RBLCBzdGEtPnJ0c19icnFfc2VudCk7CisKKwlQUklOVEtfTEUxNihTVEEsIHN0YS0+dHhfcGFja2V0cyk7CisJUFJJTlRLX0xFMTYoU1RBLCBzdGEtPmN0c19iYWNrX3RpbWVvdXQpOworCisJUFJJTlRLX0xFMzIoU1RBLCBzdGEtPnBoeV9zdGF0c19oaWdoKTsKKwlQUklOVEtfTEUzMihTVEEsIHN0YS0+cGh5X3N0YXRzX2xvdyk7CisKKy8vCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJYWdueF9wcmludF9zdGFfdHJhZmZpYyhzdGEtPnRyYWZmaWMgKyAwKTsKKworCVBSSU5US19MRTE2KFNUQSwgc3RhLT50cmFmZmljX2NsYXNzMF9mcmFnX3N1Y2Nlc3MpOworCVBSSU5US19MRTE2KFNUQSwgc3RhLT50cmFmZmljX2NsYXNzMV9mcmFnX3N1Y2Nlc3MpOworCVBSSU5US19MRTE2KFNUQSwgc3RhLT50cmFmZmljX2NsYXNzMl9mcmFnX3N1Y2Nlc3MpOworCVBSSU5US19MRTE2KFNUQSwgc3RhLT50cmFmZmljX2NsYXNzM19mcmFnX3N1Y2Nlc3MpOworCVBSSU5US19MRTE2KFNUQSwgc3RhLT50cmFmZmljX2NsYXNzNF9mcmFnX3N1Y2Nlc3MpOworCVBSSU5US19MRTE2KFNUQSwgc3RhLT50cmFmZmljX2NsYXNzNV9mcmFnX3N1Y2Nlc3MpOworCVBSSU5US19MRTE2KFNUQSwgc3RhLT50cmFmZmljX2NsYXNzNl9mcmFnX3N1Y2Nlc3MpOworCVBSSU5US19MRTE2KFNUQSwgc3RhLT50cmFmZmljX2NsYXNzN19mcmFnX3N1Y2Nlc3MpOworCisJUFJJTlRLX0xFMTYoU1RBLCBzdGEtPm51bV9mcmFnX25vbl9wcmltZV9yYXRlcyk7CisJUFJJTlRLX0xFMTYoU1RBLCBzdGEtPmFja190aW1lb3V0X25vbl9wcmltZV9yYXRlcyk7Cit9CisKKworc3RhdGljIGlubGluZSB2b2lkIGR1bXBfaWVlZTgwMjExX2hkcihzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyLCBjaGFyICp0YWcpCit7CisJdTE2IGZjdGw7CisgICAgICAgIGludCBoZHJsZW47CisJREVDTEFSRV9NQUNfQlVGKG1hYyk7CisKKyAgICAgICAgZmN0bCA9IGxlMTZfdG9fY3B1KGhkci0+ZnJhbWVfY29udHJvbCk7CisJc3dpdGNoIChmY3RsICYgSUVFRTgwMjExX0ZDVExfRlRZUEUpIHsKKwljYXNlIElFRUU4MDIxMV9GVFlQRV9EQVRBOgorCQlwcmludGsoUEZYICIlcyBEQVRBICIsIHRhZyk7CisJCWJyZWFrOworCWNhc2UgSUVFRTgwMjExX0ZUWVBFX0NUTDoKKwkJcHJpbnRrKFBGWCAiJXMgQ1RMICIsIHRhZyk7CisJCWJyZWFrOworCWNhc2UgSUVFRTgwMjExX0ZUWVBFX01HTVQ6CisJCXByaW50ayhQRlggIiVzIE1HTVQgIiwgdGFnKTsKKwkJc3dpdGNoKGZjdGwgJiBJRUVFODAyMTFfRkNUTF9TVFlQRSkgeworCQljYXNlIElFRUU4MDIxMV9TVFlQRV9BU1NPQ19SRVE6CisJCQlwcmludGsoIlN1YlR5cGU6IEFTU09DX1JFUSAiKTsKKwkJCWJyZWFrOworCQljYXNlIElFRUU4MDIxMV9TVFlQRV9BU1NPQ19SRVNQOgorCQkJcHJpbnRrKCJTdWJUeXBlOiBBU1NPQ19SRVNQICIpOworCQkJYnJlYWs7CisJCWNhc2UgSUVFRTgwMjExX1NUWVBFX1JFQVNTT0NfUkVROgorCQkJcHJpbnRrKCJTdWJUeXBlOiBSRUFTU09DX1JFUSAiKTsKKwkJCWJyZWFrOworCQljYXNlIElFRUU4MDIxMV9TVFlQRV9SRUFTU09DX1JFU1A6CisJCQlwcmludGsoIlN1YlR5cGU6IFJFQVNTT0NfUkVTUCAiKTsKKwkJCWJyZWFrOworCQljYXNlIElFRUU4MDIxMV9TVFlQRV9QUk9CRV9SRVE6CisJCQlwcmludGsoIlN1YlR5cGU6IFBST0JFX1JFUSAiKTsKKwkJCWJyZWFrOworCQljYXNlIElFRUU4MDIxMV9TVFlQRV9QUk9CRV9SRVNQOgorCQkJcHJpbnRrKCJTdWJUeXBlOiBQUk9CRV9SRVNQICIpOworCQkJYnJlYWs7CisJCWNhc2UgSUVFRTgwMjExX1NUWVBFX0JFQUNPTjoKKwkJCXByaW50aygiU3ViVHlwZTogQkVBQ09OICIpOworCQkJYnJlYWs7CisJCWNhc2UgSUVFRTgwMjExX1NUWVBFX0FUSU06CisJCQlwcmludGsoIlN1YlR5cGU6IEFUSU0gIik7CisJCQlicmVhazsKKwkJY2FzZSBJRUVFODAyMTFfU1RZUEVfRElTQVNTT0M6CisJCQlwcmludGsoIlN1YlR5cGU6IERJU0FTU09DICIpOworCQkJYnJlYWs7CisJCWNhc2UgSUVFRTgwMjExX1NUWVBFX0FVVEg6CisJCQlwcmludGsoIlN1YlR5cGU6IEFVVEggIik7CisJCQlicmVhazsKKwkJY2FzZSBJRUVFODAyMTFfU1RZUEVfREVBVVRIOgorCQkJcHJpbnRrKCJTdWJUeXBlOiBERUFVVEggIik7CisJCQlicmVhazsKKwkJY2FzZSBJRUVFODAyMTFfU1RZUEVfQUNUSU9OOgorCQkJcHJpbnRrKCJTdWJUeXBlOiBBQ1RJT04gIik7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXByaW50aygiU3ViVHlwZTogVW5rbm93XG4iKTsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGsoUEZYICIlcyBQYWNrZXQgdHlwZTogVW5rbm93XG4iLCB0YWcpOworCX0KKworICAgICAgICBoZHJsZW4gPSBpZWVlODAyMTFfaGRybGVuKGZjdGwpOworCisJaWYgKGhkcmxlbiA+PSA0KQorCQlwcmludGsoIkZDPTB4JTA0eCBEVVI9MHglMDR4IiwKKwkJICAgICAgIGZjdGwsIGxlMTZfdG9fY3B1KGhkci0+ZHVyYXRpb25faWQpKTsKKwlpZiAoaGRybGVuID49IDEwKQorCQlwcmludGsoIiBBMT0lcyIsIHByaW50X21hYyhtYWMsIGhkci0+YWRkcjEpKTsKKwlpZiAoaGRybGVuID49IDE2KQorCQlwcmludGsoIiBBMj0lcyIsIHByaW50X21hYyhtYWMsIGhkci0+YWRkcjIpKTsKKwlpZiAoaGRybGVuID49IDI0KQorCQlwcmludGsoIiBBMz0lcyIsIHByaW50X21hYyhtYWMsIGhkci0+YWRkcjMpKTsKKwlpZiAoaGRybGVuID49IDMwKQorCQlwcmludGsoIiBBND0lcyIsIHByaW50X21hYyhtYWMsIGhkci0+YWRkcjQpKTsKKwlwcmludGsoIlxuIik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkdW1wX3R4bV9yZWdpc3RlcnMoc3RydWN0IGFnbnhfcHJpdiAqcHJpdikKK3sKKwl2b2lkIF9faW9tZW0gKmN0bCA9IHByaXYtPmN0bDsKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDw9MHgxZTg7IGkgKz0gNCkgeworCQlwcmludGsoS0VSTl9ERUJVRyBQRlggIlRYTTogJXgtLS0+IDB4JS44eFxuIiwgaSwgaW9yZWFkMzIoY3RsICsgaSkpOworCX0KK30KK3N0YXRpYyBpbmxpbmUgdm9pZCBkdW1wX3J4bV9yZWdpc3RlcnMoc3RydWN0IGFnbnhfcHJpdiAqcHJpdikKK3sKKwl2b2lkIF9faW9tZW0gKmN0bCA9IHByaXYtPmN0bDsKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDw9MHgxMDg7IGkgKz0gNCkKKwkJcHJpbnRrKEtFUk5fREVCVUcgUEZYICJSWE06ICV4LS0tPiAweCUuOHhcbiIsIGksIGlvcmVhZDMyKGN0bCArIDB4MjAwMCArIGkpKTsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCBkdW1wX2JtX3JlZ2lzdGVycyhzdHJ1Y3QgYWdueF9wcml2ICpwcml2KQoreworCXZvaWQgX19pb21lbSAqY3RsID0gcHJpdi0+Y3RsOworCWludCBpOworCWZvciAoaSA9IDA7IGkgPD0weDkwOyBpICs9IDQpCisJCXByaW50ayhLRVJOX0RFQlVHIFBGWCAiQk06ICV4LS0tPiAweCUuOHhcbiIsIGksIGlvcmVhZDMyKGN0bCArIDB4MmMwMCArIGkpKTsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCBkdW1wX2Npcl9yZWdpc3RlcnMoc3RydWN0IGFnbnhfcHJpdiAqcHJpdikKK3sKKwl2b2lkIF9faW9tZW0gKmN0bCA9IHByaXYtPmN0bDsKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDw9MHhiODsgaSArPSA0KQorCQlwcmludGsoS0VSTl9ERUJVRyBQRlggIkNJUjogJXgtLS0+IDB4JS44eFxuIiwgaSwgaW9yZWFkMzIoY3RsICsgMHgzMDAwICsgaSkpOworfQorCisjZW5kaWYgLyogQUdOWF9ERUJVR19IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FnbngvcGNpLmMgYi9kcml2ZXJzL3N0YWdpbmcvYWdueC9wY2kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTQ2MzBjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2FnbngvcGNpLmMKQEAgLTAsMCArMSw2NDQgQEAKKy8qKgorICogQWlyZ28gTUlNTyB3aXJlbGVzcyBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgTGkgWWFuQm8gPGRyZWFtZmx5MjgxQGdtYWlsLmNvbT4KKworICogVGhhbmtzIGZvciBKZWZmIFdpbGxpYW1zIDxhbmdlbGJhbmVAZ21haWwuY29tPiBkbyByZXZlcnNlIGVuZ2luZWVyCisgKiB3b3JrcyBhbmQgcHVibGlzaGVkIHRoZSBTUEVDUyBhdCBodHRwOi8vYWlyZ28ud2R3Y29uc3VsdGluZy5uZXQvbXltb2luCisKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisKKyNpbmNsdWRlICJhZ254LmgiCisjaW5jbHVkZSAiZGVidWcuaCIKKyNpbmNsdWRlICJ4bWl0LmgiCisjaW5jbHVkZSAicGh5LmgiCisKK01PRFVMRV9BVVRIT1IoIkxpIFlhbkJvIDxkcmVhbWZseTI4MUBnbWFpbC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFpcmdvIE1JTU8gUENJIHdpcmVsZXNzIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgYWdueF9wY2lfaWRfdGJsW10gX19kZXZpbml0ZGF0YSA9IHsKKwl7IFBDSV9ERVZJQ0UoMHgxN2NiLCAweDAwMDEpIH0sCS8qIEJla2xpbiBGNWQ4MDEwLCBOZXRnZWFyIFdHTTUxMSBldGMgKi8KKwl7IFBDSV9ERVZJQ0UoMHgxN2NiLCAweDAwMDIpIH0sCS8qIE5ldGdlYXIgV3BudDUxMSAqLworCXsgMCB9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgYWdueF9wY2lfaWRfdGJsKTsKKworCitzdGF0aWMgaW5saW5lIHZvaWQgYWdueF9pbnRlcnJ1cHRfYWNrKHN0cnVjdCBhZ254X3ByaXYgKnByaXYsIHUzMiAqcmVhc29uKQoreworCXZvaWQgX19pb21lbSAqY3RsID0gcHJpdi0+Y3RsOworCXUzMiByZWc7CisKKwlpZiAoICpyZWFzb24gJiBBR05YX1NUQVRfUlggKSB7CisJCS8qIE1hcmsgY29tcGxldGUgUlggKi8KKwkJcmVnID0gaW9yZWFkMzIoY3RsICsgQUdOWF9DSVJfUlhDVEwpOworCQlyZWcgfD0gMHg0OworCQlpb3dyaXRlMzIocmVnLCBjdGwgKyBBR05YX0NJUl9SWENUTCk7CisJCS8qIGRpc2FibGUgUnggaW50ZXJydXB0ICovCisJfQorCWlmICggKnJlYXNvbiAmIEFHTlhfU1RBVF9UWCApIHsKKwkJcmVnID0gaW9yZWFkMzIoY3RsICsgQUdOWF9DSVJfVFhEQ1RMKTsKKwkJaWYgKHJlZyAmIDB4NCkgeworCQkJaW93cml0ZTMyKHJlZywgY3RsICsgQUdOWF9DSVJfVFhEQ1RMKTsKKwkJCSpyZWFzb24gfD0gQUdOWF9TVEFUX1RYRDsKKwkJfQorIAkJcmVnID0gaW9yZWFkMzIoY3RsICsgQUdOWF9DSVJfVFhNQ1RMKTsKKwkJaWYgKHJlZyAmIDB4NCkgeworCQkJaW93cml0ZTMyKHJlZywgY3RsICsgQUdOWF9DSVJfVFhNQ1RMKTsKKwkJCSpyZWFzb24gfD0gQUdOWF9TVEFUX1RYTTsKKwkJfQorCX0KKwlpZiAoICpyZWFzb24gJiBBR05YX1NUQVRfWCApIHsKKy8qIAkJcmVnID0gaW9yZWFkMzIoY3RsICsgQUdOWF9JTlRfU1RBVCk7ICovCisvKiAJCWlvd3JpdGUzMihyZWcsIGN0bCArIEFHTlhfSU5UX1NUQVQpOyAqLworLyogCQkvXCogRklYTUUgcmVpbml0IGludGVycnVwdCBtYXNrICpcLyAqLworLyogCQlyZWcgPSAweGMzOTBiZjkgJiB+SVJRX1RYX0JFQUNPTjsgKi8KKy8qIAkJcmVnICY9IH5JUlFfVFhfRElTQUJMRTsgKi8KKy8qIAkJaW93cml0ZTMyKHJlZywgY3RsICsgQUdOWF9JTlRfTUFTSyk7ICovCisvKiAJCWlvd3JpdGUzMigweDgwMCwgY3RsICsgQUdOWF9DSVJfQkxLQ1RMKTsgKi8KKwl9Cit9IC8qIGFnbnhfaW50ZXJydXB0X2FjayAqLworCitzdGF0aWMgaXJxcmV0dXJuX3QgYWdueF9pbnRlcnJ1cHRfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJc3RydWN0IGllZWU4MDIxMV9odyAqZGV2ID0gZGV2X2lkOworCXN0cnVjdCBhZ254X3ByaXYgKnByaXYgPSBkZXYtPnByaXY7CisJdm9pZCBfX2lvbWVtICpjdGwgPSBwcml2LT5jdGw7CisJaXJxcmV0dXJuX3QgcmV0ID0gSVJRX05PTkU7CisJdTMyIGlycV9yZWFzb247CisKKwlzcGluX2xvY2soJnByaXYtPmxvY2spOworCisvLwlwcmludGsoS0VSTl9FUlIgUEZYICJHZXQgYSBpbnRlcnJ1cHQgJXNcbiIsIF9fZnVuY19fKTsKKworCWlmIChwcml2LT5pbml0X3N0YXR1cyAhPSBBR05YX1NUQVJUKQorCQlnb3RvIG91dDsKKworCS8qIEZpWE1FICBIZXJlIGhhcyBubyBsb2NrLCBJcyB0aGlzIHdpbGwgbGVhZCB0byByYWNlPyAqLworCWlycV9yZWFzb24gPSBpb3JlYWQzMihjdGwgKyBBR05YX0NJUl9CTEtDVEwpOworCWlmICghKGlycV9yZWFzb24gJiAweDcpKQorCQlnb3RvIG91dDsKKworCXJldCA9IElSUV9IQU5ETEVEOworCXByaXYtPmlycV9zdGF0dXMgPSBpb3JlYWQzMihjdGwgKyBBR05YX0lOVF9TVEFUKTsKKworLy8JcHJpbnRrKFBGWCAiSW50ZXJydXB0IHJlYXNvbiBpcyAweCV4XG4iLCBpcnFfcmVhc29uKTsKKwkvKiBNYWtlIHN1cmUgdGhlIHR4bSBhbmQgdHhkIGZsYWdzIGRvbid0IGNvbmZsaWN0IHdpdGggb3RoZXIgdW5rbm93bgorCSAgIGludGVycnVwdCBmbGFnLCBtYXliZSBpcyBub3QgbmVjZXNzYXJ5ICovCisJaXJxX3JlYXNvbiAmPSAweEY7CisKKwlkaXNhYmxlX3J4X2ludGVycnVwdChwcml2KTsKKwkvKiBUT0RPIE1ha2Ugc3VyZSB0aGUgY2FyZCBmaW5pc2hlZCBpbml0aWFsaXplZCAqLworCWFnbnhfaW50ZXJydXB0X2Fjayhwcml2LCAmaXJxX3JlYXNvbik7CisKKwlpZiAoIGlycV9yZWFzb24gJiBBR05YX1NUQVRfUlggKQorCQloYW5kbGVfcnhfaXJxKHByaXYpOworCWlmICggaXJxX3JlYXNvbiAmIEFHTlhfU1RBVF9UWEQgKQorCQloYW5kbGVfdHhkX2lycShwcml2KTsKKwlpZiAoIGlycV9yZWFzb24gJiBBR05YX1NUQVRfVFhNICkKKwkJaGFuZGxlX3R4bV9pcnEocHJpdik7CisJaWYgKCBpcnFfcmVhc29uICYgQUdOWF9TVEFUX1ggKQorCQloYW5kbGVfb3RoZXJfaXJxKHByaXYpOworCisJZW5hYmxlX3J4X2ludGVycnVwdChwcml2KTsKK291dDoKKwlzcGluX3VubG9jaygmcHJpdi0+bG9jayk7CisJcmV0dXJuIHJldDsKK30gLyogYWdueF9pbnRlcnJ1cHRfaGFuZGxlciAqLworCisKKy8qIEZJWE1FICovCitzdGF0aWMgaW50IGFnbnhfdHgoc3RydWN0IGllZWU4MDIxMV9odyAqZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCUFHTlhfVFJBQ0U7CisJcmV0dXJuIF9hZ254X3R4KGRldi0+cHJpdiwgc2tiKTsKK30gLyogYWdueF90eCAqLworCisKK3N0YXRpYyBpbnQgYWdueF9nZXRfbWFjX2FkZHJlc3Moc3RydWN0IGFnbnhfcHJpdiAqcHJpdikKK3sKKwl2b2lkIF9faW9tZW0gKmN0bCA9IHByaXYtPmN0bDsKKwl1MzIgcmVnOworCUFHTlhfVFJBQ0U7CisKKwkvKiBBdHRlbnRpb24hIGRpcmVjdGx5IHJlYWQgdGhlIE1BQyBvciBvdGhlciBkYXRlIGZyb20gRUVQUk9NIHdpbGwKKwkgbGVhZCB0byBjYXJkYnVzKFdHTTUxMSkgbG9jayB1cCB3aGVuIHdyaXRlIHRvIFBNIFBMTCByZWdpc3RlciAqLworCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgMHgzNTQ0KTsKKwl1ZGVsYXkoNDApOworCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgMHgzNTRjKTsKKwl1ZGVsYXkoNTApOworCS8qIEdldCB0aGUgbWFjIGFkZHJlc3MgKi8KKwlyZWcgPSBhZ254X3JlYWQzMihjdGwsIDB4MzU0NCk7CisJdWRlbGF5KDQwKTsKKworCS8qIEhBQ0sgKi8KKwlyZWcgPSBjcHVfdG9fbGUzMihyZWcpOworCXByaXYtPm1hY19hZGRyWzBdID0gKCh1OCAqKSZyZWcpWzJdOworCXByaXYtPm1hY19hZGRyWzFdID0gKCh1OCAqKSZyZWcpWzNdOworCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgMHgzNTQ4KTsKKwl1ZGVsYXkoNTApOworCSooKHUzMiAqKShwcml2LT5tYWNfYWRkciArIDIpKSA9IGNwdV90b19sZTMyKHJlZyk7CisKKwlpZiAoIWlzX3ZhbGlkX2V0aGVyX2FkZHIocHJpdi0+bWFjX2FkZHIpKSB7CisJCURFQ0xBUkVfTUFDX0JVRihtYnVmKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyBQRlggInJlYWQgbWFjICVzXG4iLCBwcmludF9tYWMobWJ1ZiwgcHJpdi0+bWFjX2FkZHIpKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyBQRlggIkludmFsaWQgaHdhZGRyISBVc2luZyByYW5kb20gaHdhZGRyXG4iKTsKKwkJcmFuZG9tX2V0aGVyX2FkZHIocHJpdi0+bWFjX2FkZHIpOworCX0KKworCXJldHVybiAwOworfSAvKiBhZ254X2dldF9tYWNfYWRkcmVzcyAqLworCitzdGF0aWMgaW50IGFnbnhfYWxsb2NfcmluZ3Moc3RydWN0IGFnbnhfcHJpdiAqcHJpdikKK3sKKwl1bnNpZ25lZCBpbnQgbGVuOworCUFHTlhfVFJBQ0U7CisKKwkvKiBBbGxvY2F0ZSBSWC9UWE0vVFhEIHJpbmdzIGluZm8gKi8KKwlwcml2LT5yeC5zaXplID0gQUdOWF9SWF9SSU5HX1NJWkU7CisJcHJpdi0+dHhtLnNpemUgPSBBR05YX1RYTV9SSU5HX1NJWkU7CisJcHJpdi0+dHhkLnNpemUgPSBBR05YX1RYRF9SSU5HX1NJWkU7CisKKwlsZW4gPSBwcml2LT5yeC5zaXplICsgcHJpdi0+dHhtLnNpemUgKyBwcml2LT50eGQuc2l6ZTsKKworLy8JcHJpdi0+cnguaW5mbyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhZ254X2luZm8pICogbGVuLCBHRlBfS0VSTkVMKTsKKwlwcml2LT5yeC5pbmZvID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGFnbnhfaW5mbykgKiBsZW4sIEdGUF9BVE9NSUMpOworCWlmICghcHJpdi0+cnguaW5mbykKKwkJcmV0dXJuIC1FTk9NRU07CisJcHJpdi0+dHhtLmluZm8gPSBwcml2LT5yeC5pbmZvICsgcHJpdi0+cnguc2l6ZTsKKwlwcml2LT50eGQuaW5mbyA9IHByaXYtPnR4bS5pbmZvICsgcHJpdi0+dHhtLnNpemU7CisKKwkvKiBBbGxvY2F0ZSBSWC9UWE0vVFhEIGRlc2NyaXB0b3JzICovCisJcHJpdi0+cnguZGVzYyA9IHBjaV9hbGxvY19jb25zaXN0ZW50KHByaXYtPnBkZXYsIHNpemVvZihzdHJ1Y3QgYWdueF9kZXNjKSAqIGxlbiwKKwkJCQkJICAgICAmcHJpdi0+cnguZG1hKTsKKwlpZiAoIXByaXYtPnJ4LmRlc2MpIHsKKwkJa2ZyZWUocHJpdi0+cnguaW5mbyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXByaXYtPnR4bS5kZXNjID0gcHJpdi0+cnguZGVzYyArIHByaXYtPnJ4LnNpemU7CisJcHJpdi0+dHhtLmRtYSA9IHByaXYtPnJ4LmRtYSArIHNpemVvZihzdHJ1Y3QgYWdueF9kZXNjKSAqIHByaXYtPnJ4LnNpemU7CisJcHJpdi0+dHhkLmRlc2MgPSBwcml2LT50eG0uZGVzYyArIHByaXYtPnR4bS5zaXplOworCXByaXYtPnR4ZC5kbWEgPSBwcml2LT50eG0uZG1hICsgc2l6ZW9mKHN0cnVjdCBhZ254X2Rlc2MpICogcHJpdi0+dHhtLnNpemU7CisKKwlyZXR1cm4gMDsKK30gLyogYWdueF9hbGxvY19yaW5ncyAqLworCitzdGF0aWMgdm9pZCByaW5nc19mcmVlKHN0cnVjdCBhZ254X3ByaXYgKnByaXYpCit7CisJdW5zaWduZWQgaW50IGxlbiA9IHByaXYtPnJ4LnNpemUgKyBwcml2LT50eG0uc2l6ZSArIHByaXYtPnR4ZC5zaXplOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJQUdOWF9UUkFDRTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CisJa2ZyZWUocHJpdi0+cnguaW5mbyk7CisJcGNpX2ZyZWVfY29uc2lzdGVudChwcml2LT5wZGV2LCBzaXplb2Yoc3RydWN0IGFnbnhfZGVzYykgKiBsZW4sCisJCQkgICAgcHJpdi0+cnguZGVzYywgcHJpdi0+cnguZG1hKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7Cit9CisKKyNpZiAwCitzdGF0aWMgdm9pZCBhZ254X3BlcmlvZGljX3dvcmtfaGFuZGxlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGFnbnhfcHJpdiAqcHJpdiA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgYWdueF9wcml2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyaW9kaWNfd29yay53b3JrKTsKKy8vCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgbG9uZyBkZWxheTsKKworCS8qIGZpeG1lOiB1c2luZyBtdXRleD8/ICovCisvLwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCisJLyogVE9ETyBSZWNhbGlicmF0ZSovCisvLwljYWxpYnJhdGVfb3NjaWxsYXRvcihwcml2KTsKKy8vCWFudGVubmFfY2FsaWJyYXRlKHByaXYpOworLy8JYWdueF9zZW5kX3BhY2tldChwcml2LCA5OTcpOworCS8qIEZJWE1FICovCisvKiAJaWYgKGRlYnVnID09IDMpICovCisvKiAgICAgICAgICAgICAgICAgZGVsYXkgPSBtc2Vjc190b19qaWZmaWVzKEFHTlhfUEVSSU9ESUNfREVMQVkpOyAqLworLyogCWVsc2UgKi8KKwlkZWxheSA9IG1zZWNzX3RvX2ppZmZpZXMoQUdOWF9QRVJJT0RJQ19ERUxBWSk7CisvLwkJZGVsYXkgPSByb3VuZF9qaWZmaWVzKEhaICogMTUpOworCisJcXVldWVfZGVsYXllZF93b3JrKHByaXYtPmh3LT53b3JrcXVldWUsICZwcml2LT5wZXJpb2RpY193b3JrLCBkZWxheSk7CisKKy8vCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IGFnbnhfc3RhcnQoc3RydWN0IGllZWU4MDIxMV9odyAqZGV2KQoreworCXN0cnVjdCBhZ254X3ByaXYgKnByaXYgPSBkZXYtPnByaXY7CisJLyogdW5zaWduZWQgbG9uZyBkZWxheTsgKi8KKwlpbnQgZXJyID0gMDsKKwlBR05YX1RSQUNFOworCisJZXJyID0gYWdueF9hbGxvY19yaW5ncyhwcml2KTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIkNhbid0IGFsbG9jIFJYL1RYTS9UWEQgcmluZ3NcbiIpOworCQlnb3RvIG91dDsKKwl9CisJZXJyID0gcmVxdWVzdF9pcnEocHJpdi0+cGRldi0+aXJxLCAmYWdueF9pbnRlcnJ1cHRfaGFuZGxlciwKKwkJCSAgSVJRRl9TSEFSRUQsICJhZ254X3BjaSIsIGRldik7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJGYWlsZWQgdG8gcmVnaXN0ZXIgSVJRIGhhbmRsZXJcbiIpOworCQlyaW5nc19mcmVlKHByaXYpOworCQlnb3RvIG91dDsKKwl9CisKKy8vCW1kZWxheSg1MDApOworCisJbWlnaHRfc2xlZXAoKTsKKwlhZ254X2h3X2luaXQocHJpdik7CisKKy8vCW1kZWxheSg1MDApOworCW1pZ2h0X3NsZWVwKCk7CisKKwlwcml2LT5pbml0X3N0YXR1cyA9IEFHTlhfU1RBUlQ7CisvKiAgICAgICAgIElOSVRfREVMQVlFRF9XT1JLKCZwcml2LT5wZXJpb2RpY193b3JrLCBhZ254X3BlcmlvZGljX3dvcmtfaGFuZGxlcik7ICovCisvKiAJZGVsYXkgPSBtc2Vjc190b19qaWZmaWVzKEFHTlhfUEVSSU9ESUNfREVMQVkpOyAqLworLyogICAgICAgICBxdWV1ZV9kZWxheWVkX3dvcmsocHJpdi0+aHctPndvcmtxdWV1ZSwgJnByaXYtPnBlcmlvZGljX3dvcmssIGRlbGF5KTsgKi8KK291dDoKKwlyZXR1cm4gZXJyOworfSAvKiBhZ254X3N0YXJ0ICovCisKK3N0YXRpYyB2b2lkIGFnbnhfc3RvcChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpkZXYpCit7CisJc3RydWN0IGFnbnhfcHJpdiAqcHJpdiA9IGRldi0+cHJpdjsKKwlBR05YX1RSQUNFOworCisJcHJpdi0+aW5pdF9zdGF0dXMgPSBBR05YX1NUT1A7CisJLyogbWFrZSBzdXJlIGhhcmR3YXJlIHdpbGwgbm90IGdlbmVyYXRlIGlycSAqLworCWFnbnhfaHdfcmVzZXQocHJpdik7CisJZnJlZV9pcnEocHJpdi0+cGRldi0+aXJxLCBkZXYpOworICAgICAgICBmbHVzaF93b3JrcXVldWUocHJpdi0+aHctPndvcmtxdWV1ZSk7CisvLwljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJnByaXYtPnBlcmlvZGljX3dvcmspOworCXVuZmlsbF9yaW5ncyhwcml2KTsKKwlyaW5nc19mcmVlKHByaXYpOworfQorCitzdGF0aWMgaW50IGFnbnhfY29uZmlnKHN0cnVjdCBpZWVlODAyMTFfaHcgKmRldiwKKwkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfY29uZiAqY29uZikKK3sKKwlzdHJ1Y3QgYWdueF9wcml2ICpwcml2ID0gZGV2LT5wcml2OworCWludCBjaGFubmVsID0gaWVlZTgwMjExX2ZyZXF1ZW5jeV90b19jaGFubmVsKGNvbmYtPmNoYW5uZWwtPmNlbnRlcl9mcmVxKTsKKwlBR05YX1RSQUNFOworCisJc3Bpbl9sb2NrKCZwcml2LT5sb2NrKTsKKwkvKiBGSVhNRSBuZWVkIHByaXYgbG9jaz8gKi8KKwlpZiAoY2hhbm5lbCAhPSBwcml2LT5jaGFubmVsKSB7CisJCXByaXYtPmNoYW5uZWwgPSBjaGFubmVsOworCQlhZ254X3NldF9jaGFubmVsKHByaXYsIHByaXYtPmNoYW5uZWwpOworCX0KKworCXNwaW5fdW5sb2NrKCZwcml2LT5sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhZ254X2NvbmZpZ19pbnRlcmZhY2Uoc3RydWN0IGllZWU4MDIxMV9odyAqZGV2LAorCQkJCSBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAorCQkJCSBzdHJ1Y3QgaWVlZTgwMjExX2lmX2NvbmYgKmNvbmYpCit7CisJc3RydWN0IGFnbnhfcHJpdiAqcHJpdiA9IGRldi0+cHJpdjsKKwl2b2lkIF9faW9tZW0gKmN0bCA9IHByaXYtPmN0bDsKKwlBR05YX1RSQUNFOworCisJc3Bpbl9sb2NrKCZwcml2LT5sb2NrKTsKKworCWlmIChtZW1jbXAoY29uZi0+YnNzaWQsIHByaXYtPmJzc2lkLCBFVEhfQUxFTikpIHsKKy8vCQl1MzIgcmVnaGksIHJlZ2xvOworCQlhZ254X3NldF9ic3NpZChwcml2LCBjb25mLT5ic3NpZCk7CisJCW1lbWNweShwcml2LT5ic3NpZCwgY29uZi0+YnNzaWQsIEVUSF9BTEVOKTsKKwkJaGFzaF93cml0ZShwcml2LCBjb25mLT5ic3NpZCwgQlNTSURfU1RBSUQpOworCQlzdGFfaW5pdChwcml2LCBCU1NJRF9TVEFJRCk7CisJCS8qIEZJWE1FIG5lZWRlZD8gKi8KKwkJc3RhX3Bvd2VyX2luaXQocHJpdiwgQlNTSURfU1RBSUQpOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0JNX01UU00sIDB4ZmYgJiB+MHgxKTsKKwl9CisJc3Bpbl91bmxvY2soJnByaXYtPmxvY2spOworCXJldHVybiAwOworfSAvKiBhZ254X2NvbmZpZ19pbnRlcmZhY2UgKi8KKworCitzdGF0aWMgdm9pZCBhZ254X2NvbmZpZ3VyZV9maWx0ZXIoc3RydWN0IGllZWU4MDIxMV9odyAqZGV2LAorCQkJCSAgdW5zaWduZWQgaW50IGNoYW5nZWRfZmxhZ3MsCisJCQkJICB1bnNpZ25lZCBpbnQgKnRvdGFsX2ZsYWdzLAorCQkJCSAgaW50IG1jX2NvdW50LCBzdHJ1Y3QgZGV2X21jX2xpc3QgKm1jbGlzdCkKK3sKKwl1bnNpZ25lZCBpbnQgbmV3X2ZsYWdzID0gMDsKKworCSp0b3RhbF9mbGFncyA9IG5ld19mbGFnczsKKwkvKiBUT0RPICovCit9CisKK3N0YXRpYyBpbnQgYWdueF9hZGRfaW50ZXJmYWNlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmRldiwKKwkJCSAgICAgIHN0cnVjdCBpZWVlODAyMTFfaWZfaW5pdF9jb25mICpjb25mKQoreworCXN0cnVjdCBhZ254X3ByaXYgKnByaXYgPSBkZXYtPnByaXY7CisJQUdOWF9UUkFDRTsKKworCXNwaW5fbG9jaygmcHJpdi0+bG9jayk7CisJLyogRklYTUUgKi8KKwlpZiAocHJpdi0+bW9kZSAhPSBOTDgwMjExX0lGVFlQRV9NT05JVE9SKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlzd2l0Y2ggKGNvbmYtPnR5cGUpIHsKKwljYXNlIE5MODAyMTFfSUZUWVBFX1NUQVRJT046CisJCXByaXYtPm1vZGUgPSBjb25mLT50eXBlOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJfQorCisJc3Bpbl91bmxvY2soJnByaXYtPmxvY2spOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGFnbnhfcmVtb3ZlX2ludGVyZmFjZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpkZXYsCisJCQkJICBzdHJ1Y3QgaWVlZTgwMjExX2lmX2luaXRfY29uZiAqY29uZikKK3sKKwlzdHJ1Y3QgYWdueF9wcml2ICpwcml2ID0gZGV2LT5wcml2OworCUFHTlhfVFJBQ0U7CisKKwkvKiBUT0RPICovCisJcHJpdi0+bW9kZSA9IE5MODAyMTFfSUZUWVBFX01PTklUT1I7Cit9CisKK3N0YXRpYyBpbnQgYWdueF9nZXRfc3RhdHMoc3RydWN0IGllZWU4MDIxMV9odyAqZGV2LAorCQkJICBzdHJ1Y3QgaWVlZTgwMjExX2xvd19sZXZlbF9zdGF0cyAqc3RhdHMpCit7CisJc3RydWN0IGFnbnhfcHJpdiAqcHJpdiA9IGRldi0+cHJpdjsKKwlBR05YX1RSQUNFOworCXNwaW5fbG9jaygmcHJpdi0+bG9jayk7CisJLyogVE9ETyAhISAqLworCW1lbWNweShzdGF0cywgJnByaXYtPnN0YXRzLCBzaXplb2YoKnN0YXRzKSk7CisJc3Bpbl91bmxvY2soJnByaXYtPmxvY2spOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1NjQgYWdueF9nZXRfdHNmdChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpkZXYpCit7CisJdm9pZCBfX2lvbWVtICpjdGwgPSAoKHN0cnVjdCBhZ254X3ByaXYgKilkZXYtPnByaXYpLT5jdGw7CisJdTMyIHRzZnRsOworCXU2NCB0c2Z0OworCUFHTlhfVFJBQ0U7CisKKwkvKiBGSVhNRSAqLworCXRzZnRsID0gaW9yZWFkMzIoY3RsICsgQUdOWF9UWE1fVElNRVNUQU1QTE8pOworCXRzZnQgPSBpb3JlYWQzMihjdGwgKyBBR05YX1RYTV9USU1FU1RBTVBISSk7CisJdHNmdCA8PD0gMzI7CisJdHNmdCB8PSB0c2Z0bDsKKworCXJldHVybiB0c2Z0OworfQorCitzdGF0aWMgaW50IGFnbnhfZ2V0X3R4X3N0YXRzKHN0cnVjdCBpZWVlODAyMTFfaHcgKmRldiwKKwkJCSAgICAgc3RydWN0IGllZWU4MDIxMV90eF9xdWV1ZV9zdGF0cyAqc3RhdHMpCit7CisJc3RydWN0IGFnbnhfcHJpdiAqcHJpdiA9IGRldi0+cHJpdjsKKwlBR05YX1RSQUNFOworCisJLyogRklYTUUgbm93IHdlIGp1c3QgdXNpbmcgdHhkIHF1ZXVlLCBidXQgc2hvdWxkIHVzaW5nIHR4bSBxdWV1ZSB0b28gKi8KKwlzdGF0c1swXS5sZW4gPSAocHJpdi0+dHhkLmlkeCAtIHByaXYtPnR4ZC5pZHhfc2VudCkgLyAyOworCXN0YXRzWzBdLmxpbWl0ID0gcHJpdi0+dHhkLnNpemUgLSAyOworCXN0YXRzWzBdLmNvdW50ID0gcHJpdi0+dHhkLmlkeCAvIDI7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBpZWVlODAyMTFfb3BzIGFnbnhfb3BzID0geworCS50eAkJCT0gYWdueF90eCwKKwkuc3RhcnQJCQk9IGFnbnhfc3RhcnQsCisJLnN0b3AJCQk9IGFnbnhfc3RvcCwKKwkuYWRkX2ludGVyZmFjZQkJPSBhZ254X2FkZF9pbnRlcmZhY2UsCisJLnJlbW92ZV9pbnRlcmZhY2UJPSBhZ254X3JlbW92ZV9pbnRlcmZhY2UsCisJLmNvbmZpZwkJCT0gYWdueF9jb25maWcsCisJLmNvbmZpZ19pbnRlcmZhY2UJPSBhZ254X2NvbmZpZ19pbnRlcmZhY2UsCisgCS5jb25maWd1cmVfZmlsdGVyCT0gYWdueF9jb25maWd1cmVfZmlsdGVyLAorCS5nZXRfc3RhdHMJCT0gYWdueF9nZXRfc3RhdHMsCisJLmdldF90eF9zdGF0cwkJPSBhZ254X2dldF90eF9zdGF0cywKKwkuZ2V0X3RzZgkJPSBhZ254X2dldF90c2Z0Cit9OworCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgYWdueF9wY2lfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBpZWVlODAyMTFfaHcgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgYWdueF9wcml2ICpwcml2ID0gZGV2LT5wcml2OworCUFHTlhfVFJBQ0U7CisKKwlpZiAoIWRldikKKwkJcmV0dXJuOworCWllZWU4MDIxMV91bnJlZ2lzdGVyX2h3KGRldik7CisJcGNpX2lvdW5tYXAocGRldiwgcHJpdi0+Y3RsKTsKKwlwY2lfaW91bm1hcChwZGV2LCBwcml2LT5kYXRhKTsKKwlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKworCWllZWU4MDIxMV9mcmVlX2h3KGRldik7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGFnbnhfcGNpX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJCSAgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IGllZWU4MDIxMV9odyAqZGV2OworCXN0cnVjdCBhZ254X3ByaXYgKnByaXY7CisJdTMyIG1lbV9hZGRyMCwgbWVtX2xlbjA7CisJdTMyIG1lbV9hZGRyMSwgbWVtX2xlbjE7CisJaW50IGVycjsKKwlERUNMQVJFX01BQ19CVUYobWFjKTsKKworCWVyciA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQ2FuJ3QgZW5hYmxlIG5ldyBQQ0kgZGV2aWNlXG4iKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwkvKiBnZXQgcGNpIHJlc291cmNlICovCisJbWVtX2FkZHIwID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApOworCW1lbV9sZW4wID0gcGNpX3Jlc291cmNlX2xlbihwZGV2LCAwKTsKKwltZW1fYWRkcjEgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMSk7CisJbWVtX2xlbjEgPSBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDEpOworCXByaW50ayhLRVJOX0RFQlVHIFBGWCAiTWVtYWRkcjAgaXMgJXgsIGxlbmd0aCBpcyAleFxuIiwgbWVtX2FkZHIwLCBtZW1fbGVuMCk7CisJcHJpbnRrKEtFUk5fREVCVUcgUEZYICJNZW1hZGRyMSBpcyAleCwgbGVuZ3RoIGlzICV4XG4iLCBtZW1fYWRkcjEsIG1lbV9sZW4xKTsKKworCWVyciA9IHBjaV9yZXF1ZXN0X3JlZ2lvbnMocGRldiwgImFnbngtcGNpIik7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJDYW4ndCBvYnRhaW4gUENJIHJlc291cmNlXG4iKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlpZiAocGNpX3NldF9kbWFfbWFzayhwZGV2LCBETUFfMzJCSVRfTUFTSykgfHwKKwkgICAgcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBkZXYsIERNQV8zMkJJVF9NQVNLKSkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJObyBzdWl0YWJsZSBETUEgYXZhaWxhYmxlXG4iKTsKKwkJZ290byBlcnJfZnJlZV9yZWc7CisJfQorCisJcGNpX3NldF9tYXN0ZXIocGRldik7CisJcHJpbnRrKEtFUk5fREVCVUcgUEZYICJwZGV2LT5pcnEgaXMgJWRcbiIsIHBkZXYtPmlycSk7CisKKwlkZXYgPSBpZWVlODAyMTFfYWxsb2NfaHcoc2l6ZW9mKCpwcml2KSwgJmFnbnhfb3BzKTsKKwlpZiAoIWRldikgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJpZWVlODAyMTEgYWxsb2MgZmFpbGVkXG4iKTsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBlcnJfZnJlZV9yZWc7CisJfQorCS8qIGluaXQgcHJpdiAgKi8KKwlwcml2ID0gZGV2LT5wcml2OworCW1lbXNldChwcml2LCAwLCBzaXplb2YoKnByaXYpKTsKKwlwcml2LT5tb2RlID0gTkw4MDIxMV9JRlRZUEVfTU9OSVRPUjsKKwlwcml2LT5wZGV2ID0gcGRldjsKKwlwcml2LT5odyA9IGRldjsKKwlzcGluX2xvY2tfaW5pdCgmcHJpdi0+bG9jayk7CisJcHJpdi0+aW5pdF9zdGF0dXMgPSBBR05YX1VOSU5JVDsKKworCS8qIE1hcCBtZW0gIzEgYW5kICMyICovCisJcHJpdi0+Y3RsID0gcGNpX2lvbWFwKHBkZXYsIDAsIG1lbV9sZW4wKTsKKy8vCXByaW50ayhLRVJOX0RFQlVHIFBGWCJNRU0xIG1hcHBlZCBhZGRyZXNzIGlzIDB4JXBcbiIsIHByaXYtPmN0bCk7CisJaWYgKCFwcml2LT5jdGwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQ2FuJ3QgbWFwIGRldmljZSBtZW1vcnlcbiIpOworCQlnb3RvIGVycl9mcmVlX2RldjsKKwl9CisJcHJpdi0+ZGF0YSA9IHBjaV9pb21hcChwZGV2LCAxLCBtZW1fbGVuMSk7CisJcHJpbnRrKEtFUk5fREVCVUcgUEZYICJNRU0yIG1hcHBlZCBhZGRyZXNzIGlzIDB4JXBcbiIsIHByaXYtPmRhdGEpOworCWlmICghcHJpdi0+ZGF0YSkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJDYW4ndCBtYXAgZGV2aWNlIG1lbW9yeVxuIik7CisJCWdvdG8gZXJyX2lvdW5tYXAyOworCX0KKworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIFBDSV9SRVZJU0lPTl9JRCwgJnByaXYtPnJldmlkKTsKKworCXByaXYtPmJhbmQuY2hhbm5lbHMgICA9IChzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKilhZ254X2NoYW5uZWxzOworCXByaXYtPmJhbmQubl9jaGFubmVscyA9IEFSUkFZX1NJWkUoYWdueF9jaGFubmVscyk7CisJcHJpdi0+YmFuZC5iaXRyYXRlcyAgID0gKHN0cnVjdCBpZWVlODAyMTFfcmF0ZSAqKWFnbnhfcmF0ZXNfODAyMTFnOworCXByaXYtPmJhbmQubl9iaXRyYXRlcyA9IEFSUkFZX1NJWkUoYWdueF9yYXRlc184MDIxMWcpOworCisJLyogSW5pdCBpZWVlODAyLjExIGRldiAgKi8KKwlTRVRfSUVFRTgwMjExX0RFVihkZXYsICZwZGV2LT5kZXYpOworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBkZXYpOworCWRldi0+ZXh0cmFfdHhfaGVhZHJvb20gPSBzaXplb2Yoc3RydWN0IGFnbnhfaGRyKTsKKworCS8qIEZJWE1FIEl0IG9ubHkgaW5jbHVkZSBGQ1MgaW4gcHJvbWlvdXMgbW9kZSBidXQgbm90IG1hbmFnZSBtb2RlICovCisvKiAgICAgIGRldi0+ZmxhZ3MgPSAgSUVFRTgwMjExX0hXX1JYX0lOQ0xVREVTX0ZDUzsgKi8KKwlkZXYtPmNoYW5uZWxfY2hhbmdlX3RpbWUgPSA1MDAwOworCWRldi0+bWF4X3NpZ25hbCA9IDEwMDsKKwkvKiBGSVhNRSAqLworCWRldi0+cXVldWVzID0gMTsKKworCWFnbnhfZ2V0X21hY19hZGRyZXNzKHByaXYpOworCisJU0VUX0lFRUU4MDIxMV9QRVJNX0FERFIoZGV2LCBwcml2LT5tYWNfYWRkcik7CisKKy8qIAkvXCogRklYTUUgKlwvICovCisvKiAJZm9yIChpID0gMTsgaSA8IE5VTV9EUklWRV9NT0RFUzsgaSsrKSB7ICovCisvKiAJCWVyciA9IGllZWU4MDIxMV9yZWdpc3Rlcl9od21vZGUoZGV2LCAmcHJpdi0+bW9kZXNbaV0pOyAqLworLyogCQlpZiAoZXJyKSB7ICovCisvKiAJCQlwcmludGsoS0VSTl9FUlIgUEZYICJDYW4ndCByZWdpc3RlciBod21vZGVcbiIpOyAqLworLyogCQkJZ290byAgZXJyX2lvdW5tYXA7ICovCisvKiAJCX0gKi8KKy8qIAl9ICovCisKKwlwcml2LT5jaGFubmVsID0gMTsKKwlkZXYtPndpcGh5LT5iYW5kc1tJRUVFODAyMTFfQkFORF8yR0haXSA9ICZwcml2LT5iYW5kOworCisJZXJyID0gaWVlZTgwMjExX3JlZ2lzdGVyX2h3KGRldik7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJDYW4ndCByZWdpc3RlciBoYXJkd2FyZVxuIik7CisJCWdvdG8gZXJyX2lvdW5tYXA7CisJfQorCisJYWdueF9od19yZXNldChwcml2KTsKKworCisJcHJpbnRrKFBGWCAiJXM6IGh3YWRkciAlcywgUmV2IDB4JTAyeFxuIiwgd2lwaHlfbmFtZShkZXYtPndpcGh5KSwKKwkgICAgICAgcHJpbnRfbWFjKG1hYywgZGV2LT53aXBoeS0+cGVybV9hZGRyKSwgcHJpdi0+cmV2aWQpOworCXJldHVybiAwOworCisgZXJyX2lvdW5tYXA6CisJcGNpX2lvdW5tYXAocGRldiwgcHJpdi0+ZGF0YSk7CisKKyBlcnJfaW91bm1hcDI6CisJcGNpX2lvdW5tYXAocGRldiwgcHJpdi0+Y3RsKTsKKworIGVycl9mcmVlX2RldjoKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisJaWVlZTgwMjExX2ZyZWVfaHcoZGV2KTsKKworIGVycl9mcmVlX3JlZzoKKwlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworCisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCXJldHVybiBlcnI7Cit9IC8qIGFnbnhfcGNpX3Byb2JlKi8KKworI2lmZGVmIENPTkZJR19QTQorCitzdGF0aWMgaW50IGFnbnhfcGNpX3N1c3BlbmQoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJQUdOWF9UUkFDRTsKKworCWllZWU4MDIxMV9zdG9wX3F1ZXVlcyhkZXYpOworCWFnbnhfc3RvcChkZXYpOworCisJcGNpX3NhdmVfc3RhdGUocGRldik7CisJcGNpX3NldF9wb3dlcl9zdGF0ZShwZGV2LCBwY2lfY2hvb3NlX3N0YXRlKHBkZXYsIHN0YXRlKSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWdueF9wY2lfcmVzdW1lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBpZWVlODAyMTFfaHcgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlBR05YX1RSQUNFOworCisJcGNpX3NldF9wb3dlcl9zdGF0ZShwZGV2LCBQQ0lfRDApOworCXBjaV9yZXN0b3JlX3N0YXRlKHBkZXYpOworCisJYWdueF9zdGFydChkZXYpOworCWllZWU4MDIxMV93YWtlX3F1ZXVlcyhkZXYpOworCisJcmV0dXJuIDA7Cit9CisKKyNlbHNlCisKKyNkZWZpbmUgYWdueF9wY2lfc3VzcGVuZCBOVUxMCisjZGVmaW5lIGFnbnhfcGNpX3Jlc3VtZSBOVUxMCisKKyNlbmRpZiAvKiBDT05GSUdfUE0gKi8KKworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgYWdueF9wY2lfZHJpdmVyID0geworCS5uYW1lCQk9ICJhZ254LXBjaSIsCisJLmlkX3RhYmxlCT0gYWdueF9wY2lfaWRfdGJsLAorCS5wcm9iZQkJPSBhZ254X3BjaV9wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGFnbnhfcGNpX3JlbW92ZSksCisJLnN1c3BlbmQJPSBhZ254X3BjaV9zdXNwZW5kLAorCS5yZXN1bWUJCT0gYWdueF9wY2lfcmVzdW1lLAorfTsKKworc3RhdGljIGludCBfX2luaXQgYWdueF9wY2lfaW5pdCh2b2lkKQoreworCUFHTlhfVFJBQ0U7CisJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJmFnbnhfcGNpX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBhZ254X3BjaV9leGl0KHZvaWQpCit7CisJQUdOWF9UUkFDRTsKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmFnbnhfcGNpX2RyaXZlcik7Cit9CisKKworbW9kdWxlX2luaXQoYWdueF9wY2lfaW5pdCk7Cittb2R1bGVfZXhpdChhZ254X3BjaV9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hZ254L3BoeS5jIGIvZHJpdmVycy9zdGFnaW5nL2FnbngvcGh5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGE4ZjEwYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9hZ254L3BoeS5jCkBAIC0wLDAgKzEsOTYwIEBACisvKioKKyAqIEFpcmdvIE1JTU8gd2lyZWxlc3MgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA3IExpIFlhbkJvIDxkcmVhbWZseTI4MUBnbWFpbC5jb20+CisKKyAqIFRoYW5rcyBmb3IgSmVmZiBXaWxsaWFtcyA8YW5nZWxiYW5lQGdtYWlsLmNvbT4gZG8gcmV2ZXJzZSBlbmdpbmVlcgorICogd29ya3MgYW5kIHB1Ymxpc2hlZCB0aGUgU1BFQ1MgYXQgaHR0cDovL2FpcmdvLndkd2NvbnN1bHRpbmcubmV0L215bW9pbgorCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgImFnbnguaCIKKyNpbmNsdWRlICJkZWJ1Zy5oIgorI2luY2x1ZGUgInBoeS5oIgorI2luY2x1ZGUgInRhYmxlLmgiCisjaW5jbHVkZSAic3RhLmgiCisjaW5jbHVkZSAieG1pdC5oIgorCit1OCByZWFkX2Zyb21fZWVwcm9tKHN0cnVjdCBhZ254X3ByaXYgKnByaXYsIHUxNiBhZGRyZXNzKQoreworCXZvaWQgX19pb21lbSAqY3RsID0gcHJpdi0+Y3RsOworCXN0cnVjdCBhZ254X2VlcHJvbSBjbWQ7CisJdTMyIHJlZzsKKworCW1lbXNldCgmY21kLCAwLCBzaXplb2YoY21kKSk7CisJY21kLmNtZCA9IEVFUFJPTV9DTURfUkVBRCA8PCBBR05YX0VFUFJPTV9DT01NQU5EX1NISUZUOworCWNtZC5hZGRyZXNzID0gYWRkcmVzczsKKwkvKiBWZXJpZnkgdGhhdCB0aGUgU3RhdHVzIGJpdCBpcyBjbGVhciAqLworCS8qIFJlYWQgQ29tbWFuZCBhbmQgQWRkcmVzcyBhcmUgd3JpdHRlbiB0byB0aGUgU2VyaWFsIEludGVyZmFjZSAqLworCWlvd3JpdGUzMigqKF9fbGUzMiAqKSZjbWQsIGN0bCArIEFHTlhfQ0lSX1NFUklBTElURik7CisJLyogV2FpdCBmb3IgdGhlIFN0YXR1cyBiaXQgdG8gY2xlYXIgYWdhaW4gKi8KKwllZXByb21fZGVsYXkoKTsKKwkvKiBSZWFkIGZyb20gRGF0YSAqLworCXJlZyA9IGlvcmVhZDMyKGN0bCArIEFHTlhfQ0lSX1NFUklBTElURik7CisKKwljbWQgPSAqKHN0cnVjdCBhZ254X2VlcHJvbSAqKSZyZWc7CisKKwlyZXR1cm4gY21kLmRhdGE7Cit9CisKK3N0YXRpYyBpbnQgY2FyZF9mdWxsX3Jlc2V0KHN0cnVjdCBhZ254X3ByaXYgKnByaXYpCit7CisJdm9pZCBfX2lvbWVtICpjdGwgPSBwcml2LT5jdGw7CisJdTMyIHJlZzsKKwlBR05YX1RSQUNFOworCisJcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX0NJUl9CTEtDVEwpOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQ0lSX0JMS0NUTCwgMHg4MCk7CisJcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX0NJUl9CTEtDVEwpOworCXJldHVybiAwOworfQorCitpbmxpbmUgdm9pZCBlbmFibGVfcG93ZXJfc2F2aW5nKHN0cnVjdCBhZ254X3ByaXYgKnByaXYpCit7CisJdm9pZCBfX2lvbWVtICpjdGwgPSBwcml2LT5jdGw7CisJdTMyIHJlZzsKKworCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9QTV9QTUNUTCk7CisJcmVnICY9IH4weDg7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9QTV9QTUNUTCwgcmVnKTsKK30KKworaW5saW5lIHZvaWQgZGlzYWJsZV9wb3dlcl9zYXZpbmcoc3RydWN0IGFnbnhfcHJpdiAqcHJpdikKK3sKKwl2b2lkIF9faW9tZW0gKmN0bCA9IHByaXYtPmN0bDsKKwl1MzIgcmVnOworCisJcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX1BNX1BNQ1RMKTsKKwlyZWcgfD0gMHg4OworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfUE1fUE1DVEwsIHJlZyk7Cit9CisKKwordm9pZCBkaXNhYmxlX3JlY2VpdmVyKHN0cnVjdCBhZ254X3ByaXYgKnByaXYpCit7CisJdm9pZCBfX2lvbWVtICpjdGwgPSBwcml2LT5jdGw7CisJQUdOWF9UUkFDRTsKKworCS8qIEZJWE1FIERpc2FibGUgdGhlIHJlY2VpdmVyICovCisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfRElTQ09WTU9ELCAweDApOworCS8qIFNldCBnYWluIGNvbnRyb2wgcmVzZXQgKi8KKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9SU1RHQ1RMLCAweDEpOworCS8qIFJlc2V0IGdhaW4gY29udHJvbCByZXNldCAqLworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1JTVEdDVEwsIDB4MCk7Cit9CisKKworLyogRml4bWUgdGhpcyBzaG91bGUgYmUgZGlzYWJsZSBSWCwgYWJvdmUgaXMgZW5hYmxlIFJYICovCit2b2lkIGVuYWJsZV9yZWNlaXZlcihzdHJ1Y3QgYWdueF9wcml2ICpwcml2KQoreworCXZvaWQgX19pb21lbSAqY3RsID0gcHJpdi0+Y3RsOworCUFHTlhfVFJBQ0U7CisKKwkvKiBTZXQgYWRhcHRpdmUgZ2FpbiBjb250cm9sIGRpc2NvdmVyeSBtb2RlICovCisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfRElTQ09WTU9ELCAweDMpOworCS8qIFNldCBnYWluIGNvbnRyb2wgcmVzZXQgKi8KKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9SU1RHQ1RMLCAweDEpOworCS8qIENsZWFyIGdhaW4gY29udHJvbCByZXNldCAqLworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1JTVEdDVEwsIDB4MCk7Cit9CisKK3N0YXRpYyB2b2lkIG1hY19hZGRyZXNzX3NldChzdHJ1Y3QgYWdueF9wcml2ICpwcml2KQoreworCXZvaWQgX19pb21lbSAqY3RsID0gcHJpdi0+Y3RsOworCXU4ICptYWNfYWRkciA9IHByaXYtPm1hY19hZGRyOworCXUzMiByZWc7CisKKwkvKiBGSVhNRSAqLworCXJlZyA9IChtYWNfYWRkclswXSA8PCAyNCkgfCAobWFjX2FkZHJbMV0gPDwgMTYpIHwgbWFjX2FkZHJbMl0gPDwgOCB8IG1hY19hZGRyWzNdOworCWlvd3JpdGUzMihyZWcsIGN0bCArIEFHTlhfUlhNX01BQ0hJKTsKKyAJcmVnID0gKG1hY19hZGRyWzRdIDw8IDgpIHwgbWFjX2FkZHJbNV07CisJaW93cml0ZTMyKHJlZywgY3RsICsgQUdOWF9SWE1fTUFDTE8pOworfQorCitzdGF0aWMgdm9pZCByZWNlaXZlcl9ic3NpZF9zZXQoc3RydWN0IGFnbnhfcHJpdiAqcHJpdiwgdTggKmJzc2lkKQoreworCXZvaWQgX19pb21lbSAqY3RsID0gcHJpdi0+Y3RsOworCXUzMiByZWc7CisKKwlkaXNhYmxlX3JlY2VpdmVyKHByaXYpOworCS8qIEZJWE1FICovCisJcmVnID0gYnNzaWRbMF0gPDwgMjQgfCAoYnNzaWRbMV0gPDwgMTYpIHwgKGJzc2lkWzJdIDw8IDgpIHwgYnNzaWRbM107CisJaW93cml0ZTMyKHJlZywgY3RsICsgQUdOWF9SWE1fQlNTSURISSk7CisgCXJlZyA9IChic3NpZFs0XSA8PCA4KSB8IGJzc2lkWzVdOworCWlvd3JpdGUzMihyZWcsIGN0bCArIEFHTlhfUlhNX0JTU0lETE8pOworCisJLyogRW5hYmxlIHRoZSByZWNlaXZlciAqLworCWVuYWJsZV9yZWNlaXZlcihwcml2KTsKKworCS8qIENsZWFyIHRoZSBUU0YgKi8KKy8qIAlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1RYTV9UU0ZMTywgMHgwKTsgKi8KKy8qIAlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1RYTV9UU0ZISSwgMHgwKTsgKi8KKwkvKiBDbGVhciB0aGUgVEJUVCAqLworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVFhNX1RCVFRMTywgMHgwKTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1RYTV9UQlRUSEksIDB4MCk7CisJZGlzYWJsZV9yZWNlaXZlcihwcml2KTsKK30gLyogcmVjZWl2ZXJfYnNzaWRfc2V0ICovCisKK3N0YXRpYyB2b2lkIGJhbmRfbWFuYWdlbWVudF9pbml0KHN0cnVjdCBhZ254X3ByaXYgKnByaXYpCit7CisJdm9pZCBfX2lvbWVtICpjdGwgPSBwcml2LT5jdGw7CisJdm9pZCBfX2lvbWVtICpkYXRhID0gcHJpdi0+ZGF0YTsKKwl1MzIgcmVnOworCWludCBpOworCUFHTlhfVFJBQ0U7CisKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0JNX1RYV0FERFIsIEFHTlhfUERVX1RYX1dRKTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0NJUl9BRERSV0lOLCAweDApOworCW1lbXNldF9pbyhkYXRhICsgQUdOWF9QRFVQT09MLCAweDAsIEFHTlhfUERVUE9PTF9TSVpFKTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0JNX0JNQ1RMLCAweDIwMCk7CisKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0JNX0NJUERVV0NOVCwgMHg0MCk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9CTV9TUFBEVVdDTlQsIDB4Mik7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9CTV9SRlBQRFVXQ05ULCAweDApOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQk1fUkhQUERVV0NOVCwgMHgyMik7CisKKwkvKiBGSVhNRSBJbml0aWFsaXplIHRoZSBGcmVlIFBvb2wgTGlua2VkIExpc3QgKi8KKwkvKiAgICAxLiBXcml0ZSB0aGUgQWRkcmVzcyBvZiB0aGUgTmV4dCBOb2RlICgoMHg0MTgwMCArIG5vZGUqc2l6ZSkvc2l6ZSkKKwkgICAgICB0byB0aGUgZmlyc3Qgd29yZCBvZiBlYWNoIG5vZGUuICAqLworCWZvciAoaSA9IDA7IGkgPCBQRFVfRlJFRV9DTlQ7IGkrKykgeworCQlpb3dyaXRlMzIoKEFHTlhfUERVX0ZSRUUgKyAoaSsxKSpQRFVfU0laRSkvUERVX1NJWkUsCisJCQkgIGRhdGEgKyBBR05YX1BEVV9GUkVFICsgKFBEVV9TSVpFICogaSkpOworCQkvKiBUaGUgbGFzdCBub2RlIHNob3VsZCBiZSBzZXQgdG8gMHgwICovCisJCWlmICgoaSArIDEpID09IFBEVV9GUkVFX0NOVCkKKwkJCW1lbXNldF9pbyhkYXRhICsgQUdOWF9QRFVfRlJFRSArIChQRFVfU0laRSAqIGkpLAorCQkJCSAgMHgwLCBQRFVfU0laRSk7CisJfQorCisJLyogSGVhZCBpcyBGaXJzdCBQb29sIGFkZHJlc3MgKDB4NDE4MDApIC8gc2l6ZSAoMHg4MCkgKi8KKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0JNX0ZQTEhQLCBBR05YX1BEVV9GUkVFL1BEVV9TSVpFKTsKKwkvKiBUYWlsIGlzIExhc3QgUG9vbCBBZGRyZXNzICgweDQ3ZjgwKSAvIHNpemUgKDB4ODApICovCisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9CTV9GUExUUCwgMHg0N2Y4MC9QRFVfU0laRSk7CisJLyogQ291bnQgaXMgTnVtYmVyIG9mIE5vZGVzIGluIHRoZSBQb29sICgweGQwKSAqLworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQk1fRlBDTlQsIFBEVV9GUkVFX0NOVCk7CisKKwkvKiBTdGFydCBhbGwgd29ya3F1ZXVlICovCisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9CTV9DSVdRQ1RMLCAweDgwMDAwKTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0JNX0NQVUxXQ1RMLCAweDgwMDAwKTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0JNX0NQVUhXQ1RMLCAweDgwMDAwKTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0JNX0NQVVRYV0NUTCwgMHg4MDAwMCk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9CTV9DUFVSWFdDVEwsIDB4ODAwMDApOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQk1fU1BSWFdDVEwsIDB4ODAwMDApOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQk1fU1BUWFdDVEwsIDB4ODAwMDApOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQk1fUkZQV0NUTCwgMHg4MDAwMCk7CisKKwkvKiBFbmFibGUgdGhlIEJhbmQgTWFuYWdlbWVudCAqLworCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9CTV9CTUNUTCk7CisJcmVnIHw9IDB4MTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0JNX0JNQ1RMLCByZWcpOworfSAvKiBiYW5kX21hbmFnbWVudF9pbml0ICovCisKKworc3RhdGljIHZvaWQgc3lzdGVtX2l0Zl9pbml0KHN0cnVjdCBhZ254X3ByaXYgKnByaXYpCit7CisJdm9pZCBfX2lvbWVtICpjdGwgPSBwcml2LT5jdGw7CisJdTMyIHJlZzsKKwlBR05YX1RSQUNFOworCisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9TWVNJVEZfR1BJT1VULCAweDApOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfUE1fVEVTVFBIWSwgMHgxMWUxNDNhKTsKKworCWlmIChwcml2LT5yZXZpZCA9PSAwKSB7CisJCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9TWVNJVEZfU1lTTU9ERSk7CisJCXJlZyB8PSAweDExOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1NZU0lURl9TWVNNT0RFLCByZWcpOworCX0KKwkvKiA/Pz8gV2hhdCBpcyB0aGF0IG1lYW5zPyBpdCBzaG91bGQgZGlmZmVyZW5jZSBmb3IgZGlmZmVyaWNlIHR5cGUKKwkgb2YgY2FyZHMgKi8KKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0NJUl9TRVJJQUxJVEYsIDB4ZmZmODEwMDYpOworCisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9TWVNJVEZfR1BJT0lOLCAweDFmMDAwMCk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9TWVNJVEZfR1BJT1VULCAweDUpOworCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9TWVNJVEZfR1BJT0lOKTsKK30KKworc3RhdGljIHZvaWQgZW5jcnlwdGlvbl9pbml0KHN0cnVjdCBhZ254X3ByaXYgKnByaXYpCit7CisJdm9pZCBfX2lvbWVtICpjdGwgPSBwcml2LT5jdGw7CisJQUdOWF9UUkFDRTsKKworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfRU5DUllfV0VQS0VZMCwgMHgwKTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0VOQ1JZX1dFUEtFWTEsIDB4MCk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9FTkNSWV9XRVBLRVkyLCAweDApOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfRU5DUllfV0VQS0VZMywgMHgwKTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0VOQ1JZX0NDTVJFQ1RMLCAweDgpOworfQorCitzdGF0aWMgdm9pZCB0eF9tYW5hZ2VtZW50X2luaXQoc3RydWN0IGFnbnhfcHJpdiAqcHJpdikKK3sKKwl2b2lkIF9faW9tZW0gKmN0bCA9IHByaXYtPmN0bDsKKwl2b2lkIF9faW9tZW0gKmRhdGEgPSBwcml2LT5kYXRhOworCXUzMiByZWc7CisJQUdOWF9UUkFDRTsKKworCS8qIEZpbGwgb3V0IHRoZSBDb21wdXRhdGlvbmFsRW5naW5lTG9va3VwVGFibGUKKwkgKiBzdGFydGluZyBhdCBtZW1vcnkgIzIgb2Zmc2V0IDB4ODAwCisJICovCisJdHhfZW5naW5lX2xvb2t1cF90YmxfaW5pdChwcml2KTsKKwltZW1zZXRfaW8oZGF0YSArIDB4MTAwMCwgMCwgMHhmZTApOworCS8qIEVuYWJsZSBUcmFuc21pc3Npb24gTWFuYWdlbWVudCBGdW5jdGlvbnMgKi8KKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1RYTV9FVE1GLCAweDNmZik7CisJLyogV3JpdGUgMHgzZiB0byBUcmFuc21pc3Npb24gVGVtcGxhdGUgKi8KKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1RYTV9UWFRFTVAsIDB4M2YpOworCisJaWYgKHByaXYtPnJldmlkID49IDIpCisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVFhNX1NJRlNQSUZTLCAweDFlMTQwYTBiKTsKKwllbHNlCisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVFhNX1NJRlNQSUZTLCAweDFlMTkwYTBiKTsKKworCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9UWE1fVElGU0VJRlMpOworCXJlZyAmPSAweGZmMDA7CisJcmVnIHw9IDB4YjsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1RYTV9USUZTRUlGUywgcmVnKTsKKwlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfVFhNX1RJRlNFSUZTKTsKKwlyZWcgJj0gMHhmZmZmMDBmZjsKKwlyZWcgfD0gMHhhMDA7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9UWE1fVElGU0VJRlMsIHJlZyk7CisJLyogRW5hYmxlIFRJRlMgKi8KKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1RYTV9DVEwsIDB4NDAwMDApOworCisJcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX1RYTV9USUZTRUlGUyk7CisJcmVnICY9IDB4ZmYwMGZmZmY7CisJcmVnIHw9IDB4NTEwMDAwOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVFhNX1RJRlNFSUZTLCByZWcpOworCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9UWE1fUFJPQkRFTEFZKTsKKwlyZWcgJj0gMHhmZjAwZmZmZjsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1RYTV9QUk9CREVMQVksIHJlZyk7CisJcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX1RYTV9USUZTRUlGUyk7CisJcmVnICY9IDB4MDBmZmZmZmY7CisJcmVnIHw9IDB4MWMwMDAwMDA7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9UWE1fVElGU0VJRlMsIHJlZyk7CisJcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX1RYTV9QUk9CREVMQVkpOworCXJlZyAmPSAweDAwZmZmZmZmOworCXJlZyB8PSAweDAxMDAwMDAwOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVFhNX1BST0JERUxBWSwgcmVnKTsKKworCS8qICMgU2V0IERJRiAwLTEsMi0zLDQtNSw2LTcgdG8gZGVmYXVsdHMgKi8KKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1RYTV9ESUYwMSwgMHgzMjFkMzIxZCk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9UWE1fRElGMjMsIDB4MzIxZDMyMWQpOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVFhNX0RJRjQ1LCAweDMyMWQzMjFkKTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1RYTV9ESUY2NywgMHgzMjFkMzIxZCk7CisKKwkvKiBNYXggQWNrIHRpbWVvdXQgbGltaXQgKi8KKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1RYTV9NQVhBQ0tUSU0sIDB4MWUxOSk7CisJLyogTWF4IFJYIERhdGEgVGltZW91dCBjb3VudCwgKi8KKwlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfVFhNX01BWFJYVElNRSk7CisJcmVnICY9IDB4ZmZmZjAwMDA7CisJcmVnIHw9IDB4ZmY7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9UWE1fTUFYUlhUSU1FLCByZWcpOworCisJLyogQ0YgcG9sbCBSWCBUaW1lb3V0IGNvdW50ICovCisJcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX1RYTV9DRlBPTExSWFRJTSk7CisJcmVnICY9IDB4ZmZmZjsKKwlyZWcgfD0gMHhmZjAwMDA7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9UWE1fQ0ZQT0xMUlhUSU0sIHJlZyk7CisKKwkvKiBNYXggVGltZW91dCBFeGNlZWRlZCBjb3VudCwgKi8KKwlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfVFhNX01BWFRJTU9VVCk7CisJcmVnICY9IDB4ZmYwMGZmZmY7CisJcmVnIHw9IDB4MTkwMDAwOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVFhNX01BWFRJTU9VVCwgcmVnKTsKKworCS8qIENGIGFjayB0aW1lb3V0IGxpbWl0IGZvciAxMWIgKi8KKwlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfVFhNX0NGQUNLVDExQik7CisJcmVnICY9IDB4ZmYwMDsKKwlyZWcgfD0gMHgxZTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1RYTV9DRkFDS1QxMUIsIHJlZyk7CisKKwkvKiBNYXggQ0YgUG9sbCBUaW1lb3V0IENvdW50ICovCisJcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX1RYTV9DRlBPTExSWFRJTSk7CisJcmVnICY9IDB4ZmZmZjAwMDA7CisJcmVnIHw9IDB4MTk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9UWE1fQ0ZQT0xMUlhUSU0sIHJlZyk7CisJLyogQ0YgUG9sbCBSWCBUaW1lb3V0IENvdW50ICovCisJcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX1RYTV9DRlBPTExSWFRJTSk7CisJcmVnICY9IDB4ZmZmZjAwMDA7CisJcmVnIHw9IDB4MWU7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9UWE1fQ0ZQT0xMUlhUSU0sIHJlZyk7CisKKwkvKiAjIHdyaXRlIGRlZmF1bHQgdG8gKi8KKwkvKiAgICAxLiBTY2hlZHVsZSBFbXB0eSBDb3VudCAqLworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVFhNX1NDSEVNUENOVCwgMHg1KTsKKwkvKiAgICAyLiBDRlAgUGVyaW9kIENvdW50ICovCisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9UWE1fQ0ZQRVJDTlQsIDB4MSk7CisJLyogICAgMy4gQ0ZQIE1EViAgKi8KKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1RYTV9DRlBNRFYsIDB4MTAwMDApOworCisJLyogUHJvYmUgRGVsYXkgKi8KKwlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfVFhNX1BST0JERUxBWSk7CisJcmVnICY9IDB4ZmZmZjAwMDA7CisJcmVnIHw9IDB4NDAwOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVFhNX1BST0JERUxBWSwgcmVnKTsKKworCS8qIE1heCBDQ0EgY291bnQgU2xvdCAqLworCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9UWE1fTUFYQ0NBQ05UU0xPVCk7CisJcmVnICY9IDB4ZmZmZjAwZmY7CisJcmVnIHw9IDB4OTAwOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVFhNX01BWENDQUNOVFNMT1QsIHJlZyk7CisKKwkvKiBTbG90IGxpbWl0LzEgbXNlYyBMaW1pdCAqLworCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9UWE1fU0xPVExJTUlUKTsKKwlyZWcgJj0gMHhmZjAwZmZmZjsKKwlyZWcgfD0gMHgxNDAwNzc7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9UWE1fU0xPVExJTUlULCByZWcpOworCisJLyogIyBTZXQgQ1cgIygwLTcpIHRvIGRlZmF1bHQgKi8KKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1RYTV9DVzAsIDB4ZmYwMDA3KTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1RYTV9DVzEsIDB4ZmYwMDA3KTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1RYTV9DVzIsIDB4ZmYwMDA3KTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1RYTV9DVzMsIDB4ZmYwMDA3KTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1RYTV9DVzQsIDB4ZmYwMDA3KTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1RYTV9DVzUsIDB4ZmYwMDA3KTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1RYTV9DVzYsIDB4ZmYwMDA3KTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1RYTV9DVzcsIDB4ZmYwMDA3KTsKKworCS8qICMgU2V0IFNob3J0L0xvbmcgbGltaXQgIygwLTcpIHRvIGRlZmF1bHQgKi8KKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1RYTV9TTEJFQUxJTTAsICAweGEwMDBhKTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1RYTV9TTEJFQUxJTTEsICAweGEwMDBhKTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1RYTV9TTEJFQUxJTTIsICAweGEwMDBhKTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1RYTV9TTEJFQUxJTTMsICAweGEwMDBhKTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1RYTV9TTEJFQUxJTTQsICAweGEwMDBhKTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1RYTV9TTEJFQUxJTTUsICAweGEwMDBhKTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1RYTV9TTEJFQUxJTTYsICAweGEwMDBhKTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1RYTV9TTEJFQUxJTTcsICAweGEwMDBhKTsKKworCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9UWE1fQ1RMKTsKKwlyZWcgfD0gMHgxNDAwOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVFhNX0NUTCwgcmVnKTsKKwkvKiBXYWl0IGZvciBiaXQgMCBpbiBDb250cm9sIFJlZyB0byBjbGVhciAgKi8KKwl1ZGVsYXkoODApOworCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9UWE1fQ1RMKTsKKwkvKiBPciAweDE4MDAwIHRvIENvbnRyb2wgcmVnICovCisJcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX1RYTV9DVEwpOworCXJlZyB8PSAweDE4MDAwOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVFhNX0NUTCwgcmVnKTsKKwkvKiBXYWl0IGZvciBiaXQgMCBpbiBDb250cm9sIFJlZyB0byBjbGVhciAqLworCXVkZWxheSg4MCk7CisJcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX1RYTV9DVEwpOworCisJLyogU2V0IExpc3RlbiBJbnRlcnZhbCBDb3VudCB0byBkZWZhdWx0ICovCisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9UWE1fTElTSU5URVJDTlQsIDB4MSk7CisJLyogU2V0IERUSU0gcGVyaW9kIGNvdW50IHRvIGRlZmF1bHQgKi8KKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1RYTV9EVElNUEVSSUNOVCwgMHgyMDAwKTsKK30gLyogdHhfbWFuYWdlbWVudF9pbml0ICovCisKK3N0YXRpYyB2b2lkIHJ4X21hbmFnZW1lbnRfaW5pdChzdHJ1Y3QgYWdueF9wcml2ICpwcml2KQoreworCXZvaWQgX19pb21lbSAqY3RsID0gcHJpdi0+Y3RsOworCUFHTlhfVFJBQ0U7CisKKwkvKiBJbml0aWFsaXplIHRoZSBSb3V0aW5nIFRhYmxlICovCisJcm91dGluZ190YWJsZV9pbml0KHByaXYpOworCisJaWYgKHByaXYtPnJldmlkID49IDMpIHsKKwkJYWdueF93cml0ZTMyKGN0bCwgMHgyMDc0LCAweDFmMTcxNzEwKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgMHgyMDc4LCAweDEwMTAwZDBkKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgMHgyMDdjLCAweDExMTExMDEwKTsKKwl9CisJZWxzZQorCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1JYTV9ERUxBWTExLCAweDApOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfUlhNX1JFUVJBVEUsIDB4ODE5NWUwMCk7Cit9CisKKworc3RhdGljIHZvaWQgYWdueF90aW1lcl9pbml0KHN0cnVjdCBhZ254X3ByaXYgKnByaXYpCit7CisJdm9pZCBfX2lvbWVtICpjdGwgPSBwcml2LT5jdGw7CisJQUdOWF9UUkFDRTsKKworLyogCS9cKiBXcml0ZSAweDI0OWYwMCAodGljayBkdXJhdGlvbj8pIHRvIFRpbWVyIDEgKlwvICovCisvKiAJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9USU1DVExfVElNRVIxLCAweDI0OWYwMCk7ICovCisvKiAJL1wqIFdyaXRlIDB4ZTIgdG8gVGltZXIgMSBDb250cm9sICpcLyAqLworLyogCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVElNQ1RMX1RJTTFDVEwsIDB4ZTIpOyAqLworCisJLyogV3JpdGUgMHgyNDlmMDAgKHRpY2sgZHVyYXRpb24/KSB0byBUaW1lciAxICovCisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9USU1DVExfVElNRVIxLCAweDApOworCS8qIFdyaXRlIDB4ZTIgdG8gVGltZXIgMSBDb250cm9sICovCisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9USU1DVExfVElNMUNUTCwgMHgwKTsKKworCWlvd3JpdGUzMigweEZGRkZGRkZGLCBwcml2LT5jdGwgKyBBR05YX1RYTV9CRUFDT05fQ1RMKTsKK30KKworc3RhdGljIHZvaWQgcG93ZXJfbWFuYWdlX2luaXQoc3RydWN0IGFnbnhfcHJpdiAqcHJpdikKK3sKKwl2b2lkIF9faW9tZW0gKmN0bCA9IHByaXYtPmN0bDsKKwl1MzIgcmVnOworCUFHTlhfVFJBQ0U7CisKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1BNX01BQ01TVywgMHgxZik7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9QTV9SRkNUTCwgMHgxZik7CisKKwlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfUE1fUE1DVEwpOworCXJlZyAmPSAweGYwMGY7CisJcmVnIHw9IDB4YTA7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9QTV9QTUNUTCwgcmVnKTsKKworCWlmIChwcml2LT5yZXZpZCA+PSAzKSB7CisJCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9QTV9TT0ZUUlNUKTsKKwkJcmVnIHw9IDB4MTg7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfUE1fU09GVFJTVCwgcmVnKTsKKwl9Cit9IC8qIHBvd2VyX21hbmFnZV9pbml0ICovCisKKworc3RhdGljIHZvaWQgZ2Fpbl9jdGxjbnRfaW5pdChzdHJ1Y3QgYWdueF9wcml2ICpwcml2KQoreworCXZvaWQgX19pb21lbSAqY3RsID0gcHJpdi0+Y3RsOworCXUzMiByZWc7CisJQUdOWF9UUkFDRTsKKworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1RSQUNOVDUsIDB4MTE5KTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9UUkFDTlQ2LCAweDExOCk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfVFJBQ05UNywgMHgxMTcpOworCisJcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX1BNX1BNQ1RMKTsKKwlyZWcgfD0gMHg4OworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfUE1fUE1DVEwsIHJlZyk7CisKKwlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfUE1fUE1DVEwpOworCXJlZyAmPSB+MHg4OworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfUE1fUE1DVEwsIHJlZyk7CisKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0NJUl9BRERSV0lOLCAweDApOworCisJLyogRklYTUUgV3JpdGUgdGhlIGluaXRpYWwgU3RhdGlvbiBEZXNjcmlwdG9yIGZvciB0aGUgY2FyZCAqLworCXN0YV9pbml0KHByaXYsIExPQ0FMX1NUQUlEKTsKKwlzdGFfaW5pdChwcml2LCBCU1NJRF9TVEFJRCk7CisKKwkvKiBFbmFibGUgc3RhaW9uIDAgYW5kIDEgY2FuIGRvIFRYICovCisJLyogSXQgc2VlbWVkIGlmIHdlIHNldCBvdGhlciBiaXQgdG8gMSB0aGUgYml0IDAgd2lsbAorCSAgIGJlIGF1dG8gY2hhbmdlIHRvIDAgKi8KKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0JNX1RYVE9QRUVSLCAweDIgfCAweDEpOworLy8JYWdueF93cml0ZTMyKGN0bCwgQUdOWF9CTV9UWFRPUEVFUiwgMHgxKTsKK30gLyogZ2Fpbl9jdGxjbnRfaW5pdCAqLworCisKK3N0YXRpYyB2b2lkIHBoeV9pbml0KHN0cnVjdCBhZ254X3ByaXYgKnByaXYpCit7CisJdm9pZCBfX2lvbWVtICpjdGwgPSBwcml2LT5jdGw7CisJdm9pZCBfX2lvbWVtICpkYXRhID0gcHJpdi0+ZGF0YTsKKwl1MzIgcmVnOworCUFHTlhfVFJBQ0U7CisKKwkvKiBMb2FkIEluaXRpYWxHYWluVGFibGUgKi8KKwlnYWluX3RhYmxlX2luaXQocHJpdik7CisKKyAgCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQ0lSX0FERFJXSU4sIDB4MjAwMDAwMCk7CisKKwkvKiBDbGVhciB0aGUgZm9sbG93aW5nIG9mZnNldHMgaW4gTWVtb3J5IFJhbmdlICMyOiAqLworCW1lbXNldF9pbyhkYXRhICsgMHg1MDQwLCAwLCAweGEgKiA0KTsKKwltZW1zZXRfaW8oZGF0YSArIDB4NTA4MCwgMCwgMHhhICogNCk7CisJbWVtc2V0X2lvKGRhdGEgKyAweDUwYzAsIDAsIDB4YSAqIDQpOworCW1lbXNldF9pbyhkYXRhICsgMHg1NDAwLCAwLCAweDgwICogNCk7CisJbWVtc2V0X2lvKGRhdGEgKyAweDYwMDAsIDAsIDB4MjgwICogNCk7CisJbWVtc2V0X2lvKGRhdGEgKyAweDcwMDAsIDAsIDB4MjgwICogNCk7CisJbWVtc2V0X2lvKGRhdGEgKyAweDgwMDAsIDAsIDB4MjgwICogNCk7CisKKwkvKiBJbml0aWFsaXplIHRoZSBGb2xsb3dpbmcgUmVnaXN0ZXJzIEFjY29yZGluZyB0byBQQ0kgUmV2aXNpb24gSUQgKi8KKwlpZiAocHJpdi0+cmV2aWQgPT0gMCkgeworCQkvKiBmaXhtZSB0aGUgcGFydCBoYXNuJ3QgYmVlbiB1cGRhdGUgYnV0IGJlbG93IGhhcyBiZWVuIHVwZGF0ZQorCQkgICBiYXNlZCBvbiBXR001MTEgKi8KKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9BQ0lfTEVOLCAweGYpOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0FDSV9USU1FUjEsIDB4MWQpOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0FDSV9USU1FUjIsIDB4Myk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQUNJX0FJQ0NIQTBPVkUsIDB4MTEpOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0FDSV9BSUNDSEExT1ZFLCAweDApOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9USEQwQSwgMHg2NCk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1RIRDBBTCwgMHg0Yik7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1RIRDBCLCAweDRiKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfRFVOU0FULCAweDE0KTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfRFNBVCwgMHgyNCk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX0RGSVJDQUwsIDB4OCk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX0RHQ1RMMTFBLCAweDFhKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfREdDVEwxMUIsIDB4Myk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX0dBSU5JTklULCAweGQpOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9USE5PU0lHLCAweDEpOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9DT0FSU1RFUCwgMHg3KTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfU0lGU1QxMUEsIDB4MjgpOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9TSUZTVDExQiwgMHgyOCk7CisJCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9HQ1JfQ1dERVRFQyk7CisJCXJlZyB8PSAweDE7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX0NXREVURUMsIHJlZyk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSXzBYMzgsIDB4MWUpOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9CT0FDVCwgMHgyNik7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX0RJU0NPVk1PRCwgMHgzKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfTkxJU1RBTlQsIDB4Myk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX05BQ1RJQU5ULCAweDMpOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9OTUVBU0FOVCwgMHgzKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfTkNBUFRBTlQsIDB4Myk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1RIQ0FQMTFBLCAweDApOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9USENBUDExQiwgMHgwKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfVEhDQVBSWDExQSwgMHgwKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfVEhDQVBSWDExQiwgMHgwKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfVEhMRVZEUk8sIDB4MTApOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9NQVhSWFRJTUUxMUEsIDB4MSk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX01BWFJYVElNRTExQiwgMHgxKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfQ09SUlRJTUUsIDB4MTkwKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfU0lHSFRILCAweDc4KTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfU0lHTFRILCAweDFjKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfQ09SUkRST1AsIDB4MCk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1RIQ0QsIDB4MCk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX01BWFBPV0RJRkYsIDB4MSk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1RFU1RCVVMsIDB4MCk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX0FOVENGRywgMHgxZik7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1RISlVNUCwgMHgxNCk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1RIUE9XRVIsIDB4MCk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1RIUE9XQ0xJUCwgMHgzMCk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1RIRDBCVEZFU1QsIDB4MzIpOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9USFJYMTFCUE9XTUlOLCAweDE5KTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfMFgxNGMsIDB4MCk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSXzBYMTUwLCAweDApOworCQlhZ254X3dyaXRlMzIoY3RsLCAweDk0MDAsIDB4MCk7CisJCWFnbnhfd3JpdGUzMihjdGwsIDB4OTQwYywgMHg2ZmYpOworCQlhZ254X3dyaXRlMzIoY3RsLCAweDk0MjgsIDB4YTApOworCQlhZ254X3dyaXRlMzIoY3RsLCAweDk0MzQsIDB4MCk7CisJCWFnbnhfd3JpdGUzMihjdGwsIDB4OWMwNCwgMHgxNSk7CisJCWFnbnhfd3JpdGUzMihjdGwsIDB4OWMwYywgMHg3Zik7CisJCWFnbnhfd3JpdGUzMihjdGwsIDB4OWMzNCwgMHgwKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgMHhjMDAwLCAweDM4ZCk7CisJCWFnbnhfd3JpdGUzMihjdGwsIDB4MTQwMTgsIDB4MCk7CisJCWFnbnhfd3JpdGUzMihjdGwsIDB4MTYwMDAsIDB4MSk7CisJCWFnbnhfd3JpdGUzMihjdGwsIDB4MTEwMDQsIDB4MCk7CisJCWFnbnhfd3JpdGUzMihjdGwsIDB4ZWM1NCwgMHhhKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgMHhlYzFjLCAweDUpOworCX0gZWxzZSBpZiAocHJpdi0+cmV2aWQgPiAwKSB7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQUNJX0xFTiwgMHhmKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9BQ0lfVElNRVIxLCAweDIxKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9BQ0lfVElNRVIyLCAweDI3KTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9BQ0lfQUlDQ0hBME9WRSwgMHgxMSk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQUNJX0FJQ0NIQTFPVkUsIDB4MCk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX0RVTlNBVCwgMHgxNCk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX0RTQVQsIDB4MjQpOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9ERklSQ0FMLCAweDgpOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9ER0NUTDExQSwgMHgxYSk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX0RHQ1RMMTFCLCAweDMpOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9HQUlOSU5JVCwgMHhkKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfVEhOT1NJRywgMHgxKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfQ09BUlNURVAsIDB4Nyk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1NJRlNUMTFBLCAweDI4KTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfU0lGU1QxMUIsIDB4MjgpOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9DV0RFVEVDLCAweDApOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl8wWDM4LCAweDFlKTsKKy8vCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9CT0FDVCwgMHgyNik7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX0RJU0NPVk1PRCwgMHgzKTsKKworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9USENBUDExQSwgMHgzMik7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1RIQ0FQMTFCLCAweDMyKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfVEhDQVBSWDExQSwgMHgzMik7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1RIQ0FQUlgxMUIsIDB4MzIpOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9USExFVkRSTywgMHgxMCk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX01BWFJYVElNRTExQSwgMHgxYWQpOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9NQVhSWFRJTUUxMUIsIDB4YTEwKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfQ09SUlRJTUUsIDB4MTkwKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfQ09SUkRST1AsIDB4MCk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1RIQ0QsIDB4MCk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1RIQ1MsIDB4MCk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX01BWFBPV0RJRkYsIDB4NCk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1RFU1RCVVMsIDB4MCk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1RISlVNUCwgMHgxZSk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1RIUE9XRVIsIDB4MCk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1RIUE9XQ0xJUCwgMHgyYSk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1RIRDBCVEZFU1QsIDB4M2MpOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9USFJYMTFCUE9XTUlOLCAweDE5KTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfMFgxNGMsIDB4MCk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSXzBYMTUwLCAweDApOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9SWE9WRVJJREUsIDB4MCk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1dBVENIRE9HLCAweDM3KTsKKwkJYWdueF93cml0ZTMyKGN0bCwgMHg5NDAwLCAweDApOworCQlhZ254X3dyaXRlMzIoY3RsLCAweDk0MGMsIDB4NmZmKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgMHg5NDI4LCAweGEwKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgMHg5NDM0LCAweDApOworCQlhZ254X3dyaXRlMzIoY3RsLCAweDljMDQsIDB4MTUpOworCQlhZ254X3dyaXRlMzIoY3RsLCAweDljMGMsIDB4N2YpOworCQlhZ254X3dyaXRlMzIoY3RsLCAweDljMzQsIDB4MCk7CisJCWFnbnhfd3JpdGUzMihjdGwsIDB4YzAwMCwgMHgzOGQpOworCQlhZ254X3dyaXRlMzIoY3RsLCAweDE0MDE0LCAweDEwMDApOworCQlhZ254X3dyaXRlMzIoY3RsLCAweDE0MDE4LCAweDApOworCQlhZ254X3dyaXRlMzIoY3RsLCAweDE2MDAwLCAweDEpOworCQlhZ254X3dyaXRlMzIoY3RsLCAweDExMDA0LCAweDApOworCQlhZ254X3dyaXRlMzIoY3RsLCAweGVjNTQsIDB4YSk7CisJCWFnbnhfd3JpdGUzMihjdGwsIDB4ZWMxYywgMHg1MCk7CisJfSBlbHNlIGlmIChwcml2LT5yZXZpZCA+IDEpIHsKKwkJcmVnID0gYWdueF9yZWFkMzIoY3RsLCAweGVjMTgpOworCQlyZWcgfD0gMHg4OworCQlhZ254X3dyaXRlMzIoY3RsLCAweGVjMTgsIHJlZyk7CisJfQorCisJLyogV3JpdGUgdGhlIFRYIEZpciBDb2VmZmljaWVudCBUYWJsZSAqLworCXR4X2Zpcl90YWJsZV9pbml0KHByaXYpOworCisJcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX1BNX1BNQ1RMKTsKKwlyZWcgJj0gfjB4ODsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1BNX1BNQ1RMLCByZWcpOworCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9QTV9QTExDVEwpOworCXJlZyB8PSAweDE7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9QTV9QTExDVEwsIHJlZyk7CisKKy8qIAlyZWcgPSBhZ254X3JlYWQzMihjdGwsIDB4MWEwMzApOyAqLworLyogCXJlZyAmPSB+MHg0OyAqLworLyogCWFnbnhfd3JpdGUzMihjdGwsIDB4MWEwMzAsIHJlZyk7ICovCisKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9UUkFDTlQ0LCAweDExMyk7Cit9IC8qIHBoeV9pbml0ICovCisKK3N0YXRpYyB2b2lkIGNoaXBfaW5pdChzdHJ1Y3QgYWdueF9wcml2ICpwcml2KQoreworCXZvaWQgX19pb21lbSAqY3RsID0gcHJpdi0+Y3RsOworCXUzMiByZWc7CisJQUdOWF9UUkFDRTsKKworCWJhbmRfbWFuYWdlbWVudF9pbml0KHByaXYpOworCisJcmZfY2hpcHNfaW5pdChwcml2KTsKKworCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9QTV9QTUNUTCk7CisJcmVnIHw9IDB4ODsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1BNX1BNQ1RMLCByZWcpOworCisJLyogSW5pdGlhbGl6ZSB0aGUgUEhZICovCisJcGh5X2luaXQocHJpdik7CisKKwllbmNyeXB0aW9uX2luaXQocHJpdik7CisKKwl0eF9tYW5hZ2VtZW50X2luaXQocHJpdik7CisKKwlyeF9tYW5hZ2VtZW50X2luaXQocHJpdik7CisKKwlwb3dlcl9tYW5hZ2VfaW5pdChwcml2KTsKKworCS8qIEluaXRpYWxpemUgdGhlIFRpbWVycyAqLworCWFnbnhfdGltZXJfaW5pdChwcml2KTsKKworCS8qIFdyaXRlIDB4YzM5MGJmOSB0byBJbnRlcnJ1cHQgTWFzayAoRGlzYWJsZSBUWCkgKi8KKwlyZWcgPSAweGMzOTBiZjkgJiB+SVJRX1RYX0JFQUNPTjsKKwlyZWcgJj0gfklSUV9UWF9ESVNBQkxFOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfSU5UX01BU0ssIHJlZyk7CisKKwlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfQ0lSX0JMS0NUTCk7CisJcmVnIHw9IDB4ODAwOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQ0lSX0JMS0NUTCwgcmVnKTsKKworCS8qIHNldCBpdCB3aGVuIG5lZWQgZ2V0IG11bHRpY2FzdCBlbmFibGU/ICovCisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9CTV9NVFNNLCAweGZmKTsKK30gLyogY2hpcF9pbml0ICovCisKKworc3RhdGljIGlubGluZSB2b2lkIHNldF9wcm9taXNfYW5kX21hbmFnZWQoc3RydWN0IGFnbnhfcHJpdiAqcHJpdikKK3sKKwl2b2lkIF9faW9tZW0gKmN0bCA9IHByaXYtPmN0bDsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1NZU0lURl9TWVNNT0RFLCAweDEwIHwgMHgyKTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1NZU0lURl9TWVNNT0RFLCAweDEwIHwgMHgyKTsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfbGVhcm5fbW9kZShzdHJ1Y3QgYWdueF9wcml2ICpwcml2KQoreworCXZvaWQgX19pb21lbSAqY3RsID0gcHJpdi0+Y3RsOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfU1lTSVRGX1NZU01PREUsIDB4OCk7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X3NjYW5fbW9kZShzdHJ1Y3QgYWdueF9wcml2ICpwcml2KQoreworCXZvaWQgX19pb21lbSAqY3RsID0gcHJpdi0+Y3RsOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfU1lTSVRGX1NZU01PREUsIDB4MjApOworfQorc3RhdGljIGlubGluZSB2b2lkIHNldF9wcm9taXNjdW91c19tb2RlKHN0cnVjdCBhZ254X3ByaXYgKnByaXYpCit7CisJdm9pZCBfX2lvbWVtICpjdGwgPSBwcml2LT5jdGw7CisJLyogYWdueF93cml0ZTMyKGN0bCwgQUdOWF9TWVNJVEZfU1lTTU9ERSwgMHgyMTApOyovCisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9TWVNJVEZfU1lTTU9ERSwgMHgxMCk7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X21hbmFnZWRfbW9kZShzdHJ1Y3QgYWdueF9wcml2ICpwcml2KQoreworCXZvaWQgX19pb21lbSAqY3RsID0gcHJpdi0+Y3RsOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfU1lTSVRGX1NZU01PREUsIDB4Mik7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X2FkaG9jX21vZGUoc3RydWN0IGFnbnhfcHJpdiAqcHJpdikKK3sKKwl2b2lkIF9faW9tZW0gKmN0bCA9IHByaXYtPmN0bDsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1NZU0lURl9TWVNNT0RFLCAweDApOworfQorCisjaWYgMAorc3RhdGljIHZvaWQgdW5rbm93X3JlZ2lzdGVyX3dyaXRlKHN0cnVjdCBhZ254X3ByaXYgKnByaXYpCit7CisJdm9pZCBfX2lvbWVtICpjdGwgPSBwcml2LT5jdGw7CisKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1VOS05PV05fQkFTRSArIDB4MCwgMHgzZSk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9VTktOT1dOX0JBU0UgKyAweDQsIDB4YjIpOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVU5LTk9XTl9CQVNFICsgMHg4LCAweDE0MCk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9VTktOT1dOX0JBU0UgKyAweGMsIDB4MUMwKTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1VOS05PV05fQkFTRSArIDB4MTAsIDB4MUZGKTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1VOS05PV05fQkFTRSArIDB4MTQsIDB4MUREKTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1VOS05PV05fQkFTRSArIDB4MTgsIDB4MTVGKTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1VOS05PV05fQkFTRSArIDB4MWMsIDB4QTEpOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVU5LTk9XTl9CQVNFICsgMHgyMCwgMHgzRTcpOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVU5LTk9XTl9CQVNFICsgMHgyNCwgMHgzNkIpOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVU5LTk9XTl9CQVNFICsgMHgyOCwgMHgzNDgpOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVU5LTk9XTl9CQVNFICsgMHgyYywgMHgzN0QpOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVU5LTk9XTl9CQVNFICsgMHgzMCwgMHgzREUpOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVU5LTk9XTl9CQVNFICsgMHgzNCwgMHgzNik7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9VTktOT1dOX0JBU0UgKyAweDM4LCAweDY0KTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1VOS05PV05fQkFTRSArIDB4M2MsIDB4NTcpOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVU5LTk9XTl9CQVNFICsgMHg0MCwgMHgyMyk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9VTktOT1dOX0JBU0UgKyAweDQ0LCAweDNFRCk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9VTktOT1dOX0JBU0UgKyAweDQ4LCAweDNDOSk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9VTktOT1dOX0JBU0UgKyAweDRjLCAweDNDQSk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9VTktOT1dOX0JBU0UgKyAweDUwLCAweDNFNyk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9VTktOT1dOX0JBU0UgKyAweDU0LCAweDgpOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVU5LTk9XTl9CQVNFICsgMHg1OCwgMHgxRik7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9VTktOT1dOX0JBU0UgKyAweDVjLCAweDFhKTsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBjYXJkX2ludGVyZmFjZV9pbml0KHN0cnVjdCBhZ254X3ByaXYgKnByaXYpCit7CisJdm9pZCBfX2lvbWVtICpjdGwgPSBwcml2LT5jdGw7CisJdTggYnNzaWRbRVRIX0FMRU5dID0gezB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmZ9OworCXUzMiByZWc7CisJdW5zaWduZWQgaW50IGk7CisJQUdOWF9UUkFDRTsKKworCW1pZ2h0X3NsZWVwKCk7CisJLyogQ2xlYXIgUlggQ29udHJvbCBhbmQgRW5hYmxlIFJYIHF1ZXVlcyAqLworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQ0lSX1JYQ1RMLCAweDgpOworCisJbWlnaHRfc2xlZXAoKTsKKwkvKiBEbyBhIGZ1bGwgcmVzZXQgb2YgdGhlIGNhcmQgKi8KKwljYXJkX2Z1bGxfcmVzZXQocHJpdik7CisJbWlnaHRfc2xlZXAoKTsKKworCS8qIENoZWNrIGFuZCBzZXQgQ2FyZCBFbmRpYW5uZXNzICovCisJcmVnID0gaW9yZWFkMzIocHJpdi0+Y3RsICsgQUdOWF9DSVJfRU5ESUFOKTsKKwkvKiBUT0RPIElmIG5vdCAweEIzQjJCMUIwIHNldCB0byAweEIzQjJCMUIwICovCisJcHJpbnRrKEtFUk5fSU5GTyBQRlggIkNJUl9FTkRJQU4gaXMgJXhcbiIsIHJlZyk7CisKKworCS8qIENvbmZpZyB0aGUgZWVwcm9tICovCisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9DSVJfU0VSSUFMSVRGLCAweDcwMDAwODYpOworCXVkZWxheSgxMCk7CisJcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX0NJUl9TRVJJQUxJVEYpOworCisKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1BNX1NPRlRSU1QsIDB4ODAwMDAwMzMpOworCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgMHhlYzUwKTsKKwlyZWcgfD0gMHhmOworCWFnbnhfd3JpdGUzMihjdGwsIDB4ZWM1MCwgcmVnKTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1BNX1NPRlRSU1QsIDB4MCk7CisKKworCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9TWVNJVEZfR1BJT0lOKTsKKwl1ZGVsYXkoMTApOworCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9DSVJfU0VSSUFMSVRGKTsKKworCS8qIER1bXAgdGhlIGVlcHJvbSAqLworCWRvIHsKKwkJY2hhciBlZXByb21bMHgxMDAwMDAvMHgxMDBdOworCisJCWZvciAoaSA9IDA7IGkgPCAweDEwMDAwMDsgaSArPSAweDEwMCkgeworCQkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9DSVJfU0VSSUFMSVRGLCAweDMwMDAwMDAgKyBpKTsKKwkJCXVkZWxheSgxMyk7CisJCQlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfQ0lSX1NFUklBTElURik7CisJCQl1ZGVsYXkoNzApOworCQkJcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX0NJUl9TRVJJQUxJVEYpOworCQkJZWVwcm9tW2kvMHgxMDBdID0gcmVnICYgMHhGRjsKKwkJCXVkZWxheSgxMCk7CisJCX0KKwkJcHJpbnRfaGV4X2R1bXBfYnl0ZXMoUEZYICJFRVBST006ICIsIERVTVBfUFJFRklYX05PTkUsIGVlcHJvbSwKKwkJCQkgICAgIEFSUkFZX1NJWkUoZWVwcm9tKSk7CisJfSB3aGlsZSgwKTsKKworCXNwaV9yY193cml0ZShjdGwsIFJGX0NISVAwLCAweDI2KTsKKyAgICAgICAgcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX1NQSV9STFNXKTsKKworCS8qIEluaXRpYWxpemUgdGhlIHN5c3RlbSBpbnRlcmZhY2UgKi8KKwlzeXN0ZW1faXRmX2luaXQocHJpdik7CisKKwltaWdodF9zbGVlcCgpOworCS8qIENoaXAgSW5pdGlhbGl6YXRpb24gKFBvbGFyaXMpICovCisJY2hpcF9pbml0KHByaXYpOworCW1pZ2h0X3NsZWVwKCk7CisKKwkvKiBDYWxpYnJhdGUgdGhlIGFudGVubmFlICovCisJYW50ZW5uYV9jYWxpYnJhdGUocHJpdik7CisKKwlyZWcgPSBhZ254X3JlYWQzMihjdGwsIDB4ZWM1MCk7CisJcmVnICY9IH4weDQwOworCWFnbnhfd3JpdGUzMihjdGwsIDB4ZWM1MCwgcmVnKTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1BNX1NPRlRSU1QsIDB4MCk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9QTV9QTExDVEwsIDB4MSk7CisKKwlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfQk1fQk1DVEwpOworCXJlZyB8PSAweDgwMDA7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9CTV9CTUNUTCwgcmVnKTsKKwllbmFibGVfcmVjZWl2ZXIocHJpdik7CisJcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX1NZU0lURl9TWVNNT0RFKTsKKwlyZWcgfD0gMHgyMDA7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9TWVNJVEZfU1lTTU9ERSwgcmVnKTsKKwllbmFibGVfcmVjZWl2ZXIocHJpdik7CisKKwltaWdodF9zbGVlcCgpOworCS8qIEluaXRpYWxpemUgR2FpbiBDb250cm9sIENvdW50cyAqLworCWdhaW5fY3RsY250X2luaXQocHJpdik7CisKKwkvKiBXcml0ZSBJbml0aWFsIFN0YXRpb24gUG93ZXIgVGVtcGxhdGUgZm9yIHRoaXMgc3RhdGlvbigjMCkgKi8KKwlzdGFfcG93ZXJfaW5pdChwcml2LCBMT0NBTF9TVEFJRCk7CisKKwltaWdodF9zbGVlcCgpOworCS8qIEluaXRpYWxpemUgdGhlIHJ4LHRkLHRtIHJpbmdzLCBmb3IgZWFjaCBub2RlIGluIHRoZSByaW5nICovCisJZmlsbF9yaW5ncyhwcml2KTsKKworCW1pZ2h0X3NsZWVwKCk7CisKKworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfUE1fU09GVFJTVCwgMHg4MDAwMDAzMyk7CisJYWdueF93cml0ZTMyKGN0bCwgMHhlYzUwLCAweGMpOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfUE1fU09GVFJTVCwgMHgwKTsKKworCS8qIEZJWE1FIEluaXRpYWxpemUgdGhlIHRyYW5zbWl0IGNvbnRyb2wgcmVnaXN0ZXIgKi8KKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1RYTV9DVEwsIDB4MTk0YzEpOworCisJZW5hYmxlX3JlY2VpdmVyKHByaXYpOworCisJbWlnaHRfc2xlZXAoKTsKKwkvKiBGSVhNRSBTZXQgdGhlIFJlY2VpdmUgQ29udHJvbCBNYWMgQWRkcmVzcyB0byBjYXJkIGFkZHJlc3MgKi8KKwltYWNfYWRkcmVzc19zZXQocHJpdik7CisJZW5hYmxlX3JlY2VpdmVyKHByaXYpOworCW1pZ2h0X3NsZWVwKCk7CisKKwkvKiBTZXQgdGhlIHJlY2lldmUgcmVxdWVzdCByYXRlICovCisJLyogRklYTUUgRW5hYmxlIHRoZSByZXF1ZXN0ICovCisJLyogQ2hlY2sgcGFja2V0IGxlbmd0aCAqLworCS8qIFNldCBtYXhpbXVtIHBhY2tldCBsZW5ndGggKi8KKy8qIAlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1JYTV9SRVFSQVRFLCAweDg4MTk1ZTAwKTsgKi8KKy8qIAllbmFibGVfcmVjZWl2ZXIocHJpdik7ICovCisKKwkvKiBTZXQgdGhlIFJlY2VpdmVyIEJTU0lEICovCisJcmVjZWl2ZXJfYnNzaWRfc2V0KHByaXYsIGJzc2lkKTsKKworCS8qIEZJWE1FIFNldCB0byBtYW5hZ2VkIG1vZGUgKi8KKwlzZXRfbWFuYWdlZF9tb2RlKHByaXYpOworLy8Jc2V0X3Byb21pc2N1b3VzX21vZGUocHJpdik7CisvKiAJc2V0X3NjYW5fbW9kZShwcml2KTsgKi8KKy8qIAlzZXRfbGVhcm5fbW9kZShwcml2KTsgKi8KKy8vIAlzZXRfcHJvbWlzX2FuZF9tYW5hZ2VkKHByaXYpOworLy8gCXNldF9hZGhvY19tb2RlKHByaXYpOworCisJLyogU2V0IHRoZSByZWNpZXZlIHJlcXVlc3QgcmF0ZSAqLworCS8qIENoZWNrIHBhY2tldCBsZW5ndGggKi8KKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1JYTV9SRVFSQVRFLCAweDA4MDAwMDAwKTsKKwlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfUlhNX1JFUVJBVEUpOworCS8qIFNldCBtYXhpbXVtIHBhY2tldCBsZW5ndGggKi8KKwlyZWcgfD0gMHgwMDE5NWUwMDsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1JYTV9SRVFSQVRFLCByZWcpOworCisJLyogQ29uZmlndXJlIHRoZSBSWCBhbmQgVFggaW50ZXJydXB0ICovCisJcmVnID0gRU5BQkxFX1JYX0lOVEVSUlVQVCB8IFJYX0NBQ0hFX0xJTkUgfCBGUkFHX0xFTl8yMDQ4IHwgRlJBR19CRTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0NJUl9SWENGRywgcmVnKTsKKwkvKiBGSVhNRSAqLworCXJlZyA9IEVOQUJMRV9UWF9JTlRFUlJVUFQgfCBUWF9DQUNIRV9MSU5FIHwgRlJBR19MRU5fMjA0OCB8IEZSQUdfQkU7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9DSVJfVFhDRkcsIHJlZyk7CisKKwkvKiBFbmFibGUgUlggVFggSW50ZXJydXB0cyAqLworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQ0lSX1JYQ1RMLCAweDgwKTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0NJUl9UWE1DVEwsIDB4ODApOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQ0lSX1RYRENUTCwgMHg4MCk7CisKKwkvKiBGSVhNRSBTZXQgdGhlIG1hc3RlciBjb250cm9sIGludGVycnVwdCBpbiBibG9jayBjb250cm9sICovCisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9DSVJfQkxLQ1RMLCAweDgwMCk7CisKKwkvKiBFbmFibGUgUlggYW5kIFRYIHF1ZXVlcyAqLworCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9DSVJfUlhDVEwpOworCXJlZyB8PSAweDg7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9DSVJfUlhDVEwsIHJlZyk7CisJcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX0NJUl9UWE1DVEwpOworCXJlZyB8PSAweDg7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9DSVJfVFhNQ1RMLCByZWcpOworCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9DSVJfVFhEQ1RMKTsKKwlyZWcgfD0gMHg4OworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQ0lSX1RYRENUTCwgcmVnKTsKKworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfU1lTSVRGX0dQSU9VVCwgMHg1KTsKKwkvKiBGSVhNRSAqLworCS8qICB1bmtub3dfcmVnaXN0ZXJfd3JpdGUocHJpdik7ICovCisJLyogVXBkYXRlIGxvY2FsIGNhcmQgaGFzaCBlbnRyeSAqLworCWhhc2hfd3JpdGUocHJpdiwgcHJpdi0+bWFjX2FkZHIsIExPQ0FMX1NUQUlEKTsKKworCW1pZ2h0X3NsZWVwKCk7CisKKwkvKiBGSVhNRSAqLworCWFnbnhfc2V0X2NoYW5uZWwocHJpdiwgMSk7CisJbWlnaHRfc2xlZXAoKTsKK30gLyogYWdueF9jYXJkX2ludGVyZmFjZV9pbml0ICovCisKKwordm9pZCBhZ254X2h3X2luaXQoc3RydWN0IGFnbnhfcHJpdiAqcHJpdikKK3sKKwlBR05YX1RSQUNFOworCW1pZ2h0X3NsZWVwKCk7CisJY2FyZF9pbnRlcmZhY2VfaW5pdChwcml2KTsKK30KKworaW50IGFnbnhfaHdfcmVzZXQoc3RydWN0IGFnbnhfcHJpdiAqcHJpdikKK3sKKwlyZXR1cm4gY2FyZF9mdWxsX3Jlc2V0KHByaXYpOworfQorCitpbnQgYWdueF9zZXRfc3NpZChzdHJ1Y3QgYWdueF9wcml2ICpwcml2LCB1OCAqc3NpZCwgc2l6ZV90IHNzaWRfbGVuKQoreworCUFHTlhfVFJBQ0U7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgYWdueF9zZXRfYnNzaWQoc3RydWN0IGFnbnhfcHJpdiAqcHJpdiwgdTggKmJzc2lkKQoreworCXJlY2VpdmVyX2Jzc2lkX3NldChwcml2LCBic3NpZCk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYWdueC9waHkuaCBiL2RyaXZlcnMvc3RhZ2luZy9hZ254L3BoeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1ZTFlMjIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYWdueC9waHkuaApAQCAtMCwwICsxLDQwOSBAQAorI2lmbmRlZiBBR05YX1BIWV9IXworI2RlZmluZSBBR05YX1BIWV9IXworCisjaW5jbHVkZSAiYWdueC5oIgorCisvKiBUcmFuc21pc3Npb24gTWFuYWdtZW50IFJlZ2lzdGVycyAqLworI2RlZmluZSBBR05YX1RYTV9CQVNFCQkweDAwMDAKKyNkZWZpbmUgQUdOWF9UWE1fQ1RMCQkweDAwMDAJLyogY29udHJvbCByZWdpc3RlciAqLworI2RlZmluZSBBR05YX1RYTV9FVE1GCQkweDAwMDQgLyogZW5hYmxlIHRyYW5zbWlzc2lvbiBtYW5hZ2VtZW50IGZ1bmN0aW9ucyAqLworI2RlZmluZSBBR05YX1RYTV9UWFRFTVAJCTB4MDAwOCAvKiB0cmFuc21pc3Npb24gdGVtcGxhdGUgKi8KKyNkZWZpbmUgQUdOWF9UWE1fUkVUUllTVEFJRAkweDAwMGMgLyogUmV0cnkgU3RhdGlvbiBJRCAqLworI2RlZmluZSBBR05YX1RYTV9USU1FU1RBTVBMTwkJMHgwMDEwCS8qIFRpbWVzdGFtcCBMbyAqLworI2RlZmluZSBBR05YX1RYTV9USU1FU1RBTVBISQkJMHgwMDE0CS8qIFRpbWVzdGFtcCBIaSAqLworI2RlZmluZSBBR05YX1RYTV9UWERFTEFZCTB4MDAxOCAgLyogdHggZGVsYXkgKi8KKyNkZWZpbmUgQUdOWF9UWE1fVEJUVExPCQkweDAwMjAJLyogdGJ0dCBMbyAqLworI2RlZmluZSBBR05YX1RYTV9UQlRUSEkJCTB4MDAyNAkvKiB0YnR0IEhpICovCisjZGVmaW5lIEFHTlhfVFhNX0JFQUlOVEVSCTB4MDAyOCAvKiBCZWFjb24gSW50ZXJ2YWwgKi8KKyNkZWZpbmUgQUdOWF9UWE1fTkFWCQkweDAwMzAgLyogTkFWICovCisjZGVmaW5lIEFHTlhfVFhNX0NGUE1EVgkJMHgwMDM0IC8qIENGUCBNRFYgKi8KKyNkZWZpbmUgQUdOWF9UWE1fQ0ZQRVJDTlQJMHgwMDM4IC8qIENGUCBwZXJpb2QgY291bnQgKi8KKyNkZWZpbmUgQUdOWF9UWE1fUFJPQkRFTEFZCTB4MDAzYyAvKiBwcm9iZSBkZWxheSAqLworI2RlZmluZSBBR05YX1RYTV9MSVNJTlRFUkNOVAkweDAwNDAgLyogbGlzdGVuIGludGVydmFsIGNvdW50ICovCisjZGVmaW5lIEFHTlhfVFhNX0RUSU1QRVJJQ05UCTB4MDA0YyAvKiBEVElNIHBlcmlvZCBjb3VudCAqLworCisjZGVmaW5lIEFHTlhfVFhNX0JFQUNPTl9DVEwJMHgwMDVjIC8qIGJlYWNvbiBjb250cm9sICovCisKKyNkZWZpbmUgQUdOWF9UWE1fU0NIRU1QQ05UCTB4MDA3YyAvKiBzY2hlZHVsZSBlbXB0eSBjb3VudCAqLworI2RlZmluZSBBR05YX1RYTV9NQVhUSU1PVVQJMHgwMDg0IC8qIG1heCB0aW1lb3V0IGV4Y2VlZCBjb3VudCAqLworI2RlZmluZSBBR05YX1RYTV9NQVhDRlBUSU0JMHgwMDg4IC8qIG1heCBDRiBwb2xsIHRpbWVvdXQgY291bnQgKi8KKyNkZWZpbmUgQUdOWF9UWE1fTUFYUlhUSU1FCTB4MDA4YyAvKiBtYXggUlggdGltZW91dCBjb3VudCAqLworI2RlZmluZSBBR05YX1RYTV9NQVhBQ0tUSU0JMHgwMDkwCS8qIG1heCBBQ0sgdGltZW91dCBjb3VudCAqLworI2RlZmluZSBBR05YX1RYTV9ESUYwMQkJMHgwMGEwIC8qIERJRiAwLTEgKi8KKyNkZWZpbmUgQUdOWF9UWE1fRElGMjMJCTB4MDBhNCAvKiBESUYgMi0zICovCisjZGVmaW5lIEFHTlhfVFhNX0RJRjQ1CQkweDAwYTggLyogRElGIDQtNSAqLworI2RlZmluZSBBR05YX1RYTV9ESUY2NwkJMHgwMGFjIC8qIERJRiA2LTcgKi8KKyNkZWZpbmUgQUdOWF9UWE1fU0lGU1BJRlMJMHgwMGIwIC8qIFNJRlMvUElGUyAqLworI2RlZmluZSBBR05YX1RYTV9USUZTRUlGUwkweDAwYjQgLyogVElGUy9FSUZTICovCisjZGVmaW5lIEFHTlhfVFhNX01BWENDQUNOVFNMT1QJMHgwMGI4IC8qIG1heCBDQ0EgY291bnQgc2xvdCAqLworI2RlZmluZSBBR05YX1RYTV9TTE9UTElNSVQJMHgwMGJjIC8qIHNsb3QgbGltaXQvMSBtc2VjIGxpbWl0ICovCisjZGVmaW5lIEFHTlhfVFhNX0NGUE9MTFJYVElNCTB4MDBmMCAvKiBDRiBwb2xsIFJYIHRpbWVvdXQgY291bnQgKi8KKyNkZWZpbmUgQUdOWF9UWE1fQ0ZBQ0tUMTFCCTB4MDBmNCAvKiBDRiBhY2sgdGltZW91dCBsaW1pdCBmb3IgMTFiICovCisjZGVmaW5lIEFHTlhfVFhNX0NXMAkJMHgwMTAwIC8qIENXIDAgKi8KKyNkZWZpbmUgQUdOWF9UWE1fU0xCRUFMSU0wCTB4MDEwOCAvKiBzaG9ydC9sb25nIGJlYWNvbiBsaW1pdCAwICovCisjZGVmaW5lIEFHTlhfVFhNX0NXMQkJMHgwMTIwIC8qIENXIDEgKi8KKyNkZWZpbmUgQUdOWF9UWE1fU0xCRUFMSU0xCTB4MDEyOCAvKiBzaG9ydC9sb25nIGJlYWNvbiBsaW1pdCAxICovCisjZGVmaW5lIEFHTlhfVFhNX0NXMgkJMHgwMTQwIC8qIENXIDIgKi8KKyNkZWZpbmUgQUdOWF9UWE1fU0xCRUFMSU0yCTB4MDE0OCAvKiBzaG9ydC9sb25nIGJlYWNvbiBsaW1pdCAyICovCisjZGVmaW5lIEFHTlhfVFhNX0NXMwkJMHgwMTYwIC8qIENXIDMgKi8KKyNkZWZpbmUgQUdOWF9UWE1fU0xCRUFMSU0zCTB4MDE2OCAvKiBzaG9ydC9sb25nIGJlYWNvbiBsaW1pdCAzICovCisjZGVmaW5lIEFHTlhfVFhNX0NXNAkJMHgwMTgwIC8qIENXIDQgKi8KKyNkZWZpbmUgQUdOWF9UWE1fU0xCRUFMSU00CTB4MDE4OCAvKiBzaG9ydC9sb25nIGJlYWNvbiBsaW1pdCA0ICovCisjZGVmaW5lIEFHTlhfVFhNX0NXNQkJMHgwMWEwIC8qIENXIDUgKi8KKyNkZWZpbmUgQUdOWF9UWE1fU0xCRUFMSU01CTB4MDFhOCAvKiBzaG9ydC9sb25nIGJlYWNvbiBsaW1pdCA1ICovCisjZGVmaW5lIEFHTlhfVFhNX0NXNgkJMHgwMWMwIC8qIENXIDYgKi8KKyNkZWZpbmUgQUdOWF9UWE1fU0xCRUFMSU02CTB4MDFjOCAvKiBzaG9ydC9sb25nIGJlYWNvbiBsaW1pdCA2ICovCisjZGVmaW5lIEFHTlhfVFhNX0NXNwkJMHgwMWUwIC8qIENXIDcgKi8KKyNkZWZpbmUgQUdOWF9UWE1fU0xCRUFMSU03CTB4MDFlOCAvKiBzaG9ydC9sb25nIGJlYWNvbiBsaW1pdCA3ICovCisjZGVmaW5lIEFHTlhfVFhNX0JFQUNPTlRFTVAgICAgIDB4MTAwMAkvKiBiZWFjb24gdGVtcGxhdGUgKi8KKyNkZWZpbmUgQUdOWF9UWE1fU1RBUE9XVEVNUAkweDFhMDAgLyogIFN0YXRpb24gUG93ZXIgVGVtcGxhdGUgKi8KKworLyogUmVjZWl2ZSBNYW5hZ2VtZW50IENvbnRyb2wgUmVnaXN0ZXJzICovCisjZGVmaW5lIEFHTlhfUlhNX0JBU0UJCTB4MjAwMAorI2RlZmluZSBBR05YX1JYTV9SRVFSQVRFCTB4MjAwMAkvKiByZXF1ZXN0ZWQgcmF0ZSAqLworI2RlZmluZSBBR05YX1JYTV9NQUNISQkJMHgyMDA0CS8qIGZpcnN0IDQgYnl0ZXMgb2YgbWFjIGFkZHJlc3MgKi8KKyNkZWZpbmUgQUdOWF9SWE1fTUFDTE8JCTB4MjAwOAkvKiBsYXN0IDIgYnl0ZXMgb2YgbWFjIGFkZHJlc3MgKi8KKyNkZWZpbmUgQUdOWF9SWE1fQlNTSURISQkweDIwMGMJLyogYnNzaWQgaGkgKi8KKyNkZWZpbmUgQUdOWF9SWE1fQlNTSURMTwkweDIwMTAJLyogYnNzaWQgbG8gKi8KKyNkZWZpbmUgQUdOWF9SWE1fSEFTSF9DTURfRkxBRwkweDIwMTQJLyogRmxhZ3MgZm9yIHRoZSBSWCBIYXNoIENvbW1hbmQgRGVmYXVsdDowICovCisjZGVmaW5lIEFHTlhfUlhNX0hBU0hfQ01EX0hJR0gJMHgyMDE4CS8qIFRoZSBIaWdoIGhhbGYgb2YgdGhlIEhhc2ggQ29tbWFuZCAqLworI2RlZmluZSBBR05YX1JYTV9IQVNIX0NNRF9MT1cJMHgyMDFjCS8qIFRoZSBMb3cgaGFsZiBvZiB0aGUgSGFzaCBDb21tYW5kICovCisjZGVmaW5lIEFHTlhfUlhNX1JPVVRBQgkJMHgyMDIwCS8qIHJvdXRpbmcgdGFibGUgKi8KKyNkZWZpbmUJCVJPVVRBQl9TVUJUWVBFX1NISUZUCTI0CisjZGVmaW5lCQlST1VUQUJfVFlQRV9TSElGVAkyOAorI2RlZmluZQkJUk9VVEFCX1NUQVRVU19TSElGVAkzMAorI2RlZmluZQkJUk9VVEFCX1JXX1NISUZUCQkzMQorI2RlZmluZQkJUk9VVEFCX1JPVVRFX0RST1AJMHhmMDAwMDAgLyogRHJvcCAqLworI2RlZmluZQkJUk9VVEFCX1JPVVRFX0NQVQkweDQwMDAwMCAvKiBDUFUgKi8KKyNkZWZpbmUJCVJPVVRBQl9ST1VURV9FTkNSWQkweDUwMDgwMCAvKiBFbmNyeXB0aW9uICovCisjZGVmaW5lCQlST1VUQUJfUk9VVEVfUkZQCTB4ODAwMDAwIC8qIFJGUCAqLworCisjZGVmaW5lCQlST1VUQUJfVFlQRV9NQU5BRwkweDAgLyogTWFuYWdlbWVudCAqLworI2RlZmluZQkJUk9VVEFCX1RZUEVfQ1RMCQkweDEgLyogQ29udHJvbCAqLworI2RlZmluZQkJUk9VVEFCX1RZUEVfREFUQQkweDIgLyogRGF0YSAqLworCisjZGVmaW5lCQlST1VUQUJfU1VCVFlQRV9EQVRBCQkweDAKKyNkZWZpbmUJCVJPVVRBQl9TVUJUWVBFX0RBVEFBQ0sJCTB4MQorI2RlZmluZQkJUk9VVEFCX1NVQlRZUEVfREFUQVBPTEwJCTB4MgorI2RlZmluZQkJUk9VVEFCX1NVQlRZUEVfREFUQVBPTExBQ0sJMHgzCisjZGVmaW5lCQlST1VUQUJfU1VCVFlQRV9OVUxMCQkweDQgLyogTlVMTCAqLworI2RlZmluZQkJUk9VVEFCX1NVQlRZUEVfTlVMTEFDSwkJMHg1CisjZGVmaW5lCQlST1VUQUJfU1VCVFlQRV9OVUxMUE9MTAkJMHg2CisjZGVmaW5lCQlST1VUQUJfU1VCVFlQRV9OVUxMUE9MTEFDSwkweDcKKyNkZWZpbmUJCVJPVVRBQl9TVUJUWVBFX1FPU0RBVEEJCTB4OCAvKiBRT1MgREFUQSAqLworI2RlZmluZQkJUk9VVEFCX1NVQlRZUEVfUU9TREFUQUFDSwkweDkKKyNkZWZpbmUJCVJPVVRBQl9TVUJUWVBFX1FPU0RBVEFQT0xMCTB4YQorI2RlZmluZQkJUk9VVEFCX1NVQlRZUEVfUU9TREFUQUFDS1BPTEwJMHhiCisjZGVmaW5lCQlST1VUQUJfU1VCVFlQRV9RT1NOVUxMCQkweGMKKyNkZWZpbmUJCVJPVVRBQl9TVUJUWVBFX1FPU05VTExBQ0sJMHhkCisjZGVmaW5lCQlST1VUQUJfU1VCVFlQRV9RT1NOVUxMUE9MTAkweGUKKyNkZWZpbmUJCVJPVVRBQl9TVUJUWVBFX1FPU05VTExQT0xMQUNLCTB4ZgorI2RlZmluZSBBR05YX1JYTV9ERUxBWTExCSAgIDB4MjAyNAkvKiBkZWxheSAxMShBQikgKi8KKyNkZWZpbmUgQUdOWF9SWE1fU09GX0NOVAkgICAweDIwMjgJLyogU09GIENvdW50ICovCisjZGVmaW5lIEFHTlhfUlhNX0ZSQUdfQ05UCSAgIDB4MjAyYwkvKiBGcmFnbWVudCBDb3VudCovCisjZGVmaW5lIEFHTlhfUlhNX0ZDU19DTlQJICAgMHgyMDMwCS8qIEZDUyBDb3VudCAqLworI2RlZmluZSBBR05YX1JYTV9CU1NJRF9NSVNTX0NOVAkgICAweDIwMzQJLyogQlNTSUQgTWlzcyBDb3VudCAqLworI2RlZmluZSBBR05YX1JYTV9QRFVfRVJSX0NOVAkgICAweDIwMzgJLyogUERVIEVycm9yIENvdW50ICovCisjZGVmaW5lIEFHTlhfUlhNX0RFU1RfTUlTU19DTlQJICAgMHgyMDNDCS8qIERlc3RpbmF0aW9uIE1pc3MgQ291bnQgKi8KKyNkZWZpbmUgQUdOWF9SWE1fRFJPUF9DTlQJICAgMHgyMDQwCS8qIERyb3AgQ291bnQgKi8KKyNkZWZpbmUgQUdOWF9SWE1fQUJPUlRfQ05UCSAgIDB4MjA0NAkvKiBBYm9ydCBDb3VudCAqLworI2RlZmluZSBBR05YX1JYTV9SRUxBWV9DTlQJICAgMHgyMDQ4CS8qIFJlbGF5IENvdW50ICovCisjZGVmaW5lIEFHTlhfUlhNX0hBU0hfTUlTU19DTlQJICAgMHgyMDRjCS8qIEhhc2ggTWlzcyBDb3VudCAqLworI2RlZmluZSBBR05YX1JYTV9TQV9ISQkJICAgMHgyMDUwCS8qIEFkZHJlc3Mgb2YgcmVjZWl2ZWQgcGFja2V0IEhpICovCisjZGVmaW5lIEFHTlhfUlhNX1NBX0xPCQkgICAweDIwNTQJLyogQWRkcmVzcyBvZiByZWNlaXZlZCBwYWNrZXQgTG8gKi8KKyNkZWZpbmUgQUdOWF9SWE1fSEFTSF9EVU1QX0xTVAkgICAweDIxMDAJLyogQ29udGFpbnMgSGFzaCBEYXRhICovCisjZGVmaW5lIEFHTlhfUlhNX0hBU0hfRFVNUF9NU1QJICAgMHgyMTA0CS8qIENvbnRhaW5zIEhhc2ggRGF0YSAqLworI2RlZmluZSBBR05YX1JYTV9IQVNIX0RVTVBfREFUQSAgICAweDIxMDgJLyogVGhlIFN0YXRpb24gSUQgdG8gZHVtcCAqLworCisKKy8qIEVuY3J5cHRpb24gTWFuYWdtZW50ICovCisjZGVmaW5lIEFHTlhfRU5DUllfQkFTRQkJMHgyNDAwCisjZGVmaW5lIEFHTlhfRU5DUllfV0VQS0VZMAkweDI0NDAgLyogd2VwIGtleSAjMCAqLworI2RlZmluZSBBR05YX0VOQ1JZX1dFUEtFWTEJMHgyNDQ0IC8qIHdlcCBrZXkgIzEgKi8KKyNkZWZpbmUgQUdOWF9FTkNSWV9XRVBLRVkyCTB4MjQ0OCAvKiB3ZXAga2V5ICMyICovCisjZGVmaW5lIEFHTlhfRU5DUllfV0VQS0VZMwkweDI0NGMgLyogd2VwIGtleSAjMyAqLworI2RlZmluZSBBR05YX0VOQ1JZX0NDTVJFQ1RMCTB4MjQ2MCAvKiBjY20gcmVwbGF5IGNvbnRyb2wgKi8KKworCisvKiBCYW5kIE1hbmFnZW1lbnQgUmVnaXN0ZXJzICovCisjZGVmaW5lIEFHTlhfQk1fQkFTRQkJMHgyYzAwCisjZGVmaW5lIEFHTlhfQk1fQk1DVEwJCTB4MmMwMCAgLyogYmFuZCBtYW5hZ2VtZW50IGNvbnRyb2wgKi8KKyNkZWZpbmUgQUdOWF9CTV9UWFdBRERSCQkweDJjMTggIC8qIHR4IHdvcmtxdWV1ZSBhZGRyZXNzIHN0YXJ0ICovCisjZGVmaW5lIEFHTlhfQk1fVFhUT1BFRVIJMHgyYzI0CS8qIHRyYW5zbWl0IHRvIHBlZXJzICovCisjZGVmaW5lIEFHTlhfQk1fRlBMSFAJCTB4MmMyYyAgLyogZnJlZSBwb29sIGxpc3QgaGVhZCBwb2ludGVyICovCisjZGVmaW5lIEFHTlhfQk1fRlBMVFAJCTB4MmMzMCAgLyogZnJlZSBwb29sIGxpc3QgdGFpbCBwb2ludGVyICovCisjZGVmaW5lIEFHTlhfQk1fRlBDTlQJCTB4MmMzNCAgLyogZnJlZSBwb29sIGNvdW50ICovCisjZGVmaW5lIEFHTlhfQk1fQ0lQRFVXQ05UCTB4MmMzOCAgLyogY2FyZCBpbnRlcmZhY2UgcGR1IHdvcmtxdWV1ZSBjb3VudCAqLworI2RlZmluZSBBR05YX0JNX1NQUERVV0NOVAkweDJjM2MgIC8qIHNwIHBkdSB3b3JrcXVldWUgY291bnQgKi8KKyNkZWZpbmUgQUdOWF9CTV9SRlBQRFVXQ05UCTB4MmM0MCAgLyogcmZwIHBkdSB3b3JrcXVldWUgY291bnQgKi8KKyNkZWZpbmUgQUdOWF9CTV9SSFBQRFVXQ05UCTB4MmM0NCAgLyogcmhwIHBkdSB3b3JrcXVldWUgY291bnQgKi8KKyNkZWZpbmUgQUdOWF9CTV9DSVdRQ1RMCQkweDJjNDggLyogQ2FyZCBJbnRlcmZhY2UgV29ya1F1ZXVlIENvbnRyb2wgKi8KKyNkZWZpbmUgQUdOWF9CTV9DUFVUWFdDVEwJMHgyYzUwICAvKiBjcHUgdHggd29ya3F1ZXVlIGNvbnRyb2wgKi8KKyNkZWZpbmUgQUdOWF9CTV9DUFVSWFdDVEwJMHgyYzU4ICAvKiBjcHUgcnggd29ya3F1ZXVlIGNvbnRyb2wgKi8KKyNkZWZpbmUgQUdOWF9CTV9DUFVMV0NUTAkweDJjNjAgLyogY3B1IGxvdyB3b3JrcXVldWUgY29udHJvbCAqLworI2RlZmluZSBBR05YX0JNX0NQVUhXQ1RMCTB4MmM2OCAvKiBjcHUgaGlnaCB3b3JrcXVldWUgY29udHJvbCAqLworI2RlZmluZSBBR05YX0JNX1NQVFhXQ1RMCTB4MmM3MCAvKiBzcCB0eCB3b3JrcXVldWUgY29udHJvbCAqLworI2RlZmluZSBBR05YX0JNX1NQUlhXQ1RMCTB4MmM3OCAvKiBzcCByeCB3b3JrcXVldWUgY29udHJvbCAqLworI2RlZmluZSBBR05YX0JNX1JGUFdDVEwJCTB4MmM4MCAvKiBSRlAgd29ya3F1ZXVlIGNvbnRyb2wgKi8KKyNkZWZpbmUgQUdOWF9CTV9NVFNNCQkweDJjOTAgLyogTXVsdGljYXN0IFRyYW5zbWl0IFN0YXRpb24gTWFzayAqLworCisvKiBDYXJkIEludGVyZmFjZSBSZWdpc3RlcnMgKDMyYml0cykgKi8KKyNkZWZpbmUgQUdOWF9DSVJfQkFTRQkJMHgzMDAwCisjZGVmaW5lIEFHTlhfQ0lSX0JMS0NUTAkJMHgzMDAwCS8qIGJsb2NrIGNvbnRyb2wqLworI2RlZmluZQkJQUdOWF9TVEFUX1RYCTB4MQorI2RlZmluZQkJQUdOWF9TVEFUX1JYCTB4MgorI2RlZmluZQkJQUdOWF9TVEFUX1gJMHg0CisvKiBCZWxvdyB0d28gaW50ZXJydXB0IGZsYWdzIHdpbGwgYmUgc2V0IGJ5IG91ciBidXQgbm90IENQVSBvciB0aGUgY2FyZCAqLworI2RlZmluZQkJQUdOWF9TVEFUX1RYRAkweDEwCisjZGVmaW5lCQlBR05YX1NUQVRfVFhNCTB4MjAKKworI2RlZmluZSBBR05YX0NJUl9BRERSV0lOCTB4MzAwNAkvKiBBZGRyZXNzYWJsZSBXaW5kb3dzKi8KKyNkZWZpbmUgQUdOWF9DSVJfRU5ESUFOCQkweDMwMDggIC8qIGNhcmQgZW5kaWFubmVzcyAqLworI2RlZmluZSBBR05YX0NJUl9TRVJJQUxJVEYJMHgzMDIwCS8qIHNlcmlhbCBpbnRlcmZhY2UgKi8KKyNkZWZpbmUgQUdOWF9DSVJfUlhDRkcJCTB4MzA0MAkvKiByZWNlaXZlIGNvbmZpZyAqLworI2RlZmluZQkJRU5BQkxFX1JYX0lOVEVSUlVQVCAweDIwCisjZGVmaW5lCQlSWF9DQUNIRV9MSU5FCSAgICAweDgKKy8qIHRoZSBSWCBmcmFnbWVudCBsZW5ndGggKi8KKyNkZWZpbmUJCUZSQUdfTEVOXzI1NgkweDAgLyogMjU2QiAqLworI2RlZmluZQkJRlJBR19MRU5fNTEyCTB4MQorI2RlZmluZQkJRlJBR19MRU5fMTAyNAkweDIKKyNkZWZpbmUJCUZSQUdfTEVOXzIwNDgJMHgzCisjZGVmaW5lCQlGUkFHX0JFCQkweDEwCisjZGVmaW5lIEFHTlhfQ0lSX1JYQ1RMCQkweDMwNTAJLyogcmVjZWl2ZSBjb250cm9sICovCisvKiBtZW1vcnkgYWRkcmVzcywgY2hpcHNpZGUgKi8KKyNkZWZpbmUgQUdOWF9DSVJfUlhDTVNUQVJUCTB4MzA1NAkvKiByZWNlaXZlIGNsaWVudCBtZW1vcnkgc3RhcnQgKi8KKyNkZWZpbmUgQUdOWF9DSVJfUlhDTUVORAkweDMwNTgJLyogcmVjZWl2ZSBjbGllbnQgbWVtb3J5IGVuZCAqLworLyogbWVtb3J5IGFkZHJlc3MsIHBjaSAqLworI2RlZmluZSBBR05YX0NJUl9SWEhPU1RBRERSCTB4MzA2MAkvKiByZWNlaXZlIGhvc3RzaWRlIGFkZHJlc3MgKi8KKy8qIG1lbW9yeSBhZGRyZXNzLCBjaGlwc2lkZSAqLworI2RlZmluZSBBR05YX0NJUl9SWENMSUFERFIJMHgzMDY0CS8qIHJlY2VpdmUgY2xpZW50c2lkZSBhZGRyZXNzICovCisjZGVmaW5lIEFHTlhfQ0lSX1JYRE1BQ1RMCTB4MzA2OAkvKiByZWNlaXZlIGRtYSBjb250cm9sICovCisjZGVmaW5lIEFHTlhfQ0lSX1RYQ0ZHCQkweDMwODAJLyogdHJhbnNtaXQgY29uZmlnICovCisjZGVmaW5lIEFHTlhfQ0lSX1RYTUNUTAkJMHgzMDkwIC8qIFRyYW5zbWl0IE1hbmFnZW1lbnQgQ29udHJvbCAqLworI2RlZmluZQkJRU5BQkxFX1RYX0lOVEVSUlVQVCAweDIwCisjZGVmaW5lCQlUWF9DQUNIRV9MSU5FCSAgICAweDgKKyNkZWZpbmUgQUdOWF9DSVJfVFhNU1RBUlQJMHgzMDk0IC8qIFRyYW5zbWl0IE1hbmFnZW1lbnQgU3RhcnQgKi8KKyNkZWZpbmUgQUdOWF9DSVJfVFhNRU5ECQkweDMwOTggLyogVHJhbnNtaXQgTWFuYWdlbWVudCBFbmQgKi8KKyNkZWZpbmUgQUdOWF9DSVJfVFhEQ1RMCQkweDMwYTAJLyogdHJhbnNtaXQgZGF0YSBjb250cm9sICovCisvKiBtZW1lb3J5IGFkZHJlc3MsIGNoaXBzZXQgKi8KKyNkZWZpbmUgQUdOWF9DSVJfVFhEU1RBUlQJMHgzMGE0CS8qIHRyYW5zbWl0IGRhdGEgc3RhcnQgKi8KKyNkZWZpbmUgQUdOWF9DSVJfVFhERU5ECQkweDMwYTgJLyogdHJhbnNtaXQgZGF0YSBlbmQgKi8KKyNkZWZpbmUgQUdOWF9DSVJfVFhNSEFERFIJMHgzMGIwIC8qIFRyYW5zbWl0IE1hbmFnZW1lbnQgSG9zdHNpZGUgQWRkcmVzcyAqLworI2RlZmluZSBBR05YX0NJUl9UWE1DQUREUgkweDMwYjQgLyogVHJhbnNtaXQgTWFuYWdlbWVudCBDbGllbnRzaWRlIEFkZHJlc3MgKi8KKyNkZWZpbmUgQUdOWF9DSVJfVFhETUFDVEwJMHgzMGI4CS8qIHRyYW5zbWl0IGRtYSBjb250cm9sICovCisKKworLyogUG93ZXIgTWFuYWdtZW50IFVuaXQgKi8KKyNkZWZpbmUgQUdOWF9QTV9CQVNFCQkweDNjMDAKKyNkZWZpbmUgQUdOWF9QTV9QTUNUTAkJMHgzYzAwCS8qIFBNIENvbnRyb2wqLworI2RlZmluZSBBR05YX1BNX01BQ01TVwkJMHgzYzA4IC8qIE1BQyBNYW51YWwgU2xvdyBXb3JrIEVuYWJsZSAqLworI2RlZmluZSBBR05YX1BNX1JGQ1RMCQkweDNjMGMgLyogUkYgQ29udHJvbCAqLworI2RlZmluZSBBR05YX1BNX1BIWU1XCQkweDNjMTQJLyogUGh5IE1hbm5hbCBXb3JrICovCisjZGVmaW5lIEFHTlhfUE1fU09GVFJTVAkJMHgzYzE4CS8qIFBNVSBTb2Z0IFJlc2V0ICovCisjZGVmaW5lIEFHTlhfUE1fUExMQ1RMCQkweDNjMWMJLyogUE1VIFBMTCBjb250cm9sKi8KKyNkZWZpbmUgQUdOWF9QTV9URVNUUEhZCQkweDNjMjQgLyogUE1VIFRlc3QgUGh5ICovCisKKworLyogSW50ZXJydXB0IENvbnRyb2wgaW50ZXJmYWNlICovCisjZGVmaW5lIEFHTlhfSU5UX0JBU0UJCTB4NDAwMAorI2RlZmluZSBBR05YX0lOVF9TVEFUCQkweDQwMDAJLyogaW50ZXJydXB0IHN0YXR1cyAqLworI2RlZmluZSBBR05YX0lOVF9NQVNLCQkweDQwMGMJLyogaW50ZXJydXB0IG1hc2sgKi8KKy8qIEZJWE1FICovCisjZGVmaW5lCQlJUlFfVFhfQkVBQ09OCTB4MQkvKiBUWCBCZWFjb24gKi8KKyNkZWZpbmUJCUlSUV9UWF9SRVRSWQkweDgJLyogVFggUmV0cnkgSW50ZXJydXB0ICovCisjZGVmaW5lCQlJUlFfVFhfQUNUSVZJVFkJMHgxMAkvKiBUWCBBY3Rpdml0eSAqLworI2RlZmluZQkJSVJRX1JYX0FDVElWSVRZCTB4MjAJLyogUlggQWN0aXZpdHkgKi8KKy8qIEZJWE1FIEkgZ3Vlc3MgdGhhdCBpbnN0ZWFkIFJYIGEgbm9uZSBleGlzdCBzdGFpb24ncyBwYWNrZXQgb3IKKyAgIHRoZSBzdGF0aW9uIGhhc24ndCBiZWVuIGluaXQgKi8KKyNkZWZpbmUJCUlSUV9SWF9YCTB4NDAKKyNkZWZpbmUJCUlSUV9SWF9ZCTB4ODAJLyogUlggPyAqLworI2RlZmluZQkJSVJRX1JYX0hBU0hISVQJMHgxMDAJLyogUlggSGFzaCBIaXQgKi8KKyNkZWZpbmUJCUlSUV9SWF9GUkFNRQkweDIwMAkvKiBSWCBGcmFtZSAqLworI2RlZmluZQkJSVJRX0VSUl9JTlQJMHg0MDAJLyogRXJyb3IgSW50ZXJydXB0ICovCisjZGVmaW5lCQlJUlFfVFhfUVVFX0ZVTEwJMHg4MDAJLyogVFggV29ya3F1ZXVlIEZ1bGwgKi8KKyNkZWZpbmUJCUlSUV9CQU5ETUFOX0VSUgkweDEwMDAwCS8qIEJhbmR3aWR0aCBNYW5hZ2VtZW50IEVycm9yICovCisjZGVmaW5lCQlJUlFfVFhfRElTQUJMRQkweDIwMDAwCS8qIFRYIERpc2FibGUgKi8KKyNkZWZpbmUJCUlSUV9SWF9JVkFTRVNLRVkgMHg4MDAwMCAvKiBSWCBJbnZhbGlkIFNlc3Npb24gS2V5ICovCisjZGVmaW5lCQlJUlFfUlhfS0VZSURNSVMJMHgxMDAwMDAgLyogUlgga2V5IElEIE1pc21hdGNoICovCisjZGVmaW5lCQlJUlFfUkVQX1RISElUCTB4MjAwMDAwIC8qIFJlcGxheSBUaHJlc2hvbGQgSGl0ICovCisjZGVmaW5lCQlJUlFfVElNRVIxCTB4NDAwMDAwMCAvKiBUaW1lcjEgKi8KKyNkZWZpbmUJCUlSUV9USU1FUl9DTlQJMHgxMDAwMDAwMCAvKiBUaW1lciBDb3VudCAqLworI2RlZmluZQkJSVJRX1BIWV9GQVNUSU5UIDB4MjAwMDAwMDAgLyogUGh5IEZhc3QgSW50ZXJydXB0ICovCisjZGVmaW5lCQlJUlFfUEhZX1NMT1dJTlQJMHg0MDAwMDAwMCAvKiBQaHkgU2xvdyBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUJCUlSUV9PVEhFUgkweDgwMDAwMDAwIC8qIFVua25vdyBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUJCUFHTlhfSVJRX0FMTCAgIAkweGZmZmZmZmZmCisKKy8qIFN5c3RlbSBJbnRlcmZhY2UgKi8KKyNkZWZpbmUgQUdOWF9TWVNJVEZfQkFTRQkweDQ0MDAKKyNkZWZpbmUgQUdOWF9TWVNJVEZfU1lTTU9ERQkweDQ0MDAJLyogc3lzdGVtIG1vZGUgKi8KKyNkZWZpbmUgQUdOWF9TWVNJVEZfR1BJT0lOCTB4NDQxMCAvKiBHUElPIEluICovCisvKiBQSU4gbGluZXMgZm9yIGxlZHM/ICovCisjZGVmaW5lIEFHTlhfU1lTSVRGX0dQSU9VVAkweDQ0MTQJLyogR1BJTyBPdXQgKi8KKworLyogVGltZXIgQ29udHJvbCAqLworI2RlZmluZSBBR05YX1RJTUNUTF9USU1FUjEJMHg0ODAwIC8qIFRpbWVyIDEgKi8KKyNkZWZpbmUgQUdOWF9USU1DVExfVElNMUNUTAkweDQ4MDggLyogVGltZXIgMSBDb250cm9sICovCisKKworLyogQW50ZW5uYSBDYWxpYnJhdGlvbiBJbnRlcmZhY2UgKi8KKyNkZWZpbmUgQUdOWF9BQ0lfQkFTRQkJMHg1MDAwCisjZGVmaW5lIEFHTlhfQUNJX01PREUJCTB4NTAwMCAvKiBNb2RlICovCisjZGVmaW5lIEFHTlhfQUNJX01FQVNVUkUJMHg1MDA0IC8qIE1lYXN1cmUgKi8KKyNkZWZpbmUgQUdOWF9BQ0lfU0VMQ0hBSU4JMHg1MDA4IC8qIFNlbGVjdCBDaGFpbiAqLworI2RlZmluZSBBR05YX0FDSV9MRU4JCTB4NTAwYyAvKiBMZW5ndGggKi8KKyNkZWZpbmUgQUdOWF9BQ0lfVElNRVIxCQkweDUwMTggLyogVGltZXIgMSAqLworI2RlZmluZSBBR05YX0FDSV9USU1FUjIJCTB4NTAxYyAvKiBUaW1lciAyICovCisjZGVmaW5lIEFHTlhfQUNJX09GRlNFVAkJMHg1MDIwIC8qIE9mZnNldCAqLworI2RlZmluZSBBR05YX0FDSV9TVEFUVVMJCTB4NTAzMCAvKiBTdGF0dXMgKi8KKyNkZWZpbmUJCUNBTElfSURMRQkweDAKKyNkZWZpbmUJCUNBTElfRE9ORQkweDEKKyNkZWZpbmUJCUNBTElfQlVTWQkweDIKKyNkZWZpbmUJCUNBTElfRVJSCTB4MworI2RlZmluZSBBR05YX0FDSV9BSUNDSEEwT1ZFCTB4NTAzNCAvKiBBSUMgQ2hhbm5lbCAwIE92ZXJyaWRlICovCisjZGVmaW5lIEFHTlhfQUNJX0FJQ0NIQTFPVkUJMHg1MDM4IC8qIEFJQyBDaGFubmVsIDEgT3ZlcnJpZGUgKi8KKworLyogR2FpbiBDb250cm9sIFJlZ2lzdGVycyAqLworI2RlZmluZSBBR05YX0dDUl9CQVNFCQkweDkwMDAKKy8qIHRocmVzaG9sZCBvZiBwcmltYXJ5IGFudGVubmEgKi8KKyNkZWZpbmUgQUdOWF9HQ1JfVEhEMEEJCTB4OTAwMAkvKiB0aHJlc2hvbGQ/IEQwIEEgKi8KKy8qIGxvdyB0aHJlc2hvbGQgb2YgcHJpbWFyeSBhbnRlbm5hICovCisjZGVmaW5lIEFHTlhfR0NSX1RIRDBBTAkJMHg5MDA0CS8qIHRocmVzaG9sZD8gRDAgQSBsb3cgKi8KKy8qIHRocmVzaG9sZCBvZiBzZWNvbmRhcnkgYW50ZW5uYSAqLworI2RlZmluZSBBR05YX0dDUl9USEQwQgkJMHg5MDA4CS8qIHRocmVzaG9sZD8gRDBfQiAqLworI2RlZmluZSBBR05YX0dDUl9EVU5TQVQJCTB4OTAwYyAvKiBkIHVuc2F0dXJhdGVkICovCisjZGVmaW5lIEFHTlhfR0NSX0RTQVQJCTB4OTAxMCAvKiBkIHNhdHVyYXRlZCAqLworI2RlZmluZSBBR05YX0dDUl9ERklSQ0FMCTB4OTAxNCAvKiBEIEZpci9DYWwgKi8KKyNkZWZpbmUgQUdOWF9HQ1JfREdDVEwxMUEJMHg5MDE4IC8qIGQgZ2FpbiBjb250cm9sIDExYSAqLworI2RlZmluZSBBR05YX0dDUl9ER0NUTDExQgkweDkwMWMgLyogZCBnYWluIGNvbnRyb2wgMTFiICovCisvKiBzdHJlbmd0aCBvZiBnYWluICovCisjZGVmaW5lIEFHTlhfR0NSX0dBSU5JTklUCTB4OTAyMAkvKiBnYWluIGluaXRpYWxpemF0aW9uICovCisjZGVmaW5lIEFHTlhfR0NSX1RITk9TSUcJMHg5MDI0IC8qIHRocmVob2xkIG5vIHNpZ25hbCAqLworI2RlZmluZSBBR05YX0dDUl9DT0FSU1RFUAkweDkwMjggLyogY29hcnNlIHN0ZXBwaW5nICovCisjZGVmaW5lIEFHTlhfR0NSX1NJRlNUMTFBCTB4OTAyYyAvKiBzaWZ4IHRpbWUgMTFhICovCisjZGVmaW5lIEFHTlhfR0NSX1NJRlNUMTFCCTB4OTAzMCAvKiBzaWZ4IHRpbWUgMTFiICovCisjZGVmaW5lIEFHTlhfR0NSX0NXREVURUMJMHg5MDM0IC8qIGN3IGRldGVjdGlvbiAqLworI2RlZmluZSBBR05YX0dDUl8wWDM4CQkweDkwMzggLyogPz8/PyAqLworI2RlZmluZSBBR05YX0dDUl9CT0FDVAkJMHg5MDNjCS8qIEJPIEFjdGl2ZSAqLworI2RlZmluZSBBR05YX0dDUl9CT0lOQUNUCTB4OTA0MAkvKiBCTyBJbmFjdGl2ZSAqLworI2RlZmluZSBBR05YX0dDUl9CT0RZTkEJCTB4OTA0NAkvKiBCTyBkeW5hbWljICovCisvKiA4MDIuMTEgbW9kZShhLGIsZykgKi8KKyNkZWZpbmUgQUdOWF9HQ1JfRElTQ09WTU9ECTB4OTA0OAkvKiBkaXNjb3ZlcnkgbW9kZSAqLworI2RlZmluZSBBR05YX0dDUl9OTElTVEFOVAkweDkwNGMJLyogbnVtYmVyIG9mIGxpc3RlbmluZyBhbnRlbm5hICovCisjZGVmaW5lIEFHTlhfR0NSX05BQ1RJQU5UCTB4OTA1MAkvKiBudW1iZXIgb2YgYWN0aXZlIGFudGVubmEgKi8KKyNkZWZpbmUgQUdOWF9HQ1JfTk1FQVNBTlQJMHg5MDU0CS8qIG51bWJlciBvZiBtZWFzdXJpbmcgYW50ZW5uYSAqLworI2RlZmluZSBBR05YX0dDUl9OQ0FQVEFOVAkweDkwNTgJLyogbnVtYmVyIG9mIGNhcHR1cmUgYW50ZW5uYSAqLworI2RlZmluZSBBR05YX0dDUl9USENBUDExQQkweDkwNWMgLyogdGhyZXNob2xkIGNhcHR1cmUgMTFhICovCisjZGVmaW5lIEFHTlhfR0NSX1RIQ0FQMTFCCTB4OTA2MCAvKiB0aHJlc2hvbGQgY2FwdHVyZSAxMWIgKi8KKyNkZWZpbmUgQUdOWF9HQ1JfVEhDQVBSWDExQQkweDkwNjQgLyogdGhyZXNob2xkIGNhcHR1cmUgcnggMTFhICovCisjZGVmaW5lIEFHTlhfR0NSX1RIQ0FQUlgxMUIJMHg5MDY4IC8qIHRocmVzaG9sZCBjYXB0dXJlIHJ4IDExYiAqLworI2RlZmluZSBBR05YX0dDUl9USExFVkRSTwkweDkwNmMgLyogdGhyZXNob2xkIGxldmVsIGRyb3AgKi8KKyNkZWZpbmUgQUdOWF9HQ1JfR0FJTlNFVDAJMHg5MDcwIC8qIEdhaW5zZXQgMCAqLworI2RlZmluZSBBR05YX0dDUl9HQUlOU0VUMQkweDkwNzQgLyogR2FpbnNldCAxICovCisjZGVmaW5lIEFHTlhfR0NSX0dBSU5TRVQyCTB4OTA3OCAvKiBHYWluc2V0IDIgKi8KKyNkZWZpbmUgQUdOWF9HQ1JfTUFYUlhUSU1FMTFBCTB4OTA3YyAvKiBtYXhpbXVtIHJ4IHRpbWUgMTFhICovCisjZGVmaW5lIEFHTlhfR0NSX01BWFJYVElNRTExQgkweDkwODAgLyogbWF4aW11bSByeCB0aW1lIDExYiAqLworI2RlZmluZSBBR05YX0dDUl9DT1JSVElNRQkweDkwODQgLyogY29ycmVjdGlvbiB0aW1lICovCisvKiByZXNldCB0aGUgc3Vic3lzdGVtLCAwID0gZGlzYWJsZSwgMSA9IGVuYWJsZSAqLworI2RlZmluZSBBR05YX0dDUl9SU1RHQ1RMCTB4OTA4OAkvKiByZXNldCBnYWluIGNvbnRyb2wgKi8KKy8qIGNoYW5uZWwgcmVjZWl2aW5nICovCisjZGVmaW5lIEFHTlhfR0NSX1JYQ0hBTkVMCTB4OTA4YwkvKiByZWNlaXZlIGNoYW5uZWwgKi8KKyNkZWZpbmUgQUdOWF9HQ1JfTk9JU0UwCQkweDkwOTAgLyogTm9pc2UgMCAqLworI2RlZmluZSBBR05YX0dDUl9OT0lTRTEJCTB4OTA5NCAvKiBOb2lzZSAxICovCisjZGVmaW5lIEFHTlhfR0NSX05PSVNFMgkJMHg5MDk4IC8qIE5vaXNlIDIgKi8KKyNkZWZpbmUgQUdOWF9HQ1JfU0lHSFRICQkweDkwOWMJLyogU2lnbmFsIEhpZ2ggVGhyZXNob2xkICovCisjZGVmaW5lIEFHTlhfR0NSX1NJR0xUSAkJMHg5MGEwCS8qIFNpZ25hbCBMb3cgVGhyZXNob2xkICovCisjZGVmaW5lIEFHTlhfR0NSX0NPUlJEUk9QCTB4OTBhNCAvKiBjb3JyZWN0aW9uIGRyb3AgKi8KKy8qIHRocmVzaG9sZCBvZiB0ZXJ0aWF5IGFudGVubmEgKi8KKyNkZWZpbmUgQUdOWF9HQ1JfVEhDRAkJMHg5MGE4CS8qIHRocmVzaG9sZD8gQ0QgKi8KKyNkZWZpbmUgQUdOWF9HQ1JfVEhDUwkJMHg5MGFjCS8qIHRocmVzaG9sZD8gQ1MgKi8KKyNkZWZpbmUgQUdOWF9HQ1JfTUFYUE9XRElGRgkweDkwYjggLyogbWF4aW11bSBwb3dlciBkaWZmZXJlbmNlICovCisjZGVmaW5lIEFHTlhfR0NSX1RSQUNOVDQJMHg5MGVjIC8qIFRyYW5zaXRpb24gQ291bnQgNCAqLworI2RlZmluZSBBR05YX0dDUl9UUkFDTlQ1ICAgICAgCTB4OTBmMAkvKiB0cmFuc2l0aW9uIGNvdW50IDUgKi8KKyNkZWZpbmUgQUdOWF9HQ1JfVFJBQ05UNiAgICAgICAJMHg5MGY0CS8qIHRyYW5zaXRpb24gY291bnQgNiAqLworI2RlZmluZSBBR05YX0dDUl9UUkFDTlQ3ICAgICAgIAkweDkwZjgJLyogdHJhbnNpdGlvbiBjb3V0biA3ICovCisjZGVmaW5lIEFHTlhfR0NSX1RFU1RCVVMJMHg5MTFjIC8qIHRlc3QgYnVzICovCisjZGVmaW5lIEFHTlhfR0NSX0NIQUlOTlVNCTB4OTEyMCAvKiBOdW1iZXIgb2YgQ2hhaW5zICovCisjZGVmaW5lIEFHTlhfR0NSX0FOVENGRwkJMHg5MTI0CS8qIEFudGVubmEgQ29uZmlnICovCisjZGVmaW5lIEFHTlhfR0NSX1RISlVNUAkJMHg5MTJjIC8qIHRocmVob2xkIGp1bXAgKi8KKyNkZWZpbmUgQUdOWF9HQ1JfVEhQT1dFUgkweDkxMzAgLyogdGhyZXNob2xkIHBvd2VyICovCisjZGVmaW5lIEFHTlhfR0NSX1RIUE9XQ0xJUAkweDkxMzQgLyogdGhyZXNob2xkIHBvd2VyIGNsaXAqLworI2RlZmluZSBBR05YX0dDUl9GT1JDRUNUTENMSwkweDkxMzggLyogRm9yY2UgR2FpbiBDb250cm9sIENsb2NrICovCisjZGVmaW5lIEFHTlhfR0NSX0dBSU5TRVRXUklURQkweDkxM2MgLyogR2FpbnNldCBXcml0ZSAqLworI2RlZmluZSBBR05YX0dDUl9USEQwQlRGRVNUCTB4OTE0MAkvKiB0aHJlc2hvbGQgZDAgYiB0ZiBlc3RpbWF0ZSAqLworI2RlZmluZSBBR05YX0dDUl9USFJYMTFCUE9XTUlOCTB4OTE0NAkvKiB0aHJlc2hvbGQgcnggMTFiIHBvd2VyIG1pbmltdW0gKi8KKyNkZWZpbmUgQUdOWF9HQ1JfMFgxNGMJCTB4OTE0YyAvKiA/PyAqLworI2RlZmluZSBBR05YX0dDUl8wWDE1MAkJMHg5MTUwIC8qID8/ICovCisjZGVmaW5lIEFHTlhfR0NSX1JYT1ZFUklERQkweDkxOTQJLyogcmVjaWV2ZSBvdmVycmlkZSAqLworI2RlZmluZSBBR05YX0dDUl9XQVRDSERPRwkweDkxYjAJLyogd2F0Y2hkb2cgdGltZW91dCAqLworCisKKy8qIFNwaSBJbnRlcmZhY2UgKi8KKyNkZWZpbmUgQUdOWF9TUElfQkFTRQkJMHhkYzAwCisjZGVmaW5lIEFHTlhfU1BJX0NGRwkJMHhkYzAwIC8qIHNwaSBjb25maWd1cmF0aW9uICovCisvKiBPbmx5IGFjY2VwdCAxNiBiaXRzICovCisjZGVmaW5lIEFHTlhfU1BJX1dNU1cJCTB4ZGMwNAkvKiB3cml0ZSBtb3N0IHNpZ25pZmljYW50IHdvcmQgKi8KKy8qIE9ubHkgYWNjZXB0IDE2IGJpdHMgKi8KKyNkZWZpbmUgQUdOWF9TUElfV0xTVwkJMHhkYzA4CS8qIHdyaXRlIGxlYXN0IHNpZ25pZmljYW50IHdvcmQgKi8KKyNkZWZpbmUgQUdOWF9TUElfQ1RMCQkweGRjMGMJLyogc3BpIGNvbnRyb2wgKi8KKyNkZWZpbmUgQUdOWF9TUElfUk1TVwkJMHhkYzEwIC8qIHJlYWQgbW9zdCBzaWduaWZpY2FudCB3b3JkICovCisjZGVmaW5lIEFHTlhfU1BJX1JMU1cJCTB4ZGMxNCAvKiByZWFkIGxlYXN0IHNpZ25pZmljYW50IHdvcmQgKi8KKy8qIFNQSSBDb250cm9sIE1hc2sgKi8KKyNkZWZpbmUJCVNQSV9SRUFEX0NUTAkJMHg0MDAwIC8qIHJlYWQgY29udHJvbCAqLworI2RlZmluZQkJU1BJX0JVU1lfQ1RMCQkweDgwMDAgLyogYnVzeSBjb250cm9sICovCisvKiBSRiBhbmQgc3ludGggY2hpcHMgaW4gc3BpICovCisjZGVmaW5lCQlSRl9DSElQMAkweDQwMAorI2RlZmluZQkJUkZfQ0hJUDEJMHg4MDAKKyNkZWZpbmUJCVJGX0NISVAyCTB4MTAwMAorI2RlZmluZQkJU1lOVEhfQ0hJUAkweDIwMDAKKworLyogVW5rbm93biByZWdpc3RlciAqLworI2RlZmluZSBBR05YX1VOS05PV05fQkFTRQkweDc4MDAKKworLyogRklYTUUgTW9uaXRvckdhaW4gKi8KKyNkZWZpbmUgQUdOWF9NT05HQ1JfQkFTRQkweDEyMDAwCisKKy8qIEdhaW4gVGFibGUgKi8KKyNkZWZpbmUgQUdOWF9HQUlOX1RBQkxFCQkweDEyNDAwCisKKy8qIFRoZSBpbml0aWFsIEZJUiBjb2VmZmljaWVudCB0YWJsZSAqLworI2RlZmluZSBBR05YX0ZJUl9CQVNFCQkweDE5ODA0CisKKyNkZWZpbmUgQUdOWF9FTkdJTkVfTE9PS1VQX1RCTAkweDgwMAorCisvKiBlZXByb20gY29tbWFuZHMgKi8KKyNkZWZpbmUgRUVQUk9NX0NNRF9OVUxMCQkweDAgLyogTlVMTCAqLworI2RlZmluZSBFRVBST01fQ01EX1dSSVRFCTB4MiAvKiB3cml0ZSAqLworI2RlZmluZSBFRVBST01fQ01EX1JFQUQJCTB4MyAvKiByZWFkICovCisjZGVmaW5lIEVFUFJPTV9DTURfU1RBVFVTUkVBRAkweDUgLyogc3RhdHVzIHJlZ2lzdGVyIHJlYWQgKi8KKyNkZWZpbmUgRUVQUk9NX0NNRF9XUklURUVOQUJMRQkweDYgLyogd3JpdGUgZW5hYmxlICovCisjZGVmaW5lIEVFUFJPTV9DTURfQ09ORklHVVJFCTB4NyAvKiBjb25maWd1cmUgKi8KKworI2RlZmluZSBFRVBST01fREFUQUZPUkNPRklHVVJFCTB4NiAvKiA/Pz8gKi8KKworLyogZWVwcm9tIGFkZHJlc3MgKi8KKyNkZWZpbmUgRUVQUk9NX0FERFJfU1VCVklECTB4MCAvKiBTdWIgVmVuZG9yIElEICovCisjZGVmaW5lIEVFUFJPTV9BRERSX1NVQlNJRAkweDIgLyogU3ViIFN5c3RlbSBJRCAqLworI2RlZmluZSBFRVBST01fQUREUl9NQUNBRERSCTB4MTQ2IC8qIE1BQyBBZGRyZXNzICovCisjZGVmaW5lIEVFUFJPTV9BRERSX0xPVFlQRQkweDE0ZiAvKiBMTyB0eXBlICovCisKK3N0cnVjdCBhZ254X2VlcHJvbSB7CisJdTggZGF0YTsJLyogZGF0ZSAqLworCXUxNiBhZGRyZXNzOwkvKiBhZGRyZXNzIGluIEVFUFJPTSAqLworCXU4IGNtZDsJCS8qIGNvbW1hbmQsIHVua25vd24sIHN0YXR1cyAqLworfSAgX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXykpOworCisjZGVmaW5lIEFHTlhfRUVQUk9NX0NPTU1BTkRfU0hJRlQJNQorI2RlZmluZSBBR05YX0VFUFJPTV9DT01NQU5EX1NUQVQJMHgwMQorCit2b2lkIGRpc2FibGVfcmVjZWl2ZXIoc3RydWN0IGFnbnhfcHJpdiAqcHJpdik7Cit2b2lkIGVuYWJsZV9yZWNlaXZlcihzdHJ1Y3QgYWdueF9wcml2ICpwcml2KTsKK3U4IHJlYWRfZnJvbV9lZXByb20oc3RydWN0IGFnbnhfcHJpdiAqcHJpdiwgdTE2IGFkZHJlc3MpOwordm9pZCBhZ254X2h3X2luaXQoc3RydWN0IGFnbnhfcHJpdiAqcHJpdik7CitpbnQgYWdueF9od19yZXNldChzdHJ1Y3QgYWdueF9wcml2ICpwcml2KTsKK2ludCBhZ254X3NldF9zc2lkKHN0cnVjdCBhZ254X3ByaXYgKnByaXYsIHU4ICpzc2lkLCBzaXplX3Qgc3NpZF9sZW4pOwordm9pZCBhZ254X3NldF9ic3NpZChzdHJ1Y3QgYWdueF9wcml2ICpwcml2LCB1OCAqYnNzaWQpOwordm9pZCBlbmFibGVfcG93ZXJfc2F2aW5nKHN0cnVjdCBhZ254X3ByaXYgKnByaXYpOwordm9pZCBkaXNhYmxlX3Bvd2VyX3NhdmluZyhzdHJ1Y3QgYWdueF9wcml2ICpwcml2KTsKK3ZvaWQgY2FsaWJyYXRlX2FudGVubmFfcGVyaW9kKHVuc2lnbmVkIGxvbmcgZGF0YSk7CisKKyNlbmRpZiAvKiBBR05YX1BIWV9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FnbngvcmYuYyBiL2RyaXZlcnMvc3RhZ2luZy9hZ254L3JmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODI5NGI2ZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9hZ254L3JmLmMKQEAgLTAsMCArMSw4OTQgQEAKKy8qKgorICogQWlyZ28gTUlNTyB3aXJlbGVzcyBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgTGkgWWFuQm8gPGRyZWFtZmx5MjgxQGdtYWlsLmNvbT4KKworICogVGhhbmtzIGZvciBKZWZmIFdpbGxpYW1zIDxhbmdlbGJhbmVAZ21haWwuY29tPiBkbyByZXZlcnNlIGVuZ2luZWVyCisgKiB3b3JrcyBhbmQgcHVibGlzaGVkIHRoZSBTUEVDUyBhdCBodHRwOi8vYWlyZ28ud2R3Y29uc3VsdGluZy5uZXQvbXltb2luCisKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSAiYWdueC5oIgorI2luY2x1ZGUgImRlYnVnLmgiCisjaW5jbHVkZSAicGh5LmgiCisjaW5jbHVkZSAidGFibGUuaCIKKworLyogRklYTUUhICovCitzdGF0aWMgaW5saW5lIHZvaWQgc3BpX3dyaXRlKHZvaWQgX19pb21lbSAqcmVnaW9uLCB1MzIgY2hpcF9pZHMsIHUzMiBzdywKKwkJICAgICAgdTE2IHNpemUsIHUzMiBjb250cm9sKQoreworCXUzMiByZWc7CisJdTMyIGxzdyA9IHN3ICYgMHhmZmZmOwkJLyogbG93ZXIgMTYgYml0cyBvZiBzdyovCisJdTMyIG1zdyA9IHN3ID4+IDE2OwkJLyogaGlnaCAxNiBiaXRzIG9mIHN3ICovCisKKwkvKiBGSVhNRSBXcml0ZSBNb3N0IFNpZ25pZmljYW50IFdvcmQgb2YgdGhlIDMyYml0IGRhdGEgdG8gTVNXICovCisJLyogRklYTUUgQW5kIExlYXN0IFNpZ25pZmljYW50IFdvcmQgdG8gTFNXICovCisJaW93cml0ZTMyKChsc3cpLCByZWdpb24gKyBBR05YX1NQSV9XTFNXKTsKKwlpb3dyaXRlMzIoKG1zdyksIHJlZ2lvbiArIEFHTlhfU1BJX1dNU1cpOworCXJlZyA9IGNoaXBfaWRzIHwgc2l6ZSB8IGNvbnRyb2w7CisJLyogV3JpdGUgY2hpcCBpZChzKSwgd3JpdGUgc2l6ZSBhbmQgYnVzeSBjb250cm9sIHRvIENvbnRyb2wgUmVnaXN0ZXIgKi8KKwlpb3dyaXRlMzIoKHJlZyksIHJlZ2lvbiArIEFHTlhfU1BJX0NUTCk7CisJLyogV2FpdCBmb3IgQnVzeSBjb250cm9sIHRvIGNsZWFyICovCisJc3BpX2RlbGF5KCk7Cit9CisKKy8qCisgKiBXcml0ZSB0byBTUEkgU3ludGggcmVnaXN0ZXIKKyAqLworc3RhdGljIGlubGluZSB2b2lkIHNwaV9zeV93cml0ZSh2b2lkIF9faW9tZW0gKnJlZ2lvbiwgdTMyIGNoaXBfaWRzLCB1MzIgc3cpCit7CisJLyogRklYTUUgdGhlIHNpemUgMHgxNSBpcyBhIG1hZ2ljIHZhbHVlKi8KKwlzcGlfd3JpdGUocmVnaW9uLCBjaGlwX2lkcywgc3csIDB4MTUsIFNQSV9CVVNZX0NUTCk7Cit9CisKKy8qCisgKiBXcml0ZSB0byBTUEkgUkYgcmVnaXN0ZXIKKyAqLworc3RhdGljIGlubGluZSB2b2lkIHNwaV9yZl93cml0ZSh2b2lkIF9faW9tZW0gKnJlZ2lvbiwgdTMyIGNoaXBfaWRzLCB1MzIgc3cpCit7CisJLyogRklYTUUgdGhlIHNpemUgMHhkIGlzIGEgbWFnaWMgdmFsdWUqLworCXNwaV93cml0ZShyZWdpb24sIGNoaXBfaWRzLCBzdywgMHhkLCBTUElfQlVTWV9DVEwpOworfSAvKiBzcGlfcmZfd3JpdGUgKi8KKworLyoKKyAqIFdyaXRlIHRvIFNQSSB3aXRoIFJlYWQgQ29udHJvbCBiaXQgc2V0CisgKi8KK2lubGluZSB2b2lkIHNwaV9yY193cml0ZSh2b2lkIF9faW9tZW0gKnJlZ2lvbiwgdTMyIGNoaXBfaWRzLCB1MzIgc3cpCit7CisJLyogRklYTUUgdGhlIHNpemUgMHhlNSBpcyBhIG1hZ2ljIHZhbHVlICovCisJc3BpX3dyaXRlKHJlZ2lvbiwgY2hpcF9pZHMsIHN3LCAweGU1LCBTUElfQlVTWV9DVEx8U1BJX1JFQURfQ1RMKTsKK30KKworLyogR2V0IHRoZSBhY3RpdmUgY2hhaW5zJ3MgY291bnQgKi8KK3N0YXRpYyBpbnQgZ2V0X2FjdGl2ZV9jaGFpbnMoc3RydWN0IGFnbnhfcHJpdiAqcHJpdikKK3sKKwl2b2lkIF9faW9tZW0gKmN0bCA9IHByaXYtPmN0bDsKKwlpbnQgbnVtID0gMDsKKwl1MzIgcmVnOworCUFHTlhfVFJBQ0U7CisKKwlzcGlfcmNfd3JpdGUoY3RsLCBSRl9DSElQMCwgMHgyMSk7CisJcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX1NQSV9STFNXKTsKKwlpZiAocmVnID09IDEpCisJCW51bSsrOworCisJc3BpX3JjX3dyaXRlKGN0bCwgUkZfQ0hJUDEsIDB4MjEpOworCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9TUElfUkxTVyk7CisJaWYgKHJlZyA9PSAxKQorCQludW0rKzsKKworCXNwaV9yY193cml0ZShjdGwsIFJGX0NISVAyLCAweDIxKTsKKwlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfU1BJX1JMU1cpOworCWlmIChyZWcgPT0gMSkKKwkJbnVtKys7CisKKwlzcGlfcmNfd3JpdGUoY3RsLCBSRl9DSElQMCwgMHgyNik7CisJcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX1NQSV9STFNXKTsKKwlpZiAoMHgzMyAhPSByZWcpCisJCXByaW50ayhLRVJOX1dBUk5JTkcgUEZYICJVbm1hdGNoZWQgcmYgY2hpcHMgcmVzdWx0XG4iKTsKKworCXJldHVybiBudW07Cit9IC8qIGdldF9hY3RpdmVfY2hhaW5zICovCisKK3ZvaWQgcmZfY2hpcHNfaW5pdChzdHJ1Y3QgYWdueF9wcml2ICpwcml2KQoreworCXZvaWQgX19pb21lbSAqY3RsID0gcHJpdi0+Y3RsOworCXUzMiByZWc7CisJaW50IG51bTsKKwlBR05YX1RSQUNFOworCisJaWYgKHByaXYtPnJldmlkID09IDEpIHsKKwkJcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX1NZU0lURl9HUElPVVQpOworCQlyZWcgfD0gMHg4OworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1NZU0lURl9HUElPVVQsIHJlZyk7CisJfQorCisJLyogU2V0IFNQSSBjbG9jayBzcGVlZCB0byAyMDBOUyAqLworICAgICAgICByZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfU1BJX0NGRyk7CisgICAgICAgIHJlZyAmPSB+MHhGOworICAgICAgICByZWcgfD0gMHgzOworICAgICAgICBhZ254X3dyaXRlMzIoY3RsLCBBR05YX1NQSV9DRkcsIHJlZyk7CisKKyAgICAgICAgLyogU2V0IFNQSSBjbG9jayBzcGVlZCB0byA1ME5TICovCisJcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX1NQSV9DRkcpOworCXJlZyAmPSB+MHhGOworCXJlZyB8PSAweDE7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9TUElfQ0ZHLCByZWcpOworCisJc3BpX3JmX3dyaXRlKGN0bCwgUkZfQ0hJUDB8UkZfQ0hJUDF8UkZfQ0hJUDIsIDB4MTEwMSk7CisKKwludW0gPSBnZXRfYWN0aXZlX2NoYWlucyhwcml2KTsKKwlwcmludGsoS0VSTl9JTkZPIFBGWCAiQWN0aXZlIGNoYWlucyBhcmUgJWRcbiIsIG51bSk7CisKKwlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfU1BJX0NGRyk7CisJcmVnICY9IH4weEY7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9TUElfQ0ZHLCByZWcpOworCisJc3BpX3JmX3dyaXRlKGN0bCwgUkZfQ0hJUDB8UkZfQ0hJUDF8UkZfQ0hJUDIsIDB4MTkwOCk7Cit9IC8qIHJmX2NoaXBzX2luaXQgKi8KKworCitzdGF0aWMgdTMyIGNoYW5uZWxfdGJsWzE1XVs5XSA9IHsKKwl7MCwgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LAorCXsxLCAgMHgwMCwgMHgwMCwgMHg2MjQsIDB4MDAsIDB4MWE0LCAweDI4LCAweDAwLCAweDFlfSwKKwl7MiwgIDB4MDAsIDB4MDAsIDB4NjE1LCAweDAwLCAweDFhZSwgMHgyOCwgMHgwMCwgMHgxZX0sCisJezMsICAweDAwLCAweDAwLCAweDYxYSwgMHgwMCwgMHgxYWUsIDB4MjgsIDB4MDAsIDB4MWV9LAorCXs0LCAgMHgwMCwgMHgwMCwgMHg2MWYsIDB4MDAsIDB4MWFlLCAweDI4LCAweDAwLCAweDFlfSwKKwl7NSwgIDB4MDAsIDB4MDAsIDB4NjI0LCAweDAwLCAweDFhZSwgMHgyOCwgMHgwMCwgMHgxZX0sCisJezYsICAweDAwLCAweDAwLCAweDYxZiwgMHgwMCwgMHgxYjMsIDB4MjgsIDB4MDAsIDB4MWV9LAorCXs3LCAgMHgwMCwgMHgwMCwgMHg2MjQsIDB4MDAsIDB4MWIzLCAweDI4LCAweDAwLCAweDFlfSwKKwl7OCwgIDB4MDAsIDB4MDAsIDB4NjI5LCAweDAwLCAweDFiMywgMHgyOCwgMHgwMCwgMHgxZX0sCisJezksICAweDAwLCAweDAwLCAweDYyNCwgMHgwMCwgMHgxYjgsIDB4MjgsIDB4MDAsIDB4MWV9LAorCXsxMCwgMHgwMCwgMHgwMCwgMHg2MjksIDB4MDAsIDB4MWI4LCAweDI4LCAweDAwLCAweDFlfSwKKwl7MTEsIDB4MDAsIDB4MDAsIDB4NjJlLCAweDAwLCAweDFiOCwgMHgyOCwgMHgwMCwgMHgxZX0sCisJezEyLCAweDAwLCAweDAwLCAweDYzMywgMHgwMCwgMHgxYjgsIDB4MjgsIDB4MDAsIDB4MWV9LAorCXsxMywgMHgwMCwgMHgwMCwgMHg2MjgsIDB4MDAsIDB4MWI4LCAweDI4LCAweDAwLCAweDFlfSwKKwl7MTQsIDB4MDAsIDB4MDAsIDB4NjQ0LCAweDAwLCAweDFiOCwgMHgyOCwgMHgwMCwgMHgxZX0sCit9OworCisKK3N0YXRpYyBpbmxpbmUgdm9pZAorY2hhbm5lbF90Ymxfd3JpdGUoc3RydWN0IGFnbnhfcHJpdiAqcHJpdiwgdW5zaWduZWQgaW50IGNoYW5uZWwsIHVuc2lnbmVkIGludCByZWdfbnVtKQoreworCXZvaWQgX19pb21lbSAqY3RsID0gcHJpdi0+Y3RsOworCXUzMiByZWc7CisKKwlyZWcgPSBjaGFubmVsX3RibFtjaGFubmVsXVtyZWdfbnVtXTsKKwlyZWcgPDw9IDQ7CisJcmVnIHw9IHJlZ19udW07CisJc3BpX3N5X3dyaXRlKGN0bCwgU1lOVEhfQ0hJUCwgcmVnKTsKK30KKworc3RhdGljIHZvaWQgc3ludGhfZnJlcV9zZXQoc3RydWN0IGFnbnhfcHJpdiAqcHJpdiwgdW5zaWduZWQgaW50IGNoYW5uZWwpCit7CisJdm9pZCBfX2lvbWVtICpjdGwgPSBwcml2LT5jdGw7CisJdTMyIHJlZzsKKwlBR05YX1RSQUNFOworCisJc3BpX3JmX3dyaXRlKGN0bCwgUkZfQ0hJUDB8UkZfQ0hJUDEsIDB4MTIwMSk7CisKKwkvKiBTZXQgdGhlIENsb2NrIGJpdHMgdG8gNTBOUyAqLworCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9TUElfQ0ZHKTsKKwlyZWcgJj0gfjB4RjsKKwlyZWcgfD0gMHgxOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfU1BJX0NGRywgcmVnKTsKKworCS8qIFdyaXRlIDB4MDBjMCB0byBMU1cgYW5kIDB4MyB0byBNU1cgb2YgU3ludGggQ2hpcCAqLworCXNwaV9zeV93cml0ZShjdGwsIFNZTlRIX0NISVAsIDB4MzAwYzApOworCisJc3BpX3N5X3dyaXRlKGN0bCwgU1lOVEhfQ0hJUCwgMHgzMik7CisKKwkvKiAjIFdyaXRlIHRvIFJlZ2lzdGVyIDEgb24gdGhlIFN5bnRoIENoaXAgKi8KKwljaGFubmVsX3RibF93cml0ZShwcml2LCBjaGFubmVsLCAxKTsKKwkvKiAjIFdyaXRlIHRvIFJlZ2lzdGVyIDMgb24gdGhlIFN5bnRoIENoaXAgKi8KKwljaGFubmVsX3RibF93cml0ZShwcml2LCBjaGFubmVsLCAzKTsKKwkvKiAjIFdyaXRlIHRvIFJlZ2lzdGVyIDYgb24gdGhlIFN5bnRoIENoaXAgKi8KKwljaGFubmVsX3RibF93cml0ZShwcml2LCBjaGFubmVsLCA2KTsKKwkvKiAjIFdyaXRlIHRvIFJlZ2lzdGVyIDUgb24gdGhlIFN5bnRoIENoaXAgKi8KKwljaGFubmVsX3RibF93cml0ZShwcml2LCBjaGFubmVsLCA1KTsKKwkvKiAjIFdyaXRlIHRvIHJlZ2lzdGVyIDggb24gdGhlIFN5bnRoIENoaXAgKi8KKwljaGFubmVsX3RibF93cml0ZShwcml2LCBjaGFubmVsLCA4KTsKKworCS8qIEZJWE1FIENsZWFyIHRoZSBjbG9jayBiaXRzICovCisJcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX1NQSV9DRkcpOworCXJlZyAmPSB+MHhmOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfU1BJX0NGRywgcmVnKTsKK30gLyogc3ludGhfY2hpcF9pbml0ICovCisKKworc3RhdGljIHZvaWQgYW50ZW5uYV9pbml0KHN0cnVjdCBhZ254X3ByaXYgKnByaXYsIGludCBudW1fYW50ZW5uYSkKK3sKKwl2b2lkIF9faW9tZW0gKmN0bCA9IHByaXYtPmN0bDsKKworCXN3aXRjaCAobnVtX2FudGVubmEpIHsKKwljYXNlIDE6CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX05MSVNUQU5ULCAxKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfTk1FQVNBTlQsIDEpOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9OQUNUSUFOVCwgMSk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX05DQVBUQU5ULCAxKTsKKworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9BTlRDRkcsIDcpOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9CT0FDVCwgMzQpOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9CT0lOQUNULCAzNCk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX0JPRFlOQSwgMzApOworCisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1RIRDBBLCAxMjUpOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9USEQwQUwsIDEwMCk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1RIRDBCLCA5MCk7CisKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfVEhEMEJURkVTVCwgODApOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9TSUdIVEgsIDEwMCk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1NJR0xUSCwgMTYpOworCQlicmVhazsKKwljYXNlIDI6CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX05MSVNUQU5ULCAyKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfTk1FQVNBTlQsIDIpOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9OQUNUSUFOVCwgMik7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX05DQVBUQU5ULCAyKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfQU5UQ0ZHLCAxNSk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX0JPQUNULCAzNik7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX0JPSU5BQ1QsIDM2KTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfQk9EWU5BLCAzMik7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1RIRDBBLCAxMjApOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9USEQwQUwsIDEwMCk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1RIRDBCLCA4MCk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1RIRDBCVEZFU1QsIDcwKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfU0lHSFRILCAxMDApOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9TSUdMVEgsIDMyKTsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9OTElTVEFOVCwgMyk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX05NRUFTQU5ULCAzKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfTkFDVElBTlQsIDMpOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9OQ0FQVEFOVCwgMyk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX0FOVENGRywgMzEpOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9CT0FDVCwgMzYpOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9CT0lOQUNULCAzNik7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX0JPRFlOQSwgMzIpOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9USEQwQSwgMTAwKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfVEhEMEFMLCAxMDApOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9USEQwQiwgNzApOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9USEQwQlRGRVNULCA3MCk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1NJR0hUSCwgMTAwKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfU0lHTFRILCA0OCk7CisvLwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfU0lHTFRILCAxNik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX1dBUk5JTkcgUEZYICJVbmtub3cgYW50ZW5uYSBudW1iZXJcbiIpOworCX0KK30gLyogYW50ZW5uYV9pbml0ICovCisKK3N0YXRpYyB2b2lkIGNoYWluX3VwZGF0ZShzdHJ1Y3QgYWdueF9wcml2ICpwcml2LCB1MzIgY2hhaW4pCit7CisJdm9pZCBfX2lvbWVtICpjdGwgPSBwcml2LT5jdGw7CisJdTMyIHJlZzsKKwlBR05YX1RSQUNFOworCisJc3BpX3JjX3dyaXRlKGN0bCwgUkZfQ0hJUDAsIDB4MjApOworCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9TUElfUkxTVyk7CisKKwlpZiAocmVnID09IDB4NCkKKwkJc3BpX3JmX3dyaXRlKGN0bCwgUkZfQ0hJUDB8UkZfQ0hJUDEsIHJlZ3wweDEwMDApOworCWVsc2UgaWYgKHJlZyAhPSAweDApCisgICAgIAkJc3BpX3JmX3dyaXRlKGN0bCwgUkZfQ0hJUDB8UkZfQ0hJUDF8UkZfQ0hJUDIsIHJlZ3wweDEwMDApOworICAgICAgICBlbHNlIHsKKwkJaWYgKGNoYWluID09IDMgfHwgY2hhaW4gPT0gNikgeworCQkJc3BpX3JmX3dyaXRlKGN0bCwgUkZfQ0hJUDB8UkZfQ0hJUDF8UkZfQ0hJUDIsIHJlZ3wweDEwMDApOworCQkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfUlhPVkVSSURFLCAweDApOworCQl9IGVsc2UgaWYgKGNoYWluID09IDIgfHwgY2hhaW4gPT0gNCkgeworCQkJc3BpX3JmX3dyaXRlKGN0bCwgUkZfQ0hJUDB8UkZfQ0hJUDEsIHJlZ3wweDEwMDApOworCQkJc3BpX3JmX3dyaXRlKGN0bCwgUkZfQ0hJUDIsIDB4MTAwNSk7CisJCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9SWE9WRVJJREUsIDB4ODI0KTsKKwkJfSBlbHNlIGlmIChjaGFpbiA9PSAxKSB7CisJCQlzcGlfcmZfd3JpdGUoY3RsLCBSRl9DSElQMCwgcmVnfDB4MTAwMCk7CisJCQlzcGlfcmZfd3JpdGUoY3RsLCBSRl9DSElQMXxSRl9DSElQMiwgMHgxMDA0KTsKKwkJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1JYT1ZFUklERSwgMHhjMzYpOworCQl9CisJfQorCisJc3BpX3JjX3dyaXRlKGN0bCwgUkZfQ0hJUDAsIDB4MjIpOworCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9TUElfUkxTVyk7CisKKwlzd2l0Y2ggKHJlZykgeworCWNhc2UgMDoKKwkJc3BpX3JmX3dyaXRlKGN0bCwgUkZfQ0hJUDB8UkZfQ0hJUDF8UkZfQ0hJUDIsIDB4MTAwNSk7CisJCWJyZWFrOworCWNhc2UgMToKKwkJc3BpX3JmX3dyaXRlKGN0bCwgUkZfQ0hJUDB8UkZfQ0hJUDEsIDB4MTIwMSk7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJaWYgKGNoYWluID09IDYgfHwgY2hhaW4gPT0gNCkgeworCQkJc3BpX3JmX3dyaXRlKGN0bCwgUkZfQ0hJUDB8UkZfQ0hJUDEsIDB4MTIwMik7CisJCQlzcGlfcmZfd3JpdGUoY3RsLCBSRl9DSElQMiwgMHgxMDA1KTsKKwkJfSBlbHNlIGlmIChjaGFpbiA8IDMpIHsKKwkJCXNwaV9yZl93cml0ZShjdGwsIFJGX0NISVAwLCAweDEyMDIpOworCQkJc3BpX3JmX3dyaXRlKGN0bCwgUkZfQ0hJUDF8UkZfQ0hJUDIsIDB4MTAwNSk7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJaWYgKGNoYWluID09IDMpIHsKKwkJCXNwaV9yZl93cml0ZShjdGwsIFJGX0NISVAwfFJGX0NISVAxLCAweDEyMDMpOworCQkJc3BpX3JmX3dyaXRlKGN0bCwgUkZfQ0hJUDIsIDB4MTIwMSk7CisJCX0gZWxzZSBpZiAoY2hhaW4gPT0gMikgeworCQkJc3BpX3JmX3dyaXRlKGN0bCwgUkZfQ0hJUDAsIDB4MTIwMyk7CisJCQlzcGlfcmZfd3JpdGUoY3RsLCBSRl9DSElQMiwgMHgxMjAwKTsKKwkJCXNwaV9yZl93cml0ZShjdGwsIFJGX0NISVAxLCAweDEyMDEpOworCQl9IGVsc2UgaWYgKGNoYWluID09IDEpIHsKKwkJCXNwaV9yZl93cml0ZShjdGwsIFJGX0NISVAwLCAweDEyMDMpOworCQkJc3BpX3JmX3dyaXRlKGN0bCwgUkZfQ0hJUDF8UkZfQ0hJUDIsIDB4MTIwMCk7CisJCX0gZWxzZSBpZiAoY2hhaW4gPT0gNCkgeworCQkJc3BpX3JmX3dyaXRlKGN0bCwgUkZfQ0hJUDB8UkZfQ0hJUDEsIDB4MTIwMyk7CisJCQlzcGlfcmZfd3JpdGUoY3RsLCBSRl9DSElQMiwgMHgxMjAxKTsKKwkJfSBlbHNlIHsKKwkJCXNwaV9yZl93cml0ZShjdGwsIFJGX0NISVAwLCAweDEyMDMpOworCQkJc3BpX3JmX3dyaXRlKGN0bCwgUkZfQ0hJUDF8UkZfQ0hJUDIsIDB4MTIwMSk7CisJCX0KKwl9Cit9IC8qIGNoYWluX3VwZGF0ZSAqLworCitzdGF0aWMgdm9pZCBhbnRlbm5hX2NvbmZpZyhzdHJ1Y3QgYWdueF9wcml2ICpwcml2KQoreworCXZvaWQgX19pb21lbSAqY3RsID0gcHJpdi0+Y3RsOworCXUzMiByZWc7CisJQUdOWF9UUkFDRTsKKworCS8qIFdyaXRlIDB4MCB0byB0aGUgVFggTWFuYWdlbWVudCBDb250cm9sIFJlZ2lzdGVyIEVuYWJsZSBiaXQgKi8KKwlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfVFhNX0NUTCk7CisJcmVnICY9IH4weDE7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9UWE1fQ1RMLCByZWcpOworCisJLyogRklYTUUgKi8KKwkvKiBTZXQgaW5pdGlhbCB2YWx1ZSBiYXNlZCBvbiBudW1iZXIgb2YgQW50ZW5uYWUgKi8KKwlhbnRlbm5hX2luaXQocHJpdiwgMyk7CisKKwkvKiBGSVhNRSBVcGRhdGUgUG93ZXIgVGVtcGxhdGVzIGZvciBjdXJyZW50IHZhbGlkIFN0YXRpb25zICovCisJLyogc3RhX3Bvd2VyX2luaXQocHJpdiwgMCk7Ki8KKworCS8qIEZJWE1FIHRoZSBudW1iZXIgb2YgY2hhaW5zIHNob3VsZCBnZXQgZnJvbSBlZXByb20qLworCWNoYWluX3VwZGF0ZShwcml2LCBBR05YX0NIQUlOU19NQVgpOworfSAvKiBhbnRlbm5hX2NvbmZpZyAqLworCit2b2lkIGNhbGlicmF0ZV9vc2NpbGxhdG9yKHN0cnVjdCBhZ254X3ByaXYgKnByaXYpCit7CisJdm9pZCBfX2lvbWVtICpjdGwgPSBwcml2LT5jdGw7CisJdTMyIHJlZzsKKwlBR05YX1RSQUNFOworCisJc3BpX3JjX3dyaXRlKGN0bCwgUkZfQ0hJUDB8UkZfQ0hJUDEsIDB4MTIwMSk7CisJcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX0dDUl9HQUlOU0VUMSk7CisJcmVnIHw9IDB4MTA7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfR0FJTlNFVDEsIHJlZyk7CisKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9HQUlOU0VUV1JJVEUsIDEpOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1JTVEdDVEwsIDEpOworCisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9BQ0lfTEVOLCAweDNmZik7CisKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0FDSV9USU1FUjEsIDB4MjcpOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQUNJX1RJTUVSMiwgMHgyNyk7CisJLyogKFJlc2lkdWFsIERDIENhbGlicmF0aW9uKSB0byBDYWxpYnJhdGlvbiBNb2RlICovCisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9BQ0lfTU9ERSwgMHgyKTsKKworCXNwaV9yY193cml0ZShjdGwsIFJGX0NISVAwfFJGX0NISVAxLCAweDEwMDQpOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQUNJX0xFTiwgMHgzZmYpOworCS8qIChUWCBMTyBDYWxpYnJhdGlvbikgdG8gQ2FsaWJyYXRpb24gTW9kZSAqLworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQUNJX01PREUsIDB4NCk7CisKKwlkbyB7CisJCXUzMiAgcmVnMSwgcmVnMiwgcmVnMzsKKwkJLyogRW5hYmxlIFBvd2VyIFNhdmluZyBDb250cm9sICovCisJCWVuYWJsZV9wb3dlcl9zYXZpbmcocHJpdik7CisJCS8qIFNhdmUgdGhlIGZvbGxvd2luZyByZWdpc3RlcnMgdG8gcmVzdG9yZSAqLworCQlyZWcxID0gaW9yZWFkMzIoY3RsICsgMHgxMTAwMCk7CisJCXJlZzIgPSBpb3JlYWQzMihjdGwgKyAweGVjNTApOworCQlyZWczID0gaW9yZWFkMzIoY3RsICsgMHhlYzU0KTsKKwkJd21iKCk7CisKKwkJYWdueF93cml0ZTMyKGN0bCwgMHgxMTAwMCwgMHhjZmRmKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgMHhlYzUwLCAweDcwKTsKKwkJLyogUmVzdG9yZSB0aGUgcmVnaXN0ZXJzICovCisJCWFnbnhfd3JpdGUzMihjdGwsIDB4MTEwMDAsIHJlZzEpOworCQlhZ254X3dyaXRlMzIoY3RsLCAweGVjNTAsIHJlZzIpOworCQlhZ254X3dyaXRlMzIoY3RsLCAweGVjNTQsIHJlZzMpOworCQkvKiBEaXNhYmxlIFBvd2VyIFNhdmluZyBDb250cm9sICovCisJCWRpc2FibGVfcG93ZXJfc2F2aW5nKHByaXYpOworCX0gd2hpbGUgKDApOworCisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfUlNUR0NUTCwgMCk7Cit9IC8qIGNhbGlicmF0ZV9vc2NpbGxhdG9yICovCisKKworc3RhdGljIHZvaWQgcmFkaW9fY2hhbm5lbF9zZXQoc3RydWN0IGFnbnhfcHJpdiAqcHJpdiwgdW5zaWduZWQgaW50IGNoYW5uZWwpCit7CisJdm9pZCBfX2lvbWVtICpjdGwgPSBwcml2LT5jdGw7CisJdW5zaWduZWQgaW50IGZyZXEgPSBwcml2LT5iYW5kLmNoYW5uZWxzW2NoYW5uZWwgLSAxXS5jZW50ZXJfZnJlcTsKKwl1MzIgcmVnOworCUFHTlhfVFJBQ0U7CisKKwlzcGlfcmZfd3JpdGUoY3RsLCBSRl9DSElQMHxSRl9DSElQMSwgMHgxMjAxKTsKKwkvKiBTZXQgU1BJIENsb2NrIHRvIDUwIE5zICovCisJcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX1NQSV9DRkcpOworCXJlZyAmPSB+MHhGOworCXJlZyB8PSAweDE7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9TUElfQ0ZHLCByZWcpOworCisJLyogQ2xlYXIgdGhlIERpc2FibGUgVHggaW50ZXJydXB0IGJpdCBpbiBJbnRlcnJ1cHQgTWFzayAqLworLyogCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9JTlRfTUFTSyk7ICovCisvKiAJcmVnICY9IH5JUlFfVFhfRElTQUJMRTsgKi8KKy8qIAlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0lOVF9NQVNLLCByZWcpOyAqLworCisJLyogQmFuZCBTZWxlY3Rpb24gKi8KKwlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfU1lTSVRGX0dQSU9VVCk7CisJcmVnIHw9IDB4ODsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1NZU0lURl9HUElPVVQsIHJlZyk7CisKKwkvKiBGSVhNRSBTZXQgdGhlIFNpTGFicyBDaGlwIEZyZXF1ZW5jeSAqLworCXN5bnRoX2ZyZXFfc2V0KHByaXYsIGNoYW5uZWwpOworCisJcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX1BNX1NPRlRSU1QpOworCXJlZyB8PSAweDgwMTAwMDMwOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfUE1fU09GVFJTVCwgcmVnKTsKKwlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfUE1fUExMQ1RMKTsKKwlyZWcgfD0gMHgyMDAwOTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1BNX1BMTENUTCwgcmVnKTsKKworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfU1lTSVRGX0dQSU9VVCwgMHg1KTsKKworCXNwaV9yZl93cml0ZShjdGwsIFJGX0NISVAwfFJGX0NISVAxfFJGX0NISVAyLCAweDExMDApOworCisJLyogTG9hZCB0aGUgTW9uaXRvckdhaW4gVGFibGUgKi8KKwltb25pdG9yX2dhaW5fdGFibGVfaW5pdChwcml2KTsKKworCS8qIExvYWQgdGhlIFRYIEZpciB0YWJsZSAqLworCXR4X2Zpcl90YWJsZV9pbml0KHByaXYpOworCisJcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX1BNX1BNQ1RMKTsKKwlyZWcgfD0gMHg4OworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfUE1fUE1DVEwsIHJlZyk7CisKKwlzcGlfcmNfd3JpdGUoY3RsLCBSRl9DSElQMHxSRl9DSElQMSwgMHgyMik7CisJdWRlbGF5KDgwKTsKKwlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfU1BJX1JMU1cpOworCisKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9SWE9WRVJJREUsIDB4ZmYpOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX0RJU0NPVk1PRCwgMHgzKTsKKworCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgMHhlYzUwKTsKKwlyZWcgfD0gMHg0ZjsKKwlhZ254X3dyaXRlMzIoY3RsLCAweGVjNTAsIHJlZyk7CisKKwlzcGlfcmZfd3JpdGUoY3RsLCBSRl9DSElQMHxSRl9DSElQMSwgMHgxMjAxKTsKKwlhZ254X3dyaXRlMzIoY3RsLCAweDExMDA4LCAweDEpOworCWFnbnhfd3JpdGUzMihjdGwsIDB4MTEwMGMsIDB4MCk7CisJYWdueF93cml0ZTMyKGN0bCwgMHgxMTAwOCwgMHgwKTsKKwlhZ254X3dyaXRlMzIoY3RsLCAweGVjNTAsIDB4Yyk7CisKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9ESVNDT1ZNT0QsIDB4Myk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfUlhPVkVSSURFLCAweDApOworCWFnbnhfd3JpdGUzMihjdGwsIDB4MTEwMTAsIDB4NmUpOworCWFnbnhfd3JpdGUzMihjdGwsIDB4MTEwMTQsIDB4NmMpOworCisJc3BpX3JmX3dyaXRlKGN0bCwgUkZfQ0hJUDB8UkZfQ0hJUDEsIDB4MTIwMSk7CisKKwkvKiBDYWxpYnJhdGUgdGhlIEFudGVubmEgKi8KKwkvKiBhbnRlbm5hX2NhbGlicmF0ZShwcml2KTsgKi8KKwkvKiBDYWxpYnJhdGUgdGhlIFR4TG9jYWxPc2NpbGxhdG9yICovCisJY2FsaWJyYXRlX29zY2lsbGF0b3IocHJpdik7CisKKwlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfUE1fUE1DVEwpOworCXJlZyAmPSB+MHg4OworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfUE1fUE1DVEwsIHJlZyk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfR0FJTklOSVQsIDB4YSk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfVEhDRCwgMHgwKTsKKworCWFnbnhfd3JpdGUzMihjdGwsIDB4MTEwMTgsIDB4Yik7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfRElTQ09WTU9ELCAweDApOworCisJLyogV3JpdGUgRnJlcXVlbmN5IHRvIEdhaW4gQ29udHJvbCBDaGFubmVsICovCisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfUlhDSEFORUwsIGZyZXEpOworCS8qIFdyaXRlIDB4MTQwMDAwL0ZyZXEgdG8gMHg5YzA4ICovCisJcmVnID0gMHgxNDAwMDAvZnJlcTsKKwlhZ254X3dyaXRlMzIoY3RsLCAweDljMDgsIHJlZyk7CisKKwlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfUE1fU09GVFJTVCk7CisJcmVnICY9IH4weDgwMTAwMDMwOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfUE1fU09GVFJTVCwgcmVnKTsKKworCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9QTV9QTExDVEwpOworCXJlZyAmPSB+MHgyMDAwOTsKKwlyZWcgfD0gMHgxOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfUE1fUExMQ1RMLCByZWcpOworCisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9BQ0lfTU9ERSwgMHgwKTsKKworLyogRklYTUUgQWNjb3JkaW5nIHRvIE51bWJlciBvZiBDaGFpbnM6ICovCisKKy8qIAkJCSAgIDEuIDE6ICovCisvKiAgICAgICAgICAxLiBXcml0ZSAweDEyMDMgdG8gUkYgQ2hpcCAwICovCisvKiAgICAgICAgICAyLiBXcml0ZSAweDEyMDAgdG8gUkYgQ2hpcHMgMSArMiAgKi8KKy8qIAkJCSAgIDIuIDI6ICovCisvKiAgICAgICAgICAxLiBXcml0ZSAweDEyMDMgdG8gUkYgQ2hpcCAwICovCisvKiAgICAgICAgICAyLiBXcml0ZSAweDEyMDAgdG8gUkYgQ2hpcCAyICovCisvKiAgICAgICAgICAzLiBXcml0ZSAweDEyMDEgdG8gUkYgQ2hpcCAxICAqLworLyogCQkJICAgMy4gMzogKi8KKy8qICAgICAgICAgIDEuIFdyaXRlIDB4MTIwMyB0byBSRiBDaGlwIDAgKi8KKy8qICAgICAgICAgIDIuIFdyaXRlIDB4MTIwMSB0byBSRiBDaGlwIDEgKyAyICAqLworLyogCQkJICAgNC4gNDogKi8KKy8qICAgICAgICAgIDEuIFdyaXRlIDB4MTIwMyB0byBSRiBDaGlwIDAgKyAxICovCisvKiAgICAgICAgICAyLiBXcml0ZSAweDEyMDAgdG8gUkYgQ2hpcCAyICAqLworCisvKiAJCQkgICA1LiA2OiAqLworCXNwaV9yZl93cml0ZShjdGwsIFJGX0NISVAwfFJGX0NISVAxLCAweDEyMDMpOworCXNwaV9yZl93cml0ZShjdGwsIFJGX0NISVAyLCAweDEyMDEpOworCisJc3BpX3JmX3dyaXRlKGN0bCwgUkZfQ0hJUDB8UkZfQ0hJUDF8UkZfQ0hJUDIsIDB4MTAwMCk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfUlhPVkVSSURFLCAweDApOworCisJLyogRklYTUUgU2V0IHRoZSBEaXNhYmxlIFR4IGludGVycnVwdCBiaXQgaW4gSW50ZXJydXB0IE1hc2sKKwkgICAoT3IgMHgyMDAwMCB0byBJbnRlcnJ1cHQgTWFzaykgKi8KKy8qIAlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfSU5UX01BU0spOyAqLworLyogCXJlZyB8PSBJUlFfVFhfRElTQUJMRTsgKi8KKy8qIAlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0lOVF9NQVNLLCByZWcpOyAqLworCisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfUlNUR0NUTCwgMHgxKTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9SU1RHQ1RMLCAweDApOworCisJLyogQ29uZmlndXJlIHRoZSBBbnRlbm5hICovCisJYW50ZW5uYV9jb25maWcocHJpdik7CisKKwkvKiBXcml0ZSAweDAgdG8gRGlzY292ZXJ5IE1vZGUgRW5hYmxlIGRldGVjdCBHLCBCLCBBIHBhY2tldD8gKi8KKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9ESVNDT1ZNT0QsIDApOworCisJcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX1JYTV9SRVFSQVRFKTsKKwlyZWcgfD0gMHg4MDAwMDAwMDsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1JYTV9SRVFSQVRFLCByZWcpOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1JTVEdDVEwsIDB4MSk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfUlNUR0NUTCwgMHgwKTsKKworCS8qIGVuYWJsZSByYWRpbyBvbiBhbmQgdGhlIHBvd2VyIExFRCAqLworCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9TWVNJVEZfR1BJT1VUKTsKKwlyZWcgJj0gfjB4MTsKKwlyZWcgfD0gMHgyOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfU1lTSVRGX0dQSU9VVCwgcmVnKTsKKworCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9UWE1fQ1RMKTsKKwlyZWcgfD0gMHgxOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVFhNX0NUTCwgcmVnKTsKK30gLyogcmFkaW9fY2hhbm5lbF9zZXQgKi8KKworc3RhdGljIHZvaWQgYmFzZV9iYW5kX2ZpbHRlcl9jYWxpYnJhdGUoc3RydWN0IGFnbnhfcHJpdiAqcHJpdikKK3sKKwl2b2lkIF9faW9tZW0gKmN0bCA9IHByaXYtPmN0bDsKKworCXNwaV9yZl93cml0ZShjdGwsIFJGX0NISVAwfFJGX0NISVAxfFJGX0NISVAyLCAweDE3MDApOworCXNwaV9yZl93cml0ZShjdGwsIFJGX0NISVAwfFJGX0NISVAxfFJGX0NISVAyLCAweDEwMDEpOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX0ZPUkNFQ1RMQ0xLLCAweDApOworCXNwaV9yY193cml0ZShjdGwsIFJGX0NISVAwLCAweDI3KTsKKwlzcGlfcmNfd3JpdGUoY3RsLCBSRl9DSElQMSwgMHgyNyk7CisJc3BpX3JjX3dyaXRlKGN0bCwgUkZfQ0hJUDIsIDB4MjcpOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX0ZPUkNFQ1RMQ0xLLCAweDEpOworfQorCitzdGF0aWMgdm9pZCBwcmludF9vZmZzZXQoc3RydWN0IGFnbnhfcHJpdiAqcHJpdiwgdTMyIGNoYWluKQoreworCXZvaWQgX19pb21lbSAqY3RsID0gcHJpdi0+Y3RsOworCXUzMiBvZmZzZXQ7CisKKwlpb3dyaXRlMzIoKGNoYWluKSwgY3RsICsgQUdOWF9BQ0lfU0VMQ0hBSU4pOworCXVkZWxheSgxMCk7CisJb2Zmc2V0ID0gKGlvcmVhZDMyKGN0bCArIEFHTlhfQUNJX09GRlNFVCkpOworCXByaW50ayhQRlggIkNoYWluIGlzIDB4JXgsIE9mZnNldCBpcyAweCV4XG4iLCBjaGFpbiwgb2Zmc2V0KTsKK30KKwordm9pZCBwcmludF9vZmZzZXRzKHN0cnVjdCBhZ254X3ByaXYgKnByaXYpCit7CisJcHJpbnRfb2Zmc2V0KHByaXYsIDApOworCXByaW50X29mZnNldChwcml2LCA0KTsKKwlwcmludF9vZmZzZXQocHJpdiwgMSk7CisJcHJpbnRfb2Zmc2V0KHByaXYsIDUpOworCXByaW50X29mZnNldChwcml2LCAyKTsKKwlwcmludF9vZmZzZXQocHJpdiwgNik7Cit9CisKKworc3RydWN0IGNoYWlucyB7CisJdTMyIGNhbGk7CQkvKiBjYWxpYnJhdGUgIHZhbHVlKi8KKworI2RlZmluZSAgTkVFRF9DQUxJQlJBVEUJCTAKKyNkZWZpbmUgIFNVQ0NFU1NfQ0FMSUJSQVRFCTEKKwlpbnQgc3RhdHVzOworfTsKKworc3RhdGljIHZvaWQgY2hhaW5fY2FsaWJyYXRlKHN0cnVjdCBhZ254X3ByaXYgKnByaXYsIHN0cnVjdCBjaGFpbnMgKmNoYWlucywKKwkJCSAgICB1bnNpZ25lZCBpbnQgbnVtKQoreworCXZvaWQgX19pb21lbSAqY3RsID0gcHJpdi0+Y3RsOworCXUzMiBjYWxpYnJhID0gY2hhaW5zW251bV0uY2FsaTsKKworCWlmIChudW0gPCAzKQorCQljYWxpYnJhIHw9IDB4MTQwMDsKKwllbHNlCisJCWNhbGlicmEgfD0gMHgxNTAwOworCisJc3dpdGNoIChudW0pIHsKKwljYXNlIDA6CisJY2FzZSA0OgorCQlzcGlfcmZfd3JpdGUoY3RsLCBSRl9DSElQMCwgY2FsaWJyYSk7CisJCWJyZWFrOworCWNhc2UgMToKKwljYXNlIDU6CisJCXNwaV9yZl93cml0ZShjdGwsIFJGX0NISVAxLCBjYWxpYnJhKTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCWNhc2UgNjoKKwkJc3BpX3JmX3dyaXRlKGN0bCwgUkZfQ0hJUDIsIGNhbGlicmEpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwl9Cit9IC8qIGNoYWluX2NhbGlicmF0ZSAqLworCisKK3N0YXRpYyB2b2lkIGlubGluZSBnZXRfY2FsaWJyZXRlX3ZhbHVlKHN0cnVjdCBhZ254X3ByaXYgKnByaXYsIHN0cnVjdCBjaGFpbnMgKmNoYWlucywKKwkJCQkgICAgICAgdW5zaWduZWQgaW50IG51bSkKK3sKKwl2b2lkIF9faW9tZW0gKmN0bCA9IHByaXYtPmN0bDsKKwl1MzIgb2Zmc2V0OworCisJaW93cml0ZTMyKChudW0pLCBjdGwgKyBBR05YX0FDSV9TRUxDSEFJTik7CisJLyogRklYTUUgKi8KKwl1ZGVsYXkoMTApOworCW9mZnNldCA9IChpb3JlYWQzMihjdGwgKyBBR05YX0FDSV9PRkZTRVQpKTsKKworCWlmIChvZmZzZXQgPCAweGYpIHsKKwkJY2hhaW5zW251bV0uc3RhdHVzID0gU1VDQ0VTU19DQUxJQlJBVEU7CisJCXJldHVybjsKKwl9CisKKwlpZiAobnVtID09IDAgfHwgbnVtID09IDEgfHwgbnVtID09IDIpIHsKKwkJaWYgKCAwID09IGNoYWluc1tudW1dLmNhbGkpCisJCQljaGFpbnNbbnVtXS5jYWxpID0gMHhmZjsKKwkJZWxzZQorCQkJY2hhaW5zW251bV0uY2FsaS0tOworCX0gZWxzZQorCQljaGFpbnNbbnVtXS5jYWxpKys7CisKKwljaGFpbnNbbnVtXS5zdGF0dXMgPSBORUVEX0NBTElCUkFURTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGNhbGlicmFfZGVsYXkoc3RydWN0IGFnbnhfcHJpdiAqcHJpdikKK3sKKwl2b2lkIF9faW9tZW0gKmN0bCA9IHByaXYtPmN0bDsKKwl1MzIgcmVnOworCXVuc2lnbmVkIGludCBpID0gMTAwOworCisJd21iKCk7CisJd2hpbGUgKGktLSkgeworCQlyZWcgPSAoaW9yZWFkMzIoY3RsICsgQUdOWF9BQ0lfU1RBVFVTKSk7CisJCWlmIChyZWcgPT0gMHg0MDAwKQorCQkJYnJlYWs7CisJCXVkZWxheSgxMCk7CisJfQorCWlmICghaSkKKwkJcHJpbnRrKFBGWCAiY2FsaWJyYXRpb24gZmFpbGVkXG4iKTsKK30KKwordm9pZCBkb19jYWxpYnJhdGlvbihzdHJ1Y3QgYWdueF9wcml2ICpwcml2KQoreworCXZvaWQgX19pb21lbSAqY3RsID0gcHJpdi0+Y3RsOworCXN0cnVjdCBjaGFpbnMgY2hhaW5zWzddOworCXVuc2lnbmVkIGludCBpLCBqOworCUFHTlhfVFJBQ0U7CisKKwlmb3IgKGkgPSAwOyBpIDwgNzsgaSsrKSB7CisJCWlmIChpID09IDMpCisJCQljb250aW51ZTsKKworCQljaGFpbnNbaV0uY2FsaSA9IDB4N2Y7CisJCWNoYWluc1tpXS5zdGF0dXMgPSBORUVEX0NBTElCUkFURTsKKwl9CisKKwkvKiBGSVhNRSAweDMwMCBpcyBhIG1hZ2ljIG51bWJlciAqLworCWZvciAoaiA9IDA7IGogPCAweDMwMDsgaisrKSB7CisJCWlmIChjaGFpbnNbMF0uc3RhdHVzID09IFNVQ0NFU1NfQ0FMSUJSQVRFICYmCisJCSAgICBjaGFpbnNbMV0uc3RhdHVzID09IFNVQ0NFU1NfQ0FMSUJSQVRFICYmCisJCSAgICBjaGFpbnNbMl0uc3RhdHVzID09IFNVQ0NFU1NfQ0FMSUJSQVRFICYmCisJCSAgICBjaGFpbnNbNF0uc3RhdHVzID09IFNVQ0NFU1NfQ0FMSUJSQVRFICYmCisJCSAgICBjaGFpbnNbNV0uc3RhdHVzID09IFNVQ0NFU1NfQ0FMSUJSQVRFICYmCisJCSAgICBjaGFpbnNbNl0uc3RhdHVzID09IFNVQ0NFU1NfQ0FMSUJSQVRFKQorCQkJYnJlYWs7CisKKwkJLyogQXR0ZW50aW9uLCB0aGVyZSBpcyBubyBjaGFpbiAzICovCisJCWZvciAoaSA9IDA7IGkgPCA3OyBpKyspIHsKKwkJCWlmIChpID09IDMpCisJCQkJY29udGludWU7CisJCQlpZiAoY2hhaW5zW2ldLnN0YXR1cyA9PSBORUVEX0NBTElCUkFURSkKKwkJCQljaGFpbl9jYWxpYnJhdGUocHJpdiwgY2hhaW5zLCBpKTsKKwkJfQorCQkvKiBXcml0ZSAweDEgdG8gQ2FsaWJyYXRpb24gTWVhc3VyZSAqLworCQlpb3dyaXRlMzIoKDB4MSksIGN0bCArIEFHTlhfQUNJX01FQVNVUkUpOworCQljYWxpYnJhX2RlbGF5KHByaXYpOworCisJCWZvciAoaSA9IDA7IGkgPCA3OyBpKyspIHsKKwkJCWlmIChpID09IDMpCisJCQkJY29udGludWU7CisKKwkJCWdldF9jYWxpYnJldGVfdmFsdWUocHJpdiwgY2hhaW5zLCBpKTsKKwkJfQorCX0KKwlwcmludGsoUEZYICJDbGlicmF0ZSB0aW1lcyBpcyAlZFxuIiwgaik7CisJcHJpbnRfb2Zmc2V0cyhwcml2KTsKK30gLyogZG9fY2FsaWJyYXRpb24gKi8KKwordm9pZCBhbnRlbm5hX2NhbGlicmF0ZShzdHJ1Y3QgYWdueF9wcml2ICpwcml2KQoreworCXZvaWQgX19pb21lbSAqY3RsID0gcHJpdi0+Y3RsOworCXUzMiByZWc7CisJQUdOWF9UUkFDRTsKKworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX05MSVNUQU5ULCAweDMpOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX05NRUFTQU5ULCAweDMpOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX05BQ1RJQU5ULCAweDMpOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX05DQVBUQU5ULCAweDMpOworCisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfQU5UQ0ZHLCAweDFmKTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9CT0FDVCwgMHgyNCk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfQk9JTkFDVCwgMHgyNCk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfQk9EWU5BLCAweDIwKTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9USEQwQSwgMHg2NCk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfVEhEMEFMLCAweDY0KTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9USEQwQiwgMHg0Nik7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfVEhEMEJURkVTVCwgMHgzYyk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfU0lHSFRILCAweDY0KTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9TSUdMVEgsIDB4MzApOworCisJc3BpX3JjX3dyaXRlKGN0bCwgUkZfQ0hJUDAsIDB4MjApOworCS8qIEZpeG1lICovCisJdWRlbGF5KDgwKTsKKwkvKiAgICAxLiBTaG91bGQgcmVhZCAweDAgICovCisJcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX1NQSV9STFNXKTsKKwlpZiAoMHgwICE9IHJlZykKKwkJcHJpbnRrKEtFUk5fV0FSTklORyBQRlggIlVubWF0Y2hlZCByZiBjaGlwcyByZXN1bHRcbiIpOworCXNwaV9yZl93cml0ZShjdGwsIFJGX0NISVAwfFJGX0NISVAxfFJGX0NISVAyLCAweDEwMDApOworCisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfUlhPVkVSSURFLCAweDApOworCisJc3BpX3JjX3dyaXRlKGN0bCwgUkZfQ0hJUDAsIDB4MjIpOworCXVkZWxheSg4MCk7CisJcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX1NQSV9STFNXKTsKKwlpZiAoMHgwICE9IHJlZykKKwkJcHJpbnRrKEtFUk5fV0FSTklORyBQRlggIlVubWF0Y2hlZCByZiBjaGlwcyByZXN1bHRcbiIpOworCXNwaV9yZl93cml0ZShjdGwsIFJGX0NISVAwfFJGX0NISVAxfFJGX0NISVAyLCAweDEwMDUpOworCisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfUlNUR0NUTCwgMHgxKTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9SU1RHQ1RMLCAweDApOworCisJcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX1BNX1NPRlRSU1QpOworCXJlZyB8PSAweDFjMDAwMDMyOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfUE1fU09GVFJTVCwgcmVnKTsKKwlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfUE1fUExMQ1RMKTsKKwlyZWcgfD0gMHgwMDAzZjA3OworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfUE1fUExMQ1RMLCByZWcpOworCisJcmVnID0gYWdueF9yZWFkMzIoY3RsLCAweGVjNTApOworCXJlZyB8PSAweDQwOworCWFnbnhfd3JpdGUzMihjdGwsIDB4ZWM1MCwgcmVnKTsKKworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1JYT1ZFUklERSwgMHhmZjgpOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX0RJU0NPVk1PRCwgMHgzKTsKKworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX0NIQUlOTlVNLCAweDYpOworCWFnbnhfd3JpdGUzMihjdGwsIDB4MTk4NzQsIDB4MCk7CisJc3BpX3JmX3dyaXRlKGN0bCwgUkZfQ0hJUDB8UkZfQ0hJUDF8UkZfQ0hJUDIsIDB4MTcwMCk7CisKKwkvKiBDYWxpYnJhdGUgdGhlIEJhc2VCYW5kRmlsdGVyICovCisJYmFzZV9iYW5kX2ZpbHRlcl9jYWxpYnJhdGUocHJpdik7CisKKwlzcGlfcmZfd3JpdGUoY3RsLCBSRl9DSElQMHxSRl9DSElQMXxSRl9DSElQMiwgMHgxMDAyKTsKKworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX0dBSU5TRVQwLCAweDFkKTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9HQUlOU0VUMSwgMHgxZCk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfR0FJTlNFVDIsIDB4MWQpOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX0dBSU5TRVRXUklURSwgMHgxKTsKKworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQUNJX01PREUsIDB4MSk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9BQ0lfTEVOLCAweDNmZik7CisKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0FDSV9USU1FUjEsIDB4MjcpOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQUNJX1RJTUVSMiwgMHgyNyk7CisKKwlzcGlfcmZfd3JpdGUoY3RsLCBSRl9DSElQMHxSRl9DSElQMXxSRl9DSElQMiwgMHgxNDAwKTsKKwlzcGlfcmZfd3JpdGUoY3RsLCBSRl9DSElQMHxSRl9DSElQMXxSRl9DSElQMiwgMHgxNTAwKTsKKworCS8qIE1lYXN1cmUgQ2FsaWJyYXRpb24gKi8KKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0FDSV9NRUFTVVJFLCAweDEpOworCWNhbGlicmFfZGVsYXkocHJpdik7CisKKwkvKiBkbyBjYWxpYnJhdGlvbiAqLworCWRvX2NhbGlicmF0aW9uKHByaXYpOworCisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfUlhPVkVSSURFLCAweDApOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQUNJX1RJTUVSMSwgMHgyMSk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9BQ0lfVElNRVIyLCAweDI3KTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0FDSV9MRU4sIDB4Zik7CisKKwlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfR0NSX0dBSU5TRVQwKTsKKwlyZWcgJj0gMHhmOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX0dBSU5TRVQwLCByZWcpOworCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9HQ1JfR0FJTlNFVDEpOworCXJlZyAmPSAweGY7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfR0FJTlNFVDEsIHJlZyk7CisJcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX0dDUl9HQUlOU0VUMik7CisJcmVnICY9IDB4ZjsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9HQUlOU0VUMiwgcmVnKTsKKworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX0dBSU5TRVRXUklURSwgMHgwKTsKKwlkaXNhYmxlX3JlY2VpdmVyKHByaXYpOworfSAvKiBhbnRlbm5hX2NhbGlicmF0ZSAqLworCit2b2lkIF9fYW50ZW5uYV9jYWxpYnJhdGUoc3RydWN0IGFnbnhfcHJpdiAqcHJpdikKK3sKKwl2b2lkIF9faW9tZW0gKmN0bCA9IHByaXYtPmN0bDsKKwl1MzIgcmVnOworCisJLyogQ2FsaWJyYXRlIHRoZSBCYXNlQmFuZEZpbHRlciAqLworCS8qIGJhc2VfYmFuZF9maWx0ZXJfY2FsaWJyYXRlKHByaXYpOyAqLworCXNwaV9yZl93cml0ZShjdGwsIFJGX0NISVAwfFJGX0NISVAxfFJGX0NISVAyLCAweDEwMDIpOworCisKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9HQUlOU0VUMCwgMHgxZCk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfR0FJTlNFVDEsIDB4MWQpOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX0dBSU5TRVQyLCAweDFkKTsKKworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX0dBSU5TRVRXUklURSwgMHgxKTsKKworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQUNJX01PREUsIDB4MSk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9BQ0lfTEVOLCAweDNmZik7CisKKworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQUNJX1RJTUVSMSwgMHgyNyk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9BQ0lfVElNRVIyLCAweDI3KTsKKwlzcGlfcmZfd3JpdGUoY3RsLCBSRl9DSElQMHxSRl9DSElQMXxSRl9DSElQMiwgMHgxNDAwKTsKKwlzcGlfcmZfd3JpdGUoY3RsLCBSRl9DSElQMHxSRl9DSElQMXxSRl9DSElQMiwgMHgxNTAwKTsKKwkvKiBNZWFzdXJlIENhbGlicmF0aW9uICovCisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9BQ0lfTUVBU1VSRSwgMHgxKTsKKwljYWxpYnJhX2RlbGF5KHByaXYpOworCWRvX2NhbGlicmF0aW9uKHByaXYpOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1JYT1ZFUklERSwgMHgwKTsKKworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQUNJX1RJTUVSMSwgMHgyMSk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9BQ0lfVElNRVIyLCAweDI3KTsKKworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQUNJX0xFTiwgMHhmKTsKKworCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9HQ1JfR0FJTlNFVDApOworCXJlZyAmPSAweGY7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfR0FJTlNFVDAsIHJlZyk7CisJcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX0dDUl9HQUlOU0VUMSk7CisJcmVnICY9IDB4ZjsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9HQUlOU0VUMSwgcmVnKTsKKwlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfR0NSX0dBSU5TRVQyKTsKKwlyZWcgJj0gMHhmOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX0dBSU5TRVQyLCByZWcpOworCisKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9HQUlOU0VUV1JJVEUsIDB4MCk7CisKKwkvKiBXcml0ZSAweDMgR2FpbiBDb250cm9sIERpc2NvdmVyeSBNb2RlICovCisJZW5hYmxlX3JlY2VpdmVyKHByaXYpOworfQorCitpbnQgYWdueF9zZXRfY2hhbm5lbChzdHJ1Y3QgYWdueF9wcml2ICpwcml2LCB1bnNpZ25lZCBpbnQgY2hhbm5lbCkKK3sKKwlBR05YX1RSQUNFOworCisJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQ2hhbm5lbCBpcyAlZCAlc1xuIiwgY2hhbm5lbCwgX19mdW5jX18pOworCXJhZGlvX2NoYW5uZWxfc2V0KHByaXYsIGNoYW5uZWwpOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2Fnbngvc3RhLmMgYi9kcml2ZXJzL3N0YWdpbmcvYWdueC9zdGEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kM2FjNjc1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2Fnbngvc3RhLmMKQEAgLTAsMCArMSwyMTkgQEAKKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSAicGh5LmgiCisjaW5jbHVkZSAic3RhLmgiCisjaW5jbHVkZSAiZGVidWcuaCIKKwordm9pZCBoYXNoX3JlYWQoc3RydWN0IGFnbnhfcHJpdiAqcHJpdiwgdTMyIHJlZ2hpLCB1MzIgcmVnbG8sIHU4IHN0YV9pZCkKK3sKKwl2b2lkIF9faW9tZW0gKmN0bCA9IHByaXYtPmN0bDsKKworCXJlZ2xvICY9IDB4RkZGRjsKKwlyZWdsbyB8PSAweDMwMDAwMDAwOworCXJlZ2xvIHw9IDB4NDAwMDAwMDA7CS8qIFNldCBzdGF0dXMgYnVzeSAqLworCXJlZ2xvIHw9IHN0YV9pZCA8PCAxNjsKKworCWlvd3JpdGUzMigwLCBjdGwgKyBBR05YX1JYTV9IQVNIX0NNRF9GTEFHKTsKKwlpb3dyaXRlMzIocmVnaGksIGN0bCArIEFHTlhfUlhNX0hBU0hfQ01EX0hJR0gpOworCWlvd3JpdGUzMihyZWdsbywgY3RsICsgQUdOWF9SWE1fSEFTSF9DTURfTE9XKTsKKworCXJlZ2hpID0gaW9yZWFkMzIoY3RsICsgQUdOWF9SWE1fSEFTSF9DTURfSElHSCk7CisgICAgICAgIHJlZ2xvID0gaW9yZWFkMzIoY3RsICsgQUdOWF9SWE1fSEFTSF9DTURfTE9XKTsKKwlwcmludGsoUEZYICJSWCBoYXNoIGNtZCBhcmUgOiAlLjh4JS44eFxuIiwgcmVnaGksIHJlZ2xvKTsKK30KKwordm9pZCBoYXNoX3dyaXRlKHN0cnVjdCBhZ254X3ByaXYgKnByaXYsIHU4ICptYWNfYWRkciwgdTggc3RhX2lkKQoreworCXZvaWQgX19pb21lbSAqY3RsID0gcHJpdi0+Y3RsOworCXUzMiByZWdoaSwgcmVnbG87CisKKwlpZiAoIWlzX3ZhbGlkX2V0aGVyX2FkZHIobWFjX2FkZHIpKQorCQlwcmludGsoS0VSTl9XQVJOSU5HIFBGWCAiVXBkYXRlIGhhc2ggdGFibGU6IEludmFsaWQgaHdhZGRyIVxuIik7CisKKwlyZWdoaSA9IG1hY19hZGRyWzBdIDw8IDI0IHwgbWFjX2FkZHJbMV0gPDwgMTYgfCBtYWNfYWRkclsyXSA8PCA4IHwgbWFjX2FkZHJbM107CisJcmVnbG8gPSBtYWNfYWRkcls0XSA8PCA4IHwgbWFjX2FkZHJbNV07CisJcmVnbG8gfD0gMHgxMDAwMDAwMDsJLyogU2V0IGhhc2ggY29tbW1hbmQgKi8KKwlyZWdsbyB8PSAweDQwMDAwMDAwOwkvKiBTZXQgc3RhdHVzIGJ1c3kgKi8KKwlyZWdsbyB8PSBzdGFfaWQgPDwgMTY7CisKKwlpb3dyaXRlMzIoMCwgY3RsICsgQUdOWF9SWE1fSEFTSF9DTURfRkxBRyk7CisJaW93cml0ZTMyKHJlZ2hpLCBjdGwgKyBBR05YX1JYTV9IQVNIX0NNRF9ISUdIKTsKKwlpb3dyaXRlMzIocmVnbG8sIGN0bCArIEFHTlhfUlhNX0hBU0hfQ01EX0xPVyk7CisKKyAgICAgICAgcmVnbG8gPSBpb3JlYWQzMihjdGwgKyBBR05YX1JYTV9IQVNIX0NNRF9MT1cpOworCWlmICghKHJlZ2xvICYgMHg4MDAwMDAwMCkpCisJCXByaW50ayhLRVJOX1dBUk5JTkcgUEZYICJVcGRhdGUgaGFzaCB0YWJsZSBmYWlsZWRcbiIpOworfQorCit2b2lkIGhhc2hfZGVsZXRlKHN0cnVjdCBhZ254X3ByaXYgKnByaXYsIHUzMiByZWdoaSwgdTMyIHJlZ2xvLCB1OCBzdGFfaWQpCit7CisJdm9pZCBfX2lvbWVtICpjdGwgPSBwcml2LT5jdGw7CisKKwlyZWdsbyAmPSAweEZGRkY7CisJcmVnbG8gfD0gMHgyMDAwMDAwMDsKKwlyZWdsbyB8PSAweDQwMDAwMDAwOwkvKiBTZXQgc3RhdHVzIGJ1c3kgKi8KKwlyZWdsbyB8PSBzdGFfaWQgPDwgMTY7CisKKwlpb3dyaXRlMzIoMCwgY3RsICsgQUdOWF9SWE1fSEFTSF9DTURfRkxBRyk7CisJaW93cml0ZTMyKHJlZ2hpLCBjdGwgKyBBR05YX1JYTV9IQVNIX0NNRF9ISUdIKTsKKwlpb3dyaXRlMzIocmVnbG8sIGN0bCArIEFHTlhfUlhNX0hBU0hfQ01EX0xPVyk7CisJcmVnaGkgPSBpb3JlYWQzMihjdGwgKyBBR05YX1JYTV9IQVNIX0NNRF9ISUdIKTsKKworICAgICAgICByZWdsbyA9IGlvcmVhZDMyKGN0bCArIEFHTlhfUlhNX0hBU0hfQ01EX0xPVyk7CisJcHJpbnRrKFBGWCAiUlggaGFzaCBjbWQgYXJlIDogJS44eCUuOHhcbiIsIHJlZ2hpLCByZWdsbyk7CisKK30KKwordm9pZCBoYXNoX2R1bXAoc3RydWN0IGFnbnhfcHJpdiAqcHJpdiwgdTggc3RhX2lkKQoreworCXZvaWQgX19pb21lbSAqY3RsID0gcHJpdi0+Y3RsOworCXUzMiByZWdoaSwgcmVnbG87CisKKwlyZWdsbyA9IDB4MDsJCS8qIGR1bXAgY29tbWFuZCAqLworCXJlZ2xvfD0gMHg0MDAwMDAwMDsgIAkvKiBzdGF0dXMgYml0ICovCisJaW93cml0ZTMyKHJlZ2xvLCBjdGwgKyBBR05YX1JYTV9IQVNIX0NNRF9MT1cpOworCWlvd3JpdGUzMihzdGFfaWQgPDwgMTYsIGN0bCArIEFHTlhfUlhNX0hBU0hfRFVNUF9EQVRBKTsKKworCXVkZWxheSg4MCk7CisKKwlyZWdoaSA9IGlvcmVhZDMyKGN0bCArIEFHTlhfUlhNX0hBU0hfQ01EX0hJR0gpOworICAgICAgICByZWdsbyA9IGlvcmVhZDMyKGN0bCArIEFHTlhfUlhNX0hBU0hfQ01EX0xPVyk7CisJcHJpbnRrKFBGWCAiaGFzaCBjbWQgYXJlIDogJS44eCUuOHhcbiIsIHJlZ2hpLCByZWdsbyk7CisJcmVnaGkgPSBpb3JlYWQzMihjdGwgKyBBR05YX1JYTV9IQVNIX0NNRF9GTEFHKTsKKwlwcmludGsoUEZYICJoYXNoIGZsYWcgaXMgOiAlLjh4XG4iLCByZWdoaSk7CisJcmVnaGkgPSBpb3JlYWQzMihjdGwgKyBBR05YX1JYTV9IQVNIX0RVTVBfTVNUKTsKKwlyZWdsbyA9IGlvcmVhZDMyKGN0bCArIEFHTlhfUlhNX0hBU0hfRFVNUF9MU1QpOworCXByaW50ayhQRlggImhhc2ggZHVtcCBtc3QgbHN0OiAlLjh4JS44eFxuIiwgcmVnaGksIHJlZ2xvKTsKKwlyZWdoaSA9IGlvcmVhZDMyKGN0bCArIEFHTlhfUlhNX0hBU0hfRFVNUF9EQVRBKTsKKwlwcmludGsoUEZYICJoYXNoIGR1bXAgZGF0YTogJS44eFxuIiwgcmVnaGkpOworfQorCit2b2lkIGdldF9zdGFfcG93ZXIoc3RydWN0IGFnbnhfcHJpdiAqcHJpdiwgc3RydWN0IGFnbnhfc3RhX3Bvd2VyICpwb3dlciwgdW5zaWduZWQgaW50IHN0YV9pZHgpCit7CisJdm9pZCBfX2lvbWVtICpjdGwgPSBwcml2LT5jdGw7CisgICAgICAgIG1lbWNweV9mcm9taW8ocG93ZXIsIGN0bCArIEFHTlhfVFhNX1NUQVBPV1RFTVAgKyBzaXplb2YoKnBvd2VyKSAqIHN0YV9pZHgsCisJCSAgICAgIHNpemVvZigqcG93ZXIpKTsKK30KKworaW5saW5lIHZvaWQKK3NldF9zdGFfcG93ZXIoc3RydWN0IGFnbnhfcHJpdiAqcHJpdiwgc3RydWN0IGFnbnhfc3RhX3Bvd2VyICpwb3dlciwgdW5zaWduZWQgaW50IHN0YV9pZHgpCit7CisJdm9pZCBfX2lvbWVtICpjdGwgPSBwcml2LT5jdGw7CisJLyogRklYTUUgICAyLiBXcml0ZSBUZW1wbGF0ZSB0byBvZmZzZXQgKyBzdGF0aW9uIG51bWJlciAgKi8KKyAgICAgICAgbWVtY3B5X3RvaW8oY3RsICsgQUdOWF9UWE1fU1RBUE9XVEVNUCArIHNpemVvZigqcG93ZXIpICogc3RhX2lkeCwKKwkJICAgIHBvd2VyLCBzaXplb2YoKnBvd2VyKSk7Cit9CisKKwordm9pZCBnZXRfc3RhX3R4X3dxKHN0cnVjdCBhZ254X3ByaXYgKnByaXYsIHN0cnVjdCBhZ254X3N0YV90eF93cSAqdHhfd3EsCisJCSAgIHVuc2lnbmVkIGludCBzdGFfaWR4LCB1bnNpZ25lZCBpbnQgd3FfaWR4KQoreworCXZvaWQgX19pb21lbSAqZGF0YSA9IHByaXYtPmRhdGE7CisJbWVtY3B5X2Zyb21pbyh0eF93cSwgZGF0YSArIEFHTlhfUERVX1RYX1dRICsgc2l6ZW9mKCp0eF93cSkgKiBTVEFfVFhfV1FfTlVNICogc3RhX2lkeCArCisJCSAgICAgIHNpemVvZigqdHhfd3EpICogd3FfaWR4LCAgc2l6ZW9mKCp0eF93cSkpOworCit9CisKK2lubGluZSB2b2lkIHNldF9zdGFfdHhfd3Eoc3RydWN0IGFnbnhfcHJpdiAqcHJpdiwgc3RydWN0IGFnbnhfc3RhX3R4X3dxICp0eF93cSwKKwkJICAgdW5zaWduZWQgaW50IHN0YV9pZHgsIHVuc2lnbmVkIGludCB3cV9pZHgpCit7CisJdm9pZCBfX2lvbWVtICpkYXRhID0gcHJpdi0+ZGF0YTsKKwltZW1jcHlfdG9pbyhkYXRhICsgQUdOWF9QRFVfVFhfV1EgKyBzaXplb2YoKnR4X3dxKSAqIFNUQV9UWF9XUV9OVU0gKiBzdGFfaWR4ICsKKwkJICAgIHNpemVvZigqdHhfd3EpICogd3FfaWR4LCB0eF93cSwgc2l6ZW9mKCp0eF93cSkpOworfQorCisKK3ZvaWQgZ2V0X3N0YShzdHJ1Y3QgYWdueF9wcml2ICpwcml2LCBzdHJ1Y3QgYWdueF9zdGEgKnN0YSwgdW5zaWduZWQgaW50IHN0YV9pZHgpCit7CisJdm9pZCBfX2lvbWVtICpkYXRhID0gcHJpdi0+ZGF0YTsKKworCW1lbWNweV9mcm9taW8oc3RhLCBkYXRhICsgQUdOWF9QRFVQT09MICsgc2l6ZW9mKCpzdGEpICogc3RhX2lkeCwKKwkJICAgICAgc2l6ZW9mKCpzdGEpKTsKK30KKworaW5saW5lIHZvaWQgc2V0X3N0YShzdHJ1Y3QgYWdueF9wcml2ICpwcml2LCBzdHJ1Y3QgYWdueF9zdGEgKnN0YSwgdW5zaWduZWQgaW50IHN0YV9pZHgpCit7CisJdm9pZCBfX2lvbWVtICpkYXRhID0gcHJpdi0+ZGF0YTsKKworICAgICAgICBtZW1jcHlfdG9pbyhkYXRhICsgQUdOWF9QRFVQT09MICsgc2l6ZW9mKCpzdGEpICogc3RhX2lkeCwKKwkJICAgIHN0YSwgc2l6ZW9mKCpzdGEpKTsKK30KKworLyogRklYTUUgKi8KK3ZvaWQgc3RhX3Bvd2VyX2luaXQoc3RydWN0IGFnbnhfcHJpdiAqcHJpdiwgdW5zaWduZWQgaW50IHN0YV9pZHgpCit7CisJc3RydWN0IGFnbnhfc3RhX3Bvd2VyIHBvd2VyOworCXUzMiByZWc7CisJQUdOWF9UUkFDRTsKKworCW1lbXNldCgmcG93ZXIsIDAsIHNpemVvZihwb3dlcikpOworCXJlZyA9IGFnbnhfc2V0X2JpdHMoRURDRiwgRURDRl9TSElGVCwgMHgxKTsKKwlwb3dlci5yZWcgPSBjcHVfdG9fbGUzMihyZWcpOworCXNldF9zdGFfcG93ZXIocHJpdiwgJnBvd2VyLCBzdGFfaWR4KTsKKwl1ZGVsYXkoNDApOworfSAvKiBhZGRfcG93ZXJfdGVtcGxhdGUgKi8KKworCisvKiBAbnVtOiBUaGUgI251bWJlciBvZiBzdGF0aW9uIHRoYXQgaXMgdmlzaWJsZSB0byB0aGUgY2FyZCAqLworc3RhdGljIHZvaWQgc3RhX3R4X3dvcmtxdWV1ZV9pbml0KHN0cnVjdCBhZ254X3ByaXYgKnByaXYsIHVuc2lnbmVkIGludCBzdGFfaWR4KQoreworCXN0cnVjdCBhZ254X3N0YV90eF93cSB0eF93cTsKKwl1MzIgcmVnOworCXVuc2lnbmVkIGludCBpOworCisJbWVtc2V0KCZ0eF93cSwgMCwgc2l6ZW9mKHR4X3dxKSk7CisKKwlyZWcgPSBhZ254X3NldF9iaXRzKFdPUktfUVVFVUVfVkFMSUQsIFdPUktfUVVFVUVfVkFMSURfU0hJRlQsIDEpOworCXJlZyB8PSBhZ254X3NldF9iaXRzKFdPUktfUVVFVUVfQUNLX1RZUEUsIFdPUktfUVVFVUVfQUNLX1RZUEVfU0hJRlQsIDEpOworLy8JcmVnIHw9IGFnbnhfc2V0X2JpdHMoV09SS19RVUVVRV9BQ0tfVFlQRSwgV09SS19RVUVVRV9BQ0tfVFlQRV9TSElGVCwgMCk7CisJdHhfd3EucmVnMiB8PSBjcHVfdG9fbGUzMihyZWcpOworCisJLyogU3VwcG9zZSBhbGwgOCB0cmFmZmljIGNsYXNzIGFyZSB1c2VkICovCisJZm9yIChpID0gMDsgaSA8IFNUQV9UWF9XUV9OVU07IGkrKykKKwkJc2V0X3N0YV90eF93cShwcml2LCAmdHhfd3EsIHN0YV9pZHgsIGkpOworfSAvKiBzdGFfdHhfd29ya3F1ZXVlX2luaXQgKi8KKworCitzdGF0aWMgdm9pZCBzdGFfdHJhZmZpY19pbml0KHN0cnVjdCBhZ254X3N0YV90cmFmZmljICp0cmFmZmljKQoreworCXUzMiByZWc7CisJbWVtc2V0KHRyYWZmaWMsIDAsIHNpemVvZigqdHJhZmZpYykpOworCisJcmVnID0gYWdueF9zZXRfYml0cyhORVdfUEFDS0VULCBORVdfUEFDS0VUX1NISUZULCAxKTsKKwlyZWcgfD0gYWdueF9zZXRfYml0cyhUUkFGRklDX1ZBTElELCBUUkFGRklDX1ZBTElEX1NISUZULCAxKTsKKy8vCXJlZyB8PSBhZ254X3NldF9iaXRzKFRSQUZGSUNfQUNLX1RZUEUsIFRSQUZGSUNfQUNLX1RZUEVfU0hJRlQsIDEpOworCXRyYWZmaWMtPnJlZzAgPSBjcHVfdG9fbGUzMihyZWcpOworCisJLyogCTMuIHNldHRpbmcgUlggU2VxdWVuY2UgTnVtYmVyIHRvIDQwOTUgKi8KKwlyZWcgPSBhZ254X3NldF9iaXRzKFJYX1NFUVVFTkNFX05VTSwgUlhfU0VRVUVOQ0VfTlVNX1NISUZULCA0MDk1KTsKKwl0cmFmZmljLT5yZWcxID0gY3B1X3RvX2xlMzIocmVnKTsKK30KKworCisvKiBAbnVtOiBUaGUgI251bWJlciBvZiBzdGF0aW9uIHRoYXQgaXMgdmlzaWJsZSB0byB0aGUgY2FyZCAqLwordm9pZCBzdGFfaW5pdChzdHJ1Y3QgYWdueF9wcml2ICpwcml2LCB1bnNpZ25lZCBpbnQgc3RhX2lkeCkKK3sKKwkvKiBGSVhNRSB0aGUgbGVuZ3RoIG9mIHN0YSBpcyAyNTYgYnl0ZXMgSXMgdGhhdAorCSAqIGRhbmdlcm91cyB0byBzdGFjayBvdmVyZmxvdz8gKi8KKwlzdHJ1Y3QgYWdueF9zdGEgc3RhOworCXUzMiByZWc7CisJaW50IGk7CisKKwltZW1zZXQoJnN0YSwgMCwgc2l6ZW9mKHN0YSkpOworCS8qIFNldCB2YWxpZCB0byAxICovCisJcmVnID0gYWdueF9zZXRfYml0cyhTVEFUSU9OX1ZBTElELCBTVEFUSU9OX1ZBTElEX1NISUZULCAxKTsKKwkvKiBTZXQgRW5hYmxlIENvbmNhdGVuYXRpb24gdG8gMCAoPykgKi8KKwlyZWcgfD0gYWdueF9zZXRfYml0cyhFTkFCTEVfQ09OQ0FURU5BVElPTiwgRU5BQkxFX0NPTkNBVEVOQVRJT05fU0hJRlQsIDApOworCS8qIFNldCBFbmFibGUgRGVjb21wcmVzc2lvbiB0byAwICg/KSAqLworCXJlZyB8PSBhZ254X3NldF9iaXRzKEVOQUJMRV9ERUNPTVBSRVNTSU9OLCBFTkFCTEVfREVDT01QUkVTU0lPTl9TSElGVCwgMCk7CisJc3RhLnJlZyA9IGNwdV90b19sZTMyKHJlZyk7CisKKwkvKiBJbml0aWFsaXplIGVhY2ggb2YgdGhlIFRyYWZmaWMgQ2xhc3MgU3RydWN0dXJlcyBieTogKi8KKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorCQlzdGFfdHJhZmZpY19pbml0KHN0YS50cmFmZmljICsgaSk7CisKKwlzZXRfc3RhKHByaXYsICZzdGEsIHN0YV9pZHgpOworCXN0YV90eF93b3JrcXVldWVfaW5pdChwcml2LCBzdGFfaWR4KTsKK30gLyogc3RhX2Rlc2NyaXB0b3JfaW5pdCAqLworCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hZ254L3N0YS5oIGIvZHJpdmVycy9zdGFnaW5nL2Fnbngvc3RhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNThkMGIxMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9hZ254L3N0YS5oCkBAIC0wLDAgKzEsMjIyIEBACisjaWZuZGVmIEFHTlhfU1RBX0hfCisjZGVmaW5lIEFHTlhfU1RBX0hfCisKKyNkZWZpbmUgU1RBX1RYX1dRX05VTQk4CS8qIFRoZSBudW1iZXIgb2YgVFggd29ya3F1ZXVlIG9uZSBTVEEgaGFzICovCisKK3N0cnVjdCBhZ254X2hhc2hfY21kIHsKKwlfX2JlMzIgY21kaGk7CisjZGVmaW5lIE1BQ0xPCQkweEZGRkYwMDAwCisjZGVmaW5lIE1BQ0xPX1NISUZUCTE2CisjZGVmaW5lIFNUQV9JRAkJMHgwMDAwRkZGMAorI2RlZmluZSBTVEFfSURfU0hJRlQJNAorI2RlZmluZSBDTUQJCTB4MDAwMDAwMEMKKyNkZWZpbmUgQ01EX1NISUZUCTIKKyNkZWZpbmUgU1RBVFVTCQkweDAwMDAwMDAyCisjZGVmaW5lIFNUQVRVU19TSElGVAkxCisjZGVmaW5lIFBBU1MJCTB4MDAwMDAwMDEKKyNkZWZpbmUgUEFTU19TSElGVAkxCisJX19iZTMyIGNtZGxvOworfV9fYXR0cmlidXRlX18oKF9fcGFja2VkX18pKTsKKworCisvKgorICogU3RhdGlvbiBQb3dlciBUZW1wbGF0ZQorICogRklYTUUgSnVzdCBmb3IgYWduMTAwIHlldAorICovCitzdHJ1Y3QgYWdueF9zdGFfcG93ZXIgeworCV9fbGUzMiByZWc7CisjZGVmaW5lIFNJR05BTAkJCTB4MDAwMDAwRkYgLyogc2lnbmFsICovCisjZGVmaW5lIFNJR05BTF9TSElGVAkJMAorI2RlZmluZSBSQVRFCQkJMHgwMDAwMEYwMAorI2RlZmluZSBSQVRFX1NISUZUCQk4CisjZGVmaW5lIFRJRlMJCQkweDAwMDAxMDAwCisjZGVmaW5lIFRJRlNfU0hJRlQJCTEyCisjZGVmaW5lIEVEQ0YJCQkweDAwMDAyMDAwCisjZGVmaW5lIEVEQ0ZfU0hJRlQJCTEzCisjZGVmaW5lIENIQU5ORUxfQk9ORAkJMHgwMDAwNDAwMAorI2RlZmluZSBDSEFOTkVMX0JPTkRfU0hJRlQJMTQKKyNkZWZpbmUgUEhZX01PREUJCTB4MDAwMzgwMDAKKyNkZWZpbmUgUEhZX01PREVfU0hJRlQJCTE1CisjZGVmaW5lIFBPV0VSX0xFVkVMCQkweDAwN0MwMDAwCisjZGVmaW5lIFBPV0VSX0xFVkVMX1NISUZUCTE4CisjZGVmaW5lIE5VTV9UUkFOU01JVFRFUlMJMHgwMDgwMDAwMAorI2RlZmluZSBOVU1fVFJBTlNNSVRURVJTX1NISUZUCTIzCit9IF9fYXR0cmlidXRlX18oKF9fcGFja2VkX18pKTsKKworLyoKKyAqIFRYIFdvcmtxdWV1ZSBEZXNjcmlwdG9yCisgKi8KK3N0cnVjdCBhZ254X3N0YV90eF93cSB7CisJX19sZTMyIHJlZzA7CisjZGVmaW5lIEhFQURfUE9JTlRFUl9MT1cJMHhGRjAwMDAwMCAvKiBIZWFkIHBvaW50ZXIgbG93ICovCisjZGVmaW5lIEhFQURfUE9JTlRFUl9MT1dfU0hJRlQJMjQKKyNkZWZpbmUgVEFJTF9QT0lOVEVSCQkweDAwRkZGRkZGIC8qIFRhaWwgcG9pbnRlciAqLworI2RlZmluZSBUQUlMX1BPSU5URVJfU0hJRlQJMAorCisJX19sZTMyIHJlZzM7CisjZGVmaW5lIEFDS19QT0lOVEVSX0xPVwkgICAgICAgIDB4RkZGRjAwMDAJLyogQUNLIHBvaW50ZXIgbG93ICovCisjZGVmaW5lIEFDS19QT0lOVEVSX0xPV19TSElGVAkxNgorI2RlZmluZSBIRUFEX1BPSU5URVJfSElHSAkweDAwMDBGRkZGCS8qIEhlYWQgcG9pbnRlciBoaWdoICovCisjZGVmaW5lIEhFQURfUE9JTlRFUl9ISUdIX1NISUZUCTAKKworCV9fbGUzMiByZWcxOworLyogQUNLIHRpbWVvdXQgdGFpbCBwYWNrZXQgY291bnQgKi8KKyNkZWZpbmUgQUNLX1RJTU9VVF9UQUlMX1BBQ0tfQ05UCTB4RkZGMDAwMDAKKyNkZWZpbmUgQUNLX1RJTU9VVF9UQUlMX1BBQ0tfQ05UX1NISUZUCTIwCisvKiBIZWFkIHRpbWVvdXQgdGFpbCBwYWNrZXQgY291bnQgKi8KKyNkZWZpbmUgSEVBRF9USU1PVVRfVEFJTF9QQUNLX0NOVAkweDAwMEZGRjAwCisjZGVmaW5lIEhFQURfVElNT1VUX1RBSUxfUEFDS19DTlRfU0hJRlQJOAorI2RlZmluZSBBQ0tfUE9JTlRFUl9ISUdICSAgICAgICAgMHgwMDAwMDBGRiAvKiBBQ0sgcG9pbnRlciBoaWdoICovCisjZGVmaW5lIEFDS19QT0lOVEVSX0hJR0hfU0hJRlQJCTAKKworCV9fbGUzMiByZWcyOworI2RlZmluZSBXT1JLX1FVRVVFX1ZBTElECQkweDgwMDAwMDAwIC8qIHZhbGlkICovCisjZGVmaW5lIFdPUktfUVVFVUVfVkFMSURfU0hJRlQJCTMxCisjZGVmaW5lIFdPUktfUVVFVUVfQUNLX1RZUEUJCTB4NDAwMDAwMDAgLyogQUNLIHR5cGUgKi8KKyNkZWZpbmUgV09SS19RVUVVRV9BQ0tfVFlQRV9TSElGVAkzMAorLyogSGVhZCB0aW1lb3V0IHdpbmRvdyBsaW1pdCBmcmFnbWVudGF0aW9uIGNvdW50ICovCisjZGVmaW5lIEhFQURfVElNT1VUX1dJTl9MSU1fRlJBR19DTlQJMHgzRkZGMDAwMAorI2RlZmluZSBIRUFEX1RJTU9VVF9XSU5fTElNX0ZSQUdfQ05UX1NISUZUCTE2CisvKiBIZWFkIHRpbWVvdXQgd2luZG93IGxpbWl0IGJ5dGUgY291bnQgKi8KKyNkZWZpbmUgSEVBRF9USU1PVVRfV0lOX0xJTV9CWVRFX0NOVAkweDAwMDBGRkZGCisjZGVmaW5lIEhFQURfVElNT1VUX1dJTl9MSU1fQllURV9DTlRfU0hJRlQJIDAKK30gX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXykpOworCisKKy8qCisgKiBUcmFmZmljIENsYXNzIFN0cnVjdHVyZQorICovCitzdHJ1Y3QgYWdueF9zdGFfdHJhZmZpYyB7CisJX19sZTMyIHJlZzA7CisjZGVmaW5lIEFDS19USU1PVVRfQ05UCQkweEZGODAwMDAwIC8qIEFDSyBUaW1lb3V0IENvdW50cyAqLworI2RlZmluZSBBQ0tfVElNT1VUX0NOVF9TSElGVAkyMworI2RlZmluZSBUUkFGRklDX0FDS19UWVBFCTB4MDA2MDAwMDAgLyogQUNLIFR5cGUgKi8KKyNkZWZpbmUgVFJBRkZJQ19BQ0tfVFlQRV9TSElGVAkyMQorI2RlZmluZSBORVdfUEFDS0VUCQkweDAwMTAwMDAwIC8qIE5ldyBQYWNrZXQgICovCisjZGVmaW5lIE5FV19QQUNLRVRfU0hJRlQJMjAKKyNkZWZpbmUgVFJBRkZJQ19WQUxJRAkJMHgwMDA4MDAwMCAvKiBWYWxpZCAqLworI2RlZmluZSBUUkFGRklDX1ZBTElEX1NISUZUCTE5CisjZGVmaW5lIFJYX0hEUl9ERVNDX1BPSU5URVIJMHgwMDA3RkZGRiAvKiBSWCBIZWFkZXIgRGVzY3JpcHRlciBwb2ludGVyICovCisjZGVmaW5lIFJYX0hEUl9ERVNDX1BPSU5URVJfU0hJRlQJIDAKKworCV9fbGUzMiByZWcxOworI2RlZmluZSBSWF9QQUNLRVRfVElNRVNUQU1QCTB4RkZGRjAwMDAgLyogUlggUGFja2V0IFRpbWVzdGFtcCAqLworI2RlZmluZSBSWF9QQUNLRVRfVElNRVNUQU1QX1NISUZUCTE2CisjZGVmaW5lIFRSQUZGSUNfUkVTRVJWRUQJMHgwMDAwRTAwMCAvKiBSZXNlcnZlZCAqLworI2RlZmluZSBUUkFGRklDX1JFU0VSVkVEX1NISUZUICAxMworI2RlZmluZSBTVgkJCTB4MDAwMDEwMDAgLyogc3YgKi8KKyNkZWZpbmUgU1ZfU0hJRlQJCTEyCisjZGVmaW5lIFJYX1NFUVVFTkNFX05VTQkJMHgwMDAwMEZGRiAvKiBSWCBTZXF1ZW5jZSBOdW1iZXIgKi8KKyNkZWZpbmUgUlhfU0VRVUVOQ0VfTlVNX1NISUZUCTAKKworCV9fbGUzMiB0eF9yZXBsYXlfY250X2xvdzsgLyogVFggUmVwbGF5IENvdW50ZXIgTG93ICovCisKKwlfX2xlMTYgdHhfcmVwbGF5X2NudF9oaWdoOyAvKiBUWCBSZXBsYXkgQ291bnRlciBIaWdoICovCisJX19sZTE2IHJ4X3JlcGxheV9jbnRfaGlnaDsgLyogUlggUmVwbGF5IENvdW50ZXIgSGlnaCAqLworCisJX19iZTMyIHJ4X3JlcGxheV9jbnRfbG93OyAvKiBSWCBSZXBsYXkgQ291bnRlciBMb3cgKi8KK30gX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXykpOworCisvKgorICogU3RhdGlvbiBEZXNjcmlwdG9ycworICovCitzdHJ1Y3QgYWdueF9zdGEgeworCV9fbGUzMiB0eF9zZXNzaW9uX2tleXNbNF07IC8qIFRyYW5zbWl0IFNlc3Npb24gS2V5ICgwLTMpICovCisJX19sZTMyIHJ4X3Nlc3Npb25fa2V5c1s0XTsgLyogUmVjZWl2ZSBTZXNzaW9uIEtleSAoMC0zKSAqLworCisJX19sZTMyIHJlZzsKKyNkZWZpbmUgSURfMQkJCTB4QzAwMDAwMDAgLyogaWQgMSAqLworI2RlZmluZSBJRF8xX1NISUZUCQkzMAorI2RlZmluZSBJRF8wCQkJMHgzMDAwMDAwMCAvKiBpZCAwICovCisjZGVmaW5lIElEXzBfU0hJRlQJCTI4CisjZGVmaW5lIEVOQUJMRV9DT05DQVRFTkFUSU9OCTB4MEZGMDAwMDAgLyogRW5hYmxlIGNvbmNhdGVuYXRpb24gKi8KKyNkZWZpbmUgRU5BQkxFX0NPTkNBVEVOQVRJT05fU0hJRlQJMjAKKyNkZWZpbmUgRU5BQkxFX0RFQ09NUFJFU1NJT04JMHgwMDBGRjAwMCAvKiBFbmFibGUgZGVjb21wcmVzc2lvbiAqLworI2RlZmluZSBFTkFCTEVfREVDT01QUkVTU0lPTl9TSElGVAkxMgorI2RlZmluZSBTVEFfUkVTRVJWRUQJCTB4MDAwMDBDMDAgLyogUmVzZXJ2ZWQgKi8KKyNkZWZpbmUgU1RBX1JFU0VSVkVEX1NISUZUCTEwCisjZGVmaW5lIEVBUAkJCTB4MDAwMDAyMDAgLyogRUFQICovCisjZGVmaW5lIEVBUF9TSElGVAkJOQorI2RlZmluZSBFRF9OVUxMCQkJMHgwMDAwMDEwMCAvKiBFRCBOVUxMICovCisjZGVmaW5lIEVEX05VTExfU0hJRlQJCTgKKyNkZWZpbmUgRU5DUllQVElPTl9QT0xJQ1kJMHgwMDAwMDBFMCAvKiBFbmNyeXB0aW9uIFBvbGljeSAqLworI2RlZmluZSBFTkNSWVBUSU9OX1BPTElDWV9TSElGVCA1CisjZGVmaW5lIERFRklORURfS0VZX0lECQkweDAwMDAwMDE4IC8qIERlZmluZWQgS2V5IElEICovCisjZGVmaW5lIERFRklORURfS0VZX0lEX1NISUZUCTMKKyNkZWZpbmUgRklYRURfS0VZCQkweDAwMDAwMDA0IC8qIEZpeGVkIEtleSAqLworI2RlZmluZSBGSVhFRF9LRVlfU0hJRlQJCTIKKyNkZWZpbmUgS0VZX1ZBTElECQkweDAwMDAwMDAyIC8qIEtleSBWYWxpZCAqLworI2RlZmluZSBLRVlfVkFMSURfU0hJRlQJCTEKKyNkZWZpbmUgU1RBVElPTl9WQUxJRAkJMHgwMDAwMDAwMSAvKiBTdGF0aW9uIFZhbGlkICovCisjZGVmaW5lIFNUQVRJT05fVkFMSURfU0hJRlQJMAorCisJX19sZTMyIHR4X2Flc19ibGtzX3VuaWNhc3Q7IC8qIFRYIEFFUyBCbGtzIFVuaWNhc3QgKi8KKwlfX2xlMzIgcnhfYWVzX2Jsa3NfdW5pY2FzdDsgLyogUlggQUVTIEJsa3MgVW5pY2FzdCAqLworCisJX19sZTE2IGFlc19mb3JtYXRfZXJyX3VuaWNhc3RfY250OyAvKiBBRVMgRm9ybWF0IEVycm9yIFVuaWNhc3QgQ291bnRzICovCisJX19sZTE2IGFlc19yZXBsYXlfdW5pY2FzdDsgLyogQUVTIFJlcGxheSBVbmljYXN0ICovCisKKwlfX2xlMTYgYWVzX2RlY3J5cHRfZXJyX3VuaWNhc3Q7CS8qIEFFUyBEZWNyeXB0IEVycm9yIFVuaWNhc3QgKi8KKwlfX2xlMTYgYWVzX2RlY3J5cHRfZXJyX2RlZmF1bHQ7CS8qIEFFUyBEZWNyeXB0IEVycm9yIGRlZmF1bHQgKi8KKworCV9fbGUxNiBzaW5nbGVfcmV0cnlfcGFja2V0czsgLyogU2luZ2xlIFJldHJ5IFBhY2tldHMgKi8KKwlfX2xlMTYgZmFpbGVkX3R4X3BhY2tldHM7IC8qIEZhaWxlZCBUeCBQYWNrZXRzICovCisKKwlfX2xlMTYgbXV0aV9yZXRyeV9wYWNrZXRzOyAvKiBNdWx0aXBsZSBSZXRyeSBQYWNrZXRzICovCisJX19sZTE2IGFja190aW1lb3V0czsJLyogQUNLIFRpbWVvdXRzICovCisKKwlfX2xlMTYgZnJhZ190eF9jbnQ7CS8qIEZyYWdtZW50IFRYIENvdW50cyAqLworCV9fbGUxNiBydHNfYnJxX3NlbnQ7CS8qIFJUUyBCcnEgU2VudCAqLworCisJX19sZTE2IHR4X3BhY2tldHM7CS8qIFRYIFBhY2tldHMgKi8KKwlfX2xlMTYgY3RzX2JhY2tfdGltZW91dDsgLyogQ1RTIEJhY2sgVGltZW91dCAqLworCisJX19sZTMyIHBoeV9zdGF0c19oaWdoOwkvKiBQSFkgU3RhdHMgSGlnaCAqLworCV9fbGUzMiBwaHlfc3RhdHNfbG93OwkvKiBQSFkgU3RhdHMgTG93ICovCisKKwlzdHJ1Y3QgYWdueF9zdGFfdHJhZmZpYyB0cmFmZmljWzhdOwkvKiBUcmFmZmljIENsYXNzIFN0cnVjdHVyZSAoOCkgKi8KKworCV9fbGUxNiB0cmFmZmljX2NsYXNzMF9mcmFnX3N1Y2Nlc3M7IC8qIFRyYWZmaWMgQ2xhc3MgMCBGcmFnbWVudCBTdWNjZXNzICovCisJX19sZTE2IHRyYWZmaWNfY2xhc3MxX2ZyYWdfc3VjY2VzczsgLyogVHJhZmZpYyBDbGFzcyAxIEZyYWdtZW50IFN1Y2Nlc3MgKi8KKwlfX2xlMTYgdHJhZmZpY19jbGFzczJfZnJhZ19zdWNjZXNzOyAvKiBUcmFmZmljIENsYXNzIDIgRnJhZ21lbnQgU3VjY2VzcyAqLworCV9fbGUxNiB0cmFmZmljX2NsYXNzM19mcmFnX3N1Y2Nlc3M7IC8qIFRyYWZmaWMgQ2xhc3MgMyBGcmFnbWVudCBTdWNjZXNzICovCisJX19sZTE2IHRyYWZmaWNfY2xhc3M0X2ZyYWdfc3VjY2VzczsgLyogVHJhZmZpYyBDbGFzcyA0IEZyYWdtZW50IFN1Y2Nlc3MgKi8KKwlfX2xlMTYgdHJhZmZpY19jbGFzczVfZnJhZ19zdWNjZXNzOyAvKiBUcmFmZmljIENsYXNzIDUgRnJhZ21lbnQgU3VjY2VzcyAqLworCV9fbGUxNiB0cmFmZmljX2NsYXNzNl9mcmFnX3N1Y2Nlc3M7IC8qIFRyYWZmaWMgQ2xhc3MgNiBGcmFnbWVudCBTdWNjZXNzICovCisJX19sZTE2IHRyYWZmaWNfY2xhc3M3X2ZyYWdfc3VjY2VzczsgLyogVHJhZmZpYyBDbGFzcyA3IEZyYWdtZW50IFN1Y2Nlc3MgKi8KKworCV9fbGUxNiBudW1fZnJhZ19ub25fcHJpbWVfcmF0ZXM7IC8qIG51bWJlciBvZiBGcmFnbWVudHMgZm9yIG5vbi1wcmltZSByYXRlcyAqLworCV9fbGUxNiBhY2tfdGltZW91dF9ub25fcHJpbWVfcmF0ZXM7IC8qIEFDSyBUaW1lb3V0IGZvciBub24tcHJpbWUgcmF0ZXMgKi8KKworfSBfX2F0dHJpYnV0ZV9fKChfX3BhY2tlZF9fKSk7CisKKworc3RydWN0IGFnbnhfYmVhY29uX2hkciB7CisJc3RydWN0IGFnbnhfc3RhX3Bvd2VyIHBvd2VyOyAvKiBUeCBTdGF0aW9uIFBvd2VyIFRlbXBsYXRlICAqLworCXU4IHBoeV9oZHJbNl07CQkvKiBQSFkgSGRyICovCisJdTggZnJhbWVfbGVuX2xvOwkvKiBGcmFtZSBMZW5ndGggTG8gKi8KKwl1OCBmcmFtZV9sZW5faGk7CS8qIEZyYW1lIExlbmd0aCBIaSAqLworCXU4IG1hY19oZHJbMjRdOwkJLyogTUFDIEhlYWRlciAqLworCS8qIEZJWE1FICovCisJLyogODAyLjExKGFiZykgYmVhY29uICovCit9IF9fYXR0cmlidXRlX18oKF9fcGFja2VkX18pKTsKKwordm9pZCBoYXNoX3dyaXRlKHN0cnVjdCBhZ254X3ByaXYgKnByaXYsIHU4ICptYWNfYWRkciwgdTggc3RhX2lkKTsKK3ZvaWQgaGFzaF9kdW1wKHN0cnVjdCBhZ254X3ByaXYgKnByaXYsIHU4IHN0YV9pZCk7Cit2b2lkIGhhc2hfcmVhZChzdHJ1Y3QgYWdueF9wcml2ICpwcml2LCB1MzIgcmVnaGksIHUzMiByZWdsbywgdTggc3RhX2lkKTsKK3ZvaWQgaGFzaF9kZWxldGUoc3RydWN0IGFnbnhfcHJpdiAqcHJpdiwgdTMyIHJlZ2hpLCB1MzIgcmVnbG8sIHU4IHN0YV9pZCk7CisKK3ZvaWQgZ2V0X3N0YV9wb3dlcihzdHJ1Y3QgYWdueF9wcml2ICpwcml2LCBzdHJ1Y3QgYWdueF9zdGFfcG93ZXIgKnBvd2VyLCB1bnNpZ25lZCBpbnQgc3RhX2lkeCk7Cit2b2lkIHNldF9zdGFfcG93ZXIoc3RydWN0IGFnbnhfcHJpdiAqcHJpdiwgc3RydWN0IGFnbnhfc3RhX3Bvd2VyICpwb3dlciwKKwkJICAgdW5zaWduZWQgaW50IHN0YV9pZHgpOwordm9pZCBnZXRfc3RhX3R4X3dxKHN0cnVjdCBhZ254X3ByaXYgKnByaXYsIHN0cnVjdCBhZ254X3N0YV90eF93cSAqdHhfd3EsCisJCSAgIHVuc2lnbmVkIGludCBzdGFfaWR4LCB1bnNpZ25lZCBpbnQgd3FfaWR4KTsKK3ZvaWQgc2V0X3N0YV90eF93cShzdHJ1Y3QgYWdueF9wcml2ICpwcml2LCBzdHJ1Y3QgYWdueF9zdGFfdHhfd3EgKnR4X3dxLAorCQkgICB1bnNpZ25lZCBpbnQgc3RhX2lkeCwgdW5zaWduZWQgaW50IHdxX2lkeCk7Cit2b2lkIGdldF9zdGEoc3RydWN0IGFnbnhfcHJpdiAqcHJpdiwgc3RydWN0IGFnbnhfc3RhICpzdGEsIHVuc2lnbmVkIGludCBzdGFfaWR4KTsKK3ZvaWQgc2V0X3N0YShzdHJ1Y3QgYWdueF9wcml2ICpwcml2LCBzdHJ1Y3QgYWdueF9zdGEgKnN0YSwgdW5zaWduZWQgaW50IHN0YV9pZHgpOworCit2b2lkIHN0YV9wb3dlcl9pbml0KHN0cnVjdCBhZ254X3ByaXYgKnByaXYsIHVuc2lnbmVkIGludCBudW0pOwordm9pZCBzdGFfaW5pdChzdHJ1Y3QgYWdueF9wcml2ICpwcml2LCB1bnNpZ25lZCBpbnQgbnVtKTsKKworI2VuZGlmIC8qIEFHTlhfU1RBX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYWdueC90YWJsZS5jIGIvZHJpdmVycy9zdGFnaW5nL2FnbngvdGFibGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjAwNDg0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2FnbngvdGFibGUuYwpAQCAtMCwwICsxLDE2OCBAQAorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSAiYWdueC5oIgorI2luY2x1ZGUgImRlYnVnLmgiCisjaW5jbHVkZSAicGh5LmgiCisKK3N0YXRpYyBjb25zdCB1MzIKK3R4X2Zpcl90YWJsZVtdID0geyAweDE5LCAweDVkLCAweGNlLCAweDE1MSwgMHgxYzMsIDB4MWZmLCAweDFlYSwgMHgxN2MsIDB4Y2YsCisJCSAgIDB4MTksIDB4MzhlLCAweDM1MCwgMHgzNjIsIDB4M2FkLCAweDUsIDB4NDQsIDB4NTksIDB4NDksCisJCSAgIDB4MjEsIDB4M2Y3LCAweDNlMCwgMHgzZTMsIDB4M2YzLCAweDAgfTsKKwordm9pZCB0eF9maXJfdGFibGVfaW5pdChzdHJ1Y3QgYWdueF9wcml2ICpwcml2KQoreworCXZvaWQgX19pb21lbSAqY3RsID0gcHJpdi0+Y3RsOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUodHhfZmlyX3RhYmxlKTsgaSsrKQorCQlpb3dyaXRlMzIodHhfZmlyX3RhYmxlW2ldLCBjdGwgKyBBR05YX0ZJUl9CQVNFICsgaSo0KTsKK30gLyogZmlyX3RhYmxlX3NldHVwICovCisKKworc3RhdGljIGNvbnN0IHUzMgorZ2Fpbl90YWJsZVtdID0geyAweDgsIDB4OCwgMHhmLCAweDEzLCAweDE3LCAweDFiLCAweDFmLCAweDIzLCAweDI3LCAweDJiLAorCQkgMHgyZiwgMHgzMywgMHgzNywgMHgzYiwgMHgzZiwgMHg0MywgMHg0NywgMHg0YiwgMHg0ZiwKKwkJIDB4NTMsIDB4NTcsIDB4NWIsIDB4NWYsIDB4NWYsIDB4NWYsIDB4NWYsIDB4NWYsIDB4NWYsCisJCSAweDVmLCAweDVmLCAweDVmLCAweDVmIH07CisKK3ZvaWQgZ2Fpbl90YWJsZV9pbml0KHN0cnVjdCBhZ254X3ByaXYgKnByaXYpCit7CisJdm9pZCBfX2lvbWVtICpjdGwgPSBwcml2LT5jdGw7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShnYWluX3RhYmxlKTsgaSsrKSB7CisJCWlvd3JpdGUzMihnYWluX3RhYmxlW2ldLCBjdGwgKyBBR05YX0dBSU5fVEFCTEUgKyBpKjQpOworCQlpb3dyaXRlMzIoZ2Fpbl90YWJsZVtpXSwgY3RsICsgQUdOWF9HQUlOX1RBQkxFICsgaSo0ICsgMHg4MCk7CisJfQorfSAvKiBnYWluX3RhYmxlX2luaXQgKi8KKwordm9pZCBtb25pdG9yX2dhaW5fdGFibGVfaW5pdChzdHJ1Y3QgYWdueF9wcml2ICpwcml2KQoreworCXZvaWQgX19pb21lbSAqY3RsID0gcHJpdi0+Y3RsOworCXVuc2lnbmVkIGludCBpOworCisJZm9yIChpID0gMDsgaSA8IDB4NDQ7IGkgKz0gNCkgeworCQlpb3dyaXRlMzIoMHg2MSwgY3RsICsgQUdOWF9NT05HQ1JfQkFTRSArIGkpOworCQlpb3dyaXRlMzIoMHg2MSwgY3RsICsgQUdOWF9NT05HQ1JfQkFTRSArIDB4MjAwICsgaSk7CisJfQorCWZvciAoaSA9IDB4NDQ7IGkgPCAweDY0OyBpICs9IDQpIHsKKwkJaW93cml0ZTMyKDB4NmUsIGN0bCArIEFHTlhfTU9OR0NSX0JBU0UgKyBpKTsKKwkJaW93cml0ZTMyKDB4NmUsIGN0bCArIEFHTlhfTU9OR0NSX0JBU0UgKyAweDIwMCArIGkpOworCX0KKwlmb3IgKGkgPSAweDY0OyBpIDwgMHg5NDsgaSArPSA0KSB7CisJCWlvd3JpdGUzMigweDdhLCBjdGwgKyBBR05YX01PTkdDUl9CQVNFICsgaSk7CisJCWlvd3JpdGUzMigweDdhLCBjdGwgKyBBR05YX01PTkdDUl9CQVNFICsgMHgyMDAgKyBpKTsKKwl9CisJZm9yIChpID0gMHg5NDsgaSA8IDB4ZGM7IGkgKz0gNCkgeworCQlpb3dyaXRlMzIoMHg4NywgY3RsICsgQUdOWF9NT05HQ1JfQkFTRSArIGkpOworCQlpb3dyaXRlMzIoMHg4NywgY3RsICsgQUdOWF9NT05HQ1JfQkFTRSArIDB4MjAwICsgaSk7CisJfQorCWZvciAoaSA9IDB4ZGM7IGkgPCAweDE0ODsgaSArPSA0KSB7CisJCWlvd3JpdGUzMigweDk1LCBjdGwgKyBBR05YX01PTkdDUl9CQVNFICsgaSk7CisJCWlvd3JpdGUzMigweDk1LCBjdGwgKyBBR05YX01PTkdDUl9CQVNFICsgMHgyMDAgKyBpKTsKKwl9CisJZm9yIChpID0gMHgxNDg7IGkgPCAweDFlODsgaSArPSA0KSB7CisJCWlvd3JpdGUzMigweGEyLCBjdGwgKyBBR05YX01PTkdDUl9CQVNFICsgaSk7CisJCWlvd3JpdGUzMigweGEyLCBjdGwgKyBBR05YX01PTkdDUl9CQVNFICsgMHgyMDAgKyBpKTsKKwl9CisJZm9yIChpID0gMHgxZTg7IGkgPD0gMHgxZmM7IGkgKz0gNCkgeworCQlpb3dyaXRlMzIoMHhiMCwgY3RsICsgQUdOWF9NT05HQ1JfQkFTRSArIGkpOworCQlpb3dyaXRlMzIoMHhiMCwgY3RsICsgQUdOWF9NT05HQ1JfQkFTRSArIDB4MjAwICsgaSk7CisJfQorfSAvKiBtb25pdG9yX2dhaW5fdGFibGVfaW5pdCAqLworCisKK3ZvaWQgcm91dGluZ190YWJsZV9pbml0KHN0cnVjdCBhZ254X3ByaXYgKnByaXYpCit7CisJdm9pZCBfX2lvbWVtICpjdGwgPSBwcml2LT5jdGw7CisJdW5zaWduZWQgaW50IHR5cGUsIHN1YnR5cGU7CisJdTMyIHJlZzsKKworCWRpc2FibGVfcmVjZWl2ZXIocHJpdik7CisKKwlmb3IgKCB0eXBlID0gMDsgdHlwZSA8IDB4MzsgdHlwZSsrICkgeworCQlmb3IgKHN1YnR5cGUgPSAwOyBzdWJ0eXBlIDwgMHgxMDsgc3VidHlwZSsrKSB7CisJCQkvKiAxLiBTZXQgUm91dGluZyB0YWJsZSB0byBSL1cgYW5kIHRvIFJldHVybiBzdGF0dXMgb24gUmVhZCAqLworCQkJcmVnID0gKHR5cGUgPDwgUk9VVEFCX1RZUEVfU0hJRlQpIHwKKwkJCQkoc3VidHlwZSA8PCBST1VUQUJfU1VCVFlQRV9TSElGVCk7CisJCQlyZWcgfD0gKDEgPDwgUk9VVEFCX1JXX1NISUZUKSB8ICgxIDw8IFJPVVRBQl9TVEFUVVNfU0hJRlQpOworCQkJaWYgKHR5cGUgPT0gUk9VVEFCX1RZUEVfREFUQSkgeworCQkJCS8qIE5VTEwgZ29lcyB0byBSRlAgKi8KKwkJCQlpZiAoc3VidHlwZSA9PSBST1VUQUJfU1VCVFlQRV9OVUxMKQorLy8JCQkJCXJlZyB8PSBST1VUQUJfUk9VVEVfUkZQOworCQkJCQlyZWcgfD0gUk9VVEFCX1JPVVRFX0NQVTsKKwkJCQkvKiBRT1MgTlVMTCBnb2VzIHRvIENQVSAqLworCQkJCWVsc2UgaWYgKHN1YnR5cGUgPT0gUk9VVEFCX1NVQlRZUEVfUU9TTlVMTCkKKwkJCQkJcmVnIHw9IFJPVVRBQl9ST1VURV9DUFU7CisJCQkJLyogQWxsIERhdGEgYW5kIFFPUyBkYXRhIHN1YnR5cGVzIGdvIHRvIEVuY3J5cHRpb24gKi8KKwkJCQllbHNlIGlmICgoc3VidHlwZSA9PSBST1VUQUJfU1VCVFlQRV9EQVRBKSB8fAorCQkJCQkgKHN1YnR5cGUgPT0gUk9VVEFCX1NVQlRZUEVfREFUQUFDSykgfHwKKwkJCQkJIChzdWJ0eXBlID09IFJPVVRBQl9TVUJUWVBFX0RBVEFQT0xMKSB8fAorCQkJCQkgKHN1YnR5cGUgPT0gUk9VVEFCX1NVQlRZUEVfREFUQVBPTExBQ0spIHx8CisJCQkJCSAoc3VidHlwZSA9PSBST1VUQUJfU1VCVFlQRV9RT1NEQVRBKSB8fAorCQkJCQkgKHN1YnR5cGUgPT0gUk9VVEFCX1NVQlRZUEVfUU9TREFUQUFDSykgfHwKKwkJCQkJIChzdWJ0eXBlID09IFJPVVRBQl9TVUJUWVBFX1FPU0RBVEFQT0xMKSB8fAorCQkJCQkgKHN1YnR5cGUgPT0gUk9VVEFCX1NVQlRZUEVfUU9TREFUQUFDS1BPTEwpKQorCQkJCQlyZWcgfD0gUk9VVEFCX1JPVVRFX0VOQ1JZOworLy8JCQkJCXJlZyB8PSBST1VUQUJfUk9VVEVfQ1BVOworCQkJCS8qRHJvcCBOVUxMIGFuZCBRT1MgTlVMTCBhY2ssIHBvbGwgYW5kIHBvbGwgYWNrKi8KKwkJCQllbHNlIGlmICgoc3VidHlwZSA9PSBST1VUQUJfU1VCVFlQRV9OVUxMQUNLKSB8fAorCQkJCQkgKHN1YnR5cGUgPT0gUk9VVEFCX1NVQlRZUEVfUU9TTlVMTEFDSykgfHwKKwkJCQkJIChzdWJ0eXBlID09IFJPVVRBQl9TVUJUWVBFX05VTExQT0xMKSB8fAorCQkJCQkgKHN1YnR5cGUgPT0gUk9VVEFCX1NVQlRZUEVfUU9TTlVMTFBPTEwpIHx8CisJCQkJCSAoc3VidHlwZSA9PSBST1VUQUJfU1VCVFlQRV9OVUxMUE9MTEFDSykgfHwKKwkJCQkJIChzdWJ0eXBlID09IFJPVVRBQl9TVUJUWVBFX1FPU05VTExQT0xMQUNLKSkKKy8vCQkJCQlyZWcgfD0gUk9VVEFCX1JPVVRFX0RST1A7CisJCQkJCXJlZyB8PSBST1VUQUJfUk9VVEVfQ1BVOworCQkJfQorCQkJZWxzZQorCQkJCXJlZyB8PSAoUk9VVEFCX1JPVVRFX0NQVSk7CisJCQlpb3dyaXRlMzIocmVnLCBjdGwgKyBBR05YX1JYTV9ST1VUQUIpOworCQkJLyogQ2hlY2sgdG8gdmVyaWZ5IHRoYXQgdGhlIHN0YXR1cyBiaXQgY2xlYXJlZCAqLworCQkJcm91dGluZ190YWJsZV9kZWxheSgpOworCQl9CisJfQorCWVuYWJsZV9yZWNlaXZlcihwcml2KTsKK30gLyogcm91dGluZ190YWJsZV9pbml0ICovCisKK3ZvaWQgdHhfZW5naW5lX2xvb2t1cF90YmxfaW5pdChzdHJ1Y3QgYWdueF9wcml2ICpwcml2KQoreworCXZvaWQgX19pb21lbSAqZGF0YSA9IHByaXYtPmRhdGE7CisJdW5zaWduZWQgaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDw9IDI4OyBpICs9IDQpCisJCWlvd3JpdGUzMigweGIwMGMsIGRhdGEgKyBBR05YX0VOR0lORV9MT09LVVBfVEJMICsgaSk7CisJZm9yIChpID0gMzI7IGkgPD0gMTIwOyBpICs9IDgpIHsKKwkJaW93cml0ZTMyKDB4MWU1OCwgZGF0YSArIEFHTlhfRU5HSU5FX0xPT0tVUF9UQkwgKyBpKTsKKwkJaW93cml0ZTMyKDB4YjAwYywgZGF0YSArIEFHTlhfRU5HSU5FX0xPT0tVUF9UQkwgKyBpICsgNCk7CisJfQorCisJZm9yIChpID0gMTI4OyBpIDw9IDE1NjsgaSArPSA0KQorCQlpb3dyaXRlMzIoMHg5ODBjLCBkYXRhICsgQUdOWF9FTkdJTkVfTE9PS1VQX1RCTCArIGkpOworCWZvciAoaSA9IDE2MDsgaSA8PSAyNDg7IGkgKz0gOCkgeworCQlpb3dyaXRlMzIoMHgxODU4LCBkYXRhICsgQUdOWF9FTkdJTkVfTE9PS1VQX1RCTCArIGkpOworCQlpb3dyaXRlMzIoMHg5ODBjLCBkYXRhICsgQUdOWF9FTkdJTkVfTE9PS1VQX1RCTCArIGkgKyA0KTsKKwl9CisKKwlmb3IgKGkgPSAyNTY7IGkgPD0gMjg0OyBpICs9IDQpCisJCWlvd3JpdGUzMigweDk4MGMsIGRhdGEgKyBBR05YX0VOR0lORV9MT09LVVBfVEJMICsgaSk7CisJZm9yIChpID0gMjg4OyBpIDw9IDM3NjsgaSArPSA4KSB7CisJCWlvd3JpdGUzMigweDFhNTgsIGRhdGEgKyBBR05YX0VOR0lORV9MT09LVVBfVEJMICsgaSk7CisJCWlvd3JpdGUzMigweDE4NTgsIGRhdGEgKyBBR05YX0VOR0lORV9MT09LVVBfVEJMICsgaSArIDQpOworCX0KKworCWZvciAoaSA9IDUxMjsgaSA8PSA1NDA7IGkgKz0gNCkKKwkJaW93cml0ZTMyKDB4YzAwYywgZGF0YSArIEFHTlhfRU5HSU5FX0xPT0tVUF9UQkwgKyBpKTsKKwlmb3IgKGkgPSA1NDQ7IGkgPD0gNjMyOyBpICs9IDgpIHsKKwkJaW93cml0ZTMyKDB4MjA1OCwgZGF0YSArIEFHTlhfRU5HSU5FX0xPT0tVUF9UQkwgKyBpKTsKKwkJaW93cml0ZTMyKDB4YzAwYywgZGF0YSArIEFHTlhfRU5HSU5FX0xPT0tVUF9UQkwgKyBpICsgNCk7CisJfQorCisJZm9yIChpID0gNjQwOyBpIDw9IDY2ODsgaSArPSA0KQorCQlpb3dyaXRlMzIoMHhjODBjLCBkYXRhICsgQUdOWF9FTkdJTkVfTE9PS1VQX1RCTCArIGkpOworCWZvciAoaSA9IDY3MjsgaSA8PSA3NjQ7IGkgKz0gOCkgeworCQlpb3dyaXRlMzIoMHgyMjU4LCBkYXRhICsgQUdOWF9FTkdJTkVfTE9PS1VQX1RCTCArIGkpOworCQlpb3dyaXRlMzIoMHhjODBjLCBkYXRhICsgQUdOWF9FTkdJTkVfTE9PS1VQX1RCTCArIGkgKyA0KTsKKwl9Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hZ254L3RhYmxlLmggYi9kcml2ZXJzL3N0YWdpbmcvYWdueC90YWJsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwNjI2YjUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYWdueC90YWJsZS5oCkBAIC0wLDAgKzEsMTAgQEAKKyNpZm5kZWYgQUdOWF9UQUJMRV9IXworI2RlZmluZSBBR05YX1RBQkxFX0hfCisKK3ZvaWQgdHhfZmlyX3RhYmxlX2luaXQoc3RydWN0IGFnbnhfcHJpdiAqcHJpdik7Cit2b2lkIGdhaW5fdGFibGVfaW5pdChzdHJ1Y3QgYWdueF9wcml2ICpwcml2KTsKK3ZvaWQgbW9uaXRvcl9nYWluX3RhYmxlX2luaXQoc3RydWN0IGFnbnhfcHJpdiAqcHJpdik7Cit2b2lkIHJvdXRpbmdfdGFibGVfaW5pdChzdHJ1Y3QgYWdueF9wcml2ICpwcml2KTsKK3ZvaWQgdHhfZW5naW5lX2xvb2t1cF90YmxfaW5pdChzdHJ1Y3QgYWdueF9wcml2ICpwcml2KTsKKworI2VuZGlmIC8qIEFHTlhfVEFCTEVfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hZ254L3htaXQuYyBiL2RyaXZlcnMvc3RhZ2luZy9hZ254L3htaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjAxNTI4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2FnbngveG1pdC5jCkBAIC0wLDAgKzEsODE5IEBACisvKioKKyAqIEFpcmdvIE1JTU8gd2lyZWxlc3MgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA3IExpIFlhbkJvIDxkcmVhbWZseTI4MUBnbWFpbC5jb20+CisKKyAqIFRoYW5rcyBmb3IgSmVmZiBXaWxsaWFtcyA8YW5nZWxiYW5lQGdtYWlsLmNvbT4gZG8gcmV2ZXJzZSBlbmdpbmVlcgorICogd29ya3MgYW5kIHB1Ymxpc2hlZCB0aGUgU1BFQ1MgYXQgaHR0cDovL2FpcmdvLndkd2NvbnN1bHRpbmcubmV0L215bW9pbgorCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgImFnbnguaCIKKyNpbmNsdWRlICJkZWJ1Zy5oIgorI2luY2x1ZGUgInBoeS5oIgorCit1bnNpZ25lZCBpbnQgcnhfZnJhbWVfY250ID0gMDsKKy8vdW5zaWduZWQgaW50IGxvY2FsX3R4X3NlbnRfY250ID0gMDsKKworc3RhdGljIGlubGluZSB2b2lkIGRpc2FibGVfcnhfZW5naW5lKHN0cnVjdCBhZ254X3ByaXYgKnByaXYpCit7CisJdm9pZCBfX2lvbWVtICpjdGwgPSBwcml2LT5jdGw7CisJaW93cml0ZTMyKDB4MTAwLCBjdGwgKyBBR05YX0NJUl9SWENUTCk7CisJLyogV2FpdCBmb3IgUlggQ29udHJvbCB0byBoYXZlIHRoZSBEaXNhYmxlIFJ4IEludGVycnVwdCAoMHgxMDApIHNldCAqLworCWlvcmVhZDMyKGN0bCArIEFHTlhfQ0lSX1JYQ1RMKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGVuYWJsZV9yeF9lbmdpbmUoc3RydWN0IGFnbnhfcHJpdiAqcHJpdikKK3sKKwl2b2lkIF9faW9tZW0gKmN0bCA9IHByaXYtPmN0bDsKKwlpb3dyaXRlMzIoMHg4MCwgY3RsICsgQUdOWF9DSVJfUlhDVEwpOworCWlvcmVhZDMyKGN0bCArIEFHTlhfQ0lSX1JYQ1RMKTsKK30KKworaW5saW5lIHZvaWQgZGlzYWJsZV9yeF9pbnRlcnJ1cHQoc3RydWN0IGFnbnhfcHJpdiAqcHJpdikKK3sKKwl2b2lkIF9faW9tZW0gKmN0bCA9IHByaXYtPmN0bDsKKwl1MzIgcmVnOworCisJZGlzYWJsZV9yeF9lbmdpbmUocHJpdik7CisJcmVnID0gaW9yZWFkMzIoY3RsICsgQUdOWF9DSVJfUlhDRkcpOworCXJlZyAmPSB+MHgyMDsKKwlpb3dyaXRlMzIocmVnLCBjdGwgKyBBR05YX0NJUl9SWENGRyk7CisJaW9yZWFkMzIoY3RsICsgQUdOWF9DSVJfUlhDRkcpOworfQorCitpbmxpbmUgdm9pZCBlbmFibGVfcnhfaW50ZXJydXB0KHN0cnVjdCBhZ254X3ByaXYgKnByaXYpCit7CisJdm9pZCBfX2lvbWVtICpjdGwgPSBwcml2LT5jdGw7CisJdTMyIHJlZzsKKworCXJlZyA9IGlvcmVhZDMyKGN0bCArIEFHTlhfQ0lSX1JYQ0ZHKTsKKwlyZWcgfD0gMHgyMDsKKwlpb3dyaXRlMzIocmVnLCBjdGwgKyBBR05YX0NJUl9SWENGRyk7CisJaW9yZWFkMzIoY3RsICsgQUdOWF9DSVJfUlhDRkcpOworCWVuYWJsZV9yeF9lbmdpbmUocHJpdik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByeF9kZXNjX2luaXQoc3RydWN0IGFnbnhfcHJpdiAqcHJpdiwgdW5zaWduZWQgaW50IGlkeCkKK3sKKwlzdHJ1Y3QgYWdueF9kZXNjICpkZXNjID0gcHJpdi0+cnguZGVzYyArIGlkeDsKKwlzdHJ1Y3QgYWdueF9pbmZvICppbmZvID0gcHJpdi0+cnguaW5mbyArIGlkeDsKKworCW1lbXNldChpbmZvLCAwLCBzaXplb2YoKmluZm8pKTsKKworCWluZm8tPmRtYV9sZW4gPSBJRUVFODAyMTFfTUFYX1JUU19USFJFU0hPTEQgKyBzaXplb2Yoc3RydWN0IGFnbnhfaGRyKTsKKwlpbmZvLT5za2IgPSBkZXZfYWxsb2Nfc2tiKGluZm8tPmRtYV9sZW4pOworCWlmIChpbmZvLT5za2IgPT0gTlVMTCkKKwkJYWdueF9idWcoInJlZmlsbCBlcnIiKTsKKworCWluZm8tPm1hcHBpbmcgPSBwY2lfbWFwX3NpbmdsZShwcml2LT5wZGV2LCBza2JfdGFpbF9wb2ludGVyKGluZm8tPnNrYiksCisJCQkJICAgICAgIGluZm8tPmRtYV9sZW4sIFBDSV9ETUFfRlJPTURFVklDRSk7CisJbWVtc2V0KGRlc2MsIDAsIHNpemVvZigqZGVzYykpOworCWRlc2MtPmRtYV9hZGRyID0gY3B1X3RvX2JlMzIoaW5mby0+bWFwcGluZyk7CisJLyogU2V0IHRoZSBvd25lciB0byB0aGUgY2FyZCAqLworCWRlc2MtPmZyYWcgPSBjcHVfdG9fYmUzMihiZTMyX3RvX2NwdShkZXNjLT5mcmFnKSB8IE9XTkVSKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHJ4X2Rlc2NfcmVpbml0KHN0cnVjdCBhZ254X3ByaXYgKnByaXYsIHVuc2lnbmVkIGludCBpZHgpCit7CisJc3RydWN0IGFnbnhfaW5mbyAqaW5mbyA9IHByaXYtPnJ4LmluZm8gKyBpZHg7CisKKwkvKiBDYXVzZSBpZWVlODAyMTEgd2lsbCBmcmVlIHRoZSBza2IgYnVmZmVyLCBzbyB3ZSBuZWVkbid0IHRvIGZyZWUgaXQgYWdhaW4/ISAqLworCXBjaV91bm1hcF9zaW5nbGUocHJpdi0+cGRldiwgaW5mby0+bWFwcGluZywgaW5mby0+ZG1hX2xlbiwgUENJX0RNQV9GUk9NREVWSUNFKTsKKwlyeF9kZXNjX2luaXQocHJpdiwgaWR4KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHJ4X2Rlc2NfcmV1c2luZyhzdHJ1Y3QgYWdueF9wcml2ICpwcml2LCB1bnNpZ25lZCBpbnQgaWR4KQoreworCXN0cnVjdCBhZ254X2Rlc2MgKmRlc2MgPSBwcml2LT5yeC5kZXNjICsgaWR4OworCXN0cnVjdCBhZ254X2luZm8gKmluZm8gPSBwcml2LT5yeC5pbmZvICsgaWR4OworCisJbWVtc2V0KGRlc2MsIDAsIHNpemVvZigqZGVzYykpOworCWRlc2MtPmRtYV9hZGRyID0gY3B1X3RvX2JlMzIoaW5mby0+bWFwcGluZyk7CisJLyogU2V0IHRoZSBvd25lciB0byB0aGUgY2FyZCAqLworCWRlc2MtPmZyYWcgPSBjcHVfdG9fYmUzMihiZTMyX3RvX2NwdShkZXNjLT5mcmFnKSB8IE9XTkVSKTsKK30KKworc3RhdGljIHZvaWQgcnhfZGVzY19mcmVlKHN0cnVjdCBhZ254X3ByaXYgKnByaXYsIHVuc2lnbmVkIGludCBpZHgpCit7CisJc3RydWN0IGFnbnhfZGVzYyAqZGVzYyA9IHByaXYtPnJ4LmRlc2MgKyBpZHg7CisJc3RydWN0IGFnbnhfaW5mbyAqaW5mbyA9IHByaXYtPnJ4LmluZm8gKyBpZHg7CisKKwlCVUdfT04oIWRlc2MgfHwgIWluZm8pOworCWlmIChpbmZvLT5tYXBwaW5nKQorCQlwY2lfdW5tYXBfc2luZ2xlKHByaXYtPnBkZXYsIGluZm8tPm1hcHBpbmcsIGluZm8tPmRtYV9sZW4sIFBDSV9ETUFfRlJPTURFVklDRSk7CisJaWYgKGluZm8tPnNrYikKKwkJZGV2X2tmcmVlX3NrYihpbmZvLT5za2IpOworCW1lbXNldChpbmZvLCAwLCBzaXplb2YoKmluZm8pKTsKKwltZW1zZXQoZGVzYywgMCwgc2l6ZW9mKCpkZXNjKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3R4X2Rlc2NfZnJlZShzdHJ1Y3QgYWdueF9wcml2ICpwcml2LAorCQkJCSAgc3RydWN0IGFnbnhfZGVzYyAqZGVzYywgc3RydWN0IGFnbnhfaW5mbyAqaW5mbykKK3sKKwlCVUdfT04oIWRlc2MgfHwgIWluZm8pOworCS8qIFRPRE8gbWFrZSBzdXJlIG1hcHBpbmcsIHNrYiBhbmQgbGVuIGFyZSBjb25zaXN0ZW5jeSAqLworCWlmIChpbmZvLT5tYXBwaW5nKQorCQlwY2lfdW5tYXBfc2luZ2xlKHByaXYtPnBkZXYsIGluZm8tPm1hcHBpbmcsCisJCQkJIGluZm8tPmRtYV9sZW4sIFBDSV9ETUFfVE9ERVZJQ0UpOworCWlmIChpbmZvLT50eXBlID09IFBBQ0tFVCkKKwkJZGV2X2tmcmVlX3NrYihpbmZvLT5za2IpOworCisJbWVtc2V0KGluZm8sIDAsIHNpemVvZigqaW5mbykpOworCW1lbXNldChkZXNjLCAwLCBzaXplb2YoKmRlc2MpKTsKK30KKworc3RhdGljIHZvaWQgdHhtX2Rlc2NfZnJlZShzdHJ1Y3QgYWdueF9wcml2ICpwcml2LCB1bnNpZ25lZCBpbnQgaWR4KQoreworCXN0cnVjdCBhZ254X2Rlc2MgKmRlc2MgPSBwcml2LT50eG0uZGVzYyArIGlkeDsKKwlzdHJ1Y3QgYWdueF9pbmZvICppbmZvID0gcHJpdi0+dHhtLmluZm8gKyBpZHg7CisKKwlfX3R4X2Rlc2NfZnJlZShwcml2LCBkZXNjLCBpbmZvKTsKK30KKworc3RhdGljIHZvaWQgdHhkX2Rlc2NfZnJlZShzdHJ1Y3QgYWdueF9wcml2ICpwcml2LCB1bnNpZ25lZCBpbnQgaWR4KQoreworCXN0cnVjdCBhZ254X2Rlc2MgKmRlc2MgPSBwcml2LT50eGQuZGVzYyArIGlkeDsKKwlzdHJ1Y3QgYWdueF9pbmZvICppbmZvID0gcHJpdi0+dHhkLmluZm8gKyBpZHg7CisKKwlfX3R4X2Rlc2NfZnJlZShwcml2LCBkZXNjLCBpbmZvKTsKK30KKworaW50IGZpbGxfcmluZ3Moc3RydWN0IGFnbnhfcHJpdiAqcHJpdikKK3sKKwl2b2lkIF9faW9tZW0gKmN0bCA9IHByaXYtPmN0bDsKKwl1bnNpZ25lZCBpbnQgaTsKKwl1MzIgcmVnOworCUFHTlhfVFJBQ0U7CisKKwlwcml2LT50eGQuaWR4X3NlbnQgPSBwcml2LT50eG0uaWR4X3NlbnQgPSAwOworCXByaXYtPnJ4LmlkeCA9IHByaXYtPnR4bS5pZHggPSBwcml2LT50eGQuaWR4ID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBwcml2LT5yeC5zaXplOyBpKyspCisJCXJ4X2Rlc2NfaW5pdChwcml2LCBpKTsKKwlmb3IgKGkgPSAwOyBpIDwgcHJpdi0+dHhtLnNpemU7IGkrKykgeworCQltZW1zZXQocHJpdi0+dHhtLmRlc2MgKyBpLCAwLCBzaXplb2Yoc3RydWN0IGFnbnhfZGVzYykpOworCQltZW1zZXQocHJpdi0+dHhtLmluZm8gKyBpLCAwLCBzaXplb2Yoc3RydWN0IGFnbnhfaW5mbykpOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgcHJpdi0+dHhkLnNpemU7IGkrKykgeworCQltZW1zZXQocHJpdi0+dHhkLmRlc2MgKyBpLCAwLCBzaXplb2Yoc3RydWN0IGFnbnhfZGVzYykpOworCQltZW1zZXQocHJpdi0+dHhkLmluZm8gKyBpLCAwLCBzaXplb2Yoc3RydWN0IGFnbnhfaW5mbykpOworCX0KKworCS8qIEZJWE1FIFNldCB0aGUgY2FyZCBSWCBUWE0gYW5kIFRYRCBhZGRyZXNzICovCisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9DSVJfUlhDTVNUQVJULCBwcml2LT5yeC5kbWEpOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQ0lSX1JYQ01FTkQsIHByaXYtPnR4bS5kbWEpOworCisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9DSVJfVFhNU1RBUlQsIHByaXYtPnR4bS5kbWEpOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQ0lSX1RYTUVORCwgcHJpdi0+dHhkLmRtYSk7CisKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0NJUl9UWERTVEFSVCwgcHJpdi0+dHhkLmRtYSk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9DSVJfVFhERU5ELCBwcml2LT50eGQuZG1hICsKKwkJICAgICBzaXplb2Yoc3RydWN0IGFnbnhfZGVzYykgKiBwcml2LT50eGQuc2l6ZSk7CisKKwkvKiBGSVhNRSBSZWxpbnF1aXNoIGNvbnRyb2wgb2YgcmluZ3MgdG8gY2FyZCAqLworCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9DSVJfQkxLQ1RMKTsKKwlyZWcgJj0gfjB4ODAwOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQ0lSX0JMS0NUTCwgcmVnKTsKKwlyZXR1cm4gMDsKK30gLyogZmlsbF9yaW5ncyAqLworCit2b2lkIHVuZmlsbF9yaW5ncyhzdHJ1Y3QgYWdueF9wcml2ICpwcml2KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaW50IGk7CisJQUdOWF9UUkFDRTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgcHJpdi0+cnguc2l6ZTsgaSsrKQorCQlyeF9kZXNjX2ZyZWUocHJpdiwgaSk7CisJZm9yIChpID0gMDsgaSA8IHByaXYtPnR4bS5zaXplOyBpKyspCisJCXR4bV9kZXNjX2ZyZWUocHJpdiwgaSk7CisJZm9yIChpID0gMDsgaSA8IHByaXYtPnR4ZC5zaXplOyBpKyspCisJCXR4ZF9kZXNjX2ZyZWUocHJpdiwgaSk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7Cit9CisKKy8qIEV4dHJhY3QgdGhlIGJpdHJhdGUgb3V0IG9mIGEgQ0NLIFBMQ1AgaGVhZGVyLgorICAgY29weSBmcm9tIGJjbTQzeHggZHJpdmVyICovCitzdGF0aWMgaW5saW5lIHU4IGFnbnhfcGxjcF9nZXRfYml0cmF0ZV9jY2soX19iZTMyICpwaHloZHJfMTFiKQoreworCS8qIEZJWE1FICovCisJc3dpdGNoICgqKHU4ICopcGh5aGRyXzExYikgeworCWNhc2UgMHgwQToKKwkJcmV0dXJuIDA7CisJY2FzZSAweDE0OgorCQlyZXR1cm4gMTsKKwljYXNlIDB4Mzc6CisJCXJldHVybiAyOworCWNhc2UgMHg2RToKKwkJcmV0dXJuIDM7CisJfQorCWFnbnhfYnVnKCJXcm9uZyBwbGNwIHJhdGUiKTsKKwlyZXR1cm4gMDsKK30KKworLyogRklYTUUgKi8KK3N0YXRpYyBpbmxpbmUgdTggYWdueF9wbGNwX2dldF9iaXRyYXRlX29mZG0oX19iZTMyICpwaHloZHJfMTFnKQoreworCXU4IHJhdGUgPSAqKHU4ICopcGh5aGRyXzExZyAmIDB4RjsKKworCXByaW50ayhQRlggIkcgbW9kZSByYXRlIGlzIDB4JXhcbiIsIHJhdGUpOworCXJldHVybiByYXRlOworfQorCisvKiBGSVhNRSAqLworc3RhdGljIHZvaWQgZ2V0X3J4X3N0YXRzKHN0cnVjdCBhZ254X3ByaXYgKnByaXYsIHN0cnVjdCBhZ254X2hkciAqaGRyLAorCQkJIHN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHVzICpzdGF0KQoreworCXZvaWQgX19pb21lbSAqY3RsID0gcHJpdi0+Y3RsOworCXU4ICpyc3NpOworCXUzMiBub2lzZTsKKwkvKiBGSVhNRSBqdXN0IGZvciB0ZXN0ICovCisJaW50IHNuciA9IDQwOwkJLyogc2lnbmFsLXRvLW5vaXNlIHJhdGlvICovCisKKwltZW1zZXQoc3RhdCwgMCwgc2l6ZW9mKCpzdGF0KSk7CisJLyogUlNTSSAqLworCXJzc2kgPSAodTggKikmaGRyLT5waHlfc3RhdHNfbG87CisvLwlzdGF0LT5zc2kgPSAocnNzaVswXSArIHJzc2lbMV0gKyByc3NpWzJdKSAvIDM7CisJLyogTm9pc2UgKi8KKwlub2lzZSA9IGlvcmVhZDMyKGN0bCArIEFHTlhfR0NSX05PSVNFMCk7CisJbm9pc2UgKz0gaW9yZWFkMzIoY3RsICsgQUdOWF9HQ1JfTk9JU0UxKTsKKwlub2lzZSArPSBpb3JlYWQzMihjdGwgKyBBR05YX0dDUl9OT0lTRTIpOworCXN0YXQtPm5vaXNlID0gbm9pc2UgLyAzOworCS8qIFNpZ25hbCBxdWFsaXR5ICovCisJLy9zbnIgPSBzdGF0LT5zc2kgLSBzdGF0LT5ub2lzZTsKKwlpZiAoc25yID49MCAmJiBzbnIgPCA0MCkKKwkJc3RhdC0+c2lnbmFsID0gNSAqIHNuciAvIDI7CisJZWxzZSBpZiAoc25yID49IDQwKQorCQlzdGF0LT5zaWduYWwgPSAxMDA7CisJZWxzZQorCQlzdGF0LT5zaWduYWwgPSAwOworCisKKwlpZiAoaGRyLT5fMTFiMCAmJiAhaGRyLT5fMTFnMCkgeworCQlzdGF0LT5yYXRlX2lkeCA9IGFnbnhfcGxjcF9nZXRfYml0cmF0ZV9jY2soJmhkci0+XzExYjApOworCX0gZWxzZSBpZiAoIWhkci0+XzExYjAgJiYgaGRyLT5fMTFnMCkgeworCQlwcmludGsoUEZYICJSWDogRm91bmQgRyBtb2RlIHBhY2tldFxuIik7CisJCXN0YXQtPnJhdGVfaWR4ID0gYWdueF9wbGNwX2dldF9iaXRyYXRlX29mZG0oJmhkci0+XzExZzApOworCX0gZWxzZQorCQlhZ254X2J1ZygiVW5rbm93biBwYWNrZXRzIHR5cGUiKTsKKworCisJc3RhdC0+YmFuZCA9IElFRUU4MDIxMV9CQU5EXzJHSFo7CisJc3RhdC0+ZnJlcSA9IGFnbnhfY2hhbm5lbHNbcHJpdi0+Y2hhbm5lbCAtIDFdLmNlbnRlcl9mcmVxOworLy8Jc3RhdC0+YW50ZW5uYSA9IDM7CisvLwlzdGF0LT5tYWN0aW1lID0gYmUzMl90b19jcHUoaGRyLT50aW1lX3N0YW1wKTsKKy8vCXN0YXQtPmNoYW5uZWwgPSBwcml2LT5jaGFubmVsOworCit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjb21iaW5lX2hkcl9mcmFnKHN0cnVjdCBpZWVlODAyMTFfaGRyICppZWVlaGRyLAorCQkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXUxNiBmY3RsOworCXVuc2lnbmVkIGludCBoZHJsZW47CisKKwlmY3RsID0gbGUxNl90b19jcHUoaWVlZWhkci0+ZnJhbWVfY29udHJvbCk7CisJaGRybGVuID0gaWVlZTgwMjExX2hkcmxlbihmY3RsKTsKKwkvKiBGSVhNRSAqLworCWlmIChoZHJsZW4gPCAoMisyKzYpLyptaW5pbXVtIGhkciovIHx8CisJICAgIGhkcmxlbiA+IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX21nbXQpKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggImhkciBsZW4gaXMgJWRcbiIsIGhkcmxlbik7CisJCWFnbnhfYnVnKCJXcm9uZyBpZWVlODAyMTEgaGRyIGRldGVjdGVkIik7CisJfQorCXNrYl9wdXNoKHNrYiwgaGRybGVuKTsKKwltZW1jcHkoc2tiLT5kYXRhLCBpZWVlaGRyLCBoZHJsZW4pOworfSAvKiBjb21iaW5lX2hkcl9mcmFnICovCisKK3N0YXRpYyBpbmxpbmUgaW50IGFnbnhfcGFja2V0X2NoZWNrKHN0cnVjdCBhZ254X3ByaXYgKnByaXYsIHN0cnVjdCBhZ254X2hkciAqYWdueGhkciwKKwkJCQkgICAgdW5zaWduZWQgcGFja2V0X2xlbikKK3sKKwlpZiAoYWdueF9nZXRfYml0cyhDUkNfRkFJTCwgQ1JDX0ZBSUxfU0hJRlQsIGJlMzJfdG9fY3B1KGFnbnhoZHItPnJlZzEpKSA9PSAxKXsKKwkJcHJpbnRrKFBGWCAiUlg6IENSQyBjaGVjayBmYWlsXG4iKTsKKwkJZ290byBkcm9wOworCX0KKwlpZiAocGFja2V0X2xlbiA+IDIwNDgpIHsKKwkJcHJpbnRrKFBGWCAiUlg6IFRvbyBsb25nIHBhY2tldCBkZXRlY3RlZFxuIik7CisJCWdvdG8gZHJvcDsKKwl9CisKKwkvKiBGSVhNRSBKdXN0IHVzYWJsZSBmb3IgUHJvbWlvdXMgTW9kZSwgZm9yIE1hbmFnZSBtb2RlIGV4Y2x1ZGUgRkNTICovCisvKiAJaWYgKHBhY2tldF9sZW4gLSBzaXplb2YoKmFnbnhoZHIpIDwgRkNTX0xFTikgeyAqLworLyogCQlwcmludGsoUEZYICJSWDogVG9vIHNob3J0IHBhY2tldCBkZXRlY3RlZFxuIik7ICovCisvKiAJCWdvdG8gZHJvcDsgKi8KKy8qIAl9ICovCisJcmV0dXJuIDA7Citkcm9wOgorCXByaXYtPnN0YXRzLmRvdDExRkNTRXJyb3JDb3VudCsrOworCXJldHVybiAtMTsKK30KKwordm9pZCBoYW5kbGVfcnhfaXJxKHN0cnVjdCBhZ254X3ByaXYgKnByaXYpCit7CisJc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0dXMgc3RhdHVzOworCXVuc2lnbmVkIGludCBsZW47CisvLwlBR05YX1RSQUNFOworCisJZG8geworCQlzdHJ1Y3QgYWdueF9kZXNjICpkZXNjOworCQl1MzIgZnJhZzsKKwkJc3RydWN0IGFnbnhfaW5mbyAqaW5mbzsKKwkJc3RydWN0IGFnbnhfaGRyICpoZHI7CisJCXN0cnVjdCBza19idWZmICpza2I7CisJCXVuc2lnbmVkIGludCBpID0gcHJpdi0+cnguaWR4ICUgcHJpdi0+cnguc2l6ZTsKKworCQlkZXNjID0gcHJpdi0+cnguZGVzYyArIGk7CisJCWZyYWcgPSBiZTMyX3RvX2NwdShkZXNjLT5mcmFnKTsKKwkJaWYgKGZyYWcgJiBPV05FUikKKwkJCWJyZWFrOworCisJCWluZm8gPSBwcml2LT5yeC5pbmZvICsgaTsKKwkJc2tiID0gaW5mby0+c2tiOworCQloZHIgPSAoc3RydWN0IGFnbnhfaGRyICopKHNrYi0+ZGF0YSk7CisKKwkJbGVuID0gKGZyYWcgJiBQQUNLRVRfTEVOKSA+PiBQQUNLRVRfTEVOX1NISUZUOworCQlpZiAoYWdueF9wYWNrZXRfY2hlY2socHJpdiwgaGRyLCBsZW4pID09IC0xKSB7CisgCQkJcnhfZGVzY19yZXVzaW5nKHByaXYsIGkpOworCQkJY29udGludWU7CisJCX0KKwkJc2tiX3B1dChza2IsIGxlbik7CisKKwkJZG8geworCQkJdTE2IGZjdGw7CisJCQlmY3RsID0gbGUxNl90b19jcHUoKChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKWhkci0+bWFjX2hkciktPmZyYW1lX2NvbnRyb2wpOworCQkJaWYgKChmY3RsICYgSUVFRTgwMjExX0ZDVExfU1RZUEUpICE9IElFRUU4MDIxMV9TVFlQRV9CRUFDT04pLy8gJiYgIShmY3RsICYgSUVFRTgwMjExX1NUWVBFX0JFQUNPTikpCisJCQkJZHVtcF9pZWVlODAyMTFfaGRyKChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKWhkci0+bWFjX2hkciwgIlJYIik7CisJCX0gd2hpbGUgKDApOworCisJCWlmIChoZHItPl8xMWIwICYmICFoZHItPl8xMWcwKSB7CisvKiAJCQlpbnQgajsgKi8KKy8qIAkJCXUxNiBmY3RsID0gbGUxNl90b19jcHUoKChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKWhkci0+bWFjX2hkcikgKi8KKy8qIAkJCQkJICAgICAgIC0+ZnJhbWVfY29udHJvbCk7ICovCisvKiAJCQlpZiAoIChmY3RsICYgSUVFRTgwMjExX0ZDVExfRlRZUEUpID09ICBJRUVFODAyMTFfRlRZUEVfREFUQSkgeyAqLworLyogCQkJCWFnbnhfcHJpbnRfcnhfaGRyKGhkcik7ICovCisvLyAJCQkJYWdueF9wcmludF9zdGEocHJpdiwgQlNTSURfU1RBSUQpOworLyogCQkJCWZvciAoaiA9IDA7IGogPCA4OyBqKyspICovCisvKiAJCQkJCWFnbnhfcHJpbnRfc3RhX3R4X3dxKHByaXYsIEJTU0lEX1NUQUlELCBqKTsJCSAqLworLyogCQkJfSAqLworCisJCQlnZXRfcnhfc3RhdHMocHJpdiwgaGRyLCAmc3RhdHVzKTsKKwkJCXNrYl9wdWxsKHNrYiwgc2l6ZW9mKCpoZHIpKTsKKwkJCWNvbWJpbmVfaGRyX2ZyYWcoKHN0cnVjdCBpZWVlODAyMTFfaGRyICopaGRyLT5tYWNfaGRyLCBza2IpOworCQl9IGVsc2UgaWYgKCFoZHItPl8xMWIwICYmIGhkci0+XzExZzApIHsKKy8vCQkJaW50IGo7CisJCQlhZ254X3ByaW50X3J4X2hkcihoZHIpOworCQkJYWdueF9wcmludF9zdGEocHJpdiwgQlNTSURfU1RBSUQpOworLy8JCQlmb3IgKGogPSAwOyBqIDwgODsgaisrKQorCQkJYWdueF9wcmludF9zdGFfdHhfd3EocHJpdiwgQlNTSURfU1RBSUQsIDApOworCisJCQlwcmludF9oZXhfZHVtcF9ieXRlcygiYWdueDogUlhfUEFDS0VUOiAiLCBEVU1QX1BSRUZJWF9OT05FLAorCQkJCQkgICAgIHNrYi0+ZGF0YSwgc2tiLT5sZW4gKyA4KTsKKworLy8JCQlpZiAoYWdueF9wbGNwX2dldF9iaXRyYXRlX29mZG0oJmhkci0+XzExZzApID09IDApCisJCQlnZXRfcnhfc3RhdHMocHJpdiwgaGRyLCAmc3RhdHVzKTsKKwkJCXNrYl9wdWxsKHNrYiwgc2l6ZW9mKCpoZHIpKTsKKwkJCWNvbWJpbmVfaGRyX2ZyYWcoKHN0cnVjdCBpZWVlODAyMTFfaGRyICopCisJCQkJCSAoKHZvaWQgKikmaGRyLT5tYWNfaGRyKSwgc2tiKTsKKy8vCQkJZHVtcF9pZWVlODAyMTFfaGRyKChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKXNrYi0+ZGF0YSwgIlJYIEciKTsKKwkJfSBlbHNlCisJCQlhZ254X2J1ZygiVW5rbm93biBwYWNrZXRzIHR5cGUiKTsKKwkJaWVlZTgwMjExX3J4X2lycXNhZmUocHJpdi0+aHcsIHNrYiwgJnN0YXR1cyk7CisJCXJ4X2Rlc2NfcmVpbml0KHByaXYsIGkpOworCisJfSB3aGlsZSAoIHByaXYtPnJ4LmlkeCsrICk7Cit9IC8qIGhhbmRsZV9yeF9pcnEgKi8KKworc3RhdGljIGlubGluZSB2b2lkIGhhbmRsZV90eF9pcnEoc3RydWN0IGFnbnhfcHJpdiAqcHJpdiwgc3RydWN0IGFnbnhfcmluZyAqcmluZykKK3sKKwlzdHJ1Y3QgYWdueF9kZXNjICpkZXNjOworCXN0cnVjdCBhZ254X2luZm8gKmluZm87CisJdW5zaWduZWQgaW50IGlkeDsKKworCWZvciAoaWR4ID0gcmluZy0+aWR4X3NlbnQ7IGlkeCA8IHJpbmctPmlkeDsgaWR4KyspIHsKKwkJdW5zaWduZWQgaW50IGkgPSBpZHggJSByaW5nLT5zaXplOworCQl1MzIgIGZyYWc7CisKKwkJZGVzYyA9IHJpbmctPmRlc2MgKyBpOworCQlpbmZvID0gcmluZy0+aW5mbyArIGk7CisKKwkJZnJhZyA9IGJlMzJfdG9fY3B1KGRlc2MtPmZyYWcpOworCQlpZiAoZnJhZyAmIE9XTkVSKSB7CisJCQlpZiAoaW5mby0+dHlwZSA9PSBIRUFERVIpCisJCQkJYnJlYWs7CisJCQllbHNlCisJCQkJYWdueF9idWcoIlRYIGVycm9yIik7CisJCX0KKworCQlwY2lfdW5tYXBfc2luZ2xlKHByaXYtPnBkZXYsIGluZm8tPm1hcHBpbmcsIGluZm8tPmRtYV9sZW4sIFBDSV9ETUFfVE9ERVZJQ0UpOworCisJCWRvIHsKKy8vCQkJaW50IGo7CisJCQlzaXplX3QgbGVuOworCQkJbGVuID0gaW5mby0+c2tiLT5sZW4gLSBzaXplb2Yoc3RydWN0IGFnbnhfaGRyKSArIGluZm8tPmhkcl9sZW47CisJCQkvLwlpZiAobGVuID09IDYxNCkgeworLy8JCQkJYWdueF9wcmludF9kZXNjKGRlc2MpOworCQkJCWlmIChpbmZvLT50eXBlID09IFBBQ0tFVCkgeworLy8JCQkJCWFnbnhfcHJpbnRfdHhfaGRyKChzdHJ1Y3QgYWdueF9oZHIgKilpbmZvLT5za2ItPmRhdGEpOworLyogCQkJCQlhZ254X3ByaW50X3N0YV9wb3dlcihwcml2LCBMT0NBTF9TVEFJRCk7ICovCisvKiAJCQkJCWFnbnhfcHJpbnRfc3RhKHByaXYsIExPQ0FMX1NUQUlEKTsgKi8KKy8qIC8vCQkJCQlmb3IgKGogPSAwOyBqIDwgODsgaisrKSAqLworLyogCQkJCQlhZ254X3ByaW50X3N0YV90eF93cShwcml2LCBMT0NBTF9TVEFJRCwgMCk7ICovCisvLwkJCQkJYWdueF9wcmludF9zdGFfcG93ZXIocHJpdiwgQlNTSURfU1RBSUQpOworLy8JCQkJCWFnbnhfcHJpbnRfc3RhKHByaXYsIEJTU0lEX1NUQUlEKTsKKy8vCQkJCQlmb3IgKGogPSAwOyBqIDwgODsgaisrKQorLy8JCQkJCWFnbnhfcHJpbnRfc3RhX3R4X3dxKHByaXYsIEJTU0lEX1NUQUlELCAwKTsKKwkJCQl9CisvLwkJCX0KKwkJfSB3aGlsZSAoMCk7CisKKwkJaWYgKGluZm8tPnR5cGUgPT0gUEFDS0VUKSB7CisvLwkJCWR1bXBfdHhtX3JlZ2lzdGVycyhwcml2KTsKKy8vCQkJZHVtcF9yeG1fcmVnaXN0ZXJzKHByaXYpOworLy8JCQlkdW1wX2JtX3JlZ2lzdGVycyhwcml2KTsKKy8vCQkJZHVtcF9jaXJfcmVnaXN0ZXJzKHByaXYpOworCQl9CisKKwkJaWYgKGluZm8tPnR5cGUgPT0gUEFDS0VUKSB7CisvLwkJCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHI7CisJCQlzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKnR4aSA9IElFRUU4MDIxMV9TS0JfQ0IoaW5mby0+c2tiKTsKKworCQkJc2tiX3B1bGwoaW5mby0+c2tiLCBzaXplb2Yoc3RydWN0IGFnbnhfaGRyKSk7CisJCQltZW1jcHkoc2tiX3B1c2goaW5mby0+c2tiLCBpbmZvLT5oZHJfbGVuKSwgJmluZm8tPmhkciwgaW5mby0+aGRyX2xlbik7CisKKy8vCQkJZHVtcF9pZWVlODAyMTFfaGRyKChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKWluZm8tPnNrYi0+ZGF0YSwgIlRYX0hBTkRMRSIpOworLyogCQkJcHJpbnRfaGV4X2R1bXBfYnl0ZXMoImFnbng6IFRYX0hBTkRMRTogIiwgRFVNUF9QUkVGSVhfTk9ORSwgKi8KKy8qIAkJCQkJICAgICBpbmZvLT5za2ItPmRhdGEsIGluZm8tPnNrYi0+bGVuKTsgKi8KKworCQkJaWYgKCEodHhpLT5mbGFncyAmIElFRUU4MDIxMV9UWF9DVExfTk9fQUNLKSkKKwkJCQl0eGktPmZsYWdzIHw9IElFRUU4MDIxMV9UWF9TVEFUX0FDSzsKKworCQkJaWVlZTgwMjExX3R4X3N0YXR1c19pcnFzYWZlKHByaXYtPmh3LCBpbmZvLT5za2IpOworCisKKy8qIAkJCQlpbmZvLT50eF9zdGF0dXMucXVldWVfbnVtYmVyID0gKHJpbmctPnNpemUgLSBpKSAvIDI7ICovCisvKiAJCQkJaWVlZTgwMjExX3R4X3N0YXR1c19pcnFzYWZlKHByaXYtPmh3LCBpbmZvLT5za2IsICYoaW5mby0+dHhfc3RhdHVzKSk7ICovCisvKiAJCQl9IGVsc2UgKi8KKy8qIAkJCQlkZXZfa2ZyZWVfc2tiX2lycShpbmZvLT5za2IpOyAqLworIAkJfQorCQltZW1zZXQoZGVzYywgMCwgc2l6ZW9mKCpkZXNjKSk7CisJCW1lbXNldChpbmZvLCAwLCBzaXplb2YoKmluZm8pKTsKKwl9CisKKwlyaW5nLT5pZHhfc2VudCA9IGlkeDsKKwkvKiBUT0RPIGZpbGwgdGhlIHByaXYtPmxvd19sZXZlbF9zdGF0cyAqLworCisJLyogaWVlZTgwMjExX3dha2VfcXVldWUocHJpdi0+aHcsIDApOyAqLworfQorCit2b2lkIGhhbmRsZV90eG1faXJxKHN0cnVjdCBhZ254X3ByaXYgKnByaXYpCit7CisJaGFuZGxlX3R4X2lycShwcml2LCAmcHJpdi0+dHhtKTsKK30KKwordm9pZCBoYW5kbGVfdHhkX2lycShzdHJ1Y3QgYWdueF9wcml2ICpwcml2KQoreworCWhhbmRsZV90eF9pcnEocHJpdiwgJnByaXYtPnR4ZCk7Cit9CisKK3ZvaWQgaGFuZGxlX290aGVyX2lycShzdHJ1Y3QgYWdueF9wcml2ICpwcml2KQoreworLy8Jdm9pZCBfX2lvbWVtICpjdGwgPSBwcml2LT5jdGw7CisJdTMyIHN0YXR1cyA9IHByaXYtPmlycV9zdGF0dXM7CisJdm9pZCBfX2lvbWVtICpjdGwgPSBwcml2LT5jdGw7CisJdTMyIHJlZzsKKworCWlmIChzdGF0dXMgJiBJUlFfVFhfQkVBQ09OKSB7CisJCWlvd3JpdGUzMihJUlFfVFhfQkVBQ09OLCBjdGwgKyBBR05YX0lOVF9TVEFUKTsKKwkJcHJpbnRrKFBGWCAiSVJROiBUWCBCZWFjb24gY29udHJvbCBpcyAwWCUuOFhcbiIsIGlvcmVhZDMyKGN0bCArIEFHTlhfVFhNX0JFQUNPTl9DVEwpKTsKKwkJcHJpbnRrKFBGWCAiSVJROiBUWCBCZWFjb24gcnggZnJhbWUgbnVtOiAlZFxuIiwgcnhfZnJhbWVfY250KTsKKwl9CisJaWYgKHN0YXR1cyAmIElSUV9UWF9SRVRSWSkgeworCQlyZWcgPSBpb3JlYWQzMihjdGwgKyBBR05YX1RYTV9SRVRSWVNUQUlEKTsKKwkJcHJpbnRrKFBGWCAiSVJROiBUWCBSZXRyeSwgUkVUUlkgU1RBIElEIGlzICV4XG4iLCByZWcpOworCX0KKwlpZiAoc3RhdHVzICYgSVJRX1RYX0FDVElWSVRZKQorCQlwcmludGsoUEZYICJJUlE6IFRYIEFjdGl2aXR5XG4iKTsKKwlpZiAoc3RhdHVzICYgSVJRX1JYX0FDVElWSVRZKQorCQlwcmludGsoUEZYICJJUlE6IFJYIEFjdGl2aXR5XG4iKTsKKwlpZiAoc3RhdHVzICYgSVJRX1JYX1gpCisJCXByaW50ayhQRlggIklSUTogUlggWFxuIik7CisJaWYgKHN0YXR1cyAmIElSUV9SWF9ZKSB7CisJCXJlZyA9IGlvcmVhZDMyKGN0bCArIEFHTlhfSU5UX01BU0spOworCQlyZWcgJj0gfklSUV9SWF9ZOworCQlpb3dyaXRlMzIocmVnLCBjdGwgKyBBR05YX0lOVF9NQVNLKTsKKwkJaW93cml0ZTMyKElSUV9SWF9ZLCBjdGwgKyBBR05YX0lOVF9TVEFUKTsKKwkJcHJpbnRrKFBGWCAiSVJROiBSWCBZXG4iKTsKKwl9CisJaWYgKHN0YXR1cyAmIElSUV9SWF9IQVNISElUKSAgeworCQlyZWcgPSBpb3JlYWQzMihjdGwgKyBBR05YX0lOVF9NQVNLKTsKKwkJcmVnICY9IH5JUlFfUlhfSEFTSEhJVDsKKwkJaW93cml0ZTMyKHJlZywgY3RsICsgQUdOWF9JTlRfTUFTSyk7CisJCWlvd3JpdGUzMihJUlFfUlhfSEFTSEhJVCwgY3RsICsgQUdOWF9JTlRfU1RBVCk7CisJCXByaW50ayhQRlggIklSUTogUlggSGFzaCBIaXRcbiIpOworCisJfQorCWlmIChzdGF0dXMgJiBJUlFfUlhfRlJBTUUpIHsKKwkJcmVnID0gaW9yZWFkMzIoY3RsICsgQUdOWF9JTlRfTUFTSyk7CisJCXJlZyAmPSB+SVJRX1JYX0ZSQU1FOworCQlpb3dyaXRlMzIocmVnLCBjdGwgKyBBR05YX0lOVF9NQVNLKTsKKwkJaW93cml0ZTMyKElSUV9SWF9GUkFNRSwgY3RsICsgQUdOWF9JTlRfU1RBVCk7CisJCXByaW50ayhQRlggIklSUTogUlggRnJhbWVcbiIpOworIAkJcnhfZnJhbWVfY250Kys7CisJfQorCWlmIChzdGF0dXMgJiBJUlFfRVJSX0lOVCkgeworCQlpb3dyaXRlMzIoSVJRX0VSUl9JTlQsIGN0bCArIEFHTlhfSU5UX1NUQVQpOworLy8JCWFnbnhfaHdfcmVzZXQocHJpdik7CisJCXByaW50ayhQRlggIklSUTogRXJyb3IgSW50ZXJydXB0XG4iKTsKKwl9CisJaWYgKHN0YXR1cyAmIElSUV9UWF9RVUVfRlVMTCkKKwkJcHJpbnRrKFBGWCAiSVJROiBUWCBXb3JrcXVldWUgRnVsbFxuIik7CisJaWYgKHN0YXR1cyAmIElSUV9CQU5ETUFOX0VSUikKKwkJcHJpbnRrKFBGWCAiSVJROiBCYW5kd2lkdGggTWFuYWdlbWVudCBFcnJvclxuIik7CisJaWYgKHN0YXR1cyAmIElSUV9UWF9ESVNBQkxFKQorCQlwcmludGsoUEZYICJJUlE6IFRYIERpc2FibGVcbiIpOworCWlmIChzdGF0dXMgJiBJUlFfUlhfSVZBU0VTS0VZKQorCQlwcmludGsoUEZYICJJUlE6IFJYIEludmFsaWQgU2Vzc2lvbiBLZXlcbiIpOworCWlmIChzdGF0dXMgJiBJUlFfUkVQX1RISElUKQorCQlwcmludGsoUEZYICJJUlE6IFJlcGxheSBUaHJlc2hvbGQgSGl0XG4iKTsKKwlpZiAoc3RhdHVzICYgSVJRX1RJTUVSMSkKKwkJcHJpbnRrKFBGWCAiSVJROiBUaW1lcjFcbiIpOworCWlmIChzdGF0dXMgJiBJUlFfVElNRVJfQ05UKQorCQlwcmludGsoUEZYICJJUlE6IFRpbWVyIENvdW50XG4iKTsKKwlpZiAoc3RhdHVzICYgSVJRX1BIWV9GQVNUSU5UKQorCQlwcmludGsoUEZYICJJUlE6IFBoeSBGYXN0IEludGVycnVwdFxuIik7CisJaWYgKHN0YXR1cyAmIElSUV9QSFlfU0xPV0lOVCkKKwkJcHJpbnRrKFBGWCAiSVJROiBQaHkgU2xvdyBJbnRlcnJ1cHRcbiIpOworCWlmIChzdGF0dXMgJiBJUlFfT1RIRVIpCisJCXByaW50ayhQRlggIklSUTogMHg4MDAwMDAwMFxuIik7Cit9IC8qIGhhbmRsZV9vdGhlcl9pcnEgKi8KKworCitzdGF0aWMgaW5saW5lIHZvaWQgcm91dGVfZmxhZ19zZXQoc3RydWN0IGFnbnhfaGRyICp0eGhkcikKK3sKKy8vCXUzMiByZWcgPSAwOworCisJLyogRklYTUUgKi8KKy8qICAJcmVnID0gKDB4NyA8PCBST1VURV9DT01QUkVTU0lPTl9TSElGVCkgJiBST1VURV9DT01QUkVTU0lPTjsgKi8KKy8qIAl0eGhkci0+cmVnNSA9IGNwdV90b19iZTMyKHJlZyk7ICovCisgCXR4aGRyLT5yZWc1ID0gKDB4YSA8PCAweDApIHwgKDB4NyA8PCAweDE4KTsKKy8vIAl0eGhkci0+cmVnNSA9IGNwdV90b19iZTMyKCgweGEgPDwgMHgwKSB8ICgweDcgPDwgMHgxOCkpOworLy8gCXR4aGRyLT5yZWc1ID0gY3B1X3RvX2JlMzIoMHg3IDw8IDB4MCk7Cit9CisKKy8qIFJldHVybiAwIGlmIG5vIG1hdGNoICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBnZXRfcG93ZXJfbGV2ZWwodW5zaWduZWQgaW50IHJhdGUsIHVuc2lnbmVkIGludCBhbnRlbm5hc19udW0pCit7CisJdW5zaWduZWQgaW50IHBvd2VyX2xldmVsOworCisJc3dpdGNoIChyYXRlKSB7CisJY2FzZSAxMDoKKwljYXNlIDIwOgorCWNhc2UgNTU6CisJY2FzZSA2MDoKKwljYXNlIDkwOgorCWNhc2UgMTIwOiBwb3dlcl9sZXZlbCA9IDIyOyBicmVhazsKKwljYXNlIDE4MDogcG93ZXJfbGV2ZWwgPSAxOTsgYnJlYWs7CisJY2FzZSAyNDA6IHBvd2VyX2xldmVsID0gMTg7IGJyZWFrOworCWNhc2UgMzYwOiBwb3dlcl9sZXZlbCA9IDE2OyBicmVhazsKKwljYXNlIDQ4MDogcG93ZXJfbGV2ZWwgPSAxNTsgYnJlYWs7CisJY2FzZSA1NDA6IHBvd2VyX2xldmVsID0gMTQ7IGJyZWFrOworCWRlZmF1bHQ6CisJCWFnbnhfYnVnKCJFcnJvciByYXRlIHNldHRpbmdcbiIpOworCX0KKworCWlmIChwb3dlcl9sZXZlbCAmJiAoYW50ZW5uYXNfbnVtID09IDIpKQorCQlwb3dlcl9sZXZlbCAtPSAzOworCisJcmV0dXJuIHBvd2VyX2xldmVsOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZmlsbF9hZ254X2hkcihzdHJ1Y3QgYWdueF9wcml2ICpwcml2LCBzdHJ1Y3QgYWdueF9pbmZvICp0eF9pbmZvKQoreworCXN0cnVjdCBhZ254X2hkciAqdHhoZHIgPSAoc3RydWN0IGFnbnhfaGRyICopdHhfaW5mby0+c2tiLT5kYXRhOworCXNpemVfdCBsZW47CisJdTE2IGZjID0gbGUxNl90b19jcHUoKihfX2xlMTYgKikmdHhfaW5mby0+aGRyKTsKKwl1MzIgcmVnOworCisJbWVtc2V0KHR4aGRyLCAwLCBzaXplb2YoKnR4aGRyKSk7CisKKy8vCXJlZyA9IGFnbnhfc2V0X2JpdHMoU1RBVElPTl9JRCwgU1RBVElPTl9JRF9TSElGVCwgTE9DQUxfU1RBSUQpOworCXJlZyA9IGFnbnhfc2V0X2JpdHMoU1RBVElPTl9JRCwgU1RBVElPTl9JRF9TSElGVCwgQlNTSURfU1RBSUQpOworCXJlZyB8PSBhZ254X3NldF9iaXRzKFdPUktRVUVVRV9JRCwgV09SS1FVRVVFX0lEX1NISUZULCAwKTsKKwl0eGhkci0+cmVnNCA9IGNwdV90b19iZTMyKHJlZyk7CisKKwkvKiBTZXQgdGhlIEhhcmR3YXJlIFNlcXVlbmNlIE51bWJlciB0byAxPyAqLworCXJlZyA9IGFnbnhfc2V0X2JpdHMoU0VRVUVOQ0VfTlVNQkVSLCBTRVFVRU5DRV9OVU1CRVJfU0hJRlQsIDApOworLy8JcmVnID0gYWdueF9zZXRfYml0cyhTRVFVRU5DRV9OVU1CRVIsIFNFUVVFTkNFX05VTUJFUl9TSElGVCwgMSk7CisJcmVnIHw9IGFnbnhfc2V0X2JpdHMoTUFDX0hEUl9MRU4sIE1BQ19IRFJfTEVOX1NISUZULCB0eF9pbmZvLT5oZHJfbGVuKTsKKwl0eGhkci0+cmVnMSA9IGNwdV90b19iZTMyKHJlZyk7CisJLyogU2V0IHRoZSBhZ254X2hkcidzIE1BQyBoZWFkZXIgKi8KKwltZW1jcHkodHhoZHItPm1hY19oZHIsICZ0eF9pbmZvLT5oZHIsIHR4X2luZm8tPmhkcl9sZW4pOworCisJcmVnID0gYWdueF9zZXRfYml0cyhBQ0ssIEFDS19TSElGVCwgMSk7CisvLwlyZWcgPSBhZ254X3NldF9iaXRzKEFDSywgQUNLX1NISUZULCAwKTsKKwlyZWcgfD0gYWdueF9zZXRfYml0cyhNVUxUSUNBU1QsIE1VTFRJQ0FTVF9TSElGVCwgMCk7CisvLwlyZWcgfD0gYWdueF9zZXRfYml0cyhNVUxUSUNBU1QsIE1VTFRJQ0FTVF9TSElGVCwgMSk7CisJcmVnIHw9IGFnbnhfc2V0X2JpdHMoUkVMQVksIFJFTEFZX1NISUZULCAwKTsKKwlyZWcgfD0gYWdueF9zZXRfYml0cyhUTSwgVE1fU0hJRlQsIDApOworCXR4aGRyLT5yZWcwID0gY3B1X3RvX2JlMzIocmVnKTsKKworCS8qIFNldCB0aGUgbG9uZyBhbmQgc2hvcnQgcmV0cnkgbGltaXRzICovCisgCXR4aGRyLT50eC5zaG9ydF9yZXRyeV9saW1pdCA9IHR4X2luZm8tPnR4aS0+Y29udHJvbC5yYXRlc1swXS5jb3VudDsKKyAJdHhoZHItPnR4LmxvbmdfcmV0cnlfbGltaXQgPSB0eF9pbmZvLT50eGktPmNvbnRyb2wucmF0ZXNbMF0uY291bnQ7CisKKwkvKiBGSVhNRSAqLworCWxlbiA9IHR4X2luZm8tPnNrYi0+bGVuIC0gc2l6ZW9mKCp0eGhkcikgKyB0eF9pbmZvLT5oZHJfbGVuICsgRkNTX0xFTjsKKwlpZiAoZmMgJiBJRUVFODAyMTFfRkNUTF9QUk9URUNURUQpCisJCWxlbiArPSA4OworCWxlbiA9IDIzOTg7CisJcmVnID0gYWdueF9zZXRfYml0cyhGUkFHX1NJWkUsIEZSQUdfU0laRV9TSElGVCwgbGVuKTsKKwlsZW4gPSB0eF9pbmZvLT5za2ItPmxlbiAtIHNpemVvZigqdHhoZHIpOworCXJlZyB8PSBhZ254X3NldF9iaXRzKFBBWUxPQURfTEVOLCBQQVlMT0FEX0xFTl9TSElGVCwgbGVuKTsKKwl0eGhkci0+cmVnMyA9IGNwdV90b19iZTMyKHJlZyk7CisKKwlyb3V0ZV9mbGFnX3NldCh0eGhkcik7Cit9IC8qIGZpbGxfaGRyICovCisKK3N0YXRpYyB2b2lkIHR4bV9wb3dlcl9zZXQoc3RydWN0IGFnbnhfcHJpdiAqcHJpdiwKKwkJCSAgc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICp0eGkpCit7CisJc3RydWN0IGFnbnhfc3RhX3Bvd2VyIHBvd2VyOworCXUzMiByZWc7CisKKwkvKiBGSVhNRSAqLworCWlmICh0eGktPmNvbnRyb2wucmF0ZXNbMF0uaWR4IDwgMCkgeworCQkvKiBGb3IgQiBtb2RlIFNob3J0IFByZWFtYmxlICovCisJCXJlZyA9IGFnbnhfc2V0X2JpdHMoUEhZX01PREUsIFBIWV9NT0RFX1NISUZULCBBR05YX01PREVfODAyMTFCX1NIT1JUKTsKKy8vCQljb250cm9sLT50eF9yYXRlID0gLWNvbnRyb2wtPnR4X3JhdGU7CisJfSBlbHNlCisJCXJlZyA9IGFnbnhfc2V0X2JpdHMoUEhZX01PREUsIFBIWV9NT0RFX1NISUZULCBBR05YX01PREVfODAyMTFHKTsKKy8vCQlyZWcgPSBhZ254X3NldF9iaXRzKFBIWV9NT0RFLCBQSFlfTU9ERV9TSElGVCwgQUdOWF9NT0RFXzgwMjExQl9MT05HKTsKKwlyZWcgfD0gYWdueF9zZXRfYml0cyhTSUdOQUwsIFNJR05BTF9TSElGVCwgMHhCKTsKKwlyZWcgfD0gYWdueF9zZXRfYml0cyhSQVRFLCBSQVRFX1NISUZULCAweEIpOworLy8JcmVnIHw9IGFnbnhfc2V0X2JpdHMoUE9XRVJfTEVWRUwsIFBPV0VSX0xFVkVMX1NISUZULCAxNSk7CisJcmVnIHw9IGFnbnhfc2V0X2JpdHMoUE9XRVJfTEVWRUwsIFBPV0VSX0xFVkVMX1NISUZULCAyMCk7CisJLyogaWYgcmF0ZSA8IDExTSBzZXQgaXQgdG8gMCAqLworCXJlZyB8PSBhZ254X3NldF9iaXRzKE5VTV9UUkFOU01JVFRFUlMsIE5VTV9UUkFOU01JVFRFUlNfU0hJRlQsIDEpOworLy8JcmVnIHw9IGFnbnhfc2V0X2JpdHMoRURDRiwgRURDRl9TSElGVCwgMSk7CisvLwlyZWcgfD0gYWdueF9zZXRfYml0cyhUSUZTLCBUSUZTX1NISUZULCAxKTsKKworCXBvd2VyLnJlZyA9IHJlZzsKKy8vCXBvd2VyLnJlZyA9IGNwdV90b19sZTMyKHJlZyk7CisKKy8vCXNldF9zdGFfcG93ZXIocHJpdiwgJnBvd2VyLCBMT0NBTF9TVEFJRCk7CisJc2V0X3N0YV9wb3dlcihwcml2LCAmcG93ZXIsIEJTU0lEX1NUQUlEKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgdHhfcGFja2V0X2NoZWNrKHN0cnVjdCBza19idWZmICpza2IpCit7CisJdW5zaWduZWQgaW50IGllZWVfbGVuID0gaWVlZTgwMjExX2dldF9oZHJsZW5fZnJvbV9za2Ioc2tiKTsKKwlpZiAoc2tiLT5sZW4gPiAyMDQ4KSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggImxlbmd0aCBpcyAlZFxuIiwgc2tiLT5sZW4pOworCQlhZ254X2J1ZygiVG9vIGxvbmcgVFggc2tiIik7CisJCXJldHVybiAtMTsKKwl9CisJLyogRklYTUUgKi8KKwlpZiAoc2tiLT5sZW4gPT0gaWVlZV9sZW4pIHsKKwkJcHJpbnRrKFBGWCAiQSBzdHJhbmdlIFRYIHBhY2tldFxuIik7CisJCXJldHVybiAtMTsKKwkJLyogdHhfZmFpbGVfaXJxc2FmZSgpOyAqLworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2FnbnhfdHgoc3RydWN0IGFnbnhfcHJpdiAqcHJpdiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJICAgICBzdHJ1Y3QgYWdueF9yaW5nICpyaW5nKQoreworCXN0cnVjdCBhZ254X2Rlc2MgKmhkcl9kZXNjLCAqZnJhZ19kZXNjOworCXN0cnVjdCBhZ254X2luZm8gKmhkcl9pbmZvLCAqZnJhZ19pbmZvOworCXN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqdHhpID0gSUVFRTgwMjExX1NLQl9DQihza2IpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaW50IGk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCisJLyogVGhlIFJYIGludGVycnVwdCBuZWVkIGJlIERpc2FibGUgdW50aWwgdGhpcyBUWCBwYWNrZXQKKwkgICBpcyBoYW5kbGVkIGluIHRoZSBuZXh0IHR4IGludGVycnVwdCAqLworCWRpc2FibGVfcnhfaW50ZXJydXB0KHByaXYpOworCisJaSA9IHJpbmctPmlkeDsKKwlyaW5nLT5pZHggKz0gMjsKKy8qICAgCWlmIChwcml2LT50eG1faWR4IC0gcHJpdi0+dHhtX2lkeF9zZW50ID09IEFHTlhfVFhNX1JJTkdfU0laRSAtIDIpICovCisvKiAJCWllZWU4MDIxMV9zdG9wX3F1ZXVlKHByaXYtPmh3LCAwKTsgKi8KKworCS8qIFNldCBhZ254IGhlYWRlcidzIGluZm8gYW5kIGRlc2MgKi8KKwlpICU9IHJpbmctPnNpemU7CisJaGRyX2Rlc2MgPSByaW5nLT5kZXNjICsgaTsKKwloZHJfaW5mbyA9IHJpbmctPmluZm8gKyBpOworCWhkcl9pbmZvLT5oZHJfbGVuID0gaWVlZTgwMjExX2dldF9oZHJsZW5fZnJvbV9za2Ioc2tiKTsKKwltZW1jcHkoJmhkcl9pbmZvLT5oZHIsIHNrYi0+ZGF0YSwgaGRyX2luZm8tPmhkcl9sZW4pOworCisJLyogQWRkIHRoZSBhZ254IGhlYWRlciB0byB0aGUgZnJvbnQgb2YgdGhlIFNLQiAqLworCXNrYl9wdXNoKHNrYiwgc2l6ZW9mKHN0cnVjdCBhZ254X2hkcikgLSBoZHJfaW5mby0+aGRyX2xlbik7CisKKwloZHJfaW5mby0+dHhpID0gdHhpOworCWhkcl9pbmZvLT5kbWFfbGVuID0gc2l6ZW9mKHN0cnVjdCBhZ254X2hkcik7CisJaGRyX2luZm8tPnNrYiA9IHNrYjsKKwloZHJfaW5mby0+dHlwZSA9IEhFQURFUjsKKwlmaWxsX2FnbnhfaGRyKHByaXYsIGhkcl9pbmZvKTsKKwloZHJfaW5mby0+bWFwcGluZyA9IHBjaV9tYXBfc2luZ2xlKHByaXYtPnBkZXYsIHNrYi0+ZGF0YSwKKwkJCQkJICAgaGRyX2luZm8tPmRtYV9sZW4sIFBDSV9ETUFfVE9ERVZJQ0UpOworCWRvIHsKKwkJdTMyIGZyYWcgPSAwOworCQlmcmFnIHw9IGFnbnhfc2V0X2JpdHMoRklSU1RfRlJBRywgRklSU1RfRlJBR19TSElGVCwgMSk7CisJCWZyYWcgfD0gYWdueF9zZXRfYml0cyhMQVNUX0ZSQUcsIExBU1RfRlJBR19TSElGVCwgMCk7CisJCWZyYWcgfD0gYWdueF9zZXRfYml0cyhQQUNLRVRfTEVOLCBQQUNLRVRfTEVOX1NISUZULCBza2ItPmxlbik7CisJCWZyYWcgfD0gYWdueF9zZXRfYml0cyhGSVJTVF9GUkFHX0xFTiwgRklSU1RfRlJBR19MRU5fU0hJRlQsIDEpOworCQlmcmFnIHw9IGFnbnhfc2V0X2JpdHMoT1dORVIsIE9XTkVSX1NISUZULCAxKTsKKwkJaGRyX2Rlc2MtPmZyYWcgPSBjcHVfdG9fYmUzMihmcmFnKTsKKwl9IHdoaWxlICgwKTsKKwloZHJfZGVzYy0+ZG1hX2FkZHIgPSBjcHVfdG9fYmUzMihoZHJfaW5mby0+bWFwcGluZyk7CisKKworCS8qIFNldCBGcmFnJ3MgaW5mbyBhbmQgZGVzYyAqLworCWkgPSAoaSArIDEpICUgcmluZy0+c2l6ZTsKKwlmcmFnX2Rlc2MgPSByaW5nLT5kZXNjICsgaTsKKwlmcmFnX2luZm8gPSByaW5nLT5pbmZvICsgaTsKKwltZW1jcHkoZnJhZ19pbmZvLCBoZHJfaW5mbywgc2l6ZW9mKHN0cnVjdCBhZ254X2luZm8pKTsKKwlmcmFnX2luZm8tPnR5cGUgPSBQQUNLRVQ7CisJZnJhZ19pbmZvLT5kbWFfbGVuID0gc2tiLT5sZW4gLSBoZHJfaW5mby0+ZG1hX2xlbjsKKwlmcmFnX2luZm8tPm1hcHBpbmcgPSBwY2lfbWFwX3NpbmdsZShwcml2LT5wZGV2LCBza2ItPmRhdGEgKyBoZHJfaW5mby0+ZG1hX2xlbiwKKwkJCQkJICAgIGZyYWdfaW5mby0+ZG1hX2xlbiwgUENJX0RNQV9UT0RFVklDRSk7CisJZG8geworCQl1MzIgZnJhZyA9IDA7CisJCWZyYWcgfD0gYWdueF9zZXRfYml0cyhGSVJTVF9GUkFHLCBGSVJTVF9GUkFHX1NISUZULCAwKTsKKwkJZnJhZyB8PSBhZ254X3NldF9iaXRzKExBU1RfRlJBRywgTEFTVF9GUkFHX1NISUZULCAxKTsKKwkJZnJhZyB8PSBhZ254X3NldF9iaXRzKFBBQ0tFVF9MRU4sIFBBQ0tFVF9MRU5fU0hJRlQsIHNrYi0+bGVuKTsKKwkJZnJhZyB8PSBhZ254X3NldF9iaXRzKFNVQl9GUkFHX0xFTiwgU1VCX0ZSQUdfTEVOX1NISUZULCBmcmFnX2luZm8tPmRtYV9sZW4pOworCQlmcmFnX2Rlc2MtPmZyYWcgPSBjcHVfdG9fYmUzMihmcmFnKTsKKwl9IHdoaWxlICgwKTsKKwlmcmFnX2Rlc2MtPmRtYV9hZGRyID0gY3B1X3RvX2JlMzIoZnJhZ19pbmZvLT5tYXBwaW5nKTsKKworCXR4bV9wb3dlcl9zZXQocHJpdiwgdHhpKTsKKworLyogCWRvIHsgKi8KKy8qIAkJaW50IGo7ICovCisvKiAJCXNpemVfdCBsZW47ICovCisvKiAJCWxlbiA9IHNrYi0+bGVuIC0gaGRyX2luZm8tPmRtYV9sZW4gKyBoZHJfaW5mby0+aGRyX2xlbjsgICovCisvKiAvLwkJaWYgKGxlbiA9PSA2MTQpIHsgKi8KKy8qIAkJCWFnbnhfcHJpbnRfZGVzYyhoZHJfZGVzYyk7ICovCisvKiAJCQlhZ254X3ByaW50X2Rlc2MoZnJhZ19kZXNjKTsgKi8KKy8qIAkJCWFnbnhfcHJpbnRfdHhfaGRyKChzdHJ1Y3QgYWdueF9oZHIgKilza2ItPmRhdGEpOyAqLworLyogCQkJYWdueF9wcmludF9zdGFfcG93ZXIocHJpdiwgTE9DQUxfU1RBSUQpOyAqLworLyogCQkJYWdueF9wcmludF9zdGEocHJpdiwgTE9DQUxfU1RBSUQpOyAqLworLyogCQkJZm9yIChqID0gMDsgaiA8IDg7IGorKykgKi8KKy8qIAkJCQlhZ254X3ByaW50X3N0YV90eF93cShwcml2LCBMT0NBTF9TVEFJRCwgaik7ICovCisvKiAJCQlhZ254X3ByaW50X3N0YV9wb3dlcihwcml2LCBCU1NJRF9TVEFJRCk7ICovCisvKiAJCQlhZ254X3ByaW50X3N0YShwcml2LCBCU1NJRF9TVEFJRCk7ICovCisvKiAJCQlmb3IgKGogPSAwOyBqIDwgODsgaisrKSAqLworLyogCQkJCWFnbnhfcHJpbnRfc3RhX3R4X3dxKHByaXYsIEJTU0lEX1NUQUlELCBqKTsgKi8KKy8qIAkJCS8vCX0gKi8KKy8qIAl9IHdoaWxlICgwKTsgKi8KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKworCS8qIEZJWE1FIHVnbHkgY29kZSAqLworCS8qIFRyaWdnZXIgVFhNICovCisJZG8geworCQl1MzIgcmVnOworCQlyZWcgPSAoaW9yZWFkMzIocHJpdi0+Y3RsICsgQUdOWF9DSVJfVFhNQ1RMKSk7CisJCXJlZyB8PSAweDg7CisJCWlvd3JpdGUzMigocmVnKSwgcHJpdi0+Y3RsICsgQUdOWF9DSVJfVFhNQ1RMKTsKKwl9d2hpbGUgKDApOworCisJLyogVHJpZ2dlciBUWEQgKi8KKwlkbyB7CisJCXUzMiByZWc7CisJCXJlZyA9IChpb3JlYWQzMihwcml2LT5jdGwgKyBBR05YX0NJUl9UWERDVEwpKTsKKwkJcmVnIHw9IDB4ODsKKwkJaW93cml0ZTMyKChyZWcpLCBwcml2LT5jdGwgKyBBR05YX0NJUl9UWERDVEwpOworCX13aGlsZSAoMCk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IF9hZ254X3R4KHN0cnVjdCBhZ254X3ByaXYgKnByaXYsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJdTE2IGZjdGw7CisKKwlpZiAodHhfcGFja2V0X2NoZWNrKHNrYikpCisJCXJldHVybiAwOworCisvKiAJcHJpbnRfaGV4X2R1bXBfYnl0ZXMoImFnbng6IFRYX1BBQ0tFVDogIiwgRFVNUF9QUkVGSVhfTk9ORSwgKi8KKy8qIAkJCSAgICAgc2tiLT5kYXRhLCBza2ItPmxlbik7ICovCisKKyAgICAgICAgZmN0bCA9IGxlMTZfdG9fY3B1KCooKF9fbGUxNiAqKXNrYi0+ZGF0YSkpOworCisJaWYgKCAoZmN0bCAmIElFRUU4MDIxMV9GQ1RMX0ZUWVBFKSAgPT0gSUVFRTgwMjExX0ZUWVBFX0RBVEEgKQorCQlyZXR1cm4gX19hZ254X3R4KHByaXYsIHNrYiwgJnByaXYtPnR4ZCk7CisJZWxzZQorCQlyZXR1cm4gX19hZ254X3R4KHByaXYsIHNrYiwgJnByaXYtPnR4bSk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYWdueC94bWl0LmggYi9kcml2ZXJzL3N0YWdpbmcvYWdueC94bWl0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTNhYzQxNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9hZ254L3htaXQuaApAQCAtMCwwICsxLDI1MCBAQAorI2lmbmRlZiBBR05YX1hNSVRfSF8KKyNkZWZpbmUgQUdOWF9YTUlUX0hfCisKKyNpbmNsdWRlIDxuZXQvbWFjODAyMTEuaD4KKworc3RydWN0IGFnbnhfcHJpdjsKKworc3RhdGljIGlubGluZSB1MzIgYWdueF9zZXRfYml0cyh1MzIgbWFzaywgdTggc2hpZnQsIHUzMiB2YWx1ZSkKK3sKKwlyZXR1cm4gKHZhbHVlIDw8IHNoaWZ0KSAmIG1hc2s7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIGFnbnhfZ2V0X2JpdHModTMyIG1hc2ssIHU4IHNoaWZ0LCB1MzIgdmFsdWUpCit7CisJcmV0dXJuICh2YWx1ZSAmIG1hc2spID4+IHNoaWZ0OworfQorCisKK3N0cnVjdCBhZ254X3J4IHsKKwlfX2JlMTYgcnhfcGFja2V0X2R1cmF0aW9uOyAvKiAgUlggUGFja2V0IER1cmF0aW9uICovCisJX19iZTE2IHJlcGxheV9jbnQ7CS8qIFJlcGxheSBDb3VudCAqLworfSBfX2F0dHJpYnV0ZV9fKChfX3BhY2tlZF9fKSk7CisKKworc3RydWN0IGFnbnhfdHggeworCXU4IGxvbmdfcmV0cnlfbGltaXQ7IC8qIExvbmcgUmV0cnkgTGltaXQgKi8KKwl1OCBzaG9ydF9yZXRyeV9saW1pdDsgLyogU2hvcnQgUmV0cnkgTGltaXQgKi8KKwl1OCBsb25nX3JldHJ5X2NudDsJLyogTG9uZyBSZXRyeSBDb3VudCAqLworCXU4IHNob3J0X3JldHJ5X2NudDsgLyogU2hvcnQgUmV0cnkgQ291bnQgKi8KK30gX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXykpOworCisKKy8qIENvcHkgZnJvbSBiY200M3h4ICovCisjZGVmaW5lIFA0RF9CWVQzUyhtYWdpYywgbnJfYnl0ZXMpICAgICAgdTggX19wNGRkaW5nIyNtYWdpY1tucl9ieXRlc10KKyNkZWZpbmUgUDREX0JZVEVTKGxpbmUsIG5yX2J5dGVzKSAgICAgICBQNERfQllUM1MobGluZSwgbnJfYnl0ZXMpCisjZGVmaW5lIFBBRF9CWVRFUyhucl9ieXRlcykgICAgICAgICAgICAgUDREX0JZVEVTKF9fTElORV9fLCBucl9ieXRlcykKKworI2RlZmluZSBQNERfQklUM1MobWFnaWMsIG5yX2JpdHMpICAgICAgIF9fYmUzMiBfX3BhZGRpbmcjI21hZ2ljOm5yX2JpdHMKKyNkZWZpbmUgUDREX0JJVFMobGluZSwgbnJfYml0cykgICAgICAgICBQNERfQklUM1MobGluZSwgbnJfYml0cykKKyNkZWZpbmUgUEFEX0JJVFMobnJfYml0cykJICAgICAgICBQNERfQklUUyhfX0xJTkVfXywgbnJfYml0cykKKworCitzdHJ1Y3QgYWdueF9oZHIgeworCV9fYmUzMiByZWcwOworI2RlZmluZSBSVFMJCSAgICAgICAgMHg4MDAwMDAwMCAvKiBSVFMgKi8KKyNkZWZpbmUgUlRTX1NISUZUCQkzMQorI2RlZmluZSBNVUxUSUNBU1QJICAgICAgICAweDQwMDAwMDAwIC8qIG11bHRpY2FzdCAqLworI2RlZmluZSBNVUxUSUNBU1RfU0hJRlQJCTMwCisjZGVmaW5lIEFDSwkJCTB4MzAwMDAwMDAgLyogQUNLICovCisjZGVmaW5lIEFDS19TSElGVAkJMjgKKyNkZWZpbmUgVE0JCQkweDA4MDAwMDAwIC8qIFRNICovCisjZGVmaW5lIFRNX1NISUZUCQkyNworI2RlZmluZSBSRUxBWQkJCTB4MDQwMDAwMDAgLyogUmVsYXkgKi8KKyNkZWZpbmUgUkVMQVlfU0hJRlQJCTI2CisvKiAJUEFEX0JJVFMoNCk7ICovCisjZGVmaW5lIFJFVklTRURfRkNTCQkweDAwMzgwMDAwIC8qIHJldmlzZWQgRkNTICovCisjZGVmaW5lIFJFVklTRURfRkNTX1NISUZUCTE5CisjZGVmaW5lIE5FWFRfQlVGRkVSX0FERFIJMHgwMDA3RkZGRiAvKiBOZXh0IEJ1ZmZlciBBZGRyZXNzICovCisjZGVmaW5lIE5FWFRfQlVGRkVSX0FERFJfU0hJRlQJMAorCisJX19iZTMyIHJlZzE7CisjZGVmaW5lIE1BQ19IRFJfTEVOCQkweEZDMDAwMDAwIC8qIE1BQyBIZWFkZXIgTGVuZ3RoICAqLworI2RlZmluZSBNQUNfSERSX0xFTl9TSElGVAkyNgorI2RlZmluZSBEVVJBVElPTl9PVkVSSURFCTB4MDIwMDAwMDAgLyogRHVyYXRpb24gT3ZlcnJpZGUgKi8KKyNkZWZpbmUgRFVSQVRJT05fT1ZFUklERV9TSElGVAkyNQorI2RlZmluZSBQSFlfSERSX09WRVJJREUJCTB4MDEwMDAwMDAgLyogUEhZIEhlYWRlciBPdmVycmlkZSAqLworI2RlZmluZSBQSFlfSERSX09WRVJJREVfU0hJRlQJMjQKKyNkZWZpbmUgQ1JDX0ZBSUwJCTB4MDA4MDAwMDAgLyogQ1JDIGZhaWwgKi8KKyNkZWZpbmUgQ1JDX0ZBSUxfU0hJRlQJCTIzCisvKglQQURfQklUUygxKTsgKi8KKyNkZWZpbmUgU0VRVUVOQ0VfTlVNQkVSCQkweDAwMjAwMDAwIC8qIFNlcXVlbmNlIE51bWJlciAqLworI2RlZmluZSBTRVFVRU5DRV9OVU1CRVJfU0hJRlQJMjEKKy8qCVBBRF9CSVRTKDIpOyAqLworI2RlZmluZSBCVUZGX0hFQURfQUREUgkJMHgwMDA3RkZGRiAvKiBCdWZmZXIgSGVhZCBBZGRyZXNzICovCisjZGVmaW5lIEJVRkZfSEVBRF9BRERSX1NISUZUCTAKKworCV9fYmUzMiByZWcyOworI2RlZmluZSBQRFVfQ09VTlQJCTB4RkMwMDAwMDAgLyogUERVIENvdW50ICovCisjZGVmaW5lIFBEVV9DT1VOVF9TSElGVAkJMjYKKy8qIAlQQURfQklUUygzKTsgKi8KKyNkZWZpbmUgV0VQX0tFWQkJCTB4MDA2MDAwMDAgLyogV0VQIEtleSAjICovCisjZGVmaW5lIFdFUF9LRVlfU0hJRlQJCTIxCisjZGVmaW5lIFVTRVNfV0VQX0tFWQkJMHgwMDEwMDAwMCAvKiBVc2VzIFdFUCBLZXkgKi8KKyNkZWZpbmUgVVNFU19XRVBfS0VZX1NISUZUCTIwCisjZGVmaW5lIEtFRVBfQUxJVkUJCTB4MDAwODAwMDAgLyogS2VlcCBhbGl2ZSAqLworI2RlZmluZSBLRUVQX0FMSVZFX1NISUZUCTE5CisjZGVmaW5lIEJVRkZfVEFJTF9BRERSCQkweDAwMDdGRkZGIC8qIEJ1ZmZlciBUYWlsIEFkZHJlc3MgKi8KKyNkZWZpbmUgQlVGRl9UQUlMX0FERFJfU0hJRlQJMAorCisJX19iZTMyIHJlZzM7CisjZGVmaW5lIENUU18xMUcJCQkweDgwMDAwMDAwCS8qIENUUyBpbiAxMWcgKi8KKyNkZWZpbmUgQ1RTXzExR19TSElGVAkJMzEKKyNkZWZpbmUgUlRTXzExRwkJCTB4NDAwMDAwMDAJLyogUlRTIGluIDExZyAqLworI2RlZmluZSBSVFNfMTFHX1NISUZUCQkzMAorLyogUEFEX0JJVFMoMik7ICovCisjZGVmaW5lIEZSQUdfU0laRQkJMHgwRkZGMDAwMAkvKiBmcmFnbWVudCBzaXplICovCisjZGVmaW5lIEZSQUdfU0laRV9TSElGVAkJMTYKKyNkZWZpbmUgUEFZTE9BRF9MRU4JCTB4MDAwMEZGRjAJLyogcGF5bG9hZCBsZW5ndGggKi8KKyNkZWZpbmUgUEFZTE9BRF9MRU5fU0hJRlQJNAorI2RlZmluZSBGUkFHX05VTQkJMHgwMDAwMDAwRgkvKiBudW1iZXIgb2YgZnJhZ3MgKi8KKyNkZWZpbmUgRlJBR19OVU1fU0hJRlQJCTAKKworCV9fYmUzMiByZWc0OworLyogCVBBRF9CSVRTKDQpOyAqLworI2RlZmluZSBSRUxBWV9TVEFJRAkJMHgwRkZGMDAwMCAvKiByZWxheVN0YWxkICovCisjZGVmaW5lIFJFTEFZX1NUQUlEX1NISUZUCTE2CisjZGVmaW5lIFNUQVRJT05fSUQJCTB4MDAwMEZGRjAgLyogU3RhdGlvbiBJRCAqLworI2RlZmluZSBTVEFUSU9OX0lEX1NISUZUCTQKKyNkZWZpbmUgV09SS1FVRVVFX0lECQkweDAwMDAwMDBGIC8qIFdvcmtxdWV1ZSBJRCAqLworI2RlZmluZSBXT1JLUVVFVUVfSURfU0hJRlQJMAorCisJLyogRklYTUUgdGhpcyByZWdpc3RlciBtYXliZSBpcyBMRT8gKi8KKwlfX2JlMzIgcmVnNTsKKy8qIAlQQURfQklUUyg0KTsgKi8KKyNkZWZpbmUgUk9VVEVfSE9TVAkJMHgwRjAwMDAwMAorI2RlZmluZSBST1VURV9IT1NUX1NISUZUCTI0CisjZGVmaW5lIFJPVVRFX0NBUkRfQ1BVCQkweDAwRjAwMDAwCisjZGVmaW5lIFJPVVRFX0NBUkRfQ1BVX1NISUZUCTIwCisjZGVmaW5lIFJPVVRFX0VOQ1JZUFRJT04JMHgwMDBGMDAwMAorI2RlZmluZSBST1VURV9FTkNSWVBUSU9OX1NISUZUCTE2CisjZGVmaW5lIFJPVVRFX1RYCQkweDAwMDBGMDAwCisjZGVmaW5lIFJPVVRFX1RYX1NISUZUCQkxMgorI2RlZmluZSBST1VURV9SWDEJCTB4MDAwMDBGMDAKKyNkZWZpbmUgUk9VVEVfUlgxX1NISUZUCQk4CisjZGVmaW5lIFJPVVRFX1JYMgkJMHgwMDAwMDBGMAorI2RlZmluZSBST1VURV9SWDJfU0hJRlQJCTQKKyNkZWZpbmUgUk9VVEVfQ09NUFJFU1NJT04JMHgwMDAwMDAwRgorI2RlZmluZSBST1VURV9DT01QUkVTU0lPTl9TSElGVCAwCisKKwlfX2JlMzIgXzExZzA7CQkJLyogMTFnICovCisJX19iZTMyIF8xMWcxOwkJCS8qIDExZyAqLworCV9fYmUzMiBfMTFiMDsJCQkvKiAxMWIgKi8KKwlfX2JlMzIgXzExYjE7CQkJLyogMTFiICovCisJdTggbWFjX2hkclszMl07CQkJLyogTUFDIGhlYWRlciAqLworCisJX19iZTE2IHJ0c19kdXJhdGlvbjsJCS8qIFJUUyBkdXJhdGlvbiAqLworCV9fYmUxNiBsYXN0X2R1cmF0aW9uOwkJLyogTGFzdCBkdXJhdGlvbiAqLworCV9fYmUxNiBzZWNfbGFzdF9kdXJhdGlvbjsJLyogU2Vjb25kIHRvIExhc3QgZHVyYXRpb24gKi8KKwlfX2JlMTYgb3RoZXJfZHVyYXRpb247CQkvKiBPdGhlciBkdXJhdGlvbiAqLworCV9fYmUxNiB0eF9sYXN0X2R1cmF0aW9uOwkvKiBUWCBMYXN0IGR1cmF0aW9uICovCisJX19iZTE2IHR4X290aGVyX2R1cmF0aW9uOwkvKiBUWCBPdGhlciBEdXJhdGlvbiAqLworCV9fYmUxNiBsYXN0XzExZ19sZW47CQkvKiBMZW5ndGggb2YgbGFzdCAxMWcgKi8KKwlfX2JlMTYgb3RoZXJfMTFnX2xlbjsJCS8qIExlbmdodCBvZiBvdGhlciAxMWcgKi8KKworCV9fYmUxNiBsYXN0XzExYl9sZW47CQkvKiBMZW5ndGggb2YgbGFzdCAxMWIgKi8KKwlfX2JlMTYgb3RoZXJfMTFiX2xlbjsJCS8qIExlbmdodCBvZiBvdGhlciAxMWIgKi8KKworCisJX19iZTE2IHJlZzY7CisjZGVmaW5lIE1CRgkJCTB4RjAwMCAvKiBtYmYgKi8KKyNkZWZpbmUgTUJGX1NISUZUCQkxMgorI2RlZmluZSBSU1ZENAkJCTB4MEZGRiAvKiByc3ZkNCAqLworI2RlZmluZSBSU1ZENF9TSElGVAkJMAorCisJX19iZTE2IHJ4X2ZyYWdfc3RhdDsJLyogUlggZnJhZ21lbnRhdGlvbiBzdGF0dXMgKi8KKworCV9fYmUzMiB0aW1lX3N0YW1wOwkvKiBUaW1lU3RhbXAgKi8KKwlfX2JlMzIgcGh5X3N0YXRzX2hpOwkvKiBQSFkgc3RhdHMgaGkgKi8KKwlfX2JlMzIgcGh5X3N0YXRzX2xvOwkvKiBQSFkgc3RhdHMgbG8gKi8KKwlfX2JlMzIgbWljX2tleTA7CS8qIE1JQyBrZXkgMCAqLworCV9fYmUzMiBtaWNfa2V5MTsJLyogTUlDIGtleSAxICovCisKKwl1bmlvbiB7CQkJLyogUlgvVFggVW5pb24gKi8KKwkJc3RydWN0IGFnbnhfcnggcng7CisJCXN0cnVjdCBhZ254X3R4IHR4OworCX07CisKKwl1OCByeF9jaGFubmVsOwkJLyogUmVjaWV2ZSBDaGFubmVsICovCisJUEFEX0JZVEVTKDMpOworCisJdTggcmVzZXJ2ZWRbNF07Cit9IF9fYXR0cmlidXRlX18oKF9fcGFja2VkX18pKTsKKworCitzdHJ1Y3QgYWdueF9kZXNjIHsKKyNkZWZpbmUgUEFDS0VUX0xFTgkJMHhGRkYwMDAwMAorI2RlZmluZSBQQUNLRVRfTEVOX1NISUZUCTIwCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyNkZWZpbmUgRklSU1RfUEFDS0VUX01BU0sJMHgwMDA4MDAwMAorI2RlZmluZSBGSVJTVF9QQUNLRVRfTUFTS19TSElGVAkxOQorI2RlZmluZSBGSVJTVF9SRVNFUlYyCQkweDAwMDQwMDAwCisjZGVmaW5lIEZJUlNUX1JFU0VSVjJfU0hJRlQJMTgKKyNkZWZpbmUgRklSU1RfVEtJUF9FUlJPUgkweDAwMDIwMDAwCisjZGVmaW5lIEZJUlNUX1RLSVBfRVJST1JfU0hJRlQJMTcKKyNkZWZpbmUgRklSU1RfVEtJUF9QQUNLRVQJMHgwMDAxMDAwMAorI2RlZmluZSBGSVJTVF9US0lQX1BBQ0tFVF9TSElGVAkxNgorI2RlZmluZSBGSVJTVF9SRVNFUlYxCQkweDAwMDBGMDAwCisjZGVmaW5lIEZJUlNUX1JFU0VSVjFfU0hJRlQJMTIKKyNkZWZpbmUgRklSU1RfRlJBR19MRU4JCTB4MDAwMDBGRjgKKyNkZWZpbmUgRklSU1RfRlJBR19MRU5fU0hJRlQJMworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisjZGVmaW5lIFNVQl9SRVNFUlYyCQkweDAwMGMwMDAwCisjZGVmaW5lIFNVQl9SRVNFUlYyX1NISUZUCTE4CisjZGVmaW5lIFNVQl9US0lQX0VSUk9SCQkweDAwMDIwMDAwCisjZGVmaW5lIFNVQl9US0lQX0VSUk9SX1NISUZUCTE3CisjZGVmaW5lIFNVQl9US0lQX1BBQ0tFVAkJMHgwMDAxMDAwMAorI2RlZmluZSBTVUJfVEtJUF9QQUNLRVRfU0hJRlQJMTYKKyNkZWZpbmUgU1VCX1JFU0VSVjEJCTB4MDAwMDgwMDAKKyNkZWZpbmUgU1VCX1JFU0VSVjFfU0hJRlQJMTUKKyNkZWZpbmUgU1VCX0ZSQUdfTEVOCQkweDAwMDA3RkY4CisjZGVmaW5lIFNVQl9GUkFHX0xFTl9TSElGVAkzCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyNkZWZpbmUgRklSU1RfRlJBRwkJMHgwMDAwMDAwNAorI2RlZmluZSBGSVJTVF9GUkFHX1NISUZUCTIKKyNkZWZpbmUgTEFTVF9GUkFHCQkweDAwMDAwMDAyCisjZGVmaW5lIExBU1RfRlJBR19TSElGVAkJMQorI2RlZmluZSBPV05FUgkJCTB4MDAwMDAwMDEKKyNkZWZpbmUgT1dORVJfU0hJRlQJCTAKKwlfX2JlMzIgZnJhZzsKKwlfX2JlMzIgZG1hX2FkZHI7Cit9IF9fYXR0cmlidXRlX18oKF9fcGFja2VkX18pKTsKKworZW51bSB7SEVBREVSLCBQQUNLRVR9OworCitzdHJ1Y3QgYWdueF9pbmZvIHsKKyAgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYjsKKyAgICAgICAgZG1hX2FkZHJfdCBtYXBwaW5nOworCXUzMiBkbWFfbGVuOwkJLyogZG1hIGJ1ZmZlciBsZW4gICovCisJLyogQmVsb3cgZmllbGRzIG9ubHkgdXNmdWwgZm9yIHR4ICovCisJdTMyIGhkcl9sZW47CQkvKiBpZWVlODAyMTEgaGVhZGVyIGxlbmd0aCAqLworCXVuc2lnbmVkIGludCB0eXBlOworICAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKnR4aTsKKyAgICAgICAgc3RydWN0IGllZWU4MDIxMV9oZHIgaGRyOworfTsKKworCitzdHJ1Y3QgYWdueF9yaW5nIHsKKwlzdHJ1Y3QgYWdueF9kZXNjICpkZXNjOworCWRtYV9hZGRyX3QgZG1hOworCXN0cnVjdCBhZ254X2luZm8gKmluZm87CisJLyogV2lsbCBsZWFkIHRvIG92ZXJmbG93IHdoZW4gc2VudCBwYWNrZXQgbnVtYmVyIGVub3VnaD8gKi8KKwl1bnNpZ25lZCBpbnQgaWR4OworCXVuc2lnbmVkIGludCBpZHhfc2VudDsJCS8qIG9ubHkgdXNmdWwgZm9yIHR4ZCBhbmQgdHhtICovCisJdW5zaWduZWQgaW50IHNpemU7Cit9OworCisjZGVmaW5lIEFHTlhfUlhfUklOR19TSVpFCTEyOAorI2RlZmluZSBBR05YX1RYRF9SSU5HX1NJWkUJMjU2CisjZGVmaW5lIEFHTlhfVFhNX1JJTkdfU0laRQkxMjgKKwordm9pZCBkaXNhYmxlX3J4X2ludGVycnVwdChzdHJ1Y3QgYWdueF9wcml2ICpwcml2KTsKK3ZvaWQgZW5hYmxlX3J4X2ludGVycnVwdChzdHJ1Y3QgYWdueF9wcml2ICpwcml2KTsKK2ludCBmaWxsX3JpbmdzKHN0cnVjdCBhZ254X3ByaXYgKnByaXYpOwordm9pZCB1bmZpbGxfcmluZ3Moc3RydWN0IGFnbnhfcHJpdiAqcHJpdik7Cit2b2lkIGhhbmRsZV9yeF9pcnEoc3RydWN0IGFnbnhfcHJpdiAqcHJpdik7Cit2b2lkIGhhbmRsZV90eGRfaXJxKHN0cnVjdCBhZ254X3ByaXYgKnByaXYpOwordm9pZCBoYW5kbGVfdHhtX2lycShzdHJ1Y3QgYWdueF9wcml2ICpwcml2KTsKK3ZvaWQgaGFuZGxlX290aGVyX2lycShzdHJ1Y3QgYWdueF9wcml2ICpwcml2KTsKK2ludCBfYWdueF90eChzdHJ1Y3QgYWdueF9wcml2ICpwcml2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKKyNlbmRpZiAvKiBBR05YX1hNSVRfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hbHRwY2llY2hkbWEvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy9hbHRwY2llY2hkbWEvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjRiZjkyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2FsdHBjaWVjaGRtYS9LY29uZmlnCkBAIC0wLDAgKzEsMTAgQEAKK2NvbmZpZyBBTFRFUkFfUENJRV9DSERNQQorCXRyaXN0YXRlICJBbHRlcmEgUENJIEV4cHJlc3MgQ2hhaW5pbmcgRE1BIGRyaXZlciIKKwlkZXBlbmRzIG9uIFBDSQorCWRlZmF1bHQgTgorCS0tLWhlbHAtLS0KKwkgIEEgcmVmZXJlbmNlIGRyaXZlciB0aGF0IGV4ZXJjaXNlcyB0aGUgQ2hhaW5pbmcgRE1BIGxvZ2ljIHJlZmVyZW5jZQorCSAgZGVzaWduIGdlbmVyYXRlZCBhbG9uZyB0aGUgQWx0ZXJhIEZQR0EgUENJIEV4cHJlc3Mgc29mdCBvciBoYXJkIGNvcmUsCisJICBvbmx5IGlmIGluc3RhbnRpYXRlZCB1c2luZyB0aGUgTWVnYVdpemFyZCwgbm90IHRoZSBTT1BDIGJ1aWxkZXIsIG9mCisJICBRdWFydHVzIDguMS4KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FsdHBjaWVjaGRtYS9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy9hbHRwY2llY2hkbWEvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA4Yzg0MwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9hbHRwY2llY2hkbWEvTWFrZWZpbGUKQEAgLTAsMCArMSwyIEBACitvYmotJChDT05GSUdfQUxURVJBX1BDSUVfQ0hETUEpCSs9IGFsdHBjaWVjaGRtYS5vCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hbHRwY2llY2hkbWEvVE9ETyBiL2RyaXZlcnMvc3RhZ2luZy9hbHRwY2llY2hkbWEvVE9ETwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMmM5NDVmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2FsdHBjaWVjaGRtYS9UT0RPCkBAIC0wLDAgKzEsMTUgQEAKK0RPTkU6CisgICAgLSBmdW5jdGlvbmFsaXR5IHNpbWlsYXIgdG8gbG9naWMgdGVzdGJlbmNoCisKK1RPRE86CisJLSBjaGVja3BhdGNoLnBsIGNsZWFudXBzLgorCS0ga2VlcCBzdGF0ZSBvZiBETUEgZW5naW5lcy4KKwktIGtlZXAgZGF0YSBzdHJ1Y3R1cmUgdGhhdCBrZWVwcyBzdGF0ZSBvZiBlYWNoIHRyYW5zZmVyLgorCS0gaW50ZXJydXB0IGhhbmRsZXIgc2hvdWxkIGl0ZXJhdGUgb3ZlciBvdXRzdGFuZGluZyBkZXNjcmlwdG9yIHRhYmxlcy4KKwktIGNvbXBsZXRlIHVzZXJzcGFjZSBjZGV2IHRvIHJlYWQvd3JpdGUgdXNpbmcgdGhlIERNQSBlbmdpbmVzLgorCS0gc3BsaXQgb2ZmIHRoZSBETUEgc3VwcG9ydCBmdW5jdGlvbnMgaW4gYSBtb2R1bGUsIHJlLXVzYWJsZSBieSBjdXN0b20KKwkgIGRyaXZlcnMuCisKK1BsZWFzZSBjb29yZGluYXRlIHdvcmsgd2l0aCwgYW5kIHNlbmQgcGF0Y2hlcyB0bworTGVvbiBXb2VzdGVuYmVyZyA8bGVvbkBzaWRlYnJhbmNoLmNvbT4KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FsdHBjaWVjaGRtYS9hbHRwY2llY2hkbWEuYyBiL2RyaXZlcnMvc3RhZ2luZy9hbHRwY2llY2hkbWEvYWx0cGNpZWNoZG1hLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGUyYjRjYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9hbHRwY2llY2hkbWEvYWx0cGNpZWNoZG1hLmMKQEAgLTAsMCArMSwxMTg0IEBACisvKioKKyAqIERyaXZlciBmb3IgQWx0ZXJhIFBDSWUgY29yZSBjaGFpbmluZyBETUEgcmVmZXJlbmNlIGRlc2lnbi4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggTGVvbiBXb2VzdGVuYmVyZyAgPGxlb24ud29lc3RlbmJlcmdAYXhvbi50dj4KKyAqIENvcHlyaWdodCAoQykgMjAwOCBOaWNrb2xhcyBIZXBwZXJtYW5uICA8aGVwcGVybWFubndkdEBnbWFpbC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKgorICogUmF0aW9uYWxlOiBUaGlzIGRyaXZlciBleGVyY2lzZXMgdGhlIGNoYWluaW5nIERNQSByZWFkIGFuZCB3cml0ZSBlbmdpbmUKKyAqIGluIHRoZSByZWZlcmVuY2UgZGVzaWduLiBJdCBpcyBtZWFudCBhcyBhIGNvbXBsZW1lbnRhcnkgcmVmZXJlbmNlCisgKiBkcml2ZXIgdGhhdCBjYW4gYmUgdXNlZCBmb3IgdGVzdGluZyBlYXJseSBkZXNpZ25zIGFzIHdlbGwgYXMgYSBiYXNpcyB0bworICogd3JpdGUgeW91ciBjdXN0b20gZHJpdmVyLgorICoKKyAqIFN0YXR1czogVGVzdCByZXN1bHRzIGZyb20gTGVvbiBXb2VzdGVuYmVyZyAgPGxlb24ud29lc3RlbmJlcmdAYXhvbi50dj46CisgKgorICogU2VuZGVybyBCb2FyZCB3LyBDeWNsb25lIElJIEVQMkMzNUY2NzJDNk4sIFBYMTAxMUEgUENJZSB4MSBQSFkgb24gYQorICogRGVsbCBQcmVjaXNpb24gMzcwIFBDLCB4ODYsIGtlcm5lbCAyLjYuMjAgZnJvbSBVYnVudHUgNy4wNC4KKyAqCisgKiBTZW5kZXJvIEJvYXJkIHcvIEN5Y2xvbmUgSUkgRVAyQzM1RjY3MkM2TiwgUFgxMDExQSBQQ0llIHgxIFBIWSBvbiBhCisgKiBGcmVlc2NhbGUgTVBDODMxM0UtUkRCIGJvYXJkLCBQb3dlclBDLCAyLjYuMjQgdy8gRnJlZXNjYWxlIHBhdGNoZXMuCisgKgorICogRHJpdmVyIHRlc3RzIHBhc3NlZCB3aXRoIFBDSWUgQ29tcGlsZXIgOC4xLiBXaXRoIFBDSWUgOC4wIHRoZSBETUEKKyAqIGxvb3BiYWNrIHRlc3QgaGFkIHJlcHJvZHVjYWJsZSBjb21wYXJlIGVycm9ycy4gSSBhc3N1bWUgYSBjaGFuZ2UKKyAqIGluIHRoZSBjb21waWxlciBvciByZWZlcmVuY2UgZGVzaWduLCBidXQgY291bGQgbm90IGZpbmQgZXZpZGVuY2Ugbm9yCisgKiBkb2N1bWVudGF0aW9uIG9uIGEgY2hhbmdlIG9yIGZpeCBpbiB0aGF0IGRpcmVjdGlvbi4KKyAqCisgKiBUaGUgcmVmZXJlbmNlIGRlc2lnbiBkb2VzIG5vdCBoYXZlIHJlYWRhYmxlIGxvY2F0aW9ucyBhbmQgdGh1cyBhCisgKiBkdW1teSByZWFkLCB1c2VkIHRvIGZsdXNoIFBDSSBwb3N0ZWQgd3JpdGVzLCBjYW5ub3QgYmUgcGVyZm9ybWVkLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvY2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKworCisvKiBieSBkZWZhdWx0IGRvIG5vdCBidWlsZCB0aGUgY2hhcmFjdGVyIGRldmljZSBpbnRlcmZhY2UgKi8KKy8qIFhYWCBJdCBpcyBub24tZnVuY3Rpb25hbCB5ZXQgKi8KKyNpZm5kZWYgQUxUUENJRUNIRE1BX0NERVYKKyMgIGRlZmluZSBBTFRQQ0lFQ0hETUFfQ0RFViAwCisjZW5kaWYKKworLyogYnVpbGQgdGhlIGNoYXJhY3RlciBkZXZpY2UgaW50ZXJmYWNlPyAqLworI2lmIEFMVFBDSUVDSERNQV9DREVWCisjICBkZWZpbmUgTUFYX0NIRE1BX1NJWkUgKDggKiAxMDI0ICogMTAyNCkKKyMgIGluY2x1ZGUgIm1hcHBlcl91c2VyX3RvX3NnLmgiCisjZW5kaWYKKworLyoqIGRyaXZlciBuYW1lLCBtaW1pY2tzIEFsdGVyYSBuYW1pbmcgb2YgdGhlIHJlZmVyZW5jZSBkZXNpZ24gKi8KKyNkZWZpbmUgRFJWX05BTUUgImFsdHBjaWVjaGRtYSIKKy8qKiBudW1iZXIgb2YgQkFScyBvbiB0aGUgZGV2aWNlICovCisjZGVmaW5lIEFQRV9CQVJfTlVNICg2KQorLyoqIEJBUiBudW1iZXIgd2hlcmUgdGhlIFJDU0xBVkUgbWVtb3J5IHNpdHMgKi8KKyNkZWZpbmUgQVBFX0JBUl9SQ1NMQVZFICgwKQorLyoqIEJBUiBudW1iZXIgd2hlcmUgdGhlIERlc2NyaXB0b3IgSGVhZGVyIHNpdHMgKi8KKyNkZWZpbmUgQVBFX0JBUl9IRUFERVIgKDIpCisKKy8qKiBtYXhpbXVtIHNpemUgaW4gYnl0ZXMgb2YgdGhlIGRlc2NyaXB0b3IgdGFibGUsIGNoZG1hIGxvZ2ljIGxpbWl0ICovCisjZGVmaW5lIEFQRV9DSERNQV9UQUJMRV9TSVpFICg0MDk2KQorLyogc2luZ2xlIHRyYW5zZmVyIG11c3Qgbm90IGV4Y2VlZCAyNTUgdGFibGUgZW50cmllcy4gd29yc3QgY2FzZSB0aGlzIGNhbiBiZQorICogYWNoaWV2ZWQgYnkgMjU1IHNjYXR0ZXJlZCBwYWdlcywgd2l0aCBvbmx5IGEgc2luZ2xlIGJ5dGUgaW4gdGhlIGhlYWQgYW5kCisgKiB0YWlsIHBhZ2VzLiAyNTMgKiBQQUdFX1NJWkUgaXMgYSBzYWZlIHVwcGVyIGJvdW5kIGZvciB0aGUgdHJhbnNmZXIgc2l6ZS4KKyAqLworI2RlZmluZSBBUEVfQ0hETUFfTUFYX1RSQU5TRkVSX0xFTiAoMjUzICogUEFHRV9TSVpFKQorCisvKioKKyAqIFNwZWNpZmllcyB0aG9zZSBCQVJzIHRvIGJlIG1hcHBlZCBhbmQgdGhlIGxlbmd0aCBvZiBlYWNoIG1hcHBpbmcuCisgKgorICogWmVybyAoMCkgbWVhbnMgZG8gbm90IG1hcCwgb3RoZXJ3aXNlIHNwZWNpZmllcyB0aGUgQkFSIGxlbmd0aHMgdG8gYmUgbWFwcGVkLgorICogSWYgdGhlIGFjdHVhbCBCQVIgbGVuZ3RoIGlzIGxlc3MsIHRoaXMgaXMgY29uc2lkZXJlZCBhbiBlcnJvcjsgdGhlbgorICogcmVjb25maWd1cmUgeW91ciBQQ0llIGNvcmUuCisgKgorICogQHNlZSB1Z19wY2lfZXhwcmVzcyA4LjAsIHRhYmxlIDctMiBhdCBwYWdlIDctMTMuCisgKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGJhcl9taW5fbGVuW0FQRV9CQVJfTlVNXSA9CisJeyAzMjc2OCwgMCwgMjU2LCAwLCAzMjc2OCwgMCB9OworCisvKioKKyAqIERlc2NyaXB0b3IgSGVhZGVyLCBjb250cm9scyB0aGUgRE1BIHJlYWQgZW5naW5lIG9yIHdyaXRlIGVuZ2luZS4KKyAqCisgKiBUaGUgZGVzY3JpcHRvciBoZWFkZXIgaXMgdGhlIG1haW4gZGF0YSBzdHJ1Y3R1cmUgZm9yIHN0YXJ0aW5nIERNQSB0cmFuc2ZlcnMuCisgKgorICogSXQgc2l0cyBpbiBFbmQgUG9pbnQgKEZQR0EpIG1lbW9yeSBCQVJbMl0gZm9yIDMyLWJpdCBvciBCQVJbMzoyXSBmb3IgNjQtYml0LgorICogSXQgcmVmZXJlbmNlcyBhIGRlc2NyaXB0b3IgdGFibGUgd2hpY2ggZXhpc3RzIGluIFJvb3QgQ29tcGxleCAoUEMpIG1lbW9yeS4KKyAqIFdyaXRpbmcgdGhlIHJjbGFzdCBmaWVsZCBzdGFydHMgdGhlIERNQSBvcGVyYXRpb24sIHRodXMgYWxsIG90aGVyIHN0cnVjdHVyZXMKKyAqIGFuZCBmaWVsZHMgbXVzdCBiZSBzZXR1cCBiZWZvcmUgZG9pbmcgc28uCisgKgorICogQHNlZSB1Z19wY2lfZXhwcmVzcyA4LjAsIHRhYmxlcyA3LTMsIDctNCBhbmQgNy01IGF0IHBhZ2UgNy0xNC4KKyAqIEBub3RlIFRoaXMgaGVhZGVyIG11c3QgYmUgd3JpdHRlbiBpbiBmb3VyIDMyLWJpdCAoUENJIERXT1JEKSB3cml0ZXMuCisgKi8KK3N0cnVjdCBhcGVfY2hkbWFfaGVhZGVyIHsKKwkvKioKKwkgKiB3MCBjb25zaXN0cyBvZiB0d28gMTYtYml0IGZpZWxkczoKKwkgKiBsc2IgdTE2IG51bWJlcjsgbnVtYmVyIG9mIGRlc2NyaXB0b3JzIGluIGFwZV9jaGRtYV90YWJsZQorCSAqIG1zYiB1MTYgY29udHJvbDsgZ2xvYmFsIGNvbnRyb2wgZmxhZ3MKKwkgKi8KKwl1MzIgdzA7CisJLyogYnVzIGFkZHJlc3MgdG8gYXBlX2NoZG1hX3RhYmxlIGluIFJvb3QgQ29tcGxleCBtZW1vcnkgKi8KKwl1MzIgYmR0X2FkZHJfaDsKKwl1MzIgYmR0X2FkZHJfbDsKKwkvKioKKwkgKiB3MyBjb25zaXN0cyBvZiB0d28gMTYtYml0IGZpZWxkczoKKwkgKiAtIGxzYiB1MTYgcmNsYXN0OyBsYXN0IGRlc2NyaXB0b3IgbnVtYmVyIGF2YWlsYWJsZSBpbiBSb290IENvbXBsZXgKKwkgKiAgICAtIHplcm8gKDApIG1lYW5zIHRoZSBmaXJzdCBkZXNjcmlwdG9yIGlzIHJlYWR5LAorCSAqICAgIC0gb25lICgxKSBtZWFucyB0d28gZGVzY3JpcHRvcnMgYXJlIHJlYWR5LCBldGMuCisJICogLSBtc2IgdTE2IHJlc2VydmVkOworCSAqCisJICogQG5vdGUgd3JpdGluZyB0byB0aGlzIG1lbW9yeSBsb2NhdGlvbiBzdGFydHMgdGhlIERNQSBvcGVyYXRpb24hCisJICovCisJdTMyIHczOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qKgorICogRGVzY3JpcHRvciBFbnRyeSwgZGVzY3JpYmluZyBhIChub24tc2NhdHRlcmVkKSBzaW5nbGUgbWVtb3J5IGJsb2NrIHRyYW5zZmVyLgorICoKKyAqIFRoZXJlIGlzIG9uZSBkZXNjcmlwdG9yIGZvciBlYWNoIG1lbW9yeSBibG9jayBpbnZvbHZlZCBpbiB0aGUgdHJhbnNmZXIsIGEKKyAqIGJsb2NrIGJlaW5nIGEgY29udGlndW91cyBhZGRyZXNzIHJhbmdlIG9uIHRoZSBidXMuCisgKgorICogTXVsdGlwbGUgZGVzY3JpcHRvcnMgYXJlIGNoYWluZWQgYnkgbWVhbnMgb2YgdGhlIGFwZV9jaGRtYV90YWJsZSBkYXRhCisgKiBzdHJ1Y3R1cmUuCisgKgorICogQHNlZSB1Z19wY2lfZXhwcmVzcyA4LjAsIHRhYmxlcyA3LTYsIDctNyBhbmQgNy04IGF0IHBhZ2UgNy0xNCBhbmQgcGFnZSA3LTE1LgorICovCitzdHJ1Y3QgYXBlX2NoZG1hX2Rlc2MgeworCS8qKgorCSAqIHcwIGNvbnNpc3RzIG9mIHR3byAxNi1iaXQgZmllbGRzOgorCSAqIG51bWJlciBvZiBEV09SRFMgdG8gdHJhbnNmZXIKKwkgKiAtIGxzYiB1MTYgbGVuZ3RoOworCSAqIGdsb2JhbCBjb250cm9sCisJICogLSBtc2IgdTE2IGNvbnRyb2w7CisJICovCisJdTMyIHcwOworCS8qIGFkZHJlc3Mgb2YgbWVtb3J5IGluIHRoZSBFbmQgUG9pbnQgKi8KKwl1MzIgZXBfYWRkcjsKKwkvKiBidXMgYWRkcmVzcyBvZiBzb3VyY2Ugb3IgZGVzdGluYXRpb24gbWVtb3J5IGluIHRoZSBSb290IENvbXBsZXggKi8KKwl1MzIgcmNfYWRkcl9oOworCXUzMiByY19hZGRyX2w7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyoqCisgKiBEZXNjcmlwdG9yIFRhYmxlLCBhbiBhcnJheSBvZiBkZXNjcmlwdG9ycyBkZXNjcmliaW5nIGEgY2hhaW5lZCB0cmFuc2Zlci4KKyAqCisgKiBBbiBhcnJheSBvZiBkZXNjcmlwdG9ycywgcHJlY2VkZWQgYnkgd29ya3NwYWNlIGZvciB0aGUgRW5kIFBvaW50LgorICogSXQgZXhpc3RzIGluIFJvb3QgQ29tcGxleCBtZW1vcnkuCisgKgorICogVGhlIEVuZCBQb2ludCBjYW4gdXBkYXRlIGl0cyBsYXN0IGNvbXBsZXRlZCBkZXNjcmlwdG9yIG51bWJlciBpbiB0aGUKKyAqIGVwbGFzdCBmaWVsZCBpZiByZXF1ZXN0ZWQgYnkgc2V0dGluZyB0aGUgRVBMQVNUX0VOQSBiaXQgZWl0aGVyCisgKiBnbG9iYWxseSBpbiB0aGUgaGVhZGVyJ3Mgb3IgbG9jYWxseSBpbiBhbnkgZGVzY3JpcHRvcidzIGNvbnRyb2wgZmllbGQuCisgKgorICogQG5vdGUgdGhpcyBzdHJ1Y3R1cmUgbWF5IG5vdCBleGNlZWQgNDA5NiBieXRlcy4gVGhpcyByZXN1bHRzIGluIGEKKyAqIG1heGltdW0gb2YgNDA5NiAvICg0ICogNCkgLSAxID0gMjU1IGRlc2NyaXB0b3JzIHBlciBjaGFpbmVkIHRyYW5zZmVyLgorICoKKyAqIEBzZWUgdWdfcGNpX2V4cHJlc3MgOC4wLCB0YWJsZXMgNy05LCA3LTEwIGFuZCA3LTExIGF0IHBhZ2UgNy0xNyBhbmQgcGFnZSA3LTE4LgorICovCitzdHJ1Y3QgYXBlX2NoZG1hX3RhYmxlIHsKKwkvKiB3b3Jrc3BhY2UgMHgwMC0weDBiLCByZXNlcnZlZCAqLworCXUzMiByZXNlcnZlZDFbM107CisJLyogd29ya3NwYWNlIDB4MGMtMHgwZiwgbGFzdCBkZXNjcmlwdG9yIGhhbmRsZWQgYnkgRW5kIFBvaW50ICovCisJdTMyIHczOworCS8qIHRoZSBhY3R1YWwgYXJyYXkgb2YgZGVzY3JpcHRvcnMKKyAgICAqIDB4MTAtMHgxZiwgMHgyMC0weDJmLCAuLi4gMHhmZjAtMHhmZmYgKDI1NSBlbnRyaWVzKQorICAgICovCisJc3RydWN0IGFwZV9jaGRtYV9kZXNjIGRlc2NbMjU1XTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKioKKyAqIEFsdGVyYSBQQ0kgRXhwcmVzcyAoJ2FwZScpIGJvYXJkIHNwZWNpZmljIGJvb2sga2VlcGluZyBkYXRhCisgKgorICogS2VlcHMgc3RhdGUgb2YgdGhlIFBDSWUgY29yZSBhbmQgdGhlIENoYWluaW5nIERNQSBjb250cm9sbGVyCisgKiBhcHBsaWNhdGlvbi4KKyAqLworc3RydWN0IGFwZV9kZXYgeworCS8qKiB0aGUga2VybmVsIHBjaSBkZXZpY2UgZGF0YSBzdHJ1Y3R1cmUgcHJvdmlkZWQgYnkgcHJvYmUoKSAqLworCXN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2OworCS8qKgorCSAqIGtlcm5lbCB2aXJ0dWFsIGFkZHJlc3Mgb2YgdGhlIG1hcHBlZCBCQVIgbWVtb3J5IGFuZCBJTyByZWdpb25zIG9mCisJICogdGhlIEVuZCBQb2ludC4gVXNlZCBieSBtYXBfYmFycygpL3VubWFwX2JhcnMoKS4KKwkgKi8KKwl2b2lkICogX19pb21lbSBiYXJbQVBFX0JBUl9OVU1dOworCS8qKiBrZXJuZWwgdmlydHVhbCBhZGRyZXNzIGZvciBEZXNjcmlwdG9yIFRhYmxlIGluIFJvb3QgQ29tcGxleCBtZW1vcnkgKi8KKwlzdHJ1Y3QgYXBlX2NoZG1hX3RhYmxlICp0YWJsZV92aXJ0OworCS8qKgorCSAqIGJ1cyBhZGRyZXNzIGZvciB0aGUgRGVzY3JpcHRvciBUYWJsZSBpbiBSb290IENvbXBsZXggbWVtb3J5LCBpbgorCSAqIENQVS1uYXRpdmUgZW5kaWFuZXNzCisJICovCisJZG1hX2FkZHJfdCB0YWJsZV9idXM7CisJLyogaWYgdGhlIGRldmljZSByZWdpb25zIGNvdWxkIG5vdCBiZSBhbGxvY2F0ZWQsIGFzc3VtZSBhbmQgcmVtZW1iZXIgaXQKKwkgKiBpcyBpbiB1c2UgYnkgYW5vdGhlciBkcml2ZXI7IHRoaXMgZHJpdmVyIG11c3Qgbm90IGRpc2FibGUgdGhlIGRldmljZS4KKwkgKi8KKwlpbnQgaW5fdXNlOworCS8qIHdoZXRoZXIgdGhpcyBkcml2ZXIgZW5hYmxlZCBtc2kgZm9yIHRoZSBkZXZpY2UgKi8KKwlpbnQgbXNpX2VuYWJsZWQ7CisJLyogd2hldGhlciB0aGlzIGRyaXZlciBjb3VsZCBvYnRhaW4gdGhlIHJlZ2lvbnMgKi8KKwlpbnQgZ290X3JlZ2lvbnM7CisJLyogaXJxIGxpbmUgc3VjY2VzZnVsbHkgcmVxdWVzdGVkIGJ5IHRoaXMgZHJpdmVyLCAtMSBvdGhlcndpc2UgKi8KKwlpbnQgaXJxX2xpbmU7CisJLyogYm9hcmQgcmV2aXNpb24gKi8KKwl1OCByZXZpc2lvbjsKKwkvKiBpbnRlcnJ1cHQgY291bnQsIGluY3JlbWVudGVkIGJ5IHRoZSBpbnRlcnJ1cHQgaGFuZGxlciAqLworCWludCBpcnFfY291bnQ7CisjaWYgQUxUUENJRUNIRE1BX0NERVYKKwkvKiBjaGFyYWN0ZXIgZGV2aWNlICovCisJZGV2X3QgY2Rldm5vOworCXN0cnVjdCBjZGV2IGNkZXY7CisJLyogdXNlciBzcGFjZSBzY2F0dGVyIGdhdGhlciBtYXBwZXIgKi8KKwlzdHJ1Y3Qgc2dfbWFwcGluZ190ICpzZ207CisjZW5kaWYKK307CisKKy8qKgorICogVXNpbmcgdGhlIHN1YnN5c3RlbSB2ZW5kb3IgaWQgYW5kIHN1YnN5c3RlbSBpZCwgaXQgaXMgcG9zc2libGUgdG8KKyAqIGRpc3Rpbmd1aXNoIGJldHdlZW4gZGlmZmVyZW50IGNhcmRzIGJhc2VzIGFyb3VuZCB0aGUgc2FtZQorICogKHRoaXJkLXBhcnR5KSBsb2dpYyBjb3JlLgorICoKKyAqIERlZmF1bHQgQWx0ZXJhIHZlbmRvciBhbmQgZGV2aWNlIElEJ3MsIGFuZCBzb21lIChub24tcmVzZXJ2ZWQpCisgKiBJRCdzIGFyZSBub3cgdXNlZCBoZXJlIHRoYXQgYXJlIHVzZWQgYW1vbmdzdCB0aGUgdGVzdGVycy9kZXZlbG9wZXJzLgorICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgaWRzW10gPSB7CisJeyBQQ0lfREVWSUNFKDB4MTE3MiwgMHhFMDAxKSwgfSwKKwl7IFBDSV9ERVZJQ0UoMHgyMDcxLCAweDIwNzEpLCB9LAorCXsgMCwgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBpZHMpOworCisjaWYgQUxUUENJRUNIRE1BX0NERVYKKy8qIHByb3RvdHlwZXMgZm9yIGNoYXJhY3RlciBkZXZpY2UgKi8KK3N0YXRpYyBpbnQgc2dfaW5pdChzdHJ1Y3QgYXBlX2RldiAqYXBlKTsKK3N0YXRpYyB2b2lkIHNnX2V4aXQoc3RydWN0IGFwZV9kZXYgKmFwZSk7CisjZW5kaWYKKworLyoqCisgKiBhbHRwY2llY2hkbWFfaXNyKCkgLSBJbnRlcnJ1cHQgaGFuZGxlcgorICoKKyAqLworc3RhdGljIGlycXJldHVybl90IGFsdHBjaWVjaGRtYV9pc3IoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCXN0cnVjdCBhcGVfZGV2ICphcGUgPSAoc3RydWN0IGFwZV9kZXYgKilkZXZfaWQ7CisJaWYgKCFhcGUpCisJCXJldHVybiBJUlFfTk9ORTsKKwlhcGUtPmlycV9jb3VudCsrOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgc2Nhbl9iYXJzKHN0cnVjdCBhcGVfZGV2ICphcGUsIHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IEFQRV9CQVJfTlVNOyBpKyspIHsKKwkJdW5zaWduZWQgbG9uZyBiYXJfc3RhcnQgPSBwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2LCBpKTsKKwkJaWYgKGJhcl9zdGFydCkgeworCQkJdW5zaWduZWQgbG9uZyBiYXJfZW5kID0gcGNpX3Jlc291cmNlX2VuZChkZXYsIGkpOworCQkJdW5zaWduZWQgbG9uZyBiYXJfZmxhZ3MgPSBwY2lfcmVzb3VyY2VfZmxhZ3MoZGV2LCBpKTsKKwkJCXByaW50ayhLRVJOX0RFQlVHICJCQVIlZCAweCUwOGx4LTB4JTA4bHggZmxhZ3MgMHglMDhseFxuIiwKKwkJCSAgaSwgYmFyX3N0YXJ0LCBiYXJfZW5kLCBiYXJfZmxhZ3MpOworCQl9CisJfQorCXJldHVybiAwOworfQorCisvKioKKyAqIFVubWFwIHRoZSBCQVIgcmVnaW9ucyB0aGF0IGhhZCBiZWVuIG1hcHBlZCBlYXJsaWVyIHVzaW5nIG1hcF9iYXJzKCkKKyAqLworc3RhdGljIHZvaWQgdW5tYXBfYmFycyhzdHJ1Y3QgYXBlX2RldiAqYXBlLCBzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCWludCBpOworCWZvciAoaSA9IDA7IGkgPCBBUEVfQkFSX05VTTsgaSsrKSB7CisJICAvKiBpcyB0aGlzIEJBUiBtYXBwZWQ/ICovCisJCWlmIChhcGUtPmJhcltpXSkgeworCQkJLyogdW5tYXAgQkFSICovCisJCQlwY2lfaW91bm1hcChkZXYsIGFwZS0+YmFyW2ldKTsKKwkJCWFwZS0+YmFyW2ldID0gTlVMTDsKKwkJfQorCX0KK30KKworLyoqCisgKiBNYXAgdGhlIGRldmljZSBtZW1vcnkgcmVnaW9ucyBpbnRvIGtlcm5lbCB2aXJ0dWFsIGFkZHJlc3Mgc3BhY2UgYWZ0ZXIKKyAqIHZlcmlmeWluZyB0aGVpciBzaXplcyByZXNwZWN0IHRoZSBtaW5pbXVtIHNpemVzIG5lZWRlZCwgZ2l2ZW4gYnkgdGhlCisgKiBiYXJfbWluX2xlbltdIGFycmF5LgorICovCitzdGF0aWMgaW50IF9fZGV2aW5pdCBtYXBfYmFycyhzdHJ1Y3QgYXBlX2RldiAqYXBlLCBzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCWludCByYzsKKwlpbnQgaTsKKwkvKiBpdGVyYXRlIHRocm91Z2ggYWxsIHRoZSBCQVJzICovCisJZm9yIChpID0gMDsgaSA8IEFQRV9CQVJfTlVNOyBpKyspIHsKKwkJdW5zaWduZWQgbG9uZyBiYXJfc3RhcnQgPSBwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2LCBpKTsKKwkJdW5zaWduZWQgbG9uZyBiYXJfZW5kID0gcGNpX3Jlc291cmNlX2VuZChkZXYsIGkpOworCQl1bnNpZ25lZCBsb25nIGJhcl9sZW5ndGggPSBiYXJfZW5kIC0gYmFyX3N0YXJ0ICsgMTsKKwkJYXBlLT5iYXJbaV0gPSBOVUxMOworCQkvKiBkbyBub3QgbWFwLCBhbmQgc2tpcCwgQkFScyB3aXRoIGxlbmd0aCAwICovCisJCWlmICghYmFyX21pbl9sZW5baV0pCisJCQljb250aW51ZTsKKwkJLyogZG8gbm90IG1hcCBCQVJzIHdpdGggYWRkcmVzcyAwICovCisJCWlmICghYmFyX3N0YXJ0IHx8ICFiYXJfZW5kKSB7CisgICAgICAgICAgICBwcmludGsoS0VSTl9ERUJVRyAiQkFSICMlZCBpcyBub3QgcHJlc2VudD8hXG4iLCBpKTsKKwkJCXJjID0gLTE7CisJCQlnb3RvIGZhaWw7CisJCX0KKwkJYmFyX2xlbmd0aCA9IGJhcl9lbmQgLSBiYXJfc3RhcnQgKyAxOworCQkvKiBCQVIgbGVuZ3RoIGlzIGxlc3MgdGhhbiBkcml2ZXIgcmVxdWlyZXM/ICovCisJCWlmIChiYXJfbGVuZ3RoIDwgYmFyX21pbl9sZW5baV0pIHsKKyAgICAgICAgICAgIHByaW50ayhLRVJOX0RFQlVHICJCQVIgIyVkIGxlbmd0aCA9ICVsdSBieXRlcyBidXQgZHJpdmVyICIKKyAgICAgICAgICAgICJyZXF1aXJlcyBhdCBsZWFzdCAlbHUgYnl0ZXNcbiIsIGksIGJhcl9sZW5ndGgsIGJhcl9taW5fbGVuW2ldKTsKKwkJCXJjID0gLTE7CisJCQlnb3RvIGZhaWw7CisJCX0KKwkJLyogbWFwIHRoZSBkZXZpY2UgbWVtb3J5IG9yIElPIHJlZ2lvbiBpbnRvIGtlcm5lbCB2aXJ0dWFsCisJCSAqIGFkZHJlc3Mgc3BhY2UgKi8KKwkJYXBlLT5iYXJbaV0gPSBwY2lfaW9tYXAoZGV2LCBpLCBiYXJfbWluX2xlbltpXSk7CisJCWlmICghYXBlLT5iYXJbaV0pIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHICJDb3VsZCBub3QgbWFwIEJBUiAjJWQuXG4iLCBpKTsKKwkJCXJjID0gLTE7CisJCQlnb3RvIGZhaWw7CisJCX0KKyAgICAgICAgcHJpbnRrKEtFUk5fREVCVUcgIkJBUlslZF0gbWFwcGVkIGF0IDB4JXAgd2l0aCBsZW5ndGggJWx1KC8lbHUpLlxuIiwgaSwKKwkJCWFwZS0+YmFyW2ldLCBiYXJfbWluX2xlbltpXSwgYmFyX2xlbmd0aCk7CisJfQorCS8qIHN1Y2Nlc2Z1bGx5IG1hcHBlZCBhbGwgcmVxdWlyZWQgQkFSIHJlZ2lvbnMgKi8KKwlyYyA9IDA7CisJZ290byBzdWNjZXNzOworZmFpbDoKKwkvKiB1bm1hcCBhbnkgQkFScyB0aGF0IHdlIGRpZCBtYXAgKi8KKwl1bm1hcF9iYXJzKGFwZSwgZGV2KTsKK3N1Y2Nlc3M6CisJcmV0dXJuIHJjOworfQorCisjaWYgMCAvKiBub3QgeWV0IGltcGxlbWVudGVkIGZ1bGx5IEZJWE1FIGFkZCBvcGNvZGUgKi8KK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCByY3NsYXZlX3Rlc3Qoc3RydWN0IGFwZV9kZXYgKmFwZSwgc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwl1MzIgKnJjc2xhdmVfbWVtID0gKHUzMiAqKWFwZS0+YmFyW0FQRV9CQVJfUkNTTEFWRV07CisJdTMyIHJlc3VsdCA9IDA7CisJLyoqIHRoaXMgbnVtYmVyIGlzIGFzc3VtZWQgdG8gYmUgZGlmZmVyZW50IGVhY2ggdGltZSB0aGlzIHRlc3QgcnVucyAqLworCXUzMiBzZWVkID0gKHUzMilqaWZmaWVzOworCXUzMiB2YWx1ZSA9IHNlZWQ7CisJaW50IGk7CisKKwkvKiB3cml0ZSBsb29wICovCisJdmFsdWUgPSBzZWVkOworCWZvciAoaSA9IDEwMjQ7IGkgPCAzMjc2OCAvIDQgOyBpKyspIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIldyaXRpbmcgMHglMDh4IHRvIDB4JXAuXG4iLAorCQkJKHUzMil2YWx1ZSwgKHZvaWQgKilyY3NsYXZlX21lbSArIGkpOworCQlpb3dyaXRlMzIodmFsdWUsIHJjc2xhdmVfbWVtICsgaSk7CisJCXZhbHVlKys7CisJfQorCS8qIHJlYWQtYmFjayBsb29wICovCisJdmFsdWUgPSBzZWVkOworCWZvciAoaSA9IDEwMjQ7IGkgPCAzMjc2OCAvIDQ7IGkrKykgeworCQlyZXN1bHQgPSBpb3JlYWQzMihyY3NsYXZlX21lbSArIGkpOworCQlpZiAocmVzdWx0ICE9IHZhbHVlKSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiV3JvdGUgMHglMDh4IHRvIDB4JXAsIGJ1dCByZWFkIGJhY2sgMHglMDh4LlxuIiwKKwkJCQkodTMyKXZhbHVlLCAodm9pZCAqKXJjc2xhdmVfbWVtICsgaSwgKHUzMilyZXN1bHQpOworCQkJYnJlYWs7CisJCX0KKwkJdmFsdWUrKzsKKwl9Cit9CisjZW5kaWYKKworLyogb2J0YWluIHRoZSAzMiBtb3N0IHNpZ25pZmljYW50IChoaWdoKSBiaXRzIG9mIGEgMzItYml0IG9yIDY0LWJpdCBhZGRyZXNzICovCisjZGVmaW5lIHBjaV9kbWFfaChhZGRyKSAoKGFkZHIgPj4gMTYpID4+IDE2KQorLyogb2J0YWluIHRoZSAzMiBsZWFzdCBzaWduaWZpY2FudCAobG93KSBiaXRzIG9mIGEgMzItYml0IG9yIDY0LWJpdCBhZGRyZXNzICovCisjZGVmaW5lIHBjaV9kbWFfbChhZGRyKSAoYWRkciAmIDB4ZmZmZmZmZmZVTCkKKworLyogYXBlX2ZpbGxfY2hkbWFfZGVzYygpIC0gRmlsbCBhIEFsdGVyYSBQQ0kgRXhwcmVzcyBDaGFpbmluZyBETUEgZGVzY3JpcHRvcgorICoKKyAqIEBkZXNjIHBvaW50ZXIgdG8gZGVzY3JpcHRvciB0byBiZSBmaWxsZWQKKyAqIEBhZGRyIHJvb3QgY29tcGxleCBhZGRyZXNzCisgKiBAZXBfYWRkciBlbmQgcG9pbnQgYWRkcmVzcworICogQGxlbiBudW1iZXIgb2YgYnl0ZXMsIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0LgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgYXBlX2NoZG1hX2Rlc2Nfc2V0KHN0cnVjdCBhcGVfY2hkbWFfZGVzYyAqZGVzYywgZG1hX2FkZHJfdCBhZGRyLCB1MzIgZXBfYWRkciwgaW50IGxlbikKK3sKKyAgQlVHX09OKGxlbiAmIDMpOworCWRlc2MtPncwID0gY3B1X3RvX2xlMzIobGVuIC8gNCk7CisJZGVzYy0+ZXBfYWRkciA9IGNwdV90b19sZTMyKGVwX2FkZHIpOworCWRlc2MtPnJjX2FkZHJfaCA9IGNwdV90b19sZTMyKHBjaV9kbWFfaChhZGRyKSk7CisJZGVzYy0+cmNfYWRkcl9sID0gY3B1X3RvX2xlMzIocGNpX2RtYV9sKGFkZHIpKTsKK30KKworLyoKKyAqIGFwZV9zZ190b19jaGRtYV90YWJsZSgpIC0gQ3JlYXRlIGEgZGV2aWNlIGRlc2NyaXB0b3IgdGFibGUgZnJvbSBhIHNjYXR0ZXJsaXN0LgorICoKKyAqIFRoZSBzY2F0dGVybGlzdCBtdXN0IGhhdmUgYmVlbiBtYXBwZWQgYnkgcGNpX21hcF9zZyhzZ20tPnNnbCkuCisgKgorICogQHNnbCBzY2F0dGVybGlzdC4KKyAqIEBuZW50cyBOdW1iZXIgb2YgZW50cmllcyBpbiB0aGUgc2NhdHRlcmxpc3QuCisgKiBAZmlyc3QgU3RhcnQgaW5kZXggaW4gdGhlIHNjYXR0ZXJsaXN0IHNnbS0+c2dsLgorICogQGVwX2FkZHIgRW5kIFBvaW50IGFkZHJlc3MgZm9yIHRoZSBzY2F0dGVyL2dhdGhlciB0cmFuc2Zlci4KKyAqIEBkZXNjIHBvaW50ZXIgdG8gZmlyc3QgZGVzY3JpcHRvcgorICoKKyAqIFJldHVybnMgTnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIHRhYmxlIG9uIHN1Y2Nlc3MsIC0xIG9uIGVycm9yLgorICovCitzdGF0aWMgaW50IGFwZV9zZ190b19jaGRtYV90YWJsZShzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnbCwgaW50IG5lbnRzLCBpbnQgZmlyc3QsIHN0cnVjdCBhcGVfY2hkbWFfZGVzYyAqZGVzYywgdTMyIGVwX2FkZHIpCit7CisJaW50IGkgPSBmaXJzdCwgaiA9IDA7CisJLyogaW5zcGVjdCBmaXJzdCBlbnRyeSAqLworCWRtYV9hZGRyX3QgYWRkciA9IHNnX2RtYV9hZGRyZXNzKCZzZ2xbaV0pOworCXVuc2lnbmVkIGludCBsZW4gPSBzZ19kbWFfbGVuKCZzZ2xbaV0pOworCS8qIGNvbnRpZ3VvdXMgYmxvY2sgKi8KKwlkbWFfYWRkcl90IGNvbnRfYWRkciA9IGFkZHI7CisJdW5zaWduZWQgaW50IGNvbnRfbGVuID0gbGVuOworCS8qIGl0ZXJhdGUgb3ZlciByZW1haW5pbmcgZW50cmllcyAqLworCWZvciAoOyBqIDwgMjUgJiYgaSA8IG5lbnRzIC0gMTsgaSsrKSB7CisJCS8qIGJ1cyBhZGRyZXNzIG9mIG5leHQgZW50cnkgaSArIDEgKi8KKwkJZG1hX2FkZHJfdCBuZXh0ID0gc2dfZG1hX2FkZHJlc3MoJnNnbFtpICsgMV0pOworCQkvKiBsZW5ndGggb2YgdGhpcyBlbnRyeSBpICovCisJCWxlbiA9IHNnX2RtYV9sZW4oJnNnbFtpXSk7CisJCXByaW50ayhLRVJOX0RFQlVHICIlMDRkOiBhZGRyPTB4JTA4eCBsZW5ndGg9MHglMDh4XG4iLCBpLCBhZGRyLCBsZW4pOworCQkvKiBlbnRyeSBpICsgMSBpcyBub24tY29udGlndW91cyB3aXRoIGVudHJ5IGk/ICovCisJCWlmIChuZXh0ICE9IGFkZHIgKyBsZW4pIHsKKwkJCS8qIFRPRE8gY3JlYXRlIGVudHJ5IGhlcmUgKHdlIGNvdWxkIG92ZXJ3cml0ZSBpKSAqLworCQkJcHJpbnRrKEtFUk5fREVCVUcgIiU0ZDogY29udF9hZGRyPTB4JTA4eCBjb250X2xlbj0weCUwOHhcbiIsIGosIGNvbnRfYWRkciwgY29udF9sZW4pOworCQkJLyogc2V0IGRlc2NyaXB0b3IgZm9yIGNvbnRpZ3VvdXMgdHJhbnNmZXIgKi8KKwkJCWFwZV9jaGRtYV9kZXNjX3NldCgmZGVzY1tqXSwgY29udF9hZGRyLCBlcF9hZGRyLCBjb250X2xlbik7CisJCQkvKiBuZXh0IGVuZCBwb2ludCBtZW1vcnkgYWRkcmVzcyAqLworCQkJZXBfYWRkciArPSBjb250X2xlbjsKKwkJCS8qIHN0YXJ0IG5ldyBjb250aWd1b3VzIGJsb2NrICovCisJCQljb250X2FkZHIgPSBuZXh0OworCQkJY29udF9sZW4gPSAwOworCQkJaisrOworCQl9CisJCS8qIGFkZCBlbnRyeSBpICsgMSB0byBjdXJyZW50IGNvbnRpZ3VvdXMgYmxvY2sgKi8KKwkJY29udF9sZW4gKz0gbGVuOworCQkvKiBnb3RvIGVudHJ5IGkgKyAxICovCisJCWFkZHIgPSBuZXh0OworCX0KKwkvKiBUT0RPIGNyZWF0ZSBlbnRyeSBoZXJlICAod2UgY291bGQgb3ZlcndyaXRlIGkpICovCisJcHJpbnRrKEtFUk5fREVCVUcgIiUwNGQ6IGFkZHI9MHglMDh4IGxlbmd0aD0weCUwOHhcbiIsIGksIGFkZHIsIGxlbik7CisJcHJpbnRrKEtFUk5fREVCVUcgIiU0ZDogY29udF9hZGRyPTB4JTA4eCBsZW5ndGg9MHglMDh4XG4iLCBqLCBjb250X2FkZHIsIGNvbnRfbGVuKTsKKwlqKys7CisJcmV0dXJuIGo7Cit9CisKKy8qIGNvbXBhcmUgYnVmZmVycyAqLworc3RhdGljIGlubGluZSBpbnQgY29tcGFyZSh1MzIgKnAsIHUzMiAqcSwgaW50IGxlbikKK3sKKwlpbnQgcmVzdWx0ID0gLTE7CisJaW50IGZhaWwgPSAwOworCWludCBpOworCWZvciAoaSA9IDA7IGkgPCBsZW4gLyA0OyBpKyspIHsKKwkJaWYgKCpwID09ICpxKSB7CisJCQkvKiBldmVyeSBzbyBtYW55IHUzMiB3b3Jkcywgc2hvdyBlcXVhbHMgKi8KKwkJCWlmICgoaSAmIDI1NSkgPT0gMCkKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAiWyVwXSA9IDB4JTA4eCAgICBbJXBdID0gMHglMDh4XG4iLCBwLCAqcCwgcSwgKnEpOworCQl9IGVsc2UgeworCQkJZmFpbCsrOworCQkJLyogc2hvdyB0aGUgZmlyc3QgZmV3IG1pc2NvbXBhcmVzICovCisJCQlpZiAoZmFpbCA8IDEwKSB7CisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fREVCVUcgIlslcF0gPSAweCUwOHggIT0gWyVwXSA9IDB4JTA4eCA/IVxuIiwgcCwgKnAsIHEsICpxKTsKKyAgICAgICAgICAgIC8qIGJ1dCBzdG9wIGFmdGVyIGEgd2hpbGUgKi8KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZmFpbCA9PSAxMCkgeworICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0RFQlVHICItLS1tb3JlIGVycm9ycyBmb2xsb3chIG5vdCBwcmludGVkLS0tXG4iKTsKKwkJICAJfSBlbHNlIHsKKwkJCQkvKiBzdG9wIGNvbXBhcmUgYWZ0ZXIgdGhpcyBtYW55IGVycm9ycyAqLworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCQl9CisJCXArKzsKKwkJcSsrOworCX0KKwlpZiAoIWZhaWwpCisJCXJlc3VsdCA9IDA7CisJcmV0dXJuIHJlc3VsdDsKK30KKworLyogZG1hX3Rlc3QoKSAtIFBlcmZvcm0gRE1BIGxvb3AgYmFjayB0ZXN0IHRvIGVuZCBwb2ludCBhbmQgYmFjayB0byByb290IGNvbXBsZXguCisgKgorICogQWxsb2NhdGUgYSBjYWNoZS1jb2hlcmVudCBidWZmZXIgaW4gaG9zdCBtZW1vcnksIGNvbnNpc3Rpbmcgb2YgZm91ciBwYWdlcy4KKyAqCisgKiBGaWxsIHRoZSBmb3VyIG1lbW9yeSBwYWdlcyBzdWNoIHRoYXQgZWFjaCAzMi1iaXQgd29yZCBjb250YWlucyBpdHMgb3duIGFkZHJlc3MuCisgKgorICogTm93IHBlcmZvcm0gYSBsb29wIGJhY2sgdGVzdCwgaGF2ZSB0aGUgZW5kIHBvaW50IGRldmljZSBjb3B5IHRoZSBmaXJzdCBidWZmZXIKKyAqIGhhbGYgdG8gZW5kIHBvaW50IG1lbW9yeSwgdGhlbiBoYXZlIGl0IGNvcHkgYmFjayBpbnRvIHRoZSBzZWNvbmQgaGFsZi4KKyAqCisgKiAgIENyZWF0ZSBhIGRlc2NyaXB0b3IgdGFibGUgdG8gY29weSB0aGUgZmlyc3QgYnVmZmVyIGhhbGYgaW50byBFbmQgUG9pbnQKKyAqICAgbWVtb3J5LiBJbnN0cnVjdCB0aGUgRW5kIFBvaW50IHRvIGRvIGEgRE1BIHJlYWQgdXNpbmcgdGhhdCB0YWJsZS4KKyAqCisgKiAgIENyZWF0ZSBhIGRlc2NyaXB0b3IgdGFibGUgdG8gY29weSBFbmQgUG9pbnQgbWVtb3J5IHRvIHRoZSBzZWNvbmQgYnVmZmVyCisgKiAgIGhhbGYuIEluc3RydWN0IHRoZSBFbmQgUG9pbnQgdG8gZG8gYSBETUEgd3JpdGUgdXNpbmcgdGhhdCB0YWJsZS4KKyAqCisgKiBDb21wYXJlIHJlc3VsdHMsIGZhaWwgb3IgcGFzcy4KKyAqCisgKi8KK3N0YXRpYyBpbnQgX19kZXZpbml0IGRtYV90ZXN0KHN0cnVjdCBhcGVfZGV2ICphcGUsIHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJLyogdGVzdCByZXN1bHQ7IGd1aWx0eSB1bnRpbCBwcm92ZW4gaW5ub2NlbnQgKi8KKwlpbnQgcmVzdWx0ID0gLTE7CisJLyogdGhlIERNQSByZWFkIGhlYWRlciBzaXRzIGF0IGFkZHJlc3MgMHgwMCBvZiB0aGUgRE1BIGVuZ2luZSBCQVIgKi8KKwlzdHJ1Y3QgYXBlX2NoZG1hX2hlYWRlciAqd3JpdGVfaGVhZGVyID0gKHN0cnVjdCBhcGVfY2hkbWFfaGVhZGVyICopYXBlLT5iYXJbQVBFX0JBUl9IRUFERVJdOworCS8qIHRoZSB3cml0ZSBETUEgaGVhZGVyIHNpdHMgYWZ0ZXIgdGhlIHJlYWQgaGVhZGVyIGF0IGFkZHJlc3MgMHgxMCAqLworCXN0cnVjdCBhcGVfY2hkbWFfaGVhZGVyICpyZWFkX2hlYWRlciA9IHdyaXRlX2hlYWRlciArIDE7CisJLyogdmlydHVhbCBhZGRyZXNzIG9mIHRoZSBhbGxvY2F0ZWQgYnVmZmVyICovCisJdTggKmJ1ZmZlcl92aXJ0ID0gMDsKKwkvKiBidXMgYWRkcmVzcyBvZiB0aGUgYWxsb2NhdGVkIGJ1ZmZlciAqLworCWRtYV9hZGRyX3QgYnVmZmVyX2J1cyA9IDA7CisJaW50IGksIG4gPSAwLCBpcnFfY291bnQ7CisKKwkvKiB0ZW1wb3JhcnkgdmFsdWUgdXNlZCB0byBjb25zdHJ1Y3QgMzItYml0IGRhdGEgd29yZHMgKi8KKwl1MzIgdzsKKworCXByaW50ayhLRVJOX0RFQlVHICJiYXJfdGVzdHMoKSwgUEFHRV9TSVpFID0gMHglMHhcbiIsIChpbnQpUEFHRV9TSVpFKTsKKwlwcmludGsoS0VSTl9ERUJVRyAid3JpdGVfaGVhZGVyID0gMHglcC5cbiIsIHdyaXRlX2hlYWRlcik7CisJcHJpbnRrKEtFUk5fREVCVUcgInJlYWRfaGVhZGVyID0gMHglcC5cbiIsIHJlYWRfaGVhZGVyKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiJndyaXRlX2hlYWRlci0+dzMgPSAweCVwXG4iLCAmd3JpdGVfaGVhZGVyLT53Myk7CisJcHJpbnRrKEtFUk5fREVCVUcgIiZyZWFkX2hlYWRlci0+dzMgPSAweCVwXG4iLCAmcmVhZF9oZWFkZXItPnczKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiYXBlLT50YWJsZV92aXJ0ID0gMHglcC5cbiIsIGFwZS0+dGFibGVfdmlydCk7CisKKwlpZiAoIXdyaXRlX2hlYWRlciB8fCAhcmVhZF9oZWFkZXIgfHwgIWFwZS0+dGFibGVfdmlydCkKKyAgICAgICAgZ290byBmYWlsOworCisJLyogYWxsb2NhdGUgYW5kIG1hcCBjb2hlcmVudGx5LWNhY2hlZCBtZW1vcnkgZm9yIGEgRE1BLWFibGUgYnVmZmVyICovCisJLyogQHNlZSAyLjYuMjYuMi9Eb2N1bWVudGF0aW9uL0RNQS1tYXBwaW5nLnR4dCBsaW5lIDMxOCAqLworCWJ1ZmZlcl92aXJ0ID0gKHU4ICopcGNpX2FsbG9jX2NvbnNpc3RlbnQoZGV2LCBQQUdFX1NJWkUgKiA0LCAmYnVmZmVyX2J1cyk7CisJaWYgKCFidWZmZXJfdmlydCkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiQ291bGQgbm90IGFsbG9jYXRlIGNvaGVyZW50IERNQSBidWZmZXIuXG4iKTsKKwkJZ290byBmYWlsOworCX0KKwlwcmludGsoS0VSTl9ERUJVRyAiQWxsb2NhdGVkIGNhY2hlLWNvaGVyZW50IERNQSBidWZmZXIgKHZpcnR1YWwgYWRkcmVzcyA9IDB4JTAxNmxseCwgYnVzIGFkZHJlc3MgPSAweCUwMTZsbHgpLlxuIiwKKwkJKHU2NClidWZmZXJfdmlydCwgKHU2NClidWZmZXJfYnVzKTsKKworCS8qIGZpbGwgZmlyc3QgaGFsZiBvZiBidWZmZXIgd2l0aCBpdHMgdmlydHVhbCBhZGRyZXNzIGFzIGRhdGEgKi8KKwlmb3IgKGkgPSAwOyBpIDwgNCAqIFBBR0VfU0laRTsgaSArPSA0KQorI2lmIDAKKwkJKih1MzIgKikoYnVmZmVyX3ZpcnQgKyBpKSA9IGkgLyBQQUdFX1NJWkUgKyAxOworI2Vsc2UKKwkJKih1MzIgKikoYnVmZmVyX3ZpcnQgKyBpKSA9IChidWZmZXJfdmlydCArIGkpOworI2VuZGlmCisjaWYgMAorICBjb21wYXJlKCh1MzIgKilidWZmZXJfdmlydCwgKHUzMiAqKShidWZmZXJfdmlydCArIDIgKiBQQUdFX1NJWkUpLCA4MTkyKTsKKyNlbmRpZgorCisjaWYgMAorCS8qIGZpbGwgc2Vjb25kIGhhbGYgb2YgYnVmZmVyIHdpdGggemVyb2VzICovCisJZm9yIChpID0gMiAqIFBBR0VfU0laRTsgaSA8IDQgKiBQQUdFX1NJWkU7IGkgKz0gNCkKKwkJKih1MzIgKikoYnVmZmVyX3ZpcnQgKyBpKSA9IDA7CisjZW5kaWYKKworCS8qIGludmFsaWRhdGUgRVBMQVNULCBvdXRzaWRlIDAtMjU1LCAweEZBREUgaXMgZnJvbSB0aGUgdGVzdGJlbmNoICovCisJYXBlLT50YWJsZV92aXJ0LT53MyA9IGNwdV90b19sZTMyKDB4MDAwMEZBREUpOworCisJLyogZmlsbCBpbiBmaXJzdCBkZXNjcmlwdG9yICovCisJbiA9IDA7CisJLyogcmVhZCA4MTkyIGJ5dGVzIGZyb20gUkMgYnVmZmVyIHRvIEVQIGFkZHJlc3MgNDA5NiAqLworCWFwZV9jaGRtYV9kZXNjX3NldCgmYXBlLT50YWJsZV92aXJ0LT5kZXNjW25dLCBidWZmZXJfYnVzLCA0MDk2LCAyICogUEFHRV9TSVpFKTsKKyNpZiAxCisJZm9yIChpID0gMDsgaSA8IDI1NTsgaSsrKSB7CisJCWFwZV9jaGRtYV9kZXNjX3NldCgmYXBlLT50YWJsZV92aXJ0LT5kZXNjW2ldLCBidWZmZXJfYnVzLCA0MDk2LCAyICogUEFHRV9TSVpFKTsKKwl9CisJLyogaW5kZXggb2YgbGFzdCBkZXNjcmlwdG9yICovCisJbiA9IGkgLSAxOworI2VuZGlmCisjaWYgMAorCS8qIGZpbGwgaW4gbmV4dCBkZXNjcmlwdG9yICovCisJbisrOworCS8qIHJlYWQgMTAyNCBieXRlcyBmcm9tIFJDIGJ1ZmZlciB0byBFUCBhZGRyZXNzIDQwOTYgKyAxMDI0ICovCisJYXBlX2NoZG1hX2Rlc2Nfc2V0KCZhcGUtPnRhYmxlX3ZpcnQtPmRlc2Nbbl0sIGJ1ZmZlcl9idXMgKyAxMDI0LCA0MDk2ICsgMTAyNCwgMTAyNCk7CisjZW5kaWYKKworI2lmIDEKKwkvKiBlbmFibGUgTVNJIGFmdGVyIHRoZSBsYXN0IGRlc2NyaXB0b3IgaXMgY29tcGxldGVkICovCisJaWYgKGFwZS0+bXNpX2VuYWJsZWQpCisJCWFwZS0+dGFibGVfdmlydC0+ZGVzY1tuXS53MCB8PSBjcHVfdG9fbGUzMigxVUwgPDwgMTYpLypsb2NhbCBNU0kqLzsKKyNlbmRpZgorI2lmIDAKKwkvKiBkdW1wIGRlc2NyaXB0b3IgdGFibGUgZm9yIGRlYnVnZ2luZyAqLworCXByaW50ayhLRVJOX0RFQlVHICJEZXNjcmlwdG9yIFRhYmxlIChSZWFkLCBpbiBSb290IENvbXBsZXggTWVtb3J5LCAjID0gJWQpXG4iLCBuICsgMSk7CisJZm9yIChpID0gMDsgaSA8IDQgKyAobiArIDEpICogNDsgaSArPSA0KSB7CisJCXUzMiAqcCA9ICh1MzIgKilhcGUtPnRhYmxlX3ZpcnQ7CisJCXAgKz0gaTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIjB4JTA4eC8weCUwMng6IDB4JTA4eCAoTEVOPTB4JXgpXG4iLCAodTMyKXAsICh1MzIpcCAmIDE1LCAqcCwgNCAqIGxlMzJfdG9fY3B1KCpwKSk7CisJCXArKzsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIjB4JTA4eC8weCUwMng6IDB4JTA4eCAoRVBBPTB4JXgpXG4iLCAodTMyKXAsICh1MzIpcCAmIDE1LCAqcCwgbGUzMl90b19jcHUoKnApKTsKKwkJcCsrOworCQlwcmludGsoS0VSTl9ERUJVRyAiMHglMDh4LzB4JTAyeDogMHglMDh4IChSQ0g9MHgleClcbiIsICh1MzIpcCwgKHUzMilwICYgMTUsICpwLCBsZTMyX3RvX2NwdSgqcCkpOworCQlwKys7CisJCXByaW50ayhLRVJOX0RFQlVHICIweCUwOHgvMHglMDJ4OiAweCUwOHggKFJDTD0weCV4KVxuIiwgKHUzMilwLCAodTMyKXAgJiAxNSwgKnAsIGxlMzJfdG9fY3B1KCpwKSk7CisJfQorI2VuZGlmCisJLyogc2V0IGF2YWlsYWJsZSBudW1iZXIgb2YgZGVzY3JpcHRvcnMgaW4gdGFibGUgKi8KKwl3ID0gKHUzMikobiArIDEpOworCXcgfD0gKDFVTCA8PCAxOCkvKmdsb2JhbCBFUExBU1RfRU4qLzsKKyNpZiAwCisJaWYgKGFwZS0+bXNpX2VuYWJsZWQpCisJCXcgfD0gKDFVTCA8PCAxNykvKmdsb2JhbCBNU0kqLzsKKyNlbmRpZgorCXByaW50ayhLRVJOX0RFQlVHICJ3cml0aW5nIDB4JTA4eCB0byAweCVwXG4iLCB3LCAodm9pZCAqKSZyZWFkX2hlYWRlci0+dzApOworCWlvd3JpdGUzMih3LCAmcmVhZF9oZWFkZXItPncwKTsKKworCS8qIHdyaXRlIHRhYmxlIGFkZHJlc3MgKGhpZ2hlciAzMi1iaXRzKSAqLworCXByaW50ayhLRVJOX0RFQlVHICJ3cml0aW5nIDB4JTA4eCB0byAweCVwXG4iLCAodTMyKSgoYXBlLT50YWJsZV9idXMgPj4gMTYpID4+IDE2KSwgKHZvaWQgKikmcmVhZF9oZWFkZXItPmJkdF9hZGRyX2gpOworCWlvd3JpdGUzMihwY2lfZG1hX2goYXBlLT50YWJsZV9idXMpLCAmcmVhZF9oZWFkZXItPmJkdF9hZGRyX2gpOworCisJLyogd3JpdGUgdGFibGUgYWRkcmVzcyAobG93ZXIgMzItYml0cykgKi8KKwlwcmludGsoS0VSTl9ERUJVRyAid3JpdGluZyAweCUwOHggdG8gMHglcFxuIiwgKHUzMikoYXBlLT50YWJsZV9idXMgJiAweGZmZmZmZmZmVUwpLCAodm9pZCAqKSZyZWFkX2hlYWRlci0+YmR0X2FkZHJfbCk7CisJaW93cml0ZTMyKHBjaV9kbWFfbChhcGUtPnRhYmxlX2J1cyksICZyZWFkX2hlYWRlci0+YmR0X2FkZHJfbCk7CisKKwkvKiBtZW1vcnkgd3JpdGUgYmFycmllciAqLworCXdtYigpOworCXByaW50ayhLRVJOX0RFQlVHICJGbHVzaCBwb3N0ZWQgd3JpdGVzXG4iKTsKKwkvKiogRklYTUUgQWRkIGR1bW15IHJlYWQgdG8gZmx1c2ggcG9zdGVkIHdyaXRlcyBidXQgbmVlZCBhIHJlYWRhYmxlIGxvY2F0aW9uISAqLworI2lmIDAKKwkodm9pZClpb3JlYWQzMigpOworI2VuZGlmCisKKwkvKiByZW1lbWJlciBJUlEgY291bnQgYmVmb3JlIHRoZSB0cmFuc2ZlciAqLworCWlycV9jb3VudCA9IGFwZS0+aXJxX2NvdW50OworCS8qIHdyaXRlIG51bWJlciBvZiBkZXNjcmlwdG9ycyAtIHRoaXMgc3RhcnRzIHRoZSBETUEgKi8KKwlwcmludGsoS0VSTl9ERUJVRyAiXG5TdGFydCBETUEgcmVhZFxuIik7CisJcHJpbnRrKEtFUk5fREVCVUcgIndyaXRpbmcgMHglMDh4IHRvIDB4JXBcbiIsICh1MzIpbiwgKHZvaWQgKikmcmVhZF9oZWFkZXItPnczKTsKKwlpb3dyaXRlMzIobiwgJnJlYWRfaGVhZGVyLT53Myk7CisJcHJpbnRrKEtFUk5fREVCVUcgIkVQTEFTVCA9ICVsdVxuIiwgbGUzMl90b19jcHUoKih1MzIgKikmYXBlLT50YWJsZV92aXJ0LT53MykgJiAweGZmZmZVTCk7CisKKwkvKiogbWVtb3J5IHdyaXRlIGJhcnJpZXIgKi8KKwl3bWIoKTsKKwkvKiBkdW1teSByZWFkIHRvIGZsdXNoIHBvc3RlZCB3cml0ZXMgKi8KKwkvKiBGSVhNRSBOZWVkIGEgcmVhZGFibGUgbG9jYXRpb24hICovCisjaWYgMAorCSh2b2lkKWlvcmVhZDMyKCk7CisjZW5kaWYKKwlwcmludGsoS0VSTl9ERUJVRyAiUE9MTCBGT1IgUkVBRDpcbiIpOworCS8qIHBvbGwgZm9yIGNoYWluIGNvbXBsZXRpb24sIDEwMDAgdGltZXMgMSBtaWxsaXNlY29uZCAqLworCWZvciAoaSA9IDA7IGkgPCAxMDA7IGkrKykgeworCQl2b2xhdGlsZSB1MzIgKnAgPSAmYXBlLT50YWJsZV92aXJ0LT53MzsKKwkJdTMyIGVwbGFzdCA9IGxlMzJfdG9fY3B1KCpwKSAmIDB4ZmZmZlVMOworCQlwcmludGsoS0VSTl9ERUJVRyAiRVBMQVNUID0gJXUsIG4gPSAlZFxuIiwgZXBsYXN0LCBuKTsKKwkJaWYgKGVwbGFzdCA9PSBuKSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiRE9ORVxuIik7CisgICAgICAgICAgICAvKiBwcmludCBJUlEgY291bnQgYmVmb3JlIHRoZSB0cmFuc2ZlciAqLworCQkJcHJpbnRrKEtFUk5fREVCVUcgIiNJUlFzIGR1cmluZyB0cmFuc2ZlcjogJWRcbiIsIGFwZS0+aXJxX2NvdW50IC0gaXJxX2NvdW50KTsKKwkJCWJyZWFrOworCQl9CisJCXVkZWxheSgxMDApOworCX0KKworCS8qIGludmFsaWRhdGUgRVBMQVNULCBvdXRzaWRlIDAtMjU1LCAweEZBREUgaXMgZnJvbSB0aGUgdGVzdGJlbmNoICovCisJYXBlLT50YWJsZV92aXJ0LT53MyA9IGNwdV90b19sZTMyKDB4MDAwMEZBREUpOworCisJLyogc2V0dXAgZmlyc3QgZGVzY3JpcHRvciAqLworCW4gPSAwOworCWFwZV9jaGRtYV9kZXNjX3NldCgmYXBlLT50YWJsZV92aXJ0LT5kZXNjW25dLCBidWZmZXJfYnVzICsgODE5MiwgNDA5NiwgMiAqIFBBR0VfU0laRSk7CisjaWYgMQorCWZvciAoaSA9IDA7IGkgPCAyNTU7IGkrKykgeworCQlhcGVfY2hkbWFfZGVzY19zZXQoJmFwZS0+dGFibGVfdmlydC0+ZGVzY1tpXSwgYnVmZmVyX2J1cyArIDgxOTIsIDQwOTYsIDIgKiBQQUdFX1NJWkUpOworCX0KKwkvKiBpbmRleCBvZiBsYXN0IGRlc2NyaXB0b3IgKi8KKwluID0gaSAtIDE7CisjZW5kaWYKKyNpZiAxIC8qIHRlc3QgdmFyaWFibGUsIG1ha2UgYSBtb2R1bGUgb3B0aW9uIGxhdGVyICovCisJaWYgKGFwZS0+bXNpX2VuYWJsZWQpCisJCWFwZS0+dGFibGVfdmlydC0+ZGVzY1tuXS53MCB8PSBjcHVfdG9fbGUzMigxVUwgPDwgMTYpLypsb2NhbCBNU0kqLzsKKyNlbmRpZgorI2lmIDAKKwkvKiBkdW1wIGRlc2NyaXB0b3IgdGFibGUgZm9yIGRlYnVnZ2luZyAqLworCXByaW50ayhLRVJOX0RFQlVHICJEZXNjcmlwdG9yIFRhYmxlIChXcml0ZSwgaW4gUm9vdCBDb21wbGV4IE1lbW9yeSwgIyA9ICVkKVxuIiwgbiArIDEpOworCWZvciAoaSA9IDA7IGkgPCA0ICsgKG4gKyAxKSAqIDQ7IGkgKz0gNCkgeworCQl1MzIgKnAgPSAodTMyICopYXBlLT50YWJsZV92aXJ0OworCQlwICs9IGk7CisJCXByaW50ayhLRVJOX0RFQlVHICIweCUwOHgvMHglMDJ4OiAweCUwOHggKExFTj0weCV4KVxuIiwgKHUzMilwLCAodTMyKXAgJiAxNSwgKnAsIDQgKiBsZTMyX3RvX2NwdSgqcCkpOworCQlwKys7CisJCXByaW50ayhLRVJOX0RFQlVHICIweCUwOHgvMHglMDJ4OiAweCUwOHggKEVQQT0weCV4KVxuIiwgKHUzMilwLCAodTMyKXAgJiAxNSwgKnAsIGxlMzJfdG9fY3B1KCpwKSk7CisJCXArKzsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIjB4JTA4eC8weCUwMng6IDB4JTA4eCAoUkNIPTB4JXgpXG4iLCAodTMyKXAsICh1MzIpcCAmIDE1LCAqcCwgbGUzMl90b19jcHUoKnApKTsKKwkJcCsrOworCQlwcmludGsoS0VSTl9ERUJVRyAiMHglMDh4LzB4JTAyeDogMHglMDh4IChSQ0w9MHgleClcbiIsICh1MzIpcCwgKHUzMilwICYgMTUsICpwLCBsZTMyX3RvX2NwdSgqcCkpOworCX0KKyNlbmRpZgorCisJLyogc2V0IG51bWJlciBvZiBhdmFpbGFibGUgZGVzY3JpcHRvcnMgaW4gdGhlIHRhYmxlICovCisJdyA9ICh1MzIpKG4gKyAxKTsKKwkvKiBlbmFibGUgdXBkYXRlcyBvZiBlcGxhc3QgZm9yIGVhY2ggZGVzY3JpcHRvciBjb21wbGV0aW9uICovCisJdyB8PSAodTMyKSgxVUwgPDwgMTgpLypnbG9iYWwgRVBMQVNUX0VOKi87CisjaWYgMCAvLyB0ZXN0IHZhcmlhYmxlLCBtYWtlIGEgbW9kdWxlIG9wdGlvbiBsYXRlcgorCS8qIGVuYWJsZSBNU0kgZm9yIGVhY2ggZGVzY3JpcHRvciBjb21wbGV0aW9uICovCisJaWYgKGFwZS0+bXNpX2VuYWJsZWQpCisJCXcgfD0gKDFVTCA8PCAxNykvKmdsb2JhbCBNU0kqLzsKKyNlbmRpZgorCWlvd3JpdGUzMih3LCAmd3JpdGVfaGVhZGVyLT53MCk7CisJaW93cml0ZTMyKHBjaV9kbWFfaChhcGUtPnRhYmxlX2J1cyksICZ3cml0ZV9oZWFkZXItPmJkdF9hZGRyX2gpOworCWlvd3JpdGUzMihwY2lfZG1hX2woYXBlLT50YWJsZV9idXMpLCAmd3JpdGVfaGVhZGVyLT5iZHRfYWRkcl9sKTsKKworCS8qKiBtZW1vcnkgd3JpdGUgYmFycmllciBhbmQgZmx1c2ggcG9zdGVkIHdyaXRlcyAqLworCXdtYigpOworCS8qIGR1bW15IHJlYWQgdG8gZmx1c2ggcG9zdGVkIHdyaXRlcyAqLworCS8qIEZJWE1FIE5lZWQgYSByZWFkYWJsZSBsb2NhdGlvbiEgKi8KKyNpZiAwCisJKHZvaWQpaW9yZWFkMzIoKTsKKyNlbmRpZgorCWlycV9jb3VudCA9IGFwZS0+aXJxX2NvdW50OworCisJcHJpbnRrKEtFUk5fREVCVUcgIlxuU3RhcnQgRE1BIHdyaXRlXG4iKTsKKwlpb3dyaXRlMzIobiwgJndyaXRlX2hlYWRlci0+dzMpOworCisJLyoqIG1lbW9yeSB3cml0ZSBiYXJyaWVyICovCisJd21iKCk7CisJLyoqIGR1bW15IHJlYWQgdG8gZmx1c2ggcG9zdGVkIHdyaXRlcyAqLworCS8vKHZvaWQpaW9yZWFkMzIoKTsKKworCXByaW50ayhLRVJOX0RFQlVHICJQT0xMIEZPUiBXUklURTpcbiIpOworCS8qIHBvbGwgZm9yIGNvbXBsZXRpb24sIDEwMDAgdGltZXMgMSBtaWxsaXNlY29uZCAqLworCWZvciAoaSA9IDA7IGkgPCAxMDA7IGkrKykgeworCQl2b2xhdGlsZSB1MzIgKnAgPSAmYXBlLT50YWJsZV92aXJ0LT53MzsKKwkJdTMyIGVwbGFzdCA9IGxlMzJfdG9fY3B1KCpwKSAmIDB4ZmZmZlVMOworCQlwcmludGsoS0VSTl9ERUJVRyAiRVBMQVNUID0gJXUsIG4gPSAlZFxuIiwgZXBsYXN0LCBuKTsKKwkJaWYgKGVwbGFzdCA9PSBuKSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiRE9ORVxuIik7CisJCQkvKiBwcmludCBJUlEgY291bnQgYmVmb3JlIHRoZSB0cmFuc2ZlciAqLworCQkJcHJpbnRrKEtFUk5fREVCVUcgIiNJUlFzIGR1cmluZyB0cmFuc2ZlcjogJWRcbiIsIGFwZS0+aXJxX2NvdW50IC0gaXJxX2NvdW50KTsKKwkJCWJyZWFrOworCQl9CisJCXVkZWxheSgxMDApOworCX0KKwkvKiBzb2Z0LXJlc2V0IERNQSB3cml0ZSBlbmdpbmUgKi8KKwlpb3dyaXRlMzIoMHgwMDAwZmZmZlVMLCAmd3JpdGVfaGVhZGVyLT53MCk7CisJLyogc29mdC1yZXNldCBETUEgcmVhZCBlbmdpbmUgKi8KKwlpb3dyaXRlMzIoMHgwMDAwZmZmZlVMLCAmcmVhZF9oZWFkZXItPncwKTsKKworCS8qKiBtZW1vcnkgd3JpdGUgYmFycmllciAqLworCXdtYigpOworCS8qIGR1bW15IHJlYWQgdG8gZmx1c2ggcG9zdGVkIHdyaXRlcyAqLworCS8qIEZJWE1FIE5lZWQgYSByZWFkYWJsZSBsb2NhdGlvbiEgKi8KKyNpZiAwCisJKHZvaWQpaW9yZWFkMzIoKTsKKyNlbmRpZgorCS8qIGNvbXBhcmUgZmlyc3QgaGFsZiBvZiBidWZmZXIgd2l0aCBzZWNvbmQgaGFsZiwgc2hvdWxkIGJlIGlkZW50aWNhbCAqLworCXJlc3VsdCA9IGNvbXBhcmUoKHUzMiAqKWJ1ZmZlcl92aXJ0LCAodTMyICopKGJ1ZmZlcl92aXJ0ICsgMiAqIFBBR0VfU0laRSksIDgxOTIpOworCXByaW50ayhLRVJOX0RFQlVHICJETUEgbG9vcCBiYWNrIHRlc3QgJXMuXG4iLCByZXN1bHQgPyAiRkFJTEVEIiA6ICJQQVNTRUQiKTsKKworCXBjaV9mcmVlX2NvbnNpc3RlbnQoZGV2LCA0ICogUEFHRV9TSVpFLCBidWZmZXJfdmlydCwgYnVmZmVyX2J1cyk7CitmYWlsOgorCXByaW50ayhLRVJOX0RFQlVHICJiYXJfdGVzdHMoKSBlbmQsIHJlc3VsdCAlZFxuIiwgcmVzdWx0KTsKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKiBDYWxsZWQgd2hlbiB0aGUgUENJIHN1YiBzeXN0ZW0gdGhpbmtzIHdlIGNhbiBjb250cm9sIHRoZSBnaXZlbiBkZXZpY2UuCisgKiBJbnNwZWN0IGlmIHdlIGNhbiBzdXBwb3J0IHRoZSBkZXZpY2UgYW5kIGlmIHNvIHRha2UgY29udHJvbCBvZiBpdC4KKyAqCisgKiBSZXR1cm4gMCB3aGVuIHdlIGhhdmUgdGFrZW4gY29udHJvbCBvZiB0aGUgZ2l2ZW4gZGV2aWNlLgorICoKKyAqIC0gYWxsb2NhdGUgYm9hcmQgc3BlY2lmaWMgYm9va2tlZXBpbmcKKyAqIC0gYWxsb2NhdGUgY29oZXJlbnRseS1tYXBwZWQgbWVtb3J5IGZvciB0aGUgZGVzY3JpcHRvciB0YWJsZQorICogLSBlbmFibGUgdGhlIGJvYXJkCisgKiAtIHZlcmlmeSBib2FyZCByZXZpc2lvbgorICogLSByZXF1ZXN0IHJlZ2lvbnMKKyAqIC0gcXVlcnkgRE1BIG1hc2sKKyAqIC0gb2J0YWluIGFuZCByZXF1ZXN0IGlycQorICogLSBtYXAgcmVnaW9ucyBpbnRvIGtlcm5lbCBhZGRyZXNzIHNwYWNlCisgKi8KK3N0YXRpYyBpbnQgX19kZXZpbml0IHByb2JlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKK3sKKwlpbnQgcmMgPSAwOworCXN0cnVjdCBhcGVfZGV2ICphcGUgPSBOVUxMOworCXU4IGlycV9waW4sIGlycV9saW5lOworCXByaW50ayhLRVJOX0RFQlVHICJwcm9iZShkZXYgPSAweCVwLCBwY2lpZCA9IDB4JXApXG4iLCBkZXYsIGlkKTsKKworCS8qIGFsbG9jYXRlIG1lbW9yeSBmb3IgcGVyLWJvYXJkIGJvb2sga2VlcGluZyAqLworCWFwZSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhcGVfZGV2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFhcGUpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIkNvdWxkIG5vdCBremFsbG9jKClhdGUgbWVtb3J5LlxuIik7CisJCWdvdG8gZXJyX2FwZTsKKwl9CisJYXBlLT5wY2lfZGV2ID0gZGV2OworCWRldi0+ZGV2LmRyaXZlcl9kYXRhID0gKHZvaWQgKilhcGU7CisJcHJpbnRrKEtFUk5fREVCVUcgInByb2JlKCkgYXBlID0gMHglcFxuIiwgYXBlKTsKKworCXByaW50ayhLRVJOX0RFQlVHICJzaXplb2Yoc3RydWN0IGFwZV9jaGRtYV90YWJsZSkgPSAlZC5cbiIsCisJCShpbnQpc2l6ZW9mKHN0cnVjdCBhcGVfY2hkbWFfdGFibGUpKTsKKwkvKiB0aGUgcmVmZXJlbmNlIGRlc2lnbiBoYXMgYSBzaXplIHJlc3RyaWN0aW9uIG9uIHRoZSB0YWJsZSBzaXplICovCisJQlVHX09OKHNpemVvZihzdHJ1Y3QgYXBlX2NoZG1hX3RhYmxlKSA+IEFQRV9DSERNQV9UQUJMRV9TSVpFKTsKKworCS8qIGFsbG9jYXRlIGFuZCBtYXAgY29oZXJlbnRseS1jYWNoZWQgbWVtb3J5IGZvciBhIGRlc2NyaXB0b3IgdGFibGUgKi8KKwkvKiBAc2VlIExERDMgcGFnZSA0NDYgKi8KKwlhcGUtPnRhYmxlX3ZpcnQgPSAoc3RydWN0IGFwZV9jaGRtYV90YWJsZSAqKXBjaV9hbGxvY19jb25zaXN0ZW50KGRldiwKKwkJQVBFX0NIRE1BX1RBQkxFX1NJWkUsICZhcGUtPnRhYmxlX2J1cyk7CisJLyogY291bGQgbm90IGFsbG9jYXRlIHRhYmxlPyAqLworCWlmICghYXBlLT50YWJsZV92aXJ0KSB7CisJCXByaW50ayhLRVJOX0RFQlVHICJDb3VsZCBub3QgZG1hX2FsbG9jKClhdGVfY29oZXJlbnQgbWVtb3J5LlxuIik7CisJCWdvdG8gZXJyX3RhYmxlOworCX0KKworCXByaW50ayhLRVJOX0RFQlVHICJ0YWJsZV92aXJ0ID0gMHglMTZsbHgsIHRhYmxlX2J1cyA9IDB4JTE2bGx4LlxuIiwKKwkJKHU2NClhcGUtPnRhYmxlX3ZpcnQsICh1NjQpYXBlLT50YWJsZV9idXMpOworCisJLyogZW5hYmxlIGRldmljZSAqLworCXJjID0gcGNpX2VuYWJsZV9kZXZpY2UoZGV2KTsKKwlpZiAocmMpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgInBjaV9lbmFibGVfZGV2aWNlKCkgZmFpbGVkXG4iKTsKKwkJZ290byBlcnJfZW5hYmxlOworCX0KKworCS8qIGVuYWJsZSBidXMgbWFzdGVyIGNhcGFiaWxpdHkgb24gZGV2aWNlICovCisJcGNpX3NldF9tYXN0ZXIoZGV2KTsKKwkvKiBlbmFibGUgbWVzc2FnZSBzaWduYWxlZCBpbnRlcnJ1cHRzICovCisJcmMgPSBwY2lfZW5hYmxlX21zaShkZXYpOworCS8qIGNvdWxkIG5vdCB1c2UgTVNJPyAqLworCWlmIChyYykgeworCQkvKiByZXNvcnQgdG8gbGVnYWN5IGludGVycnVwdHMgKi8KKwkJcHJpbnRrKEtFUk5fREVCVUcgIkNvdWxkIG5vdCBlbmFibGUgTVNJIGludGVycnVwdGluZy5cbiIpOworCQlhcGUtPm1zaV9lbmFibGVkID0gMDsKKwkvKiBNU0kgZW5hYmxlZCwgcmVtZW1iZXIgZm9yIGNsZWFudXAgKi8KKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9ERUJVRyAiRW5hYmxlZCBNU0kgaW50ZXJydXB0aW5nLlxuIik7CisJCWFwZS0+bXNpX2VuYWJsZWQgPSAxOworCX0KKworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgUENJX1JFVklTSU9OX0lELCAmYXBlLT5yZXZpc2lvbik7CisjaWYgMCAvKiBleGFtcGxlICovCisJLyogKGZvciBleGFtcGxlKSB0aGlzIGRyaXZlciBkb2VzIG5vdCBzdXBwb3J0IHJldmlzaW9uIDB4NDIgKi8KKyAgICBpZiAoYXBlLT5yZXZpc2lvbiA9PSAweDQyKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICJSZXZpc2lvbiAweDQyIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBkcml2ZXIuXG4iKTsKKwkJcmMgPSAtRU5PREVWOworCQlnb3RvIGVycl9yZXY7CisJfQorI2VuZGlmCisJLyoqIFhYWCBjaGVjayBmb3IgbmF0aXZlIG9yIGxlZ2FjeSBQQ0llIGVuZHBvaW50PyAqLworCisJcmMgPSBwY2lfcmVxdWVzdF9yZWdpb25zKGRldiwgRFJWX05BTUUpOworCS8qIGNvdWxkIG5vdCByZXF1ZXN0IGFsbCByZWdpb25zPyAqLworCWlmIChyYykgeworCQkvKiBhc3N1bWUgZGV2aWNlIGlzIGluIHVzZSAoYW5kIGRvIG5vdCBkaXNhYmxlIGl0IGxhdGVyISkgKi8KKwkJYXBlLT5pbl91c2UgPSAxOworCQlnb3RvIGVycl9yZWdpb25zOworCX0KKwlhcGUtPmdvdF9yZWdpb25zID0gMTsKKworI2lmIDEgLy8gQHRvZG8gRm9yIG5vdywgZGlzYWJsZSA2NC1iaXQsIGJlY2F1c2UgSSBkbyBub3QgdW5kZXJzdGFuZCB0aGUgaW1wbGljYXRpb25zIChEQUMhKQorCS8qIHF1ZXJ5IGZvciBETUEgdHJhbnNmZXIgKi8KKwkvKiBAc2VlIERvY3VtZW50YXRpb24vRE1BLW1hcHBpbmcudHh0ICovCisJaWYgKCFwY2lfc2V0X2RtYV9tYXNrKGRldiwgRE1BXzY0QklUX01BU0spKSB7CisJCXBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhkZXYsIERNQV82NEJJVF9NQVNLKTsKKwkJLyogdXNlIDY0LWJpdCBETUEgKi8KKwkJcHJpbnRrKEtFUk5fREVCVUcgIlVzaW5nIGEgNjQtYml0IERNQSBtYXNrLlxuIik7CisJfSBlbHNlCisjZW5kaWYKKwlpZiAoIXBjaV9zZXRfZG1hX21hc2soZGV2LCBETUFfMzJCSVRfTUFTSykpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIkNvdWxkIG5vdCBzZXQgNjQtYml0IERNQSBtYXNrLlxuIik7CisJCXBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhkZXYsIERNQV8zMkJJVF9NQVNLKTsKKwkJLyogdXNlIDMyLWJpdCBETUEgKi8KKwkJcHJpbnRrKEtFUk5fREVCVUcgIlVzaW5nIGEgMzItYml0IERNQSBtYXNrLlxuIik7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIk5vIHN1aXRhYmxlIERNQSBwb3NzaWJsZS5cbiIpOworCQkvKiogQHRvZG8gQ2hvb3NlIHByb3BlciBlcnJvciByZXR1cm4gY29kZSAqLworCQlyYyA9IC0xOworCQlnb3RvIGVycl9tYXNrOworCX0KKworCXJjID0gcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCBQQ0lfSU5URVJSVVBUX1BJTiwgJmlycV9waW4pOworCS8qIGNvdWxkIG5vdCByZWFkPyAqLworCWlmIChyYykKKwkJZ290byBlcnJfaXJxOworCXByaW50ayhLRVJOX0RFQlVHICJJUlEgcGluICMlZCAoMD1ub25lLCAxPUlOVEEjLi4uND1JTlREIykuXG4iLCBpcnFfcGluKTsKKworCS8qIEBzZWUgTEREMywgcGFnZSAzMTggKi8KKwlyYyA9IHBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgUENJX0lOVEVSUlVQVF9MSU5FLCAmaXJxX2xpbmUpOworCS8qIGNvdWxkIG5vdCByZWFkPyAqLworCWlmIChyYykgeworCQlwcmludGsoS0VSTl9ERUJVRyAiQ291bGQgbm90IHF1ZXJ5IFBDSV9JTlRFUlJVUFRfTElORSwgZXJyb3IgJWRcbiIsIHJjKTsKKwkJZ290byBlcnJfaXJxOworCX0KKwlwcmludGsoS0VSTl9ERUJVRyAiSVJRIGxpbmUgIyVkLlxuIiwgaXJxX2xpbmUpOworI2lmIDEKKwlpcnFfbGluZSA9IGRldi0+aXJxOworCS8qIEBzZWUgTEREMywgcGFnZSAyNTkgKi8KKwlyYyA9IHJlcXVlc3RfaXJxKGlycV9saW5lLCBhbHRwY2llY2hkbWFfaXNyLCBJUlFGX1NIQVJFRCwgRFJWX05BTUUsICh2b2lkICopYXBlKTsKKwlpZiAocmMpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIkNvdWxkIG5vdCByZXF1ZXN0IElSUSAjJWQsIGVycm9yICVkXG4iLCBpcnFfbGluZSwgcmMpOworCQlhcGUtPmlycV9saW5lID0gLTE7CisJCWdvdG8gZXJyX2lycTsKKwl9CisJLyogcmVtZW1iZXIgd2hpY2ggaXJxIHdlIGFsbG9jYXRlZCAqLworCWFwZS0+aXJxX2xpbmUgPSAoaW50KWlycV9saW5lOworCXByaW50ayhLRVJOX0RFQlVHICJTdWNjZXNmdWxseSByZXF1ZXN0ZWQgSVJRICMlZCB3aXRoIGRldl9pZCAweCVwXG4iLCBpcnFfbGluZSwgYXBlKTsKKyNlbmRpZgorCS8qIHNob3cgQkFScyAqLworCXNjYW5fYmFycyhhcGUsIGRldik7CisJLyogbWFwIEJBUnMgKi8KKwlyYyA9IG1hcF9iYXJzKGFwZSwgZGV2KTsKKwlpZiAocmMpCisJCWdvdG8gZXJyX21hcDsKKyNpZiBBTFRQQ0lFQ0hETUFfQ0RFVgorCS8qIGluaXRpYWxpemUgY2hhcmFjdGVyIGRldmljZSAqLworCXJjID0gc2dfaW5pdChhcGUpOworCWlmIChyYykKKwkJZ290byBlcnJfY2RldjsKKyNlbmRpZgorCS8qIHBlcmZvcm0gRE1BIGVuZ2luZXMgbG9vcCBiYWNrIHRlc3QgKi8KKwlyYyA9IGRtYV90ZXN0KGFwZSwgZGV2KTsKKwkodm9pZClyYzsKKwkvKiBzdWNjZXNmdWxseSB0b29rIHRoZSBkZXZpY2UgKi8KKwlyYyA9IDA7CisJcHJpbnRrKEtFUk5fREVCVUcgInByb2JlKCkgc3VjY2Vzc2Z1bC5cbiIpOworCWdvdG8gZW5kOworZXJyX2NkZXY6CisJLyogdW5tYXAgdGhlIEJBUnMgKi8KKwl1bm1hcF9iYXJzKGFwZSwgZGV2KTsKK2Vycl9tYXA6CisJLyogZnJlZSBhbGxvY2F0ZWQgaXJxICovCisJaWYgKGFwZS0+aXJxX2xpbmUgPj0gMCkKKwkJZnJlZV9pcnEoYXBlLT5pcnFfbGluZSwgKHZvaWQgKilhcGUpOworZXJyX2lycToKKwlpZiAoYXBlLT5tc2lfZW5hYmxlZCkKKwkJcGNpX2Rpc2FibGVfbXNpKGRldik7CisJLyogZGlzYWJsZSB0aGUgZGV2aWNlIGlmZiBpdCBpcyBub3QgaW4gdXNlICovCisJaWYgKCFhcGUtPmluX3VzZSkKKwkJcGNpX2Rpc2FibGVfZGV2aWNlKGRldik7CisJaWYgKGFwZS0+Z290X3JlZ2lvbnMpCisJCXBjaV9yZWxlYXNlX3JlZ2lvbnMoZGV2KTsKK2Vycl9tYXNrOgorZXJyX3JlZ2lvbnM6CitlcnJfcmV2OgorLyogY2xlYW4gdXAgZXZlcnl0aGluZyBiZWZvcmUgZGV2aWNlIGVuYWJsZSgpICovCitlcnJfZW5hYmxlOgorCWlmIChhcGUtPnRhYmxlX3ZpcnQpCisJCXBjaV9mcmVlX2NvbnNpc3RlbnQoZGV2LCBBUEVfQ0hETUFfVEFCTEVfU0laRSwgYXBlLT50YWJsZV92aXJ0LCBhcGUtPnRhYmxlX2J1cyk7CisvKiBjbGVhbiB1cCBldmVyeXRoaW5nIGJlZm9yZSBhbGxvY2F0aW5nIGRlc2NyaXB0b3IgdGFibGUgKi8KK2Vycl90YWJsZToKKwlpZiAoYXBlKQorCQlrZnJlZShhcGUpOworZXJyX2FwZToKK2VuZDoKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCByZW1vdmUoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwlzdHJ1Y3QgYXBlX2RldiAqYXBlOworCXByaW50ayhLRVJOX0RFQlVHICJyZW1vdmUoMHglcClcbiIsIGRldik7CisJaWYgKChkZXYgPT0gMCkgfHwgKGRldi0+ZGV2LmRyaXZlcl9kYXRhID09IDApKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICJyZW1vdmUoZGV2ID0gMHglcCkgZGV2LT5kZXYuZHJpdmVyX2RhdGEgPSAweCVwXG4iLCBkZXYsIGRldi0+ZGV2LmRyaXZlcl9kYXRhKTsKKwkJcmV0dXJuOworCX0KKwlhcGUgPSAoc3RydWN0IGFwZV9kZXYgKilkZXYtPmRldi5kcml2ZXJfZGF0YTsKKwlwcmludGsoS0VSTl9ERUJVRyAicmVtb3ZlKGRldiA9IDB4JXApIHdoZXJlIGRldi0+ZGV2LmRyaXZlcl9kYXRhID0gMHglcFxuIiwgZGV2LCBhcGUpOworCWlmIChhcGUtPnBjaV9kZXYgIT0gZGV2KSB7CisJCXByaW50ayhLRVJOX0RFQlVHICJkZXYtPmRldi5kcml2ZXJfZGF0YS0+cGNpX2RldiAoMHglMDhseCkgIT0gZGV2ICgweCUwOGx4KVxuIiwKKwkJKHVuc2lnbmVkIGxvbmcpYXBlLT5wY2lfZGV2LCAodW5zaWduZWQgbG9uZylkZXYpOworCX0KKwkvKiByZW1vdmUgY2hhcmFjdGVyIGRldmljZSAqLworI2lmIEFMVFBDSUVDSERNQV9DREVWCisJc2dfZXhpdChhcGUpOworI2VuZGlmCisKKwlpZiAoYXBlLT50YWJsZV92aXJ0KQorCQlwY2lfZnJlZV9jb25zaXN0ZW50KGRldiwgQVBFX0NIRE1BX1RBQkxFX1NJWkUsIGFwZS0+dGFibGVfdmlydCwgYXBlLT50YWJsZV9idXMpOworCisJLyogZnJlZSBJUlEKKwkgKiBAc2VlIExERDMgcGFnZSAyNzkKKwkgKi8KKwlpZiAoYXBlLT5pcnFfbGluZSA+PSAwKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICJGcmVlaW5nIElSUSAjJWQgZm9yIGRldl9pZCAweCUwOGx4LlxuIiwKKwkJYXBlLT5pcnFfbGluZSwgKHVuc2lnbmVkIGxvbmcpYXBlKTsKKwkJZnJlZV9pcnEoYXBlLT5pcnFfbGluZSwgKHZvaWQgKilhcGUpOworCX0KKwkvKiBNU0kgd2FzIGVuYWJsZWQ/ICovCisJaWYgKGFwZS0+bXNpX2VuYWJsZWQpIHsKKwkJLyogRGlzYWJsZSBNU0kgQHNlZSBEb2N1bWVudGF0aW9uL01TSS1IT1dUTy50eHQgKi8KKwkJcGNpX2Rpc2FibGVfbXNpKGRldik7CisJCWFwZS0+bXNpX2VuYWJsZWQgPSAwOworCX0KKwkvKiB1bm1hcCB0aGUgQkFScyAqLworCXVubWFwX2JhcnMoYXBlLCBkZXYpOworCWlmICghYXBlLT5pbl91c2UpCisJCXBjaV9kaXNhYmxlX2RldmljZShkZXYpOworCWlmIChhcGUtPmdvdF9yZWdpb25zKQorCQkvKiB0byBiZSBjYWxsZWQgYWZ0ZXIgZGV2aWNlIGRpc2FibGUgKi8KKwkJcGNpX3JlbGVhc2VfcmVnaW9ucyhkZXYpOworfQorCisjaWYgQUxUUENJRUNIRE1BX0NERVYKKworLyoKKyAqIENhbGxlZCB3aGVuIHRoZSBkZXZpY2UgZ29lcyBmcm9tIHVudXNlZCB0byB1c2VkLgorICovCitzdGF0aWMgaW50IHNnX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IGFwZV9kZXYgKmFwZTsKKwlwcmludGsoS0VSTl9ERUJVRyBEUlZfTkFNRSAiX29wZW4oKVxuIik7CisJLyogcG9pbnRlciB0byBjb250YWluaW5nIGRhdGEgc3RydWN0dXJlIG9mIHRoZSBjaGFyYWN0ZXIgZGV2aWNlIGlub2RlICovCisJYXBlID0gY29udGFpbmVyX29mKGlub2RlLT5pX2NkZXYsIHN0cnVjdCBhcGVfZGV2LCBjZGV2KTsKKwkvKiBjcmVhdGUgYSByZWZlcmVuY2UgdG8gb3VyIGRldmljZSBzdGF0ZSBpbiB0aGUgb3BlbmVkIGZpbGUgKi8KKwlmaWxlLT5wcml2YXRlX2RhdGEgPSBhcGU7CisJLyogY3JlYXRlIHZpcnR1YWwgbWVtb3J5IG1hcHBlciAqLworCWFwZS0+c2dtID0gc2dfY3JlYXRlX21hcHBlcihNQVhfQ0hETUFfU0laRSk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBDYWxsZWQgd2hlbiB0aGUgZGV2aWNlIGdvZXMgZnJvbSB1c2VkIHRvIHVudXNlZC4KKyAqLworc3RhdGljIGludCBzZ19jbG9zZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwkvKiBmZXRjaCBkZXZpY2Ugc3BlY2lmaWMgZGF0YSBzdG9yZWQgZWFybGllciBkdXJpbmcgb3BlbiAqLworCXN0cnVjdCBhcGVfZGV2ICphcGUgPSAoc3RydWN0IGFwZV9kZXYgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJcHJpbnRrKEtFUk5fREVCVUcgRFJWX05BTUUgIl9jbG9zZSgpXG4iKTsKKwkvKiBkZXN0cm95IHZpcnR1YWwgbWVtb3J5IG1hcHBlciAqLworCXNnX2Rlc3Ryb3lfbWFwcGVyKGFwZS0+c2dtKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNzaXplX3Qgc2dfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBvcykKK3sKKwkvKiBmZXRjaCBkZXZpY2Ugc3BlY2lmaWMgZGF0YSBzdG9yZWQgZWFybGllciBkdXJpbmcgb3BlbiAqLworCXN0cnVjdCBhcGVfZGV2ICphcGUgPSAoc3RydWN0IGFwZV9kZXYgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJKHZvaWQpYXBlOworCXByaW50ayhLRVJOX0RFQlVHIERSVl9OQU1FICJfcmVhZChidWY9MHglcCwgY291bnQ9JWxsZCwgcG9zPSVsbHUpXG4iLCBidWYsIChzNjQpY291bnQsICh1NjQpKnBvcyk7CisJcmV0dXJuIGNvdW50OworfQorCisvKiBzZ193cml0ZSgpIC0gV3JpdGUgdG8gdGhlIGRldmljZQorICoKKyAqIEBidWYgdXNlcnNwYWNlIGJ1ZmZlcgorICogQGNvdW50IG51bWJlciBvZiBieXRlcyBpbiB0aGUgdXNlcnNwYWNlIGJ1ZmZlcgorICoKKyAqIEl0ZXJhdGUgb3ZlciB0aGUgdXNlcnNwYWNlIGJ1ZmZlciwgdGFraW5nIGF0IG1vc3QgMjU1ICogUEFHRV9TSVpFIGJ5dGVzIGZvcgorICogZWFjaCBETUEgdHJhbnNmZXIuCisgKiAgIEZvciBlYWNoIHRyYW5zZmVyLCBnZXQgdGhlIHVzZXIgcGFnZXMsIGJ1aWxkIGEgc2dsaXN0LCBtYXAsIGJ1aWxkIGEKKyAqICAgZGVzY3JpcHRvciB0YWJsZS4gc3VibWl0IHRoZSB0cmFuc2Zlci4gd2FpdCBmb3IgdGhlIGludGVycnVwdCBoYW5kbGVyCisgKiAgIHRvIHdha2UgdXMgb24gY29tcGxldGlvbi4KKyAqLworc3RhdGljIHNzaXplX3Qgc2dfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwb3MpCit7CisJaW50IGh3bmVudHMsIHRlbnRzOworCXNpemVfdCB0cmFuc2Zlcl9sZW4sIHJlbWFpbmluZyA9IGNvdW50LCBkb25lID0gMDsKKwl1NjQgdHJhbnNmZXJfYWRkciA9ICh1NjQpYnVmOworCS8qIGZldGNoIGRldmljZSBzcGVjaWZpYyBkYXRhIHN0b3JlZCBlYXJsaWVyIGR1cmluZyBvcGVuICovCisJc3RydWN0IGFwZV9kZXYgKmFwZSA9IChzdHJ1Y3QgYXBlX2RldiAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlwcmludGsoS0VSTl9ERUJVRyBEUlZfTkFNRSAiX3dyaXRlKGJ1Zj0weCVwLCBjb3VudD0lbGxkLCBwb3M9JWxsdSlcbiIsCisJCWJ1ZiwgKHM2NCljb3VudCwgKHU2NCkqcG9zKTsKKwkvKiBUT0RPIHRyYW5zZmVyIGJvdW5kYXJpZXMgYXQgUEFHRV9TSVpFIGdyYW51bGFyaXR5ICovCisJd2hpbGUgKHJlbWFpbmluZyA+IDApCisJeworCQkvKiBsaW1pdCBETUEgdHJhbnNmZXIgc2l6ZSAqLworCQl0cmFuc2Zlcl9sZW4gPSAocmVtYWluaW5nIDwgQVBFX0NIRE1BX01BWF9UUkFOU0ZFUl9MRU4pPyByZW1haW5pbmc6CisJCQlBUEVfQ0hETUFfTUFYX1RSQU5TRkVSX0xFTjsKKwkJLyogZ2V0IGFsbCB1c2VyIHNwYWNlIGJ1ZmZlciBwYWdlcyBhbmQgY3JlYXRlIGEgc2NhdHRlcmdhdGhlciBsaXN0ICovCisJCXNnbV9tYXBfdXNlcl9wYWdlcyhhcGUtPnNnbSwgdHJhbnNmZXJfYWRkciwgdHJhbnNmZXJfbGVuLCAwLypyZWFkIGZyb20gdXNlcnNwYWNlKi8pOworCQlwcmludGsoS0VSTl9ERUJVRyBEUlZfTkFNRSAibWFwcGVkX3BhZ2VzPSVkXG4iLCBhcGUtPnNnbS0+bWFwcGVkX3BhZ2VzKTsKKwkJLyogbWFwIGFsbCBlbnRyaWVzIGluIHRoZSBzY2F0dGVyZ2F0aGVyIGxpc3QgKi8KKwkJaHduZW50cyA9IHBjaV9tYXBfc2coYXBlLT5wY2lfZGV2LCBhcGUtPnNnbS0+c2dsLCBhcGUtPnNnbS0+bWFwcGVkX3BhZ2VzLCBETUFfVE9fREVWSUNFKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgRFJWX05BTUUgImh3bmVudHM9JWRcbiIsIGh3bmVudHMpOworCQkvKiBidWlsZCBkZXZpY2UgZGVzY3JpcHRvciB0YWJsZXMgYW5kIHN1Ym1pdCB0aGVtIHRvIHRoZSBETUEgZW5naW5lICovCisJCXRlbnRzID0gYXBlX3NnX3RvX2NoZG1hX3RhYmxlKGFwZS0+c2dtLT5zZ2wsIGh3bmVudHMsIDAsICZhcGUtPnRhYmxlX3ZpcnQtPmRlc2NbMF0sIDQwOTYpOworCQlwcmludGsoS0VSTl9ERUJVRyBEUlZfTkFNRSAidGVudHM9JWRcbiIsIGh3bmVudHMpOworI2lmIDAKKwkJd2hpbGUgKHRhYmxlcykgeworCQkJLyogVE9ETyBidWlsZCB0YWJsZSAqLworCQkJLyogVE9ETyBzdWJtaXQgdGFibGUgdG8gdGhlIGRldmljZSAqLworCQkJLyogaWYgZW5naW5lIHN0b3BwZWQgYW5kIHVuZmluaXNoZWQgd29yayB0aGVuIHN0YXJ0IGVuZ2luZSAqLworCQl9CisJCXB1dCBvdXJzZWx2ZXMgb24gd2FpdCBxdWV1ZQorI2VuZGlmCisKKwkJZG1hX3VubWFwX3NnKE5VTEwsIGFwZS0+c2dtLT5zZ2wsIGFwZS0+c2dtLT5tYXBwZWRfcGFnZXMsIERNQV9UT19ERVZJQ0UpOworCQkvKiBkaXJ0eSBhbmQgZnJlZSB0aGUgcGFnZXMgKi8KKwkJc2dtX3VubWFwX3VzZXJfcGFnZXMoYXBlLT5zZ20sIDEvKmRpcnRpZWQqLyk7CisJCS8qIGJvb2sga2VlcGluZyAqLworCQl0cmFuc2Zlcl9hZGRyICs9IHRyYW5zZmVyX2xlbjsKKwkJcmVtYWluaW5nIC09IHRyYW5zZmVyX2xlbjsKKwkJZG9uZSArPSB0cmFuc2Zlcl9sZW47CisJfQorCXJldHVybiBkb25lOworfQorCisvKgorICogY2hhcmFjdGVyIGRldmljZSBmaWxlIG9wZXJhdGlvbnMKKyAqLworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgc2dfZm9wcyA9IHsKKyAgLm93bmVyID0gVEhJU19NT0RVTEUsCisgIC5vcGVuID0gc2dfb3BlbiwKKyAgLnJlbGVhc2UgPSBzZ19jbG9zZSwKKyAgLnJlYWQgPSBzZ19yZWFkLAorICAud3JpdGUgPSBzZ193cml0ZSwKK307CisKKy8qIHNnX2luaXQoKSAtIEluaXRpYWxpemUgY2hhcmFjdGVyIGRldmljZQorICoKKyAqIFhYWCBTaG91bGQgaWRlYWxseSBiZSB0aWVkIHRvIHRoZSBkZXZpY2UsIG9uIGRldmljZSBwcm9iZSwgbm90IG1vZHVsZSBpbml0LgorICovCitzdGF0aWMgaW50IHNnX2luaXQoc3RydWN0IGFwZV9kZXYgKmFwZSkKK3sKKwlpbnQgcmM7CisJcHJpbnRrKEtFUk5fREVCVUcgRFJWX05BTUUgIiBzZ19pbml0KClcbiIpOworCS8qIGFsbG9jYXRlIGEgZHluYW1pY2FsbHkgYWxsb2NhdGVkIGNoYXJhY3RlciBkZXZpY2Ugbm9kZSAqLworCXJjID0gYWxsb2NfY2hyZGV2X3JlZ2lvbigmYXBlLT5jZGV2bm8sIDAvKnJlcXVlc3RlZCBtaW5vciovLCAxLypjb3VudCovLCBEUlZfTkFNRSk7CisJLyogYWxsb2NhdGlvbiBmYWlsZWQ/ICovCisJaWYgKHJjIDwgMCkgeworCQlwcmludGsoImFsbG9jX2NocmRldl9yZWdpb24oKSA9ICVkXG4iLCByYyk7CisJCWdvdG8gZmFpbF9hbGxvYzsKKwl9CisJLyogY291cGxlIHRoZSBkZXZpY2UgZmlsZSBvcGVyYXRpb25zIHRvIHRoZSBjaGFyYWN0ZXIgZGV2aWNlICovCisJY2Rldl9pbml0KCZhcGUtPmNkZXYsICZzZ19mb3BzKTsKKwlhcGUtPmNkZXYub3duZXIgPSBUSElTX01PRFVMRTsKKwkvKiBicmluZyBjaGFyYWN0ZXIgZGV2aWNlIGxpdmUgKi8KKwlyYyA9IGNkZXZfYWRkKCZhcGUtPmNkZXYsIGFwZS0+Y2Rldm5vLCAxLypjb3VudCovKTsKKwlpZiAocmMgPCAwKSB7CisJCXByaW50aygiY2Rldl9hZGQoKSA9ICVkXG4iLCByYyk7CisJCWdvdG8gZmFpbF9hZGQ7CisJfQorCXByaW50ayhLRVJOX0RFQlVHICJhbHRwY2llY2hkbWEgPSAlZDolZFxuIiwgTUFKT1IoYXBlLT5jZGV2bm8pLCBNSU5PUihhcGUtPmNkZXZubykpOworCXJldHVybiAwOworZmFpbF9hZGQ6CisJLyogZnJlZSB0aGUgZHluYW1pY2FsbHkgYWxsb2NhdGVkIGNoYXJhY3RlciBkZXZpY2Ugbm9kZSAqLworICAgIHVucmVnaXN0ZXJfY2hyZGV2X3JlZ2lvbihhcGUtPmNkZXZubywgMS8qY291bnQqLyk7CitmYWlsX2FsbG9jOgorCXJldHVybiAtMTsKK30KKworLyogc2dfZXhpdCgpIC0gQ2xlYW51cCBjaGFyYWN0ZXIgZGV2aWNlCisgKgorICogWFhYIFNob3VsZCBpZGVhbGx5IGJlIHRpZWQgdG8gdGhlIGRldmljZSwgb24gZGV2aWNlIHJlbW92ZSwgbm90IG1vZHVsZSBleGl0LgorICovCisKK3N0YXRpYyB2b2lkIHNnX2V4aXQoc3RydWN0IGFwZV9kZXYgKmFwZSkKK3sKKwlwcmludGsoS0VSTl9ERUJVRyBEUlZfTkFNRSAiIHNnX2V4aXQoKVxuIik7CisJLyogcmVtb3ZlIHRoZSBjaGFyYWN0ZXIgZGV2aWNlICovCisJY2Rldl9kZWwoJmFwZS0+Y2Rldik7CisJLyogZnJlZSB0aGUgZHluYW1pY2FsbHkgYWxsb2NhdGVkIGNoYXJhY3RlciBkZXZpY2Ugbm9kZSAqLworCXVucmVnaXN0ZXJfY2hyZGV2X3JlZ2lvbihhcGUtPmNkZXZubywgMS8qY291bnQqLyk7Cit9CisKKyNlbmRpZiAvKiBBTFRQQ0lFQ0hETUFfQ0RFViAqLworCisvKiB1c2VkIHRvIHJlZ2lzdGVyIHRoZSBkcml2ZXIgd2l0aCB0aGUgUENJIGtlcm5lbCBzdWIgc3lzdGVtCisgKiBAc2VlIExERDMgcGFnZSAzMTEKKyAqLworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIHBjaV9kcml2ZXIgPSB7CisJLm5hbWUgPSBEUlZfTkFNRSwKKwkuaWRfdGFibGUgPSBpZHMsCisJLnByb2JlID0gcHJvYmUsCisJLnJlbW92ZSA9IHJlbW92ZSwKKwkvKiByZXN1bWUsIHN1c3BlbmQgYXJlIG9wdGlvbmFsICovCit9OworCisvKioKKyAqIGFsdGVyYXBjaWVjaGRtYV9pbml0KCkgLSBNb2R1bGUgaW5pdGlhbGl6YXRpb24sIHJlZ2lzdGVycyBkZXZpY2VzLgorICovCitzdGF0aWMgaW50IF9faW5pdCBhbHRlcmFwY2llY2hkbWFfaW5pdCh2b2lkKQoreworICBpbnQgcmMgPSAwOworCXByaW50ayhLRVJOX0RFQlVHIERSVl9OQU1FICIgaW5pdCgpLCBidWlsdCBhdCAiIF9fREFURV9fICIgIiBfX1RJTUVfXyAiXG4iKTsKKwkvKiByZWdpc3RlciB0aGlzIGRyaXZlciB3aXRoIHRoZSBQQ0kgYnVzIGRyaXZlciAqLworCXJjID0gcGNpX3JlZ2lzdGVyX2RyaXZlcigmcGNpX2RyaXZlcik7CisJaWYgKHJjIDwgMCkKKwkgIHJldHVybiByYzsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBhbHRlcmFwY2llY2hkbWFfaW5pdCgpIC0gTW9kdWxlIGNsZWFudXAsIHVucmVnaXN0ZXJzIGRldmljZXMuCisgKi8KK3N0YXRpYyB2b2lkIF9fZXhpdCBhbHRlcmFwY2llY2hkbWFfZXhpdCh2b2lkKQoreworCXByaW50ayhLRVJOX0RFQlVHIERSVl9OQU1FICIgZXhpdCgpLCBidWlsdCBhdCAiIF9fREFURV9fICIgIiBfX1RJTUVfXyAiXG4iKTsKKwkvKiB1bnJlZ2lzdGVyIHRoaXMgZHJpdmVyIGZyb20gdGhlIFBDSSBidXMgZHJpdmVyICovCisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZwY2lfZHJpdmVyKTsKK30KKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCittb2R1bGVfaW5pdChhbHRlcmFwY2llY2hkbWFfaW5pdCk7Cittb2R1bGVfZXhpdChhbHRlcmFwY2llY2hkbWFfZXhpdCk7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiOTk2ZGIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9LY29uZmlnCkBAIC0wLDAgKzEsODYgQEAKK21lbnUgIkFuZHJvaWQiCisKK2NvbmZpZyBBTkRST0lECisJYm9vbCAiQW5kcm9pZCBEcml2ZXJzIgorCWRlZmF1bHQgTgorCS0tLWhlbHAtLS0KKwkgIEVuYWJsZSBzdXBwb3J0IGZvciB2YXJpb3VzIGRyaXZlcnMgbmVlZGVkIG9uIHRoZSBBbmRyb2lkIHBsYXRmb3JtCisKK2NvbmZpZyBBTkRST0lEX0JJTkRFUl9JUEMKKwlib29sICJBbmRyb2lkIEJpbmRlciBJUEMgRHJpdmVyIgorCWRlZmF1bHQgbgorCitjb25maWcgQU5EUk9JRF9MT0dHRVIKKwl0cmlzdGF0ZSAiQW5kcm9pZCBsb2cgZHJpdmVyIgorCWRlZmF1bHQgbgorCitjb25maWcgQU5EUk9JRF9SQU1fQ09OU09MRQorCWJvb2wgIkFuZHJvaWQgUkFNIGJ1ZmZlciBjb25zb2xlIgorCWRlZmF1bHQgbgorCitjb25maWcgQU5EUk9JRF9SQU1fQ09OU09MRV9FTkFCTEVfVkVSQk9TRQorCWJvb2wgIkVuYWJsZSB2ZXJib3NlIGNvbnNvbGUgbWVzc2FnZXMgb24gQW5kcm9pZCBSQU0gY29uc29sZSIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIEFORFJPSURfUkFNX0NPTlNPTEUKKworbWVudWNvbmZpZyBBTkRST0lEX1JBTV9DT05TT0xFX0VSUk9SX0NPUlJFQ1RJT04KKwlib29sICJBbmRyb2lkIFJBTSBDb25zb2xlIEVuYWJsZSBlcnJvciBjb3JyZWN0aW9uIgorCWRlZmF1bHQgbgorCWRlcGVuZHMgb24gQU5EUk9JRF9SQU1fQ09OU09MRQorCXNlbGVjdCBSRUVEX1NPTE9NT04KKwlzZWxlY3QgUkVFRF9TT0xPTU9OX0VOQzgKKwlzZWxlY3QgUkVFRF9TT0xPTU9OX0RFQzgKKworaWYgQU5EUk9JRF9SQU1fQ09OU09MRV9FUlJPUl9DT1JSRUNUSU9OCisKK2NvbmZpZyBBTkRST0lEX1JBTV9DT05TT0xFX0VSUk9SX0NPUlJFQ1RJT05fREFUQV9TSVpFCisJaW50ICJBbmRyb2lkIFJBTSBDb25zb2xlIERhdGEgZGF0YSBzaXplIgorCWRlZmF1bHQgMTI4CisJaGVscAorCSAgTXVzdCBiZSBhIHBvd2VyIG9mIDIuCisKK2NvbmZpZyBBTkRST0lEX1JBTV9DT05TT0xFX0VSUk9SX0NPUlJFQ1RJT05fRUNDX1NJWkUKKwlpbnQgIkFuZHJvaWQgUkFNIENvbnNvbGUgRUNDIHNpemUiCisJZGVmYXVsdCAxNgorCitjb25maWcgQU5EUk9JRF9SQU1fQ09OU09MRV9FUlJPUl9DT1JSRUNUSU9OX1NZTUJPTF9TSVpFCisJaW50ICJBbmRyb2lkIFJBTSBDb25zb2xlIFN5bWJvbCBzaXplIgorCWRlZmF1bHQgOAorCitjb25maWcgQU5EUk9JRF9SQU1fQ09OU09MRV9FUlJPUl9DT1JSRUNUSU9OX1BPTFlOT01JQUwKKwloZXggIkFuZHJvaWQgUkFNIENvbnNvbGUgUG9seW5vbWlhbCIKKwlkZWZhdWx0IDB4MTkgaWYgKEFORFJPSURfUkFNX0NPTlNPTEVfRVJST1JfQ09SUkVDVElPTl9TWU1CT0xfU0laRSA9IDQpCisJZGVmYXVsdCAweDI5IGlmIChBTkRST0lEX1JBTV9DT05TT0xFX0VSUk9SX0NPUlJFQ1RJT05fU1lNQk9MX1NJWkUgPSA1KQorCWRlZmF1bHQgMHg2MSBpZiAoQU5EUk9JRF9SQU1fQ09OU09MRV9FUlJPUl9DT1JSRUNUSU9OX1NZTUJPTF9TSVpFID0gNikKKwlkZWZhdWx0IDB4ODkgaWYgKEFORFJPSURfUkFNX0NPTlNPTEVfRVJST1JfQ09SUkVDVElPTl9TWU1CT0xfU0laRSA9IDcpCisJZGVmYXVsdCAweDExZCBpZiAoQU5EUk9JRF9SQU1fQ09OU09MRV9FUlJPUl9DT1JSRUNUSU9OX1NZTUJPTF9TSVpFID0gOCkKKworZW5kaWYgIyBBTkRST0lEX1JBTV9DT05TT0xFX0VSUk9SX0NPUlJFQ1RJT04KKworY29uZmlnIEFORFJPSURfUkFNX0NPTlNPTEVfRUFSTFlfSU5JVAorCWJvb2wgIlN0YXJ0IEFuZHJvaWQgUkFNIGNvbnNvbGUgZWFybHkiCisJZGVmYXVsdCBuCisJZGVwZW5kcyBvbiBBTkRST0lEX1JBTV9DT05TT0xFCisKK2NvbmZpZyBBTkRST0lEX1JBTV9DT05TT0xFX0VBUkxZX0FERFIKKwloZXggIkFuZHJvaWQgUkFNIGNvbnNvbGUgdmlydHVhbCBhZGRyZXNzIgorCWRlZmF1bHQgMAorCWRlcGVuZHMgb24gQU5EUk9JRF9SQU1fQ09OU09MRV9FQVJMWV9JTklUCisKK2NvbmZpZyBBTkRST0lEX1JBTV9DT05TT0xFX0VBUkxZX1NJWkUKKwloZXggIkFuZHJvaWQgUkFNIGNvbnNvbGUgYnVmZmVyIHNpemUiCisJZGVmYXVsdCAwCisJZGVwZW5kcyBvbiBBTkRST0lEX1JBTV9DT05TT0xFX0VBUkxZX0lOSVQKKworY29uZmlnIEFORFJPSURfVElNRURfR1BJTworCXRyaXN0YXRlICJBbmRyb2lkIHRpbWVkIGdwaW8gZHJpdmVyIgorCWRlcGVuZHMgb24gR0VORVJJQ19HUElPCisJZGVmYXVsdCBuCisKK2NvbmZpZyBBTkRST0lEX0xPV19NRU1PUllfS0lMTEVSCisJYm9vbCAiQW5kcm9pZCBMb3cgTWVtb3J5IEtpbGxlciIKKwlkZWZhdWx0IE4KKwktLS1oZWxwLS0tCisJICBSZWdpc3RlciBwcm9jZXNzZXMgdG8gYmUga2lsbGVkIHdoZW4gbWVtb3J5IGlzIGxvdworCitlbmRtZW51CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1MjA5ZDYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9NYWtlZmlsZQpAQCAtMCwwICsxLDUgQEAKK29iai0kKENPTkZJR19BTkRST0lEX0JJTkRFUl9JUEMpCSs9IGJpbmRlci5vCitvYmotJChDT05GSUdfQU5EUk9JRF9MT0dHRVIpCQkrPSBsb2dnZXIubworb2JqLSQoQ09ORklHX0FORFJPSURfUkFNX0NPTlNPTEUpCSs9IHJhbV9jb25zb2xlLm8KK29iai0kKENPTkZJR19BTkRST0lEX1RJTUVEX0dQSU8pCSs9IHRpbWVkX2dwaW8ubworb2JqLSQoQ09ORklHX0FORFJPSURfTE9XX01FTU9SWV9LSUxMRVIpCSs9IGxvd21lbW9yeWtpbGxlci5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9UT0RPIGIvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvVE9ETwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTljNWJlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvVE9ETwpAQCAtMCwwICsxLDEwIEBACitUT0RPOgorCS0gY2hlY2twYXRjaC5wbCBjbGVhbnVwcworCS0gc3BhcnNlIGZpeGVzCisJLSByZW5hbWUgZmlsZXMgdG8gYmUgbm90IHNvICJnZW5lcmljIgorCS0gbWFrZSBzdXJlIHRoaW5ncyBidWlsZCBhcyBtb2R1bGVzIHByb3Blcmx5CisJLSBhZGQgcHJvcGVyIGFyY2ggZGVwZW5kYW5jaWVzIGFzIG5lZWRlZAorCS0gYXVkaXQgdXNlcnNwYWNlIGludGVyZmFjZXMgdG8gbWFrZSBzdXJlIHRoZXkgYXJlIHNhbmUKKworUGxlYXNlIHNlbmQgcGF0Y2hlcyB0byBHcmVnIEtyb2FoLUhhcnRtYW4gPGdyZWdAa3JvYWguY29tPiBhbmQgQ2M6CitCcmlhbiBTd2V0bGFuZCA8c3dldGxhbmRAZ29vZ2xlLmNvbT4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2JpbmRlci5jIGIvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvYmluZGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmE0Y2VhYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2JpbmRlci5jCkBAIC0wLDAgKzEsMzUwMyBAQAorLyogYmluZGVyLmMKKyAqCisgKiBBbmRyb2lkIElQQyBTdWJzeXN0ZW0KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBHb29nbGUsIEluYy4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorICogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqLworCisjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KKyNpbmNsdWRlIDxsaW51eC9mZHRhYmxlLmg+CisjaW5jbHVkZSA8bGludXgvZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvbnNwcm94eS5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvcmJ0cmVlLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgImJpbmRlci5oIgorCitzdGF0aWMgREVGSU5FX01VVEVYKGJpbmRlcl9sb2NrKTsKK3N0YXRpYyBITElTVF9IRUFEKGJpbmRlcl9wcm9jcyk7CitzdGF0aWMgc3RydWN0IGJpbmRlcl9ub2RlICpiaW5kZXJfY29udGV4dF9tZ3Jfbm9kZTsKK3N0YXRpYyB1aWRfdCBiaW5kZXJfY29udGV4dF9tZ3JfdWlkID0gLTE7CitzdGF0aWMgaW50IGJpbmRlcl9sYXN0X2lkOworc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqYmluZGVyX3Byb2NfZGlyX2VudHJ5X3Jvb3Q7CitzdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpiaW5kZXJfcHJvY19kaXJfZW50cnlfcHJvYzsKK3N0YXRpYyBzdHJ1Y3QgaGxpc3RfaGVhZCBiaW5kZXJfZGVhZF9ub2RlczsKKworc3RhdGljIGludCBiaW5kZXJfcmVhZF9wcm9jX3Byb2MoCisJY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsIGludCBjb3VudCwgaW50ICplb2YsIHZvaWQgKmRhdGEpOworCisvKiBUaGlzIGlzIG9ubHkgZGVmaW5lZCBpbiBpbmNsdWRlL2FzbS1hcm0vc2l6ZXMuaCAqLworI2lmbmRlZiBTWl8xSworI2RlZmluZSBTWl8xSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMAorI2VuZGlmCisKKyNpZm5kZWYgU1pfNE0KKyNkZWZpbmUgU1pfNE0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDAwMDAKKyNlbmRpZgorCisjaWZuZGVmIF9faTM4Nl9fCisjZGVmaW5lIEZPUkJJRERFTl9NTUFQX0ZMQUdTICAgICAgICAgICAgICAgIChWTV9XUklURSB8IFZNX0VYRUMpCisjZWxzZQorI2RlZmluZSBGT1JCSURERU5fTU1BUF9GTEFHUyAgICAgICAgICAgICAgICAoVk1fV1JJVEUpCisjZW5kaWYKKworI2RlZmluZSBCSU5ERVJfU01BTExfQlVGX1NJWkUgKFBBR0VfU0laRSAqIDY0KQorCitlbnVtIHsKKwlCSU5ERVJfREVCVUdfVVNFUl9FUlJPUiAgICAgICAgICAgICA9IDFVIDw8IDAsCisJQklOREVSX0RFQlVHX0ZBSUxFRF9UUkFOU0FDVElPTiAgICAgPSAxVSA8PCAxLAorCUJJTkRFUl9ERUJVR19ERUFEX1RSQU5TQUNUSU9OICAgICAgID0gMVUgPDwgMiwKKwlCSU5ERVJfREVCVUdfT1BFTl9DTE9TRSAgICAgICAgICAgICA9IDFVIDw8IDMsCisJQklOREVSX0RFQlVHX0RFQURfQklOREVSICAgICAgICAgICAgPSAxVSA8PCA0LAorCUJJTkRFUl9ERUJVR19ERUFUSF9OT1RJRklDQVRJT04gICAgID0gMVUgPDwgNSwKKwlCSU5ERVJfREVCVUdfUkVBRF9XUklURSAgICAgICAgICAgICA9IDFVIDw8IDYsCisJQklOREVSX0RFQlVHX1VTRVJfUkVGUyAgICAgICAgICAgICAgPSAxVSA8PCA3LAorCUJJTkRFUl9ERUJVR19USFJFQURTICAgICAgICAgICAgICAgID0gMVUgPDwgOCwKKwlCSU5ERVJfREVCVUdfVFJBTlNBQ1RJT04gICAgICAgICAgICA9IDFVIDw8IDksCisJQklOREVSX0RFQlVHX1RSQU5TQUNUSU9OX0NPTVBMRVRFICAgPSAxVSA8PCAxMCwKKwlCSU5ERVJfREVCVUdfRlJFRV9CVUZGRVIgICAgICAgICAgICA9IDFVIDw8IDExLAorCUJJTkRFUl9ERUJVR19JTlRFUk5BTF9SRUZTICAgICAgICAgID0gMVUgPDwgMTIsCisJQklOREVSX0RFQlVHX0JVRkZFUl9BTExPQyAgICAgICAgICAgPSAxVSA8PCAxMywKKwlCSU5ERVJfREVCVUdfUFJJT1JJVFlfQ0FQICAgICAgICAgICA9IDFVIDw8IDE0LAorCUJJTkRFUl9ERUJVR19CVUZGRVJfQUxMT0NfQVNZTkMgICAgID0gMVUgPDwgMTUsCit9Oworc3RhdGljIHVpbnQzMl90IGJpbmRlcl9kZWJ1Z19tYXNrID0gQklOREVSX0RFQlVHX1VTRVJfRVJST1IgfAorCUJJTkRFUl9ERUJVR19GQUlMRURfVFJBTlNBQ1RJT04gfCBCSU5ERVJfREVCVUdfREVBRF9UUkFOU0FDVElPTjsKK21vZHVsZV9wYXJhbV9uYW1lZChkZWJ1Z19tYXNrLCBiaW5kZXJfZGVidWdfbWFzaywgdWludCwgU19JV1VTUiB8IFNfSVJVR08pOworc3RhdGljIGludCBiaW5kZXJfZGVidWdfbm9fbG9jazsKK21vZHVsZV9wYXJhbV9uYW1lZChwcm9jX25vX2xvY2ssIGJpbmRlcl9kZWJ1Z19ub19sb2NrLCBib29sLCBTX0lXVVNSIHwgU19JUlVHTyk7CitzdGF0aWMgREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQoYmluZGVyX3VzZXJfZXJyb3Jfd2FpdCk7CitzdGF0aWMgaW50IGJpbmRlcl9zdG9wX29uX3VzZXJfZXJyb3I7CitzdGF0aWMgaW50IGJpbmRlcl9zZXRfc3RvcF9vbl91c2VyX2Vycm9yKAorCWNvbnN0IGNoYXIgKnZhbCwgc3RydWN0IGtlcm5lbF9wYXJhbSAqa3ApCit7CisJaW50IHJldDsKKwlyZXQgPSBwYXJhbV9zZXRfaW50KHZhbCwga3ApOworCWlmIChiaW5kZXJfc3RvcF9vbl91c2VyX2Vycm9yIDwgMikKKwkJd2FrZV91cCgmYmluZGVyX3VzZXJfZXJyb3Jfd2FpdCk7CisJcmV0dXJuIHJldDsKK30KK21vZHVsZV9wYXJhbV9jYWxsKHN0b3Bfb25fdXNlcl9lcnJvciwgYmluZGVyX3NldF9zdG9wX29uX3VzZXJfZXJyb3IsCisJcGFyYW1fZ2V0X2ludCwgJmJpbmRlcl9zdG9wX29uX3VzZXJfZXJyb3IsIFNfSVdVU1IgfCBTX0lSVUdPKTsKKworI2RlZmluZSBiaW5kZXJfdXNlcl9lcnJvcih4Li4uKSBcCisJZG8geyBcCisJCWlmIChiaW5kZXJfZGVidWdfbWFzayAmIEJJTkRFUl9ERUJVR19VU0VSX0VSUk9SKSBcCisJCQlwcmludGsoS0VSTl9JTkZPIHgpOyBcCisJCWlmIChiaW5kZXJfc3RvcF9vbl91c2VyX2Vycm9yKSBcCisJCQliaW5kZXJfc3RvcF9vbl91c2VyX2Vycm9yID0gMjsgXAorCX0gd2hpbGUgKDApCisKK2VudW0geworCUJJTkRFUl9TVEFUX1BST0MsCisJQklOREVSX1NUQVRfVEhSRUFELAorCUJJTkRFUl9TVEFUX05PREUsCisJQklOREVSX1NUQVRfUkVGLAorCUJJTkRFUl9TVEFUX0RFQVRILAorCUJJTkRFUl9TVEFUX1RSQU5TQUNUSU9OLAorCUJJTkRFUl9TVEFUX1RSQU5TQUNUSU9OX0NPTVBMRVRFLAorCUJJTkRFUl9TVEFUX0NPVU5UCit9OworCitzdHJ1Y3QgYmluZGVyX3N0YXRzIHsKKwlpbnQgYnJbX0lPQ19OUihCUl9GQUlMRURfUkVQTFkpICsgMV07CisJaW50IGJjW19JT0NfTlIoQkNfREVBRF9CSU5ERVJfRE9ORSkgKyAxXTsKKwlpbnQgb2JqX2NyZWF0ZWRbQklOREVSX1NUQVRfQ09VTlRdOworCWludCBvYmpfZGVsZXRlZFtCSU5ERVJfU1RBVF9DT1VOVF07Cit9OworCitzdGF0aWMgc3RydWN0IGJpbmRlcl9zdGF0cyBiaW5kZXJfc3RhdHM7CisKK3N0cnVjdCBiaW5kZXJfdHJhbnNhY3Rpb25fbG9nX2VudHJ5IHsKKwlpbnQgZGVidWdfaWQ7CisJaW50IGNhbGxfdHlwZTsKKwlpbnQgZnJvbV9wcm9jOworCWludCBmcm9tX3RocmVhZDsKKwlpbnQgdGFyZ2V0X2hhbmRsZTsKKwlpbnQgdG9fcHJvYzsKKwlpbnQgdG9fdGhyZWFkOworCWludCB0b19ub2RlOworCWludCBkYXRhX3NpemU7CisJaW50IG9mZnNldHNfc2l6ZTsKK307CitzdHJ1Y3QgYmluZGVyX3RyYW5zYWN0aW9uX2xvZyB7CisJaW50IG5leHQ7CisJaW50IGZ1bGw7CisJc3RydWN0IGJpbmRlcl90cmFuc2FjdGlvbl9sb2dfZW50cnkgZW50cnlbMzJdOworfTsKK3N0cnVjdCBiaW5kZXJfdHJhbnNhY3Rpb25fbG9nIGJpbmRlcl90cmFuc2FjdGlvbl9sb2c7CitzdHJ1Y3QgYmluZGVyX3RyYW5zYWN0aW9uX2xvZyBiaW5kZXJfdHJhbnNhY3Rpb25fbG9nX2ZhaWxlZDsKKworc3RhdGljIHN0cnVjdCBiaW5kZXJfdHJhbnNhY3Rpb25fbG9nX2VudHJ5ICpiaW5kZXJfdHJhbnNhY3Rpb25fbG9nX2FkZCgKKwlzdHJ1Y3QgYmluZGVyX3RyYW5zYWN0aW9uX2xvZyAqbG9nKQoreworCXN0cnVjdCBiaW5kZXJfdHJhbnNhY3Rpb25fbG9nX2VudHJ5ICplOworCWUgPSAmbG9nLT5lbnRyeVtsb2ctPm5leHRdOworCW1lbXNldChlLCAwLCBzaXplb2YoKmUpKTsKKwlsb2ctPm5leHQrKzsKKwlpZiAobG9nLT5uZXh0ID09IEFSUkFZX1NJWkUobG9nLT5lbnRyeSkpIHsKKwkJbG9nLT5uZXh0ID0gMDsKKwkJbG9nLT5mdWxsID0gMTsKKwl9CisJcmV0dXJuIGU7Cit9CisKK3N0cnVjdCBiaW5kZXJfd29yayB7CisJc3RydWN0IGxpc3RfaGVhZCBlbnRyeTsKKwllbnVtIHsKKwkJQklOREVSX1dPUktfVFJBTlNBQ1RJT04gPSAxLAorCQlCSU5ERVJfV09SS19UUkFOU0FDVElPTl9DT01QTEVURSwKKwkJQklOREVSX1dPUktfTk9ERSwKKwkJQklOREVSX1dPUktfREVBRF9CSU5ERVIsCisJCUJJTkRFUl9XT1JLX0RFQURfQklOREVSX0FORF9DTEVBUiwKKwkJQklOREVSX1dPUktfQ0xFQVJfREVBVEhfTk9USUZJQ0FUSU9OLAorCX0gdHlwZTsKK307CisKK3N0cnVjdCBiaW5kZXJfbm9kZSB7CisJaW50IGRlYnVnX2lkOworCXN0cnVjdCBiaW5kZXJfd29yayB3b3JrOworCXVuaW9uIHsKKwkJc3RydWN0IHJiX25vZGUgcmJfbm9kZTsKKwkJc3RydWN0IGhsaXN0X25vZGUgZGVhZF9ub2RlOworCX07CisJc3RydWN0IGJpbmRlcl9wcm9jICpwcm9jOworCXN0cnVjdCBobGlzdF9oZWFkIHJlZnM7CisJaW50IGludGVybmFsX3N0cm9uZ19yZWZzOworCWludCBsb2NhbF93ZWFrX3JlZnM7CisJaW50IGxvY2FsX3N0cm9uZ19yZWZzOworCXZvaWQgX191c2VyICpwdHI7CisJdm9pZCBfX3VzZXIgKmNvb2tpZTsKKwl1bnNpZ25lZCBoYXNfc3Ryb25nX3JlZiA6IDE7CisJdW5zaWduZWQgcGVuZGluZ19zdHJvbmdfcmVmIDogMTsKKwl1bnNpZ25lZCBoYXNfd2Vha19yZWYgOiAxOworCXVuc2lnbmVkIHBlbmRpbmdfd2Vha19yZWYgOiAxOworCXVuc2lnbmVkIGhhc19hc3luY190cmFuc2FjdGlvbiA6IDE7CisJdW5zaWduZWQgYWNjZXB0X2ZkcyA6IDE7CisJaW50IG1pbl9wcmlvcml0eSA6IDg7CisJc3RydWN0IGxpc3RfaGVhZCBhc3luY190b2RvOworfTsKKworc3RydWN0IGJpbmRlcl9yZWZfZGVhdGggeworCXN0cnVjdCBiaW5kZXJfd29yayB3b3JrOworCXZvaWQgX191c2VyICpjb29raWU7Cit9OworCitzdHJ1Y3QgYmluZGVyX3JlZiB7CisJLyogTG9va3VwcyBuZWVkZWQ6ICovCisJLyogICBub2RlICsgcHJvYyA9PiByZWYgKHRyYW5zYWN0aW9uKSAqLworCS8qICAgZGVzYyArIHByb2MgPT4gcmVmICh0cmFuc2FjdGlvbiwgaW5jL2RlYyByZWYpICovCisJLyogICBub2RlID0+IHJlZnMgKyBwcm9jcyAocHJvYyBleGl0KSAqLworCWludCBkZWJ1Z19pZDsKKwlzdHJ1Y3QgcmJfbm9kZSByYl9ub2RlX2Rlc2M7CisJc3RydWN0IHJiX25vZGUgcmJfbm9kZV9ub2RlOworCXN0cnVjdCBobGlzdF9ub2RlIG5vZGVfZW50cnk7CisJc3RydWN0IGJpbmRlcl9wcm9jICpwcm9jOworCXN0cnVjdCBiaW5kZXJfbm9kZSAqbm9kZTsKKwl1aW50MzJfdCBkZXNjOworCWludCBzdHJvbmc7CisJaW50IHdlYWs7CisJc3RydWN0IGJpbmRlcl9yZWZfZGVhdGggKmRlYXRoOworfTsKKworc3RydWN0IGJpbmRlcl9idWZmZXIgeworCXN0cnVjdCBsaXN0X2hlYWQgZW50cnk7IC8qIGZyZWUgYW5kIGFsbG9jYXRlZCBlbnRyaWVzIGJ5IGFkZGVzc3MgKi8KKwlzdHJ1Y3QgcmJfbm9kZSByYl9ub2RlOyAvKiBmcmVlIGVudHJ5IGJ5IHNpemUgb3IgYWxsb2NhdGVkIGVudHJ5ICovCisJCQkJLyogYnkgYWRkcmVzcyAqLworCXVuc2lnbmVkIGZyZWUgOiAxOworCXVuc2lnbmVkIGFsbG93X3VzZXJfZnJlZSA6IDE7CisJdW5zaWduZWQgYXN5bmNfdHJhbnNhY3Rpb24gOiAxOworCXVuc2lnbmVkIGRlYnVnX2lkIDogMjk7CisKKwlzdHJ1Y3QgYmluZGVyX3RyYW5zYWN0aW9uICp0cmFuc2FjdGlvbjsKKworCXN0cnVjdCBiaW5kZXJfbm9kZSAqdGFyZ2V0X25vZGU7CisJc2l6ZV90IGRhdGFfc2l6ZTsKKwlzaXplX3Qgb2Zmc2V0c19zaXplOworCXVpbnQ4X3QgZGF0YVswXTsKK307CisKK3N0cnVjdCBiaW5kZXJfcHJvYyB7CisJc3RydWN0IGhsaXN0X25vZGUgcHJvY19ub2RlOworCXN0cnVjdCByYl9yb290IHRocmVhZHM7CisJc3RydWN0IHJiX3Jvb3Qgbm9kZXM7CisJc3RydWN0IHJiX3Jvb3QgcmVmc19ieV9kZXNjOworCXN0cnVjdCByYl9yb290IHJlZnNfYnlfbm9kZTsKKwlpbnQgcGlkOworCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hOworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrOworCXZvaWQgKmJ1ZmZlcjsKKwlzaXplX3QgdXNlcl9idWZmZXJfb2Zmc2V0OworCisJc3RydWN0IGxpc3RfaGVhZCBidWZmZXJzOworCXN0cnVjdCByYl9yb290IGZyZWVfYnVmZmVyczsKKwlzdHJ1Y3QgcmJfcm9vdCBhbGxvY2F0ZWRfYnVmZmVyczsKKwlzaXplX3QgZnJlZV9hc3luY19zcGFjZTsKKworCXN0cnVjdCBwYWdlICoqcGFnZXM7CisJc2l6ZV90IGJ1ZmZlcl9zaXplOworCXVpbnQzMl90IGJ1ZmZlcl9mcmVlOworCXN0cnVjdCBsaXN0X2hlYWQgdG9kbzsKKwl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0OworCXN0cnVjdCBiaW5kZXJfc3RhdHMgc3RhdHM7CisJc3RydWN0IGxpc3RfaGVhZCBkZWxpdmVyZWRfZGVhdGg7CisJaW50IG1heF90aHJlYWRzOworCWludCByZXF1ZXN0ZWRfdGhyZWFkczsKKwlpbnQgcmVxdWVzdGVkX3RocmVhZHNfc3RhcnRlZDsKKwlpbnQgcmVhZHlfdGhyZWFkczsKKwlsb25nIGRlZmF1bHRfcHJpb3JpdHk7Cit9OworCitlbnVtIHsKKwlCSU5ERVJfTE9PUEVSX1NUQVRFX1JFR0lTVEVSRUQgID0gMHgwMSwKKwlCSU5ERVJfTE9PUEVSX1NUQVRFX0VOVEVSRUQgICAgID0gMHgwMiwKKwlCSU5ERVJfTE9PUEVSX1NUQVRFX0VYSVRFRCAgICAgID0gMHgwNCwKKwlCSU5ERVJfTE9PUEVSX1NUQVRFX0lOVkFMSUQgICAgID0gMHgwOCwKKwlCSU5ERVJfTE9PUEVSX1NUQVRFX1dBSVRJTkcgICAgID0gMHgxMCwKKwlCSU5ERVJfTE9PUEVSX1NUQVRFX05FRURfUkVUVVJOID0gMHgyMAorfTsKKworc3RydWN0IGJpbmRlcl90aHJlYWQgeworCXN0cnVjdCBiaW5kZXJfcHJvYyAqcHJvYzsKKwlzdHJ1Y3QgcmJfbm9kZSByYl9ub2RlOworCWludCBwaWQ7CisJaW50IGxvb3BlcjsKKwlzdHJ1Y3QgYmluZGVyX3RyYW5zYWN0aW9uICp0cmFuc2FjdGlvbl9zdGFjazsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHRvZG87CisJdWludDMyX3QgcmV0dXJuX2Vycm9yOyAvKiBXcml0ZSBmYWlsZWQsIHJldHVybiBlcnJvciBjb2RlIGluIHJlYWQgYnVmICovCisJdWludDMyX3QgcmV0dXJuX2Vycm9yMjsgLyogV3JpdGUgZmFpbGVkLCByZXR1cm4gZXJyb3IgY29kZSBpbiByZWFkICovCisJCS8qIGJ1ZmZlci4gVXNlZCB3aGVuIHNlbmRpbmcgYSByZXBseSB0byBhIGRlYWQgcHJvY2VzcyB0aGF0ICovCisJCS8qIHdlIGFyZSBhbHNvIHdhaXRpbmcgb24gKi8KKwl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0OworCXN0cnVjdCBiaW5kZXJfc3RhdHMgc3RhdHM7Cit9OworCitzdHJ1Y3QgYmluZGVyX3RyYW5zYWN0aW9uIHsKKwlpbnQgZGVidWdfaWQ7CisJc3RydWN0IGJpbmRlcl93b3JrIHdvcms7CisJc3RydWN0IGJpbmRlcl90aHJlYWQgKmZyb207CisJc3RydWN0IGJpbmRlcl90cmFuc2FjdGlvbiAqZnJvbV9wYXJlbnQ7CisJc3RydWN0IGJpbmRlcl9wcm9jICp0b19wcm9jOworCXN0cnVjdCBiaW5kZXJfdGhyZWFkICp0b190aHJlYWQ7CisJc3RydWN0IGJpbmRlcl90cmFuc2FjdGlvbiAqdG9fcGFyZW50OworCXVuc2lnbmVkIG5lZWRfcmVwbHkgOiAxOworCS8qdW5zaWduZWQgaXNfZGVhZCA6IDE7Ki8gLyogbm90IHVzZWQgYXQgdGhlIG1vbWVudCAqLworCisJc3RydWN0IGJpbmRlcl9idWZmZXIgKmJ1ZmZlcjsKKwl1bnNpZ25lZCBpbnQJY29kZTsKKwl1bnNpZ25lZCBpbnQJZmxhZ3M7CisJbG9uZwlwcmlvcml0eTsKKwlsb25nCXNhdmVkX3ByaW9yaXR5OworCXVpZF90CXNlbmRlcl9ldWlkOworfTsKKworLyoKKyAqIGNvcGllZCBmcm9tIGdldF91bnVzZWRfZmRfZmxhZ3MKKyAqLworaW50IHRhc2tfZ2V0X3VudXNlZF9mZF9mbGFncyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgaW50IGZsYWdzKQoreworCXN0cnVjdCBmaWxlc19zdHJ1Y3QgKmZpbGVzID0gZ2V0X2ZpbGVzX3N0cnVjdCh0c2spOworCWludCBmZCwgZXJyb3I7CisJc3RydWN0IGZkdGFibGUgKmZkdDsKKwl1bnNpZ25lZCBsb25nIHJsaW1fY3VyOworCisJaWYgKGZpbGVzID09IE5VTEwpCisJCXJldHVybiAtRVNSQ0g7CisKKwllcnJvciA9IC1FTUZJTEU7CisJc3Bpbl9sb2NrKCZmaWxlcy0+ZmlsZV9sb2NrKTsKKworcmVwZWF0OgorCWZkdCA9IGZpbGVzX2ZkdGFibGUoZmlsZXMpOworCWZkID0gZmluZF9uZXh0X3plcm9fYml0KGZkdC0+b3Blbl9mZHMtPmZkc19iaXRzLCBmZHQtPm1heF9mZHMsCisJCQkJZmlsZXMtPm5leHRfZmQpOworCisJLyoKKwkgKiBOLkIuIEZvciBjbG9uZSB0YXNrcyBzaGFyaW5nIGEgZmlsZXMgc3RydWN0dXJlLCB0aGlzIHRlc3QKKwkgKiB3aWxsIGxpbWl0IHRoZSB0b3RhbCBudW1iZXIgb2YgZmlsZXMgdGhhdCBjYW4gYmUgb3BlbmVkLgorCSAqLworCXJjdV9yZWFkX2xvY2soKTsKKwlpZiAodHNrLT5zaWduYWwpCisJCXJsaW1fY3VyID0gdHNrLT5zaWduYWwtPnJsaW1bUkxJTUlUX05PRklMRV0ucmxpbV9jdXI7CisJZWxzZQorCQlybGltX2N1ciA9IDA7CisJcmN1X3JlYWRfdW5sb2NrKCk7CisJaWYgKGZkID49IHJsaW1fY3VyKQorCQlnb3RvIG91dDsKKworCS8qIERvIHdlIG5lZWQgdG8gZXhwYW5kIHRoZSBmZCBhcnJheSBvciBmZCBzZXQ/ICAqLworCWVycm9yID0gZXhwYW5kX2ZpbGVzKGZpbGVzLCBmZCk7CisJaWYgKGVycm9yIDwgMCkKKwkJZ290byBvdXQ7CisKKwlpZiAoZXJyb3IpIHsKKwkJLyoKKwkJICogSWYgd2UgbmVlZGVkIHRvIGV4cGFuZCB0aGUgZnMgYXJyYXkgd2UKKwkJICogbWlnaHQgaGF2ZSBibG9ja2VkIC0gdHJ5IGFnYWluLgorCQkgKi8KKwkJZXJyb3IgPSAtRU1GSUxFOworCQlnb3RvIHJlcGVhdDsKKwl9CisKKwlGRF9TRVQoZmQsIGZkdC0+b3Blbl9mZHMpOworCWlmIChmbGFncyAmIE9fQ0xPRVhFQykKKwkJRkRfU0VUKGZkLCBmZHQtPmNsb3NlX29uX2V4ZWMpOworCWVsc2UKKwkJRkRfQ0xSKGZkLCBmZHQtPmNsb3NlX29uX2V4ZWMpOworCWZpbGVzLT5uZXh0X2ZkID0gZmQgKyAxOworI2lmIDEKKwkvKiBTYW5pdHkgY2hlY2sgKi8KKwlpZiAoZmR0LT5mZFtmZF0gIT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJnZXRfdW51c2VkX2ZkOiBzbG90ICVkIG5vdCBOVUxMIVxuIiwgZmQpOworCQlmZHQtPmZkW2ZkXSA9IE5VTEw7CisJfQorI2VuZGlmCisJZXJyb3IgPSBmZDsKKworb3V0OgorCXNwaW5fdW5sb2NrKCZmaWxlcy0+ZmlsZV9sb2NrKTsKKwlwdXRfZmlsZXNfc3RydWN0KGZpbGVzKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qCisgKiBjb3BpZWQgZnJvbSBmZF9pbnN0YWxsCisgKi8KK3N0YXRpYyB2b2lkIHRhc2tfZmRfaW5zdGFsbCgKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgdW5zaWduZWQgaW50IGZkLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgZmlsZXNfc3RydWN0ICpmaWxlcyA9IGdldF9maWxlc19zdHJ1Y3QodHNrKTsKKwlzdHJ1Y3QgZmR0YWJsZSAqZmR0OworCisJaWYgKGZpbGVzID09IE5VTEwpCisJCXJldHVybjsKKworCXNwaW5fbG9jaygmZmlsZXMtPmZpbGVfbG9jayk7CisJZmR0ID0gZmlsZXNfZmR0YWJsZShmaWxlcyk7CisJQlVHX09OKGZkdC0+ZmRbZmRdICE9IE5VTEwpOworCXJjdV9hc3NpZ25fcG9pbnRlcihmZHQtPmZkW2ZkXSwgZmlsZSk7CisJc3Bpbl91bmxvY2soJmZpbGVzLT5maWxlX2xvY2spOworCXB1dF9maWxlc19zdHJ1Y3QoZmlsZXMpOworfQorCisvKgorICogY29waWVkIGZyb20gX19wdXRfdW51c2VkX2ZkIGluIG9wZW4uYworICovCitzdGF0aWMgdm9pZCBfX3B1dF91bnVzZWRfZmQoc3RydWN0IGZpbGVzX3N0cnVjdCAqZmlsZXMsIHVuc2lnbmVkIGludCBmZCkKK3sKKwlzdHJ1Y3QgZmR0YWJsZSAqZmR0ID0gZmlsZXNfZmR0YWJsZShmaWxlcyk7CisJX19GRF9DTFIoZmQsIGZkdC0+b3Blbl9mZHMpOworCWlmIChmZCA8IGZpbGVzLT5uZXh0X2ZkKQorCQlmaWxlcy0+bmV4dF9mZCA9IGZkOworfQorCisvKgorICogY29waWVkIGZyb20gc3lzX2Nsb3NlCisgKi8KK3N0YXRpYyBsb25nIHRhc2tfY2xvc2VfZmQoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIHVuc2lnbmVkIGludCBmZCkKK3sKKwlzdHJ1Y3QgZmlsZSAqZmlscDsKKwlzdHJ1Y3QgZmlsZXNfc3RydWN0ICpmaWxlcyA9IGdldF9maWxlc19zdHJ1Y3QodHNrKTsKKwlzdHJ1Y3QgZmR0YWJsZSAqZmR0OworCWludCByZXR2YWw7CisKKwlpZiAoZmlsZXMgPT0gTlVMTCkKKwkJcmV0dXJuIC1FU1JDSDsKKworCXNwaW5fbG9jaygmZmlsZXMtPmZpbGVfbG9jayk7CisJZmR0ID0gZmlsZXNfZmR0YWJsZShmaWxlcyk7CisJaWYgKGZkID49IGZkdC0+bWF4X2ZkcykKKwkJZ290byBvdXRfdW5sb2NrOworCWZpbHAgPSBmZHQtPmZkW2ZkXTsKKwlpZiAoIWZpbHApCisJCWdvdG8gb3V0X3VubG9jazsKKwlyY3VfYXNzaWduX3BvaW50ZXIoZmR0LT5mZFtmZF0sIE5VTEwpOworCUZEX0NMUihmZCwgZmR0LT5jbG9zZV9vbl9leGVjKTsKKwlfX3B1dF91bnVzZWRfZmQoZmlsZXMsIGZkKTsKKwlzcGluX3VubG9jaygmZmlsZXMtPmZpbGVfbG9jayk7CisJcmV0dmFsID0gZmlscF9jbG9zZShmaWxwLCBmaWxlcyk7CisKKwkvKiBjYW4ndCByZXN0YXJ0IGNsb3NlIHN5c2NhbGwgYmVjYXVzZSBmaWxlIHRhYmxlIGVudHJ5IHdhcyBjbGVhcmVkICovCisJaWYgKHVubGlrZWx5KHJldHZhbCA9PSAtRVJFU1RBUlRTWVMgfHwKKwkJICAgICByZXR2YWwgPT0gLUVSRVNUQVJUTk9JTlRSIHx8CisJCSAgICAgcmV0dmFsID09IC1FUkVTVEFSVE5PSEFORCB8fAorCQkgICAgIHJldHZhbCA9PSAtRVJFU1RBUlRfUkVTVEFSVEJMT0NLKSkKKwkJcmV0dmFsID0gLUVJTlRSOworCisJcHV0X2ZpbGVzX3N0cnVjdChmaWxlcyk7CisJcmV0dXJuIHJldHZhbDsKKworb3V0X3VubG9jazoKKwlzcGluX3VubG9jaygmZmlsZXMtPmZpbGVfbG9jayk7CisJcHV0X2ZpbGVzX3N0cnVjdChmaWxlcyk7CisJcmV0dXJuIC1FQkFERjsKK30KKworc3RhdGljIHZvaWQgYmluZGVyX3NldF9uaWNlKGxvbmcgbmljZSkKK3sKKwlsb25nIG1pbl9uaWNlOworCWlmIChjYW5fbmljZShjdXJyZW50LCBuaWNlKSkgeworCQlzZXRfdXNlcl9uaWNlKGN1cnJlbnQsIG5pY2UpOworCQlyZXR1cm47CisJfQorCW1pbl9uaWNlID0gMjAgLSBjdXJyZW50LT5zaWduYWwtPnJsaW1bUkxJTUlUX05JQ0VdLnJsaW1fY3VyOworCWlmIChiaW5kZXJfZGVidWdfbWFzayAmIEJJTkRFUl9ERUJVR19QUklPUklUWV9DQVApCisJCXByaW50ayhLRVJOX0lORk8gImJpbmRlcjogJWQ6IG5pY2UgdmFsdWUgJWxkIG5vdCBhbGxvd2VkIHVzZSAiCisJCSAgICAgICAiJWxkIGluc3RlYWRcbiIsIGN1cnJlbnQtPnBpZCwgbmljZSwgbWluX25pY2UpOworCXNldF91c2VyX25pY2UoY3VycmVudCwgbWluX25pY2UpOworCWlmIChtaW5fbmljZSA8IDIwKQorCQlyZXR1cm47CisJYmluZGVyX3VzZXJfZXJyb3IoImJpbmRlcjogJWQgUkxJTUlUX05JQ0Ugbm90IHNldFxuIiwgY3VycmVudC0+cGlkKTsKK30KKworc3RhdGljIHNpemVfdCBiaW5kZXJfYnVmZmVyX3NpemUoCisJc3RydWN0IGJpbmRlcl9wcm9jICpwcm9jLCBzdHJ1Y3QgYmluZGVyX2J1ZmZlciAqYnVmZmVyKQoreworCWlmIChsaXN0X2lzX2xhc3QoJmJ1ZmZlci0+ZW50cnksICZwcm9jLT5idWZmZXJzKSkKKwkJcmV0dXJuIHByb2MtPmJ1ZmZlciArIHByb2MtPmJ1ZmZlcl9zaXplIC0gKHZvaWQgKilidWZmZXItPmRhdGE7CisJZWxzZQorCQlyZXR1cm4gKHNpemVfdClsaXN0X2VudHJ5KGJ1ZmZlci0+ZW50cnkubmV4dCwKKwkJCXN0cnVjdCBiaW5kZXJfYnVmZmVyLCBlbnRyeSkgLSAoc2l6ZV90KWJ1ZmZlci0+ZGF0YTsKK30KKworc3RhdGljIHZvaWQgYmluZGVyX2luc2VydF9mcmVlX2J1ZmZlcigKKwlzdHJ1Y3QgYmluZGVyX3Byb2MgKnByb2MsIHN0cnVjdCBiaW5kZXJfYnVmZmVyICpuZXdfYnVmZmVyKQoreworCXN0cnVjdCByYl9ub2RlICoqcCA9ICZwcm9jLT5mcmVlX2J1ZmZlcnMucmJfbm9kZTsKKwlzdHJ1Y3QgcmJfbm9kZSAqcGFyZW50ID0gTlVMTDsKKwlzdHJ1Y3QgYmluZGVyX2J1ZmZlciAqYnVmZmVyOworCXNpemVfdCBidWZmZXJfc2l6ZTsKKwlzaXplX3QgbmV3X2J1ZmZlcl9zaXplOworCisJQlVHX09OKCFuZXdfYnVmZmVyLT5mcmVlKTsKKworCW5ld19idWZmZXJfc2l6ZSA9IGJpbmRlcl9idWZmZXJfc2l6ZShwcm9jLCBuZXdfYnVmZmVyKTsKKworCWlmIChiaW5kZXJfZGVidWdfbWFzayAmIEJJTkRFUl9ERUJVR19CVUZGRVJfQUxMT0MpCisJCXByaW50ayhLRVJOX0lORk8gImJpbmRlcjogJWQ6IGFkZCBmcmVlIGJ1ZmZlciwgc2l6ZSAlemQsICIKKwkJICAgICAgICJhdCAlcFxuIiwgcHJvYy0+cGlkLCBuZXdfYnVmZmVyX3NpemUsIG5ld19idWZmZXIpOworCisJd2hpbGUgKCpwKSB7CisJCXBhcmVudCA9ICpwOworCQlidWZmZXIgPSByYl9lbnRyeShwYXJlbnQsIHN0cnVjdCBiaW5kZXJfYnVmZmVyLCByYl9ub2RlKTsKKwkJQlVHX09OKCFidWZmZXItPmZyZWUpOworCisJCWJ1ZmZlcl9zaXplID0gYmluZGVyX2J1ZmZlcl9zaXplKHByb2MsIGJ1ZmZlcik7CisKKwkJaWYgKG5ld19idWZmZXJfc2l6ZSA8IGJ1ZmZlcl9zaXplKQorCQkJcCA9ICZwYXJlbnQtPnJiX2xlZnQ7CisJCWVsc2UKKwkJCXAgPSAmcGFyZW50LT5yYl9yaWdodDsKKwl9CisJcmJfbGlua19ub2RlKCZuZXdfYnVmZmVyLT5yYl9ub2RlLCBwYXJlbnQsIHApOworCXJiX2luc2VydF9jb2xvcigmbmV3X2J1ZmZlci0+cmJfbm9kZSwgJnByb2MtPmZyZWVfYnVmZmVycyk7Cit9CisKK3N0YXRpYyB2b2lkIGJpbmRlcl9pbnNlcnRfYWxsb2NhdGVkX2J1ZmZlcigKKwlzdHJ1Y3QgYmluZGVyX3Byb2MgKnByb2MsIHN0cnVjdCBiaW5kZXJfYnVmZmVyICpuZXdfYnVmZmVyKQoreworCXN0cnVjdCByYl9ub2RlICoqcCA9ICZwcm9jLT5hbGxvY2F0ZWRfYnVmZmVycy5yYl9ub2RlOworCXN0cnVjdCByYl9ub2RlICpwYXJlbnQgPSBOVUxMOworCXN0cnVjdCBiaW5kZXJfYnVmZmVyICpidWZmZXI7CisKKwlCVUdfT04obmV3X2J1ZmZlci0+ZnJlZSk7CisKKwl3aGlsZSAoKnApIHsKKwkJcGFyZW50ID0gKnA7CisJCWJ1ZmZlciA9IHJiX2VudHJ5KHBhcmVudCwgc3RydWN0IGJpbmRlcl9idWZmZXIsIHJiX25vZGUpOworCQlCVUdfT04oYnVmZmVyLT5mcmVlKTsKKworCQlpZiAobmV3X2J1ZmZlciA8IGJ1ZmZlcikKKwkJCXAgPSAmcGFyZW50LT5yYl9sZWZ0OworCQllbHNlIGlmIChuZXdfYnVmZmVyID4gYnVmZmVyKQorCQkJcCA9ICZwYXJlbnQtPnJiX3JpZ2h0OworCQllbHNlCisJCQlCVUcoKTsKKwl9CisJcmJfbGlua19ub2RlKCZuZXdfYnVmZmVyLT5yYl9ub2RlLCBwYXJlbnQsIHApOworCXJiX2luc2VydF9jb2xvcigmbmV3X2J1ZmZlci0+cmJfbm9kZSwgJnByb2MtPmFsbG9jYXRlZF9idWZmZXJzKTsKK30KKworc3RhdGljIHN0cnVjdCBiaW5kZXJfYnVmZmVyICpiaW5kZXJfYnVmZmVyX2xvb2t1cCgKKwlzdHJ1Y3QgYmluZGVyX3Byb2MgKnByb2MsIHZvaWQgX191c2VyICp1c2VyX3B0cikKK3sKKwlzdHJ1Y3QgcmJfbm9kZSAqbiA9IHByb2MtPmFsbG9jYXRlZF9idWZmZXJzLnJiX25vZGU7CisJc3RydWN0IGJpbmRlcl9idWZmZXIgKmJ1ZmZlcjsKKwlzdHJ1Y3QgYmluZGVyX2J1ZmZlciAqa2Vybl9wdHI7CisKKwlrZXJuX3B0ciA9IHVzZXJfcHRyIC0gcHJvYy0+dXNlcl9idWZmZXJfb2Zmc2V0CisJCS0gb2Zmc2V0b2Yoc3RydWN0IGJpbmRlcl9idWZmZXIsIGRhdGEpOworCisJd2hpbGUgKG4pIHsKKwkJYnVmZmVyID0gcmJfZW50cnkobiwgc3RydWN0IGJpbmRlcl9idWZmZXIsIHJiX25vZGUpOworCQlCVUdfT04oYnVmZmVyLT5mcmVlKTsKKworCQlpZiAoa2Vybl9wdHIgPCBidWZmZXIpCisJCQluID0gbi0+cmJfbGVmdDsKKwkJZWxzZSBpZiAoa2Vybl9wdHIgPiBidWZmZXIpCisJCQluID0gbi0+cmJfcmlnaHQ7CisJCWVsc2UKKwkJCXJldHVybiBidWZmZXI7CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IGJpbmRlcl91cGRhdGVfcGFnZV9yYW5nZShzdHJ1Y3QgYmluZGVyX3Byb2MgKnByb2MsIGludCBhbGxvY2F0ZSwKKwl2b2lkICpzdGFydCwgdm9pZCAqZW5kLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwl2b2lkICpwYWdlX2FkZHI7CisJdW5zaWduZWQgbG9uZyB1c2VyX3BhZ2VfYWRkcjsKKwlzdHJ1Y3Qgdm1fc3RydWN0IHRtcF9hcmVhOworCXN0cnVjdCBwYWdlICoqcGFnZTsKKwlzdHJ1Y3QgbW1fc3RydWN0ICptbTsKKworCWlmIChiaW5kZXJfZGVidWdfbWFzayAmIEJJTkRFUl9ERUJVR19CVUZGRVJfQUxMT0MpCisJCXByaW50ayhLRVJOX0lORk8gImJpbmRlcjogJWQ6ICVzIHBhZ2VzICVwLSVwXG4iLAorCQkgICAgICAgcHJvYy0+cGlkLCBhbGxvY2F0ZSA/ICJhbGxvY2F0ZSIgOiAiZnJlZSIsIHN0YXJ0LCBlbmQpOworCisJaWYgKGVuZCA8PSBzdGFydCkKKwkJcmV0dXJuIDA7CisKKwlpZiAodm1hKQorCQltbSA9IE5VTEw7CisJZWxzZQorCQltbSA9IGdldF90YXNrX21tKHByb2MtPnRzayk7CisKKwlpZiAobW0pIHsKKwkJZG93bl93cml0ZSgmbW0tPm1tYXBfc2VtKTsKKwkJdm1hID0gcHJvYy0+dm1hOworCX0KKworCWlmIChhbGxvY2F0ZSA9PSAwKQorCQlnb3RvIGZyZWVfcmFuZ2U7CisKKwlpZiAodm1hID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJiaW5kZXI6ICVkOiBiaW5kZXJfYWxsb2NfYnVmIGZhaWxlZCB0byAiCisJCSAgICAgICAibWFwIHBhZ2VzIGluIHVzZXJzcGFjZSwgbm8gdm1hXG4iLCBwcm9jLT5waWQpOworCQlnb3RvIGVycl9ub192bWE7CisJfQorCisJZm9yIChwYWdlX2FkZHIgPSBzdGFydDsgcGFnZV9hZGRyIDwgZW5kOyBwYWdlX2FkZHIgKz0gUEFHRV9TSVpFKSB7CisJCWludCByZXQ7CisJCXN0cnVjdCBwYWdlICoqcGFnZV9hcnJheV9wdHI7CisJCXBhZ2UgPSAmcHJvYy0+cGFnZXNbKHBhZ2VfYWRkciAtIHByb2MtPmJ1ZmZlcikgLyBQQUdFX1NJWkVdOworCisJCUJVR19PTigqcGFnZSk7CisJCSpwYWdlID0gYWxsb2NfcGFnZShHRlBfS0VSTkVMIHwgX19HRlBfWkVSTyk7CisJCWlmICgqcGFnZSA9PSBOVUxMKSB7CisJCQlwcmludGsoS0VSTl9FUlIgImJpbmRlcjogJWQ6IGJpbmRlcl9hbGxvY19idWYgZmFpbGVkICIKKwkJCSAgICAgICAiZm9yIHBhZ2UgYXQgJXBcbiIsIHByb2MtPnBpZCwgcGFnZV9hZGRyKTsKKwkJCWdvdG8gZXJyX2FsbG9jX3BhZ2VfZmFpbGVkOworCQl9CisJCXRtcF9hcmVhLmFkZHIgPSBwYWdlX2FkZHI7CisJCXRtcF9hcmVhLnNpemUgPSBQQUdFX1NJWkUgKyBQQUdFX1NJWkUgLyogZ3VhcmQgcGFnZT8gKi87CisJCXBhZ2VfYXJyYXlfcHRyID0gcGFnZTsKKwkJcmV0ID0gbWFwX3ZtX2FyZWEoJnRtcF9hcmVhLCBQQUdFX0tFUk5FTCwgJnBhZ2VfYXJyYXlfcHRyKTsKKwkJaWYgKHJldCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJiaW5kZXI6ICVkOiBiaW5kZXJfYWxsb2NfYnVmIGZhaWxlZCAiCisJCQkgICAgICAgInRvIG1hcCBwYWdlIGF0ICVwIGluIGtlcm5lbFxuIiwKKwkJCSAgICAgICBwcm9jLT5waWQsIHBhZ2VfYWRkcik7CisJCQlnb3RvIGVycl9tYXBfa2VybmVsX2ZhaWxlZDsKKwkJfQorCQl1c2VyX3BhZ2VfYWRkciA9IChzaXplX3QpcGFnZV9hZGRyICsgcHJvYy0+dXNlcl9idWZmZXJfb2Zmc2V0OworCQlyZXQgPSB2bV9pbnNlcnRfcGFnZSh2bWEsIHVzZXJfcGFnZV9hZGRyLCBwYWdlWzBdKTsKKwkJaWYgKHJldCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJiaW5kZXI6ICVkOiBiaW5kZXJfYWxsb2NfYnVmIGZhaWxlZCAiCisJCQkgICAgICAgInRvIG1hcCBwYWdlIGF0ICVseCBpbiB1c2Vyc3BhY2VcbiIsCisJCQkgICAgICAgcHJvYy0+cGlkLCB1c2VyX3BhZ2VfYWRkcik7CisJCQlnb3RvIGVycl92bV9pbnNlcnRfcGFnZV9mYWlsZWQ7CisJCX0KKwkJLyogdm1faW5zZXJ0X3BhZ2UgZG9lcyBub3Qgc2VlbSB0byBpbmNyZW1lbnQgdGhlIHJlZmNvdW50ICovCisJfQorCWlmIChtbSkgeworCQl1cF93cml0ZSgmbW0tPm1tYXBfc2VtKTsKKwkJbW1wdXQobW0pOworCX0KKwlyZXR1cm4gMDsKKworZnJlZV9yYW5nZToKKwlmb3IgKHBhZ2VfYWRkciA9IGVuZCAtIFBBR0VfU0laRTsgcGFnZV9hZGRyID49IHN0YXJ0OworCSAgICAgcGFnZV9hZGRyIC09IFBBR0VfU0laRSkgeworCQlwYWdlID0gJnByb2MtPnBhZ2VzWyhwYWdlX2FkZHIgLSBwcm9jLT5idWZmZXIpIC8gUEFHRV9TSVpFXTsKKwkJaWYgKHZtYSkKKwkJCXphcF9wYWdlX3JhbmdlKHZtYSwgKHNpemVfdClwYWdlX2FkZHIgKworCQkJCXByb2MtPnVzZXJfYnVmZmVyX29mZnNldCwgUEFHRV9TSVpFLCBOVUxMKTsKK2Vycl92bV9pbnNlcnRfcGFnZV9mYWlsZWQ6CisJCXVubWFwX2tlcm5lbF9yYW5nZSgodW5zaWduZWQgbG9uZylwYWdlX2FkZHIsIFBBR0VfU0laRSk7CitlcnJfbWFwX2tlcm5lbF9mYWlsZWQ6CisJCV9fZnJlZV9wYWdlKCpwYWdlKTsKKwkJKnBhZ2UgPSBOVUxMOworZXJyX2FsbG9jX3BhZ2VfZmFpbGVkOgorCQk7CisJfQorZXJyX25vX3ZtYToKKwlpZiAobW0pIHsKKwkJdXBfd3JpdGUoJm1tLT5tbWFwX3NlbSk7CisJCW1tcHV0KG1tKTsKKwl9CisJcmV0dXJuIC1FTk9NRU07Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYmluZGVyX2J1ZmZlciAqYmluZGVyX2FsbG9jX2J1ZihzdHJ1Y3QgYmluZGVyX3Byb2MgKnByb2MsCisJc2l6ZV90IGRhdGFfc2l6ZSwgc2l6ZV90IG9mZnNldHNfc2l6ZSwgaW50IGlzX2FzeW5jKQoreworCXN0cnVjdCByYl9ub2RlICpuID0gcHJvYy0+ZnJlZV9idWZmZXJzLnJiX25vZGU7CisJc3RydWN0IGJpbmRlcl9idWZmZXIgKmJ1ZmZlcjsKKwlzaXplX3QgYnVmZmVyX3NpemU7CisJc3RydWN0IHJiX25vZGUgKmJlc3RfZml0ID0gTlVMTDsKKwl2b2lkICpoYXNfcGFnZV9hZGRyOworCXZvaWQgKmVuZF9wYWdlX2FkZHI7CisJc2l6ZV90IHNpemU7CisKKwlpZiAocHJvYy0+dm1hID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJiaW5kZXI6ICVkOiBiaW5kZXJfYWxsb2NfYnVmLCBubyB2bWFcbiIsCisJCSAgICAgICBwcm9jLT5waWQpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlzaXplID0gQUxJR04oZGF0YV9zaXplLCBzaXplb2Yodm9pZCAqKSkgKworCQlBTElHTihvZmZzZXRzX3NpemUsIHNpemVvZih2b2lkICopKTsKKworCWlmIChzaXplIDwgZGF0YV9zaXplIHx8IHNpemUgPCBvZmZzZXRzX3NpemUpIHsKKwkJYmluZGVyX3VzZXJfZXJyb3IoImJpbmRlcjogJWQ6IGdvdCB0cmFuc2FjdGlvbiB3aXRoIGludmFsaWQgIgorCQkJInNpemUgJXpkLSV6ZFxuIiwgcHJvYy0+cGlkLCBkYXRhX3NpemUsIG9mZnNldHNfc2l6ZSk7CisJCXJldHVybiBOVUxMOworCX0KKworCWlmIChpc19hc3luYyAmJgorCSAgICBwcm9jLT5mcmVlX2FzeW5jX3NwYWNlIDwgc2l6ZSArIHNpemVvZihzdHJ1Y3QgYmluZGVyX2J1ZmZlcikpIHsKKwkJaWYgKGJpbmRlcl9kZWJ1Z19tYXNrICYgQklOREVSX0RFQlVHX0JVRkZFUl9BTExPQykKKwkJCXByaW50ayhLRVJOX0VSUiAiYmluZGVyOiAlZDogYmluZGVyX2FsbG9jX2J1ZiBzaXplICV6ZCBmIgorCQkJICAgICAgICJhaWxlZCwgbm8gYXN5bmMgc3BhY2UgbGVmdFxuIiwgcHJvYy0+cGlkLCBzaXplKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJd2hpbGUgKG4pIHsKKwkJYnVmZmVyID0gcmJfZW50cnkobiwgc3RydWN0IGJpbmRlcl9idWZmZXIsIHJiX25vZGUpOworCQlCVUdfT04oIWJ1ZmZlci0+ZnJlZSk7CisJCWJ1ZmZlcl9zaXplID0gYmluZGVyX2J1ZmZlcl9zaXplKHByb2MsIGJ1ZmZlcik7CisKKwkJaWYgKHNpemUgPCBidWZmZXJfc2l6ZSkgeworCQkJYmVzdF9maXQgPSBuOworCQkJbiA9IG4tPnJiX2xlZnQ7CisJCX0gZWxzZSBpZiAoc2l6ZSA+IGJ1ZmZlcl9zaXplKQorCQkJbiA9IG4tPnJiX3JpZ2h0OworCQllbHNlIHsKKwkJCWJlc3RfZml0ID0gbjsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmIChiZXN0X2ZpdCA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAiYmluZGVyOiAlZDogYmluZGVyX2FsbG9jX2J1ZiBzaXplICV6ZCBmYWlsZWQsICIKKwkJICAgICAgICJubyBhZGRyZXNzIHNwYWNlXG4iLCBwcm9jLT5waWQsIHNpemUpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJaWYgKG4gPT0gTlVMTCkgeworCQlidWZmZXIgPSByYl9lbnRyeShiZXN0X2ZpdCwgc3RydWN0IGJpbmRlcl9idWZmZXIsIHJiX25vZGUpOworCQlidWZmZXJfc2l6ZSA9IGJpbmRlcl9idWZmZXJfc2l6ZShwcm9jLCBidWZmZXIpOworCX0KKwlpZiAoYmluZGVyX2RlYnVnX21hc2sgJiBCSU5ERVJfREVCVUdfQlVGRkVSX0FMTE9DKQorCQlwcmludGsoS0VSTl9JTkZPICJiaW5kZXI6ICVkOiBiaW5kZXJfYWxsb2NfYnVmIHNpemUgJXpkIGdvdCBidWZmIgorCQkgICAgICAgImVyICVwIHNpemUgJXpkXG4iLCBwcm9jLT5waWQsIHNpemUsIGJ1ZmZlciwgYnVmZmVyX3NpemUpOworCisJaGFzX3BhZ2VfYWRkciA9CisJCSh2b2lkICopKCgoc2l6ZV90KWJ1ZmZlci0+ZGF0YSArIGJ1ZmZlcl9zaXplKSAmIFBBR0VfTUFTSyk7CisJaWYgKG4gPT0gTlVMTCkgeworCQlpZiAoc2l6ZSArIHNpemVvZihzdHJ1Y3QgYmluZGVyX2J1ZmZlcikgKyA0ID49IGJ1ZmZlcl9zaXplKQorCQkJYnVmZmVyX3NpemUgPSBzaXplOyAvKiBubyByb29tIGZvciBvdGhlciBidWZmZXJzICovCisJCWVsc2UKKwkJCWJ1ZmZlcl9zaXplID0gc2l6ZSArIHNpemVvZihzdHJ1Y3QgYmluZGVyX2J1ZmZlcik7CisJfQorCWVuZF9wYWdlX2FkZHIgPSAodm9pZCAqKVBBR0VfQUxJR04oKHNpemVfdClidWZmZXItPmRhdGEgKyBidWZmZXJfc2l6ZSk7CisJaWYgKGVuZF9wYWdlX2FkZHIgPiBoYXNfcGFnZV9hZGRyKQorCQllbmRfcGFnZV9hZGRyID0gaGFzX3BhZ2VfYWRkcjsKKwlpZiAoYmluZGVyX3VwZGF0ZV9wYWdlX3JhbmdlKHByb2MsIDEsCisJICAgICh2b2lkICopUEFHRV9BTElHTigoc2l6ZV90KWJ1ZmZlci0+ZGF0YSksIGVuZF9wYWdlX2FkZHIsIE5VTEwpKQorCQlyZXR1cm4gTlVMTDsKKworCXJiX2VyYXNlKGJlc3RfZml0LCAmcHJvYy0+ZnJlZV9idWZmZXJzKTsKKwlidWZmZXItPmZyZWUgPSAwOworCWJpbmRlcl9pbnNlcnRfYWxsb2NhdGVkX2J1ZmZlcihwcm9jLCBidWZmZXIpOworCWlmIChidWZmZXJfc2l6ZSAhPSBzaXplKSB7CisJCXN0cnVjdCBiaW5kZXJfYnVmZmVyICpuZXdfYnVmZmVyID0gKHZvaWQgKilidWZmZXItPmRhdGEgKyBzaXplOworCQlsaXN0X2FkZCgmbmV3X2J1ZmZlci0+ZW50cnksICZidWZmZXItPmVudHJ5KTsKKwkJbmV3X2J1ZmZlci0+ZnJlZSA9IDE7CisJCWJpbmRlcl9pbnNlcnRfZnJlZV9idWZmZXIocHJvYywgbmV3X2J1ZmZlcik7CisJfQorCWlmIChiaW5kZXJfZGVidWdfbWFzayAmIEJJTkRFUl9ERUJVR19CVUZGRVJfQUxMT0MpCisJCXByaW50ayhLRVJOX0lORk8gImJpbmRlcjogJWQ6IGJpbmRlcl9hbGxvY19idWYgc2l6ZSAlemQgZ290ICIKKwkJICAgICAgICIlcFxuIiwgcHJvYy0+cGlkLCBzaXplLCBidWZmZXIpOworCWJ1ZmZlci0+ZGF0YV9zaXplID0gZGF0YV9zaXplOworCWJ1ZmZlci0+b2Zmc2V0c19zaXplID0gb2Zmc2V0c19zaXplOworCWJ1ZmZlci0+YXN5bmNfdHJhbnNhY3Rpb24gPSBpc19hc3luYzsKKwlpZiAoaXNfYXN5bmMpIHsKKwkJcHJvYy0+ZnJlZV9hc3luY19zcGFjZSAtPSBzaXplICsgc2l6ZW9mKHN0cnVjdCBiaW5kZXJfYnVmZmVyKTsKKwkJaWYgKGJpbmRlcl9kZWJ1Z19tYXNrICYgQklOREVSX0RFQlVHX0JVRkZFUl9BTExPQ19BU1lOQykKKwkJCXByaW50ayhLRVJOX0lORk8gImJpbmRlcjogJWQ6IGJpbmRlcl9hbGxvY19idWYgc2l6ZSAlemQgIgorCQkJICAgICAgICJhc3luYyBmcmVlICV6ZFxuIiwgcHJvYy0+cGlkLCBzaXplLAorCQkJICAgICAgIHByb2MtPmZyZWVfYXN5bmNfc3BhY2UpOworCX0KKworCXJldHVybiBidWZmZXI7Cit9CisKK3N0YXRpYyB2b2lkICpidWZmZXJfc3RhcnRfcGFnZShzdHJ1Y3QgYmluZGVyX2J1ZmZlciAqYnVmZmVyKQoreworCXJldHVybiAodm9pZCAqKSgoc2l6ZV90KWJ1ZmZlciAmIFBBR0VfTUFTSyk7Cit9CisKK3N0YXRpYyB2b2lkICpidWZmZXJfZW5kX3BhZ2Uoc3RydWN0IGJpbmRlcl9idWZmZXIgKmJ1ZmZlcikKK3sKKwlyZXR1cm4gKHZvaWQgKikoKChzaXplX3QpKGJ1ZmZlciArIDEpIC0gMSkgJiBQQUdFX01BU0spOworfQorCitzdGF0aWMgdm9pZCBiaW5kZXJfZGVsZXRlX2ZyZWVfYnVmZmVyKAorCXN0cnVjdCBiaW5kZXJfcHJvYyAqcHJvYywgc3RydWN0IGJpbmRlcl9idWZmZXIgKmJ1ZmZlcikKK3sKKwlzdHJ1Y3QgYmluZGVyX2J1ZmZlciAqcHJldiwgKm5leHQgPSBOVUxMOworCWludCBmcmVlX3BhZ2VfZW5kID0gMTsKKwlpbnQgZnJlZV9wYWdlX3N0YXJ0ID0gMTsKKworCUJVR19PTihwcm9jLT5idWZmZXJzLm5leHQgPT0gJmJ1ZmZlci0+ZW50cnkpOworCXByZXYgPSBsaXN0X2VudHJ5KGJ1ZmZlci0+ZW50cnkucHJldiwgc3RydWN0IGJpbmRlcl9idWZmZXIsIGVudHJ5KTsKKwlCVUdfT04oIXByZXYtPmZyZWUpOworCWlmIChidWZmZXJfZW5kX3BhZ2UocHJldikgPT0gYnVmZmVyX3N0YXJ0X3BhZ2UoYnVmZmVyKSkgeworCQlmcmVlX3BhZ2Vfc3RhcnQgPSAwOworCQlpZiAoYnVmZmVyX2VuZF9wYWdlKHByZXYpID09IGJ1ZmZlcl9lbmRfcGFnZShidWZmZXIpKQorCQkJZnJlZV9wYWdlX2VuZCA9IDA7CisJCWlmIChiaW5kZXJfZGVidWdfbWFzayAmIEJJTkRFUl9ERUJVR19CVUZGRVJfQUxMT0MpCisJCQlwcmludGsoS0VSTl9JTkZPICJiaW5kZXI6ICVkOiBtZXJnZSBmcmVlLCBidWZmZXIgJXAgIgorCQkJICAgICAgICJzaGFyZSBwYWdlIHdpdGggJXBcbiIsIHByb2MtPnBpZCwgYnVmZmVyLCBwcmV2KTsKKwl9CisKKwlpZiAoIWxpc3RfaXNfbGFzdCgmYnVmZmVyLT5lbnRyeSwgJnByb2MtPmJ1ZmZlcnMpKSB7CisJCW5leHQgPSBsaXN0X2VudHJ5KGJ1ZmZlci0+ZW50cnkubmV4dCwKKwkJCQkgIHN0cnVjdCBiaW5kZXJfYnVmZmVyLCBlbnRyeSk7CisJCWlmIChidWZmZXJfc3RhcnRfcGFnZShuZXh0KSA9PSBidWZmZXJfZW5kX3BhZ2UoYnVmZmVyKSkgeworCQkJZnJlZV9wYWdlX2VuZCA9IDA7CisJCQlpZiAoYnVmZmVyX3N0YXJ0X3BhZ2UobmV4dCkgPT0KKwkJCSAgICBidWZmZXJfc3RhcnRfcGFnZShidWZmZXIpKQorCQkJCWZyZWVfcGFnZV9zdGFydCA9IDA7CisJCQlpZiAoYmluZGVyX2RlYnVnX21hc2sgJiBCSU5ERVJfREVCVUdfQlVGRkVSX0FMTE9DKQorCQkJCXByaW50ayhLRVJOX0lORk8gImJpbmRlcjogJWQ6IG1lcmdlIGZyZWUsICIKKwkJCQkgICAgICAgImJ1ZmZlciAlcCBzaGFyZSBwYWdlIHdpdGggJXBcbiIsCisJCQkJICAgICAgIHByb2MtPnBpZCwgYnVmZmVyLCBwcmV2KTsKKwkJfQorCX0KKwlsaXN0X2RlbCgmYnVmZmVyLT5lbnRyeSk7CisJaWYgKGZyZWVfcGFnZV9zdGFydCB8fCBmcmVlX3BhZ2VfZW5kKSB7CisJCWlmIChiaW5kZXJfZGVidWdfbWFzayAmIEJJTkRFUl9ERUJVR19CVUZGRVJfQUxMT0MpCisJCQlwcmludGsoS0VSTl9JTkZPICJiaW5kZXI6ICVkOiBtZXJnZSBmcmVlLCBidWZmZXIgJXAgZG8gIgorCQkJICAgICAgICJub3Qgc2hhcmUgcGFnZSVzJXMgd2l0aCB3aXRoICVwIG9yICVwXG4iLAorCQkJICAgICAgIHByb2MtPnBpZCwgYnVmZmVyLCBmcmVlX3BhZ2Vfc3RhcnQgPyAiIiA6ICIgZW5kIiwKKwkJCSAgICAgICBmcmVlX3BhZ2VfZW5kID8gIiIgOiAiIHN0YXJ0IiwgcHJldiwgbmV4dCk7CisJCWJpbmRlcl91cGRhdGVfcGFnZV9yYW5nZShwcm9jLCAwLCBmcmVlX3BhZ2Vfc3RhcnQgPworCQkJYnVmZmVyX3N0YXJ0X3BhZ2UoYnVmZmVyKSA6IGJ1ZmZlcl9lbmRfcGFnZShidWZmZXIpLAorCQkJKGZyZWVfcGFnZV9lbmQgPyBidWZmZXJfZW5kX3BhZ2UoYnVmZmVyKSA6CisJCQlidWZmZXJfc3RhcnRfcGFnZShidWZmZXIpKSArIFBBR0VfU0laRSwgTlVMTCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBiaW5kZXJfZnJlZV9idWYoCisJc3RydWN0IGJpbmRlcl9wcm9jICpwcm9jLCBzdHJ1Y3QgYmluZGVyX2J1ZmZlciAqYnVmZmVyKQoreworCXNpemVfdCBzaXplLCBidWZmZXJfc2l6ZTsKKworCWJ1ZmZlcl9zaXplID0gYmluZGVyX2J1ZmZlcl9zaXplKHByb2MsIGJ1ZmZlcik7CisKKwlzaXplID0gQUxJR04oYnVmZmVyLT5kYXRhX3NpemUsIHNpemVvZih2b2lkICopKSArCisJCUFMSUdOKGJ1ZmZlci0+b2Zmc2V0c19zaXplLCBzaXplb2Yodm9pZCAqKSk7CisJaWYgKGJpbmRlcl9kZWJ1Z19tYXNrICYgQklOREVSX0RFQlVHX0JVRkZFUl9BTExPQykKKwkJcHJpbnRrKEtFUk5fSU5GTyAiYmluZGVyOiAlZDogYmluZGVyX2ZyZWVfYnVmICVwIHNpemUgJXpkIGJ1ZmZlciIKKwkJICAgICAgICJfc2l6ZSAlemRcbiIsIHByb2MtPnBpZCwgYnVmZmVyLCBzaXplLCBidWZmZXJfc2l6ZSk7CisKKwlCVUdfT04oYnVmZmVyLT5mcmVlKTsKKwlCVUdfT04oc2l6ZSA+IGJ1ZmZlcl9zaXplKTsKKwlCVUdfT04oYnVmZmVyLT50cmFuc2FjdGlvbiAhPSBOVUxMKTsKKwlCVUdfT04oKHZvaWQgKilidWZmZXIgPCBwcm9jLT5idWZmZXIpOworCUJVR19PTigodm9pZCAqKWJ1ZmZlciA+IHByb2MtPmJ1ZmZlciArIHByb2MtPmJ1ZmZlcl9zaXplKTsKKworCWlmIChidWZmZXItPmFzeW5jX3RyYW5zYWN0aW9uKSB7CisJCXByb2MtPmZyZWVfYXN5bmNfc3BhY2UgKz0gc2l6ZSArIHNpemVvZihzdHJ1Y3QgYmluZGVyX2J1ZmZlcik7CisJCWlmIChiaW5kZXJfZGVidWdfbWFzayAmIEJJTkRFUl9ERUJVR19CVUZGRVJfQUxMT0NfQVNZTkMpCisJCQlwcmludGsoS0VSTl9JTkZPICJiaW5kZXI6ICVkOiBiaW5kZXJfZnJlZV9idWYgc2l6ZSAlemQgIgorCQkJICAgICAgICJhc3luYyBmcmVlICV6ZFxuIiwgcHJvYy0+cGlkLCBzaXplLAorCQkJICAgICAgIHByb2MtPmZyZWVfYXN5bmNfc3BhY2UpOworCX0KKworCWJpbmRlcl91cGRhdGVfcGFnZV9yYW5nZShwcm9jLCAwLAorCQkodm9pZCAqKVBBR0VfQUxJR04oKHNpemVfdClidWZmZXItPmRhdGEpLAorCQkodm9pZCAqKSgoKHNpemVfdClidWZmZXItPmRhdGEgKyBidWZmZXJfc2l6ZSkgJiBQQUdFX01BU0spLAorCQlOVUxMKTsKKwlyYl9lcmFzZSgmYnVmZmVyLT5yYl9ub2RlLCAmcHJvYy0+YWxsb2NhdGVkX2J1ZmZlcnMpOworCWJ1ZmZlci0+ZnJlZSA9IDE7CisJaWYgKCFsaXN0X2lzX2xhc3QoJmJ1ZmZlci0+ZW50cnksICZwcm9jLT5idWZmZXJzKSkgeworCQlzdHJ1Y3QgYmluZGVyX2J1ZmZlciAqbmV4dCA9IGxpc3RfZW50cnkoYnVmZmVyLT5lbnRyeS5uZXh0LAorCQkJCQkJc3RydWN0IGJpbmRlcl9idWZmZXIsIGVudHJ5KTsKKwkJaWYgKG5leHQtPmZyZWUpIHsKKwkJCXJiX2VyYXNlKCZuZXh0LT5yYl9ub2RlLCAmcHJvYy0+ZnJlZV9idWZmZXJzKTsKKwkJCWJpbmRlcl9kZWxldGVfZnJlZV9idWZmZXIocHJvYywgbmV4dCk7CisJCX0KKwl9CisJaWYgKHByb2MtPmJ1ZmZlcnMubmV4dCAhPSAmYnVmZmVyLT5lbnRyeSkgeworCQlzdHJ1Y3QgYmluZGVyX2J1ZmZlciAqcHJldiA9IGxpc3RfZW50cnkoYnVmZmVyLT5lbnRyeS5wcmV2LAorCQkJCQkJc3RydWN0IGJpbmRlcl9idWZmZXIsIGVudHJ5KTsKKwkJaWYgKHByZXYtPmZyZWUpIHsKKwkJCWJpbmRlcl9kZWxldGVfZnJlZV9idWZmZXIocHJvYywgYnVmZmVyKTsKKwkJCXJiX2VyYXNlKCZwcmV2LT5yYl9ub2RlLCAmcHJvYy0+ZnJlZV9idWZmZXJzKTsKKwkJCWJ1ZmZlciA9IHByZXY7CisJCX0KKwl9CisJYmluZGVyX2luc2VydF9mcmVlX2J1ZmZlcihwcm9jLCBidWZmZXIpOworfQorCitzdGF0aWMgc3RydWN0IGJpbmRlcl9ub2RlICoKK2JpbmRlcl9nZXRfbm9kZShzdHJ1Y3QgYmluZGVyX3Byb2MgKnByb2MsIHZvaWQgX191c2VyICpwdHIpCit7CisJc3RydWN0IHJiX25vZGUgKm4gPSBwcm9jLT5ub2Rlcy5yYl9ub2RlOworCXN0cnVjdCBiaW5kZXJfbm9kZSAqbm9kZTsKKworCXdoaWxlIChuKSB7CisJCW5vZGUgPSByYl9lbnRyeShuLCBzdHJ1Y3QgYmluZGVyX25vZGUsIHJiX25vZGUpOworCisJCWlmIChwdHIgPCBub2RlLT5wdHIpCisJCQluID0gbi0+cmJfbGVmdDsKKwkJZWxzZSBpZiAocHRyID4gbm9kZS0+cHRyKQorCQkJbiA9IG4tPnJiX3JpZ2h0OworCQllbHNlCisJCQlyZXR1cm4gbm9kZTsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYmluZGVyX25vZGUgKgorYmluZGVyX25ld19ub2RlKHN0cnVjdCBiaW5kZXJfcHJvYyAqcHJvYywgdm9pZCBfX3VzZXIgKnB0ciwgdm9pZCBfX3VzZXIgKmNvb2tpZSkKK3sKKwlzdHJ1Y3QgcmJfbm9kZSAqKnAgPSAmcHJvYy0+bm9kZXMucmJfbm9kZTsKKwlzdHJ1Y3QgcmJfbm9kZSAqcGFyZW50ID0gTlVMTDsKKwlzdHJ1Y3QgYmluZGVyX25vZGUgKm5vZGU7CisKKwl3aGlsZSAoKnApIHsKKwkJcGFyZW50ID0gKnA7CisJCW5vZGUgPSByYl9lbnRyeShwYXJlbnQsIHN0cnVjdCBiaW5kZXJfbm9kZSwgcmJfbm9kZSk7CisKKwkJaWYgKHB0ciA8IG5vZGUtPnB0cikKKwkJCXAgPSAmKCpwKS0+cmJfbGVmdDsKKwkJZWxzZSBpZiAocHRyID4gbm9kZS0+cHRyKQorCQkJcCA9ICYoKnApLT5yYl9yaWdodDsKKwkJZWxzZQorCQkJcmV0dXJuIE5VTEw7CisJfQorCisJbm9kZSA9IGt6YWxsb2Moc2l6ZW9mKCpub2RlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKG5vZGUgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisJYmluZGVyX3N0YXRzLm9ial9jcmVhdGVkW0JJTkRFUl9TVEFUX05PREVdKys7CisJcmJfbGlua19ub2RlKCZub2RlLT5yYl9ub2RlLCBwYXJlbnQsIHApOworCXJiX2luc2VydF9jb2xvcigmbm9kZS0+cmJfbm9kZSwgJnByb2MtPm5vZGVzKTsKKwlub2RlLT5kZWJ1Z19pZCA9ICsrYmluZGVyX2xhc3RfaWQ7CisJbm9kZS0+cHJvYyA9IHByb2M7CisJbm9kZS0+cHRyID0gcHRyOworCW5vZGUtPmNvb2tpZSA9IGNvb2tpZTsKKwlub2RlLT53b3JrLnR5cGUgPSBCSU5ERVJfV09SS19OT0RFOworCUlOSVRfTElTVF9IRUFEKCZub2RlLT53b3JrLmVudHJ5KTsKKwlJTklUX0xJU1RfSEVBRCgmbm9kZS0+YXN5bmNfdG9kbyk7CisJaWYgKGJpbmRlcl9kZWJ1Z19tYXNrICYgQklOREVSX0RFQlVHX0lOVEVSTkFMX1JFRlMpCisJCXByaW50ayhLRVJOX0lORk8gImJpbmRlcjogJWQ6JWQgbm9kZSAlZCB1JXAgYyVwIGNyZWF0ZWRcbiIsCisJCSAgICAgICBwcm9jLT5waWQsIGN1cnJlbnQtPnBpZCwgbm9kZS0+ZGVidWdfaWQsCisJCSAgICAgICBub2RlLT5wdHIsIG5vZGUtPmNvb2tpZSk7CisJcmV0dXJuIG5vZGU7Cit9CisKK3N0YXRpYyBpbnQKK2JpbmRlcl9pbmNfbm9kZShzdHJ1Y3QgYmluZGVyX25vZGUgKm5vZGUsIGludCBzdHJvbmcsIGludCBpbnRlcm5hbCwKKwkJc3RydWN0IGxpc3RfaGVhZCAqdGFyZ2V0X2xpc3QpCit7CisJaWYgKHN0cm9uZykgeworCQlpZiAoaW50ZXJuYWwpIHsKKwkJCWlmICh0YXJnZXRfbGlzdCA9PSBOVUxMICYmCisJCQkgICAgbm9kZS0+aW50ZXJuYWxfc3Ryb25nX3JlZnMgPT0gMCAmJgorCQkJICAgICEobm9kZSA9PSBiaW5kZXJfY29udGV4dF9tZ3Jfbm9kZSAmJgorCQkJICAgIG5vZGUtPmhhc19zdHJvbmdfcmVmKSkgeworCQkJCXByaW50ayhLRVJOX0VSUiAiYmluZGVyOiBpbnZhbGlkIGluYyBzdHJvbmcgIgorCQkJCQkibm9kZSBmb3IgJWRcbiIsIG5vZGUtPmRlYnVnX2lkKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJCW5vZGUtPmludGVybmFsX3N0cm9uZ19yZWZzKys7CisJCX0gZWxzZQorCQkJbm9kZS0+bG9jYWxfc3Ryb25nX3JlZnMrKzsKKwkJaWYgKCFub2RlLT5oYXNfc3Ryb25nX3JlZiAmJiB0YXJnZXRfbGlzdCkgeworCQkJbGlzdF9kZWxfaW5pdCgmbm9kZS0+d29yay5lbnRyeSk7CisJCQlsaXN0X2FkZF90YWlsKCZub2RlLT53b3JrLmVudHJ5LCB0YXJnZXRfbGlzdCk7CisJCX0KKwl9IGVsc2UgeworCQlpZiAoIWludGVybmFsKQorCQkJbm9kZS0+bG9jYWxfd2Vha19yZWZzKys7CisJCWlmICghbm9kZS0+aGFzX3dlYWtfcmVmICYmIGxpc3RfZW1wdHkoJm5vZGUtPndvcmsuZW50cnkpKSB7CisJCQlpZiAodGFyZ2V0X2xpc3QgPT0gTlVMTCkgeworCQkJCXByaW50ayhLRVJOX0VSUiAiYmluZGVyOiBpbnZhbGlkIGluYyB3ZWFrIG5vZGUgIgorCQkJCQkiZm9yICVkXG4iLCBub2RlLT5kZWJ1Z19pZCk7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCQlsaXN0X2FkZF90YWlsKCZub2RlLT53b3JrLmVudHJ5LCB0YXJnZXRfbGlzdCk7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2JpbmRlcl9kZWNfbm9kZShzdHJ1Y3QgYmluZGVyX25vZGUgKm5vZGUsIGludCBzdHJvbmcsIGludCBpbnRlcm5hbCkKK3sKKwlpZiAoc3Ryb25nKSB7CisJCWlmIChpbnRlcm5hbCkKKwkJCW5vZGUtPmludGVybmFsX3N0cm9uZ19yZWZzLS07CisJCWVsc2UKKwkJCW5vZGUtPmxvY2FsX3N0cm9uZ19yZWZzLS07CisJCWlmIChub2RlLT5sb2NhbF9zdHJvbmdfcmVmcyB8fCBub2RlLT5pbnRlcm5hbF9zdHJvbmdfcmVmcykKKwkJCXJldHVybiAwOworCX0gZWxzZSB7CisJCWlmICghaW50ZXJuYWwpCisJCQlub2RlLT5sb2NhbF93ZWFrX3JlZnMtLTsKKwkJaWYgKG5vZGUtPmxvY2FsX3dlYWtfcmVmcyB8fCAhaGxpc3RfZW1wdHkoJm5vZGUtPnJlZnMpKQorCQkJcmV0dXJuIDA7CisJfQorCWlmIChub2RlLT5wcm9jICYmIChub2RlLT5oYXNfc3Ryb25nX3JlZiB8fCBub2RlLT5oYXNfd2Vha19yZWYpKSB7CisJCWlmIChsaXN0X2VtcHR5KCZub2RlLT53b3JrLmVudHJ5KSkgeworCQkJbGlzdF9hZGRfdGFpbCgmbm9kZS0+d29yay5lbnRyeSwgJm5vZGUtPnByb2MtPnRvZG8pOworCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZub2RlLT5wcm9jLT53YWl0KTsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChobGlzdF9lbXB0eSgmbm9kZS0+cmVmcykgJiYgIW5vZGUtPmxvY2FsX3N0cm9uZ19yZWZzICYmCisJCSAgICAhbm9kZS0+bG9jYWxfd2Vha19yZWZzKSB7CisJCQlsaXN0X2RlbF9pbml0KCZub2RlLT53b3JrLmVudHJ5KTsKKwkJCWlmIChub2RlLT5wcm9jKSB7CisJCQkJcmJfZXJhc2UoJm5vZGUtPnJiX25vZGUsICZub2RlLT5wcm9jLT5ub2Rlcyk7CisJCQkJaWYgKGJpbmRlcl9kZWJ1Z19tYXNrICYgQklOREVSX0RFQlVHX0lOVEVSTkFMX1JFRlMpCisJCQkJCXByaW50ayhLRVJOX0lORk8gImJpbmRlcjogcmVmbGVzcyBub2RlICVkIGRlbGV0ZWRcbiIsIG5vZGUtPmRlYnVnX2lkKTsKKwkJCX0gZWxzZSB7CisJCQkJaGxpc3RfZGVsKCZub2RlLT5kZWFkX25vZGUpOworCQkJCWlmIChiaW5kZXJfZGVidWdfbWFzayAmIEJJTkRFUl9ERUJVR19JTlRFUk5BTF9SRUZTKQorCQkJCQlwcmludGsoS0VSTl9JTkZPICJiaW5kZXI6IGRlYWQgbm9kZSAlZCBkZWxldGVkXG4iLCBub2RlLT5kZWJ1Z19pZCk7CisJCQl9CisJCQlrZnJlZShub2RlKTsKKwkJCWJpbmRlcl9zdGF0cy5vYmpfZGVsZXRlZFtCSU5ERVJfU1RBVF9OT0RFXSsrOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHN0cnVjdCBiaW5kZXJfcmVmICoKK2JpbmRlcl9nZXRfcmVmKHN0cnVjdCBiaW5kZXJfcHJvYyAqcHJvYywgdWludDMyX3QgZGVzYykKK3sKKwlzdHJ1Y3QgcmJfbm9kZSAqbiA9IHByb2MtPnJlZnNfYnlfZGVzYy5yYl9ub2RlOworCXN0cnVjdCBiaW5kZXJfcmVmICpyZWY7CisKKwl3aGlsZSAobikgeworCQlyZWYgPSByYl9lbnRyeShuLCBzdHJ1Y3QgYmluZGVyX3JlZiwgcmJfbm9kZV9kZXNjKTsKKworCQlpZiAoZGVzYyA8IHJlZi0+ZGVzYykKKwkJCW4gPSBuLT5yYl9sZWZ0OworCQllbHNlIGlmIChkZXNjID4gcmVmLT5kZXNjKQorCQkJbiA9IG4tPnJiX3JpZ2h0OworCQllbHNlCisJCQlyZXR1cm4gcmVmOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHN0cnVjdCBiaW5kZXJfcmVmICoKK2JpbmRlcl9nZXRfcmVmX2Zvcl9ub2RlKHN0cnVjdCBiaW5kZXJfcHJvYyAqcHJvYywgc3RydWN0IGJpbmRlcl9ub2RlICpub2RlKQoreworCXN0cnVjdCByYl9ub2RlICpuOworCXN0cnVjdCByYl9ub2RlICoqcCA9ICZwcm9jLT5yZWZzX2J5X25vZGUucmJfbm9kZTsKKwlzdHJ1Y3QgcmJfbm9kZSAqcGFyZW50ID0gTlVMTDsKKwlzdHJ1Y3QgYmluZGVyX3JlZiAqcmVmLCAqbmV3X3JlZjsKKworCXdoaWxlICgqcCkgeworCQlwYXJlbnQgPSAqcDsKKwkJcmVmID0gcmJfZW50cnkocGFyZW50LCBzdHJ1Y3QgYmluZGVyX3JlZiwgcmJfbm9kZV9ub2RlKTsKKworCQlpZiAobm9kZSA8IHJlZi0+bm9kZSkKKwkJCXAgPSAmKCpwKS0+cmJfbGVmdDsKKwkJZWxzZSBpZiAobm9kZSA+IHJlZi0+bm9kZSkKKwkJCXAgPSAmKCpwKS0+cmJfcmlnaHQ7CisJCWVsc2UKKwkJCXJldHVybiByZWY7CisJfQorCW5ld19yZWYgPSBremFsbG9jKHNpemVvZigqcmVmKSwgR0ZQX0tFUk5FTCk7CisJaWYgKG5ld19yZWYgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisJYmluZGVyX3N0YXRzLm9ial9jcmVhdGVkW0JJTkRFUl9TVEFUX1JFRl0rKzsKKwluZXdfcmVmLT5kZWJ1Z19pZCA9ICsrYmluZGVyX2xhc3RfaWQ7CisJbmV3X3JlZi0+cHJvYyA9IHByb2M7CisJbmV3X3JlZi0+bm9kZSA9IG5vZGU7CisJcmJfbGlua19ub2RlKCZuZXdfcmVmLT5yYl9ub2RlX25vZGUsIHBhcmVudCwgcCk7CisJcmJfaW5zZXJ0X2NvbG9yKCZuZXdfcmVmLT5yYl9ub2RlX25vZGUsICZwcm9jLT5yZWZzX2J5X25vZGUpOworCisJbmV3X3JlZi0+ZGVzYyA9IChub2RlID09IGJpbmRlcl9jb250ZXh0X21ncl9ub2RlKSA/IDAgOiAxOworCWZvciAobiA9IHJiX2ZpcnN0KCZwcm9jLT5yZWZzX2J5X2Rlc2MpOyBuICE9IE5VTEw7IG4gPSByYl9uZXh0KG4pKSB7CisJCXJlZiA9IHJiX2VudHJ5KG4sIHN0cnVjdCBiaW5kZXJfcmVmLCByYl9ub2RlX2Rlc2MpOworCQlpZiAocmVmLT5kZXNjID4gbmV3X3JlZi0+ZGVzYykKKwkJCWJyZWFrOworCQluZXdfcmVmLT5kZXNjID0gcmVmLT5kZXNjICsgMTsKKwl9CisKKwlwID0gJnByb2MtPnJlZnNfYnlfZGVzYy5yYl9ub2RlOworCXdoaWxlICgqcCkgeworCQlwYXJlbnQgPSAqcDsKKwkJcmVmID0gcmJfZW50cnkocGFyZW50LCBzdHJ1Y3QgYmluZGVyX3JlZiwgcmJfbm9kZV9kZXNjKTsKKworCQlpZiAobmV3X3JlZi0+ZGVzYyA8IHJlZi0+ZGVzYykKKwkJCXAgPSAmKCpwKS0+cmJfbGVmdDsKKwkJZWxzZSBpZiAobmV3X3JlZi0+ZGVzYyA+IHJlZi0+ZGVzYykKKwkJCXAgPSAmKCpwKS0+cmJfcmlnaHQ7CisJCWVsc2UKKwkJCUJVRygpOworCX0KKwlyYl9saW5rX25vZGUoJm5ld19yZWYtPnJiX25vZGVfZGVzYywgcGFyZW50LCBwKTsKKwlyYl9pbnNlcnRfY29sb3IoJm5ld19yZWYtPnJiX25vZGVfZGVzYywgJnByb2MtPnJlZnNfYnlfZGVzYyk7CisJaWYgKG5vZGUpIHsKKwkJaGxpc3RfYWRkX2hlYWQoJm5ld19yZWYtPm5vZGVfZW50cnksICZub2RlLT5yZWZzKTsKKwkJaWYgKGJpbmRlcl9kZWJ1Z19tYXNrICYgQklOREVSX0RFQlVHX0lOVEVSTkFMX1JFRlMpCisJCQlwcmludGsoS0VSTl9JTkZPICJiaW5kZXI6ICVkIG5ldyByZWYgJWQgZGVzYyAlZCBmb3IgIgorCQkJCSJub2RlICVkXG4iLCBwcm9jLT5waWQsIG5ld19yZWYtPmRlYnVnX2lkLAorCQkJCW5ld19yZWYtPmRlc2MsIG5vZGUtPmRlYnVnX2lkKTsKKwl9IGVsc2UgeworCQlpZiAoYmluZGVyX2RlYnVnX21hc2sgJiBCSU5ERVJfREVCVUdfSU5URVJOQUxfUkVGUykKKwkJCXByaW50ayhLRVJOX0lORk8gImJpbmRlcjogJWQgbmV3IHJlZiAlZCBkZXNjICVkIGZvciAiCisJCQkJImRlYWQgbm9kZVxuIiwgcHJvYy0+cGlkLCBuZXdfcmVmLT5kZWJ1Z19pZCwKKwkJCQluZXdfcmVmLT5kZXNjKTsKKwl9CisJcmV0dXJuIG5ld19yZWY7Cit9CisKK3N0YXRpYyB2b2lkCitiaW5kZXJfZGVsZXRlX3JlZihzdHJ1Y3QgYmluZGVyX3JlZiAqcmVmKQoreworCWlmIChiaW5kZXJfZGVidWdfbWFzayAmIEJJTkRFUl9ERUJVR19JTlRFUk5BTF9SRUZTKQorCQlwcmludGsoS0VSTl9JTkZPICJiaW5kZXI6ICVkIGRlbGV0ZSByZWYgJWQgZGVzYyAlZCBmb3IgIgorCQkJIm5vZGUgJWRcbiIsIHJlZi0+cHJvYy0+cGlkLCByZWYtPmRlYnVnX2lkLAorCQkJcmVmLT5kZXNjLCByZWYtPm5vZGUtPmRlYnVnX2lkKTsKKwlyYl9lcmFzZSgmcmVmLT5yYl9ub2RlX2Rlc2MsICZyZWYtPnByb2MtPnJlZnNfYnlfZGVzYyk7CisJcmJfZXJhc2UoJnJlZi0+cmJfbm9kZV9ub2RlLCAmcmVmLT5wcm9jLT5yZWZzX2J5X25vZGUpOworCWlmIChyZWYtPnN0cm9uZykKKwkJYmluZGVyX2RlY19ub2RlKHJlZi0+bm9kZSwgMSwgMSk7CisJaGxpc3RfZGVsKCZyZWYtPm5vZGVfZW50cnkpOworCWJpbmRlcl9kZWNfbm9kZShyZWYtPm5vZGUsIDAsIDEpOworCWlmIChyZWYtPmRlYXRoKSB7CisJCWlmIChiaW5kZXJfZGVidWdfbWFzayAmIEJJTkRFUl9ERUJVR19ERUFEX0JJTkRFUikKKwkJCXByaW50ayhLRVJOX0lORk8gImJpbmRlcjogJWQgZGVsZXRlIHJlZiAlZCBkZXNjICVkICIKKwkJCQkiaGFzIGRlYXRoIG5vdGlmaWNhdGlvblxuIiwgcmVmLT5wcm9jLT5waWQsCisJCQkJcmVmLT5kZWJ1Z19pZCwgcmVmLT5kZXNjKTsKKwkJbGlzdF9kZWwoJnJlZi0+ZGVhdGgtPndvcmsuZW50cnkpOworCQlrZnJlZShyZWYtPmRlYXRoKTsKKwkJYmluZGVyX3N0YXRzLm9ial9kZWxldGVkW0JJTkRFUl9TVEFUX0RFQVRIXSsrOworCX0KKwlrZnJlZShyZWYpOworCWJpbmRlcl9zdGF0cy5vYmpfZGVsZXRlZFtCSU5ERVJfU1RBVF9SRUZdKys7Cit9CisKK3N0YXRpYyBpbnQKK2JpbmRlcl9pbmNfcmVmKAorCXN0cnVjdCBiaW5kZXJfcmVmICpyZWYsIGludCBzdHJvbmcsIHN0cnVjdCBsaXN0X2hlYWQgKnRhcmdldF9saXN0KQoreworCWludCByZXQ7CisJaWYgKHN0cm9uZykgeworCQlpZiAocmVmLT5zdHJvbmcgPT0gMCkgeworCQkJcmV0ID0gYmluZGVyX2luY19ub2RlKHJlZi0+bm9kZSwgMSwgMSwgdGFyZ2V0X2xpc3QpOworCQkJaWYgKHJldCkKKwkJCQlyZXR1cm4gcmV0OworCQl9CisJCXJlZi0+c3Ryb25nKys7CisJfSBlbHNlIHsKKwkJaWYgKHJlZi0+d2VhayA9PSAwKSB7CisJCQlyZXQgPSBiaW5kZXJfaW5jX25vZGUocmVmLT5ub2RlLCAwLCAxLCB0YXJnZXRfbGlzdCk7CisJCQlpZiAocmV0KQorCQkJCXJldHVybiByZXQ7CisJCX0KKwkJcmVmLT53ZWFrKys7CisJfQorCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQKK2JpbmRlcl9kZWNfcmVmKHN0cnVjdCBiaW5kZXJfcmVmICpyZWYsIGludCBzdHJvbmcpCit7CisJaWYgKHN0cm9uZykgeworCQlpZiAocmVmLT5zdHJvbmcgPT0gMCkgeworCQkJYmluZGVyX3VzZXJfZXJyb3IoImJpbmRlcjogJWQgaW52YWxpZCBkZWMgc3Ryb25nLCAiCisJCQkJCSAgInJlZiAlZCBkZXNjICVkIHMgJWQgdyAlZFxuIiwKKwkJCQkJICByZWYtPnByb2MtPnBpZCwgcmVmLT5kZWJ1Z19pZCwKKwkJCQkJICByZWYtPmRlc2MsIHJlZi0+c3Ryb25nLCByZWYtPndlYWspOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJcmVmLT5zdHJvbmctLTsKKwkJaWYgKHJlZi0+c3Ryb25nID09IDApIHsKKwkJCWludCByZXQ7CisJCQlyZXQgPSBiaW5kZXJfZGVjX25vZGUocmVmLT5ub2RlLCBzdHJvbmcsIDEpOworCQkJaWYgKHJldCkKKwkJCQlyZXR1cm4gcmV0OworCQl9CisJfSBlbHNlIHsKKwkJaWYgKHJlZi0+d2VhayA9PSAwKSB7CisJCQliaW5kZXJfdXNlcl9lcnJvcigiYmluZGVyOiAlZCBpbnZhbGlkIGRlYyB3ZWFrLCAiCisJCQkJCSAgInJlZiAlZCBkZXNjICVkIHMgJWQgdyAlZFxuIiwKKwkJCQkJICByZWYtPnByb2MtPnBpZCwgcmVmLT5kZWJ1Z19pZCwKKwkJCQkJICByZWYtPmRlc2MsIHJlZi0+c3Ryb25nLCByZWYtPndlYWspOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJcmVmLT53ZWFrLS07CisJfQorCWlmIChyZWYtPnN0cm9uZyA9PSAwICYmIHJlZi0+d2VhayA9PSAwKQorCQliaW5kZXJfZGVsZXRlX3JlZihyZWYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAorYmluZGVyX3BvcF90cmFuc2FjdGlvbigKKwlzdHJ1Y3QgYmluZGVyX3RocmVhZCAqdGFyZ2V0X3RocmVhZCwgc3RydWN0IGJpbmRlcl90cmFuc2FjdGlvbiAqdCkKK3sKKwlpZiAodGFyZ2V0X3RocmVhZCkgeworCQlCVUdfT04odGFyZ2V0X3RocmVhZC0+dHJhbnNhY3Rpb25fc3RhY2sgIT0gdCk7CisJCUJVR19PTih0YXJnZXRfdGhyZWFkLT50cmFuc2FjdGlvbl9zdGFjay0+ZnJvbSAhPSB0YXJnZXRfdGhyZWFkKTsKKwkJdGFyZ2V0X3RocmVhZC0+dHJhbnNhY3Rpb25fc3RhY2sgPQorCQkJdGFyZ2V0X3RocmVhZC0+dHJhbnNhY3Rpb25fc3RhY2stPmZyb21fcGFyZW50OworCQl0LT5mcm9tID0gTlVMTDsKKwl9CisJdC0+bmVlZF9yZXBseSA9IDA7CisJaWYgKHQtPmJ1ZmZlcikKKwkJdC0+YnVmZmVyLT50cmFuc2FjdGlvbiA9IE5VTEw7CisJa2ZyZWUodCk7CisJYmluZGVyX3N0YXRzLm9ial9kZWxldGVkW0JJTkRFUl9TVEFUX1RSQU5TQUNUSU9OXSsrOworfQorCitzdGF0aWMgdm9pZAorYmluZGVyX3NlbmRfZmFpbGVkX3JlcGx5KHN0cnVjdCBiaW5kZXJfdHJhbnNhY3Rpb24gKnQsIHVpbnQzMl90IGVycm9yX2NvZGUpCit7CisJc3RydWN0IGJpbmRlcl90aHJlYWQgKnRhcmdldF90aHJlYWQ7CisJQlVHX09OKHQtPmZsYWdzICYgVEZfT05FX1dBWSk7CisJd2hpbGUgKDEpIHsKKwkJdGFyZ2V0X3RocmVhZCA9IHQtPmZyb207CisJCWlmICh0YXJnZXRfdGhyZWFkKSB7CisJCQlpZiAodGFyZ2V0X3RocmVhZC0+cmV0dXJuX2Vycm9yICE9IEJSX09LICYmCisJCQkgICB0YXJnZXRfdGhyZWFkLT5yZXR1cm5fZXJyb3IyID09IEJSX09LKSB7CisJCQkJdGFyZ2V0X3RocmVhZC0+cmV0dXJuX2Vycm9yMiA9CisJCQkJCXRhcmdldF90aHJlYWQtPnJldHVybl9lcnJvcjsKKwkJCQl0YXJnZXRfdGhyZWFkLT5yZXR1cm5fZXJyb3IgPSBCUl9PSzsKKwkJCX0KKwkJCWlmICh0YXJnZXRfdGhyZWFkLT5yZXR1cm5fZXJyb3IgPT0gQlJfT0spIHsKKwkJCQlpZiAoYmluZGVyX2RlYnVnX21hc2sgJiBCSU5ERVJfREVCVUdfRkFJTEVEX1RSQU5TQUNUSU9OKQorCQkJCQlwcmludGsoS0VSTl9JTkZPICJiaW5kZXI6IHNlbmQgZmFpbGVkIHJlcGx5IGZvciB0cmFuc2FjdGlvbiAlZCB0byAlZDolZFxuIiwKKwkJCQkJICAgICAgIHQtPmRlYnVnX2lkLCB0YXJnZXRfdGhyZWFkLT5wcm9jLT5waWQsIHRhcmdldF90aHJlYWQtPnBpZCk7CisKKwkJCQliaW5kZXJfcG9wX3RyYW5zYWN0aW9uKHRhcmdldF90aHJlYWQsIHQpOworCQkJCXRhcmdldF90aHJlYWQtPnJldHVybl9lcnJvciA9IGVycm9yX2NvZGU7CisJCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ0YXJnZXRfdGhyZWFkLT53YWl0KTsKKwkJCX0gZWxzZSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJiaW5kZXI6IHJlcGx5IGZhaWxlZCwgdGFyZ2V0ICIKKwkJCQkJInRocmVhZCwgJWQ6JWQsIGhhcyBlcnJvciBjb2RlICVkICIKKwkJCQkJImFscmVhZHlcbiIsIHRhcmdldF90aHJlYWQtPnByb2MtPnBpZCwKKwkJCQkJdGFyZ2V0X3RocmVhZC0+cGlkLAorCQkJCQl0YXJnZXRfdGhyZWFkLT5yZXR1cm5fZXJyb3IpOworCQkJfQorCQkJcmV0dXJuOworCQl9IGVsc2UgeworCQkJc3RydWN0IGJpbmRlcl90cmFuc2FjdGlvbiAqbmV4dCA9IHQtPmZyb21fcGFyZW50OworCisJCQlpZiAoYmluZGVyX2RlYnVnX21hc2sgJiBCSU5ERVJfREVCVUdfRkFJTEVEX1RSQU5TQUNUSU9OKQorCQkJCXByaW50ayhLRVJOX0lORk8gImJpbmRlcjogc2VuZCBmYWlsZWQgcmVwbHkgIgorCQkJCQkiZm9yIHRyYW5zYWN0aW9uICVkLCB0YXJnZXQgZGVhZFxuIiwKKwkJCQkJdC0+ZGVidWdfaWQpOworCisJCQliaW5kZXJfcG9wX3RyYW5zYWN0aW9uKHRhcmdldF90aHJlYWQsIHQpOworCQkJaWYgKG5leHQgPT0gTlVMTCkgeworCQkJCWlmIChiaW5kZXJfZGVidWdfbWFzayAmIEJJTkRFUl9ERUJVR19ERUFEX0JJTkRFUikKKwkJCQkJcHJpbnRrKEtFUk5fSU5GTyAiYmluZGVyOiByZXBseSBmYWlsZWQsIgorCQkJCQkJIiBubyB0YXJnZXQgdGhyZWFkIGF0IHJvb3RcbiIpOworCQkJCXJldHVybjsKKwkJCX0KKwkJCXQgPSBuZXh0OworCQkJaWYgKGJpbmRlcl9kZWJ1Z19tYXNrICYgQklOREVSX0RFQlVHX0RFQURfQklOREVSKQorCQkJCXByaW50ayhLRVJOX0lORk8gImJpbmRlcjogcmVwbHkgZmFpbGVkLCBubyB0YXJnIgorCQkJCQkiZXQgdGhyZWFkIC0tIHJldHJ5ICVkXG4iLCB0LT5kZWJ1Z19pZCk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkCitiaW5kZXJfdHJhbnNhY3Rpb25fYnVmZmVyX3JlbGVhc2Uoc3RydWN0IGJpbmRlcl9wcm9jICpwcm9jLAorCQkJc3RydWN0IGJpbmRlcl9idWZmZXIgKmJ1ZmZlciwgc2l6ZV90ICpmYWlsZWRfYXQpOworCitzdGF0aWMgdm9pZAorYmluZGVyX3RyYW5zYWN0aW9uKHN0cnVjdCBiaW5kZXJfcHJvYyAqcHJvYywgc3RydWN0IGJpbmRlcl90aHJlYWQgKnRocmVhZCwKKwlzdHJ1Y3QgYmluZGVyX3RyYW5zYWN0aW9uX2RhdGEgKnRyLCBpbnQgcmVwbHkpCit7CisJc3RydWN0IGJpbmRlcl90cmFuc2FjdGlvbiAqdDsKKwlzdHJ1Y3QgYmluZGVyX3dvcmsgKnRjb21wbGV0ZTsKKwlzaXplX3QgKm9mZnAsICpvZmZfZW5kOworCXN0cnVjdCBiaW5kZXJfcHJvYyAqdGFyZ2V0X3Byb2M7CisJc3RydWN0IGJpbmRlcl90aHJlYWQgKnRhcmdldF90aHJlYWQgPSBOVUxMOworCXN0cnVjdCBiaW5kZXJfbm9kZSAqdGFyZ2V0X25vZGUgPSBOVUxMOworCXN0cnVjdCBsaXN0X2hlYWQgKnRhcmdldF9saXN0OworCXdhaXRfcXVldWVfaGVhZF90ICp0YXJnZXRfd2FpdDsKKwlzdHJ1Y3QgYmluZGVyX3RyYW5zYWN0aW9uICppbl9yZXBseV90byA9IE5VTEw7CisJc3RydWN0IGJpbmRlcl90cmFuc2FjdGlvbl9sb2dfZW50cnkgKmU7CisJdWludDMyX3QgcmV0dXJuX2Vycm9yOworCisJZSA9IGJpbmRlcl90cmFuc2FjdGlvbl9sb2dfYWRkKCZiaW5kZXJfdHJhbnNhY3Rpb25fbG9nKTsKKwllLT5jYWxsX3R5cGUgPSByZXBseSA/IDIgOiAhISh0ci0+ZmxhZ3MgJiBURl9PTkVfV0FZKTsKKwllLT5mcm9tX3Byb2MgPSBwcm9jLT5waWQ7CisJZS0+ZnJvbV90aHJlYWQgPSB0aHJlYWQtPnBpZDsKKwllLT50YXJnZXRfaGFuZGxlID0gdHItPnRhcmdldC5oYW5kbGU7CisJZS0+ZGF0YV9zaXplID0gdHItPmRhdGFfc2l6ZTsKKwllLT5vZmZzZXRzX3NpemUgPSB0ci0+b2Zmc2V0c19zaXplOworCisJaWYgKHJlcGx5KSB7CisJCWluX3JlcGx5X3RvID0gdGhyZWFkLT50cmFuc2FjdGlvbl9zdGFjazsKKwkJaWYgKGluX3JlcGx5X3RvID09IE5VTEwpIHsKKwkJCWJpbmRlcl91c2VyX2Vycm9yKCJiaW5kZXI6ICVkOiVkIGdvdCByZXBseSB0cmFuc2FjdGlvbiAiCisJCQkJCSAgIndpdGggbm8gdHJhbnNhY3Rpb24gc3RhY2tcbiIsCisJCQkJCSAgcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCk7CisJCQlyZXR1cm5fZXJyb3IgPSBCUl9GQUlMRURfUkVQTFk7CisJCQlnb3RvIGVycl9lbXB0eV9jYWxsX3N0YWNrOworCQl9CisJCWJpbmRlcl9zZXRfbmljZShpbl9yZXBseV90by0+c2F2ZWRfcHJpb3JpdHkpOworCQlpZiAoaW5fcmVwbHlfdG8tPnRvX3RocmVhZCAhPSB0aHJlYWQpIHsKKwkJCWJpbmRlcl91c2VyX2Vycm9yKCJiaW5kZXI6ICVkOiVkIGdvdCByZXBseSB0cmFuc2FjdGlvbiAiCisJCQkJIndpdGggYmFkIHRyYW5zYWN0aW9uIHN0YWNrLCIKKwkJCQkiIHRyYW5zYWN0aW9uICVkIGhhcyB0YXJnZXQgJWQ6JWRcbiIsCisJCQkJcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCwgaW5fcmVwbHlfdG8tPmRlYnVnX2lkLAorCQkJCWluX3JlcGx5X3RvLT50b19wcm9jID8KKwkJCQlpbl9yZXBseV90by0+dG9fcHJvYy0+cGlkIDogMCwKKwkJCQlpbl9yZXBseV90by0+dG9fdGhyZWFkID8KKwkJCQlpbl9yZXBseV90by0+dG9fdGhyZWFkLT5waWQgOiAwKTsKKwkJCXJldHVybl9lcnJvciA9IEJSX0ZBSUxFRF9SRVBMWTsKKwkJCWluX3JlcGx5X3RvID0gTlVMTDsKKwkJCWdvdG8gZXJyX2JhZF9jYWxsX3N0YWNrOworCQl9CisJCXRocmVhZC0+dHJhbnNhY3Rpb25fc3RhY2sgPSBpbl9yZXBseV90by0+dG9fcGFyZW50OworCQl0YXJnZXRfdGhyZWFkID0gaW5fcmVwbHlfdG8tPmZyb207CisJCWlmICh0YXJnZXRfdGhyZWFkID09IE5VTEwpIHsKKwkJCXJldHVybl9lcnJvciA9IEJSX0RFQURfUkVQTFk7CisJCQlnb3RvIGVycl9kZWFkX2JpbmRlcjsKKwkJfQorCQlpZiAodGFyZ2V0X3RocmVhZC0+dHJhbnNhY3Rpb25fc3RhY2sgIT0gaW5fcmVwbHlfdG8pIHsKKwkJCWJpbmRlcl91c2VyX2Vycm9yKCJiaW5kZXI6ICVkOiVkIGdvdCByZXBseSB0cmFuc2FjdGlvbiAiCisJCQkJIndpdGggYmFkIHRhcmdldCB0cmFuc2FjdGlvbiBzdGFjayAlZCwgIgorCQkJCSJleHBlY3RlZCAlZFxuIiwKKwkJCQlwcm9jLT5waWQsIHRocmVhZC0+cGlkLAorCQkJCXRhcmdldF90aHJlYWQtPnRyYW5zYWN0aW9uX3N0YWNrID8KKwkJCQl0YXJnZXRfdGhyZWFkLT50cmFuc2FjdGlvbl9zdGFjay0+ZGVidWdfaWQgOiAwLAorCQkJCWluX3JlcGx5X3RvLT5kZWJ1Z19pZCk7CisJCQlyZXR1cm5fZXJyb3IgPSBCUl9GQUlMRURfUkVQTFk7CisJCQlpbl9yZXBseV90byA9IE5VTEw7CisJCQl0YXJnZXRfdGhyZWFkID0gTlVMTDsKKwkJCWdvdG8gZXJyX2RlYWRfYmluZGVyOworCQl9CisJCXRhcmdldF9wcm9jID0gdGFyZ2V0X3RocmVhZC0+cHJvYzsKKwl9IGVsc2UgeworCQlpZiAodHItPnRhcmdldC5oYW5kbGUpIHsKKwkJCXN0cnVjdCBiaW5kZXJfcmVmICpyZWY7CisJCQlyZWYgPSBiaW5kZXJfZ2V0X3JlZihwcm9jLCB0ci0+dGFyZ2V0LmhhbmRsZSk7CisJCQlpZiAocmVmID09IE5VTEwpIHsKKwkJCQliaW5kZXJfdXNlcl9lcnJvcigiYmluZGVyOiAlZDolZCBnb3QgIgorCQkJCQkidHJhbnNhY3Rpb24gdG8gaW52YWxpZCBoYW5kbGVcbiIsCisJCQkJCXByb2MtPnBpZCwgdGhyZWFkLT5waWQpOworCQkJCXJldHVybl9lcnJvciA9IEJSX0ZBSUxFRF9SRVBMWTsKKwkJCQlnb3RvIGVycl9pbnZhbGlkX3RhcmdldF9oYW5kbGU7CisJCQl9CisJCQl0YXJnZXRfbm9kZSA9IHJlZi0+bm9kZTsKKwkJfSBlbHNlIHsKKwkJCXRhcmdldF9ub2RlID0gYmluZGVyX2NvbnRleHRfbWdyX25vZGU7CisJCQlpZiAodGFyZ2V0X25vZGUgPT0gTlVMTCkgeworCQkJCXJldHVybl9lcnJvciA9IEJSX0RFQURfUkVQTFk7CisJCQkJZ290byBlcnJfbm9fY29udGV4dF9tZ3Jfbm9kZTsKKwkJCX0KKwkJfQorCQllLT50b19ub2RlID0gdGFyZ2V0X25vZGUtPmRlYnVnX2lkOworCQl0YXJnZXRfcHJvYyA9IHRhcmdldF9ub2RlLT5wcm9jOworCQlpZiAodGFyZ2V0X3Byb2MgPT0gTlVMTCkgeworCQkJcmV0dXJuX2Vycm9yID0gQlJfREVBRF9SRVBMWTsKKwkJCWdvdG8gZXJyX2RlYWRfYmluZGVyOworCQl9CisJCWlmICghKHRyLT5mbGFncyAmIFRGX09ORV9XQVkpICYmIHRocmVhZC0+dHJhbnNhY3Rpb25fc3RhY2spIHsKKwkJCXN0cnVjdCBiaW5kZXJfdHJhbnNhY3Rpb24gKnRtcDsKKwkJCXRtcCA9IHRocmVhZC0+dHJhbnNhY3Rpb25fc3RhY2s7CisJCQl3aGlsZSAodG1wKSB7CisJCQkJaWYgKHRtcC0+ZnJvbSAmJiB0bXAtPmZyb20tPnByb2MgPT0gdGFyZ2V0X3Byb2MpCisJCQkJCXRhcmdldF90aHJlYWQgPSB0bXAtPmZyb207CisJCQkJdG1wID0gdG1wLT5mcm9tX3BhcmVudDsKKwkJCX0KKwkJfQorCX0KKwlpZiAodGFyZ2V0X3RocmVhZCkgeworCQllLT50b190aHJlYWQgPSB0YXJnZXRfdGhyZWFkLT5waWQ7CisJCXRhcmdldF9saXN0ID0gJnRhcmdldF90aHJlYWQtPnRvZG87CisJCXRhcmdldF93YWl0ID0gJnRhcmdldF90aHJlYWQtPndhaXQ7CisJfSBlbHNlIHsKKwkJdGFyZ2V0X2xpc3QgPSAmdGFyZ2V0X3Byb2MtPnRvZG87CisJCXRhcmdldF93YWl0ID0gJnRhcmdldF9wcm9jLT53YWl0OworCX0KKwllLT50b19wcm9jID0gdGFyZ2V0X3Byb2MtPnBpZDsKKworCS8qIFRPRE86IHJldXNlIGluY29taW5nIHRyYW5zYWN0aW9uIGZvciByZXBseSAqLworCXQgPSBremFsbG9jKHNpemVvZigqdCksIEdGUF9LRVJORUwpOworCWlmICh0ID09IE5VTEwpIHsKKwkJcmV0dXJuX2Vycm9yID0gQlJfRkFJTEVEX1JFUExZOworCQlnb3RvIGVycl9hbGxvY190X2ZhaWxlZDsKKwl9CisJYmluZGVyX3N0YXRzLm9ial9jcmVhdGVkW0JJTkRFUl9TVEFUX1RSQU5TQUNUSU9OXSsrOworCisJdGNvbXBsZXRlID0ga3phbGxvYyhzaXplb2YoKnRjb21wbGV0ZSksIEdGUF9LRVJORUwpOworCWlmICh0Y29tcGxldGUgPT0gTlVMTCkgeworCQlyZXR1cm5fZXJyb3IgPSBCUl9GQUlMRURfUkVQTFk7CisJCWdvdG8gZXJyX2FsbG9jX3Rjb21wbGV0ZV9mYWlsZWQ7CisJfQorCWJpbmRlcl9zdGF0cy5vYmpfY3JlYXRlZFtCSU5ERVJfU1RBVF9UUkFOU0FDVElPTl9DT01QTEVURV0rKzsKKworCXQtPmRlYnVnX2lkID0gKytiaW5kZXJfbGFzdF9pZDsKKwllLT5kZWJ1Z19pZCA9IHQtPmRlYnVnX2lkOworCisJaWYgKGJpbmRlcl9kZWJ1Z19tYXNrICYgQklOREVSX0RFQlVHX1RSQU5TQUNUSU9OKSB7CisJCWlmIChyZXBseSkKKwkJCXByaW50ayhLRVJOX0lORk8gImJpbmRlcjogJWQ6JWQgQkNfUkVQTFkgJWQgLT4gJWQ6JWQsICIKKwkJCSAgICAgICAiZGF0YSAlcC0lcCBzaXplICV6ZC0lemRcbiIsCisJCQkgICAgICAgcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCwgdC0+ZGVidWdfaWQsCisJCQkgICAgICAgdGFyZ2V0X3Byb2MtPnBpZCwgdGFyZ2V0X3RocmVhZC0+cGlkLAorCQkJICAgICAgIHRyLT5kYXRhLnB0ci5idWZmZXIsIHRyLT5kYXRhLnB0ci5vZmZzZXRzLAorCQkJICAgICAgIHRyLT5kYXRhX3NpemUsIHRyLT5vZmZzZXRzX3NpemUpOworCQllbHNlCisJCQlwcmludGsoS0VSTl9JTkZPICJiaW5kZXI6ICVkOiVkIEJDX1RSQU5TQUNUSU9OICVkIC0+ICIKKwkJCSAgICAgICAiJWQgLSBub2RlICVkLCBkYXRhICVwLSVwIHNpemUgJXpkLSV6ZFxuIiwKKwkJCSAgICAgICBwcm9jLT5waWQsIHRocmVhZC0+cGlkLCB0LT5kZWJ1Z19pZCwKKwkJCSAgICAgICB0YXJnZXRfcHJvYy0+cGlkLCB0YXJnZXRfbm9kZS0+ZGVidWdfaWQsCisJCQkgICAgICAgdHItPmRhdGEucHRyLmJ1ZmZlciwgdHItPmRhdGEucHRyLm9mZnNldHMsCisJCQkgICAgICAgdHItPmRhdGFfc2l6ZSwgdHItPm9mZnNldHNfc2l6ZSk7CisJfQorCisJaWYgKCFyZXBseSAmJiAhKHRyLT5mbGFncyAmIFRGX09ORV9XQVkpKQorCQl0LT5mcm9tID0gdGhyZWFkOworCWVsc2UKKwkJdC0+ZnJvbSA9IE5VTEw7CisJdC0+c2VuZGVyX2V1aWQgPSBwcm9jLT50c2stPmNyZWQtPmV1aWQ7CisJdC0+dG9fcHJvYyA9IHRhcmdldF9wcm9jOworCXQtPnRvX3RocmVhZCA9IHRhcmdldF90aHJlYWQ7CisJdC0+Y29kZSA9IHRyLT5jb2RlOworCXQtPmZsYWdzID0gdHItPmZsYWdzOworCXQtPnByaW9yaXR5ID0gdGFza19uaWNlKGN1cnJlbnQpOworCXQtPmJ1ZmZlciA9IGJpbmRlcl9hbGxvY19idWYodGFyZ2V0X3Byb2MsIHRyLT5kYXRhX3NpemUsCisJCXRyLT5vZmZzZXRzX3NpemUsICFyZXBseSAmJiAodC0+ZmxhZ3MgJiBURl9PTkVfV0FZKSk7CisJaWYgKHQtPmJ1ZmZlciA9PSBOVUxMKSB7CisJCXJldHVybl9lcnJvciA9IEJSX0ZBSUxFRF9SRVBMWTsKKwkJZ290byBlcnJfYmluZGVyX2FsbG9jX2J1Zl9mYWlsZWQ7CisJfQorCXQtPmJ1ZmZlci0+YWxsb3dfdXNlcl9mcmVlID0gMDsKKwl0LT5idWZmZXItPmRlYnVnX2lkID0gdC0+ZGVidWdfaWQ7CisJdC0+YnVmZmVyLT50cmFuc2FjdGlvbiA9IHQ7CisJdC0+YnVmZmVyLT50YXJnZXRfbm9kZSA9IHRhcmdldF9ub2RlOworCWlmICh0YXJnZXRfbm9kZSkKKwkJYmluZGVyX2luY19ub2RlKHRhcmdldF9ub2RlLCAxLCAwLCBOVUxMKTsKKworCW9mZnAgPSAoc2l6ZV90ICopKHQtPmJ1ZmZlci0+ZGF0YSArIEFMSUdOKHRyLT5kYXRhX3NpemUsIHNpemVvZih2b2lkICopKSk7CisKKwlpZiAoY29weV9mcm9tX3VzZXIodC0+YnVmZmVyLT5kYXRhLCB0ci0+ZGF0YS5wdHIuYnVmZmVyLCB0ci0+ZGF0YV9zaXplKSkgeworCQliaW5kZXJfdXNlcl9lcnJvcigiYmluZGVyOiAlZDolZCBnb3QgdHJhbnNhY3Rpb24gd2l0aCBpbnZhbGlkICIKKwkJCSJkYXRhIHB0clxuIiwgcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCk7CisJCXJldHVybl9lcnJvciA9IEJSX0ZBSUxFRF9SRVBMWTsKKwkJZ290byBlcnJfY29weV9kYXRhX2ZhaWxlZDsKKwl9CisJaWYgKGNvcHlfZnJvbV91c2VyKG9mZnAsIHRyLT5kYXRhLnB0ci5vZmZzZXRzLCB0ci0+b2Zmc2V0c19zaXplKSkgeworCQliaW5kZXJfdXNlcl9lcnJvcigiYmluZGVyOiAlZDolZCBnb3QgdHJhbnNhY3Rpb24gd2l0aCBpbnZhbGlkICIKKwkJCSJvZmZzZXRzIHB0clxuIiwgcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCk7CisJCXJldHVybl9lcnJvciA9IEJSX0ZBSUxFRF9SRVBMWTsKKwkJZ290byBlcnJfY29weV9kYXRhX2ZhaWxlZDsKKwl9CisJb2ZmX2VuZCA9ICh2b2lkICopb2ZmcCArIHRyLT5vZmZzZXRzX3NpemU7CisJZm9yICg7IG9mZnAgPCBvZmZfZW5kOyBvZmZwKyspIHsKKwkJc3RydWN0IGZsYXRfYmluZGVyX29iamVjdCAqZnA7CisJCWlmICgqb2ZmcCA+IHQtPmJ1ZmZlci0+ZGF0YV9zaXplIC0gc2l6ZW9mKCpmcCkpIHsKKwkJCWJpbmRlcl91c2VyX2Vycm9yKCJiaW5kZXI6ICVkOiVkIGdvdCB0cmFuc2FjdGlvbiB3aXRoICIKKwkJCQkiaW52YWxpZCBvZmZzZXQsICV6ZFxuIiwKKwkJCQlwcm9jLT5waWQsIHRocmVhZC0+cGlkLCAqb2ZmcCk7CisJCQlyZXR1cm5fZXJyb3IgPSBCUl9GQUlMRURfUkVQTFk7CisJCQlnb3RvIGVycl9iYWRfb2Zmc2V0OworCQl9CisJCWZwID0gKHN0cnVjdCBmbGF0X2JpbmRlcl9vYmplY3QgKikodC0+YnVmZmVyLT5kYXRhICsgKm9mZnApOworCQlzd2l0Y2ggKGZwLT50eXBlKSB7CisJCWNhc2UgQklOREVSX1RZUEVfQklOREVSOgorCQljYXNlIEJJTkRFUl9UWVBFX1dFQUtfQklOREVSOiB7CisJCQlzdHJ1Y3QgYmluZGVyX3JlZiAqcmVmOworCQkJc3RydWN0IGJpbmRlcl9ub2RlICpub2RlID0gYmluZGVyX2dldF9ub2RlKHByb2MsIGZwLT5iaW5kZXIpOworCQkJaWYgKG5vZGUgPT0gTlVMTCkgeworCQkJCW5vZGUgPSBiaW5kZXJfbmV3X25vZGUocHJvYywgZnAtPmJpbmRlciwgZnAtPmNvb2tpZSk7CisJCQkJaWYgKG5vZGUgPT0gTlVMTCkgeworCQkJCQlyZXR1cm5fZXJyb3IgPSBCUl9GQUlMRURfUkVQTFk7CisJCQkJCWdvdG8gZXJyX2JpbmRlcl9uZXdfbm9kZV9mYWlsZWQ7CisJCQkJfQorCQkJCW5vZGUtPm1pbl9wcmlvcml0eSA9IGZwLT5mbGFncyAmIEZMQVRfQklOREVSX0ZMQUdfUFJJT1JJVFlfTUFTSzsKKwkJCQlub2RlLT5hY2NlcHRfZmRzID0gISEoZnAtPmZsYWdzICYgRkxBVF9CSU5ERVJfRkxBR19BQ0NFUFRTX0ZEUyk7CisJCQl9CisJCQlpZiAoZnAtPmNvb2tpZSAhPSBub2RlLT5jb29raWUpIHsKKwkJCQliaW5kZXJfdXNlcl9lcnJvcigiYmluZGVyOiAlZDolZCBzZW5kaW5nIHUlcCAiCisJCQkJCSJub2RlICVkLCBjb29raWUgbWlzbWF0Y2ggJXAgIT0gJXBcbiIsCisJCQkJCXByb2MtPnBpZCwgdGhyZWFkLT5waWQsCisJCQkJCWZwLT5iaW5kZXIsIG5vZGUtPmRlYnVnX2lkLAorCQkJCQlmcC0+Y29va2llLCBub2RlLT5jb29raWUpOworCQkJCWdvdG8gZXJyX2JpbmRlcl9nZXRfcmVmX2Zvcl9ub2RlX2ZhaWxlZDsKKwkJCX0KKwkJCXJlZiA9IGJpbmRlcl9nZXRfcmVmX2Zvcl9ub2RlKHRhcmdldF9wcm9jLCBub2RlKTsKKwkJCWlmIChyZWYgPT0gTlVMTCkgeworCQkJCXJldHVybl9lcnJvciA9IEJSX0ZBSUxFRF9SRVBMWTsKKwkJCQlnb3RvIGVycl9iaW5kZXJfZ2V0X3JlZl9mb3Jfbm9kZV9mYWlsZWQ7CisJCQl9CisJCQlpZiAoZnAtPnR5cGUgPT0gQklOREVSX1RZUEVfQklOREVSKQorCQkJCWZwLT50eXBlID0gQklOREVSX1RZUEVfSEFORExFOworCQkJZWxzZQorCQkJCWZwLT50eXBlID0gQklOREVSX1RZUEVfV0VBS19IQU5ETEU7CisJCQlmcC0+aGFuZGxlID0gcmVmLT5kZXNjOworCQkJYmluZGVyX2luY19yZWYocmVmLCBmcC0+dHlwZSA9PSBCSU5ERVJfVFlQRV9IQU5ETEUsICZ0aHJlYWQtPnRvZG8pOworCQkJaWYgKGJpbmRlcl9kZWJ1Z19tYXNrICYgQklOREVSX0RFQlVHX1RSQU5TQUNUSU9OKQorCQkJCXByaW50ayhLRVJOX0lORk8gIiAgICAgICAgbm9kZSAlZCB1JXAgLT4gcmVmICVkIGRlc2MgJWRcbiIsCisJCQkJICAgICAgIG5vZGUtPmRlYnVnX2lkLCBub2RlLT5wdHIsIHJlZi0+ZGVidWdfaWQsIHJlZi0+ZGVzYyk7CisJCX0gYnJlYWs7CisJCWNhc2UgQklOREVSX1RZUEVfSEFORExFOgorCQljYXNlIEJJTkRFUl9UWVBFX1dFQUtfSEFORExFOiB7CisJCQlzdHJ1Y3QgYmluZGVyX3JlZiAqcmVmID0gYmluZGVyX2dldF9yZWYocHJvYywgZnAtPmhhbmRsZSk7CisJCQlpZiAocmVmID09IE5VTEwpIHsKKwkJCQliaW5kZXJfdXNlcl9lcnJvcigiYmluZGVyOiAlZDolZCBnb3QgIgorCQkJCQkidHJhbnNhY3Rpb24gd2l0aCBpbnZhbGlkICIKKwkJCQkJImhhbmRsZSwgJWxkXG4iLCBwcm9jLT5waWQsCisJCQkJCXRocmVhZC0+cGlkLCBmcC0+aGFuZGxlKTsKKwkJCQlyZXR1cm5fZXJyb3IgPSBCUl9GQUlMRURfUkVQTFk7CisJCQkJZ290byBlcnJfYmluZGVyX2dldF9yZWZfZmFpbGVkOworCQkJfQorCQkJaWYgKHJlZi0+bm9kZS0+cHJvYyA9PSB0YXJnZXRfcHJvYykgeworCQkJCWlmIChmcC0+dHlwZSA9PSBCSU5ERVJfVFlQRV9IQU5ETEUpCisJCQkJCWZwLT50eXBlID0gQklOREVSX1RZUEVfQklOREVSOworCQkJCWVsc2UKKwkJCQkJZnAtPnR5cGUgPSBCSU5ERVJfVFlQRV9XRUFLX0JJTkRFUjsKKwkJCQlmcC0+YmluZGVyID0gcmVmLT5ub2RlLT5wdHI7CisJCQkJZnAtPmNvb2tpZSA9IHJlZi0+bm9kZS0+Y29va2llOworCQkJCWJpbmRlcl9pbmNfbm9kZShyZWYtPm5vZGUsIGZwLT50eXBlID09IEJJTkRFUl9UWVBFX0JJTkRFUiwgMCwgTlVMTCk7CisJCQkJaWYgKGJpbmRlcl9kZWJ1Z19tYXNrICYgQklOREVSX0RFQlVHX1RSQU5TQUNUSU9OKQorCQkJCQlwcmludGsoS0VSTl9JTkZPICIgICAgICAgIHJlZiAlZCBkZXNjICVkIC0+IG5vZGUgJWQgdSVwXG4iLAorCQkJCQkgICAgICAgcmVmLT5kZWJ1Z19pZCwgcmVmLT5kZXNjLCByZWYtPm5vZGUtPmRlYnVnX2lkLCByZWYtPm5vZGUtPnB0cik7CisJCQl9IGVsc2UgeworCQkJCXN0cnVjdCBiaW5kZXJfcmVmICpuZXdfcmVmOworCQkJCW5ld19yZWYgPSBiaW5kZXJfZ2V0X3JlZl9mb3Jfbm9kZSh0YXJnZXRfcHJvYywgcmVmLT5ub2RlKTsKKwkJCQlpZiAobmV3X3JlZiA9PSBOVUxMKSB7CisJCQkJCXJldHVybl9lcnJvciA9IEJSX0ZBSUxFRF9SRVBMWTsKKwkJCQkJZ290byBlcnJfYmluZGVyX2dldF9yZWZfZm9yX25vZGVfZmFpbGVkOworCQkJCX0KKwkJCQlmcC0+aGFuZGxlID0gbmV3X3JlZi0+ZGVzYzsKKwkJCQliaW5kZXJfaW5jX3JlZihuZXdfcmVmLCBmcC0+dHlwZSA9PSBCSU5ERVJfVFlQRV9IQU5ETEUsIE5VTEwpOworCQkJCWlmIChiaW5kZXJfZGVidWdfbWFzayAmIEJJTkRFUl9ERUJVR19UUkFOU0FDVElPTikKKwkJCQkJcHJpbnRrKEtFUk5fSU5GTyAiICAgICAgICByZWYgJWQgZGVzYyAlZCAtPiByZWYgJWQgZGVzYyAlZCAobm9kZSAlZClcbiIsCisJCQkJCSAgICAgICByZWYtPmRlYnVnX2lkLCByZWYtPmRlc2MsIG5ld19yZWYtPmRlYnVnX2lkLCBuZXdfcmVmLT5kZXNjLCByZWYtPm5vZGUtPmRlYnVnX2lkKTsKKwkJCX0KKwkJfSBicmVhazsKKworCQljYXNlIEJJTkRFUl9UWVBFX0ZEOiB7CisJCQlpbnQgdGFyZ2V0X2ZkOworCQkJc3RydWN0IGZpbGUgKmZpbGU7CisKKwkJCWlmIChyZXBseSkgeworCQkJCWlmICghKGluX3JlcGx5X3RvLT5mbGFncyAmIFRGX0FDQ0VQVF9GRFMpKSB7CisJCQkJCWJpbmRlcl91c2VyX2Vycm9yKCJiaW5kZXI6ICVkOiVkIGdvdCByZXBseSB3aXRoIGZkLCAlbGQsIGJ1dCB0YXJnZXQgZG9lcyBub3QgYWxsb3cgZmRzXG4iLAorCQkJCQkJcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCwgZnAtPmhhbmRsZSk7CisJCQkJCXJldHVybl9lcnJvciA9IEJSX0ZBSUxFRF9SRVBMWTsKKwkJCQkJZ290byBlcnJfZmRfbm90X2FsbG93ZWQ7CisJCQkJfQorCQkJfSBlbHNlIGlmICghdGFyZ2V0X25vZGUtPmFjY2VwdF9mZHMpIHsKKwkJCQliaW5kZXJfdXNlcl9lcnJvcigiYmluZGVyOiAlZDolZCBnb3QgdHJhbnNhY3Rpb24gd2l0aCBmZCwgJWxkLCBidXQgdGFyZ2V0IGRvZXMgbm90IGFsbG93IGZkc1xuIiwKKwkJCQkJcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCwgZnAtPmhhbmRsZSk7CisJCQkJcmV0dXJuX2Vycm9yID0gQlJfRkFJTEVEX1JFUExZOworCQkJCWdvdG8gZXJyX2ZkX25vdF9hbGxvd2VkOworCQkJfQorCisJCQlmaWxlID0gZmdldChmcC0+aGFuZGxlKTsKKwkJCWlmIChmaWxlID09IE5VTEwpIHsKKwkJCQliaW5kZXJfdXNlcl9lcnJvcigiYmluZGVyOiAlZDolZCBnb3QgdHJhbnNhY3Rpb24gd2l0aCBpbnZhbGlkIGZkLCAlbGRcbiIsCisJCQkJCXByb2MtPnBpZCwgdGhyZWFkLT5waWQsIGZwLT5oYW5kbGUpOworCQkJCXJldHVybl9lcnJvciA9IEJSX0ZBSUxFRF9SRVBMWTsKKwkJCQlnb3RvIGVycl9mZ2V0X2ZhaWxlZDsKKwkJCX0KKwkJCXRhcmdldF9mZCA9IHRhc2tfZ2V0X3VudXNlZF9mZF9mbGFncyh0YXJnZXRfcHJvYy0+dHNrLCBPX0NMT0VYRUMpOworCQkJaWYgKHRhcmdldF9mZCA8IDApIHsKKwkJCQlmcHV0KGZpbGUpOworCQkJCXJldHVybl9lcnJvciA9IEJSX0ZBSUxFRF9SRVBMWTsKKwkJCQlnb3RvIGVycl9nZXRfdW51c2VkX2ZkX2ZhaWxlZDsKKwkJCX0KKwkJCXRhc2tfZmRfaW5zdGFsbCh0YXJnZXRfcHJvYy0+dHNrLCB0YXJnZXRfZmQsIGZpbGUpOworCQkJaWYgKGJpbmRlcl9kZWJ1Z19tYXNrICYgQklOREVSX0RFQlVHX1RSQU5TQUNUSU9OKQorCQkJCXByaW50ayhLRVJOX0lORk8gIiAgICAgICAgZmQgJWxkIC0+ICVkXG4iLCBmcC0+aGFuZGxlLCB0YXJnZXRfZmQpOworCQkJLyogVE9ETzogZnB1dD8gKi8KKwkJCWZwLT5oYW5kbGUgPSB0YXJnZXRfZmQ7CisJCX0gYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWJpbmRlcl91c2VyX2Vycm9yKCJiaW5kZXI6ICVkOiVkIGdvdCB0cmFuc2FjdGlvIgorCQkJCSJuIHdpdGggaW52YWxpZCBvYmplY3QgdHlwZSwgJWx4XG4iLAorCQkJCXByb2MtPnBpZCwgdGhyZWFkLT5waWQsIGZwLT50eXBlKTsKKwkJCXJldHVybl9lcnJvciA9IEJSX0ZBSUxFRF9SRVBMWTsKKwkJCWdvdG8gZXJyX2JhZF9vYmplY3RfdHlwZTsKKwkJfQorCX0KKwlpZiAocmVwbHkpIHsKKwkJQlVHX09OKHQtPmJ1ZmZlci0+YXN5bmNfdHJhbnNhY3Rpb24gIT0gMCk7CisJCWJpbmRlcl9wb3BfdHJhbnNhY3Rpb24odGFyZ2V0X3RocmVhZCwgaW5fcmVwbHlfdG8pOworCX0gZWxzZSBpZiAoISh0LT5mbGFncyAmIFRGX09ORV9XQVkpKSB7CisJCUJVR19PTih0LT5idWZmZXItPmFzeW5jX3RyYW5zYWN0aW9uICE9IDApOworCQl0LT5uZWVkX3JlcGx5ID0gMTsKKwkJdC0+ZnJvbV9wYXJlbnQgPSB0aHJlYWQtPnRyYW5zYWN0aW9uX3N0YWNrOworCQl0aHJlYWQtPnRyYW5zYWN0aW9uX3N0YWNrID0gdDsKKwl9IGVsc2UgeworCQlCVUdfT04odGFyZ2V0X25vZGUgPT0gTlVMTCk7CisJCUJVR19PTih0LT5idWZmZXItPmFzeW5jX3RyYW5zYWN0aW9uICE9IDEpOworCQlpZiAodGFyZ2V0X25vZGUtPmhhc19hc3luY190cmFuc2FjdGlvbikgeworCQkJdGFyZ2V0X2xpc3QgPSAmdGFyZ2V0X25vZGUtPmFzeW5jX3RvZG87CisJCQl0YXJnZXRfd2FpdCA9IE5VTEw7CisJCX0gZWxzZQorCQkJdGFyZ2V0X25vZGUtPmhhc19hc3luY190cmFuc2FjdGlvbiA9IDE7CisJfQorCXQtPndvcmsudHlwZSA9IEJJTkRFUl9XT1JLX1RSQU5TQUNUSU9OOworCWxpc3RfYWRkX3RhaWwoJnQtPndvcmsuZW50cnksIHRhcmdldF9saXN0KTsKKwl0Y29tcGxldGUtPnR5cGUgPSBCSU5ERVJfV09SS19UUkFOU0FDVElPTl9DT01QTEVURTsKKwlsaXN0X2FkZF90YWlsKCZ0Y29tcGxldGUtPmVudHJ5LCAmdGhyZWFkLT50b2RvKTsKKwlpZiAodGFyZ2V0X3dhaXQpCisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSh0YXJnZXRfd2FpdCk7CisJcmV0dXJuOworCitlcnJfZ2V0X3VudXNlZF9mZF9mYWlsZWQ6CitlcnJfZmdldF9mYWlsZWQ6CitlcnJfZmRfbm90X2FsbG93ZWQ6CitlcnJfYmluZGVyX2dldF9yZWZfZm9yX25vZGVfZmFpbGVkOgorZXJyX2JpbmRlcl9nZXRfcmVmX2ZhaWxlZDoKK2Vycl9iaW5kZXJfbmV3X25vZGVfZmFpbGVkOgorZXJyX2JhZF9vYmplY3RfdHlwZToKK2Vycl9iYWRfb2Zmc2V0OgorZXJyX2NvcHlfZGF0YV9mYWlsZWQ6CisJYmluZGVyX3RyYW5zYWN0aW9uX2J1ZmZlcl9yZWxlYXNlKHRhcmdldF9wcm9jLCB0LT5idWZmZXIsIG9mZnApOworCXQtPmJ1ZmZlci0+dHJhbnNhY3Rpb24gPSBOVUxMOworCWJpbmRlcl9mcmVlX2J1Zih0YXJnZXRfcHJvYywgdC0+YnVmZmVyKTsKK2Vycl9iaW5kZXJfYWxsb2NfYnVmX2ZhaWxlZDoKKwlrZnJlZSh0Y29tcGxldGUpOworCWJpbmRlcl9zdGF0cy5vYmpfZGVsZXRlZFtCSU5ERVJfU1RBVF9UUkFOU0FDVElPTl9DT01QTEVURV0rKzsKK2Vycl9hbGxvY190Y29tcGxldGVfZmFpbGVkOgorCWtmcmVlKHQpOworCWJpbmRlcl9zdGF0cy5vYmpfZGVsZXRlZFtCSU5ERVJfU1RBVF9UUkFOU0FDVElPTl0rKzsKK2Vycl9hbGxvY190X2ZhaWxlZDoKK2Vycl9iYWRfY2FsbF9zdGFjazoKK2Vycl9lbXB0eV9jYWxsX3N0YWNrOgorZXJyX2RlYWRfYmluZGVyOgorZXJyX2ludmFsaWRfdGFyZ2V0X2hhbmRsZToKK2Vycl9ub19jb250ZXh0X21ncl9ub2RlOgorCWlmIChiaW5kZXJfZGVidWdfbWFzayAmIEJJTkRFUl9ERUJVR19GQUlMRURfVFJBTlNBQ1RJT04pCisJCXByaW50ayhLRVJOX0lORk8gImJpbmRlcjogJWQ6JWQgdHJhbnNhY3Rpb24gZmFpbGVkICVkLCBzaXplIgorCQkJCSIlemQtJXpkXG4iLAorCQkJICAgcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCwgcmV0dXJuX2Vycm9yLAorCQkJICAgdHItPmRhdGFfc2l6ZSwgdHItPm9mZnNldHNfc2l6ZSk7CisKKwl7CisJCXN0cnVjdCBiaW5kZXJfdHJhbnNhY3Rpb25fbG9nX2VudHJ5ICpmZTsKKwkJZmUgPSBiaW5kZXJfdHJhbnNhY3Rpb25fbG9nX2FkZCgmYmluZGVyX3RyYW5zYWN0aW9uX2xvZ19mYWlsZWQpOworCQkqZmUgPSAqZTsKKwl9CisKKwlCVUdfT04odGhyZWFkLT5yZXR1cm5fZXJyb3IgIT0gQlJfT0spOworCWlmIChpbl9yZXBseV90bykgeworCQl0aHJlYWQtPnJldHVybl9lcnJvciA9IEJSX1RSQU5TQUNUSU9OX0NPTVBMRVRFOworCQliaW5kZXJfc2VuZF9mYWlsZWRfcmVwbHkoaW5fcmVwbHlfdG8sIHJldHVybl9lcnJvcik7CisJfSBlbHNlCisJCXRocmVhZC0+cmV0dXJuX2Vycm9yID0gcmV0dXJuX2Vycm9yOworfQorCitzdGF0aWMgdm9pZAorYmluZGVyX3RyYW5zYWN0aW9uX2J1ZmZlcl9yZWxlYXNlKHN0cnVjdCBiaW5kZXJfcHJvYyAqcHJvYywgc3RydWN0IGJpbmRlcl9idWZmZXIgKmJ1ZmZlciwgc2l6ZV90ICpmYWlsZWRfYXQpCit7CisJc2l6ZV90ICpvZmZwLCAqb2ZmX2VuZDsKKwlpbnQgZGVidWdfaWQgPSBidWZmZXItPmRlYnVnX2lkOworCisJaWYgKGJpbmRlcl9kZWJ1Z19tYXNrICYgQklOREVSX0RFQlVHX1RSQU5TQUNUSU9OKQorCQlwcmludGsoS0VSTl9JTkZPICJiaW5kZXI6ICVkIGJ1ZmZlciByZWxlYXNlICVkLCBzaXplICV6ZC0lemQsIGZhaWxlZCBhdCAlcFxuIiwKKwkJCSAgIHByb2MtPnBpZCwgYnVmZmVyLT5kZWJ1Z19pZCwKKwkJCSAgIGJ1ZmZlci0+ZGF0YV9zaXplLCBidWZmZXItPm9mZnNldHNfc2l6ZSwgZmFpbGVkX2F0KTsKKworCWlmIChidWZmZXItPnRhcmdldF9ub2RlKQorCQliaW5kZXJfZGVjX25vZGUoYnVmZmVyLT50YXJnZXRfbm9kZSwgMSwgMCk7CisKKwlvZmZwID0gKHNpemVfdCAqKShidWZmZXItPmRhdGEgKyBBTElHTihidWZmZXItPmRhdGFfc2l6ZSwgc2l6ZW9mKHZvaWQgKikpKTsKKwlpZiAoZmFpbGVkX2F0KQorCQlvZmZfZW5kID0gZmFpbGVkX2F0OworCWVsc2UKKwkJb2ZmX2VuZCA9ICh2b2lkICopb2ZmcCArIGJ1ZmZlci0+b2Zmc2V0c19zaXplOworCWZvciAoOyBvZmZwIDwgb2ZmX2VuZDsgb2ZmcCsrKSB7CisJCXN0cnVjdCBmbGF0X2JpbmRlcl9vYmplY3QgKmZwOworCQlpZiAoKm9mZnAgPiBidWZmZXItPmRhdGFfc2l6ZSAtIHNpemVvZigqZnApKSB7CisJCQlwcmludGsoS0VSTl9FUlIgImJpbmRlcjogdHJhbnNhY3Rpb24gcmVsZWFzZSAlZCBiYWQiCisJCQkJCSJvZmZzZXQgJXpkLCBzaXplICV6ZFxuIiwgZGVidWdfaWQsICpvZmZwLCBidWZmZXItPmRhdGFfc2l6ZSk7CisJCQljb250aW51ZTsKKwkJfQorCQlmcCA9IChzdHJ1Y3QgZmxhdF9iaW5kZXJfb2JqZWN0ICopKGJ1ZmZlci0+ZGF0YSArICpvZmZwKTsKKwkJc3dpdGNoIChmcC0+dHlwZSkgeworCQljYXNlIEJJTkRFUl9UWVBFX0JJTkRFUjoKKwkJY2FzZSBCSU5ERVJfVFlQRV9XRUFLX0JJTkRFUjogeworCQkJc3RydWN0IGJpbmRlcl9ub2RlICpub2RlID0gYmluZGVyX2dldF9ub2RlKHByb2MsIGZwLT5iaW5kZXIpOworCQkJaWYgKG5vZGUgPT0gTlVMTCkgeworCQkJCXByaW50ayhLRVJOX0VSUiAiYmluZGVyOiB0cmFuc2FjdGlvbiByZWxlYXNlICVkIGJhZCBub2RlICVwXG4iLCBkZWJ1Z19pZCwgZnAtPmJpbmRlcik7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoYmluZGVyX2RlYnVnX21hc2sgJiBCSU5ERVJfREVCVUdfVFJBTlNBQ1RJT04pCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiICAgICAgICBub2RlICVkIHUlcFxuIiwKKwkJCQkgICAgICAgbm9kZS0+ZGVidWdfaWQsIG5vZGUtPnB0cik7CisJCQliaW5kZXJfZGVjX25vZGUobm9kZSwgZnAtPnR5cGUgPT0gQklOREVSX1RZUEVfQklOREVSLCAwKTsKKwkJfSBicmVhazsKKwkJY2FzZSBCSU5ERVJfVFlQRV9IQU5ETEU6CisJCWNhc2UgQklOREVSX1RZUEVfV0VBS19IQU5ETEU6IHsKKwkJCXN0cnVjdCBiaW5kZXJfcmVmICpyZWYgPSBiaW5kZXJfZ2V0X3JlZihwcm9jLCBmcC0+aGFuZGxlKTsKKwkJCWlmIChyZWYgPT0gTlVMTCkgeworCQkJCXByaW50ayhLRVJOX0VSUiAiYmluZGVyOiB0cmFuc2FjdGlvbiByZWxlYXNlICVkIGJhZCBoYW5kbGUgJWxkXG4iLCBkZWJ1Z19pZCwgZnAtPmhhbmRsZSk7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoYmluZGVyX2RlYnVnX21hc2sgJiBCSU5ERVJfREVCVUdfVFJBTlNBQ1RJT04pCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiICAgICAgICByZWYgJWQgZGVzYyAlZCAobm9kZSAlZClcbiIsCisJCQkJICAgICAgIHJlZi0+ZGVidWdfaWQsIHJlZi0+ZGVzYywgcmVmLT5ub2RlLT5kZWJ1Z19pZCk7CisJCQliaW5kZXJfZGVjX3JlZihyZWYsIGZwLT50eXBlID09IEJJTkRFUl9UWVBFX0hBTkRMRSk7CisJCX0gYnJlYWs7CisKKwkJY2FzZSBCSU5ERVJfVFlQRV9GRDoKKwkJCWlmIChiaW5kZXJfZGVidWdfbWFzayAmIEJJTkRFUl9ERUJVR19UUkFOU0FDVElPTikKKwkJCQlwcmludGsoS0VSTl9JTkZPICIgICAgICAgIGZkICVsZFxuIiwgZnAtPmhhbmRsZSk7CisJCQlpZiAoZmFpbGVkX2F0KQorCQkJCXRhc2tfY2xvc2VfZmQocHJvYy0+dHNrLCBmcC0+aGFuZGxlKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlwcmludGsoS0VSTl9FUlIgImJpbmRlcjogdHJhbnNhY3Rpb24gcmVsZWFzZSAlZCBiYWQgb2JqZWN0IHR5cGUgJWx4XG4iLCBkZWJ1Z19pZCwgZnAtPnR5cGUpOworCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKK2ludAorYmluZGVyX3RocmVhZF93cml0ZShzdHJ1Y3QgYmluZGVyX3Byb2MgKnByb2MsIHN0cnVjdCBiaW5kZXJfdGhyZWFkICp0aHJlYWQsCisJCSAgICB2b2lkIF9fdXNlciAqYnVmZmVyLCBpbnQgc2l6ZSwgc2lnbmVkIGxvbmcgKmNvbnN1bWVkKQoreworCXVpbnQzMl90IGNtZDsKKwl2b2lkIF9fdXNlciAqcHRyID0gYnVmZmVyICsgKmNvbnN1bWVkOworCXZvaWQgX191c2VyICplbmQgPSBidWZmZXIgKyBzaXplOworCisJd2hpbGUgKHB0ciA8IGVuZCAmJiB0aHJlYWQtPnJldHVybl9lcnJvciA9PSBCUl9PSykgeworCQlpZiAoZ2V0X3VzZXIoY21kLCAodWludDMyX3QgX191c2VyICopcHRyKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlwdHIgKz0gc2l6ZW9mKHVpbnQzMl90KTsKKwkJaWYgKF9JT0NfTlIoY21kKSA8IEFSUkFZX1NJWkUoYmluZGVyX3N0YXRzLmJjKSkgeworCQkJYmluZGVyX3N0YXRzLmJjW19JT0NfTlIoY21kKV0rKzsKKwkJCXByb2MtPnN0YXRzLmJjW19JT0NfTlIoY21kKV0rKzsKKwkJCXRocmVhZC0+c3RhdHMuYmNbX0lPQ19OUihjbWQpXSsrOworCQl9CisJCXN3aXRjaCAoY21kKSB7CisJCWNhc2UgQkNfSU5DUkVGUzoKKwkJY2FzZSBCQ19BQ1FVSVJFOgorCQljYXNlIEJDX1JFTEVBU0U6CisJCWNhc2UgQkNfREVDUkVGUzogeworCQkJdWludDMyX3QgdGFyZ2V0OworCQkJc3RydWN0IGJpbmRlcl9yZWYgKnJlZjsKKwkJCWNvbnN0IGNoYXIgKmRlYnVnX3N0cmluZzsKKworCQkJaWYgKGdldF91c2VyKHRhcmdldCwgKHVpbnQzMl90IF9fdXNlciAqKXB0cikpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlwdHIgKz0gc2l6ZW9mKHVpbnQzMl90KTsKKwkJCWlmICh0YXJnZXQgPT0gMCAmJiBiaW5kZXJfY29udGV4dF9tZ3Jfbm9kZSAmJgorCQkJICAgIChjbWQgPT0gQkNfSU5DUkVGUyB8fCBjbWQgPT0gQkNfQUNRVUlSRSkpIHsKKwkJCQlyZWYgPSBiaW5kZXJfZ2V0X3JlZl9mb3Jfbm9kZShwcm9jLAorCQkJCQkgICAgICAgYmluZGVyX2NvbnRleHRfbWdyX25vZGUpOworCQkJCWlmIChyZWYtPmRlc2MgIT0gdGFyZ2V0KSB7CisJCQkJCWJpbmRlcl91c2VyX2Vycm9yKCJiaW5kZXI6ICVkOiIKKwkJCQkJCSIlZCB0cmllZCB0byBhY3F1aXJlICIKKwkJCQkJCSJyZWZlcmVuY2UgdG8gZGVzYyAwLCAiCisJCQkJCQkiZ290ICVkIGluc3RlYWRcbiIsCisJCQkJCQlwcm9jLT5waWQsIHRocmVhZC0+cGlkLAorCQkJCQkJcmVmLT5kZXNjKTsKKwkJCQl9CisJCQl9IGVsc2UKKwkJCQlyZWYgPSBiaW5kZXJfZ2V0X3JlZihwcm9jLCB0YXJnZXQpOworCQkJaWYgKHJlZiA9PSBOVUxMKSB7CisJCQkJYmluZGVyX3VzZXJfZXJyb3IoImJpbmRlcjogJWQ6JWQgcmVmY291IgorCQkJCQkibnQgY2hhbmdlIG9uIGludmFsaWQgcmVmICVkXG4iLAorCQkJCQlwcm9jLT5waWQsIHRocmVhZC0+cGlkLCB0YXJnZXQpOworCQkJCWJyZWFrOworCQkJfQorCQkJc3dpdGNoIChjbWQpIHsKKwkJCWNhc2UgQkNfSU5DUkVGUzoKKwkJCQlkZWJ1Z19zdHJpbmcgPSAiSW5jUmVmcyI7CisJCQkJYmluZGVyX2luY19yZWYocmVmLCAwLCBOVUxMKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgQkNfQUNRVUlSRToKKwkJCQlkZWJ1Z19zdHJpbmcgPSAiQWNxdWlyZSI7CisJCQkJYmluZGVyX2luY19yZWYocmVmLCAxLCBOVUxMKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgQkNfUkVMRUFTRToKKwkJCQlkZWJ1Z19zdHJpbmcgPSAiUmVsZWFzZSI7CisJCQkJYmluZGVyX2RlY19yZWYocmVmLCAxKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgQkNfREVDUkVGUzoKKwkJCWRlZmF1bHQ6CisJCQkJZGVidWdfc3RyaW5nID0gIkRlY1JlZnMiOworCQkJCWJpbmRlcl9kZWNfcmVmKHJlZiwgMCk7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoYmluZGVyX2RlYnVnX21hc2sgJiBCSU5ERVJfREVCVUdfVVNFUl9SRUZTKQorCQkJCXByaW50ayhLRVJOX0lORk8gImJpbmRlcjogJWQ6JWQgJXMgcmVmICVkIGRlc2MgJWQgcyAlZCB3ICVkIGZvciBub2RlICVkXG4iLAorCQkJCSAgICAgICBwcm9jLT5waWQsIHRocmVhZC0+cGlkLCBkZWJ1Z19zdHJpbmcsIHJlZi0+ZGVidWdfaWQsIHJlZi0+ZGVzYywgcmVmLT5zdHJvbmcsIHJlZi0+d2VhaywgcmVmLT5ub2RlLT5kZWJ1Z19pZCk7CisJCQlicmVhazsKKwkJfQorCQljYXNlIEJDX0lOQ1JFRlNfRE9ORToKKwkJY2FzZSBCQ19BQ1FVSVJFX0RPTkU6IHsKKwkJCXZvaWQgX191c2VyICpub2RlX3B0cjsKKwkJCXZvaWQgKmNvb2tpZTsKKwkJCXN0cnVjdCBiaW5kZXJfbm9kZSAqbm9kZTsKKworCQkJaWYgKGdldF91c2VyKG5vZGVfcHRyLCAodm9pZCAqIF9fdXNlciAqKXB0cikpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlwdHIgKz0gc2l6ZW9mKHZvaWQgKik7CisJCQlpZiAoZ2V0X3VzZXIoY29va2llLCAodm9pZCAqIF9fdXNlciAqKXB0cikpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlwdHIgKz0gc2l6ZW9mKHZvaWQgKik7CisJCQlub2RlID0gYmluZGVyX2dldF9ub2RlKHByb2MsIG5vZGVfcHRyKTsKKwkJCWlmIChub2RlID09IE5VTEwpIHsKKwkJCQliaW5kZXJfdXNlcl9lcnJvcigiYmluZGVyOiAlZDolZCAiCisJCQkJCSIlcyB1JXAgbm8gbWF0Y2hcbiIsCisJCQkJCXByb2MtPnBpZCwgdGhyZWFkLT5waWQsCisJCQkJCWNtZCA9PSBCQ19JTkNSRUZTX0RPTkUgPworCQkJCQkiQkNfSU5DUkVGU19ET05FIiA6CisJCQkJCSJCQ19BQ1FVSVJFX0RPTkUiLAorCQkJCQlub2RlX3B0cik7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoY29va2llICE9IG5vZGUtPmNvb2tpZSkgeworCQkJCWJpbmRlcl91c2VyX2Vycm9yKCJiaW5kZXI6ICVkOiVkICVzIHUlcCBub2RlICVkIgorCQkJCQkiIGNvb2tpZSBtaXNtYXRjaCAlcCAhPSAlcFxuIiwKKwkJCQkJcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCwKKwkJCQkJY21kID09IEJDX0lOQ1JFRlNfRE9ORSA/CisJCQkJCSJCQ19JTkNSRUZTX0RPTkUiIDogIkJDX0FDUVVJUkVfRE9ORSIsCisJCQkJCW5vZGVfcHRyLCBub2RlLT5kZWJ1Z19pZCwKKwkJCQkJY29va2llLCBub2RlLT5jb29raWUpOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKGNtZCA9PSBCQ19BQ1FVSVJFX0RPTkUpIHsKKwkJCQlpZiAobm9kZS0+cGVuZGluZ19zdHJvbmdfcmVmID09IDApIHsKKwkJCQkJYmluZGVyX3VzZXJfZXJyb3IoImJpbmRlcjogJWQ6JWQgIgorCQkJCQkJIkJDX0FDUVVJUkVfRE9ORSBub2RlICVkIGhhcyAiCisJCQkJCQkibm8gcGVuZGluZyBhY3F1aXJlIHJlcXVlc3RcbiIsCisJCQkJCQlwcm9jLT5waWQsIHRocmVhZC0+cGlkLAorCQkJCQkJbm9kZS0+ZGVidWdfaWQpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJbm9kZS0+cGVuZGluZ19zdHJvbmdfcmVmID0gMDsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKG5vZGUtPnBlbmRpbmdfd2Vha19yZWYgPT0gMCkgeworCQkJCQliaW5kZXJfdXNlcl9lcnJvcigiYmluZGVyOiAlZDolZCAiCisJCQkJCQkiQkNfSU5DUkVGU19ET05FIG5vZGUgJWQgaGFzICIKKwkJCQkJCSJubyBwZW5kaW5nIGluY3JlZnMgcmVxdWVzdFxuIiwKKwkJCQkJCXByb2MtPnBpZCwgdGhyZWFkLT5waWQsCisJCQkJCQlub2RlLT5kZWJ1Z19pZCk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlub2RlLT5wZW5kaW5nX3dlYWtfcmVmID0gMDsKKwkJCX0KKwkJCWJpbmRlcl9kZWNfbm9kZShub2RlLCBjbWQgPT0gQkNfQUNRVUlSRV9ET05FLCAwKTsKKwkJCWlmIChiaW5kZXJfZGVidWdfbWFzayAmIEJJTkRFUl9ERUJVR19VU0VSX1JFRlMpCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiYmluZGVyOiAlZDolZCAlcyBub2RlICVkIGxzICVkIGx3ICVkXG4iLAorCQkJCSAgICAgICBwcm9jLT5waWQsIHRocmVhZC0+cGlkLCBjbWQgPT0gQkNfSU5DUkVGU19ET05FID8gIkJDX0lOQ1JFRlNfRE9ORSIgOiAiQkNfQUNRVUlSRV9ET05FIiwgbm9kZS0+ZGVidWdfaWQsIG5vZGUtPmxvY2FsX3N0cm9uZ19yZWZzLCBub2RlLT5sb2NhbF93ZWFrX3JlZnMpOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBCQ19BVFRFTVBUX0FDUVVJUkU6CisJCQlwcmludGsoS0VSTl9FUlIgImJpbmRlcjogQkNfQVRURU1QVF9BQ1FVSVJFIG5vdCBzdXBwb3J0ZWRcbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCWNhc2UgQkNfQUNRVUlSRV9SRVNVTFQ6CisJCQlwcmludGsoS0VSTl9FUlIgImJpbmRlcjogQkNfQUNRVUlSRV9SRVNVTFQgbm90IHN1cHBvcnRlZFxuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQljYXNlIEJDX0ZSRUVfQlVGRkVSOiB7CisJCQl2b2lkIF9fdXNlciAqZGF0YV9wdHI7CisJCQlzdHJ1Y3QgYmluZGVyX2J1ZmZlciAqYnVmZmVyOworCisJCQlpZiAoZ2V0X3VzZXIoZGF0YV9wdHIsICh2b2lkICogX191c2VyICopcHRyKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCXB0ciArPSBzaXplb2Yodm9pZCAqKTsKKworCQkJYnVmZmVyID0gYmluZGVyX2J1ZmZlcl9sb29rdXAocHJvYywgZGF0YV9wdHIpOworCQkJaWYgKGJ1ZmZlciA9PSBOVUxMKSB7CisJCQkJYmluZGVyX3VzZXJfZXJyb3IoImJpbmRlcjogJWQ6JWQgIgorCQkJCQkiQkNfRlJFRV9CVUZGRVIgdSVwIG5vIG1hdGNoXG4iLAorCQkJCQlwcm9jLT5waWQsIHRocmVhZC0+cGlkLCBkYXRhX3B0cik7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoIWJ1ZmZlci0+YWxsb3dfdXNlcl9mcmVlKSB7CisJCQkJYmluZGVyX3VzZXJfZXJyb3IoImJpbmRlcjogJWQ6JWQgIgorCQkJCQkiQkNfRlJFRV9CVUZGRVIgdSVwIG1hdGNoZWQgIgorCQkJCQkidW5yZXR1cm5lZCBidWZmZXJcbiIsCisJCQkJCXByb2MtPnBpZCwgdGhyZWFkLT5waWQsIGRhdGFfcHRyKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChiaW5kZXJfZGVidWdfbWFzayAmIEJJTkRFUl9ERUJVR19GUkVFX0JVRkZFUikKKwkJCQlwcmludGsoS0VSTl9JTkZPICJiaW5kZXI6ICVkOiVkIEJDX0ZSRUVfQlVGRkVSIHUlcCBmb3VuZCBidWZmZXIgJWQgZm9yICVzIHRyYW5zYWN0aW9uXG4iLAorCQkJCSAgICAgICBwcm9jLT5waWQsIHRocmVhZC0+cGlkLCBkYXRhX3B0ciwgYnVmZmVyLT5kZWJ1Z19pZCwKKwkJCQkgICAgICAgYnVmZmVyLT50cmFuc2FjdGlvbiA/ICJhY3RpdmUiIDogImZpbmlzaGVkIik7CisKKwkJCWlmIChidWZmZXItPnRyYW5zYWN0aW9uKSB7CisJCQkJYnVmZmVyLT50cmFuc2FjdGlvbi0+YnVmZmVyID0gTlVMTDsKKwkJCQlidWZmZXItPnRyYW5zYWN0aW9uID0gTlVMTDsKKwkJCX0KKwkJCWlmIChidWZmZXItPmFzeW5jX3RyYW5zYWN0aW9uICYmIGJ1ZmZlci0+dGFyZ2V0X25vZGUpIHsKKwkJCQlCVUdfT04oIWJ1ZmZlci0+dGFyZ2V0X25vZGUtPmhhc19hc3luY190cmFuc2FjdGlvbik7CisJCQkJaWYgKGxpc3RfZW1wdHkoJmJ1ZmZlci0+dGFyZ2V0X25vZGUtPmFzeW5jX3RvZG8pKQorCQkJCQlidWZmZXItPnRhcmdldF9ub2RlLT5oYXNfYXN5bmNfdHJhbnNhY3Rpb24gPSAwOworCQkJCWVsc2UKKwkJCQkJbGlzdF9tb3ZlX3RhaWwoYnVmZmVyLT50YXJnZXRfbm9kZS0+YXN5bmNfdG9kby5uZXh0LCAmdGhyZWFkLT50b2RvKTsKKwkJCX0KKwkJCWJpbmRlcl90cmFuc2FjdGlvbl9idWZmZXJfcmVsZWFzZShwcm9jLCBidWZmZXIsIE5VTEwpOworCQkJYmluZGVyX2ZyZWVfYnVmKHByb2MsIGJ1ZmZlcik7CisJCQlicmVhazsKKwkJfQorCisJCWNhc2UgQkNfVFJBTlNBQ1RJT046CisJCWNhc2UgQkNfUkVQTFk6IHsKKwkJCXN0cnVjdCBiaW5kZXJfdHJhbnNhY3Rpb25fZGF0YSB0cjsKKworCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZ0ciwgcHRyLCBzaXplb2YodHIpKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCXB0ciArPSBzaXplb2YodHIpOworCQkJYmluZGVyX3RyYW5zYWN0aW9uKHByb2MsIHRocmVhZCwgJnRyLCBjbWQgPT0gQkNfUkVQTFkpOworCQkJYnJlYWs7CisJCX0KKworCQljYXNlIEJDX1JFR0lTVEVSX0xPT1BFUjoKKwkJCWlmIChiaW5kZXJfZGVidWdfbWFzayAmIEJJTkRFUl9ERUJVR19USFJFQURTKQorCQkJCXByaW50ayhLRVJOX0lORk8gImJpbmRlcjogJWQ6JWQgQkNfUkVHSVNURVJfTE9PUEVSXG4iLAorCQkJCSAgICAgICBwcm9jLT5waWQsIHRocmVhZC0+cGlkKTsKKwkJCWlmICh0aHJlYWQtPmxvb3BlciAmIEJJTkRFUl9MT09QRVJfU1RBVEVfRU5URVJFRCkgeworCQkJCXRocmVhZC0+bG9vcGVyIHw9IEJJTkRFUl9MT09QRVJfU1RBVEVfSU5WQUxJRDsKKwkJCQliaW5kZXJfdXNlcl9lcnJvcigiYmluZGVyOiAlZDolZCBFUlJPUjoiCisJCQkJCSIgQkNfUkVHSVNURVJfTE9PUEVSIGNhbGxlZCAiCisJCQkJCSJhZnRlciBCQ19FTlRFUl9MT09QRVJcbiIsCisJCQkJCXByb2MtPnBpZCwgdGhyZWFkLT5waWQpOworCQkJfSBlbHNlIGlmIChwcm9jLT5yZXF1ZXN0ZWRfdGhyZWFkcyA9PSAwKSB7CisJCQkJdGhyZWFkLT5sb29wZXIgfD0gQklOREVSX0xPT1BFUl9TVEFURV9JTlZBTElEOworCQkJCWJpbmRlcl91c2VyX2Vycm9yKCJiaW5kZXI6ICVkOiVkIEVSUk9SOiIKKwkJCQkJIiBCQ19SRUdJU1RFUl9MT09QRVIgY2FsbGVkICIKKwkJCQkJIndpdGhvdXQgcmVxdWVzdFxuIiwKKwkJCQkJcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCk7CisJCQl9IGVsc2UgeworCQkJCXByb2MtPnJlcXVlc3RlZF90aHJlYWRzLS07CisJCQkJcHJvYy0+cmVxdWVzdGVkX3RocmVhZHNfc3RhcnRlZCsrOworCQkJfQorCQkJdGhyZWFkLT5sb29wZXIgfD0gQklOREVSX0xPT1BFUl9TVEFURV9SRUdJU1RFUkVEOworCQkJYnJlYWs7CisJCWNhc2UgQkNfRU5URVJfTE9PUEVSOgorCQkJaWYgKGJpbmRlcl9kZWJ1Z19tYXNrICYgQklOREVSX0RFQlVHX1RIUkVBRFMpCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiYmluZGVyOiAlZDolZCBCQ19FTlRFUl9MT09QRVJcbiIsCisJCQkJICAgICAgIHByb2MtPnBpZCwgdGhyZWFkLT5waWQpOworCQkJaWYgKHRocmVhZC0+bG9vcGVyICYgQklOREVSX0xPT1BFUl9TVEFURV9SRUdJU1RFUkVEKSB7CisJCQkJdGhyZWFkLT5sb29wZXIgfD0gQklOREVSX0xPT1BFUl9TVEFURV9JTlZBTElEOworCQkJCWJpbmRlcl91c2VyX2Vycm9yKCJiaW5kZXI6ICVkOiVkIEVSUk9SOiIKKwkJCQkJIiBCQ19FTlRFUl9MT09QRVIgY2FsbGVkIGFmdGVyICIKKwkJCQkJIkJDX1JFR0lTVEVSX0xPT1BFUlxuIiwKKwkJCQkJcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCk7CisJCQl9CisJCQl0aHJlYWQtPmxvb3BlciB8PSBCSU5ERVJfTE9PUEVSX1NUQVRFX0VOVEVSRUQ7CisJCQlicmVhazsKKwkJY2FzZSBCQ19FWElUX0xPT1BFUjoKKwkJCWlmIChiaW5kZXJfZGVidWdfbWFzayAmIEJJTkRFUl9ERUJVR19USFJFQURTKQorCQkJCXByaW50ayhLRVJOX0lORk8gImJpbmRlcjogJWQ6JWQgQkNfRVhJVF9MT09QRVJcbiIsCisJCQkJICAgICAgIHByb2MtPnBpZCwgdGhyZWFkLT5waWQpOworCQkJdGhyZWFkLT5sb29wZXIgfD0gQklOREVSX0xPT1BFUl9TVEFURV9FWElURUQ7CisJCQlicmVhazsKKworCQljYXNlIEJDX1JFUVVFU1RfREVBVEhfTk9USUZJQ0FUSU9OOgorCQljYXNlIEJDX0NMRUFSX0RFQVRIX05PVElGSUNBVElPTjogeworCQkJdWludDMyX3QgdGFyZ2V0OworCQkJdm9pZCBfX3VzZXIgKmNvb2tpZTsKKwkJCXN0cnVjdCBiaW5kZXJfcmVmICpyZWY7CisJCQlzdHJ1Y3QgYmluZGVyX3JlZl9kZWF0aCAqZGVhdGg7CisKKwkJCWlmIChnZXRfdXNlcih0YXJnZXQsICh1aW50MzJfdCBfX3VzZXIgKilwdHIpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJcHRyICs9IHNpemVvZih1aW50MzJfdCk7CisJCQlpZiAoZ2V0X3VzZXIoY29va2llLCAodm9pZCBfX3VzZXIgKiBfX3VzZXIgKilwdHIpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJcHRyICs9IHNpemVvZih2b2lkICopOworCQkJcmVmID0gYmluZGVyX2dldF9yZWYocHJvYywgdGFyZ2V0KTsKKwkJCWlmIChyZWYgPT0gTlVMTCkgeworCQkJCWJpbmRlcl91c2VyX2Vycm9yKCJiaW5kZXI6ICVkOiVkICVzICIKKwkJCQkJImludmFsaWQgcmVmICVkXG4iLAorCQkJCQlwcm9jLT5waWQsIHRocmVhZC0+cGlkLAorCQkJCQljbWQgPT0gQkNfUkVRVUVTVF9ERUFUSF9OT1RJRklDQVRJT04gPworCQkJCQkiQkNfUkVRVUVTVF9ERUFUSF9OT1RJRklDQVRJT04iIDoKKwkJCQkJIkJDX0NMRUFSX0RFQVRIX05PVElGSUNBVElPTiIsCisJCQkJCXRhcmdldCk7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWlmIChiaW5kZXJfZGVidWdfbWFzayAmIEJJTkRFUl9ERUJVR19ERUFUSF9OT1RJRklDQVRJT04pCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiYmluZGVyOiAlZDolZCAlcyAlcCByZWYgJWQgZGVzYyAlZCBzICVkIHcgJWQgZm9yIG5vZGUgJWRcbiIsCisJCQkJICAgICAgIHByb2MtPnBpZCwgdGhyZWFkLT5waWQsCisJCQkJICAgICAgIGNtZCA9PSBCQ19SRVFVRVNUX0RFQVRIX05PVElGSUNBVElPTiA/CisJCQkJICAgICAgICJCQ19SRVFVRVNUX0RFQVRIX05PVElGSUNBVElPTiIgOgorCQkJCSAgICAgICAiQkNfQ0xFQVJfREVBVEhfTk9USUZJQ0FUSU9OIiwKKwkJCQkgICAgICAgY29va2llLCByZWYtPmRlYnVnX2lkLCByZWYtPmRlc2MsCisJCQkJICAgICAgIHJlZi0+c3Ryb25nLCByZWYtPndlYWssIHJlZi0+bm9kZS0+ZGVidWdfaWQpOworCisJCQlpZiAoY21kID09IEJDX1JFUVVFU1RfREVBVEhfTk9USUZJQ0FUSU9OKSB7CisJCQkJaWYgKHJlZi0+ZGVhdGgpIHsKKwkJCQkJYmluZGVyX3VzZXJfZXJyb3IoImJpbmRlcjogJWQ6JSIKKwkJCQkJCSJkIEJDX1JFUVVFU1RfREVBVEhfTk9USSIKKwkJCQkJCSJGSUNBVElPTiBkZWF0aCBub3RpZmljIgorCQkJCQkJImF0aW9uIGFscmVhZHkgc2V0XG4iLAorCQkJCQkJcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlkZWF0aCA9IGt6YWxsb2Moc2l6ZW9mKCpkZWF0aCksIEdGUF9LRVJORUwpOworCQkJCWlmIChkZWF0aCA9PSBOVUxMKSB7CisJCQkJCXRocmVhZC0+cmV0dXJuX2Vycm9yID0gQlJfRVJST1I7CisJCQkJCWlmIChiaW5kZXJfZGVidWdfbWFzayAmIEJJTkRFUl9ERUJVR19GQUlMRURfVFJBTlNBQ1RJT04pCisJCQkJCQlwcmludGsoS0VSTl9JTkZPICJiaW5kZXI6ICVkOiVkICIKKwkJCQkJCQkiQkNfUkVRVUVTVF9ERUFUSF9OT1RJRklDQVRJT04gZmFpbGVkXG4iLAorCQkJCQkJCXByb2MtPnBpZCwgdGhyZWFkLT5waWQpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJYmluZGVyX3N0YXRzLm9ial9jcmVhdGVkW0JJTkRFUl9TVEFUX0RFQVRIXSsrOworCQkJCUlOSVRfTElTVF9IRUFEKCZkZWF0aC0+d29yay5lbnRyeSk7CisJCQkJZGVhdGgtPmNvb2tpZSA9IGNvb2tpZTsKKwkJCQlyZWYtPmRlYXRoID0gZGVhdGg7CisJCQkJaWYgKHJlZi0+bm9kZS0+cHJvYyA9PSBOVUxMKSB7CisJCQkJCXJlZi0+ZGVhdGgtPndvcmsudHlwZSA9IEJJTkRFUl9XT1JLX0RFQURfQklOREVSOworCQkJCQlpZiAodGhyZWFkLT5sb29wZXIgJiAoQklOREVSX0xPT1BFUl9TVEFURV9SRUdJU1RFUkVEIHwgQklOREVSX0xPT1BFUl9TVEFURV9FTlRFUkVEKSkgeworCQkJCQkJbGlzdF9hZGRfdGFpbCgmcmVmLT5kZWF0aC0+d29yay5lbnRyeSwgJnRocmVhZC0+dG9kbyk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlsaXN0X2FkZF90YWlsKCZyZWYtPmRlYXRoLT53b3JrLmVudHJ5LCAmcHJvYy0+dG9kbyk7CisJCQkJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnByb2MtPndhaXQpOworCQkJCQl9CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlpZiAocmVmLT5kZWF0aCA9PSBOVUxMKSB7CisJCQkJCWJpbmRlcl91c2VyX2Vycm9yKCJiaW5kZXI6ICVkOiUiCisJCQkJCQkiZCBCQ19DTEVBUl9ERUFUSF9OT1RJRkkiCisJCQkJCQkiQ0FUSU9OIGRlYXRoIG5vdGlmaWNhdCIKKwkJCQkJCSJpb24gbm90IGFjdGl2ZVxuIiwKKwkJCQkJCXByb2MtPnBpZCwgdGhyZWFkLT5waWQpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJZGVhdGggPSByZWYtPmRlYXRoOworCQkJCWlmIChkZWF0aC0+Y29va2llICE9IGNvb2tpZSkgeworCQkJCQliaW5kZXJfdXNlcl9lcnJvcigiYmluZGVyOiAlZDolIgorCQkJCQkJImQgQkNfQ0xFQVJfREVBVEhfTk9USUZJIgorCQkJCQkJIkNBVElPTiBkZWF0aCBub3RpZmljYXQiCisJCQkJCQkiaW9uIGNvb2tpZSBtaXNtYXRjaCAiCisJCQkJCQkiJXAgIT0gJXBcbiIsCisJCQkJCQlwcm9jLT5waWQsIHRocmVhZC0+cGlkLAorCQkJCQkJZGVhdGgtPmNvb2tpZSwgY29va2llKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCXJlZi0+ZGVhdGggPSBOVUxMOworCQkJCWlmIChsaXN0X2VtcHR5KCZkZWF0aC0+d29yay5lbnRyeSkpIHsKKwkJCQkJZGVhdGgtPndvcmsudHlwZSA9IEJJTkRFUl9XT1JLX0NMRUFSX0RFQVRIX05PVElGSUNBVElPTjsKKwkJCQkJaWYgKHRocmVhZC0+bG9vcGVyICYgKEJJTkRFUl9MT09QRVJfU1RBVEVfUkVHSVNURVJFRCB8IEJJTkRFUl9MT09QRVJfU1RBVEVfRU5URVJFRCkpIHsKKwkJCQkJCWxpc3RfYWRkX3RhaWwoJmRlYXRoLT53b3JrLmVudHJ5LCAmdGhyZWFkLT50b2RvKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWxpc3RfYWRkX3RhaWwoJmRlYXRoLT53b3JrLmVudHJ5LCAmcHJvYy0+dG9kbyk7CisJCQkJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnByb2MtPndhaXQpOworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJQlVHX09OKGRlYXRoLT53b3JrLnR5cGUgIT0gQklOREVSX1dPUktfREVBRF9CSU5ERVIpOworCQkJCQlkZWF0aC0+d29yay50eXBlID0gQklOREVSX1dPUktfREVBRF9CSU5ERVJfQU5EX0NMRUFSOworCQkJCX0KKwkJCX0KKwkJfSBicmVhazsKKwkJY2FzZSBCQ19ERUFEX0JJTkRFUl9ET05FOiB7CisJCQlzdHJ1Y3QgYmluZGVyX3dvcmsgKnc7CisJCQl2b2lkIF9fdXNlciAqY29va2llOworCQkJc3RydWN0IGJpbmRlcl9yZWZfZGVhdGggKmRlYXRoID0gTlVMTDsKKwkJCWlmIChnZXRfdXNlcihjb29raWUsICh2b2lkIF9fdXNlciAqIF9fdXNlciAqKXB0cikpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJCXB0ciArPSBzaXplb2Yodm9pZCAqKTsKKwkJCWxpc3RfZm9yX2VhY2hfZW50cnkodywgJnByb2MtPmRlbGl2ZXJlZF9kZWF0aCwgZW50cnkpIHsKKwkJCQlzdHJ1Y3QgYmluZGVyX3JlZl9kZWF0aCAqdG1wX2RlYXRoID0gY29udGFpbmVyX29mKHcsIHN0cnVjdCBiaW5kZXJfcmVmX2RlYXRoLCB3b3JrKTsKKwkJCQlpZiAodG1wX2RlYXRoLT5jb29raWUgPT0gY29va2llKSB7CisJCQkJCWRlYXRoID0gdG1wX2RlYXRoOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQlpZiAoYmluZGVyX2RlYnVnX21hc2sgJiBCSU5ERVJfREVCVUdfREVBRF9CSU5ERVIpCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiYmluZGVyOiAlZDolZCBCQ19ERUFEX0JJTkRFUl9ET05FICVwIGZvdW5kICVwXG4iLAorCQkJCSAgICAgICBwcm9jLT5waWQsIHRocmVhZC0+cGlkLCBjb29raWUsIGRlYXRoKTsKKwkJCWlmIChkZWF0aCA9PSBOVUxMKSB7CisJCQkJYmluZGVyX3VzZXJfZXJyb3IoImJpbmRlcjogJWQ6JWQgQkNfREVBRCIKKwkJCQkJIl9CSU5ERVJfRE9ORSAlcCBub3QgZm91bmRcbiIsCisJCQkJCXByb2MtPnBpZCwgdGhyZWFkLT5waWQsIGNvb2tpZSk7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWxpc3RfZGVsX2luaXQoJmRlYXRoLT53b3JrLmVudHJ5KTsKKwkJCWlmIChkZWF0aC0+d29yay50eXBlID09IEJJTkRFUl9XT1JLX0RFQURfQklOREVSX0FORF9DTEVBUikgeworCQkJCWRlYXRoLT53b3JrLnR5cGUgPSBCSU5ERVJfV09SS19DTEVBUl9ERUFUSF9OT1RJRklDQVRJT047CisJCQkJaWYgKHRocmVhZC0+bG9vcGVyICYgKEJJTkRFUl9MT09QRVJfU1RBVEVfUkVHSVNURVJFRCB8IEJJTkRFUl9MT09QRVJfU1RBVEVfRU5URVJFRCkpIHsKKwkJCQkJbGlzdF9hZGRfdGFpbCgmZGVhdGgtPndvcmsuZW50cnksICZ0aHJlYWQtPnRvZG8pOworCQkJCX0gZWxzZSB7CisJCQkJCWxpc3RfYWRkX3RhaWwoJmRlYXRoLT53b3JrLmVudHJ5LCAmcHJvYy0+dG9kbyk7CisJCQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcHJvYy0+d2FpdCk7CisJCQkJfQorCQkJfQorCQl9IGJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlwcmludGsoS0VSTl9FUlIgImJpbmRlcjogJWQ6JWQgdW5rbm93biBjb21tYW5kICVkXG4iLCBwcm9jLT5waWQsIHRocmVhZC0+cGlkLCBjbWQpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJKmNvbnN1bWVkID0gcHRyIC0gYnVmZmVyOworCX0KKwlyZXR1cm4gMDsKK30KKwordm9pZAorYmluZGVyX3N0YXRfYnIoc3RydWN0IGJpbmRlcl9wcm9jICpwcm9jLCBzdHJ1Y3QgYmluZGVyX3RocmVhZCAqdGhyZWFkLCB1aW50MzJfdCBjbWQpCit7CisJaWYgKF9JT0NfTlIoY21kKSA8IEFSUkFZX1NJWkUoYmluZGVyX3N0YXRzLmJyKSkgeworCQliaW5kZXJfc3RhdHMuYnJbX0lPQ19OUihjbWQpXSsrOworCQlwcm9jLT5zdGF0cy5icltfSU9DX05SKGNtZCldKys7CisJCXRocmVhZC0+c3RhdHMuYnJbX0lPQ19OUihjbWQpXSsrOworCX0KK30KKworc3RhdGljIGludAorYmluZGVyX2hhc19wcm9jX3dvcmsoc3RydWN0IGJpbmRlcl9wcm9jICpwcm9jLCBzdHJ1Y3QgYmluZGVyX3RocmVhZCAqdGhyZWFkKQoreworCXJldHVybiAhbGlzdF9lbXB0eSgmcHJvYy0+dG9kbykgfHwgKHRocmVhZC0+bG9vcGVyICYgQklOREVSX0xPT1BFUl9TVEFURV9ORUVEX1JFVFVSTik7Cit9CisKK3N0YXRpYyBpbnQKK2JpbmRlcl9oYXNfdGhyZWFkX3dvcmsoc3RydWN0IGJpbmRlcl90aHJlYWQgKnRocmVhZCkKK3sKKwlyZXR1cm4gIWxpc3RfZW1wdHkoJnRocmVhZC0+dG9kbykgfHwgdGhyZWFkLT5yZXR1cm5fZXJyb3IgIT0gQlJfT0sgfHwKKwkJKHRocmVhZC0+bG9vcGVyICYgQklOREVSX0xPT1BFUl9TVEFURV9ORUVEX1JFVFVSTik7Cit9CisKK3N0YXRpYyBpbnQKK2JpbmRlcl90aHJlYWRfcmVhZChzdHJ1Y3QgYmluZGVyX3Byb2MgKnByb2MsIHN0cnVjdCBiaW5kZXJfdGhyZWFkICp0aHJlYWQsCisJdm9pZCAgX191c2VyICpidWZmZXIsIGludCBzaXplLCBzaWduZWQgbG9uZyAqY29uc3VtZWQsIGludCBub25fYmxvY2spCit7CisJdm9pZCBfX3VzZXIgKnB0ciA9IGJ1ZmZlciArICpjb25zdW1lZDsKKwl2b2lkIF9fdXNlciAqZW5kID0gYnVmZmVyICsgc2l6ZTsKKworCWludCByZXQgPSAwOworCWludCB3YWl0X2Zvcl9wcm9jX3dvcms7CisKKwlpZiAoKmNvbnN1bWVkID09IDApIHsKKwkJaWYgKHB1dF91c2VyKEJSX05PT1AsICh1aW50MzJfdCBfX3VzZXIgKilwdHIpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXB0ciArPSBzaXplb2YodWludDMyX3QpOworCX0KKworcmV0cnk6CisJd2FpdF9mb3JfcHJvY193b3JrID0gdGhyZWFkLT50cmFuc2FjdGlvbl9zdGFjayA9PSBOVUxMICYmIGxpc3RfZW1wdHkoJnRocmVhZC0+dG9kbyk7CisKKwlpZiAodGhyZWFkLT5yZXR1cm5fZXJyb3IgIT0gQlJfT0sgJiYgcHRyIDwgZW5kKSB7CisJCWlmICh0aHJlYWQtPnJldHVybl9lcnJvcjIgIT0gQlJfT0spIHsKKwkJCWlmIChwdXRfdXNlcih0aHJlYWQtPnJldHVybl9lcnJvcjIsICh1aW50MzJfdCBfX3VzZXIgKilwdHIpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJcHRyICs9IHNpemVvZih1aW50MzJfdCk7CisJCQlpZiAocHRyID09IGVuZCkKKwkJCQlnb3RvIGRvbmU7CisJCQl0aHJlYWQtPnJldHVybl9lcnJvcjIgPSBCUl9PSzsKKwkJfQorCQlpZiAocHV0X3VzZXIodGhyZWFkLT5yZXR1cm5fZXJyb3IsICh1aW50MzJfdCBfX3VzZXIgKilwdHIpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXB0ciArPSBzaXplb2YodWludDMyX3QpOworCQl0aHJlYWQtPnJldHVybl9lcnJvciA9IEJSX09LOworCQlnb3RvIGRvbmU7CisJfQorCisKKwl0aHJlYWQtPmxvb3BlciB8PSBCSU5ERVJfTE9PUEVSX1NUQVRFX1dBSVRJTkc7CisJaWYgKHdhaXRfZm9yX3Byb2Nfd29yaykKKwkJcHJvYy0+cmVhZHlfdGhyZWFkcysrOworCW11dGV4X3VubG9jaygmYmluZGVyX2xvY2spOworCWlmICh3YWl0X2Zvcl9wcm9jX3dvcmspIHsKKwkJaWYgKCEodGhyZWFkLT5sb29wZXIgJiAoQklOREVSX0xPT1BFUl9TVEFURV9SRUdJU1RFUkVEIHwKKwkJCQkJQklOREVSX0xPT1BFUl9TVEFURV9FTlRFUkVEKSkpIHsKKwkJCWJpbmRlcl91c2VyX2Vycm9yKCJiaW5kZXI6ICVkOiVkIEVSUk9SOiBUaHJlYWQgd2FpdGluZyAiCisJCQkJImZvciBwcm9jZXNzIHdvcmsgYmVmb3JlIGNhbGxpbmcgQkNfUkVHSVNURVJfIgorCQkJCSJMT09QRVIgb3IgQkNfRU5URVJfTE9PUEVSIChzdGF0ZSAleClcbiIsCisJCQkJcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCwgdGhyZWFkLT5sb29wZXIpOworCQkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGJpbmRlcl91c2VyX2Vycm9yX3dhaXQsIGJpbmRlcl9zdG9wX29uX3VzZXJfZXJyb3IgPCAyKTsKKwkJfQorCQliaW5kZXJfc2V0X25pY2UocHJvYy0+ZGVmYXVsdF9wcmlvcml0eSk7CisJCWlmIChub25fYmxvY2spIHsKKwkJCWlmICghYmluZGVyX2hhc19wcm9jX3dvcmsocHJvYywgdGhyZWFkKSkKKwkJCQlyZXQgPSAtRUFHQUlOOworCQl9IGVsc2UKKwkJCXJldCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV9leGNsdXNpdmUocHJvYy0+d2FpdCwgYmluZGVyX2hhc19wcm9jX3dvcmsocHJvYywgdGhyZWFkKSk7CisJfSBlbHNlIHsKKwkJaWYgKG5vbl9ibG9jaykgeworCQkJaWYgKCFiaW5kZXJfaGFzX3RocmVhZF93b3JrKHRocmVhZCkpCisJCQkJcmV0ID0gLUVBR0FJTjsKKwkJfSBlbHNlCisJCQlyZXQgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUodGhyZWFkLT53YWl0LCBiaW5kZXJfaGFzX3RocmVhZF93b3JrKHRocmVhZCkpOworCX0KKwltdXRleF9sb2NrKCZiaW5kZXJfbG9jayk7CisJaWYgKHdhaXRfZm9yX3Byb2Nfd29yaykKKwkJcHJvYy0+cmVhZHlfdGhyZWFkcy0tOworCXRocmVhZC0+bG9vcGVyICY9IH5CSU5ERVJfTE9PUEVSX1NUQVRFX1dBSVRJTkc7CisKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJd2hpbGUgKDEpIHsKKwkJdWludDMyX3QgY21kOworCQlzdHJ1Y3QgYmluZGVyX3RyYW5zYWN0aW9uX2RhdGEgdHI7CisJCXN0cnVjdCBiaW5kZXJfd29yayAqdzsKKwkJc3RydWN0IGJpbmRlcl90cmFuc2FjdGlvbiAqdCA9IE5VTEw7CisKKwkJaWYgKCFsaXN0X2VtcHR5KCZ0aHJlYWQtPnRvZG8pKQorCQkJdyA9IGxpc3RfZmlyc3RfZW50cnkoJnRocmVhZC0+dG9kbywgc3RydWN0IGJpbmRlcl93b3JrLCBlbnRyeSk7CisJCWVsc2UgaWYgKCFsaXN0X2VtcHR5KCZwcm9jLT50b2RvKSAmJiB3YWl0X2Zvcl9wcm9jX3dvcmspCisJCQl3ID0gbGlzdF9maXJzdF9lbnRyeSgmcHJvYy0+dG9kbywgc3RydWN0IGJpbmRlcl93b3JrLCBlbnRyeSk7CisJCWVsc2UgeworCQkJaWYgKHB0ciAtIGJ1ZmZlciA9PSA0ICYmICEodGhyZWFkLT5sb29wZXIgJiBCSU5ERVJfTE9PUEVSX1NUQVRFX05FRURfUkVUVVJOKSkgLyogbm8gZGF0YSBhZGRlZCAqLworCQkJCWdvdG8gcmV0cnk7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChlbmQgLSBwdHIgPCBzaXplb2YodHIpICsgNCkKKwkJCWJyZWFrOworCisJCXN3aXRjaCAody0+dHlwZSkgeworCQljYXNlIEJJTkRFUl9XT1JLX1RSQU5TQUNUSU9OOiB7CisJCQl0ID0gY29udGFpbmVyX29mKHcsIHN0cnVjdCBiaW5kZXJfdHJhbnNhY3Rpb24sIHdvcmspOworCQl9IGJyZWFrOworCQljYXNlIEJJTkRFUl9XT1JLX1RSQU5TQUNUSU9OX0NPTVBMRVRFOiB7CisJCQljbWQgPSBCUl9UUkFOU0FDVElPTl9DT01QTEVURTsKKwkJCWlmIChwdXRfdXNlcihjbWQsICh1aW50MzJfdCBfX3VzZXIgKilwdHIpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJcHRyICs9IHNpemVvZih1aW50MzJfdCk7CisKKwkJCWJpbmRlcl9zdGF0X2JyKHByb2MsIHRocmVhZCwgY21kKTsKKwkJCWlmIChiaW5kZXJfZGVidWdfbWFzayAmIEJJTkRFUl9ERUJVR19UUkFOU0FDVElPTl9DT01QTEVURSkKKwkJCQlwcmludGsoS0VSTl9JTkZPICJiaW5kZXI6ICVkOiVkIEJSX1RSQU5TQUNUSU9OX0NPTVBMRVRFXG4iLAorCQkJCSAgICAgICBwcm9jLT5waWQsIHRocmVhZC0+cGlkKTsKKworCQkJbGlzdF9kZWwoJnctPmVudHJ5KTsKKwkJCWtmcmVlKHcpOworCQkJYmluZGVyX3N0YXRzLm9ial9kZWxldGVkW0JJTkRFUl9TVEFUX1RSQU5TQUNUSU9OX0NPTVBMRVRFXSsrOworCQl9IGJyZWFrOworCQljYXNlIEJJTkRFUl9XT1JLX05PREU6IHsKKwkJCXN0cnVjdCBiaW5kZXJfbm9kZSAqbm9kZSA9IGNvbnRhaW5lcl9vZih3LCBzdHJ1Y3QgYmluZGVyX25vZGUsIHdvcmspOworCQkJdWludDMyX3QgY21kID0gQlJfTk9PUDsKKwkJCWNvbnN0IGNoYXIgKmNtZF9uYW1lOworCQkJaW50IHN0cm9uZyA9IG5vZGUtPmludGVybmFsX3N0cm9uZ19yZWZzIHx8IG5vZGUtPmxvY2FsX3N0cm9uZ19yZWZzOworCQkJaW50IHdlYWsgPSAhaGxpc3RfZW1wdHkoJm5vZGUtPnJlZnMpIHx8IG5vZGUtPmxvY2FsX3dlYWtfcmVmcyB8fCBzdHJvbmc7CisJCQlpZiAod2VhayAmJiAhbm9kZS0+aGFzX3dlYWtfcmVmKSB7CisJCQkJY21kID0gQlJfSU5DUkVGUzsKKwkJCQljbWRfbmFtZSA9ICJCUl9JTkNSRUZTIjsKKwkJCQlub2RlLT5oYXNfd2Vha19yZWYgPSAxOworCQkJCW5vZGUtPnBlbmRpbmdfd2Vha19yZWYgPSAxOworCQkJCW5vZGUtPmxvY2FsX3dlYWtfcmVmcysrOworCQkJfSBlbHNlIGlmIChzdHJvbmcgJiYgIW5vZGUtPmhhc19zdHJvbmdfcmVmKSB7CisJCQkJY21kID0gQlJfQUNRVUlSRTsKKwkJCQljbWRfbmFtZSA9ICJCUl9BQ1FVSVJFIjsKKwkJCQlub2RlLT5oYXNfc3Ryb25nX3JlZiA9IDE7CisJCQkJbm9kZS0+cGVuZGluZ19zdHJvbmdfcmVmID0gMTsKKwkJCQlub2RlLT5sb2NhbF9zdHJvbmdfcmVmcysrOworCQkJfSBlbHNlIGlmICghc3Ryb25nICYmIG5vZGUtPmhhc19zdHJvbmdfcmVmKSB7CisJCQkJY21kID0gQlJfUkVMRUFTRTsKKwkJCQljbWRfbmFtZSA9ICJCUl9SRUxFQVNFIjsKKwkJCQlub2RlLT5oYXNfc3Ryb25nX3JlZiA9IDA7CisJCQl9IGVsc2UgaWYgKCF3ZWFrICYmIG5vZGUtPmhhc193ZWFrX3JlZikgeworCQkJCWNtZCA9IEJSX0RFQ1JFRlM7CisJCQkJY21kX25hbWUgPSAiQlJfREVDUkVGUyI7CisJCQkJbm9kZS0+aGFzX3dlYWtfcmVmID0gMDsKKwkJCX0KKwkJCWlmIChjbWQgIT0gQlJfTk9PUCkgeworCQkJCWlmIChwdXRfdXNlcihjbWQsICh1aW50MzJfdCBfX3VzZXIgKilwdHIpKQorCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQlwdHIgKz0gc2l6ZW9mKHVpbnQzMl90KTsKKwkJCQlpZiAocHV0X3VzZXIobm9kZS0+cHRyLCAodm9pZCAqIF9fdXNlciAqKXB0cikpCisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCXB0ciArPSBzaXplb2Yodm9pZCAqKTsKKwkJCQlpZiAocHV0X3VzZXIobm9kZS0+Y29va2llLCAodm9pZCAqIF9fdXNlciAqKXB0cikpCisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCXB0ciArPSBzaXplb2Yodm9pZCAqKTsKKworCQkJCWJpbmRlcl9zdGF0X2JyKHByb2MsIHRocmVhZCwgY21kKTsKKwkJCQlpZiAoYmluZGVyX2RlYnVnX21hc2sgJiBCSU5ERVJfREVCVUdfVVNFUl9SRUZTKQorCQkJCQlwcmludGsoS0VSTl9JTkZPICJiaW5kZXI6ICVkOiVkICVzICVkIHUlcCBjJXBcbiIsCisJCQkJCSAgICAgICBwcm9jLT5waWQsIHRocmVhZC0+cGlkLCBjbWRfbmFtZSwgbm9kZS0+ZGVidWdfaWQsIG5vZGUtPnB0ciwgbm9kZS0+Y29va2llKTsKKwkJCX0gZWxzZSB7CisJCQkJbGlzdF9kZWxfaW5pdCgmdy0+ZW50cnkpOworCQkJCWlmICghd2VhayAmJiAhc3Ryb25nKSB7CisJCQkJCWlmIChiaW5kZXJfZGVidWdfbWFzayAmIEJJTkRFUl9ERUJVR19JTlRFUk5BTF9SRUZTKQorCQkJCQkJcHJpbnRrKEtFUk5fSU5GTyAiYmluZGVyOiAlZDolZCBub2RlICVkIHUlcCBjJXAgZGVsZXRlZFxuIiwKKwkJCQkJCSAgICAgICBwcm9jLT5waWQsIHRocmVhZC0+cGlkLCBub2RlLT5kZWJ1Z19pZCwgbm9kZS0+cHRyLCBub2RlLT5jb29raWUpOworCQkJCQlyYl9lcmFzZSgmbm9kZS0+cmJfbm9kZSwgJnByb2MtPm5vZGVzKTsKKwkJCQkJa2ZyZWUobm9kZSk7CisJCQkJCWJpbmRlcl9zdGF0cy5vYmpfZGVsZXRlZFtCSU5ERVJfU1RBVF9OT0RFXSsrOworCQkJCX0gZWxzZSB7CisJCQkJCWlmIChiaW5kZXJfZGVidWdfbWFzayAmIEJJTkRFUl9ERUJVR19JTlRFUk5BTF9SRUZTKQorCQkJCQkJcHJpbnRrKEtFUk5fSU5GTyAiYmluZGVyOiAlZDolZCBub2RlICVkIHUlcCBjJXAgc3RhdGUgdW5jaGFuZ2VkXG4iLAorCQkJCQkJICAgICAgIHByb2MtPnBpZCwgdGhyZWFkLT5waWQsIG5vZGUtPmRlYnVnX2lkLCBub2RlLT5wdHIsIG5vZGUtPmNvb2tpZSk7CisJCQkJfQorCQkJfQorCQl9IGJyZWFrOworCQljYXNlIEJJTkRFUl9XT1JLX0RFQURfQklOREVSOgorCQljYXNlIEJJTkRFUl9XT1JLX0RFQURfQklOREVSX0FORF9DTEVBUjoKKwkJY2FzZSBCSU5ERVJfV09SS19DTEVBUl9ERUFUSF9OT1RJRklDQVRJT046IHsKKwkJCXN0cnVjdCBiaW5kZXJfcmVmX2RlYXRoICpkZWF0aCA9IGNvbnRhaW5lcl9vZih3LCBzdHJ1Y3QgYmluZGVyX3JlZl9kZWF0aCwgd29yayk7CisJCQl1aW50MzJfdCBjbWQ7CisJCQlpZiAody0+dHlwZSA9PSBCSU5ERVJfV09SS19DTEVBUl9ERUFUSF9OT1RJRklDQVRJT04pCisJCQkJY21kID0gQlJfQ0xFQVJfREVBVEhfTk9USUZJQ0FUSU9OX0RPTkU7CisJCQllbHNlCisJCQkJY21kID0gQlJfREVBRF9CSU5ERVI7CisJCQlpZiAocHV0X3VzZXIoY21kLCAodWludDMyX3QgX191c2VyICopcHRyKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCXB0ciArPSBzaXplb2YodWludDMyX3QpOworCQkJaWYgKHB1dF91c2VyKGRlYXRoLT5jb29raWUsICh2b2lkICogX191c2VyICopcHRyKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCXB0ciArPSBzaXplb2Yodm9pZCAqKTsKKwkJCWlmIChiaW5kZXJfZGVidWdfbWFzayAmIEJJTkRFUl9ERUJVR19ERUFUSF9OT1RJRklDQVRJT04pCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiYmluZGVyOiAlZDolZCAlcyAlcFxuIiwKKwkJCQkgICAgICAgcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCwKKwkJCQkgICAgICAgY21kID09IEJSX0RFQURfQklOREVSID8KKwkJCQkgICAgICAgIkJSX0RFQURfQklOREVSIiA6CisJCQkJICAgICAgICJCUl9DTEVBUl9ERUFUSF9OT1RJRklDQVRJT05fRE9ORSIsCisJCQkJICAgICAgIGRlYXRoLT5jb29raWUpOworCisJCQlpZiAody0+dHlwZSA9PSBCSU5ERVJfV09SS19DTEVBUl9ERUFUSF9OT1RJRklDQVRJT04pIHsKKwkJCQlsaXN0X2RlbCgmdy0+ZW50cnkpOworCQkJCWtmcmVlKGRlYXRoKTsKKwkJCQliaW5kZXJfc3RhdHMub2JqX2RlbGV0ZWRbQklOREVSX1NUQVRfREVBVEhdKys7CisJCQl9IGVsc2UKKwkJCQlsaXN0X21vdmUoJnctPmVudHJ5LCAmcHJvYy0+ZGVsaXZlcmVkX2RlYXRoKTsKKwkJCWlmIChjbWQgPT0gQlJfREVBRF9CSU5ERVIpCisJCQkJZ290byBkb25lOyAvKiBERUFEX0JJTkRFUiBub3RpZmljYXRpb25zIGNhbiBjYXVzZSB0cmFuc2FjdGlvbnMgKi8KKwkJfSBicmVhazsKKwkJfQorCisJCWlmICghdCkKKwkJCWNvbnRpbnVlOworCisJCUJVR19PTih0LT5idWZmZXIgPT0gTlVMTCk7CisJCWlmICh0LT5idWZmZXItPnRhcmdldF9ub2RlKSB7CisJCQlzdHJ1Y3QgYmluZGVyX25vZGUgKnRhcmdldF9ub2RlID0gdC0+YnVmZmVyLT50YXJnZXRfbm9kZTsKKwkJCXRyLnRhcmdldC5wdHIgPSB0YXJnZXRfbm9kZS0+cHRyOworCQkJdHIuY29va2llID0gIHRhcmdldF9ub2RlLT5jb29raWU7CisJCQl0LT5zYXZlZF9wcmlvcml0eSA9IHRhc2tfbmljZShjdXJyZW50KTsKKwkJCWlmICh0LT5wcmlvcml0eSA8IHRhcmdldF9ub2RlLT5taW5fcHJpb3JpdHkgJiYKKwkJCSAgICAhKHQtPmZsYWdzICYgVEZfT05FX1dBWSkpCisJCQkJYmluZGVyX3NldF9uaWNlKHQtPnByaW9yaXR5KTsKKwkJCWVsc2UgaWYgKCEodC0+ZmxhZ3MgJiBURl9PTkVfV0FZKSB8fAorCQkJCSB0LT5zYXZlZF9wcmlvcml0eSA+IHRhcmdldF9ub2RlLT5taW5fcHJpb3JpdHkpCisJCQkJYmluZGVyX3NldF9uaWNlKHRhcmdldF9ub2RlLT5taW5fcHJpb3JpdHkpOworCQkJY21kID0gQlJfVFJBTlNBQ1RJT047CisJCX0gZWxzZSB7CisJCQl0ci50YXJnZXQucHRyID0gTlVMTDsKKwkJCXRyLmNvb2tpZSA9IE5VTEw7CisJCQljbWQgPSBCUl9SRVBMWTsKKwkJfQorCQl0ci5jb2RlID0gdC0+Y29kZTsKKwkJdHIuZmxhZ3MgPSB0LT5mbGFnczsKKwkJdHIuc2VuZGVyX2V1aWQgPSB0LT5zZW5kZXJfZXVpZDsKKworCQlpZiAodC0+ZnJvbSkgeworCQkJc3RydWN0IHRhc2tfc3RydWN0ICpzZW5kZXIgPSB0LT5mcm9tLT5wcm9jLT50c2s7CisJCQl0ci5zZW5kZXJfcGlkID0gdGFza190Z2lkX25yX25zKHNlbmRlciwgY3VycmVudC0+bnNwcm94eS0+cGlkX25zKTsKKwkJfSBlbHNlIHsKKwkJCXRyLnNlbmRlcl9waWQgPSAwOworCQl9CisKKwkJdHIuZGF0YV9zaXplID0gdC0+YnVmZmVyLT5kYXRhX3NpemU7CisJCXRyLm9mZnNldHNfc2l6ZSA9IHQtPmJ1ZmZlci0+b2Zmc2V0c19zaXplOworCQl0ci5kYXRhLnB0ci5idWZmZXIgPSAodm9pZCAqKSgodm9pZCAqKXQtPmJ1ZmZlci0+ZGF0YSArIHByb2MtPnVzZXJfYnVmZmVyX29mZnNldCk7CisJCXRyLmRhdGEucHRyLm9mZnNldHMgPSB0ci5kYXRhLnB0ci5idWZmZXIgKyBBTElHTih0LT5idWZmZXItPmRhdGFfc2l6ZSwgc2l6ZW9mKHZvaWQgKikpOworCisJCWlmIChwdXRfdXNlcihjbWQsICh1aW50MzJfdCBfX3VzZXIgKilwdHIpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXB0ciArPSBzaXplb2YodWludDMyX3QpOworCQlpZiAoY29weV90b191c2VyKHB0ciwgJnRyLCBzaXplb2YodHIpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlwdHIgKz0gc2l6ZW9mKHRyKTsKKworCQliaW5kZXJfc3RhdF9icihwcm9jLCB0aHJlYWQsIGNtZCk7CisJCWlmIChiaW5kZXJfZGVidWdfbWFzayAmIEJJTkRFUl9ERUJVR19UUkFOU0FDVElPTikKKwkJCXByaW50ayhLRVJOX0lORk8gImJpbmRlcjogJWQ6JWQgJXMgJWQgJWQ6JWQsIGNtZCAlZCIKKwkJCQkic2l6ZSAlemQtJXpkIHB0ciAlcC0lcFxuIiwKKwkJCSAgICAgICBwcm9jLT5waWQsIHRocmVhZC0+cGlkLAorCQkJICAgICAgIChjbWQgPT0gQlJfVFJBTlNBQ1RJT04pID8gIkJSX1RSQU5TQUNUSU9OIiA6ICJCUl9SRVBMWSIsCisJCQkgICAgICAgdC0+ZGVidWdfaWQsIHQtPmZyb20gPyB0LT5mcm9tLT5wcm9jLT5waWQgOiAwLAorCQkJICAgICAgIHQtPmZyb20gPyB0LT5mcm9tLT5waWQgOiAwLCBjbWQsCisJCQkgICAgICAgdC0+YnVmZmVyLT5kYXRhX3NpemUsIHQtPmJ1ZmZlci0+b2Zmc2V0c19zaXplLAorCQkJICAgICAgIHRyLmRhdGEucHRyLmJ1ZmZlciwgdHIuZGF0YS5wdHIub2Zmc2V0cyk7CisKKwkJbGlzdF9kZWwoJnQtPndvcmsuZW50cnkpOworCQl0LT5idWZmZXItPmFsbG93X3VzZXJfZnJlZSA9IDE7CisJCWlmIChjbWQgPT0gQlJfVFJBTlNBQ1RJT04gJiYgISh0LT5mbGFncyAmIFRGX09ORV9XQVkpKSB7CisJCQl0LT50b19wYXJlbnQgPSB0aHJlYWQtPnRyYW5zYWN0aW9uX3N0YWNrOworCQkJdC0+dG9fdGhyZWFkID0gdGhyZWFkOworCQkJdGhyZWFkLT50cmFuc2FjdGlvbl9zdGFjayA9IHQ7CisJCX0gZWxzZSB7CisJCQl0LT5idWZmZXItPnRyYW5zYWN0aW9uID0gTlVMTDsKKwkJCWtmcmVlKHQpOworCQkJYmluZGVyX3N0YXRzLm9ial9kZWxldGVkW0JJTkRFUl9TVEFUX1RSQU5TQUNUSU9OXSsrOworCQl9CisJCWJyZWFrOworCX0KKworZG9uZToKKworCSpjb25zdW1lZCA9IHB0ciAtIGJ1ZmZlcjsKKwlpZiAocHJvYy0+cmVxdWVzdGVkX3RocmVhZHMgKyBwcm9jLT5yZWFkeV90aHJlYWRzID09IDAgJiYKKwkgICAgcHJvYy0+cmVxdWVzdGVkX3RocmVhZHNfc3RhcnRlZCA8IHByb2MtPm1heF90aHJlYWRzICYmCisJICAgICh0aHJlYWQtPmxvb3BlciAmIChCSU5ERVJfTE9PUEVSX1NUQVRFX1JFR0lTVEVSRUQgfAorCSAgICAgQklOREVSX0xPT1BFUl9TVEFURV9FTlRFUkVEKSkgLyogdGhlIHVzZXItc3BhY2UgY29kZSBmYWlscyB0byAqLworCSAgICAgLypzcGF3biBhIG5ldyB0aHJlYWQgaWYgd2UgbGVhdmUgdGhpcyBvdXQgKi8pIHsKKwkJcHJvYy0+cmVxdWVzdGVkX3RocmVhZHMrKzsKKwkJaWYgKGJpbmRlcl9kZWJ1Z19tYXNrICYgQklOREVSX0RFQlVHX1RIUkVBRFMpCisJCQlwcmludGsoS0VSTl9JTkZPICJiaW5kZXI6ICVkOiVkIEJSX1NQQVdOX0xPT1BFUlxuIiwKKwkJCSAgICAgICBwcm9jLT5waWQsIHRocmVhZC0+cGlkKTsKKwkJaWYgKHB1dF91c2VyKEJSX1NQQVdOX0xPT1BFUiwgKHVpbnQzMl90IF9fdXNlciAqKWJ1ZmZlcikpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGJpbmRlcl9yZWxlYXNlX3dvcmsoc3RydWN0IGxpc3RfaGVhZCAqbGlzdCkKK3sKKwlzdHJ1Y3QgYmluZGVyX3dvcmsgKnc7CisJd2hpbGUgKCFsaXN0X2VtcHR5KGxpc3QpKSB7CisJCXcgPSBsaXN0X2ZpcnN0X2VudHJ5KGxpc3QsIHN0cnVjdCBiaW5kZXJfd29yaywgZW50cnkpOworCQlsaXN0X2RlbF9pbml0KCZ3LT5lbnRyeSk7CisJCXN3aXRjaCAody0+dHlwZSkgeworCQljYXNlIEJJTkRFUl9XT1JLX1RSQU5TQUNUSU9OOiB7CisJCQlzdHJ1Y3QgYmluZGVyX3RyYW5zYWN0aW9uICp0ID0gY29udGFpbmVyX29mKHcsIHN0cnVjdCBiaW5kZXJfdHJhbnNhY3Rpb24sIHdvcmspOworCQkJaWYgKHQtPmJ1ZmZlci0+dGFyZ2V0X25vZGUgJiYgISh0LT5mbGFncyAmIFRGX09ORV9XQVkpKQorCQkJCWJpbmRlcl9zZW5kX2ZhaWxlZF9yZXBseSh0LCBCUl9ERUFEX1JFUExZKTsKKwkJfSBicmVhazsKKwkJY2FzZSBCSU5ERVJfV09SS19UUkFOU0FDVElPTl9DT01QTEVURTogeworCQkJa2ZyZWUodyk7CisJCQliaW5kZXJfc3RhdHMub2JqX2RlbGV0ZWRbQklOREVSX1NUQVRfVFJBTlNBQ1RJT05fQ09NUExFVEVdKys7CisJCX0gYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCX0KKworfQorCitzdGF0aWMgc3RydWN0IGJpbmRlcl90aHJlYWQgKmJpbmRlcl9nZXRfdGhyZWFkKHN0cnVjdCBiaW5kZXJfcHJvYyAqcHJvYykKK3sKKwlzdHJ1Y3QgYmluZGVyX3RocmVhZCAqdGhyZWFkID0gTlVMTDsKKwlzdHJ1Y3QgcmJfbm9kZSAqcGFyZW50ID0gTlVMTDsKKwlzdHJ1Y3QgcmJfbm9kZSAqKnAgPSAmcHJvYy0+dGhyZWFkcy5yYl9ub2RlOworCisJd2hpbGUgKCpwKSB7CisJCXBhcmVudCA9ICpwOworCQl0aHJlYWQgPSByYl9lbnRyeShwYXJlbnQsIHN0cnVjdCBiaW5kZXJfdGhyZWFkLCByYl9ub2RlKTsKKworCQlpZiAoY3VycmVudC0+cGlkIDwgdGhyZWFkLT5waWQpCisJCQlwID0gJigqcCktPnJiX2xlZnQ7CisJCWVsc2UgaWYgKGN1cnJlbnQtPnBpZCA+IHRocmVhZC0+cGlkKQorCQkJcCA9ICYoKnApLT5yYl9yaWdodDsKKwkJZWxzZQorCQkJYnJlYWs7CisJfQorCWlmICgqcCA9PSBOVUxMKSB7CisJCXRocmVhZCA9IGt6YWxsb2Moc2l6ZW9mKCp0aHJlYWQpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKHRocmVhZCA9PSBOVUxMKQorCQkJcmV0dXJuIE5VTEw7CisJCWJpbmRlcl9zdGF0cy5vYmpfY3JlYXRlZFtCSU5ERVJfU1RBVF9USFJFQURdKys7CisJCXRocmVhZC0+cHJvYyA9IHByb2M7CisJCXRocmVhZC0+cGlkID0gY3VycmVudC0+cGlkOworCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZ0aHJlYWQtPndhaXQpOworCQlJTklUX0xJU1RfSEVBRCgmdGhyZWFkLT50b2RvKTsKKwkJcmJfbGlua19ub2RlKCZ0aHJlYWQtPnJiX25vZGUsIHBhcmVudCwgcCk7CisJCXJiX2luc2VydF9jb2xvcigmdGhyZWFkLT5yYl9ub2RlLCAmcHJvYy0+dGhyZWFkcyk7CisJCXRocmVhZC0+bG9vcGVyIHw9IEJJTkRFUl9MT09QRVJfU1RBVEVfTkVFRF9SRVRVUk47CisJCXRocmVhZC0+cmV0dXJuX2Vycm9yID0gQlJfT0s7CisJCXRocmVhZC0+cmV0dXJuX2Vycm9yMiA9IEJSX09LOworCX0KKwlyZXR1cm4gdGhyZWFkOworfQorCitzdGF0aWMgaW50IGJpbmRlcl9mcmVlX3RocmVhZChzdHJ1Y3QgYmluZGVyX3Byb2MgKnByb2MsIHN0cnVjdCBiaW5kZXJfdGhyZWFkICp0aHJlYWQpCit7CisJc3RydWN0IGJpbmRlcl90cmFuc2FjdGlvbiAqdDsKKwlzdHJ1Y3QgYmluZGVyX3RyYW5zYWN0aW9uICpzZW5kX3JlcGx5ID0gTlVMTDsKKwlpbnQgYWN0aXZlX3RyYW5zYWN0aW9ucyA9IDA7CisKKwlyYl9lcmFzZSgmdGhyZWFkLT5yYl9ub2RlLCAmcHJvYy0+dGhyZWFkcyk7CisJdCA9IHRocmVhZC0+dHJhbnNhY3Rpb25fc3RhY2s7CisJaWYgKHQgJiYgdC0+dG9fdGhyZWFkID09IHRocmVhZCkKKwkJc2VuZF9yZXBseSA9IHQ7CisJd2hpbGUgKHQpIHsKKwkJYWN0aXZlX3RyYW5zYWN0aW9ucysrOworCQlpZiAoYmluZGVyX2RlYnVnX21hc2sgJiBCSU5ERVJfREVCVUdfREVBRF9UUkFOU0FDVElPTikKKwkJCXByaW50ayhLRVJOX0lORk8gImJpbmRlcjogcmVsZWFzZSAlZDolZCB0cmFuc2FjdGlvbiAlZCAlcywgc3RpbGwgYWN0aXZlXG4iLAorCQkJICAgICAgIHByb2MtPnBpZCwgdGhyZWFkLT5waWQsIHQtPmRlYnVnX2lkLCAodC0+dG9fdGhyZWFkID09IHRocmVhZCkgPyAiaW4iIDogIm91dCIpOworCQlpZiAodC0+dG9fdGhyZWFkID09IHRocmVhZCkgeworCQkJdC0+dG9fcHJvYyA9IE5VTEw7CisJCQl0LT50b190aHJlYWQgPSBOVUxMOworCQkJaWYgKHQtPmJ1ZmZlcikgeworCQkJCXQtPmJ1ZmZlci0+dHJhbnNhY3Rpb24gPSBOVUxMOworCQkJCXQtPmJ1ZmZlciA9IE5VTEw7CisJCQl9CisJCQl0ID0gdC0+dG9fcGFyZW50OworCQl9IGVsc2UgaWYgKHQtPmZyb20gPT0gdGhyZWFkKSB7CisJCQl0LT5mcm9tID0gTlVMTDsKKwkJCXQgPSB0LT5mcm9tX3BhcmVudDsKKwkJfSBlbHNlCisJCQlCVUcoKTsKKwl9CisJaWYgKHNlbmRfcmVwbHkpCisJCWJpbmRlcl9zZW5kX2ZhaWxlZF9yZXBseShzZW5kX3JlcGx5LCBCUl9ERUFEX1JFUExZKTsKKwliaW5kZXJfcmVsZWFzZV93b3JrKCZ0aHJlYWQtPnRvZG8pOworCWtmcmVlKHRocmVhZCk7CisJYmluZGVyX3N0YXRzLm9ial9kZWxldGVkW0JJTkRFUl9TVEFUX1RIUkVBRF0rKzsKKwlyZXR1cm4gYWN0aXZlX3RyYW5zYWN0aW9uczsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBiaW5kZXJfcG9sbChzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IHBvbGxfdGFibGVfc3RydWN0ICp3YWl0KQoreworCXN0cnVjdCBiaW5kZXJfcHJvYyAqcHJvYyA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgYmluZGVyX3RocmVhZCAqdGhyZWFkID0gTlVMTDsKKwlpbnQgd2FpdF9mb3JfcHJvY193b3JrOworCisJbXV0ZXhfbG9jaygmYmluZGVyX2xvY2spOworCXRocmVhZCA9IGJpbmRlcl9nZXRfdGhyZWFkKHByb2MpOworCisJd2FpdF9mb3JfcHJvY193b3JrID0gdGhyZWFkLT50cmFuc2FjdGlvbl9zdGFjayA9PSBOVUxMICYmCisJCWxpc3RfZW1wdHkoJnRocmVhZC0+dG9kbykgJiYgdGhyZWFkLT5yZXR1cm5fZXJyb3IgPT0gQlJfT0s7CisJbXV0ZXhfdW5sb2NrKCZiaW5kZXJfbG9jayk7CisKKwlpZiAod2FpdF9mb3JfcHJvY193b3JrKSB7CisJCWlmIChiaW5kZXJfaGFzX3Byb2Nfd29yayhwcm9jLCB0aHJlYWQpKQorCQkJcmV0dXJuIFBPTExJTjsKKwkJcG9sbF93YWl0KGZpbHAsICZwcm9jLT53YWl0LCB3YWl0KTsKKwkJaWYgKGJpbmRlcl9oYXNfcHJvY193b3JrKHByb2MsIHRocmVhZCkpCisJCQlyZXR1cm4gUE9MTElOOworCX0gZWxzZSB7CisJCWlmIChiaW5kZXJfaGFzX3RocmVhZF93b3JrKHRocmVhZCkpCisJCQlyZXR1cm4gUE9MTElOOworCQlwb2xsX3dhaXQoZmlscCwgJnRocmVhZC0+d2FpdCwgd2FpdCk7CisJCWlmIChiaW5kZXJfaGFzX3RocmVhZF93b3JrKHRocmVhZCkpCisJCQlyZXR1cm4gUE9MTElOOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGxvbmcgYmluZGVyX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBiaW5kZXJfcHJvYyAqcHJvYyA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgYmluZGVyX3RocmVhZCAqdGhyZWFkOworCXVuc2lnbmVkIGludCBzaXplID0gX0lPQ19TSVpFKGNtZCk7CisJdm9pZCBfX3VzZXIgKnVidWYgPSAodm9pZCBfX3VzZXIgKilhcmc7CisKKwkvKnByaW50ayhLRVJOX0lORk8gImJpbmRlcl9pb2N0bDogJWQ6JWQgJXggJWx4XG4iLCBwcm9jLT5waWQsIGN1cnJlbnQtPnBpZCwgY21kLCBhcmcpOyovCisKKwlyZXQgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoYmluZGVyX3VzZXJfZXJyb3Jfd2FpdCwgYmluZGVyX3N0b3Bfb25fdXNlcl9lcnJvciA8IDIpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwltdXRleF9sb2NrKCZiaW5kZXJfbG9jayk7CisJdGhyZWFkID0gYmluZGVyX2dldF90aHJlYWQocHJvYyk7CisJaWYgKHRocmVhZCA9PSBOVUxMKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyOworCX0KKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBCSU5ERVJfV1JJVEVfUkVBRDogeworCQlzdHJ1Y3QgYmluZGVyX3dyaXRlX3JlYWQgYndyOworCQlpZiAoc2l6ZSAhPSBzaXplb2Yoc3RydWN0IGJpbmRlcl93cml0ZV9yZWFkKSkgeworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWdvdG8gZXJyOworCQl9CisJCWlmIChjb3B5X2Zyb21fdXNlcigmYndyLCB1YnVmLCBzaXplb2YoYndyKSkpIHsKKwkJCXJldCA9IC1FRkFVTFQ7CisJCQlnb3RvIGVycjsKKwkJfQorCQlpZiAoYmluZGVyX2RlYnVnX21hc2sgJiBCSU5ERVJfREVCVUdfUkVBRF9XUklURSkKKwkJCXByaW50ayhLRVJOX0lORk8gImJpbmRlcjogJWQ6JWQgd3JpdGUgJWxkIGF0ICUwOGx4LCByZWFkICVsZCBhdCAlMDhseFxuIiwKKwkJCSAgICAgICBwcm9jLT5waWQsIHRocmVhZC0+cGlkLCBid3Iud3JpdGVfc2l6ZSwgYndyLndyaXRlX2J1ZmZlciwgYndyLnJlYWRfc2l6ZSwgYndyLnJlYWRfYnVmZmVyKTsKKwkJaWYgKGJ3ci53cml0ZV9zaXplID4gMCkgeworCQkJcmV0ID0gYmluZGVyX3RocmVhZF93cml0ZShwcm9jLCB0aHJlYWQsICh2b2lkIF9fdXNlciAqKWJ3ci53cml0ZV9idWZmZXIsIGJ3ci53cml0ZV9zaXplLCAmYndyLndyaXRlX2NvbnN1bWVkKTsKKwkJCWlmIChyZXQgPCAwKSB7CisJCQkJYndyLnJlYWRfY29uc3VtZWQgPSAwOworCQkJCWlmIChjb3B5X3RvX3VzZXIodWJ1ZiwgJmJ3ciwgc2l6ZW9mKGJ3cikpKQorCQkJCQlyZXQgPSAtRUZBVUxUOworCQkJCWdvdG8gZXJyOworCQkJfQorCQl9CisJCWlmIChid3IucmVhZF9zaXplID4gMCkgeworCQkJcmV0ID0gYmluZGVyX3RocmVhZF9yZWFkKHByb2MsIHRocmVhZCwgKHZvaWQgX191c2VyICopYndyLnJlYWRfYnVmZmVyLCBid3IucmVhZF9zaXplLCAmYndyLnJlYWRfY29uc3VtZWQsIGZpbHAtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKTsKKwkJCWlmICghbGlzdF9lbXB0eSgmcHJvYy0+dG9kbykpCisJCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwcm9jLT53YWl0KTsKKwkJCWlmIChyZXQgPCAwKSB7CisJCQkJaWYgKGNvcHlfdG9fdXNlcih1YnVmLCAmYndyLCBzaXplb2YoYndyKSkpCisJCQkJCXJldCA9IC1FRkFVTFQ7CisJCQkJZ290byBlcnI7CisJCQl9CisJCX0KKwkJaWYgKGJpbmRlcl9kZWJ1Z19tYXNrICYgQklOREVSX0RFQlVHX1JFQURfV1JJVEUpCisJCQlwcmludGsoS0VSTl9JTkZPICJiaW5kZXI6ICVkOiVkIHdyb3RlICVsZCBvZiAlbGQsIHJlYWQgcmV0dXJuICVsZCBvZiAlbGRcbiIsCisJCQkgICAgICAgcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCwgYndyLndyaXRlX2NvbnN1bWVkLCBid3Iud3JpdGVfc2l6ZSwgYndyLnJlYWRfY29uc3VtZWQsIGJ3ci5yZWFkX3NpemUpOworCQlpZiAoY29weV90b191c2VyKHVidWYsICZid3IsIHNpemVvZihid3IpKSkgeworCQkJcmV0ID0gLUVGQVVMVDsKKwkJCWdvdG8gZXJyOworCQl9CisJCWJyZWFrOworCX0KKwljYXNlIEJJTkRFUl9TRVRfTUFYX1RIUkVBRFM6CisJCWlmIChjb3B5X2Zyb21fdXNlcigmcHJvYy0+bWF4X3RocmVhZHMsIHVidWYsIHNpemVvZihwcm9jLT5tYXhfdGhyZWFkcykpKSB7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJZ290byBlcnI7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBCSU5ERVJfU0VUX0NPTlRFWFRfTUdSOgorCQlpZiAoYmluZGVyX2NvbnRleHRfbWdyX25vZGUgIT0gTlVMTCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJiaW5kZXI6IEJJTkRFUl9TRVRfQ09OVEVYVF9NR1IgYWxyZWFkeSBzZXRcbiIpOworCQkJcmV0ID0gLUVCVVNZOworCQkJZ290byBlcnI7CisJCX0KKwkJaWYgKGJpbmRlcl9jb250ZXh0X21ncl91aWQgIT0gLTEpIHsKKwkJCWlmIChiaW5kZXJfY29udGV4dF9tZ3JfdWlkICE9IGN1cnJlbnQtPmNyZWQtPmV1aWQpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgImJpbmRlcjogQklOREVSX1NFVF8iCisJCQkJICAgICAgICJDT05URVhUX01HUiBiYWQgdWlkICVkICE9ICVkXG4iLAorCQkJCSAgICAgICBjdXJyZW50LT5jcmVkLT5ldWlkLAorCQkJCSAgICAgICBiaW5kZXJfY29udGV4dF9tZ3JfdWlkKTsKKwkJCQlyZXQgPSAtRVBFUk07CisJCQkJZ290byBlcnI7CisJCQl9CisJCX0gZWxzZQorCQkJYmluZGVyX2NvbnRleHRfbWdyX3VpZCA9IGN1cnJlbnQtPmNyZWQtPmV1aWQ7CisJCWJpbmRlcl9jb250ZXh0X21ncl9ub2RlID0gYmluZGVyX25ld19ub2RlKHByb2MsIE5VTEwsIE5VTEwpOworCQlpZiAoYmluZGVyX2NvbnRleHRfbWdyX25vZGUgPT0gTlVMTCkgeworCQkJcmV0ID0gLUVOT01FTTsKKwkJCWdvdG8gZXJyOworCQl9CisJCWJpbmRlcl9jb250ZXh0X21ncl9ub2RlLT5sb2NhbF93ZWFrX3JlZnMrKzsKKwkJYmluZGVyX2NvbnRleHRfbWdyX25vZGUtPmxvY2FsX3N0cm9uZ19yZWZzKys7CisJCWJpbmRlcl9jb250ZXh0X21ncl9ub2RlLT5oYXNfc3Ryb25nX3JlZiA9IDE7CisJCWJpbmRlcl9jb250ZXh0X21ncl9ub2RlLT5oYXNfd2Vha19yZWYgPSAxOworCQlicmVhazsKKwljYXNlIEJJTkRFUl9USFJFQURfRVhJVDoKKwkJaWYgKGJpbmRlcl9kZWJ1Z19tYXNrICYgQklOREVSX0RFQlVHX1RIUkVBRFMpCisJCQlwcmludGsoS0VSTl9JTkZPICJiaW5kZXI6ICVkOiVkIGV4aXRcbiIsCisJCQkgICAgICAgcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCk7CisJCWJpbmRlcl9mcmVlX3RocmVhZChwcm9jLCB0aHJlYWQpOworCQl0aHJlYWQgPSBOVUxMOworCQlicmVhazsKKwljYXNlIEJJTkRFUl9WRVJTSU9OOgorCQlpZiAoc2l6ZSAhPSBzaXplb2Yoc3RydWN0IGJpbmRlcl92ZXJzaW9uKSkgeworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWdvdG8gZXJyOworCQl9CisJCWlmIChwdXRfdXNlcihCSU5ERVJfQ1VSUkVOVF9QUk9UT0NPTF9WRVJTSU9OLCAmKChzdHJ1Y3QgYmluZGVyX3ZlcnNpb24gKil1YnVmKS0+cHJvdG9jb2xfdmVyc2lvbikpIHsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIGVycjsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGVycjsKKwl9CisJcmV0ID0gMDsKK2VycjoKKwlpZiAodGhyZWFkKQorCQl0aHJlYWQtPmxvb3BlciAmPSB+QklOREVSX0xPT1BFUl9TVEFURV9ORUVEX1JFVFVSTjsKKwltdXRleF91bmxvY2soJmJpbmRlcl9sb2NrKTsKKwl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoYmluZGVyX3VzZXJfZXJyb3Jfd2FpdCwgYmluZGVyX3N0b3Bfb25fdXNlcl9lcnJvciA8IDIpOworCWlmIChyZXQgJiYgcmV0ICE9IC1FUkVTVEFSVFNZUykKKwkJcHJpbnRrKEtFUk5fSU5GTyAiYmluZGVyOiAlZDolZCBpb2N0bCAleCAlbHggcmV0dXJuZWQgJWRcbiIsIHByb2MtPnBpZCwgY3VycmVudC0+cGlkLCBjbWQsIGFyZywgcmV0KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBiaW5kZXJfdm1hX29wZW4oc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJc3RydWN0IGJpbmRlcl9wcm9jICpwcm9jID0gdm1hLT52bV9wcml2YXRlX2RhdGE7CisJaWYgKGJpbmRlcl9kZWJ1Z19tYXNrICYgQklOREVSX0RFQlVHX09QRU5fQ0xPU0UpCisJCXByaW50ayhLRVJOX0lORk8gImJpbmRlcjogJWQgb3BlbiB2bSBhcmVhICVseC0lbHggKCVsZCBLKSB2bWEgJWx4IHBhZ2VwICVseFxuIiwgcHJvYy0+cGlkLCB2bWEtPnZtX3N0YXJ0LCB2bWEtPnZtX2VuZCwgKHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydCkgLyBTWl8xSywgdm1hLT52bV9mbGFncywgdm1hLT52bV9wYWdlX3Byb3QucGdwcm90KTsKKwlkdW1wX3N0YWNrKCk7Cit9CitzdGF0aWMgdm9pZCBiaW5kZXJfdm1hX2Nsb3NlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQoreworCXN0cnVjdCBiaW5kZXJfcHJvYyAqcHJvYyA9IHZtYS0+dm1fcHJpdmF0ZV9kYXRhOworCWlmIChiaW5kZXJfZGVidWdfbWFzayAmIEJJTkRFUl9ERUJVR19PUEVOX0NMT1NFKQorCQlwcmludGsoS0VSTl9JTkZPICJiaW5kZXI6ICVkIGNsb3NlIHZtIGFyZWEgJWx4LSVseCAoJWxkIEspIHZtYSAlbHggcGFnZXAgJWx4XG4iLCBwcm9jLT5waWQsIHZtYS0+dm1fc3RhcnQsIHZtYS0+dm1fZW5kLCAodm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0KSAvIFNaXzFLLCB2bWEtPnZtX2ZsYWdzLCB2bWEtPnZtX3BhZ2VfcHJvdC5wZ3Byb3QpOworCXByb2MtPnZtYSA9IE5VTEw7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgdm1fb3BlcmF0aW9uc19zdHJ1Y3QgYmluZGVyX3ZtX29wcyA9IHsKKwkub3BlbiA9IGJpbmRlcl92bWFfb3BlbiwKKwkuY2xvc2UgPSBiaW5kZXJfdm1hX2Nsb3NlLAorfTsKKworc3RhdGljIGludCBiaW5kZXJfbW1hcChzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJaW50IHJldDsKKwlzdHJ1Y3Qgdm1fc3RydWN0ICphcmVhOworCXN0cnVjdCBiaW5kZXJfcHJvYyAqcHJvYyA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwljb25zdCBjaGFyICpmYWlsdXJlX3N0cmluZzsKKwlzdHJ1Y3QgYmluZGVyX2J1ZmZlciAqYnVmZmVyOworCisJaWYgKCh2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQpID4gU1pfNE0pCisJCXZtYS0+dm1fZW5kID0gdm1hLT52bV9zdGFydCArIFNaXzRNOworCisJaWYgKGJpbmRlcl9kZWJ1Z19tYXNrICYgQklOREVSX0RFQlVHX09QRU5fQ0xPU0UpCisJCXByaW50ayhLRVJOX0lORk8gImJpbmRlcl9tbWFwOiAlZCAlbHgtJWx4ICglbGQgSykgdm1hICVseCBwYWdlcCAlbHhcbiIsIHByb2MtPnBpZCwgdm1hLT52bV9zdGFydCwgdm1hLT52bV9lbmQsICh2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQpIC8gU1pfMUssIHZtYS0+dm1fZmxhZ3MsIHZtYS0+dm1fcGFnZV9wcm90LnBncHJvdCk7CisKKwlpZiAodm1hLT52bV9mbGFncyAmIEZPUkJJRERFTl9NTUFQX0ZMQUdTKSB7CisJCXJldCA9IC1FUEVSTTsKKwkJZmFpbHVyZV9zdHJpbmcgPSAiYmFkIHZtX2ZsYWdzIjsKKwkJZ290byBlcnJfYmFkX2FyZzsKKwl9CisJdm1hLT52bV9mbGFncyA9ICh2bWEtPnZtX2ZsYWdzIHwgVk1fRE9OVENPUFkpICYgflZNX01BWVdSSVRFOworCisJYXJlYSA9IGdldF92bV9hcmVhKHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydCwgVk1fSU9SRU1BUCk7CisJaWYgKGFyZWEgPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlmYWlsdXJlX3N0cmluZyA9ICJnZXRfdm1fYXJlYSI7CisJCWdvdG8gZXJyX2dldF92bV9hcmVhX2ZhaWxlZDsKKwl9CisJcHJvYy0+YnVmZmVyID0gYXJlYS0+YWRkcjsKKwlwcm9jLT51c2VyX2J1ZmZlcl9vZmZzZXQgPSB2bWEtPnZtX3N0YXJ0IC0gKHNpemVfdClwcm9jLT5idWZmZXI7CisKKyNpZmRlZiBDT05GSUdfQ1BVX0NBQ0hFX1ZJUFQKKwlpZiAoY2FjaGVfaXNfdmlwdF9hbGlhc2luZygpKSB7CisJCXdoaWxlIChDQUNIRV9DT0xPVVIoKHZtYS0+dm1fc3RhcnQgXiAodWludDMyX3QpcHJvYy0+YnVmZmVyKSkpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gImJpbmRlcl9tbWFwOiAlZCAlbHgtJWx4IG1hcHMgJXAgYmFkIGFsaWdubWVudFxuIiwgcHJvYy0+cGlkLCB2bWEtPnZtX3N0YXJ0LCB2bWEtPnZtX2VuZCwgcHJvYy0+YnVmZmVyKTsKKwkJCXZtYS0+dm1fc3RhcnQgKz0gUEFHRV9TSVpFOworCQl9CisJfQorI2VuZGlmCisJcHJvYy0+cGFnZXMgPSBremFsbG9jKHNpemVvZihwcm9jLT5wYWdlc1swXSkgKiAoKHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydCkgLyBQQUdFX1NJWkUpLCBHRlBfS0VSTkVMKTsKKwlpZiAocHJvYy0+cGFnZXMgPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlmYWlsdXJlX3N0cmluZyA9ICJhbGxvYyBwYWdlIGFycmF5IjsKKwkJZ290byBlcnJfYWxsb2NfcGFnZXNfZmFpbGVkOworCX0KKwlwcm9jLT5idWZmZXJfc2l6ZSA9IHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydDsKKworCXZtYS0+dm1fb3BzID0gJmJpbmRlcl92bV9vcHM7CisJdm1hLT52bV9wcml2YXRlX2RhdGEgPSBwcm9jOworCisJaWYgKGJpbmRlcl91cGRhdGVfcGFnZV9yYW5nZShwcm9jLCAxLCBwcm9jLT5idWZmZXIsIHByb2MtPmJ1ZmZlciArIFBBR0VfU0laRSwgdm1hKSkgeworCQlyZXQgPSAtRU5PTUVNOworCQlmYWlsdXJlX3N0cmluZyA9ICJhbGxvYyBzbWFsbCBidWYiOworCQlnb3RvIGVycl9hbGxvY19zbWFsbF9idWZfZmFpbGVkOworCX0KKwlidWZmZXIgPSBwcm9jLT5idWZmZXI7CisJSU5JVF9MSVNUX0hFQUQoJnByb2MtPmJ1ZmZlcnMpOworCWxpc3RfYWRkKCZidWZmZXItPmVudHJ5LCAmcHJvYy0+YnVmZmVycyk7CisJYnVmZmVyLT5mcmVlID0gMTsKKwliaW5kZXJfaW5zZXJ0X2ZyZWVfYnVmZmVyKHByb2MsIGJ1ZmZlcik7CisJcHJvYy0+ZnJlZV9hc3luY19zcGFjZSA9IHByb2MtPmJ1ZmZlcl9zaXplIC8gMjsKKwliYXJyaWVyKCk7CisJcHJvYy0+dm1hID0gdm1hOworCisJLypwcmludGsoS0VSTl9JTkZPICJiaW5kZXJfbW1hcDogJWQgJWx4LSVseCBtYXBzICVwXG4iLCBwcm9jLT5waWQsIHZtYS0+dm1fc3RhcnQsIHZtYS0+dm1fZW5kLCBwcm9jLT5idWZmZXIpOyovCisJcmV0dXJuIDA7CisKK2Vycl9hbGxvY19zbWFsbF9idWZfZmFpbGVkOgorCWtmcmVlKHByb2MtPnBhZ2VzKTsKK2Vycl9hbGxvY19wYWdlc19mYWlsZWQ6CisJdmZyZWUocHJvYy0+YnVmZmVyKTsKK2Vycl9nZXRfdm1fYXJlYV9mYWlsZWQ6CisJbXV0ZXhfdW5sb2NrKCZiaW5kZXJfbG9jayk7CitlcnJfYmFkX2FyZzoKKwlwcmludGsoS0VSTl9FUlIgImJpbmRlcl9tbWFwOiAlZCAlbHgtJWx4ICVzIGZhaWxlZCAlZFxuIiwgcHJvYy0+cGlkLCB2bWEtPnZtX3N0YXJ0LCB2bWEtPnZtX2VuZCwgZmFpbHVyZV9zdHJpbmcsIHJldCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBiaW5kZXJfb3BlbihzdHJ1Y3QgaW5vZGUgKm5vZHAsIHN0cnVjdCBmaWxlICpmaWxwKQoreworCXN0cnVjdCBiaW5kZXJfcHJvYyAqcHJvYzsKKworCWlmIChiaW5kZXJfZGVidWdfbWFzayAmIEJJTkRFUl9ERUJVR19PUEVOX0NMT1NFKQorCQlwcmludGsoS0VSTl9JTkZPICJiaW5kZXJfb3BlbjogJWQ6JWRcbiIsIGN1cnJlbnQtPmdyb3VwX2xlYWRlci0+cGlkLCBjdXJyZW50LT5waWQpOworCisJcHJvYyA9IGt6YWxsb2Moc2l6ZW9mKCpwcm9jKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHByb2MgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisJZ2V0X3Rhc2tfc3RydWN0KGN1cnJlbnQpOworCXByb2MtPnRzayA9IGN1cnJlbnQ7CisJSU5JVF9MSVNUX0hFQUQoJnByb2MtPnRvZG8pOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnByb2MtPndhaXQpOworCXByb2MtPmRlZmF1bHRfcHJpb3JpdHkgPSB0YXNrX25pY2UoY3VycmVudCk7CisJbXV0ZXhfbG9jaygmYmluZGVyX2xvY2spOworCWJpbmRlcl9zdGF0cy5vYmpfY3JlYXRlZFtCSU5ERVJfU1RBVF9QUk9DXSsrOworCWhsaXN0X2FkZF9oZWFkKCZwcm9jLT5wcm9jX25vZGUsICZiaW5kZXJfcHJvY3MpOworCXByb2MtPnBpZCA9IGN1cnJlbnQtPmdyb3VwX2xlYWRlci0+cGlkOworCUlOSVRfTElTVF9IRUFEKCZwcm9jLT5kZWxpdmVyZWRfZGVhdGgpOworCWZpbHAtPnByaXZhdGVfZGF0YSA9IHByb2M7CisJbXV0ZXhfdW5sb2NrKCZiaW5kZXJfbG9jayk7CisKKwlpZiAoYmluZGVyX3Byb2NfZGlyX2VudHJ5X3Byb2MpIHsKKwkJY2hhciBzdHJidWZbMTFdOworCQlzbnByaW50ZihzdHJidWYsIHNpemVvZihzdHJidWYpLCAiJXUiLCBwcm9jLT5waWQpOworCQljcmVhdGVfcHJvY19yZWFkX2VudHJ5KHN0cmJ1ZiwgU19JUlVHTywgYmluZGVyX3Byb2NfZGlyX2VudHJ5X3Byb2MsIGJpbmRlcl9yZWFkX3Byb2NfcHJvYywgcHJvYyk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYmluZGVyX2ZsdXNoKHN0cnVjdCBmaWxlICpmaWxwLCBmbF9vd25lcl90IGlkKQoreworCXN0cnVjdCByYl9ub2RlICpuOworCXN0cnVjdCBiaW5kZXJfcHJvYyAqcHJvYyA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlpbnQgd2FrZV9jb3VudCA9IDA7CisKKwltdXRleF9sb2NrKCZiaW5kZXJfbG9jayk7CisJZm9yIChuID0gcmJfZmlyc3QoJnByb2MtPnRocmVhZHMpOyBuICE9IE5VTEw7IG4gPSByYl9uZXh0KG4pKSB7CisJCXN0cnVjdCBiaW5kZXJfdGhyZWFkICp0aHJlYWQgPSByYl9lbnRyeShuLCBzdHJ1Y3QgYmluZGVyX3RocmVhZCwgcmJfbm9kZSk7CisJCXRocmVhZC0+bG9vcGVyIHw9IEJJTkRFUl9MT09QRVJfU1RBVEVfTkVFRF9SRVRVUk47CisJCWlmICh0aHJlYWQtPmxvb3BlciAmIEJJTkRFUl9MT09QRVJfU1RBVEVfV0FJVElORykgeworCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ0aHJlYWQtPndhaXQpOworCQkJd2FrZV9jb3VudCsrOworCQl9CisJfQorCXdha2VfdXBfaW50ZXJydXB0aWJsZV9hbGwoJnByb2MtPndhaXQpOworCW11dGV4X3VubG9jaygmYmluZGVyX2xvY2spOworCisJaWYgKGJpbmRlcl9kZWJ1Z19tYXNrICYgQklOREVSX0RFQlVHX09QRU5fQ0xPU0UpCisJCXByaW50ayhLRVJOX0lORk8gImJpbmRlcl9mbHVzaDogJWQgd29rZSAlZCB0aHJlYWRzXG4iLCBwcm9jLT5waWQsIHdha2VfY291bnQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYmluZGVyX3JlbGVhc2Uoc3RydWN0IGlub2RlICpub2RwLCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqcG9zOworCXN0cnVjdCBiaW5kZXJfdHJhbnNhY3Rpb24gKnQ7CisJc3RydWN0IHJiX25vZGUgKm47CisJc3RydWN0IGJpbmRlcl9wcm9jICpwcm9jID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCWludCB0aHJlYWRzLCBub2RlcywgaW5jb21pbmdfcmVmcywgb3V0Z29pbmdfcmVmcywgYnVmZmVycywgYWN0aXZlX3RyYW5zYWN0aW9ucywgcGFnZV9jb3VudDsKKworCWlmIChiaW5kZXJfcHJvY19kaXJfZW50cnlfcHJvYykgeworCQljaGFyIHN0cmJ1ZlsxMV07CisJCXNucHJpbnRmKHN0cmJ1Ziwgc2l6ZW9mKHN0cmJ1ZiksICIldSIsIHByb2MtPnBpZCk7CisJCXJlbW92ZV9wcm9jX2VudHJ5KHN0cmJ1ZiwgYmluZGVyX3Byb2NfZGlyX2VudHJ5X3Byb2MpOworCX0KKwltdXRleF9sb2NrKCZiaW5kZXJfbG9jayk7CisJaGxpc3RfZGVsKCZwcm9jLT5wcm9jX25vZGUpOworCWlmIChiaW5kZXJfY29udGV4dF9tZ3Jfbm9kZSAmJiBiaW5kZXJfY29udGV4dF9tZ3Jfbm9kZS0+cHJvYyA9PSBwcm9jKSB7CisJCWlmIChiaW5kZXJfZGVidWdfbWFzayAmIEJJTkRFUl9ERUJVR19ERUFEX0JJTkRFUikKKwkJCXByaW50ayhLRVJOX0lORk8gImJpbmRlcl9yZWxlYXNlOiAlZCBjb250ZXh0X21ncl9ub2RlIGdvbmVcbiIsIHByb2MtPnBpZCk7CisJCWJpbmRlcl9jb250ZXh0X21ncl9ub2RlID0gTlVMTDsKKwl9CisKKwl0aHJlYWRzID0gMDsKKwlhY3RpdmVfdHJhbnNhY3Rpb25zID0gMDsKKwl3aGlsZSAoKG4gPSByYl9maXJzdCgmcHJvYy0+dGhyZWFkcykpKSB7CisJCXN0cnVjdCBiaW5kZXJfdGhyZWFkICp0aHJlYWQgPSByYl9lbnRyeShuLCBzdHJ1Y3QgYmluZGVyX3RocmVhZCwgcmJfbm9kZSk7CisJCXRocmVhZHMrKzsKKwkJYWN0aXZlX3RyYW5zYWN0aW9ucyArPSBiaW5kZXJfZnJlZV90aHJlYWQocHJvYywgdGhyZWFkKTsKKwl9CisJbm9kZXMgPSAwOworCWluY29taW5nX3JlZnMgPSAwOworCXdoaWxlICgobiA9IHJiX2ZpcnN0KCZwcm9jLT5ub2RlcykpKSB7CisJCXN0cnVjdCBiaW5kZXJfbm9kZSAqbm9kZSA9IHJiX2VudHJ5KG4sIHN0cnVjdCBiaW5kZXJfbm9kZSwgcmJfbm9kZSk7CisKKwkJbm9kZXMrKzsKKwkJcmJfZXJhc2UoJm5vZGUtPnJiX25vZGUsICZwcm9jLT5ub2Rlcyk7CisJCWxpc3RfZGVsX2luaXQoJm5vZGUtPndvcmsuZW50cnkpOworCQlpZiAoaGxpc3RfZW1wdHkoJm5vZGUtPnJlZnMpKSB7CisJCQlrZnJlZShub2RlKTsKKwkJCWJpbmRlcl9zdGF0cy5vYmpfZGVsZXRlZFtCSU5ERVJfU1RBVF9OT0RFXSsrOworCQl9IGVsc2UgeworCQkJc3RydWN0IGJpbmRlcl9yZWYgKnJlZjsKKwkJCWludCBkZWF0aCA9IDA7CisKKwkJCW5vZGUtPnByb2MgPSBOVUxMOworCQkJbm9kZS0+bG9jYWxfc3Ryb25nX3JlZnMgPSAwOworCQkJbm9kZS0+bG9jYWxfd2Vha19yZWZzID0gMDsKKwkJCWhsaXN0X2FkZF9oZWFkKCZub2RlLT5kZWFkX25vZGUsICZiaW5kZXJfZGVhZF9ub2Rlcyk7CisKKwkJCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KHJlZiwgcG9zLCAmbm9kZS0+cmVmcywgbm9kZV9lbnRyeSkgeworCQkJCWluY29taW5nX3JlZnMrKzsKKwkJCQlpZiAocmVmLT5kZWF0aCkgeworCQkJCQlkZWF0aCsrOworCQkJCQlpZiAobGlzdF9lbXB0eSgmcmVmLT5kZWF0aC0+d29yay5lbnRyeSkpIHsKKwkJCQkJCXJlZi0+ZGVhdGgtPndvcmsudHlwZSA9IEJJTkRFUl9XT1JLX0RFQURfQklOREVSOworCQkJCQkJbGlzdF9hZGRfdGFpbCgmcmVmLT5kZWF0aC0+d29yay5lbnRyeSwgJnJlZi0+cHJvYy0+dG9kbyk7CisJCQkJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnJlZi0+cHJvYy0+d2FpdCk7CisJCQkJCX0gZWxzZQorCQkJCQkJQlVHKCk7CisJCQkJfQorCQkJfQorCQkJaWYgKGJpbmRlcl9kZWJ1Z19tYXNrICYgQklOREVSX0RFQlVHX0RFQURfQklOREVSKQorCQkJCXByaW50ayhLRVJOX0lORk8gImJpbmRlcjogbm9kZSAlZCBub3cgZGVhZCwgcmVmcyAlZCwgZGVhdGggJWRcbiIsIG5vZGUtPmRlYnVnX2lkLCBpbmNvbWluZ19yZWZzLCBkZWF0aCk7CisJCX0KKwl9CisJb3V0Z29pbmdfcmVmcyA9IDA7CisJd2hpbGUgKChuID0gcmJfZmlyc3QoJnByb2MtPnJlZnNfYnlfZGVzYykpKSB7CisJCXN0cnVjdCBiaW5kZXJfcmVmICpyZWYgPSByYl9lbnRyeShuLCBzdHJ1Y3QgYmluZGVyX3JlZiwgcmJfbm9kZV9kZXNjKTsKKwkJb3V0Z29pbmdfcmVmcysrOworCQliaW5kZXJfZGVsZXRlX3JlZihyZWYpOworCX0KKwliaW5kZXJfcmVsZWFzZV93b3JrKCZwcm9jLT50b2RvKTsKKwlidWZmZXJzID0gMDsKKworCXdoaWxlICgobiA9IHJiX2ZpcnN0KCZwcm9jLT5hbGxvY2F0ZWRfYnVmZmVycykpKSB7CisJCXN0cnVjdCBiaW5kZXJfYnVmZmVyICpidWZmZXIgPSByYl9lbnRyeShuLCBzdHJ1Y3QgYmluZGVyX2J1ZmZlciwgcmJfbm9kZSk7CisJCXQgPSBidWZmZXItPnRyYW5zYWN0aW9uOworCQlpZiAodCkgeworCQkJdC0+YnVmZmVyID0gTlVMTDsKKwkJCWJ1ZmZlci0+dHJhbnNhY3Rpb24gPSBOVUxMOworCQkJcHJpbnRrKEtFUk5fRVJSICJiaW5kZXI6IHJlbGVhc2UgcHJvYyAlZCwgdHJhbnNhY3Rpb24gJWQsIG5vdCBmcmVlZFxuIiwgcHJvYy0+cGlkLCB0LT5kZWJ1Z19pZCk7CisJCQkvKkJVRygpOyovCisJCX0KKwkJYmluZGVyX2ZyZWVfYnVmKHByb2MsIGJ1ZmZlcik7CisJCWJ1ZmZlcnMrKzsKKwl9CisKKwliaW5kZXJfc3RhdHMub2JqX2RlbGV0ZWRbQklOREVSX1NUQVRfUFJPQ10rKzsKKwltdXRleF91bmxvY2soJmJpbmRlcl9sb2NrKTsKKworCXBhZ2VfY291bnQgPSAwOworCWlmIChwcm9jLT5wYWdlcykgeworCQlpbnQgaTsKKwkJZm9yIChpID0gMDsgaSA8IHByb2MtPmJ1ZmZlcl9zaXplIC8gUEFHRV9TSVpFOyBpKyspIHsKKwkJCWlmIChwcm9jLT5wYWdlc1tpXSkgeworCQkJCWlmIChiaW5kZXJfZGVidWdfbWFzayAmIEJJTkRFUl9ERUJVR19CVUZGRVJfQUxMT0MpCisJCQkJCXByaW50ayhLRVJOX0lORk8gImJpbmRlcl9yZWxlYXNlOiAlZDogcGFnZSAlZCBhdCAlcCBub3QgZnJlZWRcbiIsIHByb2MtPnBpZCwgaSwgcHJvYy0+YnVmZmVyICsgaSAqIFBBR0VfU0laRSk7CisJCQkJX19mcmVlX3BhZ2UocHJvYy0+cGFnZXNbaV0pOworCQkJCXBhZ2VfY291bnQrKzsKKwkJCX0KKwkJfQorCQlrZnJlZShwcm9jLT5wYWdlcyk7CisJCXZmcmVlKHByb2MtPmJ1ZmZlcik7CisJfQorCisJcHV0X3Rhc2tfc3RydWN0KHByb2MtPnRzayk7CisKKwlpZiAoYmluZGVyX2RlYnVnX21hc2sgJiBCSU5ERVJfREVCVUdfT1BFTl9DTE9TRSkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiYmluZGVyX3JlbGVhc2U6ICVkIHRocmVhZHMgJWQsIG5vZGVzICVkIChyZWYgJWQpLCByZWZzICVkLCBhY3RpdmUgdHJhbnNhY3Rpb25zICVkLCBidWZmZXJzICVkLCBwYWdlcyAlZFxuIiwKKwkJICAgICAgIHByb2MtPnBpZCwgdGhyZWFkcywgbm9kZXMsIGluY29taW5nX3JlZnMsIG91dGdvaW5nX3JlZnMsIGFjdGl2ZV90cmFuc2FjdGlvbnMsIGJ1ZmZlcnMsIHBhZ2VfY291bnQpOworCisJa2ZyZWUocHJvYyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjaGFyICpwcmludF9iaW5kZXJfdHJhbnNhY3Rpb24oY2hhciAqYnVmLCBjaGFyICplbmQsIGNvbnN0IGNoYXIgKnByZWZpeCwgc3RydWN0IGJpbmRlcl90cmFuc2FjdGlvbiAqdCkKK3sKKwlidWYgKz0gc25wcmludGYoYnVmLCBlbmQgLSBidWYsICIlcyAlZDogJXAgZnJvbSAlZDolZCB0byAlZDolZCBjb2RlICV4IGZsYWdzICV4IHByaSAlbGQgciVkIiwKKwkJCXByZWZpeCwgdC0+ZGVidWdfaWQsIHQsIHQtPmZyb20gPyB0LT5mcm9tLT5wcm9jLT5waWQgOiAwLAorCQkJdC0+ZnJvbSA/IHQtPmZyb20tPnBpZCA6IDAsCisJCQl0LT50b19wcm9jID8gdC0+dG9fcHJvYy0+cGlkIDogMCwKKwkJCXQtPnRvX3RocmVhZCA/IHQtPnRvX3RocmVhZC0+cGlkIDogMCwKKwkJCXQtPmNvZGUsIHQtPmZsYWdzLCB0LT5wcmlvcml0eSwgdC0+bmVlZF9yZXBseSk7CisJaWYgKGJ1ZiA+PSBlbmQpCisJCXJldHVybiBidWY7CisJaWYgKHQtPmJ1ZmZlciA9PSBOVUxMKSB7CisJCWJ1ZiArPSBzbnByaW50ZihidWYsIGVuZCAtIGJ1ZiwgIiBidWZmZXIgZnJlZVxuIik7CisJCXJldHVybiBidWY7CisJfQorCWlmICh0LT5idWZmZXItPnRhcmdldF9ub2RlKSB7CisJCWJ1ZiArPSBzbnByaW50ZihidWYsIGVuZCAtIGJ1ZiwgIiBub2RlICVkIiwKKwkJCQl0LT5idWZmZXItPnRhcmdldF9ub2RlLT5kZWJ1Z19pZCk7CisJCWlmIChidWYgPj0gZW5kKQorCQkJcmV0dXJuIGJ1ZjsKKwl9CisJYnVmICs9IHNucHJpbnRmKGJ1ZiwgZW5kIC0gYnVmLCAiIHNpemUgJXpkOiV6ZCBkYXRhICVwXG4iLAorCQkJdC0+YnVmZmVyLT5kYXRhX3NpemUsIHQtPmJ1ZmZlci0+b2Zmc2V0c19zaXplLAorCQkJdC0+YnVmZmVyLT5kYXRhKTsKKwlyZXR1cm4gYnVmOworfQorCitzdGF0aWMgY2hhciAqcHJpbnRfYmluZGVyX2J1ZmZlcihjaGFyICpidWYsIGNoYXIgKmVuZCwgY29uc3QgY2hhciAqcHJlZml4LCBzdHJ1Y3QgYmluZGVyX2J1ZmZlciAqYnVmZmVyKQoreworCWJ1ZiArPSBzbnByaW50ZihidWYsIGVuZCAtIGJ1ZiwgIiVzICVkOiAlcCBzaXplICV6ZDolemQgJXNcbiIsCisJCQlwcmVmaXgsIGJ1ZmZlci0+ZGVidWdfaWQsIGJ1ZmZlci0+ZGF0YSwKKwkJCWJ1ZmZlci0+ZGF0YV9zaXplLCBidWZmZXItPm9mZnNldHNfc2l6ZSwKKwkJCWJ1ZmZlci0+dHJhbnNhY3Rpb24gPyAiYWN0aXZlIiA6ICJkZWxpdmVyZWQiKTsKKwlyZXR1cm4gYnVmOworfQorCitzdGF0aWMgY2hhciAqcHJpbnRfYmluZGVyX3dvcmsoY2hhciAqYnVmLCBjaGFyICplbmQsIGNvbnN0IGNoYXIgKnByZWZpeCwKKwljb25zdCBjaGFyICp0cmFuc2FjdGlvbl9wcmVmaXgsIHN0cnVjdCBiaW5kZXJfd29yayAqdykKK3sKKwlzdHJ1Y3QgYmluZGVyX25vZGUgKm5vZGU7CisJc3RydWN0IGJpbmRlcl90cmFuc2FjdGlvbiAqdDsKKworCXN3aXRjaCAody0+dHlwZSkgeworCWNhc2UgQklOREVSX1dPUktfVFJBTlNBQ1RJT046CisJCXQgPSBjb250YWluZXJfb2Yodywgc3RydWN0IGJpbmRlcl90cmFuc2FjdGlvbiwgd29yayk7CisJCWJ1ZiA9IHByaW50X2JpbmRlcl90cmFuc2FjdGlvbihidWYsIGVuZCwgdHJhbnNhY3Rpb25fcHJlZml4LCB0KTsKKwkJYnJlYWs7CisJY2FzZSBCSU5ERVJfV09SS19UUkFOU0FDVElPTl9DT01QTEVURToKKwkJYnVmICs9IHNucHJpbnRmKGJ1ZiwgZW5kIC0gYnVmLAorCQkJCSIlc3RyYW5zYWN0aW9uIGNvbXBsZXRlXG4iLCBwcmVmaXgpOworCQlicmVhazsKKwljYXNlIEJJTkRFUl9XT1JLX05PREU6CisJCW5vZGUgPSBjb250YWluZXJfb2Yodywgc3RydWN0IGJpbmRlcl9ub2RlLCB3b3JrKTsKKwkJYnVmICs9IHNucHJpbnRmKGJ1ZiwgZW5kIC0gYnVmLCAiJXNub2RlIHdvcmsgJWQ6IHUlcCBjJXBcbiIsCisJCQkJcHJlZml4LCBub2RlLT5kZWJ1Z19pZCwgbm9kZS0+cHRyLCBub2RlLT5jb29raWUpOworCQlicmVhazsKKwljYXNlIEJJTkRFUl9XT1JLX0RFQURfQklOREVSOgorCQlidWYgKz0gc25wcmludGYoYnVmLCBlbmQgLSBidWYsICIlc2hhcyBkZWFkIGJpbmRlclxuIiwgcHJlZml4KTsKKwkJYnJlYWs7CisJY2FzZSBCSU5ERVJfV09SS19ERUFEX0JJTkRFUl9BTkRfQ0xFQVI6CisJCWJ1ZiArPSBzbnByaW50ZihidWYsIGVuZCAtIGJ1ZiwKKwkJCQkiJXNoYXMgY2xlYXJlZCBkZWFkIGJpbmRlclxuIiwgcHJlZml4KTsKKwkJYnJlYWs7CisJY2FzZSBCSU5ERVJfV09SS19DTEVBUl9ERUFUSF9OT1RJRklDQVRJT046CisJCWJ1ZiArPSBzbnByaW50ZihidWYsIGVuZCAtIGJ1ZiwKKwkJCQkiJXNoYXMgY2xlYXJlZCBkZWF0aCBub3RpZmljYXRpb25cbiIsIHByZWZpeCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJ1ZiArPSBzbnByaW50ZihidWYsIGVuZCAtIGJ1ZiwgIiVzdW5rbm93biB3b3JrOiB0eXBlICVkXG4iLAorCQkJCXByZWZpeCwgdy0+dHlwZSk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gYnVmOworfQorCitzdGF0aWMgY2hhciAqcHJpbnRfYmluZGVyX3RocmVhZChjaGFyICpidWYsIGNoYXIgKmVuZCwgc3RydWN0IGJpbmRlcl90aHJlYWQgKnRocmVhZCwgaW50IHByaW50X2Fsd2F5cykKK3sKKwlzdHJ1Y3QgYmluZGVyX3RyYW5zYWN0aW9uICp0OworCXN0cnVjdCBiaW5kZXJfd29yayAqdzsKKwljaGFyICpzdGFydF9idWYgPSBidWY7CisJY2hhciAqaGVhZGVyX2J1ZjsKKworCWJ1ZiArPSBzbnByaW50ZihidWYsIGVuZCAtIGJ1ZiwgIiAgdGhyZWFkICVkOiBsICUwMnhcbiIsIHRocmVhZC0+cGlkLCB0aHJlYWQtPmxvb3Blcik7CisJaGVhZGVyX2J1ZiA9IGJ1ZjsKKwl0ID0gdGhyZWFkLT50cmFuc2FjdGlvbl9zdGFjazsKKwl3aGlsZSAodCkgeworCQlpZiAoYnVmID49IGVuZCkKKwkJCWJyZWFrOworCQlpZiAodC0+ZnJvbSA9PSB0aHJlYWQpIHsKKwkJCWJ1ZiA9IHByaW50X2JpbmRlcl90cmFuc2FjdGlvbihidWYsIGVuZCwgIiAgICBvdXRnb2luZyB0cmFuc2FjdGlvbiIsIHQpOworCQkJdCA9IHQtPmZyb21fcGFyZW50OworCQl9IGVsc2UgaWYgKHQtPnRvX3RocmVhZCA9PSB0aHJlYWQpIHsKKwkJCWJ1ZiA9IHByaW50X2JpbmRlcl90cmFuc2FjdGlvbihidWYsIGVuZCwgIiAgICBpbmNvbWluZyB0cmFuc2FjdGlvbiIsIHQpOworCQkJdCA9IHQtPnRvX3BhcmVudDsKKwkJfSBlbHNlIHsKKwkJCWJ1ZiA9IHByaW50X2JpbmRlcl90cmFuc2FjdGlvbihidWYsIGVuZCwgIiAgICBiYWQgdHJhbnNhY3Rpb24iLCB0KTsKKwkJCXQgPSBOVUxMOworCQl9CisJfQorCWxpc3RfZm9yX2VhY2hfZW50cnkodywgJnRocmVhZC0+dG9kbywgZW50cnkpIHsKKwkJaWYgKGJ1ZiA+PSBlbmQpCisJCQlicmVhazsKKwkJYnVmID0gcHJpbnRfYmluZGVyX3dvcmsoYnVmLCBlbmQsICIgICAgIiwKKwkJCQkJIiAgICBwZW5kaW5nIHRyYW5zYWN0aW9uIiwgdyk7CisJfQorCWlmICghcHJpbnRfYWx3YXlzICYmIGJ1ZiA9PSBoZWFkZXJfYnVmKQorCQlidWYgPSBzdGFydF9idWY7CisJcmV0dXJuIGJ1ZjsKK30KKworc3RhdGljIGNoYXIgKnByaW50X2JpbmRlcl9ub2RlKGNoYXIgKmJ1ZiwgY2hhciAqZW5kLCBzdHJ1Y3QgYmluZGVyX25vZGUgKm5vZGUpCit7CisJc3RydWN0IGJpbmRlcl9yZWYgKnJlZjsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqcG9zOworCXN0cnVjdCBiaW5kZXJfd29yayAqdzsKKwlpbnQgY291bnQ7CisJY291bnQgPSAwOworCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KHJlZiwgcG9zLCAmbm9kZS0+cmVmcywgbm9kZV9lbnRyeSkKKwkJY291bnQrKzsKKworCWJ1ZiArPSBzbnByaW50ZihidWYsIGVuZCAtIGJ1ZiwgIiAgbm9kZSAlZDogdSVwIGMlcCBocyAlZCBodyAlZCBscyAlZCBsdyAlZCBpcyAlZCBpdyAlZCIsCisJCQlub2RlLT5kZWJ1Z19pZCwgbm9kZS0+cHRyLCBub2RlLT5jb29raWUsCisJCQlub2RlLT5oYXNfc3Ryb25nX3JlZiwgbm9kZS0+aGFzX3dlYWtfcmVmLAorCQkJbm9kZS0+bG9jYWxfc3Ryb25nX3JlZnMsIG5vZGUtPmxvY2FsX3dlYWtfcmVmcywKKwkJCW5vZGUtPmludGVybmFsX3N0cm9uZ19yZWZzLCBjb3VudCk7CisJaWYgKGJ1ZiA+PSBlbmQpCisJCXJldHVybiBidWY7CisJaWYgKGNvdW50KSB7CisJCWJ1ZiArPSBzbnByaW50ZihidWYsIGVuZCAtIGJ1ZiwgIiBwcm9jIik7CisJCWlmIChidWYgPj0gZW5kKQorCQkJcmV0dXJuIGJ1ZjsKKwkJaGxpc3RfZm9yX2VhY2hfZW50cnkocmVmLCBwb3MsICZub2RlLT5yZWZzLCBub2RlX2VudHJ5KSB7CisJCQlidWYgKz0gc25wcmludGYoYnVmLCBlbmQgLSBidWYsICIgJWQiLCByZWYtPnByb2MtPnBpZCk7CisJCQlpZiAoYnVmID49IGVuZCkKKwkJCQlyZXR1cm4gYnVmOworCQl9CisJfQorCWJ1ZiArPSBzbnByaW50ZihidWYsIGVuZCAtIGJ1ZiwgIlxuIik7CisJbGlzdF9mb3JfZWFjaF9lbnRyeSh3LCAmbm9kZS0+YXN5bmNfdG9kbywgZW50cnkpIHsKKwkJaWYgKGJ1ZiA+PSBlbmQpCisJCQlicmVhazsKKwkJYnVmID0gcHJpbnRfYmluZGVyX3dvcmsoYnVmLCBlbmQsICIgICAgIiwKKwkJCQkJIiAgICBwZW5kaW5nIGFzeW5jIHRyYW5zYWN0aW9uIiwgdyk7CisJfQorCXJldHVybiBidWY7Cit9CisKK3N0YXRpYyBjaGFyICpwcmludF9iaW5kZXJfcmVmKGNoYXIgKmJ1ZiwgY2hhciAqZW5kLCBzdHJ1Y3QgYmluZGVyX3JlZiAqcmVmKQoreworCWJ1ZiArPSBzbnByaW50ZihidWYsIGVuZCAtIGJ1ZiwgIiAgcmVmICVkOiBkZXNjICVkICVzbm9kZSAlZCBzICVkIHcgJWQgZCAlcFxuIiwKKwkJCXJlZi0+ZGVidWdfaWQsIHJlZi0+ZGVzYywgcmVmLT5ub2RlLT5wcm9jID8gIiIgOiAiZGVhZCAiLAorCQkJcmVmLT5ub2RlLT5kZWJ1Z19pZCwgcmVmLT5zdHJvbmcsIHJlZi0+d2VhaywgcmVmLT5kZWF0aCk7CisJcmV0dXJuIGJ1ZjsKK30KKworc3RhdGljIGNoYXIgKnByaW50X2JpbmRlcl9wcm9jKGNoYXIgKmJ1ZiwgY2hhciAqZW5kLCBzdHJ1Y3QgYmluZGVyX3Byb2MgKnByb2MsIGludCBwcmludF9hbGwpCit7CisJc3RydWN0IGJpbmRlcl93b3JrICp3OworCXN0cnVjdCByYl9ub2RlICpuOworCWNoYXIgKnN0YXJ0X2J1ZiA9IGJ1ZjsKKwljaGFyICpoZWFkZXJfYnVmOworCisJYnVmICs9IHNucHJpbnRmKGJ1ZiwgZW5kIC0gYnVmLCAicHJvYyAlZFxuIiwgcHJvYy0+cGlkKTsKKwloZWFkZXJfYnVmID0gYnVmOworCisJZm9yIChuID0gcmJfZmlyc3QoJnByb2MtPnRocmVhZHMpOyBuICE9IE5VTEwgJiYgYnVmIDwgZW5kOyBuID0gcmJfbmV4dChuKSkKKwkJYnVmID0gcHJpbnRfYmluZGVyX3RocmVhZChidWYsIGVuZCwgcmJfZW50cnkobiwgc3RydWN0IGJpbmRlcl90aHJlYWQsIHJiX25vZGUpLCBwcmludF9hbGwpOworCWZvciAobiA9IHJiX2ZpcnN0KCZwcm9jLT5ub2Rlcyk7IG4gIT0gTlVMTCAmJiBidWYgPCBlbmQ7IG4gPSByYl9uZXh0KG4pKSB7CisJCXN0cnVjdCBiaW5kZXJfbm9kZSAqbm9kZSA9IHJiX2VudHJ5KG4sIHN0cnVjdCBiaW5kZXJfbm9kZSwgcmJfbm9kZSk7CisJCWlmIChwcmludF9hbGwgfHwgbm9kZS0+aGFzX2FzeW5jX3RyYW5zYWN0aW9uKQorCQkJYnVmID0gcHJpbnRfYmluZGVyX25vZGUoYnVmLCBlbmQsIG5vZGUpOworCX0KKwlpZiAocHJpbnRfYWxsKSB7CisJCWZvciAobiA9IHJiX2ZpcnN0KCZwcm9jLT5yZWZzX2J5X2Rlc2MpOyBuICE9IE5VTEwgJiYgYnVmIDwgZW5kOyBuID0gcmJfbmV4dChuKSkKKwkJCWJ1ZiA9IHByaW50X2JpbmRlcl9yZWYoYnVmLCBlbmQsIHJiX2VudHJ5KG4sIHN0cnVjdCBiaW5kZXJfcmVmLCByYl9ub2RlX2Rlc2MpKTsKKwl9CisJZm9yIChuID0gcmJfZmlyc3QoJnByb2MtPmFsbG9jYXRlZF9idWZmZXJzKTsgbiAhPSBOVUxMICYmIGJ1ZiA8IGVuZDsgbiA9IHJiX25leHQobikpCisJCWJ1ZiA9IHByaW50X2JpbmRlcl9idWZmZXIoYnVmLCBlbmQsICIgIGJ1ZmZlciIsIHJiX2VudHJ5KG4sIHN0cnVjdCBiaW5kZXJfYnVmZmVyLCByYl9ub2RlKSk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeSh3LCAmcHJvYy0+dG9kbywgZW50cnkpIHsKKwkJaWYgKGJ1ZiA+PSBlbmQpCisJCQlicmVhazsKKwkJYnVmID0gcHJpbnRfYmluZGVyX3dvcmsoYnVmLCBlbmQsICIgICIsCisJCQkJCSIgIHBlbmRpbmcgdHJhbnNhY3Rpb24iLCB3KTsKKwl9CisJbGlzdF9mb3JfZWFjaF9lbnRyeSh3LCAmcHJvYy0+ZGVsaXZlcmVkX2RlYXRoLCBlbnRyeSkgeworCQlpZiAoYnVmID49IGVuZCkKKwkJCWJyZWFrOworCQlidWYgKz0gc25wcmludGYoYnVmLCBlbmQgLSBidWYsICIgIGhhcyBkZWxpdmVyZWQgZGVhZCBiaW5kZXJcbiIpOworCQlicmVhazsKKwl9CisJaWYgKCFwcmludF9hbGwgJiYgYnVmID09IGhlYWRlcl9idWYpCisJCWJ1ZiA9IHN0YXJ0X2J1ZjsKKwlyZXR1cm4gYnVmOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqYmluZGVyX3JldHVybl9zdHJpbmdzW10gPSB7CisJIkJSX0VSUk9SIiwKKwkiQlJfT0siLAorCSJCUl9UUkFOU0FDVElPTiIsCisJIkJSX1JFUExZIiwKKwkiQlJfQUNRVUlSRV9SRVNVTFQiLAorCSJCUl9ERUFEX1JFUExZIiwKKwkiQlJfVFJBTlNBQ1RJT05fQ09NUExFVEUiLAorCSJCUl9JTkNSRUZTIiwKKwkiQlJfQUNRVUlSRSIsCisJIkJSX1JFTEVBU0UiLAorCSJCUl9ERUNSRUZTIiwKKwkiQlJfQVRURU1QVF9BQ1FVSVJFIiwKKwkiQlJfTk9PUCIsCisJIkJSX1NQQVdOX0xPT1BFUiIsCisJIkJSX0ZJTklTSEVEIiwKKwkiQlJfREVBRF9CSU5ERVIiLAorCSJCUl9DTEVBUl9ERUFUSF9OT1RJRklDQVRJT05fRE9ORSIsCisJIkJSX0ZBSUxFRF9SRVBMWSIKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICpiaW5kZXJfY29tbWFuZF9zdHJpbmdzW10gPSB7CisJIkJDX1RSQU5TQUNUSU9OIiwKKwkiQkNfUkVQTFkiLAorCSJCQ19BQ1FVSVJFX1JFU1VMVCIsCisJIkJDX0ZSRUVfQlVGRkVSIiwKKwkiQkNfSU5DUkVGUyIsCisJIkJDX0FDUVVJUkUiLAorCSJCQ19SRUxFQVNFIiwKKwkiQkNfREVDUkVGUyIsCisJIkJDX0lOQ1JFRlNfRE9ORSIsCisJIkJDX0FDUVVJUkVfRE9ORSIsCisJIkJDX0FUVEVNUFRfQUNRVUlSRSIsCisJIkJDX1JFR0lTVEVSX0xPT1BFUiIsCisJIkJDX0VOVEVSX0xPT1BFUiIsCisJIkJDX0VYSVRfTE9PUEVSIiwKKwkiQkNfUkVRVUVTVF9ERUFUSF9OT1RJRklDQVRJT04iLAorCSJCQ19DTEVBUl9ERUFUSF9OT1RJRklDQVRJT04iLAorCSJCQ19ERUFEX0JJTkRFUl9ET05FIgorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmJpbmRlcl9vYmpzdGF0X3N0cmluZ3NbXSA9IHsKKwkicHJvYyIsCisJInRocmVhZCIsCisJIm5vZGUiLAorCSJyZWYiLAorCSJkZWF0aCIsCisJInRyYW5zYWN0aW9uIiwKKwkidHJhbnNhY3Rpb25fY29tcGxldGUiCit9OworCitzdGF0aWMgY2hhciAqcHJpbnRfYmluZGVyX3N0YXRzKGNoYXIgKmJ1ZiwgY2hhciAqZW5kLCBjb25zdCBjaGFyICpwcmVmaXgsIHN0cnVjdCBiaW5kZXJfc3RhdHMgKnN0YXRzKQoreworCWludCBpOworCisJQlVJTERfQlVHX09OKEFSUkFZX1NJWkUoc3RhdHMtPmJjKSAhPSBBUlJBWV9TSVpFKGJpbmRlcl9jb21tYW5kX3N0cmluZ3MpKTsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzdGF0cy0+YmMpOyBpKyspIHsKKwkJaWYgKHN0YXRzLT5iY1tpXSkKKwkJCWJ1ZiArPSBzbnByaW50ZihidWYsIGVuZCAtIGJ1ZiwgIiVzJXM6ICVkXG4iLCBwcmVmaXgsCisJCQkJCWJpbmRlcl9jb21tYW5kX3N0cmluZ3NbaV0sIHN0YXRzLT5iY1tpXSk7CisJCWlmIChidWYgPj0gZW5kKQorCQkJcmV0dXJuIGJ1ZjsKKwl9CisKKwlCVUlMRF9CVUdfT04oQVJSQVlfU0laRShzdGF0cy0+YnIpICE9IEFSUkFZX1NJWkUoYmluZGVyX3JldHVybl9zdHJpbmdzKSk7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoc3RhdHMtPmJyKTsgaSsrKSB7CisJCWlmIChzdGF0cy0+YnJbaV0pCisJCQlidWYgKz0gc25wcmludGYoYnVmLCBlbmQgLSBidWYsICIlcyVzOiAlZFxuIiwgcHJlZml4LAorCQkJCQliaW5kZXJfcmV0dXJuX3N0cmluZ3NbaV0sIHN0YXRzLT5icltpXSk7CisJCWlmIChidWYgPj0gZW5kKQorCQkJcmV0dXJuIGJ1ZjsKKwl9CisKKwlCVUlMRF9CVUdfT04oQVJSQVlfU0laRShzdGF0cy0+b2JqX2NyZWF0ZWQpICE9IEFSUkFZX1NJWkUoYmluZGVyX29ianN0YXRfc3RyaW5ncykpOworCUJVSUxEX0JVR19PTihBUlJBWV9TSVpFKHN0YXRzLT5vYmpfY3JlYXRlZCkgIT0gQVJSQVlfU0laRShzdGF0cy0+b2JqX2RlbGV0ZWQpKTsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzdGF0cy0+b2JqX2NyZWF0ZWQpOyBpKyspIHsKKwkJaWYgKHN0YXRzLT5vYmpfY3JlYXRlZFtpXSB8fCBzdGF0cy0+b2JqX2RlbGV0ZWRbaV0pCisJCQlidWYgKz0gc25wcmludGYoYnVmLCBlbmQgLSBidWYsICIlcyVzOiBhY3RpdmUgJWQgdG90YWwgJWRcbiIsIHByZWZpeCwKKwkJCQkJYmluZGVyX29ianN0YXRfc3RyaW5nc1tpXSwKKwkJCQkJc3RhdHMtPm9ial9jcmVhdGVkW2ldIC0gc3RhdHMtPm9ial9kZWxldGVkW2ldLAorCQkJCQlzdGF0cy0+b2JqX2NyZWF0ZWRbaV0pOworCQlpZiAoYnVmID49IGVuZCkKKwkJCXJldHVybiBidWY7CisJfQorCXJldHVybiBidWY7Cit9CisKK3N0YXRpYyBjaGFyICpwcmludF9iaW5kZXJfcHJvY19zdGF0cyhjaGFyICpidWYsIGNoYXIgKmVuZCwgc3RydWN0IGJpbmRlcl9wcm9jICpwcm9jKQoreworCXN0cnVjdCBiaW5kZXJfd29yayAqdzsKKwlzdHJ1Y3QgcmJfbm9kZSAqbjsKKwlpbnQgY291bnQsIHN0cm9uZywgd2VhazsKKworCWJ1ZiArPSBzbnByaW50ZihidWYsIGVuZCAtIGJ1ZiwgInByb2MgJWRcbiIsIHByb2MtPnBpZCk7CisJaWYgKGJ1ZiA+PSBlbmQpCisJCXJldHVybiBidWY7CisJY291bnQgPSAwOworCWZvciAobiA9IHJiX2ZpcnN0KCZwcm9jLT50aHJlYWRzKTsgbiAhPSBOVUxMOyBuID0gcmJfbmV4dChuKSkKKwkJY291bnQrKzsKKwlidWYgKz0gc25wcmludGYoYnVmLCBlbmQgLSBidWYsICIgIHRocmVhZHM6ICVkXG4iLCBjb3VudCk7CisJaWYgKGJ1ZiA+PSBlbmQpCisJCXJldHVybiBidWY7CisJYnVmICs9IHNucHJpbnRmKGJ1ZiwgZW5kIC0gYnVmLCAiICByZXF1ZXN0ZWQgdGhyZWFkczogJWQrJWQvJWRcbiIKKwkJCSIgIHJlYWR5IHRocmVhZHMgJWRcbiIKKwkJCSIgIGZyZWUgYXN5bmMgc3BhY2UgJXpkXG4iLCBwcm9jLT5yZXF1ZXN0ZWRfdGhyZWFkcywKKwkJCXByb2MtPnJlcXVlc3RlZF90aHJlYWRzX3N0YXJ0ZWQsIHByb2MtPm1heF90aHJlYWRzLAorCQkJcHJvYy0+cmVhZHlfdGhyZWFkcywgcHJvYy0+ZnJlZV9hc3luY19zcGFjZSk7CisJaWYgKGJ1ZiA+PSBlbmQpCisJCXJldHVybiBidWY7CisJY291bnQgPSAwOworCWZvciAobiA9IHJiX2ZpcnN0KCZwcm9jLT5ub2Rlcyk7IG4gIT0gTlVMTDsgbiA9IHJiX25leHQobikpCisJCWNvdW50Kys7CisJYnVmICs9IHNucHJpbnRmKGJ1ZiwgZW5kIC0gYnVmLCAiICBub2RlczogJWRcbiIsIGNvdW50KTsKKwlpZiAoYnVmID49IGVuZCkKKwkJcmV0dXJuIGJ1ZjsKKwljb3VudCA9IDA7CisJc3Ryb25nID0gMDsKKwl3ZWFrID0gMDsKKwlmb3IgKG4gPSByYl9maXJzdCgmcHJvYy0+cmVmc19ieV9kZXNjKTsgbiAhPSBOVUxMOyBuID0gcmJfbmV4dChuKSkgeworCQlzdHJ1Y3QgYmluZGVyX3JlZiAqcmVmID0gcmJfZW50cnkobiwgc3RydWN0IGJpbmRlcl9yZWYsIHJiX25vZGVfZGVzYyk7CisJCWNvdW50Kys7CisJCXN0cm9uZyArPSByZWYtPnN0cm9uZzsKKwkJd2VhayArPSByZWYtPndlYWs7CisJfQorCWJ1ZiArPSBzbnByaW50ZihidWYsIGVuZCAtIGJ1ZiwgIiAgcmVmczogJWQgcyAlZCB3ICVkXG4iLCBjb3VudCwgc3Ryb25nLCB3ZWFrKTsKKwlpZiAoYnVmID49IGVuZCkKKwkJcmV0dXJuIGJ1ZjsKKworCWNvdW50ID0gMDsKKwlmb3IgKG4gPSByYl9maXJzdCgmcHJvYy0+YWxsb2NhdGVkX2J1ZmZlcnMpOyBuICE9IE5VTEw7IG4gPSByYl9uZXh0KG4pKQorCQljb3VudCsrOworCWJ1ZiArPSBzbnByaW50ZihidWYsIGVuZCAtIGJ1ZiwgIiAgYnVmZmVyczogJWRcbiIsIGNvdW50KTsKKwlpZiAoYnVmID49IGVuZCkKKwkJcmV0dXJuIGJ1ZjsKKworCWNvdW50ID0gMDsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHcsICZwcm9jLT50b2RvLCBlbnRyeSkgeworCQlzd2l0Y2ggKHctPnR5cGUpIHsKKwkJY2FzZSBCSU5ERVJfV09SS19UUkFOU0FDVElPTjoKKwkJCWNvdW50Kys7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJfQorCWJ1ZiArPSBzbnByaW50ZihidWYsIGVuZCAtIGJ1ZiwgIiAgcGVuZGluZyB0cmFuc2FjdGlvbnM6ICVkXG4iLCBjb3VudCk7CisJaWYgKGJ1ZiA+PSBlbmQpCisJCXJldHVybiBidWY7CisKKwlidWYgPSBwcmludF9iaW5kZXJfc3RhdHMoYnVmLCBlbmQsICIgICIsICZwcm9jLT5zdGF0cyk7CisKKwlyZXR1cm4gYnVmOworfQorCisKK3N0YXRpYyBpbnQgYmluZGVyX3JlYWRfcHJvY19zdGF0ZSgKKwljaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZiwgaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgYmluZGVyX3Byb2MgKnByb2M7CisJc3RydWN0IGhsaXN0X25vZGUgKnBvczsKKwlzdHJ1Y3QgYmluZGVyX25vZGUgKm5vZGU7CisJaW50IGxlbiA9IDA7CisJY2hhciAqYnVmID0gcGFnZTsKKwljaGFyICplbmQgPSBwYWdlICsgUEFHRV9TSVpFOworCWludCBkb19sb2NrID0gIWJpbmRlcl9kZWJ1Z19ub19sb2NrOworCisJaWYgKG9mZikKKwkJcmV0dXJuIDA7CisKKwlpZiAoZG9fbG9jaykKKwkJbXV0ZXhfbG9jaygmYmluZGVyX2xvY2spOworCisJYnVmICs9IHNucHJpbnRmKGJ1ZiwgZW5kIC0gYnVmLCAiYmluZGVyIHN0YXRlOlxuIik7CisKKwlpZiAoIWhsaXN0X2VtcHR5KCZiaW5kZXJfZGVhZF9ub2RlcykpCisJCWJ1ZiArPSBzbnByaW50ZihidWYsIGVuZCAtIGJ1ZiwgImRlYWQgbm9kZXM6XG4iKTsKKwlobGlzdF9mb3JfZWFjaF9lbnRyeShub2RlLCBwb3MsICZiaW5kZXJfZGVhZF9ub2RlcywgZGVhZF9ub2RlKSB7CisJCWlmIChidWYgPj0gZW5kKQorCQkJYnJlYWs7CisJCWJ1ZiA9IHByaW50X2JpbmRlcl9ub2RlKGJ1ZiwgZW5kLCBub2RlKTsKKwl9CisKKwlobGlzdF9mb3JfZWFjaF9lbnRyeShwcm9jLCBwb3MsICZiaW5kZXJfcHJvY3MsIHByb2Nfbm9kZSkgeworCQlpZiAoYnVmID49IGVuZCkKKwkJCWJyZWFrOworCQlidWYgPSBwcmludF9iaW5kZXJfcHJvYyhidWYsIGVuZCwgcHJvYywgMSk7CisJfQorCWlmIChkb19sb2NrKQorCQltdXRleF91bmxvY2soJmJpbmRlcl9sb2NrKTsKKwlpZiAoYnVmID4gcGFnZSArIFBBR0VfU0laRSkKKwkJYnVmID0gcGFnZSArIFBBR0VfU0laRTsKKworCSpzdGFydCA9IHBhZ2UgKyBvZmY7CisKKwlsZW4gPSBidWYgLSBwYWdlOworCWlmIChsZW4gPiBvZmYpCisJCWxlbiAtPSBvZmY7CisJZWxzZQorCQlsZW4gPSAwOworCisJcmV0dXJuIGxlbiA8IGNvdW50ID8gbGVuICA6IGNvdW50OworfQorCitzdGF0aWMgaW50IGJpbmRlcl9yZWFkX3Byb2Nfc3RhdHMoCisJY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsIGludCBjb3VudCwgaW50ICplb2YsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGJpbmRlcl9wcm9jICpwcm9jOworCXN0cnVjdCBobGlzdF9ub2RlICpwb3M7CisJaW50IGxlbiA9IDA7CisJY2hhciAqcCA9IHBhZ2U7CisJaW50IGRvX2xvY2sgPSAhYmluZGVyX2RlYnVnX25vX2xvY2s7CisKKwlpZiAob2ZmKQorCQlyZXR1cm4gMDsKKworCWlmIChkb19sb2NrKQorCQltdXRleF9sb2NrKCZiaW5kZXJfbG9jayk7CisKKwlwICs9IHNucHJpbnRmKHAsIFBBR0VfU0laRSwgImJpbmRlciBzdGF0czpcbiIpOworCisJcCA9IHByaW50X2JpbmRlcl9zdGF0cyhwLCBwYWdlICsgUEFHRV9TSVpFLCAiIiwgJmJpbmRlcl9zdGF0cyk7CisKKwlobGlzdF9mb3JfZWFjaF9lbnRyeShwcm9jLCBwb3MsICZiaW5kZXJfcHJvY3MsIHByb2Nfbm9kZSkgeworCQlpZiAocCA+PSBwYWdlICsgUEFHRV9TSVpFKQorCQkJYnJlYWs7CisJCXAgPSBwcmludF9iaW5kZXJfcHJvY19zdGF0cyhwLCBwYWdlICsgUEFHRV9TSVpFLCBwcm9jKTsKKwl9CisJaWYgKGRvX2xvY2spCisJCW11dGV4X3VubG9jaygmYmluZGVyX2xvY2spOworCWlmIChwID4gcGFnZSArIFBBR0VfU0laRSkKKwkJcCA9IHBhZ2UgKyBQQUdFX1NJWkU7CisKKwkqc3RhcnQgPSBwYWdlICsgb2ZmOworCisJbGVuID0gcCAtIHBhZ2U7CisJaWYgKGxlbiA+IG9mZikKKwkJbGVuIC09IG9mZjsKKwllbHNlCisJCWxlbiA9IDA7CisKKwlyZXR1cm4gbGVuIDwgY291bnQgPyBsZW4gIDogY291bnQ7Cit9CisKK3N0YXRpYyBpbnQgYmluZGVyX3JlYWRfcHJvY190cmFuc2FjdGlvbnMoCisJY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsIGludCBjb3VudCwgaW50ICplb2YsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGJpbmRlcl9wcm9jICpwcm9jOworCXN0cnVjdCBobGlzdF9ub2RlICpwb3M7CisJaW50IGxlbiA9IDA7CisJY2hhciAqYnVmID0gcGFnZTsKKwljaGFyICplbmQgPSBwYWdlICsgUEFHRV9TSVpFOworCWludCBkb19sb2NrID0gIWJpbmRlcl9kZWJ1Z19ub19sb2NrOworCisJaWYgKG9mZikKKwkJcmV0dXJuIDA7CisKKwlpZiAoZG9fbG9jaykKKwkJbXV0ZXhfbG9jaygmYmluZGVyX2xvY2spOworCisJYnVmICs9IHNucHJpbnRmKGJ1ZiwgZW5kIC0gYnVmLCAiYmluZGVyIHRyYW5zYWN0aW9uczpcbiIpOworCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KHByb2MsIHBvcywgJmJpbmRlcl9wcm9jcywgcHJvY19ub2RlKSB7CisJCWlmIChidWYgPj0gZW5kKQorCQkJYnJlYWs7CisJCWJ1ZiA9IHByaW50X2JpbmRlcl9wcm9jKGJ1ZiwgZW5kLCBwcm9jLCAwKTsKKwl9CisJaWYgKGRvX2xvY2spCisJCW11dGV4X3VubG9jaygmYmluZGVyX2xvY2spOworCWlmIChidWYgPiBwYWdlICsgUEFHRV9TSVpFKQorCQlidWYgPSBwYWdlICsgUEFHRV9TSVpFOworCisJKnN0YXJ0ID0gcGFnZSArIG9mZjsKKworCWxlbiA9IGJ1ZiAtIHBhZ2U7CisJaWYgKGxlbiA+IG9mZikKKwkJbGVuIC09IG9mZjsKKwllbHNlCisJCWxlbiA9IDA7CisKKwlyZXR1cm4gbGVuIDwgY291bnQgPyBsZW4gIDogY291bnQ7Cit9CisKK3N0YXRpYyBpbnQgYmluZGVyX3JlYWRfcHJvY19wcm9jKAorCWNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLCBpbnQgY291bnQsIGludCAqZW9mLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBiaW5kZXJfcHJvYyAqcHJvYyA9IGRhdGE7CisJaW50IGxlbiA9IDA7CisJY2hhciAqcCA9IHBhZ2U7CisJaW50IGRvX2xvY2sgPSAhYmluZGVyX2RlYnVnX25vX2xvY2s7CisKKwlpZiAob2ZmKQorCQlyZXR1cm4gMDsKKworCWlmIChkb19sb2NrKQorCQltdXRleF9sb2NrKCZiaW5kZXJfbG9jayk7CisJcCArPSBzbnByaW50ZihwLCBQQUdFX1NJWkUsICJiaW5kZXIgcHJvYyBzdGF0ZTpcbiIpOworCXAgPSBwcmludF9iaW5kZXJfcHJvYyhwLCBwYWdlICsgUEFHRV9TSVpFLCBwcm9jLCAxKTsKKwlpZiAoZG9fbG9jaykKKwkJbXV0ZXhfdW5sb2NrKCZiaW5kZXJfbG9jayk7CisKKwlpZiAocCA+IHBhZ2UgKyBQQUdFX1NJWkUpCisJCXAgPSBwYWdlICsgUEFHRV9TSVpFOworCSpzdGFydCA9IHBhZ2UgKyBvZmY7CisKKwlsZW4gPSBwIC0gcGFnZTsKKwlpZiAobGVuID4gb2ZmKQorCQlsZW4gLT0gb2ZmOworCWVsc2UKKwkJbGVuID0gMDsKKworCXJldHVybiBsZW4gPCBjb3VudCA/IGxlbiAgOiBjb3VudDsKK30KKworc3RhdGljIGNoYXIgKnByaW50X2JpbmRlcl90cmFuc2FjdGlvbl9sb2dfZW50cnkoY2hhciAqYnVmLCBjaGFyICplbmQsIHN0cnVjdCBiaW5kZXJfdHJhbnNhY3Rpb25fbG9nX2VudHJ5ICplKQoreworCWJ1ZiArPSBzbnByaW50ZihidWYsIGVuZCAtIGJ1ZiwgIiVkOiAlcyBmcm9tICVkOiVkIHRvICVkOiVkIG5vZGUgJWQgaGFuZGxlICVkIHNpemUgJWQ6JWRcbiIsCisJCQllLT5kZWJ1Z19pZCwgKGUtPmNhbGxfdHlwZSA9PSAyKSA/ICJyZXBseSIgOgorCQkJKChlLT5jYWxsX3R5cGUgPT0gMSkgPyAiYXN5bmMiIDogImNhbGwgIiksIGUtPmZyb21fcHJvYywKKwkJCWUtPmZyb21fdGhyZWFkLCBlLT50b19wcm9jLCBlLT50b190aHJlYWQsIGUtPnRvX25vZGUsCisJCQllLT50YXJnZXRfaGFuZGxlLCBlLT5kYXRhX3NpemUsIGUtPm9mZnNldHNfc2l6ZSk7CisJcmV0dXJuIGJ1ZjsKK30KKworc3RhdGljIGludCBiaW5kZXJfcmVhZF9wcm9jX3RyYW5zYWN0aW9uX2xvZygKKwljaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZiwgaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgYmluZGVyX3RyYW5zYWN0aW9uX2xvZyAqbG9nID0gZGF0YTsKKwlpbnQgbGVuID0gMDsKKwlpbnQgaTsKKwljaGFyICpidWYgPSBwYWdlOworCWNoYXIgKmVuZCA9IHBhZ2UgKyBQQUdFX1NJWkU7CisKKwlpZiAob2ZmKQorCQlyZXR1cm4gMDsKKworCWlmIChsb2ctPmZ1bGwpIHsKKwkJZm9yIChpID0gbG9nLT5uZXh0OyBpIDwgQVJSQVlfU0laRShsb2ctPmVudHJ5KTsgaSsrKSB7CisJCQlpZiAoYnVmID49IGVuZCkKKwkJCQlicmVhazsKKwkJCWJ1ZiA9IHByaW50X2JpbmRlcl90cmFuc2FjdGlvbl9sb2dfZW50cnkoYnVmLCBlbmQsICZsb2ctPmVudHJ5W2ldKTsKKwkJfQorCX0KKwlmb3IgKGkgPSAwOyBpIDwgbG9nLT5uZXh0OyBpKyspIHsKKwkJaWYgKGJ1ZiA+PSBlbmQpCisJCQlicmVhazsKKwkJYnVmID0gcHJpbnRfYmluZGVyX3RyYW5zYWN0aW9uX2xvZ19lbnRyeShidWYsIGVuZCwgJmxvZy0+ZW50cnlbaV0pOworCX0KKworCSpzdGFydCA9IHBhZ2UgKyBvZmY7CisKKwlsZW4gPSBidWYgLSBwYWdlOworCWlmIChsZW4gPiBvZmYpCisJCWxlbiAtPSBvZmY7CisJZWxzZQorCQlsZW4gPSAwOworCisJcmV0dXJuIGxlbiA8IGNvdW50ID8gbGVuICA6IGNvdW50OworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBiaW5kZXJfZm9wcyA9IHsKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkucG9sbCA9IGJpbmRlcl9wb2xsLAorCS51bmxvY2tlZF9pb2N0bCA9IGJpbmRlcl9pb2N0bCwKKwkubW1hcCA9IGJpbmRlcl9tbWFwLAorCS5vcGVuID0gYmluZGVyX29wZW4sCisJLmZsdXNoID0gYmluZGVyX2ZsdXNoLAorCS5yZWxlYXNlID0gYmluZGVyX3JlbGVhc2UsCit9OworCitzdGF0aWMgc3RydWN0IG1pc2NkZXZpY2UgYmluZGVyX21pc2NkZXYgPSB7CisJLm1pbm9yID0gTUlTQ19EWU5BTUlDX01JTk9SLAorCS5uYW1lID0gImJpbmRlciIsCisJLmZvcHMgPSAmYmluZGVyX2ZvcHMKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGJpbmRlcl9pbml0KHZvaWQpCit7CisJaW50IHJldDsKKworCWJpbmRlcl9wcm9jX2Rpcl9lbnRyeV9yb290ID0gcHJvY19ta2RpcigiYmluZGVyIiwgTlVMTCk7CisJaWYgKGJpbmRlcl9wcm9jX2Rpcl9lbnRyeV9yb290KQorCQliaW5kZXJfcHJvY19kaXJfZW50cnlfcHJvYyA9IHByb2NfbWtkaXIoInByb2MiLCBiaW5kZXJfcHJvY19kaXJfZW50cnlfcm9vdCk7CisJcmV0ID0gbWlzY19yZWdpc3RlcigmYmluZGVyX21pc2NkZXYpOworCWlmIChiaW5kZXJfcHJvY19kaXJfZW50cnlfcm9vdCkgeworCQljcmVhdGVfcHJvY19yZWFkX2VudHJ5KCJzdGF0ZSIsIFNfSVJVR08sIGJpbmRlcl9wcm9jX2Rpcl9lbnRyeV9yb290LCBiaW5kZXJfcmVhZF9wcm9jX3N0YXRlLCBOVUxMKTsKKwkJY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSgic3RhdHMiLCBTX0lSVUdPLCBiaW5kZXJfcHJvY19kaXJfZW50cnlfcm9vdCwgYmluZGVyX3JlYWRfcHJvY19zdGF0cywgTlVMTCk7CisJCWNyZWF0ZV9wcm9jX3JlYWRfZW50cnkoInRyYW5zYWN0aW9ucyIsIFNfSVJVR08sIGJpbmRlcl9wcm9jX2Rpcl9lbnRyeV9yb290LCBiaW5kZXJfcmVhZF9wcm9jX3RyYW5zYWN0aW9ucywgTlVMTCk7CisJCWNyZWF0ZV9wcm9jX3JlYWRfZW50cnkoInRyYW5zYWN0aW9uX2xvZyIsIFNfSVJVR08sIGJpbmRlcl9wcm9jX2Rpcl9lbnRyeV9yb290LCBiaW5kZXJfcmVhZF9wcm9jX3RyYW5zYWN0aW9uX2xvZywgJmJpbmRlcl90cmFuc2FjdGlvbl9sb2cpOworCQljcmVhdGVfcHJvY19yZWFkX2VudHJ5KCJmYWlsZWRfdHJhbnNhY3Rpb25fbG9nIiwgU19JUlVHTywgYmluZGVyX3Byb2NfZGlyX2VudHJ5X3Jvb3QsIGJpbmRlcl9yZWFkX3Byb2NfdHJhbnNhY3Rpb25fbG9nLCAmYmluZGVyX3RyYW5zYWN0aW9uX2xvZ19mYWlsZWQpOworCX0KKwlyZXR1cm4gcmV0OworfQorCitkZXZpY2VfaW5pdGNhbGwoYmluZGVyX2luaXQpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9iaW5kZXIuaCBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2JpbmRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2M2FlMWEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9iaW5kZXIuaApAQCAtMCwwICsxLDMzMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBHb29nbGUsIEluYy4KKyAqCisgKiBCYXNlZCBvbiwgYnV0IG5vIGxvbmdlciBjb21wYXRpYmxlIHdpdGgsIHRoZSBvcmlnaW5hbAorICogT3BlbkJpbmRlci5vcmcgYmluZGVyIGRyaXZlciBpbnRlcmZhY2UsIHdoaWNoIGlzOgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwNSBQYWxtc291cmNlLCBJbmMuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyAqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKworI2lmbmRlZiBfTElOVVhfQklOREVSX0gKKyNkZWZpbmUgX0xJTlVYX0JJTkRFUl9ICisKKyNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgorCisjZGVmaW5lIEJfUEFDS19DSEFSUyhjMSwgYzIsIGMzLCBjNCkgXAorCSgoKChjMSk8PDI0KSkgfCAoKChjMik8PDE2KSkgfCAoKChjMyk8PDgpKSB8IChjNCkpCisjZGVmaW5lIEJfVFlQRV9MQVJHRSAweDg1CisKK2VudW0geworCUJJTkRFUl9UWVBFX0JJTkRFUgk9IEJfUEFDS19DSEFSUygncycsICdiJywgJyonLCBCX1RZUEVfTEFSR0UpLAorCUJJTkRFUl9UWVBFX1dFQUtfQklOREVSCT0gQl9QQUNLX0NIQVJTKCd3JywgJ2InLCAnKicsIEJfVFlQRV9MQVJHRSksCisJQklOREVSX1RZUEVfSEFORExFCT0gQl9QQUNLX0NIQVJTKCdzJywgJ2gnLCAnKicsIEJfVFlQRV9MQVJHRSksCisJQklOREVSX1RZUEVfV0VBS19IQU5ETEUJPSBCX1BBQ0tfQ0hBUlMoJ3cnLCAnaCcsICcqJywgQl9UWVBFX0xBUkdFKSwKKwlCSU5ERVJfVFlQRV9GRAkJPSBCX1BBQ0tfQ0hBUlMoJ2YnLCAnZCcsICcqJywgQl9UWVBFX0xBUkdFKSwKK307CisKK2VudW0geworCUZMQVRfQklOREVSX0ZMQUdfUFJJT1JJVFlfTUFTSyA9IDB4ZmYsCisJRkxBVF9CSU5ERVJfRkxBR19BQ0NFUFRTX0ZEUyA9IDB4MTAwLAorfTsKKworLyoKKyAqIFRoaXMgaXMgdGhlIGZsYXR0ZW5lZCByZXByZXNlbnRhdGlvbiBvZiBhIEJpbmRlciBvYmplY3QgZm9yIHRyYW5zZmVyCisgKiBiZXR3ZWVuIHByb2Nlc3Nlcy4gIFRoZSAnb2Zmc2V0cycgc3VwcGxpZWQgYXMgcGFydCBvZiBhIGJpbmRlciB0cmFuc2FjdGlvbgorICogY29udGFpbnMgb2Zmc2V0cyBpbnRvIHRoZSBkYXRhIHdoZXJlIHRoZXNlIHN0cnVjdHVyZXMgb2NjdXIuICBUaGUgQmluZGVyCisgKiBkcml2ZXIgdGFrZXMgY2FyZSBvZiByZS13cml0aW5nIHRoZSBzdHJ1Y3R1cmUgdHlwZSBhbmQgZGF0YSBhcyBpdCBtb3ZlcworICogYmV0d2VlbiBwcm9jZXNzZXMuCisgKi8KK3N0cnVjdCBmbGF0X2JpbmRlcl9vYmplY3QgeworCS8qIDggYnl0ZXMgZm9yIGxhcmdlX2ZsYXRfaGVhZGVyLiAqLworCXVuc2lnbmVkIGxvbmcJCXR5cGU7CisJdW5zaWduZWQgbG9uZwkJZmxhZ3M7CisKKwkvKiA4IGJ5dGVzIG9mIGRhdGEuICovCisJdW5pb24geworCQl2b2lkCQkqYmluZGVyOwkvKiBsb2NhbCBvYmplY3QgKi8KKwkJc2lnbmVkIGxvbmcJaGFuZGxlOwkJLyogcmVtb3RlIG9iamVjdCAqLworCX07CisKKwkvKiBleHRyYSBkYXRhIGFzc29jaWF0ZWQgd2l0aCBsb2NhbCBvYmplY3QgKi8KKwl2b2lkCQkJKmNvb2tpZTsKK307CisKKy8qCisgKiBPbiA2NC1iaXQgcGxhdGZvcm1zIHdoZXJlIHVzZXIgY29kZSBtYXkgcnVuIGluIDMyLWJpdHMgdGhlIGRyaXZlciBtdXN0CisgKiB0cmFuc2xhdGUgdGhlIGJ1ZmZlciAoYW5kIGxvY2FsIGJpbmRlcikgYWRkcmVzc2VzIGFwcm9wcmlhdGVseS4KKyAqLworCitzdHJ1Y3QgYmluZGVyX3dyaXRlX3JlYWQgeworCXNpZ25lZCBsb25nCXdyaXRlX3NpemU7CS8qIGJ5dGVzIHRvIHdyaXRlICovCisJc2lnbmVkIGxvbmcJd3JpdGVfY29uc3VtZWQ7CS8qIGJ5dGVzIGNvbnN1bWVkIGJ5IGRyaXZlciAqLworCXVuc2lnbmVkIGxvbmcJd3JpdGVfYnVmZmVyOworCXNpZ25lZCBsb25nCXJlYWRfc2l6ZTsJLyogYnl0ZXMgdG8gcmVhZCAqLworCXNpZ25lZCBsb25nCXJlYWRfY29uc3VtZWQ7CS8qIGJ5dGVzIGNvbnN1bWVkIGJ5IGRyaXZlciAqLworCXVuc2lnbmVkIGxvbmcJcmVhZF9idWZmZXI7Cit9OworCisvKiBVc2Ugd2l0aCBCSU5ERVJfVkVSU0lPTiwgZHJpdmVyIGZpbGxzIGluIGZpZWxkcy4gKi8KK3N0cnVjdCBiaW5kZXJfdmVyc2lvbiB7CisJLyogZHJpdmVyIHByb3RvY29sIHZlcnNpb24gLS0gaW5jcmVtZW50IHdpdGggaW5jb21wYXRpYmxlIGNoYW5nZSAqLworCXNpZ25lZCBsb25nCXByb3RvY29sX3ZlcnNpb247Cit9OworCisvKiBUaGlzIGlzIHRoZSBjdXJyZW50IHByb3RvY29sIHZlcnNpb24uICovCisjZGVmaW5lIEJJTkRFUl9DVVJSRU5UX1BST1RPQ09MX1ZFUlNJT04gNworCisjZGVmaW5lIEJJTkRFUl9XUklURV9SRUFEICAgCQlfSU9XUignYicsIDEsIHN0cnVjdCBiaW5kZXJfd3JpdGVfcmVhZCkKKyNkZWZpbmUJQklOREVSX1NFVF9JRExFX1RJTUVPVVQJCV9JT1coJ2InLCAzLCBpbnQ2NF90KQorI2RlZmluZQlCSU5ERVJfU0VUX01BWF9USFJFQURTCQlfSU9XKCdiJywgNSwgc2l6ZV90KQorI2RlZmluZQlCSU5ERVJfU0VUX0lETEVfUFJJT1JJVFkJX0lPVygnYicsIDYsIGludCkKKyNkZWZpbmUJQklOREVSX1NFVF9DT05URVhUX01HUgkJX0lPVygnYicsIDcsIGludCkKKyNkZWZpbmUJQklOREVSX1RIUkVBRF9FWElUCQlfSU9XKCdiJywgOCwgaW50KQorI2RlZmluZSBCSU5ERVJfVkVSU0lPTgkJCV9JT1dSKCdiJywgOSwgc3RydWN0IGJpbmRlcl92ZXJzaW9uKQorCisvKgorICogTk9URTogVHdvIHNwZWNpYWwgZXJyb3IgY29kZXMgeW91IHNob3VsZCBjaGVjayBmb3Igd2hlbiBjYWxsaW5nCisgKiBpbiB0byB0aGUgZHJpdmVyIGFyZToKKyAqCisgKiBFSU5UUiAtLSBUaGUgb3BlcmF0aW9uIGhhcyBiZWVuIGludGVydXB0ZWQuICBUaGlzIHNob3VsZCBiZQorICogaGFuZGxlZCBieSByZXRyeWluZyB0aGUgaW9jdGwoKSB1bnRpbCBhIGRpZmZlcmVudCBlcnJvciBjb2RlCisgKiBpcyByZXR1cm5lZC4KKyAqCisgKiBFQ09OTlJFRlVTRUQgLS0gVGhlIGRyaXZlciBpcyBubyBsb25nZXIgYWNjZXB0aW5nIG9wZXJhdGlvbnMKKyAqIGZyb20geW91ciBwcm9jZXNzLiAgVGhhdCBpcywgdGhlIHByb2Nlc3MgaXMgYmVpbmcgZGVzdHJveWVkLgorICogWW91IHNob3VsZCBoYW5kbGUgdGhpcyBieSBleGl0aW5nIGZyb20geW91ciBwcm9jZXNzLiAgTm90ZQorICogdGhhdCBvbmNlIHRoaXMgZXJyb3IgY29kZSBpcyByZXR1cm5lZCwgYWxsIGZ1cnRoZXIgY2FsbHMgdG8KKyAqIHRoZSBkcml2ZXIgZnJvbSBhbnkgdGhyZWFkIHdpbGwgcmV0dXJuIHRoaXMgc2FtZSBjb2RlLgorICovCisKK2VudW0gdHJhbnNhY3Rpb25fZmxhZ3MgeworCVRGX09ORV9XQVkJPSAweDAxLAkvKiB0aGlzIGlzIGEgb25lLXdheSBjYWxsOiBhc3luYywgbm8gcmV0dXJuICovCisJVEZfUk9PVF9PQkpFQ1QJPSAweDA0LAkvKiBjb250ZW50cyBhcmUgdGhlIGNvbXBvbmVudCdzIHJvb3Qgb2JqZWN0ICovCisJVEZfU1RBVFVTX0NPREUJPSAweDA4LAkvKiBjb250ZW50cyBhcmUgYSAzMi1iaXQgc3RhdHVzIGNvZGUgKi8KKwlURl9BQ0NFUFRfRkRTCT0gMHgxMCwJLyogYWxsb3cgcmVwbGllcyB3aXRoIGZpbGUgZGVzY3JpcHRvcnMgKi8KK307CisKK3N0cnVjdCBiaW5kZXJfdHJhbnNhY3Rpb25fZGF0YSB7CisJLyogVGhlIGZpcnN0IHR3byBhcmUgb25seSB1c2VkIGZvciBiY1RSQU5TQUNUSU9OIGFuZCBiclRSQU5TQUNUSU9OLAorCSAqIGlkZW50aWZ5aW5nIHRoZSB0YXJnZXQgYW5kIGNvbnRlbnRzIG9mIHRoZSB0cmFuc2FjdGlvbi4KKwkgKi8KKwl1bmlvbiB7CisJCXNpemVfdAloYW5kbGU7CS8qIHRhcmdldCBkZXNjcmlwdG9yIG9mIGNvbW1hbmQgdHJhbnNhY3Rpb24gKi8KKwkJdm9pZAkqcHRyOwkvKiB0YXJnZXQgZGVzY3JpcHRvciBvZiByZXR1cm4gdHJhbnNhY3Rpb24gKi8KKwl9IHRhcmdldDsKKwl2b2lkCQkqY29va2llOwkvKiB0YXJnZXQgb2JqZWN0IGNvb2tpZSAqLworCXVuc2lnbmVkIGludAljb2RlOwkJLyogdHJhbnNhY3Rpb24gY29tbWFuZCAqLworCisJLyogR2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdHJhbnNhY3Rpb24uICovCisJdW5zaWduZWQgaW50CWZsYWdzOworCXBpZF90CQlzZW5kZXJfcGlkOworCXVpZF90CQlzZW5kZXJfZXVpZDsKKwlzaXplX3QJCWRhdGFfc2l6ZTsJLyogbnVtYmVyIG9mIGJ5dGVzIG9mIGRhdGEgKi8KKwlzaXplX3QJCW9mZnNldHNfc2l6ZTsJLyogbnVtYmVyIG9mIGJ5dGVzIG9mIG9mZnNldHMgKi8KKworCS8qIElmIHRoaXMgdHJhbnNhY3Rpb24gaXMgaW5saW5lLCB0aGUgZGF0YSBpbW1lZGlhdGVseQorCSAqIGZvbGxvd3MgaGVyZTsgb3RoZXJ3aXNlLCBpdCBlbmRzIHdpdGggYSBwb2ludGVyIHRvCisJICogdGhlIGRhdGEgYnVmZmVyLgorCSAqLworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCS8qIHRyYW5zYWN0aW9uIGRhdGEgKi8KKwkJCWNvbnN0IHZvaWQJKmJ1ZmZlcjsKKwkJCS8qIG9mZnNldHMgZnJvbSBidWZmZXIgdG8gZmxhdF9iaW5kZXJfb2JqZWN0IHN0cnVjdHMgKi8KKwkJCWNvbnN0IHZvaWQJKm9mZnNldHM7CisJCX0gcHRyOworCQl1aW50OF90CWJ1Zls4XTsKKwl9IGRhdGE7Cit9OworCitzdHJ1Y3QgYmluZGVyX3B0cl9jb29raWUgeworCXZvaWQgKnB0cjsKKwl2b2lkICpjb29raWU7Cit9OworCitzdHJ1Y3QgYmluZGVyX3ByaV9kZXNjIHsKKwlpbnQgcHJpb3JpdHk7CisJaW50IGRlc2M7Cit9OworCitzdHJ1Y3QgYmluZGVyX3ByaV9wdHJfY29va2llIHsKKwlpbnQgcHJpb3JpdHk7CisJdm9pZCAqcHRyOworCXZvaWQgKmNvb2tpZTsKK307CisKK2VudW0gQmluZGVyRHJpdmVyUmV0dXJuUHJvdG9jb2wgeworCUJSX0VSUk9SID0gX0lPUigncicsIDAsIGludCksCisJLyoKKwkgKiBpbnQ6IGVycm9yIGNvZGUKKwkgKi8KKworCUJSX09LID0gX0lPKCdyJywgMSksCisJLyogTm8gcGFyYW1ldGVycyEgKi8KKworCUJSX1RSQU5TQUNUSU9OID0gX0lPUigncicsIDIsIHN0cnVjdCBiaW5kZXJfdHJhbnNhY3Rpb25fZGF0YSksCisJQlJfUkVQTFkgPSBfSU9SKCdyJywgMywgc3RydWN0IGJpbmRlcl90cmFuc2FjdGlvbl9kYXRhKSwKKwkvKgorCSAqIGJpbmRlcl90cmFuc2FjdGlvbl9kYXRhOiB0aGUgcmVjZWl2ZWQgY29tbWFuZC4KKwkgKi8KKworCUJSX0FDUVVJUkVfUkVTVUxUID0gX0lPUigncicsIDQsIGludCksCisJLyoKKwkgKiBub3QgY3VycmVudGx5IHN1cHBvcnRlZAorCSAqIGludDogMCBpZiB0aGUgbGFzdCBiY0FUVEVNUFRfQUNRVUlSRSB3YXMgbm90IHN1Y2Nlc3NmdWwuCisJICogRWxzZSB0aGUgcmVtb3RlIG9iamVjdCBoYXMgYWNxdWlyZWQgYSBwcmltYXJ5IHJlZmVyZW5jZS4KKwkgKi8KKworCUJSX0RFQURfUkVQTFkgPSBfSU8oJ3InLCA1KSwKKwkvKgorCSAqIFRoZSB0YXJnZXQgb2YgdGhlIGxhc3QgdHJhbnNhY3Rpb24gKGVpdGhlciBhIGJjVFJBTlNBQ1RJT04gb3IKKwkgKiBhIGJjQVRURU1QVF9BQ1FVSVJFKSBpcyBubyBsb25nZXIgd2l0aCB1cy4gIE5vIHBhcmFtZXRlcnMuCisJICovCisKKwlCUl9UUkFOU0FDVElPTl9DT01QTEVURSA9IF9JTygncicsIDYpLAorCS8qCisJICogTm8gcGFyYW1ldGVycy4uLiBhbHdheXMgcmVmZXJzIHRvIHRoZSBsYXN0IHRyYW5zYWN0aW9uIHJlcXVlc3RlZAorCSAqIChpbmNsdWRpbmcgcmVwbGllcykuICBOb3RlIHRoYXQgdGhpcyB3aWxsIGJlIHNlbnQgZXZlbiBmb3IKKwkgKiBhc3luY2hyb25vdXMgdHJhbnNhY3Rpb25zLgorCSAqLworCisJQlJfSU5DUkVGUyA9IF9JT1IoJ3InLCA3LCBzdHJ1Y3QgYmluZGVyX3B0cl9jb29raWUpLAorCUJSX0FDUVVJUkUgPSBfSU9SKCdyJywgOCwgc3RydWN0IGJpbmRlcl9wdHJfY29va2llKSwKKwlCUl9SRUxFQVNFID0gX0lPUigncicsIDksIHN0cnVjdCBiaW5kZXJfcHRyX2Nvb2tpZSksCisJQlJfREVDUkVGUyA9IF9JT1IoJ3InLCAxMCwgc3RydWN0IGJpbmRlcl9wdHJfY29va2llKSwKKwkvKgorCSAqIHZvaWQgKjoJcHRyIHRvIGJpbmRlcgorCSAqIHZvaWQgKjogY29va2llIGZvciBiaW5kZXIKKwkgKi8KKworCUJSX0FUVEVNUFRfQUNRVUlSRSA9IF9JT1IoJ3InLCAxMSwgc3RydWN0IGJpbmRlcl9wcmlfcHRyX2Nvb2tpZSksCisJLyoKKwkgKiBub3QgY3VycmVudGx5IHN1cHBvcnRlZAorCSAqIGludDoJcHJpb3JpdHkKKwkgKiB2b2lkICo6IHB0ciB0byBiaW5kZXIKKwkgKiB2b2lkICo6IGNvb2tpZSBmb3IgYmluZGVyCisJICovCisKKwlCUl9OT09QID0gX0lPKCdyJywgMTIpLAorCS8qCisJICogTm8gcGFyYW1ldGVycy4gIERvIG5vdGhpbmcgYW5kIGV4YW1pbmUgdGhlIG5leHQgY29tbWFuZC4gIEl0IGV4aXN0cworCSAqIHByaW1hcmlseSBzbyB0aGF0IHdlIGNhbiByZXBsYWNlIGl0IHdpdGggYSBCUl9TUEFXTl9MT09QRVIgY29tbWFuZC4KKwkgKi8KKworCUJSX1NQQVdOX0xPT1BFUiA9IF9JTygncicsIDEzKSwKKwkvKgorCSAqIE5vIHBhcmFtZXRlcnMuICBUaGUgZHJpdmVyIGhhcyBkZXRlcm1pbmVkIHRoYXQgYSBwcm9jZXNzIGhhcyBubworCSAqIHRocmVhZHMgd2FpdGluZyB0byBzZXJ2aWNlIGluY29tbWluZyB0cmFuc2FjdGlvbnMuICBXaGVuIGEgcHJvY2VzcworCSAqIHJlY2VpdmVzIHRoaXMgY29tbWFuZCwgaXQgbXVzdCBzcGF3biBhIG5ldyBzZXJ2aWNlIHRocmVhZCBhbmQKKwkgKiByZWdpc3RlciBpdCB2aWEgYmNFTlRFUl9MT09QRVIuCisJICovCisKKwlCUl9GSU5JU0hFRCA9IF9JTygncicsIDE0KSwKKwkvKgorCSAqIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkCisJICogc3RvcCB0aHJlYWRwb29sIHRocmVhZAorCSAqLworCisJQlJfREVBRF9CSU5ERVIgPSBfSU9SKCdyJywgMTUsIHZvaWQgKiksCisJLyoKKwkgKiB2b2lkICo6IGNvb2tpZQorCSAqLworCUJSX0NMRUFSX0RFQVRIX05PVElGSUNBVElPTl9ET05FID0gX0lPUigncicsIDE2LCB2b2lkICopLAorCS8qCisJICogdm9pZCAqOiBjb29raWUKKwkgKi8KKworCUJSX0ZBSUxFRF9SRVBMWSA9IF9JTygncicsIDE3KSwKKwkvKgorCSAqIFRoZSB0aGUgbGFzdCB0cmFuc2FjdGlvbiAoZWl0aGVyIGEgYmNUUkFOU0FDVElPTiBvcgorCSAqIGEgYmNBVFRFTVBUX0FDUVVJUkUpIGZhaWxlZCAoZS5nLiBvdXQgb2YgbWVtb3J5KS4gIE5vIHBhcmFtZXRlcnMuCisJICovCit9OworCitlbnVtIEJpbmRlckRyaXZlckNvbW1hbmRQcm90b2NvbCB7CisJQkNfVFJBTlNBQ1RJT04gPSBfSU9XKCdjJywgMCwgc3RydWN0IGJpbmRlcl90cmFuc2FjdGlvbl9kYXRhKSwKKwlCQ19SRVBMWSA9IF9JT1coJ2MnLCAxLCBzdHJ1Y3QgYmluZGVyX3RyYW5zYWN0aW9uX2RhdGEpLAorCS8qCisJICogYmluZGVyX3RyYW5zYWN0aW9uX2RhdGE6IHRoZSBzZW50IGNvbW1hbmQuCisJICovCisKKwlCQ19BQ1FVSVJFX1JFU1VMVCA9IF9JT1coJ2MnLCAyLCBpbnQpLAorCS8qCisJICogbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQKKwkgKiBpbnQ6ICAwIGlmIHRoZSBsYXN0IEJSX0FUVEVNUFRfQUNRVUlSRSB3YXMgbm90IHN1Y2Nlc3NmdWwuCisJICogRWxzZSB5b3UgaGF2ZSBhY3F1aXJlZCBhIHByaW1hcnkgcmVmZXJlbmNlIG9uIHRoZSBvYmplY3QuCisJICovCisKKwlCQ19GUkVFX0JVRkZFUiA9IF9JT1coJ2MnLCAzLCBpbnQpLAorCS8qCisJICogdm9pZCAqOiBwdHIgdG8gdHJhbnNhY3Rpb24gZGF0YSByZWNlaXZlZCBvbiBhIHJlYWQKKwkgKi8KKworCUJDX0lOQ1JFRlMgPSBfSU9XKCdjJywgNCwgaW50KSwKKwlCQ19BQ1FVSVJFID0gX0lPVygnYycsIDUsIGludCksCisJQkNfUkVMRUFTRSA9IF9JT1coJ2MnLCA2LCBpbnQpLAorCUJDX0RFQ1JFRlMgPSBfSU9XKCdjJywgNywgaW50KSwKKwkvKgorCSAqIGludDoJZGVzY3JpcHRvcgorCSAqLworCisJQkNfSU5DUkVGU19ET05FID0gX0lPVygnYycsIDgsIHN0cnVjdCBiaW5kZXJfcHRyX2Nvb2tpZSksCisJQkNfQUNRVUlSRV9ET05FID0gX0lPVygnYycsIDksIHN0cnVjdCBiaW5kZXJfcHRyX2Nvb2tpZSksCisJLyoKKwkgKiB2b2lkICo6IHB0ciB0byBiaW5kZXIKKwkgKiB2b2lkICo6IGNvb2tpZSBmb3IgYmluZGVyCisJICovCisKKwlCQ19BVFRFTVBUX0FDUVVJUkUgPSBfSU9XKCdjJywgMTAsIHN0cnVjdCBiaW5kZXJfcHJpX2Rlc2MpLAorCS8qCisJICogbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQKKwkgKiBpbnQ6IHByaW9yaXR5CisJICogaW50OiBkZXNjcmlwdG9yCisJICovCisKKwlCQ19SRUdJU1RFUl9MT09QRVIgPSBfSU8oJ2MnLCAxMSksCisJLyoKKwkgKiBObyBwYXJhbWV0ZXJzLgorCSAqIFJlZ2lzdGVyIGEgc3Bhd25lZCBsb29wZXIgdGhyZWFkIHdpdGggdGhlIGRldmljZS4KKwkgKi8KKworCUJDX0VOVEVSX0xPT1BFUiA9IF9JTygnYycsIDEyKSwKKwlCQ19FWElUX0xPT1BFUiA9IF9JTygnYycsIDEzKSwKKwkvKgorCSAqIE5vIHBhcmFtZXRlcnMuCisJICogVGhlc2UgdHdvIGNvbW1hbmRzIGFyZSBzZW50IGFzIGFuIGFwcGxpY2F0aW9uLWxldmVsIHRocmVhZAorCSAqIGVudGVycyBhbmQgZXhpdHMgdGhlIGJpbmRlciBsb29wLCByZXNwZWN0aXZlbHkuICBUaGV5IGFyZQorCSAqIHVzZWQgc28gdGhlIGJpbmRlciBjYW4gaGF2ZSBhbiBhY2N1cmF0ZSBjb3VudCBvZiB0aGUgbnVtYmVyCisJICogb2YgbG9vcGluZyB0aHJlYWRzIGl0IGhhcyBhdmFpbGFibGUuCisJICovCisKKwlCQ19SRVFVRVNUX0RFQVRIX05PVElGSUNBVElPTiA9IF9JT1coJ2MnLCAxNCwgc3RydWN0IGJpbmRlcl9wdHJfY29va2llKSwKKwkvKgorCSAqIHZvaWQgKjogcHRyIHRvIGJpbmRlcgorCSAqIHZvaWQgKjogY29va2llCisJICovCisKKwlCQ19DTEVBUl9ERUFUSF9OT1RJRklDQVRJT04gPSBfSU9XKCdjJywgMTUsIHN0cnVjdCBiaW5kZXJfcHRyX2Nvb2tpZSksCisJLyoKKwkgKiB2b2lkICo6IHB0ciB0byBiaW5kZXIKKwkgKiB2b2lkICo6IGNvb2tpZQorCSAqLworCisJQkNfREVBRF9CSU5ERVJfRE9ORSA9IF9JT1coJ2MnLCAxNiwgdm9pZCAqKSwKKwkvKgorCSAqIHZvaWQgKjogY29va2llCisJICovCit9OworCisjZW5kaWYgLyogX0xJTlVYX0JJTkRFUl9IICovCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2xvZ2dlci5jIGIvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvbG9nZ2VyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWIzMjAwMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2xvZ2dlci5jCkBAIC0wLDAgKzEsNjA3IEBACisvKgorICogZHJpdmVycy9taXNjL2xvZ2dlci5jCisgKgorICogQSBMb2dnaW5nIFN1YnN5c3RlbQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEdvb2dsZSwgSW5jLgorICoKKyAqIFJvYmVydCBMb3ZlIDxybG92ZUBnb29nbGUuY29tPgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisgKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgImxvZ2dlci5oIgorCisjaW5jbHVkZSA8YXNtL2lvY3Rscy5oPgorCisvKgorICogc3RydWN0IGxvZ2dlcl9sb2cgLSByZXByZXNlbnRzIGEgc3BlY2lmaWMgbG9nLCBzdWNoIGFzICdtYWluJyBvciAncmFkaW8nCisgKgorICogVGhpcyBzdHJ1Y3R1cmUgbGl2ZXMgZnJvbSBtb2R1bGUgaW5zZXJ0aW9uIHVudGlsIG1vZHVsZSByZW1vdmFsLCBzbyBpdCBkb2VzCisgKiBub3QgbmVlZCBhZGRpdGlvbmFsIHJlZmVyZW5jZSBjb3VudGluZy4gVGhlIHN0cnVjdHVyZSBpcyBwcm90ZWN0ZWQgYnkgdGhlCisgKiBtdXRleCAnbXV0ZXgnLgorICovCitzdHJ1Y3QgbG9nZ2VyX2xvZyB7CisJdW5zaWduZWQgY2hhciAqCQlidWZmZXI7CS8qIHRoZSByaW5nIGJ1ZmZlciBpdHNlbGYgKi8KKwlzdHJ1Y3QgbWlzY2RldmljZQltaXNjOwkvKiBtaXNjIGRldmljZSByZXByZXNlbnRpbmcgdGhlIGxvZyAqLworCXdhaXRfcXVldWVfaGVhZF90CXdxOwkvKiB3YWl0IHF1ZXVlIGZvciByZWFkZXJzICovCisJc3RydWN0IGxpc3RfaGVhZAlyZWFkZXJzOyAvKiB0aGlzIGxvZydzIHJlYWRlcnMgKi8KKwlzdHJ1Y3QgbXV0ZXgJCW11dGV4OwkvKiBtdXRleCBwcm90ZWN0aW5nIGJ1ZmZlciAqLworCXNpemVfdAkJCXdfb2ZmOwkvKiBjdXJyZW50IHdyaXRlIGhlYWQgb2Zmc2V0ICovCisJc2l6ZV90CQkJaGVhZDsJLyogbmV3IHJlYWRlcnMgc3RhcnQgaGVyZSAqLworCXNpemVfdAkJCXNpemU7CS8qIHNpemUgb2YgdGhlIGxvZyAqLworfTsKKworLyoKKyAqIHN0cnVjdCBsb2dnZXJfcmVhZGVyIC0gYSBsb2dnaW5nIGRldmljZSBvcGVuIGZvciByZWFkaW5nCisgKgorICogVGhpcyBvYmplY3QgbGl2ZXMgZnJvbSBvcGVuIHRvIHJlbGVhc2UsIHNvIHdlIGRvbid0IG5lZWQgYWRkaXRpb25hbAorICogcmVmZXJlbmNlIGNvdW50aW5nLiBUaGUgc3RydWN0dXJlIGlzIHByb3RlY3RlZCBieSBsb2ctPm11dGV4LgorICovCitzdHJ1Y3QgbG9nZ2VyX3JlYWRlciB7CisJc3RydWN0IGxvZ2dlcl9sb2cgKglsb2c7CS8qIGFzc29jaWF0ZWQgbG9nICovCisJc3RydWN0IGxpc3RfaGVhZAlsaXN0OwkvKiBlbnRyeSBpbiBsb2dnZXJfbG9nJ3MgbGlzdCAqLworCXNpemVfdAkJCXJfb2ZmOwkvKiBjdXJyZW50IHJlYWQgaGVhZCBvZmZzZXQgKi8KK307CisKKy8qIGxvZ2dlcl9vZmZzZXQgLSByZXR1cm5zIGluZGV4ICduJyBpbnRvIHRoZSBsb2cgdmlhIChvcHRpbWl6ZWQpIG1vZHVsdXMgKi8KKyNkZWZpbmUgbG9nZ2VyX29mZnNldChuKQkoKG4pICYgKGxvZy0+c2l6ZSAtIDEpKQorCisvKgorICogZmlsZV9nZXRfbG9nIC0gR2l2ZW4gYSBmaWxlIHN0cnVjdHVyZSwgcmV0dXJuIHRoZSBhc3NvY2lhdGVkIGxvZworICoKKyAqIFRoaXMgaXNuJ3QgYWVzdGhldGljLiBXZSBoYXZlIHNldmVyYWwgZ29hbHM6CisgKgorICogCTEpIE5lZWQgdG8gcXVpY2tseSBvYnRhaW4gdGhlIGFzc29jaWF0ZWQgbG9nIGR1cmluZyBhbiBJL08gb3BlcmF0aW9uCisgKiAJMikgUmVhZGVycyBuZWVkIHRvIG1haW50YWluIHN0YXRlIChsb2dnZXJfcmVhZGVyKQorICogCTMpIFdyaXRlcnMgbmVlZCB0byBiZSB2ZXJ5IGZhc3QgKG9wZW4oKSBzaG91bGQgYmUgYSBuZWFyIG5vLW9wKQorICoKKyAqIEluIHRoZSByZWFkZXIgY2FzZSwgd2UgY2FuIHRyaXZpYWxseSBnbyBmaWxlLT5sb2dnZXJfcmVhZGVyLT5sb2dnZXJfbG9nLgorICogRm9yIGEgd3JpdGVyLCB3ZSBkb24ndCB3YW50IHRvIG1haW50YWluIGEgbG9nZ2VyX3JlYWRlciwgc28gd2UganVzdCBnbworICogZmlsZS0+bG9nZ2VyX2xvZy4gVGh1cyB3aGF0IGZpbGUtPnByaXZhdGVfZGF0YSBwb2ludHMgYXQgZGVwZW5kcyBvbiB3aGV0aGVyCisgKiBvciBub3QgdGhlIGZpbGUgd2FzIG9wZW5lZCBmb3IgcmVhZGluZy4gVGhpcyBmdW5jdGlvbiBoaWRlcyB0aGF0IGRpcnRpbmVzcy4KKyAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgbG9nZ2VyX2xvZyAqIGZpbGVfZ2V0X2xvZyhzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQlzdHJ1Y3QgbG9nZ2VyX3JlYWRlciAqcmVhZGVyID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCQlyZXR1cm4gcmVhZGVyLT5sb2c7CisJfSBlbHNlCisJCXJldHVybiBmaWxlLT5wcml2YXRlX2RhdGE7Cit9CisKKy8qCisgKiBnZXRfZW50cnlfbGVuIC0gR3JhYnMgdGhlIGxlbmd0aCBvZiB0aGUgcGF5bG9hZCBvZiB0aGUgbmV4dCBlbnRyeSBzdGFydGluZworICogZnJvbSAnb2ZmJy4KKyAqCisgKiBDYWxsZXIgbmVlZHMgdG8gaG9sZCBsb2ctPm11dGV4LgorICovCitzdGF0aWMgX191MzIgZ2V0X2VudHJ5X2xlbihzdHJ1Y3QgbG9nZ2VyX2xvZyAqbG9nLCBzaXplX3Qgb2ZmKQoreworCV9fdTE2IHZhbDsKKworCXN3aXRjaCAobG9nLT5zaXplIC0gb2ZmKSB7CisJY2FzZSAxOgorCQltZW1jcHkoJnZhbCwgbG9nLT5idWZmZXIgKyBvZmYsIDEpOworCQltZW1jcHkoKChjaGFyICopICZ2YWwpICsgMSwgbG9nLT5idWZmZXIsIDEpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQltZW1jcHkoJnZhbCwgbG9nLT5idWZmZXIgKyBvZmYsIDIpOworCX0KKworCXJldHVybiBzaXplb2Yoc3RydWN0IGxvZ2dlcl9lbnRyeSkgKyB2YWw7Cit9CisKKy8qCisgKiBkb19yZWFkX2xvZ190b191c2VyIC0gcmVhZHMgZXhhY3RseSAnY291bnQnIGJ5dGVzIGZyb20gJ2xvZycgaW50byB0aGUKKyAqIHVzZXItc3BhY2UgYnVmZmVyICdidWYnLiBSZXR1cm5zICdjb3VudCcgb24gc3VjY2Vzcy4KKyAqCisgKiBDYWxsZXIgbXVzdCBob2xkIGxvZy0+bXV0ZXguCisgKi8KK3N0YXRpYyBzc2l6ZV90IGRvX3JlYWRfbG9nX3RvX3VzZXIoc3RydWN0IGxvZ2dlcl9sb2cgKmxvZywKKwkJCQkgICBzdHJ1Y3QgbG9nZ2VyX3JlYWRlciAqcmVhZGVyLAorCQkJCSAgIGNoYXIgX191c2VyICpidWYsCisJCQkJICAgc2l6ZV90IGNvdW50KQoreworCXNpemVfdCBsZW47CisKKwkvKgorCSAqIFdlIHJlYWQgZnJvbSB0aGUgbG9nIGluIHR3byBkaXNqb2ludCBvcGVyYXRpb25zLiBGaXJzdCwgd2UgcmVhZCBmcm9tCisJICogdGhlIGN1cnJlbnQgcmVhZCBoZWFkIG9mZnNldCB1cCB0byAnY291bnQnIGJ5dGVzIG9yIHRvIHRoZSBlbmQgb2YKKwkgKiB0aGUgbG9nLCB3aGljaGV2ZXIgY29tZXMgZmlyc3QuCisJICovCisJbGVuID0gbWluKGNvdW50LCBsb2ctPnNpemUgLSByZWFkZXItPnJfb2ZmKTsKKwlpZiAoY29weV90b191c2VyKGJ1ZiwgbG9nLT5idWZmZXIgKyByZWFkZXItPnJfb2ZmLCBsZW4pKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCS8qCisJICogU2Vjb25kLCB3ZSByZWFkIGFueSByZW1haW5pbmcgYnl0ZXMsIHN0YXJ0aW5nIGJhY2sgYXQgdGhlIGhlYWQgb2YKKwkgKiB0aGUgbG9nLgorCSAqLworCWlmIChjb3VudCAhPSBsZW4pCisJCWlmIChjb3B5X3RvX3VzZXIoYnVmICsgbGVuLCBsb2ctPmJ1ZmZlciwgY291bnQgLSBsZW4pKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZWFkZXItPnJfb2ZmID0gbG9nZ2VyX29mZnNldChyZWFkZXItPnJfb2ZmICsgY291bnQpOworCisJcmV0dXJuIGNvdW50OworfQorCisvKgorICogbG9nZ2VyX3JlYWQgLSBvdXIgbG9nJ3MgcmVhZCgpIG1ldGhvZAorICoKKyAqIEJlaGF2aW9yOgorICoKKyAqIAktIE9fTk9OQkxPQ0sgd29ya3MKKyAqIAktIElmIHRoZXJlIGFyZSBubyBsb2cgZW50cmllcyB0byByZWFkLCBibG9ja3MgdW50aWwgbG9nIGlzIHdyaXR0ZW4gdG8KKyAqIAktIEF0b21pY2FsbHkgcmVhZHMgZXhhY3RseSBvbmUgbG9nIGVudHJ5CisgKgorICogT3B0aW1hbCByZWFkIHNpemUgaXMgTE9HR0VSX0VOVFJZX01BWF9MRU4uIFdpbGwgc2V0IGVycm5vIHRvIEVJTlZBTCBpZiByZWFkCisgKiBidWZmZXIgaXMgaW5zdWZmaWNpZW50IHRvIGhvbGQgbmV4dCBlbnRyeS4KKyAqLworc3RhdGljIHNzaXplX3QgbG9nZ2VyX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsCisJCQkgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcG9zKQoreworCXN0cnVjdCBsb2dnZXJfcmVhZGVyICpyZWFkZXIgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGxvZ2dlcl9sb2cgKmxvZyA9IHJlYWRlci0+bG9nOworCXNzaXplX3QgcmV0OworCURFRklORV9XQUlUKHdhaXQpOworCitzdGFydDoKKwl3aGlsZSAoMSkgeworCQlwcmVwYXJlX3RvX3dhaXQoJmxvZy0+d3EsICZ3YWl0LCBUQVNLX0lOVEVSUlVQVElCTEUpOworCisJCW11dGV4X2xvY2soJmxvZy0+bXV0ZXgpOworCQlyZXQgPSAobG9nLT53X29mZiA9PSByZWFkZXItPnJfb2ZmKTsKKwkJbXV0ZXhfdW5sb2NrKCZsb2ctPm11dGV4KTsKKwkJaWYgKCFyZXQpCisJCQlicmVhazsKKworCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKKwkJCXJldCA9IC1FQUdBSU47CisJCQlicmVhazsKKwkJfQorCisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJcmV0ID0gLUVJTlRSOworCQkJYnJlYWs7CisJCX0KKworCQlzY2hlZHVsZSgpOworCX0KKworCWZpbmlzaF93YWl0KCZsb2ctPndxLCAmd2FpdCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCW11dGV4X2xvY2soJmxvZy0+bXV0ZXgpOworCisJLyogaXMgdGhlcmUgc3RpbGwgc29tZXRoaW5nIHRvIHJlYWQgb3IgZGlkIHdlIHJhY2U/ICovCisJaWYgKHVubGlrZWx5KGxvZy0+d19vZmYgPT0gcmVhZGVyLT5yX29mZikpIHsKKwkJbXV0ZXhfdW5sb2NrKCZsb2ctPm11dGV4KTsKKwkJZ290byBzdGFydDsKKwl9CisKKwkvKiBnZXQgdGhlIHNpemUgb2YgdGhlIG5leHQgZW50cnkgKi8KKwlyZXQgPSBnZXRfZW50cnlfbGVuKGxvZywgcmVhZGVyLT5yX29mZik7CisJaWYgKGNvdW50IDwgcmV0KSB7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCS8qIGdldCBleGFjdGx5IG9uZSBlbnRyeSBmcm9tIHRoZSBsb2cgKi8KKwlyZXQgPSBkb19yZWFkX2xvZ190b191c2VyKGxvZywgcmVhZGVyLCBidWYsIHJldCk7CisKK291dDoKKwltdXRleF91bmxvY2soJmxvZy0+bXV0ZXgpOworCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIGdldF9uZXh0X2VudHJ5IC0gcmV0dXJuIHRoZSBvZmZzZXQgb2YgdGhlIGZpcnN0IHZhbGlkIGVudHJ5IGF0IGxlYXN0ICdsZW4nCisgKiBieXRlcyBhZnRlciAnb2ZmJy4KKyAqCisgKiBDYWxsZXIgbXVzdCBob2xkIGxvZy0+bXV0ZXguCisgKi8KK3N0YXRpYyBzaXplX3QgZ2V0X25leHRfZW50cnkoc3RydWN0IGxvZ2dlcl9sb2cgKmxvZywgc2l6ZV90IG9mZiwgc2l6ZV90IGxlbikKK3sKKwlzaXplX3QgY291bnQgPSAwOworCisJZG8geworCQlzaXplX3QgbnIgPSBnZXRfZW50cnlfbGVuKGxvZywgb2ZmKTsKKwkJb2ZmID0gbG9nZ2VyX29mZnNldChvZmYgKyBucik7CisJCWNvdW50ICs9IG5yOworCX0gd2hpbGUgKGNvdW50IDwgbGVuKTsKKworCXJldHVybiBvZmY7Cit9CisKKy8qCisgKiBjbG9ja19pbnRlcnZhbCAtIGlzIGEgPCBjIDwgYiBpbiBtb2Qtc3BhY2U/IFB1dCBhbm90aGVyIHdheSwgZG9lcyB0aGUgbGluZQorICogZnJvbSBhIHRvIGIgY3Jvc3MgYz8KKyAqLworc3RhdGljIGlubGluZSBpbnQgY2xvY2tfaW50ZXJ2YWwoc2l6ZV90IGEsIHNpemVfdCBiLCBzaXplX3QgYykKK3sKKwlpZiAoYiA8IGEpIHsKKwkJaWYgKGEgPCBjIHx8IGIgPj0gYykKKwkJCXJldHVybiAxOworCX0gZWxzZSB7CisJCWlmIChhIDwgYyAmJiBiID49IGMpCisJCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGZpeF91cF9yZWFkZXJzIC0gd2FsayB0aGUgbGlzdCBvZiBhbGwgcmVhZGVycyBhbmQgImZpeCB1cCIgYW55IHdobyB3ZXJlCisgKiBsYXBwZWQgYnkgdGhlIHdyaXRlcjsgYWxzbyBkbyB0aGUgc2FtZSBmb3IgdGhlIGRlZmF1bHQgInN0YXJ0IGhlYWQiLgorICogV2UgZG8gdGhpcyBieSAicHVsbGluZyBmb3J3YXJkIiB0aGUgcmVhZGVycyBhbmQgc3RhcnQgaGVhZCB0byB0aGUgZmlyc3QKKyAqIGVudHJ5IGFmdGVyIHRoZSBuZXcgd3JpdGUgaGVhZC4KKyAqCisgKiBUaGUgY2FsbGVyIG5lZWRzIHRvIGhvbGQgbG9nLT5tdXRleC4KKyAqLworc3RhdGljIHZvaWQgZml4X3VwX3JlYWRlcnMoc3RydWN0IGxvZ2dlcl9sb2cgKmxvZywgc2l6ZV90IGxlbikKK3sKKwlzaXplX3Qgb2xkID0gbG9nLT53X29mZjsKKwlzaXplX3QgbmV3ID0gbG9nZ2VyX29mZnNldChvbGQgKyBsZW4pOworCXN0cnVjdCBsb2dnZXJfcmVhZGVyICpyZWFkZXI7CisKKwlpZiAoY2xvY2tfaW50ZXJ2YWwob2xkLCBuZXcsIGxvZy0+aGVhZCkpCisJCWxvZy0+aGVhZCA9IGdldF9uZXh0X2VudHJ5KGxvZywgbG9nLT5oZWFkLCBsZW4pOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShyZWFkZXIsICZsb2ctPnJlYWRlcnMsIGxpc3QpCisJCWlmIChjbG9ja19pbnRlcnZhbChvbGQsIG5ldywgcmVhZGVyLT5yX29mZikpCisJCQlyZWFkZXItPnJfb2ZmID0gZ2V0X25leHRfZW50cnkobG9nLCByZWFkZXItPnJfb2ZmLCBsZW4pOworfQorCisvKgorICogZG9fd3JpdGVfbG9nIC0gd3JpdGVzICdsZW4nIGJ5dGVzIGZyb20gJ2J1ZicgdG8gJ2xvZycKKyAqCisgKiBUaGUgY2FsbGVyIG5lZWRzIHRvIGhvbGQgbG9nLT5tdXRleC4KKyAqLworc3RhdGljIHZvaWQgZG9fd3JpdGVfbG9nKHN0cnVjdCBsb2dnZXJfbG9nICpsb2csIGNvbnN0IHZvaWQgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXNpemVfdCBsZW47CisKKwlsZW4gPSBtaW4oY291bnQsIGxvZy0+c2l6ZSAtIGxvZy0+d19vZmYpOworCW1lbWNweShsb2ctPmJ1ZmZlciArIGxvZy0+d19vZmYsIGJ1ZiwgbGVuKTsKKworCWlmIChjb3VudCAhPSBsZW4pCisJCW1lbWNweShsb2ctPmJ1ZmZlciwgYnVmICsgbGVuLCBjb3VudCAtIGxlbik7CisKKwlsb2ctPndfb2ZmID0gbG9nZ2VyX29mZnNldChsb2ctPndfb2ZmICsgY291bnQpOworCit9CisKKy8qCisgKiBkb193cml0ZV9sb2dfdXNlciAtIHdyaXRlcyAnbGVuJyBieXRlcyBmcm9tIHRoZSB1c2VyLXNwYWNlIGJ1ZmZlciAnYnVmJyB0bworICogdGhlIGxvZyAnbG9nJworICoKKyAqIFRoZSBjYWxsZXIgbmVlZHMgdG8gaG9sZCBsb2ctPm11dGV4LgorICoKKyAqIFJldHVybnMgJ2NvdW50JyBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCisgKi8KK3N0YXRpYyBzc2l6ZV90IGRvX3dyaXRlX2xvZ19mcm9tX3VzZXIoc3RydWN0IGxvZ2dlcl9sb2cgKmxvZywKKwkJCQkgICAgICBjb25zdCB2b2lkIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc2l6ZV90IGxlbjsKKworCWxlbiA9IG1pbihjb3VudCwgbG9nLT5zaXplIC0gbG9nLT53X29mZik7CisJaWYgKGxlbiAmJiBjb3B5X2Zyb21fdXNlcihsb2ctPmJ1ZmZlciArIGxvZy0+d19vZmYsIGJ1ZiwgbGVuKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoY291bnQgIT0gbGVuKQorCQlpZiAoY29weV9mcm9tX3VzZXIobG9nLT5idWZmZXIsIGJ1ZiArIGxlbiwgY291bnQgLSBsZW4pKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwlsb2ctPndfb2ZmID0gbG9nZ2VyX29mZnNldChsb2ctPndfb2ZmICsgY291bnQpOworCisJcmV0dXJuIGNvdW50OworfQorCisvKgorICogbG9nZ2VyX2Fpb193cml0ZSAtIG91ciB3cml0ZSBtZXRob2QsIGltcGxlbWVudGluZyBzdXBwb3J0IGZvciB3cml0ZSgpLAorICogd3JpdGV2KCksIGFuZCBhaW9fd3JpdGUoKS4gV3JpdGVzIGFyZSBvdXIgZmFzdCBwYXRoLCBhbmQgd2UgdHJ5IHRvIG9wdGltaXplCisgKiB0aGVtIGFib3ZlIGFsbCBlbHNlLgorICovCitzc2l6ZV90IGxvZ2dlcl9haW9fd3JpdGUoc3RydWN0IGtpb2NiICppb2NiLCBjb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdiwKKwkJCSB1bnNpZ25lZCBsb25nIG5yX3NlZ3MsIGxvZmZfdCBwcG9zKQoreworCXN0cnVjdCBsb2dnZXJfbG9nICpsb2cgPSBmaWxlX2dldF9sb2coaW9jYi0+a2lfZmlscCk7CisJc2l6ZV90IG9yaWcgPSBsb2ctPndfb2ZmOworCXN0cnVjdCBsb2dnZXJfZW50cnkgaGVhZGVyOworCXN0cnVjdCB0aW1lc3BlYyBub3c7CisJc3NpemVfdCByZXQgPSAwOworCisJbm93ID0gY3VycmVudF9rZXJuZWxfdGltZSgpOworCisJaGVhZGVyLnBpZCA9IGN1cnJlbnQtPnRnaWQ7CisJaGVhZGVyLnRpZCA9IGN1cnJlbnQtPnBpZDsKKwloZWFkZXIuc2VjID0gbm93LnR2X3NlYzsKKwloZWFkZXIubnNlYyA9IG5vdy50dl9uc2VjOworCWhlYWRlci5sZW4gPSBtaW5fdChzaXplX3QsIGlvY2ItPmtpX2xlZnQsIExPR0dFUl9FTlRSWV9NQVhfUEFZTE9BRCk7CisKKwkvKiBudWxsIHdyaXRlcyBzdWNjZWVkLCByZXR1cm4gemVybyAqLworCWlmICh1bmxpa2VseSghaGVhZGVyLmxlbikpCisJCXJldHVybiAwOworCisJbXV0ZXhfbG9jaygmbG9nLT5tdXRleCk7CisKKwkvKgorCSAqIEZpeCB1cCBhbnkgcmVhZGVycywgcHVsbGluZyB0aGVtIGZvcndhcmQgdG8gdGhlIGZpcnN0IHJlYWRhYmxlCisJICogZW50cnkgYWZ0ZXIgKHdoYXQgd2lsbCBiZSkgdGhlIG5ldyB3cml0ZSBvZmZzZXQuIFdlIGRvIHRoaXMgbm93CisJICogYmVjYXVzZSBpZiB3ZSBwYXJ0aWFsbHkgZmFpbCwgd2UgY2FuIGVuZCB1cCB3aXRoIGNsb2JiZXJlZCBsb2cKKwkgKiBlbnRyaWVzIHRoYXQgZW5jcm9hY2ggb24gcmVhZGFibGUgYnVmZmVyLgorCSAqLworCWZpeF91cF9yZWFkZXJzKGxvZywgc2l6ZW9mKHN0cnVjdCBsb2dnZXJfZW50cnkpICsgaGVhZGVyLmxlbik7CisKKwlkb193cml0ZV9sb2cobG9nLCAmaGVhZGVyLCBzaXplb2Yoc3RydWN0IGxvZ2dlcl9lbnRyeSkpOworCisJd2hpbGUgKG5yX3NlZ3MtLSA+IDApIHsKKwkJc2l6ZV90IGxlbjsKKwkJc3NpemVfdCBucjsKKworCQkvKiBmaWd1cmUgb3V0IGhvdyBtdWNoIG9mIHRoaXMgdmVjdG9yIHdlIGNhbiBrZWVwICovCisJCWxlbiA9IG1pbl90KHNpemVfdCwgaW92LT5pb3ZfbGVuLCBoZWFkZXIubGVuIC0gcmV0KTsKKworCQkvKiB3cml0ZSBvdXQgdGhpcyBzZWdtZW50J3MgcGF5bG9hZCAqLworCQluciA9IGRvX3dyaXRlX2xvZ19mcm9tX3VzZXIobG9nLCBpb3YtPmlvdl9iYXNlLCBsZW4pOworCQlpZiAodW5saWtlbHkobnIgPCAwKSkgeworCQkJbG9nLT53X29mZiA9IG9yaWc7CisJCQltdXRleF91bmxvY2soJmxvZy0+bXV0ZXgpOworCQkJcmV0dXJuIG5yOworCQl9CisKKwkJaW92Kys7CisJCXJldCArPSBucjsKKwl9CisKKwltdXRleF91bmxvY2soJmxvZy0+bXV0ZXgpOworCisJLyogd2FrZSB1cCBhbnkgYmxvY2tlZCByZWFkZXJzICovCisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZsb2ctPndxKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbG9nZ2VyX2xvZyAqIGdldF9sb2dfZnJvbV9taW5vcihpbnQpOworCisvKgorICogbG9nZ2VyX29wZW4gLSB0aGUgbG9nJ3Mgb3BlbigpIGZpbGUgb3BlcmF0aW9uCisgKgorICogTm90ZSBob3cgbmVhciBhIG5vLW9wIHRoaXMgaXMgaW4gdGhlIHdyaXRlLW9ubHkgY2FzZS4gS2VlcCBpdCB0aGF0IHdheSEKKyAqLworc3RhdGljIGludCBsb2dnZXJfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgbG9nZ2VyX2xvZyAqbG9nOworCWludCByZXQ7CisKKwlyZXQgPSBub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxlKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJbG9nID0gZ2V0X2xvZ19mcm9tX21pbm9yKE1JTk9SKGlub2RlLT5pX3JkZXYpKTsKKwlpZiAoIWxvZykKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQlzdHJ1Y3QgbG9nZ2VyX3JlYWRlciAqcmVhZGVyOworCisJCXJlYWRlciA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBsb2dnZXJfcmVhZGVyKSwgR0ZQX0tFUk5FTCk7CisJCWlmICghcmVhZGVyKQorCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJcmVhZGVyLT5sb2cgPSBsb2c7CisJCUlOSVRfTElTVF9IRUFEKCZyZWFkZXItPmxpc3QpOworCisJCW11dGV4X2xvY2soJmxvZy0+bXV0ZXgpOworCQlyZWFkZXItPnJfb2ZmID0gbG9nLT5oZWFkOworCQlsaXN0X2FkZF90YWlsKCZyZWFkZXItPmxpc3QsICZsb2ctPnJlYWRlcnMpOworCQltdXRleF91bmxvY2soJmxvZy0+bXV0ZXgpOworCisJCWZpbGUtPnByaXZhdGVfZGF0YSA9IHJlYWRlcjsKKwl9IGVsc2UKKwkJZmlsZS0+cHJpdmF0ZV9kYXRhID0gbG9nOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBsb2dnZXJfcmVsZWFzZSAtIHRoZSBsb2cncyByZWxlYXNlIGZpbGUgb3BlcmF0aW9uCisgKgorICogTm90ZSB0aGlzIGlzIGEgdG90YWwgbm8tb3AgaW4gdGhlIHdyaXRlLW9ubHkgY2FzZS4gS2VlcCBpdCB0aGF0IHdheSEKKyAqLworc3RhdGljIGludCBsb2dnZXJfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlnbm9yZWQsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCXN0cnVjdCBsb2dnZXJfcmVhZGVyICpyZWFkZXIgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJCWxpc3RfZGVsKCZyZWFkZXItPmxpc3QpOworCQlrZnJlZShyZWFkZXIpOworCX0KKworCXJldHVybiAwOworfQorCisvKgorICogbG9nZ2VyX3BvbGwgLSB0aGUgbG9nJ3MgcG9sbCBmaWxlIG9wZXJhdGlvbiwgZm9yIHBvbGwvc2VsZWN0L2Vwb2xsCisgKgorICogTm90ZSB3ZSBhbHdheXMgcmV0dXJuIFBPTExPVVQsIGJlY2F1c2UgeW91IGNhbiBhbHdheXMgd3JpdGUoKSB0byB0aGUgbG9nLgorICogTm90ZSBhbHNvIHRoYXQsIHN0cmljdGx5IHNwZWFraW5nLCBhIHJldHVybiB2YWx1ZSBvZiBQT0xMSU4gZG9lcyBub3QKKyAqIGd1YXJhbnRlZSB0aGF0IHRoZSBsb2cgaXMgcmVhZGFibGUgd2l0aG91dCBibG9ja2luZywgYXMgdGhlcmUgaXMgYSBzbWFsbAorICogY2hhbmNlIHRoYXQgdGhlIHdyaXRlciBjYW4gbGFwIHRoZSByZWFkZXIgaW4gdGhlIGludGVyaW0gYmV0d2VlbiBwb2xsKCkKKyAqIHJldHVybmluZyBhbmQgdGhlIHJlYWQoKSByZXF1ZXN0LgorICovCitzdGF0aWMgdW5zaWduZWQgaW50IGxvZ2dlcl9wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBwb2xsX3RhYmxlICp3YWl0KQoreworCXN0cnVjdCBsb2dnZXJfcmVhZGVyICpyZWFkZXI7CisJc3RydWN0IGxvZ2dlcl9sb2cgKmxvZzsKKwl1bnNpZ25lZCBpbnQgcmV0ID0gUE9MTE9VVCB8IFBPTExXUk5PUk07CisKKwlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSkKKwkJcmV0dXJuIHJldDsKKworCXJlYWRlciA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlsb2cgPSByZWFkZXItPmxvZzsKKworCXBvbGxfd2FpdChmaWxlLCAmbG9nLT53cSwgd2FpdCk7CisKKwltdXRleF9sb2NrKCZsb2ctPm11dGV4KTsKKwlpZiAobG9nLT53X29mZiAhPSByZWFkZXItPnJfb2ZmKQorCQlyZXQgfD0gUE9MTElOIHwgUE9MTFJETk9STTsKKwltdXRleF91bmxvY2soJmxvZy0+bXV0ZXgpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGxvbmcgbG9nZ2VyX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgbG9nZ2VyX2xvZyAqbG9nID0gZmlsZV9nZXRfbG9nKGZpbGUpOworCXN0cnVjdCBsb2dnZXJfcmVhZGVyICpyZWFkZXI7CisJbG9uZyByZXQgPSAtRU5PVFRZOworCisJbXV0ZXhfbG9jaygmbG9nLT5tdXRleCk7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgTE9HR0VSX0dFVF9MT0dfQlVGX1NJWkU6CisJCXJldCA9IGxvZy0+c2l6ZTsKKwkJYnJlYWs7CisJY2FzZSBMT0dHRVJfR0VUX0xPR19MRU46CisJCWlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpKSB7CisJCQlyZXQgPSAtRUJBREY7CisJCQlicmVhazsKKwkJfQorCQlyZWFkZXIgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJCWlmIChsb2ctPndfb2ZmID49IHJlYWRlci0+cl9vZmYpCisJCQlyZXQgPSBsb2ctPndfb2ZmIC0gcmVhZGVyLT5yX29mZjsKKwkJZWxzZQorCQkJcmV0ID0gKGxvZy0+c2l6ZSAtIHJlYWRlci0+cl9vZmYpICsgbG9nLT53X29mZjsKKwkJYnJlYWs7CisJY2FzZSBMT0dHRVJfR0VUX05FWFRfRU5UUllfTEVOOgorCQlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSkgeworCQkJcmV0ID0gLUVCQURGOworCQkJYnJlYWs7CisJCX0KKwkJcmVhZGVyID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCQlpZiAobG9nLT53X29mZiAhPSByZWFkZXItPnJfb2ZmKQorCQkJcmV0ID0gZ2V0X2VudHJ5X2xlbihsb2csIHJlYWRlci0+cl9vZmYpOworCQllbHNlCisJCQlyZXQgPSAwOworCQlicmVhazsKKwljYXNlIExPR0dFUl9GTFVTSF9MT0c6CisJCWlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSkgeworCQkJcmV0ID0gLUVCQURGOworCQkJYnJlYWs7CisJCX0KKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShyZWFkZXIsICZsb2ctPnJlYWRlcnMsIGxpc3QpCisJCQlyZWFkZXItPnJfb2ZmID0gbG9nLT53X29mZjsKKwkJbG9nLT5oZWFkID0gbG9nLT53X29mZjsKKwkJcmV0ID0gMDsKKwkJYnJlYWs7CisJfQorCisJbXV0ZXhfdW5sb2NrKCZsb2ctPm11dGV4KTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGxvZ2dlcl9mb3BzID0geworCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5yZWFkID0gbG9nZ2VyX3JlYWQsCisJLmFpb193cml0ZSA9IGxvZ2dlcl9haW9fd3JpdGUsCisJLnBvbGwgPSBsb2dnZXJfcG9sbCwKKwkudW5sb2NrZWRfaW9jdGwgPSBsb2dnZXJfaW9jdGwsCisJLmNvbXBhdF9pb2N0bCA9IGxvZ2dlcl9pb2N0bCwKKwkub3BlbiA9IGxvZ2dlcl9vcGVuLAorCS5yZWxlYXNlID0gbG9nZ2VyX3JlbGVhc2UsCit9OworCisvKgorICogRGVmaW5lcyBhIGxvZyBzdHJ1Y3R1cmUgd2l0aCBuYW1lICdOQU1FJyBhbmQgYSBzaXplIG9mICdTSVpFJyBieXRlcywgd2hpY2gKKyAqIG11c3QgYmUgYSBwb3dlciBvZiB0d28sIGdyZWF0ZXIgdGhhbiBMT0dHRVJfRU5UUllfTUFYX0xFTiwgYW5kIGxlc3MgdGhhbgorICogTE9OR19NQVggbWludXMgTE9HR0VSX0VOVFJZX01BWF9MRU4uCisgKi8KKyNkZWZpbmUgREVGSU5FX0xPR0dFUl9ERVZJQ0UoVkFSLCBOQU1FLCBTSVpFKSBcCitzdGF0aWMgdW5zaWduZWQgY2hhciBfYnVmXyAjIyBWQVJbU0laRV07IFwKK3N0YXRpYyBzdHJ1Y3QgbG9nZ2VyX2xvZyBWQVIgPSB7IFwKKwkuYnVmZmVyID0gX2J1Zl8gIyMgVkFSLCBcCisJLm1pc2MgPSB7IFwKKwkJLm1pbm9yID0gTUlTQ19EWU5BTUlDX01JTk9SLCBcCisJCS5uYW1lID0gTkFNRSwgXAorCQkuZm9wcyA9ICZsb2dnZXJfZm9wcywgXAorCQkucGFyZW50ID0gTlVMTCwgXAorCX0sIFwKKwkud3EgPSBfX1dBSVRfUVVFVUVfSEVBRF9JTklUSUFMSVpFUihWQVIgLndxKSwgXAorCS5yZWFkZXJzID0gTElTVF9IRUFEX0lOSVQoVkFSIC5yZWFkZXJzKSwgXAorCS5tdXRleCA9IF9fTVVURVhfSU5JVElBTElaRVIoVkFSIC5tdXRleCksIFwKKwkud19vZmYgPSAwLCBcCisJLmhlYWQgPSAwLCBcCisJLnNpemUgPSBTSVpFLCBcCit9OworCitERUZJTkVfTE9HR0VSX0RFVklDRShsb2dfbWFpbiwgTE9HR0VSX0xPR19NQUlOLCA2NCoxMDI0KQorREVGSU5FX0xPR0dFUl9ERVZJQ0UobG9nX2V2ZW50cywgTE9HR0VSX0xPR19FVkVOVFMsIDI1NioxMDI0KQorREVGSU5FX0xPR0dFUl9ERVZJQ0UobG9nX3JhZGlvLCBMT0dHRVJfTE9HX1JBRElPLCA2NCoxMDI0KQorCitzdGF0aWMgc3RydWN0IGxvZ2dlcl9sb2cgKiBnZXRfbG9nX2Zyb21fbWlub3IoaW50IG1pbm9yKQoreworCWlmIChsb2dfbWFpbi5taXNjLm1pbm9yID09IG1pbm9yKQorCQlyZXR1cm4gJmxvZ19tYWluOworCWlmIChsb2dfZXZlbnRzLm1pc2MubWlub3IgPT0gbWlub3IpCisJCXJldHVybiAmbG9nX2V2ZW50czsKKwlpZiAobG9nX3JhZGlvLm1pc2MubWlub3IgPT0gbWlub3IpCisJCXJldHVybiAmbG9nX3JhZGlvOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IF9faW5pdCBpbml0X2xvZyhzdHJ1Y3QgbG9nZ2VyX2xvZyAqbG9nKQoreworCWludCByZXQ7CisKKwlyZXQgPSBtaXNjX3JlZ2lzdGVyKCZsb2ctPm1pc2MpOworCWlmICh1bmxpa2VseShyZXQpKSB7CisJCXByaW50ayhLRVJOX0VSUiAibG9nZ2VyOiBmYWlsZWQgdG8gcmVnaXN0ZXIgbWlzYyAiCisJCSAgICAgICAiZGV2aWNlIGZvciBsb2cgJyVzJyFcbiIsIGxvZy0+bWlzYy5uYW1lKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlwcmludGsoS0VSTl9JTkZPICJsb2dnZXI6IGNyZWF0ZWQgJWx1SyBsb2cgJyVzJ1xuIiwKKwkgICAgICAgKHVuc2lnbmVkIGxvbmcpIGxvZy0+c2l6ZSA+PiAxMCwgbG9nLT5taXNjLm5hbWUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGxvZ2dlcl9pbml0KHZvaWQpCit7CisJaW50IHJldDsKKworCXJldCA9IGluaXRfbG9nKCZsb2dfbWFpbik7CisJaWYgKHVubGlrZWx5KHJldCkpCisJCWdvdG8gb3V0OworCisJcmV0ID0gaW5pdF9sb2coJmxvZ19ldmVudHMpOworCWlmICh1bmxpa2VseShyZXQpKQorCQlnb3RvIG91dDsKKworCXJldCA9IGluaXRfbG9nKCZsb2dfcmFkaW8pOworCWlmICh1bmxpa2VseShyZXQpKQorCQlnb3RvIG91dDsKKworb3V0OgorCXJldHVybiByZXQ7Cit9CitkZXZpY2VfaW5pdGNhbGwobG9nZ2VyX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvbG9nZ2VyLmggYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9sb2dnZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTYyNDM0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvbG9nZ2VyLmgKQEAgLTAsMCArMSw0OCBAQAorLyogaW5jbHVkZS9saW51eC9sb2dnZXIuaAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEdvb2dsZSwgSW5jLgorICogQXV0aG9yOiBSb2JlcnQgTG92ZSA8cmxvdmVAYW5kcm9pZC5jb20+CisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyAqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKworI2lmbmRlZiBfTElOVVhfTE9HR0VSX0gKKyNkZWZpbmUgX0xJTlVYX0xPR0dFUl9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CisKK3N0cnVjdCBsb2dnZXJfZW50cnkgeworCV9fdTE2CQlsZW47CS8qIGxlbmd0aCBvZiB0aGUgcGF5bG9hZCAqLworCV9fdTE2CQlfX3BhZDsJLyogbm8gbWF0dGVyIHdoYXQsIHdlIGdldCAyIGJ5dGVzIG9mIHBhZGRpbmcgKi8KKwlfX3MzMgkJcGlkOwkvKiBnZW5lcmF0aW5nIHByb2Nlc3MncyBwaWQgKi8KKwlfX3MzMgkJdGlkOwkvKiBnZW5lcmF0aW5nIHByb2Nlc3MncyB0aWQgKi8KKwlfX3MzMgkJc2VjOwkvKiBzZWNvbmRzIHNpbmNlIEVwb2NoICovCisJX19zMzIJCW5zZWM7CS8qIG5hbm9zZWNvbmRzICovCisJY2hhcgkJbXNnWzBdOwkvKiB0aGUgZW50cnkncyBwYXlsb2FkICovCit9OworCisjZGVmaW5lIExPR0dFUl9MT0dfUkFESU8JImxvZ19yYWRpbyIJLyogcmFkaW8tcmVsYXRlZCBtZXNzYWdlcyAqLworI2RlZmluZSBMT0dHRVJfTE9HX0VWRU5UUwkibG9nX2V2ZW50cyIJLyogc3lzdGVtL2hhcmR3YXJlIGV2ZW50cyAqLworI2RlZmluZSBMT0dHRVJfTE9HX01BSU4JCSJsb2dfbWFpbiIJLyogZXZlcnl0aGluZyBlbHNlICovCisKKyNkZWZpbmUgTE9HR0VSX0VOVFJZX01BWF9MRU4JCSg0KjEwMjQpCisjZGVmaW5lIExPR0dFUl9FTlRSWV9NQVhfUEFZTE9BRAlcCisJKExPR0dFUl9FTlRSWV9NQVhfTEVOIC0gc2l6ZW9mKHN0cnVjdCBsb2dnZXJfZW50cnkpKQorCisjZGVmaW5lIF9fTE9HR0VSSU8JMHhBRQorCisjZGVmaW5lIExPR0dFUl9HRVRfTE9HX0JVRl9TSVpFCQlfSU8oX19MT0dHRVJJTywgMSkgLyogc2l6ZSBvZiBsb2cgKi8KKyNkZWZpbmUgTE9HR0VSX0dFVF9MT0dfTEVOCQlfSU8oX19MT0dHRVJJTywgMikgLyogdXNlZCBsb2cgbGVuICovCisjZGVmaW5lIExPR0dFUl9HRVRfTkVYVF9FTlRSWV9MRU4JX0lPKF9fTE9HR0VSSU8sIDMpIC8qIG5leHQgZW50cnkgbGVuICovCisjZGVmaW5lIExPR0dFUl9GTFVTSF9MT0cJCV9JTyhfX0xPR0dFUklPLCA0KSAvKiBmbHVzaCBsb2cgKi8KKworI2VuZGlmIC8qIF9MSU5VWF9MT0dHRVJfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvbG93bWVtb3J5a2lsbGVyLmMgYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9sb3dtZW1vcnlraWxsZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzE1ZDU2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvbG93bWVtb3J5a2lsbGVyLmMKQEAgLTAsMCArMSwxMTkgQEAKKy8qIGRyaXZlcnMvbWlzYy9sb3dtZW1vcnlraWxsZXIuYworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEdvb2dsZSwgSW5jLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisgKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L29vbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisKK3N0YXRpYyBpbnQgbG93bWVtX3NocmluayhpbnQgbnJfdG9fc2NhbiwgZ2ZwX3QgZ2ZwX21hc2spOworCitzdGF0aWMgc3RydWN0IHNocmlua2VyIGxvd21lbV9zaHJpbmtlciA9IHsKKwkuc2hyaW5rID0gbG93bWVtX3NocmluaywKKwkuc2Vla3MgPSBERUZBVUxUX1NFRUtTICogMTYKK307CitzdGF0aWMgdWludDMyX3QgbG93bWVtX2RlYnVnX2xldmVsID0gMjsKK3N0YXRpYyBpbnQgbG93bWVtX2Fkals2XSA9IHsKKwkwLAorCTEsCisJNiwKKwkxMiwKK307CitzdGF0aWMgaW50IGxvd21lbV9hZGpfc2l6ZSA9IDQ7CitzdGF0aWMgc2l6ZV90IGxvd21lbV9taW5mcmVlWzZdID0geworCTMqNTEyLCAvLyA2TUIKKwkyKjEwMjQsIC8vIDhNQgorCTQqMTAyNCwgLy8gMTZNQgorCTE2KjEwMjQsIC8vIDY0TUIKK307CitzdGF0aWMgaW50IGxvd21lbV9taW5mcmVlX3NpemUgPSA0OworCisjZGVmaW5lIGxvd21lbV9wcmludChsZXZlbCwgeC4uLikgZG8geyBpZihsb3dtZW1fZGVidWdfbGV2ZWwgPj0gKGxldmVsKSkgcHJpbnRrKHgpOyB9IHdoaWxlKDApCisKK21vZHVsZV9wYXJhbV9uYW1lZChjb3N0LCBsb3dtZW1fc2hyaW5rZXIuc2Vla3MsIGludCwgU19JUlVHTyB8IFNfSVdVU1IpOworbW9kdWxlX3BhcmFtX2FycmF5X25hbWVkKGFkaiwgbG93bWVtX2FkaiwgaW50LCAmbG93bWVtX2Fkal9zaXplLCBTX0lSVUdPIHwgU19JV1VTUik7Cittb2R1bGVfcGFyYW1fYXJyYXlfbmFtZWQobWluZnJlZSwgbG93bWVtX21pbmZyZWUsIHVpbnQsICZsb3dtZW1fbWluZnJlZV9zaXplLCBTX0lSVUdPIHwgU19JV1VTUik7Cittb2R1bGVfcGFyYW1fbmFtZWQoZGVidWdfbGV2ZWwsIGxvd21lbV9kZWJ1Z19sZXZlbCwgdWludCwgU19JUlVHTyB8IFNfSVdVU1IpOworCitzdGF0aWMgaW50IGxvd21lbV9zaHJpbmsoaW50IG5yX3RvX3NjYW4sIGdmcF90IGdmcF9tYXNrKQoreworCXN0cnVjdCB0YXNrX3N0cnVjdCAqcDsKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnNlbGVjdGVkID0gTlVMTDsKKwlpbnQgcmVtID0gMDsKKwlpbnQgdGFza3NpemU7CisJaW50IGk7CisJaW50IG1pbl9hZGogPSBPT01fQURKVVNUX01BWCArIDE7CisJaW50IHNlbGVjdGVkX3Rhc2tzaXplID0gMDsKKwlpbnQgYXJyYXlfc2l6ZSA9IEFSUkFZX1NJWkUobG93bWVtX2Fkaik7CisJaW50IG90aGVyX2ZyZWUgPSBnbG9iYWxfcGFnZV9zdGF0ZShOUl9GUkVFX1BBR0VTKSArIGdsb2JhbF9wYWdlX3N0YXRlKE5SX0ZJTEVfUEFHRVMpOworCWlmKGxvd21lbV9hZGpfc2l6ZSA8IGFycmF5X3NpemUpCisJCWFycmF5X3NpemUgPSBsb3dtZW1fYWRqX3NpemU7CisJaWYobG93bWVtX21pbmZyZWVfc2l6ZSA8IGFycmF5X3NpemUpCisJCWFycmF5X3NpemUgPSBsb3dtZW1fbWluZnJlZV9zaXplOworCWZvcihpID0gMDsgaSA8IGFycmF5X3NpemU7IGkrKykgeworCQlpZihvdGhlcl9mcmVlIDwgbG93bWVtX21pbmZyZWVbaV0pIHsKKwkJCW1pbl9hZGogPSBsb3dtZW1fYWRqW2ldOworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYobnJfdG9fc2NhbiA+IDApCisJCWxvd21lbV9wcmludCgzLCAibG93bWVtX3NocmluayAlZCwgJXgsIG9mcmVlICVkLCBtYSAlZFxuIiwgbnJfdG9fc2NhbiwgZ2ZwX21hc2ssIG90aGVyX2ZyZWUsIG1pbl9hZGopOworCXJlYWRfbG9jaygmdGFza2xpc3RfbG9jayk7CisJZm9yX2VhY2hfcHJvY2VzcyhwKSB7CisJCWlmKHAtPm9vbWtpbGxhZGogPj0gMCAmJiBwLT5tbSkgeworCQkJdGFza3NpemUgPSBnZXRfbW1fcnNzKHAtPm1tKTsKKwkJCWlmKG5yX3RvX3NjYW4gPiAwICYmIHRhc2tzaXplID4gMCAmJiBwLT5vb21raWxsYWRqID49IG1pbl9hZGopIHsKKwkJCQlpZihzZWxlY3RlZCA9PSBOVUxMIHx8CisJCQkJICAgcC0+b29ta2lsbGFkaiA+IHNlbGVjdGVkLT5vb21raWxsYWRqIHx8CisJCQkJICAgKHAtPm9vbWtpbGxhZGogPT0gc2VsZWN0ZWQtPm9vbWtpbGxhZGogJiYKKwkJCQkgICAgdGFza3NpemUgPiBzZWxlY3RlZF90YXNrc2l6ZSkpIHsKKwkJCQkJc2VsZWN0ZWQgPSBwOworCQkJCQlzZWxlY3RlZF90YXNrc2l6ZSA9IHRhc2tzaXplOworCQkJCQlsb3dtZW1fcHJpbnQoMiwgInNlbGVjdCAlZCAoJXMpLCBhZGogJWQsIHNpemUgJWQsIHRvIGtpbGxcbiIsCisJCQkJCSAgICAgICAgICAgICBwLT5waWQsIHAtPmNvbW0sIHAtPm9vbWtpbGxhZGosIHRhc2tzaXplKTsKKwkJCQl9CisJCQl9CisJCQlyZW0gKz0gdGFza3NpemU7CisJCX0KKwl9CisJaWYoc2VsZWN0ZWQgIT0gTlVMTCkgeworCQlsb3dtZW1fcHJpbnQoMSwgInNlbmQgc2lna2lsbCB0byAlZCAoJXMpLCBhZGogJWQsIHNpemUgJWRcbiIsCisJCSAgICAgICAgICAgICBzZWxlY3RlZC0+cGlkLCBzZWxlY3RlZC0+Y29tbSwKKwkJICAgICAgICAgICAgIHNlbGVjdGVkLT5vb21raWxsYWRqLCBzZWxlY3RlZF90YXNrc2l6ZSk7CisJCWZvcmNlX3NpZyhTSUdLSUxMLCBzZWxlY3RlZCk7CisJCXJlbSAtPSBzZWxlY3RlZF90YXNrc2l6ZTsKKwl9CisJbG93bWVtX3ByaW50KDQsICJsb3dtZW1fc2hyaW5rICVkLCAleCwgcmV0dXJuICVkXG4iLCBucl90b19zY2FuLCBnZnBfbWFzaywgcmVtKTsKKwlyZWFkX3VubG9jaygmdGFza2xpc3RfbG9jayk7CisJcmV0dXJuIHJlbTsKK30KKworc3RhdGljIGludCBfX2luaXQgbG93bWVtX2luaXQodm9pZCkKK3sKKwlyZWdpc3Rlcl9zaHJpbmtlcigmbG93bWVtX3Nocmlua2VyKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGxvd21lbV9leGl0KHZvaWQpCit7CisJdW5yZWdpc3Rlcl9zaHJpbmtlcigmbG93bWVtX3Nocmlua2VyKTsKK30KKworbW9kdWxlX2luaXQobG93bWVtX2luaXQpOworbW9kdWxlX2V4aXQobG93bWVtX2V4aXQpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL3JhbV9jb25zb2xlLmMgYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9yYW1fY29uc29sZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmMDA2ODUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9yYW1fY29uc29sZS5jCkBAIC0wLDAgKzEsMzk1IEBACisvKiBkcml2ZXJzL2FuZHJvaWQvcmFtX2NvbnNvbGUuYworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEdvb2dsZSwgSW5jLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisgKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKyNpZmRlZiBDT05GSUdfQU5EUk9JRF9SQU1fQ09OU09MRV9FUlJPUl9DT1JSRUNUSU9OCisjaW5jbHVkZSA8bGludXgvcnNsaWIuaD4KKyNlbmRpZgorCitzdHJ1Y3QgcmFtX2NvbnNvbGVfYnVmZmVyIHsKKwl1aW50MzJfdCAgICBzaWc7CisJdWludDMyX3QgICAgc3RhcnQ7CisJdWludDMyX3QgICAgc2l6ZTsKKwl1aW50OF90ICAgICBkYXRhWzBdOworfTsKKworI2RlZmluZSBSQU1fQ09OU09MRV9TSUcgKDB4NDM0NzQyNDQpIC8qIERCR0MgKi8KKworI2lmZGVmIENPTkZJR19BTkRST0lEX1JBTV9DT05TT0xFX0VBUkxZX0lOSVQKK3N0YXRpYyBjaGFyIF9faW5pdGRhdGEKKwlyYW1fY29uc29sZV9vbGRfbG9nX2luaXRfYnVmZmVyW0NPTkZJR19BTkRST0lEX1JBTV9DT05TT0xFX0VBUkxZX1NJWkVdOworI2VuZGlmCitzdGF0aWMgY2hhciAqcmFtX2NvbnNvbGVfb2xkX2xvZzsKK3N0YXRpYyBzaXplX3QgcmFtX2NvbnNvbGVfb2xkX2xvZ19zaXplOworCitzdGF0aWMgc3RydWN0IHJhbV9jb25zb2xlX2J1ZmZlciAqcmFtX2NvbnNvbGVfYnVmZmVyOworc3RhdGljIHNpemVfdCByYW1fY29uc29sZV9idWZmZXJfc2l6ZTsKKyNpZmRlZiBDT05GSUdfQU5EUk9JRF9SQU1fQ09OU09MRV9FUlJPUl9DT1JSRUNUSU9OCitzdGF0aWMgY2hhciAqcmFtX2NvbnNvbGVfcGFyX2J1ZmZlcjsKK3N0YXRpYyBzdHJ1Y3QgcnNfY29udHJvbCAqcmFtX2NvbnNvbGVfcnNfZGVjb2RlcjsKK3N0YXRpYyBpbnQgcmFtX2NvbnNvbGVfY29ycmVjdGVkX2J5dGVzOworc3RhdGljIGludCByYW1fY29uc29sZV9iYWRfYmxvY2tzOworI2RlZmluZSBFQ0NfQkxPQ0tfU0laRSBDT05GSUdfQU5EUk9JRF9SQU1fQ09OU09MRV9FUlJPUl9DT1JSRUNUSU9OX0RBVEFfU0laRQorI2RlZmluZSBFQ0NfU0laRSBDT05GSUdfQU5EUk9JRF9SQU1fQ09OU09MRV9FUlJPUl9DT1JSRUNUSU9OX0VDQ19TSVpFCisjZGVmaW5lIEVDQ19TWU1TSVpFIENPTkZJR19BTkRST0lEX1JBTV9DT05TT0xFX0VSUk9SX0NPUlJFQ1RJT05fU1lNQk9MX1NJWkUKKyNkZWZpbmUgRUNDX1BPTFkgQ09ORklHX0FORFJPSURfUkFNX0NPTlNPTEVfRVJST1JfQ09SUkVDVElPTl9QT0xZTk9NSUFMCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19BTkRST0lEX1JBTV9DT05TT0xFX0VSUk9SX0NPUlJFQ1RJT04KK3N0YXRpYyB2b2lkIHJhbV9jb25zb2xlX2VuY29kZV9yczgodWludDhfdCAqZGF0YSwgc2l6ZV90IGxlbiwgdWludDhfdCAqZWNjKQoreworCWludCBpOworCXVpbnQxNl90IHBhcltFQ0NfU0laRV07CisJLyogSW5pdGlhbGl6ZSB0aGUgcGFyaXR5IGJ1ZmZlciAqLworCW1lbXNldChwYXIsIDAsIHNpemVvZihwYXIpKTsKKwllbmNvZGVfcnM4KHJhbV9jb25zb2xlX3JzX2RlY29kZXIsIGRhdGEsIGxlbiwgcGFyLCAwKTsKKwlmb3IgKGkgPSAwOyBpIDwgRUNDX1NJWkU7IGkrKykKKwkJZWNjW2ldID0gcGFyW2ldOworfQorCitzdGF0aWMgaW50IHJhbV9jb25zb2xlX2RlY29kZV9yczgodm9pZCAqZGF0YSwgc2l6ZV90IGxlbiwgdWludDhfdCAqZWNjKQoreworCWludCBpOworCXVpbnQxNl90IHBhcltFQ0NfU0laRV07CisJZm9yIChpID0gMDsgaSA8IEVDQ19TSVpFOyBpKyspCisJCXBhcltpXSA9IGVjY1tpXTsKKwlyZXR1cm4gZGVjb2RlX3JzOChyYW1fY29uc29sZV9yc19kZWNvZGVyLCBkYXRhLCBwYXIsIGxlbiwKKwkJCQlOVUxMLCAwLCBOVUxMLCAwLCBOVUxMKTsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCByYW1fY29uc29sZV91cGRhdGUoY29uc3QgY2hhciAqcywgdW5zaWduZWQgaW50IGNvdW50KQoreworCXN0cnVjdCByYW1fY29uc29sZV9idWZmZXIgKmJ1ZmZlciA9IHJhbV9jb25zb2xlX2J1ZmZlcjsKKyNpZmRlZiBDT05GSUdfQU5EUk9JRF9SQU1fQ09OU09MRV9FUlJPUl9DT1JSRUNUSU9OCisJdWludDhfdCAqYnVmZmVyX2VuZCA9IGJ1ZmZlci0+ZGF0YSArIHJhbV9jb25zb2xlX2J1ZmZlcl9zaXplOworCXVpbnQ4X3QgKmJsb2NrOworCXVpbnQ4X3QgKnBhcjsKKwlpbnQgc2l6ZSA9IEVDQ19CTE9DS19TSVpFOworI2VuZGlmCisJbWVtY3B5KGJ1ZmZlci0+ZGF0YSArIGJ1ZmZlci0+c3RhcnQsIHMsIGNvdW50KTsKKyNpZmRlZiBDT05GSUdfQU5EUk9JRF9SQU1fQ09OU09MRV9FUlJPUl9DT1JSRUNUSU9OCisJYmxvY2sgPSBidWZmZXItPmRhdGEgKyAoYnVmZmVyLT5zdGFydCAmIH4oRUNDX0JMT0NLX1NJWkUgLSAxKSk7CisJcGFyID0gcmFtX2NvbnNvbGVfcGFyX2J1ZmZlciArCisJICAgICAgKGJ1ZmZlci0+c3RhcnQgLyBFQ0NfQkxPQ0tfU0laRSkgKiBFQ0NfU0laRTsKKwlkbyB7CisJCWlmIChibG9jayArIEVDQ19CTE9DS19TSVpFID4gYnVmZmVyX2VuZCkKKwkJCXNpemUgPSBidWZmZXJfZW5kIC0gYmxvY2s7CisJCXJhbV9jb25zb2xlX2VuY29kZV9yczgoYmxvY2ssIHNpemUsIHBhcik7CisJCWJsb2NrICs9IEVDQ19CTE9DS19TSVpFOworCQlwYXIgKz0gRUNDX1NJWkU7CisJfSB3aGlsZSAoYmxvY2sgPCBidWZmZXItPmRhdGEgKyBidWZmZXItPnN0YXJ0ICsgY291bnQpOworI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkIHJhbV9jb25zb2xlX3VwZGF0ZV9oZWFkZXIodm9pZCkKK3sKKyNpZmRlZiBDT05GSUdfQU5EUk9JRF9SQU1fQ09OU09MRV9FUlJPUl9DT1JSRUNUSU9OCisJc3RydWN0IHJhbV9jb25zb2xlX2J1ZmZlciAqYnVmZmVyID0gcmFtX2NvbnNvbGVfYnVmZmVyOworCXVpbnQ4X3QgKnBhcjsKKwlwYXIgPSByYW1fY29uc29sZV9wYXJfYnVmZmVyICsKKwkgICAgICBESVZfUk9VTkRfVVAocmFtX2NvbnNvbGVfYnVmZmVyX3NpemUsIEVDQ19CTE9DS19TSVpFKSAqIEVDQ19TSVpFOworCXJhbV9jb25zb2xlX2VuY29kZV9yczgoKHVpbnQ4X3QgKilidWZmZXIsIHNpemVvZigqYnVmZmVyKSwgcGFyKTsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZAorcmFtX2NvbnNvbGVfd3JpdGUoc3RydWN0IGNvbnNvbGUgKmNvbnNvbGUsIGNvbnN0IGNoYXIgKnMsIHVuc2lnbmVkIGludCBjb3VudCkKK3sKKwlpbnQgcmVtOworCXN0cnVjdCByYW1fY29uc29sZV9idWZmZXIgKmJ1ZmZlciA9IHJhbV9jb25zb2xlX2J1ZmZlcjsKKworCWlmIChjb3VudCA+IHJhbV9jb25zb2xlX2J1ZmZlcl9zaXplKSB7CisJCXMgKz0gY291bnQgLSByYW1fY29uc29sZV9idWZmZXJfc2l6ZTsKKwkJY291bnQgPSByYW1fY29uc29sZV9idWZmZXJfc2l6ZTsKKwl9CisJcmVtID0gcmFtX2NvbnNvbGVfYnVmZmVyX3NpemUgLSBidWZmZXItPnN0YXJ0OworCWlmIChyZW0gPCBjb3VudCkgeworCQlyYW1fY29uc29sZV91cGRhdGUocywgcmVtKTsKKwkJcyArPSByZW07CisJCWNvdW50IC09IHJlbTsKKwkJYnVmZmVyLT5zdGFydCA9IDA7CisJCWJ1ZmZlci0+c2l6ZSA9IHJhbV9jb25zb2xlX2J1ZmZlcl9zaXplOworCX0KKwlyYW1fY29uc29sZV91cGRhdGUocywgY291bnQpOworCisJYnVmZmVyLT5zdGFydCArPSBjb3VudDsKKwlpZiAoYnVmZmVyLT5zaXplIDwgcmFtX2NvbnNvbGVfYnVmZmVyX3NpemUpCisJCWJ1ZmZlci0+c2l6ZSArPSBjb3VudDsKKwlyYW1fY29uc29sZV91cGRhdGVfaGVhZGVyKCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY29uc29sZSByYW1fY29uc29sZSA9IHsKKwkubmFtZQk9ICJyYW0iLAorCS53cml0ZQk9IHJhbV9jb25zb2xlX3dyaXRlLAorCS5mbGFncwk9IENPTl9QUklOVEJVRkZFUiB8IENPTl9FTkFCTEVELAorCS5pbmRleAk9IC0xLAorfTsKKworc3RhdGljIHZvaWQgX19pbml0CityYW1fY29uc29sZV9zYXZlX29sZChzdHJ1Y3QgcmFtX2NvbnNvbGVfYnVmZmVyICpidWZmZXIsIGNoYXIgKmRlc3QpCit7CisJc2l6ZV90IG9sZF9sb2dfc2l6ZSA9IGJ1ZmZlci0+c2l6ZTsKKyNpZmRlZiBDT05GSUdfQU5EUk9JRF9SQU1fQ09OU09MRV9FUlJPUl9DT1JSRUNUSU9OCisJdWludDhfdCAqYmxvY2s7CisJdWludDhfdCAqcGFyOworCWNoYXIgc3RyYnVmWzgwXTsKKwlpbnQgc3RyYnVmX2xlbjsKKworCWJsb2NrID0gYnVmZmVyLT5kYXRhOworCXBhciA9IHJhbV9jb25zb2xlX3Bhcl9idWZmZXI7CisJd2hpbGUgKGJsb2NrIDwgYnVmZmVyLT5kYXRhICsgYnVmZmVyLT5zaXplKSB7CisJCWludCBudW1lcnI7CisJCWludCBzaXplID0gRUNDX0JMT0NLX1NJWkU7CisJCWlmIChibG9jayArIHNpemUgPiBidWZmZXItPmRhdGEgKyByYW1fY29uc29sZV9idWZmZXJfc2l6ZSkKKwkJCXNpemUgPSBidWZmZXItPmRhdGEgKyByYW1fY29uc29sZV9idWZmZXJfc2l6ZSAtIGJsb2NrOworCQludW1lcnIgPSByYW1fY29uc29sZV9kZWNvZGVfcnM4KGJsb2NrLCBzaXplLCBwYXIpOworCQlpZiAobnVtZXJyID4gMCkgeworI2lmIDAKKwkJCXByaW50ayhLRVJOX0lORk8gInJhbV9jb25zb2xlOiBlcnJvciBpbiBibG9jayAlcCwgJWRcbiIsCisJCQkgICAgICAgYmxvY2ssIG51bWVycik7CisjZW5kaWYKKwkJCXJhbV9jb25zb2xlX2NvcnJlY3RlZF9ieXRlcyArPSBudW1lcnI7CisJCX0gZWxzZSBpZiAobnVtZXJyIDwgMCkgeworI2lmIDAKKwkJCXByaW50ayhLRVJOX0lORk8gInJhbV9jb25zb2xlOiB1bmNvcnJlY3RhYmxlIGVycm9yIGluICIKKwkJCSAgICAgICAiYmxvY2sgJXBcbiIsIGJsb2NrKTsKKyNlbmRpZgorCQkJcmFtX2NvbnNvbGVfYmFkX2Jsb2NrcysrOworCQl9CisJCWJsb2NrICs9IEVDQ19CTE9DS19TSVpFOworCQlwYXIgKz0gRUNDX1NJWkU7CisJfQorCWlmIChyYW1fY29uc29sZV9jb3JyZWN0ZWRfYnl0ZXMgfHwgcmFtX2NvbnNvbGVfYmFkX2Jsb2NrcykKKwkJc3RyYnVmX2xlbiA9IHNucHJpbnRmKHN0cmJ1Ziwgc2l6ZW9mKHN0cmJ1ZiksCisJCQkiXG4lZCBDb3JyZWN0ZWQgYnl0ZXMsICVkIHVucmVjb3ZlcmFibGUgYmxvY2tzXG4iLAorCQkJcmFtX2NvbnNvbGVfY29ycmVjdGVkX2J5dGVzLCByYW1fY29uc29sZV9iYWRfYmxvY2tzKTsKKwllbHNlCisJCXN0cmJ1Zl9sZW4gPSBzbnByaW50ZihzdHJidWYsIHNpemVvZihzdHJidWYpLAorCQkJCSAgICAgICJcbk5vIGVycm9ycyBkZXRlY3RlZFxuIik7CisJaWYgKHN0cmJ1Zl9sZW4gPj0gc2l6ZW9mKHN0cmJ1ZikpCisJCXN0cmJ1Zl9sZW4gPSBzaXplb2Yoc3RyYnVmKSAtIDE7CisJb2xkX2xvZ19zaXplICs9IHN0cmJ1Zl9sZW47CisjZW5kaWYKKworCWlmIChkZXN0ID09IE5VTEwpIHsKKwkJZGVzdCA9IGttYWxsb2Mob2xkX2xvZ19zaXplLCBHRlBfS0VSTkVMKTsKKwkJaWYgKGRlc3QgPT0gTlVMTCkgeworCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkgICAgICAgInJhbV9jb25zb2xlOiBmYWlsZWQgdG8gYWxsb2NhdGUgYnVmZmVyXG4iKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKworCXJhbV9jb25zb2xlX29sZF9sb2cgPSBkZXN0OworCXJhbV9jb25zb2xlX29sZF9sb2dfc2l6ZSA9IG9sZF9sb2dfc2l6ZTsKKwltZW1jcHkocmFtX2NvbnNvbGVfb2xkX2xvZywKKwkgICAgICAgJmJ1ZmZlci0+ZGF0YVtidWZmZXItPnN0YXJ0XSwgYnVmZmVyLT5zaXplIC0gYnVmZmVyLT5zdGFydCk7CisJbWVtY3B5KHJhbV9jb25zb2xlX29sZF9sb2cgKyBidWZmZXItPnNpemUgLSBidWZmZXItPnN0YXJ0LAorCSAgICAgICAmYnVmZmVyLT5kYXRhWzBdLCBidWZmZXItPnN0YXJ0KTsKKyNpZmRlZiBDT05GSUdfQU5EUk9JRF9SQU1fQ09OU09MRV9FUlJPUl9DT1JSRUNUSU9OCisJbWVtY3B5KHJhbV9jb25zb2xlX29sZF9sb2cgKyBvbGRfbG9nX3NpemUgLSBzdHJidWZfbGVuLAorCSAgICAgICBzdHJidWYsIHN0cmJ1Zl9sZW4pOworI2VuZGlmCit9CisKK3N0YXRpYyBpbnQgX19pbml0IHJhbV9jb25zb2xlX2luaXQoc3RydWN0IHJhbV9jb25zb2xlX2J1ZmZlciAqYnVmZmVyLAorCQkJCSAgIHNpemVfdCBidWZmZXJfc2l6ZSwgY2hhciAqb2xkX2J1ZikKK3sKKyNpZmRlZiBDT05GSUdfQU5EUk9JRF9SQU1fQ09OU09MRV9FUlJPUl9DT1JSRUNUSU9OCisJaW50IG51bWVycjsKKwl1aW50OF90ICpwYXI7CisjZW5kaWYKKwlyYW1fY29uc29sZV9idWZmZXIgPSBidWZmZXI7CisJcmFtX2NvbnNvbGVfYnVmZmVyX3NpemUgPQorCQlidWZmZXJfc2l6ZSAtIHNpemVvZihzdHJ1Y3QgcmFtX2NvbnNvbGVfYnVmZmVyKTsKKworI2lmZGVmIENPTkZJR19BTkRST0lEX1JBTV9DT05TT0xFX0VSUk9SX0NPUlJFQ1RJT04KKwlyYW1fY29uc29sZV9idWZmZXJfc2l6ZSAtPSAoRElWX1JPVU5EX1VQKHJhbV9jb25zb2xlX2J1ZmZlcl9zaXplLAorCQkJCQkJRUNDX0JMT0NLX1NJWkUpICsgMSkgKiBFQ0NfU0laRTsKKwlyYW1fY29uc29sZV9wYXJfYnVmZmVyID0gYnVmZmVyLT5kYXRhICsgcmFtX2NvbnNvbGVfYnVmZmVyX3NpemU7CisKKworCS8qIGZpcnN0IGNvbnNlY3V0aXZlIHJvb3QgaXMgMAorCSAqIHByaW1pdGl2ZSBlbGVtZW50IHRvIGdlbmVyYXRlIHJvb3RzID0gMQorCSAqLworCXJhbV9jb25zb2xlX3JzX2RlY29kZXIgPSBpbml0X3JzKEVDQ19TWU1TSVpFLCBFQ0NfUE9MWSwgMCwgMSwgRUNDX1NJWkUpOworCWlmIChyYW1fY29uc29sZV9yc19kZWNvZGVyID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAicmFtX2NvbnNvbGU6IGluaXRfcnMgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmFtX2NvbnNvbGVfY29ycmVjdGVkX2J5dGVzID0gMDsKKwlyYW1fY29uc29sZV9iYWRfYmxvY2tzID0gMDsKKworCXBhciA9IHJhbV9jb25zb2xlX3Bhcl9idWZmZXIgKworCSAgICAgIERJVl9ST1VORF9VUChyYW1fY29uc29sZV9idWZmZXJfc2l6ZSwgRUNDX0JMT0NLX1NJWkUpICogRUNDX1NJWkU7CisKKwludW1lcnIgPSByYW1fY29uc29sZV9kZWNvZGVfcnM4KGJ1ZmZlciwgc2l6ZW9mKCpidWZmZXIpLCBwYXIpOworCWlmIChudW1lcnIgPiAwKSB7CisJCXByaW50ayhLRVJOX0lORk8gInJhbV9jb25zb2xlOiBlcnJvciBpbiBoZWFkZXIsICVkXG4iLCBudW1lcnIpOworCQlyYW1fY29uc29sZV9jb3JyZWN0ZWRfYnl0ZXMgKz0gbnVtZXJyOworCX0gZWxzZSBpZiAobnVtZXJyIDwgMCkgeworCQlwcmludGsoS0VSTl9JTkZPCisJCSAgICAgICAicmFtX2NvbnNvbGU6IHVuY29ycmVjdGFibGUgZXJyb3IgaW4gaGVhZGVyXG4iKTsKKwkJcmFtX2NvbnNvbGVfYmFkX2Jsb2NrcysrOworCX0KKyNlbmRpZgorCisJaWYgKGJ1ZmZlci0+c2lnID09IFJBTV9DT05TT0xFX1NJRykgeworCQlpZiAoYnVmZmVyLT5zaXplID4gcmFtX2NvbnNvbGVfYnVmZmVyX3NpemUKKwkJICAgIHx8IGJ1ZmZlci0+c3RhcnQgPiBidWZmZXItPnNpemUpCisJCQlwcmludGsoS0VSTl9JTkZPICJyYW1fY29uc29sZTogZm91bmQgZXhpc3RpbmcgaW52YWxpZCAiCisJCQkgICAgICAgImJ1ZmZlciwgc2l6ZSAlZCwgc3RhcnQgJWRcbiIsCisJCQkgICAgICAgYnVmZmVyLT5zaXplLCBidWZmZXItPnN0YXJ0KTsKKwkJZWxzZSB7CisJCQlwcmludGsoS0VSTl9JTkZPICJyYW1fY29uc29sZTogZm91bmQgZXhpc3RpbmcgYnVmZmVyLCAiCisJCQkgICAgICAgInNpemUgJWQsIHN0YXJ0ICVkXG4iLAorCQkJICAgICAgIGJ1ZmZlci0+c2l6ZSwgYnVmZmVyLT5zdGFydCk7CisJCQlyYW1fY29uc29sZV9zYXZlX29sZChidWZmZXIsIG9sZF9idWYpOworCQl9CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAicmFtX2NvbnNvbGU6IG5vIHZhbGlkIGRhdGEgaW4gYnVmZmVyICIKKwkJICAgICAgICIoc2lnID0gMHglMDh4KVxuIiwgYnVmZmVyLT5zaWcpOworCX0KKworCWJ1ZmZlci0+c2lnID0gUkFNX0NPTlNPTEVfU0lHOworCWJ1ZmZlci0+c3RhcnQgPSAwOworCWJ1ZmZlci0+c2l6ZSA9IDA7CisKKwlyZWdpc3Rlcl9jb25zb2xlKCZyYW1fY29uc29sZSk7CisjaWZkZWYgQ09ORklHX0FORFJPSURfUkFNX0NPTlNPTEVfRU5BQkxFX1ZFUkJPU0UKKwljb25zb2xlX3ZlcmJvc2UoKTsKKyNlbmRpZgorCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX0FORFJPSURfUkFNX0NPTlNPTEVfRUFSTFlfSU5JVAorc3RhdGljIGludCBfX2luaXQgcmFtX2NvbnNvbGVfZWFybHlfaW5pdCh2b2lkKQoreworCXJldHVybiByYW1fY29uc29sZV9pbml0KChzdHJ1Y3QgcmFtX2NvbnNvbGVfYnVmZmVyICopCisJCUNPTkZJR19BTkRST0lEX1JBTV9DT05TT0xFX0VBUkxZX0FERFIsCisJCUNPTkZJR19BTkRST0lEX1JBTV9DT05TT0xFX0VBUkxZX1NJWkUsCisJCXJhbV9jb25zb2xlX29sZF9sb2dfaW5pdF9idWZmZXIpOworfQorI2Vsc2UKK3N0YXRpYyBpbnQgcmFtX2NvbnNvbGVfZHJpdmVyX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHJlc291cmNlICpyZXMgPSBwZGV2LT5yZXNvdXJjZTsKKwlzaXplX3Qgc3RhcnQ7CisJc2l6ZV90IGJ1ZmZlcl9zaXplOworCXZvaWQgKmJ1ZmZlcjsKKworCWlmIChyZXMgPT0gTlVMTCB8fCBwZGV2LT5udW1fcmVzb3VyY2VzICE9IDEgfHwKKwkgICAgIShyZXMtPmZsYWdzICYgSU9SRVNPVVJDRV9NRU0pKSB7CisJCXByaW50ayhLRVJOX0VSUiAicmFtX2NvbnNvbGU6IGludmFsaWQgcmVzb3VyY2UsICVwICVkIGZsYWdzICIKKwkJICAgICAgICIlbHhcbiIsIHJlcywgcGRldi0+bnVtX3Jlc291cmNlcywgcmVzID8gcmVzLT5mbGFncyA6IDApOworCQlyZXR1cm4gLUVOWElPOworCX0KKwlidWZmZXJfc2l6ZSA9IHJlcy0+ZW5kIC0gcmVzLT5zdGFydCArIDE7CisJc3RhcnQgPSByZXMtPnN0YXJ0OworCXByaW50ayhLRVJOX0lORk8gInJhbV9jb25zb2xlOiBnb3QgYnVmZmVyIGF0ICV4LCBzaXplICV4XG4iLAorCSAgICAgICBzdGFydCwgYnVmZmVyX3NpemUpOworCWJ1ZmZlciA9IGlvcmVtYXAocmVzLT5zdGFydCwgYnVmZmVyX3NpemUpOworCWlmIChidWZmZXIgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgInJhbV9jb25zb2xlOiBmYWlsZWQgdG8gbWFwIG1lbW9yeVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXJldHVybiByYW1fY29uc29sZV9pbml0KGJ1ZmZlciwgYnVmZmVyX3NpemUsIE5VTEwvKiBhbGxvY2F0ZSAqLyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHJhbV9jb25zb2xlX2RyaXZlciA9IHsKKwkucHJvYmUgPSByYW1fY29uc29sZV9kcml2ZXJfcHJvYmUsCisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gInJhbV9jb25zb2xlIiwKKwl9LAorfTsKKworc3RhdGljIGludCBfX2luaXQgcmFtX2NvbnNvbGVfbW9kdWxlX2luaXQodm9pZCkKK3sKKwlpbnQgZXJyOworCWVyciA9IHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmcmFtX2NvbnNvbGVfZHJpdmVyKTsKKwlyZXR1cm4gZXJyOworfQorI2VuZGlmCisKK3N0YXRpYyBzc2l6ZV90IHJhbV9jb25zb2xlX3JlYWRfb2xkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLAorCQkJCSAgICBzaXplX3QgbGVuLCBsb2ZmX3QgKm9mZnNldCkKK3sKKwlsb2ZmX3QgcG9zID0gKm9mZnNldDsKKwlzc2l6ZV90IGNvdW50OworCisJaWYgKHBvcyA+PSByYW1fY29uc29sZV9vbGRfbG9nX3NpemUpCisJCXJldHVybiAwOworCisJY291bnQgPSBtaW4obGVuLCAoc2l6ZV90KShyYW1fY29uc29sZV9vbGRfbG9nX3NpemUgLSBwb3MpKTsKKwlpZiAoY29weV90b191c2VyKGJ1ZiwgcmFtX2NvbnNvbGVfb2xkX2xvZyArIHBvcywgY291bnQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCSpvZmZzZXQgKz0gY291bnQ7CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyByYW1fY29uc29sZV9maWxlX29wcyA9IHsKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkucmVhZCA9IHJhbV9jb25zb2xlX3JlYWRfb2xkLAorfTsKKworc3RhdGljIGludCBfX2luaXQgcmFtX2NvbnNvbGVfbGF0ZV9pbml0KHZvaWQpCit7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICplbnRyeTsKKworCWlmIChyYW1fY29uc29sZV9vbGRfbG9nID09IE5VTEwpCisJCXJldHVybiAwOworI2lmZGVmIENPTkZJR19BTkRST0lEX1JBTV9DT05TT0xFX0VBUkxZX0lOSVQKKwlyYW1fY29uc29sZV9vbGRfbG9nID0ga21hbGxvYyhyYW1fY29uc29sZV9vbGRfbG9nX3NpemUsIEdGUF9LRVJORUwpOworCWlmIChyYW1fY29uc29sZV9vbGRfbG9nID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCSAgICAgICAicmFtX2NvbnNvbGU6IGZhaWxlZCB0byBhbGxvY2F0ZSBidWZmZXIgZm9yIG9sZCBsb2dcbiIpOworCQlyYW1fY29uc29sZV9vbGRfbG9nX3NpemUgPSAwOworCQlyZXR1cm4gMDsKKwl9CisJbWVtY3B5KHJhbV9jb25zb2xlX29sZF9sb2csCisJICAgICAgIHJhbV9jb25zb2xlX29sZF9sb2dfaW5pdF9idWZmZXIsIHJhbV9jb25zb2xlX29sZF9sb2dfc2l6ZSk7CisjZW5kaWYKKwllbnRyeSA9IGNyZWF0ZV9wcm9jX2VudHJ5KCJsYXN0X2ttc2ciLCBTX0lGUkVHIHwgU19JUlVHTywgTlVMTCk7CisJaWYgKCFlbnRyeSkgeworCQlwcmludGsoS0VSTl9FUlIgInJhbV9jb25zb2xlOiBmYWlsZWQgdG8gY3JlYXRlIHByb2MgZW50cnlcbiIpOworCQlrZnJlZShyYW1fY29uc29sZV9vbGRfbG9nKTsKKwkJcmFtX2NvbnNvbGVfb2xkX2xvZyA9IE5VTEw7CisJCXJldHVybiAwOworCX0KKworCWVudHJ5LT5wcm9jX2ZvcHMgPSAmcmFtX2NvbnNvbGVfZmlsZV9vcHM7CisJZW50cnktPnNpemUgPSByYW1fY29uc29sZV9vbGRfbG9nX3NpemU7CisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBDT05GSUdfQU5EUk9JRF9SQU1fQ09OU09MRV9FQVJMWV9JTklUCitjb25zb2xlX2luaXRjYWxsKHJhbV9jb25zb2xlX2Vhcmx5X2luaXQpOworI2Vsc2UKK21vZHVsZV9pbml0KHJhbV9jb25zb2xlX21vZHVsZV9pbml0KTsKKyNlbmRpZgorbGF0ZV9pbml0Y2FsbChyYW1fY29uc29sZV9sYXRlX2luaXQpOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC90aW1lZF9ncGlvLmMgYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC90aW1lZF9ncGlvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmVhNjhjOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL3RpbWVkX2dwaW8uYwpAQCAtMCwwICsxLDE3NyBAQAorLyogZHJpdmVycy9taXNjL3RpbWVkX2dwaW8uYworICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBHb29nbGUsIEluYy4KKyAqIEF1dGhvcjogTWlrZSBMb2Nrd29vZCA8bG9ja3dvb2RAYW5kcm9pZC5jb20+CisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyAqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2hydGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9ncGlvLmg+CisKKyNpbmNsdWRlICJ0aW1lZF9ncGlvLmgiCisKKworc3RhdGljIHN0cnVjdCBjbGFzcyAqdGltZWRfZ3Bpb19jbGFzczsKKworc3RydWN0IHRpbWVkX2dwaW9fZGF0YSB7CisJc3RydWN0IGRldmljZSAqZGV2OworCXN0cnVjdCBocnRpbWVyIHRpbWVyOworCXNwaW5sb2NrX3QgbG9jazsKKwl1bnNpZ25lZCAJZ3BpbzsKKwlpbnQgCQltYXhfdGltZW91dDsKKwl1OCAJCWFjdGl2ZV9sb3c7Cit9OworCitzdGF0aWMgZW51bSBocnRpbWVyX3Jlc3RhcnQgZ3Bpb190aW1lcl9mdW5jKHN0cnVjdCBocnRpbWVyICp0aW1lcikKK3sKKwlzdHJ1Y3QgdGltZWRfZ3Bpb19kYXRhICpncGlvX2RhdGEgPSBjb250YWluZXJfb2YodGltZXIsIHN0cnVjdCB0aW1lZF9ncGlvX2RhdGEsIHRpbWVyKTsKKworCWdwaW9fZGlyZWN0aW9uX291dHB1dChncGlvX2RhdGEtPmdwaW8sIGdwaW9fZGF0YS0+YWN0aXZlX2xvdyA/IDEgOiAwKTsKKwlyZXR1cm4gSFJUSU1FUl9OT1JFU1RBUlQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGdwaW9fZW5hYmxlX3Nob3coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCB0aW1lZF9ncGlvX2RhdGEgKmdwaW9fZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCWludCByZW1haW5pbmc7CisKKwlpZiAoaHJ0aW1lcl9hY3RpdmUoJmdwaW9fZGF0YS0+dGltZXIpKSB7CisJCWt0aW1lX3QgciA9IGhydGltZXJfZ2V0X3JlbWFpbmluZygmZ3Bpb19kYXRhLT50aW1lcik7CisJCXJlbWFpbmluZyA9IHIudHYuc2VjICogMTAwMCArIHIudHYubnNlYyAvIDEwMDAwMDA7CisJfSBlbHNlCisJCXJlbWFpbmluZyA9IDA7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgcmVtYWluaW5nKTsKK30KKworc3RhdGljIHNzaXplX3QgZ3Bpb19lbmFibGVfc3RvcmUoCisJCXN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpCit7CisJc3RydWN0IHRpbWVkX2dwaW9fZGF0YSAqZ3Bpb19kYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJaW50IHZhbHVlOworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisKKwlzc2NhbmYoYnVmLCAiJWQiLCAmdmFsdWUpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmdwaW9fZGF0YS0+bG9jaywgZmxhZ3MpOworCisJLyogY2FuY2VsIHByZXZpb3VzIHRpbWVyIGFuZCBzZXQgR1BJTyBhY2NvcmRpbmcgdG8gdmFsdWUgKi8KKwlocnRpbWVyX2NhbmNlbCgmZ3Bpb19kYXRhLT50aW1lcik7CisJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KGdwaW9fZGF0YS0+Z3BpbywgZ3Bpb19kYXRhLT5hY3RpdmVfbG93ID8gIXZhbHVlIDogISF2YWx1ZSk7CisKKwlpZiAodmFsdWUgPiAwKSB7CisJCWlmICh2YWx1ZSA+IGdwaW9fZGF0YS0+bWF4X3RpbWVvdXQpCisJCQl2YWx1ZSA9IGdwaW9fZGF0YS0+bWF4X3RpbWVvdXQ7CisKKwkJaHJ0aW1lcl9zdGFydCgmZ3Bpb19kYXRhLT50aW1lciwKKwkJCQkJCWt0aW1lX3NldCh2YWx1ZSAvIDEwMDAsICh2YWx1ZSAlIDEwMDApICogMTAwMDAwMCksCisJCQkJCQlIUlRJTUVSX01PREVfUkVMKTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZncGlvX2RhdGEtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiBzaXplOworfQorCitzdGF0aWMgREVWSUNFX0FUVFIoZW5hYmxlLCBTX0lSVUdPIHwgU19JV1VTUiwgZ3Bpb19lbmFibGVfc2hvdywgZ3Bpb19lbmFibGVfc3RvcmUpOworCitzdGF0aWMgaW50IHRpbWVkX2dwaW9fcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgdGltZWRfZ3Bpb19wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCB0aW1lZF9ncGlvICpjdXJfZ3BpbzsKKwlzdHJ1Y3QgdGltZWRfZ3Bpb19kYXRhICpncGlvX2RhdGEsICpncGlvX2RhdDsKKwlpbnQgaSwgcmV0ID0gMDsKKworCWlmICghcGRhdGEpCisJCXJldHVybiAtRUJVU1k7CisKKwlncGlvX2RhdGEgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdGltZWRfZ3Bpb19kYXRhKSAqIHBkYXRhLT5udW1fZ3Bpb3MsIEdGUF9LRVJORUwpOworCWlmICghZ3Bpb19kYXRhKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWZvciAoaSA9IDA7IGkgPCBwZGF0YS0+bnVtX2dwaW9zOyBpKyspIHsKKwkJY3VyX2dwaW8gPSAmcGRhdGEtPmdwaW9zW2ldOworCQlncGlvX2RhdCA9ICZncGlvX2RhdGFbaV07CisKKwkJaHJ0aW1lcl9pbml0KCZncGlvX2RhdC0+dGltZXIsIENMT0NLX01PTk9UT05JQywgSFJUSU1FUl9NT0RFX1JFTCk7CisJCWdwaW9fZGF0LT50aW1lci5mdW5jdGlvbiA9IGdwaW9fdGltZXJfZnVuYzsKKwkJc3Bpbl9sb2NrX2luaXQoJmdwaW9fZGF0LT5sb2NrKTsKKworCQlncGlvX2RhdC0+Z3BpbyA9IGN1cl9ncGlvLT5ncGlvOworCQlncGlvX2RhdC0+bWF4X3RpbWVvdXQgPSBjdXJfZ3Bpby0+bWF4X3RpbWVvdXQ7CisJCWdwaW9fZGF0LT5hY3RpdmVfbG93ID0gY3VyX2dwaW8tPmFjdGl2ZV9sb3c7CisJCWdwaW9fZGlyZWN0aW9uX291dHB1dChncGlvX2RhdC0+Z3BpbywgZ3Bpb19kYXQtPmFjdGl2ZV9sb3cpOworCisJCWdwaW9fZGF0LT5kZXYgPSBkZXZpY2VfY3JlYXRlKHRpbWVkX2dwaW9fY2xhc3MsICZwZGV2LT5kZXYsIDAsICIlcyIsIGN1cl9ncGlvLT5uYW1lKTsKKwkJaWYgKHVubGlrZWx5KElTX0VSUihncGlvX2RhdC0+ZGV2KSkpCisJCQlyZXR1cm4gUFRSX0VSUihncGlvX2RhdC0+ZGV2KTsKKworCQlkZXZfc2V0X2RydmRhdGEoZ3Bpb19kYXQtPmRldiwgZ3Bpb19kYXQpOworCQlyZXQgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoZ3Bpb19kYXQtPmRldiwgJmRldl9hdHRyX2VuYWJsZSk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCX0KKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGdwaW9fZGF0YSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0aW1lZF9ncGlvX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCB0aW1lZF9ncGlvX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJc3RydWN0IHRpbWVkX2dwaW9fZGF0YSAqZ3Bpb19kYXRhID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgcGRhdGEtPm51bV9ncGlvczsgaSsrKSB7CisJCWRldmljZV9yZW1vdmVfZmlsZShncGlvX2RhdGFbaV0uZGV2LCAmZGV2X2F0dHJfZW5hYmxlKTsKKwkJZGV2aWNlX3VucmVnaXN0ZXIoZ3Bpb19kYXRhW2ldLmRldik7CisJfQorCisJa2ZyZWUoZ3Bpb19kYXRhKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciB0aW1lZF9ncGlvX2RyaXZlciA9IHsKKwkucHJvYmUJCT0gdGltZWRfZ3Bpb19wcm9iZSwKKwkucmVtb3ZlCQk9IHRpbWVkX2dwaW9fcmVtb3ZlLAorCS5kcml2ZXIJCT0geworCQkubmFtZQkJPSAidGltZWQtZ3BpbyIsCisJCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwl9LAorfTsKKworc3RhdGljIGludCBfX2luaXQgdGltZWRfZ3Bpb19pbml0KHZvaWQpCit7CisJdGltZWRfZ3Bpb19jbGFzcyA9IGNsYXNzX2NyZWF0ZShUSElTX01PRFVMRSwgInRpbWVkX291dHB1dCIpOworCWlmIChJU19FUlIodGltZWRfZ3Bpb19jbGFzcykpCisJCXJldHVybiBQVFJfRVJSKHRpbWVkX2dwaW9fY2xhc3MpOworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnRpbWVkX2dwaW9fZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHRpbWVkX2dwaW9fZXhpdCh2b2lkKQoreworCWNsYXNzX2Rlc3Ryb3kodGltZWRfZ3Bpb19jbGFzcyk7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnRpbWVkX2dwaW9fZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQodGltZWRfZ3Bpb19pbml0KTsKK21vZHVsZV9leGl0KHRpbWVkX2dwaW9fZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIk1pa2UgTG9ja3dvb2QgPGxvY2t3b29kQGFuZHJvaWQuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJ0aW1lZCBncGlvIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvdGltZWRfZ3Bpby5oIGIvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvdGltZWRfZ3Bpby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4NDQ5YjIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC90aW1lZF9ncGlvLmgKQEAgLTAsMCArMSwzMSBAQAorLyogaW5jbHVkZS9saW51eC90aW1lZF9ncGlvLmgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggR29vZ2xlLCBJbmMuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyAqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisqLworCisjaWZuZGVmIF9MSU5VWF9USU1FRF9HUElPX0gKKyNkZWZpbmUgX0xJTlVYX1RJTUVEX0dQSU9fSAorCitzdHJ1Y3QgdGltZWRfZ3BpbyB7CisJY29uc3QgY2hhciAqbmFtZTsKKwl1bnNpZ25lZCAJZ3BpbzsKKwlpbnQgICAgIG1heF90aW1lb3V0OworCXU4IAkJYWN0aXZlX2xvdzsKK307CisKK3N0cnVjdCB0aW1lZF9ncGlvX3BsYXRmb3JtX2RhdGEgeworCWludCAJCW51bV9ncGlvczsKKwlzdHJ1Y3QgdGltZWRfZ3BpbyAqZ3Bpb3M7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hc3VzX29sZWQvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy9hc3VzX29sZWQvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTZkYmIyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2FzdXNfb2xlZC9LY29uZmlnCkBAIC0wLDAgKzEsNiBAQAorY29uZmlnIEFTVVNfT0xFRAorCXRyaXN0YXRlICJBc3VzIE9MRUQgZHJpdmVyIgorCWRlcGVuZHMgb24gVVNCCisJZGVmYXVsdCBOCisJLS0taGVscC0tLQorCSAgRW5hYmxlIHN1cHBvcnQgZm9yIHRoZSBPTEVEIGRpc3BsYXkgcHJlc2VudCBpbiBzb21lIEFzdXMgbGFwdG9wcy4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hc3VzX29sZWQvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvYXN1c19vbGVkL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3MWY5YWEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYXN1c19vbGVkL01ha2VmaWxlCkBAIC0wLDAgKzEgQEAKK29iai0kKENPTkZJR19BU1VTX09MRUQpCQkrPSBhc3VzX29sZWQubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FzdXNfb2xlZC9SRUFETUUgYi9kcml2ZXJzL3N0YWdpbmcvYXN1c19vbGVkL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NmI5NzE3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2FzdXNfb2xlZC9SRUFETUUKQEAgLTAsMCArMSwxNTYgQEAKKworICAgIERyaXZlciBmb3IgQXN1cyBPTEVEIGRpc3BsYXkgcHJlc2VudCBpbiBzb21lIEFzdXMgbGFwdG9wcy4KKworICAgIFRoZSBjb2RlIG9mIHRoaXMgZHJpdmVyIGlzIGJhc2VkIG9uICdhc3Vzb2xlZCcgcHJvZ3JhbSB0YWtlbiBmcm9tCisgICAgaHR0cHM6Ly9sYXVuY2hwYWQubmV0L2FzdXNvbGVkLy4gSSBqdXN0IHdhbnRlZCB0byBoYXZlIGEgc2ltcGxlCisgICAga2VybmVsIGRyaXZlciBmb3IgY29udHJvbGxpbmcgdGhpcyBkZXZpY2UsIGJ1dCBJIGRpZG4ndCBrbm93IGhvdworICAgIHRvIGRvIHRoYXQuIE5vdyBJIGtub3cgOykgQWxzbywgdGhhdCBwcm9ncmFtIGNhbiBub3QgYmUgdXNlZAorICAgIHdpdGggdXNiaGlkIGxvYWRlZCwgd2hpY2ggbWVhbnMgbm8gVVNCIG1vdXNlL2tleWJvYXJkIHdoaWxlCisgICAgY29udHJvbGxpbmcgT0xFRCBkaXNwbGF5IDooCisKKyAgICBJdCBoYXMgYmVlbiB0ZXN0ZWQgb24gQXN1cyBHMSBhbmQgZGlkbid0IGNhdXNlIGFueSBwcm9ibGVtcywKKyAgICBidXQgSSBkb24ndCBndWFyYW50ZWUgdGhhdCBpdCB3b24ndCBkbyBhbnl0aGluZyB3cm9uZyA6KQorCisgICAgSXQgY2FuIChhbmQgcHJvYmFibHkgZG9lcykgaGF2ZSBlcnJvcnMuIEl0IGlzIHVzYWJsZQorICAgIGluIG15IGNhc2UsIGFuZCBJIGhvcGUgb3RoZXJzIHdpbGwgZmluZCBpdCB1c2VmdWwgdG9vIQorCisqKioqKioqCisKK0J1aWxkaW5nIHRoZSBtb2R1bGUKKworICAgVG8gYnVpbGQgdGhlIG1vZHVsZSB5b3UgbmVlZCBrZXJuZWwgMi42IGluY2x1ZGUgZmlsZXMgYW5kIHNvbWUgQyBjb21waWxlci4KKworICAgSnVzdCBydW46CisgICBtYWtlCisgICBtYWtlIGluc3RhbGwgKGFzIGEgcm9vdCkKKworICAgSXQgd2lsbCBidWlsZCAoaG9wZWZ1bGx5KSB0aGUgbW9kdWxlIGFuZCBpbnN0YWxsIGl0IGluCisgICAvbGliL21vZHVsZXMvJ3VuYW1lIC1yJy9leHRyYS9hc3VzX29sZWQua28uCisKKyAgIFRvIGxvYWQgaXQganVzdCB1c2U6CisgICBtb2Rwcm9iZSBhc3VzX29sZWQKKworICAgWW91IGNhbiBjaGVjayBpZiBpdCBoYXMgZGV0ZWN0ZWQgeW91ciBPTEVEIGRpc3BsYXkgYnkgbG9va2luZyBpbnRvIGRtZXNnIG91dHB1dC4KKyAgIFRoZXJlIHNob3VsZCBiZSBzb21ldGhpbmcgbGlrZSB0aGlzOgorICAgYXN1cy1vbGVkIDItNzoxLjA6IEF0dGFjaGVkIEFzdXMgT0xFRCBkZXZpY2UKKworICAgSWYgaXQgZG9lc24ndCBmaW5kIHlvdXIgZGlzcGxheSwgeW91IGNhbiB0cnkgcmVtb3ZpbmcgdXNiaGlkIG1vZHVsZS4KKyAgIElmIHlvdSBhZGQgYXN1c19vbGVkIGludG8gdGhlIGxpc3Qgb2YgbW9kdWxlcyBsb2FkZWQgZHVyaW5nIHN5c3RlbSBib290CisgICBiZWZvcmUgdXNiaGlkLCBpdCB3aWxsIHdvcmsgZXZlbiB3aGVuIHVzYmhpZCBpcyBwcmVzZW50LgorCisgICBJZiBpdCBzdGlsbCBkb2Vzbid0IGRldGVjdCB5b3VyIGhhcmR3YXJlLCBjaGVjayBsc3VzYiBvdXRwdXQuCisgICBUaGVyZSBzaG91bGQgYmUgc2ltaWxhciBsaW5lOgorICAgQnVzIDAwMiBEZXZpY2UgMDA1OiBJRCAwYjA1OjE3MjYgQVNVU1RlayBDb21wdXRlciwgSW5jLgorCisgICBJZiB5b3UgZG9uJ3Qgc2VlIGFueSBsaW5lcyB3aXRoICcwYjA1OjE3MjYnIGl0IG1lYW5zIHRoYXQgeW91IGhhdmUgZGlmZmVyZW50CisgICB0eXBlIG9mIGhhcmR3YXJlIHRoYXQgaXMgbm90IGRldGVjdGVkIChpdCBtYXkgb3IgbWF5IG5vdCB3b3JrLCBidXQgdGhlIGRyaXZlcgorICAga25vd3Mgb25seSAnMGIwNToxNzI2JyBkZXZpY2UpLgorCisqKioqKioqCisKK0NvbmZpZ3VyYXRpb24KKworICAgVGhlcmUgaXMgb25seSBvbmUgb3B0aW9uOiBzdGFydF9vZmYuCisgICBZb3UgY2FuIHVzZSBpdCBieTogJ21vZHByb2JlIGFzdXNfb2xlZCBzdGFydF9vZmY9MScsIG9yIGJ5IGFkZGluZyB0aGlzCisgICBsaW5lIHRvIC9ldGMvbW9kcHJvYmUuY29uZjoKKyAgIG9wdGlvbnMgYXN1c19vbGVkIHN0YXJ0X29mZj0xCisKKyAgIFdpdGggdGhpcyBvcHRpb24gcHJvdmlkZWQsIGFzdXNfb2xlZCBkcml2ZXIgd2lsbCBzd2l0Y2ggb2ZmIHRoZSBkaXNwbGF5CisgICB3aGVuIGl0IGlzIGRldGVjdGVkIGFuZCBhdHRhY2hlZC4gSXQgaXMgbmljZSBmZWF0dXJlIHRvIGp1c3Qgc3dpdGNoIG9mZiB0aGUgJ0FTVVMnCisgICBsb2dvLiBJZiB5b3UgZG9uJ3QgdXNlIHRoZSBkaXNwbGF5LCBpdCBpcyBwcm9iYWJseSB0aGUgZ29vZCBpZGVhIHRvIHN3aXRjaCBpdCBvZmYsCisgICB0byBwcm90ZWN0IE9MRURzIGZyb20gIndlYXJpbmcgb2ZmIi4KKworKioqKioqKgorCitVc2FnZQorCisgICBUaGlzIG1vZHVsZSBjYW4gYmUgY29udHJvbGxlZCB3aXRoIHR3byBzcGVjaWFsIGZpbGVzOgorICAgL3N5cy9jbGFzcy9hc3VzX29sZWQvb2xlZF9OL2VuYWJsZWQKKyAgIC9zeXMvY2xhc3MvYXN1c19vbGVkL29sZWRfTi9waWN0dXJlCisKKyAgIChOIGlzIHRoZSBkZXZpY2UgbnVtYmVyLCB0aGUgZmlyc3QsIGFuZCBwcm9iYWJseSB0aGUgb25seSwgaGFzIG51bWJlciAxLAorICAgIHNvIGl0IGlzIC9zeXMvY2xhc3MvYXN1c19vbGVkL29sZWRfMS9lbmFibGVkCisgICAgYW5kIC9zeXMvY2xhc3MvYXN1c19vbGVkL29sZWRfMS9waWN0dXJlKQorCisgICAnZW5hYmxlZCcgZmlsZXMgaXMgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcsICdwaWN0dXJlJyBpcyB3cml0ZWFibGUgb25seS4KKworICAgWW91IGNhbiB3cml0ZSAwIG9yIDEgdG8gJ2VuYWJsZWQnIGZpbGUsIHdoaWNoIHdpbGwgc3dpdGNoCisgICBvbiBhbmQgb2ZmIHRoZSBkaXNwbGF5LiBSZWFkaW5nIGZyb20gdGhpcyBmaWxlIHdpbGwgdGVsbCB5b3UgdGhlIGxhc3QKKyAgIHN0YXR1cyBzZXQsIGVpdGhlciAwIG9yIDEuIEJ5IGRlZmF1bHQgaXQgaXMgMSwgc28gaWYgdGhlIGRldmljZSB3YXMgc2V0IHRvICdvZmYnLAorICAgYW5kIHRoZSBjb21wdXRlciB3YXMgcmVib290ZWQgd2l0aG91dCBwb3dlci1vZmYsIHRoaXMgZmlsZSB3aWxsIGNvbnRhaW4gd3JvbmcKKyAgIHZhbHVlIC0gYmVjYXVzZSB0aGUgZGV2aWNlIGlzIG9mZiwgYnV0IGhhc24ndCBiZWVuIGRpc2FibGVkIHRoaXMgdGltZSBhbmQgaXMKKyAgIGFzc3VtZWQgdG8gYmUgb24uLi4KKworICAgVG8gJ3BpY3R1cmUnIGZpbGUgeW91IHdyaXRlIHBpY3R1cmVzIHRvIGJlIGRpc3BsYXllZCBieSB0aGUgT0xFRCBkZXZpY2UuCisgICBUaGUgZm9ybWF0IG9mIHRoZSBmaWxlOgorICAgPE06V3hIPgorICAgMDAwMDExMTAwMTAxMTEwMDAKKyAgIDAwMDEwMTAxMDEwMTAxMDEwCisgICAuLi4uCisKKyAgIEZpcnN0IGxpbmUgaXMgYSBjb25maWd1cmF0aW9uIHBhcmFtZXRlci4gTWVhbmluZyBvZiBmaWVsZHMgaW4gPE06V3hIPjoKKyAgIE0gLSBwaWN0dXJlIG1vZGUuIEl0IGNhbiBiZSBlaXRoZXIgJ3MnIGZvciBzdGF0aWMgcGljdHVyZXMsCisgICAgICAgJ3InIGZvciByb2xsaW5nIHBpY3R1cmVzLCBhbmQgJ2YnIGZvciBmbGFzaGluZyBwaWN0dXJlcy4KKyAgIFcgLSB3aWR0aCBvZiB0aGUgcGljdHVyZS4gTWF5IGJlIGJldHdlZW4gMSBhbmQgMTc5MgorICAgSCAtIGhlaWdodCBvZiB0aGUgcGljdHVyZS4gTWF5IGJlIGJldHdlZW4gMSBhbmQgMzIKKworICAgRm9yIGV4YW1wbGUgPHM6MTI4eDMyPiBtZWFucyBzdGF0aWMgcGljdHVyZSwgMTI4IHBpeGVscyBsb25nIGFuZCAzMiBwaXhlbHMgaGlnaC4KKworICAgVGhlIHBoeXNpY2FsIHNpemUgb2YgdGhlIGRpc3BsYXkgaXMgMTI4eDMyIHBpeGVscy4gU3RhdGljIGFuZCBmbGFzaGluZyBwaWN0dXJlcworICAgY2FuJ3QgYmUgbGFyZ2VyIHRoYW4gdGhhdCAoYWN0dWFsbHkgdGhleSBjYW4sIGJ1dCBvbmx5IHBhcnQgb2YgdGhlbSB3aWxsIGJlIGRpc3BsYXllZCA7KSApCisKKyAgIElmIHRoZSBwaWN0dXJlIGlzIHNtYWxsZXIgdGhhbiAxMjh4MzIgaXQgd2lsbCBiZSBjZW50ZXJlZC4gUm9sbGluZyBwaWN0dXJlcyB3aWRlciB0aGFuCisgICAxMjggcGl4ZWxzIHdpbGwgYmUgY2VudGVyZWQgdG9vLCB1bmxlc3MgdGhlaXIgd2lkdGggPSBuKjEyOC4gVmVydGljYWxseSB0aGV5IHdpbGwgYmUKKyAgIGNlbnRlcmVkIGp1c3QgbGlrZSBzdGF0aWMgcGljdHVyZXMsIGlmIHRoZWlyIGhlaWdodCBpcyBzbWFsbGVyIHRoYW4gMzIuCisKKyAgIEZsYXNoaW5nIHBpY3R1cmVzIHdpbGwgYmUgY2VudGVyZWQgaG9yaXpvbnRhbGx5IGlmIHRoZWlyIHdpZHRoIDwgMTI4LCBidXQgdGhleSB3ZXJlCisgICBjZW50ZXJlZCB2ZXJ0aWNhbGx5IGluIGEgZGlmZmVyZW50IHdheS4gSWYgdGhlaXIgaGVpZ2h0IDwgMTYsIHRoZXkgd2lsbCBiZSBjZW50ZXJlZAorICAgaW4gdGhlIHVwcGVyIGhhbGYgb2YgdGhlIGRpc3BsYXkgKHJvd3MgMC0xNSkuIFRoaXMgaXMgYmVjYXVzZSBvbmx5IHRoZSBmaXJzdCBoYWxmCisgICBvZiBmbGFzaGluZyBwaWN0dXJlcyBpcyB1c2VkIGZvciBmbGFzaGluZy4gV2hlbiB0aGUgcGljdHVyZSB3aXRoIGhlaWdoID0gMzIgaXMKKyAgIGRpc3BsYXllZCBpbiBmbGFzaGluZyBtb2RlLCBpdHMgdXBwZXIgMTYgcm93cyB3aWxsIGJlIGZsYXNoaW5nIGluIHRoZSB1cHBlciBoYWxmCisgICBvZiB0aGUgZGlzcGxheSwgYW5kIHRoZSBsb3dlciBoYWxmIHdpbGwgYmUgZW1wdHkuIEFmdGVyIGZldyBzZWNvbmRzIHVwcGVyIHBhcnQgd2lsbAorICAgc3RvcCBmbGFzaGluZyAoYnV0IHRoYXQgcGFydCBvZiB0aGUgcGljdHVyZSB3aWxsIHJlbWFpbiB0aGVyZSksIGFuZCB0aGUgbG93ZXIKKyAgIGhhbGYgb2YgdGhlIGRpc3BsYXkgd2lsbCBzdGFydCBkaXNwbGF5aW4gdGhlIGxvd2VyIGhhbGYgb2YgdGhlIHBpY3R1cmUKKyAgIGluIHJvbGxpbmcgbW9kZSwgdW5sZXNzIGl0IGlzIGVtcHR5LCBvciB0aGUgcGljdHVyZSB3YXMgc21hbGwgZW5vdWdoIHRvIGZpdCBpbgorICAgdXBwZXIgcGFydC4gSXQgaXMgbm90IG1pbmUgaWRlYSwgdGhpcyBpcyBqdXN0IHRoZSB3YXkgQXN1cycgZGlzcGxheSB3b3JrIDspCisgICBTbyBpZiB5b3UgbmVlZCBqdXN0IGZsYXNoaW5nLCB1c2UgYXQgbW9zdCAxMjh4MTYgcGljdHVyZS4gSWYgeW91IG5lZWQgZmxhc2hpbmcgYW5kCisgICByb2xsaW5nLCB1c2Ugd2hvbGUgc2l6ZSBvZiB0aGUgZGlzcGxheS4KKworICAgTGluZXMgZm9sbG93aW5nIHRoZSBmaXJzdCwgY29uZmlndXJhdGlvbiwgbGluZSBhcmUgcGljdHVyZSBkYXRhLiBFYWNoICcxJyBtZWFucworICAgdGhhdCB0aGUgcGl4ZWwgaXMgbGl0LCBhbmQgJzAnIG1lYW5zIHRoYXQgaXQgaXMgbm90LiBZb3UgY2FuIGFsc28gdXNlICcjJyBhcyBPTiwKKyAgIGFuZCAnICcgKHNwYWNlKSBhcyBPRkYuIEVtcHR5IGxpbmVzIGFuZCBhbGwgb3RoZXIgY2hhcmFjdGVycyBhcmUgaWdub3JlZC4KKworICAgSXQgaXMgcG9zc2libGUgdG8gd3JpdGUgZXZlcnl0aGluZyBpbiBvbmUgbGluZSA8TTpXeEg+MDEwMTAxMDEwMTAxMDEwMTAuLi4sCisgICBhbmQgVypIIGNoYXJhY3RlcnMgd2lsbCBiZSB1c2VkLiBJZiB0aGVyZSBpcyBub3QgZW5vdWdoIGNoYXJhY3RlcnMsIG5vdGhpbmcgd2lsbCBiZQorICAgZGlzcGxheWVkLiBIb3dldmVyLCB0aGUgJ2xpbmUgbW9kZScgaXMgZWFzaWVyIHRvIHJlYWQgKGFuZCB3cml0ZSksIGFuZCBpdCBhbHNvCisgICBsZXRzIHRvIG9taXQgcGFydHMgb2YgZGF0YS4gV2hlbmV2ZXIgRW5kLU9mLUxpbmUgY2hhcmFjdGVyIGlzIGZvdW5kLCBidXQKKyAgIHRoZSBsaW5lIGlzIG5vdCBXIGNoYXJhY3RlcnMgbG9uZywgaXQgaXMgYXNzdW1lZCB0aGF0IGFsbCBtaXNzaW5nIGNoYXJhY3RlcnMKKyAgIGFyZSBlcXVhbCB0byB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIGxpbmUuCisKKyAgIEZvbGxvd2luZyBsaW5lIHJlcHJlc2VudHMgJzAnLCAnMScgYW5kIGEgbG90cyBvZiAnMCdzLCBkZXBlbmRuZyBvbiB0aGUgd2lkdGggb2YgdGhlIHBpY3R1cmUKKyAgIHByb3ZpZGVkIGluIGNvbmZpZ3VyYXRpb24gZGF0YToKKyAgIDAxMAorCisgICBTbyBpZiB5b3UgbmVlZCBlbXB0eSBsaW5lLCBpdCBpcyBzdWZmaWNpZW50IHRvIHdyaXRlIGxpbmUgd2l0aCBvbmx5IG9uZSAnMCcgaW4gaXQuCisgICBUaGUgc2FtZSB3b3JrcyB3aXRoICcxJyAob3IgJyAnIGFuZCAnIycpLgorCisgICBJZiB0aGVyZSBhcmUgdG9vIG1hbnkgZGF0YSBpbiB0aGUgZmlsZSwgdGhleSB3aWxsIGJlIGlnbm9yZWQuIElmIHlvdSBhcmUgbm90IHN1cmUKKyAgIGhvdyBtYW55IGNoYXJhY3RlcnMgeW91IGFyZSBtaXNzaW5nLCB5b3UgY2FuIGFkZCBmZXcgbGluZXMgd2l0aCBvbmUgemVybyBpbiBlYWNoIG9mIHRoZW0uCisKKyAgIFRoZXJlIGFyZSBzb21lIGV4YW1wbGUgcGljdHVyZXMgaW4gLnR4dCBmb3JtYXQsIHRoYXQgY2FuIGJlIHVzZWQgYXMgZm9sbG93czoKKyAgIGNhdCBmb28udHh0ID4gL3N5cy9jbGFzcy9hc3VzX29sZWQvb2xlZF8xL3BpY3R1cmUKKworICAgSWYgdGhlIGRpc3BsYXkgaXMgc3dpdGNoZWQgb2ZmIHlvdSBhbHNvIG5lZWQgdG8gcnVuOgorICAgZWNobyAxID4gL3N5cy9jbGFzcy9hc3VzX29sZWQvb2xlZF8xL2VuYWJsZWQKKyAgIFRvIHN3aXRjaCBpdCBvZmYsIGp1c3QgdXNlOgorICAgZWNobyAwID4gL3N5cy9jbGFzcy9hc3VzX29sZWQvb2xlZF8xL2VuYWJsZWQKKworCisqKioqKioqCisKKyAgIEZvciBhbnkgYWRkaXRpb25hbCBpbmZvIHBsZWFzZSBoYXZlIGEgbG9vayBhdCBodHRwOi8vbGFwc3VzLmJlcmxpb3MuZGUvYXN1c19vbGVkLmh0bWwKKworCisKKyAgIEpha3ViIFNjaG1pZHRrZSAoc2pha3ViQGdtYWlsLmNvbSkKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FzdXNfb2xlZC9UT0RPIGIvZHJpdmVycy9zdGFnaW5nL2FzdXNfb2xlZC9UT0RPCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1MTQxMzEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYXN1c19vbGVkL1RPRE8KQEAgLTAsMCArMSwxMCBAQAorVE9ETzoKKwktIGNoZWNrcGF0Y2gucGwgY2xlYW51cHMKKwktIHNwYXJzZSBmaXhlcworCS0gYXVkaXQgdGhlIHVzZXJzcGFjZSBpbnRlcmZhY2UKKwkJLSBzeXNmcyB2cy4gY2hhcj8KKwktIERvY3VtZW50YXRpb24vQUJJLyBuZWVkcyB0byBiZSBhZGRlZAorCS0gcHV0IHRoZSBzYW1wbGUgLnR4dCBmaWxlcyBhbmQgUkVBRE1FIGZpbGUgc29tZXdoZXJlLgorCitQbGVhc2Ugc2VuZCBwYXRjaGVzIHRvIEdyZWcgS3JvYWgtSGFydG1hbiA8Z3JlZ0Brcm9haC5jb20+IGFuZAorQ2M6IEpha3ViIFNjaG1pZHRrZSA8c2pha3ViQGdtYWlsLmNvbT4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hc3VzX29sZWQvYXN1c19vbGVkLmMgYi9kcml2ZXJzL3N0YWdpbmcvYXN1c19vbGVkL2FzdXNfb2xlZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2NmExODYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYXN1c19vbGVkL2FzdXNfb2xlZC5jCkBAIC0wLDAgKzEsNzQ1IEBACisvKgorICogIEFzdXMgT0xFRCBVU0IgZHJpdmVyCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNywyMDA4IEpha3ViIFNjaG1pZHRrZSAoc2pha3ViQGdtYWlsLmNvbSkKKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sCisgKiAgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKgorICoKKyAqICBUaGlzIG1vZHVsZSBpcyBiYXNlZCBvbiB1c2JsZWQgYW5kIGFzdXMtbGFwdG9wIG1vZHVsZXMuCisgKgorICoKKyAqICBBc3VzIE9MRUQgc3VwcG9ydCBpcyBiYXNlZCBvbiBhc3Vzb2xlZCBwcm9ncmFtIHRha2VuIGZyb20KKyAqICBodHRwczovL2xhdW5jaHBhZC5uZXQvYXN1c29sZWQvLgorICoKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC91c2IuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorCisjZGVmaW5lIEFTVVNfT0xFRF9WRVJTSU9OCQkiMC4wNC1kZXYiCisjZGVmaW5lIEFTVVNfT0xFRF9OQU1FCQkJImFzdXMtb2xlZCIKKyNkZWZpbmUgQVNVU19PTEVEX1VOREVSU0NPUkVfTkFNRQkiYXN1c19vbGVkIgorCisjZGVmaW5lIEFTVVNfT0xFRF9FUlJPUgkJCSJBc3VzIE9MRUQgRGlzcGxheSBFcnJvcjogIgorCisjZGVmaW5lIEFTVVNfT0xFRF9TVEFUSUMJCSdzJworI2RlZmluZSBBU1VTX09MRURfUk9MTAkJCSdyJworI2RlZmluZSBBU1VTX09MRURfRkxBU0gJCQknZicKKworI2RlZmluZSBBU1VTX09MRURfTUFYX1dJRFRICQkxNzkyCisjZGVmaW5lIEFTVVNfT0xFRF9ESVNQX0hFSUdIVAkJMzIKKyNkZWZpbmUgQVNVU19PTEVEX1BBQ0tFVF9CVUZfU0laRQkyNTYKKworTU9EVUxFX0FVVEhPUigiSmFrdWIgU2NobWlkdGtlLCBzamFrdWJAZ21haWwuY29tIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFzdXMgT0xFRCBEcml2ZXIgdiIgQVNVU19PTEVEX1ZFUlNJT04pOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitzdGF0aWMgc3RydWN0IGNsYXNzICpvbGVkX2NsYXNzID0gMDsKK3N0YXRpYyBpbnQgb2xlZF9udW0gPSAwOworCitzdGF0aWMgdWludCBzdGFydF9vZmYgPSAwOworCittb2R1bGVfcGFyYW0oc3RhcnRfb2ZmLCB1aW50LCAwNjQ0KTsKKworTU9EVUxFX1BBUk1fREVTQyhzdGFydF9vZmYsICJTZXQgdG8gMSB0byBzd2l0Y2ggb2ZmIE9MRUQgZGlzcGxheSBhZnRlciBpdCBpcyBhdHRhY2hlZCIpOworCit0eXBlZGVmIGVudW0geworCVBBQ0tfTU9ERV9HMSwKKwlQQUNLX01PREVfRzUwLAorCVBBQ0tfTU9ERV9MQVNUCit9IG9sZWRfcGFja19tb2RlX3Q7CisKK3N0cnVjdCBvbGVkX2Rldl9kZXNjX3N0ciB7CisJdWludDE2X3QJCWlkVmVuZG9yOworCXVpbnQxNl90CQlpZFByb2R1Y3Q7CisJdWludDE2X3QJCWRldldpZHRoOyAvLyB3aWR0aCBvZiBkaXNwbGF5CisJb2xlZF9wYWNrX21vZGVfdAlwYWNrTW9kZTsgLy8gZm9ybXVsYSB0byBiZSB1c2VkIHdoaWxlIHBhY2tpbmcgdGhlIHBpY3R1cmUKKwljb25zdCBjaGFyCQkqZGV2RGVzYzsKK307CisKKy8qIHRhYmxlIG9mIGRldmljZXMgdGhhdCB3b3JrIHdpdGggdGhpcyBkcml2ZXIgKi8KK3N0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9pZCBpZF90YWJsZSBbXSA9IHsKKwl7IFVTQl9ERVZJQ0UoMHgwYjA1LCAweDE3MjYpIH0sIC8vIEFzdXMgRzEvRzIgKGFuZCB2YXJpYW50cykKKwl7IFVTQl9ERVZJQ0UoMHgwYjA1LCAweDE3NWIpIH0sIC8vIEFzdXMgRzUwViAoYW5kIHBvc3NpYmx5IG90aGVycyAtIEc3MD8gRzcxPykKKwl7IH0sCit9OworCisvKiBwYXJhbWV0ZXJzIG9mIHNwZWNpZmljIGRldmljZXMgKi8KK3N0YXRpYyBzdHJ1Y3Qgb2xlZF9kZXZfZGVzY19zdHIgb2xlZF9kZXZfZGVzY190YWJsZSBbXSA9IHsKKwl7IDB4MGIwNSwgMHgxNzI2LCAxMjgsIFBBQ0tfTU9ERV9HMSwgIkcxL0cyIiB9LAorCXsgMHgwYjA1LCAweDE3NWIsIDI1NiwgUEFDS19NT0RFX0c1MCwgIkc1MCIgfSwKKwl7IH0sCit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFICh1c2IsIGlkX3RhYmxlKTsKKworI2RlZmluZSBTRVRVUF9QQUNLRVRfSEVBREVSKHBhY2tldCwgdmFsMSwgdmFsMiwgdmFsMywgdmFsNCwgdmFsNSwgdmFsNiwgdmFsNykgXAorCWRvIHsJCQkJCVwKKwkJbWVtc2V0KHBhY2tldCwgMCwgc2l6ZW9mKHN0cnVjdCBhc3VzX29sZWRfaGVhZGVyKSk7CQlcCisJCXBhY2tldC0+aGVhZGVyLm1hZ2ljMSA9IDB4NTU7CQlcCisJCXBhY2tldC0+aGVhZGVyLm1hZ2ljMiA9IDB4YWE7CQlcCisJCXBhY2tldC0+aGVhZGVyLmZsYWdzID0gdmFsMTsJCVwKKwkJcGFja2V0LT5oZWFkZXIudmFsdWUzID0gdmFsMjsJCVwKKwkJcGFja2V0LT5oZWFkZXIuYnVmZmVyMSA9IHZhbDM7CQlcCisJCXBhY2tldC0+aGVhZGVyLmJ1ZmZlcjIgPSB2YWw0OwkJXAorCQlwYWNrZXQtPmhlYWRlci52YWx1ZTYgPSB2YWw1OwkJXAorCQlwYWNrZXQtPmhlYWRlci52YWx1ZTcgPSB2YWw2OwkJXAorCQlwYWNrZXQtPmhlYWRlci52YWx1ZTggPSB2YWw3OwkJXAorCX0gd2hpbGUoMCk7CisKK3N0cnVjdCBhc3VzX29sZWRfaGVhZGVyIHsKKwl1aW50OF90CQltYWdpYzE7CisJdWludDhfdAkJbWFnaWMyOworCXVpbnQ4X3QJCWZsYWdzOworCXVpbnQ4X3QJCXZhbHVlMzsKKwl1aW50OF90CQlidWZmZXIxOworCXVpbnQ4X3QJCWJ1ZmZlcjI7CisJdWludDhfdAkJdmFsdWU2OworCXVpbnQ4X3QJCXZhbHVlNzsKKwl1aW50OF90CQl2YWx1ZTg7CisJdWludDhfdAkJcGFkZGluZzJbN107Cit9IF9fYXR0cmlidXRlKChwYWNrZWQpKTsKKworc3RydWN0IGFzdXNfb2xlZF9wYWNrZXQgeworCXN0cnVjdCBhc3VzX29sZWRfaGVhZGVyCQloZWFkZXI7CisJdWludDhfdAkJCQliaXRtYXBbQVNVU19PTEVEX1BBQ0tFVF9CVUZfU0laRV07Cit9IF9fYXR0cmlidXRlKChwYWNrZWQpKTsKKworc3RydWN0IGFzdXNfb2xlZF9kZXYgeworCXN0cnVjdCB1c2JfZGV2aWNlICoJdWRldjsKKwl1aW50OF90CQkJcGljX21vZGU7CisJdWludDE2X3QJCWRldl93aWR0aDsKKwlvbGVkX3BhY2tfbW9kZV90CXBhY2tfbW9kZTsKKwlzaXplX3QJCQloZWlnaHQ7CisJc2l6ZV90CQkJd2lkdGg7CisJc2l6ZV90CQkJeF9zaGlmdDsKKwlzaXplX3QJCQl5X3NoaWZ0OworCXNpemVfdAkJCWJ1Zl9vZmZzOworCXVpbnQ4X3QJCQlsYXN0X3ZhbDsKKwlzaXplX3QJCQlidWZfc2l6ZTsKKwljaGFyCQkJKmJ1ZjsKKwl1aW50OF90CQkJZW5hYmxlZDsKKwlzdHJ1Y3QgZGV2aWNlCQkqZGV2OworfTsKKworc3RhdGljIHZvaWQgZW5hYmxlX29sZWQoc3RydWN0IGFzdXNfb2xlZF9kZXYgKm9kZXYsIHVpbnQ4X3QgZW5hYmwpCit7CisJaW50IGE7CisJaW50IHJldHZhbDsKKwlpbnQgYWN0X2xlbjsKKwlzdHJ1Y3QgYXN1c19vbGVkX3BhY2tldCAqIHBhY2tldDsKKworCXBhY2tldCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhc3VzX29sZWRfcGFja2V0KSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIXBhY2tldCkgeworCQlkZXZfZXJyKCZvZGV2LT51ZGV2LT5kZXYsICJvdXQgb2YgbWVtb3J5XG4iKTsKKwkJcmV0dXJuOworCX0KKworCVNFVFVQX1BBQ0tFVF9IRUFERVIocGFja2V0LCAweDIwLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwKTsKKworCWlmIChlbmFibCkgcGFja2V0LT5iaXRtYXBbMF0gPSAweGFmOworCWVsc2UgcGFja2V0LT5iaXRtYXBbMF0gPSAweGFlOworCisJZm9yIChhPTA7IGE8MTsgYSsrKSB7CisJCXJldHZhbCA9IHVzYl9idWxrX21zZyhvZGV2LT51ZGV2LAorCQkJdXNiX3NuZGJ1bGtwaXBlKG9kZXYtPnVkZXYsIDIpLAorCQkJcGFja2V0LAorCQkJc2l6ZW9mKHN0cnVjdCBhc3VzX29sZWRfaGVhZGVyKSArIDEsCisJCQkmYWN0X2xlbiwKKwkJCS0xKTsKKworCQlpZiAocmV0dmFsKQorCQkJZGV2X2RiZygmb2Rldi0+dWRldi0+ZGV2LCAicmV0dmFsID0gJWRcbiIsIHJldHZhbCk7CisJfQorCisJb2Rldi0+ZW5hYmxlZCA9IGVuYWJsOworCisJa2ZyZWUocGFja2V0KTsKK30KKworc3RhdGljIHNzaXplX3Qgc2V0X2VuYWJsZWQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYgPSB0b191c2JfaW50ZXJmYWNlKGRldik7CisJc3RydWN0IGFzdXNfb2xlZF9kZXYgKm9kZXYgPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOworCWludCB0ZW1wID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7CisKKwllbmFibGVfb2xlZChvZGV2LCB0ZW1wKTsKKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHNzaXplX3QgY2xhc3Nfc2V0X2VuYWJsZWQoc3RydWN0IGRldmljZSAqZGV2aWNlLCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGFzdXNfb2xlZF9kZXYgKm9kZXYgPSAoc3RydWN0IGFzdXNfb2xlZF9kZXYgKikgZGV2X2dldF9kcnZkYXRhKGRldmljZSk7CisKKwlpbnQgdGVtcCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOworCisJZW5hYmxlX29sZWQob2RldiwgdGVtcCk7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGdldF9lbmFibGVkKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiA9IHRvX3VzYl9pbnRlcmZhY2UoZGV2KTsKKwlzdHJ1Y3QgYXN1c19vbGVkX2RldiAqb2RldiA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgb2Rldi0+ZW5hYmxlZCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGNsYXNzX2dldF9lbmFibGVkKHN0cnVjdCBkZXZpY2UgKmRldmljZSwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgYXN1c19vbGVkX2RldiAqb2RldiA9IChzdHJ1Y3QgYXN1c19vbGVkX2RldiAqKSBkZXZfZ2V0X2RydmRhdGEoZGV2aWNlKTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBvZGV2LT5lbmFibGVkKTsKK30KKworc3RhdGljIHZvaWQgc2VuZF9wYWNrZXRzKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2LCBzdHJ1Y3QgYXN1c19vbGVkX3BhY2tldCAqcGFja2V0LAorCWNoYXIgKmJ1ZiwgdWludDhfdCBwX3R5cGUsIHNpemVfdCBwX251bSkKK3sKKwlzaXplX3QgaTsKKwlpbnQgYWN0X2xlbjsKKworCWZvciAoaSA9IDA7IGkgPCBwX251bTsgaSsrKSB7CisJCWludCByZXR2YWw7CisKKwkJc3dpdGNoIChwX3R5cGUpIHsKKwkJCWNhc2UgQVNVU19PTEVEX1JPTEw6CisJCQkJU0VUVVBfUEFDS0VUX0hFQURFUihwYWNrZXQsIDB4NDAsIDB4ODAsIHBfbnVtLCBpICsgMSwgMHgwMCwgMHgwMSwgMHhmZik7CisJCQlicmVhazsKKwkJCWNhc2UgQVNVU19PTEVEX1NUQVRJQzoKKwkJCQlTRVRVUF9QQUNLRVRfSEVBREVSKHBhY2tldCwgMHgxMCArIGksIDB4ODAsIDB4MDEsIDB4MDEsIDB4MDAsIDB4MDEsIDB4MDApOworCQkJYnJlYWs7CisJCQljYXNlIEFTVVNfT0xFRF9GTEFTSDoKKwkJCQlTRVRVUF9QQUNLRVRfSEVBREVSKHBhY2tldCwgMHgxMCArIGksIDB4ODAsIDB4MDEsIDB4MDEsIDB4MDAsIDB4MDAsIDB4ZmYpOworCQkJYnJlYWs7CisJCX0KKworCQltZW1jcHkocGFja2V0LT5iaXRtYXAsIGJ1ZiArIChBU1VTX09MRURfUEFDS0VUX0JVRl9TSVpFKmkpLCBBU1VTX09MRURfUEFDS0VUX0JVRl9TSVpFKTsKKworCQlyZXR2YWwgPSB1c2JfYnVsa19tc2codWRldiwKKwkJCXVzYl9zbmRjdHJscGlwZSh1ZGV2LCAyKSwKKwkJCXBhY2tldCwKKwkJCXNpemVvZihzdHJ1Y3QgYXN1c19vbGVkX3BhY2tldCksCisJCQkmYWN0X2xlbiwKKwkJCS0xKTsKKworCQlpZiAocmV0dmFsKQorCQkJZGV2X2RiZygmdWRldi0+ZGV2LCAicmV0dmFsID0gJWRcbiIsIHJldHZhbCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBzZW5kX3BhY2tldChzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiwgc3RydWN0IGFzdXNfb2xlZF9wYWNrZXQgKnBhY2tldCwgc2l6ZV90IG9mZnNldCwgc2l6ZV90IGxlbiwgY2hhciAqYnVmLCB1aW50OF90IGIxLCB1aW50OF90IGIyLCB1aW50OF90IGIzLCB1aW50OF90IGI0LCB1aW50OF90IGI1LCB1aW50OF90IGI2KXsKKwlpbnQgcmV0dmFsOworCWludCBhY3RfbGVuOworCisJU0VUVVBfUEFDS0VUX0hFQURFUihwYWNrZXQsIGIxLCBiMiwgYjMsIGI0LCBiNSwgYjYsIDB4MDApOworCW1lbWNweShwYWNrZXQtPmJpdG1hcCwgYnVmICsgb2Zmc2V0LCBsZW4pOworCisJcmV0dmFsID0gdXNiX2J1bGtfbXNnKHVkZXYsCisJCQl1c2Jfc25kY3RybHBpcGUodWRldiwgMiksCisJCQlwYWNrZXQsCisJCQlzaXplb2Yoc3RydWN0IGFzdXNfb2xlZF9wYWNrZXQpLAorCQkJJmFjdF9sZW4sCisJCQktMSk7CisKKwlpZiAocmV0dmFsKQorCQlkZXZfZGJnKCZ1ZGV2LT5kZXYsICJyZXR2YWwgPSAlZFxuIiwgcmV0dmFsKTsKK30KKworCitzdGF0aWMgdm9pZCBzZW5kX3BhY2tldHNfZzUwKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2LCBzdHJ1Y3QgYXN1c19vbGVkX3BhY2tldCAqcGFja2V0LCBjaGFyICpidWYpCit7CisJc2VuZF9wYWNrZXQodWRldiwgcGFja2V0LCAgICAgMCwgMHgxMDAsIGJ1ZiwgMHgxMCwgMHgwMCwgMHgwMiwgMHgwMSwgMHgwMCwgMHgwMSk7CisJc2VuZF9wYWNrZXQodWRldiwgcGFja2V0LCAweDEwMCwgMHgwODAsIGJ1ZiwgMHgxMCwgMHgwMCwgMHgwMiwgMHgwMiwgMHg4MCwgMHgwMCk7CisKKwlzZW5kX3BhY2tldCh1ZGV2LCBwYWNrZXQsIDB4MTgwLCAweDEwMCwgYnVmLCAweDExLCAweDAwLCAweDAzLCAweDAxLCAweDAwLCAweDAxKTsKKwlzZW5kX3BhY2tldCh1ZGV2LCBwYWNrZXQsIDB4MjgwLCAweDEwMCwgYnVmLCAweDExLCAweDAwLCAweDAzLCAweDAyLCAweDAwLCAweDAxKTsKKwlzZW5kX3BhY2tldCh1ZGV2LCBwYWNrZXQsIDB4MzgwLCAweDA4MCwgYnVmLCAweDExLCAweDAwLCAweDAzLCAweDAzLCAweDgwLCAweDAwKTsKK30KKworCitzdGF0aWMgdm9pZCBzZW5kX2RhdGEoc3RydWN0IGFzdXNfb2xlZF9kZXYgKm9kZXYpCit7CisJc2l6ZV90IHBhY2tldF9udW0gPSBvZGV2LT5idWZfc2l6ZSAvIEFTVVNfT0xFRF9QQUNLRVRfQlVGX1NJWkU7CisJc3RydWN0IGFzdXNfb2xlZF9wYWNrZXQgKiBwYWNrZXQ7CisKKwlwYWNrZXQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYXN1c19vbGVkX3BhY2tldCksIEdGUF9LRVJORUwpOworCisJaWYgKCFwYWNrZXQpIHsKKwkJZGV2X2Vycigmb2Rldi0+dWRldi0+ZGV2LCAib3V0IG9mIG1lbW9yeVxuIik7CisJCXJldHVybjsKKwl9CisKKwlpZiAob2Rldi0+cGFja19tb2RlPT1QQUNLX01PREVfRzEpeworCQkvLyBXaGVuIHNlbmRpbmcgcm9sbC1tb2RlIGRhdGEgdGhlIGRpc3BsYXkgdXBkYXRlZCBvbmx5IGZpcnN0IHBhY2tldC4KKwkJLy8gSSBoYXZlIG5vIGlkZWEgd2h5LCBidXQgd2hlbiBzdGF0aWMgcGljdHVyZSBpcyBzZW5kIGp1c3QgYmVmb3JlCisJCS8vIHJvbGxpbmcgcGljdHVyZSAtIGV2ZXJ5dGhpbmcgd29ya3MgZmluZS4KKwkJaWYgKG9kZXYtPnBpY19tb2RlID09IEFTVVNfT0xFRF9ST0xMKQorCQkJc2VuZF9wYWNrZXRzKG9kZXYtPnVkZXYsIHBhY2tldCwgb2Rldi0+YnVmLCBBU1VTX09MRURfU1RBVElDLCAyKTsKKworCQkvLyBPbmx5IFJPTEwgbW9kZSBjYW4gdXNlIG1vcmUgdGhhbiAyIHBhY2tldHMuCisJCWlmIChvZGV2LT5waWNfbW9kZSAhPSBBU1VTX09MRURfUk9MTCAmJiBwYWNrZXRfbnVtID4gMikKKwkJCXBhY2tldF9udW0gPSAyOworCisJCXNlbmRfcGFja2V0cyhvZGV2LT51ZGV2LCBwYWNrZXQsIG9kZXYtPmJ1Ziwgb2Rldi0+cGljX21vZGUsIHBhY2tldF9udW0pOworCX0KKwllbHNlCisJaWYgKG9kZXYtPnBhY2tfbW9kZT09UEFDS19NT0RFX0c1MCl7CisJCXNlbmRfcGFja2V0c19nNTAob2Rldi0+dWRldiwgcGFja2V0LCBvZGV2LT5idWYpOworCX0KKworCWtmcmVlKHBhY2tldCk7Cit9CisKK3N0YXRpYyBpbnQgYXBwZW5kX3ZhbHVlcyhzdHJ1Y3QgYXN1c19vbGVkX2RldiAqb2RldiwgdWludDhfdCB2YWwsIHNpemVfdCBjb3VudCkKK3sKKwl3aGlsZSAoY291bnQtLSA+IDApIHsKKwkJaWYgKHZhbCkgeworCQkJc2l6ZV90IHggPSBvZGV2LT5idWZfb2ZmcyAlIG9kZXYtPndpZHRoOworCQkJc2l6ZV90IHkgPSBvZGV2LT5idWZfb2ZmcyAvIG9kZXYtPndpZHRoOworCQkJc2l6ZV90IGk7CisKKwkJCXggKz0gb2Rldi0+eF9zaGlmdDsKKwkJCXkgKz0gb2Rldi0+eV9zaGlmdDsKKworCQkJc3dpdGNoKG9kZXYtPnBhY2tfbW9kZSkKKwkJCXsKKwkJCQljYXNlIFBBQ0tfTU9ERV9HMToKKwkJCQkJLy8gaSA9ICh4LzEyOCkqNjQwICsgMTI3IC0geCArICh5LzgpKjEyODsKKwkJCQkJLy8gVGhpcyBvbmUgZm9yIDEyOCBpcyB0aGUgc2FtZSwgYnV0IG1pZ2h0IGJlIGJldHRlciBmb3IgZGlmZmVyZW50IHdpZHRocz8KKwkJCQkJaSA9ICh4L29kZXYtPmRldl93aWR0aCkqNjQwICsgb2Rldi0+ZGV2X3dpZHRoIC0gMSAtIHggKyAoeS84KSpvZGV2LT5kZXZfd2lkdGg7CisJCQkJYnJlYWs7CisKKwkJCQljYXNlIFBBQ0tfTU9ERV9HNTA6CisJCQkJCWkgPSAgKG9kZXYtPmRldl93aWR0aCAtIDEgLSB4KS84ICsgeSpvZGV2LT5kZXZfd2lkdGgvODsKKwkJCQlicmVhazsKKworCQkJCWRlZmF1bHQ6CisJCQkJCWkgPSAwOworCQkJCQlwcmludGsoQVNVU19PTEVEX0VSUk9SICJVbmtub3duIE9MRUQgUGFjayBNb2RlOiAlZCFcbiIsIG9kZXYtPnBhY2tfbW9kZSk7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWlmIChpID49IG9kZXYtPmJ1Zl9zaXplKSB7CisJCQkJcHJpbnRrKEFTVVNfT0xFRF9FUlJPUiAiQnVmZmVyIG92ZXJmbG93ISBSZXBvcnQgYSBidWcgaW4gdGhlIGRyaXZlcjogb2ZmczogJWQgPj0gJWQgaTogJWQgKHg6ICVkIHk6ICVkKVxuIiwKKwkJCQkJKGludCkgb2Rldi0+YnVmX29mZnMsIChpbnQpIG9kZXYtPmJ1Zl9zaXplLCAoaW50KSBpLCAoaW50KSB4LCAoaW50KSB5KTsKKwkJCQlyZXR1cm4gLUVJTzsKKwkJCX0KKworCQkJc3dpdGNoIChvZGV2LT5wYWNrX21vZGUpCisJCQl7CisJCQkJY2FzZSBQQUNLX01PREVfRzE6CisJCQkJCW9kZXYtPmJ1ZltpXSAmPSB+KDE8PCh5JTgpKTsKKwkJCQlicmVhazsKKworCQkJCWNhc2UgUEFDS19NT0RFX0c1MDoKKwkJCQkJb2Rldi0+YnVmW2ldICY9IH4oMTw8KHglOCkpOworCQkJCWJyZWFrOworCisJCQkJZGVmYXVsdDoKKwkJCQkJLy8gY2Fubm90IGdldCBoZXJlOyBzdG9wcyBnY2MgY29tcGxhaW5pbmcKKwkJCQk7CisJCQl9CisJCX0KKworCQlvZGV2LT5sYXN0X3ZhbCA9IHZhbDsKKwkJb2Rldi0+YnVmX29mZnMrKzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNzaXplX3Qgb2Rldl9zZXRfcGljdHVyZShzdHJ1Y3QgYXN1c19vbGVkX2RldiAqb2RldiwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc2l6ZV90IG9mZnMgPSAwLCBtYXhfb2ZmczsKKworCWlmIChjb3VudCA8IDEpIHJldHVybiAwOworCisJaWYgKHRvbG93ZXIoYnVmWzBdKSA9PSAnYicpeworCSAgICAvLyBiaW5hcnkgbW9kZSwgc2V0IHRoZSBlbnRpcmUgbWVtb3J5CisKKwkgICAgc2l6ZV90IGk7CisKKwkgICAgb2Rldi0+YnVmX3NpemUgPSAob2Rldi0+ZGV2X3dpZHRoICogQVNVU19PTEVEX0RJU1BfSEVJR0hUKSAvIDg7CisKKwkgICAgaWYgKG9kZXYtPmJ1Zikga2ZyZWUob2Rldi0+YnVmKTsKKwkgICAgb2Rldi0+YnVmID0ga21hbGxvYyhvZGV2LT5idWZfc2l6ZSwgR0ZQX0tFUk5FTCk7CisKKwkgICAgbWVtc2V0KG9kZXYtPmJ1ZiwgMHhmZiwgb2Rldi0+YnVmX3NpemUpOworCisJICAgIGZvciAoaT0xOyBpIDwgY291bnQgJiYgaTw9MzIqMzI7IGkrKyl7CisJCW9kZXYtPmJ1ZltpLTFdID0gYnVmW2ldOworCQlvZGV2LT5idWZfb2ZmcyA9IGktMTsKKwkgICAgfQorCisJICAgIG9kZXYtPndpZHRoPW9kZXYtPmRldl93aWR0aCAvIDg7CisJICAgIG9kZXYtPmhlaWdodD1BU1VTX09MRURfRElTUF9IRUlHSFQ7CisJICAgIG9kZXYtPnhfc2hpZnQ9MDsKKwkgICAgb2Rldi0+eV9zaGlmdD0wOworCSAgICBvZGV2LT5sYXN0X3ZhbD0wOworCisJICAgIHNlbmRfZGF0YShvZGV2KTsKKworCSAgICByZXR1cm4gY291bnQ7CisJfQorCisJaWYgKGJ1ZlswXSA9PSAnPCcpIHsKKwkJc2l6ZV90IGk7CisJCXNpemVfdCB3ID0gMCwgaCA9IDA7CisJCXNpemVfdCB3X21lbSwgaF9tZW07CisKKwkJaWYgKGNvdW50IDwgMTAgfHwgYnVmWzJdICE9ICc6JykgeworCQkJZ290byBlcnJvcl9oZWFkZXI7CisJCX0KKworCQlzd2l0Y2godG9sb3dlcihidWZbMV0pKSB7CisJCQljYXNlIEFTVVNfT0xFRF9TVEFUSUM6CisJCQljYXNlIEFTVVNfT0xFRF9ST0xMOgorCQkJY2FzZSBBU1VTX09MRURfRkxBU0g6CisJCQkJb2Rldi0+cGljX21vZGUgPSBidWZbMV07CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXByaW50ayhBU1VTX09MRURfRVJST1IgIldyb25nIHBpY3R1cmUgbW9kZTogJyVjJy5cbiIsIGJ1ZlsxXSk7CisJCQkJcmV0dXJuIC1FSU87CisJCQkJYnJlYWs7CisJCX0KKworCQlmb3IgKGkgPSAzOyBpIDwgY291bnQ7ICsraSkgeworCQkJaWYgKGJ1ZltpXSA+PSAnMCcgJiYgYnVmW2ldIDw9ICc5JykgeworCQkJCXcgPSAxMCp3ICsgKGJ1ZltpXSAtICcwJyk7CisKKwkJCQlpZiAodyA+IEFTVVNfT0xFRF9NQVhfV0lEVEgpIGdvdG8gZXJyb3Jfd2lkdGg7CisJCQl9CisJCQllbHNlIGlmICh0b2xvd2VyKGJ1ZltpXSkgPT0gJ3gnKSBicmVhazsKKwkJCWVsc2UgZ290byBlcnJvcl93aWR0aDsKKwkJfQorCisJCWZvciAoKytpOyBpIDwgY291bnQ7ICsraSkgeworCQkJaWYgKGJ1ZltpXSA+PSAnMCcgJiYgYnVmW2ldIDw9ICc5JykgeworCQkJCWggPSAxMCpoICsgKGJ1ZltpXSAtICcwJyk7CisKKwkJCQlpZiAoaCA+IEFTVVNfT0xFRF9ESVNQX0hFSUdIVCkgZ290byBlcnJvcl9oZWlnaHQ7CisJCQl9CisJCQllbHNlIGlmICh0b2xvd2VyKGJ1ZltpXSkgPT0gJz4nKSBicmVhazsKKwkJCWVsc2UgZ290byBlcnJvcl9oZWlnaHQ7CisJCX0KKworCQlpZiAodyA8IDEgfHwgdyA+IEFTVVNfT0xFRF9NQVhfV0lEVEgpIGdvdG8gZXJyb3Jfd2lkdGg7CisKKwkJaWYgKGggPCAxIHx8IGggPiBBU1VTX09MRURfRElTUF9IRUlHSFQpIGdvdG8gZXJyb3JfaGVpZ2h0OworCisJCWlmIChpID49IGNvdW50IHx8IGJ1ZltpXSAhPSAnPicpIGdvdG8gZXJyb3JfaGVhZGVyOworCisJCW9mZnMgPSBpKzE7CisKKwkJaWYgKHcgJSAob2Rldi0+ZGV2X3dpZHRoKSAhPSAwKQorCQkJd19tZW0gPSAody8ob2Rldi0+ZGV2X3dpZHRoKSArIDEpKihvZGV2LT5kZXZfd2lkdGgpOworCQllbHNlCisJCQl3X21lbSA9IHc7CisKKwkJaWYgKGggPCBBU1VTX09MRURfRElTUF9IRUlHSFQpCisJCQloX21lbSA9IEFTVVNfT0xFRF9ESVNQX0hFSUdIVDsKKwkJZWxzZQorCQkJaF9tZW0gPSBoOworCisJCW9kZXYtPmJ1Zl9zaXplID0gd19tZW0gKiBoX21lbSAvIDg7CisKKwkJaWYgKG9kZXYtPmJ1Zikga2ZyZWUob2Rldi0+YnVmKTsKKwkJb2Rldi0+YnVmID0ga21hbGxvYyhvZGV2LT5idWZfc2l6ZSwgR0ZQX0tFUk5FTCk7CisKKwkJaWYgKG9kZXYtPmJ1ZiA9PSBOVUxMKSB7CisJCQlvZGV2LT5idWZfc2l6ZSA9IDA7CisJCQlwcmludGsoQVNVU19PTEVEX0VSUk9SICJPdXQgb2YgbWVtb3J5IVxuIik7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCisJCW1lbXNldChvZGV2LT5idWYsIDB4ZmYsIG9kZXYtPmJ1Zl9zaXplKTsKKworCQlvZGV2LT5idWZfb2ZmcyA9IDA7CisJCW9kZXYtPndpZHRoID0gdzsKKwkJb2Rldi0+aGVpZ2h0ID0gaDsKKwkJb2Rldi0+eF9zaGlmdCA9IDA7CisJCW9kZXYtPnlfc2hpZnQgPSAwOworCQlvZGV2LT5sYXN0X3ZhbCA9IDA7CisKKwkJaWYgKG9kZXYtPnBpY19tb2RlID09IEFTVVNfT0xFRF9GTEFTSCkgeworCQkJaWYgKGggPCBBU1VTX09MRURfRElTUF9IRUlHSFQvMikKKwkJCQlvZGV2LT55X3NoaWZ0ID0gKEFTVVNfT0xFRF9ESVNQX0hFSUdIVC8yIC0gaCkvMjsKKwkJfQorCQllbHNlIHsKKwkJCWlmIChoIDwgQVNVU19PTEVEX0RJU1BfSEVJR0hUKQorCQkJCW9kZXYtPnlfc2hpZnQgPSAoQVNVU19PTEVEX0RJU1BfSEVJR0hUIC0gaCkvMjsKKwkJfQorCisJCWlmICh3IDwgKG9kZXYtPmRldl93aWR0aCkpCisJCQlvZGV2LT54X3NoaWZ0ID0gKChvZGV2LT5kZXZfd2lkdGgpIC0gdykvMjsKKwl9CisKKwltYXhfb2ZmcyA9IG9kZXYtPndpZHRoICogb2Rldi0+aGVpZ2h0OworCisJd2hpbGUgKG9mZnMgPCBjb3VudCAmJiBvZGV2LT5idWZfb2ZmcyA8IG1heF9vZmZzKSB7CisJCWludCByZXQ7CisKKwkJaWYgKGJ1ZltvZmZzXSA9PSAnMScgfHwgYnVmW29mZnNdID09ICcjJykgeworCQkJaWYgKCAocmV0ID0gYXBwZW5kX3ZhbHVlcyhvZGV2LCAxLCAxKSkgPCAwKSByZXR1cm4gcmV0OworCQl9CisJCWVsc2UgaWYgKGJ1ZltvZmZzXSA9PSAnMCcgfHwgYnVmW29mZnNdID09ICcgJykgeworCQkJaWYgKCAocmV0ID0gYXBwZW5kX3ZhbHVlcyhvZGV2LCAwLCAxKSkgPCAwKSByZXR1cm4gcmV0OworCQl9CisJCWVsc2UgaWYgKGJ1ZltvZmZzXSA9PSAnXG4nKSB7CisJCQkvLyBOZXcgbGluZSBkZXRlY3RlZC4gTGV0cyBhc3N1bWUsIHRoYXQgYWxsIGNoYXJhY3RlcnMgdGlsbCB0aGUgZW5kIG9mIHRoZQorCQkJLy8gbGluZSB3ZXJlIGVxdWFsIHRvIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGlzIGxpbmUuCisJCQlpZiAob2Rldi0+YnVmX29mZnMgJSBvZGV2LT53aWR0aCAhPSAwKQorCQkJCWlmICggKHJldCA9IGFwcGVuZF92YWx1ZXMob2Rldiwgb2Rldi0+bGFzdF92YWwsCisJCQkJICAgICAgb2Rldi0+d2lkdGggLSAob2Rldi0+YnVmX29mZnMgJSBvZGV2LT53aWR0aCkpKSA8IDApIHJldHVybiByZXQ7CisJCX0KKworCQlvZmZzKys7CisJfQorCisJaWYgKG9kZXYtPmJ1Zl9vZmZzID49IG1heF9vZmZzKSBzZW5kX2RhdGEob2Rldik7CisKKwlyZXR1cm4gY291bnQ7CisKK2Vycm9yX3dpZHRoOgorCXByaW50ayhBU1VTX09MRURfRVJST1IgIldyb25nIHBpY3R1cmUgd2lkdGggc3BlY2lmaWVkLlxuIik7CisJcmV0dXJuIC1FSU87CisKK2Vycm9yX2hlaWdodDoKKwlwcmludGsoQVNVU19PTEVEX0VSUk9SICJXcm9uZyBwaWN0dXJlIGhlaWdodCBzcGVjaWZpZWQuXG4iKTsKKwlyZXR1cm4gLUVJTzsKKworZXJyb3JfaGVhZGVyOgorCXByaW50ayhBU1VTX09MRURfRVJST1IgIldyb25nIHBpY3R1cmUgaGVhZGVyLlxuIik7CisJcmV0dXJuIC1FSU87Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNldF9waWN0dXJlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmID0gdG9fdXNiX2ludGVyZmFjZShkZXYpOworCisJcmV0dXJuIG9kZXZfc2V0X3BpY3R1cmUodXNiX2dldF9pbnRmZGF0YShpbnRmKSwgYnVmLCBjb3VudCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGNsYXNzX3NldF9waWN0dXJlKHN0cnVjdCBkZXZpY2UgKmRldmljZSwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXJldHVybiBvZGV2X3NldF9waWN0dXJlKChzdHJ1Y3QgYXN1c19vbGVkX2RldiAqKSBkZXZfZ2V0X2RydmRhdGEoZGV2aWNlKSwgYnVmLCBjb3VudCk7Cit9CisKKyNkZWZpbmUgQVNVU19PTEVEX0RFVklDRV9BVFRSKF9maWxlKQkJZGV2X2F0dHJfYXN1c19vbGVkXyMjX2ZpbGUKKworc3RhdGljIERFVklDRV9BVFRSKGFzdXNfb2xlZF9lbmFibGVkLCBTX0lXVUdPIHwgU19JUlVHTywgZ2V0X2VuYWJsZWQsIHNldF9lbmFibGVkKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihhc3VzX29sZWRfcGljdHVyZSwgU19JV1VHTyAsIE5VTEwsIHNldF9waWN0dXJlKTsKKworc3RhdGljIERFVklDRV9BVFRSKGVuYWJsZWQsIFNfSVdVR08gfCBTX0lSVUdPLCBjbGFzc19nZXRfZW5hYmxlZCwgY2xhc3Nfc2V0X2VuYWJsZWQpOworc3RhdGljIERFVklDRV9BVFRSKHBpY3R1cmUsIFNfSVdVR08sIE5VTEwsIGNsYXNzX3NldF9waWN0dXJlKTsKKworc3RhdGljIGludCBhc3VzX29sZWRfcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGVyZmFjZSwgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKQoreworCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldihpbnRlcmZhY2UpOworCXN0cnVjdCBhc3VzX29sZWRfZGV2ICpvZGV2ID0gTlVMTDsKKwlpbnQgcmV0dmFsID0gLUVOT01FTTsKKwl1aW50MTZfdCBkZXZfd2lkdGggPSAwOworCW9sZWRfcGFja19tb2RlX3QgcGFja19tb2RlID0gUEFDS19NT0RFX0xBU1Q7CisJY29uc3Qgc3RydWN0IG9sZWRfZGV2X2Rlc2Nfc3RyICogZGV2X2Rlc2MgPSBvbGVkX2Rldl9kZXNjX3RhYmxlOworCWNvbnN0IGNoYXIgKmRlc2MgPSAwOworCisJaWYgKGlkID09IDApIHsKKwkJLy8gRXZlbiBwb3NzaWJsZT8gSnVzdCB0byBtYWtlIHN1cmUuLi4KKwkJZGV2X2VycigmaW50ZXJmYWNlLT5kZXYsICJObyB1c2JfZGV2aWNlX2lkIHByb3ZpZGVkIVxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWZvciAoOyBkZXZfZGVzYy0+aWRWZW5kb3I7IGRldl9kZXNjKyspCisJeworCQlpZiAoZGV2X2Rlc2MtPmlkVmVuZG9yID09IGlkLT5pZFZlbmRvcgorCQkJJiYgZGV2X2Rlc2MtPmlkUHJvZHVjdCA9PSBpZC0+aWRQcm9kdWN0KQorCQl7CisJCQlkZXZfd2lkdGggPSBkZXZfZGVzYy0+ZGV2V2lkdGg7CisJCQlkZXNjID0gZGV2X2Rlc2MtPmRldkRlc2M7CisJCQlwYWNrX21vZGUgPSBkZXZfZGVzYy0+cGFja01vZGU7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmICggIWRlc2MgfHwgZGV2X3dpZHRoIDwgMSB8fCBwYWNrX21vZGUgPT0gUEFDS19NT0RFX0xBU1QpIHsKKwkJZGV2X2VycigmaW50ZXJmYWNlLT5kZXYsICJNaXNzaW5nIG9yIGluY29tcGxldGUgZGV2aWNlIGRlc2NyaXB0aW9uIVxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCW9kZXYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYXN1c19vbGVkX2RldiksIEdGUF9LRVJORUwpOworCisJaWYgKG9kZXYgPT0gTlVMTCkgeworCQlkZXZfZXJyKCZpbnRlcmZhY2UtPmRldiwgIk91dCBvZiBtZW1vcnlcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlvZGV2LT51ZGV2ID0gdXNiX2dldF9kZXYodWRldik7CisJb2Rldi0+cGljX21vZGUgPSBBU1VTX09MRURfU1RBVElDOworCW9kZXYtPmRldl93aWR0aCA9IGRldl93aWR0aDsKKwlvZGV2LT5wYWNrX21vZGUgPSBwYWNrX21vZGU7CisJb2Rldi0+aGVpZ2h0ID0gMDsKKwlvZGV2LT53aWR0aCA9IDA7CisJb2Rldi0+eF9zaGlmdCA9IDA7CisJb2Rldi0+eV9zaGlmdCA9IDA7CisJb2Rldi0+YnVmX29mZnMgPSAwOworCW9kZXYtPmJ1Zl9zaXplID0gMDsKKwlvZGV2LT5sYXN0X3ZhbCA9IDA7CisJb2Rldi0+YnVmID0gTlVMTDsKKwlvZGV2LT5lbmFibGVkID0gMTsKKwlvZGV2LT5kZXYgPSAwOworCisJdXNiX3NldF9pbnRmZGF0YSAoaW50ZXJmYWNlLCBvZGV2KTsKKworCWlmICgocmV0dmFsID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZpbnRlcmZhY2UtPmRldiwgJkFTVVNfT0xFRF9ERVZJQ0VfQVRUUihlbmFibGVkKSkpKSB7CisJCWdvdG8gZXJyX2ZpbGVzOworCX0KKworCWlmICgocmV0dmFsID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZpbnRlcmZhY2UtPmRldiwgJkFTVVNfT0xFRF9ERVZJQ0VfQVRUUihwaWN0dXJlKSkpKSB7CisJCWdvdG8gZXJyX2ZpbGVzOworCX0KKworCW9kZXYtPmRldiA9IGRldmljZV9jcmVhdGUob2xlZF9jbGFzcywgJmludGVyZmFjZS0+ZGV2LCBNS0RFVigwLDApLAorCQkJCU5VTEwsIm9sZWRfJWQiLCArK29sZWRfbnVtKTsKKworCWlmIChJU19FUlIob2Rldi0+ZGV2KSkgeworCQlyZXR2YWwgPSBQVFJfRVJSKG9kZXYtPmRldik7CisJCWdvdG8gZXJyX2ZpbGVzOworCX0KKworCWRldl9zZXRfZHJ2ZGF0YShvZGV2LT5kZXYsIG9kZXYpOworCisJaWYgKCAocmV0dmFsID0gZGV2aWNlX2NyZWF0ZV9maWxlKG9kZXYtPmRldiwgJmRldl9hdHRyX2VuYWJsZWQpKSkgeworCQlnb3RvIGVycl9jbGFzc19lbmFibGVkOworCX0KKworCWlmICggKHJldHZhbCA9IGRldmljZV9jcmVhdGVfZmlsZShvZGV2LT5kZXYsICZkZXZfYXR0cl9waWN0dXJlKSkpIHsKKwkJZ290byBlcnJfY2xhc3NfcGljdHVyZTsKKwl9CisKKwlkZXZfaW5mbygmaW50ZXJmYWNlLT5kZXYsICJBdHRhY2hlZCBBc3VzIE9MRUQgZGV2aWNlOiAlcyBbd2lkdGggJXUsIHBhY2tfbW9kZSAlZF1cbiIsIGRlc2MsIG9kZXYtPmRldl93aWR0aCwgb2Rldi0+cGFja19tb2RlKTsKKworCWlmIChzdGFydF9vZmYpCisJCWVuYWJsZV9vbGVkKG9kZXYsIDApOworCisJcmV0dXJuIDA7CisKK2Vycl9jbGFzc19waWN0dXJlOgorCWRldmljZV9yZW1vdmVfZmlsZShvZGV2LT5kZXYsICZkZXZfYXR0cl9waWN0dXJlKTsKKworZXJyX2NsYXNzX2VuYWJsZWQ6CisJZGV2aWNlX3JlbW92ZV9maWxlKG9kZXYtPmRldiwgJmRldl9hdHRyX2VuYWJsZWQpOworCWRldmljZV91bnJlZ2lzdGVyKG9kZXYtPmRldik7CisKK2Vycl9maWxlczoKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmludGVyZmFjZS0+ZGV2LCAmQVNVU19PTEVEX0RFVklDRV9BVFRSKGVuYWJsZWQpKTsKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmludGVyZmFjZS0+ZGV2LCAmQVNVU19PTEVEX0RFVklDRV9BVFRSKHBpY3R1cmUpKTsKKworCXVzYl9zZXRfaW50ZmRhdGEgKGludGVyZmFjZSwgTlVMTCk7CisJdXNiX3B1dF9kZXYob2Rldi0+dWRldik7CisJa2ZyZWUob2Rldik7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgdm9pZCBhc3VzX29sZWRfZGlzY29ubmVjdChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZXJmYWNlKQoreworCXN0cnVjdCBhc3VzX29sZWRfZGV2ICpvZGV2OworCisJb2RldiA9IHVzYl9nZXRfaW50ZmRhdGEgKGludGVyZmFjZSk7CisJdXNiX3NldF9pbnRmZGF0YSAoaW50ZXJmYWNlLCBOVUxMKTsKKworCWRldmljZV9yZW1vdmVfZmlsZShvZGV2LT5kZXYsICZkZXZfYXR0cl9waWN0dXJlKTsKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUob2Rldi0+ZGV2LCAmZGV2X2F0dHJfZW5hYmxlZCk7CisJZGV2aWNlX3VucmVnaXN0ZXIob2Rldi0+ZGV2KTsKKworCWRldmljZV9yZW1vdmVfZmlsZSgmaW50ZXJmYWNlLT5kZXYsICYgQVNVU19PTEVEX0RFVklDRV9BVFRSKHBpY3R1cmUpKTsKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmludGVyZmFjZS0+ZGV2LCAmIEFTVVNfT0xFRF9ERVZJQ0VfQVRUUihlbmFibGVkKSk7CisKKwl1c2JfcHV0X2RldihvZGV2LT51ZGV2KTsKKworCWlmIChvZGV2LT5idWYpIGtmcmVlKG9kZXYtPmJ1Zik7CisKKwlrZnJlZShvZGV2KTsKKworCWRldl9pbmZvKCZpbnRlcmZhY2UtPmRldiwgIkRpc2Nvbm5lY3RlZCBBc3VzIE9MRUQgZGV2aWNlXG4iKTsKK30KKworc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIG9sZWRfZHJpdmVyID0geworCS5uYW1lID0JCUFTVVNfT0xFRF9OQU1FLAorCS5wcm9iZSA9CWFzdXNfb2xlZF9wcm9iZSwKKwkuZGlzY29ubmVjdCA9CWFzdXNfb2xlZF9kaXNjb25uZWN0LAorCS5pZF90YWJsZSA9CWlkX3RhYmxlLAorfTsKKworc3RhdGljIHNzaXplX3QgdmVyc2lvbl9zaG93KHN0cnVjdCBjbGFzcyAqZGV2LCBjaGFyICpidWYpCit7CisJcmV0dXJuIHNwcmludGYoYnVmLCBBU1VTX09MRURfVU5ERVJTQ09SRV9OQU1FICIgJXNcbiIsIEFTVVNfT0xFRF9WRVJTSU9OKTsKK30KKworc3RhdGljIENMQVNTX0FUVFIodmVyc2lvbiwgU19JUlVHTywgdmVyc2lvbl9zaG93LCBOVUxMKTsKKworc3RhdGljIGludCBfX2luaXQgYXN1c19vbGVkX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0dmFsID0gMDsKKwlvbGVkX2NsYXNzID0gY2xhc3NfY3JlYXRlKFRISVNfTU9EVUxFLCBBU1VTX09MRURfVU5ERVJTQ09SRV9OQU1FKTsKKworCWlmIChJU19FUlIob2xlZF9jbGFzcykpIHsKKwkJZXJyKCJFcnJvciBjcmVhdGluZyAiIEFTVVNfT0xFRF9VTkRFUlNDT1JFX05BTUUgIiBjbGFzcyIpOworCQlyZXR1cm4gUFRSX0VSUihvbGVkX2NsYXNzKTsKKwl9CisKKwlpZiAoKHJldHZhbCA9IGNsYXNzX2NyZWF0ZV9maWxlKG9sZWRfY2xhc3MsICZjbGFzc19hdHRyX3ZlcnNpb24pKSkgeworCQllcnIoIkVycm9yIGNyZWF0aW5nIGNsYXNzIHZlcnNpb24gZmlsZSIpOworCQlnb3RvIGVycm9yOworCX0KKworCXJldHZhbCA9IHVzYl9yZWdpc3Rlcigmb2xlZF9kcml2ZXIpOworCisJaWYgKHJldHZhbCkgeworCQllcnIoInVzYl9yZWdpc3RlciBmYWlsZWQuIEVycm9yIG51bWJlciAlZCIsIHJldHZhbCk7CisJCWdvdG8gZXJyb3I7CisJfQorCisJcmV0dXJuIHJldHZhbDsKKworZXJyb3I6CisJY2xhc3NfZGVzdHJveShvbGVkX2NsYXNzKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgYXN1c19vbGVkX2V4aXQodm9pZCkKK3sKKwljbGFzc19yZW1vdmVfZmlsZShvbGVkX2NsYXNzLCAmY2xhc3NfYXR0cl92ZXJzaW9uKTsKKwljbGFzc19kZXN0cm95KG9sZWRfY2xhc3MpOworCisJdXNiX2RlcmVnaXN0ZXIoJm9sZWRfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQgKGFzdXNfb2xlZF9pbml0KTsKK21vZHVsZV9leGl0IChhc3VzX29sZWRfZXhpdCk7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hc3VzX29sZWQvbGludXgudHh0IGIvZHJpdmVycy9zdGFnaW5nL2FzdXNfb2xlZC9saW51eC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGM3NThiMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9hc3VzX29sZWQvbGludXgudHh0CkBAIC0wLDAgKzEsMzMgQEAKKzxzOjc0eDMyPgorMAorMAorMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAxMTExMTExMTExMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiswMDAxMTExMTEwMDAwMDAwMDAwMDAwMDExMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorMDAwMDExMTEwMDAwMDAwMDAwMDAwMDAxMTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAxMTExMDAwMDAwMDAwMDAwMDAwMTExMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiswMDAwMTExMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorMDAwMDExMTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAxMTExMDAwMDAwMDAwMDAwMDExMTAwMDAxMTExMTExMTExMTAwMDAwMTExMTEwMDExMTExMTAwMDExMTExMTAxMTExMDAwCiswMDAwMTExMTAwMDAwMDAwMDAwMDExMTExMDAwMDAxMTExMTAwMDExMTAwMDExMTExMDAwMDExMTEwMDAwMTExMTAwMDExMDAwMAorMDAwMDExMTEwMDAwMDAwMDAwMDExMDExMTAwMDAwMTExMTEwMDAxMTEwMDAwMDExMTEwMDAxMTExMDAwMDAxMTExMDAxMDAwMDAKKzAwMDAxMTExMDAwMDAwMDAwMDAxMDAxMTEwMDAwMDExMTEwMDAwMTExMTAwMDAxMTExMDAwMTExMTAwMDAwMTExMTAxMTAwMDAwCiswMDAwMTExMTAwMDAwMDAwMDEwMDAwMTExMDAwMDAxMTExMDAwMDExMTEwMDAwMTExMTAwMDExMTEwMDAwMDAxMTExMTAwMDAwMAorMDAwMDExMTEwMDAwMDAwMDAxMDAwMTExMTAwMDAwMTExMTAwMDAxMTExMDAwMDExMTEwMDAxMTExMDAwMDAwMDExMTEwMDAwMDAKKzAwMDAxMTExMDAwMDAwMDAwMTAwMDExMTEwMDAwMDExMTEwMDAwMTExMTAwMDAxMTExMDAwMTExMTAwMDAwMDAxMTExMDAwMDAwCiswMDAwMTExMTAwMDAwMDAwMDEwMDAxMTEwMDEwMDAxMTExMDAwMDExMTEwMDAwMTExMTAwMDExMTEwMDAwMDAwMTExMTEwMDAwMAorMDAwMDExMTEwMDAwMDAwMDExMDAxMTExMDAxMDAwMTExMTAwMDAxMTExMDAwMDExMTEwMDAxMTExMDAwMDAwMDExMTExMTAwMDAKKzAwMDAxMTExMDAwMDAwMDAxMTAwMTExMTAxMTAwMDExMTEwMDAwMTExMTAwMDAxMTExMDAwMTExMTAwMDAwMDExMDExMTEwMDAwCiswMDAwMTExMTAwMDAwMDAxMTEwMDExMTEwMTAwMDAxMTExMDAwMDExMTEwMDAwMTExMTAwMDExMTEwMDAwMDAxMDAwMTExMTAwMAorMDAwMTExMTEwMDAwMDExMTExMDAxMTEwMTEwMDAwMTExMTAwMDAxMTExMDAwMDExMTEwMDExMTExMDAwMDAxMTAwMDAxMTExMDAKKzExMTExMTExMTExMTExMTExMTAwMDExMTEwMDAxMTExMTExMDExMTExMTEwMDAwMTExMTEwMTExMTExMDExMTExMDExMTExMTEwCiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiswCiswCiswCiswCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYXN1c19vbGVkL2xpbnV4X2YudHh0IGIvZHJpdmVycy9zdGFnaW5nL2FzdXNfb2xlZC9saW51eF9mLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGJiODVjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2FzdXNfb2xlZC9saW51eF9mLnR4dApAQCAtMCwwICsxLDE4IEBACis8ZjoxMjh4MTY+CiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTExMTExMTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTExMTAwMDAwMDAwMDAwMDExMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMTEwMDAwMDAwMDAwMDAxMTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMTExMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTExMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMTEwMDAwMDAwMDAwMDExMDAwMTExMTExMTExMTAwMDAxMTExMDAxMTExMTAwMTExMTEwMTExMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMTExMDAwMDAwMDAwMDExMTEwMDAwMTExMTAwMDExMDAwMTExMTAwMDExMTEwMDAxMTEwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTExMTAwMDAwMDAwMDEwMTExMDAwMDExMTEwMDAxMTEwMDAxMTExMDAxMTExMDAwMDExMTAxMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMTEwMDAwMDAwMDAwMDExMTAwMDAxMTEwMDAwMTExMDAwMTExMTAwMTExMTAwMDAxMTExMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMTExMDAwMDAwMDEwMDAxMTEwMDAwMTExMDAwMDExMTAwMDExMTEwMDExMTEwMDAwMDExMTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTExMTAwMDAwMDAxMDAwMTExMDAwMDExMTAwMDAxMTEwMDAxMTExMDAxMTExMDAwMDAxMTExMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMTEwMDAwMDAwMTAwMTExMDAxMDAxMTEwMDAwMTExMDAwMTExMTAwMTExMTAwMDAwMTExMTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMTExMDAwMDAwMTEwMDExMTAxMTAwMTExMDAwMDExMTAwMDExMTEwMDExMTEwMDAwMDExMTExMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTExMTAwMDAwMDExMDAxMTEwMTAwMDExMTAwMDAxMTEwMDAxMTExMDAxMTExMDAwMDAxMDAxMTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMTEwMDAwMTExMTAwMTEwMTEwMDAxMTEwMDAwMTExMDAwMTExMTAwMTExMTAwMDAxMDAwMDExMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTExMTExMTExMTExMTEwMDExMTEwMDExMTExMTAxMTExMTEwMDAxMTExMDExMTExMDExMTEwMTExMTExMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYXN1c19vbGVkL2xpbnV4X2ZyLnR4dCBiL2RyaXZlcnMvc3RhZ2luZy9hc3VzX29sZWQvbGludXhfZnIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4OGUyYjMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYXN1c19vbGVkL2xpbnV4X2ZyLnR4dApAQCAtMCwwICsxLDMzIEBACis8ZjoxMjh4MzI+CiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTExMTExMTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTExMTAwMDAwMDAwMDAwMDExMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMTEwMDAwMDAwMDAwMDAxMTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMTExMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTExMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMTEwMDAwMDAwMDAwMDExMDAwMTExMTExMTExMTAwMDAxMTExMDAxMTExMTAwMTExMTEwMTExMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMTExMDAwMDAwMDAwMDExMTEwMDAwMTExMTAwMDExMDAwMTExMTAwMDExMTEwMDAxMTEwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTExMTAwMDAwMDAwMDEwMTExMDAwMDExMTEwMDAxMTEwMDAxMTExMDAxMTExMDAwMDExMTAxMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMTEwMDAwMDAwMDAwMDExMTAwMDAxMTEwMDAwMTExMDAwMTExMTAwMTExMTAwMDAxMTExMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMTExMDAwMDAwMDEwMDAxMTEwMDAwMTExMDAwMDExMTAwMDExMTEwMDExMTEwMDAwMDExMTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTExMTAwMDAwMDAxMDAwMTExMDAwMDExMTAwMDAxMTEwMDAxMTExMDAxMTExMDAwMDAxMTExMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMTEwMDAwMDAwMTAwMTExMDAxMDAxMTEwMDAwMTExMDAwMTExMTAwMTExMTAwMDAwMTExMTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMTExMDAwMDAwMTEwMDExMTAxMTAwMTExMDAwMDExMTAwMDExMTEwMDExMTEwMDAwMDExMTExMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTExMTAwMDAwMDExMDAxMTEwMTAwMDExMTAwMDAxMTEwMDAxMTExMDAxMTExMDAwMDAxMDAxMTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMTEwMDAwMTExMTAwMTEwMTEwMDAxMTEwMDAwMTExMDAwMTExMTAwMTExMTAwMDAxMDAwMDExMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTExMTExMTExMTExMTEwMDExMTEwMDExMTExMTAxMTExMTEwMDAxMTExMDExMTExMDExMTEwMTExMTExMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMTExMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMTExMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMTExMTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMTExMTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hc3VzX29sZWQvdHV4LnR4dCBiL2RyaXZlcnMvc3RhZ2luZy9hc3VzX29sZWQvdHV4LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDIwNTI4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2FzdXNfb2xlZC90dXgudHh0CkBAIC0wLDAgKzEsMzMgQEAKKzxzOjMyeDMyPgorMDAwMDAwMDAwMDAwMDExMTExMTEwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDEgICAgICAgMTAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDEgICAgICAgICAxMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAxICAgICAgICAgMTAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMSAgICAgICAgIDEwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDEgMSAgMTExICAxMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAxICAgIDEgMSAgIDEwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMSAgMTExICAgICAxMDAwMDAwMDAwCiswMDAwMDAwMDAwMDEgMTExMTExICAgMTAwMDAwMDAwMAorMDAwMDAwMDAwMDAxIDExMTExMSAgIDEwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMSAgICAxIDEgICAgMTAwMDAwMDAwCiswMDAwMDAwMDAwMSAgICAgIDExICAgIDEwMDAwMDAwMAorMDAwMDAwMDAwMDEgMTExMTExMTEgICAgMTAwMDAwMDAKKzAwMDAwMDAwMDEgIDExMTExMTExICAgICAxMDAwMDAwCiswMDAwMDAwMDEgICAxMTExMTExMTEgICAgMTAwMDAwMAorMDAwMDAwMDAxICAxMTExMTExMTExICAgICAxMDAwMDAKKzAwMDAwMDAxICAgMTExMTExMTExMTEgICAgMTAwMDAwCiswMDAwMDAwMSAgMTExMTExMTExMTExICAgICAxMDAwMAorMDAwMDAwMSAgIDExMTExMTExMTExMSAgICAgMTAwMDAKKzAwMDAwMDEgICAxMTExMTExMTExMTEgICAgIDEwMDAwCiswMDAwMDAxICAgMTExMTExMTExMTExICAgICAxMDAwMAorMDAwMDAwMSAgIDExMTExMTExMTExMSAgICAgMTAwMDAKKzAwMDAwMDAxMSAxMTExMTExMTExMSAgICAgIDEwMDAwCiswMDAwMTEgMTEgIDExMTExMTExMTExICAgIDEwMDAwMAorMDAwMSAgMTExMSAgMTExMTExMTExMTExMTExIDEwMDAKKzAwMSAxMTExMTExICAxMTExMTExMTExMTExMSAxMDAwCiswMDEgMTExMTExMSAgMTExMTExMSAgMTExMTExIDEwMAorMDAxIDExMTExMTExIDExMTExMSAgIDExMTExMTEgMTAKKzAwMSAxMTExMTExMSAgICAgICAgICAxMTExMSAgMTAwCiswMDEgIDExMTExMTEgICAgICAgICAgMTExICAxMTEwMAorMDAwMTExICAgMTExICAgMTExMTEgIDExICAxMDAwMDAKKzAwMDAwMDExMSAgIDExMTExMTExMSAgICAxMDAwMDAwCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYXN1c19vbGVkL3R1eF9yLnR4dCBiL2RyaXZlcnMvc3RhZ2luZy9hc3VzX29sZWQvdHV4X3IudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkODFhM2UKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYXN1c19vbGVkL3R1eF9yLnR4dApAQCAtMCwwICsxLDMzIEBACis8cjozMngzMj4KKzAwMDAwMDAwMDAwMDAxMTExMTExMDAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDAxICAgICAgIDEwMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAxICAgICAgICAgMTAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMSAgICAgICAgIDEwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDEgICAgICAgICAxMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAxIDEgIDExMSAgMTAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMSAgICAxIDEgICAxMDAwMDAwMDAwCiswMDAwMDAwMDAwMDEgIDExMSAgICAgMTAwMDAwMDAwMAorMDAwMDAwMDAwMDAxIDExMTExMSAgIDEwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMSAxMTExMTEgICAxMDAwMDAwMDAwCiswMDAwMDAwMDAwMDEgICAgMSAxICAgIDEwMDAwMDAwMAorMDAwMDAwMDAwMDEgICAgICAxMSAgICAxMDAwMDAwMDAKKzAwMDAwMDAwMDAxIDExMTExMTExICAgIDEwMDAwMDAwCiswMDAwMDAwMDAxICAxMTExMTExMSAgICAgMTAwMDAwMAorMDAwMDAwMDAxICAgMTExMTExMTExICAgIDEwMDAwMDAKKzAwMDAwMDAwMSAgMTExMTExMTExMSAgICAgMTAwMDAwCiswMDAwMDAwMSAgIDExMTExMTExMTExICAgIDEwMDAwMAorMDAwMDAwMDEgIDExMTExMTExMTExMSAgICAgMTAwMDAKKzAwMDAwMDEgICAxMTExMTExMTExMTEgICAgIDEwMDAwCiswMDAwMDAxICAgMTExMTExMTExMTExICAgICAxMDAwMAorMDAwMDAwMSAgIDExMTExMTExMTExMSAgICAgMTAwMDAKKzAwMDAwMDEgICAxMTExMTExMTExMTEgICAgIDEwMDAwCiswMDAwMDAwMTEgMTExMTExMTExMTEgICAgICAxMDAwMAorMDAwMDExIDExICAxMTExMTExMTExMSAgICAxMDAwMDAKKzAwMDEgIDExMTEgIDExMTExMTExMTExMTExMSAxMDAwCiswMDEgMTExMTExMSAgMTExMTExMTExMTExMTEgMTAwMAorMDAxIDExMTExMTEgIDExMTExMTEgIDExMTExMSAxMDAKKzAwMSAxMTExMTExMSAxMTExMTEgICAxMTExMTExIDEwCiswMDEgMTExMTExMTEgICAgICAgICAgMTExMTEgIDEwMAorMDAxICAxMTExMTExICAgICAgICAgIDExMSAgMTExMDAKKzAwMDExMSAgIDExMSAgIDExMTExICAxMSAgMTAwMDAwCiswMDAwMDAxMTEgICAxMTExMTExMTEgICAgMTAwMDAwMApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FzdXNfb2xlZC90dXhfcjIudHh0IGIvZHJpdmVycy9zdGFnaW5nL2FzdXNfb2xlZC90dXhfcjIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5NGQ4NGUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYXN1c19vbGVkL3R1eF9yMi50eHQKQEAgLTAsMCArMSwzMyBAQAorPHI6MjU2eDMyPgorMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMTExMTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxICAgICAgIDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMSAgICAgICAgIDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMSAgICAgICAgIDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMSAgICAgICAgIDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMSAxICAxMTEgIDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMSAgICAxIDEgICAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMTExMTExMTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMSAgMTExICAgICAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTExMTExMDAwMDAwMDAwMDAwMDAxMTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMSAxMTExMTEgICAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMTEwMDAwMDAwMDAwMDAwMDAxMTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMSAxMTExMTEgICAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMTEwMDAwMDAwMDAwMDAwMDAxMTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMSAgICAxIDEgICAgMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxICAgICAgMTEgICAgMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxIDExMTExMTExICAgIDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMTEwMDAwMDAwMDAwMDAwMTExMDAwMDExMTExMTExMTExMDAwMDAxMTExMTAwMTExMTExMDAwMTExMTExMDExMTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEgIDExMTExMTExICAgICAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMTEwMDAwMDAwMDAwMDAxMTExMTAwMDAwMTExMTEwMDAxMTEwMDAxMTExMTAwMDAxMTExMDAwMDExMTEwMDAxMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMSAgIDExMTExMTExMSAgICAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMTEwMDAwMDAwMDAwMDExMDExMTAwMDAwMTExMTEwMDAxMTEwMDAwMDExMTEwMDAxMTExMDAwMDAxMTExMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMSAgMTExMTExMTExMSAgICAgMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMTEwMDAwMDAwMDAwMDEwMDExMTAwMDAwMTExMTAwMDAxMTExMDAwMDExMTEwMDAxMTExMDAwMDAxMTExMDExMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxICAgMTExMTExMTExMTEgICAgMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMTEwMDAwMDAwMDAxMDAwMDExMTAwMDAwMTExMTAwMDAxMTExMDAwMDExMTEwMDAxMTExMDAwMDAwMTExMTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxICAxMTExMTExMTExMTEgICAgIDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMTEwMDAwMDAwMDAxMDAwMTExMTAwMDAwMTExMTAwMDAxMTExMDAwMDExMTEwMDAxMTExMDAwMDAwMDExMTEwMDAwMDAwCiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxICAgMTExMTExMTExMTExICAgICAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMTExMDAwMDAwMDAwMTAwMDExMTEwMDAwMDExMTEwMDAwMTExMTAwMDAxMTExMDAwMTExMTAwMDAwMDAxMTExMDAwMDAwCiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxICAgMTExMTExMTExMTExICAgICAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMTExMDAwMDAwMDAwMTAwMDExMTAwMTAwMDExMTEwMDAwMTExMTAwMDAxMTExMDAwMTExMTAwMDAwMDAxMTExMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxICAgMTExMTExMTExMTExICAgICAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMTExMDAwMDAwMDAxMTAwMTExMTAwMTAwMDExMTEwMDAwMTExMTAwMDAxMTExMDAwMTExMTAwMDAwMDAxMTExMTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxICAgMTExMTExMTExMTExICAgICAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMTExMDAwMDAwMDAxMTAwMTExMTAxMTAwMDExMTEwMDAwMTExMTAwMDAxMTExMDAwMTExMTAwMDAwMDExMDExMTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTEgMTExMTExMTExMTEgICAgICAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMTExMDAwMDAwMDExMTAwMTExMTAxMDAwMDExMTEwMDAwMTExMTAwMDAxMTExMDAwMTExMTAwMDAwMDEwMDAxMTExMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTEgMTEgIDExMTExMTExMTExICAgIDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMTExMDAwMDAxMTExMTAwMTExMDExMDAwMDExMTEwMDAwMTExMTAwMDAxMTExMDAxMTExMTAwMDAwMTEwMDAwMTExMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxICAxMTExICAxMTExMTExMTExMTExMTEgMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMTExMTExMTExMTExMTExMTAwMDExMTEwMDAxMTExMTExMDExMTExMTEwMDAwMTExMTEwMTExMTExMDExMTExMDExMTExMTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEgMTExMTExMSAgMTExMTExMTExMTExMTEgMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEgMTExMTExMSAgMTExMTExMSAgMTExMTExIDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEgMTExMTExMTEgMTExMTExICAgMTExMTExMSAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEgMTExMTExMTEgICAgICAgICAgMTExMTEgIDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMSAgMTExMTExMSAgICAgICAgICAxMTEgIDExMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTExICAgMTExICAgMTExMTEgIDExICAxMAorMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTExICAgMTExMTExMTExICAgIDEwCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYXN1c19vbGVkL3ppZy50eHQgYi9kcml2ZXJzL3N0YWdpbmcvYXN1c19vbGVkL3ppZy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE1NzNkOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9hc3VzX29sZWQvemlnLnR4dApAQCAtMCwwICsxLDMzIEBACis8cjoxMjh4MzI+CisxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMQorMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAKKzAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAwCiswMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAwMAorMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAwMDAKKzAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAwMDAwCiswMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAwMDAwMAorMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAKKzAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwCiswMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMAorMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hdDc2X3VzYi9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL2F0NzZfdXNiL0tjb25maWcKaW5kZXggODYwNmY5Ni4uNGMwZTU1ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2F0NzZfdXNiL0tjb25maWcKKysrIGIvZHJpdmVycy9zdGFnaW5nL2F0NzZfdXNiL0tjb25maWcKQEAgLTEsNiArMSw2IEBACiBjb25maWcgVVNCX0FUTUVMCiAJdHJpc3RhdGUgIkF0bWVsIGF0NzZjNTAzL2F0NzZjNTA1L2F0NzZjNTA1YSBVU0IgY2FyZHMiCi0JZGVwZW5kcyBvbiBXTEFOXzgwMjExICYmIFVTQgorCWRlcGVuZHMgb24gTUFDODAyMTEgJiYgV0xBTl84MDIxMSAmJiBVU0IKIAlkZWZhdWx0IE4KIAlzZWxlY3QgRldfTE9BREVSCiAJLS0taGVscC0tLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2F0NzZfdXNiL2F0NzZfdXNiLmMgYi9kcml2ZXJzL3N0YWdpbmcvYXQ3Nl91c2IvYXQ3Nl91c2IuYwppbmRleCAxNzRlMmJlLi4xODU1MzNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYXQ3Nl91c2IvYXQ3Nl91c2IuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvYXQ3Nl91c2IvYXQ3Nl91c2IuYwpAQCAtNiw2ICs2LDcgQEAKICAqIENvcHlyaWdodCAoYykgMjAwNCBOaWNrIEpvbmVzCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDQgQmFsaW50IFNlZWJlciA8bjBfNXA0bV9wMTM0NTNAaG90bWFpbC5jb20+CiAgKiBDb3B5cmlnaHQgKGMpIDIwMDcgR3VpZG8gR3VlbnRoZXIgPGFneEBzaWd4Y3B1Lm9yZz4KKyAqIENvcHlyaWdodCAoYykgMjAwNyBLYWxsZSBWYWxvIDxrYWxsZS52YWxvQGlraS5maT4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwpAQCAtMTYsNiArMTcsMTMgQEAKICAqIEF0bWVsIEFUNzZDNTAzQS81MDUvNTA1QS4KICAqCiAgKiBTb21lIGl3X2hhbmRsZXIgY29kZSB3YXMgdGFrZW4gZnJvbSBhaXJvLmMsIChDKSAxOTk5IEJlbmphbWluIFJlZWQKKyAqCisgKiBUT0RPIGZvciB0aGUgbWFjODAyMTEgcG9ydDoKKyAqIG8gYWRob2Mgc3VwcG9ydAorICogbyBSVFMvQ1RTIHN1cHBvcnQKKyAqIG8gUG93ZXIgU2F2ZSBNb2RlIHN1cHBvcnQKKyAqIG8gc3VwcG9ydCBmb3Igc2hvcnQvbG9uZyBwcmVhbWJsZXMKKyAqIG8gZXhwb3J0IHZhcmlhYmxlcyB0aHJvdWdoIGRlYnVnZnMvc3lzZnMKICAqLwogCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgpAQCAtMzYsNyArNDQsNyBAQAogI2luY2x1ZGUgPG5ldC9pZWVlODAyMTFfcmFkaW90YXAuaD4KICNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgogI2luY2x1ZGUgPGxpbnV4L2xlZHMuaD4KLSNpbmNsdWRlIDxuZXQvaWVlZTgwMjExLmg+CisjaW5jbHVkZSA8bmV0L21hYzgwMjExLmg+CiAKICNpbmNsdWRlICJhdDc2X3VzYi5oIgogCkBAIC03NiwzMSArODQsNDMgQEAKICNkZWZpbmUgREJHX1dFX0VWRU5UUwkJMHgwODAwMDAwMAkvKiBkdW1wIHdpcmVsZXNzIGV2ZW50cyAqLwogI2RlZmluZSBEQkdfRlcJCQkweDEwMDAwMDAwCS8qIGZpcm13YXJlIGRvd25sb2FkICovCiAjZGVmaW5lIERCR19ERlUJCQkweDIwMDAwMDAwCS8qIGRldmljZSBmaXJtd2FyZSB1cGdyYWRlICovCisjZGVmaW5lIERCR19DTUQJCQkweDQwMDAwMDAwCisjZGVmaW5lIERCR19NQUM4MDIxMQkJMHg4MDAwMDAwMAogCiAjZGVmaW5lIERCR19ERUZBVUxUUwkJMAogCiAvKiBVc2Ugb3VyIG93biBkYmcgbWFjcm8gKi8KICNkZWZpbmUgYXQ3Nl9kYmcoYml0cywgZm9ybWF0LCBhcmcuLi4pIFwKLQlkbyB7IFwKLQkJaWYgKGF0NzZfZGVidWcgJiAoYml0cykpIFwKK2RvIHsJXAorCWlmIChhdDc2X2RlYnVnICYgKGJpdHMpKQlcCiAJCXByaW50ayhLRVJOX0RFQlVHIERSSVZFUl9OQU1FICI6ICIgZm9ybWF0ICJcbiIgLCAjIyBhcmcpOyBcCi0JfSB3aGlsZSAoMCkKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgYXQ3Nl9kYmdfZHVtcChiaXRzLCBidWYsIGxlbiwgZm9ybWF0LCBhcmcuLi4pCVwKK2RvIHsJXAorCWlmIChhdDc2X2RlYnVnICYgKGJpdHMpKSB7CVwKKwkJcHJpbnRrKEtFUk5fREVCVUcgRFJJVkVSX05BTUUgIjogIiBmb3JtYXQgIlxuIiAsICMjIGFyZyk7IFwKKwkJcHJpbnRfaGV4X2R1bXBfYnl0ZXMoIiIsIERVTVBfUFJFRklYX09GRlNFVCwgYnVmLCBsZW4pOwlcCisJCX0JCQkJCQkJXAorfSB3aGlsZSAoMCkKIAogc3RhdGljIGludCBhdDc2X2RlYnVnID0gREJHX0RFRkFVTFRTOwogCisjZGVmaW5lIEZJUk1XQVJFX0lTX1dQQSh2ZXIpICgodmVyLm1ham9yID09IDEpICYmICh2ZXIubWlub3IgPT0gMTAzKSkKKwogLyogUHJvdGVjdCBhZ2FpbnN0IGNvbmN1cnJlbnQgZmlybXdhcmUgbG9hZGluZyBhbmQgcGFyc2luZyAqLwogc3RhdGljIHN0cnVjdCBtdXRleCBmd19tdXRleDsKIAogc3RhdGljIHN0cnVjdCBmd2VudHJ5IGZpcm13YXJlc1tdID0gewotCVswXSA9IHsiIn0sCi0JW0JPQVJEXzUwM19JU0wzODYxXSA9IHsiYXRtZWxfYXQ3NmM1MDMtaTM4NjEuYmluIn0sCi0JW0JPQVJEXzUwM19JU0wzODYzXSA9IHsiYXRtZWxfYXQ3NmM1MDMtaTM4NjMuYmluIn0sCi0JW0JPQVJEXzUwM10gPSB7ImF0bWVsX2F0NzZjNTAzLXJmbWQuYmluIn0sCi0JW0JPQVJEXzUwM19BQ0NdID0geyJhdG1lbF9hdDc2YzUwMy1yZm1kLWFjYy5iaW4ifSwKLQlbQk9BUkRfNTA1XSA9IHsiYXRtZWxfYXQ3NmM1MDUtcmZtZC5iaW4ifSwKLQlbQk9BUkRfNTA1XzI5NThdID0geyJhdG1lbF9hdDc2YzUwNS1yZm1kMjk1OC5iaW4ifSwKLQlbQk9BUkRfNTA1QV0gPSB7ImF0bWVsX2F0NzZjNTA1YS1yZm1kMjk1OC5iaW4ifSwKLQlbQk9BUkRfNTA1QU1YXSA9IHsiYXRtZWxfYXQ3NmM1MDVhbXgtcmZtZC5iaW4ifSwKKwlbMF0gPSB7ICIiIH0sCisJW0JPQVJEXzUwM19JU0wzODYxXSA9IHsgImF0bWVsX2F0NzZjNTAzLWkzODYxLmJpbiIgfSwKKwlbQk9BUkRfNTAzX0lTTDM4NjNdID0geyAiYXRtZWxfYXQ3NmM1MDMtaTM4NjMuYmluIiB9LAorCVtCT0FSRF81MDNdID0geyAiYXRtZWxfYXQ3NmM1MDMtcmZtZC5iaW4iIH0sCisJW0JPQVJEXzUwM19BQ0NdID0geyAiYXRtZWxfYXQ3NmM1MDMtcmZtZC1hY2MuYmluIiB9LAorCVtCT0FSRF81MDVdID0geyAiYXRtZWxfYXQ3NmM1MDUtcmZtZC5iaW4iIH0sCisJW0JPQVJEXzUwNV8yOTU4XSA9IHsgImF0bWVsX2F0NzZjNTA1LXJmbWQyOTU4LmJpbiIgfSwKKwlbQk9BUkRfNTA1QV0gPSB7ICJhdG1lbF9hdDc2YzUwNWEtcmZtZDI5NTguYmluIiB9LAorCVtCT0FSRF81MDVBTVhdID0geyAiYXRtZWxfYXQ3NmM1MDVhbXgtcmZtZC5iaW4iIH0sCiB9OwogCiAjZGVmaW5lIFVTQl9ERVZJQ0VfREFUQShfX29wcykJLmRyaXZlcl9pbmZvID0gKGtlcm5lbF91bG9uZ190KShfX29wcykKQEAgLTExMCwxMzMgKzEzMCwxMzMgQEAKIAkgKiBhdDc2YzUwMy1pMzg2MQogCSAqLwogCS8qIEdlbmVyaWMgQVQ3NkM1MDMvMzg2MSBkZXZpY2UgKi8KLQl7VVNCX0RFVklDRSgweDAzZWIsIDB4NzYwMyksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDNfSVNMMzg2MSl9LAorCXsgVVNCX0RFVklDRSgweDAzZWIsIDB4NzYwMyksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDNfSVNMMzg2MSkgfSwKIAkvKiBMaW5rc3lzIFdVU0IxMSB2Mi4xL3YyLjYgKi8KLQl7VVNCX0RFVklDRSgweDA2NmIsIDB4MjIxMSksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDNfSVNMMzg2MSl9LAorCXsgVVNCX0RFVklDRSgweDA2NmIsIDB4MjIxMSksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDNfSVNMMzg2MSkgfSwKIAkvKiBOZXRnZWFyIE1BMTAxIHJldi4gQSAqLwotCXtVU0JfREVWSUNFKDB4MDg2NCwgMHg0MTAwKSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwM19JU0wzODYxKX0sCisJeyBVU0JfREVWSUNFKDB4MDg2NCwgMHg0MTAwKSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwM19JU0wzODYxKSB9LAogCS8qIFRla3JhbSBVMzAwQyAvIEFsbG5ldCBBTEwwMTkzICovCi0Je1VTQl9ERVZJQ0UoMHgwYjNiLCAweDE2MTIpLCBVU0JfREVWSUNFX0RBVEEoQk9BUkRfNTAzX0lTTDM4NjEpfSwKKwl7IFVTQl9ERVZJQ0UoMHgwYjNiLCAweDE2MTIpLCBVU0JfREVWSUNFX0RBVEEoQk9BUkRfNTAzX0lTTDM4NjEpIH0sCiAJLyogSFAgSE4yMTBXIEo3ODAxQSAqLwotCXtVU0JfREVWSUNFKDB4MDNmMCwgMHgwMTFjKSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwM19JU0wzODYxKX0sCisJeyBVU0JfREVWSUNFKDB4MDNmMCwgMHgwMTFjKSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwM19JU0wzODYxKSB9LAogCS8qIFNpdGVjb20vWi1Db20vWnl4ZWwgTTRZLTc1MCAqLwotCXtVU0JfREVWSUNFKDB4MGNkZSwgMHgwMDAxKSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwM19JU0wzODYxKX0sCisJeyBVU0JfREVWSUNFKDB4MGNkZSwgMHgwMDAxKSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwM19JU0wzODYxKSB9LAogCS8qIER5bmFsaW5rL0Fza2V5IFdMTDAxMyAoaW50ZXJzaWwpICovCi0Je1VTQl9ERVZJQ0UoMHgwNjlhLCAweDAzMjApLCBVU0JfREVWSUNFX0RBVEEoQk9BUkRfNTAzX0lTTDM4NjEpfSwKKwl7IFVTQl9ERVZJQ0UoMHgwNjlhLCAweDAzMjApLCBVU0JfREVWSUNFX0RBVEEoQk9BUkRfNTAzX0lTTDM4NjEpIH0sCiAJLyogRVogY29ubmVjdCAxMU1wYnMgV2lyZWxlc3MgVVNCIEFkYXB0ZXIgU01DMjY2MlcgdjEgKi8KLQl7VVNCX0RFVklDRSgweDBkNWMsIDB4YTAwMSksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDNfSVNMMzg2MSl9LAorCXsgVVNCX0RFVklDRSgweDBkNWMsIDB4YTAwMSksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDNfSVNMMzg2MSkgfSwKIAkvKiBCZW5RIEFXTDMwMCAqLwotCXtVU0JfREVWSUNFKDB4MDRhNSwgMHg5MDAwKSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwM19JU0wzODYxKX0sCisJeyBVU0JfREVWSUNFKDB4MDRhNSwgMHg5MDAwKSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwM19JU0wzODYxKSB9LAogCS8qIEFkZHRyb24gQVdVLTEyMCwgQ29tcGV4IFdMVTExICovCi0Je1VTQl9ERVZJQ0UoMHgwNWRkLCAweGZmMzEpLCBVU0JfREVWSUNFX0RBVEEoQk9BUkRfNTAzX0lTTDM4NjEpfSwKKwl7IFVTQl9ERVZJQ0UoMHgwNWRkLCAweGZmMzEpLCBVU0JfREVWSUNFX0RBVEEoQk9BUkRfNTAzX0lTTDM4NjEpIH0sCiAJLyogSW50ZWwgQVAzMTAgQW55UG9pbnQgSUkgVVNCICovCi0Je1VTQl9ERVZJQ0UoMHg4MDg2LCAweDAyMDApLCBVU0JfREVWSUNFX0RBVEEoQk9BUkRfNTAzX0lTTDM4NjEpfSwKKwl7IFVTQl9ERVZJQ0UoMHg4MDg2LCAweDAyMDApLCBVU0JfREVWSUNFX0RBVEEoQk9BUkRfNTAzX0lTTDM4NjEpIH0sCiAJLyogRHluYWxpbmsgTDExVSAqLwotCXtVU0JfREVWSUNFKDB4MGQ4ZSwgMHg3MTAwKSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwM19JU0wzODYxKX0sCisJeyBVU0JfREVWSUNFKDB4MGQ4ZSwgMHg3MTAwKSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwM19JU0wzODYxKSB9LAogCS8qIEFyZXNjb20gV0wtMjEwLCBGQ0MgaWQgMDdKLUdMMjQxMVVTQiAqLwotCXtVU0JfREVWSUNFKDB4MGQ4ZSwgMHg3MTEwKSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwM19JU0wzODYxKX0sCisJeyBVU0JfREVWSUNFKDB4MGQ4ZSwgMHg3MTEwKSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwM19JU0wzODYxKSB9LAogCS8qIEktTyBEQVRBIFdOLUIxMS9VU0IgKi8KLQl7VVNCX0RFVklDRSgweDA0YmIsIDB4MDkxOSksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDNfSVNMMzg2MSl9LAorCXsgVVNCX0RFVklDRSgweDA0YmIsIDB4MDkxOSksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDNfSVNMMzg2MSkgfSwKIAkvKiBCVCBWb3lhZ2VyIDEwMTAgKi8KLQl7VVNCX0RFVklDRSgweDA2OWEsIDB4MDgyMSksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDNfSVNMMzg2MSl9LAorCXsgVVNCX0RFVklDRSgweDA2OWEsIDB4MDgyMSksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDNfSVNMMzg2MSkgfSwKIAkvKgogCSAqIGF0NzZjNTAzLWkzODYzCiAJICovCiAJLyogR2VuZXJpYyBBVDc2QzUwMy8zODYzIGRldmljZSAqLwotCXtVU0JfREVWSUNFKDB4MDNlYiwgMHg3NjA0KSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwM19JU0wzODYzKX0sCisJeyBVU0JfREVWSUNFKDB4MDNlYiwgMHg3NjA0KSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwM19JU0wzODYzKSB9LAogCS8qIFNhbXN1bmcgU1dMLTIxMDBVICovCi0Je1VTQl9ERVZJQ0UoMHgwNTVkLCAweGEwMDApLCBVU0JfREVWSUNFX0RBVEEoQk9BUkRfNTAzX0lTTDM4NjMpfSwKKwl7IFVTQl9ERVZJQ0UoMHgwNTVkLCAweGEwMDApLCBVU0JfREVWSUNFX0RBVEEoQk9BUkRfNTAzX0lTTDM4NjMpIH0sCiAJLyoKIAkgKiBhdDc2YzUwMy1yZm1kCiAJICovCiAJLyogR2VuZXJpYyBBVDc2QzUwMy9SRk1EIGRldmljZSAqLwotCXtVU0JfREVWSUNFKDB4MDNlYiwgMHg3NjA1KSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwMyl9LAorCXsgVVNCX0RFVklDRSgweDAzZWIsIDB4NzYwNSksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDMpIH0sCiAJLyogRHluYWxpbmsvQXNrZXkgV0xMMDEzIChyZm1kKSAqLwotCXtVU0JfREVWSUNFKDB4MDY5YSwgMHgwMzIxKSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwMyl9LAorCXsgVVNCX0RFVklDRSgweDA2OWEsIDB4MDMyMSksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDMpIH0sCiAJLyogTGlua3N5cyBXVVNCMTEgdjIuNiAqLwotCXtVU0JfREVWSUNFKDB4MDc3YiwgMHgyMjE5KSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwMyl9LAorCXsgVVNCX0RFVklDRSgweDA3N2IsIDB4MjIxOSksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDMpIH0sCiAJLyogTmV0d29yayBFdmVyeXdoZXJlIE5XVTExQiAqLwotCXtVU0JfREVWSUNFKDB4MDc3YiwgMHgyMjI3KSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwMyl9LAorCXsgVVNCX0RFVklDRSgweDA3N2IsIDB4MjIyNyksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDMpIH0sCiAJLyogTmV0Z2VhciBNQTEwMSByZXYuIEIgKi8KLQl7VVNCX0RFVklDRSgweDA4NjQsIDB4NDEwMiksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDMpfSwKKwl7IFVTQl9ERVZJQ0UoMHgwODY0LCAweDQxMDIpLCBVU0JfREVWSUNFX0RBVEEoQk9BUkRfNTAzKSB9LAogCS8qIEQtTGluayBEV0wtMTIwIHJldi4gRSAqLwotCXtVU0JfREVWSUNFKDB4MjAwMSwgMHgzMjAwKSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwMyl9LAorCXsgVVNCX0RFVklDRSgweDIwMDEsIDB4MzIwMCksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDMpIH0sCiAJLyogQWN0aW9udGVjIDgwMlVBVDEsIEhXVTAxMTUwLTAxVUsgKi8KLQl7VVNCX0RFVklDRSgweDE2NjgsIDB4NzYwNSksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDMpfSwKKwl7IFVTQl9ERVZJQ0UoMHgxNjY4LCAweDc2MDUpLCBVU0JfREVWSUNFX0RBVEEoQk9BUkRfNTAzKSB9LAogCS8qIEFpclZhc3QgVy1CdWRkaWUgV04yMTAgKi8KLQl7VVNCX0RFVklDRSgweDAzZWIsIDB4NDEwMiksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDMpfSwKKwl7IFVTQl9ERVZJQ0UoMHgwM2ViLCAweDQxMDIpLCBVU0JfREVWSUNFX0RBVEEoQk9BUkRfNTAzKSB9LAogCS8qIERpY2sgU21pdGggRWxlY3Ryb25pY3MgWEgxMTUzIDgwMi4xMWIgVVNCIGFkYXB0ZXIgKi8KLQl7VVNCX0RFVklDRSgweDEzNzEsIDB4NTc0MyksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDMpfSwKKwl7IFVTQl9ERVZJQ0UoMHgxMzcxLCAweDU3NDMpLCBVU0JfREVWSUNFX0RBVEEoQk9BUkRfNTAzKSB9LAogCS8qIENOZXQgQ05VU0I2MTEgKi8KLQl7VVNCX0RFVklDRSgweDEzNzEsIDB4MDAwMSksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDMpfSwKKwl7IFVTQl9ERVZJQ0UoMHgxMzcxLCAweDAwMDEpLCBVU0JfREVWSUNFX0RBVEEoQk9BUkRfNTAzKSB9LAogCS8qIEZpYmVyTGluZSBGTC1XTDIwMFUgKi8KLQl7VVNCX0RFVklDRSgweDEzNzEsIDB4MDAwMiksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDMpfSwKKwl7IFVTQl9ERVZJQ0UoMHgxMzcxLCAweDAwMDIpLCBVU0JfREVWSUNFX0RBVEEoQk9BUkRfNTAzKSB9LAogCS8qIEJlblEgQVdMNDAwIFVTQiBzdGljayAqLwotCXtVU0JfREVWSUNFKDB4MDRhNSwgMHg5MDAxKSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwMyl9LAorCXsgVVNCX0RFVklDRSgweDA0YTUsIDB4OTAwMSksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDMpIH0sCiAJLyogM0NvbSAzQ1JTSEVXNjk2ICovCi0Je1VTQl9ERVZJQ0UoMHgwNTA2LCAweDBhMDEpLCBVU0JfREVWSUNFX0RBVEEoQk9BUkRfNTAzKX0sCisJeyBVU0JfREVWSUNFKDB4MDUwNiwgMHgwYTAxKSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwMykgfSwKIAkvKiBTaWVtZW5zIFNhbnRpcyBBRFNMIFdMQU4gVVNCIGFkYXB0ZXIgV0xMIDAxMyAqLwotCXtVU0JfREVWSUNFKDB4MDY4MSwgMHgwMDFiKSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwMyl9LAorCXsgVVNCX0RFVklDRSgweDA2ODEsIDB4MDAxYiksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDMpIH0sCiAJLyogQmVsa2luIEY1RDYwNTAsIHZlcnNpb24gMiAqLwotCXtVU0JfREVWSUNFKDB4MDUwZCwgMHgwMDUwKSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwMyl9LAorCXsgVVNCX0RFVklDRSgweDA1MGQsIDB4MDA1MCksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDMpIH0sCiAJLyogaUJsaXR6eiwgQldVNjEzIChub3QgKkIgb3IgKlNCKSAqLwotCXtVU0JfREVWSUNFKDB4MDdiOCwgMHhiMDAwKSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwMyl9LAorCXsgVVNCX0RFVklDRSgweDA3YjgsIDB4YjAwMCksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDMpIH0sCiAJLyogR2lnYWJ5dGUgR04tV0xCTTEwMSAqLwotCXtVU0JfREVWSUNFKDB4MTA0NCwgMHg4MDAzKSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwMyl9LAorCXsgVVNCX0RFVklDRSgweDEwNDQsIDB4ODAwMyksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDMpIH0sCiAJLyogUGxhbmV4IEdXLVVTMTFTICovCi0Je1VTQl9ERVZJQ0UoMHgyMDE5LCAweDMyMjApLCBVU0JfREVWSUNFX0RBVEEoQk9BUkRfNTAzKX0sCisJeyBVU0JfREVWSUNFKDB4MjAxOSwgMHgzMjIwKSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwMykgfSwKIAkvKiBJbnRlcm5hbCBXTEFOIGFkYXB0ZXIgaW4gaDVbNCw1XXh4IHNlcmllcyBpUEFRcyAqLwotCXtVU0JfREVWSUNFKDB4MDQ5ZiwgMHgwMDMyKSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwMyl9LAorCXsgVVNCX0RFVklDRSgweDA0OWYsIDB4MDAzMiksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDMpIH0sCiAJLyogQ29yZWdhIFdpcmVsZXNzIExBTiBVU0ItMTEgbWluaSAqLwotCXtVU0JfREVWSUNFKDB4MDdhYSwgMHgwMDExKSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwMyl9LAorCXsgVVNCX0RFVklDRSgweDA3YWEsIDB4MDAxMSksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDMpIH0sCiAJLyogQ29yZWdhIFdpcmVsZXNzIExBTiBVU0ItMTEgbWluaTIgKi8KLQl7VVNCX0RFVklDRSgweDA3YWEsIDB4MDAxOCksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDMpfSwKKwl7IFVTQl9ERVZJQ0UoMHgwN2FhLCAweDAwMTgpLCBVU0JfREVWSUNFX0RBVEEoQk9BUkRfNTAzKSB9LAogCS8qIFVuaWRlbiBQQ1cxMDAgKi8KLQl7VVNCX0RFVklDRSgweDA1ZGQsIDB4ZmYzNSksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDMpfSwKKwl7IFVTQl9ERVZJQ0UoMHgwNWRkLCAweGZmMzUpLCBVU0JfREVWSUNFX0RBVEEoQk9BUkRfNTAzKSB9LAogCS8qCiAJICogYXQ3NmM1MDMtcmZtZC1hY2MKIAkgKi8KIAkvKiBTTUMyNjY0VyAqLwotCXtVU0JfREVWSUNFKDB4MDgzYSwgMHgzNTAxKSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwM19BQ0MpfSwKKwl7IFVTQl9ERVZJQ0UoMHgwODNhLCAweDM1MDEpLCBVU0JfREVWSUNFX0RBVEEoQk9BUkRfNTAzX0FDQykgfSwKIAkvKiBCZWxraW4gRjVENjA1MCwgU01DMjY2MlcgdjIsIFNNQzI2NjJXLUFSICovCi0Je1VTQl9ERVZJQ0UoMHgwZDVjLCAweGEwMDIpLCBVU0JfREVWSUNFX0RBVEEoQk9BUkRfNTAzX0FDQyl9LAorCXsgVVNCX0RFVklDRSgweDBkNWMsIDB4YTAwMiksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDNfQUNDKSB9LAogCS8qCiAJICogYXQ3NmM1MDUtcmZtZAogCSAqLwogCS8qIEdlbmVyaWMgQVQ3NkM1MDUvUkZNRCAqLwotCXtVU0JfREVWSUNFKDB4MDNlYiwgMHg3NjA2KSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwNSl9LAorCXsgVVNCX0RFVklDRSgweDAzZWIsIDB4NzYwNiksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDUpIH0sCiAJLyoKIAkgKiBhdDc2YzUwNS1yZm1kMjk1OAogCSAqLwogCS8qIEdlbmVyaWMgQVQ3NkM1MDUvUkZNRCwgT3Zpc0xpbmsgV0wtMTEzMFVTQiAqLwotCXtVU0JfREVWSUNFKDB4MDNlYiwgMHg3NjEzKSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwNV8yOTU4KX0sCisJeyBVU0JfREVWSUNFKDB4MDNlYiwgMHg3NjEzKSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwNV8yOTU4KSB9LAogCS8qIEZpYmVybGluZSBGTC1XTDI0MFUgKi8KLQl7VVNCX0RFVklDRSgweDEzNzEsIDB4MDAxNCksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDVfMjk1OCl9LAorCXsgVVNCX0RFVklDRSgweDEzNzEsIDB4MDAxNCksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDVfMjk1OCkgfSwKIAkvKiBDTmV0IENOVVNCLTYxMUcgKi8KLQl7VVNCX0RFVklDRSgweDEzNzEsIDB4MDAxMyksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDVfMjk1OCl9LAorCXsgVVNCX0RFVklDRSgweDEzNzEsIDB4MDAxMyksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDVfMjk1OCkgfSwKIAkvKiBMaW5rc3lzIFdVU0IxMSB2Mi44ICovCi0Je1VTQl9ERVZJQ0UoMHgxOTE1LCAweDIyMzMpLCBVU0JfREVWSUNFX0RBVEEoQk9BUkRfNTA1XzI5NTgpfSwKKwl7IFVTQl9ERVZJQ0UoMHgxOTE1LCAweDIyMzMpLCBVU0JfREVWSUNFX0RBVEEoQk9BUkRfNTA1XzI5NTgpIH0sCiAJLyogWHRlcmFzeXMgWE4tMjEyMkIsIElCbGl0enogQldVNjEzQi9CV1U2MTNTQiAqLwotCXtVU0JfREVWSUNFKDB4MTJmZCwgMHgxMDAxKSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwNV8yOTU4KX0sCisJeyBVU0JfREVWSUNFKDB4MTJmZCwgMHgxMDAxKSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwNV8yOTU4KSB9LAogCS8qIENvcmVnYSBXTEFOIFVTQiBTdGljayAxMSAqLwotCXtVU0JfREVWSUNFKDB4MDdhYSwgMHg3NjEzKSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwNV8yOTU4KX0sCisJeyBVU0JfREVWSUNFKDB4MDdhYSwgMHg3NjEzKSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwNV8yOTU4KSB9LAogCS8qIE1pY3Jvc3RhciBNU0kgQm94IE1TNjk3OCAqLwotCXtVU0JfREVWSUNFKDB4MGRiMCwgMHgxMDIwKSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwNV8yOTU4KX0sCisJeyBVU0JfREVWSUNFKDB4MGRiMCwgMHgxMDIwKSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwNV8yOTU4KSB9LAogCS8qCiAJICogYXQ3NmM1MDVhLXJmbWQyOTU4CiAJICovCiAJLyogR2VuZXJpYyBBVDc2QzUwNUEgZGV2aWNlICovCi0Je1VTQl9ERVZJQ0UoMHgwM2ViLCAweDc2MTQpLCBVU0JfREVWSUNFX0RBVEEoQk9BUkRfNTA1QSl9LAorCXsgVVNCX0RFVklDRSgweDAzZWIsIDB4NzYxNCksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDVBKSB9LAogCS8qIEdlbmVyaWMgQVQ3NkM1MDVBUyBkZXZpY2UgKi8KLQl7VVNCX0RFVklDRSgweDAzZWIsIDB4NzYxNyksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDVBKX0sCisJeyBVU0JfREVWSUNFKDB4MDNlYiwgMHg3NjE3KSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwNUEpIH0sCiAJLyogU2llbWVucyBHaWdhc2V0IFVTQiBXTEFOIEFkYXB0ZXIgMTEgKi8KLQl7VVNCX0RFVklDRSgweDE2OTAsIDB4MDcwMSksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDVBKX0sCisJeyBVU0JfREVWSUNFKDB4MTY5MCwgMHgwNzAxKSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwNUEpIH0sCiAJLyoKIAkgKiBhdDc2YzUwNWFteC1yZm1kCiAJICovCiAJLyogR2VuZXJpYyBBVDc2QzUwNUFNWCBkZXZpY2UgKi8KLQl7VVNCX0RFVklDRSgweDAzZWIsIDB4NzYxNSksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDVBTVgpfSwKLQl7fQorCXsgVVNCX0RFVklDRSgweDAzZWIsIDB4NzYxNSksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDVBTVgpIH0sCisJeyB9CiB9OwogCiBNT0RVTEVfREVWSUNFX1RBQkxFKHVzYiwgZGV2X3RhYmxlKTsKQEAgLTI0NCwyNiArMjY0LDggQEAKIC8qIFN1cHBvcnRlZCByYXRlcyBvZiB0aGlzIGhhcmR3YXJlLCBiaXQgNyBtYXJrcyBiYXNpYyByYXRlcyAqLwogc3RhdGljIGNvbnN0IHU4IGh3X3JhdGVzW10gPSB7IDB4ODIsIDB4ODQsIDB4MGIsIDB4MTYgfTsKIAotLyogRnJlcXVlbmN5IG9mIGVhY2ggY2hhbm5lbCBpbiBNSHogKi8KLXN0YXRpYyBjb25zdCBsb25nIGNoYW5uZWxfZnJlcXVlbmN5W10gPSB7Ci0JMjQxMiwgMjQxNywgMjQyMiwgMjQyNywgMjQzMiwgMjQzNywgMjQ0MiwKLQkyNDQ3LCAyNDUyLCAyNDU3LCAyNDYyLCAyNDY3LCAyNDcyLCAyNDg0Ci19OwotCi0jZGVmaW5lIE5VTV9DSEFOTkVMUyBBUlJBWV9TSVpFKGNoYW5uZWxfZnJlcXVlbmN5KQotCiBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgcHJlYW1ibGVzW10gPSB7ICJsb25nIiwgInNob3J0IiwgImF1dG8iIH07CiAKLXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBtYWNfc3RhdGVzW10gPSB7Ci0JW01BQ19JTklUXSA9ICJJTklUIiwKLQlbTUFDX1NDQU5OSU5HXSA9ICJTQ0FOTklORyIsCi0JW01BQ19BVVRIXSA9ICJBVVRIIiwKLQlbTUFDX0FTU09DXSA9ICJBU1NPQyIsCi0JW01BQ19KT0lOSU5HXSA9ICJKT0lOSU5HIiwKLQlbTUFDX0NPTk5FQ1RFRF0gPSAiQ09OTkVDVEVEIiwKLQlbTUFDX09XTl9JQlNTXSA9ICJPV05fSUJTUyIKLX07Ci0KIC8qIEZpcm13YXJlIGRvd25sb2FkICovCiAvKiBERlUgc3RhdGVzICovCiAjZGVmaW5lIFNUQVRFX0lETEUJCQkweDAwCkBAIC0yOTgsMTcgKzMwMCwzMCBAQAogCiBzdGF0aWMgaW5saW5lIGludCBhdDc2X2lzX2ludGVyc2lsKGVudW0gYm9hcmRfdHlwZSBib2FyZCkKIHsKLQlyZXR1cm4gKGJvYXJkID09IEJPQVJEXzUwM19JU0wzODYxIHx8IGJvYXJkID09IEJPQVJEXzUwM19JU0wzODYzKTsKKwlpZiAoYm9hcmQgPT0gQk9BUkRfNTAzX0lTTDM4NjEgfHwgYm9hcmQgPT0gQk9BUkRfNTAzX0lTTDM4NjMpCisJCXJldHVybiAxOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW5saW5lIGludCBhdDc2X2lzXzUwM3JmbWQoZW51bSBib2FyZF90eXBlIGJvYXJkKQogewotCXJldHVybiAoYm9hcmQgPT0gQk9BUkRfNTAzIHx8IGJvYXJkID09IEJPQVJEXzUwM19BQ0MpOworCWlmIChib2FyZCA9PSBCT0FSRF81MDMgfHwgYm9hcmQgPT0gQk9BUkRfNTAzX0FDQykKKwkJcmV0dXJuIDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGF0NzZfaXNfNTA1KGVudW0gYm9hcmRfdHlwZSBib2FyZCkKK3sKKwlpZiAoYm9hcmQgPT0gQk9BUkRfNTA1IHx8IGJvYXJkID09IEJPQVJEXzUwNV8yOTU4KQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgYXQ3Nl9pc181MDVhKGVudW0gYm9hcmRfdHlwZSBib2FyZCkKIHsKLQlyZXR1cm4gKGJvYXJkID09IEJPQVJEXzUwNUEgfHwgYm9hcmQgPT0gQk9BUkRfNTA1QU1YKTsKKwlpZiAoYm9hcmQgPT0gQk9BUkRfNTA1QSB8fCBib2FyZCA9PSBCT0FSRF81MDVBTVgpCisJCXJldHVybiAxOworCXJldHVybiAwOwogfQogCiAvKiBMb2FkIGEgYmxvY2sgb2YgdGhlIGZpcnN0IChpbnRlcm5hbCkgcGFydCBvZiB0aGUgZmlybXdhcmUgKi8KQEAgLTQ4OSw0MSArNTA0LDYgQEAKIAlyZXR1cm4gcmV0OwogfQogCi0vKiBSZXBvcnQgdGhhdCB0aGUgc2NhbiByZXN1bHRzIGFyZSByZWFkeSAqLwotc3RhdGljIGlubGluZSB2b2lkIGF0NzZfaXdldmVudF9zY2FuX2NvbXBsZXRlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCi17Ci0JdW5pb24gaXdyZXFfZGF0YSB3cnF1OwotCXdycXUuZGF0YS5sZW5ndGggPSAwOwotCXdycXUuZGF0YS5mbGFncyA9IDA7Ci0Jd2lyZWxlc3Nfc2VuZF9ldmVudChuZXRkZXYsIFNJT0NHSVdTQ0FOLCAmd3JxdSwgTlVMTCk7Ci0JYXQ3Nl9kYmcoREJHX1dFX0VWRU5UUywgIiVzOiBTSU9DR0lXU0NBTiBzZW50IiwgbmV0ZGV2LT5uYW1lKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGF0NzZfaXdldmVudF9ic3NfY29ubmVjdChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAotCQkJCQkgICAgdTggKmJzc2lkKQotewotCXVuaW9uIGl3cmVxX2RhdGEgd3JxdTsKLQl3cnF1LmRhdGEubGVuZ3RoID0gMDsKLQl3cnF1LmRhdGEuZmxhZ3MgPSAwOwotCW1lbWNweSh3cnF1LmFwX2FkZHIuc2FfZGF0YSwgYnNzaWQsIEVUSF9BTEVOKTsKLQl3cnF1LmFwX2FkZHIuc2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOwotCXdpcmVsZXNzX3NlbmRfZXZlbnQobmV0ZGV2LCBTSU9DR0lXQVAsICZ3cnF1LCBOVUxMKTsKLQlhdDc2X2RiZyhEQkdfV0VfRVZFTlRTLCAiJXM6ICVzOiBTSU9DR0lXQVAgc2VudCIsIG5ldGRldi0+bmFtZSwKLQkJIF9fZnVuY19fKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGF0NzZfaXdldmVudF9ic3NfZGlzY29ubmVjdChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQotewotCXVuaW9uIGl3cmVxX2RhdGEgd3JxdTsKLQl3cnF1LmRhdGEubGVuZ3RoID0gMDsKLQl3cnF1LmRhdGEuZmxhZ3MgPSAwOwotCW1lbXNldCh3cnF1LmFwX2FkZHIuc2FfZGF0YSwgMCwgRVRIX0FMRU4pOwotCXdycXUuYXBfYWRkci5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7Ci0Jd2lyZWxlc3Nfc2VuZF9ldmVudChuZXRkZXYsIFNJT0NHSVdBUCwgJndycXUsIE5VTEwpOwotCWF0NzZfZGJnKERCR19XRV9FVkVOVFMsICIlczogJXM6IFNJT0NHSVdBUCBzZW50IiwgbmV0ZGV2LT5uYW1lLAotCQkgX19mdW5jX18pOwotfQotCiAjZGVmaW5lIEhFWDJTVFJfQlVGRkVSUyA0CiAjZGVmaW5lIEhFWDJTVFJfTUFYX0xFTiA2NAogI2RlZmluZSBCSU4ySEVYKHgpICgoeCkgPCAxMCA/ICcwJyArICh4KSA6ICh4KSArICdBJyAtIDEwKQpAQCAtNTk1LDM3ICs1NzUsNiBAQAogCQltb2RfdGltZXIoJmxlZHRyaWdfdHhfdGltZXIsIGppZmZpZXMgKyBIWiAvIDQpOwogfQogCi0vKiBDaGVjayBpZiB0aGUgZ2l2ZW4gc3NpZCBpcyBoaWRkZW4gKi8KLXN0YXRpYyBpbmxpbmUgaW50IGF0NzZfaXNfaGlkZGVuX3NzaWQodTggKnNzaWQsIGludCBsZW5ndGgpCi17Ci0Jc3RhdGljIGNvbnN0IHU4IHplcm9zWzMyXTsKLQotCWlmIChsZW5ndGggPT0gMCkKLQkJcmV0dXJuIDE7Ci0KLQlpZiAobGVuZ3RoID09IDEgJiYgc3NpZFswXSA9PSAnICcpCi0JCXJldHVybiAxOwotCi0JcmV0dXJuIChtZW1jbXAoc3NpZCwgemVyb3MsIGxlbmd0aCkgPT0gMCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBhdDc2X2ZyZWVfYnNzX2xpc3Qoc3RydWN0IGF0NzZfcHJpdiAqcHJpdikKLXsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpuZXh0LCAqcHRyOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+YnNzX2xpc3Rfc3BpbmxvY2ssIGZsYWdzKTsKLQotCXByaXYtPmN1cnJfYnNzID0gTlVMTDsKLQotCWxpc3RfZm9yX2VhY2hfc2FmZShwdHIsIG5leHQsICZwcml2LT5ic3NfbGlzdCkgewotCQlsaXN0X2RlbChwdHIpOwotCQlrZnJlZShsaXN0X2VudHJ5KHB0ciwgc3RydWN0IGJzc19pbmZvLCBsaXN0KSk7Ci0JfQotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+YnNzX2xpc3Rfc3BpbmxvY2ssIGZsYWdzKTsKLX0KLQogc3RhdGljIGludCBhdDc2X3JlbWFwKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2KQogewogCWludCByZXQ7CkBAIC02NDEsMTggKzU5MCwyNSBAQAogc3RhdGljIGludCBhdDc2X2dldF9vcF9tb2RlKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2KQogewogCWludCByZXQ7Ci0JdTggb3BfbW9kZTsKKwl1OCBzYXZlZDsKKwl1OCAqb3BfbW9kZTsKIAorCW9wX21vZGUgPSBrbWFsbG9jKDEsIEdGUF9OT0lPKTsKKwlpZiAoIW9wX21vZGUpCisJCXJldHVybiAtRU5PTUVNOwogCXJldCA9IHVzYl9jb250cm9sX21zZyh1ZGV2LCB1c2JfcmN2Y3RybHBpcGUodWRldiwgMCksIDB4MzMsCiAJCQkgICAgICBVU0JfVFlQRV9WRU5ET1IgfCBVU0JfRElSX0lOIHwKIAkJCSAgICAgIFVTQl9SRUNJUF9JTlRFUkZBQ0UsIDB4MDEsIDAsICZvcF9tb2RlLCAxLAogCQkJICAgICAgVVNCX0NUUkxfR0VUX1RJTUVPVVQpOworCXNhdmVkID0gKm9wX21vZGU7CisJa2ZyZWUob3BfbW9kZSk7CisKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIAllbHNlIGlmIChyZXQgPCAxKQogCQlyZXR1cm4gLUVJTzsKIAllbHNlCi0JCXJldHVybiBvcF9tb2RlOworCQlyZXR1cm4gc2F2ZWQ7CiB9CiAKIC8qIExvYWQgYSBibG9jayBvZiB0aGUgc2Vjb25kICgiZXh0ZXJuYWwiKSBwYXJ0IG9mIHRoZSBmaXJtd2FyZSAqLwpAQCAtNzIwLDcgKzY3Niw3IEBACiAJa2ZyZWUoaHdjZmcpOwogCWlmIChyZXQgPCAwKQogCQlwcmludGsoS0VSTl9FUlIgIiVzOiBjYW5ub3QgZ2V0IEhXIENvbmZpZyAoZXJyb3IgJWQpXG4iLAotCQkgICAgICAgcHJpdi0+bmV0ZGV2LT5uYW1lLCByZXQpOworCQkgICAgICAgd2lwaHlfbmFtZShwcml2LT5ody0+d2lwaHkpLCByZXQpOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTcyOSwxNSArNjg1LDE1IEBACiB7CiAJaW50IGk7CiAJc3RhdGljIHN0cnVjdCByZWdfZG9tYWluIGNvbnN0IGZkX3RhYltdID0gewotCQl7MHgxMCwgIkZDQyAoVVNBKSIsIDB4N2ZmfSwJLyogY2ggMS0xMSAqLwotCQl7MHgyMCwgIklDIChDYW5hZGEpIiwgMHg3ZmZ9LAkvKiBjaCAxLTExICovCi0JCXsweDMwLCAiRVRTSSAobW9zdCBvZiBFdXJvcGUpIiwgMHgxZmZmfSwJLyogY2ggMS0xMyAqLwotCQl7MHgzMSwgIlNwYWluIiwgMHg2MDB9LAkvKiBjaCAxMC0xMSAqLwotCQl7MHgzMiwgIkZyYW5jZSIsIDB4MWUwMH0sCS8qIGNoIDEwLTEzICovCi0JCXsweDQwLCAiTUtLIChKYXBhbikiLCAweDIwMDB9LAkvKiBjaCAxNCAqLwotCQl7MHg0MSwgIk1LSzEgKEphcGFuKSIsIDB4M2ZmZn0sCS8qIGNoIDEtMTQgKi8KLQkJezB4NTAsICJJc3JhZWwiLCAweDNmY30sCS8qIGNoIDMtOSAqLwotCQl7MHgwMCwgIjx1bmtub3duPiIsIDB4ZmZmZmZmZmZ9CS8qIGNoIDEtMzIgKi8KKwkJeyAweDEwLCAiRkNDIChVU0EpIiwgMHg3ZmYgfSwJLyogY2ggMS0xMSAqLworCQl7IDB4MjAsICJJQyAoQ2FuYWRhKSIsIDB4N2ZmIH0sCS8qIGNoIDEtMTEgKi8KKwkJeyAweDMwLCAiRVRTSSAobW9zdCBvZiBFdXJvcGUpIiwgMHgxZmZmIH0sCS8qIGNoIDEtMTMgKi8KKwkJeyAweDMxLCAiU3BhaW4iLCAweDYwMCB9LAkvKiBjaCAxMC0xMSAqLworCQl7IDB4MzIsICJGcmFuY2UiLCAweDFlMDAgfSwJLyogY2ggMTAtMTMgKi8KKwkJeyAweDQwLCAiTUtLIChKYXBhbikiLCAweDIwMDAgfSwJLyogY2ggMTQgKi8KKwkJeyAweDQxLCAiTUtLMSAoSmFwYW4pIiwgMHgzZmZmIH0sCS8qIGNoIDEtMTQgKi8KKwkJeyAweDUwLCAiSXNyYWVsIiwgMHgzZmMgfSwJLyogY2ggMy05ICovCisJCXsgMHgwMCwgIjx1bmtub3duPiIsIDB4ZmZmZmZmZmYgfQkvKiBjaCAxLTMyICovCiAJfTsKIAogCS8qIExhc3QgZW50cnkgaXMgZmFsbGJhY2sgZm9yIHVua25vd24gZG9tYWluIGNvZGUgKi8KQEAgLTc2NSwyMCArNzIxLDQzIEBACiAvKiBSZXR1cm4gcG9zaXRpdmUgbnVtYmVyIGZvciBzdGF0dXMsIG5lZ2F0aXZlIGZvciBhbiBlcnJvciAqLwogc3RhdGljIGlubGluZSBpbnQgYXQ3Nl9nZXRfY21kX3N0YXR1cyhzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiwgdTggY21kKQogewotCXU4IHN0YXRfYnVmWzQwXTsKKwl1OCAqc3RhdF9idWY7CiAJaW50IHJldDsKIAorCXN0YXRfYnVmID0ga21hbGxvYyg0MCwgR0ZQX05PSU8pOworCWlmICghc3RhdF9idWYpCisJCXJldHVybiAtRU5PTUVNOworCiAJcmV0ID0gdXNiX2NvbnRyb2xfbXNnKHVkZXYsIHVzYl9yY3ZjdHJscGlwZSh1ZGV2LCAwKSwgMHgyMiwKIAkJCSAgICAgIFVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9ESVJfSU4gfAogCQkJICAgICAgVVNCX1JFQ0lQX0lOVEVSRkFDRSwgY21kLCAwLCBzdGF0X2J1ZiwKIAkJCSAgICAgIHNpemVvZihzdGF0X2J1ZiksIFVTQl9DVFJMX0dFVF9USU1FT1VUKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKKwlpZiAocmV0ID49IDApCisJCXJldCA9IHN0YXRfYnVmWzVdOworCWtmcmVlKHN0YXRfYnVmKTsKIAotCXJldHVybiBzdGF0X2J1Zls1XTsKKwlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IGF0NzZfc2V0X2NhcmRfY29tbWFuZChzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiwgaW50IGNtZCwgdm9pZCAqYnVmLAorI2RlZmluZSBNQUtFX0NNRF9DQVNFKGMpIGNhc2UgKGMpOiByZXR1cm4gI2MKKworc3RhdGljIGNvbnN0IGNoYXIgKmF0NzZfZ2V0X2NtZF9zdHJpbmcodTggY21kX3N0YXR1cykKK3sKKwlzd2l0Y2ggKGNtZF9zdGF0dXMpIHsKKwkJTUFLRV9DTURfQ0FTRShDTURfU0VUX01JQik7CisJCU1BS0VfQ01EX0NBU0UoQ01EX0dFVF9NSUIpOworCQlNQUtFX0NNRF9DQVNFKENNRF9TQ0FOKTsKKwkJTUFLRV9DTURfQ0FTRShDTURfSk9JTik7CisJCU1BS0VfQ01EX0NBU0UoQ01EX1NUQVJUX0lCU1MpOworCQlNQUtFX0NNRF9DQVNFKENNRF9SQURJT19PTik7CisJCU1BS0VfQ01EX0NBU0UoQ01EX1JBRElPX09GRik7CisJCU1BS0VfQ01EX0NBU0UoQ01EX1NUQVJUVVApOworCX0KKworCXJldHVybiAiVU5LTk9XTiI7Cit9CisKK3N0YXRpYyBpbnQgYXQ3Nl9zZXRfY2FyZF9jb21tYW5kKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2LCB1OCBjbWQsIHZvaWQgKmJ1ZiwKIAkJCQkgaW50IGJ1Zl9zaXplKQogewogCWludCByZXQ7CkBAIC03OTMsNiArNzcyLDEwIEBACiAJY21kX2J1Zi0+c2l6ZSA9IGNwdV90b19sZTE2KGJ1Zl9zaXplKTsKIAltZW1jcHkoY21kX2J1Zi0+ZGF0YSwgYnVmLCBidWZfc2l6ZSk7CiAKKwlhdDc2X2RiZ19kdW1wKERCR19DTUQsIGNtZF9idWYsIHNpemVvZihzdHJ1Y3QgYXQ3Nl9jb21tYW5kKSArIGJ1Zl9zaXplLAorCQkgICAgICAiaXNzdWluZyBjb21tYW5kICVzICgweCUwMngpIiwKKwkJICAgICAgYXQ3Nl9nZXRfY21kX3N0cmluZyhjbWQpLCBjbWQpOworCiAJcmV0ID0gdXNiX2NvbnRyb2xfbXNnKHVkZXYsIHVzYl9zbmRjdHJscGlwZSh1ZGV2LCAwKSwgMHgwZSwKIAkJCSAgICAgIFVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9ESVJfT1VUIHwgVVNCX1JFQ0lQX0RFVklDRSwKIAkJCSAgICAgIDAsIDAsIGNtZF9idWYsCkBAIC04MzAsMTMgKzgxMywxMyBAQAogCQlzdGF0dXMgPSBhdDc2X2dldF9jbWRfc3RhdHVzKHByaXYtPnVkZXYsIGNtZCk7CiAJCWlmIChzdGF0dXMgPCAwKSB7CiAJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBhdDc2X2dldF9jbWRfc3RhdHVzIGZhaWxlZDogJWRcbiIsCi0JCQkgICAgICAgcHJpdi0+bmV0ZGV2LT5uYW1lLCBzdGF0dXMpOworCQkJICAgICAgIHdpcGh5X25hbWUocHJpdi0+aHctPndpcGh5KSwgc3RhdHVzKTsKIAkJCWJyZWFrOwogCQl9CiAKIAkJYXQ3Nl9kYmcoREJHX1dBSVRfQ09NUExFVEUsCiAJCQkgIiVzOiBXYWl0aW5nIG9uIGNtZCAlZCwgc3RhdHVzID0gJWQgKCVzKSIsCi0JCQkgcHJpdi0+bmV0ZGV2LT5uYW1lLCBjbWQsIHN0YXR1cywKKwkJCSB3aXBoeV9uYW1lKHByaXYtPmh3LT53aXBoeSksIGNtZCwgc3RhdHVzLAogCQkJIGF0NzZfZ2V0X2NtZF9zdGF0dXNfc3RyaW5nKHN0YXR1cykpOwogCiAJCWlmIChzdGF0dXMgIT0gQ01EX1NUQVRVU19JTl9QUk9HUkVTUwpAQCAtODQ3LDcgKzgzMCw3IEBACiAJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpKSB7CiAJCQlwcmludGsoS0VSTl9FUlIKIAkJCSAgICAgICAiJXM6IGNvbXBsZXRpb24gdGltZW91dCBmb3IgY29tbWFuZCAlZFxuIiwKLQkJCSAgICAgICBwcml2LT5uZXRkZXYtPm5hbWUsIGNtZCk7CisJCQkgICAgICAgd2lwaHlfbmFtZShwcml2LT5ody0+d2lwaHkpLCBjbWQpOwogCQkJc3RhdHVzID0gLUVUSU1FRE9VVDsKIAkJCWJyZWFrOwogCQl9CkBAIC04NzAsNyArODUzLDcgQEAKIAlpZiAocmV0ICE9IENNRF9TVEFUVVNfQ09NUExFVEUpIHsKIAkJcHJpbnRrKEtFUk5fSU5GTwogCQkgICAgICAgIiVzOiBzZXRfbWliOiBhdDc2X3dhaXRfY29tcGxldGlvbiBmYWlsZWQgIgotCQkgICAgICAgIndpdGggJWRcbiIsIHByaXYtPm5ldGRldi0+bmFtZSwgcmV0KTsKKwkJICAgICAgICJ3aXRoICVkXG4iLCB3aXBoeV9uYW1lKHByaXYtPmh3LT53aXBoeSksIHJldCk7CiAJCXJldCA9IC1FSU87CiAJfQogCkBAIC04OTEsNyArODc0LDcgQEAKIAlyZXQgPSBhdDc2X3NldF9jYXJkX2NvbW1hbmQocHJpdi0+dWRldiwgY21kLCBOVUxMLCAwKTsKIAlpZiAocmV0IDwgMCkKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogYXQ3Nl9zZXRfY2FyZF9jb21tYW5kKCVkKSBmYWlsZWQ6ICVkXG4iLAotCQkgICAgICAgcHJpdi0+bmV0ZGV2LT5uYW1lLCBjbWQsIHJldCk7CisJCSAgICAgICB3aXBoeV9uYW1lKHByaXYtPmh3LT53aXBoeSksIGNtZCwgcmV0KTsKIAllbHNlCiAJCXJldCA9IDE7CiAKQEAgLTkxMiw0NCArODk1LDcgQEAKIAlyZXQgPSBhdDc2X3NldF9taWIocHJpdiwgJnByaXYtPm1pYl9idWYpOwogCWlmIChyZXQgPCAwKQogCQlwcmludGsoS0VSTl9FUlIgIiVzOiBzZXRfbWliIChwbV9tb2RlKSBmYWlsZWQ6ICVkXG4iLAotCQkgICAgICAgcHJpdi0+bmV0ZGV2LT5uYW1lLCByZXQpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotLyogU2V0IHRoZSBhc3NvY2lhdGlvbiBpZCBmb3IgcG93ZXIgc2F2ZSBtb2RlICovCi1zdGF0aWMgaW50IGF0NzZfc2V0X2Fzc29jaWQoc3RydWN0IGF0NzZfcHJpdiAqcHJpdiwgdTE2IGlkKQotewotCWludCByZXQgPSAwOwotCi0JcHJpdi0+bWliX2J1Zi50eXBlID0gTUlCX01BQ19NR01UOwotCXByaXYtPm1pYl9idWYuc2l6ZSA9IDI7Ci0JcHJpdi0+bWliX2J1Zi5pbmRleCA9IG9mZnNldG9mKHN0cnVjdCBtaWJfbWFjX21nbXQsIHN0YXRpb25faWQpOwotCXByaXYtPm1pYl9idWYuZGF0YS53b3JkID0gY3B1X3RvX2xlMTYoaWQpOwotCi0JcmV0ID0gYXQ3Nl9zZXRfbWliKHByaXYsICZwcml2LT5taWJfYnVmKTsKLQlpZiAocmV0IDwgMCkKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogc2V0X21pYiAoYXNzb2NpZCkgZmFpbGVkOiAlZFxuIiwKLQkJICAgICAgIHByaXYtPm5ldGRldi0+bmFtZSwgcmV0KTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLS8qIFNldCB0aGUgbGlzdGVuIGludGVydmFsIGZvciBwb3dlciBzYXZlIG1vZGUgKi8KLXN0YXRpYyBpbnQgYXQ3Nl9zZXRfbGlzdGVuX2ludGVydmFsKHN0cnVjdCBhdDc2X3ByaXYgKnByaXYsIHUxNiBpbnRlcnZhbCkKLXsKLQlpbnQgcmV0ID0gMDsKLQotCXByaXYtPm1pYl9idWYudHlwZSA9IE1JQl9NQUM7Ci0JcHJpdi0+bWliX2J1Zi5zaXplID0gMjsKLQlwcml2LT5taWJfYnVmLmluZGV4ID0gb2Zmc2V0b2Yoc3RydWN0IG1pYl9tYWMsIGxpc3Rlbl9pbnRlcnZhbCk7Ci0JcHJpdi0+bWliX2J1Zi5kYXRhLndvcmQgPSBjcHVfdG9fbGUxNihpbnRlcnZhbCk7Ci0KLQlyZXQgPSBhdDc2X3NldF9taWIocHJpdiwgJnByaXYtPm1pYl9idWYpOwotCWlmIChyZXQgPCAwKQotCQlwcmludGsoS0VSTl9FUlIKLQkJICAgICAgICIlczogc2V0X21pYiAobGlzdGVuX2ludGVydmFsKSBmYWlsZWQ6ICVkXG4iLAotCQkgICAgICAgcHJpdi0+bmV0ZGV2LT5uYW1lLCByZXQpOworCQkgICAgICAgd2lwaHlfbmFtZShwcml2LT5ody0+d2lwaHkpLCByZXQpOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTk2Niw3ICs5MTIsNyBAQAogCXJldCA9IGF0NzZfc2V0X21pYihwcml2LCAmcHJpdi0+bWliX2J1Zik7CiAJaWYgKHJldCA8IDApCiAJCXByaW50ayhLRVJOX0VSUiAiJXM6IHNldF9taWIgKHByZWFtYmxlKSBmYWlsZWQ6ICVkXG4iLAotCQkgICAgICAgcHJpdi0+bmV0ZGV2LT5uYW1lLCByZXQpOworCQkgICAgICAgd2lwaHlfbmFtZShwcml2LT5ody0+d2lwaHkpLCByZXQpOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTk4Myw3ICs5MjksNyBAQAogCXJldCA9IGF0NzZfc2V0X21pYihwcml2LCAmcHJpdi0+bWliX2J1Zik7CiAJaWYgKHJldCA8IDApCiAJCXByaW50ayhLRVJOX0VSUiAiJXM6IHNldF9taWIgKGZyYWcgdGhyZXNob2xkKSBmYWlsZWQ6ICVkXG4iLAotCQkgICAgICAgcHJpdi0+bmV0ZGV2LT5uYW1lLCByZXQpOworCQkgICAgICAgd2lwaHlfbmFtZShwcml2LT5ody0+d2lwaHkpLCByZXQpOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTEwMDAsNyArOTQ2LDcgQEAKIAlyZXQgPSBhdDc2X3NldF9taWIocHJpdiwgJnByaXYtPm1pYl9idWYpOwogCWlmIChyZXQgPCAwKQogCQlwcmludGsoS0VSTl9FUlIgIiVzOiBzZXRfbWliIChydHMpIGZhaWxlZDogJWRcbiIsCi0JCSAgICAgICBwcml2LT5uZXRkZXYtPm5hbWUsIHJldCk7CisJCSAgICAgICB3aXBoeV9uYW1lKHByaXYtPmh3LT53aXBoeSksIHJldCk7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtMTAxNywyNCArOTYzLDQxIEBACiAJcmV0ID0gYXQ3Nl9zZXRfbWliKHByaXYsICZwcml2LT5taWJfYnVmKTsKIAlpZiAocmV0IDwgMCkKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogc2V0X21pYiAoYXV0b3JhdGUgZmFsbGJhY2spIGZhaWxlZDogJWRcbiIsCi0JCSAgICAgICBwcml2LT5uZXRkZXYtPm5hbWUsIHJldCk7CisJCSAgICAgICB3aXBoeV9uYW1lKHByaXYtPmh3LT53aXBoeSksIHJldCk7CiAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IGF0NzZfYWRkX21hY19hZGRyZXNzKHN0cnVjdCBhdDc2X3ByaXYgKnByaXYsIHZvaWQgKmFkZHIpCitzdGF0aWMgaW50IGF0NzZfc2V0X3RraXBfYnNzaWQoc3RydWN0IGF0NzZfcHJpdiAqcHJpdiwgY29uc3Qgdm9pZCAqYWRkcikKIHsKIAlpbnQgcmV0ID0gMDsKIAotCXByaXYtPm1pYl9idWYudHlwZSA9IE1JQl9NQUNfQUREUjsKKwlwcml2LT5taWJfYnVmLnR5cGUgPSBNSUJfTUFDX0VOQ1JZUFRJT047CiAJcHJpdi0+bWliX2J1Zi5zaXplID0gRVRIX0FMRU47Ci0JcHJpdi0+bWliX2J1Zi5pbmRleCA9IG9mZnNldG9mKHN0cnVjdCBtaWJfbWFjX2FkZHIsIG1hY19hZGRyKTsKKwlwcml2LT5taWJfYnVmLmluZGV4ID0gb2Zmc2V0b2Yoc3RydWN0IG1pYl9tYWNfZW5jcnlwdGlvbiwgdGtpcF9ic3NpZCk7CiAJbWVtY3B5KHByaXYtPm1pYl9idWYuZGF0YS5hZGRyLCBhZGRyLCBFVEhfQUxFTik7CiAKIAlyZXQgPSBhdDc2X3NldF9taWIocHJpdiwgJnByaXYtPm1pYl9idWYpOwogCWlmIChyZXQgPCAwKQotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBzZXRfbWliIChNQUNfQUREUiwgbWFjX2FkZHIpIGZhaWxlZDogJWRcbiIsCi0JCSAgICAgICBwcml2LT5uZXRkZXYtPm5hbWUsIHJldCk7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IHNldF9taWIgKE1BQ19FTkNSWVBUSU9OLCB0a2lwX2Jzc2lkKSBmYWlsZWQ6ICVkXG4iLAorCQkgICAgICAgd2lwaHlfbmFtZShwcml2LT5ody0+d2lwaHkpLCByZXQpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhdDc2X3Jlc2V0X3JzYyhzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2KQoreworCWludCByZXQgPSAwOworCisJcHJpdi0+bWliX2J1Zi50eXBlID0gTUlCX01BQ19FTkNSWVBUSU9OOworCXByaXYtPm1pYl9idWYuc2l6ZSA9IDQgKiA4OworCXByaXYtPm1pYl9idWYuaW5kZXggPSBvZmZzZXRvZihzdHJ1Y3QgbWliX21hY19lbmNyeXB0aW9uLCBrZXlfcnNjKTsKKwltZW1zZXQocHJpdi0+bWliX2J1Zi5kYXRhLmRhdGEsIDAgLCBwcml2LT5taWJfYnVmLnNpemUpOworCisJcmV0ID0gYXQ3Nl9zZXRfbWliKHByaXYsICZwcml2LT5taWJfYnVmKTsKKwlpZiAocmV0IDwgMCkKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogc2V0X21pYiAoTUFDX0VOQ1JZUFRJT04sIGtleV9yc2MpIGZhaWxlZDogJWRcbiIsCisJCSAgICAgICB3aXBoeV9uYW1lKHByaXYtPmh3LT53aXBoeSksIHJldCk7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtMTA1MywxNiArMTAxNiwxNiBAQAogCQkJICAgc2l6ZW9mKHN0cnVjdCBtaWJfbWFjX2FkZHIpKTsKIAlpZiAocmV0IDwgMCkgewogCQlwcmludGsoS0VSTl9FUlIgIiVzOiBhdDc2X2dldF9taWIgKE1BQ19BRERSKSBmYWlsZWQ6ICVkXG4iLAotCQkgICAgICAgcHJpdi0+bmV0ZGV2LT5uYW1lLCByZXQpOworCQkgICAgICAgd2lwaHlfbmFtZShwcml2LT5ody0+d2lwaHkpLCByZXQpOwogCQlnb3RvIGV4aXQ7CiAJfQogCiAJYXQ3Nl9kYmcoREJHX01JQiwgIiVzOiBNSUIgTUFDX0FERFI6IG1hY19hZGRyICVzIHJlcyAweCV4IDB4JXgiLAotCQkgcHJpdi0+bmV0ZGV2LT5uYW1lLAorCQkgd2lwaHlfbmFtZShwcml2LT5ody0+d2lwaHkpLAogCQkgbWFjMnN0cihtLT5tYWNfYWRkciksIG0tPnJlc1swXSwgbS0+cmVzWzFdKTsKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShtLT5ncm91cF9hZGRyKTsgaSsrKQogCQlhdDc2X2RiZyhEQkdfTUlCLCAiJXM6IE1JQiBNQUNfQUREUjogZ3JvdXAgYWRkciAlZDogJXMsICIKLQkJCSAic3RhdHVzICVkIiwgcHJpdi0+bmV0ZGV2LT5uYW1lLCBpLAorCQkJICJzdGF0dXMgJWQiLCB3aXBoeV9uYW1lKHByaXYtPmh3LT53aXBoeSksIGksCiAJCQkgbWFjMnN0cihtLT5ncm91cF9hZGRyW2ldKSwgbS0+Z3JvdXBfYWRkcl9zdGF0dXNbaV0pOwogZXhpdDoKIAlrZnJlZShtKTsKQEAgLTEwODIsMTMgKzEwNDUsMTMgQEAKIAkJCSAgIHNpemVvZihzdHJ1Y3QgbWliX21hY193ZXApKTsKIAlpZiAocmV0IDwgMCkgewogCQlwcmludGsoS0VSTl9FUlIgIiVzOiBhdDc2X2dldF9taWIgKE1BQ19XRVApIGZhaWxlZDogJWRcbiIsCi0JCSAgICAgICBwcml2LT5uZXRkZXYtPm5hbWUsIHJldCk7CisJCSAgICAgICB3aXBoeV9uYW1lKHByaXYtPmh3LT53aXBoeSksIHJldCk7CiAJCWdvdG8gZXhpdDsKIAl9CiAKIAlhdDc2X2RiZyhEQkdfTUlCLCAiJXM6IE1JQiBNQUNfV0VQOiBwcml2X2ludm9rZWQgJXUgZGVmX2tleV9pZCAldSAiCiAJCSAia2V5X2xlbiAldSBleGNsX3VuZW5jciAldSB3ZXBfaWN2X2VyciAldSB3ZXBfZXhjbHVkZWQgJXUgIgotCQkgImVuY3JfbGV2ZWwgJXUga2V5ICVkIiwgcHJpdi0+bmV0ZGV2LT5uYW1lLAorCQkgImVuY3JfbGV2ZWwgJXUga2V5ICVkIiwgd2lwaHlfbmFtZShwcml2LT5ody0+d2lwaHkpLAogCQkgbS0+cHJpdmFjeV9pbnZva2VkLCBtLT53ZXBfZGVmYXVsdF9rZXlfaWQsCiAJCSBtLT53ZXBfa2V5X21hcHBpbmdfbGVuLCBtLT5leGNsdWRlX3VuZW5jcnlwdGVkLAogCQkgbGUzMl90b19jcHUobS0+d2VwX2ljdl9lcnJvcl9jb3VudCksCkBAIC0xMTAwLDEyICsxMDYzLDU1IEBACiAKIAlmb3IgKGkgPSAwOyBpIDwgV0VQX0tFWVM7IGkrKykKIAkJYXQ3Nl9kYmcoREJHX01JQiwgIiVzOiBNSUIgTUFDX1dFUDoga2V5ICVkOiAlcyIsCi0JCQkgcHJpdi0+bmV0ZGV2LT5uYW1lLCBpLAorCQkJIHdpcGh5X25hbWUocHJpdi0+aHctPndpcGh5KSwgaSwKIAkJCSBoZXgyc3RyKG0tPndlcF9kZWZhdWx0X2tleXZhbHVlW2ldLCBrZXlfbGVuKSk7CiBleGl0OgogCWtmcmVlKG0pOwogfQogCitzdGF0aWMgdm9pZCBhdDc2X2R1bXBfbWliX21hY19lbmNyeXB0aW9uKHN0cnVjdCBhdDc2X3ByaXYgKnByaXYpCit7CisJaW50IGk7CisJaW50IHJldDsKKwkvKmludCBrZXlfbGVuOyovCisJc3RydWN0IG1pYl9tYWNfZW5jcnlwdGlvbiAqbTsKKworCW0gPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbWliX21hY19lbmNyeXB0aW9uKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFtKQorCQlyZXR1cm47CisKKwlyZXQgPSBhdDc2X2dldF9taWIocHJpdi0+dWRldiwgTUlCX01BQ19FTkNSWVBUSU9OLCBtLAorCQkJICAgc2l6ZW9mKHN0cnVjdCBtaWJfbWFjX2VuY3J5cHRpb24pKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKCZwcml2LT51ZGV2LT5kZXYsCisJCQkiJXM6IGF0NzZfZ2V0X21pYiAoTUFDX0VOQ1JZUFRJT04pIGZhaWxlZDogJWRcbiIsCisJCQl3aXBoeV9uYW1lKHByaXYtPmh3LT53aXBoeSksIHJldCk7CisJCWdvdG8gZXhpdDsKKwl9CisKKwlhdDc2X2RiZyhEQkdfTUlCLAorCQkgIiVzOiBNSUIgTUFDX0VOQ1JZUFRJT046IHRraXBfYnNzaWQgJXMgcHJpdl9pbnZva2VkICV1ICIKKwkJICJjaXBoX2tleV9pZCAldSBncnBfa2V5X2lkICV1IGV4Y2xfdW5lbmNyICV1ICIKKwkJICJja2lwX2tleV9wZXJtICV1IHdlcF9pY3ZfZXJyICV1IHdlcF9leGNsdWRlZCAldSIsCisJCSB3aXBoeV9uYW1lKHByaXYtPmh3LT53aXBoeSksIG1hYzJzdHIobS0+dGtpcF9ic3NpZCksCisJCSBtLT5wcml2YWN5X2ludm9rZWQsIG0tPmNpcGhlcl9kZWZhdWx0X2tleV9pZCwKKwkJIG0tPmNpcGhlcl9kZWZhdWx0X2dyb3VwX2tleV9pZCwgbS0+ZXhjbHVkZV91bmVuY3J5cHRlZCwKKwkJIG0tPmNraXBfa2V5X3Blcm11dGF0aW9uLAorCQkgbGUzMl90b19jcHUobS0+d2VwX2ljdl9lcnJvcl9jb3VudCksCisJCSBsZTMyX3RvX2NwdShtLT53ZXBfZXhjbHVkZWRfY291bnQpKTsKKworCS8qa2V5X2xlbiA9IChtLT5lbmNyeXB0aW9uX2xldmVsID09IDEpID8KKwkgICAgV0VQX1NNQUxMX0tFWV9MRU4gOiBXRVBfTEFSR0VfS0VZX0xFTjsqLworCisJZm9yIChpID0gMDsgaSA8IENJUEhFUl9LRVlTOyBpKyspCisJCWF0NzZfZGJnKERCR19NSUIsICIlczogTUlCIE1BQ19FTkNSWVBUSU9OOiBrZXkgJWQ6ICVzIiwKKwkJCSB3aXBoeV9uYW1lKHByaXYtPmh3LT53aXBoeSksIGksCisJCQkgaGV4MnN0cihtLT5jaXBoZXJfZGVmYXVsdF9rZXl2YWx1ZVtpXSwKKwkJCQkgQ0lQSEVSX0tFWV9MRU4pKTsKK2V4aXQ6CisJa2ZyZWUobSk7Cit9CisKIHN0YXRpYyB2b2lkIGF0NzZfZHVtcF9taWJfbWFjX21nbXQoc3RydWN0IGF0NzZfcHJpdiAqcHJpdikKIHsKIAlpbnQgcmV0OwpAQCAtMTExOSw3ICsxMTI1LDcgQEAKIAkJCSAgIHNpemVvZihzdHJ1Y3QgbWliX21hY19tZ210KSk7CiAJaWYgKHJldCA8IDApIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogYXQ3Nl9nZXRfbWliIChNQUNfTUdNVCkgZmFpbGVkOiAlZFxuIiwKLQkJICAgICAgIHByaXYtPm5ldGRldi0+bmFtZSwgcmV0KTsKKwkJICAgICAgIHdpcGh5X25hbWUocHJpdi0+aHctPndpcGh5KSwgcmV0KTsKIAkJZ290byBleGl0OwogCX0KIApAQCAtMTEzMCw3ICsxMTM2LDcgQEAKIAkJICJwbV9tb2RlICVkIGlic3NfY2hhbmdlICVkIHJlcyAlZCAiCiAJCSAibXVsdGlfZG9tYWluX2NhcGFiaWxpdHlfaW1wbGVtZW50ZWQgJWQgIgogCQkgImludGVybmF0aW9uYWxfcm9hbWluZyAlZCBjb3VudHJ5X3N0cmluZyAlLjNzIiwKLQkJIHByaXYtPm5ldGRldi0+bmFtZSwgbGUxNl90b19jcHUobS0+YmVhY29uX3BlcmlvZCksCisJCSB3aXBoeV9uYW1lKHByaXYtPmh3LT53aXBoeSksIGxlMTZfdG9fY3B1KG0tPmJlYWNvbl9wZXJpb2QpLAogCQkgbGUxNl90b19jcHUobS0+Q0ZQX21heF9kdXJhdGlvbiksCiAJCSBsZTE2X3RvX2NwdShtLT5tZWRpdW1fb2NjdXBhbmN5X2xpbWl0KSwKIAkJIGxlMTZfdG9fY3B1KG0tPnN0YXRpb25faWQpLCBsZTE2X3RvX2NwdShtLT5BVElNX3dpbmRvdyksCkBAIC0xMTU1LDcgKzExNjEsNyBAQAogCXJldCA9IGF0NzZfZ2V0X21pYihwcml2LT51ZGV2LCBNSUJfTUFDLCBtLCBzaXplb2Yoc3RydWN0IG1pYl9tYWMpKTsKIAlpZiAocmV0IDwgMCkgewogCQlwcmludGsoS0VSTl9FUlIgIiVzOiBhdDc2X2dldF9taWIgKE1BQykgZmFpbGVkOiAlZFxuIiwKLQkJICAgICAgIHByaXYtPm5ldGRldi0+bmFtZSwgcmV0KTsKKwkJICAgICAgIHdpcGh5X25hbWUocHJpdi0+aHctPndpcGh5KSwgcmV0KTsKIAkJZ290byBleGl0OwogCX0KIApAQCAtMTE2NSw3ICsxMTcxLDggQEAKIAkJICJzY2FuX3R5cGUgJWQgc2Nhbl9jaGFubmVsICVkIHByb2JlX2RlbGF5ICV1ICIKIAkJICJtaW5fY2hhbm5lbF90aW1lICVkIG1heF9jaGFubmVsX3RpbWUgJWQgbGlzdGVuX2ludCAlZCAiCiAJCSAiZGVzaXJlZF9zc2lkICVzIGRlc2lyZWRfYnNzaWQgJXMgZGVzaXJlZF9ic3N0eXBlICVkIiwKLQkJIHByaXYtPm5ldGRldi0+bmFtZSwgbGUzMl90b19jcHUobS0+bWF4X3R4X21zZHVfbGlmZXRpbWUpLAorCQkgd2lwaHlfbmFtZShwcml2LT5ody0+d2lwaHkpLAorCQkgbGUzMl90b19jcHUobS0+bWF4X3R4X21zZHVfbGlmZXRpbWUpLAogCQkgbGUzMl90b19jcHUobS0+bWF4X3J4X2xpZmV0aW1lKSwKIAkJIGxlMTZfdG9fY3B1KG0tPmZyYWdfdGhyZXNob2xkKSwgbGUxNl90b19jcHUobS0+cnRzX3RocmVzaG9sZCksCiAJCSBsZTE2X3RvX2NwdShtLT5jd21pbiksIGxlMTZfdG9fY3B1KG0tPmN3bWF4KSwKQEAgLTExOTEsNyArMTE5OCw3IEBACiAJcmV0ID0gYXQ3Nl9nZXRfbWliKHByaXYtPnVkZXYsIE1JQl9QSFksIG0sIHNpemVvZihzdHJ1Y3QgbWliX3BoeSkpOwogCWlmIChyZXQgPCAwKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiJXM6IGF0NzZfZ2V0X21pYiAoUEhZKSBmYWlsZWQ6ICVkXG4iLAotCQkgICAgICAgcHJpdi0+bmV0ZGV2LT5uYW1lLCByZXQpOworCQkgICAgICAgd2lwaHlfbmFtZShwcml2LT5ody0+d2lwaHkpLCByZXQpOwogCQlnb3RvIGV4aXQ7CiAJfQogCkBAIC0xMjAwLDcgKzEyMDcsNyBAQAogCQkgIm1wZHVfbWF4X2xlbmd0aCAlZCBjY2FfbW9kZV9zdXBwb3J0ZWQgJWQgb3BlcmF0aW9uX3JhdGVfc2V0ICIKIAkJICIweCV4IDB4JXggMHgleCAweCV4IGNoYW5uZWxfaWQgJWQgY3VycmVudF9jY2FfbW9kZSAlZCAiCiAJCSAicGh5X3R5cGUgJWQgY3VycmVudF9yZWdfZG9tYWluICVkIiwKLQkJIHByaXYtPm5ldGRldi0+bmFtZSwgbGUzMl90b19jcHUobS0+ZWRfdGhyZXNob2xkKSwKKwkJIHdpcGh5X25hbWUocHJpdi0+aHctPndpcGh5KSwgbGUzMl90b19jcHUobS0+ZWRfdGhyZXNob2xkKSwKIAkJIGxlMTZfdG9fY3B1KG0tPnNsb3RfdGltZSksIGxlMTZfdG9fY3B1KG0tPnNpZnNfdGltZSksCiAJCSBsZTE2X3RvX2NwdShtLT5wcmVhbWJsZV9sZW5ndGgpLAogCQkgbGUxNl90b19jcHUobS0+cGxjcF9oZWFkZXJfbGVuZ3RoKSwKQEAgLTEyMjQsMTMgKzEyMzEsMTQgQEAKIAlyZXQgPSBhdDc2X2dldF9taWIocHJpdi0+dWRldiwgTUlCX0xPQ0FMLCBtLCBzaXplb2Yoc3RydWN0IG1pYl9sb2NhbCkpOwogCWlmIChyZXQgPCAwKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiJXM6IGF0NzZfZ2V0X21pYiAoTE9DQUwpIGZhaWxlZDogJWRcbiIsCi0JCSAgICAgICBwcml2LT5uZXRkZXYtPm5hbWUsIHJldCk7CisJCSAgICAgICB3aXBoeV9uYW1lKHByaXYtPmh3LT53aXBoeSksIHJldCk7CiAJCWdvdG8gZXhpdDsKIAl9CiAKIAlhdDc2X2RiZyhEQkdfTUlCLCAiJXM6IE1JQiBMT0NBTDogYmVhY29uX2VuYWJsZSAlZCAiCiAJCSAidHhhdXRvcmF0ZV9mYWxsYmFjayAlZCBzc2lkX3NpemUgJWQgcHJvbWlzY3VvdXNfbW9kZSAlZCAiCi0JCSAicHJlYW1ibGVfdHlwZSAlZCIsIHByaXYtPm5ldGRldi0+bmFtZSwgbS0+YmVhY29uX2VuYWJsZSwKKwkJICJwcmVhbWJsZV90eXBlICVkIiwgd2lwaHlfbmFtZShwcml2LT5ody0+d2lwaHkpLAorCQkgbS0+YmVhY29uX2VuYWJsZSwKIAkJIG0tPnR4YXV0b3JhdGVfZmFsbGJhY2ssIG0tPnNzaWRfc2l6ZSwgbS0+cHJvbWlzY3VvdXNfbW9kZSwKIAkJIG0tPnByZWFtYmxlX3R5cGUpOwogZXhpdDoKQEAgLTEyNDksMTE4ICsxMjU3LDIxIEBACiAJCQkgICBzaXplb2Yoc3RydWN0IG1pYl9tZG9tYWluKSk7CiAJaWYgKHJldCA8IDApIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogYXQ3Nl9nZXRfbWliIChNRE9NQUlOKSBmYWlsZWQ6ICVkXG4iLAotCQkgICAgICAgcHJpdi0+bmV0ZGV2LT5uYW1lLCByZXQpOworCQkgICAgICAgd2lwaHlfbmFtZShwcml2LT5ody0+d2lwaHkpLCByZXQpOwogCQlnb3RvIGV4aXQ7CiAJfQogCiAJYXQ3Nl9kYmcoREJHX01JQiwgIiVzOiBNSUIgTURPTUFJTjogY2hhbm5lbF9saXN0ICVzIiwKLQkJIHByaXYtPm5ldGRldi0+bmFtZSwKKwkJIHdpcGh5X25hbWUocHJpdi0+aHctPndpcGh5KSwKIAkJIGhleDJzdHIobS0+Y2hhbm5lbF9saXN0LCBzaXplb2YobS0+Y2hhbm5lbF9saXN0KSkpOwogCiAJYXQ3Nl9kYmcoREJHX01JQiwgIiVzOiBNSUIgTURPTUFJTjogdHhfcG93ZXJsZXZlbCAlcyIsCi0JCSBwcml2LT5uZXRkZXYtPm5hbWUsCisJCSB3aXBoeV9uYW1lKHByaXYtPmh3LT53aXBoeSksCiAJCSBoZXgyc3RyKG0tPnR4X3Bvd2VybGV2ZWwsIHNpemVvZihtLT50eF9wb3dlcmxldmVsKSkpOwogZXhpdDoKIAlrZnJlZShtKTsKIH0KIAotc3RhdGljIGludCBhdDc2X2dldF9jdXJyZW50X2Jzc2lkKHN0cnVjdCBhdDc2X3ByaXYgKnByaXYpCi17Ci0JaW50IHJldCA9IDA7Ci0Jc3RydWN0IG1pYl9tYWNfbWdtdCAqbWFjX21nbXQgPQotCSAgICBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbWliX21hY19tZ210KSwgR0ZQX0tFUk5FTCk7Ci0KLQlpZiAoIW1hY19tZ210KSB7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQlyZXQgPSBhdDc2X2dldF9taWIocHJpdi0+dWRldiwgTUlCX01BQ19NR01ULCBtYWNfbWdtdCwKLQkJCSAgIHNpemVvZihzdHJ1Y3QgbWliX21hY19tZ210KSk7Ci0JaWYgKHJldCA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogYXQ3Nl9nZXRfbWliIGZhaWxlZDogJWRcbiIsCi0JCSAgICAgICBwcml2LT5uZXRkZXYtPm5hbWUsIHJldCk7Ci0JCWdvdG8gZXJyb3I7Ci0JfQotCW1lbWNweShwcml2LT5ic3NpZCwgbWFjX21nbXQtPmN1cnJlbnRfYnNzaWQsIEVUSF9BTEVOKTsKLQlwcmludGsoS0VSTl9JTkZPICIlczogdXNpbmcgQlNTSUQgJXNcbiIsIHByaXYtPm5ldGRldi0+bmFtZSwKLQkgICAgICAgbWFjMnN0cihwcml2LT5ic3NpZCkpOwotZXJyb3I6Ci0Ja2ZyZWUobWFjX21nbXQpOwotZXhpdDoKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGF0NzZfZ2V0X2N1cnJlbnRfY2hhbm5lbChzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2KQotewotCWludCByZXQgPSAwOwotCXN0cnVjdCBtaWJfcGh5ICpwaHkgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbWliX3BoeSksIEdGUF9LRVJORUwpOwotCi0JaWYgKCFwaHkpIHsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBleGl0OwotCX0KLQlyZXQgPSBhdDc2X2dldF9taWIocHJpdi0+dWRldiwgTUlCX1BIWSwgcGh5LCBzaXplb2Yoc3RydWN0IG1pYl9waHkpKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBhdDc2X2dldF9taWIoTUlCX1BIWSkgZmFpbGVkOiAlZFxuIiwKLQkJICAgICAgIHByaXYtPm5ldGRldi0+bmFtZSwgcmV0KTsKLQkJZ290byBlcnJvcjsKLQl9Ci0JcHJpdi0+Y2hhbm5lbCA9IHBoeS0+Y2hhbm5lbF9pZDsKLWVycm9yOgotCWtmcmVlKHBoeSk7Ci1leGl0OgotCXJldHVybiByZXQ7Ci19Ci0KLS8qKgotICogYXQ3Nl9zdGFydF9zY2FuIC0gc3RhcnQgYSBzY2FuCi0gKgotICogQHVzZV9lc3NpZCAtIHVzZSB0aGUgY29uZmlndXJlZCBFU1NJRCBpbiBub24gcGFzc2l2ZSBtb2RlCi0gKi8KLXN0YXRpYyBpbnQgYXQ3Nl9zdGFydF9zY2FuKHN0cnVjdCBhdDc2X3ByaXYgKnByaXYsIGludCB1c2VfZXNzaWQpCi17Ci0Jc3RydWN0IGF0NzZfcmVxX3NjYW4gc2NhbjsKLQotCW1lbXNldCgmc2NhbiwgMCwgc2l6ZW9mKHN0cnVjdCBhdDc2X3JlcV9zY2FuKSk7Ci0JbWVtc2V0KHNjYW4uYnNzaWQsIDB4ZmYsIEVUSF9BTEVOKTsKLQotCWlmICh1c2VfZXNzaWQpIHsKLQkJbWVtY3B5KHNjYW4uZXNzaWQsIHByaXYtPmVzc2lkLCBJV19FU1NJRF9NQVhfU0laRSk7Ci0JCXNjYW4uZXNzaWRfc2l6ZSA9IHByaXYtPmVzc2lkX3NpemU7Ci0JfSBlbHNlCi0JCXNjYW4uZXNzaWRfc2l6ZSA9IDA7Ci0KLQkvKiBqYWw6IHdoeSBzaG91bGQgd2Ugc3RhcnQgYXQgYSBjZXJ0YWluIGNoYW5uZWw/IHdlIGRvIHNjYW4gdGhlIHdob2xlCi0JICAgcmFuZ2UgYWxsb3dlZCBieSByZWcgZG9tYWluLiAqLwotCXNjYW4uY2hhbm5lbCA9IHByaXYtPmNoYW5uZWw7Ci0KLQkvKiBhdG1lbHdsYW5kcml2ZXIgZGlmZmVycyBiZXR3ZWVuIHNjYW4gdHlwZSAwIGFuZCAxIChhY3RpdmUvcGFzc2l2ZSkKLQkgICBGb3IgYWQtaG9jIG1vZGUsIGl0IHVzZXMgdHlwZSAwIG9ubHkuICovCi0Jc2Nhbi5zY2FuX3R5cGUgPSBwcml2LT5zY2FuX21vZGU7Ci0KLQkvKiBJTkZPOiBGb3IgcHJvYmVfZGVsYXksIG5vdCBtdWx0aXBseWluZyBieSAxMDI0IGFzIHRoaXMgd2lsbCBiZQotCSAgIHNsaWdodGx5IGxlc3MgdGhhbiBtaW5fY2hhbm5lbF90aW1lCi0JICAgKHBlciBzcGVjOiBwcm9iZSBkZWxheSA8IG1pbi4gY2hhbm5lbCB0aW1lKSAqLwotCXNjYW4ubWluX2NoYW5uZWxfdGltZSA9IGNwdV90b19sZTE2KHByaXYtPnNjYW5fbWluX3RpbWUpOwotCXNjYW4ubWF4X2NoYW5uZWxfdGltZSA9IGNwdV90b19sZTE2KHByaXYtPnNjYW5fbWF4X3RpbWUpOwotCXNjYW4ucHJvYmVfZGVsYXkgPSBjcHVfdG9fbGUxNihwcml2LT5zY2FuX21pbl90aW1lICogMTAwMCk7Ci0Jc2Nhbi5pbnRlcm5hdGlvbmFsX3NjYW4gPSAwOwotCi0JLyogb3RoZXIgdmFsdWVzIGFyZSBzZXQgdG8gMCBmb3IgdHlwZSAwICovCi0KLQlhdDc2X2RiZyhEQkdfUFJPR1JFU1MsICIlczogc3RhcnRfc2NhbiAodXNlX2Vzc2lkID0gJWQsIGludGwgPSAlZCwgIgotCQkgImNoYW5uZWwgPSAlZCwgcHJvYmVfZGVsYXkgPSAlZCwgc2Nhbl9taW5fdGltZSA9ICVkLCAiCi0JCSAic2Nhbl9tYXhfdGltZSA9ICVkKSIsCi0JCSBwcml2LT5uZXRkZXYtPm5hbWUsIHVzZV9lc3NpZCwKLQkJIHNjYW4uaW50ZXJuYXRpb25hbF9zY2FuLCBzY2FuLmNoYW5uZWwsCi0JCSBsZTE2X3RvX2NwdShzY2FuLnByb2JlX2RlbGF5KSwKLQkJIGxlMTZfdG9fY3B1KHNjYW4ubWluX2NoYW5uZWxfdGltZSksCi0JCSBsZTE2X3RvX2NwdShzY2FuLm1heF9jaGFubmVsX3RpbWUpKTsKLQotCXJldHVybiBhdDc2X3NldF9jYXJkX2NvbW1hbmQocHJpdi0+dWRldiwgQ01EX1NDQU4sICZzY2FuLCBzaXplb2Yoc2NhbikpOwotfQotCiAvKiBFbmFibGUgbW9uaXRvciBtb2RlICovCiBzdGF0aWMgaW50IGF0NzZfc3RhcnRfbW9uaXRvcihzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2KQogewpAQCAtMTM4MSw4NiArMTI5Miw2IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBhdDc2X3N0YXJ0X2lic3Moc3RydWN0IGF0NzZfcHJpdiAqcHJpdikKLXsKLQlzdHJ1Y3QgYXQ3Nl9yZXFfaWJzcyBic3M7Ci0JaW50IHJldDsKLQotCVdBUk5fT04ocHJpdi0+bWFjX3N0YXRlICE9IE1BQ19PV05fSUJTUyk7Ci0JaWYgKHByaXYtPm1hY19zdGF0ZSAhPSBNQUNfT1dOX0lCU1MpCi0JCXJldHVybiAtRUJVU1k7Ci0KLQltZW1zZXQoJmJzcywgMCwgc2l6ZW9mKHN0cnVjdCBhdDc2X3JlcV9pYnNzKSk7Ci0JbWVtc2V0KGJzcy5ic3NpZCwgMHhmZiwgRVRIX0FMRU4pOwotCW1lbWNweShic3MuZXNzaWQsIHByaXYtPmVzc2lkLCBJV19FU1NJRF9NQVhfU0laRSk7Ci0JYnNzLmVzc2lkX3NpemUgPSBwcml2LT5lc3NpZF9zaXplOwotCWJzcy5ic3NfdHlwZSA9IEFESE9DX01PREU7Ci0JYnNzLmNoYW5uZWwgPSBwcml2LT5jaGFubmVsOwotCi0JcmV0ID0gYXQ3Nl9zZXRfY2FyZF9jb21tYW5kKHByaXYtPnVkZXYsIENNRF9TVEFSVF9JQlNTLCAmYnNzLAotCQkJCSAgICBzaXplb2Yoc3RydWN0IGF0NzZfcmVxX2lic3MpKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBzdGFydF9pYnNzIGZhaWxlZDogJWRcbiIsCi0JCSAgICAgICBwcml2LT5uZXRkZXYtPm5hbWUsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JcmV0ID0gYXQ3Nl93YWl0X2NvbXBsZXRpb24ocHJpdiwgQ01EX1NUQVJUX0lCU1MpOwotCWlmIChyZXQgIT0gQ01EX1NUQVRVU19DT01QTEVURSkgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBzdGFydF9pYnNzIGZhaWxlZCB0byBjb21wbGV0ZSwgJWRcbiIsCi0JCSAgICAgICBwcml2LT5uZXRkZXYtPm5hbWUsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JcmV0ID0gYXQ3Nl9nZXRfY3VycmVudF9ic3NpZChwcml2KTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCXJldCA9IGF0NzZfZ2V0X2N1cnJlbnRfY2hhbm5lbChwcml2KTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCS8qIG5vdCBzdXJlIHdoYXQgdGhpcyBpcyBnb29kIGZvciA/Pz8gKi8KLQlwcml2LT5taWJfYnVmLnR5cGUgPSBNSUJfTUFDX01HTVQ7Ci0JcHJpdi0+bWliX2J1Zi5zaXplID0gMTsKLQlwcml2LT5taWJfYnVmLmluZGV4ID0gb2Zmc2V0b2Yoc3RydWN0IG1pYl9tYWNfbWdtdCwgaWJzc19jaGFuZ2UpOwotCXByaXYtPm1pYl9idWYuZGF0YS5ieXRlID0gMDsKLQotCXJldCA9IGF0NzZfc2V0X21pYihwcml2LCAmcHJpdi0+bWliX2J1Zik7Ci0JaWYgKHJldCA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogc2V0X21pYiAoaWJzcyBjaGFuZ2Ugb2spIGZhaWxlZDogJWRcbiIsCi0JCSAgICAgICBwcml2LT5uZXRkZXYtPm5hbWUsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JbmV0aWZfY2Fycmllcl9vbihwcml2LT5uZXRkZXYpOwotCW5ldGlmX3N0YXJ0X3F1ZXVlKHByaXYtPm5ldGRldik7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qIFJlcXVlc3QgY2FyZCB0byBqb2luIEJTUyBpbiBtYW5hZ2VkIG9yIGFkLWhvYyBtb2RlICovCi1zdGF0aWMgaW50IGF0NzZfam9pbl9ic3Moc3RydWN0IGF0NzZfcHJpdiAqcHJpdiwgc3RydWN0IGJzc19pbmZvICpwdHIpCi17Ci0Jc3RydWN0IGF0NzZfcmVxX2pvaW4gam9pbjsKLQotCUJVR19PTighcHRyKTsKLQotCW1lbXNldCgmam9pbiwgMCwgc2l6ZW9mKHN0cnVjdCBhdDc2X3JlcV9qb2luKSk7Ci0JbWVtY3B5KGpvaW4uYnNzaWQsIHB0ci0+YnNzaWQsIEVUSF9BTEVOKTsKLQltZW1jcHkoam9pbi5lc3NpZCwgcHRyLT5zc2lkLCBwdHItPnNzaWRfbGVuKTsKLQlqb2luLmVzc2lkX3NpemUgPSBwdHItPnNzaWRfbGVuOwotCWpvaW4uYnNzX3R5cGUgPSAocHJpdi0+aXdfbW9kZSA9PSBJV19NT0RFX0FESE9DID8gMSA6IDIpOwotCWpvaW4uY2hhbm5lbCA9IHB0ci0+Y2hhbm5lbDsKLQlqb2luLnRpbWVvdXQgPSBjcHVfdG9fbGUxNigyMDAwKTsKLQotCWF0NzZfZGJnKERCR19QUk9HUkVTUywKLQkJICIlcyBqb2luIGFkZHIgJXMgc3NpZCAlcyB0eXBlICVkIGNoICVkIHRpbWVvdXQgJWQiLAotCQkgcHJpdi0+bmV0ZGV2LT5uYW1lLCBtYWMyc3RyKGpvaW4uYnNzaWQpLCBqb2luLmVzc2lkLAotCQkgam9pbi5ic3NfdHlwZSwgam9pbi5jaGFubmVsLCBsZTE2X3RvX2NwdShqb2luLnRpbWVvdXQpKTsKLQlyZXR1cm4gYXQ3Nl9zZXRfY2FyZF9jb21tYW5kKHByaXYtPnVkZXYsIENNRF9KT0lOLCAmam9pbiwKLQkJCQkgICAgIHNpemVvZihzdHJ1Y3QgYXQ3Nl9yZXFfam9pbikpOwotfQotCiAvKiBDYWxjdWxhdGUgcGFkZGluZyBmcm9tIHR4YnVmLT53bGVuZ3RoICh3aGljaCBleGNsdWRlcyB0aGUgVVNCIFRYIGhlYWRlciksCiAgICBsaWtlbHkgdG8gY29tcGVuc2F0ZSBhIGZsYXcgaW4gdGhlIEFUNzZDNTAzQSBVU0IgcGFydCAuLi4gKi8KIHN0YXRpYyBpbmxpbmUgaW50IGF0NzZfY2FsY19wYWRkaW5nKGludCB3bGVuKQpAQCAtMTQ3OSwxNCArMTMxMCw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLS8qIFdlIGFyZSBkb2luZyBhIGxvdCBvZiB0aGluZ3MgaGVyZSBpbiBhbiBpbnRlcnJ1cHQuIE5lZWQKLSAgIGEgYmggaGFuZGxlciAoV2F0Y2hpbmcgVFYgd2l0aCBhIFRWIGNhcmQgaXMgcHJvYmFibHkKLSAgIGEgZ29vZCB0ZXN0OiBpZiB5b3Ugc2VlIGZsaWNrZXJzLCB3ZSBhcmUgZG9pbmcgdG9vIG11Y2guCi0gICBDdXJyZW50bHkgSSBkbyBzZWUgZmxpY2tlcnMuLi4gZXZlbiB3aXRoIG91ciB0YXNrbGV0IDotKCApCi0gICBNYXliZSBiZWNhdXNlIHRoZSBidHR2IGRyaXZlciBhbmQgdXNiLXVoY2kgdXNlIHRoZSBzYW1lIGludGVycnVwdAotKi8KLS8qIE9yIG1heWJlIGJlY2F1c2Ugb3VyIEJIIGhhbmRsZXIgaXMgcHJlZW1wdGluZyBidHR2J3MgQkggaGFuZGxlci4uIEJIcyBkb24ndAotICogc29sdmUgZXZlcnl0aGluZy4uIChhbGV4KSAqLwogc3RhdGljIHZvaWQgYXQ3Nl9yeF9jYWxsYmFjayhzdHJ1Y3QgdXJiICp1cmIpCiB7CiAJc3RydWN0IGF0NzZfcHJpdiAqcHJpdiA9IHVyYi0+Y29udGV4dDsKQEAgLTE0OTYsMTc1OCArMTMxOSw2IEBACiAJcmV0dXJuOwogfQogCi1zdGF0aWMgdm9pZCBhdDc2X3R4X2NhbGxiYWNrKHN0cnVjdCB1cmIgKnVyYikKLXsKLQlzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2ID0gdXJiLT5jb250ZXh0OwotCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9ICZwcml2LT5zdGF0czsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXN0cnVjdCBhdDc2X3R4X2J1ZmZlciAqbWdtdF9idWY7Ci0JaW50IHJldDsKLQotCXN3aXRjaCAodXJiLT5zdGF0dXMpIHsKLQljYXNlIDA6Ci0JCXN0YXRzLT50eF9wYWNrZXRzKys7Ci0JCWJyZWFrOwotCWNhc2UgLUVOT0VOVDoKLQljYXNlIC1FQ09OTlJFU0VUOgotCQkvKiB1cmIgaGFzIGJlZW4gdW5saW5rZWQgKi8KLQkJcmV0dXJuOwotCWRlZmF1bHQ6Ci0JCWF0NzZfZGJnKERCR19VUkIsICIlcyAtIG5vbnplcm8gdHggc3RhdHVzIHJlY2VpdmVkOiAlZCIsCi0JCQkgX19mdW5jX18sIHVyYi0+c3RhdHVzKTsKLQkJc3RhdHMtPnR4X2Vycm9ycysrOwotCQlicmVhazsKLQl9Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bWdtdF9zcGlubG9jaywgZmxhZ3MpOwotCW1nbXRfYnVmID0gcHJpdi0+bmV4dF9tZ210X2J1bGs7Ci0JcHJpdi0+bmV4dF9tZ210X2J1bGsgPSBOVUxMOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPm1nbXRfc3BpbmxvY2ssIGZsYWdzKTsKLQotCWlmICghbWdtdF9idWYpIHsKLQkJbmV0aWZfd2FrZV9xdWV1ZShwcml2LT5uZXRkZXYpOwotCQlyZXR1cm47Ci0JfQotCi0JLyogd2UgZG9uJ3QgY29weSB0aGUgcGFkZGluZyBieXRlcywgYnV0IGFkZCB0aGVtCi0JICAgdG8gdGhlIGxlbmd0aCAqLwotCW1lbWNweShwcml2LT5idWxrX291dF9idWZmZXIsIG1nbXRfYnVmLAotCSAgICAgICBsZTE2X3RvX2NwdShtZ210X2J1Zi0+d2xlbmd0aCkgKyBBVDc2X1RYX0hEUkxFTik7Ci0JdXNiX2ZpbGxfYnVsa191cmIocHJpdi0+dHhfdXJiLCBwcml2LT51ZGV2LCBwcml2LT50eF9waXBlLAotCQkJICBwcml2LT5idWxrX291dF9idWZmZXIsCi0JCQkgIGxlMTZfdG9fY3B1KG1nbXRfYnVmLT53bGVuZ3RoKSArIG1nbXRfYnVmLT5wYWRkaW5nICsKLQkJCSAgQVQ3Nl9UWF9IRFJMRU4sIGF0NzZfdHhfY2FsbGJhY2ssIHByaXYpOwotCXJldCA9IHVzYl9zdWJtaXRfdXJiKHByaXYtPnR4X3VyYiwgR0ZQX0FUT01JQyk7Ci0JaWYgKHJldCkKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogZXJyb3IgaW4gdHggc3VibWl0IHVyYjogJWRcbiIsCi0JCSAgICAgICBwcml2LT5uZXRkZXYtPm5hbWUsIHJldCk7Ci0KLQlrZnJlZShtZ210X2J1Zik7Ci19Ci0KLS8qIFNlbmQgYSBtYW5hZ2VtZW50IGZyYW1lIG9uIGJ1bGstb3V0LiAgdHhidWYtPndsZW5ndGggbXVzdCBiZSBzZXQgKi8KLXN0YXRpYyBpbnQgYXQ3Nl90eF9tZ210KHN0cnVjdCBhdDc2X3ByaXYgKnByaXYsIHN0cnVjdCBhdDc2X3R4X2J1ZmZlciAqdHhidWYpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgcmV0OwotCWludCB1cmJfc3RhdHVzOwotCXZvaWQgKm9sZGJ1ZiA9IE5VTEw7Ci0KLQluZXRpZl9jYXJyaWVyX29mZihwcml2LT5uZXRkZXYpOwkvKiBzdG9wIG5ldGRldiB3YXRjaGRvZyAqLwotCW5ldGlmX3N0b3BfcXVldWUocHJpdi0+bmV0ZGV2KTsJLyogc3RvcCB0eCBkYXRhIHBhY2tldHMgKi8KLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5tZ210X3NwaW5sb2NrLCBmbGFncyk7Ci0KLQl1cmJfc3RhdHVzID0gcHJpdi0+dHhfdXJiLT5zdGF0dXM7Ci0JaWYgKHVyYl9zdGF0dXMgPT0gLUVJTlBST0dSRVNTKSB7Ci0JCS8qIGNhbm5vdCB0cmFuc21pdCBub3csIHB1dCBpbiB0aGUgcXVldWUgKi8KLQkJb2xkYnVmID0gcHJpdi0+bmV4dF9tZ210X2J1bGs7Ci0JCXByaXYtPm5leHRfbWdtdF9idWxrID0gdHhidWY7Ci0JfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPm1nbXRfc3BpbmxvY2ssIGZsYWdzKTsKLQotCWlmIChvbGRidWYpIHsKLQkJLyogYSBkYXRhL21nbXQgdHggaXMgYWxyZWFkeSBwZW5kaW5nIGluIHRoZSBVUkIgLQotCQkgICBpZiB0aGlzIGlzIG5vIGVycm9yIGluIHNvbWUgc2l0dWF0aW9ucyB3ZSBtdXN0Ci0JCSAgIGltcGxlbWVudCBhIHF1ZXVlIG9yIHNpbGVudGx5IG1vZGlmeSB0aGUgb2xkIG1zZyAqLwotCQlwcmludGsoS0VSTl9FUlIgIiVzOiByZW1vdmVkIHBlbmRpbmcgbWdtdCBidWZmZXIgJXNcbiIsCi0JCSAgICAgICBwcml2LT5uZXRkZXYtPm5hbWUsIGhleDJzdHIob2xkYnVmLCA2NCkpOwotCQlrZnJlZShvbGRidWYpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQl0eGJ1Zi0+dHhfcmF0ZSA9IFRYX1JBVEVfMU1CSVQ7Ci0JdHhidWYtPnBhZGRpbmcgPSBhdDc2X2NhbGNfcGFkZGluZyhsZTE2X3RvX2NwdSh0eGJ1Zi0+d2xlbmd0aCkpOwotCW1lbXNldCh0eGJ1Zi0+cmVzZXJ2ZWQsIDAsIHNpemVvZih0eGJ1Zi0+cmVzZXJ2ZWQpKTsKLQotCWlmIChwcml2LT5uZXh0X21nbXRfYnVsaykKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogVVJCIHN0YXR1cyAlZCwgYnV0IG1nbXQgaXMgcGVuZGluZ1xuIiwKLQkJICAgICAgIHByaXYtPm5ldGRldi0+bmFtZSwgdXJiX3N0YXR1cyk7Ci0KLQlhdDc2X2RiZyhEQkdfVFhfTUdNVCwKLQkJICIlczogdHggbWdtdDogd2xlbiAlZCB0eF9yYXRlICVkIHBhZCAlZCAlcyIsCi0JCSBwcml2LT5uZXRkZXYtPm5hbWUsIGxlMTZfdG9fY3B1KHR4YnVmLT53bGVuZ3RoKSwKLQkJIHR4YnVmLT50eF9yYXRlLCB0eGJ1Zi0+cGFkZGluZywKLQkJIGhleDJzdHIodHhidWYtPnBhY2tldCwgbGUxNl90b19jcHUodHhidWYtPndsZW5ndGgpKSk7Ci0KLQkvKiB0eGJ1ZiB3YXMgbm90IGNvbnN1bWVkIGFib3ZlIC0+IHNlbmQgbWdtdCBtc2cgaW1tZWRpYXRlbHkgKi8KLQltZW1jcHkocHJpdi0+YnVsa19vdXRfYnVmZmVyLCB0eGJ1ZiwKLQkgICAgICAgbGUxNl90b19jcHUodHhidWYtPndsZW5ndGgpICsgQVQ3Nl9UWF9IRFJMRU4pOwotCXVzYl9maWxsX2J1bGtfdXJiKHByaXYtPnR4X3VyYiwgcHJpdi0+dWRldiwgcHJpdi0+dHhfcGlwZSwKLQkJCSAgcHJpdi0+YnVsa19vdXRfYnVmZmVyLAotCQkJICBsZTE2X3RvX2NwdSh0eGJ1Zi0+d2xlbmd0aCkgKyB0eGJ1Zi0+cGFkZGluZyArCi0JCQkgIEFUNzZfVFhfSERSTEVOLCBhdDc2X3R4X2NhbGxiYWNrLCBwcml2KTsKLQlyZXQgPSB1c2Jfc3VibWl0X3VyYihwcml2LT50eF91cmIsIEdGUF9BVE9NSUMpOwotCWlmIChyZXQpCi0JCXByaW50ayhLRVJOX0VSUiAiJXM6IGVycm9yIGluIHR4IHN1Ym1pdCB1cmI6ICVkXG4iLAotCQkgICAgICAgcHJpdi0+bmV0ZGV2LT5uYW1lLCByZXQpOwotCi0Ja2ZyZWUodHhidWYpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotLyogR28gdG8gdGhlIG5leHQgaW5mb3JtYXRpb24gZWxlbWVudCAqLwotc3RhdGljIGlubGluZSB2b2lkIG5leHRfaWUoc3RydWN0IGllZWU4MDIxMV9pbmZvX2VsZW1lbnQgKippZSkKLXsKLQkqaWUgPSAoc3RydWN0IGllZWU4MDIxMV9pbmZvX2VsZW1lbnQgKikoJigqaWUpLT5kYXRhWygqaWUpLT5sZW5dKTsKLX0KLQotLyogQ2hhbGxlbmdlIGlzIHRoZSBjaGFsbGVuZ2Ugc3RyaW5nIChpbiBUTFYgZm9ybWF0KQotICAgd2UgZ290IHdpdGggc2VxX25yIDIgZm9yIHNoYXJlZCBzZWNyZXQgYXV0aGVudGljYXRpb24gb25seSBhbmQKLSAgIHNlbmQgaW4gc2VxX25yIDMgV0VQIGVuY3J5cHRlZCB0byBwcm92ZSB3ZSBoYXZlIHRoZSBjb3JyZWN0IFdFUCBrZXk7Ci0gICBvdGhlcndpc2UgaXQgaXMgTlVMTCAqLwotc3RhdGljIGludCBhdDc2X2F1dGhfcmVxKHN0cnVjdCBhdDc2X3ByaXYgKnByaXYsIHN0cnVjdCBic3NfaW5mbyAqYnNzLAotCQkJIGludCBzZXFfbnIsIHN0cnVjdCBpZWVlODAyMTFfaW5mb19lbGVtZW50ICpjaGFsbGVuZ2UpCi17Ci0Jc3RydWN0IGF0NzZfdHhfYnVmZmVyICp0eF9idWZmZXI7Ci0Jc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgKm1nbXQ7Ci0Jc3RydWN0IGllZWU4MDIxMV9hdXRoICpyZXE7Ci0JaW50IGJ1Zl9sZW4gPSAoc2VxX25yICE9IDMgPyBBVVRIX0ZSQU1FX1NJWkUgOgotCQkgICAgICAgQVVUSF9GUkFNRV9TSVpFICsgMSArIDEgKyBjaGFsbGVuZ2UtPmxlbik7Ci0KLQlCVUdfT04oIWJzcyk7Ci0JQlVHX09OKHNlcV9uciA9PSAzICYmICFjaGFsbGVuZ2UpOwotCXR4X2J1ZmZlciA9IGttYWxsb2MoYnVmX2xlbiArIE1BWF9QQURESU5HX1NJWkUsIEdGUF9BVE9NSUMpOwotCWlmICghdHhfYnVmZmVyKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXJlcSA9IChzdHJ1Y3QgaWVlZTgwMjExX2F1dGggKil0eF9idWZmZXItPnBhY2tldDsKLQltZ210ID0gJnJlcS0+aGVhZGVyOwotCi0JLyogbWFrZSB3aXJlbGVzcyBoZWFkZXIgKi8KLQkvKiBmaXJzdCBhdXRoIG1zZyBpcyBub3QgZW5jcnlwdGVkLCBvbmx5IHRoZSBzZWNvbmQgKHNlcV9uciA9PSAzKSAqLwotCW1nbXQtPmZyYW1lX2N0bCA9Ci0JICAgIGNwdV90b19sZTE2KElFRUU4MDIxMV9GVFlQRV9NR01UIHwgSUVFRTgwMjExX1NUWVBFX0FVVEggfAotCQkJKHNlcV9uciA9PSAzID8gSUVFRTgwMjExX0ZDVExfUFJPVEVDVEVEIDogMCkpOwotCi0JbWdtdC0+ZHVyYXRpb25faWQgPSBjcHVfdG9fbGUxNigweDgwMDApOwotCW1lbWNweShtZ210LT5hZGRyMSwgYnNzLT5ic3NpZCwgRVRIX0FMRU4pOwotCW1lbWNweShtZ210LT5hZGRyMiwgcHJpdi0+bmV0ZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOwotCW1lbWNweShtZ210LT5hZGRyMywgYnNzLT5ic3NpZCwgRVRIX0FMRU4pOwotCW1nbXQtPnNlcV9jdGwgPSBjcHVfdG9fbGUxNigwKTsKLQotCXJlcS0+YWxnb3JpdGhtID0gY3B1X3RvX2xlMTYocHJpdi0+YXV0aF9tb2RlKTsKLQlyZXEtPnRyYW5zYWN0aW9uID0gY3B1X3RvX2xlMTYoc2VxX25yKTsKLQlyZXEtPnN0YXR1cyA9IGNwdV90b19sZTE2KDApOwotCi0JaWYgKHNlcV9uciA9PSAzKQotCQltZW1jcHkocmVxLT5pbmZvX2VsZW1lbnQsIGNoYWxsZW5nZSwgMSArIDEgKyBjaGFsbGVuZ2UtPmxlbik7Ci0KLQkvKiBpbml0LiBhdDc2X3ByaXYgdHggaGVhZGVyICovCi0JdHhfYnVmZmVyLT53bGVuZ3RoID0gY3B1X3RvX2xlMTYoYnVmX2xlbiAtIEFUNzZfVFhfSERSTEVOKTsKLQlhdDc2X2RiZyhEQkdfVFhfTUdNVCwgIiVzOiBBdXRoUmVxIGJzc2lkICVzIGFsZyAlZCBzZXFfbnIgJWQiLAotCQkgcHJpdi0+bmV0ZGV2LT5uYW1lLCBtYWMyc3RyKG1nbXQtPmFkZHIzKSwKLQkJIGxlMTZfdG9fY3B1KHJlcS0+YWxnb3JpdGhtKSwgbGUxNl90b19jcHUocmVxLT50cmFuc2FjdGlvbikpOwotCWlmIChzZXFfbnIgPT0gMykKLQkJYXQ3Nl9kYmcoREJHX1RYX01HTVQsICIlczogQXV0aFJlcSBjaGFsbGVuZ2U6ICVzIC4uLiIsCi0JCQkgcHJpdi0+bmV0ZGV2LT5uYW1lLCBoZXgyc3RyKHJlcS0+aW5mb19lbGVtZW50LCAxOCkpOwotCi0JLyogZWl0aGVyIHNlbmQgaW1tZWRpYXRlbHkgKGlmIG5vIGRhdGEgdHggaXMgcGVuZGluZwotCSAgIG9yIHB1dCBpdCBpbiBwZW5kaW5nIGxpc3QgKi8KLQlyZXR1cm4gYXQ3Nl90eF9tZ210KHByaXYsIHR4X2J1ZmZlcik7Ci19Ci0KLXN0YXRpYyBpbnQgYXQ3Nl9hc3NvY19yZXEoc3RydWN0IGF0NzZfcHJpdiAqcHJpdiwgc3RydWN0IGJzc19pbmZvICpic3MpCi17Ci0Jc3RydWN0IGF0NzZfdHhfYnVmZmVyICp0eF9idWZmZXI7Ci0Jc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgKm1nbXQ7Ci0Jc3RydWN0IGllZWU4MDIxMV9hc3NvY19yZXF1ZXN0ICpyZXE7Ci0Jc3RydWN0IGllZWU4MDIxMV9pbmZvX2VsZW1lbnQgKmllOwotCWNoYXIgKmVzc2lkOwotCWludCBlc3NpZF9sZW47Ci0JdTE2IGNhcGE7Ci0KLQlCVUdfT04oIWJzcyk7Ci0KLQl0eF9idWZmZXIgPSBrbWFsbG9jKEFTU09DUkVRX01BWF9TSVpFICsgTUFYX1BBRERJTkdfU0laRSwgR0ZQX0FUT01JQyk7Ci0JaWYgKCF0eF9idWZmZXIpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JcmVxID0gKHN0cnVjdCBpZWVlODAyMTFfYXNzb2NfcmVxdWVzdCAqKXR4X2J1ZmZlci0+cGFja2V0OwotCW1nbXQgPSAmcmVxLT5oZWFkZXI7Ci0JaWUgPSByZXEtPmluZm9fZWxlbWVudDsKLQotCS8qIG1ha2Ugd2lyZWxlc3MgaGVhZGVyICovCi0JbWdtdC0+ZnJhbWVfY3RsID0gY3B1X3RvX2xlMTYoSUVFRTgwMjExX0ZUWVBFX01HTVQgfAotCQkJCSAgICAgIElFRUU4MDIxMV9TVFlQRV9BU1NPQ19SRVEpOwotCi0JbWdtdC0+ZHVyYXRpb25faWQgPSBjcHVfdG9fbGUxNigweDgwMDApOwotCW1lbWNweShtZ210LT5hZGRyMSwgYnNzLT5ic3NpZCwgRVRIX0FMRU4pOwotCW1lbWNweShtZ210LT5hZGRyMiwgcHJpdi0+bmV0ZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOwotCW1lbWNweShtZ210LT5hZGRyMywgYnNzLT5ic3NpZCwgRVRIX0FMRU4pOwotCW1nbXQtPnNlcV9jdGwgPSBjcHVfdG9fbGUxNigwKTsKLQotCS8qIHdlIG11c3Qgc2V0IHRoZSBQcml2YWN5IGJpdCBpbiB0aGUgY2FwYWJpbGl0aWVzIHRvIGFzc3VyZSBhbgotCSAgIEFnZXJlLWJhc2VkIEFQIHdpdGggb3B0aW9uYWwgV0VQIHRyYW5zbWl0cyBlbmNyeXB0ZWQgZnJhbWVzCi0JICAgdG8gdXMuICBBUCBvbmx5IHNldCB0aGUgUHJpdmFjeSBiaXQgaW4gdGhlaXIgY2FwYWJpbGl0aWVzCi0JICAgaWYgV0VQIGlzIG1hbmRhdG9yeSBpbiB0aGUgQlNTISAqLwotCWNhcGEgPSBic3MtPmNhcGE7Ci0JaWYgKHByaXYtPndlcF9lbmFibGVkKQotCQljYXBhIHw9IFdMQU5fQ0FQQUJJTElUWV9QUklWQUNZOwotCWlmIChwcml2LT5wcmVhbWJsZV90eXBlICE9IFBSRUFNQkxFX1RZUEVfTE9ORykKLQkJY2FwYSB8PSBXTEFOX0NBUEFCSUxJVFlfU0hPUlRfUFJFQU1CTEU7Ci0JcmVxLT5jYXBhYmlsaXR5ID0gY3B1X3RvX2xlMTYoY2FwYSk7Ci0KLQlyZXEtPmxpc3Rlbl9pbnRlcnZhbCA9IGNwdV90b19sZTE2KDIgKiBic3MtPmJlYWNvbl9pbnRlcnZhbCk7Ci0KLQkvKiB3cml0ZSBUTFYgZGF0YSBlbGVtZW50cyAqLwotCi0JaWUtPmlkID0gTUZJRV9UWVBFX1NTSUQ7Ci0JaWUtPmxlbiA9IGJzcy0+c3NpZF9sZW47Ci0JbWVtY3B5KGllLT5kYXRhLCBic3MtPnNzaWQsIGJzcy0+c3NpZF9sZW4pOwotCW5leHRfaWUoJmllKTsKLQotCWllLT5pZCA9IE1GSUVfVFlQRV9SQVRFUzsKLQlpZS0+bGVuID0gc2l6ZW9mKGh3X3JhdGVzKTsKLQltZW1jcHkoaWUtPmRhdGEsIGh3X3JhdGVzLCBzaXplb2YoaHdfcmF0ZXMpKTsKLQluZXh0X2llKCZpZSk7CQkvKiBpZSBwb2ludHMgYmVoaW5kIHRoZSBzdXBwX3JhdGVzIGZpZWxkICovCi0KLQkvKiBpbml0LiBhdDc2X3ByaXYgdHggaGVhZGVyICovCi0JdHhfYnVmZmVyLT53bGVuZ3RoID0gY3B1X3RvX2xlMTYoKHU4ICopaWUgLSAodTggKiltZ210KTsKLQotCWllID0gcmVxLT5pbmZvX2VsZW1lbnQ7Ci0JZXNzaWQgPSBpZS0+ZGF0YTsKLQllc3NpZF9sZW4gPSBtaW5fdChpbnQsIElXX0VTU0lEX01BWF9TSVpFLCBpZS0+bGVuKTsKLQotCW5leHRfaWUoJmllKTsJCS8qIHBvaW50cyB0byBJRSBvZiByYXRlcyBub3cgKi8KLQlhdDc2X2RiZyhEQkdfVFhfTUdNVCwKLQkJICIlczogQXNzb2NSZXEgYnNzaWQgJXMgY2FwYSAweCUwNHggc3NpZCAlLipzIHJhdGVzICVzIiwKLQkJIHByaXYtPm5ldGRldi0+bmFtZSwgbWFjMnN0cihtZ210LT5hZGRyMyksCi0JCSBsZTE2X3RvX2NwdShyZXEtPmNhcGFiaWxpdHkpLCBlc3NpZF9sZW4sIGVzc2lkLAotCQkgaGV4MnN0cihpZS0+ZGF0YSwgaWUtPmxlbikpOwotCi0JLyogZWl0aGVyIHNlbmQgaW1tZWRpYXRlbHkgKGlmIG5vIGRhdGEgdHggaXMgcGVuZGluZwotCSAgIG9yIHB1dCBpdCBpbiBwZW5kaW5nIGxpc3QgKi8KLQlyZXR1cm4gYXQ3Nl90eF9tZ210KHByaXYsIHR4X2J1ZmZlcik7Ci19Ci0KLS8qIFdlIGdvdCB0byBjaGVjayB0aGUgYnNzX2xpc3QgZm9yIG9sZCBlbnRyaWVzICovCi1zdGF0aWMgdm9pZCBhdDc2X2Jzc19saXN0X3RpbWVvdXQodW5zaWduZWQgbG9uZyBwYXIpCi17Ci0Jc3RydWN0IGF0NzZfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgYXQ3Nl9wcml2ICopcGFyOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqbHB0ciwgKm5wdHI7Ci0Jc3RydWN0IGJzc19pbmZvICpwdHI7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+YnNzX2xpc3Rfc3BpbmxvY2ssIGZsYWdzKTsKLQotCWxpc3RfZm9yX2VhY2hfc2FmZShscHRyLCBucHRyLCAmcHJpdi0+YnNzX2xpc3QpIHsKLQotCQlwdHIgPSBsaXN0X2VudHJ5KGxwdHIsIHN0cnVjdCBic3NfaW5mbywgbGlzdCk7Ci0KLQkJaWYgKHB0ciAhPSBwcml2LT5jdXJyX2JzcwotCQkgICAgJiYgdGltZV9hZnRlcihqaWZmaWVzLCBwdHItPmxhc3RfcnggKyBCU1NfTElTVF9USU1FT1VUKSkgewotCQkJYXQ3Nl9kYmcoREJHX0JTU19UQUJMRV9STSwKLQkJCQkgIiVzOiBic3NfbGlzdDogcmVtb3Zpbmcgb2xkIEJTUyAlcyBjaCAlZCIsCi0JCQkJIHByaXYtPm5ldGRldi0+bmFtZSwgbWFjMnN0cihwdHItPmJzc2lkKSwKLQkJCQkgcHRyLT5jaGFubmVsKTsKLQkJCWxpc3RfZGVsKCZwdHItPmxpc3QpOwotCQkJa2ZyZWUocHRyKTsKLQkJfQotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5ic3NfbGlzdF9zcGlubG9jaywgZmxhZ3MpOwotCS8qIHJlc3RhcnQgdGhlIHRpbWVyICovCi0JbW9kX3RpbWVyKCZwcml2LT5ic3NfbGlzdF90aW1lciwgamlmZmllcyArIEJTU19MSVNUX1RJTUVPVVQpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgYXQ3Nl9zZXRfbWFjX3N0YXRlKHN0cnVjdCBhdDc2X3ByaXYgKnByaXYsCi0JCQkJICAgICAgZW51bSBtYWNfc3RhdGUgbWFjX3N0YXRlKQotewotCWF0NzZfZGJnKERCR19NQUNfU1RBVEUsICIlcyBzdGF0ZTogJXMiLCBwcml2LT5uZXRkZXYtPm5hbWUsCi0JCSBtYWNfc3RhdGVzW21hY19zdGF0ZV0pOwotCXByaXYtPm1hY19zdGF0ZSA9IG1hY19zdGF0ZTsKLX0KLQotc3RhdGljIHZvaWQgYXQ3Nl9kdW1wX2Jzc190YWJsZShzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2KQotewotCXN0cnVjdCBic3NfaW5mbyAqcHRyOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqbHB0cjsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5ic3NfbGlzdF9zcGlubG9jaywgZmxhZ3MpOwotCi0JYXQ3Nl9kYmcoREJHX0JTU19UQUJMRSwgIiVzIEJTUyB0YWJsZSAoY3Vycj0lcCk6IiwgcHJpdi0+bmV0ZGV2LT5uYW1lLAotCQkgcHJpdi0+Y3Vycl9ic3MpOwotCi0JbGlzdF9mb3JfZWFjaChscHRyLCAmcHJpdi0+YnNzX2xpc3QpIHsKLQkJcHRyID0gbGlzdF9lbnRyeShscHRyLCBzdHJ1Y3QgYnNzX2luZm8sIGxpc3QpOwotCQlhdDc2X2RiZyhEQkdfQlNTX1RBQkxFLCAiMHglcDogYnNzaWQgJXMgY2hhbm5lbCAlZCBzc2lkICUuKnMgIgotCQkJICIoJXMpIGNhcGEgMHglMDR4IHJhdGVzICVzIHJzc2kgJWQgbGluayAlZCBub2lzZSAlZCIsCi0JCQkgcHRyLCBtYWMyc3RyKHB0ci0+YnNzaWQpLCBwdHItPmNoYW5uZWwsIHB0ci0+c3NpZF9sZW4sCi0JCQkgcHRyLT5zc2lkLCBoZXgyc3RyKHB0ci0+c3NpZCwgcHRyLT5zc2lkX2xlbiksCi0JCQkgcHRyLT5jYXBhLCBoZXgyc3RyKHB0ci0+cmF0ZXMsIHB0ci0+cmF0ZXNfbGVuKSwKLQkJCSBwdHItPnJzc2ksIHB0ci0+bGlua19xdWFsLCBwdHItPm5vaXNlX2xldmVsKTsKLQl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+YnNzX2xpc3Rfc3BpbmxvY2ssIGZsYWdzKTsKLX0KLQotLyogQ2FsbGVkIHVwb24gc3VjY2Vzc2Z1bCBhc3NvY2lhdGlvbiB0byBtYXJrIGludGVyZmFjZSBhcyBjb25uZWN0ZWQgKi8KLXN0YXRpYyB2b2lkIGF0NzZfd29ya19hc3NvY19kb25lKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKLXsKLQlzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBhdDc2X3ByaXYsCi0JCQkJCSAgICAgIHdvcmtfYXNzb2NfZG9uZSk7Ci0KLQltdXRleF9sb2NrKCZwcml2LT5tdHgpOwotCi0JV0FSTl9PTihwcml2LT5tYWNfc3RhdGUgIT0gTUFDX0FTU09DKTsKLQlXQVJOX09OKCFwcml2LT5jdXJyX2Jzcyk7Ci0JaWYgKHByaXYtPm1hY19zdGF0ZSAhPSBNQUNfQVNTT0MgfHwgIXByaXYtPmN1cnJfYnNzKQotCQlnb3RvIGV4aXQ7Ci0KLQlpZiAocHJpdi0+aXdfbW9kZSA9PSBJV19NT0RFX0lORlJBKSB7Ci0JCWlmIChwcml2LT5wbV9tb2RlICE9IEFUNzZfUE1fT0ZGKSB7Ci0JCQkvKiBjYWxjdWxhdGUgdGhlIGxpc3RlbiBpbnRlcnZhbCBpbiB1bml0cyBvZgotCQkJICAgYmVhY29uIGludGVydmFscyBvZiB0aGUgY3Vycl9ic3MgKi8KLQkJCXUzMiBwbV9wZXJpb2RfYmVhY29uID0gKHByaXYtPnBtX3BlcmlvZCA+PiAxMCkgLwotCQkJICAgIHByaXYtPmN1cnJfYnNzLT5iZWFjb25faW50ZXJ2YWw7Ci0KLQkJCXBtX3BlcmlvZF9iZWFjb24gPSBtYXgocG1fcGVyaW9kX2JlYWNvbiwgMnUpOwotCQkJcG1fcGVyaW9kX2JlYWNvbiA9IG1pbihwbV9wZXJpb2RfYmVhY29uLCAweGZmZmZ1KTsKLQotCQkJYXQ3Nl9kYmcoREJHX1BNLAotCQkJCSAiJXM6IHBtX21vZGUgJWQgYXNzb2MgaWQgMHgleCBsaXN0ZW4gaW50ICVkIiwKLQkJCQkgcHJpdi0+bmV0ZGV2LT5uYW1lLCBwcml2LT5wbV9tb2RlLAotCQkJCSBwcml2LT5hc3NvY19pZCwgcG1fcGVyaW9kX2JlYWNvbik7Ci0KLQkJCWF0NzZfc2V0X2Fzc29jaWQocHJpdiwgcHJpdi0+YXNzb2NfaWQpOwotCQkJYXQ3Nl9zZXRfbGlzdGVuX2ludGVydmFsKHByaXYsICh1MTYpcG1fcGVyaW9kX2JlYWNvbik7Ci0JCX0KLQkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZwcml2LT5kd29ya19iZWFjb24sIEJFQUNPTl9USU1FT1VUKTsKLQl9Ci0JYXQ3Nl9zZXRfcG1fbW9kZShwcml2KTsKLQotCW5ldGlmX2NhcnJpZXJfb24ocHJpdi0+bmV0ZGV2KTsKLQluZXRpZl93YWtlX3F1ZXVlKHByaXYtPm5ldGRldik7Ci0JYXQ3Nl9zZXRfbWFjX3N0YXRlKHByaXYsIE1BQ19DT05ORUNURUQpOwotCWF0NzZfaXdldmVudF9ic3NfY29ubmVjdChwcml2LT5uZXRkZXYsIHByaXYtPmN1cnJfYnNzLT5ic3NpZCk7Ci0JYXQ3Nl9kYmcoREJHX1BST0dSRVNTLCAiJXM6IGNvbm5lY3RlZCB0byBCU1NJRCAlcyIsCi0JCSBwcml2LT5uZXRkZXYtPm5hbWUsIG1hYzJzdHIocHJpdi0+Y3Vycl9ic3MtPmJzc2lkKSk7Ci0KLWV4aXQ6Ci0JbXV0ZXhfdW5sb2NrKCZwcml2LT5tdHgpOwotfQotCi0vKiBXZSBvbmx5IHN0b3JlIHRoZSBuZXcgbWFjIGFkZHJlc3MgaW4gbmV0ZGV2IHN0cnVjdCwKLSAgIGl0IGdldHMgc2V0IHdoZW4gdGhlIG5ldGRldiBpcyBvcGVuZWQuICovCi1zdGF0aWMgaW50IGF0NzZfc2V0X21hY19hZGRyZXNzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHZvaWQgKmFkZHIpCi17Ci0Jc3RydWN0IHNvY2thZGRyICptYWMgPSBhZGRyOwotCW1lbWNweShuZXRkZXYtPmRldl9hZGRyLCBtYWMtPnNhX2RhdGEsIEVUSF9BTEVOKTsKLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICphdDc2X2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQotewotCXN0cnVjdCBhdDc2X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwotCXJldHVybiAmcHJpdi0+c3RhdHM7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaXdfc3RhdGlzdGljcyAqYXQ3Nl9nZXRfd2lyZWxlc3Nfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKLXsKLQlzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKLQotCWF0NzZfZGJnKERCR19JT0NUTCwgIlJFVFVSTiBxdWFsICVkIGxldmVsICVkIG5vaXNlICVkIHVwZGF0ZWQgJWQiLAotCQkgcHJpdi0+d3N0YXRzLnF1YWwucXVhbCwgcHJpdi0+d3N0YXRzLnF1YWwubGV2ZWwsCi0JCSBwcml2LT53c3RhdHMucXVhbC5ub2lzZSwgcHJpdi0+d3N0YXRzLnF1YWwudXBkYXRlZCk7Ci0KLQlyZXR1cm4gJnByaXYtPndzdGF0czsKLX0KLQotc3RhdGljIHZvaWQgYXQ3Nl9zZXRfbXVsdGljYXN0KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCi17Ci0Jc3RydWN0IGF0NzZfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KG5ldGRldik7Ci0JaW50IHByb21pc2M7Ci0KLQlwcm9taXNjID0gKChuZXRkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpICE9IDApOwotCWlmIChwcm9taXNjICE9IHByaXYtPnByb21pc2MpIHsKLQkJLyogVGhpcyBnZXRzIGNhbGxlZCBpbiBpbnRlcnJ1cHQsIG11c3QgcmVzY2hlZHVsZSAqLwotCQlwcml2LT5wcm9taXNjID0gcHJvbWlzYzsKLQkJc2NoZWR1bGVfd29yaygmcHJpdi0+d29ya19zZXRfcHJvbWlzYyk7Ci0JfQotfQotCi0vKiBTdG9wIGFsbCBuZXR3b3JrIGFjdGl2aXR5LCBmbHVzaCBhbGwgcGVuZGluZyB0YXNrcyAqLwotc3RhdGljIHZvaWQgYXQ3Nl9xdWllc2NlKHN0cnVjdCBhdDc2X3ByaXYgKnByaXYpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCW5ldGlmX3N0b3BfcXVldWUocHJpdi0+bmV0ZGV2KTsKLQluZXRpZl9jYXJyaWVyX29mZihwcml2LT5uZXRkZXYpOwotCi0JYXQ3Nl9zZXRfbWFjX3N0YXRlKHByaXYsIE1BQ19JTklUKTsKLQotCWNhbmNlbF9kZWxheWVkX3dvcmsoJnByaXYtPmR3b3JrX2dldF9zY2FuKTsKLQljYW5jZWxfZGVsYXllZF93b3JrKCZwcml2LT5kd29ya19iZWFjb24pOwotCWNhbmNlbF9kZWxheWVkX3dvcmsoJnByaXYtPmR3b3JrX2F1dGgpOwotCWNhbmNlbF9kZWxheWVkX3dvcmsoJnByaXYtPmR3b3JrX2Fzc29jKTsKLQljYW5jZWxfZGVsYXllZF93b3JrKCZwcml2LT5kd29ya19yZXN0YXJ0KTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5tZ210X3NwaW5sb2NrLCBmbGFncyk7Ci0Ja2ZyZWUocHJpdi0+bmV4dF9tZ210X2J1bGspOwotCXByaXYtPm5leHRfbWdtdF9idWxrID0gTlVMTDsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5tZ210X3NwaW5sb2NrLCBmbGFncyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBhdDc2X3ByaXYgaW1wbGVtZW50YXRpb25zIG9mIGl3X2hhbmRsZXIgZnVuY3Rpb25zOgotICovCi1zdGF0aWMgaW50IGF0NzZfaXdfaGFuZGxlcl9jb21taXQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKLQkJCQkgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkJICB2b2lkICpudWxsLCBjaGFyICpleHRyYSkKLXsKLQlzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKLQotCWF0NzZfZGJnKERCR19JT0NUTCwgIiVzICVzOiByZXN0YXJ0aW5nIHRoZSBkZXZpY2UiLCBuZXRkZXYtPm5hbWUsCi0JCSBfX2Z1bmNfXyk7Ci0KLQlpZiAocHJpdi0+bWFjX3N0YXRlICE9IE1BQ19JTklUKQotCQlhdDc2X3F1aWVzY2UocHJpdik7Ci0KLQkvKiBXYWl0IGhhbGYgc2Vjb25kIGJlZm9yZSB0aGUgcmVzdGFydCB0byBwcm9jZXNzIHN1YnNlcXVlbnQKLQkgKiByZXF1ZXN0cyBmcm9tIHRoZSBzYW1lIGl3Y29uZmlnIGluIGEgc2luZ2xlIHJlc3RhcnQgKi8KLQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJnByaXYtPmR3b3JrX3Jlc3RhcnQsIEhaIC8gMik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBhdDc2X2l3X2hhbmRsZXJfZ2V0X25hbWUoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKLQkJCQkgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCQkgICAgY2hhciAqbmFtZSwgY2hhciAqZXh0cmEpCi17Ci0Jc3RyY3B5KG5hbWUsICJJRUVFIDgwMi4xMWIiKTsKLQlhdDc2X2RiZyhEQkdfSU9DVEwsICIlczogU0lPQ0dJV05BTUUgLSBuYW1lICVzIiwgbmV0ZGV2LT5uYW1lLCBuYW1lKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBhdDc2X2l3X2hhbmRsZXJfc2V0X2ZyZXEoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKLQkJCQkgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCQkgICAgc3RydWN0IGl3X2ZyZXEgKmZyZXEsIGNoYXIgKmV4dHJhKQotewotCXN0cnVjdCBhdDc2X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwotCWludCBjaGFuID0gLTE7Ci0JaW50IHJldCA9IC1FSVdDT01NSVQ7Ci0JYXQ3Nl9kYmcoREJHX0lPQ1RMLCAiJXM6IFNJT0NTSVdGUkVRIC0gZnJlcS5tICVkIGZyZXEuZSAlZCIsCi0JCSBuZXRkZXYtPm5hbWUsIGZyZXEtPm0sIGZyZXEtPmUpOwotCi0JaWYgKChmcmVxLT5lID09IDApICYmIChmcmVxLT5tIDw9IDEwMDApKQotCQkvKiBTZXR0aW5nIGJ5IGNoYW5uZWwgbnVtYmVyICovCi0JCWNoYW4gPSBmcmVxLT5tOwotCWVsc2UgewotCQkvKiBTZXR0aW5nIGJ5IGZyZXF1ZW5jeSAtIHNlYXJjaCB0aGUgdGFibGUgKi8KLQkJaW50IG11bHQgPSAxOwotCQlpbnQgaTsKLQotCQlmb3IgKGkgPSAwOyBpIDwgKDYgLSBmcmVxLT5lKTsgaSsrKQotCQkJbXVsdCAqPSAxMDsKLQotCQlmb3IgKGkgPSAwOyBpIDwgTlVNX0NIQU5ORUxTOyBpKyspIHsKLQkJCWlmIChmcmVxLT5tID09IChjaGFubmVsX2ZyZXF1ZW5jeVtpXSAqIG11bHQpKQotCQkJCWNoYW4gPSBpICsgMTsKLQkJfQotCX0KLQotCWlmIChjaGFuIDwgMSB8fCAhcHJpdi0+ZG9tYWluKQotCQkvKiBub24tcG9zaXRpdmUgY2hhbm5lbHMgYXJlIGludmFsaWQKLQkJICogd2UgbmVlZCBhIGRvbWFpbiBpbmZvIHRvIHNldCB0aGUgY2hhbm5lbAotCQkgKiBlaXRoZXIgdGhhdCBvciBhbiBpbnZhbGlkIGZyZXF1ZW5jeSB3YXMKLQkJICogcHJvdmlkZWQgYnkgdGhlIHVzZXIgKi8KLQkJcmV0ID0gLUVJTlZBTDsKLQllbHNlIGlmICghKHByaXYtPmRvbWFpbi0+Y2hhbm5lbF9tYXAgJiAoMSA8PCAoY2hhbiAtIDEpKSkpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGNoYW5uZWwgJWQgbm90IGFsbG93ZWQgZm9yIGRvbWFpbiAlc1xuIiwKLQkJICAgICAgIHByaXYtPm5ldGRldi0+bmFtZSwgY2hhbiwgcHJpdi0+ZG9tYWluLT5uYW1lKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQl9Ci0KLQlpZiAocmV0ID09IC1FSVdDT01NSVQpIHsKLQkJcHJpdi0+Y2hhbm5lbCA9IGNoYW47Ci0JCWF0NzZfZGJnKERCR19JT0NUTCwgIiVzOiBTSU9DU0lXRlJFUSAtIGNoICVkIiwgbmV0ZGV2LT5uYW1lLAotCQkJIGNoYW4pOwotCX0KLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgYXQ3Nl9pd19oYW5kbGVyX2dldF9mcmVxKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCi0JCQkJICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkJICAgIHN0cnVjdCBpd19mcmVxICpmcmVxLCBjaGFyICpleHRyYSkKLXsKLQlzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKLQotCWZyZXEtPm0gPSBwcml2LT5jaGFubmVsOwotCWZyZXEtPmUgPSAwOwotCi0JaWYgKHByaXYtPmNoYW5uZWwpCi0JCWF0NzZfZGJnKERCR19JT0NUTCwgIiVzOiBTSU9DR0lXRlJFUSAtIGZyZXEgJWxkIHggMTBlJWQiLAotCQkJIG5ldGRldi0+bmFtZSwgY2hhbm5lbF9mcmVxdWVuY3lbcHJpdi0+Y2hhbm5lbCAtIDFdLCA2KTsKLQotCWF0NzZfZGJnKERCR19JT0NUTCwgIiVzOiBTSU9DR0lXRlJFUSAtIGNoICVkIiwgbmV0ZGV2LT5uYW1lLAotCQkgcHJpdi0+Y2hhbm5lbCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBhdDc2X2l3X2hhbmRsZXJfc2V0X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKLQkJCQkgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCQkgICAgX191MzIgKm1vZGUsIGNoYXIgKmV4dHJhKQotewotCXN0cnVjdCBhdDc2X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwotCi0JYXQ3Nl9kYmcoREJHX0lPQ1RMLCAiJXM6IFNJT0NTSVdNT0RFIC0gJWQiLCBuZXRkZXYtPm5hbWUsICptb2RlKTsKLQotCWlmICgoKm1vZGUgIT0gSVdfTU9ERV9BREhPQykgJiYgKCptb2RlICE9IElXX01PREVfSU5GUkEpICYmCi0JICAgICgqbW9kZSAhPSBJV19NT0RFX01PTklUT1IpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXByaXYtPml3X21vZGUgPSAqbW9kZTsKLQlpZiAocHJpdi0+aXdfbW9kZSAhPSBJV19NT0RFX0lORlJBKQotCQlwcml2LT5wbV9tb2RlID0gQVQ3Nl9QTV9PRkY7Ci0KLQlyZXR1cm4gLUVJV0NPTU1JVDsKLX0KLQotc3RhdGljIGludCBhdDc2X2l3X2hhbmRsZXJfZ2V0X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKLQkJCQkgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCQkgICAgX191MzIgKm1vZGUsIGNoYXIgKmV4dHJhKQotewotCXN0cnVjdCBhdDc2X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwotCi0JKm1vZGUgPSBwcml2LT5pd19tb2RlOwotCi0JYXQ3Nl9kYmcoREJHX0lPQ1RMLCAiJXM6IFNJT0NHSVdNT0RFIC0gJWQiLCBuZXRkZXYtPm5hbWUsICptb2RlKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGF0NzZfaXdfaGFuZGxlcl9nZXRfcmFuZ2Uoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKLQkJCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkJICAgICBzdHJ1Y3QgaXdfcG9pbnQgKmRhdGEsIGNoYXIgKmV4dHJhKQotewotCS8qIGluc3BpcmVkIGJ5IGF0bWVsLmMgKi8KLQlzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKLQlzdHJ1Y3QgaXdfcmFuZ2UgKnJhbmdlID0gKHN0cnVjdCBpd19yYW5nZSAqKWV4dHJhOwotCWludCBpOwotCi0JZGF0YS0+bGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCBpd19yYW5nZSk7Ci0JbWVtc2V0KHJhbmdlLCAwLCBzaXplb2Yoc3RydWN0IGl3X3JhbmdlKSk7Ci0KLQkvKiBUT0RPOiByYW5nZS0+dGhyb3VnaHB1dCA9IHh4eHh4eDsgKi8KLQotCXJhbmdlLT5taW5fbndpZCA9IDB4MDAwMDsKLQlyYW5nZS0+bWF4X253aWQgPSAweDAwMDA7Ci0KLQkvKiB0aGlzIGRyaXZlciBkb2Vzbid0IG1haW50YWluIHNlbnNpdGl2aXR5IGluZm9ybWF0aW9uICovCi0JcmFuZ2UtPnNlbnNpdGl2aXR5ID0gMDsKLQotCXJhbmdlLT5tYXhfcXVhbC5xdWFsID0gMTAwOwotCXJhbmdlLT5tYXhfcXVhbC5sZXZlbCA9IDEwMDsKLQlyYW5nZS0+bWF4X3F1YWwubm9pc2UgPSAwOwotCXJhbmdlLT5tYXhfcXVhbC51cGRhdGVkID0gSVdfUVVBTF9OT0lTRV9JTlZBTElEOwotCi0JcmFuZ2UtPmF2Z19xdWFsLnF1YWwgPSA1MDsKLQlyYW5nZS0+YXZnX3F1YWwubGV2ZWwgPSA1MDsKLQlyYW5nZS0+YXZnX3F1YWwubm9pc2UgPSAwOwotCXJhbmdlLT5hdmdfcXVhbC51cGRhdGVkID0gSVdfUVVBTF9OT0lTRV9JTlZBTElEOwotCi0JcmFuZ2UtPmJpdHJhdGVbMF0gPSAxMDAwMDAwOwotCXJhbmdlLT5iaXRyYXRlWzFdID0gMjAwMDAwMDsKLQlyYW5nZS0+Yml0cmF0ZVsyXSA9IDU1MDAwMDA7Ci0JcmFuZ2UtPmJpdHJhdGVbM10gPSAxMTAwMDAwMDsKLQlyYW5nZS0+bnVtX2JpdHJhdGVzID0gNDsKLQotCXJhbmdlLT5taW5fcnRzID0gMDsKLQlyYW5nZS0+bWF4X3J0cyA9IE1BWF9SVFNfVEhSRVNIT0xEOwotCi0JcmFuZ2UtPm1pbl9mcmFnID0gTUlOX0ZSQUdfVEhSRVNIT0xEOwotCXJhbmdlLT5tYXhfZnJhZyA9IE1BWF9GUkFHX1RIUkVTSE9MRDsKLQotCXJhbmdlLT5wbXBfZmxhZ3MgPSBJV19QT1dFUl9QRVJJT0Q7Ci0JcmFuZ2UtPnBtdF9mbGFncyA9IElXX1BPV0VSX09OOwotCXJhbmdlLT5wbV9jYXBhID0gSVdfUE9XRVJfUEVSSU9EIHwgSVdfUE9XRVJfQUxMX1I7Ci0KLQlyYW5nZS0+ZW5jb2Rpbmdfc2l6ZVswXSA9IFdFUF9TTUFMTF9LRVlfTEVOOwotCXJhbmdlLT5lbmNvZGluZ19zaXplWzFdID0gV0VQX0xBUkdFX0tFWV9MRU47Ci0JcmFuZ2UtPm51bV9lbmNvZGluZ19zaXplcyA9IDI7Ci0JcmFuZ2UtPm1heF9lbmNvZGluZ190b2tlbnMgPSBXRVBfS0VZUzsKLQotCS8qIGJvdGggV0wtMjQwVSBhbmQgTGlua3N5cyBXVVNCMTEgdjIuNiBzcGVjaWZ5IDE1IGRCbSBhcyBvdXRwdXQgcG93ZXIKLQkgICAtIHRha2UgdGhpcyBmb3IgYWxsIChpZ25vcmUgYW50ZW5uYSBnYWlucykgKi8KLQlyYW5nZS0+dHhwb3dlclswXSA9IDE1OwotCXJhbmdlLT5udW1fdHhwb3dlciA9IDE7Ci0JcmFuZ2UtPnR4cG93ZXJfY2FwYSA9IElXX1RYUE9XX0RCTTsKLQotCXJhbmdlLT53ZV92ZXJzaW9uX3NvdXJjZSA9IFdJUkVMRVNTX0VYVDsKLQlyYW5nZS0+d2VfdmVyc2lvbl9jb21waWxlZCA9IFdJUkVMRVNTX0VYVDsKLQotCS8qIHNhbWUgYXMgdGhlIHZhbHVlcyB1c2VkIGluIGF0bWVsLmMgKi8KLQlyYW5nZS0+cmV0cnlfY2FwYSA9IElXX1JFVFJZX0xJTUlUOwotCXJhbmdlLT5yZXRyeV9mbGFncyA9IElXX1JFVFJZX0xJTUlUOwotCXJhbmdlLT5yX3RpbWVfZmxhZ3MgPSAwOwotCXJhbmdlLT5taW5fcmV0cnkgPSAxOwotCXJhbmdlLT5tYXhfcmV0cnkgPSAyNTU7Ci0KLQlyYW5nZS0+bnVtX2NoYW5uZWxzID0gTlVNX0NIQU5ORUxTOwotCXJhbmdlLT5udW1fZnJlcXVlbmN5ID0gMDsKLQotCWZvciAoaSA9IDA7IGkgPCBOVU1fQ0hBTk5FTFM7IGkrKykgewotCQkvKiB0ZXN0IGlmIGNoYW5uZWwgbWFwIGJpdCBpcyByYWlzZWQgKi8KLQkJaWYgKHByaXYtPmRvbWFpbi0+Y2hhbm5lbF9tYXAgJiAoMHgxIDw8IGkpKSB7Ci0JCQlyYW5nZS0+bnVtX2ZyZXF1ZW5jeSArPSAxOwotCi0JCQlyYW5nZS0+ZnJlcVtpXS5pID0gaSArIDE7Ci0JCQlyYW5nZS0+ZnJlcVtpXS5tID0gY2hhbm5lbF9mcmVxdWVuY3lbaV0gKiAxMDAwMDA7Ci0JCQlyYW5nZS0+ZnJlcVtpXS5lID0gMTsJLyogZnJlcSAqIDEwXjEgKi8KLQkJfQotCX0KLQotCWF0NzZfZGJnKERCR19JT0NUTCwgIiVzOiBTSU9DR0lXUkFOR0UiLCBuZXRkZXYtPm5hbWUpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgYXQ3Nl9pd19oYW5kbGVyX3NldF9zcHkoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKLQkJCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkJCSAgIHN0cnVjdCBpd19wb2ludCAqZGF0YSwgY2hhciAqZXh0cmEpCi17Ci0Jc3RydWN0IGF0NzZfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KG5ldGRldik7Ci0JaW50IHJldCA9IDA7Ci0KLQlhdDc2X2RiZyhEQkdfSU9DVEwsICIlczogU0lPQ1NJV1NQWSAtIG51bWJlciBvZiBhZGRyZXNzZXMgJWQiLAotCQkgbmV0ZGV2LT5uYW1lLCBkYXRhLT5sZW5ndGgpOwotCi0Jc3Bpbl9sb2NrX2JoKCZwcml2LT5zcHlfc3BpbmxvY2spOwotCXJldCA9IGl3X2hhbmRsZXJfc2V0X3NweShwcml2LT5uZXRkZXYsIGluZm8sICh1bmlvbiBpd3JlcV9kYXRhICopZGF0YSwKLQkJCQkgZXh0cmEpOwotCXNwaW5fdW5sb2NrX2JoKCZwcml2LT5zcHlfc3BpbmxvY2spOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBhdDc2X2l3X2hhbmRsZXJfZ2V0X3NweShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAotCQkJCSAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkJICAgc3RydWN0IGl3X3BvaW50ICpkYXRhLCBjaGFyICpleHRyYSkKLXsKLQotCXN0cnVjdCBhdDc2X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwotCWludCByZXQgPSAwOwotCi0Jc3Bpbl9sb2NrX2JoKCZwcml2LT5zcHlfc3BpbmxvY2spOwotCXJldCA9IGl3X2hhbmRsZXJfZ2V0X3NweShwcml2LT5uZXRkZXYsIGluZm8sCi0JCQkJICh1bmlvbiBpd3JlcV9kYXRhICopZGF0YSwgZXh0cmEpOwotCXNwaW5fdW5sb2NrX2JoKCZwcml2LT5zcHlfc3BpbmxvY2spOwotCi0JYXQ3Nl9kYmcoREJHX0lPQ1RMLCAiJXM6IFNJT0NHSVdTUFkgLSBudW1iZXIgb2YgYWRkcmVzc2VzICVkIiwKLQkJIG5ldGRldi0+bmFtZSwgZGF0YS0+bGVuZ3RoKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgYXQ3Nl9pd19oYW5kbGVyX3NldF90aHJzcHkoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKLQkJCQkgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkJCSAgICAgIHN0cnVjdCBpd19wb2ludCAqZGF0YSwgY2hhciAqZXh0cmEpCi17Ci0Jc3RydWN0IGF0NzZfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KG5ldGRldik7Ci0JaW50IHJldDsKLQotCWF0NzZfZGJnKERCR19JT0NUTCwgIiVzOiBTSU9DU0lXVEhSU1BZIC0gbnVtYmVyIG9mIGFkZHJlc3NlcyAlZCkiLAotCQkgbmV0ZGV2LT5uYW1lLCBkYXRhLT5sZW5ndGgpOwotCi0Jc3Bpbl9sb2NrX2JoKCZwcml2LT5zcHlfc3BpbmxvY2spOwotCXJldCA9IGl3X2hhbmRsZXJfc2V0X3RocnNweShuZXRkZXYsIGluZm8sICh1bmlvbiBpd3JlcV9kYXRhICopZGF0YSwKLQkJCQkgICAgZXh0cmEpOwotCXNwaW5fdW5sb2NrX2JoKCZwcml2LT5zcHlfc3BpbmxvY2spOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBhdDc2X2l3X2hhbmRsZXJfZ2V0X3RocnNweShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAotCQkJCSAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkJICAgICAgc3RydWN0IGl3X3BvaW50ICpkYXRhLCBjaGFyICpleHRyYSkKLXsKLQlzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKLQlpbnQgcmV0OwotCi0Jc3Bpbl9sb2NrX2JoKCZwcml2LT5zcHlfc3BpbmxvY2spOwotCXJldCA9IGl3X2hhbmRsZXJfZ2V0X3RocnNweShuZXRkZXYsIGluZm8sICh1bmlvbiBpd3JlcV9kYXRhICopZGF0YSwKLQkJCQkgICAgZXh0cmEpOwotCXNwaW5fdW5sb2NrX2JoKCZwcml2LT5zcHlfc3BpbmxvY2spOwotCi0JYXQ3Nl9kYmcoREJHX0lPQ1RMLCAiJXM6IFNJT0NHSVdUSFJTUFkgLSBudW1iZXIgb2YgYWRkcmVzc2VzICVkKSIsCi0JCSBuZXRkZXYtPm5hbWUsIGRhdGEtPmxlbmd0aCk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGF0NzZfaXdfaGFuZGxlcl9zZXRfd2FwKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCi0JCQkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCQkgICBzdHJ1Y3Qgc29ja2FkZHIgKmFwX2FkZHIsIGNoYXIgKmV4dHJhKQotewotCXN0cnVjdCBhdDc2X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwotCi0JYXQ3Nl9kYmcoREJHX0lPQ1RMLCAiJXM6IFNJT0NTSVdBUCAtIHdhcC9ic3NpZCAlcyIsIG5ldGRldi0+bmFtZSwKLQkJIG1hYzJzdHIoYXBfYWRkci0+c2FfZGF0YSkpOwotCi0JLyogaWYgdGhlIGluY29taW5nIGFkZHJlc3MgPT0gZmY6ZmY6ZmY6ZmY6ZmY6ZmYsIHRoZSB1c2VyIGhhcwotCSAgIGNob3NlbiBhbnkgb3IgYXV0byBBUCBwcmVmZXJlbmNlICovCi0JaWYgKGlzX2Jyb2FkY2FzdF9ldGhlcl9hZGRyKGFwX2FkZHItPnNhX2RhdGEpCi0JICAgIHx8IGlzX3plcm9fZXRoZXJfYWRkcihhcF9hZGRyLT5zYV9kYXRhKSkKLQkJcHJpdi0+d2FudGVkX2Jzc2lkX3ZhbGlkID0gMDsKLQllbHNlIHsKLQkJLyogdXNlciB3YW50cyB0byBzZXQgYSBwcmVmZXJyZWQgQVAgYWRkcmVzcyAqLwotCQlwcml2LT53YW50ZWRfYnNzaWRfdmFsaWQgPSAxOwotCQltZW1jcHkocHJpdi0+d2FudGVkX2Jzc2lkLCBhcF9hZGRyLT5zYV9kYXRhLCBFVEhfQUxFTik7Ci0JfQotCi0JcmV0dXJuIC1FSVdDT01NSVQ7Ci19Ci0KLXN0YXRpYyBpbnQgYXQ3Nl9pd19oYW5kbGVyX2dldF93YXAoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKLQkJCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkJCSAgIHN0cnVjdCBzb2NrYWRkciAqYXBfYWRkciwgY2hhciAqZXh0cmEpCi17Ci0Jc3RydWN0IGF0NzZfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KG5ldGRldik7Ci0KLQlhcF9hZGRyLT5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7Ci0JbWVtY3B5KGFwX2FkZHItPnNhX2RhdGEsIHByaXYtPmJzc2lkLCBFVEhfQUxFTik7Ci0KLQlhdDc2X2RiZyhEQkdfSU9DVEwsICIlczogU0lPQ0dJV0FQIC0gd2FwL2Jzc2lkICVzIiwgbmV0ZGV2LT5uYW1lLAotCQkgbWFjMnN0cihhcF9hZGRyLT5zYV9kYXRhKSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBhdDc2X2l3X2hhbmRsZXJfc2V0X3NjYW4oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKLQkJCQkgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCQkgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCi17Ci0Jc3RydWN0IGF0NzZfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KG5ldGRldik7Ci0JaW50IHJldCA9IDA7Ci0KLQlhdDc2X2RiZyhEQkdfSU9DVEwsICIlczogU0lPQ1NJV1NDQU4iLCBuZXRkZXYtPm5hbWUpOwotCi0JaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmcHJpdi0+bXR4KSkKLQkJcmV0dXJuIC1FSU5UUjsKLQotCWlmICghbmV0aWZfcnVubmluZyhuZXRkZXYpKSB7Ci0JCXJldCA9IC1FTkVURE9XTjsKLQkJZ290byBleGl0OwotCX0KLQotCS8qIGphbDogd2UgZG9uJ3QgYWxsb3cgIml3bGlzdCBldGhYIHNjYW4iIHdoaWxlIHdlIGFyZQotCSAgIGluIG1vbml0b3IgbW9kZSAqLwotCWlmIChwcml2LT5pd19tb2RlID09IElXX01PREVfTU9OSVRPUikgewotCQlyZXQgPSAtRUJVU1k7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQkvKiBEaXNjYXJkIG9sZCBzY2FuIHJlc3VsdHMgKi8KLQlpZiAoKGppZmZpZXMgLSBwcml2LT5sYXN0X3NjYW4pID4gKDIwICogSFopKQotCQlwcml2LT5zY2FuX3N0YXRlID0gU0NBTl9JRExFOwotCXByaXYtPmxhc3Rfc2NhbiA9IGppZmZpZXM7Ci0KLQkvKiBJbml0aWF0ZSBhIHNjYW4gY29tbWFuZCAqLwotCWlmIChwcml2LT5zY2FuX3N0YXRlID09IFNDQU5fSU5fUFJPR1JFU1MpIHsKLQkJcmV0ID0gLUVCVVNZOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JcHJpdi0+c2Nhbl9zdGF0ZSA9IFNDQU5fSU5fUFJPR1JFU1M7Ci0KLQlhdDc2X3F1aWVzY2UocHJpdik7Ci0KLQkvKiBUcnkgdG8gZG8gcGFzc2l2ZSBvciBhY3RpdmUgc2NhbiBpZiBXRSBhc2tzIGFzLiAqLwotCWlmICh3cnF1LT5kYXRhLmxlbmd0aAotCSAgICAmJiB3cnF1LT5kYXRhLmxlbmd0aCA9PSBzaXplb2Yoc3RydWN0IGl3X3NjYW5fcmVxKSkgewotCQlzdHJ1Y3QgaXdfc2Nhbl9yZXEgKnJlcSA9IChzdHJ1Y3QgaXdfc2Nhbl9yZXEgKilleHRyYTsKLQotCQlpZiAocmVxLT5zY2FuX3R5cGUgPT0gSVdfU0NBTl9UWVBFX1BBU1NJVkUpCi0JCQlwcml2LT5zY2FuX21vZGUgPSBTQ0FOX1RZUEVfUEFTU0lWRTsKLQkJZWxzZSBpZiAocmVxLT5zY2FuX3R5cGUgPT0gSVdfU0NBTl9UWVBFX0FDVElWRSkKLQkJCXByaXYtPnNjYW5fbW9kZSA9IFNDQU5fVFlQRV9BQ1RJVkU7Ci0KLQkJLyogU2FuaXR5IGNoZWNrIHZhbHVlcz8gKi8KLQkJaWYgKHJlcS0+bWluX2NoYW5uZWxfdGltZSA+IDApCi0JCQlwcml2LT5zY2FuX21pbl90aW1lID0gcmVxLT5taW5fY2hhbm5lbF90aW1lOwotCi0JCWlmIChyZXEtPm1heF9jaGFubmVsX3RpbWUgPiAwKQotCQkJcHJpdi0+c2Nhbl9tYXhfdGltZSA9IHJlcS0+bWF4X2NoYW5uZWxfdGltZTsKLQl9Ci0KLQkvKiBjaGFuZ2UgdG8gc2Nhbm5pbmcgc3RhdGUgKi8KLQlhdDc2X3NldF9tYWNfc3RhdGUocHJpdiwgTUFDX1NDQU5OSU5HKTsKLQlzY2hlZHVsZV93b3JrKCZwcml2LT53b3JrX3N0YXJ0X3NjYW4pOwotCi1leGl0OgotCW11dGV4X3VubG9jaygmcHJpdi0+bXR4KTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGF0NzZfaXdfaGFuZGxlcl9nZXRfc2NhbihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAotCQkJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkJCSAgICBzdHJ1Y3QgaXdfcG9pbnQgKmRhdGEsIGNoYXIgKmV4dHJhKQotewotCXN0cnVjdCBhdDc2X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqbHB0ciwgKm5wdHI7Ci0Jc3RydWN0IGJzc19pbmZvICpjdXJyX2JzczsKLQlzdHJ1Y3QgaXdfZXZlbnQgKml3ZSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpd19ldmVudCksIEdGUF9LRVJORUwpOwotCWNoYXIgKmN1cnJfdmFsLCAqY3Vycl9wb3MgPSBleHRyYTsKLQlpbnQgaTsKLQotCWF0NzZfZGJnKERCR19JT0NUTCwgIiVzOiBTSU9DR0lXU0NBTiIsIG5ldGRldi0+bmFtZSk7Ci0KLQlpZiAoIWl3ZSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlpZiAocHJpdi0+c2Nhbl9zdGF0ZSAhPSBTQ0FOX0NPTVBMRVRFRCkgewotCQkvKiBzY2FuIG5vdCB5ZXQgZmluaXNoZWQgKi8KLQkJa2ZyZWUoaXdlKTsKLQkJcmV0dXJuIC1FQUdBSU47Ci0JfQotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmJzc19saXN0X3NwaW5sb2NrLCBmbGFncyk7Ci0KLQlsaXN0X2Zvcl9lYWNoX3NhZmUobHB0ciwgbnB0ciwgJnByaXYtPmJzc19saXN0KSB7Ci0JCWN1cnJfYnNzID0gbGlzdF9lbnRyeShscHRyLCBzdHJ1Y3QgYnNzX2luZm8sIGxpc3QpOwotCi0JCWl3ZS0+Y21kID0gU0lPQ0dJV0FQOwotCQlpd2UtPnUuYXBfYWRkci5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7Ci0JCW1lbWNweShpd2UtPnUuYXBfYWRkci5zYV9kYXRhLCBjdXJyX2Jzcy0+YnNzaWQsIDYpOwotCQljdXJyX3BvcyA9IGl3ZV9zdHJlYW1fYWRkX2V2ZW50KGluZm8sIGN1cnJfcG9zLAotCQkJCQkJZXh0cmEgKyBJV19TQ0FOX01BWF9EQVRBLCBpd2UsCi0JCQkJCQlJV19FVl9BRERSX0xFTik7Ci0KLQkJaXdlLT51LmRhdGEubGVuZ3RoID0gY3Vycl9ic3MtPnNzaWRfbGVuOwotCQlpd2UtPmNtZCA9IFNJT0NHSVdFU1NJRDsKLQkJaXdlLT51LmRhdGEuZmxhZ3MgPSAxOwotCi0JCWN1cnJfcG9zID0gaXdlX3N0cmVhbV9hZGRfcG9pbnQoaW5mbywgY3Vycl9wb3MsCi0JCQkJCQlleHRyYSArIElXX1NDQU5fTUFYX0RBVEEsIGl3ZSwKLQkJCQkJCWN1cnJfYnNzLT5zc2lkKTsKLQotCQlpd2UtPmNtZCA9IFNJT0NHSVdNT0RFOwotCQlpd2UtPnUubW9kZSA9IChjdXJyX2Jzcy0+Y2FwYSAmIFdMQU5fQ0FQQUJJTElUWV9JQlNTKSA/Ci0JCSAgICBJV19NT0RFX0FESE9DIDoKLQkJICAgIChjdXJyX2Jzcy0+Y2FwYSAmIFdMQU5fQ0FQQUJJTElUWV9FU1MpID8KLQkJICAgIElXX01PREVfTUFTVEVSIDogSVdfTU9ERV9BVVRPOwotCQkvKiBJV19NT0RFX0FVVE8gPSAwIHdoaWNoIEkgdGhvdWdodCBpcwotCQkgKiB0aGUgbW9zdCBsb2dpY2FsIHZhbHVlIHRvIHJldHVybiBpbiB0aGlzIGNhc2UgKi8KLQkJY3Vycl9wb3MgPSBpd2Vfc3RyZWFtX2FkZF9ldmVudChpbmZvLCBjdXJyX3BvcywKLQkJCQkJCWV4dHJhICsgSVdfU0NBTl9NQVhfREFUQSwgaXdlLAotCQkJCQkJSVdfRVZfVUlOVF9MRU4pOwotCi0JCWl3ZS0+Y21kID0gU0lPQ0dJV0ZSRVE7Ci0JCWl3ZS0+dS5mcmVxLm0gPSBjdXJyX2Jzcy0+Y2hhbm5lbDsKLQkJaXdlLT51LmZyZXEuZSA9IDA7Ci0JCWN1cnJfcG9zID0gaXdlX3N0cmVhbV9hZGRfZXZlbnQoaW5mbywgY3Vycl9wb3MsCi0JCQkJCQlleHRyYSArIElXX1NDQU5fTUFYX0RBVEEsIGl3ZSwKLQkJCQkJCUlXX0VWX0ZSRVFfTEVOKTsKLQotCQlpd2UtPmNtZCA9IFNJT0NHSVdFTkNPREU7Ci0JCWlmIChjdXJyX2Jzcy0+Y2FwYSAmIFdMQU5fQ0FQQUJJTElUWV9QUklWQUNZKQotCQkJaXdlLT51LmRhdGEuZmxhZ3MgPSBJV19FTkNPREVfRU5BQkxFRCB8IElXX0VOQ09ERV9OT0tFWTsKLQkJZWxzZQotCQkJaXdlLT51LmRhdGEuZmxhZ3MgPSBJV19FTkNPREVfRElTQUJMRUQ7Ci0KLQkJaXdlLT51LmRhdGEubGVuZ3RoID0gMDsKLQkJY3Vycl9wb3MgPSBpd2Vfc3RyZWFtX2FkZF9wb2ludChpbmZvLCBjdXJyX3BvcywKLQkJCQkJCWV4dHJhICsgSVdfU0NBTl9NQVhfREFUQSwgaXdlLAotCQkJCQkJTlVMTCk7Ci0KLQkJLyogQWRkIHF1YWxpdHkgc3RhdGlzdGljcyAqLwotCQlpd2UtPmNtZCA9IElXRVZRVUFMOwotCQlpd2UtPnUucXVhbC5ub2lzZSA9IDA7Ci0JCWl3ZS0+dS5xdWFsLnVwZGF0ZWQgPQotCQkgICAgSVdfUVVBTF9OT0lTRV9JTlZBTElEIHwgSVdfUVVBTF9MRVZFTF9VUERBVEVEOwotCQlpd2UtPnUucXVhbC5sZXZlbCA9IChjdXJyX2Jzcy0+cnNzaSAqIDEwMCAvIDQyKTsKLQkJaWYgKGl3ZS0+dS5xdWFsLmxldmVsID4gMTAwKQotCQkJaXdlLT51LnF1YWwubGV2ZWwgPSAxMDA7Ci0JCWlmIChhdDc2X2lzX2ludGVyc2lsKHByaXYtPmJvYXJkX3R5cGUpKQotCQkJaXdlLT51LnF1YWwucXVhbCA9IGN1cnJfYnNzLT5saW5rX3F1YWw7Ci0JCWVsc2UgewotCQkJaXdlLT51LnF1YWwucXVhbCA9IDA7Ci0JCQlpd2UtPnUucXVhbC51cGRhdGVkIHw9IElXX1FVQUxfUVVBTF9JTlZBTElEOwotCQl9Ci0JCS8qIEFkZCBuZXcgdmFsdWUgdG8gZXZlbnQgKi8KLQkJY3Vycl9wb3MgPSBpd2Vfc3RyZWFtX2FkZF9ldmVudChpbmZvLCBjdXJyX3BvcywKLQkJCQkJCWV4dHJhICsgSVdfU0NBTl9NQVhfREFUQSwgaXdlLAotCQkJCQkJSVdfRVZfUVVBTF9MRU4pOwotCi0JCS8qIFJhdGU6IHN0dWZmaW5nIG11bHRpcGxlIHZhbHVlcyBpbiBhIHNpbmdsZSBldmVudCByZXF1aXJlcwotCQkgKiBhIGJpdCBtb3JlIG9mIG1hZ2ljIC0gSmVhbiBJSSAqLwotCQljdXJyX3ZhbCA9IGN1cnJfcG9zICsgSVdfRVZfTENQX0xFTjsKLQotCQlpd2UtPmNtZCA9IFNJT0NHSVdSQVRFOwotCQkvKiBUaG9zZSB0d28gZmxhZ3MgYXJlIGlnbm9yZWQuLi4gKi8KLQkJaXdlLT51LmJpdHJhdGUuZml4ZWQgPSAwOwotCQlpd2UtPnUuYml0cmF0ZS5kaXNhYmxlZCA9IDA7Ci0JCS8qIE1heCA4IHZhbHVlcyAqLwotCQlmb3IgKGkgPSAwOyBpIDwgY3Vycl9ic3MtPnJhdGVzX2xlbjsgaSsrKSB7Ci0JCQkvKiBCaXQgcmF0ZSBnaXZlbiBpbiA1MDAga2IvcyB1bml0cyAoKyAweDgwKSAqLwotCQkJaXdlLT51LmJpdHJhdGUudmFsdWUgPQotCQkJICAgICgoY3Vycl9ic3MtPnJhdGVzW2ldICYgMHg3ZikgKiA1MDAwMDApOwotCQkJLyogQWRkIG5ldyB2YWx1ZSB0byBldmVudCAqLwotCQkJY3Vycl92YWwgPSBpd2Vfc3RyZWFtX2FkZF92YWx1ZShpbmZvLCBjdXJyX3BvcywKLQkJCQkJCQljdXJyX3ZhbCwKLQkJCQkJCQlleHRyYSArCi0JCQkJCQkJSVdfU0NBTl9NQVhfREFUQSwgaXdlLAotCQkJCQkJCUlXX0VWX1BBUkFNX0xFTik7Ci0JCX0KLQotCQkvKiBDaGVjayBpZiB3ZSBhZGRlZCBhbnkgZXZlbnQgKi8KLQkJaWYgKChjdXJyX3ZhbCAtIGN1cnJfcG9zKSA+IElXX0VWX0xDUF9MRU4pCi0JCQljdXJyX3BvcyA9IGN1cnJfdmFsOwotCi0JCS8qIG1vcmUgaW5mb3JtYXRpb24gbWF5IGJlIHNlbnQgYmFjayB1c2luZyBJV0VDVVNUT00gKi8KLQotCX0KLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmJzc19saXN0X3NwaW5sb2NrLCBmbGFncyk7Ci0KLQlkYXRhLT5sZW5ndGggPSAoY3Vycl9wb3MgLSBleHRyYSk7Ci0JZGF0YS0+ZmxhZ3MgPSAwOwotCi0Ja2ZyZWUoaXdlKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBhdDc2X2l3X2hhbmRsZXJfc2V0X2Vzc2lkKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCi0JCQkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkJCSAgICAgc3RydWN0IGl3X3BvaW50ICpkYXRhLCBjaGFyICpleHRyYSkKLXsKLQlzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKLQotCWF0NzZfZGJnKERCR19JT0NUTCwgIiVzOiBTSU9DU0lXRVNTSUQgLSAlcyIsIG5ldGRldi0+bmFtZSwgZXh0cmEpOwotCi0JaWYgKGRhdGEtPmZsYWdzKSB7Ci0JCW1lbWNweShwcml2LT5lc3NpZCwgZXh0cmEsIGRhdGEtPmxlbmd0aCk7Ci0JCXByaXYtPmVzc2lkX3NpemUgPSBkYXRhLT5sZW5ndGg7Ci0JfSBlbHNlCi0JCXByaXYtPmVzc2lkX3NpemUgPSAwOwkvKiBVc2UgYW55IFNTSUQgKi8KLQotCXJldHVybiAtRUlXQ09NTUlUOwotfQotCi1zdGF0aWMgaW50IGF0NzZfaXdfaGFuZGxlcl9nZXRfZXNzaWQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKLQkJCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkJICAgICBzdHJ1Y3QgaXdfcG9pbnQgKmRhdGEsIGNoYXIgKmV4dHJhKQotewotCXN0cnVjdCBhdDc2X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwotCi0JaWYgKHByaXYtPmVzc2lkX3NpemUpIHsKLQkJLyogbm90IHRoZSBBTlkgc3NpZCBpbiBwcml2LT5lc3NpZCAqLwotCQlkYXRhLT5mbGFncyA9IDE7Ci0JCWRhdGEtPmxlbmd0aCA9IHByaXYtPmVzc2lkX3NpemU7Ci0JCW1lbWNweShleHRyYSwgcHJpdi0+ZXNzaWQsIGRhdGEtPmxlbmd0aCk7Ci0JfSBlbHNlIHsKLQkJLyogdGhlIEFOWSBzc2lkIHdhcyBzcGVjaWZpZWQgKi8KLQkJaWYgKHByaXYtPm1hY19zdGF0ZSA9PSBNQUNfQ09OTkVDVEVEICYmIHByaXYtPmN1cnJfYnNzKSB7Ci0JCQkvKiByZXBvcnQgdGhlIFNTSUQgd2UgaGF2ZSBmb3VuZCAqLwotCQkJZGF0YS0+ZmxhZ3MgPSAxOwotCQkJZGF0YS0+bGVuZ3RoID0gcHJpdi0+Y3Vycl9ic3MtPnNzaWRfbGVuOwotCQkJbWVtY3B5KGV4dHJhLCBwcml2LT5jdXJyX2Jzcy0+c3NpZCwgZGF0YS0+bGVuZ3RoKTsKLQkJfSBlbHNlIHsKLQkJCS8qIHJlcG9ydCBBTlkgYmFjayAqLwotCQkJZGF0YS0+ZmxhZ3MgPSAwOwotCQkJZGF0YS0+bGVuZ3RoID0gMDsKLQkJfQotCX0KLQotCWF0NzZfZGJnKERCR19JT0NUTCwgIiVzOiBTSU9DR0lXRVNTSUQgLSAlLipzIiwgbmV0ZGV2LT5uYW1lLAotCQkgZGF0YS0+bGVuZ3RoLCBleHRyYSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBhdDc2X2l3X2hhbmRsZXJfc2V0X3JhdGUoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKLQkJCQkgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCQkgICAgc3RydWN0IGl3X3BhcmFtICpiaXRyYXRlLCBjaGFyICpleHRyYSkKLXsKLQlzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKLQlpbnQgcmV0ID0gLUVJV0NPTU1JVDsKLQotCWF0NzZfZGJnKERCR19JT0NUTCwgIiVzOiBTSU9DU0lXUkFURSAtICVkIiwgbmV0ZGV2LT5uYW1lLAotCQkgYml0cmF0ZS0+dmFsdWUpOwotCi0Jc3dpdGNoIChiaXRyYXRlLT52YWx1ZSkgewotCWNhc2UgLTE6Ci0JCXByaXYtPnR4cmF0ZSA9IFRYX1JBVEVfQVVUTzsKLQkJYnJlYWs7CQkvKiBhdXRvIHJhdGUgKi8KLQljYXNlIDEwMDAwMDA6Ci0JCXByaXYtPnR4cmF0ZSA9IFRYX1JBVEVfMU1CSVQ7Ci0JCWJyZWFrOwotCWNhc2UgMjAwMDAwMDoKLQkJcHJpdi0+dHhyYXRlID0gVFhfUkFURV8yTUJJVDsKLQkJYnJlYWs7Ci0JY2FzZSA1NTAwMDAwOgotCQlwcml2LT50eHJhdGUgPSBUWF9SQVRFXzVfNU1CSVQ7Ci0JCWJyZWFrOwotCWNhc2UgMTEwMDAwMDA6Ci0JCXByaXYtPnR4cmF0ZSA9IFRYX1JBVEVfMTFNQklUOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXQgPSAtRUlOVkFMOwotCX0KLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgYXQ3Nl9pd19oYW5kbGVyX2dldF9yYXRlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCi0JCQkJICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkJICAgIHN0cnVjdCBpd19wYXJhbSAqYml0cmF0ZSwgY2hhciAqZXh0cmEpCi17Ci0Jc3RydWN0IGF0NzZfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KG5ldGRldik7Ci0JaW50IHJldCA9IDA7Ci0KLQlzd2l0Y2ggKHByaXYtPnR4cmF0ZSkgewotCQkvKiByZXR1cm4gbWF4IHJhdGUgaWYgUkFURV9BVVRPICovCi0JY2FzZSBUWF9SQVRFX0FVVE86Ci0JCWJpdHJhdGUtPnZhbHVlID0gMTEwMDAwMDA7Ci0JCWJyZWFrOwotCWNhc2UgVFhfUkFURV8xTUJJVDoKLQkJYml0cmF0ZS0+dmFsdWUgPSAxMDAwMDAwOwotCQlicmVhazsKLQljYXNlIFRYX1JBVEVfMk1CSVQ6Ci0JCWJpdHJhdGUtPnZhbHVlID0gMjAwMDAwMDsKLQkJYnJlYWs7Ci0JY2FzZSBUWF9SQVRFXzVfNU1CSVQ6Ci0JCWJpdHJhdGUtPnZhbHVlID0gNTUwMDAwMDsKLQkJYnJlYWs7Ci0JY2FzZSBUWF9SQVRFXzExTUJJVDoKLQkJYml0cmF0ZS0+dmFsdWUgPSAxMTAwMDAwMDsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmV0ID0gLUVJTlZBTDsKLQl9Ci0KLQliaXRyYXRlLT5maXhlZCA9IChwcml2LT50eHJhdGUgIT0gVFhfUkFURV9BVVRPKTsKLQliaXRyYXRlLT5kaXNhYmxlZCA9IDA7Ci0KLQlhdDc2X2RiZyhEQkdfSU9DVEwsICIlczogU0lPQ0dJV1JBVEUgLSAlZCIsIG5ldGRldi0+bmFtZSwKLQkJIGJpdHJhdGUtPnZhbHVlKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgYXQ3Nl9pd19oYW5kbGVyX3NldF9ydHMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKLQkJCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkJCSAgIHN0cnVjdCBpd19wYXJhbSAqcnRzLCBjaGFyICpleHRyYSkKLXsKLQlzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKLQlpbnQgcmV0ID0gLUVJV0NPTU1JVDsKLQlpbnQgcnRociA9IHJ0cy0+dmFsdWU7Ci0KLQlhdDc2X2RiZyhEQkdfSU9DVEwsICIlczogU0lPQ1NJV1JUUyAtIHZhbHVlICVkIGRpc2FibGVkICVzIiwKLQkJIG5ldGRldi0+bmFtZSwgcnRzLT52YWx1ZSwgKHJ0cy0+ZGlzYWJsZWQpID8gInRydWUiIDogImZhbHNlIik7Ci0KLQlpZiAocnRzLT5kaXNhYmxlZCkKLQkJcnRociA9IE1BWF9SVFNfVEhSRVNIT0xEOwotCi0JaWYgKChydGhyIDwgMCkgfHwgKHJ0aHIgPiBNQVhfUlRTX1RIUkVTSE9MRCkpCi0JCXJldCA9IC1FSU5WQUw7Ci0JZWxzZQotCQlwcml2LT5ydHNfdGhyZXNob2xkID0gcnRocjsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgYXQ3Nl9pd19oYW5kbGVyX2dldF9ydHMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKLQkJCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkJCSAgIHN0cnVjdCBpd19wYXJhbSAqcnRzLCBjaGFyICpleHRyYSkKLXsKLQlzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKLQotCXJ0cy0+dmFsdWUgPSBwcml2LT5ydHNfdGhyZXNob2xkOwotCXJ0cy0+ZGlzYWJsZWQgPSAocnRzLT52YWx1ZSA+PSBNQVhfUlRTX1RIUkVTSE9MRCk7Ci0JcnRzLT5maXhlZCA9IDE7Ci0KLQlhdDc2X2RiZyhEQkdfSU9DVEwsICIlczogU0lPQ0dJV1JUUyAtIHZhbHVlICVkIGRpc2FibGVkICVzIiwKLQkJIG5ldGRldi0+bmFtZSwgcnRzLT52YWx1ZSwgKHJ0cy0+ZGlzYWJsZWQpID8gInRydWUiIDogImZhbHNlIik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBhdDc2X2l3X2hhbmRsZXJfc2V0X2ZyYWcoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKLQkJCQkgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCQkgICAgc3RydWN0IGl3X3BhcmFtICpmcmFnLCBjaGFyICpleHRyYSkKLXsKLQlzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKLQlpbnQgcmV0ID0gLUVJV0NPTU1JVDsKLQlpbnQgZnRociA9IGZyYWctPnZhbHVlOwotCi0JYXQ3Nl9kYmcoREJHX0lPQ1RMLCAiJXM6IFNJT0NTSVdGUkFHIC0gdmFsdWUgJWQsIGRpc2FibGVkICVzIiwKLQkJIG5ldGRldi0+bmFtZSwgZnJhZy0+dmFsdWUsCi0JCSAoZnJhZy0+ZGlzYWJsZWQpID8gInRydWUiIDogImZhbHNlIik7Ci0KLQlpZiAoZnJhZy0+ZGlzYWJsZWQpCi0JCWZ0aHIgPSBNQVhfRlJBR19USFJFU0hPTEQ7Ci0KLQlpZiAoKGZ0aHIgPCBNSU5fRlJBR19USFJFU0hPTEQpIHx8IChmdGhyID4gTUFYX0ZSQUdfVEhSRVNIT0xEKSkKLQkJcmV0ID0gLUVJTlZBTDsKLQllbHNlCi0JCXByaXYtPmZyYWdfdGhyZXNob2xkID0gZnRociAmIH4weDE7CS8qIGdldCBhbiBldmVuIHZhbHVlICovCi0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGF0NzZfaXdfaGFuZGxlcl9nZXRfZnJhZyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAotCQkJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkJCSAgICBzdHJ1Y3QgaXdfcGFyYW0gKmZyYWcsIGNoYXIgKmV4dHJhKQotewotCXN0cnVjdCBhdDc2X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwotCi0JZnJhZy0+dmFsdWUgPSBwcml2LT5mcmFnX3RocmVzaG9sZDsKLQlmcmFnLT5kaXNhYmxlZCA9IChmcmFnLT52YWx1ZSA+PSBNQVhfRlJBR19USFJFU0hPTEQpOwotCWZyYWctPmZpeGVkID0gMTsKLQotCWF0NzZfZGJnKERCR19JT0NUTCwgIiVzOiBTSU9DR0lXRlJBRyAtIHZhbHVlICVkLCBkaXNhYmxlZCAlcyIsCi0JCSBuZXRkZXYtPm5hbWUsIGZyYWctPnZhbHVlLAotCQkgKGZyYWctPmRpc2FibGVkKSA/ICJ0cnVlIiA6ICJmYWxzZSIpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgYXQ3Nl9pd19oYW5kbGVyX2dldF90eHBvdyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAotCQkJCSAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCQkgICAgIHN0cnVjdCBpd19wYXJhbSAqcG93ZXIsIGNoYXIgKmV4dHJhKQotewotCXBvd2VyLT52YWx1ZSA9IDE1OwotCXBvd2VyLT5maXhlZCA9IDE7CS8qIE5vIHBvd2VyIGNvbnRyb2wgKi8KLQlwb3dlci0+ZGlzYWJsZWQgPSAwOwotCXBvd2VyLT5mbGFncyA9IElXX1RYUE9XX0RCTTsKLQotCWF0NzZfZGJnKERCR19JT0NUTCwgIiVzOiBTSU9DR0lXVFhQT1cgLSB0eHBvdyAlZCBkQm0iLCBuZXRkZXYtPm5hbWUsCi0JCSBwb3dlci0+dmFsdWUpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qIGphbDogc2hvcnQgcmV0cnkgaXMgaGFuZGxlZCBieSB0aGUgZmlybXdhcmUgKGF0IGxlYXN0IDAuOTAueCksCi0gICB3aGlsZSBsb25nIHJldHJ5IGlzIG5vdCAoPykgKi8KLXN0YXRpYyBpbnQgYXQ3Nl9pd19oYW5kbGVyX3NldF9yZXRyeShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAotCQkJCSAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCQkgICAgIHN0cnVjdCBpd19wYXJhbSAqcmV0cnksIGNoYXIgKmV4dHJhKQotewotCXN0cnVjdCBhdDc2X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwotCWludCByZXQgPSAtRUlXQ09NTUlUOwotCi0JYXQ3Nl9kYmcoREJHX0lPQ1RMLCAiJXM6IFNJT0NTSVdSRVRSWSBkaXNhYmxlZCAlZCBmbGFncyAweCV4IHZhbCAlZCIsCi0JCSBuZXRkZXYtPm5hbWUsIHJldHJ5LT5kaXNhYmxlZCwgcmV0cnktPmZsYWdzLCByZXRyeS0+dmFsdWUpOwotCi0JaWYgKCFyZXRyeS0+ZGlzYWJsZWQgJiYgKHJldHJ5LT5mbGFncyAmIElXX1JFVFJZX0xJTUlUKSkgewotCQlpZiAoKHJldHJ5LT5mbGFncyAmIElXX1JFVFJZX01JTikgfHwKLQkJICAgICEocmV0cnktPmZsYWdzICYgSVdfUkVUUllfTUFYKSkKLQkJCXByaXYtPnNob3J0X3JldHJ5X2xpbWl0ID0gcmV0cnktPnZhbHVlOwotCQllbHNlCi0JCQlyZXQgPSAtRUlOVkFMOwotCX0gZWxzZQotCQlyZXQgPSAtRUlOVkFMOwotCi0JcmV0dXJuIHJldDsKLX0KLQotLyogQWRhcHRlZCAocmlwcGVkKSBmcm9tIGF0bWVsLmMgKi8KLXN0YXRpYyBpbnQgYXQ3Nl9pd19oYW5kbGVyX2dldF9yZXRyeShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAotCQkJCSAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCQkgICAgIHN0cnVjdCBpd19wYXJhbSAqcmV0cnksIGNoYXIgKmV4dHJhKQotewotCXN0cnVjdCBhdDc2X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwotCi0JYXQ3Nl9kYmcoREJHX0lPQ1RMLCAiJXM6IFNJT0NHSVdSRVRSWSIsIG5ldGRldi0+bmFtZSk7Ci0KLQlyZXRyeS0+ZGlzYWJsZWQgPSAwOwkvKiBDYW4ndCBiZSBkaXNhYmxlZCAqLwotCXJldHJ5LT5mbGFncyA9IElXX1JFVFJZX0xJTUlUOwotCXJldHJ5LT52YWx1ZSA9IHByaXYtPnNob3J0X3JldHJ5X2xpbWl0OwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgYXQ3Nl9pd19oYW5kbGVyX3NldF9lbmNvZGUoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKLQkJCQkgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkJCSAgICAgIHN0cnVjdCBpd19wb2ludCAqZW5jb2RpbmcsIGNoYXIgKmV4dHJhKQotewotCXN0cnVjdCBhdDc2X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwotCWludCBpbmRleCA9IChlbmNvZGluZy0+ZmxhZ3MgJiBJV19FTkNPREVfSU5ERVgpIC0gMTsKLQlpbnQgbGVuID0gZW5jb2RpbmctPmxlbmd0aDsKLQotCWF0NzZfZGJnKERCR19JT0NUTCwgIiVzOiBTSU9DU0lXRU5DT0RFIC0gZW5jLmZsYWdzICUwOHggIgotCQkgInBvaW50ZXIgJXAgbGVuICVkIiwgbmV0ZGV2LT5uYW1lLCBlbmNvZGluZy0+ZmxhZ3MsCi0JCSBlbmNvZGluZy0+cG9pbnRlciwgZW5jb2RpbmctPmxlbmd0aCk7Ci0JYXQ3Nl9kYmcoREJHX0lPQ1RMLAotCQkgIiVzOiBTSU9DU0lXRU5DT0RFIC0gb2xkIHdlcHN0YXRlOiBlbmFibGVkICVzIGtleV9pZCAlZCAiCi0JCSAiYXV0aF9tb2RlICVzIiwgbmV0ZGV2LT5uYW1lLAotCQkgKHByaXYtPndlcF9lbmFibGVkKSA/ICJ0cnVlIiA6ICJmYWxzZSIsIHByaXYtPndlcF9rZXlfaWQsCi0JCSAocHJpdi0+YXV0aF9tb2RlID09Ci0JCSAgV0xBTl9BVVRIX1NIQVJFRF9LRVkpID8gInJlc3RyaWN0ZWQiIDogIm9wZW4iKTsKLQotCS8qIHRha2UgdGhlIG9sZCBkZWZhdWx0IGtleSBpZiBpbmRleCBpcyBpbnZhbGlkICovCi0JaWYgKChpbmRleCA8IDApIHx8IChpbmRleCA+PSBXRVBfS0VZUykpCi0JCWluZGV4ID0gcHJpdi0+d2VwX2tleV9pZDsKLQotCWlmIChsZW4gPiAwKSB7Ci0JCWlmIChsZW4gPiBXRVBfTEFSR0VfS0VZX0xFTikKLQkJCWxlbiA9IFdFUF9MQVJHRV9LRVlfTEVOOwotCi0JCW1lbXNldChwcml2LT53ZXBfa2V5c1tpbmRleF0sIDAsIFdFUF9LRVlfTEVOKTsKLQkJbWVtY3B5KHByaXYtPndlcF9rZXlzW2luZGV4XSwgZXh0cmEsIGxlbik7Ci0JCXByaXYtPndlcF9rZXlzX2xlbltpbmRleF0gPSAobGVuIDw9IFdFUF9TTUFMTF9LRVlfTEVOKSA/Ci0JCSAgICBXRVBfU01BTExfS0VZX0xFTiA6IFdFUF9MQVJHRV9LRVlfTEVOOwotCQlwcml2LT53ZXBfZW5hYmxlZCA9IDE7Ci0JfQotCi0JcHJpdi0+d2VwX2tleV9pZCA9IGluZGV4OwotCXByaXYtPndlcF9lbmFibGVkID0gKChlbmNvZGluZy0+ZmxhZ3MgJiBJV19FTkNPREVfRElTQUJMRUQpID09IDApOwotCi0JaWYgKGVuY29kaW5nLT5mbGFncyAmIElXX0VOQ09ERV9SRVNUUklDVEVEKQotCQlwcml2LT5hdXRoX21vZGUgPSBXTEFOX0FVVEhfU0hBUkVEX0tFWTsKLQlpZiAoZW5jb2RpbmctPmZsYWdzICYgSVdfRU5DT0RFX09QRU4pCi0JCXByaXYtPmF1dGhfbW9kZSA9IFdMQU5fQVVUSF9PUEVOOwotCi0JYXQ3Nl9kYmcoREJHX0lPQ1RMLAotCQkgIiVzOiBTSU9DU0lXRU5DT0RFIC0gbmV3IHdlcHN0YXRlOiBlbmFibGVkICVzIGtleV9pZCAlZCAiCi0JCSAia2V5X2xlbiAlZCBhdXRoX21vZGUgJXMiLCBuZXRkZXYtPm5hbWUsCi0JCSAocHJpdi0+d2VwX2VuYWJsZWQpID8gInRydWUiIDogImZhbHNlIiwgcHJpdi0+d2VwX2tleV9pZCArIDEsCi0JCSBwcml2LT53ZXBfa2V5c19sZW5bcHJpdi0+d2VwX2tleV9pZF0sCi0JCSAocHJpdi0+YXV0aF9tb2RlID09Ci0JCSAgV0xBTl9BVVRIX1NIQVJFRF9LRVkpID8gInJlc3RyaWN0ZWQiIDogIm9wZW4iKTsKLQotCXJldHVybiAtRUlXQ09NTUlUOwotfQotCi1zdGF0aWMgaW50IGF0NzZfaXdfaGFuZGxlcl9nZXRfZW5jb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCi0JCQkJICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCQkgICAgICBzdHJ1Y3QgaXdfcG9pbnQgKmVuY29kaW5nLCBjaGFyICpleHRyYSkKLXsKLQlzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKLQlpbnQgaW5kZXggPSAoZW5jb2RpbmctPmZsYWdzICYgSVdfRU5DT0RFX0lOREVYKSAtIDE7Ci0KLQlpZiAoKGluZGV4IDwgMCkgfHwgKGluZGV4ID49IFdFUF9LRVlTKSkKLQkJaW5kZXggPSBwcml2LT53ZXBfa2V5X2lkOwotCi0JZW5jb2RpbmctPmZsYWdzID0KLQkgICAgKHByaXYtPmF1dGhfbW9kZSA9PSBXTEFOX0FVVEhfU0hBUkVEX0tFWSkgPwotCSAgICBJV19FTkNPREVfUkVTVFJJQ1RFRCA6IElXX0VOQ09ERV9PUEVOOwotCi0JaWYgKCFwcml2LT53ZXBfZW5hYmxlZCkKLQkJZW5jb2RpbmctPmZsYWdzIHw9IElXX0VOQ09ERV9ESVNBQkxFRDsKLQotCWlmIChlbmNvZGluZy0+cG9pbnRlcikgewotCQllbmNvZGluZy0+bGVuZ3RoID0gcHJpdi0+d2VwX2tleXNfbGVuW2luZGV4XTsKLQotCQltZW1jcHkoZXh0cmEsIHByaXYtPndlcF9rZXlzW2luZGV4XSwgcHJpdi0+d2VwX2tleXNfbGVuW2luZGV4XSk7Ci0KLQkJZW5jb2RpbmctPmZsYWdzIHw9IChpbmRleCArIDEpOwotCX0KLQotCWF0NzZfZGJnKERCR19JT0NUTCwgIiVzOiBTSU9DR0lXRU5DT0RFIC0gZW5jLmZsYWdzICUwOHggIgotCQkgInBvaW50ZXIgJXAgbGVuICVkIiwgbmV0ZGV2LT5uYW1lLCBlbmNvZGluZy0+ZmxhZ3MsCi0JCSBlbmNvZGluZy0+cG9pbnRlciwgZW5jb2RpbmctPmxlbmd0aCk7Ci0JYXQ3Nl9kYmcoREJHX0lPQ1RMLAotCQkgIiVzOiBTSU9DR0lXRU5DT0RFIC0gd2Vwc3RhdGU6IGVuYWJsZWQgJXMga2V5X2lkICVkICIKLQkJICJrZXlfbGVuICVkIGF1dGhfbW9kZSAlcyIsIG5ldGRldi0+bmFtZSwKLQkJIChwcml2LT53ZXBfZW5hYmxlZCkgPyAidHJ1ZSIgOiAiZmFsc2UiLCBwcml2LT53ZXBfa2V5X2lkICsgMSwKLQkJIHByaXYtPndlcF9rZXlzX2xlbltwcml2LT53ZXBfa2V5X2lkXSwKLQkJIChwcml2LT5hdXRoX21vZGUgPT0KLQkJICBXTEFOX0FVVEhfU0hBUkVEX0tFWSkgPyAicmVzdHJpY3RlZCIgOiAib3BlbiIpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgYXQ3Nl9pd19oYW5kbGVyX3NldF9wb3dlcihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAotCQkJCSAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCQkgICAgIHN0cnVjdCBpd19wYXJhbSAqcHJxLCBjaGFyICpleHRyYSkKLXsKLQlpbnQgZXJyID0gLUVJV0NPTU1JVDsKLQlzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKLQotCWF0NzZfZGJnKERCR19JT0NUTCwKLQkJICIlczogU0lPQ1NJV1BPV0VSIC0gZGlzYWJsZWQgJXMgZmxhZ3MgMHgleCB2YWx1ZSAweCV4IiwKLQkJIG5ldGRldi0+bmFtZSwgKHBycS0+ZGlzYWJsZWQpID8gInRydWUiIDogImZhbHNlIiwgcHJxLT5mbGFncywKLQkJIHBycS0+dmFsdWUpOwotCi0JaWYgKHBycS0+ZGlzYWJsZWQpCi0JCXByaXYtPnBtX21vZGUgPSBBVDc2X1BNX09GRjsKLQllbHNlIHsKLQkJc3dpdGNoIChwcnEtPmZsYWdzICYgSVdfUE9XRVJfTU9ERSkgewotCQljYXNlIElXX1BPV0VSX0FMTF9SOgotCQljYXNlIElXX1BPV0VSX09OOgotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQllcnIgPSAtRUlOVkFMOwotCQkJZ290byBleGl0OwotCQl9Ci0JCWlmIChwcnEtPmZsYWdzICYgSVdfUE9XRVJfUEVSSU9EKQotCQkJcHJpdi0+cG1fcGVyaW9kID0gcHJxLT52YWx1ZTsKLQotCQlpZiAocHJxLT5mbGFncyAmIElXX1BPV0VSX1RJTUVPVVQpIHsKLQkJCWVyciA9IC1FSU5WQUw7Ci0JCQlnb3RvIGV4aXQ7Ci0JCX0KLQkJcHJpdi0+cG1fbW9kZSA9IEFUNzZfUE1fT047Ci0JfQotZXhpdDoKLQlyZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgaW50IGF0NzZfaXdfaGFuZGxlcl9nZXRfcG93ZXIoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKLQkJCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkJICAgICBzdHJ1Y3QgaXdfcGFyYW0gKnBvd2VyLCBjaGFyICpleHRyYSkKLXsKLQlzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKLQotCXBvd2VyLT5kaXNhYmxlZCA9IChwcml2LT5wbV9tb2RlID09IEFUNzZfUE1fT0ZGKTsKLQlpZiAoIXBvd2VyLT5kaXNhYmxlZCkgewotCQlwb3dlci0+ZmxhZ3MgPSBJV19QT1dFUl9QRVJJT0QgfCBJV19QT1dFUl9BTExfUjsKLQkJcG93ZXItPnZhbHVlID0gcHJpdi0+cG1fcGVyaW9kOwotCX0KLQotCWF0NzZfZGJnKERCR19JT0NUTCwgIiVzOiBTSU9DR0lXUE9XRVIgLSAlcyBmbGFncyAweCV4IHZhbHVlIDB4JXgiLAotCQkgbmV0ZGV2LT5uYW1lLCBwb3dlci0+ZGlzYWJsZWQgPyAiZGlzYWJsZWQiIDogImVuYWJsZWQiLAotCQkgcG93ZXItPmZsYWdzLCBwb3dlci0+dmFsdWUpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBQcml2YXRlIElPQ1RMUwotICovCi1zdGF0aWMgaW50IGF0NzZfaXdfc2V0X3Nob3J0X3ByZWFtYmxlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCi0JCQkJICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywgY2hhciAqbmFtZSwKLQkJCQkgICAgICBjaGFyICpleHRyYSkKLXsKLQlzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKLQlpbnQgdmFsID0gKigoaW50ICopbmFtZSk7Ci0JaW50IHJldCA9IC1FSVdDT01NSVQ7Ci0KLQlhdDc2X2RiZyhEQkdfSU9DVEwsICIlczogQVQ3Nl9TRVRfU0hPUlRfUFJFQU1CTEUsICVkIiwKLQkJIG5ldGRldi0+bmFtZSwgdmFsKTsKLQotCWlmICh2YWwgPCBQUkVBTUJMRV9UWVBFX0xPTkcgfHwgdmFsID4gUFJFQU1CTEVfVFlQRV9BVVRPKQotCQlyZXQgPSAtRUlOVkFMOwotCWVsc2UKLQkJcHJpdi0+cHJlYW1ibGVfdHlwZSA9IHZhbDsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgYXQ3Nl9pd19nZXRfc2hvcnRfcHJlYW1ibGUoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKLQkJCQkgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkJCSAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQotewotCXN0cnVjdCBhdDc2X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwotCi0Jc25wcmludGYod3JxdS0+bmFtZSwgc2l6ZW9mKHdycXUtPm5hbWUpLCAiJXMgKCVkKSIsCi0JCSBwcmVhbWJsZXNbcHJpdi0+cHJlYW1ibGVfdHlwZV0sIHByaXYtPnByZWFtYmxlX3R5cGUpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGF0NzZfaXdfc2V0X2RlYnVnKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCi0JCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkgICAgIHN0cnVjdCBpd19wb2ludCAqZGF0YSwgY2hhciAqZXh0cmEpCi17Ci0JY2hhciAqcHRyOwotCXUzMiB2YWw7Ci0KLQlpZiAoZGF0YS0+bGVuZ3RoID4gMCkgewotCQl2YWwgPSBzaW1wbGVfc3RydG9sKGV4dHJhLCAmcHRyLCAwKTsKLQotCQlpZiAocHRyID09IGV4dHJhKQotCQkJdmFsID0gREJHX0RFRkFVTFRTOwotCi0JCWF0NzZfZGJnKERCR19JT0NUTCwgIiVzOiBBVDc2X1NFVF9ERUJVRyBpbnB1dCAlZDogJXMgLT4gMHgleCIsCi0JCQkgbmV0ZGV2LT5uYW1lLCBkYXRhLT5sZW5ndGgsIGV4dHJhLCB2YWwpOwotCX0gZWxzZQotCQl2YWwgPSBEQkdfREVGQVVMVFM7Ci0KLQlhdDc2X2RiZyhEQkdfSU9DVEwsICIlczogQVQ3Nl9TRVRfREVCVUcsIG9sZCAweCV4LCBuZXcgMHgleCIsCi0JCSBuZXRkZXYtPm5hbWUsIGF0NzZfZGVidWcsIHZhbCk7Ci0KLQkvKiBqYWw6IHNvbWUgbW9yZSBvdXRwdXQgdG8gcGluIGRvd24gbG9ja3VwcyAqLwotCWF0NzZfZGJnKERCR19JT0NUTCwgIiVzOiBuZXRpZiBydW5uaW5nICVkIHF1ZXVlX3N0b3BwZWQgJWQgIgotCQkgImNhcnJpZXJfb2sgJWQiLCBuZXRkZXYtPm5hbWUsIG5ldGlmX3J1bm5pbmcobmV0ZGV2KSwKLQkJIG5ldGlmX3F1ZXVlX3N0b3BwZWQobmV0ZGV2KSwgbmV0aWZfY2Fycmllcl9vayhuZXRkZXYpKTsKLQotCWF0NzZfZGVidWcgPSB2YWw7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBhdDc2X2l3X2dldF9kZWJ1ZyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAotCQkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKLXsKLQlzbnByaW50Zih3cnF1LT5uYW1lLCBzaXplb2Yod3JxdS0+bmFtZSksICIweCUwOHgiLCBhdDc2X2RlYnVnKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBhdDc2X2l3X3NldF9wb3dlcnNhdmVfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAotCQkJCSAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sIGNoYXIgKm5hbWUsCi0JCQkJICAgICAgY2hhciAqZXh0cmEpCi17Ci0Jc3RydWN0IGF0NzZfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KG5ldGRldik7Ci0JaW50IHZhbCA9ICooKGludCAqKW5hbWUpOwotCWludCByZXQgPSAtRUlXQ09NTUlUOwotCi0JYXQ3Nl9kYmcoREJHX0lPQ1RMLCAiJXM6IEFUNzZfU0VUX1BPV0VSU0FWRV9NT0RFLCAlZCAoJXMpIiwKLQkJIG5ldGRldi0+bmFtZSwgdmFsLAotCQkgdmFsID09IEFUNzZfUE1fT0ZGID8gImFjdGl2ZSIgOiB2YWwgPT0gQVQ3Nl9QTV9PTiA/ICJzYXZlIiA6Ci0JCSB2YWwgPT0gQVQ3Nl9QTV9TTUFSVCA/ICJzbWFydCBzYXZlIiA6ICI8aW52YWxpZD4iKTsKLQlpZiAodmFsIDwgQVQ3Nl9QTV9PRkYgfHwgdmFsID4gQVQ3Nl9QTV9TTUFSVCkKLQkJcmV0ID0gLUVJTlZBTDsKLQllbHNlCi0JCXByaXYtPnBtX21vZGUgPSB2YWw7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGF0NzZfaXdfZ2V0X3Bvd2Vyc2F2ZV9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCi0JCQkJICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCQkgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKLXsKLQlzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKLQlpbnQgKnBhcmFtID0gKGludCAqKWV4dHJhOwotCi0JcGFyYW1bMF0gPSBwcml2LT5wbV9tb2RlOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGF0NzZfaXdfc2V0X3NjYW5fdGltZXMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKLQkJCQkgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sIGNoYXIgKm5hbWUsCi0JCQkJICBjaGFyICpleHRyYSkKLXsKLQlzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKLQlpbnQgbWludCA9ICooKGludCAqKW5hbWUpOwotCWludCBtYXh0ID0gKigoaW50ICopbmFtZSArIDEpOwotCWludCByZXQgPSAtRUlXQ09NTUlUOwotCi0JYXQ3Nl9kYmcoREJHX0lPQ1RMLCAiJXM6IEFUNzZfU0VUX1NDQU5fVElNRVMgLSBtaW4gJWQgbWF4ICVkIiwKLQkJIG5ldGRldi0+bmFtZSwgbWludCwgbWF4dCk7Ci0JaWYgKG1pbnQgPD0gMCB8fCBtYXh0IDw9IDAgfHwgbWludCA+IG1heHQpCi0JCXJldCA9IC1FSU5WQUw7Ci0JZWxzZSB7Ci0JCXByaXYtPnNjYW5fbWluX3RpbWUgPSBtaW50OwotCQlwcml2LT5zY2FuX21heF90aW1lID0gbWF4dDsKLQl9Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGF0NzZfaXdfZ2V0X3NjYW5fdGltZXMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKLQkJCQkgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkJICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKLXsKLQlzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKLQlpbnQgKnBhcmFtID0gKGludCAqKWV4dHJhOwotCi0JcGFyYW1bMF0gPSBwcml2LT5zY2FuX21pbl90aW1lOwotCXBhcmFtWzFdID0gcHJpdi0+c2Nhbl9tYXhfdGltZTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBhdDc2X2l3X3NldF9zY2FuX21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKLQkJCQkgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywgY2hhciAqbmFtZSwKLQkJCQkgY2hhciAqZXh0cmEpCi17Ci0Jc3RydWN0IGF0NzZfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KG5ldGRldik7Ci0JaW50IHZhbCA9ICooKGludCAqKW5hbWUpOwotCWludCByZXQgPSAtRUlXQ09NTUlUOwotCi0JYXQ3Nl9kYmcoREJHX0lPQ1RMLCAiJXM6IEFUNzZfU0VUX1NDQU5fTU9ERSAtIG1vZGUgJXMiLAotCQkgbmV0ZGV2LT5uYW1lLCAodmFsID0gU0NBTl9UWVBFX0FDVElWRSkgPyAiYWN0aXZlIiA6Ci0JCSAodmFsID0gU0NBTl9UWVBFX1BBU1NJVkUpID8gInBhc3NpdmUiIDogIjxpbnZhbGlkPiIpOwotCi0JaWYgKHZhbCAhPSBTQ0FOX1RZUEVfQUNUSVZFICYmIHZhbCAhPSBTQ0FOX1RZUEVfUEFTU0lWRSkKLQkJcmV0ID0gLUVJTlZBTDsKLQllbHNlCi0JCXByaXYtPnNjYW5fbW9kZSA9IHZhbDsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgYXQ3Nl9pd19nZXRfc2Nhbl9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCi0JCQkJIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkJIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQotewotCXN0cnVjdCBhdDc2X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwotCWludCAqcGFyYW0gPSAoaW50ICopZXh0cmE7Ci0KLQlwYXJhbVswXSA9IHByaXYtPnNjYW5fbW9kZTsKLQlyZXR1cm4gMDsKLX0KLQotI2RlZmluZSBBVDc2X1NFVF9IQU5ETEVSKGgsIGYpIFtoIC0gU0lPQ0lXRklSU1RdID0gKGl3X2hhbmRsZXIpIGYKLQotLyogU3RhbmRhcmQgd2lyZWxlc3MgaGFuZGxlcnMgKi8KLXN0YXRpYyBjb25zdCBpd19oYW5kbGVyIGF0NzZfaGFuZGxlcnNbXSA9IHsKLQlBVDc2X1NFVF9IQU5ETEVSKFNJT0NTSVdDT01NSVQsIGF0NzZfaXdfaGFuZGxlcl9jb21taXQpLAotCUFUNzZfU0VUX0hBTkRMRVIoU0lPQ0dJV05BTUUsIGF0NzZfaXdfaGFuZGxlcl9nZXRfbmFtZSksCi0JQVQ3Nl9TRVRfSEFORExFUihTSU9DU0lXRlJFUSwgYXQ3Nl9pd19oYW5kbGVyX3NldF9mcmVxKSwKLQlBVDc2X1NFVF9IQU5ETEVSKFNJT0NHSVdGUkVRLCBhdDc2X2l3X2hhbmRsZXJfZ2V0X2ZyZXEpLAotCUFUNzZfU0VUX0hBTkRMRVIoU0lPQ1NJV01PREUsIGF0NzZfaXdfaGFuZGxlcl9zZXRfbW9kZSksCi0JQVQ3Nl9TRVRfSEFORExFUihTSU9DR0lXTU9ERSwgYXQ3Nl9pd19oYW5kbGVyX2dldF9tb2RlKSwKLQlBVDc2X1NFVF9IQU5ETEVSKFNJT0NHSVdSQU5HRSwgYXQ3Nl9pd19oYW5kbGVyX2dldF9yYW5nZSksCi0JQVQ3Nl9TRVRfSEFORExFUihTSU9DU0lXU1BZLCBhdDc2X2l3X2hhbmRsZXJfc2V0X3NweSksCi0JQVQ3Nl9TRVRfSEFORExFUihTSU9DR0lXU1BZLCBhdDc2X2l3X2hhbmRsZXJfZ2V0X3NweSksCi0JQVQ3Nl9TRVRfSEFORExFUihTSU9DU0lXVEhSU1BZLCBhdDc2X2l3X2hhbmRsZXJfc2V0X3RocnNweSksCi0JQVQ3Nl9TRVRfSEFORExFUihTSU9DR0lXVEhSU1BZLCBhdDc2X2l3X2hhbmRsZXJfZ2V0X3RocnNweSksCi0JQVQ3Nl9TRVRfSEFORExFUihTSU9DU0lXQVAsIGF0NzZfaXdfaGFuZGxlcl9zZXRfd2FwKSwKLQlBVDc2X1NFVF9IQU5ETEVSKFNJT0NHSVdBUCwgYXQ3Nl9pd19oYW5kbGVyX2dldF93YXApLAotCUFUNzZfU0VUX0hBTkRMRVIoU0lPQ1NJV1NDQU4sIGF0NzZfaXdfaGFuZGxlcl9zZXRfc2NhbiksCi0JQVQ3Nl9TRVRfSEFORExFUihTSU9DR0lXU0NBTiwgYXQ3Nl9pd19oYW5kbGVyX2dldF9zY2FuKSwKLQlBVDc2X1NFVF9IQU5ETEVSKFNJT0NTSVdFU1NJRCwgYXQ3Nl9pd19oYW5kbGVyX3NldF9lc3NpZCksCi0JQVQ3Nl9TRVRfSEFORExFUihTSU9DR0lXRVNTSUQsIGF0NzZfaXdfaGFuZGxlcl9nZXRfZXNzaWQpLAotCUFUNzZfU0VUX0hBTkRMRVIoU0lPQ1NJV1JBVEUsIGF0NzZfaXdfaGFuZGxlcl9zZXRfcmF0ZSksCi0JQVQ3Nl9TRVRfSEFORExFUihTSU9DR0lXUkFURSwgYXQ3Nl9pd19oYW5kbGVyX2dldF9yYXRlKSwKLQlBVDc2X1NFVF9IQU5ETEVSKFNJT0NTSVdSVFMsIGF0NzZfaXdfaGFuZGxlcl9zZXRfcnRzKSwKLQlBVDc2X1NFVF9IQU5ETEVSKFNJT0NHSVdSVFMsIGF0NzZfaXdfaGFuZGxlcl9nZXRfcnRzKSwKLQlBVDc2X1NFVF9IQU5ETEVSKFNJT0NTSVdGUkFHLCBhdDc2X2l3X2hhbmRsZXJfc2V0X2ZyYWcpLAotCUFUNzZfU0VUX0hBTkRMRVIoU0lPQ0dJV0ZSQUcsIGF0NzZfaXdfaGFuZGxlcl9nZXRfZnJhZyksCi0JQVQ3Nl9TRVRfSEFORExFUihTSU9DR0lXVFhQT1csIGF0NzZfaXdfaGFuZGxlcl9nZXRfdHhwb3cpLAotCUFUNzZfU0VUX0hBTkRMRVIoU0lPQ1NJV1JFVFJZLCBhdDc2X2l3X2hhbmRsZXJfc2V0X3JldHJ5KSwKLQlBVDc2X1NFVF9IQU5ETEVSKFNJT0NHSVdSRVRSWSwgYXQ3Nl9pd19oYW5kbGVyX2dldF9yZXRyeSksCi0JQVQ3Nl9TRVRfSEFORExFUihTSU9DU0lXRU5DT0RFLCBhdDc2X2l3X2hhbmRsZXJfc2V0X2VuY29kZSksCi0JQVQ3Nl9TRVRfSEFORExFUihTSU9DR0lXRU5DT0RFLCBhdDc2X2l3X2hhbmRsZXJfZ2V0X2VuY29kZSksCi0JQVQ3Nl9TRVRfSEFORExFUihTSU9DU0lXUE9XRVIsIGF0NzZfaXdfaGFuZGxlcl9zZXRfcG93ZXIpLAotCUFUNzZfU0VUX0hBTkRMRVIoU0lPQ0dJV1BPV0VSLCBhdDc2X2l3X2hhbmRsZXJfZ2V0X3Bvd2VyKQotfTsKLQotI2RlZmluZSBBVDc2X1NFVF9QUklWKGgsIGYpIFtoIC0gU0lPQ0lXRklSU1RQUklWXSA9IChpd19oYW5kbGVyKSBmCi0KLS8qIFByaXZhdGUgd2lyZWxlc3MgaGFuZGxlcnMgKi8KLXN0YXRpYyBjb25zdCBpd19oYW5kbGVyIGF0NzZfcHJpdl9oYW5kbGVyc1tdID0gewotCUFUNzZfU0VUX1BSSVYoQVQ3Nl9TRVRfU0hPUlRfUFJFQU1CTEUsIGF0NzZfaXdfc2V0X3Nob3J0X3ByZWFtYmxlKSwKLQlBVDc2X1NFVF9QUklWKEFUNzZfR0VUX1NIT1JUX1BSRUFNQkxFLCBhdDc2X2l3X2dldF9zaG9ydF9wcmVhbWJsZSksCi0JQVQ3Nl9TRVRfUFJJVihBVDc2X1NFVF9ERUJVRywgYXQ3Nl9pd19zZXRfZGVidWcpLAotCUFUNzZfU0VUX1BSSVYoQVQ3Nl9HRVRfREVCVUcsIGF0NzZfaXdfZ2V0X2RlYnVnKSwKLQlBVDc2X1NFVF9QUklWKEFUNzZfU0VUX1BPV0VSU0FWRV9NT0RFLCBhdDc2X2l3X3NldF9wb3dlcnNhdmVfbW9kZSksCi0JQVQ3Nl9TRVRfUFJJVihBVDc2X0dFVF9QT1dFUlNBVkVfTU9ERSwgYXQ3Nl9pd19nZXRfcG93ZXJzYXZlX21vZGUpLAotCUFUNzZfU0VUX1BSSVYoQVQ3Nl9TRVRfU0NBTl9USU1FUywgYXQ3Nl9pd19zZXRfc2Nhbl90aW1lcyksCi0JQVQ3Nl9TRVRfUFJJVihBVDc2X0dFVF9TQ0FOX1RJTUVTLCBhdDc2X2l3X2dldF9zY2FuX3RpbWVzKSwKLQlBVDc2X1NFVF9QUklWKEFUNzZfU0VUX1NDQU5fTU9ERSwgYXQ3Nl9pd19zZXRfc2Nhbl9tb2RlKSwKLQlBVDc2X1NFVF9QUklWKEFUNzZfR0VUX1NDQU5fTU9ERSwgYXQ3Nl9pd19nZXRfc2Nhbl9tb2RlKSwKLX07Ci0KLS8qIE5hbWVzIGFuZCBhcmd1bWVudHMgb2YgcHJpdmF0ZSB3aXJlbGVzcyBoYW5kbGVycyAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBpd19wcml2X2FyZ3MgYXQ3Nl9wcml2X2FyZ3NbXSA9IHsKLQkvKiAwIC0gbG9uZywgMSAtIHNob3J0ICovCi0Je0FUNzZfU0VUX1NIT1JUX1BSRUFNQkxFLAotCSBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwgMCwgInNldF9wcmVhbWJsZSJ9LAotCi0Je0FUNzZfR0VUX1NIT1JUX1BSRUFNQkxFLAotCSAwLCBJV19QUklWX1RZUEVfQ0hBUiB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEwLCAiZ2V0X3ByZWFtYmxlIn0sCi0KLQkvKiB3ZSBtdXN0IHBhc3MgdGhlIG5ldyBkZWJ1ZyBtYXNrIGFzIGEgc3RyaW5nLCBiZWNhdXNlIGl3cHJpdiBjYW5ub3QKLQkgKiBwYXJzZSBoZXggbnVtYmVycyBzdGFydGluZyB3aXRoIDB4IDotKCAgKi8KLQl7QVQ3Nl9TRVRfREVCVUcsCi0JIElXX1BSSVZfVFlQRV9DSEFSIHwgMTAsIDAsICJzZXRfZGVidWcifSwKLQotCXtBVDc2X0dFVF9ERUJVRywKLQkgMCwgSVdfUFJJVl9UWVBFX0NIQVIgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxMCwgImdldF9kZWJ1ZyJ9LAotCi0JLyogMSAtIGFjdGl2ZSwgMiAtIHBvd2VyIHNhdmUsIDMgLSBzbWFydCBwb3dlciBzYXZlICovCi0Je0FUNzZfU0VUX1BPV0VSU0FWRV9NT0RFLAotCSBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwgMCwgInNldF9wb3dlcnNhdmUifSwKLQotCXtBVDc2X0dFVF9QT1dFUlNBVkVfTU9ERSwKLQkgMCwgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsICJnZXRfcG93ZXJzYXZlIn0sCi0KLQkvKiBtaW5fY2hhbm5lbF90aW1lLCBtYXhfY2hhbm5lbF90aW1lICovCi0Je0FUNzZfU0VUX1NDQU5fVElNRVMsCi0JIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAyLCAwLCAic2V0X3NjYW5fdGltZXMifSwKLQotCXtBVDc2X0dFVF9TQ0FOX1RJTUVTLAotCSAwLCBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMiwgImdldF9zY2FuX3RpbWVzIn0sCi0KLQkvKiAwIC0gYWN0aXZlLCAxIC0gcGFzc2l2ZSBzY2FuICovCi0Je0FUNzZfU0VUX1NDQU5fTU9ERSwKLQkgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsIDAsICJzZXRfc2Nhbl9tb2RlIn0sCi0KLQl7QVQ3Nl9HRVRfU0NBTl9NT0RFLAotCSAwLCBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwgImdldF9zY2FuX21vZGUifSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaXdfaGFuZGxlcl9kZWYgYXQ3Nl9oYW5kbGVyX2RlZiA9IHsKLQkubnVtX3N0YW5kYXJkID0gQVJSQVlfU0laRShhdDc2X2hhbmRsZXJzKSwKLQkubnVtX3ByaXZhdGUgPSBBUlJBWV9TSVpFKGF0NzZfcHJpdl9oYW5kbGVycyksCi0JLm51bV9wcml2YXRlX2FyZ3MgPSBBUlJBWV9TSVpFKGF0NzZfcHJpdl9hcmdzKSwKLQkuc3RhbmRhcmQgPSBhdDc2X2hhbmRsZXJzLAotCS5wcml2YXRlID0gYXQ3Nl9wcml2X2hhbmRsZXJzLAotCS5wcml2YXRlX2FyZ3MgPSBhdDc2X3ByaXZfYXJncywKLQkuZ2V0X3dpcmVsZXNzX3N0YXRzID0gYXQ3Nl9nZXRfd2lyZWxlc3Nfc3RhdHMsCi19OwotCi1zdGF0aWMgY29uc3QgdTggc25hcHNpZ1tdID0geyAweGFhLCAweGFhLCAweDAzIH07Ci0KLS8qIFJGQyAxMDQyIGVuY2Fwc3VsYXRlcyBFdGhlcm5ldCBmcmFtZXMgaW4gODAyLjIgU05BUCAoMHhhYSwgMHhhYSwgMHgwMykgd2l0aAotICogYSBTTkFQIE9JRCBvZiAwICgweDAwLCAweDAwLCAweDAwKSAqLwotc3RhdGljIGNvbnN0IHU4IHJmYzEwNDJzaWdbXSA9IHsgMHhhYSwgMHhhYSwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCB9OwotCi1zdGF0aWMgaW50IGF0NzZfdHgoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKLXsKLQlzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKLQlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSAmcHJpdi0+c3RhdHM7Ci0JaW50IHJldCA9IDA7Ci0JaW50IHdsZW47Ci0JaW50IHN1Ym1pdF9sZW47Ci0Jc3RydWN0IGF0NzZfdHhfYnVmZmVyICp0eF9idWZmZXIgPSBwcml2LT5idWxrX291dF9idWZmZXI7Ci0Jc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgKmk4MDJfMTFfaGRyID0KLQkgICAgKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICopdHhfYnVmZmVyLT5wYWNrZXQ7Ci0JdTggKnBheWxvYWQgPSBpODAyXzExX2hkci0+cGF5bG9hZDsKLQlzdHJ1Y3QgZXRoaGRyICplaCA9IChzdHJ1Y3QgZXRoaGRyICopc2tiLT5kYXRhOwotCi0JaWYgKG5ldGlmX3F1ZXVlX3N0b3BwZWQobmV0ZGV2KSkgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiAlcyBjYWxsZWQgd2hpbGUgbmV0ZGV2IGlzIHN0b3BwZWRcbiIsCi0JCSAgICAgICBuZXRkZXYtPm5hbWUsIF9fZnVuY19fKTsKLQkJLyogc2tpcCB0aGlzIHBhY2tldCAqLwotCQlkZXZfa2ZyZWVfc2tiKHNrYik7Ci0JCXJldHVybiAwOwotCX0KLQotCWlmIChwcml2LT50eF91cmItPnN0YXR1cyA9PSAtRUlOUFJPR1JFU1MpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogJXMgY2FsbGVkIHdoaWxlIHR4IHVyYiBpcyBwZW5kaW5nXG4iLAotCQkgICAgICAgbmV0ZGV2LT5uYW1lLCBfX2Z1bmNfXyk7Ci0JCS8qIHNraXAgdGhpcyBwYWNrZXQgKi8KLQkJZGV2X2tmcmVlX3NrYihza2IpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlpZiAoc2tiLT5sZW4gPCBFVEhfSExFTikgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiAlczogc2tiIHRvbyBzaG9ydCAoJWQpXG4iLAotCQkgICAgICAgbmV0ZGV2LT5uYW1lLCBfX2Z1bmNfXywgc2tiLT5sZW4pOwotCQlkZXZfa2ZyZWVfc2tiKHNrYik7Ci0JCXJldHVybiAwOwotCX0KLQotCWF0NzZfbGVkdHJpZ190eF9hY3Rpdml0eSgpOwkvKiB0ZWxsIGxlZHRyaWdnZXIgd2Ugc2VuZCBhIHBhY2tldCAqLwotCi0JLyogd2UgY2FuIGdldCByaWQgb2YgbWVtY3B5IGlmIHdlIHNldCBuZXRkZXYtPmhhcmRfaGVhZGVyX2xlbiB0bwotCSAgIHJlc2VydmUgZW5vdWdoIHNwYWNlLCBidXQgd2Ugd291bGQgbmVlZCB0byBrZWVwIHRoZSBza2IgYXJvdW5kICovCi0KLQlpZiAobnRvaHMoZWgtPmhfcHJvdG8pIDw9IEVUSF9EQVRBX0xFTikgewotCQkvKiB0aGlzIGlzIGEgODAyLjMgcGFja2V0ICovCi0JCWlmIChza2ItPmxlbiA+PSBFVEhfSExFTiArIHNpemVvZihyZmMxMDQyc2lnKQotCQkgICAgJiYgc2tiLT5kYXRhW0VUSF9ITEVOXSA9PSByZmMxMDQyc2lnWzBdCi0JCSAgICAmJiBza2ItPmRhdGFbRVRIX0hMRU4gKyAxXSA9PSByZmMxMDQyc2lnWzFdKSB7Ci0JCQkvKiBoaWdoZXIgbGF5ZXIgZGVsaXZlcmVkIFNOQVAgaGVhZGVyIC0ga2VlcCBpdCAqLwotCQkJbWVtY3B5KHBheWxvYWQsIHNrYi0+ZGF0YSArIEVUSF9ITEVOLAotCQkJICAgICAgIHNrYi0+bGVuIC0gRVRIX0hMRU4pOwotCQkJd2xlbiA9IElFRUU4MDIxMV8zQUREUl9MRU4gKyBza2ItPmxlbiAtIEVUSF9ITEVOOwotCQl9IGVsc2UgewotCQkJcHJpbnRrKEtFUk5fRVJSICIlczogZHJvcHBpbmcgbm9uLVNOQVAgODAyLjIgcGFja2V0ICIKLQkJCSAgICAgICAiKERTQVAgMHglMDJ4IFNTQVAgMHglMDJ4IGNudHJsIDB4JTAyeClcbiIsCi0JCQkgICAgICAgcHJpdi0+bmV0ZGV2LT5uYW1lLCBza2ItPmRhdGFbRVRIX0hMRU5dLAotCQkJICAgICAgIHNrYi0+ZGF0YVtFVEhfSExFTiArIDFdLAotCQkJICAgICAgIHNrYi0+ZGF0YVtFVEhfSExFTiArIDJdKTsKLQkJCWRldl9rZnJlZV9za2Ioc2tiKTsKLQkJCXJldHVybiAwOwotCQl9Ci0JfSBlbHNlIHsKLQkJLyogYWRkIFJGQyAxMDQyIGhlYWRlciBpbiBmcm9udCAqLwotCQltZW1jcHkocGF5bG9hZCwgcmZjMTA0MnNpZywgc2l6ZW9mKHJmYzEwNDJzaWcpKTsKLQkJbWVtY3B5KHBheWxvYWQgKyBzaXplb2YocmZjMTA0MnNpZyksICZlaC0+aF9wcm90bywKLQkJICAgICAgIHNrYi0+bGVuIC0gb2Zmc2V0b2Yoc3RydWN0IGV0aGhkciwgaF9wcm90bykpOwotCQl3bGVuID0gSUVFRTgwMjExXzNBRERSX0xFTiArIHNpemVvZihyZmMxMDQyc2lnKSArIHNrYi0+bGVuIC0KLQkJICAgIG9mZnNldG9mKHN0cnVjdCBldGhoZHIsIGhfcHJvdG8pOwotCX0KLQotCS8qIG1ha2Ugd2lyZWxlc3MgaGVhZGVyICovCi0JaTgwMl8xMV9oZHItPmZyYW1lX2N0bCA9Ci0JICAgIGNwdV90b19sZTE2KElFRUU4MDIxMV9GVFlQRV9EQVRBIHwKLQkJCShwcml2LT53ZXBfZW5hYmxlZCA/IElFRUU4MDIxMV9GQ1RMX1BST1RFQ1RFRCA6IDApIHwKLQkJCShwcml2LT5pd19tb2RlID09Ci0JCQkgSVdfTU9ERV9JTkZSQSA/IElFRUU4MDIxMV9GQ1RMX1RPRFMgOiAwKSk7Ci0KLQlpZiAocHJpdi0+aXdfbW9kZSA9PSBJV19NT0RFX0FESE9DKSB7Ci0JCW1lbWNweShpODAyXzExX2hkci0+YWRkcjEsIGVoLT5oX2Rlc3QsIEVUSF9BTEVOKTsKLQkJbWVtY3B5KGk4MDJfMTFfaGRyLT5hZGRyMiwgZWgtPmhfc291cmNlLCBFVEhfQUxFTik7Ci0JCW1lbWNweShpODAyXzExX2hkci0+YWRkcjMsIHByaXYtPmJzc2lkLCBFVEhfQUxFTik7Ci0JfSBlbHNlIGlmIChwcml2LT5pd19tb2RlID09IElXX01PREVfSU5GUkEpIHsKLQkJbWVtY3B5KGk4MDJfMTFfaGRyLT5hZGRyMSwgcHJpdi0+YnNzaWQsIEVUSF9BTEVOKTsKLQkJbWVtY3B5KGk4MDJfMTFfaGRyLT5hZGRyMiwgZWgtPmhfc291cmNlLCBFVEhfQUxFTik7Ci0JCW1lbWNweShpODAyXzExX2hkci0+YWRkcjMsIGVoLT5oX2Rlc3QsIEVUSF9BTEVOKTsKLQl9Ci0KLQlpODAyXzExX2hkci0+ZHVyYXRpb25faWQgPSBjcHVfdG9fbGUxNigwKTsKLQlpODAyXzExX2hkci0+c2VxX2N0bCA9IGNwdV90b19sZTE2KDApOwotCi0JLyogc2V0dXAgJ0F0bWVsJyBoZWFkZXIgKi8KLQl0eF9idWZmZXItPndsZW5ndGggPSBjcHVfdG9fbGUxNih3bGVuKTsKLQl0eF9idWZmZXItPnR4X3JhdGUgPSBwcml2LT50eHJhdGU7Ci0JLyogZm9yIGJyb2FkY2FzdCBkZXN0aW5hdGlvbiBhZGRyZXNzZXMsIHRoZSBmaXJtd2FyZSAwLjEwMC54Ci0JICAgc2VlbXMgdG8gY2hvb3NlIHRoZSBoaWdoZXN0IHJhdGUgc2V0IHdpdGggQ01EX1NUQVJUVVAgaW4KLQkgICBiYXNpY19yYXRlX3NldCByZXBsYWNpbmcgdGhpcyB2YWx1ZSAqLwotCi0JbWVtc2V0KHR4X2J1ZmZlci0+cmVzZXJ2ZWQsIDAsIHNpemVvZih0eF9idWZmZXItPnJlc2VydmVkKSk7Ci0KLQl0eF9idWZmZXItPnBhZGRpbmcgPSBhdDc2X2NhbGNfcGFkZGluZyh3bGVuKTsKLQlzdWJtaXRfbGVuID0gd2xlbiArIEFUNzZfVFhfSERSTEVOICsgdHhfYnVmZmVyLT5wYWRkaW5nOwotCi0JYXQ3Nl9kYmcoREJHX1RYX0RBVEFfQ09OVEVOVCwgIiVzIHNrYi0+ZGF0YSAlcyIsIHByaXYtPm5ldGRldi0+bmFtZSwKLQkJIGhleDJzdHIoc2tiLT5kYXRhLCAzMikpOwotCWF0NzZfZGJnKERCR19UWF9EQVRBLCAiJXMgdHg6IHdsZW4gMHgleCBwYWQgMHgleCByYXRlICVkIGhkciAlcyIsCi0JCSBwcml2LT5uZXRkZXYtPm5hbWUsCi0JCSBsZTE2X3RvX2NwdSh0eF9idWZmZXItPndsZW5ndGgpLAotCQkgdHhfYnVmZmVyLT5wYWRkaW5nLCB0eF9idWZmZXItPnR4X3JhdGUsCi0JCSBoZXgyc3RyKGk4MDJfMTFfaGRyLCBzaXplb2YoKmk4MDJfMTFfaGRyKSkpOwotCWF0NzZfZGJnKERCR19UWF9EQVRBX0NPTlRFTlQsICIlcyBwYXlsb2FkICVzIiwgcHJpdi0+bmV0ZGV2LT5uYW1lLAotCQkgaGV4MnN0cihwYXlsb2FkLCA0OCkpOwotCi0JLyogc2VuZCBzdHVmZiAqLwotCW5ldGlmX3N0b3BfcXVldWUobmV0ZGV2KTsKLQluZXRkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKLQotCXVzYl9maWxsX2J1bGtfdXJiKHByaXYtPnR4X3VyYiwgcHJpdi0+dWRldiwgcHJpdi0+dHhfcGlwZSwgdHhfYnVmZmVyLAotCQkJICBzdWJtaXRfbGVuLCBhdDc2X3R4X2NhbGxiYWNrLCBwcml2KTsKLQlyZXQgPSB1c2Jfc3VibWl0X3VyYihwcml2LT50eF91cmIsIEdGUF9BVE9NSUMpOwotCWlmIChyZXQpIHsKLQkJc3RhdHMtPnR4X2Vycm9ycysrOwotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBlcnJvciBpbiB0eCBzdWJtaXQgdXJiOiAlZFxuIiwKLQkJICAgICAgIG5ldGRldi0+bmFtZSwgcmV0KTsKLQkJaWYgKHJldCA9PSAtRUlOVkFMKQotCQkJcHJpbnRrKEtFUk5fRVJSCi0JCQkgICAgICAgIiVzOiAtRUlOVkFMOiB0eCB1cmIgJXAgaGNwcml2ICVwIGNvbXBsZXRlICVwXG4iLAotCQkJICAgICAgIHByaXYtPm5ldGRldi0+bmFtZSwgcHJpdi0+dHhfdXJiLAotCQkJICAgICAgIHByaXYtPnR4X3VyYi0+aGNwcml2LCBwcml2LT50eF91cmItPmNvbXBsZXRlKTsKLQl9IGVsc2UgewotCQlzdGF0cy0+dHhfYnl0ZXMgKz0gc2tiLT5sZW47Ci0JCWRldl9rZnJlZV9za2Ioc2tiKTsKLQl9Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZCBhdDc2X3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKLXsKLQlzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKLQotCWlmICghcHJpdikKLQkJcmV0dXJuOwotCWRldl93YXJuKCZuZXRkZXYtPmRldiwgInR4IHRpbWVvdXQuIik7Ci0KLQl1c2JfdW5saW5rX3VyYihwcml2LT50eF91cmIpOwotCXByaXYtPnN0YXRzLnR4X2Vycm9ycysrOwotfQotCiBzdGF0aWMgaW50IGF0NzZfc3VibWl0X3J4X3VyYihzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2KQogewogCWludCByZXQ7CkBAIC0zMjU2LDcgKzEzMjcsNyBAQAogCiAJaWYgKCFwcml2LT5yeF91cmIpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogJXM6IHByaXYtPnJ4X3VyYiBpcyBOVUxMXG4iLAotCQkgICAgICAgcHJpdi0+bmV0ZGV2LT5uYW1lLCBfX2Z1bmNfXyk7CisJCSAgICAgICB3aXBoeV9uYW1lKHByaXYtPmh3LT53aXBoeSksIF9fZnVuY19fKTsKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJfQogCkBAIC0zMjY0LDcgKzEzMzUsNyBAQAogCQlza2IgPSBkZXZfYWxsb2Nfc2tiKHNpemVvZihzdHJ1Y3QgYXQ3Nl9yeF9idWZmZXIpKTsKIAkJaWYgKCFza2IpIHsKIAkJCXByaW50ayhLRVJOX0VSUiAiJXM6IGNhbm5vdCBhbGxvY2F0ZSByeCBza2J1ZmZcbiIsCi0JCQkgICAgICAgcHJpdi0+bmV0ZGV2LT5uYW1lKTsKKwkJCSAgICAgICB3aXBoeV9uYW1lKHByaXYtPmh3LT53aXBoeSkpOwogCQkJcmV0ID0gLUVOT01FTTsKIAkJCWdvdG8gZXhpdDsKIAkJfQpAQCAtMzI4NCwxMTAgKzEzNTUsMTggQEAKIAkJCQkgInVzYl9zdWJtaXRfdXJiIHJldHVybmVkIC1FTk9ERVYiKTsKIAkJZWxzZQogCQkJcHJpbnRrKEtFUk5fRVJSICIlczogcngsIHVzYl9zdWJtaXRfdXJiIGZhaWxlZDogJWRcbiIsCi0JCQkgICAgICAgcHJpdi0+bmV0ZGV2LT5uYW1lLCByZXQpOworCQkJICAgICAgIHdpcGh5X25hbWUocHJpdi0+aHctPndpcGh5KSwgcmV0KTsKIAl9CiAKIGV4aXQ6CiAJaWYgKHJldCA8IDAgJiYgcmV0ICE9IC1FTk9ERVYpCiAJCXByaW50ayhLRVJOX0VSUiAiJXM6IGNhbm5vdCBzdWJtaXQgcnggdXJiIC0gcGxlYXNlIHVubG9hZCB0aGUgIgogCQkgICAgICAgImRyaXZlciBhbmQvb3IgcG93ZXIgY3ljbGUgdGhlIGRldmljZVxuIiwKLQkJICAgICAgIHByaXYtPm5ldGRldi0+bmFtZSk7CisJCSAgICAgICB3aXBoeV9uYW1lKHByaXYtPmh3LT53aXBoeSkpOwogCiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBhdDc2X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKLXsKLQlzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKLQlpbnQgcmV0ID0gMDsKLQotCWF0NzZfZGJnKERCR19QUk9DX0VOVFJZLCAiJXMoKTogZW50cnkiLCBfX2Z1bmNfXyk7Ci0KLQlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZwcml2LT5tdHgpKQotCQlyZXR1cm4gLUVJTlRSOwotCi0JLyogaWYgbmV0ZGV2LT5kZXZfYWRkciAhPSBwcml2LT5tYWNfYWRkciB3ZSBtdXN0Ci0JICAgc2V0IHRoZSBtYWMgYWRkcmVzcyBpbiB0aGUgZGV2aWNlICEgKi8KLQlpZiAoY29tcGFyZV9ldGhlcl9hZGRyKG5ldGRldi0+ZGV2X2FkZHIsIHByaXYtPm1hY19hZGRyKSkgewotCQlpZiAoYXQ3Nl9hZGRfbWFjX2FkZHJlc3MocHJpdiwgbmV0ZGV2LT5kZXZfYWRkcikgPj0gMCkKLQkJCWF0NzZfZGJnKERCR19QUk9HUkVTUywgIiVzOiBzZXQgbmV3IE1BQyBhZGRyICVzIiwKLQkJCQkgbmV0ZGV2LT5uYW1lLCBtYWMyc3RyKG5ldGRldi0+ZGV2X2FkZHIpKTsKLQl9Ci0KLQlwcml2LT5zY2FuX3N0YXRlID0gU0NBTl9JRExFOwotCXByaXYtPmxhc3Rfc2NhbiA9IGppZmZpZXM7Ci0KLQlyZXQgPSBhdDc2X3N1Ym1pdF9yeF91cmIocHJpdik7Ci0JaWYgKHJldCA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogb3Blbjogc3VibWl0X3J4X3VyYiBmYWlsZWQ6ICVkXG4iLAotCQkgICAgICAgbmV0ZGV2LT5uYW1lLCByZXQpOwotCQlnb3RvIGVycm9yOwotCX0KLQotCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmcHJpdi0+ZHdvcmtfcmVzdGFydCwgMCk7Ci0KLQlhdDc2X2RiZyhEQkdfUFJPQ19FTlRSWSwgIiVzKCk6IGVuZCIsIF9fZnVuY19fKTsKLWVycm9yOgotCW11dGV4X3VubG9jaygmcHJpdi0+bXR4KTsKLQlyZXR1cm4gcmV0IDwgMCA/IHJldCA6IDA7Ci19Ci0KLXN0YXRpYyBpbnQgYXQ3Nl9zdG9wKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCi17Ci0Jc3RydWN0IGF0NzZfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KG5ldGRldik7Ci0KLQlhdDc2X2RiZyhEQkdfREVWU1RBUlQsICIlczogRU5URVIiLCBfX2Z1bmNfXyk7Ci0KLQlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZwcml2LT5tdHgpKQotCQlyZXR1cm4gLUVJTlRSOwotCi0JYXQ3Nl9xdWllc2NlKHByaXYpOwotCi0JaWYgKCFwcml2LT5kZXZpY2VfdW5wbHVnZ2VkKSB7Ci0JCS8qIFdlIGFyZSBjYWxsZWQgYnkgImlmY29uZmlnIGV0aFggZG93biIsIG5vdCBiZWNhdXNlIHRoZQotCQkgKiBkZXZpY2UgaXMgbm90IGF2YWlsYWJsZSBhbnltb3JlLiAqLwotCQlhdDc2X3NldF9yYWRpbyhwcml2LCAwKTsKLQotCQkvKiBXZSB1bmxpbmsgcnhfdXJiIGJlY2F1c2UgYXQ3Nl9vcGVuKCkgcmUtc3VibWl0cyBpdC4KLQkJICogSWYgdW5wbHVnZ2VkLCBhdDc2X2RlbGV0ZV9kZXZpY2UoKSB0YWtlcyBjYXJlIG9mIGl0LiAqLwotCQl1c2Jfa2lsbF91cmIocHJpdi0+cnhfdXJiKTsKLQl9Ci0KLQkvKiBmcmVlIHRoZSBic3NfbGlzdCAqLwotCWF0NzZfZnJlZV9ic3NfbGlzdChwcml2KTsKLQotCW11dGV4X3VubG9jaygmcHJpdi0+bXR4KTsKLQlhdDc2X2RiZyhEQkdfREVWU1RBUlQsICIlczogRVhJVCIsIF9fZnVuY19fKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBhdDc2X2V0aHRvb2xfZ2V0X2RydmluZm8oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKLQkJCQkgICAgIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmluZm8pCi17Ci0Jc3RydWN0IGF0NzZfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KG5ldGRldik7Ci0KLQlzdHJuY3B5KGluZm8tPmRyaXZlciwgRFJJVkVSX05BTUUsIHNpemVvZihpbmZvLT5kcml2ZXIpKTsKLQlzdHJuY3B5KGluZm8tPnZlcnNpb24sIERSSVZFUl9WRVJTSU9OLCBzaXplb2YoaW5mby0+dmVyc2lvbikpOwotCi0JdXNiX21ha2VfcGF0aChwcml2LT51ZGV2LCBpbmZvLT5idXNfaW5mbywgc2l6ZW9mKGluZm8tPmJ1c19pbmZvKSk7Ci0KLQlzbnByaW50ZihpbmZvLT5md192ZXJzaW9uLCBzaXplb2YoaW5mby0+ZndfdmVyc2lvbiksICIlZC4lZC4lZC0lZCIsCi0JCSBwcml2LT5md192ZXJzaW9uLm1ham9yLCBwcml2LT5md192ZXJzaW9uLm1pbm9yLAotCQkgcHJpdi0+ZndfdmVyc2lvbi5wYXRjaCwgcHJpdi0+ZndfdmVyc2lvbi5idWlsZCk7Ci19Ci0KLXN0YXRpYyB1MzIgYXQ3Nl9ldGh0b29sX2dldF9saW5rKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCi17Ci0Jc3RydWN0IGF0NzZfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KG5ldGRldik7Ci0JcmV0dXJuIHByaXYtPm1hY19zdGF0ZSA9PSBNQUNfQ09OTkVDVEVEOwotfQotCi1zdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIGF0NzZfZXRodG9vbF9vcHMgPSB7Ci0JLmdldF9kcnZpbmZvID0gYXQ3Nl9ldGh0b29sX2dldF9kcnZpbmZvLAotCS5nZXRfbGluayA9IGF0NzZfZXRodG9vbF9nZXRfbGluaywKLX07Ci0KIC8qIERvd25sb2FkIGV4dGVybmFsIGZpcm13YXJlICovCiBzdGF0aWMgaW50IGF0NzZfbG9hZF9leHRlcm5hbF9mdyhzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiwgc3RydWN0IGZ3ZW50cnkgKmZ3ZSkKIHsKQEAgLTM0ODQsNDA2ICsxNDYzLDYgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IGF0NzZfbWF0Y2hfZXNzaWQoc3RydWN0IGF0NzZfcHJpdiAqcHJpdiwgc3RydWN0IGJzc19pbmZvICpwdHIpCi17Ci0JLyogY29tbW9uIGNyaXRlcmlhIGZvciBib3RoIG1vZGkgKi8KLQotCWludCByZXQgPSAocHJpdi0+ZXNzaWRfc2l6ZSA9PSAwIC8qIEFOWSBzc2lkICovICB8fAotCQkgICAocHJpdi0+ZXNzaWRfc2l6ZSA9PSBwdHItPnNzaWRfbGVuICYmCi0JCSAgICAhbWVtY21wKHByaXYtPmVzc2lkLCBwdHItPnNzaWQsIHB0ci0+c3NpZF9sZW4pKSk7Ci0JaWYgKCFyZXQpCi0JCWF0NzZfZGJnKERCR19CU1NfTUFUQ0gsCi0JCQkgIiVzIGJzcyB0YWJsZSBlbnRyeSAlcDogZXNzaWQgZGlkbid0IG1hdGNoIiwKLQkJCSBwcml2LT5uZXRkZXYtPm5hbWUsIHB0cik7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgYXQ3Nl9tYXRjaF9tb2RlKHN0cnVjdCBhdDc2X3ByaXYgKnByaXYsIHN0cnVjdCBic3NfaW5mbyAqcHRyKQotewotCWludCByZXQ7Ci0KLQlpZiAocHJpdi0+aXdfbW9kZSA9PSBJV19NT0RFX0FESE9DKQotCQlyZXQgPSBwdHItPmNhcGEgJiBXTEFOX0NBUEFCSUxJVFlfSUJTUzsKLQllbHNlCi0JCXJldCA9IHB0ci0+Y2FwYSAmIFdMQU5fQ0FQQUJJTElUWV9FU1M7Ci0JaWYgKCFyZXQpCi0JCWF0NzZfZGJnKERCR19CU1NfTUFUQ0gsCi0JCQkgIiVzIGJzcyB0YWJsZSBlbnRyeSAlcDogbW9kZSBkaWRuJ3QgbWF0Y2giLAotCQkJIHByaXYtPm5ldGRldi0+bmFtZSwgcHRyKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGF0NzZfbWF0Y2hfcmF0ZXMoc3RydWN0IGF0NzZfcHJpdiAqcHJpdiwgc3RydWN0IGJzc19pbmZvICpwdHIpCi17Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgcHRyLT5yYXRlc19sZW47IGkrKykgewotCQl1OCByYXRlID0gcHRyLT5yYXRlc1tpXTsKLQotCQlpZiAoIShyYXRlICYgMHg4MCkpCi0JCQljb250aW51ZTsKLQotCQkvKiB0aGlzIGlzIGEgYmFzaWMgcmF0ZSB3ZSBoYXZlIHRvIHN1cHBvcnQKLQkJICAgKHNlZSBJRUVFODAyLjExLCBjaC4gNy4zLjIuMikgKi8KLQkJaWYgKHJhdGUgIT0gKDB4ODAgfCBod19yYXRlc1swXSkKLQkJICAgICYmIHJhdGUgIT0gKDB4ODAgfCBod19yYXRlc1sxXSkKLQkJICAgICYmIHJhdGUgIT0gKDB4ODAgfCBod19yYXRlc1syXSkKLQkJICAgICYmIHJhdGUgIT0gKDB4ODAgfCBod19yYXRlc1szXSkpIHsKLQkJCWF0NzZfZGJnKERCR19CU1NfTUFUQ0gsCi0JCQkJICIlczogYnNzIHRhYmxlIGVudHJ5ICVwOiBiYXNpYyByYXRlICUwMnggbm90ICIKLQkJCQkgInN1cHBvcnRlZCIsIHByaXYtPm5ldGRldi0+bmFtZSwgcHRyLCByYXRlKTsKLQkJCXJldHVybiAwOwotCQl9Ci0JfQotCi0JLyogaWYgd2UgdXNlIHNob3J0IHByZWFtYmxlLCB0aGUgYnNzIG11c3Qgc3VwcG9ydCBpdCAqLwotCWlmIChwcml2LT5wcmVhbWJsZV90eXBlID09IFBSRUFNQkxFX1RZUEVfU0hPUlQgJiYKLQkgICAgIShwdHItPmNhcGEgJiBXTEFOX0NBUEFCSUxJVFlfU0hPUlRfUFJFQU1CTEUpKSB7Ci0JCWF0NzZfZGJnKERCR19CU1NfTUFUQ0gsCi0JCQkgIiVzOiAlcCBkb2VzIG5vdCBzdXBwb3J0IHNob3J0IHByZWFtYmxlIiwKLQkJCSBwcml2LT5uZXRkZXYtPm5hbWUsIHB0cik7Ci0JCXJldHVybiAwOwotCX0gZWxzZQotCQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgYXQ3Nl9tYXRjaF93ZXAoc3RydWN0IGF0NzZfcHJpdiAqcHJpdiwgc3RydWN0IGJzc19pbmZvICpwdHIpCi17Ci0JaWYgKCFwcml2LT53ZXBfZW5hYmxlZCAmJiBwdHItPmNhcGEgJiBXTEFOX0NBUEFCSUxJVFlfUFJJVkFDWSkgewotCQkvKiB3ZSBoYXZlIGRpc2FibGVkIFdFUCwgYnV0IHRoZSBCU1Mgc2lnbmFscyBwcml2YWN5ICovCi0JCWF0NzZfZGJnKERCR19CU1NfTUFUQ0gsCi0JCQkgIiVzOiBic3MgdGFibGUgZW50cnkgJXA6IHJlcXVpcmVzIGVuY3J5cHRpb24iLAotCQkJIHByaXYtPm5ldGRldi0+bmFtZSwgcHRyKTsKLQkJcmV0dXJuIDA7Ci0JfQotCS8qIG90aGVyd2lzZSBpZiB0aGUgQlNTIGRvZXMgbm90IHNpZ25hbCBwcml2YWN5IGl0IG1heSB3ZWxsCi0JICAgYWNjZXB0IGVuY3J5cHRlZCBwYWNrZXRzIGZyb20gdXMgLi4uICovCi0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGF0NzZfbWF0Y2hfYnNzaWQoc3RydWN0IGF0NzZfcHJpdiAqcHJpdiwgc3RydWN0IGJzc19pbmZvICpwdHIpCi17Ci0JaWYgKCFwcml2LT53YW50ZWRfYnNzaWRfdmFsaWQgfHwKLQkgICAgIWNvbXBhcmVfZXRoZXJfYWRkcihwdHItPmJzc2lkLCBwcml2LT53YW50ZWRfYnNzaWQpKQotCQlyZXR1cm4gMTsKLQotCWF0NzZfZGJnKERCR19CU1NfTUFUQ0gsCi0JCSAiJXM6IHJlcXVlc3RlZCBic3NpZCAtICVzIGRvZXMgbm90IG1hdGNoIiwKLQkJIHByaXYtPm5ldGRldi0+bmFtZSwgbWFjMnN0cihwcml2LT53YW50ZWRfYnNzaWQpKTsKLQlhdDc2X2RiZyhEQkdfQlNTX01BVENILAotCQkgIiAgICAgIEFQIGJzc2lkIC0gJXMgb2YgYnNzIHRhYmxlIGVudHJ5ICVwIiwKLQkJIG1hYzJzdHIocHRyLT5ic3NpZCksIHB0cik7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qKgotICogYXQ3Nl9tYXRjaF9ic3MgLSB0cnkgdG8gZmluZCBhIG1hdGNoaW5nIGJzcyBpbiBwcml2LT5ic3MKLSAqCi0gKiBsYXN0IC0gbGFzdCBic3MgdHJpZWQKLSAqCi0gKiBsYXN0ID09IE5VTEwgc2lnbmFscyBhIG5ldyByb3VuZCBzdGFydGluZyB3aXRoIHByaXYtPmJzc19saXN0Lm5leHQKLSAqIHRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgaW5zaWRlIGFuIGFjcXVpcmVkIHByaXYtPmJzc19saXN0X3NwaW5sb2NrCi0gKiBvdGhlcndpc2UgdGhlIHRpbWVvdXQgb24gYnNzIG1heSByZW1vdmUgdGhlIG5ld2x5IGNob3NlbiBlbnRyeQotICovCi1zdGF0aWMgc3RydWN0IGJzc19pbmZvICphdDc2X21hdGNoX2JzcyhzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2LAotCQkJCSAgICAgICBzdHJ1Y3QgYnNzX2luZm8gKmxhc3QpCi17Ci0Jc3RydWN0IGJzc19pbmZvICpwdHIgPSBOVUxMOwotCXN0cnVjdCBsaXN0X2hlYWQgKmN1cnI7Ci0KLQljdXJyID0gbGFzdCA/IGxhc3QtPmxpc3QubmV4dCA6IHByaXYtPmJzc19saXN0Lm5leHQ7Ci0Jd2hpbGUgKGN1cnIgIT0gJnByaXYtPmJzc19saXN0KSB7Ci0JCXB0ciA9IGxpc3RfZW50cnkoY3Vyciwgc3RydWN0IGJzc19pbmZvLCBsaXN0KTsKLQkJaWYgKGF0NzZfbWF0Y2hfZXNzaWQocHJpdiwgcHRyKSAmJiBhdDc2X21hdGNoX21vZGUocHJpdiwgcHRyKQotCQkgICAgJiYgYXQ3Nl9tYXRjaF93ZXAocHJpdiwgcHRyKSAmJiBhdDc2X21hdGNoX3JhdGVzKHByaXYsIHB0cikKLQkJICAgICYmIGF0NzZfbWF0Y2hfYnNzaWQocHJpdiwgcHRyKSkKLQkJCWJyZWFrOwotCQljdXJyID0gY3Vyci0+bmV4dDsKLQl9Ci0KLQlpZiAoY3VyciA9PSAmcHJpdi0+YnNzX2xpc3QpCi0JCXB0ciA9IE5VTEw7Ci0JLyogb3RoZXJ3aXNlIHB0ciBwb2ludHMgdG8gdGhlIHN0cnVjdCBic3NfaW5mbyB3ZSBoYXZlIGNob3NlbiAqLwotCi0JYXQ3Nl9kYmcoREJHX0JTU19UQUJMRSwgIiVzICVzOiByZXR1cm5lZCAlcCIsIHByaXYtPm5ldGRldi0+bmFtZSwKLQkJIF9fZnVuY19fLCBwdHIpOwotCXJldHVybiBwdHI7Ci19Ci0KLS8qIFN0YXJ0IGpvaW5pbmcgYSBtYXRjaGluZyBCU1MsIG9yIGNyZWF0ZSBvd24gSUJTUyAqLwotc3RhdGljIHZvaWQgYXQ3Nl93b3JrX2pvaW4oc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCXN0cnVjdCBhdDc2X3ByaXYgKnByaXYgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGF0NzZfcHJpdiwKLQkJCQkJICAgICAgd29ya19qb2luKTsKLQlpbnQgcmV0OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQltdXRleF9sb2NrKCZwcml2LT5tdHgpOwotCi0JV0FSTl9PTihwcml2LT5tYWNfc3RhdGUgIT0gTUFDX0pPSU5JTkcpOwotCWlmIChwcml2LT5tYWNfc3RhdGUgIT0gTUFDX0pPSU5JTkcpCi0JCWdvdG8gZXhpdDsKLQotCS8qIHNlY3VyZSB0aGUgYWNjZXNzIHRvIHByaXYtPmN1cnJfYnNzICEgKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+YnNzX2xpc3Rfc3BpbmxvY2ssIGZsYWdzKTsKLQlwcml2LT5jdXJyX2JzcyA9IGF0NzZfbWF0Y2hfYnNzKHByaXYsIHByaXYtPmN1cnJfYnNzKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5ic3NfbGlzdF9zcGlubG9jaywgZmxhZ3MpOwotCi0JaWYgKCFwcml2LT5jdXJyX2JzcykgewotCQkvKiBoZXJlIHdlIGhhdmVuJ3QgZm91bmQgYSBtYXRjaGluZyAoaSlic3MgLi4uICovCi0JCWlmIChwcml2LT5pd19tb2RlID09IElXX01PREVfQURIT0MpIHsKLQkJCWF0NzZfc2V0X21hY19zdGF0ZShwcml2LCBNQUNfT1dOX0lCU1MpOwotCQkJYXQ3Nl9zdGFydF9pYnNzKHByaXYpOwotCQkJZ290byBleGl0OwotCQl9Ci0JCS8qIGhhdmVuJ3QgZm91bmQgYSBtYXRjaGluZyBCU1MgaW4gaW5mcmEgbW9kZSAtIHRyeSBhZ2FpbiAqLwotCQlhdDc2X3NldF9tYWNfc3RhdGUocHJpdiwgTUFDX1NDQU5OSU5HKTsKLQkJc2NoZWR1bGVfd29yaygmcHJpdi0+d29ya19zdGFydF9zY2FuKTsKLQkJZ290byBleGl0OwotCX0KLQotCXJldCA9IGF0NzZfam9pbl9ic3MocHJpdiwgcHJpdi0+Y3Vycl9ic3MpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IGpvaW5fYnNzIGZhaWxlZCB3aXRoICVkXG4iLAotCQkgICAgICAgcHJpdi0+bmV0ZGV2LT5uYW1lLCByZXQpOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JcmV0ID0gYXQ3Nl93YWl0X2NvbXBsZXRpb24ocHJpdiwgQ01EX0pPSU4pOwotCWlmIChyZXQgIT0gQ01EX1NUQVRVU19DT01QTEVURSkgewotCQlpZiAocmV0ICE9IENNRF9TVEFUVVNfVElNRV9PVVQpCi0JCQlwcmludGsoS0VSTl9FUlIgIiVzOiBqb2luX2JzcyBjb21wbGV0ZWQgd2l0aCAlZFxuIiwKLQkJCSAgICAgICBwcml2LT5uZXRkZXYtPm5hbWUsIHJldCk7Ci0JCWVsc2UKLQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBqb2luX2JzcyBzc2lkICVzIHRpbWVkIG91dFxuIiwKLQkJCSAgICAgICBwcml2LT5uZXRkZXYtPm5hbWUsCi0JCQkgICAgICAgbWFjMnN0cihwcml2LT5jdXJyX2Jzcy0+YnNzaWQpKTsKLQotCQkvKiByZXRyeSBuZXh0IEJTUyBpbW1lZGlhdGVseSAqLwotCQlzY2hlZHVsZV93b3JrKCZwcml2LT53b3JrX2pvaW4pOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JLyogaGVyZSB3ZSBoYXZlIGpvaW5lZCB0aGUgKEkpQlNTICovCi0JaWYgKHByaXYtPml3X21vZGUgPT0gSVdfTU9ERV9BREhPQykgewotCQlzdHJ1Y3QgYnNzX2luZm8gKmJwdHIgPSBwcml2LT5jdXJyX2JzczsKLQkJYXQ3Nl9zZXRfbWFjX3N0YXRlKHByaXYsIE1BQ19DT05ORUNURUQpOwotCQkvKiBnZXQgRVNTSUQsIEJTU0lEIGFuZCBjaGFubmVsIGZvciBwcml2LT5jdXJyX2JzcyAqLwotCQlwcml2LT5lc3NpZF9zaXplID0gYnB0ci0+c3NpZF9sZW47Ci0JCW1lbWNweShwcml2LT5lc3NpZCwgYnB0ci0+c3NpZCwgYnB0ci0+c3NpZF9sZW4pOwotCQltZW1jcHkocHJpdi0+YnNzaWQsIGJwdHItPmJzc2lkLCBFVEhfQUxFTik7Ci0JCXByaXYtPmNoYW5uZWwgPSBicHRyLT5jaGFubmVsOwotCQlhdDc2X2l3ZXZlbnRfYnNzX2Nvbm5lY3QocHJpdi0+bmV0ZGV2LCBicHRyLT5ic3NpZCk7Ci0JCW5ldGlmX2NhcnJpZXJfb24ocHJpdi0+bmV0ZGV2KTsKLQkJbmV0aWZfc3RhcnRfcXVldWUocHJpdi0+bmV0ZGV2KTsKLQkJLyoganVzdCB0byBiZSBzdXJlICovCi0JCWNhbmNlbF9kZWxheWVkX3dvcmsoJnByaXYtPmR3b3JrX2dldF9zY2FuKTsKLQkJY2FuY2VsX2RlbGF5ZWRfd29yaygmcHJpdi0+ZHdvcmtfYXV0aCk7Ci0JCWNhbmNlbF9kZWxheWVkX3dvcmsoJnByaXYtPmR3b3JrX2Fzc29jKTsKLQl9IGVsc2UgewotCQkvKiBzZW5kIGF1dGggcmVxICovCi0JCXByaXYtPnJldHJpZXMgPSBBVVRIX1JFVFJJRVM7Ci0JCWF0NzZfc2V0X21hY19zdGF0ZShwcml2LCBNQUNfQVVUSCk7Ci0JCWF0NzZfYXV0aF9yZXEocHJpdiwgcHJpdi0+Y3Vycl9ic3MsIDEsIE5VTEwpOwotCQlhdDc2X2RiZyhEQkdfTUdNVF9USU1FUiwKLQkJCSAiJXM6JWQ6IHN0YXJ0aW5nIG1nbXRfdGltZXIgKyBIWiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmcHJpdi0+ZHdvcmtfYXV0aCwgQVVUSF9USU1FT1VUKTsKLQl9Ci0KLWV4aXQ6Ci0JbXV0ZXhfdW5sb2NrKCZwcml2LT5tdHgpOwotfQotCi0vKiBSZWFwIHNjYW4gcmVzdWx0cyAqLwotc3RhdGljIHZvaWQgYXQ3Nl9kd29ya19nZXRfc2NhbihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCi17Ci0JaW50IHN0YXR1czsKLQlpbnQgcmV0OwotCXN0cnVjdCBhdDc2X3ByaXYgKnByaXYgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGF0NzZfcHJpdiwKLQkJCQkJICAgICAgZHdvcmtfZ2V0X3NjYW4ud29yayk7Ci0KLQltdXRleF9sb2NrKCZwcml2LT5tdHgpOwotCVdBUk5fT04ocHJpdi0+bWFjX3N0YXRlICE9IE1BQ19TQ0FOTklORyk7Ci0JaWYgKHByaXYtPm1hY19zdGF0ZSAhPSBNQUNfU0NBTk5JTkcpCi0JCWdvdG8gZXhpdDsKLQotCXN0YXR1cyA9IGF0NzZfZ2V0X2NtZF9zdGF0dXMocHJpdi0+dWRldiwgQ01EX1NDQU4pOwotCWlmIChzdGF0dXMgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6ICVzOiBhdDc2X2dldF9jbWRfc3RhdHVzIGZhaWxlZCB3aXRoICVkXG4iLAotCQkgICAgICAgcHJpdi0+bmV0ZGV2LT5uYW1lLCBfX2Z1bmNfXywgc3RhdHVzKTsKLQkJc3RhdHVzID0gQ01EX1NUQVRVU19JTl9QUk9HUkVTUzsKLQkJLyogSU5GTzogSG9wZSBpdCB3YXMgYSBvbmUgb2ZmIGVycm9yIC0gaWYgbm90LCBzY2FubmluZwotCQkgICBmdXJ0aGVyIGRvd24gdGhlIGxpbmUgYW5kIHN0b3AgdGhpcyBjeWNsZSAqLwotCX0KLQlhdDc2X2RiZyhEQkdfUFJPR1JFU1MsCi0JCSAiJXMgJXM6IGdvdCBjbWRfc3RhdHVzICVkIChzdGF0ZSAlcywgbmVlZF9hbnkgJWQpIiwKLQkJIHByaXYtPm5ldGRldi0+bmFtZSwgX19mdW5jX18sIHN0YXR1cywKLQkJIG1hY19zdGF0ZXNbcHJpdi0+bWFjX3N0YXRlXSwgcHJpdi0+c2Nhbl9uZWVkX2FueSk7Ci0KLQlpZiAoc3RhdHVzICE9IENNRF9TVEFUVVNfQ09NUExFVEUpIHsKLQkJaWYgKChzdGF0dXMgIT0gQ01EX1NUQVRVU19JTl9QUk9HUkVTUykgJiYKLQkJICAgIChzdGF0dXMgIT0gQ01EX1NUQVRVU19JRExFKSkKLQkJCXByaW50ayhLRVJOX0VSUiAiJXM6ICVzOiBCYWQgc2NhbiBzdGF0dXM6ICVzXG4iLAotCQkJICAgICAgIHByaXYtPm5ldGRldi0+bmFtZSwgX19mdW5jX18sCi0JCQkgICAgICAgYXQ3Nl9nZXRfY21kX3N0YXR1c19zdHJpbmcoc3RhdHVzKSk7Ci0KLQkJLyogdGhlIGZpcnN0IGNtZCBzdGF0dXMgYWZ0ZXIgc2NhbiBzdGFydCBpcyBhbHdheXMgYSBJRExFIC0+Ci0JCSAgIHN0YXJ0IHRoZSB0aW1lciB0byBwb2xsIGFnYWluIHVudGlsIENPTVBMRVRFRCAqLwotCQlhdDc2X2RiZyhEQkdfTUdNVF9USU1FUiwKLQkJCSAiJXM6JWQ6IHN0YXJ0aW5nIG1nbXRfdGltZXIgZm9yICVkIHRpY2tzIiwKLQkJCSBfX2Z1bmNfXywgX19MSU5FX18sIFNDQU5fUE9MTF9JTlRFUlZBTCk7Ci0JCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmcHJpdi0+ZHdvcmtfZ2V0X3NjYW4sCi0JCQkJICAgICAgU0NBTl9QT0xMX0lOVEVSVkFMKTsKLQkJZ290byBleGl0OwotCX0KLQotCWlmIChhdDc2X2RlYnVnICYgREJHX0JTU19UQUJMRSkKLQkJYXQ3Nl9kdW1wX2Jzc190YWJsZShwcml2KTsKLQotCWlmIChwcml2LT5zY2FuX25lZWRfYW55KSB7Ci0JCXJldCA9IGF0NzZfc3RhcnRfc2Nhbihwcml2LCAwKTsKLQkJaWYgKHJldCA8IDApCi0JCQlwcmludGsoS0VSTl9FUlIKLQkJCSAgICAgICAiJXM6ICVzOiBzdGFydF9zY2FuIChBTlkpIGZhaWxlZCB3aXRoICVkXG4iLAotCQkJICAgICAgIHByaXYtPm5ldGRldi0+bmFtZSwgX19mdW5jX18sIHJldCk7Ci0JCWF0NzZfZGJnKERCR19NR01UX1RJTUVSLAotCQkJICIlczolZDogc3RhcnRpbmcgbWdtdF90aW1lciBmb3IgJWQgdGlja3MiLCBfX2Z1bmNfXywKLQkJCSBfX0xJTkVfXywgU0NBTl9QT0xMX0lOVEVSVkFMKTsKLQkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZwcml2LT5kd29ya19nZXRfc2NhbiwKLQkJCQkgICAgICBTQ0FOX1BPTExfSU5URVJWQUwpOwotCQlwcml2LT5zY2FuX25lZWRfYW55ID0gMDsKLQl9IGVsc2UgewotCQlwcml2LT5zY2FuX3N0YXRlID0gU0NBTl9DT01QTEVURUQ7Ci0JCS8qIHJlcG9ydCB0aGUgZW5kIG9mIHNjYW4gdG8gdXNlciBzcGFjZSAqLwotCQlhdDc2X2l3ZXZlbnRfc2Nhbl9jb21wbGV0ZShwcml2LT5uZXRkZXYpOwotCQlhdDc2X3NldF9tYWNfc3RhdGUocHJpdiwgTUFDX0pPSU5JTkcpOwotCQlzY2hlZHVsZV93b3JrKCZwcml2LT53b3JrX2pvaW4pOwotCX0KLQotZXhpdDoKLQltdXRleF91bmxvY2soJnByaXYtPm10eCk7Ci19Ci0KLS8qIEhhbmRsZSBsb3NzIG9mIGJlYWNvbnMgZnJvbSB0aGUgQVAgKi8KLXN0YXRpYyB2b2lkIGF0NzZfZHdvcmtfYmVhY29uKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKLXsKLQlzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBhdDc2X3ByaXYsCi0JCQkJCSAgICAgIGR3b3JrX2JlYWNvbi53b3JrKTsKLQotCW11dGV4X2xvY2soJnByaXYtPm10eCk7Ci0JaWYgKHByaXYtPm1hY19zdGF0ZSAhPSBNQUNfQ09OTkVDVEVEIHx8IHByaXYtPml3X21vZGUgIT0gSVdfTU9ERV9JTkZSQSkKLQkJZ290byBleGl0OwotCi0JLyogV2UgaGF2ZW4ndCByZWNlaXZlZCBhbnkgYmVhY29ucyBmcm9tIG91dCBBUCBmb3IgQkVBQ09OX1RJTUVPVVQgKi8KLQlwcmludGsoS0VSTl9JTkZPICIlczogbG9zdCBiZWFjb24gYnNzaWQgJXNcbiIsCi0JICAgICAgIHByaXYtPm5ldGRldi0+bmFtZSwgbWFjMnN0cihwcml2LT5jdXJyX2Jzcy0+YnNzaWQpKTsKLQotCW5ldGlmX2NhcnJpZXJfb2ZmKHByaXYtPm5ldGRldik7Ci0JbmV0aWZfc3RvcF9xdWV1ZShwcml2LT5uZXRkZXYpOwotCWF0NzZfaXdldmVudF9ic3NfZGlzY29ubmVjdChwcml2LT5uZXRkZXYpOwotCWF0NzZfc2V0X21hY19zdGF0ZShwcml2LCBNQUNfU0NBTk5JTkcpOwotCXNjaGVkdWxlX3dvcmsoJnByaXYtPndvcmtfc3RhcnRfc2Nhbik7Ci0KLWV4aXQ6Ci0JbXV0ZXhfdW5sb2NrKCZwcml2LT5tdHgpOwotfQotCi0vKiBIYW5kbGUgYXV0aGVudGljYXRpb24gcmVzcG9uc2UgdGltZW91dCAqLwotc3RhdGljIHZvaWQgYXQ3Nl9kd29ya19hdXRoKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKLXsKLQlzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBhdDc2X3ByaXYsCi0JCQkJCSAgICAgIGR3b3JrX2F1dGgud29yayk7Ci0KLQltdXRleF9sb2NrKCZwcml2LT5tdHgpOwotCVdBUk5fT04ocHJpdi0+bWFjX3N0YXRlICE9IE1BQ19BVVRIKTsKLQlpZiAocHJpdi0+bWFjX3N0YXRlICE9IE1BQ19BVVRIKQotCQlnb3RvIGV4aXQ7Ci0KLQlhdDc2X2RiZyhEQkdfUFJPR1JFU1MsICIlczogYXV0aGVudGljYXRpb24gcmVzcG9uc2UgdGltZW91dCIsCi0JCSBwcml2LT5uZXRkZXYtPm5hbWUpOwotCi0JaWYgKHByaXYtPnJldHJpZXMtLSA+PSAwKSB7Ci0JCWF0NzZfYXV0aF9yZXEocHJpdiwgcHJpdi0+Y3Vycl9ic3MsIDEsIE5VTEwpOwotCQlhdDc2X2RiZyhEQkdfTUdNVF9USU1FUiwgIiVzOiVkOiBzdGFydGluZyBtZ210X3RpbWVyICsgSFoiLAotCQkJIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmcHJpdi0+ZHdvcmtfYXV0aCwgQVVUSF9USU1FT1VUKTsKLQl9IGVsc2UgewotCQkvKiB0cnkgdG8gZ2V0IG5leHQgbWF0Y2hpbmcgQlNTICovCi0JCWF0NzZfc2V0X21hY19zdGF0ZShwcml2LCBNQUNfSk9JTklORyk7Ci0JCXNjaGVkdWxlX3dvcmsoJnByaXYtPndvcmtfam9pbik7Ci0JfQotCi1leGl0OgotCW11dGV4X3VubG9jaygmcHJpdi0+bXR4KTsKLX0KLQotLyogSGFuZGxlIGFzc29jaWF0aW9uIHJlc3BvbnNlIHRpbWVvdXQgKi8KLXN0YXRpYyB2b2lkIGF0NzZfZHdvcmtfYXNzb2Moc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCXN0cnVjdCBhdDc2X3ByaXYgKnByaXYgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGF0NzZfcHJpdiwKLQkJCQkJICAgICAgZHdvcmtfYXNzb2Mud29yayk7Ci0KLQltdXRleF9sb2NrKCZwcml2LT5tdHgpOwotCVdBUk5fT04ocHJpdi0+bWFjX3N0YXRlICE9IE1BQ19BU1NPQyk7Ci0JaWYgKHByaXYtPm1hY19zdGF0ZSAhPSBNQUNfQVNTT0MpCi0JCWdvdG8gZXhpdDsKLQotCWF0NzZfZGJnKERCR19QUk9HUkVTUywgIiVzOiBhc3NvY2lhdGlvbiByZXNwb25zZSB0aW1lb3V0IiwKLQkJIHByaXYtPm5ldGRldi0+bmFtZSk7Ci0KLQlpZiAocHJpdi0+cmV0cmllcy0tID49IDApIHsKLQkJYXQ3Nl9hc3NvY19yZXEocHJpdiwgcHJpdi0+Y3Vycl9ic3MpOwotCQlhdDc2X2RiZyhEQkdfTUdNVF9USU1FUiwgIiVzOiVkOiBzdGFydGluZyBtZ210X3RpbWVyICsgSFoiLAotCQkJIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmcHJpdi0+ZHdvcmtfYXNzb2MsIEFTU09DX1RJTUVPVVQpOwotCX0gZWxzZSB7Ci0JCS8qIHRyeSB0byBnZXQgbmV4dCBtYXRjaGluZyBCU1MgKi8KLQkJYXQ3Nl9zZXRfbWFjX3N0YXRlKHByaXYsIE1BQ19KT0lOSU5HKTsKLQkJc2NoZWR1bGVfd29yaygmcHJpdi0+d29ya19qb2luKTsKLQl9Ci0KLWV4aXQ6Ci0JbXV0ZXhfdW5sb2NrKCZwcml2LT5tdHgpOwotfQotCi0vKiBSZWFkIG5ldyBic3NpZCBpbiBhZC1ob2MgbW9kZSAqLwotc3RhdGljIHZvaWQgYXQ3Nl93b3JrX25ld19ic3Moc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCXN0cnVjdCBhdDc2X3ByaXYgKnByaXYgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGF0NzZfcHJpdiwKLQkJCQkJICAgICAgd29ya19uZXdfYnNzKTsKLQlpbnQgcmV0OwotCXN0cnVjdCBtaWJfbWFjX21nbXQgbWFjX21nbXQ7Ci0KLQltdXRleF9sb2NrKCZwcml2LT5tdHgpOwotCi0JcmV0ID0gYXQ3Nl9nZXRfbWliKHByaXYtPnVkZXYsIE1JQl9NQUNfTUdNVCwgJm1hY19tZ210LAotCQkJICAgc2l6ZW9mKHN0cnVjdCBtaWJfbWFjX21nbXQpKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBhdDc2X2dldF9taWIgZmFpbGVkOiAlZFxuIiwKLQkJICAgICAgIHByaXYtPm5ldGRldi0+bmFtZSwgcmV0KTsKLQkJZ290byBleGl0OwotCX0KLQotCWF0NzZfZGJnKERCR19QUk9HUkVTUywgImlic3NfY2hhbmdlID0gMHglMngiLCBtYWNfbWdtdC5pYnNzX2NoYW5nZSk7Ci0JbWVtY3B5KHByaXYtPmJzc2lkLCBtYWNfbWdtdC5jdXJyZW50X2Jzc2lkLCBFVEhfQUxFTik7Ci0JYXQ3Nl9kYmcoREJHX1BST0dSRVNTLCAidXNpbmcgQlNTSUQgJXMiLCBtYWMyc3RyKHByaXYtPmJzc2lkKSk7Ci0KLQlhdDc2X2l3ZXZlbnRfYnNzX2Nvbm5lY3QocHJpdi0+bmV0ZGV2LCBwcml2LT5ic3NpZCk7Ci0KLQlwcml2LT5taWJfYnVmLnR5cGUgPSBNSUJfTUFDX01HTVQ7Ci0JcHJpdi0+bWliX2J1Zi5zaXplID0gMTsKLQlwcml2LT5taWJfYnVmLmluZGV4ID0gb2Zmc2V0b2Yoc3RydWN0IG1pYl9tYWNfbWdtdCwgaWJzc19jaGFuZ2UpOwotCXByaXYtPm1pYl9idWYuZGF0YS5ieXRlID0gMDsKLQotCXJldCA9IGF0NzZfc2V0X21pYihwcml2LCAmcHJpdi0+bWliX2J1Zik7Ci0JaWYgKHJldCA8IDApCi0JCXByaW50ayhLRVJOX0VSUiAiJXM6IHNldF9taWIgKGlic3MgY2hhbmdlIG9rKSBmYWlsZWQ6ICVkXG4iLAotCQkgICAgICAgcHJpdi0+bmV0ZGV2LT5uYW1lLCByZXQpOwotCi1leGl0OgotCW11dGV4X3VubG9jaygmcHJpdi0+bXR4KTsKLX0KLQogc3RhdGljIGludCBhdDc2X3N0YXJ0dXBfZGV2aWNlKHN0cnVjdCBhdDc2X3ByaXYgKnByaXYpCiB7CiAJc3RydWN0IGF0NzZfY2FyZF9jb25maWcgKmNjZmcgPSAmcHJpdi0+Y2FyZF9jb25maWc7CkBAIC0zODkxLDE0ICsxNDcwLDE0IEBACiAKIAlhdDc2X2RiZyhEQkdfUEFSQU1TLAogCQkgIiVzIHBhcmFtOiBzc2lkICUuKnMgKCVzKSBtb2RlICVzIGNoICVkIHdlcCAlcyBrZXkgJWQgIgotCQkgImtleWxlbiAlZCIsIHByaXYtPm5ldGRldi0+bmFtZSwgcHJpdi0+ZXNzaWRfc2l6ZSwgcHJpdi0+ZXNzaWQsCi0JCSBoZXgyc3RyKHByaXYtPmVzc2lkLCBJV19FU1NJRF9NQVhfU0laRSksCisJCSAia2V5bGVuICVkIiwgd2lwaHlfbmFtZShwcml2LT5ody0+d2lwaHkpLCBwcml2LT5lc3NpZF9zaXplLAorCQkgcHJpdi0+ZXNzaWQsIGhleDJzdHIocHJpdi0+ZXNzaWQsIElXX0VTU0lEX01BWF9TSVpFKSwKIAkJIHByaXYtPml3X21vZGUgPT0gSVdfTU9ERV9BREhPQyA/ICJhZGhvYyIgOiAiaW5mcmEiLAogCQkgcHJpdi0+Y2hhbm5lbCwgcHJpdi0+d2VwX2VuYWJsZWQgPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiLAogCQkgcHJpdi0+d2VwX2tleV9pZCwgcHJpdi0+d2VwX2tleXNfbGVuW3ByaXYtPndlcF9rZXlfaWRdKTsKIAlhdDc2X2RiZyhEQkdfUEFSQU1TLAogCQkgIiVzIHBhcmFtOiBwcmVhbWJsZSAlcyBydHMgJWQgcmV0cnkgJWQgZnJhZyAlZCAiCi0JCSAidHhyYXRlICVzIGF1dGhfbW9kZSAlZCIsIHByaXYtPm5ldGRldi0+bmFtZSwKKwkJICJ0eHJhdGUgJXMgYXV0aF9tb2RlICVkIiwgd2lwaHlfbmFtZShwcml2LT5ody0+d2lwaHkpLAogCQkgcHJlYW1ibGVzW3ByaXYtPnByZWFtYmxlX3R5cGVdLCBwcml2LT5ydHNfdGhyZXNob2xkLAogCQkgcHJpdi0+c2hvcnRfcmV0cnlfbGltaXQsIHByaXYtPmZyYWdfdGhyZXNob2xkLAogCQkgcHJpdi0+dHhyYXRlID09IFRYX1JBVEVfMU1CSVQgPyAiMU1CaXQiIDogcHJpdi0+dHhyYXRlID09CkBAIC0zOTA5LDcgKzE0ODgsNyBAQAogCWF0NzZfZGJnKERCR19QQVJBTVMsCiAJCSAiJXMgcGFyYW06IHBtX21vZGUgJWQgcG1fcGVyaW9kICVkIGF1dGhfbW9kZSAlcyAiCiAJCSAic2Nhbl90aW1lcyAlZCAlZCBzY2FuX21vZGUgJXMiLAotCQkgcHJpdi0+bmV0ZGV2LT5uYW1lLCBwcml2LT5wbV9tb2RlLCBwcml2LT5wbV9wZXJpb2QsCisJCSB3aXBoeV9uYW1lKHByaXYtPmh3LT53aXBoeSksIHByaXYtPnBtX21vZGUsIHByaXYtPnBtX3BlcmlvZCwKIAkJIHByaXYtPmF1dGhfbW9kZSA9PSBXTEFOX0FVVEhfT1BFTiA/ICJvcGVuIiA6ICJzaGFyZWRfc2VjcmV0IiwKIAkJIHByaXYtPnNjYW5fbWluX3RpbWUsIHByaXYtPnNjYW5fbWF4X3RpbWUsCiAJCSBwcml2LT5zY2FuX21vZGUgPT0gU0NBTl9UWVBFX0FDVElWRSA/ICJhY3RpdmUiIDogInBhc3NpdmUiKTsKQEAgLTM5NDMsNyArMTUyMiw4IEBACiAJY2NmZy0+c3NpZF9sZW4gPSBwcml2LT5lc3NpZF9zaXplOwogCiAJY2NmZy0+d2VwX2RlZmF1bHRfa2V5X2lkID0gcHJpdi0+d2VwX2tleV9pZDsKLQltZW1jcHkoY2NmZy0+d2VwX2RlZmF1bHRfa2V5X3ZhbHVlLCBwcml2LT53ZXBfa2V5cywgNCAqIFdFUF9LRVlfTEVOKTsKKwltZW1jcHkoY2NmZy0+d2VwX2RlZmF1bHRfa2V5X3ZhbHVlLCBwcml2LT53ZXBfa2V5cywKKwkgICAgICAgc2l6ZW9mKHByaXYtPndlcF9rZXlzKSk7CiAKIAljY2ZnLT5zaG9ydF9wcmVhbWJsZSA9IHByaXYtPnByZWFtYmxlX3R5cGU7CiAJY2NmZy0+YmVhY29uX3BlcmlvZCA9IGNwdV90b19sZTE2KHByaXYtPmJlYWNvbl9wZXJpb2QpOwpAQCAtMzk1Miw3ICsxNTMyLDcgQEAKIAkJCQkgICAgc2l6ZW9mKHN0cnVjdCBhdDc2X2NhcmRfY29uZmlnKSk7CiAJaWYgKHJldCA8IDApIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogYXQ3Nl9zZXRfY2FyZF9jb21tYW5kIGZhaWxlZDogJWRcbiIsCi0JCSAgICAgICBwcml2LT5uZXRkZXYtPm5hbWUsIHJldCk7CisJCSAgICAgICB3aXBoeV9uYW1lKHByaXYtPmh3LT53aXBoeSksIHJldCk7CiAJCXJldHVybiByZXQ7CiAJfQogCkBAIC0zOTk4LDY5ICsxNTc4LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotLyogUmVzdGFydCB0aGUgaW50ZXJmYWNlICovCi1zdGF0aWMgdm9pZCBhdDc2X2R3b3JrX3Jlc3RhcnQoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCXN0cnVjdCBhdDc2X3ByaXYgKnByaXYgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGF0NzZfcHJpdiwKLQkJCQkJICAgICAgZHdvcmtfcmVzdGFydC53b3JrKTsKLQotCW11dGV4X2xvY2soJnByaXYtPm10eCk7Ci0KLQluZXRpZl9jYXJyaWVyX29mZihwcml2LT5uZXRkZXYpOwkvKiBzdG9wIG5ldGRldiB3YXRjaGRvZyAqLwotCW5ldGlmX3N0b3BfcXVldWUocHJpdi0+bmV0ZGV2KTsJLyogc3RvcCB0eCBkYXRhIHBhY2tldHMgKi8KLQotCWF0NzZfc3RhcnR1cF9kZXZpY2UocHJpdik7Ci0KLQlpZiAocHJpdi0+aXdfbW9kZSAhPSBJV19NT0RFX01PTklUT1IpIHsKLQkJcHJpdi0+bmV0ZGV2LT50eXBlID0gQVJQSFJEX0VUSEVSOwotCQlhdDc2X3NldF9tYWNfc3RhdGUocHJpdiwgTUFDX1NDQU5OSU5HKTsKLQkJc2NoZWR1bGVfd29yaygmcHJpdi0+d29ya19zdGFydF9zY2FuKTsKLQl9IGVsc2UgewotCQlwcml2LT5uZXRkZXYtPnR5cGUgPSBBUlBIUkRfSUVFRTgwMjExX1JBRElPVEFQOwotCQlhdDc2X3N0YXJ0X21vbml0b3IocHJpdik7Ci0JfQotCi0JbXV0ZXhfdW5sb2NrKCZwcml2LT5tdHgpOwotfQotCi0vKiBJbml0aWF0ZSBzY2FubmluZyAqLwotc3RhdGljIHZvaWQgYXQ3Nl93b3JrX3N0YXJ0X3NjYW4oc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCXN0cnVjdCBhdDc2X3ByaXYgKnByaXYgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGF0NzZfcHJpdiwKLQkJCQkJICAgICAgd29ya19zdGFydF9zY2FuKTsKLQlpbnQgcmV0OwotCi0JbXV0ZXhfbG9jaygmcHJpdi0+bXR4KTsKLQotCVdBUk5fT04ocHJpdi0+bWFjX3N0YXRlICE9IE1BQ19TQ0FOTklORyk7Ci0JaWYgKHByaXYtPm1hY19zdGF0ZSAhPSBNQUNfU0NBTk5JTkcpCi0JCWdvdG8gZXhpdDsKLQotCS8qIG9ubHkgY2xlYXIgdGhlIGJzcyBsaXN0IHdoZW4gYSBzY2FuIGlzIGFjdGl2ZWx5IGluaXRpYXRlZCwKLQkgKiBvdGhlcndpc2Ugc2ltcGx5IHJlbHkgb24gYXQ3Nl9ic3NfbGlzdF90aW1lb3V0ICovCi0JaWYgKHByaXYtPnNjYW5fc3RhdGUgPT0gU0NBTl9JTl9QUk9HUkVTUykgewotCQlhdDc2X2ZyZWVfYnNzX2xpc3QocHJpdik7Ci0JCXByaXYtPnNjYW5fbmVlZF9hbnkgPSAxOwotCX0gZWxzZQotCQlwcml2LT5zY2FuX25lZWRfYW55ID0gMDsKLQotCXJldCA9IGF0NzZfc3RhcnRfc2Nhbihwcml2LCAxKTsKLQotCWlmIChyZXQgPCAwKQotCQlwcmludGsoS0VSTl9FUlIgIiVzOiAlczogc3RhcnRfc2NhbiBmYWlsZWQgd2l0aCAlZFxuIiwKLQkJICAgICAgIHByaXYtPm5ldGRldi0+bmFtZSwgX19mdW5jX18sIHJldCk7Ci0JZWxzZSB7Ci0JCWF0NzZfZGJnKERCR19NR01UX1RJTUVSLAotCQkJICIlczolZDogc3RhcnRpbmcgbWdtdF90aW1lciBmb3IgJWQgdGlja3MiLAotCQkJIF9fZnVuY19fLCBfX0xJTkVfXywgU0NBTl9QT0xMX0lOVEVSVkFMKTsKLQkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZwcml2LT5kd29ya19nZXRfc2NhbiwKLQkJCQkgICAgICBTQ0FOX1BPTExfSU5URVJWQUwpOwotCX0KLQotZXhpdDoKLQltdXRleF91bmxvY2soJnByaXYtPm10eCk7Ci19Ci0KIC8qIEVuYWJsZSBvciBkaXNhYmxlIHByb21pc2N1b3VzIG1vZGUgKi8KIHN0YXRpYyB2b2lkIGF0NzZfd29ya19zZXRfcHJvbWlzYyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CkBAIC00MDc4LDcgKzE1OTUsNyBAQAogCXJldCA9IGF0NzZfc2V0X21pYihwcml2LCAmcHJpdi0+bWliX2J1Zik7CiAJaWYgKHJldCA8IDApCiAJCXByaW50ayhLRVJOX0VSUiAiJXM6IHNldF9taWIgKHByb21pc2N1b3VzX21vZGUpIGZhaWxlZDogJWRcbiIsCi0JCSAgICAgICBwcml2LT5uZXRkZXYtPm5hbWUsIHJldCk7CisJCSAgICAgICB3aXBoeV9uYW1lKHByaXYtPmh3LT53aXBoeSksIHJldCk7CiAKIAltdXRleF91bmxvY2soJnByaXYtPm10eCk7CiB9CkBAIC00MDk0LDg5NCArMTYxMSwxMiBAQAogCW11dGV4X3VubG9jaygmcHJpdi0+bXR4KTsKIH0KIAotLyogV2UgZ290IGFuIGFzc29jaWF0aW9uIHJlc3BvbnNlICovCi1zdGF0aWMgdm9pZCBhdDc2X3J4X21nbXRfYXNzb2Moc3RydWN0IGF0NzZfcHJpdiAqcHJpdiwKLQkJCSAgICAgICBzdHJ1Y3QgYXQ3Nl9yeF9idWZmZXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgaWVlZTgwMjExX2Fzc29jX3Jlc3BvbnNlICpyZXNwID0KLQkgICAgKHN0cnVjdCBpZWVlODAyMTFfYXNzb2NfcmVzcG9uc2UgKilidWYtPnBhY2tldDsKLQl1MTYgYXNzb2NfaWQgPSBsZTE2X3RvX2NwdShyZXNwLT5haWQpOwotCXUxNiBzdGF0dXMgPSBsZTE2X3RvX2NwdShyZXNwLT5zdGF0dXMpOwotCi0JYXQ3Nl9kYmcoREJHX1JYX01HTVQsICIlczogcnggQXNzb2NSZXNwIGJzc2lkICVzIGNhcGEgMHglMDR4IHN0YXR1cyAiCi0JCSAiMHglMDR4IGFzc29jX2lkIDB4JTA0eCByYXRlcyAlcyIsIHByaXYtPm5ldGRldi0+bmFtZSwKLQkJIG1hYzJzdHIocmVzcC0+aGVhZGVyLmFkZHIzKSwgbGUxNl90b19jcHUocmVzcC0+Y2FwYWJpbGl0eSksCi0JCSBzdGF0dXMsIGFzc29jX2lkLCBoZXgyc3RyKHJlc3AtPmluZm9fZWxlbWVudC0+ZGF0YSwKLQkJCQkJICAgcmVzcC0+aW5mb19lbGVtZW50LT5sZW4pKTsKLQotCWlmIChwcml2LT5tYWNfc3RhdGUgIT0gTUFDX0FTU09DKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gIiVzOiBBc3NvY1Jlc3AgaW4gc3RhdGUgJXMgaWdub3JlZFxuIiwKLQkJICAgICAgIHByaXYtPm5ldGRldi0+bmFtZSwgbWFjX3N0YXRlc1twcml2LT5tYWNfc3RhdGVdKTsKLQkJcmV0dXJuOwotCX0KLQotCUJVR19PTighcHJpdi0+Y3Vycl9ic3MpOwotCi0JY2FuY2VsX2RlbGF5ZWRfd29yaygmcHJpdi0+ZHdvcmtfYXNzb2MpOwotCWlmIChzdGF0dXMgPT0gV0xBTl9TVEFUVVNfU1VDQ0VTUykgewotCQlzdHJ1Y3QgYnNzX2luZm8gKnB0ciA9IHByaXYtPmN1cnJfYnNzOwotCQlwcml2LT5hc3NvY19pZCA9IGFzc29jX2lkICYgMHgzZmZmOwotCQkvKiB1cGRhdGUgaXdjb25maWcgcGFyYW1zICovCi0JCW1lbWNweShwcml2LT5ic3NpZCwgcHRyLT5ic3NpZCwgRVRIX0FMRU4pOwotCQltZW1jcHkocHJpdi0+ZXNzaWQsIHB0ci0+c3NpZCwgcHRyLT5zc2lkX2xlbik7Ci0JCXByaXYtPmVzc2lkX3NpemUgPSBwdHItPnNzaWRfbGVuOwotCQlwcml2LT5jaGFubmVsID0gcHRyLT5jaGFubmVsOwotCQlzY2hlZHVsZV93b3JrKCZwcml2LT53b3JrX2Fzc29jX2RvbmUpOwotCX0gZWxzZSB7Ci0JCWF0NzZfc2V0X21hY19zdGF0ZShwcml2LCBNQUNfSk9JTklORyk7Ci0JCXNjaGVkdWxlX3dvcmsoJnByaXYtPndvcmtfam9pbik7Ci0JfQotfQotCi0vKiBQcm9jZXNzIGRpc2Fzc29jaWF0aW9uIHJlcXVlc3QgZnJvbSB0aGUgQVAgKi8KLXN0YXRpYyB2b2lkIGF0NzZfcnhfbWdtdF9kaXNhc3NvYyhzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2LAotCQkJCSAgc3RydWN0IGF0NzZfcnhfYnVmZmVyICpidWYpCi17Ci0Jc3RydWN0IGllZWU4MDIxMV9kaXNhc3NvYyAqcmVzcCA9Ci0JICAgIChzdHJ1Y3QgaWVlZTgwMjExX2Rpc2Fzc29jICopYnVmLT5wYWNrZXQ7Ci0Jc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgKm1nbXQgPSAmcmVzcC0+aGVhZGVyOwotCi0JYXQ3Nl9kYmcoREJHX1JYX01HTVQsCi0JCSAiJXM6IHJ4IERpc0Fzc29jIGJzc2lkICVzIHJlYXNvbiAweCUwNHggZGVzdGluYXRpb24gJXMiLAotCQkgcHJpdi0+bmV0ZGV2LT5uYW1lLCBtYWMyc3RyKG1nbXQtPmFkZHIzKSwKLQkJIGxlMTZfdG9fY3B1KHJlc3AtPnJlYXNvbiksIG1hYzJzdHIobWdtdC0+YWRkcjEpKTsKLQotCS8qIFdlIGFyZSBub3QgY29ubmVjdGVkLCBpZ25vcmUgKi8KLQlpZiAocHJpdi0+bWFjX3N0YXRlID09IE1BQ19TQ0FOTklORyB8fCBwcml2LT5tYWNfc3RhdGUgPT0gTUFDX0lOSVQKLQkgICAgfHwgIXByaXYtPmN1cnJfYnNzKQotCQlyZXR1cm47Ci0KLQkvKiBOb3Qgb3VyIEJTU0lELCBpZ25vcmUgKi8KLQlpZiAoY29tcGFyZV9ldGhlcl9hZGRyKG1nbXQtPmFkZHIzLCBwcml2LT5jdXJyX2Jzcy0+YnNzaWQpKQotCQlyZXR1cm47Ci0KLQkvKiBOb3QgZm9yIG91ciBTVEEgYW5kIG5vdCBicm9hZGNhc3QsIGlnbm9yZSAqLwotCWlmIChjb21wYXJlX2V0aGVyX2FkZHIocHJpdi0+bmV0ZGV2LT5kZXZfYWRkciwgbWdtdC0+YWRkcjEpCi0JICAgICYmICFpc19icm9hZGNhc3RfZXRoZXJfYWRkcihtZ210LT5hZGRyMSkpCi0JCXJldHVybjsKLQotCWlmIChwcml2LT5tYWNfc3RhdGUgIT0gTUFDX0FTU09DICYmIHByaXYtPm1hY19zdGF0ZSAhPSBNQUNfQ09OTkVDVEVECi0JICAgICYmIHByaXYtPm1hY19zdGF0ZSAhPSBNQUNfSk9JTklORykgewotCQlwcmludGsoS0VSTl9JTkZPICIlczogRGlzQXNzb2MgaW4gc3RhdGUgJXMgaWdub3JlZFxuIiwKLQkJICAgICAgIHByaXYtPm5ldGRldi0+bmFtZSwgbWFjX3N0YXRlc1twcml2LT5tYWNfc3RhdGVdKTsKLQkJcmV0dXJuOwotCX0KLQotCWlmIChwcml2LT5tYWNfc3RhdGUgPT0gTUFDX0NPTk5FQ1RFRCkgewotCQluZXRpZl9jYXJyaWVyX29mZihwcml2LT5uZXRkZXYpOwotCQluZXRpZl9zdG9wX3F1ZXVlKHByaXYtPm5ldGRldik7Ci0JCWF0NzZfaXdldmVudF9ic3NfZGlzY29ubmVjdChwcml2LT5uZXRkZXYpOwotCX0KLQljYW5jZWxfZGVsYXllZF93b3JrKCZwcml2LT5kd29ya19nZXRfc2Nhbik7Ci0JY2FuY2VsX2RlbGF5ZWRfd29yaygmcHJpdi0+ZHdvcmtfYmVhY29uKTsKLQljYW5jZWxfZGVsYXllZF93b3JrKCZwcml2LT5kd29ya19hdXRoKTsKLQljYW5jZWxfZGVsYXllZF93b3JrKCZwcml2LT5kd29ya19hc3NvYyk7Ci0JYXQ3Nl9zZXRfbWFjX3N0YXRlKHByaXYsIE1BQ19KT0lOSU5HKTsKLQlzY2hlZHVsZV93b3JrKCZwcml2LT53b3JrX2pvaW4pOwotfQotCi1zdGF0aWMgdm9pZCBhdDc2X3J4X21nbXRfYXV0aChzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2LAotCQkJICAgICAgc3RydWN0IGF0NzZfcnhfYnVmZmVyICpidWYpCi17Ci0Jc3RydWN0IGllZWU4MDIxMV9hdXRoICpyZXNwID0gKHN0cnVjdCBpZWVlODAyMTFfYXV0aCAqKWJ1Zi0+cGFja2V0OwotCXN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICptZ210ID0gJnJlc3AtPmhlYWRlcjsKLQlpbnQgc2VxX25yID0gbGUxNl90b19jcHUocmVzcC0+dHJhbnNhY3Rpb24pOwotCWludCBhbGcgPSBsZTE2X3RvX2NwdShyZXNwLT5hbGdvcml0aG0pOwotCWludCBzdGF0dXMgPSBsZTE2X3RvX2NwdShyZXNwLT5zdGF0dXMpOwotCi0JYXQ3Nl9kYmcoREJHX1JYX01HTVQsCi0JCSAiJXM6IHJ4IEF1dGhGcmFtZSBic3NpZCAlcyBhbGcgJWQgc2VxX25yICVkIHN0YXR1cyAlZCAiCi0JCSAiZGVzdGluYXRpb24gJXMiLCBwcml2LT5uZXRkZXYtPm5hbWUsIG1hYzJzdHIobWdtdC0+YWRkcjMpLAotCQkgYWxnLCBzZXFfbnIsIHN0YXR1cywgbWFjMnN0cihtZ210LT5hZGRyMSkpOwotCi0JaWYgKGFsZyA9PSBXTEFOX0FVVEhfU0hBUkVEX0tFWSAmJiBzZXFfbnIgPT0gMikKLQkJYXQ3Nl9kYmcoREJHX1JYX01HTVQsICIlczogQXV0aEZyYW1lIGNoYWxsZW5nZSAlcyAuLi4iLAotCQkJIHByaXYtPm5ldGRldi0+bmFtZSwgaGV4MnN0cihyZXNwLT5pbmZvX2VsZW1lbnQsIDE4KSk7Ci0KLQlpZiAocHJpdi0+bWFjX3N0YXRlICE9IE1BQ19BVVRIKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gIiVzOiBpZ25vcmVkIEF1dGhGcmFtZSBpbiBzdGF0ZSAlc1xuIiwKLQkJICAgICAgIHByaXYtPm5ldGRldi0+bmFtZSwgbWFjX3N0YXRlc1twcml2LT5tYWNfc3RhdGVdKTsKLQkJcmV0dXJuOwotCX0KLQlpZiAocHJpdi0+YXV0aF9tb2RlICE9IGFsZykgewotCQlwcmludGsoS0VSTl9JTkZPICIlczogaWdub3JlZCBBdXRoRnJhbWUgZm9yIGFsZyAlZFxuIiwKLQkJICAgICAgIHByaXYtPm5ldGRldi0+bmFtZSwgYWxnKTsKLQkJcmV0dXJuOwotCX0KLQotCUJVR19PTighcHJpdi0+Y3Vycl9ic3MpOwotCi0JLyogTm90IG91ciBCU1NJRCBvciBub3QgZm9yIG91ciBTVEEsIGlnbm9yZSAqLwotCWlmIChjb21wYXJlX2V0aGVyX2FkZHIobWdtdC0+YWRkcjMsIHByaXYtPmN1cnJfYnNzLT5ic3NpZCkKLQkgICAgfHwgY29tcGFyZV9ldGhlcl9hZGRyKHByaXYtPm5ldGRldi0+ZGV2X2FkZHIsIG1nbXQtPmFkZHIxKSkKLQkJcmV0dXJuOwotCi0JY2FuY2VsX2RlbGF5ZWRfd29yaygmcHJpdi0+ZHdvcmtfYXV0aCk7Ci0JaWYgKHN0YXR1cyAhPSBXTEFOX1NUQVRVU19TVUNDRVNTKSB7Ci0JCS8qIHRyeSB0byBqb2luIG5leHQgYnNzICovCi0JCWF0NzZfc2V0X21hY19zdGF0ZShwcml2LCBNQUNfSk9JTklORyk7Ci0JCXNjaGVkdWxlX3dvcmsoJnByaXYtPndvcmtfam9pbik7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAocHJpdi0+YXV0aF9tb2RlID09IFdMQU5fQVVUSF9PUEVOIHx8IHNlcV9uciA9PSA0KSB7Ci0JCXByaXYtPnJldHJpZXMgPSBBU1NPQ19SRVRSSUVTOwotCQlhdDc2X3NldF9tYWNfc3RhdGUocHJpdiwgTUFDX0FTU09DKTsKLQkJYXQ3Nl9hc3NvY19yZXEocHJpdiwgcHJpdi0+Y3Vycl9ic3MpOwotCQlhdDc2X2RiZyhEQkdfTUdNVF9USU1FUiwKLQkJCSAiJXM6JWQ6IHN0YXJ0aW5nIG1nbXRfdGltZXIgKyBIWiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmcHJpdi0+ZHdvcmtfYXNzb2MsIEFTU09DX1RJTUVPVVQpOwotCQlyZXR1cm47Ci0JfQotCi0JV0FSTl9PTihzZXFfbnIgIT0gMik7Ci0JYXQ3Nl9hdXRoX3JlcShwcml2LCBwcml2LT5jdXJyX2Jzcywgc2VxX25yICsgMSwgcmVzcC0+aW5mb19lbGVtZW50KTsKLQlhdDc2X2RiZyhEQkdfTUdNVF9USU1FUiwgIiVzOiVkOiBzdGFydGluZyBtZ210X3RpbWVyICsgSFoiLCBfX2Z1bmNfXywKLQkJIF9fTElORV9fKTsKLQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJnByaXYtPmR3b3JrX2F1dGgsIEFVVEhfVElNRU9VVCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGF0NzZfcnhfbWdtdF9kZWF1dGgoc3RydWN0IGF0NzZfcHJpdiAqcHJpdiwKLQkJCQlzdHJ1Y3QgYXQ3Nl9yeF9idWZmZXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgaWVlZTgwMjExX2Rpc2Fzc29jICpyZXNwID0KLQkgICAgKHN0cnVjdCBpZWVlODAyMTFfZGlzYXNzb2MgKilidWYtPnBhY2tldDsKLQlzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciAqbWdtdCA9ICZyZXNwLT5oZWFkZXI7Ci0KLQlhdDc2X2RiZyhEQkdfUlhfTUdNVCB8IERCR19QUk9HUkVTUywKLQkJICIlczogcnggRGVBdXRoIGJzc2lkICVzIHJlYXNvbiAweCUwNHggZGVzdGluYXRpb24gJXMiLAotCQkgcHJpdi0+bmV0ZGV2LT5uYW1lLCBtYWMyc3RyKG1nbXQtPmFkZHIzKSwKLQkJIGxlMTZfdG9fY3B1KHJlc3AtPnJlYXNvbiksIG1hYzJzdHIobWdtdC0+YWRkcjEpKTsKLQotCWlmIChwcml2LT5tYWNfc3RhdGUgIT0gTUFDX0FVVEggJiYgcHJpdi0+bWFjX3N0YXRlICE9IE1BQ19BU1NPQwotCSAgICAmJiBwcml2LT5tYWNfc3RhdGUgIT0gTUFDX0NPTk5FQ1RFRCkgewotCQlwcmludGsoS0VSTl9JTkZPICIlczogRGVBdXRoIGluIHN0YXRlICVzIGlnbm9yZWRcbiIsCi0JCSAgICAgICBwcml2LT5uZXRkZXYtPm5hbWUsIG1hY19zdGF0ZXNbcHJpdi0+bWFjX3N0YXRlXSk7Ci0JCXJldHVybjsKLQl9Ci0KLQlCVUdfT04oIXByaXYtPmN1cnJfYnNzKTsKLQotCS8qIE5vdCBvdXIgQlNTSUQsIGlnbm9yZSAqLwotCWlmIChjb21wYXJlX2V0aGVyX2FkZHIobWdtdC0+YWRkcjMsIHByaXYtPmN1cnJfYnNzLT5ic3NpZCkpCi0JCXJldHVybjsKLQotCS8qIE5vdCBmb3Igb3VyIFNUQSBhbmQgbm90IGJyb2FkY2FzdCwgaWdub3JlICovCi0JaWYgKGNvbXBhcmVfZXRoZXJfYWRkcihwcml2LT5uZXRkZXYtPmRldl9hZGRyLCBtZ210LT5hZGRyMSkKLQkgICAgJiYgIWlzX2Jyb2FkY2FzdF9ldGhlcl9hZGRyKG1nbXQtPmFkZHIxKSkKLQkJcmV0dXJuOwotCi0JaWYgKHByaXYtPm1hY19zdGF0ZSA9PSBNQUNfQ09OTkVDVEVEKQotCQlhdDc2X2l3ZXZlbnRfYnNzX2Rpc2Nvbm5lY3QocHJpdi0+bmV0ZGV2KTsKLQotCWF0NzZfc2V0X21hY19zdGF0ZShwcml2LCBNQUNfSk9JTklORyk7Ci0Jc2NoZWR1bGVfd29yaygmcHJpdi0+d29ya19qb2luKTsKLQljYW5jZWxfZGVsYXllZF93b3JrKCZwcml2LT5kd29ya19nZXRfc2Nhbik7Ci0JY2FuY2VsX2RlbGF5ZWRfd29yaygmcHJpdi0+ZHdvcmtfYmVhY29uKTsKLQljYW5jZWxfZGVsYXllZF93b3JrKCZwcml2LT5kd29ya19hdXRoKTsKLQljYW5jZWxfZGVsYXllZF93b3JrKCZwcml2LT5kd29ya19hc3NvYyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGF0NzZfcnhfbWdtdF9iZWFjb24oc3RydWN0IGF0NzZfcHJpdiAqcHJpdiwKLQkJCQlzdHJ1Y3QgYXQ3Nl9yeF9idWZmZXIgKmJ1ZikKLXsKLQlpbnQgdmFycGFyX2xlbjsKLQkvKiBiZWFjb24gY29udGVudCAqLwotCXN0cnVjdCBpZWVlODAyMTFfYmVhY29uICpiZGF0YSA9IChzdHJ1Y3QgaWVlZTgwMjExX2JlYWNvbiAqKWJ1Zi0+cGFja2V0OwotCXN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICptZ210ID0gJmJkYXRhLT5oZWFkZXI7Ci0KLQlzdHJ1Y3QgbGlzdF9oZWFkICpscHRyOwotCXN0cnVjdCBic3NfaW5mbyAqbWF0Y2g7CS8qIGVudHJ5IG1hdGNoaW5nIGFkZHIzIHdpdGggaXRzIGJzc2lkICovCi0JaW50IG5ld19lbnRyeSA9IDA7Ci0JaW50IGxlbjsKLQlzdHJ1Y3QgaWVlZTgwMjExX2luZm9fZWxlbWVudCAqaWU7Ci0JaW50IGhhdmVfc3NpZCA9IDA7Ci0JaW50IGhhdmVfcmF0ZXMgPSAwOwotCWludCBoYXZlX2NoYW5uZWwgPSAwOwotCWludCBrZWVwX2dvaW5nID0gMTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmJzc19saXN0X3NwaW5sb2NrLCBmbGFncyk7Ci0JaWYgKHByaXYtPm1hY19zdGF0ZSA9PSBNQUNfQ09OTkVDVEVEKSB7Ci0JCS8qIGluIHN0YXRlIE1BQ19DT05ORUNURUQgd2UgdXNlIHRoZSBtZ210X3RpbWVyIHRvIGNvbnRyb2wKLQkJICAgdGhlIGJlYWNvbiBvZiB0aGUgQlNTICovCi0JCUJVR19PTighcHJpdi0+Y3Vycl9ic3MpOwotCi0JCWlmICghY29tcGFyZV9ldGhlcl9hZGRyKHByaXYtPmN1cnJfYnNzLT5ic3NpZCwgbWdtdC0+YWRkcjMpKSB7Ci0JCQkvKiBXZSBnb3Qgb3VyIEFQJ3MgYmVhY29uLCBkZWZlciB0aGUgdGltZW91dCBoYW5kbGVyLgotCQkJICAgS2lsbCBwZW5kaW5nIHdvcmsgZmlyc3QsIGFzIHNjaGVkdWxlX2RlbGF5ZWRfd29yaygpCi0JCQkgICB3b24ndCBkbyBpdC4gKi8KLQkJCWNhbmNlbF9kZWxheWVkX3dvcmsoJnByaXYtPmR3b3JrX2JlYWNvbik7Ci0JCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJnByaXYtPmR3b3JrX2JlYWNvbiwKLQkJCQkJICAgICAgQkVBQ09OX1RJTUVPVVQpOwotCQkJcHJpdi0+Y3Vycl9ic3MtPnJzc2kgPSBidWYtPnJzc2k7Ci0JCQlwcml2LT5iZWFjb25zX3JlY2VpdmVkKys7Ci0JCQlnb3RvIGV4aXQ7Ci0JCX0KLQl9Ci0KLQkvKiBsb29rIGlmIHdlIGhhdmUgdGhpcyBCU1MgYWxyZWFkeSBpbiB0aGUgbGlzdCAqLwotCW1hdGNoID0gTlVMTDsKLQotCWlmICghbGlzdF9lbXB0eSgmcHJpdi0+YnNzX2xpc3QpKSB7Ci0JCWxpc3RfZm9yX2VhY2gobHB0ciwgJnByaXYtPmJzc19saXN0KSB7Ci0JCQlzdHJ1Y3QgYnNzX2luZm8gKmJzc19wdHIgPQotCQkJICAgIGxpc3RfZW50cnkobHB0ciwgc3RydWN0IGJzc19pbmZvLCBsaXN0KTsKLQkJCWlmICghY29tcGFyZV9ldGhlcl9hZGRyKGJzc19wdHItPmJzc2lkLCBtZ210LT5hZGRyMykpIHsKLQkJCQltYXRjaCA9IGJzc19wdHI7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlpZiAoIW1hdGNoKSB7Ci0JCS8qIEJTUyBub3QgaW4gdGhlIGxpc3QgLSBhcHBlbmQgaXQgKi8KLQkJbWF0Y2ggPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYnNzX2luZm8pLCBHRlBfQVRPTUlDKTsKLQkJaWYgKCFtYXRjaCkgewotCQkJYXQ3Nl9kYmcoREJHX0JTU19UQUJMRSwKLQkJCQkgIiVzOiBjYW5ub3Qga21hbGxvYyBuZXcgYnNzIGluZm8gKCV6ZCBieXRlKSIsCi0JCQkJIHByaXYtPm5ldGRldi0+bmFtZSwgc2l6ZW9mKHN0cnVjdCBic3NfaW5mbykpOwotCQkJZ290byBleGl0OwotCQl9Ci0JCW5ld19lbnRyeSA9IDE7Ci0JCWxpc3RfYWRkX3RhaWwoJm1hdGNoLT5saXN0LCAmcHJpdi0+YnNzX2xpc3QpOwotCX0KLQotCW1hdGNoLT5jYXBhID0gbGUxNl90b19jcHUoYmRhdGEtPmNhcGFiaWxpdHkpOwotCW1hdGNoLT5iZWFjb25faW50ZXJ2YWwgPSBsZTE2X3RvX2NwdShiZGF0YS0+YmVhY29uX2ludGVydmFsKTsKLQltYXRjaC0+cnNzaSA9IGJ1Zi0+cnNzaTsKLQltYXRjaC0+bGlua19xdWFsID0gYnVmLT5saW5rX3F1YWxpdHk7Ci0JbWF0Y2gtPm5vaXNlX2xldmVsID0gYnVmLT5ub2lzZV9sZXZlbDsKLQltZW1jcHkobWF0Y2gtPmJzc2lkLCBtZ210LT5hZGRyMywgRVRIX0FMRU4pOwotCWF0NzZfZGJnKERCR19SWF9CRUFDT04sICIlczogYnNzaWQgJXMiLCBwcml2LT5uZXRkZXYtPm5hbWUsCi0JCSBtYWMyc3RyKG1hdGNoLT5ic3NpZCkpOwotCi0JaWUgPSBiZGF0YS0+aW5mb19lbGVtZW50OwotCi0JLyogbGVuZ3RoIG9mIHZhciBsZW5ndGggYmVhY29uIHBhcmFtZXRlcnMgKi8KLQl2YXJwYXJfbGVuID0gbWluX3QoaW50LCBsZTE2X3RvX2NwdShidWYtPndsZW5ndGgpIC0KLQkJCSAgIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2JlYWNvbiksCi0JCQkgICBCRUFDT05fTUFYX0RBVEFfTEVOR1RIKTsKLQotCS8qIFRoaXMgcm91dGluZSBzdGVwcyB0aHJvdWdoIHRoZSBiZGF0YS0+ZGF0YSBhcnJheSB0byBnZXQKLQkgKiBzb21lIHVzZWZ1bCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgYWNjZXNzIHBvaW50LgotCSAqIEN1cnJlbnRseSwgdGhpcyBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cyByZWNlaXB0IG9mOiBTU0lELAotCSAqIHN1cHBvcnRlZCB0cmFuc2ZlciByYXRlcyBhbmQgY2hhbm5lbCwgaW4gYW55IG9yZGVyLCB3aXRoIHNvbWUKLQkgKiB0b2xlcmFuY2UgZm9yIGludGVybWl0dGVudCB1bmtub3duIGNvZGVzIChhbHRob3VnaCB0aGlzCi0JICogZnVuY3Rpb25hbGl0eSBtYXkgbm90IGJlIG5lY2Vzc2FyeSBhcyB0aGUgdXNlZnVsIGluZm9ybWF0aW9uIHdpbGwKLQkgKiB1c3VhbGx5IGFycml2ZSBpbiBjb25zZWN1dGl2ZWx5LCBidXQgdGhlcmUgaGF2ZSBiZWVuIHNvbWUKLQkgKiByZXBvcnRzIG9mIHNvbWUgb2YgdGhlIHVzZWZ1bCBpbmZvcm1hdGlvbiBmaWVsZHMgYXJyaXZpbmcgaW4gYQotCSAqIGRpZmZlcmVudCBvcmRlcikuCi0JICogSXQgZG9lcyBub3Qgc3VwcG9ydCBhbnkgbW9yZSBJRSB0eXBlcyBhbHRob3VnaCBNRklFX1RZUEVfVElNIG1heQotCSAqIGJlIHN1cHBvcnRlZCAob24gbXkgQVAgYXQgbGVhc3QpLgotCSAqIFRoZSBiZGF0YS0+ZGF0YSBhcnJheSBpcyBhYm91dCAxNTAwIGJ5dGVzIGxvbmcgYnV0IG9ubHkgfjM2IG9mIHRob3NlCi0JICogYnl0ZXMgYXJlIHVzZWZ1bCwgaGVuY2UgdGhlIGhhdmVfc3NpZCBldGMgb3B0aW1pemF0aW9ucy4gKi8KLQotCXdoaWxlIChrZWVwX2dvaW5nICYmCi0JICAgICAgICgoJmllLT5kYXRhW2llLT5sZW5dIC0gKHU4ICopYmRhdGEtPmluZm9fZWxlbWVudCkgPD0KLQkJdmFycGFyX2xlbikpIHsKLQotCQlzd2l0Y2ggKGllLT5pZCkgewotCi0JCWNhc2UgTUZJRV9UWVBFX1NTSUQ6Ci0JCQlpZiAoaGF2ZV9zc2lkKQotCQkJCWJyZWFrOwotCi0JCQlsZW4gPSBtaW5fdChpbnQsIElXX0VTU0lEX01BWF9TSVpFLCBpZS0+bGVuKTsKLQotCQkJLyogd2UgY29weSBvbmx5IGlmIHRoaXMgaXMgYSBuZXcgZW50cnksCi0JCQkgICBvciB0aGUgaW5jb21pbmcgU1NJRCBpcyBub3QgYSBoaWRkZW4gU1NJRC4gVGhpcwotCQkJICAgd2lsbCBwcm90ZWN0IHVzIGZyb20gb3ZlcndyaXRpbmcgYSByZWFsIFNTSUQgcmVhZAotCQkJICAgaW4gYSBQcm9iZVJlc3BvbnNlIHdpdGggYSBoaWRkZW4gb25lIGZyb20gYQotCQkJICAgZm9sbG93aW5nIGJlYWNvbi4gKi8KLQkJCWlmICghbmV3X2VudHJ5ICYmIGF0NzZfaXNfaGlkZGVuX3NzaWQoaWUtPmRhdGEsIGxlbikpIHsKLQkJCQloYXZlX3NzaWQgPSAxOwotCQkJCWJyZWFrOwotCQkJfQotCi0JCQltYXRjaC0+c3NpZF9sZW4gPSBsZW47Ci0JCQltZW1jcHkobWF0Y2gtPnNzaWQsIGllLT5kYXRhLCBsZW4pOwotCQkJYXQ3Nl9kYmcoREJHX1JYX0JFQUNPTiwgIiVzOiBTU0lEIC0gJS4qcyIsCi0JCQkJIHByaXYtPm5ldGRldi0+bmFtZSwgbGVuLCBtYXRjaC0+c3NpZCk7Ci0JCQloYXZlX3NzaWQgPSAxOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBNRklFX1RZUEVfUkFURVM6Ci0JCQlpZiAoaGF2ZV9yYXRlcykKLQkJCQlicmVhazsKLQotCQkJbWF0Y2gtPnJhdGVzX2xlbiA9Ci0JCQkgICAgbWluX3QoaW50LCBzaXplb2YobWF0Y2gtPnJhdGVzKSwgaWUtPmxlbik7Ci0JCQltZW1jcHkobWF0Y2gtPnJhdGVzLCBpZS0+ZGF0YSwgbWF0Y2gtPnJhdGVzX2xlbik7Ci0JCQloYXZlX3JhdGVzID0gMTsKLQkJCWF0NzZfZGJnKERCR19SWF9CRUFDT04sICIlczogU1VQUE9SVEVEIFJBVEVTICVzIiwKLQkJCQkgcHJpdi0+bmV0ZGV2LT5uYW1lLAotCQkJCSBoZXgyc3RyKGllLT5kYXRhLCBpZS0+bGVuKSk7Ci0JCQlicmVhazsKLQotCQljYXNlIE1GSUVfVFlQRV9EU19TRVQ6Ci0JCQlpZiAoaGF2ZV9jaGFubmVsKQotCQkJCWJyZWFrOwotCi0JCQltYXRjaC0+Y2hhbm5lbCA9IGllLT5kYXRhWzBdOwotCQkJaGF2ZV9jaGFubmVsID0gMTsKLQkJCWF0NzZfZGJnKERCR19SWF9CRUFDT04sICIlczogQ0hBTk5FTCAtICVkIiwKLQkJCQkgcHJpdi0+bmV0ZGV2LT5uYW1lLCBtYXRjaC0+Y2hhbm5lbCk7Ci0JCQlicmVhazsKLQotCQljYXNlIE1GSUVfVFlQRV9DRl9TRVQ6Ci0JCWNhc2UgTUZJRV9UWVBFX1RJTToKLQkJY2FzZSBNRklFX1RZUEVfSUJTU19TRVQ6Ci0JCWRlZmF1bHQ6Ci0JCQlhdDc2X2RiZyhEQkdfUlhfQkVBQ09OLCAiJXM6IGJlYWNvbiBJRSBpZCAlZCBsZW4gJWQgJXMiLAotCQkJCSBwcml2LT5uZXRkZXYtPm5hbWUsIGllLT5pZCwgaWUtPmxlbiwKLQkJCQkgaGV4MnN0cihpZS0+ZGF0YSwgaWUtPmxlbikpOwotCQkJYnJlYWs7Ci0JCX0KLQotCQkvKiBhZHZhbmNlIHRvIHRoZSBuZXh0IGluZm9ybWF0aW9uYWwgZWxlbWVudCAqLwotCQluZXh0X2llKCZpZSk7Ci0KLQkJLyogT3B0aW1pemF0aW9uOiBhZnRlciBhbGwsIHRoZSBiZGF0YS0+ZGF0YSBhcnJheSBpcwotCQkgKiB2YXJwYXJfbGVuIGJ5dGVzIGxvbmcsIHdoZXJlYXMgd2UgZ2V0IGFsbCBvZiB0aGUgdXNlZnVsCi0JCSAqIGluZm9ybWF0aW9uIGFmdGVyIG9ubHkgfjM2IGJ5dGVzLCB0aGlzIHNhdmVzIHVzIGEgbG90IG9mCi0JCSAqIHRpbWUgKGFuZCB0cm91YmxlIGFzIHRoZSByZW1haW5pbmcgcG9ydGlvbiBvZiB0aGUgYXJyYXkKLQkJICogY291bGQgYmUgZnVsbCBvZiBqdW5rKQotCQkgKiBDb21tZW50IHRoaXMgb3V0IGlmIHlvdSB3YW50IHRvIHNlZSB3aGF0IG90aGVyIGluZm9ybWF0aW9uCi0JCSAqIGNvbWVzIGZyb20gdGhlIEFQIC0gYWx0aG91Z2ggbGl0dGxlIG9mIGl0IG1heSBiZSB1c2VmdWwgKi8KLQl9Ci0KLQlhdDc2X2RiZyhEQkdfUlhfQkVBQ09OLCAiJXM6IEZpbmlzaGVkIHByb2Nlc3NpbmcgYmVhY29uIGRhdGEiLAotCQkgcHJpdi0+bmV0ZGV2LT5uYW1lKTsKLQotCW1hdGNoLT5sYXN0X3J4ID0gamlmZmllczsJLyogcmVjb3JkIGxhc3Qgcnggb2YgYmVhY29uICovCi0KLWV4aXQ6Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+YnNzX2xpc3Rfc3BpbmxvY2ssIGZsYWdzKTsKLX0KLQotLyogQ2FsY3VsYXRlIHRoZSBsaW5rIGxldmVsIGZyb20gYSBnaXZlbiByeF9idWZmZXIgKi8KLXN0YXRpYyB2b2lkIGF0NzZfY2FsY19sZXZlbChzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2LCBzdHJ1Y3QgYXQ3Nl9yeF9idWZmZXIgKmJ1ZiwKLQkJCSAgICBzdHJ1Y3QgaXdfcXVhbGl0eSAqcXVhbCkKLXsKLQkvKiBqdXN0IGEgZ3Vlc3MgZm9yIG5vdywgbWlnaHQgYmUgZGlmZmVyZW50IGZvciBvdGhlciBjaGlwcyAqLwotCWludCBtYXhfcnNzaSA9IDQyOwotCi0JcXVhbC0+bGV2ZWwgPSAoYnVmLT5yc3NpICogMTAwIC8gbWF4X3Jzc2kpOwotCWlmIChxdWFsLT5sZXZlbCA+IDEwMCkKLQkJcXVhbC0+bGV2ZWwgPSAxMDA7Ci0JcXVhbC0+dXBkYXRlZCB8PSBJV19RVUFMX0xFVkVMX1VQREFURUQ7Ci19Ci0KLS8qIENhbGN1bGF0ZSB0aGUgbGluayBxdWFsaXR5IGZyb20gYSBnaXZlbiByeF9idWZmZXIgKi8KLXN0YXRpYyB2b2lkIGF0NzZfY2FsY19xdWFsKHN0cnVjdCBhdDc2X3ByaXYgKnByaXYsIHN0cnVjdCBhdDc2X3J4X2J1ZmZlciAqYnVmLAotCQkJICAgc3RydWN0IGl3X3F1YWxpdHkgKnF1YWwpCi17Ci0JaWYgKGF0NzZfaXNfaW50ZXJzaWwocHJpdi0+Ym9hcmRfdHlwZSkpCi0JCXF1YWwtPnF1YWwgPSBidWYtPmxpbmtfcXVhbGl0eTsKLQllbHNlIHsKLQkJdW5zaWduZWQgbG9uZyBlbGFwc2VkOwotCi0JCS8qIFVwZGF0ZSBxdWFsIGF0IG1vc3Qgb25jZSBhIHNlY29uZCAqLwotCQllbGFwc2VkID0gamlmZmllcyAtIHByaXYtPmJlYWNvbnNfbGFzdF9xdWFsOwotCQlpZiAoZWxhcHNlZCA8IDEgKiBIWikKLQkJCXJldHVybjsKLQotCQlxdWFsLT5xdWFsID0gcXVhbC0+bGV2ZWwgKiBwcml2LT5iZWFjb25zX3JlY2VpdmVkICoKLQkJICAgIG1zZWNzX3RvX2ppZmZpZXMocHJpdi0+YmVhY29uX3BlcmlvZCkgLyBlbGFwc2VkOwotCi0JCXByaXYtPmJlYWNvbnNfbGFzdF9xdWFsID0gamlmZmllczsKLQkJcHJpdi0+YmVhY29uc19yZWNlaXZlZCA9IDA7Ci0JfQotCXF1YWwtPnF1YWwgPSAocXVhbC0+cXVhbCA+IDEwMCkgPyAxMDAgOiBxdWFsLT5xdWFsOwotCXF1YWwtPnVwZGF0ZWQgfD0gSVdfUVVBTF9RVUFMX1VQREFURUQ7Ci19Ci0KLS8qIENhbGN1bGF0ZSB0aGUgbm9pc2UgcXVhbGl0eSBmcm9tIGEgZ2l2ZW4gcnhfYnVmZmVyICovCi1zdGF0aWMgdm9pZCBhdDc2X2NhbGNfbm9pc2Uoc3RydWN0IGF0NzZfcHJpdiAqcHJpdiwgc3RydWN0IGF0NzZfcnhfYnVmZmVyICpidWYsCi0JCQkgICAgc3RydWN0IGl3X3F1YWxpdHkgKnF1YWwpCi17Ci0JcXVhbC0+bm9pc2UgPSAwOwotCXF1YWwtPnVwZGF0ZWQgfD0gSVdfUVVBTF9OT0lTRV9JTlZBTElEOwotfQotCi1zdGF0aWMgdm9pZCBhdDc2X3VwZGF0ZV93c3RhdHMoc3RydWN0IGF0NzZfcHJpdiAqcHJpdiwKLQkJCSAgICAgICBzdHJ1Y3QgYXQ3Nl9yeF9idWZmZXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgaXdfcXVhbGl0eSAqcXVhbCA9ICZwcml2LT53c3RhdHMucXVhbDsKLQotCWlmIChidWYtPnJzc2kgJiYgcHJpdi0+bWFjX3N0YXRlID09IE1BQ19DT05ORUNURUQpIHsKLQkJcXVhbC0+dXBkYXRlZCA9IDA7Ci0JCWF0NzZfY2FsY19sZXZlbChwcml2LCBidWYsIHF1YWwpOwotCQlhdDc2X2NhbGNfcXVhbChwcml2LCBidWYsIHF1YWwpOwotCQlhdDc2X2NhbGNfbm9pc2UocHJpdiwgYnVmLCBxdWFsKTsKLQl9IGVsc2UgewotCQlxdWFsLT5xdWFsID0gMDsKLQkJcXVhbC0+bGV2ZWwgPSAwOwotCQlxdWFsLT5ub2lzZSA9IDA7Ci0JCXF1YWwtPnVwZGF0ZWQgPSBJV19RVUFMX0FMTF9JTlZBTElEOwotCX0KLX0KLQotc3RhdGljIHZvaWQgYXQ3Nl9yeF9tZ210KHN0cnVjdCBhdDc2X3ByaXYgKnByaXYsIHN0cnVjdCBhdDc2X3J4X2J1ZmZlciAqYnVmKQotewotCXN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICptZ210ID0KLQkgICAgKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICopYnVmLT5wYWNrZXQ7Ci0JdTE2IGZyYW1lY3RsID0gbGUxNl90b19jcHUobWdtdC0+ZnJhbWVfY3RsKTsKLQotCS8qIHVwZGF0ZSB3c3RhdHMgKi8KLQlpZiAocHJpdi0+bWFjX3N0YXRlICE9IE1BQ19JTklUICYmIHByaXYtPm1hY19zdGF0ZSAhPSBNQUNfU0NBTk5JTkcpIHsKLQkJLyogamFsOiB0aGlzIGlzIGEgZGlydHkgaGFjayBuZWVkZWQgYnkgVGltIGluIGFkLWhvYyBtb2RlICovCi0JCS8qIERhdGEgcGFja2V0cyBhbHdheXMgc2VlbSB0byBoYXZlIGEgMCBsaW5rIGxldmVsLCBzbyB3ZQotCQkgICBvbmx5IHJlYWQgbGluayBxdWFsaXR5IGluZm8gZnJvbSBtYW5hZ2VtZW50IHBhY2tldHMuCi0JCSAgIEF0bWVsIGRyaXZlciBhY3R1YWxseSBhdmVyYWdlcyB0aGUgcHJlc2VudCwgYW5kIHByZXZpb3VzCi0JCSAgIHZhbHVlcywgd2UganVzdCBwcmVzZW50IHRoZSByYXcgdmFsdWUgYXQgdGhlIG1vbWVudCAtIFRKUyAqLwotCQlpZiAocHJpdi0+aXdfbW9kZSA9PSBJV19NT0RFX0FESE9DCi0JCSAgICB8fCAocHJpdi0+Y3Vycl9ic3MKLQkJCSYmICFjb21wYXJlX2V0aGVyX2FkZHIobWdtdC0+YWRkcjMsCi0JCQkJCSAgICAgICBwcml2LT5jdXJyX2Jzcy0+YnNzaWQpKSkKLQkJCWF0NzZfdXBkYXRlX3dzdGF0cyhwcml2LCBidWYpOwotCX0KLQotCWF0NzZfZGJnKERCR19SWF9NR01UX0NPTlRFTlQsICIlcyByeCBtZ210IGZyYW1lY3RsIDB4JXggJXMiLAotCQkgcHJpdi0+bmV0ZGV2LT5uYW1lLCBmcmFtZWN0bCwKLQkJIGhleDJzdHIobWdtdCwgbGUxNl90b19jcHUoYnVmLT53bGVuZ3RoKSkpOwotCi0Jc3dpdGNoIChmcmFtZWN0bCAmIElFRUU4MDIxMV9GQ1RMX1NUWVBFKSB7Ci0JY2FzZSBJRUVFODAyMTFfU1RZUEVfQkVBQ09OOgotCWNhc2UgSUVFRTgwMjExX1NUWVBFX1BST0JFX1JFU1A6Ci0JCWF0NzZfcnhfbWdtdF9iZWFjb24ocHJpdiwgYnVmKTsKLQkJYnJlYWs7Ci0KLQljYXNlIElFRUU4MDIxMV9TVFlQRV9BU1NPQ19SRVNQOgotCQlhdDc2X3J4X21nbXRfYXNzb2MocHJpdiwgYnVmKTsKLQkJYnJlYWs7Ci0KLQljYXNlIElFRUU4MDIxMV9TVFlQRV9ESVNBU1NPQzoKLQkJYXQ3Nl9yeF9tZ210X2Rpc2Fzc29jKHByaXYsIGJ1Zik7Ci0JCWJyZWFrOwotCi0JY2FzZSBJRUVFODAyMTFfU1RZUEVfQVVUSDoKLQkJYXQ3Nl9yeF9tZ210X2F1dGgocHJpdiwgYnVmKTsKLQkJYnJlYWs7Ci0KLQljYXNlIElFRUU4MDIxMV9TVFlQRV9ERUFVVEg6Ci0JCWF0NzZfcnhfbWdtdF9kZWF1dGgocHJpdiwgYnVmKTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGlnbm9yaW5nIGZyYW1lIHdpdGggZnJhbWVjdGwgMHglMDR4XG4iLAotCQkgICAgICAgcHJpdi0+bmV0ZGV2LT5uYW1lLCBmcmFtZWN0bCk7Ci0JfQotCi0JcmV0dXJuOwotfQotCi0vKiBDb252ZXJ0IHRoZSA4MDIuMTEgaGVhZGVyIGludG8gYW4gZXRoZXJuZXQtc3R5bGUgaGVhZGVyLCBtYWtlIHNrYgotICogcmVhZHkgZm9yIGNvbnN1bXB0aW9uIGJ5IG5ldGlmX3J4KCkgKi8KLXN0YXRpYyB2b2lkIGF0NzZfaWVlZTgwMjExX3RvX2V0aChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgaXdfbW9kZSkKLXsKLQlzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciAqaTgwMl8xMV9oZHI7Ci0Jc3RydWN0IGV0aGhkciAqZXRoX2hkcl9wOwotCXU4ICpzcmNfYWRkcjsKLQl1OCAqZGVzdF9hZGRyOwotCi0JaTgwMl8xMV9oZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgKilza2ItPmRhdGE7Ci0KLQkvKiBUaGF0IHdvdWxkIGJlIHRoZSBldGhlcm5ldCBoZWFkZXIgaWYgdGhlIGhhcmR3YXJlIGNvbnZlcnRlZAotCSAqIHRoZSBmcmFtZSBmb3IgdXMuICBNYWtlIHN1cmUgdGhlIHNvdXJjZSBhbmQgdGhlIGRlc3RpbmF0aW9uCi0JICogbWF0Y2ggdGhlIDgwMi4xMSBoZWFkZXIuICBXaGljaCBoYXJkd2FyZSBkb2VzIGl0PyAqLwotCWV0aF9oZHJfcCA9IChzdHJ1Y3QgZXRoaGRyICopc2tiX3B1bGwoc2tiLCBJRUVFODAyMTFfM0FERFJfTEVOKTsKLQotCWRlc3RfYWRkciA9IGk4MDJfMTFfaGRyLT5hZGRyMTsKLQlpZiAoaXdfbW9kZSA9PSBJV19NT0RFX0FESE9DKQotCQlzcmNfYWRkciA9IGk4MDJfMTFfaGRyLT5hZGRyMjsKLQllbHNlCi0JCXNyY19hZGRyID0gaTgwMl8xMV9oZHItPmFkZHIzOwotCi0JaWYgKCFjb21wYXJlX2V0aGVyX2FkZHIoZXRoX2hkcl9wLT5oX3NvdXJjZSwgc3JjX2FkZHIpICYmCi0JICAgICFjb21wYXJlX2V0aGVyX2FkZHIoZXRoX2hkcl9wLT5oX2Rlc3QsIGRlc3RfYWRkcikpCi0JCS8qIFllcywgd2UgYWxyZWFkeSBoYXZlIGFuIGV0aGVybmV0IGhlYWRlciAqLwotCQlza2JfcmVzZXRfbWFjX2hlYWRlcihza2IpOwotCWVsc2UgewotCQl1MTYgbGVuOwotCi0JCS8qIE5lZWQgdG8gYnVpbGQgYW4gZXRoZXJuZXQgaGVhZGVyICovCi0JCWlmICghbWVtY21wKHNrYi0+ZGF0YSwgc25hcHNpZywgc2l6ZW9mKHNuYXBzaWcpKSkgewotCQkJLyogU05BUCBmcmFtZSAtIGRlY2Fwc3VsYXRlLCBrZWVwIHByb3RvICovCi0JCQlza2JfcHVzaChza2IsIG9mZnNldG9mKHN0cnVjdCBldGhoZHIsIGhfcHJvdG8pIC0KLQkJCQkgc2l6ZW9mKHJmYzEwNDJzaWcpKTsKLQkJCWxlbiA9IDA7Ci0JCX0gZWxzZSB7Ci0JCQkvKiA4MDIuMyBmcmFtZSwgcHJvdG8gaXMgbGVuZ3RoICovCi0JCQlsZW4gPSBza2ItPmxlbjsKLQkJCXNrYl9wdXNoKHNrYiwgRVRIX0hMRU4pOwotCQl9Ci0KLQkJc2tiX3Jlc2V0X21hY19oZWFkZXIoc2tiKTsKLQkJZXRoX2hkcl9wID0gZXRoX2hkcihza2IpOwotCQkvKiBUaGlzIG5lZWRzIHRvIGJlIGRvbmUgaW4gdGhpcyBvcmRlciAoZXRoX2hkcl9wLT5oX2Rlc3QgbWF5Ci0JCSAqIG92ZXJsYXAgc3JjX2FkZHIpICovCi0JCW1lbWNweShldGhfaGRyX3AtPmhfc291cmNlLCBzcmNfYWRkciwgRVRIX0FMRU4pOwotCQltZW1jcHkoZXRoX2hkcl9wLT5oX2Rlc3QsIGRlc3RfYWRkciwgRVRIX0FMRU4pOwotCQlpZiAobGVuKQotCQkJZXRoX2hkcl9wLT5oX3Byb3RvID0gaHRvbnMobGVuKTsKLQl9Ci0KLQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBza2ItPmRldik7Ci19Ci0KLS8qIENoZWNrIGZvciBmcmFnbWVudGVkIGRhdGEgaW4gcHJpdi0+cnhfc2tiLiBJZiB0aGUgcGFja2V0IHdhcyBubyBmcmFnbWVudAotICAgb3IgaXQgd2FzIHRoZSBsYXN0IG9mIGEgZnJhZ21lbnQgc2V0IGEgc2tiIGNvbnRhaW5pbmcgdGhlIHdob2xlIHBhY2tldAotICAgaXMgcmV0dXJuZWQgZm9yIGZ1cnRoZXIgcHJvY2Vzc2luZy4gT3RoZXJ3aXNlIHdlIGdldCBOVUxMIGFuZCBhcmUKLSAgIGRvbmUgYW5kIHRoZSBwYWNrZXQgaXMgZWl0aGVyIHN0b3JlZCBpbnNpZGUgdGhlIGZyYWdtZW50IGJ1ZmZlcgotICAgb3IgdGhyb3duIGF3YXkuICBFdmVyeSByZXR1cm5lZCBza2Igc3RhcnRzIHdpdGggdGhlIGllZWU4MDJfMTEgaGVhZGVyCi0gICBhbmQgY29udGFpbnMgX25vXyBGQ1MgYXQgdGhlIGVuZCAqLwotc3RhdGljIHN0cnVjdCBza19idWZmICphdDc2X2NoZWNrX2Zvcl9yeF9mcmFncyhzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2KQotewotCXN0cnVjdCBza19idWZmICpza2IgPSBwcml2LT5yeF9za2I7Ci0Jc3RydWN0IGF0NzZfcnhfYnVmZmVyICpidWYgPSAoc3RydWN0IGF0NzZfcnhfYnVmZmVyICopc2tiLT5kYXRhOwotCXN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICppODAyXzExX2hkciA9Ci0JICAgIChzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciAqKWJ1Zi0+cGFja2V0OwotCS8qIHNlcV9jdHJsLCBmcmFnbWVudF9udW1iZXIsIHNlcXVlbmNlIG51bWJlciBvZiBuZXcgcGFja2V0ICovCi0JdTE2IHNjdGwgPSBsZTE2X3RvX2NwdShpODAyXzExX2hkci0+c2VxX2N0bCk7Ci0JdTE2IGZyYWduciA9IHNjdGwgJiAweGY7Ci0JdTE2IHNlcW5yID0gc2N0bCA+PiA0OwotCXUxNiBmcmFtZV9jdGwgPSBsZTE2X3RvX2NwdShpODAyXzExX2hkci0+ZnJhbWVfY3RsKTsKLQotCS8qIExlbmd0aCBpbmNsdWRpbmcgdGhlIElFRUU4MDIuMTEgaGVhZGVyLCBidXQgd2l0aG91dCB0aGUgdHJhaWxpbmcKLQkgKiBGQ1MgYW5kIHdpdGhvdXQgdGhlIEF0bWVsIFJ4IGhlYWRlciAqLwotCWludCBsZW5ndGggPSBsZTE2X3RvX2NwdShidWYtPndsZW5ndGgpIC0gSUVFRTgwMjExX0ZDU19MRU47Ci0KLQkvKiB3aGVyZSBkb2VzIHRoZSBkYXRhIHBheWxvYWQgc3RhcnQgaW4gc2tiLT5kYXRhID8gKi8KLQl1OCAqZGF0YSA9IGk4MDJfMTFfaGRyLT5wYXlsb2FkOwotCi0JLyogbGVuZ3RoIG9mIHBheWxvYWQsIGV4Y2wuIHRoZSB0cmFpbGluZyBGQ1MgKi8KLQlpbnQgZGF0YV9sZW4gPSBsZW5ndGggLSBJRUVFODAyMTFfM0FERFJfTEVOOwotCi0JaW50IGk7Ci0Jc3RydWN0IHJ4X2RhdGFfYnVmICpicHRyLCAqb3B0cjsKLQl1bnNpZ25lZCBsb25nIG9sZGVzdCA9IH4wVUw7Ci0KLQlhdDc2X2RiZyhEQkdfUlhfRlJBR1MsCi0JCSAiJXM6IHJ4IGRhdGEgZnJhbWVfY3RsICUwNHggYWRkcjIgJXMgc2VxL2ZyYWcgJWQvJWQgIgotCQkgImxlbmd0aCAlZCBkYXRhICVkOiAlcyAuLi4iLCBwcml2LT5uZXRkZXYtPm5hbWUsIGZyYW1lX2N0bCwKLQkJIG1hYzJzdHIoaTgwMl8xMV9oZHItPmFkZHIyKSwgc2VxbnIsIGZyYWduciwgbGVuZ3RoLCBkYXRhX2xlbiwKLQkJIGhleDJzdHIoZGF0YSwgMzIpKTsKLQotCWF0NzZfZGJnKERCR19SWF9GUkFHU19TS0IsICIlczogaW5jb21pbmcgc2tiOiBoZWFkICVwIGRhdGEgJXAgIgotCQkgInRhaWwgJXAgZW5kICVwIGxlbiAlZCIsIHByaXYtPm5ldGRldi0+bmFtZSwgc2tiLT5oZWFkLAotCQkgc2tiLT5kYXRhLCBza2JfdGFpbF9wb2ludGVyKHNrYiksIHNrYl9lbmRfcG9pbnRlcihza2IpLAotCQkgc2tiLT5sZW4pOwotCi0JaWYgKGRhdGFfbGVuIDwgMCkgewotCQkvKiBtYWtlIHN1cmUgZGF0YSBzdGFydHMgaW4gdGhlIGJ1ZmZlciAqLwotCQlwcmludGsoS0VSTl9JTkZPICIlczogZGF0YSBmcmFtZSB0b28gc2hvcnRcbiIsCi0JCSAgICAgICBwcml2LT5uZXRkZXYtPm5hbWUpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQlXQVJOX09OKGxlbmd0aCA8PSBBVDc2X1JYX0hEUkxFTik7Ci0JaWYgKGxlbmd0aCA8PSBBVDc2X1JYX0hEUkxFTikKLQkJcmV0dXJuIE5VTEw7Ci0KLQkvKiByZW1vdmUgdGhlIGF0NzZfcnhfYnVmZmVyIGhlYWRlciAtIHdlIGRvbid0IG5lZWQgaXQgYW55bW9yZSAqLwotCS8qIHdlIG5lZWQgdGhlIElFRUU4MDIuMTEgaGVhZGVyIChmb3IgdGhlIGFkZHJlc3NlcykgaWYgdGhpcyBwYWNrZXQKLQkgICBpcyB0aGUgZmlyc3Qgb2YgYSBjaGFpbiAqLwotCXNrYl9wdWxsKHNrYiwgQVQ3Nl9SWF9IRFJMRU4pOwotCi0JLyogcmVtb3ZlIEZDUyBhdCBlbmQgKi8KLQlza2JfdHJpbShza2IsIGxlbmd0aCk7Ci0KLQlhdDc2X2RiZyhEQkdfUlhfRlJBR1NfU0tCLCAiJXM6IHRyaW1tZWQgc2tiOiBoZWFkICVwIGRhdGEgJXAgdGFpbCAlcCAiCi0JCSAiZW5kICVwIGxlbiAlZCBkYXRhICVwIGRhdGFfbGVuICVkIiwgcHJpdi0+bmV0ZGV2LT5uYW1lLAotCQkgc2tiLT5oZWFkLCBza2ItPmRhdGEsIHNrYl90YWlsX3BvaW50ZXIoc2tiKSwKLQkJIHNrYl9lbmRfcG9pbnRlcihza2IpLCBza2ItPmxlbiwgZGF0YSwgZGF0YV9sZW4pOwotCi0JaWYgKGZyYWduciA9PSAwICYmICEoZnJhbWVfY3RsICYgSUVFRTgwMjExX0ZDVExfTU9SRUZSQUdTKSkgewotCQkvKiB1bmZyYWdtZW50ZWQgcGFja2V0IHJlY2VpdmVkICovCi0JCS8qIFVzZSBhIG5ldyBza2IgZm9yIHRoZSBuZXh0IHJlY2VpdmUgKi8KLQkJcHJpdi0+cnhfc2tiID0gTlVMTDsKLQkJYXQ3Nl9kYmcoREJHX1JYX0ZSQUdTLCAiJXM6IHVuZnJhZ21lbnRlZCIsIHByaXYtPm5ldGRldi0+bmFtZSk7Ci0JCXJldHVybiBza2I7Ci0JfQotCi0JLyogbG9vayBpZiB3ZSd2ZSBnb3QgYSBjaGFpbiBmb3IgdGhlIHNlbmRlciBhZGRyZXNzLgotCSAgIGFmdGVyd2FyZHMgb3B0ciBwb2ludHMgdG8gZmlyc3QgZnJlZSBvciB0aGUgb2xkZXN0IGVudHJ5LAotCSAgIG9yLCBpZiBpIDwgTlJfUlhfREFUQV9CVUYsIGJwdHIgcG9pbnRzIHRvIHRoZSBlbnRyeSBmb3IgdGhlCi0JICAgc2VuZGVyIGFkZHJlc3MgKi8KLQkvKiBkZXRlcm1pbmluZyB0aGUgb2xkZXN0IGVudHJ5IGRvZXNuJ3QgY29wZSB3aXRoIGppZmZpZXMgd3JhcHBpbmcKLQkgICBidXQgSSBkb24ndCBjYXJlIHRvIGRlbGV0ZSBhIHlvdW5nIGVudHJ5IGF0IHRoZXNlIHJhcmUgbW9tZW50cyAuLi4gKi8KLQotCWJwdHIgPSBwcml2LT5yeF9kYXRhOwotCW9wdHIgPSBOVUxMOwotCWZvciAoaSA9IDA7IGkgPCBOUl9SWF9EQVRBX0JVRjsgaSsrLCBicHRyKyspIHsKLQkJaWYgKCFicHRyLT5za2IpIHsKLQkJCW9wdHIgPSBicHRyOwotCQkJb2xkZXN0ID0gMFVMOwotCQkJY29udGludWU7Ci0JCX0KLQotCQlpZiAoIWNvbXBhcmVfZXRoZXJfYWRkcihpODAyXzExX2hkci0+YWRkcjIsIGJwdHItPnNlbmRlcikpCi0JCQlicmVhazsKLQotCQlpZiAoIW9wdHIpIHsKLQkJCW9wdHIgPSBicHRyOwotCQkJb2xkZXN0ID0gYnB0ci0+bGFzdF9yeDsKLQkJfSBlbHNlIGlmIChicHRyLT5sYXN0X3J4IDwgb2xkZXN0KQotCQkJb3B0ciA9IGJwdHI7Ci0JfQotCi0JaWYgKGkgPCBOUl9SWF9EQVRBX0JVRikgewotCi0JCWF0NzZfZGJnKERCR19SWF9GUkFHUywgIiVzOiAlZC4gY2FjaGVlbnRyeSAoc2VxL2ZyYWcgPSAlZC8lZCkgIgotCQkJICJtYXRjaGVkIHNlbmRlciBhZGRyIiwKLQkJCSBwcml2LT5uZXRkZXYtPm5hbWUsIGksIGJwdHItPnNlcW5yLCBicHRyLT5mcmFnbnIpOwotCi0JCS8qIGJwdHIgcG9pbnRzIHRvIGFuIGVudHJ5IGZvciB0aGUgc2VuZGVyIGFkZHJlc3MgKi8KLQkJaWYgKGJwdHItPnNlcW5yID09IHNlcW5yKSB7Ci0JCQlpbnQgbGVmdDsKLQkJCS8qIHRoZSBmcmFnbWVudCBoYXMgdGhlIGN1cnJlbnQgc2VxdWVuY2UgbnVtYmVyICovCi0JCQlpZiAoKChicHRyLT5mcmFnbnIgKyAxKSAmIDB4ZikgIT0gZnJhZ25yKSB7Ci0JCQkJLyogd3JvbmcgZnJhZ21lbnQgbnVtYmVyIC0+IGlnbm9yZSBpdCAqLwotCQkJCS8qIGlzICYgMHhmIG5lY2Vzc2FyeSBhYm92ZSA/Pz8gKi8KLQkJCQlhdDc2X2RiZyhEQkdfUlhfRlJBR1MsCi0JCQkJCSAiJXM6IGZyYWcgbnIgbWlzbWF0Y2g6ICVkICsgMSAhPSAlZCIsCi0JCQkJCSBwcml2LT5uZXRkZXYtPm5hbWUsIGJwdHItPmZyYWduciwKLQkJCQkJIGZyYWducik7Ci0JCQkJcmV0dXJuIE5VTEw7Ci0JCQl9Ci0JCQlicHRyLT5sYXN0X3J4ID0gamlmZmllczsKLQkJCS8qIHRoZSBuZXh0IGZvbGxvd2luZyBmcmFnbWVudCBudW1iZXIgLT4KLQkJCSAgIGFkZCB0aGUgZGF0YSBhdCB0aGUgZW5kICovCi0KLQkJCS8qIGZvciB0ZXN0IG9ubHkgPz8/ICovCi0JCQlsZWZ0ID0gc2tiX3RhaWxyb29tKGJwdHItPnNrYik7Ci0JCQlpZiAobGVmdCA8IGRhdGFfbGVuKQotCQkJCXByaW50ayhLRVJOX0lORk8KLQkJCQkgICAgICAgIiVzOiBvbmx5ICVkIGJ5dGUgZnJlZSAobmVlZCAlZClcbiIsCi0JCQkJICAgICAgIHByaXYtPm5ldGRldi0+bmFtZSwgbGVmdCwgZGF0YV9sZW4pOwotCQkJZWxzZQotCQkJCW1lbWNweShza2JfcHV0KGJwdHItPnNrYiwgZGF0YV9sZW4pLCBkYXRhLAotCQkJCSAgICAgICBkYXRhX2xlbik7Ci0KLQkJCWJwdHItPmZyYWduciA9IGZyYWducjsKLQkJCWlmIChmcmFtZV9jdGwgJiBJRUVFODAyMTFfRkNUTF9NT1JFRlJBR1MpCi0JCQkJcmV0dXJuIE5VTEw7Ci0KLQkJCS8qIHRoaXMgd2FzIHRoZSBsYXN0IGZyYWdtZW50IC0gc2VuZCBpdCAqLwotCQkJc2tiID0gYnB0ci0+c2tiOwotCQkJYnB0ci0+c2tiID0gTlVMTDsJLyogZnJlZSB0aGUgZW50cnkgKi8KLQkJCWF0NzZfZGJnKERCR19SWF9GUkFHUywgIiVzOiBsYXN0IGZyYWcgb2Ygc2VxICVkIiwKLQkJCQkgcHJpdi0+bmV0ZGV2LT5uYW1lLCBzZXFucik7Ci0JCQlyZXR1cm4gc2tiOwotCQl9Ci0KLQkJLyogZ290IGFub3RoZXIgc2VxdWVuY2UgbnVtYmVyICovCi0JCWlmIChmcmFnbnIgPT0gMCkgewotCQkJLyogaXQncyB0aGUgc3RhcnQgb2YgYSBuZXcgY2hhaW4gLSByZXBsYWNlIHRoZQotCQkJICAgb2xkIG9uZSBieSB0aGlzICovCi0JCQkvKiBicHRyLT5zZW5kZXIgaGFzIHRoZSBjb3JyZWN0IHZhbHVlIGFscmVhZHkgKi8KLQkJCWF0NzZfZGJnKERCR19SWF9GUkFHUywKLQkJCQkgIiVzOiBzdGFydCBvZiBuZXcgc2VxICVkLCByZW1vdmluZyBvbGQgc2VxICVkIiwKLQkJCQkgcHJpdi0+bmV0ZGV2LT5uYW1lLCBzZXFuciwgYnB0ci0+c2VxbnIpOwotCQkJYnB0ci0+c2VxbnIgPSBzZXFucjsKLQkJCWJwdHItPmZyYWduciA9IDA7Ci0JCQlicHRyLT5sYXN0X3J4ID0gamlmZmllczsKLQkJCS8qIHN3YXAgYnB0ci0+c2tiIGFuZCBwcml2LT5yeF9za2IgKi8KLQkJCXNrYiA9IGJwdHItPnNrYjsKLQkJCWJwdHItPnNrYiA9IHByaXYtPnJ4X3NrYjsKLQkJCXByaXYtPnJ4X3NrYiA9IHNrYjsKLQkJfSBlbHNlIHsKLQkJCS8qIGl0IGZyb20gdGhlIG1pZGRsZSBvZiBhIG5ldyBjaGFpbiAtPgotCQkJICAgZGVsZXRlIHRoZSBvbGQgZW50cnkgYW5kIHNraXAgdGhlIG5ldyBvbmUgKi8KLQkJCWF0NzZfZGJnKERCR19SWF9GUkFHUywKLQkJCQkgIiVzOiBtaWRkbGUgb2YgbmV3IHNlcSAlZCAoJWQpICIKLQkJCQkgInJlbW92aW5nIG9sZCBzZXEgJWQiLAotCQkJCSBwcml2LT5uZXRkZXYtPm5hbWUsIHNlcW5yLCBmcmFnbnIsCi0JCQkJIGJwdHItPnNlcW5yKTsKLQkJCWRldl9rZnJlZV9za2IoYnB0ci0+c2tiKTsKLQkJCWJwdHItPnNrYiA9IE5VTEw7Ci0JCX0KLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JLyogaWYgd2UgZGlkbid0IGZpbmQgYSBjaGFpbiBmb3IgdGhlIHNlbmRlciBhZGRyZXNzLCBvcHRyCi0JICAgcG9pbnRzIGVpdGhlciB0byB0aGUgZmlyc3QgZnJlZSBvciB0aGUgb2xkZXN0IGVudHJ5ICovCi0KLQlpZiAoZnJhZ25yICE9IDApIHsKLQkJLyogdGhpcyBpcyBub3QgdGhlIGJlZ2luIG9mIGEgZnJhZ21lbnQgY2hhaW4gLi4uICovCi0JCWF0NzZfZGJnKERCR19SWF9GUkFHUywKLQkJCSAiJXM6IG5vIGNoYWluIGZvciBub24tZmlyc3QgZnJhZ21lbnQgKCVkKSIsCi0JCQkgcHJpdi0+bmV0ZGV2LT5uYW1lLCBmcmFnbnIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQlCVUdfT04oIW9wdHIpOwotCWlmIChvcHRyLT5za2IpIHsKLQkJLyogc3dhcCB0aGUgc2tiJ3MgKi8KLQkJc2tiID0gb3B0ci0+c2tiOwotCQlvcHRyLT5za2IgPSBwcml2LT5yeF9za2I7Ci0JCXByaXYtPnJ4X3NrYiA9IHNrYjsKLQotCQlhdDc2X2RiZyhEQkdfUlhfRlJBR1MsCi0JCQkgIiVzOiBmcmVlIG9sZCBjb250ZW50czogc2VuZGVyICVzIHNlcS9mcmFnICVkLyVkIiwKLQkJCSBwcml2LT5uZXRkZXYtPm5hbWUsIG1hYzJzdHIob3B0ci0+c2VuZGVyKSwKLQkJCSBvcHRyLT5zZXFuciwgb3B0ci0+ZnJhZ25yKTsKLQotCX0gZWxzZSB7Ci0JCS8qIHRha2UgdGhlIHNrYiBmcm9tIHByaXYtPnJ4X3NrYiAqLwotCQlvcHRyLT5za2IgPSBwcml2LT5yeF9za2I7Ci0JCS8qIGxldCBhdDc2X3N1Ym1pdF9yeF91cmIoKSBhbGxvY2F0ZSBhIG5ldyBza2IgKi8KLQkJcHJpdi0+cnhfc2tiID0gTlVMTDsKLQotCQlhdDc2X2RiZyhEQkdfUlhfRlJBR1MsICIlczogdXNlIGEgZnJlZSBlbnRyeSIsCi0JCQkgcHJpdi0+bmV0ZGV2LT5uYW1lKTsKLQl9Ci0JbWVtY3B5KG9wdHItPnNlbmRlciwgaTgwMl8xMV9oZHItPmFkZHIyLCBFVEhfQUxFTik7Ci0Jb3B0ci0+c2VxbnIgPSBzZXFucjsKLQlvcHRyLT5mcmFnbnIgPSAwOwotCW9wdHItPmxhc3RfcnggPSBqaWZmaWVzOwotCi0JcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIFJ4IGludGVycnVwdDogd2UgZXhwZWN0IHRoZSBjb21wbGV0ZSBkYXRhIGJ1ZmZlciBpbiBwcml2LT5yeF9za2IgKi8KLXN0YXRpYyB2b2lkIGF0NzZfcnhfZGF0YShzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2KQotewotCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBwcml2LT5uZXRkZXY7Ci0Jc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzID0gJnByaXYtPnN0YXRzOwotCXN0cnVjdCBza19idWZmICpza2IgPSBwcml2LT5yeF9za2I7Ci0Jc3RydWN0IGF0NzZfcnhfYnVmZmVyICpidWYgPSAoc3RydWN0IGF0NzZfcnhfYnVmZmVyICopc2tiLT5kYXRhOwotCXN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICppODAyXzExX2hkcjsKLQlpbnQgbGVuZ3RoID0gbGUxNl90b19jcHUoYnVmLT53bGVuZ3RoKTsKLQotCWF0NzZfZGJnKERCR19SWF9EQVRBLCAiJXMgcmVjZWl2ZWQgZGF0YSBwYWNrZXQ6ICVzIiwgbmV0ZGV2LT5uYW1lLAotCQkgaGV4MnN0cihza2ItPmRhdGEsIEFUNzZfUlhfSERSTEVOKSk7Ci0KLQlhdDc2X2RiZyhEQkdfUlhfREFUQV9DT05URU5ULCAicnggcGFja2V0OiAlcyIsCi0JCSBoZXgyc3RyKHNrYi0+ZGF0YSArIEFUNzZfUlhfSERSTEVOLCBsZW5ndGgpKTsKLQotCXNrYiA9IGF0NzZfY2hlY2tfZm9yX3J4X2ZyYWdzKHByaXYpOwotCWlmICghc2tiKQotCQlyZXR1cm47Ci0KLQkvKiBBdG1lbCBoZWFkZXIgYW5kIHRoZSBGQ1MgYXJlIGFscmVhZHkgcmVtb3ZlZCAqLwotCWk4MDJfMTFfaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICopc2tiLT5kYXRhOwotCi0Jc2tiLT5kZXYgPSBuZXRkZXY7Ci0Jc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOwkvKiBUT0RPOiBzaG91bGQgY2hlY2sgQ1JDICovCi0KLQlpZiAoaXNfYnJvYWRjYXN0X2V0aGVyX2FkZHIoaTgwMl8xMV9oZHItPmFkZHIxKSkgewotCQlpZiAoIWNvbXBhcmVfZXRoZXJfYWRkcihpODAyXzExX2hkci0+YWRkcjEsIG5ldGRldi0+YnJvYWRjYXN0KSkKLQkJCXNrYi0+cGt0X3R5cGUgPSBQQUNLRVRfQlJPQURDQVNUOwotCQllbHNlCi0JCQlza2ItPnBrdF90eXBlID0gUEFDS0VUX01VTFRJQ0FTVDsKLQl9IGVsc2UgaWYgKGNvbXBhcmVfZXRoZXJfYWRkcihpODAyXzExX2hkci0+YWRkcjEsIG5ldGRldi0+ZGV2X2FkZHIpKQotCQlza2ItPnBrdF90eXBlID0gUEFDS0VUX09USEVSSE9TVDsKLQotCWF0NzZfaWVlZTgwMjExX3RvX2V0aChza2IsIHByaXYtPml3X21vZGUpOwotCi0JbmV0ZGV2LT5sYXN0X3J4ID0gamlmZmllczsKLQluZXRpZl9yeChza2IpOwotCXN0YXRzLT5yeF9wYWNrZXRzKys7Ci0Jc3RhdHMtPnJ4X2J5dGVzICs9IGxlbmd0aDsKLQotCXJldHVybjsKLX0KLQotc3RhdGljIHZvaWQgYXQ3Nl9yeF9tb25pdG9yX21vZGUoc3RydWN0IGF0NzZfcHJpdiAqcHJpdikKLXsKLQlzdHJ1Y3QgYXQ3Nl9yeF9yYWRpb3RhcCAqcnQ7Ci0JdTggKnBheWxvYWQ7Ci0JaW50IHNrYmxlbjsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gcHJpdi0+bmV0ZGV2OwotCXN0cnVjdCBhdDc2X3J4X2J1ZmZlciAqYnVmID0KLQkgICAgKHN0cnVjdCBhdDc2X3J4X2J1ZmZlciAqKXByaXYtPnJ4X3NrYi0+ZGF0YTsKLQkvKiBsZW5ndGggaW5jbHVkaW5nIHRoZSBJRUVFODAyLjExIGhlYWRlciBhbmQgdGhlIHRyYWlsaW5nIEZDUywKLQkgICBidXQgbm90IGF0NzZfcnhfYnVmZmVyICovCi0JaW50IGxlbmd0aCA9IGxlMTZfdG9fY3B1KGJ1Zi0+d2xlbmd0aCk7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHByaXYtPnJ4X3NrYjsKLQlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSAmcHJpdi0+c3RhdHM7Ci0KLQlpZiAobGVuZ3RoIDwgSUVFRTgwMjExX0ZDU19MRU4pIHsKLQkJLyogYnVmZmVyIGNvbnRhaW5zIG5vIGRhdGEgKi8KLQkJYXQ3Nl9kYmcoREJHX01PTklUT1JfTU9ERSwKLQkJCSAiJXM6IE1PTklUT1IgTU9ERTogcnggc2tiIHdpdGhvdXQgZGF0YSIsCi0JCQkgcHJpdi0+bmV0ZGV2LT5uYW1lKTsKLQkJcmV0dXJuOwotCX0KLQotCXNrYmxlbiA9IHNpemVvZihzdHJ1Y3QgYXQ3Nl9yeF9yYWRpb3RhcCkgKyBsZW5ndGg7Ci0KLQlza2IgPSBkZXZfYWxsb2Nfc2tiKHNrYmxlbik7Ci0JaWYgKCFza2IpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogTU9OSVRPUiBNT0RFOiBkZXZfYWxsb2Nfc2tiIGZvciByYWRpb3RhcCAiCi0JCSAgICAgICAiaGVhZGVyIHJldHVybmVkIE5VTExcbiIsIHByaXYtPm5ldGRldi0+bmFtZSk7Ci0JCXJldHVybjsKLQl9Ci0KLQlza2JfcHV0KHNrYiwgc2tibGVuKTsKLQotCXJ0ID0gKHN0cnVjdCBhdDc2X3J4X3JhZGlvdGFwICopc2tiLT5kYXRhOwotCXBheWxvYWQgPSBza2ItPmRhdGEgKyBzaXplb2Yoc3RydWN0IGF0NzZfcnhfcmFkaW90YXApOwotCi0JcnQtPnJ0X2hkci5pdF92ZXJzaW9uID0gMDsKLQlydC0+cnRfaGRyLml0X3BhZCA9IDA7Ci0JcnQtPnJ0X2hkci5pdF9sZW4gPSBjcHVfdG9fbGUxNihzaXplb2Yoc3RydWN0IGF0NzZfcnhfcmFkaW90YXApKTsKLQlydC0+cnRfaGRyLml0X3ByZXNlbnQgPSBjcHVfdG9fbGUzMihBVDc2X1JYX1JBRElPVEFQX1BSRVNFTlQpOwotCi0JcnQtPnJ0X3RzZnQgPSBjcHVfdG9fbGU2NChsZTMyX3RvX2NwdShidWYtPnJ4X3RpbWUpKTsKLQlydC0+cnRfcmF0ZSA9IGh3X3JhdGVzW2J1Zi0+cnhfcmF0ZV0gJiAofjB4ODApOwotCXJ0LT5ydF9zaWduYWwgPSBidWYtPnJzc2k7Ci0JcnQtPnJ0X25vaXNlID0gYnVmLT5ub2lzZV9sZXZlbDsKLQlydC0+cnRfZmxhZ3MgPSBJRUVFODAyMTFfUkFESU9UQVBfRl9GQ1M7Ci0JaWYgKGJ1Zi0+ZnJhZ21lbnRhdGlvbikKLQkJcnQtPnJ0X2ZsYWdzIHw9IElFRUU4MDIxMV9SQURJT1RBUF9GX0ZSQUc7Ci0KLQltZW1jcHkocGF5bG9hZCwgYnVmLT5wYWNrZXQsIGxlbmd0aCk7Ci0Jc2tiLT5kZXYgPSBuZXRkZXY7Ci0Jc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOwotCXNrYl9yZXNldF9tYWNfaGVhZGVyKHNrYik7Ci0Jc2tiLT5wa3RfdHlwZSA9IFBBQ0tFVF9PVEhFUkhPU1Q7Ci0Jc2tiLT5wcm90b2NvbCA9IGh0b25zKEVUSF9QXzgwMl8yKTsKLQotCW5ldGRldi0+bGFzdF9yeCA9IGppZmZpZXM7Ci0JbmV0aWZfcngoc2tiKTsKLQlzdGF0cy0+cnhfcGFja2V0cysrOwotCXN0YXRzLT5yeF9ieXRlcyArPSBsZW5ndGg7Ci19Ci0KLS8qIENoZWNrIGlmIHdlIHNweSBvbiB0aGUgc2VuZGVyIGFkZHJlc3MgaW4gYnVmIGFuZCB1cGRhdGUgc3RhdHMgKi8KLXN0YXRpYyB2b2lkIGF0NzZfaXdzcHlfdXBkYXRlKHN0cnVjdCBhdDc2X3ByaXYgKnByaXYsCi0JCQkgICAgICBzdHJ1Y3QgYXQ3Nl9yeF9idWZmZXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciAqaGRyID0KLQkgICAgKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICopYnVmLT5wYWNrZXQ7Ci0Jc3RydWN0IGl3X3F1YWxpdHkgcXVhbDsKLQotCS8qIFdlIGNhbiBvbmx5IHNldCB0aGUgbGV2ZWwgaGVyZSAqLwotCXF1YWwudXBkYXRlZCA9IElXX1FVQUxfUVVBTF9JTlZBTElEIHwgSVdfUVVBTF9OT0lTRV9JTlZBTElEOwotCXF1YWwubGV2ZWwgPSAwOwotCXF1YWwubm9pc2UgPSAwOwotCWF0NzZfY2FsY19sZXZlbChwcml2LCBidWYsICZxdWFsKTsKLQotCXNwaW5fbG9ja19iaCgmcHJpdi0+c3B5X3NwaW5sb2NrKTsKLQotCWlmIChwcml2LT5zcHlfZGF0YS5zcHlfbnVtYmVyID4gMCkKLQkJd2lyZWxlc3Nfc3B5X3VwZGF0ZShwcml2LT5uZXRkZXYsIGhkci0+YWRkcjIsICZxdWFsKTsKLQotCXNwaW5fdW5sb2NrX2JoKCZwcml2LT5zcHlfc3BpbmxvY2spOwotfQotCiBzdGF0aWMgdm9pZCBhdDc2X3J4X3Rhc2tsZXQodW5zaWduZWQgbG9uZyBwYXJhbSkKIHsKIAlzdHJ1Y3QgdXJiICp1cmIgPSAoc3RydWN0IHVyYiAqKXBhcmFtOwogCXN0cnVjdCBhdDc2X3ByaXYgKnByaXYgPSB1cmItPmNvbnRleHQ7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IHByaXYtPm5ldGRldjsKIAlzdHJ1Y3QgYXQ3Nl9yeF9idWZmZXIgKmJ1ZjsKLQlzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciAqaTgwMl8xMV9oZHI7Ci0JdTE2IGZyYW1lX2N0bDsKKwlzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXR1cyByeF9zdGF0dXMgPSB7IDAgfTsKIAogCWlmIChwcml2LT5kZXZpY2VfdW5wbHVnZ2VkKSB7CiAJCWF0NzZfZGJnKERCR19ERVZTVEFSVCwgImRldmljZSB1bnBsdWdnZWQiKTsKQEAgLTQ5OTAsNjMgKzE2MjUsNDQgQEAKIAkJcmV0dXJuOwogCX0KIAotCWlmICghcHJpdi0+cnhfc2tiIHx8ICFuZXRkZXYgfHwgIXByaXYtPnJ4X3NrYi0+ZGF0YSkKKwlpZiAoIXByaXYtPnJ4X3NrYiB8fCAhcHJpdi0+cnhfc2tiLT5kYXRhKQogCQlyZXR1cm47CiAKIAlidWYgPSAoc3RydWN0IGF0NzZfcnhfYnVmZmVyICopcHJpdi0+cnhfc2tiLT5kYXRhOwogCi0JaTgwMl8xMV9oZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgKilidWYtPnBhY2tldDsKLQotCWZyYW1lX2N0bCA9IGxlMTZfdG9fY3B1KGk4MDJfMTFfaGRyLT5mcmFtZV9jdGwpOwotCiAJaWYgKHVyYi0+c3RhdHVzICE9IDApIHsKIAkJaWYgKHVyYi0+c3RhdHVzICE9IC1FTk9FTlQgJiYgdXJiLT5zdGF0dXMgIT0gLUVDT05OUkVTRVQpCiAJCQlhdDc2X2RiZyhEQkdfVVJCLAogCQkJCSAiJXMgJXM6IC0gbm9uemVybyBSeCBidWxrIHN0YXR1cyByZWNlaXZlZDogJWQiLAotCQkJCSBfX2Z1bmNfXywgbmV0ZGV2LT5uYW1lLCB1cmItPnN0YXR1cyk7CisJCQkJIF9fZnVuY19fLCB3aXBoeV9uYW1lKHByaXYtPmh3LT53aXBoeSksCisJCQkJIHVyYi0+c3RhdHVzKTsKIAkJcmV0dXJuOwogCX0KIAogCWF0NzZfZGJnKERCR19SWF9BVE1FTF9IRFIsCi0JCSAiJXM6IHJ4IGZyYW1lOiByYXRlICVkIHJzc2kgJWQgbm9pc2UgJWQgbGluayAlZCAlcyIsCi0JCSBwcml2LT5uZXRkZXYtPm5hbWUsIGJ1Zi0+cnhfcmF0ZSwgYnVmLT5yc3NpLCBidWYtPm5vaXNlX2xldmVsLAotCQkgYnVmLT5saW5rX3F1YWxpdHksIGhleDJzdHIoaTgwMl8xMV9oZHIsIDQ4KSk7Ci0JaWYgKHByaXYtPml3X21vZGUgPT0gSVdfTU9ERV9NT05JVE9SKSB7Ci0JCWF0NzZfcnhfbW9uaXRvcl9tb2RlKHByaXYpOwotCQlnb3RvIGV4aXQ7Ci0JfQorCQkgIiVzOiByeCBmcmFtZTogcmF0ZSAlZCByc3NpICVkIG5vaXNlICVkIGxpbmsgJWQiLAorCQkgd2lwaHlfbmFtZShwcml2LT5ody0+d2lwaHkpLCBidWYtPnJ4X3JhdGUsIGJ1Zi0+cnNzaSwKKwkJIGJ1Zi0+bm9pc2VfbGV2ZWwsIGJ1Zi0+bGlua19xdWFsaXR5KTsKIAotCS8qIHRoZXJlIGlzIGEgbmV3IGJzc2lkIGFyb3VuZCwgYWNjZXB0IGl0OiAqLwotCWlmIChidWYtPm5ld2JzcyAmJiBwcml2LT5pd19tb2RlID09IElXX01PREVfQURIT0MpIHsKLQkJYXQ3Nl9kYmcoREJHX1BST0dSRVNTLCAiJXM6IHJ4IG5ld2JzcyIsIG5ldGRldi0+bmFtZSk7Ci0JCXNjaGVkdWxlX3dvcmsoJnByaXYtPndvcmtfbmV3X2Jzcyk7Ci0JfQorCXNrYl90cmltKHByaXYtPnJ4X3NrYiwgbGUxNl90b19jcHUoYnVmLT53bGVuZ3RoKSArIEFUNzZfUlhfSERSTEVOKTsKKwlhdDc2X2RiZ19kdW1wKERCR19SWF9EQVRBLCAmcHJpdi0+cnhfc2tiLT5kYXRhW0FUNzZfUlhfSERSTEVOXSwKKwkJICAgICAgcHJpdi0+cnhfc2tiLT5sZW4sICJSWDogbGVuPSVkIiwKKwkJICAgICAgKGludCkocHJpdi0+cnhfc2tiLT5sZW4gLSBBVDc2X1JYX0hEUkxFTikpOwogCi0Jc3dpdGNoIChmcmFtZV9jdGwgJiBJRUVFODAyMTFfRkNUTF9GVFlQRSkgewotCWNhc2UgSUVFRTgwMjExX0ZUWVBFX0RBVEE6Ci0JCWF0NzZfcnhfZGF0YShwcml2KTsKLQkJYnJlYWs7CisJcnhfc3RhdHVzLnNpZ25hbCA9IGJ1Zi0+cnNzaTsKKwkvKiBGSVhNRTogaXMgcmF0ZV9pZHggc3RpbGwgcHJlc2VudCBpbiBzdHJ1Y3R1cmU/ICovCisJcnhfc3RhdHVzLnJhdGVfaWR4ID0gYnVmLT5yeF9yYXRlOworCXJ4X3N0YXR1cy5mbGFnIHw9IFJYX0ZMQUdfREVDUllQVEVEOworCXJ4X3N0YXR1cy5mbGFnIHw9IFJYX0ZMQUdfSVZfU1RSSVBQRUQ7CiAKLQljYXNlIElFRUU4MDIxMV9GVFlQRV9NR01UOgotCQkvKiBqYWw6IFRPRE86IGZpbmQgb3V0IGlmIHdlIGNhbiB1cGRhdGUgaXdzcHkgYWxzbyBvbgotCQkgICBvdGhlciBmcmFtZXMgdGhhbiBtYW5hZ2VtZW50IChtaWdodCBkZXBlbmQgb24gdGhlCi0JCSAgIHJhZGlvIGNoaXAgLyBmaXJtd2FyZSB2ZXJzaW9uICEpICovCisJc2tiX3B1bGwocHJpdi0+cnhfc2tiLCBBVDc2X1JYX0hEUkxFTik7CisJYXQ3Nl9kYmcoREJHX01BQzgwMjExLCAiY2FsbGluZyBpZWVlODAyMTFfcnhfaXJxc2FmZSgpOiAlZC8lZCIsCisJCSBwcml2LT5yeF9za2ItPmxlbiwgcHJpdi0+cnhfc2tiLT5kYXRhX2xlbik7CisJaWVlZTgwMjExX3J4X2lycXNhZmUocHJpdi0+aHcsIHByaXYtPnJ4X3NrYiwgJnJ4X3N0YXR1cyk7CiAKLQkJYXQ3Nl9pd3NweV91cGRhdGUocHJpdiwgYnVmKTsKKwkvKiBVc2UgYSBuZXcgc2tiIGZvciB0aGUgbmV4dCByZWNlaXZlICovCisJcHJpdi0+cnhfc2tiID0gTlVMTDsKIAotCQlhdDc2X3J4X21nbXQocHJpdiwgYnVmKTsKLQkJYnJlYWs7Ci0KLQljYXNlIElFRUU4MDIxMV9GVFlQRV9DVEw6Ci0JCWF0NzZfZGJnKERCR19SWF9DVFJMLCAiJXM6IGlnbm9yZWQgY3RybCBmcmFtZTogJTA0eCIsCi0JCQkgcHJpdi0+bmV0ZGV2LT5uYW1lLCBmcmFtZV9jdGwpOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCXByaW50ayhLRVJOX0RFQlVHICIlczogaWdub3JpbmcgZnJhbWUgd2l0aCBmcmFtZWN0bCAweCUwNHhcbiIsCi0JCSAgICAgICBwcml2LT5uZXRkZXYtPm5hbWUsIGZyYW1lX2N0bCk7Ci0JfQotZXhpdDoKIAlhdDc2X3N1Ym1pdF9yeF91cmIocHJpdik7CiB9CiAKQEAgLTUwNzMsNyArMTY4OSw3IEBACiAJCQkgICBmd2UtPmZ3bmFtZSk7CiAJCWRldl9wcmludGsoS0VSTl9FUlIsICZ1ZGV2LT5kZXYsCiAJCQkgICAieW91IG1heSBuZWVkIHRvIGRvd25sb2FkIHRoZSBmaXJtd2FyZSBmcm9tICIKLQkJCSAgICJodHRwOi8vZGV2ZWxvcGVyLmJlcmxpb3MuZGUvcHJvamVjdHMvYXQ3NmM1MDNhLyIpOworCQkJICAgImh0dHA6Ly9kZXZlbG9wZXIuYmVybGlvcy5kZS9wcm9qZWN0cy9hdDc2YzUwM2EvXG4iKTsKIAkJZ290byBleGl0OwogCX0KIApAQCAtNTEyNiw1NiArMTc0Miw2MjggQEAKIAkJcmV0dXJuIE5VTEw7CiB9CiAKK3N0YXRpYyB2b2lkIGF0NzZfbWFjODAyMTFfdHhfY2FsbGJhY2soc3RydWN0IHVyYiAqdXJiKQoreworCXN0cnVjdCBhdDc2X3ByaXYgKnByaXYgPSB1cmItPmNvbnRleHQ7CisJc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICppbmZvID0gSUVFRTgwMjExX1NLQl9DQihwcml2LT50eF9za2IpOworCisJYXQ3Nl9kYmcoREJHX01BQzgwMjExLCAiJXMoKSIsIF9fZnVuY19fKTsKKworCXN3aXRjaCAodXJiLT5zdGF0dXMpIHsKKwljYXNlIDA6CisJCS8qIHN1Y2Nlc3MgKi8KKwkJLyogRklYTUU6CisJCSAqIGlzIHRoZSBmcmFtZSByZWFsbHkgQUNLZWQgd2hlbiB0eF9jYWxsYmFjayBpcyBjYWxsZWQgPyAqLworCQlpbmZvLT5mbGFncyB8PSBJRUVFODAyMTFfVFhfU1RBVF9BQ0s7CisJCWJyZWFrOworCWNhc2UgLUVOT0VOVDoKKwljYXNlIC1FQ09OTlJFU0VUOgorCQkvKiBmYWlsLCB1cmIgaGFzIGJlZW4gdW5saW5rZWQgKi8KKwkJLyogRklYTUU6IGFkZCBlcnJvciBtZXNzYWdlICovCisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWF0NzZfZGJnKERCR19VUkIsICIlcyAtIG5vbnplcm8gdHggc3RhdHVzIHJlY2VpdmVkOiAlZCIsCisJCQkgX19mdW5jX18sIHVyYi0+c3RhdHVzKTsKKwkJYnJlYWs7CisJfQorCisJbWVtc2V0KCZpbmZvLT5zdGF0dXMsIDAsIHNpemVvZihpbmZvLT5zdGF0dXMpKTsKKworCWllZWU4MDIxMV90eF9zdGF0dXNfaXJxc2FmZShwcml2LT5odywgcHJpdi0+dHhfc2tiKTsKKworCXByaXYtPnR4X3NrYiA9IE5VTEw7CisKKwlpZWVlODAyMTFfd2FrZV9xdWV1ZXMocHJpdi0+aHcpOworfQorCitzdGF0aWMgaW50IGF0NzZfbWFjODAyMTFfdHgoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGF0NzZfcHJpdiAqcHJpdiA9IGh3LT5wcml2OworCXN0cnVjdCBhdDc2X3R4X2J1ZmZlciAqdHhfYnVmZmVyID0gcHJpdi0+YnVsa19vdXRfYnVmZmVyOworCXN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqaW5mbyA9IElFRUU4MDIxMV9TS0JfQ0Ioc2tiKTsKKwlpbnQgcGFkZGluZywgc3VibWl0X2xlbiwgcmV0OworCisJYXQ3Nl9kYmcoREJHX01BQzgwMjExLCAiJXMoKSIsIF9fZnVuY19fKTsKKworCWlmIChwcml2LT50eF91cmItPnN0YXR1cyA9PSAtRUlOUFJPR1JFU1MpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogJXMgY2FsbGVkIHdoaWxlIHR4IHVyYiBpcyBwZW5kaW5nXG4iLAorCQkgICAgICAgd2lwaHlfbmFtZShwcml2LT5ody0+d2lwaHkpLCBfX2Z1bmNfXyk7CisJCXJldHVybiBORVRERVZfVFhfQlVTWTsKKwl9CisKKwlpZWVlODAyMTFfc3RvcF9xdWV1ZXMoaHcpOworCisJYXQ3Nl9sZWR0cmlnX3R4X2FjdGl2aXR5KCk7CS8qIHRlbGwgbGVkdHJpZ2dlciB3ZSBzZW5kIGEgcGFja2V0ICovCisKKwlXQVJOX09OKHByaXYtPnR4X3NrYiAhPSBOVUxMKTsKKworCXByaXYtPnR4X3NrYiA9IHNrYjsKKwlwYWRkaW5nID0gYXQ3Nl9jYWxjX3BhZGRpbmcoc2tiLT5sZW4pOworCXN1Ym1pdF9sZW4gPSBBVDc2X1RYX0hEUkxFTiArIHNrYi0+bGVuICsgcGFkZGluZzsKKworCS8qIHNldHVwICdBdG1lbCcgaGVhZGVyICovCisJbWVtc2V0KHR4X2J1ZmZlciwgMCwgc2l6ZW9mKCp0eF9idWZmZXIpKTsKKwl0eF9idWZmZXItPnBhZGRpbmcgPSBwYWRkaW5nOworCXR4X2J1ZmZlci0+d2xlbmd0aCA9IGNwdV90b19sZTE2KHNrYi0+bGVuKTsKKwl0eF9idWZmZXItPnR4X3JhdGUgPSBpZWVlODAyMTFfZ2V0X3R4X3JhdGUoaHcsIGluZm8pLT5od192YWx1ZTsKKwlpZiAoRklSTVdBUkVfSVNfV1BBKHByaXYtPmZ3X3ZlcnNpb24pICYmIGluZm8tPmNvbnRyb2wuaHdfa2V5KSB7CisJCXR4X2J1ZmZlci0+a2V5X2lkID0gKGluZm8tPmNvbnRyb2wuaHdfa2V5LT5rZXlpZHgpOworCQl0eF9idWZmZXItPmNpcGhlcl90eXBlID0KKwkJCXByaXYtPmtleXNbaW5mby0+Y29udHJvbC5od19rZXktPmtleWlkeF0uY2lwaGVyOworCQl0eF9idWZmZXItPmNpcGhlcl9sZW5ndGggPQorCQkJcHJpdi0+a2V5c1tpbmZvLT5jb250cm9sLmh3X2tleS0+a2V5aWR4XS5rZXlsZW47CisJCXR4X2J1ZmZlci0+cmVzZXJ2ZWQgPSAwOworCX0gZWxzZSB7CisJCXR4X2J1ZmZlci0+a2V5X2lkID0gMDsKKwkJdHhfYnVmZmVyLT5jaXBoZXJfdHlwZSA9IDA7CisJCXR4X2J1ZmZlci0+Y2lwaGVyX2xlbmd0aCA9IDA7CisJCXR4X2J1ZmZlci0+cmVzZXJ2ZWQgPSAwOworCX07CisJLyogbWVtc2V0KHR4X2J1ZmZlci0+cmVzZXJ2ZWQsIDAsIHNpemVvZih0eF9idWZmZXItPnJlc2VydmVkKSk7ICovCisJbWVtY3B5KHR4X2J1ZmZlci0+cGFja2V0LCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKworCWF0NzZfZGJnKERCR19UWF9EQVRBLCAiJXMgdHg6IHdsZW4gMHgleCBwYWQgMHgleCByYXRlICVkIGhkciIsCisJCSB3aXBoeV9uYW1lKHByaXYtPmh3LT53aXBoeSksIGxlMTZfdG9fY3B1KHR4X2J1ZmZlci0+d2xlbmd0aCksCisJCSB0eF9idWZmZXItPnBhZGRpbmcsIHR4X2J1ZmZlci0+dHhfcmF0ZSk7CisKKwkvKiBzZW5kIHN0dWZmICovCisJYXQ3Nl9kYmdfZHVtcChEQkdfVFhfREFUQV9DT05URU5ULCB0eF9idWZmZXIsIHN1Ym1pdF9sZW4sCisJCSAgICAgICIlcygpOiB0eF9idWZmZXIgJWQgYnl0ZXM6IiwgX19mdW5jX18sIHN1Ym1pdF9sZW4pOworCXVzYl9maWxsX2J1bGtfdXJiKHByaXYtPnR4X3VyYiwgcHJpdi0+dWRldiwgcHJpdi0+dHhfcGlwZSwgdHhfYnVmZmVyLAorCQkJICBzdWJtaXRfbGVuLCBhdDc2X21hYzgwMjExX3R4X2NhbGxiYWNrLCBwcml2KTsKKwlyZXQgPSB1c2Jfc3VibWl0X3VyYihwcml2LT50eF91cmIsIEdGUF9BVE9NSUMpOworCWlmIChyZXQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogZXJyb3IgaW4gdHggc3VibWl0IHVyYjogJWRcbiIsCisJCSAgICAgICB3aXBoeV9uYW1lKHByaXYtPmh3LT53aXBoeSksIHJldCk7CisJCWlmIChyZXQgPT0gLUVJTlZBTCkKKwkJCXByaW50ayhLRVJOX0VSUgorCQkJICAgICAgICIlczogLUVJTlZBTDogdHggdXJiICVwIGhjcHJpdiAlcCBjb21wbGV0ZSAlcFxuIiwKKwkJCSAgICAgICB3aXBoeV9uYW1lKHByaXYtPmh3LT53aXBoeSksIHByaXYtPnR4X3VyYiwKKwkJCSAgICAgICBwcml2LT50eF91cmItPmhjcHJpdiwgcHJpdi0+dHhfdXJiLT5jb21wbGV0ZSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXQ3Nl9tYWM4MDIxMV9zdGFydChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKK3sKKwlzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2ID0gaHctPnByaXY7CisJaW50IHJldDsKKworCWF0NzZfZGJnKERCR19NQUM4MDIxMSwgIiVzKCkiLCBfX2Z1bmNfXyk7CisKKwltdXRleF9sb2NrKCZwcml2LT5tdHgpOworCisJcmV0ID0gYXQ3Nl9zdWJtaXRfcnhfdXJiKHByaXYpOworCWlmIChyZXQgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IG9wZW46IHN1Ym1pdF9yeF91cmIgZmFpbGVkOiAlZFxuIiwKKwkJICAgICAgIHdpcGh5X25hbWUocHJpdi0+aHctPndpcGh5KSwgcmV0KTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlhdDc2X3N0YXJ0dXBfZGV2aWNlKHByaXYpOworCisJYXQ3Nl9zdGFydF9tb25pdG9yKHByaXYpOworCitlcnJvcjoKKwltdXRleF91bmxvY2soJnByaXYtPm10eCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYXQ3Nl9tYWM4MDIxMV9zdG9wKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQoreworCXN0cnVjdCBhdDc2X3ByaXYgKnByaXYgPSBody0+cHJpdjsKKworCWF0NzZfZGJnKERCR19NQUM4MDIxMSwgIiVzKCkiLCBfX2Z1bmNfXyk7CisKKwltdXRleF9sb2NrKCZwcml2LT5tdHgpOworCisJaWYgKCFwcml2LT5kZXZpY2VfdW5wbHVnZ2VkKSB7CisJCS8qIFdlIGFyZSBjYWxsZWQgYnkgImlmY29uZmlnIGV0aFggZG93biIsIG5vdCBiZWNhdXNlIHRoZQorCQkgKiBkZXZpY2UgaXMgbm90IGF2YWlsYWJsZSBhbnltb3JlLiAqLworCQlpZiAoYXQ3Nl9zZXRfcmFkaW8ocHJpdiwgMCkgPT0gMSkKKwkJCWF0NzZfd2FpdF9jb21wbGV0aW9uKHByaXYsIENNRF9SQURJT19PTik7CisKKwkJLyogV2UgdW5saW5rIHJ4X3VyYiBiZWNhdXNlIGF0NzZfb3BlbigpIHJlLXN1Ym1pdHMgaXQuCisJCSAqIElmIHVucGx1Z2dlZCwgYXQ3Nl9kZWxldGVfZGV2aWNlKCkgdGFrZXMgY2FyZSBvZiBpdC4gKi8KKwkJdXNiX2tpbGxfdXJiKHByaXYtPnJ4X3VyYik7CisJfQorCisJbXV0ZXhfdW5sb2NrKCZwcml2LT5tdHgpOworfQorCitzdGF0aWMgaW50IGF0NzZfYWRkX2ludGVyZmFjZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCSAgICAgIHN0cnVjdCBpZWVlODAyMTFfaWZfaW5pdF9jb25mICpjb25mKQoreworCXN0cnVjdCBhdDc2X3ByaXYgKnByaXYgPSBody0+cHJpdjsKKwlpbnQgcmV0ID0gMDsKKworCWF0NzZfZGJnKERCR19NQUM4MDIxMSwgIiVzKCkiLCBfX2Z1bmNfXyk7CisKKwltdXRleF9sb2NrKCZwcml2LT5tdHgpOworCisJc3dpdGNoIChjb25mLT50eXBlKSB7CisJY2FzZSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OOgorCQlwcml2LT5pd19tb2RlID0gSVdfTU9ERV9JTkZSQTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVPUE5PVFNVUFA7CisJCWdvdG8gZXhpdDsKKwl9CisKK2V4aXQ6CisJbXV0ZXhfdW5sb2NrKCZwcml2LT5tdHgpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgYXQ3Nl9yZW1vdmVfaW50ZXJmYWNlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJCSAgc3RydWN0IGllZWU4MDIxMV9pZl9pbml0X2NvbmYgKmNvbmYpCit7CisJYXQ3Nl9kYmcoREJHX01BQzgwMjExLCAiJXMoKSIsIF9fZnVuY19fKTsKK30KKworc3RhdGljIGludCBhdDc2X2pvaW4oc3RydWN0IGF0NzZfcHJpdiAqcHJpdikKK3sKKwlzdHJ1Y3QgYXQ3Nl9yZXFfam9pbiBqb2luOworCWludCByZXQ7CisKKwltZW1zZXQoJmpvaW4sIDAsIHNpemVvZihzdHJ1Y3QgYXQ3Nl9yZXFfam9pbikpOworCW1lbWNweShqb2luLmVzc2lkLCBwcml2LT5lc3NpZCwgcHJpdi0+ZXNzaWRfc2l6ZSk7CisJam9pbi5lc3NpZF9zaXplID0gcHJpdi0+ZXNzaWRfc2l6ZTsKKwltZW1jcHkoam9pbi5ic3NpZCwgcHJpdi0+YnNzaWQsIEVUSF9BTEVOKTsKKwlqb2luLmJzc190eXBlID0gSU5GUkFTVFJVQ1RVUkVfTU9ERTsKKwlqb2luLmNoYW5uZWwgPSBwcml2LT5jaGFubmVsOworCWpvaW4udGltZW91dCA9IGNwdV90b19sZTE2KDIwMDApOworCisJYXQ3Nl9kYmcoREJHX01BQzgwMjExLCAiJXM6IHNlbmRpbmcgQ01EX0pPSU4iLCBfX2Z1bmNfXyk7CisJcmV0ID0gYXQ3Nl9zZXRfY2FyZF9jb21tYW5kKHByaXYtPnVkZXYsIENNRF9KT0lOLCAmam9pbiwKKwkJCQkgICAgc2l6ZW9mKHN0cnVjdCBhdDc2X3JlcV9qb2luKSk7CisKKwlpZiAocmV0IDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBhdDc2X3NldF9jYXJkX2NvbW1hbmQgZmFpbGVkOiAlZFxuIiwKKwkJICAgICAgIHdpcGh5X25hbWUocHJpdi0+aHctPndpcGh5KSwgcmV0KTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0ID0gYXQ3Nl93YWl0X2NvbXBsZXRpb24ocHJpdiwgQ01EX0pPSU4pOworCWF0NzZfZGJnKERCR19NQUM4MDIxMSwgIiVzOiBDTURfSk9JTiByZXR1cm5lZDogMHglMDJ4IiwgX19mdW5jX18sIHJldCk7CisJaWYgKHJldCAhPSBDTURfU1RBVFVTX0NPTVBMRVRFKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGF0NzZfd2FpdF9jb21wbGV0aW9uIGZhaWxlZDogJWRcbiIsCisJCSAgICAgICB3aXBoeV9uYW1lKHByaXYtPmh3LT53aXBoeSksIHJldCk7CisJCXJldHVybiAwOworCX0KKworCWF0NzZfc2V0X3RraXBfYnNzaWQocHJpdiwgcHJpdi0+YnNzaWQpOworCWF0NzZfc2V0X3BtX21vZGUocHJpdik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYXQ3Nl9kd29ya19od19zY2FuKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBhdDc2X3ByaXYsCisJCQkJCSAgICAgIGR3b3JrX2h3X3NjYW4ud29yayk7CisJaW50IHJldDsKKworCXJldCA9IGF0NzZfZ2V0X2NtZF9zdGF0dXMocHJpdi0+dWRldiwgQ01EX1NDQU4pOworCWF0NzZfZGJnKERCR19NQUM4MDIxMSwgIiVzOiBDTURfU0NBTiBzdGF0dXMgMHglMDJ4IiwgX19mdW5jX18sIHJldCk7CisKKwkvKiBGSVhNRTogYWRkIG1heGltdW0gdGltZSBmb3Igc2NhbiB0byBjb21wbGV0ZSAqLworCisJaWYgKHJldCAhPSBDTURfU1RBVFVTX0NPTVBMRVRFKSB7CisJCXF1ZXVlX2RlbGF5ZWRfd29yayhwcml2LT5ody0+d29ya3F1ZXVlLCAmcHJpdi0+ZHdvcmtfaHdfc2NhbiwKKwkJCQkgICBTQ0FOX1BPTExfSU5URVJWQUwpOworCQlnb3RvIGV4aXQ7CisJfQorCisJaWVlZTgwMjExX3NjYW5fY29tcGxldGVkKHByaXYtPmh3KTsKKworCWlmIChpc192YWxpZF9ldGhlcl9hZGRyKHByaXYtPmJzc2lkKSkgeworCQlpZWVlODAyMTFfd2FrZV9xdWV1ZXMocHJpdi0+aHcpOworCQlhdDc2X2pvaW4ocHJpdik7CisJfQorCisJaWVlZTgwMjExX3dha2VfcXVldWVzKHByaXYtPmh3KTsKKworZXhpdDoKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBpbnQgYXQ3Nl9od19zY2FuKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB1OCAqc3NpZCwgc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2ID0gaHctPnByaXY7CisJc3RydWN0IGF0NzZfcmVxX3NjYW4gc2NhbjsKKwlpbnQgcmV0OworCisJYXQ3Nl9kYmcoREJHX01BQzgwMjExLCAiJXMoKToiLCBfX2Z1bmNfXyk7CisJYXQ3Nl9kYmdfZHVtcChEQkdfTUFDODAyMTEsIHNzaWQsIGxlbiwgInNzaWQgJXpkIGJ5dGVzOiIsIGxlbik7CisKKwltdXRleF9sb2NrKCZwcml2LT5tdHgpOworCisJaWVlZTgwMjExX3N0b3BfcXVldWVzKGh3KTsKKworCW1lbXNldCgmc2NhbiwgMCwgc2l6ZW9mKHN0cnVjdCBhdDc2X3JlcV9zY2FuKSk7CisJbWVtc2V0KHNjYW4uYnNzaWQsIDB4RkYsIEVUSF9BTEVOKTsKKwlzY2FuLnNjYW5fdHlwZSA9IFNDQU5fVFlQRV9BQ1RJVkU7CisJaWYgKHByaXYtPmVzc2lkX3NpemUgPiAwKSB7CisJCW1lbWNweShzY2FuLmVzc2lkLCBzc2lkLCBsZW4pOworCQlzY2FuLmVzc2lkX3NpemUgPSBsZW47CisJfQorCXNjYW4ubWluX2NoYW5uZWxfdGltZSA9IGNwdV90b19sZTE2KHByaXYtPnNjYW5fbWluX3RpbWUpOworCXNjYW4ubWF4X2NoYW5uZWxfdGltZSA9IGNwdV90b19sZTE2KHByaXYtPnNjYW5fbWF4X3RpbWUpOworCXNjYW4ucHJvYmVfZGVsYXkgPSBjcHVfdG9fbGUxNihwcml2LT5zY2FuX21pbl90aW1lICogMTAwMCk7CisJc2Nhbi5pbnRlcm5hdGlvbmFsX3NjYW4gPSAwOworCisJYXQ3Nl9kYmcoREJHX01BQzgwMjExLCAiJXM6IHNlbmRpbmcgQ01EX1NDQU4iLCBfX2Z1bmNfXyk7CisJcmV0ID0gYXQ3Nl9zZXRfY2FyZF9jb21tYW5kKHByaXYtPnVkZXYsIENNRF9TQ0FOLCAmc2Nhbiwgc2l6ZW9mKHNjYW4pKTsKKworCWlmIChyZXQgPCAwKSB7CisJCWVycigiQ01EX1NDQU4gZmFpbGVkOiAlZCIsIHJldCk7CisJCWdvdG8gZXhpdDsKKwl9CisKKwlxdWV1ZV9kZWxheWVkX3dvcmsocHJpdi0+aHctPndvcmtxdWV1ZSwgJnByaXYtPmR3b3JrX2h3X3NjYW4sCisJCQkgICBTQ0FOX1BPTExfSU5URVJWQUwpOworCitleGl0OgorCW11dGV4X3VubG9jaygmcHJpdi0+bXR4KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGF0NzZfY29uZmlnKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB1MzIgY2hhbmdlZCkKK3sKKwlzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2ID0gaHctPnByaXY7CisJc3RydWN0IGllZWU4MDIxMV9jb25mICpjb25mID0gJmh3LT5jb25mOworCisJYXQ3Nl9kYmcoREJHX01BQzgwMjExLCAiJXMoKTogY2hhbm5lbCAlZCByYWRpbyAlZCIsCisJCSBfX2Z1bmNfXywgY29uZi0+Y2hhbm5lbC0+aHdfdmFsdWUsIGNvbmYtPnJhZGlvX2VuYWJsZWQpOworCWF0NzZfZGJnX2R1bXAoREJHX01BQzgwMjExLCBwcml2LT5lc3NpZCwgcHJpdi0+ZXNzaWRfc2l6ZSwgInNzaWQ6Iik7CisJYXQ3Nl9kYmdfZHVtcChEQkdfTUFDODAyMTEsIHByaXYtPmJzc2lkLCBFVEhfQUxFTiwgImJzc2lkOiIpOworCisJbXV0ZXhfbG9jaygmcHJpdi0+bXR4KTsKKworCXByaXYtPmNoYW5uZWwgPSBjb25mLT5jaGFubmVsLT5od192YWx1ZTsKKworCWlmIChpc192YWxpZF9ldGhlcl9hZGRyKHByaXYtPmJzc2lkKSkgeworCQlhdDc2X2pvaW4ocHJpdik7CisJCWllZWU4MDIxMV93YWtlX3F1ZXVlcyhwcml2LT5odyk7CisJfSBlbHNlIHsKKwkJaWVlZTgwMjExX3N0b3BfcXVldWVzKHByaXYtPmh3KTsKKwkJYXQ3Nl9zdGFydF9tb25pdG9yKHByaXYpOworCX07CisKKwltdXRleF91bmxvY2soJnByaXYtPm10eCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhdDc2X2NvbmZpZ19pbnRlcmZhY2Uoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkJIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCisJCQkJIHN0cnVjdCBpZWVlODAyMTFfaWZfY29uZiAqY29uZikKK3sKKwlzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2ID0gaHctPnByaXY7CisKKwlhdDc2X2RiZ19kdW1wKERCR19NQUM4MDIxMSwgY29uZi0+YnNzaWQsIEVUSF9BTEVOLCAiYnNzaWQ6Iik7CisKKwltdXRleF9sb2NrKCZwcml2LT5tdHgpOworCisJbWVtY3B5KHByaXYtPmJzc2lkLCBjb25mLT5ic3NpZCwgRVRIX0FMRU4pOworLy8JbWVtY3B5KHByaXYtPmVzc2lkLCBjb25mLT5zc2lkLCBjb25mLT5zc2lkX2xlbik7CisvLwlwcml2LT5lc3NpZF9zaXplID0gY29uZi0+c3NpZF9sZW47CisKKwlpZiAoaXNfdmFsaWRfZXRoZXJfYWRkcihwcml2LT5ic3NpZCkpIHsKKwkJLyogbWFjODAyMTEgaXMgam9pbmluZyBhIGJzcyAqLworCQlpZWVlODAyMTFfd2FrZV9xdWV1ZXMocHJpdi0+aHcpOworCQlhdDc2X2pvaW4ocHJpdik7CisJfSBlbHNlCisJCWllZWU4MDIxMV9zdG9wX3F1ZXVlcyhwcml2LT5odyk7CisKKwltdXRleF91bmxvY2soJnByaXYtPm10eCk7CisKKwlyZXR1cm4gMDsKK30KKworLyogbXVzdCBiZSBhdG9taWMgKi8KK3N0YXRpYyB2b2lkIGF0NzZfY29uZmlndXJlX2ZpbHRlcihzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCQkgIHVuc2lnbmVkIGludCBjaGFuZ2VkX2ZsYWdzLAorCQkJCSAgdW5zaWduZWQgaW50ICp0b3RhbF9mbGFncywgaW50IG1jX2NvdW50LAorCQkJCSAgc3RydWN0IGRldl9hZGRyX2xpc3QgKm1jX2xpc3QpCit7CisJc3RydWN0IGF0NzZfcHJpdiAqcHJpdiA9IGh3LT5wcml2OworCWludCBmbGFnczsKKworCWF0NzZfZGJnKERCR19NQUM4MDIxMSwgIiVzKCk6IGNoYW5nZWRfZmxhZ3M9MHglMDh4ICIKKwkJICJ0b3RhbF9mbGFncz0weCUwOHggbWNfY291bnQ9JWQiLAorCQkgX19mdW5jX18sIGNoYW5nZWRfZmxhZ3MsICp0b3RhbF9mbGFncywgbWNfY291bnQpOworCisJZmxhZ3MgPSBjaGFuZ2VkX2ZsYWdzICYgQVQ3Nl9TVVBQT1JURURfRklMVEVSUzsKKwkqdG90YWxfZmxhZ3MgPSBBVDc2X1NVUFBPUlRFRF9GSUxURVJTOworCisJLyogRklYTUU6IGFjY2VzcyB0byBwcml2LT5wcm9taXNjIHNob3VsZCBiZSBwcm90ZWN0ZWQgd2l0aAorCSAqIHByaXYtPm10eCwgYnV0IGl0J3MgaW1wb3NzaWJsZSBiZWNhdXNlIHRoaXMgZnVuY3Rpb24gbmVlZHMgdG8gYmUKKwkgKiBhdG9taWMgKi8KKworCWlmIChmbGFncyAmJiAhcHJpdi0+cHJvbWlzYykgeworCQkvKiBtYWM4MDIxMSB3YW50cyB1cyB0byBlbmFibGUgcHJvbWlzY3VvdXMgbW9kZSAqLworCQlwcml2LT5wcm9taXNjID0gMTsKKwl9IGVsc2UgaWYgKCFmbGFncyAmJiBwcml2LT5wcm9taXNjKSB7CisJCS8qIHdlIG5lZWQgdG8gZGlzYWJsZSBwcm9taXNjdW91cyBtb2RlICovCisJCXByaXYtPnByb21pc2MgPSAwOworCX0gZWxzZQorCQlyZXR1cm47CisKKwlxdWV1ZV93b3JrKGh3LT53b3JrcXVldWUsICZwcml2LT53b3JrX3NldF9wcm9taXNjKTsKK30KKworc3RhdGljIGludCBhdDc2X3NldF9rZXlfb2xkZncoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIGVudW0gc2V0X2tleV9jbWQgY21kLAorCQkJY29uc3QgdTggKmxvY2FsX2FkZHJlc3MsIGNvbnN0IHU4ICphZGRyZXNzLAorCQkJc3RydWN0IGllZWU4MDIxMV9rZXlfY29uZiAqa2V5KQoreworCXN0cnVjdCBhdDc2X3ByaXYgKnByaXYgPSBody0+cHJpdjsKKworCWludCBpOworCisJYXQ3Nl9kYmcoREJHX01BQzgwMjExLCAiJXMoKTogY21kICVkIGtleS0+YWxnICVkIGtleS0+a2V5aWR4ICVkICIKKwkJICJrZXktPmtleWxlbiAlZCIsCisJCSBfX2Z1bmNfXywgY21kLCBrZXktPmFsZywga2V5LT5rZXlpZHgsIGtleS0+a2V5bGVuKTsKKworCWlmIChrZXktPmFsZyAhPSBBTEdfV0VQKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlrZXktPmh3X2tleV9pZHggPSBrZXktPmtleWlkeDsKKworCW11dGV4X2xvY2soJnByaXYtPm10eCk7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgU0VUX0tFWToKKwkJbWVtY3B5KHByaXYtPndlcF9rZXlzW2tleS0+a2V5aWR4XSwga2V5LT5rZXksIGtleS0+a2V5bGVuKTsKKwkJcHJpdi0+d2VwX2tleXNfbGVuW2tleS0+a2V5aWR4XSA9IGtleS0+a2V5bGVuOworCisJCS8qIEZJWE1FOiBmaW5kIG91dCBob3cgdG8gZG8gdGhpcyBwcm9wZXJseSAqLworCQlwcml2LT53ZXBfa2V5X2lkID0ga2V5LT5rZXlpZHg7CisKKwkJYnJlYWs7CisJY2FzZSBESVNBQkxFX0tFWToKKwlkZWZhdWx0OgorCQlwcml2LT53ZXBfa2V5c19sZW5ba2V5LT5rZXlpZHhdID0gMDsKKwkJYnJlYWs7CisJfQorCisJcHJpdi0+d2VwX2VuYWJsZWQgPSAwOworCisJZm9yIChpID0gMDsgaSA8IFdFUF9LRVlTOyBpKyspIHsKKwkJaWYgKHByaXYtPndlcF9rZXlzX2xlbltpXSAhPSAwKQorCQkJcHJpdi0+d2VwX2VuYWJsZWQgPSAxOworCX0KKworCWF0NzZfc3RhcnR1cF9kZXZpY2UocHJpdik7CisKKwltdXRleF91bmxvY2soJnByaXYtPm10eCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhdDc2X3NldF9rZXlfbmV3Zncoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIGVudW0gc2V0X2tleV9jbWQgY21kLAorCQkJY29uc3QgdTggKmxvY2FsX2FkZHJlc3MsIGNvbnN0IHU4ICphZGRyZXNzLAorCQkJc3RydWN0IGllZWU4MDIxMV9rZXlfY29uZiAqa2V5KQoreworCXN0cnVjdCBhdDc2X3ByaXYgKnByaXYgPSBody0+cHJpdjsKKwlpbnQgcmV0ID0gLUVPUE5PVFNVUFA7CisKKwlhdDc2X2RiZyhEQkdfTUFDODAyMTEsICIlcygpOiBjbWQgJWQga2V5LT5hbGcgJWQga2V5LT5rZXlpZHggJWQgIgorCQkgImtleS0+a2V5bGVuICVkIiwKKwkJIF9fZnVuY19fLCBjbWQsIGtleS0+YWxnLCBrZXktPmtleWlkeCwga2V5LT5rZXlsZW4pOworCisJbXV0ZXhfbG9jaygmcHJpdi0+bXR4KTsKKworCXByaXYtPm1pYl9idWYudHlwZSA9IE1JQl9NQUNfRU5DUllQVElPTjsKKworCWlmIChjbWQgPT0gRElTQUJMRV9LRVkpIHsKKwkJcHJpdi0+bWliX2J1Zi5zaXplID0gQ0lQSEVSX0tFWV9MRU47CisJCXByaXYtPm1pYl9idWYuaW5kZXggPSBvZmZzZXRvZihzdHJ1Y3QgbWliX21hY19lbmNyeXB0aW9uLAorCQkJCWNpcGhlcl9kZWZhdWx0X2tleXZhbHVlW2tleS0+a2V5aWR4XSk7CisJCW1lbXNldChwcml2LT5taWJfYnVmLmRhdGEuZGF0YSwgMCwgQ0lQSEVSX0tFWV9MRU4pOworCQlpZiAoYXQ3Nl9zZXRfbWliKHByaXYsICZwcml2LT5taWJfYnVmKSAhPSBDTURfU1RBVFVTX0NPTVBMRVRFKQorCQkJcmV0ID0gLUVPUE5PVFNVUFA7IC8qIC1FSU8gd291bGQgYmUgcHJvYmFibHkgYmV0dGVyICovCisJCWVsc2UgeworCisJCQlwcml2LT5rZXlzW2tleS0+a2V5aWR4XS5jaXBoZXIgPSBDSVBIRVJfTk9ORTsKKwkJCXByaXYtPmtleXNba2V5LT5rZXlpZHhdLmtleWxlbiA9IDA7CisJCX07CisJCWlmIChwcml2LT5kZWZhdWx0X2dyb3VwX2tleSA9PSBrZXktPmtleWlkeCkKKwkJCXByaXYtPmRlZmF1bHRfZ3JvdXBfa2V5ID0gMHhmZjsKKworCQlpZiAocHJpdi0+ZGVmYXVsdF9wYWlyd2lzZV9rZXkgPT0ga2V5LT5rZXlpZHgpCisJCQlwcml2LT5kZWZhdWx0X3BhaXJ3aXNlX2tleSA9IDB4ZmY7CisJCS8qIElmIGRlZmF1bHQgcGFpcndpc2Uga2V5IGlzIHJlbW92ZWQsIGZhbGwgYmFjayB0bworCQkgKiBncm91cCBrZXk/ICovCisJCXJldCA9IDA7CisJCWdvdG8gZXhpdDsKKwl9OworCisJaWYgKGNtZCA9PSBTRVRfS0VZKSB7CisJCS8qIHN0b3JlIGtleSBpbnRvIE1JQiAqLworCQlwcml2LT5taWJfYnVmLnNpemUgPSBDSVBIRVJfS0VZX0xFTjsKKwkJcHJpdi0+bWliX2J1Zi5pbmRleCA9IG9mZnNldG9mKHN0cnVjdCBtaWJfbWFjX2VuY3J5cHRpb24sCisJCQkJY2lwaGVyX2RlZmF1bHRfa2V5dmFsdWVba2V5LT5rZXlpZHhdKTsKKwkJbWVtc2V0KHByaXYtPm1pYl9idWYuZGF0YS5kYXRhLCAwLCBDSVBIRVJfS0VZX0xFTik7CisJCW1lbWNweShwcml2LT5taWJfYnVmLmRhdGEuZGF0YSwga2V5LT5rZXksIGtleS0+a2V5bGVuKTsKKworCQlzd2l0Y2ggKGtleS0+YWxnKSB7CisJCWNhc2UgQUxHX1dFUDoKKwkJCWlmIChrZXktPmtleWxlbiA9PSA1KSB7CisJCQkJcHJpdi0+a2V5c1trZXktPmtleWlkeF0uY2lwaGVyID0KKwkJCQkJQ0lQSEVSX1dFUDY0OworCQkJCXByaXYtPmtleXNba2V5LT5rZXlpZHhdLmtleWxlbiA9IDg7CisJCQl9IGVsc2UgaWYgKGtleS0+a2V5bGVuID09IDEzKSB7CisJCQkJcHJpdi0+a2V5c1trZXktPmtleWlkeF0uY2lwaGVyID0KKwkJCQkJQ0lQSEVSX1dFUDEyODsKKwkJCQkvKiBGaXJtd2FyZSBuZWVkcyB0aGlzICovCisJCQkJcHJpdi0+a2V5c1trZXktPmtleWlkeF0ua2V5bGVuID0gODsKKwkJCX0gZWxzZSB7CisJCQkJcmV0ID0gLUVPUE5PVFNVUFA7CisJCQkJZ290byBleGl0OworCQkJfTsKKwkJCWJyZWFrOworCQljYXNlIEFMR19US0lQOgorCQkJa2V5LT5mbGFncyB8PSBJRUVFODAyMTFfS0VZX0ZMQUdfR0VORVJBVEVfTU1JQzsKKwkJCXByaXYtPmtleXNba2V5LT5rZXlpZHhdLmNpcGhlciA9IENJUEhFUl9US0lQOworCQkJcHJpdi0+a2V5c1trZXktPmtleWlkeF0ua2V5bGVuID0gMTI7CisJCQlicmVhazsKKworCQljYXNlIEFMR19DQ01QOgorCQkJaWYgKCFhdDc2X2lzXzUwNWEocHJpdi0+Ym9hcmRfdHlwZSkpIHsKKwkJCQlyZXQgPSAtRU9QTk9UU1VQUDsKKwkJCQlnb3RvIGV4aXQ7CisJCQl9OworCQkJa2V5LT5mbGFncyB8PSBJRUVFODAyMTFfS0VZX0ZMQUdfR0VORVJBVEVfTU1JQzsKKwkJCXByaXYtPmtleXNba2V5LT5rZXlpZHhdLmNpcGhlciA9IENJUEhFUl9DQ01QOworCQkJcHJpdi0+a2V5c1trZXktPmtleWlkeF0ua2V5bGVuID0gMTY7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJcmV0ID0gLUVPUE5PVFNVUFA7CisJCQlnb3RvIGV4aXQ7CisJCX07CisKKwkJcHJpdi0+bWliX2J1Zi5kYXRhLmRhdGFbMzhdID0gcHJpdi0+a2V5c1trZXktPmtleWlkeF0uY2lwaGVyOworCQlwcml2LT5taWJfYnVmLmRhdGEuZGF0YVszOV0gPSAxOyAvKiBUYWtlbiBmcm9tIGF0bWVsd2xhbmRyaXZlciwKKwkJCQkJCSAgICBub3QgZG9jdW1lbnRlZCAqLworCisJCWlmIChpc192YWxpZF9ldGhlcl9hZGRyKGFkZHJlc3MpKQorCQkJLyogUGFpcndpc2Uga2V5ICovCisJCQlwcml2LT5taWJfYnVmLmRhdGEuZGF0YVszOV0gfD0gKEtFWV9QQUlSV0lTRSB8IEtFWV9UWCk7CisJCWVsc2UgaWYgKGlzX2Jyb2FkY2FzdF9ldGhlcl9hZGRyKGFkZHJlc3MpKQorCQkJLyogR3JvdXAga2V5ICovCisJCQlwcml2LT5taWJfYnVmLmRhdGEuZGF0YVszOV0gfD0gKEtFWV9UWCk7CisJCWVsc2UJLyogS2V5IHVzZWQgb25seSBmb3IgdHJhbnNtaXNzaW9uID8/PyAqLworCQkJcHJpdi0+bWliX2J1Zi5kYXRhLmRhdGFbMzldIHw9IChLRVlfVFgpOworCisJCWlmIChhdDc2X3NldF9taWIocHJpdiwgJnByaXYtPm1pYl9idWYpICE9CisJCQkJQ01EX1NUQVRVU19DT01QTEVURSkgeworCQkJcmV0ID0gLUVPUE5PVFNVUFA7IC8qIC1FSU8gd291bGQgYmUgcHJvYmFibHkgYmV0dGVyICovCisJCQlnb3RvIGV4aXQ7CisJCX07CisKKwkJaWYgKChrZXktPmFsZyA9PSBBTEdfVEtJUCkgfHwgKGtleS0+YWxnID09IEFMR19DQ01QKSkKKwkJCWF0NzZfcmVzZXRfcnNjKHByaXYpOworCisJCWtleS0+aHdfa2V5X2lkeCA9IGtleS0+a2V5aWR4OworCisJCS8qIFNldCB1cCBkZWZhdWx0IGtleXMgKi8KKwkJaWYgKGlzX2Jyb2FkY2FzdF9ldGhlcl9hZGRyKGFkZHJlc3MpKQorCQkJcHJpdi0+ZGVmYXVsdF9ncm91cF9rZXkgPSBrZXktPmtleWlkeDsKKwkJaWYgKGlzX3ZhbGlkX2V0aGVyX2FkZHIoYWRkcmVzcykpCisJCQlwcml2LT5kZWZhdWx0X3BhaXJ3aXNlX2tleSA9IGtleS0+a2V5aWR4OworCisJCS8qIFNldCB1cCBlbmNyeXB0aW9uIE1JQnMgKi8KKworCQkvKiBmaXJzdCBibG9jayBvZiBzZXR0aW5ncyAqLworCQlwcml2LT5taWJfYnVmLnNpemUgPSAzOworCQlwcml2LT5taWJfYnVmLmluZGV4ID0gb2Zmc2V0b2Yoc3RydWN0IG1pYl9tYWNfZW5jcnlwdGlvbiwKKwkJCQlwcml2YWN5X2ludm9rZWQpOworCQlwcml2LT5taWJfYnVmLmRhdGEuZGF0YVswXSA9IDE7CS8qIHByaXZhY3lfaW52b2tlZCAqLworCQlwcml2LT5taWJfYnVmLmRhdGEuZGF0YVsxXSA9IHByaXYtPmRlZmF1bHRfcGFpcndpc2Vfa2V5OworCQlwcml2LT5taWJfYnVmLmRhdGEuZGF0YVsyXSA9IHByaXYtPmRlZmF1bHRfZ3JvdXBfa2V5OworCisJCXJldCA9IGF0NzZfc2V0X21pYihwcml2LCAmcHJpdi0+bWliX2J1Zik7CisJCWlmIChyZXQgIT0gQ01EX1NUQVRVU19DT01QTEVURSkKKwkJCWdvdG8gZXhpdDsKKworCQkvKiBzZWNvbmQgYmxvY2sgb2Ygc2V0dGluZ3MgKi8KKwkJcHJpdi0+bWliX2J1Zi5zaXplID0gMzsKKwkJcHJpdi0+bWliX2J1Zi5pbmRleCA9IG9mZnNldG9mKHN0cnVjdCBtaWJfbWFjX2VuY3J5cHRpb24sCisJCQkJZXhjbHVkZV91bmVuY3J5cHRlZCk7CisJCXByaXYtPm1pYl9idWYuZGF0YS5kYXRhWzBdID0gMTsJLyogZXhjbHVkZV91bmVuY3J5cHRlZCAqLworCQlwcml2LT5taWJfYnVmLmRhdGEuZGF0YVsxXSA9IDA7CS8qIHdlcF9lbmNyeXB0aW9uX3R5cGUgKi8KKwkJcHJpdi0+bWliX2J1Zi5kYXRhLmRhdGFbMl0gPSAwOwkvKiBja2lwX2tleV9wZXJtdXRhdGlvbiAqLworCisJCXJldCA9IGF0NzZfc2V0X21pYihwcml2LCAmcHJpdi0+bWliX2J1Zik7CisJCWlmIChyZXQgIT0gQ01EX1NUQVRVU19DT01QTEVURSkKKwkJCWdvdG8gZXhpdDsKKwkJcmV0ID0gMDsKKwl9OworZXhpdDoKKwlhdDc2X2R1bXBfbWliX21hY19lbmNyeXB0aW9uKHByaXYpOworCW11dGV4X3VubG9jaygmcHJpdi0+bXR4KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGF0NzZfc2V0X2tleShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgZW51bSBzZXRfa2V5X2NtZCBjbWQsCisJCQljb25zdCB1OCAqbG9jYWxfYWRkcmVzcywgY29uc3QgdTggKmFkZHJlc3MsCisJCQlzdHJ1Y3QgaWVlZTgwMjExX2tleV9jb25mICprZXkpCit7CisJc3RydWN0IGF0NzZfcHJpdiAqcHJpdiA9IGh3LT5wcml2OworCisJYXQ3Nl9kYmcoREJHX01BQzgwMjExLCAiJXMoKTogY21kICVkIGtleS0+YWxnICVkIGtleS0+a2V5aWR4ICVkICIKKwkJICJrZXktPmtleWxlbiAlZCIsCisJCSBfX2Z1bmNfXywgY21kLCBrZXktPmFsZywga2V5LT5rZXlpZHgsIGtleS0+a2V5bGVuKTsKKworCWlmIChGSVJNV0FSRV9JU19XUEEocHJpdi0+ZndfdmVyc2lvbikpCisJCXJldHVybiBhdDc2X3NldF9rZXlfbmV3ZncoaHcsIGNtZCwgbG9jYWxfYWRkcmVzcywgYWRkcmVzcywga2V5KTsKKwllbHNlCisJCXJldHVybiBhdDc2X3NldF9rZXlfb2xkZncoaHcsIGNtZCwgbG9jYWxfYWRkcmVzcywgYWRkcmVzcywga2V5KTsKKworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGllZWU4MDIxMV9vcHMgYXQ3Nl9vcHMgPSB7CisJLnR4ID0gYXQ3Nl9tYWM4MDIxMV90eCwKKwkuYWRkX2ludGVyZmFjZSA9IGF0NzZfYWRkX2ludGVyZmFjZSwKKwkucmVtb3ZlX2ludGVyZmFjZSA9IGF0NzZfcmVtb3ZlX2ludGVyZmFjZSwKKwkuY29uZmlnID0gYXQ3Nl9jb25maWcsCisJLmNvbmZpZ19pbnRlcmZhY2UgPSBhdDc2X2NvbmZpZ19pbnRlcmZhY2UsCisJLmNvbmZpZ3VyZV9maWx0ZXIgPSBhdDc2X2NvbmZpZ3VyZV9maWx0ZXIsCisJLnN0YXJ0ID0gYXQ3Nl9tYWM4MDIxMV9zdGFydCwKKwkuc3RvcCA9IGF0NzZfbWFjODAyMTFfc3RvcCwKKwkuaHdfc2NhbiA9IGF0NzZfaHdfc2NhbiwKKwkuc2V0X2tleSA9IGF0NzZfc2V0X2tleSwKK307CisKIC8qIEFsbG9jYXRlIG5ldHdvcmsgZGV2aWNlIGFuZCBpbml0aWFsaXplIHByaXZhdGUgZGF0YSAqLwogc3RhdGljIHN0cnVjdCBhdDc2X3ByaXYgKmF0NzZfYWxsb2NfbmV3X2RldmljZShzdHJ1Y3QgdXNiX2RldmljZSAqdWRldikKIHsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2OworCXN0cnVjdCBpZWVlODAyMTFfaHcgKmh3OwogCXN0cnVjdCBhdDc2X3ByaXYgKnByaXY7Ci0JaW50IGk7CiAKLQkvKiBhbGxvY2F0ZSBtZW1vcnkgZm9yIG91ciBkZXZpY2Ugc3RhdGUgYW5kIGluaXRpYWxpemUgaXQgKi8KLQluZXRkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IGF0NzZfcHJpdikpOwotCWlmICghbmV0ZGV2KSB7Ci0JCWRldl9wcmludGsoS0VSTl9FUlIsICZ1ZGV2LT5kZXYsICJvdXQgb2YgbWVtb3J5XG4iKTsKKwlodyA9IGllZWU4MDIxMV9hbGxvY19odyhzaXplb2Yoc3RydWN0IGF0NzZfcHJpdiksICZhdDc2X29wcyk7CisJaWYgKCFodykgeworCQlwcmludGsoS0VSTl9FUlIgRFJJVkVSX05BTUUgIjogY291bGQgbm90IHJlZ2lzdGVyIgorCQkgICAgICAgIiBpZWVlODAyMTFfaHdcbiIpOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAKLQlwcml2ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlwcml2ID0gaHctPnByaXY7CisJcHJpdi0+aHcgPSBodzsKIAogCXByaXYtPnVkZXYgPSB1ZGV2OwotCXByaXYtPm5ldGRldiA9IG5ldGRldjsKIAogCW11dGV4X2luaXQoJnByaXYtPm10eCk7Ci0JSU5JVF9XT1JLKCZwcml2LT53b3JrX2Fzc29jX2RvbmUsIGF0NzZfd29ya19hc3NvY19kb25lKTsKLQlJTklUX1dPUksoJnByaXYtPndvcmtfam9pbiwgYXQ3Nl93b3JrX2pvaW4pOwotCUlOSVRfV09SSygmcHJpdi0+d29ya19uZXdfYnNzLCBhdDc2X3dvcmtfbmV3X2Jzcyk7Ci0JSU5JVF9XT1JLKCZwcml2LT53b3JrX3N0YXJ0X3NjYW4sIGF0NzZfd29ya19zdGFydF9zY2FuKTsKIAlJTklUX1dPUksoJnByaXYtPndvcmtfc2V0X3Byb21pc2MsIGF0NzZfd29ya19zZXRfcHJvbWlzYyk7CiAJSU5JVF9XT1JLKCZwcml2LT53b3JrX3N1Ym1pdF9yeCwgYXQ3Nl93b3JrX3N1Ym1pdF9yeCk7Ci0JSU5JVF9ERUxBWUVEX1dPUksoJnByaXYtPmR3b3JrX3Jlc3RhcnQsIGF0NzZfZHdvcmtfcmVzdGFydCk7Ci0JSU5JVF9ERUxBWUVEX1dPUksoJnByaXYtPmR3b3JrX2dldF9zY2FuLCBhdDc2X2R3b3JrX2dldF9zY2FuKTsKLQlJTklUX0RFTEFZRURfV09SSygmcHJpdi0+ZHdvcmtfYmVhY29uLCBhdDc2X2R3b3JrX2JlYWNvbik7Ci0JSU5JVF9ERUxBWUVEX1dPUksoJnByaXYtPmR3b3JrX2F1dGgsIGF0NzZfZHdvcmtfYXV0aCk7Ci0JSU5JVF9ERUxBWUVEX1dPUksoJnByaXYtPmR3b3JrX2Fzc29jLCBhdDc2X2R3b3JrX2Fzc29jKTsKLQotCXNwaW5fbG9ja19pbml0KCZwcml2LT5tZ210X3NwaW5sb2NrKTsKLQlwcml2LT5uZXh0X21nbXRfYnVsayA9IE5VTEw7Ci0JcHJpdi0+bWFjX3N0YXRlID0gTUFDX0lOSVQ7Ci0KLQkvKiBpbml0aWFsaXplIGVtcHR5IEJTUyBsaXN0ICovCi0JcHJpdi0+Y3Vycl9ic3MgPSBOVUxMOwotCUlOSVRfTElTVF9IRUFEKCZwcml2LT5ic3NfbGlzdCk7Ci0Jc3Bpbl9sb2NrX2luaXQoJnByaXYtPmJzc19saXN0X3NwaW5sb2NrKTsKLQotCWluaXRfdGltZXIoJnByaXYtPmJzc19saXN0X3RpbWVyKTsKLQlwcml2LT5ic3NfbGlzdF90aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpcHJpdjsKLQlwcml2LT5ic3NfbGlzdF90aW1lci5mdW5jdGlvbiA9IGF0NzZfYnNzX2xpc3RfdGltZW91dDsKLQotCXNwaW5fbG9ja19pbml0KCZwcml2LT5zcHlfc3BpbmxvY2spOwotCi0JLyogbWFyayBhbGwgcnggZGF0YSBlbnRyaWVzIGFzIHVudXNlZCAqLwotCWZvciAoaSA9IDA7IGkgPCBOUl9SWF9EQVRBX0JVRjsgaSsrKQotCQlwcml2LT5yeF9kYXRhW2ldLnNrYiA9IE5VTEw7CisJSU5JVF9ERUxBWUVEX1dPUksoJnByaXYtPmR3b3JrX2h3X3NjYW4sIGF0NzZfZHdvcmtfaHdfc2Nhbik7CiAKIAlwcml2LT5yeF90YXNrbGV0LmZ1bmMgPSBhdDc2X3J4X3Rhc2tsZXQ7CiAJcHJpdi0+cnhfdGFza2xldC5kYXRhID0gMDsKQEAgLTUxODMsNiArMjM3MSw5IEBACiAJcHJpdi0+cG1fbW9kZSA9IEFUNzZfUE1fT0ZGOwogCXByaXYtPnBtX3BlcmlvZCA9IDA7CiAKKwkvKiB1bml0IHVzICovCisJcHJpdi0+aHctPmNoYW5uZWxfY2hhbmdlX3RpbWUgPSAxMDAwMDA7CisKIAlyZXR1cm4gcHJpdjsKIH0KIApAQCAtNTI0NSwxMSArMjQzNiw0MiBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgc3RydWN0IGllZWU4MDIxMV9yYXRlIGF0NzZfcmF0ZXNbXSA9IHsKKwl7IC5iaXRyYXRlID0gMTAsIC5od192YWx1ZSA9IFRYX1JBVEVfMU1CSVQsIH0sCisJeyAuYml0cmF0ZSA9IDIwLCAuaHdfdmFsdWUgPSBUWF9SQVRFXzJNQklULCB9LAorCXsgLmJpdHJhdGUgPSA1NSwgLmh3X3ZhbHVlID0gVFhfUkFURV81XzVNQklULCB9LAorCXsgLmJpdHJhdGUgPSAxMTAsIC5od192YWx1ZSA9IFRYX1JBVEVfMTFNQklULCB9LAorfTsKKworc3RhdGljIHN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCBhdDc2X2NoYW5uZWxzW10gPSB7CisJeyAuY2VudGVyX2ZyZXEgPSAyNDEyLCAuaHdfdmFsdWUgPSAxIH0sCisJeyAuY2VudGVyX2ZyZXEgPSAyNDE3LCAuaHdfdmFsdWUgPSAyIH0sCisJeyAuY2VudGVyX2ZyZXEgPSAyNDIyLCAuaHdfdmFsdWUgPSAzIH0sCisJeyAuY2VudGVyX2ZyZXEgPSAyNDI3LCAuaHdfdmFsdWUgPSA0IH0sCisJeyAuY2VudGVyX2ZyZXEgPSAyNDMyLCAuaHdfdmFsdWUgPSA1IH0sCisJeyAuY2VudGVyX2ZyZXEgPSAyNDM3LCAuaHdfdmFsdWUgPSA2IH0sCisJeyAuY2VudGVyX2ZyZXEgPSAyNDQyLCAuaHdfdmFsdWUgPSA3IH0sCisJeyAuY2VudGVyX2ZyZXEgPSAyNDQ3LCAuaHdfdmFsdWUgPSA4IH0sCisJeyAuY2VudGVyX2ZyZXEgPSAyNDUyLCAuaHdfdmFsdWUgPSA5IH0sCisJeyAuY2VudGVyX2ZyZXEgPSAyNDU3LCAuaHdfdmFsdWUgPSAxMCB9LAorCXsgLmNlbnRlcl9mcmVxID0gMjQ2MiwgLmh3X3ZhbHVlID0gMTEgfSwKKwl7IC5jZW50ZXJfZnJlcSA9IDI0NjcsIC5od192YWx1ZSA9IDEyIH0sCisJeyAuY2VudGVyX2ZyZXEgPSAyNDcyLCAuaHdfdmFsdWUgPSAxMyB9LAorCXsgLmNlbnRlcl9mcmVxID0gMjQ4NCwgLmh3X3ZhbHVlID0gMTQgfQorfTsKKworc3RhdGljIHN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgYXQ3Nl9zdXBwb3J0ZWRfYmFuZCA9IHsKKwkuY2hhbm5lbHMgPSBhdDc2X2NoYW5uZWxzLAorCS5uX2NoYW5uZWxzID0gQVJSQVlfU0laRShhdDc2X2NoYW5uZWxzKSwKKwkuYml0cmF0ZXMgPSBhdDc2X3JhdGVzLAorCS5uX2JpdHJhdGVzID0gQVJSQVlfU0laRShhdDc2X3JhdGVzKSwKK307CisKIC8qIFJlZ2lzdGVyIG5ldHdvcmsgZGV2aWNlIGFuZCBpbml0aWFsaXplIHRoZSBoYXJkd2FyZSAqLwogc3RhdGljIGludCBhdDc2X2luaXRfbmV3X2RldmljZShzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2LAogCQkJCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2UpCiB7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IHByaXYtPm5ldGRldjsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmaW50ZXJmYWNlLT5kZXY7CiAJaW50IHJldDsKIAogCS8qIHNldCB1cCB0aGUgZW5kcG9pbnQgaW5mb3JtYXRpb24gKi8KQEAgLTUyNjUsMTQgKzI0ODcsMTEgQEAKIAkvKiBNQUMgYWRkcmVzcyAqLwogCXJldCA9IGF0NzZfZ2V0X2h3X2NvbmZpZyhwcml2KTsKIAlpZiAocmV0IDwgMCkgewotCQlkZXZfcHJpbnRrKEtFUk5fRVJSLCAmaW50ZXJmYWNlLT5kZXYsCi0JCQkgICAiY2Fubm90IGdldCBNQUMgYWRkcmVzc1xuIik7CisJCWRldl9lcnIoZGV2LCAiY2Fubm90IGdldCBNQUMgYWRkcmVzc1xuIik7CiAJCWdvdG8gZXhpdDsKIAl9CiAKIAlwcml2LT5kb21haW4gPSBhdDc2X2dldF9yZWdfZG9tYWluKHByaXYtPnJlZ3VsYXRvcnlfZG9tYWluKTsKLQkvKiBpbml0LiBuZXRkZXYtPmRldl9hZGRyICovCi0JbWVtY3B5KG5ldGRldi0+ZGV2X2FkZHIsIHByaXYtPm1hY19hZGRyLCBFVEhfQUxFTik7CiAKIAlwcml2LT5jaGFubmVsID0gREVGX0NIQU5ORUw7CiAJcHJpdi0+aXdfbW9kZSA9IElXX01PREVfSU5GUkE7CkBAIC01MjgyLDQ3ICsyNTAxLDU0IEBACiAJcHJpdi0+dHhyYXRlID0gVFhfUkFURV9BVVRPOwogCXByaXYtPnByZWFtYmxlX3R5cGUgPSBQUkVBTUJMRV9UWVBFX0xPTkc7CiAJcHJpdi0+YmVhY29uX3BlcmlvZCA9IDEwMDsKLQlwcml2LT5iZWFjb25zX2xhc3RfcXVhbCA9IGppZmZpZXM7CiAJcHJpdi0+YXV0aF9tb2RlID0gV0xBTl9BVVRIX09QRU47CiAJcHJpdi0+c2Nhbl9taW5fdGltZSA9IERFRl9TQ0FOX01JTl9USU1FOwogCXByaXYtPnNjYW5fbWF4X3RpbWUgPSBERUZfU0NBTl9NQVhfVElNRTsKIAlwcml2LT5zY2FuX21vZGUgPSBTQ0FOX1RZUEVfQUNUSVZFOworCXByaXYtPmRlZmF1bHRfcGFpcndpc2Vfa2V5ID0gMHhmZjsKKwlwcml2LT5kZWZhdWx0X2dyb3VwX2tleSA9IDB4ZmY7CiAKLQluZXRkZXYtPmZsYWdzICY9IH5JRkZfTVVMVElDQVNUOwkvKiBub3QgeWV0IG9yIG5ldmVyICovCi0JbmV0ZGV2LT5vcGVuID0gYXQ3Nl9vcGVuOwotCW5ldGRldi0+c3RvcCA9IGF0NzZfc3RvcDsKLQluZXRkZXYtPmdldF9zdGF0cyA9IGF0NzZfZ2V0X3N0YXRzOwotCW5ldGRldi0+ZXRodG9vbF9vcHMgPSAmYXQ3Nl9ldGh0b29sX29wczsKKwkvKiBtYWM4MDIxMSBpbml0aWFsaXNhdGlvbiAqLworCXByaXYtPmh3LT53aXBoeS0+YmFuZHNbSUVFRTgwMjExX0JBTkRfMkdIWl0gPSAmYXQ3Nl9zdXBwb3J0ZWRfYmFuZDsKIAotCS8qIEFkZCBwb2ludGVycyB0byBlbmFibGUgaXdzcHkgc3VwcG9ydC4gKi8KLQlwcml2LT53aXJlbGVzc19kYXRhLnNweV9kYXRhID0gJnByaXYtPnNweV9kYXRhOwotCW5ldGRldi0+d2lyZWxlc3NfZGF0YSA9ICZwcml2LT53aXJlbGVzc19kYXRhOworCWlmIChGSVJNV0FSRV9JU19XUEEocHJpdi0+ZndfdmVyc2lvbikgJiYKKwkJKGF0NzZfaXNfNTAzcmZtZChwcml2LT5ib2FyZF90eXBlKSB8fAorCQkgYXQ3Nl9pc181MDUocHJpdi0+Ym9hcmRfdHlwZSkpKQorCQlwcml2LT5ody0+ZmxhZ3MgPSBJRUVFODAyMTFfSFdfU0lHTkFMX1VOU1BFQzsKKwllbHNlCisJCXByaXYtPmh3LT5mbGFncyA9IElFRUU4MDIxMV9IV19SWF9JTkNMVURFU19GQ1MgfAorCQkJCSAgSUVFRTgwMjExX0hXX1NJR05BTF9VTlNQRUM7CiAKLQluZXRkZXYtPmhhcmRfc3RhcnRfeG1pdCA9IGF0NzZfdHg7Ci0JbmV0ZGV2LT50eF90aW1lb3V0ID0gYXQ3Nl90eF90aW1lb3V0OwotCW5ldGRldi0+d2F0Y2hkb2dfdGltZW8gPSAyICogSFo7Ci0JbmV0ZGV2LT53aXJlbGVzc19oYW5kbGVycyA9ICZhdDc2X2hhbmRsZXJfZGVmOwotCW5ldGRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gYXQ3Nl9zZXRfbXVsdGljYXN0OwotCW5ldGRldi0+c2V0X21hY19hZGRyZXNzID0gYXQ3Nl9zZXRfbWFjX2FkZHJlc3M7Ci0JZGV2X2FsbG9jX25hbWUobmV0ZGV2LCAid2xhbiVkIik7CisJcHJpdi0+aHctPndpcGh5LT5pbnRlcmZhY2VfbW9kZXMgPSBCSVQoTkw4MDIxMV9JRlRZUEVfU1RBVElPTik7CiAKLQlyZXQgPSByZWdpc3Rlcl9uZXRkZXYocHJpdi0+bmV0ZGV2KTsKKwlTRVRfSUVFRTgwMjExX0RFVihwcml2LT5odywgJmludGVyZmFjZS0+ZGV2KTsKKwlTRVRfSUVFRTgwMjExX1BFUk1fQUREUihwcml2LT5odywgcHJpdi0+bWFjX2FkZHIpOworCisJcmV0ID0gaWVlZTgwMjExX3JlZ2lzdGVyX2h3KHByaXYtPmh3KTsKIAlpZiAocmV0KSB7Ci0JCWRldl9wcmludGsoS0VSTl9FUlIsICZpbnRlcmZhY2UtPmRldiwKLQkJCSAgICJjYW5ub3QgcmVnaXN0ZXIgbmV0ZGV2aWNlIChzdGF0dXMgJWQpIVxuIiwgcmV0KTsKKwkJZGV2X2VycihkZXYsICJjYW5ub3QgcmVnaXN0ZXIgbWFjODAyMTEgaHcgKHN0YXR1cyAlZCkhXG4iLCByZXQpOwogCQlnb3RvIGV4aXQ7CiAJfQotCXByaXYtPm5ldGRldl9yZWdpc3RlcmVkID0gMTsKIAotCXByaW50ayhLRVJOX0lORk8gIiVzOiBVU0IgJXMsIE1BQyAlcywgZmlybXdhcmUgJWQuJWQuJWQtJWRcbiIsCi0JICAgICAgIG5ldGRldi0+bmFtZSwgaW50ZXJmYWNlLT5kZXYuYnVzX2lkLCBtYWMyc3RyKHByaXYtPm1hY19hZGRyKSwKLQkgICAgICAgcHJpdi0+ZndfdmVyc2lvbi5tYWpvciwgcHJpdi0+ZndfdmVyc2lvbi5taW5vciwKLQkgICAgICAgcHJpdi0+ZndfdmVyc2lvbi5wYXRjaCwgcHJpdi0+ZndfdmVyc2lvbi5idWlsZCk7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHJlZ3VsYXRvcnkgZG9tYWluIDB4JTAyeDogJXNcbiIsIG5ldGRldi0+bmFtZSwKLQkgICAgICAgcHJpdi0+cmVndWxhdG9yeV9kb21haW4sIHByaXYtPmRvbWFpbi0+bmFtZSk7CisJcHJpdi0+bWFjODAyMTFfcmVnaXN0ZXJlZCA9IDE7CiAKLQkvKiB3ZSBsZXQgdGhpcyB0aW1lciBydW4gdGhlIHdob2xlIHRpbWUgdGhpcyBkcml2ZXIgaW5zdGFuY2UgbGl2ZXMgKi8KLQltb2RfdGltZXIoJnByaXYtPmJzc19saXN0X3RpbWVyLCBqaWZmaWVzICsgQlNTX0xJU1RfVElNRU9VVCk7CisJZGV2X2luZm8oZGV2LCAiJXM6IFVTQiAlcywgTUFDICVzLCBmaXJtd2FyZSAlZC4lZC4lZC0lZFxuIiwKKwkJIHdpcGh5X25hbWUocHJpdi0+aHctPndpcGh5KSwKKwkJIGRldl9uYW1lKCZpbnRlcmZhY2UtPmRldiksIG1hYzJzdHIocHJpdi0+bWFjX2FkZHIpLAorCQkgcHJpdi0+ZndfdmVyc2lvbi5tYWpvciwgcHJpdi0+ZndfdmVyc2lvbi5taW5vciwKKwkJIHByaXYtPmZ3X3ZlcnNpb24ucGF0Y2gsIHByaXYtPmZ3X3ZlcnNpb24uYnVpbGQpOworCWRldl9pbmZvKGRldiwgIiVzOiByZWd1bGF0b3J5IGRvbWFpbiAweCUwMng6ICVzXG4iLAorCQkgd2lwaHlfbmFtZShwcml2LT5ody0+d2lwaHkpLAorCQkgcHJpdi0+cmVndWxhdG9yeV9kb21haW4sIHByaXYtPmRvbWFpbi0+bmFtZSk7CisJZGV2X2luZm8oZGV2LCAiJXM6IFdQQSBzdXBwb3J0OiAiLCB3aXBoeV9uYW1lKHByaXYtPmh3LT53aXBoeSkpOworCWlmICghRklSTVdBUkVfSVNfV1BBKHByaXYtPmZ3X3ZlcnNpb24pKQorCQlwcmludGsoIm5vbmVcbiIpOworCWVsc2UgeworCQlpZiAoIWF0NzZfaXNfNTA1YShwcml2LT5ib2FyZF90eXBlKSkKKwkJCXByaW50aygiVEtJUFxuIik7CisJCWVsc2UKKwkJCXByaW50aygiVEtJUCwgQUVTL0NDTVBcbiIpOworCX07CiAKIGV4aXQ6CiAJcmV0dXJuIHJldDsKQEAgLTUzMzAsMTUgKzI1NTYsMTMgQEAKIAogc3RhdGljIHZvaWQgYXQ3Nl9kZWxldGVfZGV2aWNlKHN0cnVjdCBhdDc2X3ByaXYgKnByaXYpCiB7Ci0JaW50IGk7Ci0KIAlhdDc2X2RiZyhEQkdfUFJPQ19FTlRSWSwgIiVzOiBFTlRFUiIsIF9fZnVuY19fKTsKIAogCS8qIFRoZSBkZXZpY2UgaXMgZ29uZSwgZG9uJ3QgYm90aGVyIHR1cm5pbmcgaXQgb2ZmICovCiAJcHJpdi0+ZGV2aWNlX3VucGx1Z2dlZCA9IDE7CiAKLQlpZiAocHJpdi0+bmV0ZGV2X3JlZ2lzdGVyZWQpCi0JCXVucmVnaXN0ZXJfbmV0ZGV2KHByaXYtPm5ldGRldik7CisJaWYgKHByaXYtPm1hYzgwMjExX3JlZ2lzdGVyZWQpCisJCWllZWU4MDIxMV91bnJlZ2lzdGVyX2h3KHByaXYtPmh3KTsKIAogCS8qIGFzc3VtaW5nIHdlIHVzZWQga2V2ZW50ZCwgaXQgbXVzdCBxdWllc2NlIHRvbyAqLwogCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7CkBAIC01MzU5LDI1ICsyNTgzLDExIEBACiAJaWYgKHByaXYtPnJ4X3NrYikKIAkJa2ZyZWVfc2tiKHByaXYtPnJ4X3NrYik7CiAKLQlhdDc2X2ZyZWVfYnNzX2xpc3QocHJpdik7Ci0JZGVsX3RpbWVyX3N5bmMoJnByaXYtPmJzc19saXN0X3RpbWVyKTsKLQljYW5jZWxfZGVsYXllZF93b3JrKCZwcml2LT5kd29ya19nZXRfc2Nhbik7Ci0JY2FuY2VsX2RlbGF5ZWRfd29yaygmcHJpdi0+ZHdvcmtfYmVhY29uKTsKLQljYW5jZWxfZGVsYXllZF93b3JrKCZwcml2LT5kd29ya19hdXRoKTsKLQljYW5jZWxfZGVsYXllZF93b3JrKCZwcml2LT5kd29ya19hc3NvYyk7Ci0KLQlpZiAocHJpdi0+bWFjX3N0YXRlID09IE1BQ19DT05ORUNURUQpCi0JCWF0NzZfaXdldmVudF9ic3NfZGlzY29ubmVjdChwcml2LT5uZXRkZXYpOwotCi0JZm9yIChpID0gMDsgaSA8IE5SX1JYX0RBVEFfQlVGOyBpKyspCi0JCWlmIChwcml2LT5yeF9kYXRhW2ldLnNrYikgewotCQkJZGV2X2tmcmVlX3NrYihwcml2LT5yeF9kYXRhW2ldLnNrYik7Ci0JCQlwcml2LT5yeF9kYXRhW2ldLnNrYiA9IE5VTEw7Ci0JCX0KIAl1c2JfcHV0X2Rldihwcml2LT51ZGV2KTsKIAotCWF0NzZfZGJnKERCR19QUk9DX0VOVFJZLCAiJXM6IGJlZm9yZSBmcmVlaW5nIHByaXYvbmV0ZGV2IiwgX19mdW5jX18pOwotCWZyZWVfbmV0ZGV2KHByaXYtPm5ldGRldik7CS8qIHByaXYgaXMgaW4gbmV0ZGV2ICovCisJYXQ3Nl9kYmcoREJHX1BST0NfRU5UUlksICIlczogYmVmb3JlIGZyZWVpbmcgcHJpdi9pZWVlODAyMTFfaHciLAorCQkgX19mdW5jX18pOworCWllZWU4MDIxMV9mcmVlX2h3KHByaXYtPmh3KTsKIAogCWF0NzZfZGJnKERCR19QUk9DX0VOVFJZLCAiJXM6IEVYSVQiLCBfX2Z1bmNfXyk7CiB9CkBAIC01NDExLDggKzI2MjEsOCBAQAogCSAgIHdlIGdldCAyMDQgd2l0aCAyLjQuMjMsIEZpYmVybGluZSBGTC1XTDI0MHUgKDUwNUErUkZNRDI5NTgpID8/PyAqLwogCiAJaWYgKG9wX21vZGUgPT0gT1BNT0RFX0hXX0NPTkZJR19NT0RFKSB7Ci0JCWRldl9wcmludGsoS0VSTl9FUlIsICZpbnRlcmZhY2UtPmRldiwKLQkJCSAgICJjYW5ub3QgaGFuZGxlIGEgZGV2aWNlIGluIEhXX0NPTkZJR19NT0RFXG4iKTsKKwkJZGV2X2VycigmaW50ZXJmYWNlLT5kZXYsCisJCQkiY2Fubm90IGhhbmRsZSBhIGRldmljZSBpbiBIV19DT05GSUdfTU9ERVxuIik7CiAJCXJldCA9IC1FQlVTWTsKIAkJZ290byBlcnJvcjsKIAl9CkBAIC01NDIwLDEzICsyNjMwLDEyIEBACiAJaWYgKG9wX21vZGUgIT0gT1BNT0RFX05PUk1BTF9OSUNfV0lUSF9GTEFTSAogCSAgICAmJiBvcF9tb2RlICE9IE9QTU9ERV9OT1JNQUxfTklDX1dJVEhPVVRfRkxBU0gpIHsKIAkJLyogZG93bmxvYWQgaW50ZXJuYWwgZmlybXdhcmUgcGFydCAqLwotCQlkZXZfcHJpbnRrKEtFUk5fREVCVUcsICZpbnRlcmZhY2UtPmRldiwKLQkJCSAgICJkb3dubG9hZGluZyBpbnRlcm5hbCBmaXJtd2FyZVxuIik7CisJCWRldl9kYmcoJmludGVyZmFjZS0+ZGV2LCAiZG93bmxvYWRpbmcgaW50ZXJuYWwgZmlybXdhcmVcbiIpOwogCQlyZXQgPSBhdDc2X2xvYWRfaW50ZXJuYWxfZncodWRldiwgZndlKTsKIAkJaWYgKHJldCA8IDApIHsKLQkJCWRldl9wcmludGsoS0VSTl9FUlIsICZpbnRlcmZhY2UtPmRldiwKLQkJCQkgICAiZXJyb3IgJWQgZG93bmxvYWRpbmcgaW50ZXJuYWwgZmlybXdhcmVcbiIsCi0JCQkJICAgcmV0KTsKKwkJCWRldl9lcnIoJmludGVyZmFjZS0+ZGV2LAorCQkJCSJlcnJvciAlZCBkb3dubG9hZGluZyBpbnRlcm5hbCBmaXJtd2FyZVxuIiwKKwkJCQlyZXQpOwogCQkJZ290byBlcnJvcjsKIAkJfQogCQl1c2JfcHV0X2Rldih1ZGV2KTsKQEAgLTU0NTEsOCArMjY2MCw3IEBACiAJCW5lZWRfZXh0X2Z3ID0gMTsKIAogCWlmIChuZWVkX2V4dF9mdykgewotCQlkZXZfcHJpbnRrKEtFUk5fREVCVUcsICZpbnRlcmZhY2UtPmRldiwKLQkJCSAgICJkb3dubG9hZGluZyBleHRlcm5hbCBmaXJtd2FyZVxuIik7CisJCWRldl9kYmcoJmludGVyZmFjZS0+ZGV2LCAiZG93bmxvYWRpbmcgZXh0ZXJuYWwgZmlybXdhcmVcbiIpOwogCiAJCXJldCA9IGF0NzZfbG9hZF9leHRlcm5hbF9mdyh1ZGV2LCBmd2UpOwogCQlpZiAocmV0KQpAQCAtNTQ2MSw4ICsyNjY5LDggQEAKIAkJLyogUmUtY2hlY2sgZmlybXdhcmUgdmVyc2lvbiAqLwogCQlyZXQgPSBhdDc2X2dldF9taWIodWRldiwgTUlCX0ZXX1ZFUlNJT04sICZmd3YsIHNpemVvZihmd3YpKTsKIAkJaWYgKHJldCA8IDApIHsKLQkJCWRldl9wcmludGsoS0VSTl9FUlIsICZpbnRlcmZhY2UtPmRldiwKLQkJCQkgICAiZXJyb3IgJWQgZ2V0dGluZyBmaXJtd2FyZSB2ZXJzaW9uXG4iLCByZXQpOworCQkJZGV2X2VycigmaW50ZXJmYWNlLT5kZXYsCisJCQkJImVycm9yICVkIGdldHRpbmcgZmlybXdhcmUgdmVyc2lvblxuIiwgcmV0KTsKIAkJCWdvdG8gZXJyb3I7CiAJCX0KIAl9CkBAIC01NDczLDcgKzI2ODEsNiBAQAogCQlnb3RvIGVycm9yOwogCX0KIAotCVNFVF9ORVRERVZfREVWKHByaXYtPm5ldGRldiwgJmludGVyZmFjZS0+ZGV2KTsKIAl1c2Jfc2V0X2ludGZkYXRhKGludGVyZmFjZSwgcHJpdik7CiAKIAltZW1jcHkoJnByaXYtPmZ3X3ZlcnNpb24sICZmd3YsIHNpemVvZihzdHJ1Y3QgbWliX2Z3X3ZlcnNpb24pKTsKQEAgLTU1MDEsNyArMjcwOCw3IEBACiAJaWYgKCFwcml2KQogCQlyZXR1cm47CiAKLQlwcmludGsoS0VSTl9JTkZPICIlczogZGlzY29ubmVjdGluZ1xuIiwgcHJpdi0+bmV0ZGV2LT5uYW1lKTsKKwlwcmludGsoS0VSTl9JTkZPICIlczogZGlzY29ubmVjdGluZ1xuIiwgd2lwaHlfbmFtZShwcml2LT5ody0+d2lwaHkpKTsKIAlhdDc2X2RlbGV0ZV9kZXZpY2UocHJpdik7CiAJZGV2X3ByaW50ayhLRVJOX0lORk8sICZpbnRlcmZhY2UtPmRldiwgImRpc2Nvbm5lY3RlZFxuIik7CiB9CkBAIC01NTU3LDUgKzI3NjQsOCBAQAogTU9EVUxFX0FVVEhPUigiTmljayBKb25lcyIpOwogTU9EVUxFX0FVVEhPUigiQmFsaW50IFNlZWJlciA8bjBfNXA0bV9wMTM0NTNAaG90bWFpbC5jb20+Iik7CiBNT0RVTEVfQVVUSE9SKCJQYXZlbCBSb3NraW4gPHByb3NraUBnbnUub3JnPiIpOworTU9EVUxFX0FVVEhPUigiR3VpZG8gR3VlbnRoZXIgPGFneEBzaWd4Y3B1Lm9yZz4iKTsKK01PRFVMRV9BVVRIT1IoIkthbGxlIFZhbG8gPGthbGxlLnZhbG9AaWtpLmZpPiIpOworTU9EVUxFX0FVVEhPUigiTWlsYW4gUGx6aWsgPG1pbGFuLnBsemlrQGdtYWlsLmNvbT4iKTsKIE1PRFVMRV9ERVNDUklQVElPTihEUklWRVJfREVTQyk7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYXQ3Nl91c2IvYXQ3Nl91c2IuaCBiL2RyaXZlcnMvc3RhZ2luZy9hdDc2X3VzYi9hdDc2X3VzYi5oCmluZGV4IGIyMGJlOWQuLjhiYjM1MmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9hdDc2X3VzYi9hdDc2X3VzYi5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9hdDc2X3VzYi9hdDc2X3VzYi5oCkBAIC0zNCwyMyArMzQsNiBAQAogCUJPQVJEXzUwNUFNWCA9IDgKIH07CiAKLS8qIG91ciBwcml2YXRlIGlvY3RsJ3MgKi8KLS8qIHByZWFtYmxlIGxlbmd0aCAoMCAtIGxvbmcsIDEgLSBzaG9ydCwgMiAtIGF1dG8pICovCi0jZGVmaW5lIEFUNzZfU0VUX1NIT1JUX1BSRUFNQkxFCQkoU0lPQ0lXRklSU1RQUklWICsgMCkKLSNkZWZpbmUgQVQ3Nl9HRVRfU0hPUlRfUFJFQU1CTEUJCShTSU9DSVdGSVJTVFBSSVYgKyAxKQotLyogd2hpY2ggZGVidWcgY2hhbm5lbHMgYXJlIGVuYWJsZWQgKi8KLSNkZWZpbmUgQVQ3Nl9TRVRfREVCVUcJCQkoU0lPQ0lXRklSU1RQUklWICsgMikKLSNkZWZpbmUgQVQ3Nl9HRVRfREVCVUcJCQkoU0lPQ0lXRklSU1RQUklWICsgMykKLS8qIHBvd2VyIHNhdmUgbW9kZSAoaW5jbC4gdGhlIEF0bWVsIHByb3ByaWV0YXJ5IHNtYXJ0IHNhdmUgbW9kZSkgKi8KLSNkZWZpbmUgQVQ3Nl9TRVRfUE9XRVJTQVZFX01PREUJCShTSU9DSVdGSVJTVFBSSVYgKyA0KQotI2RlZmluZSBBVDc2X0dFVF9QT1dFUlNBVkVfTU9ERQkJKFNJT0NJV0ZJUlNUUFJJViArIDUpCi0vKiBtaW4gYW5kIG1heCBjaGFubmVsIHRpbWVzIGZvciBzY2FuICovCi0jZGVmaW5lIEFUNzZfU0VUX1NDQU5fVElNRVMJCShTSU9DSVdGSVJTVFBSSVYgKyA2KQotI2RlZmluZSBBVDc2X0dFVF9TQ0FOX1RJTUVTCQkoU0lPQ0lXRklSU1RQUklWICsgNykKLS8qIHNjYW4gbW9kZSAoMCAtIGFjdGl2ZSwgMSAtIHBhc3NpdmUpICovCi0jZGVmaW5lIEFUNzZfU0VUX1NDQU5fTU9ERQkJKFNJT0NJV0ZJUlNUUFJJViArIDgpCi0jZGVmaW5lIEFUNzZfR0VUX1NDQU5fTU9ERQkJKFNJT0NJV0ZJUlNUUFJJViArIDkpCi0KICNkZWZpbmUgQ01EX1NUQVRVU19JRExFCQkJCTB4MDAKICNkZWZpbmUgQ01EX1NUQVRVU19DT01QTEVURQkJCTB4MDEKICNkZWZpbmUgQ01EX1NUQVRVU19VTktOT1dOCQkJMHgwMgpAQCAtODIsNiArNjUsNyBAQAogI2RlZmluZSBNSUJfTUFDCQkJMHgwMwogI2RlZmluZSBNSUJfTUFDX01HTVQJCTB4MDUKICNkZWZpbmUgTUlCX01BQ19XRVAJCTB4MDYKKyNkZWZpbmUgTUlCX01BQ19FTkNSWVBUSU9OCTB4MDYKICNkZWZpbmUgTUlCX1BIWQkJCTB4MDcKICNkZWZpbmUgTUlCX0ZXX1ZFUlNJT04JCTB4MDgKICNkZWZpbmUgTUlCX01ET01BSU4JCTB4MDkKQEAgLTEwNiw2ICs5MCwyNiBAQAogI2RlZmluZSBBVDc2X1BNX09OCQkyCiAjZGVmaW5lIEFUNzZfUE1fU01BUlQJCTMKIAorLyogY2lwaGVyIHZhbHVlcyBmb3IgZW5jcnlwdGlvbiBrZXlzICovCisjZGVmaW5lIENJUEhFUl9OT05FCQkwCS8qIHRoaXMgdmFsdWUgaXMgb25seSBndWVzc2VkICovCisjZGVmaW5lIENJUEhFUl9XRVA2NAkJMQorI2RlZmluZSBDSVBIRVJfVEtJUAkJMgorI2RlZmluZSBDSVBIRVJfQ0NNUAkJMworI2RlZmluZSBDSVBIRVJfQ0NYCQk0CS8qIGZvciBjb25zaXN0ZW5jeSBzYWtlIG9ubHkgKi8KKyNkZWZpbmUgQ0lQSEVSX1dFUDEyOAkJNQorCisvKiBiaXQgZmxhZ3Mga2V5IHR5cGVzIGZvciBlbmNyeXB0aW9uIGtleXMgKi8KKyNkZWZpbmUgS0VZX1BBSVJXSVNFCQkyCisjZGVmaW5lIEtFWV9UWAkJCTQKKworI2RlZmluZSBDSVBIRVJfS0VZUwkJKDQpCisjZGVmaW5lIENJUEhFUl9LRVlfTEVOCQkoNDApCisKK3N0cnVjdCBrZXlfY29uZmlnIHsKKwl1OCBjaXBoZXI7CisJdTgga2V5bGVuOworfTsKKwogc3RydWN0IGh3Y2ZnX3I1MDUgewogCXU4IGNyMzlfdmFsdWVzWzE0XTsKIAl1OCByZXNlcnZlZDFbMTRdOwpAQCAtMTQ3LDYgKzE1MSw5IEBACiAKICNkZWZpbmUgV0VQX1NNQUxMX0tFWV9MRU4JKDQwIC8gOCkKICNkZWZpbmUgV0VQX0xBUkdFX0tFWV9MRU4JKDEwNCAvIDgpCisjZGVmaW5lIFdFUF9LRVlTCQkoNCkKKworCiAKIHN0cnVjdCBhdDc2X2NhcmRfY29uZmlnIHsKIAl1OCBleGNsdWRlX3VuZW5jcnlwdGVkOwpAQCAtMTYxLDcgKzE2OCw3IEBACiAJdTggcHJpdmFjeV9pbnZva2VkOwogCXU4IHdlcF9kZWZhdWx0X2tleV9pZDsJLyogMC4uMyAqLwogCXU4IGN1cnJlbnRfc3NpZFszMl07Ci0JdTggd2VwX2RlZmF1bHRfa2V5X3ZhbHVlWzRdW1dFUF9LRVlfTEVOXTsKKwl1OCB3ZXBfZGVmYXVsdF9rZXlfdmFsdWVbNF1bV0VQX0xBUkdFX0tFWV9MRU5dOwogCXU4IHNzaWRfbGVuOwogCXU4IHNob3J0X3ByZWFtYmxlOwogCV9fbGUxNiBiZWFjb25fcGVyaW9kOwpAQCAtMTg2LDcgKzE5Myw3IEBACiAJdTggbGlua19xdWFsaXR5OwogCXU4IG5vaXNlX2xldmVsOwogCV9fbGUzMiByeF90aW1lOwotCXU4IHBhY2tldFtJRUVFODAyMTFfRlJBTUVfTEVOICsgSUVFRTgwMjExX0ZDU19MRU5dOworCXU4IHBhY2tldFtJRUVFODAyMTFfTUFYX0ZSQUdfVEhSRVNIT0xEXTsKIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKIC8qIExlbmd0aCBvZiBBdG1lbC1zcGVjaWZpYyBUeCBoZWFkZXIgYmVmb3JlIDgwMi4xMSBmcmFtZSAqLwpAQCAtMTk2LDggKzIwMywxMSBAQAogCV9fbGUxNiB3bGVuZ3RoOwogCXU4IHR4X3JhdGU7CiAJdTggcGFkZGluZzsKLQl1OCByZXNlcnZlZFs0XTsKLQl1OCBwYWNrZXRbSUVFRTgwMjExX0ZSQU1FX0xFTiArIElFRUU4MDIxMV9GQ1NfTEVOXTsKKwl1OCBrZXlfaWQ7CisJdTggY2lwaGVyX3R5cGU7CisJdTggY2lwaGVyX2xlbmd0aDsKKwl1OCByZXNlcnZlZDsKKwl1OCBwYWNrZXRbSUVFRTgwMjExX01BWF9GUkFHX1RIUkVTSE9MRF07CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiAvKiBkZWZpbmVzIGZvciBzY2FuX3R5cGUgYmVsb3cgKi8KQEAgLTI0NCw2ICsyNTQsNyBAQAogCQl1OCBieXRlOwogCQlfX2xlMTYgd29yZDsKIAkJdTggYWRkcltFVEhfQUxFTl07CisJCXU4IGRhdGFbMjU2XTsJLyogd2UgbmVlZCBtb3JlIHNwYWNlIGZvciBtaWJfbWFjX2VuY3J5cHRpb24gKi8KIAl9IGRhdGE7CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCkBAIC0zMTcsMTAgKzMyOCwyNCBAQAogCXU4IGV4Y2x1ZGVfdW5lbmNyeXB0ZWQ7CiAJX19sZTMyIHdlcF9pY3ZfZXJyb3JfY291bnQ7CiAJX19sZTMyIHdlcF9leGNsdWRlZF9jb3VudDsKLQl1OCB3ZXBfZGVmYXVsdF9rZXl2YWx1ZVtXRVBfS0VZU11bV0VQX0tFWV9MRU5dOworCXU4IHdlcF9kZWZhdWx0X2tleXZhbHVlW1dFUF9LRVlTXVtXRVBfTEFSR0VfS0VZX0xFTl07CiAJdTggZW5jcnlwdGlvbl9sZXZlbDsJLyogMSBmb3IgNDBiaXQsIDIgZm9yIDEwNGJpdCBlbmNyeXB0aW9uICovCiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCitzdHJ1Y3QgbWliX21hY19lbmNyeXB0aW9uIHsKKwl1OCBjaXBoZXJfZGVmYXVsdF9rZXl2YWx1ZVtDSVBIRVJfS0VZU11bQ0lQSEVSX0tFWV9MRU5dOworCXU4IHRraXBfYnNzaWRbNl07CisJdTggcHJpdmFjeV9pbnZva2VkOworCXU4IGNpcGhlcl9kZWZhdWx0X2tleV9pZDsKKwl1OCBjaXBoZXJfZGVmYXVsdF9ncm91cF9rZXlfaWQ7CisJdTggZXhjbHVkZV91bmVuY3J5cHRlZDsKKwl1OCB3ZXBfZW5jcnlwdGlvbl90eXBlOworCXU4IGNraXBfa2V5X3Blcm11dGF0aW9uOwkvKiBib29sICovCisJX19sZTMyIHdlcF9pY3ZfZXJyb3JfY291bnQ7CisJX19sZTMyIHdlcF9leGNsdWRlZF9jb3VudDsKKwl1OCBrZXlfcnNjW0NJUEhFUl9LRVlTXVs4XTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKIHN0cnVjdCBtaWJfcGh5IHsKIAlfX2xlMzIgZWRfdGhyZXNob2xkOwogCkBAIC0zNjQsMTYgKzM4OSw2IEBACiAJX19sZTMyIGV4dF9md19sZW47CS8qIGV4dGVybmFsIGZpcm13YXJlIGltYWdlIGxlbmd0aCAqLwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAotZW51bSBtYWNfc3RhdGUgewotCU1BQ19JTklULAotCU1BQ19TQ0FOTklORywKLQlNQUNfQVVUSCwKLQlNQUNfQVNTT0MsCi0JTUFDX0pPSU5JTkcsCi0JTUFDX0NPTk5FQ1RFRCwKLQlNQUNfT1dOX0lCU1MKLX07Ci0KIC8qIGEgZGVzY3JpcHRpb24gb2YgYSByZWd1bGF0b3J5IGRvbWFpbiBhbmQgdGhlIGFsbG93ZWQgY2hhbm5lbHMgKi8KIHN0cnVjdCByZWdfZG9tYWluIHsKIAl1MTYgY29kZTsKQEAgLTM4MSw0NyArMzk2LDYgQEAKIAl1MzIgY2hhbm5lbF9tYXA7CS8qIGlmIGJpdCBOIGlzIHNldCwgY2hhbm5lbCAoTisxKSBpcyBhbGxvd2VkICovCiB9OwogCi0vKiBob3cgbG9uZyBkbyB3ZSBrZWVwIGEgKEkpQlNTIGluIHRoZSBic3NfbGlzdCBpbiBqaWZmaWVzCi0gICB0aGlzIHNob3VsZCBiZSBsb25nIGVub3VnaCBmb3IgdGhlIHVzZXIgdG8gcmV0cmlldmUgdGhlIHRhYmxlCi0gICAoYnkgaXdsaXN0ID8pIGFmdGVyIHRoZSBkZXZpY2Ugc3RhcnRlZCwgYmVjYXVzZSBhbGwgZW50cmllcyBmcm9tCi0gICBvdGhlciBjaGFubmVscyB0aGFuIHRoZSBvbmUgdGhlIGRldmljZSBsb2NrcyBvbiBnZXQgcmVtb3ZlZCwgdG9vICovCi0jZGVmaW5lIEJTU19MSVNUX1RJTUVPVVQJKDEyMCAqIEhaKQotLyogc3RydWN0IHRvIHN0b3JlIEJTUyBpbmZvIGZvdW5kIGR1cmluZyBzY2FuICovCi0jZGVmaW5lIEJTU19MSVNUX01BWF9SQVRFX0xFTgkzMgkvKiAzMiByYXRlcyBzaG91bGQgYmUgZW5vdWdoIC4uLiAqLwotCi1zdHJ1Y3QgYnNzX2luZm8gewotCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKLQotCXU4IGJzc2lkW0VUSF9BTEVOXTsJLyogYnNzaWQgKi8KLQl1OCBzc2lkW0lXX0VTU0lEX01BWF9TSVpFXTsJLyogZXNzaWQgKi8KLQl1OCBzc2lkX2xlbjsJCS8qIGxlbmd0aCBvZiBzc2lkIGFib3ZlICovCi0JdTggY2hhbm5lbDsKLQl1MTYgY2FwYTsJCS8qIEJTUyBjYXBhYmlsaXRpZXMgKi8KLQl1MTYgYmVhY29uX2ludGVydmFsOwkvKiBiZWFjb24gaW50ZXJ2YWwsIEt1cyAoMTAyNCBtaWNyb3NlY29uZHMpICovCi0JdTggcmF0ZXNbQlNTX0xJU1RfTUFYX1JBVEVfTEVOXTsJLyogc3VwcG9ydGVkIHJhdGVzIGluIHVuaXRzIG9mCi0JCQkJCQkgICA1MDAga2JwcywgT1JlZCB3aXRoIDB4ODAgZm9yCi0JCQkJCQkgICBiYXNpYyByYXRlcyAqLwotCXU4IHJhdGVzX2xlbjsKLQotCS8qIHF1YWxpdHkgb2YgcmVjZWl2ZWQgYmVhY29uICovCi0JdTggcnNzaTsKLQl1OCBsaW5rX3F1YWw7Ci0JdTggbm9pc2VfbGV2ZWw7Ci0KLQl1bnNpZ25lZCBsb25nIGxhc3Rfcng7CS8qIHRpbWUgKGppZmZpZXMpIG9mIGxhc3QgYmVhY29uIHJlY2VpdmVkICovCi19OwotCi0vKiBhIHJ4IGRhdGEgYnVmZmVyIHRvIGNvbGxlY3QgcnggZnJhZ21lbnRzICovCi1zdHJ1Y3QgcnhfZGF0YV9idWYgewotCXU4IHNlbmRlcltFVEhfQUxFTl07CS8qIHNlbmRlciBhZGRyZXNzICovCi0JdTE2IHNlcW5yOwkJLyogc2VxdWVuY2UgbnVtYmVyICovCi0JdTE2IGZyYWducjsJCS8qIGxhc3QgZnJhZ21lbnQgcmVjZWl2ZWQgKi8KLQl1bnNpZ25lZCBsb25nIGxhc3Rfcng7CS8qIGppZmZpZXMgb2YgbGFzdCByeCAqLwotCXN0cnVjdCBza19idWZmICpza2I7CS8qID09IE5VTEwgaWYgZW50cnkgaXMgZnJlZSAqLwotfTsKLQotI2RlZmluZSBOUl9SWF9EQVRBX0JVRgkJOAotCiAvKiBEYXRhIGZvciBvbmUgbG9hZGVkIGZpcm13YXJlIGZpbGUgKi8KIHN0cnVjdCBmd2VudHJ5IHsKIAljb25zdCBjaGFyICpjb25zdCBmd25hbWU7CkBAIC00MzgsMTEgKzQxMiw5IEBACiAKIHN0cnVjdCBhdDc2X3ByaXYgewogCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2OwkvKiBVU0IgZGV2aWNlIHBvaW50ZXIgKi8KLQlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2OwkvKiBuZXQgZGV2aWNlIHBvaW50ZXIgKi8KLQlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsJLyogbmV0IGRldmljZSBzdGF0cyAqLwotCXN0cnVjdCBpd19zdGF0aXN0aWNzIHdzdGF0czsJLyogd2lyZWxlc3Mgc3RhdHMgKi8KIAogCXN0cnVjdCBza19idWZmICpyeF9za2I7CS8qIHNrYnVmZiBmb3IgcmVjZWl2aW5nIGRhdGEgKi8KKwlzdHJ1Y3Qgc2tfYnVmZiAqdHhfc2tiOwkvKiBza2J1ZmYgZm9yIHRyYW5zbWl0dGluZyBkYXRhICovCiAJdm9pZCAqYnVsa19vdXRfYnVmZmVyOwkvKiBidWZmZXIgZm9yIHNlbmRpbmcgZGF0YSAqLwogCiAJc3RydWN0IHVyYiAqdHhfdXJiOwkvKiBVUkIgZm9yIHNlbmRpbmcgZGF0YSAqLwpAQCAtNDU0LDI2ICs0MjYsMTcgQEAKIAlzdHJ1Y3QgbXV0ZXggbXR4OwkvKiBsb2NrcyB0aGlzIHN0cnVjdHVyZSAqLwogCiAJLyogd29yayBxdWV1ZXMgKi8KLQlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd29ya19hc3NvY19kb25lOwotCXN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrX2pvaW47Ci0Jc3RydWN0IHdvcmtfc3RydWN0IHdvcmtfbmV3X2JzczsKLQlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd29ya19zdGFydF9zY2FuOwogCXN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrX3NldF9wcm9taXNjOwogCXN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrX3N1Ym1pdF9yeDsKLQlzdHJ1Y3QgZGVsYXllZF93b3JrIGR3b3JrX3Jlc3RhcnQ7Ci0Jc3RydWN0IGRlbGF5ZWRfd29yayBkd29ya19nZXRfc2NhbjsKLQlzdHJ1Y3QgZGVsYXllZF93b3JrIGR3b3JrX2JlYWNvbjsKLQlzdHJ1Y3QgZGVsYXllZF93b3JrIGR3b3JrX2F1dGg7Ci0Jc3RydWN0IGRlbGF5ZWRfd29yayBkd29ya19hc3NvYzsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrIGR3b3JrX2h3X3NjYW47CiAKIAlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgcnhfdGFza2xldDsKIAogCS8qIHRoZSBXRVAgc3R1ZmYgKi8KIAlpbnQgd2VwX2VuYWJsZWQ7CS8qIDEgaWYgV0VQIGlzIGVuYWJsZWQgKi8KIAlpbnQgd2VwX2tleV9pZDsJCS8qIGtleSBpZCB0byBiZSB1c2VkICovCi0JdTggd2VwX2tleXNbV0VQX0tFWVNdW1dFUF9LRVlfTEVOXTsJLyogdGhlIGZvdXIgV0VQIGtleXMsCi0JCQkJCQkgICA1IG9yIDEzIGJ5dGVzIGFyZSB1c2VkICovCi0JdTggd2VwX2tleXNfbGVuW1dFUF9LRVlTXTsJLyogdGhlIGxlbmd0aCBvZiB0aGUgYWJvdmUga2V5cyAqLworCXU4IHdlcF9rZXlzW1dFUF9LRVlTXVtXRVBfTEFSR0VfS0VZX0xFTl07CS8qIFdFUCBrZXlzICovCisJdTggd2VwX2tleXNfbGVuW1dFUF9LRVlTXTsJLyogbGVuZ3RoIG9mIFdFUCBrZXlzICovCiAKIAlpbnQgY2hhbm5lbDsKIAlpbnQgaXdfbW9kZTsKQEAgLTQ5NSw0NCArNDU4LDEzIEBACiAJaW50IHNjYW5fbW9kZTsJCS8qIFNDQU5fVFlQRV9BQ1RJVkUsIFNDQU5fVFlQRV9QQVNTSVZFICovCiAJaW50IHNjYW5fbmVlZF9hbnk7CS8qIGlmIHNldCwgbmVlZCB0byBzY2FuIGZvciBhbnkgRVNTSUQgKi8KIAotCS8qIHRoZSBsaXN0IHdlIGdvdCBmcm9tIHNjYW5uaW5nICovCi0Jc3BpbmxvY2tfdCBic3NfbGlzdF9zcGlubG9jazsJLyogcHJvdGVjdHMgYnNzX2xpc3Qgb3BlcmF0aW9ucyAqLwotCXN0cnVjdCBsaXN0X2hlYWQgYnNzX2xpc3Q7CS8qIGxpc3Qgb2YgQlNTIHdlIGdvdCBiZWFjb25zIGZyb20gKi8KLQlzdHJ1Y3QgdGltZXJfbGlzdCBic3NfbGlzdF90aW1lcjsJLyogdGltZXIgdG8gcHVyZ2Ugb2xkIGVudHJpZXMKLQkJCQkJCSAgIGZyb20gYnNzX2xpc3QgKi8KLQlzdHJ1Y3QgYnNzX2luZm8gKmN1cnJfYnNzOwkvKiBjdXJyZW50IEJTUyAqLwogCXUxNiBhc3NvY19pZDsJCS8qIGN1cnJlbnQgYXNzb2NpYXRpb24gSUQsIGlmIGFzc29jaWF0ZWQgKi8KIAotCXU4IHdhbnRlZF9ic3NpZFtFVEhfQUxFTl07Ci0JaW50IHdhbnRlZF9ic3NpZF92YWxpZDsJLyogIT0gMCBpZiB3YW50ZWRfYnNzaWQgaXMgdG8gYmUgdXNlZCAqLwotCi0JLyogc29tZSBkYXRhIGZvciBpbmZyYXN0cnVjdHVyZSBtb2RlIG9ubHkgKi8KLQlzcGlubG9ja190IG1nbXRfc3BpbmxvY2s7CS8qIHRoaXMgc3BpbmxvY2sgcHJvdGVjdHMgYWNjZXNzIHRvCi0JCQkJCSAgIG5leHRfbWdtdF9idWxrICovCi0KLQlzdHJ1Y3QgYXQ3Nl90eF9idWZmZXIgKm5leHRfbWdtdF9idWxrOwkvKiBwZW5kaW5nIG1hbmFnZW1lbnQgbXNnIHRvCi0JCQkJCQkgICBzZW5kIHZpYSBidWxrIG91dCAqLwotCWVudW0gbWFjX3N0YXRlIG1hY19zdGF0ZTsKLQllbnVtIHsKLQkJU0NBTl9JRExFLAotCQlTQ0FOX0lOX1BST0dSRVNTLAotCQlTQ0FOX0NPTVBMRVRFRAotCX0gc2Nhbl9zdGF0ZTsKLQl0aW1lX3QgbGFzdF9zY2FuOwotCi0JaW50IHJldHJpZXM7CQkvKiByZW1haW5pbmcgcmV0cmllcyBpbiBjYXNlIG9mIHRpbWVvdXQgd2hlbgotCQkJCSAqIHNlbmRpbmcgQXV0aFJlcSBvciBBc3NvY1JlcSAqLwogCXU4IHBtX21vZGU7CQkvKiBwb3dlciBtYW5hZ2VtZW50IG1vZGUgKi8KIAl1MzIgcG1fcGVyaW9kOwkJLyogcG93ZXIgbWFuYWdlbWVudCBwZXJpb2QgaW4gbWljcm9zZWNvbmRzICovCiAKIAlzdHJ1Y3QgcmVnX2RvbWFpbiBjb25zdCAqZG9tYWluOwkvKiByZWcgZG9tYWluIGRlc2NyaXB0aW9uICovCiAKLQkvKiBpd3NweSBzdXBwb3J0ICovCi0Jc3BpbmxvY2tfdCBzcHlfc3BpbmxvY2s7Ci0Jc3RydWN0IGl3X3NweV9kYXRhIHNweV9kYXRhOwotCi0Jc3RydWN0IGl3X3B1YmxpY19kYXRhIHdpcmVsZXNzX2RhdGE7Ci0KIAkvKiBUaGVzZSBmaWVsZHMgY29udGFpbiBIVyBjb25maWcgcHJvdmlkZWQgYnkgdGhlIGRldmljZSAobm90IGFsbCBvZgogCSAqIHRoZXNlIGZpZWxkcyBhcmUgdXNlZCBieSBhbGwgYm9hcmQgdHlwZXMpICovCiAJdTggbWFjX2FkZHJbRVRIX0FMRU5dOwpAQCAtNTQwLDkgKzQ3Miw2IEBACiAKIAlzdHJ1Y3QgYXQ3Nl9jYXJkX2NvbmZpZyBjYXJkX2NvbmZpZzsKIAotCS8qIHN0b3JlIHJ4IGZyYWdtZW50cyB1bnRpbCBjb21wbGV0ZSAqLwotCXN0cnVjdCByeF9kYXRhX2J1ZiByeF9kYXRhW05SX1JYX0RBVEFfQlVGXTsKLQogCWVudW0gYm9hcmRfdHlwZSBib2FyZF90eXBlOwogCXN0cnVjdCBtaWJfZndfdmVyc2lvbiBmd192ZXJzaW9uOwogCkBAIC01NTAsNTggKzQ3OSwyMCBAQAogCXVuc2lnbmVkIGludCBuZXRkZXZfcmVnaXN0ZXJlZDoxOwogCXN0cnVjdCBzZXRfbWliX2J1ZmZlciBtaWJfYnVmOwkvKiBnbG9iYWwgYnVmZmVyIGZvciBzZXRfbWliIGNhbGxzICovCiAKLQkvKiBiZWFjb24gY291bnRpbmcgKi8KIAlpbnQgYmVhY29uX3BlcmlvZDsJLyogcGVyaW9kIG9mIG1nbXQgYmVhY29ucywgS3VzICovCi0JaW50IGJlYWNvbnNfcmVjZWl2ZWQ7Ci0JdW5zaWduZWQgbG9uZyBiZWFjb25zX2xhc3RfcXVhbDsJLyogdGltZSB3ZSByZXN0YXJ0ZWQgY291bnRpbmcKLQkJCQkJCSAgIGJlYWNvbnMgKi8KKworCXN0cnVjdCBpZWVlODAyMTFfaHcgKmh3OworCWludCBtYWM4MDIxMV9yZWdpc3RlcmVkOworCisJc3RydWN0IGtleV9jb25maWcga2V5c1s0XTsJLyogaW5zdGFsbGVkIGtleSB0eXBlcyAqLworCXU4IGRlZmF1bHRfcGFpcndpc2Vfa2V5OworCXU4IGRlZmF1bHRfZ3JvdXBfa2V5OwogfTsKIAotc3RydWN0IGF0NzZfcnhfcmFkaW90YXAgewotCXN0cnVjdCBpZWVlODAyMTFfcmFkaW90YXBfaGVhZGVyIHJ0X2hkcjsKLQlfX2xlNjQgcnRfdHNmdDsKLQl1OCBydF9mbGFnczsKLQl1OCBydF9yYXRlOwotCXM4IHJ0X3NpZ25hbDsKLQlzOCBydF9ub2lzZTsKLX07CisjZGVmaW5lIEFUNzZfU1VQUE9SVEVEX0ZJTFRFUlMgRklGX1BST01JU0NfSU5fQlNTCiAKLSNkZWZpbmUgQVQ3Nl9SWF9SQURJT1RBUF9QUkVTRU5UCQkgIFwKLQkoKDEgPDwgSUVFRTgwMjExX1JBRElPVEFQX1RTRlQpCQl8IFwKLQkoMSA8PCBJRUVFODAyMTFfUkFESU9UQVBfRkxBR1MpCQl8IFwKLQkoMSA8PCBJRUVFODAyMTFfUkFESU9UQVBfUkFURSkJCXwgXAotCSgxIDw8IElFRUU4MDIxMV9SQURJT1RBUF9EQl9BTlRTSUdOQUwpCXwgXAotCSgxIDw8IElFRUU4MDIxMV9SQURJT1RBUF9EQl9BTlROT0lTRSkpCi0KLSNkZWZpbmUgQkVBQ09OX01BWF9EQVRBX0xFTkdUSAkxNTAwCi0KLS8qIHRoZSBtYXhpbXVtIHNpemUgb2YgYW4gQXNzb2NSZXEgcGFja2V0ICovCi0jZGVmaW5lIEFTU09DUkVRX01BWF9TSVpFIFwKLSAgKEFUNzZfVFhfSERSTEVOICsgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfYXNzb2NfcmVxdWVzdCkgKyBcCi0gICAxICsgMSArIElXX0VTU0lEX01BWF9TSVpFICsgMSArIDEgKyA0KQotCi0vKiBmb3Igc2hhcmVkIHNlY3JldCBhdXRoLCBhZGQgdGhlIGNoYWxsZW5nZSB0ZXh0IHNpemUgKi8KLSNkZWZpbmUgQVVUSF9GUkFNRV9TSVpFIChBVDc2X1RYX0hEUkxFTiArIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2F1dGgpKQotCi0vKiBNYXhpbWFsIG51bWJlciBvZiBBdXRoUmVxIHJldHJpZXMgKi8KLSNkZWZpbmUgQVVUSF9SRVRSSUVTCQkzCi0KLS8qIE1heGltYWwgbnVtYmVyIG9mIEFzc29jUmVxIHJldHJpZXMgKi8KLSNkZWZpbmUgQVNTT0NfUkVUUklFUwkJMwotCi0vKiBCZWFjb24gdGltZW91dCBpbiBtYW5hZ2VkIG1vZGUgd2hlbiB3ZSBhcmUgY29ubmVjdGVkICovCi0jZGVmaW5lIEJFQUNPTl9USU1FT1VUCQkoMTAgKiBIWikKLQotLyogVGltZW91dCBmb3IgYXV0aGVudGljYXRpb24gcmVzcG9uc2UgKi8KLSNkZWZpbmUgQVVUSF9USU1FT1VUCQkoMSAqIEhaKQotCi0vKiBUaW1lb3V0IGZvciBhc3NvY2lhdGlvbiByZXNwb25zZSAqLwotI2RlZmluZSBBU1NPQ19USU1FT1VUCQkoMSAqIEhaKQotCi0vKiBQb2xsaW5nIGludGVydmFsIHdoZW4gc2NhbiBpcyBydW5uaW5nICovCiAjZGVmaW5lIFNDQU5fUE9MTF9JTlRFUlZBTAkoSFogLyA0KQogCi0vKiBDb21tYW5kIGNvbXBsZXRpb24gdGltZW91dCAqLwogI2RlZmluZSBDTURfQ09NUExFVElPTl9USU1FT1VUCSg1ICogSFopCiAKICNkZWZpbmUgREVGX1JUU19USFJFU0hPTEQJMTUzNgpAQCAtNjExLDggKzUwMiw2IEBACiAjZGVmaW5lIERFRl9TQ0FOX01JTl9USU1FCTEwCiAjZGVmaW5lIERFRl9TQ0FOX01BWF9USU1FCTEyMAogCi0jZGVmaW5lIE1BWF9SVFNfVEhSRVNIT0xECShNQVhfRlJBR19USFJFU0hPTEQgKyAxKQotCiAvKiB0aGUgbWF4IHBhZGRpbmcgc2l6ZSBmb3IgdHggaW4gYnl0ZXMgKHNlZSBjYWxjX3BhZGRpbmcpICovCiAjZGVmaW5lIE1BWF9QQURESU5HX1NJWkUJNTMKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JlbmV0L0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjgwNjA3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JlbmV0L0tjb25maWcKQEAgLTAsMCArMSw3IEBACitjb25maWcgQkVORVQKKwl0cmlzdGF0ZSAiU2VydmVyRW5naW5lcyAxMEdiIE5JQyAtIEJsYWRlRW5naW5lIgorCWRlcGVuZHMgb24gUENJICYmIElORVQKKwlzZWxlY3QgSU5FVF9MUk8KKwloZWxwCisJICBUaGlzIGRyaXZlciBpbXBsZW1lbnRzIHRoZSBOSUMgZnVuY3Rpb25hbGl0eSBmb3IgU2VydmVyRW5naW5lcworCSAgMTBHYiBuZXR3b3JrIGFkYXB0ZXIgQmxhZGVFbmdpbmUgKEVDIDMyMTApLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JlbmV0L01BSU5UQUlORVJTIGIvZHJpdmVycy9zdGFnaW5nL2JlbmV0L01BSU5UQUlORVJTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1Y2UzNDAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvTUFJTlRBSU5FUlMKQEAgLTAsMCArMSw2IEBACitTRVJWRVIgRU5HSU5FUyAxMEdiZSBOSUMgLSBCTEFERS1FTkdJTkUKK1A6CVN1YmJ1IFNlZXRoYXJhbWFuCitNOglzdWJidXNAc2VydmVyZW5naW5lcy5jb20KK0w6CW5ldGRldkB2Z2VyLmtlcm5lbC5vcmcKK1c6CWh0dHA6Ly93d3cuc2VydmVyZW5naW5lcy5jb20KK1M6CVN1cHBvcnRlZApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JlbmV0L01ha2VmaWxlIGIvZHJpdmVycy9zdGFnaW5nL2JlbmV0L01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2MGI5MjMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvTWFrZWZpbGUKQEAgLTAsMCArMSwxNCBAQAorIworIyBNYWtlZmlsZSB0byBidWlsZCB0aGUgbmV0d29yayBkcml2ZXIgZm9yIFNlcnZlckVuZ2luZSdzIEJsYWRlRW5naW5lCisjCitvYmotJChDT05GSUdfQkVORVQpICs9IGJlbmV0Lm8KKworYmVuZXQteSA6PSAgYmVfaW5pdC5vIFwKKwkJCWJlX2ludC5vIFwKKwkJCWJlX25ldGlmLm8gXAorCQkJYmVfZXRodG9vbC5vIFwKKwkJCWZ1bmNvYmoubyBcCisJCQljcS5vIFwKKwkJCWVxLm8gXAorCQkJbXB1Lm8gXAorCQkJZXRoLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9UT0RPIGIvZHJpdmVycy9zdGFnaW5nL2JlbmV0L1RPRE8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTUxZGZiNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9UT0RPCkBAIC0wLDAgKzEsNiBAQAorVE9ETzoKKwktIHJlbW92ZSB3cmFwcGVycyBhcm91bmQgY29tbW9uIGlvd3JpdGUgZnVuY3Rpb25zCisJLSBmdWxsIG5ldGRldiBhdWRpdCBvZiBjb21tb24gcHJvYmxlbXMvaXNzdWVzCisKK1BsZWFzZSBzZW5kIGFsbCBwYXRjaGVzIGFuZCBxdWVzdGlvbnMgdG8gU3ViYnUgU2VldGhhcmFtYW4KKzxzdWJidXNAc2VydmVyZW5naW5lcy5jb20+IGFuZCBHcmVnIEtyb2FoLUhhcnRtYW4gPGdyZWdAa3JvYWguY29tPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JlbmV0L2FzeW5jbWVzZy5oIGIvZHJpdmVycy9zdGFnaW5nL2JlbmV0L2FzeW5jbWVzZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxZTc3OWEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvYXN5bmNtZXNnLmgKQEAgLTAsMCArMSw4MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNSAtIDIwMDggU2VydmVyRW5naW5lcworICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgVGhlIGZ1bGwgR05VIEdlbmVyYWwKKyAqIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZSBmaWxlIGNhbGxlZCBDT1BZSU5HLgorICoKKyAqIENvbnRhY3QgSW5mb3JtYXRpb246CisgKiBsaW51eC1kcml2ZXJzQHNlcnZlcmVuZ2luZXMuY29tCisgKgorICogU2VydmVyRW5naW5lcworICogMjA5IE4uIEZhaXIgT2FrcyBBdmUKKyAqIFN1bm55dmFsZSwgQ0EgOTQwODUKKyAqLworLyoKKyAqIEF1dG9nZW5lcmF0ZWQgYnkgc3JjZ2VuIHZlcnNpb246IDAxMjcKKyAqLworI2lmbmRlZiBfX2FzeW5jbWVzZ19hbWFwX2hfXworI2RlZmluZSBfX2FzeW5jbWVzZ19hbWFwX2hfXworI2luY2x1ZGUgImZ3Y21kX2NvbW1vbi5oIgorCisvKiAtLS0gQVNZTkNfRVZFTlRfQ09ERVMgLS0tICovCisjZGVmaW5lIEFTWU5DX0VWRU5UX0NPREVfTElOS19TVEFURSAgICAgKDEpCisjZGVmaW5lIEFTWU5DX0VWRU5UX0NPREVfSVNDU0kgICAgICAgICAgKDIpCisKKy8qIC0tLSBBU1lOQ19MSU5LX1NUQVRFUyAtLS0gKi8KKyNkZWZpbmUgQVNZTkNfRVZFTlRfTElOS19ET1dOICAgICAgICAgICAoMCkJLyogTGluayBEb3duIG9uIGEgcG9ydCAqLworI2RlZmluZSBBU1lOQ19FVkVOVF9MSU5LX1VQICAgICAgICAgICAgICgxKQkvKiBMaW5rIFVwIG9uIGEgcG9ydCAqLworCisvKgorICogVGhlIGxhc3QgNCBieXRlcyBvZiB0aGUgYXN5bmMgZXZlbnRzIGhhdmUgdGhpcyBjb21tb24gZm9ybWF0LiAgSXQgYWxsb3dzCisgKiB0aGUgZHJpdmVyIHRvIGRpc3Rpbmd1aXNoIFtsaW5rXU1DQ19DUV9FTlRSWVsvbGlua10gc3RydWN0cyBmcm9tCisgKiBhc3luY2hyb25vdXMgZXZlbnRzLiAgQm90aCBhcnJpdmUgb24gdGhlIHNhbWUgY29tcGxldGlvbiBxdWV1ZS4gIFRoaXMKKyAqIHN0cnVjdHVyZSBhbHNvIGNvbnRhaW5zIHRoZSBjb21tb24gZmllbGRzIHVzZWQgdG8gZGVjb2RlIHRoZSBhc3luYyBldmVudC4KKyAqLworc3RydWN0IEJFX0FTWU5DX0VWRU5UX1RSQUlMRVJfQU1BUCB7CisJdTggcnN2ZDBbOF07CS8qIERXT1JEIDAgKi8KKwl1OCBldmVudF9jb2RlWzhdOwkvKiBEV09SRCAwICovCisJdTggZXZlbnRfdHlwZVs4XTsJLyogRFdPUkQgMCAqLworCXU4IHJzdmQxWzZdOwkvKiBEV09SRCAwICovCisJdTggYXN5bmNfZXZlbnQ7CS8qIERXT1JEIDAgKi8KKwl1OCB2YWxpZDsJCS8qIERXT1JEIDAgKi8KK30gX19wYWNrZWQ7CitzdHJ1Y3QgQVNZTkNfRVZFTlRfVFJBSUxFUl9BTUFQIHsKKwl1MzIgZHdbMV07Cit9OworCisvKgorICogQXBwbGljYWJsZSBpbiBJbml0aWF0b3IsIFRhcmdldCBhbmQgTklDIG1vZGVzLgorICogQSBsaW5rIHN0YXRlIGFzeW5jIGV2ZW50IGlzIHNlZW4gYnkgYWxsIGRldmljZSBkcml2ZXJzIGFzIHNvb24gdGhleQorICogY3JlYXRlIGFuIE1DQyByaW5nLiBUaGVyZWFmdGVyLCBhbnl0aW1lIHRoZSBsaW5rIHN0YXR1cyBjaGFuZ2VzIHRoZQorICogZHJpdmVycyB3aWxsIHJlY2VpdmUgYSBsaW5rIHN0YXRlIGFzeW5jIGV2ZW50LiBOb3RpZmljYXRpb25zIGNvbnRpbnVlIHRvCisgKiBiZSBzZW50IHVudGlsIGEgZHJpdmVyIGRlc3Ryb3lzIGl0cyBNQ0MgcmluZy4gQSBsaW5rIGRvd24gZXZlbnQgaXMKKyAqIHJlcG9ydGVkIHdoZW4gZWl0aGVyIHBvcnQgbG9zZXMgbGluay4gQSBsaW5rIHVwIGV2ZW50IGlzIHJlcG9ydGVkCisgKiB3aGVuIGVpdGhlciBwb3J0IHJlZ2FpbnMgbGluay4gV2hlbiBCRSdzIGZhaWxvdmVyIG1lY2hhbmlzbSBpcyBlbmFibGVkLCBhCisgKiBsaW5rIGRvd24gb24gdGhlIGFjdGl2ZSBwb3J0IGNhdXNlcyB0cmFmZmljIHRvIGJlIGRpdmVydGVkIHRvIHRoZSBzdGFuZGJ5CisgKiBwb3J0IGJ5IHRoZSBCRSdzIEFSTSBmaXJtd2FyZSAoYXNzdW1pbmcgdGhlIHN0YW5kYnkgcG9ydCBoYXMgbGluaykuIEluCisgKiB0aGlzIGNhc2UsIHRoZSBzdGFuZHkgcG9ydCBhc3N1bWVzIHRoZSBhY3RpdmUgc3RhdHVzLiBOb3RlOiB3aGVuIGxpbmsgaXMKKyAqIHJlc3RvcmVkIG9uIHRoZSBmYWlsZWQgcG9ydCwgdHJhZmZpYyBjb250aW51ZXMgb24gdGhlIGN1cnJlbnRseSBhY3RpdmUKKyAqIHBvcnQuIFRoZSBBUk0gZmlybXdhcmUgZG9lcyBub3QgYXR0ZW1wdCB0byAnZmFpbCBiYWNrJyB0cmFmZmljIHRvCisgKiB0aGUgcmVzdG9yZWQgcG9ydC4KKyAqLworc3RydWN0IEJFX0FTWU5DX0VWRU5UX0xJTktfU1RBVEVfQU1BUCB7CisJdTggcG9ydDBfbGlua19zdGF0dXNbOF07CisJdTggcG9ydDFfbGlua19zdGF0dXNbOF07CisJdTggYWN0aXZlX3BvcnRbOF07CisJdTggcnN2ZDBbOF07CS8qIERXT1JEIDAgKi8KKwl1OCBwb3J0MF9kdXBsZXhbOF07CisJdTggcG9ydDBfc3BlZWRbOF07CisJdTggcG9ydDFfZHVwbGV4WzhdOworCXU4IHBvcnQxX3NwZWVkWzhdOworCXU4IHBvcnQwX2ZhdWx0WzhdOworCXU4IHBvcnQxX2ZhdWx0WzhdOworCXU4IHJzdmQxWzJdWzhdOwkvKiBEV09SRCAyICovCisJc3RydWN0IEJFX0FTWU5DX0VWRU5UX1RSQUlMRVJfQU1BUCB0cmFpbGVyOworfSBfX3BhY2tlZDsKK3N0cnVjdCBBU1lOQ19FVkVOVF9MSU5LX1NUQVRFX0FNQVAgeworCXUzMiBkd1s0XTsKK307CisjZW5kaWYgLyogX19hc3luY21lc2dfYW1hcF9oX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9iZV9jbS5oIGIvZHJpdmVycy9zdGFnaW5nL2JlbmV0L2JlX2NtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjdhMWRmZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9iZV9jbS5oCkBAIC0wLDAgKzEsMTM0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA1IC0gMjAwOCBTZXJ2ZXJFbmdpbmVzCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBUaGUgZnVsbCBHTlUgR2VuZXJhbAorICogUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlIGZpbGUgY2FsbGVkIENPUFlJTkcuCisgKgorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqIGxpbnV4LWRyaXZlcnNAc2VydmVyZW5naW5lcy5jb20KKyAqCisgKiBTZXJ2ZXJFbmdpbmVzCisgKiAyMDkgTi4gRmFpciBPYWtzIEF2ZQorICogU3Vubnl2YWxlLCBDQSA5NDA4NQorICovCisvKgorICogQXV0b2dlbmVyYXRlZCBieSBzcmNnZW4gdmVyc2lvbjogMDEyNworICovCisjaWZuZGVmIF9fYmVfY21fYW1hcF9oX18KKyNkZWZpbmUgX19iZV9jbV9hbWFwX2hfXworI2luY2x1ZGUgImJlX2NvbW1vbi5oIgorI2luY2x1ZGUgImV0eF9jb250ZXh0LmgiCisjaW5jbHVkZSAibXB1X2NvbnRleHQuaCIKKworLyoKKyAqIC0tLSBDRVZfV0FURVJNQVJLX0VOVU0gLS0tCisgKiBDUS9FUSBXYXRlcm1hcmsgRW5jb2RpbmdzLiBFbmNvZGVkIGFzIG51bWJlciBvZiBmcmVlIGVudHJpZXMgaW4KKyAqIFF1ZXVlIHdoZW4gV2F0ZXJtYXJrIGlzIHJlYWNoZWQuCisgKi8KKyNkZWZpbmUgQ0VWX1dNQVJLXzAgICAgICAgICgwKQkvKiBXYXRlcm1hcmsgd2hlbiBRdWV1ZSBmdWxsICovCisjZGVmaW5lIENFVl9XTUFSS18xNiAgICAgICAoMSkJLyogV2F0ZXJtYXJrIGF0IDE2IGZyZWUgZW50cmllcyAqLworI2RlZmluZSBDRVZfV01BUktfMzIgICAgICAgKDIpCS8qIFdhdGVybWFyayBhdCAzMiBmcmVlIGVudHJpZXMgKi8KKyNkZWZpbmUgQ0VWX1dNQVJLXzQ4ICAgICAgICgzKQkvKiBXYXRlcm1hcmsgYXQgNDggZnJlZSBlbnRyaWVzICovCisjZGVmaW5lIENFVl9XTUFSS182NCAgICAgICAoNCkJLyogV2F0ZXJtYXJrIGF0IDY0IGZyZWUgZW50cmllcyAqLworI2RlZmluZSBDRVZfV01BUktfODAgICAgICAgKDUpCS8qIFdhdGVybWFyayBhdCA4MCBmcmVlIGVudHJpZXMgKi8KKyNkZWZpbmUgQ0VWX1dNQVJLXzk2ICAgICAgICg2KQkvKiBXYXRlcm1hcmsgYXQgOTYgZnJlZSBlbnRyaWVzICovCisjZGVmaW5lIENFVl9XTUFSS18xMTIgICAgICAoNykJLyogV2F0ZXJtYXJrIGF0IDExMiBmcmVlIGVudHJpZXMgKi8KKyNkZWZpbmUgQ0VWX1dNQVJLXzEyOCAgICAgICg4KQkvKiBXYXRlcm1hcmsgYXQgMTI4IGZyZWUgZW50cmllcyAqLworI2RlZmluZSBDRVZfV01BUktfMTQ0ICAgICAgKDkpCS8qIFdhdGVybWFyayBhdCAxNDQgZnJlZSBlbnRyaWVzICovCisjZGVmaW5lIENFVl9XTUFSS18xNjAgICAgICAoMTApCS8qIFdhdGVybWFyayBhdCAxNjAgZnJlZSBlbnRyaWVzICovCisjZGVmaW5lIENFVl9XTUFSS18xNzYgICAgICAoMTEpCS8qIFdhdGVybWFyayBhdCAxNzYgZnJlZSBlbnRyaWVzICovCisjZGVmaW5lIENFVl9XTUFSS18xOTIgICAgICAoMTIpCS8qIFdhdGVybWFyayBhdCAxOTIgZnJlZSBlbnRyaWVzICovCisjZGVmaW5lIENFVl9XTUFSS18yMDggICAgICAoMTMpCS8qIFdhdGVybWFyayBhdCAyMDggZnJlZSBlbnRyaWVzICovCisjZGVmaW5lIENFVl9XTUFSS18yMjQgICAgICAoMTQpCS8qIFdhdGVybWFyayBhdCAyMjQgZnJlZSBlbnRyaWVzICovCisjZGVmaW5lIENFVl9XTUFSS18yNDAgICAgICAoMTUpCS8qIFdhdGVybWFyayBhdCAyNDAgZnJlZSBlbnRyaWVzICovCisKKy8qCisgKiAtLS0gQ1FfQ05UX0VOVU0gLS0tCisgKiBDb21wbGV0aW9uIFF1ZXVlIENvdW50IEVuY29kaW5ncy4KKyAqLworI2RlZmluZSBDRVZfQ1FfQ05UXzI1NiAgICAgICAgICAgICAgICAgICgwKQkvKiBDUSBoYXMgMjU2IGVudHJpZXMgKi8KKyNkZWZpbmUgQ0VWX0NRX0NOVF81MTIgICAgICAgICAgICAgICAgICAoMSkJLyogQ1EgaGFzIDUxMiBlbnRyaWVzICovCisjZGVmaW5lIENFVl9DUV9DTlRfMTAyNCAgICAgICAgICAgICAgICAgKDIpCS8qIENRIGhhcyAxMDI0IGVudHJpZXMgKi8KKworLyoKKyAqIC0tLSBFUV9DTlRfRU5VTSAtLS0KKyAqIEV2ZW50IFF1ZXVlIENvdW50IEVuY29kaW5ncy4KKyAqLworI2RlZmluZSBDRVZfRVFfQ05UXzI1NiAgICAgKDApCS8qIEVRIGhhcyAyNTYgZW50cmllcyAoMTYtYnl0ZSBFUUVzIG9ubHkpICovCisjZGVmaW5lIENFVl9FUV9DTlRfNTEyICAgICAoMSkJLyogRVEgaGFzIDUxMiBlbnRyaWVzICgxNi1ieXRlIEVRRXMgb25seSkgKi8KKyNkZWZpbmUgQ0VWX0VRX0NOVF8xMDI0ICAgICgyKQkvKiBFUSBoYXMgMTAyNCBlbnRyaWVzICg0LWJ5dGUgb3IgKi8KKwkJCQkvKiAxNi1ieXRlIEVRRXMgb25seSkgKi8KKyNkZWZpbmUgQ0VWX0VRX0NOVF8yMDQ4ICAgICgzKQkvKiBFUSBoYXMgMjA0OCBlbnRyaWVzICg0LWJ5dGUgb3IgKi8KKwkJCQkvKiAxNi1ieXRlIEVRRXMgb25seSkgKi8KKyNkZWZpbmUgQ0VWX0VRX0NOVF80MDk2ICAgICg0KQkvKiBFUSBoYXMgNDA5NiBlbnRyaWVzICg0LWJ5dGUgRVFFcyBvbmx5KSAqLworCisvKgorICogLS0tIEVRX1NJWkVfRU5VTSAtLS0KKyAqIEV2ZW50IFF1ZXVlIEVudHJ5IFNpemUgRW5jb2RpbmcuCisgKi8KKyNkZWZpbmUgQ0VWX0VRX1NJWkVfNCAgICAgICAgICAgICAgICAgICAoMCkJLyogRVFFIGlzIDQgYnl0ZXMgKi8KKyNkZWZpbmUgQ0VWX0VRX1NJWkVfMTYgICAgICAgICAgICAgICAgICAoMSkJLyogRVFFIGlzIDE2IGJ5dGVzICovCisKKy8qCisgKiBDb21wbGV0aW9uIFF1ZXVlIENvbnRleHQgVGFibGUgRW50cnkuIENvbnRhaW5zIHRoZSBzdGF0ZSBvZiBhIENRLgorICogTG9jYXRlZCBpbiBSQU0gd2l0aGluIHRoZSBDRVYgYmxvY2suCisgKi8KK3N0cnVjdCBCRV9DUV9DT05URVhUX0FNQVAgeworCXU4IENpZHhbMTFdOwkvKiBEV09SRCAwICovCisJdTggV2F0ZXJtYXJrWzRdOwkvKiBEV09SRCAwICovCisJdTggTm9EZWxheTsJCS8qIERXT1JEIDAgKi8KKwl1OCBFUElkeFsxMV07CS8qIERXT1JEIDAgKi8KKwl1OCBDb3VudFsyXTsJLyogRFdPUkQgMCAqLworCXU4IHZhbGlkOwkJLyogRFdPUkQgMCAqLworCXU4IFNvbEV2ZW50OwkvKiBEV09SRCAwICovCisJdTggRXZlbnRhYmxlOwkvKiBEV09SRCAwICovCisJdTggUGlkeFsxMV07CS8qIERXT1JEIDEgKi8KKwl1OCBQRFsxMF07CQkvKiBEV09SRCAxICovCisJdTggRVFJRFs3XTsJCS8qIERXT1JEIDEgKi8KKwl1OCBGdW5jOwkJLyogRFdPUkQgMSAqLworCXU4IFdNRTsJCS8qIERXT1JEIDEgKi8KKwl1OCBTdGFsbGVkOwkJLyogRFdPUkQgMSAqLworCXU4IEFybWVkOwkJLyogRFdPUkQgMSAqLworfSBfX3BhY2tlZDsKK3N0cnVjdCBDUV9DT05URVhUX0FNQVAgeworCXUzMiBkd1syXTsKK307CisKKy8qCisgKiBFdmVudCBRdWV1ZSBDb250ZXh0IFRhYmxlIEVudHJ5LiBDb250YWlucyB0aGUgc3RhdGUgb2YgYW4gRVEuCisgKiBMb2NhdGVkIGluIFJBTSBpbiB0aGUgQ0VWIGJsb2NrLgorICovCitzdHJ1Y3QgQkVfRVFfQ09OVEVYVF9BTUFQIHsKKwl1OCBDaWR4WzEzXTsJLyogRFdPUkQgMCAqLworCXU4IHJzdmQwWzJdOwkvKiBEV09SRCAwICovCisJdTggRnVuYzsJCS8qIERXT1JEIDAgKi8KKwl1OCBFUElkeFsxM107CS8qIERXT1JEIDAgKi8KKwl1OCB2YWxpZDsJCS8qIERXT1JEIDAgKi8KKwl1OCByc3ZkMTsJCS8qIERXT1JEIDAgKi8KKwl1OCBTaXplOwkJLyogRFdPUkQgMCAqLworCXU4IFBpZHhbMTNdOwkvKiBEV09SRCAxICovCisJdTggcnN2ZDJbM107CS8qIERXT1JEIDEgKi8KKwl1OCBQRFsxMF07CQkvKiBEV09SRCAxICovCisJdTggQ291bnRbM107CS8qIERXT1JEIDEgKi8KKwl1OCBTb2xFdmVudDsJLyogRFdPUkQgMSAqLworCXU4IFN0YWxsZWQ7CQkvKiBEV09SRCAxICovCisJdTggQXJtZWQ7CQkvKiBEV09SRCAxICovCisJdTggV2F0ZXJtYXJrWzRdOwkvKiBEV09SRCAyICovCisJdTggV01FOwkJLyogRFdPUkQgMiAqLworCXU4IHJzdmQzWzNdOwkvKiBEV09SRCAyICovCisJdTggRXZlbnRWZWN0WzZdOwkvKiBEV09SRCAyICovCisJdTggcnN2ZDRbMl07CS8qIERXT1JEIDIgKi8KKwl1OCBEZWxheVs4XTsJLyogRFdPUkQgMiAqLworCXU4IHJzdmQ1WzZdOwkvKiBEV09SRCAyICovCisJdTggVE1SOwkJLyogRFdPUkQgMiAqLworCXU4IHJzdmQ2OwkJLyogRFdPUkQgMiAqLworCXU4IHJzdmQ3WzMyXTsJLyogRFdPUkQgMyAqLworfSBfX3BhY2tlZDsKK3N0cnVjdCBFUV9DT05URVhUX0FNQVAgeworCXUzMiBkd1s0XTsKK307CisKKyNlbmRpZiAvKiBfX2JlX2NtX2FtYXBfaF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvYmVfY29tbW9uLmggYi9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvYmVfY29tbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2U2M2RjNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9iZV9jb21tb24uaApAQCAtMCwwICsxLDUzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA1IC0gMjAwOCBTZXJ2ZXJFbmdpbmVzCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBUaGUgZnVsbCBHTlUgR2VuZXJhbAorICogUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlIGZpbGUgY2FsbGVkIENPUFlJTkcuCisgKgorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqIGxpbnV4LWRyaXZlcnNAc2VydmVyZW5naW5lcy5jb20KKyAqCisgKiBTZXJ2ZXJFbmdpbmVzCisgKiAyMDkgTi4gRmFpciBPYWtzIEF2ZQorICogU3Vubnl2YWxlLCBDQSA5NDA4NQorICovCisvKgorICogQXV0b2dlbmVyYXRlZCBieSBzcmNnZW4gdmVyc2lvbjogMDEyNworICovCisjaWZuZGVmIF9fYmVfY29tbW9uX2FtYXBfaF9fCisjZGVmaW5lIF9fYmVfY29tbW9uX2FtYXBfaF9fCisKKy8qIFBoeXNpY2FsIEFkZHJlc3MuICovCitzdHJ1Y3QgQkVfUEhZU19BRERSX0FNQVAgeworCXU4IGxvWzMyXTsJCS8qIERXT1JEIDAgKi8KKwl1OCBoaVszMl07CQkvKiBEV09SRCAxICovCit9IF9fcGFja2VkOworc3RydWN0IFBIWVNfQUREUl9BTUFQIHsKKwl1MzIgZHdbMl07Cit9OworCisvKiBWaXJ0dWFsIEFkZHJlc3MuICovCitzdHJ1Y3QgQkVfVklSVF9BRERSX0FNQVAgeworCXU4IGxvWzMyXTsJCS8qIERXT1JEIDAgKi8KKwl1OCBoaVszMl07CQkvKiBEV09SRCAxICovCit9IF9fcGFja2VkOworc3RydWN0IFZJUlRfQUREUl9BTUFQIHsKKwl1MzIgZHdbMl07Cit9OworCisvKiBTY2F0dGVyIGdhdGhlciBlbGVtZW50LiAqLworc3RydWN0IEJFX1NHRV9BTUFQIHsKKwl1OCBhZGRyX2hpWzMyXTsJLyogRFdPUkQgMCAqLworCXU4IGFkZHJfbG9bMzJdOwkvKiBEV09SRCAxICovCisJdTggcnN2ZDBbMzJdOwkvKiBEV09SRCAyICovCisJdTggbGVuWzE2XTsJCS8qIERXT1JEIDMgKi8KKwl1OCByc3ZkMVsxNl07CS8qIERXT1JEIDMgKi8KK30gX19wYWNrZWQ7CitzdHJ1Y3QgU0dFX0FNQVAgeworCXUzMiBkd1s0XTsKK307CisKKyNlbmRpZiAvKiBfX2JlX2NvbW1vbl9hbWFwX2hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JlbmV0L2JlX2V0aHRvb2wuYyBiL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9iZV9ldGh0b29sLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDI3YWY4NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9iZV9ldGh0b29sLmMKQEAgLTAsMCArMSwzNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgLSAyMDA4IFNlcnZlckVuZ2luZXMKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFRoZSBmdWxsIEdOVSBHZW5lcmFsCisgKiBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUgZmlsZSBjYWxsZWQgQ09QWUlORy4KKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogbGludXgtZHJpdmVyc0BzZXJ2ZXJlbmdpbmVzLmNvbQorICoKKyAqIFNlcnZlckVuZ2luZXMKKyAqIDIwOSBOLiBGYWlyIE9ha3MgQXZlCisgKiBTdW5ueXZhbGUsIENBIDk0MDg1CisgKi8KKy8qCisgKiBiZV9ldGh0b29sLmMKKyAqCisgKiAJVGhpcyBmaWxlIGNvbnRhaW5zIHZhcmlvdXMgZnVuY3Rpb25zIHRoYXQgZXRodG9vbCBjYW4gdXNlCisgKiAJdG8gdGFsayB0byB0aGUgZHJpdmVyIGFuZCB0aGUgQkUgSC9XLgorICovCisKKyNpbmNsdWRlICJiZW5ldC5oIgorCisjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgorCitzdGF0aWMgY29uc3QgY2hhciBiZW5ldF9nc3RyaW5nc19zdGF0c1tdW0VUSF9HU1RSSU5HX0xFTl0gPSB7CisvKiBuZXRfZGV2aWNlX3N0YXRzICovCisJInJ4X3BhY2tldHMiLAorCSJ0eF9wYWNrZXRzIiwKKwkicnhfYnl0ZXMiLAorCSJ0eF9ieXRlcyIsCisJInJ4X2Vycm9ycyIsCisJInR4X2Vycm9ycyIsCisJInJ4X2Ryb3BwZWQiLAorCSJ0eF9kcm9wcGVkIiwKKwkibXVsdGljYXN0IiwKKwkiY29sbGlzaW9ucyIsCisJInJ4X2xlbmd0aF9lcnJvcnMiLAorCSJyeF9vdmVyX2Vycm9ycyIsCisJInJ4X2NyY19lcnJvcnMiLAorCSJyeF9mcmFtZV9lcnJvcnMiLAorCSJyeF9maWZvX2Vycm9ycyIsCisJInJ4X21pc3NlZF9lcnJvcnMiLAorCSJ0eF9hYm9ydGVkX2Vycm9ycyIsCisJInR4X2NhcnJpZXJfZXJyb3JzIiwKKwkidHhfZmlmb19lcnJvcnMiLAorCSJ0eF9oZWFydGJlYXRfZXJyb3JzIiwKKwkidHhfd2luZG93X2Vycm9ycyIsCisJInJ4X2NvbXByZXNzZWQiLAorCSJ0Y19jb21wcmVzc2VkIiwKKy8qIEJFIGRyaXZlciBTdGF0cyAqLworCSJiZXNfdHhfcmVxcyIsCisJImJlc190eF9mYWlscyIsCisJImJlc19md2RfcmVxcyIsCisJImJlc190eF93cmJzIiwKKwkiYmVzX2ludGVycnVwdHMiLAorCSJiZXNfZXZlbnRzIiwKKwkiYmVzX3R4X2V2ZW50cyIsCisJImJlc19yeF9ldmVudHMiLAorCSJiZXNfdHhfY29tcGwiLAorCSJiZXNfcnhfY29tcGwiLAorCSJiZXNfZXRocnhfcG9zdF9mYWlsIiwKKwkiYmVzXzgwMl8zX2Ryb3BwZWRfZnJhbWVzIiwKKwkiYmVzXzgwMl8zX21hbGZvcm1lZF9mcmFtZXMiLAorCSJiZXNfcnhfbWlzY19wa3RzIiwKKwkiYmVzX2V0aF90eF9yYXRlIiwKKwkiYmVzX2V0aF9yeF9yYXRlIiwKKwkiTnVtIFBhY2tldHMgY29sbGVjdGVkIiwKKwkiTnVtIFRpbWVzIEZsdXNoZWQiLAorfTsKKworI2RlZmluZSBORVRfREVWX1NUQVRTX0xFTiBcCisJKHNpemVvZihzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cykvc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKQorCisjZGVmaW5lIEJFTkVUX1NUQVRTX0xFTiAgQVJSQVlfU0laRShiZW5ldF9nc3RyaW5nc19zdGF0cykKKworc3RhdGljIHZvaWQKK2JlX2dldF9kcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmRydmluZm8pCit7CisJc3RydWN0IGJlX25ldF9vYmplY3QgKnBub2IgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyID0gcG5vYi0+YWRhcHRlcjsKKworCXN0cm5jcHkoZHJ2aW5mby0+ZHJpdmVyLCBiZV9kcml2ZXJfbmFtZSwgMzIpOworCXN0cm5jcHkoZHJ2aW5mby0+dmVyc2lvbiwgYmVfZHJ2cl92ZXIsIDMyKTsKKwlzdHJuY3B5KGRydmluZm8tPmZ3X3ZlcnNpb24sIGJlX2Z3X3ZlciwgMzIpOworCXN0cmNweShkcnZpbmZvLT5idXNfaW5mbywgcGNpX25hbWUoYWRhcHRlci0+cGRldikpOworCWRydmluZm8tPnRlc3RpbmZvX2xlbiA9IDA7CisJZHJ2aW5mby0+cmVnZHVtcF9sZW4gPSAwOworCWRydmluZm8tPmVlZHVtcF9sZW4gPSAwOworfQorCitzdGF0aWMgaW50CitiZV9nZXRfY29hbGVzY2Uoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgc3RydWN0IGV0aHRvb2xfY29hbGVzY2UgKmNvYWxlc2NlKQoreworCXN0cnVjdCBiZV9uZXRfb2JqZWN0ICpwbm9iID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciA9IHBub2ItPmFkYXB0ZXI7CisKKwljb2FsZXNjZS0+cnhfbWF4X2NvYWxlc2NlZF9mcmFtZXMgPSBhZGFwdGVyLT5tYXhfcnhfY29hbDsKKworCWNvYWxlc2NlLT5yeF9jb2FsZXNjZV91c2VjcyA9IGFkYXB0ZXItPmN1cl9lcWQ7CisJY29hbGVzY2UtPnJ4X2NvYWxlc2NlX3VzZWNzX2hpZ2ggPSBhZGFwdGVyLT5tYXhfZXFkOworCWNvYWxlc2NlLT5yeF9jb2FsZXNjZV91c2Vjc19sb3cgPSBhZGFwdGVyLT5taW5fZXFkOworCisJY29hbGVzY2UtPnR4X2NvYWxlc2NlX3VzZWNzID0gYWRhcHRlci0+Y3VyX2VxZDsKKwljb2FsZXNjZS0+dHhfY29hbGVzY2VfdXNlY3NfaGlnaCA9IGFkYXB0ZXItPm1heF9lcWQ7CisJY29hbGVzY2UtPnR4X2NvYWxlc2NlX3VzZWNzX2xvdyA9IGFkYXB0ZXItPm1pbl9lcWQ7CisKKwljb2FsZXNjZS0+dXNlX2FkYXB0aXZlX3J4X2NvYWxlc2NlID0gYWRhcHRlci0+ZW5hYmxlX2FpYzsKKwljb2FsZXNjZS0+dXNlX2FkYXB0aXZlX3R4X2NvYWxlc2NlID0gYWRhcHRlci0+ZW5hYmxlX2FpYzsKKworCXJldHVybiAwOworfQorCisvKgorICogVGhpcyByb3V0aW5lIGlzIHVzZWQgdG8gc2V0IGludGVycnVwIGNvYWxlc2NpbmcgZGVsYXkgKmFzIHdlbGwgYXMqCisgKiB0aGUgbnVtYmVyIG9mIHBrdHMgdG8gY29hbGVzY2UgZm9yIExSTy4KKyAqLworc3RhdGljIGludAorYmVfc2V0X2NvYWxlc2NlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHN0cnVjdCBldGh0b29sX2NvYWxlc2NlICpjb2FsZXNjZSkKK3sKKwlzdHJ1Y3QgYmVfbmV0X29iamVjdCAqcG5vYiA9IG5ldGRldl9wcml2KG5ldGRldik7CisJc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwbm9iLT5hZGFwdGVyOworCXN0cnVjdCBiZV9lcV9vYmplY3QgKmVxX29iamVjdHA7CisJdTMyIG1heCwgbWluLCBjdXI7CisJaW50IHN0YXR1czsKKworCWFkYXB0ZXItPm1heF9yeF9jb2FsID0gY29hbGVzY2UtPnJ4X21heF9jb2FsZXNjZWRfZnJhbWVzOworCWlmIChhZGFwdGVyLT5tYXhfcnhfY29hbCA+PSBCRV9MUk9fTUFYX1BLVFMpCisJCWFkYXB0ZXItPm1heF9yeF9jb2FsID0gQkVfTFJPX01BWF9QS1RTOworCisJaWYgKGFkYXB0ZXItPmVuYWJsZV9haWMgPT0gMCAmJgorCQljb2FsZXNjZS0+dXNlX2FkYXB0aXZlX3J4X2NvYWxlc2NlID09IDEpIHsKKwkJLyogaWYgQUlDIGlzIGJlaW5nIHR1cm5lZCBvbiBub3csIHN0YXJ0IHdpdGggYW4gRVFEIG9mIDAgKi8KKwkJYWRhcHRlci0+Y3VyX2VxZCA9IDA7CisJfQorCWFkYXB0ZXItPmVuYWJsZV9haWMgPSBjb2FsZXNjZS0+dXNlX2FkYXB0aXZlX3J4X2NvYWxlc2NlOworCisJLyogcm91bmQgb2ZmIHRvIG5lYXJlc3QgbXVsdGlwbGUgb2YgOCAqLworCW1heCA9ICgoKGNvYWxlc2NlLT5yeF9jb2FsZXNjZV91c2Vjc19oaWdoICsgNCkgPj4gMykgPDwgMyk7CisJbWluID0gKCgoY29hbGVzY2UtPnJ4X2NvYWxlc2NlX3VzZWNzX2xvdyArIDQpID4+IDMpIDw8IDMpOworCWN1ciA9ICgoKGNvYWxlc2NlLT5yeF9jb2FsZXNjZV91c2VjcyArIDQpID4+IDMpIDw8IDMpOworCisJaWYgKGFkYXB0ZXItPmVuYWJsZV9haWMpIHsKKwkJLyogYWNjZXB0IGxvdyBhbmQgaGlnaCBpZiBBSUMgaXMgZW5hYmxlZCAqLworCQlpZiAobWF4ID4gTUFYX0VRRCkKKwkJCW1heCA9IE1BWF9FUUQ7CisJCWlmIChtaW4gPiBtYXgpCisJCQltaW4gPSBtYXg7CisJCWFkYXB0ZXItPm1heF9lcWQgPSBtYXg7CisJCWFkYXB0ZXItPm1pbl9lcWQgPSBtaW47CisJCWlmIChhZGFwdGVyLT5jdXJfZXFkID4gbWF4KQorCQkJYWRhcHRlci0+Y3VyX2VxZCA9IG1heDsKKwkJaWYgKGFkYXB0ZXItPmN1cl9lcWQgPCBtaW4pCisJCQlhZGFwdGVyLT5jdXJfZXFkID0gbWluOworCX0gZWxzZSB7CisJCS8qIGFjY2VwdCBzcGVjaWZpZWQgY29hbGVzY2VfdXNlY3Mgb25seSBpZiBBSUMgaXMgZGlzYWJsZWQgKi8KKwkJaWYgKGN1ciA+IE1BWF9FUUQpCisJCQljdXIgPSBNQVhfRVFEOworCQllcV9vYmplY3RwID0gJnBub2ItPmV2ZW50X3Ffb2JqOworCQlzdGF0dXMgPQorCQkgICAgYmVfZXFfbW9kaWZ5X2RlbGF5KCZwbm9iLT5mbl9vYmosIDEsICZlcV9vYmplY3RwLCAmY3VyLAorCQkJCSAgICAgICBOVUxMLCBOVUxMLCBOVUxMKTsKKwkJaWYgKHN0YXR1cyA9PSBCRV9TVUNDRVNTKQorCQkJYWRhcHRlci0+Y3VyX2VxZCA9IGN1cjsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1MzIgYmVfZ2V0X3J4X2NzdW0oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlzdHJ1Y3QgYmVfbmV0X29iamVjdCAqcG5vYiA9IG5ldGRldl9wcml2KG5ldGRldik7CisJc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwbm9iLT5hZGFwdGVyOworCXJldHVybiBhZGFwdGVyLT5yeF9jc3VtOworfQorCitzdGF0aWMgaW50IGJlX3NldF9yeF9jc3VtKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHVpbnQzMl90IGRhdGEpCit7CisJc3RydWN0IGJlX25ldF9vYmplY3QgKnBub2IgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyID0gcG5vYi0+YWRhcHRlcjsKKworCWlmIChkYXRhKQorCQlhZGFwdGVyLT5yeF9jc3VtID0gMTsKKwllbHNlCisJCWFkYXB0ZXItPnJ4X2NzdW0gPSAwOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitiZV9nZXRfc3RyaW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB1aW50MzJfdCBzdHJpbmdzZXQsIHVpbnQ4X3QgKmRhdGEpCit7CisJc3dpdGNoIChzdHJpbmdzZXQpIHsKKwljYXNlIEVUSF9TU19TVEFUUzoKKwkJbWVtY3B5KGRhdGEsICpiZW5ldF9nc3RyaW5nc19zdGF0cywKKwkJICAgICAgIHNpemVvZihiZW5ldF9nc3RyaW5nc19zdGF0cykpOworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyBpbnQgYmVfZ2V0X3N0YXRzX2NvdW50KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJcmV0dXJuIEJFTkVUX1NUQVRTX0xFTjsKK30KKworc3RhdGljIHZvaWQKK2JlX2dldF9ldGh0b29sX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCisJCSAgICAgc3RydWN0IGV0aHRvb2xfc3RhdHMgKnN0YXRzLCB1aW50NjRfdCAqZGF0YSkKK3sKKwlzdHJ1Y3QgYmVfbmV0X29iamVjdCAqcG5vYiA9IG5ldGRldl9wcml2KG5ldGRldik7CisJc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwbm9iLT5hZGFwdGVyOworCWludCBpOworCisJYmVuZXRfZ2V0X3N0YXRzKG5ldGRldik7CisKKwlmb3IgKGkgPSAwOyBpIDw9IE5FVF9ERVZfU1RBVFNfTEVOOyBpKyspCisJCWRhdGFbaV0gPSAoKHVuc2lnbmVkIGxvbmcgKikmYWRhcHRlci0+YmVuZXRfc3RhdHMpW2ldOworCisJZGF0YVtpXSA9IGFkYXB0ZXItPmJlX3N0YXQuYmVzX3R4X3JlcXM7CisJZGF0YVtpKytdID0gYWRhcHRlci0+YmVfc3RhdC5iZXNfdHhfZmFpbHM7CisJZGF0YVtpKytdID0gYWRhcHRlci0+YmVfc3RhdC5iZXNfZndkX3JlcXM7CisJZGF0YVtpKytdID0gYWRhcHRlci0+YmVfc3RhdC5iZXNfdHhfd3JiczsKKworCWRhdGFbaSsrXSA9IGFkYXB0ZXItPmJlX3N0YXQuYmVzX2ludHM7CisJZGF0YVtpKytdID0gYWRhcHRlci0+YmVfc3RhdC5iZXNfZXZlbnRzOworCWRhdGFbaSsrXSA9IGFkYXB0ZXItPmJlX3N0YXQuYmVzX3R4X2V2ZW50czsKKwlkYXRhW2krK10gPSBhZGFwdGVyLT5iZV9zdGF0LmJlc19yeF9ldmVudHM7CisJZGF0YVtpKytdID0gYWRhcHRlci0+YmVfc3RhdC5iZXNfdHhfY29tcGw7CisJZGF0YVtpKytdID0gYWRhcHRlci0+YmVfc3RhdC5iZXNfcnhfY29tcGw7CisJZGF0YVtpKytdID0gYWRhcHRlci0+YmVfc3RhdC5iZXNfZXRocnhfcG9zdF9mYWlsOworCWRhdGFbaSsrXSA9IGFkYXB0ZXItPmJlX3N0YXQuYmVzXzgwMl8zX2Ryb3BwZWRfZnJhbWVzOworCWRhdGFbaSsrXSA9IGFkYXB0ZXItPmJlX3N0YXQuYmVzXzgwMl8zX21hbGZvcm1lZF9mcmFtZXM7CisJZGF0YVtpKytdID0gYWRhcHRlci0+YmVfc3RhdC5iZXNfcnhfbWlzY19wa3RzOworCWRhdGFbaSsrXSA9IGFkYXB0ZXItPmJlX3N0YXQuYmVzX2V0aF90eF9yYXRlOworCWRhdGFbaSsrXSA9IGFkYXB0ZXItPmJlX3N0YXQuYmVzX2V0aF9yeF9yYXRlOworCWRhdGFbaSsrXSA9IGFkYXB0ZXItPmJlX3N0YXQuYmVzX3J4X2NvYWw7CisJZGF0YVtpKytdID0gYWRhcHRlci0+YmVfc3RhdC5iZXNfcnhfZmx1c2g7CisKK30KKworc3RhdGljIGludCBiZV9nZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgc3RydWN0IGV0aHRvb2xfY21kICplY21kKQoreworCWVjbWQtPnNwZWVkID0gU1BFRURfMTAwMDA7CisJZWNtZC0+ZHVwbGV4ID0gRFVQTEVYX0ZVTEw7CisJZWNtZC0+YXV0b25lZyA9IEFVVE9ORUdfRElTQUJMRTsKKwlyZXR1cm4gMDsKK30KKworLyogR2V0IHRoZSBSaW5nIHBhcmFtZXRlcnMgZnJvbSB0aGUgcG5vYiAqLworc3RhdGljIHZvaWQKK2JlX2dldF9yaW5ncGFyYW0oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgc3RydWN0IGV0aHRvb2xfcmluZ3BhcmFtICpyaW5nKQoreworCXN0cnVjdCBiZV9uZXRfb2JqZWN0ICpwbm9iID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKworCS8qIFByZSBTZXQgTWF4aW1zICovCisJcmluZy0+cnhfbWF4X3BlbmRpbmcgPSBwbm9iLT5yeF9xX2xlbjsKKwlyaW5nLT5yeF9taW5pX21heF9wZW5kaW5nID0gcmluZy0+cnhfbWluaV9tYXhfcGVuZGluZzsKKwlyaW5nLT5yeF9qdW1ib19tYXhfcGVuZGluZyA9IHJpbmctPnJ4X2p1bWJvX21heF9wZW5kaW5nOworCXJpbmctPnR4X21heF9wZW5kaW5nID0gcG5vYi0+dHhfcV9sZW47CisKKwkvKiBDdXJyZW50IGhhcmR3YXJlIFNldHRpbmdzICAgICAgICAgICAgICAgICovCisJcmluZy0+cnhfcGVuZGluZyA9IGF0b21pY19yZWFkKCZwbm9iLT5yeF9xX3Bvc3RlZCk7CisJcmluZy0+cnhfbWluaV9wZW5kaW5nID0gcmluZy0+cnhfbWluaV9wZW5kaW5nOworCXJpbmctPnJ4X2p1bWJvX3BlbmRpbmcgPSByaW5nLT5yeF9qdW1ib19wZW5kaW5nOworCXJpbmctPnR4X3BlbmRpbmcgPSBhdG9taWNfcmVhZCgmcG5vYi0+dHhfcV91c2VkKTsKKworfQorCitzdGF0aWMgdm9pZAorYmVfZ2V0X3BhdXNlcGFyYW0oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgc3RydWN0IGV0aHRvb2xfcGF1c2VwYXJhbSAqZWNtZCkKK3sKKwlzdHJ1Y3QgYmVfbmV0X29iamVjdCAqcG5vYiA9IG5ldGRldl9wcml2KG5ldGRldik7CisJYm9vbCByeGZjLCB0eGZjOworCWludCBzdGF0dXM7CisKKwlzdGF0dXMgPSBiZV9ldGhfZ2V0X2Zsb3dfY29udHJvbCgmcG5vYi0+Zm5fb2JqLCAmdHhmYywgJnJ4ZmMpOworCWlmIChzdGF0dXMgIT0gQkVfU1VDQ0VTUykgeworCQlkZXZfaW5mbygmbmV0ZGV2LT5kZXYsICJVbmFibGUgdG8gZ2V0IHBhdXNlIGZyYW1lIHNldHRpbmdzXG4iKTsKKwkJLyogcmV0dXJuIGRlZmF1bHRzICovCisJCWVjbWQtPnJ4X3BhdXNlID0gMTsKKwkJZWNtZC0+dHhfcGF1c2UgPSAwOworCQllY21kLT5hdXRvbmVnID0gQVVUT05FR19FTkFCTEU7CisJCXJldHVybjsKKwl9CisKKwlpZiAodHhmYyA9PSB0cnVlKQorCQllY21kLT50eF9wYXVzZSA9IDE7CisJZWxzZQorCQllY21kLT50eF9wYXVzZSA9IDA7CisKKwlpZiAocnhmYyA9PSB0cnVlKQorCQllY21kLT5yeF9wYXVzZSA9IDE7CisJZWxzZQorCQllY21kLT5yeF9wYXVzZSA9IDA7CisKKwllY21kLT5hdXRvbmVnID0gQVVUT05FR19FTkFCTEU7Cit9CisKK3N0YXRpYyBpbnQKK2JlX3NldF9wYXVzZXBhcmFtKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHN0cnVjdCBldGh0b29sX3BhdXNlcGFyYW0gKmVjbWQpCit7CisJc3RydWN0IGJlX25ldF9vYmplY3QgKnBub2IgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCWJvb2wgdHhmYywgcnhmYzsKKwlpbnQgc3RhdHVzOworCisJaWYgKGVjbWQtPmF1dG9uZWcgIT0gQVVUT05FR19FTkFCTEUpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGVjbWQtPnR4X3BhdXNlKQorCQl0eGZjID0gdHJ1ZTsKKwllbHNlCisJCXR4ZmMgPSBmYWxzZTsKKworCWlmIChlY21kLT5yeF9wYXVzZSkKKwkJcnhmYyA9IHRydWU7CisJZWxzZQorCQlyeGZjID0gZmFsc2U7CisKKwlzdGF0dXMgPSBiZV9ldGhfc2V0X2Zsb3dfY29udHJvbCgmcG5vYi0+Zm5fb2JqLCB0eGZjLCByeGZjKTsKKwlpZiAoc3RhdHVzICE9IEJFX1NVQ0NFU1MpIHsKKwkJZGV2X2luZm8oJm5ldGRldi0+ZGV2LCAiVW5hYmxlIHRvIHNldCBwYXVzZSBmcmFtZSBzZXR0aW5nc1xuIik7CisJCXJldHVybiAtMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBldGh0b29sX29wcyBiZV9ldGh0b29sX29wcyA9IHsKKwkuZ2V0X3NldHRpbmdzID0gYmVfZ2V0X3NldHRpbmdzLAorCS5nZXRfZHJ2aW5mbyA9IGJlX2dldF9kcnZpbmZvLAorCS5nZXRfbGluayA9IGV0aHRvb2xfb3BfZ2V0X2xpbmssCisJLmdldF9jb2FsZXNjZSA9IGJlX2dldF9jb2FsZXNjZSwKKwkuc2V0X2NvYWxlc2NlID0gYmVfc2V0X2NvYWxlc2NlLAorCS5nZXRfcmluZ3BhcmFtID0gYmVfZ2V0X3JpbmdwYXJhbSwKKwkuZ2V0X3BhdXNlcGFyYW0gPSBiZV9nZXRfcGF1c2VwYXJhbSwKKwkuc2V0X3BhdXNlcGFyYW0gPSBiZV9zZXRfcGF1c2VwYXJhbSwKKwkuZ2V0X3J4X2NzdW0gPSBiZV9nZXRfcnhfY3N1bSwKKwkuc2V0X3J4X2NzdW0gPSBiZV9zZXRfcnhfY3N1bSwKKwkuZ2V0X3R4X2NzdW0gPSBldGh0b29sX29wX2dldF90eF9jc3VtLAorCS5zZXRfdHhfY3N1bSA9IGV0aHRvb2xfb3Bfc2V0X3R4X2NzdW0sCisJLmdldF9zZyA9IGV0aHRvb2xfb3BfZ2V0X3NnLAorCS5zZXRfc2cgPSBldGh0b29sX29wX3NldF9zZywKKwkuZ2V0X3RzbyA9IGV0aHRvb2xfb3BfZ2V0X3RzbywKKwkuc2V0X3RzbyA9IGV0aHRvb2xfb3Bfc2V0X3RzbywKKwkuZ2V0X3N0cmluZ3MgPSBiZV9nZXRfc3RyaW5ncywKKwkuZ2V0X3N0YXRzX2NvdW50ID0gYmVfZ2V0X3N0YXRzX2NvdW50LAorCS5nZXRfZXRodG9vbF9zdGF0cyA9IGJlX2dldF9ldGh0b29sX3N0YXRzLAorfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9iZV9pbml0LmMgYi9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvYmVfaW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyYTAyNmMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvYmVfaW5pdC5jCkBAIC0wLDAgKzEsMTM4MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNSAtIDIwMDggU2VydmVyRW5naW5lcworICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgVGhlIGZ1bGwgR05VIEdlbmVyYWwKKyAqIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZSBmaWxlIGNhbGxlZCBDT1BZSU5HLgorICoKKyAqIENvbnRhY3QgSW5mb3JtYXRpb246CisgKiBsaW51eC1kcml2ZXJzQHNlcnZlcmVuZ2luZXMuY29tCisgKgorICogU2VydmVyRW5naW5lcworICogMjA5IE4uIEZhaXIgT2FrcyBBdmUKKyAqIFN1bm55dmFsZSwgQ0EgOTQwODUKKyAqLworI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSAiYmVuZXQuaCIKKworI2RlZmluZSAgRFJWUl9WRVJTSU9OICAiMS4wLjcyOCIKKworc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkIGJlX2RldmljZV9pZF90YWJsZVtdID0geworCXtQQ0lfREVWSUNFKDB4MTlhMiwgMHgwMjAxKX0sCisJezB9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgYmVfZGV2aWNlX2lkX3RhYmxlKTsKKworTU9EVUxFX1ZFUlNJT04oRFJWUl9WRVJTSU9OKTsKKworI2RlZmluZSBEUlZfREVTQ1JJUFRJT04gIlNlcnZlckVuZ2luZXMgQmxhZGVFbmdpbmUgTmV0d29yayBEcml2ZXIgVmVyc2lvbiAiCisKK01PRFVMRV9ERVNDUklQVElPTihEUlZfREVTQ1JJUFRJT04gRFJWUl9WRVJTSU9OKTsKK01PRFVMRV9BVVRIT1IoIlNlcnZlckVuZ2luZXMiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworc3RhdGljIHVuc2lnbmVkIGludCBtc2l4ID0gMTsKK21vZHVsZV9wYXJhbShtc2l4LCB1aW50LCBTX0lSVUdPKTsKK01PRFVMRV9QQVJNX0RFU0MobXNpeCwgIlVzZSBNU0kteCBpbnRlcnJ1cHRzIik7CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcnhidWZfc2l6ZSA9IDIwNDg7CS8qIERlZmF1bHQgUlggZnJhZyBzaXplICovCittb2R1bGVfcGFyYW0ocnhidWZfc2l6ZSwgdWludCwgU19JUlVHTyk7CitNT0RVTEVfUEFSTV9ERVNDKHJ4YnVmX3NpemUsICJTaXplIG9mIGJ1ZmZlcnMgdG8gaG9sZCBSeCBkYXRhIik7CisKK2NvbnN0IGNoYXIgYmVfZHJ2cl92ZXJbXSA9IERSVlJfVkVSU0lPTjsKK2NoYXIgYmVfZndfdmVyWzMyXTsJCS8qIEYvVyB2ZXJzaW9uIGZpbGxlZCBpbiBieSBiZV9wcm9iZSAqLworY2hhciBiZV9kcml2ZXJfbmFtZVtdID0gImJlbmV0IjsKKworLyoKKyAqIE51bWJlciBvZiBlbnRyaWVzIGluIGVhY2ggcXVldWUuCisgKi8KKyNkZWZpbmUgRVZFTlRfUV9MRU4JCTEwMjQKKyNkZWZpbmUgRVRIX1RYUV9MRU4JCTIwNDgKKyNkZWZpbmUgRVRIX1RYQ1FfTEVOCQkxMDI0CisjZGVmaW5lIEVUSF9SWFFfTEVOCQkxMDI0CS8qIERvZXMgbm90IHN1cHBvcnQgYW55IG90aGVyIHZhbHVlICovCisjZGVmaW5lIEVUSF9VQ19SWENRX0xFTgkJMTAyNAorI2RlZmluZSBFVEhfQkNfUlhDUV9MRU4JCTI1NgorI2RlZmluZSBNQ0NfUV9MRU4gICAgICAgICAgICAgICA2NAkvKiB0b3RhbCBzaXplIG5vdCB0byBleGNlZWQgOCBwYWdlcyAqLworI2RlZmluZSBNQ0NfQ1FfTEVOICAgICAgICAgICAgICAyNTYKKworLyogQml0IG1hc2sgZGVzY3JpYmluZyBldmVudHMgb2YgaW50ZXJlc3QgdG8gYmUgdHJhY2VkICovCit1bnNpZ25lZCBpbnQgdHJhY2VfbGV2ZWw7CisKK3N0YXRpYyBpbnQKK2luaXRfcGNpX2JlX2Z1bmN0aW9uKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyLCBzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwl1NjQgcGE7CisKKwkvKiBDU1IgKi8KKwlwYSA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAyKTsKKwlhZGFwdGVyLT5jc3JfdmEgPSBpb3JlbWFwX25vY2FjaGUocGEsIHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMikpOworCWlmIChhZGFwdGVyLT5jc3JfdmEgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKiBEb29yIEJlbGwgKi8KKwlwYSA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCA0KTsKKwlhZGFwdGVyLT5kYl92YSA9IGlvcmVtYXBfbm9jYWNoZShwYSwgKDEyOCAqIDEwMjQpKTsKKwlpZiAoYWRhcHRlci0+ZGJfdmEgPT0gTlVMTCkgeworCQlpb3VubWFwKGFkYXB0ZXItPmNzcl92YSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCS8qIFBDSSAqLworCXBhID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDEpOworCWFkYXB0ZXItPnBjaV92YSA9IGlvcmVtYXBfbm9jYWNoZShwYSwgcGNpX3Jlc291cmNlX2xlbihwZGV2LCAxKSk7CisJaWYgKGFkYXB0ZXItPnBjaV92YSA9PSBOVUxMKSB7CisJCWlvdW5tYXAoYWRhcHRlci0+Y3NyX3ZhKTsKKwkJaW91bm1hcChhZGFwdGVyLT5kYl92YSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAgIFRoaXMgZnVuY3Rpb24gZW5hYmxlcyB0aGUgaW50ZXJydXB0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIEV2ZW50CisgICBxdWV1ZSBJRCBmb3IgdGhlIGdpdmVuIE5ldE9iamVjdAorKi8KK3ZvaWQgYmVfZW5hYmxlX2VxX2ludHIoc3RydWN0IGJlX25ldF9vYmplY3QgKnBub2IpCit7CisJc3RydWN0IENRX0RCX0FNQVAgY3FkYjsKKwljcWRiLmR3WzBdID0gMDsKKwlBTUFQX1NFVF9CSVRTX1BUUihDUV9EQiwgZXZlbnQsICZjcWRiLCAxKTsKKwlBTUFQX1NFVF9CSVRTX1BUUihDUV9EQiwgcmVhcm0sICZjcWRiLCAxKTsKKwlBTUFQX1NFVF9CSVRTX1BUUihDUV9EQiwgbnVtX3BvcHBlZCwgJmNxZGIsIDApOworCUFNQVBfU0VUX0JJVFNfUFRSKENRX0RCLCBxaWQsICZjcWRiLCBwbm9iLT5ldmVudF9xX2lkKTsKKwlQRF9XUklURSgmcG5vYi0+Zm5fb2JqLCBjcV9kYiwgY3FkYi5kd1swXSk7Cit9CisKKy8qCisgICBUaGlzIGZ1bmN0aW9uIGRpc2FibGVzIHRoZSBpbnRlcnJ1cHQgY29ycmVzcG9uZGluZyB0byB0aGUgRXZlbnQKKyAgIHF1ZXVlIElEIGZvciB0aGUgZ2l2ZW4gTmV0T2JqZWN0CisqLwordm9pZCBiZV9kaXNhYmxlX2VxX2ludHIoc3RydWN0IGJlX25ldF9vYmplY3QgKnBub2IpCit7CisJc3RydWN0IENRX0RCX0FNQVAgY3FkYjsKKwljcWRiLmR3WzBdID0gMDsKKwlBTUFQX1NFVF9CSVRTX1BUUihDUV9EQiwgZXZlbnQsICZjcWRiLCAxKTsKKwlBTUFQX1NFVF9CSVRTX1BUUihDUV9EQiwgcmVhcm0sICZjcWRiLCAwKTsKKwlBTUFQX1NFVF9CSVRTX1BUUihDUV9EQiwgbnVtX3BvcHBlZCwgJmNxZGIsIDApOworCUFNQVBfU0VUX0JJVFNfUFRSKENRX0RCLCBxaWQsICZjcWRiLCBwbm9iLT5ldmVudF9xX2lkKTsKKwlQRF9XUklURSgmcG5vYi0+Zm5fb2JqLCBjcV9kYiwgY3FkYi5kd1swXSk7Cit9CisKKy8qCisgICAgVGhpcyBmdW5jdGlvbiBlbmFibGVzIHRoZSBpbnRlcnJ1cHQgZnJvbSB0aGUgIG5ldHdvcmsgZnVuY3Rpb24KKyAgICBvZiB0aGUgQmxhZGVFbmdpbmUuIFVzZSB0aGUgZnVuY3Rpb24gYmVfZGlzYWJsZV9lcV9pbnRyKCkKKyAgICB0byBlbmFibGUgdGhlIGludGVycnVwdCBmcm9tIHRoZSBldmVudCBxdWV1ZSBvZiBvbmx5IG9uZSBzcGVjaWZpYworICAgIE5ldE9iamVjdAorKi8KK3ZvaWQgYmVfZW5hYmxlX2ludHIoc3RydWN0IGJlX25ldF9vYmplY3QgKnBub2IpCit7CisJc3RydWN0IFBDSUNGR19IT1NUX1RJTUVSX0lOVF9DVFJMX0NTUl9BTUFQIGN0cmw7CisJdTMyIGhvc3RfaW50cjsKKworCWN0cmwuZHdbMF0gPSBQQ0lDRkcxX1JFQUQoJnBub2ItPmZuX29iaiwgaG9zdF90aW1lcl9pbnRfY3RybCk7CisJaG9zdF9pbnRyID0gQU1BUF9HRVRfQklUU19QVFIoUENJQ0ZHX0hPU1RfVElNRVJfSU5UX0NUUkxfQ1NSLAorCQkJCQkJCWhvc3RpbnRyLCBjdHJsLmR3KTsKKwlpZiAoIWhvc3RfaW50cikgeworCQlBTUFQX1NFVF9CSVRTX1BUUihQQ0lDRkdfSE9TVF9USU1FUl9JTlRfQ1RSTF9DU1IsCisJCQlob3N0aW50ciwgY3RybC5kdywgMSk7CisJCVBDSUNGRzFfV1JJVEUoJnBub2ItPmZuX29iaiwgaG9zdF90aW1lcl9pbnRfY3RybCwKKwkJCWN0cmwuZHdbMF0pOworCX0KK30KKworLyoKKyAgIFRoaXMgZnVuY3Rpb24gZGlzYWJsZXMgdGhlIGludGVycnVwdCBmcm9tIHRoZSBuZXR3b3JrIGZ1bmN0aW9uIG9mCisgICB0aGUgQmxhZGVFbmdpbmUuICBVc2UgdGhlIGZ1bmN0aW9uIGJlX2Rpc2FibGVfZXFfaW50cigpIHRvCisgICBkaXNhYmxlIHRoZSBpbnRlcnJ1cHQgZnJvbSB0aGUgZXZlbnQgcXVldWUgb2Ygb25seSBvbmUgc3BlY2lmaWMgTmV0T2JqZWN0CisqLwordm9pZCBiZV9kaXNhYmxlX2ludHIoc3RydWN0IGJlX25ldF9vYmplY3QgKnBub2IpCit7CisKKwlzdHJ1Y3QgUENJQ0ZHX0hPU1RfVElNRVJfSU5UX0NUUkxfQ1NSX0FNQVAgY3RybDsKKwl1MzIgaG9zdF9pbnRyOworCWN0cmwuZHdbMF0gPSBQQ0lDRkcxX1JFQUQoJnBub2ItPmZuX29iaiwgaG9zdF90aW1lcl9pbnRfY3RybCk7CisJaG9zdF9pbnRyID0gQU1BUF9HRVRfQklUU19QVFIoUENJQ0ZHX0hPU1RfVElNRVJfSU5UX0NUUkxfQ1NSLAorCQkJCQkJCWhvc3RpbnRyLCBjdHJsLmR3KTsKKwlpZiAoaG9zdF9pbnRyKSB7CisJCUFNQVBfU0VUX0JJVFNfUFRSKFBDSUNGR19IT1NUX1RJTUVSX0lOVF9DVFJMX0NTUiwgaG9zdGludHIsCisJCQljdHJsLmR3LCAwKTsKKwkJUENJQ0ZHMV9XUklURSgmcG5vYi0+Zm5fb2JqLCBob3N0X3RpbWVyX2ludF9jdHJsLAorCQkJY3RybC5kd1swXSk7CisJfQorfQorCitzdGF0aWMgaW50IGJlX2VuYWJsZV9tc2l4KHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyKQoreworCWludCBpLCByZXQ7CisKKwlpZiAoIW1zaXgpCisJCXJldHVybiAtMTsKKworCWZvciAoaSA9IDA7IGkgPCBCRV9NQVhfUkVRX01TSVhfVkVDVE9SUzsgaSsrKQorCQlhZGFwdGVyLT5tc2l4X2VudHJpZXNbaV0uZW50cnkgPSBpOworCisJcmV0ID0gcGNpX2VuYWJsZV9tc2l4KGFkYXB0ZXItPnBkZXYsIGFkYXB0ZXItPm1zaXhfZW50cmllcywKKwkJQkVfTUFYX1JFUV9NU0lYX1ZFQ1RPUlMpOworCisJaWYgKHJldCA9PSAwKQorCQlhZGFwdGVyLT5tc2l4X2VuYWJsZWQgPSAxOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYmVfcmVnaXN0ZXJfaXNyKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyLAorCQlzdHJ1Y3QgYmVfbmV0X29iamVjdCAqcG5vYikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gcG5vYi0+bmV0ZGV2OworCWludCBpbnR4ID0gMCwgcjsKKworCW5ldGRldi0+aXJxID0gYWRhcHRlci0+cGRldi0+aXJxOworCXIgPSBiZV9lbmFibGVfbXNpeChhZGFwdGVyKTsKKworCWlmIChyID09IDApIHsKKwkJciA9IHJlcXVlc3RfaXJxKGFkYXB0ZXItPm1zaXhfZW50cmllc1swXS52ZWN0b3IsCisJCQkJYmVfaW50LCBJUlFGX1NIQVJFRCwgbmV0ZGV2LT5uYW1lLCBuZXRkZXYpOworCQlpZiAocikgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJCSJNU0lYIFJlcXVlc3QgSVJRIGZhaWxlZCAtIEVycm5vICVkXG4iLCByKTsKKwkJCWludHggPSAxOworCQkJcGNpX2Rpc2FibGVfbXNpeChhZGFwdGVyLT5wZGV2KTsKKwkJCWFkYXB0ZXItPm1zaXhfZW5hYmxlZCA9IDA7CisJCX0KKwl9IGVsc2UgeworCQlpbnR4ID0gMTsKKwl9CisKKwlpZiAoaW50eCkgeworCQlyID0gcmVxdWVzdF9pcnEobmV0ZGV2LT5pcnEsIGJlX2ludCwgSVJRRl9TSEFSRUQsCisJCQkJbmV0ZGV2LT5uYW1lLCBuZXRkZXYpOworCQlpZiAocikgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJCSJJTlR4IFJlcXVlc3QgSVJRIGZhaWxlZCAtIEVycm5vICVkXG4iLCByKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKwlhZGFwdGVyLT5pc3JfcmVnaXN0ZXJlZCA9IDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGJlX3VucmVnaXN0ZXJfaXNyKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBhZGFwdGVyLT5uZXRkZXZwOworCWlmIChhZGFwdGVyLT5pc3JfcmVnaXN0ZXJlZCkgeworCQlpZiAoYWRhcHRlci0+bXNpeF9lbmFibGVkKSB7CisJCQlmcmVlX2lycShhZGFwdGVyLT5tc2l4X2VudHJpZXNbMF0udmVjdG9yLCBuZXRkZXYpOworCQkJcGNpX2Rpc2FibGVfbXNpeChhZGFwdGVyLT5wZGV2KTsKKwkJCWFkYXB0ZXItPm1zaXhfZW5hYmxlZCA9IDA7CisJCX0gZWxzZSB7CisJCQlmcmVlX2lycShuZXRkZXYtPmlycSwgbmV0ZGV2KTsKKwkJfQorCQlhZGFwdGVyLT5pc3JfcmVnaXN0ZXJlZCA9IDA7CisJfQorfQorCisvKgorICAgIFRoaXMgZnVuY3Rpb24gcHJvY2Vzc2VzIHRoZSBGbHVzaCBDb21wbGV0aW9ucyB0aGF0IGFyZSBpc3N1ZWQgYnkgdGhlCisgICAgQVJNIEYvVywgd2hlbiBhIFJlY3YgUmluZyBpcyBkZXN0cm95ZWQuICBBIGZsdXNoIGNvbXBsZXRpb24gaXMKKyAgICBpZGVudGlmaWVkIHdoZW4gYSBSeCBDT21wbCBkZXNjcmlwdG9yIGhhcyB0aGUgdGNwY2tzdW0gYW5kIHVkcGNrc3VtCisgICAgc2V0IGFuZCB0aGUgcGt0c2l6ZSBpcyAzMi4gIFRoZXNlIGNvbXBsZXRpb25zIGFyZSByZWNlaXZlZCBvbiB0aGUKKyAgICBSeCBDb21wbGV0aW9uIFF1ZXVlLgorKi8KK3N0YXRpYyB1MzIgYmVfcHJvY2Vzc19yeF9mbHVzaF9jbXBsKHN0cnVjdCBiZV9uZXRfb2JqZWN0ICpwbm9iKQoreworCXN0cnVjdCBFVEhfUlhfQ09NUExfQU1BUCAqcnhjcDsKKwl1bnNpZ25lZCBpbnQgaSA9IDA7CisJd2hpbGUgKChyeGNwID0gYmVfZ2V0X3J4X2NtcGwocG5vYikpICE9IE5VTEwpIHsKKwkJYmVfbm90aWZ5X2NtcGwocG5vYiwgMSwgcG5vYi0+cnhfY3FfaWQsIDEpOworCQlpKys7CisJfQorCXJldHVybiBpOworfQorCitzdGF0aWMgdm9pZCBiZV90eF9xX2NsZWFuKHN0cnVjdCBiZV9uZXRfb2JqZWN0ICpwbm9iKQoreworCXdoaWxlIChhdG9taWNfcmVhZCgmcG5vYi0+dHhfcV91c2VkKSkKKwkJcHJvY2Vzc19vbmVfdHhfY29tcGwocG5vYiwgdHhfY29tcGxfbGFzdHdyYl9pZHhfZ2V0KHBub2IpKTsKK30KKworc3RhdGljIHZvaWQgYmVfcnhfcV9jbGVhbihzdHJ1Y3QgYmVfbmV0X29iamVjdCAqcG5vYikKK3sKKwlpZiAocG5vYi0+cnhfY3R4dCkgeworCQlpbnQgaTsKKwkJc3RydWN0IGJlX3J4X3BhZ2VfaW5mbyAqcnhfcGFnZV9pbmZvOworCQlmb3IgKGkgPSAwOyBpIDwgcG5vYi0+cnhfcV9sZW47IGkrKykgeworCQkJcnhfcGFnZV9pbmZvID0gJihwbm9iLT5yeF9wYWdlX2luZm9baV0pOworCQkJaWYgKCFwbm9iLT5yeF9wZ19zaGFyZWQgfHwgcnhfcGFnZV9pbmZvLT5wYWdlX29mZnNldCkgeworCQkJCXBjaV91bm1hcF9wYWdlKHBub2ItPmFkYXB0ZXItPnBkZXYsCisJCQkJICAgICAgIHBjaV91bm1hcF9hZGRyKHJ4X3BhZ2VfaW5mbywgYnVzKSwKKwkJCQkJICAgICAgIHBub2ItPnJ4X2J1Zl9zaXplLAorCQkJCQkgICAgICAgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCX0KKwkJCWlmIChyeF9wYWdlX2luZm8tPnBhZ2UpCisJCQkJcHV0X3BhZ2UocnhfcGFnZV9pbmZvLT5wYWdlKTsKKwkJCW1lbXNldChyeF9wYWdlX2luZm8sIDAsIHNpemVvZihzdHJ1Y3QgYmVfcnhfcGFnZV9pbmZvKSk7CisJCX0KKwkJcG5vYi0+cnhfcGdfaW5mb19oZCA9IDA7CisJfQorfQorCitzdGF0aWMgdm9pZCBiZV9kZXN0cm95X25ldG9iaihzdHJ1Y3QgYmVfbmV0X29iamVjdCAqcG5vYikKK3sKKwlpbnQgc3RhdHVzOworCisJaWYgKHBub2ItPnR4X3FfY3JlYXRlZCkgeworCQlzdGF0dXMgPSBiZV9ldGhfc3FfZGVzdHJveSgmcG5vYi0+dHhfcV9vYmopOworCQlwbm9iLT50eF9xX2NyZWF0ZWQgPSAwOworCX0KKworCWlmIChwbm9iLT5yeF9xX2NyZWF0ZWQpIHsKKwkJc3RhdHVzID0gYmVfZXRoX3JxX2Rlc3Ryb3koJnBub2ItPnJ4X3Ffb2JqKTsKKwkJaWYgKHN0YXR1cyAhPSAwKSB7CisJCQlzdGF0dXMgPSBiZV9ldGhfcnFfZGVzdHJveV9vcHRpb25zKCZwbm9iLT5yeF9xX29iaiwgMCwKKwkJCQkJCSAgICAgIE5VTEwsIE5VTEwpOworCQkJQlVHX09OKHN0YXR1cyk7CisJCX0KKwkJcG5vYi0+cnhfcV9jcmVhdGVkID0gMDsKKwl9CisKKwliZV9wcm9jZXNzX3J4X2ZsdXNoX2NtcGwocG5vYik7CisKKwlpZiAocG5vYi0+dHhfY3FfY3JlYXRlZCkgeworCQlzdGF0dXMgPSBiZV9jcV9kZXN0cm95KCZwbm9iLT50eF9jcV9vYmopOworCQlwbm9iLT50eF9jcV9jcmVhdGVkID0gMDsKKwl9CisKKwlpZiAocG5vYi0+cnhfY3FfY3JlYXRlZCkgeworCQlzdGF0dXMgPSBiZV9jcV9kZXN0cm95KCZwbm9iLT5yeF9jcV9vYmopOworCQlwbm9iLT5yeF9jcV9jcmVhdGVkID0gMDsKKwl9CisKKwlpZiAocG5vYi0+bWNjX3FfY3JlYXRlZCkgeworCQlzdGF0dXMgPSBiZV9tY2NfcmluZ19kZXN0cm95KCZwbm9iLT5tY2NfcV9vYmopOworCQlwbm9iLT5tY2NfcV9jcmVhdGVkID0gMDsKKwl9CisJaWYgKHBub2ItPm1jY19jcV9jcmVhdGVkKSB7CisJCXN0YXR1cyA9IGJlX2NxX2Rlc3Ryb3koJnBub2ItPm1jY19jcV9vYmopOworCQlwbm9iLT5tY2NfY3FfY3JlYXRlZCA9IDA7CisJfQorCisJaWYgKHBub2ItPmV2ZW50X3FfY3JlYXRlZCkgeworCQlzdGF0dXMgPSBiZV9lcV9kZXN0cm95KCZwbm9iLT5ldmVudF9xX29iaik7CisJCXBub2ItPmV2ZW50X3FfY3JlYXRlZCA9IDA7CisJfQorCWJlX2Z1bmN0aW9uX2NsZWFudXAoJnBub2ItPmZuX29iaik7Cit9CisKKy8qCisgKiBmcmVlIGFsbCByZXNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoIGEgcG5vYgorICogQ2FsbGVkIGF0IHRoZSB0aW1lIG9mIG1vZHVsZSBjbGVhbnVwIGFzIHdlbGwgYSBhbnkgZXJyb3IgZHVyaW5nCisgKiBtb2R1bGUgaW5pdC4gIFNvbWUgcmVzb3VyY2VzIG1heSBiZSBwYXJ0aWFsbHkgYWxsb2NhdGVkIGluIGEgTmV0T2JqLgorICovCitzdGF0aWMgdm9pZCBuZXRvYmplY3RfY2xlYW51cChzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciwKKwkJCXN0cnVjdCBiZV9uZXRfb2JqZWN0ICpwbm9iKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBhZGFwdGVyLT5uZXRkZXZwOworCisJaWYgKG5ldGlmX3J1bm5pbmcobmV0ZGV2KSkgeworCQluZXRpZl9zdG9wX3F1ZXVlKG5ldGRldik7CisJCWJlX3dhaXRfbmljX3R4X2NtcGx4X2NtcGwocG5vYik7CisJCWJlX2Rpc2FibGVfZXFfaW50cihwbm9iKTsKKwl9CisKKwliZV91bnJlZ2lzdGVyX2lzcihhZGFwdGVyKTsKKworCWlmIChhZGFwdGVyLT50YXNrbGV0X3N0YXJ0ZWQpIHsKKwkJdGFza2xldF9raWxsKCYoYWRhcHRlci0+c3RzX2hhbmRsZXIpKTsKKwkJYWRhcHRlci0+dGFza2xldF9zdGFydGVkID0gMDsKKwl9CisJaWYgKHBub2ItPmZuX29ial9jcmVhdGVkKQorCQliZV9kaXNhYmxlX2ludHIocG5vYik7CisKKwlpZiAoYWRhcHRlci0+ZGV2X3N0YXRlICE9IEJFX0RFVl9TVEFURV9OT05FKQorCQl1bnJlZ2lzdGVyX25ldGRldihuZXRkZXYpOworCisJaWYgKHBub2ItPmZuX29ial9jcmVhdGVkKQorCQliZV9kZXN0cm95X25ldG9iaihwbm9iKTsKKworCWFkYXB0ZXItPm5ldF9vYmogPSBOVUxMOworCWFkYXB0ZXItPm5ldGRldnAgPSBOVUxMOworCisJYmVfcnhfcV9jbGVhbihwbm9iKTsKKwlpZiAocG5vYi0+cnhfY3R4dCkgeworCQlrZnJlZShwbm9iLT5yeF9wYWdlX2luZm8pOworCQlrZnJlZShwbm9iLT5yeF9jdHh0KTsKKwl9CisKKwliZV90eF9xX2NsZWFuKHBub2IpOworCWtmcmVlKHBub2ItPnR4X2N0eHQpOworCisJaWYgKHBub2ItPm1jY19xKQorCQlwY2lfZnJlZV9jb25zaXN0ZW50KGFkYXB0ZXItPnBkZXYsIHBub2ItPm1jY19xX3NpemUsCisJCQlwbm9iLT5tY2NfcSwgcG5vYi0+bWNjX3FfYnVzKTsKKworCWlmIChwbm9iLT5tY2Nfd3JiX2N0eHQpCisJCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpcG5vYi0+bWNjX3dyYl9jdHh0LAorCQkJICAgZ2V0X29yZGVyKHBub2ItPm1jY193cmJfY3R4dF9zaXplKSk7CisKKwlpZiAocG5vYi0+bWNjX2NxKQorCQlwY2lfZnJlZV9jb25zaXN0ZW50KGFkYXB0ZXItPnBkZXYsIHBub2ItPm1jY19jcV9zaXplLAorCQkJcG5vYi0+bWNjX2NxLCBwbm9iLT5tY2NfY3FfYnVzKTsKKworCWlmIChwbm9iLT5ldmVudF9xKQorCQlwY2lfZnJlZV9jb25zaXN0ZW50KGFkYXB0ZXItPnBkZXYsIHBub2ItPmV2ZW50X3Ffc2l6ZSwKKwkJCXBub2ItPmV2ZW50X3EsIHBub2ItPmV2ZW50X3FfYnVzKTsKKworCWlmIChwbm9iLT50eF9jcSkKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChhZGFwdGVyLT5wZGV2LCBwbm9iLT50eF9jcV9zaXplLAorCQkJcG5vYi0+dHhfY3EsIHBub2ItPnR4X2NxX2J1cyk7CisKKwlpZiAocG5vYi0+dHhfcSkKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChhZGFwdGVyLT5wZGV2LCBwbm9iLT50eF9xX3NpemUsCisJCQlwbm9iLT50eF9xLCBwbm9iLT50eF9xX2J1cyk7CisKKwlpZiAocG5vYi0+cnhfcSkKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChhZGFwdGVyLT5wZGV2LCBwbm9iLT5yeF9xX3NpemUsCisJCQlwbm9iLT5yeF9xLCBwbm9iLT5yeF9xX2J1cyk7CisKKwlpZiAocG5vYi0+cnhfY3EpCisJCXBjaV9mcmVlX2NvbnNpc3RlbnQoYWRhcHRlci0+cGRldiwgcG5vYi0+cnhfY3Ffc2l6ZSwKKwkJCXBub2ItPnJ4X2NxLCBwbm9iLT5yeF9jcV9idXMpOworCisKKwlpZiAocG5vYi0+bWJfcHRyKQorCQlwY2lfZnJlZV9jb25zaXN0ZW50KGFkYXB0ZXItPnBkZXYsIHBub2ItPm1iX3NpemUsIHBub2ItPm1iX3B0ciwKKwkJCXBub2ItPm1iX2J1cyk7CisKKwlmcmVlX25ldGRldihuZXRkZXYpOworfQorCisKK3N0YXRpYyBpbnQgYmVfbm9iX3JpbmdfYWxsb2Moc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIsCisJc3RydWN0IGJlX25ldF9vYmplY3QgKnBub2IpCit7CisJdTMyIHNpemU7CisKKwkvKiBNYWlsIGJveCByZDsgbWFpbGJveCBwb2ludGVyIG5lZWRzIHRvIGJlIDE2IGJ5dGUgYWxpZ25lZCAqLworCXBub2ItPm1iX3NpemUgPSBzaXplb2Yoc3RydWN0IE1DQ19NQUlMQk9YX0FNQVApICsgMTY7CisJcG5vYi0+bWJfcHRyID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQoYWRhcHRlci0+cGRldiwgcG5vYi0+bWJfc2l6ZSwKKwkJCQkmcG5vYi0+bWJfYnVzKTsKKwlpZiAoIXBub2ItPm1iX2J1cykKKwkJcmV0dXJuIC0xOworCW1lbXNldChwbm9iLT5tYl9wdHIsIDAsIHBub2ItPm1iX3NpemUpOworCXBub2ItPm1iX3JkLnZhID0gUFRSX0FMSUdOKHBub2ItPm1iX3B0ciwgMTYpOworCXBub2ItPm1iX3JkLnBhID0gUFRSX0FMSUdOKHBub2ItPm1iX2J1cywgMTYpOworCXBub2ItPm1iX3JkLmxlbmd0aCA9IHNpemVvZihzdHJ1Y3QgTUNDX01BSUxCT1hfQU1BUCk7CisJLyoKKwkgKiBFdmVudCBxdWV1ZQorCSAqLworCXBub2ItPmV2ZW50X3FfbGVuID0gRVZFTlRfUV9MRU47CisJcG5vYi0+ZXZlbnRfcV9zaXplID0gcG5vYi0+ZXZlbnRfcV9sZW4gKiBzaXplb2Yoc3RydWN0IEVRX0VOVFJZX0FNQVApOworCXBub2ItPmV2ZW50X3EgPSBwY2lfYWxsb2NfY29uc2lzdGVudChhZGFwdGVyLT5wZGV2LCBwbm9iLT5ldmVudF9xX3NpemUsCisJCQkJJnBub2ItPmV2ZW50X3FfYnVzKTsKKwlpZiAoIXBub2ItPmV2ZW50X3FfYnVzKQorCQlyZXR1cm4gLTE7CisJbWVtc2V0KHBub2ItPmV2ZW50X3EsIDAsIHBub2ItPmV2ZW50X3Ffc2l6ZSk7CisJLyoKKwkgKiBFdGggVFggcXVldWUKKwkgKi8KKwlwbm9iLT50eF9xX2xlbiA9IEVUSF9UWFFfTEVOOworCXBub2ItPnR4X3FfcG9ydCA9IDA7CisJcG5vYi0+dHhfcV9zaXplID0gIHBub2ItPnR4X3FfbGVuICogc2l6ZW9mKHN0cnVjdCBFVEhfV1JCX0FNQVApOworCXBub2ItPnR4X3EgPSBwY2lfYWxsb2NfY29uc2lzdGVudChhZGFwdGVyLT5wZGV2LCBwbm9iLT50eF9xX3NpemUsCisJCQkJJnBub2ItPnR4X3FfYnVzKTsKKwlpZiAoIXBub2ItPnR4X3FfYnVzKQorCQlyZXR1cm4gLTE7CisJbWVtc2V0KHBub2ItPnR4X3EsIDAsIHBub2ItPnR4X3Ffc2l6ZSk7CisJLyoKKwkgKiBFdGggVFggQ29tcGwgcXVldWUKKwkgKi8KKwlwbm9iLT50eGNxX2xlbiA9IEVUSF9UWENRX0xFTjsKKwlwbm9iLT50eF9jcV9zaXplID0gcG5vYi0+dHhjcV9sZW4gKiBzaXplb2Yoc3RydWN0IEVUSF9UWF9DT01QTF9BTUFQKTsKKwlwbm9iLT50eF9jcSA9IHBjaV9hbGxvY19jb25zaXN0ZW50KGFkYXB0ZXItPnBkZXYsIHBub2ItPnR4X2NxX3NpemUsCisJCQkJJnBub2ItPnR4X2NxX2J1cyk7CisJaWYgKCFwbm9iLT50eF9jcV9idXMpCisJCXJldHVybiAtMTsKKwltZW1zZXQocG5vYi0+dHhfY3EsIDAsIHBub2ItPnR4X2NxX3NpemUpOworCS8qCisJICogRXRoIFJYIHF1ZXVlCisJICovCisJcG5vYi0+cnhfcV9sZW4gPSBFVEhfUlhRX0xFTjsKKwlwbm9iLT5yeF9xX3NpemUgPSAgcG5vYi0+cnhfcV9sZW4gKiBzaXplb2Yoc3RydWN0IEVUSF9SWF9EX0FNQVApOworCXBub2ItPnJ4X3EgPSBwY2lfYWxsb2NfY29uc2lzdGVudChhZGFwdGVyLT5wZGV2LCBwbm9iLT5yeF9xX3NpemUsCisJCQkJJnBub2ItPnJ4X3FfYnVzKTsKKwlpZiAoIXBub2ItPnJ4X3FfYnVzKQorCQlyZXR1cm4gLTE7CisJbWVtc2V0KHBub2ItPnJ4X3EsIDAsIHBub2ItPnJ4X3Ffc2l6ZSk7CisJLyoKKwkgKiBFdGggVW5pY2FzdCBSWCBDb21wbCBxdWV1ZQorCSAqLworCXBub2ItPnJ4X2NxX2xlbiA9IEVUSF9VQ19SWENRX0xFTjsKKwlwbm9iLT5yeF9jcV9zaXplID0gIHBub2ItPnJ4X2NxX2xlbiAqCisJCQlzaXplb2Yoc3RydWN0IEVUSF9SWF9DT01QTF9BTUFQKTsKKwlwbm9iLT5yeF9jcSA9IHBjaV9hbGxvY19jb25zaXN0ZW50KGFkYXB0ZXItPnBkZXYsIHBub2ItPnJ4X2NxX3NpemUsCisJCQkJJnBub2ItPnJ4X2NxX2J1cyk7CisJaWYgKCFwbm9iLT5yeF9jcV9idXMpCisJCXJldHVybiAtMTsKKwltZW1zZXQocG5vYi0+cnhfY3EsIDAsIHBub2ItPnJ4X2NxX3NpemUpOworCisJLyogVFggcmVzb3VyY2VzICovCisJc2l6ZSA9IHBub2ItPnR4X3FfbGVuICogc2l6ZW9mKHZvaWQgKiopOworCXBub2ItPnR4X2N0eHQgPSBremFsbG9jKHNpemUsIEdGUF9LRVJORUwpOworCWlmIChwbm9iLT50eF9jdHh0ID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCS8qIFJYIHJlc291cmNlcyAqLworCXNpemUgPSBwbm9iLT5yeF9xX2xlbiAqIHNpemVvZih2b2lkICopOworCXBub2ItPnJ4X2N0eHQgPSBremFsbG9jKHNpemUsIEdGUF9LRVJORUwpOworCWlmIChwbm9iLT5yeF9jdHh0ID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCXNpemUgPSAocG5vYi0+cnhfcV9sZW4gKiBzaXplb2Yoc3RydWN0IGJlX3J4X3BhZ2VfaW5mbykpOworCXBub2ItPnJ4X3BhZ2VfaW5mbyA9IGt6YWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKHBub2ItPnJ4X3BhZ2VfaW5mbyA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisKKwlhZGFwdGVyLT5ldGhfc3RhdHNwID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IEZXQ01EX0VUSF9HRVRfU1RBVElTVElDUyksCisJCQkJR0ZQX0tFUk5FTCk7CisJaWYgKGFkYXB0ZXItPmV0aF9zdGF0c3AgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCXBub2ItPnJ4X2J1Zl9zaXplID0gcnhidWZfc2l6ZTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAgICBUaGlzIGZ1bmN0aW9uIGluaXRpYWxpemVzIHRoZSBiZV9uZXRfb2JqZWN0IGZvciBzdWJzZXF1ZW50CisgICAgbmV0d29yayBvcGVyYXRpb25zLgorCisgICAgQmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiwgdGhlIGRyaXZlciAgbXVzdCBoYXZlIGFsbG9jYXRlZAorICAgIHNwYWNlIGZvciB0aGUgTmV0T2JqZWN0IHN0cnVjdHVyZSwgaW5pdGlhbGl6ZWQgdGhlIHN0cnVjdHVyZSwKKyAgICBhbGxvY2F0ZWQgRE1BYWJsZSBtZW1vcnkgZm9yIGFsbCB0aGUgbmV0d29yayBxdWV1ZXMgdGhhdCBmb3JtCisgICAgcGFydCBvZiB0aGUgTmV0T2JqZWN0IGFuZCBwb3B1bGF0ZWQgdGhlIHN0YXJ0IGFkZHJlc3MgKHZpcnR1YWwpCisgICAgYW5kIG51bWJlciBvZiBlbnRyaWVzIGFsbG9jYXRlZCBmb3IgZWFjaCBxdWV1ZSBpbiB0aGUgTmV0T2JqZWN0IHN0cnVjdHVyZS4KKworICAgIFRoZSBkcml2ZXIgbXVzdCBhbHNvIGhhdmUgYWxsb2NhdGVkIG1lbW9yeSB0byBob2xkIHRoZQorICAgIG1haWxib3ggc3RydWN0dXJlIChNQ0NfTUFJTEJPWCkgYW5kIHBvc3QgdGhlIHBoeXNpY2FsIGFkZHJlc3MsCisgICAgdmlydHVhbCBhZGRyZXNzZXMgYW5kIHRoZSBzaXplIG9mIHRoZSBtYWlsYm94IG1lbW9yeSBpbiB0aGUKKyAgICBOZXRPYmoubWJfcmQuICBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIGJ5IEJFQ0xJQiBmb3IKKyAgICBpbml0aWFsIGNvbW11bmljYXRpb24gd2l0aCB0aGUgZW1iZWRkZWQgTUNDIHByb2Nlc3Nvci4gQkVDTElCCisgICAgdXNlcyB0aGUgbWFpbGJveCB1bnRpbCBNQ0MgcmluZ3MgYXJlIGNyZWF0ZWQgZm9yICBtb3JlICBlZmZpY2llbnQKKyAgICBjb21tdW5pY2F0aW9uIHdpdGggdGhlIE1DQyBwcm9jZXNzb3IuCisKKyAgICBJZiB0aGUgZHJpdmVyIHdhbnRzIHRvIGNyZWF0ZSBtdWx0aXBsZSBuZXR3b3JrIGludGVyZmFjZSBmb3IgbW9yZQorICAgIHRoYW4gb25lIHByb3RlY3Rpb24gZG9tYWluLCBpdCBjYW4gY2FsbCBiZV9jcmVhdGVfbmV0b2JqKCkKKyAgICBtdWx0aXBsZSB0aW1lcyAgb25jZSBmb3IgZWFjaCBwcm90ZWN0aW9uIGRvbWFpbi4gIEEgTWF4aW11bSBvZgorICAgIDMyIHByb3RlY3Rpb24gZG9tYWlucyBhcmUgc3VwcG9ydGVkLgorCisqLworc3RhdGljIGludAorYmVfY3JlYXRlX25ldG9iaihzdHJ1Y3QgYmVfbmV0X29iamVjdCAqcG5vYiwgdTggX19pb21lbSAqY3NyX3ZhLAorCXU4IF9faW9tZW0gKmRiX3ZhLCB1OCBfX2lvbWVtICpwY2lfdmEpCit7CisJaW50IHN0YXR1cyA9IDA7CisJYm9vbCAgZXZlbnRhYmxlID0gZmFsc2UsIHR4X25vX2RlbGF5ID0gZmFsc2UsIHJ4X25vX2RlbGF5ID0gZmFsc2U7CisJc3RydWN0IGJlX2VxX29iamVjdCAqZXFfb2JqZWN0cCA9IE5VTEw7CisJc3RydWN0IGJlX2Z1bmN0aW9uX29iamVjdCAqcGZvYiA9ICZwbm9iLT5mbl9vYmo7CisJc3RydWN0IHJpbmdfZGVzYyByZDsKKwl1MzIgc2V0X3J4YnVmX3NpemU7CisJdTMyIHR4X2NtcGxfd20gPSBDRVZfV01BUktfOTY7CS8qIDB4ZmZmZmZmZmYgdG8gZGlzYWJsZSAqLworCXUzMiByeF9jbXBsX3dtID0gQ0VWX1dNQVJLXzE2MDsJLyogMHhmZmZmZmZmZiB0byBkaXNhYmxlICovCisJdTMyIGVxX2RlbGF5ID0gMDsgLyogZGVsYXkgaW4gOHVzZWMgdW5pdHMuIDB4ZmZmZmZmZmYgdG8gZGlzYWJsZSAqLworCisJbWVtc2V0KCZyZCwgMCwgc2l6ZW9mKHN0cnVjdCByaW5nX2Rlc2MpKTsKKworCXN0YXR1cyA9IGJlX2Z1bmN0aW9uX29iamVjdF9jcmVhdGUoY3NyX3ZhLCBkYl92YSwgcGNpX3ZhLAorCQkJQkVfRlVOQ1RJT05fVFlQRV9ORVRXT1JLLCAmcG5vYi0+bWJfcmQsIHBmb2IpOworCWlmIChzdGF0dXMgIT0gQkVfU1VDQ0VTUykKKwkJcmV0dXJuIHN0YXR1czsKKwlwbm9iLT5mbl9vYmpfY3JlYXRlZCA9IHRydWU7CisKKwlpZiAodHhfY21wbF93bSA9PSAweGZmZmZmZmZmKQorCQl0eF9ub19kZWxheSA9IHRydWU7CisJaWYgKHJ4X2NtcGxfd20gPT0gMHhmZmZmZmZmZikKKwkJcnhfbm9fZGVsYXkgPSB0cnVlOworCS8qCisJICogbm93IGNyZWF0ZSB0aGUgbmVjZXNzYXJ5IHJpbmdzCisJICogRXZlbnQgUXVldWUgZmlyc3QuCisJICovCisJaWYgKHBub2ItPmV2ZW50X3FfbGVuKSB7CisJCXJkLnZhID0gcG5vYi0+ZXZlbnRfcTsKKwkJcmQucGEgPSBwbm9iLT5ldmVudF9xX2J1czsKKwkJcmQubGVuZ3RoID0gcG5vYi0+ZXZlbnRfcV9zaXplOworCisJCXN0YXR1cyA9IGJlX2VxX2NyZWF0ZShwZm9iLCAmcmQsIDQsIHBub2ItPmV2ZW50X3FfbGVuLAorCQkJCSh1MzIpIC0xLAkvKiBDRVZfV01BUktfKiBvciAtMSAqLworCQkJCWVxX2RlbGF5LAkvKiBpbiA4dXMgdW5pdHMsIG9yIC0xICovCisJCQkJJnBub2ItPmV2ZW50X3Ffb2JqKTsKKwkJaWYgKHN0YXR1cyAhPSBCRV9TVUNDRVNTKQorCQkJZ290byBlcnJvcl9yZXQ7CisJCXBub2ItPmV2ZW50X3FfaWQgPSBwbm9iLT5ldmVudF9xX29iai5lcV9pZDsKKwkJcG5vYi0+ZXZlbnRfcV9jcmVhdGVkID0gMTsKKwkJZXZlbnRhYmxlID0gdHJ1ZTsKKwkJZXFfb2JqZWN0cCA9ICZwbm9iLT5ldmVudF9xX29iajsKKwl9CisJLyoKKwkgKiBOb3cgRXRoIFR4IENvbXBsLiBxdWV1ZS4KKwkgKi8KKwlpZiAocG5vYi0+dHhjcV9sZW4pIHsKKwkJcmQudmEgPSBwbm9iLT50eF9jcTsKKwkJcmQucGEgPSBwbm9iLT50eF9jcV9idXM7CisJCXJkLmxlbmd0aCA9IHBub2ItPnR4X2NxX3NpemU7CisKKwkJc3RhdHVzID0gYmVfY3FfY3JlYXRlKHBmb2IsICZyZCwKKwkJCXBub2ItPnR4Y3FfbGVuICogc2l6ZW9mKHN0cnVjdCBFVEhfVFhfQ09NUExfQU1BUCksCisJCQlmYWxzZSwJLyogc29saWN0ZWQgZXZlbnRzLCAgKi8KKwkJCXR4X25vX2RlbGF5LAkvKiBub2RlbGF5ICAqLworCQkJdHhfY21wbF93bSwJLyogV2F0ZXJtYXJrIGVuY29kaW5ncyAqLworCQkJZXFfb2JqZWN0cCwgJnBub2ItPnR4X2NxX29iaik7CisJCWlmIChzdGF0dXMgIT0gQkVfU1VDQ0VTUykKKwkJCWdvdG8gZXJyb3JfcmV0OworCisJCXBub2ItPnR4X2NxX2lkID0gcG5vYi0+dHhfY3Ffb2JqLmNxX2lkOworCQlwbm9iLT50eF9jcV9jcmVhdGVkID0gMTsKKwl9CisJLyoKKwkgKiBFdGggVHggcXVldWUKKwkgKi8KKwlpZiAocG5vYi0+dHhfcV9sZW4pIHsKKwkJc3RydWN0IGJlX2V0aF9zcV9wYXJhbWV0ZXJzIGV4X3BhcmFtcyA9IHsgMCB9OworCQl1MzIgdHlwZTsKKworCQlpZiAocG5vYi0+dHhfcV9wb3J0KSB7CisJCQkvKiBUWFEgdG8gYmUgYm91bmQgdG8gYSBzcGVjaWZpYyBwb3J0ICovCisJCQl0eXBlID0gQkVfRVRIX1RYX1JJTkdfVFlQRV9CT1VORDsKKwkJCWV4X3BhcmFtcy5wb3J0ID0gcG5vYi0+dHhfcV9wb3J0IC0gMTsKKwkJfSBlbHNlCisJCQl0eXBlID0gQkVfRVRIX1RYX1JJTkdfVFlQRV9TVEFOREFSRDsKKworCQlyZC52YSA9IHBub2ItPnR4X3E7CisJCXJkLnBhID0gcG5vYi0+dHhfcV9idXM7CisJCXJkLmxlbmd0aCA9IHBub2ItPnR4X3Ffc2l6ZTsKKworCQlzdGF0dXMgPSBiZV9ldGhfc3FfY3JlYXRlX2V4KHBmb2IsICZyZCwKKwkJCQlwbm9iLT50eF9xX2xlbiAqIHNpemVvZihzdHJ1Y3QgRVRIX1dSQl9BTUFQKSwKKwkJCQl0eXBlLCAyLCAmcG5vYi0+dHhfY3Ffb2JqLAorCQkJCSZleF9wYXJhbXMsICZwbm9iLT50eF9xX29iaik7CisKKwkJaWYgKHN0YXR1cyAhPSBCRV9TVUNDRVNTKQorCQkJZ290byBlcnJvcl9yZXQ7CisKKwkJcG5vYi0+dHhfcV9pZCA9IHBub2ItPnR4X3Ffb2JqLmJpZDsKKwkJcG5vYi0+dHhfcV9jcmVhdGVkID0gMTsKKwl9CisJLyoKKwkgKiBOb3cgRXRoIFJ4IGNvbXBsLiBxdWV1ZS4gIEFsd2F5cyBuZWVkZWQuCisJICovCisJcmQudmEgPSBwbm9iLT5yeF9jcTsKKwlyZC5wYSA9IHBub2ItPnJ4X2NxX2J1czsKKwlyZC5sZW5ndGggPSBwbm9iLT5yeF9jcV9zaXplOworCisJc3RhdHVzID0gYmVfY3FfY3JlYXRlKHBmb2IsICZyZCwKKwkJCXBub2ItPnJ4X2NxX2xlbiAqIHNpemVvZihzdHJ1Y3QgRVRIX1JYX0NPTVBMX0FNQVApLAorCQkJZmFsc2UsCS8qIHNvbGljdGVkIGV2ZW50cywgICovCisJCQlyeF9ub19kZWxheSwJLyogbm9kZWxheSAgKi8KKwkJCXJ4X2NtcGxfd20sCS8qIFdhdGVybWFyayBlbmNvZGluZ3MgKi8KKwkJCWVxX29iamVjdHAsICZwbm9iLT5yeF9jcV9vYmopOworCWlmIChzdGF0dXMgIT0gQkVfU1VDQ0VTUykKKwkJZ290byBlcnJvcl9yZXQ7CisKKwlwbm9iLT5yeF9jcV9pZCA9IHBub2ItPnJ4X2NxX29iai5jcV9pZDsKKwlwbm9iLT5yeF9jcV9jcmVhdGVkID0gMTsKKworCXN0YXR1cyA9IGJlX2V0aF9ycV9zZXRfZnJhZ19zaXplKHBmb2IsIHBub2ItPnJ4X2J1Zl9zaXplLAorCQkJKHUzMiAqKSAmc2V0X3J4YnVmX3NpemUpOworCWlmIChzdGF0dXMgIT0gQkVfU1VDQ0VTUykgeworCQliZV9ldGhfcnFfZ2V0X2ZyYWdfc2l6ZShwZm9iLCAodTMyICopICZwbm9iLT5yeF9idWZfc2l6ZSk7CisJCWlmICgocG5vYi0+cnhfYnVmX3NpemUgIT0gMjA0OCkgJiYgKHBub2ItPnJ4X2J1Zl9zaXplICE9IDQwOTYpCisJCSAgICAmJiAocG5vYi0+cnhfYnVmX3NpemUgIT0gODE5MikpCisJCQlnb3RvIGVycm9yX3JldDsKKwl9IGVsc2UgeworCQlpZiAocG5vYi0+cnhfYnVmX3NpemUgIT0gc2V0X3J4YnVmX3NpemUpCisJCQlwbm9iLT5yeF9idWZfc2l6ZSA9IHNldF9yeGJ1Zl9zaXplOworCX0KKwkvKgorCSAqIEV0aCBSWCBxdWV1ZS4gYmVfZXRoX3JxX2NyZWF0ZSgpIGFsd2F5cyBhc3N1bWVzIDIgcGFnZXMgc2l6ZQorCSAqLworCXJkLnZhID0gcG5vYi0+cnhfcTsKKwlyZC5wYSA9IHBub2ItPnJ4X3FfYnVzOworCXJkLmxlbmd0aCA9IHBub2ItPnJ4X3Ffc2l6ZTsKKworCXN0YXR1cyA9IGJlX2V0aF9ycV9jcmVhdGUocGZvYiwgJnJkLCAmcG5vYi0+cnhfY3Ffb2JqLAorCQkJICAgICAmcG5vYi0+cnhfY3Ffb2JqLCAmcG5vYi0+cnhfcV9vYmopOworCisJaWYgKHN0YXR1cyAhPSBCRV9TVUNDRVNTKQorCQlnb3RvIGVycm9yX3JldDsKKworCXBub2ItPnJ4X3FfaWQgPSBwbm9iLT5yeF9xX29iai5yaWQ7CisJcG5vYi0+cnhfcV9jcmVhdGVkID0gMTsKKworCXJldHVybiBCRV9TVUNDRVNTOwkvKiBBbGwgcmVxdWlyZWQgcXVldWVzIGNyZWF0ZWQuICovCisKK2Vycm9yX3JldDoKKwliZV9kZXN0cm95X25ldG9iaihwbm9iKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IGJlX25vYl9yaW5nX2luaXQoc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIsCisJCQkJc3RydWN0IGJlX25ldF9vYmplY3QgKnBub2IpCit7CisJaW50IHN0YXR1czsKKworCXBub2ItPmV2ZW50X3FfdGwgPSAwOworCisJcG5vYi0+dHhfcV9oZCA9IDA7CisJcG5vYi0+dHhfcV90bCA9IDA7CisKKwlwbm9iLT50eF9jcV90bCA9IDA7CisKKwlwbm9iLT5yeF9jcV90bCA9IDA7CisKKwltZW1zZXQocG5vYi0+ZXZlbnRfcSwgMCwgcG5vYi0+ZXZlbnRfcV9zaXplKTsKKwltZW1zZXQocG5vYi0+dHhfY3EsIDAsIHBub2ItPnR4X2NxX3NpemUpOworCW1lbXNldChwbm9iLT50eF9jdHh0LCAwLCBwbm9iLT50eF9xX2xlbiAqIHNpemVvZih2b2lkICoqKSk7CisJbWVtc2V0KHBub2ItPnJ4X2N0eHQsIDAsIHBub2ItPnJ4X3FfbGVuICogc2l6ZW9mKHZvaWQgKikpOworCXBub2ItPnJ4X3BnX2luZm9faGQgPSAwOworCXBub2ItPnJ4X3FfaGQgPSAwOworCWF0b21pY19zZXQoJnBub2ItPnJ4X3FfcG9zdGVkLCAwKTsKKworCXN0YXR1cyA9IGJlX2NyZWF0ZV9uZXRvYmoocG5vYiwgYWRhcHRlci0+Y3NyX3ZhLCBhZGFwdGVyLT5kYl92YSwKKwkJCQlhZGFwdGVyLT5wY2lfdmEpOworCWlmIChzdGF0dXMgIT0gQkVfU1VDQ0VTUykKKwkJcmV0dXJuIC0xOworCisJYmVfcG9zdF9ldGhfcnhfYnVmZnMocG5vYik7CisJcmV0dXJuIDA7Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyBhc3luYyBjYWxsYmFjayBmb3IgbGluayBzdGF0dXMgKi8KK3N0YXRpYyB2b2lkCitiZV9saW5rX3N0YXR1c19hc3luY19jYWxsYmFjayh2b2lkICpjb250ZXh0LCB1MzIgZXZlbnRfY29kZSwgdm9pZCAqZXZlbnQpCit7CisJc3RydWN0IEFTWU5DX0VWRU5UX0xJTktfU1RBVEVfQU1BUCAqbGlua19zdGF0dXMgPSBldmVudDsKKwlzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciA9IGNvbnRleHQ7CisJYm9vbCBsaW5rX2VuYWJsZSA9IGZhbHNlOworCXN0cnVjdCBiZV9uZXRfb2JqZWN0ICpwbm9iOworCXN0cnVjdCBBU1lOQ19FVkVOVF9UUkFJTEVSX0FNQVAgKmFzeW5jX3RyYWlsZXI7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKKwl1MzIgYXN5bmNfZXZlbnRfY29kZSwgYXN5bmNfZXZlbnRfdHlwZSwgYWN0aXZlX3BvcnQ7CisJdTMyIHBvcnQwX2xpbmtfc3RhdHVzLCBwb3J0MV9saW5rX3N0YXR1cywgcG9ydDBfZHVwbGV4LCBwb3J0MV9kdXBsZXg7CisJdTMyIHBvcnQwX3NwZWVkLCBwb3J0MV9zcGVlZDsKKworCWlmIChldmVudF9jb2RlICE9IEFTWU5DX0VWRU5UX0NPREVfTElOS19TVEFURSkgeworCQkvKiBOb3Qgb3VyIGV2ZW50IHRvIGhhbmRsZSAqLworCQlyZXR1cm47CisJfQorCWFzeW5jX3RyYWlsZXIgPSAoc3RydWN0IEFTWU5DX0VWRU5UX1RSQUlMRVJfQU1BUCAqKQorCSAgICAoKHU4ICopIGV2ZW50ICsgc2l6ZW9mKHN0cnVjdCBNQ0NfQ1FfRU5UUllfQU1BUCkgLQorCSAgICAgc2l6ZW9mKHN0cnVjdCBBU1lOQ19FVkVOVF9UUkFJTEVSX0FNQVApKTsKKworCWFzeW5jX2V2ZW50X2NvZGUgPSBBTUFQX0dFVF9CSVRTX1BUUihBU1lOQ19FVkVOVF9UUkFJTEVSLCBldmVudF9jb2RlLAorCQkJCQkgICAgIGFzeW5jX3RyYWlsZXIpOworCUJVR19PTihhc3luY19ldmVudF9jb2RlICE9IEFTWU5DX0VWRU5UX0NPREVfTElOS19TVEFURSk7CisKKwlwbm9iID0gYWRhcHRlci0+bmV0X29iajsKKwluZXRkZXYgPSBwbm9iLT5uZXRkZXY7CisKKwkvKiBEZXRlcm1pbmUgaWYgdGhpcyBldmVudCBpcyBhIHN3aXRjaCBWTEQgb3IgYSBwaHlzaWNhbCBsaW5rIGV2ZW50ICovCisJYXN5bmNfZXZlbnRfdHlwZSA9IEFNQVBfR0VUX0JJVFNfUFRSKEFTWU5DX0VWRU5UX1RSQUlMRVIsIGV2ZW50X3R5cGUsCisJCQkJCSAgICAgYXN5bmNfdHJhaWxlcik7CisJYWN0aXZlX3BvcnQgPSBBTUFQX0dFVF9CSVRTX1BUUihBU1lOQ19FVkVOVF9MSU5LX1NUQVRFLAorCQkJCQlhY3RpdmVfcG9ydCwgbGlua19zdGF0dXMpOworCXBvcnQwX2xpbmtfc3RhdHVzID0gQU1BUF9HRVRfQklUU19QVFIoQVNZTkNfRVZFTlRfTElOS19TVEFURSwKKwkJCQkJICAgICAgcG9ydDBfbGlua19zdGF0dXMsIGxpbmtfc3RhdHVzKTsKKwlwb3J0MV9saW5rX3N0YXR1cyA9IEFNQVBfR0VUX0JJVFNfUFRSKEFTWU5DX0VWRU5UX0xJTktfU1RBVEUsCisJCQkJCSAgICAgIHBvcnQxX2xpbmtfc3RhdHVzLCBsaW5rX3N0YXR1cyk7CisJcG9ydDBfZHVwbGV4ID0gQU1BUF9HRVRfQklUU19QVFIoQVNZTkNfRVZFTlRfTElOS19TVEFURSwKKwkJCQkJIHBvcnQwX2R1cGxleCwgbGlua19zdGF0dXMpOworCXBvcnQxX2R1cGxleCA9IEFNQVBfR0VUX0JJVFNfUFRSKEFTWU5DX0VWRU5UX0xJTktfU1RBVEUsCisJCQkJCSBwb3J0MV9kdXBsZXgsIGxpbmtfc3RhdHVzKTsKKwlwb3J0MF9zcGVlZCA9IEFNQVBfR0VUX0JJVFNfUFRSKEFTWU5DX0VWRU5UX0xJTktfU1RBVEUsCisJCQkJCXBvcnQwX3NwZWVkLCBsaW5rX3N0YXR1cyk7CisJcG9ydDFfc3BlZWQgPSBBTUFQX0dFVF9CSVRTX1BUUihBU1lOQ19FVkVOVF9MSU5LX1NUQVRFLAorCQkJCQlwb3J0MV9zcGVlZCwgbGlua19zdGF0dXMpOworCWlmIChhc3luY19ldmVudF90eXBlID09IE5UV0tfTElOS19UWVBFX1ZJUlRVQUwpIHsKKwkJYWRhcHRlci0+YmVfc3RhdC5iZXNfbGlua19jaGFuZ2VfdmlydHVhbCsrOworCQlpZiAoYWRhcHRlci0+YmVfbGlua19zdHMtPmFjdGl2ZV9wb3J0ICE9IGFjdGl2ZV9wb3J0KSB7CisJCQlkZXZfbm90aWNlKCZuZXRkZXYtPmRldiwKKwkJCSAgICAgICAiQWN0aXZlIHBvcnQgY2hhbmdlZCBkdWUgdG8gVkxEIG9uIHN3aXRjaFxuIik7CisJCX0gZWxzZSB7CisJCQlkZXZfbm90aWNlKCZuZXRkZXYtPmRldiwgIkxpbmsgc3RhdHVzIHVwZGF0ZVxuIik7CisJCX0KKworCX0gZWxzZSB7CisJCWFkYXB0ZXItPmJlX3N0YXQuYmVzX2xpbmtfY2hhbmdlX3BoeXNpY2FsKys7CisJCWlmIChhZGFwdGVyLT5iZV9saW5rX3N0cy0+YWN0aXZlX3BvcnQgIT0gYWN0aXZlX3BvcnQpIHsKKwkJCWRldl9ub3RpY2UoJm5ldGRldi0+ZGV2LAorCQkJICAgICAgICJBY3RpdmUgcG9ydCBjaGFuZ2VkIGR1ZSB0byBwb3J0IGxpbmsiCisJCQkgICAgICAgIiBzdGF0dXMgY2hhbmdlXG4iKTsKKwkJfSBlbHNlIHsKKwkJCWRldl9ub3RpY2UoJm5ldGRldi0+ZGV2LCAiTGluayBzdGF0dXMgdXBkYXRlXG4iKTsKKwkJfQorCX0KKworCW1lbXNldChhZGFwdGVyLT5iZV9saW5rX3N0cywgMCwgc2l6ZW9mKGFkYXB0ZXItPmJlX2xpbmtfc3RzKSk7CisKKwlpZiAoKHBvcnQwX2xpbmtfc3RhdHVzID09IEFTWU5DX0VWRU5UX0xJTktfVVApIHx8CisJICAgIChwb3J0MV9saW5rX3N0YXR1cyA9PSBBU1lOQ19FVkVOVF9MSU5LX1VQKSkgeworCQlpZiAoKGFkYXB0ZXItPnBvcnQwX2xpbmtfc3RzID09IEJFX1BPUlRfTElOS19ET1dOKSAmJgorCQkgICAgKGFkYXB0ZXItPnBvcnQxX2xpbmtfc3RzID09IEJFX1BPUlRfTElOS19ET1dOKSkgeworCQkJLyogRWFybGllciBib3RoIHRoZSBwb3J0cyBhcmUgZG93biBTbyBsaW5rIGlzIHVwICovCisJCQlsaW5rX2VuYWJsZSA9IHRydWU7CisJCX0KKworCQlpZiAocG9ydDBfbGlua19zdGF0dXMgPT0gQVNZTkNfRVZFTlRfTElOS19VUCkgeworCQkJYWRhcHRlci0+cG9ydDBfbGlua19zdHMgPSBCRV9QT1JUX0xJTktfVVA7CisJCQlhZGFwdGVyLT5iZV9saW5rX3N0cy0+bWFjMF9kdXBsZXggPSBwb3J0MF9kdXBsZXg7CisJCQlhZGFwdGVyLT5iZV9saW5rX3N0cy0+bWFjMF9zcGVlZCA9IHBvcnQwX3NwZWVkOworCQkJaWYgKGFjdGl2ZV9wb3J0ID09IE5UV0tfUE9SVF9BKQorCQkJCWFkYXB0ZXItPmJlX2xpbmtfc3RzLT5hY3RpdmVfcG9ydCA9IDA7CisJCX0gZWxzZQorCQkJYWRhcHRlci0+cG9ydDBfbGlua19zdHMgPSBCRV9QT1JUX0xJTktfRE9XTjsKKworCQlpZiAocG9ydDFfbGlua19zdGF0dXMgPT0gQVNZTkNfRVZFTlRfTElOS19VUCkgeworCQkJYWRhcHRlci0+cG9ydDFfbGlua19zdHMgPSBCRV9QT1JUX0xJTktfVVA7CisJCQlhZGFwdGVyLT5iZV9saW5rX3N0cy0+bWFjMV9kdXBsZXggPSBwb3J0MV9kdXBsZXg7CisJCQlhZGFwdGVyLT5iZV9saW5rX3N0cy0+bWFjMV9zcGVlZCA9IHBvcnQxX3NwZWVkOworCQkJaWYgKGFjdGl2ZV9wb3J0ID09IE5UV0tfUE9SVF9CKQorCQkJCWFkYXB0ZXItPmJlX2xpbmtfc3RzLT5hY3RpdmVfcG9ydCA9IDE7CisJCX0gZWxzZQorCQkJYWRhcHRlci0+cG9ydDFfbGlua19zdHMgPSBCRV9QT1JUX0xJTktfRE9XTjsKKworCQlwcmludGsoS0VSTl9JTkZPICJMaW5rIFByb3BlcnRpZXMgZm9yICVzOlxuIiwgbmV0ZGV2LT5uYW1lKTsKKwkJZGV2X2luZm8oJm5ldGRldi0+ZGV2LCAiTGluayBQcm9wZXJ0aWVzOlxuIik7CisJCWJlX3ByaW50X2xpbmtfaW5mbyhhZGFwdGVyLT5iZV9saW5rX3N0cyk7CisKKwkJaWYgKCFsaW5rX2VuYWJsZSkKKwkJCXJldHVybjsKKwkJLyoKKwkJICogQm90aCBwb3J0cyB3ZXJlIGRvd24gcHJldmlvdXNseSwgYnV0IGF0bGVhc3Qgb25lIG9mCisJCSAqIHRoZW0gaGFzIGNvbWUgdXAgaWYgdGhpcyBuZXRkZXZpY2UncyBjYXJyaWVyIGlzIG5vdCB1cCwKKwkJICogdGhlbiBpbmRpY2F0ZSB0byBzdGFjaworCQkgKi8KKwkJaWYgKCFuZXRpZl9jYXJyaWVyX29rKG5ldGRldikpIHsKKwkJCW5ldGlmX3N0YXJ0X3F1ZXVlKG5ldGRldik7CisJCQluZXRpZl9jYXJyaWVyX29uKG5ldGRldik7CisJCX0KKwkJcmV0dXJuOworCX0KKworCS8qIE5vdyBib3RoIHRoZSBwb3J0cyBhcmUgZG93bi4gVGVsbCB0aGUgc3RhY2sgYWJvdXQgaXQgKi8KKwlkZXZfaW5mbygmbmV0ZGV2LT5kZXYsICJCb3RoIHBvcnRzIGFyZSBkb3duXG4iKTsKKwlhZGFwdGVyLT5wb3J0MF9saW5rX3N0cyA9IEJFX1BPUlRfTElOS19ET1dOOworCWFkYXB0ZXItPnBvcnQxX2xpbmtfc3RzID0gQkVfUE9SVF9MSU5LX0RPV047CisJaWYgKG5ldGlmX2NhcnJpZXJfb2sobmV0ZGV2KSkgeworCQluZXRpZl9jYXJyaWVyX29mZihuZXRkZXYpOworCQluZXRpZl9zdG9wX3F1ZXVlKG5ldGRldik7CisJfQorCXJldHVybjsKK30KKworc3RhdGljIGludCBiZV9tY2NfY3JlYXRlKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyKQoreworCXN0cnVjdCBiZV9uZXRfb2JqZWN0ICpwbm9iOworCisJcG5vYiA9IGFkYXB0ZXItPm5ldF9vYmo7CisJLyoKKwkgKiBDcmVhdGUgdGhlIE1DQyByaW5nIHNvIHRoYXQgYWxsIGZ1cnRoZXIgY29tbXVuaWNhdGlvbiB3aXRoCisJICogTUNDIGNhbiBnbyB0aHJ1IHRoZSByaW5nLiB3ZSBkbyB0aGlzIGF0IHRoZSBlbmQgc2luY2UKKwkgKiB3ZSBkbyBub3Qgd2FudCB0byBiZSBkZWFsaW5nIHdpdGggaW50ZXJydXB0cyB1bnRpbCB0aGUKKwkgKiBpbml0aWFsaXphdGlvbiBpcyBjb21wbGV0ZS4KKwkgKi8KKwlwbm9iLT5tY2NfcV9sZW4gPSBNQ0NfUV9MRU47CisJcG5vYi0+bWNjX3Ffc2l6ZSA9IHBub2ItPm1jY19xX2xlbiAqIHNpemVvZihzdHJ1Y3QgTUNDX1dSQl9BTUFQKTsKKwlwbm9iLT5tY2NfcSA9ICBwY2lfYWxsb2NfY29uc2lzdGVudChhZGFwdGVyLT5wZGV2LCBwbm9iLT5tY2NfcV9zaXplLAorCQkJCSZwbm9iLT5tY2NfcV9idXMpOworCWlmICghcG5vYi0+bWNjX3FfYnVzKQorCQlyZXR1cm4gLTE7CisJLyoKKwkgKiBzcGFjZSBmb3IgTUNDIFdSQiBjb250ZXh0CisJICovCisJcG5vYi0+bWNjX3dyYl9jdHh0TGVuID0gTUNDX1FfTEVOOworCXBub2ItPm1jY193cmJfY3R4dF9zaXplID0gIHBub2ItPm1jY193cmJfY3R4dExlbiAqCisJCXNpemVvZihzdHJ1Y3QgYmVfbWNjX3dyYl9jb250ZXh0KTsKKwlwbm9iLT5tY2Nfd3JiX2N0eHQgPSAodm9pZCAqKV9fZ2V0X2ZyZWVfcGFnZXMoR0ZQX0tFUk5FTCwKKwkJZ2V0X29yZGVyKHBub2ItPm1jY193cmJfY3R4dF9zaXplKSk7CisJaWYgKHBub2ItPm1jY193cmJfY3R4dCA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisJLyoKKwkgKiBTcGFjZSBmb3IgTUNDIGNvbXBsLiByaW5nCisJICovCisJcG5vYi0+bWNjX2NxX2xlbiA9IE1DQ19DUV9MRU47CisJcG5vYi0+bWNjX2NxX3NpemUgPSBwbm9iLT5tY2NfY3FfbGVuICogc2l6ZW9mKHN0cnVjdCBNQ0NfQ1FfRU5UUllfQU1BUCk7CisJcG5vYi0+bWNjX2NxID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQoYWRhcHRlci0+cGRldiwgcG5vYi0+bWNjX2NxX3NpemUsCisJCQkJJnBub2ItPm1jY19jcV9idXMpOworCWlmICghcG5vYi0+bWNjX2NxX2J1cykKKwkJcmV0dXJuIC0xOworCXJldHVybiAwOworfQorCisvKgorICAgIFRoaXMgZnVuY3Rpb24gY3JlYXRlcyB0aGUgTUNDIHJlcXVlc3QgYW5kIGNvbXBsZXRpb24gcmluZyByZXF1aXJlZAorICAgIGZvciBjb21tdW5pY2F0aW5nIHdpdGggdGhlIEFSTSBwcm9jZXNzb3IuICBUaGUgY2FsbGVyIG11c3QgaGF2ZQorICAgIGFsbG9jYXRlZCByZXF1aXJlZCBhbW91bnQgb2YgbWVtb3J5IGZvciB0aGUgTUNDIHJpbmcgYW5kIE1DQworICAgIGNvbXBsZXRpb24gcmluZyBhbmQgcG9zdGVkIHRoZSB2aXJ0dWFsIGFkZHJlc3MgYW5kIG51bWJlciBvZgorICAgIGVudHJpZXMgaW4gdGhlIGNvcnJlc3BvbmRpbmcgbWVtYmVycyAobWNjX3EgYW5kIG1jY19jcSkgaW4gdGhlCisgICAgTmV0T2JqZWN0IHN0cnV0dXJlLgorCisgICAgV2hlbiB0aGlzIGNhbGwgaXMgY29tcGxldGVkLCBhbGwgZnVydGhlciBjb21tdW5pY2F0aW9uIHdpdGgKKyAgICBBUk0gd2lsbCBzd2l0Y2ggZnJvbSBtYWlsYm94IHRvIHRoaXMgcmluZy4KKworICAgIHBub2IJLSBQb2ludGVyIHRvIHRoZSBOZXRPYmplY3Qgc3RydWN0dXJlLiBUaGlzIE5ldE9iamVjdCBzaG91bGQKKwkJICBoYXZlIGJlZW4gY3JlYXRlZCB1c2luZyBhIHByZXZpb3VzIGNhbGwgdG8gYmVfY3JlYXRlX25ldG9iaigpCisqLworaW50IGJlX2NyZWF0ZV9tY2NfcmluZ3Moc3RydWN0IGJlX25ldF9vYmplY3QgKnBub2IpCit7CisJaW50IHN0YXR1cyA9IDA7CisJc3RydWN0IHJpbmdfZGVzYyByZDsKKwlzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwZm9iID0gJnBub2ItPmZuX29iajsKKworCW1lbXNldCgmcmQsIDAsIHNpemVvZihzdHJ1Y3QgcmluZ19kZXNjKSk7CisJaWYgKHBub2ItPm1jY19jcV9sZW4pIHsKKwkJcmQudmEgPSBwbm9iLT5tY2NfY3E7CisJCXJkLnBhID0gcG5vYi0+bWNjX2NxX2J1czsKKwkJcmQubGVuZ3RoID0gcG5vYi0+bWNjX2NxX3NpemU7CisKKwkJc3RhdHVzID0gYmVfY3FfY3JlYXRlKHBmb2IsICZyZCwKKwkJCXBub2ItPm1jY19jcV9sZW4gKiBzaXplb2Yoc3RydWN0IE1DQ19DUV9FTlRSWV9BTUFQKSwKKwkJCWZhbHNlLAkvKiBzb2xpY3RlZCBldmVudHMsICAqLworCQkJdHJ1ZSwJLyogbm9kZWxheSAgKi8KKwkJCTAsCS8qIDAgV2F0ZXJtYXJrIHNpbmNlIE5vZGVsYXkgaXMgdHJ1ZSAqLworCQkJJnBub2ItPmV2ZW50X3Ffb2JqLAorCQkJJnBub2ItPm1jY19jcV9vYmopOworCisJCWlmIChzdGF0dXMgIT0gQkVfU1VDQ0VTUykKKwkJCXJldHVybiBzdGF0dXM7CisKKwkJcG5vYi0+bWNjX2NxX2lkID0gcG5vYi0+bWNjX2NxX29iai5jcV9pZDsKKwkJcG5vYi0+bWNjX2NxX2NyZWF0ZWQgPSAxOworCX0KKwlpZiAocG5vYi0+bWNjX3FfbGVuKSB7CisJCXJkLnZhID0gcG5vYi0+bWNjX3E7CisJCXJkLnBhID0gcG5vYi0+bWNjX3FfYnVzOworCQlyZC5sZW5ndGggPSBwbm9iLT5tY2NfcV9zaXplOworCisJCXN0YXR1cyA9IGJlX21jY19yaW5nX2NyZWF0ZShwZm9iLCAmcmQsCisJCQkJcG5vYi0+bWNjX3FfbGVuICogc2l6ZW9mKHN0cnVjdCBNQ0NfV1JCX0FNQVApLAorCQkJCXBub2ItPm1jY193cmJfY3R4dCwgcG5vYi0+bWNjX3dyYl9jdHh0TGVuLAorCQkJCSZwbm9iLT5tY2NfY3Ffb2JqLCAmcG5vYi0+bWNjX3Ffb2JqKTsKKworCQlpZiAoc3RhdHVzICE9IEJFX1NVQ0NFU1MpCisJCQlyZXR1cm4gc3RhdHVzOworCisJCXBub2ItPm1jY19xX2NyZWF0ZWQgPSAxOworCX0KKwlyZXR1cm4gQkVfU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBiZV9tY2NfaW5pdChzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlcikKK3sKKwl1MzIgcjsKKwlzdHJ1Y3QgYmVfbmV0X29iamVjdCAqcG5vYjsKKworCXBub2IgPSBhZGFwdGVyLT5uZXRfb2JqOworCW1lbXNldChwbm9iLT5tY2NfcSwgMCwgcG5vYi0+bWNjX3Ffc2l6ZSk7CisJcG5vYi0+bWNjX3FfaGQgPSAwOworCisJbWVtc2V0KHBub2ItPm1jY193cmJfY3R4dCwgMCwgcG5vYi0+bWNjX3dyYl9jdHh0X3NpemUpOworCisJbWVtc2V0KHBub2ItPm1jY19jcSwgMCwgcG5vYi0+bWNjX2NxX3NpemUpOworCXBub2ItPm1jY19jcV90bCA9IDA7CisKKwlyID0gYmVfY3JlYXRlX21jY19yaW5ncyhhZGFwdGVyLT5uZXRfb2JqKTsKKwlpZiAociAhPSBCRV9TVUNDRVNTKQorCQlyZXR1cm4gLTE7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYmVfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBiZV9uZXRfb2JqZWN0ICpwbm9iOworCXN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyOworCisJYWRhcHRlciA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlpZiAoIWFkYXB0ZXIpCisJCXJldHVybjsKKworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKwlwbm9iID0gKHN0cnVjdCBiZV9uZXRfb2JqZWN0ICopYWRhcHRlci0+bmV0X29iajsKKworCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7CisKKwlpZiAocG5vYikgeworCQkvKiBVbnJlZ2lzdGVyIGFzeW5jIGNhbGxiYWNrIGZ1bmN0aW9uIGZvciBsaW5rIHN0YXR1cyB1cGRhdGVzICovCisJCWlmIChwbm9iLT5tY2NfcV9jcmVhdGVkKQorCQkJYmVfbWNjX2FkZF9hc3luY19ldmVudF9jYWxsYmFjaygmcG5vYi0+bWNjX3Ffb2JqLAorCQkJCQkJCQlOVUxMLCBOVUxMKTsKKwkJbmV0b2JqZWN0X2NsZWFudXAoYWRhcHRlciwgcG5vYik7CisJfQorCisJaWYgKGFkYXB0ZXItPmNzcl92YSkKKwkJaW91bm1hcChhZGFwdGVyLT5jc3JfdmEpOworCWlmIChhZGFwdGVyLT5kYl92YSkKKwkJaW91bm1hcChhZGFwdGVyLT5kYl92YSk7CisJaWYgKGFkYXB0ZXItPnBjaV92YSkKKwkJaW91bm1hcChhZGFwdGVyLT5wY2lfdmEpOworCisJcGNpX3JlbGVhc2VfcmVnaW9ucyhhZGFwdGVyLT5wZGV2KTsKKwlwY2lfZGlzYWJsZV9kZXZpY2UoYWRhcHRlci0+cGRldik7CisKKwlrZnJlZShhZGFwdGVyLT5iZV9saW5rX3N0cyk7CisJa2ZyZWUoYWRhcHRlci0+ZXRoX3N0YXRzcCk7CisKKwlpZiAoYWRhcHRlci0+dGltZXJfY3R4dC5nZXRfc3RhdHNfdGltZXIuZnVuY3Rpb24pCisJCWRlbF90aW1lcl9zeW5jKCZhZGFwdGVyLT50aW1lcl9jdHh0LmdldF9zdGF0c190aW1lcik7CisJa2ZyZWUoYWRhcHRlcik7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgUENJIHN1Yi1zeXN0ZW0gd2hlbiBpdCBmaW5kcyBhIFBDSQorICogZGV2aWNlIHdpdGggZGV2L3ZlbmRvciBJRHMgdGhhdCBtYXRjaCB3aXRoIG9uZSBvZiBvdXIgZGV2aWNlcy4KKyAqIEFsbCBvZiB0aGUgZHJpdmVyIGluaXRpYWxpemF0aW9uIGlzIGRvbmUgaW4gdGhpcyBmdW5jdGlvbi4KKyAqLworc3RhdGljIGludCBiZV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKnBkZXZfaWQpCit7CisJaW50IHN0YXR1cyA9IDA7CisJc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXI7CisJc3RydWN0IEZXQ01EX0NPTU1PTl9HRVRfRldfVkVSU0lPTl9SRVNQT05TRV9QQVlMT0FEIGdldF9md3Y7CisJc3RydWN0IGJlX25ldF9vYmplY3QgKnBub2I7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKKworCXN0YXR1cyA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOworCWlmIChzdGF0dXMpCisJCWdvdG8gZXJyb3I7CisKKwlzdGF0dXMgPSBwY2lfcmVxdWVzdF9yZWdpb25zKHBkZXYsIGJlX2RyaXZlcl9uYW1lKTsKKwlpZiAoc3RhdHVzKQorCQlnb3RvIGVycm9yX3BjaV9yZXE7CisKKwlwY2lfc2V0X21hc3RlcihwZGV2KTsKKwlhZGFwdGVyID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGJlX2FkYXB0ZXIpLCBHRlBfS0VSTkVMKTsKKwlpZiAoYWRhcHRlciA9PSBOVUxMKSB7CisJCXN0YXR1cyA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3JfYWRhcHRlcjsKKwl9CisJYWRhcHRlci0+ZGV2X3N0YXRlID0gQkVfREVWX1NUQVRFX05PTkU7CisJYWRhcHRlci0+cGRldiA9IHBkZXY7CisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGFkYXB0ZXIpOworCisJYWRhcHRlci0+ZW5hYmxlX2FpYyA9IDE7CisJYWRhcHRlci0+bWF4X2VxZCA9IE1BWF9FUUQ7CisJYWRhcHRlci0+bWluX2VxZCA9IDA7CisJYWRhcHRlci0+Y3VyX2VxZCA9IDA7CisKKwlzdGF0dXMgPSBwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV82NEJJVF9NQVNLKTsKKwlpZiAoIXN0YXR1cykgeworCQlhZGFwdGVyLT5kbWFfNjRiaXRfY2FwID0gdHJ1ZTsKKwl9IGVsc2UgeworCQlhZGFwdGVyLT5kbWFfNjRiaXRfY2FwID0gZmFsc2U7CisJCXN0YXR1cyA9IHBjaV9zZXRfZG1hX21hc2socGRldiwgRE1BXzMyQklUX01BU0spOworCQlpZiAoc3RhdHVzICE9IDApIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiQ291bGQgbm90IHNldCBQQ0kgRE1BIE1hc2tcbiIpOworCQkJZ290byBjbGVhbnVwOworCQl9CisJfQorCisJc3RhdHVzID0gaW5pdF9wY2lfYmVfZnVuY3Rpb24oYWRhcHRlciwgcGRldik7CisJaWYgKHN0YXR1cyAhPSAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiRmFpbGVkIHRvIG1hcCBQQ0kgQkFSU1xuIik7CisJCXN0YXR1cyA9IC1FTk9NRU07CisJCWdvdG8gY2xlYW51cDsKKwl9CisKKwliZV90cmFjZV9zZXRfbGV2ZWwoRExfQUxXQVlTIHwgRExfRVJSKTsKKworCWFkYXB0ZXItPmJlX2xpbmtfc3RzID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IEJFX0xJTktfU1RBVFVTKSwKKwkJCQkJR0ZQX0tFUk5FTCk7CisJaWYgKGFkYXB0ZXItPmJlX2xpbmtfc3RzID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJNZW1vcnkgYWxsb2NhdGlvbiBmb3IgbGluayBzdGF0dXMgIgorCQkgICAgICAgImJ1ZmZlciBmYWlsZWRcbiIpOworCQlnb3RvIGNsZWFudXA7CisJfQorCXNwaW5fbG9ja19pbml0KCZhZGFwdGVyLT50eHFfbG9jayk7CisKKwluZXRkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IGJlX25ldF9vYmplY3QpKTsKKwlpZiAobmV0ZGV2ID09IE5VTEwpIHsKKwkJc3RhdHVzID0gLUVOT01FTTsKKwkJZ290byBjbGVhbnVwOworCX0KKwlwbm9iID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlhZGFwdGVyLT5uZXRfb2JqID0gcG5vYjsKKwlhZGFwdGVyLT5uZXRkZXZwID0gbmV0ZGV2OworCXBub2ItPmFkYXB0ZXIgPSBhZGFwdGVyOworCXBub2ItPm5ldGRldiA9IG5ldGRldjsKKworCXN0YXR1cyA9IGJlX25vYl9yaW5nX2FsbG9jKGFkYXB0ZXIsIHBub2IpOworCWlmIChzdGF0dXMgIT0gMCkKKwkJZ290byBjbGVhbnVwOworCisJc3RhdHVzID0gYmVfbm9iX3JpbmdfaW5pdChhZGFwdGVyLCBwbm9iKTsKKwlpZiAoc3RhdHVzICE9IDApCisJCWdvdG8gY2xlYW51cDsKKworCWJlX3J4Zl9tYWNfYWRkcmVzc19yZWFkX3dyaXRlKCZwbm9iLT5mbl9vYmosIGZhbHNlLCBmYWxzZSwgZmFsc2UsCisJCWZhbHNlLCBmYWxzZSwgbmV0ZGV2LT5kZXZfYWRkciwgTlVMTCwgTlVMTCk7CisKKwluZXRkZXYtPmluaXQgPSAmYmVuZXRfaW5pdDsKKwluZXRpZl9jYXJyaWVyX29mZihuZXRkZXYpOworCW5ldGlmX3N0b3BfcXVldWUobmV0ZGV2KTsKKworCVNFVF9ORVRERVZfREVWKG5ldGRldiwgJihhZGFwdGVyLT5wZGV2LT5kZXYpKTsKKworCW5ldGlmX25hcGlfYWRkKG5ldGRldiwgJnBub2ItPm5hcGksIGJlX3BvbGwsIDY0KTsKKworCS8qIGlmIHRoZSByeF9mcmFnIHNpemUgaWYgMkssIG9uZSBwYWdlIGlzIHNoYXJlZCBhcyB0d28gUlggZnJhZ3MgKi8KKwlwbm9iLT5yeF9wZ19zaGFyZWQgPQorCQkocG5vYi0+cnhfYnVmX3NpemUgPD0gUEFHRV9TSVpFIC8gMikgPyB0cnVlIDogZmFsc2U7CisJaWYgKHBub2ItPnJ4X2J1Zl9zaXplICE9IHJ4YnVmX3NpemUpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkgICAgICAgIkNvdWxkIG5vdCBzZXQgUnggYnVmZmVyIHNpemUgdG8gJWQuIFVzaW5nICVkXG4iLAorCQkJCSAgICAgICByeGJ1Zl9zaXplLCBwbm9iLT5yeF9idWZfc2l6ZSk7CisJCXJ4YnVmX3NpemUgPSBwbm9iLT5yeF9idWZfc2l6ZTsKKwl9CisKKwl0YXNrbGV0X2luaXQoJihhZGFwdGVyLT5zdHNfaGFuZGxlciksIGJlX3Byb2Nlc3NfaW50ciwKKwkJICAgICAodW5zaWduZWQgbG9uZylhZGFwdGVyKTsKKwlhZGFwdGVyLT50YXNrbGV0X3N0YXJ0ZWQgPSAxOworCXNwaW5fbG9ja19pbml0KCYoYWRhcHRlci0+aW50X2xvY2spKTsKKworCXN0YXR1cyA9IGJlX3JlZ2lzdGVyX2lzcihhZGFwdGVyLCBwbm9iKTsKKwlpZiAoc3RhdHVzICE9IDApCisJCWdvdG8gY2xlYW51cDsKKworCWFkYXB0ZXItPnJ4X2NzdW0gPSAxOworCWFkYXB0ZXItPm1heF9yeF9jb2FsID0gQkVfTFJPX01BWF9QS1RTOworCisJbWVtc2V0KCZnZXRfZnd2LCAwLAorCSAgICAgICBzaXplb2Yoc3RydWN0IEZXQ01EX0NPTU1PTl9HRVRfRldfVkVSU0lPTl9SRVNQT05TRV9QQVlMT0FEKSk7CisJcHJpbnRrKEtFUk5fSU5GTyAiQmxhZGVFbmdpbmUgRHJpdmVyIHZlcnNpb246JXMuICIKKwkgICAgICAgIkNvcHlyaWdodCBTZXJ2ZXJFbmdpbmVzLCBDb3Jwb3JhdGlvbiAyMDA1IC0gMjAwOFxuIiwKKwkJCSAgICAgICBiZV9kcnZyX3Zlcik7CisJc3RhdHVzID0gYmVfZnVuY3Rpb25fZ2V0X2Z3X3ZlcnNpb24oJnBub2ItPmZuX29iaiwgJmdldF9md3YsIE5VTEwsCisJCQkJCSAgICBOVUxMKTsKKwlpZiAoc3RhdHVzID09IEJFX1NVQ0NFU1MpIHsKKwkJc3RybmNweShiZV9md192ZXIsIGdldF9md3YuZmlybXdhcmVfdmVyc2lvbl9zdHJpbmcsIDMyKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiQmxhZGVFbmdpbmUgRmlybXdhcmUgVmVyc2lvbjolc1xuIiwKKwkJICAgICAgIGdldF9md3YuZmlybXdhcmVfdmVyc2lvbl9zdHJpbmcpOworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIlVuYWJsZSB0byBnZXQgQkUgRmlybXdhcmUgVmVyc2lvblxuIik7CisJfQorCisJc2VtYV9pbml0KCZhZGFwdGVyLT5nZXRfZXRoX3N0YXRfc2VtLCAwKTsKKwlpbml0X3RpbWVyKCZhZGFwdGVyLT50aW1lcl9jdHh0LmdldF9zdGF0c190aW1lcik7CisJYXRvbWljX3NldCgmYWRhcHRlci0+dGltZXJfY3R4dC5nZXRfc3RhdF9mbGFnLCAwKTsKKwlhZGFwdGVyLT50aW1lcl9jdHh0LmdldF9zdGF0c190aW1lci5mdW5jdGlvbiA9CisJICAgICZiZV9nZXRfc3RhdHNfdGltZXJfaGFuZGxlcjsKKworCXN0YXR1cyA9IGJlX21jY19jcmVhdGUoYWRhcHRlcik7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gY2xlYW51cDsKKwlzdGF0dXMgPSBiZV9tY2NfaW5pdChhZGFwdGVyKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBjbGVhbnVwOworCisKKwlzdGF0dXMgPSBiZV9tY2NfYWRkX2FzeW5jX2V2ZW50X2NhbGxiYWNrKCZhZGFwdGVyLT5uZXRfb2JqLT5tY2NfcV9vYmosCisJCQkgYmVfbGlua19zdGF0dXNfYXN5bmNfY2FsbGJhY2ssICh2b2lkICopYWRhcHRlcik7CisJaWYgKHN0YXR1cyAhPSBCRV9TVUNDRVNTKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImFkZF9hc3luY19ldmVudF9jYWxsYmFjayBmYWlsZWQiKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkgICAgICAgIkxpbmsgc3RhdHVzIGNoYW5nZXMgbWF5IG5vdCBiZSByZWZsZWN0ZWRcbiIpOworCX0KKworCXN0YXR1cyA9IHJlZ2lzdGVyX25ldGRldihuZXRkZXYpOworCWlmIChzdGF0dXMgIT0gMCkKKwkJZ290byBjbGVhbnVwOworCWJlX3VwZGF0ZV9saW5rX3N0YXR1cyhhZGFwdGVyKTsKKwlhZGFwdGVyLT5kZXZfc3RhdGUgPSBCRV9ERVZfU1RBVEVfSU5JVDsKKwlyZXR1cm4gMDsKKworY2xlYW51cDoKKwliZV9yZW1vdmUocGRldik7CisJcmV0dXJuIHN0YXR1czsKK2Vycm9yX2FkYXB0ZXI6CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKK2Vycm9yX3BjaV9yZXE6CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworZXJyb3I6CisJcHJpbnRrKEtFUk5fRVJSICJCbGFkZUVuZ2luZSBpbml0YWxpemF0aW9uIGZhaWxlZFxuIik7CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqIEdldCB0aGUgY3VycmVudCBsaW5rIHN0YXR1cyBhbmQgcHJpbnQgdGhlIHN0YXR1cyBvbiBjb25zb2xlCisgKi8KK3ZvaWQgYmVfdXBkYXRlX2xpbmtfc3RhdHVzKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyKQoreworCWludCBzdGF0dXM7CisJc3RydWN0IGJlX25ldF9vYmplY3QgKnBub2IgPSBhZGFwdGVyLT5uZXRfb2JqOworCisJc3RhdHVzID0gYmVfcnhmX2xpbmtfc3RhdHVzKCZwbm9iLT5mbl9vYmosIGFkYXB0ZXItPmJlX2xpbmtfc3RzLCBOVUxMLAorCQkJTlVMTCwgTlVMTCk7CisJaWYgKHN0YXR1cyA9PSBCRV9TVUNDRVNTKSB7CisJCWlmIChhZGFwdGVyLT5iZV9saW5rX3N0cy0+bWFjMF9zcGVlZCAmJgorCQkgICAgYWRhcHRlci0+YmVfbGlua19zdHMtPm1hYzBfZHVwbGV4KQorCQkJYWRhcHRlci0+cG9ydDBfbGlua19zdHMgPSBCRV9QT1JUX0xJTktfVVA7CisJCWVsc2UKKwkJCWFkYXB0ZXItPnBvcnQwX2xpbmtfc3RzID0gQkVfUE9SVF9MSU5LX0RPV047CisKKwkJaWYgKGFkYXB0ZXItPmJlX2xpbmtfc3RzLT5tYWMxX3NwZWVkICYmCisJCSAgICBhZGFwdGVyLT5iZV9saW5rX3N0cy0+bWFjMV9kdXBsZXgpCisJCQlhZGFwdGVyLT5wb3J0MV9saW5rX3N0cyA9IEJFX1BPUlRfTElOS19VUDsKKwkJZWxzZQorCQkJYWRhcHRlci0+cG9ydDFfbGlua19zdHMgPSBCRV9QT1JUX0xJTktfRE9XTjsKKworCQlkZXZfaW5mbygmcG5vYi0+bmV0ZGV2LT5kZXYsICJMaW5rIFByb3BlcnRpZXM6XG4iKTsKKwkJYmVfcHJpbnRfbGlua19pbmZvKGFkYXB0ZXItPmJlX2xpbmtfc3RzKTsKKwkJcmV0dXJuOworCX0KKwlkZXZfaW5mbygmcG5vYi0+bmV0ZGV2LT5kZXYsICJDb3VsZCBub3QgZ2V0IGxpbmsgc3RhdHVzXG4iKTsKKwlyZXR1cm47Cit9CisKKworI2lmZGVmIENPTkZJR19QTQorc3RhdGljIHZvaWQKK2JlX3BtX2NsZWFudXAoc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIsCisJICAgICAgc3RydWN0IGJlX25ldF9vYmplY3QgKnBub2IsIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJbmV0aWZfY2Fycmllcl9vZmYobmV0ZGV2KTsKKwluZXRpZl9zdG9wX3F1ZXVlKG5ldGRldik7CisKKwliZV93YWl0X25pY190eF9jbXBseF9jbXBsKHBub2IpOworCWJlX2Rpc2FibGVfZXFfaW50cihwbm9iKTsKKworCWlmIChhZGFwdGVyLT50YXNrbGV0X3N0YXJ0ZWQpIHsKKwkJdGFza2xldF9raWxsKCZhZGFwdGVyLT5zdHNfaGFuZGxlcik7CisJCWFkYXB0ZXItPnRhc2tsZXRfc3RhcnRlZCA9IDA7CisJfQorCisJYmVfdW5yZWdpc3Rlcl9pc3IoYWRhcHRlcik7CisJYmVfZGlzYWJsZV9pbnRyKHBub2IpOworCisJYmVfdHhfcV9jbGVhbihwbm9iKTsKKwliZV9yeF9xX2NsZWFuKHBub2IpOworCisJYmVfZGVzdHJveV9uZXRvYmoocG5vYik7Cit9CisKK3N0YXRpYyBpbnQgYmVfc3VzcGVuZChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQoreworCXN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSAgYWRhcHRlci0+bmV0ZGV2cDsKKwlzdHJ1Y3QgYmVfbmV0X29iamVjdCAqcG5vYiA9IG5ldGRldl9wcml2KG5ldGRldik7CisKKwlhZGFwdGVyLT5kZXZfcG1fc3RhdGUgPSBhZGFwdGVyLT5kZXZfc3RhdGU7CisJYWRhcHRlci0+ZGV2X3N0YXRlID0gQkVfREVWX1NUQVRFX1NVU1BFTkQ7CisKKwluZXRpZl9kZXZpY2VfZGV0YWNoKG5ldGRldik7CisJaWYgKG5ldGlmX3J1bm5pbmcobmV0ZGV2KSkKKwkJYmVfcG1fY2xlYW51cChhZGFwdGVyLCBwbm9iLCBuZXRkZXYpOworCisJcGNpX2VuYWJsZV93YWtlKHBkZXYsIDMsIDEpOworCXBjaV9lbmFibGVfd2FrZShwZGV2LCA0LCAxKTsJLyogRDMgQ29sZCA9IDQgKi8KKwlwY2lfc2F2ZV9zdGF0ZShwZGV2KTsKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisJcGNpX3NldF9wb3dlcl9zdGF0ZShwZGV2LCBwY2lfY2hvb3NlX3N0YXRlKHBkZXYsIHN0YXRlKSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGJlX3VwKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyKQoreworCXN0cnVjdCBiZV9uZXRfb2JqZWN0ICpwbm9iID0gYWRhcHRlci0+bmV0X29iajsKKworCWlmIChwbm9iLT5udW1fdmxhbnMgIT0gMCkKKwkJYmVfcnhmX3ZsYW5fY29uZmlnKCZwbm9iLT5mbl9vYmosIGZhbHNlLCBwbm9iLT5udW1fdmxhbnMsCisJCQlwbm9iLT52bGFuX3RhZywgTlVMTCwgTlVMTCwgTlVMTCk7CisKK30KKworc3RhdGljIGludCBiZV9yZXN1bWUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJaW50IHN0YXR1cyA9IDA7CisJc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9ICBhZGFwdGVyLT5uZXRkZXZwOworCXN0cnVjdCBiZV9uZXRfb2JqZWN0ICpwbm9iID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKworCW5ldGlmX2RldmljZV9kZXRhY2gobmV0ZGV2KTsKKworCXN0YXR1cyA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOworCWlmIChzdGF0dXMpCisJCXJldHVybiBzdGF0dXM7CisKKwlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYsIDApOworCXBjaV9yZXN0b3JlX3N0YXRlKHBkZXYpOworCXBjaV9lbmFibGVfd2FrZShwZGV2LCAzLCAwKTsKKwlwY2lfZW5hYmxlX3dha2UocGRldiwgNCwgMCk7CS8qIDQgaXMgRDMgY29sZCAqLworCisJbmV0aWZfY2Fycmllcl9vbihuZXRkZXYpOworCW5ldGlmX3N0YXJ0X3F1ZXVlKG5ldGRldik7CisKKwlpZiAobmV0aWZfcnVubmluZyhuZXRkZXYpKSB7CisJCWJlX3J4Zl9tYWNfYWRkcmVzc19yZWFkX3dyaXRlKCZwbm9iLT5mbl9vYmosIGZhbHNlLCBmYWxzZSwKKwkJCWZhbHNlLCB0cnVlLCBmYWxzZSwgbmV0ZGV2LT5kZXZfYWRkciwgTlVMTCwgTlVMTCk7CisKKwkJc3RhdHVzID0gYmVfbm9iX3JpbmdfaW5pdChhZGFwdGVyLCBwbm9iKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlyZXR1cm4gc3RhdHVzOworCisJCXRhc2tsZXRfaW5pdCgmKGFkYXB0ZXItPnN0c19oYW5kbGVyKSwgYmVfcHJvY2Vzc19pbnRyLAorCQkJICAgICAodW5zaWduZWQgbG9uZylhZGFwdGVyKTsKKwkJYWRhcHRlci0+dGFza2xldF9zdGFydGVkID0gMTsKKworCQlpZiAoYmVfcmVnaXN0ZXJfaXNyKGFkYXB0ZXIsIHBub2IpICE9IDApIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiYmVfcmVnaXN0ZXJfaXNyIGZhaWxlZFxuIik7CisJCQlyZXR1cm4gc3RhdHVzOworCQl9CisKKworCQlzdGF0dXMgPSBiZV9tY2NfaW5pdChhZGFwdGVyKTsKKwkJaWYgKHN0YXR1cyA8IDApIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiYmVfbWNjX2luaXQgZmFpbGVkXG4iKTsKKwkJCXJldHVybiBzdGF0dXM7CisJCX0KKwkJYmVfdXBkYXRlX2xpbmtfc3RhdHVzKGFkYXB0ZXIpOworCQkvKgorCQkgKiBSZWdpc3RlciBhc3luYyBjYWxsIGJhY2sgZnVuY3Rpb24gdG8gaGFuZGxlIGxpbmsKKwkJICogc3RhdHVzIHVwZGF0ZXMKKwkJICovCisJCXN0YXR1cyA9IGJlX21jY19hZGRfYXN5bmNfZXZlbnRfY2FsbGJhY2soCisJCQkJJmFkYXB0ZXItPm5ldF9vYmotPm1jY19xX29iaiwKKwkJCQliZV9saW5rX3N0YXR1c19hc3luY19jYWxsYmFjaywgKHZvaWQgKilhZGFwdGVyKTsKKwkJaWYgKHN0YXR1cyAhPSBCRV9TVUNDRVNTKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJhZGRfYXN5bmNfZXZlbnRfY2FsbGJhY2sgZmFpbGVkIik7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkgICAgICAgIkxpbmsgc3RhdHVzIGNoYW5nZXMgbWF5IG5vdCBiZSByZWZsZWN0ZWRcbiIpOworCQl9CisJCWJlX2VuYWJsZV9pbnRyKHBub2IpOworCQliZV9lbmFibGVfZXFfaW50cihwbm9iKTsKKwkJYmVfdXAoYWRhcHRlcik7CisJfQorCW5ldGlmX2RldmljZV9hdHRhY2gobmV0ZGV2KTsKKwlhZGFwdGVyLT5kZXZfc3RhdGUgPSBhZGFwdGVyLT5kZXZfcG1fc3RhdGU7CisJcmV0dXJuIDA7CisKK30KKworI2VuZGlmCisKKy8qIFdhaXQgdW50aWwgbm8gbW9yZSBwZW5kaW5nIHRyYW5zbWl0cyAgKi8KK3ZvaWQgYmVfd2FpdF9uaWNfdHhfY21wbHhfY21wbChzdHJ1Y3QgYmVfbmV0X29iamVjdCAqcG5vYikKK3sKKwlpbnQgaTsKKworCS8qIFdhaXQgZm9yIDIwdXMgKiA1MDAwMCAoPSAxcykgYW5kIG5vIG1vcmUgKi8KKwlpID0gMDsKKwl3aGlsZSAoKHBub2ItPnR4X3FfdGwgIT0gcG5vYi0+dHhfcV9oZCkgJiYgKGkgPCA1MDAwMCkpIHsKKwkJKytpOworCQl1ZGVsYXkoMjApOworCX0KKworCS8qIENoZWNrIGZvciBubyBtb3JlIHBlbmRpbmcgdHJhbnNtaXRzICovCisJaWYgKGkgPj0gNTAwMDApIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkgICAgICAgIkRpZCBub3QgcmVjZWl2ZSBjb21wbGV0aW9ucyBmb3IgYWxsIFRYIHJlcXVlc3RzXG4iKTsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBiZV9kcml2ZXIgPSB7CisJLm5hbWUgPSBiZV9kcml2ZXJfbmFtZSwKKwkuaWRfdGFibGUgPSBiZV9kZXZpY2VfaWRfdGFibGUsCisJLnByb2JlID0gYmVfcHJvYmUsCisjaWZkZWYgQ09ORklHX1BNCisJLnN1c3BlbmQgPSBiZV9zdXNwZW5kLAorCS5yZXN1bWUgPSBiZV9yZXN1bWUsCisjZW5kaWYKKwkucmVtb3ZlID0gYmVfcmVtb3ZlCit9OworCisvKgorICogTW9kdWxlIGluaXQgZW50cnkgcG9pbnQuIFJlZ2lzdGVycyBvdXIgb3VyIGRldmljZSBhbmQgcmV0dXJuLgorICogT3VyIHByb2JlIHdpbGwgYmUgY2FsbGVkIGlmIHRoZSBkZXZpY2UgaXMgZm91bmQuCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IGJlX2luaXRfbW9kdWxlKHZvaWQpCit7CisJaW50IHJldDsKKworCWlmIChyeGJ1Zl9zaXplICE9IDgxOTIgJiYgcnhidWZfc2l6ZSAhPSA0MDk2ICYmIHJ4YnVmX3NpemUgIT0gMjA0OCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCSAgICAgICAiVW5zdXBwb3J0ZWQgcmVjZWl2ZSBidWZmZXIgc2l6ZSAoJWQpIHJlcXVlc3RlZFxuIiwKKwkJICAgICAgIHJ4YnVmX3NpemUpOworCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCSAgICAgICAiTXVzdCBiZSAyMDQ4LCA0MDk2IG9yIDgxOTIuIERlZmF1bHRpbmcgdG8gMjA0OFxuIik7CisJCXJ4YnVmX3NpemUgPSAyMDQ4OworCX0KKworCXJldCA9IHBjaV9yZWdpc3Rlcl9kcml2ZXIoJmJlX2RyaXZlcik7CisKKwlyZXR1cm4gcmV0OworfQorCittb2R1bGVfaW5pdChiZV9pbml0X21vZHVsZSk7CisKKy8qCisgKiBiZV9leGl0X21vZHVsZSAtIERyaXZlciBFeGl0IENsZWFudXAgUm91dGluZQorICovCitzdGF0aWMgdm9pZCBfX2V4aXQgYmVfZXhpdF9tb2R1bGUodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmJlX2RyaXZlcik7Cit9CisKK21vZHVsZV9leGl0KGJlX2V4aXRfbW9kdWxlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9iZV9pbnQuYyBiL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9iZV9pbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYmE5NWQwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JlbmV0L2JlX2ludC5jCkBAIC0wLDAgKzEsODYzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA1IC0gMjAwOCBTZXJ2ZXJFbmdpbmVzCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBUaGUgZnVsbCBHTlUgR2VuZXJhbAorICogUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlIGZpbGUgY2FsbGVkIENPUFlJTkcuCisgKgorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqIGxpbnV4LWRyaXZlcnNAc2VydmVyZW5naW5lcy5jb20KKyAqCisgKiBTZXJ2ZXJFbmdpbmVzCisgKiAyMDkgTi4gRmFpciBPYWtzIEF2ZQorICogU3Vubnl2YWxlLCBDQSA5NDA4NQorICovCisjaW5jbHVkZSA8bGludXgvaWZfdmxhbi5oPgorI2luY2x1ZGUgPGxpbnV4L2luZXRfbHJvLmg+CisKKyNpbmNsdWRlICJiZW5ldC5oIgorCisvKiBudW1iZXIgb2YgYnl0ZXMgb2YgUlggZnJhbWUgdGhhdCBhcmUgY29waWVkIHRvIHNrYi0+ZGF0YSAqLworI2RlZmluZSBCRV9IRFJfTEVOIDY0CisKKyNkZWZpbmUgTkVUSUZfUlgoc2tiKSBuZXRpZl9yZWNlaXZlX3NrYihza2IpCisjZGVmaW5lIFZMQU5fQUNDRUxfUlgoc2tiLCBwbm9iLCB2dCkgXAorCQl2bGFuX2h3YWNjZWxfcngoc2tiLCBwbm9iLT52bGFuX2dycCwgdnQpCisKKy8qCisgICAgVGhpcyBmdW5jdGlvbiBub3RpZmllcyBCbGFkZUVuZ2luZSBvZiB0aGUgbnVtYmVyIG9mIGNvbXBsZXRpb24KKyAgICBlbnRyaWVzIHByb2Nlc3NlZCBmcm9tIHRoZSBzcGVjaWZpZWQgY29tcGxldGlvbiBxdWV1ZSBieSB3cml0aW5nCisgICAgdGhlIG51bWJlciBvZiBwb3BwZWQgZW50cmllcyB0byB0aGUgZG9vciBiZWxsLgorCisgICAgcG5vYgktIFBvaW50ZXIgdG8gdGhlIE5ldE9iamVjdCBzdHJ1Y3R1cmUKKyAgICBuCQktIE51bWJlciBvZiBjb21wbGV0aW9uIGVudHJpZXMgcHJvY2Vzc2VkCisgICAgY3FfaWQJLSBRdWV1ZSBJRCBvZiB0aGUgY29tcGxldGlvbiBxdWV1ZSBmb3Igd2hpY2ggbm90aWZpY2F0aW9uCisJCQlpcyBiZWluZyBkb25lLgorICAgIHJlX2FybQktIDEgIC0gcmVhcm0gdGhlIGNvbXBsZXRpb24gcmluZyB0byBnZW5lcmF0ZSBhbiBldmVudC4KKwkJLSAwICAtIGRvbnQgcmVhcm0gdGhlIGNvbXBsZXRpb24gcmluZyB0byBnZW5lcmF0ZSBhbiBldmVudAorKi8KK3ZvaWQgYmVfbm90aWZ5X2NtcGwoc3RydWN0IGJlX25ldF9vYmplY3QgKnBub2IsIGludCBuLCBpbnQgY3FfaWQsIGludCByZV9hcm0pCit7CisJc3RydWN0IENRX0RCX0FNQVAgY3FkYjsKKworCWNxZGIuZHdbMF0gPSAwOworCUFNQVBfU0VUX0JJVFNfUFRSKENRX0RCLCBxaWQsICZjcWRiLCBjcV9pZCk7CisJQU1BUF9TRVRfQklUU19QVFIoQ1FfREIsIHJlYXJtLCAmY3FkYiwgcmVfYXJtKTsKKwlBTUFQX1NFVF9CSVRTX1BUUihDUV9EQiwgbnVtX3BvcHBlZCwgJmNxZGIsIG4pOworCVBEX1dSSVRFKCZwbm9iLT5mbl9vYmosIGNxX2RiLCBjcWRiLmR3WzBdKTsKK30KKworLyoKKyAqIGFkZHMgYWRkaXRpb25hbCByZWNlaXZlIGZyYWdzIGluZGljYXRlZCBieSBCRSBzdGFydGluZyBmcm9tIGdpdmVuCisgKiBmcmFnIGluZGV4IChmaSkgdG8gc3BlY2lmaWVkIHNrYidzIGZyYWcgbGlzdAorICovCitzdGF0aWMgdm9pZAorYWRkX3NrYl9mcmFncyhzdHJ1Y3QgYmVfbmV0X29iamVjdCAqcG5vYiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkgICAgICB1MzIgbnJlc2lkLCB1MzIgZmkpCit7CisJc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwbm9iLT5hZGFwdGVyOworCXUzMiBza19mcmFnX2lkeCwgbjsKKwlzdHJ1Y3QgYmVfcnhfcGFnZV9pbmZvICpyeF9wYWdlX2luZm87CisJdTMyIGZyYWdfc3ogPSBwbm9iLT5yeF9idWZfc2l6ZTsKKworCXNrX2ZyYWdfaWR4ID0gc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFnczsKKwl3aGlsZSAobnJlc2lkKSB7CisJCWluZGV4X2luYygmZmksIHBub2ItPnJ4X3FfbGVuKTsKKworCQlyeF9wYWdlX2luZm8gPSAoc3RydWN0IGJlX3J4X3BhZ2VfaW5mbyAqKXBub2ItPnJ4X2N0eHRbZmldOworCQlwbm9iLT5yeF9jdHh0W2ZpXSA9IE5VTEw7CisJCWlmICgocnhfcGFnZV9pbmZvLT5wYWdlX29mZnNldCkgfHwKKwkJICAgIChwbm9iLT5yeF9wZ19zaGFyZWQgPT0gZmFsc2UpKSB7CisJCQlwY2lfdW5tYXBfcGFnZShhZGFwdGVyLT5wZGV2LAorCQkJCSAgICAgICBwY2lfdW5tYXBfYWRkcihyeF9wYWdlX2luZm8sIGJ1cyksCisJCQkJICAgICAgIGZyYWdfc3osIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCX0KKworCQluID0gbWluKG5yZXNpZCwgZnJhZ19zeik7CisJCXNrYl9zaGluZm8oc2tiKS0+ZnJhZ3Nbc2tfZnJhZ19pZHhdLnBhZ2UgPSByeF9wYWdlX2luZm8tPnBhZ2U7CisJCXNrYl9zaGluZm8oc2tiKS0+ZnJhZ3Nbc2tfZnJhZ19pZHhdLnBhZ2Vfb2Zmc2V0CisJCSAgICA9IHJ4X3BhZ2VfaW5mby0+cGFnZV9vZmZzZXQ7CisJCXNrYl9zaGluZm8oc2tiKS0+ZnJhZ3Nbc2tfZnJhZ19pZHhdLnNpemUgPSBuOworCisJCXNrX2ZyYWdfaWR4Kys7CisJCXNrYi0+bGVuICs9IG47CisJCXNrYi0+ZGF0YV9sZW4gKz0gbjsKKwkJc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFncysrOworCQlucmVzaWQgLT0gbjsKKworCQltZW1zZXQocnhfcGFnZV9pbmZvLCAwLCBzaXplb2Yoc3RydWN0IGJlX3J4X3BhZ2VfaW5mbykpOworCQlhdG9taWNfZGVjKCZwbm9iLT5yeF9xX3Bvc3RlZCk7CisJfQorfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBwcm9jZXNzZXMgaW5jb21pbmcgbmljIHBhY2tldHMgb3ZlciB2YXJpb3VzIFJ4IHF1ZXVlcy4KKyAqIFRoaXMgZnVuY3Rpb24gdGFrZXMgdGhlIGFkYXB0ZXIsIHRoZSBjdXJyZW50IFJ4IHN0YXR1cyBkZXNjcmlwdG9yCisgKiBlbnRyeSBhbmQgdGhlIFJ4IGNvbXBsZXRpb24gcXVldWUgSUQgYXMgYXJndW1lbnQuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHByb2Nlc3NfbmljX3J4X2NvbXBsZXRpb24oc3RydWN0IGJlX25ldF9vYmplY3QgKnBub2IsCisJCQkJCSAgICBzdHJ1Y3QgRVRIX1JYX0NPTVBMX0FNQVAgKnJ4Y3ApCit7CisJc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwbm9iLT5hZGFwdGVyOworCXN0cnVjdCBza19idWZmICpza2I7CisJaW50IHVkcGNrc20sIHRjcGNrc207CisJaW50IG47CisJdTMyIG5yZXNpZCwgZmk7CisJdTMyIGZyYWdfc3ogPSBwbm9iLT5yeF9idWZfc2l6ZTsKKwl1OCAqdmE7CisJc3RydWN0IGJlX3J4X3BhZ2VfaW5mbyAqcnhfcGFnZV9pbmZvOworCXUzMiBudW1mcmFncywgdnRwLCB2dG0sIHZsYW5fdGFnLCBwa3RzaXplOworCisJZmkgPSBBTUFQX0dFVF9CSVRTX1BUUihFVEhfUlhfQ09NUEwsIGZyYWduZHgsIHJ4Y3ApOworCUJVR19PTihmaSA+PSAoaW50KXBub2ItPnJ4X3FfbGVuKTsKKwlCVUdfT04oZmkgPCAwKTsKKworCXJ4X3BhZ2VfaW5mbyA9IChzdHJ1Y3QgYmVfcnhfcGFnZV9pbmZvICopcG5vYi0+cnhfY3R4dFtmaV07CisJQlVHX09OKCFyeF9wYWdlX2luZm8tPnBhZ2UpOworCXBub2ItPnJ4X2N0eHRbZmldID0gTlVMTDsKKworCS8qCisJICogSWYgb25lIHBhZ2UgaXMgdXNlZCBwZXIgZnJhZ21lbnQgb3IgaWYgdGhpcyBpcyB0aGUgc2Vjb25kIGhhbGYgb2YKKwkgKiAgb2YgdGhlIHBhZ2UsIHVubWFwIHRoZSBwYWdlIGhlcmUKKwkgKi8KKwlpZiAoKHJ4X3BhZ2VfaW5mby0+cGFnZV9vZmZzZXQpIHx8IChwbm9iLT5yeF9wZ19zaGFyZWQgPT0gZmFsc2UpKSB7CisJCXBjaV91bm1hcF9wYWdlKGFkYXB0ZXItPnBkZXYsCisJCQkgICAgICAgcGNpX3VubWFwX2FkZHIocnhfcGFnZV9pbmZvLCBidXMpLCBmcmFnX3N6LAorCQkJICAgICAgIFBDSV9ETUFfRlJPTURFVklDRSk7CisJfQorCisJYXRvbWljX2RlYygmcG5vYi0+cnhfcV9wb3N0ZWQpOworCXVkcGNrc20gPSBBTUFQX0dFVF9CSVRTX1BUUihFVEhfUlhfQ09NUEwsIHVkcGNrc20sIHJ4Y3ApOworCXRjcGNrc20gPSBBTUFQX0dFVF9CSVRTX1BUUihFVEhfUlhfQ09NUEwsIHRjcGNrc20sIHJ4Y3ApOworCXBrdHNpemUgPSBBTUFQX0dFVF9CSVRTX1BUUihFVEhfUlhfQ09NUEwsIHBrdHNpemUsIHJ4Y3ApOworCS8qCisJICogZ2V0IHJpZCBvZiBSWCBmbHVzaCBjb21wbGV0aW9ucyBmaXJzdC4KKwkgKi8KKwlpZiAoKHRjcGNrc20pICYmICh1ZHBja3NtKSAmJiAocGt0c2l6ZSA9PSAzMikpIHsKKwkJcHV0X3BhZ2UocnhfcGFnZV9pbmZvLT5wYWdlKTsKKwkJbWVtc2V0KHJ4X3BhZ2VfaW5mbywgMCwgc2l6ZW9mKHN0cnVjdCBiZV9yeF9wYWdlX2luZm8pKTsKKwkJcmV0dXJuIDA7CisJfQorCXNrYiA9IG5ldGRldl9hbGxvY19za2IocG5vYi0+bmV0ZGV2LCBCRV9IRFJfTEVOICsgTkVUX0lQX0FMSUdOKTsKKwlpZiAoc2tiID09IE5VTEwpIHsKKwkJZGV2X2luZm8oJnBub2ItPm5ldGRldi0+ZGV2LCAiYWxsb2Nfc2tiKCkgZmFpbGVkXG4iKTsKKwkJcHV0X3BhZ2UocnhfcGFnZV9pbmZvLT5wYWdlKTsKKwkJbWVtc2V0KHJ4X3BhZ2VfaW5mbywgMCwgc2l6ZW9mKHN0cnVjdCBiZV9yeF9wYWdlX2luZm8pKTsKKwkJZ290byBmcmVlX2ZyYWdzOworCX0KKwlza2JfcmVzZXJ2ZShza2IsIE5FVF9JUF9BTElHTik7CisKKwlza2ItPmRldiA9IHBub2ItPm5ldGRldjsKKworCW4gPSBtaW4ocGt0c2l6ZSwgZnJhZ19zeik7CisKKwl2YSA9IHBhZ2VfYWRkcmVzcyhyeF9wYWdlX2luZm8tPnBhZ2UpICsgcnhfcGFnZV9pbmZvLT5wYWdlX29mZnNldDsKKwlwcmVmZXRjaCh2YSk7CisKKwlza2ItPmxlbiA9IG47CisJc2tiLT5kYXRhX2xlbiA9IG47CisJaWYgKG4gPD0gQkVfSERSX0xFTikgeworCQltZW1jcHkoc2tiLT5kYXRhLCB2YSwgbik7CisJCXB1dF9wYWdlKHJ4X3BhZ2VfaW5mby0+cGFnZSk7CisJCXNrYi0+ZGF0YV9sZW4gLT0gbjsKKwkJc2tiLT50YWlsICs9IG47CisJfSBlbHNlIHsKKworCQkvKiBTZXR1cCB0aGUgU0tCIHdpdGggcGFnZSBidWZmZXIgaW5mb3JtYXRpb24gKi8KKwkJc2tiX3NoaW5mbyhza2IpLT5mcmFnc1swXS5wYWdlID0gcnhfcGFnZV9pbmZvLT5wYWdlOworCQlza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzKys7CisKKwkJLyogQ29weSB0aGUgaGVhZGVyIGludG8gdGhlIHNrYl9kYXRhICovCisJCW1lbWNweShza2ItPmRhdGEsIHZhLCBCRV9IRFJfTEVOKTsKKwkJc2tiX3NoaW5mbyhza2IpLT5mcmFnc1swXS5wYWdlX29mZnNldCA9CisJCSAgICByeF9wYWdlX2luZm8tPnBhZ2Vfb2Zmc2V0ICsgQkVfSERSX0xFTjsKKwkJc2tiX3NoaW5mbyhza2IpLT5mcmFnc1swXS5zaXplID0gbiAtIEJFX0hEUl9MRU47CisJCXNrYi0+ZGF0YV9sZW4gLT0gQkVfSERSX0xFTjsKKwkJc2tiLT50YWlsICs9IEJFX0hEUl9MRU47CisJfQorCW1lbXNldChyeF9wYWdlX2luZm8sIDAsIHNpemVvZihzdHJ1Y3QgYmVfcnhfcGFnZV9pbmZvKSk7CisJbnJlc2lkID0gcGt0c2l6ZSAtIG47CisKKwlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBwbm9iLT5uZXRkZXYpOworCisJaWYgKCh0Y3Bja3NtIHx8IHVkcGNrc20pICYmIGFkYXB0ZXItPnJ4X2NzdW0pCisJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlk7CisJZWxzZQorCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7CisJLyoKKwkgKiBpZiB3ZSBoYXZlIG1vcmUgYnl0ZXMgbGVmdCwgdGhlIGZyYW1lIGhhcyBiZWVuCisJICogZ2l2ZW4gdG8gdXMgaW4gbXVsdGlwbGUgZnJhZ21lbnRzLiAgVGhpcyBoYXBwZW5zCisJICogd2l0aCBKdW1ibyBmcmFtZXMuIEFkZCB0aGUgcmVtYWluaW5nIGZyYWdtZW50cyB0bworCSAqIHNrYi0+ZnJhZ3NbXSBhcnJheS4KKwkgKi8KKwlpZiAobnJlc2lkKQorCQlhZGRfc2tiX2ZyYWdzKHBub2IsIHNrYiwgbnJlc2lkLCBmaSk7CisKKwkvKiB1cGRhdGUgdGhlIHRoZSB0cnVlIHNpemUgb2YgdGhlIHNrYi4gKi8KKwlza2ItPnRydWVzaXplID0gc2tiLT5sZW4gKyBzaXplb2Yoc3RydWN0IHNrX2J1ZmYpOworCisJLyoKKwkgKiBJZiBhIDgwMi4zIGZyYW1lIG9yIDgwMi4yIExMQyBmcmFtZQorCSAqIChpLmUpIGNvbnRhaW5zIGxlbmd0aCBmaWVsZCBpbiBNQUMgSGRyCisJICogYW5kIGZyYW1lIGxlbiBpcyBncmVhdGVyIHRoYW4gNjQgYnl0ZXMKKwkgKi8KKwlpZiAoKChza2ItPnByb3RvY29sID09IG50b2hzKEVUSF9QXzgwMl8yKSkgfHwKKwkgICAgIChza2ItPnByb3RvY29sID09IG50b2hzKEVUSF9QXzgwMl8zKSkpCisJICAgICYmIChwa3RzaXplID4gQkVfSERSX0xFTikpIHsKKwkJLyoKKwkJICogSWYgdGhlIGxlbmd0aCBnaXZlbiBpbiBNYWMgSGRyIGlzIGxlc3MgdGhhbiBmcmFtZSBzaXplCisJCSAqIEVycmFuZW91cyBmcmFtZSwgRHJvcCBpdAorCQkgKi8KKwkJaWYgKChudG9ocygqKHUxNiAqKSAodmEgKyAxMikpICsgRVRIX0hMRU4pIDwgcGt0c2l6ZSkgeworCQkJLyogSW5jcmVtZW50IE5vbiBFdGhlciB0eXBlIElJIGZyYW1lcyBkcm9wcGVkICovCisJCQlhZGFwdGVyLT5iZV9zdGF0LmJlc184MDJfM19kcm9wcGVkX2ZyYW1lcysrOworCisJCQlrZnJlZV9za2Ioc2tiKTsKKwkJCXJldHVybiAwOworCQl9CisJCS8qCisJCSAqIGVsc2UgaWYgdGhlIGxlbmd0aCBnaXZlbiBpbiBNYWMgSGRyIGlzIGdyZWF0ZXIgdGhhbgorCQkgKiBmcmFtZSBzaXplLCBzaG91bGQgbm90IGJlIHNlZWluZyB0aGlzIHNvcnQgb2YgZnJhbWVzCisJCSAqIGR1bXAgdGhlIHBrdCBhbmQgcGFzcyB0byBzdGFjaworCQkgKi8KKwkJZWxzZSBpZiAoKG50b2hzKCoodTE2ICopICh2YSArIDEyKSkgKyBFVEhfSExFTikgPiBwa3RzaXplKSB7CisJCQkvKiBJbmNyZW1lbnQgTm9uIEV0aGVyIHR5cGUgSUkgZnJhbWVzIG1hbGZvcm1lZCAqLworCQkJYWRhcHRlci0+YmVfc3RhdC5iZXNfODAyXzNfbWFsZm9ybWVkX2ZyYW1lcysrOworCQl9CisJfQorCisJdnRwID0gQU1BUF9HRVRfQklUU19QVFIoRVRIX1JYX0NPTVBMLCB2dHAsIHJ4Y3ApOworCXZ0bSA9IEFNQVBfR0VUX0JJVFNfUFRSKEVUSF9SWF9DT01QTCwgdnRtLCByeGNwKTsKKwlpZiAodnRwICYmIHZ0bSkgeworCQkvKiBWbGFuIHRhZyBwcmVzZW50IGluIHBrdCBhbmQgQkUgZm91bmQKKwkJICogdGhhdCB0aGUgdGFnIG1hdGNoZWQgYW4gZW50cnkgaW4gVkxBTiB0YWJsZQorCQkgKi8KKwkJaWYgKCFwbm9iLT52bGFuX2dycCB8fCBwbm9iLT5udW1fdmxhbnMgPT0gMCkgeworCQkJLyogQnV0IHdlIGhhdmUgbm8gVkxBTnMgY29uZmlndXJlZC4KKwkJCSAqIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbi4gIERyb3AgdGhlIHBhY2tldC4KKwkJCSAqLworCQkJZGV2X2luZm8oJnBub2ItPm5ldGRldi0+ZGV2LAorCQkJICAgICAgICJCbGFkZUVuZ2luZTogVW5leHBlY3RlZCB2bGFuIHRhZ2dlZCBwYWNrZXRcbiIpOworCQkJa2ZyZWVfc2tiKHNrYik7CisJCQlyZXR1cm4gMDsKKwkJfQorCQkvKiBwYXNzIHRoZSBWTEFOIHBhY2tldCB0byBzdGFjayAqLworCQl2bGFuX3RhZyA9IEFNQVBfR0VUX0JJVFNfUFRSKEVUSF9SWF9DT01QTCwgdmxhbl90YWcsIHJ4Y3ApOworCQlWTEFOX0FDQ0VMX1JYKHNrYiwgcG5vYiwgYmUxNl90b19jcHUodmxhbl90YWcpKTsKKworCX0gZWxzZSB7CisJCU5FVElGX1JYKHNrYik7CisJfQorCXJldHVybiAwOworCitmcmVlX2ZyYWdzOgorCS8qIGZyZWUgYWxsIGZyYWdzIGFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudCByeGNwICovCisJbnVtZnJhZ3MgPSBBTUFQX0dFVF9CSVRTX1BUUihFVEhfUlhfQ09NUEwsIG51bWZyYWdzLCByeGNwKTsKKwl3aGlsZSAobnVtZnJhZ3MtLSA+IDEpIHsKKwkJaW5kZXhfaW5jKCZmaSwgcG5vYi0+cnhfcV9sZW4pOworCisJCXJ4X3BhZ2VfaW5mbyA9IChzdHJ1Y3QgYmVfcnhfcGFnZV9pbmZvICopCisJCSAgICBwbm9iLT5yeF9jdHh0W2ZpXTsKKwkJcG5vYi0+cnhfY3R4dFtmaV0gPSAodm9pZCAqKU5VTEw7CisJCWlmIChyeF9wYWdlX2luZm8tPnBhZ2Vfb2Zmc2V0IHx8ICFwbm9iLT5yeF9wZ19zaGFyZWQpIHsKKwkJCXBjaV91bm1hcF9wYWdlKGFkYXB0ZXItPnBkZXYsCisJCQkJICAgICAgIHBjaV91bm1hcF9hZGRyKHJ4X3BhZ2VfaW5mbywgYnVzKSwKKwkJCQkgICAgICAgZnJhZ19zeiwgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJfQorCisJCXB1dF9wYWdlKHJ4X3BhZ2VfaW5mby0+cGFnZSk7CisJCW1lbXNldChyeF9wYWdlX2luZm8sIDAsIHNpemVvZihzdHJ1Y3QgYmVfcnhfcGFnZV9pbmZvKSk7CisJCWF0b21pY19kZWMoJnBub2ItPnJ4X3FfcG9zdGVkKTsKKwl9CisJcmV0dXJuIC1FTk9NRU07Cit9CisKK3N0YXRpYyB2b2lkIHByb2Nlc3NfbmljX3J4X2NvbXBsZXRpb25fbHJvKHN0cnVjdCBiZV9uZXRfb2JqZWN0ICpwbm9iLAorCQkJCQkgIHN0cnVjdCBFVEhfUlhfQ09NUExfQU1BUCAqcnhjcCkKK3sKKwlzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciA9IHBub2ItPmFkYXB0ZXI7CisJc3RydWN0IHNrYl9mcmFnX3N0cnVjdCByeF9mcmFnc1tCRV9NQVhfRlJBR1NfUEVSX0ZSQU1FXTsKKwl1bnNpZ25lZCBpbnQgdWRwY2tzbSwgdGNwY2tzbTsKKwl1MzIgbnVtZnJhZ3MsIHZsYW5mLCB2dG0sIHZsYW5fdGFnLCBucmVzaWQ7CisJdTE2IHZsYW50OworCXVuc2lnbmVkIGludCBmaSwgaWR4LCBuOworCXN0cnVjdCBiZV9yeF9wYWdlX2luZm8gKnJ4X3BhZ2VfaW5mbzsKKwl1MzIgZnJhZ19zeiA9IHBub2ItPnJ4X2J1Zl9zaXplLCBwa3RzaXplOworCWJvb2wgcnhfY29hbCA9IChhZGFwdGVyLT5tYXhfcnhfY29hbCA8PSAxKSA/IDAgOiAxOworCXU4IGVyciwgKnZhOworCV9fd3N1bSBjc3VtID0gMDsKKworCWlmIChBTUFQX0dFVF9CSVRTX1BUUihFVEhfUlhfQ09NUEwsIGlwc2VjLCByeGNwKSkgeworCQkvKiAgRHJvcCB0aGUgcGt0IGFuZCBtb3ZlIHRvIHRoZSBuZXh0IGNvbXBsZXRpb24uICAqLworCQlhZGFwdGVyLT5iZV9zdGF0LmJlc19yeF9taXNjX3BrdHMrKzsKKwkJcmV0dXJuOworCX0KKwllcnIgPSBBTUFQX0dFVF9CSVRTX1BUUihFVEhfUlhfQ09NUEwsIGVyciwgcnhjcCk7CisJaWYgKGVyciB8fCAhcnhfY29hbCkgeworCQkvKiBXZSB3b24ndCBjb2FsZXNjZSBSeCBwa3RzIGlmIHRoZSBlcnIgYml0IHNldC4KKwkJICogdGFrZSB0aGUgcGF0aCBvZiBub3JtYWwgY29tcGxldGlvbiBwcm9jZXNzaW5nICovCisJCXByb2Nlc3NfbmljX3J4X2NvbXBsZXRpb24ocG5vYiwgcnhjcCk7CisJCXJldHVybjsKKwl9CisKKwlmaSA9IEFNQVBfR0VUX0JJVFNfUFRSKEVUSF9SWF9DT01QTCwgZnJhZ25keCwgcnhjcCk7CisJQlVHX09OKGZpID49IChpbnQpcG5vYi0+cnhfcV9sZW4pOworCUJVR19PTihmaSA8IDApOworCXJ4X3BhZ2VfaW5mbyA9IChzdHJ1Y3QgYmVfcnhfcGFnZV9pbmZvICopcG5vYi0+cnhfY3R4dFtmaV07CisJQlVHX09OKCFyeF9wYWdlX2luZm8tPnBhZ2UpOworCXBub2ItPnJ4X2N0eHRbZmldID0gKHZvaWQgKilOVUxMOworCS8qICBJZiBvbmUgcGFnZSBpcyB1c2VkIHBlciBmcmFnbWVudCBvciBpZiB0aGlzIGlzIHRoZQorCSAqIHNlY29uZCBoYWxmIG9mIHRoZSBwYWdlLCB1bm1hcCB0aGUgcGFnZSBoZXJlCisJICovCisJaWYgKHJ4X3BhZ2VfaW5mby0+cGFnZV9vZmZzZXQgfHwgIXBub2ItPnJ4X3BnX3NoYXJlZCkgeworCQlwY2lfdW5tYXBfcGFnZShhZGFwdGVyLT5wZGV2LAorCQkJICAgICAgIHBjaV91bm1hcF9hZGRyKHJ4X3BhZ2VfaW5mbywgYnVzKSwKKwkJCSAgICAgICBmcmFnX3N6LCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCX0KKworCW51bWZyYWdzID0gQU1BUF9HRVRfQklUU19QVFIoRVRIX1JYX0NPTVBMLCBudW1mcmFncywgcnhjcCk7CisJdWRwY2tzbSA9IEFNQVBfR0VUX0JJVFNfUFRSKEVUSF9SWF9DT01QTCwgdWRwY2tzbSwgcnhjcCk7CisJdGNwY2tzbSA9IEFNQVBfR0VUX0JJVFNfUFRSKEVUSF9SWF9DT01QTCwgdGNwY2tzbSwgcnhjcCk7CisJdmxhbl90YWcgPSBBTUFQX0dFVF9CSVRTX1BUUihFVEhfUlhfQ09NUEwsIHZsYW5fdGFnLCByeGNwKTsKKwl2bGFudCA9IGJlMTZfdG9fY3B1KHZsYW5fdGFnKTsKKwl2bGFuZiA9IEFNQVBfR0VUX0JJVFNfUFRSKEVUSF9SWF9DT01QTCwgdnRwLCByeGNwKTsKKwl2dG0gPSBBTUFQX0dFVF9CSVRTX1BUUihFVEhfUlhfQ09NUEwsIHZ0bSwgcnhjcCk7CisJcGt0c2l6ZSA9IEFNQVBfR0VUX0JJVFNfUFRSKEVUSF9SWF9DT01QTCwgcGt0c2l6ZSwgcnhjcCk7CisKKwlhdG9taWNfZGVjKCZwbm9iLT5yeF9xX3Bvc3RlZCk7CisKKwlpZiAodGNwY2tzbSAmJiB1ZHBja3NtICYmIHBrdHNpemUgPT0gMzIpIHsKKwkJLyogZmx1c2ggY29tcGxldGlvbiBlbnRyaWVzICovCisJCXB1dF9wYWdlKHJ4X3BhZ2VfaW5mby0+cGFnZSk7CisJCW1lbXNldChyeF9wYWdlX2luZm8sIDAsIHNpemVvZihzdHJ1Y3QgYmVfcnhfcGFnZV9pbmZvKSk7CisJCXJldHVybjsKKwl9CisJLyogT25seSBvbmUgb2YgdWRwY2tzdW0gYW5kIHRjcGNrc3VtIGNhbiBiZSBzZXQgKi8KKwlCVUdfT04odWRwY2tzbSAmJiB0Y3Bja3NtKTsKKworCS8qIGp1bWJvIGZyYW1lcyBjb3VsZCBjb21lIGluIG11bHRpcGxlIGZyYWdtZW50cyAqLworCUJVR19PTihudW1mcmFncyAhPSAoKHBrdHNpemUgKyAoZnJhZ19zeiAtIDEpKSAvIGZyYWdfc3opKTsKKwluID0gbWluKHBrdHNpemUsIGZyYWdfc3opOworCW5yZXNpZCA9IHBrdHNpemUgLSBuOwkvKiB3aWxsIGJlIHVzZWZ1bCBmb3IganVtYm8gcGt0cyAqLworCWlkeCA9IDA7CisKKwl2YSA9IHBhZ2VfYWRkcmVzcyhyeF9wYWdlX2luZm8tPnBhZ2UpICsgcnhfcGFnZV9pbmZvLT5wYWdlX29mZnNldDsKKwlwcmVmZXRjaCh2YSk7CisJcnhfZnJhZ3NbaWR4XS5wYWdlID0gcnhfcGFnZV9pbmZvLT5wYWdlOworCXJ4X2ZyYWdzW2lkeF0ucGFnZV9vZmZzZXQgPSAocnhfcGFnZV9pbmZvLT5wYWdlX29mZnNldCk7CisJcnhfZnJhZ3NbaWR4XS5zaXplID0gbjsKKwltZW1zZXQocnhfcGFnZV9pbmZvLCAwLCBzaXplb2Yoc3RydWN0IGJlX3J4X3BhZ2VfaW5mbykpOworCisJLyogSWYgd2UgZ290IG11bHRpcGxlIGZyYWdtZW50cywgd2UgaGF2ZSBtb3JlIGRhdGEuICovCisJd2hpbGUgKG5yZXNpZCkgeworCQlpZHgrKzsKKwkJaW5kZXhfaW5jKCZmaSwgcG5vYi0+cnhfcV9sZW4pOworCisJCXJ4X3BhZ2VfaW5mbyA9IChzdHJ1Y3QgYmVfcnhfcGFnZV9pbmZvICopcG5vYi0+cnhfY3R4dFtmaV07CisJCXBub2ItPnJ4X2N0eHRbZmldID0gKHZvaWQgKilOVUxMOworCQlpZiAocnhfcGFnZV9pbmZvLT5wYWdlX29mZnNldCB8fCAhcG5vYi0+cnhfcGdfc2hhcmVkKSB7CisJCQlwY2lfdW5tYXBfcGFnZShhZGFwdGVyLT5wZGV2LAorCQkJCSAgICAgICBwY2lfdW5tYXBfYWRkcihyeF9wYWdlX2luZm8sIGJ1cyksCisJCQkJICAgICAgIGZyYWdfc3osIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCX0KKworCQluID0gbWluKG5yZXNpZCwgZnJhZ19zeik7CisJCXJ4X2ZyYWdzW2lkeF0ucGFnZSA9IHJ4X3BhZ2VfaW5mby0+cGFnZTsKKwkJcnhfZnJhZ3NbaWR4XS5wYWdlX29mZnNldCA9IChyeF9wYWdlX2luZm8tPnBhZ2Vfb2Zmc2V0KTsKKwkJcnhfZnJhZ3NbaWR4XS5zaXplID0gbjsKKworCQlucmVzaWQgLT0gbjsKKwkJbWVtc2V0KHJ4X3BhZ2VfaW5mbywgMCwgc2l6ZW9mKHN0cnVjdCBiZV9yeF9wYWdlX2luZm8pKTsKKwkJYXRvbWljX2RlYygmcG5vYi0+cnhfcV9wb3N0ZWQpOworCX0KKworCWlmIChsaWtlbHkoISh2bGFuZiAmJiB2dG0pKSkgeworCQlscm9fcmVjZWl2ZV9mcmFncygmcG5vYi0+bHJvX21nciwgcnhfZnJhZ3MsCisJCQkJICBwa3RzaXplLCBwa3RzaXplLAorCQkJCSAgKHZvaWQgKikodW5zaWduZWQgbG9uZyljc3VtLCBjc3VtKTsKKwl9IGVsc2UgeworCQkvKiBWbGFuIHRhZyBwcmVzZW50IGluIHBrdCBhbmQgQkUgZm91bmQKKwkJICogdGhhdCB0aGUgdGFnIG1hdGNoZWQgYW4gZW50cnkgaW4gVkxBTiB0YWJsZQorCQkgKi8KKwkJaWYgKHVubGlrZWx5KCFwbm9iLT52bGFuX2dycCB8fCBwbm9iLT5udW1fdmxhbnMgPT0gMCkpIHsKKwkJCS8qIEJ1dCB3ZSBoYXZlIG5vIFZMQU5zIGNvbmZpZ3VyZWQuCisJCQkgKiBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4uICBEcm9wIHRoZSBwYWNrZXQuCisJCQkgKi8KKwkJCWRldl9pbmZvKCZwbm9iLT5uZXRkZXYtPmRldiwKKwkJCSAgICAgICAiQmxhZGVFbmdpbmU6IFVuZXhwZWN0ZWQgdmxhbiB0YWdnZWQgcGFja2V0XG4iKTsKKwkJCXJldHVybjsKKwkJfQorCQkvKiBwYXNzIHRoZSBWTEFOIHBhY2tldCB0byBzdGFjayAqLworCQlscm9fdmxhbl9od2FjY2VsX3JlY2VpdmVfZnJhZ3MoJnBub2ItPmxyb19tZ3IsCisJCQkJCSAgICAgICByeF9mcmFncywgcGt0c2l6ZSwgcGt0c2l6ZSwKKwkJCQkJICAgICAgIHBub2ItPnZsYW5fZ3JwLCB2bGFudCwKKwkJCQkJICAgICAgICh2b2lkICopKHVuc2lnbmVkIGxvbmcpY3N1bSwKKwkJCQkJICAgICAgIGNzdW0pOworCX0KKworCWFkYXB0ZXItPmJlX3N0YXQuYmVzX3J4X2NvYWwrKzsKK30KKworc3RydWN0IEVUSF9SWF9DT01QTF9BTUFQICpiZV9nZXRfcnhfY21wbChzdHJ1Y3QgYmVfbmV0X29iamVjdCAqcG5vYikKK3sKKwlzdHJ1Y3QgRVRIX1JYX0NPTVBMX0FNQVAgKnJ4Y3AgPSAmcG5vYi0+cnhfY3FbcG5vYi0+cnhfY3FfdGxdOworCXUzMiB2YWxpZCwgY3Q7CisKKwl2YWxpZCA9IEFNQVBfR0VUX0JJVFNfUFRSKEVUSF9SWF9DT01QTCwgdmFsaWQsIHJ4Y3ApOworCWlmICh2YWxpZCA9PSAwKQorCQlyZXR1cm4gTlVMTDsKKworCWN0ID0gQU1BUF9HRVRfQklUU19QVFIoRVRIX1JYX0NPTVBMLCBjdCwgcnhjcCk7CisJaWYgKGN0ICE9IDApIHsKKwkJLyogSW52YWxpZCBjaHV0ZSAjLiB0cmVhdCBhcyBlcnJvciAqLworCQlBTUFQX1NFVF9CSVRTX1BUUihFVEhfUlhfQ09NUEwsIGVyciwgcnhjcCwgMSk7CisJfQorCisJYmVfYWR2X3J4Y3FfdGwocG5vYik7CisJQU1BUF9TRVRfQklUU19QVFIoRVRIX1JYX0NPTVBMLCB2YWxpZCwgcnhjcCwgMCk7CisJcmV0dXJuIHJ4Y3A7Cit9CisKK3N0YXRpYyB2b2lkIHVwZGF0ZV9yeF9yYXRlKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyKQoreworCS8qIHVwZGF0ZSB0aGUgcmF0ZSBvbmNlIGluIHR3byBzZWNvbmRzICovCisJaWYgKChqaWZmaWVzIC0gYWRhcHRlci0+ZXRoX3J4X2ppZmZpZXMpID4gMiAqIChIWikpIHsKKwkJdTMyIHI7CisJCXIgPSBhZGFwdGVyLT5ldGhfcnhfYnl0ZXMgLworCQkgICAgKChqaWZmaWVzIC0gYWRhcHRlci0+ZXRoX3J4X2ppZmZpZXMpIC8gKEhaKSk7CisJCXIgPSAociAvIDEwMDAwMDApOwkvKiBNQi9TZWMgKi8KKworCQkvKiBNZWdhIEJpdHMvU2VjICovCisJCWFkYXB0ZXItPmJlX3N0YXQuYmVzX2V0aF9yeF9yYXRlID0gKHIgKiA4KTsKKwkJYWRhcHRlci0+ZXRoX3J4X2ppZmZpZXMgPSBqaWZmaWVzOworCQlhZGFwdGVyLT5ldGhfcnhfYnl0ZXMgPSAwOworCX0KK30KKworc3RhdGljIGludCBwcm9jZXNzX3J4X2NvbXBsZXRpb25zKHN0cnVjdCBiZV9uZXRfb2JqZWN0ICpwbm9iLCBpbnQgbWF4X3dvcmspCit7CisJc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwbm9iLT5hZGFwdGVyOworCXN0cnVjdCBFVEhfUlhfQ09NUExfQU1BUCAqcnhjcDsKKwl1MzIgbmMgPSAwOworCXVuc2lnbmVkIGludCBwa3RzaXplOworCisJd2hpbGUgKG1heF93b3JrICYmIChyeGNwID0gYmVfZ2V0X3J4X2NtcGwocG5vYikpKSB7CisJCXByZWZldGNoKHJ4Y3ApOworCQlwa3RzaXplID0gQU1BUF9HRVRfQklUU19QVFIoRVRIX1JYX0NPTVBMLCBwa3RzaXplLCByeGNwKTsKKwkJcHJvY2Vzc19uaWNfcnhfY29tcGxldGlvbl9scm8ocG5vYiwgcnhjcCk7CisJCWFkYXB0ZXItPmV0aF9yeF9ieXRlcyArPSBwa3RzaXplOworCQl1cGRhdGVfcnhfcmF0ZShhZGFwdGVyKTsKKwkJbmMrKzsKKwkJbWF4X3dvcmstLTsKKwkJYWRhcHRlci0+YmVfc3RhdC5iZXNfcnhfY29tcGwrKzsKKwl9CisJaWYgKGxpa2VseShhZGFwdGVyLT5tYXhfcnhfY29hbCA+IDEpKSB7CisJCWFkYXB0ZXItPmJlX3N0YXQuYmVzX3J4X2ZsdXNoKys7CisJCWxyb19mbHVzaF9hbGwoJnBub2ItPmxyb19tZ3IpOworCX0KKworCS8qIFJlZmlsbCB0aGUgcXVldWUgKi8KKwlpZiAoYXRvbWljX3JlYWQoJnBub2ItPnJ4X3FfcG9zdGVkKSA8IDkwMCkKKwkJYmVfcG9zdF9ldGhfcnhfYnVmZnMocG5vYik7CisKKwlyZXR1cm4gbmM7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgRVRIX1RYX0NPTVBMX0FNQVAgKmJlX2dldF90eF9jbXBsKHN0cnVjdCBiZV9uZXRfb2JqZWN0ICpwbm9iKQoreworCXN0cnVjdCBFVEhfVFhfQ09NUExfQU1BUCAqdHhjcCA9ICZwbm9iLT50eF9jcVtwbm9iLT50eF9jcV90bF07CisJdTMyIHZhbGlkOworCisJdmFsaWQgPSBBTUFQX0dFVF9CSVRTX1BUUihFVEhfVFhfQ09NUEwsIHZhbGlkLCB0eGNwKTsKKwlpZiAodmFsaWQgPT0gMCkKKwkJcmV0dXJuIE5VTEw7CisKKwlBTUFQX1NFVF9CSVRTX1BUUihFVEhfVFhfQ09NUEwsIHZhbGlkLCB0eGNwLCAwKTsKKwliZV9hZHZfdHhjcV90bChwbm9iKTsKKwlyZXR1cm4gdHhjcDsKKworfQorCit2b2lkIHByb2Nlc3Nfb25lX3R4X2NvbXBsKHN0cnVjdCBiZV9uZXRfb2JqZWN0ICpwbm9iLCB1MzIgZW5kX2lkeCkKK3sKKwlzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciA9IHBub2ItPmFkYXB0ZXI7CisJaW50IGN1cl9pbmRleCwgdHhfd3Jic19jb21wbGV0ZWQgPSAwOworCXN0cnVjdCBza19idWZmICpza2I7CisJdTY0IGJ1c2FkZHIsIHBhLCBwYV9sbywgcGFfaGk7CisJc3RydWN0IEVUSF9XUkJfQU1BUCAqd3JiOworCXUzMiBmcmFnX2xlbiwgbGFzdF9pbmRleCwgajsKKworCWxhc3RfaW5kZXggPSB0eF9jb21wbF9sYXN0d3JiX2lkeF9nZXQocG5vYik7CisJQlVHX09OKGxhc3RfaW5kZXggIT0gZW5kX2lkeCk7CisJcG5vYi0+dHhfY3R4dFtwbm9iLT50eF9xX3RsXSA9IE5VTEw7CisJZG8geworCQljdXJfaW5kZXggPSBwbm9iLT50eF9xX3RsOworCQl3cmIgPSAmcG5vYi0+dHhfcVtjdXJfaW5kZXhdOworCQlwYV9oaSA9IEFNQVBfR0VUX0JJVFNfUFRSKEVUSF9XUkIsIGZyYWdfcGFfaGksIHdyYik7CisJCXBhX2xvID0gQU1BUF9HRVRfQklUU19QVFIoRVRIX1dSQiwgZnJhZ19wYV9sbywgd3JiKTsKKwkJZnJhZ19sZW4gPSBBTUFQX0dFVF9CSVRTX1BUUihFVEhfV1JCLCBmcmFnX2xlbiwgd3JiKTsKKwkJYnVzYWRkciA9IChwYV9oaSA8PCAzMikgfCBwYV9sbzsKKwkJaWYgKGJ1c2FkZHIgIT0gMCkgeworCQkJcGEgPSBsZTY0X3RvX2NwdShidXNhZGRyKTsKKwkJCXBjaV91bm1hcF9zaW5nbGUoYWRhcHRlci0+cGRldiwgcGEsCisJCQkJCSBmcmFnX2xlbiwgUENJX0RNQV9UT0RFVklDRSk7CisJCX0KKwkJaWYgKGN1cl9pbmRleCA9PSBsYXN0X2luZGV4KSB7CisJCQlza2IgPSAoc3RydWN0IHNrX2J1ZmYgKilwbm9iLT50eF9jdHh0W2N1cl9pbmRleF07CisJCQlCVUdfT04oIXNrYik7CisJCQlmb3IgKGogPSAwOyBqIDwgc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFnczsgaisrKSB7CisJCQkJc3RydWN0IHNrYl9mcmFnX3N0cnVjdCAqZnJhZzsKKwkJCQlmcmFnID0gJnNrYl9zaGluZm8oc2tiKS0+ZnJhZ3Nbal07CisJCQkJcGNpX3VubWFwX3BhZ2UoYWRhcHRlci0+cGRldiwKKwkJCQkJICAgICAgICh1bG9uZykgZnJhZy0+cGFnZSwgZnJhZy0+c2l6ZSwKKwkJCQkJICAgICAgIFBDSV9ETUFfVE9ERVZJQ0UpOworCQkJfQorCQkJa2ZyZWVfc2tiKHNrYik7CisJCQlwbm9iLT50eF9jdHh0W2N1cl9pbmRleF0gPSBOVUxMOworCQl9IGVsc2UgeworCQkJQlVHX09OKHBub2ItPnR4X2N0eHRbY3VyX2luZGV4XSk7CisJCX0KKwkJdHhfd3Jic19jb21wbGV0ZWQrKzsKKwkJYmVfYWR2X3R4cV90bChwbm9iKTsKKwl9IHdoaWxlIChjdXJfaW5kZXggIT0gbGFzdF9pbmRleCk7CisJYXRvbWljX3N1Yih0eF93cmJzX2NvbXBsZXRlZCwgJnBub2ItPnR4X3FfdXNlZCk7Cit9CisKKy8qIHRoZXJlIGlzIG5vIG5lZWQgdG8gdGFrZSBhbiBTTVAgbG9jayBoZXJlIHNpbmNlIGN1cnJlbnRseQorICogd2UgaGF2ZSBvbmx5IG9uZSBpbnN0YW5jZSBvZiB0aGUgdGFza2xldCB0aGF0IGRvZXMgY29tcGxldGlvbgorICogcHJvY2Vzc2luZy4KKyAqLworc3RhdGljIHZvaWQgcHJvY2Vzc19uaWNfdHhfY29tcGxldGlvbnMoc3RydWN0IGJlX25ldF9vYmplY3QgKnBub2IpCit7CisJc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwbm9iLT5hZGFwdGVyOworCXN0cnVjdCBFVEhfVFhfQ09NUExfQU1BUCAqdHhjcDsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gcG5vYi0+bmV0ZGV2OworCXUzMiBlbmRfaWR4LCBudW1fcHJvY2Vzc2VkID0gMDsKKworCWFkYXB0ZXItPmJlX3N0YXQuYmVzX3R4X2V2ZW50cysrOworCisJd2hpbGUgKCh0eGNwID0gYmVfZ2V0X3R4X2NtcGwocG5vYikpKSB7CisJCWVuZF9pZHggPSBBTUFQX0dFVF9CSVRTX1BUUihFVEhfVFhfQ09NUEwsIHdyYl9pbmRleCwgdHhjcCk7CisJCXByb2Nlc3Nfb25lX3R4X2NvbXBsKHBub2IsIGVuZF9pZHgpOworCQludW1fcHJvY2Vzc2VkKys7CisJCWFkYXB0ZXItPmJlX3N0YXQuYmVzX3R4X2NvbXBsKys7CisJfQorCWJlX25vdGlmeV9jbXBsKHBub2IsIG51bV9wcm9jZXNzZWQsIHBub2ItPnR4X2NxX2lkLCAxKTsKKwkvKgorCSAqIFdlIGdvdCBUeCBjb21wbGV0aW9ucyBhbmQgaGF2ZSB1c2FibGUgV1JCcy4KKwkgKiBJZiB0aGUgbmV0ZGV2J3MgcXVldWUgaGFzIGJlZW4gc3RvcHBlZAorCSAqIGJlY2F1c2Ugd2UgaGFkIHJ1biBvdXQgb2YgV1JCcywgd2FrZSBpdCBub3cuCisJICovCisJc3Bpbl9sb2NrKCZhZGFwdGVyLT50eHFfbG9jayk7CisJaWYgKG5ldGlmX3F1ZXVlX3N0b3BwZWQobmV0ZGV2KQorCSAgICAmJiBhdG9taWNfcmVhZCgmcG5vYi0+dHhfcV91c2VkKSA8IHBub2ItPnR4X3FfbGVuIC8gMikgeworCQluZXRpZl93YWtlX3F1ZXVlKG5ldGRldik7CisJfQorCXNwaW5fdW5sb2NrKCZhZGFwdGVyLT50eHFfbG9jayk7Cit9CisKK3N0YXRpYyB1MzIgcG9zdF9yeF9idWZmcyhzdHJ1Y3QgYmVfbmV0X29iamVjdCAqcG5vYiwgc3RydWN0IGxpc3RfaGVhZCAqcnhibCkKK3sKKwl1MzIgbnBvc3RlZCA9IDA7CisJc3RydWN0IEVUSF9SWF9EX0FNQVAgKnJ4ZCA9IE5VTEw7CisJc3RydWN0IGJlX3JlY3ZfYnVmZmVyICpyeGJwOworCXZvaWQgKipyeF9jdHhwOworCXN0cnVjdCBSUV9EQl9BTUFQIHJxZGI7CisKKwlyeF9jdHhwID0gcG5vYi0+cnhfY3R4dDsKKworCXdoaWxlICghbGlzdF9lbXB0eShyeGJsKSAmJgorCSAgICAgICAocnhfY3R4cFtwbm9iLT5yeF9xX2hkXSA9PSBOVUxMKSAmJiBucG9zdGVkIDwgMjU1KSB7CisKKwkJcnhicCA9IGxpc3RfZmlyc3RfZW50cnkocnhibCwgc3RydWN0IGJlX3JlY3ZfYnVmZmVyLCByeGJfbGlzdCk7CisJCWxpc3RfZGVsKCZyeGJwLT5yeGJfbGlzdCk7CisJCXJ4ZCA9IHBub2ItPnJ4X3EgKyBwbm9iLT5yeF9xX2hkOworCQlBTUFQX1NFVF9CSVRTX1BUUihFVEhfUlhfRCwgZnJhZ3BhX2xvLCByeGQsIHJ4YnAtPnJ4Yl9wYV9sbyk7CisJCUFNQVBfU0VUX0JJVFNfUFRSKEVUSF9SWF9ELCBmcmFncGFfaGksIHJ4ZCwgcnhicC0+cnhiX3BhX2hpKTsKKworCQlyeF9jdHhwW3Bub2ItPnJ4X3FfaGRdID0gcnhicC0+cnhiX2N0eHQ7CisJCWJlX2Fkdl9yeHFfaGQocG5vYik7CisJCW5wb3N0ZWQrKzsKKwl9CisKKwlpZiAobnBvc3RlZCkgeworCQkvKiBOb3cgcHJlc3MgdGhlIGRvb3IgYmVsbCB0byBub3RpZnkgQmxhZGVFbmdpbmUuICovCisJCXJxZGIuZHdbMF0gPSAwOworCQlBTUFQX1NFVF9CSVRTX1BUUihSUV9EQiwgbnVtUG9zdGVkLCAmcnFkYiwgbnBvc3RlZCk7CisJCUFNQVBfU0VUX0JJVFNfUFRSKFJRX0RCLCBycSwgJnJxZGIsIHBub2ItPnJ4X3FfaWQpOworCQlQRF9XUklURSgmcG5vYi0+Zm5fb2JqLCBlcnhfcnFfZGIsIHJxZGIuZHdbMF0pOworCX0KKwlhdG9taWNfYWRkKG5wb3N0ZWQsICZwbm9iLT5yeF9xX3Bvc3RlZCk7CisJcmV0dXJuIG5wb3N0ZWQ7Cit9CisKK3ZvaWQgYmVfcG9zdF9ldGhfcnhfYnVmZnMoc3RydWN0IGJlX25ldF9vYmplY3QgKnBub2IpCit7CisJc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwbm9iLT5hZGFwdGVyOworCXUzMiBudW1fYnVmcywgcjsKKwl1NjQgYnVzYWRkciA9IDAsIHRtcF9wYTsKKwl1MzIgbWF4X2J1ZnMsIHBnX2hkOworCXUzMiBmcmFnX3NpemU7CisJc3RydWN0IGJlX3JlY3ZfYnVmZmVyICpyeGJwOworCXN0cnVjdCBsaXN0X2hlYWQgcnhibDsKKwlzdHJ1Y3QgYmVfcnhfcGFnZV9pbmZvICpyeF9wYWdlX2luZm87CisJc3RydWN0IHBhZ2UgKnBhZ2UgPSBOVUxMOworCXUzMiBwYWdlX29yZGVyID0gMDsKKwlnZnBfdCBhbGxvY19mbGFncyA9IEdGUF9BVE9NSUM7CisKKwlCVUdfT04oIWFkYXB0ZXIpOworCisJbWF4X2J1ZnMgPSA2NDsJCS8qIHNob3VsZCBiZSBldmVuICMgPD0gMjU1LiAqLworCisJZnJhZ19zaXplID0gcG5vYi0+cnhfYnVmX3NpemU7CisJcGFnZV9vcmRlciA9IGdldF9vcmRlcihmcmFnX3NpemUpOworCisJaWYgKGZyYWdfc2l6ZSA9PSA4MTkyKQorCQlhbGxvY19mbGFncyB8PSAoZ2ZwX3QpIF9fR0ZQX0NPTVA7CisJLyoKKwkgKiBGb3JtIGEgbGlua2VkIGxpc3Qgb2YgUkVDVl9CVUZGRkVSIHN0cnVjdHVyZSB0byBiZSBiZSBwb3N0ZWQuCisJICogV2Ugd2lsbCBwb3N0IGV2ZW4gbnVtYmVyIG9mIGJ1ZmZlciBzbyB0aGF0IHBhZ2VzIGNhbiBiZQorCSAqIHNoYXJlZC4KKwkgKi8KKwlJTklUX0xJU1RfSEVBRCgmcnhibCk7CisKKwlmb3IgKG51bV9idWZzID0gMDsgbnVtX2J1ZnMgPCBtYXhfYnVmcyAmJgorCQkhcG5vYi0+cnhfcGFnZV9pbmZvW3Bub2ItPnJ4X3BnX2luZm9faGRdLnBhZ2U7ICsrbnVtX2J1ZnMpIHsKKworCQlyeGJwID0gJnBub2ItPmV0aF9yeF9idWZzW251bV9idWZzXTsKKwkJcGdfaGQgPSBwbm9iLT5yeF9wZ19pbmZvX2hkOworCQlyeF9wYWdlX2luZm8gPSAmcG5vYi0+cnhfcGFnZV9pbmZvW3BnX2hkXTsKKworCQlpZiAoIXBhZ2UpIHsKKwkJCXBhZ2UgPSBhbGxvY19wYWdlcyhhbGxvY19mbGFncywgcGFnZV9vcmRlcik7CisJCQlpZiAodW5saWtlbHkocGFnZSA9PSBOVUxMKSkgeworCQkJCWFkYXB0ZXItPmJlX3N0YXQuYmVzX2V0aHJ4X3Bvc3RfZmFpbCsrOworCQkJCXBub2ItPnJ4YnVmX3Bvc3RfZmFpbCsrOworCQkJCWJyZWFrOworCQkJfQorCQkJcG5vYi0+cnhidWZfcG9zdF9mYWlsID0gMDsKKwkJCWJ1c2FkZHIgPSBwY2lfbWFwX3BhZ2UoYWRhcHRlci0+cGRldiwgcGFnZSwgMCwKKwkJCQkJICAgICAgIGZyYWdfc2l6ZSwgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCXJ4X3BhZ2VfaW5mby0+cGFnZV9vZmZzZXQgPSAwOworCQkJcnhfcGFnZV9pbmZvLT5wYWdlID0gcGFnZTsKKwkJCS8qCisJCQkgKiBJZiB3ZSBhcmUgc2hhcmluZyBhIHBhZ2UgYW1vbmcgdHdvIHNrYnMsCisJCQkgKiBhbGxvYyBhIG5ldyBvbmUgb24gdGhlIG5leHQgaXRlcmF0aW9uCisJCQkgKi8KKwkJCWlmIChwbm9iLT5yeF9wZ19zaGFyZWQgPT0gZmFsc2UpCisJCQkJcGFnZSA9IE5VTEw7CisJCX0gZWxzZSB7CisJCQlnZXRfcGFnZShwYWdlKTsKKwkJCXJ4X3BhZ2VfaW5mby0+cGFnZV9vZmZzZXQgKz0gZnJhZ19zaXplOworCQkJcnhfcGFnZV9pbmZvLT5wYWdlID0gcGFnZTsKKwkJCS8qCisJCQkgKiBXZSBhcmUgZmluaXNoZWQgd2l0aCB0aGUgYWxsb2NlZCBwYWdlLAorCQkJICogQWxsb2MgYSBuZXcgb25lIG9uIHRoZSBuZXh0IGl0ZXJhdGlvbgorCQkJICovCisJCQlwYWdlID0gTlVMTDsKKwkJfQorCQlyeGJwLT5yeGJfY3R4dCA9ICh2b2lkICopcnhfcGFnZV9pbmZvOworCQlpbmRleF9pbmMoJnBub2ItPnJ4X3BnX2luZm9faGQsIHBub2ItPnJ4X3FfbGVuKTsKKworCQlwY2lfdW5tYXBfYWRkcl9zZXQocnhfcGFnZV9pbmZvLCBidXMsIGJ1c2FkZHIpOworCQl0bXBfcGEgPSBidXNhZGRyICsgcnhfcGFnZV9pbmZvLT5wYWdlX29mZnNldDsKKwkJcnhicC0+cnhiX3BhX2xvID0gKHRtcF9wYSAmIDB4RkZGRkZGRkYpOworCQlyeGJwLT5yeGJfcGFfaGkgPSAodG1wX3BhID4+IDMyKTsKKwkJcnhicC0+cnhiX2xlbiA9IGZyYWdfc2l6ZTsKKwkJbGlzdF9hZGRfdGFpbCgmcnhicC0+cnhiX2xpc3QsICZyeGJsKTsKKwl9CQkJLyogRW5kIG9mIGZvciAqLworCisJciA9IHBvc3RfcnhfYnVmZnMocG5vYiwgJnJ4YmwpOworCUJVR19PTihyICE9IG51bV9idWZzKTsKKwlyZXR1cm47Cit9CisKKy8qCisgKiBJbnRlcnJ1cHQgc2VydmljZSBmb3IgbmV0d29yayBmdW5jdGlvbi4gIFdlIGp1c3Qgc2NoZWR1bGUgdGhlCisgKiB0YXNrbGV0IHdoaWNoIGRvZXMgYWxsIGNvbXBsZXRpb24gcHJvY2Vzc2luZy4KKyAqLworaXJxcmV0dXJuX3QgYmVfaW50KGludCBpcnEsIHZvaWQgKmRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gZGV2OworCXN0cnVjdCBiZV9uZXRfb2JqZWN0ICpwbm9iID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciA9IHBub2ItPmFkYXB0ZXI7CisJdTMyIGlzcjsKKworCWlzciA9IENTUl9SRUFEKCZwbm9iLT5mbl9vYmosIGNldi5pc3IxKTsKKwlpZiAodW5saWtlbHkoIWlzcikpCisJCXJldHVybiBJUlFfTk9ORTsKKworCXNwaW5fbG9jaygmYWRhcHRlci0+aW50X2xvY2spOworCWFkYXB0ZXItPmlzciB8PSBpc3I7CisJc3Bpbl91bmxvY2soJmFkYXB0ZXItPmludF9sb2NrKTsKKworCWFkYXB0ZXItPmJlX3N0YXQuYmVzX2ludHMrKzsKKworCXRhc2tsZXRfc2NoZWR1bGUoJmFkYXB0ZXItPnN0c19oYW5kbGVyKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qCisgKiBQb2xsIGZ1bmN0aW9uIGNhbGxlZCBieSBOQVBJIHdpdGggYSB3b3JrIGJ1ZGdldC4KKyAqIFdlIHByb2Nlc3MgYXMgbWFueSBVQy4gQkMgYW5kIE1DIHJlY2VpdmUgY29tcGxldGlvbnMKKyAqIGFzIHRoZSBidWRnZXQgYWxsb3dzIGFuZCByZXR1cm4gdGhlIGFjdHVhbCBudW1iZXIgb2YKKyAqIFJYIHN0c3R1dHNlcyBwcm9jZXNzZWQuCisgKi8KK2ludCBiZV9wb2xsKHN0cnVjdCBuYXBpX3N0cnVjdCAqbmFwaSwgaW50IGJ1ZGdldCkKK3sKKwlzdHJ1Y3QgYmVfbmV0X29iamVjdCAqcG5vYiA9CisJCQljb250YWluZXJfb2YobmFwaSwgc3RydWN0IGJlX25ldF9vYmplY3QsIG5hcGkpOworCXUzMiB3b3JrX2RvbmU7CisKKwlwbm9iLT5hZGFwdGVyLT5iZV9zdGF0LmJlc19wb2xscysrOworCXdvcmtfZG9uZSA9IHByb2Nlc3NfcnhfY29tcGxldGlvbnMocG5vYiwgYnVkZ2V0KTsKKwlCVUdfT04od29ya19kb25lID4gYnVkZ2V0KTsKKworCS8qIEFsbCBjb25zdW1lZCAqLworCWlmICh3b3JrX2RvbmUgPCBidWRnZXQpIHsKKwkJbmV0aWZfcnhfY29tcGxldGUobmFwaSk7CisJCS8qIGVuYWJsZSBpbnRyICovCisJCWJlX25vdGlmeV9jbXBsKHBub2IsIHdvcmtfZG9uZSwgcG5vYi0+cnhfY3FfaWQsIDEpOworCX0gZWxzZSB7CisJCS8qIE1vcmUgdG8gYmUgY29uc3VtZWQ7IGNvbnRpbnVlIHdpdGggaW50ZXJydXB0cyBkaXNhYmxlZCAqLworCQliZV9ub3RpZnlfY21wbChwbm9iLCB3b3JrX2RvbmUsIHBub2ItPnJ4X2NxX2lkLCAwKTsKKwl9CisJcmV0dXJuIHdvcmtfZG9uZTsKK30KKworc3RhdGljIHN0cnVjdCBFUV9FTlRSWV9BTUFQICpnZXRfZXZlbnQoc3RydWN0IGJlX25ldF9vYmplY3QgKnBub2IpCit7CisJc3RydWN0IEVRX0VOVFJZX0FNQVAgKmVxcCA9ICYocG5vYi0+ZXZlbnRfcVtwbm9iLT5ldmVudF9xX3RsXSk7CisJaWYgKCFBTUFQX0dFVF9CSVRTX1BUUihFUV9FTlRSWSwgVmFsaWQsIGVxcCkpCisJCXJldHVybiBOVUxMOworCWJlX2Fkdl9lcV90bChwbm9iKTsKKwlyZXR1cm4gZXFwOworfQorCisvKgorICogUHJvY2Vzc2VzIGFsbCB2YWxpZCBldmVudHMgaW4gdGhlIGV2ZW50IHJpbmcgYXNzb2NpYXRlZCB3aXRoIGdpdmVuCisgKiBOZXRPYmplY3QuICBBbHNvLCBub3RpZmllcyBCRSB0aGUgbnVtYmVyIG9mIGV2ZW50cyBwcm9jZXNzZWQuCisgKi8KK3N0YXRpYyBpbmxpbmUgdTMyIHByb2Nlc3NfZXZlbnRzKHN0cnVjdCBiZV9uZXRfb2JqZWN0ICpwbm9iKQoreworCXN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyID0gcG5vYi0+YWRhcHRlcjsKKwlzdHJ1Y3QgRVFfRU5UUllfQU1BUCAqZXFwOworCXUzMiByaWQsIG51bV9ldmVudHMgPSAwOworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBwbm9iLT5uZXRkZXY7CisKKwl3aGlsZSAoKGVxcCA9IGdldF9ldmVudChwbm9iKSkgIT0gTlVMTCkgeworCQlhZGFwdGVyLT5iZV9zdGF0LmJlc19ldmVudHMrKzsKKwkJcmlkID0gQU1BUF9HRVRfQklUU19QVFIoRVFfRU5UUlksIFJlc291cmNlSUQsIGVxcCk7CisJCWlmIChyaWQgPT0gcG5vYi0+cnhfY3FfaWQpIHsKKwkJCWFkYXB0ZXItPmJlX3N0YXQuYmVzX3J4X2V2ZW50cysrOworCQkJbmV0aWZfcnhfc2NoZWR1bGUoJnBub2ItPm5hcGkpOworCQl9IGVsc2UgaWYgKHJpZCA9PSBwbm9iLT50eF9jcV9pZCkgeworCQkJcHJvY2Vzc19uaWNfdHhfY29tcGxldGlvbnMocG5vYik7CisJCX0gZWxzZSBpZiAocmlkID09IHBub2ItPm1jY19jcV9pZCkgeworCQkJYmVfbWNjX3Byb2Nlc3NfY3EoJnBub2ItPm1jY19xX29iaiwgMSk7CisJCX0gZWxzZSB7CisJCQlkZXZfaW5mbygmbmV0ZGV2LT5kZXYsCisJCQkJCSJJbnZhbGlkIEVRIFJlc291cmNlSUQgJWRcbiIsIHJpZCk7CisJCX0KKwkJQU1BUF9TRVRfQklUU19QVFIoRVFfRU5UUlksIFZhbGlkLCBlcXAsIDApOworCQlBTUFQX1NFVF9CSVRTX1BUUihFUV9FTlRSWSwgUmVzb3VyY2VJRCwgZXFwLCAwKTsKKwkJbnVtX2V2ZW50cysrOworCX0KKwlyZXR1cm4gbnVtX2V2ZW50czsKK30KKworc3RhdGljIHZvaWQgdXBkYXRlX2VxZChzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciwgc3RydWN0IGJlX25ldF9vYmplY3QgKnBub2IpCit7CisJaW50IHN0YXR1czsKKwlzdHJ1Y3QgYmVfZXFfb2JqZWN0ICplcV9vYmplY3RwOworCisJLyogdXBkYXRlIG9uY2UgYSBzZWNvbmQgKi8KKwlpZiAoKGppZmZpZXMgLSBhZGFwdGVyLT5pcHNfamlmZmllcykgPiAxICogKEhaKSkgeworCQkvKiBPbmUgc2Vjb25kIGVsYXBzZWQgc2luY2UgbGFzdCB1cGRhdGUgICovCisJCXUzMiByLCBuZXdfZXFkID0gLTE7CisJCXIgPSBhZGFwdGVyLT5iZV9zdGF0LmJlc19pbnRzIC0gYWRhcHRlci0+YmVfc3RhdC5iZXNfcHJldl9pbnRzOworCQlyID0gciAvICgoamlmZmllcyAtIGFkYXB0ZXItPmlwc19qaWZmaWVzKSAvIChIWikpOworCQlhZGFwdGVyLT5iZV9zdGF0LmJlc19pcHMgPSByOworCQlhZGFwdGVyLT5pcHNfamlmZmllcyA9IGppZmZpZXM7CisJCWFkYXB0ZXItPmJlX3N0YXQuYmVzX3ByZXZfaW50cyA9IGFkYXB0ZXItPmJlX3N0YXQuYmVzX2ludHM7CisJCWlmIChyID4gSVBTX0hJX1dNICYmIGFkYXB0ZXItPmN1cl9lcWQgPCBhZGFwdGVyLT5tYXhfZXFkKQorCQkJbmV3X2VxZCA9IChhZGFwdGVyLT5jdXJfZXFkICsgOCk7CisJCWlmIChyIDwgSVBTX0xPX1dNICYmIGFkYXB0ZXItPmN1cl9lcWQgPiBhZGFwdGVyLT5taW5fZXFkKQorCQkJbmV3X2VxZCA9IChhZGFwdGVyLT5jdXJfZXFkIC0gOCk7CisJCWlmIChhZGFwdGVyLT5lbmFibGVfYWljICYmIG5ld19lcWQgIT0gLTEpIHsKKwkJCWVxX29iamVjdHAgPSAmcG5vYi0+ZXZlbnRfcV9vYmo7CisJCQlzdGF0dXMgPSBiZV9lcV9tb2RpZnlfZGVsYXkoJnBub2ItPmZuX29iaiwgMSwKKwkJCQkJCSAgICAmZXFfb2JqZWN0cCwgJm5ld19lcWQsIE5VTEwsCisJCQkJCQkgICAgTlVMTCwgTlVMTCk7CisJCQlpZiAoc3RhdHVzID09IEJFX1NVQ0NFU1MpCisJCQkJYWRhcHRlci0+Y3VyX2VxZCA9IG5ld19lcWQ7CisJCX0KKwl9Cit9CisKKy8qCisgICAgVGhpcyBmdW5jdGlvbiBub3RpZmllcyBCbGFkZUVuZ2luZSBvZiBob3cgbWFueSBldmVudHMgd2VyZSBwcm9jZXNzZWQKKyAgICBmcm9tIHRoZSBldmVudCBxdWV1ZSBieSByaW5naW5nIHRoZSBjb3JyZXNwb25kaW5nIGRvb3IgYmVsbCBhbmQKKyAgICBvcHRpb25hbGx5IHJlLWFybXMgdGhlIGV2ZW50IHF1ZXVlLgorICAgIG4JCS0gbnVtYmVyIG9mIGV2ZW50cyBwcm9jZXNzZWQKKyAgICByZV9hcm0JLSAxIC0gcmUtYXJtIHRoZSBFUSwgMCAtIGRvIG5vdCByZS1hcm0gdGhlIEVRCisKKyovCitzdGF0aWMgdm9pZCBiZV9ub3RpZnlfZXZlbnQoc3RydWN0IGJlX25ldF9vYmplY3QgKnBub2IsIGludCBuLCBpbnQgcmVfYXJtKQoreworCXN0cnVjdCBDUV9EQl9BTUFQIGVxZGI7CisJZXFkYi5kd1swXSA9IDA7CisKKwlBTUFQX1NFVF9CSVRTX1BUUihDUV9EQiwgcWlkLCAmZXFkYiwgcG5vYi0+ZXZlbnRfcV9pZCk7CisJQU1BUF9TRVRfQklUU19QVFIoQ1FfREIsIHJlYXJtLCAmZXFkYiwgcmVfYXJtKTsKKwlBTUFQX1NFVF9CSVRTX1BUUihDUV9EQiwgZXZlbnQsICZlcWRiLCAxKTsKKwlBTUFQX1NFVF9CSVRTX1BUUihDUV9EQiwgbnVtX3BvcHBlZCwgJmVxZGIsIG4pOworCS8qCisJICogVW5kZXIgc29tZSBzaXR1YXRpb25zIHdlIHNlZSBhbiBpbnRlcnJ1cHQgYW5kIG5vIHZhbGlkCisJICogRVEgZW50cnkuICBUbyBrZWVwIGdvaW5nLCB3ZSBuZWVkIHRvIHJpbmcgdGhlIERCIGV2ZW4gaWYKKwkgKiBudW1QT3N0ZWQgaXMgMC4KKwkgKi8KKwlQRF9XUklURSgmcG5vYi0+Zm5fb2JqLCBjcV9kYiwgZXFkYi5kd1swXSk7CisJcmV0dXJuOworfQorCisvKgorICogQ2FsbGVkIGZyb20gdGhlIHRhc2tsZXQgc2NoZWR1bGVkIGJ5IElTUi4gIEFsbCByZWFsIGludGVycnVwdCBwcm9jZXNzaW5nCisgKiBpcyBkb25lIGhlcmUuCisgKi8KK3ZvaWQgYmVfcHJvY2Vzc19pbnRyKHVuc2lnbmVkIGxvbmcgY29udGV4dCkKK3sKKwlzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciA9IChzdHJ1Y3QgYmVfYWRhcHRlciAqKWNvbnRleHQ7CisJc3RydWN0IGJlX25ldF9vYmplY3QgKnBub2IgPSBhZGFwdGVyLT5uZXRfb2JqOworCXUzMiBpc3IsIG47CisJdWxvbmcgZmxhZ3MgPSAwOworCisJaXNyID0gYWRhcHRlci0+aXNyOworCisJLyoKKwkgKiB3ZSBjcmVhdGUgb25seSBvbmUgTklDIGV2ZW50IHF1ZXVlIGluIExpbnV4LiBFdmVudCBpcworCSAqIGV4cGVjdGVkIG9ubHkgaW4gdGhlIGZpcnN0IGV2ZW50IHF1ZXVlCisJICovCisJQlVHX09OKGlzciAmIDB4ZmZmZmZmZmUpOworCWlmICgoaXNyICYgMSkgPT0gMCkKKwkJcmV0dXJuOwkJLyogbm90IG91ciBpbnRlcnJ1cHQgKi8KKwluID0gcHJvY2Vzc19ldmVudHMocG5vYik7CisJLyoKKwkgKiBDbGVhciB0aGUgZXZlbnQgYml0LiBhZGFwdGVyLT5pc3IgaXMgIHNldCBieQorCSAqIGhhcmQgaW50ZXJydXB0LiAgUHJldmVudCByYWNlIHdpdGggbG9jay4KKwkgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmYWRhcHRlci0+aW50X2xvY2ssIGZsYWdzKTsKKwlhZGFwdGVyLT5pc3IgJj0gfjE7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+aW50X2xvY2ssIGZsYWdzKTsKKwliZV9ub3RpZnlfZXZlbnQocG5vYiwgbiwgMSk7CisJLyoKKwkgKiBJZiBwcmV2aW91cyBhbGxvY2F0aW9uIGF0dGVtcHRzIGhhZCBmYWlsZWQgYW5kCisJICogQkUgaGFzIHVzZWQgdXAgYWxsIHBvc3RlZCBidWZmZXJzLCBwb3N0IFJYIGJ1ZmZlcnMgaGVyZQorCSAqLworCWlmIChwbm9iLT5yeGJ1Zl9wb3N0X2ZhaWwgJiYgYXRvbWljX3JlYWQoJnBub2ItPnJ4X3FfcG9zdGVkKSA9PSAwKQorCQliZV9wb3N0X2V0aF9yeF9idWZmcyhwbm9iKTsKKwl1cGRhdGVfZXFkKGFkYXB0ZXIsIHBub2IpOworCXJldHVybjsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9iZV9uZXRpZi5jIGIvZHJpdmVycy9zdGFnaW5nL2JlbmV0L2JlX25ldGlmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmI4ZGFmNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9iZV9uZXRpZi5jCkBAIC0wLDAgKzEsNzA1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA1IC0gMjAwOCBTZXJ2ZXJFbmdpbmVzCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBUaGUgZnVsbCBHTlUgR2VuZXJhbAorICogUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlIGZpbGUgY2FsbGVkIENPUFlJTkcuCisgKgorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqIGxpbnV4LWRyaXZlcnNAc2VydmVyZW5naW5lcy5jb20KKyAqCisgKiBTZXJ2ZXJFbmdpbmVzCisgKiAyMDkgTi4gRmFpciBPYWtzIEF2ZQorICogU3Vubnl2YWxlLCBDQSA5NDA4NQorICovCisvKgorICogYmVfbmV0aWYuYworICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyB2YXJpb3VzIGVudHJ5IHBvaW50cyBvZiBkcml2ZXJzIHNlZW4gYnkgdGNwL2lwIHN0YWNrLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pZl92bGFuLmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlICJiZW5ldC5oIgorI2luY2x1ZGUgPGxpbnV4L2lwLmg+CisjaW5jbHVkZSA8bGludXgvaW5ldF9scm8uaD4KKworLyogU3RyaW5ncyB0byBwcmludCBMaW5rIHByb3BlcnRpZXMgKi8KK3N0YXRpYyBjb25zdCBjaGFyICpsaW5rX3NwZWVkW10gPSB7CisJIkludmFsaWQgbGluayBTcGVlZCBWYWx1ZSIsCisJIjEwIE1icHMiLAorCSIxMDAgTWJwcyIsCisJIjEgR2JwcyIsCisJIjEwIEdicHMiCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqbGlua19kdXBsZXhbXSA9IHsKKwkiSW52YWxpZCBEdXBsZXggVmFsdWUiLAorCSJIYWxmIER1cGxleCIsCisJIkZ1bGwgRHVwbGV4IgorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmxpbmtfc3RhdGVbXSA9IHsKKwkiIiwKKwkiKGFjdGl2ZSkiCit9OworCit2b2lkIGJlX3ByaW50X2xpbmtfaW5mbyhzdHJ1Y3QgQkVfTElOS19TVEFUVVMgKmxua19zdGF0dXMpCit7CisJdTE2IHNpLCBkaSwgYWk7CisKKwkvKiBQb3J0IDAgKi8KKwlpZiAobG5rX3N0YXR1cy0+bWFjMF9zcGVlZCAmJiBsbmtfc3RhdHVzLT5tYWMwX2R1cGxleCkgeworCQkvKiBQb3J0IGlzIHVwIGFuZCBydW5uaW5nICovCisJCXNpID0gKGxua19zdGF0dXMtPm1hYzBfc3BlZWQgPCA1KSA/IGxua19zdGF0dXMtPm1hYzBfc3BlZWQgOiAwOworCQlkaSA9IChsbmtfc3RhdHVzLT5tYWMwX2R1cGxleCA8IDMpID8KKwkJICAgIGxua19zdGF0dXMtPm1hYzBfZHVwbGV4IDogMDsKKwkJYWkgPSAobG5rX3N0YXR1cy0+YWN0aXZlX3BvcnQgPT0gMCkgPyAxIDogMDsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiUG9ydE5vLiAwOiBTcGVlZCAtICVzICVzICVzXG4iLAorCQkgICAgICAgbGlua19zcGVlZFtzaV0sIGxpbmtfZHVwbGV4W2RpXSwgbGlua19zdGF0ZVthaV0pOworCX0gZWxzZQorCQlwcmludGsoS0VSTl9JTkZPICJQb3J0Tm8uIDA6IERvd25cbiIpOworCisJLyogUG9ydCAxICovCisJaWYgKGxua19zdGF0dXMtPm1hYzFfc3BlZWQgJiYgbG5rX3N0YXR1cy0+bWFjMV9kdXBsZXgpIHsKKwkJLyogUG9ydCBpcyB1cCBhbmQgcnVubmluZyAqLworCQlzaSA9IChsbmtfc3RhdHVzLT5tYWMxX3NwZWVkIDwgNSkgPyBsbmtfc3RhdHVzLT5tYWMxX3NwZWVkIDogMDsKKwkJZGkgPSAobG5rX3N0YXR1cy0+bWFjMV9kdXBsZXggPCAzKSA/CisJCSAgICBsbmtfc3RhdHVzLT5tYWMxX2R1cGxleCA6IDA7CisJCWFpID0gKGxua19zdGF0dXMtPmFjdGl2ZV9wb3J0ID09IDApID8gMSA6IDA7CisJCXByaW50ayhLRVJOX0lORk8gIlBvcnROby4gMTogU3BlZWQgLSAlcyAlcyAlc1xuIiwKKwkJICAgICAgIGxpbmtfc3BlZWRbc2ldLCBsaW5rX2R1cGxleFtkaV0sIGxpbmtfc3RhdGVbYWldKTsKKwl9IGVsc2UKKwkJcHJpbnRrKEtFUk5fSU5GTyAiUG9ydE5vLiAxOiBEb3duXG4iKTsKKworCXJldHVybjsKK30KKworc3RhdGljIGludAorYmVfZ2V0X2ZyYWdfaGVhZGVyKHN0cnVjdCBza2JfZnJhZ19zdHJ1Y3QgKmZyYWcsIHZvaWQgKiptYWNfaGRyLAorCQkgICB2b2lkICoqaXBfaGRyLCB2b2lkICoqdGNwdWRwX2hkciwKKwkJICAgdTY0ICpoZHJfZmxhZ3MsIHZvaWQgKnByaXYpCit7CisJc3RydWN0IGV0aGhkciAqZWg7CisJc3RydWN0IHZsYW5fZXRoaGRyICp2ZWg7CisJc3RydWN0IGlwaGRyICppcGg7CisJdTggKnZhID0gcGFnZV9hZGRyZXNzKGZyYWctPnBhZ2UpICsgZnJhZy0+cGFnZV9vZmZzZXQ7CisJdW5zaWduZWQgbG9uZyBsbF9obGVuOworCisJLyogZmluZCB0aGUgbWFjIGhlYWRlciwgYWJvcnQgaWYgbm90IElQdjQgKi8KKworCXByZWZldGNoKHZhKTsKKwllaCA9IChzdHJ1Y3QgZXRoaGRyICopdmE7CisJKm1hY19oZHIgPSBlaDsKKwlsbF9obGVuID0gRVRIX0hMRU47CisJaWYgKGVoLT5oX3Byb3RvICE9IGh0b25zKEVUSF9QX0lQKSkgeworCQlpZiAoZWgtPmhfcHJvdG8gPT0gaHRvbnMoRVRIX1BfODAyMVEpKSB7CisJCQl2ZWggPSAoc3RydWN0IHZsYW5fZXRoaGRyICopdmE7CisJCQlpZiAodmVoLT5oX3ZsYW5fZW5jYXBzdWxhdGVkX3Byb3RvICE9IGh0b25zKEVUSF9QX0lQKSkKKwkJCQlyZXR1cm4gLTE7CisKKwkJCWxsX2hsZW4gKz0gVkxBTl9ITEVOOworCisJCX0gZWxzZSB7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisJKmhkcl9mbGFncyA9IExST19JUFY0OworCisJaXBoID0gKHN0cnVjdCBpcGhkciAqKSh2YSArIGxsX2hsZW4pOworCSppcF9oZHIgPSBpcGg7CisJaWYgKGlwaC0+cHJvdG9jb2wgIT0gSVBQUk9UT19UQ1ApCisJCXJldHVybiAtMTsKKwkqaGRyX2ZsYWdzIHw9IExST19UQ1A7CisJKnRjcHVkcF9oZHIgPSAodTggKikgKCppcF9oZHIpICsgKGlwaC0+aWhsIDw8IDIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYmVuZXRfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCXN0cnVjdCBiZV9uZXRfb2JqZWN0ICpwbm9iID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciA9IHBub2ItPmFkYXB0ZXI7CisJc3RydWN0IG5ldF9scm9fbWdyICpscm9fbWdyOworCisJaWYgKGFkYXB0ZXItPmRldl9zdGF0ZSA8IEJFX0RFVl9TVEFURV9JTklUKQorCQlyZXR1cm4gLUVBR0FJTjsKKworCWxyb19tZ3IgPSAmcG5vYi0+bHJvX21ncjsKKwlscm9fbWdyLT5kZXYgPSBuZXRkZXY7CisKKwlscm9fbWdyLT5mZWF0dXJlcyA9IExST19GX05BUEk7CisJbHJvX21nci0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlk7CisJbHJvX21nci0+aXBfc3VtbWVkX2FnZ3IgPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWTsKKwlscm9fbWdyLT5tYXhfZGVzYyA9IEJFX01BWF9MUk9fREVTQ1JJUFRPUlM7CisJbHJvX21nci0+bHJvX2FyciA9IHBub2ItPmxyb19kZXNjOworCWxyb19tZ3ItPmdldF9mcmFnX2hlYWRlciA9IGJlX2dldF9mcmFnX2hlYWRlcjsKKwlscm9fbWdyLT5tYXhfYWdnciA9IGFkYXB0ZXItPm1heF9yeF9jb2FsOworCWxyb19tZ3ItPmZyYWdfYWxpZ25fcGFkID0gMjsKKwlpZiAobHJvX21nci0+bWF4X2FnZ3IgPiBNQVhfU0tCX0ZSQUdTKQorCQlscm9fbWdyLT5tYXhfYWdnciA9IE1BWF9TS0JfRlJBR1M7CisKKwlhZGFwdGVyLT5tYXhfcnhfY29hbCA9IEJFX0xST19NQVhfUEtUUzsKKworCWJlX3VwZGF0ZV9saW5rX3N0YXR1cyhhZGFwdGVyKTsKKworCS8qCisJICogU2V0IGNhcnJpZXIgb24gb25seSBpZiBQaHlzaWNhbCBMaW5rIHVwCisJICogRWl0aGVyIG9mIHRoZSBwb3J0IGxpbmsgc3RhdHVzIHVwIHNpZ25pZmllcyB0aGlzCisJICovCisJaWYgKChhZGFwdGVyLT5wb3J0MF9saW5rX3N0cyA9PSBCRV9QT1JUX0xJTktfVVApIHx8CisJICAgIChhZGFwdGVyLT5wb3J0MV9saW5rX3N0cyA9PSBCRV9QT1JUX0xJTktfVVApKSB7CisJCW5ldGlmX3N0YXJ0X3F1ZXVlKG5ldGRldik7CisJCW5ldGlmX2NhcnJpZXJfb24obmV0ZGV2KTsKKwl9CisKKwlhZGFwdGVyLT5kZXZfc3RhdGUgPSBCRV9ERVZfU1RBVEVfT1BFTjsKKwluYXBpX2VuYWJsZSgmcG5vYi0+bmFwaSk7CisJYmVfZW5hYmxlX2ludHIocG5vYik7CisJYmVfZW5hYmxlX2VxX2ludHIocG5vYik7CisJLyoKKwkgKiBSWCBjb21wbGV0aW9uIHF1ZXVlIG1heSBiZSBpbiBkaXMtYXJtZWQgc3RhdGUuIEFybSBpdC4KKwkgKi8KKwliZV9ub3RpZnlfY21wbChwbm9iLCAwLCBwbm9iLT5yeF9jcV9pZCwgMSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBiZW5ldF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCXN0cnVjdCBiZV9uZXRfb2JqZWN0ICpwbm9iID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciA9IHBub2ItPmFkYXB0ZXI7CisKKwluZXRpZl9zdG9wX3F1ZXVlKG5ldGRldik7CisJc3luY2hyb25pemVfaXJxKG5ldGRldi0+aXJxKTsKKworCWJlX3dhaXRfbmljX3R4X2NtcGx4X2NtcGwocG5vYik7CisJYWRhcHRlci0+ZGV2X3N0YXRlID0gQkVfREVWX1NUQVRFX0lOSVQ7CisJbmV0aWZfY2Fycmllcl9vZmYobmV0ZGV2KTsKKworCWFkYXB0ZXItPnBvcnQwX2xpbmtfc3RzID0gQkVfUE9SVF9MSU5LX0RPV047CisJYWRhcHRlci0+cG9ydDFfbGlua19zdHMgPSBCRV9QT1JUX0xJTktfRE9XTjsKKwliZV9kaXNhYmxlX2ludHIocG5vYik7CisJYmVfZGlzYWJsZV9lcV9pbnRyKHBub2IpOworCW5hcGlfZGlzYWJsZSgmcG5vYi0+bmFwaSk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFNldHRpbmcgYSBNYWMgQWRkcmVzcyBmb3IgQkUKKyAqIFRha2VzIG5ldGRldiBhbmQgYSB2b2lkIHBvaW50ZXIgYXMgYXJndW1lbnRzLgorICogVGhlIHBvaW50ZXIgaG9sZHMgdGhlIG5ldyBhZGRyZXMgdG8gYmUgdXNlZC4KKyAqLworc3RhdGljIGludCBiZW5ldF9zZXRfbWFjX2FkZHIoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdm9pZCAqcCkKK3sKKwlzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIgPSBwOworCXN0cnVjdCBiZV9uZXRfb2JqZWN0ICpwbm9iID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKworCW1lbWNweShuZXRkZXYtPmRldl9hZGRyLCBhZGRyLT5zYV9kYXRhLCBuZXRkZXYtPmFkZHJfbGVuKTsKKwliZV9yeGZfbWFjX2FkZHJlc3NfcmVhZF93cml0ZSgmcG5vYi0+Zm5fb2JqLCAwLCAwLCBmYWxzZSwgdHJ1ZSwgZmFsc2UsCisJCQkJbmV0ZGV2LT5kZXZfYWRkciwgTlVMTCwgTlVMTCk7CisJLyoKKwkgKiBTaW5jZSB3ZSBhcmUgZG9pbmcgQWN0aXZlLVBhc3NpdmUgZmFpbG92ZXIsIGJvdGgKKwkgKiBwb3J0cyBzaG91bGQgaGF2ZSBtYXRjaGluZyBNQUMgYWRkcmVzc2VzIGV2ZXJ5dGltZS4KKwkgKi8KKwliZV9yeGZfbWFjX2FkZHJlc3NfcmVhZF93cml0ZSgmcG5vYi0+Zm5fb2JqLCAxLCAwLCBmYWxzZSwgdHJ1ZSwgZmFsc2UsCisJCQkJICAgICAgbmV0ZGV2LT5kZXZfYWRkciwgTlVMTCwgTlVMTCk7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBiZV9nZXRfc3RhdHNfdGltZXJfaGFuZGxlcih1bnNpZ25lZCBsb25nIGNvbnRleHQpCit7CisJc3RydWN0IGJlX3RpbWVyX2N0eHQgKmN0eHQgPSAoc3RydWN0IGJlX3RpbWVyX2N0eHQgKiljb250ZXh0OworCisJaWYgKGF0b21pY19yZWFkKCZjdHh0LT5nZXRfc3RhdF9mbGFnKSkgeworCQlhdG9taWNfZGVjKCZjdHh0LT5nZXRfc3RhdF9mbGFnKTsKKwkJdXAoKHZvaWQgKiljdHh0LT5nZXRfc3RhdF9zZW1fYWRkcik7CisJfQorCWRlbF90aW1lcigmY3R4dC0+Z2V0X3N0YXRzX3RpbWVyKTsKKwlyZXR1cm47Cit9CisKK3ZvaWQgYmVfZ2V0X3N0YXRfY2Iodm9pZCAqY29udGV4dCwgaW50IHN0YXR1cywKKwkJICAgIHN0cnVjdCBNQ0NfV1JCX0FNQVAgKm9wdGlvbmFsX3dyYikKK3sKKwlzdHJ1Y3QgYmVfdGltZXJfY3R4dCAqY3R4dCA9IChzdHJ1Y3QgYmVfdGltZXJfY3R4dCAqKWNvbnRleHQ7CisJLyoKKwkgKiBqdXN0IHVwIHRoZSBzZW1hcGhvcmUgaWYgdGhlIGdldF9zdGF0X2ZsYWcKKwkgKiByZWFkcyAxLiBzbyB0aGF0IHRoZSB3YWl0ZXIgY2FuIGNvbnRpbnVlLgorCSAqIElmIGl0IGlzIDAsIHRoZW4gaXQgd2FzIGhhbmRsZWQgYnkgdGhlIHRpbWVyIGhhbmRsZXIuCisJICovCisJZGVsX3RpbWVyKCZjdHh0LT5nZXRfc3RhdHNfdGltZXIpOworCWlmIChhdG9taWNfcmVhZCgmY3R4dC0+Z2V0X3N0YXRfZmxhZykpIHsKKwkJYXRvbWljX2RlYygmY3R4dC0+Z2V0X3N0YXRfZmxhZyk7CisJCXVwKCh2b2lkICopY3R4dC0+Z2V0X3N0YXRfc2VtX2FkZHIpOworCX0KK30KKworc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmJlbmV0X2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBiZV9uZXRfb2JqZWN0ICpwbm9iID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciA9IHBub2ItPmFkYXB0ZXI7CisJdTY0IHBhOworCXN0cnVjdCBiZV90aW1lcl9jdHh0ICpjdHh0ID0gJmFkYXB0ZXItPnRpbWVyX2N0eHQ7CisKKwlpZiAoYWRhcHRlci0+ZGV2X3N0YXRlICE9IEJFX0RFVl9TVEFURV9PUEVOKSB7CisJCS8qIFJldHVybiBwcmV2aW91c2x5IHJlYWQgc3RhdHMgKi8KKwkJcmV0dXJuICYoYWRhcHRlci0+YmVuZXRfc3RhdHMpOworCX0KKwkvKiBHZXQgUGh5c2ljYWwgQWRkciAqLworCXBhID0gcGNpX21hcF9zaW5nbGUoYWRhcHRlci0+cGRldiwgYWRhcHRlci0+ZXRoX3N0YXRzcCwKKwkJCSAgICBzaXplb2Yoc3RydWN0IEZXQ01EX0VUSF9HRVRfU1RBVElTVElDUyksCisJCQkgICAgUENJX0RNQV9GUk9NREVWSUNFKTsKKwljdHh0LT5nZXRfc3RhdF9zZW1fYWRkciA9ICh1bnNpZ25lZCBsb25nKSZhZGFwdGVyLT5nZXRfZXRoX3N0YXRfc2VtOworCWF0b21pY19pbmMoJmN0eHQtPmdldF9zdGF0X2ZsYWcpOworCisJYmVfcnhmX3F1ZXJ5X2V0aF9zdGF0aXN0aWNzKCZwbm9iLT5mbl9vYmosIGFkYXB0ZXItPmV0aF9zdGF0c3AsCisJCQkJICAgIGNwdV90b19sZTY0KHBhKSwgYmVfZ2V0X3N0YXRfY2IsIGN0eHQsCisJCQkJICAgIE5VTEwpOworCisJY3R4dC0+Z2V0X3N0YXRzX3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZyljdHh0OworCW1vZF90aW1lcigmY3R4dC0+Z2V0X3N0YXRzX3RpbWVyLCAoamlmZmllcyArIChIWiAqIDIpKSk7CisJZG93bigodm9pZCAqKWN0eHQtPmdldF9zdGF0X3NlbV9hZGRyKTsJLyogY2FsbGJhY2sgd2lsbCB1bmJsb2NrIHVzICovCisKKwkvKiBBZGRpbmcgcG9ydDAgYW5kIHBvcnQxIHN0YXRzLiAqLworCWFkYXB0ZXItPmJlbmV0X3N0YXRzLnJ4X3BhY2tldHMgPQorCSAgICBhZGFwdGVyLT5ldGhfc3RhdHNwLT5wYXJhbXMucmVzcG9uc2UucDByZWN2ZHRvdGFsZnJhbWVzICsKKwkgICAgYWRhcHRlci0+ZXRoX3N0YXRzcC0+cGFyYW1zLnJlc3BvbnNlLnAxcmVjdmR0b3RhbGZyYW1lczsKKwlhZGFwdGVyLT5iZW5ldF9zdGF0cy50eF9wYWNrZXRzID0KKwkgICAgYWRhcHRlci0+ZXRoX3N0YXRzcC0+cGFyYW1zLnJlc3BvbnNlLnAweG1pdHVuaWNhc3RmcmFtZXMgKworCSAgICBhZGFwdGVyLT5ldGhfc3RhdHNwLT5wYXJhbXMucmVzcG9uc2UucDF4bWl0dW5pY2FzdGZyYW1lczsKKwlhZGFwdGVyLT5iZW5ldF9zdGF0cy50eF9ieXRlcyA9CisJICAgIGFkYXB0ZXItPmV0aF9zdGF0c3AtPnBhcmFtcy5yZXNwb25zZS5wMHhtaXRieXRlc2xzZCArCisJICAgIGFkYXB0ZXItPmV0aF9zdGF0c3AtPnBhcmFtcy5yZXNwb25zZS5wMXhtaXRieXRlc2xzZDsKKwlhZGFwdGVyLT5iZW5ldF9zdGF0cy5yeF9lcnJvcnMgPQorCSAgICBhZGFwdGVyLT5ldGhfc3RhdHNwLT5wYXJhbXMucmVzcG9uc2UucDBjcmNlcnJvcnMgKworCSAgICBhZGFwdGVyLT5ldGhfc3RhdHNwLT5wYXJhbXMucmVzcG9uc2UucDFjcmNlcnJvcnM7CisJYWRhcHRlci0+YmVuZXRfc3RhdHMucnhfZXJyb3JzICs9CisJICAgIGFkYXB0ZXItPmV0aF9zdGF0c3AtPnBhcmFtcy5yZXNwb25zZS5wMGFsaWdubWVudHN5bWVycnMgKworCSAgICBhZGFwdGVyLT5ldGhfc3RhdHNwLT5wYXJhbXMucmVzcG9uc2UucDFhbGlnbm1lbnRzeW1lcnJzOworCWFkYXB0ZXItPmJlbmV0X3N0YXRzLnJ4X2Vycm9ycyArPQorCSAgICBhZGFwdGVyLT5ldGhfc3RhdHNwLT5wYXJhbXMucmVzcG9uc2UucDBpbnJhbmdlbGVuZXJyb3JzICsKKwkgICAgYWRhcHRlci0+ZXRoX3N0YXRzcC0+cGFyYW1zLnJlc3BvbnNlLnAxaW5yYW5nZWxlbmVycm9yczsKKwlhZGFwdGVyLT5iZW5ldF9zdGF0cy5yeF9ieXRlcyA9CisJICAgIGFkYXB0ZXItPmV0aF9zdGF0c3AtPnBhcmFtcy5yZXNwb25zZS5wMHJlY3ZkdG90YWxieXRlc0xTRCArCisJICAgIGFkYXB0ZXItPmV0aF9zdGF0c3AtPnBhcmFtcy5yZXNwb25zZS5wMXJlY3ZkdG90YWxieXRlc0xTRDsKKwlhZGFwdGVyLT5iZW5ldF9zdGF0cy5yeF9jcmNfZXJyb3JzID0KKwkgICAgYWRhcHRlci0+ZXRoX3N0YXRzcC0+cGFyYW1zLnJlc3BvbnNlLnAwY3JjZXJyb3JzICsKKwkgICAgYWRhcHRlci0+ZXRoX3N0YXRzcC0+cGFyYW1zLnJlc3BvbnNlLnAxY3JjZXJyb3JzOworCisJYWRhcHRlci0+YmVuZXRfc3RhdHMudHhfcGFja2V0cyArPQorCSAgICBhZGFwdGVyLT5ldGhfc3RhdHNwLT5wYXJhbXMucmVzcG9uc2UucDB4bWl0bXVsdGljYXN0ZnJhbWVzICsKKwkgICAgYWRhcHRlci0+ZXRoX3N0YXRzcC0+cGFyYW1zLnJlc3BvbnNlLnAxeG1pdG11bHRpY2FzdGZyYW1lczsKKwlhZGFwdGVyLT5iZW5ldF9zdGF0cy50eF9wYWNrZXRzICs9CisJICAgIGFkYXB0ZXItPmV0aF9zdGF0c3AtPnBhcmFtcy5yZXNwb25zZS5wMHhtaXRicm9hZGNhc3RmcmFtZXMgKworCSAgICBhZGFwdGVyLT5ldGhfc3RhdHNwLT5wYXJhbXMucmVzcG9uc2UucDF4bWl0YnJvYWRjYXN0ZnJhbWVzOworCWFkYXB0ZXItPmJlbmV0X3N0YXRzLnR4X2Vycm9ycyA9IDA7CisKKwlhZGFwdGVyLT5iZW5ldF9zdGF0cy5tdWx0aWNhc3QgPQorCSAgICBhZGFwdGVyLT5ldGhfc3RhdHNwLT5wYXJhbXMucmVzcG9uc2UucDB4bWl0bXVsdGljYXN0ZnJhbWVzICsKKwkgICAgYWRhcHRlci0+ZXRoX3N0YXRzcC0+cGFyYW1zLnJlc3BvbnNlLnAxeG1pdG11bHRpY2FzdGZyYW1lczsKKworCWFkYXB0ZXItPmJlbmV0X3N0YXRzLnJ4X2ZpZm9fZXJyb3JzID0KKwkgICAgYWRhcHRlci0+ZXRoX3N0YXRzcC0+cGFyYW1zLnJlc3BvbnNlLnAwcnhmaWZvb3ZlcmZsb3dkcm9wcGVkICsKKwkgICAgYWRhcHRlci0+ZXRoX3N0YXRzcC0+cGFyYW1zLnJlc3BvbnNlLnAxcnhmaWZvb3ZlcmZsb3dkcm9wcGVkOworCWFkYXB0ZXItPmJlbmV0X3N0YXRzLnJ4X2ZyYW1lX2Vycm9ycyA9CisJICAgIGFkYXB0ZXItPmV0aF9zdGF0c3AtPnBhcmFtcy5yZXNwb25zZS5wMGFsaWdubWVudHN5bWVycnMgKworCSAgICBhZGFwdGVyLT5ldGhfc3RhdHNwLT5wYXJhbXMucmVzcG9uc2UucDFhbGlnbm1lbnRzeW1lcnJzOworCWFkYXB0ZXItPmJlbmV0X3N0YXRzLnJ4X2xlbmd0aF9lcnJvcnMgPQorCSAgICBhZGFwdGVyLT5ldGhfc3RhdHNwLT5wYXJhbXMucmVzcG9uc2UucDBpbnJhbmdlbGVuZXJyb3JzICsKKwkgICAgYWRhcHRlci0+ZXRoX3N0YXRzcC0+cGFyYW1zLnJlc3BvbnNlLnAxaW5yYW5nZWxlbmVycm9yczsKKwlhZGFwdGVyLT5iZW5ldF9zdGF0cy5yeF9sZW5ndGhfZXJyb3JzICs9CisJICAgIGFkYXB0ZXItPmV0aF9zdGF0c3AtPnBhcmFtcy5yZXNwb25zZS5wMG91dHJhbmdlZXJyb3JzICsKKwkgICAgYWRhcHRlci0+ZXRoX3N0YXRzcC0+cGFyYW1zLnJlc3BvbnNlLnAxb3V0cmFuZ2VlcnJvcnM7CisJYWRhcHRlci0+YmVuZXRfc3RhdHMucnhfbGVuZ3RoX2Vycm9ycyArPQorCSAgICBhZGFwdGVyLT5ldGhfc3RhdHNwLT5wYXJhbXMucmVzcG9uc2UucDBmcmFtZXRvb2xvbmdlcnJvcnMgKworCSAgICBhZGFwdGVyLT5ldGhfc3RhdHNwLT5wYXJhbXMucmVzcG9uc2UucDFmcmFtZXRvb2xvbmdlcnJvcnM7CisKKwlwY2lfdW5tYXBfc2luZ2xlKGFkYXB0ZXItPnBkZXYsICh1bG9uZykgYWRhcHRlci0+ZXRoX3N0YXRzcCwKKwkJCSBzaXplb2Yoc3RydWN0IEZXQ01EX0VUSF9HRVRfU1RBVElTVElDUyksCisJCQkgUENJX0RNQV9GUk9NREVWSUNFKTsKKwlyZXR1cm4gJihhZGFwdGVyLT5iZW5ldF9zdGF0cyk7CisKK30KKworc3RhdGljIHZvaWQgYmVfc3RhcnRfdHgoc3RydWN0IGJlX25ldF9vYmplY3QgKnBub2IsIHUzMiBucG9zdGVkKQoreworI2RlZmluZSBDU1JfRVRIX01BWF9TUVBPU1RTIDI1NQorCXN0cnVjdCBTUV9EQl9BTUFQIHNxZGI7CisKKwlzcWRiLmR3WzBdID0gMDsKKworCUFNQVBfU0VUX0JJVFNfUFRSKFNRX0RCLCBjaWQsICZzcWRiLCBwbm9iLT50eF9xX2lkKTsKKwl3aGlsZSAobnBvc3RlZCkgeworCQlpZiAobnBvc3RlZCA+IENTUl9FVEhfTUFYX1NRUE9TVFMpIHsKKwkJCUFNQVBfU0VUX0JJVFNfUFRSKFNRX0RCLCBudW1Qb3N0ZWQsICZzcWRiLAorCQkJCQkgIENTUl9FVEhfTUFYX1NRUE9TVFMpOworCQkJbnBvc3RlZCAtPSBDU1JfRVRIX01BWF9TUVBPU1RTOworCQl9IGVsc2UgeworCQkJQU1BUF9TRVRfQklUU19QVFIoU1FfREIsIG51bVBvc3RlZCwgJnNxZGIsIG5wb3N0ZWQpOworCQkJbnBvc3RlZCA9IDA7CisJCX0KKwkJUERfV1JJVEUoJnBub2ItPmZuX29iaiwgZXR4X3NxX2RiLCBzcWRiLmR3WzBdKTsKKwl9CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIHVwZGF0ZV90eF9yYXRlKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyKQoreworCS8qIHVwZGF0ZSB0aGUgcmF0ZSBvbmNlIGluIHR3byBzZWNvbmRzICovCisJaWYgKChqaWZmaWVzIC0gYWRhcHRlci0+ZXRoX3R4X2ppZmZpZXMpID4gMiAqIChIWikpIHsKKwkJdTMyIHI7CisJCXIgPSBhZGFwdGVyLT5ldGhfdHhfYnl0ZXMgLworCQkgICAgKChqaWZmaWVzIC0gYWRhcHRlci0+ZXRoX3R4X2ppZmZpZXMpIC8gKEhaKSk7CisJCXIgPSAociAvIDEwMDAwMDApOwkvKiBNIGJ5dGVzL3MgKi8KKwkJYWRhcHRlci0+YmVfc3RhdC5iZXNfZXRoX3R4X3JhdGUgPSAociAqIDgpOyAvKiBNIGJpdHMvcyAqLworCQlhZGFwdGVyLT5ldGhfdHhfamlmZmllcyA9IGppZmZpZXM7CisJCWFkYXB0ZXItPmV0aF90eF9ieXRlcyA9IDA7CisJfQorfQorCitzdGF0aWMgaW50IHdyYl9jbnRfaW5fc2tiKHN0cnVjdCBza19idWZmICpza2IpCit7CisJaW50IGNudCA9IDA7CisJd2hpbGUgKHNrYikgeworCQlpZiAoc2tiLT5sZW4gPiBza2ItPmRhdGFfbGVuKQorCQkJY250Kys7CisJCWNudCArPSBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzOworCQlza2IgPSBza2Jfc2hpbmZvKHNrYiktPmZyYWdfbGlzdDsKKwl9CisJQlVHX09OKGNudCA+IEJFX01BWF9UWF9GUkFHX0NPVU5UKTsKKwlyZXR1cm4gY250OworfQorCitzdGF0aWMgdm9pZCB3cmJfZmlsbChzdHJ1Y3QgRVRIX1dSQl9BTUFQICp3cmIsIHU2NCBhZGRyLCBpbnQgbGVuKQoreworCUFNQVBfU0VUX0JJVFNfUFRSKEVUSF9XUkIsIGZyYWdfcGFfaGksIHdyYiwgYWRkciA+PiAzMik7CisJQU1BUF9TRVRfQklUU19QVFIoRVRIX1dSQiwgZnJhZ19wYV9sbywgd3JiLCBhZGRyICYgMHhGRkZGRkZGRik7CisJQU1BUF9TRVRfQklUU19QVFIoRVRIX1dSQiwgZnJhZ19sZW4sIHdyYiwgbGVuKTsKK30KKworc3RhdGljIHZvaWQgd3JiX2ZpbGxfZXh0cmEoc3RydWN0IEVUSF9XUkJfQU1BUCAqd3JiLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICAgc3RydWN0IGJlX25ldF9vYmplY3QgKnBub2IpCit7CisJd3JiLT5kd1syXSA9IDA7CisJd3JiLT5kd1szXSA9IDA7CisJQU1BUF9TRVRfQklUU19QVFIoRVRIX1dSQiwgY3JjLCB3cmIsIDEpOworCWlmIChza2Jfc2hpbmZvKHNrYiktPmdzb19zZWdzID4gMSAmJiBza2Jfc2hpbmZvKHNrYiktPmdzb19zaXplKSB7CisJCUFNQVBfU0VUX0JJVFNfUFRSKEVUSF9XUkIsIGxzbywgd3JiLCAxKTsKKwkJQU1BUF9TRVRfQklUU19QVFIoRVRIX1dSQiwgbHNvX21zcywgd3JiLAorCQkJCSAgc2tiX3NoaW5mbyhza2IpLT5nc29fc2l6ZSk7CisJfSBlbHNlIGlmIChza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9QQVJUSUFMKSB7CisJCXU4IHByb3RvID0gKChzdHJ1Y3QgaXBoZHIgKilpcF9oZHIoc2tiKSktPnByb3RvY29sOworCQlpZiAocHJvdG8gPT0gSVBQUk9UT19UQ1ApCisJCQlBTUFQX1NFVF9CSVRTX1BUUihFVEhfV1JCLCB0Y3Bjcywgd3JiLCAxKTsKKwkJZWxzZSBpZiAocHJvdG8gPT0gSVBQUk9UT19VRFApCisJCQlBTUFQX1NFVF9CSVRTX1BUUihFVEhfV1JCLCB1ZHBjcywgd3JiLCAxKTsKKwl9CisJaWYgKHBub2ItPnZsYW5fZ3JwICYmIHZsYW5fdHhfdGFnX3ByZXNlbnQoc2tiKSkgeworCQlBTUFQX1NFVF9CSVRTX1BUUihFVEhfV1JCLCB2bGFuLCB3cmIsIDEpOworCQlBTUFQX1NFVF9CSVRTX1BUUihFVEhfV1JCLCB2bGFuX3RhZywgd3JiLCB2bGFuX3R4X3RhZ19nZXQoc2tiKSk7CisJfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgd3JiX2NvcHlfZXh0cmEoc3RydWN0IEVUSF9XUkJfQU1BUCAqdG8sCisJCQkJICBzdHJ1Y3QgRVRIX1dSQl9BTUFQICpmcm9tKQoreworCisJdG8tPmR3WzJdID0gZnJvbS0+ZHdbMl07CisJdG8tPmR3WzNdID0gZnJvbS0+ZHdbM107Cit9CisKKy8qIFJldHVybnMgdGhlIGFjdHVhbCBjb3VudCBvZiB3cmJzIHVzZWQgaW5jbHVkaW5nIGEgcG9zc2libGUgZHVtbXkgKi8KK3N0YXRpYyBpbnQgY29weV9za2JfdG9fdHhxKHN0cnVjdCBiZV9uZXRfb2JqZWN0ICpwbm9iLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICAgdTMyIHdyYl9jbnQsIHUzMiAqY29waWVkKQoreworCXU2NCBidXNhZGRyOworCXN0cnVjdCBFVEhfV1JCX0FNQVAgKndyYiA9IE5VTEwsICpmaXJzdCA9IE5VTEw7CisJdTMyIGk7CisJYm9vbCBkdW1teSA9IHRydWU7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBwbm9iLT5hZGFwdGVyLT5wZGV2OworCisJaWYgKHdyYl9jbnQgJiAxKQorCQl3cmJfY250Kys7CisJZWxzZQorCQlkdW1teSA9IGZhbHNlOworCisJYXRvbWljX2FkZCh3cmJfY250LCAmcG5vYi0+dHhfcV91c2VkKTsKKworCXdoaWxlIChza2IpIHsKKwkJaWYgKHNrYi0+bGVuID4gc2tiLT5kYXRhX2xlbikgeworCQkJaW50IGxlbiA9IHNrYi0+bGVuIC0gc2tiLT5kYXRhX2xlbjsKKwkJCWJ1c2FkZHIgPSBwY2lfbWFwX3NpbmdsZShwZGV2LCBza2ItPmRhdGEsIGxlbiwKKwkJCQkJCSBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJCWJ1c2FkZHIgPSBjcHVfdG9fbGU2NChidXNhZGRyKTsKKwkJCXdyYiA9ICZwbm9iLT50eF9xW3Bub2ItPnR4X3FfaGRdOworCQkJaWYgKGZpcnN0ID09IE5VTEwpIHsKKwkJCQl3cmJfZmlsbF9leHRyYSh3cmIsIHNrYiwgcG5vYik7CisJCQkJZmlyc3QgPSB3cmI7CisJCQl9IGVsc2UgeworCQkJCXdyYl9jb3B5X2V4dHJhKHdyYiwgZmlyc3QpOworCQkJfQorCQkJd3JiX2ZpbGwod3JiLCBidXNhZGRyLCBsZW4pOworCQkJYmVfYWR2X3R4cV9oZChwbm9iKTsKKwkJCSpjb3BpZWQgKz0gbGVuOworCQl9CisKKwkJZm9yIChpID0gMDsgaSA8IHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3M7IGkrKykgeworCQkJc3RydWN0IHNrYl9mcmFnX3N0cnVjdCAqZnJhZyA9CisJCQkgICAgJnNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaV07CisJCQlidXNhZGRyID0gcGNpX21hcF9wYWdlKHBkZXYsIGZyYWctPnBhZ2UsCisJCQkJCSAgICAgICBmcmFnLT5wYWdlX29mZnNldCwgZnJhZy0+c2l6ZSwKKwkJCQkJICAgICAgIFBDSV9ETUFfVE9ERVZJQ0UpOworCQkJYnVzYWRkciA9IGNwdV90b19sZTY0KGJ1c2FkZHIpOworCQkJd3JiID0gJnBub2ItPnR4X3FbcG5vYi0+dHhfcV9oZF07CisJCQlpZiAoZmlyc3QgPT0gTlVMTCkgeworCQkJCXdyYl9maWxsX2V4dHJhKHdyYiwgc2tiLCBwbm9iKTsKKwkJCQlmaXJzdCA9IHdyYjsKKwkJCX0gZWxzZSB7CisJCQkJd3JiX2NvcHlfZXh0cmEod3JiLCBmaXJzdCk7CisJCQl9CisJCQl3cmJfZmlsbCh3cmIsIGJ1c2FkZHIsIGZyYWctPnNpemUpOworCQkJYmVfYWR2X3R4cV9oZChwbm9iKTsKKwkJCSpjb3BpZWQgKz0gZnJhZy0+c2l6ZTsKKwkJfQorCQlza2IgPSBza2Jfc2hpbmZvKHNrYiktPmZyYWdfbGlzdDsKKwl9CisKKwlpZiAoZHVtbXkpIHsKKwkJd3JiID0gJnBub2ItPnR4X3FbcG5vYi0+dHhfcV9oZF07CisJCUJVR19PTihmaXJzdCA9PSBOVUxMKTsKKwkJd3JiX2NvcHlfZXh0cmEod3JiLCBmaXJzdCk7CisJCXdyYl9maWxsKHdyYiwgMCwgMCk7CisJCWJlX2Fkdl90eHFfaGQocG5vYik7CisJfQorCUFNQVBfU0VUX0JJVFNfUFRSKEVUSF9XUkIsIGNvbXBsZXRlLCB3cmIsIDEpOworCUFNQVBfU0VUX0JJVFNfUFRSKEVUSF9XUkIsIGxhc3QsIHdyYiwgMSk7CisJcmV0dXJuIHdyYl9jbnQ7Cit9CisKKy8qIEZvciBlYWNoIHNrYiB0cmFuc21pdHRlZCwgdHhfY3R4dCBzdG9yZXMgdGhlIG51bSBvZiB3cmJzIGluIHRoZQorICogc3RhcnQgaW5kZXggYW5kIHNrYiBwb2ludGVyIGluIHRoZSBlbmQgaW5kZXgKKyAqLworc3RhdGljIGlubGluZSB2b2lkIGJlX3R4X3dyYl9pbmZvX3JlbWVtYmVyKHN0cnVjdCBiZV9uZXRfb2JqZWN0ICpwbm9iLAorCQkJCQkgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgd3JiX2NudCwKKwkJCQkJICAgdTMyIHN0YXJ0KQoreworCSoodTMyICopICgmcG5vYi0+dHhfY3R4dFtzdGFydF0pID0gd3JiX2NudDsKKwlpbmRleF9hZHYoJnN0YXJ0LCB3cmJfY250IC0gMSwgcG5vYi0+dHhfcV9sZW4pOworCXBub2ItPnR4X2N0eHRbc3RhcnRdID0gc2tiOworfQorCitzdGF0aWMgaW50IGJlbmV0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlzdHJ1Y3QgYmVfbmV0X29iamVjdCAqcG5vYiA9IG5ldGRldl9wcml2KG5ldGRldik7CisJc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwbm9iLT5hZGFwdGVyOworCXUzMiB3cmJfY250LCBjb3BpZWQgPSAwOworCXUzMiBzdGFydCA9IHBub2ItPnR4X3FfaGQ7CisKKwlhZGFwdGVyLT5iZV9zdGF0LmJlc190eF9yZXFzKys7CisKKwl3cmJfY250ID0gd3JiX2NudF9pbl9za2Ioc2tiKTsKKwlzcGluX2xvY2tfYmgoJmFkYXB0ZXItPnR4cV9sb2NrKTsKKwlpZiAoKHBub2ItPnR4X3FfbGVuIC0gMiAtIGF0b21pY19yZWFkKCZwbm9iLT50eF9xX3VzZWQpKSA8PSB3cmJfY250KSB7CisJCW5ldGlmX3N0b3BfcXVldWUocG5vYi0+bmV0ZGV2KTsKKwkJc3Bpbl91bmxvY2tfYmgoJmFkYXB0ZXItPnR4cV9sb2NrKTsKKwkJYWRhcHRlci0+YmVfc3RhdC5iZXNfdHhfZmFpbHMrKzsKKwkJcmV0dXJuIE5FVERFVl9UWF9CVVNZOworCX0KKwlzcGluX3VubG9ja19iaCgmYWRhcHRlci0+dHhxX2xvY2spOworCisJd3JiX2NudCA9IGNvcHlfc2tiX3RvX3R4cShwbm9iLCBza2IsIHdyYl9jbnQsICZjb3BpZWQpOworCWJlX3R4X3dyYl9pbmZvX3JlbWVtYmVyKHBub2IsIHNrYiwgd3JiX2NudCwgc3RhcnQpOworCisJYmVfc3RhcnRfdHgocG5vYiwgd3JiX2NudCk7CisKKwlhZGFwdGVyLT5ldGhfdHhfYnl0ZXMgKz0gY29waWVkOworCWFkYXB0ZXItPmJlX3N0YXQuYmVzX3R4X3dyYnMgKz0gd3JiX2NudDsKKwl1cGRhdGVfdHhfcmF0ZShhZGFwdGVyKTsKKwluZXRkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKworCXJldHVybiBORVRERVZfVFhfT0s7Cit9CisKKy8qCisgKiBUaGlzIGlzIHRoZSBkcml2ZXIgZW50cnkgcG9pbnQgdG8gY2hhbmdlIHRoZSBtdHUgb2YgdGhlIGRldmljZQorICogUmV0dXJucyAwIGZvciBzdWNjZXNzIGFuZCBlcnJubyBmb3IgZmFpbHVyZS4KKyAqLworc3RhdGljIGludCBiZW5ldF9jaGFuZ2VfbXR1KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIGludCBuZXdfbXR1KQoreworCS8qCisJICogQkUgc3VwcG9ydHMganVtYm8gZnJhbWUgc2l6ZSB1cHRvIDkwMDAgYnl0ZXMgaW5jbHVkaW5nIHRoZSBsaW5rIGxheWVyCisJICogaGVhZGVyLiBDb25zaWRlcmluZyB0aGUgZGlmZmVyZW50IHZhcmlhbnRzIG9mIGZyYW1lIGZvcm1hdHMgcG9zc2libGUKKwkgKiBsaWtlIFZMQU4sIFNOQVAvTExDLCB0aGUgbWF4aW11bSBwb3NzaWJsZSB2YWx1ZSBmb3IgTVRVIGlzIDg5NzQgYnl0ZXMKKwkgKi8KKworCWlmIChuZXdfbXR1IDwgKEVUSF9aTEVOICsgRVRIX0ZDU19MRU4pIHx8IChuZXdfbXR1ID4gQkVfTUFYX01UVSkpIHsKKwkJZGV2X2luZm8oJm5ldGRldi0+ZGV2LCAiSW52YWxpZCBNVFUgcmVxdWVzdGVkLiAiCisJCQkgICAgICAgIk11c3QgYmUgYmV0d2VlbiAlZCBhbmQgJWQgYnl0ZXNcbiIsCisJCQkJICAgICAgIChFVEhfWkxFTiArIEVUSF9GQ1NfTEVOKSwgQkVfTUFYX01UVSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlkZXZfaW5mbygmbmV0ZGV2LT5kZXYsICJNVFUgY2hhbmdlZCBmcm9tICVkIHRvICVkXG4iLAorCQkJCQkJbmV0ZGV2LT5tdHUsIG5ld19tdHUpOworCW5ldGRldi0+bXR1ID0gbmV3X210dTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFRoaXMgaXMgdGhlIGRyaXZlciBlbnRyeSBwb2ludCB0byByZWdpc3RlciBhIHZsYW4gd2l0aCB0aGUgZGV2aWNlCisgKi8KK3N0YXRpYyB2b2lkIGJlbmV0X3ZsYW5fcmVnaXN0ZXIoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKKwkJCQlzdHJ1Y3Qgdmxhbl9ncm91cCAqZ3JwKQoreworCXN0cnVjdCBiZV9uZXRfb2JqZWN0ICpwbm9iID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKworCWJlX2Rpc2FibGVfZXFfaW50cihwbm9iKTsKKwlwbm9iLT52bGFuX2dycCA9IGdycDsKKwlwbm9iLT5udW1fdmxhbnMgPSAwOworCWJlX2VuYWJsZV9lcV9pbnRyKHBub2IpOworfQorCisvKgorICogVGhpcyBpcyB0aGUgZHJpdmVyIGVudHJ5IHBvaW50IHRvIGFkZCBhIHZsYW4gdmxhbl9pZAorICogd2l0aCB0aGUgZGV2aWNlIG5ldGRldgorICovCitzdGF0aWMgdm9pZCBiZW5ldF92bGFuX2FkZF92aWQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdTE2IHZsYW5faWQpCit7CisJc3RydWN0IGJlX25ldF9vYmplY3QgKnBub2IgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCisJaWYgKHBub2ItPm51bV92bGFucyA9PSAoQkVfTlVNX1ZMQU5fU1VQUE9SVEVEIC0gMSkpIHsKKwkJLyogbm8gIHdheSB0byByZXR1cm4gYW4gZXJyb3IgKi8KKwkJZGV2X2luZm8oJm5ldGRldi0+ZGV2LAorCQkgICAgICAgIkJsYWRlRW5naW5lOiBDYW5ub3QgY29uZmlndXJlIG1vcmUgdGhhbiAlZCBWbGFuc1xuIiwKKwkJCSAgICAgICBCRV9OVU1fVkxBTl9TVVBQT1JURUQpOworCQlyZXR1cm47CisJfQorCS8qIFRoZSBuZXcgdmxhbiB0YWcgd2lsbCBiZSBpbiB0aGUgc2xvdCBpbmRpY2F0ZWQgYnkgbnVtX3ZsYW5zLiAqLworCXBub2ItPnZsYW5fdGFnW3Bub2ItPm51bV92bGFucysrXSA9IHZsYW5faWQ7CisJYmVfcnhmX3ZsYW5fY29uZmlnKCZwbm9iLT5mbl9vYmosIGZhbHNlLCBwbm9iLT5udW1fdmxhbnMsCisJCQkgICBwbm9iLT52bGFuX3RhZywgTlVMTCwgTlVMTCwgTlVMTCk7Cit9CisKKy8qCisgKiBUaGlzIGlzIHRoZSBkcml2ZXIgZW50cnkgcG9pbnQgdG8gcmVtb3ZlIGEgdmxhbiB2bGFuX2lkCisgKiB3aXRoIHRoZSBkZXZpY2UgbmV0ZGV2CisgKi8KK3N0YXRpYyB2b2lkIGJlbmV0X3ZsYW5fcmVtX3ZpZChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB1MTYgdmxhbl9pZCkKK3sKKwlzdHJ1Y3QgYmVfbmV0X29iamVjdCAqcG5vYiA9IG5ldGRldl9wcml2KG5ldGRldik7CisKKwl1MzIgaSwgdmFsdWU7CisKKwkvKgorCSAqIEluIEJsYWRlIEVuZ2luZSwgd2Ugc3VwcG9ydCAzMiB2bGFuIHRhZyBmaWx0ZXJzIGFjcm9zcyBib3RoIHBvcnRzLgorCSAqIFRvIHByb2dyYW0gYSB2bGFuIHRhZywgdGhlIFJYRl9SVFBSX0NTUiByZWdpc3RlciBpcyB1c2VkLgorCSAqIEVhY2ggMzItYml0IHZhbHVlIG9mIFJYRl9SVERSX0NTUiBjYW4gYWRkcmVzcyAyIHZsYW4gdGFnIGVudHJpZXMuCisJICogVGhlIFZsYW4gdGFibGUgaXMgb2YgZGVwdGggMTYuIHRodXMgd2Ugc3VwcG9ydCAzMiB0YWdzLgorCSAqLworCisJdmFsdWUgPSB2bGFuX2lkIHwgVkxBTl9WQUxJRF9CSVQ7CisJZm9yIChpID0gMDsgaSA8IEJFX05VTV9WTEFOX1NVUFBPUlRFRDsgaSsrKSB7CisJCWlmIChwbm9iLT52bGFuX3RhZ1tpXSA9PSB2bGFuX2lkKQorCQkJYnJlYWs7CisJfQorCisJaWYgKGkgPT0gQkVfTlVNX1ZMQU5fU1VQUE9SVEVEKQorCQlyZXR1cm47CisJLyogTm93IGNvbXBhY3QgdGhlIHZsYW4gdGFnIGFycmF5IGJ5IHJlbW92aW5nIGhvbGUgY3JlYXRlZC4gKi8KKwl3aGlsZSAoKGkgKyAxKSA8IEJFX05VTV9WTEFOX1NVUFBPUlRFRCkgeworCQlwbm9iLT52bGFuX3RhZ1tpXSA9IHBub2ItPnZsYW5fdGFnW2kgKyAxXTsKKwkJaSsrOworCX0KKwlpZiAoKGkgKyAxKSA9PSBCRV9OVU1fVkxBTl9TVVBQT1JURUQpCisJCXBub2ItPnZsYW5fdGFnW2ldID0gKHUxNikgMHgwOworCXBub2ItPm51bV92bGFucy0tOworCWJlX3J4Zl92bGFuX2NvbmZpZygmcG5vYi0+Zm5fb2JqLCBmYWxzZSwgcG5vYi0+bnVtX3ZsYW5zLAorCQkJICAgcG5vYi0+dmxhbl90YWcsIE5VTEwsIE5VTEwsIE5VTEwpOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcHJvZ3JhbSBtdWx0aWNhc3QKKyAqIGFkZHJlc3MgaW4gdGhlIG11bHRpY2FzdCBmaWx0ZXIgb2YgdGhlIEFTSUMuCisgKi8KK3N0YXRpYyB2b2lkIGJlX3NldF9tdWx0aWNhc3RfZmlsdGVyKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJc3RydWN0IGJlX25ldF9vYmplY3QgKnBub2IgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXN0cnVjdCBkZXZfbWNfbGlzdCAqbWNfcHRyOworCXU4IG1hY19hZGRyWzMyXVtFVEhfQUxFTl07CisJaW50IGk7CisKKwlpZiAobmV0ZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSkgeworCQkvKiBzZXQgQkUgaW4gTXVsdGljYXN0IHByb21pc2N1b3VzICovCisJCWJlX3J4Zl9tdWx0aWNhc3RfY29uZmlnKCZwbm9iLT5mbl9vYmosIHRydWUsIDAsIE5VTEwsIE5VTEwsCisJCQkJCU5VTEwsIE5VTEwpOworCQlyZXR1cm47CisJfQorCisJZm9yIChtY19wdHIgPSBuZXRkZXYtPm1jX2xpc3QsIGkgPSAwOyBtY19wdHI7CisJICAgICBtY19wdHIgPSBtY19wdHItPm5leHQsIGkrKykgeworCQltZW1jcHkoJm1hY19hZGRyW2ldWzBdLCBtY19wdHItPmRtaV9hZGRyLCBFVEhfQUxFTik7CisJfQorCisJLyogcmVzZXQgdGhlIHByb21pc2N1b3VzIG1vZGUgYWxzby4gKi8KKwliZV9yeGZfbXVsdGljYXN0X2NvbmZpZygmcG5vYi0+Zm5fb2JqLCBmYWxzZSwgaSwKKwkJCQkmbWFjX2FkZHJbMF1bMF0sIE5VTEwsIE5VTEwsIE5VTEwpOworfQorCisvKgorICogVGhpcyBpcyB0aGUgZHJpdmVyIGVudHJ5IHBvaW50IHRvIHNldCBtdWx0aWNhc3QgbGlzdAorICogd2l0aCB0aGUgZGV2aWNlIG5ldGRldi4gVGhpcyBmdW5jdGlvbiB3aWxsIGJlIHVzZWQgdG8KKyAqIHNldCBwcm9taXNjdW91cyBtb2RlIG9yIG11bHRpY2FzdCBwcm9taXNjdW91cyBtb2RlCisgKiBvciBtdWx0aWNhc3QgbW9kZS4uLi4KKyAqLworc3RhdGljIHZvaWQgYmVuZXRfc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJc3RydWN0IGJlX25ldF9vYmplY3QgKnBub2IgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCisJaWYgKG5ldGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgeworCQliZV9yeGZfcHJvbWlzY3VvdXMoJnBub2ItPmZuX29iaiwgMSwgMSwgTlVMTCwgTlVMTCwgTlVMTCk7CisJfSBlbHNlIHsKKwkJYmVfcnhmX3Byb21pc2N1b3VzKCZwbm9iLT5mbl9vYmosIDAsIDAsIE5VTEwsIE5VTEwsIE5VTEwpOworCQliZV9zZXRfbXVsdGljYXN0X2ZpbHRlcihuZXRkZXYpOworCX0KK30KKworaW50IGJlbmV0X2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlzdHJ1Y3QgYmVfbmV0X29iamVjdCAqcG5vYiA9IG5ldGRldl9wcml2KG5ldGRldik7CisJc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwbm9iLT5hZGFwdGVyOworCisJZXRoZXJfc2V0dXAobmV0ZGV2KTsKKworCW5ldGRldi0+b3BlbiA9ICZiZW5ldF9vcGVuOworCW5ldGRldi0+c3RvcCA9ICZiZW5ldF9jbG9zZTsKKwluZXRkZXYtPmhhcmRfc3RhcnRfeG1pdCA9ICZiZW5ldF94bWl0OworCisJbmV0ZGV2LT5nZXRfc3RhdHMgPSAmYmVuZXRfZ2V0X3N0YXRzOworCisJbmV0ZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSAmYmVuZXRfc2V0X211bHRpY2FzdF9saXN0OworCisJbmV0ZGV2LT5jaGFuZ2VfbXR1ID0gJmJlbmV0X2NoYW5nZV9tdHU7CisJbmV0ZGV2LT5zZXRfbWFjX2FkZHJlc3MgPSAmYmVuZXRfc2V0X21hY19hZGRyOworCisJbmV0ZGV2LT52bGFuX3J4X3JlZ2lzdGVyID0gYmVuZXRfdmxhbl9yZWdpc3RlcjsKKwluZXRkZXYtPnZsYW5fcnhfYWRkX3ZpZCA9IGJlbmV0X3ZsYW5fYWRkX3ZpZDsKKwluZXRkZXYtPnZsYW5fcnhfa2lsbF92aWQgPSBiZW5ldF92bGFuX3JlbV92aWQ7CisKKwluZXRkZXYtPmZlYXR1cmVzID0KKwkgICAgTkVUSUZfRl9TRyB8IE5FVElGX0ZfSElHSERNQSB8IE5FVElGX0ZfSFdfVkxBTl9SWCB8IE5FVElGX0ZfVFNPIHwKKwkgICAgTkVUSUZfRl9IV19WTEFOX1RYIHwgTkVUSUZfRl9IV19WTEFOX0ZJTFRFUiB8IE5FVElGX0ZfSVBfQ1NVTTsKKworCW5ldGRldi0+ZmxhZ3MgfD0gSUZGX01VTFRJQ0FTVDsKKworCS8qIElmIGRldmljZSBpcyBEQUMgQ2FwYWJsZSwgc2V0IHRoZSBISUdIRE1BIGZsYWcgZm9yIG5ldGRldmljZS4gKi8KKwlpZiAoYWRhcHRlci0+ZG1hXzY0Yml0X2NhcCkKKwkJbmV0ZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX0hJR0hETUE7CisKKwlTRVRfRVRIVE9PTF9PUFMobmV0ZGV2LCAmYmVfZXRodG9vbF9vcHMpOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JlbmV0L2JlbmV0LmggYi9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvYmVuZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOWExZjA4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JlbmV0L2JlbmV0LmgKQEAgLTAsMCArMSw0MjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgLSAyMDA4IFNlcnZlckVuZ2luZXMKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFRoZSBmdWxsIEdOVSBHZW5lcmFsCisgKiBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUgZmlsZSBjYWxsZWQgQ09QWUlORy4KKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogbGludXgtZHJpdmVyc0BzZXJ2ZXJlbmdpbmVzLmNvbQorICoKKyAqIFNlcnZlckVuZ2luZXMKKyAqIDIwOSBOLiBGYWlyIE9ha3MgQXZlCisgKiBTdW5ueXZhbGUsIENBIDk0MDg1CisgKi8KKyNpZm5kZWYgX0JFTkVUX0hfCisjZGVmaW5lIF9CRU5FVF9IXworCisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW5ldF9scm8uaD4KKyNpbmNsdWRlICJod2xpYi5oIgorCisjZGVmaW5lIF9TQV9NT0RVTEVfTkFNRSAibmV0LWRyaXZlciIKKworI2RlZmluZSBWTEFOX1ZBTElEX0JJVAkJMHg4MDAwCisjZGVmaW5lIEJFX05VTV9WTEFOX1NVUFBPUlRFRAkzMgorI2RlZmluZSBCRV9QT1JUX0xJTktfRE9XTiAgICAgICAwMDAwCisjZGVmaW5lIEJFX1BPUlRfTElOS19VUCAgICAgICAgIDAwMDEKKyNkZWZpbmUJQkVfTUFYX1RYX0ZSQUdfQ09VTlQJCSgzMCkKKworLyogRmxhZyBiaXRzIGZvciBzZW5kIG9wZXJhdGlvbiAqLworI2RlZmluZSBJUENTICAgICAgICAgICAgKDEgPDwgMCkJLyogRW5hYmxlIElQIGNoZWNrc3VtIG9mZmxvYWQgKi8KKyNkZWZpbmUgVURQQ1MgICAgICAgICAgICgxIDw8IDEpCS8qIEVuYWJsZSBVRFAgY2hlY2tzdW0gb2ZmbG9hZCAqLworI2RlZmluZSBUQ1BDUyAgICAgICAgICAgKDEgPDwgMikJLyogRW5hYmxlIFRDUCBjaGVja3N1bSBvZmZsb2FkICovCisjZGVmaW5lIExTTyAgICAgICAgICAgICAoMSA8PCAzKQkvKiBFbmFibGUgTGFyZ2UgU2VnbWVudCAgb2ZmbG9hZCAqLworI2RlZmluZSBFVEhWTEFOICAgICAgICAgKDEgPDwgNCkJLyogRW5hYmxlIFZMQU4gaW5zZXJ0ICovCisjZGVmaW5lIEVUSEVWRU5UICAgICAgICAoMSA8PCA1KQkvKiBHZW5lcmF0ZSAgZXZlbnQgb24gY29tcGxldGlvbiAqLworI2RlZmluZSBFVEhDT01QTEVURSAgICAgKDEgPDwgNikJLyogR2VuZXJhdGUgY29tcGxldGlvbiB3aGVuIGRvbmUgKi8KKyNkZWZpbmUgSVBTRUMgICAgICAgICAgICgxIDw8IDcpCS8qIEVuYWJsZSBJUFNFQyAqLworI2RlZmluZSBGT1JXQVJEICAgICAgICAgKDEgPDwgOCkJLyogU2VuZCB0aGUgcGFja2V0IGluIGZvcndhcmRpbmcgcGF0aCAqLworI2RlZmluZSBGSU4gICAgICAgICAgICAgKDEgPDwgOSkJLyogSXNzdWUgRklOIHNlZ21lbnQgKi8KKworI2RlZmluZSBCRV9NQVhfTVRVCTg5NzQKKworI2RlZmluZSBCRV9NQVhfTFJPX0RFU0NSSVBUT1JTCQkJOAorI2RlZmluZSBCRV9MUk9fTUFYX1BLVFMJCQkJNjQKKyNkZWZpbmUgQkVfTUFYX0ZSQUdTX1BFUl9GUkFNRQkJCTYKKworZXh0ZXJuIGNvbnN0IGNoYXIgYmVfZHJ2cl92ZXJbXTsKK2V4dGVybiBjaGFyIGJlX2Z3X3ZlcltdOworZXh0ZXJuIGNoYXIgYmVfZHJpdmVyX25hbWVbXTsKKworZXh0ZXJuIHN0cnVjdCBldGh0b29sX29wcyBiZV9ldGh0b29sX29wczsKKworI2RlZmluZSBCRV9ERVZfU1RBVEVfTk9ORSAwCisjZGVmaW5lIEJFX0RFVl9TVEFURV9JTklUIDEKKyNkZWZpbmUgQkVfREVWX1NUQVRFX09QRU4gMgorI2RlZmluZSBCRV9ERVZfU1RBVEVfU1VTUEVORCAzCisKKy8qIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gZGVzY3JpYmUgcGh5c2ljYWwgZnJhZ21lbnRzIHRvIHVzZQorICogZm9yIERNQWluZyBkYXRhIGZyb20gTklDLgorICovCitzdHJ1Y3QgYmVfcmVjdl9idWZmZXIgeworCXN0cnVjdCBsaXN0X2hlYWQgcnhiX2xpc3Q7CS8qIGZvciBtYWludGFpbmluZyBhIGxpbmtlZCBsaXN0ICovCisJdm9pZCAqcnhiX3ZhOwkJLyogYnVmZmVyIHZpcnR1YWwgYWRkcmVzcyAqLworCXUzMiByeGJfcGFfbG87CQkvKiBsb3cgcGFydCBvZiBwaHlzaWNhbCBhZGRyZXNzICovCisJdTMyIHJ4Yl9wYV9oaTsJCS8qIGhpZ2ggcGFydCBvZiBwaHlzaWNhbCBhZGRyZXNzICovCisJdTMyIHJ4Yl9sZW47CQkvKiBsZW5ndGggb2YgcmVjdiBidWZmZXIgKi8KKwl2b2lkICpyeGJfY3R4dDsJCS8qIGNvbnRleHQgZm9yIE9TTSBkcml2ZXIgdG8gdXNlICovCit9OworCisvKgorICogZnJhZ21lbnQgbGlzdCB0byBkZXNjcmliZSBzY2F0dGVyZWQgZGF0YS4KKyAqLworc3RydWN0IGJlX3R4X2ZyYWdfbGlzdCB7CisJdTMyIHR4Yl9sZW47CQkvKiBTaXplIG9mIHRoaXMgZnJhZ21lbnQgKi8KKwl1MzIgdHhiX3BhX2xvOwkJLyogTG93ZXIgMzIgYml0cyBvZiA2NCBiaXQgcGh5c2ljYWwgYWRkciAqLworCXUzMiB0eGJfcGFfaGk7CQkvKiBIaWdoZXIgMzIgYml0cyBvZiA2NCBiaXQgcGh5c2ljYWwgYWRkciAqLworfTsKKworc3RydWN0IGJlX3J4X3BhZ2VfaW5mbyB7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJZG1hX2FkZHJfdCBidXM7CisJdTE2IHBhZ2Vfb2Zmc2V0OworfTsKKworLyoKKyAqICBUaGlzIHN0cnVjdHVyZSBpcyB0aGUgbWFpbiB0cmFja2luZyBzdHJ1Y3R1cmUgZm9yIGEgTklDIGludGVyZmFjZS4KKyAqLworc3RydWN0IGJlX25ldF9vYmplY3QgeworCS8qIE1DQyBSaW5nIC0gdXNlZCB0byBzZW5kIGZ3Y21kcyB0byBlbWJlZGRlZCBBUk0gcHJvY2Vzc29yICovCisJc3RydWN0IE1DQ19XUkJfQU1BUCAqbWNjX3E7CS8qIFZBIG9mIHRoZSBzdGFydCBvZiB0aGUgcmluZyAqLworCXUzMiBtY2NfcV9sZW47CQkJLyogIyBvZiBXUkIgZW50cmllcyBpbiB0aGlzIHJpbmcgKi8KKwl1MzIgbWNjX3Ffc2l6ZTsKKwl1MzIgbWNjX3FfaGQ7CQkJLyogTUNDIHJpbmcgaGVhZCAqLworCXU4IG1jY19xX2NyZWF0ZWQ7CQkvKiBmbGFnIHRvIGhlbHAgY2xlYW51cCAqLworCXN0cnVjdCBiZV9tY2Nfb2JqZWN0IG1jY19xX29iajsJLyogQkVDTElCJ3MgTUNDIHJpbmcgT2JqZWN0ICovCisJZG1hX2FkZHJfdCBtY2NfcV9idXM7CQkvKiBETUEnYmxlIGJ1cyBhZGRyZXNzICovCisKKwkvKiBNQ0MgQ29tcGxldGlvbiBSaW5nIC0gRlcgcmVzcG9uc2VzIHRvIGZ3Y21kcyBzZW50IGZyb20gTUNDIHJpbmcgKi8KKwlzdHJ1Y3QgTUNDX0NRX0VOVFJZX0FNQVAgKm1jY19jcTsgLyogVkEgb2YgdGhlIHN0YXJ0IG9mIHRoZSByaW5nICovCisJdTMyIG1jY19jcV9sZW47CQkJLyogIyBvZiBjb21wbC4gZW50cmllcyBpbiB0aGlzIHJpbmcgKi8KKwl1MzIgbWNjX2NxX3NpemU7CisJdTMyIG1jY19jcV90bDsJCQkvKiBjb21wbC4gcmluZyB0YWlsICovCisJdTggbWNjX2NxX2NyZWF0ZWQ7CQkvKiBmbGFnIHRvIGhlbHAgY2xlYW51cCAqLworCXN0cnVjdCBiZV9jcV9vYmplY3QgbWNjX2NxX29iajsJLyogQkVDTElCJ3MgTUNDIGNvbXBsLiByaW5nIG9iamVjdCAqLworCXUzMiBtY2NfY3FfaWQ7CQkJLyogTUNDIHJpbmcgSUQgKi8KKwlkbWFfYWRkcl90IG1jY19jcV9idXM7CQkvKiBETUEnYmxlIGJ1cyBhZGRyZXNzICovCisKKwlzdHJ1Y3QgcmluZ19kZXNjIG1iX3JkOwkJLyogUkQgZm9yIE1DQ19NQUlMX0JPWCAqLworCXZvaWQgKm1iX3B0cjsJCQkvKiBtYWlsYm94IHB0ciB0byBiZSBmcmVlZCAgKi8KKwlkbWFfYWRkcl90IG1iX2J1czsJCS8qIERNQSdibGUgYnVzIGFkZHJlc3MgKi8KKwl1MzIgbWJfc2l6ZTsKKworCS8qIEJFQ2xpYiB1c2VzIGFuIGFycmF5IG9mIGNvbnRleHQgb2JqZWN0cyB0byB0cmFjayBvdXRzdGFuZGluZworCSAqIHJlcXVlc3RzIHRvIHRoZSBNQ0MuICBXZSBuZWVkIGFsbG9jYXRlIHRoZSBzYW1lIG51bWJlciBvZgorCSAqIGNvbmV4dCBlbnRyaWVzIGFzIHRoZSBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgTUNDIFdSQiByaW5nCisJICovCisJdTMyIG1jY193cmJfY3R4dF9zaXplOworCXZvaWQgKm1jY193cmJfY3R4dDsJCS8qIHBvaW50ZXIgdG8gdGhlIGNvbnRleHQgYXJlYSAqLworCXUzMiBtY2Nfd3JiX2N0eHRMZW47CQkvKiBOdW1iZXIgb2YgZW50cmllcyBpbiB0aGUgY29udGV4dCAqLworCS8qCisJICogTklDIHNlbmQgcmVxdWVzdCByaW5nIC0gdXNlZCBmb3IgeG1pdHRpbmcgcmF3IGV0aGVyIGZyYW1lcy4KKwkgKi8KKwlzdHJ1Y3QgRVRIX1dSQl9BTUFQICp0eF9xOwkvKiBWQSBvZiB0aGUgc3RhcnQgb2YgdGhlIHJpbmcgKi8KKwl1MzIgdHhfcV9sZW47CQkJLyogIyBpZiBlbnRyaWVzIGluIHRoZSBzZW5kIHJpbmcgKi8KKwl1MzIgdHhfcV9zaXplOworCXUzMiB0eF9xX2hkOwkJCS8qIEhlYWQgaW5kZXguIE5leHQgcmVxLiBnb2VzIGhlcmUgKi8KKwl1MzIgdHhfcV90bDsJCQkvKiBUYWlsIGluZHguIG9sZGVzdCBvdXRzdGFuZGluZyByZXEuICovCisJdTggdHhfcV9jcmVhdGVkOwkJLyogZmxhZyB0byBoZWxwIGNsZWFudXAgKi8KKwlzdHJ1Y3QgYmVfZXRoc3Ffb2JqZWN0IHR4X3Ffb2JqOy8qIEJFQ0xJQidzIHNlbmQgUSBoYW5kbGUgKi8KKwlkbWFfYWRkcl90IHR4X3FfYnVzOwkJLyogRE1BJ2JsZSBidXMgYWRkcmVzcyAqLworCXUzMiB0eF9xX2lkOwkJCS8qIHNlbmQgcXVldWUgcmluZyBJRCAqLworCXUzMiB0eF9xX3BvcnQ7CQkJLyogMCBubyBiaW5kaW5nLCAxIHBvcnQgQSwgIDIgcG9ydCBCICovCisJYXRvbWljX3QgdHhfcV91c2VkOwkJLyogIyBvZiBXUkJzIHVzZWQgKi8KKwkvKiBwdHIgdG8gYW4gYXJyYXkgaW4gd2hpY2ggd2Ugc3RvcmUgY29udGV4dCBpbmZvIGZvciBlYWNoIHNlbmQgcmVxLiAqLworCXZvaWQgKip0eF9jdHh0OworCS8qCisJICogTklDIFNlbmQgY29tcGwuIHJpbmcgLSBjb21wbGV0aW9uIHN0YXR1cyBmb3IgYWxsIE5JQyBmcmFtZXMgeG1pdHRlZC4KKwkgKi8KKwlzdHJ1Y3QgRVRIX1RYX0NPTVBMX0FNQVAgKnR4X2NxOy8qIFZBIG9mIHN0YXJ0IG9mIHRoZSByaW5nICovCisJdTMyIHR4Y3FfbGVuOwkJCS8qICMgb2YgZW50cmllcyBpbiB0aGUgcmluZyAqLworCXUzMiB0eF9jcV9zaXplOworCS8qCisJICogaW5kZXggaW50byBjb21wbCByaW5nIHdoZXJlIHRoZSBob3N0IGV4cGVjdHMgbmV4dCBjb21wbGV0aW9uIGVudHJ5CisJICovCisJdTMyIHR4X2NxX3RsOworCXUzMiB0eF9jcV9pZDsJCQkvKiBjb21wbGV0aW9uIHF1ZXVlIGlkICovCisJdTggdHhfY3FfY3JlYXRlZDsJCS8qIGZsYWcgdG8gaGVscCBjbGVhbnVwICovCisJc3RydWN0IGJlX2NxX29iamVjdCB0eF9jcV9vYmo7CisJZG1hX2FkZHJfdCB0eF9jcV9idXM7CQkvKiBETUEnYmxlIGJ1cyBhZGRyZXNzICovCisJLyoKKwkgKiBFdmVudCBRdWV1ZSAtIGFsbCBjb21wbGV0aW9uIGVudHJpZXMgcG9zdCBldmVudHMgaGVyZS4KKwkgKi8KKwlzdHJ1Y3QgRVFfRU5UUllfQU1BUCAqZXZlbnRfcTsJLyogVkEgb2Ygc3RhcnQgb2YgZXZlbnQgcXVldWUgKi8KKwl1MzIgZXZlbnRfcV9sZW47CQkvKiAjIG9mIGVudHJpZXMgKi8KKwl1MzIgZXZlbnRfcV9zaXplOworCXUzMiBldmVudF9xX3RsOwkJCS8qIFRhaWwgb2YgdGhlIGV2ZW50IHF1ZXVlICovCisJdTMyIGV2ZW50X3FfaWQ7CQkJLyogRXZlbnQgcXVldWUgSUQgKi8KKwl1OCBldmVudF9xX2NyZWF0ZWQ7CQkvKiBmbGFnIHRvIGhlbHAgY2xlYW51cCAqLworCXN0cnVjdCBiZV9lcV9vYmplY3QgZXZlbnRfcV9vYmo7IC8qIFF1ZXVlIGhhbmRsZSAqLworCWRtYV9hZGRyX3QgZXZlbnRfcV9idXM7CQkvKiBETUEnYmxlIGJ1cyBhZGRyZXNzICovCisJLyoKKwkgKiBOSUMgcmVjZWl2ZSBxdWV1ZSAtIERhdGEgYnVmZmVycyB0byBiZSB1c2VkIGZvciByZWNlaXZpbmcgdW5pY2FzdCwKKwkgKiBicm9hZGNhc3QgYW5kIG11bHRpLWNhc3QgZnJhbWVzICBhcmUgcG9zdGVkIGhlcmUuCisJICovCisJc3RydWN0IEVUSF9SWF9EX0FNQVAgKnJ4X3E7CS8qIFZBIG9mIHN0YXJ0IG9mIHRoZSBxdWV1ZSAqLworCXUzMiByeF9xX2xlbjsJCQkvKiAjIG9mIGVudHJpZXMgKi8KKwl1MzIgcnhfcV9zaXplOworCXUzMiByeF9xX2hkOwkJCS8qIEhlYWQgb2YgdGhlIHF1ZXVlICovCisJYXRvbWljX3QgcnhfcV9wb3N0ZWQ7CQkvKiBudW1iZXIgb2YgcG9zdGVkIGJ1ZmZlcnMgKi8KKwl1MzIgcnhfcV9pZDsJCQkvKiBxdWV1ZSBJRCAqLworCXU4IHJ4X3FfY3JlYXRlZDsJCS8qIGZsYWcgdG8gaGVscCBjbGVhbnVwICovCisJc3RydWN0IGJlX2V0aHJxX29iamVjdCByeF9xX29iajsJLyogTklDIFJYIHF1ZXVlIGhhbmRsZSAqLworCWRtYV9hZGRyX3QgcnhfcV9idXM7CQkvKiBETUEnYmxlIGJ1cyBhZGRyZXNzICovCisJLyoKKwkgKiBQb2ludGVyIHRvIGFuIGFycmF5IG9mIG9wYXF1ZSBjb250ZXh0IG9iamVjdCBmb3IgdXNlIGJ5IE9TTSBkcml2ZXIKKwkgKi8KKwl2b2lkICoqcnhfY3R4dDsKKwkvKgorCSAqIE5JQyB1bmljYXN0IFJYIGNvbXBsZXRpb24gcXVldWUgLSBhbGwgdW5pY2FzdCBldGhlciBmcmFtZSBjb21wbGV0aW9uCisJICogc3RhdHVzZXMgZnJvbSBCRSBjb21lIGhlcmUuCisJICovCisJc3RydWN0IEVUSF9SWF9DT01QTF9BTUFQICpyeF9jcTsJLyogVkEgb2Ygc3RhcnQgb2YgdGhlIHF1ZXVlICovCisJdTMyIHJ4X2NxX2xlbjsJCS8qICMgb2YgZW50cmllcyAqLworCXUzMiByeF9jcV9zaXplOworCXUzMiByeF9jcV90bDsJCQkvKiBUYWlsIG9mIHRoZSBxdWV1ZSAqLworCXUzMiByeF9jcV9pZDsJCQkvKiBxdWV1ZSBJRCAqLworCXU4IHJ4X2NxX2NyZWF0ZWQ7CQkvKiBmbGFnIHRvIGhlbHAgY2xlYW51cCAqLworCXN0cnVjdCBiZV9jcV9vYmplY3QgcnhfY3Ffb2JqOwkvKiBxdWV1ZSBoYW5kbGUgKi8KKwlkbWFfYWRkcl90IHJ4X2NxX2J1czsJCS8qIERNQSdibGUgYnVzIGFkZHJlc3MgKi8KKwlzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0IGZuX29iajsJLyogZnVuY3Rpb24gb2JqZWN0ICAgKi8KKwlib29sCWZuX29ial9jcmVhdGVkOworCXUzMiByeF9idWZfc2l6ZTsJCS8qIFNpemUgb2YgdGhlIFJYIGJ1ZmZlcnMgKi8KKworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7CisJc3RydWN0IGJlX3JlY3ZfYnVmZmVyIGV0aF9yeF9idWZzWzI1Nl07CS8qIHRvIHBhc3MgUnggYnVmZmVyCisJCQkJCQkJICAgYWRkcmVzc2VzICovCisJc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXI7CS8qIFBvaW50ZXIgdG8gT1NNIGFkYXB0ZXIgKi8KKwl1MzIgZGV2bm87CQkvKiBPU00sIG5ldHdvcmsgZGV2IG5vLiAqLworCXUzMiB1c2VfcG9ydDsJCS8qIEN1cnJlbnQgYWN0aXZlIHBvcnQgKi8KKwlzdHJ1Y3QgYmVfcnhfcGFnZV9pbmZvICpyeF9wYWdlX2luZm87CS8qIEFycmF5IG9mIFJ4IGJ1ZiBwYWdlcyAqLworCXUzMiByeF9wZ19pbmZvX2hkOwkvKiBIZWFkIG9mIHF1ZXVlICovCisJaW50IHJ4YnVmX3Bvc3RfZmFpbDsJLyogUnhCdWZmIHBvc3RpbmcgZmFpbCBjb3VudCAqLworCWJvb2wgcnhfcGdfc2hhcmVkOwkvKiBJcyBhbiBhbGxvY3N0ZWQgcGFnZSBzaGFyZWQgYXMgdHdvIGZyYWdzID8gKi8KKwlzdHJ1Y3Qgdmxhbl9ncm91cCAqdmxhbl9ncnA7CisJdTMyIG51bV92bGFuczsJCS8qIE51bWJlciBvZiB2bGFucyBpbiBCRSdzIGZpbHRlciAqLworCXUxNiB2bGFuX3RhZ1tCRV9OVU1fVkxBTl9TVVBQT1JURURdOyAvKiB2bGFucyBjdXJyZW50bHkgY29uZmlndXJlZCAqLworCXN0cnVjdCBuYXBpX3N0cnVjdCBuYXBpOworCXN0cnVjdCBuZXRfbHJvX21nciBscm9fbWdyOworCXN0cnVjdCBuZXRfbHJvX2Rlc2MgbHJvX2Rlc2NbQkVfTUFYX0xST19ERVNDUklQVE9SU107Cit9OworCisjZGVmaW5lIE5FVF9GSChucCkgICAgICAgKCYobnApLT5mbl9vYmopCisKKy8qCisgKiBCRSBkcml2ZXIgc3RhdGlzdGljcy4KKyAqLworc3RydWN0IGJlX2RydnJfc3RhdCB7CisJdTMyIGJlc190eF9yZXFzOwkvKiBudW1iZXIgb2YgVFggcmVxdWVzdHMgaW5pdGlhdGVkICovCisJdTMyIGJlc190eF9mYWlsczsJLyogbnVtYmVyIG9mIFRYIHJlcXVlc3RzIHRoYXQgZmFpbGVkICovCisJdTMyIGJlc19md2RfcmVxczsJLyogbnVtYmVyIG9mIHNlbmQgcmVxcyB0aHJvdWdoIGZvcndhcmRpbmcgaS9mICovCisJdTMyIGJlc190eF93cmJzOwkvKiBudW1iZXIgb2YgdHggV1JCcyB1c2VkICovCisKKwl1MzIgYmVzX2ludHM7CQkvKiBudW1iZXIgb2YgaW50ZXJydXB0cyAqLworCXUzMiBiZXNfcG9sbHM7CQkvKiBudW1iZXIgb2YgdGltZXMgTkFQSSBjYWxsZWQgcG9sbCBmdW5jdGlvbiAqLworCXUzMiBiZXNfZXZlbnRzOwkJLyogdG90YWwgZXZldCBlbnRyaWVzIHByb2Nlc3NlZCAqLworCXUzMiBiZXNfdHhfZXZlbnRzOwkvKiBudW1iZXIgb2YgdHggY29tcGxldGlvbiBldmVudHMgICovCisJdTMyIGJlc19yeF9ldmVudHM7CS8qIG51bWJlciBvZiB1Y2FzdCByeCBjb21wbGV0aW9uIGV2ZW50cyAgKi8KKwl1MzIgYmVzX3R4X2NvbXBsOwkvKiBudW1iZXIgb2YgdHggY29tcGxldGlvbiBlbnRyaWVzIHByb2Nlc3NlZCAqLworCXUzMiBiZXNfcnhfY29tcGw7CS8qIG51bWJlciBvZiByeCBjb21wbGV0aW9uIGVudHJpZXMKKwkJCQkgICBwcm9jZXNzZWQgKi8KKwl1MzIgYmVzX2V0aHJ4X3Bvc3RfZmFpbDsJLyogbnVtYmVyIG9mIGV0aHJ4IGJ1ZmZlciBhbGxvYworCQkJCQkgICBmYWlsdXJlcyAqLworCS8qCisJICogbnVtYmVyIG9mIG5vbiBldGhlciB0eXBlIElJIGZyYW1lcyBkcm9wcGVkIHdoZXJlCisJICogZnJhbWUgbGVuID4gbGVuZ3RoIGZpZWxkIG9mIE1hYyBIZHIKKwkgKi8KKwl1MzIgYmVzXzgwMl8zX2Ryb3BwZWRfZnJhbWVzOworCS8qCisJICogbnVtYmVyIG9mIG5vbiBldGhlciB0eXBlIElJIGZyYW1lcyBtYWxmb3JtZWQgd2hlcmUKKwkgKiBpbiBmcmFtZSBsZW4gPCBsZW5ndGggZmllbGQgb2YgTWFjIEhkcgorCSAqLworCXUzMiBiZXNfODAyXzNfbWFsZm9ybWVkX2ZyYW1lczsKKwl1MzIgYmVzX2lwczsJCS8qICBpbnRlcnJ1cHRzIC8gc2VjICovCisJdTMyIGJlc19wcmV2X2ludHM7CS8qIGJlc19pbnRzIGF0IGxhc3QgSVBTIGNhbGN1bGF0aW9uICAqLworCXUxNiBiZXNfZXRoX3R4X3JhdGU7CS8qICBFVEggVFggcmF0ZSAtIE1iL3NlYyAqLworCXUxNiBiZXNfZXRoX3J4X3JhdGU7CS8qICBFVEggUlggcmF0ZSAtIE1iL3NlYyAqLworCXUzMiBiZXNfcnhfY29hbDsJLyogTnVtIHBrdHMgY29hbGFzY2VkICovCisJdTMyIGJlc19yeF9mbHVzaDsJLyogTnVtIHRpbWVzIGNvYWxhc2NlZCAqLworCXUzMiBiZXNfbGlua19jaGFuZ2VfcGh5c2ljYWw7CS8qTnVtIG9mIHRpbWVzIHBoeXNpY2FsIGxpbmsgY2hhbmdlZCAqLworCXUzMiBiZXNfbGlua19jaGFuZ2VfdmlydHVhbDsJLypOdW0gb2YgdGltZXMgdmlydHVhbCBsaW5rIGNoYW5nZWQgKi8KKwl1MzIgYmVzX3J4X21pc2NfcGt0czsJLyogTWlzYyBwa3RzIHJlY2VpdmVkICovCit9OworCisvKiBNYXhpbXVtIGludGVycnVwdCBkZWxheSAoaW4gbWljcm9zZWNvbmRzKSBhbGxvd2VkICovCisjZGVmaW5lIE1BWF9FUUQJCQkJMTIwCisKKy8qCisgKiB0aW1lciB0byBwcmV2ZW50IHN5c3RlbSBzaHV0ZG93biBoYW5nIGZvciBldmVyIGlmIGgvdyBzdG9wcyByZXNwb25kaW5nCisgKi8KK3N0cnVjdCBiZV90aW1lcl9jdHh0IHsKKwlhdG9taWNfdCBnZXRfc3RhdF9mbGFnOworCXN0cnVjdCB0aW1lcl9saXN0IGdldF9zdGF0c190aW1lcjsKKwl1bnNpZ25lZCBsb25nIGdldF9zdGF0X3NlbV9hZGRyOworfSA7CisKKy8qIFRoaXMgc3RydWN0dXJlIGlzIHRoZSBtYWluIEJsYWRlRW5naW5lIGRyaXZlciBjb250ZXh0LiAgKi8KK3N0cnVjdCBiZV9hZGFwdGVyIHsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2cDsKKwlzdHJ1Y3QgYmVfZHJ2cl9zdGF0IGJlX3N0YXQ7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgYmVuZXRfc3RhdHM7CisKKwkvKiBQQ0kgQkFSIG1hcHBlZCBhZGRyZXNzZXMgKi8KKwl1OCBfX2lvbWVtICpjc3JfdmE7CS8qIENTUiAqLworCXU4IF9faW9tZW0gKmRiX3ZhOwkvKiBEb29yICBCZWxsICAqLworCXU4IF9faW9tZW0gKnBjaV92YTsJLyogUENJIENvbmZpZyAqLworCisJc3RydWN0IHRhc2tsZXRfc3RydWN0IHN0c19oYW5kbGVyOworCXN0cnVjdCB0aW1lcl9saXN0IGNxX3RpbWVyOworCXNwaW5sb2NrX3QgaW50X2xvY2s7CS8qIHRvIHByb3RlY3QgdGhlIGlzciBmaWVsZCBpbiBhZGFwdGVyICovCisKKwlzdHJ1Y3QgRldDTURfRVRIX0dFVF9TVEFUSVNUSUNTICpldGhfc3RhdHNwOworCS8qCisJICogVGhpcyB3aWxsIGVuYWJsZSB0aGUgdXNlIG9mIGV0aHRvb2wgdG8gZW5hYmxlIG9yIGRpc2FibGUKKwkgKiBDaGVja3N1bSBvbiBSeCBwa3RzIHRvIGJlIG9iZXllZCBvciBkaXNvYmV5ZWQuCisJICogSWYgdGhpcyBpcyB0cnVlID0gMSwgdGhlbiB3aGF0ZXZlciBpcyB0aGUgY2hlY2tzdW0gb24gdGhlCisJICogUmVjZWl2ZWQgcGt0IGFzIHBlciBCRSwgaXQgd2lsbCBiZSBnaXZlbiB0byB0aGUgc3RhY2suCisJICogRWxzZSB0aGUgc3RhY2sgd2lsbCByZSBjYWxjdWxhdGUgaXQuCisJICovCisJYm9vbCByeF9jc3VtOworCS8qCisJICogVGhpcyB3aWxsIGVuYWJsZSB0aGUgdXNlIG9mIGV0aHRvb2wgdG8gZW5hYmxlIG9yIGRpc2FibGUKKwkgKiBDb2FsZXNlIG9uIFJ4IHBrdHMgdG8gYmUgb2JleWVkIG9yIGRpc29iZXllZC4KKwkgKiBJZiB0aGlzIGlzIGdyYXRlciB0aGFuIDAgYW5kIGxlc3MgdGhhbiAxNiB0aGVuIGNvYWxhc2NpbmcKKwkgKiBpcyBlbmFibGVkIGVsc2UgaXQgaXMgZGlzYWJsZWQKKwkgKi8KKwl1MzIgbWF4X3J4X2NvYWw7CisJc3RydWN0IHBjaV9kZXYgKnBkZXY7CS8qIFBvaW50ZXIgdG8gT1MncyBQQ0kgZHZpY2UgKi8KKworCXNwaW5sb2NrX3QgdHhxX2xvY2s7CS8qIHRvIHN0b3Avd2FrZSBxdWV1ZSBiYXNlZCBvbiB0eF9xX3VzZWQgKi8KKworCXUzMiBpc3I7CQkvKiBjb3B5IG9mIEludHIgc3RhdHVzIHJlZy4gKi8KKworCXUzMiBwb3J0MF9saW5rX3N0czsJLyogUG9ydCAwIGxpbmsgc3RhdHVzICovCisJdTMyIHBvcnQxX2xpbmtfc3RzOwkvKiBwb3J0IDEgbGlzdCBzdGF0dXMgKi8KKwlzdHJ1Y3QgQkVfTElOS19TVEFUVVMgKmJlX2xpbmtfc3RzOworCisJLyogcG9pbnRlciB0byB0aGUgZmlyc3QgbmV0b2JqZWN0IG9mIHRoaXMgYWRhcHRlciAqLworCXN0cnVjdCBiZV9uZXRfb2JqZWN0ICpuZXRfb2JqOworCisJLyogIEZsYWdzIHRvIGluZGljYXRlIHdoYXQgdG8gY2xlYW4gdXAgKi8KKwlib29sIHRhc2tsZXRfc3RhcnRlZDsKKwlib29sIGlzcl9yZWdpc3RlcmVkOworCS8qCisJICogYWRhcHRpdmUgaW50ZXJydXB0IGNvYWxlc2NpbmcgKEFJQykgcmVsYXRlZAorCSAqLworCWJvb2wgZW5hYmxlX2FpYzsJLyogMSBpZiBBSUMgaXMgZW5hYmxlZCAqLworCXUxNiBtaW5fZXFkOwkJLyogbWluaW11bSBFUSBkZWxheSBpbiB1c2VjICovCisJdTE2IG1heF9lcWQ7CQkvKiBtaW5pbXVtIEVRIGRlbGF5IGluIHVzZWMgKi8KKwl1MTYgY3VyX2VxZDsJCS8qIGN1cnJlbnQgRVEgZGVsYXkgaW4gdXNlYyAqLworCS8qCisJICogYm9vayBrZWVwaW5nIGZvciBpbnRlcnJ1cHQgLyBzZWMgYW5kIFRYL1JYIHJhdGUgY2FsY3VsYXRpb24KKwkgKi8KKwl1bG9uZyBpcHNfamlmZmllczsJLyogamlmZmllcyBhdCBsYXN0IElQUyBjYWxjICovCisJdTMyIGV0aF90eF9ieXRlczsKKwl1bG9uZyBldGhfdHhfamlmZmllczsKKwl1MzIgZXRoX3J4X2J5dGVzOworCXVsb25nIGV0aF9yeF9qaWZmaWVzOworCisJc3RydWN0IHNlbWFwaG9yZSBnZXRfZXRoX3N0YXRfc2VtOworCisJLyogdGltZXIgY3R4dCB0byBwcmV2ZW50IHNodXRkb3duIGhhbmdpbmcgZHVlIHRvIHVuLXJlc3BvbnNpdmUgQkUgKi8KKwlzdHJ1Y3QgYmVfdGltZXJfY3R4dCB0aW1lcl9jdHh0OworCisjZGVmaW5lIEJFX01BWF9NU0lYX1ZFQ1RPUlMgICAgICAgICAgICAgMzIKKyNkZWZpbmUgQkVfTUFYX1JFUV9NU0lYX1ZFQ1RPUlMgICAgICAgICAxIC8qIG9ubHkgb25lIEVRIGluIExpbnV4IGRyaXZlciAqLworCXN0cnVjdCBtc2l4X2VudHJ5IG1zaXhfZW50cmllc1tCRV9NQVhfTVNJWF9WRUNUT1JTXTsKKwlib29sIG1zaXhfZW5hYmxlZDsKKwlib29sIGRtYV82NGJpdF9jYXA7CS8qIHRoZSBEZXZpY2UgREFDIGNhcGFibGUgIG9yIG5vdCAqLworCXU4IGRldl9zdGF0ZTsJLyogVGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGRldmljZSAqLworCXU4IGRldl9wbV9zdGF0ZTsgLyogVGhlIFN0YXRlIG9mIGRldmljZSBiZWZvcmUgZ29pbmcgdG8gc3VzcGVuZCAqLworfTsKKworLyoKKyAqIEV2ZXJ5IHNlY29uZCB3ZSBsb29rIGF0IHRoZSBpbnRzL3NlYyBhbmQgYWRqdXN0IGVxX2RlbGF5CisgKiBiZXR3ZWVuIGFkYXB0ZXItPm1pbl9lcWQgYW5kIGFkYXB0ZXItPm1heF9lcWQgdG8ga2VlcCB0aGUgaW50cy9zZWMgYmV0d2VlbgorICogSVBTX0hJX1dNIGFuZCBJUFNfTE9fV00uCisgKi8KKyNkZWZpbmUgSVBTX0hJX1dNCTE4MDAwCisjZGVmaW5lIElQU19MT19XTQk4MDAwCisKKworc3RhdGljIGlubGluZSB2b2lkIGluZGV4X2Fkdih1MzIgKmluZGV4LCB1MzIgdmFsLCAgdTMyIGxpbWl0KQoreworCUJVR19PTihsaW1pdCAmIChsaW1pdC0xKSk7CisJKmluZGV4ID0gKCppbmRleCArIHZhbCkgJiAobGltaXQgLSAxKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGluZGV4X2luYyh1MzIgKmluZGV4LCB1MzIgbGltaXQpCit7CisJQlVHX09OKGxpbWl0ICYgKGxpbWl0LTEpKTsKKwkqaW5kZXggPSAoKmluZGV4ICsgMSkgJiAobGltaXQgLSAxKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGJlX2Fkdl9lcV90bChzdHJ1Y3QgYmVfbmV0X29iamVjdCAqcG5vYikKK3sKKwlpbmRleF9pbmMoJnBub2ItPmV2ZW50X3FfdGwsIHBub2ItPmV2ZW50X3FfbGVuKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGJlX2Fkdl90eHFfaGQoc3RydWN0IGJlX25ldF9vYmplY3QgKnBub2IpCit7CisJaW5kZXhfaW5jKCZwbm9iLT50eF9xX2hkLCBwbm9iLT50eF9xX2xlbik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBiZV9hZHZfdHhxX3RsKHN0cnVjdCBiZV9uZXRfb2JqZWN0ICpwbm9iKQoreworCWluZGV4X2luYygmcG5vYi0+dHhfcV90bCwgcG5vYi0+dHhfcV9sZW4pOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYmVfYWR2X3R4Y3FfdGwoc3RydWN0IGJlX25ldF9vYmplY3QgKnBub2IpCit7CisJaW5kZXhfaW5jKCZwbm9iLT50eF9jcV90bCwgcG5vYi0+dHhjcV9sZW4pOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYmVfYWR2X3J4cV9oZChzdHJ1Y3QgYmVfbmV0X29iamVjdCAqcG5vYikKK3sKKwlpbmRleF9pbmMoJnBub2ItPnJ4X3FfaGQsIHBub2ItPnJ4X3FfbGVuKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGJlX2Fkdl9yeGNxX3RsKHN0cnVjdCBiZV9uZXRfb2JqZWN0ICpwbm9iKQoreworCWluZGV4X2luYygmcG5vYi0+cnhfY3FfdGwsIHBub2ItPnJ4X2NxX2xlbik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIHR4X2NvbXBsX2xhc3R3cmJfaWR4X2dldChzdHJ1Y3QgYmVfbmV0X29iamVjdCAqcG5vYikKK3sKKwlyZXR1cm4gKHBub2ItPnR4X3FfdGwgKyAqKHUzMiAqKSZwbm9iLT50eF9jdHh0W3Bub2ItPnR4X3FfdGxdIC0gMSkKKwkJICAgICYgKHBub2ItPnR4X3FfbGVuIC0gMSk7Cit9CisKK2ludCBiZW5ldF9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICopOworaW50IGJlX2V0aHRvb2xfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKiwgc3RydWN0IGlmcmVxICopOworc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmJlbmV0X2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqKTsKK3ZvaWQgYmVfcHJvY2Vzc19pbnRyKHVuc2lnbmVkIGxvbmcgY29udGV4dCk7CitpcnFyZXR1cm5fdCBiZV9pbnQoaW50IGlycSwgdm9pZCAqZGV2KTsKK3ZvaWQgYmVfcG9zdF9ldGhfcnhfYnVmZnMoc3RydWN0IGJlX25ldF9vYmplY3QgKik7Cit2b2lkIGJlX2dldF9zdGF0X2NiKHZvaWQgKiwgaW50LCBzdHJ1Y3QgTUNDX1dSQl9BTUFQICopOwordm9pZCBiZV9nZXRfc3RhdHNfdGltZXJfaGFuZGxlcih1bnNpZ25lZCBsb25nKTsKK3ZvaWQgYmVfd2FpdF9uaWNfdHhfY21wbHhfY21wbChzdHJ1Y3QgYmVfbmV0X29iamVjdCAqKTsKK3ZvaWQgYmVfcHJpbnRfbGlua19pbmZvKHN0cnVjdCBCRV9MSU5LX1NUQVRVUyAqKTsKK3ZvaWQgYmVfdXBkYXRlX2xpbmtfc3RhdHVzKHN0cnVjdCBiZV9hZGFwdGVyICopOwordm9pZCBiZV9pbml0X3Byb2NmcyhzdHJ1Y3QgYmVfYWRhcHRlciAqKTsKK3ZvaWQgYmVfY2xlYW51cF9wcm9jZnMoc3RydWN0IGJlX2FkYXB0ZXIgKik7CitpbnQgYmVfcG9sbChzdHJ1Y3QgbmFwaV9zdHJ1Y3QgKiwgaW50KTsKK3N0cnVjdCBFVEhfUlhfQ09NUExfQU1BUCAqYmVfZ2V0X3J4X2NtcGwoc3RydWN0IGJlX25ldF9vYmplY3QgKik7Cit2b2lkIGJlX25vdGlmeV9jbXBsKHN0cnVjdCBiZV9uZXRfb2JqZWN0ICosIGludCwgaW50LCBpbnQpOwordm9pZCBiZV9lbmFibGVfaW50cihzdHJ1Y3QgYmVfbmV0X29iamVjdCAqKTsKK3ZvaWQgYmVfZW5hYmxlX2VxX2ludHIoc3RydWN0IGJlX25ldF9vYmplY3QgKik7Cit2b2lkIGJlX2Rpc2FibGVfaW50cihzdHJ1Y3QgYmVfbmV0X29iamVjdCAqKTsKK3ZvaWQgYmVfZGlzYWJsZV9lcV9pbnRyKHN0cnVjdCBiZV9uZXRfb2JqZWN0ICopOworaW50IGJlX3NldF91Y19tYWNfYWRyKHN0cnVjdCBiZV9uZXRfb2JqZWN0ICosIHU4LCB1OCwgdTgsCisJCSAgICB1OCAqLCBtY2Nfd3JiX2NxZV9jYWxsYmFjaywgdm9pZCAqKTsKK2ludCBiZV9nZXRfZmxvd19jdGwoc3RydWN0IGJlX2Z1bmN0aW9uX29iamVjdCAqcEZuT2JqLCBib29sICosIGJvb2wgKik7Cit2b2lkIHByb2Nlc3Nfb25lX3R4X2NvbXBsKHN0cnVjdCBiZV9uZXRfb2JqZWN0ICpwbm9iLCB1MzIgZW5kX2lkeCk7CisKKyNlbmRpZiAvKiBfQkVORVRfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9iZXN0YXR1cy5oIGIvZHJpdmVycy9zdGFnaW5nL2JlbmV0L2Jlc3RhdHVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTljN2E0YgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9iZXN0YXR1cy5oCkBAIC0wLDAgKzEsMTAzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA1IC0gMjAwOCBTZXJ2ZXJFbmdpbmVzCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBUaGUgZnVsbCBHTlUgR2VuZXJhbAorICogUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlIGZpbGUgY2FsbGVkIENPUFlJTkcuCisgKgorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqIGxpbnV4LWRyaXZlcnNAc2VydmVyZW5naW5lcy5jb20KKyAqCisgKiBTZXJ2ZXJFbmdpbmVzCisgKiAyMDkgTi4gRmFpciBPYWtzIEF2ZQorICogU3Vubnl2YWxlLCBDQSA5NDA4NQorICovCisjaWZuZGVmIF9CRVNUQVRVU19IXworI2RlZmluZSBfQkVTVEFUVVNfSF8KKworI2RlZmluZSBCRV9TVUNDRVNTICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwMDAwTCkKKy8qCisgKiBNZXNzYWdlSWQ6IEJFX1BFTkRJTkcKKyAqICBUaGUgQmxhZGVFbmdpbmUgRHJpdmVyIGNhbGwgc3VjY2VlZGVkLCBhbmQgcGVuZGVkIG9wZXJhdGlvbi4KKyAqLworI2RlZmluZSBCRV9QRU5ESU5HICAgICAgICAgICAgICAgICAgICAgICAoMHgyMDA3MDAwMUwpCisjZGVmaW5lIEJFX1NUQVRVU19QRU5ESU5HICAgICAgICAgICAgICAgIChCRV9QRU5ESU5HKQorLyoKKyAqIE1lc3NhZ2VJZDogQkVfTk9UX09LCisgKiAgQW4gZXJyb3Igb2NjdXJyZWQuCisgKi8KKyNkZWZpbmUgQkVfTk9UX09LICAgICAgICAgICAgICAgICAgICAgICAgKDB4RTAwNzAwMDJMKQorLyoKKyAqIE1lc3NhZ2VJZDogQkVfU1RBVFVTX1NZU1RFTV9SRVNPVVJDRVMKKyAqICBJbnN1ZmZpY2llbnQgaG9zdCBzeXN0ZW0gcmVzb3VyY2VzIGV4aXN0IHRvIGNvbXBsZXRlIHRoZSBBUEkuCisgKi8KKyNkZWZpbmUgQkVfU1RBVFVTX1NZU1RFTV9SRVNPVVJDRVMgICAgICAgKDB4RTAwNzAwMDNMKQorLyoKKyAqIE1lc3NhZ2VJZDogQkVfU1RBVFVTX0NISVBfUkVTT1VSQ0VTCisgKiAgSW5zdWZmaWNpZW50IGNoaXAgcmVzb3VyY2VzIGV4aXN0IHRvIGNvbXBsZXRlIHRoZSBBUEkuCisgKi8KKyNkZWZpbmUgQkVfU1RBVFVTX0NISVBfUkVTT1VSQ0VTICAgICAgICAgKDB4RTAwNzAwMDRMKQorLyoKKyAqIE1lc3NhZ2VJZDogQkVfU1RBVFVTX05PX1JFU09VUkNFCisgKiAgSW5zdWZmaWNpZW50IHJlc291cmNlcyB0byBjb21wbGV0ZSByZXF1ZXN0LgorICovCisjZGVmaW5lIEJFX1NUQVRVU19OT19SRVNPVVJDRSAgICAgICAgICAgICgweEUwMDcwMDA1TCkKKy8qCisgKiBNZXNzYWdlSWQ6IEJFX1NUQVRVU19CVVNZCisgKiAgUmVzb3VyY2UgaXMgY3VycmVudGx5IGJ1c3kuCisgKi8KKyNkZWZpbmUgQkVfU1RBVFVTX0JVU1kgICAgICAgICAgICAgICAgICAgKDB4RTAwNzAwMDZMKQorLyoKKyAqIE1lc3NhZ2VJZDogQkVfU1RBVFVTX0lOVkFMSURfUEFSQU1FVEVSCisgKiAgSW52YWxpZCBQYXJhbWV0ZXIgaW4gcmVxdWVzdC4KKyAqLworI2RlZmluZSBCRV9TVEFUVVNfSU5WQUxJRF9QQVJBTUVURVIgICAgICAoMHhFMDAwMDAwN0wpCisvKgorICogTWVzc2FnZUlkOiBCRV9TVEFUVVNfTk9UX1NVUFBPUlRFRAorICogIFJlcXVlc3RlZCBvcGVyYXRpb24gaXMgbm90IHN1cHBvcnRlZC4KKyAqLworI2RlZmluZSBCRV9TVEFUVVNfTk9UX1NVUFBPUlRFRCAgICAgICAgICAoMHhFMDAwMDAwREwpCisKKy8qCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgRSBUIEggRSBSIE4gRSBUICAgUyBUIEEgVCBVIFMKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKy8qCisgKiBNZXNzYWdlSWQ6IEJFX0VUSF9UWF9FUlJPUgorICogIFRoZSBFdGhlcm5ldCBkZXZpY2UgZHJpdmVyIGZhaWxlZCB0byB0cmFuc21pdCBhIHBhY2tldC4KKyAqLworI2RlZmluZSBCRV9FVEhfVFhfRVJST1IgICAgICAgICAgICAgICAgICAoMHhFMDA3MDEwMUwpCisKKy8qCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgUyBIIEEgUiBFIEQgICBTIFQgQSBUIFUgUworICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworLyoKKyAqIE1lc3NhZ2VJZDogQkVfU1RBVFVTX1ZCRF9JTlZBTElEX1ZFUlNJT04KKyAqICBUaGUgZGV2aWNlIGRyaXZlciBpcyBub3QgY29tcGF0aWJsZSB3aXRoIHRoaXMgdmVyc2lvbiBvZiB0aGUgVkJELgorICovCisjZGVmaW5lIEJFX1NUQVRVU19JTlZBTElEX1ZFUlNJT04gICAgKDB4RTAwNzA0MDJMKQorLyoKKyAqIE1lc3NhZ2VJZDogQkVfU1RBVFVTX0RPTUFJTl9ERU5JRUQKKyAqICBUaGUgb3BlcmF0aW9uIGZhaWxlZCB0byBjb21wbGV0ZSBkdWUgdG8gaW5zdWZmaWNpZW50IGFjY2VzcworICogIHJpZ2h0cyBmb3IgdGhlIHJlcXVlc3RpbmcgZG9tYWluLgorICovCisjZGVmaW5lIEJFX1NUQVRVU19ET01BSU5fREVOSUVEICAgICAgICAgICgweEUwMDcwNDAzTCkKKy8qCisgKiBNZXNzYWdlSWQ6IEJFX1NUQVRVU19UQ1BfTk9UX1NUQVJURUQKKyAqICBUaGUgZW1iZWRkZWQgVENQL0lQIHN0YWNrIGhhcyBub3QgYmVlbiBzdGFydGVkLgorICovCisjZGVmaW5lIEJFX1NUQVRVU19UQ1BfTk9UX1NUQVJURUQgICAgICAgICgweEUwMDcwNDA5TCkKKy8qCisgKiBNZXNzYWdlSWQ6IEJFX1NUQVRVU19OT19NQ0NfV1JCCisgKiAgTm8gZnJlZSBNQ0MgV1JCIGFyZSBhdmFpbGFibGUgZm9yIHBvc3RpbmcgdGhlIHJlcXVlc3QuCisgKi8KKyNkZWZpbmUgQkVfU1RBVFVTX05PX01DQ19XUkIgICAgICAgICAgICAgICAgICgweEUwMDcwNDE0TCkKKworI2VuZGlmIC8qIF9CRVNUQVRVU18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9jZXYuaCBiL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9jZXYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDk5NjkyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JlbmV0L2Nldi5oCkBAIC0wLDAgKzEsMjQzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA1IC0gMjAwOCBTZXJ2ZXJFbmdpbmVzCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBUaGUgZnVsbCBHTlUgR2VuZXJhbAorICogUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlIGZpbGUgY2FsbGVkIENPUFlJTkcuCisgKgorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqIGxpbnV4LWRyaXZlcnNAc2VydmVyZW5naW5lcy5jb20KKyAqCisgKiBTZXJ2ZXJFbmdpbmVzCisgKiAyMDkgTi4gRmFpciBPYWtzIEF2ZQorICogU3Vubnl2YWxlLCBDQSA5NDA4NQorICovCisvKgorICogQXV0b2dlbmVyYXRlZCBieSBzcmNnZW4gdmVyc2lvbjogMDEyNworICovCisjaWZuZGVmIF9fY2V2X2FtYXBfaF9fCisjZGVmaW5lIF9fY2V2X2FtYXBfaF9fCisjaW5jbHVkZSAiZXAuaCIKKworLyoKKyAqIEhvc3QgSW50ZXJydXB0IFN0YXR1cyBSZWdpc3RlciAwLiBUaGUgZmlyc3Qgb2YgZm91ciBhcHBsaWNhdGlvbgorICogaW50ZXJydXB0IHN0YXR1cyByZWdpc3RlcnMuIFRoaXMgcmVnaXN0ZXIgY29udGFpbnMgdGhlIGludGVycnVwdHMKKyAqIGZvciBFdmVudCBRdWV1ZXMgRVEwIHRocm91Z2ggRVEzMS4KKyAqLworc3RydWN0IEJFX0NFVl9JU1IwX0NTUl9BTUFQIHsKKwl1OCBpbnRlcnJ1cHQwOwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0MTsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDI7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQzOwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0NDsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDU7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQ2OwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0NzsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDg7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQ5OwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0MTA7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQxMTsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDEyOwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0MTM7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQxNDsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDE1OwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0MTY7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQxNzsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDE4OwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0MTk7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQyMDsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDIxOwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0MjI7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQyMzsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDI0OwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0MjU7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQyNjsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDI3OwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0Mjg7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQyOTsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDMwOwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0MzE7CS8qIERXT1JEIDAgKi8KK30gX19wYWNrZWQ7CitzdHJ1Y3QgQ0VWX0lTUjBfQ1NSX0FNQVAgeworCXUzMiBkd1sxXTsKK307CisKKy8qCisgKiBIb3N0IEludGVycnVwdCBTdGF0dXMgUmVnaXN0ZXIgMS4gVGhlIHNlY29uZCBvZiBmb3VyIGFwcGxpY2F0aW9uCisgKiBpbnRlcnJ1cHQgc3RhdHVzIHJlZ2lzdGVycy4gVGhpcyByZWdpc3RlciBjb250YWlucyB0aGUgaW50ZXJydXB0cworICogZm9yIEV2ZW50IFF1ZXVlcyBFUTMyIHRocm91Z2ggRVE2My4KKyAqLworc3RydWN0IEJFX0NFVl9JU1IxX0NTUl9BTUFQIHsKKwl1OCBpbnRlcnJ1cHQzMjsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDMzOwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0MzQ7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQzNTsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDM2OwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0Mzc7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQzODsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDM5OwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0NDA7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQ0MTsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDQyOwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0NDM7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQ0NDsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDQ1OwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0NDY7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQ0NzsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDQ4OwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0NDk7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQ1MDsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDUxOwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0NTI7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQ1MzsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDU0OwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0NTU7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQ1NjsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDU3OwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0NTg7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQ1OTsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDYwOwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0NjE7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQ2MjsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDYzOwkvKiBEV09SRCAwICovCit9IF9fcGFja2VkOworc3RydWN0IENFVl9JU1IxX0NTUl9BTUFQIHsKKwl1MzIgZHdbMV07Cit9OworLyoKKyAqIEhvc3QgSW50ZXJydXB0IFN0YXR1cyBSZWdpc3RlciAyLiBUaGUgdGhpcmQgb2YgZm91ciBhcHBsaWNhdGlvbgorICogaW50ZXJydXB0IHN0YXR1cyByZWdpc3RlcnMuIFRoaXMgcmVnaXN0ZXIgY29udGFpbnMgdGhlIGludGVycnVwdHMKKyAqIGZvciBFdmVudCBRdWV1ZXMgRVE2NCB0aHJvdWdoIEVROTUuCisgKi8KK3N0cnVjdCBCRV9DRVZfSVNSMl9DU1JfQU1BUCB7CisJdTggaW50ZXJydXB0NjQ7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQ2NTsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDY2OwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0Njc7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQ2ODsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDY5OwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0NzA7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQ3MTsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDcyOwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0NzM7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQ3NDsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDc1OwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0NzY7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQ3NzsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDc4OwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0Nzk7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQ4MDsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDgxOwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0ODI7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQ4MzsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDg0OwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0ODU7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQ4NjsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDg3OwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0ODg7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQ4OTsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDkwOwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0OTE7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQ5MjsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDkzOwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0OTQ7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQ5NTsJLyogRFdPUkQgMCAqLworfSBfX3BhY2tlZDsKK3N0cnVjdCBDRVZfSVNSMl9DU1JfQU1BUCB7CisJdTMyIGR3WzFdOworfTsKKworLyoKKyAqIEhvc3QgSW50ZXJydXB0IFN0YXR1cyBSZWdpc3RlciAzLiBUaGUgZm91cnRoIG9mIGZvdXIgYXBwbGljYXRpb24KKyAqIGludGVycnVwdCBzdGF0dXMgcmVnaXN0ZXJzLiBUaGlzIHJlZ2lzdGVyIGNvbnRhaW5zIHRoZSBpbnRlcnJ1cHRzCisgKiBmb3IgRXZlbnQgUXVldWVzIEVROTYgdGhyb3VnaCBFUTEyNy4KKyAqLworc3RydWN0IEJFX0NFVl9JU1IzX0NTUl9BTUFQIHsKKwl1OCBpbnRlcnJ1cHQ5NjsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDk3OwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0OTg7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQ5OTsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDEwMDsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDEwMTsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDEwMjsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDEwMzsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDEwNDsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDEwNTsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDEwNjsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDEwNzsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDEwODsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDEwOTsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDExMDsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDExMTsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDExMjsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDExMzsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDExNDsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDExNTsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDExNjsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDExNzsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDExODsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDExOTsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDEyMDsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDEyMTsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDEyMjsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDEyMzsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDEyNDsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDEyNTsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDEyNjsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDEyNzsJLyogRFdPUkQgMCAqLworfSBfX3BhY2tlZDsKK3N0cnVjdCBDRVZfSVNSM19DU1JfQU1BUCB7CisJdTMyIGR3WzFdOworfTsKKworLyogIENvbXBsZXRpb25zIGFuZCBFdmVudHMgYmxvY2sgUmVnaXN0ZXJzLiAgKi8KK3N0cnVjdCBCRV9DRVZfQ1NSTUFQX0FNQVAgeworCXU4IHJzdmQwWzMyXTsJLyogRFdPUkQgMCAqLworCXU4IHJzdmQxWzMyXTsJLyogRFdPUkQgMSAqLworCXU4IHJzdmQyWzMyXTsJLyogRFdPUkQgMiAqLworCXU4IHJzdmQzWzMyXTsJLyogRFdPUkQgMyAqLworCXN0cnVjdCBCRV9DRVZfSVNSMF9DU1JfQU1BUCBpc3IwOworCXN0cnVjdCBCRV9DRVZfSVNSMV9DU1JfQU1BUCBpc3IxOworCXN0cnVjdCBCRV9DRVZfSVNSMl9DU1JfQU1BUCBpc3IyOworCXN0cnVjdCBCRV9DRVZfSVNSM19DU1JfQU1BUCBpc3IzOworCXU4IHJzdmQ0WzMyXTsJLyogRFdPUkQgOCAqLworCXU4IHJzdmQ1WzMyXTsJLyogRFdPUkQgOSAqLworCXU4IHJzdmQ2WzMyXTsJLyogRFdPUkQgMTAgKi8KKwl1OCByc3ZkN1szMl07CS8qIERXT1JEIDExICovCisJdTggcnN2ZDhbMzJdOwkvKiBEV09SRCAxMiAqLworCXU4IHJzdmQ5WzMyXTsJLyogRFdPUkQgMTMgKi8KKwl1OCByc3ZkMTBbMzJdOwkvKiBEV09SRCAxNCAqLworCXU4IHJzdmQxMVszMl07CS8qIERXT1JEIDE1ICovCisJdTggcnN2ZDEyWzMyXTsJLyogRFdPUkQgMTYgKi8KKwl1OCByc3ZkMTNbMzJdOwkvKiBEV09SRCAxNyAqLworCXU4IHJzdmQxNFszMl07CS8qIERXT1JEIDE4ICovCisJdTggcnN2ZDE1WzMyXTsJLyogRFdPUkQgMTkgKi8KKwl1OCByc3ZkMTZbMzJdOwkvKiBEV09SRCAyMCAqLworCXU4IHJzdmQxN1szMl07CS8qIERXT1JEIDIxICovCisJdTggcnN2ZDE4WzMyXTsJLyogRFdPUkQgMjIgKi8KKwl1OCByc3ZkMTlbMzJdOwkvKiBEV09SRCAyMyAqLworCXU4IHJzdmQyMFszMl07CS8qIERXT1JEIDI0ICovCisJdTggcnN2ZDIxWzMyXTsJLyogRFdPUkQgMjUgKi8KKwl1OCByc3ZkMjJbMzJdOwkvKiBEV09SRCAyNiAqLworCXU4IHJzdmQyM1szMl07CS8qIERXT1JEIDI3ICovCisJdTggcnN2ZDI0WzMyXTsJLyogRFdPUkQgMjggKi8KKwl1OCByc3ZkMjVbMzJdOwkvKiBEV09SRCAyOSAqLworCXU4IHJzdmQyNlszMl07CS8qIERXT1JEIDMwICovCisJdTggcnN2ZDI3WzMyXTsJLyogRFdPUkQgMzEgKi8KKwl1OCByc3ZkMjhbMzJdOwkvKiBEV09SRCAzMiAqLworCXU4IHJzdmQyOVszMl07CS8qIERXT1JEIDMzICovCisJdTggcnN2ZDMwWzE5Ml07CS8qIERXT1JEIDM0ICovCisJdTggcnN2ZDMxWzE5Ml07CS8qIERXT1JEIDQwICovCisJdTggcnN2ZDMyWzE2MF07CS8qIERXT1JEIDQ2ICovCisJdTggcnN2ZDMzWzE2MF07CS8qIERXT1JEIDUxICovCisJdTggcnN2ZDM0WzE2MF07CS8qIERXT1JEIDU2ICovCisJdTggcnN2ZDM1Wzk2XTsJLyogRFdPUkQgNjEgKi8KKwl1OCByc3ZkMzZbMTkyXVszMl07CS8qIERXT1JEIDY0ICovCit9IF9fcGFja2VkOworc3RydWN0IENFVl9DU1JNQVBfQU1BUCB7CisJdTMyIGR3WzI1Nl07Cit9OworCisjZW5kaWYgLyogX19jZXZfYW1hcF9oX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9jcS5jIGIvZHJpdmVycy9zdGFnaW5nL2JlbmV0L2NxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjUwNDU4NgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9jcS5jCkBAIC0wLDAgKzEsMjExIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA1IC0gMjAwOCBTZXJ2ZXJFbmdpbmVzCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBUaGUgZnVsbCBHTlUgR2VuZXJhbAorICogUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlIGZpbGUgY2FsbGVkIENPUFlJTkcuCisgKgorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqIGxpbnV4LWRyaXZlcnNAc2VydmVyZW5naW5lcy5jb20KKyAqCisgKiBTZXJ2ZXJFbmdpbmVzCisgKiAyMDkgTi4gRmFpciBPYWtzIEF2ZQorICogU3Vubnl2YWxlLCBDQSA5NDA4NQorICovCisjaW5jbHVkZSAiaHdsaWIuaCIKKyNpbmNsdWRlICJiZXN0YXR1cy5oIgorCisvKgorICogQ29tcGxldGlvbiBRdWV1ZSBPYmplY3RzCisgKi8KKy8qCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqICAgICAgICAgICAgICAgICAgUCBVIEIgTCBJIEMgIFIgTyBVIFQgSSBOIEUgUworICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworLyoKKyAgICBUaGlzIHJvdXRpbmUgY3JlYXRlcyBhIGNvbXBsZXRpb24gcXVldWUgYmFzZWQgb24gdGhlIGNsaWVudCBjb21wbGV0aW9uCisgICAgcXVldWUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbi4KKworCisgICAgRnVuY3Rpb25PYmplY3QgICAgICAtIEhhbmRsZSB0byBhIGZ1bmN0aW9uIG9iamVjdAorICAgIENxQmFzZVZhICAgICAgICAgICAgLSBCYXNlIFZBIGZvciBhIHRoZSBDUSByaW5nCisgICAgTnVtRW50cmllcyAgICAgICAgICAtIENFVl9DUV9DTlRfKiB2YWx1ZXMKKyAgICBzb2xFdmVudEVuYWJsZSAgICAgIC0gMCA9IEFsbCBDUUVzIGNhbiBnZW5lcmF0ZSBFdmVudHMgaWYgQ1EgaXMgZXZlbnRhYmxlCisJCQkxID0gb25seSBDUUVzIHdpdGggc29saWNpdGVkIGJpdCBzZXQgYXJlIGV2ZW50YWJsZQorICAgIGV2ZW50YWJsZSAgICAgICAgICAgLSBFdmVudGFibGUgQ1EsIGdlbmVyYXRlcyBpbnRlcnJ1cHRzLgorICAgIG5vZGVsYXkgICAgICAgICAgICAgLSAxID0gRm9yY2UgaW50ZXJydXB0LCByZWxldmVudCBpZiBDUSBldmVudGFibGUuCisJCQlJbnRlcnJ1cHQgaXMgYXNzZXJ0ZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgRVFFCisJCQl3cml0ZSBpcyBjb25maXJtZWQsIHJlZ2FyZGxlc3Mgb2YgRVEgVGltZXIKKwkJCW9yIHdhdGVybWFyayBzZXR0aW5ncy4KKyAgICB3bWUgICAgICAgICAgICAgICAgIC0gRW5hYmxlIHdhdGVybWFyayBiYXNlZCBjb2FsZXNjaW5nCisgICAgd21UaHJlc2ggICAgICAgICAgICAtIEhpZ2ggd2F0ZXJtYXJrKENRIGZ1bGxuZXNzIGF0IHdoaWNoIGV2ZW50CisJCQlvciBpbnRlcnJ1cHQgc2hvdWxkIGJlIGFzc2VydGVkKS4gIFRoZXNlIGFyZSB0aGUKKwkJCUNFVl9XQVRFUk1BUksgZW5jb2RlZCB2YWx1ZXMuCisgICAgRXFPYmplY3QgICAgICAgICAgICAtIEVRIEhhbmRsZSB0byBhc3NpZ24gdG8gdGhpcyBDUQorICAgIHBwQ3FPYmplY3QgICAgICAgICAgLSBJbnRlcm5hbCBDUSBIYW5kbGUgcmV0dXJuZWQuCisKKyAgICBSZXR1cm5zIEJFX1NVQ0NFU1MgaWYgc3VjY2Vzc2Z1bGwsIG90aGVyd2lzZSBhIHVzZWZ1bCBlcnJvciBjb2RlIGlzCisJcmV0dXJuZWQuCisKKyAgICBJUlFMIDwgRElTUEFUQ0hfTEVWRUwKKworKi8KK2ludCBiZV9jcV9jcmVhdGUoc3RydWN0IGJlX2Z1bmN0aW9uX29iamVjdCAqcGZvYiwKKwlzdHJ1Y3QgcmluZ19kZXNjICpyZCwgdTMyIGxlbmd0aCwgYm9vbCBzb2xpY2l0ZWRfZXZlbnRhYmxlLAorCWJvb2wgbm9fZGVsYXksIHUzMiB3bV90aHJlc2gsCisJc3RydWN0IGJlX2VxX29iamVjdCAqZXFfb2JqZWN0LCBzdHJ1Y3QgYmVfY3Ffb2JqZWN0ICpjcV9vYmplY3QpCit7CisJaW50IHN0YXR1cyA9IEJFX1NVQ0NFU1M7CisJdTMyIG51bV9lbnRyaWVzX2VuY29kaW5nOworCXUzMiBudW1fZW50cmllcyA9IGxlbmd0aCAvIHNpemVvZihzdHJ1Y3QgTUNDX0NRX0VOVFJZX0FNQVApOworCXN0cnVjdCBGV0NNRF9DT01NT05fQ1FfQ1JFQVRFICpmd2NtZCA9IE5VTEw7CisJc3RydWN0IE1DQ19XUkJfQU1BUCAqd3JiID0gTlVMTDsKKwl1MzIgbjsKKwl1bnNpZ25lZCBsb25nIGlycWw7CisKKwlBU1NFUlQocmQpOworCUFTU0VSVChjcV9vYmplY3QpOworCUFTU0VSVChsZW5ndGggJSBzaXplb2Yoc3RydWN0IE1DQ19DUV9FTlRSWV9BTUFQKSA9PSAwKTsKKworCXN3aXRjaCAobnVtX2VudHJpZXMpIHsKKwljYXNlIDI1NjoKKwkJbnVtX2VudHJpZXNfZW5jb2RpbmcgPSBDRVZfQ1FfQ05UXzI1NjsKKwkJYnJlYWs7CisJY2FzZSA1MTI6CisJCW51bV9lbnRyaWVzX2VuY29kaW5nID0gQ0VWX0NRX0NOVF81MTI7CisJCWJyZWFrOworCWNhc2UgMTAyNDoKKwkJbnVtX2VudHJpZXNfZW5jb2RpbmcgPSBDRVZfQ1FfQ05UXzEwMjQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUFTU0VSVCgwKTsKKwkJcmV0dXJuIEJFX1NUQVRVU19JTlZBTElEX1BBUkFNRVRFUjsKKwl9CisKKwkvKgorCSAqIEFsbCBjcSBlbnRyaWVzIGFsbCB0aGUgc2FtZSBzaXplLiAgVXNlIGlTQ1NJIHZlcnNpb24KKwkgKiBhcyBhIHRlc3QgZm9yIHRoZSBwcm9wZXIgcmQgbGVuZ3RoLgorCSAqLworCW1lbXNldChjcV9vYmplY3QsIDAsIHNpemVvZigqY3Ffb2JqZWN0KSk7CisKKwlhdG9taWNfc2V0KCZjcV9vYmplY3QtPnJlZl9jb3VudCwgMCk7CisJY3Ffb2JqZWN0LT5wYXJlbnRfZnVuY3Rpb24gPSBwZm9iOworCWNxX29iamVjdC0+ZXFfb2JqZWN0ID0gZXFfb2JqZWN0OworCWNxX29iamVjdC0+bnVtX2VudHJpZXMgPSBudW1fZW50cmllczsKKwkvKiBzYXZlIGZvciBNQ0MgY3EgcHJvY2Vzc2luZyAqLworCWNxX29iamVjdC0+dmEgPSByZC0+dmE7CisKKwkvKiBtYXAgaW50byBVVC4gKi8KKwlsZW5ndGggPSBudW1fZW50cmllcyAqIHNpemVvZihzdHJ1Y3QgTUNDX0NRX0VOVFJZX0FNQVApOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBmb2ItPnBvc3RfbG9jaywgaXJxbCk7CisKKwl3cmIgPSBiZV9mdW5jdGlvbl9wZWVrX21jY193cmIocGZvYik7CisJaWYgKCF3cmIpIHsKKwkJQVNTRVJUKHdyYik7CisJCVRSQUNFKERMX0VSUiwgIk5vIGZyZWUgTUNDIFdSQnMgaW4gY3JlYXRlIEVRLiIpOworCQlzdGF0dXMgPSBCRV9TVEFUVVNfTk9fTUNDX1dSQjsKKwkJZ290byBFcnJvcjsKKwl9CisJLyogUHJlcGFyZXMgYW4gZW1iZWRkZWQgZndjbWQsIGluY2x1ZGluZyByZXF1ZXN0L3Jlc3BvbnNlIHNpemVzLiAqLworCWZ3Y21kID0gQkVfUFJFUEFSRV9FTUJFRERFRF9GV0NNRChwZm9iLCB3cmIsIENPTU1PTl9DUV9DUkVBVEUpOworCisJZndjbWQtPnBhcmFtcy5yZXF1ZXN0Lm51bV9wYWdlcyA9IFBBR0VTX1NQQU5ORUQoT0ZGU0VUX0lOX1BBR0UocmQtPnZhKSwKKwkJCQkJCQkJCWxlbmd0aCk7CisKKwlBTUFQX1NFVF9CSVRTX1BUUihDUV9DT05URVhULCB2YWxpZCwgJmZ3Y21kLT5wYXJhbXMucmVxdWVzdC5jb250ZXh0LCAxKTsKKwluID0gcGZvYi0+cGNpX2Z1bmN0aW9uX251bWJlcjsKKwlBTUFQX1NFVF9CSVRTX1BUUihDUV9DT05URVhULCBGdW5jLCAmZndjbWQtPnBhcmFtcy5yZXF1ZXN0LmNvbnRleHQsIG4pOworCisJbiA9IChlcV9vYmplY3QgIT0gTlVMTCk7CisJQU1BUF9TRVRfQklUU19QVFIoQ1FfQ09OVEVYVCwgRXZlbnRhYmxlLAorCQkJCSZmd2NtZC0+cGFyYW1zLnJlcXVlc3QuY29udGV4dCwgbik7CisJQU1BUF9TRVRfQklUU19QVFIoQ1FfQ09OVEVYVCwgQXJtZWQsICZmd2NtZC0+cGFyYW1zLnJlcXVlc3QuY29udGV4dCwgMSk7CisKKwluID0gZXFfb2JqZWN0ID8gZXFfb2JqZWN0LT5lcV9pZCA6IDA7CisJQU1BUF9TRVRfQklUU19QVFIoQ1FfQ09OVEVYVCwgRVFJRCwgJmZ3Y21kLT5wYXJhbXMucmVxdWVzdC5jb250ZXh0LCBuKTsKKwlBTUFQX1NFVF9CSVRTX1BUUihDUV9DT05URVhULCBDb3VudCwKKwkJCSZmd2NtZC0+cGFyYW1zLnJlcXVlc3QuY29udGV4dCwgbnVtX2VudHJpZXNfZW5jb2RpbmcpOworCisJbiA9IDA7IC8qIFByb3RlY3Rpb24gRG9tYWluIGlzIGFsd2F5cyAwIGluICBMaW51eCAgZHJpdmVyICovCisJQU1BUF9TRVRfQklUU19QVFIoQ1FfQ09OVEVYVCwgUEQsICZmd2NtZC0+cGFyYW1zLnJlcXVlc3QuY29udGV4dCwgbik7CisJQU1BUF9TRVRfQklUU19QVFIoQ1FfQ09OVEVYVCwgTm9EZWxheSwKKwkJCQkmZndjbWQtPnBhcmFtcy5yZXF1ZXN0LmNvbnRleHQsIG5vX2RlbGF5KTsKKwlBTUFQX1NFVF9CSVRTX1BUUihDUV9DT05URVhULCBTb2xFdmVudCwKKwkJCSZmd2NtZC0+cGFyYW1zLnJlcXVlc3QuY29udGV4dCwgc29saWNpdGVkX2V2ZW50YWJsZSk7CisKKwluID0gKHdtX3RocmVzaCAhPSAweEZGRkZGRkZGKTsKKwlBTUFQX1NFVF9CSVRTX1BUUihDUV9DT05URVhULCBXTUUsICZmd2NtZC0+cGFyYW1zLnJlcXVlc3QuY29udGV4dCwgbik7CisKKwluID0gKG4gPyB3bV90aHJlc2ggOiAwKTsKKwlBTUFQX1NFVF9CSVRTX1BUUihDUV9DT05URVhULCBXYXRlcm1hcmssCisJCQkJJmZ3Y21kLT5wYXJhbXMucmVxdWVzdC5jb250ZXh0LCBuKTsKKwkvKiBDcmVhdGUgYSBwYWdlIGxpc3QgZm9yIHRoZSBGV0NNRC4gKi8KKwliZV9yZF90b19wYV9saXN0KHJkLCBmd2NtZC0+cGFyYW1zLnJlcXVlc3QucGFnZXMsCisJCQkgIEFSUkFZX1NJWkUoZndjbWQtPnBhcmFtcy5yZXF1ZXN0LnBhZ2VzKSk7CisKKwkvKiBQb3N0IHRoZSBmL3cgY29tbWFuZCAqLworCXN0YXR1cyA9IGJlX2Z1bmN0aW9uX3Bvc3RfbWNjX3dyYihwZm9iLCB3cmIsIE5VTEwsIE5VTEwsIE5VTEwsCisJCQlOVUxMLCBOVUxMLCBmd2NtZCwgTlVMTCk7CisJaWYgKHN0YXR1cyAhPSBCRV9TVUNDRVNTKSB7CisJCVRSQUNFKERMX0VSUiwgIk1DQyB0byBjcmVhdGUgQ1EgZmFpbGVkLiIpOworCQlnb3RvIEVycm9yOworCX0KKwkvKiBSZW1lbWJlciB0aGUgQ1EgaWQuICovCisJY3Ffb2JqZWN0LT5jcV9pZCA9IGZ3Y21kLT5wYXJhbXMucmVzcG9uc2UuY3FfaWQ7CisKKwkvKiBpbnNlcnQgdGhpcyBjcSBpbnRvIGVxX29iamVjdCByZWZlcmVuY2UgKi8KKwlpZiAoZXFfb2JqZWN0KSB7CisJCWF0b21pY19pbmMoJmVxX29iamVjdC0+cmVmX2NvdW50KTsKKwkJbGlzdF9hZGRfdGFpbCgmY3Ffb2JqZWN0LT5jcWxpc3RfZm9yX2VxLAorCQkJCQkmZXFfb2JqZWN0LT5jcV9saXN0X2hlYWQpOworCX0KKworRXJyb3I6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGZvYi0+cG9zdF9sb2NrLCBpcnFsKTsKKworCWlmIChwZm9iLT5wZW5kX3F1ZXVlX2RyaXZpbmcgJiYgcGZvYi0+bWNjKSB7CisJCXBmb2ItPnBlbmRfcXVldWVfZHJpdmluZyA9IDA7CisJCWJlX2RyaXZlX21jY193cmJfcXVldWUocGZvYi0+bWNjKTsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKworICAgIERlZmVyZW5jZXMgdGhlIGdpdmVuIG9iamVjdC4gT25jZSB0aGUgb2JqZWN0J3MgcmVmZXJlbmNlIGNvdW50IGRyb3BzIHRvCisgICAgemVybywgdGhlIG9iamVjdCBpcyBkZXN0cm95ZWQgYW5kIGFsbCByZXNvdXJjZXMgdGhhdCBhcmUgaGVsZCBieSB0aGlzIG9iamVjdAorICAgIGFyZSByZWxlYXNlZC4gIFRoZSBvbi1jaGlwIGNvbnRleHQgaXMgYWxzbyBkZXN0cm95ZWQgYWxvbmcgd2l0aCB0aGUgcXVldWUKKyAgICBJRCwgYW5kIGFueSBtYXBwaW5ncyBtYWRlIGludG8gdGhlIFVULgorCisgICAgY3Ffb2JqZWN0ICAgICAgICAgICAgLSBDUSBoYW5kbGUgcmV0dXJuZWQgZnJvbSBjcV9vYmplY3RfY3JlYXRlLgorCisgICAgcmV0dXJucyB0aGUgY3VycmVudCByZWZlcmVuY2UgY291bnQgb24gdGhlIG9iamVjdAorCisgICAgSVJRTDogSVJRTCA8IERJU1BBVENIX0xFVkVMCisqLworaW50IGJlX2NxX2Rlc3Ryb3koc3RydWN0IGJlX2NxX29iamVjdCAqY3Ffb2JqZWN0KQoreworCWludCBzdGF0dXMgPSAwOworCisJLyogTm90aGluZyBzaG91bGQgcmVmZXJlbmNlIHRoaXMgQ1EgYXQgdGhpcyBwb2ludC4gKi8KKwlBU1NFUlQoYXRvbWljX3JlYWQoJmNxX29iamVjdC0+cmVmX2NvdW50KSA9PSAwKTsKKworCS8qIFNlbmQgZndjbWQgdG8gZGVzdHJveSB0aGUgQ1EuICovCisJc3RhdHVzID0gYmVfZnVuY3Rpb25fcmluZ19kZXN0cm95KGNxX29iamVjdC0+cGFyZW50X2Z1bmN0aW9uLAorCQkgICAgIGNxX29iamVjdC0+Y3FfaWQsIEZXQ01EX1JJTkdfVFlQRV9DUSwKKwkJCQkJTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCk7CisJQVNTRVJUKHN0YXR1cyA9PSAwKTsKKworCS8qIFJlbW92ZSByZWZlcmVuY2UgaWYgdGhpcyBpcyBhbiBldmVudGFibGUgQ1EuICovCisJaWYgKGNxX29iamVjdC0+ZXFfb2JqZWN0KSB7CisJCWF0b21pY19kZWMoJmNxX29iamVjdC0+ZXFfb2JqZWN0LT5yZWZfY291bnQpOworCQlsaXN0X2RlbCgmY3Ffb2JqZWN0LT5jcWxpc3RfZm9yX2VxKTsKKwl9CisJcmV0dXJuIEJFX1NVQ0NFU1M7Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9kZXNjcmlwdG9ycy5oIGIvZHJpdmVycy9zdGFnaW5nL2JlbmV0L2Rlc2NyaXB0b3JzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGRhNDM4YwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9kZXNjcmlwdG9ycy5oCkBAIC0wLDAgKzEsNzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgLSAyMDA4IFNlcnZlckVuZ2luZXMKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFRoZSBmdWxsIEdOVSBHZW5lcmFsCisgKiBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUgZmlsZSBjYWxsZWQgQ09QWUlORy4KKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogbGludXgtZHJpdmVyc0BzZXJ2ZXJlbmdpbmVzLmNvbQorICoKKyAqIFNlcnZlckVuZ2luZXMKKyAqIDIwOSBOLiBGYWlyIE9ha3MgQXZlCisgKiBTdW5ueXZhbGUsIENBIDk0MDg1CisgKi8KKy8qCisgKiBBdXRvZ2VuZXJhdGVkIGJ5IHNyY2dlbiB2ZXJzaW9uOiAwMTI3CisgKi8KKyNpZm5kZWYgX19kZXNjcmlwdG9yc19hbWFwX2hfXworI2RlZmluZSBfX2Rlc2NyaXB0b3JzX2FtYXBfaF9fCisKKy8qCisgKiAtLS0gSVBDX05PREVfSURfRU5VTSAtLS0KKyAqIElQQyBwcm9jZXNzb3IgaWQgdmFsdWVzCisgKi8KKyNkZWZpbmUgVFBPU1RfTk9ERV9JRCAgICAgICAgICAgICAgICAgICAoMCkJLyogVFBPU1QgSUQgKi8KKyNkZWZpbmUgVFBSRV9OT0RFX0lEICAgICAgICAgICAgICAgICAgICAoMSkJLyogVFBSRSBJRCAqLworI2RlZmluZSBUWFVMUDBfTk9ERV9JRCAgICAgICAgICAgICAgICAgICgyKQkvKiBUWFVMUDAgSUQgKi8KKyNkZWZpbmUgVFhVTFAxX05PREVfSUQgICAgICAgICAgICAgICAgICAoMykJLyogVFhVTFAxIElEICovCisjZGVmaW5lIFRYVUxQMl9OT0RFX0lEICAgICAgICAgICAgICAgICAgKDQpCS8qIFRYVUxQMiBJRCAqLworI2RlZmluZSBSWFVMUDBfTk9ERV9JRCAgICAgICAgICAgICAgICAgICg1KQkvKiBSWFVMUDAgSUQgKi8KKyNkZWZpbmUgUlhVTFAxX05PREVfSUQgICAgICAgICAgICAgICAgICAoNikJLyogUlhVTFAxIElEICovCisjZGVmaW5lIFJYVUxQMl9OT0RFX0lEICAgICAgICAgICAgICAgICAgKDcpCS8qIFJYVUxQMiBJRCAqLworI2RlZmluZSBNUFVfTk9ERV9JRCAgICAgICAgICAgICAgICAgICAgICgxNSkJLyogTVBVIElEICovCisKKy8qCisgKiAtLS0gTUFDX0lEX0VOVU0gLS0tCisgKiBNZWFuaW5nIG9mIHRoZSBtYWNfaWQgZmllbGQgaW4gcnhwcF9ldGhfZAorICovCisjZGVmaW5lIFBPUlQwX0hPU1RfTUFDMCAgICAoMCkgIC8qIFBEIDAsIFBvcnQgMCwgaG9zdCBuZXR3b3JraW5nLCBNQUMgMC4gKi8KKyNkZWZpbmUgUE9SVDBfSE9TVF9NQUMxICAgICgxKQkvKiBQRCAwLCBQb3J0IDAsIGhvc3QgbmV0d29ya2luZywgTUFDIDEuICovCisjZGVmaW5lIFBPUlQwX1NUT1JBR0VfTUFDMCAoMikJLyogUEQgMCwgUG9ydCAwLCBob3N0IHN0b3JhZ2UsIE1BQyAwLiAqLworI2RlZmluZSBQT1JUMF9TVE9SQUdFX01BQzEgKDMpCS8qIFBEIDAsIFBvcnQgMCwgaG9zdCBzdG9yYWdlLCBNQUMgMS4gKi8KKyNkZWZpbmUgUE9SVDFfSE9TVF9NQUMwICAgICg0KQkvKiBQRCAwLCBQb3J0IDEgaG9zdCBuZXR3b3JraW5nLCBNQUMgMC4gKi8KKyNkZWZpbmUgUE9SVDFfSE9TVF9NQUMxICAgICg1KQkvKiBQRCAwLCBQb3J0IDEgaG9zdCBuZXR3b3JraW5nLCBNQUMgMS4gKi8KKyNkZWZpbmUgUE9SVDFfU1RPUkFHRV9NQUMwICg2KQkvKiBQRCAwLCBQb3J0IDEgaG9zdCBzdG9yYWdlLCBNQUMgMC4gKi8KKyNkZWZpbmUgUE9SVDFfU1RPUkFHRV9NQUMxICg3KQkvKiBQRCAwLCBQb3J0IDEgaG9zdCBzdG9yYWdlLCBNQUMgMS4gKi8KKyNkZWZpbmUgRklSU1RfVk1fTUFDICAgICAgICg4KQkvKiBQRCAxIE1BQy4gUHJvdGVjdGlvbiBkb21haW5zIGhhdmUgSURzICovCisJCQkJLyogZnJvbSAweDgtMHgyNiwgb25lIHBlciBQRC4gKi8KKyNkZWZpbmUgTEFTVF9WTV9NQUMgICAgICAgICgzOCkJLyogUEQgMzEgTUFDLiAqLworI2RlZmluZSBNR01UX01BQyAgICAgICAgICAgKDM5KQkvKiBNYW5hZ2VtZW50IHBvcnQgTUFDLiAqLworI2RlZmluZSBNQVJCTEVfTUFDMCAgICAgICAgKDU5KQkvKiBVc2VkIGZvciBmbHVzaGluZyBmdW5jdGlvbiAwIHJlY2VpdmUgKi8KKwkJCQkgIC8qCisJCQkJICAgKiBxdWV1ZXMgYmVmb3JlIHJlLXVzaW5nIGEgdG9ybi1kb3duCisJCQkJICAgKiByZWNlaXZlIHJpbmcuIHRoZSBEQSA9CisJCQkJICAgKiAwMC0wMC0wMC0wMC0wMC0wMCwgYW5kIHRoZSBNU0Igb2YgdGhlCisJCQkJICAgKiBTQSA9IDAwCisJCQkJICAgKi8KKyNkZWZpbmUgTUFSQkxFX01BQzEgICAgICAgICg2MCkJLyogVXNlZCBmb3IgZmx1c2hpbmcgZnVuY3Rpb24gMSByZWNlaXZlICovCisJCQkJICAvKgorCQkJCSAgICogcXVldWVzIGJlZm9yZSByZS11c2luZyBhIHRvcm4tZG93bgorCQkJCSAgICogcmVjZWl2ZSByaW5nLiB0aGUgREEgPQorCQkJCSAgICogMDAtMDAtMDAtMDAtMDAtMDAsIGFuZCB0aGUgTVNCIG9mIHRoZQorCQkJCSAgICogU0EgIT0gMDAKKwkJCQkgICAqLworI2RlZmluZSBOVUxMX01BQyAgICAgICAgICAgKDYxKQkvKiBQcm9taXNjdW91cyBtb2RlLCBpbmRpY2F0ZXMgbm8gbWF0Y2ggKi8KKyNkZWZpbmUgTUNBU1RfTUFDICAgICAgICAgICg2MikJLyogTXVsdGljYXN0IG1hdGNoLiAqLworI2RlZmluZSBCQ0FTVF9NQVRDSCAgICAgICAgKDYzKQkvKiBCcm9hZGNhc3QgbWF0Y2guICovCisKKyNlbmRpZiAvKiBfX2Rlc2NyaXB0b3JzX2FtYXBfaF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvZG9vcmJlbGxzLmggYi9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvZG9vcmJlbGxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTUwY2M0ZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9kb29yYmVsbHMuaApAQCAtMCwwICsxLDE3OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNSAtIDIwMDggU2VydmVyRW5naW5lcworICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgVGhlIGZ1bGwgR05VIEdlbmVyYWwKKyAqIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZSBmaWxlIGNhbGxlZCBDT1BZSU5HLgorICoKKyAqIENvbnRhY3QgSW5mb3JtYXRpb246CisgKiBsaW51eC1kcml2ZXJzQHNlcnZlcmVuZ2luZXMuY29tCisgKgorICogU2VydmVyRW5naW5lcworICogMjA5IE4uIEZhaXIgT2FrcyBBdmUKKyAqIFN1bm55dmFsZSwgQ0EgOTQwODUKKyAqLworLyoKKyAqIEF1dG9nZW5lcmF0ZWQgYnkgc3JjZ2VuIHZlcnNpb246IDAxMjcKKyAqLworI2lmbmRlZiBfX2Rvb3JiZWxsc19hbWFwX2hfXworI2RlZmluZSBfX2Rvb3JiZWxsc19hbWFwX2hfXworCisvKiBUaGUgVFgvUkRNQSBzZW5kIHF1ZXVlIGRvb3JiZWxsLiAqLworc3RydWN0IEJFX1NRX0RCX0FNQVAgeworCXU4IGNpZFsxMV07CQkvKiBEV09SRCAwICovCisJdTggcnN2ZDBbNV07CS8qIERXT1JEIDAgKi8KKwl1OCBudW1Qb3N0ZWRbMTRdOwkvKiBEV09SRCAwICovCisJdTggcnN2ZDFbMl07CS8qIERXT1JEIDAgKi8KK30gX19wYWNrZWQ7CitzdHJ1Y3QgU1FfREJfQU1BUCB7CisJdTMyIGR3WzFdOworfTsKKworLyogVGhlIHJlY2VpdmUgcXVldWUgZG9vcmJlbGwuICovCitzdHJ1Y3QgQkVfUlFfREJfQU1BUCB7CisJdTggcnFbMTBdOwkJLyogRFdPUkQgMCAqLworCXU4IHJzdmQwWzEzXTsJLyogRFdPUkQgMCAqLworCXU4IEludmFsaWRhdGU7CS8qIERXT1JEIDAgKi8KKwl1OCBudW1Qb3N0ZWRbOF07CS8qIERXT1JEIDAgKi8KK30gX19wYWNrZWQ7CitzdHJ1Y3QgUlFfREJfQU1BUCB7CisJdTMyIGR3WzFdOworfTsKKworLyoKKyAqIFRoZSBDUS9FUSBkb29yYmVsbC4gU29mdHdhcmUgTVVTVCBzZXQgcmVzZXJ2ZWQgZmllbGRzIGluIHRoaXMKKyAqIGRlc2NyaXB0b3IgdG8gemVybywgb3RoZXJ3aXNlIChDRVYpIGhhcmR3YXJlIHdpbGwgbm90IGV4ZWN1dGUgdGhlCisgKiBkb29yYmVsbCAoZmxhZ2dpbmcgYSBiYWRfZGJfcWlkIGVycm9yIGluc3RlYWQpLgorICovCitzdHJ1Y3QgQkVfQ1FfREJfQU1BUCB7CisJdTggcWlkWzEwXTsJCS8qIERXT1JEIDAgKi8KKwl1OCByc3ZkMFs0XTsJLyogRFdPUkQgMCAqLworCXU4IHJlYXJtOwkJLyogRFdPUkQgMCAqLworCXU4IGV2ZW50OwkJLyogRFdPUkQgMCAqLworCXU4IG51bV9wb3BwZWRbMTNdOwkvKiBEV09SRCAwICovCisJdTggcnN2ZDFbM107CS8qIERXT1JEIDAgKi8KK30gX19wYWNrZWQ7CitzdHJ1Y3QgQ1FfREJfQU1BUCB7CisJdTMyIGR3WzFdOworfTsKKworc3RydWN0IEJFX1RQTV9SUV9EQl9BTUFQIHsKKwl1OCBxaWRbMTBdOwkJLyogRFdPUkQgMCAqLworCXU4IHJzdmQwWzZdOwkvKiBEV09SRCAwICovCisJdTggbnVtUG9zdGVkWzExXTsJLyogRFdPUkQgMCAqLworCXU4IG1zc19jbnRbNV07CS8qIERXT1JEIDAgKi8KK30gX19wYWNrZWQ7CitzdHJ1Y3QgVFBNX1JRX0RCX0FNQVAgeworCXUzMiBkd1sxXTsKK307CisKKy8qCisgKiBQb3N0IFdSQiBRdWV1ZSBEb29yYmVsbCBSZWdpc3RlciB1c2VkIGJ5IHRoZSBob3N0IFN0b3JhZ2Ugc3RhY2sKKyAqIHRvIG5vdGlmeSB0aGUgY29udHJvbGxlciBvZiBhIHBvc3RlZCBXb3JrIFJlcXVlc3QgQmxvY2sKKyAqLworc3RydWN0IEJFX1dSQl9QT1NUX0RCX0FNQVAgeworCXU4IHdyYl9jaWRbMTBdOwkvKiBEV09SRCAwICovCisJdTggcnN2ZDBbNl07CS8qIERXT1JEIDAgKi8KKwl1OCB3cmJfaW5kZXhbOF07CS8qIERXT1JEIDAgKi8KKwl1OCBudW1iZXJQb3N0ZWRbOF07CS8qIERXT1JEIDAgKi8KK30gX19wYWNrZWQ7CitzdHJ1Y3QgV1JCX1BPU1RfREJfQU1BUCB7CisJdTMyIGR3WzFdOworfTsKKworLyoKKyAqIFVwZGF0ZSBEZWZhdWx0IFBEVSBRdWV1ZSBEb29yYmVsbCBSZWdpc3RlciB1c2VkIHRvIGNvbW11bmljYXRlCisgKiB0byB0aGUgY29udHJvbGxlciB0aGF0IHRoZSBkcml2ZXIgaGFzIHN0b3BwZWQgcHJvY2Vzc2luZyB0aGUgcXVldWUKKyAqIGFuZCB3aGVyZSBpbiB0aGUgcXVldWUgaXQgc3RvcHBlZCwgdGhpcyBpcworICogYSBDUSBFbnRyeSBUeXBlLiBVc2VkIGJ5IHN0b3JhZ2UgZHJpdmVyLgorICovCitzdHJ1Y3QgQkVfREVGQVVMVF9QRFVfREJfQU1BUCB7CisJdTggcWlkWzEwXTsJCS8qIERXT1JEIDAgKi8KKwl1OCByc3ZkMFs0XTsJLyogRFdPUkQgMCAqLworCXU4IHJlYXJtOwkJLyogRFdPUkQgMCAqLworCXU4IGV2ZW50OwkJLyogRFdPUkQgMCAqLworCXU4IGNxcHJvY1sxNF07CS8qIERXT1JEIDAgKi8KKwl1OCByc3ZkMVsyXTsJLyogRFdPUkQgMCAqLworfSBfX3BhY2tlZDsKK3N0cnVjdCBERUZBVUxUX1BEVV9EQl9BTUFQIHsKKwl1MzIgZHdbMV07Cit9OworCisvKiBNYW5hZ2VtZW50IENvbW1hbmQgYW5kIENvbnRyb2xsZXIgZGVmYXVsdCBmcmFnbWVudCByaW5nICovCitzdHJ1Y3QgQkVfTUNDX0RCX0FNQVAgeworCXU4IHJpZFsxMV07CQkvKiBEV09SRCAwICovCisJdTggcnN2ZDBbNV07CS8qIERXT1JEIDAgKi8KKwl1OCBudW1Qb3N0ZWRbMTRdOwkvKiBEV09SRCAwICovCisJdTggcnN2ZDFbMl07CS8qIERXT1JEIDAgKi8KK30gX19wYWNrZWQ7CitzdHJ1Y3QgTUNDX0RCX0FNQVAgeworCXUzMiBkd1sxXTsKK307CisKKy8qCisgKiBVc2VkIGZvciBib290c3RyYXBwaW5nIHRoZSBIb3N0IGludGVyZmFjZS4gVGhpcyByZWdpc3RlciBpcworICogdXNlZCBmb3IgZHJpdmVyIGNvbW11bmljYXRpb24gd2l0aCB0aGUgTVBVIHdoZW4gbm8gTUNDIFJpbmdzIGV4aXN0LgorICogVGhlIHNvZnR3YXJlIG11c3Qgd3JpdGUgdGhpcyByZWdpc3RlciB0d2ljZSB0byBwb3N0IGFueSBNQ0MKKyAqIGNvbW1hbmQuIEZpcnN0LCBpdCB3cml0ZXMgdGhlIHJlZ2lzdGVyIHdpdGggaGk9MSBhbmQgdGhlIHVwcGVyIGJpdHMgb2YKKyAqIHRoZSAgcGh5c2ljYWwgYWRkcmVzcyBmb3IgdGhlIE1DQ19NQUlMQk9YIHN0cnVjdHVyZS4gIFNvZnR3YXJlIG11c3QgcG9sbAorICogdGhlIHJlYWR5IGJpdCB1bnRpbCB0aGlzIGlzIGFja25vd2xlZGdlZC4gIFRoZW4sIHNvdHdhcmUgd3JpdGVzIHRoZQorICogcmVnaXN0ZXIgd2l0aCBoaT0wIHdpdGggdGhlIGxvd2VyIGJpdHMgaW4gdGhlIGFkZHJlc3MuICBJdCBtdXN0CisgKiBwb2xsIHRoZSByZWFkeSBiaXQgdW50aWwgdGhlIE1DQyBjb21tYW5kIGlzIGNvbXBsZXRlLiAgVXBvbiBjb21wbGV0aW9uLAorICogdGhlIE1DQ19NQUlMQk9YIHdpbGwgY29udGFpbiBhIHZhbGlkIGNvbXBsZXRpb24gcXVldWUgIGVudHJ5LgorICovCitzdHJ1Y3QgQkVfTVBVX01BSUxCT1hfREJfQU1BUCB7CisJdTggcmVhZHk7CQkvKiBEV09SRCAwICovCisJdTggaGk7CQkvKiBEV09SRCAwICovCisJdTggYWRkcmVzc1szMF07CS8qIERXT1JEIDAgKi8KK30gX19wYWNrZWQ7CitzdHJ1Y3QgTVBVX01BSUxCT1hfREJfQU1BUCB7CisJdTMyIGR3WzFdOworfTsKKworLyoKKyAqICBUaGlzIGlzIHRoZSBwcm90ZWN0aW9uIGRvbWFpbiBkb29yYmVsbCByZWdpc3RlciBtYXAuIE5vdGUgdGhhdAorICogIHdoaWxlIHRoaXMgbWFwIHNob3dzIGRvb3JiZWxscyBmb3IgYWxsIEJsYWRlIEVuZ2luZSBzdXBwb3J0ZWQKKyAqICBwcm90b2NvbHMsIG5vdCBhbGwgb2YgdGhlc2UgbWF5IGJlIHZhbGlkIGluIGEgZ2l2ZW4gZnVuY3Rpb24gb3IKKyAqICBwcm90ZWN0aW9uIGRvbWFpbi4gSXQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBhcHBsaWNhdGlvbgorICogIGFjY2Vzc2luZyB0aGUgZG9vcmJlbGxzIHRvIGtub3cgd2hpY2ggYXJlIHZhbGlkLiBFYWNoIGRvb3JiZWxsCisgKiAgb2NjdXBpZXMgMzIgYnl0ZXMgb2Ygc3BhY2UsIGJ1dCB1bmxlc3Mgb3RoZXJ3aXNlIHNwZWNpZmllZCwKKyAqICBvbmx5IHRoZSBmaXJzdCA0IGJ5dGVzIHNob3VsZCBiZSB3cml0dGVuLiAgVGhlcmUgYXJlIDMyIGluc3RhbmNlcworICogIG9mIHRoZXNlIGRvb3JiZWxscyBmb3IgdGhlIGhvc3QgYW5kIDMxIHZpcnR1YWwgbWFjaGluZXMgcmVzcGVjdGl2ZWx5LgorICogIFRoZSBob3N0IGFuZCBWTXMgd2lsbCBvbmx5IG1hcCB0aGUgZG9vcmJlbGwgcGFnZXMgYmVsb25naW5nIHRvIGl0cworICogIHByb3RlY3Rpb24gZG9tYWluLiBJdCB3aWxsIG5vdCBiZSBhYmxlIHRvIHRvdWNoIHRoZSBkb29yYmVsbHMgZm9yCisgKiAgYW5vdGhlciBWTS4gVGhlIGRvb3JiZWxscyBhcmUgdGhlIG9ubHkgcmVnaXN0ZXJzIGRpcmVjdGx5IGFjY2Vzc2libGUKKyAqICBieSBhIHZpcnR1YWwgbWFjaGluZS4gU2ltaWxhcmx5LCB0aGVyZSBhcmUgNTExIGFkZGl0aW9uYWwKKyAqICBkb29yYmVsbHMgZm9yIFJETUEgcHJvdGVjdGlvbiBkb21haW5zLiBQRCAwIGZvciBSRE1BIHNoYXJlcworICogIHRoZSBzYW1lIHBoeXNpY2FsIHByb3RlY3Rpb24gZG9tYWluIGRvb3JiZWxsIHBhZ2UgYXMgRVRIL2lTQ1NJLgorICoKKyAqLworc3RydWN0IEJFX1BST1RFQ1RJT05fRE9NQUlOX0RCTUFQX0FNQVAgeworCXU4IHJzdmQwWzUxMl07CS8qIERXT1JEIDAgKi8KKwlzdHJ1Y3QgQkVfU1FfREJfQU1BUCByZG1hX3NxX2RiOworCXU4IHJzdmQxWzddWzMyXTsJLyogRFdPUkQgMTcgKi8KKwlzdHJ1Y3QgQkVfV1JCX1BPU1RfREJfQU1BUCBpc2NzaV93cmJfcG9zdF9kYjsKKwl1OCByc3ZkMls3XVszMl07CS8qIERXT1JEIDI1ICovCisJc3RydWN0IEJFX1NRX0RCX0FNQVAgZXR4X3NxX2RiOworCXU4IHJzdmQzWzddWzMyXTsJLyogRFdPUkQgMzMgKi8KKwlzdHJ1Y3QgQkVfUlFfREJfQU1BUCByZG1hX3JxX2RiOworCXU4IHJzdmQ0WzddWzMyXTsJLyogRFdPUkQgNDEgKi8KKwlzdHJ1Y3QgQkVfREVGQVVMVF9QRFVfREJfQU1BUCBpc2NzaV9kZWZhdWx0X3BkdV9kYjsKKwl1OCByc3ZkNVs3XVszMl07CS8qIERXT1JEIDQ5ICovCisJc3RydWN0IEJFX1RQTV9SUV9EQl9BTUFQIHRwbV9ycV9kYjsKKwl1OCByc3ZkNls3XVszMl07CS8qIERXT1JEIDU3ICovCisJc3RydWN0IEJFX1JRX0RCX0FNQVAgZXJ4X3JxX2RiOworCXU4IHJzdmQ3WzddWzMyXTsJLyogRFdPUkQgNjUgKi8KKwlzdHJ1Y3QgQkVfQ1FfREJfQU1BUCBjcV9kYjsKKwl1OCByc3ZkOFs3XVszMl07CS8qIERXT1JEIDczICovCisJc3RydWN0IEJFX01DQ19EQl9BTUFQIG1wdV9tY2NfZGI7CisJdTggcnN2ZDlbN11bMzJdOwkvKiBEV09SRCA4MSAqLworCXN0cnVjdCBCRV9NUFVfTUFJTEJPWF9EQl9BTUFQIG1jY19ib290c3RyYXBfZGI7CisJdTggcnN2ZDEwWzkzNV1bMzJdOwkvKiBEV09SRCA4OSAqLworfSBfX3BhY2tlZDsKK3N0cnVjdCBQUk9URUNUSU9OX0RPTUFJTl9EQk1BUF9BTUFQIHsKKwl1MzIgZHdbMTAyNF07Cit9OworCisjZW5kaWYgLyogX19kb29yYmVsbHNfYW1hcF9oX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9lcC5oIGIvZHJpdmVycy9zdGFnaW5nL2JlbmV0L2VwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzJmY2Y2NAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9lcC5oCkBAIC0wLDAgKzEsNjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgLSAyMDA4IFNlcnZlckVuZ2luZXMKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFRoZSBmdWxsIEdOVSBHZW5lcmFsCisgKiBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUgZmlsZSBjYWxsZWQgQ09QWUlORy4KKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogbGludXgtZHJpdmVyc0BzZXJ2ZXJlbmdpbmVzLmNvbQorICoKKyAqIFNlcnZlckVuZ2luZXMKKyAqIDIwOSBOLiBGYWlyIE9ha3MgQXZlCisgKiBTdW5ueXZhbGUsIENBIDk0MDg1CisgKi8KKy8qCisgKiBBdXRvZ2VuZXJhdGVkIGJ5IHNyY2dlbiB2ZXJzaW9uOiAwMTI3CisgKi8KKyNpZm5kZWYgX19lcF9hbWFwX2hfXworI2RlZmluZSBfX2VwX2FtYXBfaF9fCisKKy8qIEdlbmVyYWwgQ29udHJvbCBhbmQgU3RhdHVzIFJlZ2lzdGVyLiAqLworc3RydWN0IEJFX0VQX0NPTlRST0xfQ1NSX0FNQVAgeworCXU4IG0wX1J4UGJ1ZjsJLyogRFdPUkQgMCAqLworCXU4IG0xX1J4UGJ1ZjsJLyogRFdPUkQgMCAqLworCXU4IG0yX1J4UGJ1ZjsJLyogRFdPUkQgMCAqLworCXU4IGZmX2VuOwkJLyogRFdPUkQgMCAqLworCXU4IHJzdmQwWzI3XTsJLyogRFdPUkQgMCAqLworCXU4IENQVV9yZXNldDsJLyogRFdPUkQgMCAqLworfSBfX3BhY2tlZDsKK3N0cnVjdCBFUF9DT05UUk9MX0NTUl9BTUFQIHsKKwl1MzIgZHdbMV07Cit9OworCisvKiBTZW1hcGhvcmUgUmVnaXN0ZXIuICovCitzdHJ1Y3QgQkVfRVBfU0VNQVBIT1JFX0NTUl9BTUFQIHsKKwl1OCB2YWx1ZVszMl07CS8qIERXT1JEIDAgKi8KK30gX19wYWNrZWQ7CitzdHJ1Y3QgRVBfU0VNQVBIT1JFX0NTUl9BTUFQIHsKKwl1MzIgZHdbMV07Cit9OworCisvKiBFbWJlZGRlZCBQcm9jZXNzb3IgU3BlY2lmaWMgUmVnaXN0ZXJzLiAqLworc3RydWN0IEJFX0VQX0NTUk1BUF9BTUFQIHsKKwlzdHJ1Y3QgQkVfRVBfQ09OVFJPTF9DU1JfQU1BUCBlcF9jb250cm9sOworCXU4IHJzdmQwWzMyXTsJLyogRFdPUkQgMSAqLworCXU4IHJzdmQxWzMyXTsJLyogRFdPUkQgMiAqLworCXU4IHJzdmQyWzMyXTsJLyogRFdPUkQgMyAqLworCXU4IHJzdmQzWzMyXTsJLyogRFdPUkQgNCAqLworCXU4IHJzdmQ0WzMyXTsJLyogRFdPUkQgNSAqLworCXU4IHJzdmQ1WzhdWzEyOF07CS8qIERXT1JEIDYgKi8KKwl1OCByc3ZkNlszMl07CS8qIERXT1JEIDM4ICovCisJdTggcnN2ZDdbMzJdOwkvKiBEV09SRCAzOSAqLworCXU4IHJzdmQ4WzMyXTsJLyogRFdPUkQgNDAgKi8KKwl1OCByc3ZkOVszMl07CS8qIERXT1JEIDQxICovCisJdTggcnN2ZDEwWzMyXTsJLyogRFdPUkQgNDIgKi8KKwlzdHJ1Y3QgQkVfRVBfU0VNQVBIT1JFX0NTUl9BTUFQIGVwX3NlbWFwaG9yZTsKKwl1OCByc3ZkMTFbMzJdOwkvKiBEV09SRCA0NCAqLworCXU4IHJzdmQxMlsxOV1bMzJdOwkvKiBEV09SRCA0NSAqLworfSBfX3BhY2tlZDsKK3N0cnVjdCBFUF9DU1JNQVBfQU1BUCB7CisJdTMyIGR3WzY0XTsKK307CisKKyNlbmRpZiAvKiBfX2VwX2FtYXBfaF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvZXEuYyBiL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9lcS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiOTJjY2QKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvZXEuYwpAQCAtMCwwICsxLDI5OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNSAtIDIwMDggU2VydmVyRW5naW5lcworICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgVGhlIGZ1bGwgR05VIEdlbmVyYWwKKyAqIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZSBmaWxlIGNhbGxlZCBDT1BZSU5HLgorICoKKyAqIENvbnRhY3QgSW5mb3JtYXRpb246CisgKiBsaW51eC1kcml2ZXJzQHNlcnZlcmVuZ2luZXMuY29tCisgKgorICogU2VydmVyRW5naW5lcworICogMjA5IE4uIEZhaXIgT2FrcyBBdmUKKyAqIFN1bm55dmFsZSwgQ0EgOTQwODUKKyAqLworI2luY2x1ZGUgImh3bGliLmgiCisjaW5jbHVkZSAiYmVzdGF0dXMuaCIKKy8qCisgICAgVGhpcyByb3V0aW5lIGNyZWF0ZXMgYW4gZXZlbnQgcXVldWUgYmFzZWQgb24gdGhlIGNsaWVudCBjb21wbGV0aW9uCisgICAgcXVldWUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbi4KKworICAgIEZ1bmN0aW9uT2JqZWN0ICAgICAgLSBIYW5kbGUgdG8gYSBmdW5jdGlvbiBvYmplY3QKKyAgICBFcUJhc2VWYSAgICAgICAgICAgIC0gQmFzZSBWQSBmb3IgYSB0aGUgRVEgcmluZworICAgIFNpemVFbmNvZGluZyAgICAgICAgLSBUaGUgZW5jb2RlZCBzaXplIGZvciB0aGUgRVEgZW50cmllcy4gVGhpcyB2YWx1ZSBpcworCQkJZWl0aGVyIENFVl9FUV9TSVpFXzQgb3IgQ0VWX0VRX1NJWkVfMTYKKyAgICBOdW1FbnRyaWVzICAgICAgICAgIC0gQ0VWX0NRX0NOVF8qIHZhbHVlcy4KKyAgICBXYXRlcm1hcmsgICAgICAgICAgIC0gRW5hYmxlcyB3YXRlcm1hcmsgYmFzZWQgY29hbGVzY2luZy4gIFRoaXMgcGFyYW1ldGVyCisJCQltdXN0IGJlIG9mIHRoZSB0eXBlIENFVl9XTUFSS18qIGlmIHdhdGVybWFya3MKKwkJCWFyZSBlbmFibGVkLiAgSWYgd2F0ZXJtYXJrcyB0byB0byBiZSBkaXNhYmxlZAorCQkJdGhpcyB2YWx1ZSBzaG91bGQgYmUtMS4KKyAgICBUaW1lckRlbGF5ICAgICAgICAgIC0gSWYgYSB0aW1lciBkZWxheSBpcyBlbmFibGVkIHRoaXMgdmFsdWUgc2hvdWxkIGJlIHRoZQorCQkJdGltZSBvZiB0aGUgZGVsYXkgaW4gOCBtaWNyb3NlY29uZCB1bml0cy4gIElmCisJCQlkZWxheXMgYXJlIG5vdCB1c2VkIHRoaXMgcGFyYW1ldGVyIHNob3VsZCBiZQorCQkJc2V0IHRvIC0xLgorICAgIHBwRXFPYmplY3QgICAgICAgICAgLSBJbnRlcm5hbCBFUSBIYW5kbGUgcmV0dXJuZWQuCisKKyAgICBSZXR1cm5zIEJFX1NVQ0NFU1MgaWYgc3VjY2Vzc2Z1bGwsLCBvdGhlcndpc2UgYSB1c2VmdWwgZXJyb3IgY29kZQorCWlzIHJldHVybmVkLgorCisgICAgSVJRTCA8IERJU1BBVENIX0xFVkVMCisqLworaW50CitiZV9lcV9jcmVhdGUoc3RydWN0IGJlX2Z1bmN0aW9uX29iamVjdCAqcGZvYiwKKwkJc3RydWN0IHJpbmdfZGVzYyAqcmQsIHUzMiBlcWVfc2l6ZSwgdTMyIG51bV9lbnRyaWVzLAorCQl1MzIgd2F0ZXJtYXJrLAkvKiBDRVZfV01BUktfKiBvciAtMSAqLworCQl1MzIgdGltZXJfZGVsYXksCS8qIGluIDh1cyB1bml0cywgb3IgLTEgKi8KKwkJc3RydWN0IGJlX2VxX29iamVjdCAqZXFfb2JqZWN0KQoreworCWludCBzdGF0dXMgPSBCRV9TVUNDRVNTOworCXUzMiBudW1fZW50cmllc19lbmNvZGluZywgZXFlX3NpemVfZW5jb2RpbmcsIGxlbmd0aDsKKwlzdHJ1Y3QgRldDTURfQ09NTU9OX0VRX0NSRUFURSAqZndjbWQgPSBOVUxMOworCXN0cnVjdCBNQ0NfV1JCX0FNQVAgKndyYiA9IE5VTEw7CisJdTMyIG47CisJdW5zaWduZWQgbG9uZyBpcnFsOworCisJQVNTRVJUKHJkKTsKKwlBU1NFUlQoZXFfb2JqZWN0KTsKKworCXN3aXRjaCAobnVtX2VudHJpZXMpIHsKKwljYXNlIDI1NjoKKwkJbnVtX2VudHJpZXNfZW5jb2RpbmcgPSBDRVZfRVFfQ05UXzI1NjsKKwkJYnJlYWs7CisJY2FzZSA1MTI6CisJCW51bV9lbnRyaWVzX2VuY29kaW5nID0gQ0VWX0VRX0NOVF81MTI7CisJCWJyZWFrOworCWNhc2UgMTAyNDoKKwkJbnVtX2VudHJpZXNfZW5jb2RpbmcgPSBDRVZfRVFfQ05UXzEwMjQ7CisJCWJyZWFrOworCWNhc2UgMjA0ODoKKwkJbnVtX2VudHJpZXNfZW5jb2RpbmcgPSBDRVZfRVFfQ05UXzIwNDg7CisJCWJyZWFrOworCWNhc2UgNDA5NjoKKwkJbnVtX2VudHJpZXNfZW5jb2RpbmcgPSBDRVZfRVFfQ05UXzQwOTY7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUFTU0VSVCgwKTsKKwkJcmV0dXJuIEJFX1NUQVRVU19JTlZBTElEX1BBUkFNRVRFUjsKKwl9CisKKwlzd2l0Y2ggKGVxZV9zaXplKSB7CisJY2FzZSA0OgorCQllcWVfc2l6ZV9lbmNvZGluZyA9IENFVl9FUV9TSVpFXzQ7CisJCWJyZWFrOworCWNhc2UgMTY6CisJCWVxZV9zaXplX2VuY29kaW5nID0gQ0VWX0VRX1NJWkVfMTY7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUFTU0VSVCgwKTsKKwkJcmV0dXJuIEJFX1NUQVRVU19JTlZBTElEX1BBUkFNRVRFUjsKKwl9CisKKwlpZiAoKGVxZV9zaXplID09IDQgJiYgbnVtX2VudHJpZXMgPCAxMDI0KSB8fAorCSAgICAoZXFlX3NpemUgPT0gMTYgJiYgbnVtX2VudHJpZXMgPT0gNDA5NikpIHsKKwkJVFJBQ0UoRExfRVJSLCAiQmFkIEVRIHNpemUuIGVxZV9zaXplOiVkIG51bV9lbnRyaWVzOiVkIiwKKwkJICAgICAgZXFlX3NpemUsIG51bV9lbnRyaWVzKTsKKwkJQVNTRVJUKDApOworCQlyZXR1cm4gQkVfU1RBVFVTX0lOVkFMSURfUEFSQU1FVEVSOworCX0KKworCW1lbXNldChlcV9vYmplY3QsIDAsIHNpemVvZigqZXFfb2JqZWN0KSk7CisKKwlhdG9taWNfc2V0KCZlcV9vYmplY3QtPnJlZl9jb3VudCwgMCk7CisJZXFfb2JqZWN0LT5wYXJlbnRfZnVuY3Rpb24gPSBwZm9iOworCWVxX29iamVjdC0+ZXFfaWQgPSAweEZGRkZGRkZGOworCisJSU5JVF9MSVNUX0hFQUQoJmVxX29iamVjdC0+Y3FfbGlzdF9oZWFkKTsKKworCWxlbmd0aCA9IG51bV9lbnRyaWVzICogZXFlX3NpemU7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcGZvYi0+cG9zdF9sb2NrLCBpcnFsKTsKKworCXdyYiA9IGJlX2Z1bmN0aW9uX3BlZWtfbWNjX3dyYihwZm9iKTsKKwlpZiAoIXdyYikgeworCQlBU1NFUlQod3JiKTsKKwkJVFJBQ0UoRExfRVJSLCAiTm8gZnJlZSBNQ0MgV1JCcyBpbiBjcmVhdGUgRVEuIik7CisJCXN0YXR1cyA9IEJFX1NUQVRVU19OT19NQ0NfV1JCOworCQlnb3RvIEVycm9yOworCX0KKwkvKiBQcmVwYXJlcyBhbiBlbWJlZGRlZCBmd2NtZCwgaW5jbHVkaW5nIHJlcXVlc3QvcmVzcG9uc2Ugc2l6ZXMuICovCisJZndjbWQgPSBCRV9QUkVQQVJFX0VNQkVEREVEX0ZXQ01EKHBmb2IsIHdyYiwgQ09NTU9OX0VRX0NSRUFURSk7CisKKwlmd2NtZC0+cGFyYW1zLnJlcXVlc3QubnVtX3BhZ2VzID0gUEFHRVNfU1BBTk5FRChPRkZTRVRfSU5fUEFHRShyZC0+dmEpLAorCQkJCQkJCQkJbGVuZ3RoKTsKKwluID0gcGZvYi0+cGNpX2Z1bmN0aW9uX251bWJlcjsKKwlBTUFQX1NFVF9CSVRTX1BUUihFUV9DT05URVhULCBGdW5jLCAmZndjbWQtPnBhcmFtcy5yZXF1ZXN0LmNvbnRleHQsIG4pOworCisJQU1BUF9TRVRfQklUU19QVFIoRVFfQ09OVEVYVCwgdmFsaWQsICZmd2NtZC0+cGFyYW1zLnJlcXVlc3QuY29udGV4dCwgMSk7CisKKwlBTUFQX1NFVF9CSVRTX1BUUihFUV9DT05URVhULCBTaXplLAorCQkJJmZ3Y21kLT5wYXJhbXMucmVxdWVzdC5jb250ZXh0LCBlcWVfc2l6ZV9lbmNvZGluZyk7CisKKwluID0gMDsgLyogUHJvdGVjdGlvbiBEb21haW4gaXMgYWx3YXlzIDAgaW4gIExpbnV4ICBkcml2ZXIgKi8KKwlBTUFQX1NFVF9CSVRTX1BUUihFUV9DT05URVhULCBQRCwgJmZ3Y21kLT5wYXJhbXMucmVxdWVzdC5jb250ZXh0LCBuKTsKKworCS8qIExldCB0aGUgY2FsbGVyIEFSTSB0aGUgRVEgd2l0aCB0aGUgZG9vcmJlbGwuICovCisJQU1BUF9TRVRfQklUU19QVFIoRVFfQ09OVEVYVCwgQXJtZWQsICZmd2NtZC0+cGFyYW1zLnJlcXVlc3QuY29udGV4dCwgMCk7CisKKwlBTUFQX1NFVF9CSVRTX1BUUihFUV9DT05URVhULCBDb3VudCwgJmZ3Y21kLT5wYXJhbXMucmVxdWVzdC5jb250ZXh0LAorCQkJCQludW1fZW50cmllc19lbmNvZGluZyk7CisKKwluID0gcGZvYi0+cGNpX2Z1bmN0aW9uX251bWJlciAqIDMyOworCUFNQVBfU0VUX0JJVFNfUFRSKEVRX0NPTlRFWFQsIEV2ZW50VmVjdCwKKwkJCQkmZndjbWQtPnBhcmFtcy5yZXF1ZXN0LmNvbnRleHQsIG4pOworCWlmICh3YXRlcm1hcmsgIT0gLTEpIHsKKwkJQU1BUF9TRVRfQklUU19QVFIoRVFfQ09OVEVYVCwgV01FLAorCQkJCSZmd2NtZC0+cGFyYW1zLnJlcXVlc3QuY29udGV4dCwgMSk7CisJCUFNQVBfU0VUX0JJVFNfUFRSKEVRX0NPTlRFWFQsIFdhdGVybWFyaywKKwkJCQkmZndjbWQtPnBhcmFtcy5yZXF1ZXN0LmNvbnRleHQsIHdhdGVybWFyayk7CisJCUFTU0VSVCh3YXRlcm1hcmsgPD0gQ0VWX1dNQVJLXzI0MCk7CisJfSBlbHNlCisJCUFNQVBfU0VUX0JJVFNfUFRSKEVRX0NPTlRFWFQsIFdNRSwKKwkJCQkJJmZ3Y21kLT5wYXJhbXMucmVxdWVzdC5jb250ZXh0LCAwKTsKKwlpZiAodGltZXJfZGVsYXkgIT0gLTEpIHsKKwkJQU1BUF9TRVRfQklUU19QVFIoRVFfQ09OVEVYVCwgVE1SLAorCQkJCQkmZndjbWQtPnBhcmFtcy5yZXF1ZXN0LmNvbnRleHQsIDEpOworCisJCUFTU0VSVCh0aW1lcl9kZWxheSA8PSAyNTApOwkvKiBtYXggdmFsdWUgYWNjb3JkaW5nIHRvIEVBUyAqLworCQl0aW1lcl9kZWxheSA9IG1pbih0aW1lcl9kZWxheSwgKHUzMikyNTApOworCisJCUFNQVBfU0VUX0JJVFNfUFRSKEVRX0NPTlRFWFQsIERlbGF5LAorCQkJCSZmd2NtZC0+cGFyYW1zLnJlcXVlc3QuY29udGV4dCwgdGltZXJfZGVsYXkpOworCX0gZWxzZSB7CisJCUFNQVBfU0VUX0JJVFNfUFRSKEVRX0NPTlRFWFQsIFRNUiwKKwkJCQkmZndjbWQtPnBhcmFtcy5yZXF1ZXN0LmNvbnRleHQsIDApOworCX0KKwkvKiBDcmVhdGUgYSBwYWdlIGxpc3QgZm9yIHRoZSBGV0NNRC4gKi8KKwliZV9yZF90b19wYV9saXN0KHJkLCBmd2NtZC0+cGFyYW1zLnJlcXVlc3QucGFnZXMsCisJCQkgIEFSUkFZX1NJWkUoZndjbWQtPnBhcmFtcy5yZXF1ZXN0LnBhZ2VzKSk7CisKKwlzdGF0dXMgPSBiZV9mdW5jdGlvbl9wb3N0X21jY193cmIocGZvYiwgd3JiLCBOVUxMLCBOVUxMLCBOVUxMLAorCQkJCQlOVUxMLCBOVUxMLCBmd2NtZCwgTlVMTCk7CisJaWYgKHN0YXR1cyAhPSBCRV9TVUNDRVNTKSB7CisJCVRSQUNFKERMX0VSUiwgIk1DQyB0byBjcmVhdGUgRVEgZmFpbGVkLiIpOworCQlnb3RvIEVycm9yOworCX0KKwkvKiBHZXQgdGhlIEVRIGlkLiAgVGhlIE1QVSBhbGxvY2F0ZXMgdGhlIElEcy4gKi8KKwllcV9vYmplY3QtPmVxX2lkID0gZndjbWQtPnBhcmFtcy5yZXNwb25zZS5lcV9pZDsKKworRXJyb3I6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGZvYi0+cG9zdF9sb2NrLCBpcnFsKTsKKworCWlmIChwZm9iLT5wZW5kX3F1ZXVlX2RyaXZpbmcgJiYgcGZvYi0+bWNjKSB7CisJCXBmb2ItPnBlbmRfcXVldWVfZHJpdmluZyA9IDA7CisJCWJlX2RyaXZlX21jY193cmJfcXVldWUocGZvYi0+bWNjKTsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAgICBEZWZlcmVuY2VzIHRoZSBnaXZlbiBvYmplY3QuIE9uY2UgdGhlIG9iamVjdCdzIHJlZmVyZW5jZSBjb3VudCBkcm9wcyB0bworICAgIHplcm8sIHRoZSBvYmplY3QgaXMgZGVzdHJveWVkIGFuZCBhbGwgcmVzb3VyY2VzIHRoYXQgYXJlIGhlbGQgYnkgdGhpcworICAgIG9iamVjdCBhcmUgcmVsZWFzZWQuICBUaGUgb24tY2hpcCBjb250ZXh0IGlzIGFsc28gZGVzdHJveWVkIGFsb25nIHdpdGgKKyAgICB0aGUgcXVldWUgSUQsIGFuZCBhbnkgbWFwcGluZ3MgbWFkZSBpbnRvIHRoZSBVVC4KKworICAgIGVxX29iamVjdCAgICAgICAgICAgIC0gRVEgaGFuZGxlIHJldHVybmVkIGZyb20gZXFfb2JqZWN0X2NyZWF0ZS4KKworICAgIFJldHVybnMgQkVfU1VDQ0VTUyBpZiBzdWNjZXNzZnVsbCwgb3RoZXJ3aXNlIGEgdXNlZnVsIGVycm9yIGNvZGUKKwlpcyByZXR1cm5lZC4KKworICAgIElSUUw6IElSUUwgPCBESVNQQVRDSF9MRVZFTAorKi8KK2ludCBiZV9lcV9kZXN0cm95KHN0cnVjdCBiZV9lcV9vYmplY3QgKmVxX29iamVjdCkKK3sKKwlpbnQgc3RhdHVzID0gMDsKKworCUFTU0VSVChhdG9taWNfcmVhZCgmZXFfb2JqZWN0LT5yZWZfY291bnQpID09IDApOworCS8qIG5vIENRcyBzaG91bGQgcmVmZXJlbmNlIHRoaXMgRVEgbm93ICovCisJQVNTRVJUKGxpc3RfZW1wdHkoJmVxX29iamVjdC0+Y3FfbGlzdF9oZWFkKSk7CisKKwkvKiBTZW5kIGZ3Y21kIHRvIGRlc3Ryb3kgdGhlIEVRLiAqLworCXN0YXR1cyA9IGJlX2Z1bmN0aW9uX3JpbmdfZGVzdHJveShlcV9vYmplY3QtPnBhcmVudF9mdW5jdGlvbiwKKwkJCSAgICAgZXFfb2JqZWN0LT5lcV9pZCwgRldDTURfUklOR19UWVBFX0VRLAorCQkJCQlOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKTsKKwlBU1NFUlQoc3RhdHVzID09IDApOworCisJcmV0dXJuIEJFX1NVQ0NFU1M7Cit9CisvKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEZ1bmN0aW9uOiBiZV9lcV9tb2RpZnlfZGVsYXkKKyAqICAgQ2hhbmdlcyB0aGUgRVEgZGVsYXkgZm9yIGEgZ3JvdXAgb2YgRVFzLgorICogbnVtX2VxICAgICAgICAgICAgIC0gVGhlIG51bWJlciBvZiBFUXMgaW4gdGhlIGVxX2FycmF5IHRvIGFkanVzdC4KKyAqIAkJCVRoaXMgYWxzbyBpcyB0aGUgbnVtYmVyIG9mIGRlbGF5IHZhbHVlcyBpbgorICogCQkJdGhlIGVxX2RlbGF5X2FycmF5LgorICogZXFfYXJyYXkgICAgICAgICAgIC0gQXJyYXkgb2Ygc3RydWN0IGJlX2VxX29iamVjdCBwb2ludGVycyB0byBhZGp1c3QuCisgKiBlcV9kZWxheV9hcnJheSAgICAgLSBBcnJheSBvZiAibnVtX2VxIiB0aW1lciBkZWxheXMgaW4gdW5pdHMKKyAqIAkJCW9mIG1pY3Jvc2Vjb25kcy4gVGhlIGJlX2VxX3F1ZXJ5X2RlbGF5X3JhbmdlCisgKiAJCQlmd2NtZCByZXR1cm5zIHRoZSByZXNvbHV0aW9uIGFuZCByYW5nZSBvZgorICogICAgICAgICAgICAgICAgICAgICAgbGVnYWwgRVEgZGVsYXlzLgorICogY2IgICAgICAgICAgIC0KKyAqIGNiX2NvbnRleHQgICAtCisgKiBxX2N0eHQgICAgICAgICAgICAgLSBPcHRpb25hbC4gUG9pbnRlciB0byBhIHByZXZpb3VzbHkgYWxsb2NhdGVkCisgKiAJCQlzdHJ1Y3QuIElmIHRoZSBNQ0MgV1JCIHJpbmcgaXMgZnVsbCwgdGhpcworICogCQkJc3RydWN0dXJlIGlzIHVzZWQgdG8gcXVldWUgdGhlIG9wZXJhdGlvbi4gSXQKKyAqICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgcG9zdGVkIHRvIHRoZSBNQ0MgcmluZyB3aGVuIHNwYWNlCisgKiAgICAgICAgICAgICAgICAgICAgICBiZWNvbWVzIGF2YWlsYWJsZS4gQWxsIHF1ZXVlZCBjb21tYW5kcyB3aWxsCisgKiAgICAgICAgICAgICAgICAgICAgICBiZSBwb3N0ZWQgdG8gdGhlIHJpbmcgaW4gdGhlIG9yZGVyIHRoZXkgYXJlCisgKiAgICAgICAgICAgICAgICAgICAgICByZWNlaXZlZC4gSXQgaXMgYWx3YXlzIHZhbGlkIHRvIHBhc3MgYSBwb2ludGVyIHRvCisgKiAgICAgICAgICAgICAgICAgICAgICBhIGdlbmVyaWMgYmVfZ2VuZXJpY19xX2NudHh0LiBIb3dldmVyLAorICogICAgICAgICAgICAgICAgICAgICAgdGhlIHNwZWNpZmljIGNvbnRleHQgc3RydWN0cworICogICAgICAgICAgICAgICAgICAgICAgYXJlIGdlbmVyYWxseSBzbWFsbGVyIHRoYW4gdGhlIGdlbmVyaWMgc3RydWN0LgorICogcmV0dXJuIHBlbmRfc3RhdHVzIC0gQkVfU1VDQ0VTUyAoMCkgb24gc3VjY2Vzcy4KKyAqIAkJCUJFX1BFTkRJTkcgKHBvc3RpdmUgdmFsdWUpIGlmIHRoZSBGV0NNRAorICogICAgICAgICAgICAgICAgICAgICAgY29tcGxldGlvbiBpcyBwZW5kaW5nLiBOZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworaW50CitiZV9lcV9tb2RpZnlfZGVsYXkoc3RydWN0IGJlX2Z1bmN0aW9uX29iamVjdCAqcGZvYiwKKwkJICAgdTMyIG51bV9lcSwgc3RydWN0IGJlX2VxX29iamVjdCAqKmVxX2FycmF5LAorCQkgICB1MzIgKmVxX2RlbGF5X2FycmF5LCBtY2Nfd3JiX2NxZV9jYWxsYmFjayBjYiwKKwkJICAgdm9pZCAqY2JfY29udGV4dCwgc3RydWN0IGJlX2VxX21vZGlmeV9kZWxheV9xX2N0eHQgKnFfY3R4dCkKK3sKKwlzdHJ1Y3QgRldDTURfQ09NTU9OX01PRElGWV9FUV9ERUxBWSAqZndjbWQgPSBOVUxMOworCXN0cnVjdCBNQ0NfV1JCX0FNQVAgKndyYiA9IE5VTEw7CisJaW50IHN0YXR1cyA9IDA7CisJc3RydWN0IGJlX2dlbmVyaWNfcV9jdHh0ICpnZW5fY3R4dCA9IE5VTEw7CisJdTMyIGk7CisJdW5zaWduZWQgbG9uZyBpcnFsOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBmb2ItPnBvc3RfbG9jaywgaXJxbCk7CisKKwl3cmIgPSBiZV9mdW5jdGlvbl9wZWVrX21jY193cmIocGZvYik7CisJaWYgKCF3cmIpIHsKKwkJaWYgKHFfY3R4dCAmJiBjYikgeworCQkJd3JiID0gKHN0cnVjdCBNQ0NfV1JCX0FNQVAgKikgJnFfY3R4dC0+d3JiX2hlYWRlcjsKKwkJCWdlbl9jdHh0ID0gKHN0cnVjdCBiZV9nZW5lcmljX3FfY3R4dCAqKSBxX2N0eHQ7CisJCQlnZW5fY3R4dC0+Y29udGV4dC5ieXRlcyA9IHNpemVvZigqcV9jdHh0KTsKKwkJfSBlbHNlIHsKKwkJCXN0YXR1cyA9IEJFX1NUQVRVU19OT19NQ0NfV1JCOworCQkJZ290byBFcnJvcjsKKwkJfQorCX0KKwkvKiBQcmVwYXJlcyBhbiBlbWJlZGRlZCBmd2NtZCwgaW5jbHVkaW5nIHJlcXVlc3QvcmVzcG9uc2Ugc2l6ZXMuICovCisJZndjbWQgPSBCRV9QUkVQQVJFX0VNQkVEREVEX0ZXQ01EKHBmb2IsIHdyYiwgQ09NTU9OX01PRElGWV9FUV9ERUxBWSk7CisKKwlBU1NFUlQobnVtX2VxID4gMCk7CisJQVNTRVJUKG51bV9lcSA8PSBBUlJBWV9TSVpFKGZ3Y21kLT5wYXJhbXMucmVxdWVzdC5kZWxheSkpOworCWZ3Y21kLT5wYXJhbXMucmVxdWVzdC5udW1fZXEgPSBudW1fZXE7CisJZm9yIChpID0gMDsgaSA8IG51bV9lcTsgaSsrKSB7CisJCWZ3Y21kLT5wYXJhbXMucmVxdWVzdC5kZWxheVtpXS5lcV9pZCA9IGVxX2FycmF5W2ldLT5lcV9pZDsKKwkJZndjbWQtPnBhcmFtcy5yZXF1ZXN0LmRlbGF5W2ldLmRlbGF5X2luX21pY3Jvc2Vjb25kcyA9CisJCSAgICBlcV9kZWxheV9hcnJheVtpXTsKKwl9CisKKwkvKiBQb3N0IHRoZSBmL3cgY29tbWFuZCAqLworCXN0YXR1cyA9IGJlX2Z1bmN0aW9uX3Bvc3RfbWNjX3dyYihwZm9iLCB3cmIsIGdlbl9jdHh0LAorCQkJY2IsIGNiX2NvbnRleHQsIE5VTEwsIE5VTEwsIGZ3Y21kLCBOVUxMKTsKKworRXJyb3I6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGZvYi0+cG9zdF9sb2NrLCBpcnFsKTsKKworCWlmIChwZm9iLT5wZW5kX3F1ZXVlX2RyaXZpbmcgJiYgcGZvYi0+bWNjKSB7CisJCXBmb2ItPnBlbmRfcXVldWVfZHJpdmluZyA9IDA7CisJCWJlX2RyaXZlX21jY193cmJfcXVldWUocGZvYi0+bWNjKTsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JlbmV0L2V0aC5jIGIvZHJpdmVycy9zdGFnaW5nL2JlbmV0L2V0aC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2NDFiNjIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvZXRoLmMKQEAgLTAsMCArMSwxMjczIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA1IC0gMjAwOCBTZXJ2ZXJFbmdpbmVzCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBUaGUgZnVsbCBHTlUgR2VuZXJhbAorICogUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlIGZpbGUgY2FsbGVkIENPUFlJTkcuCisgKgorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqIGxpbnV4LWRyaXZlcnNAc2VydmVyZW5naW5lcy5jb20KKyAqCisgKiBTZXJ2ZXJFbmdpbmVzCisgKiAyMDkgTi4gRmFpciBPYWtzIEF2ZQorICogU3Vubnl2YWxlLCBDQSA5NDA4NQorICovCisjaW5jbHVkZSA8bGludXgvaWZfZXRoZXIuaD4KKyNpbmNsdWRlICJod2xpYi5oIgorI2luY2x1ZGUgImJlc3RhdHVzLmgiCisKKy8qCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRnVuY3Rpb246IGJlX2V0aF9zcV9jcmVhdGVfZXgKKyAqICAgQ3JlYXRlcyBhbiBldGhlcm5ldCBzZW5kIHJpbmcgLSBleHRlbmRlZCB2ZXJzaW9uIHdpdGgKKyAqICAgYWRkaXRpb25hbCBwYXJhbWV0ZXJzLgorICogcGZvYiAtCisgKiByZCAgICAgICAgICAgICAtIHJpbmcgYWRkcmVzcworICogbGVuZ3RoX2luX2J5dGVzIC0KKyAqIHR5cGUgICAgICAgICAgICAtIFRoZSB0eXBlIG9mIHJpbmcgdG8gY3JlYXRlLgorICogdWxwICAgICAgICAgICAgIC0gVGhlIHJlcXVlc3RlZCBVTFAgbnVtYmVyIGZvciB0aGUgcmluZy4KKyAqIAkJICAgICBUaGlzIHNob3VsZCBiZSB6ZXJvIGJhc2VkLCBpLmUuIDAsMSwyLiBUaGlzIG11c3QKKyAqIAkJICAgICBiZSB2YWxpZCBOSUMgVUxQIGJhc2VkIG9uIHRoZSBmaXJtd2FyZSBjb25maWcuCisgKiAgICAgICAgICAgICAgICAgICBBbGwgZG9vcmJlbGxzIGZvciB0aGlzIHJpbmcgbXVzdCBiZSBzZW50IHRvCisgKiAgICAgICAgICAgICAgICAgICB0aGlzIFVMUC4gVGhlIGZpcnN0IG5ldHdvcmsgcmluZyBhbGxvY2F0ZWQgZm9yCisgKiAgICAgICAgICAgICAgICAgICBlYWNoIFVMUCBhcmUgaGlnaGVyIHBlcmZvcm1hbmNlIHRoYW4gc3Vic2VxdWVudCByaW5ncy4KKyAqIGNxX29iamVjdCAgICAgICAtIGNxIG9iamVjdCBmb3IgY29tcGxldGlvbnMKKyAqIGV4X3BhcmFtZXRlcnMgICAtIEFkZGl0aW9uYWwgcGFyYW1ldGVycyAodGhhdCBtYXkgaW5jcmVhc2UgaW4KKyAqIAkJICAgICBmdXR1cmUgcmV2aXNpb25zKS4gVGhlc2UgcGFyYW1ldGVycyBhcmUgb25seSB1c2VkCisgKiAJCSAgICAgZm9yIGNlcnRhaW4gcmluZyB0eXBlcyAtLSBzZWUKKyAqICAgICAgICAgICAgICAgICAgIHN0cnVjdCBiZV9ldGhfc3FfcGFyYW1ldGVycyBmb3IgZGV0YWlscy4KKyAqIGV0aF9zcSAgICAgICAgICAtCisgKiByZXR1cm4gc3RhdHVzICAgLSBCRV9TVUNDRVNTICgwKSBvbiBzdWNjZXNzLiBOZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCitpbnQKK2JlX2V0aF9zcV9jcmVhdGVfZXgoc3RydWN0IGJlX2Z1bmN0aW9uX29iamVjdCAqcGZvYiwgc3RydWN0IHJpbmdfZGVzYyAqcmQsCisJCXUzMiBsZW5ndGgsIHUzMiB0eXBlLCB1MzIgdWxwLCBzdHJ1Y3QgYmVfY3Ffb2JqZWN0ICpjcV9vYmplY3QsCisJCXN0cnVjdCBiZV9ldGhfc3FfcGFyYW1ldGVycyAqZXhfcGFyYW1ldGVycywKKwkJc3RydWN0IGJlX2V0aHNxX29iamVjdCAqZXRoX3NxKQoreworCXN0cnVjdCBGV0NNRF9DT01NT05fRVRIX1RYX0NSRUFURSAqZndjbWQgPSBOVUxMOworCXN0cnVjdCBNQ0NfV1JCX0FNQVAgKndyYiA9IE5VTEw7CisJaW50IHN0YXR1cyA9IDA7CisJdTMyIG47CisJdW5zaWduZWQgbG9uZyBpcnFsOworCisJQVNTRVJUKHJkKTsKKwlBU1NFUlQoZXRoX3NxKTsKKwlBU1NFUlQoZXhfcGFyYW1ldGVycyk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcGZvYi0+cG9zdF9sb2NrLCBpcnFsKTsKKworCW1lbXNldChldGhfc3EsIDAsIHNpemVvZigqZXRoX3NxKSk7CisKKwlldGhfc3EtPnBhcmVudF9mdW5jdGlvbiA9IHBmb2I7CisJZXRoX3NxLT5iaWQgPSAweEZGRkZGRkZGOworCWV0aF9zcS0+Y3Ffb2JqZWN0ID0gY3Ffb2JqZWN0OworCisJLyogVHJhbnNsYXRlIGh3bGliIGludGVyZmFjZSB0byBhcm0gaW50ZXJmYWNlLiAqLworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgQkVfRVRIX1RYX1JJTkdfVFlQRV9GT1JXQVJESU5HOgorCQl0eXBlID0gRVRIX1RYX1JJTkdfVFlQRV9GT1JXQVJESU5HOworCQlicmVhazsKKwljYXNlIEJFX0VUSF9UWF9SSU5HX1RZUEVfU1RBTkRBUkQ6CisJCXR5cGUgPSBFVEhfVFhfUklOR19UWVBFX1NUQU5EQVJEOworCQlicmVhazsKKwljYXNlIEJFX0VUSF9UWF9SSU5HX1RZUEVfQk9VTkQ6CisJCUFTU0VSVChleF9wYXJhbWV0ZXJzLT5wb3J0IDwgMik7CisJCXR5cGUgPSBFVEhfVFhfUklOR19UWVBFX0JPVU5EOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlUUkFDRShETF9FUlIsICJJbnZhbGlkIGV0aCB0eCByaW5nIHR5cGU6JWQiLCB0eXBlKTsKKwkJcmV0dXJuIEJFX05PVF9PSzsKKwkJYnJlYWs7CisJfQorCisJd3JiID0gYmVfZnVuY3Rpb25fcGVla19tY2Nfd3JiKHBmb2IpOworCWlmICghd3JiKSB7CisJCUFTU0VSVCh3cmIpOworCQlUUkFDRShETF9FUlIsICJObyBmcmVlIE1DQyBXUkJzIGluIGNyZWF0ZSBFUS4iKTsKKwkJc3RhdHVzID0gQkVfU1RBVFVTX05PX01DQ19XUkI7CisJCWdvdG8gRXJyb3I7CisJfQorCS8qIE5JQyBtdXN0IGJlIHN1cHBvcnRlZCBieSB0aGUgY3VycmVudCBjb25maWcuICovCisJQVNTRVJUKHBmb2ItPmZ3X2NvbmZpZy5uaWNfdWxwX21hc2spOworCisJLyoKKwkgKiBUaGUgdWxwIHBhcmFtZXRlciBtdXN0IHNlbGVjdCBhIHZhbGlkIE5JQyBVTFAKKwkgKiBmb3IgdGhlIGN1cnJlbnQgY29uZmlnLgorCSAqLworCUFTU0VSVCgoMSA8PCB1bHApICYgcGZvYi0+ZndfY29uZmlnLm5pY191bHBfbWFzayk7CisKKwkvKiBQcmVwYXJlcyBhbiBlbWJlZGRlZCBmd2NtZCwgaW5jbHVkaW5nIHJlcXVlc3QvcmVzcG9uc2Ugc2l6ZXMuICovCisJZndjbWQgPSBCRV9QUkVQQVJFX0VNQkVEREVEX0ZXQ01EKHBmb2IsIHdyYiwgQ09NTU9OX0VUSF9UWF9DUkVBVEUpOworCWZ3Y21kLT5oZWFkZXIucmVxdWVzdC5wb3J0X251bWJlciA9IGV4X3BhcmFtZXRlcnMtPnBvcnQ7CisKKwlBTUFQX1NFVF9CSVRTX1BUUihFVFhfQ09OVEVYVCwgcGRfaWQsCisJCQkJJmZ3Y21kLT5wYXJhbXMucmVxdWVzdC5jb250ZXh0LCAwKTsKKworCW4gPSBiZV9yaW5nX2xlbmd0aF90b19lbmNvZGluZyhsZW5ndGgsIHNpemVvZihzdHJ1Y3QgRVRIX1dSQl9BTUFQKSk7CisJQU1BUF9TRVRfQklUU19QVFIoRVRYX0NPTlRFWFQsIHR4X3Jpbmdfc2l6ZSwKKwkJCQkJJmZ3Y21kLT5wYXJhbXMucmVxdWVzdC5jb250ZXh0LCBuKTsKKworCUFNQVBfU0VUX0JJVFNfUFRSKEVUWF9DT05URVhULCBjcV9pZF9zZW5kLAorCQkJJmZ3Y21kLT5wYXJhbXMucmVxdWVzdC5jb250ZXh0LCBjcV9vYmplY3QtPmNxX2lkKTsKKworCW4gPSBwZm9iLT5wY2lfZnVuY3Rpb25fbnVtYmVyOworCUFNQVBfU0VUX0JJVFNfUFRSKEVUWF9DT05URVhULCBmdW5jLCAmZndjbWQtPnBhcmFtcy5yZXF1ZXN0LmNvbnRleHQsIG4pOworCisJZndjbWQtPnBhcmFtcy5yZXF1ZXN0LnR5cGUgPSB0eXBlOworCWZ3Y21kLT5wYXJhbXMucmVxdWVzdC51bHBfbnVtICA9ICgxIDw8IHVscCk7CisJZndjbWQtPnBhcmFtcy5yZXF1ZXN0Lm51bV9wYWdlcyA9IERJVl9ST1VORF9VUChsZW5ndGgsIFBBR0VfU0laRSk7CisJQVNTRVJUKFBBR0VTX1NQQU5ORUQocmQtPnZhLCByZC0+bGVuZ3RoKSA+PQorCQkJCWZ3Y21kLT5wYXJhbXMucmVxdWVzdC5udW1fcGFnZXMpOworCisJLyogQ3JlYXRlIGEgcGFnZSBsaXN0IGZvciB0aGUgRldDTUQuICovCisJYmVfcmRfdG9fcGFfbGlzdChyZCwgZndjbWQtPnBhcmFtcy5yZXF1ZXN0LnBhZ2VzLAorCQkJICBBUlJBWV9TSVpFKGZ3Y21kLT5wYXJhbXMucmVxdWVzdC5wYWdlcykpOworCisJc3RhdHVzID0gYmVfZnVuY3Rpb25fcG9zdF9tY2Nfd3JiKHBmb2IsIHdyYiwgTlVMTCwgTlVMTCwgTlVMTCwKKwkJCQkJTlVMTCwgTlVMTCwgZndjbWQsIE5VTEwpOworCWlmIChzdGF0dXMgIT0gQkVfU1VDQ0VTUykgeworCQlUUkFDRShETF9FUlIsICJNQ0MgdG8gY3JlYXRlIGV0eCBxdWV1ZSBmYWlsZWQuIik7CisJCWdvdG8gRXJyb3I7CisJfQorCS8qIHNhdmUgdGhlIGJ1dGxlciBJRCAqLworCWV0aF9zcS0+YmlkID0gZndjbWQtPnBhcmFtcy5yZXNwb25zZS5jaWQ7CisKKwkvKiBhZGQgYSByZWZlcmVuY2UgdG8gdGhlIGNvcnJlc3BvbmRpbmcgQ1EgKi8KKwlhdG9taWNfaW5jKCZjcV9vYmplY3QtPnJlZl9jb3VudCk7CisKK0Vycm9yOgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBmb2ItPnBvc3RfbG9jaywgaXJxbCk7CisKKwlpZiAocGZvYi0+cGVuZF9xdWV1ZV9kcml2aW5nICYmIHBmb2ItPm1jYykgeworCQlwZm9iLT5wZW5kX3F1ZXVlX2RyaXZpbmcgPSAwOworCQliZV9kcml2ZV9tY2Nfd3JiX3F1ZXVlKHBmb2ItPm1jYyk7CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKKworLyoKKyAgICBUaGlzIHJvdXRpbmUgZGVzdHJveXMgYW4gZXRoZXJuZXQgc2VuZCBxdWV1ZQorCisgICAgRXRoU3EgLSBFdGhTcSBIYW5kbGUgcmV0dXJuZWQgZnJvbSBFdGhTcUNyZWF0ZQorCisgICAgVGhpcyBmdW5jdGlvbiBhbHdheXMgcmV0dXJuIEJFX1NVQ0NFU1MuCisKKyAgICBUaGlzIGZ1bmN0aW9uIGZyZWVzIG1lbW9yeSBhbGxvY2F0ZWQgYnkgRXRoU3FDcmVhdGUgZm9yIHRoZSBFdGhTcSBPYmplY3QuCisKKyovCitpbnQgYmVfZXRoX3NxX2Rlc3Ryb3koc3RydWN0IGJlX2V0aHNxX29iamVjdCAqZXRoX3NxKQoreworCWludCBzdGF0dXMgPSAwOworCisJLyogU2VuZCBmd2NtZCB0byBkZXN0cm95IHRoZSBxdWV1ZS4gKi8KKwlzdGF0dXMgPSBiZV9mdW5jdGlvbl9yaW5nX2Rlc3Ryb3koZXRoX3NxLT5wYXJlbnRfZnVuY3Rpb24sIGV0aF9zcS0+YmlkLAorCQkgICAgIEZXQ01EX1JJTkdfVFlQRV9FVEhfVFgsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpOworCUFTU0VSVChzdGF0dXMgPT0gMCk7CisKKwkvKiBEZXJlZmVuY2UgYW55IGFzc29jaWF0ZWQgQ1FzLiAqLworCWF0b21pY19kZWMoJmV0aF9zcS0+Y3Ffb2JqZWN0LT5yZWZfY291bnQpOworCXJldHVybiBzdGF0dXM7Cit9CisvKgorICAgIFRoaXMgcm91dGluZSBhdHRlbXB0cyB0byBzZXQgdGhlIHRyYW5zbWl0IGZsb3cgY29udHJvbCBwYXJhbWV0ZXJzLgorCisgICAgRnVuY3Rpb25PYmplY3QgICAgICAtIEhhbmRsZSB0byBhIGZ1bmN0aW9uIG9iamVjdAorCisgICAgdHhmY19lbmFibGUgICAgICAgICAtIHRyYW5zbWl0IGZsb3cgY29udHJvbCBlbmFibGUgLSB0cnVlIGZvcgorCQkJICBlbmFibGUsIGZhbHNlIGZvciBkaXNhYmxlCisKKyAgICByeGZjX2VuYWJsZSAgICAgICAgIC0gcmVjZWl2ZSBmbG93IGNvbnRyb2wgZW5hYmxlIC0gdHJ1ZSBmb3IKKwkJCQllbmFibGUsIGZhbHNlIGZvciBkaXNhYmxlCisKKyAgICBSZXR1cm5zIEJFX1NVQ0NFU1MgaWYgc3VjY2Vzc2Z1bGwsIG90aGVyd2lzZSBhIHVzZWZ1bCBpbnQgZXJyb3IKKyAgICBjb2RlIGlzIHJldHVybmVkLgorCisgICAgSVJRTDogPCBESVNQQVRDSF9MRVZFTAorCisgICAgVGhpcyBmdW5jdGlvbiBhbHdheXMgZmFpbHMgaW4gbm9uLXByaXZpbGVnZWQgbWFjaGluZSBjb250ZXh0LgorKi8KK2ludAorYmVfZXRoX3NldF9mbG93X2NvbnRyb2woc3RydWN0IGJlX2Z1bmN0aW9uX29iamVjdCAqcGZvYiwKKwkJCWJvb2wgdHhmY19lbmFibGUsIGJvb2wgcnhmY19lbmFibGUpCit7CisJc3RydWN0IEZXQ01EX0NPTU1PTl9TRVRfRkxPV19DT05UUk9MICpmd2NtZCA9IE5VTEw7CisJc3RydWN0IE1DQ19XUkJfQU1BUCAqd3JiID0gTlVMTDsKKwlpbnQgc3RhdHVzID0gMDsKKwl1bnNpZ25lZCBsb25nIGlycWw7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcGZvYi0+cG9zdF9sb2NrLCBpcnFsKTsKKworCXdyYiA9IGJlX2Z1bmN0aW9uX3BlZWtfbWNjX3dyYihwZm9iKTsKKwlpZiAoIXdyYikgeworCQlUUkFDRShETF9FUlIsICJNQ0Mgd3JiIHBlZWsgZmFpbGVkLiIpOworCQlzdGF0dXMgPSBCRV9TVEFUVVNfTk9fTUNDX1dSQjsKKwkJZ290byBlcnJvcjsKKwl9CisJLyogUHJlcGFyZXMgYW4gZW1iZWRkZWQgZndjbWQsIGluY2x1ZGluZyByZXF1ZXN0L3Jlc3BvbnNlIHNpemVzLiAqLworCWZ3Y21kID0gQkVfUFJFUEFSRV9FTUJFRERFRF9GV0NNRChwZm9iLCB3cmIsIENPTU1PTl9TRVRfRkxPV19DT05UUk9MKTsKKworCWZ3Y21kLT5wYXJhbXMucmVxdWVzdC5yeF9mbG93X2NvbnRyb2wgPSByeGZjX2VuYWJsZTsKKwlmd2NtZC0+cGFyYW1zLnJlcXVlc3QudHhfZmxvd19jb250cm9sID0gdHhmY19lbmFibGU7CisKKwkvKiBQb3N0IHRoZSBmL3cgY29tbWFuZCAqLworCXN0YXR1cyA9IGJlX2Z1bmN0aW9uX3Bvc3RfbWNjX3dyYihwZm9iLCB3cmIsIE5VTEwsIE5VTEwsIE5VTEwsCisJCQkJCU5VTEwsIE5VTEwsIGZ3Y21kLCBOVUxMKTsKKworCWlmIChzdGF0dXMgIT0gMCkgeworCQlUUkFDRShETF9FUlIsICJzZXQgZmxvdyBjb250cm9sIGZ3Y21kIGZhaWxlZC4iKTsKKwkJZ290byBlcnJvcjsKKwl9CisKK2Vycm9yOgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBmb2ItPnBvc3RfbG9jaywgaXJxbCk7CisKKwlpZiAocGZvYi0+cGVuZF9xdWV1ZV9kcml2aW5nICYmIHBmb2ItPm1jYykgeworCQlwZm9iLT5wZW5kX3F1ZXVlX2RyaXZpbmcgPSAwOworCQliZV9kcml2ZV9tY2Nfd3JiX3F1ZXVlKHBmb2ItPm1jYyk7CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgICAgVGhpcyByb3V0aW5lIGF0dGVtcHRzIHRvIGdldCB0aGUgdHJhbnNtaXQgZmxvdyBjb250cm9sIHBhcmFtZXRlcnMuCisKKyAgICBwZm9iICAgICAgLSBIYW5kbGUgdG8gYSBmdW5jdGlvbiBvYmplY3QKKworICAgIHR4ZmNfZW5hYmxlICAgICAgICAgLSB0cmFuc21pdCBmbG93IGNvbnRyb2wgZW5hYmxlIC0gdHJ1ZSBmb3IKKwkJCWVuYWJsZSwgZmFsc2UgZm9yIGRpc2FibGUKKworICAgIHJ4ZmNfZW5hYmxlICAgICAgICAgLSByZWNlaXZlIGZsb3cgY29udHJvbCBlbmFibGUgLSB0cnVlIGZvciBlbmFibGUsCisJCQlmYWxzZSBmb3IgZGlzYWJsZQorCisgICAgUmV0dXJucyBCRV9TVUNDRVNTIGlmIHN1Y2Nlc3NmdWxsLCBvdGhlcndpc2UgYSB1c2VmdWwgaW50IGVycm9yIGNvZGUKKwkJCWlzIHJldHVybmVkLgorCisgICAgSVJRTDogPCBESVNQQVRDSF9MRVZFTAorCisgICAgVGhpcyBmdW5jdGlvbiBhbHdheXMgZmFpbHMgaW4gbm9uLXByaXZpbGVnZWQgbWFjaGluZSBjb250ZXh0LgorKi8KK2ludAorYmVfZXRoX2dldF9mbG93X2NvbnRyb2woc3RydWN0IGJlX2Z1bmN0aW9uX29iamVjdCAqcGZvYiwKKwkJCWJvb2wgKnR4ZmNfZW5hYmxlLCBib29sICpyeGZjX2VuYWJsZSkKK3sKKwlzdHJ1Y3QgRldDTURfQ09NTU9OX0dFVF9GTE9XX0NPTlRST0wgKmZ3Y21kID0gTlVMTDsKKwlzdHJ1Y3QgTUNDX1dSQl9BTUFQICp3cmIgPSBOVUxMOworCWludCBzdGF0dXMgPSAwOworCXVuc2lnbmVkIGxvbmcgaXJxbDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwZm9iLT5wb3N0X2xvY2ssIGlycWwpOworCisJd3JiID0gYmVfZnVuY3Rpb25fcGVla19tY2Nfd3JiKHBmb2IpOworCWlmICghd3JiKSB7CisJCVRSQUNFKERMX0VSUiwgIk1DQyB3cmIgcGVlayBmYWlsZWQuIik7CisJCXN0YXR1cyA9IEJFX1NUQVRVU19OT19NQ0NfV1JCOworCQlnb3RvIGVycm9yOworCX0KKwkvKiBQcmVwYXJlcyBhbiBlbWJlZGRlZCBmd2NtZCwgaW5jbHVkaW5nIHJlcXVlc3QvcmVzcG9uc2Ugc2l6ZXMuICovCisJZndjbWQgPSBCRV9QUkVQQVJFX0VNQkVEREVEX0ZXQ01EKHBmb2IsIHdyYiwgQ09NTU9OX0dFVF9GTE9XX0NPTlRST0wpOworCisJLyogUG9zdCB0aGUgZi93IGNvbW1hbmQgKi8KKwlzdGF0dXMgPSBiZV9mdW5jdGlvbl9wb3N0X21jY193cmIocGZvYiwgd3JiLCBOVUxMLCBOVUxMLCBOVUxMLAorCQkJCQkJTlVMTCwgTlVMTCwgZndjbWQsIE5VTEwpOworCisJaWYgKHN0YXR1cyAhPSAwKSB7CisJCVRSQUNFKERMX0VSUiwgImdldCBmbG93IGNvbnRyb2wgZndjbWQgZmFpbGVkLiIpOworCQlnb3RvIGVycm9yOworCX0KKworCSp0eGZjX2VuYWJsZSA9IGZ3Y21kLT5wYXJhbXMucmVzcG9uc2UudHhfZmxvd19jb250cm9sOworCSpyeGZjX2VuYWJsZSA9IGZ3Y21kLT5wYXJhbXMucmVzcG9uc2UucnhfZmxvd19jb250cm9sOworCitlcnJvcjoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwZm9iLT5wb3N0X2xvY2ssIGlycWwpOworCisJaWYgKHBmb2ItPnBlbmRfcXVldWVfZHJpdmluZyAmJiBwZm9iLT5tY2MpIHsKKwkJcGZvYi0+cGVuZF9xdWV1ZV9kcml2aW5nID0gMDsKKwkJYmVfZHJpdmVfbWNjX3dyYl9xdWV1ZShwZm9iLT5tY2MpOworCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEZ1bmN0aW9uOiBiZV9ldGhfc2V0X3FvcworICogICBUaGlzIGZ1bmN0aW9uIHNldHMgdGhlIGV0aGVybmV0IHRyYW5zbWl0IFF1YWxpdHkgb2YgU2VydmljZSAoUW9TKQorICogICBjaGFyYWN0ZXJpc3RpY3Mgb2YgQmxhZGVFbmdpbmUgZm9yIHRoZSBkb21haW4uIEFsbCBldGhlcm5ldAorICogICB0cmFuc21pdCByaW5ncyBvZiB0aGUgZG9tYWluIHdpbGwgZXZlbmx5IHNoYXJlIHRoZSBiYW5kd2lkdGguCisgKiAgIFRoZSBleGVjZXB0aW9uIHRvIHNoYXJpbmcgaXMgdGhlIGhvc3QgcHJpbWFyeSAoc3VwZXIpIGV0aGVybmV0CisgKiAgIHRyYW5zbWl0IHJpbmcgYXMgd2VsbCBhcyB0aGUgaG9zdCBldGhlcm5ldCBmb3J3YXJkaW5nIHJpbmcKKyAqICAgZm9yIG1pc3NlZCBvZmZsb2FkIGRhdGEuCisgKiBwZm9iIC0KKyAqIG1heF9icHMgICAgICAgICAtIHRoZSBtYXhpbXVtIGJpdHMgcGVyIHNlY29uZCBpbiB1bml0cyBvZgorICogCQkJMTAgTWJwcyAodmFsaWQgMC0xMDApCisgKiBtYXhfcHBzICAgICAgICAgLSB0aGUgbWF4aW11bSBwYWNrZXRzIHBlciBzZWNvbmQgaW4gdW5pdHMKKyAqIAkJCW9mIDEgS3BwcyAoMCBpbmRpY2F0ZXMgbm8gbGltaXQpCisgKiByZXR1cm4gc3RhdHVzICAgLSBCRV9TVUNDRVNTICgwKSBvbiBzdWNjZXNzLiBOZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCitpbnQKK2JlX2V0aF9zZXRfcW9zKHN0cnVjdCBiZV9mdW5jdGlvbl9vYmplY3QgKnBmb2IsIHUzMiBtYXhfYnBzLCB1MzIgbWF4X3BwcykKK3sKKwlzdHJ1Y3QgRldDTURfQ09NTU9OX1NFVF9RT1MgKmZ3Y21kID0gTlVMTDsKKwlzdHJ1Y3QgTUNDX1dSQl9BTUFQICp3cmIgPSBOVUxMOworCWludCBzdGF0dXMgPSAwOworCXVuc2lnbmVkIGxvbmcgaXJxbDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwZm9iLT5wb3N0X2xvY2ssIGlycWwpOworCisJd3JiID0gYmVfZnVuY3Rpb25fcGVla19tY2Nfd3JiKHBmb2IpOworCWlmICghd3JiKSB7CisJCVRSQUNFKERMX0VSUiwgIk1DQyB3cmIgcGVlayBmYWlsZWQuIik7CisJCXN0YXR1cyA9IEJFX1NUQVRVU19OT19NQ0NfV1JCOworCQlnb3RvIGVycm9yOworCX0KKwkvKiBQcmVwYXJlcyBhbiBlbWJlZGRlZCBmd2NtZCwgaW5jbHVkaW5nIHJlcXVlc3QvcmVzcG9uc2Ugc2l6ZXMuICovCisJZndjbWQgPSBCRV9QUkVQQVJFX0VNQkVEREVEX0ZXQ01EKHBmb2IsIHdyYiwgQ09NTU9OX1NFVF9RT1MpOworCisJLyogU2V0IGZpZWxkcyBpbiBmd2NtZCAqLworCWZ3Y21kLT5wYXJhbXMucmVxdWVzdC5tYXhfYml0c19wZXJfc2Vjb25kX05JQyA9IG1heF9icHM7CisJZndjbWQtPnBhcmFtcy5yZXF1ZXN0Lm1heF9wYWNrZXRzX3Blcl9zZWNvbmRfTklDID0gbWF4X3BwczsKKwlmd2NtZC0+cGFyYW1zLnJlcXVlc3QudmFsaWRfZmxhZ3MgPSBRT1NfQklUU19OSUMgfCBRT1NfUEtUU19OSUM7CisKKwkvKiBQb3N0IHRoZSBmL3cgY29tbWFuZCAqLworCXN0YXR1cyA9IGJlX2Z1bmN0aW9uX3Bvc3RfbWNjX3dyYihwZm9iLCB3cmIsIE5VTEwsIE5VTEwsIE5VTEwsCisJCQkJCU5VTEwsIE5VTEwsIGZ3Y21kLCBOVUxMKTsKKworCWlmIChzdGF0dXMgIT0gMCkKKwkJVFJBQ0UoRExfRVJSLCAibmV0d29yayBzZXQgcW9zIGZ3Y21kIGZhaWxlZC4iKTsKKworZXJyb3I6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGZvYi0+cG9zdF9sb2NrLCBpcnFsKTsKKwlpZiAocGZvYi0+cGVuZF9xdWV1ZV9kcml2aW5nICYmIHBmb2ItPm1jYykgeworCQlwZm9iLT5wZW5kX3F1ZXVlX2RyaXZpbmcgPSAwOworCQliZV9kcml2ZV9tY2Nfd3JiX3F1ZXVlKHBmb2ItPm1jYyk7CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRnVuY3Rpb246IGJlX2V0aF9nZXRfcW9zCisgKiAgIFRoaXMgZnVuY3Rpb24gcmV0cmlldmVzIHRoZSBldGhlcm5ldCB0cmFuc21pdCBRdWFsaXR5IG9mIFNlcnZpY2UgKFFvUykKKyAqICAgY2hhcmFjdGVyaXN0aWNzIGZvciB0aGUgZG9tYWluLgorICogbWF4X2JwcyAgICAgICAgIC0gdGhlIG1heGltdW0gYml0cyBwZXIgc2Vjb25kIGluIHVuaXRzIG9mCisgKiAJCQkxMCBNYnBzICh2YWxpZCAwLTEwMCkKKyAqIG1heF9wcHMgICAgICAgICAtIHRoZSBtYXhpbXVtIHBhY2tldHMgcGVyIHNlY29uZCBpbiB1bml0cyBvZgorICogCQkJMSBLcHBzICgwIGluZGljYXRlcyBubyBsaW1pdCkKKyAqIHJldHVybiBzdGF0dXMgICAtIEJFX1NVQ0NFU1MgKDApIG9uIHN1Y2Nlc3MuIE5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK2ludAorYmVfZXRoX2dldF9xb3Moc3RydWN0IGJlX2Z1bmN0aW9uX29iamVjdCAqcGZvYiwgdTMyICptYXhfYnBzLCB1MzIgKm1heF9wcHMpCit7CisJc3RydWN0IEZXQ01EX0NPTU1PTl9HRVRfUU9TICpmd2NtZCA9IE5VTEw7CisJc3RydWN0IE1DQ19XUkJfQU1BUCAqd3JiID0gTlVMTDsKKwlpbnQgc3RhdHVzID0gMDsKKwl1bnNpZ25lZCBsb25nIGlycWw7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcGZvYi0+cG9zdF9sb2NrLCBpcnFsKTsKKworCXdyYiA9IGJlX2Z1bmN0aW9uX3BlZWtfbWNjX3dyYihwZm9iKTsKKwlpZiAoIXdyYikgeworCQlUUkFDRShETF9FUlIsICJNQ0Mgd3JiIHBlZWsgZmFpbGVkLiIpOworCQlzdGF0dXMgPSBCRV9TVEFUVVNfTk9fTUNDX1dSQjsKKwkJZ290byBlcnJvcjsKKwl9CisJLyogUHJlcGFyZXMgYW4gZW1iZWRkZWQgZndjbWQsIGluY2x1ZGluZyByZXF1ZXN0L3Jlc3BvbnNlIHNpemVzLiAqLworCWZ3Y21kID0gQkVfUFJFUEFSRV9FTUJFRERFRF9GV0NNRChwZm9iLCB3cmIsIENPTU1PTl9HRVRfUU9TKTsKKworCS8qIFBvc3QgdGhlIGYvdyBjb21tYW5kICovCisJc3RhdHVzID0gYmVfZnVuY3Rpb25fcG9zdF9tY2Nfd3JiKHBmb2IsIHdyYiwgTlVMTCwgTlVMTCwgTlVMTCwKKwkJCQkJTlVMTCwgTlVMTCwgZndjbWQsIE5VTEwpOworCisJaWYgKHN0YXR1cyAhPSAwKSB7CisJCVRSQUNFKERMX0VSUiwgIm5ldHdvcmsgZ2V0IHFvcyBmd2NtZCBmYWlsZWQuIik7CisJCWdvdG8gZXJyb3I7CisJfQorCisJKm1heF9icHMgPSBmd2NtZC0+cGFyYW1zLnJlc3BvbnNlLm1heF9iaXRzX3Blcl9zZWNvbmRfTklDOworCSptYXhfcHBzID0gZndjbWQtPnBhcmFtcy5yZXNwb25zZS5tYXhfcGFja2V0c19wZXJfc2Vjb25kX05JQzsKKworZXJyb3I6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGZvYi0+cG9zdF9sb2NrLCBpcnFsKTsKKwlpZiAocGZvYi0+cGVuZF9xdWV1ZV9kcml2aW5nICYmIHBmb2ItPm1jYykgeworCQlwZm9iLT5wZW5kX3F1ZXVlX2RyaXZpbmcgPSAwOworCQliZV9kcml2ZV9tY2Nfd3JiX3F1ZXVlKHBmb2ItPm1jYyk7CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRnVuY3Rpb246IGJlX2V0aF9zZXRfZnJhbWVfc2l6ZQorICogICBUaGlzIGZ1bmN0aW9uIHNldHMgdGhlIGV0aGVybmV0IG1heGltdW0gZnJhbWUgc2l6ZS4gVGhlIHByZXZpb3VzCisgKiAgIHZhbHVlcyBhcmUgcmV0dXJuZWQuCisgKiBwZm9iIC0KKyAqIHR4X2ZyYW1lX3NpemUgICAtIG1heGltdW0gdHJhbnNtaXQgZnJhbWUgc2l6ZSBpbiBieXRlcworICogcnhfZnJhbWVfc2l6ZSAgIC0gbWF4aW11bSByZWNlaXZlIGZyYW1lIHNpemUgaW4gYnl0ZXMKKyAqIHJldHVybiBzdGF0dXMgICAtIEJFX1NVQ0NFU1MgKDApIG9uIHN1Y2Nlc3MuIE5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK2ludAorYmVfZXRoX3NldF9mcmFtZV9zaXplKHN0cnVjdCBiZV9mdW5jdGlvbl9vYmplY3QgKnBmb2IsCisJCSAgICAgIHUzMiAqdHhfZnJhbWVfc2l6ZSwgdTMyICpyeF9mcmFtZV9zaXplKQoreworCXN0cnVjdCBGV0NNRF9DT01NT05fU0VUX0ZSQU1FX1NJWkUgKmZ3Y21kID0gTlVMTDsKKwlzdHJ1Y3QgTUNDX1dSQl9BTUFQICp3cmIgPSBOVUxMOworCWludCBzdGF0dXMgPSAwOworCXVuc2lnbmVkIGxvbmcgaXJxbDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwZm9iLT5wb3N0X2xvY2ssIGlycWwpOworCisJd3JiID0gYmVfZnVuY3Rpb25fcGVla19tY2Nfd3JiKHBmb2IpOworCWlmICghd3JiKSB7CisJCVRSQUNFKERMX0VSUiwgIk1DQyB3cmIgcGVlayBmYWlsZWQuIik7CisJCXN0YXR1cyA9IEJFX1NUQVRVU19OT19NQ0NfV1JCOworCQlnb3RvIGVycm9yOworCX0KKwkvKiBQcmVwYXJlcyBhbiBlbWJlZGRlZCBmd2NtZCwgaW5jbHVkaW5nIHJlcXVlc3QvcmVzcG9uc2Ugc2l6ZXMuICovCisJZndjbWQgPSBCRV9QUkVQQVJFX0VNQkVEREVEX0ZXQ01EKHBmb2IsIHdyYiwgQ09NTU9OX1NFVF9GUkFNRV9TSVpFKTsKKwlmd2NtZC0+cGFyYW1zLnJlcXVlc3QubWF4X3R4X2ZyYW1lX3NpemUgPSAqdHhfZnJhbWVfc2l6ZTsKKwlmd2NtZC0+cGFyYW1zLnJlcXVlc3QubWF4X3J4X2ZyYW1lX3NpemUgPSAqcnhfZnJhbWVfc2l6ZTsKKworCS8qIFBvc3QgdGhlIGYvdyBjb21tYW5kICovCisJc3RhdHVzID0gYmVfZnVuY3Rpb25fcG9zdF9tY2Nfd3JiKHBmb2IsIHdyYiwgTlVMTCwgTlVMTCwgTlVMTCwKKwkJCQkJCU5VTEwsIE5VTEwsIGZ3Y21kLCBOVUxMKTsKKworCWlmIChzdGF0dXMgIT0gMCkgeworCQlUUkFDRShETF9FUlIsICJuZXR3b3JrIHNldCBmcmFtZSBzaXplIGZ3Y21kIGZhaWxlZC4iKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwkqdHhfZnJhbWVfc2l6ZSA9IGZ3Y21kLT5wYXJhbXMucmVzcG9uc2UuY2hpcF9tYXhfdHhfZnJhbWVfc2l6ZTsKKwkqcnhfZnJhbWVfc2l6ZSA9IGZ3Y21kLT5wYXJhbXMucmVzcG9uc2UuY2hpcF9tYXhfcnhfZnJhbWVfc2l6ZTsKKworZXJyb3I6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGZvYi0+cG9zdF9sb2NrLCBpcnFsKTsKKwlpZiAocGZvYi0+cGVuZF9xdWV1ZV9kcml2aW5nICYmIHBmb2ItPm1jYykgeworCQlwZm9iLT5wZW5kX3F1ZXVlX2RyaXZpbmcgPSAwOworCQliZV9kcml2ZV9tY2Nfd3JiX3F1ZXVlKHBmb2ItPm1jYyk7CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKKworLyoKKyAgICBUaGlzIHJvdXRpbmUgY3JlYXRlcyBhIEV0aGVybmV0IHJlY2VpdmUgcmluZy4KKworICAgIHBmb2IgICAgICAtIGhhbmRsZSB0byBhIGZ1bmN0aW9uIG9iamVjdAorICAgIHJxX2Jhc2VfdmEgICAgICAgICAgICAtIGJhc2UgVkEgZm9yIHRoZSBkZWZhdWx0IHJlY2VpdmUgcmluZy4gdGhpcyBtdXN0IGJlCisJCQlleGFjdGx5IDhLIGluIGxlbmd0aCBhbmQgY29udGluZ3VvdXMgcGh5c2ljYWwgbWVtb3J5LgorICAgIGNxX29iamVjdCAgICAgICAgICAgIC0gaGFuZGxlIHRvIGEgcHJldmlvdXNseSBjcmVhdGVkIENRIHRvIGJlIGFzc29jaWF0ZWQKKwkJCXdpdGggdGhlIFJRLgorICAgIHBwX2V0aF9ycSAgICAgICAgICAgICAtIHBvaW50ZXIgdG8gYW4gb3BxYXVlIGhhbmRsZSB3aGVyZSBhbiBldGgKKwkJCXJlY2VpdmUgb2JqZWN0IGlzIHJldHVybmVkLgorICAgIFJldHVybnMgQkVfU1VDQ0VTUyBpZiBzdWNjZXNzZnVsbCwgLCBvdGhlcndpc2UgYSB1c2VmdWwKKyAgICBpbnQgZXJyb3IgY29kZSBpcyByZXR1cm5lZC4KKworICAgIElSUUw6IDwgRElTUEFUQ0hfTEVWRUwKKyAgICB0aGlzIGZ1bmN0aW9uIGFsbG9jYXRlcyBhIHN0cnVjdCBiZV9ldGhycV9vYmplY3QgKm9iamVjdC4KKyAgICB0aGVyZSBtdXN0IGJlIG5vIG1vcmUgdGhhbiAxIG9mIHRoZXNlIHBlciBmdW5jdGlvbiBvYmplY3QsIHVubGVzcyB0aGUKKyAgICBmdW5jdGlvbiBvYmplY3Qgc3VwcG9ydHMgUlNTIChpcyBuZXR3b3JraW5nIGFuZCBvbiB0aGUgaG9zdCkuCisgICAgdGhlIHJxX2Jhc2VfdmEgbXVzdCBwb2ludCB0byBhIGJ1ZmZlciBvZiBleGFjdGx5IDhLLgorICAgIHRoZSBlcng6Omhvc3RfY3FpZCAob3IgaG9zdF9zdG9yX2NxaWQpIHJlZ2lzdGVyIGFuZCBlcng6OnJpbmdfcGFnZSByZWdpc3RlcnMKKyAgICB3aWxsIGJlIHVwZGF0ZWQgYXMgYXBwcm9wcmlhdGUgb24gcmV0dXJuCisqLworaW50CitiZV9ldGhfcnFfY3JlYXRlKHN0cnVjdCBiZV9mdW5jdGlvbl9vYmplY3QgKnBmb2IsCisJCQlzdHJ1Y3QgcmluZ19kZXNjICpyZCwgc3RydWN0IGJlX2NxX29iamVjdCAqY3Ffb2JqZWN0LAorCQkJc3RydWN0IGJlX2NxX29iamVjdCAqYmNtY19jcV9vYmplY3QsCisJCQlzdHJ1Y3QgYmVfZXRocnFfb2JqZWN0ICpldGhfcnEpCit7CisJaW50IHN0YXR1cyA9IDA7CisJc3RydWN0IE1DQ19XUkJfQU1BUCAqd3JiID0gTlVMTDsKKwlzdHJ1Y3QgRldDTURfQ09NTU9OX0VUSF9SWF9DUkVBVEUgKmZ3Y21kID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIGlycWw7CisKKwkvKiBNUFUgd2lsbCBzZXQgdGhlICAqLworCUFTU0VSVChyZCk7CisJQVNTRVJUKGV0aF9ycSk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcGZvYi0+cG9zdF9sb2NrLCBpcnFsKTsKKworCWV0aF9ycS0+cGFyZW50X2Z1bmN0aW9uID0gcGZvYjsKKwlldGhfcnEtPmNxX29iamVjdCA9IGNxX29iamVjdDsKKworCXdyYiA9IGJlX2Z1bmN0aW9uX3BlZWtfbWNjX3dyYihwZm9iKTsKKwlpZiAoIXdyYikgeworCQlUUkFDRShETF9FUlIsICJNQ0Mgd3JiIHBlZWsgZmFpbGVkLiIpOworCQlzdGF0dXMgPSBCRV9TVEFUVVNfTk9fTUNDX1dSQjsKKwkJZ290byBFcnJvcjsKKwl9CisJLyogUHJlcGFyZXMgYW4gZW1iZWRkZWQgZndjbWQsIGluY2x1ZGluZyByZXF1ZXN0L3Jlc3BvbnNlIHNpemVzLiAqLworCWZ3Y21kID0gQkVfUFJFUEFSRV9FTUJFRERFRF9GV0NNRChwZm9iLCB3cmIsIENPTU1PTl9FVEhfUlhfQ1JFQVRFKTsKKworCWZ3Y21kLT5wYXJhbXMucmVxdWVzdC5udW1fcGFnZXMgPSAyOwkvKiByZXF1aXJlZCBsZW5ndGggKi8KKwlmd2NtZC0+cGFyYW1zLnJlcXVlc3QuY3FfaWQgPSBjcV9vYmplY3QtPmNxX2lkOworCisJaWYgKGJjbWNfY3Ffb2JqZWN0KQorCQlmd2NtZC0+cGFyYW1zLnJlcXVlc3QuYmNtY19jcV9pZCA9IGJjbWNfY3Ffb2JqZWN0LT5jcV9pZDsKKwllbHNlCisJCWZ3Y21kLT5wYXJhbXMucmVxdWVzdC5iY21jX2NxX2lkID0gMHhGRkZGOworCisJLyogQ3JlYXRlIGEgcGFnZSBsaXN0IGZvciB0aGUgRldDTUQuICovCisJYmVfcmRfdG9fcGFfbGlzdChyZCwgZndjbWQtPnBhcmFtcy5yZXF1ZXN0LnBhZ2VzLAorCQkJICBBUlJBWV9TSVpFKGZ3Y21kLT5wYXJhbXMucmVxdWVzdC5wYWdlcykpOworCisJLyogUG9zdCB0aGUgZi93IGNvbW1hbmQgKi8KKwlzdGF0dXMgPSBiZV9mdW5jdGlvbl9wb3N0X21jY193cmIocGZvYiwgd3JiLCBOVUxMLCBOVUxMLCBOVUxMLAorCQkJCQkJTlVMTCwgTlVMTCwgZndjbWQsIE5VTEwpOworCWlmIChzdGF0dXMgIT0gQkVfU1VDQ0VTUykgeworCQlUUkFDRShETF9FUlIsICJmd2NtZCB0byBtYXAgZXRoIHJ4cSBmcmFncyBmYWlsZWQuIik7CisJCWdvdG8gRXJyb3I7CisJfQorCS8qIFNhdmUgdGhlIHJpbmcgSUQgZm9yIGNsZWFudXAuICovCisJZXRoX3JxLT5yaWQgPSBmd2NtZC0+cGFyYW1zLnJlc3BvbnNlLmlkOworCisJYXRvbWljX2luYygmY3Ffb2JqZWN0LT5yZWZfY291bnQpOworCitFcnJvcjoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwZm9iLT5wb3N0X2xvY2ssIGlycWwpOworCisJaWYgKHBmb2ItPnBlbmRfcXVldWVfZHJpdmluZyAmJiBwZm9iLT5tY2MpIHsKKwkJcGZvYi0+cGVuZF9xdWV1ZV9kcml2aW5nID0gMDsKKwkJYmVfZHJpdmVfbWNjX3dyYl9xdWV1ZShwZm9iLT5tY2MpOworCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICAgIFRoaXMgcm91dGluZSBkZXN0cm95cyBhbiBFdGhlcm5ldCByZWNlaXZlIHF1ZXVlCisKKyAgICBldGhfcnEgLSBldGhlcm5ldCByZWNlaXZlIHF1ZXVlIGhhbmRsZSByZXR1cm5lZCBmcm9tIGV0aF9ycV9jcmVhdGUKKworICAgIFJldHVybnMgQkVfU1VDQ0VTUyBvbiBzdWNjZXNzIGFuZCBhbiBhcHByb3ByaWF0ZSBpbnQgb24gZmFpbHVyZS4KKworICAgIFRoaXMgZnVuY3Rpb24gZnJlZXMgcmVzb3VyY3MgYWxsb2NhdGVkIGJ5IEV0aFJxQ3JlYXRlLgorICAgIFRoZSBlcng6Omhvc3RfY3FpZCAob3IgaG9zdF9zdG9yX2NxaWQpIHJlZ2lzdGVyIGFuZCBlcng6OnJpbmdfcGFnZQorICAgIHJlZ2lzdGVycyB3aWxsIGJlIHVwZGF0ZWQgYXMgYXBwcm9wcmlhdGUgb24gcmV0dXJuCisgICAgSVJRTDogPCBESVNQQVRDSF9MRVZFTAorKi8KKworc3RhdGljIHZvaWQgYmVfZXRoX3JxX2Rlc3Ryb3lfaW50ZXJuYWxfY2Iodm9pZCAqY29udGV4dCwgaW50IHN0YXR1cywKKwkJCQkJIHN0cnVjdCBNQ0NfV1JCX0FNQVAgKndyYikKK3sKKwlzdHJ1Y3QgYmVfZXRocnFfb2JqZWN0ICpldGhfcnEgPSAoc3RydWN0IGJlX2V0aHJxX29iamVjdCAqKSBjb250ZXh0OworCisJaWYgKHN0YXR1cyAhPSBCRV9TVUNDRVNTKSB7CisJCVRSQUNFKERMX0VSUiwgIkRlc3Ryb3kgZXRoIHJxIGZhaWxlZCBpbiBpbnRlcm5hbCBjYWxsYmFjay5cbiIpOworCX0gZWxzZSB7CisJCS8qIERlcmVmZXJlbmNlIGFueSBDUXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcXVldWUuICovCisJCWF0b21pY19kZWMoJmV0aF9ycS0+Y3Ffb2JqZWN0LT5yZWZfY291bnQpOworCX0KKworCXJldHVybjsKK30KKworaW50IGJlX2V0aF9ycV9kZXN0cm95KHN0cnVjdCBiZV9ldGhycV9vYmplY3QgKmV0aF9ycSkKK3sKKwlpbnQgc3RhdHVzID0gQkVfU1VDQ0VTUzsKKworCS8qIFNlbmQgZndjbWQgdG8gZGVzdHJveSB0aGUgUlEuICovCisJc3RhdHVzID0gYmVfZnVuY3Rpb25fcmluZ19kZXN0cm95KGV0aF9ycS0+cGFyZW50X2Z1bmN0aW9uLAorCQkJZXRoX3JxLT5yaWQsIEZXQ01EX1JJTkdfVFlQRV9FVEhfUlgsIE5VTEwsIE5VTEwsCisJCQliZV9ldGhfcnFfZGVzdHJveV9pbnRlcm5hbF9jYiwgZXRoX3JxKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRnVuY3Rpb246IGJlX2V0aF9ycV9kZXN0cm95X29wdGlvbnMKKyAqICAgRGVzdHJveXMgYW4gZXRoZXJuZXQgcmVjZWl2ZSByaW5nIHdpdGggZmluZXIgZ3JhbnVsYXJpdHkgb3B0aW9ucworICogICB0aGFuIHRoZSBzdGFuZGFyZCBiZV9ldGhfcnFfZGVzdHJveSgpIEFQSSBmdW5jdGlvbi4KKyAqIGV0aF9ycSAgICAgICAgICAgLQorICogZmx1c2ggICAgICAgICAgICAtIFNldCB0byAxIHRvIGZsdXNoIHRoZSByaW5nLCBzZXQgdG8gMCB0byBieXBhc3MgdGhlIGZsdXNoCisgKiBjYiAgICAgICAgICAgICAgIC0gQ2FsbGJhY2sgZnVuY3Rpb24gb24gY29tcGxldGlvbgorICogY2JfY29udGV4dCAgICAgICAtIENhbGxiYWNrIGNvbnRleHQKKyAqIHJldHVybiBzdGF0dXMgICAgLSBCRV9TVUNDRVNTICgwKSBvbiBzdWNjZXNzLiBOZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworaW50CitiZV9ldGhfcnFfZGVzdHJveV9vcHRpb25zKHN0cnVjdCBiZV9ldGhycV9vYmplY3QgKmV0aF9ycSwgYm9vbCBmbHVzaCwKKwkJbWNjX3dyYl9jcWVfY2FsbGJhY2sgY2IsIHZvaWQgKmNiX2NvbnRleHQpCit7CisJc3RydWN0IEZXQ01EX0NPTU1PTl9SSU5HX0RFU1RST1kgKmZ3Y21kID0gTlVMTDsKKwlzdHJ1Y3QgTUNDX1dSQl9BTUFQICp3cmIgPSBOVUxMOworCWludCBzdGF0dXMgPSBCRV9TVUNDRVNTOworCXN0cnVjdCBiZV9mdW5jdGlvbl9vYmplY3QgKnBmb2IgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgaXJxbDsKKworCXBmb2IgPSBldGhfcnEtPnBhcmVudF9mdW5jdGlvbjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwZm9iLT5wb3N0X2xvY2ssIGlycWwpOworCisJVFJBQ0UoRExfSU5GTywgIkRlc3Ryb3kgZXRoX3JxIHJpbmcgaWQ6JWQsIGZsdXNoOiVkIiwgZXRoX3JxLT5yaWQsCisJICAgICAgZmx1c2gpOworCisJd3JiID0gYmVfZnVuY3Rpb25fcGVla19tY2Nfd3JiKHBmb2IpOworCWlmICghd3JiKSB7CisJCUFTU0VSVCh3cmIpOworCQlUUkFDRShETF9FUlIsICJObyBmcmVlIE1DQyBXUkJzIGluIGRlc3Ryb3kgZXRoX3JxIHJpbmcuIik7CisJCXN0YXR1cyA9IEJFX1NUQVRVU19OT19NQ0NfV1JCOworCQlnb3RvIEVycm9yOworCX0KKwkvKiBQcmVwYXJlcyBhbiBlbWJlZGRlZCBmd2NtZCwgaW5jbHVkaW5nIHJlcXVlc3QvcmVzcG9uc2Ugc2l6ZXMuICovCisJZndjbWQgPSBCRV9QUkVQQVJFX0VNQkVEREVEX0ZXQ01EKHBmb2IsIHdyYiwgQ09NTU9OX1JJTkdfREVTVFJPWSk7CisKKwlmd2NtZC0+cGFyYW1zLnJlcXVlc3QuaWQgPSBldGhfcnEtPnJpZDsKKwlmd2NtZC0+cGFyYW1zLnJlcXVlc3QucmluZ190eXBlID0gRldDTURfUklOR19UWVBFX0VUSF9SWDsKKwlmd2NtZC0+cGFyYW1zLnJlcXVlc3QuYnlwYXNzX2ZsdXNoID0gKCgwID09IGZsdXNoKSA/IDEgOiAwKTsKKworCS8qIFBvc3QgdGhlIGYvdyBjb21tYW5kICovCisJc3RhdHVzID0gYmVfZnVuY3Rpb25fcG9zdF9tY2Nfd3JiKHBmb2IsIHdyYiwgTlVMTCwgY2IsIGNiX2NvbnRleHQsCisJCQliZV9ldGhfcnFfZGVzdHJveV9pbnRlcm5hbF9jYiwgZXRoX3JxLCBmd2NtZCwgTlVMTCk7CisKKwlpZiAoc3RhdHVzICE9IEJFX1NVQ0NFU1MgJiYgc3RhdHVzICE9IEJFX1BFTkRJTkcpIHsKKwkJVFJBQ0UoRExfRVJSLCAiZXRoX3JxIHJpbmcgZGVzdHJveSBmYWlsZWQuIGlkOiVkLCBmbHVzaDolZCIsCisJCSAgICAgIGV0aF9ycS0+cmlkLCBmbHVzaCk7CisJCWdvdG8gRXJyb3I7CisJfQorCitFcnJvcjoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwZm9iLT5wb3N0X2xvY2ssIGlycWwpOworCisJaWYgKHBmb2ItPnBlbmRfcXVldWVfZHJpdmluZyAmJiBwZm9iLT5tY2MpIHsKKwkJcGZvYi0+cGVuZF9xdWV1ZV9kcml2aW5nID0gMDsKKwkJYmVfZHJpdmVfbWNjX3dyYl9xdWV1ZShwZm9iLT5tY2MpOworCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICAgIFRoaXMgcm91dGluZSBxdWVyaWVzIHRoZSBmcmFnIHNpemUgZm9yIGVyeC4KKworICAgIHBmb2IgICAgICAtIGhhbmRsZSB0byBhIGZ1bmN0aW9uIG9iamVjdAorCisgICAgZnJhZ19zaXplX2J5dGVzICAgICAgIC0gZXJ4IGZyYWcgc2l6ZSBpbiBieXRlcyB0aGF0IGlzL3dhcyBzZXQuCisKKyAgICBSZXR1cm5zIEJFX1NVQ0NFU1MgaWYgc3VjY2Vzc2Z1bGwsIG90aGVyd2lzZSBhIHVzZWZ1bCBpbnQgZXJyb3IKKyAgICBjb2RlIGlzIHJldHVybmVkLgorCisgICAgSVJRTDogPCBESVNQQVRDSF9MRVZFTAorCisqLworaW50CitiZV9ldGhfcnFfZ2V0X2ZyYWdfc2l6ZShzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwZm9iLCB1MzIgKmZyYWdfc2l6ZV9ieXRlcykKK3sKKwlzdHJ1Y3QgRldDTURfRVRIX0dFVF9SWF9GUkFHX1NJWkUgKmZ3Y21kID0gTlVMTDsKKwlzdHJ1Y3QgTUNDX1dSQl9BTUFQICp3cmIgPSBOVUxMOworCWludCBzdGF0dXMgPSAwOworCXVuc2lnbmVkIGxvbmcgaXJxbDsKKworCUFTU0VSVChmcmFnX3NpemVfYnl0ZXMpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBmb2ItPnBvc3RfbG9jaywgaXJxbCk7CisKKwl3cmIgPSBiZV9mdW5jdGlvbl9wZWVrX21jY193cmIocGZvYik7CisJaWYgKCF3cmIpIHsKKwkJVFJBQ0UoRExfRVJSLCAiTUNDIHdyYiBwZWVrIGZhaWxlZC4iKTsKKwkJcmV0dXJuIEJFX1NUQVRVU19OT19NQ0NfV1JCOworCX0KKwkvKiBQcmVwYXJlcyBhbiBlbWJlZGRlZCBmd2NtZCwgaW5jbHVkaW5nIHJlcXVlc3QvcmVzcG9uc2Ugc2l6ZXMuICovCisJZndjbWQgPSBCRV9QUkVQQVJFX0VNQkVEREVEX0ZXQ01EKHBmb2IsIHdyYiwgRVRIX0dFVF9SWF9GUkFHX1NJWkUpOworCisJLyogUG9zdCB0aGUgZi93IGNvbW1hbmQgKi8KKwlzdGF0dXMgPSBiZV9mdW5jdGlvbl9wb3N0X21jY193cmIocGZvYiwgd3JiLCBOVUxMLCBOVUxMLCBOVUxMLAorCQkJCU5VTEwsIE5VTEwsIGZ3Y21kLCBOVUxMKTsKKworCWlmIChzdGF0dXMgIT0gMCkgeworCQlUUkFDRShETF9FUlIsICJnZXQgZnJhZyBzaXplIGZ3Y21kIGZhaWxlZC4iKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwkqZnJhZ19zaXplX2J5dGVzID0gMSA8PCBmd2NtZC0+cGFyYW1zLnJlc3BvbnNlLmFjdHVhbF9mcmFnc2l6ZV9sb2cyOworCitlcnJvcjoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwZm9iLT5wb3N0X2xvY2ssIGlycWwpOworCisJaWYgKHBmb2ItPnBlbmRfcXVldWVfZHJpdmluZyAmJiBwZm9iLT5tY2MpIHsKKwkJcGZvYi0+cGVuZF9xdWV1ZV9kcml2aW5nID0gMDsKKwkJYmVfZHJpdmVfbWNjX3dyYl9xdWV1ZShwZm9iLT5tY2MpOworCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICAgIFRoaXMgcm91dGluZSBhdHRlbXB0cyB0byBzZXQgdGhlIGZyYWcgc2l6ZSBmb3IgZXJ4LiAgSWYgdGhlIGZyYWcgc2l6ZSBpcworICAgIGFscmVhZHkgc2V0LCB0aGUgYXR0ZW1wdCBmYWlscyBhbmQgdGhlIGN1cnJlbnQgZnJhZyBzaXplIGlzIHJldHVybmVkLgorCisgICAgcGZvYiAgICAgIC0gSGFuZGxlIHRvIGEgZnVuY3Rpb24gb2JqZWN0CisKKyAgICBmcmFnX3NpemUgICAgICAgLSBFcnggZnJhZyBzaXplIGluIGJ5dGVzIHRoYXQgaXMvd2FzIHNldC4KKworICAgIGN1cnJlbnRfZnJhZ19zaXplX2J5dGVzICAgIC0gUG9pbnRlciB0byBsb2NhdGlvbiB3aGVyZSBjdXJycmVudCBmcmFnCisJCQkJIGlzIHRvIGJlIHJ0dXJuZWQKKworICAgIFJldHVybnMgQkVfU1VDQ0VTUyBpZiBzdWNjZXNzZnVsbCwgb3RoZXJ3aXNlIGEgdXNlZnVsIGludCBlcnJvcgorICAgIGNvZGUgaXMgcmV0dXJuZWQuCisKKyAgICBJUlFMOiA8IERJU1BBVENIX0xFVkVMCisKKyAgICBUaGlzIGZ1bmN0aW9uIGFsd2F5cyBmYWlscyBpbiBub24tcHJpdmlsZWdlZCBtYWNoaW5lIGNvbnRleHQuCisqLworaW50CitiZV9ldGhfcnFfc2V0X2ZyYWdfc2l6ZShzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwZm9iLAorCQkJdTMyIGZyYWdfc2l6ZSwgdTMyICpmcmFnX3NpemVfYnl0ZXMpCit7CisJc3RydWN0IEZXQ01EX0VUSF9TRVRfUlhfRlJBR19TSVpFICpmd2NtZCA9IE5VTEw7CisJc3RydWN0IE1DQ19XUkJfQU1BUCAqd3JiID0gTlVMTDsKKwlpbnQgc3RhdHVzID0gMDsKKwl1bnNpZ25lZCBsb25nIGlycWw7CisKKwlBU1NFUlQoZnJhZ19zaXplX2J5dGVzKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwZm9iLT5wb3N0X2xvY2ssIGlycWwpOworCisJd3JiID0gYmVfZnVuY3Rpb25fcGVla19tY2Nfd3JiKHBmb2IpOworCWlmICghd3JiKSB7CisJCVRSQUNFKERMX0VSUiwgIk1DQyB3cmIgcGVlayBmYWlsZWQuIik7CisJCXN0YXR1cyA9IEJFX1NUQVRVU19OT19NQ0NfV1JCOworCQlnb3RvIGVycm9yOworCX0KKwkvKiBQcmVwYXJlcyBhbiBlbWJlZGRlZCBmd2NtZCwgaW5jbHVkaW5nIHJlcXVlc3QvcmVzcG9uc2Ugc2l6ZXMuICovCisJZndjbWQgPSBCRV9QUkVQQVJFX0VNQkVEREVEX0ZXQ01EKHBmb2IsIHdyYiwgRVRIX1NFVF9SWF9GUkFHX1NJWkUpOworCisJQVNTRVJUKGZyYWdfc2l6ZSA+PSAxMjggJiYgZnJhZ19zaXplIDw9IDE2ICogMTAyNCk7CisKKwkvKiBUaGlzIGlzIHRoZSBsb2cyIG9mIHRoZSBmcmFnc2l6ZS4gIFRoaXMgaXMgbm90IHRoZSBleGFjdAorCSAqIEVSWCBlbmNvZGluZy4gKi8KKwlmd2NtZC0+cGFyYW1zLnJlcXVlc3QubmV3X2ZyYWdzaXplX2xvZzIgPSBfX2lsb2cyX3UzMihmcmFnX3NpemUpOworCisJLyogUG9zdCB0aGUgZi93IGNvbW1hbmQgKi8KKwlzdGF0dXMgPSBiZV9mdW5jdGlvbl9wb3N0X21jY193cmIocGZvYiwgd3JiLCBOVUxMLCBOVUxMLCBOVUxMLAorCQkJCU5VTEwsIE5VTEwsIGZ3Y21kLCBOVUxMKTsKKworCWlmIChzdGF0dXMgIT0gMCkgeworCQlUUkFDRShETF9FUlIsICJzZXQgZnJhZyBzaXplIGZ3Y21kIGZhaWxlZC4iKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwkqZnJhZ19zaXplX2J5dGVzID0gMSA8PCBmd2NtZC0+cGFyYW1zLnJlc3BvbnNlLmFjdHVhbF9mcmFnc2l6ZV9sb2cyOworZXJyb3I6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGZvYi0+cG9zdF9sb2NrLCBpcnFsKTsKKworCWlmIChwZm9iLT5wZW5kX3F1ZXVlX2RyaXZpbmcgJiYgcGZvYi0+bWNjKSB7CisJCXBmb2ItPnBlbmRfcXVldWVfZHJpdmluZyA9IDA7CisJCWJlX2RyaXZlX21jY193cmJfcXVldWUocGZvYi0+bWNjKTsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworCisvKgorICAgIFRoaXMgcm91dGluZSBnZXRzIG9yIHNldHMgYSBtYWMgYWRkcmVzcyBmb3IgYSBkb21haW4KKyAgICBnaXZlbiB0aGUgcG9ydCBhbmQgbWFjLgorCisgICAgRnVuY3Rpb25PYmplY3QgIC0gRnVuY3Rpb24gb2JqZWN0IGhhbmRsZS4KKyAgICBwb3J0MSAgICAgICAgICAgLSBTZXQgdG8gVFJVRSBpZiB0aGlzIGZ1bmN0aW9uIHdpbGwgc2V0L2dldCB0aGUgUG9ydCAxCisJCQlhZGRyZXNzLiAgT25seSB0aGUgaG9zdCBtYXkgc2V0IHRoaXMgdG8gVFJVRS4KKyAgICBtYWMxICAgICAgICAgICAgLSBTZXQgdG8gVFJVRSBpZiB0aGlzIGZ1bmN0aW9uIHdpbGwgc2V0L2dldCB0aGUKKwkJCU1BQyAxIGFkZHJlc3MuICBPbmx5IHRoZSBob3N0IG1heSBzZXQgdGhpcyB0byBUUlVFLgorICAgIHdyaXRlICAgICAgICAgICAtIFNldCB0byBUUlVFIGlmIHRoaXMgZnVuY3Rpb24gc2hvdWxkIHdyaXRlIHRoZSBtYWMgYWRkcmVzcy4KKyAgICBtYWNfYWRkcmVzcyAgICAgIC0gQnVmZmVyIG9mIHRoZSBtYWMgYWRkcmVzcyB0byByZWFkIG9yIHdyaXRlLgorCisgICAgUmV0dXJucyBCRV9TVUNDRVNTIGlmIHN1Y2Nlc3NmdWxsLCBvdGhlcndpc2UgYSB1c2VmdWwgaW50IGlzIHJldHVybmVkLgorCisgICAgSVJRTDogPCBESVNQQVRDSF9MRVZFTAorKi8KK2ludCBiZV9yeGZfbWFjX2FkZHJlc3NfcmVhZF93cml0ZShzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwZm9iLAorCQlib29sIHBvcnQxLAkvKiBWTSBtdXN0IGFsd2F5cyBzZXQgdG8gZmFsc2UgKi8KKwkJYm9vbCBtYWMxLAkvKiBWTSBtdXN0IGFsd2F5cyBzZXQgdG8gZmFsc2UgKi8KKwkJYm9vbCBtZ210LCBib29sIHdyaXRlLAorCQlib29sIHBlcm1hbmVudCwgdTggKm1hY19hZGRyZXNzLAorCQltY2Nfd3JiX2NxZV9jYWxsYmFjayBjYiwJLyogb3B0aW9uYWwgKi8KKwkJdm9pZCAqY2JfY29udGV4dCkJLyogb3B0aW9uYWwgKi8KK3sKKwlpbnQgc3RhdHVzID0gQkVfU1VDQ0VTUzsKKwl1bmlvbiB7CisJCXN0cnVjdCBGV0NNRF9DT01NT05fTlRXS19NQUNfUVVFUlkgKnF1ZXJ5OworCQlzdHJ1Y3QgRldDTURfQ09NTU9OX05UV0tfTUFDX1NFVCAqc2V0OworCX0gZndjbWQgPSB7TlVMTH07CisJc3RydWN0IE1DQ19XUkJfQU1BUCAqd3JiID0gTlVMTDsKKwl1MzIgdHlwZSA9IDA7CisJdW5zaWduZWQgbG9uZyBpcnFsOworCXN0cnVjdCBiZV9tY2Nfd3JiX3Jlc3BvbnNlX2NvcHkgcmM7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcGZvYi0+cG9zdF9sb2NrLCBpcnFsKTsKKworCUFTU0VSVChtYWNfYWRkcmVzcyk7CisKKwlBU1NFUlQocG9ydDEgPT0gZmFsc2UpOworCUFTU0VSVChtYWMxID09IGZhbHNlKTsKKworCXdyYiA9IGJlX2Z1bmN0aW9uX3BlZWtfbWNjX3dyYihwZm9iKTsKKwlpZiAoIXdyYikgeworCQlUUkFDRShETF9FUlIsICJNQ0Mgd3JiIHBlZWsgZmFpbGVkLiIpOworCQlzdGF0dXMgPSBCRV9TVEFUVVNfTk9fTUNDX1dSQjsKKwkJZ290byBFcnJvcjsKKwl9CisKKwlpZiAobWdtdCkgeworCQl0eXBlID0gTUFDX0FERFJFU1NfVFlQRV9NQU5BR0VNRU5UOworCX0gZWxzZSB7CisJCWlmIChwZm9iLT50eXBlID09IEJFX0ZVTkNUSU9OX1RZUEVfTkVUV09SSykKKwkJCXR5cGUgPSBNQUNfQUREUkVTU19UWVBFX05FVFdPUks7CisJCWVsc2UKKwkJCXR5cGUgPSBNQUNfQUREUkVTU19UWVBFX1NUT1JBR0U7CisJfQorCisJaWYgKHdyaXRlKSB7CisJCS8qIFByZXBhcmVzIGFuIGVtYmVkZGVkIGZ3Y21kLCBpbmNsdWRpbmcKKwkJICogcmVxdWVzdC9yZXNwb25zZSBzaXplcy4KKwkJICovCisJCWZ3Y21kLnNldCA9IEJFX1BSRVBBUkVfRU1CRURERURfRldDTUQocGZvYiwKKwkJCQkJICAgICAgIHdyYiwgQ09NTU9OX05UV0tfTUFDX1NFVCk7CisKKwkJZndjbWQuc2V0LT5wYXJhbXMucmVxdWVzdC5pbnZhbGlkYXRlID0gMDsKKwkJZndjbWQuc2V0LT5wYXJhbXMucmVxdWVzdC5tYWMxID0gKG1hYzEgPyAxIDogMCk7CisJCWZ3Y21kLnNldC0+cGFyYW1zLnJlcXVlc3QucG9ydCA9IChwb3J0MSA/IDEgOiAwKTsKKwkJZndjbWQuc2V0LT5wYXJhbXMucmVxdWVzdC50eXBlID0gdHlwZTsKKworCQkvKiBDb3B5IHRoZSBtYWMgYWRkcmVzcyB0byBzZXQuICovCisJCWZ3Y21kLnNldC0+cGFyYW1zLnJlcXVlc3QubWFjLlNpemVPZlN0cnVjdHVyZSA9CisJCQkgICAgc2l6ZW9mKGZ3Y21kLnNldC0+cGFyYW1zLnJlcXVlc3QubWFjKTsKKwkJbWVtY3B5KGZ3Y21kLnNldC0+cGFyYW1zLnJlcXVlc3QubWFjLk1BQ0FkZHJlc3MsCisJCQltYWNfYWRkcmVzcywgRVRIX0FMRU4pOworCisJCS8qIFBvc3QgdGhlIGYvdyBjb21tYW5kICovCisJCXN0YXR1cyA9IGJlX2Z1bmN0aW9uX3Bvc3RfbWNjX3dyYihwZm9iLCB3cmIsIE5VTEwsCisJCQkJY2IsIGNiX2NvbnRleHQsIE5VTEwsIE5VTEwsIGZ3Y21kLnNldCwgTlVMTCk7CisKKwl9IGVsc2UgeworCisJCS8qCisJCSAqIFByZXBhcmVzIGFuIGVtYmVkZGVkIGZ3Y21kLCBpbmNsdWRpbmcKKwkJICogcmVxdWVzdC9yZXNwb25zZSBzaXplcy4KKwkJICovCisJCWZ3Y21kLnF1ZXJ5ID0gQkVfUFJFUEFSRV9FTUJFRERFRF9GV0NNRChwZm9iLAorCQkJCQkgICAgICAgd3JiLCBDT01NT05fTlRXS19NQUNfUVVFUlkpOworCisJCWZ3Y21kLnF1ZXJ5LT5wYXJhbXMucmVxdWVzdC5tYWMxID0gKG1hYzEgPyAxIDogMCk7CisJCWZ3Y21kLnF1ZXJ5LT5wYXJhbXMucmVxdWVzdC5wb3J0ID0gKHBvcnQxID8gMSA6IDApOworCQlmd2NtZC5xdWVyeS0+cGFyYW1zLnJlcXVlc3QudHlwZSA9IHR5cGU7CisJCWZ3Y21kLnF1ZXJ5LT5wYXJhbXMucmVxdWVzdC5wZXJtYW5lbnQgPSBwZXJtYW5lbnQ7CisKKwkJcmMubGVuZ3RoID0gRklFTERfU0laRU9GKHN0cnVjdCBGV0NNRF9DT01NT05fTlRXS19NQUNfUVVFUlksCisJCQkJCQlwYXJhbXMucmVzcG9uc2UubWFjLk1BQ0FkZHJlc3MpOworCQlyYy5md2NtZF9vZmZzZXQgPSBvZmZzZXRvZihzdHJ1Y3QgRldDTURfQ09NTU9OX05UV0tfTUFDX1FVRVJZLAorCQkJCQkJcGFyYW1zLnJlc3BvbnNlLm1hYy5NQUNBZGRyZXNzKTsKKwkJcmMudmEgPSBtYWNfYWRkcmVzczsKKwkJLyogUG9zdCB0aGUgZi93IGNvbW1hbmQgKHdpdGggYSBjb3B5IGZvciB0aGUgcmVzcG9uc2UpICovCisJCXN0YXR1cyA9IGJlX2Z1bmN0aW9uX3Bvc3RfbWNjX3dyYihwZm9iLCB3cmIsIE5VTEwsIGNiLAorCQkJCWNiX2NvbnRleHQsIE5VTEwsIE5VTEwsIGZ3Y21kLnF1ZXJ5LCAmcmMpOworCX0KKworCWlmIChzdGF0dXMgPCAwKSB7CisJCVRSQUNFKERMX0VSUiwgIm1hYyBzZXQvcXVlcnkgZmFpbGVkLiIpOworCQlnb3RvIEVycm9yOworCX0KKworRXJyb3I6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGZvYi0+cG9zdF9sb2NrLCBpcnFsKTsKKwlpZiAocGZvYi0+cGVuZF9xdWV1ZV9kcml2aW5nICYmIHBmb2ItPm1jYykgeworCQlwZm9iLT5wZW5kX3F1ZXVlX2RyaXZpbmcgPSAwOworCQliZV9kcml2ZV9tY2Nfd3JiX3F1ZXVlKHBmb2ItPm1jYyk7CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgICAgVGhpcyByb3V0aW5lIHdyaXRlcyBkYXRhIHRvIGNvbnRleHQgbWVtb3J5LgorCisgICAgcGZvYiAgLSBGdW5jdGlvbiBvYmplY3QgaGFuZGxlLgorICAgIG1hY190YWJsZSAgICAgLSBTZXQgdG8gdGhlIDEyOC1iaXQgbXVsdGljYXN0IGFkZHJlc3MgaGFzaCB0YWJsZS4KKworICAgIFJldHVybnMgQkVfU1VDQ0VTUyBpZiBzdWNjZXNzZnVsbCwgb3RoZXJ3aXNlIGEgdXNlZnVsIGludCBpcyByZXR1cm5lZC4KKworICAgIElSUUw6IDwgRElTUEFUQ0hfTEVWRUwKKyovCisKK2ludCBiZV9yeGZfbXVsdGljYXN0X2NvbmZpZyhzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwZm9iLAorCQlib29sIHByb21pc2N1b3VzLCB1MzIgbnVtLCB1OCAqbWFjX3RhYmxlLAorCQltY2Nfd3JiX2NxZV9jYWxsYmFjayBjYiwJLyogb3B0aW9uYWwgKi8KKwkJdm9pZCAqY2JfY29udGV4dCwKKwkJc3RydWN0IGJlX211bHRpY2FzdF9xX2N0eHQgKnFfY3R4dCkKK3sKKwlpbnQgc3RhdHVzID0gQkVfU1VDQ0VTUzsKKwlzdHJ1Y3QgRldDTURfQ09NTU9OX05UV0tfTVVMVElDQVNUX1NFVCAqZndjbWQgPSBOVUxMOworCXN0cnVjdCBNQ0NfV1JCX0FNQVAgKndyYiA9IE5VTEw7CisJc3RydWN0IGJlX2dlbmVyaWNfcV9jdHh0ICpnZW5lcmljX2N0eHQgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgaXJxbDsKKworCUFTU0VSVChudW0gPD0gQVJSQVlfU0laRShmd2NtZC0+cGFyYW1zLnJlcXVlc3QubWFjKSk7CisKKwlpZiAobnVtID4gQVJSQVlfU0laRShmd2NtZC0+cGFyYW1zLnJlcXVlc3QubWFjKSkgeworCQlUUkFDRShETF9FUlIsICJUb28gbWFueSBtdWx0aWNhc3QgYWRkcmVzc2VzLiBCRSBzdXBwb3J0cyAlZC4iLAorCQkgICAgICAoaW50KSBBUlJBWV9TSVpFKGZ3Y21kLT5wYXJhbXMucmVxdWVzdC5tYWMpKTsKKwkJcmV0dXJuIEJFX05PVF9PSzsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcGZvYi0+cG9zdF9sb2NrLCBpcnFsKTsKKworCXdyYiA9IGJlX2Z1bmN0aW9uX3BlZWtfbWNjX3dyYihwZm9iKTsKKwlpZiAoIXdyYikgeworCQlpZiAocV9jdHh0ICYmIGNiKSB7CisJCQl3cmIgPSAoc3RydWN0IE1DQ19XUkJfQU1BUCAqKSAmcV9jdHh0LT53cmJfaGVhZGVyOworCQkJZ2VuZXJpY19jdHh0ID0gKHN0cnVjdCBiZV9nZW5lcmljX3FfY3R4dCAqKSBxX2N0eHQ7CisJCQlnZW5lcmljX2N0eHQtPmNvbnRleHQuYnl0ZXMgPSBzaXplb2YoKnFfY3R4dCk7CisJCX0gZWxzZSB7CisJCQlzdGF0dXMgPSBCRV9TVEFUVVNfTk9fTUNDX1dSQjsKKwkJCWdvdG8gRXJyb3I7CisJCX0KKwl9CisJLyogUHJlcGFyZXMgYW4gZW1iZWRkZWQgZndjbWQsIGluY2x1ZGluZyByZXF1ZXN0L3Jlc3BvbnNlIHNpemVzLiAqLworCWZ3Y21kID0gQkVfUFJFUEFSRV9FTUJFRERFRF9GV0NNRChwZm9iLCB3cmIsIENPTU1PTl9OVFdLX01VTFRJQ0FTVF9TRVQpOworCisJZndjbWQtPnBhcmFtcy5yZXF1ZXN0LnByb21pc2N1b3VzID0gcHJvbWlzY3VvdXM7CisJaWYgKCFwcm9taXNjdW91cykgeworCQlmd2NtZC0+cGFyYW1zLnJlcXVlc3QubnVtX21hYyA9IG51bTsKKwkJaWYgKG51bSA+IDApIHsKKwkJCUFTU0VSVChtYWNfdGFibGUpOworCQkJbWVtY3B5KGZ3Y21kLT5wYXJhbXMucmVxdWVzdC5tYWMsCisJCQkJCQltYWNfdGFibGUsIEVUSF9BTEVOICogbnVtKTsKKwkJfQorCX0KKworCS8qIFBvc3QgdGhlIGYvdyBjb21tYW5kICovCisJc3RhdHVzID0gYmVfZnVuY3Rpb25fcG9zdF9tY2Nfd3JiKHBmb2IsIHdyYiwgZ2VuZXJpY19jdHh0LAorCQkJY2IsIGNiX2NvbnRleHQsIE5VTEwsIE5VTEwsIGZ3Y21kLCBOVUxMKTsKKwlpZiAoc3RhdHVzIDwgMCkgeworCQlUUkFDRShETF9FUlIsICJtdWx0aWNhc3QgZndjbWQgZmFpbGVkLiIpOworCQlnb3RvIEVycm9yOworCX0KKworRXJyb3I6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGZvYi0+cG9zdF9sb2NrLCBpcnFsKTsKKwlpZiAocGZvYi0+cGVuZF9xdWV1ZV9kcml2aW5nICYmIHBmb2ItPm1jYykgeworCQlwZm9iLT5wZW5kX3F1ZXVlX2RyaXZpbmcgPSAwOworCQliZV9kcml2ZV9tY2Nfd3JiX3F1ZXVlKHBmb2ItPm1jYyk7CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgICAgVGhpcyByb3V0aW5lIGFkZHMgb3IgcmVtb3ZlcyBhIHZsYW4gdGFnIGZyb20gdGhlIHJ4ZiB0YWJsZS4KKworICAgIEZ1bmN0aW9uT2JqZWN0ICAtIEZ1bmN0aW9uIG9iamVjdCBoYW5kbGUuCisgICAgVkxhblRhZyAgICAgICAgIC0gVkxhbiB0YWcgdG8gYWRkIG9yIHJlbW92ZS4KKyAgICBBZGQgICAgICAgICAgICAgLSBTZXQgdG8gVFJVRSBpZiB0aGlzIHdpbGwgYWRkIGEgdmxhbiB0YWcKKworICAgIFJldHVybnMgQkVfU1VDQ0VTUyBpZiBzdWNjZXNzZnVsbCwgb3RoZXJ3aXNlIGEgdXNlZnVsIGludCBpcyByZXR1cm5lZC4KKworICAgIElSUUw6IDwgRElTUEFUQ0hfTEVWRUwKKyovCitpbnQgYmVfcnhmX3ZsYW5fY29uZmlnKHN0cnVjdCBiZV9mdW5jdGlvbl9vYmplY3QgKnBmb2IsCisJCWJvb2wgcHJvbWlzY3VvdXMsIHUzMiBudW0sIHUxNiAqdmxhbl90YWdfYXJyYXksCisJCW1jY193cmJfY3FlX2NhbGxiYWNrIGNiLAkvKiBvcHRpb25hbCAqLworCQl2b2lkICpjYl9jb250ZXh0LAorCQlzdHJ1Y3QgYmVfdmxhbl9xX2N0eHQgKnFfY3R4dCkJLyogb3B0aW9uYWwgKi8KK3sKKwlpbnQgc3RhdHVzID0gQkVfU1VDQ0VTUzsKKwlzdHJ1Y3QgRldDTURfQ09NTU9OX05UV0tfVkxBTl9DT05GSUcgKmZ3Y21kID0gTlVMTDsKKwlzdHJ1Y3QgTUNDX1dSQl9BTUFQICp3cmIgPSBOVUxMOworCXN0cnVjdCBiZV9nZW5lcmljX3FfY3R4dCAqZ2VuZXJpY19jdHh0ID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIGlycWw7CisKKwlpZiAobnVtID4gQVJSQVlfU0laRShmd2NtZC0+cGFyYW1zLnJlcXVlc3Qudmxhbl90YWcpKSB7CisJCVRSQUNFKERMX0VSUiwgIlRvbyBtYW55IFZMQU4gdGFncy4iKTsKKwkJcmV0dXJuIEJFX05PVF9PSzsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcGZvYi0+cG9zdF9sb2NrLCBpcnFsKTsKKworCXdyYiA9IGJlX2Z1bmN0aW9uX3BlZWtfbWNjX3dyYihwZm9iKTsKKwlpZiAoIXdyYikgeworCQlpZiAocV9jdHh0ICYmIGNiKSB7CisJCQl3cmIgPSAoc3RydWN0IE1DQ19XUkJfQU1BUCAqKSAmcV9jdHh0LT53cmJfaGVhZGVyOworCQkJZ2VuZXJpY19jdHh0ID0gKHN0cnVjdCBiZV9nZW5lcmljX3FfY3R4dCAqKSBxX2N0eHQ7CisJCQlnZW5lcmljX2N0eHQtPmNvbnRleHQuYnl0ZXMgPSBzaXplb2YoKnFfY3R4dCk7CisJCX0gZWxzZSB7CisJCQlzdGF0dXMgPSBCRV9TVEFUVVNfTk9fTUNDX1dSQjsKKwkJCWdvdG8gRXJyb3I7CisJCX0KKwl9CisJLyogUHJlcGFyZXMgYW4gZW1iZWRkZWQgZndjbWQsIGluY2x1ZGluZyByZXF1ZXN0L3Jlc3BvbnNlIHNpemVzLiAqLworCWZ3Y21kID0gQkVfUFJFUEFSRV9FTUJFRERFRF9GV0NNRChwZm9iLCB3cmIsIENPTU1PTl9OVFdLX1ZMQU5fQ09ORklHKTsKKworCWZ3Y21kLT5wYXJhbXMucmVxdWVzdC5wcm9taXNjdW91cyA9IHByb21pc2N1b3VzOworCWlmICghcHJvbWlzY3VvdXMpIHsKKwkJZndjbWQtPnBhcmFtcy5yZXF1ZXN0Lm51bV92bGFuID0gbnVtOworCisJCWlmIChudW0gPiAwKSB7CisJCQlBU1NFUlQodmxhbl90YWdfYXJyYXkpOworCQkJbWVtY3B5KGZ3Y21kLT5wYXJhbXMucmVxdWVzdC52bGFuX3RhZywgdmxhbl90YWdfYXJyYXksCisJCQkJICBudW0gKiBzaXplb2Yodmxhbl90YWdfYXJyYXlbMF0pKTsKKwkJfQorCX0KKworCS8qIFBvc3QgdGhlIGNvbW1hZG4gKi8KKwlzdGF0dXMgPSBiZV9mdW5jdGlvbl9wb3N0X21jY193cmIocGZvYiwgd3JiLCBnZW5lcmljX2N0eHQsCisJCQljYiwgY2JfY29udGV4dCwgTlVMTCwgTlVMTCwgZndjbWQsIE5VTEwpOworCWlmIChzdGF0dXMgPCAwKSB7CisJCVRSQUNFKERMX0VSUiwgInZsYW4gZndjbWQgZmFpbGVkLiIpOworCQlnb3RvIEVycm9yOworCX0KKworRXJyb3I6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGZvYi0+cG9zdF9sb2NrLCBpcnFsKTsKKwlpZiAocGZvYi0+cGVuZF9xdWV1ZV9kcml2aW5nICYmIHBmb2ItPm1jYykgeworCQlwZm9iLT5wZW5kX3F1ZXVlX2RyaXZpbmcgPSAwOworCQliZV9kcml2ZV9tY2Nfd3JiX3F1ZXVlKHBmb2ItPm1jYyk7CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKKworaW50IGJlX3J4Zl9saW5rX3N0YXR1cyhzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwZm9iLAorCQlzdHJ1Y3QgQkVfTElOS19TVEFUVVMgKmxpbmtfc3RhdHVzLAorCQltY2Nfd3JiX2NxZV9jYWxsYmFjayBjYiwKKwkJdm9pZCAqY2JfY29udGV4dCwKKwkJc3RydWN0IGJlX2xpbmtfc3RhdHVzX3FfY3R4dCAqcV9jdHh0KQoreworCXN0cnVjdCBGV0NNRF9DT01NT05fTlRXS19MSU5LX1NUQVRVU19RVUVSWSAqZndjbWQgPSBOVUxMOworCXN0cnVjdCBNQ0NfV1JCX0FNQVAgKndyYiA9IE5VTEw7CisJaW50IHN0YXR1cyA9IDA7CisJc3RydWN0IGJlX2dlbmVyaWNfcV9jdHh0ICpnZW5lcmljX2N0eHQgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgaXJxbDsKKwlzdHJ1Y3QgYmVfbWNjX3dyYl9yZXNwb25zZV9jb3B5IHJjOworCisJQVNTRVJUKGxpbmtfc3RhdHVzKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwZm9iLT5wb3N0X2xvY2ssIGlycWwpOworCisJd3JiID0gYmVfZnVuY3Rpb25fcGVla19tY2Nfd3JiKHBmb2IpOworCisJaWYgKCF3cmIpIHsKKwkJaWYgKHFfY3R4dCAmJiBjYikgeworCQkJd3JiID0gKHN0cnVjdCBNQ0NfV1JCX0FNQVAgKikgJnFfY3R4dC0+d3JiX2hlYWRlcjsKKwkJCWdlbmVyaWNfY3R4dCA9IChzdHJ1Y3QgYmVfZ2VuZXJpY19xX2N0eHQgKikgcV9jdHh0OworCQkJZ2VuZXJpY19jdHh0LT5jb250ZXh0LmJ5dGVzID0gc2l6ZW9mKCpxX2N0eHQpOworCQl9IGVsc2UgeworCQkJc3RhdHVzID0gQkVfU1RBVFVTX05PX01DQ19XUkI7CisJCQlnb3RvIEVycm9yOworCQl9CisJfQorCS8qIFByZXBhcmVzIGFuIGVtYmVkZGVkIGZ3Y21kLCBpbmNsdWRpbmcgcmVxdWVzdC9yZXNwb25zZSBzaXplcy4gKi8KKwlmd2NtZCA9IEJFX1BSRVBBUkVfRU1CRURERURfRldDTUQocGZvYiwgd3JiLAorCQkJCQkgICAgICAgQ09NTU9OX05UV0tfTElOS19TVEFUVVNfUVVFUlkpOworCisJcmMubGVuZ3RoID0gRklFTERfU0laRU9GKHN0cnVjdCBGV0NNRF9DT01NT05fTlRXS19MSU5LX1NUQVRVU19RVUVSWSwKKwkJCQkJcGFyYW1zLnJlc3BvbnNlKTsKKwlyYy5md2NtZF9vZmZzZXQgPSBvZmZzZXRvZihzdHJ1Y3QgRldDTURfQ09NTU9OX05UV0tfTElOS19TVEFUVVNfUVVFUlksCisJCQkJCXBhcmFtcy5yZXNwb25zZSk7CisJcmMudmEgPSBsaW5rX3N0YXR1czsKKwkvKiBQb3N0IG9yIHF1ZXVlIHRoZSBmL3cgY29tbWFuZCAqLworCXN0YXR1cyA9IGJlX2Z1bmN0aW9uX3Bvc3RfbWNjX3dyYihwZm9iLCB3cmIsIGdlbmVyaWNfY3R4dCwKKwkJCWNiLCBjYl9jb250ZXh0LCBOVUxMLCBOVUxMLCBmd2NtZCwgJnJjKTsKKworCWlmIChzdGF0dXMgPCAwKSB7CisJCVRSQUNFKERMX0VSUiwgImxpbmsgc3RhdHVzIGZ3Y21kIGZhaWxlZC4iKTsKKwkJZ290byBFcnJvcjsKKwl9CisKK0Vycm9yOgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBmb2ItPnBvc3RfbG9jaywgaXJxbCk7CisJaWYgKHBmb2ItPnBlbmRfcXVldWVfZHJpdmluZyAmJiBwZm9iLT5tY2MpIHsKKwkJcGZvYi0+cGVuZF9xdWV1ZV9kcml2aW5nID0gMDsKKwkJYmVfZHJpdmVfbWNjX3dyYl9xdWV1ZShwZm9iLT5tY2MpOworCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCitpbnQKK2JlX3J4Zl9xdWVyeV9ldGhfc3RhdGlzdGljcyhzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwZm9iLAorCQkgICAgc3RydWN0IEZXQ01EX0VUSF9HRVRfU1RBVElTVElDUyAqdmFfZm9yX2Z3Y21kLAorCQkgICAgdTY0IHBhX2Zvcl9md2NtZCwgbWNjX3dyYl9jcWVfY2FsbGJhY2sgY2IsCisJCSAgICB2b2lkICpjYl9jb250ZXh0LAorCQkgICAgc3RydWN0IGJlX25vbmVtYmVkZGVkX3FfY3R4dCAqcV9jdHh0KQoreworCXN0cnVjdCBNQ0NfV1JCX0FNQVAgKndyYiA9IE5VTEw7CisJaW50IHN0YXR1cyA9IDA7CisJc3RydWN0IGJlX2dlbmVyaWNfcV9jdHh0ICpnZW5lcmljX2N0eHQgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgaXJxbDsKKworCUFTU0VSVCh2YV9mb3JfZndjbWQpOworCUFTU0VSVChwYV9mb3JfZndjbWQpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBmb2ItPnBvc3RfbG9jaywgaXJxbCk7CisKKwl3cmIgPSBiZV9mdW5jdGlvbl9wZWVrX21jY193cmIocGZvYik7CisKKwlpZiAoIXdyYikgeworCQlpZiAocV9jdHh0ICYmIGNiKSB7CisJCQl3cmIgPSAoc3RydWN0IE1DQ19XUkJfQU1BUCAqKSAmcV9jdHh0LT53cmJfaGVhZGVyOworCQkJZ2VuZXJpY19jdHh0ID0gKHN0cnVjdCBiZV9nZW5lcmljX3FfY3R4dCAqKSBxX2N0eHQ7CisJCQlnZW5lcmljX2N0eHQtPmNvbnRleHQuYnl0ZXMgPSBzaXplb2YoKnFfY3R4dCk7CisJCX0gZWxzZSB7CisJCQlzdGF0dXMgPSBCRV9TVEFUVVNfTk9fTUNDX1dSQjsKKwkJCWdvdG8gRXJyb3I7CisJCX0KKwl9CisKKwlUUkFDRShETF9JTkZPLCAiUXVlcnkgZXRoIHN0YXRzLiBmd2NtZCB2YTolcCBwYToweCUwOHhfJTA4eCIsCisJICAgICAgdmFfZm9yX2Z3Y21kLCB1cHBlcl8zMl9iaXRzKHBhX2Zvcl9md2NtZCksICh1MzIpcGFfZm9yX2Z3Y21kKTsKKworCS8qIFByZXBhcmVzIGFuIGVtYmVkZGVkIGZ3Y21kLCBpbmNsdWRpbmcgcmVxdWVzdC9yZXNwb25zZSBzaXplcy4gKi8KKwl2YV9mb3JfZndjbWQgPSBCRV9QUkVQQVJFX05PTkVNQkVEREVEX0ZXQ01EKHBmb2IsIHdyYiwKKwkJCSAgdmFfZm9yX2Z3Y21kLCBwYV9mb3JfZndjbWQsIEVUSF9HRVRfU1RBVElTVElDUyk7CisKKwkvKiBQb3N0IHRoZSBmL3cgY29tbWFuZCAqLworCXN0YXR1cyA9IGJlX2Z1bmN0aW9uX3Bvc3RfbWNjX3dyYihwZm9iLCB3cmIsIGdlbmVyaWNfY3R4dCwKKwkJY2IsIGNiX2NvbnRleHQsIE5VTEwsIE5VTEwsIHZhX2Zvcl9md2NtZCwgTlVMTCk7CisJaWYgKHN0YXR1cyA8IDApIHsKKwkJVFJBQ0UoRExfRVJSLCAiZXRoIHN0YXRzIGZ3Y21kIGZhaWxlZC4iKTsKKwkJZ290byBFcnJvcjsKKwl9CisKK0Vycm9yOgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBmb2ItPnBvc3RfbG9jaywgaXJxbCk7CisJaWYgKHBmb2ItPnBlbmRfcXVldWVfZHJpdmluZyAmJiBwZm9iLT5tY2MpIHsKKwkJcGZvYi0+cGVuZF9xdWV1ZV9kcml2aW5nID0gMDsKKwkJYmVfZHJpdmVfbWNjX3dyYl9xdWV1ZShwZm9iLT5tY2MpOworCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCitpbnQKK2JlX3J4Zl9wcm9taXNjdW91cyhzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwZm9iLAorCQkgICBib29sIGVuYWJsZV9wb3J0MCwgYm9vbCBlbmFibGVfcG9ydDEsCisJCSAgIG1jY193cmJfY3FlX2NhbGxiYWNrIGNiLCB2b2lkICpjYl9jb250ZXh0LAorCQkgICBzdHJ1Y3QgYmVfcHJvbWlzY3VvdXNfcV9jdHh0ICpxX2N0eHQpCit7CisJc3RydWN0IEZXQ01EX0VUSF9QUk9NSVNDVU9VUyAqZndjbWQgPSBOVUxMOworCXN0cnVjdCBNQ0NfV1JCX0FNQVAgKndyYiA9IE5VTEw7CisJaW50IHN0YXR1cyA9IDA7CisJc3RydWN0IGJlX2dlbmVyaWNfcV9jdHh0ICpnZW5lcmljX2N0eHQgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgaXJxbDsKKworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBmb2ItPnBvc3RfbG9jaywgaXJxbCk7CisKKwl3cmIgPSBiZV9mdW5jdGlvbl9wZWVrX21jY193cmIocGZvYik7CisKKwlpZiAoIXdyYikgeworCQlpZiAocV9jdHh0ICYmIGNiKSB7CisJCQl3cmIgPSAoc3RydWN0IE1DQ19XUkJfQU1BUCAqKSAmcV9jdHh0LT53cmJfaGVhZGVyOworCQkJZ2VuZXJpY19jdHh0ID0gKHN0cnVjdCBiZV9nZW5lcmljX3FfY3R4dCAqKSBxX2N0eHQ7CisJCQlnZW5lcmljX2N0eHQtPmNvbnRleHQuYnl0ZXMgPSBzaXplb2YoKnFfY3R4dCk7CisJCX0gZWxzZSB7CisJCQlzdGF0dXMgPSBCRV9TVEFUVVNfTk9fTUNDX1dSQjsKKwkJCWdvdG8gRXJyb3I7CisJCX0KKwl9CisJLyogUHJlcGFyZXMgYW4gZW1iZWRkZWQgZndjbWQsIGluY2x1ZGluZyByZXF1ZXN0L3Jlc3BvbnNlIHNpemVzLiAqLworCWZ3Y21kID0gQkVfUFJFUEFSRV9FTUJFRERFRF9GV0NNRChwZm9iLCB3cmIsIEVUSF9QUk9NSVNDVU9VUyk7CisKKwlmd2NtZC0+cGFyYW1zLnJlcXVlc3QucG9ydDBfcHJvbWlzY3VvdXMgPSBlbmFibGVfcG9ydDA7CisJZndjbWQtPnBhcmFtcy5yZXF1ZXN0LnBvcnQxX3Byb21pc2N1b3VzID0gZW5hYmxlX3BvcnQxOworCisJLyogUG9zdCB0aGUgZi93IGNvbW1hbmQgKi8KKwlzdGF0dXMgPSBiZV9mdW5jdGlvbl9wb3N0X21jY193cmIocGZvYiwgd3JiLCBnZW5lcmljX2N0eHQsCisJCQljYiwgY2JfY29udGV4dCwgTlVMTCwgTlVMTCwgZndjbWQsIE5VTEwpOworCisJaWYgKHN0YXR1cyA8IDApIHsKKwkJVFJBQ0UoRExfRVJSLCAicHJvbWlzY3VvdXMgZndjbWQgZmFpbGVkLiIpOworCQlnb3RvIEVycm9yOworCX0KKworRXJyb3I6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGZvYi0+cG9zdF9sb2NrLCBpcnFsKTsKKwlpZiAocGZvYi0+cGVuZF9xdWV1ZV9kcml2aW5nICYmIHBmb2ItPm1jYykgeworCQlwZm9iLT5wZW5kX3F1ZXVlX2RyaXZpbmcgPSAwOworCQliZV9kcml2ZV9tY2Nfd3JiX3F1ZXVlKHBmb2ItPm1jYyk7CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKKworLyoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRnVuY3Rpb246IGJlX3J4Zl9maWx0ZXJfY29uZmlnCisgKiAgIENvbmZpZ3VyZXMgQmxhZGVFbmdpbmUgZXRoZXJuZXQgcmVjZWl2ZSBmaWx0ZXIgc2V0dGluZ3MuCisgKiBwZm9iICAgIC0KKyAqIHNldHRpbmdzICAgICAgICAgICAtIFBvaW50ZXIgdG8gdGhlIHJlcXVlc3RlZCBmaWx0ZXIgc2V0dGluZ3MuCisgKiAJCQlUaGUgcmVzcG9uc2UgZnJvbSBCbGFkZUVuZ2luZSB3aWxsIGJlIHBsYWNlZCBiYWNrCisgKiAJCQlpbiB0aGlzIHN0cnVjdHVyZS4KKyAqIGNiICAgICAgICAgICAgICAgICAtIG9wdGlvbmFsCisgKiBjYl9jb250ZXh0ICAgICAgICAgLSBvcHRpb25hbAorICogcV9jdHh0ICAgICAgICAgICAgIC0gT3B0aW9uYWwuIFBvaW50ZXIgdG8gYSBwcmV2aW91c2x5IGFsbG9jYXRlZCBzdHJ1Y3QuCisgKiAJCQlJZiB0aGUgTUNDIFdSQiByaW5nIGlzIGZ1bGwsIHRoaXMgc3RydWN0dXJlIGlzCisgKiAJCQl1c2VkIHRvIHF1ZXVlIHRoZSBvcGVyYXRpb24uIEl0IHdpbGwgYmUgcG9zdGVkCisgKiAJCQl0byB0aGUgTUNDIHJpbmcgd2hlbiBzcGFjZSBiZWNvbWVzIGF2YWlsYWJsZS4gQWxsCisgKiAgICAgICAgICAgICAgICAgICAgICBxdWV1ZWQgY29tbWFuZHMgd2lsbCBiZSBwb3N0ZWQgdG8gdGhlIHJpbmcgaW4KKyAqICAgICAgICAgICAgICAgICAgICAgIHRoZSBvcmRlciB0aGV5IGFyZSByZWNlaXZlZC4gSXQgaXMgYWx3YXlzIHZhbGlkCisgKiAgICAgICAgICAgICAgICAgICAgICB0byBwYXNzIGEgcG9pbnRlciB0byBhIGdlbmVyaWMKKyAqICAgICAgICAgICAgICAgICAgICAgIGJlX2dlbmVyaWNfcV9jdHh0LiBIb3dldmVyLCB0aGUgc3BlY2lmaWMKKyAqICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQgc3RydWN0cyBhcmUgZ2VuZXJhbGx5IHNtYWxsZXIgdGhhbgorICogICAgICAgICAgICAgICAgICAgICAgdGhlIGdlbmVyaWMgc3RydWN0LgorICogcmV0dXJuIHBlbmRfc3RhdHVzIC0gQkVfU1VDQ0VTUyAoMCkgb24gc3VjY2Vzcy4KKyAqIAkJCUJFX1BFTkRJTkcgKHBvc3RpdmUgdmFsdWUpIGlmIHRoZSBGV0NNRAorICogICAgICAgICAgICAgICAgICAgICAgY29tcGxldGlvbiBpcyBwZW5kaW5nLiBOZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCitpbnQKK2JlX3J4Zl9maWx0ZXJfY29uZmlnKHN0cnVjdCBiZV9mdW5jdGlvbl9vYmplY3QgKnBmb2IsCisJCSAgICAgc3RydWN0IE5UV0tfUlhfRklMVEVSX1NFVFRJTkdTICpzZXR0aW5ncywKKwkJICAgICBtY2Nfd3JiX2NxZV9jYWxsYmFjayBjYiwgdm9pZCAqY2JfY29udGV4dCwKKwkJICAgICBzdHJ1Y3QgYmVfcnhmX2ZpbHRlcl9xX2N0eHQgKnFfY3R4dCkKK3sKKwlzdHJ1Y3QgRldDTURfQ09NTU9OX05UV0tfUlhfRklMVEVSICpmd2NtZCA9IE5VTEw7CisJc3RydWN0IE1DQ19XUkJfQU1BUCAqd3JiID0gTlVMTDsKKwlpbnQgc3RhdHVzID0gMDsKKwlzdHJ1Y3QgYmVfZ2VuZXJpY19xX2N0eHQgKmdlbmVyaWNfY3R4dCA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyBpcnFsOworCXN0cnVjdCBiZV9tY2Nfd3JiX3Jlc3BvbnNlX2NvcHkgcmM7CisKKwlBU1NFUlQoc2V0dGluZ3MpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBmb2ItPnBvc3RfbG9jaywgaXJxbCk7CisKKwl3cmIgPSBiZV9mdW5jdGlvbl9wZWVrX21jY193cmIocGZvYik7CisKKwlpZiAoIXdyYikgeworCQlpZiAocV9jdHh0ICYmIGNiKSB7CisJCQl3cmIgPSAoc3RydWN0IE1DQ19XUkJfQU1BUCAqKSAmcV9jdHh0LT53cmJfaGVhZGVyOworCQkJZ2VuZXJpY19jdHh0ID0gKHN0cnVjdCBiZV9nZW5lcmljX3FfY3R4dCAqKSBxX2N0eHQ7CisJCQlnZW5lcmljX2N0eHQtPmNvbnRleHQuYnl0ZXMgPSBzaXplb2YoKnFfY3R4dCk7CisJCX0gZWxzZSB7CisJCQlzdGF0dXMgPSBCRV9TVEFUVVNfTk9fTUNDX1dSQjsKKwkJCWdvdG8gRXJyb3I7CisJCX0KKwl9CisJLyogUHJlcGFyZXMgYW4gZW1iZWRkZWQgZndjbWQsIGluY2x1ZGluZyByZXF1ZXN0L3Jlc3BvbnNlIHNpemVzLiAqLworCWZ3Y21kID0gQkVfUFJFUEFSRV9FTUJFRERFRF9GV0NNRChwZm9iLCB3cmIsIENPTU1PTl9OVFdLX1JYX0ZJTFRFUik7CisJbWVtY3B5KCZmd2NtZC0+cGFyYW1zLnJlcXVlc3QsIHNldHRpbmdzLCBzaXplb2YoKnNldHRpbmdzKSk7CisKKwlyYy5sZW5ndGggPSBGSUVMRF9TSVpFT0Yoc3RydWN0IEZXQ01EX0NPTU1PTl9OVFdLX1JYX0ZJTFRFUiwKKwkJCQkJcGFyYW1zLnJlc3BvbnNlKTsKKwlyYy5md2NtZF9vZmZzZXQgPSBvZmZzZXRvZihzdHJ1Y3QgRldDTURfQ09NTU9OX05UV0tfUlhfRklMVEVSLAorCQkJCQlwYXJhbXMucmVzcG9uc2UpOworCXJjLnZhID0gc2V0dGluZ3M7CisJLyogUG9zdCBvciBxdWV1ZSB0aGUgZi93IGNvbW1hbmQgKi8KKwlzdGF0dXMgPSBiZV9mdW5jdGlvbl9wb3N0X21jY193cmIocGZvYiwgd3JiLCBnZW5lcmljX2N0eHQsCisJCQljYiwgY2JfY29udGV4dCwgTlVMTCwgTlVMTCwgZndjbWQsICZyYyk7CisKKwlpZiAoc3RhdHVzIDwgMCkgeworCQlUUkFDRShETF9FUlIsICJSWEYvRVJYIGZpbHRlciBjb25maWcgZndjbWQgZmFpbGVkLiIpOworCQlnb3RvIEVycm9yOworCX0KKworRXJyb3I6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGZvYi0+cG9zdF9sb2NrLCBpcnFsKTsKKwlpZiAocGZvYi0+cGVuZF9xdWV1ZV9kcml2aW5nICYmIHBmb2ItPm1jYykgeworCQlwZm9iLT5wZW5kX3F1ZXVlX2RyaXZpbmcgPSAwOworCQliZV9kcml2ZV9tY2Nfd3JiX3F1ZXVlKHBmb2ItPm1jYyk7CisJfQorCXJldHVybiBzdGF0dXM7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvZXR4X2NvbnRleHQuaCBiL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9ldHhfY29udGV4dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1NGZiZTUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvZXR4X2NvbnRleHQuaApAQCAtMCwwICsxLDU1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA1IC0gMjAwOCBTZXJ2ZXJFbmdpbmVzCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBUaGUgZnVsbCBHTlUgR2VuZXJhbAorICogUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlIGZpbGUgY2FsbGVkIENPUFlJTkcuCisgKgorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqIGxpbnV4LWRyaXZlcnNAc2VydmVyZW5naW5lcy5jb20KKyAqCisgKiBTZXJ2ZXJFbmdpbmVzCisgKiAyMDkgTi4gRmFpciBPYWtzIEF2ZQorICogU3Vubnl2YWxlLCBDQSA5NDA4NQorICovCisvKgorICogQXV0b2dlbmVyYXRlZCBieSBzcmNnZW4gdmVyc2lvbjogMDEyNworICovCisjaWZuZGVmIF9fZXR4X2NvbnRleHRfYW1hcF9oX18KKyNkZWZpbmUgX19ldHhfY29udGV4dF9hbWFwX2hfXworCisvKiBFVFggcmluZyAgY29udGV4dCBzdHJ1Y3R1cmUuICovCitzdHJ1Y3QgQkVfRVRYX0NPTlRFWFRfQU1BUCB7CisJdTggdHhfY2lkeFsxMV07CS8qIERXT1JEIDAgKi8KKwl1OCByc3ZkMFs1XTsJLyogRFdPUkQgMCAqLworCXU4IHJzdmQxWzE2XTsJLyogRFdPUkQgMCAqLworCXU4IHR4X3BpZHhbMTFdOwkvKiBEV09SRCAxICovCisJdTggcnN2ZDI7CQkvKiBEV09SRCAxICovCisJdTggdHhfcmluZ19zaXplWzRdOwkvKiBEV09SRCAxICovCisJdTggcGRfaWRbNV07CS8qIERXT1JEIDEgKi8KKwl1OCBwZF9pZF9ub3RfdmFsaWQ7CS8qIERXT1JEIDEgKi8KKwl1OCBjcV9pZF9zZW5kWzEwXTsJLyogRFdPUkQgMSAqLworCXU4IHJzdmQzWzMyXTsJLyogRFdPUkQgMiAqLworCXU4IHJzdmQ0WzMyXTsJLyogRFdPUkQgMyAqLworCXU4IGN1cl9ieXRlc1szMl07CS8qIERXT1JEIDQgKi8KKwl1OCBtYXhfYnl0ZXNbMzJdOwkvKiBEV09SRCA1ICovCisJdTggdGltZV9zdGFtcFszMl07CS8qIERXT1JEIDYgKi8KKwl1OCByc3ZkNVsxMV07CS8qIERXT1JEIDcgKi8KKwl1OCBmdW5jOwkJLyogRFdPUkQgNyAqLworCXU4IHJzdmQ2WzIwXTsJLyogRFdPUkQgNyAqLworCXU4IGN1cl90eGRfY291bnRbMzJdOwkvKiBEV09SRCA4ICovCisJdTggbWF4X3R4ZF9jb3VudFszMl07CS8qIERXT1JEIDkgKi8KKwl1OCByc3ZkN1szMl07CS8qIERXT1JEIDEwICovCisJdTggcnN2ZDhbMzJdOwkvKiBEV09SRCAxMSAqLworCXU4IHJzdmQ5WzMyXTsJLyogRFdPUkQgMTIgKi8KKwl1OCByc3ZkMTBbMzJdOwkvKiBEV09SRCAxMyAqLworCXU4IHJzdmQxMVszMl07CS8qIERXT1JEIDE0ICovCisJdTggcnN2ZDEyWzMyXTsJLyogRFdPUkQgMTUgKi8KK30gX19wYWNrZWQ7CitzdHJ1Y3QgRVRYX0NPTlRFWFRfQU1BUCB7CisJdTMyIGR3WzE2XTsKK307CisKKyNlbmRpZiAvKiBfX2V0eF9jb250ZXh0X2FtYXBfaF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvZnVuY29iai5jIGIvZHJpdmVycy9zdGFnaW5nL2JlbmV0L2Z1bmNvYmouYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjU3ZWI1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JlbmV0L2Z1bmNvYmouYwpAQCAtMCwwICsxLDU2NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNSAtIDIwMDggU2VydmVyRW5naW5lcworICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgVGhlIGZ1bGwgR05VIEdlbmVyYWwKKyAqIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZSBmaWxlIGNhbGxlZCBDT1BZSU5HLgorICoKKyAqIENvbnRhY3QgSW5mb3JtYXRpb246CisgKiBsaW51eC1kcml2ZXJzQHNlcnZlcmVuZ2luZXMuY29tCisgKgorICogU2VydmVyRW5naW5lcworICogMjA5IE4uIEZhaXIgT2FrcyBBdmUKKyAqIFN1bm55dmFsZSwgQ0EgOTQwODUKKyAqLworI2luY2x1ZGUgImh3bGliLmgiCisjaW5jbHVkZSAiYmVzdGF0dXMuaCIKKworCitpbnQKK2JlX2Z1bmN0aW9uX2ludGVybmFsX3F1ZXJ5X2Zpcm13YXJlX2NvbmZpZyhzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwZm9iLAorCQkJCSAgIHN0cnVjdCBCRV9GSVJNV0FSRV9DT05GSUcgKmNvbmZpZykKK3sKKwlzdHJ1Y3QgRldDTURfQ09NTU9OX0ZJUk1XQVJFX0NPTkZJRyAqZndjbWQgPSBOVUxMOworCXN0cnVjdCBNQ0NfV1JCX0FNQVAgKndyYiA9IE5VTEw7CisJaW50IHN0YXR1cyA9IDA7CisJdW5zaWduZWQgbG9uZyBpcnFsOworCXN0cnVjdCBiZV9tY2Nfd3JiX3Jlc3BvbnNlX2NvcHkgcmM7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcGZvYi0+cG9zdF9sb2NrLCBpcnFsKTsKKworCXdyYiA9IGJlX2Z1bmN0aW9uX3BlZWtfbWNjX3dyYihwZm9iKTsKKwlpZiAoIXdyYikgeworCQlUUkFDRShETF9FUlIsICJNQ0Mgd3JiIHBlZWsgZmFpbGVkLiIpOworCQlzdGF0dXMgPSBCRV9TVEFUVVNfTk9fTUNDX1dSQjsKKwkJZ290byBlcnJvcjsKKwl9CisJLyogUHJlcGFyZXMgYW4gZW1iZWRkZWQgZndjbWQsIGluY2x1ZGluZyByZXF1ZXN0L3Jlc3BvbnNlIHNpemVzLiAqLworCWZ3Y21kID0gQkVfUFJFUEFSRV9FTUJFRERFRF9GV0NNRChwZm9iLCB3cmIsIENPTU1PTl9GSVJNV0FSRV9DT05GSUcpOworCisJcmMubGVuZ3RoID0gRklFTERfU0laRU9GKHN0cnVjdCBGV0NNRF9DT01NT05fRklSTVdBUkVfQ09ORklHLAorCQkJCQlwYXJhbXMucmVzcG9uc2UpOworCXJjLmZ3Y21kX29mZnNldCA9IG9mZnNldG9mKHN0cnVjdCBGV0NNRF9DT01NT05fRklSTVdBUkVfQ09ORklHLAorCQkJCQlwYXJhbXMucmVzcG9uc2UpOworCXJjLnZhID0gY29uZmlnOworCisJLyogUG9zdCB0aGUgZi93IGNvbW1hbmQgKi8KKwlzdGF0dXMgPSBiZV9mdW5jdGlvbl9wb3N0X21jY193cmIocGZvYiwgd3JiLCBOVUxMLCBOVUxMLAorCQkJCQlOVUxMLCBOVUxMLCBOVUxMLCBmd2NtZCwgJnJjKTsKK2Vycm9yOgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBmb2ItPnBvc3RfbG9jaywgaXJxbCk7CisJaWYgKHBmb2ItPnBlbmRfcXVldWVfZHJpdmluZyAmJiBwZm9iLT5tY2MpIHsKKwkJcGZvYi0+cGVuZF9xdWV1ZV9kcml2aW5nID0gMDsKKwkJYmVfZHJpdmVfbWNjX3dyYl9xdWV1ZShwZm9iLT5tY2MpOworCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICAgIFRoaXMgYWxsb2NhdGVzIGFuZCBpbml0aWFsaXplcyBhIGZ1bmN0aW9uIG9iamVjdCBiYXNlZCBvbiB0aGUgaW5mb3JtYXRpb24KKyAgICBwcm92aWRlZCBieSB1cHBlciBsYXllciBkcml2ZXJzLgorCisgICAgUmV0dXJucyBCRV9TVUNDRVNTIG9uIHN1Y2Nlc3MgYW5kIGFuIGFwcHJvcHJpYXRlIGludCBvbiBmYWlsdXJlLgorCisgICAgQSBmdW5jdGlvbiBvYmplY3QgcmVwcmVzZW50cyBhIHNpbmdsZSBCbGFkZUVuZ2luZSAobG9naWNhbCkgUENJIGZ1bmN0aW9uLgorICAgIFRoYXQgaXMgYSBmdW5jdGlvbiBvYmplY3QgZWl0aGVyIHJlcHJlc2VudHMKKyAgICB0aGUgbmV0d29ya2luZyBzaWRlIG9mIEJsYWRlRW5naW5lIG9yIHRoZSBpU0NTSSBzaWRlIG9mIEJsYWRlRW5naW5lLgorCisgICAgVGhpcyByb3V0aW5lIHdpbGwgYWxzbyBkZXRlY3QgYW5kIGNyZWF0ZSBhbiBhcHByb3ByaWF0ZSBQRCBvYmplY3QgZm9yIHRoZQorICAgIFBDSSBmdW5jdGlvbiBhcyBuZWVkZWQuCisqLworaW50CitiZV9mdW5jdGlvbl9vYmplY3RfY3JlYXRlKHU4IF9faW9tZW0gKmNzcl92YSwgdTggX19pb21lbSAqZGJfdmEsCisJCXU4IF9faW9tZW0gKnBjaV92YSwgdTMyIGZ1bmN0aW9uX3R5cGUsCisJCXN0cnVjdCByaW5nX2Rlc2MgKm1haWxib3gsIHN0cnVjdCBiZV9mdW5jdGlvbl9vYmplY3QgKnBmb2IpCit7CisJaW50IHN0YXR1czsKKworCUFTU0VSVChwZm9iKTsJLyogbm90IGEgbWFnaWMgYXNzZXJ0ICovCisJQVNTRVJUKGZ1bmN0aW9uX3R5cGUgPD0gMik7CisKKwlUUkFDRShETF9JTkZPLCAiQ3JlYXRlIGZ1bmN0aW9uIG9iamVjdC4gdHlwZTolcyBvYmplY3Q6MHglcCIsCisJICAgICAgKGZ1bmN0aW9uX3R5cGUgPT0gQkVfRlVOQ1RJT05fVFlQRV9JU0NTSSA/ICJpU0NTSSIgOgorCSAgICAgICAoZnVuY3Rpb25fdHlwZSA9PSBCRV9GVU5DVElPTl9UWVBFX05FVFdPUksgPyAiTmV0d29yayIgOgorCQkiQXJtIikpLCBwZm9iKTsKKworCW1lbXNldChwZm9iLCAwLCBzaXplb2YoKnBmb2IpKTsKKworCXBmb2ItPnR5cGUgPSBmdW5jdGlvbl90eXBlOworCXBmb2ItPmNzcl92YSA9IGNzcl92YTsKKwlwZm9iLT5kYl92YSA9IGRiX3ZhOworCXBmb2ItPnBjaV92YSA9IHBjaV92YTsKKworCXNwaW5fbG9ja19pbml0KCZwZm9iLT5jcV9sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmcGZvYi0+cG9zdF9sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmcGZvYi0+bWNjX2NvbnRleHRfbG9jayk7CisKKworCXBmb2ItPnBjaV9mdW5jdGlvbl9udW1iZXIgPSAxOworCisKKwlwZm9iLT5lbXVsYXRlID0gZmFsc2U7CisJVFJBQ0UoRExfTk9URSwgIk5vbi1lbXVsYXRpb24gbW9kZSIpOworCXN0YXR1cyA9IGJlX2RyaXZlX1BPU1QocGZvYik7CisJaWYgKHN0YXR1cyAhPSBCRV9TVUNDRVNTKSB7CisJCVRSQUNFKERMX0VSUiwgIkJsYWRlRW5naW5lIFBPU1QgZmFpbGVkLiIpOworCQlnb3RvIGVycm9yOworCX0KKworCS8qIEluaXRpYWxpemUgdGhlIG1haWxib3ggKi8KKwlzdGF0dXMgPSBiZV9tcHVfaW5pdF9tYWlsYm94KHBmb2IsIG1haWxib3gpOworCWlmIChzdGF0dXMgIT0gQkVfU1VDQ0VTUykgeworCQlUUkFDRShETF9FUlIsICJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBtYWlsYm94LiIpOworCQlnb3RvIGVycm9yOworCX0KKwkvKgorCSAqIENhY2hlIHRoZSBmaXJtd2FyZSBjb25maWcgZm9yIEFTU0VSVHMgaW4gaHdjbGliIGFuZCBsYXRlcgorCSAqIGRyaXZlciBxdWVyaWVzLgorCSAqLworCXN0YXR1cyA9IGJlX2Z1bmN0aW9uX2ludGVybmFsX3F1ZXJ5X2Zpcm13YXJlX2NvbmZpZyhwZm9iLAorCQkJCQkgICAgICAgJnBmb2ItPmZ3X2NvbmZpZyk7CisJaWYgKHN0YXR1cyAhPSBCRV9TVUNDRVNTKSB7CisJCVRSQUNFKERMX0VSUiwgIkZhaWxlZCB0byBxdWVyeSBmaXJtd2FyZSBjb25maWcuIik7CisJCWdvdG8gZXJyb3I7CisJfQorCitlcnJvcjoKKwlpZiAoc3RhdHVzICE9IEJFX1NVQ0NFU1MpIHsKKwkJLyogTm8gY2xlYW51cCBuZWNlc3NhcnkgKi8KKwkJVFJBQ0UoRExfRVJSLCAiRmFpbGVkIHRvIGNyZWF0ZSBmdW5jdGlvbi4iKTsKKwkJbWVtc2V0KHBmb2IsIDAsIHNpemVvZigqcGZvYikpOworCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICAgIFRoaXMgcm91dGluZSBkcm9wcyB0aGUgcmVmZXJlbmNlIGNvdW50IG9uIGEgZ2l2ZW4gZnVuY3Rpb24gb2JqZWN0LiBPbmNlCisgICAgdGhlIHJlZmVyZW5jZSBjb3VudCBmYWxscyB0byB6ZXJvLCB0aGUgZnVuY3Rpb24gb2JqZWN0IGlzIGRlc3Ryb3llZCBhbmQgYWxsCisgICAgcmVzb3VyY2VzIGhlbGQgYXJlIGZyZWVkLgorCisgICAgRnVuY3Rpb25PYmplY3QgICAgICAtIFRoZSBmdW5jdGlvbiBvYmplY3QgdG8gZHJvcCB0aGUgcmVmZXJlbmNlIHRvLgorKi8KK2ludCBiZV9mdW5jdGlvbl9vYmplY3RfZGVzdHJveShzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwZm9iKQoreworCVRSQUNFKERMX0lORk8sICJEZXN0cm95IHBmb2IuIE9iamVjdDoweCVwIiwKKwkgICAgICBwZm9iKTsKKworCisJQVNTRVJUKHBmb2ItPm1jYyA9PSBOVUxMKTsKKworCXJldHVybiBCRV9TVUNDRVNTOworfQorCitpbnQgYmVfZnVuY3Rpb25fY2xlYW51cChzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwZm9iKQoreworCWludCBzdGF0dXMgPSAwOworCXUzMiBpc3I7CisJdTMyIGhvc3RfaW50cjsKKwlzdHJ1Y3QgUENJQ0ZHX0hPU1RfVElNRVJfSU5UX0NUUkxfQ1NSX0FNQVAgY3RybDsKKworCisJaWYgKHBmb2ItPnR5cGUgPT0gQkVfRlVOQ1RJT05fVFlQRV9ORVRXT1JLKSB7CisJCXN0YXR1cyA9IGJlX3J4Zl9tdWx0aWNhc3RfY29uZmlnKHBmb2IsIGZhbHNlLCAwLAorCQkJCQkJTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCk7CisJCUFTU0VSVChzdGF0dXMgPT0gQkVfU1VDQ0VTUyk7CisJfQorCS8qIFZMQU4gKi8KKwlzdGF0dXMgPSBiZV9yeGZfdmxhbl9jb25maWcocGZvYiwgZmFsc2UsIDAsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpOworCUFTU0VSVChzdGF0dXMgPT0gQkVfU1VDQ0VTUyk7CisJLyoKKwkgKiBNQ0MgUXVldWUgLS0gU3dpdGNoZXMgdG8gbWFpbGJveCBtb2RlLiAgTWF5IHdhbnQgdG8gZGVzdHJveQorCSAqIGFsbCBidXQgdGhlIE1DQyBDUSBiZWZvcmUgdGhpcyBjYWxsIGlmIHBvbGxpbmcgQ1EgaXMgbXVjaCBiZXR0ZXIKKwkgKiBwZXJmb3JtYW5jZSB0aGFuIHBvbGxpbmcgbWFpbGJveCByZWdpc3Rlci4KKwkgKi8KKwlpZiAocGZvYi0+bWNjKQorCQlzdGF0dXMgPSBiZV9tY2NfcmluZ19kZXN0cm95KHBmb2ItPm1jYyk7CisJLyoKKwkgKiBJZiBpbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZCwgY2xlYXIgYW55IENFViBpbnRlcnJ1cHQgYXNzZXJ0aW9ucyB0aGF0CisJICogZmlyZWQgYWZ0ZXIgd2Ugc3RvcHBlZCBwcm9jZXNzaW5nIEVRcy4KKwkgKi8KKwljdHJsLmR3WzBdID0gUENJQ0ZHMV9SRUFEKHBmb2IsIGhvc3RfdGltZXJfaW50X2N0cmwpOworCWhvc3RfaW50ciA9IEFNQVBfR0VUX0JJVFNfUFRSKFBDSUNGR19IT1NUX1RJTUVSX0lOVF9DVFJMX0NTUiwKKwkJCQkJCQlob3N0aW50ciwgY3RybC5kdyk7CisJaWYgKCFob3N0X2ludHIpCisJCWlmIChwZm9iLT50eXBlID09IEJFX0ZVTkNUSU9OX1RZUEVfTkVUV09SSykKKwkJCWlzciA9IENTUl9SRUFEKHBmb2IsIGNldi5pc3IxKTsKKwkJZWxzZQorCQkJaXNyID0gQ1NSX1JFQUQocGZvYiwgY2V2LmlzcjApOworCWVsc2UKKwkJLyogVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuLi4uICovCisJCVRSQUNFKERMX0VSUiwgImZ1bmN0aW9uX2NsZWFudXAgY2FsbGVkIHdpdGggaW50ZXJydXB0IGVuYWJsZWQiKTsKKwkvKiBGdW5jdGlvbiBvYmplY3QgZGVzdHJveSAqLworCXN0YXR1cyA9IGJlX2Z1bmN0aW9uX29iamVjdF9kZXN0cm95KHBmb2IpOworCUFTU0VSVChzdGF0dXMgPT0gQkVfU1VDQ0VTUyk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisKK3ZvaWQgKgorYmVfZnVuY3Rpb25fcHJlcGFyZV9lbWJlZGRlZF9md2NtZChzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwZm9iLAorCXN0cnVjdCBNQ0NfV1JCX0FNQVAgKndyYiwgdTMyIHBheWxkX2xlbiwgdTMyIHJlcXVlc3RfbGVuZ3RoLAorCXUzMiByZXNwb25zZV9sZW5ndGgsIHUzMiBvcGNvZGUsIHUzMiBzdWJzeXN0ZW0pCit7CisJc3RydWN0IEZXQ01EX1JFUVVFU1RfSEVBREVSICpoZWFkZXIgPSBOVUxMOworCXUzMiBuOworCisJQVNTRVJUKHdyYik7CisKKwluID0gb2Zmc2V0b2Yoc3RydWN0IEJFX01DQ19XUkJfQU1BUCwgcGF5bG9hZCkvODsKKwlBTUFQX1NFVF9CSVRTX1BUUihNQ0NfV1JCLCBlbWJlZGRlZCwgd3JiLCAxKTsKKwlBTUFQX1NFVF9CSVRTX1BUUihNQ0NfV1JCLCBwYXlsb2FkX2xlbmd0aCwgd3JiLCBtaW4ocGF5bGRfbGVuLCBuKSk7CisJaGVhZGVyID0gKHN0cnVjdCBGV0NNRF9SRVFVRVNUX0hFQURFUiAqKSgodTggKil3cmIgKyBuKTsKKworCWhlYWRlci0+dGltZW91dCA9IDA7CisJaGVhZGVyLT5kb21haW4gPSAwOworCWhlYWRlci0+cmVxdWVzdF9sZW5ndGggPSBtYXgocmVxdWVzdF9sZW5ndGgsIHJlc3BvbnNlX2xlbmd0aCk7CisJaGVhZGVyLT5vcGNvZGUgPSBvcGNvZGU7CisJaGVhZGVyLT5zdWJzeXN0ZW0gPSBzdWJzeXN0ZW07CisKKwlyZXR1cm4gaGVhZGVyOworfQorCit2b2lkICoKK2JlX2Z1bmN0aW9uX3ByZXBhcmVfbm9uZW1iZWRkZWRfZndjbWQoc3RydWN0IGJlX2Z1bmN0aW9uX29iamVjdCAqcGZvYiwKKwlzdHJ1Y3QgTUNDX1dSQl9BTUFQICp3cmIsCisJdm9pZCAqZndjbWRfdmEsIHU2NCBmd2NtZF9wYSwKKwl1MzIgcGF5bGRfbGVuLAorCXUzMiByZXF1ZXN0X2xlbmd0aCwKKwl1MzIgcmVzcG9uc2VfbGVuZ3RoLAorCXUzMiBvcGNvZGUsIHUzMiBzdWJzeXN0ZW0pCit7CisJc3RydWN0IEZXQ01EX1JFUVVFU1RfSEVBREVSICpoZWFkZXIgPSBOVUxMOworCXUzMiBuOworCXN0cnVjdCBNQ0NfV1JCX1BBWUxPQURfQU1BUCAqcGxwOworCisJQVNTRVJUKHdyYik7CisJQVNTRVJUKGZ3Y21kX3ZhKTsKKworCWhlYWRlciA9IChzdHJ1Y3QgRldDTURfUkVRVUVTVF9IRUFERVIgKikgZndjbWRfdmE7CisKKwlBTUFQX1NFVF9CSVRTX1BUUihNQ0NfV1JCLCBlbWJlZGRlZCwgd3JiLCAwKTsKKwlBTUFQX1NFVF9CSVRTX1BUUihNQ0NfV1JCLCBwYXlsb2FkX2xlbmd0aCwgd3JiLCBwYXlsZF9sZW4pOworCisJLyoKKwkgKiBBc3N1bWUgb25lIGZyYWdtZW50LiBUaGUgY2FsbGVyIG1heSBvdmVycmlkZSB0aGUgU0dMIGJ5CisJICogcmV3cml0aW5nIHRoZSAwdGggbGVuZ3RoIGFuZCBhZGRpbmcgbW9yZSBlbnRyaWVzLiAgVGhleQorCSAqIHdpbGwgYWxzbyBuZWVkIHRvIHVwZGF0ZSB0aGUgc2dlX2NvdW50LgorCSAqLworCUFNQVBfU0VUX0JJVFNfUFRSKE1DQ19XUkIsIHNnZV9jb3VudCwgd3JiLCAxKTsKKworCW4gPSBvZmZzZXRvZihzdHJ1Y3QgQkVfTUNDX1dSQl9BTUFQLCBwYXlsb2FkKS84OworCXBscCA9IChzdHJ1Y3QgTUNDX1dSQl9QQVlMT0FEX0FNQVAgKikoKHU4ICopd3JiICsgbik7CisJQU1BUF9TRVRfQklUU19QVFIoTUNDX1dSQl9QQVlMT0FELCBzZ2xbMF0ubGVuZ3RoLCBwbHAsIHBheWxkX2xlbik7CisJQU1BUF9TRVRfQklUU19QVFIoTUNDX1dSQl9QQVlMT0FELCBzZ2xbMF0ucGFfbG8sIHBscCwgKHUzMilmd2NtZF9wYSk7CisJQU1BUF9TRVRfQklUU19QVFIoTUNDX1dSQl9QQVlMT0FELCBzZ2xbMF0ucGFfaGksIHBscCwKKwkJCQkJdXBwZXJfMzJfYml0cyhmd2NtZF9wYSkpOworCisJaGVhZGVyLT50aW1lb3V0ID0gMDsKKwloZWFkZXItPmRvbWFpbiA9IDA7CisJaGVhZGVyLT5yZXF1ZXN0X2xlbmd0aCA9IG1heChyZXF1ZXN0X2xlbmd0aCwgcmVzcG9uc2VfbGVuZ3RoKTsKKwloZWFkZXItPm9wY29kZSA9IG9wY29kZTsKKwloZWFkZXItPnN1YnN5c3RlbSA9IHN1YnN5c3RlbTsKKworCXJldHVybiBoZWFkZXI7Cit9CisKK3N0cnVjdCBNQ0NfV1JCX0FNQVAgKgorYmVfZnVuY3Rpb25fcGVla19tY2Nfd3JiKHN0cnVjdCBiZV9mdW5jdGlvbl9vYmplY3QgKnBmb2IpCit7CisJc3RydWN0IE1DQ19XUkJfQU1BUCAqd3JiID0gTlVMTDsKKwl1MzIgb2Zmc2V0OworCisJaWYgKHBmb2ItPm1jYykKKwkJd3JiID0gX2JlX21wdV9wZWVrX3Jpbmdfd3JiKHBmb2ItPm1jYywgZmFsc2UpOworCWVsc2UgeworCQlvZmZzZXQgPSBvZmZzZXRvZihzdHJ1Y3QgQkVfTUNDX01BSUxCT1hfQU1BUCwgd3JiKS84OworCQl3cmIgPSAoc3RydWN0IE1DQ19XUkJfQU1BUCAqKSAoKHU4ICopIHBmb2ItPm1haWxib3gudmEgKworCQkJCW9mZnNldCk7CisJfQorCisJaWYgKHdyYikKKwkJbWVtc2V0KHdyYiwgMCwgc2l6ZW9mKHN0cnVjdCBNQ0NfV1JCX0FNQVApKTsKKworCXJldHVybiB3cmI7Cit9CisKKyNpZiBkZWZpbmVkKEJFX0RFQlVHKQordm9pZCBiZV9mdW5jdGlvbl9kZWJ1Z19wcmludF93cmIoc3RydWN0IGJlX2Z1bmN0aW9uX29iamVjdCAqcGZvYiwKKwkJc3RydWN0IE1DQ19XUkJfQU1BUCAqd3JiLCB2b2lkICpvcHRpb25hbF9md2NtZF92YSwKKwkJc3RydWN0IGJlX21jY193cmJfY29udGV4dCAqd3JiX2NvbnRleHQpCit7CisKKwlzdHJ1Y3QgRldDTURfUkVRVUVTVF9IRUFERVIgKmhlYWRlciA9IE5VTEw7CisJdTggZW1iZWRkZWQ7CisJdTMyIG47CisKKwllbWJlZGRlZCA9IEFNQVBfR0VUX0JJVFNfUFRSKE1DQ19XUkIsIGVtYmVkZGVkLCB3cmIpOworCisJaWYgKGVtYmVkZGVkKSB7CisJCW4gPSBvZmZzZXRvZihzdHJ1Y3QgQkVfTUNDX1dSQl9BTUFQLCBwYXlsb2FkKS84OworCQloZWFkZXIgPSAoc3RydWN0IEZXQ01EX1JFUVVFU1RfSEVBREVSICopKCh1OCAqKXdyYiArIG4pOworCX0gZWxzZSB7CisJCWhlYWRlciA9IChzdHJ1Y3QgRldDTURfUkVRVUVTVF9IRUFERVIgKikgb3B0aW9uYWxfZndjbWRfdmE7CisJfQorCisJLyogU2F2ZSB0aGUgY29tcGxldGVkIGNvdW50IGJlZm9yZSBwb3N0aW5nIGZvciBhIGRlYnVnIGFzc2VydC4gKi8KKworCWlmIChoZWFkZXIpIHsKKwkJd3JiX2NvbnRleHQtPm9wY29kZSA9IGhlYWRlci0+b3Bjb2RlOworCQl3cmJfY29udGV4dC0+c3Vic3lzdGVtID0gaGVhZGVyLT5zdWJzeXN0ZW07CisKKwl9IGVsc2UgeworCQl3cmJfY29udGV4dC0+b3Bjb2RlID0gMDsKKwkJd3JiX2NvbnRleHQtPnN1YnN5c3RlbSA9IDA7CisJfQorfQorI2Vsc2UKKyNkZWZpbmUgYmVfZnVuY3Rpb25fZGVidWdfcHJpbnRfd3JiKGFfLCBiXywgY18sIGRfKQorI2VuZGlmCisKK2ludAorYmVfZnVuY3Rpb25fcG9zdF9tY2Nfd3JiKHN0cnVjdCBiZV9mdW5jdGlvbl9vYmplY3QgKnBmb2IsCisJCXN0cnVjdCBNQ0NfV1JCX0FNQVAgKndyYiwKKwkJc3RydWN0IGJlX2dlbmVyaWNfcV9jdHh0ICpxX2N0eHQsCisJCW1jY193cmJfY3FlX2NhbGxiYWNrIGNiLCB2b2lkICpjYl9jb250ZXh0LAorCQltY2Nfd3JiX2NxZV9jYWxsYmFjayBpbnRlcm5hbF9jYiwKKwkJdm9pZCAqaW50ZXJuYWxfY2JfY29udGV4dCwgdm9pZCAqb3B0aW9uYWxfZndjbWRfdmEsCisJCXN0cnVjdCBiZV9tY2Nfd3JiX3Jlc3BvbnNlX2NvcHkgKnJjKQoreworCWludCBzdGF0dXM7CisJc3RydWN0IGJlX21jY193cmJfY29udGV4dCAqd3JiX2NvbnRleHQgPSBOVUxMOworCXU2NCAqcDsKKworCWlmIChxX2N0eHQpIHsKKwkJLyogSW5pdGlhbGl6ZSBjb250ZXh0LiAgICAgICAgICovCisJCXFfY3R4dC0+Y29udGV4dC5pbnRlcm5hbF9jYiA9IGludGVybmFsX2NiOworCQlxX2N0eHQtPmNvbnRleHQuaW50ZXJuYWxfY2JfY29udGV4dCA9IGludGVybmFsX2NiX2NvbnRleHQ7CisJCXFfY3R4dC0+Y29udGV4dC5jYiA9IGNiOworCQlxX2N0eHQtPmNvbnRleHQuY2JfY29udGV4dCA9IGNiX2NvbnRleHQ7CisJCWlmIChyYykgeworCQkJcV9jdHh0LT5jb250ZXh0LmNvcHkubGVuZ3RoID0gcmMtPmxlbmd0aDsKKwkJCXFfY3R4dC0+Y29udGV4dC5jb3B5LmZ3Y21kX29mZnNldCA9IHJjLT5md2NtZF9vZmZzZXQ7CisJCQlxX2N0eHQtPmNvbnRleHQuY29weS52YSA9IHJjLT52YTsKKwkJfSBlbHNlCisJCQlxX2N0eHQtPmNvbnRleHQuY29weS5sZW5ndGggPSAwOworCisJCXFfY3R4dC0+Y29udGV4dC5vcHRpb25hbF9md2NtZF92YSA9IG9wdGlvbmFsX2Z3Y21kX3ZhOworCisJCS8qIFF1ZXVlIHRoaXMgcmVxdWVzdCAqLworCQlzdGF0dXMgPSBiZV9mdW5jdGlvbl9xdWV1ZV9tY2Nfd3JiKHBmb2IsIHFfY3R4dCk7CisKKwkJZ290byBFcnJvcjsKKwl9CisJLyoKKwkgKiBBbGxvY2F0ZSBhIFdSQiBjb250ZXh0IHN0cnVjdCB0byBob2xkIHRoZSBjYWxsYmFjayBwb2ludGVycywKKwkgKiBzdGF0dXMsIGV0Yy4gIFRoaXMgaXMgcmVxdWlyZWQgaWYgY29tbWFuZHMgY29tcGxldGUgb3V0IG9mIG9yZGVyLgorCSAqLworCXdyYl9jb250ZXh0ID0gX2JlX21jY19hbGxvY2F0ZV93cmJfY29udGV4dChwZm9iKTsKKwlpZiAoIXdyYl9jb250ZXh0KSB7CisJCVRSQUNFKERMX1dBUk4sICJGYWlsZWQgdG8gYWxsb2NhdGUgTUNDIFdSQiBjb250ZXh0LiIpOworCQlzdGF0dXMgPSBCRV9TVEFUVVNfU1lTVEVNX1JFU09VUkNFUzsKKwkJZ290byBFcnJvcjsKKwl9CisJLyogSW5pdGlhbGl6ZSBjb250ZXh0LiAqLworCW1lbXNldCh3cmJfY29udGV4dCwgMCwgc2l6ZW9mKCp3cmJfY29udGV4dCkpOworCXdyYl9jb250ZXh0LT5pbnRlcm5hbF9jYiA9IGludGVybmFsX2NiOworCXdyYl9jb250ZXh0LT5pbnRlcm5hbF9jYl9jb250ZXh0ID0gaW50ZXJuYWxfY2JfY29udGV4dDsKKwl3cmJfY29udGV4dC0+Y2IgPSBjYjsKKwl3cmJfY29udGV4dC0+Y2JfY29udGV4dCA9IGNiX2NvbnRleHQ7CisJaWYgKHJjKSB7CisJCXdyYl9jb250ZXh0LT5jb3B5Lmxlbmd0aCA9IHJjLT5sZW5ndGg7CisJCXdyYl9jb250ZXh0LT5jb3B5LmZ3Y21kX29mZnNldCA9IHJjLT5md2NtZF9vZmZzZXQ7CisJCXdyYl9jb250ZXh0LT5jb3B5LnZhID0gcmMtPnZhOworCX0gZWxzZQorCQl3cmJfY29udGV4dC0+Y29weS5sZW5ndGggPSAwOworCXdyYl9jb250ZXh0LT53cmIgPSB3cmI7CisKKwkvKgorCSAqIENvcHkgdGhlIGNvbnRleHQgcG9pbnRlciBpbnRvIHRoZSBXUkIgb3BhcXVlIHRhZyBmaWVsZC4KKwkgKiBWZXJpZnkgYXNzdW1wdGlvbiBvZiA2NC1iaXQgdGFnIHdpdGggYSBjb21waWxlIHRpbWUgYXNzZXJ0LgorCSAqLworCXAgPSAodTY0ICopICgodTggKil3cmIgKyBvZmZzZXRvZihzdHJ1Y3QgQkVfTUNDX1dSQl9BTUFQLCB0YWcpLzgpOworCSpwID0gKHU2NCkoc2l6ZV90KXdyYl9jb250ZXh0OworCisJLyogUHJpbnQgaW5mbyBhYm91dCB0aGlzIEZXQ01EIGZvciBkZWJ1ZyBidWlsZHMuICovCisJYmVfZnVuY3Rpb25fZGVidWdfcHJpbnRfd3JiKHBmb2IsIHdyYiwgb3B0aW9uYWxfZndjbWRfdmEsIHdyYl9jb250ZXh0KTsKKworCS8qCisJICogaXNzdWUgdGhlIFdSQiB0byB0aGUgTVBVIGFzIGFwcHJvcHJpYXRlCisJICovCisJaWYgKHBmb2ItPm1jYykgeworCQkvKgorCQkgKiB3ZSdyZSBpbiBXUkIgbW9kZSwgcGFzcyB0byB0aGUgbWNjIGxheWVyCisJCSAqLworCQlzdGF0dXMgPSBfYmVfbXB1X3Bvc3Rfd3JiX3JpbmcocGZvYi0+bWNjLCB3cmIsIHdyYl9jb250ZXh0KTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiB3ZSdyZSBpbiBtYWlsYm94IG1vZGUKKwkJICovCisJCXN0YXR1cyA9IF9iZV9tcHVfcG9zdF93cmJfbWFpbGJveChwZm9iLCB3cmIsIHdyYl9jb250ZXh0KTsKKworCQkvKiBtYWlsYm94IG1vZGUgYWx3YXlzIGNvbXBsZXRlcyBzeW5jaHJvbm91c2x5ICovCisJCUFTU0VSVChzdGF0dXMgIT0gQkVfU1RBVFVTX1BFTkRJTkcpOworCX0KKworRXJyb3I6CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitpbnQKK2JlX2Z1bmN0aW9uX3JpbmdfZGVzdHJveShzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwZm9iLAorCQl1MzIgaWQsIHUzMiByaW5nX3R5cGUsIG1jY193cmJfY3FlX2NhbGxiYWNrIGNiLAorCQl2b2lkICpjYl9jb250ZXh0LCBtY2Nfd3JiX2NxZV9jYWxsYmFjayBpbnRlcm5hbF9jYiwKKwkJdm9pZCAqaW50ZXJuYWxfY2JfY29udGV4dCkKK3sKKworCXN0cnVjdCBGV0NNRF9DT01NT05fUklOR19ERVNUUk9ZICpmd2NtZCA9IE5VTEw7CisJc3RydWN0IE1DQ19XUkJfQU1BUCAqd3JiID0gTlVMTDsKKwlpbnQgc3RhdHVzID0gMDsKKwl1bnNpZ25lZCBsb25nIGlycWw7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcGZvYi0+cG9zdF9sb2NrLCBpcnFsKTsKKworCVRSQUNFKERMX0lORk8sICJEZXN0cm95IHJpbmcgaWQ6JWQgdHlwZTolZCIsIGlkLCByaW5nX3R5cGUpOworCisJd3JiID0gYmVfZnVuY3Rpb25fcGVla19tY2Nfd3JiKHBmb2IpOworCWlmICghd3JiKSB7CisJCUFTU0VSVCh3cmIpOworCQlUUkFDRShETF9FUlIsICJObyBmcmVlIE1DQyBXUkJzIGluIGRlc3Ryb3kgcmluZy4iKTsKKwkJc3RhdHVzID0gQkVfU1RBVFVTX05PX01DQ19XUkI7CisJCWdvdG8gRXJyb3I7CisJfQorCS8qIFByZXBhcmVzIGFuIGVtYmVkZGVkIGZ3Y21kLCBpbmNsdWRpbmcgcmVxdWVzdC9yZXNwb25zZSBzaXplcy4gKi8KKwlmd2NtZCA9IEJFX1BSRVBBUkVfRU1CRURERURfRldDTUQocGZvYiwgd3JiLCBDT01NT05fUklOR19ERVNUUk9ZKTsKKworCWZ3Y21kLT5wYXJhbXMucmVxdWVzdC5pZCA9IGlkOworCWZ3Y21kLT5wYXJhbXMucmVxdWVzdC5yaW5nX3R5cGUgPSByaW5nX3R5cGU7CisKKwkvKiBQb3N0IHRoZSBmL3cgY29tbWFuZCAqLworCXN0YXR1cyA9IGJlX2Z1bmN0aW9uX3Bvc3RfbWNjX3dyYihwZm9iLCB3cmIsIE5VTEwsIGNiLCBjYl9jb250ZXh0LAorCQkJCWludGVybmFsX2NiLCBpbnRlcm5hbF9jYl9jb250ZXh0LCBmd2NtZCwgTlVMTCk7CisJaWYgKHN0YXR1cyAhPSBCRV9TVUNDRVNTICYmIHN0YXR1cyAhPSBCRV9QRU5ESU5HKSB7CisJCVRSQUNFKERMX0VSUiwgIlJpbmcgZGVzdHJveSBmd2NtZCBmYWlsZWQuIGlkOiVkIHJpbmdfdHlwZTolZCIsCisJCQlpZCwgcmluZ190eXBlKTsKKwkJZ290byBFcnJvcjsKKwl9CisKK0Vycm9yOgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBmb2ItPnBvc3RfbG9jaywgaXJxbCk7CisJaWYgKHBmb2ItPnBlbmRfcXVldWVfZHJpdmluZyAmJiBwZm9iLT5tY2MpIHsKKwkJcGZvYi0+cGVuZF9xdWV1ZV9kcml2aW5nID0gMDsKKwkJYmVfZHJpdmVfbWNjX3dyYl9xdWV1ZShwZm9iLT5tY2MpOworCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCit2b2lkCitiZV9yZF90b19wYV9saXN0KHN0cnVjdCByaW5nX2Rlc2MgKnJkLCBzdHJ1Y3QgUEhZU19BRERSICpwYV9saXN0LCB1MzIgbWF4X251bSkKK3sKKwl1MzIgbnVtX3BhZ2VzID0gUEFHRVNfU1BBTk5FRChyZC0+dmEsIHJkLT5sZW5ndGgpOworCXUzMiBpID0gMDsKKwl1NjQgcGEgPSByZC0+cGE7CisJX19sZTY0IGxlcGE7CisKKwlBU1NFUlQocGFfbGlzdCk7CisJQVNTRVJUKHBhKTsKKworCWZvciAoaSA9IDA7IGkgPCBtaW4obnVtX3BhZ2VzLCBtYXhfbnVtKTsgaSsrKSB7CisJCWxlcGEgPSBjcHVfdG9fbGU2NChwYSk7CisJCXBhX2xpc3RbaV0ubG8gPSAodTMyKWxlcGE7CisJCXBhX2xpc3RbaV0uaGkgPSB1cHBlcl8zMl9iaXRzKGxlcGEpOworCQlwYSArPSBQQUdFX1NJWkU7CisJfQorfQorCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRnVuY3Rpb246IGJlX2Z1bmN0aW9uX2dldF9md192ZXJzaW9uCisgKiAgIFJldHJpZXZlcyB0aGUgZmlybXdhcmUgdmVyc2lvbiBvbiB0aGUgYWRwYXRlci4gSWYgdGhlIGNhbGxiYWNrIGlzCisgKiAgIE5VTEwgdGhpcyBjYWxsIGV4ZWN1dGVzIHN5bmNocm9ub3VzbHkuIElmIHRoZSBjYWxsYmFjayBpcyBub3QgTlVMTCwKKyAqICAgdGhlIHJldHVybmVkIHN0YXR1cyB3aWxsIGJlIEJFX1BFTkRJTkcgaWYgdGhlIGNvbW1hbmQgd2FzIGlzc3VlZAorICogICBzdWNjZXNzZnVsbHkuCisgKiBwZm9iICAgIC0KKyAqIGZ3diAgICAgICAgIC0gUG9pbnRlciB0byByZXNwb25zZSBidWZmZXIgaWYgY2FsbGJhY2sgaXMgTlVMTC4KKyAqIGNiICAgICAgICAgICAtIENhbGxiYWNrIGZ1bmN0aW9uIGludm9rZWQgd2hlbiB0aGUgRldDTUQgY29tcGxldGVzLgorICogY2JfY29udGV4dCAgIC0gUGFzc2VkIHRvIHRoZSBjYWxsYmFjayBmdW5jdGlvbi4KKyAqIHJldHVybiBwZW5kX3N0YXR1cyAtIEJFX1NVQ0NFU1MgKDApIG9uIHN1Y2Nlc3MuCisgKiAJCQlCRV9QRU5ESU5HIChwb3N0aXZlIHZhbHVlKSBpZiB0aGUgRldDTUQKKyAqICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRpb24gaXMgcGVuZGluZy4gTmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworaW50CitiZV9mdW5jdGlvbl9nZXRfZndfdmVyc2lvbihzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwZm9iLAorCQlzdHJ1Y3QgRldDTURfQ09NTU9OX0dFVF9GV19WRVJTSU9OX1JFU1BPTlNFX1BBWUxPQUQgKmZ3diwKKwkJbWNjX3dyYl9jcWVfY2FsbGJhY2sgY2IsIHZvaWQgKmNiX2NvbnRleHQpCit7CisJaW50IHN0YXR1cyA9IEJFX1NVQ0NFU1M7CisJc3RydWN0IE1DQ19XUkJfQU1BUCAqd3JiID0gTlVMTDsKKwlzdHJ1Y3QgRldDTURfQ09NTU9OX0dFVF9GV19WRVJTSU9OICpmd2NtZCA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyBpcnFsOworCXN0cnVjdCBiZV9tY2Nfd3JiX3Jlc3BvbnNlX2NvcHkgcmM7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcGZvYi0+cG9zdF9sb2NrLCBpcnFsKTsKKworCXdyYiA9IGJlX2Z1bmN0aW9uX3BlZWtfbWNjX3dyYihwZm9iKTsKKwlpZiAoIXdyYikgeworCQlUUkFDRShETF9FUlIsICJNQ0Mgd3JiIHBlZWsgZmFpbGVkLiIpOworCQlzdGF0dXMgPSBCRV9TVEFUVVNfTk9fTUNDX1dSQjsKKwkJZ290byBFcnJvcjsKKwl9CisKKwlpZiAoIWNiICYmICFmd3YpIHsKKwkJVFJBQ0UoRExfRVJSLCAiY2FsbGJhY2sgYW5kIHJlc3BvbnNlIGJ1ZmZlciBOVUxMISIpOworCQlzdGF0dXMgPSBCRV9OT1RfT0s7CisJCWdvdG8gRXJyb3I7CisJfQorCS8qIFByZXBhcmVzIGFuIGVtYmVkZGVkIGZ3Y21kLCBpbmNsdWRpbmcgcmVxdWVzdC9yZXNwb25zZSBzaXplcy4gKi8KKwlmd2NtZCA9IEJFX1BSRVBBUkVfRU1CRURERURfRldDTUQocGZvYiwgd3JiLCBDT01NT05fR0VUX0ZXX1ZFUlNJT04pOworCisJcmMubGVuZ3RoID0gRklFTERfU0laRU9GKHN0cnVjdCBGV0NNRF9DT01NT05fR0VUX0ZXX1ZFUlNJT04sCisJCQkJCXBhcmFtcy5yZXNwb25zZSk7CisJcmMuZndjbWRfb2Zmc2V0ID0gb2Zmc2V0b2Yoc3RydWN0IEZXQ01EX0NPTU1PTl9HRVRfRldfVkVSU0lPTiwKKwkJCQkJcGFyYW1zLnJlc3BvbnNlKTsKKwlyYy52YSA9IGZ3djsKKworCS8qIFBvc3QgdGhlIGYvdyBjb21tYW5kICovCisJc3RhdHVzID0gYmVfZnVuY3Rpb25fcG9zdF9tY2Nfd3JiKHBmb2IsIHdyYiwgTlVMTCwgY2IsCisJCQkJY2JfY29udGV4dCwgTlVMTCwgTlVMTCwgZndjbWQsICZyYyk7CisKK0Vycm9yOgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBmb2ItPnBvc3RfbG9jaywgaXJxbCk7CisJaWYgKHBmb2ItPnBlbmRfcXVldWVfZHJpdmluZyAmJiBwZm9iLT5tY2MpIHsKKwkJcGZvYi0+cGVuZF9xdWV1ZV9kcml2aW5nID0gMDsKKwkJYmVfZHJpdmVfbWNjX3dyYl9xdWV1ZShwZm9iLT5tY2MpOworCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCitpbnQKK2JlX2Z1bmN0aW9uX3F1ZXVlX21jY193cmIoc3RydWN0IGJlX2Z1bmN0aW9uX29iamVjdCAqcGZvYiwKKwkJCSAgc3RydWN0IGJlX2dlbmVyaWNfcV9jdHh0ICpxX2N0eHQpCit7CisJaW50IHN0YXR1czsKKworCUFTU0VSVChxX2N0eHQpOworCisJLyoKKwkgKiBpc3N1ZSB0aGUgV1JCIHRvIHRoZSBNUFUgYXMgYXBwcm9wcmlhdGUKKwkgKi8KKwlpZiAocGZvYi0+bWNjKSB7CisKKwkJLyogV2UncmUgaW4gcmluZyBtb2RlLiAgUXVldWUgdGhpcyBpdGVtLiAqLworCQlwZm9iLT5tY2MtPmJhY2tsb2dfbGVuZ3RoKys7CisJCWxpc3RfYWRkX3RhaWwoJnFfY3R4dC0+Y29udGV4dC5saXN0LCAmcGZvYi0+bWNjLT5iYWNrbG9nKTsKKwkJc3RhdHVzID0gQkVfUEVORElORzsKKwl9IGVsc2UgeworCQlzdGF0dXMgPSBCRV9OT1RfT0s7CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9md2NtZF9jb21tb24uaCBiL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9md2NtZF9jb21tb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDZlMGQ2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JlbmV0L2Z3Y21kX2NvbW1vbi5oCkBAIC0wLDAgKzEsMjIyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA1IC0gMjAwOCBTZXJ2ZXJFbmdpbmVzCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBUaGUgZnVsbCBHTlUgR2VuZXJhbAorICogUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlIGZpbGUgY2FsbGVkIENPUFlJTkcuCisgKgorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqIGxpbnV4LWRyaXZlcnNAc2VydmVyZW5naW5lcy5jb20KKyAqCisgKiBTZXJ2ZXJFbmdpbmVzCisgKiAyMDkgTi4gRmFpciBPYWtzIEF2ZQorICogU3Vubnl2YWxlLCBDQSA5NDA4NQorICovCisvKgorICogQXV0b2dlbmVyYXRlZCBieSBzcmNnZW4gdmVyc2lvbjogMDEyNworICovCisjaWZuZGVmIF9fZndjbWRfY29tbW9uX2FtYXBfaF9fCisjZGVmaW5lIF9fZndjbWRfY29tbW9uX2FtYXBfaF9fCisjaW5jbHVkZSAiaG9zdF9zdHJ1Y3QuaCIKKworLyogLS0tIFBIWV9MSU5LX0RVUExFWF9FTlVNIC0tLSAqLworI2RlZmluZSBQSFlfTElOS19EVVBMRVhfTk9ORSAgICAgICAgICAgICgwKQorI2RlZmluZSBQSFlfTElOS19EVVBMRVhfSEFMRiAgICAgICAgICAgICgxKQorI2RlZmluZSBQSFlfTElOS19EVVBMRVhfRlVMTCAgICAgICAgICAgICgyKQorCisvKiAtLS0gUEhZX0xJTktfU1BFRURfRU5VTSAtLS0gKi8KKyNkZWZpbmUgUEhZX0xJTktfU1BFRURfWkVSTyAgICAgICAgICAgICAoMCkJLyogTm8gbGluay4gKi8KKyNkZWZpbmUgUEhZX0xJTktfU1BFRURfMTBNQlBTICAgICAgICAgICAoMSkJLyogMTAgTWJwcyAqLworI2RlZmluZSBQSFlfTElOS19TUEVFRF8xMDBNQlBTICAgICAgICAgICgyKQkvKiAxMDAgTWJwcyAqLworI2RlZmluZSBQSFlfTElOS19TUEVFRF8xR0JQUyAgICAgICAgICAgICgzKQkvKiAxIEdicHMgKi8KKyNkZWZpbmUgUEhZX0xJTktfU1BFRURfMTBHQlBTICAgICAgICAgICAoNCkJLyogMTAgR2JwcyAqLworCisvKiAtLS0gUEhZX0xJTktfRkFVTFRfRU5VTSAtLS0gKi8KKyNkZWZpbmUgUEhZX0xJTktfRkFVTFRfTk9ORSAgICAgICAgICAgICAoMCkJLyogTm8gZmF1bHQgc3RhdHVzCisJCQkJCQkJYXZhaWxhYmxlIG9yIGRldGVjdGVkICovCisjZGVmaW5lIFBIWV9MSU5LX0ZBVUxUX0xPQ0FMICAgICAgICAgICAgKDEpCS8qIExvY2FsIGZhdWx0IGRldGVjdGVkICovCisjZGVmaW5lIFBIWV9MSU5LX0ZBVUxUX1JFTU9URSAgICAgICAgICAgKDIpCS8qIFJlbW90ZSBmYXVsdCBkZXRlY3RlZCAqLworCisvKiAtLS0gQkVfVUxQX01BU0sgLS0tICovCisjZGVmaW5lIEJFX1VMUDBfTUFTSyAgICAgICAgICAgICAgICAgICAgKDEpCisjZGVmaW5lIEJFX1VMUDFfTUFTSyAgICAgICAgICAgICAgICAgICAgKDIpCisjZGVmaW5lIEJFX1VMUDJfTUFTSyAgICAgICAgICAgICAgICAgICAgKDQpCisKKy8qIC0tLSBOVFdLX0FDVElWRV9QT1JUIC0tLSAqLworI2RlZmluZSBOVFdLX1BPUlRfQSAgICAgICAgICAgICAgICAgICAgICgwKQkvKiBQb3J0IEEgaXMgY3VycmVudGx5IGFjdGl2ZSAqLworI2RlZmluZSBOVFdLX1BPUlRfQiAgICAgICAgICAgICAgICAgICAgICgxKQkvKiBQb3J0IEIgaXMgY3VycmVudGx5IGFjdGl2ZSAqLworI2RlZmluZSBOVFdLX05PX0FDVElWRV9QT1JUICAgICAgICAgICAgICgxNSkJLyogQm90aCBwb3J0cyBoYXZlIGxvc3QgbGluayAqLworCisvKiAtLS0gTlRXS19MSU5LX1RZUEUgLS0tICovCisjZGVmaW5lIE5UV0tfTElOS19UWVBFX1BIWVNJQ0FMICAgICAgICAgKDApCS8qIGxpbmsgdXAvZG93biBldmVudAorCQkJCQkJICAgYXBwbGllcyB0byBCbGFkZUVuZ2luZSdzCisJCQkJCQkgICBQaHlzaWNhbCBQb3J0cworCQkJCQkJICAgKi8KKyNkZWZpbmUgTlRXS19MSU5LX1RZUEVfVklSVFVBTCAgICAgICAgICAoMSkJLyogVmlydHVhbCBsaW5rIHVwL2Rvd24gZXZlbnQKKwkJCQkJCSAgIHJlcG9ydGVkIGJ5IEJsYWRlRXhjaGFuZ2UuCisJCQkJCQkgICBUaGlzIGFwcGxpZXMgb25seSB3aGVuIHRoZQorCQkJCQkJICAgVkxEIGZlYXR1cmUgaXMgZW5hYmxlZAorCQkJCQkJICAgKi8KKworLyoKKyAqIC0tLSBGV0NNRF9NQUNfVFlQRV9FTlVNIC0tLQorICogVGhpcyBlbnVtIGRlZmluZXMgdGhlIHR5cGVzIG9mIE1BQyBhZGRyZXNzZXMgaW4gdGhlIFJYRiBNQUMgQWRkcmVzcyBUYWJsZS4KKyAqLworI2RlZmluZSBNQUNfQUREUkVTU19UWVBFX1NUT1JBR0UgICAgICAgICgwKQkvKiBTdG9yYWdlIE1BQyBBZGRyZXNzICovCisjZGVmaW5lIE1BQ19BRERSRVNTX1RZUEVfTkVUV09SSyAgICAgICAgKDEpCS8qIE5ldHdvcmsgTUFDIEFkZHJlc3MgKi8KKyNkZWZpbmUgTUFDX0FERFJFU1NfVFlQRV9QRCAgICAgICAgICAgICAoMikJLyogUHJvdGVjdGlvbiBEb21haW4gTUFDIEFkZHIgKi8KKyNkZWZpbmUgTUFDX0FERFJFU1NfVFlQRV9NQU5BR0VNRU5UICAgICAoMykJLyogTWFuYWdtZW50IE1BQyBBZGRyZXNzICovCisKKworLyogLS0tIEZXQ01EX1JJTkdfVFlQRV9FTlVNIC0tLSAqLworI2RlZmluZSBGV0NNRF9SSU5HX1RZUEVfRVRIX1JYICAgICAgICAgICgxKQkvKiBSaW5nIGNyZWF0ZWQgd2l0aCAqLworCQkJCQkvKiBGV0NNRF9DT01NT05fRVRIX1JYX0NSRUFURS4gKi8KKyNkZWZpbmUgRldDTURfUklOR19UWVBFX0VUSF9UWCAgICAgICAgICAoMikJLyogUmluZyBjcmVhdGVkIHdpdGggKi8KKwkJCQkJLyogRldDTURfQ09NTU9OX0VUSF9UWF9DUkVBVEUuICovCisjZGVmaW5lIEZXQ01EX1JJTkdfVFlQRV9JU0NTSV9XUkJRICAgICAgKDMpCS8qIFJpbmcgY3JlYXRlZCB3aXRoICovCisJCQkJCS8qIEZXQ01EX0NPTU1PTl9JU0NTSV9XUkJRX0NSRUFURS4gKi8KKyNkZWZpbmUgRldDTURfUklOR19UWVBFX0lTQ1NJX0RFRlEgICAgICAoNCkJLyogUmluZyBjcmVhdGVkIHdpdGggKi8KKwkJCQkJLyogRldDTURfQ09NTU9OX0lTQ1NJX0RFRlFfQ1JFQVRFLiAqLworI2RlZmluZSBGV0NNRF9SSU5HX1RZUEVfVFBNX1dSQlEgICAgICAgICg1KQkvKiBSaW5nIGNyZWF0ZWQgd2l0aCAqLworCQkJCQkvKiBGV0NNRF9DT01NT05fVFBNX1dSQlFfQ1JFQVRFLiAqLworI2RlZmluZSBGV0NNRF9SSU5HX1RZUEVfVFBNX0RFRlEgICAgICAgICg2KQkvKiBSaW5nIGNyZWF0ZWQgd2l0aCAqLworCQkJCQkvKiBGV0NNRF9DT01NT05UUE1fVERFRlFfQ1JFQVRFLiAqLworI2RlZmluZSBGV0NNRF9SSU5HX1RZUEVfVFBNX1JRICAgICAgICAgICg3KQkvKiBSaW5nIGNyZWF0ZWQgd2l0aCAqLworCQkJCQkvKiBGV0NNRF9DT01NT05fVFBNX1JRX0NSRUFURS4gKi8KKyNkZWZpbmUgRldDTURfUklOR19UWVBFX01DQyAgICAgICAgICAgICAoOCkJLyogUmluZyBjcmVhdGVkIHdpdGggKi8KKwkJCQkJLyogRldDTURfQ09NTU9OX01DQ19DUkVBVEUuICovCisjZGVmaW5lIEZXQ01EX1JJTkdfVFlQRV9DUSAgICAgICAgICAgICAgKDkpCS8qIFJpbmcgY3JlYXRlZCB3aXRoICovCisJCQkJCS8qIEZXQ01EX0NPTU1PTl9DUV9DUkVBVEUuICovCisjZGVmaW5lIEZXQ01EX1JJTkdfVFlQRV9FUSAgICAgICAgICAgICAgKDEwKQkvKiBSaW5nIGNyZWF0ZWQgd2l0aCAqLworCQkJCQkvKiBGV0NNRF9DT01NT05fRVFfQ1JFQVRFLiAqLworI2RlZmluZSBGV0NNRF9SSU5HX1RZUEVfUVAgICAgICAgICAgICAgICgxMSkJLyogUmluZyBjcmVhdGVkIHdpdGggKi8KKwkJCQkJLyogRldDTURfUkRNQV9RUF9DUkVBVEUuICovCisKKworLyogLS0tIEVUSF9UWF9SSU5HX1RZUEVfRU5VTSAtLS0gKi8KKyNkZWZpbmUgRVRIX1RYX1JJTkdfVFlQRV9GT1JXQVJESU5HICAgICAoMSkJLyogRXRoZXJuZXQgcmluZyBmb3IKKwkJCQkJCSAgIGZvcndhcmRpbmcgcGFja2V0cyAqLworI2RlZmluZSBFVEhfVFhfUklOR19UWVBFX1NUQU5EQVJEICAgICAgICgyKQkvKiBFdGhlcm5ldCByaW5nIGZvciBzZW5kaW5nCisJCQkJCQkgICBuZXR3b3JrIHBhY2tldHMuICovCisjZGVmaW5lIEVUSF9UWF9SSU5HX1RZUEVfQk9VTkQgICAgICAgICAgKDMpCS8qIEV0aGVybmV0IHJpbmcgYm91bmQgdG8gdGhlCisJCQkJCQkgICBwb3J0IHNwZWNpZmllZCBpbiB0aGUgY29tbWFuZAorCQkJCQkJICAgaGVhZGVyLnBvcnRfbnVtYmVyIGZpZWxkLgorCQkJCQkJICAgUmluZ3Mgb2YgdGhpcyB0eXBlIGFyZQorCQkJCQkJICAgTk9UIHN1YmplY3QgdG8gdGhlCisJCQkJCQkgICBmYWlsb3ZlciBsb2dpYyBpbXBsZW1lbnRlZAorCQkJCQkJICAgaW4gdGhlIEJsYWRlRW5naW5lLgorCQkJCQkJICAgKi8KKworLyogLS0tIEZXQ01EX0NPTU1PTl9RT1NfVFlQRV9FTlVNIC0tLSAqLworI2RlZmluZSBRT1NfQklUU19OSUMgICAgICAgICAgICAgICAgICAgICgxKQkvKiBtYXhfYml0c19wZXJfc2Vjb25kX05JQyAqLworCQkJCQkJICAvKiBmaWVsZCBpcyB2YWxpZC4gICovCisjZGVmaW5lIFFPU19QS1RTX05JQyAgICAgICAgICAgICAgICAgICAgKDIpCS8qIG1heF9wYWNrZXRzX3Blcl9zZWNvbmRfTklDICovCisJCQkJCQkgIC8qIGZpZWxkIGlzIHZhbGlkLiAgKi8KKyNkZWZpbmUgUU9TX0lPUFNfSVNDU0kgICAgICAgICAgICAgICAgICAoNCkJLyogbWF4X2lvc19wZXJfc2Vjb25kX2lTQ1NJICovCisJCQkJCQkgIC8qZmllbGQgaXMgdmFsaWQuICAqLworI2RlZmluZSBRT1NfVkxBTl9UQUcgICAgICAgICAgICAgICAgICAgICg4KQkvKiBkb21haW5fVkxBTl90YWcgZmllbGQKKwkJCQkJCSAgIGlzIHZhbGlkLiAqLworI2RlZmluZSBRT1NfRkFCUklDX0lEICAgICAgICAgICAgICAgICAgICgxNikJLyogZmFicmljX2RvbWFpbl9JRCBmaWVsZAorCQkJCQkJICAgaXMgdmFsaWQuICovCisjZGVmaW5lIFFPU19PRU1fUEFSQU1TICAgICAgICAgICAgICAgICAgKDMyKQkvKiBxb3NfcGFyYW1zX29lbSBmaWVsZAorCQkJCQkJICAgaXMgdmFsaWQuICovCisjZGVmaW5lIFFPU19UUFVUX0lTQ1NJICAgICAgICAgICAgICAgICAgKDY0KQkvKiBtYXhfYnl0ZXNfcGVyX3NlY29uZF9pU0NTSQorCQkJCQkJICAgZmllbGQgIGlzIHZhbGlkLiAgKi8KKworCisvKgorICogLS0tIEZBSUxPVkVSX0NPTkZJR19FTlVNIC0tLQorICogRmFpbG92ZXIgY29uZmlndXJhdGlvbiBzZXR0aW5nIHVzZWQgaW4gRldDTURfQ09NTU9OX0ZPUkNFX0ZBSUxPVkVSCisgKi8KKyNkZWZpbmUgRkFJTE9WRVJfQ09ORklHX05PX0NIQU5HRSAgICAgICAoMCkJLyogTm8gY2hhbmdlIHRvIGF1dG9tYXRpYyAqLworCQkJCQkJICAvKiBwb3J0IGZhaWxvdmVyIHNldHRpbmcuICovCisjZGVmaW5lIEZBSUxPVkVSX0NPTkZJR19PTiAgICAgICAgICAgICAgKDEpCS8qIEF1dG9tYXRpYyBwb3J0IGZhaWxvdmVyCisJCQkJCQkgICBvbiBsaW5rIGRvd24gIGlzIGVuYWJsZWQuICovCisjZGVmaW5lIEZBSUxPVkVSX0NPTkZJR19PRkYgICAgICAgICAgICAgKDIpCS8qIEF1dG9tYXRpYyBwb3J0IGZhaWxvdmVyCisJCQkJCQkgICBvbiBsaW5rIGRvd24gaXMgZGlzYWJsZWQuICovCisKKy8qCisgKiAtLS0gRkFJTE9WRVJfUE9SVF9FTlVNIC0tLQorICogRmFpbG92ZXIgcG9ydCBzZXR0aW5nIHVzZWQgaW4gRldDTURfQ09NTU9OX0ZPUkNFX0ZBSUxPVkVSCisgKi8KKyNkZWZpbmUgRkFJTE9WRVJfUE9SVF9BICAgICAgICAgICAgICAgICAoMCkJLyogU2VsZWN0cyBwb3J0IEEuICovCisjZGVmaW5lIEZBSUxPVkVSX1BPUlRfQiAgICAgICAgICAgICAgICAgKDEpCS8qIFNlbGVjdHMgcG9ydCBCLiAqLworI2RlZmluZSBGQUlMT1ZFUl9QT1JUX05PTkUgICAgICAgICAgICAgICgxNSkJLyogTm8gcG9ydCBjaGFuZ2UgcmVxdWVzdGVkLiAqLworCisKKy8qCisgKiAtLS0gTUdNVF9GTEFTSFJPTV9PUENPREUgLS0tCisgKiBGbGFzaCBST00gb3BlcmF0aW9uIGNvZGUKKyAqLworI2RlZmluZSBNR01UX0ZMQVNIUk9NX09QQ09ERV9GTEFTSCAgICAgICgxKQkvKiBDb21taXQgZG93bmxvYWRlZCBkYXRhCisJCQkJCQkgICB0byBGbGFzaCBST00gKi8KKyNkZWZpbmUgTUdNVF9GTEFTSFJPTV9PUENPREVfU0FWRSAgICAgICAoMikJLyogU2F2ZSBkb3dubG9hZGVkIGRhdGEgdG8KKwkJCQkJCSAgIEFSTSdzIEREUiAtIGRvIG5vdCBmbGFzaCAqLworI2RlZmluZSBNR01UX0ZMQVNIUk9NX09QQ09ERV9DTEVBUiAgICAgICgzKQkvKiBFcmFzZSBzcGVjaWZpZWQgY29tcG9uZW50CisJCQkJCQkgICBmcm9tIEZsYXNoUk9NICovCisjZGVmaW5lIE1HTVRfRkxBU0hST01fT1BDT0RFX1JFUE9SVCAgICAgKDQpCS8qIFJlYWQgc3BlY2lmaWVkIGNvbXBvbmVudAorCQkJCQkJICAgZnJvbSBGbGFzaCBST00gKi8KKyNkZWZpbmUgTUdNVF9GTEFTSFJPTV9PUENPREVfSU1BR0VfSU5GTyAoNSkJLyogUmV0dXJucyBzaXplIG9mIGEKKwkJCQkJCSAgIGNvbXBvbmVudCAqLworCisvKgorICogLS0tIE1HTVRfRkxBU0hST01fT1BUWVBFIC0tLQorICogRmxhc2ggUk9NIG9wZXJhdGlvbiB0eXBlCisgKi8KKyNkZWZpbmUgTUdNVF9GTEFTSFJPTV9PUFRZUEVfQ09ERV9GSVJNV0FSRSAoMCkJLyogSW5jbHVkZXMgQVJNIGZpcm13YXJlLAorCQkJCQkJICAgSVBTZWMgKG9wdGlvbmFsKSBhbmQgRVAKKwkJCQkJCSAgIGZpcm13YXJlICAqLworI2RlZmluZSBNR01UX0ZMQVNIUk9NX09QVFlQRV9DT0RFX1JFREJPT1QgKDEpCisjZGVmaW5lIE1HTVRfRkxBU0hST01fT1BUWVBFX0NPREVfQklPUyAgKDIpCisjZGVmaW5lIE1HTVRfRkxBU0hST01fT1BUWVBFX0NPREVfUFhFX0JJT1MgKDMpCisjZGVmaW5lIE1HTVRfRkxBU0hST01fT1BUWVBFX0NPREVfQ1RSTFMgKDQpCisjZGVmaW5lIE1HTVRfRkxBU0hST01fT1BUWVBFX0NGR19JUFNFQyAgKDUpCisjZGVmaW5lIE1HTVRfRkxBU0hST01fT1BUWVBFX0NGR19JTkkgICAgKDYpCisjZGVmaW5lIE1HTVRfRkxBU0hST01fT1BUWVBFX1JPTV9PRkZTRVRfU1BFQ0lGSUVEICg3KQorCisvKgorICogLS0tIEZMQVNIUk9NX1RZUEUgLS0tCisgKiBGbGFzaCBST00gbWFudWZhY3R1cmVycyBzdXBwb3J0ZWQgaW4gdGhlIGYvdworICovCisjZGVmaW5lIElOVEVMICAgICAgICAgICAgICAgICAgICAgICAgICAgKDApCisjZGVmaW5lIFNQQU5TSU9OICAgICAgICAgICAgICAgICAgICAgICAgKDEpCisjZGVmaW5lIE1JQ1JPTiAgICAgICAgICAgICAgICAgICAgICAgICAgKDIpCisKKy8qIC0tLSBERFJfQ0FTX1RZUEUgLS0tICovCisjZGVmaW5lIENBU18zICAgICAgICAgICAgICAgICAgICAgICAgICAgKDApCisjZGVmaW5lIENBU180ICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEpCisjZGVmaW5lIENBU181ICAgICAgICAgICAgICAgICAgICAgICAgICAgKDIpCisKKy8qIC0tLSBERFJfU0laRV9UWVBFIC0tLSAqLworI2RlZmluZSBTSVpFXzI1Nk1CICAgICAgICAgICAgICAgICAgICAgICgwKQorI2RlZmluZSBTSVpFXzUxMk1CICAgICAgICAgICAgICAgICAgICAgICgxKQorCisvKiAtLS0gRERSX01PREVfVFlQRSAtLS0gKi8KKyNkZWZpbmUgRERSX05PX0VDQyAgICAgICAgICAgICAgICAgICAgICAoMCkKKyNkZWZpbmUgRERSX0VDQyAgICAgICAgICAgICAgICAgICAgICAgICAoMSkKKworLyogLS0tIElOVEVSRkFDRV8xMEdCX1RZUEUgLS0tICovCisjZGVmaW5lIENYNF9UWVBFICAgICAgICAgICAgICAgICAgICAgICAgKDApCisjZGVmaW5lIFhGUF9UWVBFICAgICAgICAgICAgICAgICAgICAgICAgKDEpCisKKy8qIC0tLSBCRV9DSElQX01BWF9NVFUgLS0tICovCisjZGVmaW5lIENISVBfTUFYX01UVSAgICAgICAgICAgICAgICAgICAgKDkwMDApCisKKy8qIC0tLSBYQVVJX1NUQVRFX0VOVU0gLS0tICovCisjZGVmaW5lIFhBVUlfU1RBVEVfRU5BQkxFICAgICAgICAgICAgICAgKDApCS8qIFRoaXMgTVVTVCBiZSB0aGUgZGVmYXVsdAorCQkJCQkJICAgdmFsdWUgZm9yIGFsbCByZXF1ZXN0cworCQkJCQkJICAgd2hpY2ggc2V0L2NoYW5nZQorCQkJCQkJICAgZXF1YWxpemF0aW9uIHBhcmFtZXRlci4gICovCisjZGVmaW5lIFhBVUlfU1RBVEVfRElTQUJMRSAgICAgICAgICAgICAgKDI1NSkJLyogVGhlIFhBVUkgZm9yIGJvdGggcG9ydHMKKwkJCQkJCSAgIG1heSBiZSBkaXNhYmxlZCBmb3IgRU1JCisJCQkJCQkgICB0ZXN0cy4gVGhlcmUgaXMgbm8KKwkJCQkJCSAgIHByb3Zpc2lvbiBmb3IgdHVybmluZyBvZmYKKwkJCQkJCSAgIGluZGl2aWR1YWwgcG9ydHMuCisJCQkJCQkgICAqLworLyogLS0tIEJFX0FTSUNfUkVWSVNJT04gLS0tICovCisjZGVmaW5lIEJFX0FTSUNfUkVWX0EwICAgICAgICAgICAgICAgICAgKDEpCisjZGVmaW5lIEJFX0FTSUNfUkVWX0ExICAgICAgICAgICAgICAgICAgKDIpCisKKyNlbmRpZiAvKiBfX2Z3Y21kX2NvbW1vbl9hbWFwX2hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JlbmV0L2Z3Y21kX2NvbW1vbl9ibWFwLmggYi9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvZndjbWRfY29tbW9uX2JtYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDA3Y2YyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JlbmV0L2Z3Y21kX2NvbW1vbl9ibWFwLmgKQEAgLTAsMCArMSw3MTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgLSAyMDA4IFNlcnZlckVuZ2luZXMKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFRoZSBmdWxsIEdOVSBHZW5lcmFsCisgKiBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUgZmlsZSBjYWxsZWQgQ09QWUlORy4KKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogbGludXgtZHJpdmVyc0BzZXJ2ZXJlbmdpbmVzLmNvbQorICoKKyAqIFNlcnZlckVuZ2luZXMKKyAqIDIwOSBOLiBGYWlyIE9ha3MgQXZlCisgKiBTdW5ueXZhbGUsIENBIDk0MDg1CisgKi8KKy8qCisgKiBBdXRvZ2VuZXJhdGVkIGJ5IHNyY2dlbiB2ZXJzaW9uOiAwMTI3CisgKi8KKyNpZm5kZWYgX19md2NtZF9jb21tb25fYm1hcF9oX18KKyNkZWZpbmUgX19md2NtZF9jb21tb25fYm1hcF9oX18KKyNpbmNsdWRlICJmd2NtZF90eXBlc19ibWFwLmgiCisjaW5jbHVkZSAiZndjbWRfaGRyX2JtYXAuaCIKKworI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOKQorICAgLyogUGh5c2ljYWwgQWRkcmVzcy4gKi8KK3N0cnVjdCBQSFlTX0FERFIgeworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCXUzMiBsbzsJLyogRFdPUkQgMCAqLworCQkJdTMyIGhpOwkvKiBEV09SRCAxICovCisJCX0gX19wYWNrZWQ7CS8qIHVubmFtZWQgc3RydWN0ICovCisJCXUzMiBkd1syXTsJLyogZHdvcmQgdW5pb24gKi8KKwl9OwkJCS8qIHVubmFtZWQgdW5pb24gKi8KK30gX19wYWNrZWQgOworCisKKyNlbHNlCisgICAvKiBQaHlzaWNhbCBBZGRyZXNzLiAqLworc3RydWN0IFBIWVNfQUREUiB7CisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJdTMyIGxvOwkvKiBEV09SRCAwICovCisJCQl1MzIgaGk7CS8qIERXT1JEIDEgKi8KKwkJfSBfX3BhY2tlZDsJLyogdW5uYW1lZCBzdHJ1Y3QgKi8KKwkJdTMyIGR3WzJdOwkvKiBkd29yZCB1bmlvbiAqLworCX07CQkJLyogdW5uYW1lZCB1bmlvbiAqLworfSBfX3BhY2tlZCA7CisKK3N0cnVjdCBCRV9MSU5LX1NUQVRVUyB7CisJdTggbWFjMF9kdXBsZXg7CisJdTggbWFjMF9zcGVlZDsKKwl1OCBtYWMxX2R1cGxleDsKKwl1OCBtYWMxX3NwZWVkOworCXU4IG1nbXRfbWFjX2R1cGxleDsKKwl1OCBtZ210X21hY19zcGVlZDsKKwl1OCBhY3RpdmVfcG9ydDsKKwl1OCByc3ZkMDsKKwl1OCBtYWMwX2ZhdWx0OworCXU4IG1hYzFfZmF1bHQ7CisJdTE2IHJzdmQxOworfSBfX3BhY2tlZDsKKyNlbmRpZgorCitzdHJ1Y3QgRldDTURfQ09NTU9OX0FOT05fMTcwX1JFUVVFU1QgeworCXUzMiByc3ZkMDsKK30gX19wYWNrZWQ7CisKK3VuaW9uIExJTktfU1RBVFVTX1FVRVJZX1BBUkFNUyB7CisJc3RydWN0IEJFX0xJTktfU1RBVFVTIHJlc3BvbnNlOworCXN0cnVjdCBGV0NNRF9DT01NT05fQU5PTl8xNzBfUkVRVUVTVCByZXF1ZXN0OworfSBfX3BhY2tlZDsKKworLyoKKyAqICBRdWVyaWVzIHRoZSB0aGUgbGluayBzdGF0dXMgZm9yIGFsbCBwb3J0cy4gIFRoZSB2YWxpZCB2YWx1ZXMgYmVsb3cKKyAqICBETyBOT1QgaW5kaWNhdGUgdGhhdCAgYSBwYXJ0aWN1bGFyIGR1cGxleCBvciBzcGVlZCBpcyBzdXBwb3J0ZWQgYnkKKyAqICBCbGFkZUVuZ2luZS4gVGhlc2UgZW51bWVyYXRpb25zIHNpbXBseSAgbGlzdCBhbGwgcG9zc2libGUgZHVwbGV4ZXMKKyAqICBhbmQgc3BlZWRzIGZvciBhbnkgcG9ydC4gQ29uc3VsdCBCbGFkZUVuZ2luZSBwcm9kdWN0ICBkb2N1bWVudGF0aW9uCisgKiAgZm9yIHRoZSBzdXBwb3J0ZWQgcGFyYW1ldGVycy4KKyAqLworc3RydWN0IEZXQ01EX0NPTU1PTl9OVFdLX0xJTktfU1RBVFVTX1FVRVJZIHsKKwl1bmlvbiBGV0NNRF9IRUFERVIgaGVhZGVyOworCXVuaW9uIExJTktfU1RBVFVTX1FVRVJZX1BBUkFNUyBwYXJhbXM7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgRldDTURfQ09NTU9OX0FOT05fMTcxX1JFUVVFU1QgeworCXU4IHR5cGU7CisJdTggcG9ydDsKKwl1OCBtYWMxOworCXU4IHBlcm1hbmVudDsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBGV0NNRF9DT01NT05fQU5PTl8xNzJfUkVTUE9OU0UgeworCXN0cnVjdCBNQUNfQUREUkVTU19GT1JNQVQgbWFjOworfSBfX3BhY2tlZDsKKwordW5pb24gTlRXS19NQUNfUVVFUllfUEFSQU1TIHsKKwlzdHJ1Y3QgRldDTURfQ09NTU9OX0FOT05fMTcxX1JFUVVFU1QgcmVxdWVzdDsKKwlzdHJ1Y3QgRldDTURfQ09NTU9OX0FOT05fMTcyX1JFU1BPTlNFIHJlc3BvbnNlOworfSBfX3BhY2tlZDsKKworLyogUXVlcmllcyBvbmUgTUFDIGFkZHJlc3MuICAqLworc3RydWN0IEZXQ01EX0NPTU1PTl9OVFdLX01BQ19RVUVSWSB7CisJdW5pb24gRldDTURfSEVBREVSIGhlYWRlcjsKKwl1bmlvbiBOVFdLX01BQ19RVUVSWV9QQVJBTVMgcGFyYW1zOworfSBfX3BhY2tlZDsKKworc3RydWN0IE1BQ19TRVRfUEFSQU1TX0lOIHsKKwl1OCB0eXBlOworCXU4IHBvcnQ7CisJdTggbWFjMTsKKwl1OCBpbnZhbGlkYXRlOworCXN0cnVjdCBNQUNfQUREUkVTU19GT1JNQVQgbWFjOworfSBfX3BhY2tlZDsKKworc3RydWN0IE1BQ19TRVRfUEFSQU1TX09VVCB7CisJdTMyIHJzdmQwOworfSBfX3BhY2tlZDsKKwordW5pb24gTUFDX1NFVF9QQVJBTVMgeworCXN0cnVjdCBNQUNfU0VUX1BBUkFNU19JTiByZXF1ZXN0OworCXN0cnVjdCBNQUNfU0VUX1BBUkFNU19PVVQgcmVzcG9uc2U7Cit9IF9fcGFja2VkOworCisvKiBTZXRzIGEgTUFDIGFkZHJlc3MuICAqLworc3RydWN0IEZXQ01EX0NPTU1PTl9OVFdLX01BQ19TRVQgeworCXVuaW9uIEZXQ01EX0hFQURFUiBoZWFkZXI7CisJdW5pb24gTUFDX1NFVF9QQVJBTVMgcGFyYW1zOworfSBfX3BhY2tlZDsKKworLyogTUFDIGFkZHJlc3MgbGlzdC4gKi8KK3N0cnVjdCBOVFdLX01VTFRJQ0FTVF9NQUNfTElTVCB7CisJdTggYnl0ZVs2XTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBGV0NNRF9DT01NT05fTlRXS19NVUxUSUNBU1RfU0VUX1JFUVVFU1RfUEFZTE9BRCB7CisJdTE2IG51bV9tYWM7CisJdTggcHJvbWlzY3VvdXM7CisJdTggcnN2ZDA7CisJc3RydWN0IE5UV0tfTVVMVElDQVNUX01BQ19MSVNUIG1hY1szMl07Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgRldDTURfQ09NTU9OX0FOT05fMTc0X1JFU1BPTlNFIHsKKwl1MzIgcnN2ZDA7Cit9IF9fcGFja2VkOworCit1bmlvbiBGV0NNRF9DT01NT05fQU5PTl8xNzNfUEFSQU1TIHsKKwlzdHJ1Y3QgRldDTURfQ09NTU9OX05UV0tfTVVMVElDQVNUX1NFVF9SRVFVRVNUX1BBWUxPQUQgcmVxdWVzdDsKKwlzdHJ1Y3QgRldDTURfQ09NTU9OX0FOT05fMTc0X1JFU1BPTlNFIHJlc3BvbnNlOworfSBfX3BhY2tlZDsKKworLyoKKyAqICBTZXRzIG11bHRpY2FzdCBhZGRyZXNzIGhhc2guIFRoZSBNUFUgd2lsbCBtZXJnZSB0aGUgTUFDIGFkZHJlc3MgbGlzdHMKKyAqICBmcm9tIGFsbCBjbGllbnRzLCAgaW5jbHVkaW5nIHRoZSBuZXR3b3JraW5nIGFuZCBzdG9yYWdlIGZ1bmN0aW9ucy4KKyAqICBUaGlzIGNvbW1hbmQgbWF5IGZhaWwgaWYgdGhlIGZpbmFsIG1lcmdlZCAgbGlzdCBvZiBNQUMgYWRkcmVzc2VzIGV4Y2VlZHMKKyAqICAzMiBlbnRyaWVzLgorICovCitzdHJ1Y3QgRldDTURfQ09NTU9OX05UV0tfTVVMVElDQVNUX1NFVCB7CisJdW5pb24gRldDTURfSEVBREVSIGhlYWRlcjsKKwl1bmlvbiBGV0NNRF9DT01NT05fQU5PTl8xNzNfUEFSQU1TIHBhcmFtczsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBGV0NNRF9DT01NT05fTlRXS19WTEFOX0NPTkZJR19SRVFVRVNUX1BBWUxPQUQgeworCXUxNiBudW1fdmxhbjsKKwl1OCBwcm9taXNjdW91czsKKwl1OCByc3ZkMDsKKwl1MTYgdmxhbl90YWdbMzJdOworfSBfX3BhY2tlZDsKKworc3RydWN0IEZXQ01EX0NPTU1PTl9BTk9OXzE3Nl9SRVNQT05TRSB7CisJdTMyIHJzdmQwOworfSBfX3BhY2tlZDsKKwordW5pb24gRldDTURfQ09NTU9OX0FOT05fMTc1X1BBUkFNUyB7CisJc3RydWN0IEZXQ01EX0NPTU1PTl9OVFdLX1ZMQU5fQ09ORklHX1JFUVVFU1RfUEFZTE9BRCByZXF1ZXN0OworCXN0cnVjdCBGV0NNRF9DT01NT05fQU5PTl8xNzZfUkVTUE9OU0UgcmVzcG9uc2U7Cit9IF9fcGFja2VkOworCisvKgorICogIFNldHMgVkxBTiB0YWcgZmlsdGVyLiBUaGUgTVBVIHdpbGwgbWVyZ2UgdGhlIFZMQU4gdGFnIGxpc3QgZnJvbSBhbGwKKyAqICBjbGllbnRzLCBpbmNsdWRpbmcgIHRoZSBuZXR3b3JraW5nIGFuZCBzdG9yYWdlIGZ1bmN0aW9ucy4gVGhpcyBjb21tYW5kCisgKiAgbWF5IGZhaWwgaWYgdGhlIGZpbmFsIHZsYW5fdGFnIGFycmF5ICAoZnJvbSBhbGwgZnVuY3Rpb25zKSBpcyBsb25nZXIKKyAqICB0aGFuIDMyIGVudHJpZXMuCisgKi8KK3N0cnVjdCBGV0NNRF9DT01NT05fTlRXS19WTEFOX0NPTkZJRyB7CisJdW5pb24gRldDTURfSEVBREVSIGhlYWRlcjsKKwl1bmlvbiBGV0NNRF9DT01NT05fQU5PTl8xNzVfUEFSQU1TIHBhcmFtczsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBSSU5HX0RFU1RST1lfUkVRVUVTVCB7CisJdTE2IHJpbmdfdHlwZTsKKwl1MTYgaWQ7CisJdTggYnlwYXNzX2ZsdXNoOworCXU4IHJzdmQwOworCXUxNiByc3ZkMTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBGV0NNRF9DT01NT05fQU5PTl8xOTBfUkVTUE9OU0UgeworCXUzMiByc3ZkMDsKK30gX19wYWNrZWQ7CisKK3VuaW9uIEZXQ01EX0NPTU1PTl9BTk9OXzE4OV9QQVJBTVMgeworCXN0cnVjdCBSSU5HX0RFU1RST1lfUkVRVUVTVCByZXF1ZXN0OworCXN0cnVjdCBGV0NNRF9DT01NT05fQU5PTl8xOTBfUkVTUE9OU0UgcmVzcG9uc2U7Cit9IF9fcGFja2VkOworLyoKKyAqICBDb21tYW5kIGZvciBkZXN0cm95aW5nIGFueSByaW5nLiBUaGUgY29ubmVjdGlvbihzKSB1c2luZyB0aGUgcmluZyBzaG91bGQKKyAqICBiZSBxdWllc2NlZCAgYmVmb3JlIGRlc3Ryb3lpbmcgdGhlIHJpbmcuCisgKi8KK3N0cnVjdCBGV0NNRF9DT01NT05fUklOR19ERVNUUk9ZIHsKKwl1bmlvbiBGV0NNRF9IRUFERVIgaGVhZGVyOworCXVuaW9uIEZXQ01EX0NPTU1PTl9BTk9OXzE4OV9QQVJBTVMgcGFyYW1zOworfSBfX3BhY2tlZDsKKworc3RydWN0IEZXQ01EX0NPTU1PTl9BTk9OXzE5Ml9SRVFVRVNUIHsKKwl1MTYgbnVtX3BhZ2VzOworCXUxNiByc3ZkMDsKKwlzdHJ1Y3QgQ1FfQ09OVEVYVF9BTUFQIGNvbnRleHQ7CisJc3RydWN0IFBIWVNfQUREUiBwYWdlc1s0XTsKK30gX19wYWNrZWQgOworCitzdHJ1Y3QgRldDTURfQ09NTU9OX0FOT05fMTkzX1JFU1BPTlNFIHsKKwl1MTYgY3FfaWQ7Cit9IF9fcGFja2VkIDsKKwordW5pb24gRldDTURfQ09NTU9OX0FOT05fMTkxX1BBUkFNUyB7CisJc3RydWN0IEZXQ01EX0NPTU1PTl9BTk9OXzE5Ml9SRVFVRVNUIHJlcXVlc3Q7CisJc3RydWN0IEZXQ01EX0NPTU1PTl9BTk9OXzE5M19SRVNQT05TRSByZXNwb25zZTsKK30gX19wYWNrZWQgOworCisvKgorICogIENvbW1hbmQgZm9yIGNyZWF0aW5nIGEgY29tcGxldGlvbiBxdWV1ZS4gQSBDb21wbGV0aW9uIFF1ZXVlIG11c3Qgc3BhbgorICogIGF0IGxlYXN0IDEgcGFnZSBhbmQgIGF0IG1vc3QgNCBwYWdlcy4gRWFjaCBjb21wbGV0aW9uIHF1ZXVlIGVudHJ5CisgKiAgaXMgMTYgYnl0ZXMgcmVnYXJkbGVzcyBvZiBDUSBlbnRyeSBmb3JtYXQuICBUaHVzIHRoZSByaW5nIG11c3QgYmUKKyAqICBhdCBsZWFzdCAyNTYgZW50cmllcyBkZWVwIChjb3JyZXNwb25kaW5nIHRvIDEgcGFnZSkgYW5kIGNhbiBiZSBhdAorICogICBtb3N0IDEwMjQgZW50cmllcyBkZWVwIChjb3JyZXNwb25kaW5nIHRvIDQgcGFnZXMpLiBUaGUgbnVtYmVyIG9mCisgKiAgcGFnZXMgcG9zdGVkIG11c3QgIGNvbnRhaW4gdGhlIENRIHJpbmcgc2l6ZSBhcyBlbmNvZGVkIGluIHRoZSBjb250ZXh0LgorICoKKyAqLworc3RydWN0IEZXQ01EX0NPTU1PTl9DUV9DUkVBVEUgeworCXVuaW9uIEZXQ01EX0hFQURFUiBoZWFkZXI7CisJdW5pb24gRldDTURfQ09NTU9OX0FOT05fMTkxX1BBUkFNUyBwYXJhbXM7Cit9IF9fcGFja2VkIDsKKworc3RydWN0IEZXQ01EX0NPTU1PTl9BTk9OXzE5OF9SRVFVRVNUIHsKKwl1MTYgbnVtX3BhZ2VzOworCXUxNiByc3ZkMDsKKwlzdHJ1Y3QgRVFfQ09OVEVYVF9BTUFQIGNvbnRleHQ7CisJc3RydWN0IFBIWVNfQUREUiBwYWdlc1s4XTsKK30gX19wYWNrZWQgOworCitzdHJ1Y3QgRldDTURfQ09NTU9OX0FOT05fMTk5X1JFU1BPTlNFIHsKKwl1MTYgZXFfaWQ7Cit9IF9fcGFja2VkIDsKKwordW5pb24gRldDTURfQ09NTU9OX0FOT05fMTk3X1BBUkFNUyB7CisJc3RydWN0IEZXQ01EX0NPTU1PTl9BTk9OXzE5OF9SRVFVRVNUIHJlcXVlc3Q7CisJc3RydWN0IEZXQ01EX0NPTU1PTl9BTk9OXzE5OV9SRVNQT05TRSByZXNwb25zZTsKK30gX19wYWNrZWQgOworCisvKgorICogIENvbW1hbmQgZm9yIGNyZWF0aW5nIGEgZXZlbnQgcXVldWUuIEFuIEV2ZW50IFF1ZXVlIG11c3Qgc3BhbiBhdCBsZWFzdAorICogIDEgcGFnZSBhbmQgYXQgbW9zdCAgOCBwYWdlcy4gVGhlIG51bWJlciBvZiBwYWdlcyBwb3N0ZWQgbXVzdCBjb250YWluCisgKiAgdGhlIEVRIHJpbmcuIFRoZSByaW5nIGlzIGRlZmluZWQgYnkgIHRoZSBzaXplIG9mIHRoZSBFUSBlbnRyaWVzIChlbmNvZGVkCisgKiAgaW4gdGhlIGNvbnRleHQpIGFuZCB0aGUgbnVtYmVyIG9mIEVRIGVudHJpZXMgKGFsc28gIGVuY29kZWQgaW4gdGhlCisgKiAgY29udGV4dCkuCisgKi8KK3N0cnVjdCBGV0NNRF9DT01NT05fRVFfQ1JFQVRFIHsKKwl1bmlvbiAgRldDTURfSEVBREVSIGhlYWRlcjsKKwl1bmlvbiBGV0NNRF9DT01NT05fQU5PTl8xOTdfUEFSQU1TIHBhcmFtczsKK30gX19wYWNrZWQgOworCitzdHJ1Y3QgRldDTURfQ09NTU9OX0FOT05fMjAxX1JFUVVFU1QgeworCXUxNiBjcV9pZDsKKwl1MTYgYmNtY19jcV9pZDsKKwl1MTYgbnVtX3BhZ2VzOworCXUxNiByc3ZkMDsKKwlzdHJ1Y3QgUEhZU19BRERSIHBhZ2VzWzJdOworfSBfX3BhY2tlZDsKKworc3RydWN0IEZXQ01EX0NPTU1PTl9BTk9OXzIwMl9SRVNQT05TRSB7CisJdTE2IGlkOworfSBfX3BhY2tlZDsKKwordW5pb24gRldDTURfQ09NTU9OX0FOT05fMjAwX1BBUkFNUyB7CisJc3RydWN0IEZXQ01EX0NPTU1PTl9BTk9OXzIwMV9SRVFVRVNUIHJlcXVlc3Q7CisJc3RydWN0IEZXQ01EX0NPTU1PTl9BTk9OXzIwMl9SRVNQT05TRSByZXNwb25zZTsKK30gX19wYWNrZWQ7CisKKy8qCisgKiAgQ29tbWFuZCBmb3IgY3JlYXRpbmcgRXRoZXJuZXQgcmVjZWl2ZSByaW5nLiAgQW4gRVJYIHJpbmcgY29udGFpbnMgRVRIX1JYX0QKKyAqICBlbnRyaWVzICg4ICBieXRlcyBlYWNoKS4gQW4gRVJYIHJpbmcgbXVzdCBiZSAxMDI0IGVudHJpZXMgZGVlcAorICogIChjb3JyZXNwb25kaW5nIHRvIDIgcGFnZXMpLgorICovCitzdHJ1Y3QgRldDTURfQ09NTU9OX0VUSF9SWF9DUkVBVEUgeworCXVuaW9uIEZXQ01EX0hFQURFUiBoZWFkZXI7CisJdW5pb24gRldDTURfQ09NTU9OX0FOT05fMjAwX1BBUkFNUyBwYXJhbXM7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgRldDTURfQ09NTU9OX0FOT05fMjA0X1JFUVVFU1QgeworCXUxNiBudW1fcGFnZXM7CisJdTggdWxwX251bTsKKwl1OCB0eXBlOworCXN0cnVjdCBFVFhfQ09OVEVYVF9BTUFQIGNvbnRleHQ7CisJc3RydWN0IFBIWVNfQUREUiBwYWdlc1s4XTsKK30gX19wYWNrZWQgOworCitzdHJ1Y3QgRldDTURfQ09NTU9OX0FOT05fMjA1X1JFU1BPTlNFIHsKKwl1MTYgY2lkOworCXU4IHVscF9udW07CisJdTggcnN2ZDA7Cit9IF9fcGFja2VkIDsKKwordW5pb24gRldDTURfQ09NTU9OX0FOT05fMjAzX1BBUkFNUyB7CisJc3RydWN0IEZXQ01EX0NPTU1PTl9BTk9OXzIwNF9SRVFVRVNUIHJlcXVlc3Q7CisJc3RydWN0IEZXQ01EX0NPTU1PTl9BTk9OXzIwNV9SRVNQT05TRSByZXNwb25zZTsKK30gX19wYWNrZWQgOworCisvKgorICogIENvbW1hbmQgZm9yIGNyZWF0aW5nIGFuIEV0aGVybmV0IHRyYW5zbWl0IHJpbmcuICBBbiBFVFggcmluZyBjb250YWlucworICogIEVUSF9XUkIgZW50cmllcyAoMTYgIGJ5dGVzIGVhY2gpLiBBbiBFVFggcmluZyBtdXN0IGJlIGF0IGxlYXN0IDI1NgorICogIGVudHJpZXMgZGVlcCAoY29ycmVzcG9uZGluZyB0byAxIHBhZ2UpICBhbmQgYXQgbW9zdCAyayBlbnRyaWVzIGRlZXAKKyAqICAoY29ycmVzcG9uZGluZyB0byA4IHBhZ2VzKS4KKyAqLworc3RydWN0IEZXQ01EX0NPTU1PTl9FVEhfVFhfQ1JFQVRFIHsKKwl1bmlvbiBGV0NNRF9IRUFERVIgaGVhZGVyOworCXVuaW9uIEZXQ01EX0NPTU1PTl9BTk9OXzIwM19QQVJBTVMgcGFyYW1zOworfSBfX3BhY2tlZCA7CisKK3N0cnVjdCBGV0NNRF9DT01NT05fQU5PTl8yMjJfUkVRVUVTVCB7CisJdTE2IG51bV9wYWdlczsKKwl1MTYgcnN2ZDA7CisJc3RydWN0IE1DQ19SSU5HX0NPTlRFWFRfQU1BUCBjb250ZXh0OworCXN0cnVjdCBQSFlTX0FERFIgcGFnZXNbOF07Cit9IF9fcGFja2VkIDsKKworc3RydWN0IEZXQ01EX0NPTU1PTl9BTk9OXzIyM19SRVNQT05TRSB7CisJdTE2IGlkOworfSBfX3BhY2tlZCA7CisKK3VuaW9uIEZXQ01EX0NPTU1PTl9BTk9OXzIyMV9QQVJBTVMgeworCXN0cnVjdCBGV0NNRF9DT01NT05fQU5PTl8yMjJfUkVRVUVTVCByZXF1ZXN0OworCXN0cnVjdCBGV0NNRF9DT01NT05fQU5PTl8yMjNfUkVTUE9OU0UgcmVzcG9uc2U7Cit9IF9fcGFja2VkIDsKKworLyoKKyAqICBDb21tYW5kIGZvciBjcmVhdGluZyB0aGUgTUNDIHJpbmcuIEFuIE1DQyByaW5nIG11c3QgYmUgYXQgbGVhc3QgMTYKKyAqICBlbnRyaWVzIGRlZXAgIChjb3JyZXNwb25kaW5nIHRvIDEgcGFnZSkgYW5kIGF0IG1vc3QgMTI4IGVudHJpZXMgZGVlcAorICogIChjb3JyZXNwb25kaW5nIHRvIDggcGFnZXMpLgorICovCitzdHJ1Y3QgRldDTURfQ09NTU9OX01DQ19DUkVBVEUgeworCXVuaW9uIEZXQ01EX0hFQURFUiBoZWFkZXI7CisJdW5pb24gRldDTURfQ09NTU9OX0FOT05fMjIxX1BBUkFNUyBwYXJhbXM7Cit9IF9fcGFja2VkIDsKKworc3RydWN0IEdFVF9RT1NfSU4geworCXUzMiBxb3NfcGFyYW1zX3JzdmQ7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgR0VUX1FPU19PVVQgeworCXUzMiBtYXhfYml0c19wZXJfc2Vjb25kX05JQzsKKwl1MzIgbWF4X3BhY2tldHNfcGVyX3NlY29uZF9OSUM7CisJdTMyIG1heF9pb3NfcGVyX3NlY29uZF9pU0NTSTsKKwl1MzIgbWF4X2J5dGVzX3Blcl9zZWNvbmRfaVNDU0k7CisJdTE2IGRvbWFpbl9WTEFOX3RhZzsKKwl1MTYgZmFicmljX2RvbWFpbl9JRDsKKwl1MzIgcW9zX3BhcmFtc19vZW1bNF07Cit9IF9fcGFja2VkOworCit1bmlvbiBHRVRfUU9TX1BBUkFNUyB7CisJc3RydWN0IEdFVF9RT1NfSU4gcmVxdWVzdDsKKwlzdHJ1Y3QgR0VUX1FPU19PVVQgcmVzcG9uc2U7Cit9IF9fcGFja2VkOworCisvKiBRT1MvQmFuZHdpZHRoIHNldHRpbmdzIHBlciBkb21haW4uIEFwcGxpY2FibGUgb25seSBpbiBWTXMuICAqLworc3RydWN0IEZXQ01EX0NPTU1PTl9HRVRfUU9TIHsKKwl1bmlvbiBGV0NNRF9IRUFERVIgaGVhZGVyOworCXVuaW9uIEdFVF9RT1NfUEFSQU1TIHBhcmFtczsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBTRVRfUU9TX0lOIHsKKwl1MzIgdmFsaWRfZmxhZ3M7CisJdTMyIG1heF9iaXRzX3Blcl9zZWNvbmRfTklDOworCXUzMiBtYXhfcGFja2V0c19wZXJfc2Vjb25kX05JQzsKKwl1MzIgbWF4X2lvc19wZXJfc2Vjb25kX2lTQ1NJOworCXUzMiBtYXhfYnl0ZXNfcGVyX3NlY29uZF9pU0NTSTsKKwl1MTYgZG9tYWluX1ZMQU5fdGFnOworCXUxNiBmYWJyaWNfZG9tYWluX0lEOworCXUzMiBxb3NfcGFyYW1zX29lbVs0XTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBTRVRfUU9TX09VVCB7CisJdTMyIHFvc19wYXJhbXNfcnN2ZDsKK30gX19wYWNrZWQ7CisKK3VuaW9uIFNFVF9RT1NfUEFSQU1TIHsKKwlzdHJ1Y3QgU0VUX1FPU19JTiByZXF1ZXN0OworCXN0cnVjdCBTRVRfUU9TX09VVCByZXNwb25zZTsKK30gX19wYWNrZWQ7CisKKy8qIFFPUy9CYW5kd2lkdGggc2V0dGluZ3MgcGVyIGRvbWFpbi4gQXBwbGljYWJsZSBvbmx5IGluIFZNcy4gICovCitzdHJ1Y3QgRldDTURfQ09NTU9OX1NFVF9RT1MgeworCXVuaW9uIEZXQ01EX0hFQURFUiBoZWFkZXI7CisJdW5pb24gU0VUX1FPU19QQVJBTVMgcGFyYW1zOworfSBfX3BhY2tlZDsKKworc3RydWN0IFNFVF9GUkFNRV9TSVpFX0lOIHsKKwl1MzIgbWF4X3R4X2ZyYW1lX3NpemU7CisJdTMyIG1heF9yeF9mcmFtZV9zaXplOworfSBfX3BhY2tlZDsKKworc3RydWN0IFNFVF9GUkFNRV9TSVpFX09VVCB7CisJdTMyIGNoaXBfbWF4X3R4X2ZyYW1lX3NpemU7CisJdTMyIGNoaXBfbWF4X3J4X2ZyYW1lX3NpemU7Cit9IF9fcGFja2VkOworCit1bmlvbiBTRVRfRlJBTUVfU0laRV9QQVJBTVMgeworCXN0cnVjdCBTRVRfRlJBTUVfU0laRV9JTiByZXF1ZXN0OworCXN0cnVjdCBTRVRfRlJBTUVfU0laRV9PVVQgcmVzcG9uc2U7Cit9IF9fcGFja2VkOworCisvKiBTZXQgZnJhbWUgc2l6ZSBjb21tYW5kLiBPbmx5IGhvc3QgZG9tYWluIG1heSBpc3N1ZSB0aGlzIGNvbW1hbmQuICAqLworc3RydWN0IEZXQ01EX0NPTU1PTl9TRVRfRlJBTUVfU0laRSB7CisJdW5pb24gRldDTURfSEVBREVSIGhlYWRlcjsKKwl1bmlvbiBTRVRfRlJBTUVfU0laRV9QQVJBTVMgcGFyYW1zOworfSBfX3BhY2tlZDsKKworc3RydWN0IEZPUkNFX0ZBSUxPVkVSX0lOIHsKKwl1MzIgbW92ZV90b19wb3J0OworCXUzMiBmYWlsb3Zlcl9jb25maWc7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgRldDTURfQ09NTU9OX0FOT05fMjMxX1JFU1BPTlNFIHsKKwl1MzIgcnN2ZDA7Cit9IF9fcGFja2VkOworCit1bmlvbiBGV0NNRF9DT01NT05fQU5PTl8yMzBfUEFSQU1TIHsKKwlzdHJ1Y3QgRk9SQ0VfRkFJTE9WRVJfSU4gcmVxdWVzdDsKKwlzdHJ1Y3QgRldDTURfQ09NTU9OX0FOT05fMjMxX1JFU1BPTlNFIHJlc3BvbnNlOworfSBfX3BhY2tlZDsKKworLyoKKyAqICBVc2UgdGhpcyBjb21tYW5kIHRvIGNvbnRyb2wgZmFpbG92ZXIgaW4gQmxhZGVFbmdpbmUuIEl0IG1heSBiZSB1c2VkCisgKiAgdG8gZmFpbGJhY2sgdG8gYSAgcmVzdG9yZWQgcG9ydCBvciB0byBmb3JjaWJseSBtb3ZlIHRyYWZmaWMgZnJvbQorICogIG9uZSBwb3J0IHRvIGFub3RoZXIuIEl0IG1heSBhbHNvIGJlIHVzZWQgIHRvIGVuYWJsZSBvciBkaXNhYmxlIHRoZQorICogIGF1dG9tYXRpYyBmYWlsb3ZlciBmZWF0dXJlLiBUaGlzIGNvbW1hbmQgY2FuIG9ubHkgYmUgaXNzdWVkIGJ5ICBkb21haW4KKyAqICAwLgorICovCitzdHJ1Y3QgRldDTURfQ09NTU9OX0ZPUkNFX0ZBSUxPVkVSIHsKKwl1bmlvbiBGV0NNRF9IRUFERVIgaGVhZGVyOworCXVuaW9uIEZXQ01EX0NPTU1PTl9BTk9OXzIzMF9QQVJBTVMgcGFyYW1zOworfSBfX3BhY2tlZDsKKworc3RydWN0IEZXQ01EX0NPTU1PTl9BTk9OXzI0MF9SRVFVRVNUIHsKKwl1NjQgY29udGV4dDsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBGV0NNRF9DT01NT05fQU5PTl8yNDFfUkVTUE9OU0UgeworCXU2NCBjb250ZXh0OworfSBfX3BhY2tlZDsKKwordW5pb24gRldDTURfQ09NTU9OX0FOT05fMjM5X1BBUkFNUyB7CisJc3RydWN0IEZXQ01EX0NPTU1PTl9BTk9OXzI0MF9SRVFVRVNUIHJlcXVlc3Q7CisJc3RydWN0IEZXQ01EX0NPTU1PTl9BTk9OXzI0MV9SRVNQT05TRSByZXNwb25zZTsKK30gX19wYWNrZWQ7CisKKy8qCisgKiAgVGhpcyBjb21tYW5kIGNhbiBiZSB1c2VkIGJ5IGNsaWVudHMgYXMgYSBuby1vcGVyYXRpb24gcmVxdWVzdC4gVHlwaWNhbAorICogIHVzZXMgZm9yIGRyaXZlcnMgIGFyZSBhcyBhIGhlYXJ0YmVhdCBtZWNoYW5pc20sIG9yIGRlZmVycmVkIHByb2Nlc3NpbmcKKyAqICBjYXRhbHlzdC4gVGhlIEFSTSB3aWxsIGFsd2F5cyAgY29tcGxldGUgdGhpcyBjb21tYW5kIHdpdGggYSBnb29kIGNvbXBsZXRpb24uCisgKiAgVGhlIDY0LWJpdCBwYXJhbWV0ZXIgaXMgbm90IHRvdWNoZWQgYnkgdGhlICBBUk0gcHJvY2Vzc29yLgorICovCitzdHJ1Y3QgRldDTURfQ09NTU9OX05PUCB7CisJdW5pb24gRldDTURfSEVBREVSIGhlYWRlcjsKKwl1bmlvbiBGV0NNRF9DT01NT05fQU5PTl8yMzlfUEFSQU1TIHBhcmFtczsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBOVFdLX1JYX0ZJTFRFUl9TRVRUSU5HUyB7CisJdTggcHJvbWlzY3VvdXM7CisJdTggaXBfY2tzdW07CisJdTggdGNwX2Nrc3VtOworCXU4IHVkcF9ja3N1bTsKKwl1OCBwYXNzX2VycjsKKwl1OCBwYXNzX2NrZXJyOworCXU4IHN0cmlwX2NyYzsKKwl1OCBtY2FzdF9lbjsKKwl1OCBiY2FzdF9lbjsKKwl1OCBtY2FzdF9wcm9taXNjdW91c19lbjsKKwl1OCB1bmljYXN0X2VuOworCXU4IHZsYW5fcHJvbWlzY3VvdXM7Cit9IF9fcGFja2VkOworCit1bmlvbiBGV0NNRF9DT01NT05fQU5PTl8yNDJfUEFSQU1TIHsKKwlzdHJ1Y3QgTlRXS19SWF9GSUxURVJfU0VUVElOR1MgcmVxdWVzdDsKKwlzdHJ1Y3QgTlRXS19SWF9GSUxURVJfU0VUVElOR1MgcmVzcG9uc2U7Cit9IF9fcGFja2VkOworCisvKgorICogIFRoaXMgY29tbWFuZCBpcyB1c2VkIHRvIG1vZGlmeSB0aGUgZXRoZXJuZXQgcmVjZWl2ZSBmaWx0ZXIgY29uZmlndXJhdGlvbi4KKyAqICBPbmx5IGRvbWFpbiAwICBuZXR3b3JrIGZ1bmN0aW9uIGRyaXZlcnMgbWF5IGlzc3VlIHRoaXMgY29tbWFuZC4gVGhlCisgKiAgYXBwbGllZCBjb25maWd1cmF0aW9uIGlzIHJldHVybmVkIGluICB0aGUgcmVzcG9uc2UgcGF5bG9hZC4gTm90ZToKKyAqICBTb21lIHJlY2VpdmUgcGFja2V0IGZpbHRlciBzZXR0aW5ncyBhcmUgZ2xvYmFsIG9uICBCbGFkZUVuZ2luZSBhbmQKKyAqICBjYW4gYWZmZWN0IGJvdGggdGhlIHN0b3JhZ2UgYW5kIG5ldHdvcmsgZnVuY3Rpb24gY2xpZW50cyB0aGF0IHRoZQorICogICBCbGFkZUVuZ2luZSBoYXJkd2FyZSBhbmQgZmlybXdhcmUgc2VydmUuIEFkZGl0aW9uYWx5LCBkZXBlbmRpbmcKKyAqICBvbiB0aGUgcmV2aXNpb24gb2YgIEJsYWRlRW5naW5lLCBzb21lIGV0aGVybmV0IHJlY2VpdmUgZmlsdGVyIHNldHRpbmdzCisgKiAgYXJlIGRlcGVuZGVudCBvbiBvdGhlcnMuIElmIGEgIGRlcGVuZGVuY3kgZXhpc3RzIGJldHdlZW4gc2V0dGluZ3MKKyAqICBmb3IgdGhlIEJsYWRlRW5naW5lIHJldmlzaW9uLCBhbmQgdGhlIGNvbW1hbmQgcmVxdWVzdCAgc2V0dGluZ3MgZG8KKyAqICBub3QgbWVldCB0aGUgZGVwZW5kZW5jeSByZXF1aXJlbWVudCwgdGhlIGludmFsaWQgc2V0dGluZ3Mgd2lsbCBub3QKKyAqICBiZSAgYXBwbGllZCBkZXNwaXRlIHRoZSBjb21hbmQgc3VjY2VlZGluZy4gRm9yIGV4YW1wbGU6IGEgZHJpdmVyIG1heQorICogIHJlcXVlc3QgdG8gZW5hYmxlICBicm9hZGNhc3QgcGFja2V0cywgYnV0IG5vdCBlbmFibGUgbXVsdGljYXN0IHBhY2tldHMuCisgKiAgT24gZWFybHkgcmV2aXNpb25zIG9mIEJsYWRlRW5naW5lLCAgdGhlcmUgbWF5IGJlIG5vIGRpc3RpbmN0aW9uIGJldHdlZW4KKyAqICBicm9hZGNhc3QgYW5kIG11bHRpY2FzdCBmaWx0ZXJzLCBzbyBicm9hZGNhc3QgY291bGQgIG5vdCBiZSBlbmFibGVkCisgKiAgd2l0aG91dCBlbmFibGluZyBtdWx0aWNhc3QuIEluIHRoaXMgc2NlbmFyaW8sIHRoZSBjb21hbmQgd291bGQgc3RpbGwKKyAqICAgc3VjY2VlZCwgYnV0IHRoZSByZXNwb25zZSBwYXlsb2FkIHdvdWxkIGluZGljYXRlIHRoZSBwcmV2aW91c2x5CisgKiAgY29uZmlndXJlZCBicm9hZGNhc3QgIGFuZCBtdWx0aWNhc3Qgc2V0dGluZy4KKyAqLworc3RydWN0IEZXQ01EX0NPTU1PTl9OVFdLX1JYX0ZJTFRFUiB7CisJdW5pb24gRldDTURfSEVBREVSIGhlYWRlcjsKKwl1bmlvbiBGV0NNRF9DT01NT05fQU5PTl8yNDJfUEFSQU1TIHBhcmFtczsKK30gX19wYWNrZWQ7CisKKworc3RydWN0IEZXQ01EX0NPTU1PTl9BTk9OXzI0NF9SRVFVRVNUIHsKKwl1MzIgcnN2ZDA7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgRldDTURfQ09NTU9OX0dFVF9GV19WRVJTSU9OX1JFU1BPTlNFX1BBWUxPQUQgeworCXU4IGZpcm13YXJlX3ZlcnNpb25fc3RyaW5nWzMyXTsKKwl1OCBmd19vbl9mbGFzaF92ZXJzaW9uX3N0cmluZ1szMl07Cit9IF9fcGFja2VkOworCit1bmlvbiBGV0NNRF9DT01NT05fQU5PTl8yNDNfUEFSQU1TIHsKKwlzdHJ1Y3QgRldDTURfQ09NTU9OX0FOT05fMjQ0X1JFUVVFU1QgcmVxdWVzdDsKKwlzdHJ1Y3QgRldDTURfQ09NTU9OX0dFVF9GV19WRVJTSU9OX1JFU1BPTlNFX1BBWUxPQUQgcmVzcG9uc2U7Cit9IF9fcGFja2VkOworCisvKiBUaGlzIGNvbWFuZCByZXRyaWV2ZXMgdGhlIGZpcm13YXJlIHZlcnNpb24uICAqLworc3RydWN0IEZXQ01EX0NPTU1PTl9HRVRfRldfVkVSU0lPTiB7CisJdW5pb24gRldDTURfSEVBREVSIGhlYWRlcjsKKwl1bmlvbiBGV0NNRF9DT01NT05fQU5PTl8yNDNfUEFSQU1TIHBhcmFtczsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBGV0NNRF9DT01NT05fQU5PTl8yNDZfUkVRVUVTVCB7CisJdTE2IHR4X2Zsb3dfY29udHJvbDsKKwl1MTYgcnhfZmxvd19jb250cm9sOworfSBfX3BhY2tlZDsKKworc3RydWN0IEZXQ01EX0NPTU1PTl9BTk9OXzI0N19SRVNQT05TRSB7CisJdTMyIHJzdmQwOworfSBfX3BhY2tlZDsKKwordW5pb24gRldDTURfQ09NTU9OX0FOT05fMjQ1X1BBUkFNUyB7CisJc3RydWN0IEZXQ01EX0NPTU1PTl9BTk9OXzI0Nl9SRVFVRVNUIHJlcXVlc3Q7CisJc3RydWN0IEZXQ01EX0NPTU1PTl9BTk9OXzI0N19SRVNQT05TRSByZXNwb25zZTsKK30gX19wYWNrZWQ7CisKKy8qCisgKiAgVGhpcyBjb21hbmQgaXMgdXNlZCB0byBwcm9ncmFtIEJsYWRlRW5naW5lIGZsb3cgY29udHJvbCBiZWhhdmlvci4KKyAqICBPbmx5IHRoZSBob3N0ICBuZXR3b3JraW5nIGRyaXZlciBpcyBhbGxvd2VkIHRvIHVzZSB0aGlzIGNvbWFuZC4KKyAqLworc3RydWN0IEZXQ01EX0NPTU1PTl9TRVRfRkxPV19DT05UUk9MIHsKKwl1bmlvbiBGV0NNRF9IRUFERVIgaGVhZGVyOworCXVuaW9uIEZXQ01EX0NPTU1PTl9BTk9OXzI0NV9QQVJBTVMgcGFyYW1zOworfSBfX3BhY2tlZDsKKworc3RydWN0IEZXQ01EX0NPTU1PTl9BTk9OXzI0OV9SRVFVRVNUIHsKKwl1MzIgcnN2ZDA7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgRldDTURfQ09NTU9OX0FOT05fMjUwX1JFU1BPTlNFIHsKKwl1MTYgdHhfZmxvd19jb250cm9sOworCXUxNiByeF9mbG93X2NvbnRyb2w7Cit9IF9fcGFja2VkOworCit1bmlvbiBGV0NNRF9DT01NT05fQU5PTl8yNDhfUEFSQU1TIHsKKwlzdHJ1Y3QgRldDTURfQ09NTU9OX0FOT05fMjQ5X1JFUVVFU1QgcmVxdWVzdDsKKwlzdHJ1Y3QgRldDTURfQ09NTU9OX0FOT05fMjUwX1JFU1BPTlNFIHJlc3BvbnNlOworfSBfX3BhY2tlZDsKKworLyogVGhpcyBjb21hbmQgaXMgdXNlZCB0byByZWFkIEJsYWRlRW5naW5lIGZsb3cgY29udHJvbCBzZXR0aW5ncy4gICovCitzdHJ1Y3QgRldDTURfQ09NTU9OX0dFVF9GTE9XX0NPTlRST0wgeworCXVuaW9uIEZXQ01EX0hFQURFUiBoZWFkZXI7CisJdW5pb24gRldDTURfQ09NTU9OX0FOT05fMjQ4X1BBUkFNUyBwYXJhbXM7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgRVFfREVMQVlfUEFSQU1TIHsKKwl1MzIgZXFfaWQ7CisJdTMyIGRlbGF5X2luX21pY3Jvc2Vjb25kczsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBGV0NNRF9DT01NT05fQU5PTl8yNTdfUkVRVUVTVCB7CisJdTMyIG51bV9lcTsKKwl1MzIgcnN2ZDA7CisJc3RydWN0IEVRX0RFTEFZX1BBUkFNUyBkZWxheVsxNl07Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgRldDTURfQ09NTU9OX0FOT05fMjU4X1JFU1BPTlNFIHsKKwl1MzIgZGVsYXlfcmVzb2x1dGlvbl9pbl9taWNyb3NlY29uZHM7CisJdTMyIGRlbGF5X21heF9pbl9taWNyb3NlY29uZHM7Cit9IF9fcGFja2VkOworCit1bmlvbiBNT0RJRllfRVFfREVMQVlfUEFSQU1TIHsKKwlzdHJ1Y3QgRldDTURfQ09NTU9OX0FOT05fMjU3X1JFUVVFU1QgcmVxdWVzdDsKKwlzdHJ1Y3QgRldDTURfQ09NTU9OX0FOT05fMjU4X1JFU1BPTlNFIHJlc3BvbnNlOworfSBfX3BhY2tlZDsKKworLyogVGhpcyBjb21hbmQgY2hhbmdlcyB0aGUgRVEgZGVsYXkgZm9yIGEgZ2l2ZW4gc2V0IG9mIEVRcy4gICovCitzdHJ1Y3QgRldDTURfQ09NTU9OX01PRElGWV9FUV9ERUxBWSB7CisJdW5pb24gRldDTURfSEVBREVSIGhlYWRlcjsKKwl1bmlvbiBNT0RJRllfRVFfREVMQVlfUEFSQU1TIHBhcmFtczsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBGV0NNRF9DT01NT05fQU5PTl8yNjBfUkVRVUVTVCB7CisJdTMyIHJzdmQwOworfSBfX3BhY2tlZDsKKworc3RydWN0IEJFX0ZJUk1XQVJFX0NPTkZJRyB7CisJdTE2IGJlX2NvbmZpZ19udW1iZXI7CisJdTE2IGFzaWNfcmV2aXNpb247CisJdTMyIG5pY191bHBfbWFzazsKKwl1MzIgdHVscF9tYXNrOworCXUzMiBpc2NzaV91bHBfbWFzazsKKwl1MzIgcmRtYV91bHBfbWFzazsKKwl1MzIgcnN2ZDBbNF07CisJdTMyIGV0aF90eF9pZF9zdGFydDsKKwl1MzIgZXRoX3R4X2lkX2NvdW50OworCXUzMiBldGhfcnhfaWRfc3RhcnQ7CisJdTMyIGV0aF9yeF9pZF9jb3VudDsKKwl1MzIgdHBtX3dyYnFfaWRfc3RhcnQ7CisJdTMyIHRwbV93cmJxX2lkX2NvdW50OworCXUzMiB0cG1fZGVmcV9pZF9zdGFydDsKKwl1MzIgdHBtX2RlZnFfaWRfY291bnQ7CisJdTMyIGlzY3NpX3dyYnFfaWRfc3RhcnQ7CisJdTMyIGlzY3NpX3dyYnFfaWRfY291bnQ7CisJdTMyIGlzY3NpX2RlZnFfaWRfc3RhcnQ7CisJdTMyIGlzY3NpX2RlZnFfaWRfY291bnQ7CisJdTMyIHJkbWFfcXBfaWRfc3RhcnQ7CisJdTMyIHJkbWFfcXBfaWRfY291bnQ7CisJdTMyIHJzdmQxWzhdOworfSBfX3BhY2tlZDsKKwordW5pb24gRldDTURfQ09NTU9OX0FOT05fMjU5X1BBUkFNUyB7CisJc3RydWN0IEZXQ01EX0NPTU1PTl9BTk9OXzI2MF9SRVFVRVNUIHJlcXVlc3Q7CisJc3RydWN0IEJFX0ZJUk1XQVJFX0NPTkZJRyByZXNwb25zZTsKK30gX19wYWNrZWQ7CisKKy8qCisgKiAgVGhpcyBjb21hbmQgcXVlcmllcyB0aGUgY3VycmVudCBmaXJtd2FyZSBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMuCisgKiAgIFRoZSBzdGF0aWMgIGNvbmZpZ3VyYXRpb24gdHlwZSBpcyBkZWZpbmVkIGJ5IGJlX2NvbmZpZ19udW1iZXIuIFRoaXMKKyAqICBkaWZmZXJlbnRpYXRlcyBkaWZmZXJlbnQgIEJsYWRlRW5naW5lIGJ1aWxkcywgc3VjaCBhcyBpU0NTSSBJbml0aWF0b3IKKyAqICB2ZXJzdXMgaVNDU0kgVGFyZ2V0LiAgRm9yIGEgZ2l2ZW4gc3RhdGljICBjb25maWd1cmF0aW9uLCB0aGUgVXBwZXIKKyAqICBMYXllciBQcm90b2NvbCAoVUxQKSBwcm9jZXNzb3JzIG1heSBiZSByZWNvbmZpZ3VyZWQgdG8gc3VwcG9ydCAgZGlmZmVyZW50CisgKiAgcHJvdG9jb2xzLiBFYWNoIFVMUCBwcm9jZXNzb3Igc3VwcG9ydHMgb25lIG9yIG1vcmUgcHJvdG9jb2xzLiBUaGUKKyAqICBtYXNrcyAgaW5kaWNhdGUgd2hpY2ggcHJvY2Vzc29ycyBhcmUgY29uZmlndXJlZCBmb3IgZWFjaCBwcm90b2NvbC4KKyAqICAgRm9yIGEgZ2l2ZW4gc3RhdGljICBjb25maWd1cmF0aW9uLCB0aGUgbnVtYmVyIG9mIFRDUCBjb25uZWN0aW9ucworICogIHN1cHBvcnRlZCBmb3IgZWFjaCBwcm90b2NvbCBtYXkgdmFyeS4gVGhlICAqX2lkX3N0YXJ0IGFuZCAqX2lkX2NvdW50CisgKiAgdmFyaWFibGVzIGRlZmluZSBhIGxpbmVhciByYW5nZSBvZiBJRHMgdGhhdCBhcmUgYXZhaWxhYmxlIGZvciAgZWFjaAorICogIHN1cHBvcnRlZCBwcm90b2NvbC4gVGhlICpfaWRfY291bnQgbWF5IGJlIHVzZWQgYnkgdGhlIGRyaXZlciB0byBhbGxvY2F0ZQorICogIHRoZSAgYXBwcm9wcmlhdGUgbnVtYmVyIG9mIGNvbm5lY3Rpb24gcmVzb3VyY2VzLiBUaGUgKl9pZF9zdGFydCBtYXkKKyAqICBiZSB1c2VkIHRvIG1hcCB0aGUgIGFyYml0cmFyeSByYW5nZSBvZiBJRHMgdG8gYSB6ZXJvLWJhc2VkIHJhbmdlCisgKiAgb2YgaW5kaWNlcy4KKyAqLworc3RydWN0IEZXQ01EX0NPTU1PTl9GSVJNV0FSRV9DT05GSUcgeworCXVuaW9uIEZXQ01EX0hFQURFUiBoZWFkZXI7CisJdW5pb24gRldDTURfQ09NTU9OX0FOT05fMjU5X1BBUkFNUyBwYXJhbXM7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgRldDTURfQ09NTU9OX1BPUlRfRVFVQUxJWkFUSU9OX1BBUkFNUyB7CisJdTMyIGVtcGhfbGV2X3NlbF9wb3J0MDsKKwl1MzIgZW1waF9sZXZfc2VsX3BvcnQxOworCXU4IHhhdWlfdm9fc2VsOworCXU4IHhhdWlfc3RhdGU7CisJdTE2IHJzdmQwOworCXUzMiB4YXVpX2VxX3ZlY3RvcjsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBGV0NNRF9DT01NT05fQU5PTl8yNjJfUkVRVUVTVCB7CisJdTMyIHJzdmQwOworfSBfX3BhY2tlZDsKKwordW5pb24gRldDTURfQ09NTU9OX0FOT05fMjYxX1BBUkFNUyB7CisJc3RydWN0IEZXQ01EX0NPTU1PTl9BTk9OXzI2Ml9SRVFVRVNUIHJlcXVlc3Q7CisJc3RydWN0IEZXQ01EX0NPTU1PTl9QT1JUX0VRVUFMSVpBVElPTl9QQVJBTVMgcmVzcG9uc2U7Cit9IF9fcGFja2VkOworCisvKgorICogIFRoaXMgY29tYW5kIGNhbiBiZSB1c2VkIHRvIHJlYWQgWEFVSSBlcXVhbGl6YXRpb24gcGFyYW1ldGVycy4gVGhlCisgKiAgQVJNIGZpcm13YXJlIGFwcGxpZXMgIGRlZmF1bHQgZXF1YWxpemF0aW9uIHBhcmFtZXRlcnMgZHVyaW5nIGluaXRpYWxpemF0aW9uLgorICogIFRoZXNlIHBhcmFtZXRlcnMgbWF5IGJlICBjdXN0b21lci1zcGVjaWZpYyB3aGVuIGRlcml2ZWQgZnJvbSB0aGUKKyAqICBTRUVQUk9NLiBTZWUgU0VFUFJPTV9EQVRBIGZvciBlcXVhbGl6YXRpb24gIHNwZWNpZmljIGZpZWxkcy4KKyAqLworc3RydWN0IEZXQ01EX0NPTU1PTl9HRVRfUE9SVF9FUVVBTElaQVRJT04geworCXVuaW9uIEZXQ01EX0hFQURFUiBoZWFkZXI7CisJdW5pb24gRldDTURfQ09NTU9OX0FOT05fMjYxX1BBUkFNUyBwYXJhbXM7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgRldDTURfQ09NTU9OX0FOT05fMjY0X1JFU1BPTlNFIHsKKwl1MzIgcnN2ZDA7Cit9IF9fcGFja2VkOworCit1bmlvbiBGV0NNRF9DT01NT05fQU5PTl8yNjNfUEFSQU1TIHsKKwlzdHJ1Y3QgRldDTURfQ09NTU9OX1BPUlRfRVFVQUxJWkFUSU9OX1BBUkFNUyByZXF1ZXN0OworCXN0cnVjdCBGV0NNRF9DT01NT05fQU5PTl8yNjRfUkVTUE9OU0UgcmVzcG9uc2U7Cit9IF9fcGFja2VkOworCisvKgorICogIFRoaXMgY29tYW5kIGNhbiBiZSB1c2VkIHRvIHNldCBYQVVJIGVxdWFsaXphdGlvbiBwYXJhbWV0ZXJzLiBUaGUgQVJNCisgKiAgZmlybXdhcmUgYXBwbGllcyAgZGVmYXVsdCBlcXVhbGl6YXRpb24gcGFyYW1ldGVycyBkdXJpbmcgaW5pdGlhbGl6YXRpb24uCisgKiAgVGhlc2UgcGFyYW1ldGVycyBtYXkgYmUgIGN1c3RvbWVyLXNwZWNpZmljIHdoZW4gZGVyaXZlZCBmcm9tIHRoZQorICogIFNFRVBST00uIFNlZSBTRUVQUk9NX0RBVEEgZm9yIGVxdWFsaXphdGlvbiAgc3BlY2lmaWMgZmllbGRzLgorICovCitzdHJ1Y3QgRldDTURfQ09NTU9OX1NFVF9QT1JUX0VRVUFMSVpBVElPTiB7CisJdW5pb24gRldDTURfSEVBREVSIGhlYWRlcjsKKwl1bmlvbiBGV0NNRF9DT01NT05fQU5PTl8yNjNfUEFSQU1TIHBhcmFtczsKK30gX19wYWNrZWQ7CisKKyNlbmRpZiAvKiBfX2Z3Y21kX2NvbW1vbl9ibWFwX2hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JlbmV0L2Z3Y21kX2V0aF9ibWFwLmggYi9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvZndjbWRfZXRoX2JtYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzRiMTc5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JlbmV0L2Z3Y21kX2V0aF9ibWFwLmgKQEAgLTAsMCArMSwyODAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgLSAyMDA4IFNlcnZlckVuZ2luZXMKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFRoZSBmdWxsIEdOVSBHZW5lcmFsCisgKiBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUgZmlsZSBjYWxsZWQgQ09QWUlORy4KKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogbGludXgtZHJpdmVyc0BzZXJ2ZXJlbmdpbmVzLmNvbQorICoKKyAqIFNlcnZlckVuZ2luZXMKKyAqIDIwOSBOLiBGYWlyIE9ha3MgQXZlCisgKiBTdW5ueXZhbGUsIENBIDk0MDg1CisgKi8KKy8qCisgKiBBdXRvZ2VuZXJhdGVkIGJ5IHNyY2dlbiB2ZXJzaW9uOiAwMTI3CisgKi8KKyNpZm5kZWYgX19md2NtZF9ldGhfYm1hcF9oX18KKyNkZWZpbmUgX19md2NtZF9ldGhfYm1hcF9oX18KKyNpbmNsdWRlICJmd2NtZF9oZHJfYm1hcC5oIgorI2luY2x1ZGUgImZ3Y21kX3R5cGVzX2JtYXAuaCIKKworc3RydWN0IE1JQl9FVEhfU1RBVElTVElDU19QQVJBTVNfSU4geworCXUzMiByc3ZkMDsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBCRV9SWEZfU1RBVFMgeworCXUzMiBwMHJlY3ZkdG90YWxieXRlc0xTRDsJLyogRFdPUkQgMCAqLworCXUzMiBwMHJlY3ZkdG90YWxieXRlc01TRDsJLyogRFdPUkQgMSAqLworCXUzMiBwMHJlY3ZkdG90YWxmcmFtZXM7CS8qIERXT1JEIDIgKi8KKwl1MzIgcDByZWN2ZHVuaWNhc3RmcmFtZXM7CS8qIERXT1JEIDMgKi8KKwl1MzIgcDByZWN2ZG11bHRpY2FzdGZyYW1lczsJLyogRFdPUkQgNCAqLworCXUzMiBwMHJlY3ZkYnJvYWRjYXN0ZnJhbWVzOwkvKiBEV09SRCA1ICovCisJdTMyIHAwY3JjZXJyb3JzOwkvKiBEV09SRCA2ICovCisJdTMyIHAwYWxpZ25tZW50c3ltZXJyczsJLyogRFdPUkQgNyAqLworCXUzMiBwMHBhdXNlZnJhbWVzcmVjdmQ7CS8qIERXT1JEIDggKi8KKwl1MzIgcDBjb250cm9sZnJhbWVzcmVjdmQ7CS8qIERXT1JEIDkgKi8KKwl1MzIgcDBpbnJhbmdlbGVuZXJyb3JzOwkvKiBEV09SRCAxMCAqLworCXUzMiBwMG91dHJhbmdlZXJyb3JzOwkvKiBEV09SRCAxMSAqLworCXUzMiBwMGZyYW1ldG9vbG9uZ2Vycm9yczsJLyogRFdPUkQgMTIgKi8KKwl1MzIgcDBkcm9wcGVkYWRkcmVzc21hdGNoOwkvKiBEV09SRCAxMyAqLworCXUzMiBwMGRyb3BwZWR2bGFubWlzbWF0Y2g7CS8qIERXT1JEIDE0ICovCisJdTMyIHAwaXBkcm9wcGVkdG9vc21hbGw7CS8qIERXT1JEIDE1ICovCisJdTMyIHAwaXBkcm9wcGVkdG9vc2hvcnQ7CS8qIERXT1JEIDE2ICovCisJdTMyIHAwaXBkcm9wcGVkaGRydG9vc21hbGw7CS8qIERXT1JEIDE3ICovCisJdTMyIHAwdGNwZHJvcHBlZGxlbjsJLyogRFdPUkQgMTggKi8KKwl1MzIgcDBkcm9wcGVkcnVudDsJLyogRFdPUkQgMTkgKi8KKwl1MzIgcDByZWN2ZDY0OwkJLyogRFdPUkQgMjAgKi8KKwl1MzIgcDByZWN2ZDY1XzEyNzsJLyogRFdPUkQgMjEgKi8KKwl1MzIgcDByZWN2ZDEyOF8yNTY7CS8qIERXT1JEIDIyICovCisJdTMyIHAwcmVjdmQyNTZfNTExOwkvKiBEV09SRCAyMyAqLworCXUzMiBwMHJlY3ZkNTEyXzEwMjM7CS8qIERXT1JEIDI0ICovCisJdTMyIHAwcmVjdmQxNTE4XzE1MjI7CS8qIERXT1JEIDI1ICovCisJdTMyIHAwcmVjdmQxNTIyXzIwNDc7CS8qIERXT1JEIDI2ICovCisJdTMyIHAwcmVjdmQyMDQ4XzQwOTU7CS8qIERXT1JEIDI3ICovCisJdTMyIHAwcmVjdmQ0MDk2XzgxOTE7CS8qIERXT1JEIDI4ICovCisJdTMyIHAwcmVjdmQ4MTkyXzkyMTY7CS8qIERXT1JEIDI5ICovCisJdTMyIHAwcmN2ZGlwY2tzbWVycnM7CS8qIERXT1JEIDMwICovCisJdTMyIHAwcmVjdmR0Y3Bja3NtZXJyczsJLyogRFdPUkQgMzEgKi8KKwl1MzIgcDByZWN2ZHVkcGNrc21lcnJzOwkvKiBEV09SRCAzMiAqLworCXUzMiBwMHJlY3Zkbm9ucnNzcGFja2V0czsJLyogRFdPUkQgMzMgKi8KKwl1MzIgcDByZWN2ZGlwcGFja2V0czsJLyogRFdPUkQgMzQgKi8KKwl1MzIgcDByZWN2ZGNodXRlMXBhY2tldHM7CS8qIERXT1JEIDM1ICovCisJdTMyIHAwcmVjdmRjaHV0ZTJwYWNrZXRzOwkvKiBEV09SRCAzNiAqLworCXUzMiBwMHJlY3ZkY2h1dGUzcGFja2V0czsJLyogRFdPUkQgMzcgKi8KKwl1MzIgcDByZWN2ZGlwc2VjcGFja2V0czsJLyogRFdPUkQgMzggKi8KKwl1MzIgcDByZWN2ZG1hbmFnZW1lbnRwYWNrZXRzOwkvKiBEV09SRCAzOSAqLworCXUzMiBwMHhtaXRieXRlc2xzZDsJLyogRFdPUkQgNDAgKi8KKwl1MzIgcDB4bWl0Ynl0ZXNtc2Q7CS8qIERXT1JEIDQxICovCisJdTMyIHAweG1pdHVuaWNhc3RmcmFtZXM7CS8qIERXT1JEIDQyICovCisJdTMyIHAweG1pdG11bHRpY2FzdGZyYW1lczsJLyogRFdPUkQgNDMgKi8KKwl1MzIgcDB4bWl0YnJvYWRjYXN0ZnJhbWVzOwkvKiBEV09SRCA0NCAqLworCXUzMiBwMHhtaXRwYXVzZWZyYW1lczsJLyogRFdPUkQgNDUgKi8KKwl1MzIgcDB4bWl0Y29udHJvbGZyYW1lczsJLyogRFdPUkQgNDYgKi8KKwl1MzIgcDB4bWl0NjQ7CQkvKiBEV09SRCA0NyAqLworCXUzMiBwMHhtaXQ2NV8xMjc7CS8qIERXT1JEIDQ4ICovCisJdTMyIHAweG1pdDEyOF8yNTY7CS8qIERXT1JEIDQ5ICovCisJdTMyIHAweG1pdDI1Nl81MTE7CS8qIERXT1JEIDUwICovCisJdTMyIHAweG1pdDUxMl8xMDIzOwkvKiBEV09SRCA1MSAqLworCXUzMiBwMHhtaXQxNTE4XzE1MjI7CS8qIERXT1JEIDUyICovCisJdTMyIHAweG1pdDE1MjJfMjA0NzsJLyogRFdPUkQgNTMgKi8KKwl1MzIgcDB4bWl0MjA0OF80MDk1OwkvKiBEV09SRCA1NCAqLworCXUzMiBwMHhtaXQ0MDk2XzgxOTE7CS8qIERXT1JEIDU1ICovCisJdTMyIHAweG1pdDgxOTJfOTIxNjsJLyogRFdPUkQgNTYgKi8KKwl1MzIgcDByeGZpZm9vdmVyZmxvd2Ryb3BwZWQ7CS8qIERXT1JEIDU3ICovCisJdTMyIHAwaXBzZWNsb29rdXBmYWlsZWRkcm9wcGVkOwkvKiBEV09SRCA1OCAqLworCXUzMiBwMXJlY3ZkdG90YWxieXRlc0xTRDsJLyogRFdPUkQgNTkgKi8KKwl1MzIgcDFyZWN2ZHRvdGFsYnl0ZXNNU0Q7CS8qIERXT1JEIDYwICovCisJdTMyIHAxcmVjdmR0b3RhbGZyYW1lczsJLyogRFdPUkQgNjEgKi8KKwl1MzIgcDFyZWN2ZHVuaWNhc3RmcmFtZXM7CS8qIERXT1JEIDYyICovCisJdTMyIHAxcmVjdmRtdWx0aWNhc3RmcmFtZXM7CS8qIERXT1JEIDYzICovCisJdTMyIHAxcmVjdmRicm9hZGNhc3RmcmFtZXM7CS8qIERXT1JEIDY0ICovCisJdTMyIHAxY3JjZXJyb3JzOwkvKiBEV09SRCA2NSAqLworCXUzMiBwMWFsaWdubWVudHN5bWVycnM7CS8qIERXT1JEIDY2ICovCisJdTMyIHAxcGF1c2VmcmFtZXNyZWN2ZDsJLyogRFdPUkQgNjcgKi8KKwl1MzIgcDFjb250cm9sZnJhbWVzcmVjdmQ7CS8qIERXT1JEIDY4ICovCisJdTMyIHAxaW5yYW5nZWxlbmVycm9yczsJLyogRFdPUkQgNjkgKi8KKwl1MzIgcDFvdXRyYW5nZWVycm9yczsJLyogRFdPUkQgNzAgKi8KKwl1MzIgcDFmcmFtZXRvb2xvbmdlcnJvcnM7CS8qIERXT1JEIDcxICovCisJdTMyIHAxZHJvcHBlZGFkZHJlc3NtYXRjaDsJLyogRFdPUkQgNzIgKi8KKwl1MzIgcDFkcm9wcGVkdmxhbm1pc21hdGNoOwkvKiBEV09SRCA3MyAqLworCXUzMiBwMWlwZHJvcHBlZHRvb3NtYWxsOwkvKiBEV09SRCA3NCAqLworCXUzMiBwMWlwZHJvcHBlZHRvb3Nob3J0OwkvKiBEV09SRCA3NSAqLworCXUzMiBwMWlwZHJvcHBlZGhkcnRvb3NtYWxsOwkvKiBEV09SRCA3NiAqLworCXUzMiBwMXRjcGRyb3BwZWRsZW47CS8qIERXT1JEIDc3ICovCisJdTMyIHAxZHJvcHBlZHJ1bnQ7CS8qIERXT1JEIDc4ICovCisJdTMyIHAxcmVjdmQ2NDsJCS8qIERXT1JEIDc5ICovCisJdTMyIHAxcmVjdmQ2NV8xMjc7CS8qIERXT1JEIDgwICovCisJdTMyIHAxcmVjdmQxMjhfMjU2OwkvKiBEV09SRCA4MSAqLworCXUzMiBwMXJlY3ZkMjU2XzUxMTsJLyogRFdPUkQgODIgKi8KKwl1MzIgcDFyZWN2ZDUxMl8xMDIzOwkvKiBEV09SRCA4MyAqLworCXUzMiBwMXJlY3ZkMTUxOF8xNTIyOwkvKiBEV09SRCA4NCAqLworCXUzMiBwMXJlY3ZkMTUyMl8yMDQ3OwkvKiBEV09SRCA4NSAqLworCXUzMiBwMXJlY3ZkMjA0OF80MDk1OwkvKiBEV09SRCA4NiAqLworCXUzMiBwMXJlY3ZkNDA5Nl84MTkxOwkvKiBEV09SRCA4NyAqLworCXUzMiBwMXJlY3ZkODE5Ml85MjE2OwkvKiBEV09SRCA4OCAqLworCXUzMiBwMXJjdmRpcGNrc21lcnJzOwkvKiBEV09SRCA4OSAqLworCXUzMiBwMXJlY3ZkdGNwY2tzbWVycnM7CS8qIERXT1JEIDkwICovCisJdTMyIHAxcmVjdmR1ZHBja3NtZXJyczsJLyogRFdPUkQgOTEgKi8KKwl1MzIgcDFyZWN2ZG5vbnJzc3BhY2tldHM7CS8qIERXT1JEIDkyICovCisJdTMyIHAxcmVjdmRpcHBhY2tldHM7CS8qIERXT1JEIDkzICovCisJdTMyIHAxcmVjdmRjaHV0ZTFwYWNrZXRzOwkvKiBEV09SRCA5NCAqLworCXUzMiBwMXJlY3ZkY2h1dGUycGFja2V0czsJLyogRFdPUkQgOTUgKi8KKwl1MzIgcDFyZWN2ZGNodXRlM3BhY2tldHM7CS8qIERXT1JEIDk2ICovCisJdTMyIHAxcmVjdmRpcHNlY3BhY2tldHM7CS8qIERXT1JEIDk3ICovCisJdTMyIHAxcmVjdmRtYW5hZ2VtZW50cGFja2V0czsJLyogRFdPUkQgOTggKi8KKwl1MzIgcDF4bWl0Ynl0ZXNsc2Q7CS8qIERXT1JEIDk5ICovCisJdTMyIHAxeG1pdGJ5dGVzbXNkOwkvKiBEV09SRCAxMDAgKi8KKwl1MzIgcDF4bWl0dW5pY2FzdGZyYW1lczsJLyogRFdPUkQgMTAxICovCisJdTMyIHAxeG1pdG11bHRpY2FzdGZyYW1lczsJLyogRFdPUkQgMTAyICovCisJdTMyIHAxeG1pdGJyb2FkY2FzdGZyYW1lczsJLyogRFdPUkQgMTAzICovCisJdTMyIHAxeG1pdHBhdXNlZnJhbWVzOwkvKiBEV09SRCAxMDQgKi8KKwl1MzIgcDF4bWl0Y29udHJvbGZyYW1lczsJLyogRFdPUkQgMTA1ICovCisJdTMyIHAxeG1pdDY0OwkJLyogRFdPUkQgMTA2ICovCisJdTMyIHAxeG1pdDY1XzEyNzsJLyogRFdPUkQgMTA3ICovCisJdTMyIHAxeG1pdDEyOF8yNTY7CS8qIERXT1JEIDEwOCAqLworCXUzMiBwMXhtaXQyNTZfNTExOwkvKiBEV09SRCAxMDkgKi8KKwl1MzIgcDF4bWl0NTEyXzEwMjM7CS8qIERXT1JEIDExMCAqLworCXUzMiBwMXhtaXQxNTE4XzE1MjI7CS8qIERXT1JEIDExMSAqLworCXUzMiBwMXhtaXQxNTIyXzIwNDc7CS8qIERXT1JEIDExMiAqLworCXUzMiBwMXhtaXQyMDQ4XzQwOTU7CS8qIERXT1JEIDExMyAqLworCXUzMiBwMXhtaXQ0MDk2XzgxOTE7CS8qIERXT1JEIDExNCAqLworCXUzMiBwMXhtaXQ4MTkyXzkyMTY7CS8qIERXT1JEIDExNSAqLworCXUzMiBwMXJ4Zmlmb292ZXJmbG93ZHJvcHBlZDsJLyogRFdPUkQgMTE2ICovCisJdTMyIHAxaXBzZWNsb29rdXBmYWlsZWRkcm9wcGVkOwkvKiBEV09SRCAxMTcgKi8KKwl1MzIgcHhkcm9wcGVkbm9wYnVmOwkvKiBEV09SRCAxMTggKi8KKwl1MzIgcHhkcm9wcGVkbm90eHBiOwkvKiBEV09SRCAxMTkgKi8KKwl1MzIgcHhkcm9wcGVkbm9pcHNlY2J1ZjsJLyogRFdPUkQgMTIwICovCisJdTMyIHB4ZHJvcHBlZG5vZXJ4ZGVzY3I7CS8qIERXT1JEIDEyMSAqLworCXUzMiBweGRyb3BwZWRub3RwcmVkZXNjcjsJLyogRFdPUkQgMTIyICovCisJdTMyIHB4cmVjdmRtYW5hZ2VtZW50cG9ydHBhY2tldHM7CS8qIERXT1JEIDEyMyAqLworCXUzMiBweHJlY3ZkbWFuYWdlbWVudHBvcnRieXRlczsJLyogRFdPUkQgMTI0ICovCisJdTMyIHB4cmVjdmRtYW5hZ2VtZW50cG9ydHBhdXNlZnJhbWVzOwkvKiBEV09SRCAxMjUgKi8KKwl1MzIgcHhyZWN2ZG1hbmFnZW1lbnRwb3J0ZXJyb3JzOwkvKiBEV09SRCAxMjYgKi8KKwl1MzIgcHh4bWl0bWFuYWdlbWVudHBvcnRwYWNrZXRzOwkvKiBEV09SRCAxMjcgKi8KKwl1MzIgcHh4bWl0bWFuYWdlbWVudHBvcnRieXRlczsJLyogRFdPUkQgMTI4ICovCisJdTMyIHB4eG1pdG1hbmFnZW1lbnRwb3J0cGF1c2U7CS8qIERXT1JEIDEyOSAqLworCXUzMiBweHhtaXRtYW5hZ2VtZW50cG9ydHJ4Zmlmb292ZXJmbG93OwkvKiBEV09SRCAxMzAgKi8KKwl1MzIgcHhyZWN2ZGlwc2VjaXBja3NtZXJyczsJLyogRFdPUkQgMTMxICovCisJdTMyIHB4cmVjdmR0Y3BzZWNpcGNrc21lcnJzOwkvKiBEV09SRCAxMzIgKi8KKwl1MzIgcHhyZWN2ZHVkcHNlY2lwY2tzbWVycnM7CS8qIERXT1JEIDEzMyAqLworCXUzMiBweGlwc2VjcnVudDsJLyogRFdPUkQgMTM0ICovCisJdTMyIHB4aXBzZWNhZGRyZXNzbWlzbWF0Y2hkcm9wcGVkOwkvKiBEV09SRCAxMzUgKi8KKwl1MzIgcHhpcHNlY3J4Zmlmb292ZXJmbG93ZHJvcHBlZDsJLyogRFdPUkQgMTM2ICovCisJdTMyIHB4aXBzZWNmcmFtZXN0b29sb25nOwkvKiBEV09SRCAxMzcgKi8KKwl1MzIgcHhpcHNlY3RvdGFsaXBmcmFtZXM7CS8qIERXT1JEIDEzOCAqLworCXUzMiBweGlwc2VjaXB0b29zbWFsbDsJLyogRFdPUkQgMTM5ICovCisJdTMyIHB4aXBzZWNpcHRvb3Nob3J0OwkvKiBEV09SRCAxNDAgKi8KKwl1MzIgcHhpcHNlY2lwaGRydG9vc21hbGw7CS8qIERXT1JEIDE0MSAqLworCXUzMiBweGlwc2VjdGNwaGRyYmFkOwkvKiBEV09SRCAxNDIgKi8KKwl1MzIgcHhyZWN2ZGlwc2VjY2h1dGUxOwkvKiBEV09SRCAxNDMgKi8KKwl1MzIgcHhyZWN2ZGlwc2VjY2h1dGUyOwkvKiBEV09SRCAxNDQgKi8KKwl1MzIgcHhyZWN2ZGlwc2VjY2h1dGUzOwkvKiBEV09SRCAxNDUgKi8KKwl1MzIgcHhkcm9wcGVkN2ZyYWdzOwkvKiBEV09SRCAxNDYgKi8KKwl1MzIgcHhkcm9wcGVkZnJhZ3M7CS8qIERXT1JEIDE0NyAqLworCXUzMiBweGRyb3BwZWRpbnZhbGlkZnJhZ3Jpbmc7CS8qIERXT1JEIDE0OCAqLworCXUzMiBweG51bWZvcndhcmRlZHBhY2tldHM7CS8qIERXT1JEIDE0OSAqLworfSBfX3BhY2tlZDsKKwordW5pb24gTUlCX0VUSF9TVEFUSVNUSUNTX1BBUkFNUyB7CisJc3RydWN0IE1JQl9FVEhfU1RBVElTVElDU19QQVJBTVNfSU4gcmVxdWVzdDsKKwlzdHJ1Y3QgQkVfUlhGX1NUQVRTIHJlc3BvbnNlOworfSBfX3BhY2tlZDsKKworLyoKKyAqICBRdWVyeSBldGhlcm5ldCBzdGF0aXN0aWNzLiBBbGwgZG9tYWlucyBtYXkgaXNzdWUgdGhpcyBjb21tYW5kLiBUaGUKKyAqICBob3N0IGRvbWFpbiBkcml2ZXJzICBtYXkgb3B0aW9uYWxseSByZXNldCBpbnRlcm5hbCBzdGF0aXN0aWMgY291bnRlcnMKKyAqICB3aXRoIGEgcXVlcnkuCisgKi8KK3N0cnVjdCBGV0NNRF9FVEhfR0VUX1NUQVRJU1RJQ1MgeworCXVuaW9uIEZXQ01EX0hFQURFUiBoZWFkZXI7CisJdW5pb24gTUlCX0VUSF9TVEFUSVNUSUNTX1BBUkFNUyBwYXJhbXM7Cit9IF9fcGFja2VkOworCisKK3N0cnVjdCBGV0NNRF9FVEhfQU5PTl8xNzVfUkVRVUVTVCB7CisJdTggcG9ydDBfcHJvbWlzY3VvdXM7CisJdTggcG9ydDFfcHJvbWlzY3VvdXM7CisJdTE2IHJzdmQwOworfSBfX3BhY2tlZDsKKworc3RydWN0IEZXQ01EX0VUSF9BTk9OXzE3Nl9SRVNQT05TRSB7CisJdTMyIHJzdmQwOworfSBfX3BhY2tlZDsKKwordW5pb24gRldDTURfRVRIX0FOT05fMTc0X1BBUkFNUyB7CisJc3RydWN0IEZXQ01EX0VUSF9BTk9OXzE3NV9SRVFVRVNUIHJlcXVlc3Q7CisJc3RydWN0IEZXQ01EX0VUSF9BTk9OXzE3Nl9SRVNQT05TRSByZXNwb25zZTsKK30gX19wYWNrZWQ7CisKKy8qIEVuYWJsZXMvRGlzYWJsZXMgcHJvbWlzY3VvdXMgZXRoZXJuZXQgcmVjZWl2ZSBtb2RlLiAgKi8KK3N0cnVjdCBGV0NNRF9FVEhfUFJPTUlTQ1VPVVMgeworCXVuaW9uIEZXQ01EX0hFQURFUiBoZWFkZXI7CisJdW5pb24gRldDTURfRVRIX0FOT05fMTc0X1BBUkFNUyBwYXJhbXM7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgRldDTURfRVRIX0FOT05fMTc4X1JFUVVFU1QgeworCXUzMiBuZXdfZnJhZ3NpemVfbG9nMjsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBGV0NNRF9FVEhfQU5PTl8xNzlfUkVTUE9OU0UgeworCXUzMiBhY3R1YWxfZnJhZ3NpemVfbG9nMjsKK30gX19wYWNrZWQ7CisKK3VuaW9uIEZXQ01EX0VUSF9BTk9OXzE3N19QQVJBTVMgeworCXN0cnVjdCBGV0NNRF9FVEhfQU5PTl8xNzhfUkVRVUVTVCByZXF1ZXN0OworCXN0cnVjdCBGV0NNRF9FVEhfQU5PTl8xNzlfUkVTUE9OU0UgcmVzcG9uc2U7Cit9IF9fcGFja2VkOworCisvKgorICogIFNldHMgdGhlIEV0aGVybmV0IFJYIGZyYWdtZW50IHNpemUuIE9ubHkgaG9zdCAoZG9tYWluIDApIG5ldHdvcmtpbmcKKyAqICBkcml2ZXJzIG1heSBpc3N1ZSAgdGhpcyBjb21tYW5kLiAgVGhpcyBjYWxsIHdpbGwgZmFpbCBmb3Igbm9uLWhvc3QKKyAqICBwcm90ZWN0aW9uIGRvbWFpbnMuIEluIHRoaXMgc2l0dWF0aW9uIHRoZSAgTUNDIENRIHN0YXR1cyB3aWxsIGluZGljYXRlCisgKiAgYSBmYWlsdXJlIGR1ZSB0byBpbnN1ZmZpY2llbnQgcHJpdmlsZWRnZXMuIFRoZSByZXNwb25zZSAgc2hvdWxkIGJlCisgKiAgaWdub3JlZCwgYW5kIHRoZSBkcml2ZXIgc2hvdWxkIHVzZSB0aGUgRldDTURfRVRIX0dFVF9GUkFHX1NJWkUgdG8KKyAqICBxdWVyeSB0aGUgIGV4aXN0aW5nIGV0aGVybmV0IHJlY2VpdmUgZnJhZ21lbnQgc2l6ZS4gSXQgbXVzdCB1c2UgdGhpcworICogIGZyYWdtZW50IHNpemUgZm9yIGFsbCAgZnJhZ21lbnRzIGluIHRoZSBldGhlcm5ldCByZWNlaXZlIHJpbmcuICBJZgorICogIHRoZSBjb21tYW5kIHN1Y2NlZWRzLCB0aGUgZHJpdmVyIG11c3QgdXNlIHRoZSAgZnJhZyBzaXplIGluZGljYXRlZAorICogIGluIHRoZSBjb21tYW5kIHJlc3BvbnNlIHNpbmNlIHRoZSByZXF1ZXN0ZWQgZnJhZyBzaXplIG1heSBub3QgYmUgIGFwcGxpZWQKKyAqICB1bnRpbCB0aGUgbmV4dCByZWJvb3QuIFdoZW4gdGhlIHJlcXVlc3RlZCBmcmFnc2l6ZSBtYXRjaGVzIHRoZSByZXNwb25zZQorICogICBmcmFnc2l6ZSwgdGhpcyBpbmRpY2F0ZXMgdGhlIHJlcXVlc3Qgd2FzIGFwcGxpZWQgaW1tZWRpYXRlbHkuCisgKi8KK3N0cnVjdCBGV0NNRF9FVEhfU0VUX1JYX0ZSQUdfU0laRSB7CisJdW5pb24gRldDTURfSEVBREVSIGhlYWRlcjsKKwl1bmlvbiBGV0NNRF9FVEhfQU5PTl8xNzdfUEFSQU1TIHBhcmFtczsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBGV0NNRF9FVEhfQU5PTl8xODFfUkVRVUVTVCB7CisJdTMyIHJzdmQwOworfSBfX3BhY2tlZDsKKworc3RydWN0IEZXQ01EX0VUSF9BTk9OXzE4Ml9SRVNQT05TRSB7CisJdTMyIGFjdHVhbF9mcmFnc2l6ZV9sb2cyOworfSBfX3BhY2tlZDsKKwordW5pb24gRldDTURfRVRIX0FOT05fMTgwX1BBUkFNUyB7CisJc3RydWN0IEZXQ01EX0VUSF9BTk9OXzE4MV9SRVFVRVNUIHJlcXVlc3Q7CisJc3RydWN0IEZXQ01EX0VUSF9BTk9OXzE4Ml9SRVNQT05TRSByZXNwb25zZTsKK30gX19wYWNrZWQ7CisKKy8qCisgKiAgUXVlcmllcyB0aGUgRXRoZXJuZXQgUlggZnJhZ21lbnQgc2l6ZS4gQWxsIGRvbWFpbnMgbWF5IGlzc3VlIHRoaXMKKyAqICBjb21tYW5kLiAgVGhlIGRyaXZlciAgc2hvdWxkIGNhbGwgdGhpcyBjb21tYW5kIHRvIGRldGVybWluZSB0aGUgbWluaW11bQorICogIHJlcXVpcmVkIGZyYWdtZW50IHNpemUgZm9yIHRoZSBldGhlcm5ldCAgUlggcmluZyBidWZmZXJzLiBEcml2ZXJzCisgKiAgbWF5IGNob29zZSB0byB1c2UgYSBsYXJnZXIgc2l6ZSBmb3IgZWFjaCBmcmFnbWVudCBidWZmZXIsIGJ1dCAgQmxhZGVFbmdpbmUKKyAqICB3aWxsIHVzZSB1cCB0byB0aGUgY29uZmlndXJlZCBtaW5pbXVtIHJlcXVpcmVkIGZyYWdzaXplIGluIGVhY2ggZXRoZXJuZXQKKyAqICAgcmVjZWl2ZSBmcmFnbWVudCBidWZmZXIuIEZvciBleGFtcGxlLCBpZiB0aGUgZXRoZXJuZXQgcmVjZWl2ZSBmcmFnbWVudAorICogIHNpemUgaXMgIGNvbmZpZ3VyZWQgdG8gNGtCLCBhbmQgYSBkcml2ZXIgdXNlcyA4a0IgZnJhZ21lbnRzLCBhIDZrQgorICogIGV0aGVybmV0IHBhY2tldCByZWNlaXZlZCBieSAgQmxhZGVFbmdpbmUgd2lsbCBiZSBzcGxpdCBhY2Nyb3NzIHR3bworICogIG9mIHRoZSBkcml2ZXIncyByZWNlaXZlIGZyYW1nZW50cyAoNGtCIGluIG9uZSAgZnJhZ21lbnQgYnVmZmVyLCBhbmQKKyAqICAya0IgaW4gdGhlIHN1YnNlcXVlbnQgZnJhZ21lbnQgYnVmZmVyKS4KKyAqLworc3RydWN0IEZXQ01EX0VUSF9HRVRfUlhfRlJBR19TSVpFIHsKKwl1bmlvbiBGV0NNRF9IRUFERVIgaGVhZGVyOworCXVuaW9uIEZXQ01EX0VUSF9BTk9OXzE4MF9QQVJBTVMgcGFyYW1zOworfSBfX3BhY2tlZDsKKworI2VuZGlmIC8qIF9fZndjbWRfZXRoX2JtYXBfaF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvZndjbWRfaGRyX2JtYXAuaCBiL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9md2NtZF9oZHJfYm1hcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4YjQ1MzIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvZndjbWRfaGRyX2JtYXAuaApAQCAtMCwwICsxLDU0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA1IC0gMjAwOCBTZXJ2ZXJFbmdpbmVzCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBUaGUgZnVsbCBHTlUgR2VuZXJhbAorICogUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlIGZpbGUgY2FsbGVkIENPUFlJTkcuCisgKgorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqIGxpbnV4LWRyaXZlcnNAc2VydmVyZW5naW5lcy5jb20KKyAqCisgKiBTZXJ2ZXJFbmdpbmVzCisgKiAyMDkgTi4gRmFpciBPYWtzIEF2ZQorICogU3Vubnl2YWxlLCBDQSA5NDA4NQorICovCisvKgorICogQXV0b2dlbmVyYXRlZCBieSBzcmNnZW4gdmVyc2lvbjogMDEyNworICovCisjaWZuZGVmIF9fZndjbWRfaGRyX2JtYXBfaF9fCisjZGVmaW5lIF9fZndjbWRfaGRyX2JtYXBfaF9fCisKK3N0cnVjdCBGV0NNRF9SRVFVRVNUX0hFQURFUiB7CisJdTggb3Bjb2RlOworCXU4IHN1YnN5c3RlbTsKKwl1OCBwb3J0X251bWJlcjsKKwl1OCBkb21haW47CisJdTMyIHRpbWVvdXQ7CisJdTMyIHJlcXVlc3RfbGVuZ3RoOworCXUzMiByc3ZkMDsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBGV0NNRF9SRVNQT05TRV9IRUFERVIgeworCXU4IG9wY29kZTsKKwl1OCBzdWJzeXN0ZW07CisJdTggcnN2ZDA7CisJdTggZG9tYWluOworCXU4IHN0YXR1czsKKwl1OCBhZGRpdGlvbmFsX3N0YXR1czsKKwl1MTYgcnN2ZDE7CisJdTMyIHJlc3BvbnNlX2xlbmd0aDsKKwl1MzIgYWN0dWFsX3Jlc3BvbnNlX2xlbmd0aDsKK30gX19wYWNrZWQ7CisKKy8qCisgKiAgVGhlIGZpcm13YXJlL2RyaXZlciBvdmVyd3JpdGVzIHRoZSBpbnB1dCBGV0NNRF9SRVFVRVNUX0hFQURFUiB3aXRoCisgKiAgdGhlIG91dHB1dCAgRldDTURfUkVTUE9OU0VfSEVBREVSLgorICovCit1bmlvbiBGV0NNRF9IRUFERVIgeworCXN0cnVjdCBGV0NNRF9SRVFVRVNUX0hFQURFUiByZXF1ZXN0OworCXN0cnVjdCBGV0NNRF9SRVNQT05TRV9IRUFERVIgcmVzcG9uc2U7Cit9IF9fcGFja2VkOworCisjZW5kaWYgLyogX19md2NtZF9oZHJfYm1hcF9oX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9md2NtZF9tY2MuaCBiL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9md2NtZF9tY2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZWVjYTg3OAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9md2NtZF9tY2MuaApAQCAtMCwwICsxLDk0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA1IC0gMjAwOCBTZXJ2ZXJFbmdpbmVzCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBUaGUgZnVsbCBHTlUgR2VuZXJhbAorICogUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlIGZpbGUgY2FsbGVkIENPUFlJTkcuCisgKgorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqIGxpbnV4LWRyaXZlcnNAc2VydmVyZW5naW5lcy5jb20KKyAqCisgKiBTZXJ2ZXJFbmdpbmVzCisgKiAyMDkgTi4gRmFpciBPYWtzIEF2ZQorICogU3Vubnl2YWxlLCBDQSA5NDA4NQorICovCisvKgorICogQXV0b2dlbmVyYXRlZCBieSBzcmNnZW4gdmVyc2lvbjogMDEyNworICovCisjaWZuZGVmIF9fZndjbWRfbWNjX2FtYXBfaF9fCisjZGVmaW5lIF9fZndjbWRfbWNjX2FtYXBfaF9fCisjaW5jbHVkZSAiZndjbWRfb3Bjb2Rlcy5oIgorLyoKKyAqIFdoZXJlIGFwcGxpY2FibGUsIGEgV1JCLCBtYXkgY29udGFpbiBhIGxpc3Qgb2YgU2NhdHRlci1nYXRoZXIgZWxlbWVudHMuCisgKiBFYWNoIGVsZW1lbnQgc3VwcG9ydHMgYSA2NCBiaXQgYWRkcmVzcyBhbmQgYSAzMmJpdCBsZW5ndGggZmllbGQuCisgKi8KK3N0cnVjdCBCRV9NQ0NfU0dFX0FNQVAgeworCXU4IHBhX2xvWzMyXTsJLyogRFdPUkQgMCAqLworCXU4IHBhX2hpWzMyXTsJLyogRFdPUkQgMSAqLworCXU4IGxlbmd0aFszMl07CS8qIERXT1JEIDIgKi8KK30gX19wYWNrZWQ7CitzdHJ1Y3QgTUNDX1NHRV9BTUFQIHsKKwl1MzIgZHdbM107Cit9OworLyoKKyAqIFRoZSBkZXNpZ24gb2YgYW4gTUNDX1NHRSBhbGxvd3MgdXAgdG8gMTkgZWxlbWVudHMgdG8gYmUgZW1iZWRkZWQKKyAqIGluIGEgV1JCLCBzdXBwb3J0aW5nIDY0S0IgZGF0YSB0cmFuc2ZlcnMgKGFzc3VtaW5nIGEgNEtCIHBhZ2Ugc2l6ZSkuCisgKi8KK3N0cnVjdCBCRV9NQ0NfV1JCX1BBWUxPQURfQU1BUCB7CisJdW5pb24geworCQlzdHJ1Y3QgQkVfTUNDX1NHRV9BTUFQIHNnbFsxOV07CisJCXU4IGVtYmVkZGVkWzU5XVszMl07CS8qIERXT1JEIDAgKi8KKwl9OworfSBfX3BhY2tlZDsKK3N0cnVjdCBNQ0NfV1JCX1BBWUxPQURfQU1BUCB7CisJdTMyIGR3WzU5XTsKK307CisKKy8qCisgKiBUaGlzIGlzIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIE1DQyBDb21tYW5kIFdSQiBmb3IgY29tbWFuZHMKKyAqIHNlbnQgdG8gdGhlIE1hbmFnZW1lbnQgUHJvY2Vzc2luZyBVbml0IChNUFUpLiBTZWUgc2VjdGlvbgorICogZm9yIHVzYWdlIGluIGVtYmVkZGVkIGFuZCBub24tZW1iZWRkZWQgbW9kZXMuCisgKi8KK3N0cnVjdCBCRV9NQ0NfV1JCX0FNQVAgeworCXU4IGVtYmVkZGVkOwkvKiBEV09SRCAwICovCisJdTggcnN2ZDBbMl07CS8qIERXT1JEIDAgKi8KKwl1OCBzZ2VfY291bnRbNV07CS8qIERXT1JEIDAgKi8KKwl1OCByc3ZkMVsxNl07CS8qIERXT1JEIDAgKi8KKwl1OCBzcGVjaWFsWzhdOwkvKiBEV09SRCAwICovCisJdTggcGF5bG9hZF9sZW5ndGhbMzJdOwkvKiBEV09SRCAxICovCisJdTggdGFnWzJdWzMyXTsJLyogRFdPUkQgMiAqLworCXU4IHJzdmQyWzMyXTsJLyogRFdPUkQgNCAqLworCXN0cnVjdCBCRV9NQ0NfV1JCX1BBWUxPQURfQU1BUCBwYXlsb2FkOworfSBfX3BhY2tlZDsKK3N0cnVjdCBNQ0NfV1JCX0FNQVAgeworCXUzMiBkd1s2NF07Cit9OworCisvKiAgVGhpcyBpcyB0aGUgc3RydWN0dXJlIG9mIHRoZSBNQ0MgQ29tcGxldGlvbiBxdWV1ZSBlbnRyeSAgKi8KK3N0cnVjdCBCRV9NQ0NfQ1FfRU5UUllfQU1BUCB7CisJdTggY29tcGxldGlvbl9zdGF0dXNbMTZdOwkvKiBEV09SRCAwICovCisJdTggZXh0ZW5kZWRfc3RhdHVzWzE2XTsJLyogRFdPUkQgMCAqLworCXU4IG1jY190YWdbMl1bMzJdOwkvKiBEV09SRCAxICovCisJdTggcnN2ZDBbMjddOwkvKiBEV09SRCAzICovCisJdTggY29uc3VtZWQ7CS8qIERXT1JEIDMgKi8KKwl1OCBjb21wbGV0ZWQ7CS8qIERXT1JEIDMgKi8KKwl1OCBocGlfYnVmZmVyX2NvbXBsZXRpb247CS8qIERXT1JEIDMgKi8KKwl1OCBhc3luY19ldmVudDsJLyogRFdPUkQgMyAqLworCXU4IHZhbGlkOwkJLyogRFdPUkQgMyAqLworfSBfX3BhY2tlZDsKK3N0cnVjdCBNQ0NfQ1FfRU5UUllfQU1BUCB7CisJdTMyIGR3WzRdOworfTsKKworLyogTWFpbGJveCBzdHJ1Y3R1cmVzIHVzZWQgYnkgdGhlIE1QVSBkdXJpbmcgYm9vdHN0cmFwICovCitzdHJ1Y3QgQkVfTUNDX01BSUxCT1hfQU1BUCB7CisJc3RydWN0IEJFX01DQ19XUkJfQU1BUCB3cmI7CisJc3RydWN0IEJFX01DQ19DUV9FTlRSWV9BTUFQIGNxOworfSBfX3BhY2tlZDsKK3N0cnVjdCBNQ0NfTUFJTEJPWF9BTUFQIHsKKwl1MzIgZHdbNjhdOworfTsKKworI2VuZGlmIC8qIF9fZndjbWRfbWNjX2FtYXBfaF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvZndjbWRfb3Bjb2Rlcy5oIGIvZHJpdmVycy9zdGFnaW5nL2JlbmV0L2Z3Y21kX29wY29kZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yM2Q1NjkzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JlbmV0L2Z3Y21kX29wY29kZXMuaApAQCAtMCwwICsxLDI0NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNSAtIDIwMDggU2VydmVyRW5naW5lcworICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgVGhlIGZ1bGwgR05VIEdlbmVyYWwKKyAqIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZSBmaWxlIGNhbGxlZCBDT1BZSU5HLgorICoKKyAqIENvbnRhY3QgSW5mb3JtYXRpb246CisgKiBsaW51eC1kcml2ZXJzQHNlcnZlcmVuZ2luZXMuY29tCisgKgorICogU2VydmVyRW5naW5lcworICogMjA5IE4uIEZhaXIgT2FrcyBBdmUKKyAqIFN1bm55dmFsZSwgQ0EgOTQwODUKKyAqLworLyoKKyAqIEF1dG9nZW5lcmF0ZWQgYnkgc3JjZ2VuIHZlcnNpb246IDAxMjcKKyAqLworI2lmbmRlZiBfX2Z3Y21kX29wY29kZXNfYW1hcF9oX18KKyNkZWZpbmUgX19md2NtZF9vcGNvZGVzX2FtYXBfaF9fCisKKy8qCisgKiAtLS0gRldDTURfU1VCU1lTVEVNUyAtLS0KKyAqIFRoZSBjb21tYW5kcyBhcmUgZ3JvdXBlZCBpbnRvIHRoZSBmb2xsb3dpbmcgc3Vic3lzdGVtcy4gVGhlIHN1YnN5c3RlbQorICogY29kZSBhbG9uZyB3aXRoIHRoZSBvcGNvZGUgdW5pcXVlbHkgaWRlbnRpZnkgYSBwYXJ0aWN1bGFyIGZ3Y21kLgorICovCisjZGVmaW5lIEZXQ01EX1NVQlNZU1RFTV9SU1ZEICAoMCkJLyogVGhpcyBzdWJzeXN0ZW0gaXMgcmVzZXJ2ZWQuIEl0IGlzICovCisJCQkJCQkgIC8qIG5ldmVyIHVzZWQuICovCisjZGVmaW5lIEZXQ01EX1NVQlNZU1RFTV9DT01NT04gKDEpCS8qIENNRHMgaW4gdGhpcyBncm91cCBhcmUgY29tbW9uIHRvCisJCQkJCSogYWxsIHN1YnN5c3RlbXMuIFNlZQorCQkJCQkqIENPTU1PTl9TVUJTWVNURU1fT1BDT0RFUyBmb3Igb3Bjb2RlcworCQkJCQkqIGFuZCBDb21tb24gSG9zdCBDb25maWd1cmF0aW9uIENNRHMKKwkJCQkJKiBmb3IgdGhlIEZXQ01EIGRlc2NyaXB0aW9ucy4KKwkJCQkJKi8KKyNkZWZpbmUgRldDTURfU1VCU1lTVEVNX0NPTU1PTl9JU0NTSSAgICAoMikgLyogQ01EcyBpbiB0aGlzIGdyb3VwIGFyZSAqLworCQkJCQkvKgorCQkJCQkqIGNvbW1vbiB0byBJbml0aWF0b3IgYW5kIFRhcmdldC4gU2VlCisJCQkJCSogQ09NTU9OX0lTQ1NJX1NVQlNZU1RFTV9PUENPREVTIGFuZAorCQkJCQkqIENvbW1vbiBpU0NTSSBJbml0aWF0b3IgYW5kIFRhcmdldAorCQkJCQkqIENNRHMgZm9yIHRoZSBjb21tYW5kIGRlc2NyaXB0aW9ucy4KKwkJCQkJKi8KKyNkZWZpbmUgRldDTURfU1VCU1lTVEVNX0VUSCAgICAgICAgICAgICAoMykJLyogVGhpcyBzdWJzeXN0ZW0gaXMgdXNlZCB0bworCQkJCQkJZXhlY3V0ZSAgRXRoZXJuZXQgY29tbWFuZHMuICAqLworCisjZGVmaW5lIEZXQ01EX1NVQlNZU1RFTV9UUE0gICAgICAgICAgICAgKDQpCS8qIFRoaXMgc3Vic3lzdGVtIGlzIHVzZWQKKwkJCQkJCSB0byBleGVjdXRlIFRQTSAgY29tbWFuZHMuICAqLworI2RlZmluZSBGV0NNRF9TVUJTWVNURU1fUFhFX1VOREkgICAgICAgICg1KQkvKiBUaGlzIHN1YnN5c3RlbSBpcyB1c2VkCisJCQkJCQkqIHRvIGV4ZWN1dGUgUFhFCisJCQkJCQkqIGFuZCBVTkRJIHNwZWNpZmljIGNvbW1hbmRzLgorCQkJCQkJKi8KKworI2RlZmluZSBGV0NNRF9TVUJTWVNURU1fSVNDU0lfSU5JICAgICAgICg2KQkvKiBUaGlzIHN1YnN5c3RlbSBpcyB1c2VkIHRvCisJCQkJCQlleGVjdXRlIElTQ1NJIEluaXRpYXRvcgorCQkJCQkJc3BlY2lmaWMgY29tbWFuZHMuCisJCQkJCQkqLworI2RlZmluZSBGV0NNRF9TVUJTWVNURU1fSVNDU0lfVEdUICAgICAgICg3KQkvKiBUaGlzIHN1YnN5c3RlbSBpcyB1c2VkCisJCQkJCQl0byBleGVjdXRlIGlTQ1NJIFRhcmdldAorCQkJCQkJc3BlY2lmaWMgY29tbWFuZHMuYmV0d2VlbgorCQkJCQkJUFRMIGFuZCBBUk0gZmlybXdhcmUuCisJCQkJCQkqLworI2RlZmluZSBGV0NNRF9TVUJTWVNURU1fTUlMSV9QVEwgICAgICAgICg4KQkvKiBUaGlzIHN1YnN5c3RlbSBpcyB1c2VkIHRvCisJCQkJCQlleGVjdXRlIGlTQ1NJIFRhcmdldCBzcGVjaWZpYworCQkJCQkJY29tbWFuZHMuYmV0d2VlbiBNSUxJCisJCQkJCQlhbmQgUFRMLiAgKi8KKyNkZWZpbmUgRldDTURfU1VCU1lTVEVNX01JTElfVE1EICAgICAgICAoOSkJLyogVGhpcyBzdWJzeXN0ZW0gaXMgdXNlZCB0bworCQkJCQkJZXhlY3V0ZSBpU0NTSSBUYXJnZXQgc3BlY2lmaWMKKwkJCQkJCWNvbW1hbmRzIGJldHdlZW4gTUlMSQorCQkJCQkJYW5kIFRNRC4gICovCisjZGVmaW5lIEZXQ01EX1NVQlNZU1RFTV9QUk9YWSAgICAgICAgICAgKDExKQkvKiBUaGlzIHN1YnN5c3RlbSBpcyB1c2VkCisJCQkJCQl0byBleGVjdXRlIHByb3hpZWQgY29tbWFuZHMKKwkJCQkJCXdpdGhpbiB0aGUgaG9zdCBhdCB0aGUKKwkJCQkJCWV4cGxpY2l0IHJlcXVlc3Qgb2YgYQorCQkJCQkJbm9uIHByaXZpbGVkZ2VkIGRvbWFpbi4KKwkJCQkJCVRoaXMgJ3N1YnN5c3RlbScgaXMgZW50aXJlbHkKKwkJCQkJCXZpcnR1YWwgZnJvbSB0aGUgY29udHJvbGxlcgorCQkJCQkJYW5kIGZpcm13YXJlIHBlcnNwZWN0aXZlIGFzCisJCQkJCQlpdCBpcyBpbXBsZW1lbnRlZCBpbiBob3N0CisJCQkJCQlkcml2ZXJzLgorCQkJCQkJKi8KKworLyoKKyAqIC0tLSBDT01NT05fU1VCU1lTVEVNX09QQ09ERVMgLS0tCisgKiBUaGVzZSBvcGNvZGVzIGFyZSBjb21tb24gdG8gYm90aCBuZXR3b3JraW5nIGFuZCBzdG9yYWdlIFBDSQorICogZnVuY3Rpb25zLiBUaGV5IGFyZSB1c2VkIHRvIHJlc2VydmUgcmVzb3VyY2VzIGFuZCBjb25maWd1cmUKKyAqIEJsYWRlRW5naW5lLiBUaGVzZSBvcGNvZGVzIGFsbCB1c2UgdGhlIEZXQ01EX1NVQlNZU1RFTV9DT01NT04KKyAqIHN1YnN5c3RlbSBjb2RlLgorICovCisjZGVmaW5lIE9QQ09ERV9DT01NT05fTlRXS19NQUNfUVVFUlkgICAgKDEpCisjZGVmaW5lIFNVQlNZU1RFTV9DT01NT05fTlRXS19NQUNfUVVFUlkgKDEpCisjZGVmaW5lIFNVQlNZU1RFTV9DT01NT05fTlRXS19NQUNfU0VUICAgKDEpCisjZGVmaW5lIFNVQlNZU1RFTV9DT01NT05fTlRXS19NVUxUSUNBU1RfU0VUICgxKQorI2RlZmluZSBTVUJTWVNURU1fQ09NTU9OX05UV0tfVkxBTl9DT05GSUcgKDEpCisjZGVmaW5lIFNVQlNZU1RFTV9DT01NT05fTlRXS19MSU5LX1NUQVRVU19RVUVSWSAoMSkKKyNkZWZpbmUgU1VCU1lTVEVNX0NPTU1PTl9SRUFEX0ZMQVNIUk9NICAoMSkKKyNkZWZpbmUgU1VCU1lTVEVNX0NPTU1PTl9XUklURV9GTEFTSFJPTSAoMSkKKyNkZWZpbmUgU1VCU1lTVEVNX0NPTU1PTl9RVUVSWV9NQVhfRldDTURfQlVGRkVSX1NJWkUgKDEpCisjZGVmaW5lIFNVQlNZU1RFTV9DT01NT05fQUREX1BBR0VfVEFCTEVTICgxKQorI2RlZmluZSBTVUJTWVNURU1fQ09NTU9OX1JFTU9WRV9QQUdFX1RBQkxFUyAoMSkKKyNkZWZpbmUgU1VCU1lTVEVNX0NPTU1PTl9SSU5HX0RFU1RST1kgICAoMSkKKyNkZWZpbmUgU1VCU1lTVEVNX0NPTU1PTl9DUV9DUkVBVEUgICAgICAoMSkKKyNkZWZpbmUgU1VCU1lTVEVNX0NPTU1PTl9FUV9DUkVBVEUgICAgICAoMSkKKyNkZWZpbmUgU1VCU1lTVEVNX0NPTU1PTl9FVEhfUlhfQ1JFQVRFICAoMSkKKyNkZWZpbmUgU1VCU1lTVEVNX0NPTU1PTl9FVEhfVFhfQ1JFQVRFICAoMSkKKyNkZWZpbmUgU1VCU1lTVEVNX0NPTU1PTl9JU0NTSV9ERUZRX0NSRUFURSAoMSkKKyNkZWZpbmUgU1VCU1lTVEVNX0NPTU1PTl9JU0NTSV9XUkJRX0NSRUFURSAoMSkKKyNkZWZpbmUgU1VCU1lTVEVNX0NPTU1PTl9NQ0NfQ1JFQVRFICAgICAoMSkKKyNkZWZpbmUgU1VCU1lTVEVNX0NPTU1PTl9KRUxMX0NPTkZJRyAgICAoMSkKKyNkZWZpbmUgU1VCU1lTVEVNX0NPTU1PTl9GT1JDRV9GQUlMT1ZFUiAoMSkKKyNkZWZpbmUgU1VCU1lTVEVNX0NPTU1PTl9BRERfVEVNUExBVEVfSEVBREVSX0JVRkZFUlMgKDEpCisjZGVmaW5lIFNVQlNZU1RFTV9DT01NT05fUkVNT1ZFX1RFTVBMQVRFX0hFQURFUl9CVUZGRVJTICgxKQorI2RlZmluZSBTVUJTWVNURU1fQ09NTU9OX1BPU1RfWkVST19CVUZGRVIgKDEpCisjZGVmaW5lIFNVQlNZU1RFTV9DT01NT05fR0VUX1FPUyAgICAgICAgKDEpCisjZGVmaW5lIFNVQlNZU1RFTV9DT01NT05fU0VUX1FPUyAgICAgICAgKDEpCisjZGVmaW5lIFNVQlNZU1RFTV9DT01NT05fVENQX0dFVF9TVEFUSVNUSUNTICgxKQorI2RlZmluZSBTVUJTWVNURU1fQ09NTU9OX1NFRVBST01fUkVBRCAgICgxKQorI2RlZmluZSBTVUJTWVNURU1fQ09NTU9OX1RDUF9TVEFURV9RVUVSWSAoMSkKKyNkZWZpbmUgU1VCU1lTVEVNX0NPTU1PTl9HRVRfQ05UTF9BVFRSSUJVVEVTICgxKQorI2RlZmluZSBTVUJTWVNURU1fQ09NTU9OX05PUCAgICAgICAgICAgICgxKQorI2RlZmluZSBTVUJTWVNURU1fQ09NTU9OX05UV0tfUlhfRklMVEVSICgxKQorI2RlZmluZSBTVUJTWVNURU1fQ09NTU9OX0dFVF9GV19WRVJTSU9OICgxKQorI2RlZmluZSBTVUJTWVNURU1fQ09NTU9OX1NFVF9GTE9XX0NPTlRST0wgKDEpCisjZGVmaW5lIFNVQlNZU1RFTV9DT01NT05fR0VUX0ZMT1dfQ09OVFJPTCAoMSkKKyNkZWZpbmUgU1VCU1lTVEVNX0NPTU1PTl9TRVRfVENQX1BBUkFNRVRFUlMgKDEpCisjZGVmaW5lIFNVQlNZU1RFTV9DT01NT05fU0VUX0ZSQU1FX1NJWkUgKDEpCisjZGVmaW5lIFNVQlNZU1RFTV9DT01NT05fR0VUX0ZBVCAgICAgICAgKDEpCisjZGVmaW5lIFNVQlNZU1RFTV9DT01NT05fTU9ESUZZX0VRX0RFTEFZICgxKQorI2RlZmluZSBTVUJTWVNURU1fQ09NTU9OX0ZJUk1XQVJFX0NPTkZJRyAoMSkKKyNkZWZpbmUgU1VCU1lTVEVNX0NPTU1PTl9FTkFCTEVfRElTQUJMRV9ET01BSU5TICgxKQorI2RlZmluZSBTVUJTWVNURU1fQ09NTU9OX0dFVF9ET01BSU5fQ09ORklHICgxKQorI2RlZmluZSBTVUJTWVNURU1fQ09NTU9OX1NFVF9WTERfQ09ORklHICgxKQorI2RlZmluZSBTVUJTWVNURU1fQ09NTU9OX0dFVF9WTERfQ09ORklHICgxKQorI2RlZmluZSBTVUJTWVNURU1fQ09NTU9OX0dFVF9QT1JUX0VRVUFMSVpBVElPTiAoMSkKKyNkZWZpbmUgU1VCU1lTVEVNX0NPTU1PTl9TRVRfUE9SVF9FUVVBTElaQVRJT04gKDEpCisjZGVmaW5lIFNVQlNZU1RFTV9DT01NT05fUkVEX0NPTkZJRyAgICAgKDEpCisjZGVmaW5lIE9QQ09ERV9DT01NT05fTlRXS19NQUNfU0VUICAgICAgKDIpCisjZGVmaW5lIE9QQ09ERV9DT01NT05fTlRXS19NVUxUSUNBU1RfU0VUICgzKQorI2RlZmluZSBPUENPREVfQ09NTU9OX05UV0tfVkxBTl9DT05GSUcgICg0KQorI2RlZmluZSBPUENPREVfQ09NTU9OX05UV0tfTElOS19TVEFUVVNfUVVFUlkgKDUpCisjZGVmaW5lIE9QQ09ERV9DT01NT05fUkVBRF9GTEFTSFJPTSAgICAgKDYpCisjZGVmaW5lIE9QQ09ERV9DT01NT05fV1JJVEVfRkxBU0hST00gICAgKDcpCisjZGVmaW5lIE9QQ09ERV9DT01NT05fUVVFUllfTUFYX0ZXQ01EX0JVRkZFUl9TSVpFICg4KQorI2RlZmluZSBPUENPREVfQ09NTU9OX0FERF9QQUdFX1RBQkxFUyAgICg5KQorI2RlZmluZSBPUENPREVfQ09NTU9OX1JFTU9WRV9QQUdFX1RBQkxFUyAoMTApCisjZGVmaW5lIE9QQ09ERV9DT01NT05fUklOR19ERVNUUk9ZICAgICAgKDExKQorI2RlZmluZSBPUENPREVfQ09NTU9OX0NRX0NSRUFURSAgICAgICAgICgxMikKKyNkZWZpbmUgT1BDT0RFX0NPTU1PTl9FUV9DUkVBVEUgICAgICAgICAoMTMpCisjZGVmaW5lIE9QQ09ERV9DT01NT05fRVRIX1JYX0NSRUFURSAgICAgKDE0KQorI2RlZmluZSBPUENPREVfQ09NTU9OX0VUSF9UWF9DUkVBVEUgICAgICgxNSkKKyNkZWZpbmUgT1BDT0RFX0NPTU1PTl9ORVRfUkVTRVJWRUQwICAgICAoMTYpCS8qIFJlc2VydmVkICovCisjZGVmaW5lIE9QQ09ERV9DT01NT05fTkVUX1JFU0VSVkVEMSAgICAgKDE3KQkvKiBSZXNlcnZlZCAqLworI2RlZmluZSBPUENPREVfQ09NTU9OX05FVF9SRVNFUlZFRDIgICAgICgxOCkJLyogUmVzZXJ2ZWQgKi8KKyNkZWZpbmUgT1BDT0RFX0NPTU1PTl9JU0NTSV9ERUZRX0NSRUFURSAoMTkpCisjZGVmaW5lIE9QQ09ERV9DT01NT05fSVNDU0lfV1JCUV9DUkVBVEUgKDIwKQorI2RlZmluZSBPUENPREVfQ09NTU9OX01DQ19DUkVBVEUgICAgICAgICgyMSkKKyNkZWZpbmUgT1BDT0RFX0NPTU1PTl9KRUxMX0NPTkZJRyAgICAgICAoMjIpCisjZGVmaW5lIE9QQ09ERV9DT01NT05fRk9SQ0VfRkFJTE9WRVIgICAgKDIzKQorI2RlZmluZSBPUENPREVfQ09NTU9OX0FERF9URU1QTEFURV9IRUFERVJfQlVGRkVSUyAoMjQpCisjZGVmaW5lIE9QQ09ERV9DT01NT05fUkVNT1ZFX1RFTVBMQVRFX0hFQURFUl9CVUZGRVJTICgyNSkKKyNkZWZpbmUgT1BDT0RFX0NPTU1PTl9QT1NUX1pFUk9fQlVGRkVSICAoMjYpCisjZGVmaW5lIE9QQ09ERV9DT01NT05fR0VUX1FPUyAgICAgICAgICAgKDI3KQorI2RlZmluZSBPUENPREVfQ09NTU9OX1NFVF9RT1MgICAgICAgICAgICgyOCkKKyNkZWZpbmUgT1BDT0RFX0NPTU1PTl9UQ1BfR0VUX1NUQVRJU1RJQ1MgKDI5KQorI2RlZmluZSBPUENPREVfQ09NTU9OX1NFRVBST01fUkVBRCAgICAgICgzMCkKKyNkZWZpbmUgT1BDT0RFX0NPTU1PTl9UQ1BfU1RBVEVfUVVFUlkgICAoMzEpCisjZGVmaW5lIE9QQ09ERV9DT01NT05fR0VUX0NOVExfQVRUUklCVVRFUyAoMzIpCisjZGVmaW5lIE9QQ09ERV9DT01NT05fTk9QICAgICAgICAgICAgICAgKDMzKQorI2RlZmluZSBPUENPREVfQ09NTU9OX05UV0tfUlhfRklMVEVSICAgICgzNCkKKyNkZWZpbmUgT1BDT0RFX0NPTU1PTl9HRVRfRldfVkVSU0lPTiAgICAoMzUpCisjZGVmaW5lIE9QQ09ERV9DT01NT05fU0VUX0ZMT1dfQ09OVFJPTCAgKDM2KQorI2RlZmluZSBPUENPREVfQ09NTU9OX0dFVF9GTE9XX0NPTlRST0wgICgzNykKKyNkZWZpbmUgT1BDT0RFX0NPTU1PTl9TRVRfVENQX1BBUkFNRVRFUlMgKDM4KQorI2RlZmluZSBPUENPREVfQ09NTU9OX1NFVF9GUkFNRV9TSVpFICAgICgzOSkKKyNkZWZpbmUgT1BDT0RFX0NPTU1PTl9HRVRfRkFUICAgICAgICAgICAoNDApCisjZGVmaW5lIE9QQ09ERV9DT01NT05fTU9ESUZZX0VRX0RFTEFZICAgKDQxKQorI2RlZmluZSBPUENPREVfQ09NTU9OX0ZJUk1XQVJFX0NPTkZJRyAgICg0MikKKyNkZWZpbmUgT1BDT0RFX0NPTU1PTl9FTkFCTEVfRElTQUJMRV9ET01BSU5TICg0MykKKyNkZWZpbmUgT1BDT0RFX0NPTU1PTl9HRVRfRE9NQUlOX0NPTkZJRyAoNDQpCisjZGVmaW5lIE9QQ09ERV9DT01NT05fU0VUX1ZMRF9DT05GSUcgICAgKDQ1KQorI2RlZmluZSBPUENPREVfQ09NTU9OX0dFVF9WTERfQ09ORklHICAgICg0NikKKyNkZWZpbmUgT1BDT0RFX0NPTU1PTl9HRVRfUE9SVF9FUVVBTElaQVRJT04gKDQ3KQorI2RlZmluZSBPUENPREVfQ09NTU9OX1NFVF9QT1JUX0VRVUFMSVpBVElPTiAoNDgpCisjZGVmaW5lIE9QQ09ERV9DT01NT05fUkVEX0NPTkZJRyAgICAgICAgKDQ5KQorCisKKworLyoKKyAqIC0tLSBFVEhfU1VCU1lTVEVNX09QQ09ERVMgLS0tCisgKiBUaGVzZSBvcGNvZGVzIGFyZSB1c2VkIGZvciBjb25maWd1cmluZyB0aGUgRXRoZXJuZXQgaW50ZXJmYWNlcy4gVGhlc2UKKyAqIG9wY29kZXMgYWxsIHVzZSB0aGUgRldDTURfU1VCU1lTVEVNX0VUSCBzdWJzeXN0ZW0gY29kZS4KKyAqLworI2RlZmluZSBPUENPREVfRVRIX1JTU19DT05GSUcgICAgICAgICAgICgxKQorI2RlZmluZSBPUENPREVfRVRIX0FDUElfQ09ORklHICAgICAgICAgICgyKQorI2RlZmluZSBTVUJTWVNURU1fRVRIX1JTU19DT05GSUcgICAgICAgICgzKQorI2RlZmluZSBTVUJTWVNURU1fRVRIX0FDUElfQ09ORklHICAgICAgICgzKQorI2RlZmluZSBPUENPREVfRVRIX1BST01JU0NVT1VTICAgICAgICAgICgzKQorI2RlZmluZSBTVUJTWVNURU1fRVRIX1BST01JU0NVT1VTICAgICAgICgzKQorI2RlZmluZSBTVUJTWVNURU1fRVRIX0dFVF9TVEFUSVNUSUNTICAgICgzKQorI2RlZmluZSBTVUJTWVNURU1fRVRIX0dFVF9SWF9GUkFHX1NJWkUgICgzKQorI2RlZmluZSBTVUJTWVNURU1fRVRIX1NFVF9SWF9GUkFHX1NJWkUgICgzKQorI2RlZmluZSBPUENPREVfRVRIX0dFVF9TVEFUSVNUSUNTICAgICAgICg0KQorI2RlZmluZSBPUENPREVfRVRIX0dFVF9SWF9GUkFHX1NJWkUgICAgICg1KQorI2RlZmluZSBPUENPREVfRVRIX1NFVF9SWF9GUkFHX1NJWkUgICAgICg2KQorCisKKworCisKKy8qCisgKiAtLS0gTUNDX1NUQVRVU19DT0RFIC0tLQorICogVGhlc2UgYXJlIHRoZSBnbG9iYWwgc3RhdHVzIGNvZGVzIHVzZWQgYnkgYWxsIHN1YnN5c3RlbXMKKyAqLworI2RlZmluZSBNQ0NfU1RBVFVTX1NVQ0NFU1MgICAgICAgICAgICAgICgwKQkvKiBJbmRpY2F0ZXMgYSBzdWNjZXNzZnVsCisJCQkJCQljb21wbGV0aW9uIG9mICB0aGUgY29tbWFuZCAqLworI2RlZmluZSBNQ0NfU1RBVFVTX0lOU1VGRklDSUVOVF9QUklWSUxFR0VTICgxKQkvKiBUaGUgY2xpZW50IGRvZXMgbm90IGhhdmUKKwkJCQkJCXN1ZmZpY2llbnQgcHJpdmlsZWdlcyB0bworCQkJCQkJZXhlY3V0ZSB0aGUgY29tbWFuZCAqLworI2RlZmluZSBNQ0NfU1RBVFVTX0lOVkFMSURfUEFSQU1FVEVSICAgICgyKQkvKiBBIHBhcmFtZXRlciBpbiB0aGUgY29tbWFuZAorCQkJCQkJd2FzIGludmFsaWQuIFRoZSBleHRlbmRlZAorCQkJCQkJc3RhdHVzIGNvbnRhaW5zIHRoZSBpbmRleAorCQkJCQkJb2YgdGhlIHBhcmFtZXRlciAqLworI2RlZmluZSBNQ0NfU1RBVFVTX0lOU1VGRklDSUVOVF9SRVNPVVJDRVMgKDMpCS8qIFRoZXJlIGFyZSBpbnN1ZmZpY2llbnQKKwkJCQkJCWNoaXAgcmVzb3VyY2VzIHRvIGV4ZWN1dGUKKwkJCQkJCXRoZSBjb21tYW5kICovCisjZGVmaW5lIE1DQ19TVEFUVVNfUVVFVUVfRkxVU0hJTkcgICAgICAgKDQpCS8qIFRoZSBjb21tYW5kIGlzIGNvbXBsZXRpbmcKKwkJCQkJCWJlY2F1c2UgdGhlIHF1ZXVlIHdhcworCQkJCQkJZ2V0dGluZyBmbHVzaGVkICovCisjZGVmaW5lIE1DQ19TVEFUVVNfRE1BX0ZBSUxFRCAgICAgICAgICAgKDUpCS8qIFRoZSBjb21tYW5kIGlzIGNvbXBsZXRpbmcKKwkJCQkJCXdpdGggYSBETUEgZXJyb3IgKi8KKworLyoKKyAqIC0tLSBNR01UX0VSUk9SX0NPREVTIC0tLQorICogRXJyb3IgQ29kZXMgcmV0dXJuZWQgaW4gdGhlIHN0YXR1cyBmaWVsZCBvZiB0aGUgRldDTUQgcmVzcG9uc2UgaGVhZGVyCisgKi8KKyNkZWZpbmUgTUdNVF9TVEFUVVNfU1VDQ0VTUyAgICAgICAgICAgICAoMCkJLyogVGhlIEZXQ01EIGNvbXBsZXRlZAorCQkJCQkJd2l0aG91dCBlcnJvcnMgKi8KKyNkZWZpbmUgTUdNVF9TVEFUVVNfRkFJTEVEICAgICAgICAgICAgICAoMSkJLyogRXJyb3Igc3RhdHVzIGluIHRoZSBTdGF0dXMKKwkJCQkJCWZpZWxkIG9mICB0aGUKKwkJCQkJCXN0cnVjdCBGV0NNRF9SRVNQT05TRV9IRUFERVIgKi8KKyNkZWZpbmUgTUdNVF9TVEFUVVNfSUxMRUdBTF9SRVFVRVNUICAgICAoMikJLyogSW52YWxpZCBGV0NNRCBvcGNvZGUgKi8KKyNkZWZpbmUgTUdNVF9TVEFUVVNfSUxMRUdBTF9GSUVMRCAgICAgICAoMykJLyogSW52YWxpZCBwYXJhbWV0ZXIgaW4KKwkJCQkJCXRoZSBGV0NNRCAgcGF5bG9hZCAqLworCisjZW5kaWYgLyogX19md2NtZF9vcGNvZGVzX2FtYXBfaF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvZndjbWRfdHlwZXNfYm1hcC5oIGIvZHJpdmVycy9zdGFnaW5nL2JlbmV0L2Z3Y21kX3R5cGVzX2JtYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjIxN2FmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JlbmV0L2Z3Y21kX3R5cGVzX2JtYXAuaApAQCAtMCwwICsxLDI5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA1IC0gMjAwOCBTZXJ2ZXJFbmdpbmVzCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBUaGUgZnVsbCBHTlUgR2VuZXJhbAorICogUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlIGZpbGUgY2FsbGVkIENPUFlJTkcuCisgKgorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqIGxpbnV4LWRyaXZlcnNAc2VydmVyZW5naW5lcy5jb20KKyAqCisgKiBTZXJ2ZXJFbmdpbmVzCisgKiAyMDkgTi4gRmFpciBPYWtzIEF2ZQorICogU3Vubnl2YWxlLCBDQSA5NDA4NQorICovCisvKgorICogQXV0b2dlbmVyYXRlZCBieSBzcmNnZW4gdmVyc2lvbjogMDEyNworICovCisjaWZuZGVmIF9fZndjbWRfdHlwZXNfYm1hcF9oX18KKyNkZWZpbmUgX19md2NtZF90eXBlc19ibWFwX2hfXworCisvKiBNQUMgYWRkcmVzcyBmb3JtYXQgICovCitzdHJ1Y3QgTUFDX0FERFJFU1NfRk9STUFUIHsKKwl1MTYgU2l6ZU9mU3RydWN0dXJlOworCXU4IE1BQ0FkZHJlc3NbNl07Cit9IF9fcGFja2VkOworCisjZW5kaWYgLyogX19md2NtZF90eXBlc19ibWFwX2hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JlbmV0L2hvc3Rfc3RydWN0LmggYi9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvaG9zdF9zdHJ1Y3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZGU2NzIyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JlbmV0L2hvc3Rfc3RydWN0LmgKQEAgLTAsMCArMSwxODIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgLSAyMDA4IFNlcnZlckVuZ2luZXMKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFRoZSBmdWxsIEdOVSBHZW5lcmFsCisgKiBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUgZmlsZSBjYWxsZWQgQ09QWUlORy4KKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogbGludXgtZHJpdmVyc0BzZXJ2ZXJlbmdpbmVzLmNvbQorICoKKyAqIFNlcnZlckVuZ2luZXMKKyAqIDIwOSBOLiBGYWlyIE9ha3MgQXZlCisgKiBTdW5ueXZhbGUsIENBIDk0MDg1CisgKi8KKy8qCisgKiBBdXRvZ2VuZXJhdGVkIGJ5IHNyY2dlbiB2ZXJzaW9uOiAwMTI3CisgKi8KKyNpZm5kZWYgX19ob3N0X3N0cnVjdF9hbWFwX2hfXworI2RlZmluZSBfX2hvc3Rfc3RydWN0X2FtYXBfaF9fCisjaW5jbHVkZSAiYmVfY20uaCIKKyNpbmNsdWRlICJiZV9jb21tb24uaCIKKyNpbmNsdWRlICJkZXNjcmlwdG9ycy5oIgorCisvKiAtLS0gRVFfQ09NUExFVElPTl9NQUpPUl9DT0RFX0VOVU0gLS0tICovCisjZGVmaW5lIEVRX01BSk9SX0NPREVfQ09NUExFVElPTiAgICAgICAgKDApCS8qIENvbXBsZXRpb24gZXZlbnQgb24gYSAqLworCQkJCQkJICAvKiBxY29tcGxldGlvbiB1ZXVlLiAqLworI2RlZmluZSBFUV9NQUpPUl9DT0RFX0VUSCAgICAgICAgICAgICAgICgxKQkvKiBBZmZpbGlhdGVkIEV0aGVybmV0IEV2ZW50LiAqLworI2RlZmluZSBFUV9NQUpPUl9DT0RFX1JFU0VSVkVEICAgICAgICAgICgyKQkvKiBSZXNlcnZlZCAqLworI2RlZmluZSBFUV9NQUpPUl9DT0RFX1JETUEgICAgICAgICAgICAgICgzKQkvKiBBZmZpbGlhdGVkIFJETUEgRXZlbnQuICovCisjZGVmaW5lIEVRX01BSk9SX0NPREVfSVNDU0kgICAgICAgICAgICAgKDQpCS8qIEFmZmlsaWF0ZWQgSVNDU0kgRXZlbnQgKi8KKyNkZWZpbmUgRVFfTUFKT1JfQ09ERV9VTkFGRklMSUFURUQgICAgICAoNSkJLyogVW5hZmZpbGlhdGVkIEV2ZW50ICovCisKKy8qIC0tLSBFUV9DT01QTEVUSU9OX01JTk9SX0NPREVfRU5VTSAtLS0gKi8KKyNkZWZpbmUgRVFfTUlOT1JfQ09ERV9DT01QTEVUSU9OICAgICAgICAoMCkJLyogQ29tcGxldGlvbiBldmVudCBvbiBhICovCisJCQkJCQkgIC8qIGNvbXBsZXRpb24gcXVldWUuICovCisjZGVmaW5lIEVRX01JTk9SX0NPREVfT1RIRVIgICAgICAgICAgICAgKDEpCS8qIE90aGVyIEV2ZW50IChUQkQpLiAqLworCisvKiBRdWV1ZSBFbnRyeSBEZWZpbml0aW9uIGZvciBhbGwgNCBieXRlIGV2ZW50IHF1ZXVlIHR5cGVzLiAqLworc3RydWN0IEJFX0VRX0VOVFJZX0FNQVAgeworCXU4IFZhbGlkOwkJLyogRFdPUkQgMCAqLworCXU4IE1ham9yQ29kZVszXTsJLyogRFdPUkQgMCAqLworCXU4IE1pbm9yQ29kZVsxMl07CS8qIERXT1JEIDAgKi8KKwl1OCBSZXNvdXJjZUlEWzE2XTsJLyogRFdPUkQgMCAqLworfSBfX3BhY2tlZDsKK3N0cnVjdCBFUV9FTlRSWV9BTUFQIHsKKwl1MzIgZHdbMV07Cit9OworCisvKgorICogLS0tIEVUSF9FVkVOVF9DT0RFIC0tLQorICogVGhlc2UgY29kZXMgYXJlIHJldHVybmVkIGJ5IHRoZSBNUFUgd2hlbiBvbmUgb2YgdGhlc2UgZXZlbnRzIGhhcyBvY2N1cnJlZCwKKyAqIGFuZCB0aGUgZXZlbnQgaXMgY29uZmlndXJlZCB0byByZXBvcnQgdG8gYW4gRXZlbnQgUXVldWUgd2hlbiBhbiBldmVudAorICogaXMgZGV0ZWN0ZWQuCisgKi8KKyNkZWZpbmUgRVRIX0VRX0xJTktfU1RBVFVTICAgICAgICAgICAgICAoMCkJLyogTGluayBzdGF0dXMgY2hhbmdlIGV2ZW50ICovCisJCQkJCQkgIC8qIGRldGVjdGVkLiAqLworI2RlZmluZSBFVEhfRVFfV0FURVJNQVJLICAgICAgICAgICAgICAgICgxKQkvKiB3YXRlcm1hcmsgZXZlbnQgZGV0ZWN0ZWQuICovCisjZGVmaW5lIEVUSF9FUV9NQUdJQ19QS1QgICAgICAgICAgICAgICAgKDIpCS8qIG1hZ2ljIHBrdCBldmVudCBkZXRlY3RlZC4gKi8KKyNkZWZpbmUgRVRIX0VRX0FDUElfUEtUMCAgICAgICAgICAgICAgICAoMykJLyogQUNQSSBpbnRlcmVzdGluZyBwYWNrZXQgKi8KKwkJCQkJCSAgLyogZGV0ZWN0ZWQuICovCisjZGVmaW5lIEVUSF9FUV9BQ1BJX1BLVDEgICAgICAgICAgICAgICAgKDMpCS8qIEFDUEkgaW50ZXJlc3RpbmcgcGFja2V0ICovCisJCQkJCQkgIC8qIGRldGVjdGVkLiAqLworI2RlZmluZSBFVEhfRVFfQUNQSV9QS1QyICAgICAgICAgICAgICAgICgzKQkvKiBBQ1BJIGludGVyZXN0aW5nIHBhY2tldCAqLworCQkJCQkJICAvKiBkZXRlY3RlZC4gKi8KKyNkZWZpbmUgRVRIX0VRX0FDUElfUEtUMyAgICAgICAgICAgICAgICAoMykJLyogQUNQSSBpbnRlcmVzdGluZyBwYWNrZXQgKi8KKwkJCQkJCSAgLyogZGV0ZWN0ZWQuICovCisKKy8qCisgKiAtLS0gRVRIX1RYX0NPTVBMX1NUQVRVU19FTlVNIC0tLQorICogU3RhdHVzIGNvZGVzIGNvbnRhaW5lZCBpbiBFdGhlcm5ldCBUWCBjb21wbGV0aW9uIGRlc2NyaXB0b3JzLgorICovCisjZGVmaW5lIEVUSF9DT01QX1ZBTElEICAgICAgICAgICAgICAgICAgKDApCisjZGVmaW5lIEVUSF9DT01QX0VSUk9SICAgICAgICAgICAgICAgICAgKDEpCisjZGVmaW5lIEVUSF9DT01QX0lOVkFMSUQgICAgICAgICAgICAgICAgKDE1KQorCisvKgorICogLS0tIEVUSF9UWF9DT01QTF9QT1JUX0VOVU0gLS0tCisgKiBQb3J0IGluZGljYXRvciBjb250YWluZWQgaW4gRXRoZXJuZXQgVFggY29tcGxldGlvbiBkZXNjcmlwdG9ycy4KKyAqLworI2RlZmluZSBFVEhfQ09NUF9QT1JUMCAgICAgICAgICAgICAgICAgICgwKQorI2RlZmluZSBFVEhfQ09NUF9QT1JUMSAgICAgICAgICAgICAgICAgICgxKQorI2RlZmluZSBFVEhfQ09NUF9NR01UICAgICAgICAgICAgICAgICAgICgyKQorCisvKgorICogLS0tIEVUSF9UWF9DT01QTF9DVF9FTlVNIC0tLQorICogQ29tcGxldGlvbiB0eXBlIGluZGljYXRvciBjb250YWluZWQgaW4gRXRoZXJuZXQgVFggY29tcGxldGlvbiBkZXNjcmlwdG9ycy4KKyAqLworI2RlZmluZSBFVEhfQ09NUF9FVEggICAgICAgICAgICAgICAgICAgICgwKQorCisvKgorICogV29yayByZXF1ZXN0IGJsb2NrIHRoYXQgdGhlIGRyaXZlciBpc3N1ZXMgdG8gdGhlIGNoaXAgZm9yCisgKiBFdGhlcm5ldCB0cmFuc21pc3Npb25zLiBBbGwgY29udHJvbCBmaWVsZHMgbXVzdCBiZSB2YWxpZCBpbiBlYWNoIFdSQiBmb3IKKyAqIGEgbWVzc2FnZS4gVGhlIGNvbnRyb2xsZXIsIGFzIHNwZWNpZmllZCBieSB0aGUgZmxhZ3MsIG9wdGlvbmFsbHkgd3JpdGVzCisgKiBhbiBlbnRyeSB0byB0aGUgQ29tcGxldGlvbiBSaW5nIGFuZCBnZW5lcmF0ZSBhbiBldmVudC4KKyAqLworc3RydWN0IEJFX0VUSF9XUkJfQU1BUCB7CisJdTggZnJhZ19wYV9oaVszMl07CS8qIERXT1JEIDAgKi8KKwl1OCBmcmFnX3BhX2xvWzMyXTsJLyogRFdPUkQgMSAqLworCXU4IGNvbXBsZXRlOwkvKiBEV09SRCAyICovCisJdTggZXZlbnQ7CQkvKiBEV09SRCAyICovCisJdTggY3JjOwkJLyogRFdPUkQgMiAqLworCXU4IGZvcndhcmQ7CQkvKiBEV09SRCAyICovCisJdTggaXBzZWM7CQkvKiBEV09SRCAyICovCisJdTggbWdtdDsJCS8qIERXT1JEIDIgKi8KKwl1OCBpcGNzOwkJLyogRFdPUkQgMiAqLworCXU4IHVkcGNzOwkJLyogRFdPUkQgMiAqLworCXU4IHRjcGNzOwkJLyogRFdPUkQgMiAqLworCXU4IGxzbzsJCS8qIERXT1JEIDIgKi8KKwl1OCBsYXN0OwkJLyogRFdPUkQgMiAqLworCXU4IHZsYW47CQkvKiBEV09SRCAyICovCisJdTggZGJnWzNdOwkJLyogRFdPUkQgMiAqLworCXU4IGhhc2hfdmFsWzNdOwkvKiBEV09SRCAyICovCisJdTggbHNvX21zc1sxNF07CS8qIERXT1JEIDIgKi8KKwl1OCBmcmFnX2xlblsxNl07CS8qIERXT1JEIDMgKi8KKwl1OCB2bGFuX3RhZ1sxNl07CS8qIERXT1JEIDMgKi8KK30gX19wYWNrZWQ7CitzdHJ1Y3QgRVRIX1dSQl9BTUFQIHsKKwl1MzIgZHdbNF07Cit9OworCisvKiBUaGlzIGlzIGFuIEV0aGVybmV0IHRyYW5zbWl0IGNvbXBsZXRpb24gZGVzY3JpcHRvciAqLworc3RydWN0IEJFX0VUSF9UWF9DT01QTF9BTUFQIHsKKwl1OCB1c2VyX2J5dGVzWzE2XTsJLyogRFdPUkQgMCAqLworCXU4IG53aF9ieXRlc1s4XTsJLyogRFdPUkQgMCAqLworCXU4IGxzbzsJCS8qIERXT1JEIDAgKi8KKwl1OCByc3ZkMFs3XTsJLyogRFdPUkQgMCAqLworCXU4IHdyYl9pbmRleFsxNl07CS8qIERXT1JEIDEgKi8KKwl1OCBjdFsyXTsJCS8qIERXT1JEIDEgKi8KKwl1OCBwb3J0WzJdOwkJLyogRFdPUkQgMSAqLworCXU4IHJzdmQxWzhdOwkvKiBEV09SRCAxICovCisJdTggc3RhdHVzWzRdOwkvKiBEV09SRCAxICovCisJdTggcnN2ZDJbMTZdOwkvKiBEV09SRCAyICovCisJdTggcmluZ2lkWzExXTsJLyogRFdPUkQgMiAqLworCXU4IGhhc2hfdmFsWzRdOwkvKiBEV09SRCAyICovCisJdTggdmFsaWQ7CQkvKiBEV09SRCAyICovCisJdTggcnN2ZDNbMzJdOwkvKiBEV09SRCAzICovCit9IF9fcGFja2VkOworc3RydWN0IEVUSF9UWF9DT01QTF9BTUFQIHsKKwl1MzIgZHdbNF07Cit9OworCisvKiBFdGhlcm5ldCBSZWNlaXZlIEJ1ZmZlciBkZXNjcmlwdG9yICovCitzdHJ1Y3QgQkVfRVRIX1JYX0RfQU1BUCB7CisJdTggZnJhZ3BhX2hpWzMyXTsJLyogRFdPUkQgMCAqLworCXU4IGZyYWdwYV9sb1szMl07CS8qIERXT1JEIDEgKi8KK30gX19wYWNrZWQ7CitzdHJ1Y3QgRVRIX1JYX0RfQU1BUCB7CisJdTMyIGR3WzJdOworfTsKKworLyogVGhpcyBpcyBhbiBFdGhlcm5ldCBSZWNlaXZlIENvbXBsZXRpb24gRGVzY3JpcHRvciAqLworc3RydWN0IEJFX0VUSF9SWF9DT01QTF9BTUFQIHsKKwl1OCB2bGFuX3RhZ1sxNl07CS8qIERXT1JEIDAgKi8KKwl1OCBwa3RzaXplWzE0XTsJLyogRFdPUkQgMCAqLworCXU4IHBvcnQ7CQkvKiBEV09SRCAwICovCisJdTggcnN2ZDA7CQkvKiBEV09SRCAwICovCisJdTggZXJyOwkJLyogRFdPUkQgMSAqLworCXU4IHJzc2hwOwkJLyogRFdPUkQgMSAqLworCXU4IGlwZjsJCS8qIERXT1JEIDEgKi8KKwl1OCB0Y3BmOwkJLyogRFdPUkQgMSAqLworCXU4IHVkcGY7CQkvKiBEV09SRCAxICovCisJdTggaXBja3NtOwkJLyogRFdPUkQgMSAqLworCXU4IHRjcGNrc207CQkvKiBEV09SRCAxICovCisJdTggdWRwY2tzbTsJCS8qIERXT1JEIDEgKi8KKwl1OCBtYWNkc3RbNl07CS8qIERXT1JEIDEgKi8KKwl1OCB2dHA7CQkvKiBEV09SRCAxICovCisJdTggdnRtOwkJLyogRFdPUkQgMSAqLworCXU4IGZyYWduZHhbMTBdOwkvKiBEV09SRCAxICovCisJdTggY3RbMl07CQkvKiBEV09SRCAxICovCisJdTggaXBzZWM7CQkvKiBEV09SRCAxICovCisJdTggbnVtZnJhZ3NbM107CS8qIERXT1JEIDEgKi8KKwl1OCByc3ZkMVszMV07CS8qIERXT1JEIDIgKi8KKwl1OCB2YWxpZDsJCS8qIERXT1JEIDIgKi8KKwl1OCByc3NoYXNoWzMyXTsJLyogRFdPUkQgMyAqLworfSBfX3BhY2tlZDsKK3N0cnVjdCBFVEhfUlhfQ09NUExfQU1BUCB7CisJdTMyIGR3WzRdOworfTsKKworI2VuZGlmIC8qIF9faG9zdF9zdHJ1Y3RfYW1hcF9oX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9od2xpYi5oIGIvZHJpdmVycy9zdGFnaW5nL2JlbmV0L2h3bGliLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWZlZGY0ZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9od2xpYi5oCkBAIC0wLDAgKzEsODMwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA1IC0gMjAwOCBTZXJ2ZXJFbmdpbmVzCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBUaGUgZnVsbCBHTlUgR2VuZXJhbAorICogUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlIGZpbGUgY2FsbGVkIENPUFlJTkcuCisgKgorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqIGxpbnV4LWRyaXZlcnNAc2VydmVyZW5naW5lcy5jb20KKyAqCisgKiBTZXJ2ZXJFbmdpbmVzCisgKiAyMDkgTi4gRmFpciBPYWtzIEF2ZQorICogU3Vubnl2YWxlLCBDQSA5NDA4NQorICovCisjaWZuZGVmIF9faHdsaWJfaF9fCisjZGVmaW5lIF9faHdsaWJfaF9fCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorCisjaW5jbHVkZSAicmVnbWFwLmgiCQkvKiBzcmNnZW4gYXJyYXkgbWFwIG91dHB1dCAqLworCisjaW5jbHVkZSAiYXN5bmNtZXNnLmgiCisjaW5jbHVkZSAiZndjbWRfb3Bjb2Rlcy5oIgorI2luY2x1ZGUgInBvc3RfY29kZXMuaCIKKyNpbmNsdWRlICJmd2NtZF9tY2MuaCIKKworI2luY2x1ZGUgImZ3Y21kX3R5cGVzX2JtYXAuaCIKKyNpbmNsdWRlICJmd2NtZF9jb21tb25fYm1hcC5oIgorI2luY2x1ZGUgImZ3Y21kX2V0aF9ibWFwLmgiCisjaW5jbHVkZSAiYmVzdGF0dXMuaCIKKy8qCisgKgorICogTWFjcm9zIGZvciByZWFkaW5nL3dyaXRpbmcgYSBwcm90ZWN0aW9uIGRvbWFpbiBvciBDU1IgcmVnaXN0ZXJzCisgKiBpbiBCbGFkZUVuZ2luZS4KKyAqLworI2RlZmluZSBQRF9SRUFEKGZvLCBmaWVsZCkJaW9yZWFkMzIoKGZvKS0+ZGJfdmEgKyBcCisJCW9mZnNldG9mKHN0cnVjdCBCRV9QUk9URUNUSU9OX0RPTUFJTl9EQk1BUF9BTUFQLCBmaWVsZCkvOCkKKworI2RlZmluZSBQRF9XUklURShmbywgZmllbGQsIHZhbCkgaW93cml0ZTMyKHZhbCwgKGZvKS0+ZGJfdmEgKyBcCisJCW9mZnNldG9mKHN0cnVjdCBCRV9QUk9URUNUSU9OX0RPTUFJTl9EQk1BUF9BTUFQLCBmaWVsZCkvOCkKKworI2RlZmluZSBDU1JfUkVBRChmbywgZmllbGQpCWlvcmVhZDMyKChmbyktPmNzcl92YSArIFwKKwkJb2Zmc2V0b2Yoc3RydWN0IEJFX0JMQURFX0VOR0lORV9DU1JNQVBfQU1BUCwgZmllbGQpLzgpCisKKyNkZWZpbmUgQ1NSX1dSSVRFKGZvLCBmaWVsZCwgdmFsKQlpb3dyaXRlMzIodmFsLCAoZm8pLT5jc3JfdmEgKyBcCisJCW9mZnNldG9mKHN0cnVjdCBCRV9CTEFERV9FTkdJTkVfQ1NSTUFQX0FNQVAsIGZpZWxkKS84KQorCisjZGVmaW5lIFBDSUNGRzBfUkVBRChmbywgZmllbGQpCWlvcmVhZDMyKChmbyktPnBjaV92YSArIFwKKwkJb2Zmc2V0b2Yoc3RydWN0IEJFX1BDSUNGRzBfQ1NSTUFQX0FNQVAsIGZpZWxkKS84KQorCisjZGVmaW5lIFBDSUNGRzBfV1JJVEUoZm8sIGZpZWxkLCB2YWwpCWlvd3JpdGUzMih2YWwsIChmbyktPnBjaV92YSArIFwKKwkJb2Zmc2V0b2Yoc3RydWN0IEJFX1BDSUNGRzBfQ1NSTUFQX0FNQVAsIGZpZWxkKS84KQorCisjZGVmaW5lIFBDSUNGRzFfUkVBRChmbywgZmllbGQpCWlvcmVhZDMyKChmbyktPnBjaV92YSArIFwKKwkJb2Zmc2V0b2Yoc3RydWN0IEJFX1BDSUNGRzFfQ1NSTUFQX0FNQVAsIGZpZWxkKS84KQorCisjZGVmaW5lIFBDSUNGRzFfV1JJVEUoZm8sIGZpZWxkLCB2YWwpCWlvd3JpdGUzMih2YWwsIChmbyktPnBjaV92YSArIFwKKwkJb2Zmc2V0b2Yoc3RydWN0IEJFX1BDSUNGRzFfQ1NSTUFQX0FNQVAsIGZpZWxkKS84KQorCisjaWZkZWYgQkVfREVCVUcKKyNkZWZpbmUgQVNTRVJUKGMpICAgICAgIEJVR19PTighKGMpKTsKKyNlbHNlCisjZGVmaW5lIEFTU0VSVChjKQorI2VuZGlmCisKKy8qIGRlYnVnIGxldmVscyAqLworZW51bSBCRV9ERUJVR19MRVZFTFMgeworCURMX0FMV0FZUyA9IDAsCQkvKiBjYW5ub3QgYmUgbWFza2VkICovCisJRExfRVJSID0gMHgxLAkJLyogZXJyb3JzIHRoYXQgc2hvdWxkIG5ldmVyIGhhcHBlbiAqLworCURMX1dBUk4gPSAweDIsCQkvKiBzb21ldGhpbmcgcXVlc3Rpb25hYmxlLgorCQkJCSAgIHJlY292ZXJhYmxlIGVycm9ycyAqLworCURMX05PVEUgPSAweDQsCQkvKiBpbmZyZXF1ZW50LCBpbXBvcnRhbnQgZGVidWcgaW5mbyAqLworCURMX0lORk8gPSAweDgsCQkvKiBkZWJ1ZyBpbmZvcm1hdGlvbiAqLworCURMX1ZFUkJPU0UgPSAweDEwLAkvKiBkZXRhaWxlZCBpbmZvLCBzdWNoIGFzIGJ1ZmZlciB0cmFjZXMgKi8KKwlCRV9ETF9NSU5fVkFMVUUgPSAweDEsCS8qIHRoaXMgaXMgdGhlIG1pbiB2YWx1ZSB1c2VkICovCisJQkVfRExfTUFYX1ZBTFVFID0gMHg4MAkvKiB0aGlzIGlzIHRoZSBoaWdoZXNldCB2YWx1ZSB1c2VkICovCit9IDsKKworZXh0ZXJuIHVuc2lnbmVkIGludCB0cmFjZV9sZXZlbDsKKworI2RlZmluZSBUUkFDRShsbSwgZm10LCBhcmdzLi4uKSAgewkJCQlcCisJCWlmICh0cmFjZV9sZXZlbCAmIGxtKSB7CQkJCVwKKwkJCXByaW50ayhLRVJOX05PVElDRSAiQkU6ICVzOiVkIFxuIiBmbXQsCVwKKwkJCV9fRklMRV9fICwgX19MSU5FX18gLCAjIyBhcmdzKTsJCVwKKwkJfQkJCQkJCVwKKwl9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGJlX3RyYWNlX3NldF9sZXZlbCh1bnNpZ25lZCBpbnQgbGV2ZWwpCit7CisJdW5zaWduZWQgaW50IG9sZF9sZXZlbCA9IHRyYWNlX2xldmVsOworCXRyYWNlX2xldmVsID0gbGV2ZWw7CisJcmV0dXJuIG9sZF9sZXZlbDsKK30KKworI2RlZmluZSBiZV90cmFjZV9nZXRfbGV2ZWwoKSAJdHJhY2VfbGV2ZWwKKy8qCisgKiBSZXR1cm5zIG51bWJlciBvZiBwYWdlcyBzcGFubmVkIGJ5IHRoZSBzaXplIG9mIGRhdGEKKyAqIHN0YXJ0aW5nIGF0IHRoZSBnaXZlbiBhZGRyZXNzLgorICovCisjZGVmaW5lIFBBR0VTX1NQQU5ORUQoX2FkZHJlc3MsIF9zaXplKSBcCisgICAoKHUzMikoKCgoc2l6ZV90KShfYWRkcmVzcykgJiAoUEFHRV9TSVpFIC0gMSkpICsgXAorCQkoX3NpemUpICsgKFBBR0VfU0laRSAtIDEpKSA+PiBQQUdFX1NISUZUKSkKKy8qIEJ5dGUgb2Zmc2V0IGludG8gdGhlIHBhZ2UgY29ycmVzcG9uZGluZyB0byBnaXZlbiBhZGRyZXNzICovCisjZGVmaW5lIE9GRlNFVF9JTl9QQUdFKF9hZGRyXykgKChzaXplX3QpKF9hZGRyXykgJiAoUEFHRV9TSVpFLTEpKQorCisvKgorICogY2lyY3VsYXIgc3VidHJhY3QuCisgKiBSZXR1cm5zIGEgLSBiIGFzc3VtaW5nIGEgY2lyY3VsYXIgbnVtYmVyIHN5c3RlbSwgd2hlcmUgYSBhbmQgYiBhcmUKKyAqIGluIHJhbmdlICgwLCBtYXhWYWx1ZS0xKS4gSWYgYT09YiwgemVybyBpcyByZXR1cm5lZCBzbyB0aGUKKyAqIGhpZ2hlc3QgdmFsdWUgcG9zc2libGUgd2l0aCB0aGlzIHN1YnRyYWN0aW9uIGlzIG1heFZhbHVlLTEuCisgKi8KK3N0YXRpYyBpbmxpbmUgdTMyIGJlX3N1YmModTMyIGEsIHUzMiBiLCB1MzIgbWF4KQoreworCUFTU0VSVChhIDw9IG1heCAmJiBiIDw9IG1heCk7CisJQVNTRVJUKG1heCA+IDApOworCXJldHVybiBhID49IGIgPyAoYSAtIGIpIDogKG1heCAtIGIgKyBhKTsKK30KKworc3RhdGljIGlubGluZSB1MzIgYmVfYWRkYyh1MzIgYSwgdTMyIGIsIHUzMiBtYXgpCit7CisJQVNTRVJUKGEgPCBtYXgpOworCUFTU0VSVChtYXggPiAwKTsKKwlyZXR1cm4gKG1heCAtIGEgPiBiKSA/IChhICsgYikgOiAoYiArIGEgLSBtYXgpOworfQorCisvKiBkZXNjcmlwdG9yIGZvciBhIHBoeXNpY2FsbHkgY29udGlndW91cyBtZW1vcnkgdXNlZCBmb3IgcmluZyAqLworc3RydWN0IHJpbmdfZGVzYyB7CisJdTMyIGxlbmd0aDsJLyogbGVuZ3RoIGluIGJ5dGVzICovCisJdm9pZCAqdmE7IAkvKiB2aXJ0dWFsIGFkZHJlc3MgKi8KKwl1NjQgcGE7CQkvKiBidXMgYWRkcmVzcyAqLworfSA7CisKKy8qCisgKiBUaGlzIHN0cnVjdHVyZSBzdG9yZXMgaW5mb3JtYXRpb24gYWJvdXQgYSByaW5nIHNoYXJlZCBiZXR3ZWVuIGhhcmR3YXJlCisgKiBhbmQgc29mdHdhcmUuICBFYWNoIHJpbmcgaXMgYWxsb2NhdGVkIGJ5IHRoZSBkcml2ZXIgaW4gdGhlIHVuY2FjaGVkCisgKiBleHRlbnNpb24gYW5kIG1hcHBlZCBpbnRvIEJsYWRlRW5naW5lJ3MgdW5pZmllZCB0YWJsZS4KKyAqLworc3RydWN0IG1wX3JpbmcgeworCXUzMiBwYWdlczsJCS8qIHF1ZXVlIHNpemUgaW4gcGFnZXMgKi8KKwl1MzIgaWQ7CQkJLyogcXVldWUgaWQgYXNzaWduZWQgYnkgYmVrbGliICovCisJdTMyIG51bTsJCS8qIG51bWJlciBvZiBlbGVtZW50cyBpbiBxdWV1ZSAqLworCXUzMiBjaWR4OwkJLyogY29uc3VtZXIgaW5kZXggKi8KKwl1MzIgcGlkeDsJCS8qIHByb2R1Y2VyIGluZGV4IC0tIG5vdCB1c2VkIGJ5IG1vc3QgcmluZ3MgKi8KKwl1MzIgaXRlbVNpemU7CQkvKiBzaXplIGluIGJ5dGVzIG9mIG9uZSBvYmplY3QgKi8KKworCXZvaWQgKnZhOwkJLyogVGhlIHZpcnR1YWwgYWRkcmVzcyBvZiB0aGUgcmluZy4KKwkJCQkgICBUaGlzIHNob3VsZCBiZSBsYXN0IHRvIGFsbG93IDMyICYgNjQKKwkJCQkgICBiaXQgZGVidWdnZXIgZXh0ZW5zaW9ucyB0byB3b3JrLiAqLworfSA7CisKKy8qLS0tLS0tLS0tLS0gIGFtYXAgYml0IGZpbGVkIGdldCAvIHNldCBtYWNyb3MgYW5kIGZ1bmN0aW9ucyAtLS0tLSovCisvKgorICogU3RydWN0dXJlcyBkZWZpbmVkIGluIHRoZSBtYXAgaGVhZGVyIGZpbGVzICh1bmRlciBmdy9hbWFwLykgd2l0aCBuYW1lcworICogaW4gdGhlIGZvcm1hdCBCRV88bmFtZT5fQU1BUCBhcmUgcHNldWRvIHN0cnVjdHVyZXMgd2l0aCBtZW1iZXJzCisgKiBvZiB0eXBlIHU4LiBUaGVzZSBzdHJ1Y3R1cmVzIGFyZSB0ZW1wbGF0ZXMgdGhhdCBhcmUgdXNlZCBpbgorICogY29uanVudGlvbiB3aXRoIHRoZSBzdHJ1Y3R1cmVzIHdpdGggbmFtZXMgaW4gdGhlIGZvcm1hdAorICogPG5hbWU+X0FNQVAgdG8gY2FsY3VsYXRlIHRoZSBiaXQgbWFza3MgYW5kIGJpdCBvZmZzZXRzIHRvIGdldCBvciBzZXQKKyAqIGJpdCBmaWVsZHMgaW4gc3RydWN0dXJlcy4gVGhlIHN0cnVjdHVyZXMgPG5hbWU+X0FNQVAgYXJlIGFycmF5cworICogb2YgMzIgYml0cyB3b3JkcyBhbmQgaGF2ZSB0aGUgY29ycmVjdCBzaXplLiAgVGhlIGZvbGxvd2luZyBtYWNyb3MKKyAqIHByb3ZpZGUgY29udmVuaWVudCB3YXlzIHRvIGdldCBhbmQgc2V0IHRoZSB2YXJpb3VzIG1lbWJlcnMKKyAqIGluIHRoZSBzdHJ1Y3R1cmVzIHdpdGhvdXQgdXNpbmcgc3RydWNjdHVyZXMgd2l0aCBiaXQgZmllbGRzLgorICogQWx3YXlzIHVzZSB0aGUgbWFjcm9zIEFNQVBfR0VUX0JJVFNfUFRSIGFuZCBBTUFQX1NFVF9CSVRTX1BUUgorICogbWFjcm9zIHRvIGV4dHJhY3QgYW5kIHNldCB2YXJpb3VzIG1lbWJlcnMuCisgKi8KKworLyoKKyAqIFJldHVybnMgdGhlIGEgYml0IG1hc2sgZm9yIHRoZSByZWdpc3RlciB0aGF0IGlzIE5PVCBzaGlmdGVkIGludG8gbG9jYXRpb24uCisgKiBUaGF0IG1lYW5zIHJldHVybiB2YWx1ZXMgYWx3YXlzIGxvb2sgbGlrZTogMHgxLCAweEZGLCAweDdGRiwgZXRjLi4uCisgKi8KK3N0YXRpYyBpbmxpbmUgdTMyIGFtYXBfbWFzayh1MzIgYml0X3NpemUpCit7CisJcmV0dXJuIGJpdF9zaXplID09IDMyID8gMHhGRkZGRkZGRiA6ICgxIDw8IGJpdF9zaXplKSAtIDE7Cit9CisKKyNkZWZpbmUgQU1BUF9CSVRfTUFTSyhfc3RydWN0XywgZmllbGQpICAgICAgIFwKKwlhbWFwX21hc2soQU1BUF9CSVRfU0laRShfc3RydWN0XywgZmllbGQpKQorCisvKgorICogbm9uLW9wdGltaXplZCBzZXQgYml0cyBmdW5jdGlvbi4gRmlyc3QgY2xlYXJzIHRoZSBiaXRzIGFuZCB0aGVuIGFzc2lnbnMgdGhlbS4KKyAqIFRoaXMgZG9lcyBub3QgcmVxdWlyZSBrbm93bGVkZ2Ugb2YgdGhlIHBhcnRpY3VsYXIgRFdPUkQgeW91IGFyZSBzZXR0aW5nLgorICogZS5nLiBBTUFQX1NFVF9CSVRTX1BUUiAoc3RydWN0LCBmaWVsZDEsICZjb250ZXh0TWVtb3J5LCAxMjMpOworICovCitzdGF0aWMgaW5saW5lIHZvaWQKK2FtYXBfc2V0KHZvaWQgKnB0ciwgdTMyIGR3X29mZnNldCwgdTMyIG1hc2ssIHUzMiBvZmZzZXQsIHUzMiB2YWx1ZSkKK3sKKwl1MzIgKmR3ID0gKHUzMiAqKXB0cjsKKwkqKGR3ICsgZHdfb2Zmc2V0KSAmPSB+KG1hc2sgPDwgb2Zmc2V0KTsKKwkqKGR3ICsgZHdfb2Zmc2V0KSB8PSAobWFzayAmIHZhbHVlKSA8PCBvZmZzZXQ7Cit9CisKKyNkZWZpbmUgQU1BUF9TRVRfQklUU19QVFIoX3N0cnVjdF8sIGZpZWxkLCBfc3RydWN0UHRyXywgdmFsKQlcCisJYW1hcF9zZXQoX3N0cnVjdFB0cl8sIEFNQVBfV09SRF9PRkZTRVQoX3N0cnVjdF8sIGZpZWxkKSxcCisJCUFNQVBfQklUX01BU0soX3N0cnVjdF8sIGZpZWxkKSwJCQlcCisJCUFNQVBfQklUX09GRlNFVChfc3RydWN0XywgZmllbGQpLCB2YWwpCisvKgorICogTm9uLW9wdGltaXplZCByb3V0aW5lIHRoYXQgZ2V0cyB0aGUgYml0cyB3aXRob3V0IGtub3dpbmcgdGhlIGNvcnJlY3QgRFdPUkQuCisgKiBlLmcuIGZpZWxkVmFsdWUgPSBBTUFQX0dFVF9CSVRTX1BUUiAoc3RydWN0LCBmaWVsZDEsICZjb250ZXh0TWVtb3J5KTsKKyAqLworc3RhdGljIGlubGluZSB1MzIKK2FtYXBfZ2V0KHZvaWQgKnB0ciwgdTMyIGR3X29mZnNldCwgdTMyIG1hc2ssIHUzMiBvZmZzZXQpCit7CisJdTMyICpkdyA9ICh1MzIgKilwdHI7CisJcmV0dXJuIG1hc2sgJiAoKihkdyArIGR3X29mZnNldCkgPj4gb2Zmc2V0KTsKK30KKyNkZWZpbmUgQU1BUF9HRVRfQklUU19QVFIoX3N0cnVjdF8sIGZpZWxkLCBfc3RydWN0UHRyXykJCQlcCisJYW1hcF9nZXQoX3N0cnVjdFB0cl8sIEFNQVBfV09SRF9PRkZTRVQoX3N0cnVjdF8sIGZpZWxkKSwJXAorCQlBTUFQX0JJVF9NQVNLKF9zdHJ1Y3RfLCBmaWVsZCksCQkJCVwKKwkJQU1BUF9CSVRfT0ZGU0VUKF9zdHJ1Y3RfLCBmaWVsZCkpCisKKy8qIFJldHVybnMgMC0zMSByZXByZXNlbnRpbmcgYml0IG9mZnNldCB3aXRoaW4gYSBEV09SRCBvZiBhIGJpdGZpZWxkLiAqLworI2RlZmluZSBBTUFQX0JJVF9PRkZTRVQoX3N0cnVjdF8sIGZpZWxkKSAgICAgICAgICAgICAgICAgIFwKKwkob2Zmc2V0b2Yoc3RydWN0IEJFXyAjIyBfc3RydWN0XyAjIyBfQU1BUCwgZmllbGQpICUgMzIpCisKKy8qIFJldHVybnMgMC1uIHJlcHJlc2VudGluZyBEV09SRCBvZmZzZXQgb2YgYml0ZmllbGQgd2l0aGluIHRoZSBzdHJ1Y3R1cmUuICovCisjZGVmaW5lIEFNQVBfV09SRF9PRkZTRVQoX3N0cnVjdF8sIGZpZWxkKSAgXAorCQkgIChvZmZzZXRvZihzdHJ1Y3QgQkVfICMjIF9zdHJ1Y3RfICMjIF9BTUFQLCBmaWVsZCkvMzIpCisKKy8qIFJldHVybnMgc2l6ZSBvZiBiaXRmaWVsZCBpbiBiaXRzLiAqLworI2RlZmluZSBBTUFQX0JJVF9TSVpFKF9zdHJ1Y3RfLCBmaWVsZCkgXAorCQlzaXplb2YoKChzdHJ1Y3QgQkVfICMjIF9zdHJ1Y3RfICMjIF9BTUFQKikwKS0+ZmllbGQpCisKK3N0cnVjdCBiZV9tY2Nfd3JiX3Jlc3BvbnNlX2NvcHkgeworCXUxNiBsZW5ndGg7CQkvKiBieXRlcyBpbiByZXNwb25zZSAqLworCXUxNiBmd2NtZF9vZmZzZXQ7CS8qIG9mZnNldCB3aXRoaW4gdGhlIHdyYiBvZiB0aGUgcmVzcG9uc2UgKi8KKwl2b2lkICp2YTsJCS8qIHVzZXIncyB2YSB0byBjb3B5IHJlc3BvbnNlIGludG8gKi8KKworfSA7Cit0eXBlZGVmIHZvaWQgKCptY2Nfd3JiX2NxZV9jYWxsYmFjaykgKHZvaWQgKmNvbnRleHQsIGludCBzdGF0dXMsCisJCQkJc3RydWN0IE1DQ19XUkJfQU1BUCAqb3B0aW9uYWxfd3JiKTsKK3N0cnVjdCBiZV9tY2Nfd3JiX2NvbnRleHQgeworCisJbWNjX3dyYl9jcWVfY2FsbGJhY2sgaW50ZXJuYWxfY2I7CS8qIEZ1bmN0aW9uIHRvIGNhbGwgb24KKwkJCQkJCWNvbXBsZXRpb24gKi8KKwl2b2lkICppbnRlcm5hbF9jYl9jb250ZXh0OwkvKiBQYXJhbWV0ZXIgdG8gcGFzcworCQkJCQkJICAgdG8gY29tcGxldGlvbiBmdW5jdGlvbiAqLworCisJbWNjX3dyYl9jcWVfY2FsbGJhY2sgY2I7CS8qIEZ1bmN0aW9uIHRvIGNhbGwgb24gY29tcGxldGlvbiAqLworCXZvaWQgKmNiX2NvbnRleHQ7CS8qIFBhcmFtZXRlciB0byBwYXNzIHRvIGNvbXBsZXRpb24gZnVuY3Rpb24gKi8KKworCWludCAqdXNlcnNfZmluYWxfc3RhdHVzOwkvKiBwb2ludGVyIHRvIGEgbG9jYWwKKwkJCQkJCXZhcmlhYmxlIGZvciBzeW5jaHJvbm91cworCQkJCQkJY29tbWFuZHMgKi8KKwlzdHJ1Y3QgTUNDX1dSQl9BTUFQICp3cmI7CS8qIHBvaW50ZXIgdG8gb3JpZ2luYWwgd3JiIGZvciBlbWJlZGRlZAorCQkJCQkJY29tbWFuZHMgb25seSAqLworCXN0cnVjdCBsaXN0X2hlYWQgbmV4dDsJLyogbGlua3MgY29udGV4dCBzdHJ1Y3RzIHRvZ2V0aGVyIGluCisJCQkJICAgZnJlZSBsaXN0ICovCisKKwlzdHJ1Y3QgYmVfbWNjX3dyYl9yZXNwb25zZV9jb3B5IGNvcHk7CS8qIE9wdGlvbmFsIHBhcmFtZXRlcnMgdG8gY29weQorCQkJCQkgICBlbWJlZGRlZCByZXNwb25zZSB0byB1c2VyJ3MgdmEgKi8KKworI2lmIGRlZmluZWQoQkVfREVCVUcpCisJdTE2IHN1YnN5c3RlbSwgb3Bjb2RlOwkvKiBUcmFjayB0aGlzIEZXQ01EIGZvciBkZWJ1ZyBidWlsZHMuICovCisJc3RydWN0IE1DQ19XUkJfQU1BUCAqcmluZ193cmI7CisJdTMyIGNvbnN1bWVkX2NvdW50OworI2VuZGlmCit9IDsKKworLyoKKyAgICBSZXByZXNlbnRzIGEgZnVuY3Rpb24gb2JqZWN0IGZvciBuZXR3b3JrIG9yIHN0b3JhZ2UuICBUaGlzCisgICAgaXMgdXNlZCB0byBtYW5hZ2UgcGVyLWZ1bmN0aW9uIHJlc291cmNlcyBsaWtlIE1DQyBDUXMsIGV0Yy4KKyovCitzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0IHsKKworCXUzMiBtYWdpYzsJCS8qITwgbWFnaWMgZm9yIGRldGVjdGluZyBtZW1vcnkgY29ycnVwdGlvbi4gKi8KKworCS8qIFBDSSBCQVIgbWFwcGVkIGFkZHJlc3NlcyAqLworCXU4IF9faW9tZW0gKmNzcl92YTsJLyogQ1NSICovCisJdTggX19pb21lbSAqZGJfdmE7CS8qIERvb3IgQmVsbCAqLworCXU4IF9faW9tZW0gKnBjaV92YTsJLyogUENJIGNvbmZpZyBzcGFjZSAqLworCXUzMiBlbXVsYXRlOwkJLyogaWYgc2V0LCBNUFUgaXMgbm90IGF2YWlsYWJsZS4KKwkJCQkgIEVtdWxhdGUgZXZlcnl0aGluZy4gICAgICovCisJdTMyIHBlbmRfcXVldWVfZHJpdmluZzsJLyogaWYgc2V0LCBkcml2ZSB0aGUgcXVldWVkIFdSQnMKKwkJCQkgICBhZnRlciByZWxlYXNpbmcgdGhlIFdSQiBsb2NrICovCisKKwlzcGlubG9ja190IHBvc3RfbG9jazsJLyogbG9jayBmb3IgdmVyaWZ5aW5nIG9uZSB0aHJlYWQgcG9zdGluZyB3cmJzICovCisJc3BpbmxvY2tfdCBjcV9sb2NrOwkvKiBsb2NrIGZvciB2ZXJpZnlpbmcgb25lIHRocmVhZAorCQkJCSAgIHByb2Nlc3NpbmcgY3EgKi8KKwlzcGlubG9ja190IG1jY19jb250ZXh0X2xvY2s7CS8qIGxvY2sgZm9yIHByb3RlY3RpbmcgbWNjCisJCQkJCSAgIGNvbnRleHQgZnJlZSBsaXN0ICovCisJdW5zaWduZWQgbG9uZyBwb3N0X2lycTsKKwl1bnNpZ25lZCBsb25nIGNxX2lycTsKKworCXUzMiB0eXBlOworCXUzMiBwY2lfZnVuY3Rpb25fbnVtYmVyOworCisJc3RydWN0IGJlX21jY19vYmplY3QgKm1jYzsJLyogbWNjIHJpbmdzLiAqLworCisJc3RydWN0IHsKKwkJc3RydWN0IE1DQ19NQUlMQk9YX0FNQVAgKnZhOwkvKiBWQSB0byB0aGUgbWFpbGJveCAqLworCQl1NjQgcGE7CS8qIFBBIHRvIHRoZSBtYWlsYm94ICovCisJCXUzMiBsZW5ndGg7CS8qIGJ5dGUgbGVuZ3RoIG9mIG1haWxib3ggKi8KKworCQkvKiBPbmUgZGVmYXVsdCBjb250ZXh0IHN0cnVjdCB1c2VkIGZvciBwb3N0aW5nIGF0CisJCSAqIGxlYXN0IG9uZSBNQ0NfV1JCCisJCSAqLworCQlzdHJ1Y3QgYmVfbWNjX3dyYl9jb250ZXh0IGRlZmF1bHRfY29udGV4dDsKKwkJYm9vbCBkZWZhdWx0X2NvbnRleHRfYWxsb2NhdGVkOworCX0gbWFpbGJveDsKKworCXN0cnVjdCB7CisKKwkJLyogV2FrZSBvbiBsYW5zIGNvbmZpZ3VyZWQuICovCisJCXUzMiB3b2xfYml0bWFzazsJLyogYml0cyAwLDEsMiwzIGFyZSBzZXQgaWYKKwkJCQkJICAgY29ycmVzcG9uZGluZyBpbmRleCBpcyBlbmFibGVkICovCisJfSBjb25maWc7CisKKworCXN0cnVjdCBCRV9GSVJNV0FSRV9DT05GSUcgZndfY29uZmlnOworfSA7CisKKy8qCisgICAgICBSZXByZXNlbnRzIGFuIEV2ZW50IFF1ZXVlCisqLworc3RydWN0IGJlX2VxX29iamVjdCB7CisJdTMyIG1hZ2ljOworCWF0b21pY190IHJlZl9jb3VudDsKKworCXN0cnVjdCBiZV9mdW5jdGlvbl9vYmplY3QgKnBhcmVudF9mdW5jdGlvbjsKKworCXN0cnVjdCBsaXN0X2hlYWQgZXFfbGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGNxX2xpc3RfaGVhZDsKKworCXUzMiBlcV9pZDsKKwl2b2lkICpjYl9jb250ZXh0OworCit9IDsKKworLyoKKyAgICBNYW5hZ2VzIGEgY29tcGxldGlvbiBxdWV1ZQorKi8KK3N0cnVjdCBiZV9jcV9vYmplY3QgeworCXUzMiBtYWdpYzsKKwlhdG9taWNfdCByZWZfY291bnQ7CisKKwlzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwYXJlbnRfZnVuY3Rpb247CisJc3RydWN0IGJlX2VxX29iamVjdCAqZXFfb2JqZWN0OworCisJc3RydWN0IGxpc3RfaGVhZCBjcV9saXN0OworCXN0cnVjdCBsaXN0X2hlYWQgY3FsaXN0X2Zvcl9lcTsKKworCXZvaWQgKnZhOworCXUzMiBudW1fZW50cmllczsKKworCXZvaWQgKmNiX2NvbnRleHQ7CisKKwl1MzIgY3FfaWQ7CisKK30gOworCisvKgorICAgIE1hbmFnZXMgYW4gZXRoZXJuZXQgc2VuZCBxdWV1ZQorKi8KK3N0cnVjdCBiZV9ldGhzcV9vYmplY3QgeworCXUzMiBtYWdpYzsKKworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKworCXN0cnVjdCBiZV9mdW5jdGlvbl9vYmplY3QgKnBhcmVudF9mdW5jdGlvbjsKKwlzdHJ1Y3QgYmVfY3Ffb2JqZWN0ICpjcV9vYmplY3Q7CisJdTMyIGJpZDsKKworfSA7CisKKy8qCitAYnJpZWYKKyAgICBNYW5hZ2VzIGFuIGV0aGVybmV0IHJlY2VpdmUgcXVldWUKKyovCitzdHJ1Y3QgYmVfZXRocnFfb2JqZWN0IHsKKwl1MzIgbWFnaWM7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXN0cnVjdCBiZV9mdW5jdGlvbl9vYmplY3QgKnBhcmVudF9mdW5jdGlvbjsKKwl1MzIgcmlkOworCXN0cnVjdCBiZV9jcV9vYmplY3QgKmNxX29iamVjdDsKKwlzdHJ1Y3QgYmVfY3Ffb2JqZWN0ICpyc3NfY3Ffb2JqZWN0WzRdOworCit9IDsKKworLyoKKyAgICBNYW5hZ2VzIGFuIE1DQworKi8KK3R5cGVkZWYgdm9pZCAoKm1jY19hc3luY19ldmVudF9jYWxsYmFjaykgKHZvaWQgKmNvbnRleHQsIHUzMiBldmVudF9jb2RlLAorCQkJCXZvaWQgKmV2ZW50KTsKK3N0cnVjdCBiZV9tY2Nfb2JqZWN0IHsKKwl1MzIgbWFnaWM7CisKKwlzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwYXJlbnRfZnVuY3Rpb247CisJc3RydWN0IGxpc3RfaGVhZCBtY2NfbGlzdDsKKworCXN0cnVjdCBiZV9jcV9vYmplY3QgKmNxX29iamVjdDsKKworCS8qIEFzeW5jIGV2ZW50IGNhbGxiYWNrIGZvciBNQ0MgQ1EuICovCisJbWNjX2FzeW5jX2V2ZW50X2NhbGxiYWNrIGFzeW5jX2NiOworCXZvaWQgKmFzeW5jX2NvbnRleHQ7CisKKwlzdHJ1Y3QgeworCQlzdHJ1Y3QgYmVfbWNjX3dyYl9jb250ZXh0ICpiYXNlOworCQl1MzIgbnVtOworCQlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3RfaGVhZDsKKwl9IHdyYl9jb250ZXh0OworCisJc3RydWN0IHsKKwkJc3RydWN0IHJpbmdfZGVzYyAqcmQ7CisJCXN0cnVjdCBtcF9yaW5nIHJpbmc7CisJfSBzcTsKKworCXN0cnVjdCB7CisJCXN0cnVjdCBtcF9yaW5nIHJpbmc7CisJfSBjcTsKKworCXUzMiBwcm9jZXNzaW5nOwkJLyogZmxhZyBpbmRpY2F0aW5nIHRoYXQgb25lIHRocmVhZAorCQkJCSAgIGlzIHByb2Nlc3NpbmcgQ1EgKi8KKwl1MzIgcmVhcm07CQkvKiBkb29yYmVsbCByZWFybSBzZXR0aW5nIHRvIG1ha2UKKwkJCQkgICBzdXJlIHRoZSBhY3RpdmUgcHJvY2Vzc2luZyB0aHJlYWQgKi8KKwkvKiByZWFybXMgdGhlIENRIGlmIGFueSBvZiB0aGUgdGhyZWFkcyByZXF1ZXN0ZWQgaXQuICovCisKKwlzdHJ1Y3QgbGlzdF9oZWFkIGJhY2tsb2c7CisJdTMyIGJhY2tsb2dfbGVuZ3RoOworCXUzMiBkcml2aW5nX2JhY2tsb2c7CisJdTMyIGNvbnN1bWVkX2luZGV4OworCit9IDsKKworCisvKiBRdWV1ZSBjb250ZXh0IGhlYWRlciAtLSB0aGUgcmVxdWlyZWQgc29mdHdhcmUgaW5mb3JtYXRpb24gZm9yCisgKiBxdWV1ZWluZyBhIFdSQi4KKyAqLworc3RydWN0IGJlX3F1ZXVlX2RyaXZlcl9jb250ZXh0IHsKKwltY2Nfd3JiX2NxZV9jYWxsYmFjayBpbnRlcm5hbF9jYjsJLyogRnVuY3Rpb24gdG8gY2FsbCBvbgorCQkJCQkJICAgY29tcGxldGlvbiAqLworCXZvaWQgKmludGVybmFsX2NiX2NvbnRleHQ7CS8qIFBhcmFtZXRlciB0byBwYXNzCisJCQkJCQkgICB0byBjb21wbGV0aW9uIGZ1bmN0aW9uICovCisKKwltY2Nfd3JiX2NxZV9jYWxsYmFjayBjYjsJLyogRnVuY3Rpb24gdG8gY2FsbCBvbiBjb21wbGV0aW9uICovCisJdm9pZCAqY2JfY29udGV4dDsJLyogUGFyYW1ldGVyIHRvIHBhc3MgdG8gY29tcGxldGlvbiBmdW5jdGlvbiAqLworCisJc3RydWN0IGJlX21jY193cmJfcmVzcG9uc2VfY29weSBjb3B5OwkvKiBPcHRpb25hbCBwYXJhbWV0ZXJzIHRvIGNvcHkKKwkJCQkJICAgZW1iZWRkZWQgcmVzcG9uc2UgdG8gdXNlcidzIHZhICovCisJdm9pZCAqb3B0aW9uYWxfZndjbWRfdmE7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXUzMiBieXRlczsKK30gOworCisvKgorICogQ29tbW9uIE1DQyBXUkIgaGVhZGVyIHRoYXQgYWxsIGNvbW1hbmRzIHJlcXVpcmUuCisgKi8KK3N0cnVjdCBiZV9tY2Nfd3JiX2hlYWRlciB7CisJdTggcnN2ZFtvZmZzZXRvZihzdHJ1Y3QgQkVfTUNDX1dSQl9BTUFQLCBwYXlsb2FkKS84XTsKK30gOworCisvKgorICogQWxsIG5vbiBlbWJlZGRlZCBjb21tYW5kcyBzdXBwb3J0ZWQgYnkgaHdsaWIgZnVuY3Rpb25zIG9ubHkgYWxsb3cKKyAqIDEgU0dFLiAgVGhpcyBxdWV1ZSBjb250ZXh0IGhhbmRsZXMgdGhlbSBhbGwuCisgKi8KK3N0cnVjdCBiZV9ub25lbWJlZGRlZF9xX2N0eHQgeworCXN0cnVjdCBiZV9xdWV1ZV9kcml2ZXJfY29udGV4dCBjb250ZXh0OworCXN0cnVjdCBiZV9tY2Nfd3JiX2hlYWRlciB3cmJfaGVhZGVyOworCXN0cnVjdCBNQ0NfU0dFX0FNQVAgc2dlWzFdOworfSA7CisKKy8qCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICBUaGlzIHNlY3Rpb24gY29udGFpbnMgdGhlIHNwZWNpZmljIHF1ZXVlIHN0cnVjdCBmb3IgZWFjaCBjb21tYW5kLgorICogIFRoZSB1c2VyIGNvdWxkIGFsd2F5cyBwcm92aWRlIGEgYmVfZ2VuZXJpY19xX2N0eHQgYnV0IHRoaXMgaXMgYQorICogIHJhdGhlciBsYXJnZSBzdHJ1Y3QuICBCeSB1c2luZyB0aGUgc3BlY2lmaWMgc3RydWN0LCBtZW1vcnkgY29uc3VtcHRpb24KKyAqICBjYW4gYmUgcmVkdWNlZC4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKK3N0cnVjdCBiZV9saW5rX3N0YXR1c19xX2N0eHQgeworCXN0cnVjdCBiZV9xdWV1ZV9kcml2ZXJfY29udGV4dCBjb250ZXh0OworCXN0cnVjdCBiZV9tY2Nfd3JiX2hlYWRlciB3cmJfaGVhZGVyOworCXN0cnVjdCBGV0NNRF9DT01NT05fTlRXS19MSU5LX1NUQVRVU19RVUVSWSBmd2NtZDsKK30gOworCitzdHJ1Y3QgYmVfbXVsdGljYXN0X3FfY3R4dCB7CisJc3RydWN0IGJlX3F1ZXVlX2RyaXZlcl9jb250ZXh0IGNvbnRleHQ7CisJc3RydWN0IGJlX21jY193cmJfaGVhZGVyIHdyYl9oZWFkZXI7CisJc3RydWN0IEZXQ01EX0NPTU1PTl9OVFdLX01VTFRJQ0FTVF9TRVQgZndjbWQ7Cit9IDsKKworCitzdHJ1Y3QgYmVfdmxhbl9xX2N0eHQgeworCXN0cnVjdCBiZV9xdWV1ZV9kcml2ZXJfY29udGV4dCBjb250ZXh0OworCXN0cnVjdCBiZV9tY2Nfd3JiX2hlYWRlciB3cmJfaGVhZGVyOworCXN0cnVjdCBGV0NNRF9DT01NT05fTlRXS19WTEFOX0NPTkZJRyBmd2NtZDsKK30gOworCitzdHJ1Y3QgYmVfcHJvbWlzY3VvdXNfcV9jdHh0IHsKKwlzdHJ1Y3QgYmVfcXVldWVfZHJpdmVyX2NvbnRleHQgY29udGV4dDsKKwlzdHJ1Y3QgYmVfbWNjX3dyYl9oZWFkZXIgd3JiX2hlYWRlcjsKKwlzdHJ1Y3QgRldDTURfRVRIX1BST01JU0NVT1VTIGZ3Y21kOworfSA7CisKK3N0cnVjdCBiZV9mb3JjZV9mYWlsb3Zlcl9xX2N0eHQgeworCXN0cnVjdCBiZV9xdWV1ZV9kcml2ZXJfY29udGV4dCBjb250ZXh0OworCXN0cnVjdCBiZV9tY2Nfd3JiX2hlYWRlciB3cmJfaGVhZGVyOworCXN0cnVjdCBGV0NNRF9DT01NT05fRk9SQ0VfRkFJTE9WRVIgZndjbWQ7Cit9IDsKKworCitzdHJ1Y3QgYmVfcnhmX2ZpbHRlcl9xX2N0eHQgeworCXN0cnVjdCBiZV9xdWV1ZV9kcml2ZXJfY29udGV4dCBjb250ZXh0OworCXN0cnVjdCBiZV9tY2Nfd3JiX2hlYWRlciB3cmJfaGVhZGVyOworCXN0cnVjdCBGV0NNRF9DT01NT05fTlRXS19SWF9GSUxURVIgZndjbWQ7Cit9IDsKKworc3RydWN0IGJlX2VxX21vZGlmeV9kZWxheV9xX2N0eHQgeworCXN0cnVjdCBiZV9xdWV1ZV9kcml2ZXJfY29udGV4dCBjb250ZXh0OworCXN0cnVjdCBiZV9tY2Nfd3JiX2hlYWRlciB3cmJfaGVhZGVyOworCXN0cnVjdCBGV0NNRF9DT01NT05fTU9ESUZZX0VRX0RFTEFZIGZ3Y21kOworfSA7CisKKy8qCisgKiBUaGUgZ2VuZXJpYyBjb250ZXh0IGlzIHRoZSBsYXJnZXN0IHNpemUgdGhhdCB3b3VsZCBiZSByZXF1aXJlZC4KKyAqIEl0IGlzIHRoZSBzb2Z0d2FyZSBjb250ZXh0IHBsdXMgYW4gZW50aXJlIFdSQi4KKyAqLworc3RydWN0IGJlX2dlbmVyaWNfcV9jdHh0IHsKKwlzdHJ1Y3QgYmVfcXVldWVfZHJpdmVyX2NvbnRleHQgY29udGV4dDsKKwlzdHJ1Y3QgYmVfbWNjX3dyYl9oZWFkZXIgd3JiX2hlYWRlcjsKKwlzdHJ1Y3QgTUNDX1dSQl9QQVlMT0FEX0FNQVAgcGF5bG9hZDsKK30gOworCisvKgorICogVHlwZXMgZm9yIHRoZSBCRV9RVUVVRV9DT05URVhUIG9iamVjdC4KKyAqLworI2RlZmluZSBCRV9RVUVVRV9JTlZBTElECSgwKQorI2RlZmluZSBCRV9RVUVVRV9MSU5LX1NUQVRVUwkoMHhBMDA2KQorI2RlZmluZSBCRV9RVUVVRV9FVEhfU1RBVFMJKDB4QTAwNykKKyNkZWZpbmUgQkVfUVVFVUVfVFBNX1NUQVRTCSgweEEwMDgpCisjZGVmaW5lIEJFX1FVRVVFX1RDUF9TVEFUUwkoMHhBMDA5KQorI2RlZmluZSBCRV9RVUVVRV9NVUxUSUNBU1QJKDB4QTAwQSkKKyNkZWZpbmUgQkVfUVVFVUVfVkxBTgkJKDB4QTAwQikKKyNkZWZpbmUgQkVfUVVFVUVfUlNTCQkoMHhBMDBDKQorI2RlZmluZSBCRV9RVUVVRV9GT1JDRV9GQUlMT1ZFUgkoMHhBMDBEKQorI2RlZmluZSBCRV9RVUVVRV9QUk9NSVNDVU9VUwkoMHhBMDBFKQorI2RlZmluZSBCRV9RVUVVRV9XQUtFX09OX0xBTgkoMHhBMDBGKQorI2RlZmluZSBCRV9RVUVVRV9OT1AJCSgweEEwMTApCisKKy8qIC0tLSBCRV9GVU5DVElPTl9FTlVNIC0tLSAqLworI2RlZmluZSBCRV9GVU5DVElPTl9UWVBFX0lTQ1NJICAgICAgICAgICgwKQorI2RlZmluZSBCRV9GVU5DVElPTl9UWVBFX05FVFdPUksgICAgICAgICgxKQorI2RlZmluZSBCRV9GVU5DVElPTl9UWVBFX0FSTSAgICAgICAgICAgICgyKQorCisvKiAtLS0gQkVfRVRIX1RYX1JJTkdfVFlQRV9FTlVNIC0tLSAqLworI2RlZmluZSBCRV9FVEhfVFhfUklOR19UWVBFX0ZPUldBUkRJTkcgICgxKSAJLyogRXRoZXIgcmluZyBmb3IgZm9yd2FyZGluZyAqLworI2RlZmluZSBCRV9FVEhfVFhfUklOR19UWVBFX1NUQU5EQVJEICAgICgyKQkvKiBFdGhlciByaW5nIGZvciBzZW5kaW5nICovCisJCQkJCQkvKiBuZXR3b3JrIHBhY2tldHMuICovCisjZGVmaW5lIEJFX0VUSF9UWF9SSU5HX1RZUEVfQk9VTkQgICAgICAgKDMpCS8qIEV0aGVybmV0IHJpbmcgZm9yIHNlbmRpbmcgKi8KKwkJCQkJCS8qIG5ldHdvcmsgcGFja2V0cywgYm91bmQgKi8KKwkJCQkJCS8qIHRvIGEgcGh5c2ljYWwgcG9ydC4gKi8KKy8qCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgIEFQSSBNQUNST1MKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworI2RlZmluZSBCRV9GV0NNRF9OQU1FKF9zaG9ydF9uYW1lXykgICAgIHN0cnVjdCBGV0NNRF8jI19zaG9ydF9uYW1lXworI2RlZmluZSBCRV9PUENPREVfTkFNRShfc2hvcnRfbmFtZV8pICAgIE9QQ09ERV8jI19zaG9ydF9uYW1lXworI2RlZmluZSBCRV9TVUJTWVNURU1fTkFNRShfc2hvcnRfbmFtZV8pIFNVQlNZU1RFTV8jI19zaG9ydF9uYW1lXworCisKKyNkZWZpbmUgQkVfUFJFUEFSRV9FTUJFRERFRF9GV0NNRChfcGZvYl8sIF93cmJfLCBfc2hvcnRfbmFtZV8pCVwKKwkoKEJFX0ZXQ01EX05BTUUoX3Nob3J0X25hbWVfKSAqKQkJCQlcCisJYmVfZnVuY3Rpb25fcHJlcGFyZV9lbWJlZGRlZF9md2NtZChfcGZvYl8sIF93cmJfLAlcCisJCXNpemVvZihCRV9GV0NNRF9OQU1FKF9zaG9ydF9uYW1lXykpLAkJXAorCQlGSUVMRF9TSVpFT0YoQkVfRldDTURfTkFNRShfc2hvcnRfbmFtZV8pLCBwYXJhbXMucmVxdWVzdCksIFwKKwkJRklFTERfU0laRU9GKEJFX0ZXQ01EX05BTUUoX3Nob3J0X25hbWVfKSwgcGFyYW1zLnJlc3BvbnNlKSwgXAorCQlCRV9PUENPREVfTkFNRShfc2hvcnRfbmFtZV8pLAkJCQlcCisJCUJFX1NVQlNZU1RFTV9OQU1FKF9zaG9ydF9uYW1lXykpKTsKKworI2RlZmluZSBCRV9QUkVQQVJFX05PTkVNQkVEREVEX0ZXQ01EKF9wZm9iXywgX3dyYl8sIF9pdmFfLCBfaXBhXywgX3Nob3J0X25hbWVfKVwKKwkoKEJFX0ZXQ01EX05BTUUoX3Nob3J0X25hbWVfKSAqKQkJCQlcCisJYmVfZnVuY3Rpb25fcHJlcGFyZV9ub25lbWJlZGRlZF9md2NtZChfcGZvYl8sIF93cmJfLCAoX2l2YV8pLCAoX2lwYV8pLCBcCisJCXNpemVvZihCRV9GV0NNRF9OQU1FKF9zaG9ydF9uYW1lXykpLAkJXAorCQlGSUVMRF9TSVpFT0YoQkVfRldDTURfTkFNRShfc2hvcnRfbmFtZV8pLCBwYXJhbXMucmVxdWVzdCksIFwKKwkJRklFTERfU0laRU9GKEJFX0ZXQ01EX05BTUUoX3Nob3J0X25hbWVfKSwgcGFyYW1zLnJlc3BvbnNlKSwgXAorCQlCRV9PUENPREVfTkFNRShfc2hvcnRfbmFtZV8pLAkJCQlcCisJCUJFX1NVQlNZU1RFTV9OQU1FKF9zaG9ydF9uYW1lXykpKTsKKworaW50IGJlX2Z1bmN0aW9uX29iamVjdF9jcmVhdGUodTggX19pb21lbSAqY3NyX3ZhLCB1OCBfX2lvbWVtICpkYl92YSwKKwl1OCBfX2lvbWVtICpwY2lfdmEsIHUzMiBmdW5jdGlvbl90eXBlLCBzdHJ1Y3QgcmluZ19kZXNjICptYWlsYm94X3JkLAorCSAgc3RydWN0IGJlX2Z1bmN0aW9uX29iamVjdCAqcGZvYik7CisKK2ludCBiZV9mdW5jdGlvbl9vYmplY3RfZGVzdHJveShzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwZm9iKTsKK2ludCBiZV9mdW5jdGlvbl9jbGVhbnVwKHN0cnVjdCBiZV9mdW5jdGlvbl9vYmplY3QgKnBmb2IpOworCisKK2ludCBiZV9mdW5jdGlvbl9nZXRfZndfdmVyc2lvbihzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwZm9iLAorCXN0cnVjdCBGV0NNRF9DT01NT05fR0VUX0ZXX1ZFUlNJT05fUkVTUE9OU0VfUEFZTE9BRCAqZndfdmVyc2lvbiwKKwltY2Nfd3JiX2NxZV9jYWxsYmFjayBjYiwgdm9pZCAqY2JfY29udGV4dCk7CisKKworaW50IGJlX2VxX21vZGlmeV9kZWxheShzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwZm9iLAorCQkgICB1MzIgbnVtX2VxLCBzdHJ1Y3QgYmVfZXFfb2JqZWN0ICoqZXFfYXJyYXksCisJCSAgIHUzMiAqZXFfZGVsYXlfYXJyYXksIG1jY193cmJfY3FlX2NhbGxiYWNrIGNiLAorCQkgICB2b2lkICpjYl9jb250ZXh0LAorCQkgICBzdHJ1Y3QgYmVfZXFfbW9kaWZ5X2RlbGF5X3FfY3R4dCAqcV9jdHh0KTsKKworCisKK2ludCBiZV9lcV9jcmVhdGUoc3RydWN0IGJlX2Z1bmN0aW9uX29iamVjdCAqcGZvYiwKKwkgICAgIHN0cnVjdCByaW5nX2Rlc2MgKnJkLCB1MzIgZXFlX3NpemUsIHUzMiBudW1fZW50cmllcywKKwkgICAgIHUzMiB3YXRlcm1hcmssIHUzMiB0aW1lcl9kZWxheSwgc3RydWN0IGJlX2VxX29iamVjdCAqZXFfb2JqZWN0KTsKKworaW50IGJlX2VxX2Rlc3Ryb3koc3RydWN0IGJlX2VxX29iamVjdCAqZXEpOworCitpbnQgYmVfY3FfY3JlYXRlKHN0cnVjdCBiZV9mdW5jdGlvbl9vYmplY3QgKnBmb2IsCisJc3RydWN0IHJpbmdfZGVzYyAqcmQsIHUzMiBsZW5ndGgsCisJYm9vbCBzb2xpY2l0ZWRfZXZlbnRhYmxlLCBib29sIG5vX2RlbGF5LAorCXUzMiB3bV90aHJlc2gsIHN0cnVjdCBiZV9lcV9vYmplY3QgKmVxX29iamVjdCwKKwlzdHJ1Y3QgYmVfY3Ffb2JqZWN0ICpjcV9vYmplY3QpOworCitpbnQgYmVfY3FfZGVzdHJveShzdHJ1Y3QgYmVfY3Ffb2JqZWN0ICpjcSk7CisKK2ludCBiZV9tY2NfcmluZ19jcmVhdGUoc3RydWN0IGJlX2Z1bmN0aW9uX29iamVjdCAqcGZvYiwKKwkJICAgc3RydWN0IHJpbmdfZGVzYyAqcmQsIHUzMiBsZW5ndGgsCisJCSAgIHN0cnVjdCBiZV9tY2Nfd3JiX2NvbnRleHQgKmNvbnRleHRfYXJyYXksCisJCSAgIHUzMiBudW1fY29udGV4dF9lbnRyaWVzLAorCQkgICBzdHJ1Y3QgYmVfY3Ffb2JqZWN0ICpjcSwgc3RydWN0IGJlX21jY19vYmplY3QgKm1jYyk7CitpbnQgYmVfbWNjX3JpbmdfZGVzdHJveShzdHJ1Y3QgYmVfbWNjX29iamVjdCAqbWNjX29iamVjdCk7CisKK2ludCBiZV9tY2NfcHJvY2Vzc19jcShzdHJ1Y3QgYmVfbWNjX29iamVjdCAqbWNjX29iamVjdCwgYm9vbCByZWFybSk7CisKK2ludCBiZV9tY2NfYWRkX2FzeW5jX2V2ZW50X2NhbGxiYWNrKHN0cnVjdCBiZV9tY2Nfb2JqZWN0ICptY2Nfb2JqZWN0LAorCQltY2NfYXN5bmNfZXZlbnRfY2FsbGJhY2sgY2IsIHZvaWQgKmNiX2NvbnRleHQpOworCitpbnQgYmVfcGNpX3NvZnRfcmVzZXQoc3RydWN0IGJlX2Z1bmN0aW9uX29iamVjdCAqcGZvYik7CisKKworaW50IGJlX2RyaXZlX1BPU1Qoc3RydWN0IGJlX2Z1bmN0aW9uX29iamVjdCAqcGZvYik7CisKKworaW50IGJlX2V0aF9zcV9jcmVhdGUoc3RydWN0IGJlX2Z1bmN0aW9uX29iamVjdCAqcGZvYiwKKwkJc3RydWN0IHJpbmdfZGVzYyAqcmQsIHUzMiBsZW5ndGhfaW5fYnl0ZXMsCisJCXUzMiB0eXBlLCB1MzIgdWxwLCBzdHJ1Y3QgYmVfY3Ffb2JqZWN0ICpjcV9vYmplY3QsCisJCXN0cnVjdCBiZV9ldGhzcV9vYmplY3QgKmV0aF9zcSk7CisKK3N0cnVjdCBiZV9ldGhfc3FfcGFyYW1ldGVycyB7CisJdTMyIHBvcnQ7CisJdTMyIHJzdmQwWzJdOworfSA7CisKK2ludCBiZV9ldGhfc3FfY3JlYXRlX2V4KHN0cnVjdCBiZV9mdW5jdGlvbl9vYmplY3QgKnBmb2IsCisJCSAgICBzdHJ1Y3QgcmluZ19kZXNjICpyZCwgdTMyIGxlbmd0aF9pbl9ieXRlcywKKwkJICAgIHUzMiB0eXBlLCB1MzIgdWxwLCBzdHJ1Y3QgYmVfY3Ffb2JqZWN0ICpjcV9vYmplY3QsCisJCSAgICBzdHJ1Y3QgYmVfZXRoX3NxX3BhcmFtZXRlcnMgKmV4X3BhcmFtZXRlcnMsCisJCSAgICBzdHJ1Y3QgYmVfZXRoc3Ffb2JqZWN0ICpldGhfc3EpOworaW50IGJlX2V0aF9zcV9kZXN0cm95KHN0cnVjdCBiZV9ldGhzcV9vYmplY3QgKmV0aF9zcSk7CisKK2ludCBiZV9ldGhfc2V0X2Zsb3dfY29udHJvbChzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwZm9iLAorCQkJYm9vbCB0eGZjX2VuYWJsZSwgYm9vbCByeGZjX2VuYWJsZSk7CisKK2ludCBiZV9ldGhfZ2V0X2Zsb3dfY29udHJvbChzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwZm9iLAorCQkJYm9vbCAqdHhmY19lbmFibGUsIGJvb2wgKnJ4ZmNfZW5hYmxlKTsKK2ludCBiZV9ldGhfc2V0X3FvcyhzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwZm9iLCB1MzIgbWF4X2JwcywgdTMyIG1heF9wcHMpOworCitpbnQgYmVfZXRoX2dldF9xb3Moc3RydWN0IGJlX2Z1bmN0aW9uX29iamVjdCAqcGZvYiwgdTMyICptYXhfYnBzLCB1MzIgKm1heF9wcHMpOworCitpbnQgYmVfZXRoX3NldF9mcmFtZV9zaXplKHN0cnVjdCBiZV9mdW5jdGlvbl9vYmplY3QgKnBmb2IsCisJCSAgICAgIHUzMiAqdHhfZnJhbWVfc2l6ZSwgdTMyICpyeF9mcmFtZV9zaXplKTsKKworaW50IGJlX2V0aF9ycV9jcmVhdGUoc3RydWN0IGJlX2Z1bmN0aW9uX29iamVjdCAqcGZvYiwKKwkJIHN0cnVjdCByaW5nX2Rlc2MgKnJkLCBzdHJ1Y3QgYmVfY3Ffb2JqZWN0ICpjcV9vYmplY3QsCisJCSBzdHJ1Y3QgYmVfY3Ffb2JqZWN0ICpiY21jX2NxX29iamVjdCwKKwkJIHN0cnVjdCBiZV9ldGhycV9vYmplY3QgKmV0aF9ycSk7CisKK2ludCBiZV9ldGhfcnFfZGVzdHJveShzdHJ1Y3QgYmVfZXRocnFfb2JqZWN0ICpldGhfcnEpOworCitpbnQgYmVfZXRoX3JxX2Rlc3Ryb3lfb3B0aW9ucyhzdHJ1Y3QgYmVfZXRocnFfb2JqZWN0ICpldGhfcnEsIGJvb2wgZmx1c2gsCisJCW1jY193cmJfY3FlX2NhbGxiYWNrIGNiLCB2b2lkICpjYl9jb250ZXh0KTsKK2ludCBiZV9ldGhfcnFfc2V0X2ZyYWdfc2l6ZShzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwZm9iLAorCQl1MzIgbmV3X2ZyYWdfc2l6ZV9ieXRlcywgdTMyICphY3R1YWxfZnJhZ19zaXplX2J5dGVzKTsKK2ludCBiZV9ldGhfcnFfZ2V0X2ZyYWdfc2l6ZShzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwZm9iLAorCQkJCQkJdTMyICpmcmFnX3NpemVfYnl0ZXMpOworCit2b2lkICpiZV9mdW5jdGlvbl9wcmVwYXJlX2VtYmVkZGVkX2Z3Y21kKHN0cnVjdCBiZV9mdW5jdGlvbl9vYmplY3QgKnBmb2IsCisJCSAgIHN0cnVjdCBNQ0NfV1JCX0FNQVAgKndyYiwKKwkJICAgdTMyIHBheWxvYWRfbGVuZ3RoLCB1MzIgcmVxdWVzdF9sZW5ndGgsCisJCSAgIHUzMiByZXNwb25zZV9sZW5ndGgsIHUzMiBvcGNvZGUsIHUzMiBzdWJzeXN0ZW0pOwordm9pZCAqYmVfZnVuY3Rpb25fcHJlcGFyZV9ub25lbWJlZGRlZF9md2NtZChzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwZm9iLAorCXN0cnVjdCBNQ0NfV1JCX0FNQVAgKndyYiwgdm9pZCAqZndjbWRfaGVhZGVyX3ZhLCB1NjQgZndjbWRfaGVhZGVyX3BhLAorCXUzMiBwYXlsb2FkX2xlbmd0aCwgdTMyIHJlcXVlc3RfbGVuZ3RoLCB1MzIgcmVzcG9uc2VfbGVuZ3RoLAorCXUzMiBvcGNvZGUsIHUzMiBzdWJzeXN0ZW0pOworCisKK3N0cnVjdCBNQ0NfV1JCX0FNQVAgKgorYmVfZnVuY3Rpb25fcGVla19tY2Nfd3JiKHN0cnVjdCBiZV9mdW5jdGlvbl9vYmplY3QgKnBmb2IpOworCitpbnQgYmVfcnhmX21hY19hZGRyZXNzX3JlYWRfd3JpdGUoc3RydWN0IGJlX2Z1bmN0aW9uX29iamVjdCAqcGZvYiwKKwkgICAgICBib29sIHBvcnQxLCBib29sIG1hYzEsIGJvb2wgbWdtdCwKKwkgICAgICBib29sIHdyaXRlLCBib29sIHBlcm1hbmVudCwgdTggKm1hY19hZGRyZXNzLAorCSAgICAgIG1jY193cmJfY3FlX2NhbGxiYWNrIGNiLAorCSAgICAgIHZvaWQgKmNiX2NvbnRleHQpOworCitpbnQgYmVfcnhmX211bHRpY2FzdF9jb25maWcoc3RydWN0IGJlX2Z1bmN0aW9uX29iamVjdCAqcGZvYiwKKwkJCWJvb2wgcHJvbWlzY3VvdXMsIHUzMiBudW0sIHU4ICptYWNfdGFibGUsCisJCQltY2Nfd3JiX2NxZV9jYWxsYmFjayBjYiwKKwkJCXZvaWQgKmNiX2NvbnRleHQsCisJCQlzdHJ1Y3QgYmVfbXVsdGljYXN0X3FfY3R4dCAqcV9jdHh0KTsKKworaW50IGJlX3J4Zl92bGFuX2NvbmZpZyhzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwZm9iLAorCSAgIGJvb2wgcHJvbWlzY3VvdXMsIHUzMiBudW0sIHUxNiAqdmxhbl90YWdfYXJyYXksCisJICAgbWNjX3dyYl9jcWVfY2FsbGJhY2sgY2IsIHZvaWQgKmNiX2NvbnRleHQsCisJICAgc3RydWN0IGJlX3ZsYW5fcV9jdHh0ICpxX2N0eHQpOworCisKK2ludCBiZV9yeGZfbGlua19zdGF0dXMoc3RydWN0IGJlX2Z1bmN0aW9uX29iamVjdCAqcGZvYiwKKwkJICAgc3RydWN0IEJFX0xJTktfU1RBVFVTICpsaW5rX3N0YXR1cywKKwkJICAgbWNjX3dyYl9jcWVfY2FsbGJhY2sgY2IsCisJCSAgIHZvaWQgKmNiX2NvbnRleHQsCisJCSAgIHN0cnVjdCBiZV9saW5rX3N0YXR1c19xX2N0eHQgKnFfY3R4dCk7CisKKworaW50IGJlX3J4Zl9xdWVyeV9ldGhfc3RhdGlzdGljcyhzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwZm9iLAorCQlzdHJ1Y3QgRldDTURfRVRIX0dFVF9TVEFUSVNUSUNTICp2YV9mb3JfZndjbWQsCisJCXU2NCBwYV9mb3JfZndjbWQsIG1jY193cmJfY3FlX2NhbGxiYWNrIGNiLAorCQl2b2lkICpjYl9jb250ZXh0LAorCQlzdHJ1Y3QgYmVfbm9uZW1iZWRkZWRfcV9jdHh0ICpxX2N0eHQpOworCitpbnQgYmVfcnhmX3Byb21pc2N1b3VzKHN0cnVjdCBiZV9mdW5jdGlvbl9vYmplY3QgKnBmb2IsCisJCSAgIGJvb2wgZW5hYmxlX3BvcnQwLCBib29sIGVuYWJsZV9wb3J0MSwKKwkJICAgbWNjX3dyYl9jcWVfY2FsbGJhY2sgY2IsIHZvaWQgKmNiX2NvbnRleHQsCisJCSAgIHN0cnVjdCBiZV9wcm9taXNjdW91c19xX2N0eHQgKnFfY3R4dCk7CisKKworaW50IGJlX3J4Zl9maWx0ZXJfY29uZmlnKHN0cnVjdCBiZV9mdW5jdGlvbl9vYmplY3QgKnBmb2IsCisJCSAgICAgc3RydWN0IE5UV0tfUlhfRklMVEVSX1NFVFRJTkdTICpzZXR0aW5ncywKKwkJICAgICBtY2Nfd3JiX2NxZV9jYWxsYmFjayBjYiwKKwkJICAgICB2b2lkICpjYl9jb250ZXh0LAorCQkgICAgIHN0cnVjdCBiZV9yeGZfZmlsdGVyX3FfY3R4dCAqcV9jdHh0KTsKKworLyoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogIGludGVybmFsIGZ1bmN0aW9ucyB1c2VkIGJ5IGh3bGliCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisKK2ludCBiZV9mdW5jdGlvbl9yaW5nX2Rlc3Ryb3koc3RydWN0IGJlX2Z1bmN0aW9uX29iamVjdCAqcGZvYiwKKwkJICAgICAgIHUzMiBpZCwgdTMyIHJpbmdfdHlwZSwgbWNjX3dyYl9jcWVfY2FsbGJhY2sgY2IsCisJCSAgICAgICB2b2lkICpjYl9jb250ZXh0LAorCQkgICAgICAgbWNjX3dyYl9jcWVfY2FsbGJhY2sgaW50ZXJuYWxfY2IsCisJCSAgICAgICB2b2lkICppbnRlcm5hbF9jYWxsYmFja19jb250ZXh0KTsKKworaW50IGJlX2Z1bmN0aW9uX3Bvc3RfbWNjX3dyYihzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwZm9iLAorCQlzdHJ1Y3QgTUNDX1dSQl9BTUFQICp3cmIsCisJCXN0cnVjdCBiZV9nZW5lcmljX3FfY3R4dCAqcV9jdHh0LAorCQltY2Nfd3JiX2NxZV9jYWxsYmFjayBjYiwgdm9pZCAqY2JfY29udGV4dCwKKwkJbWNjX3dyYl9jcWVfY2FsbGJhY2sgaW50ZXJuYWxfY2IsCisJCXZvaWQgKmludGVybmFsX2NiX2NvbnRleHQsIHZvaWQgKm9wdGlvbmFsX2Z3Y21kX3ZhLAorCQlzdHJ1Y3QgYmVfbWNjX3dyYl9yZXNwb25zZV9jb3B5ICpyZXNwb25zZV9jb3B5KTsKKworaW50IGJlX2Z1bmN0aW9uX3F1ZXVlX21jY193cmIoc3RydWN0IGJlX2Z1bmN0aW9uX29iamVjdCAqcGZvYiwKKwkJCSAgc3RydWN0IGJlX2dlbmVyaWNfcV9jdHh0ICpxX2N0eHQpOworCisvKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgTUNDIFFVRVVFCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCitpbnQgYmVfbXB1X2luaXRfbWFpbGJveChzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwZm9iLCBzdHJ1Y3QgcmluZ19kZXNjICpyZCk7CisKKworc3RydWN0IE1DQ19XUkJfQU1BUCAqCitfYmVfbXB1X3BlZWtfcmluZ193cmIoc3RydWN0IGJlX21jY19vYmplY3QgKm1jYywgYm9vbCBkcml2aW5nX3F1ZXVlKTsKKworc3RydWN0IGJlX21jY193cmJfY29udGV4dCAqCitfYmVfbWNjX2FsbG9jYXRlX3dyYl9jb250ZXh0KHN0cnVjdCBiZV9mdW5jdGlvbl9vYmplY3QgKnBmb2IpOworCit2b2lkIF9iZV9tY2NfZnJlZV93cmJfY29udGV4dChzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwZm9iLAorCQkJIHN0cnVjdCBiZV9tY2Nfd3JiX2NvbnRleHQgKmNvbnRleHQpOworCitpbnQgX2JlX21wdV9wb3N0X3dyYl9tYWlsYm94KHN0cnVjdCBiZV9mdW5jdGlvbl9vYmplY3QgKnBmb2IsCisJIHN0cnVjdCBNQ0NfV1JCX0FNQVAgKndyYiwgc3RydWN0IGJlX21jY193cmJfY29udGV4dCAqd3JiX2NvbnRleHQpOworCitpbnQgX2JlX21wdV9wb3N0X3dyYl9yaW5nKHN0cnVjdCBiZV9tY2Nfb2JqZWN0ICptY2MsCisJc3RydWN0IE1DQ19XUkJfQU1BUCAqd3JiLCBzdHJ1Y3QgYmVfbWNjX3dyYl9jb250ZXh0ICp3cmJfY29udGV4dCk7CisKK3ZvaWQgYmVfZHJpdmVfbWNjX3dyYl9xdWV1ZShzdHJ1Y3QgYmVfbWNjX29iamVjdCAqbWNjKTsKKworCisvKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgUmluZyBTaXplcworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK3N0YXRpYyBpbmxpbmUgdTMyIGJlX3JpbmdfZW5jb2RpbmdfdG9fbGVuZ3RoKHUzMiBlbmNvZGluZywgdTMyIG9iamVjdF9zaXplKQoreworCisJQVNTRVJUKGVuY29kaW5nICE9IDEpOwkvKiAxIGlzIHJzdmQgKi8KKwlBU1NFUlQoZW5jb2RpbmcgPCAxNik7CisJQVNTRVJUKG9iamVjdF9zaXplID4gMCk7CisKKwlpZiAoZW5jb2RpbmcgPT0gMCkJLyogMzJrIGRlZXAgKi8KKwkJZW5jb2RpbmcgPSAxNjsKKworCXJldHVybiAoMSA8PCAoZW5jb2RpbmcgLSAxKSkgKiBvYmplY3Rfc2l6ZTsKK30KKworc3RhdGljIGlubGluZQordTMyIGJlX3JpbmdfbGVuZ3RoX3RvX2VuY29kaW5nKHUzMiBsZW5ndGhfaW5fYnl0ZXMsIHUzMiBvYmplY3Rfc2l6ZSkKK3sKKworCXUzMiBjb3VudCwgZW5jb2Rpbmc7CisKKwlBU1NFUlQob2JqZWN0X3NpemUgPiAwKTsKKwlBU1NFUlQobGVuZ3RoX2luX2J5dGVzICUgb2JqZWN0X3NpemUgPT0gMCk7CisKKwljb3VudCA9IGxlbmd0aF9pbl9ieXRlcyAvIG9iamVjdF9zaXplOworCisJQVNTRVJUKGNvdW50ID4gMSk7CisJQVNTRVJUKGNvdW50IDw9IDMyICogMTAyNCk7CisJQVNTRVJUKGxlbmd0aF9pbl9ieXRlcyA8PSA4ICogUEFHRV9TSVpFKTsgLyogbWF4IHJpbmcgc2l6ZSBpbiBVVCAqLworCisJZW5jb2RpbmcgPSBfX2lsb2cyX3UzMihjb3VudCkgKyAxOworCisJaWYgKGVuY29kaW5nID09IDE2KQorCQllbmNvZGluZyA9IDA7CS8qIDMyayBkZWVwICovCisKKwlyZXR1cm4gZW5jb2Rpbmc7Cit9CisKK3ZvaWQgYmVfcmRfdG9fcGFfbGlzdChzdHJ1Y3QgcmluZ19kZXNjICpyZCwgc3RydWN0IFBIWVNfQUREUiAqcGFfbGlzdCwKKwkJCQkJCXUzMiBtYXhfbnVtKTsKKyNlbmRpZiAvKiBfX2h3bGliX2hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JlbmV0L21wdS5jIGIvZHJpdmVycy9zdGFnaW5nL2JlbmV0L21wdS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2OWNjMTEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvbXB1LmMKQEAgLTAsMCArMSwxMzY0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA1IC0gMjAwOCBTZXJ2ZXJFbmdpbmVzCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBUaGUgZnVsbCBHTlUgR2VuZXJhbAorICogUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlIGZpbGUgY2FsbGVkIENPUFlJTkcuCisgKgorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqIGxpbnV4LWRyaXZlcnNAc2VydmVyZW5naW5lcy5jb20KKyAqCisgKiBTZXJ2ZXJFbmdpbmVzCisgKiAyMDkgTi4gRmFpciBPYWtzIEF2ZQorICogU3Vubnl2YWxlLCBDQSA5NDA4NQorICovCisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlICJod2xpYi5oIgorI2luY2x1ZGUgImJlc3RhdHVzLmgiCisKK3N0YXRpYworaW5saW5lIHZvaWQgbXBfcmluZ19jcmVhdGUoc3RydWN0IG1wX3JpbmcgKnJpbmcsIHUzMiBudW0sIHUzMiBzaXplLCB2b2lkICp2YSkKK3sKKwlBU1NFUlQocmluZyk7CisJbWVtc2V0KHJpbmcsIDAsIHNpemVvZihzdHJ1Y3QgbXBfcmluZykpOworCXJpbmctPm51bSA9IG51bTsKKwlyaW5nLT5wYWdlcyA9IERJVl9ST1VORF9VUChudW0gKiBzaXplLCBQQUdFX1NJWkUpOworCXJpbmctPml0ZW1TaXplID0gc2l6ZTsKKwlyaW5nLT52YSA9IHZhOworfQorCisvKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEludGVyZmFjZSBmb3IgMiBpbmRleCByaW5ncy4gaS5lLiBjb25zdW1lci9wcm9kdWNlciByaW5ncworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisvKiBSZXR1cm5zIG51bWJlciBpdGVtcyBwZW5kaW5nIG9uIHJpbmcuICovCitzdGF0aWMgaW5saW5lIHUzMiBtcF9yaW5nX251bV9wZW5kaW5nKHN0cnVjdCBtcF9yaW5nICpyaW5nKQoreworCUFTU0VSVChyaW5nKTsKKwlpZiAocmluZy0+bnVtID09IDApCisJCXJldHVybiAwOworCXJldHVybiBiZV9zdWJjKHJpbmctPnBpZHgsIHJpbmctPmNpZHgsIHJpbmctPm51bSk7Cit9CisKKy8qIFJldHVybnMgbnVtYmVyIGl0ZW1zIGZyZWUgb24gcmluZy4gKi8KK3N0YXRpYyBpbmxpbmUgdTMyIG1wX3JpbmdfbnVtX2VtcHR5KHN0cnVjdCBtcF9yaW5nICpyaW5nKQoreworCUFTU0VSVChyaW5nKTsKKwlyZXR1cm4gcmluZy0+bnVtIC0gMSAtIG1wX3JpbmdfbnVtX3BlbmRpbmcocmluZyk7Cit9CisKKy8qIENvbnN1bWUgMSBpdGVtICovCitzdGF0aWMgaW5saW5lIHZvaWQgbXBfcmluZ19jb25zdW1lKHN0cnVjdCBtcF9yaW5nICpyaW5nKQoreworCUFTU0VSVChyaW5nKTsKKwlBU1NFUlQocmluZy0+cGlkeCAhPSByaW5nLT5jaWR4KTsKKworCXJpbmctPmNpZHggPSBiZV9hZGRjKHJpbmctPmNpZHgsIDEsIHJpbmctPm51bSk7Cit9CisKKy8qIFByb2R1Y2UgMSBpdGVtICovCitzdGF0aWMgaW5saW5lIHZvaWQgbXBfcmluZ19wcm9kdWNlKHN0cnVjdCBtcF9yaW5nICpyaW5nKQoreworCUFTU0VSVChyaW5nKTsKKwlyaW5nLT5waWR4ID0gYmVfYWRkYyhyaW5nLT5waWR4LCAxLCByaW5nLT5udW0pOworfQorCisvKiBDb25zdW1lIGNvdW50IGl0ZW1zICovCitzdGF0aWMgaW5saW5lIHZvaWQgbXBfcmluZ19jb25zdW1lX211bHRpcGxlKHN0cnVjdCBtcF9yaW5nICpyaW5nLCB1MzIgY291bnQpCit7CisJQVNTRVJUKHJpbmcpOworCUFTU0VSVChtcF9yaW5nX251bV9wZW5kaW5nKHJpbmcpID49IGNvdW50KTsKKwlyaW5nLT5jaWR4ID0gYmVfYWRkYyhyaW5nLT5jaWR4LCBjb3VudCwgcmluZy0+bnVtKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkICptcF9yaW5nX2l0ZW0oc3RydWN0IG1wX3JpbmcgKnJpbmcsIHUzMiBpbmRleCkKK3sKKwlBU1NFUlQocmluZyk7CisJQVNTRVJUKGluZGV4IDwgcmluZy0+bnVtKTsKKwlBU1NFUlQocmluZy0+aXRlbVNpemUgPiAwKTsKKwlyZXR1cm4gKHU4ICopIHJpbmctPnZhICsgaW5kZXggKiByaW5nLT5pdGVtU2l6ZTsKK30KKworLyogUHRyIHRvIHByb2R1Y2UgaXRlbSAqLworc3RhdGljIGlubGluZSB2b2lkICptcF9yaW5nX3Byb2R1Y2VyX3B0cihzdHJ1Y3QgbXBfcmluZyAqcmluZykKK3sKKwlBU1NFUlQocmluZyk7CisJcmV0dXJuIG1wX3JpbmdfaXRlbShyaW5nLCByaW5nLT5waWR4KTsKK30KKworLyoKKyAqIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGxvY2F0aW9uIGluIHRoZSByaW5nLgorICogVGhpcyBpcyB1c2VkIGZvciByaW5ncyB3aXRoIDEgaW5kZXguCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCAqbXBfcmluZ19jdXJyZW50KHN0cnVjdCBtcF9yaW5nICpyaW5nKQoreworCUFTU0VSVChyaW5nKTsKKwlBU1NFUlQocmluZy0+cGlkeCA9PSAwKTsJLyogbm90IHVzZWQgKi8KKworCXJldHVybiBtcF9yaW5nX2l0ZW0ocmluZywgcmluZy0+Y2lkeCk7Cit9CisKKy8qCisgKiBJbmNyZW1lbnQgaW5kZXggZm9yIHJpbmdzIHdpdGggb25seSAxIGluZGV4LgorICogVGhpcyBpcyB1c2VkIGZvciByaW5ncyB3aXRoIDEgaW5kZXguCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCAqbXBfcmluZ19uZXh0KHN0cnVjdCBtcF9yaW5nICpyaW5nKQoreworCUFTU0VSVChyaW5nKTsKKwlBU1NFUlQocmluZy0+bnVtID4gMCk7CisJQVNTRVJUKHJpbmctPnBpZHggPT0gMCk7CS8qIG5vdCB1c2VkICovCisKKwlyaW5nLT5jaWR4ID0gYmVfYWRkYyhyaW5nLT5jaWR4LCAxLCByaW5nLT5udW0pOworCXJldHVybiBtcF9yaW5nX2N1cnJlbnQocmluZyk7Cit9CisKKy8qCisgICAgVGhpcyByb3V0aW5lIHdhaXRzIGZvciBhIHByZXZpb3VzbHkgcG9zdGVkIG1haWxib3ggV1JCIHRvIGJlIGNvbXBsZXRlZC4KKyAgICBTcGVjaWZpY2FsbHkgaXQgd2FpdHMgZm9yIHRoZSBtYWlsYm94IHRvIHNheSB0aGF0IGl0J3MgcmVhZHkgdG8gYWNjZXB0CisgICAgbW9yZSBkYXRhIGJ5IHNldHRpbmcgdGhlIExTQiBvZiB0aGUgbWFpbGJveCBwZCByZWdpc3RlciB0byAxLgorCisgICAgcGNvbnRyb2xsZXIgICAgICAtIFRoZSBmdW5jdGlvbiBvYmplY3QgdG8gcG9zdCB0aGlzIGRhdGEgdG8KKworICAgIElSUUwgPCBESVNQQVRDSF9MRVZFTAorKi8KK3N0YXRpYyB2b2lkIGJlX21jY19tYWlsYm94X3dhaXQoc3RydWN0IGJlX2Z1bmN0aW9uX29iamVjdCAqcGZvYikKK3sKKwlzdHJ1Y3QgTVBVX01BSUxCT1hfREJfQU1BUCBtYWlsYm94X2RiOworCXUzMiBpID0gMDsKKwl1MzIgcmVhZHk7CisKKwlpZiAocGZvYi0+ZW11bGF0ZSkgeworCQkvKiBObyB3YWl0aW5nIGZvciBtYWlsYm94IGluIGVtdWxhdGVkIG1vZGUuICovCisJCXJldHVybjsKKwl9CisKKwltYWlsYm94X2RiLmR3WzBdID0gUERfUkVBRChwZm9iLCBtY2NfYm9vdHN0cmFwX2RiKTsKKwlyZWFkeSA9IEFNQVBfR0VUX0JJVFNfUFRSKE1QVV9NQUlMQk9YX0RCLCByZWFkeSwgJm1haWxib3hfZGIpOworCisJd2hpbGUgKHJlYWR5ID09IGZhbHNlKSB7CisJCWlmICgoKytpICYgMHgzRkZGRikgPT0gMCkgeworCQkJVFJBQ0UoRExfV0FSTiwgIldhaXRpbmcgZm9yIG1haWxib3ggcmVhZHkgLSAlZGsgcG9sbHMiLAorCQkJCQkJCQlpIC8gMTAwMCk7CisJCX0KKwkJdWRlbGF5KDEpOworCQltYWlsYm94X2RiLmR3WzBdID0gUERfUkVBRChwZm9iLCBtY2NfYm9vdHN0cmFwX2RiKTsKKwkJcmVhZHkgPSBBTUFQX0dFVF9CSVRTX1BUUihNUFVfTUFJTEJPWF9EQiwgcmVhZHksICZtYWlsYm94X2RiKTsKKwl9Cit9CisKKy8qCisgICAgVGhpcyByb3V0aW5lIHRlbGxzIHRoZSBNQ0MgbWFpbGJveCB0aGF0IHRoZXJlIGlzIGRhdGEgdG8gcHJvY2Vzc2VkCisgICAgaW4gdGhlIG1haWxib3guIEl0IGRvZXMgdGhpcyBieSBzZXR0aW5nIHRoZSBwaHlzaWNhbCBhZGRyZXNzIGZvciB0aGUKKyAgICBtYWlsYm94IGxvY2F0aW9uIGFuZCBjbGVhcmluZyB0aGUgTFNCLiAgVGhpcyByb3V0aW5lIHJldHVybnMgaW1tZWRpYXRlbHkKKyAgICBhbmQgZG9lcyBub3Qgd2FpdCBmb3IgdGhlIFdSQiB0byBiZSBwcm9jZXNzZWQuCisKKyAgICBwY29udHJvbGxlciAgICAgIC0gVGhlIGZ1bmN0aW9uIG9iamVjdCB0byBwb3N0IHRoaXMgZGF0YSB0bworCisgICAgSVJRTCA8IERJU1BBVENIX0xFVkVMCisKKyovCitzdGF0aWMgdm9pZCBiZV9tY2NfbWFpbGJveF9ub3RpZnkoc3RydWN0IGJlX2Z1bmN0aW9uX29iamVjdCAqcGZvYikKK3sKKwlzdHJ1Y3QgTVBVX01BSUxCT1hfREJfQU1BUCBtYWlsYm94X2RiOworCXUzMiBwYTsKKworCUFTU0VSVChwZm9iLT5tYWlsYm94LnBhKTsKKwlBU1NFUlQocGZvYi0+bWFpbGJveC52YSk7CisKKwkvKiBJZiBlbXVsYXRlZCwgZG8gbm90IHJpbmcgdGhlIG1haWxib3ggKi8KKwlpZiAocGZvYi0+ZW11bGF0ZSkgeworCQlUUkFDRShETF9XQVJOLCAiTVBVIGRpc2FibGVkLiBTa2lwcGluZyBtYWlsYm94IG5vdGlmeS4iKTsKKwkJcmV0dXJuOworCX0KKworCS8qIGZvcm0gdGhlIGhpZ2hlciBiaXRzIGluIHRoZSBhZGRyZXNzICovCisJbWFpbGJveF9kYi5kd1swXSA9IDA7CS8qIGluaXQgKi8KKwlBTUFQX1NFVF9CSVRTX1BUUihNUFVfTUFJTEJPWF9EQiwgaGksICZtYWlsYm94X2RiLCAxKTsKKwlBTUFQX1NFVF9CSVRTX1BUUihNUFVfTUFJTEJPWF9EQiwgcmVhZHksICZtYWlsYm94X2RiLCAwKTsKKworCS8qIGJpdHMgMzQgdG8gNjMgKi8KKwlwYSA9ICh1MzIpIChwZm9iLT5tYWlsYm94LnBhID4+IDM0KTsKKwlBTUFQX1NFVF9CSVRTX1BUUihNUFVfTUFJTEJPWF9EQiwgYWRkcmVzcywgJm1haWxib3hfZGIsIHBhKTsKKworCS8qIFdhaXQgZm9yIHRoZSBNUFUgdG8gYmUgcmVhZHkgKi8KKwliZV9tY2NfbWFpbGJveF93YWl0KHBmb2IpOworCisJLyogUmluZyBkb29yYmVsbCAxc3QgdGltZSAqLworCVBEX1dSSVRFKHBmb2IsIG1jY19ib290c3RyYXBfZGIsIG1haWxib3hfZGIuZHdbMF0pOworCisJLyogV2FpdCBmb3IgMXN0IHdyaXRlIHRvIGJlIGFja25vd2xlZGdlZC4gKi8KKwliZV9tY2NfbWFpbGJveF93YWl0KHBmb2IpOworCisJLyogbG93ZXIgYml0cyAzMCBiaXRzIGZyb20gNHRoIGJpdCAoYml0cyA0IHRvIDMzKSovCisJcGEgPSAodTMyKSAocGZvYi0+bWFpbGJveC5wYSA+PiA0KSAmIDB4M0ZGRkZGRkY7CisKKwlBTUFQX1NFVF9CSVRTX1BUUihNUFVfTUFJTEJPWF9EQiwgaGksICZtYWlsYm94X2RiLCAwKTsKKwlBTUFQX1NFVF9CSVRTX1BUUihNUFVfTUFJTEJPWF9EQiwgcmVhZHksICZtYWlsYm94X2RiLCAwKTsKKwlBTUFQX1NFVF9CSVRTX1BUUihNUFVfTUFJTEJPWF9EQiwgYWRkcmVzcywgJm1haWxib3hfZGIsIHBhKTsKKworCS8qIFJpbmcgZG9vcmJlbGwgMm5kIHRpbWUgKi8KKwlQRF9XUklURShwZm9iLCBtY2NfYm9vdHN0cmFwX2RiLCBtYWlsYm94X2RiLmR3WzBdKTsKK30KKworLyoKKyAgICBUaGlzIHJvdXRpbmUgdGVsbHMgdGhlIE1DQyBtYWlsYm94IHRoYXQgdGhlcmUgaXMgZGF0YSB0byBwcm9jZXNzZWQKKyAgICBpbiB0aGUgbWFpbGJveC4gSXQgZG9lcyB0aGlzIGJ5IHNldHRpbmcgdGhlIHBoeXNpY2FsIGFkZHJlc3MgZm9yIHRoZQorICAgIG1haWxib3ggbG9jYXRpb24gYW5kIGNsZWFyaW5nIHRoZSBMU0IuICBUaGlzIHJvdXRpbmUgc3BpbnMgdW50aWwgdGhlCisgICAgTVBVIHdyaXRlcyBhIDEgaW50byB0aGUgTFNCIGluZGljYXRpbmcgdGhhdCB0aGUgZGF0YSBoYXMgYmVlbiByZWNlaXZlZAorICAgIGFuZCBpcyByZWFkeSB0byBiZSBwcm9jZXNzZWQuCisKKyAgICBwY29udHJvbGxlciAgICAgIC0gVGhlIGZ1bmN0aW9uIG9iamVjdCB0byBwb3N0IHRoaXMgZGF0YSB0bworCisgICAgSVJRTCA8IERJU1BBVENIX0xFVkVMCisqLworc3RhdGljIHZvaWQKK2JlX21jY19tYWlsYm94X25vdGlmeV9hbmRfd2FpdChzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwZm9iKQoreworCS8qCisJICogTm90aWZ5IGl0CisJICovCisJYmVfbWNjX21haWxib3hfbm90aWZ5KHBmb2IpOworCS8qCisJICogTm93IHdhaXQgZm9yIGNvbXBsZXRpb24gb2YgV1JCCisJICovCisJYmVfbWNjX21haWxib3hfd2FpdChwZm9iKTsKK30KKwordm9pZAorYmVfbWNjX3Byb2Nlc3NfY3FlKHN0cnVjdCBiZV9mdW5jdGlvbl9vYmplY3QgKnBmb2IsCisJCQkJc3RydWN0IE1DQ19DUV9FTlRSWV9BTUFQICpjcWUpCit7CisJc3RydWN0IGJlX21jY193cmJfY29udGV4dCAqd3JiX2NvbnRleHQgPSBOVUxMOworCXUzMiBvZmZzZXQsIHN0YXR1czsKKwl1OCAqcDsKKworCUFTU0VSVChjcWUpOworCS8qCisJICogQSBjb21tYW5kIGNvbXBsZXRlZC4gIENvbW1hbmRzIGNvbXBsZXRlIG91dC1vZi1vcmRlci4KKwkgKiBEZXRlcm1pbmUgd2hpY2ggY29tbWFuZCBjb21wbGV0ZWQgZnJvbSB0aGUgVEFHLgorCSAqLworCW9mZnNldCA9IG9mZnNldG9mKHN0cnVjdCBCRV9NQ0NfQ1FfRU5UUllfQU1BUCwgbWNjX3RhZykvODsKKwlwID0gKHU4ICopIGNxZSArIG9mZnNldDsKKwl3cmJfY29udGV4dCA9IChzdHJ1Y3QgYmVfbWNjX3dyYl9jb250ZXh0ICopKHZvaWQgKikoc2l6ZV90KSgqKHU2NCAqKXApOworCUFTU0VSVCh3cmJfY29udGV4dCk7CisKKwkvKgorCSAqIFBlcmZvcm0gYSByZXNwb25zZSBjb3B5IGlmIHJlcXVlc3RlZC4KKwkgKiBPbmx5IGNvcHkgZGF0YSBpZiB0aGUgRldDTUQgaXMgc3VjY2Vzc2Z1bC4KKwkgKi8KKwlzdGF0dXMgPSBBTUFQX0dFVF9CSVRTX1BUUihNQ0NfQ1FfRU5UUlksIGNvbXBsZXRpb25fc3RhdHVzLCBjcWUpOworCWlmIChzdGF0dXMgPT0gTUdNVF9TVEFUVVNfU1VDQ0VTUyAmJiB3cmJfY29udGV4dC0+Y29weS5sZW5ndGggPiAwKSB7CisJCUFTU0VSVCh3cmJfY29udGV4dC0+d3JiKTsKKwkJQVNTRVJUKHdyYl9jb250ZXh0LT5jb3B5LnZhKTsKKwkJcCA9ICh1OCAqKXdyYl9jb250ZXh0LT53cmIgKworCQkJCW9mZnNldG9mKHN0cnVjdCBCRV9NQ0NfV1JCX0FNQVAsIHBheWxvYWQpLzg7CisJCW1lbWNweSh3cmJfY29udGV4dC0+Y29weS52YSwKKwkJCSAgKHU4ICopcCArIHdyYl9jb250ZXh0LT5jb3B5LmZ3Y21kX29mZnNldCwKKwkJCSAgd3JiX2NvbnRleHQtPmNvcHkubGVuZ3RoKTsKKwl9CisKKwlpZiAoc3RhdHVzKQorCQlzdGF0dXMgPSBCRV9OT1RfT0s7CisJLyogaW50ZXJuYWwgY2FsbGJhY2sgKi8KKwlpZiAod3JiX2NvbnRleHQtPmludGVybmFsX2NiKSB7CisJCXdyYl9jb250ZXh0LT5pbnRlcm5hbF9jYih3cmJfY29udGV4dC0+aW50ZXJuYWxfY2JfY29udGV4dCwKKwkJCQkJCXN0YXR1cywgd3JiX2NvbnRleHQtPndyYik7CisJfQorCisJLyogY2FsbGJhY2sgKi8KKwlpZiAod3JiX2NvbnRleHQtPmNiKSB7CisJCXdyYl9jb250ZXh0LT5jYih3cmJfY29udGV4dC0+Y2JfY29udGV4dCwKKwkJCQkJICAgICAgc3RhdHVzLCB3cmJfY29udGV4dC0+d3JiKTsKKwl9CisJLyogRnJlZSB0aGUgY29udGV4dCBzdHJ1Y3R1cmUgKi8KKwlfYmVfbWNjX2ZyZWVfd3JiX2NvbnRleHQocGZvYiwgd3JiX2NvbnRleHQpOworfQorCit2b2lkIGJlX2RyaXZlX21jY193cmJfcXVldWUoc3RydWN0IGJlX21jY19vYmplY3QgKm1jYykKK3sKKwlzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwZm9iID0gTlVMTDsKKwlpbnQgc3RhdHVzID0gQkVfUEVORElORzsKKwlzdHJ1Y3QgYmVfZ2VuZXJpY19xX2N0eHQgKnFfY3R4dDsKKwlzdHJ1Y3QgTUNDX1dSQl9BTUFQICp3cmI7CisJc3RydWN0IE1DQ19XUkJfQU1BUCAqcXVldWVfd3JiOworCXUzMiBsZW5ndGgsIHBheWxvYWRfbGVuZ3RoLCBzZ2VfY291bnQsIGVtYmVkZGVkOworCXVuc2lnbmVkIGxvbmcgaXJxbDsKKworCUJVSUxEX0JVR19PTigoc2l6ZW9mKHN0cnVjdCBiZV9nZW5lcmljX3FfY3R4dCkgPAorCQkJICBzaXplb2Yoc3RydWN0IGJlX3F1ZXVlX2RyaXZlcl9jb250ZXh0KSArCisJCQkJCXNpemVvZihzdHJ1Y3QgTUNDX1dSQl9BTUFQKSkpOworCXBmb2IgPSBtY2MtPnBhcmVudF9mdW5jdGlvbjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwZm9iLT5wb3N0X2xvY2ssIGlycWwpOworCisJaWYgKG1jYy0+ZHJpdmluZ19iYWNrbG9nKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBmb2ItPnBvc3RfbG9jaywgaXJxbCk7CisJCWlmIChwZm9iLT5wZW5kX3F1ZXVlX2RyaXZpbmcgJiYgcGZvYi0+bWNjKSB7CisJCQlwZm9iLT5wZW5kX3F1ZXVlX2RyaXZpbmcgPSAwOworCQkJYmVfZHJpdmVfbWNjX3dyYl9xdWV1ZShwZm9iLT5tY2MpOworCQl9CisJCXJldHVybjsKKwl9CisJLyogQWNxdWlyZSB0aGUgZmxhZyB0byBsaW1pdCAxIHRocmVhZCB0byByZWRyaXZlIHBvc3RzLiAqLworCW1jYy0+ZHJpdmluZ19iYWNrbG9nID0gMTsKKworCXdoaWxlICghbGlzdF9lbXB0eSgmbWNjLT5iYWNrbG9nKSkgeworCQl3cmIgPSBfYmVfbXB1X3BlZWtfcmluZ193cmIobWNjLCB0cnVlKTsJLyogRHJpdmluZyB0aGUgcXVldWUgKi8KKwkJaWYgKCF3cmIpCisJCQlicmVhazsJLyogTm8gc3BhY2UgaW4gdGhlIHJpbmcgeWV0LiAqLworCQkvKiBHZXQgdGhlIG5leHQgcXVldWVkIGVudHJ5IHRvIHByb2Nlc3MuICovCisJCXFfY3R4dCA9IGxpc3RfZmlyc3RfZW50cnkoJm1jYy0+YmFja2xvZywKKwkJCQlzdHJ1Y3QgYmVfZ2VuZXJpY19xX2N0eHQsIGNvbnRleHQubGlzdCk7CisJCWxpc3RfZGVsKCZxX2N0eHQtPmNvbnRleHQubGlzdCk7CisJCXBmb2ItPm1jYy0+YmFja2xvZ19sZW5ndGgtLTsKKwkJLyoKKwkJICogQ29tcHV0ZSB0aGUgcmVxdWlyZWQgbGVuZ3RoIG9mIHRoZSBXUkIuCisJCSAqIFNpbmNlIHRoZSBxdWV1ZSBlbGVtZW50IG1heSBiZSBzbWFsbGVyIHRoYW4KKwkJICogdGhlIGNvbXBsZXRlIFdSQiwgY29weSBvbmx5IHRoZSByZXF1aXJlZCBudW1iZXIgb2YgYnl0ZXMuCisJCSAqLworCQlxdWV1ZV93cmIgPSAoc3RydWN0IE1DQ19XUkJfQU1BUCAqKSAmcV9jdHh0LT53cmJfaGVhZGVyOworCQllbWJlZGRlZCA9IEFNQVBfR0VUX0JJVFNfUFRSKE1DQ19XUkIsIGVtYmVkZGVkLCBxdWV1ZV93cmIpOworCQlpZiAoZW1iZWRkZWQpIHsKKwkJCXBheWxvYWRfbGVuZ3RoID0gQU1BUF9HRVRfQklUU19QVFIoTUNDX1dSQiwKKwkJCQkJCXBheWxvYWRfbGVuZ3RoLCBxdWV1ZV93cmIpOworCQkJbGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCBiZV9tY2Nfd3JiX2hlYWRlcikgKworCQkJCQkJCQlwYXlsb2FkX2xlbmd0aDsKKwkJfSBlbHNlIHsKKwkJCXNnZV9jb3VudCA9IEFNQVBfR0VUX0JJVFNfUFRSKE1DQ19XUkIsIHNnZV9jb3VudCwKKwkJCQkJCQkJcXVldWVfd3JiKTsKKwkJCUFTU0VSVChzZ2VfY291bnQgPT0gMSk7IC8qIG9ubHkgMSBmcmFnLiAqLworCQkJbGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCBiZV9tY2Nfd3JiX2hlYWRlcikgKworCQkJICAgIHNnZV9jb3VudCAqIHNpemVvZihzdHJ1Y3QgTUNDX1NHRV9BTUFQKTsKKwkJfQorCisJCS8qCisJCSAqIFRydW5jYXRlIHRoZSBsZW5ndGggYmFzZWQgb24gdGhlIHNpemUgb2YgdGhlCisJCSAqIHF1ZXVlIGVsZW1lbnQuICBTb21lIGVsZW1lbnRzIHRoYXQgaGF2ZSBvdXRwdXQgcGFyYW1ldGVycworCQkgKiBjYW4gYmUgc21hbGxlciB0aGFuIHRoZSBwYXlsb2FkX2xlbmd0aCBmaWVsZCB3b3VsZAorCQkgKiBpbmRpY2F0ZS4gIFdlIHJlYWxseSBvbmx5IG5lZWQgdG8gY29weSB0aGUgcmVxdWVzdAorCQkgKiBwYXJhbWV0ZXJzLCBub3QgdGhlIHJlc3BvbnNlLgorCQkgKi8KKwkJbGVuZ3RoID0gbWluKGxlbmd0aCwgKHUzMikgKHFfY3R4dC0+Y29udGV4dC5ieXRlcyAtCisJCQlvZmZzZXRvZihzdHJ1Y3QgYmVfZ2VuZXJpY19xX2N0eHQsIHdyYl9oZWFkZXIpKSk7CisKKwkJLyogQ29weSB0aGUgcXVldWUgZWxlbWVudCBXUkIgaW50byB0aGUgcmluZy4gKi8KKwkJbWVtY3B5KHdyYiwgJnFfY3R4dC0+d3JiX2hlYWRlciwgbGVuZ3RoKTsKKworCQkvKiBQb3N0IHRoZSB3cmIuICBUaGlzIHNob3VsZCBub3QgZmFpbCBhc3N1bWluZyB3ZSBoYXZlCisJCSAqIGVub3VnaCBjb250ZXh0IHN0cnVjdHMuICovCisJCXN0YXR1cyA9IGJlX2Z1bmN0aW9uX3Bvc3RfbWNjX3dyYihwZm9iLCB3cmIsIE5VTEwsCisJCQkgICBxX2N0eHQtPmNvbnRleHQuY2IsIHFfY3R4dC0+Y29udGV4dC5jYl9jb250ZXh0LAorCQkJICAgcV9jdHh0LT5jb250ZXh0LmludGVybmFsX2NiLAorCQkJICAgcV9jdHh0LT5jb250ZXh0LmludGVybmFsX2NiX2NvbnRleHQsCisJCQkgICBxX2N0eHQtPmNvbnRleHQub3B0aW9uYWxfZndjbWRfdmEsCisJCQkgICAmcV9jdHh0LT5jb250ZXh0LmNvcHkpOworCisJCWlmIChzdGF0dXMgPT0gQkVfU1VDQ0VTUykgeworCQkJLyoKKwkJCSAqIFN5bmNocm9ub3VzIGNvbXBsZXRpb24uIFNpbmNlIGl0IHdhcyBxdWV1ZWQsCisJCQkgKiB3ZSB3aWxsIGludm9rZSB0aGUgY2FsbGJhY2suCisJCQkgKiBUbyB0aGUgdXNlciwgdGhpcyBpcyBhbiBhc3luY2hyb25vdXMgcmVxdWVzdC4KKwkJCSAqLworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGZvYi0+cG9zdF9sb2NrLCBpcnFsKTsKKwkJCWlmIChwZm9iLT5wZW5kX3F1ZXVlX2RyaXZpbmcgJiYgcGZvYi0+bWNjKSB7CisJCQkJcGZvYi0+cGVuZF9xdWV1ZV9kcml2aW5nID0gMDsKKwkJCQliZV9kcml2ZV9tY2Nfd3JiX3F1ZXVlKHBmb2ItPm1jYyk7CisJCQl9CisKKwkJCUFTU0VSVChxX2N0eHQtPmNvbnRleHQuY2IpOworCisJCQlxX2N0eHQtPmNvbnRleHQuY2IoCisJCQkJcV9jdHh0LT5jb250ZXh0LmNiX2NvbnRleHQsCisJCQkJCQlCRV9TVUNDRVNTLCBOVUxMKTsKKworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnBmb2ItPnBvc3RfbG9jaywgaXJxbCk7CisKKwkJfSBlbHNlIGlmIChzdGF0dXMgIT0gQkVfUEVORElORykgeworCQkJLyoKKwkJCSAqIEFub3RoZXIgcmVzb3VyY2UgZmFpbGVkLiAgU2hvdWxkIG5ldmVyIGhhcHBlbgorCQkJICogaWYgd2UgaGF2ZSBzdWZmaWNpZW50IE1DQ19XUkJfQ09OVEVYVCBzdHJ1Y3RzLgorCQkJICogUmV0dXJuIHRvIGhlYWQgb2YgdGhlIHF1ZXVlLgorCQkJICovCisJCQlUUkFDRShETF9XQVJOLCAiRmFpbGVkIHRvIHBvc3QgYSBxdWV1ZWQgV1JCLiAweCV4IiwKKwkJCSAgICAgIHN0YXR1cyk7CisJCQlsaXN0X2FkZCgmcV9jdHh0LT5jb250ZXh0Lmxpc3QsICZtY2MtPmJhY2tsb2cpOworCQkJcGZvYi0+bWNjLT5iYWNrbG9nX2xlbmd0aCsrOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvKiBGcmVlIHRoZSBmbGFnIHRvIGxpbWl0IDEgdGhyZWFkIHRvIHJlZHJpdmUgcG9zdHMuICovCisJbWNjLT5kcml2aW5nX2JhY2tsb2cgPSAwOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBmb2ItPnBvc3RfbG9jaywgaXJxbCk7Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gYXNzZXJ0cyB0aGF0IHRoZSBXUkIgd2FzIGNvbnN1bWVkIGluIG9yZGVyLiAqLworI2lmZGVmIEJFX0RFQlVHCit1MzIgYmVfbWNjX3dyYl9jb25zdW1lZF9pbl9vcmRlcihzdHJ1Y3QgYmVfbWNjX29iamVjdCAqbWNjLAorCQkJCQlzdHJ1Y3QgTUNDX0NRX0VOVFJZX0FNQVAgKmNxZSkKK3sKKwlzdHJ1Y3QgYmVfbWNjX3dyYl9jb250ZXh0ICp3cmJfY29udGV4dCA9IE5VTEw7CisJdTMyIHdyYl9pbmRleDsKKwl1MzIgd3JiX2NvbnN1bWVkX2luX29yZGVyOworCXUzMiBvZmZzZXQ7CisJdTggKnA7CisKKwlBU1NFUlQoY3FlKTsKKwkvKgorCSAqIEEgY29tbWFuZCBjb21wbGV0ZWQuICBDb21tYW5kcyBjb21wbGV0ZSBvdXQtb2Ytb3JkZXIuCisJICogRGV0ZXJtaW5lIHdoaWNoIGNvbW1hbmQgY29tcGxldGVkIGZyb20gdGhlIFRBRy4KKwkgKi8KKwlvZmZzZXQgPSBvZmZzZXRvZihzdHJ1Y3QgQkVfTUNDX0NRX0VOVFJZX0FNQVAsIG1jY190YWcpLzg7CisJcCA9ICh1OCAqKSBjcWUgKyBvZmZzZXQ7CisJd3JiX2NvbnRleHQgPSAoc3RydWN0IGJlX21jY193cmJfY29udGV4dCAqKSh2b2lkICopKHNpemVfdCkoKih1NjQgKilwKTsKKworCUFTU0VSVCh3cmJfY29udGV4dCk7CisKKwl3cmJfaW5kZXggPSAodTMyKSAoKCh1NjQpKHNpemVfdCl3cmJfY29udGV4dC0+cmluZ193cmIgLQorCQkodTY0KShzaXplX3QpbWNjLT5zcS5yaW5nLnZhKSAvIHNpemVvZihzdHJ1Y3QgTUNDX1dSQl9BTUFQKSk7CisKKwlBU1NFUlQod3JiX2luZGV4IDwgbWNjLT5zcS5yaW5nLm51bSk7CisKKwl3cmJfY29uc3VtZWRfaW5fb3JkZXIgPSAodTMyKSAod3JiX2luZGV4ID09IG1jYy0+Y29uc3VtZWRfaW5kZXgpOworCW1jYy0+Y29uc3VtZWRfaW5kZXggPSBiZV9hZGRjKG1jYy0+Y29uc3VtZWRfaW5kZXgsIDEsIG1jYy0+c3EucmluZy5udW0pOworCXJldHVybiB3cmJfY29uc3VtZWRfaW5fb3JkZXI7Cit9CisjZW5kaWYKKworaW50IGJlX21jY19wcm9jZXNzX2NxKHN0cnVjdCBiZV9tY2Nfb2JqZWN0ICptY2MsIGJvb2wgcmVhcm0pCit7CisJc3RydWN0IGJlX2Z1bmN0aW9uX29iamVjdCAqcGZvYiA9IE5VTEw7CisJc3RydWN0IE1DQ19DUV9FTlRSWV9BTUFQICpjcWU7CisJc3RydWN0IENRX0RCX0FNQVAgZGI7CisJc3RydWN0IG1wX3JpbmcgKmNxX3JpbmcgPSAmbWNjLT5jcS5yaW5nOworCXN0cnVjdCBtcF9yaW5nICptcF9yaW5nID0gJm1jYy0+c3EucmluZzsKKwl1MzIgbnVtX3Byb2Nlc3NlZCA9IDA7CisJdTMyIGNvbnN1bWVkID0gMCwgdmFsaWQsIGNvbXBsZXRlZCwgY3FlX2NvbnN1bWVkLCBhc3luY19ldmVudDsKKworCXBmb2IgPSBtY2MtPnBhcmVudF9mdW5jdGlvbjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwZm9iLT5jcV9sb2NrLCBwZm9iLT5jcV9pcnEpOworCisJLyoKKwkgKiBWZXJpZnkgdGhhdCBvbmx5IG9uZSB0aHJlYWQgaXMgcHJvY2Vzc2luZyB0aGUgQ1EgYXQgb25jZS4KKwkgKiBXZSBjYW5ub3QgaG9sZCB0aGUgbG9jayB3aGlsZSBwcm9jZXNzaW5nIHRoZSBDUSBkdWUgdG8KKwkgKiB0aGUgY2FsbGJhY2tzIGludG8gdGhlIE9TLiAgVGhlcmVmb3JlLCB0aGlzIGZsYWcgaXMgdXNlZAorCSAqIHRvIGNvbnRyb2wgaXQuICBJZiBhbnkgb2YgdGhlIHRocmVhZHMgd2FudCB0bworCSAqIHJlYXJtIHRoZSBDUSwgd2UgbmVlZCB0byBob25vciB0aGF0LgorCSAqLworCWlmIChtY2MtPnByb2Nlc3NpbmcgIT0gMCkgeworCQltY2MtPnJlYXJtID0gbWNjLT5yZWFybSB8fCByZWFybTsKKwkJZ290byBFcnJvcjsKKwl9IGVsc2UgeworCQltY2MtPnByb2Nlc3NpbmcgPSAxOwkvKiBsb2NrIHByb2Nlc3NpbmcgZm9yIHRoaXMgdGhyZWFkLiAqLworCQltY2MtPnJlYXJtID0gcmVhcm07CS8qIHNldCBvdXIgcmVhcm0gc2V0dGluZyAqLworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBmb2ItPmNxX2xvY2ssIHBmb2ItPmNxX2lycSk7CisKKwljcWUgPSBtcF9yaW5nX2N1cnJlbnQoY3FfcmluZyk7CisJdmFsaWQgPSBBTUFQX0dFVF9CSVRTX1BUUihNQ0NfQ1FfRU5UUlksIHZhbGlkLCBjcWUpOworCXdoaWxlICh2YWxpZCkgeworCisJCWlmIChudW1fcHJvY2Vzc2VkID49IDgpIHsKKwkJCS8qIGNvYWxlc2NlIGRvb3JiZWxscywgYnV0IGZyZWUgc3BhY2UgaW4gY3EKKwkJCSAqIHJpbmcgd2hpbGUgcHJvY2Vzc2luZy4gKi8KKwkJCWRiLmR3WzBdID0gMDsJLyogY2xlYXIgKi8KKwkJCUFNQVBfU0VUX0JJVFNfUFRSKENRX0RCLCBxaWQsICZkYiwgY3FfcmluZy0+aWQpOworCQkJQU1BUF9TRVRfQklUU19QVFIoQ1FfREIsIHJlYXJtLCAmZGIsIGZhbHNlKTsKKwkJCUFNQVBfU0VUX0JJVFNfUFRSKENRX0RCLCBldmVudCwgJmRiLCBmYWxzZSk7CisJCQlBTUFQX1NFVF9CSVRTX1BUUihDUV9EQiwgbnVtX3BvcHBlZCwgJmRiLAorCQkJCQkJCW51bV9wcm9jZXNzZWQpOworCQkJbnVtX3Byb2Nlc3NlZCA9IDA7CisKKwkJCVBEX1dSSVRFKHBmb2IsIGNxX2RiLCBkYi5kd1swXSk7CisJCX0KKworCQlhc3luY19ldmVudCA9IEFNQVBfR0VUX0JJVFNfUFRSKE1DQ19DUV9FTlRSWSwgYXN5bmNfZXZlbnQsIGNxZSk7CisJCWlmIChhc3luY19ldmVudCkgeworCQkJLyogVGhpcyBpcyBhbiBhc3luY2hyb25vdXMgZXZlbnQuICovCisJCQlzdHJ1Y3QgQVNZTkNfRVZFTlRfVFJBSUxFUl9BTUFQICphc3luY190cmFpbGVyID0KKwkJCSAgICAoc3RydWN0IEFTWU5DX0VWRU5UX1RSQUlMRVJfQU1BUCAqKQorCQkJICAgICgodTggKikgY3FlICsgc2l6ZW9mKHN0cnVjdCBNQ0NfQ1FfRU5UUllfQU1BUCkgLQorCQkJICAgICBzaXplb2Yoc3RydWN0IEFTWU5DX0VWRU5UX1RSQUlMRVJfQU1BUCkpOworCQkJdTMyIGV2ZW50X2NvZGU7CisJCQlhc3luY19ldmVudCA9IEFNQVBfR0VUX0JJVFNfUFRSKEFTWU5DX0VWRU5UX1RSQUlMRVIsCisJCQkJCQlhc3luY19ldmVudCwgYXN5bmNfdHJhaWxlcik7CisJCQlBU1NFUlQoYXN5bmNfZXZlbnQgPT0gMSk7CisKKworCQkJdmFsaWQgPSBBTUFQX0dFVF9CSVRTX1BUUihBU1lOQ19FVkVOVF9UUkFJTEVSLAorCQkJCQkJdmFsaWQsIGFzeW5jX3RyYWlsZXIpOworCQkJQVNTRVJUKHZhbGlkID09IDEpOworCisJCQkvKiBDYWxsIHRoZSBhc3luYyBldmVudCBoYW5kbGVyIGlmIGl0IGlzIGluc3RhbGxlZC4gKi8KKwkJCWlmIChtY2MtPmFzeW5jX2NiKSB7CisJCQkJZXZlbnRfY29kZSA9CisJCQkJCUFNQVBfR0VUX0JJVFNfUFRSKEFTWU5DX0VWRU5UX1RSQUlMRVIsCisJCQkJCQlldmVudF9jb2RlLCBhc3luY190cmFpbGVyKTsKKwkJCQltY2MtPmFzeW5jX2NiKG1jYy0+YXN5bmNfY29udGV4dCwKKwkJCQkJICAgICh1MzIpIGV2ZW50X2NvZGUsICh2b2lkICopIGNxZSk7CisJCQl9CisKKwkJfSBlbHNlIHsKKwkJCS8qIFRoaXMgaXMgYSBjb21wbGV0aW9uIGVudHJ5LiAqLworCisJCQkvKiBObyB2bSBmb3J3YXJkaW5nIGluIHRoaXMgZHJpdmVyLiAqLworCisJCQljcWVfY29uc3VtZWQgPSBBTUFQX0dFVF9CSVRTX1BUUihNQ0NfQ1FfRU5UUlksCisJCQkJCQljb25zdW1lZCwgY3FlKTsKKwkJCWlmIChjcWVfY29uc3VtZWQpIHsKKwkJCQkvKgorCQkJCSAqIEEgY29tbWFuZCBvbiB0aGUgTUNDIHJpbmcgd2FzIGNvbnN1bWVkLgorCQkJCSAqIFVwZGF0ZSB0aGUgY29uc3VtZXIgaW5kZXguCisJCQkJICogVGhlc2Ugb2NjdXIgaW4gb3JkZXIuCisJCQkJICovCisJCQkJQVNTRVJUKGJlX21jY193cmJfY29uc3VtZWRfaW5fb3JkZXIobWNjLCBjcWUpKTsKKwkJCQljb25zdW1lZCsrOworCQkJfQorCisJCQljb21wbGV0ZWQgPSBBTUFQX0dFVF9CSVRTX1BUUihNQ0NfQ1FfRU5UUlksCisJCQkJCWNvbXBsZXRlZCwgY3FlKTsKKwkJCWlmIChjb21wbGV0ZWQpIHsKKwkJCQkvKiBBIGNvbW1hbmQgY29tcGxldGVkLiAgVXNlIHRhZyB0bworCQkJCSAqIGRldGVybWluZSB3aGljaCBjb21tYW5kLiAgKi8KKwkJCQliZV9tY2NfcHJvY2Vzc19jcWUocGZvYiwgY3FlKTsKKwkJCX0KKwkJfQorCisJCS8qIFJlc2V0IHRoZSBDUUUgKi8KKwkJQU1BUF9TRVRfQklUU19QVFIoTUNDX0NRX0VOVFJZLCB2YWxpZCwgY3FlLCBmYWxzZSk7CisJCW51bV9wcm9jZXNzZWQrKzsKKworCQkvKiBVcGRhdGUgb3VyIHRyYWNraW5nIGZvciB0aGUgQ1EgcmluZy4gKi8KKwkJY3FlID0gbXBfcmluZ19uZXh0KGNxX3JpbmcpOworCQl2YWxpZCA9IEFNQVBfR0VUX0JJVFNfUFRSKE1DQ19DUV9FTlRSWSwgdmFsaWQsIGNxZSk7CisJfQorCisJVFJBQ0UoRExfSU5GTywgIm51bV9wcm9jZXNzZWQ6MHgleCwgYW5kIGNvbnN1bWVkOjB4JXgiLAorCSAgICAgIG51bV9wcm9jZXNzZWQsIGNvbnN1bWVkKTsKKwkvKgorCSAqIEdyYWIgdGhlIENRIGxvY2sgdG8gc3luY2hyb25pemUgdGhlICJyZWFybSIgc2V0dGluZyBmb3IKKwkgKiB0aGUgZG9vcmJlbGwsIGFuZCBmb3IgY2xlYXJpbmcgdGhlICJwcm9jZXNzaW5nIiBmbGFnLgorCSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZwZm9iLT5jcV9sb2NrLCBwZm9iLT5jcV9pcnEpOworCisJLyoKKwkgKiBSZWFybSB0aGUgY3EuICBUaGlzIGlzIGRvbmUgYmFzZWQgb24gdGhlIGdsb2JhbCBtY2MtPnJlYXJtCisJICogZmxhZyB3aGljaCBjb21iaW5lcyB0aGUgcmVhcm0gcGFyYW1ldGVyIGZyb20gdGhlIGN1cnJlbnQKKwkgKiBjYWxsIHRvIHByb2Nlc3NfY3EgYW5kIGFueSBvdGhlciB0aHJlYWRzCisJICogdGhhdCB0cmllZCB0byBwcm9jZXNzIHRoZSBDUSB3aGlsZSB0aGlzIG9uZSB3YXMgYWN0aXZlLgorCSAqIFRoaXMgaGFuZGxlcyB0aGUgc2l0dWF0aW9uIHdoZXJlIGEgc3luYy4gZndjbWQgd2FzIHByb2Nlc3NpbmcKKwkgKiB0aGUgQ1Egd2hpbGUgdGhlIGludGVycnVwdC9kcGMgdHJpZXMgdG8gcHJvY2VzcyBpdC4KKwkgKiBUaGUgc3luYyBwcm9jZXNzIGdldHMgdG8gY29udGludWUgLS0gYnV0IGl0IGlzIG5vdworCSAqIHJlc3BvbnNpYmxlIGZvciB0aGUgcmVhcm1pbmcuCisJICovCisJaWYgKG51bV9wcm9jZXNzZWQgPiAwIHx8IG1jYy0+cmVhcm0gPT0gdHJ1ZSkgeworCQlkYi5kd1swXSA9IDA7CS8qIGNsZWFyICovCisJCUFNQVBfU0VUX0JJVFNfUFRSKENRX0RCLCBxaWQsICZkYiwgY3FfcmluZy0+aWQpOworCQlBTUFQX1NFVF9CSVRTX1BUUihDUV9EQiwgcmVhcm0sICZkYiwgbWNjLT5yZWFybSk7CisJCUFNQVBfU0VUX0JJVFNfUFRSKENRX0RCLCBldmVudCwgJmRiLCBmYWxzZSk7CisJCUFNQVBfU0VUX0JJVFNfUFRSKENRX0RCLCBudW1fcG9wcGVkLCAmZGIsIG51bV9wcm9jZXNzZWQpOworCisJCVBEX1dSSVRFKHBmb2IsIGNxX2RiLCBkYi5kd1swXSk7CisJfQorCS8qCisJICogVXBkYXRlIHRoZSBjb25zdW1lciBpbmRleCBhZnRlciByaW5naW5nIHRoZSBDUSBkb29yYmVsbC4KKwkgKiBXZSBkb24ndCB3YW50IGFub3RoZXIgdGhyZWFkIHRvIHBvc3QgbW9yZSBXUkJzIGJlZm9yZSB3ZQorCSAqIGhhdmUgQ1Egc3BhY2UgYXZhaWxhYmxlLgorCSAqLworCW1wX3JpbmdfY29uc3VtZV9tdWx0aXBsZShtcF9yaW5nLCBjb25zdW1lZCk7CisKKwkvKiBDbGVhciB0aGUgcHJvY2Vzc2luZyBmbGFnLiAqLworCW1jYy0+cHJvY2Vzc2luZyA9IDA7CisKK0Vycm9yOgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBmb2ItPmNxX2xvY2ssIHBmb2ItPmNxX2lycSk7CisJLyoKKwkgKiBVc2UgdGhlIGxvY2FsIHZhcmlhYmxlIHRvIGRldGVjdCBpZiB0aGUgY3VycmVudCB0aHJlYWQKKwkgKiBob2xkcyB0aGUgV1JCIHBvc3QgbG9jay4gIElmIHJlYXJtIGlzIGZhbHNlLCB0aGlzIGlzCisJICogZWl0aGVyIGEgc3luY2hyb25vdXMgY29tbWFuZCwgb3IgdGhlIHVwcGVyIGxheWVyIGRyaXZlciBpcyBwb2xsaW5nCisJICogZnJvbSBhIHRocmVhZC4gIFdlIGRvIG5vdCBkcml2ZSB0aGUgcXVldWUgZnJvbSB0aGF0CisJICogY29udGV4dCBzaW5jZSB0aGUgZHJpdmVyIG1heSBob2xkIHRoZQorCSAqIHdyYiBwb3N0IGxvY2sgYWxyZWFkeS4KKwkgKi8KKwlpZiAocmVhcm0pCisJCWJlX2RyaXZlX21jY193cmJfcXVldWUobWNjKTsKKwllbHNlCisJCXBmb2ItPnBlbmRfcXVldWVfZHJpdmluZyA9IDE7CisKKwlyZXR1cm4gQkVfU1VDQ0VTUzsKK30KKworLyoKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogICAgICAgICAgICAgICAgICBQIFUgQiBMIEkgQyAgUiBPIFUgVCBJIE4gRSBTCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisvKgorICAgIFRoaXMgcm91dGluZSBjcmVhdGVzIGFuIE1DQyBvYmplY3QuICBUaGlzIG9iamVjdCBjb250YWlucyBhbiBNQ0Mgc2VuZCBxdWV1ZQorICAgIGFuZCBhIENRIHByaXZhdGUgdG8gdGhlIE1DQy4KKworICAgIHBjb250cm9sbGVyICAgICAgLSBIYW5kbGUgdG8gYSBmdW5jdGlvbiBvYmplY3QKKworICAgIEVxT2JqZWN0ICAgICAgICAgICAgLSBFUSBvYmplY3QgdGhhdCB3aWxsIGJlIHVzZWQgdG8gZGlzcGF0Y2ggdGhpcyBNQ0MKKworICAgIHBwTWNjT2JqZWN0ICAgICAgICAgLSBQb2ludGVyIHRvIGFuIGludGVybmFsIE1jYyBPYmplY3QgcmV0dXJuZWQuCisKKyAgICBSZXR1cm5zIEJFX1NVQ0NFU1MgaWYgc3VjY2Vzc2Z1bGwsLCBvdGhlcndpc2UgYSB1c2VmdWwgZXJyb3IgY29kZQorCWlzIHJldHVybmVkLgorCisgICAgSVJRTCA8IERJU1BBVENIX0xFVkVMCisKKyovCitpbnQKK2JlX21jY19yaW5nX2NyZWF0ZShzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwZm9iLAorCQkgICBzdHJ1Y3QgcmluZ19kZXNjICpyZCwgdTMyIGxlbmd0aCwKKwkJICAgc3RydWN0IGJlX21jY193cmJfY29udGV4dCAqY29udGV4dF9hcnJheSwKKwkJICAgdTMyIG51bV9jb250ZXh0X2VudHJpZXMsCisJCSAgIHN0cnVjdCBiZV9jcV9vYmplY3QgKmNxLCBzdHJ1Y3QgYmVfbWNjX29iamVjdCAqbWNjKQoreworCWludCBzdGF0dXMgPSAwOworCisJc3RydWN0IEZXQ01EX0NPTU1PTl9NQ0NfQ1JFQVRFICpmd2NtZCA9IE5VTEw7CisJc3RydWN0IE1DQ19XUkJfQU1BUCAqd3JiID0gTlVMTDsKKwl1MzIgbnVtX2VudHJpZXNfZW5jb2RlZCwgbiwgaTsKKwl2b2lkICp2YSA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyBpcnFsOworCisJaWYgKGxlbmd0aCA8IHNpemVvZihzdHJ1Y3QgTUNDX1dSQl9BTUFQKSAqIDIpIHsKKwkJVFJBQ0UoRExfRVJSLCAiSW52YWxpZCBNQ0MgcmluZyBsZW5ndGg6JWQiLCBsZW5ndGgpOworCQlyZXR1cm4gQkVfTk9UX09LOworCX0KKwkvKgorCSAqIFJlZHVjZSB0aGUgYWN0dWFsIHJpbmcgc2l6ZSB0byBiZSBsZXNzIHRoYW4gdGhlIG51bWJlcgorCSAqIG9mIGNvbnRleHQgZW50cmllcy4gIFRoaXMgZW5zdXJlcyB0aGF0IHdlIHJ1biBvdXQgb2YKKwkgKiByaW5nIFdSQnMgZmlyc3Qgc28gdGhlIHF1ZXVpbmcgd29ya3MgY29ycmVjdGx5LiAgV2UgbmV2ZXIKKwkgKiBxdWV1ZSBiYXNlZCBvbiBjb250ZXh0IHN0cnVjdHMuCisJICovCisJaWYgKG51bV9jb250ZXh0X2VudHJpZXMgKyAxIDwKKwkJCWxlbmd0aCAvIHNpemVvZihzdHJ1Y3QgTUNDX1dSQl9BTUFQKSAtIDEpIHsKKworCQl1MzIgbWF4X2xlbmd0aCA9CisJCSAgICAobnVtX2NvbnRleHRfZW50cmllcyArIDIpICogc2l6ZW9mKHN0cnVjdCBNQ0NfV1JCX0FNQVApOworCisJCWlmIChpc19wb3dlcl9vZl8yKG1heF9sZW5ndGgpKQorCQkJbGVuZ3RoID0gX19yb3VuZHVwX3Bvd19vZl90d28obWF4X2xlbmd0aCsxKSAvIDI7CisJCWVsc2UKKwkJCWxlbmd0aCA9IF9fcm91bmR1cF9wb3dfb2ZfdHdvKG1heF9sZW5ndGgpIC8gMjsKKworCQlBU1NFUlQobGVuZ3RoIDw9IG1heF9sZW5ndGgpOworCisJCVRSQUNFKERMX1dBUk4sCisJCQkiTUNDIHJpbmcgbGVuZ3RoIHJlZHVjZWQgYmFzZWQgb24gY29udGV4dCBlbnRyaWVzLiIKKwkJCSIgbGVuZ3RoOiVkIHdyYnM6JWQgY29udGV4dF9lbnRyaWVzOiVkIiwgbGVuZ3RoLAorCQkJKGludCkgKGxlbmd0aCAvIHNpemVvZihzdHJ1Y3QgTUNDX1dSQl9BTUFQKSksCisJCQludW1fY29udGV4dF9lbnRyaWVzKTsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcGZvYi0+cG9zdF9sb2NrLCBpcnFsKTsKKworCW51bV9lbnRyaWVzX2VuY29kZWQgPQorCSAgICBiZV9yaW5nX2xlbmd0aF90b19lbmNvZGluZyhsZW5ndGgsIHNpemVvZihzdHJ1Y3QgTUNDX1dSQl9BTUFQKSk7CisKKwkvKiBJbml0IE1DQyBvYmplY3QuICovCisJbWVtc2V0KG1jYywgMCwgc2l6ZW9mKCptY2MpKTsKKwltY2MtPnBhcmVudF9mdW5jdGlvbiA9IHBmb2I7CisJbWNjLT5jcV9vYmplY3QgPSBjcTsKKworCUlOSVRfTElTVF9IRUFEKCZtY2MtPmJhY2tsb2cpOworCisJd3JiID0gYmVfZnVuY3Rpb25fcGVla19tY2Nfd3JiKHBmb2IpOworCWlmICghd3JiKSB7CisJCUFTU0VSVCh3cmIpOworCQlUUkFDRShETF9FUlIsICJObyBmcmVlIE1DQyBXUkJzIGluIGNyZWF0ZSBFUS4iKTsKKwkJc3RhdHVzID0gQkVfU1RBVFVTX05PX01DQ19XUkI7CisJCWdvdG8gZXJyb3I7CisJfQorCS8qIFByZXBhcmVzIGFuIGVtYmVkZGVkIGZ3Y21kLCBpbmNsdWRpbmcgcmVxdWVzdC9yZXNwb25zZSBzaXplcy4gKi8KKwlmd2NtZCA9IEJFX1BSRVBBUkVfRU1CRURERURfRldDTUQocGZvYiwgd3JiLCBDT01NT05fTUNDX0NSRUFURSk7CisKKwlmd2NtZC0+cGFyYW1zLnJlcXVlc3QubnVtX3BhZ2VzID0gRElWX1JPVU5EX1VQKGxlbmd0aCwgUEFHRV9TSVpFKTsKKwkvKgorCSAqIFByb2dyYW0gTUNDIHJpbmcgY29udGV4dAorCSAqLworCUFNQVBfU0VUX0JJVFNfUFRSKE1DQ19SSU5HX0NPTlRFWFQsIHBkaWQsCisJCQkmZndjbWQtPnBhcmFtcy5yZXF1ZXN0LmNvbnRleHQsIDApOworCUFNQVBfU0VUX0JJVFNfUFRSKE1DQ19SSU5HX0NPTlRFWFQsIGludmFsaWQsCisJCQkmZndjbWQtPnBhcmFtcy5yZXF1ZXN0LmNvbnRleHQsIGZhbHNlKTsKKwlBTUFQX1NFVF9CSVRTX1BUUihNQ0NfUklOR19DT05URVhULCByaW5nX3NpemUsCisJCQkmZndjbWQtPnBhcmFtcy5yZXF1ZXN0LmNvbnRleHQsIG51bV9lbnRyaWVzX2VuY29kZWQpOworCisJbiA9IGNxLT5jcV9pZDsKKwlBTUFQX1NFVF9CSVRTX1BUUihNQ0NfUklOR19DT05URVhULAorCQkJCWNxX2lkLCAmZndjbWQtPnBhcmFtcy5yZXF1ZXN0LmNvbnRleHQsIG4pOworCWJlX3JkX3RvX3BhX2xpc3QocmQsIGZ3Y21kLT5wYXJhbXMucmVxdWVzdC5wYWdlcywKKwkJCQlBUlJBWV9TSVpFKGZ3Y21kLT5wYXJhbXMucmVxdWVzdC5wYWdlcykpOworCS8qIFBvc3QgdGhlIGYvdyBjb21tYW5kICovCisJc3RhdHVzID0gYmVfZnVuY3Rpb25fcG9zdF9tY2Nfd3JiKHBmb2IsIHdyYiwgTlVMTCwgTlVMTCwgTlVMTCwKKwkJCQkJCU5VTEwsIE5VTEwsIGZ3Y21kLCBOVUxMKTsKKwlpZiAoc3RhdHVzICE9IEJFX1NVQ0NFU1MpIHsKKwkJVFJBQ0UoRExfRVJSLCAiTUNDIHRvIGNyZWF0ZSBDUSBmYWlsZWQuIik7CisJCWdvdG8gZXJyb3I7CisJfQorCS8qCisJICogQ3JlYXRlIGEgbGlua2VkIGxpc3Qgb2YgY29udGV4dCBzdHJ1Y3R1cmVzCisJICovCisJbWNjLT53cmJfY29udGV4dC5iYXNlID0gY29udGV4dF9hcnJheTsKKwltY2MtPndyYl9jb250ZXh0Lm51bSA9IG51bV9jb250ZXh0X2VudHJpZXM7CisJSU5JVF9MSVNUX0hFQUQoJm1jYy0+d3JiX2NvbnRleHQubGlzdF9oZWFkKTsKKwltZW1zZXQoY29udGV4dF9hcnJheSwgMCwKKwkJICAgIHNpemVvZihzdHJ1Y3QgYmVfbWNjX3dyYl9jb250ZXh0KSAqIG51bV9jb250ZXh0X2VudHJpZXMpOworCWZvciAoaSA9IDA7IGkgPCBtY2MtPndyYl9jb250ZXh0Lm51bTsgaSsrKSB7CisJCWxpc3RfYWRkX3RhaWwoJmNvbnRleHRfYXJyYXlbaV0ubmV4dCwKKwkJCQkJJm1jYy0+d3JiX2NvbnRleHQubGlzdF9oZWFkKTsKKwl9CisKKwkvKgorCSAqCisJICogQ3JlYXRlIGFuIG1jY19yaW5nIGZvciB0cmFja2luZyBXUkIgaHcgcmluZworCSAqLworCXZhID0gcmQtPnZhOworCUFTU0VSVCh2YSk7CisJbXBfcmluZ19jcmVhdGUoJm1jYy0+c3EucmluZywgbGVuZ3RoIC8gc2l6ZW9mKHN0cnVjdCBNQ0NfV1JCX0FNQVApLAorCQkJCXNpemVvZihzdHJ1Y3QgTUNDX1dSQl9BTUFQKSwgdmEpOworCW1jYy0+c3EucmluZy5pZCA9IGZ3Y21kLT5wYXJhbXMucmVzcG9uc2UuaWQ7CisJLyoKKwkgKiBJbml0IGEgbWNjX3JpbmcgZm9yIHRyYWNraW5nIHRoZSBNQ0MgQ1EuCisJICovCisJQVNTRVJUKGNxLT52YSk7CisJbXBfcmluZ19jcmVhdGUoJm1jYy0+Y3EucmluZywgY3EtPm51bV9lbnRyaWVzLAorCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBNQ0NfQ1FfRU5UUllfQU1BUCksIGNxLT52YSk7CisJbWNjLT5jcS5yaW5nLmlkID0gY3EtPmNxX2lkOworCisJLyogRm9yY2UgemVyb2luZyBvZiBDUS4gKi8KKwltZW1zZXQoY3EtPnZhLCAwLCBjcS0+bnVtX2VudHJpZXMgKiBzaXplb2Yoc3RydWN0IE1DQ19DUV9FTlRSWV9BTUFQKSk7CisKKwkvKiBJbml0aWFsaXplIGRlYnVnIGluZGV4LiAqLworCW1jYy0+Y29uc3VtZWRfaW5kZXggPSAwOworCisJYXRvbWljX2luYygmY3EtPnJlZl9jb3VudCk7CisJcGZvYi0+bWNjID0gbWNjOworCisJVFJBQ0UoRExfSU5GTywgIk1DQyByaW5nIGNyZWF0ZWQuIGlkOiVkIGJ5dGVzOiVkIGNxX2lkOiVkIGNxX2VudHJpZXM6JWQiCisJICAgICAgIiBudW1fY29udGV4dDolZCIsIG1jYy0+c3EucmluZy5pZCwgbGVuZ3RoLAorCSAgICAgIGNxLT5jcV9pZCwgY3EtPm51bV9lbnRyaWVzLCBudW1fY29udGV4dF9lbnRyaWVzKTsKKworZXJyb3I6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGZvYi0+cG9zdF9sb2NrLCBpcnFsKTsKKwlpZiAocGZvYi0+cGVuZF9xdWV1ZV9kcml2aW5nICYmIHBmb2ItPm1jYykgeworCQlwZm9iLT5wZW5kX3F1ZXVlX2RyaXZpbmcgPSAwOworCQliZV9kcml2ZV9tY2Nfd3JiX3F1ZXVlKHBmb2ItPm1jYyk7CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgICAgVGhpcyByb3V0aW5lIGRlc3Ryb3lzIGFuIE1DQyBzZW5kIHF1ZXVlCisKKyAgICBNY2NPYmplY3QgICAgICAgICAtIEludGVybmFsIE1jYyBPYmplY3QgdG8gYmUgZGVzdHJveWVkLgorCisgICAgUmV0dXJucyBCRV9TVUNDRVNTIGlmIHN1Y2Nlc3NmdWxsLCBvdGhlcndpc2UgYW4gZXJyb3IgY29kZSBpcyByZXR1cm5lZC4KKworICAgIElSUUwgPCBESVNQQVRDSF9MRVZFTAorCisgICAgVGhlIGNhbGxlciBvZiB0aGlzIHJvdXRpbmUgbXVzdCBlbnN1cmUgdGhhdCBubyBvdGhlciBXUkIgbWF5IGJlIHBvc3RlZAorICAgIHVudGlsIHRoaXMgcm91dGluZSByZXR1cm5zLgorCisqLworaW50IGJlX21jY19yaW5nX2Rlc3Ryb3koc3RydWN0IGJlX21jY19vYmplY3QgKm1jYykKK3sKKwlpbnQgc3RhdHVzID0gMDsKKwlzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwZm9iID0gbWNjLT5wYXJlbnRfZnVuY3Rpb247CisKKworCUFTU0VSVChtY2MtPnByb2Nlc3NpbmcgPT0gMCk7CisKKwkvKgorCSAqIFJlbW92ZSB0aGUgcmluZyBmcm9tIHRoZSBmdW5jdGlvbiBvYmplY3QuCisJICogVGhpcyB0cmFuc2l0aW9ucyBiYWNrIHRvIG1haWxib3ggbW9kZS4KKwkgKi8KKwlwZm9iLT5tY2MgPSBOVUxMOworCisJLyogU2VuZCBmd2NtZCB0byBkZXN0cm95IHRoZSBxdWV1ZS4gIChVc2luZyB0aGUgbWFpbGJveC4pICovCisJc3RhdHVzID0gYmVfZnVuY3Rpb25fcmluZ19kZXN0cm95KG1jYy0+cGFyZW50X2Z1bmN0aW9uLCBtY2MtPnNxLnJpbmcuaWQsCisJCQkgICAgIEZXQ01EX1JJTkdfVFlQRV9NQ0MsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpOworCUFTU0VSVChzdGF0dXMgPT0gMCk7CisKKwkvKiBSZWxlYXNlIHRoZSBTUSByZWZlcmVuY2UgdG8gdGhlIENRICovCisJYXRvbWljX2RlYygmbWNjLT5jcV9vYmplY3QtPnJlZl9jb3VudCk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgdm9pZAorbWNjX3dyYl9zeW5jX2NiKHZvaWQgKmNvbnRleHQsIGludCBzdGF1cywgc3RydWN0IE1DQ19XUkJfQU1BUCAqd3JiKQoreworCXN0cnVjdCBiZV9tY2Nfd3JiX2NvbnRleHQgKndyYl9jb250ZXh0ID0KKwkJCQkoc3RydWN0IGJlX21jY193cmJfY29udGV4dCAqKSBjb250ZXh0OworCUFTU0VSVCh3cmJfY29udGV4dCk7CisJKndyYl9jb250ZXh0LT51c2Vyc19maW5hbF9zdGF0dXMgPSBzdGF1czsKK30KKworLyoKKyAgICBUaGlzIHJvdXRpbmUgcG9zdHMgYSBjb21tYW5kIHRvIHRoZSBNQ0Mgc2VuZCBxdWV1ZQorCisgICAgbWNjICAgICAgIC0gSW50ZXJuYWwgTWNjIE9iamVjdCB0byBiZSBkZXN0cm95ZWQuCisKKyAgICB3cmIgICAgICAgICAgICAgLSB3cmIgdG8gcG9zdC4KKworICAgIFJldHVybnMgQkVfU1VDQ0VTUyBpZiBzdWNjZXNzZnVsbCwgb3RoZXJ3aXNlIGFuIGVycm9yIGNvZGUgaXMgcmV0dXJuZWQuCisKKyAgICBJUlFMIDwgRElTUEFUQ0hfTEVWRUwgaWYgQ29tcGxldGlvbkNhbGxiYWNrIGlzIG5vdCBOVUxMCisgICAgSVJRTCA8PURJU1BBVENIX0xFVkVMIGlmIENvbXBsZXRpb25DYWxsYmFjayBpcyAgTlVMTAorCisgICAgSWYgdGhpcyByb3V0aW5lIGlzIGNhbGxlZCB3aXRoIENvbXBsZXRpb25DYWxsYmFjayAhPSBOVUxMIHRoZQorICAgIGNhbGwgaXMgY29uc2lkZXJlZCB0byBiZSBhc3luY2hyb25vdXMgYW5kIHdpbGwgcmV0dXJuIGFzIHNvb24KKyAgICBhcyB0aGUgV1JCIGlzIHBvc3RlZCB0byB0aGUgTUNDIHdpdGggQkVfUEVORElORy4KKworICAgIElmIENvbXBsZXRpb25DYWxsYmFjayBpcyBOVUxMLCB0aGVuIHRoaXMgcm91dGluZSB3aWxsIG5vdCByZXR1cm4gdW50aWwKKyAgICBhIGNvbXBsZXRpb24gZm9yIHRoaXMgTUNDIGNvbW1hbmQgaGFzIGJlZW4gcHJvY2Vzc2VkLgorICAgIElmIGNhbGxlZCBhdCBESVNQQVRDSF9MRVZFTCB0aGUgQ29tcGxldGlvbkNhbGxiYWNrIG11c3QgYmUgTlVMTC4KKworICAgIFRoaXMgcm91dGluZSBzaG91bGQgb25seSBiZSBjYWxsZWQgaWYgdGhlIE1QVSBoYXMgYmVlbiBib29zdHJhcGVkIHBhc3QKKyAgICBtYWlsYm94IG1vZGUuCisKKworKi8KK2ludAorX2JlX21wdV9wb3N0X3dyYl9yaW5nKHN0cnVjdCBiZV9tY2Nfb2JqZWN0ICptY2MsIHN0cnVjdCBNQ0NfV1JCX0FNQVAgKndyYiwKKwkJCQlzdHJ1Y3QgYmVfbWNjX3dyYl9jb250ZXh0ICp3cmJfY29udGV4dCkKK3sKKworCXN0cnVjdCBNQ0NfV1JCX0FNQVAgKnJpbmdfd3JiID0gTlVMTDsKKwlpbnQgc3RhdHVzID0gQkVfUEVORElORzsKKwlpbnQgZmluYWxfc3RhdHVzID0gQkVfUEVORElORzsKKwltY2Nfd3JiX2NxZV9jYWxsYmFjayBjYiA9IE5VTEw7CisJc3RydWN0IE1DQ19EQl9BTUFQIG1jY19kYjsKKwl1MzIgZW1iZWRkZWQ7CisKKwlBU1NFUlQobXBfcmluZ19udW1fZW1wdHkoJm1jYy0+c3EucmluZykgPiAwKTsKKwkvKgorCSAqIElucHV0IHdyYiBpcyBtb3N0IGxpa2VseSB0aGUgbmV4dCB3cmIgaW4gdGhlIHJpbmcsIHNpbmNlIHRoZSBjbGllbnQKKwkgKiBjYW4gcGVlayBhdCB0aGUgYWRkcmVzcy4KKwkgKi8KKwlyaW5nX3dyYiA9IG1wX3JpbmdfcHJvZHVjZXJfcHRyKCZtY2MtPnNxLnJpbmcpOworCWlmICh3cmIgIT0gcmluZ193cmIpIHsKKwkJLyogSWYgbm90IGVxdWFsLCBjb3B5IGl0IGludG8gdGhlIHJpbmcuICovCisJCW1lbWNweShyaW5nX3dyYiwgd3JiLCBzaXplb2Yoc3RydWN0IE1DQ19XUkJfQU1BUCkpOworCX0KKyNpZmRlZiBCRV9ERUJVRworCXdyYl9jb250ZXh0LT5yaW5nX3dyYiA9IHJpbmdfd3JiOworI2VuZGlmCisJZW1iZWRkZWQgPSBBTUFQX0dFVF9CSVRTX1BUUihNQ0NfV1JCLCBlbWJlZGRlZCwgcmluZ193cmIpOworCWlmIChlbWJlZGRlZCkgeworCQkvKiBlbWJlZGRlZCBjb21tYW5kcyB3aWxsIGhhdmUgdGhlIHJlc3BvbnNlIHdpdGhpbiB0aGUgV1JCLiAqLworCQl3cmJfY29udGV4dC0+d3JiID0gcmluZ193cmI7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogbm9uLWVtYmVkZGVkIGNvbW1hbmRzIHdpbGwgbm90IGhhdmUgdGhlIHJlc3BvbnNlCisJCSAqIHdpdGhpbiB0aGUgV1JCLCBhbmQgdGhleSBtYXkgY29tcGxldGUgb3V0LW9mLW9yZGVyLgorCQkgKiBUaGUgV1JCIHdpbGwgbm90IGJlIHZhbGlkIHRvIGluc3BlY3QKKwkJICogZHVyaW5nIHRoZSBjb21wbGV0aW9uLgorCQkgKi8KKwkJd3JiX2NvbnRleHQtPndyYiA9IE5VTEw7CisJfQorCWNiID0gd3JiX2NvbnRleHQtPmNiOworCisJaWYgKGNiID09IE5VTEwpIHsKKwkJLyogQXNzaWduIG91ciBpbnRlcm5hbCBjYWxsYmFjayBpZiB0aGlzIGlzIGEKKwkJICogc3luY2hyb25vdXMgY2FsbC4gKi8KKwkJd3JiX2NvbnRleHQtPmNiID0gbWNjX3dyYl9zeW5jX2NiOworCQl3cmJfY29udGV4dC0+Y2JfY29udGV4dCA9IHdyYl9jb250ZXh0OworCQl3cmJfY29udGV4dC0+dXNlcnNfZmluYWxfc3RhdHVzID0gJmZpbmFsX3N0YXR1czsKKwl9CisJLyogSW5jcmVtZW50IHByb2R1Y2VyIGluZGV4ICovCisKKwltY2NfZGIuZHdbMF0gPSAwOwkJLyogaW5pdGlhbGl6ZSAqLworCUFNQVBfU0VUX0JJVFNfUFRSKE1DQ19EQiwgcmlkLCAmbWNjX2RiLCBtY2MtPnNxLnJpbmcuaWQpOworCUFNQVBfU0VUX0JJVFNfUFRSKE1DQ19EQiwgbnVtUG9zdGVkLCAmbWNjX2RiLCAxKTsKKworCW1wX3JpbmdfcHJvZHVjZSgmbWNjLT5zcS5yaW5nKTsKKwlQRF9XUklURShtY2MtPnBhcmVudF9mdW5jdGlvbiwgbXB1X21jY19kYiwgbWNjX2RiLmR3WzBdKTsKKwlUUkFDRShETF9JTkZPLCAicGlkeDogJXggYW5kIGNpZHg6ICV4LiIsIG1jYy0+c3EucmluZy5waWR4LAorCSAgICAgIG1jYy0+c3EucmluZy5jaWR4KTsKKworCWlmIChjYiA9PSBOVUxMKSB7CisJCWludCBwb2xscyA9IDA7CS8qIEF0ID49IDEgdXMgcGVyIHBvbGwgICAqLworCQkvKiBXYWl0IHVudGlsIHRoaXMgY29tbWFuZCBjb21wbGV0ZXMsIHBvbGxpbmcgdGhlIENRLiAqLworCQlkbyB7CisJCQlUUkFDRShETF9JTkZPLCAiRldDTUQgc3VibWl0dGVkIGluIHRoZSBwb2xsIG1vZGUuIik7CisJCQkvKiBEbyBub3QgcmVhcm0gQ1EgaW4gdGhpcyBjb250ZXh0LiAqLworCQkJYmVfbWNjX3Byb2Nlc3NfY3EobWNjLCBmYWxzZSk7CisKKwkJCWlmIChmaW5hbF9zdGF0dXMgPT0gQkVfUEVORElORykgeworCQkJCWlmICgoKytwb2xscyAmIDB4N0ZGRkYpID09IDApIHsKKwkJCQkJVFJBQ0UoRExfV0FSTiwKKwkJCQkJICAgICAgIldhcm5pbmcgOiBwb2xsaW5nIE1DQyBDUSBmb3IgJWQiCisJCQkJCSAgICAgICJtcy4iLCBwb2xscyAvIDEwMDApOworCQkJCX0KKworCQkJCXVkZWxheSgxKTsKKwkJCX0KKworCQkJLyogZmluYWxfc3RhdHVzIGNoYW5nZWQgd2hlbiB0aGUgY29tbWFuZCBjb21wbGV0ZXMgKi8KKwkJfSB3aGlsZSAoZmluYWxfc3RhdHVzID09IEJFX1BFTkRJTkcpOworCisJCXN0YXR1cyA9IGZpbmFsX3N0YXR1czsKKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdHJ1Y3QgTUNDX1dSQl9BTUFQICoKK19iZV9tcHVfcGVla19yaW5nX3dyYihzdHJ1Y3QgYmVfbWNjX29iamVjdCAqbWNjLCBib29sIGRyaXZpbmdfcXVldWUpCit7CisJLyogSWYgd2UgaGF2ZSBxdWV1ZWQgaXRlbXMsIGRvIG5vdCBhbGxvdyBhIHBvc3QgdG8gYnlwYXNzIHRoZSBxdWV1ZS4gKi8KKwlpZiAoIWRyaXZpbmdfcXVldWUgJiYgIWxpc3RfZW1wdHkoJm1jYy0+YmFja2xvZykpCisJCXJldHVybiBOVUxMOworCisJaWYgKG1wX3JpbmdfbnVtX2VtcHR5KCZtY2MtPnNxLnJpbmcpIDw9IDApCisJCXJldHVybiBOVUxMOworCXJldHVybiAoc3RydWN0IE1DQ19XUkJfQU1BUCAqKSBtcF9yaW5nX3Byb2R1Y2VyX3B0cigmbWNjLT5zcS5yaW5nKTsKK30KKworaW50CitiZV9tcHVfaW5pdF9tYWlsYm94KHN0cnVjdCBiZV9mdW5jdGlvbl9vYmplY3QgKnBmb2IsIHN0cnVjdCByaW5nX2Rlc2MgKm1haWxib3gpCit7CisJQVNTRVJUKG1haWxib3gpOworCXBmb2ItPm1haWxib3gudmEgPSBtYWlsYm94LT52YTsKKwlwZm9iLT5tYWlsYm94LnBhID0gIGNwdV90b19sZTY0KG1haWxib3gtPnBhKTsKKwlwZm9iLT5tYWlsYm94Lmxlbmd0aCA9IG1haWxib3gtPmxlbmd0aDsKKworCUFTU0VSVCgoKHUzMikoc2l6ZV90KXBmb2ItPm1haWxib3gudmEgJiAweGYpID09IDApOworCUFTU0VSVCgoKHUzMikoc2l6ZV90KXBmb2ItPm1haWxib3gucGEgJiAweGYpID09IDApOworCS8qCisJICogSXNzdWUgdGhlIFdSQiB0byBzZXQgTVBVIGVuZGlhbm5lc3MKKwkgKi8KKwl7CisJCXU2NCAqZW5kaWFuX2NoZWNrID0gKHU2NCAqKSAocGZvYi0+bWFpbGJveC52YSArCisJCQkJb2Zmc2V0b2Yoc3RydWN0IEJFX01DQ19NQUlMQk9YX0FNQVAsIHdyYikvOCk7CisJCSplbmRpYW5fY2hlY2sgPSAweEZGMTIzNEZGRkY1Njc4RkZVTEw7CisJfQorCisJYmVfbWNjX21haWxib3hfbm90aWZ5X2FuZF93YWl0KHBmb2IpOworCisJcmV0dXJuIEJFX1NVQ0NFU1M7Cit9CisKKworLyoKKyAgICBUaGlzIHJvdXRpbmUgcG9zdHMgYSBjb21tYW5kIHRvIHRoZSBNQ0MgbWFpbGJveC4KKworICAgIEZ1bmNPYmogICAgICAgICAtIEZ1bmN0aW9uIE9iamVjdCB0byBwb3N0IHRoZSBXUkIgb24gYmVoYWxmIG9mLgorICAgIHdyYiAgICAgICAgICAgICAtIHdyYiB0byBwb3N0LgorICAgIENvbXBsZXRpb25DYWxsYmFjayAgLSBBZGRyZXNzIG9mIGEgY2FsbGJhY2sgcm91dGluZSB0byBpbnZva2Ugb25jZSB0aGUgV1JCCisJCQkJaXMgY29tcGxldGVkLgorICAgIENvbXBsZXRpb25DYWxsYmFja0NvbnRleHQgLSBPcGFxdWUgY29udGV4dCB0byBiZSBwYXNzZWQgZHVyaW5nIHRoZSBjYWxsIHRvCisJCQkJdGhlIENvbXBsZXRpb25DYWxsYmFjay4KKyAgICBSZXR1cm5zIEJFX1NVQ0NFU1MgaWYgc3VjY2Vzc2Z1bGwsIG90aGVyd2lzZSBhbiBlcnJvciBjb2RlIGlzIHJldHVybmVkLgorCisgICAgSVJRTCA8PURJU1BBVENIX0xFVkVMIGlmIENvbXBsZXRpb25DYWxsYmFjayBpcyAgTlVMTAorCisgICAgVGhpcyByb3V0aW5lIHdpbGwgYmxvY2sgdW50aWwgYSBjb21wbGV0aW9uIGZvciB0aGlzIE1DQyBjb21tYW5kIGhhcyBiZWVuCisgICAgcHJvY2Vzc2VkLiBJZiBjYWxsZWQgYXQgRElTUEFUQ0hfTEVWRUwgdGhlIENvbXBsZXRpb25DYWxsYmFjayBtdXN0IGJlIE5VTEwuCisKKyAgICBUaGlzIHJvdXRpbmUgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGlmIHRoZSBNUFUgaGFzIG5vdCBiZWVuIGJvb3N0cmFwZWQgcGFzdAorICAgIG1haWxib3ggbW9kZS4KKyovCitpbnQKK19iZV9tcHVfcG9zdF93cmJfbWFpbGJveChzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwZm9iLAorCSBzdHJ1Y3QgTUNDX1dSQl9BTUFQICp3cmIsIHN0cnVjdCBiZV9tY2Nfd3JiX2NvbnRleHQgKndyYl9jb250ZXh0KQoreworCXN0cnVjdCBNQ0NfTUFJTEJPWF9BTUFQICptYWlsYm94ID0gTlVMTDsKKwlzdHJ1Y3QgTUNDX1dSQl9BTUFQICptYl93cmI7CisJc3RydWN0IE1DQ19DUV9FTlRSWV9BTUFQICptYl9jcTsKKwl1MzIgb2Zmc2V0LCBzdGF0dXM7CisKKwlBU1NFUlQocGZvYi0+bWNjID09IE5VTEwpOworCW1haWxib3ggPSBwZm9iLT5tYWlsYm94LnZhOworCUFTU0VSVChtYWlsYm94KTsKKworCW9mZnNldCA9IG9mZnNldG9mKHN0cnVjdCBCRV9NQ0NfTUFJTEJPWF9BTUFQLCB3cmIpLzg7CisJbWJfd3JiID0gKHN0cnVjdCBNQ0NfV1JCX0FNQVAgKikgKHU4ICopbWFpbGJveCArIG9mZnNldDsKKwlpZiAobWJfd3JiICE9IHdyYikgeworCQltZW1zZXQobWFpbGJveCwgMCwgc2l6ZW9mKCptYWlsYm94KSk7CisJCW1lbWNweShtYl93cmIsIHdyYiwgc2l6ZW9mKHN0cnVjdCBNQ0NfV1JCX0FNQVApKTsKKwl9CisJLyogVGhlIGNhbGxiYWNrIGNhbiBpbnNwZWN0IHRoZSBmaW5hbCBXUkIgdG8gZ2V0IG91dHB1dCBwYXJhbWV0ZXJzLiAqLworCXdyYl9jb250ZXh0LT53cmIgPSBtYl93cmI7CisKKwliZV9tY2NfbWFpbGJveF9ub3RpZnlfYW5kX3dhaXQocGZvYik7CisKKwkvKiBBIGNvbW1hbmQgY29tcGxldGVkLiAgVXNlIHRhZyB0byBkZXRlcm1pbmUgd2hpY2ggY29tbWFuZC4gKi8KKwlvZmZzZXQgPSBvZmZzZXRvZihzdHJ1Y3QgQkVfTUNDX01BSUxCT1hfQU1BUCwgY3EpLzg7CisJbWJfY3EgPSAoc3RydWN0IE1DQ19DUV9FTlRSWV9BTUFQICopICgodTggKiltYWlsYm94ICsgb2Zmc2V0KTsKKwliZV9tY2NfcHJvY2Vzc19jcWUocGZvYiwgbWJfY3EpOworCisJc3RhdHVzID0gQU1BUF9HRVRfQklUU19QVFIoTUNDX0NRX0VOVFJZLCBjb21wbGV0aW9uX3N0YXR1cywgbWJfY3EpOworCWlmIChzdGF0dXMpCisJCXN0YXR1cyA9IEJFX05PVF9PSzsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdHJ1Y3QgYmVfbWNjX3dyYl9jb250ZXh0ICoKK19iZV9tY2NfYWxsb2NhdGVfd3JiX2NvbnRleHQoc3RydWN0IGJlX2Z1bmN0aW9uX29iamVjdCAqcGZvYikKK3sKKwlzdHJ1Y3QgYmVfbWNjX3dyYl9jb250ZXh0ICpjb250ZXh0ID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIGlycTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwZm9iLT5tY2NfY29udGV4dF9sb2NrLCBpcnEpOworCisJaWYgKCFwZm9iLT5tYWlsYm94LmRlZmF1bHRfY29udGV4dF9hbGxvY2F0ZWQpIHsKKwkJLyogVXNlIHRoZSBzaW5nbGUgZGVmYXVsdCBjb250ZXh0IHRoYXQgd2UKKwkJICogYWx3YXlzIGhhdmUgYWxsb2NhdGVkLiAqLworCQlwZm9iLT5tYWlsYm94LmRlZmF1bHRfY29udGV4dF9hbGxvY2F0ZWQgPSB0cnVlOworCQljb250ZXh0ID0gJnBmb2ItPm1haWxib3guZGVmYXVsdF9jb250ZXh0OworCX0gZWxzZSBpZiAocGZvYi0+bWNjKSB7CisJCS8qIEdldCBhIGNvbnRleHQgZnJvbSB0aGUgZnJlZSBsaXN0LiBJZiBhbnkgYXJlIGF2YWlsYWJsZS4gKi8KKwkJaWYgKCFsaXN0X2VtcHR5KCZwZm9iLT5tY2MtPndyYl9jb250ZXh0Lmxpc3RfaGVhZCkpIHsKKwkJCWNvbnRleHQgPSBsaXN0X2ZpcnN0X2VudHJ5KAorCQkJCSZwZm9iLT5tY2MtPndyYl9jb250ZXh0Lmxpc3RfaGVhZCwKKwkJCQkJIHN0cnVjdCBiZV9tY2Nfd3JiX2NvbnRleHQsIG5leHQpOworCQl9CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGZvYi0+bWNjX2NvbnRleHRfbG9jaywgaXJxKTsKKworCXJldHVybiBjb250ZXh0OworfQorCit2b2lkCitfYmVfbWNjX2ZyZWVfd3JiX2NvbnRleHQoc3RydWN0IGJlX2Z1bmN0aW9uX29iamVjdCAqcGZvYiwKKwkJCSBzdHJ1Y3QgYmVfbWNjX3dyYl9jb250ZXh0ICpjb250ZXh0KQoreworCXVuc2lnbmVkIGxvbmcgaXJxOworCisJQVNTRVJUKGNvbnRleHQpOworCS8qCisJICogWmVybyBkdXJpbmcgZnJlZSB0byB0cnkgYW5kIGNhdGNoIGFueSBidWdzIHdoZXJlIHRoZSBjb250ZXh0CisJICogaXMgYWNjZXNzZWQgYWZ0ZXIgYSBmcmVlLgorCSAqLworCW1lbXNldChjb250ZXh0LCAwLCBzaXplb2YoY29udGV4dCkpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBmb2ItPm1jY19jb250ZXh0X2xvY2ssIGlycSk7CisKKwlpZiAoY29udGV4dCA9PSAmcGZvYi0+bWFpbGJveC5kZWZhdWx0X2NvbnRleHQpIHsKKwkJLyogRnJlZSB0aGUgZGVmYXVsdCBjb250ZXh0LiAqLworCQlBU1NFUlQocGZvYi0+bWFpbGJveC5kZWZhdWx0X2NvbnRleHRfYWxsb2NhdGVkKTsKKwkJcGZvYi0+bWFpbGJveC5kZWZhdWx0X2NvbnRleHRfYWxsb2NhdGVkID0gZmFsc2U7CisJfSBlbHNlIHsKKwkJLyogQWRkIHRvIGZyZWUgbGlzdC4gKi8KKwkJQVNTRVJUKHBmb2ItPm1jYyk7CisJCWxpc3RfYWRkX3RhaWwoJmNvbnRleHQtPm5leHQsCisJCQkJJnBmb2ItPm1jYy0+d3JiX2NvbnRleHQubGlzdF9oZWFkKTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwZm9iLT5tY2NfY29udGV4dF9sb2NrLCBpcnEpOworfQorCitpbnQKK2JlX21jY19hZGRfYXN5bmNfZXZlbnRfY2FsbGJhY2soc3RydWN0IGJlX21jY19vYmplY3QgKm1jY19vYmplY3QsCisJCW1jY19hc3luY19ldmVudF9jYWxsYmFjayBjYiwgdm9pZCAqY2JfY29udGV4dCkKK3sKKwkvKiBMb2NrIGFnYWluc3QgYW55b25lIHRyeWluZyB0byBjaGFuZ2UgdGhlIGNhbGxiYWNrL2NvbnRleHQgcG9pbnRlcnMKKwkgKiB3aGlsZSBiZWluZyB1c2VkLiAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZtY2Nfb2JqZWN0LT5wYXJlbnRfZnVuY3Rpb24tPmNxX2xvY2ssCisJCW1jY19vYmplY3QtPnBhcmVudF9mdW5jdGlvbi0+Y3FfaXJxKTsKKworCS8qIEFzc2lnbiB0aGUgYXN5bmMgY2FsbGJhY2suICovCisJbWNjX29iamVjdC0+YXN5bmNfY29udGV4dCA9IGNiX2NvbnRleHQ7CisJbWNjX29iamVjdC0+YXN5bmNfY2IgPSBjYjsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1jY19vYmplY3QtPnBhcmVudF9mdW5jdGlvbi0+Y3FfbG9jaywKKwkJCQkJbWNjX29iamVjdC0+cGFyZW50X2Z1bmN0aW9uLT5jcV9pcnEpOworCisJcmV0dXJuIEJFX1NVQ0NFU1M7Cit9CisKKyNkZWZpbmUgTVBVX0VQX0NPTlRST0wgMAorI2RlZmluZSBNUFVfRVBfU0VNQVBIT1JFIDB4YWMKKworLyoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRnVuY3Rpb246IGJlX3dhaXRfZm9yX1BPU1RfY29tcGxldGUKKyAqICAgV2FpdHMgdW50aWwgdGhlIEJsYWRlRW5naW5lIFBPU1QgY29tcGxldGVzIChlaXRoZXIgaW4gZXJyb3Igb3Igc3VjY2VzcykuCisgKiBwZm9iIC0KKyAqIHJldHVybiBzdGF0dXMgICAtIEJFX1NVQ0NFU1MgKDApIG9uIHN1Y2Nlc3MuIE5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCitzdGF0aWMgaW50IGJlX3dhaXRfZm9yX1BPU1RfY29tcGxldGUoc3RydWN0IGJlX2Z1bmN0aW9uX29iamVjdCAqcGZvYikKK3sKKwlzdHJ1Y3QgTUdNVF9IQkFfUE9TVF9TVEFUVVNfU1RSVUNUX0FNQVAgc3RhdHVzOworCWludCBzOworCXUzMiBwb3N0X2Vycm9yLCBwb3N0X3N0YWdlOworCisJY29uc3QgdTMyIHVzX3Blcl9sb29wID0gMTAwMDsJLyogMTAwMHVzICovCisJY29uc3QgdTMyIHByaW50X2ZyZXF1ZW5jeV9sb29wcyA9IDEwMDAwMDAgLyB1c19wZXJfbG9vcDsKKwljb25zdCB1MzIgbWF4X2xvb3BzID0gNjAgKiBwcmludF9mcmVxdWVuY3lfbG9vcHM7CisJdTMyIGxvb3BzID0gMDsKKworCS8qCisJICogV2FpdCBmb3IgYXJtIGZ3IGluZGljYXRpbmcgaXQgaXMgZG9uZSBvciBhIGZhdGFsIGVycm9yIGhhcHBlbmVkLgorCSAqIE5vdGU6IFBPU1QgY2FuIHRha2Ugc29tZSB0aW1lIHRvIGNvbXBsZXRlIGRlcGVuZGluZyBvbiBjb25maWd1cmF0aW9uCisJICogc2V0dGluZ3MgKGNvbnNpZGVyIEFSTSBhdHRlbXB0cyB0byBhY3F1aXJlIGFuIElQIGFkZHJlc3MKKwkgKiBvdmVyIERIQ1AhISEpLgorCSAqCisJICovCisJZG8geworCQlzdGF0dXMuZHdbMF0gPSBpb3JlYWQzMihwZm9iLT5jc3JfdmEgKyBNUFVfRVBfU0VNQVBIT1JFKTsKKwkJcG9zdF9lcnJvciA9IEFNQVBfR0VUX0JJVFNfUFRSKE1HTVRfSEJBX1BPU1RfU1RBVFVTX1NUUlVDVCwKKwkJCQkJCWVycm9yLCAmc3RhdHVzKTsKKwkJcG9zdF9zdGFnZSA9IEFNQVBfR0VUX0JJVFNfUFRSKE1HTVRfSEJBX1BPU1RfU1RBVFVTX1NUUlVDVCwKKwkJCQkJCXN0YWdlLCAmc3RhdHVzKTsKKwkJaWYgKDAgPT0gKGxvb3BzICUgcHJpbnRfZnJlcXVlbmN5X2xvb3BzKSkgeworCQkJLyogUHJpbnQgY3VycmVudCBzdGF0dXMgKi8KKwkJCVRSQUNFKERMX0lORk8sICJQT1NUIHN0YXR1cyA9IDB4JXggKHN0YWdlID0gMHgleCkiLAorCQkJCXN0YXR1cy5kd1swXSwgcG9zdF9zdGFnZSk7CisJCX0KKwkJdWRlbGF5KHVzX3Blcl9sb29wKTsKKwl9IHdoaWxlICgocG9zdF9lcnJvciAhPSAxKSAmJgorCQkgKHBvc3Rfc3RhZ2UgIT0gUE9TVF9TVEFHRV9BUk1GV19SRUFEWSkgJiYKKwkJICgrK2xvb3BzIDwgbWF4X2xvb3BzKSk7CisKKwlpZiAocG9zdF9lcnJvciA9PSAxKSB7CisJCVRSQUNFKERMX0VSUiwgIlBPU1QgZXJyb3IhIFN0YXR1cyA9IDB4JXggKHN0YWdlID0gMHgleCkiLAorCQkgICAgICBzdGF0dXMuZHdbMF0sIHBvc3Rfc3RhZ2UpOworCQlzID0gQkVfTk9UX09LOworCX0gZWxzZSBpZiAocG9zdF9zdGFnZSAhPSBQT1NUX1NUQUdFX0FSTUZXX1JFQURZKSB7CisJCVRSQUNFKERMX0VSUiwgIlBPU1QgdGltZS1vdXQhIFN0YXR1cyA9IDB4JXggKHN0YWdlID0gMHgleCkiLAorCQkgICAgICBzdGF0dXMuZHdbMF0sIHBvc3Rfc3RhZ2UpOworCQlzID0gQkVfTk9UX09LOworCX0gZWxzZSB7CisJCXMgPSBCRV9TVUNDRVNTOworCX0KKwlyZXR1cm4gczsKK30KKworLyoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRnVuY3Rpb246IGJlX2tpY2tvZmZfYW5kX3dhaXRfZm9yX1BPU1QKKyAqICAgSW50ZXJhY3RzIHdpdGggdGhlIEJsYWRlRW5naW5lIG1hbmFnZW1lbnQgcHJvY2Vzc29yIHRvIGluaXRpYXRlIFBPU1QsIGFuZAorICogICBzdWJzZXF1ZW50bHkgd2FpdHMgdW50aWwgUE9TVCBjb21wbGV0ZXMgKGVpdGhlciBpbiBlcnJvciBvciBzdWNjZXNzKS4KKyAqICAgVGhlIGNhbGxlciBtdXN0IGFjcXVpcmUgdGhlIHJlc2V0IHNlbWFwaG9yZSBiZWZvcmUgaW5pdGlhdGluZyBQT1NUCisgKiAgIHRvIHByZXZlbnQgbXVsdGlwbGUgZHJpdmVycyBpbnRlcmFjdGluZyB3aXRoIHRoZSBtYW5hZ2VtZW50IHByb2Nlc3Nvci4KKyAqICAgT25jZSBQT1NUIGlzIGNvbXBsZXRlIHRoZSBjYWxsZXIgbXVzdCByZWxlYXNlIHRoZSByZXNldCBzZW1hcGhvcmUuCisgKiAgIENhbGxlcnMgd2hvIG9ubHkgd2FudCB0byB3YWl0IGZvciBQT1NUIGNvbXBsZXRlIG1heSBjYWxsCisgKiAgIGJlX3dhaXRfZm9yX1BPU1RfY29tcGxldGUuCisgKiBwZm9iIC0KKyAqIHJldHVybiBzdGF0dXMgICAtIEJFX1NVQ0NFU1MgKDApIG9uIHN1Y2Nlc3MuIE5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCitzdGF0aWMgaW50CitiZV9raWNrb2ZmX2FuZF93YWl0X2Zvcl9QT1NUKHN0cnVjdCBiZV9mdW5jdGlvbl9vYmplY3QgKnBmb2IpCit7CisJc3RydWN0IE1HTVRfSEJBX1BPU1RfU1RBVFVTX1NUUlVDVF9BTUFQIHN0YXR1czsKKwlpbnQgczsKKworCWNvbnN0IHUzMiB1c19wZXJfbG9vcCA9IDEwMDA7CS8qIDEwMDB1cyAqLworCWNvbnN0IHUzMiBwcmludF9mcmVxdWVuY3lfbG9vcHMgPSAxMDAwMDAwIC8gdXNfcGVyX2xvb3A7CisJY29uc3QgdTMyIG1heF9sb29wcyA9IDUgKiBwcmludF9mcmVxdWVuY3lfbG9vcHM7CisJdTMyIGxvb3BzID0gMDsKKwl1MzIgcG9zdF9lcnJvciwgcG9zdF9zdGFnZTsKKworCS8qIFdhaXQgZm9yIGFybSBmdyBhd2FpdGluZyBob3N0IHJlYWR5IG9yIGEgZmF0YWwgZXJyb3IgaGFwcGVuZWQuICovCisJVFJBQ0UoRExfSU5GTywgIldhaXQgZm9yIEJsYWRlRW5naW5lIHJlYWR5IHRvIFBPU1QiKTsKKwlkbyB7CisJCXN0YXR1cy5kd1swXSA9IGlvcmVhZDMyKHBmb2ItPmNzcl92YSArIE1QVV9FUF9TRU1BUEhPUkUpOworCQlwb3N0X2Vycm9yID0gQU1BUF9HRVRfQklUU19QVFIoTUdNVF9IQkFfUE9TVF9TVEFUVVNfU1RSVUNULAorCQkJCQkJZXJyb3IsICZzdGF0dXMpOworCQlwb3N0X3N0YWdlID0gQU1BUF9HRVRfQklUU19QVFIoTUdNVF9IQkFfUE9TVF9TVEFUVVNfU1RSVUNULAorCQkJCQkJc3RhZ2UsICZzdGF0dXMpOworCQlpZiAoMCA9PSAobG9vcHMgJSBwcmludF9mcmVxdWVuY3lfbG9vcHMpKSB7CisJCQkvKiBQcmludCBjdXJyZW50IHN0YXR1cyAqLworCQkJVFJBQ0UoRExfSU5GTywgIlBPU1Qgc3RhdHVzID0gMHgleCAoc3RhZ2UgPSAweCV4KSIsCisJCQkgICAgICBzdGF0dXMuZHdbMF0sIHBvc3Rfc3RhZ2UpOworCQl9CisJCXVkZWxheSh1c19wZXJfbG9vcCk7CisJfSB3aGlsZSAoKHBvc3RfZXJyb3IgIT0gMSkgJiYKKwkJIChwb3N0X3N0YWdlIDwgUE9TVF9TVEFHRV9BV0FJVElOR19IT1NUX1JEWSkgJiYKKwkJICgrK2xvb3BzIDwgbWF4X2xvb3BzKSk7CisKKwlpZiAocG9zdF9lcnJvciA9PSAxKSB7CisJCVRSQUNFKERMX0VSUiwgIlByZS1QT1NUIGVycm9yISBTdGF0dXMgPSAweCV4IChzdGFnZSA9IDB4JXgpIiwKKwkJICAgICAgc3RhdHVzLmR3WzBdLCBwb3N0X3N0YWdlKTsKKwkJcyA9IEJFX05PVF9PSzsKKwl9IGVsc2UgaWYgKHBvc3Rfc3RhZ2UgPT0gUE9TVF9TVEFHRV9BV0FJVElOR19IT1NUX1JEWSkgeworCQlpb3dyaXRlMzIoUE9TVF9TVEFHRV9IT1NUX1JEWSwgcGZvYi0+Y3NyX3ZhICsgTVBVX0VQX1NFTUFQSE9SRSk7CisKKwkJLyogV2FpdCBmb3IgUE9TVCB0byBjb21wbGV0ZSAqLworCQlzID0gYmVfd2FpdF9mb3JfUE9TVF9jb21wbGV0ZShwZm9iKTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBFaXRoZXIgYSB0aW1lb3V0IHdhaXRpbmcgZm9yIGhvc3QgcmVhZHkgc2lnbmFsIG9yIFBPU1QgaGFzCisJCSAqIG1vdmVkIGFoZWFkIHdpdGhvdXQgcmVxdWlyaW5nIGEgaG9zdCByZWFkeSBzaWduYWwuCisJCSAqIE1pZ2h0IGFzIHdlbGwgZ2l2ZSBQT1NUIGEgY2hhbmNlIHRvIGNvbXBsZXRlCisJCSAqIChvciB0aW1lb3V0IGFnYWluKS4KKwkJICovCisJCXMgPSBiZV93YWl0X2Zvcl9QT1NUX2NvbXBsZXRlKHBmb2IpOworCX0KKwlyZXR1cm4gczsKK30KKworLyoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRnVuY3Rpb246IGJlX3BjaV9zb2Z0X3Jlc2V0CisgKiAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGlzc3VlIGEgQmxhZGVFbmdpbmUgc29mdCByZXNldC4KKyAqICAgQ2FsbGVycyBzaG91bGQgYWNxdWlyZSB0aGUgc29mdCByZXNldCBzZW1hcGhvcmUgYmVmb3JlIGNhbGxpbmcgdGhpcworICogICBmdW5jdGlvbi4gQWRkaXRpb25hbHksIGNhbGxlcnMgc2hvdWxkIGVuc3VyZSB0aGV5IGNhbm5vdCBiZSBwcmUtZW1wdGVkCisgKiAgIHdoaWxlIHRoZSByb3V0aW5lIGV4ZWN1dGVzLiBVcG9uIGNvbXBsZXRpb24gb2YgdGhpcyByb3V0aW5lLCBjYWxsZXJzCisgKiAgIHNob3VsZCByZWxlYXNlIHRoZSByZXNldCBzZW1hcGhvcmUuIFRoaXMgcm91dGluZSBpbXBsaWNpdGx5IHdhaXRzCisgKiAgIGZvciBCbGFkZUVuZ2luZSBQT1NUIHRvIGNvbXBsZXRlLgorICogcGZvYiAtCisgKiByZXR1cm4gc3RhdHVzICAgLSBCRV9TVUNDRVNTICgwKSBvbiBzdWNjZXNzLiBOZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworaW50IGJlX3BjaV9zb2Z0X3Jlc2V0KHN0cnVjdCBiZV9mdW5jdGlvbl9vYmplY3QgKnBmb2IpCit7CisJc3RydWN0IFBDSUNGR19TT0ZUX1JFU0VUX0NTUl9BTUFQIHNvZnRfcmVzZXQ7CisJc3RydWN0IFBDSUNGR19PTkxJTkUwX0NTUl9BTUFQIHBjaU9ubGluZTA7CisJc3RydWN0IFBDSUNGR19PTkxJTkUxX0NTUl9BTUFQIHBjaU9ubGluZTE7CisJc3RydWN0IEVQX0NPTlRST0xfQ1NSX0FNQVAgZXBDb250cm9sQ3NyOworCWludCBzdGF0dXMgPSBCRV9TVUNDRVNTOworCXUzMiBpLCBzb2Z0X3Jlc2V0X2JpdDsKKworCVRSQUNFKERMX05PVEUsICJQQ0kgcmVzZXQuLi4iKTsKKworCS8qIElzc3VlIHNvZnQgcmVzZXQgIzEgdG8gZ2V0IEJsYWRlRW5naW5lIGludG8gYSBrbm93biBzdGF0ZS4gKi8KKwlzb2Z0X3Jlc2V0LmR3WzBdID0gUENJQ0ZHMF9SRUFEKHBmb2IsIHNvZnRfcmVzZXQpOworCUFNQVBfU0VUX0JJVFNfUFRSKFBDSUNGR19TT0ZUX1JFU0VUX0NTUiwgc29mdHJlc2V0LCBzb2Z0X3Jlc2V0LmR3LCAxKTsKKwlQQ0lDRkcwX1dSSVRFKHBmb2IsIGhvc3RfdGltZXJfaW50X2N0cmwsIHNvZnRfcmVzZXQuZHdbMF0pOworCS8qCisJICogd2FpdCB0aWwgc29mdCByZXNldCBpcyBkZWFzc2VydGVkIC0gaGFyZHdhcmUKKwkgKiBkZWFzc2VydHMgYWZ0ZXIgc29tZSB0aW1lLgorCSAqLworCWkgPSAwOworCWRvIHsKKwkJdWRlbGF5KDUwKTsKKwkJc29mdF9yZXNldC5kd1swXSA9IFBDSUNGRzBfUkVBRChwZm9iLCBzb2Z0X3Jlc2V0KTsKKwkJc29mdF9yZXNldF9iaXQgPSBBTUFQX0dFVF9CSVRTX1BUUihQQ0lDRkdfU09GVF9SRVNFVF9DU1IsCisJCQkJCXNvZnRyZXNldCwgc29mdF9yZXNldC5kdyk7CisJfSB3aGlsZSAoc29mdF9yZXNldF9iaXQgICYmIChpKysgPCAxMDI0KSk7CisJaWYgKHNvZnRfcmVzZXRfYml0ICE9IDApIHsKKwkJVFJBQ0UoRExfRVJSLCAiU29mdC1yZXNldCAjMSBkaWQgbm90IGRlYXNzZXJ0IGFzIGV4cGVjdGVkLiIpOworCQlzdGF0dXMgPSBCRV9OT1RfT0s7CisJCWdvdG8gRXJyb3JfbGFiZWw7CisJfQorCS8qIE1hc2sgZXZlcnl0aGluZyAgKi8KKwlQQ0lDRkcwX1dSSVRFKHBmb2IsIHVlX3N0YXR1c19sb3dfbWFzaywgMHhGRkZGRkZGRik7CisJUENJQ0ZHMF9XUklURShwZm9iLCB1ZV9zdGF0dXNfaGlfbWFzaywgMHhGRkZGRkZGRik7CisJLyoKKwkgKiBTZXQgZXZlcnl0aGluZyBvZmZsaW5lIGV4Y2VwdCBNUFUgSVJBTSAoaXQgaXMgb2ZmbGluZSB3aXRoCisJICogdGhlIHNvZnQtcmVzZXQsIGJ1dCBzb2Z0LXJlc2V0IGRvZXMgbm90IHJlc2V0IHRoZSBQQ0lDRkcgcmVnaXN0ZXJzISkKKwkgKi8KKwlwY2lPbmxpbmUwLmR3WzBdID0gMDsKKwlwY2lPbmxpbmUxLmR3WzBdID0gMDsKKwlBTUFQX1NFVF9CSVRTX1BUUihQQ0lDRkdfT05MSU5FMV9DU1IsIG1wdV9pcmFtX29ubGluZSwKKwkJCQlwY2lPbmxpbmUxLmR3LCAxKTsKKwlQQ0lDRkcwX1dSSVRFKHBmb2IsIG9ubGluZTAsIHBjaU9ubGluZTAuZHdbMF0pOworCVBDSUNGRzBfV1JJVEUocGZvYiwgb25saW5lMSwgcGNpT25saW5lMS5kd1swXSk7CisKKwl1ZGVsYXkoMjAwMDApOworCisJLyogSXNzdWUgc29mdCByZXNldCAjMi4gKi8KKwlBTUFQX1NFVF9CSVRTX1BUUihQQ0lDRkdfU09GVF9SRVNFVF9DU1IsIHNvZnRyZXNldCwgc29mdF9yZXNldC5kdywgMSk7CisJUENJQ0ZHMF9XUklURShwZm9iLCBob3N0X3RpbWVyX2ludF9jdHJsLCBzb2Z0X3Jlc2V0LmR3WzBdKTsKKwkvKgorCSAqIHdhaXQgdGlsIHNvZnQgcmVzZXQgaXMgZGVhc3NlcnRlZCAtIGhhcmR3YXJlCisJICogZGVhc3NlcnRzIGFmdGVyIHNvbWUgdGltZS4KKwkgKi8KKwlpID0gMDsKKwlkbyB7CisJCXVkZWxheSg1MCk7CisJCXNvZnRfcmVzZXQuZHdbMF0gPSBQQ0lDRkcwX1JFQUQocGZvYiwgc29mdF9yZXNldCk7CisJCXNvZnRfcmVzZXRfYml0ID0gQU1BUF9HRVRfQklUU19QVFIoUENJQ0ZHX1NPRlRfUkVTRVRfQ1NSLAorCQkJCQlzb2Z0cmVzZXQsIHNvZnRfcmVzZXQuZHcpOworCX0gd2hpbGUgKHNvZnRfcmVzZXRfYml0ICAmJiAoaSsrIDwgMTAyNCkpOworCWlmIChzb2Z0X3Jlc2V0X2JpdCAhPSAwKSB7CisJCVRSQUNFKERMX0VSUiwgIlNvZnQtcmVzZXQgIzEgZGlkIG5vdCBkZWFzc2VydCBhcyBleHBlY3RlZC4iKTsKKwkJc3RhdHVzID0gQkVfTk9UX09LOworCQlnb3RvIEVycm9yX2xhYmVsOworCX0KKworCisJdWRlbGF5KDIwMDAwKTsKKworCS8qIFRha2UgTVBVIG91dCBvZiByZXNldC4gKi8KKworCWVwQ29udHJvbENzci5kd1swXSA9IGlvcmVhZDMyKHBmb2ItPmNzcl92YSArIE1QVV9FUF9DT05UUk9MKTsKKwlBTUFQX1NFVF9CSVRTX1BUUihFUF9DT05UUk9MX0NTUiwgQ1BVX3Jlc2V0LCAmZXBDb250cm9sQ3NyLCAwKTsKKwlpb3dyaXRlMzIoKHUzMillcENvbnRyb2xDc3IuZHdbMF0sIHBmb2ItPmNzcl92YSArIE1QVV9FUF9DT05UUk9MKTsKKworCS8qIEtpY2tvZmYgQkUgUE9TVCBhbmQgd2FpdCBmb3IgY29tcGxldGlvbiAqLworCXN0YXR1cyA9IGJlX2tpY2tvZmZfYW5kX3dhaXRfZm9yX1BPU1QocGZvYik7CisKK0Vycm9yX2xhYmVsOgorCXJldHVybiBzdGF0dXM7Cit9CisKKworLyoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRnVuY3Rpb246IGJlX3BjaV9yZXNldF9yZXF1aXJlZAorICogICBUaGlzIHByaXZhdGUgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGRldGVjdCBpZiBhIGhvc3QgZW50aXR5IGlzCisgKiAgIHJlcXVpcmVkIHRvIGlzc3VlIGEgUENJIHNvZnQgcmVzZXQgYW5kIHN1YnNlcXVlbnRseSBkcml2ZQorICogICBCbGFkZUVuZ2luZSBQT1NULiBTY2VuYXJpb3Mgd2hlcmUgdGhpcyBpcyByZXF1aXJlZDoKKyAqICAgMSkgQklPUy1sZXNzIGNvbmZpZ3VyYXRpb24KKyAqICAgMikgSG90LXN3YXAvcGx1Zy9wb3dlci1vbgorICogcGZvYiAtCisgKiByZXR1cm4gICB0cnVlIGlmIGEgcmVzZXQgaXMgcmVxdWlyZWQsIGZhbHNlIG90aGVyd2lzZQorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK3N0YXRpYyBib29sIGJlX3BjaV9yZXNldF9yZXF1aXJlZChzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwZm9iKQoreworCXN0cnVjdCBNR01UX0hCQV9QT1NUX1NUQVRVU19TVFJVQ1RfQU1BUCBzdGF0dXM7CisJYm9vbCBkb19yZXNldCA9IGZhbHNlOworCXUzMiBwb3N0X2Vycm9yLCBwb3N0X3N0YWdlOworCisJLyoKKwkgKiBSZWFkIHRoZSBQT1NUIHN0YXR1cyByZWdpc3RlcgorCSAqLworCXN0YXR1cy5kd1swXSA9IGlvcmVhZDMyKHBmb2ItPmNzcl92YSArIE1QVV9FUF9TRU1BUEhPUkUpOworCXBvc3RfZXJyb3IgPSBBTUFQX0dFVF9CSVRTX1BUUihNR01UX0hCQV9QT1NUX1NUQVRVU19TVFJVQ1QsIGVycm9yLAorCQkJCQkJCQkmc3RhdHVzKTsKKwlwb3N0X3N0YWdlID0gQU1BUF9HRVRfQklUU19QVFIoTUdNVF9IQkFfUE9TVF9TVEFUVVNfU1RSVUNULCBzdGFnZSwKKwkJCQkJCQkJJnN0YXR1cyk7CisJaWYgKHBvc3Rfc3RhZ2UgPD0gUE9TVF9TVEFHRV9BV0FJVElOR19IT1NUX1JEWSkgeworCQkvKgorCQkgKiBJZiBCbGFkZUVuZ2luZSBpcyB3YWl0aW5nIGZvciBob3N0IHJlYWR5IGluZGljYXRpb24sCisJCSAqIHdlIHdhbnQgdG8gZG8gYSBQQ0kgcmVzZXQuCisJCSAqLworCQlkb19yZXNldCA9IHRydWU7CisJfQorCisJcmV0dXJuIGRvX3Jlc2V0OworfQorCisvKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBGdW5jdGlvbjogYmVfZHJpdmVfUE9TVAorICogICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBkcml2ZSBCbGFkZUVuZ2luZSBQT1NULiBUaGUKKyAqICAgY2FsbGVyIHNob3VsZCBlbnN1cmUgdGhleSBjYW5ub3QgYmUgcHJlLWVtcHRlZCB3aGlsZSB0aGlzIHJvdXRpbmUgZXhlY3V0ZXMuCisgKiBwZm9iIC0KKyAqIHJldHVybiBzdGF0dXMgICAtIEJFX1NVQ0NFU1MgKDApIG9uIHN1Y2Nlc3MuIE5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCitpbnQgYmVfZHJpdmVfUE9TVChzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwZm9iKQoreworCWludCBzdGF0dXM7CisKKwlpZiAoZmFsc2UgIT0gYmVfcGNpX3Jlc2V0X3JlcXVpcmVkKHBmb2IpKSB7CisJCS8qIFBDSSByZXNldCBpcyBuZWVkZWQgKGltcGxpY2l0bHkgc3RhcnRzIGFuZCB3YWl0cyBmb3IgUE9TVCkgKi8KKwkJc3RhdHVzID0gYmVfcGNpX3NvZnRfcmVzZXQocGZvYik7CisJfSBlbHNlIHsKKwkJLyogTm8gUENJIHJlc2V0IGlzIG5lZWRlZCwgc3RhcnQgUE9TVCAqLworCQlzdGF0dXMgPSBiZV9raWNrb2ZmX2FuZF93YWl0X2Zvcl9QT1NUKHBmb2IpOworCX0KKworCXJldHVybiBzdGF0dXM7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvbXB1LmggYi9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvbXB1LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDFmM2Y4NwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9tcHUuaApAQCAtMCwwICsxLDc0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA1IC0gMjAwOCBTZXJ2ZXJFbmdpbmVzCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBUaGUgZnVsbCBHTlUgR2VuZXJhbAorICogUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlIGZpbGUgY2FsbGVkIENPUFlJTkcuCisgKgorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqIGxpbnV4LWRyaXZlcnNAc2VydmVyZW5naW5lcy5jb20KKyAqCisgKiBTZXJ2ZXJFbmdpbmVzCisgKiAyMDkgTi4gRmFpciBPYWtzIEF2ZQorICogU3Vubnl2YWxlLCBDQSA5NDA4NQorICovCisvKgorICogQXV0b2dlbmVyYXRlZCBieSBzcmNnZW4gdmVyc2lvbjogMDEyNworICovCisjaWZuZGVmIF9fbXB1X2FtYXBfaF9fCisjZGVmaW5lIF9fbXB1X2FtYXBfaF9fCisjaW5jbHVkZSAiZXAuaCIKKworLyogUHJvdmlkZSBjb250cm9sIHBhcmFtZXRlcnMgZm9yIHRoZSBNYW5hZ21lbnQgUHJvY2Vzc29yIFVuaXQuICovCitzdHJ1Y3QgQkVfTVBVX0NTUk1BUF9BTUFQIHsKKwlzdHJ1Y3QgQkVfRVBfQ1NSTUFQX0FNQVAgZXA7CisJdTggcnN2ZDBbMTI4XTsJLyogRFdPUkQgNjQgKi8KKwl1OCByc3ZkMVszMl07CS8qIERXT1JEIDY4ICovCisJdTggcnN2ZDJbMTkyXTsJLyogRFdPUkQgNjkgKi8KKwl1OCByc3ZkM1sxOTJdOwkvKiBEV09SRCA3NSAqLworCXU4IHJzdmQ0WzMyXTsJLyogRFdPUkQgODEgKi8KKwl1OCByc3ZkNVszMl07CS8qIERXT1JEIDgyICovCisJdTggcnN2ZDZbMzJdOwkvKiBEV09SRCA4MyAqLworCXU4IHJzdmQ3WzMyXTsJLyogRFdPUkQgODQgKi8KKwl1OCByc3ZkOFszMl07CS8qIERXT1JEIDg1ICovCisJdTggcnN2ZDlbMzJdOwkvKiBEV09SRCA4NiAqLworCXU4IHJzdmQxMFszMl07CS8qIERXT1JEIDg3ICovCisJdTggcnN2ZDExWzMyXTsJLyogRFdPUkQgODggKi8KKwl1OCByc3ZkMTJbMzJdOwkvKiBEV09SRCA4OSAqLworCXU4IHJzdmQxM1szMl07CS8qIERXT1JEIDkwICovCisJdTggcnN2ZDE0WzMyXTsJLyogRFdPUkQgOTEgKi8KKwl1OCByc3ZkMTVbMzJdOwkvKiBEV09SRCA5MiAqLworCXU4IHJzdmQxNlszMl07CS8qIERXT1JEIDkzICovCisJdTggcnN2ZDE3WzMyXTsJLyogRFdPUkQgOTQgKi8KKwl1OCByc3ZkMThbMzJdOwkvKiBEV09SRCA5NSAqLworCXU4IHJzdmQxOVszMl07CS8qIERXT1JEIDk2ICovCisJdTggcnN2ZDIwWzMyXTsJLyogRFdPUkQgOTcgKi8KKwl1OCByc3ZkMjFbMzJdOwkvKiBEV09SRCA5OCAqLworCXU4IHJzdmQyMlszMl07CS8qIERXT1JEIDk5ICovCisJdTggcnN2ZDIzWzMyXTsJLyogRFdPUkQgMTAwICovCisJdTggcnN2ZDI0WzMyXTsJLyogRFdPUkQgMTAxICovCisJdTggcnN2ZDI1WzMyXTsJLyogRFdPUkQgMTAyICovCisJdTggcnN2ZDI2WzMyXTsJLyogRFdPUkQgMTAzICovCisJdTggcnN2ZDI3WzMyXTsJLyogRFdPUkQgMTA0ICovCisJdTggcnN2ZDI4Wzk2XTsJLyogRFdPUkQgMTA1ICovCisJdTggcnN2ZDI5WzMyXTsJLyogRFdPUkQgMTA4ICovCisJdTggcnN2ZDMwWzMyXTsJLyogRFdPUkQgMTA5ICovCisJdTggcnN2ZDMxWzMyXTsJLyogRFdPUkQgMTEwICovCisJdTggcnN2ZDMyWzMyXTsJLyogRFdPUkQgMTExICovCisJdTggcnN2ZDMzWzMyXTsJLyogRFdPUkQgMTEyICovCisJdTggcnN2ZDM0Wzk2XTsJLyogRFdPUkQgMTEzICovCisJdTggcnN2ZDM1WzMyXTsJLyogRFdPUkQgMTE2ICovCisJdTggcnN2ZDM2WzMyXTsJLyogRFdPUkQgMTE3ICovCisJdTggcnN2ZDM3WzMyXTsJLyogRFdPUkQgMTE4ICovCisJdTggcnN2ZDM4WzMyXTsJLyogRFdPUkQgMTE5ICovCisJdTggcnN2ZDM5WzMyXTsJLyogRFdPUkQgMTIwICovCisJdTggcnN2ZDQwWzMyXTsJLyogRFdPUkQgMTIxICovCisJdTggcnN2ZDQxWzEzNF1bMzJdOwkvKiBEV09SRCAxMjIgKi8KK30gX19wYWNrZWQ7CitzdHJ1Y3QgTVBVX0NTUk1BUF9BTUFQIHsKKwl1MzIgZHdbMjU2XTsKK307CisKKyNlbmRpZiAvKiBfX21wdV9hbWFwX2hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JlbmV0L21wdV9jb250ZXh0LmggYi9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvbXB1X2NvbnRleHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2U5MGY5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JlbmV0L21wdV9jb250ZXh0LmgKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNSAtIDIwMDggU2VydmVyRW5naW5lcworICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgVGhlIGZ1bGwgR05VIEdlbmVyYWwKKyAqIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZSBmaWxlIGNhbGxlZCBDT1BZSU5HLgorICoKKyAqIENvbnRhY3QgSW5mb3JtYXRpb246CisgKiBsaW51eC1kcml2ZXJzQHNlcnZlcmVuZ2luZXMuY29tCisgKgorICogU2VydmVyRW5naW5lcworICogMjA5IE4uIEZhaXIgT2FrcyBBdmUKKyAqIFN1bm55dmFsZSwgQ0EgOTQwODUKKyAqLworLyoKKyAqIEF1dG9nZW5lcmF0ZWQgYnkgc3JjZ2VuIHZlcnNpb246IDAxMjcKKyAqLworI2lmbmRlZiBfX21wdV9jb250ZXh0X2FtYXBfaF9fCisjZGVmaW5lIF9fbXB1X2NvbnRleHRfYW1hcF9oX18KKworLyoKKyAqIE1hbmFnZW1lbnQgY29tbWFuZCBhbmQgY29udHJvbCByaW5nIGNvbnRleHQuIFRoZSBNUFVzIEJUTFJfQ1RSTDEgQ1NSCisgKiBjb250cm9scyB0aGUgd3JpdGViYWNrIGJlaGF2aW9yIG9mIHRoZSBwcm9kdWNlciBhbmQgY29uc3VtZXIgaW5kZXggdmFsdWVzLgorICovCitzdHJ1Y3QgQkVfTUNDX1JJTkdfQ09OVEVYVF9BTUFQIHsKKwl1OCBjb25faW5kZXhbMTZdOwkvKiBEV09SRCAwICovCisJdTggcmluZ19zaXplWzRdOwkvKiBEV09SRCAwICovCisJdTggY3FfaWRbMTFdOwkvKiBEV09SRCAwICovCisJdTggcnN2ZDA7CQkvKiBEV09SRCAwICovCisJdTggcHJvZF9pbmRleFsxNl07CS8qIERXT1JEIDEgKi8KKwl1OCBwZGlkWzE1XTsJLyogRFdPUkQgMSAqLworCXU4IGludmFsaWQ7CQkvKiBEV09SRCAxICovCisJdTggY21kX3BlbmRpbmdfY3VycmVudFs3XTsJLyogRFdPUkQgMiAqLworCXU4IHJzdmQxWzI1XTsJLyogRFdPUkQgMiAqLworCXU4IGhwaV9wb3J0X2NxX2lkWzExXTsJLyogRFdPUkQgMyAqLworCXU4IHJzdmQyWzVdOwkvKiBEV09SRCAzICovCisJdTggY21kX3BlbmRpbmdfbWF4WzddOwkvKiBEV09SRCAzICovCisJdTggcnN2ZDNbOV07CS8qIERXT1JEIDMgKi8KK30gX19wYWNrZWQ7CitzdHJ1Y3QgTUNDX1JJTkdfQ09OVEVYVF9BTUFQIHsKKwl1MzIgZHdbNF07Cit9OworCisjZW5kaWYgLyogX19tcHVfY29udGV4dF9hbWFwX2hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JlbmV0L3BjaWNmZy5oIGIvZHJpdmVycy9zdGFnaW5nL2JlbmV0L3BjaWNmZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjMTU2ODQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvcGNpY2ZnLmgKQEAgLTAsMCArMSw4MjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgLSAyMDA4IFNlcnZlckVuZ2luZXMKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFRoZSBmdWxsIEdOVSBHZW5lcmFsCisgKiBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUgZmlsZSBjYWxsZWQgQ09QWUlORy4KKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogbGludXgtZHJpdmVyc0BzZXJ2ZXJlbmdpbmVzLmNvbQorICoKKyAqIFNlcnZlckVuZ2luZXMKKyAqIDIwOSBOLiBGYWlyIE9ha3MgQXZlCisgKiBTdW5ueXZhbGUsIENBIDk0MDg1CisgKi8KKy8qCisgKiBBdXRvZ2VuZXJhdGVkIGJ5IHNyY2dlbiB2ZXJzaW9uOiAwMTI3CisgKi8KKyNpZm5kZWYgX19wY2ljZmdfYW1hcF9oX18KKyNkZWZpbmUgX19wY2ljZmdfYW1hcF9oX18KKworLyogVmVuZG9yIGFuZCBEZXZpY2UgSUQgUmVnaXN0ZXIuICovCitzdHJ1Y3QgQkVfUENJQ0ZHX0lEX0NTUl9BTUFQIHsKKwl1OCB2ZW5kb3JpZFsxNl07CS8qIERXT1JEIDAgKi8KKwl1OCBkZXZpY2VpZFsxNl07CS8qIERXT1JEIDAgKi8KK30gX19wYWNrZWQ7CitzdHJ1Y3QgUENJQ0ZHX0lEX0NTUl9BTUFQIHsKKwl1MzIgZHdbMV07Cit9OworCisvKiBJTyBCYXIgUmVnaXN0ZXIuICovCitzdHJ1Y3QgQkVfUENJQ0ZHX0lPQkFSX0NTUl9BTUFQIHsKKwl1OCBpb3NwYWNlOwkJLyogRFdPUkQgMCAqLworCXU4IHJzdmQwWzddOwkvKiBEV09SRCAwICovCisJdTggaW9iYXJbMjRdOwkvKiBEV09SRCAwICovCit9IF9fcGFja2VkOworc3RydWN0IFBDSUNGR19JT0JBUl9DU1JfQU1BUCB7CisJdTMyIGR3WzFdOworfTsKKworLyogTWVtb3J5IEJBUiAwIFJlZ2lzdGVyLiAqLworc3RydWN0IEJFX1BDSUNGR19NRU1CQVIwX0NTUl9BTUFQIHsKKwl1OCBtZW1zcGFjZTsJLyogRFdPUkQgMCAqLworCXU4IHR5cGVbMl07CQkvKiBEV09SRCAwICovCisJdTggcGY7CQkvKiBEV09SRCAwICovCisJdTggcnN2ZDBbMTBdOwkvKiBEV09SRCAwICovCisJdTggbWVtYmFyMFsxOF07CS8qIERXT1JEIDAgKi8KK30gX19wYWNrZWQ7CitzdHJ1Y3QgUENJQ0ZHX01FTUJBUjBfQ1NSX0FNQVAgeworCXUzMiBkd1sxXTsKK307CisKKy8qIE1lbW9yeSBCQVIgMSAtIExvdyBBZGRyZXNzIFJlZ2lzdGVyLiAqLworc3RydWN0IEJFX1BDSUNGR19NRU1CQVIxX0xPX0NTUl9BTUFQIHsKKwl1OCBtZW1zcGFjZTsJLyogRFdPUkQgMCAqLworCXU4IHR5cGVbMl07CQkvKiBEV09SRCAwICovCisJdTggcGY7CQkvKiBEV09SRCAwICovCisJdTggcnN2ZDBbMTNdOwkvKiBEV09SRCAwICovCisJdTggbWVtYmFyMWxvWzE1XTsJLyogRFdPUkQgMCAqLworfSBfX3BhY2tlZDsKK3N0cnVjdCBQQ0lDRkdfTUVNQkFSMV9MT19DU1JfQU1BUCB7CisJdTMyIGR3WzFdOworfTsKKworLyogTWVtb3J5IEJBUiAxIC0gSGlnaCBBZGRyZXNzIFJlZ2lzdGVyLiAqLworc3RydWN0IEJFX1BDSUNGR19NRU1CQVIxX0hJX0NTUl9BTUFQIHsKKwl1OCBtZW1iYXIxaGlbMzJdOwkvKiBEV09SRCAwICovCit9IF9fcGFja2VkOworc3RydWN0IFBDSUNGR19NRU1CQVIxX0hJX0NTUl9BTUFQIHsKKwl1MzIgZHdbMV07Cit9OworCisvKiBNZW1vcnkgQkFSIDIgLSBMb3cgQWRkcmVzcyBSZWdpc3Rlci4gKi8KK3N0cnVjdCBCRV9QQ0lDRkdfTUVNQkFSMl9MT19DU1JfQU1BUCB7CisJdTggbWVtc3BhY2U7CS8qIERXT1JEIDAgKi8KKwl1OCB0eXBlWzJdOwkJLyogRFdPUkQgMCAqLworCXU4IHBmOwkJLyogRFdPUkQgMCAqLworCXU4IHJzdmQwWzE3XTsJLyogRFdPUkQgMCAqLworCXU4IG1lbWJhcjJsb1sxMV07CS8qIERXT1JEIDAgKi8KK30gX19wYWNrZWQ7CitzdHJ1Y3QgUENJQ0ZHX01FTUJBUjJfTE9fQ1NSX0FNQVAgeworCXUzMiBkd1sxXTsKK307CisKKy8qIE1lbW9yeSBCQVIgMiAtIEhpZ2ggQWRkcmVzcyBSZWdpc3Rlci4gKi8KK3N0cnVjdCBCRV9QQ0lDRkdfTUVNQkFSMl9ISV9DU1JfQU1BUCB7CisJdTggbWVtYmFyMmhpWzMyXTsJLyogRFdPUkQgMCAqLworfSBfX3BhY2tlZDsKK3N0cnVjdCBQQ0lDRkdfTUVNQkFSMl9ISV9DU1JfQU1BUCB7CisJdTMyIGR3WzFdOworfTsKKworLyogU3Vic3lzdGVtIFZlbmRvciBhbmQgSUQgKEZ1bmN0aW9uIDApIFJlZ2lzdGVyLiAqLworc3RydWN0IEJFX1BDSUNGR19TVUJTWVNURU1fSURfRjBfQ1NSX0FNQVAgeworCXU4IHN1YnN5c192ZW5kb3JfaWRbMTZdOwkvKiBEV09SRCAwICovCisJdTggc3Vic3lzX2lkWzE2XTsJLyogRFdPUkQgMCAqLworfSBfX3BhY2tlZDsKK3N0cnVjdCBQQ0lDRkdfU1VCU1lTVEVNX0lEX0YwX0NTUl9BTUFQIHsKKwl1MzIgZHdbMV07Cit9OworCisvKiBTdWJzeXN0ZW0gVmVuZG9yIGFuZCBJRCAoRnVuY3Rpb24gMSkgUmVnaXN0ZXIuICovCitzdHJ1Y3QgQkVfUENJQ0ZHX1NVQlNZU1RFTV9JRF9GMV9DU1JfQU1BUCB7CisJdTggc3Vic3lzX3ZlbmRvcl9pZFsxNl07CS8qIERXT1JEIDAgKi8KKwl1OCBzdWJzeXNfaWRbMTZdOwkvKiBEV09SRCAwICovCit9IF9fcGFja2VkOworc3RydWN0IFBDSUNGR19TVUJTWVNURU1fSURfRjFfQ1NSX0FNQVAgeworCXUzMiBkd1sxXTsKK307CisKKy8qIFNlbWFwaG9yZSBSZWdpc3Rlci4gKi8KK3N0cnVjdCBCRV9QQ0lDRkdfU0VNQVBIT1JFX0NTUl9BTUFQIHsKKwl1OCBsb2NrZWQ7CQkvKiBEV09SRCAwICovCisJdTggcnN2ZDBbMzFdOwkvKiBEV09SRCAwICovCit9IF9fcGFja2VkOworc3RydWN0IFBDSUNGR19TRU1BUEhPUkVfQ1NSX0FNQVAgeworCXUzMiBkd1sxXTsKK307CisKKy8qIFNvZnQgUmVzZXQgUmVnaXN0ZXIuICovCitzdHJ1Y3QgQkVfUENJQ0ZHX1NPRlRfUkVTRVRfQ1NSX0FNQVAgeworCXU4IHJzdmQwWzddOwkvKiBEV09SRCAwICovCisJdTggc29mdHJlc2V0OwkvKiBEV09SRCAwICovCisJdTggcnN2ZDFbMTZdOwkvKiBEV09SRCAwICovCisJdTggbmVjX2xsX3JjdmRldGVjdF9pWzhdOwkvKiBEV09SRCAwICovCit9IF9fcGFja2VkOworc3RydWN0IFBDSUNGR19TT0ZUX1JFU0VUX0NTUl9BTUFQIHsKKwl1MzIgZHdbMV07Cit9OworCisvKiBVbnJlY292ZXJhYmxlIEVycm9yIFN0YXR1cyAoTG93KSBSZWdpc3Rlci4gRWFjaCBiaXQgY29ycmVzcG9uZHMgdG8KKyAqIGFuIGludGVybmFsIFVucmVjb3ZlcmFibGUgRXJyb3IuICBUaGVzZSBhcmUgc2V0IGJ5IGhhcmR3YXJlIGFuZCBtYXkgYmUKKyAqIGNsZWFyZWQgYnkgd3JpdGluZyBhIG9uZSB0byB0aGUgcmVzcGVjdGl2ZSBiaXQocykgdG8gYmUgY2xlYXJlZC4gIEFueQorICogYml0IGJlaW5nIHNldCB0aGF0IGlzIGFsc28gdW5tYXNrZWQgd2lsbCByZXN1bHQgaW4gVW5yZWNvdmVyYWJsZSBFcnJvcgorICogaW50ZXJydXB0IG5vdGlmaWNhdGlvbiB0byB0aGUgaG9zdCBDUFUgYW5kL29yIFNlcnZlciBNYW5hZ2VtZW50IGNoaXAKKyAqIGFuZCB0aGUgdHJhbnNpdGlvbmluZyBvZiBCbGFkZUVuZ2luZSB0byBhbiBPZmZsaW5lIHN0YXRlLgorICovCitzdHJ1Y3QgQkVfUENJQ0ZHX1VFX1NUQVRVU19MT1dfQ1NSX0FNQVAgeworCXU4IGNldl91ZV9zdGF0dXM7CS8qIERXT1JEIDAgKi8KKwl1OCBjdHhfdWVfc3RhdHVzOwkvKiBEV09SRCAwICovCisJdTggZGJ1Zl91ZV9zdGF0dXM7CS8qIERXT1JEIDAgKi8KKwl1OCBlcnhfdWVfc3RhdHVzOwkvKiBEV09SRCAwICovCisJdTggaG9zdF91ZV9zdGF0dXM7CS8qIERXT1JEIDAgKi8KKwl1OCBtcHVfdWVfc3RhdHVzOwkvKiBEV09SRCAwICovCisJdTggbmRtYV91ZV9zdGF0dXM7CS8qIERXT1JEIDAgKi8KKwl1OCBwdGNfdWVfc3RhdHVzOwkvKiBEV09SRCAwICovCisJdTggcmRtYV91ZV9zdGF0dXM7CS8qIERXT1JEIDAgKi8KKwl1OCByeGZfdWVfc3RhdHVzOwkvKiBEV09SRCAwICovCisJdTggcnhpcHNfdWVfc3RhdHVzOwkvKiBEV09SRCAwICovCisJdTggcnh1bHAwX3VlX3N0YXR1czsJLyogRFdPUkQgMCAqLworCXU4IHJ4dWxwMV91ZV9zdGF0dXM7CS8qIERXT1JEIDAgKi8KKwl1OCByeHVscDJfdWVfc3RhdHVzOwkvKiBEV09SRCAwICovCisJdTggdGltX3VlX3N0YXR1czsJLyogRFdPUkQgMCAqLworCXU4IHRwb3N0X3VlX3N0YXR1czsJLyogRFdPUkQgMCAqLworCXU4IHRwcmVfdWVfc3RhdHVzOwkvKiBEV09SRCAwICovCisJdTggdHhpcHNfdWVfc3RhdHVzOwkvKiBEV09SRCAwICovCisJdTggdHh1bHAwX3VlX3N0YXR1czsJLyogRFdPUkQgMCAqLworCXU4IHR4dWxwMV91ZV9zdGF0dXM7CS8qIERXT1JEIDAgKi8KKwl1OCB1Y191ZV9zdGF0dXM7CS8qIERXT1JEIDAgKi8KKwl1OCB3ZG1hX3VlX3N0YXR1czsJLyogRFdPUkQgMCAqLworCXU4IHR4dWxwMl91ZV9zdGF0dXM7CS8qIERXT1JEIDAgKi8KKwl1OCBob3N0MV91ZV9zdGF0dXM7CS8qIERXT1JEIDAgKi8KKwl1OCBwMF9vYl9saW5rX3VlX3N0YXR1czsJLyogRFdPUkQgMCAqLworCXU4IHAxX29iX2xpbmtfdWVfc3RhdHVzOwkvKiBEV09SRCAwICovCisJdTggaG9zdF9ncGlvX3VlX3N0YXR1czsJLyogRFdPUkQgMCAqLworCXU4IG1ib3hfbmV0d191ZV9zdGF0dXM7CS8qIERXT1JEIDAgKi8KKwl1OCBtYm94X3N0b3JfdWVfc3RhdHVzOwkvKiBEV09SRCAwICovCisJdTggYXhnbWFjMF91ZV9zdGF0dXM7CS8qIERXT1JEIDAgKi8KKwl1OCBheGdtYWMxX3VlX3N0YXR1czsJLyogRFdPUkQgMCAqLworCXU4IG1wdV9pbnRwZW5kX3VlX3N0YXR1czsJLyogRFdPUkQgMCAqLworfSBfX3BhY2tlZDsKK3N0cnVjdCBQQ0lDRkdfVUVfU1RBVFVTX0xPV19DU1JfQU1BUCB7CisJdTMyIGR3WzFdOworfTsKKworLyogVW5yZWNvdmVyYWJsZSBFcnJvciBTdGF0dXMgKEhpZ2gpIFJlZ2lzdGVyLiBFYWNoIGJpdCBjb3JyZXNwb25kcyB0bworICogYW4gaW50ZXJuYWwgVW5yZWNvdmVyYWJsZSBFcnJvci4gIFRoZXNlIGFyZSBzZXQgYnkgaGFyZHdhcmUgYW5kIG1heSBiZQorICogY2xlYXJlZCBieSB3cml0aW5nIGEgb25lIHRvIHRoZSByZXNwZWN0aXZlIGJpdChzKSB0byBiZSBjbGVhcmVkLiAgQW55CisgKiBiaXQgYmVpbmcgc2V0IHRoYXQgaXMgYWxzbyB1bm1hc2tlZCB3aWxsIHJlc3VsdCBpbiBVbnJlY292ZXJhYmxlIEVycm9yCisgKiBpbnRlcnJ1cHQgbm90aWZpY2F0aW9uIHRvIHRoZSBob3N0IENQVSBhbmQvb3IgU2VydmVyIE1hbmFnZW1lbnQgY2hpcDsKKyAqIGFuZCB0aGUgdHJhbnNpdGlvbmluZyBvZiBCbGFkZUVuZ2luZSB0byBhbiBPZmZsaW5lIHN0YXRlLgorICovCitzdHJ1Y3QgQkVfUENJQ0ZHX1VFX1NUQVRVU19ISV9DU1JfQU1BUCB7CisJdTgganRhZ191ZV9zdGF0dXM7CS8qIERXT1JEIDAgKi8KKwl1OCBscGNtZW1ob3N0X3VlX3N0YXR1czsJLyogRFdPUkQgMCAqLworCXU4IG1nbXRfbWFjX3VlX3N0YXR1czsJLyogRFdPUkQgMCAqLworCXU4IG1wdV9pcmFtX3VlX3N0YXR1czsJLyogRFdPUkQgMCAqLworCXU4IHBjczBvbmxpbmVfdWVfc3RhdHVzOwkvKiBEV09SRCAwICovCisJdTggcGNzMW9ubGluZV91ZV9zdGF0dXM7CS8qIERXT1JEIDAgKi8KKwl1OCBwY3RsMF91ZV9zdGF0dXM7CS8qIERXT1JEIDAgKi8KKwl1OCBwY3RsMV91ZV9zdGF0dXM7CS8qIERXT1JEIDAgKi8KKwl1OCBwbWVtX3VlX3N0YXR1czsJLyogRFdPUkQgMCAqLworCXU4IHJyX3VlX3N0YXR1czsJLyogRFdPUkQgMCAqLworCXU4IHJ4cHBfdWVfc3RhdHVzOwkvKiBEV09SRCAwICovCisJdTggdHhwYl91ZV9zdGF0dXM7CS8qIERXT1JEIDAgKi8KKwl1OCB0eHBfdWVfc3RhdHVzOwkvKiBEV09SRCAwICovCisJdTggeGF1aV91ZV9zdGF0dXM7CS8qIERXT1JEIDAgKi8KKwl1OCBhcm1fdWVfc3RhdHVzOwkvKiBEV09SRCAwICovCisJdTggaXBjX3VlX3N0YXR1czsJLyogRFdPUkQgMCAqLworCXU4IHJzdmQwWzE2XTsJLyogRFdPUkQgMCAqLworfSBfX3BhY2tlZDsKK3N0cnVjdCBQQ0lDRkdfVUVfU1RBVFVTX0hJX0NTUl9BTUFQIHsKKwl1MzIgZHdbMV07Cit9OworCisvKiBVbnJlY292ZXJhYmxlIEVycm9yIE1hc2sgKExvdykgUmVnaXN0ZXIuIEVhY2ggYml0LCB3aGVuIHNldCB0byBvbmUsCisgKiB3aWxsIG1hc2sgdGhlIGFzc29jaWF0ZWQgVW5yZWNvdmVyYWJsZSAgRXJyb3Igc3RhdHVzIGJpdCBmcm9tIG5vdGlmaWNhdGlvbgorICogb2YgVW5yZWNvdmVyYWJsZSBFcnJvciB0byB0aGUgaG9zdCBDUFUgYW5kL29yIFNlcnZlciBNYW5hZ21lbnQgY2hpcCBhbmQgdGhlCisgKiB0cmFuc2l0aW9uaW5nIG9mIGFsbCBCbGFkZUVuZ2luZSB1bml0cyB0byBhbiBPZmZsaW5lIHN0YXRlLgorICovCitzdHJ1Y3QgQkVfUENJQ0ZHX1VFX1NUQVRVU19MT1dfTUFTS19DU1JfQU1BUCB7CisJdTggY2V2X3VlX21hc2s7CS8qIERXT1JEIDAgKi8KKwl1OCBjdHhfdWVfbWFzazsJLyogRFdPUkQgMCAqLworCXU4IGRidWZfdWVfbWFzazsJLyogRFdPUkQgMCAqLworCXU4IGVyeF91ZV9tYXNrOwkvKiBEV09SRCAwICovCisJdTggaG9zdF91ZV9tYXNrOwkvKiBEV09SRCAwICovCisJdTggbXB1X3VlX21hc2s7CS8qIERXT1JEIDAgKi8KKwl1OCBuZG1hX3VlX21hc2s7CS8qIERXT1JEIDAgKi8KKwl1OCBwdGNfdWVfbWFzazsJLyogRFdPUkQgMCAqLworCXU4IHJkbWFfdWVfbWFzazsJLyogRFdPUkQgMCAqLworCXU4IHJ4Zl91ZV9tYXNrOwkvKiBEV09SRCAwICovCisJdTggcnhpcHNfdWVfbWFzazsJLyogRFdPUkQgMCAqLworCXU4IHJ4dWxwMF91ZV9tYXNrOwkvKiBEV09SRCAwICovCisJdTggcnh1bHAxX3VlX21hc2s7CS8qIERXT1JEIDAgKi8KKwl1OCByeHVscDJfdWVfbWFzazsJLyogRFdPUkQgMCAqLworCXU4IHRpbV91ZV9tYXNrOwkvKiBEV09SRCAwICovCisJdTggdHBvc3RfdWVfbWFzazsJLyogRFdPUkQgMCAqLworCXU4IHRwcmVfdWVfbWFzazsJLyogRFdPUkQgMCAqLworCXU4IHR4aXBzX3VlX21hc2s7CS8qIERXT1JEIDAgKi8KKwl1OCB0eHVscDBfdWVfbWFzazsJLyogRFdPUkQgMCAqLworCXU4IHR4dWxwMV91ZV9tYXNrOwkvKiBEV09SRCAwICovCisJdTggdWNfdWVfbWFzazsJLyogRFdPUkQgMCAqLworCXU4IHdkbWFfdWVfbWFzazsJLyogRFdPUkQgMCAqLworCXU4IHR4dWxwMl91ZV9tYXNrOwkvKiBEV09SRCAwICovCisJdTggaG9zdDFfdWVfbWFzazsJLyogRFdPUkQgMCAqLworCXU4IHAwX29iX2xpbmtfdWVfbWFzazsJLyogRFdPUkQgMCAqLworCXU4IHAxX29iX2xpbmtfdWVfbWFzazsJLyogRFdPUkQgMCAqLworCXU4IGhvc3RfZ3Bpb191ZV9tYXNrOwkvKiBEV09SRCAwICovCisJdTggbWJveF9uZXR3X3VlX21hc2s7CS8qIERXT1JEIDAgKi8KKwl1OCBtYm94X3N0b3JfdWVfbWFzazsJLyogRFdPUkQgMCAqLworCXU4IGF4Z21hYzBfdWVfbWFzazsJLyogRFdPUkQgMCAqLworCXU4IGF4Z21hYzFfdWVfbWFzazsJLyogRFdPUkQgMCAqLworCXU4IG1wdV9pbnRwZW5kX3VlX21hc2s7CS8qIERXT1JEIDAgKi8KK30gX19wYWNrZWQ7CitzdHJ1Y3QgUENJQ0ZHX1VFX1NUQVRVU19MT1dfTUFTS19DU1JfQU1BUCB7CisJdTMyIGR3WzFdOworfTsKKworLyogVW5yZWNvdmVyYWJsZSBFcnJvciBNYXNrIChIaWdoKSBSZWdpc3Rlci4gRWFjaCBiaXQsIHdoZW4gc2V0IHRvIG9uZSwKKyAqIHdpbGwgbWFzayB0aGUgYXNzb2NpYXRlZCBVbnJlY292ZXJhYmxlIEVycm9yIHN0YXR1cyBiaXQgZnJvbSBub3RpZmljYXRpb24KKyAqIG9mIFVucmVjb3ZlcmFibGUgRXJyb3IgdG8gdGhlIGhvc3QgQ1BVIGFuZC9vciBTZXJ2ZXIgTWFuYWdtZW50IGNoaXAgYW5kIHRoZQorICogdHJhbnNpdGlvbmluZyBvZiBhbGwgQmxhZGVFbmdpbmUgdW5pdHMgdG8gYW4gT2ZmbGluZSBzdGF0ZS4KKyAqLworc3RydWN0IEJFX1BDSUNGR19VRV9TVEFUVVNfSElfTUFTS19DU1JfQU1BUCB7CisJdTgganRhZ191ZV9tYXNrOwkvKiBEV09SRCAwICovCisJdTggbHBjbWVtaG9zdF91ZV9tYXNrOwkvKiBEV09SRCAwICovCisJdTggbWdtdF9tYWNfdWVfbWFzazsJLyogRFdPUkQgMCAqLworCXU4IG1wdV9pcmFtX3VlX21hc2s7CS8qIERXT1JEIDAgKi8KKwl1OCBwY3Mwb25saW5lX3VlX21hc2s7CS8qIERXT1JEIDAgKi8KKwl1OCBwY3Mxb25saW5lX3VlX21hc2s7CS8qIERXT1JEIDAgKi8KKwl1OCBwY3RsMF91ZV9tYXNrOwkvKiBEV09SRCAwICovCisJdTggcGN0bDFfdWVfbWFzazsJLyogRFdPUkQgMCAqLworCXU4IHBtZW1fdWVfbWFzazsJLyogRFdPUkQgMCAqLworCXU4IHJyX3VlX21hc2s7CS8qIERXT1JEIDAgKi8KKwl1OCByeHBwX3VlX21hc2s7CS8qIERXT1JEIDAgKi8KKwl1OCB0eHBiX3VlX21hc2s7CS8qIERXT1JEIDAgKi8KKwl1OCB0eHBfdWVfbWFzazsJLyogRFdPUkQgMCAqLworCXU4IHhhdWlfdWVfbWFzazsJLyogRFdPUkQgMCAqLworCXU4IGFybV91ZV9tYXNrOwkvKiBEV09SRCAwICovCisJdTggaXBjX3VlX21hc2s7CS8qIERXT1JEIDAgKi8KKwl1OCByc3ZkMFsxNl07CS8qIERXT1JEIDAgKi8KK30gX19wYWNrZWQ7CitzdHJ1Y3QgUENJQ0ZHX1VFX1NUQVRVU19ISV9NQVNLX0NTUl9BTUFQIHsKKwl1MzIgZHdbMV07Cit9OworCisvKiBPbmxpbmUgQ29udHJvbCBSZWdpc3RlciAwLiBUaGlzIHJlZ2lzdGVyIGNvbnRyb2xzIHZhcmlvdXMgdW5pdHMgd2l0aGluCisgKiBCbGFkZUVuZ2luZSBiZWluZyBpbiBhbiBPbmxpbmUgb3IgT2ZmbGluZSBzdGF0ZS4KKyAqLworc3RydWN0IEJFX1BDSUNGR19PTkxJTkUwX0NTUl9BTUFQIHsKKwl1OCBjZXZfb25saW5lOwkvKiBEV09SRCAwICovCisJdTggY3R4X29ubGluZTsJLyogRFdPUkQgMCAqLworCXU4IGRidWZfb25saW5lOwkvKiBEV09SRCAwICovCisJdTggZXJ4X29ubGluZTsJLyogRFdPUkQgMCAqLworCXU4IGhvc3Rfb25saW5lOwkvKiBEV09SRCAwICovCisJdTggbXB1X29ubGluZTsJLyogRFdPUkQgMCAqLworCXU4IG5kbWFfb25saW5lOwkvKiBEV09SRCAwICovCisJdTggcHRjX29ubGluZTsJLyogRFdPUkQgMCAqLworCXU4IHJkbWFfb25saW5lOwkvKiBEV09SRCAwICovCisJdTggcnhmX29ubGluZTsJLyogRFdPUkQgMCAqLworCXU4IHJ4aXBzX29ubGluZTsJLyogRFdPUkQgMCAqLworCXU4IHJ4dWxwMF9vbmxpbmU7CS8qIERXT1JEIDAgKi8KKwl1OCByeHVscDFfb25saW5lOwkvKiBEV09SRCAwICovCisJdTggcnh1bHAyX29ubGluZTsJLyogRFdPUkQgMCAqLworCXU4IHRpbV9vbmxpbmU7CS8qIERXT1JEIDAgKi8KKwl1OCB0cG9zdF9vbmxpbmU7CS8qIERXT1JEIDAgKi8KKwl1OCB0cHJlX29ubGluZTsJLyogRFdPUkQgMCAqLworCXU4IHR4aXBzX29ubGluZTsJLyogRFdPUkQgMCAqLworCXU4IHR4dWxwMF9vbmxpbmU7CS8qIERXT1JEIDAgKi8KKwl1OCB0eHVscDFfb25saW5lOwkvKiBEV09SRCAwICovCisJdTggdWNfb25saW5lOwkvKiBEV09SRCAwICovCisJdTggd2RtYV9vbmxpbmU7CS8qIERXT1JEIDAgKi8KKwl1OCB0eHVscDJfb25saW5lOwkvKiBEV09SRCAwICovCisJdTggaG9zdDFfb25saW5lOwkvKiBEV09SRCAwICovCisJdTggcDBfb2JfbGlua19vbmxpbmU7CS8qIERXT1JEIDAgKi8KKwl1OCBwMV9vYl9saW5rX29ubGluZTsJLyogRFdPUkQgMCAqLworCXU4IGhvc3RfZ3Bpb19vbmxpbmU7CS8qIERXT1JEIDAgKi8KKwl1OCBtYm94X25ldHdfb25saW5lOwkvKiBEV09SRCAwICovCisJdTggbWJveF9zdG9yX29ubGluZTsJLyogRFdPUkQgMCAqLworCXU4IGF4Z21hYzBfb25saW5lOwkvKiBEV09SRCAwICovCisJdTggYXhnbWFjMV9vbmxpbmU7CS8qIERXT1JEIDAgKi8KKwl1OCBtcHVfaW50cGVuZF9vbmxpbmU7CS8qIERXT1JEIDAgKi8KK30gX19wYWNrZWQ7CitzdHJ1Y3QgUENJQ0ZHX09OTElORTBfQ1NSX0FNQVAgeworCXUzMiBkd1sxXTsKK307CisKKy8qIE9ubGluZSBDb250cm9sIFJlZ2lzdGVyIDEuIFRoaXMgcmVnaXN0ZXIgY29udHJvbHMgdmFyaW91cyB1bml0cyB3aXRoaW4KKyAqIEJsYWRlRW5naW5lIGJlaW5nIGluIGFuIE9ubGluZSBvciBPZmZsaW5lIHN0YXRlLgorICovCitzdHJ1Y3QgQkVfUENJQ0ZHX09OTElORTFfQ1NSX0FNQVAgeworCXU4IGp0YWdfb25saW5lOwkvKiBEV09SRCAwICovCisJdTggbHBjbWVtaG9zdF9vbmxpbmU7CS8qIERXT1JEIDAgKi8KKwl1OCBtZ210X21hY19vbmxpbmU7CS8qIERXT1JEIDAgKi8KKwl1OCBtcHVfaXJhbV9vbmxpbmU7CS8qIERXT1JEIDAgKi8KKwl1OCBwY3Mwb25saW5lX29ubGluZTsJLyogRFdPUkQgMCAqLworCXU4IHBjczFvbmxpbmVfb25saW5lOwkvKiBEV09SRCAwICovCisJdTggcGN0bDBfb25saW5lOwkvKiBEV09SRCAwICovCisJdTggcGN0bDFfb25saW5lOwkvKiBEV09SRCAwICovCisJdTggcG1lbV9vbmxpbmU7CS8qIERXT1JEIDAgKi8KKwl1OCBycl9vbmxpbmU7CS8qIERXT1JEIDAgKi8KKwl1OCByeHBwX29ubGluZTsJLyogRFdPUkQgMCAqLworCXU4IHR4cGJfb25saW5lOwkvKiBEV09SRCAwICovCisJdTggdHhwX29ubGluZTsJLyogRFdPUkQgMCAqLworCXU4IHhhdWlfb25saW5lOwkvKiBEV09SRCAwICovCisJdTggYXJtX29ubGluZTsJLyogRFdPUkQgMCAqLworCXU4IGlwY19vbmxpbmU7CS8qIERXT1JEIDAgKi8KKwl1OCByc3ZkMFsxNl07CS8qIERXT1JEIDAgKi8KK30gX19wYWNrZWQ7CitzdHJ1Y3QgUENJQ0ZHX09OTElORTFfQ1NSX0FNQVAgeworCXUzMiBkd1sxXTsKK307CisKKy8qIEhvc3QgVGltZXIgUmVnaXN0ZXIuICovCitzdHJ1Y3QgQkVfUENJQ0ZHX0hPU1RfVElNRVJfSU5UX0NUUkxfQ1NSX0FNQVAgeworCXU4IGhvc3R0aW1lclsyNF07CS8qIERXT1JEIDAgKi8KKwl1OCBob3N0aW50cjsJLyogRFdPUkQgMCAqLworCXU4IHJzdmQwWzddOwkvKiBEV09SRCAwICovCit9IF9fcGFja2VkOworc3RydWN0IFBDSUNGR19IT1NUX1RJTUVSX0lOVF9DVFJMX0NTUl9BTUFQIHsKKwl1MzIgZHdbMV07Cit9OworCisvKiBTY3JhdGNocGFkIFJlZ2lzdGVyIChmb3Igc29mdHdhcmUgdXNlKS4gKi8KK3N0cnVjdCBCRV9QQ0lDRkdfU0NSQVRDSFBBRF9DU1JfQU1BUCB7CisJdTggc2NyYXRjaHBhZFszMl07CS8qIERXT1JEIDAgKi8KK30gX19wYWNrZWQ7CitzdHJ1Y3QgUENJQ0ZHX1NDUkFUQ0hQQURfQ1NSX0FNQVAgeworCXUzMiBkd1sxXTsKK307CisKKy8qIFBDSSBFeHByZXNzIENhcGFiaWxpdGllcyBSZWdpc3Rlci4gKi8KK3N0cnVjdCBCRV9QQ0lDRkdfUENJRV9DQVBfQ1NSX0FNQVAgeworCXU4IGNhcGlkWzhdOwkvKiBEV09SRCAwICovCisJdTggbmV4dGNhcFs4XTsJLyogRFdPUkQgMCAqLworCXU4IGNhcHZlcls0XTsJLyogRFdPUkQgMCAqLworCXU4IGRldnBvcnRbNF07CS8qIERXT1JEIDAgKi8KKwl1OCByc3ZkMFs2XTsJLyogRFdPUkQgMCAqLworCXU4IHJzdmQxWzJdOwkvKiBEV09SRCAwICovCit9IF9fcGFja2VkOworc3RydWN0IFBDSUNGR19QQ0lFX0NBUF9DU1JfQU1BUCB7CisJdTMyIGR3WzFdOworfTsKKworLyogUENJIEV4cHJlc3MgRGV2aWNlIENhcGFiaWxpdGllcyBSZWdpc3Rlci4gKi8KK3N0cnVjdCBCRV9QQ0lDRkdfUENJRV9ERVZDQVBfQ1NSX0FNQVAgeworCXU4IHBheWxvYWRbM107CS8qIERXT1JEIDAgKi8KKwl1OCByc3ZkMFszXTsJLyogRFdPUkQgMCAqLworCXU4IGxvX2xhdFszXTsJLyogRFdPUkQgMCAqLworCXU4IGwxX2xhdFszXTsJLyogRFdPUkQgMCAqLworCXU4IHJzdmQxWzNdOwkvKiBEV09SRCAwICovCisJdTggcnN2ZDJbM107CS8qIERXT1JEIDAgKi8KKwl1OCBwd3JfdmFsdWVbOF07CS8qIERXT1JEIDAgKi8KKwl1OCBwd3Jfc2NhbGVbMl07CS8qIERXT1JEIDAgKi8KKwl1OCByc3ZkM1s0XTsJLyogRFdPUkQgMCAqLworfSBfX3BhY2tlZDsKK3N0cnVjdCBQQ0lDRkdfUENJRV9ERVZDQVBfQ1NSX0FNQVAgeworCXUzMiBkd1sxXTsKK307CisKKy8qIFBDSSBFeHByZXNzIERldmljZSBDb250cm9sL1N0YXR1cyBSZWdpc3RlcnMuICovCitzdHJ1Y3QgQkVfUENJQ0ZHX1BDSUVfQ09OVFJPTF9TVEFUVVNfQ1NSX0FNQVAgeworCXU4IENvcnJFcnJSZXBvcnRFbjsJLyogRFdPUkQgMCAqLworCXU4IE5vbkZhdGFsRXJyUmVwb3J0RW47CS8qIERXT1JEIDAgKi8KKwl1OCBGYXRhbEVyclJlcG9ydEVuOwkvKiBEV09SRCAwICovCisJdTggVW5zdXBwUmVxUmVwb3J0RW47CS8qIERXT1JEIDAgKi8KKwl1OCBFbmFibGVSZWxheE9yZGVyOwkvKiBEV09SRCAwICovCisJdTggTWF4X1BheWxvYWRfU2l6ZVszXTsJLyogRFdPUkQgMCAqLworCXU4IEV4dGVuZFRhZ0ZpZWxkRW5hYmxlOwkvKiBEV09SRCAwICovCisJdTggUGhhbnRvbUZuRW5hYmxlOwkvKiBEV09SRCAwICovCisJdTggQXV4UHdyUE1FbmFibGU7CS8qIERXT1JEIDAgKi8KKwl1OCBFbmFibGVOb1Nub29wOwkvKiBEV09SRCAwICovCisJdTggTWF4X1JlYWRfUmVxX1NpemVbM107CS8qIERXT1JEIDAgKi8KKwl1OCByc3ZkMDsJCS8qIERXT1JEIDAgKi8KKwl1OCBDb3JyRXJyRGV0ZWN0OwkvKiBEV09SRCAwICovCisJdTggTm9uRmF0YWxFcnJEZXRlY3Q7CS8qIERXT1JEIDAgKi8KKwl1OCBGYXRhbEVyckRldGVjdDsJLyogRFdPUkQgMCAqLworCXU4IFVuc3VwcFJlcURldGVjdDsJLyogRFdPUkQgMCAqLworCXU4IEF1eFB3ckRldGVjdDsJLyogRFdPUkQgMCAqLworCXU4IFRyYW5zUGVuZGluZzsJLyogRFdPUkQgMCAqLworCXU4IHJzdmQxWzEwXTsJLyogRFdPUkQgMCAqLworfSBfX3BhY2tlZDsKK3N0cnVjdCBQQ0lDRkdfUENJRV9DT05UUk9MX1NUQVRVU19DU1JfQU1BUCB7CisJdTMyIGR3WzFdOworfTsKKworLyogUENJIEV4cHJlc3MgTGluayBDYXBhYmlsaXRpZXMgUmVnaXN0ZXIuICovCitzdHJ1Y3QgQkVfUENJQ0ZHX1BDSUVfTElOS19DQVBfQ1NSX0FNQVAgeworCXU4IE1heExpbmtTcGVlZFs0XTsJLyogRFdPUkQgMCAqLworCXU4IE1heExpbmtXaWR0aFs2XTsJLyogRFdPUkQgMCAqLworCXU4IEFTUE1TdXBwb3J0WzJdOwkvKiBEV09SRCAwICovCisJdTggTDBzRXhpdExhdFszXTsJLyogRFdPUkQgMCAqLworCXU4IEwxRXhpdExhdFszXTsJLyogRFdPUkQgMCAqLworCXU4IHJzdmQwWzZdOwkvKiBEV09SRCAwICovCisJdTggUG9ydE51bVs4XTsJLyogRFdPUkQgMCAqLworfSBfX3BhY2tlZDsKK3N0cnVjdCBQQ0lDRkdfUENJRV9MSU5LX0NBUF9DU1JfQU1BUCB7CisJdTMyIGR3WzFdOworfTsKKworLyogUENJIEV4cHJlc3MgTGluayBTdGF0dXMgUmVnaXN0ZXIuICovCitzdHJ1Y3QgQkVfUENJQ0ZHX1BDSUVfTElOS19TVEFUVVNfQ1NSX0FNQVAgeworCXU4IEFTUE1DdGxbMl07CS8qIERXT1JEIDAgKi8KKwl1OCByc3ZkMDsJCS8qIERXT1JEIDAgKi8KKwl1OCBSZWFkQ21wbEJuZHJ5OwkvKiBEV09SRCAwICovCisJdTggTGlua0Rpc2FibGU7CS8qIERXT1JEIDAgKi8KKwl1OCBSZXRyYWluTGluazsJLyogRFdPUkQgMCAqLworCXU4IENvbW1vbkNsa0NvbmZpZzsJLyogRFdPUkQgMCAqLworCXU4IEV4dGVuZFN5bmM7CS8qIERXT1JEIDAgKi8KKwl1OCByc3ZkMVs4XTsJLyogRFdPUkQgMCAqLworCXU4IExpbmtTcGVlZFs0XTsJLyogRFdPUkQgMCAqLworCXU4IE5lZ0xpbmtXaWR0aFs2XTsJLyogRFdPUkQgMCAqLworCXU4IExpbmtUcmFpbkVycjsJLyogRFdPUkQgMCAqLworCXU4IExpbmtUcmFpbjsJLyogRFdPUkQgMCAqLworCXU4IFNsb3RDbGtDb25maWc7CS8qIERXT1JEIDAgKi8KKwl1OCByc3ZkMlszXTsJLyogRFdPUkQgMCAqLworfSBfX3BhY2tlZDsKK3N0cnVjdCBQQ0lDRkdfUENJRV9MSU5LX1NUQVRVU19DU1JfQU1BUCB7CisJdTMyIGR3WzFdOworfTsKKworLyogUENJIEV4cHJlc3MgTVNJIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIuICovCitzdHJ1Y3QgQkVfUENJQ0ZHX01TSV9DU1JfQU1BUCB7CisJdTggY2FwaWRbOF07CS8qIERXT1JEIDAgKi8KKwl1OCBuZXh0cHRyWzhdOwkvKiBEV09SRCAwICovCisJdTggdGFibGVzaXplWzExXTsJLyogRFdPUkQgMCAqLworCXU4IHJzdmQwWzNdOwkvKiBEV09SRCAwICovCisJdTggZnVuY21hc2s7CS8qIERXT1JEIDAgKi8KKwl1OCBlbjsJCS8qIERXT1JEIDAgKi8KK30gX19wYWNrZWQ7CitzdHJ1Y3QgUENJQ0ZHX01TSV9DU1JfQU1BUCB7CisJdTMyIGR3WzFdOworfTsKKworLyogTVNJLVggVGFibGUgT2Zmc2V0IFJlZ2lzdGVyLiAqLworc3RydWN0IEJFX1BDSUNGR19NU0lYX1RBQkxFX0NTUl9BTUFQIHsKKwl1OCB0YWJsZWJpclszXTsJLyogRFdPUkQgMCAqLworCXU4IG9mZnNldFsyOV07CS8qIERXT1JEIDAgKi8KK30gX19wYWNrZWQ7CitzdHJ1Y3QgUENJQ0ZHX01TSVhfVEFCTEVfQ1NSX0FNQVAgeworCXUzMiBkd1sxXTsKK307CisKKy8qIE1TSS1YIFBCQSBPZmZzZXQgUmVnaXN0ZXIuICovCitzdHJ1Y3QgQkVfUENJQ0ZHX01TSVhfUEJBX0NTUl9BTUFQIHsKKwl1OCBwYmFiaXJbM107CS8qIERXT1JEIDAgKi8KKwl1OCBvZmZzZXRbMjldOwkvKiBEV09SRCAwICovCit9IF9fcGFja2VkOworc3RydWN0IFBDSUNGR19NU0lYX1BCQV9DU1JfQU1BUCB7CisJdTMyIGR3WzFdOworfTsKKworLyogUENJIEV4cHJlc3MgTVNJLVggTWVzc2FnZSBWZWN0b3IgQ29udHJvbCBSZWdpc3Rlci4gKi8KK3N0cnVjdCBCRV9QQ0lDRkdfTVNJWF9WRUNUT1JfQ09OVFJPTF9DU1JfQU1BUCB7CisJdTggdmVjdG9yX2NvbnRyb2w7CS8qIERXT1JEIDAgKi8KKwl1OCByc3ZkMFszMV07CS8qIERXT1JEIDAgKi8KK30gX19wYWNrZWQ7CitzdHJ1Y3QgUENJQ0ZHX01TSVhfVkVDVE9SX0NPTlRST0xfQ1NSX0FNQVAgeworCXUzMiBkd1sxXTsKK307CisKKy8qIFBDSSBFeHByZXNzIE1TSS1YIE1lc3NhZ2UgRGF0YSBSZWdpc3Rlci4gKi8KK3N0cnVjdCBCRV9QQ0lDRkdfTVNJWF9NU0dfREFUQV9DU1JfQU1BUCB7CisJdTggZGF0YVsxNl07CS8qIERXT1JEIDAgKi8KKwl1OCByc3ZkMFsxNl07CS8qIERXT1JEIDAgKi8KK30gX19wYWNrZWQ7CitzdHJ1Y3QgUENJQ0ZHX01TSVhfTVNHX0RBVEFfQ1NSX0FNQVAgeworCXUzMiBkd1sxXTsKK307CisKKy8qIFBDSSBFeHByZXNzIE1TSS1YIE1lc3NhZ2UgQWRkcmVzcyBSZWdpc3RlciAtIEhpZ2ggUGFydC4gKi8KK3N0cnVjdCBCRV9QQ0lDRkdfTVNJWF9NU0dfQUREUl9ISV9DU1JfQU1BUCB7CisJdTggYWRkclszMl07CS8qIERXT1JEIDAgKi8KK30gX19wYWNrZWQ7CitzdHJ1Y3QgUENJQ0ZHX01TSVhfTVNHX0FERFJfSElfQ1NSX0FNQVAgeworCXUzMiBkd1sxXTsKK307CisKKy8qIFBDSSBFeHByZXNzIE1TSS1YIE1lc3NhZ2UgQWRkcmVzcyBSZWdpc3RlciAtIExvdyBQYXJ0LiAqLworc3RydWN0IEJFX1BDSUNGR19NU0lYX01TR19BRERSX0xPX0NTUl9BTUFQIHsKKwl1OCByc3ZkMFsyXTsJLyogRFdPUkQgMCAqLworCXU4IGFkZHJbMzBdOwkvKiBEV09SRCAwICovCit9IF9fcGFja2VkOworc3RydWN0IFBDSUNGR19NU0lYX01TR19BRERSX0xPX0NTUl9BTUFQIHsKKwl1MzIgZHdbMV07Cit9OworCitzdHJ1Y3QgQkVfUENJQ0ZHX0FOT05fMThfUlNWRF9BTUFQIHsKKwl1OCByc3ZkMFszMl07CS8qIERXT1JEIDAgKi8KK30gX19wYWNrZWQ7CitzdHJ1Y3QgUENJQ0ZHX0FOT05fMThfUlNWRF9BTUFQIHsKKwl1MzIgZHdbMV07Cit9OworCitzdHJ1Y3QgQkVfUENJQ0ZHX0FOT05fMTlfUlNWRF9BTUFQIHsKKwl1OCByc3ZkMFszMl07CS8qIERXT1JEIDAgKi8KK30gX19wYWNrZWQ7CitzdHJ1Y3QgUENJQ0ZHX0FOT05fMTlfUlNWRF9BTUFQIHsKKwl1MzIgZHdbMV07Cit9OworCitzdHJ1Y3QgQkVfUENJQ0ZHX0FOT05fMjBfUlNWRF9BTUFQIHsKKwl1OCByc3ZkMFszMl07CS8qIERXT1JEIDAgKi8KKwl1OCByc3ZkMVsyNV1bMzJdOwkvKiBEV09SRCAxICovCit9IF9fcGFja2VkOworc3RydWN0IFBDSUNGR19BTk9OXzIwX1JTVkRfQU1BUCB7CisJdTMyIGR3WzI2XTsKK307CisKK3N0cnVjdCBCRV9QQ0lDRkdfQU5PTl8yMV9SU1ZEX0FNQVAgeworCXU4IHJzdmQwWzMyXTsJLyogRFdPUkQgMCAqLworCXU4IHJzdmQxWzE5MTldWzMyXTsJLyogRFdPUkQgMSAqLworfSBfX3BhY2tlZDsKK3N0cnVjdCBQQ0lDRkdfQU5PTl8yMV9SU1ZEX0FNQVAgeworCXUzMiBkd1sxOTIwXTsKK307CisKK3N0cnVjdCBCRV9QQ0lDRkdfQU5PTl8yMl9NRVNTQUdFX0FNQVAgeworCXN0cnVjdCBCRV9QQ0lDRkdfTVNJWF9WRUNUT1JfQ09OVFJPTF9DU1JfQU1BUCB2ZWNfY3RybDsKKwlzdHJ1Y3QgQkVfUENJQ0ZHX01TSVhfTVNHX0RBVEFfQ1NSX0FNQVAgbXNnX2RhdGE7CisJc3RydWN0IEJFX1BDSUNGR19NU0lYX01TR19BRERSX0hJX0NTUl9BTUFQIGFkZHJfaGk7CisJc3RydWN0IEJFX1BDSUNGR19NU0lYX01TR19BRERSX0xPX0NTUl9BTUFQIGFkZHJfbG93OworfSBfX3BhY2tlZDsKK3N0cnVjdCBQQ0lDRkdfQU5PTl8yMl9NRVNTQUdFX0FNQVAgeworCXUzMiBkd1s0XTsKK307CisKK3N0cnVjdCBCRV9QQ0lDRkdfQU5PTl8yM19SU1ZEX0FNQVAgeworCXU4IHJzdmQwWzMyXTsJLyogRFdPUkQgMCAqLworCXU4IHJzdmQxWzg5NV1bMzJdOwkvKiBEV09SRCAxICovCit9IF9fcGFja2VkOworc3RydWN0IFBDSUNGR19BTk9OXzIzX1JTVkRfQU1BUCB7CisJdTMyIGR3Wzg5Nl07Cit9OworCisvKiBUaGVzZSBQQ0kgQ29uZmlndXJhdGlvbiBTcGFjZSByZWdpc3RlcnMgYXJlIGZvciB0aGUgU3RvcmFnZSAgRnVuY3Rpb24gb2YKKyAqIEJsYWRlRW5naW5lIChGdW5jdGlvbiAwKS4gSW4gdGhlIG1lbW9yeSBtYXAgb2YgdGhlIHJlZ2lzdGVycyBiZWxvdyB0aGVpcgorICogdGFibGUsCisgKi8KK3N0cnVjdCBCRV9QQ0lDRkcwX0NTUk1BUF9BTUFQIHsKKwlzdHJ1Y3QgQkVfUENJQ0ZHX0lEX0NTUl9BTUFQIGlkOworCXU4IHJzdmQwWzMyXTsJLyogRFdPUkQgMSAqLworCXU4IHJzdmQxWzMyXTsJLyogRFdPUkQgMiAqLworCXU4IHJzdmQyWzMyXTsJLyogRFdPUkQgMyAqLworCXN0cnVjdCBCRV9QQ0lDRkdfSU9CQVJfQ1NSX0FNQVAgaW9iYXI7CisJc3RydWN0IEJFX1BDSUNGR19NRU1CQVIwX0NTUl9BTUFQIG1lbWJhcjA7CisJc3RydWN0IEJFX1BDSUNGR19NRU1CQVIxX0xPX0NTUl9BTUFQIG1lbWJhcjFfbG87CisJc3RydWN0IEJFX1BDSUNGR19NRU1CQVIxX0hJX0NTUl9BTUFQIG1lbWJhcjFfaGk7CisJc3RydWN0IEJFX1BDSUNGR19NRU1CQVIyX0xPX0NTUl9BTUFQIG1lbWJhcjJfbG87CisJc3RydWN0IEJFX1BDSUNGR19NRU1CQVIyX0hJX0NTUl9BTUFQIG1lbWJhcjJfaGk7CisJdTggcnN2ZDNbMzJdOwkvKiBEV09SRCAxMCAqLworCXN0cnVjdCBCRV9QQ0lDRkdfU1VCU1lTVEVNX0lEX0YwX0NTUl9BTUFQIHN1YnN5c3RlbV9pZDsKKwl1OCByc3ZkNFszMl07CS8qIERXT1JEIDEyICovCisJdTggcnN2ZDVbMzJdOwkvKiBEV09SRCAxMyAqLworCXU4IHJzdmQ2WzMyXTsJLyogRFdPUkQgMTQgKi8KKwl1OCByc3ZkN1szMl07CS8qIERXT1JEIDE1ICovCisJc3RydWN0IEJFX1BDSUNGR19TRU1BUEhPUkVfQ1NSX0FNQVAgc2VtYXBob3JlWzRdOworCXN0cnVjdCBCRV9QQ0lDRkdfU09GVF9SRVNFVF9DU1JfQU1BUCBzb2Z0X3Jlc2V0OworCXU4IHJzdmQ4WzMyXTsJLyogRFdPUkQgMjEgKi8KKwlzdHJ1Y3QgQkVfUENJQ0ZHX1NDUkFUQ0hQQURfQ1NSX0FNQVAgc2NyYXRjaHBhZDsKKwl1OCByc3ZkOVszMl07CS8qIERXT1JEIDIzICovCisJdTggcnN2ZDEwWzMyXTsJLyogRFdPUkQgMjQgKi8KKwl1OCByc3ZkMTFbMzJdOwkvKiBEV09SRCAyNSAqLworCXU4IHJzdmQxMlszMl07CS8qIERXT1JEIDI2ICovCisJdTggcnN2ZDEzWzMyXTsJLyogRFdPUkQgMjcgKi8KKwl1OCByc3ZkMTRbMl1bMzJdOwkvKiBEV09SRCAyOCAqLworCXU4IHJzdmQxNVszMl07CS8qIERXT1JEIDMwICovCisJdTggcnN2ZDE2WzMyXTsJLyogRFdPUkQgMzEgKi8KKwl1OCByc3ZkMTdbOF1bMzJdOwkvKiBEV09SRCAzMiAqLworCXN0cnVjdCBCRV9QQ0lDRkdfVUVfU1RBVFVTX0xPV19DU1JfQU1BUCB1ZV9zdGF0dXNfbG93OworCXN0cnVjdCBCRV9QQ0lDRkdfVUVfU1RBVFVTX0hJX0NTUl9BTUFQIHVlX3N0YXR1c19oaTsKKwlzdHJ1Y3QgQkVfUENJQ0ZHX1VFX1NUQVRVU19MT1dfTUFTS19DU1JfQU1BUCB1ZV9zdGF0dXNfbG93X21hc2s7CisJc3RydWN0IEJFX1BDSUNGR19VRV9TVEFUVVNfSElfTUFTS19DU1JfQU1BUCB1ZV9zdGF0dXNfaGlfbWFzazsKKwlzdHJ1Y3QgQkVfUENJQ0ZHX09OTElORTBfQ1NSX0FNQVAgb25saW5lMDsKKwlzdHJ1Y3QgQkVfUENJQ0ZHX09OTElORTFfQ1NSX0FNQVAgb25saW5lMTsKKwl1OCByc3ZkMThbMzJdOwkvKiBEV09SRCA0NiAqLworCXU4IHJzdmQxOVszMl07CS8qIERXT1JEIDQ3ICovCisJdTggcnN2ZDIwWzMyXTsJLyogRFdPUkQgNDggKi8KKwl1OCByc3ZkMjFbMzJdOwkvKiBEV09SRCA0OSAqLworCXN0cnVjdCBCRV9QQ0lDRkdfSE9TVF9USU1FUl9JTlRfQ1RSTF9DU1JfQU1BUCBob3N0X3RpbWVyX2ludF9jdHJsOworCXU4IHJzdmQyMlszMl07CS8qIERXT1JEIDUxICovCisJc3RydWN0IEJFX1BDSUNGR19QQ0lFX0NBUF9DU1JfQU1BUCBwY2llX2NhcDsKKwlzdHJ1Y3QgQkVfUENJQ0ZHX1BDSUVfREVWQ0FQX0NTUl9BTUFQIHBjaWVfZGV2Y2FwOworCXN0cnVjdCBCRV9QQ0lDRkdfUENJRV9DT05UUk9MX1NUQVRVU19DU1JfQU1BUCBwY2llX2NvbnRyb2xfc3RhdHVzOworCXN0cnVjdCBCRV9QQ0lDRkdfUENJRV9MSU5LX0NBUF9DU1JfQU1BUCBwY2llX2xpbmtfY2FwOworCXN0cnVjdCBCRV9QQ0lDRkdfUENJRV9MSU5LX1NUQVRVU19DU1JfQU1BUCBwY2llX2xpbmtfc3RhdHVzOworCXN0cnVjdCBCRV9QQ0lDRkdfTVNJX0NTUl9BTUFQIG1zaTsKKwlzdHJ1Y3QgQkVfUENJQ0ZHX01TSVhfVEFCTEVfQ1NSX0FNQVAgbXNpeF90YWJsZV9vZmZzZXQ7CisJc3RydWN0IEJFX1BDSUNGR19NU0lYX1BCQV9DU1JfQU1BUCBtc2l4X3BiYV9vZmZzZXQ7CisJdTggcnN2ZDIzWzMyXTsJLyogRFdPUkQgNjAgKi8KKwl1OCByc3ZkMjRbMzJdOwkvKiBEV09SRCA2MSAqLworCXU4IHJzdmQyNVszMl07CS8qIERXT1JEIDYyICovCisJdTggcnN2ZDI2WzMyXTsJLyogRFdPUkQgNjMgKi8KKwl1OCByc3ZkMjdbMzJdOwkvKiBEV09SRCA2NCAqLworCXU4IHJzdmQyOFszMl07CS8qIERXT1JEIDY1ICovCisJdTggcnN2ZDI5WzMyXTsJLyogRFdPUkQgNjYgKi8KKwl1OCByc3ZkMzBbMzJdOwkvKiBEV09SRCA2NyAqLworCXU4IHJzdmQzMVszMl07CS8qIERXT1JEIDY4ICovCisJdTggcnN2ZDMyWzMyXTsJLyogRFdPUkQgNjkgKi8KKwl1OCByc3ZkMzNbMzJdOwkvKiBEV09SRCA3MCAqLworCXU4IHJzdmQzNFszMl07CS8qIERXT1JEIDcxICovCisJdTggcnN2ZDM1WzMyXTsJLyogRFdPUkQgNzIgKi8KKwl1OCByc3ZkMzZbMzJdOwkvKiBEV09SRCA3MyAqLworCXU4IHJzdmQzN1szMl07CS8qIERXT1JEIDc0ICovCisJdTggcnN2ZDM4WzMyXTsJLyogRFdPUkQgNzUgKi8KKwl1OCByc3ZkMzlbMzJdOwkvKiBEV09SRCA3NiAqLworCXU4IHJzdmQ0MFszMl07CS8qIERXT1JEIDc3ICovCisJdTggcnN2ZDQxWzMyXTsJLyogRFdPUkQgNzggKi8KKwl1OCByc3ZkNDJbMzJdOwkvKiBEV09SRCA3OSAqLworCXU4IHJzdmQ0M1szMl07CS8qIERXT1JEIDgwICovCisJdTggcnN2ZDQ0WzMyXTsJLyogRFdPUkQgODEgKi8KKwl1OCByc3ZkNDVbMzJdOwkvKiBEV09SRCA4MiAqLworCXU4IHJzdmQ0NlszMl07CS8qIERXT1JEIDgzICovCisJdTggcnN2ZDQ3WzMyXTsJLyogRFdPUkQgODQgKi8KKwl1OCByc3ZkNDhbMzJdOwkvKiBEV09SRCA4NSAqLworCXU4IHJzdmQ0OVszMl07CS8qIERXT1JEIDg2ICovCisJdTggcnN2ZDUwWzMyXTsJLyogRFdPUkQgODcgKi8KKwl1OCByc3ZkNTFbMzJdOwkvKiBEV09SRCA4OCAqLworCXU4IHJzdmQ1MlszMl07CS8qIERXT1JEIDg5ICovCisJdTggcnN2ZDUzWzMyXTsJLyogRFdPUkQgOTAgKi8KKwl1OCByc3ZkNTRbMzJdOwkvKiBEV09SRCA5MSAqLworCXU4IHJzdmQ1NVszMl07CS8qIERXT1JEIDkyICovCisJdTggcnN2ZDU2WzgzMl07CS8qIERXT1JEIDkzICovCisJdTggcnN2ZDU3WzMyXTsJLyogRFdPUkQgMTE5ICovCisJdTggcnN2ZDU4WzMyXTsJLyogRFdPUkQgMTIwICovCisJdTggcnN2ZDU5WzMyXTsJLyogRFdPUkQgMTIxICovCisJdTggcnN2ZDYwWzMyXTsJLyogRFdPUkQgMTIyICovCisJdTggcnN2ZDYxWzMyXTsJLyogRFdPUkQgMTIzICovCisJdTggcnN2ZDYyWzMyXTsJLyogRFdPUkQgMTI0ICovCisJdTggcnN2ZDYzWzMyXTsJLyogRFdPUkQgMTI1ICovCisJdTggcnN2ZDY0WzMyXTsJLyogRFdPUkQgMTI2ICovCisJdTggcnN2ZDY1WzMyXTsJLyogRFdPUkQgMTI3ICovCisJdTggcnN2ZDY2WzYxNDQwXTsJLyogRFdPUkQgMTI4ICovCisJc3RydWN0IEJFX1BDSUNGR19BTk9OXzIyX01FU1NBR0VfQU1BUCBtZXNzYWdlWzMyXTsKKwl1OCByc3ZkNjdbMjg2NzJdOwkvKiBEV09SRCAyMTc2ICovCisJdTggcnN2ZDY4WzMyXTsJLyogRFdPUkQgMzA3MiAqLworCXU4IHJzdmQ2OVsxMDIzXVszMl07CS8qIERXT1JEIDMwNzMgKi8KK30gX19wYWNrZWQ7CitzdHJ1Y3QgUENJQ0ZHMF9DU1JNQVBfQU1BUCB7CisJdTMyIGR3WzQwOTZdOworfTsKKworc3RydWN0IEJFX1BDSUNGR19BTk9OXzI0X1JTVkRfQU1BUCB7CisJdTggcnN2ZDBbMzJdOwkvKiBEV09SRCAwICovCit9IF9fcGFja2VkOworc3RydWN0IFBDSUNGR19BTk9OXzI0X1JTVkRfQU1BUCB7CisJdTMyIGR3WzFdOworfTsKKworc3RydWN0IEJFX1BDSUNGR19BTk9OXzI1X1JTVkRfQU1BUCB7CisJdTggcnN2ZDBbMzJdOwkvKiBEV09SRCAwICovCit9IF9fcGFja2VkOworc3RydWN0IFBDSUNGR19BTk9OXzI1X1JTVkRfQU1BUCB7CisJdTMyIGR3WzFdOworfTsKKworc3RydWN0IEJFX1BDSUNGR19BTk9OXzI2X1JTVkRfQU1BUCB7CisJdTggcnN2ZDBbMzJdOwkvKiBEV09SRCAwICovCit9IF9fcGFja2VkOworc3RydWN0IFBDSUNGR19BTk9OXzI2X1JTVkRfQU1BUCB7CisJdTMyIGR3WzFdOworfTsKKworc3RydWN0IEJFX1BDSUNGR19BTk9OXzI3X1JTVkRfQU1BUCB7CisJdTggcnN2ZDBbMzJdOwkvKiBEV09SRCAwICovCisJdTggcnN2ZDFbMzJdOwkvKiBEV09SRCAxICovCit9IF9fcGFja2VkOworc3RydWN0IFBDSUNGR19BTk9OXzI3X1JTVkRfQU1BUCB7CisJdTMyIGR3WzJdOworfTsKKworc3RydWN0IEJFX1BDSUNGR19BTk9OXzI4X1JTVkRfQU1BUCB7CisJdTggcnN2ZDBbMzJdOwkvKiBEV09SRCAwICovCisJdTggcnN2ZDFbM11bMzJdOwkvKiBEV09SRCAxICovCit9IF9fcGFja2VkOworc3RydWN0IFBDSUNGR19BTk9OXzI4X1JTVkRfQU1BUCB7CisJdTMyIGR3WzRdOworfTsKKworc3RydWN0IEJFX1BDSUNGR19BTk9OXzI5X1JTVkRfQU1BUCB7CisJdTggcnN2ZDBbMzJdOwkvKiBEV09SRCAwICovCisJdTggcnN2ZDFbMzZdWzMyXTsJLyogRFdPUkQgMSAqLworfSBfX3BhY2tlZDsKK3N0cnVjdCBQQ0lDRkdfQU5PTl8yOV9SU1ZEX0FNQVAgeworCXUzMiBkd1szN107Cit9OworCitzdHJ1Y3QgQkVfUENJQ0ZHX0FOT05fMzBfUlNWRF9BTUFQIHsKKwl1OCByc3ZkMFszMl07CS8qIERXT1JEIDAgKi8KKwl1OCByc3ZkMVsxOTMwXVszMl07CS8qIERXT1JEIDEgKi8KK30gX19wYWNrZWQ7CitzdHJ1Y3QgUENJQ0ZHX0FOT05fMzBfUlNWRF9BTUFQIHsKKwl1MzIgZHdbMTkzMV07Cit9OworCitzdHJ1Y3QgQkVfUENJQ0ZHX0FOT05fMzFfTUVTU0FHRV9BTUFQIHsKKwlzdHJ1Y3QgQkVfUENJQ0ZHX01TSVhfVkVDVE9SX0NPTlRST0xfQ1NSX0FNQVAgdmVjX2N0cmw7CisJc3RydWN0IEJFX1BDSUNGR19NU0lYX01TR19EQVRBX0NTUl9BTUFQIG1zZ19kYXRhOworCXN0cnVjdCBCRV9QQ0lDRkdfTVNJWF9NU0dfQUREUl9ISV9DU1JfQU1BUCBhZGRyX2hpOworCXN0cnVjdCBCRV9QQ0lDRkdfTVNJWF9NU0dfQUREUl9MT19DU1JfQU1BUCBhZGRyX2xvdzsKK30gX19wYWNrZWQ7CitzdHJ1Y3QgUENJQ0ZHX0FOT05fMzFfTUVTU0FHRV9BTUFQIHsKKwl1MzIgZHdbNF07Cit9OworCitzdHJ1Y3QgQkVfUENJQ0ZHX0FOT05fMzJfUlNWRF9BTUFQIHsKKwl1OCByc3ZkMFszMl07CS8qIERXT1JEIDAgKi8KKwl1OCByc3ZkMVs4OTVdWzMyXTsJLyogRFdPUkQgMSAqLworfSBfX3BhY2tlZDsKK3N0cnVjdCBQQ0lDRkdfQU5PTl8zMl9SU1ZEX0FNQVAgeworCXUzMiBkd1s4OTZdOworfTsKKworLyogVGhpcyBQQ0kgY29uZmlndXJhdGlvbiBzcGFjZSByZWdpc3RlciBtYXAgaXMgZm9yIHRoZSAgTmV0d29ya2luZyBGdW5jdGlvbiBvZgorICogQmxhZGVFbmdpbmUgKEZ1bmN0aW9uIDEpLgorICovCitzdHJ1Y3QgQkVfUENJQ0ZHMV9DU1JNQVBfQU1BUCB7CisJc3RydWN0IEJFX1BDSUNGR19JRF9DU1JfQU1BUCBpZDsKKwl1OCByc3ZkMFszMl07CS8qIERXT1JEIDEgKi8KKwl1OCByc3ZkMVszMl07CS8qIERXT1JEIDIgKi8KKwl1OCByc3ZkMlszMl07CS8qIERXT1JEIDMgKi8KKwlzdHJ1Y3QgQkVfUENJQ0ZHX0lPQkFSX0NTUl9BTUFQIGlvYmFyOworCXN0cnVjdCBCRV9QQ0lDRkdfTUVNQkFSMF9DU1JfQU1BUCBtZW1iYXIwOworCXN0cnVjdCBCRV9QQ0lDRkdfTUVNQkFSMV9MT19DU1JfQU1BUCBtZW1iYXIxX2xvOworCXN0cnVjdCBCRV9QQ0lDRkdfTUVNQkFSMV9ISV9DU1JfQU1BUCBtZW1iYXIxX2hpOworCXN0cnVjdCBCRV9QQ0lDRkdfTUVNQkFSMl9MT19DU1JfQU1BUCBtZW1iYXIyX2xvOworCXN0cnVjdCBCRV9QQ0lDRkdfTUVNQkFSMl9ISV9DU1JfQU1BUCBtZW1iYXIyX2hpOworCXU4IHJzdmQzWzMyXTsJLyogRFdPUkQgMTAgKi8KKwlzdHJ1Y3QgQkVfUENJQ0ZHX1NVQlNZU1RFTV9JRF9GMV9DU1JfQU1BUCBzdWJzeXN0ZW1faWQ7CisJdTggcnN2ZDRbMzJdOwkvKiBEV09SRCAxMiAqLworCXU4IHJzdmQ1WzMyXTsJLyogRFdPUkQgMTMgKi8KKwl1OCByc3ZkNlszMl07CS8qIERXT1JEIDE0ICovCisJdTggcnN2ZDdbMzJdOwkvKiBEV09SRCAxNSAqLworCXN0cnVjdCBCRV9QQ0lDRkdfU0VNQVBIT1JFX0NTUl9BTUFQIHNlbWFwaG9yZVs0XTsKKwlzdHJ1Y3QgQkVfUENJQ0ZHX1NPRlRfUkVTRVRfQ1NSX0FNQVAgc29mdF9yZXNldDsKKwl1OCByc3ZkOFszMl07CS8qIERXT1JEIDIxICovCisJc3RydWN0IEJFX1BDSUNGR19TQ1JBVENIUEFEX0NTUl9BTUFQIHNjcmF0Y2hwYWQ7CisJdTggcnN2ZDlbMzJdOwkvKiBEV09SRCAyMyAqLworCXU4IHJzdmQxMFszMl07CS8qIERXT1JEIDI0ICovCisJdTggcnN2ZDExWzMyXTsJLyogRFdPUkQgMjUgKi8KKwl1OCByc3ZkMTJbMzJdOwkvKiBEV09SRCAyNiAqLworCXU4IHJzdmQxM1szMl07CS8qIERXT1JEIDI3ICovCisJdTggcnN2ZDE0WzJdWzMyXTsJLyogRFdPUkQgMjggKi8KKwl1OCByc3ZkMTVbMzJdOwkvKiBEV09SRCAzMCAqLworCXU4IHJzdmQxNlszMl07CS8qIERXT1JEIDMxICovCisJdTggcnN2ZDE3WzhdWzMyXTsJLyogRFdPUkQgMzIgKi8KKwlzdHJ1Y3QgQkVfUENJQ0ZHX1VFX1NUQVRVU19MT1dfQ1NSX0FNQVAgdWVfc3RhdHVzX2xvdzsKKwlzdHJ1Y3QgQkVfUENJQ0ZHX1VFX1NUQVRVU19ISV9DU1JfQU1BUCB1ZV9zdGF0dXNfaGk7CisJc3RydWN0IEJFX1BDSUNGR19VRV9TVEFUVVNfTE9XX01BU0tfQ1NSX0FNQVAgdWVfc3RhdHVzX2xvd19tYXNrOworCXN0cnVjdCBCRV9QQ0lDRkdfVUVfU1RBVFVTX0hJX01BU0tfQ1NSX0FNQVAgdWVfc3RhdHVzX2hpX21hc2s7CisJc3RydWN0IEJFX1BDSUNGR19PTkxJTkUwX0NTUl9BTUFQIG9ubGluZTA7CisJc3RydWN0IEJFX1BDSUNGR19PTkxJTkUxX0NTUl9BTUFQIG9ubGluZTE7CisJdTggcnN2ZDE4WzMyXTsJLyogRFdPUkQgNDYgKi8KKwl1OCByc3ZkMTlbMzJdOwkvKiBEV09SRCA0NyAqLworCXU4IHJzdmQyMFszMl07CS8qIERXT1JEIDQ4ICovCisJdTggcnN2ZDIxWzMyXTsJLyogRFdPUkQgNDkgKi8KKwlzdHJ1Y3QgQkVfUENJQ0ZHX0hPU1RfVElNRVJfSU5UX0NUUkxfQ1NSX0FNQVAgaG9zdF90aW1lcl9pbnRfY3RybDsKKwl1OCByc3ZkMjJbMzJdOwkvKiBEV09SRCA1MSAqLworCXN0cnVjdCBCRV9QQ0lDRkdfUENJRV9DQVBfQ1NSX0FNQVAgcGNpZV9jYXA7CisJc3RydWN0IEJFX1BDSUNGR19QQ0lFX0RFVkNBUF9DU1JfQU1BUCBwY2llX2RldmNhcDsKKwlzdHJ1Y3QgQkVfUENJQ0ZHX1BDSUVfQ09OVFJPTF9TVEFUVVNfQ1NSX0FNQVAgcGNpZV9jb250cm9sX3N0YXR1czsKKwlzdHJ1Y3QgQkVfUENJQ0ZHX1BDSUVfTElOS19DQVBfQ1NSX0FNQVAgcGNpZV9saW5rX2NhcDsKKwlzdHJ1Y3QgQkVfUENJQ0ZHX1BDSUVfTElOS19TVEFUVVNfQ1NSX0FNQVAgcGNpZV9saW5rX3N0YXR1czsKKwlzdHJ1Y3QgQkVfUENJQ0ZHX01TSV9DU1JfQU1BUCBtc2k7CisJc3RydWN0IEJFX1BDSUNGR19NU0lYX1RBQkxFX0NTUl9BTUFQIG1zaXhfdGFibGVfb2Zmc2V0OworCXN0cnVjdCBCRV9QQ0lDRkdfTVNJWF9QQkFfQ1NSX0FNQVAgbXNpeF9wYmFfb2Zmc2V0OworCXU4IHJzdmQyM1s2NF07CS8qIERXT1JEIDYwICovCisJdTggcnN2ZDI0WzMyXTsJLyogRFdPUkQgNjIgKi8KKwl1OCByc3ZkMjVbMzJdOwkvKiBEV09SRCA2MyAqLworCXU4IHJzdmQyNlszMl07CS8qIERXT1JEIDY0ICovCisJdTggcnN2ZDI3WzMyXTsJLyogRFdPUkQgNjUgKi8KKwl1OCByc3ZkMjhbMzJdOwkvKiBEV09SRCA2NiAqLworCXU4IHJzdmQyOVszMl07CS8qIERXT1JEIDY3ICovCisJdTggcnN2ZDMwWzMyXTsJLyogRFdPUkQgNjggKi8KKwl1OCByc3ZkMzFbMzJdOwkvKiBEV09SRCA2OSAqLworCXU4IHJzdmQzMlszMl07CS8qIERXT1JEIDcwICovCisJdTggcnN2ZDMzWzMyXTsJLyogRFdPUkQgNzEgKi8KKwl1OCByc3ZkMzRbMzJdOwkvKiBEV09SRCA3MiAqLworCXU4IHJzdmQzNVszMl07CS8qIERXT1JEIDczICovCisJdTggcnN2ZDM2WzMyXTsJLyogRFdPUkQgNzQgKi8KKwl1OCByc3ZkMzdbMTI4XTsJLyogRFdPUkQgNzUgKi8KKwl1OCByc3ZkMzhbMzJdOwkvKiBEV09SRCA3OSAqLworCXU4IHJzdmQzOVsxMTg0XTsJLyogRFdPUkQgODAgKi8KKwl1OCByc3ZkNDBbNjE3OTJdOwkvKiBEV09SRCAxMTcgKi8KKwlzdHJ1Y3QgQkVfUENJQ0ZHX0FOT05fMzFfTUVTU0FHRV9BTUFQIG1lc3NhZ2VbMzJdOworCXU4IHJzdmQ0MVsyODY3Ml07CS8qIERXT1JEIDIxNzYgKi8KKwl1OCByc3ZkNDJbMzJdOwkvKiBEV09SRCAzMDcyICovCisJdTggcnN2ZDQzWzEwMjNdWzMyXTsJLyogRFdPUkQgMzA3MyAqLworfSBfX3BhY2tlZDsKK3N0cnVjdCBQQ0lDRkcxX0NTUk1BUF9BTUFQIHsKKwl1MzIgZHdbNDA5Nl07Cit9OworCisjZW5kaWYgLyogX19wY2ljZmdfYW1hcF9oX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9wb3N0X2NvZGVzLmggYi9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvcG9zdF9jb2Rlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkMTYyMWYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvcG9zdF9jb2Rlcy5oCkBAIC0wLDAgKzEsMTExIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA1IC0gMjAwOCBTZXJ2ZXJFbmdpbmVzCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBUaGUgZnVsbCBHTlUgR2VuZXJhbAorICogUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlIGZpbGUgY2FsbGVkIENPUFlJTkcuCisgKgorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqIGxpbnV4LWRyaXZlcnNAc2VydmVyZW5naW5lcy5jb20KKyAqCisgKiBTZXJ2ZXJFbmdpbmVzCisgKiAyMDkgTi4gRmFpciBPYWtzIEF2ZQorICogU3Vubnl2YWxlLCBDQSA5NDA4NQorICovCisvKgorICogQXV0b2dlbmVyYXRlZCBieSBzcmNnZW4gdmVyc2lvbjogMDEyNworICovCisjaWZuZGVmIF9fcG9zdF9jb2Rlc19hbWFwX2hfXworI2RlZmluZSBfX3Bvc3RfY29kZXNfYW1hcF9oX18KKworLyogLS0tIE1HTVRfSEJBX1BPU1RfU1RBR0VfRU5VTSAtLS0gKi8KKyNkZWZpbmUgUE9TVF9TVEFHRV9QT1dFUl9PTl9SRVNFVCAgICgwKQkvKiBTdGF0ZSBhZnRlciBhIGNvbGQgb3Igd2FybSBib290LiAqLworI2RlZmluZSBQT1NUX1NUQUdFX0FXQUlUSU5HX0hPU1RfUkRZICgxKQkvKiBBUk0gYm9vdCBjb2RlIGF3YWl0aW5nIGEKKwkJCQkJCWdvLWFoZWQgZnJvbSAgdGhlIGhvc3QuICovCisjZGVmaW5lIFBPU1RfU1RBR0VfSE9TVF9SRFkgKDIpCS8qIEhvc3QgaGFzIGdpdmVuIGdvLWFoZWQgdG8gQVJNLiAqLworI2RlZmluZSBQT1NUX1NUQUdFX0JFX1JFU0VUICgzKQkvKiBIb3N0IHdhbnRzIHRvIHJlc2V0IGNoaXAsIHRoaXMgaXMgYSAgY2hpcAorCQkJCQkJd29ya2Fyb3VuZCAgKi8KKyNkZWZpbmUgUE9TVF9TVEFHRV9TRUVQUk9NX0NTX1NUQVJUICgyNTYpCS8qIFNFRVBST00gY2hlY2tzdW0KKwkJCQkJCXRlc3Qgc3RhcnQuICovCisjZGVmaW5lIFBPU1RfU1RBR0VfU0VFUFJPTV9DU19ET05FICAoMjU3KQkvKiBTRUVQUk9NIGNoZWNrc3VtIHRlc3QKKwkJCQkJCQlkb25lLiAqLworI2RlZmluZSBQT1NUX1NUQUdFX0REUl9DT05GSUdfU1RBUlQgKDUxMikJLyogRERSIGNvbmZpZ3VyYXRpb24gc3RhcnQuICovCisjZGVmaW5lIFBPU1RfU1RBR0VfRERSX0NPTkZJR19ET05FICAoNTEzKQkvKiBERFIgY29uZmlndXJhdGlvbiBkb25lLiAqLworI2RlZmluZSBQT1NUX1NUQUdFX0REUl9DQUxJQlJBVEVfU1RBUlQgICg3NjgpCS8qIEREUiBjYWxpYnJhdGlvbiBzdGFydC4gKi8KKyNkZWZpbmUgUE9TVF9TVEFHRV9ERFJfQ0FMSUJSQVRFX0RPTkUgICAoNzY5KQkvKiBERFIgY2FsaWJyYXRpb24gZG9uZS4gKi8KKyNkZWZpbmUgUE9TVF9TVEFHRV9ERFJfVEVTVF9TVEFSVCAgICgxMDI0KQkvKiBERFIgbWVtb3J5IHRlc3Qgc3RhcnQuICovCisjZGVmaW5lIFBPU1RfU1RBR0VfRERSX1RFU1RfRE9ORSAgICAoMTAyNSkJLyogRERSIG1lbW9yeSB0ZXN0IGRvbmUuICovCisjZGVmaW5lIFBPU1RfU1RBR0VfUkVEQk9PVF9JTklUX1NUQVJUICAgKDE1MzYpCS8qIFJlZGJvb3Qgc3RhcnRzIGV4ZWN1dGlvbi4gKi8KKyNkZWZpbmUgUE9TVF9TVEFHRV9SRURCT09UX0lOSVRfRE9ORSAoMTUzNykJLyogUmVkYm9vdCBkb25lIGV4ZWN1dGlvbi4gKi8KKyNkZWZpbmUgUE9TVF9TVEFHRV9GV19JTUFHRV9MT0FEX1NUQVJUICgxNzkyKQkvKiBGaXJtd2FyZSBpbWFnZSBsb2FkIHRvCisJCQkJCQkJRERSIHN0YXJ0LiAqLworI2RlZmluZSBQT1NUX1NUQUdFX0ZXX0lNQUdFX0xPQURfRE9ORSAgICgxNzkzKQkvKiBGaXJtd2FyZSBpbWFnZSBsb2FkCisJCQkJCQkJdG8gRERSIGRvbmUuICovCisjZGVmaW5lIFBPU1RfU1RBR0VfQVJNRldfU1RBUlQgICAgICAgICAgKDIwNDgpCS8qIEFSTWZ3IHJ1bnRpbWUgY29kZQorCQkJCQkJc3RhcnRzIGV4ZWN1dGlvbi4gKi8KKyNkZWZpbmUgUE9TVF9TVEFHRV9ESENQX1FVRVJZX1NUQVJUICAgICAoMjMwNCkJLyogREhDUCBzZXJ2ZXIgcXVlcnkgc3RhcnQuICovCisjZGVmaW5lIFBPU1RfU1RBR0VfREhDUF9RVUVSWV9ET05FICAgICAgKDIzMDUpCS8qIERIQ1Agc2VydmVyIHF1ZXJ5IGRvbmUuICovCisjZGVmaW5lIFBPU1RfU1RBR0VfQk9PVF9UQVJHRVRfRElTQ09WRVJZX1NUQVJUICgyNTYwKQkvKiBCb290IFRhcmdldAorCQkJCQkJRGlzY292ZXJ5IFN0YXJ0LiAqLworI2RlZmluZSBQT1NUX1NUQUdFX0JPT1RfVEFSR0VUX0RJU0NPVkVSWV9ET05FICgyNTYxKQkvKiBCb290IFRhcmdldAorCQkJCQkJRGlzY292ZXJ5IERvbmUuICovCisjZGVmaW5lIFBPU1RfU1RBR0VfUkNfT1BUSU9OX1NFVCAgICAgICAgKDI4MTYpCS8qIFJlbW90ZSBjb25maWd1cmF0aW9uCisJCQkJCQlvcHRpb24gaXMgc2V0IGluICBTRUVQUk9NICAqLworI2RlZmluZSBQT1NUX1NUQUdFX1NXSVRDSF9MSU5LICAgICAgICAgICgyODE3KQkvKiBXYWl0IGZvciBsaW5rIHVwIG9uIHN3aXRjaCAqLworI2RlZmluZSBQT1NUX1NUQUdFX1NFTkRfSUNEU19NRVNTQUdFICAgICgyODE4KQkvKiBTZW5kIHRoZSBJQ0RTIG1lc3NhZ2UKKwkJCQkJCXRvIHN3aXRjaCAqLworI2RlZmluZSBQT1NUX1NUQUdFX1BFUkZST01fVEZUUCAgICAgICAgICgyODE5KQkvKiBEb3dubG9hZCB4bWwgdXNpbmcgVEZUUCAqLworI2RlZmluZSBQT1NUX1NUQUdFX1BBUlNFX1hNTCAgICAgICAgICAgICgyODIwKQkvKiBQYXJzZSBYTUwgZmlsZSAqLworI2RlZmluZSBQT1NUX1NUQUdFX0RPV05MT0FEX0lNQUdFICAgICAgICgyODIxKQkvKiBEb3dubG9hZCBJTUFHRSBmcm9tCisJCQkJCQlURlRQIHNlcnZlciAqLworI2RlZmluZSBQT1NUX1NUQUdFX0ZMQVNIX0lNQUdFICAgICAgICAgICgyODIyKQkvKiBGbGFzaCB0aGUgSU1BR0UgKi8KKyNkZWZpbmUgUE9TVF9TVEFHRV9SQ19ET05FICAgICAgICAgICAgICAoMjgyMykJLyogUmVtb3RlIGNvbmZpZ3VyYXRpb24KKwkJCQkJCWNvbXBsZXRlICovCisjZGVmaW5lIFBPU1RfU1RBR0VfUkVCT09UX1NZU1RFTSAgICAgICAgKDI4MjQpCS8qIFVwZ3JhZGUgSU1BR0UgZG9uZSwKKwkJCQkJCXJlYm9vdCByZXF1aXJlZCAqLworI2RlZmluZSBQT1NUX1NUQUdFX01BQ19BRERSRVNTICAgICAgICAgICgzMDcyKQkvKiBNQUMgQWRkcmVzcyBDaGVjayAqLworI2RlZmluZSBQT1NUX1NUQUdFX0FSTUZXX1JFQURZICAgICAgICAgICg0OTE1MikJLyogQVJNZncgaXMgZG9uZSB3aXRoIFBPU1QKKwkJCQkJCWFuZCByZWFkeS4gKi8KKyNkZWZpbmUgUE9TVF9TVEFHRV9BUk1GV19VRSAgICAgICAgICAgICAoNjE0NDApCS8qIEFSTWZ3IGhhcyBhc3NlcnRlZCBhbgorCQkJCQkJdW5yZWNvdmVyYWJsZSBlcnJvci4gVGhlCisJCQkJCQlsb3dlciAzIGhleCBkaWdpdHMgb2YgdGhlCisJCQkJCQlzdGFnZSBjb2RlIGlkZW50aWZ5IHRoZQorCQkJCQkJdW5pcXVlIGVycm9yIGNvZGUuCisJCQkJCQkqLworCisvKiBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSBmb3JtYXQgb2YgdGhlIE1QVSBzZW1hcGhvcmUKKyAqIHJlZ2lzdGVyIHdoZW4gdXNlZCBmb3IgUE9TVC4KKyAqLworc3RydWN0IEJFX01HTVRfSEJBX1BPU1RfU1RBVFVTX1NUUlVDVF9BTUFQIHsKKwl1OCBzdGFnZVsxNl07CS8qIERXT1JEIDAgKi8KKwl1OCByc3ZkMFsxMF07CS8qIERXT1JEIDAgKi8KKwl1OCBpc2NzaV9kcml2ZXJfbG9hZGVkOwkvKiBEV09SRCAwICovCisJdTggb3B0aW9uX3JvbV9pbnN0YWxsZWQ7CS8qIERXT1JEIDAgKi8KKwl1OCBpc2NzaV9pcF9jb25mbGljdDsJLyogRFdPUkQgMCAqLworCXU4IGlzY3NpX25vX2lwOwkvKiBEV09SRCAwICovCisJdTggYmFja3VwX2Z3OwkvKiBEV09SRCAwICovCisJdTggZXJyb3I7CQkvKiBEV09SRCAwICovCit9IF9fcGFja2VkOworc3RydWN0IE1HTVRfSEJBX1BPU1RfU1RBVFVTX1NUUlVDVF9BTUFQIHsKKwl1MzIgZHdbMV07Cit9OworCisvKiAtLS0gTUdNVF9IQkFfUE9TVF9EVU1NWV9CSVRTX0VOVU0gLS0tICovCisjZGVmaW5lIFBPU1RfQklUX0lTQ1NJX0xPQURFRCAgICAgICAgICAgKDI2KQorI2RlZmluZSBQT1NUX0JJVF9PUFRST01fSU5TVCAgICAgICAgICAgICgyNykKKyNkZWZpbmUgUE9TVF9CSVRfQkFEX0lQX0FERFIgICAgICAgICAgICAoMjgpCisjZGVmaW5lIFBPU1RfQklUX05PX0lQX0FERFIgICAgICAgICAgICAgKDI5KQorI2RlZmluZSBQT1NUX0JJVF9CQUNLVVBfRlcgICAgICAgICAgICAgICgzMCkKKyNkZWZpbmUgUE9TVF9CSVRfRVJST1IgICAgICAgICAgICAgICAgICAoMzEpCisKKy8qIC0tLSBNR01UX0hCQV9QT1NUX0RVTU1ZX1ZBTFVFU19FTlVNIC0tLSAqLworI2RlZmluZSBQT1NUX0lTQ1NJX0RSSVZFUl9MT0FERUQgICAgICAgICg2NzEwODg2NCkKKyNkZWZpbmUgUE9TVF9PUFRST01fSU5TVEFMTEVEICAgICAgICAgICAoMTM0MjE3NzI4KQorI2RlZmluZSBQT1NUX0lTQ1NJX0lQX0FERFJFU1NfQ09ORkxJQ1QgICgyNjg0MzU0NTYpCisjZGVmaW5lIFBPU1RfSVNDU0lfTk9fSVBfQUREUkVTUyAgICAgICAgKDUzNjg3MDkxMikKKyNkZWZpbmUgUE9TVF9CQUNLVVBfRldfTE9BREVEICAgICAgICAgICAoMTA3Mzc0MTgyNCkKKyNkZWZpbmUgUE9TVF9GQVRBTF9FUlJPUiAgICAgICAgICAgICAgICAoMjE0NzQ4MzY0OCkKKworI2VuZGlmIC8qIF9fcG9zdF9jb2Rlc19hbWFwX2hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JlbmV0L3JlZ21hcC5oIGIvZHJpdmVycy9zdGFnaW5nL2JlbmV0L3JlZ21hcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4MTZiYTIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvcmVnbWFwLmgKQEAgLTAsMCArMSw2OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNSAtIDIwMDggU2VydmVyRW5naW5lcworICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgVGhlIGZ1bGwgR05VIEdlbmVyYWwKKyAqIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZSBmaWxlIGNhbGxlZCBDT1BZSU5HLgorICoKKyAqIENvbnRhY3QgSW5mb3JtYXRpb246CisgKiBsaW51eC1kcml2ZXJzQHNlcnZlcmVuZ2luZXMuY29tCisgKgorICogU2VydmVyRW5naW5lcworICogMjA5IE4uIEZhaXIgT2FrcyBBdmUKKyAqIFN1bm55dmFsZSwgQ0EgOTQwODUKKyAqLworLyoKKyAqIEF1dG9nZW5lcmF0ZWQgYnkgc3JjZ2VuIHZlcnNpb246IDAxMjcKKyAqLworI2lmbmRlZiBfX3JlZ21hcF9hbWFwX2hfXworI2RlZmluZSBfX3JlZ21hcF9hbWFwX2hfXworI2luY2x1ZGUgInBjaWNmZy5oIgorI2luY2x1ZGUgImVwLmgiCisjaW5jbHVkZSAiY2V2LmgiCisjaW5jbHVkZSAibXB1LmgiCisjaW5jbHVkZSAiZG9vcmJlbGxzLmgiCisKKy8qCisgKiBUaGlzIGlzIHRoZSBjb250cm9sIGFuZCBzdGF0dXMgcmVnaXN0ZXIgbWFwIGZvciBCbGFkZUVuZ2luZSwgc2hvd2luZworICogdGhlIHJlbGF0aXZlIHNpemUgYW5kIG9mZnNldCBvZiBlYWNoIHN1Yi1tb2R1bGUuIFRoZSBDU1IgcmVnaXN0ZXJzCisgKiBhcmUgaWRlbnRpY2FsIGZvciB0aGUgbmV0d29yayBhbmQgc3RvcmFnZSBQQ0kgZnVuY3Rpb25zLiBUaGUKKyAqIENTUiBtYXAgaXMgc2hvd24gYmVsb3csIGZvbGxvd2VkIGJ5IGRldGFpbHMgb2YgZWFjaCBibG9jaywKKyAqIGluIHN1Yi1zZWN0aW9ucy4gIFRoZSBzdWItc2VjdGlvbnMgYmVnaW4gd2l0aCBhIGRlc2NyaXB0aW9uCisgKiBvZiBDU1JzIHRoYXQgYXJlIGluc3RhbnRpYXRlZCBpbiBtdWx0aXBsZSBibG9ja3MuCisgKi8KK3N0cnVjdCBCRV9CTEFERV9FTkdJTkVfQ1NSTUFQX0FNQVAgeworCXN0cnVjdCBCRV9NUFVfQ1NSTUFQX0FNQVAgbXB1OworCXU4IHJzdmQwWzgxOTJdOwkvKiBEV09SRCAyNTYgKi8KKwl1OCByc3ZkMVs4MTkyXTsJLyogRFdPUkQgNTEyICovCisJc3RydWN0IEJFX0NFVl9DU1JNQVBfQU1BUCBjZXY7CisJdTggcnN2ZDJbODE5Ml07CS8qIERXT1JEIDEwMjQgKi8KKwl1OCByc3ZkM1s4MTkyXTsJLyogRFdPUkQgMTI4MCAqLworCXU4IHJzdmQ0WzgxOTJdOwkvKiBEV09SRCAxNTM2ICovCisJdTggcnN2ZDVbODE5Ml07CS8qIERXT1JEIDE3OTIgKi8KKwl1OCByc3ZkNls4MTkyXTsJLyogRFdPUkQgMjA0OCAqLworCXU4IHJzdmQ3WzgxOTJdOwkvKiBEV09SRCAyMzA0ICovCisJdTggcnN2ZDhbODE5Ml07CS8qIERXT1JEIDI1NjAgKi8KKwl1OCByc3ZkOVs4MTkyXTsJLyogRFdPUkQgMjgxNiAqLworCXU4IHJzdmQxMFs4MTkyXTsJLyogRFdPUkQgMzA3MiAqLworCXU4IHJzdmQxMVs4MTkyXTsJLyogRFdPUkQgMzMyOCAqLworCXU4IHJzdmQxMls4MTkyXTsJLyogRFdPUkQgMzU4NCAqLworCXU4IHJzdmQxM1s4MTkyXTsJLyogRFdPUkQgMzg0MCAqLworCXU4IHJzdmQxNFs4MTkyXTsJLyogRFdPUkQgNDA5NiAqLworCXU4IHJzdmQxNVs4MTkyXTsJLyogRFdPUkQgNDM1MiAqLworCXU4IHJzdmQxNls4MTkyXTsJLyogRFdPUkQgNDYwOCAqLworCXU4IHJzdmQxN1s4MTkyXTsJLyogRFdPUkQgNDg2NCAqLworCXU4IHJzdmQxOFs4MTkyXTsJLyogRFdPUkQgNTEyMCAqLworCXU4IHJzdmQxOVs4MTkyXTsJLyogRFdPUkQgNTM3NiAqLworCXU4IHJzdmQyMFs4MTkyXTsJLyogRFdPUkQgNTYzMiAqLworCXU4IHJzdmQyMVs4MTkyXTsJLyogRFdPUkQgNTg4OCAqLworCXU4IHJzdmQyMls4MTkyXTsJLyogRFdPUkQgNjE0NCAqLworCXU4IHJzdmQyM1sxNzE1Ml1bMzJdOwkvKiBEV09SRCA2NDAwICovCit9IF9fcGFja2VkOworc3RydWN0IEJMQURFX0VOR0lORV9DU1JNQVBfQU1BUCB7CisJdTMyIGR3WzIzNTUyXTsKK307CisKKyNlbmRpZiAvKiBfX3JlZ21hcF9hbWFwX2hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1MDFiZmIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL0tjb25maWcKQEAgLTAsMCArMSwyNyBAQAorY29uZmlnIENPTUVESQorCXRyaXN0YXRlICJEYXRhIEFjcXVpc2lvbiBzdXBwb3J0IChjb21lZGkpIgorCWRlZmF1bHQgTgorCS0tLWhlbHAtLS0KKwkgIEVuYWJsZSBzdXBwb3J0IGEgd2lkZSByYW5nZSBvZiBkYXRhIGFjcXVpc2lvbiBkZXZpY2VzCisJICBmb3IgTGludXguCisKK2NvbmZpZyBDT01FRElfUlQKKwl0cmlzdGF0ZSAiQ29tZWRpIFJlYWwtdGltZSBzdXBwb3J0IgorCWRlcGVuZHMgb24gQ09NRURJICYmIFJUCisJZGVmYXVsdCBOCisJLS0taGVscC0tLQorCSAgRW5hYmxlIFJlYWwgdGltZSBzdXBwb3J0IGZvciB0aGUgQ29tZWRpIGNvcmUuCisKK2NvbmZpZyBDT01FRElfUENJX0RSSVZFUlMKKwl0cmlzdGF0ZSAiQ29tZWRpIFBDSSBkcml2ZXJzIgorCWRlcGVuZHMgb24gQ09NRURJICYmIFBDSQorCWRlZmF1bHQgTgorCS0tLWhlbHAtLS0KKwkgIEVuYWJsZSBsb3RzIG9mIGNvbWVkaSBQQ0kgZHJpdmVycyB0byBiZSBidWlsdAorCitjb25maWcgQ09NRURJX1VTQl9EUklWRVJTCisJdHJpc3RhdGUgIkNvbWVkaSBVU0IgZHJpdmVycyIKKwlkZXBlbmRzIG9uIENPTUVESSAmJiBVU0IKKwlkZWZhdWx0IE4KKwktLS1oZWxwLS0tCisJICBFbmFibGUgbG90cyBvZiBjb21lZGkgVVNCIGRyaXZlcnMgdG8gYmUgYnVpbHQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmZDFhMTkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL01ha2VmaWxlCkBAIC0wLDAgKzEsMTcgQEAKK29iai0kKENPTkZJR19DT01FREkpICs9IGNvbWVkaS5vCitvYmotJChDT05GSUdfQ09NRURJX1JUKSArPSBjb21lZGlfcnQubworCitvYmotJChDT05GSUdfQ09NRURJKQkrPSBrY29tZWRpbGliLworb2JqLSQoQ09ORklHX0NPTUVESSkJKz0gZHJpdmVycy8KKworY29tZWRpLW9ianMgOj0JCVwKKwljb21lZGlfZm9wcy5vCVwKKwlwcm9jLm8JCVwKKwlyYW5nZS5vCQlcCisJZHJpdmVycy5vCVwKKwljb21lZGlfY29tcGF0MzIubyBcCisJY29tZWRpX2tzeW1zLm8JXAorCitjb21lZGlfcnQtb2JqcyA6PQlcCisJcnRfcGVuZF90cS5vCVwKKwlydC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL1RPRE8gYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL1RPRE8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU3ODEyOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvVE9ETwpAQCAtMCwwICsxLDE0IEBACitUT0RPOgorCS0gY2hlY2twYXRjaC5wbCBjbGVhbnVwcworCS0gTGluZGVudAorCS0gcmVtb3ZlIGFsbCB3cmFwcGVycworCS0gcmVtb3ZlIHR5cGVkZWZzCisJLSBhdWRpdCB1c2Vyc3BhY2UgaW50ZXJmYWNlCisJLSByZXNlcnZlIG1ham9yIG51bWJlcgorCS0gY2xlYW51cCB0aGUgaW5kaXZpZHVhbCBjb21lZGkgZHJpdmVycyBhcyB3ZWxsCisKK1BsZWFzZSBzZW5kIHBhdGNoZXMgdG8gR3JlZyBLcm9haC1IYXJ0bWFuIDxncmVnQGtyb2FoLmNvbT4gYW5kCitjb3B5OgorCUlhbiBBYmJvdHQgPGFiYm90dGlAbWV2LmNvLnVrPgorCUZyYW5rIE1vcmkgSGVzcyA8Zm1oZXNzQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKwlEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvY29tZWRpLmggYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2NvbWVkaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2ZDJlMWIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2NvbWVkaS5oCkBAIC0wLDAgKzEsOTE2IEBACisvKgorICAgIGluY2x1ZGUvY29tZWRpLmggKGluc3RhbGxlZCBhcyAvdXNyL2luY2x1ZGUvY29tZWRpLmgpCisgICAgaGVhZGVyIGZpbGUgZm9yIGNvbWVkaQorCisgICAgQ09NRURJIC0gTGludXggQ29udHJvbCBhbmQgTWVhc3VyZW1lbnQgRGV2aWNlIEludGVyZmFjZQorICAgIENvcHlyaWdodCAoQykgMTk5OC0yMDAxIERhdmlkIEEuIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisqLworCisjaWZuZGVmIF9DT01FRElfSAorI2RlZmluZSBfQ09NRURJX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjZGVmaW5lIENPTUVESV9NQUpPUlZFUlNJT04JMAorI2RlZmluZSBDT01FRElfTUlOT1JWRVJTSU9OCTcKKyNkZWZpbmUgQ09NRURJX01JQ1JPVkVSU0lPTgk3NgorI2RlZmluZSBWRVJTSU9OCSIwLjcuNzYiCisKKy8qIGNvbWVkaSdzIG1ham9yIGRldmljZSBudW1iZXIgKi8KKyNkZWZpbmUgQ09NRURJX01BSk9SIDk4CisKKy8qCisgICBtYXhpbXVtIG51bWJlciBvZiBtaW5vciBkZXZpY2VzLiAgVGhpcyBjYW4gYmUgaW5jcmVhc2VkLCBhbHRob3VnaAorICAga2VybmVsIHN0cnVjdHVyZXMgYXJlIGN1cnJlbnRseSBzdGF0aWNhbGx5IGFsbG9jYXRlZCwgdGh1cyB5b3UKKyAgIGRvbid0IHdhbnQgdGhpcyB0byBiZSBtdWNoIG1vcmUgdGhhbiB5b3UgYWN0dWFsbHkgdXNlLgorICovCisjZGVmaW5lIENPTUVESV9OREVWSUNFUyAxNgorCisvKiBudW1iZXIgb2YgY29uZmlnIG9wdGlvbnMgaW4gdGhlIGNvbmZpZyBzdHJ1Y3R1cmUgKi8KKyNkZWZpbmUgQ09NRURJX05ERVZDT05GT1BUUyAzMgorLypsZW5ndGggb2YgbnRoIGNodW5rIG9mIGZpcm13YXJlIGRhdGEqLworI2RlZmluZSBDT01FRElfREVWQ09ORl9BVVhfREFUQTNfTEVOR1RICQkyNQorI2RlZmluZSBDT01FRElfREVWQ09ORl9BVVhfREFUQTJfTEVOR1RICQkyNgorI2RlZmluZSBDT01FRElfREVWQ09ORl9BVVhfREFUQTFfTEVOR1RICQkyNworI2RlZmluZSBDT01FRElfREVWQ09ORl9BVVhfREFUQTBfTEVOR1RICQkyOAorI2RlZmluZSBDT01FRElfREVWQ09ORl9BVVhfREFUQV9ISQkJMjkJLyogbW9zdCBzaWduaWZpY2FudCAzMiBiaXRzIG9mIHBvaW50ZXIgYWRkcmVzcyAoaWYgbmVlZGVkKSAqLworI2RlZmluZSBDT01FRElfREVWQ09ORl9BVVhfREFUQV9MTwkJMzAJLyogbGVhc3Qgc2lnbmlmaWNhbnQgMzIgYml0cyBvZiBwb2ludGVyIGFkZHJlc3MgKi8KKyNkZWZpbmUgQ09NRURJX0RFVkNPTkZfQVVYX0RBVEFfTEVOR1RICQkzMQkvKiB0b3RhbCBkYXRhIGxlbmd0aCAqLworCisvKiBtYXggbGVuZ3RoIG9mIGRldmljZSBhbmQgZHJpdmVyIG5hbWVzICovCisjZGVmaW5lIENPTUVESV9OQU1FTEVOIDIwCisKKwl0eXBlZGVmIHVuc2lnbmVkIGludCBsc2FtcGxfdDsKKwl0eXBlZGVmIHVuc2lnbmVkIHNob3J0IHNhbXBsX3Q7CisKKy8qIHBhY2tzIGFuZCB1bnBhY2tzIGEgY2hhbm5lbC9yYW5nZSBudW1iZXIgKi8KKworI2RlZmluZSBDUl9QQUNLKGNoYW4sIHJuZywgYXJlZikJCSgoKChhcmVmKSYweDMpPDwyNCkgfCAoKChybmcpJjB4ZmYpPDwxNikgfCAoY2hhbikpCisjZGVmaW5lIENSX1BBQ0tfRkxBR1MoY2hhbiwgcmFuZ2UsIGFyZWYsIGZsYWdzKQkoQ1JfUEFDSyhjaGFuLCByYW5nZSwgYXJlZikgfCAoKGZsYWdzKSAmIENSX0ZMQUdTX01BU0spKQorCisjZGVmaW5lIENSX0NIQU4oYSkJKChhKSYweGZmZmYpCisjZGVmaW5lIENSX1JBTkdFKGEpCSgoKGEpPj4xNikmMHhmZikKKyNkZWZpbmUgQ1JfQVJFRihhKQkoKChhKT4+MjQpJjB4MDMpCisKKyNkZWZpbmUgQ1JfRkxBR1NfTUFTSwkweGZjMDAwMDAwCisjZGVmaW5lIENSX0FMVF9GSUxURVIJKDE8PDI2KQorI2RlZmluZSBDUl9ESVRIRVIJQ1JfQUxUX0ZJTFRFUgorI2RlZmluZSBDUl9ERUdMSVRDSAlDUl9BTFRfRklMVEVSCisjZGVmaW5lIENSX0FMVF9TT1VSQ0UJKDE8PDI3KQorI2RlZmluZSBDUl9FREdFCQkoMTw8MzApCisjZGVmaW5lIENSX0lOVkVSVAkoMTw8MzEpCisKKyNkZWZpbmUgQVJFRl9HUk9VTkQJMHgwMAkvKiBhbmFsb2cgcmVmID0gYW5hbG9nIGdyb3VuZCAqLworI2RlZmluZSBBUkVGX0NPTU1PTgkweDAxCS8qIGFuYWxvZyByZWYgPSBhbmFsb2cgY29tbW9uICovCisjZGVmaW5lIEFSRUZfRElGRgkweDAyCS8qIGFuYWxvZyByZWYgPSBkaWZmZXJlbnRpYWwgKi8KKyNkZWZpbmUgQVJFRl9PVEhFUgkweDAzCS8qIGFuYWxvZyByZWYgPSBvdGhlciAodW5kZWZpbmVkKSAqLworCisvKiBjb3VudGVycyAtLSB0aGVzZSBhcmUgYXJiaXRyYXJ5IHZhbHVlcyAqLworI2RlZmluZSBHUENUX1JFU0VUCQkweDAwMDEKKyNkZWZpbmUgR1BDVF9TRVRfU09VUkNFCQkweDAwMDIKKyNkZWZpbmUgR1BDVF9TRVRfR0FURQkJMHgwMDA0CisjZGVmaW5lIEdQQ1RfU0VUX0RJUkVDVElPTgkweDAwMDgKKyNkZWZpbmUgR1BDVF9TRVRfT1BFUkFUSU9OCTB4MDAxMAorI2RlZmluZSBHUENUX0FSTQkJMHgwMDIwCisjZGVmaW5lIEdQQ1RfRElTQVJNCQkweDAwNDAKKyNkZWZpbmUgR1BDVF9HRVRfSU5UX0NMS19GUlEJMHgwMDgwCisKKyNkZWZpbmUgR1BDVF9JTlRfQ0xPQ0sJCTB4MDAwMQorI2RlZmluZSBHUENUX0VYVF9QSU4JCTB4MDAwMgorI2RlZmluZSBHUENUX05PX0dBVEUJCTB4MDAwNAorI2RlZmluZSBHUENUX1VQCQkJMHgwMDA4CisjZGVmaW5lIEdQQ1RfRE9XTgkJMHgwMDEwCisjZGVmaW5lIEdQQ1RfSFdVRAkJMHgwMDIwCisjZGVmaW5lIEdQQ1RfU0lNUExFX0VWRU5UCTB4MDA0MAorI2RlZmluZSBHUENUX1NJTkdMRV9QRVJJT0QJMHgwMDgwCisjZGVmaW5lIEdQQ1RfU0lOR0xFX1BXCQkweDAxMDAKKyNkZWZpbmUgR1BDVF9DT05UX1BVTFNFX09VVAkweDAyMDAKKyNkZWZpbmUgR1BDVF9TSU5HTEVfUFVMU0VfT1VUCTB4MDQwMAorCisvKiBpbnN0cnVjdGlvbnMgKi8KKworI2RlZmluZSBJTlNOX01BU0tfV1JJVEUJCTB4ODAwMDAwMAorI2RlZmluZSBJTlNOX01BU0tfUkVBRAkJMHg0MDAwMDAwCisjZGVmaW5lIElOU05fTUFTS19TUEVDSUFMCTB4MjAwMDAwMAorCisjZGVmaW5lIElOU05fUkVBRAkJKDAgfCBJTlNOX01BU0tfUkVBRCkKKyNkZWZpbmUgSU5TTl9XUklURQkJKDEgfCBJTlNOX01BU0tfV1JJVEUpCisjZGVmaW5lIElOU05fQklUUwkJKDIgfCBJTlNOX01BU0tfUkVBRHxJTlNOX01BU0tfV1JJVEUpCisjZGVmaW5lIElOU05fQ09ORklHCQkoMyB8IElOU05fTUFTS19SRUFEfElOU05fTUFTS19XUklURSkKKyNkZWZpbmUgSU5TTl9HVE9ECQkoNCB8IElOU05fTUFTS19SRUFEfElOU05fTUFTS19TUEVDSUFMKQorI2RlZmluZSBJTlNOX1dBSVQJCSg1IHwgSU5TTl9NQVNLX1dSSVRFfElOU05fTUFTS19TUEVDSUFMKQorI2RlZmluZSBJTlNOX0lOVFRSSUcJCSg2IHwgSU5TTl9NQVNLX1dSSVRFfElOU05fTUFTS19TUEVDSUFMKQorCisvKiB0cmlnZ2VyIGZsYWdzICovCisvKiBUaGVzZSBmbGFncyBhcmUgdXNlZCBpbiBjb21lZGlfdHJpZyBzdHJ1Y3R1cmVzICovCisKKyNkZWZpbmUgVFJJR19CT0dVUwkweDAwMDEJLyogZG8gdGhlIG1vdGlvbnMgKi8KKyNkZWZpbmUgVFJJR19ESVRIRVIJMHgwMDAyCS8qIGVuYWJsZSBkaXRoZXJpbmcgKi8KKyNkZWZpbmUgVFJJR19ERUdMSVRDSAkweDAwMDQJLyogZW5hYmxlIGRlZ2xpdGNoaW5nICovCisvKiNkZWZpbmUgVFJJR19SVCAgICAgICAweDAwMDggKi8JLyogcGVyZm9ybSBvcCBpbiByZWFsIHRpbWUgKi8KKyNkZWZpbmUgVFJJR19DT05GSUcJMHgwMDEwCS8qIHBlcmZvcm0gY29uZmlndXJhdGlvbiwgbm90IHRyaWdnZXJpbmcgKi8KKyNkZWZpbmUgVFJJR19XQUtFX0VPUwkweDAwMjAJLyogd2FrZSB1cCBvbiBlbmQtb2Ytc2NhbiBldmVudHMgKi8KKy8qI2RlZmluZSBUUklHX1dSSVRFICAgIDB4MDA0MCovCS8qIHdyaXRlIHRvIGJpZGlyZWN0aW9uYWwgZGV2aWNlcyAqLworCisvKiBjb21tYW5kIGZsYWdzICovCisvKiBUaGVzZSBmbGFncyBhcmUgdXNlZCBpbiBjb21lZGlfY21kIHN0cnVjdHVyZXMgKi8KKworI2RlZmluZSBDTURGX1BSSU9SSVRZCQkweDAwMDAwMDA4CS8qIHRyeSB0byB1c2UgYSByZWFsLXRpbWUgaW50ZXJydXB0IHdoaWxlIHBlcmZvcm1pbmcgY29tbWFuZCAqLworCisjZGVmaW5lIFRSSUdfUlQJCUNNREZfUFJJT1JJVFkJLyogY29tcGF0aWJpbGl0eSBkZWZpbml0aW9uICovCisKKyNkZWZpbmUgQ01ERl9XUklURQkJMHgwMDAwMDA0MAorI2RlZmluZSBUUklHX1dSSVRFCUNNREZfV1JJVEUJLyogY29tcGF0aWJpbGl0eSBkZWZpbml0aW9uICovCisKKyNkZWZpbmUgQ01ERl9SQVdEQVRBCQkweDAwMDAwMDgwCisKKyNkZWZpbmUgQ09NRURJX0VWX1NUQVJUCQkweDAwMDQwMDAwCisjZGVmaW5lIENPTUVESV9FVl9TQ0FOX0JFR0lOCTB4MDAwODAwMDAKKyNkZWZpbmUgQ09NRURJX0VWX0NPTlZFUlQJMHgwMDEwMDAwMAorI2RlZmluZSBDT01FRElfRVZfU0NBTl9FTkQJMHgwMDIwMDAwMAorI2RlZmluZSBDT01FRElfRVZfU1RPUAkJMHgwMDQwMDAwMAorCisjZGVmaW5lIFRSSUdfUk9VTkRfTUFTSwkJMHgwMDAzMDAwMAorI2RlZmluZSBUUklHX1JPVU5EX05FQVJFU1QJMHgwMDAwMDAwMAorI2RlZmluZSBUUklHX1JPVU5EX0RPV04JCTB4MDAwMTAwMDAKKyNkZWZpbmUgVFJJR19ST1VORF9VUAkJMHgwMDAyMDAwMAorI2RlZmluZSBUUklHX1JPVU5EX1VQX05FWFQJMHgwMDAzMDAwMAorCisvKiB0cmlnZ2VyIHNvdXJjZXMgKi8KKworI2RlZmluZSBUUklHX0FOWQkweGZmZmZmZmZmCisjZGVmaW5lIFRSSUdfSU5WQUxJRAkweDAwMDAwMDAwCisKKyNkZWZpbmUgVFJJR19OT05FCTB4MDAwMDAwMDEJLyogbmV2ZXIgdHJpZ2dlciAqLworI2RlZmluZSBUUklHX05PVwkweDAwMDAwMDAyCS8qIHRyaWdnZXIgbm93ICsgTiBucyAqLworI2RlZmluZSBUUklHX0ZPTExPVwkweDAwMDAwMDA0CS8qIHRyaWdnZXIgb24gbmV4dCBsb3dlciBsZXZlbCB0cmlnICovCisjZGVmaW5lIFRSSUdfVElNRQkweDAwMDAwMDA4CS8qIHRyaWdnZXIgYXQgdGltZSBOIG5zICovCisjZGVmaW5lIFRSSUdfVElNRVIJMHgwMDAwMDAxMAkvKiB0cmlnZ2VyIGF0IHJhdGUgTiBucyAqLworI2RlZmluZSBUUklHX0NPVU5UCTB4MDAwMDAwMjAJLyogdHJpZ2dlciB3aGVuIGNvdW50IHJlYWNoZXMgTiAqLworI2RlZmluZSBUUklHX0VYVAkweDAwMDAwMDQwCS8qIHRyaWdnZXIgb24gZXh0ZXJuYWwgc2lnbmFsIE4gKi8KKyNkZWZpbmUgVFJJR19JTlQJMHgwMDAwMDA4MAkvKiB0cmlnZ2VyIG9uIGNvbWVkaS1pbnRlcm5hbCBzaWduYWwgTiAqLworI2RlZmluZSBUUklHX09USEVSCTB4MDAwMDAxMDAJLyogZHJpdmVyIGRlZmluZWQgKi8KKworLyogc3ViZGV2aWNlIGZsYWdzICovCisKKyNkZWZpbmUgU0RGX0JVU1kJMHgwMDAxCS8qIGRldmljZSBpcyBidXN5ICovCisjZGVmaW5lIFNERl9CVVNZX09XTkVSCTB4MDAwMgkvKiBkZXZpY2UgaXMgYnVzeSB3aXRoIHlvdXIgam9iICovCisjZGVmaW5lIFNERl9MT0NLRUQJMHgwMDA0CS8qIHN1YmRldmljZSBpcyBsb2NrZWQgKi8KKyNkZWZpbmUgU0RGX0xPQ0tfT1dORVIJMHgwMDA4CS8qIHlvdSBvd24gbG9jayAqLworI2RlZmluZSBTREZfTUFYREFUQQkweDAwMTAJLyogbWF4ZGF0YSBkZXBlbmRzIG9uIGNoYW5uZWwgKi8KKyNkZWZpbmUgU0RGX0ZMQUdTCTB4MDAyMAkvKiBmbGFncyBkZXBlbmQgb24gY2hhbm5lbCAqLworI2RlZmluZSBTREZfUkFOR0VUWVBFCTB4MDA0MAkvKiByYW5nZSB0eXBlIGRlcGVuZHMgb24gY2hhbm5lbCAqLworI2RlZmluZSBTREZfTU9ERTAJMHgwMDgwCS8qIGNhbiBkbyBtb2RlIDAgKi8KKyNkZWZpbmUgU0RGX01PREUxCTB4MDEwMAkvKiBjYW4gZG8gbW9kZSAxICovCisjZGVmaW5lIFNERl9NT0RFMgkweDAyMDAJLyogY2FuIGRvIG1vZGUgMiAqLworI2RlZmluZSBTREZfTU9ERTMJMHgwNDAwCS8qIGNhbiBkbyBtb2RlIDMgKi8KKyNkZWZpbmUgU0RGX01PREU0CTB4MDgwMAkvKiBjYW4gZG8gbW9kZSA0ICovCisjZGVmaW5lIFNERl9DTUQJCTB4MTAwMAkvKiBjYW4gZG8gY29tbWFuZHMgKGRlcHJlY2F0ZWQpICovCisjZGVmaW5lIFNERl9TT0ZUX0NBTElCUkFURUQJMHgyMDAwCS8qIHN1YmRldmljZSB1c2VzIHNvZnR3YXJlIGNhbGlicmF0aW9uICovCisjZGVmaW5lIFNERl9DTURfV1JJVEUJCTB4NDAwMAkvKiBjYW4gZG8gb3V0cHV0IGNvbW1hbmRzICovCisjZGVmaW5lIFNERl9DTURfUkVBRAkJMHg4MDAwCS8qIGNhbiBkbyBpbnB1dCBjb21tYW5kcyAqLworCisjZGVmaW5lIFNERl9SRUFEQUJMRQkweDAwMDEwMDAwCS8qIHN1YmRldmljZSBjYW4gYmUgcmVhZCAoZS5nLiBhbmFsb2cgaW5wdXQpICovCisjZGVmaW5lIFNERl9XUklUQUJMRQkweDAwMDIwMDAwCS8qIHN1YmRldmljZSBjYW4gYmUgd3JpdHRlbiAoZS5nLiBhbmFsb2cgb3V0cHV0KSAqLworI2RlZmluZSBTREZfV1JJVEVBQkxFCVNERl9XUklUQUJMRQkvKiBzcGVsbGluZyBlcnJvciBpbiBBUEkgKi8KKyNkZWZpbmUgU0RGX0lOVEVSTkFMCTB4MDAwNDAwMDAJLyogc3ViZGV2aWNlIGRvZXMgbm90IGhhdmUgZXh0ZXJuYWxseSB2aXNpYmxlIGxpbmVzICovCisjZGVmaW5lIFNERl9SVAkJMHgwMDA4MDAwMAkvKiBERVBSRUNBVEVEOiBzdWJkZXZpY2UgaXMgUlQgY2FwYWJsZSAqLworI2RlZmluZSBTREZfR1JPVU5ECTB4MDAxMDAwMDAJLyogY2FuIGRvIGFyZWY9Z3JvdW5kICovCisjZGVmaW5lIFNERl9DT01NT04JMHgwMDIwMDAwMAkvKiBjYW4gZG8gYXJlZj1jb21tb24gKi8KKyNkZWZpbmUgU0RGX0RJRkYJMHgwMDQwMDAwMAkvKiBjYW4gZG8gYXJlZj1kaWZmICovCisjZGVmaW5lIFNERl9PVEhFUgkweDAwODAwMDAwCS8qIGNhbiBkbyBhcmVmPW90aGVyICovCisjZGVmaW5lIFNERl9ESVRIRVIJMHgwMTAwMDAwMAkvKiBjYW4gZG8gZGl0aGVyaW5nICovCisjZGVmaW5lIFNERl9ERUdMSVRDSAkweDAyMDAwMDAwCS8qIGNhbiBkbyBkZWdsaXRjaGluZyAqLworI2RlZmluZSBTREZfTU1BUAkweDA0MDAwMDAwCS8qIGNhbiBkbyBtbWFwKCkgKi8KKyNkZWZpbmUgU0RGX1JVTk5JTkcJMHgwODAwMDAwMAkvKiBzdWJkZXZpY2UgaXMgYWNxdWlyaW5nIGRhdGEgKi8KKyNkZWZpbmUgU0RGX0xTQU1QTAkweDEwMDAwMDAwCS8qIHN1YmRldmljZSB1c2VzIDMyLWJpdCBzYW1wbGVzICovCisjZGVmaW5lIFNERl9QQUNLRUQJMHgyMDAwMDAwMAkvKiBzdWJkZXZpY2UgY2FuIGRvIHBhY2tlZCBESU8gKi8KKy8qIHJlIHJlY3lsZSB0aGVzZSBmbGFncyBmb3IgUFdNICovCisjZGVmaW5lIFNERl9QV01fQ09VTlRFUiBTREZfTU9ERTAgICAgICAgLyogUFdNIGNhbiBhdXRvbWF0aWNhbGx5IHN3aXRjaCBvZmYgKi8KKyNkZWZpbmUgU0RGX1BXTV9IQlJJREdFIFNERl9NT0RFMSAgICAgICAvKiBQV00gaXMgc2lnbmVkIChILWJyaWRnZSkgKi8KKworCisKKy8qIHN1YmRldmljZSB0eXBlcyAqLworCitlbnVtIGNvbWVkaV9zdWJkZXZpY2VfdHlwZSB7CisJQ09NRURJX1NVQkRfVU5VU0VELAkvKiB1bnVzZWQgYnkgZHJpdmVyICovCisJQ09NRURJX1NVQkRfQUksCS8qIGFuYWxvZyBpbnB1dCAqLworCUNPTUVESV9TVUJEX0FPLAkvKiBhbmFsb2cgb3V0cHV0ICovCisJQ09NRURJX1NVQkRfREksCS8qIGRpZ2l0YWwgaW5wdXQgKi8KKwlDT01FRElfU1VCRF9ETywJLyogZGlnaXRhbCBvdXRwdXQgKi8KKwlDT01FRElfU1VCRF9ESU8sCS8qIGRpZ2l0YWwgaW5wdXQvb3V0cHV0ICovCisJQ09NRURJX1NVQkRfQ09VTlRFUiwJLyogY291bnRlciAqLworCUNPTUVESV9TVUJEX1RJTUVSLAkvKiB0aW1lciAqLworCUNPTUVESV9TVUJEX01FTU9SWSwJLyogbWVtb3J5LCBFRVBST00sIERQUkFNICovCisJQ09NRURJX1NVQkRfQ0FMSUIsCS8qIGNhbGlicmF0aW9uIERBQ3MgKi8KKwlDT01FRElfU1VCRF9QUk9DLAkvKiBwcm9jZXNzb3IsIERTUCAqLworCUNPTUVESV9TVUJEX1NFUklBTCwJLyogc2VyaWFsIElPICovCisJQ09NRURJX1NVQkRfUFdNICAgICAgICAgLyogUFdNICovCit9OworCisvKiBjb25maWd1cmF0aW9uIGluc3RydWN0aW9ucyAqLworCitlbnVtIGNvbmZpZ3VyYXRpb25faWRzIHsKKwlJTlNOX0NPTkZJR19ESU9fSU5QVVQgPSAwLAorCUlOU05fQ09ORklHX0RJT19PVVRQVVQgPSAxLAorCUlOU05fQ09ORklHX0RJT19PUEVORFJBSU4gPSAyLAorCUlOU05fQ09ORklHX0FOQUxPR19UUklHID0gMTYsCisvKglJTlNOX0NPTkZJR19XQVZFRk9STSA9IDE3LCAqLworLyoJSU5TTl9DT05GSUdfVFJJRyA9IDE4LCAqLworLyoJSU5TTl9DT05GSUdfQ09VTlRFUiA9IDE5LCAqLworCUlOU05fQ09ORklHX0FMVF9TT1VSQ0UgPSAyMCwKKwlJTlNOX0NPTkZJR19ESUdJVEFMX1RSSUcgPSAyMSwKKwlJTlNOX0NPTkZJR19CTE9DS19TSVpFID0gMjIsCisJSU5TTl9DT05GSUdfVElNRVJfMSA9IDIzLAorCUlOU05fQ09ORklHX0ZJTFRFUiA9IDI0LAorCUlOU05fQ09ORklHX0NIQU5HRV9OT1RJRlkgPSAyNSwKKworCSAvKkFMUEhBKi8gSU5TTl9DT05GSUdfU0VSSUFMX0NMT0NLID0gMjYsCisJSU5TTl9DT05GSUdfQklESVJFQ1RJT05BTF9EQVRBID0gMjcsCisJSU5TTl9DT05GSUdfRElPX1FVRVJZID0gMjgsCisJSU5TTl9DT05GSUdfUFdNX09VVFBVVCA9IDI5LAorCUlOU05fQ09ORklHX0dFVF9QV01fT1VUUFVUID0gMzAsCisJSU5TTl9DT05GSUdfQVJNID0gMzEsCisJSU5TTl9DT05GSUdfRElTQVJNID0gMzIsCisJSU5TTl9DT05GSUdfR0VUX0NPVU5URVJfU1RBVFVTID0gMzMsCisJSU5TTl9DT05GSUdfUkVTRVQgPSAzNCwKKwlJTlNOX0NPTkZJR19HUENUX1NJTkdMRV9QVUxTRV9HRU5FUkFUT1IgPSAxMDAxLAkvKiBVc2UgQ1RSIGFzIHNpbmdsZSBwdWxzZWdlbmVyYXRvciAqLworCUlOU05fQ09ORklHX0dQQ1RfUFVMU0VfVFJBSU5fR0VORVJBVE9SID0gMTAwMiwJLyogVXNlIENUUiBhcyBwdWxzZXRyYWluZ2VuZXJhdG9yICovCisJSU5TTl9DT05GSUdfR1BDVF9RVUFEUkFUVVJFX0VOQ09ERVIgPSAxMDAzLAkvKiBVc2UgdGhlIGNvdW50ZXIgYXMgZW5jb2RlciAqLworCUlOU05fQ09ORklHX1NFVF9HQVRFX1NSQyA9IDIwMDEsCS8qIFNldCBnYXRlIHNvdXJjZSAqLworCUlOU05fQ09ORklHX0dFVF9HQVRFX1NSQyA9IDIwMDIsCS8qIEdldCBnYXRlIHNvdXJjZSAqLworCUlOU05fQ09ORklHX1NFVF9DTE9DS19TUkMgPSAyMDAzLAkvKiBTZXQgbWFzdGVyIGNsb2NrIHNvdXJjZSAqLworCUlOU05fQ09ORklHX0dFVF9DTE9DS19TUkMgPSAyMDA0LAkvKiBHZXQgbWFzdGVyIGNsb2NrIHNvdXJjZSAqLworCUlOU05fQ09ORklHX1NFVF9PVEhFUl9TUkMgPSAyMDA1LAkvKiBTZXQgb3RoZXIgc291cmNlICovCisvKglJTlNOX0NPTkZJR19HRVRfT1RIRVJfU1JDID0gMjAwNiwqLwkvKiBHZXQgb3RoZXIgc291cmNlICovCisJSU5TTl9DT05GSUdfR0VUX0hBUkRXQVJFX0JVRkZFUl9TSVpFLAkvKiBHZXQgc2l6ZSBpbiBieXRlcyBvZgorCQkJCQkJICBzdWJkZXZpY2UncyBvbi1ib2FyZCBmaWZvcworCQkJCQkJICB1c2VkIGR1cmluZyBzdHJlYW1pbmcKKwkJCQkJCSAgaW5wdXQvb3V0cHV0ICovCisJSU5TTl9DT05GSUdfU0VUX0NPVU5URVJfTU9ERSA9IDQwOTcsCisJSU5TTl9DT05GSUdfODI1NF9TRVRfTU9ERSA9IElOU05fQ09ORklHX1NFVF9DT1VOVEVSX01PREUsCS8qIGRlcHJlY2F0ZWQgKi8KKwlJTlNOX0NPTkZJR184MjU0X1JFQURfU1RBVFVTID0gNDA5OCwKKwlJTlNOX0NPTkZJR19TRVRfUk9VVElORyA9IDQwOTksCisJSU5TTl9DT05GSUdfR0VUX1JPVVRJTkcgPSA0MTA5LAorLyogUFdNICovCisJSU5TTl9DT05GSUdfUFdNX1NFVF9QRVJJT0QgPSA1MDAwLCAgIC8qIHNldHMgZnJlcXVlbmN5ICovCisJSU5TTl9DT05GSUdfUFdNX0dFVF9QRVJJT0QgPSA1MDAxLCAgIC8qIGdldHMgZnJlcXVlbmN5ICovCisJSU5TTl9DT05GSUdfR0VUX1BXTV9TVEFUVVMgPSA1MDAyLCAgICAgICAgICAvKiBpcyBpdCBydW5uaW5nPyAqLworCUlOU05fQ09ORklHX1BXTV9TRVRfSF9CUklER0UgPSA1MDAzLCAvKiBzZXRzIEggYnJpZGdlOiBkdXR5IGN5Y2xlIGFuZCBzaWduIGJpdCBmb3IgYSByZWxheSAgYXQgdGhlIHNhbWUgdGltZSovCisJSU5TTl9DT05GSUdfUFdNX0dFVF9IX0JSSURHRSA9IDUwMDQgIC8qIGdldHMgSCBicmlkZ2UgZGF0YTogZHV0eSBjeWNsZSBhbmQgdGhlIHNpZ24gYml0ICovCit9OworCitlbnVtIGNvbWVkaV9pb19kaXJlY3Rpb24geworCUNPTUVESV9JTlBVVCA9IDAsCisJQ09NRURJX09VVFBVVCA9IDEsCisJQ09NRURJX09QRU5EUkFJTiA9IDIKK307CisKK2VudW0gY29tZWRpX3N1cHBvcnRfbGV2ZWwgeworCUNPTUVESV9VTktOT1dOX1NVUFBPUlQgPSAwLAorCUNPTUVESV9TVVBQT1JURUQsCisJQ09NRURJX1VOU1VQUE9SVEVECit9OworCisvKiBpb2N0bHMgKi8KKworI2RlZmluZSBDSU8gJ2QnCisjZGVmaW5lIENPTUVESV9ERVZDT05GSUcgX0lPVyhDSU8sIDAsIGNvbWVkaV9kZXZjb25maWcpCisjZGVmaW5lIENPTUVESV9ERVZJTkZPIF9JT1IoQ0lPLCAxLCBjb21lZGlfZGV2aW5mbykKKyNkZWZpbmUgQ09NRURJX1NVQkRJTkZPIF9JT1IoQ0lPLCAyLCBjb21lZGlfc3ViZGluZm8pCisjZGVmaW5lIENPTUVESV9DSEFOSU5GTyBfSU9SKENJTywgMywgY29tZWRpX2NoYW5pbmZvKQorI2RlZmluZSBDT01FRElfVFJJRyBfSU9XUihDSU8sIDQsIGNvbWVkaV90cmlnKQorI2RlZmluZSBDT01FRElfTE9DSyBfSU8oQ0lPLCA1KQorI2RlZmluZSBDT01FRElfVU5MT0NLIF9JTyhDSU8sIDYpCisjZGVmaW5lIENPTUVESV9DQU5DRUwgX0lPKENJTywgNykKKyNkZWZpbmUgQ09NRURJX1JBTkdFSU5GTyBfSU9SKENJTywgOCwgY29tZWRpX3JhbmdlaW5mbykKKyNkZWZpbmUgQ09NRURJX0NNRCBfSU9SKENJTywgOSwgY29tZWRpX2NtZCkKKyNkZWZpbmUgQ09NRURJX0NNRFRFU1QgX0lPUihDSU8sIDEwLCBjb21lZGlfY21kKQorI2RlZmluZSBDT01FRElfSU5TTkxJU1QgX0lPUihDSU8sIDExLCBjb21lZGlfaW5zbmxpc3QpCisjZGVmaW5lIENPTUVESV9JTlNOIF9JT1IoQ0lPLCAxMiwgY29tZWRpX2luc24pCisjZGVmaW5lIENPTUVESV9CVUZDT05GSUcgX0lPUihDSU8sIDEzLCBjb21lZGlfYnVmY29uZmlnKQorI2RlZmluZSBDT01FRElfQlVGSU5GTyBfSU9XUihDSU8sIDE0LCBjb21lZGlfYnVmaW5mbykKKyNkZWZpbmUgQ09NRURJX1BPTEwgX0lPKENJTywgMTUpCisKKy8qIHN0cnVjdHVyZXMgKi8KKwordHlwZWRlZiBzdHJ1Y3QgY29tZWRpX3RyaWdfc3RydWN0IGNvbWVkaV90cmlnOwordHlwZWRlZiBzdHJ1Y3QgY29tZWRpX2NtZF9zdHJ1Y3QgY29tZWRpX2NtZDsKK3R5cGVkZWYgc3RydWN0IGNvbWVkaV9pbnNuX3N0cnVjdCBjb21lZGlfaW5zbjsKK3R5cGVkZWYgc3RydWN0IGNvbWVkaV9pbnNubGlzdF9zdHJ1Y3QgY29tZWRpX2luc25saXN0OwordHlwZWRlZiBzdHJ1Y3QgY29tZWRpX2NoYW5pbmZvX3N0cnVjdCBjb21lZGlfY2hhbmluZm87Cit0eXBlZGVmIHN0cnVjdCBjb21lZGlfc3ViZGluZm9fc3RydWN0IGNvbWVkaV9zdWJkaW5mbzsKK3R5cGVkZWYgc3RydWN0IGNvbWVkaV9kZXZpbmZvX3N0cnVjdCBjb21lZGlfZGV2aW5mbzsKK3R5cGVkZWYgc3RydWN0IGNvbWVkaV9kZXZjb25maWdfc3RydWN0IGNvbWVkaV9kZXZjb25maWc7Cit0eXBlZGVmIHN0cnVjdCBjb21lZGlfcmFuZ2VpbmZvX3N0cnVjdCBjb21lZGlfcmFuZ2VpbmZvOwordHlwZWRlZiBzdHJ1Y3QgY29tZWRpX2tyYW5nZV9zdHJ1Y3QgY29tZWRpX2tyYW5nZTsKK3R5cGVkZWYgc3RydWN0IGNvbWVkaV9idWZjb25maWdfc3RydWN0IGNvbWVkaV9idWZjb25maWc7Cit0eXBlZGVmIHN0cnVjdCBjb21lZGlfYnVmaW5mb19zdHJ1Y3QgY29tZWRpX2J1ZmluZm87CisKK3N0cnVjdCBjb21lZGlfdHJpZ19zdHJ1Y3QgeworCXVuc2lnbmVkIGludCBzdWJkZXY7CS8qIHN1YmRldmljZSAqLworCXVuc2lnbmVkIGludCBtb2RlOwkvKiBtb2RlICovCisJdW5zaWduZWQgaW50IGZsYWdzOworCXVuc2lnbmVkIGludCBuX2NoYW47CS8qIG51bWJlciBvZiBjaGFubmVscyAqLworCXVuc2lnbmVkIGludCAqY2hhbmxpc3Q7CS8qIGNoYW5uZWwvcmFuZ2UgbGlzdCAqLworCXNhbXBsX3QgKmRhdGE7CS8qIGRhdGEgbGlzdCwgc2l6ZSBkZXBlbmRzIG9uIHN1YmQgZmxhZ3MgKi8KKwl1bnNpZ25lZCBpbnQgbjsJLyogbnVtYmVyIG9mIHNjYW5zICovCisJdW5zaWduZWQgaW50IHRyaWdzcmM7CisJdW5zaWduZWQgaW50IHRyaWd2YXI7CisJdW5zaWduZWQgaW50IHRyaWd2YXIxOworCXVuc2lnbmVkIGludCBkYXRhX2xlbjsKKwl1bnNpZ25lZCBpbnQgdW51c2VkWzNdOworfTsKKworc3RydWN0IGNvbWVkaV9pbnNuX3N0cnVjdCB7CisJdW5zaWduZWQgaW50IGluc247CisJdW5zaWduZWQgaW50IG47CisJbHNhbXBsX3QgKmRhdGE7CisJdW5zaWduZWQgaW50IHN1YmRldjsKKwl1bnNpZ25lZCBpbnQgY2hhbnNwZWM7CisJdW5zaWduZWQgaW50IHVudXNlZFszXTsKK307CisKK3N0cnVjdCBjb21lZGlfaW5zbmxpc3Rfc3RydWN0IHsKKwl1bnNpZ25lZCBpbnQgbl9pbnNuczsKKwljb21lZGlfaW5zbiAqaW5zbnM7Cit9OworCitzdHJ1Y3QgY29tZWRpX2NtZF9zdHJ1Y3QgeworCXVuc2lnbmVkIGludCBzdWJkZXY7CisJdW5zaWduZWQgaW50IGZsYWdzOworCisJdW5zaWduZWQgaW50IHN0YXJ0X3NyYzsKKwl1bnNpZ25lZCBpbnQgc3RhcnRfYXJnOworCisJdW5zaWduZWQgaW50IHNjYW5fYmVnaW5fc3JjOworCXVuc2lnbmVkIGludCBzY2FuX2JlZ2luX2FyZzsKKworCXVuc2lnbmVkIGludCBjb252ZXJ0X3NyYzsKKwl1bnNpZ25lZCBpbnQgY29udmVydF9hcmc7CisKKwl1bnNpZ25lZCBpbnQgc2Nhbl9lbmRfc3JjOworCXVuc2lnbmVkIGludCBzY2FuX2VuZF9hcmc7CisKKwl1bnNpZ25lZCBpbnQgc3RvcF9zcmM7CisJdW5zaWduZWQgaW50IHN0b3BfYXJnOworCisJdW5zaWduZWQgaW50ICpjaGFubGlzdDsJLyogY2hhbm5lbC9yYW5nZSBsaXN0ICovCisJdW5zaWduZWQgaW50IGNoYW5saXN0X2xlbjsKKworCXNhbXBsX3QgKmRhdGE7CS8qIGRhdGEgbGlzdCwgc2l6ZSBkZXBlbmRzIG9uIHN1YmQgZmxhZ3MgKi8KKwl1bnNpZ25lZCBpbnQgZGF0YV9sZW47Cit9OworCitzdHJ1Y3QgY29tZWRpX2NoYW5pbmZvX3N0cnVjdCB7CisJdW5zaWduZWQgaW50IHN1YmRldjsKKwlsc2FtcGxfdCAqbWF4ZGF0YV9saXN0OworCXVuc2lnbmVkIGludCAqZmxhZ2xpc3Q7CisJdW5zaWduZWQgaW50ICpyYW5nZWxpc3Q7CisJdW5zaWduZWQgaW50IHVudXNlZFs0XTsKK307CisKK3N0cnVjdCBjb21lZGlfcmFuZ2VpbmZvX3N0cnVjdCB7CisJdW5zaWduZWQgaW50IHJhbmdlX3R5cGU7CisJdm9pZCAqcmFuZ2VfcHRyOworfTsKKworc3RydWN0IGNvbWVkaV9rcmFuZ2Vfc3RydWN0IHsKKwlpbnQgbWluOwkvKiBmaXhlZCBwb2ludCwgbXVsdGlwbHkgYnkgMWUtNiAqLworCWludCBtYXg7CS8qIGZpeGVkIHBvaW50LCBtdWx0aXBseSBieSAxZS02ICovCisJdW5zaWduZWQgaW50IGZsYWdzOworfTsKKworCitzdHJ1Y3QgY29tZWRpX3N1YmRpbmZvX3N0cnVjdCB7CisJdW5zaWduZWQgaW50IHR5cGU7CisJdW5zaWduZWQgaW50IG5fY2hhbjsKKwl1bnNpZ25lZCBpbnQgc3ViZF9mbGFnczsKKwl1bnNpZ25lZCBpbnQgdGltZXJfdHlwZTsKKwl1bnNpZ25lZCBpbnQgbGVuX2NoYW5saXN0OworCWxzYW1wbF90IG1heGRhdGE7CisJdW5zaWduZWQgaW50IGZsYWdzOwkvKiBjaGFubmVsIGZsYWdzICovCisJdW5zaWduZWQgaW50IHJhbmdlX3R5cGU7CS8qIGxvb2t1cCBpbiBrZXJuZWwgKi8KKwl1bnNpZ25lZCBpbnQgc2V0dGxpbmdfdGltZV8wOworCXVuc2lnbmVkIGluc25fYml0c19zdXBwb3J0OwkvKiBzZWUgc3VwcG9ydF9sZXZlbCBlbnVtIGZvciB2YWx1ZXMqLworCXVuc2lnbmVkIGludCB1bnVzZWRbOF07Cit9OworCitzdHJ1Y3QgY29tZWRpX2RldmluZm9fc3RydWN0IHsKKwl1bnNpZ25lZCBpbnQgdmVyc2lvbl9jb2RlOworCXVuc2lnbmVkIGludCBuX3N1YmRldnM7CisJY2hhciBkcml2ZXJfbmFtZVtDT01FRElfTkFNRUxFTl07CisJY2hhciBib2FyZF9uYW1lW0NPTUVESV9OQU1FTEVOXTsKKwlpbnQgcmVhZF9zdWJkZXZpY2U7CisJaW50IHdyaXRlX3N1YmRldmljZTsKKwlpbnQgdW51c2VkWzMwXTsKK307CisKK3N0cnVjdCBjb21lZGlfZGV2Y29uZmlnX3N0cnVjdCB7CisJY2hhciBib2FyZF9uYW1lW0NPTUVESV9OQU1FTEVOXTsKKwlpbnQgb3B0aW9uc1tDT01FRElfTkRFVkNPTkZPUFRTXTsKK307CisKK3N0cnVjdCBjb21lZGlfYnVmY29uZmlnX3N0cnVjdCB7CisJdW5zaWduZWQgaW50IHN1YmRldmljZTsKKwl1bnNpZ25lZCBpbnQgZmxhZ3M7CisKKwl1bnNpZ25lZCBpbnQgbWF4aW11bV9zaXplOworCXVuc2lnbmVkIGludCBzaXplOworCisJdW5zaWduZWQgaW50IHVudXNlZFs0XTsKK307CisKK3N0cnVjdCBjb21lZGlfYnVmaW5mb19zdHJ1Y3QgeworCXVuc2lnbmVkIGludCBzdWJkZXZpY2U7CisJdW5zaWduZWQgaW50IGJ5dGVzX3JlYWQ7CisKKwl1bnNpZ25lZCBpbnQgYnVmX3dyaXRlX3B0cjsKKwl1bnNpZ25lZCBpbnQgYnVmX3JlYWRfcHRyOworCXVuc2lnbmVkIGludCBidWZfd3JpdGVfY291bnQ7CisJdW5zaWduZWQgaW50IGJ1Zl9yZWFkX2NvdW50OworCisJdW5zaWduZWQgaW50IGJ5dGVzX3dyaXR0ZW47CisKKwl1bnNpZ25lZCBpbnQgdW51c2VkWzRdOworfTsKKworLyogcmFuZ2Ugc3R1ZmYgKi8KKworI2RlZmluZSBfX1JBTkdFKGEsIGIpCSgoKChhKSYweGZmZmYpPDwxNil8KChiKSYweGZmZmYpKQorCisjZGVmaW5lIFJBTkdFX09GRlNFVChhKQkJKCgoYSk+PjE2KSYweGZmZmYpCisjZGVmaW5lIFJBTkdFX0xFTkdUSChiKQkJKChiKSYweGZmZmYpCisKKyNkZWZpbmUgUkZfVU5JVChmbGFncykJCSgoZmxhZ3MpJjB4ZmYpCisjZGVmaW5lIFJGX0VYVEVSTkFMCQkoMTw8OCkKKworI2RlZmluZSBVTklUX3ZvbHQJCTAKKyNkZWZpbmUgVU5JVF9tQQkJCTEKKyNkZWZpbmUgVU5JVF9ub25lCQkyCisKKyNkZWZpbmUgQ09NRURJX01JTl9TUEVFRAkoKHVuc2lnbmVkIGludCkweGZmZmZmZmZmKQorCisvKiBjYWxsYmFjayBzdHVmZiAqLworLyogb25seSByZWxldmFudCB0byBrZXJuZWwgbW9kdWxlcy4gKi8KKworI2RlZmluZSBDT01FRElfQ0JfRU9TCQkxCS8qIGVuZCBvZiBzY2FuICovCisjZGVmaW5lIENPTUVESV9DQl9FT0EJCTIJLyogZW5kIG9mIGFjcXVpc2l0aW9uICovCisjZGVmaW5lIENPTUVESV9DQl9CTE9DSwkJNAkvKiBERVBSRUNBVEVEOiBjb252ZW5pZW50IGJsb2NrIHNpemUgKi8KKyNkZWZpbmUgQ09NRURJX0NCX0VPQlVGCQk4CS8qIERFUFJFQ0FURUQ6IGVuZCBvZiBidWZmZXIgKi8KKyNkZWZpbmUgQ09NRURJX0NCX0VSUk9SCQkxNgkvKiBjYXJkIGVycm9yIGR1cmluZyBhY3F1aXNpdGlvbiAqLworI2RlZmluZSBDT01FRElfQ0JfT1ZFUkZMT1cJMzIJLyogYnVmZmVyIG92ZXJmbG93L3VuZGVyZmxvdyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIGV2ZXJ5dGhpbmcgYWZ0ZXIgdGhpcyBsaW5lIGlzIEFMUEhBICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAgODI1NCBzcGVjaWZpYyBjb25maWd1cmF0aW9uLgorCisgIEl0IHN1cHBvcnRzIHR3byBjb25maWcgY29tbWFuZHM6CisKKyAgMCBJRDogSU5TTl9DT05GSUdfU0VUX0NPVU5URVJfTU9ERQorICAxIDgyNTQgTW9kZQorICAgIEk4MjU0X01PREUwLCBJODI1NF9NT0RFMSwgLi4uLCBJODI1NF9NT0RFNQorICAgIE9SJ2VkIHdpdGg6CisgICAgSTgyNTRfQkNELCBJODI1NF9CSU5BUlkKKworICAwIElEOiBJTlNOX0NPTkZJR184MjU0X1JFQURfU1RBVFVTCisgIDEgPC0tIFN0YXR1cyBieXRlIHJldHVybmVkIGhlcmUuCisgICAgQjcgPSBPdXRwdXQKKyAgICBCNiA9IE5VTEwgQ291bnQKKyAgICBCNSAtIEIwIEN1cnJlbnQgbW9kZS4KKworKi8KKworZW51bSBpODI1NF9tb2RlIHsKKwlJODI1NF9NT0RFMCA9ICgwIDw8IDEpLAkvKiBJbnRlcnJ1cHQgb24gdGVybWluYWwgY291bnQgKi8KKwlJODI1NF9NT0RFMSA9ICgxIDw8IDEpLAkvKiBIYXJkd2FyZSByZXRyaWdnZXJhYmxlIG9uZS1zaG90ICovCisJSTgyNTRfTU9ERTIgPSAoMiA8PCAxKSwJLyogUmF0ZSBnZW5lcmF0b3IgKi8KKwlJODI1NF9NT0RFMyA9ICgzIDw8IDEpLAkvKiBTcXVhcmUgd2F2ZSBtb2RlICovCisJSTgyNTRfTU9ERTQgPSAoNCA8PCAxKSwJLyogU29mdHdhcmUgdHJpZ2dlcmVkIHN0cm9iZSAqLworCUk4MjU0X01PREU1ID0gKDUgPDwgMSksCS8qIEhhcmR3YXJlIHRyaWdnZXJlZCBzdHJvYmUgKHJldHJpZ2dlcmFibGUpICovCisJSTgyNTRfQkNEID0gMSwJLyogdXNlIGJpbmFyeS1jb2RlZCBkZWNpbWFsIGluc3RlYWQgb2YgYmluYXJ5IChwcmV0dHkgdXNlbGVzcykgKi8KKwlJODI1NF9CSU5BUlkgPSAwCit9OworCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIE5JX1VTVUFMX1BGSV9TRUxFQ1QodW5zaWduZWQgcGZpX2NoYW5uZWwpCit7CisJaWYgKHBmaV9jaGFubmVsIDwgMTApCisJCXJldHVybiAweDEgKyBwZmlfY2hhbm5lbDsKKwllbHNlCisJCXJldHVybiAweGIgKyBwZmlfY2hhbm5lbDsKK30KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgTklfVVNVQUxfUlRTSV9TRUxFQ1QodW5zaWduZWQgcnRzaV9jaGFubmVsKQoreworCWlmIChydHNpX2NoYW5uZWwgPCA3KQorCQlyZXR1cm4gMHhiICsgcnRzaV9jaGFubmVsOworCWVsc2UKKwkJcmV0dXJuIDB4MWI7Cit9CisvKiBtb2RlIGJpdHMgZm9yIE5JIGdlbmVyYWwtcHVycG9zZSBjb3VudGVycywgc2V0IHdpdGgKKyAqIElOU05fQ09ORklHX1NFVF9DT1VOVEVSX01PREUgKi8KKyNkZWZpbmUgTklfR1BDVF9DT1VOVElOR19NT0RFX1NISUZUIDE2CisjZGVmaW5lIE5JX0dQQ1RfSU5ERVhfUEhBU0VfQklUU0hJRlQgMjAKKyNkZWZpbmUgTklfR1BDVF9DT1VOVElOR19ESVJFQ1RJT05fU0hJRlQgMjQKK2VudW0gbmlfZ3BjdF9tb2RlX2JpdHMgeworCU5JX0dQQ1RfR0FURV9PTl9CT1RIX0VER0VTX0JJVCA9IDB4NCwKKwlOSV9HUENUX0VER0VfR0FURV9NT0RFX01BU0sgPSAweDE4LAorCU5JX0dQQ1RfRURHRV9HQVRFX1NUQVJUU19TVE9QU19CSVRTID0gMHgwLAorCU5JX0dQQ1RfRURHRV9HQVRFX1NUT1BTX1NUQVJUU19CSVRTID0gMHg4LAorCU5JX0dQQ1RfRURHRV9HQVRFX1NUQVJUU19CSVRTID0gMHgxMCwKKwlOSV9HUENUX0VER0VfR0FURV9OT19TVEFSVFNfTk9fU1RPUFNfQklUUyA9IDB4MTgsCisJTklfR1BDVF9TVE9QX01PREVfTUFTSyA9IDB4NjAsCisJTklfR1BDVF9TVE9QX09OX0dBVEVfQklUUyA9IDB4MDAsCisJTklfR1BDVF9TVE9QX09OX0dBVEVfT1JfVENfQklUUyA9IDB4MjAsCisJTklfR1BDVF9TVE9QX09OX0dBVEVfT1JfU0VDT05EX1RDX0JJVFMgPSAweDQwLAorCU5JX0dQQ1RfTE9BRF9CX1NFTEVDVF9CSVQgPSAweDgwLAorCU5JX0dQQ1RfT1VUUFVUX01PREVfTUFTSyA9IDB4MzAwLAorCU5JX0dQQ1RfT1VUUFVUX1RDX1BVTFNFX0JJVFMgPSAweDEwMCwKKwlOSV9HUENUX09VVFBVVF9UQ19UT0dHTEVfQklUUyA9IDB4MjAwLAorCU5JX0dQQ1RfT1VUUFVUX1RDX09SX0dBVEVfVE9HR0xFX0JJVFMgPSAweDMwMCwKKwlOSV9HUENUX0hBUkRXQVJFX0RJU0FSTV9NQVNLID0gMHhjMDAsCisJTklfR1BDVF9OT19IQVJEV0FSRV9ESVNBUk1fQklUUyA9IDB4MDAwLAorCU5JX0dQQ1RfRElTQVJNX0FUX1RDX0JJVFMgPSAweDQwMCwKKwlOSV9HUENUX0RJU0FSTV9BVF9HQVRFX0JJVFMgPSAweDgwMCwKKwlOSV9HUENUX0RJU0FSTV9BVF9UQ19PUl9HQVRFX0JJVFMgPSAweGMwMCwKKwlOSV9HUENUX0xPQURJTkdfT05fVENfQklUID0gMHgxMDAwLAorCU5JX0dQQ1RfTE9BRElOR19PTl9HQVRFX0JJVCA9IDB4NDAwMCwKKwlOSV9HUENUX0NPVU5USU5HX01PREVfTUFTSyA9IDB4NyA8PCBOSV9HUENUX0NPVU5USU5HX01PREVfU0hJRlQsCisJTklfR1BDVF9DT1VOVElOR19NT0RFX05PUk1BTF9CSVRTID0KKwkJMHgwIDw8IE5JX0dQQ1RfQ09VTlRJTkdfTU9ERV9TSElGVCwKKwlOSV9HUENUX0NPVU5USU5HX01PREVfUVVBRFJBVFVSRV9YMV9CSVRTID0KKwkJMHgxIDw8IE5JX0dQQ1RfQ09VTlRJTkdfTU9ERV9TSElGVCwKKwlOSV9HUENUX0NPVU5USU5HX01PREVfUVVBRFJBVFVSRV9YMl9CSVRTID0KKwkJMHgyIDw8IE5JX0dQQ1RfQ09VTlRJTkdfTU9ERV9TSElGVCwKKwlOSV9HUENUX0NPVU5USU5HX01PREVfUVVBRFJBVFVSRV9YNF9CSVRTID0KKwkJMHgzIDw8IE5JX0dQQ1RfQ09VTlRJTkdfTU9ERV9TSElGVCwKKwlOSV9HUENUX0NPVU5USU5HX01PREVfVFdPX1BVTFNFX0JJVFMgPQorCQkweDQgPDwgTklfR1BDVF9DT1VOVElOR19NT0RFX1NISUZULAorCU5JX0dQQ1RfQ09VTlRJTkdfTU9ERV9TWU5DX1NPVVJDRV9CSVRTID0KKwkJMHg2IDw8IE5JX0dQQ1RfQ09VTlRJTkdfTU9ERV9TSElGVCwKKwlOSV9HUENUX0lOREVYX1BIQVNFX01BU0sgPSAweDMgPDwgTklfR1BDVF9JTkRFWF9QSEFTRV9CSVRTSElGVCwKKwlOSV9HUENUX0lOREVYX1BIQVNFX0xPV19BX0xPV19CX0JJVFMgPQorCQkweDAgPDwgTklfR1BDVF9JTkRFWF9QSEFTRV9CSVRTSElGVCwKKwlOSV9HUENUX0lOREVYX1BIQVNFX0xPV19BX0hJR0hfQl9CSVRTID0KKwkJMHgxIDw8IE5JX0dQQ1RfSU5ERVhfUEhBU0VfQklUU0hJRlQsCisJTklfR1BDVF9JTkRFWF9QSEFTRV9ISUdIX0FfTE9XX0JfQklUUyA9CisJCTB4MiA8PCBOSV9HUENUX0lOREVYX1BIQVNFX0JJVFNISUZULAorCU5JX0dQQ1RfSU5ERVhfUEhBU0VfSElHSF9BX0hJR0hfQl9CSVRTID0KKwkJMHgzIDw8IE5JX0dQQ1RfSU5ERVhfUEhBU0VfQklUU0hJRlQsCisJTklfR1BDVF9JTkRFWF9FTkFCTEVfQklUID0gMHg0MDAwMDAsCisJTklfR1BDVF9DT1VOVElOR19ESVJFQ1RJT05fTUFTSyA9CisJCTB4MyA8PCBOSV9HUENUX0NPVU5USU5HX0RJUkVDVElPTl9TSElGVCwKKwlOSV9HUENUX0NPVU5USU5HX0RJUkVDVElPTl9ET1dOX0JJVFMgPQorCQkweDAwIDw8IE5JX0dQQ1RfQ09VTlRJTkdfRElSRUNUSU9OX1NISUZULAorCU5JX0dQQ1RfQ09VTlRJTkdfRElSRUNUSU9OX1VQX0JJVFMgPQorCQkweDEgPDwgTklfR1BDVF9DT1VOVElOR19ESVJFQ1RJT05fU0hJRlQsCisJTklfR1BDVF9DT1VOVElOR19ESVJFQ1RJT05fSFdfVVBfRE9XTl9CSVRTID0KKwkJMHgyIDw8IE5JX0dQQ1RfQ09VTlRJTkdfRElSRUNUSU9OX1NISUZULAorCU5JX0dQQ1RfQ09VTlRJTkdfRElSRUNUSU9OX0hXX0dBVEVfQklUUyA9CisJCTB4MyA8PCBOSV9HUENUX0NPVU5USU5HX0RJUkVDVElPTl9TSElGVCwKKwlOSV9HUENUX1JFTE9BRF9TT1VSQ0VfTUFTSyA9IDB4YzAwMDAwMCwKKwlOSV9HUENUX1JFTE9BRF9TT1VSQ0VfRklYRURfQklUUyA9IDB4MCwKKwlOSV9HUENUX1JFTE9BRF9TT1VSQ0VfU1dJVENISU5HX0JJVFMgPSAweDQwMDAwMDAsCisJTklfR1BDVF9SRUxPQURfU09VUkNFX0dBVEVfU0VMRUNUX0JJVFMgPSAweDgwMDAwMDAsCisJTklfR1BDVF9PUl9HQVRFX0JJVCA9IDB4MTAwMDAwMDAsCisJTklfR1BDVF9JTlZFUlRfT1VUUFVUX0JJVCA9IDB4MjAwMDAwMDAKK307CisKKy8qIEJpdHMgZm9yIHNldHRpbmcgYSBjbG9jayBzb3VyY2Ugd2l0aAorICogSU5TTl9DT05GSUdfU0VUX0NMT0NLX1NSQyB3aGVuIHVzaW5nIE5JIGdlbmVyYWwtcHVycG9zZSBjb3VudGVycy4gKi8KK2VudW0gbmlfZ3BjdF9jbG9ja19zb3VyY2VfYml0cyB7CisJTklfR1BDVF9DTE9DS19TUkNfU0VMRUNUX01BU0sgPSAweDNmLAorCU5JX0dQQ1RfVElNRUJBU0VfMV9DTE9DS19TUkNfQklUUyA9IDB4MCwKKwlOSV9HUENUX1RJTUVCQVNFXzJfQ0xPQ0tfU1JDX0JJVFMgPSAweDEsCisJTklfR1BDVF9USU1FQkFTRV8zX0NMT0NLX1NSQ19CSVRTID0gMHgyLAorCU5JX0dQQ1RfTE9HSUNfTE9XX0NMT0NLX1NSQ19CSVRTID0gMHgzLAorCU5JX0dQQ1RfTkVYVF9HQVRFX0NMT0NLX1NSQ19CSVRTID0gMHg0LAorCU5JX0dQQ1RfTkVYVF9UQ19DTE9DS19TUkNfQklUUyA9IDB4NSwKKwlOSV9HUENUX1NPVVJDRV9QSU5faV9DTE9DS19TUkNfQklUUyA9IDB4NiwJLyogTkkgNjYweC1zcGVjaWZpYyAqLworCU5JX0dQQ1RfUFhJMTBfQ0xPQ0tfU1JDX0JJVFMgPSAweDcsCisJTklfR1BDVF9QWElfU1RBUl9UUklHR0VSX0NMT0NLX1NSQ19CSVRTID0gMHg4LAorCU5JX0dQQ1RfQU5BTE9HX1RSSUdHRVJfT1VUX0NMT0NLX1NSQ19CSVRTID0gMHg5LAorCU5JX0dQQ1RfUFJFU0NBTEVfTU9ERV9DTE9DS19TUkNfTUFTSyA9IDB4MzAwMDAwMDAsCisJTklfR1BDVF9OT19QUkVTQ0FMRV9DTE9DS19TUkNfQklUUyA9IDB4MCwKKwlOSV9HUENUX1BSRVNDQUxFX1gyX0NMT0NLX1NSQ19CSVRTID0gMHgxMDAwMDAwMCwgLyogZGl2aWRlIHNvdXJjZSBieSAyICovCisJTklfR1BDVF9QUkVTQ0FMRV9YOF9DTE9DS19TUkNfQklUUyA9IDB4MjAwMDAwMDAsIC8qIGRpdmlkZSBzb3VyY2UgYnkgOCAqLworCU5JX0dQQ1RfSU5WRVJUX0NMT0NLX1NSQ19CSVQgPSAweDgwMDAwMDAwCit9Oworc3RhdGljIGlubGluZSB1bnNpZ25lZCBOSV9HUENUX1NPVVJDRV9QSU5fQ0xPQ0tfU1JDX0JJVFModW5zaWduZWQgbikKK3sKKwkvKiBOSSA2NjB4LXNwZWNpZmljICovCisJcmV0dXJuIDB4MTAgKyBuOworfQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBOSV9HUENUX1JUU0lfQ0xPQ0tfU1JDX0JJVFModW5zaWduZWQgbikKK3sKKwlyZXR1cm4gMHgxOCArIG47Cit9CitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIE5JX0dQQ1RfUEZJX0NMT0NLX1NSQ19CSVRTKHVuc2lnbmVkIG4pCit7CisJLyogbm8gcGZpIG9uIE5JIDY2MHggKi8KKwlyZXR1cm4gMHgyMCArIG47Cit9CisKKy8qIFBvc3NpYmlsaXRpZXMgZm9yIHNldHRpbmcgYSBnYXRlIHNvdXJjZSB3aXRoCitJTlNOX0NPTkZJR19TRVRfR0FURV9TUkMgd2hlbiB1c2luZyBOSSBnZW5lcmFsLXB1cnBvc2UgY291bnRlcnMuCitNYXkgYmUgYml0d2lzZS1vcidkIHdpdGggQ1JfRURHRSBvciBDUl9JTlZFUlQuICovCitlbnVtIG5pX2dwY3RfZ2F0ZV9zZWxlY3QgeworCS8qIG0tc2VyaWVzIGdhdGVzICovCisJTklfR1BDVF9USU1FU1RBTVBfTVVYX0dBVEVfU0VMRUNUID0gMHgwLAorCU5JX0dQQ1RfQUlfU1RBUlQyX0dBVEVfU0VMRUNUID0gMHgxMiwKKwlOSV9HUENUX1BYSV9TVEFSX1RSSUdHRVJfR0FURV9TRUxFQ1QgPSAweDEzLAorCU5JX0dQQ1RfTkVYVF9PVVRfR0FURV9TRUxFQ1QgPSAweDE0LAorCU5JX0dQQ1RfQUlfU1RBUlQxX0dBVEVfU0VMRUNUID0gMHgxYywKKwlOSV9HUENUX05FWFRfU09VUkNFX0dBVEVfU0VMRUNUID0gMHgxZCwKKwlOSV9HUENUX0FOQUxPR19UUklHR0VSX09VVF9HQVRFX1NFTEVDVCA9IDB4MWUsCisJTklfR1BDVF9MT0dJQ19MT1dfR0FURV9TRUxFQ1QgPSAweDFmLAorCS8qIG1vcmUgZ2F0ZXMgZm9yIDY2MHggKi8KKwlOSV9HUENUX1NPVVJDRV9QSU5faV9HQVRFX1NFTEVDVCA9IDB4MTAwLAorCU5JX0dQQ1RfR0FURV9QSU5faV9HQVRFX1NFTEVDVCA9IDB4MTAxLAorCS8qIG1vcmUgZ2F0ZXMgZm9yIDY2MHggInNlY29uZCBnYXRlIiAqLworCU5JX0dQQ1RfVVBfRE9XTl9QSU5faV9HQVRFX1NFTEVDVCA9IDB4MjAxLAorCU5JX0dQQ1RfU0VMRUNURURfR0FURV9HQVRFX1NFTEVDVCA9IDB4MjFlLAorCS8qIG0tc2VyaWVzICJzZWNvbmQgZ2F0ZSIgc291cmNlcyBhcmUgdW5rbm93biwKKwkgICB3ZSBzaG91bGQgYWRkIHRoZW0gaGVyZSB3aXRoIGFuIG9mZnNldCBvZiAweDMwMCB3aGVuIGtub3duLiAqLworCU5JX0dQQ1RfRElTQUJMRURfR0FURV9TRUxFQ1QgPSAweDgwMDAsCit9Oworc3RhdGljIGlubGluZSB1bnNpZ25lZCBOSV9HUENUX0dBVEVfUElOX0dBVEVfU0VMRUNUKHVuc2lnbmVkIG4pCit7CisJcmV0dXJuIDB4MTAyICsgbjsKK30KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgTklfR1BDVF9SVFNJX0dBVEVfU0VMRUNUKHVuc2lnbmVkIG4pCit7CisJcmV0dXJuIE5JX1VTVUFMX1JUU0lfU0VMRUNUKG4pOworfQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBOSV9HUENUX1BGSV9HQVRFX1NFTEVDVCh1bnNpZ25lZCBuKQoreworCXJldHVybiBOSV9VU1VBTF9QRklfU0VMRUNUKG4pOworfQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBOSV9HUENUX1VQX0RPV05fUElOX0dBVEVfU0VMRUNUKHVuc2lnbmVkIG4pCit7CisJcmV0dXJuIDB4MjAyICsgbjsKK30KKworLyogUG9zc2liaWxpdGllcyBmb3Igc2V0dGluZyBhIHNvdXJjZSB3aXRoCitJTlNOX0NPTkZJR19TRVRfT1RIRVJfU1JDIHdoZW4gdXNpbmcgTkkgZ2VuZXJhbC1wdXJwb3NlIGNvdW50ZXJzLiAqLworZW51bSBuaV9ncGN0X290aGVyX2luZGV4IHsKKwlOSV9HUENUX1NPVVJDRV9FTkNPREVSX0EsCisJTklfR1BDVF9TT1VSQ0VfRU5DT0RFUl9CLAorCU5JX0dQQ1RfU09VUkNFX0VOQ09ERVJfWgorfTsKK2VudW0gbmlfZ3BjdF9vdGhlcl9zZWxlY3QgeworCS8qIG0tc2VyaWVzIGdhdGVzICovCisJLyogU3RpbGwgdW5rbm93biwgcHJvYmFibHkgb25seSBuZWVkIE5JX0dQQ1RfUEZJX09USEVSX1NFTEVDVCAqLworCU5JX0dQQ1RfRElTQUJMRURfT1RIRVJfU0VMRUNUID0gMHg4MDAwLAorfTsKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgTklfR1BDVF9QRklfT1RIRVJfU0VMRUNUKHVuc2lnbmVkIG4pCit7CisJcmV0dXJuIE5JX1VTVUFMX1BGSV9TRUxFQ1Qobik7Cit9CisKKy8qIHN0YXJ0IHNvdXJjZXMgZm9yIG5pIGdlbmVyYWwtcHVycG9zZSBjb3VudGVycyBmb3IgdXNlIHdpdGgKK0lOU05fQ09ORklHX0FSTSAqLworZW51bSBuaV9ncGN0X2FybV9zb3VyY2UgeworCU5JX0dQQ1RfQVJNX0lNTUVESUFURSA9IDB4MCwKKwlOSV9HUENUX0FSTV9QQUlSRURfSU1NRURJQVRFID0gMHgxLAkvKiBTdGFydCBib3RoIHRoZSBjb3VudGVyIGFuZAorCQkJCQkJICAgdGhlIGFkamFjZW50IHBhaXJlZCBjb3VudGVyCisJCQkJCQkgICBzaW11bHRhbmVvdXNseSAqLworCS8qIE5JIGRvZXNuJ3QgZG9jdW1lbnQgYml0cyBmb3Igc2VsZWN0aW5nIGhhcmR3YXJlIGFybSB0cmlnZ2Vycy4gIElmCisJICogdGhlIE5JX0dQQ1RfQVJNX1VOS05PV04gYml0IGlzIHNldCwgd2Ugd2lsbCBwYXNzIHRoZSBsZWFzdAorCSAqIHNpZ25pZmljYW50IGJpdHMgKDMgYml0cyBmb3IgNjYweCBvciA1IGJpdHMgZm9yIG0tc2VyaWVzKSB0aHJvdWdoIHRvCisJICogdGhlIGhhcmR3YXJlLiAgVGhpcyB3aWxsIGF0IGxlYXN0IGFsbG93IHNvbWVvbmUgdG8gZmlndXJlIG91dCB3aGF0CisJICogdGhlIGJpdHMgZG8gbGF0ZXIuICovCisJTklfR1BDVF9BUk1fVU5LTk9XTiA9IDB4MTAwMCwKK307CisKKy8qIGRpZ2l0YWwgZmlsdGVyaW5nIG9wdGlvbnMgZm9yIG5pIDY2MHggZm9yIHVzZSB3aXRoIElOU05fQ09ORklHX0ZJTFRFUi4gKi8KK2VudW0gbmlfZ3BjdF9maWx0ZXJfc2VsZWN0IHsKKwlOSV9HUENUX0ZJTFRFUl9PRkYgPSAweDAsCisJTklfR1BDVF9GSUxURVJfVElNRUJBU0VfM19TWU5DID0gMHgxLAorCU5JX0dQQ1RfRklMVEVSXzEwMHhfVElNRUJBU0VfMSA9IDB4MiwKKwlOSV9HUENUX0ZJTFRFUl8yMHhfVElNRUJBU0VfMSA9IDB4MywKKwlOSV9HUENUX0ZJTFRFUl8xMHhfVElNRUJBU0VfMSA9IDB4NCwKKwlOSV9HUENUX0ZJTFRFUl8yeF9USU1FQkFTRV8xID0gMHg1LAorCU5JX0dQQ1RfRklMVEVSXzJ4X1RJTUVCQVNFXzMgPSAweDYKK307CisKKy8qIFBGSSBkaWdpdGFsIGZpbHRlcmluZyBvcHRpb25zIGZvciBuaSBtLXNlcmllcyBmb3IgdXNlIHdpdGgKKyAqIElOU05fQ09ORklHX0ZJTFRFUi4gKi8KK2VudW0gbmlfcGZpX2ZpbHRlcl9zZWxlY3QgeworCU5JX1BGSV9GSUxURVJfT0ZGID0gMHgwLAorCU5JX1BGSV9GSUxURVJfMTI1bnMgPSAweDEsCisJTklfUEZJX0ZJTFRFUl82NDI1bnMgPSAweDIsCisJTklfUEZJX0ZJTFRFUl8yNTUwdXMgPSAweDMKK307CisKKy8qIG1hc3RlciBjbG9jayBzb3VyY2VzIGZvciBuaSBtaW8gYm9hcmRzIGFuZCBJTlNOX0NPTkZJR19TRVRfQ0xPQ0tfU1JDICovCitlbnVtIG5pX21pb19jbG9ja19zb3VyY2UgeworCU5JX01JT19JTlRFUk5BTF9DTE9DSyA9IDAsCisJTklfTUlPX1JUU0lfQ0xPQ0sgPSAxLAkvKiBkb2Vzbid0IHdvcmsgZm9yIG0tc2VyaWVzLCB1c2UKKwkJCQkgICBOSV9NSU9fUExMX1JUU0lfQ0xPQ0soKSAqLworCS8qIHRoZSBOSV9NSU9fUExMXyogc291cmNlcyBhcmUgbS1zZXJpZXMgb25seSAqLworCU5JX01JT19QTExfUFhJX1NUQVJfVFJJR0dFUl9DTE9DSyA9IDIsCisJTklfTUlPX1BMTF9QWEkxMF9DTE9DSyA9IDMsCisJTklfTUlPX1BMTF9SVFNJMF9DTE9DSyA9IDQKK307CitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIE5JX01JT19QTExfUlRTSV9DTE9DSyh1bnNpZ25lZCBydHNpX2NoYW5uZWwpCit7CisJcmV0dXJuIE5JX01JT19QTExfUlRTSTBfQ0xPQ0sgKyBydHNpX2NoYW5uZWw7Cit9CisKKy8qIFNpZ25hbHMgd2hpY2ggY2FuIGJlIHJvdXRlZCB0byBhbiBOSSBSVFNJIHBpbiB3aXRoIElOU05fQ09ORklHX1NFVF9ST1VUSU5HLgorIFRoZSBudW1iZXJzIGFzc2lnbmVkIGFyZSBub3QgYXJiaXRyYXJ5LCB0aGV5IGNvcnJlc3BvbmQgdG8gdGhlIGJpdHMgcmVxdWlyZWQKKyB0byBwcm9ncmFtIHRoZSBib2FyZC4gKi8KK2VudW0gbmlfcnRzaV9yb3V0aW5nIHsKKwlOSV9SVFNJX09VVFBVVF9BRFJfU1RBUlQxID0gMCwKKwlOSV9SVFNJX09VVFBVVF9BRFJfU1RBUlQyID0gMSwKKwlOSV9SVFNJX09VVFBVVF9TQ0xLRyA9IDIsCisJTklfUlRTSV9PVVRQVVRfREFDVVBETiA9IDMsCisJTklfUlRTSV9PVVRQVVRfREFfU1RBUlQxID0gNCwKKwlOSV9SVFNJX09VVFBVVF9HX1NSQzAgPSA1LAorCU5JX1JUU0lfT1VUUFVUX0dfR0FURTAgPSA2LAorCU5JX1JUU0lfT1VUUFVUX1JHT1VUMCA9IDcsCisJTklfUlRTSV9PVVRQVVRfUlRTSV9CUkRfMCA9IDgsCisJTklfUlRTSV9PVVRQVVRfUlRTSV9PU0MgPSAxMgkvKiBwcmUtbS1zZXJpZXMgYWx3YXlzIGhhdmUgUlRTSSBjbG9jaworCQkJCQkgICBvbiBsaW5lIDcgKi8KK307CitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIE5JX1JUU0lfT1VUUFVUX1JUU0lfQlJEKHVuc2lnbmVkIG4pCit7CisJcmV0dXJuIE5JX1JUU0lfT1VUUFVUX1JUU0lfQlJEXzAgKyBuOworfQorCisvKiBTaWduYWxzIHdoaWNoIGNhbiBiZSByb3V0ZWQgdG8gYW4gTkkgUEZJIHBpbiBvbiBhbiBtLXNlcmllcyBib2FyZCB3aXRoCisgKiBJTlNOX0NPTkZJR19TRVRfUk9VVElORy4gIFRoZXNlIG51bWJlcnMgYXJlIGFsc28gcmV0dXJuZWQgYnkKKyAqIElOU05fQ09ORklHX0dFVF9ST1VUSU5HIG9uIHByZS1tLXNlcmllcyBib2FyZHMsIGV2ZW4gdGhvdWdoIHRoZWlyIHJvdXRpbmcKKyAqIGNhbm5vdCBiZSBjaGFuZ2VkLiAgVGhlIG51bWJlcnMgYXNzaWduZWQgYXJlIG5vdCBhcmJpdHJhcnksIHRoZXkgY29ycmVzcG9uZAorICogdG8gdGhlIGJpdHMgcmVxdWlyZWQgdG8gcHJvZ3JhbSB0aGUgYm9hcmQuICovCitlbnVtIG5pX3BmaV9yb3V0aW5nIHsKKwlOSV9QRklfT1VUUFVUX1BGSV9ERUZBVUxUID0gMCwKKwlOSV9QRklfT1VUUFVUX0FJX1NUQVJUMSA9IDEsCisJTklfUEZJX09VVFBVVF9BSV9TVEFSVDIgPSAyLAorCU5JX1BGSV9PVVRQVVRfQUlfQ09OVkVSVCA9IDMsCisJTklfUEZJX09VVFBVVF9HX1NSQzEgPSA0LAorCU5JX1BGSV9PVVRQVVRfR19HQVRFMSA9IDUsCisJTklfUEZJX09VVFBVVF9BT19VUERBVEVfTiA9IDYsCisJTklfUEZJX09VVFBVVF9BT19TVEFSVDEgPSA3LAorCU5JX1BGSV9PVVRQVVRfQUlfU1RBUlRfUFVMU0UgPSA4LAorCU5JX1BGSV9PVVRQVVRfR19TUkMwID0gOSwKKwlOSV9QRklfT1VUUFVUX0dfR0FURTAgPSAxMCwKKwlOSV9QRklfT1VUUFVUX0VYVF9TVFJPQkUgPSAxMSwKKwlOSV9QRklfT1VUUFVUX0FJX0VYVF9NVVhfQ0xLID0gMTIsCisJTklfUEZJX09VVFBVVF9HT1VUMCA9IDEzLAorCU5JX1BGSV9PVVRQVVRfR09VVDEgPSAxNCwKKwlOSV9QRklfT1VUUFVUX0ZSRVFfT1VUID0gMTUsCisJTklfUEZJX09VVFBVVF9QRklfRE8gPSAxNiwKKwlOSV9QRklfT1VUUFVUX0lfQVRSSUcgPSAxNywKKwlOSV9QRklfT1VUUFVUX1JUU0kwID0gMTgsCisJTklfUEZJX09VVFBVVF9QWElfU1RBUl9UUklHR0VSX0lOID0gMjYsCisJTklfUEZJX09VVFBVVF9TQ1hJX1RSSUcxID0gMjcsCisJTklfUEZJX09VVFBVVF9ESU9fQ0hBTkdFX0RFVEVDVF9SVFNJID0gMjgsCisJTklfUEZJX09VVFBVVF9DRElfU0FNUExFID0gMjksCisJTklfUEZJX09VVFBVVF9DRE9fVVBEQVRFID0gMzAKK307CitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIE5JX1BGSV9PVVRQVVRfUlRTSSh1bnNpZ25lZCBydHNpX2NoYW5uZWwpCit7CisJcmV0dXJuIE5JX1BGSV9PVVRQVVRfUlRTSTAgKyBydHNpX2NoYW5uZWw7Cit9CisKKy8qIFNpZ25hbHMgd2hpY2ggY2FuIGJlIHJvdXRlZCB0byBvdXRwdXQgb24gYSBOSSBQRkkgcGluIG9uIGEgNjYweCBib2FyZAorIHdpdGggSU5TTl9DT05GSUdfU0VUX1JPVVRJTkcuICBUaGUgbnVtYmVycyBhc3NpZ25lZCBhcmUKKyBub3QgYXJiaXRyYXJ5LCB0aGV5IGNvcnJlc3BvbmQgdG8gdGhlIGJpdHMgcmVxdWlyZWQKKyB0byBwcm9ncmFtIHRoZSBib2FyZC4gIExpbmVzIDAgdG8gNyBjYW4gb25seSBiZSBzZXQgdG8KKyBOSV82NjBYX1BGSV9PVVRQVVRfRElPLiAgTGluZXMgMzIgdG8gMzkgY2FuIG9ubHkgYmUgc2V0IHRvCisgTklfNjYwWF9QRklfT1VUUFVUX0NPVU5URVIuICovCitlbnVtIG5pXzY2MHhfcGZpX3JvdXRpbmcgeworCU5JXzY2MFhfUEZJX09VVFBVVF9DT1VOVEVSID0gMSwJLyogY291bnRlciAqLworCU5JXzY2MFhfUEZJX09VVFBVVF9ESU8gPSAyLAkvKiBzdGF0aWMgZGlnaXRhbCBvdXRwdXQgKi8KK307CisKKy8qIE5JIEV4dGVybmFsIFRyaWdnZXIgbGluZXMuICBUaGVzZSB2YWx1ZXMgYXJlIG5vdCBhcmJpdHJhcnksIGJ1dCBhcmUgcmVsYXRlZAorICogdG8gdGhlIGJpdHMgcmVxdWlyZWQgdG8gcHJvZ3JhbSB0aGUgYm9hcmQgKG9mZnNldCBieSAxIGZvciBoaXN0b3JpY2FsCisgKiByZWFzb25zKS4gKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgTklfRVhUX1BGSSh1bnNpZ25lZCBwZmlfY2hhbm5lbCkKK3sKKwlyZXR1cm4gTklfVVNVQUxfUEZJX1NFTEVDVChwZmlfY2hhbm5lbCkgLSAxOworfQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBOSV9FWFRfUlRTSSh1bnNpZ25lZCBydHNpX2NoYW5uZWwpCit7CisJcmV0dXJuIE5JX1VTVUFMX1JUU0lfU0VMRUNUKHJ0c2lfY2hhbm5lbCkgLSAxOworfQorCisvKiBzdGF0dXMgYml0cyBmb3IgSU5TTl9DT05GSUdfR0VUX0NPVU5URVJfU1RBVFVTICovCitlbnVtIGNvbWVkaV9jb3VudGVyX3N0YXR1c19mbGFncyB7CisJQ09NRURJX0NPVU5URVJfQVJNRUQgPSAweDEsCisJQ09NRURJX0NPVU5URVJfQ09VTlRJTkcgPSAweDIsCisJQ09NRURJX0NPVU5URVJfVEVSTUlOQUxfQ09VTlQgPSAweDQsCit9OworCisvKiBDbG9jayBzb3VyY2VzIGZvciBDRElPIHN1YmRldmljZSBvbiBOSSBtLXNlcmllcyBib2FyZHMuICBVc2VkIGFzIHRoZQorICogc2Nhbl9iZWdpbl9hcmcgZm9yIGEgY29tZWRpX2NvbW1hbmQuIFRoZXNlIHNvdXJjZXMgbWF5IGFsc28gYmUgYml0d2lzZS1vcidkCisgKiB3aXRoIENSX0lOVkVSVCB0byBjaGFuZ2UgcG9sYXJpdHkuICovCitlbnVtIG5pX21fc2VyaWVzX2NkaW9fc2Nhbl9iZWdpbl9zcmMgeworCU5JX0NESU9fU0NBTl9CRUdJTl9TUkNfR1JPVU5EID0gMCwKKwlOSV9DRElPX1NDQU5fQkVHSU5fU1JDX0FJX1NUQVJUID0gMTgsCisJTklfQ0RJT19TQ0FOX0JFR0lOX1NSQ19BSV9DT05WRVJUID0gMTksCisJTklfQ0RJT19TQ0FOX0JFR0lOX1NSQ19QWElfU1RBUl9UUklHR0VSID0gMjAsCisJTklfQ0RJT19TQ0FOX0JFR0lOX1NSQ19HMF9PVVQgPSAyOCwKKwlOSV9DRElPX1NDQU5fQkVHSU5fU1JDX0cxX09VVCA9IDI5LAorCU5JX0NESU9fU0NBTl9CRUdJTl9TUkNfQU5BTE9HX1RSSUdHRVIgPSAzMCwKKwlOSV9DRElPX1NDQU5fQkVHSU5fU1JDX0FPX1VQREFURSA9IDMxLAorCU5JX0NESU9fU0NBTl9CRUdJTl9TUkNfRlJFUV9PVVQgPSAzMiwKKwlOSV9DRElPX1NDQU5fQkVHSU5fU1JDX0RJT19DSEFOR0VfREVURUNUX0lSUSA9IDMzCit9Oworc3RhdGljIGlubGluZSB1bnNpZ25lZCBOSV9DRElPX1NDQU5fQkVHSU5fU1JDX1BGSSh1bnNpZ25lZCBwZmlfY2hhbm5lbCkKK3sKKwlyZXR1cm4gTklfVVNVQUxfUEZJX1NFTEVDVChwZmlfY2hhbm5lbCk7Cit9CitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIE5JX0NESU9fU0NBTl9CRUdJTl9TUkNfUlRTSSh1bnNpZ25lZCBydHNpX2NoYW5uZWwpCit7CisJcmV0dXJuIE5JX1VTVUFMX1JUU0lfU0VMRUNUKHJ0c2lfY2hhbm5lbCk7Cit9CisKKy8qIHNjYW5fYmVnaW5fc3JjIGZvciBzY2FuX2JlZ2luX2FyZz09VFJJR19FWFQgd2l0aCBhbmFsb2cgb3V0cHV0IGNvbW1hbmQgb24gTkkKKyAqIGJvYXJkcy4gIFRoZXNlIHNjYW4gYmVnaW4gc291cmNlcyBjYW4gYWxzbyBiZSBiaXR3aXNlLW9yJ2Qgd2l0aCBDUl9JTlZFUlQgdG8KKyAqIGNoYW5nZSBwb2xhcml0eS4gKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgTklfQU9fU0NBTl9CRUdJTl9TUkNfUEZJKHVuc2lnbmVkIHBmaV9jaGFubmVsKQoreworCXJldHVybiBOSV9VU1VBTF9QRklfU0VMRUNUKHBmaV9jaGFubmVsKTsKK30KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgTklfQU9fU0NBTl9CRUdJTl9TUkNfUlRTSSh1bnNpZ25lZCBydHNpX2NoYW5uZWwpCit7CisJcmV0dXJuIE5JX1VTVUFMX1JUU0lfU0VMRUNUKHJ0c2lfY2hhbm5lbCk7Cit9CisKKy8qIEJpdHMgZm9yIHNldHRpbmcgYSBjbG9jayBzb3VyY2Ugd2l0aAorICogSU5TTl9DT05GSUdfU0VUX0NMT0NLX1NSQyB3aGVuIHVzaW5nIE5JIGZyZXF1ZW5jeSBvdXRwdXQgc3ViZGV2aWNlLiAqLworZW51bSBuaV9mcmVxX291dF9jbG9ja19zb3VyY2VfYml0cyB7CisJTklfRlJFUV9PVVRfVElNRUJBU0VfMV9ESVZfMl9DTE9DS19TUkMsCS8qIDEwIE1IeiAqLworCU5JX0ZSRVFfT1VUX1RJTUVCQVNFXzJfQ0xPQ0tfU1JDCS8qIDEwMCBLSHogKi8KK307CisKKy8qIFZhbHVlcyBmb3Igc2V0dGluZyBhIGNsb2NrIHNvdXJjZSB3aXRoIElOU05fQ09ORklHX1NFVF9DTE9DS19TUkMgZm9yCisgKiA4MjU0IGNvdW50ZXIgc3ViZGV2aWNlcyBvbiBBbXBsaWNvbiBESU8gYm9hcmRzIChhbXBsY19kaW8yMDAgZHJpdmVyKS4gKi8KKwllbnVtIGFtcGxjX2Rpb19jbG9ja19zb3VyY2UgeworCQlBTVBMQ19ESU9fQ0xLX0NMS04sCS8qIHBlciBjaGFubmVsIGV4dGVybmFsIGNsb2NrCisJCQkJCSAgIGlucHV0L291dHB1dCBwaW4gKHBpbiBpcyBvbmx5IGFuCisJCQkJCSAgIGlucHV0IHdoZW4gY2xvY2sgc291cmNlIHNldCB0byB0aGlzCisJCQkJCSAgIHZhbHVlLCBvdGhlcndpc2UgaXQgaXMgYW4gb3V0cHV0KSAqLworCQlBTVBMQ19ESU9fQ0xLXzEwTUhaLAkvKiAxMCBNSHogaW50ZXJuYWwgY2xvY2sgKi8KKwkJQU1QTENfRElPX0NMS18xTUhaLAkvKiAxIE1IeiBpbnRlcm5hbCBjbG9jayAqLworCQlBTVBMQ19ESU9fQ0xLXzEwMEtIWiwJLyogMTAwIGtIeiBpbnRlcm5hbCBjbG9jayAqLworCQlBTVBMQ19ESU9fQ0xLXzEwS0haLAkvKiAxMCBrSHogaW50ZXJuYWwgY2xvY2sgKi8KKwkJQU1QTENfRElPX0NMS18xS0haLAkvKiAxIGtIeiBpbnRlcm5hbCBjbG9jayAqLworCQlBTVBMQ19ESU9fQ0xLX09VVE5NMSwJLyogb3V0cHV0IG9mIHByZWNlZGluZyBjb3VudGVyIGNoYW5uZWwKKwkJCQkJICAgKGZvciBjaGFubmVsIDAsIHByZWNlZGluZyBjb3VudGVyCisJCQkJCSAgIGNoYW5uZWwgaXMgY2hhbm5lbCAyIG9uIHByZWNlZGluZworCQkJCQkgICBjb3VudGVyIHN1YmRldmljZSwgZm9yIGZpcnN0IGNvdW50ZXIKKwkJCQkJICAgc3ViZGV2aWNlLCBwcmVjZWRpbmcgY291bnRlcgorCQkJCQkgICBzdWJkZXZpY2UgaXMgdGhlIGxhc3QgY291bnRlcgorCQkJCQkgICBzdWJkZXZpY2UpICovCisJCUFNUExDX0RJT19DTEtfRVhUCS8qIHBlciBjaGlwIGV4dGVybmFsIGlucHV0IHBpbiAqLworCX07CisKKy8qIFZhbHVlcyBmb3Igc2V0dGluZyBhIGdhdGUgc291cmNlIHdpdGggSU5TTl9DT05GSUdfU0VUX0dBVEVfU1JDIGZvcgorICogODI1NCBjb3VudGVyIHN1YmRldmljZXMgb24gQW1wbGljb24gRElPIGJvYXJkcyAoYW1wbGNfZGlvMjAwIGRyaXZlcikuICovCisJZW51bSBhbXBsY19kaW9fZ2F0ZV9zb3VyY2UgeworCQlBTVBMQ19ESU9fR0FUX1ZDQywJLyogaW50ZXJuYWwgaGlnaCBsb2dpYyBsZXZlbCAqLworCQlBTVBMQ19ESU9fR0FUX0dORCwJLyogaW50ZXJuYWwgbG93IGxvZ2ljIGxldmVsICovCisJCUFNUExDX0RJT19HQVRfR0FUTiwJLyogcGVyIGNoYW5uZWwgZXh0ZXJuYWwgZ2F0ZSBpbnB1dCAqLworCQlBTVBMQ19ESU9fR0FUX05PVVROTTIsCS8qIG5lZ2F0ZWQgb3V0cHV0IG9mIGNvdW50ZXIgY2hhbm5lbAorCQkJCQkgICBtaW51cyAyIChmb3IgY2hhbm5lbHMgMCBvciAxLAorCQkJCQkgICBjaGFubmVsIG1pbnVzIDIgaXMgY2hhbm5lbCAxIG9yIDIgb24KKwkJCQkJICAgdGhlIHByZWNlZGluZyBjb3VudGVyIHN1YmRldmljZSwgZm9yCisJCQkJCSAgIHRoZSBmaXJzdCBjb3VudGVyIHN1YmRldmljZSB0aGUKKwkJCQkJICAgcHJlY2VkaW5nIGNvdW50ZXIgc3ViZGV2aWNlIGlzIHRoZQorCQkJCQkgICBsYXN0IGNvdW50ZXIgc3ViZGV2aWNlKSAqLworCQlBTVBMQ19ESU9fR0FUX1JFU0VSVkVENCwKKwkJQU1QTENfRElPX0dBVF9SRVNFUlZFRDUsCisJCUFNUExDX0RJT19HQVRfUkVTRVJWRUQ2LAorCQlBTVBMQ19ESU9fR0FUX1JFU0VSVkVENworCX07CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfQ09NRURJX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvY29tZWRpX2NvbXBhdDMyLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2NvbWVkaV9jb21wYXQzMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkMDExNmIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2NvbWVkaV9jb21wYXQzMi5jCkBAIC0wLDAgKzEsNTk3IEBACisvKgorICAgIGNvbWVkaS9jb21lZGlfY29tcGF0MzIuYworICAgIDMyLWJpdCBpb2N0bCBjb21wYXRpYmlsaXR5IGZvciA2NC1iaXQgY29tZWRpIGtlcm5lbCBtb2R1bGUuCisKKyAgICBBdXRob3I6IElhbiBBYmJvdHQsIE1FViBMdGQuIDxhYmJvdHRpQG1ldi5jby51az4KKyAgICBDb3B5cmlnaHQgKEMpIDIwMDcgTUVWIEx0ZC4gPGh0dHA6Ly93d3cubWV2LmNvLnVrLz4KKworICAgIENPTUVESSAtIExpbnV4IENvbnRyb2wgYW5kIE1lYXN1cmVtZW50IERldmljZSBJbnRlcmZhY2UKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNyBEYXZpZCBBLiBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisqLworCisjZGVmaW5lIF9fTk9fVkVSU0lPTl9fCisjaW5jbHVkZSAiY29tZWRpLmgiCisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaW5jbHVkZSAiY29tZWRpX2NvbXBhdDMyLmgiCisKKyNpZmRlZiBDT05GSUdfQ09NUEFUCisKKyNpZm5kZWYgSEFWRV9DT01QQVRfSU9DVEwKKyNpbmNsdWRlIDxsaW51eC9pb2N0bDMyLmg+CS8qIGZvciAodW4pcmVnaXN0ZXJfaW9jdGwzMl9jb252ZXJzaW9uICovCisjZW5kaWYKKworI2RlZmluZSBDT01FREkzMl9DSEFOSU5GTyBfSU9SKENJTywzLGNvbWVkaTMyX2NoYW5pbmZvKQorI2RlZmluZSBDT01FREkzMl9SQU5HRUlORk8gX0lPUihDSU8sOCxjb21lZGkzMl9yYW5nZWluZm8pCisvKiBOLkIuIENPTUVESTMyX0NNRCBhbmQgQ09NRURJX0NNRCBvdWdodCB0byB1c2UgX0lPV1IsIG5vdCBfSU9SLgorICogSXQncyB0b28gbGF0ZSB0byBjaGFuZ2UgaXQgbm93LCBidXQgaXQgb25seSBhZmZlY3RzIHRoZSBjb21tYW5kIG51bWJlci4gKi8KKyNkZWZpbmUgQ09NRURJMzJfQ01EIF9JT1IoQ0lPLDksY29tZWRpMzJfY21kKQorLyogTi5CLiBDT01FREkzMl9DTURURVNUIGFuZCBDT01FRElfQ01EVEVTVCBvdWdodCB0byB1c2UgX0lPV1IsIG5vdCBfSU9SLgorICogSXQncyB0b28gbGF0ZSB0byBjaGFuZ2UgaXQgbm93LCBidXQgaXQgb25seSBhZmZlY3RzIHRoZSBjb21tYW5kIG51bWJlci4gKi8KKyNkZWZpbmUgQ09NRURJMzJfQ01EVEVTVCBfSU9SKENJTywxMCxjb21lZGkzMl9jbWQpCisjZGVmaW5lIENPTUVESTMyX0lOU05MSVNUIF9JT1IoQ0lPLDExLGNvbWVkaTMyX2luc25saXN0KQorI2RlZmluZSBDT01FREkzMl9JTlNOIF9JT1IoQ0lPLDEyLGNvbWVkaTMyX2luc24pCisKK3R5cGVkZWYgc3RydWN0IGNvbWVkaTMyX2NoYW5pbmZvX3N0cnVjdCB7CisJdW5zaWduZWQgaW50IHN1YmRldjsKKwljb21wYXRfdXB0cl90IG1heGRhdGFfbGlzdDsJLyogMzItYml0ICdsc2FtcGxfdCAqJyAqLworCWNvbXBhdF91cHRyX3QgZmxhZ2xpc3Q7CQkvKiAzMi1iaXQgJ3Vuc2lnbmVkIGludCAqJyAqLworCWNvbXBhdF91cHRyX3QgcmFuZ2VsaXN0OwkvKiAzMi1iaXQgJ3Vuc2lnbmVkIGludCAqJyAqLworCXVuc2lnbmVkIGludCB1bnVzZWRbNF07Cit9IGNvbWVkaTMyX2NoYW5pbmZvOworCit0eXBlZGVmIHN0cnVjdCBjb21lZGkzMl9yYW5nZWluZm9fc3RydWN0IHsKKwl1bnNpZ25lZCBpbnQgcmFuZ2VfdHlwZTsKKwljb21wYXRfdXB0cl90IHJhbmdlX3B0cjsJLyogMzItYml0ICd2b2lkIConICovCit9IGNvbWVkaTMyX3JhbmdlaW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgY29tZWRpMzJfY21kX3N0cnVjdCB7CisJdW5zaWduZWQgaW50IHN1YmRldjsKKwl1bnNpZ25lZCBpbnQgZmxhZ3M7CisJdW5zaWduZWQgaW50IHN0YXJ0X3NyYzsKKwl1bnNpZ25lZCBpbnQgc3RhcnRfYXJnOworCXVuc2lnbmVkIGludCBzY2FuX2JlZ2luX3NyYzsKKwl1bnNpZ25lZCBpbnQgc2Nhbl9iZWdpbl9hcmc7CisJdW5zaWduZWQgaW50IGNvbnZlcnRfc3JjOworCXVuc2lnbmVkIGludCBjb252ZXJ0X2FyZzsKKwl1bnNpZ25lZCBpbnQgc2Nhbl9lbmRfc3JjOworCXVuc2lnbmVkIGludCBzY2FuX2VuZF9hcmc7CisJdW5zaWduZWQgaW50IHN0b3Bfc3JjOworCXVuc2lnbmVkIGludCBzdG9wX2FyZzsKKwljb21wYXRfdXB0cl90IGNoYW5saXN0OwkJLyogMzItYml0ICd1bnNpZ25lZCBpbnQgKicgKi8KKwl1bnNpZ25lZCBpbnQgY2hhbmxpc3RfbGVuOworCWNvbXBhdF91cHRyX3QgZGF0YTsJCS8qIDMyLWJpdCAnc2FtcGxfdCAqJyAqLworCXVuc2lnbmVkIGludCBkYXRhX2xlbjsKK30gY29tZWRpMzJfY21kOworCit0eXBlZGVmIHN0cnVjdCBjb21lZGkzMl9pbnNuX3N0cnVjdCB7CisJdW5zaWduZWQgaW50IGluc247CisJdW5zaWduZWQgaW50IG47CisJY29tcGF0X3VwdHJfdCBkYXRhOwkJLyogMzItYml0ICdsc2FtcGxfdCAqJyAqLworCXVuc2lnbmVkIGludCBzdWJkZXY7CisJdW5zaWduZWQgaW50IGNoYW5zcGVjOworCXVuc2lnbmVkIGludCB1bnVzZWRbM107Cit9IGNvbWVkaTMyX2luc247CisKK3R5cGVkZWYgc3RydWN0IGNvbWVkaTMyX2luc25saXN0X3N0cnVjdCB7CisJdW5zaWduZWQgaW50IG5faW5zbnM7CisJY29tcGF0X3VwdHJfdCBpbnNuczsJCS8qIDMyLWJpdCAnY29tZWRpX2luc24gKicgKi8KK30gY29tZWRpMzJfaW5zbmxpc3Q7CisKKy8qIEhhbmRsZSB0cmFuc2xhdGVkIGlvY3RsLiAqLworc3RhdGljIGludCB0cmFuc2xhdGVkX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAorCQl1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlpZiAoIWZpbGUtPmZfb3ApIHsKKwkJcmV0dXJuIC1FTk9UVFk7CisJfQorI2lmZGVmIEhBVkVfVU5MT0NLRURfSU9DVEwKKwlpZiAoZmlsZS0+Zl9vcC0+dW5sb2NrZWRfaW9jdGwpIHsKKwkJaW50IHJjID0gKGludCkoKmZpbGUtPmZfb3AtPnVubG9ja2VkX2lvY3RsKShmaWxlLCBjbWQsIGFyZyk7CisJCWlmIChyYyA9PSAtRU5PSU9DVExDTUQpIHsKKwkJCXJjID0gLUVOT1RUWTsKKwkJfQorCQlyZXR1cm4gcmM7CisJfQorI2VuZGlmCisJaWYgKGZpbGUtPmZfb3AtPmlvY3RsKSB7CisJCWludCByYzsKKwkJbG9ja19rZXJuZWwoKTsKKwkJcmMgPSAoKmZpbGUtPmZfb3AtPmlvY3RsKShmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSwKKwkJCQlmaWxlLCBjbWQsIGFyZyk7CisJCXVubG9ja19rZXJuZWwoKTsKKwkJcmV0dXJuIHJjOworCX0KKwlyZXR1cm4gLUVOT1RUWTsKK30KKworLyogSGFuZGxlIDMyLWJpdCBDT01FRElfQ0hBTklORk8gaW9jdGwuICovCitzdGF0aWMgaW50IGNvbXBhdF9jaGFuaW5mbyhzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJY29tZWRpX2NoYW5pbmZvIF9fdXNlciAqY2hhbmluZm87CisJY29tZWRpMzJfY2hhbmluZm8gX191c2VyICpjaGFuaW5mbzMyOworCWludCBlcnI7CisJdW5pb24geworCQl1bnNpZ25lZCBpbnQgdWludDsKKwkJY29tcGF0X3VwdHJfdCB1cHRyOworCX0gdGVtcDsKKworCWNoYW5pbmZvMzIgPSBjb21wYXRfcHRyKGFyZyk7CisJY2hhbmluZm8gPSBjb21wYXRfYWxsb2NfdXNlcl9zcGFjZShzaXplb2YoKmNoYW5pbmZvKSk7CisKKwkvKiBDb3B5IGNoYW5pbmZvIHN0cnVjdHVyZS4gIElnbm9yZSB1bnVzZWQgbWVtYmVycy4gKi8KKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgY2hhbmluZm8zMiwgc2l6ZW9mKCpjaGFuaW5mbzMyKSkKKwkJCXx8ICFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBjaGFuaW5mbywKKwkJCQlzaXplb2YoKmNoYW5pbmZvKSkpIHsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCWVyciA9IDA7CisJZXJyIHw9IF9fZ2V0X3VzZXIodGVtcC51aW50LCAmY2hhbmluZm8zMi0+c3ViZGV2KTsKKwllcnIgfD0gX19wdXRfdXNlcih0ZW1wLnVpbnQsICZjaGFuaW5mby0+c3ViZGV2KTsKKwllcnIgfD0gX19nZXRfdXNlcih0ZW1wLnVwdHIsICZjaGFuaW5mbzMyLT5tYXhkYXRhX2xpc3QpOworCWVyciB8PSBfX3B1dF91c2VyKGNvbXBhdF9wdHIodGVtcC51cHRyKSwgJmNoYW5pbmZvLT5tYXhkYXRhX2xpc3QpOworCWVyciB8PSBfX2dldF91c2VyKHRlbXAudXB0ciwgJmNoYW5pbmZvMzItPmZsYWdsaXN0KTsKKwllcnIgfD0gX19wdXRfdXNlcihjb21wYXRfcHRyKHRlbXAudXB0ciksICZjaGFuaW5mby0+ZmxhZ2xpc3QpOworCWVyciB8PSBfX2dldF91c2VyKHRlbXAudXB0ciwgJmNoYW5pbmZvMzItPnJhbmdlbGlzdCk7CisJZXJyIHw9IF9fcHV0X3VzZXIoY29tcGF0X3B0cih0ZW1wLnVwdHIpLCAmY2hhbmluZm8tPnJhbmdlbGlzdCk7CisJaWYgKGVycikgeworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlyZXR1cm4gdHJhbnNsYXRlZF9pb2N0bChmaWxlLCBDT01FRElfQ0hBTklORk8sICh1bnNpZ25lZCBsb25nKWNoYW5pbmZvKTsKK30KKworLyogSGFuZGxlIDMyLWJpdCBDT01FRElfUkFOR0VJTkZPIGlvY3RsLiAqLworc3RhdGljIGludCBjb21wYXRfcmFuZ2VpbmZvKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwljb21lZGlfcmFuZ2VpbmZvIF9fdXNlciAqcmFuZ2VpbmZvOworCWNvbWVkaTMyX3JhbmdlaW5mbyBfX3VzZXIgKnJhbmdlaW5mbzMyOworCWludCBlcnI7CisJdW5pb24geworCQl1bnNpZ25lZCBpbnQgdWludDsKKwkJY29tcGF0X3VwdHJfdCB1cHRyOworCX0gdGVtcDsKKworCXJhbmdlaW5mbzMyID0gY29tcGF0X3B0cihhcmcpOworCXJhbmdlaW5mbyA9IGNvbXBhdF9hbGxvY191c2VyX3NwYWNlKHNpemVvZigqcmFuZ2VpbmZvKSk7CisKKwkvKiBDb3B5IHJhbmdlaW5mbyBzdHJ1Y3R1cmUuICovCisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIHJhbmdlaW5mbzMyLCBzaXplb2YoKnJhbmdlaW5mbzMyKSkKKwkJCXx8ICFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCByYW5nZWluZm8sCisJCQkJc2l6ZW9mKCpyYW5nZWluZm8pKSkgeworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJZXJyID0gMDsKKwllcnIgfD0gX19nZXRfdXNlcih0ZW1wLnVpbnQsICZyYW5nZWluZm8zMi0+cmFuZ2VfdHlwZSk7CisJZXJyIHw9IF9fcHV0X3VzZXIodGVtcC51aW50LCAmcmFuZ2VpbmZvLT5yYW5nZV90eXBlKTsKKwllcnIgfD0gX19nZXRfdXNlcih0ZW1wLnVwdHIsICZyYW5nZWluZm8zMi0+cmFuZ2VfcHRyKTsKKwllcnIgfD0gX19wdXRfdXNlcihjb21wYXRfcHRyKHRlbXAudXB0ciksICZyYW5nZWluZm8tPnJhbmdlX3B0cik7CisJaWYgKGVycikgeworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlyZXR1cm4gdHJhbnNsYXRlZF9pb2N0bChmaWxlLCBDT01FRElfUkFOR0VJTkZPLAorCQkJKHVuc2lnbmVkIGxvbmcpcmFuZ2VpbmZvKTsKK30KKworLyogQ29weSAzMi1iaXQgY21kIHN0cnVjdHVyZSB0byBuYXRpdmUgY21kIHN0cnVjdHVyZS4gKi8KK3N0YXRpYyBpbnQgZ2V0X2NvbXBhdF9jbWQoY29tZWRpX2NtZCBfX3VzZXIgKmNtZCwKKwkJY29tZWRpMzJfY21kIF9fdXNlciAqY21kMzIpCit7CisJaW50IGVycjsKKwl1bmlvbiB7CisJCXVuc2lnbmVkIGludCB1aW50OworCQljb21wYXRfdXB0cl90IHVwdHI7CisJfSB0ZW1wOworCisJLyogQ29weSBjbWQgc3RydWN0dXJlLiAqLworCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCBjbWQzMiwgc2l6ZW9mKCpjbWQzMikpCisJCQl8fCAhYWNjZXNzX29rKFZFUklGWV9XUklURSwgY21kLCBzaXplb2YoKmNtZCkpKSB7CisJCXJldHVybiAtRUZBVUxUOworCX0KKwllcnIgPSAwOworCWVyciB8PSBfX2dldF91c2VyKHRlbXAudWludCwgJmNtZDMyLT5zdWJkZXYpOworCWVyciB8PSBfX3B1dF91c2VyKHRlbXAudWludCwgJmNtZC0+c3ViZGV2KTsKKwllcnIgfD0gX19nZXRfdXNlcih0ZW1wLnVpbnQsICZjbWQzMi0+ZmxhZ3MpOworCWVyciB8PSBfX3B1dF91c2VyKHRlbXAudWludCwgJmNtZC0+ZmxhZ3MpOworCWVyciB8PSBfX2dldF91c2VyKHRlbXAudWludCwgJmNtZDMyLT5zdGFydF9zcmMpOworCWVyciB8PSBfX3B1dF91c2VyKHRlbXAudWludCwgJmNtZC0+c3RhcnRfc3JjKTsKKwllcnIgfD0gX19nZXRfdXNlcih0ZW1wLnVpbnQsICZjbWQzMi0+c3RhcnRfYXJnKTsKKwllcnIgfD0gX19wdXRfdXNlcih0ZW1wLnVpbnQsICZjbWQtPnN0YXJ0X2FyZyk7CisJZXJyIHw9IF9fZ2V0X3VzZXIodGVtcC51aW50LCAmY21kMzItPnNjYW5fYmVnaW5fc3JjKTsKKwllcnIgfD0gX19wdXRfdXNlcih0ZW1wLnVpbnQsICZjbWQtPnNjYW5fYmVnaW5fc3JjKTsKKwllcnIgfD0gX19nZXRfdXNlcih0ZW1wLnVpbnQsICZjbWQzMi0+c2Nhbl9iZWdpbl9hcmcpOworCWVyciB8PSBfX3B1dF91c2VyKHRlbXAudWludCwgJmNtZC0+c2Nhbl9iZWdpbl9hcmcpOworCWVyciB8PSBfX2dldF91c2VyKHRlbXAudWludCwgJmNtZDMyLT5jb252ZXJ0X3NyYyk7CisJZXJyIHw9IF9fcHV0X3VzZXIodGVtcC51aW50LCAmY21kLT5jb252ZXJ0X3NyYyk7CisJZXJyIHw9IF9fZ2V0X3VzZXIodGVtcC51aW50LCAmY21kMzItPmNvbnZlcnRfYXJnKTsKKwllcnIgfD0gX19wdXRfdXNlcih0ZW1wLnVpbnQsICZjbWQtPmNvbnZlcnRfYXJnKTsKKwllcnIgfD0gX19nZXRfdXNlcih0ZW1wLnVpbnQsICZjbWQzMi0+c2Nhbl9lbmRfc3JjKTsKKwllcnIgfD0gX19wdXRfdXNlcih0ZW1wLnVpbnQsICZjbWQtPnNjYW5fZW5kX3NyYyk7CisJZXJyIHw9IF9fZ2V0X3VzZXIodGVtcC51aW50LCAmY21kMzItPnNjYW5fZW5kX2FyZyk7CisJZXJyIHw9IF9fcHV0X3VzZXIodGVtcC51aW50LCAmY21kLT5zY2FuX2VuZF9hcmcpOworCWVyciB8PSBfX2dldF91c2VyKHRlbXAudWludCwgJmNtZDMyLT5zdG9wX3NyYyk7CisJZXJyIHw9IF9fcHV0X3VzZXIodGVtcC51aW50LCAmY21kLT5zdG9wX3NyYyk7CisJZXJyIHw9IF9fZ2V0X3VzZXIodGVtcC51aW50LCAmY21kMzItPnN0b3BfYXJnKTsKKwllcnIgfD0gX19wdXRfdXNlcih0ZW1wLnVpbnQsICZjbWQtPnN0b3BfYXJnKTsKKwllcnIgfD0gX19nZXRfdXNlcih0ZW1wLnVwdHIsICZjbWQzMi0+Y2hhbmxpc3QpOworCWVyciB8PSBfX3B1dF91c2VyKGNvbXBhdF9wdHIodGVtcC51cHRyKSwgJmNtZC0+Y2hhbmxpc3QpOworCWVyciB8PSBfX2dldF91c2VyKHRlbXAudWludCwgJmNtZDMyLT5jaGFubGlzdF9sZW4pOworCWVyciB8PSBfX3B1dF91c2VyKHRlbXAudWludCwgJmNtZC0+Y2hhbmxpc3RfbGVuKTsKKwllcnIgfD0gX19nZXRfdXNlcih0ZW1wLnVwdHIsICZjbWQzMi0+ZGF0YSk7CisJZXJyIHw9IF9fcHV0X3VzZXIoY29tcGF0X3B0cih0ZW1wLnVwdHIpLCAmY21kLT5kYXRhKTsKKwllcnIgfD0gX19nZXRfdXNlcih0ZW1wLnVpbnQsICZjbWQzMi0+ZGF0YV9sZW4pOworCWVyciB8PSBfX3B1dF91c2VyKHRlbXAudWludCwgJmNtZC0+ZGF0YV9sZW4pOworCXJldHVybiBlcnIgPyAtRUZBVUxUIDogMDsKK30KKworLyogQ29weSBuYXRpdmUgY21kIHN0cnVjdHVyZSB0byAzMi1iaXQgY21kIHN0cnVjdHVyZS4gKi8KK3N0YXRpYyBpbnQgcHV0X2NvbXBhdF9jbWQoY29tZWRpMzJfY21kIF9fdXNlciAqY21kMzIsIGNvbWVkaV9jbWQgX191c2VyICpjbWQpCit7CisJaW50IGVycjsKKwl1bnNpZ25lZCBpbnQgdGVtcDsKKworCS8qIENvcHkgYmFjayBtb3N0IG9mIGNtZCBzdHJ1Y3R1cmUuICovCisJLyogQXNzdW1lIHRoZSBwb2ludGVyIHZhbHVlcyBhcmUgYWxyZWFkeSB2YWxpZC4gKi8KKwkvKiAoQ291bGQgdXNlIHB0cl90b19jb21wYXQoKSB0byBzZXQgdGhlbSwgYnV0IHRoYXQgd2Fzbid0IGltcGxlbWVudGVkCisJICogdW50aWwga2VybmVsIHZlcnNpb24gMi42LjExLikgKi8KKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgY21kLCBzaXplb2YoKmNtZCkpCisJCQl8fCAhYWNjZXNzX29rKFZFUklGWV9XUklURSwgY21kMzIsIHNpemVvZigqY21kMzIpKSkgeworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJZXJyID0gMDsKKwllcnIgfD0gX19nZXRfdXNlcih0ZW1wLCAmY21kLT5zdWJkZXYpOworCWVyciB8PSBfX3B1dF91c2VyKHRlbXAsICZjbWQzMi0+c3ViZGV2KTsKKwllcnIgfD0gX19nZXRfdXNlcih0ZW1wLCAmY21kLT5mbGFncyk7CisJZXJyIHw9IF9fcHV0X3VzZXIodGVtcCwgJmNtZDMyLT5mbGFncyk7CisJZXJyIHw9IF9fZ2V0X3VzZXIodGVtcCwgJmNtZC0+c3RhcnRfc3JjKTsKKwllcnIgfD0gX19wdXRfdXNlcih0ZW1wLCAmY21kMzItPnN0YXJ0X3NyYyk7CisJZXJyIHw9IF9fZ2V0X3VzZXIodGVtcCwgJmNtZC0+c3RhcnRfYXJnKTsKKwllcnIgfD0gX19wdXRfdXNlcih0ZW1wLCAmY21kMzItPnN0YXJ0X2FyZyk7CisJZXJyIHw9IF9fZ2V0X3VzZXIodGVtcCwgJmNtZC0+c2Nhbl9iZWdpbl9zcmMpOworCWVyciB8PSBfX3B1dF91c2VyKHRlbXAsICZjbWQzMi0+c2Nhbl9iZWdpbl9zcmMpOworCWVyciB8PSBfX2dldF91c2VyKHRlbXAsICZjbWQtPnNjYW5fYmVnaW5fYXJnKTsKKwllcnIgfD0gX19wdXRfdXNlcih0ZW1wLCAmY21kMzItPnNjYW5fYmVnaW5fYXJnKTsKKwllcnIgfD0gX19nZXRfdXNlcih0ZW1wLCAmY21kLT5jb252ZXJ0X3NyYyk7CisJZXJyIHw9IF9fcHV0X3VzZXIodGVtcCwgJmNtZDMyLT5jb252ZXJ0X3NyYyk7CisJZXJyIHw9IF9fZ2V0X3VzZXIodGVtcCwgJmNtZC0+Y29udmVydF9hcmcpOworCWVyciB8PSBfX3B1dF91c2VyKHRlbXAsICZjbWQzMi0+Y29udmVydF9hcmcpOworCWVyciB8PSBfX2dldF91c2VyKHRlbXAsICZjbWQtPnNjYW5fZW5kX3NyYyk7CisJZXJyIHw9IF9fcHV0X3VzZXIodGVtcCwgJmNtZDMyLT5zY2FuX2VuZF9zcmMpOworCWVyciB8PSBfX2dldF91c2VyKHRlbXAsICZjbWQtPnNjYW5fZW5kX2FyZyk7CisJZXJyIHw9IF9fcHV0X3VzZXIodGVtcCwgJmNtZDMyLT5zY2FuX2VuZF9hcmcpOworCWVyciB8PSBfX2dldF91c2VyKHRlbXAsICZjbWQtPnN0b3Bfc3JjKTsKKwllcnIgfD0gX19wdXRfdXNlcih0ZW1wLCAmY21kMzItPnN0b3Bfc3JjKTsKKwllcnIgfD0gX19nZXRfdXNlcih0ZW1wLCAmY21kLT5zdG9wX2FyZyk7CisJZXJyIHw9IF9fcHV0X3VzZXIodGVtcCwgJmNtZDMyLT5zdG9wX2FyZyk7CisJLyogQXNzdW1lIGNoYW5saXN0IHBvaW50ZXIgaXMgdW5jaGFuZ2VkLiAqLworCWVyciB8PSBfX2dldF91c2VyKHRlbXAsICZjbWQtPmNoYW5saXN0X2xlbik7CisJZXJyIHw9IF9fcHV0X3VzZXIodGVtcCwgJmNtZDMyLT5jaGFubGlzdF9sZW4pOworCS8qIEFzc3VtZSBkYXRhIHBvaW50ZXIgaXMgdW5jaGFuZ2VkLiAqLworCWVyciB8PSBfX2dldF91c2VyKHRlbXAsICZjbWQtPmRhdGFfbGVuKTsKKwllcnIgfD0gX19wdXRfdXNlcih0ZW1wLCAmY21kMzItPmRhdGFfbGVuKTsKKwlyZXR1cm4gZXJyID8gLUVGQVVMVCA6IDA7Cit9CisKKy8qIEhhbmRsZSAzMi1iaXQgQ09NRURJX0NNRCBpb2N0bC4gKi8KK3N0YXRpYyBpbnQgY29tcGF0X2NtZChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJY29tZWRpX2NtZCBfX3VzZXIgKmNtZDsKKwljb21lZGkzMl9jbWQgX191c2VyICpjbWQzMjsKKwlpbnQgcmM7CisKKwljbWQzMiA9IGNvbXBhdF9wdHIoYXJnKTsKKwljbWQgPSBjb21wYXRfYWxsb2NfdXNlcl9zcGFjZShzaXplb2YoKmNtZCkpOworCisJcmMgPSBnZXRfY29tcGF0X2NtZChjbWQsIGNtZDMyKTsKKwlpZiAocmMpIHsKKwkJcmV0dXJuIHJjOworCX0KKworCXJldHVybiB0cmFuc2xhdGVkX2lvY3RsKGZpbGUsIENPTUVESV9DTUQsICh1bnNpZ25lZCBsb25nKWNtZCk7Cit9CisKKy8qIEhhbmRsZSAzMi1iaXQgQ09NRURJX0NNRFRFU1QgaW9jdGwuICovCitzdGF0aWMgaW50IGNvbXBhdF9jbWR0ZXN0KHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwljb21lZGlfY21kIF9fdXNlciAqY21kOworCWNvbWVkaTMyX2NtZCBfX3VzZXIgKmNtZDMyOworCWludCByYywgZXJyOworCisJY21kMzIgPSBjb21wYXRfcHRyKGFyZyk7CisJY21kID0gY29tcGF0X2FsbG9jX3VzZXJfc3BhY2Uoc2l6ZW9mKCpjbWQpKTsKKworCXJjID0gZ2V0X2NvbXBhdF9jbWQoY21kLCBjbWQzMik7CisJaWYgKHJjKSB7CisJCXJldHVybiByYzsKKwl9CisKKwlyYyA9IHRyYW5zbGF0ZWRfaW9jdGwoZmlsZSwgQ09NRURJX0NNRFRFU1QsICh1bnNpZ25lZCBsb25nKWNtZCk7CisJaWYgKHJjIDwgMCkgeworCQlyZXR1cm4gcmM7CisJfQorCisJZXJyID0gcHV0X2NvbXBhdF9jbWQoY21kMzIsIGNtZCk7CisJaWYgKGVycikgeworCQlyYyA9IGVycjsKKwl9CisJcmV0dXJuIHJjOworfQorCisvKiBDb3B5IDMyLWJpdCBpbnNuIHN0cnVjdHVyZSB0byBuYXRpdmUgaW5zbiBzdHJ1Y3R1cmUuICovCitzdGF0aWMgaW50IGdldF9jb21wYXRfaW5zbihjb21lZGlfaW5zbiBfX3VzZXIgKmluc24sCisJCWNvbWVkaTMyX2luc24gX191c2VyICppbnNuMzIpCit7CisJaW50IGVycjsKKwl1bmlvbiB7CisJCXVuc2lnbmVkIGludCB1aW50OworCQljb21wYXRfdXB0cl90IHVwdHI7CisJfSB0ZW1wOworCisJLyogQ29weSBpbnNuIHN0cnVjdHVyZS4gIElnbm9yZSB0aGUgdW51c2VkIG1lbWJlcnMuICovCisJZXJyID0gMDsKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgaW5zbjMyLCBzaXplb2YoKmluc24zMikpCisJCQl8fCAhYWNjZXNzX29rKFZFUklGWV9XUklURSwgaW5zbiwgc2l6ZW9mKCppbnNuKSkpIHsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCWVyciB8PSBfX2dldF91c2VyKHRlbXAudWludCwgJmluc24zMi0+aW5zbik7CisJZXJyIHw9IF9fcHV0X3VzZXIodGVtcC51aW50LCAmaW5zbi0+aW5zbik7CisJZXJyIHw9IF9fZ2V0X3VzZXIodGVtcC51aW50LCAmaW5zbjMyLT5uKTsKKwllcnIgfD0gX19wdXRfdXNlcih0ZW1wLnVpbnQsICZpbnNuLT5uKTsKKwllcnIgfD0gX19nZXRfdXNlcih0ZW1wLnVwdHIsICZpbnNuMzItPmRhdGEpOworCWVyciB8PSBfX3B1dF91c2VyKGNvbXBhdF9wdHIodGVtcC51cHRyKSwgJmluc24tPmRhdGEpOworCWVyciB8PSBfX2dldF91c2VyKHRlbXAudWludCwgJmluc24zMi0+c3ViZGV2KTsKKwllcnIgfD0gX19wdXRfdXNlcih0ZW1wLnVpbnQsICZpbnNuLT5zdWJkZXYpOworCWVyciB8PSBfX2dldF91c2VyKHRlbXAudWludCwgJmluc24zMi0+Y2hhbnNwZWMpOworCWVyciB8PSBfX3B1dF91c2VyKHRlbXAudWludCwgJmluc24tPmNoYW5zcGVjKTsKKwlyZXR1cm4gZXJyID8gLUVGQVVMVCA6IDA7Cit9CisKKy8qIEhhbmRsZSAzMi1iaXQgQ09NRURJX0lOU05MSVNUIGlvY3RsLiAqLworc3RhdGljIGludCBjb21wYXRfaW5zbmxpc3Qoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBjb21iaW5lZF9pbnNubGlzdCB7CisJCWNvbWVkaV9pbnNubGlzdCBpbnNubGlzdDsKKwkJY29tZWRpX2luc24gaW5zblsxXTsKKwl9IF9fdXNlciAqczsKKwljb21lZGkzMl9pbnNubGlzdCBfX3VzZXIgKmluc25saXN0MzI7CisJY29tZWRpMzJfaW5zbiBfX3VzZXIgKmluc24zMjsKKwljb21wYXRfdXB0cl90IHVwdHI7CisJdW5zaWduZWQgaW50IG5faW5zbnMsIG47CisJaW50IGVyciwgcmM7CisKKwlpbnNubGlzdDMyID0gY29tcGF0X3B0cihhcmcpOworCisJLyogR2V0IDMyLWJpdCBpbnNubGlzdCBzdHJ1Y3R1cmUuICAqLworCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCBpbnNubGlzdDMyLCBzaXplb2YoKmluc25saXN0MzIpKSkgeworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJZXJyID0gMDsKKwllcnIgfD0gX19nZXRfdXNlcihuX2luc25zLCAmaW5zbmxpc3QzMi0+bl9pbnNucyk7CisJZXJyIHw9IF9fZ2V0X3VzZXIodXB0ciwgJmluc25saXN0MzItPmluc25zKTsKKwlpbnNuMzIgPSBjb21wYXRfcHRyKHVwdHIpOworCWlmIChlcnIpIHsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJLyogQWxsb2NhdGUgdXNlciBtZW1vcnkgdG8gY29weSBpbnNubGlzdCBhbmQgaW5zbnMgaW50by4gKi8KKwlzID0gY29tcGF0X2FsbG9jX3VzZXJfc3BhY2Uob2Zmc2V0b2Yoc3RydWN0IGNvbWJpbmVkX2luc25saXN0LAorCQkJCWluc25bbl9pbnNuc10pKTsKKworCS8qIFNldCBuYXRpdmUgaW5zbmxpc3Qgc3RydWN0dXJlLiAqLworCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgJnMtPmluc25saXN0LCBzaXplb2Yocy0+aW5zbmxpc3QpKSkgeworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJZXJyIHw9IF9fcHV0X3VzZXIobl9pbnNucywgJnMtPmluc25saXN0Lm5faW5zbnMpOworCWVyciB8PSBfX3B1dF91c2VyKCZzLT5pbnNuWzBdLCAmcy0+aW5zbmxpc3QuaW5zbnMpOworCWlmIChlcnIpIHsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJLyogQ29weSBpbnNuIHN0cnVjdHVyZXMuICovCisJZm9yIChuID0gMDsgbiA8IG5faW5zbnM7IG4rKykgeworCQlyYyA9IGdldF9jb21wYXRfaW5zbigmcy0+aW5zbltuXSwgJmluc24zMltuXSk7CisJCWlmIChyYykgeworCQkJcmV0dXJuIHJjOworCQl9CisJfQorCisJcmV0dXJuIHRyYW5zbGF0ZWRfaW9jdGwoZmlsZSwgQ09NRURJX0lOU05MSVNULAorCQkJKHVuc2lnbmVkIGxvbmcpJnMtPmluc25saXN0KTsKK30KKworLyogSGFuZGxlIDMyLWJpdCBDT01FRElfSU5TTiBpb2N0bC4gKi8KK3N0YXRpYyBpbnQgY29tcGF0X2luc24oc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWNvbWVkaV9pbnNuIF9fdXNlciAqaW5zbjsKKwljb21lZGkzMl9pbnNuIF9fdXNlciAqaW5zbjMyOworCWludCByYzsKKworCWluc24zMiA9IGNvbXBhdF9wdHIoYXJnKTsKKwlpbnNuID0gY29tcGF0X2FsbG9jX3VzZXJfc3BhY2Uoc2l6ZW9mKCppbnNuKSk7CisKKwlyYyA9IGdldF9jb21wYXRfaW5zbihpbnNuLCBpbnNuMzIpOworCWlmIChyYykgeworCQlyZXR1cm4gcmM7CisJfQorCisJcmV0dXJuIHRyYW5zbGF0ZWRfaW9jdGwoZmlsZSwgQ09NRURJX0lOU04sICh1bnNpZ25lZCBsb25nKWluc24pOworfQorCisvKiBQcm9jZXNzIHVudHJhbnNsYXRlZCBpb2N0bC4gKi8KKy8qIFJldHVybnMgLUVOT0lPQ1RMQ01EIGZvciB1bnJlY29nbmlzZWQgaW9jdGwgY29kZXMuICovCitzdGF0aWMgaW5saW5lIGludCByYXdfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCisJCXVuc2lnbmVkIGxvbmcgYXJnKQoreworCWludCByYzsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBDT01FRElfREVWQ09ORklHOgorCWNhc2UgQ09NRURJX0RFVklORk86CisJY2FzZSBDT01FRElfU1VCRElORk86CisJY2FzZSBDT01FRElfQlVGQ09ORklHOgorCWNhc2UgQ09NRURJX0JVRklORk86CisJCS8qIEp1c3QgbmVlZCB0byB0cmFuc2xhdGUgdGhlIHBvaW50ZXIgYXJndW1lbnQuICovCisJCWFyZyA9ICh1bnNpZ25lZCBsb25nKWNvbXBhdF9wdHIoYXJnKTsKKwkJcmMgPSB0cmFuc2xhdGVkX2lvY3RsKGZpbGUsIGNtZCwgYXJnKTsKKwkJYnJlYWs7CisJY2FzZSBDT01FRElfTE9DSzoKKwljYXNlIENPTUVESV9VTkxPQ0s6CisJY2FzZSBDT01FRElfQ0FOQ0VMOgorCWNhc2UgQ09NRURJX1BPTEw6CisJCS8qIE5vIHRyYW5zbGF0aW9uIG5lZWRlZC4gKi8KKwkJcmMgPSB0cmFuc2xhdGVkX2lvY3RsKGZpbGUsIGNtZCwgYXJnKTsKKwkJYnJlYWs7CisJY2FzZSBDT01FREkzMl9DSEFOSU5GTzoKKwkJcmMgPSBjb21wYXRfY2hhbmluZm8oZmlsZSwgYXJnKTsKKwkJYnJlYWs7CisJY2FzZSBDT01FREkzMl9SQU5HRUlORk86CisJCXJjID0gY29tcGF0X3JhbmdlaW5mbyhmaWxlLCBhcmcpOworCQlicmVhazsKKwljYXNlIENPTUVESTMyX0NNRDoKKwkJcmMgPSBjb21wYXRfY21kKGZpbGUsIGFyZyk7CisJCWJyZWFrOworCWNhc2UgQ09NRURJMzJfQ01EVEVTVDoKKwkJcmMgPSBjb21wYXRfY21kdGVzdChmaWxlLCBhcmcpOworCQlicmVhazsKKwljYXNlIENPTUVESTMyX0lOU05MSVNUOgorCQlyYyA9IGNvbXBhdF9pbnNubGlzdChmaWxlLCBhcmcpOworCQlicmVhazsKKwljYXNlIENPTUVESTMyX0lOU046CisJCXJjID0gY29tcGF0X2luc24oZmlsZSwgYXJnKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmMgPSAtRU5PSU9DVExDTUQ7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gcmM7Cit9CisKKyNpZmRlZiBIQVZFX0NPTVBBVF9JT0NUTAkvKiBkZWZpbmVkIGluIDxsaW51eC9mcy5oPiAyLjYuMTEgb253YXJkcyAqLworCisvKiBjb21wYXRfaW9jdGwgZmlsZSBvcGVyYXRpb24uICovCisvKiBSZXR1cm5zIC1FTk9JT0NUTENNRCBmb3IgdW5yZWNvZ25pc2VkIGlvY3RsIGNvZGVzLiAqLworbG9uZyBjb21lZGlfY29tcGF0X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAorCQl1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlyZXR1cm4gcmF3X2lvY3RsKGZpbGUsIGNtZCwgYXJnKTsKK30KKworI2Vsc2UgLyogSEFWRV9DT01QQVRfSU9DVEwgKi8KKworLyoKKyAqIEJyYWluLWRlYWQgaW9jdGwgY29tcGF0aWJpbGl0eSBmb3IgMi42LjEwIGFuZCBlYXJsaWVyLgorICoKKyAqIEl0J3MgYnJhaW4tZGVhZCBiZWNhdXNlIGNtZCBudW1iZXJzIG5lZWQgdG8gYmUgdW5pcXVlIHN5c3RlbS13aWRlIQorICogVGhlIGNvbWVkaSBkcml2ZXIgY291bGQgZW5kIHVwIGF0dGVtcHRpbmcgdG8gZXhlY3V0ZSBpb2N0bHMgZm9yIG5vbi1Db21lZGkKKyAqIGRldmljZXMgYmVjYXVzZSBpdCByZWdpc3RlcmVkIHRoZSBzeXN0ZW0td2lkZSBjbWQgY29kZSBmaXJzdC4gIFNpbWlsYXJseSwKKyAqIGFub3RoZXIgZHJpdmVyIGNvdWxkIGVuZCB1cCBhdHRlbXB0aW5nIHRvIGV4ZWN1dGUgaW9jdGxzIGZvciBhIENvbWVkaQorICogZGV2aWNlIGJlY2F1c2UgaXQgcmVnaXN0ZXJlZCB0aGUgY21kIGNvZGUgZmlyc3QuICBDaGFvcyBlbnN1ZXMuCisgKi8KKworLyogSGFuZGxlciBmb3IgYWxsIDMyLWJpdCBpb2N0bCBjb2RlcyByZWdpc3RlcmVkIGJ5IHRoaXMgZHJpdmVyLiAqLworc3RhdGljIGludCBtYXBwZWRfaW9jdGwodW5zaWduZWQgaW50IGZkLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZywKKwkJc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaW50IHJjOworCisJLyogTWFrZSBzdXJlIHdlIGFyZSBkZWFsaW5nIHdpdGggYSBDb21lZGkgZGV2aWNlLiAqLworCWlmIChpbWFqb3IoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUpICE9IENPTUVESV9NQUpPUikgeworCQlyZXR1cm4gLUVOT1RUWTsKKwl9CisJcmMgPSByYXdfaW9jdGwoZmlsZSwgY21kLCBhcmcpOworCS8qIERvIG5vdCByZXR1cm4gLUVOT0lPQ1RMQ01ELiAqLworCWlmIChyYyA9PSAtRU5PSU9DVExDTUQpIHsKKwkJcmMgPSAtRU5PVFRZOworCX0KKwlyZXR1cm4gcmM7Cit9CisKK3N0cnVjdCBpb2N0bDMyX21hcCB7CisJdW5zaWduZWQgaW50IGNtZDsKKwlpbnQgKCpoYW5kbGVyKSh1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCwgdW5zaWduZWQgbG9uZywKKwkJCXN0cnVjdCBmaWxlICopOworCWludCByZWdpc3RlcmVkOworfTsKKworc3RhdGljIHN0cnVjdCBpb2N0bDMyX21hcCBjb21lZGlfaW9jdGwzMl9tYXBbXSA9IHsKKwl7IENPTUVESV9ERVZDT05GSUcsIG1hcHBlZF9pb2N0bCwgMCB9LAorCXsgQ09NRURJX0RFVklORk8sIG1hcHBlZF9pb2N0bCwgMCB9LAorCXsgQ09NRURJX1NVQkRJTkZPLCBtYXBwZWRfaW9jdGwsIDAgfSwKKwl7IENPTUVESV9CVUZDT05GSUcsIG1hcHBlZF9pb2N0bCwgMCB9LAorCXsgQ09NRURJX0JVRklORk8sIG1hcHBlZF9pb2N0bCwgMCB9LAorCXsgQ09NRURJX0xPQ0ssIG1hcHBlZF9pb2N0bCwgMCB9LAorCXsgQ09NRURJX1VOTE9DSywgbWFwcGVkX2lvY3RsLCAwIH0sCisJeyBDT01FRElfQ0FOQ0VMLCBtYXBwZWRfaW9jdGwsIDAgfSwKKwl7IENPTUVESV9QT0xMLCBtYXBwZWRfaW9jdGwsIDAgfSwKKwl7IENPTUVESTMyX0NIQU5JTkZPLCBtYXBwZWRfaW9jdGwsIDAgfSwKKwl7IENPTUVESTMyX1JBTkdFSU5GTywgbWFwcGVkX2lvY3RsLCAwIH0sCisJeyBDT01FREkzMl9DTUQsIG1hcHBlZF9pb2N0bCwgMCB9LAorCXsgQ09NRURJMzJfQ01EVEVTVCwgbWFwcGVkX2lvY3RsLCAwIH0sCisJeyBDT01FREkzMl9JTlNOTElTVCwgbWFwcGVkX2lvY3RsLCAwIH0sCisJeyBDT01FREkzMl9JTlNOLCBtYXBwZWRfaW9jdGwsIDAgfSwKK307CisKKyNkZWZpbmUgTlVNX0lPQ1RMMzJfTUFQUyBBUlJBWV9TSVpFKGNvbWVkaV9pb2N0bDMyX21hcCkKKworLyogUmVnaXN0ZXIgc3lzdGVtLXdpZGUgMzItYml0IGlvY3RsIGhhbmRsZXJzLiAqLwordm9pZCBjb21lZGlfcmVnaXN0ZXJfaW9jdGwzMih2b2lkKQoreworCWludCBuLCByYzsKKworCWZvciAobiA9IDA7IG4gPCBOVU1fSU9DVEwzMl9NQVBTOyBuKyspIHsKKwkJcmMgPSByZWdpc3Rlcl9pb2N0bDMyX2NvbnZlcnNpb24oY29tZWRpX2lvY3RsMzJfbWFwW25dLmNtZCwKKwkJCQljb21lZGlfaW9jdGwzMl9tYXBbbl0uaGFuZGxlcik7CisJCWlmIChyYykgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJCQkiY29tZWRpOiBmYWlsZWQgdG8gcmVnaXN0ZXIgMzItYml0ICIKKwkJCQkJImNvbXBhdGlibGUgaW9jdGwgaGFuZGxlciBmb3IgMHglWCAtICIKKwkJCQkJImV4cGVjdCBiYWQgdGhpbmdzIHRvIGhhcHBlbiFcbiIsCisJCQkJCWNvbWVkaV9pb2N0bDMyX21hcFtuXS5jbWQpOworCQl9CisJCWNvbWVkaV9pb2N0bDMyX21hcFtuXS5yZWdpc3RlcmVkID0gIXJjOworCX0KK30KKworLyogVW5yZWdpc3RlciBzeXN0ZW0td2lkZSAzMi1iaXQgaW9jdGwgdHJhbnNsYXRpb25zLiAqLwordm9pZCBjb21lZGlfdW5yZWdpc3Rlcl9pb2N0bDMyKHZvaWQpCit7CisJaW50IG4sIHJjOworCisJZm9yIChuID0gMDsgbiA8IE5VTV9JT0NUTDMyX01BUFM7IG4rKykgeworCQlpZiAoY29tZWRpX2lvY3RsMzJfbWFwW25dLnJlZ2lzdGVyZWQpIHsKKwkJCXJjID0gdW5yZWdpc3Rlcl9pb2N0bDMyX2NvbnZlcnNpb24oCisJCQkJCWNvbWVkaV9pb2N0bDMyX21hcFtuXS5jbWQsCisJCQkJCWNvbWVkaV9pb2N0bDMyX21hcFtuXS5oYW5kbGVyKTsKKwkJCWlmIChyYykgeworCQkJCXByaW50ayhLRVJOX0VSUgorCQkJCQkiY29tZWRpOiBmYWlsZWQgdG8gdW5yZWdpc3RlciAzMi1iaXQgIgorCQkJCQkiY29tcGF0aWJsZSBpb2N0bCBoYW5kbGVyIGZvciAweCVYIC0gIgorCQkJCQkiZXhwZWN0IGtlcm5lbCBPb3BzIVxuIiwKKwkJCQkJY29tZWRpX2lvY3RsMzJfbWFwW25dLmNtZCk7CisJCQl9IGVsc2UgeworCQkJCWNvbWVkaV9pb2N0bDMyX21hcFtuXS5yZWdpc3RlcmVkID0gMDsKKwkJCX0KKwkJfQorCX0KK30KKworI2VuZGlmCS8qIEhBVkVfQ09NUEFUX0lPQ1RMICovCisKKyNlbmRpZgkvKiBDT05GSUdfQ09NUEFUICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2NvbWVkaV9jb21wYXQzMi5oIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9jb21lZGlfY29tcGF0MzIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2EwMTY0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9jb21lZGlfY29tcGF0MzIuaApAQCAtMCwwICsxLDU4IEBACisvKgorICAgIGNvbWVkaS9jb21lZGlfY29tcGF0MzIuaAorICAgIDMyLWJpdCBpb2N0bCBjb21wYXRpYmlsaXR5IGZvciA2NC1iaXQgY29tZWRpIGtlcm5lbCBtb2R1bGUuCisKKyAgICBBdXRob3I6IElhbiBBYmJvdHQsIE1FViBMdGQuIDxhYmJvdHRpQG1ldi5jby51az4KKyAgICBDb3B5cmlnaHQgKEMpIDIwMDcgTUVWIEx0ZC4gPGh0dHA6Ly93d3cubWV2LmNvLnVrLz4KKworICAgIENPTUVESSAtIExpbnV4IENvbnRyb2wgYW5kIE1lYXN1cmVtZW50IERldmljZSBJbnRlcmZhY2UKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNyBEYXZpZCBBLiBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisqLworCisjaWZuZGVmIF9DT01FRElfQ09NUEFUMzJfSAorI2RlZmluZSBfQ09NRURJX0NPTVBBVDMyX0gKKworI2luY2x1ZGUgPGxpbnV4L2NvbXBhdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CS8qIEZvciBIQVZFX0NPTVBBVF9JT0NUTCBhbmQgSEFWRV9VTkxPQ0tFRF9JT0NUTCAqLworCisjaWZkZWYgQ09ORklHX0NPTVBBVAorCisjaWZkZWYgSEFWRV9DT01QQVRfSU9DVEwKKworZXh0ZXJuIGxvbmcgY29tZWRpX2NvbXBhdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKKwkJdW5zaWduZWQgbG9uZyBhcmcpOworI2RlZmluZSBjb21lZGlfcmVnaXN0ZXJfaW9jdGwzMigpIGRvIHt9IHdoaWxlICgwKQorI2RlZmluZSBjb21lZGlfdW5yZWdpc3Rlcl9pb2N0bDMyKCkgZG8ge30gd2hpbGUgKDApCisKKyNlbHNlIC8qIEhBVkVfQ09NUEFUX0lPQ1RMICovCisKKyNkZWZpbmUgY29tZWRpX2NvbXBhdF9pb2N0bCAwCS8qIE5VTEwgKi8KK2V4dGVybiB2b2lkIGNvbWVkaV9yZWdpc3Rlcl9pb2N0bDMyKHZvaWQpOworZXh0ZXJuIHZvaWQgY29tZWRpX3VucmVnaXN0ZXJfaW9jdGwzMih2b2lkKTsKKworI2VuZGlmIC8qIEhBVkVfQ09NUEFUX0lPQ1RMICovCisKKyNlbHNlIC8qIENPTkZJR19DT01QQVQgKi8KKworI2RlZmluZSBjb21lZGlfY29tcGF0X2lvY3RsIDAJLyogTlVMTCAqLworI2RlZmluZSBjb21lZGlfcmVnaXN0ZXJfaW9jdGwzMigpIGRvIHt9IHdoaWxlICgwKQorI2RlZmluZSBjb21lZGlfdW5yZWdpc3Rlcl9pb2N0bDMyKCkgZG8ge30gd2hpbGUgKDApCisKKyNlbmRpZiAvKiBDT05GSUdfQ09NUEFUICovCisKKyNlbmRpZiAvKiBfQ09NRURJX0NPTVBBVDMyX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvY29tZWRpX2ZvcHMuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvY29tZWRpX2ZvcHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMThjOTY0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9jb21lZGlfZm9wcy5jCkBAIC0wLDAgKzEsMjI0NCBAQAorLyoKKyAgICBjb21lZGkvY29tZWRpX2ZvcHMuYworICAgIGNvbWVkaSBrZXJuZWwgbW9kdWxlCisKKyAgICBDT01FREkgLSBMaW51eCBDb250cm9sIGFuZCBNZWFzdXJlbWVudCBEZXZpY2UgSW50ZXJmYWNlCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDAgRGF2aWQgQS4gU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworKi8KKworI3VuZGVmIERFQlVHCisKKyNkZWZpbmUgX19OT19WRVJTSU9OX18KKyNpbmNsdWRlICJjb21lZGlfZm9wcy5oIgorI2luY2x1ZGUgImNvbWVkaV9jb21wYXQzMi5oIgorCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9rbW9kLmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlICJjb21lZGlkZXYuaCIKKyNpbmNsdWRlIDxsaW51eC9jZGV2Lmg+CisKKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKworLyogI2luY2x1ZGUgImt2bWVtLmgiICovCisKK01PRFVMRV9BVVRIT1IoImh0dHA6Ly93d3cuY29tZWRpLm9yZyIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJDb21lZGkgY29yZSBtb2R1bGUiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworI2lmZGVmIENPTkZJR19DT01FRElfREVCVUcKK2ludCBjb21lZGlfZGVidWc7Cittb2R1bGVfcGFyYW0oY29tZWRpX2RlYnVnLCBpbnQsIDA2NDQpOworI2VuZGlmCisKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soY29tZWRpX2ZpbGVfaW5mb190YWJsZV9sb2NrKTsKK3N0YXRpYyBzdHJ1Y3QgY29tZWRpX2RldmljZV9maWxlX2luZm8KKyAgICAqY29tZWRpX2ZpbGVfaW5mb190YWJsZVtDT01FRElfTlVNX01JTk9SU107CisKK3N0YXRpYyBpbnQgZG9fZGV2Y29uZmlnX2lvY3RsKGNvbWVkaV9kZXZpY2UgKmRldiwgY29tZWRpX2RldmNvbmZpZyAqYXJnKTsKK3N0YXRpYyBpbnQgZG9fYnVmY29uZmlnX2lvY3RsKGNvbWVkaV9kZXZpY2UgKmRldiwgdm9pZCAqYXJnKTsKK3N0YXRpYyBpbnQgZG9fZGV2aW5mb19pb2N0bChjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9kZXZpbmZvICphcmcsCisJCQkgICAgc3RydWN0IGZpbGUgKmZpbGUpOworc3RhdGljIGludCBkb19zdWJkaW5mb19pb2N0bChjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9zdWJkaW5mbyAqYXJnLAorCQkJICAgICB2b2lkICpmaWxlKTsKK3N0YXRpYyBpbnQgZG9fY2hhbmluZm9faW9jdGwoY29tZWRpX2RldmljZSAqZGV2LCBjb21lZGlfY2hhbmluZm8gKmFyZyk7CitzdGF0aWMgaW50IGRvX2J1ZmluZm9faW9jdGwoY29tZWRpX2RldmljZSAqZGV2LCB2b2lkICphcmcpOworc3RhdGljIGludCBkb19jbWRfaW9jdGwoY29tZWRpX2RldmljZSAqZGV2LCB2b2lkICphcmcsIHZvaWQgKmZpbGUpOworc3RhdGljIGludCBkb19sb2NrX2lvY3RsKGNvbWVkaV9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IGFyZywgdm9pZCAqZmlsZSk7CitzdGF0aWMgaW50IGRvX3VubG9ja19pb2N0bChjb21lZGlfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBhcmcsIHZvaWQgKmZpbGUpOworc3RhdGljIGludCBkb19jYW5jZWxfaW9jdGwoY29tZWRpX2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgYXJnLCB2b2lkICpmaWxlKTsKK3N0YXRpYyBpbnQgZG9fY21kdGVzdF9pb2N0bChjb21lZGlfZGV2aWNlICpkZXYsIHZvaWQgKmFyZywgdm9pZCAqZmlsZSk7CitzdGF0aWMgaW50IGRvX2luc25saXN0X2lvY3RsKGNvbWVkaV9kZXZpY2UgKmRldiwgdm9pZCAqYXJnLCB2b2lkICpmaWxlKTsKK3N0YXRpYyBpbnQgZG9faW5zbl9pb2N0bChjb21lZGlfZGV2aWNlICpkZXYsIHZvaWQgKmFyZywgdm9pZCAqZmlsZSk7CitzdGF0aWMgaW50IGRvX3BvbGxfaW9jdGwoY29tZWRpX2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgc3ViZCwgdm9pZCAqZmlsZSk7CisKK2V4dGVybiB2b2lkIGRvX2JlY29tZV9ub25idXN5KGNvbWVkaV9kZXZpY2UgKmRldiwgY29tZWRpX3N1YmRldmljZSAqcyk7CitzdGF0aWMgaW50IGRvX2NhbmNlbChjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKnMpOworCitzdGF0aWMgaW50IGNvbWVkaV9mYXN5bmMoaW50IGZkLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgaW50IG9uKTsKKworc3RhdGljIGludCBpc19kZXZpY2VfYnVzeShjb21lZGlfZGV2aWNlICpkZXYpOworCisjaWZkZWYgSEFWRV9VTkxPQ0tFRF9JT0NUTAorc3RhdGljIGxvbmcgY29tZWRpX3VubG9ja2VkX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAorCQkJCSAgdW5zaWduZWQgbG9uZyBhcmcpCisjZWxzZQorc3RhdGljIGludCBjb21lZGlfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCQl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKKyNlbmRpZgoreworCWNvbnN0IHVuc2lnbmVkIG1pbm9yID0gaW1pbm9yKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlKTsKKwlzdHJ1Y3QgY29tZWRpX2RldmljZV9maWxlX2luZm8gKmRldl9maWxlX2luZm8gPQorCSAgICBjb21lZGlfZ2V0X2RldmljZV9maWxlX2luZm8obWlub3IpOworCWNvbWVkaV9kZXZpY2UgKmRldiA9IGRldl9maWxlX2luZm8tPmRldmljZTsKKwlpbnQgcmM7CisKKwltdXRleF9sb2NrKCZkZXYtPm11dGV4KTsKKworCS8qIERldmljZSBjb25maWcgaXMgc3BlY2lhbCwgYmVjYXVzZSBpdCBtdXN0IHdvcmsgb24KKwkgKiBhbiB1bmNvbmZpZ3VyZWQgZGV2aWNlLiAqLworCWlmIChjbWQgPT0gQ09NRURJX0RFVkNPTkZJRykgeworCQlyYyA9IGRvX2RldmNvbmZpZ19pb2N0bChkZXYsICh2b2lkICopYXJnKTsKKwkJZ290byBkb25lOworCX0KKworCWlmICghZGV2LT5hdHRhY2hlZCkgeworCQlEUFJJTlRLKCJubyBkcml2ZXIgY29uZmlndXJlZCBvbiAvZGV2L2NvbWVkaSVpXG4iLCBkZXYtPm1pbm9yKTsKKwkJcmMgPSAtRU5PREVWOworCQlnb3RvIGRvbmU7CisJfQorCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIENPTUVESV9CVUZDT05GSUc6CisJCXJjID0gZG9fYnVmY29uZmlnX2lvY3RsKGRldiwgKHZvaWQgKilhcmcpOworCQlicmVhazsKKwljYXNlIENPTUVESV9ERVZJTkZPOgorCQlyYyA9IGRvX2RldmluZm9faW9jdGwoZGV2LCAodm9pZCAqKWFyZywgZmlsZSk7CisJCWJyZWFrOworCWNhc2UgQ09NRURJX1NVQkRJTkZPOgorCQlyYyA9IGRvX3N1YmRpbmZvX2lvY3RsKGRldiwgKHZvaWQgKilhcmcsIGZpbGUpOworCQlicmVhazsKKwljYXNlIENPTUVESV9DSEFOSU5GTzoKKwkJcmMgPSBkb19jaGFuaW5mb19pb2N0bChkZXYsICh2b2lkICopYXJnKTsKKwkJYnJlYWs7CisJY2FzZSBDT01FRElfUkFOR0VJTkZPOgorCQlyYyA9IGRvX3JhbmdlaW5mb19pb2N0bChkZXYsICh2b2lkICopYXJnKTsKKwkJYnJlYWs7CisJY2FzZSBDT01FRElfQlVGSU5GTzoKKwkJcmMgPSBkb19idWZpbmZvX2lvY3RsKGRldiwgKHZvaWQgKilhcmcpOworCQlicmVhazsKKwljYXNlIENPTUVESV9MT0NLOgorCQlyYyA9IGRvX2xvY2tfaW9jdGwoZGV2LCBhcmcsIGZpbGUpOworCQlicmVhazsKKwljYXNlIENPTUVESV9VTkxPQ0s6CisJCXJjID0gZG9fdW5sb2NrX2lvY3RsKGRldiwgYXJnLCBmaWxlKTsKKwkJYnJlYWs7CisJY2FzZSBDT01FRElfQ0FOQ0VMOgorCQlyYyA9IGRvX2NhbmNlbF9pb2N0bChkZXYsIGFyZywgZmlsZSk7CisJCWJyZWFrOworCWNhc2UgQ09NRURJX0NNRDoKKwkJcmMgPSBkb19jbWRfaW9jdGwoZGV2LCAodm9pZCAqKWFyZywgZmlsZSk7CisJCWJyZWFrOworCWNhc2UgQ09NRURJX0NNRFRFU1Q6CisJCXJjID0gZG9fY21kdGVzdF9pb2N0bChkZXYsICh2b2lkICopYXJnLCBmaWxlKTsKKwkJYnJlYWs7CisJY2FzZSBDT01FRElfSU5TTkxJU1Q6CisJCXJjID0gZG9faW5zbmxpc3RfaW9jdGwoZGV2LCAodm9pZCAqKWFyZywgZmlsZSk7CisJCWJyZWFrOworCWNhc2UgQ09NRURJX0lOU046CisJCXJjID0gZG9faW5zbl9pb2N0bChkZXYsICh2b2lkICopYXJnLCBmaWxlKTsKKwkJYnJlYWs7CisJY2FzZSBDT01FRElfUE9MTDoKKwkJcmMgPSBkb19wb2xsX2lvY3RsKGRldiwgYXJnLCBmaWxlKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmMgPSAtRU5PVFRZOworCQlicmVhazsKKwl9CisKK2RvbmU6CisJbXV0ZXhfdW5sb2NrKCZkZXYtPm11dGV4KTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qCisJQ09NRURJX0RFVkNPTkZJRworCWRldmljZSBjb25maWcgaW9jdGwKKworCWFyZzoKKwkJcG9pbnRlciB0byBkZXZjb25maWcgc3RydWN0dXJlCisKKwlyZWFkczoKKwkJZGV2Y29uZmlnIHN0cnVjdHVyZSBhdCBhcmcKKworCXdyaXRlczoKKwkJbm9uZQorKi8KK3N0YXRpYyBpbnQgZG9fZGV2Y29uZmlnX2lvY3RsKGNvbWVkaV9kZXZpY2UgKmRldiwgY29tZWRpX2RldmNvbmZpZyAqYXJnKQoreworCWNvbWVkaV9kZXZjb25maWcgaXQ7CisJaW50IHJldDsKKwl1bnNpZ25lZCBjaGFyICphdXhfZGF0YSA9IE5VTEw7CisJaW50IGF1eF9sZW47CisKKwlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCisJCXJldHVybiAtRVBFUk07CisKKwlpZiAoYXJnID09IE5VTEwpIHsKKwkJaWYgKGlzX2RldmljZV9idXN5KGRldikpCisJCQlyZXR1cm4gLUVCVVNZOworCQlpZiAoZGV2LT5hdHRhY2hlZCkgeworCQkJc3RydWN0IG1vZHVsZSAqZHJpdmVyX21vZHVsZSA9IGRldi0+ZHJpdmVyLT5tb2R1bGU7CisJCQljb21lZGlfZGV2aWNlX2RldGFjaChkZXYpOworCQkJbW9kdWxlX3B1dChkcml2ZXJfbW9kdWxlKTsKKwkJfQorCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJml0LCBhcmcsIHNpemVvZihjb21lZGlfZGV2Y29uZmlnKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJaXQuYm9hcmRfbmFtZVtDT01FRElfTkFNRUxFTiAtIDFdID0gMDsKKworCWlmIChjb21lZGlfYXV4X2RhdGEoaXQub3B0aW9ucywgMCkgJiYKKwkgICAgaXQub3B0aW9uc1tDT01FRElfREVWQ09ORl9BVVhfREFUQV9MRU5HVEhdKSB7CisJCWludCBiaXRfc2hpZnQ7CisJCWF1eF9sZW4gPSBpdC5vcHRpb25zW0NPTUVESV9ERVZDT05GX0FVWF9EQVRBX0xFTkdUSF07CisJCWlmIChhdXhfbGVuIDwgMCkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCWF1eF9kYXRhID0gdm1hbGxvYyhhdXhfbGVuKTsKKwkJaWYgKCFhdXhfZGF0YSkKKwkJCXJldHVybiAtRU5PTUVNOworCisJCWlmIChjb3B5X2Zyb21fdXNlcihhdXhfZGF0YSwKKwkJCQkgICBjb21lZGlfYXV4X2RhdGEoaXQub3B0aW9ucywgMCksIGF1eF9sZW4pKSB7CisJCQl2ZnJlZShhdXhfZGF0YSk7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCQlpdC5vcHRpb25zW0NPTUVESV9ERVZDT05GX0FVWF9EQVRBX0xPXSA9CisJCSAgICAodW5zaWduZWQgbG9uZylhdXhfZGF0YTsKKwkJaWYgKHNpemVvZih2b2lkICopID4gc2l6ZW9mKGludCkpIHsKKwkJCWJpdF9zaGlmdCA9IHNpemVvZihpbnQpICogODsKKwkJCWl0Lm9wdGlvbnNbQ09NRURJX0RFVkNPTkZfQVVYX0RBVEFfSEldID0KKwkJCSAgICAoKHVuc2lnbmVkIGxvbmcpYXV4X2RhdGEpID4+IGJpdF9zaGlmdDsKKwkJfSBlbHNlCisJCQlpdC5vcHRpb25zW0NPTUVESV9ERVZDT05GX0FVWF9EQVRBX0hJXSA9IDA7CisJfQorCisJcmV0ID0gY29tZWRpX2RldmljZV9hdHRhY2goZGV2LCAmaXQpOworCWlmIChyZXQgPT0gMCkgeworCQlpZiAoIXRyeV9tb2R1bGVfZ2V0KGRldi0+ZHJpdmVyLT5tb2R1bGUpKSB7CisJCQljb21lZGlfZGV2aWNlX2RldGFjaChkZXYpOworCQkJcmV0dXJuIC1FTk9TWVM7CisJCX0KKwl9CisKKwlpZiAoYXV4X2RhdGEpCisJCXZmcmVlKGF1eF9kYXRhKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qCisJQ09NRURJX0JVRkNPTkZJRworCWJ1ZmZlciBjb25maWd1cmF0aW9uIGlvY3RsCisKKwlhcmc6CisJCXBvaW50ZXIgdG8gYnVmY29uZmlnIHN0cnVjdHVyZQorCisJcmVhZHM6CisJCWJ1ZmNvbmZpZyBhdCBhcmcKKworCXdyaXRlczoKKwkJbW9kaWZpZWQgYnVmY29uZmlnIGF0IGFyZworCisqLworc3RhdGljIGludCBkb19idWZjb25maWdfaW9jdGwoY29tZWRpX2RldmljZSAqZGV2LCB2b2lkICphcmcpCit7CisJY29tZWRpX2J1ZmNvbmZpZyBiYzsKKwljb21lZGlfYXN5bmMgKmFzeW5jOworCWNvbWVkaV9zdWJkZXZpY2UgKnM7CisJaW50IHJldCA9IDA7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmJjLCBhcmcsIHNpemVvZihjb21lZGlfYnVmY29uZmlnKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKGJjLnN1YmRldmljZSA+PSBkZXYtPm5fc3ViZGV2aWNlcyB8fCBiYy5zdWJkZXZpY2UgPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXMgPSBkZXYtPnN1YmRldmljZXMgKyBiYy5zdWJkZXZpY2U7CisJYXN5bmMgPSBzLT5hc3luYzsKKworCWlmICghYXN5bmMpIHsKKwkJRFBSSU5USygic3ViZGV2aWNlIGRvZXMgbm90IGhhdmUgYXN5bmMgY2FwYWJpbGl0eVxuIik7CisJCWJjLnNpemUgPSAwOworCQliYy5tYXhpbXVtX3NpemUgPSAwOworCQlnb3RvIGNvcHliYWNrOworCX0KKworCWlmIChiYy5tYXhpbXVtX3NpemUpIHsKKwkJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQorCQkJcmV0dXJuIC1FUEVSTTsKKworCQlhc3luYy0+bWF4X2J1ZnNpemUgPSBiYy5tYXhpbXVtX3NpemU7CisJfQorCisJaWYgKGJjLnNpemUpIHsKKwkJaWYgKGJjLnNpemUgPiBhc3luYy0+bWF4X2J1ZnNpemUpCisJCQlyZXR1cm4gLUVQRVJNOworCisJCWlmIChzLT5idXN5KSB7CisJCQlEUFJJTlRLKCJzdWJkZXZpY2UgaXMgYnVzeSwgY2Fubm90IHJlc2l6ZSBidWZmZXJcbiIpOworCQkJcmV0dXJuIC1FQlVTWTsKKwkJfQorCQlpZiAoYXN5bmMtPm1tYXBfY291bnQpIHsKKwkJCURQUklOVEsoInN1YmRldmljZSBpcyBtbWFwcGVkLCBjYW5ub3QgcmVzaXplIGJ1ZmZlclxuIik7CisJCQlyZXR1cm4gLUVCVVNZOworCQl9CisKKwkJaWYgKCFhc3luYy0+cHJlYWxsb2NfYnVmKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJLyogbWFrZSBzdXJlIGJ1ZmZlciBpcyBhbiBpbnRlZ3JhbCBudW1iZXIgb2YgcGFnZXMKKwkJICogKHdlIHJvdW5kIHVwKSAqLworCQliYy5zaXplID0gKGJjLnNpemUgKyBQQUdFX1NJWkUgLSAxKSAmIFBBR0VfTUFTSzsKKworCQlyZXQgPSBjb21lZGlfYnVmX2FsbG9jKGRldiwgcywgYmMuc2l6ZSk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKworCQlpZiAocy0+YnVmX2NoYW5nZSkgeworCQkJcmV0ID0gcy0+YnVmX2NoYW5nZShkZXYsIHMsIGJjLnNpemUpOworCQkJaWYgKHJldCA8IDApCisJCQkJcmV0dXJuIHJldDsKKwkJfQorCisJCURQUklOVEsoImNvbWVkaSVpIHN1YmQgJWQgYnVmZmVyIHJlc2l6ZWQgdG8gJWkgYnl0ZXNcbiIsCisJCQlkZXYtPm1pbm9yLCBiYy5zdWJkZXZpY2UsIGFzeW5jLT5wcmVhbGxvY19idWZzeik7CisJfQorCisJYmMuc2l6ZSA9IGFzeW5jLT5wcmVhbGxvY19idWZzejsKKwliYy5tYXhpbXVtX3NpemUgPSBhc3luYy0+bWF4X2J1ZnNpemU7CisKK2NvcHliYWNrOgorCWlmIChjb3B5X3RvX3VzZXIoYXJnLCAmYmMsIHNpemVvZihjb21lZGlfYnVmY29uZmlnKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisJQ09NRURJX0RFVklORk8KKwlkZXZpY2UgaW5mbyBpb2N0bAorCisJYXJnOgorCQlwb2ludGVyIHRvIGRldmluZm8gc3RydWN0dXJlCisKKwlyZWFkczoKKwkJbm9uZQorCisJd3JpdGVzOgorCQlkZXZpbmZvIHN0cnVjdHVyZQorCisqLworc3RhdGljIGludCBkb19kZXZpbmZvX2lvY3RsKGNvbWVkaV9kZXZpY2UgKmRldiwgY29tZWRpX2RldmluZm8gKmFyZywKKwkJCSAgICBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwljb21lZGlfZGV2aW5mbyBkZXZpbmZvOworCWNvbnN0IHVuc2lnbmVkIG1pbm9yID0gaW1pbm9yKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlKTsKKwlzdHJ1Y3QgY29tZWRpX2RldmljZV9maWxlX2luZm8gKmRldl9maWxlX2luZm8gPQorCSAgICBjb21lZGlfZ2V0X2RldmljZV9maWxlX2luZm8obWlub3IpOworCWNvbWVkaV9zdWJkZXZpY2UgKnJlYWRfc3ViZGV2ID0KKwkgICAgY29tZWRpX2dldF9yZWFkX3N1YmRldmljZShkZXZfZmlsZV9pbmZvKTsKKwljb21lZGlfc3ViZGV2aWNlICp3cml0ZV9zdWJkZXYgPQorCSAgICBjb21lZGlfZ2V0X3dyaXRlX3N1YmRldmljZShkZXZfZmlsZV9pbmZvKTsKKworCW1lbXNldCgmZGV2aW5mbywgMCwgc2l6ZW9mKGRldmluZm8pKTsKKworCS8qIGZpbGwgZGV2aW5mbyBzdHJ1Y3R1cmUgKi8KKwlkZXZpbmZvLnZlcnNpb25fY29kZSA9IENPTUVESV9WRVJTSU9OX0NPREU7CisJZGV2aW5mby5uX3N1YmRldnMgPSBkZXYtPm5fc3ViZGV2aWNlczsKKwltZW1jcHkoZGV2aW5mby5kcml2ZXJfbmFtZSwgZGV2LT5kcml2ZXItPmRyaXZlcl9uYW1lLCBDT01FRElfTkFNRUxFTik7CisJbWVtY3B5KGRldmluZm8uYm9hcmRfbmFtZSwgZGV2LT5ib2FyZF9uYW1lLCBDT01FRElfTkFNRUxFTik7CisKKwlpZiAocmVhZF9zdWJkZXYpCisJCWRldmluZm8ucmVhZF9zdWJkZXZpY2UgPSByZWFkX3N1YmRldiAtIGRldi0+c3ViZGV2aWNlczsKKwllbHNlCisJCWRldmluZm8ucmVhZF9zdWJkZXZpY2UgPSAtMTsKKworCWlmICh3cml0ZV9zdWJkZXYpCisJCWRldmluZm8ud3JpdGVfc3ViZGV2aWNlID0gd3JpdGVfc3ViZGV2IC0gZGV2LT5zdWJkZXZpY2VzOworCWVsc2UKKwkJZGV2aW5mby53cml0ZV9zdWJkZXZpY2UgPSAtMTsKKworCWlmIChjb3B5X3RvX3VzZXIoYXJnLCAmZGV2aW5mbywgc2l6ZW9mKGNvbWVkaV9kZXZpbmZvKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisJQ09NRURJX1NVQkRJTkZPCisJc3ViZGV2aWNlIGluZm8gaW9jdGwKKworCWFyZzoKKwkJcG9pbnRlciB0byBhcnJheSBvZiBzdWJkZXZpY2UgaW5mbyBzdHJ1Y3R1cmVzCisKKwlyZWFkczoKKwkJbm9uZQorCisJd3JpdGVzOgorCQlhcnJheSBvZiBzdWJkZXZpY2UgaW5mbyBzdHJ1Y3R1cmVzIGF0IGFyZworCisqLworc3RhdGljIGludCBkb19zdWJkaW5mb19pb2N0bChjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9zdWJkaW5mbyAqYXJnLAorCQkJICAgICB2b2lkICpmaWxlKQoreworCWludCByZXQsIGk7CisJY29tZWRpX3N1YmRpbmZvICp0bXAsICp1czsKKwljb21lZGlfc3ViZGV2aWNlICpzOworCisJdG1wID0ga2NhbGxvYyhkZXYtPm5fc3ViZGV2aWNlcywgc2l6ZW9mKGNvbWVkaV9zdWJkaW5mbyksIEdGUF9LRVJORUwpOworCWlmICghdG1wKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIGZpbGwgc3ViZGluZm8gc3RydWN0cyAqLworCWZvciAoaSA9IDA7IGkgPCBkZXYtPm5fc3ViZGV2aWNlczsgaSsrKSB7CisJCXMgPSBkZXYtPnN1YmRldmljZXMgKyBpOworCQl1cyA9IHRtcCArIGk7CisKKwkJdXMtPnR5cGUgPSBzLT50eXBlOworCQl1cy0+bl9jaGFuID0gcy0+bl9jaGFuOworCQl1cy0+c3ViZF9mbGFncyA9IHMtPnN1YmRldl9mbGFnczsKKwkJaWYgKGNvbWVkaV9nZXRfc3ViZGV2aWNlX3J1bmZsYWdzKHMpICYgU1JGX1JVTk5JTkcpCisJCQl1cy0+c3ViZF9mbGFncyB8PSBTREZfUlVOTklORzsKKyNkZWZpbmUgVElNRVJfbmFub3NlYyA1CQkvKiBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSAqLworCQl1cy0+dGltZXJfdHlwZSA9IFRJTUVSX25hbm9zZWM7CisJCXVzLT5sZW5fY2hhbmxpc3QgPSBzLT5sZW5fY2hhbmxpc3Q7CisJCXVzLT5tYXhkYXRhID0gcy0+bWF4ZGF0YTsKKwkJaWYgKHMtPnJhbmdlX3RhYmxlKSB7CisJCQl1cy0+cmFuZ2VfdHlwZSA9CisJCQkgICAgKGkgPDwgMjQpIHwgKDAgPDwgMTYpIHwgKHMtPnJhbmdlX3RhYmxlLT5sZW5ndGgpOworCQl9IGVsc2UgeworCQkJdXMtPnJhbmdlX3R5cGUgPSAwOwkvKiBYWFggKi8KKwkJfQorCQl1cy0+ZmxhZ3MgPSBzLT5mbGFnczsKKworCQlpZiAocy0+YnVzeSkKKwkJCXVzLT5zdWJkX2ZsYWdzIHw9IFNERl9CVVNZOworCQlpZiAocy0+YnVzeSA9PSBmaWxlKQorCQkJdXMtPnN1YmRfZmxhZ3MgfD0gU0RGX0JVU1lfT1dORVI7CisJCWlmIChzLT5sb2NrKQorCQkJdXMtPnN1YmRfZmxhZ3MgfD0gU0RGX0xPQ0tFRDsKKwkJaWYgKHMtPmxvY2sgPT0gZmlsZSkKKwkJCXVzLT5zdWJkX2ZsYWdzIHw9IFNERl9MT0NLX09XTkVSOworCQlpZiAoIXMtPm1heGRhdGEgJiYgcy0+bWF4ZGF0YV9saXN0KQorCQkJdXMtPnN1YmRfZmxhZ3MgfD0gU0RGX01BWERBVEE7CisJCWlmIChzLT5mbGFnbGlzdCkKKwkJCXVzLT5zdWJkX2ZsYWdzIHw9IFNERl9GTEFHUzsKKwkJaWYgKHMtPnJhbmdlX3RhYmxlX2xpc3QpCisJCQl1cy0+c3ViZF9mbGFncyB8PSBTREZfUkFOR0VUWVBFOworCQlpZiAocy0+ZG9fY21kKQorCQkJdXMtPnN1YmRfZmxhZ3MgfD0gU0RGX0NNRDsKKworCQlpZiAocy0+aW5zbl9iaXRzICE9ICZpbnNuX2ludmFsKQorCQkJdXMtPmluc25fYml0c19zdXBwb3J0ID0gQ09NRURJX1NVUFBPUlRFRDsKKwkJZWxzZQorCQkJdXMtPmluc25fYml0c19zdXBwb3J0ID0gQ09NRURJX1VOU1VQUE9SVEVEOworCisJCXVzLT5zZXR0bGluZ190aW1lXzAgPSBzLT5zZXR0bGluZ190aW1lXzA7CisJfQorCisJcmV0ID0gY29weV90b191c2VyKGFyZywgdG1wLAorCQkJICAgZGV2LT5uX3N1YmRldmljZXMgKiBzaXplb2YoY29tZWRpX3N1YmRpbmZvKSk7CisKKwlrZnJlZSh0bXApOworCisJcmV0dXJuIHJldCA/IC1FRkFVTFQgOiAwOworfQorCisvKgorCUNPTUVESV9DSEFOSU5GTworCXN1YmRldmljZSBpbmZvIGlvY3RsCisKKwlhcmc6CisJCXBvaW50ZXIgdG8gY2hhbmluZm8gc3RydWN0dXJlCisKKwlyZWFkczoKKwkJY2hhbmluZm8gc3RydWN0dXJlIGF0IGFyZworCisJd3JpdGVzOgorCQlhcnJheXMgYXQgZWxlbWVudHMgb2YgY2hhbmluZm8gc3RydWN0dXJlCisKKyovCitzdGF0aWMgaW50IGRvX2NoYW5pbmZvX2lvY3RsKGNvbWVkaV9kZXZpY2UgKmRldiwgY29tZWRpX2NoYW5pbmZvICphcmcpCit7CisJY29tZWRpX3N1YmRldmljZSAqczsKKwljb21lZGlfY2hhbmluZm8gaXQ7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJml0LCBhcmcsIHNpemVvZihjb21lZGlfY2hhbmluZm8pKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoaXQuc3ViZGV2ID49IGRldi0+bl9zdWJkZXZpY2VzKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlzID0gZGV2LT5zdWJkZXZpY2VzICsgaXQuc3ViZGV2OworCisJaWYgKGl0Lm1heGRhdGFfbGlzdCkgeworCQlpZiAocy0+bWF4ZGF0YSB8fCAhcy0+bWF4ZGF0YV9saXN0KQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmIChjb3B5X3RvX3VzZXIoaXQubWF4ZGF0YV9saXN0LCBzLT5tYXhkYXRhX2xpc3QsCisJCQkJIHMtPm5fY2hhbiAqIHNpemVvZihsc2FtcGxfdCkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJaWYgKGl0LmZsYWdsaXN0KSB7CisJCWlmICghcy0+ZmxhZ2xpc3QpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKGNvcHlfdG9fdXNlcihpdC5mbGFnbGlzdCwgcy0+ZmxhZ2xpc3QsCisJCQkJIHMtPm5fY2hhbiAqIHNpemVvZih1bnNpZ25lZCBpbnQpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCX0KKworCWlmIChpdC5yYW5nZWxpc3QpIHsKKwkJaW50IGk7CisKKwkJaWYgKCFzLT5yYW5nZV90YWJsZV9saXN0KQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWZvciAoaSA9IDA7IGkgPCBzLT5uX2NoYW47IGkrKykgeworCQkJaW50IHg7CisKKwkJCXggPSAoZGV2LT5taW5vciA8PCAyOCkgfCAoaXQuc3ViZGV2IDw8IDI0KSB8IChpIDw8IDE2KSB8CisJCQkgICAgKHMtPnJhbmdlX3RhYmxlX2xpc3RbaV0tPmxlbmd0aCk7CisJCQlwdXRfdXNlcih4LCBpdC5yYW5nZWxpc3QgKyBpKTsKKwkJfQorI2lmIDAKKwkJaWYgKGNvcHlfdG9fdXNlcihpdC5yYW5nZWxpc3QsIHMtPnJhbmdlX3R5cGVfbGlzdCwKKwkJCQkgcy0+bl9jaGFuKnNpemVvZih1bnNpZ25lZCBpbnQpKSkKKwkJCXJldHVybiAtRUZBVUxUOworI2VuZGlmCisJfQorCisJcmV0dXJuIDA7Cit9CisKKyAvKgorICAgIENPTUVESV9CVUZJTkZPCisgICAgYnVmZmVyIGluZm9ybWF0aW9uIGlvY3RsCisKKyAgICBhcmc6CisgICAgcG9pbnRlciB0byBidWZpbmZvIHN0cnVjdHVyZQorCisgICAgcmVhZHM6CisgICAgYnVmaW5mbyBhdCBhcmcKKworICAgIHdyaXRlczoKKyAgICBtb2RpZmllZCBidWZpbmZvIGF0IGFyZworCisgICovCitzdGF0aWMgaW50IGRvX2J1ZmluZm9faW9jdGwoY29tZWRpX2RldmljZSAqZGV2LCB2b2lkICphcmcpCit7CisJY29tZWRpX2J1ZmluZm8gYmk7CisJY29tZWRpX3N1YmRldmljZSAqczsKKwljb21lZGlfYXN5bmMgKmFzeW5jOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZiaSwgYXJnLCBzaXplb2YoY29tZWRpX2J1ZmluZm8pKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoYmkuc3ViZGV2aWNlID49IGRldi0+bl9zdWJkZXZpY2VzIHx8IGJpLnN1YmRldmljZSA8IDApCisJCXJldHVybiAtRUlOVkFMOworCisJcyA9IGRldi0+c3ViZGV2aWNlcyArIGJpLnN1YmRldmljZTsKKwlhc3luYyA9IHMtPmFzeW5jOworCisJaWYgKCFhc3luYykgeworCQlEUFJJTlRLKCJzdWJkZXZpY2UgZG9lcyBub3QgaGF2ZSBhc3luYyBjYXBhYmlsaXR5XG4iKTsKKwkJYmkuYnVmX3dyaXRlX3B0ciA9IDA7CisJCWJpLmJ1Zl9yZWFkX3B0ciA9IDA7CisJCWJpLmJ1Zl93cml0ZV9jb3VudCA9IDA7CisJCWJpLmJ1Zl9yZWFkX2NvdW50ID0gMDsKKwkJZ290byBjb3B5YmFjazsKKwl9CisKKwlpZiAoYmkuYnl0ZXNfcmVhZCAmJiAocy0+c3ViZGV2X2ZsYWdzICYgU0RGX0NNRF9SRUFEKSkgeworCQliaS5ieXRlc19yZWFkID0gY29tZWRpX2J1Zl9yZWFkX2FsbG9jKGFzeW5jLCBiaS5ieXRlc19yZWFkKTsKKwkJY29tZWRpX2J1Zl9yZWFkX2ZyZWUoYXN5bmMsIGJpLmJ5dGVzX3JlYWQpOworCisJCWlmICghKGNvbWVkaV9nZXRfc3ViZGV2aWNlX3J1bmZsYWdzKHMpICYgKFNSRl9FUlJPUiB8CisJCQkJCQkJICBTUkZfUlVOTklORykpCisJCSAgICAmJiBhc3luYy0+YnVmX3dyaXRlX2NvdW50ID09IGFzeW5jLT5idWZfcmVhZF9jb3VudCkgeworCQkJZG9fYmVjb21lX25vbmJ1c3koZGV2LCBzKTsKKwkJfQorCX0KKworCWlmIChiaS5ieXRlc193cml0dGVuICYmIChzLT5zdWJkZXZfZmxhZ3MgJiBTREZfQ01EX1dSSVRFKSkgeworCQliaS5ieXRlc193cml0dGVuID0KKwkJICAgIGNvbWVkaV9idWZfd3JpdGVfYWxsb2MoYXN5bmMsIGJpLmJ5dGVzX3dyaXR0ZW4pOworCQljb21lZGlfYnVmX3dyaXRlX2ZyZWUoYXN5bmMsIGJpLmJ5dGVzX3dyaXR0ZW4pOworCX0KKworCWJpLmJ1Zl93cml0ZV9jb3VudCA9IGFzeW5jLT5idWZfd3JpdGVfY291bnQ7CisJYmkuYnVmX3dyaXRlX3B0ciA9IGFzeW5jLT5idWZfd3JpdGVfcHRyOworCWJpLmJ1Zl9yZWFkX2NvdW50ID0gYXN5bmMtPmJ1Zl9yZWFkX2NvdW50OworCWJpLmJ1Zl9yZWFkX3B0ciA9IGFzeW5jLT5idWZfcmVhZF9wdHI7CisKK2NvcHliYWNrOgorCWlmIChjb3B5X3RvX3VzZXIoYXJnLCAmYmksIHNpemVvZihjb21lZGlfYnVmaW5mbykpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBhcnNlX2luc24oY29tZWRpX2RldmljZSAqZGV2LCBjb21lZGlfaW5zbiAqaW5zbiwgbHNhbXBsX3QgKmRhdGEsCisJCSAgICAgIHZvaWQgKmZpbGUpOworLyoKKyAqIAlDT01FRElfSU5TTkxJU1QKKyAqIAlzeW5jaHJvbm91cyBpbnN0cnVjdGlvbnMKKyAqCisgKiAJYXJnOgorICogCQlwb2ludGVyIHRvIHN5bmMgY21kIHN0cnVjdHVyZQorICoKKyAqIAlyZWFkczoKKyAqIAkJc3luYyBjbWQgc3RydWN0IGF0IGFyZworICogCQlpbnN0cnVjdGlvbiBsaXN0CisgKiAJCWRhdGEgKGZvciB3cml0ZXMpCisgKgorICogCXdyaXRlczoKKyAqIAkJZGF0YSAoZm9yIHJlYWRzKQorICovCisvKiBhcmJpdHJhcnkgbGltaXRzICovCisjZGVmaW5lIE1BWF9TQU1QTEVTIDI1Ngorc3RhdGljIGludCBkb19pbnNubGlzdF9pb2N0bChjb21lZGlfZGV2aWNlICpkZXYsIHZvaWQgKmFyZywgdm9pZCAqZmlsZSkKK3sKKwljb21lZGlfaW5zbmxpc3QgaW5zbmxpc3Q7CisJY29tZWRpX2luc24gKmluc25zID0gTlVMTDsKKwlsc2FtcGxfdCAqZGF0YSA9IE5VTEw7CisJaW50IGkgPSAwOworCWludCByZXQgPSAwOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZpbnNubGlzdCwgYXJnLCBzaXplb2YoY29tZWRpX2luc25saXN0KSkpCisJCXJldHVybiAtRUZBVUxUOworCisJZGF0YSA9IGttYWxsb2Moc2l6ZW9mKGxzYW1wbF90KSAqIE1BWF9TQU1QTEVTLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRhdGEpIHsKKwkJRFBSSU5USygia21hbGxvYyBmYWlsZWRcbiIpOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yOworCX0KKworCWluc25zID0ga21hbGxvYyhzaXplb2YoY29tZWRpX2luc24pICogaW5zbmxpc3Qubl9pbnNucywgR0ZQX0tFUk5FTCk7CisJaWYgKCFpbnNucykgeworCQlEUFJJTlRLKCJrbWFsbG9jIGZhaWxlZFxuIik7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3I7CisJfQorCisJaWYgKGNvcHlfZnJvbV91c2VyKGluc25zLCBpbnNubGlzdC5pbnNucywKKwkJCSAgIHNpemVvZihjb21lZGlfaW5zbikgKiBpbnNubGlzdC5uX2luc25zKSkgeworCQlEUFJJTlRLKCJjb3B5X2Zyb21fdXNlciBmYWlsZWRcbiIpOworCQlyZXQgPSAtRUZBVUxUOworCQlnb3RvIGVycm9yOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBpbnNubGlzdC5uX2luc25zOyBpKyspIHsKKwkJaWYgKGluc25zW2ldLm4gPiBNQVhfU0FNUExFUykgeworCQkJRFBSSU5USygibnVtYmVyIG9mIHNhbXBsZXMgdG9vIGxhcmdlXG4iKTsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIGVycm9yOworCQl9CisJCWlmIChpbnNuc1tpXS5pbnNuICYgSU5TTl9NQVNLX1dSSVRFKSB7CisJCQlpZiAoY29weV9mcm9tX3VzZXIoZGF0YSwgaW5zbnNbaV0uZGF0YSwKKwkJCQkJICAgaW5zbnNbaV0ubiAqIHNpemVvZihsc2FtcGxfdCkpKSB7CisJCQkJRFBSSU5USygiY29weV9mcm9tX3VzZXIgZmFpbGVkXG4iKTsKKwkJCQlyZXQgPSAtRUZBVUxUOworCQkJCWdvdG8gZXJyb3I7CisJCQl9CisJCX0KKwkJcmV0ID0gcGFyc2VfaW5zbihkZXYsIGluc25zICsgaSwgZGF0YSwgZmlsZSk7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBlcnJvcjsKKwkJaWYgKGluc25zW2ldLmluc24gJiBJTlNOX01BU0tfUkVBRCkgeworCQkJaWYgKGNvcHlfdG9fdXNlcihpbnNuc1tpXS5kYXRhLCBkYXRhLAorCQkJCQkgaW5zbnNbaV0ubiAqIHNpemVvZihsc2FtcGxfdCkpKSB7CisJCQkJRFBSSU5USygiY29weV90b191c2VyIGZhaWxlZFxuIik7CisJCQkJcmV0ID0gLUVGQVVMVDsKKwkJCQlnb3RvIGVycm9yOworCQkJfQorCQl9CisJCWlmIChuZWVkX3Jlc2NoZWQoKSkKKwkJCXNjaGVkdWxlKCk7CisJfQorCitlcnJvcjoKKwlrZnJlZShpbnNucyk7CisJa2ZyZWUoZGF0YSk7CisKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwlyZXR1cm4gaTsKK30KKworc3RhdGljIGludCBjaGVja19pbnNuX2NvbmZpZ19sZW5ndGgoY29tZWRpX2luc24gKmluc24sIGxzYW1wbF90ICpkYXRhKQoreworCWlmIChpbnNuLT5uIDwgMSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzd2l0Y2ggKGRhdGFbMF0pIHsKKwljYXNlIElOU05fQ09ORklHX0RJT19PVVRQVVQ6CisJY2FzZSBJTlNOX0NPTkZJR19ESU9fSU5QVVQ6CisJY2FzZSBJTlNOX0NPTkZJR19ESVNBUk06CisJY2FzZSBJTlNOX0NPTkZJR19SRVNFVDoKKwkJaWYgKGluc24tPm4gPT0gMSkKKwkJCXJldHVybiAwOworCQlicmVhazsKKwljYXNlIElOU05fQ09ORklHX0FSTToKKwljYXNlIElOU05fQ09ORklHX0RJT19RVUVSWToKKwljYXNlIElOU05fQ09ORklHX0JMT0NLX1NJWkU6CisJY2FzZSBJTlNOX0NPTkZJR19GSUxURVI6CisJY2FzZSBJTlNOX0NPTkZJR19TRVJJQUxfQ0xPQ0s6CisJY2FzZSBJTlNOX0NPTkZJR19CSURJUkVDVElPTkFMX0RBVEE6CisJY2FzZSBJTlNOX0NPTkZJR19BTFRfU09VUkNFOgorCWNhc2UgSU5TTl9DT05GSUdfU0VUX0NPVU5URVJfTU9ERToKKwljYXNlIElOU05fQ09ORklHXzgyNTRfUkVBRF9TVEFUVVM6CisJY2FzZSBJTlNOX0NPTkZJR19TRVRfUk9VVElORzoKKwljYXNlIElOU05fQ09ORklHX0dFVF9ST1VUSU5HOgorCWNhc2UgSU5TTl9DT05GSUdfR0VUX1BXTV9TVEFUVVM6CisJY2FzZSBJTlNOX0NPTkZJR19QV01fU0VUX1BFUklPRDoKKwljYXNlIElOU05fQ09ORklHX1BXTV9HRVRfUEVSSU9EOgorCQlpZiAoaW5zbi0+biA9PSAyKQorCQkJcmV0dXJuIDA7CisJCWJyZWFrOworCWNhc2UgSU5TTl9DT05GSUdfU0VUX0dBVEVfU1JDOgorCWNhc2UgSU5TTl9DT05GSUdfR0VUX0dBVEVfU1JDOgorCWNhc2UgSU5TTl9DT05GSUdfU0VUX0NMT0NLX1NSQzoKKwljYXNlIElOU05fQ09ORklHX0dFVF9DTE9DS19TUkM6CisJY2FzZSBJTlNOX0NPTkZJR19TRVRfT1RIRVJfU1JDOgorCWNhc2UgSU5TTl9DT05GSUdfR0VUX0NPVU5URVJfU1RBVFVTOgorCWNhc2UgSU5TTl9DT05GSUdfUFdNX1NFVF9IX0JSSURHRToKKwljYXNlIElOU05fQ09ORklHX1BXTV9HRVRfSF9CUklER0U6CisJY2FzZSBJTlNOX0NPTkZJR19HRVRfSEFSRFdBUkVfQlVGRkVSX1NJWkU6CisJCWlmIChpbnNuLT5uID09IDMpCisJCQlyZXR1cm4gMDsKKwkJYnJlYWs7CisJY2FzZSBJTlNOX0NPTkZJR19QV01fT1VUUFVUOgorCWNhc2UgSU5TTl9DT05GSUdfQU5BTE9HX1RSSUc6CisJCWlmIChpbnNuLT5uID09IDUpCisJCQlyZXR1cm4gMDsKKwkJYnJlYWs7CisJLyogYnkgZGVmYXVsdCB3ZSBhbGxvdyB0aGUgaW5zbiBzaW5jZSB3ZSBkb24ndCBoYXZlIGNoZWNrcyBmb3IKKwkgKiBhbGwgcG9zc2libGUgY2FzZXMgeWV0ICovCisJZGVmYXVsdDoKKwkJcnRfcHJpbnRrKCJjb21lZGk6IG5vIGNoZWNrIGZvciBkYXRhIGxlbmd0aCBvZiBjb25maWcgaW5zbiBpZCAiCisJCQkgICIlaSBpcyBpbXBsZW1lbnRlZC5cbiIKKwkJCSAgIiBBZGQgYSBjaGVjayB0byAlcyBpbiAlcy5cbiIKKwkJCSAgIiBBc3N1bWluZyBuPSVpIGlzIGNvcnJlY3QuXG4iLCBkYXRhWzBdLCBfX2Z1bmNfXywKKwkJCSAgX19GSUxFX18sIGluc24tPm4pOworCQlyZXR1cm4gMDsKKwkJYnJlYWs7CisJfQorCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50IHBhcnNlX2luc24oY29tZWRpX2RldmljZSAqZGV2LCBjb21lZGlfaW5zbiAqaW5zbiwgbHNhbXBsX3QgKmRhdGEsCisJCSAgICAgIHZvaWQgKmZpbGUpCit7CisJY29tZWRpX3N1YmRldmljZSAqczsKKwlpbnQgcmV0ID0gMDsKKwlpbnQgaTsKKworCWlmIChpbnNuLT5pbnNuICYgSU5TTl9NQVNLX1NQRUNJQUwpIHsKKwkJLyogYSBub24tc3ViZGV2aWNlIGluc3RydWN0aW9uICovCisKKwkJc3dpdGNoIChpbnNuLT5pbnNuKSB7CisJCWNhc2UgSU5TTl9HVE9EOgorCQkJeworCQkJCXN0cnVjdCB0aW1ldmFsIHR2OworCisJCQkJaWYgKGluc24tPm4gIT0gMikgeworCQkJCQlyZXQgPSAtRUlOVkFMOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQlkb19nZXR0aW1lb2ZkYXkoJnR2KTsKKwkJCQlkYXRhWzBdID0gdHYudHZfc2VjOworCQkJCWRhdGFbMV0gPSB0di50dl91c2VjOworCQkJCXJldCA9IDI7CisKKwkJCQlicmVhazsKKwkJCX0KKwkJY2FzZSBJTlNOX1dBSVQ6CisJCQlpZiAoaW5zbi0+biAhPSAxIHx8IGRhdGFbMF0gPj0gMTAwMDAwKSB7CisJCQkJcmV0ID0gLUVJTlZBTDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXVkZWxheShkYXRhWzBdIC8gMTAwMCk7CisJCQlyZXQgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgSU5TTl9JTlRUUklHOgorCQkJaWYgKGluc24tPm4gIT0gMSkgeworCQkJCXJldCA9IC1FSU5WQUw7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoaW5zbi0+c3ViZGV2ID49IGRldi0+bl9zdWJkZXZpY2VzKSB7CisJCQkJRFBSSU5USygiJWQgbm90IHVzYWJsZSBzdWJkZXZpY2VcbiIsCisJCQkJCWluc24tPnN1YmRldik7CisJCQkJcmV0ID0gLUVJTlZBTDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXMgPSBkZXYtPnN1YmRldmljZXMgKyBpbnNuLT5zdWJkZXY7CisJCQlpZiAoIXMtPmFzeW5jKSB7CisJCQkJRFBSSU5USygibm8gYXN5bmNcbiIpOworCQkJCXJldCA9IC1FSU5WQUw7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoIXMtPmFzeW5jLT5pbnR0cmlnKSB7CisJCQkJRFBSSU5USygibm8gaW50dHJpZ1xuIik7CisJCQkJcmV0ID0gLUVBR0FJTjsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXJldCA9IHMtPmFzeW5jLT5pbnR0cmlnKGRldiwgcywgaW5zbi0+ZGF0YVswXSk7CisJCQlpZiAocmV0ID49IDApCisJCQkJcmV0ID0gMTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJRFBSSU5USygiaW52YWxpZCBpbnNuXG4iKTsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQorCX0gZWxzZSB7CisJCS8qIGEgc3ViZGV2aWNlIGluc3RydWN0aW9uICovCisJCWxzYW1wbF90IG1heGRhdGE7CisKKwkJaWYgKGluc24tPnN1YmRldiA+PSBkZXYtPm5fc3ViZGV2aWNlcykgeworCQkJRFBSSU5USygic3ViZGV2aWNlICVkIG91dCBvZiByYW5nZVxuIiwgaW5zbi0+c3ViZGV2KTsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIG91dDsKKwkJfQorCQlzID0gZGV2LT5zdWJkZXZpY2VzICsgaW5zbi0+c3ViZGV2OworCisJCWlmIChzLT50eXBlID09IENPTUVESV9TVUJEX1VOVVNFRCkgeworCQkJRFBSSU5USygiJWQgbm90IHVzYWJsZSBzdWJkZXZpY2VcbiIsIGluc24tPnN1YmRldik7CisJCQlyZXQgPSAtRUlPOworCQkJZ290byBvdXQ7CisJCX0KKworCQkvKiBhcmUgd2UgbG9ja2VkPyAoaW9jdGwgbG9jaykgKi8KKwkJaWYgKHMtPmxvY2sgJiYgcy0+bG9jayAhPSBmaWxlKSB7CisJCQlEUFJJTlRLKCJkZXZpY2UgbG9ja2VkXG4iKTsKKwkJCXJldCA9IC1FQUNDRVM7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCXJldCA9IGNoZWNrX2NoYW5saXN0KHMsIDEsICZpbnNuLT5jaGFuc3BlYyk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJRFBSSU5USygiYmFkIGNoYW5zcGVjXG4iKTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJaWYgKHMtPmJ1c3kpIHsKKwkJCXJldCA9IC1FQlVTWTsKKwkJCWdvdG8gb3V0OworCQl9CisJCS8qIFRoaXMgbG9va3MgYXJiaXRyYXJ5LiAgSXQgaXMuICovCisJCXMtPmJ1c3kgPSAmcGFyc2VfaW5zbjsKKwkJc3dpdGNoIChpbnNuLT5pbnNuKSB7CisJCWNhc2UgSU5TTl9SRUFEOgorCQkJcmV0ID0gcy0+aW5zbl9yZWFkKGRldiwgcywgaW5zbiwgZGF0YSk7CisJCQlicmVhazsKKwkJY2FzZSBJTlNOX1dSSVRFOgorCQkJbWF4ZGF0YSA9IHMtPm1heGRhdGFfbGlzdAorCQkJICAgID8gcy0+bWF4ZGF0YV9saXN0W0NSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpXQorCQkJICAgIDogcy0+bWF4ZGF0YTsKKwkJCWZvciAoaSA9IDA7IGkgPCBpbnNuLT5uOyArK2kpIHsKKwkJCQlpZiAoZGF0YVtpXSA+IG1heGRhdGEpIHsKKwkJCQkJcmV0ID0gLUVJTlZBTDsKKwkJCQkJRFBSSU5USygiYmFkIGRhdGEgdmFsdWUocylcbiIpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQlpZiAocmV0ID09IDApCisJCQkJcmV0ID0gcy0+aW5zbl93cml0ZShkZXYsIHMsIGluc24sIGRhdGEpOworCQkJYnJlYWs7CisJCWNhc2UgSU5TTl9CSVRTOgorCQkJaWYgKGluc24tPm4gIT0gMikgeworCQkJCXJldCA9IC1FSU5WQUw7CisJCQkJYnJlYWs7CisJCQl9CisJCQlyZXQgPSBzLT5pbnNuX2JpdHMoZGV2LCBzLCBpbnNuLCBkYXRhKTsKKwkJCWJyZWFrOworCQljYXNlIElOU05fQ09ORklHOgorCQkJcmV0ID0gY2hlY2tfaW5zbl9jb25maWdfbGVuZ3RoKGluc24sIGRhdGEpOworCQkJaWYgKHJldCkKKwkJCQlicmVhazsKKwkJCXJldCA9IHMtPmluc25fY29uZmlnKGRldiwgcywgaW5zbiwgZGF0YSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQorCisJCXMtPmJ1c3kgPSBOVUxMOworCX0KKworb3V0OgorCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiAJQ09NRURJX0lOU04KKyAqIAlzeW5jaHJvbm91cyBpbnN0cnVjdGlvbnMKKyAqCisgKiAJYXJnOgorICogCQlwb2ludGVyIHRvIGluc24KKyAqCisgKiAJcmVhZHM6CisgKiAJCWNvbWVkaV9pbnNuIHN0cnVjdCBhdCBhcmcKKyAqIAkJZGF0YSAoZm9yIHdyaXRlcykKKyAqCisgKiAJd3JpdGVzOgorICogCQlkYXRhIChmb3IgcmVhZHMpCisgKi8KK3N0YXRpYyBpbnQgZG9faW5zbl9pb2N0bChjb21lZGlfZGV2aWNlICpkZXYsIHZvaWQgKmFyZywgdm9pZCAqZmlsZSkKK3sKKwljb21lZGlfaW5zbiBpbnNuOworCWxzYW1wbF90ICpkYXRhID0gTlVMTDsKKwlpbnQgcmV0ID0gMDsKKworCWRhdGEgPSBrbWFsbG9jKHNpemVvZihsc2FtcGxfdCkgKiBNQVhfU0FNUExFUywgR0ZQX0tFUk5FTCk7CisJaWYgKCFkYXRhKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3I7CisJfQorCisJaWYgKGNvcHlfZnJvbV91c2VyKCZpbnNuLCBhcmcsIHNpemVvZihjb21lZGlfaW5zbikpKSB7CisJCXJldCA9IC1FRkFVTFQ7CisJCWdvdG8gZXJyb3I7CisJfQorCisJLyogVGhpcyBpcyB3aGVyZSB0aGUgYmVoYXZpb3Igb2YgaW5zbiBhbmQgaW5zbmxpc3QgZGV2aWF0ZS4gKi8KKwlpZiAoaW5zbi5uID4gTUFYX1NBTVBMRVMpCisJCWluc24ubiA9IE1BWF9TQU1QTEVTOworCWlmIChpbnNuLmluc24gJiBJTlNOX01BU0tfV1JJVEUpIHsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKGRhdGEsIGluc24uZGF0YSwgaW5zbi5uICogc2l6ZW9mKGxzYW1wbF90KSkpIHsKKwkJCXJldCA9IC1FRkFVTFQ7CisJCQlnb3RvIGVycm9yOworCQl9CisJfQorCXJldCA9IHBhcnNlX2luc24oZGV2LCAmaW5zbiwgZGF0YSwgZmlsZSk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyb3I7CisJaWYgKGluc24uaW5zbiAmIElOU05fTUFTS19SRUFEKSB7CisJCWlmIChjb3B5X3RvX3VzZXIoaW5zbi5kYXRhLCBkYXRhLCBpbnNuLm4gKiBzaXplb2YobHNhbXBsX3QpKSkgeworCQkJcmV0ID0gLUVGQVVMVDsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKwl9CisJcmV0ID0gaW5zbi5uOworCitlcnJvcjoKKwlrZnJlZShkYXRhKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qCisJQ09NRURJX0NNRAorCWNvbW1hbmQgaW9jdGwKKworCWFyZzoKKwkJcG9pbnRlciB0byBjbWQgc3RydWN0dXJlCisKKwlyZWFkczoKKwkJY21kIHN0cnVjdHVyZSBhdCBhcmcKKwkJY2hhbm5lbC9yYW5nZSBsaXN0CisKKwl3cml0ZXM6CisJCW1vZGlmaWVkIGNtZCBzdHJ1Y3R1cmUgYXQgYXJnCisKKyovCitzdGF0aWMgaW50IGRvX2NtZF9pb2N0bChjb21lZGlfZGV2aWNlICpkZXYsIHZvaWQgKmFyZywgdm9pZCAqZmlsZSkKK3sKKwljb21lZGlfY21kIHVzZXJfY21kOworCWNvbWVkaV9zdWJkZXZpY2UgKnM7CisJY29tZWRpX2FzeW5jICphc3luYzsKKwlpbnQgcmV0ID0gMDsKKwl1bnNpZ25lZCBpbnQgKmNoYW5saXN0X3NhdmVyID0gTlVMTDsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmdXNlcl9jbWQsIGFyZywgc2l6ZW9mKGNvbWVkaV9jbWQpKSkgeworCQlEUFJJTlRLKCJiYWQgY21kIGFkZHJlc3NcbiIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJLyogc2F2ZSB1c2VyJ3MgY2hhbmxpc3QgcG9pbnRlciBzbyBpdCBjYW4gYmUgcmVzdG9yZWQgbGF0ZXIgKi8KKwljaGFubGlzdF9zYXZlciA9IHVzZXJfY21kLmNoYW5saXN0OworCisJaWYgKHVzZXJfY21kLnN1YmRldiA+PSBkZXYtPm5fc3ViZGV2aWNlcykgeworCQlEUFJJTlRLKCIlZCBubyBzdWNoIHN1YmRldmljZVxuIiwgdXNlcl9jbWQuc3ViZGV2KTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJcyA9IGRldi0+c3ViZGV2aWNlcyArIHVzZXJfY21kLnN1YmRldjsKKwlhc3luYyA9IHMtPmFzeW5jOworCisJaWYgKHMtPnR5cGUgPT0gQ09NRURJX1NVQkRfVU5VU0VEKSB7CisJCURQUklOVEsoIiVkIG5vdCB2YWxpZCBzdWJkZXZpY2VcbiIsIHVzZXJfY21kLnN1YmRldik7CisJCXJldHVybiAtRUlPOworCX0KKworCWlmICghcy0+ZG9fY21kIHx8ICFzLT5kb19jbWR0ZXN0IHx8ICFzLT5hc3luYykgeworCQlEUFJJTlRLKCJzdWJkZXZpY2UgJWkgZG9lcyBub3Qgc3VwcG9ydCBjb21tYW5kc1xuIiwKKwkJCXVzZXJfY21kLnN1YmRldik7CisJCXJldHVybiAtRUlPOworCX0KKworCS8qIGFyZSB3ZSBsb2NrZWQ/IChpb2N0bCBsb2NrKSAqLworCWlmIChzLT5sb2NrICYmIHMtPmxvY2sgIT0gZmlsZSkgeworCQlEUFJJTlRLKCJzdWJkZXZpY2UgbG9ja2VkXG4iKTsKKwkJcmV0dXJuIC1FQUNDRVM7CisJfQorCisJLyogYXJlIHdlIGJ1c3k/ICovCisJaWYgKHMtPmJ1c3kpIHsKKwkJRFBSSU5USygic3ViZGV2aWNlIGJ1c3lcbiIpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKwlzLT5idXN5ID0gZmlsZTsKKworCS8qIG1ha2Ugc3VyZSBjaGFubmVsL2dhaW4gbGlzdCBpc24ndCB0b28gbG9uZyAqLworCWlmICh1c2VyX2NtZC5jaGFubGlzdF9sZW4gPiBzLT5sZW5fY2hhbmxpc3QpIHsKKwkJRFBSSU5USygiY2hhbm5lbC9nYWluIGxpc3QgdG9vIGxvbmcgJXUgPiAlZFxuIiwKKwkJCXVzZXJfY21kLmNoYW5saXN0X2xlbiwgcy0+bGVuX2NoYW5saXN0KTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBjbGVhbnVwOworCX0KKworCS8qIG1ha2Ugc3VyZSBjaGFubmVsL2dhaW4gbGlzdCBpc24ndCB0b28gc2hvcnQgKi8KKwlpZiAodXNlcl9jbWQuY2hhbmxpc3RfbGVuIDwgMSkgeworCQlEUFJJTlRLKCJjaGFubmVsL2dhaW4gbGlzdCB0b28gc2hvcnQgJXUgPCAxXG4iLAorCQkJdXNlcl9jbWQuY2hhbmxpc3RfbGVuKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBjbGVhbnVwOworCX0KKworCWtmcmVlKGFzeW5jLT5jbWQuY2hhbmxpc3QpOworCWFzeW5jLT5jbWQgPSB1c2VyX2NtZDsKKwlhc3luYy0+Y21kLmRhdGEgPSBOVUxMOworCS8qIGxvYWQgY2hhbm5lbC9nYWluIGxpc3QgKi8KKwlhc3luYy0+Y21kLmNoYW5saXN0ID0KKwkgICAga21hbGxvYyhhc3luYy0+Y21kLmNoYW5saXN0X2xlbiAqIHNpemVvZihpbnQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWFzeW5jLT5jbWQuY2hhbmxpc3QpIHsKKwkJRFBSSU5USygiYWxsb2NhdGlvbiBmYWlsZWRcbiIpOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGNsZWFudXA7CisJfQorCisJaWYgKGNvcHlfZnJvbV91c2VyKGFzeW5jLT5jbWQuY2hhbmxpc3QsIHVzZXJfY21kLmNoYW5saXN0LAorCQkJICAgYXN5bmMtPmNtZC5jaGFubGlzdF9sZW4gKiBzaXplb2YoaW50KSkpIHsKKwkJRFBSSU5USygiZmF1bHQgcmVhZGluZyBjaGFubGlzdFxuIik7CisJCXJldCA9IC1FRkFVTFQ7CisJCWdvdG8gY2xlYW51cDsKKwl9CisKKwkvKiBtYWtlIHN1cmUgZWFjaCBlbGVtZW50IGluIGNoYW5uZWwvZ2FpbiBsaXN0IGlzIHZhbGlkICovCisJcmV0ID0gY2hlY2tfY2hhbmxpc3QocywgYXN5bmMtPmNtZC5jaGFubGlzdF9sZW4sIGFzeW5jLT5jbWQuY2hhbmxpc3QpOworCWlmIChyZXQgPCAwKSB7CisJCURQUklOVEsoImJhZCBjaGFubGlzdFxuIik7CisJCWdvdG8gY2xlYW51cDsKKwl9CisKKwlyZXQgPSBzLT5kb19jbWR0ZXN0KGRldiwgcywgJmFzeW5jLT5jbWQpOworCisJaWYgKGFzeW5jLT5jbWQuZmxhZ3MgJiBUUklHX0JPR1VTIHx8IHJldCkgeworCQlEUFJJTlRLKCJ0ZXN0IHJldHVybmVkICVkXG4iLCByZXQpOworCQl1c2VyX2NtZCA9IGFzeW5jLT5jbWQ7CisJCS8qIHJlc3RvcmUgY2hhbmxpc3QgcG9pbnRlciBiZWZvcmUgY29weWluZyBiYWNrICovCisJCXVzZXJfY21kLmNoYW5saXN0ID0gY2hhbmxpc3Rfc2F2ZXI7CisJCXVzZXJfY21kLmRhdGEgPSBOVUxMOworCQlpZiAoY29weV90b191c2VyKGFyZywgJnVzZXJfY21kLCBzaXplb2YoY29tZWRpX2NtZCkpKSB7CisJCQlEUFJJTlRLKCJmYXVsdCB3cml0aW5nIGNtZFxuIik7CisJCQlyZXQgPSAtRUZBVUxUOworCQkJZ290byBjbGVhbnVwOworCQl9CisJCXJldCA9IC1FQUdBSU47CisJCWdvdG8gY2xlYW51cDsKKwl9CisKKwlpZiAoIWFzeW5jLT5wcmVhbGxvY19idWZzeikgeworCQlyZXQgPSAtRU5PTUVNOworCQlEUFJJTlRLKCJubyBidWZmZXIgKD8pXG4iKTsKKwkJZ290byBjbGVhbnVwOworCX0KKworCWNvbWVkaV9yZXNldF9hc3luY19idWYoYXN5bmMpOworCisJYXN5bmMtPmNiX21hc2sgPQorCSAgICBDT01FRElfQ0JfRU9BIHwgQ09NRURJX0NCX0JMT0NLIHwgQ09NRURJX0NCX0VSUk9SIHwKKwkgICAgQ09NRURJX0NCX09WRVJGTE9XOworCWlmIChhc3luYy0+Y21kLmZsYWdzICYgVFJJR19XQUtFX0VPUykKKwkJYXN5bmMtPmNiX21hc2sgfD0gQ09NRURJX0NCX0VPUzsKKworCWNvbWVkaV9zZXRfc3ViZGV2aWNlX3J1bmZsYWdzKHMsIH4wLCBTUkZfVVNFUiB8IFNSRl9SVU5OSU5HKTsKKworI2lmZGVmIENPTkZJR19DT01FRElfUlQKKwlpZiAoYXN5bmMtPmNtZC5mbGFncyAmIFRSSUdfUlQpIHsKKwkJaWYgKGNvbWVkaV9zd2l0Y2hfdG9fcnQoZGV2KSA9PSAwKQorCQkJY29tZWRpX3NldF9zdWJkZXZpY2VfcnVuZmxhZ3MocywgU1JGX1JULCBTUkZfUlQpOworCX0KKyNlbmRpZgorCisJcmV0ID0gcy0+ZG9fY21kKGRldiwgcyk7CisJaWYgKHJldCA9PSAwKQorCQlyZXR1cm4gMDsKKworY2xlYW51cDoKKwlkb19iZWNvbWVfbm9uYnVzeShkZXYsIHMpOworCisJcmV0dXJuIHJldDsKK30KKworLyoKKwlDT01FRElfQ01EVEVTVAorCWNvbW1hbmQgdGVzdGluZyBpb2N0bAorCisJYXJnOgorCQlwb2ludGVyIHRvIGNtZCBzdHJ1Y3R1cmUKKworCXJlYWRzOgorCQljbWQgc3RydWN0dXJlIGF0IGFyZworCQljaGFubmVsL3JhbmdlIGxpc3QKKworCXdyaXRlczoKKwkJbW9kaWZpZWQgY21kIHN0cnVjdHVyZSBhdCBhcmcKKworKi8KK3N0YXRpYyBpbnQgZG9fY21kdGVzdF9pb2N0bChjb21lZGlfZGV2aWNlICpkZXYsIHZvaWQgKmFyZywgdm9pZCAqZmlsZSkKK3sKKwljb21lZGlfY21kIHVzZXJfY21kOworCWNvbWVkaV9zdWJkZXZpY2UgKnM7CisJaW50IHJldCA9IDA7CisJdW5zaWduZWQgaW50ICpjaGFubGlzdCA9IE5VTEw7CisJdW5zaWduZWQgaW50ICpjaGFubGlzdF9zYXZlciA9IE5VTEw7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJnVzZXJfY21kLCBhcmcsIHNpemVvZihjb21lZGlfY21kKSkpIHsKKwkJRFBSSU5USygiYmFkIGNtZCBhZGRyZXNzXG4iKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCS8qIHNhdmUgdXNlcidzIGNoYW5saXN0IHBvaW50ZXIgc28gaXQgY2FuIGJlIHJlc3RvcmVkIGxhdGVyICovCisJY2hhbmxpc3Rfc2F2ZXIgPSB1c2VyX2NtZC5jaGFubGlzdDsKKworCWlmICh1c2VyX2NtZC5zdWJkZXYgPj0gZGV2LT5uX3N1YmRldmljZXMpIHsKKwkJRFBSSU5USygiJWQgbm8gc3VjaCBzdWJkZXZpY2VcbiIsIHVzZXJfY21kLnN1YmRldik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXMgPSBkZXYtPnN1YmRldmljZXMgKyB1c2VyX2NtZC5zdWJkZXY7CisJaWYgKHMtPnR5cGUgPT0gQ09NRURJX1NVQkRfVU5VU0VEKSB7CisJCURQUklOVEsoIiVkIG5vdCB2YWxpZCBzdWJkZXZpY2VcbiIsIHVzZXJfY21kLnN1YmRldik7CisJCXJldHVybiAtRUlPOworCX0KKworCWlmICghcy0+ZG9fY21kIHx8ICFzLT5kb19jbWR0ZXN0KSB7CisJCURQUklOVEsoInN1YmRldmljZSAlaSBkb2VzIG5vdCBzdXBwb3J0IGNvbW1hbmRzXG4iLAorCQkJdXNlcl9jbWQuc3ViZGV2KTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJLyogbWFrZSBzdXJlIGNoYW5uZWwvZ2FpbiBsaXN0IGlzbid0IHRvbyBsb25nICovCisJaWYgKHVzZXJfY21kLmNoYW5saXN0X2xlbiA+IHMtPmxlbl9jaGFubGlzdCkgeworCQlEUFJJTlRLKCJjaGFubmVsL2dhaW4gbGlzdCB0b28gbG9uZyAlZCA+ICVkXG4iLAorCQkJdXNlcl9jbWQuY2hhbmxpc3RfbGVuLCBzLT5sZW5fY2hhbmxpc3QpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGNsZWFudXA7CisJfQorCisJLyogbG9hZCBjaGFubmVsL2dhaW4gbGlzdCAqLworCWlmICh1c2VyX2NtZC5jaGFubGlzdCkgeworCQljaGFubGlzdCA9CisJCSAgICBrbWFsbG9jKHVzZXJfY21kLmNoYW5saXN0X2xlbiAqIHNpemVvZihpbnQpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFjaGFubGlzdCkgeworCQkJRFBSSU5USygiYWxsb2NhdGlvbiBmYWlsZWRcbiIpOworCQkJcmV0ID0gLUVOT01FTTsKKwkJCWdvdG8gY2xlYW51cDsKKwkJfQorCisJCWlmIChjb3B5X2Zyb21fdXNlcihjaGFubGlzdCwgdXNlcl9jbWQuY2hhbmxpc3QsCisJCQkJICAgdXNlcl9jbWQuY2hhbmxpc3RfbGVuICogc2l6ZW9mKGludCkpKSB7CisJCQlEUFJJTlRLKCJmYXVsdCByZWFkaW5nIGNoYW5saXN0XG4iKTsKKwkJCXJldCA9IC1FRkFVTFQ7CisJCQlnb3RvIGNsZWFudXA7CisJCX0KKworCQkvKiBtYWtlIHN1cmUgZWFjaCBlbGVtZW50IGluIGNoYW5uZWwvZ2FpbiBsaXN0IGlzIHZhbGlkICovCisJCXJldCA9IGNoZWNrX2NoYW5saXN0KHMsIHVzZXJfY21kLmNoYW5saXN0X2xlbiwgY2hhbmxpc3QpOworCQlpZiAocmV0IDwgMCkgeworCQkJRFBSSU5USygiYmFkIGNoYW5saXN0XG4iKTsKKwkJCWdvdG8gY2xlYW51cDsKKwkJfQorCisJCXVzZXJfY21kLmNoYW5saXN0ID0gY2hhbmxpc3Q7CisJfQorCisJcmV0ID0gcy0+ZG9fY21kdGVzdChkZXYsIHMsICZ1c2VyX2NtZCk7CisKKwkvKiByZXN0b3JlIGNoYW5saXN0IHBvaW50ZXIgYmVmb3JlIGNvcHlpbmcgYmFjayAqLworCXVzZXJfY21kLmNoYW5saXN0ID0gY2hhbmxpc3Rfc2F2ZXI7CisKKwlpZiAoY29weV90b191c2VyKGFyZywgJnVzZXJfY21kLCBzaXplb2YoY29tZWRpX2NtZCkpKSB7CisJCURQUklOVEsoImJhZCBjbWQgYWRkcmVzc1xuIik7CisJCXJldCA9IC1FRkFVTFQ7CisJCWdvdG8gY2xlYW51cDsKKwl9CitjbGVhbnVwOgorCWtmcmVlKGNoYW5saXN0KTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qCisJQ09NRURJX0xPQ0sKKwlsb2NrIHN1YmRldmljZQorCisJYXJnOgorCQlzdWJkZXZpY2UgbnVtYmVyCisKKwlyZWFkczoKKwkJbm9uZQorCisJd3JpdGVzOgorCQlub25lCisKKyovCisKK3N0YXRpYyBpbnQgZG9fbG9ja19pb2N0bChjb21lZGlfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBhcmcsIHZvaWQgKmZpbGUpCit7CisJaW50IHJldCA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwljb21lZGlfc3ViZGV2aWNlICpzOworCisJaWYgKGFyZyA+PSBkZXYtPm5fc3ViZGV2aWNlcykKKwkJcmV0dXJuIC1FSU5WQUw7CisJcyA9IGRldi0+c3ViZGV2aWNlcyArIGFyZzsKKworCWNvbWVkaV9zcGluX2xvY2tfaXJxc2F2ZSgmcy0+c3Bpbl9sb2NrLCBmbGFncyk7CisJaWYgKHMtPmJ1c3kgfHwgcy0+bG9jaykKKwkJcmV0ID0gLUVCVVNZOworCWVsc2UKKwkJcy0+bG9jayA9IGZpbGU7CisJY29tZWRpX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPnNwaW5fbG9jaywgZmxhZ3MpOworCisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKyNpZiAwCisJaWYgKHMtPmxvY2tfZikKKwkJcmV0ID0gcy0+bG9ja19mKGRldiwgcyk7CisjZW5kaWYKKworCXJldHVybiByZXQ7Cit9CisKKy8qCisJQ09NRURJX1VOTE9DSworCXVubG9jayBzdWJkZXZpY2UKKworCWFyZzoKKwkJc3ViZGV2aWNlIG51bWJlcgorCisJcmVhZHM6CisJCW5vbmUKKworCXdyaXRlczoKKwkJbm9uZQorCisJVGhpcyBmdW5jdGlvbiBpc24ndCBwcm90ZWN0ZWQgYnkgdGhlIHNlbWFwaG9yZSwgc2luY2UKKwl3ZSBhbHJlYWR5IG93biB0aGUgbG9jay4KKyovCitzdGF0aWMgaW50IGRvX3VubG9ja19pb2N0bChjb21lZGlfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBhcmcsIHZvaWQgKmZpbGUpCit7CisJY29tZWRpX3N1YmRldmljZSAqczsKKworCWlmIChhcmcgPj0gZGV2LT5uX3N1YmRldmljZXMpCisJCXJldHVybiAtRUlOVkFMOworCXMgPSBkZXYtPnN1YmRldmljZXMgKyBhcmc7CisKKwlpZiAocy0+YnVzeSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCWlmIChzLT5sb2NrICYmIHMtPmxvY2sgIT0gZmlsZSkKKwkJcmV0dXJuIC1FQUNDRVM7CisKKwlpZiAocy0+bG9jayA9PSBmaWxlKSB7CisjaWYgMAorCQlpZiAocy0+dW5sb2NrKQorCQkJcy0+dW5sb2NrKGRldiwgcyk7CisjZW5kaWYKKworCQlzLT5sb2NrID0gTlVMTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoKKwlDT01FRElfQ0FOQ0VMCisJY2FuY2VsIGFjcXVpc2l0aW9uIGlvY3RsCisKKwlhcmc6CisJCXN1YmRldmljZSBudW1iZXIKKworCXJlYWRzOgorCQlub3RoaW5nCisKKwl3cml0ZXM6CisJCW5vdGhpbmcKKworKi8KK3N0YXRpYyBpbnQgZG9fY2FuY2VsX2lvY3RsKGNvbWVkaV9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IGFyZywgdm9pZCAqZmlsZSkKK3sKKwljb21lZGlfc3ViZGV2aWNlICpzOworCisJaWYgKGFyZyA+PSBkZXYtPm5fc3ViZGV2aWNlcykKKwkJcmV0dXJuIC1FSU5WQUw7CisJcyA9IGRldi0+c3ViZGV2aWNlcyArIGFyZzsKKwlpZiAocy0+YXN5bmMgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAocy0+bG9jayAmJiBzLT5sb2NrICE9IGZpbGUpCisJCXJldHVybiAtRUFDQ0VTOworCisJaWYgKCFzLT5idXN5KQorCQlyZXR1cm4gMDsKKworCWlmIChzLT5idXN5ICE9IGZpbGUpCisJCXJldHVybiAtRUJVU1k7CisKKwlyZXR1cm4gZG9fY2FuY2VsKGRldiwgcyk7Cit9CisKKy8qCisJQ09NRURJX1BPTEwgaW9jdGwKKwlpbnN0cnVjdHMgZHJpdmVyIHRvIHN5bmNocm9uaXplIGJ1ZmZlcnMKKworCWFyZzoKKwkJc3ViZGV2aWNlIG51bWJlcgorCisJcmVhZHM6CisJCW5vdGhpbmcKKworCXdyaXRlczoKKwkJbm90aGluZworCisqLworc3RhdGljIGludCBkb19wb2xsX2lvY3RsKGNvbWVkaV9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IGFyZywgdm9pZCAqZmlsZSkKK3sKKwljb21lZGlfc3ViZGV2aWNlICpzOworCisJaWYgKGFyZyA+PSBkZXYtPm5fc3ViZGV2aWNlcykKKwkJcmV0dXJuIC1FSU5WQUw7CisJcyA9IGRldi0+c3ViZGV2aWNlcyArIGFyZzsKKworCWlmIChzLT5sb2NrICYmIHMtPmxvY2sgIT0gZmlsZSkKKwkJcmV0dXJuIC1FQUNDRVM7CisKKwlpZiAoIXMtPmJ1c3kpCisJCXJldHVybiAwOworCisJaWYgKHMtPmJ1c3kgIT0gZmlsZSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCWlmIChzLT5wb2xsKQorCQlyZXR1cm4gcy0+cG9sbChkZXYsIHMpOworCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgZG9fY2FuY2VsKGNvbWVkaV9kZXZpY2UgKmRldiwgY29tZWRpX3N1YmRldmljZSAqcykKK3sKKwlpbnQgcmV0ID0gMDsKKworCWlmICgoY29tZWRpX2dldF9zdWJkZXZpY2VfcnVuZmxhZ3MocykgJiBTUkZfUlVOTklORykgJiYgcy0+Y2FuY2VsKQorCQlyZXQgPSBzLT5jYW5jZWwoZGV2LCBzKTsKKworCWRvX2JlY29tZV9ub25idXN5KGRldiwgcyk7CisKKwlyZXR1cm4gcmV0OworfQorCit2b2lkIGNvbWVkaV91bm1hcChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKmFyZWEpCit7CisJY29tZWRpX2FzeW5jICphc3luYzsKKwljb21lZGlfZGV2aWNlICpkZXY7CisKKwlhc3luYyA9IGFyZWEtPnZtX3ByaXZhdGVfZGF0YTsKKwlkZXYgPSBhc3luYy0+c3ViZGV2aWNlLT5kZXZpY2U7CisKKwltdXRleF9sb2NrKCZkZXYtPm11dGV4KTsKKwlhc3luYy0+bW1hcF9jb3VudC0tOworCW11dGV4X3VubG9jaygmZGV2LT5tdXRleCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgdm1fb3BlcmF0aW9uc19zdHJ1Y3QgY29tZWRpX3ZtX29wcyA9IHsKKwkuY2xvc2UgPQljb21lZGlfdW5tYXAsCit9OworCitzdGF0aWMgaW50IGNvbWVkaV9tbWFwKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwljb25zdCB1bnNpZ25lZCBtaW5vciA9IGltaW5vcihmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSk7CisJc3RydWN0IGNvbWVkaV9kZXZpY2VfZmlsZV9pbmZvICpkZXZfZmlsZV9pbmZvID0KKwkgICAgY29tZWRpX2dldF9kZXZpY2VfZmlsZV9pbmZvKG1pbm9yKTsKKwljb21lZGlfZGV2aWNlICpkZXYgPSBkZXZfZmlsZV9pbmZvLT5kZXZpY2U7CisJY29tZWRpX2FzeW5jICphc3luYyA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyBzdGFydCA9IHZtYS0+dm1fc3RhcnQ7CisJdW5zaWduZWQgbG9uZyBzaXplOworCWludCBuX3BhZ2VzOworCWludCBpOworCWludCByZXR2YWw7CisJY29tZWRpX3N1YmRldmljZSAqczsKKworCW11dGV4X2xvY2soJmRldi0+bXV0ZXgpOworCWlmICghZGV2LT5hdHRhY2hlZCkgeworCQlEUFJJTlRLKCJubyBkcml2ZXIgY29uZmlndXJlZCBvbiBjb21lZGklaVxuIiwgZGV2LT5taW5vcik7CisJCXJldHZhbCA9IC1FTk9ERVY7CisJCWdvdG8gZG9uZTsKKwl9CisJaWYgKHZtYS0+dm1fZmxhZ3MgJiBWTV9XUklURSkKKwkJcyA9IGNvbWVkaV9nZXRfd3JpdGVfc3ViZGV2aWNlKGRldl9maWxlX2luZm8pOworCWVsc2UKKwkJcyA9IGNvbWVkaV9nZXRfcmVhZF9zdWJkZXZpY2UoZGV2X2ZpbGVfaW5mbyk7CisKKwlpZiAocyA9PSBOVUxMKSB7CisJCXJldHZhbCA9IC1FSU5WQUw7CisJCWdvdG8gZG9uZTsKKwl9CisJYXN5bmMgPSBzLT5hc3luYzsKKwlpZiAoYXN5bmMgPT0gTlVMTCkgeworCQlyZXR2YWwgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCisJaWYgKHZtYS0+dm1fcGdvZmYgIT0gMCkgeworCQlEUFJJTlRLKCJjb21lZGk6IG1tYXAoKSBvZmZzZXQgbXVzdCBiZSAwLlxuIik7CisJCXJldHZhbCA9IC1FSU5WQUw7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlzaXplID0gdm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0OworCWlmIChzaXplID4gYXN5bmMtPnByZWFsbG9jX2J1ZnN6KSB7CisJCXJldHZhbCA9IC1FRkFVTFQ7CisJCWdvdG8gZG9uZTsKKwl9CisJaWYgKHNpemUgJiAoflBBR0VfTUFTSykpIHsKKwkJcmV0dmFsID0gLUVGQVVMVDsKKwkJZ290byBkb25lOworCX0KKworCW5fcGFnZXMgPSBzaXplID4+IFBBR0VfU0hJRlQ7CisJZm9yIChpID0gMDsgaSA8IG5fcGFnZXM7ICsraSkgeworCQlpZiAocmVtYXBfcGZuX3JhbmdlKHZtYSwgc3RhcnQsCisJCQkJICAgIHBhZ2VfdG9fcGZuKHZpcnRfdG9fcGFnZShhc3luYy0+CisJCQkJCQkJICAgICBidWZfcGFnZV9saXN0W2ldLgorCQkJCQkJCSAgICAgdmlydF9hZGRyKSksCisJCQkJICAgIFBBR0VfU0laRSwgUEFHRV9TSEFSRUQpKSB7CisJCQlyZXR2YWwgPSAtRUFHQUlOOworCQkJZ290byBkb25lOworCQl9CisJCXN0YXJ0ICs9IFBBR0VfU0laRTsKKwl9CisKKwl2bWEtPnZtX29wcyA9ICZjb21lZGlfdm1fb3BzOworCXZtYS0+dm1fcHJpdmF0ZV9kYXRhID0gYXN5bmM7CisKKwlhc3luYy0+bW1hcF9jb3VudCsrOworCisJcmV0dmFsID0gMDsKK2RvbmU6CisJbXV0ZXhfdW5sb2NrKCZkZXYtPm11dGV4KTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IGNvbWVkaV9wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBwb2xsX3RhYmxlICp3YWl0KQoreworCXVuc2lnbmVkIGludCBtYXNrID0gMDsKKwljb25zdCB1bnNpZ25lZCBtaW5vciA9IGltaW5vcihmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSk7CisJc3RydWN0IGNvbWVkaV9kZXZpY2VfZmlsZV9pbmZvICpkZXZfZmlsZV9pbmZvID0KKwkgICAgY29tZWRpX2dldF9kZXZpY2VfZmlsZV9pbmZvKG1pbm9yKTsKKwljb21lZGlfZGV2aWNlICpkZXYgPSBkZXZfZmlsZV9pbmZvLT5kZXZpY2U7CisJY29tZWRpX3N1YmRldmljZSAqcmVhZF9zdWJkZXY7CisJY29tZWRpX3N1YmRldmljZSAqd3JpdGVfc3ViZGV2OworCisJbXV0ZXhfbG9jaygmZGV2LT5tdXRleCk7CisJaWYgKCFkZXYtPmF0dGFjaGVkKSB7CisJCURQUklOVEsoIm5vIGRyaXZlciBjb25maWd1cmVkIG9uIGNvbWVkaSVpXG4iLCBkZXYtPm1pbm9yKTsKKwkJbXV0ZXhfdW5sb2NrKCZkZXYtPm11dGV4KTsKKwkJcmV0dXJuIDA7CisJfQorCisJbWFzayA9IDA7CisJcmVhZF9zdWJkZXYgPSBjb21lZGlfZ2V0X3JlYWRfc3ViZGV2aWNlKGRldl9maWxlX2luZm8pOworCWlmIChyZWFkX3N1YmRldikgeworCQlwb2xsX3dhaXQoZmlsZSwgJnJlYWRfc3ViZGV2LT5hc3luYy0+d2FpdF9oZWFkLCB3YWl0KTsKKwkJaWYgKCFyZWFkX3N1YmRldi0+YnVzeQorCQkgICAgfHwgY29tZWRpX2J1Zl9yZWFkX25fYXZhaWxhYmxlKHJlYWRfc3ViZGV2LT5hc3luYykgPiAwCisJCSAgICB8fCAhKGNvbWVkaV9nZXRfc3ViZGV2aWNlX3J1bmZsYWdzKHJlYWRfc3ViZGV2KSAmCisJCQkgU1JGX1JVTk5JTkcpKSB7CisJCQltYXNrIHw9IFBPTExJTiB8IFBPTExSRE5PUk07CisJCX0KKwl9CisJd3JpdGVfc3ViZGV2ID0gY29tZWRpX2dldF93cml0ZV9zdWJkZXZpY2UoZGV2X2ZpbGVfaW5mbyk7CisJaWYgKHdyaXRlX3N1YmRldikgeworCQlwb2xsX3dhaXQoZmlsZSwgJndyaXRlX3N1YmRldi0+YXN5bmMtPndhaXRfaGVhZCwgd2FpdCk7CisJCWNvbWVkaV9idWZfd3JpdGVfYWxsb2Mod3JpdGVfc3ViZGV2LT5hc3luYywKKwkJCQkgICAgICAgd3JpdGVfc3ViZGV2LT5hc3luYy0+cHJlYWxsb2NfYnVmc3opOworCQlpZiAoIXdyaXRlX3N1YmRldi0+YnVzeQorCQkgICAgfHwgIShjb21lZGlfZ2V0X3N1YmRldmljZV9ydW5mbGFncyh3cml0ZV9zdWJkZXYpICYKKwkJCSBTUkZfUlVOTklORykKKwkJICAgIHx8IGNvbWVkaV9idWZfd3JpdGVfbl9hbGxvY2F0ZWQod3JpdGVfc3ViZGV2LT5hc3luYykgPj0KKwkJICAgIGJ5dGVzX3Blcl9zYW1wbGUod3JpdGVfc3ViZGV2LT5hc3luYy0+c3ViZGV2aWNlKSkgeworCQkJbWFzayB8PSBQT0xMT1VUIHwgUE9MTFdSTk9STTsKKwkJfQorCX0KKworCW11dGV4X3VubG9jaygmZGV2LT5tdXRleCk7CisJcmV0dXJuIG1hc2s7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGNvbWVkaV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbmJ5dGVzLAorCQkJICAgIGxvZmZfdCAqb2Zmc2V0KQoreworCWNvbWVkaV9zdWJkZXZpY2UgKnM7CisJY29tZWRpX2FzeW5jICphc3luYzsKKwlpbnQgbiwgbSwgY291bnQgPSAwLCByZXR2YWwgPSAwOworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCWNvbnN0IHVuc2lnbmVkIG1pbm9yID0gaW1pbm9yKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlKTsKKwlzdHJ1Y3QgY29tZWRpX2RldmljZV9maWxlX2luZm8gKmRldl9maWxlX2luZm8gPQorCSAgICBjb21lZGlfZ2V0X2RldmljZV9maWxlX2luZm8obWlub3IpOworCWNvbWVkaV9kZXZpY2UgKmRldiA9IGRldl9maWxlX2luZm8tPmRldmljZTsKKworCWlmICghZGV2LT5hdHRhY2hlZCkgeworCQlEUFJJTlRLKCJubyBkcml2ZXIgY29uZmlndXJlZCBvbiBjb21lZGklaVxuIiwgZGV2LT5taW5vcik7CisJCXJldHZhbCA9IC1FTk9ERVY7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlzID0gY29tZWRpX2dldF93cml0ZV9zdWJkZXZpY2UoZGV2X2ZpbGVfaW5mbyk7CisJaWYgKHMgPT0gTlVMTCkgeworCQlyZXR2YWwgPSAtRUlPOworCQlnb3RvIGRvbmU7CisJfQorCWFzeW5jID0gcy0+YXN5bmM7CisKKwlpZiAoIW5ieXRlcykgeworCQlyZXR2YWwgPSAwOworCQlnb3RvIGRvbmU7CisJfQorCWlmICghcy0+YnVzeSkgeworCQlyZXR2YWwgPSAwOworCQlnb3RvIGRvbmU7CisJfQorCWlmIChzLT5idXN5ICE9IGZpbGUpIHsKKwkJcmV0dmFsID0gLUVBQ0NFUzsKKwkJZ290byBkb25lOworCX0KKwlhZGRfd2FpdF9xdWV1ZSgmYXN5bmMtPndhaXRfaGVhZCwgJndhaXQpOworCXdoaWxlIChuYnl0ZXMgPiAwICYmICFyZXR2YWwpIHsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKworCQluID0gbmJ5dGVzOworCisJCW0gPSBuOworCQlpZiAoYXN5bmMtPmJ1Zl93cml0ZV9wdHIgKyBtID4gYXN5bmMtPnByZWFsbG9jX2J1ZnN6KQorCQkJbSA9IGFzeW5jLT5wcmVhbGxvY19idWZzeiAtIGFzeW5jLT5idWZfd3JpdGVfcHRyOworCQljb21lZGlfYnVmX3dyaXRlX2FsbG9jKGFzeW5jLCBhc3luYy0+cHJlYWxsb2NfYnVmc3opOworCQlpZiAobSA+IGNvbWVkaV9idWZfd3JpdGVfbl9hbGxvY2F0ZWQoYXN5bmMpKQorCQkJbSA9IGNvbWVkaV9idWZfd3JpdGVfbl9hbGxvY2F0ZWQoYXN5bmMpOworCQlpZiAobSA8IG4pCisJCQluID0gbTsKKworCQlpZiAobiA9PSAwKSB7CisJCQlpZiAoIShjb21lZGlfZ2V0X3N1YmRldmljZV9ydW5mbGFncyhzKSAmIFNSRl9SVU5OSU5HKSkgeworCQkJCWlmIChjb21lZGlfZ2V0X3N1YmRldmljZV9ydW5mbGFncyhzKSAmCisJCQkJICAgIFNSRl9FUlJPUikgeworCQkJCQlyZXR2YWwgPSAtRVBJUEU7CisJCQkJfSBlbHNlIHsKKwkJCQkJcmV0dmFsID0gMDsKKwkJCQl9CisJCQkJZG9fYmVjb21lX25vbmJ1c3koZGV2LCBzKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgeworCQkJCXJldHZhbCA9IC1FQUdBSU47CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCQlyZXR2YWwgPSAtRVJFU1RBUlRTWVM7CisJCQkJYnJlYWs7CisJCQl9CisJCQlzY2hlZHVsZSgpOworCQkJaWYgKCFzLT5idXN5KQorCQkJCWJyZWFrOworCQkJaWYgKHMtPmJ1c3kgIT0gZmlsZSkgeworCQkJCXJldHZhbCA9IC1FQUNDRVM7CisJCQkJYnJlYWs7CisJCQl9CisJCQljb250aW51ZTsKKwkJfQorCisJCW0gPSBjb3B5X2Zyb21fdXNlcihhc3luYy0+cHJlYWxsb2NfYnVmICsgYXN5bmMtPmJ1Zl93cml0ZV9wdHIsCisJCQkJICAgYnVmLCBuKTsKKwkJaWYgKG0pIHsKKwkJCW4gLT0gbTsKKwkJCXJldHZhbCA9IC1FRkFVTFQ7CisJCX0KKwkJY29tZWRpX2J1Zl93cml0ZV9mcmVlKGFzeW5jLCBuKTsKKworCQljb3VudCArPSBuOworCQluYnl0ZXMgLT0gbjsKKworCQlidWYgKz0gbjsKKwkJYnJlYWs7CQkvKiBtYWtlcyBkZXZpY2Ugd29yayBsaWtlIGEgcGlwZSAqLworCX0KKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCXJlbW92ZV93YWl0X3F1ZXVlKCZhc3luYy0+d2FpdF9oZWFkLCAmd2FpdCk7CisKK2RvbmU6CisJcmV0dXJuIGNvdW50ID8gY291bnQgOiByZXR2YWw7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGNvbWVkaV9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyICpidWYsIHNpemVfdCBuYnl0ZXMsCisJCQkgICBsb2ZmX3QgKm9mZnNldCkKK3sKKwljb21lZGlfc3ViZGV2aWNlICpzOworCWNvbWVkaV9hc3luYyAqYXN5bmM7CisJaW50IG4sIG0sIGNvdW50ID0gMCwgcmV0dmFsID0gMDsKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKwljb25zdCB1bnNpZ25lZCBtaW5vciA9IGltaW5vcihmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSk7CisJc3RydWN0IGNvbWVkaV9kZXZpY2VfZmlsZV9pbmZvICpkZXZfZmlsZV9pbmZvID0KKwkgICAgY29tZWRpX2dldF9kZXZpY2VfZmlsZV9pbmZvKG1pbm9yKTsKKwljb21lZGlfZGV2aWNlICpkZXYgPSBkZXZfZmlsZV9pbmZvLT5kZXZpY2U7CisKKwlpZiAoIWRldi0+YXR0YWNoZWQpIHsKKwkJRFBSSU5USygibm8gZHJpdmVyIGNvbmZpZ3VyZWQgb24gY29tZWRpJWlcbiIsIGRldi0+bWlub3IpOworCQlyZXR2YWwgPSAtRU5PREVWOworCQlnb3RvIGRvbmU7CisJfQorCisJcyA9IGNvbWVkaV9nZXRfcmVhZF9zdWJkZXZpY2UoZGV2X2ZpbGVfaW5mbyk7CisJaWYgKHMgPT0gTlVMTCkgeworCQlyZXR2YWwgPSAtRUlPOworCQlnb3RvIGRvbmU7CisJfQorCWFzeW5jID0gcy0+YXN5bmM7CisJaWYgKCFuYnl0ZXMpIHsKKwkJcmV0dmFsID0gMDsKKwkJZ290byBkb25lOworCX0KKwlpZiAoIXMtPmJ1c3kpIHsKKwkJcmV0dmFsID0gMDsKKwkJZ290byBkb25lOworCX0KKwlpZiAocy0+YnVzeSAhPSBmaWxlKSB7CisJCXJldHZhbCA9IC1FQUNDRVM7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlhZGRfd2FpdF9xdWV1ZSgmYXN5bmMtPndhaXRfaGVhZCwgJndhaXQpOworCXdoaWxlIChuYnl0ZXMgPiAwICYmICFyZXR2YWwpIHsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKworCQluID0gbmJ5dGVzOworCisJCW0gPSBjb21lZGlfYnVmX3JlYWRfbl9hdmFpbGFibGUoYXN5bmMpOworCQkvKiBwcmludGsoIiVkIGF2YWlsYWJsZVxuIixtKTsgKi8KKwkJaWYgKGFzeW5jLT5idWZfcmVhZF9wdHIgKyBtID4gYXN5bmMtPnByZWFsbG9jX2J1ZnN6KQorCQkJbSA9IGFzeW5jLT5wcmVhbGxvY19idWZzeiAtIGFzeW5jLT5idWZfcmVhZF9wdHI7CisJCS8qIHByaW50aygiJWQgY29udGlndW91c1xuIixtKTsgKi8KKwkJaWYgKG0gPCBuKQorCQkJbiA9IG07CisKKwkJaWYgKG4gPT0gMCkgeworCQkJaWYgKCEoY29tZWRpX2dldF9zdWJkZXZpY2VfcnVuZmxhZ3MocykgJiBTUkZfUlVOTklORykpIHsKKwkJCQlkb19iZWNvbWVfbm9uYnVzeShkZXYsIHMpOworCQkJCWlmIChjb21lZGlfZ2V0X3N1YmRldmljZV9ydW5mbGFncyhzKSAmCisJCQkJICAgIFNSRl9FUlJPUikgeworCQkJCQlyZXR2YWwgPSAtRVBJUEU7CisJCQkJfSBlbHNlIHsKKwkJCQkJcmV0dmFsID0gMDsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKKwkJCQlyZXR2YWwgPSAtRUFHQUlOOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQkJcmV0dmFsID0gLUVSRVNUQVJUU1lTOworCQkJCWJyZWFrOworCQkJfQorCQkJc2NoZWR1bGUoKTsKKwkJCWlmICghcy0+YnVzeSkgeworCQkJCXJldHZhbCA9IDA7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAocy0+YnVzeSAhPSBmaWxlKSB7CisJCQkJcmV0dmFsID0gLUVBQ0NFUzsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWNvbnRpbnVlOworCQl9CisJCW0gPSBjb3B5X3RvX3VzZXIoYnVmLCBhc3luYy0+cHJlYWxsb2NfYnVmICsKKwkJCQkgYXN5bmMtPmJ1Zl9yZWFkX3B0ciwgbik7CisJCWlmIChtKSB7CisJCQluIC09IG07CisJCQlyZXR2YWwgPSAtRUZBVUxUOworCQl9CisKKwkJY29tZWRpX2J1Zl9yZWFkX2FsbG9jKGFzeW5jLCBuKTsKKwkJY29tZWRpX2J1Zl9yZWFkX2ZyZWUoYXN5bmMsIG4pOworCisJCWNvdW50ICs9IG47CisJCW5ieXRlcyAtPSBuOworCisJCWJ1ZiArPSBuOworCQlicmVhazsJCS8qIG1ha2VzIGRldmljZSB3b3JrIGxpa2UgYSBwaXBlICovCisJfQorCWlmICghKGNvbWVkaV9nZXRfc3ViZGV2aWNlX3J1bmZsYWdzKHMpICYgKFNSRl9FUlJPUiB8IFNSRl9SVU5OSU5HKSkgJiYKKwkgICAgYXN5bmMtPmJ1Zl9yZWFkX2NvdW50IC0gYXN5bmMtPmJ1Zl93cml0ZV9jb3VudCA9PSAwKSB7CisJCWRvX2JlY29tZV9ub25idXN5KGRldiwgcyk7CisJfQorCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJcmVtb3ZlX3dhaXRfcXVldWUoJmFzeW5jLT53YWl0X2hlYWQsICZ3YWl0KTsKKworZG9uZToKKwlyZXR1cm4gY291bnQgPyBjb3VudCA6IHJldHZhbDsKK30KKworLyoKKyAgIFRoaXMgZnVuY3Rpb24gcmVzdG9yZXMgYSBzdWJkZXZpY2UgdG8gYW4gaWRsZSBzdGF0ZS4KKyAqLwordm9pZCBkb19iZWNvbWVfbm9uYnVzeShjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKnMpCit7CisJY29tZWRpX2FzeW5jICphc3luYyA9IHMtPmFzeW5jOworCisJY29tZWRpX3NldF9zdWJkZXZpY2VfcnVuZmxhZ3MocywgU1JGX1JVTk5JTkcsIDApOworI2lmZGVmIENPTkZJR19DT01FRElfUlQKKwlpZiAoY29tZWRpX2dldF9zdWJkZXZpY2VfcnVuZmxhZ3MocykgJiBTUkZfUlQpIHsKKwkJY29tZWRpX3N3aXRjaF90b19ub25fcnQoZGV2KTsKKwkJY29tZWRpX3NldF9zdWJkZXZpY2VfcnVuZmxhZ3MocywgU1JGX1JULCAwKTsKKwl9CisjZW5kaWYKKwlpZiAoYXN5bmMpIHsKKwkJY29tZWRpX3Jlc2V0X2FzeW5jX2J1Zihhc3luYyk7CisJCWFzeW5jLT5pbnR0cmlnID0gTlVMTDsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9FUlIKKwkJICAgICAgICJCVUc6ICg/KSBkb19iZWNvbWVfbm9uYnVzeSBjYWxsZWQgd2l0aCBhc3luYz0wXG4iKTsKKwl9CisKKwlzLT5idXN5ID0gTlVMTDsKK30KKworc3RhdGljIGludCBjb21lZGlfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwljaGFyIG1vZFszMl07CisJY29uc3QgdW5zaWduZWQgbWlub3IgPSBpbWlub3IoaW5vZGUpOworCXN0cnVjdCBjb21lZGlfZGV2aWNlX2ZpbGVfaW5mbyAqZGV2X2ZpbGVfaW5mbyA9CisJICAgIGNvbWVkaV9nZXRfZGV2aWNlX2ZpbGVfaW5mbyhtaW5vcik7CisJY29tZWRpX2RldmljZSAqZGV2ID0gZGV2X2ZpbGVfaW5mby0+ZGV2aWNlOworCWlmIChkZXYgPT0gTlVMTCkgeworCQlEUFJJTlRLKCJpbnZhbGlkIG1pbm9yIG51bWJlclxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCS8qIFRoaXMgaXMgc2xpZ2h0bHkgaGFja3ksIGJ1dCB3ZSB3YW50IG1vZHVsZSBhdXRvbG9hZGluZworCSAqIHRvIHdvcmsgZm9yIHJvb3QuCisJICogY2FzZTogdXNlciBvcGVucyBkZXZpY2UsIGF0dGFjaGVkIC0+IG9rCisJICogY2FzZTogdXNlciBvcGVucyBkZXZpY2UsIHVuYXR0YWNoZWQsIGluX3JlcXVlc3RfbW9kdWxlPTAgLT4gYXV0b2xvYWQKKwkgKiBjYXNlOiB1c2VyIG9wZW5zIGRldmljZSwgdW5hdHRhY2hlZCwgaW5fcmVxdWVzdF9tb2R1bGU9MSAtPiBmYWlsCisJICogY2FzZTogcm9vdCBvcGVucyBkZXZpY2UsIGF0dGFjaGVkIC0+IG9rCisJICogY2FzZTogcm9vdCBvcGVucyBkZXZpY2UsIHVuYXR0YWNoZWQsIGluX3JlcXVlc3RfbW9kdWxlPTEgLT4gb2sKKwkgKiAgICh0eXBpY2FsbHkgY2FsbGVkIGZyb20gbW9kcHJvYmUpCisJICogY2FzZTogcm9vdCBvcGVucyBkZXZpY2UsIHVuYXR0YWNoZWQsIGluX3JlcXVlc3RfbW9kdWxlPTAgLT4gYXV0b2xvYWQKKwkgKgorCSAqIFRoZSBsYXN0IGNvdWxkIGJlIGNoYW5nZWQgdG8gIi0+IG9rIiwgd2hpY2ggd291bGQgZGVueSByb290CisJICogYXV0b2xvYWRpbmcuCisJICovCisJbXV0ZXhfbG9jaygmZGV2LT5tdXRleCk7CisJaWYgKGRldi0+YXR0YWNoZWQpCisJCWdvdG8gb2s7CisJaWYgKCFjYXBhYmxlKENBUF9TWVNfTU9EVUxFKSAmJiBkZXYtPmluX3JlcXVlc3RfbW9kdWxlKSB7CisJCURQUklOVEsoImluIHJlcXVlc3QgbW9kdWxlXG4iKTsKKwkJbXV0ZXhfdW5sb2NrKCZkZXYtPm11dGV4KTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCWlmIChjYXBhYmxlKENBUF9TWVNfTU9EVUxFKSAmJiBkZXYtPmluX3JlcXVlc3RfbW9kdWxlKQorCQlnb3RvIG9rOworCisJZGV2LT5pbl9yZXF1ZXN0X21vZHVsZSA9IDE7CisKKwlzcHJpbnRmKG1vZCwgImNoYXItbWFqb3ItJWktJWkiLCBDT01FRElfTUFKT1IsIGRldi0+bWlub3IpOworI2lmZGVmIENPTkZJR19LTU9ECisJbXV0ZXhfdW5sb2NrKCZkZXYtPm11dGV4KTsKKwlyZXF1ZXN0X21vZHVsZShtb2QpOworCW11dGV4X2xvY2soJmRldi0+bXV0ZXgpOworI2VuZGlmCisKKwlkZXYtPmluX3JlcXVlc3RfbW9kdWxlID0gMDsKKworCWlmICghZGV2LT5hdHRhY2hlZCAmJiAhY2FwYWJsZShDQVBfU1lTX01PRFVMRSkpIHsKKwkJRFBSSU5USygibm90IGF0dGFjaGVkIGFuZCBub3QgQ0FQX1NZU19NT0RVTEVcbiIpOworCQltdXRleF91bmxvY2soJmRldi0+bXV0ZXgpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CitvazoKKwlfX21vZHVsZV9nZXQoVEhJU19NT0RVTEUpOworCisJaWYgKGRldi0+YXR0YWNoZWQpIHsKKwkJaWYgKCF0cnlfbW9kdWxlX2dldChkZXYtPmRyaXZlci0+bW9kdWxlKSkgeworCQkJbW9kdWxlX3B1dChUSElTX01PRFVMRSk7CisJCQltdXRleF91bmxvY2soJmRldi0+bXV0ZXgpOworCQkJcmV0dXJuIC1FTk9TWVM7CisJCX0KKwl9CisKKwlpZiAoZGV2LT5hdHRhY2hlZCAmJiBkZXYtPnVzZV9jb3VudCA9PSAwICYmIGRldi0+b3BlbikKKwkJZGV2LT5vcGVuKGRldik7CisKKwlkZXYtPnVzZV9jb3VudCsrOworCisJbXV0ZXhfdW5sb2NrKCZkZXYtPm11dGV4KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNvbWVkaV9jbG9zZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwljb25zdCB1bnNpZ25lZCBtaW5vciA9IGltaW5vcihpbm9kZSk7CisJc3RydWN0IGNvbWVkaV9kZXZpY2VfZmlsZV9pbmZvICpkZXZfZmlsZV9pbmZvID0KKwkgICAgY29tZWRpX2dldF9kZXZpY2VfZmlsZV9pbmZvKG1pbm9yKTsKKwljb21lZGlfZGV2aWNlICpkZXYgPSBkZXZfZmlsZV9pbmZvLT5kZXZpY2U7CisJY29tZWRpX3N1YmRldmljZSAqcyA9IE5VTEw7CisJaW50IGk7CisKKwltdXRleF9sb2NrKCZkZXYtPm11dGV4KTsKKworCWlmIChkZXYtPnN1YmRldmljZXMpIHsKKwkJZm9yIChpID0gMDsgaSA8IGRldi0+bl9zdWJkZXZpY2VzOyBpKyspIHsKKwkJCXMgPSBkZXYtPnN1YmRldmljZXMgKyBpOworCisJCQlpZiAocy0+YnVzeSA9PSBmaWxlKQorCQkJCWRvX2NhbmNlbChkZXYsIHMpOworCQkJaWYgKHMtPmxvY2sgPT0gZmlsZSkKKwkJCQlzLT5sb2NrID0gTlVMTDsKKwkJfQorCX0KKwlpZiAoZGV2LT5hdHRhY2hlZCAmJiBkZXYtPnVzZV9jb3VudCA9PSAxICYmIGRldi0+Y2xvc2UpCisJCWRldi0+Y2xvc2UoZGV2KTsKKworCW1vZHVsZV9wdXQoVEhJU19NT0RVTEUpOworCWlmIChkZXYtPmF0dGFjaGVkKQorCQltb2R1bGVfcHV0KGRldi0+ZHJpdmVyLT5tb2R1bGUpOworCisJZGV2LT51c2VfY291bnQtLTsKKworCW11dGV4X3VubG9jaygmZGV2LT5tdXRleCk7CisKKwlpZiAoZmlsZS0+Zl9mbGFncyAmIEZBU1lOQykKKwkJY29tZWRpX2Zhc3luYygtMSwgZmlsZSwgMCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjb21lZGlfZmFzeW5jKGludCBmZCwgc3RydWN0IGZpbGUgKmZpbGUsIGludCBvbikKK3sKKwljb25zdCB1bnNpZ25lZCBtaW5vciA9IGltaW5vcihmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSk7CisJc3RydWN0IGNvbWVkaV9kZXZpY2VfZmlsZV9pbmZvICpkZXZfZmlsZV9pbmZvID0KKwkgICAgY29tZWRpX2dldF9kZXZpY2VfZmlsZV9pbmZvKG1pbm9yKTsKKworCWNvbWVkaV9kZXZpY2UgKmRldiA9IGRldl9maWxlX2luZm8tPmRldmljZTsKKworCXJldHVybiBmYXN5bmNfaGVscGVyKGZkLCBmaWxlLCBvbiwgJmRldi0+YXN5bmNfcXVldWUpOworfQorCitjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGNvbWVkaV9mb3BzID0geworICAgICAgLm93bmVyID0JCVRISVNfTU9EVUxFLAorI2lmZGVmIEhBVkVfVU5MT0NLRURfSU9DVEwKKyAgICAgIC51bmxvY2tlZF9pb2N0bCA9CWNvbWVkaV91bmxvY2tlZF9pb2N0bCwKKyNlbHNlCisgICAgICAuaW9jdGwgPQkJY29tZWRpX2lvY3RsLAorI2VuZGlmCisjaWZkZWYgSEFWRV9DT01QQVRfSU9DVEwKKyAgICAgIC5jb21wYXRfaW9jdGwgPQljb21lZGlfY29tcGF0X2lvY3RsLAorI2VuZGlmCisgICAgICAub3BlbiA9CQljb21lZGlfb3BlbiwKKyAgICAgIC5yZWxlYXNlID0JY29tZWRpX2Nsb3NlLAorICAgICAgLnJlYWQgPQkJY29tZWRpX3JlYWQsCisgICAgICAud3JpdGUgPQkJY29tZWRpX3dyaXRlLAorICAgICAgLm1tYXAgPQkJY29tZWRpX21tYXAsCisgICAgICAucG9sbCA9CQljb21lZGlfcG9sbCwKKyAgICAgIC5mYXN5bmMgPQkJY29tZWRpX2Zhc3luYywKK307CisKK3N0cnVjdCBjbGFzcyAqY29tZWRpX2NsYXNzOworc3RhdGljIHN0cnVjdCBjZGV2IGNvbWVkaV9jZGV2OworCitzdGF0aWMgdm9pZCBjb21lZGlfY2xlYW51cF9sZWdhY3lfbWlub3JzKHZvaWQpCit7CisJdW5zaWduZWQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBDT01FRElfTlVNX0xFR0FDWV9NSU5PUlM7IGkrKykKKwkJY29tZWRpX2ZyZWVfYm9hcmRfbWlub3IoaSk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGNvbWVkaV9pbml0KHZvaWQpCit7CisJaW50IGk7CisJaW50IHJldHZhbDsKKworCXByaW50ayhLRVJOX0lORk8gImNvbWVkaTogdmVyc2lvbiAiIENPTUVESV9SRUxFQVNFCisJICAgICAgICIgLSBodHRwOi8vd3d3LmNvbWVkaS5vcmdcbiIpOworCisJbWVtc2V0KGNvbWVkaV9maWxlX2luZm9fdGFibGUsIDAsCisJICAgICAgIHNpemVvZihzdHJ1Y3QgY29tZWRpX2RldmljZV9maWxlX2luZm8gKikgKiBDT01FRElfTlVNX01JTk9SUyk7CisKKwlyZXR2YWwgPSByZWdpc3Rlcl9jaHJkZXZfcmVnaW9uKE1LREVWKENPTUVESV9NQUpPUiwgMCksCisJCQkJCUNPTUVESV9OVU1fTUlOT1JTLCAiY29tZWRpIik7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIC1FSU87CisJY2Rldl9pbml0KCZjb21lZGlfY2RldiwgJmNvbWVkaV9mb3BzKTsKKwljb21lZGlfY2Rldi5vd25lciA9IFRISVNfTU9EVUxFOworCWtvYmplY3Rfc2V0X25hbWUoJmNvbWVkaV9jZGV2LmtvYmosICJjb21lZGkiKTsKKwlpZiAoY2Rldl9hZGQoJmNvbWVkaV9jZGV2LCBNS0RFVihDT01FRElfTUFKT1IsIDApLCBDT01FRElfTlVNX01JTk9SUykpIHsKKwkJdW5yZWdpc3Rlcl9jaHJkZXZfcmVnaW9uKE1LREVWKENPTUVESV9NQUpPUiwgMCksCisJCQkJCSBDT01FRElfTlVNX01JTk9SUyk7CisJCXJldHVybiAtRUlPOworCX0KKwljb21lZGlfY2xhc3MgPSBjbGFzc19jcmVhdGUoVEhJU19NT0RVTEUsICJjb21lZGkiKTsKKwlpZiAoSVNfRVJSKGNvbWVkaV9jbGFzcykpIHsKKwkJcHJpbnRrKCJjb21lZGk6IGZhaWxlZCB0byBjcmVhdGUgY2xhc3MiKTsKKwkJY2Rldl9kZWwoJmNvbWVkaV9jZGV2KTsKKwkJdW5yZWdpc3Rlcl9jaHJkZXZfcmVnaW9uKE1LREVWKENPTUVESV9NQUpPUiwgMCksCisJCQkJCSBDT01FRElfTlVNX01JTk9SUyk7CisJCXJldHVybiBQVFJfRVJSKGNvbWVkaV9jbGFzcyk7CisJfQorCisJLyogWFhYIHJlcXVpcmVzIC9wcm9jIGludGVyZmFjZSAqLworCWNvbWVkaV9wcm9jX2luaXQoKTsKKworCS8qIGNyZWF0ZSBkZXZpY2VzIGZpbGVzIGZvciBsZWdhY3kvbWFudWFsIHVzZSAqLworCWZvciAoaSA9IDA7IGkgPCBDT01FRElfTlVNX0xFR0FDWV9NSU5PUlM7IGkrKykgeworCQlpbnQgbWlub3I7CisJCW1pbm9yID0gY29tZWRpX2FsbG9jX2JvYXJkX21pbm9yKE5VTEwpOworCQlpZiAobWlub3IgPCAwKSB7CisJCQljb21lZGlfY2xlYW51cF9sZWdhY3lfbWlub3JzKCk7CisJCQljZGV2X2RlbCgmY29tZWRpX2NkZXYpOworCQkJdW5yZWdpc3Rlcl9jaHJkZXZfcmVnaW9uKE1LREVWKENPTUVESV9NQUpPUiwgMCksCisJCQkJCQkgQ09NRURJX05VTV9NSU5PUlMpOworCQkJcmV0dXJuIG1pbm9yOworCQl9CisJfQorCisJY29tZWRpX3J0X2luaXQoKTsKKworCWNvbWVkaV9yZWdpc3Rlcl9pb2N0bDMyKCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGNvbWVkaV9jbGVhbnVwKHZvaWQpCit7CisJaW50IGk7CisKKwljb21lZGlfY2xlYW51cF9sZWdhY3lfbWlub3JzKCk7CisJZm9yIChpID0gMDsgaSA8IENPTUVESV9OVU1fTUlOT1JTOyArK2kpCisJCUJVR19PTihjb21lZGlfZmlsZV9pbmZvX3RhYmxlW2ldKTsKKworCisJY2xhc3NfZGVzdHJveShjb21lZGlfY2xhc3MpOworCWNkZXZfZGVsKCZjb21lZGlfY2Rldik7CisJdW5yZWdpc3Rlcl9jaHJkZXZfcmVnaW9uKE1LREVWKENPTUVESV9NQUpPUiwgMCksIENPTUVESV9OVU1fTUlOT1JTKTsKKworCWNvbWVkaV9wcm9jX2NsZWFudXAoKTsKKworCWNvbWVkaV9ydF9jbGVhbnVwKCk7CisKKwljb21lZGlfdW5yZWdpc3Rlcl9pb2N0bDMyKCk7Cit9CisKK21vZHVsZV9pbml0KGNvbWVkaV9pbml0KTsKK21vZHVsZV9leGl0KGNvbWVkaV9jbGVhbnVwKTsKKwordm9pZCBjb21lZGlfZXJyb3IoY29uc3QgY29tZWRpX2RldmljZSAqZGV2LCBjb25zdCBjaGFyICpzKQoreworCXJ0X3ByaW50aygiY29tZWRpJWQ6ICVzOiAlc1xuIiwgZGV2LT5taW5vciwgZGV2LT5kcml2ZXItPmRyaXZlcl9uYW1lLAorCQkgIHMpOworfQorCit2b2lkIGNvbWVkaV9ldmVudChjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKnMpCit7CisJY29tZWRpX2FzeW5jICphc3luYyA9IHMtPmFzeW5jOworCXVuc2lnbmVkIHJ1bmZsYWdzID0gMDsKKwl1bnNpZ25lZCBydW5mbGFnc19tYXNrID0gMDsKKworCS8qIERQUklOVEsoImNvbWVkaV9ldmVudCAweCV4XG4iLG1hc2spOyAqLworCisJaWYgKChjb21lZGlfZ2V0X3N1YmRldmljZV9ydW5mbGFncyhzKSAmIFNSRl9SVU5OSU5HKSA9PSAwKQorCQlyZXR1cm47CisKKwlpZiAocy0+YXN5bmMtPgorCSAgICBldmVudHMgJiAoQ09NRURJX0NCX0VPQSB8IENPTUVESV9DQl9FUlJPUiB8IENPTUVESV9DQl9PVkVSRkxPVykpIHsKKwkJcnVuZmxhZ3NfbWFzayB8PSBTUkZfUlVOTklORzsKKwl9CisJLyogcmVtZW1iZXIgaWYgYW4gZXJyb3IgZXZlbnQgaGFzIG9jY3VyZWQsIHNvIGFuIGVycm9yCisJICogY2FuIGJlIHJldHVybmVkIHRoZSBuZXh0IHRpbWUgdGhlIHVzZXIgZG9lcyBhIHJlYWQoKSAqLworCWlmIChzLT5hc3luYy0+ZXZlbnRzICYgKENPTUVESV9DQl9FUlJPUiB8IENPTUVESV9DQl9PVkVSRkxPVykpIHsKKwkJcnVuZmxhZ3NfbWFzayB8PSBTUkZfRVJST1I7CisJCXJ1bmZsYWdzIHw9IFNSRl9FUlJPUjsKKwl9CisJaWYgKHJ1bmZsYWdzX21hc2spIHsKKwkJLypzZXRzIFNSRl9FUlJPUiBhbmQgU1JGX1JVTk5JTkcgdG9nZXRoZXIgYXRvbWljYWxseSAqLworCQljb21lZGlfc2V0X3N1YmRldmljZV9ydW5mbGFncyhzLCBydW5mbGFnc19tYXNrLCBydW5mbGFncyk7CisJfQorCisJaWYgKGFzeW5jLT5jYl9tYXNrICYgcy0+YXN5bmMtPmV2ZW50cykgeworCQlpZiAoY29tZWRpX2dldF9zdWJkZXZpY2VfcnVuZmxhZ3MocykgJiBTUkZfVVNFUikgeworCisJCQlpZiAoZGV2LT5ydCkgeworI2lmZGVmIENPTkZJR19DT01FRElfUlQKKwkJCQkvKiBwZW5kIHdha2UgdXAgKi8KKwkJCQljb21lZGlfcnRfcGVuZF93YWtldXAoJmFzeW5jLT53YWl0X2hlYWQpOworI2Vsc2UKKwkJCQlwcmludGsKKwkJCQkgICAgKCJCVUc6IGNvbWVkaV9ldmVudCgpIGNvZGUgdW5yZWFjaGFibGVcbiIpOworI2VuZGlmCisJCQl9IGVsc2UgeworCQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmYXN5bmMtPndhaXRfaGVhZCk7CisJCQkJaWYgKHMtPnN1YmRldl9mbGFncyAmIFNERl9DTURfUkVBRCkgeworCQkJCQlraWxsX2Zhc3luYygmZGV2LT5hc3luY19xdWV1ZSwgU0lHSU8sCisJCQkJCQkgICAgUE9MTF9JTik7CisJCQkJfQorCQkJCWlmIChzLT5zdWJkZXZfZmxhZ3MgJiBTREZfQ01EX1dSSVRFKSB7CisJCQkJCWtpbGxfZmFzeW5jKCZkZXYtPmFzeW5jX3F1ZXVlLCBTSUdJTywKKwkJCQkJCSAgICBQT0xMX09VVCk7CisJCQkJfQorCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKGFzeW5jLT5jYl9mdW5jKQorCQkJCWFzeW5jLT5jYl9mdW5jKHMtPmFzeW5jLT5ldmVudHMsIGFzeW5jLT5jYl9hcmcpOworCQkJLyogWFhYIGJ1ZyBoZXJlLiAgSWYgc3ViZGV2aWNlIEEgaXMgcnQsIGFuZAorCQkJICogc3ViZGV2aWNlIEIgdHJpZXMgdG8gY2FsbGJhY2sgdG8gYSBub3JtYWwKKwkJCSAqIGxpbnV4IGtlcm5lbCBmdW5jdGlvbiwgaXQgd2lsbCBiZSBhdCB0aGUKKwkJCSAqIHdyb25nIHByaW9yaXR5LiAgU2luY2UgdGhpcyBpc24ndCB2ZXJ5CisJCQkgKiBjb21tb24sIEknbSBub3QgZ29pbmcgdG8gd29ycnkgYWJvdXQgaXQuICovCisJCX0KKwl9CisJcy0+YXN5bmMtPmV2ZW50cyA9IDA7Cit9CisKK3ZvaWQgY29tZWRpX3NldF9zdWJkZXZpY2VfcnVuZmxhZ3MoY29tZWRpX3N1YmRldmljZSAqcywgdW5zaWduZWQgbWFzaywKKwkJCQkgICB1bnNpZ25lZCBiaXRzKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwljb21lZGlfc3Bpbl9sb2NrX2lycXNhdmUoJnMtPnNwaW5fbG9jaywgZmxhZ3MpOworCXMtPnJ1bmZsYWdzICY9IH5tYXNrOworCXMtPnJ1bmZsYWdzIHw9IChiaXRzICYgbWFzayk7CisJY29tZWRpX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPnNwaW5fbG9jaywgZmxhZ3MpOworfQorCit1bnNpZ25lZCBjb21lZGlfZ2V0X3N1YmRldmljZV9ydW5mbGFncyhjb21lZGlfc3ViZGV2aWNlICpzKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgcnVuZmxhZ3M7CisKKwljb21lZGlfc3Bpbl9sb2NrX2lycXNhdmUoJnMtPnNwaW5fbG9jaywgZmxhZ3MpOworCXJ1bmZsYWdzID0gcy0+cnVuZmxhZ3M7CisJY29tZWRpX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPnNwaW5fbG9jaywgZmxhZ3MpOworCXJldHVybiBydW5mbGFnczsKK30KKworc3RhdGljIGludCBpc19kZXZpY2VfYnVzeShjb21lZGlfZGV2aWNlICpkZXYpCit7CisJY29tZWRpX3N1YmRldmljZSAqczsKKwlpbnQgaTsKKworCWlmICghZGV2LT5hdHRhY2hlZCkKKwkJcmV0dXJuIDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgZGV2LT5uX3N1YmRldmljZXM7IGkrKykgeworCQlzID0gZGV2LT5zdWJkZXZpY2VzICsgaTsKKwkJaWYgKHMtPmJ1c3kpCisJCQlyZXR1cm4gMTsKKwkJaWYgKHMtPmFzeW5jICYmIHMtPmFzeW5jLT5tbWFwX2NvdW50KQorCQkJcmV0dXJuIDE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgY29tZWRpX2RldmljZV9pbml0KGNvbWVkaV9kZXZpY2UgKmRldikKK3sKKwltZW1zZXQoZGV2LCAwLCBzaXplb2YoY29tZWRpX2RldmljZSkpOworCXNwaW5fbG9ja19pbml0KCZkZXYtPnNwaW5sb2NrKTsKKwltdXRleF9pbml0KCZkZXYtPm11dGV4KTsKKwlkZXYtPm1pbm9yID0gLTE7Cit9CisKK3ZvaWQgY29tZWRpX2RldmljZV9jbGVhbnVwKGNvbWVkaV9kZXZpY2UgKmRldikKK3sKKwlpZiAoZGV2ID09IE5VTEwpCisJCXJldHVybjsKKwltdXRleF9sb2NrKCZkZXYtPm11dGV4KTsKKwljb21lZGlfZGV2aWNlX2RldGFjaChkZXYpOworCW11dGV4X3VubG9jaygmZGV2LT5tdXRleCk7CisJbXV0ZXhfZGVzdHJveSgmZGV2LT5tdXRleCk7Cit9CisKK2ludCBjb21lZGlfYWxsb2NfYm9hcmRfbWlub3Ioc3RydWN0IGRldmljZSAqaGFyZHdhcmVfZGV2aWNlKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGNvbWVkaV9kZXZpY2VfZmlsZV9pbmZvICppbmZvOworCWRldmljZV9jcmVhdGVfcmVzdWx0X3R5cGUgKmNzZGV2OworCXVuc2lnbmVkIGk7CisKKwlpbmZvID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGNvbWVkaV9kZXZpY2VfZmlsZV9pbmZvKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGluZm8gPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisJaW5mby0+ZGV2aWNlID0ga3phbGxvYyhzaXplb2YoY29tZWRpX2RldmljZSksIEdGUF9LRVJORUwpOworCWlmIChpbmZvLT5kZXZpY2UgPT0gTlVMTCkgeworCQlrZnJlZShpbmZvKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCWNvbWVkaV9kZXZpY2VfaW5pdChpbmZvLT5kZXZpY2UpOworCWNvbWVkaV9zcGluX2xvY2tfaXJxc2F2ZSgmY29tZWRpX2ZpbGVfaW5mb190YWJsZV9sb2NrLCBmbGFncyk7CisJZm9yIChpID0gMDsgaSA8IENPTUVESV9OVU1fQk9BUkRfTUlOT1JTOyArK2kpIHsKKwkJaWYgKGNvbWVkaV9maWxlX2luZm9fdGFibGVbaV0gPT0gTlVMTCkgeworCQkJY29tZWRpX2ZpbGVfaW5mb190YWJsZVtpXSA9IGluZm87CisJCQlicmVhazsKKwkJfQorCX0KKwljb21lZGlfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY29tZWRpX2ZpbGVfaW5mb190YWJsZV9sb2NrLCBmbGFncyk7CisJaWYgKGkgPT0gQ09NRURJX05VTV9CT0FSRF9NSU5PUlMpIHsKKwkJY29tZWRpX2RldmljZV9jbGVhbnVwKGluZm8tPmRldmljZSk7CisJCWtmcmVlKGluZm8tPmRldmljZSk7CisJCWtmcmVlKGluZm8pOworCQlydF9wcmludGsKKwkJICAgICgiY29tZWRpOiBlcnJvcjogcmFuIG91dCBvZiBtaW5vciBudW1iZXJzIGZvciBib2FyZCBkZXZpY2UgZmlsZXMuXG4iKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisJaW5mby0+ZGV2aWNlLT5taW5vciA9IGk7CisJY3NkZXYgPSBDT01FRElfREVWSUNFX0NSRUFURShjb21lZGlfY2xhc3MsIE5VTEwsCisJCQkJICAgICBNS0RFVihDT01FRElfTUFKT1IsIGkpLCBOVUxMLAorCQkJCSAgICAgaGFyZHdhcmVfZGV2aWNlLCAiY29tZWRpJWkiLCBpKTsKKwlpZiAoIUlTX0VSUihjc2RldikpCisJCWluZm8tPmRldmljZS0+Y2xhc3NfZGV2ID0gY3NkZXY7CisKKwlyZXR1cm4gaTsKK30KKwordm9pZCBjb21lZGlfZnJlZV9ib2FyZF9taW5vcih1bnNpZ25lZCBtaW5vcikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBjb21lZGlfZGV2aWNlX2ZpbGVfaW5mbyAqaW5mbzsKKworCUJVR19PTihtaW5vciA+PSBDT01FRElfTlVNX0JPQVJEX01JTk9SUyk7CisJY29tZWRpX3NwaW5fbG9ja19pcnFzYXZlKCZjb21lZGlfZmlsZV9pbmZvX3RhYmxlX2xvY2ssIGZsYWdzKTsKKwlpbmZvID0gY29tZWRpX2ZpbGVfaW5mb190YWJsZVttaW5vcl07CisJY29tZWRpX2ZpbGVfaW5mb190YWJsZVttaW5vcl0gPSBOVUxMOworCWNvbWVkaV9zcGluX3VubG9ja19pcnFyZXN0b3JlKCZjb21lZGlfZmlsZV9pbmZvX3RhYmxlX2xvY2ssIGZsYWdzKTsKKworCWlmIChpbmZvKSB7CisJCWNvbWVkaV9kZXZpY2UgKmRldiA9IGluZm8tPmRldmljZTsKKwkJaWYgKGRldikgeworCQkJaWYgKGRldi0+Y2xhc3NfZGV2KSB7CisJCQkJZGV2aWNlX2Rlc3Ryb3koY29tZWRpX2NsYXNzLAorCQkJCQkgICAgICAgTUtERVYoQ09NRURJX01BSk9SLCBkZXYtPm1pbm9yKSk7CisJCQl9CisJCQljb21lZGlfZGV2aWNlX2NsZWFudXAoZGV2KTsKKwkJCWtmcmVlKGRldik7CisJCX0KKwkJa2ZyZWUoaW5mbyk7CisJfQorfQorCitpbnQgY29tZWRpX2FsbG9jX3N1YmRldmljZV9taW5vcihjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKnMpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgY29tZWRpX2RldmljZV9maWxlX2luZm8gKmluZm87CisJZGV2aWNlX2NyZWF0ZV9yZXN1bHRfdHlwZSAqY3NkZXY7CisJdW5zaWduZWQgaTsKKworCWluZm8gPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgY29tZWRpX2RldmljZV9maWxlX2luZm8pLCBHRlBfS0VSTkVMKTsKKwlpZiAoaW5mbyA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwlpbmZvLT5kZXZpY2UgPSBkZXY7CisJaW5mby0+cmVhZF9zdWJkZXZpY2UgPSBzOworCWluZm8tPndyaXRlX3N1YmRldmljZSA9IHM7CisJY29tZWRpX3NwaW5fbG9ja19pcnFzYXZlKCZjb21lZGlfZmlsZV9pbmZvX3RhYmxlX2xvY2ssIGZsYWdzKTsKKwlmb3IgKGkgPSBDT01FRElfRklSU1RfU1VCREVWSUNFX01JTk9SOyBpIDwgQ09NRURJX05VTV9CT0FSRF9NSU5PUlM7ICsraSkgeworCQlpZiAoY29tZWRpX2ZpbGVfaW5mb190YWJsZVtpXSA9PSBOVUxMKSB7CisJCQljb21lZGlfZmlsZV9pbmZvX3RhYmxlW2ldID0gaW5mbzsKKwkJCWJyZWFrOworCQl9CisJfQorCWNvbWVkaV9zcGluX3VubG9ja19pcnFyZXN0b3JlKCZjb21lZGlfZmlsZV9pbmZvX3RhYmxlX2xvY2ssIGZsYWdzKTsKKwlpZiAoaSA9PSBDT01FRElfTlVNX01JTk9SUykgeworCQlrZnJlZShpbmZvKTsKKwkJcnRfcHJpbnRrCisJCSAgICAoImNvbWVkaTogZXJyb3I6IHJhbiBvdXQgb2YgbWlub3IgbnVtYmVycyBmb3IgYm9hcmQgZGV2aWNlIGZpbGVzLlxuIik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCXMtPm1pbm9yID0gaTsKKwljc2RldiA9IENPTUVESV9ERVZJQ0VfQ1JFQVRFKGNvbWVkaV9jbGFzcywgZGV2LT5jbGFzc19kZXYsCisJCQkJICAgICBNS0RFVihDT01FRElfTUFKT1IsIGkpLCBOVUxMLCBOVUxMLAorCQkJCSAgICAgImNvbWVkaSVpX3N1YmQlaSIsIGRldi0+bWlub3IsCisJCQkJICAgICAoaW50KShzIC0gZGV2LT5zdWJkZXZpY2VzKSk7CisJaWYgKCFJU19FUlIoY3NkZXYpKQorCQlzLT5jbGFzc19kZXYgPSBjc2RldjsKKworCXJldHVybiBpOworfQorCit2b2lkIGNvbWVkaV9mcmVlX3N1YmRldmljZV9taW5vcihjb21lZGlfc3ViZGV2aWNlICpzKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGNvbWVkaV9kZXZpY2VfZmlsZV9pbmZvICppbmZvOworCisJaWYgKHMgPT0gTlVMTCkKKwkJcmV0dXJuOworCWlmIChzLT5taW5vciA8IDApCisJCXJldHVybjsKKworCUJVR19PTihzLT5taW5vciA+PSBDT01FRElfTlVNX01JTk9SUyk7CisJQlVHX09OKHMtPm1pbm9yIDwgQ09NRURJX0ZJUlNUX1NVQkRFVklDRV9NSU5PUik7CisKKwljb21lZGlfc3Bpbl9sb2NrX2lycXNhdmUoJmNvbWVkaV9maWxlX2luZm9fdGFibGVfbG9jaywgZmxhZ3MpOworCWluZm8gPSBjb21lZGlfZmlsZV9pbmZvX3RhYmxlW3MtPm1pbm9yXTsKKwljb21lZGlfZmlsZV9pbmZvX3RhYmxlW3MtPm1pbm9yXSA9IE5VTEw7CisJY29tZWRpX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNvbWVkaV9maWxlX2luZm9fdGFibGVfbG9jaywgZmxhZ3MpOworCisJaWYgKHMtPmNsYXNzX2RldikgeworCQlkZXZpY2VfZGVzdHJveShjb21lZGlfY2xhc3MsIE1LREVWKENPTUVESV9NQUpPUiwgcy0+bWlub3IpKTsKKwkJcy0+Y2xhc3NfZGV2ID0gTlVMTDsKKwl9CisJa2ZyZWUoaW5mbyk7Cit9CisKK3N0cnVjdCBjb21lZGlfZGV2aWNlX2ZpbGVfaW5mbyAqY29tZWRpX2dldF9kZXZpY2VfZmlsZV9pbmZvKHVuc2lnbmVkIG1pbm9yKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGNvbWVkaV9kZXZpY2VfZmlsZV9pbmZvICppbmZvOworCisJQlVHX09OKG1pbm9yID49IENPTUVESV9OVU1fTUlOT1JTKTsKKwljb21lZGlfc3Bpbl9sb2NrX2lycXNhdmUoJmNvbWVkaV9maWxlX2luZm9fdGFibGVfbG9jaywgZmxhZ3MpOworCWluZm8gPSBjb21lZGlfZmlsZV9pbmZvX3RhYmxlW21pbm9yXTsKKwljb21lZGlfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY29tZWRpX2ZpbGVfaW5mb190YWJsZV9sb2NrLCBmbGFncyk7CisJcmV0dXJuIGluZm87Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2NvbWVkaV9mb3BzLmggYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2NvbWVkaV9mb3BzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjNmOGRmNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvY29tZWRpX2ZvcHMuaApAQCAtMCwwICsxLDggQEAKKworI2lmbmRlZiBfQ09NRURJX0ZPUFNfSAorI2RlZmluZSBfQ09NRURJX0ZPUFNfSAorCitleHRlcm4gc3RydWN0IGNsYXNzICpjb21lZGlfY2xhc3M7CitleHRlcm4gY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBjb21lZGlfZm9wczsKKworI2VuZGlmIC8qIF9DT01FRElfRk9QU19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2NvbWVkaV9rc3ltcy5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9jb21lZGlfa3N5bXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MGQ1NzI4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9jb21lZGlfa3N5bXMuYwpAQCAtMCwwICsxLDc3IEBACisvKgorICAgIG1vZHVsZS9leHBfaW9jdGwuYworICAgIGV4cG9ydGVkIGNvbWVkaSBmdW5jdGlvbnMKKworICAgIENPTUVESSAtIExpbnV4IENvbnRyb2wgYW5kIE1lYXN1cmVtZW50IERldmljZSBJbnRlcmZhY2UKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctOCBEYXZpZCBBLiBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisqLworCisjZGVmaW5lIF9fTk9fVkVSU0lPTl9fCisjaWZuZGVmIEVYUE9SVF9TWU1UQUIKKyNkZWZpbmUgRVhQT1JUX1NZTVRBQgorI2VuZGlmCisKKyNpbmNsdWRlICJjb21lZGlkZXYuaCIKKworLyogZm9yIGRyaXZlcnMgKi8KK0VYUE9SVF9TWU1CT0woY29tZWRpX2RyaXZlcl9yZWdpc3Rlcik7CitFWFBPUlRfU1lNQk9MKGNvbWVkaV9kcml2ZXJfdW5yZWdpc3Rlcik7CisvL0VYUE9SVF9TWU1CT0woY29tZWRpX2J1ZmNoZWNrKTsKKy8vRVhQT1JUX1NZTUJPTChjb21lZGlfZG9uZSk7CisvL0VYUE9SVF9TWU1CT0woY29tZWRpX2Vycm9yX2RvbmUpOworRVhQT1JUX1NZTUJPTChjb21lZGlfZXJyb3IpOworLy9FWFBPUlRfU1lNQk9MKGNvbWVkaV9lb2J1Zik7CisvL0VYUE9SVF9TWU1CT0woY29tZWRpX2Vvcyk7CitFWFBPUlRfU1lNQk9MKGNvbWVkaV9ldmVudCk7CitFWFBPUlRfU1lNQk9MKGNvbWVkaV9nZXRfc3ViZGV2aWNlX3J1bmZsYWdzKTsKK0VYUE9SVF9TWU1CT0woY29tZWRpX3NldF9zdWJkZXZpY2VfcnVuZmxhZ3MpOworRVhQT1JUX1NZTUJPTChyYW5nZV9iaXBvbGFyMTApOworRVhQT1JUX1NZTUJPTChyYW5nZV9iaXBvbGFyNSk7CitFWFBPUlRfU1lNQk9MKHJhbmdlX2JpcG9sYXIyXzUpOworRVhQT1JUX1NZTUJPTChyYW5nZV91bmlwb2xhcjEwKTsKK0VYUE9SVF9TWU1CT0wocmFuZ2VfdW5pcG9sYXI1KTsKK0VYUE9SVF9TWU1CT0wocmFuZ2VfdW5rbm93bik7CisjaWZkZWYgQ09ORklHX0NPTUVESV9SVAorRVhQT1JUX1NZTUJPTChjb21lZGlfZnJlZV9pcnEpOworRVhQT1JUX1NZTUJPTChjb21lZGlfcmVxdWVzdF9pcnEpOworRVhQT1JUX1NZTUJPTChjb21lZGlfc3dpdGNoX3RvX3J0KTsKK0VYUE9SVF9TWU1CT0woY29tZWRpX3N3aXRjaF90b19ub25fcnQpOworRVhQT1JUX1NZTUJPTChydF9wZW5kX2NhbGwpOworI2VuZGlmCisjaWZkZWYgQ09ORklHX0NPTUVESV9ERUJVRworRVhQT1JUX1NZTUJPTChjb21lZGlfZGVidWcpOworI2VuZGlmCitFWFBPUlRfU1lNQk9MX0dQTChjb21lZGlfYWxsb2NfYm9hcmRfbWlub3IpOworRVhQT1JUX1NZTUJPTF9HUEwoY29tZWRpX2ZyZWVfYm9hcmRfbWlub3IpOworRVhQT1JUX1NZTUJPTF9HUEwoY29tZWRpX3BjaV9hdXRvX2NvbmZpZyk7CitFWFBPUlRfU1lNQk9MX0dQTChjb21lZGlfcGNpX2F1dG9fdW5jb25maWcpOworCisvKiBmb3Iga2NvbWVkaWxpYiAqLworRVhQT1JUX1NZTUJPTChjaGVja19jaGFubGlzdCk7CitFWFBPUlRfU1lNQk9MX0dQTChjb21lZGlfZ2V0X2RldmljZV9maWxlX2luZm8pOworCitFWFBPUlRfU1lNQk9MKGNvbWVkaV9idWZfcHV0KTsKK0VYUE9SVF9TWU1CT0woY29tZWRpX2J1Zl9nZXQpOworRVhQT1JUX1NZTUJPTChjb21lZGlfYnVmX3JlYWRfbl9hdmFpbGFibGUpOworRVhQT1JUX1NZTUJPTChjb21lZGlfYnVmX3dyaXRlX2ZyZWUpOworRVhQT1JUX1NZTUJPTChjb21lZGlfYnVmX3dyaXRlX2FsbG9jKTsKK0VYUE9SVF9TWU1CT0woY29tZWRpX2J1Zl9yZWFkX2ZyZWUpOworRVhQT1JUX1NZTUJPTChjb21lZGlfYnVmX3JlYWRfYWxsb2MpOworRVhQT1JUX1NZTUJPTChjb21lZGlfYnVmX21lbWNweV90byk7CitFWFBPUlRfU1lNQk9MKGNvbWVkaV9idWZfbWVtY3B5X2Zyb20pOworRVhQT1JUX1NZTUJPTChjb21lZGlfcmVzZXRfYXN5bmNfYnVmKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvY29tZWRpX3J0LmggYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2NvbWVkaV9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxODUyYmYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2NvbWVkaV9ydC5oCkBAIC0wLDAgKzEsMTUwIEBACisvKgorICAgIG1vZHVsZS9jb21lZGlfcnQuaAorICAgIGhlYWRlciBmaWxlIGZvciByZWFsLXRpbWUgc3RydWN0dXJlcywgdmFyaWFibGVzLCBhbmQgY29uc3RhbnRzCisKKyAgICBDT01FREkgLSBMaW51eCBDb250cm9sIGFuZCBNZWFzdXJlbWVudCBEZXZpY2UgSW50ZXJmYWNlCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDAgRGF2aWQgQS4gU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworKi8KKworI2lmbmRlZiBfQ09NRURJX1JUX0gKKyNkZWZpbmUgX0NPTUVESV9SVF9ICisKKyNpZm5kZWYgX0NPTUVESURFVl9ICisjZXJyb3IgY29tZWRpX3J0Lmggc2hvdWxkIG9ubHkgYmUgaW5jbHVkZWQgYnkgY29tZWRpZGV2LmgKKyNlbmRpZgorCisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L2tkZXZfdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKworI2lmZGVmIENPTkZJR19DT01FRElfUlQKKworI2lmZGVmIENPTkZJR19DT01FRElfUlRBSQorI2luY2x1ZGUgPHJ0YWkuaD4KKyNpbmNsdWRlIDxydGFpX3NjaGVkLmg+CisjaW5jbHVkZSA8cnRhaV92ZXJzaW9uLmg+CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQ09NRURJX1JUTAorI2luY2x1ZGUgPHJ0bF9jb3JlLmg+CisjaW5jbHVkZSA8cnRsX3RpbWUuaD4KKy8qICNpZmRlZiBSVExJTlVYX1ZFUlNJT05fQ09ERSAqLworI2luY2x1ZGUgPHJ0bF9zeW5jLmg+CisvKiAjZW5kaWYgKi8KKyNkZWZpbmUgcnRfcHJpbnRrIHJ0bF9wcmludGYKKyNlbmRpZgorI2lmZGVmIENPTkZJR19DT01FRElfRlVTSU9OCisjZGVmaW5lIHJ0X3ByaW50ayhmb3JtYXQsIGFyZ3MuLi4pIHByaW50ayhmb3JtYXQgLCAjIyBhcmdzKQorI2VuZGlmIC8qIENPTkZJR19DT01FRElfRlVTSU9OICovCisjaWZkZWYgQ09ORklHX1BSSU9SSVRZX0lSUQorI2RlZmluZSBydF9wcmludGsgcHJpbnRrCisjZW5kaWYKKworaW50IGNvbWVkaV9yZXF1ZXN0X2lycSh1bnNpZ25lZCBpbnQgaXJxLCBpcnFyZXR1cm5fdCgqaGFuZGxlcikgKGludCwKKwkJdm9pZCAqUFRfUkVHU19BUkcpLCB1bnNpZ25lZCBsb25nIGZsYWdzLCBjb25zdCBjaGFyICpkZXZpY2UsCisJCWNvbWVkaV9kZXZpY2UgKmRldl9pZCk7Cit2b2lkIGNvbWVkaV9mcmVlX2lycSh1bnNpZ25lZCBpbnQgaXJxLCBjb21lZGlfZGV2aWNlICpkZXZfaWQpOwordm9pZCBjb21lZGlfcnRfaW5pdCh2b2lkKTsKK3ZvaWQgY29tZWRpX3J0X2NsZWFudXAodm9pZCk7CitpbnQgY29tZWRpX3N3aXRjaF90b19ydChjb21lZGlfZGV2aWNlICpkZXYpOwordm9pZCBjb21lZGlfc3dpdGNoX3RvX25vbl9ydChjb21lZGlfZGV2aWNlICpkZXYpOwordm9pZCBjb21lZGlfcnRfcGVuZF93YWtldXAod2FpdF9xdWV1ZV9oZWFkX3QgKnEpOworZXh0ZXJuIGludCBydF9wZW5kX2NhbGwodm9pZCAoKmZ1bmMpIChpbnQgYXJnMSwgdm9pZCAqYXJnMiksIGludCBhcmcxLAorCXZvaWQgKmFyZzIpOworCisjZWxzZQorCisjZGVmaW5lIGNvbWVkaV9yZXF1ZXN0X2lycShhLCBiLCBjLCBkLCBlKSByZXF1ZXN0X2lycShhLCBiLCBjLCBkLCBlKQorI2RlZmluZSBjb21lZGlfZnJlZV9pcnEoYSwgYikgZnJlZV9pcnEoYSwgYikKKyNkZWZpbmUgY29tZWRpX3J0X2luaXQoKSBkbyB7fSB3aGlsZSAoMCkKKyNkZWZpbmUgY29tZWRpX3J0X2NsZWFudXAoKSBkbyB7fSB3aGlsZSAoMCkKKyNkZWZpbmUgY29tZWRpX3N3aXRjaF90b19ydChhKSAoLTEpCisjZGVmaW5lIGNvbWVkaV9zd2l0Y2hfdG9fbm9uX3J0KGEpIGRvIHt9IHdoaWxlICgwKQorI2RlZmluZSBjb21lZGlfcnRfcGVuZF93YWtldXAoYSkgZG8ge30gd2hpbGUgKDApCisKKyNkZWZpbmUgcnRfcHJpbnRrKGZvcm1hdCwgYXJncy4uLikJcHJpbnRrKGZvcm1hdCwgIyNhcmdzKQorCisjZW5kaWYKKworLyogRGVmaW5lIGEgc3Bpbl9sb2NrX2lycXNhdmUgZnVuY3Rpb24gdGhhdCB3aWxsIHdvcmsgd2l0aCBydCBvciB3aXRob3V0LgorICogVXNlIGlubGluZSBmdW5jdGlvbnMgaW5zdGVhZCBvZiBqdXN0IG1hY3JvcyB0byBlbmZvcmNlIHNvbWUgdHlwZSBjaGVja2luZy4KKyAqLworI2RlZmluZSBjb21lZGlfc3Bpbl9sb2NrX2lycXNhdmUobG9ja19wdHIsIGZsYWdzKSBcCisJKGZsYWdzID0gX19jb21lZGlfc3Bpbl9sb2NrX2lycXNhdmUobG9ja19wdHIpKQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgX19jb21lZGlfc3Bpbl9sb2NrX2lycXNhdmUoc3BpbmxvY2tfdCAqbG9ja19wdHIpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworI2lmIGRlZmluZWQoQ09ORklHX0NPTUVESV9SVEFJKQorCWZsYWdzID0gcnRfc3Bpbl9sb2NrX2lycXNhdmUobG9ja19wdHIpOworCisjZWxpZiBkZWZpbmVkKENPTkZJR19DT01FRElfUlRMKQorCXJ0bF9zcGluX2xvY2tfaXJxc2F2ZShsb2NrX3B0ciwgZmxhZ3MpOworCisjZWxpZiBkZWZpbmVkKENPTkZJR19DT01FRElfUlRMX1YxKQorCXJ0bF9zcGluX2xvY2tfaXJxc2F2ZShsb2NrX3B0ciwgZmxhZ3MpOworCisjZWxpZiBkZWZpbmVkKENPTkZJR19DT01FRElfRlVTSU9OKQorCXJ0aGFsX3NwaW5fbG9ja19pcnFzYXZlKGxvY2tfcHRyLCBmbGFncyk7CisjZWxzZQorCXNwaW5fbG9ja19pcnFzYXZlKGxvY2tfcHRyLCBmbGFncyk7CisKKyNlbmRpZgorCisJcmV0dXJuIGZsYWdzOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY29tZWRpX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoc3BpbmxvY2tfdCAqbG9ja19wdHIsCisJdW5zaWduZWQgbG9uZyBmbGFncykKK3sKKworI2lmIGRlZmluZWQoQ09ORklHX0NPTUVESV9SVEFJKQorCXJ0X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoZmxhZ3MsIGxvY2tfcHRyKTsKKworI2VsaWYgZGVmaW5lZChDT05GSUdfQ09NRURJX1JUTCkKKwlydGxfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShsb2NrX3B0ciwgZmxhZ3MpOworCisjZWxpZiBkZWZpbmVkKENPTkZJR19DT01FRElfUlRMX1YxKQorCXJ0bF9zcGluX3VubG9ja19pcnFyZXN0b3JlKGxvY2tfcHRyLCBmbGFncyk7CisjZWxpZiBkZWZpbmVkKENPTkZJR19DT01FRElfRlVTSU9OKQorCXJ0aGFsX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUobG9ja19wdHIsIGZsYWdzKTsKKyNlbHNlCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShsb2NrX3B0ciwgZmxhZ3MpOworCisjZW5kaWYKKworfQorCisvKiBkZWZpbmUgYSBSVCBzYWZlIHVkZWxheSAqLworc3RhdGljIGlubGluZSB2b2lkIGNvbWVkaV91ZGVsYXkodW5zaWduZWQgaW50IHVzZWMpCit7CisjaWYgZGVmaW5lZChDT05GSUdfQ09NRURJX1JUQUkpCisJc3RhdGljIGNvbnN0IGludCBuYW5vc2VjX3Blcl91c2VjID0gMTAwMDsKKwlydF9idXN5X3NsZWVwKHVzZWMgKiBuYW5vc2VjX3Blcl91c2VjKTsKKyNlbGlmIGRlZmluZWQoQ09ORklHX0NPTUVESV9SVEwpCisJc3RhdGljIGNvbnN0IGludCBuYW5vc2VjX3Blcl91c2VjID0gMTAwMDsKKwlydGxfZGVsYXkodXNlYyAqIG5hbm9zZWNfcGVyX3VzZWMpOworI2Vsc2UKKwl1ZGVsYXkodXNlYyk7CisjZW5kaWYKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2NvbWVkaWRldi5oIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9jb21lZGlkZXYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzM1MzU1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9jb21lZGlkZXYuaApAQCAtMCwwICsxLDUzNyBAQAorLyoKKyAgICBpbmNsdWRlL2xpbnV4L2NvbWVkaWRldi5oCisgICAgaGVhZGVyIGZpbGUgZm9yIGtlcm5lbC1vbmx5IHN0cnVjdHVyZXMsIHZhcmlhYmxlcywgYW5kIGNvbnN0YW50cworCisgICAgQ09NRURJIC0gTGludXggQ29udHJvbCBhbmQgTWVhc3VyZW1lbnQgRGV2aWNlIEludGVyZmFjZQorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDAwIERhdmlkIEEuIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyovCisKKyNpZm5kZWYgX0NPTUVESURFVl9ICisjZGVmaW5lIF9DT01FRElERVZfSAorCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L2tkZXZfdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSAiaW50ZXJydXB0LmgiCisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKworI2luY2x1ZGUgImNvbWVkaS5oIgorCisjZGVmaW5lIERQUklOVEsoZm9ybWF0LCBhcmdzLi4uKQlkbyB7CQlcCisJaWYgKGNvbWVkaV9kZWJ1ZykJCQkJXAorCQlwcmludGsoS0VSTl9ERUJVRyAiY29tZWRpOiAiIGZvcm1hdCAsICMjIGFyZ3MpOwlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIENPTUVESV9WRVJTSU9OKGEsIGIsIGMpICgoKGEpIDw8IDE2KSArICgoYikgPDwgOCkgKyAoYykpCisjZGVmaW5lIENPTUVESV9WRVJTSU9OX0NPREUgQ09NRURJX1ZFUlNJT04oQ09NRURJX01BSk9SVkVSU0lPTiwgQ09NRURJX01JTk9SVkVSU0lPTiwgQ09NRURJX01JQ1JPVkVSU0lPTikKKyNkZWZpbmUgQ09NRURJX1JFTEVBU0UgVkVSU0lPTgorCisjZGVmaW5lIENPTUVESV9JTklUQ0xFQU5VUF9OT01PRFVMRSh4KQkJCQkJXAorCXN0YXRpYyBpbnQgX19pbml0IHggIyMgX2luaXRfbW9kdWxlKHZvaWQpCQkJXAorCQl7cmV0dXJuIGNvbWVkaV9kcml2ZXJfcmVnaXN0ZXIoJih4KSk7fQkJCVwKKwlzdGF0aWMgdm9pZCBfX2V4aXQgeCAjIyBfY2xlYW51cF9tb2R1bGUodm9pZCkJCQlcCisJCXtjb21lZGlfZHJpdmVyX3VucmVnaXN0ZXIoJih4KSk7fSAJCQlcCisJbW9kdWxlX2luaXQoeCAjIyBfaW5pdF9tb2R1bGUpOwkJCQkJXAorCW1vZHVsZV9leGl0KHggIyMgX2NsZWFudXBfbW9kdWxlKTsJCQkJCVwKKworI2RlZmluZSBDT01FRElfTU9EVUxFX01BQ1JPUwkJCQkJCVwKKwlNT0RVTEVfQVVUSE9SKCJDb21lZGkgaHR0cDovL3d3dy5jb21lZGkub3JnIik7CQlcCisJTU9EVUxFX0RFU0NSSVBUSU9OKCJDb21lZGkgbG93LWxldmVsIGRyaXZlciIpOwkJCVwKKwlNT0RVTEVfTElDRU5TRSgiR1BMIik7CQkJCQkJXAorCisjZGVmaW5lIENPTUVESV9JTklUQ0xFQU5VUCh4KQkJCQkJCVwKKwlDT01FRElfTU9EVUxFX01BQ1JPUwkJXAorCUNPTUVESV9JTklUQ0xFQU5VUF9OT01PRFVMRSh4KQorCisjZGVmaW5lIENPTUVESV9QQ0lfSU5JVENMRUFOVVBfTk9NT0RVTEUoY29tZWRpX2RyaXZlciwgcGNpX2lkX3RhYmxlKSBcCisJc3RhdGljIGludCBfX2RldmluaXQgY29tZWRpX2RyaXZlciAjIyBfcGNpX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIFwKKwkJY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkgXAorCXsgXAorCQlyZXR1cm4gY29tZWRpX3BjaV9hdXRvX2NvbmZpZyhkZXYsIGNvbWVkaV9kcml2ZXIuZHJpdmVyX25hbWUpOyBcCisJfSBcCisJc3RhdGljIHZvaWQgX19kZXZleGl0IGNvbWVkaV9kcml2ZXIgIyMgX3BjaV9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKmRldikgXAorCXsgXAorCQljb21lZGlfcGNpX2F1dG9fdW5jb25maWcoZGV2KTsgXAorCX0gXAorCXN0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBjb21lZGlfZHJpdmVyICMjIF9wY2lfZHJpdmVyID0gXAorCXsgXAorCQkuaWRfdGFibGUgPSBwY2lfaWRfdGFibGUsIFwKKwkJLnByb2JlID0gJmNvbWVkaV9kcml2ZXIgIyMgX3BjaV9wcm9iZSwgXAorCQkucmVtb3ZlID0gX19kZXZleGl0X3AoJmNvbWVkaV9kcml2ZXIgIyMgX3BjaV9yZW1vdmUpIFwKKwl9OyBcCisJc3RhdGljIGludCBfX2luaXQgY29tZWRpX2RyaXZlciAjIyBfaW5pdF9tb2R1bGUodm9pZCkgXAorCXsgXAorCQlpbnQgcmV0dmFsOyBcCisJCXJldHZhbCA9IGNvbWVkaV9kcml2ZXJfcmVnaXN0ZXIoJmNvbWVkaV9kcml2ZXIpOyBcCisJCWlmIChyZXR2YWwgPCAwKSBcCisJCQlyZXR1cm4gcmV0dmFsOyBcCisJCWNvbWVkaV9kcml2ZXIgIyMgX3BjaV9kcml2ZXIubmFtZSA9IChjaGFyICopY29tZWRpX2RyaXZlci5kcml2ZXJfbmFtZTsgXAorCQlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmY29tZWRpX2RyaXZlciAjIyBfcGNpX2RyaXZlcik7IFwKKwl9IFwKKwlzdGF0aWMgdm9pZCBfX2V4aXQgY29tZWRpX2RyaXZlciAjIyBfY2xlYW51cF9tb2R1bGUodm9pZCkgXAorCXsgXAorCQlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmNvbWVkaV9kcml2ZXIgIyMgX3BjaV9kcml2ZXIpOyBcCisJCWNvbWVkaV9kcml2ZXJfdW5yZWdpc3RlcigmY29tZWRpX2RyaXZlcik7IFwKKwl9IFwKKwltb2R1bGVfaW5pdChjb21lZGlfZHJpdmVyICMjIF9pbml0X21vZHVsZSk7IFwKKwltb2R1bGVfZXhpdChjb21lZGlfZHJpdmVyICMjIF9jbGVhbnVwX21vZHVsZSk7CisKKyNkZWZpbmUgQ09NRURJX1BDSV9JTklUQ0xFQU5VUChjb21lZGlfZHJpdmVyLCBwY2lfaWRfdGFibGUpIFwKKwlDT01FRElfTU9EVUxFX01BQ1JPUyBcCisJQ09NRURJX1BDSV9JTklUQ0xFQU5VUF9OT01PRFVMRShjb21lZGlfZHJpdmVyLCBwY2lfaWRfdGFibGUpCisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9JTk9WQQkJMHgxMDRjCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfTkFUSU5TVAkJMHgxMDkzCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfREFUWAkJMHgxMTE2CisjZGVmaW5lIFBDSV9WRU5ET1JfSURfQ09NUFVURVJCT0FSRFMJMHgxMzA3CisjZGVmaW5lIFBDSV9WRU5ET1JfSURfQURWQU5URUNICQkweDEzZmUKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9SVEQJCTB4MTQzNQorI2RlZmluZSBQQ0lfVkVORE9SX0lEX0FNUExJQ09OCQkweDE0ZGMKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9BRExJTksJCTB4MTQ0YQorI2RlZmluZSBQQ0lfVkVORE9SX0lEX0lDUAkJMHgxMDRjCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfQ09OVEVDCQkweDEyMjEKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9NRUlMSEFVUwkJMHgxNDAyCisKKyNkZWZpbmUgQ09NRURJX05VTV9NSU5PUlMgMHgxMDAKKyNkZWZpbmUgQ09NRURJX05VTV9MRUdBQ1lfTUlOT1JTIDB4MTAKKyNkZWZpbmUgQ09NRURJX05VTV9CT0FSRF9NSU5PUlMgMHgzMAorI2RlZmluZSBDT01FRElfRklSU1RfU1VCREVWSUNFX01JTk9SIENPTUVESV9OVU1fQk9BUkRfTUlOT1JTCisKK3R5cGVkZWYgc3RydWN0IGNvbWVkaV9kZXZpY2Vfc3RydWN0IGNvbWVkaV9kZXZpY2U7Cit0eXBlZGVmIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlX3N0cnVjdCBjb21lZGlfc3ViZGV2aWNlOwordHlwZWRlZiBzdHJ1Y3QgY29tZWRpX2FzeW5jX3N0cnVjdCBjb21lZGlfYXN5bmM7Cit0eXBlZGVmIHN0cnVjdCBjb21lZGlfZHJpdmVyX3N0cnVjdCBjb21lZGlfZHJpdmVyOwordHlwZWRlZiBzdHJ1Y3QgY29tZWRpX2xyYW5nZV9zdHJ1Y3QgY29tZWRpX2xyYW5nZTsKKwordHlwZWRlZiBzdHJ1Y3QgZGV2aWNlIGRldmljZV9jcmVhdGVfcmVzdWx0X3R5cGU7CisKKyNkZWZpbmUgQ09NRURJX0RFVklDRV9DUkVBVEUoY3MsIHBhcmVudCwgZGV2dCwgZHJ2ZGF0YSwgZGV2aWNlLCBmbXQuLi4pIFwKKwlkZXZpY2VfY3JlYXRlKGNzLCAoKHBhcmVudCkgPyAocGFyZW50KSA6IChkZXZpY2UpKSwgZGV2dCwgZHJ2ZGF0YSwgZm10KQorCitzdHJ1Y3QgY29tZWRpX3N1YmRldmljZV9zdHJ1Y3QgeworCWNvbWVkaV9kZXZpY2UgKmRldmljZTsKKwlpbnQgdHlwZTsKKwlpbnQgbl9jaGFuOworCXZvbGF0aWxlIGludCBzdWJkZXZfZmxhZ3M7CisJaW50IGxlbl9jaGFubGlzdDsJLyogbWF4aW11bSBsZW5ndGggb2YgY2hhbm5lbC9nYWluIGxpc3QgKi8KKworCXZvaWQgKnByaXZhdGU7CisKKwljb21lZGlfYXN5bmMgKmFzeW5jOworCisJdm9pZCAqbG9jazsKKwl2b2lkICpidXN5OworCXVuc2lnbmVkIHJ1bmZsYWdzOworCXNwaW5sb2NrX3Qgc3Bpbl9sb2NrOworCisJaW50IGlvX2JpdHM7CisKKwlsc2FtcGxfdCBtYXhkYXRhOwkvKiBpZiBtYXhkYXRhPT0wLCB1c2UgbGlzdCAqLworCWNvbnN0IGxzYW1wbF90ICptYXhkYXRhX2xpc3Q7CS8qIGxpc3QgaXMgY2hhbm5lbCBzcGVjaWZpYyAqLworCisJdW5zaWduZWQgaW50IGZsYWdzOworCWNvbnN0IHVuc2lnbmVkIGludCAqZmxhZ2xpc3Q7CisKKwl1bnNpZ25lZCBpbnQgc2V0dGxpbmdfdGltZV8wOworCisJY29uc3QgY29tZWRpX2xyYW5nZSAqcmFuZ2VfdGFibGU7CisJY29uc3QgY29tZWRpX2xyYW5nZSAqY29uc3QgKnJhbmdlX3RhYmxlX2xpc3Q7CisKKwl1bnNpZ25lZCBpbnQgKmNoYW5saXN0OwkvKiBkcml2ZXItb3duZWQgY2hhbmxpc3QgKG5vdCB1c2VkKSAqLworCisJaW50ICgqaW5zbl9yZWFkKSAoY29tZWRpX2RldmljZSAqLCBjb21lZGlfc3ViZGV2aWNlICosIGNvbWVkaV9pbnNuICosCisJCWxzYW1wbF90ICopOworCWludCAoKmluc25fd3JpdGUpIChjb21lZGlfZGV2aWNlICosIGNvbWVkaV9zdWJkZXZpY2UgKiwgY29tZWRpX2luc24gKiwKKwkJbHNhbXBsX3QgKik7CisJaW50ICgqaW5zbl9iaXRzKSAoY29tZWRpX2RldmljZSAqLCBjb21lZGlfc3ViZGV2aWNlICosIGNvbWVkaV9pbnNuICosCisJCWxzYW1wbF90ICopOworCWludCAoKmluc25fY29uZmlnKSAoY29tZWRpX2RldmljZSAqLCBjb21lZGlfc3ViZGV2aWNlICosIGNvbWVkaV9pbnNuICosCisJCWxzYW1wbF90ICopOworCisJaW50ICgqZG9fY21kKSAoY29tZWRpX2RldmljZSAqLCBjb21lZGlfc3ViZGV2aWNlICopOworCWludCAoKmRvX2NtZHRlc3QpIChjb21lZGlfZGV2aWNlICosIGNvbWVkaV9zdWJkZXZpY2UgKiwgY29tZWRpX2NtZCAqKTsKKwlpbnQgKCpwb2xsKSAoY29tZWRpX2RldmljZSAqLCBjb21lZGlfc3ViZGV2aWNlICopOworCWludCAoKmNhbmNlbCkgKGNvbWVkaV9kZXZpY2UgKiwgY29tZWRpX3N1YmRldmljZSAqKTsKKwkvKiBpbnQgKCpkb19sb2NrKShjb21lZGlfZGV2aWNlICosY29tZWRpX3N1YmRldmljZSAqKTsgKi8KKwkvKiBpbnQgKCpkb191bmxvY2spKGNvbWVkaV9kZXZpY2UgKixjb21lZGlfc3ViZGV2aWNlICopOyAqLworCisJLyogY2FsbGVkIHdoZW4gdGhlIGJ1ZmZlciBjaGFuZ2VzICovCisJaW50ICgqYnVmX2NoYW5nZSkgKGNvbWVkaV9kZXZpY2UgKmRldiwgY29tZWRpX3N1YmRldmljZSAqcywKKwkJdW5zaWduZWQgbG9uZyBuZXdfc2l6ZSk7CisKKwl2b2lkICgqbXVuZ2UpIChjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKnMsIHZvaWQgKmRhdGEsCisJCXVuc2lnbmVkIGludCBudW1fYnl0ZXMsIHVuc2lnbmVkIGludCBzdGFydF9jaGFuX2luZGV4KTsKKwllbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBhc3luY19kbWFfZGlyOworCisJdW5zaWduZWQgaW50IHN0YXRlOworCisJZGV2aWNlX2NyZWF0ZV9yZXN1bHRfdHlwZSAqY2xhc3NfZGV2OworCWludCBtaW5vcjsKK307CisKK3N0cnVjdCBjb21lZGlfYnVmX3BhZ2UgeworCXZvaWQgKnZpcnRfYWRkcjsKKwlkbWFfYWRkcl90IGRtYV9hZGRyOworfTsKKworc3RydWN0IGNvbWVkaV9hc3luY19zdHJ1Y3QgeworCWNvbWVkaV9zdWJkZXZpY2UgKnN1YmRldmljZTsKKworCXZvaWQgKnByZWFsbG9jX2J1ZjsJLyogcHJlLWFsbG9jYXRlZCBidWZmZXIgKi8KKwl1bnNpZ25lZCBpbnQgcHJlYWxsb2NfYnVmc3o7CS8qIGJ1ZmZlciBzaXplLCBpbiBieXRlcyAqLworCXN0cnVjdCBjb21lZGlfYnVmX3BhZ2UgKmJ1Zl9wYWdlX2xpc3Q7CS8qIHZpcnR1YWwgYW5kIGRtYSBhZGRyZXNzIG9mIGVhY2ggcGFnZSAqLworCXVuc2lnbmVkIG5fYnVmX3BhZ2VzOwkvKiBudW0gZWxlbWVudHMgaW4gYnVmX3BhZ2VfbGlzdCAqLworCisJdW5zaWduZWQgaW50IG1heF9idWZzaXplOwkvKiBtYXhpbXVtIGJ1ZmZlciBzaXplLCBieXRlcyAqLworCXVuc2lnbmVkIGludCBtbWFwX2NvdW50OwkvKiBjdXJyZW50IG51bWJlciBvZiBtbWFwcyBvZiBwcmVhbGxvY19idWYgKi8KKworCXVuc2lnbmVkIGludCBidWZfd3JpdGVfY291bnQ7CS8qIGJ5dGUgY291bnQgZm9yIHdyaXRlciAod3JpdGUgY29tcGxldGVkKSAqLworCXVuc2lnbmVkIGludCBidWZfd3JpdGVfYWxsb2NfY291bnQ7CS8qIGJ5dGUgY291bnQgZm9yIHdyaXRlciAoYWxsb2NhdGVkIGZvciB3cml0aW5nKSAqLworCXVuc2lnbmVkIGludCBidWZfcmVhZF9jb3VudDsJLyogYnl0ZSBjb3VudCBmb3IgcmVhZGVyIChyZWFkIGNvbXBsZXRlZCkgKi8KKwl1bnNpZ25lZCBpbnQgYnVmX3JlYWRfYWxsb2NfY291bnQ7CS8qIGJ5dGUgY291bnQgZm9yIHJlYWRlciAoYWxsb2NhdGVkIGZvciByZWFkaW5nKSAqLworCisJdW5zaWduZWQgaW50IGJ1Zl93cml0ZV9wdHI7CS8qIGJ1ZmZlciBtYXJrZXIgZm9yIHdyaXRlciAqLworCXVuc2lnbmVkIGludCBidWZfcmVhZF9wdHI7CS8qIGJ1ZmZlciBtYXJrZXIgZm9yIHJlYWRlciAqLworCisJdW5zaWduZWQgaW50IGN1cl9jaGFuOwkvKiB1c2VsZXNzIGNoYW5uZWwgbWFya2VyIGZvciBpbnRlcnJ1cHQgKi8KKwkvKiBudW1iZXIgb2YgYnl0ZXMgdGhhdCBoYXZlIGJlZW4gcmVjZWl2ZWQgZm9yIGN1cnJlbnQgc2NhbiAqLworCXVuc2lnbmVkIGludCBzY2FuX3Byb2dyZXNzOworCS8qIGtlZXBzIHRyYWNrIG9mIHdoZXJlIHdlIGFyZSBpbiBjaGFubGlzdCBhcyBmb3IgbXVuZ2luZyAqLworCXVuc2lnbmVkIGludCBtdW5nZV9jaGFuOworCS8qIG51bWJlciBvZiBieXRlcyB0aGF0IGhhdmUgYmVlbiBtdW5nZWQgKi8KKwl1bnNpZ25lZCBpbnQgbXVuZ2VfY291bnQ7CisJLyogYnVmZmVyIG1hcmtlciBmb3IgbXVuZ2luZyAqLworCXVuc2lnbmVkIGludCBtdW5nZV9wdHI7CisKKwl1bnNpZ25lZCBpbnQgZXZlbnRzOwkvKiBldmVudHMgdGhhdCBoYXZlIG9jY3VycmVkICovCisKKwljb21lZGlfY21kIGNtZDsKKworCXdhaXRfcXVldWVfaGVhZF90IHdhaXRfaGVhZDsKKworCS8qIGNhbGxiYWNrIHN0dWZmICovCisJdW5zaWduZWQgaW50IGNiX21hc2s7CisJaW50ICgqY2JfZnVuYykgKHVuc2lnbmVkIGludCBmbGFncywgdm9pZCAqKTsKKwl2b2lkICpjYl9hcmc7CisKKwlpbnQgKCppbnR0cmlnKSAoY29tZWRpX2RldmljZSAqZGV2LCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJdW5zaWduZWQgaW50IHgpOworfTsKKworc3RydWN0IGNvbWVkaV9kcml2ZXJfc3RydWN0IHsKKwlzdHJ1Y3QgY29tZWRpX2RyaXZlcl9zdHJ1Y3QgKm5leHQ7CisKKwljb25zdCBjaGFyICpkcml2ZXJfbmFtZTsKKwlzdHJ1Y3QgbW9kdWxlICptb2R1bGU7CisJaW50ICgqYXR0YWNoKSAoY29tZWRpX2RldmljZSAqLCBjb21lZGlfZGV2Y29uZmlnICopOworCWludCAoKmRldGFjaCkgKGNvbWVkaV9kZXZpY2UgKik7CisKKwkvKiBudW1iZXIgb2YgZWxlbWVudHMgaW4gYm9hcmRfbmFtZSBhbmQgYm9hcmRfaWQgYXJyYXlzICovCisJdW5zaWduZWQgaW50IG51bV9uYW1lczsKKwljb25zdCBjaGFyICpjb25zdCAqYm9hcmRfbmFtZTsKKwkvKiBvZmZzZXQgaW4gYnl0ZXMgZnJvbSBvbmUgYm9hcmQgbmFtZSBwb2ludGVyIHRvIHRoZSBuZXh0ICovCisJaW50IG9mZnNldDsKK307CisKK3N0cnVjdCBjb21lZGlfZGV2aWNlX3N0cnVjdCB7CisJaW50IHVzZV9jb3VudDsKKwljb21lZGlfZHJpdmVyICpkcml2ZXI7CisJdm9pZCAqcHJpdmF0ZTsKKworCWRldmljZV9jcmVhdGVfcmVzdWx0X3R5cGUgKmNsYXNzX2RldjsKKwlpbnQgbWlub3I7CisJLyogaHdfZGV2IGlzIHBhc3NlZCB0byBkbWFfYWxsb2NfY29oZXJlbnQgd2hlbiBhbGxvY2F0aW5nIGFzeW5jIGJ1ZmZlcnMKKwkgKiBmb3Igc3ViZGV2aWNlcyB0aGF0IGhhdmUgYXN5bmNfZG1hX2RpciBzZXQgdG8gc29tZXRoaW5nIG90aGVyIHRoYW4KKwkgKiBETUFfTk9ORSAqLworCXN0cnVjdCBkZXZpY2UgKmh3X2RldjsKKworCWNvbnN0IGNoYXIgKmJvYXJkX25hbWU7CisJY29uc3Qgdm9pZCAqYm9hcmRfcHRyOworCWludCBhdHRhY2hlZDsKKwlpbnQgcnQ7CisJc3BpbmxvY2tfdCBzcGlubG9jazsKKwlzdHJ1Y3QgbXV0ZXggbXV0ZXg7CisJaW50IGluX3JlcXVlc3RfbW9kdWxlOworCisJaW50IG5fc3ViZGV2aWNlczsKKwljb21lZGlfc3ViZGV2aWNlICpzdWJkZXZpY2VzOworCisJLyogZHVtYiAqLworCXVuc2lnbmVkIGxvbmcgaW9iYXNlOworCXVuc2lnbmVkIGludCBpcnE7CisKKwljb21lZGlfc3ViZGV2aWNlICpyZWFkX3N1YmRldjsKKwljb21lZGlfc3ViZGV2aWNlICp3cml0ZV9zdWJkZXY7CisKKwlzdHJ1Y3QgZmFzeW5jX3N0cnVjdCAqYXN5bmNfcXVldWU7CisKKwl2b2lkICgqb3BlbikgKGNvbWVkaV9kZXZpY2UgKmRldik7CisJdm9pZCAoKmNsb3NlKSAoY29tZWRpX2RldmljZSAqZGV2KTsKK307CisKK3N0cnVjdCBjb21lZGlfZGV2aWNlX2ZpbGVfaW5mbyB7CisJY29tZWRpX2RldmljZSAqZGV2aWNlOworCWNvbWVkaV9zdWJkZXZpY2UgKnJlYWRfc3ViZGV2aWNlOworCWNvbWVkaV9zdWJkZXZpY2UgKndyaXRlX3N1YmRldmljZTsKK307CisKKyNpZmRlZiBDT05GSUdfQ09NRURJX0RFQlVHCitleHRlcm4gaW50IGNvbWVkaV9kZWJ1ZzsKKyNlbHNlCitzdGF0aWMgY29uc3QgaW50IGNvbWVkaV9kZWJ1ZzsKKyNlbmRpZgorCisvKgorICogZnVuY3Rpb24gcHJvdG90eXBlcworICovCisKK3ZvaWQgY29tZWRpX2V2ZW50KGNvbWVkaV9kZXZpY2UgKmRldiwgY29tZWRpX3N1YmRldmljZSAqcyk7Cit2b2lkIGNvbWVkaV9lcnJvcihjb25zdCBjb21lZGlfZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKnMpOworCisvKiB3ZSBjYW4gZXhwYW5kIHRoZSBudW1iZXIgb2YgYml0cyB1c2VkIHRvIGVuY29kZSBkZXZpY2VzL3N1YmRldmljZXMgaW50bworIHRoZSBtaW5vciBudW1iZXIgc29vbiwgYWZ0ZXIgbW9yZSBkaXN0cm9zIHN1cHBvcnQgPiA4IGJpdCBtaW5vciBudW1iZXJzCisgKGxpa2UgYWZ0ZXIgRGViaWFuIEV0Y2ggZ2V0cyByZWxlYXNlZCkgKi8KK2VudW0gY29tZWRpX21pbm9yX2JpdHMgeworCUNPTUVESV9ERVZJQ0VfTUlOT1JfTUFTSyA9IDB4ZiwKKwlDT01FRElfU1VCREVWSUNFX01JTk9SX01BU0sgPSAweGYwCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIENPTUVESV9TVUJERVZJQ0VfTUlOT1JfU0hJRlQgPSA0Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIENPTUVESV9TVUJERVZJQ0VfTUlOT1JfT0ZGU0VUID0gMTsKKworc3RydWN0IGNvbWVkaV9kZXZpY2VfZmlsZV9pbmZvICpjb21lZGlfZ2V0X2RldmljZV9maWxlX2luZm8odW5zaWduZWQgbWlub3IpOworCitzdGF0aWMgaW5saW5lIGNvbWVkaV9zdWJkZXZpY2UgKmNvbWVkaV9nZXRfcmVhZF9zdWJkZXZpY2UoCisJCQkJY29uc3Qgc3RydWN0IGNvbWVkaV9kZXZpY2VfZmlsZV9pbmZvICppbmZvKQoreworCWlmIChpbmZvLT5yZWFkX3N1YmRldmljZSkKKwkJcmV0dXJuIGluZm8tPnJlYWRfc3ViZGV2aWNlOworCWlmIChpbmZvLT5kZXZpY2UgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisJcmV0dXJuIGluZm8tPmRldmljZS0+cmVhZF9zdWJkZXY7Cit9CisKK3N0YXRpYyBpbmxpbmUgY29tZWRpX3N1YmRldmljZSAqY29tZWRpX2dldF93cml0ZV9zdWJkZXZpY2UoCisJCQkJY29uc3Qgc3RydWN0IGNvbWVkaV9kZXZpY2VfZmlsZV9pbmZvICppbmZvKQoreworCWlmIChpbmZvLT53cml0ZV9zdWJkZXZpY2UpCisJCXJldHVybiBpbmZvLT53cml0ZV9zdWJkZXZpY2U7CisJaWYgKGluZm8tPmRldmljZSA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gaW5mby0+ZGV2aWNlLT53cml0ZV9zdWJkZXY7Cit9CisKK3ZvaWQgY29tZWRpX2RldmljZV9kZXRhY2goY29tZWRpX2RldmljZSAqZGV2KTsKK2ludCBjb21lZGlfZGV2aWNlX2F0dGFjaChjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9kZXZjb25maWcgKml0KTsKK2ludCBjb21lZGlfZHJpdmVyX3JlZ2lzdGVyKGNvbWVkaV9kcml2ZXIgKik7CitpbnQgY29tZWRpX2RyaXZlcl91bnJlZ2lzdGVyKGNvbWVkaV9kcml2ZXIgKik7CisKK3ZvaWQgaW5pdF9wb2xsaW5nKHZvaWQpOwordm9pZCBjbGVhbnVwX3BvbGxpbmcodm9pZCk7Cit2b2lkIHN0YXJ0X3BvbGxpbmcoY29tZWRpX2RldmljZSAqKTsKK3ZvaWQgc3RvcF9wb2xsaW5nKGNvbWVkaV9kZXZpY2UgKik7CisKK2ludCBjb21lZGlfYnVmX2FsbG9jKGNvbWVkaV9kZXZpY2UgKmRldiwgY29tZWRpX3N1YmRldmljZSAqcywgdW5zaWduZWQgbG9uZworCW5ld19zaXplKTsKKworI2lmZGVmIENPTkZJR19QUk9DX0ZTCit2b2lkIGNvbWVkaV9wcm9jX2luaXQodm9pZCk7Cit2b2lkIGNvbWVkaV9wcm9jX2NsZWFudXAodm9pZCk7CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIGNvbWVkaV9wcm9jX2luaXQodm9pZCkKK3sKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCBjb21lZGlfcHJvY19jbGVhbnVwKHZvaWQpCit7Cit9CisjZW5kaWYKKworLyogc3ViZGV2aWNlIHJ1bmZsYWdzICovCitlbnVtIHN1YmRldmljZV9ydW5mbGFncyB7CisJU1JGX1VTRVIgPSAweDAwMDAwMDAxLAorCVNSRl9SVCA9IDB4MDAwMDAwMDIsCisJLyogaW5kaWNhdGVzIGFuIENPTUVESV9DQl9FUlJPUiBldmVudCBoYXMgb2NjdXJyZWQgc2luY2UgdGhlIGxhc3QKKwkgKiBjb21tYW5kIHdhcyBzdGFydGVkICovCisJU1JGX0VSUk9SID0gMHgwMDAwMDAwNCwKKwlTUkZfUlVOTklORyA9IDB4MDgwMDAwMDAKK307CisKKy8qCisgICB2YXJpb3VzIGludGVybmFsIGNvbWVkaSBmdW5jdGlvbnMKKyAqLworCitpbnQgZG9fcmFuZ2VpbmZvX2lvY3RsKGNvbWVkaV9kZXZpY2UgKmRldiwgY29tZWRpX3JhbmdlaW5mbyAqYXJnKTsKK2ludCBjaGVja19jaGFubGlzdChjb21lZGlfc3ViZGV2aWNlICpzLCBpbnQgbiwgdW5zaWduZWQgaW50ICpjaGFubGlzdCk7Cit2b2lkIGNvbWVkaV9zZXRfc3ViZGV2aWNlX3J1bmZsYWdzKGNvbWVkaV9zdWJkZXZpY2UgKnMsIHVuc2lnbmVkIG1hc2ssCisJdW5zaWduZWQgYml0cyk7Cit1bnNpZ25lZCBjb21lZGlfZ2V0X3N1YmRldmljZV9ydW5mbGFncyhjb21lZGlfc3ViZGV2aWNlICpzKTsKK2ludCBpbnNuX2ludmFsKGNvbWVkaV9kZXZpY2UgKmRldiwgY29tZWRpX3N1YmRldmljZSAqcywKKwljb21lZGlfaW5zbiAqaW5zbiwgbHNhbXBsX3QgKmRhdGEpOworCisvKiByYW5nZSBzdHVmZiAqLworCisjZGVmaW5lIFJBTkdFKGEsIGIpCQl7KGEpKjFlNiwgKGIpKjFlNiwgMH0KKyNkZWZpbmUgUkFOR0VfZXh0KGEsIGIpCQl7KGEpKjFlNiwgKGIpKjFlNiwgUkZfRVhURVJOQUx9CisjZGVmaW5lIFJBTkdFX21BKGEsIGIpCQl7KGEpKjFlNiwgKGIpKjFlNiwgVU5JVF9tQX0KKyNkZWZpbmUgUkFOR0VfdW5pdGxlc3MoYSwgYikJeyhhKSoxZTYsIChiKSoxZTYsIDB9CS8qIFhYWCAqLworI2RlZmluZSBCSVBfUkFOR0UoYSkJCXstKGEpKjFlNiwgKGEpKjFlNiwgMH0KKyNkZWZpbmUgVU5JX1JBTkdFKGEpCQl7MCwgKGEpKjFlNiwgMH0KKworZXh0ZXJuIGNvbnN0IGNvbWVkaV9scmFuZ2UgcmFuZ2VfYmlwb2xhcjEwOworZXh0ZXJuIGNvbnN0IGNvbWVkaV9scmFuZ2UgcmFuZ2VfYmlwb2xhcjU7CitleHRlcm4gY29uc3QgY29tZWRpX2xyYW5nZSByYW5nZV9iaXBvbGFyMl81OworZXh0ZXJuIGNvbnN0IGNvbWVkaV9scmFuZ2UgcmFuZ2VfdW5pcG9sYXIxMDsKK2V4dGVybiBjb25zdCBjb21lZGlfbHJhbmdlIHJhbmdlX3VuaXBvbGFyNTsKK2V4dGVybiBjb25zdCBjb21lZGlfbHJhbmdlIHJhbmdlX3Vua25vd247CisKKyNkZWZpbmUgcmFuZ2VfZGlnaXRhbAkJcmFuZ2VfdW5pcG9sYXI1CisKKyNpZiBfX0dOVUNfXyA+PSAzCisjZGVmaW5lIEdDQ19aRVJPX0xFTkdUSF9BUlJBWQorI2Vsc2UKKyNkZWZpbmUgR0NDX1pFUk9fTEVOR1RIX0FSUkFZIDAKKyNlbmRpZgorCitzdHJ1Y3QgY29tZWRpX2xyYW5nZV9zdHJ1Y3QgeworCWludCBsZW5ndGg7CisJY29tZWRpX2tyYW5nZSByYW5nZVtHQ0NfWkVST19MRU5HVEhfQVJSQVldOworfTsKKworLyogc29tZSBzaWxseSBsaXR0bGUgaW5saW5lIGZ1bmN0aW9ucyAqLworCitzdGF0aWMgaW5saW5lIGludCBhbGxvY19zdWJkZXZpY2VzKGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCQkgICB1bnNpZ25lZCBpbnQgbnVtX3N1YmRldmljZXMpCit7CisJdW5zaWduZWQgaTsKKworCWRldi0+bl9zdWJkZXZpY2VzID0gbnVtX3N1YmRldmljZXM7CisJZGV2LT5zdWJkZXZpY2VzID0KKwkJa2NhbGxvYyhudW1fc3ViZGV2aWNlcywgc2l6ZW9mKGNvbWVkaV9zdWJkZXZpY2UpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRldi0+c3ViZGV2aWNlcykKKwkJcmV0dXJuIC1FTk9NRU07CisJZm9yIChpID0gMDsgaSA8IG51bV9zdWJkZXZpY2VzOyArK2kpIHsKKwkJZGV2LT5zdWJkZXZpY2VzW2ldLmRldmljZSA9IGRldjsKKwkJZGV2LT5zdWJkZXZpY2VzW2ldLmFzeW5jX2RtYV9kaXIgPSBETUFfTk9ORTsKKwkJc3Bpbl9sb2NrX2luaXQoJmRldi0+c3ViZGV2aWNlc1tpXS5zcGluX2xvY2spOworCQlkZXYtPnN1YmRldmljZXNbaV0ubWlub3IgPSAtMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGFsbG9jX3ByaXZhdGUoY29tZWRpX2RldmljZSAqZGV2LCBpbnQgc2l6ZSkKK3sKKwlkZXYtPnByaXZhdGUgPSBremFsbG9jKHNpemUsIEdGUF9LRVJORUwpOworCWlmICghZGV2LT5wcml2YXRlKQorCQlyZXR1cm4gLUVOT01FTTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgYnl0ZXNfcGVyX3NhbXBsZShjb25zdCBjb21lZGlfc3ViZGV2aWNlICpzdWJkKQoreworCWlmIChzdWJkLT5zdWJkZXZfZmxhZ3MgJiBTREZfTFNBTVBMKQorCQlyZXR1cm4gc2l6ZW9mKGxzYW1wbF90KTsKKwllbHNlCisJCXJldHVybiBzaXplb2Yoc2FtcGxfdCk7Cit9CisKKy8qIG11c3QgYmUgdXNlZCBpbiBhdHRhY2ggdG8gc2V0IGRldi0+aHdfZGV2IGlmIHlvdSB3aXNoIHRvIGRtYSBkaXJlY3RseQoraW50byBjb21lZGkncyBidWZmZXIgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBjb21lZGlfc2V0X2h3X2Rldihjb21lZGlfZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2UgKmh3X2RldikKK3sKKwlpZiAoZGV2LT5od19kZXYpCisJCXB1dF9kZXZpY2UoZGV2LT5od19kZXYpOworCisJZGV2LT5od19kZXYgPSBod19kZXY7CisJaWYgKGRldi0+aHdfZGV2KSB7CisJCWRldi0+aHdfZGV2ID0gZ2V0X2RldmljZShkZXYtPmh3X2Rldik7CisJCUJVR19PTihkZXYtPmh3X2RldiA9PSBOVUxMKTsKKwl9Cit9CisKK2ludCBjb21lZGlfYnVmX3B1dChjb21lZGlfYXN5bmMgKmFzeW5jLCBzYW1wbF90IHgpOworaW50IGNvbWVkaV9idWZfZ2V0KGNvbWVkaV9hc3luYyAqYXN5bmMsIHNhbXBsX3QgKngpOworCit1bnNpZ25lZCBpbnQgY29tZWRpX2J1Zl93cml0ZV9uX2F2YWlsYWJsZShjb21lZGlfYXN5bmMgKmFzeW5jKTsKK3Vuc2lnbmVkIGludCBjb21lZGlfYnVmX3dyaXRlX2FsbG9jKGNvbWVkaV9hc3luYyAqYXN5bmMsIHVuc2lnbmVkIGludCBuYnl0ZXMpOwordW5zaWduZWQgaW50IGNvbWVkaV9idWZfd3JpdGVfYWxsb2Nfc3RyaWN0KGNvbWVkaV9hc3luYyAqYXN5bmMsCisJdW5zaWduZWQgaW50IG5ieXRlcyk7Cit1bnNpZ25lZCBjb21lZGlfYnVmX3dyaXRlX2ZyZWUoY29tZWRpX2FzeW5jICphc3luYywgdW5zaWduZWQgaW50IG5ieXRlcyk7Cit1bnNpZ25lZCBjb21lZGlfYnVmX3JlYWRfYWxsb2MoY29tZWRpX2FzeW5jICphc3luYywgdW5zaWduZWQgbmJ5dGVzKTsKK3Vuc2lnbmVkIGNvbWVkaV9idWZfcmVhZF9mcmVlKGNvbWVkaV9hc3luYyAqYXN5bmMsIHVuc2lnbmVkIGludCBuYnl0ZXMpOwordW5zaWduZWQgaW50IGNvbWVkaV9idWZfcmVhZF9uX2F2YWlsYWJsZShjb21lZGlfYXN5bmMgKmFzeW5jKTsKK3ZvaWQgY29tZWRpX2J1Zl9tZW1jcHlfdG8oY29tZWRpX2FzeW5jICphc3luYywgdW5zaWduZWQgaW50IG9mZnNldCwKKwljb25zdCB2b2lkICpzb3VyY2UsIHVuc2lnbmVkIGludCBudW1fYnl0ZXMpOwordm9pZCBjb21lZGlfYnVmX21lbWNweV9mcm9tKGNvbWVkaV9hc3luYyAqYXN5bmMsIHVuc2lnbmVkIGludCBvZmZzZXQsCisJdm9pZCAqZGVzdGluYXRpb24sIHVuc2lnbmVkIGludCBudW1fYnl0ZXMpOworc3RhdGljIGlubGluZSB1bnNpZ25lZCBjb21lZGlfYnVmX3dyaXRlX25fYWxsb2NhdGVkKGNvbWVkaV9hc3luYyAqYXN5bmMpCit7CisJcmV0dXJuIGFzeW5jLT5idWZfd3JpdGVfYWxsb2NfY291bnQgLSBhc3luYy0+YnVmX3dyaXRlX2NvdW50OworfQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBjb21lZGlfYnVmX3JlYWRfbl9hbGxvY2F0ZWQoY29tZWRpX2FzeW5jICphc3luYykKK3sKKwlyZXR1cm4gYXN5bmMtPmJ1Zl9yZWFkX2FsbG9jX2NvdW50IC0gYXN5bmMtPmJ1Zl9yZWFkX2NvdW50OworfQorCit2b2lkIGNvbWVkaV9yZXNldF9hc3luY19idWYoY29tZWRpX2FzeW5jICphc3luYyk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCAqY29tZWRpX2F1eF9kYXRhKGludCBvcHRpb25zW10sIGludCBuKQoreworCXVuc2lnbmVkIGxvbmcgYWRkcmVzczsKKwl1bnNpZ25lZCBsb25nIGFkZHJlc3NMb3c7CisJaW50IGJpdF9zaGlmdDsKKwlpZiAoc2l6ZW9mKGludCkgPj0gc2l6ZW9mKHZvaWQgKikpCisJCWFkZHJlc3MgPSBvcHRpb25zW0NPTUVESV9ERVZDT05GX0FVWF9EQVRBX0xPXTsKKwllbHNlIHsKKwkJYWRkcmVzcyA9IG9wdGlvbnNbQ09NRURJX0RFVkNPTkZfQVVYX0RBVEFfSEldOworCQliaXRfc2hpZnQgPSBzaXplb2YoaW50KSAqIDg7CisJCWFkZHJlc3MgPDw9IGJpdF9zaGlmdDsKKwkJYWRkcmVzc0xvdyA9IG9wdGlvbnNbQ09NRURJX0RFVkNPTkZfQVVYX0RBVEFfTE9dOworCQlhZGRyZXNzTG93ICY9ICgxVUwgPDwgYml0X3NoaWZ0KSAtIDE7CisJCWFkZHJlc3MgfD0gYWRkcmVzc0xvdzsKKwl9CisJaWYgKG4gPj0gMSkKKwkJYWRkcmVzcyArPSBvcHRpb25zW0NPTUVESV9ERVZDT05GX0FVWF9EQVRBMF9MRU5HVEhdOworCWlmIChuID49IDIpCisJCWFkZHJlc3MgKz0gb3B0aW9uc1tDT01FRElfREVWQ09ORl9BVVhfREFUQTFfTEVOR1RIXTsKKwlpZiAobiA+PSAzKQorCQlhZGRyZXNzICs9IG9wdGlvbnNbQ09NRURJX0RFVkNPTkZfQVVYX0RBVEEyX0xFTkdUSF07CisJQlVHX09OKG4gPiAzKTsKKwlyZXR1cm4gKHZvaWQgKilhZGRyZXNzOworfQorCitpbnQgY29tZWRpX2FsbG9jX2JvYXJkX21pbm9yKHN0cnVjdCBkZXZpY2UgKmhhcmR3YXJlX2RldmljZSk7Cit2b2lkIGNvbWVkaV9mcmVlX2JvYXJkX21pbm9yKHVuc2lnbmVkIG1pbm9yKTsKK2ludCBjb21lZGlfYWxsb2Nfc3ViZGV2aWNlX21pbm9yKGNvbWVkaV9kZXZpY2UgKmRldiwgY29tZWRpX3N1YmRldmljZSAqcyk7Cit2b2lkIGNvbWVkaV9mcmVlX3N1YmRldmljZV9taW5vcihjb21lZGlfc3ViZGV2aWNlICpzKTsKK2ludCBjb21lZGlfcGNpX2F1dG9fY29uZmlnKHN0cnVjdCBwY2lfZGV2ICpwY2lkZXYsIGNvbnN0IGNoYXIgKmJvYXJkX25hbWUpOwordm9pZCBjb21lZGlfcGNpX2F1dG9fdW5jb25maWcoc3RydWN0IHBjaV9kZXYgKnBjaWRldik7CisKKyNpbmNsdWRlICJjb21lZGlfcnQuaCIKKworI2VuZGlmIC8qIF9DT01FRElERVZfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9jb21lZGlsaWIuaCBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvY29tZWRpbGliLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM1ZmMwMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvY29tZWRpbGliLmgKQEAgLTAsMCArMSwxOTIgQEAKKy8qCisgICAgbGludXgvaW5jbHVkZS9jb21lZGlsaWIuaAorICAgIGhlYWRlciBmaWxlIGZvciBrY29tZWRpbGliCisKKyAgICBDT01FREkgLSBMaW51eCBDb250cm9sIGFuZCBNZWFzdXJlbWVudCBEZXZpY2UgSW50ZXJmYWNlCisgICAgQ29weXJpZ2h0IChDKSAxOTk4LTIwMDEgRGF2aWQgQS4gU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworKi8KKworI2lmbmRlZiBfTElOVVhfQ09NRURJTElCX0gKKyNkZWZpbmUgX0xJTlVYX0NPTUVESUxJQl9ICisKKyNpbmNsdWRlICJjb21lZGkuaCIKKworLyogS2VybmVsIGludGVybmFsIHN0dWZmLiAgTmVlZGVkIGJ5IHJlYWwtdGltZSBtb2R1bGVzIGFuZCBzdWNoLiAqLworCisjaWZuZGVmIF9fS0VSTkVMX18KKyNlcnJvciBsaW51eC9jb21lZGlsaWIuaCBzaG91bGQgbm90IGJlIGluY2x1ZGVkIGJ5IG5vbi1rZXJuZWwtc3BhY2UgY29kZQorI2VuZGlmCisKKy8qIGV4cG9ydGVkIGZ1bmN0aW9ucyAqLworCisjaWZuZGVmIEtDT01FRElMSUJfREVQUkVDQVRFRAorCit0eXBlZGVmIHZvaWQgY29tZWRpX3Q7CisKKy8qIHRoZXNlIGZ1bmN0aW9ucyBtYXkgbm90IGJlIGNhbGxlZCBhdCByZWFsLXRpbWUgcHJpb3JpdHkgKi8KKworY29tZWRpX3QgKmNvbWVkaV9vcGVuKGNvbnN0IGNoYXIgKnBhdGgpOworaW50IGNvbWVkaV9jbG9zZShjb21lZGlfdCAqZGV2KTsKKworLyogdGhlc2UgZnVuY3Rpb25zIG1heSBiZSBjYWxsZWQgYXQgYW55IHByaW9yaXR5LCBidXQgbWF5IGZhaWwgYXQKKyAgIHJlYWwtdGltZSBwcmlvcml0eSAqLworCitpbnQgY29tZWRpX2xvY2soY29tZWRpX3QgKmRldiwgdW5zaWduZWQgaW50IHN1YmRldik7CitpbnQgY29tZWRpX3VubG9jayhjb21lZGlfdCAqZGV2LCB1bnNpZ25lZCBpbnQgc3ViZGV2KTsKKworLyogdGhlc2UgZnVuY3Rpb25zIG1heSBiZSBjYWxsZWQgYXQgYW55IHByaW9yaXR5LCBidXQgeW91IG11c3QgaG9sZAorICAgdGhlIGxvY2sgZm9yIHRoZSBzdWJkZXZpY2UgKi8KKworaW50IGNvbWVkaV9sb2dsZXZlbChpbnQgbG9nbGV2ZWwpOwordm9pZCBjb21lZGlfcGVycm9yKGNvbnN0IGNoYXIgKnMpOworY2hhciAqY29tZWRpX3N0cmVycm9yKGludCBlcnJudW0pOworaW50IGNvbWVkaV9lcnJubyh2b2lkKTsKK2ludCBjb21lZGlfZmlsZW5vKGNvbWVkaV90ICpkZXYpOworCitpbnQgY29tZWRpX2NhbmNlbChjb21lZGlfdCAqZGV2LCB1bnNpZ25lZCBpbnQgc3ViZGV2KTsKK2ludCBjb21lZGlfcmVnaXN0ZXJfY2FsbGJhY2soY29tZWRpX3QgKmRldiwgdW5zaWduZWQgaW50IHN1YmRldiwKKwl1bnNpZ25lZCBpbnQgbWFzaywgaW50ICgqY2IpICh1bnNpZ25lZCBpbnQsIHZvaWQgKiksIHZvaWQgKmFyZyk7CisKK2ludCBjb21lZGlfY29tbWFuZChjb21lZGlfdCAqZGV2LCBjb21lZGlfY21kICpjbWQpOworaW50IGNvbWVkaV9jb21tYW5kX3Rlc3QoY29tZWRpX3QgKmRldiwgY29tZWRpX2NtZCAqY21kKTsKK2ludCBjb21lZGlfdHJpZ2dlcihjb21lZGlfdCAqZGV2LCB1bnNpZ25lZCBpbnQgc3ViZGV2LCBjb21lZGlfdHJpZyAqaXQpOworaW50IF9fY29tZWRpX3RyaWdnZXIoY29tZWRpX3QgKmRldiwgdW5zaWduZWQgaW50IHN1YmRldiwgY29tZWRpX3RyaWcgKml0KTsKK2ludCBjb21lZGlfZGF0YV93cml0ZShjb21lZGlfdCAqZGV2LCB1bnNpZ25lZCBpbnQgc3ViZGV2LCB1bnNpZ25lZCBpbnQgY2hhbiwKKwl1bnNpZ25lZCBpbnQgcmFuZ2UsIHVuc2lnbmVkIGludCBhcmVmLCBsc2FtcGxfdCBkYXRhKTsKK2ludCBjb21lZGlfZGF0YV9yZWFkKGNvbWVkaV90ICpkZXYsIHVuc2lnbmVkIGludCBzdWJkZXYsIHVuc2lnbmVkIGludCBjaGFuLAorCXVuc2lnbmVkIGludCByYW5nZSwgdW5zaWduZWQgaW50IGFyZWYsIGxzYW1wbF90ICpkYXRhKTsKK2ludCBjb21lZGlfZGF0YV9yZWFkX2hpbnQoY29tZWRpX3QgKmRldiwgdW5zaWduZWQgaW50IHN1YmRldiwKKwl1bnNpZ25lZCBpbnQgY2hhbiwgdW5zaWduZWQgaW50IHJhbmdlLCB1bnNpZ25lZCBpbnQgYXJlZik7CitpbnQgY29tZWRpX2RhdGFfcmVhZF9kZWxheWVkKGNvbWVkaV90ICpkZXYsIHVuc2lnbmVkIGludCBzdWJkZXYsCisJdW5zaWduZWQgaW50IGNoYW4sIHVuc2lnbmVkIGludCByYW5nZSwgdW5zaWduZWQgaW50IGFyZWYsCisJbHNhbXBsX3QgKmRhdGEsIHVuc2lnbmVkIGludCBuYW5vX3NlYyk7CitpbnQgY29tZWRpX2Rpb19jb25maWcoY29tZWRpX3QgKmRldiwgdW5zaWduZWQgaW50IHN1YmRldiwgdW5zaWduZWQgaW50IGNoYW4sCisJdW5zaWduZWQgaW50IGlvKTsKK2ludCBjb21lZGlfZGlvX3JlYWQoY29tZWRpX3QgKmRldiwgdW5zaWduZWQgaW50IHN1YmRldiwgdW5zaWduZWQgaW50IGNoYW4sCisJdW5zaWduZWQgaW50ICp2YWwpOworaW50IGNvbWVkaV9kaW9fd3JpdGUoY29tZWRpX3QgKmRldiwgdW5zaWduZWQgaW50IHN1YmRldiwgdW5zaWduZWQgaW50IGNoYW4sCisJdW5zaWduZWQgaW50IHZhbCk7CitpbnQgY29tZWRpX2Rpb19iaXRmaWVsZChjb21lZGlfdCAqZGV2LCB1bnNpZ25lZCBpbnQgc3ViZGV2LCB1bnNpZ25lZCBpbnQgbWFzaywKKwl1bnNpZ25lZCBpbnQgKmJpdHMpOworaW50IGNvbWVkaV9nZXRfbl9zdWJkZXZpY2VzKGNvbWVkaV90ICpkZXYpOworaW50IGNvbWVkaV9nZXRfdmVyc2lvbl9jb2RlKGNvbWVkaV90ICpkZXYpOworY29uc3QgY2hhciAqY29tZWRpX2dldF9kcml2ZXJfbmFtZShjb21lZGlfdCAqZGV2KTsKK2NvbnN0IGNoYXIgKmNvbWVkaV9nZXRfYm9hcmRfbmFtZShjb21lZGlfdCAqZGV2KTsKK2ludCBjb21lZGlfZ2V0X3N1YmRldmljZV90eXBlKGNvbWVkaV90ICpkZXYsIHVuc2lnbmVkIGludCBzdWJkZXZpY2UpOworaW50IGNvbWVkaV9maW5kX3N1YmRldmljZV9ieV90eXBlKGNvbWVkaV90ICpkZXYsIGludCB0eXBlLCB1bnNpZ25lZCBpbnQgc3ViZCk7CitpbnQgY29tZWRpX2dldF9uX2NoYW5uZWxzKGNvbWVkaV90ICpkZXYsIHVuc2lnbmVkIGludCBzdWJkZXZpY2UpOworbHNhbXBsX3QgY29tZWRpX2dldF9tYXhkYXRhKGNvbWVkaV90ICpkZXYsIHVuc2lnbmVkIGludCBzdWJkZXZpY2UsIHVuc2lnbmVkCisJaW50IGNoYW4pOworaW50IGNvbWVkaV9nZXRfbl9yYW5nZXMoY29tZWRpX3QgKmRldiwgdW5zaWduZWQgaW50IHN1YmRldmljZSwgdW5zaWduZWQgaW50CisJY2hhbik7CitpbnQgY29tZWRpX2RvX2luc24oY29tZWRpX3QgKmRldiwgY29tZWRpX2luc24gKmluc24pOworaW50IGNvbWVkaV9wb2xsKGNvbWVkaV90ICpkZXYsIHVuc2lnbmVkIGludCBzdWJkZXYpOworCisvKiBERVBSRUNBVEVEIGZ1bmN0aW9ucyAqLworaW50IGNvbWVkaV9nZXRfcmFuZ2V0eXBlKGNvbWVkaV90ICpkZXYsIHVuc2lnbmVkIGludCBzdWJkZXZpY2UsCisJdW5zaWduZWQgaW50IGNoYW4pOworCisvKiBBTFBIQSBmdW5jdGlvbnMgKi8KK3Vuc2lnbmVkIGludCBjb21lZGlfZ2V0X3N1YmRldmljZV9mbGFncyhjb21lZGlfdCAqZGV2LCB1bnNpZ25lZCBpbnQgc3ViZGV2aWNlKTsKK2ludCBjb21lZGlfZ2V0X2xlbl9jaGFubGlzdChjb21lZGlfdCAqZGV2LCB1bnNpZ25lZCBpbnQgc3ViZGV2aWNlKTsKK2ludCBjb21lZGlfZ2V0X2tyYW5nZShjb21lZGlfdCAqZGV2LCB1bnNpZ25lZCBpbnQgc3ViZGV2aWNlLCB1bnNpZ25lZCBpbnQKKwljaGFuLCB1bnNpZ25lZCBpbnQgcmFuZ2UsIGNvbWVkaV9rcmFuZ2UgKmtyYW5nZSk7Cit1bnNpZ25lZCBpbnQgY29tZWRpX2dldF9idWZfaGVhZF9wb3MoY29tZWRpX3QgKmRldiwgdW5zaWduZWQgaW50IHN1YmRldmljZSk7CitpbnQgY29tZWRpX3NldF91c2VyX2ludF9jb3VudChjb21lZGlfdCAqZGV2LCB1bnNpZ25lZCBpbnQgc3ViZGV2aWNlLAorCXVuc2lnbmVkIGludCBidWZfdXNlcl9jb3VudCk7CitpbnQgY29tZWRpX21hcChjb21lZGlfdCAqZGV2LCB1bnNpZ25lZCBpbnQgc3ViZGV2LCB2b2lkICpwdHIpOworaW50IGNvbWVkaV91bm1hcChjb21lZGlfdCAqZGV2LCB1bnNpZ25lZCBpbnQgc3ViZGV2KTsKK2ludCBjb21lZGlfZ2V0X2J1ZmZlcl9zaXplKGNvbWVkaV90ICpkZXYsIHVuc2lnbmVkIGludCBzdWJkZXYpOworaW50IGNvbWVkaV9tYXJrX2J1ZmZlcl9yZWFkKGNvbWVkaV90ICpkZXYsIHVuc2lnbmVkIGludCBzdWJkZXZpY2UsCisJdW5zaWduZWQgaW50IG51bV9ieXRlcyk7CitpbnQgY29tZWRpX21hcmtfYnVmZmVyX3dyaXR0ZW4oY29tZWRpX3QgKmQsIHVuc2lnbmVkIGludCBzdWJkZXZpY2UsCisJdW5zaWduZWQgaW50IG51bV9ieXRlcyk7CitpbnQgY29tZWRpX2dldF9idWZmZXJfY29udGVudHMoY29tZWRpX3QgKmRldiwgdW5zaWduZWQgaW50IHN1YmRldmljZSk7CitpbnQgY29tZWRpX2dldF9idWZmZXJfb2Zmc2V0KGNvbWVkaV90ICpkZXYsIHVuc2lnbmVkIGludCBzdWJkZXZpY2UpOworCisjZWxzZQorCisvKiB0aGVzZSBmdW5jdGlvbnMgbWF5IG5vdCBiZSBjYWxsZWQgYXQgcmVhbC10aW1lIHByaW9yaXR5ICovCisKK2ludCBjb21lZGlfb3Blbih1bnNpZ25lZCBpbnQgbWlub3IpOwordm9pZCBjb21lZGlfY2xvc2UodW5zaWduZWQgaW50IG1pbm9yKTsKKworLyogdGhlc2UgZnVuY3Rpb25zIG1heSBiZSBjYWxsZWQgYXQgYW55IHByaW9yaXR5LCBidXQgbWF5IGZhaWwgYXQKKyAgIHJlYWwtdGltZSBwcmlvcml0eSAqLworCitpbnQgY29tZWRpX2xvY2sodW5zaWduZWQgaW50IG1pbm9yLCB1bnNpZ25lZCBpbnQgc3ViZGV2KTsKK2ludCBjb21lZGlfdW5sb2NrKHVuc2lnbmVkIGludCBtaW5vciwgdW5zaWduZWQgaW50IHN1YmRldik7CisKKy8qIHRoZXNlIGZ1bmN0aW9ucyBtYXkgYmUgY2FsbGVkIGF0IGFueSBwcmlvcml0eSwgYnV0IHlvdSBtdXN0IGhvbGQKKyAgIHRoZSBsb2NrIGZvciB0aGUgc3ViZGV2aWNlICovCisKK2ludCBjb21lZGlfY2FuY2VsKHVuc2lnbmVkIGludCBtaW5vciwgdW5zaWduZWQgaW50IHN1YmRldik7CitpbnQgY29tZWRpX3JlZ2lzdGVyX2NhbGxiYWNrKHVuc2lnbmVkIGludCBtaW5vciwgdW5zaWduZWQgaW50IHN1YmRldiwKKwl1bnNpZ25lZCBpbnQgbWFzaywgaW50ICgqY2IpICh1bnNpZ25lZCBpbnQsIHZvaWQgKiksIHZvaWQgKmFyZyk7CisKK2ludCBjb21lZGlfY29tbWFuZCh1bnNpZ25lZCBpbnQgbWlub3IsIGNvbWVkaV9jbWQgKmNtZCk7CitpbnQgY29tZWRpX2NvbW1hbmRfdGVzdCh1bnNpZ25lZCBpbnQgbWlub3IsIGNvbWVkaV9jbWQgKmNtZCk7CitpbnQgY29tZWRpX3RyaWdnZXIodW5zaWduZWQgaW50IG1pbm9yLCB1bnNpZ25lZCBpbnQgc3ViZGV2LCBjb21lZGlfdHJpZyAqaXQpOworaW50IF9fY29tZWRpX3RyaWdnZXIodW5zaWduZWQgaW50IG1pbm9yLCB1bnNpZ25lZCBpbnQgc3ViZGV2LCBjb21lZGlfdHJpZyAqaXQpOworaW50IGNvbWVkaV9kYXRhX3dyaXRlKHVuc2lnbmVkIGludCBkZXYsIHVuc2lnbmVkIGludCBzdWJkZXYsIHVuc2lnbmVkIGludCBjaGFuLAorCXVuc2lnbmVkIGludCByYW5nZSwgdW5zaWduZWQgaW50IGFyZWYsIGxzYW1wbF90IGRhdGEpOworaW50IGNvbWVkaV9kYXRhX3JlYWQodW5zaWduZWQgaW50IGRldiwgdW5zaWduZWQgaW50IHN1YmRldiwgdW5zaWduZWQgaW50IGNoYW4sCisJdW5zaWduZWQgaW50IHJhbmdlLCB1bnNpZ25lZCBpbnQgYXJlZiwgbHNhbXBsX3QgKmRhdGEpOworaW50IGNvbWVkaV9kaW9fY29uZmlnKHVuc2lnbmVkIGludCBkZXYsIHVuc2lnbmVkIGludCBzdWJkZXYsIHVuc2lnbmVkIGludCBjaGFuLAorCXVuc2lnbmVkIGludCBpbyk7CitpbnQgY29tZWRpX2Rpb19yZWFkKHVuc2lnbmVkIGludCBkZXYsIHVuc2lnbmVkIGludCBzdWJkZXYsIHVuc2lnbmVkIGludCBjaGFuLAorCXVuc2lnbmVkIGludCAqdmFsKTsKK2ludCBjb21lZGlfZGlvX3dyaXRlKHVuc2lnbmVkIGludCBkZXYsIHVuc2lnbmVkIGludCBzdWJkZXYsIHVuc2lnbmVkIGludCBjaGFuLAorCXVuc2lnbmVkIGludCB2YWwpOworaW50IGNvbWVkaV9kaW9fYml0ZmllbGQodW5zaWduZWQgaW50IGRldiwgdW5zaWduZWQgaW50IHN1YmRldiwKKwl1bnNpZ25lZCBpbnQgbWFzaywgdW5zaWduZWQgaW50ICpiaXRzKTsKK2ludCBjb21lZGlfZ2V0X25fc3ViZGV2aWNlcyh1bnNpZ25lZCBpbnQgZGV2KTsKK2ludCBjb21lZGlfZ2V0X3ZlcnNpb25fY29kZSh1bnNpZ25lZCBpbnQgZGV2KTsKK2NoYXIgKmNvbWVkaV9nZXRfZHJpdmVyX25hbWUodW5zaWduZWQgaW50IGRldik7CitjaGFyICpjb21lZGlfZ2V0X2JvYXJkX25hbWUodW5zaWduZWQgaW50IG1pbm9yKTsKK2ludCBjb21lZGlfZ2V0X3N1YmRldmljZV90eXBlKHVuc2lnbmVkIGludCBtaW5vciwgdW5zaWduZWQgaW50IHN1YmRldmljZSk7CitpbnQgY29tZWRpX2ZpbmRfc3ViZGV2aWNlX2J5X3R5cGUodW5zaWduZWQgaW50IG1pbm9yLCBpbnQgdHlwZSwKKwl1bnNpZ25lZCBpbnQgc3ViZCk7CitpbnQgY29tZWRpX2dldF9uX2NoYW5uZWxzKHVuc2lnbmVkIGludCBtaW5vciwgdW5zaWduZWQgaW50IHN1YmRldmljZSk7Citsc2FtcGxfdCBjb21lZGlfZ2V0X21heGRhdGEodW5zaWduZWQgaW50IG1pbm9yLCB1bnNpZ25lZCBpbnQgc3ViZGV2aWNlLCB1bnNpZ25lZAorCWludCBjaGFuKTsKK2ludCBjb21lZGlfZ2V0X25fcmFuZ2VzKHVuc2lnbmVkIGludCBtaW5vciwgdW5zaWduZWQgaW50IHN1YmRldmljZSwgdW5zaWduZWQgaW50CisJY2hhbik7CitpbnQgY29tZWRpX2RvX2luc24odW5zaWduZWQgaW50IG1pbm9yLCBjb21lZGlfaW5zbiAqaW5zbik7CitpbnQgY29tZWRpX3BvbGwodW5zaWduZWQgaW50IG1pbm9yLCB1bnNpZ25lZCBpbnQgc3ViZGV2KTsKKworLyogREVQUkVDQVRFRCBmdW5jdGlvbnMgKi8KK2ludCBjb21lZGlfZ2V0X3JhbmdldHlwZSh1bnNpZ25lZCBpbnQgbWlub3IsIHVuc2lnbmVkIGludCBzdWJkZXZpY2UsCisJdW5zaWduZWQgaW50IGNoYW4pOworCisvKiBBTFBIQSBmdW5jdGlvbnMgKi8KK3Vuc2lnbmVkIGludCBjb21lZGlfZ2V0X3N1YmRldmljZV9mbGFncyh1bnNpZ25lZCBpbnQgbWlub3IsIHVuc2lnbmVkIGludAorCXN1YmRldmljZSk7CitpbnQgY29tZWRpX2dldF9sZW5fY2hhbmxpc3QodW5zaWduZWQgaW50IG1pbm9yLCB1bnNpZ25lZCBpbnQgc3ViZGV2aWNlKTsKK2ludCBjb21lZGlfZ2V0X2tyYW5nZSh1bnNpZ25lZCBpbnQgbWlub3IsIHVuc2lnbmVkIGludCBzdWJkZXZpY2UsIHVuc2lnbmVkIGludAorCWNoYW4sIHVuc2lnbmVkIGludCByYW5nZSwgY29tZWRpX2tyYW5nZSAqa3JhbmdlKTsKK3Vuc2lnbmVkIGludCBjb21lZGlfZ2V0X2J1Zl9oZWFkX3Bvcyh1bnNpZ25lZCBpbnQgbWlub3IsIHVuc2lnbmVkIGludAorCXN1YmRldmljZSk7CitpbnQgY29tZWRpX3NldF91c2VyX2ludF9jb3VudCh1bnNpZ25lZCBpbnQgbWlub3IsIHVuc2lnbmVkIGludCBzdWJkZXZpY2UsCisJdW5zaWduZWQgaW50IGJ1Zl91c2VyX2NvdW50KTsKK2ludCBjb21lZGlfbWFwKHVuc2lnbmVkIGludCBtaW5vciwgdW5zaWduZWQgaW50IHN1YmRldiwgdm9pZCAqKnB0cik7CitpbnQgY29tZWRpX3VubWFwKHVuc2lnbmVkIGludCBtaW5vciwgdW5zaWduZWQgaW50IHN1YmRldik7CisKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZhOTNiOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy5jCkBAIC0wLDAgKzEsODQ2IEBACisvKgorICAgIG1vZHVsZS9kcml2ZXJzLmMKKyAgICBmdW5jdGlvbnMgZm9yIG1hbmlwdWxhdGluZyBkcml2ZXJzCisKKyAgICBDT01FREkgLSBMaW51eCBDb250cm9sIGFuZCBNZWFzdXJlbWVudCBEZXZpY2UgSW50ZXJmYWNlCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDAgRGF2aWQgQS4gU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworKi8KKworI2RlZmluZSBfR05VX1NPVVJDRQorCisjZGVmaW5lIF9fTk9fVkVSU0lPTl9fCisjaW5jbHVkZSAiY29tZWRpX2ZvcHMuaCIKKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgImNvbWVkaWRldi5oIgorI2luY2x1ZGUgIndyYXBwZXIuaCIKKyNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CS8qIGZvciBTdVNFIGJyb2tlbm5lc3MgKi8KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvY2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisKK3N0YXRpYyBpbnQgcG9zdGNvbmZpZyhjb21lZGlfZGV2aWNlICogZGV2KTsKK3N0YXRpYyBpbnQgaW5zbl9yd19lbXVsYXRlX2JpdHMoY29tZWRpX2RldmljZSAqIGRldiwgY29tZWRpX3N1YmRldmljZSAqIHMsCisJY29tZWRpX2luc24gKiBpbnNuLCBsc2FtcGxfdCAqIGRhdGEpOworc3RhdGljIHZvaWQgKmNvbWVkaV9yZWNvZ25pemUoY29tZWRpX2RyaXZlciAqIGRyaXYsIGNvbnN0IGNoYXIgKm5hbWUpOworc3RhdGljIHZvaWQgY29tZWRpX3JlcG9ydF9ib2FyZHMoY29tZWRpX2RyaXZlciAqIGRyaXYpOworc3RhdGljIGludCBwb2xsX2ludmFsaWQoY29tZWRpX2RldmljZSAqIGRldiwgY29tZWRpX3N1YmRldmljZSAqIHMpOworaW50IGNvbWVkaV9idWZfYWxsb2MoY29tZWRpX2RldmljZSAqIGRldiwgY29tZWRpX3N1YmRldmljZSAqIHMsCisJdW5zaWduZWQgbG9uZyBuZXdfc2l6ZSk7CisKK2NvbWVkaV9kcml2ZXIgKmNvbWVkaV9kcml2ZXJzOworCitpbnQgY29tZWRpX21vZHByb2JlKGludCBtaW5vcikKK3sKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIHZvaWQgY2xlYW51cF9kZXZpY2UoY29tZWRpX2RldmljZSAqIGRldikKK3sKKwlpbnQgaTsKKwljb21lZGlfc3ViZGV2aWNlICpzOworCisJaWYgKGRldi0+c3ViZGV2aWNlcykgeworCQlmb3IgKGkgPSAwOyBpIDwgZGV2LT5uX3N1YmRldmljZXM7IGkrKykgeworCQkJcyA9IGRldi0+c3ViZGV2aWNlcyArIGk7CisJCQljb21lZGlfZnJlZV9zdWJkZXZpY2VfbWlub3Iocyk7CisJCQlpZiAocy0+YXN5bmMpIHsKKwkJCQljb21lZGlfYnVmX2FsbG9jKGRldiwgcywgMCk7CisJCQkJa2ZyZWUocy0+YXN5bmMpOworCQkJfQorCQl9CisJCWtmcmVlKGRldi0+c3ViZGV2aWNlcyk7CisJCWRldi0+c3ViZGV2aWNlcyA9IE5VTEw7CisJCWRldi0+bl9zdWJkZXZpY2VzID0gMDsKKwl9CisJaWYgKGRldi0+cHJpdmF0ZSkgeworCQlrZnJlZShkZXYtPnByaXZhdGUpOworCQlkZXYtPnByaXZhdGUgPSBOVUxMOworCX0KKwlkZXYtPmRyaXZlciA9IDA7CisJZGV2LT5ib2FyZF9uYW1lID0gTlVMTDsKKwlkZXYtPmJvYXJkX3B0ciA9IE5VTEw7CisJZGV2LT5pb2Jhc2UgPSAwOworCWRldi0+aXJxID0gMDsKKwlkZXYtPnJlYWRfc3ViZGV2ID0gTlVMTDsKKwlkZXYtPndyaXRlX3N1YmRldiA9IE5VTEw7CisJZGV2LT5vcGVuID0gTlVMTDsKKwlkZXYtPmNsb3NlID0gTlVMTDsKKwljb21lZGlfc2V0X2h3X2RldihkZXYsIE5VTEwpOworfQorCitzdGF0aWMgdm9pZCBfX2NvbWVkaV9kZXZpY2VfZGV0YWNoKGNvbWVkaV9kZXZpY2UgKiBkZXYpCit7CisJZGV2LT5hdHRhY2hlZCA9IDA7CisJaWYgKGRldi0+ZHJpdmVyKSB7CisJCWRldi0+ZHJpdmVyLT5kZXRhY2goZGV2KTsKKwl9IGVsc2UgeworCQlwcmludGsoIkJVRzogZGV2LT5kcml2ZXI9TlVMTCBpbiBjb21lZGlfZGV2aWNlX2RldGFjaCgpXG4iKTsKKwl9CisJY2xlYW51cF9kZXZpY2UoZGV2KTsKK30KKwordm9pZCBjb21lZGlfZGV2aWNlX2RldGFjaChjb21lZGlfZGV2aWNlICogZGV2KQoreworCWlmICghZGV2LT5hdHRhY2hlZCkKKwkJcmV0dXJuOworCV9fY29tZWRpX2RldmljZV9kZXRhY2goZGV2KTsKK30KKworaW50IGNvbWVkaV9kZXZpY2VfYXR0YWNoKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGNvbWVkaV9kZXZjb25maWcgKiBpdCkKK3sKKwljb21lZGlfZHJpdmVyICpkcml2OworCWludCByZXQ7CisKKwlpZiAoZGV2LT5hdHRhY2hlZCkKKwkJcmV0dXJuIC1FQlVTWTsKKworCWZvciAoZHJpdiA9IGNvbWVkaV9kcml2ZXJzOyBkcml2OyBkcml2ID0gZHJpdi0+bmV4dCkgeworCQlpZiAoIXRyeV9tb2R1bGVfZ2V0KGRyaXYtPm1vZHVsZSkpIHsKKwkJCXByaW50aygiY29tZWRpOiBmYWlsZWQgdG8gaW5jcmVtZW50IG1vZHVsZSBjb3VudCwgc2tpcHBpbmdcbiIpOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKGRyaXYtPm51bV9uYW1lcykgeworCQkJZGV2LT5ib2FyZF9wdHIgPSBjb21lZGlfcmVjb2duaXplKGRyaXYsIGl0LT5ib2FyZF9uYW1lKTsKKwkJCWlmIChkZXYtPmJvYXJkX3B0ciA9PSBOVUxMKSB7CisJCQkJbW9kdWxlX3B1dChkcml2LT5tb2R1bGUpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKHN0cmNtcChkcml2LT5kcml2ZXJfbmFtZSwgaXQtPmJvYXJkX25hbWUpKSB7CisJCQkJbW9kdWxlX3B1dChkcml2LT5tb2R1bGUpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQl9CisJCS8vaW5pdGlhbGl6ZSBkZXYtPmRyaXZlciBoZXJlIHNvIGNvbWVkaV9lcnJvcigpIGNhbiBiZSBjYWxsZWQgZnJvbSBhdHRhY2gKKwkJZGV2LT5kcml2ZXIgPSBkcml2OworCQlyZXQgPSBkcml2LT5hdHRhY2goZGV2LCBpdCk7CisJCWlmIChyZXQgPCAwKSB7CisJCQltb2R1bGVfcHV0KGRldi0+ZHJpdmVyLT5tb2R1bGUpOworCQkJX19jb21lZGlfZGV2aWNlX2RldGFjaChkZXYpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCQlnb3RvIGF0dGFjaGVkOworCX0KKworCS8vIHJlY29nbml6ZSBoYXMgZmFpbGVkIGlmIHdlIGdldCBoZXJlCisJLy8gcmVwb3J0IHZhbGlkIGJvYXJkIG5hbWVzIGJlZm9yZSByZXR1cm5pbmcgZXJyb3IKKwlmb3IgKGRyaXYgPSBjb21lZGlfZHJpdmVyczsgZHJpdjsgZHJpdiA9IGRyaXYtPm5leHQpIHsKKwkJaWYgKCF0cnlfbW9kdWxlX2dldChkcml2LT5tb2R1bGUpKSB7CisJCQlwcmludGsoImNvbWVkaTogZmFpbGVkIHRvIGluY3JlbWVudCBtb2R1bGUgY291bnRcbiIpOworCQkJY29udGludWU7CisJCX0KKwkJY29tZWRpX3JlcG9ydF9ib2FyZHMoZHJpdik7CisJCW1vZHVsZV9wdXQoZHJpdi0+bW9kdWxlKTsKKwl9CisJcmV0dXJuIC1FSU87CisKK2F0dGFjaGVkOgorCS8qIGRvIGEgbGl0dGxlIHBvc3QtY29uZmlnIGNsZWFudXAgKi8KKwlyZXQgPSBwb3N0Y29uZmlnKGRldik7CisJbW9kdWxlX3B1dChkZXYtPmRyaXZlci0+bW9kdWxlKTsKKwlpZiAocmV0IDwgMCkgeworCQlfX2NvbWVkaV9kZXZpY2VfZGV0YWNoKGRldik7CisJCXJldHVybiByZXQ7CisJfQorCisJaWYgKCFkZXYtPmJvYXJkX25hbWUpIHsKKwkJcHJpbnRrKCJCVUc6IGRldi0+Ym9hcmRfbmFtZT08JXA+XG4iLCBkZXYtPmJvYXJkX25hbWUpOworCQlkZXYtPmJvYXJkX25hbWUgPSAiQlVHIjsKKwl9CisJc21wX3dtYigpOworCWRldi0+YXR0YWNoZWQgPSAxOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBjb21lZGlfZHJpdmVyX3JlZ2lzdGVyKGNvbWVkaV9kcml2ZXIgKiBkcml2ZXIpCit7CisJZHJpdmVyLT5uZXh0ID0gY29tZWRpX2RyaXZlcnM7CisJY29tZWRpX2RyaXZlcnMgPSBkcml2ZXI7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGNvbWVkaV9kcml2ZXJfdW5yZWdpc3Rlcihjb21lZGlfZHJpdmVyICogZHJpdmVyKQoreworCWNvbWVkaV9kcml2ZXIgKnByZXY7CisJaW50IGk7CisKKwkvKiBjaGVjayBmb3IgZGV2aWNlcyB1c2luZyB0aGlzIGRyaXZlciAqLworCWZvciAoaSA9IDA7IGkgPCBDT01FRElfTlVNX0JPQVJEX01JTk9SUzsgaSsrKSB7CisJCXN0cnVjdCBjb21lZGlfZGV2aWNlX2ZpbGVfaW5mbyAqZGV2X2ZpbGVfaW5mbyA9IGNvbWVkaV9nZXRfZGV2aWNlX2ZpbGVfaW5mbyhpKTsKKwkJY29tZWRpX2RldmljZSAqZGV2OworCisJCWlmKGRldl9maWxlX2luZm8gPT0gTlVMTCkgY29udGludWU7CisJCWRldiA9IGRldl9maWxlX2luZm8tPmRldmljZTsKKworCQltdXRleF9sb2NrKCZkZXYtPm11dGV4KTsKKwkJaWYgKGRldi0+YXR0YWNoZWQgJiYgZGV2LT5kcml2ZXIgPT0gZHJpdmVyKSB7CisJCQlpZiAoZGV2LT51c2VfY291bnQpCisJCQkJcHJpbnRrKCJCVUchIGRldGFjaGluZyBkZXZpY2Ugd2l0aCB1c2VfY291bnQ9JWRcbiIsIGRldi0+dXNlX2NvdW50KTsKKwkJCWNvbWVkaV9kZXZpY2VfZGV0YWNoKGRldik7CisJCX0KKwkJbXV0ZXhfdW5sb2NrKCZkZXYtPm11dGV4KTsKKwl9CisKKwlpZiAoY29tZWRpX2RyaXZlcnMgPT0gZHJpdmVyKSB7CisJCWNvbWVkaV9kcml2ZXJzID0gZHJpdmVyLT5uZXh0OworCQlyZXR1cm4gMDsKKwl9CisKKwlmb3IgKHByZXYgPSBjb21lZGlfZHJpdmVyczsgcHJldi0+bmV4dDsgcHJldiA9IHByZXYtPm5leHQpIHsKKwkJaWYgKHByZXYtPm5leHQgPT0gZHJpdmVyKSB7CisJCQlwcmV2LT5uZXh0ID0gZHJpdmVyLT5uZXh0OworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgcG9zdGNvbmZpZyhjb21lZGlfZGV2aWNlICogZGV2KQoreworCWludCBpOworCWNvbWVkaV9zdWJkZXZpY2UgKnM7CisJY29tZWRpX2FzeW5jICphc3luYyA9IE5VTEw7CisJaW50IHJldDsKKworCWZvciAoaSA9IDA7IGkgPCBkZXYtPm5fc3ViZGV2aWNlczsgaSsrKSB7CisJCXMgPSBkZXYtPnN1YmRldmljZXMgKyBpOworCisJCWlmIChzLT50eXBlID09IENPTUVESV9TVUJEX1VOVVNFRCkKKwkJCWNvbnRpbnVlOworCisJCWlmIChzLT5sZW5fY2hhbmxpc3QgPT0gMCkKKwkJCXMtPmxlbl9jaGFubGlzdCA9IDE7CisKKwkJaWYgKHMtPmRvX2NtZCkgeworCQkJQlVHX09OKChzLT5zdWJkZXZfZmxhZ3MgJiAoU0RGX0NNRF9SRUFEIHwKKwkJCQlTREZfQ01EX1dSSVRFKSkgPT0gMCk7CisJCQlCVUdfT04oIXMtPmRvX2NtZHRlc3QpOworCisJCQlhc3luYyA9IGt6YWxsb2Moc2l6ZW9mKGNvbWVkaV9hc3luYyksIEdGUF9LRVJORUwpOworCQkJaWYgKGFzeW5jID09IE5VTEwpIHsKKwkJCQlwcmludGsoImZhaWxlZCB0byBhbGxvY2F0ZSBhc3luYyBzdHJ1Y3RcbiIpOworCQkJCXJldHVybiAtRU5PTUVNOworCQkJfQorCQkJaW5pdF93YWl0cXVldWVfaGVhZCgmYXN5bmMtPndhaXRfaGVhZCk7CisJCQlhc3luYy0+c3ViZGV2aWNlID0gczsKKwkJCXMtPmFzeW5jID0gYXN5bmM7CisKKyNkZWZpbmUgREVGQVVMVF9CVUZfTUFYU0laRSAoNjQqMTAyNCkKKyNkZWZpbmUgREVGQVVMVF9CVUZfU0laRSAoNjQqMTAyNCkKKworCQkJYXN5bmMtPm1heF9idWZzaXplID0gREVGQVVMVF9CVUZfTUFYU0laRTsKKworCQkJYXN5bmMtPnByZWFsbG9jX2J1ZiA9IE5VTEw7CisJCQlhc3luYy0+cHJlYWxsb2NfYnVmc3ogPSAwOworCQkJaWYgKGNvbWVkaV9idWZfYWxsb2MoZGV2LCBzLCBERUZBVUxUX0JVRl9TSVpFKSA8IDApIHsKKwkJCQlwcmludGsoIkJ1ZmZlciBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CisJCQkJcmV0dXJuIC1FTk9NRU07CisJCQl9CisJCQlpZiAocy0+YnVmX2NoYW5nZSkgeworCQkJCXJldCA9IHMtPmJ1Zl9jaGFuZ2UoZGV2LCBzLCBERUZBVUxUX0JVRl9TSVpFKTsKKwkJCQlpZiAocmV0IDwgMCkKKwkJCQkJcmV0dXJuIHJldDsKKwkJCX0KKwkJCWNvbWVkaV9hbGxvY19zdWJkZXZpY2VfbWlub3IoZGV2LCBzKTsKKwkJfQorCisJCWlmICghcy0+cmFuZ2VfdGFibGUgJiYgIXMtPnJhbmdlX3RhYmxlX2xpc3QpCisJCQlzLT5yYW5nZV90YWJsZSA9ICZyYW5nZV91bmtub3duOworCisJCWlmICghcy0+aW5zbl9yZWFkICYmIHMtPmluc25fYml0cykKKwkJCXMtPmluc25fcmVhZCA9IGluc25fcndfZW11bGF0ZV9iaXRzOworCQlpZiAoIXMtPmluc25fd3JpdGUgJiYgcy0+aW5zbl9iaXRzKQorCQkJcy0+aW5zbl93cml0ZSA9IGluc25fcndfZW11bGF0ZV9iaXRzOworCisJCWlmICghcy0+aW5zbl9yZWFkKQorCQkJcy0+aW5zbl9yZWFkID0gaW5zbl9pbnZhbDsKKwkJaWYgKCFzLT5pbnNuX3dyaXRlKQorCQkJcy0+aW5zbl93cml0ZSA9IGluc25faW52YWw7CisJCWlmICghcy0+aW5zbl9iaXRzKQorCQkJcy0+aW5zbl9iaXRzID0gaW5zbl9pbnZhbDsKKwkJaWYgKCFzLT5pbnNuX2NvbmZpZykKKwkJCXMtPmluc25fY29uZmlnID0gaW5zbl9pbnZhbDsKKworCQlpZiAoIXMtPnBvbGwpCisJCQlzLT5wb2xsID0gcG9sbF9pbnZhbGlkOworCX0KKworCXJldHVybiAwOworfQorCisvLyBnZW5lcmljIHJlY29nbml6ZSBmdW5jdGlvbiBmb3IgZHJpdmVycyB0aGF0IHJlZ2lzdGVyIHRoZWlyIHN1cHBvcnRlZCBib2FyZCBuYW1lcwordm9pZCAqY29tZWRpX3JlY29nbml6ZShjb21lZGlfZHJpdmVyICogZHJpdiwgY29uc3QgY2hhciAqbmFtZSkKK3sKKwl1bnNpZ25lZCBpOworCWNvbnN0IGNoYXIgKmNvbnN0ICpuYW1lX3B0ciA9IGRyaXYtPmJvYXJkX25hbWU7CisJZm9yIChpID0gMDsgaSA8IGRyaXYtPm51bV9uYW1lczsgaSsrKSB7CisJCWlmIChzdHJjbXAoKm5hbWVfcHRyLCBuYW1lKSA9PSAwKQorCQkJcmV0dXJuICh2b2lkICopbmFtZV9wdHI7CisJCW5hbWVfcHRyID0KKwkJCShjb25zdCBjaGFyICpjb25zdCAqKSgoY29uc3QgY2hhciAqKW5hbWVfcHRyICsKKwkJCWRyaXYtPm9mZnNldCk7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQgY29tZWRpX3JlcG9ydF9ib2FyZHMoY29tZWRpX2RyaXZlciAqIGRyaXYpCit7CisJdW5zaWduZWQgaW50IGk7CisJY29uc3QgY2hhciAqY29uc3QgKm5hbWVfcHRyOworCisJcHJpbnRrKCJjb21lZGk6IHZhbGlkIGJvYXJkIG5hbWVzIGZvciAlcyBkcml2ZXIgYXJlOlxuIiwKKwkJZHJpdi0+ZHJpdmVyX25hbWUpOworCisJbmFtZV9wdHIgPSBkcml2LT5ib2FyZF9uYW1lOworCWZvciAoaSA9IDA7IGkgPCBkcml2LT5udW1fbmFtZXM7IGkrKykgeworCQlwcmludGsoIiAlc1xuIiwgKm5hbWVfcHRyKTsKKwkJbmFtZV9wdHIgPSAoY29uc3QgY2hhciAqKikoKGNoYXIgKiluYW1lX3B0ciArIGRyaXYtPm9mZnNldCk7CisJfQorCisJaWYgKGRyaXYtPm51bV9uYW1lcyA9PSAwKQorCQlwcmludGsoIiAlc1xuIiwgZHJpdi0+ZHJpdmVyX25hbWUpOworfQorCitzdGF0aWMgaW50IHBvbGxfaW52YWxpZChjb21lZGlfZGV2aWNlICogZGV2LCBjb21lZGlfc3ViZGV2aWNlICogcykKK3sKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworaW50IGluc25faW52YWwoY29tZWRpX2RldmljZSAqIGRldiwgY29tZWRpX3N1YmRldmljZSAqIHMsCisJY29tZWRpX2luc24gKiBpbnNuLCBsc2FtcGxfdCAqIGRhdGEpCit7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgaW5zbl9yd19lbXVsYXRlX2JpdHMoY29tZWRpX2RldmljZSAqIGRldiwgY29tZWRpX3N1YmRldmljZSAqIHMsCisJY29tZWRpX2luc24gKiBpbnNuLCBsc2FtcGxfdCAqIGRhdGEpCit7CisJY29tZWRpX2luc24gbmV3X2luc247CisJaW50IHJldDsKKwlzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhbm5lbHNfcGVyX2JpdGZpZWxkID0gMzI7CisKKwl1bnNpZ25lZCBjaGFuID0gQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyk7CisJY29uc3QgdW5zaWduZWQgYmFzZV9iaXRmaWVsZF9jaGFubmVsID0KKwkJKGNoYW4gPCBjaGFubmVsc19wZXJfYml0ZmllbGQpID8gMCA6IGNoYW47CisJbHNhbXBsX3QgbmV3X2RhdGFbMl07CisJbWVtc2V0KG5ld19kYXRhLCAwLCBzaXplb2YobmV3X2RhdGEpKTsKKwltZW1zZXQoJm5ld19pbnNuLCAwLCBzaXplb2YobmV3X2luc24pKTsKKwluZXdfaW5zbi5pbnNuID0gSU5TTl9CSVRTOworCW5ld19pbnNuLmNoYW5zcGVjID0gYmFzZV9iaXRmaWVsZF9jaGFubmVsOworCW5ld19pbnNuLm4gPSAyOworCW5ld19pbnNuLmRhdGEgPSBuZXdfZGF0YTsKKwluZXdfaW5zbi5zdWJkZXYgPSBpbnNuLT5zdWJkZXY7CisKKwlpZiAoaW5zbi0+aW5zbiA9PSBJTlNOX1dSSVRFKSB7CisJCWlmICghKHMtPnN1YmRldl9mbGFncyAmIFNERl9XUklUQUJMRSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJbmV3X2RhdGFbMF0gPSAxIDw8IChjaGFuIC0gYmFzZV9iaXRmaWVsZF9jaGFubmVsKTsJLyogbWFzayAqLworCQluZXdfZGF0YVsxXSA9IGRhdGFbMF0gPyAoMSA8PCAoY2hhbiAtIGJhc2VfYml0ZmllbGRfY2hhbm5lbCkpIDogMDsJLyogYml0cyAqLworCX0KKworCXJldCA9IHMtPmluc25fYml0cyhkZXYsIHMsICZuZXdfaW5zbiwgbmV3X2RhdGEpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJaWYgKGluc24tPmluc24gPT0gSU5TTl9SRUFEKSB7CisJCWRhdGFbMF0gPSAobmV3X2RhdGFbMV0gPj4gKGNoYW4gLSBiYXNlX2JpdGZpZWxkX2NoYW5uZWwpKSAmIDE7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyB1dmlydF90b19rdmEocGdkX3QgKiBwZ2QsIHVuc2lnbmVkIGxvbmcgYWRyKQoreworCXVuc2lnbmVkIGxvbmcgcmV0ID0gMFVMOworCXBtZF90ICpwbWQ7CisJcHRlX3QgKnB0ZXAsIHB0ZTsKKwlwdWRfdCAqcHVkOworCisJaWYgKCFwZ2Rfbm9uZSgqcGdkKSkgeworCQlwdWQgPSBwdWRfb2Zmc2V0KHBnZCwgYWRyKTsKKwkJcG1kID0gcG1kX29mZnNldChwdWQsIGFkcik7CisJCWlmICghcG1kX25vbmUoKnBtZCkpIHsKKwkJCXB0ZXAgPSBwdGVfb2Zmc2V0X2tlcm5lbChwbWQsIGFkcik7CisJCQlwdGUgPSAqcHRlcDsKKwkJCWlmIChwdGVfcHJlc2VudChwdGUpKSB7CisJCQkJcmV0ID0gKHVuc2lnbmVkIGxvbmcpCisJCQkJCXBhZ2VfYWRkcmVzcyhwdGVfcGFnZShwdGUpKTsKKwkJCQlyZXQgfD0gKGFkciAmIChQQUdFX1NJWkUgLSAxKSk7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGt2aXJ0X3RvX2t2YSh1bnNpZ25lZCBsb25nIGFkcikKK3sKKwl1bnNpZ25lZCBsb25nIHZhLCBrdmE7CisKKwl2YSA9IGFkcjsKKwlrdmEgPSB1dmlydF90b19rdmEocGdkX29mZnNldF9rKHZhKSwgdmEpOworCisJcmV0dXJuIGt2YTsKK30KKworaW50IGNvbWVkaV9idWZfYWxsb2MoY29tZWRpX2RldmljZSAqIGRldiwgY29tZWRpX3N1YmRldmljZSAqIHMsCisJdW5zaWduZWQgbG9uZyBuZXdfc2l6ZSkKK3sKKwljb21lZGlfYXN5bmMgKmFzeW5jID0gcy0+YXN5bmM7CisKKwkvKiBSb3VuZCB1cCBuZXdfc2l6ZSB0byBtdWx0aXBsZSBvZiBQQUdFX1NJWkUgKi8KKwluZXdfc2l6ZSA9IChuZXdfc2l6ZSArIFBBR0VfU0laRSAtIDEpICYgUEFHRV9NQVNLOworCisJLyogaWYgbm8gY2hhbmdlIGlzIHJlcXVpcmVkLCBkbyBub3RoaW5nICovCisJaWYgKGFzeW5jLT5wcmVhbGxvY19idWYgJiYgYXN5bmMtPnByZWFsbG9jX2J1ZnN6ID09IG5ld19zaXplKSB7CisJCXJldHVybiAwOworCX0KKwkvLyBkZWFsbG9jYXRlIG9sZCBidWZmZXIKKwlpZiAoYXN5bmMtPnByZWFsbG9jX2J1ZikgeworCQl2dW5tYXAoYXN5bmMtPnByZWFsbG9jX2J1Zik7CisJCWFzeW5jLT5wcmVhbGxvY19idWYgPSBOVUxMOworCQlhc3luYy0+cHJlYWxsb2NfYnVmc3ogPSAwOworCX0KKwlpZiAoYXN5bmMtPmJ1Zl9wYWdlX2xpc3QpIHsKKwkJdW5zaWduZWQgaTsKKwkJZm9yIChpID0gMDsgaSA8IGFzeW5jLT5uX2J1Zl9wYWdlczsgKytpKSB7CisJCQlpZiAoYXN5bmMtPmJ1Zl9wYWdlX2xpc3RbaV0udmlydF9hZGRyKSB7CisJCQkJbWVtX21hcF91bnJlc2VydmUodmlydF90b19wYWdlKGFzeW5jLT4KKwkJCQkJCWJ1Zl9wYWdlX2xpc3RbaV0udmlydF9hZGRyKSk7CisJCQkJaWYgKHMtPmFzeW5jX2RtYV9kaXIgIT0gRE1BX05PTkUpIHsKKwkJCQkJZG1hX2ZyZWVfY29oZXJlbnQoZGV2LT5od19kZXYsCisJCQkJCQlQQUdFX1NJWkUsCisJCQkJCQlhc3luYy0+YnVmX3BhZ2VfbGlzdFtpXS4KKwkJCQkJCXZpcnRfYWRkciwKKwkJCQkJCWFzeW5jLT5idWZfcGFnZV9saXN0W2ldLgorCQkJCQkJZG1hX2FkZHIpOworCQkJCX0gZWxzZSB7CisJCQkJCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylhc3luYy0+CisJCQkJCQlidWZfcGFnZV9saXN0W2ldLnZpcnRfYWRkcik7CisJCQkJfQorCQkJfQorCQl9CisJCXZmcmVlKGFzeW5jLT5idWZfcGFnZV9saXN0KTsKKwkJYXN5bmMtPmJ1Zl9wYWdlX2xpc3QgPSBOVUxMOworCQlhc3luYy0+bl9idWZfcGFnZXMgPSAwOworCX0KKwkvLyBhbGxvY2F0ZSBuZXcgYnVmZmVyCisJaWYgKG5ld19zaXplKSB7CisJCXVuc2lnbmVkIGkgPSAwOworCQl1bnNpZ25lZCBuX3BhZ2VzID0gbmV3X3NpemUgPj4gUEFHRV9TSElGVDsKKwkJc3RydWN0IHBhZ2UgKipwYWdlcyA9IE5VTEw7CisKKwkJYXN5bmMtPmJ1Zl9wYWdlX2xpc3QgPQorCQkJdm1hbGxvYyhzaXplb2Yoc3RydWN0IGNvbWVkaV9idWZfcGFnZSkgKiBuX3BhZ2VzKTsKKwkJaWYgKGFzeW5jLT5idWZfcGFnZV9saXN0KSB7CisJCQltZW1zZXQoYXN5bmMtPmJ1Zl9wYWdlX2xpc3QsIDAsCisJCQkJc2l6ZW9mKHN0cnVjdCBjb21lZGlfYnVmX3BhZ2UpICogbl9wYWdlcyk7CisJCQlwYWdlcyA9IHZtYWxsb2Moc2l6ZW9mKHN0cnVjdCBwYWdlICopICogbl9wYWdlcyk7CisJCX0KKwkJaWYgKHBhZ2VzKSB7CisJCQlmb3IgKGkgPSAwOyBpIDwgbl9wYWdlczsgaSsrKSB7CisJCQkJaWYgKHMtPmFzeW5jX2RtYV9kaXIgIT0gRE1BX05PTkUpIHsKKwkJCQkJYXN5bmMtPmJ1Zl9wYWdlX2xpc3RbaV0udmlydF9hZGRyID0KKwkJCQkJCWRtYV9hbGxvY19jb2hlcmVudChkZXYtPmh3X2RldiwKKwkJCQkJCVBBR0VfU0laRSwKKwkJCQkJCSZhc3luYy0+YnVmX3BhZ2VfbGlzdFtpXS4KKwkJCQkJCWRtYV9hZGRyLAorCQkJCQkJR0ZQX0tFUk5FTCB8IF9fR0ZQX0NPTVApOworCQkJCX0gZWxzZSB7CisJCQkJCWFzeW5jLT5idWZfcGFnZV9saXN0W2ldLnZpcnRfYWRkciA9CisJCQkJCQkodm9pZCAqKQorCQkJCQkJZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpOworCQkJCX0KKwkJCQlpZiAoYXN5bmMtPmJ1Zl9wYWdlX2xpc3RbaV0udmlydF9hZGRyID09IE5VTEwpIHsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCW1lbV9tYXBfcmVzZXJ2ZSh2aXJ0X3RvX3BhZ2UoYXN5bmMtPgorCQkJCQkJYnVmX3BhZ2VfbGlzdFtpXS52aXJ0X2FkZHIpKTsKKwkJCQlwYWdlc1tpXSA9CisJCQkJCXZpcnRfdG9fcGFnZShhc3luYy0+YnVmX3BhZ2VfbGlzdFtpXS4KKwkJCQkJdmlydF9hZGRyKTsKKwkJCX0KKwkJfQorCQlpZiAoaSA9PSBuX3BhZ2VzKSB7CisJCQlhc3luYy0+cHJlYWxsb2NfYnVmID0KKwkJCQl2bWFwKHBhZ2VzLCBuX3BhZ2VzLCBWTV9NQVAsCisJCQkJUEFHRV9LRVJORUxfTk9DQUNIRSk7CisJCX0KKwkJaWYgKHBhZ2VzKSB7CisJCQl2ZnJlZShwYWdlcyk7CisJCX0KKwkJaWYgKGFzeW5jLT5wcmVhbGxvY19idWYgPT0gTlVMTCkgeworCQkJLyogU29tZSBhbGxvY2F0aW9uIGZhaWxlZCBhYm92ZS4gKi8KKwkJCWlmIChhc3luYy0+YnVmX3BhZ2VfbGlzdCkgeworCQkJCWZvciAoaSA9IDA7IGkgPCBuX3BhZ2VzOyBpKyspIHsKKwkJCQkJaWYgKGFzeW5jLT5idWZfcGFnZV9saXN0W2ldLnZpcnRfYWRkciA9PQorCQkJCQkJTlVMTCkgeworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJbWVtX21hcF91bnJlc2VydmUodmlydF90b19wYWdlKGFzeW5jLT4KKwkJCQkJCQlidWZfcGFnZV9saXN0W2ldLgorCQkJCQkJCXZpcnRfYWRkcikpOworCQkJCQlpZiAocy0+YXN5bmNfZG1hX2RpciAhPSBETUFfTk9ORSkgeworCQkJCQkJZG1hX2ZyZWVfY29oZXJlbnQoZGV2LT5od19kZXYsCisJCQkJCQkJUEFHRV9TSVpFLAorCQkJCQkJCWFzeW5jLT5idWZfcGFnZV9saXN0W2ldLgorCQkJCQkJCXZpcnRfYWRkciwKKwkJCQkJCQlhc3luYy0+YnVmX3BhZ2VfbGlzdFtpXS4KKwkJCQkJCQlkbWFfYWRkcik7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpYXN5bmMtPgorCQkJCQkJCWJ1Zl9wYWdlX2xpc3RbaV0uCisJCQkJCQkJdmlydF9hZGRyKTsKKwkJCQkJfQorCQkJCX0KKwkJCQl2ZnJlZShhc3luYy0+YnVmX3BhZ2VfbGlzdCk7CisJCQkJYXN5bmMtPmJ1Zl9wYWdlX2xpc3QgPSBOVUxMOworCQkJfQorCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJYXN5bmMtPm5fYnVmX3BhZ2VzID0gbl9wYWdlczsKKwl9CisJYXN5bmMtPnByZWFsbG9jX2J1ZnN6ID0gbmV3X3NpemU7CisKKwlyZXR1cm4gMDsKK30KKworLyogbXVuZ2luZyBpcyBhcHBsaWVkIHRvIGRhdGEgYnkgY29yZSBhcyBpdCBwYXNzZXMgYmV0d2VlbiB1c2VyCisgKiBhbmQga2VybmVsIHNwYWNlICovCit1bnNpZ25lZCBpbnQgY29tZWRpX2J1Zl9tdW5nZShjb21lZGlfYXN5bmMgKiBhc3luYywgdW5zaWduZWQgaW50IG51bV9ieXRlcykKK3sKKwljb21lZGlfc3ViZGV2aWNlICpzID0gYXN5bmMtPnN1YmRldmljZTsKKwl1bnNpZ25lZCBpbnQgY291bnQgPSAwOworCWNvbnN0IHVuc2lnbmVkIG51bV9zYW1wbGVfYnl0ZXMgPSBieXRlc19wZXJfc2FtcGxlKHMpOworCisJaWYgKHMtPm11bmdlID09IE5VTEwgfHwgKGFzeW5jLT5jbWQuZmxhZ3MgJiBDTURGX1JBV0RBVEEpKSB7CisJCWFzeW5jLT5tdW5nZV9jb3VudCArPSBudW1fYnl0ZXM7CisJCWlmICgoaW50KShhc3luYy0+bXVuZ2VfY291bnQgLSBhc3luYy0+YnVmX3dyaXRlX2NvdW50KSA+IDApCisJCQlCVUcoKTsKKwkJcmV0dXJuIG51bV9ieXRlczsKKwl9CisJLyogZG9uJ3QgbXVuZ2UgcGFydGlhbCBzYW1wbGVzICovCisJbnVtX2J5dGVzIC09IG51bV9ieXRlcyAlIG51bV9zYW1wbGVfYnl0ZXM7CisJd2hpbGUgKGNvdW50IDwgbnVtX2J5dGVzKSB7CisJCWludCBibG9ja19zaXplOworCisJCWJsb2NrX3NpemUgPSBudW1fYnl0ZXMgLSBjb3VudDsKKwkJaWYgKGJsb2NrX3NpemUgPCAwKSB7CisJCQlydF9wcmludGsoIiVzOiAlczogYnVnISBibG9ja19zaXplIGlzIG5lZ2F0aXZlXG4iLAorCQkJCV9fRklMRV9fLCBfX2Z1bmNfXyk7CisJCQlicmVhazsKKwkJfQorCQlpZiAoKGludCkoYXN5bmMtPm11bmdlX3B0ciArIGJsb2NrX3NpemUgLQorCQkJCWFzeW5jLT5wcmVhbGxvY19idWZzeikgPiAwKQorCQkJYmxvY2tfc2l6ZSA9IGFzeW5jLT5wcmVhbGxvY19idWZzeiAtIGFzeW5jLT5tdW5nZV9wdHI7CisKKwkJcy0+bXVuZ2Uocy0+ZGV2aWNlLCBzLCBhc3luYy0+cHJlYWxsb2NfYnVmICsgYXN5bmMtPm11bmdlX3B0ciwKKwkJCWJsb2NrX3NpemUsIGFzeW5jLT5tdW5nZV9jaGFuKTsKKworCQlzbXBfd21iKCk7CS8vYmFycmllciBpbnN1cmVzIGRhdGEgaXMgbXVuZ2VkIGluIGJ1ZmZlciBiZWZvcmUgbXVuZ2VfY291bnQgaXMgaW5jcmVtZW50ZWQKKworCQlhc3luYy0+bXVuZ2VfY2hhbiArPSBibG9ja19zaXplIC8gbnVtX3NhbXBsZV9ieXRlczsKKwkJYXN5bmMtPm11bmdlX2NoYW4gJT0gYXN5bmMtPmNtZC5jaGFubGlzdF9sZW47CisJCWFzeW5jLT5tdW5nZV9jb3VudCArPSBibG9ja19zaXplOworCQlhc3luYy0+bXVuZ2VfcHRyICs9IGJsb2NrX3NpemU7CisJCWFzeW5jLT5tdW5nZV9wdHIgJT0gYXN5bmMtPnByZWFsbG9jX2J1ZnN6OworCQljb3VudCArPSBibG9ja19zaXplOworCX0KKwlpZiAoKGludCkoYXN5bmMtPm11bmdlX2NvdW50IC0gYXN5bmMtPmJ1Zl93cml0ZV9jb3VudCkgPiAwKQorCQlCVUcoKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKK3Vuc2lnbmVkIGludCBjb21lZGlfYnVmX3dyaXRlX25fYXZhaWxhYmxlKGNvbWVkaV9hc3luYyAqIGFzeW5jKQoreworCXVuc2lnbmVkIGludCBmcmVlX2VuZDsKKwl1bnNpZ25lZCBpbnQgbmJ5dGVzOworCisJaWYgKGFzeW5jID09IE5VTEwpCisJCXJldHVybiAwOworCisJZnJlZV9lbmQgPSBhc3luYy0+YnVmX3JlYWRfY291bnQgKyBhc3luYy0+cHJlYWxsb2NfYnVmc3o7CisJbmJ5dGVzID0gZnJlZV9lbmQgLSBhc3luYy0+YnVmX3dyaXRlX2FsbG9jX2NvdW50OworCW5ieXRlcyAtPSBuYnl0ZXMgJSBieXRlc19wZXJfc2FtcGxlKGFzeW5jLT5zdWJkZXZpY2UpOworCS8qIGJhcnJpZXIgaW5zdXJlcyB0aGUgcmVhZCBvZiBidWZfcmVhZF9jb3VudCBpbiB0aGlzCisJICAgcXVlcnkgb2NjdXJzIGJlZm9yZSBhbnkgZm9sbG93aW5nIHdyaXRlcyB0byB0aGUgYnVmZmVyIHdoaWNoCisJICAgbWlnaHQgYmUgYmFzZWQgb24gdGhlIHJldHVybiB2YWx1ZSBmcm9tIHRoaXMgcXVlcnkuCisJICovCisJc21wX21iKCk7CisJcmV0dXJuIG5ieXRlczsKK30KKworLyogYWxsb2NhdGVzIGNodW5rIGZvciB0aGUgd3JpdGVyIGZyb20gZnJlZSBidWZmZXIgc3BhY2UgKi8KK3Vuc2lnbmVkIGludCBjb21lZGlfYnVmX3dyaXRlX2FsbG9jKGNvbWVkaV9hc3luYyAqIGFzeW5jLCB1bnNpZ25lZCBpbnQgbmJ5dGVzKQoreworCXVuc2lnbmVkIGludCBmcmVlX2VuZCA9IGFzeW5jLT5idWZfcmVhZF9jb3VudCArIGFzeW5jLT5wcmVhbGxvY19idWZzejsKKworCWlmICgoaW50KShhc3luYy0+YnVmX3dyaXRlX2FsbG9jX2NvdW50ICsgbmJ5dGVzIC0gZnJlZV9lbmQpID4gMCkgeworCQluYnl0ZXMgPSBmcmVlX2VuZCAtIGFzeW5jLT5idWZfd3JpdGVfYWxsb2NfY291bnQ7CisJfQorCWFzeW5jLT5idWZfd3JpdGVfYWxsb2NfY291bnQgKz0gbmJ5dGVzOworCS8qIGJhcnJpZXIgaW5zdXJlcyB0aGUgcmVhZCBvZiBidWZfcmVhZF9jb3VudCBhYm92ZSBvY2N1cnMgYmVmb3JlCisJICAgd2Ugd3JpdGUgZGF0YSB0byB0aGUgd3JpdGUtYWxsb2MnZWQgYnVmZmVyIHNwYWNlICovCisJc21wX21iKCk7CisJcmV0dXJuIG5ieXRlczsKK30KKworLyogYWxsb2NhdGVzIG5vdGhpbmcgdW5sZXNzIGl0IGNhbiBjb21wbGV0ZWx5IGZ1bGZpbGwgdGhlIHJlcXVlc3QgKi8KK3Vuc2lnbmVkIGludCBjb21lZGlfYnVmX3dyaXRlX2FsbG9jX3N0cmljdChjb21lZGlfYXN5bmMgKiBhc3luYywKKwl1bnNpZ25lZCBpbnQgbmJ5dGVzKQoreworCXVuc2lnbmVkIGludCBmcmVlX2VuZCA9IGFzeW5jLT5idWZfcmVhZF9jb3VudCArIGFzeW5jLT5wcmVhbGxvY19idWZzejsKKworCWlmICgoaW50KShhc3luYy0+YnVmX3dyaXRlX2FsbG9jX2NvdW50ICsgbmJ5dGVzIC0gZnJlZV9lbmQpID4gMCkgeworCQluYnl0ZXMgPSAwOworCX0KKwlhc3luYy0+YnVmX3dyaXRlX2FsbG9jX2NvdW50ICs9IG5ieXRlczsKKwkvKiBiYXJyaWVyIGluc3VyZXMgdGhlIHJlYWQgb2YgYnVmX3JlYWRfY291bnQgYWJvdmUgb2NjdXJzIGJlZm9yZQorCSAgIHdlIHdyaXRlIGRhdGEgdG8gdGhlIHdyaXRlLWFsbG9jJ2VkIGJ1ZmZlciBzcGFjZSAqLworCXNtcF9tYigpOworCXJldHVybiBuYnl0ZXM7Cit9CisKKy8qIHRyYW5zZmVycyBhIGNodW5rIGZyb20gd3JpdGVyIHRvIGZpbGxlZCBidWZmZXIgc3BhY2UgKi8KK3Vuc2lnbmVkIGNvbWVkaV9idWZfd3JpdGVfZnJlZShjb21lZGlfYXN5bmMgKiBhc3luYywgdW5zaWduZWQgaW50IG5ieXRlcykKK3sKKwlpZiAoKGludCkoYXN5bmMtPmJ1Zl93cml0ZV9jb3VudCArIG5ieXRlcyAtCisJCQlhc3luYy0+YnVmX3dyaXRlX2FsbG9jX2NvdW50KSA+IDApIHsKKwkJcnRfcHJpbnRrCisJCQkoImNvbWVkaTogYXR0ZW1wdGVkIHRvIHdyaXRlLWZyZWUgbW9yZSBieXRlcyB0aGFuIGhhdmUgYmVlbiB3cml0ZS1hbGxvY2F0ZWQuXG4iKTsKKwkJbmJ5dGVzID0gYXN5bmMtPmJ1Zl93cml0ZV9hbGxvY19jb3VudCAtIGFzeW5jLT5idWZfd3JpdGVfY291bnQ7CisJfQorCWFzeW5jLT5idWZfd3JpdGVfY291bnQgKz0gbmJ5dGVzOworCWFzeW5jLT5idWZfd3JpdGVfcHRyICs9IG5ieXRlczsKKwljb21lZGlfYnVmX211bmdlKGFzeW5jLCBhc3luYy0+YnVmX3dyaXRlX2NvdW50IC0gYXN5bmMtPm11bmdlX2NvdW50KTsKKwlpZiAoYXN5bmMtPmJ1Zl93cml0ZV9wdHIgPj0gYXN5bmMtPnByZWFsbG9jX2J1ZnN6KSB7CisJCWFzeW5jLT5idWZfd3JpdGVfcHRyICU9IGFzeW5jLT5wcmVhbGxvY19idWZzejsKKwl9CisJcmV0dXJuIG5ieXRlczsKK30KKworLyogYWxsb2NhdGVzIGEgY2h1bmsgZm9yIHRoZSByZWFkZXIgZnJvbSBmaWxsZWQgKGFuZCBtdW5nZWQpIGJ1ZmZlciBzcGFjZSAqLwordW5zaWduZWQgY29tZWRpX2J1Zl9yZWFkX2FsbG9jKGNvbWVkaV9hc3luYyAqIGFzeW5jLCB1bnNpZ25lZCBuYnl0ZXMpCit7CisJaWYgKChpbnQpKGFzeW5jLT5idWZfcmVhZF9hbGxvY19jb3VudCArIG5ieXRlcyAtIGFzeW5jLT5tdW5nZV9jb3VudCkgPgorCQkwKSB7CisJCW5ieXRlcyA9IGFzeW5jLT5tdW5nZV9jb3VudCAtIGFzeW5jLT5idWZfcmVhZF9hbGxvY19jb3VudDsKKwl9CisJYXN5bmMtPmJ1Zl9yZWFkX2FsbG9jX2NvdW50ICs9IG5ieXRlczsKKwkvKiBiYXJyaWVyIGluc3VyZXMgcmVhZCBvZiBtdW5nZV9jb3VudCBvY2N1cnMgYmVmb3JlIHdlIGFjdHVhbGx5IHJlYWQKKwkgICBkYXRhIG91dCBvZiBidWZmZXIgKi8KKwlzbXBfcm1iKCk7CisJcmV0dXJuIG5ieXRlczsKK30KKworLyogdHJhbnNmZXJzIGNvbnRyb2wgb2YgYSBjaHVuayBmcm9tIHJlYWRlciB0byBmcmVlIGJ1ZmZlciBzcGFjZSAqLwordW5zaWduZWQgY29tZWRpX2J1Zl9yZWFkX2ZyZWUoY29tZWRpX2FzeW5jICogYXN5bmMsIHVuc2lnbmVkIGludCBuYnl0ZXMpCit7CisJLy8gYmFycmllciBpbnN1cmVzIGRhdGEgaGFzIGJlZW4gcmVhZCBvdXQgb2YgYnVmZmVyIGJlZm9yZSByZWFkIGNvdW50IGlzIGluY3JlbWVudGVkCisJc21wX21iKCk7CisJaWYgKChpbnQpKGFzeW5jLT5idWZfcmVhZF9jb3VudCArIG5ieXRlcyAtCisJCQlhc3luYy0+YnVmX3JlYWRfYWxsb2NfY291bnQpID4gMCkgeworCQlydF9wcmludGsKKwkJCSgiY29tZWRpOiBhdHRlbXB0ZWQgdG8gcmVhZC1mcmVlIG1vcmUgYnl0ZXMgdGhhbiBoYXZlIGJlZW4gcmVhZC1hbGxvY2F0ZWQuXG4iKTsKKwkJbmJ5dGVzID0gYXN5bmMtPmJ1Zl9yZWFkX2FsbG9jX2NvdW50IC0gYXN5bmMtPmJ1Zl9yZWFkX2NvdW50OworCX0KKwlhc3luYy0+YnVmX3JlYWRfY291bnQgKz0gbmJ5dGVzOworCWFzeW5jLT5idWZfcmVhZF9wdHIgKz0gbmJ5dGVzOworCWFzeW5jLT5idWZfcmVhZF9wdHIgJT0gYXN5bmMtPnByZWFsbG9jX2J1ZnN6OworCXJldHVybiBuYnl0ZXM7Cit9CisKK3ZvaWQgY29tZWRpX2J1Zl9tZW1jcHlfdG8oY29tZWRpX2FzeW5jICogYXN5bmMsIHVuc2lnbmVkIGludCBvZmZzZXQsCisJY29uc3Qgdm9pZCAqZGF0YSwgdW5zaWduZWQgaW50IG51bV9ieXRlcykKK3sKKwl1bnNpZ25lZCBpbnQgd3JpdGVfcHRyID0gYXN5bmMtPmJ1Zl93cml0ZV9wdHIgKyBvZmZzZXQ7CisKKwlpZiAod3JpdGVfcHRyID49IGFzeW5jLT5wcmVhbGxvY19idWZzeikKKwkJd3JpdGVfcHRyICU9IGFzeW5jLT5wcmVhbGxvY19idWZzejsKKworCXdoaWxlIChudW1fYnl0ZXMpIHsKKwkJdW5zaWduZWQgaW50IGJsb2NrX3NpemU7CisKKwkJaWYgKHdyaXRlX3B0ciArIG51bV9ieXRlcyA+IGFzeW5jLT5wcmVhbGxvY19idWZzeikKKwkJCWJsb2NrX3NpemUgPSBhc3luYy0+cHJlYWxsb2NfYnVmc3ogLSB3cml0ZV9wdHI7CisJCWVsc2UKKwkJCWJsb2NrX3NpemUgPSBudW1fYnl0ZXM7CisKKwkJbWVtY3B5KGFzeW5jLT5wcmVhbGxvY19idWYgKyB3cml0ZV9wdHIsIGRhdGEsIGJsb2NrX3NpemUpOworCisJCWRhdGEgKz0gYmxvY2tfc2l6ZTsKKwkJbnVtX2J5dGVzIC09IGJsb2NrX3NpemU7CisKKwkJd3JpdGVfcHRyID0gMDsKKwl9Cit9CisKK3ZvaWQgY29tZWRpX2J1Zl9tZW1jcHlfZnJvbShjb21lZGlfYXN5bmMgKiBhc3luYywgdW5zaWduZWQgaW50IG9mZnNldCwKKwl2b2lkICpkZXN0LCB1bnNpZ25lZCBpbnQgbmJ5dGVzKQoreworCXZvaWQgKnNyYzsKKwl1bnNpZ25lZCBpbnQgcmVhZF9wdHIgPSBhc3luYy0+YnVmX3JlYWRfcHRyICsgb2Zmc2V0OworCisJaWYgKHJlYWRfcHRyID49IGFzeW5jLT5wcmVhbGxvY19idWZzeikKKwkJcmVhZF9wdHIgJT0gYXN5bmMtPnByZWFsbG9jX2J1ZnN6OworCisJd2hpbGUgKG5ieXRlcykgeworCQl1bnNpZ25lZCBpbnQgYmxvY2tfc2l6ZTsKKworCQlzcmMgPSBhc3luYy0+cHJlYWxsb2NfYnVmICsgcmVhZF9wdHI7CisKKwkJaWYgKG5ieXRlcyA+PSBhc3luYy0+cHJlYWxsb2NfYnVmc3ogLSByZWFkX3B0cikKKwkJCWJsb2NrX3NpemUgPSBhc3luYy0+cHJlYWxsb2NfYnVmc3ogLSByZWFkX3B0cjsKKwkJZWxzZQorCQkJYmxvY2tfc2l6ZSA9IG5ieXRlczsKKworCQltZW1jcHkoZGVzdCwgc3JjLCBibG9ja19zaXplKTsKKwkJbmJ5dGVzIC09IGJsb2NrX3NpemU7CisJCWRlc3QgKz0gYmxvY2tfc2l6ZTsKKwkJcmVhZF9wdHIgPSAwOworCX0KK30KKwordW5zaWduZWQgaW50IGNvbWVkaV9idWZfcmVhZF9uX2F2YWlsYWJsZShjb21lZGlfYXN5bmMgKiBhc3luYykKK3sKKwl1bnNpZ25lZCBudW1fYnl0ZXM7CisKKwlpZiAoYXN5bmMgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisJbnVtX2J5dGVzID0gYXN5bmMtPm11bmdlX2NvdW50IC0gYXN5bmMtPmJ1Zl9yZWFkX2NvdW50OworCS8qIGJhcnJpZXIgaW5zdXJlcyB0aGUgcmVhZCBvZiBtdW5nZV9jb3VudCBpbiB0aGlzCisJICAgcXVlcnkgb2NjdXJzIGJlZm9yZSBhbnkgZm9sbG93aW5nIHJlYWRzIG9mIHRoZSBidWZmZXIgd2hpY2gKKwkgICBtaWdodCBiZSBiYXNlZCBvbiB0aGUgcmV0dXJuIHZhbHVlIGZyb20gdGhpcyBxdWVyeS4KKwkgKi8KKwlzbXBfcm1iKCk7CisJcmV0dXJuIG51bV9ieXRlczsKK30KKworaW50IGNvbWVkaV9idWZfZ2V0KGNvbWVkaV9hc3luYyAqIGFzeW5jLCBzYW1wbF90ICogeCkKK3sKKwl1bnNpZ25lZCBpbnQgbiA9IGNvbWVkaV9idWZfcmVhZF9uX2F2YWlsYWJsZShhc3luYyk7CisKKwlpZiAobiA8IHNpemVvZihzYW1wbF90KSkKKwkJcmV0dXJuIDA7CisJY29tZWRpX2J1Zl9yZWFkX2FsbG9jKGFzeW5jLCBzaXplb2Yoc2FtcGxfdCkpOworCSp4ID0gKihzYW1wbF90ICopIChhc3luYy0+cHJlYWxsb2NfYnVmICsgYXN5bmMtPmJ1Zl9yZWFkX3B0cik7CisJY29tZWRpX2J1Zl9yZWFkX2ZyZWUoYXN5bmMsIHNpemVvZihzYW1wbF90KSk7CisJcmV0dXJuIDE7Cit9CisKK2ludCBjb21lZGlfYnVmX3B1dChjb21lZGlfYXN5bmMgKiBhc3luYywgc2FtcGxfdCB4KQoreworCXVuc2lnbmVkIGludCBuID0gY29tZWRpX2J1Zl93cml0ZV9hbGxvY19zdHJpY3QoYXN5bmMsIHNpemVvZihzYW1wbF90KSk7CisKKwlpZiAobiA8IHNpemVvZihzYW1wbF90KSkgeworCQlhc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FUlJPUjsKKwkJcmV0dXJuIDA7CisJfQorCSooc2FtcGxfdCAqKSAoYXN5bmMtPnByZWFsbG9jX2J1ZiArIGFzeW5jLT5idWZfd3JpdGVfcHRyKSA9IHg7CisJY29tZWRpX2J1Zl93cml0ZV9mcmVlKGFzeW5jLCBzaXplb2Yoc2FtcGxfdCkpOworCXJldHVybiAxOworfQorCit2b2lkIGNvbWVkaV9yZXNldF9hc3luY19idWYoY29tZWRpX2FzeW5jICogYXN5bmMpCit7CisJYXN5bmMtPmJ1Zl93cml0ZV9hbGxvY19jb3VudCA9IDA7CisJYXN5bmMtPmJ1Zl93cml0ZV9jb3VudCA9IDA7CisJYXN5bmMtPmJ1Zl9yZWFkX2FsbG9jX2NvdW50ID0gMDsKKwlhc3luYy0+YnVmX3JlYWRfY291bnQgPSAwOworCisJYXN5bmMtPmJ1Zl93cml0ZV9wdHIgPSAwOworCWFzeW5jLT5idWZfcmVhZF9wdHIgPSAwOworCisJYXN5bmMtPmN1cl9jaGFuID0gMDsKKwlhc3luYy0+c2Nhbl9wcm9ncmVzcyA9IDA7CisJYXN5bmMtPm11bmdlX2NoYW4gPSAwOworCWFzeW5jLT5tdW5nZV9jb3VudCA9IDA7CisJYXN5bmMtPm11bmdlX3B0ciA9IDA7CisKKwlhc3luYy0+ZXZlbnRzID0gMDsKK30KKworaW50IGNvbWVkaV9hdXRvX2NvbmZpZyhzdHJ1Y3QgZGV2aWNlICpoYXJkd2FyZV9kZXZpY2UsIGNvbnN0IGNoYXIgKmJvYXJkX25hbWUsIGNvbnN0IGludCAqb3B0aW9ucywgdW5zaWduZWQgbnVtX29wdGlvbnMpCit7CisJY29tZWRpX2RldmNvbmZpZyBpdDsKKwlpbnQgbWlub3I7CisJc3RydWN0IGNvbWVkaV9kZXZpY2VfZmlsZV9pbmZvICpkZXZfZmlsZV9pbmZvOworCWludCByZXR2YWw7CisKKwltaW5vciA9IGNvbWVkaV9hbGxvY19ib2FyZF9taW5vcihoYXJkd2FyZV9kZXZpY2UpOworCWlmKG1pbm9yIDwgMCkgcmV0dXJuIG1pbm9yOworCWRldl9zZXRfZHJ2ZGF0YShoYXJkd2FyZV9kZXZpY2UsICh2b2lkKikodW5zaWduZWQgbG9uZyltaW5vcik7CisKKwlkZXZfZmlsZV9pbmZvID0gY29tZWRpX2dldF9kZXZpY2VfZmlsZV9pbmZvKG1pbm9yKTsKKworCW1lbXNldCgmaXQsIDAsIHNpemVvZihpdCkpOworCXN0cm5jcHkoaXQuYm9hcmRfbmFtZSwgYm9hcmRfbmFtZSwgQ09NRURJX05BTUVMRU4pOworCWl0LmJvYXJkX25hbWVbQ09NRURJX05BTUVMRU4gLSAxXSA9ICdcMCc7CisJQlVHX09OKG51bV9vcHRpb25zID4gQ09NRURJX05ERVZDT05GT1BUUyk7CisJbWVtY3B5KGl0Lm9wdGlvbnMsIG9wdGlvbnMsIG51bV9vcHRpb25zICogc2l6ZW9mKGludCkpOworCisJbXV0ZXhfbG9jaygmZGV2X2ZpbGVfaW5mby0+ZGV2aWNlLT5tdXRleCk7CisJcmV0dmFsID0gY29tZWRpX2RldmljZV9hdHRhY2goZGV2X2ZpbGVfaW5mby0+ZGV2aWNlLCAmaXQpOworCW11dGV4X3VubG9jaygmZGV2X2ZpbGVfaW5mby0+ZGV2aWNlLT5tdXRleCk7CisJaWYocmV0dmFsIDwgMCkKKwl7CisJCWNvbWVkaV9mcmVlX2JvYXJkX21pbm9yKG1pbm9yKTsKKwl9CisJcmV0dXJuIHJldHZhbDsKK30KKwordm9pZCBjb21lZGlfYXV0b191bmNvbmZpZyhzdHJ1Y3QgZGV2aWNlICpoYXJkd2FyZV9kZXZpY2UpCit7CisJdW5zaWduZWQgbG9uZyBtaW5vciA9ICh1bnNpZ25lZCBsb25nKWRldl9nZXRfZHJ2ZGF0YShoYXJkd2FyZV9kZXZpY2UpOworCisJQlVHX09OKG1pbm9yID49IENPTUVESV9OVU1fQk9BUkRfTUlOT1JTKTsKKworCWNvbWVkaV9mcmVlX2JvYXJkX21pbm9yKG1pbm9yKTsKK30KKworaW50IGNvbWVkaV9wY2lfYXV0b19jb25maWcoc3RydWN0IHBjaV9kZXYgKnBjaWRldiwgY29uc3QgY2hhciAqYm9hcmRfbmFtZSkKK3sKKwlpbnQgb3B0aW9uc1syXTsKKworCS8vIHBjaSBidXMKKwlvcHRpb25zWzBdID0gcGNpZGV2LT5idXMtPm51bWJlcjsKKwkvLyBwY2kgc2xvdAorCW9wdGlvbnNbMV0gPSBQQ0lfU0xPVChwY2lkZXYtPmRldmZuKTsKKworCXJldHVybiBjb21lZGlfYXV0b19jb25maWcoJnBjaWRldi0+ZGV2LCBib2FyZF9uYW1lLCBvcHRpb25zLCBzaXplb2Yob3B0aW9ucykgLyBzaXplb2Yob3B0aW9uc1swXSkpOworfQorCit2b2lkIGNvbWVkaV9wY2lfYXV0b191bmNvbmZpZyhzdHJ1Y3QgcGNpX2RldiAqcGNpZGV2KQoreworCWNvbWVkaV9hdXRvX3VuY29uZmlnKCZwY2lkZXYtPmRldik7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWI3YTYxNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9NYWtlZmlsZQpAQCAtMCwwICsxLDIxIEBACisjIE1ha2VmaWxlIGZvciBpbmRpdmlkdWFsIGNvbWVkaSBkcml2ZXJzCisjCisKKyMgQ29tZWRpICJoZWxwZXIiIG1vZHVsZXMKK29iai0kKENPTkZJR19DT01FREkpCQkJKz0gY29tZWRpX2ZjLm8KK29iai0kKENPTkZJR19DT01FREkpCQkJKz0gY29tZWRpX2JvbmQubworb2JqLSQoQ09ORklHX0NPTUVESSkJCQkrPSBjb21lZGlfdGVzdC5vCitvYmotJChDT05GSUdfQ09NRURJKQkJCSs9IGNvbWVkaV9wYXJwb3J0Lm8KKworIyBDb21lZGkgUENJIGRyaXZlcnMKK29iai0kKENPTkZJR19DT01FRElfUENJX0RSSVZFUlMpCSs9IG1pdGUubworb2JqLSQoQ09ORklHX0NPTUVESV9QQ0lfRFJJVkVSUykJKz0gaWNwX211bHRpLm8KK29iai0kKENPTkZJR19DT01FRElfUENJX0RSSVZFUlMpCSs9IG1lX2RhcS5vCitvYmotJChDT05GSUdfQ09NRURJX1BDSV9EUklWRVJTKQkrPSBtZTQwMDAubworb2JqLSQoQ09ORklHX0NPTUVESV9QQ0lfRFJJVkVSUykJKz0gcnRkNTIwLm8KK29iai0kKENPTkZJR19DT01FRElfUENJX0RSSVZFUlMpCSs9IHM2MjYubworCisjIENvbWVkaSBVU0IgZHJpdmVycworb2JqLSQoQ09ORklHX0NPTUVESV9VU0JfRFJJVkVSUykJKz0gdXNiZHV4Lm8KK29iai0kKENPTkZJR19DT01FRElfVVNCX0RSSVZFUlMpCSs9IHVzYmR1eGZhc3Qubworb2JqLSQoQ09ORklHX0NPTUVESV9VU0JfRFJJVkVSUykJKz0gZHQ5ODEyLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jb21lZGlfYm9uZC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NvbWVkaV9ib25kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWU1NDk2ZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jb21lZGlfYm9uZC5jCkBAIC0wLDAgKzEsNTM1IEBACisvKgorICAgIGNvbWVkaS9kcml2ZXJzL2NvbWVkaV9ib25kLmMKKyAgICBBIENvbWVkaSBkcml2ZXIgdG8gJ2JvbmQnIG9yIG1lcmdlIG11bHRpcGxlIGRyaXZlcnMgYW5kIGRldmljZXMgYXMgb25lLgorCisgICAgQ09NRURJIC0gTGludXggQ29udHJvbCBhbmQgTWVhc3VyZW1lbnQgRGV2aWNlIEludGVyZmFjZQorICAgIENvcHlyaWdodCAoQykgMjAwMCBEYXZpZCBBLiBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKyAgICBDb3B5cmlnaHQgKEMpIDIwMDUgQ2FsaW4gQS4gQ3VsaWFudSA8Y2FsaW5AYWp2YXIub3JnPgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyovCisvKgorRHJpdmVyOiBjb21lZGlfYm9uZAorRGVzY3JpcHRpb246IEEgZHJpdmVyIHRvICdib25kJyAobWVyZ2UpIG11bHRpcGxlIHN1YmRldmljZXMgZnJvbSBtdWx0aXBsZQorCSAgICAgZGV2aWNlcyB0b2dldGhlciBhcyBvbmUuCitEZXZpY2VzOgorQXV0aG9yOiBkcworVXBkYXRlZDogTW9uLCAxMCBPY3QgMDA6MTg6MjUgLTA1MDAKK1N0YXR1czogd29ya3MKKworVGhpcyBkcml2ZXIgYWxsb3dzIHlvdSB0byAnYm9uZCcgKG1lcmdlKSBtdWx0aXBsZSBjb21lZGkgc3ViZGV2aWNlcworKGNvbWluZyBmcm9tIHBvc3NpYmx5IGRpZmZlcmVuY2UgYm9hcmRzIGFuZC9vciBkcml2ZXJzKSB0b2dldGhlci4gIEZvcgorZXhhbXBsZSwgaWYgeW91IGhhZCBhIGJvYXJkIHdpdGggMiBkaWZmZXJlbnQgRElPIHN1YmRldmljZXMsIGFuZAorYW5vdGhlciB3aXRoIDEgRElPIHN1YmRldmljZSwgeW91IGNvdWxkICdib25kJyB0aGVtIHdpdGggdGhpcyBkcml2ZXIKK3NvIHRoYXQgdGhleSBsb29rIGxpa2Ugb25lIGJpZyBmYXQgRElPIHN1YmRldmljZS4gIFRoaXMgbWFrZXMgd3JpdGluZworYXBwbGljYXRpb25zIHNsaWdodGx5IGVhc2llciBhcyB5b3UgZG9uJ3QgaGF2ZSB0byB3b3JyeSBhYm91dCBtYW5hZ2luZworZGlmZmVyZW50IHN1YmRldmljZXMgaW4gdGhlIGFwcGxpY2F0aW9uIC0tIHlvdSBqdXN0IHdvcnJ5IGFib3V0CitpbmRleGluZyBvbmUgbGluZWFyIGFycmF5IG9mIGNoYW5uZWwgaWQncy4KKworUmlnaHQgbm93IG9ubHkgRElPIHN1YmRldmljZXMgYXJlIHN1cHBvcnRlZCBhcyB0aGF0J3MgdGhlIHBlcnNvbmFsIGl0Y2gKK0kgYW0gc2NyYXRjaGluZyB3aXRoIHRoaXMgZHJpdmVyLiAgSWYgeW91IHdhbnQgdG8gYWRkIHN1cHBvcnQgZm9yIEFJIGFuZCBBTworc3ViZGV2cywgZ28gcmlnaHQgb24gYWhlYWQgYW5kIGRvIHNvIQorCitDb21tYW5kcyBhcmVuJ3Qgc3VwcG9ydGVkIC0tIGFsdGhvdWdoIGl0IHdvdWxkIGJlIGNvb2wgaWYgdGhleSB3ZXJlLgorCitDb25maWd1cmF0aW9uIE9wdGlvbnM6CisgIExpc3Qgb2YgY29tZWRpLW1pbm9ycyB0byBib25kLiAgQWxsIHN1YmRldmljZXMgb2YgdGhlIHNhbWUgdHlwZQorICB3aXRoaW4gZWFjaCBtaW5vciB3aWxsIGJlIGNvbmNhdGVuYXRlZCB0b2dldGhlciBpbiB0aGUgb3JkZXIgZ2l2ZW4gaGVyZS4KKyovCisKKy8qCisgKiBUaGUgcHJldmlvdXMgYmxvY2sgY29tbWVudCBpcyB1c2VkIHRvIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGUKKyAqIGRvY3VtZW50YXRpb24gaW4gQ29tZWRpIGFuZCBDb21lZGlsaWIuICBUaGUgZmllbGRzOgorICoKKyAqIERyaXZlcjogdGhlIG5hbWUgb2YgdGhlIGRyaXZlcgorICogRGVzY3JpcHRpb246IGEgc2hvcnQgcGhyYXNlIGRlc2NyaWJpbmcgdGhlIGRyaXZlci4gIERvbid0IGxpc3QgYm9hcmRzLgorICogRGV2aWNlczogYSBmdWxsIGxpc3Qgb2YgdGhlIGJvYXJkcyB0aGF0IGF0dGVtcHQgdG8gYmUgc3VwcG9ydGVkIGJ5CisgKiAgIHRoZSBkcml2ZXIuICBGb3JtYXQgaXMgIihtYW51ZmFjdHVyZXIpIGJvYXJkIG5hbWUgW2NvbWVkaSBuYW1lXSIsCisgKiAgIHdoZXJlIGNvbWVkaV9uYW1lIGlzIHRoZSBuYW1lIHRoYXQgaXMgdXNlZCB0byBjb25maWd1cmUgdGhlIGJvYXJkLgorICogICBTZWUgdGhlIGNvbW1lbnQgbmVhciBib2FyZF9uYW1lOiBpbiB0aGUgY29tZWRpX2RyaXZlciBzdHJ1Y3R1cmUKKyAqICAgYmVsb3cuICBJZiAobWFudWZhY3R1cmVyKSBvciBbY29tZWRpIG5hbWVdIGlzIG1pc3NpbmcsIHRoZSBwcmV2aW91cworICogICB2YWx1ZSBpcyB1c2VkLgorICogQXV0aG9yOiB5b3UKKyAqIFVwZGF0ZWQ6IGRhdGUgd2hlbiB0aGUgX2RvY3VtZW50YXRpb25fIHdhcyBsYXN0IHVwZGF0ZWQuICBVc2UgJ2RhdGUgLVInCisgKiAgIHRvIGdldCBhIHZhbHVlIGZvciB0aGlzLgorICogU3RhdHVzOiBhIG9uZS13b3JkIGRlc2NyaXB0aW9uIG9mIHRoZSBzdGF0dXMuICBWYWxpZCB2YWx1ZXMgYXJlOgorICogICB3b3JrcyAtIGRyaXZlciB3b3JrcyBjb3JyZWN0bHkgb24gbW9zdCBib2FyZHMgc3VwcG9ydGVkLCBhbmQKKyAqICAgICBwYXNzZXMgY29tZWRpX3Rlc3QuCisgKiAgIHVua25vd24gLSB1bmtub3duLiAgVXN1YWxseSBwdXQgdGhlcmUgYnkgZHMuCisgKiAgIGV4cGVyaW1lbnRhbCAtIG1heSBub3Qgd29yayBpbiBhbnkgcGFydGljdWxhciByZWxlYXNlLiAgQXV0aG9yCisgKiAgICAgcHJvYmFibHkgd2FudHMgYXNzaXN0YW5jZSB0ZXN0aW5nIGl0LgorICogICBiaXRyb3R0ZW4gLSBkcml2ZXIgaGFzIG5vdCBiZWVuIHVwZGF0ZSBpbiBhIGxvbmcgdGltZSwgcHJvYmFibHkKKyAqICAgICBkb2Vzbid0IHdvcmssIGFuZCBwcm9iYWJseSBpcyBtaXNzaW5nIHN1cHBvcnQgZm9yIHNpZ25pZmljYW50CisgKiAgICAgQ29tZWRpIGludGVyZmFjZSBmZWF0dXJlcy4KKyAqICAgdW50ZXN0ZWQgLSBhdXRob3IgcHJvYmFibHkgd3JvdGUgaXQgImJsaW5kIiwgYW5kIGlzIGJlbGlldmVkIHRvCisgKiAgICAgd29yaywgYnV0IG5vIGNvbmZpcm1hdGlvbi4KKyAqCisgKiBUaGVzZSBoZWFkZXJzIHNob3VsZCBiZSBmb2xsb3dlZCBieSBhIGJsYW5rIGxpbmUsIGFuZCBhbnkgY29tbWVudHMKKyAqIHlvdSB3aXNoIHRvIHNheSBhYm91dCB0aGUgZHJpdmVyLiAgVGhlIGNvbW1lbnQgYXJlYSBpcyB0aGUgcGxhY2UKKyAqIHRvIHB1dCBhbnkga25vd24gYnVncywgbGltaXRhdGlvbnMsIHVuc3VwcG9ydGVkIGZlYXR1cmVzLCBzdXBwb3J0ZWQKKyAqIGNvbW1hbmQgdHJpZ2dlcnMsIHdoZXRoZXIgb3Igbm90IGNvbW1hbmRzIGFyZSBzdXBwb3J0ZWQgb24gcGFydGljdWxhcgorICogc3ViZGV2aWNlcywgZXRjLgorICoKKyAqIFNvbWV3aGVyZSBpbiB0aGUgY29tbWVudCBzaG91bGQgYmUgaW5mb3JtYXRpb24gYWJvdXQgY29uZmlndXJhdGlvbgorICogb3B0aW9ucyB0aGF0IGFyZSB1c2VkIHdpdGggY29tZWRpX2NvbmZpZy4KKyAqLworCisjaW5jbHVkZSAiLi4vY29tZWRpbGliLmgiCisjaW5jbHVkZSAiLi4vY29tZWRpZGV2LmgiCisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisKKy8qIFRoZSBtYXhpdW11bSBudW1iZXIgb2YgY2hhbm5lbHMgcGVyIHN1YmRldmljZS4gKi8KKyNkZWZpbmUgTUFYX0NIQU5TIDI1NgorCisjZGVmaW5lIE1PRFVMRV9OQU1FICJjb21lZGlfYm9uZCIKKyNpZmRlZiBNT0RVTEVfTElDRU5TRQorTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworI2VuZGlmCisjaWZuZGVmIFNUUgorIyAgZGVmaW5lIFNUUjEoeCkgI3gKKyMgIGRlZmluZSBTVFIoeCkgU1RSMSh4KQorI2VuZGlmCisKK3N0YXRpYyBpbnQgZGVidWc7Cittb2R1bGVfcGFyYW0oZGVidWcsIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiSWYgdHJ1ZSwgcHJpbnQgZXh0cmEgY3J5cHRpYyBkZWJ1Z2dpbmcgb3V0cHV0IHVzZWZ1bCIKKwkJICJvbmx5IHRvIGRldmVsb3BlcnMuIik7CisKKyNkZWZpbmUgTE9HX01TRyh4Li4uKSBwcmludGsoS0VSTl9JTkZPIE1PRFVMRV9OQU1FIjogIngpCisjZGVmaW5lIERFQlVHKHguLi4pCQkJCQkJCVwKKwlkbyB7CQkJCQkJCQlcCisJCWlmIChkZWJ1ZykJCQkJCQlcCisJCQlwcmludGsoS0VSTl9ERUJVRyBNT0RVTEVfTkFNRSI6IERFQlVHOiAieCk7CVwKKwl9IHdoaWxlICgwKQorI2RlZmluZSBXQVJOSU5HKHguLi4pICBwcmludGsoS0VSTl9XQVJOSU5HIE1PRFVMRV9OQU1FICI6IFdBUk5JTkc6ICJ4KQorI2RlZmluZSBFUlJPUih4Li4uKSAgcHJpbnRrKEtFUk5fRVJSIE1PRFVMRV9OQU1FICI6IElOVEVSTkFMIEVSUk9SOiAieCkKK01PRFVMRV9BVVRIT1IoIkNhbGluIEEuIEN1bGlhbnUiKTsKK01PRFVMRV9ERVNDUklQVElPTihNT0RVTEVfTkFNRSAiQSBkcml2ZXIgZm9yIENPTUVESSB0byBib25kIG11bHRpcGxlIENPTUVESSAiCisJCSAgICJkZXZpY2VzIHRvZ2V0aGVyIGFzIG9uZS4gIEluIHRoZSB3b3JkcyBvZiBKb2huIExlbm5vbjogIgorCQkgICAiJ0FuZCB0aGUgd29ybGQgd2lsbCBsaXZlIGFzIG9uZS4uLiciKTsKKworLyoKKyAqIEJvYXJkIGRlc2NyaXB0aW9ucyBmb3IgdHdvIGltYWdpbmFyeSBib2FyZHMuICBEZXNjcmliaW5nIHRoZQorICogYm9hcmRzIGluIHRoaXMgd2F5IGlzIG9wdGlvbmFsLCBhbmQgY29tcGxldGVseSBkcml2ZXItZGVwZW5kZW50LgorICogU29tZSBkcml2ZXJzIHVzZSBhcnJheXMgc3VjaCBhcyB0aGlzLCBvdGhlciBkbyBub3QuCisgKi8KK3N0cnVjdCBCb25kaW5nQm9hcmQgeworCWNvbnN0IGNoYXIgKm5hbWU7Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IEJvbmRpbmdCb2FyZCBib25kaW5nQm9hcmRzW10gPSB7CisJeworCQkubmFtZSA9CU1PRFVMRV9OQU1FLAorCX0sCit9OworCisvKgorICogVXNlZnVsIGZvciBzaG9ydGhhbmQgYWNjZXNzIHRvIHRoZSBwYXJ0aWN1bGFyIGJvYXJkIHN0cnVjdHVyZQorICovCisjZGVmaW5lIHRoaXNib2FyZCAoKGNvbnN0IHN0cnVjdCBCb25kaW5nQm9hcmQgKilkZXYtPmJvYXJkX3B0cikKKworc3RydWN0IEJvbmRlZERldmljZSB7CisJY29tZWRpX3QgKmRldjsKKwl1bnNpZ25lZCBtaW5vcjsKKwl1bnNpZ25lZCBzdWJkZXY7CisJdW5zaWduZWQgc3ViZGV2X3R5cGU7CisJdW5zaWduZWQgbmNoYW5zOworCXVuc2lnbmVkIGNoYW5pZF9vZmZzZXQ7CS8qIFRoZSBvZmZzZXQgaW50byBvdXIgdW5pZmllZCBsaW5lYXIKKwkJCQkgICBjaGFubmVsLWlkJ3Mgb2YgY2hhbmlkIDAgb24gdGhpcworCQkJCSAgIHN1YmRldmljZS4gKi8KK307CisKKy8qIHRoaXMgc3RydWN0dXJlIGlzIGZvciBkYXRhIHVuaXF1ZSB0byB0aGlzIGhhcmR3YXJlIGRyaXZlci4gIElmCisgICBzZXZlcmFsIGhhcmR3YXJlIGRyaXZlcnMga2VlcCBzaW1pbGFyIGluZm9ybWF0aW9uIGluIHRoaXMgc3RydWN0dXJlLAorICAgZmVlbCBmcmVlIHRvIHN1Z2dlc3QgbW92aW5nIHRoZSB2YXJpYWJsZSB0byB0aGUgY29tZWRpX2RldmljZSBzdHJ1Y3QuICAqLworc3RydWN0IFByaXZhdGUgeworIyBkZWZpbmUgTUFYX0JPQVJEX05BTUUgMjU2CisJY2hhciBuYW1lW01BWF9CT0FSRF9OQU1FXTsKKwlzdHJ1Y3QgQm9uZGVkRGV2aWNlICoqZGV2czsKKwl1bnNpZ25lZCBuZGV2czsKKwlzdHJ1Y3QgQm9uZGVkRGV2aWNlICpjaGFuSWREZXZNYXBbTUFYX0NIQU5TXTsKKwl1bnNpZ25lZCBuY2hhbnM7Cit9OworCisvKgorICogbW9zdCBkcml2ZXJzIGRlZmluZSB0aGUgZm9sbG93aW5nIG1hY3JvIHRvIG1ha2UgaXQgZWFzeSB0bworICogYWNjZXNzIHRoZSBwcml2YXRlIHN0cnVjdHVyZS4KKyAqLworI2RlZmluZSBkZXZwcml2ICgoc3RydWN0IFByaXZhdGUgKilkZXYtPnByaXZhdGUpCisKKy8qCisgKiBUaGUgY29tZWRpX2RyaXZlciBzdHJ1Y3R1cmUgdGVsbHMgdGhlIENvbWVkaSBjb3JlIG1vZHVsZQorICogd2hpY2ggZnVuY3Rpb25zIHRvIGNhbGwgdG8gY29uZmlndXJlL2RlY29uZmlndXJlIChhdHRhY2gvZGV0YWNoKQorICogdGhlIGJvYXJkLCBhbmQgYWxzbyBhYm91dCB0aGUga2VybmVsIG1vZHVsZSB0aGF0IGNvbnRhaW5zCisgKiB0aGUgZGV2aWNlIGNvZGUuCisgKi8KK3N0YXRpYyBpbnQgYm9uZGluZ19hdHRhY2goY29tZWRpX2RldmljZSAqZGV2LCBjb21lZGlfZGV2Y29uZmlnICppdCk7CitzdGF0aWMgaW50IGJvbmRpbmdfZGV0YWNoKGNvbWVkaV9kZXZpY2UgKmRldik7CisvKiogQnVpbGQgUHJpdmF0ZSBhcnJheSBvZiBhbGwgZGV2aWNlcy4uICovCitzdGF0aWMgaW50IGRvRGV2Q29uZmlnKGNvbWVkaV9kZXZpY2UgKmRldiwgY29tZWRpX2RldmNvbmZpZyAqaXQpOworc3RhdGljIHZvaWQgZG9EZXZVbmNvbmZpZyhjb21lZGlfZGV2aWNlICpkZXYpOworLyogVWdseSBpbXBsZW1lbnRhdGlvbiBvZiByZWFsbG9jIHRoYXQgYWx3YXlzIGNvcGllcyBtZW1vcnkgYXJvdW5kIC0tIEknbSBsYXp5LAorICogd2hhdCBjYW4gSSBzYXk/ICBJIGxpa2UgdG8gZG8gd2FzdGVmdWwgbWVtY29waWVzLi4gOikgKi8KK3N0YXRpYyB2b2lkICpSZWFsbG9jKGNvbnN0IHZvaWQgKnB0ciwgc2l6ZV90IGxlbiwgc2l6ZV90IG9sZF9sZW4pOworCitzdGF0aWMgY29tZWRpX2RyaXZlciBkcml2ZXJfYm9uZGluZyA9IHsKKyAgICAgIC5kcml2ZXJfbmFtZSA9CU1PRFVMRV9OQU1FLAorICAgICAgLm1vZHVsZSA9CQlUSElTX01PRFVMRSwKKyAgICAgIC5hdHRhY2ggPQkJYm9uZGluZ19hdHRhY2gsCisgICAgICAuZGV0YWNoID0JCWJvbmRpbmdfZGV0YWNoLAorCS8qIEl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gaW1wbGVtZW50IHRoZSBmb2xsb3dpbmcgbWVtYmVycyBpZiB5b3UgYXJlCisJICogd3JpdGluZyBhIGRyaXZlciBmb3IgYSBJU0EgUG5QIG9yIFBDSSBjYXJkICovCisJLyogTW9zdCBkcml2ZXJzIHdpbGwgc3VwcG9ydCBtdWx0aXBsZSB0eXBlcyBvZiBib2FyZHMgYnkKKwkgKiBoYXZpbmcgYW4gYXJyYXkgb2YgYm9hcmQgc3RydWN0dXJlcy4gIFRoZXNlIHdlcmUgZGVmaW5lZAorCSAqIGluIHNrZWxfYm9hcmRzW10gYWJvdmUuICBOb3RlIHRoYXQgdGhlIGVsZW1lbnQgJ25hbWUnCisJICogd2FzIGZpcnN0IGluIHRoZSBzdHJ1Y3R1cmUgLS0gQ29tZWRpIHVzZXMgdGhpcyBmYWN0IHRvCisJICogZXh0cmFjdCB0aGUgbmFtZSBvZiB0aGUgYm9hcmQgd2l0aG91dCBrbm93aW5nIGFueSBkZXRhaWxzCisJICogYWJvdXQgdGhlIHN0cnVjdHVyZSBleGNlcHQgZm9yIGl0cyBsZW5ndGguCisJICogV2hlbiBhIGRldmljZSBpcyBhdHRhY2hlZCAoYnkgY29tZWRpX2NvbmZpZyksIHRoZSBuYW1lCisJICogb2YgdGhlIGRldmljZSBpcyBnaXZlbiB0byBDb21lZGksIGFuZCBDb21lZGkgdHJpZXMgdG8KKwkgKiBtYXRjaCBpdCBieSBnb2luZyB0aHJvdWdoIHRoZSBsaXN0IG9mIGJvYXJkIG5hbWVzLiAgSWYKKwkgKiB0aGVyZSBpcyBhIG1hdGNoLCB0aGUgYWRkcmVzcyBvZiB0aGUgcG9pbnRlciBpcyBwdXQKKwkgKiBpbnRvIGRldi0+Ym9hcmRfcHRyIGFuZCBkcml2ZXItPmF0dGFjaCgpIGlzIGNhbGxlZC4KKwkgKgorCSAqIE5vdGUgdGhhdCB0aGVzZSBhcmUgbm90IG5lY2Vzc2FyeSBpZiB5b3UgY2FuIGRldGVybWluZQorCSAqIHRoZSB0eXBlIG9mIGJvYXJkIGluIHNvZnR3YXJlLiAgSVNBIFBuUCwgUENJLCBhbmQgUENNQ0lBCisJICogZGV2aWNlcyBhcmUgc3VjaCBib2FyZHMuCisJICovCisgICAgICAuYm9hcmRfbmFtZSA9CSZib25kaW5nQm9hcmRzWzBdLm5hbWUsCisgICAgICAub2Zmc2V0ID0JCXNpemVvZihzdHJ1Y3QgQm9uZGluZ0JvYXJkKSwKKyAgICAgIC5udW1fbmFtZXMgPQlzaXplb2YoYm9uZGluZ0JvYXJkcykgLyBzaXplb2Yoc3RydWN0IEJvbmRpbmdCb2FyZCksCit9OworCitzdGF0aWMgaW50IGJvbmRpbmdfZGlvX2luc25fYml0cyhjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkJIGNvbWVkaV9pbnNuICppbnNuLCBsc2FtcGxfdCAqZGF0YSk7CitzdGF0aWMgaW50IGJvbmRpbmdfZGlvX2luc25fY29uZmlnKGNvbWVkaV9kZXZpY2UgKmRldiwgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCQkgICBjb21lZGlfaW5zbiAqaW5zbiwgbHNhbXBsX3QgKmRhdGEpOworCisvKgorICogQXR0YWNoIGlzIGNhbGxlZCBieSB0aGUgQ29tZWRpIGNvcmUgdG8gY29uZmlndXJlIHRoZSBkcml2ZXIKKyAqIGZvciBhIHBhcnRpY3VsYXIgYm9hcmQuICBJZiB5b3Ugc3BlY2lmaWVkIGEgYm9hcmRfbmFtZSBhcnJheQorICogaW4gdGhlIGRyaXZlciBzdHJ1Y3R1cmUsIGRldi0+Ym9hcmRfcHRyIGNvbnRhaW5zIHRoYXQKKyAqIGFkZHJlc3MuCisgKi8KK3N0YXRpYyBpbnQgYm9uZGluZ19hdHRhY2goY29tZWRpX2RldmljZSAqZGV2LCBjb21lZGlfZGV2Y29uZmlnICppdCkKK3sKKwljb21lZGlfc3ViZGV2aWNlICpzOworCisJTE9HX01TRygiY29tZWRpJWRcbiIsIGRldi0+bWlub3IpOworCisJLyoKKwkgKiBBbGxvY2F0ZSB0aGUgcHJpdmF0ZSBzdHJ1Y3R1cmUgYXJlYS4gIGFsbG9jX3ByaXZhdGUoKSBpcyBhCisJICogY29udmVuaWVudCBtYWNybyBkZWZpbmVkIGluIGNvbWVkaWRldi5oLgorCSAqLworCWlmIChhbGxvY19wcml2YXRlKGRldiwgc2l6ZW9mKHN0cnVjdCBQcml2YXRlKSkgPCAwKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qCisJICogU2V0dXAgb3VyIGJvbmRpbmcgZnJvbSBjb25maWcgcGFyYW1zLi4gc2V0cyB1cCBvdXIgUHJpdmF0ZSBzdHJ1Y3QuLgorCSAqLworCWlmICghZG9EZXZDb25maWcoZGV2LCBpdCkpCisJCXJldHVybiAtRUlOVkFMOworCisJLyoKKwkgKiBJbml0aWFsaXplIGRldi0+Ym9hcmRfbmFtZS4gIE5vdGUgdGhhdCB3ZSBjYW4gdXNlIHRoZSAidGhpc2JvYXJkIgorCSAqIG1hY3JvIG5vdywgc2luY2Ugd2UganVzdCBpbml0aWFsaXplZCBpdCBpbiB0aGUgbGFzdCBsaW5lLgorCSAqLworCWRldi0+Ym9hcmRfbmFtZSA9IGRldnByaXYtPm5hbWU7CisKKwkvKgorCSAqIEFsbG9jYXRlIHRoZSBzdWJkZXZpY2Ugc3RydWN0dXJlcy4gIGFsbG9jX3N1YmRldmljZSgpIGlzIGEKKwkgKiBjb252ZW5pZW50IG1hY3JvIGRlZmluZWQgaW4gY29tZWRpZGV2LmguCisJICovCisJaWYgKGFsbG9jX3N1YmRldmljZXMoZGV2LCAxKSA8IDApCisJCXJldHVybiAtRU5PTUVNOworCisJcyA9IGRldi0+c3ViZGV2aWNlcyArIDA7CisJcy0+dHlwZSA9IENPTUVESV9TVUJEX0RJTzsKKwlzLT5zdWJkZXZfZmxhZ3MgPSBTREZfUkVBREFCTEUgfCBTREZfV1JJVEFCTEU7CisJcy0+bl9jaGFuID0gZGV2cHJpdi0+bmNoYW5zOworCXMtPm1heGRhdGEgPSAxOworCXMtPnJhbmdlX3RhYmxlID0gJnJhbmdlX2RpZ2l0YWw7CisJcy0+aW5zbl9iaXRzID0gYm9uZGluZ19kaW9faW5zbl9iaXRzOworCXMtPmluc25fY29uZmlnID0gYm9uZGluZ19kaW9faW5zbl9jb25maWc7CisKKwlMT0dfTVNHKCJhdHRhY2hlZCB3aXRoICV1IERJTyBjaGFubmVscyBjb21pbmcgZnJvbSAldSBkaWZmZXJlbnQgIgorCQkic3ViZGV2aWNlcyBhbGwgYm9uZGVkIHRvZ2V0aGVyLiAgIgorCQkiSm9obiBMZW5ub24gd291bGQgYmUgcHJvdWQhXG4iLAorCQlkZXZwcml2LT5uY2hhbnMsIGRldnByaXYtPm5kZXZzKTsKKworCXJldHVybiAxOworfQorCisvKgorICogX2RldGFjaCBpcyBjYWxsZWQgdG8gZGVjb25maWd1cmUgYSBkZXZpY2UuICBJdCBzaG91bGQgZGVhbGxvY2F0ZQorICogcmVzb3VyY2VzLgorICogVGhpcyBmdW5jdGlvbiBpcyBhbHNvIGNhbGxlZCB3aGVuIF9hdHRhY2goKSBmYWlscywgc28gaXQgc2hvdWxkIGJlCisgKiBjYXJlZnVsIG5vdCB0byByZWxlYXNlIHJlc291cmNlcyB0aGF0IHdlcmUgbm90IG5lY2Vzc2FyaWx5CisgKiBhbGxvY2F0ZWQgYnkgX2F0dGFjaCgpLiAgZGV2LT5wcml2YXRlIGFuZCBkZXYtPnN1YmRldmljZXMgYXJlCisgKiBkZWFsbG9jYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IHRoZSBjb3JlLgorICovCitzdGF0aWMgaW50IGJvbmRpbmdfZGV0YWNoKGNvbWVkaV9kZXZpY2UgKmRldikKK3sKKwlMT0dfTVNHKCJjb21lZGklZDogcmVtb3ZlXG4iLCBkZXYtPm1pbm9yKTsKKwlkb0RldlVuY29uZmlnKGRldik7CisJcmV0dXJuIDA7Cit9CisKKy8qIERJTyBkZXZpY2VzIGFyZSBzbGlnaHRseSBzcGVjaWFsLiAgQWx0aG91Z2ggaXQgaXMgcG9zc2libGUgdG8KKyAqIGltcGxlbWVudCB0aGUgaW5zbl9yZWFkL2luc25fd3JpdGUgaW50ZXJmYWNlLCBpdCBpcyBtdWNoIG1vcmUKKyAqIHVzZWZ1bCB0byBhcHBsaWNhdGlvbnMgaWYgeW91IGltcGxlbWVudCB0aGUgaW5zbl9iaXRzIGludGVyZmFjZS4KKyAqIFRoaXMgYWxsb3dzIHBhY2tlZCByZWFkaW5nL3dyaXRpbmcgb2YgdGhlIERJTyBjaGFubmVscy4gIFRoZQorICogY29tZWRpIGNvcmUgY2FuIGNvbnZlcnQgYmV0d2VlbiBpbnNuX2JpdHMgYW5kIGluc25fcmVhZC93cml0ZSAqLworc3RhdGljIGludCBib25kaW5nX2Rpb19pbnNuX2JpdHMoY29tZWRpX2RldmljZSAqZGV2LCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJCSBjb21lZGlfaW5zbiAqaW5zbiwgbHNhbXBsX3QgKmRhdGEpCit7CisjZGVmaW5lIExTQU1QTF9CSVRTIChzaXplb2YobHNhbXBsX3QpKjgpCisJdW5zaWduZWQgbmNoYW5zID0gTFNBTVBMX0JJVFMsIG51bV9kb25lID0gMCwgaTsKKwlpZiAoaW5zbi0+biAhPSAyKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChkZXZwcml2LT5uY2hhbnMgPCBuY2hhbnMpCisJCW5jaGFucyA9IGRldnByaXYtPm5jaGFuczsKKworCS8qIFRoZSBpbnNuIGRhdGEgaXMgYSBtYXNrIGluIGRhdGFbMF0gYW5kIHRoZSBuZXcgZGF0YQorCSAqIGluIGRhdGFbMV0sIGVhY2ggY2hhbm5lbCBjb29yZXNwb25kaW5nIHRvIGEgYml0LiAqLworCWZvciAoaSA9IDA7IG51bV9kb25lIDwgbmNoYW5zICYmIGkgPCBkZXZwcml2LT5uZGV2czsgKytpKSB7CisJCXN0cnVjdCBCb25kZWREZXZpY2UgKmJkZXYgPSBkZXZwcml2LT5kZXZzW2ldOworCQkvKiBHcmFiIHRoZSBjaGFubmVsIG1hc2sgYW5kIGRhdGEgb2Ygb25seSB0aGUgYml0cyBjb3JyZXNwb25kaW5nCisJCSAgIHRvIHRoaXMgc3ViZGV2aWNlLi4gbmVlZCB0byBzaGlmdCB0aGVtIHRvIHplcm8gcG9zaXRpb24gb2YKKwkJICAgY291cnNlLiAqLworCQkvKiBCaXRzIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBzdWJkZXYuICovCisJCWxzYW1wbF90IHN1YmRldk1hc2sgPSAoKDEgPDwgYmRldi0+bmNoYW5zKSAtIDEpOworCQlsc2FtcGxfdCB3cml0ZU1hc2ssIGRhdGFCaXRzOworCisJCS8qIEFyZ2gsIHdlIGhhdmUgPj0gTFNBTVBMX0JJVFMgY2hhbnMuLiB0YWtlIGFsbCBiaXRzICovCisJCWlmIChiZGV2LT5uY2hhbnMgPj0gTFNBTVBMX0JJVFMpCisJCQlzdWJkZXZNYXNrID0gKGxzYW1wbF90KSAoLTEpOworCisJCXdyaXRlTWFzayA9IChkYXRhWzBdID4+IG51bV9kb25lKSAmIHN1YmRldk1hc2s7CisJCWRhdGFCaXRzID0gKGRhdGFbMV0gPj4gbnVtX2RvbmUpICYgc3ViZGV2TWFzazsKKworCQkvKiBSZWFkL1dyaXRlIHRoZSBuZXcgZGlnaXRhbCBsaW5lcyAqLworCQlpZiAoY29tZWRpX2Rpb19iaXRmaWVsZChiZGV2LT5kZXYsIGJkZXYtPnN1YmRldiwgd3JpdGVNYXNrLAorCQkJCSZkYXRhQml0cykgIT0gMikKKwkJCXJldHVybiAtRUlOVkFMOworCisJCS8qIE1ha2Ugcm9vbSBmb3IgdGhlIG5ldyBiaXRzIGluIGRhdGFbMV0sIHRoZSByZXR1cm4gdmFsdWUgKi8KKwkJZGF0YVsxXSAmPSB+KHN1YmRldk1hc2sgPDwgbnVtX2RvbmUpOworCQkvKiBQdXQgdGhlIGJpdHMgaW4gdGhlIHJldHVybiB2YWx1ZSAqLworCQlkYXRhWzFdIHw9IChkYXRhQml0cyAmIHN1YmRldk1hc2spIDw8IG51bV9kb25lOworCQkvKiBTYXZlIHRoZSBuZXcgYml0cyB0byB0aGUgc2F2ZWQgc3RhdGUuLiAqLworCQlzLT5zdGF0ZSA9IGRhdGFbMV07CisKKwkJbnVtX2RvbmUgKz0gYmRldi0+bmNoYW5zOworCX0KKworCXJldHVybiBpbnNuLT5uOworfQorCitzdGF0aWMgaW50IGJvbmRpbmdfZGlvX2luc25fY29uZmlnKGNvbWVkaV9kZXZpY2UgKmRldiwgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCQkgICBjb21lZGlfaW5zbiAqaW5zbiwgbHNhbXBsX3QgKmRhdGEpCit7CisJaW50IGNoYW4gPSBDUl9DSEFOKGluc24tPmNoYW5zcGVjKSwgcmV0LCBpb19iaXRzID0gcy0+aW9fYml0czsKKwl1bnNpZ25lZCBpbnQgaW87CisJc3RydWN0IEJvbmRlZERldmljZSAqYmRldjsKKworCWlmIChjaGFuIDwgMCB8fCBjaGFuID49IGRldnByaXYtPm5jaGFucykKKwkJcmV0dXJuIC1FSU5WQUw7CisJYmRldiA9IGRldnByaXYtPmNoYW5JZERldk1hcFtjaGFuXTsKKworCS8qIFRoZSBpbnB1dCBvciBvdXRwdXQgY29uZmlndXJhdGlvbiBvZiBlYWNoIGRpZ2l0YWwgbGluZSBpcworCSAqIGNvbmZpZ3VyZWQgYnkgYSBzcGVjaWFsIGluc25fY29uZmlnIGluc3RydWN0aW9uLiAgY2hhbnNwZWMKKwkgKiBjb250YWlucyB0aGUgY2hhbm5lbCB0byBiZSBjaGFuZ2VkLCBhbmQgZGF0YVswXSBjb250YWlucyB0aGUKKwkgKiB2YWx1ZSBDT01FRElfSU5QVVQgb3IgQ09NRURJX09VVFBVVC4gKi8KKwlzd2l0Y2ggKGRhdGFbMF0pIHsKKwljYXNlIElOU05fQ09ORklHX0RJT19PVVRQVVQ6CisJCWlvID0gQ09NRURJX09VVFBVVDsJLyogaXMgdGhpcyByZWFsbHkgbmVjZXNzYXJ5PyAqLworCQlpb19iaXRzIHw9IDEgPDwgY2hhbjsKKwkJYnJlYWs7CisJY2FzZSBJTlNOX0NPTkZJR19ESU9fSU5QVVQ6CisJCWlvID0gQ09NRURJX0lOUFVUOwkvKiBpcyB0aGlzIHJlYWxseSBuZWNlc3Nhcnk/ICovCisJCWlvX2JpdHMgJj0gfigxIDw8IGNoYW4pOworCQlicmVhazsKKwljYXNlIElOU05fQ09ORklHX0RJT19RVUVSWToKKwkJZGF0YVsxXSA9CisJCQkoaW9fYml0cyAmICgxIDw8IGNoYW4pKSA/IENPTUVESV9PVVRQVVQgOiBDT01FRElfSU5QVVQ7CisJCXJldHVybiBpbnNuLT5uOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwkJYnJlYWs7CisJfQorCS8qICdyZWFsJyBjaGFubmVsIGlkIGZvciB0aGlzIHN1YmRldi4uICovCisJY2hhbiAtPSBiZGV2LT5jaGFuaWRfb2Zmc2V0OworCXJldCA9IGNvbWVkaV9kaW9fY29uZmlnKGJkZXYtPmRldiwgYmRldi0+c3ViZGV2LCBjaGFuLCBpbyk7CisJaWYgKHJldCAhPSAxKQorCQlyZXR1cm4gLUVJTlZBTDsKKwkvKiBGaW5hbGx5LCBzYXZlIHRoZSBuZXcgaW9fYml0cyB2YWx1ZXMgc2luY2Ugd2UgZGlkbid0IGdldAorCSAgIGFuIGVycm9yIGFib3ZlLiAqLworCXMtPmlvX2JpdHMgPSBpb19iaXRzOworCXJldHVybiBpbnNuLT5uOworfQorCitzdGF0aWMgdm9pZCAqUmVhbGxvYyhjb25zdCB2b2lkICpvbGRtZW0sIHNpemVfdCBuZXdsZW4sIHNpemVfdCBvbGRsZW4pCit7CisJdm9pZCAqbmV3bWVtID0ga21hbGxvYyhuZXdsZW4sIEdGUF9LRVJORUwpOworCisJaWYgKG5ld21lbSAmJiBvbGRtZW0pCisJCW1lbWNweShuZXdtZW0sIG9sZG1lbSwgbWluKG9sZGxlbiwgbmV3bGVuKSk7CisJa2ZyZWUob2xkbWVtKTsKKwlyZXR1cm4gbmV3bWVtOworfQorCitzdGF0aWMgaW50IGRvRGV2Q29uZmlnKGNvbWVkaV9kZXZpY2UgKmRldiwgY29tZWRpX2RldmNvbmZpZyAqaXQpCit7CisJaW50IGk7CisJY29tZWRpX3QgKmRldnNfb3BlbmVkW0NPTUVESV9OVU1fQk9BUkRfTUlOT1JTXTsKKworCW1lbXNldChkZXZzX29wZW5lZCwgMCwgc2l6ZW9mKGRldnNfb3BlbmVkKSk7CisJZGV2cHJpdi0+bmFtZVswXSA9IDA7OworCS8qIExvb3AgdGhyb3VnaCBhbGwgY29tZWRpIGRldmljZXMgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kLWxpbmUsCisJICAgYnVpbGRpbmcgb3VyIGRldmljZSBsaXN0ICovCisJZm9yIChpID0gMDsgaSA8IENPTUVESV9OREVWQ09ORk9QVFMgJiYgKCFpIHx8IGl0LT5vcHRpb25zW2ldKTsgKytpKSB7CisJCWNoYXIgZmlsZVtdID0gIi9kZXYvY29tZWRpWFhYWFhYIjsKKwkJaW50IG1pbm9yID0gaXQtPm9wdGlvbnNbaV07CisJCWNvbWVkaV90ICpkOworCQlpbnQgc2RldiA9IC0xLCBuY2hhbnMsIHRtcDsKKwkJc3RydWN0IEJvbmRlZERldmljZSAqYmRldiA9IE5VTEw7CisKKwkJaWYgKG1pbm9yIDwgMCB8fCBtaW5vciA+IENPTUVESV9OVU1fQk9BUkRfTUlOT1JTKSB7CisJCQlFUlJPUigiTWlub3IgJWQgaXMgaW52YWxpZCFcbiIsIG1pbm9yKTsKKwkJCXJldHVybiAwOworCQl9CisJCWlmIChtaW5vciA9PSBkZXYtPm1pbm9yKSB7CisJCQlFUlJPUigiQ2Fubm90IGJvbmQgdGhpcyBkcml2ZXIgdG8gaXRzZWxmIVxuIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlpZiAoZGV2c19vcGVuZWRbbWlub3JdKSB7CisJCQlFUlJPUigiTWlub3IgJWQgc3BlY2lmaWVkIG1vcmUgdGhhbiBvbmNlIVxuIiwgbWlub3IpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQlzbnByaW50ZihmaWxlLCBzaXplb2YoZmlsZSksICIvZGV2L2NvbWVkaSV1IiwgbWlub3IpOworCQlmaWxlW3NpemVvZihmaWxlKSAtIDFdID0gMDsKKworCQlkID0gZGV2c19vcGVuZWRbbWlub3JdID0gY29tZWRpX29wZW4oZmlsZSk7CisKKwkJaWYgKCFkKSB7CisJCQlFUlJPUigiTWlub3IgJXUgY291bGQgbm90IGJlIG9wZW5lZFxuIiwgbWlub3IpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQkvKiBEbyBESU8sIGFzIHRoYXQncyBhbGwgd2Ugc3VwcG9ydCBub3cuLiAqLworCQl3aGlsZSAoKHNkZXYgPSBjb21lZGlfZmluZF9zdWJkZXZpY2VfYnlfdHlwZShkLCBDT01FRElfU1VCRF9ESU8sCisJCQkJCXNkZXYgKyAxKSkgPiAtMSkgeworCQkJbmNoYW5zID0gY29tZWRpX2dldF9uX2NoYW5uZWxzKGQsIHNkZXYpOworCQkJaWYgKG5jaGFucyA8PSAwKSB7CisJCQkJRVJST1IoImNvbWVkaV9nZXRfbl9jaGFubmVscygpIHJldHVybmVkICVkICIKKwkJCQkgICAgICAib24gbWlub3IgJXUgc3ViZGV2ICVkIVxuIiwKKwkJCQkgICAgICBuY2hhbnMsIG1pbm9yLCBzZGV2KTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCWJkZXYgPSBrbWFsbG9jKHNpemVvZigqYmRldiksIEdGUF9LRVJORUwpOworCQkJaWYgKCFiZGV2KSB7CisJCQkJRVJST1IoIk91dCBvZiBtZW1vcnkuXG4iKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCWJkZXYtPmRldiA9IGQ7CisJCQliZGV2LT5taW5vciA9IG1pbm9yOworCQkJYmRldi0+c3ViZGV2ID0gc2RldjsKKwkJCWJkZXYtPnN1YmRldl90eXBlID0gQ09NRURJX1NVQkRfRElPOworCQkJYmRldi0+bmNoYW5zID0gbmNoYW5zOworCQkJYmRldi0+Y2hhbmlkX29mZnNldCA9IGRldnByaXYtPm5jaGFuczsKKworCQkJLyogbWFwIGNoYW5uZWwgaWQncyB0byBCb25kZWREZXZpY2UgKiBwb2ludGVyLi4gKi8KKwkJCXdoaWxlIChuY2hhbnMtLSkKKwkJCQlkZXZwcml2LT5jaGFuSWREZXZNYXBbZGV2cHJpdi0+bmNoYW5zKytdID0gYmRldjsKKworCQkJLyogTm93IHB1dCBiZGV2IHBvaW50ZXIgYXQgZW5kIG9mIGRldnByaXYtPmRldnMgYXJyYXkKKwkJCSAqIGxpc3QuLiAqLworCisJCQkvKiBlcmdoLi4gdWdseS4uIHdlIG5lZWQgdG8gcmVhbGxvYyA6KCAgKi8KKwkJCXRtcCA9IGRldnByaXYtPm5kZXZzICogc2l6ZW9mKGJkZXYpOworCQkJZGV2cHJpdi0+ZGV2cyA9CisJCQkJUmVhbGxvYyhkZXZwcml2LT5kZXZzLAorCQkJCSsrZGV2cHJpdi0+bmRldnMgKiBzaXplb2YoYmRldiksIHRtcCk7CisJCQlpZiAoIWRldnByaXYtPmRldnMpIHsKKwkJCQlFUlJPUigiQ291bGQgbm90IGFsbG9jYXRlIG1lbW9yeS4gIgorCQkJCSAgICAgICJPdXQgb2YgbWVtb3J5PyIpOworCQkJCXJldHVybiAwOworCQkJfQorCisJCQlkZXZwcml2LT5kZXZzW2RldnByaXYtPm5kZXZzIC0gMV0gPSBiZGV2OworCQkJeworCS8qKiBBcHBlbmQgZGV2OnN1YmRldiB0byBkZXZwcml2LT5uYW1lICovCisJCQkJY2hhciBidWZbMjBdOworCQkJCWludCBsZWZ0ID0KKwkJCQkJTUFYX0JPQVJEX05BTUUgLSBzdHJsZW4oZGV2cHJpdi0+bmFtZSkgLQorCQkJCQkxOworCQkJCXNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIlZDolZCAiLCBkZXYtPm1pbm9yLAorCQkJCQliZGV2LT5zdWJkZXYpOworCQkJCWJ1ZltzaXplb2YoYnVmKSAtIDFdID0gMDsKKwkJCQlzdHJuY2F0KGRldnByaXYtPm5hbWUsIGJ1ZiwgbGVmdCk7CisJCQl9CisKKwkJfQorCX0KKworCWlmICghZGV2cHJpdi0+bmNoYW5zKSB7CisJCUVSUk9SKCJObyBjaGFubmVscyBmb3VuZCFcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgZG9EZXZVbmNvbmZpZyhjb21lZGlfZGV2aWNlICpkZXYpCit7CisJdW5zaWduZWQgbG9uZyBkZXZzX2Nsb3NlZCA9IDA7CisKKwlpZiAoZGV2cHJpdikgeworCQl3aGlsZSAoZGV2cHJpdi0+bmRldnMtLSAmJiBkZXZwcml2LT5kZXZzKSB7CisJCQlzdHJ1Y3QgQm9uZGVkRGV2aWNlICpiZGV2OworCisJCQliZGV2ID0gZGV2cHJpdi0+ZGV2c1tkZXZwcml2LT5uZGV2c107CisJCQlpZiAoIWJkZXYpCisJCQkJY29udGludWU7CisJCQlpZiAoIShkZXZzX2Nsb3NlZCAmICgweDEgPDwgYmRldi0+bWlub3IpKSkgeworCQkJCWNvbWVkaV9jbG9zZShiZGV2LT5kZXYpOworCQkJCWRldnNfY2xvc2VkIHw9ICgweDEgPDwgYmRldi0+bWlub3IpOworCQkJfQorCQkJa2ZyZWUoYmRldik7CisJCX0KKwkJa2ZyZWUoZGV2cHJpdi0+ZGV2cyk7CisJCWRldnByaXYtPmRldnMgPSBOVUxMOworCQlrZnJlZShkZXZwcml2KTsKKwkJZGV2LT5wcml2YXRlID0gTlVMTDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXQodm9pZCkKK3sKKwlyZXR1cm4gY29tZWRpX2RyaXZlcl9yZWdpc3RlcigmZHJpdmVyX2JvbmRpbmcpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgY2xlYW51cCh2b2lkKQoreworCWNvbWVkaV9kcml2ZXJfdW5yZWdpc3RlcigmZHJpdmVyX2JvbmRpbmcpOworfQorCittb2R1bGVfaW5pdChpbml0KTsKK21vZHVsZV9leGl0KGNsZWFudXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NvbWVkaV9mYy5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NvbWVkaV9mYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkNzRkYmUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY29tZWRpX2ZjLmMKQEAgLTAsMCArMSwxMTggQEAKKy8qCisgICAgY29tZWRpL2RyaXZlcnMvY29tZWRpX2ZjLmMKKworICAgIFRoaXMgaXMgYSBwbGFjZSBmb3IgY29kZSBkcml2ZXIgd3JpdGVycyB3aXNoIHRvIHNoYXJlIGJldHdlZW4KKyAgICB0d28gb3IgbW9yZSBkcml2ZXJzLiAgZmMgaXMgc2hvcnQKKyAgICBmb3IgZnJhbmstY29tbW9uLgorCisgICAgQXV0aG9yOiAgRnJhbmsgTW9yaSBIZXNzIDxmbWhlc3NAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorICAgIENvcHlyaWdodCAoQykgMjAwMiBGcmFuayBNb3JpIEhlc3MKKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICIuLi9jb21lZGlkZXYuaCIKKworI2luY2x1ZGUgImNvbWVkaV9mYy5oIgorCitzdGF0aWMgdm9pZCBpbmNyZW1lbnRfc2Nhbl9wcm9ncmVzcyhjb21lZGlfc3ViZGV2aWNlICpzdWJkLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgbnVtX2J5dGVzKQoreworCWNvbWVkaV9hc3luYyAqYXN5bmMgPSBzdWJkLT5hc3luYzsKKwl1bnNpZ25lZCBpbnQgc2Nhbl9sZW5ndGggPSBjZmNfYnl0ZXNfcGVyX3NjYW4oc3ViZCk7CisKKwlhc3luYy0+c2Nhbl9wcm9ncmVzcyArPSBudW1fYnl0ZXM7CisJaWYgKGFzeW5jLT5zY2FuX3Byb2dyZXNzID49IHNjYW5fbGVuZ3RoKSB7CisJCWFzeW5jLT5zY2FuX3Byb2dyZXNzICU9IHNjYW5fbGVuZ3RoOworCQlhc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FT1M7CisJfQorfQorCisvKiBXcml0ZXMgYW4gYXJyYXkgb2YgZGF0YSBwb2ludHMgdG8gY29tZWRpJ3MgYnVmZmVyICovCit1bnNpZ25lZCBpbnQgY2ZjX3dyaXRlX2FycmF5X3RvX2J1ZmZlcihjb21lZGlfc3ViZGV2aWNlICpzdWJkLCB2b2lkICpkYXRhLAorCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgbnVtX2J5dGVzKQoreworCWNvbWVkaV9hc3luYyAqYXN5bmMgPSBzdWJkLT5hc3luYzsKKwl1bnNpZ25lZCBpbnQgcmV0dmFsOworCisJaWYgKG51bV9ieXRlcyA9PSAwKQorCQlyZXR1cm4gMDsKKworCXJldHZhbCA9IGNvbWVkaV9idWZfd3JpdGVfYWxsb2MoYXN5bmMsIG51bV9ieXRlcyk7CisJaWYgKHJldHZhbCAhPSBudW1fYnl0ZXMpIHsKKwkJcnRfcHJpbnRrKCJjb21lZGk6IGJ1ZmZlciBvdmVycnVuXG4iKTsKKwkJYXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfT1ZFUkZMT1c7CisJCXJldHVybiAwOworCX0KKworCWNvbWVkaV9idWZfbWVtY3B5X3RvKGFzeW5jLCAwLCBkYXRhLCBudW1fYnl0ZXMpOworCWNvbWVkaV9idWZfd3JpdGVfZnJlZShhc3luYywgbnVtX2J5dGVzKTsKKwlpbmNyZW1lbnRfc2Nhbl9wcm9ncmVzcyhzdWJkLCBudW1fYnl0ZXMpOworCWFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0JMT0NLOworCisJcmV0dXJuIG51bV9ieXRlczsKK30KK0VYUE9SVF9TWU1CT0woY2ZjX3dyaXRlX2FycmF5X3RvX2J1ZmZlcik7CisKK3Vuc2lnbmVkIGludCBjZmNfcmVhZF9hcnJheV9mcm9tX2J1ZmZlcihjb21lZGlfc3ViZGV2aWNlICpzdWJkLCB2b2lkICpkYXRhLAorCQkJCQl1bnNpZ25lZCBpbnQgbnVtX2J5dGVzKQoreworCWNvbWVkaV9hc3luYyAqYXN5bmMgPSBzdWJkLT5hc3luYzsKKworCWlmIChudW1fYnl0ZXMgPT0gMCkKKwkJcmV0dXJuIDA7CisKKwludW1fYnl0ZXMgPSBjb21lZGlfYnVmX3JlYWRfYWxsb2MoYXN5bmMsIG51bV9ieXRlcyk7CisJY29tZWRpX2J1Zl9tZW1jcHlfZnJvbShhc3luYywgMCwgZGF0YSwgbnVtX2J5dGVzKTsKKwljb21lZGlfYnVmX3JlYWRfZnJlZShhc3luYywgbnVtX2J5dGVzKTsKKwlpbmNyZW1lbnRfc2Nhbl9wcm9ncmVzcyhzdWJkLCBudW1fYnl0ZXMpOworCWFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0JMT0NLOworCisJcmV0dXJuIG51bV9ieXRlczsKK30KK0VYUE9SVF9TWU1CT0woY2ZjX3JlYWRfYXJyYXlfZnJvbV9idWZmZXIpOworCit1bnNpZ25lZCBpbnQgY2ZjX2hhbmRsZV9ldmVudHMoY29tZWRpX2RldmljZSAqZGV2LCBjb21lZGlfc3ViZGV2aWNlICpzdWJkKQoreworCXVuc2lnbmVkIGludCBldmVudHMgPSBzdWJkLT5hc3luYy0+ZXZlbnRzOworCisJaWYgKGV2ZW50cyA9PSAwKQorCQlyZXR1cm4gZXZlbnRzOworCisJaWYgKGV2ZW50cyAmIChDT01FRElfQ0JfRU9BIHwgQ09NRURJX0NCX0VSUk9SIHwgQ09NRURJX0NCX09WRVJGTE9XKSkKKwkJc3ViZC0+Y2FuY2VsKGRldiwgc3ViZCk7CisKKwljb21lZGlfZXZlbnQoZGV2LCBzdWJkKTsKKworCXJldHVybiBldmVudHM7Cit9CitFWFBPUlRfU1lNQk9MKGNmY19oYW5kbGVfZXZlbnRzKTsKKworTU9EVUxFX0FVVEhPUigiRnJhbmsgTW9yaSBIZXNzIDxmbWhlc3NAdXNlcnMuc291cmNlZm9yZ2UubmV0PiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJTaGFyZWQgZnVuY3Rpb25zIGZvciBDb21lZGkgbG93LWxldmVsIGRyaXZlcnMiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworc3RhdGljIGludCBfX2luaXQgY29tZWRpX2ZjX2luaXRfbW9kdWxlKHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBjb21lZGlfZmNfY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKK30KKworbW9kdWxlX2luaXQoY29tZWRpX2ZjX2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KGNvbWVkaV9mY19jbGVhbnVwX21vZHVsZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY29tZWRpX2ZjLmggYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY29tZWRpX2ZjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjk1MmZlMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jb21lZGlfZmMuaApAQCAtMCwwICsxLDc2IEBACisvKgorICAgIGNvbWVkaV9mYy5oCisKKyAgICBUaGlzIGlzIGEgcGxhY2UgZm9yIGNvZGUgZHJpdmVyIHdyaXRlcnMgd2lzaCB0byBzaGFyZSBiZXR3ZWVuCisgICAgdHdvIG9yIG1vcmUgZHJpdmVycy4gVGhlc2UgZnVuY3Rpb25zIGFyZSBtZWFudCB0byBiZSB1c2VkIG9ubHkKKyAgICBieSBkcml2ZXJzLCB0aGV5IGFyZSBOT1QgcGFydCBvZiB0aGUga2NvbWVkaWxpYiBBUEkhCisKKyAgICBBdXRob3I6ICBGcmFuayBNb3JpIEhlc3MgPGZtaGVzc0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisgICAgQ29weXJpZ2h0IChDKSAyMDAyIEZyYW5rIE1vcmkgSGVzcworCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfQ09NRURJX0ZDX0gKKyNkZWZpbmUgX0NPTUVESV9GQ19ICisKKyNpbmNsdWRlICIuLi9jb21lZGlkZXYuaCIKKworLyogV3JpdGVzIGFuIGFycmF5IG9mIGRhdGEgcG9pbnRzIHRvIGNvbWVkaSdzIGJ1ZmZlciAqLworZXh0ZXJuIHVuc2lnbmVkIGludCBjZmNfd3JpdGVfYXJyYXlfdG9fYnVmZmVyKGNvbWVkaV9zdWJkZXZpY2UgKnN1YmQsCisJCQkJCSAgICAgIHZvaWQgKmRhdGEsCisJCQkJCSAgICAgIHVuc2lnbmVkIGludCBudW1fYnl0ZXMpOworCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBjZmNfd3JpdGVfdG9fYnVmZmVyKGNvbWVkaV9zdWJkZXZpY2UgKnN1YmQsCisJCQkJCSAgICAgICBzYW1wbF90IGRhdGEpCit7CisJcmV0dXJuIGNmY193cml0ZV9hcnJheV90b19idWZmZXIoc3ViZCwgJmRhdGEsIHNpemVvZihkYXRhKSk7Cit9OworCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBjZmNfd3JpdGVfbG9uZ190b19idWZmZXIoY29tZWRpX3N1YmRldmljZSAqc3ViZCwKKwkJCQkJCSAgICBsc2FtcGxfdCBkYXRhKQoreworCXJldHVybiBjZmNfd3JpdGVfYXJyYXlfdG9fYnVmZmVyKHN1YmQsICZkYXRhLCBzaXplb2YoZGF0YSkpOworfTsKKworZXh0ZXJuIHVuc2lnbmVkIGludCBjZmNfcmVhZF9hcnJheV9mcm9tX2J1ZmZlcihjb21lZGlfc3ViZGV2aWNlICpzdWJkLAorCQkJCQkgICAgICAgdm9pZCAqZGF0YSwKKwkJCQkJICAgICAgIHVuc2lnbmVkIGludCBudW1fYnl0ZXMpOworCitleHRlcm4gdW5zaWduZWQgaW50IGNmY19oYW5kbGVfZXZlbnRzKGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCQkgICAgICBjb21lZGlfc3ViZGV2aWNlICpzdWJkKTsKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgY2ZjX2J5dGVzX3Blcl9zY2FuKGNvbWVkaV9zdWJkZXZpY2UgKnN1YmQpCit7CisJaW50IG51bV9zYW1wbGVzOworCWludCBiaXRzX3Blcl9zYW1wbGU7CisKKwlzd2l0Y2ggKHN1YmQtPnR5cGUpIHsKKwljYXNlIENPTUVESV9TVUJEX0RJOgorCWNhc2UgQ09NRURJX1NVQkRfRE86CisJY2FzZSBDT01FRElfU1VCRF9ESU86CisJCWJpdHNfcGVyX3NhbXBsZSA9IDggKiBieXRlc19wZXJfc2FtcGxlKHN1YmQpOworCQludW1fc2FtcGxlcyA9IChzdWJkLT5hc3luYy0+Y21kLmNoYW5saXN0X2xlbiArCisJCQkgICAgICAgYml0c19wZXJfc2FtcGxlIC0gMSkgLyBiaXRzX3Blcl9zYW1wbGU7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCW51bV9zYW1wbGVzID0gc3ViZC0+YXN5bmMtPmNtZC5jaGFubGlzdF9sZW47CisJCWJyZWFrOworCX0KKwlyZXR1cm4gbnVtX3NhbXBsZXMgKiBieXRlc19wZXJfc2FtcGxlKHN1YmQpOworfQorCisjZW5kaWYgLyogX0NPTUVESV9GQ19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY29tZWRpX3BhcnBvcnQuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jb21lZGlfcGFycG9ydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhODM4ZmYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY29tZWRpX3BhcnBvcnQuYwpAQCAtMCwwICsxLDM5MCBAQAorLyoKKyAgICBjb21lZGkvZHJpdmVycy9jb21lZGlfcGFycG9ydC5jCisgICAgaGFyZHdhcmUgZHJpdmVyIGZvciBzdGFuZGFyZCBwYXJhbGxlbCBwb3J0CisKKyAgICBDT01FREkgLSBMaW51eCBDb250cm9sIGFuZCBNZWFzdXJlbWVudCBEZXZpY2UgSW50ZXJmYWNlCisgICAgQ29weXJpZ2h0IChDKSAxOTk4LDIwMDEgRGF2aWQgQS4gU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworKi8KKy8qCitEcml2ZXI6IGNvbWVkaV9wYXJwb3J0CitEZXNjcmlwdGlvbjogU3RhbmRhcmQgUEMgcGFyYWxsZWwgcG9ydAorQXV0aG9yOiBkcworU3RhdHVzOiB3b3JrcyBpbiBpbW1lZGlhdGUgbW9kZQorRGV2aWNlczogW3N0YW5kYXJkXSBwYXJhbGxlbCBwb3J0IChjb21lZGlfcGFycG9ydCkKK1VwZGF0ZWQ6IFR1ZSwgMzAgQXByIDIwMDIgMjE6MTE6NDUgLTA3MDAKKworQSBjaGVhcCBhbmQgZWFzeSB3YXkgdG8gZ2V0IGEgZmV3IG1vcmUgZGlnaXRhbCBJL08gbGluZXMuICBTdGVhbAorYWRkaXRpb25hbCBwYXJhbGxlbCBwb3J0cyBmcm9tIG9sZCBjb21wdXRlcnMgb3IgeW91ciBuZWlnaGJvcnMnCitjb21wdXRlcnMuCisKK09wdGlvbiBsaXN0OgorIDA6IEkvTyBwb3J0IGJhc2UgZm9yIHRoZSBwYXJhbGxlbCBwb3J0LgorIDE6IElSUQorCitQYXJhbGxlbCBQb3J0IExpbmVzOgorCitwaW4gICAgIHN1YmRldiAgY2hhbiAgICBha2EKKy0tLSAgICAgLS0tLS0tICAtLS0tICAgIC0tLQorMSAgICAgICAyICAgICAgIDAgICAgICAgc3Ryb2JlCisyICAgICAgIDAgICAgICAgMCAgICAgICBkYXRhIDAKKzMgICAgICAgMCAgICAgICAxICAgICAgIGRhdGEgMQorNCAgICAgICAwICAgICAgIDIgICAgICAgZGF0YSAyCis1ICAgICAgIDAgICAgICAgMyAgICAgICBkYXRhIDMKKzYgICAgICAgMCAgICAgICA0ICAgICAgIGRhdGEgNAorNyAgICAgICAwICAgICAgIDUgICAgICAgZGF0YSA1Cis4ICAgICAgIDAgICAgICAgNiAgICAgICBkYXRhIDYKKzkgICAgICAgMCAgICAgICA3ICAgICAgIGRhdGEgNworMTAgICAgICAxICAgICAgIDMgICAgICAgYWNrbm93bGVkZ2UKKzExICAgICAgMSAgICAgICA0ICAgICAgIGJ1c3kKKzEyICAgICAgMSAgICAgICAyICAgICAgIG91dHB1dAorMTMgICAgICAxICAgICAgIDEgICAgICAgcHJpbnRlciBzZWxlY3RlZAorMTQgICAgICAyICAgICAgIDEgICAgICAgYXV0byBMRgorMTUgICAgICAxICAgICAgIDAgICAgICAgZXJyb3IKKzE2ICAgICAgMiAgICAgICAyICAgICAgIGluaXQKKzE3ICAgICAgMiAgICAgICAzICAgICAgIHNlbGVjdCBwcmludGVyCisxOC0yNSAgIGdyb3VuZAorCitOb3RlczoKKworU3ViZGV2aWNlcyAwIGlzIGRpZ2l0YWwgSS9PLCBzdWJkZXZpY2UgMSBpcyBkaWdpdGFsIGlucHV0LCBhbmQKK3N1YmRldmljZSAyIGlzIGRpZ2l0YWwgb3V0cHV0LiAgVW5saWtlIG90aGVyIENvbWVkaSBkZXZpY2VzLAorc3ViZGV2aWNlIDAgZGVmYXVsdHMgdG8gb3V0cHV0LgorCitQaW5zIDEzIGFuZCAxNCBhcmUgaW52ZXJ0ZWQgb25jZSBieSBDb21lZGkgYW5kIG9uY2UgYnkgdGhlCitoYXJkd2FyZSwgdGh1cyBjYW5jZWxsaW5nIHRoZSBlZmZlY3QuCisKK1BpbiAxIGlzIGEgc3Ryb2JlLCB0aHVzIGFjdHMgbGlrZSBvbmUuICBUaGVyZSdzIG5vIHdheSBpbiBzb2Z0d2FyZQordG8gY2hhbmdlIHRoaXMsIGF0IGxlYXN0IG9uIGEgc3RhbmRhcmQgcGFyYWxsZWwgcG9ydC4KKworU3ViZGV2aWNlIDMgcHJldGVuZHMgdG8gYmUgYSBkaWdpdGFsIGlucHV0IHN1YmRldmljZSwgYnV0IGl0IGFsd2F5cworcmV0dXJucyAwIHdoZW4gcmVhZC4gIEhvd2V2ZXIsIGlmIHlvdSBydW4gYSBjb21tYW5kIHdpdGgKK3NjYW5fYmVnaW5fc3JjPVRSSUdfRVhULCBpdCB1c2VzIHBpbiAxMCBhcyBhIGV4dGVybmFsIHRyaWdnZXJpbmcKK3Bpbiwgd2hpY2ggY2FuIGJlIHVzZWQgdG8gd2FrZSB1cCB0YXNrcy4KKyovCisvKgorICAgc2VlIGh0dHA6Ly93d3cuYmV5b25kbG9naWMub3JnLyBmb3IgaW5mb3JtYXRpb24uCisgICBvciBodHRwOi8vd3d3LmxpbnV4LW1hZ2F6aW4uZGUvYXVzZ2FiZS8xOTk5LzEwL0lPL2lvLmh0bWwKKyAqLworCisjaW5jbHVkZSAiLi4vY29tZWRpZGV2LmgiCisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisKKyNkZWZpbmUgUEFSUE9SVF9TSVpFIDMKKworI2RlZmluZSBQQVJQT1JUX0EgMAorI2RlZmluZSBQQVJQT1JUX0IgMQorI2RlZmluZSBQQVJQT1JUX0MgMgorCitzdGF0aWMgaW50IHBhcnBvcnRfYXR0YWNoKGNvbWVkaV9kZXZpY2UgKmRldiwgY29tZWRpX2RldmNvbmZpZyAqaXQpOworc3RhdGljIGludCBwYXJwb3J0X2RldGFjaChjb21lZGlfZGV2aWNlICpkZXYpOworc3RhdGljIGNvbWVkaV9kcml2ZXIgZHJpdmVyX3BhcnBvcnQgPSB7CisgICAgICAuZHJpdmVyX25hbWUgPQkiY29tZWRpX3BhcnBvcnQiLAorICAgICAgLm1vZHVsZSA9CQlUSElTX01PRFVMRSwKKyAgICAgIC5hdHRhY2ggPQkJcGFycG9ydF9hdHRhY2gsCisgICAgICAuZGV0YWNoID0JCXBhcnBvcnRfZGV0YWNoLAorfTsKKworQ09NRURJX0lOSVRDTEVBTlVQKGRyaXZlcl9wYXJwb3J0KTsKKworc3RydWN0IHBhcnBvcnRfcHJpdmF0ZSB7CisJdW5zaWduZWQgaW50IGFfZGF0YTsKKwl1bnNpZ25lZCBpbnQgY19kYXRhOworCWludCBlbmFibGVfaXJxOworfTsKKyNkZWZpbmUgZGV2cHJpdiAoKHN0cnVjdCBwYXJwb3J0X3ByaXZhdGUgKikoZGV2LT5wcml2YXRlKSkKKworc3RhdGljIGludCBwYXJwb3J0X2luc25fYShjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkgIGNvbWVkaV9pbnNuICppbnNuLCBsc2FtcGxfdCAqZGF0YSkKK3sKKwlpZiAoZGF0YVswXSkgeworCQlkZXZwcml2LT5hX2RhdGEgJj0gfmRhdGFbMF07CisJCWRldnByaXYtPmFfZGF0YSB8PSAoZGF0YVswXSAmIGRhdGFbMV0pOworCisJCW91dGIoZGV2cHJpdi0+YV9kYXRhLCBkZXYtPmlvYmFzZSArIFBBUlBPUlRfQSk7CisJfQorCisJZGF0YVsxXSA9IGluYihkZXYtPmlvYmFzZSArIFBBUlBPUlRfQSk7CisKKwlyZXR1cm4gMjsKK30KKworc3RhdGljIGludCBwYXJwb3J0X2luc25fY29uZmlnX2EoY29tZWRpX2RldmljZSAqZGV2LCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJCSBjb21lZGlfaW5zbiAqaW5zbiwgbHNhbXBsX3QgKmRhdGEpCit7CisJaWYgKGRhdGFbMF0pIHsKKwkJcy0+aW9fYml0cyA9IDB4ZmY7CisJCWRldnByaXYtPmNfZGF0YSAmPSB+KDEgPDwgNSk7CisJfSBlbHNlIHsKKwkJcy0+aW9fYml0cyA9IDA7CisJCWRldnByaXYtPmNfZGF0YSB8PSAoMSA8PCA1KTsKKwl9CisJb3V0YihkZXZwcml2LT5jX2RhdGEsIGRldi0+aW9iYXNlICsgUEFSUE9SVF9DKTsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IHBhcnBvcnRfaW5zbl9iKGNvbWVkaV9kZXZpY2UgKmRldiwgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCSAgY29tZWRpX2luc24gKmluc24sIGxzYW1wbF90ICpkYXRhKQoreworCWlmIChkYXRhWzBdKSB7CisJCS8qIHNob3VsZCB3cml0ZXMgYmUgaWdub3JlZD8gKi8KKwkJLyogYW55b25lPz8/ICovCisJfQorCisJZGF0YVsxXSA9IChpbmIoZGV2LT5pb2Jhc2UgKyBQQVJQT1JUX0IpID4+IDMpOworCisJcmV0dXJuIDI7Cit9CisKK3N0YXRpYyBpbnQgcGFycG9ydF9pbnNuX2MoY29tZWRpX2RldmljZSAqZGV2LCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJICBjb21lZGlfaW5zbiAqaW5zbiwgbHNhbXBsX3QgKmRhdGEpCit7CisJZGF0YVswXSAmPSAweDBmOworCWlmIChkYXRhWzBdKSB7CisJCWRldnByaXYtPmNfZGF0YSAmPSB+ZGF0YVswXTsKKwkJZGV2cHJpdi0+Y19kYXRhIHw9IChkYXRhWzBdICYgZGF0YVsxXSk7CisKKwkJb3V0YihkZXZwcml2LT5jX2RhdGEsIGRldi0+aW9iYXNlICsgUEFSUE9SVF9DKTsKKwl9CisKKwlkYXRhWzFdID0gZGV2cHJpdi0+Y19kYXRhICYgMHhmOworCisJcmV0dXJuIDI7Cit9CisKK3N0YXRpYyBpbnQgcGFycG9ydF9pbnRyX2luc24oY29tZWRpX2RldmljZSAqZGV2LCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJICAgICBjb21lZGlfaW5zbiAqaW5zbiwgbHNhbXBsX3QgKmRhdGEpCit7CisJaWYgKGluc24tPm4gPCAxKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRhdGFbMV0gPSAwOworCXJldHVybiAyOworfQorCitzdGF0aWMgaW50IHBhcnBvcnRfaW50cl9jbWR0ZXN0KGNvbWVkaV9kZXZpY2UgKmRldiwgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCQljb21lZGlfY21kICpjbWQpCit7CisJaW50IGVyciA9IDA7CisJaW50IHRtcDsKKworCS8qIHN0ZXAgMSAqLworCisJdG1wID0gY21kLT5zdGFydF9zcmM7CisJY21kLT5zdGFydF9zcmMgJj0gVFJJR19OT1c7CisJaWYgKCFjbWQtPnN0YXJ0X3NyYyB8fCB0bXAgIT0gY21kLT5zdGFydF9zcmMpCisJCWVycisrOworCisJdG1wID0gY21kLT5zY2FuX2JlZ2luX3NyYzsKKwljbWQtPnNjYW5fYmVnaW5fc3JjICY9IFRSSUdfRVhUOworCWlmICghY21kLT5zY2FuX2JlZ2luX3NyYyB8fCB0bXAgIT0gY21kLT5zY2FuX2JlZ2luX3NyYykKKwkJZXJyKys7CisKKwl0bXAgPSBjbWQtPmNvbnZlcnRfc3JjOworCWNtZC0+Y29udmVydF9zcmMgJj0gVFJJR19GT0xMT1c7CisJaWYgKCFjbWQtPmNvbnZlcnRfc3JjIHx8IHRtcCAhPSBjbWQtPmNvbnZlcnRfc3JjKQorCQllcnIrKzsKKworCXRtcCA9IGNtZC0+c2Nhbl9lbmRfc3JjOworCWNtZC0+c2Nhbl9lbmRfc3JjICY9IFRSSUdfQ09VTlQ7CisJaWYgKCFjbWQtPnNjYW5fZW5kX3NyYyB8fCB0bXAgIT0gY21kLT5zY2FuX2VuZF9zcmMpCisJCWVycisrOworCisJdG1wID0gY21kLT5zdG9wX3NyYzsKKwljbWQtPnN0b3Bfc3JjICY9IFRSSUdfTk9ORTsKKwlpZiAoIWNtZC0+c3RvcF9zcmMgfHwgdG1wICE9IGNtZC0+c3RvcF9zcmMpCisJCWVycisrOworCisJaWYgKGVycikKKwkJcmV0dXJuIDE7CisKKwkvKiBzdGVwIDI6IGlnbm9yZWQgKi8KKworCWlmIChlcnIpCisJCXJldHVybiAyOworCisJLyogc3RlcCAzOiAqLworCisJaWYgKGNtZC0+c3RhcnRfYXJnICE9IDApIHsKKwkJY21kLT5zdGFydF9hcmcgPSAwOworCQllcnIrKzsKKwl9CisJaWYgKGNtZC0+c2Nhbl9iZWdpbl9hcmcgIT0gMCkgeworCQljbWQtPnNjYW5fYmVnaW5fYXJnID0gMDsKKwkJZXJyKys7CisJfQorCWlmIChjbWQtPmNvbnZlcnRfYXJnICE9IDApIHsKKwkJY21kLT5jb252ZXJ0X2FyZyA9IDA7CisJCWVycisrOworCX0KKwlpZiAoY21kLT5zY2FuX2VuZF9hcmcgIT0gMSkgeworCQljbWQtPnNjYW5fZW5kX2FyZyA9IDE7CisJCWVycisrOworCX0KKwlpZiAoY21kLT5zdG9wX2FyZyAhPSAwKSB7CisJCWNtZC0+c3RvcF9hcmcgPSAwOworCQllcnIrKzsKKwl9CisKKwlpZiAoZXJyKQorCQlyZXR1cm4gMzsKKworCS8qIHN0ZXAgNDogaWdub3JlZCAqLworCisJaWYgKGVycikKKwkJcmV0dXJuIDQ7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwYXJwb3J0X2ludHJfY21kKGNvbWVkaV9kZXZpY2UgKmRldiwgY29tZWRpX3N1YmRldmljZSAqcykKK3sKKwlkZXZwcml2LT5jX2RhdGEgfD0gMHgxMDsKKwlvdXRiKGRldnByaXYtPmNfZGF0YSwgZGV2LT5pb2Jhc2UgKyBQQVJQT1JUX0MpOworCisJZGV2cHJpdi0+ZW5hYmxlX2lycSA9IDE7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwYXJwb3J0X2ludHJfY2FuY2VsKGNvbWVkaV9kZXZpY2UgKmRldiwgY29tZWRpX3N1YmRldmljZSAqcykKK3sKKwlwcmludGsoS0VSTl9ERUJVRyAicGFycG9ydF9pbnRyX2NhbmNlbCgpXG4iKTsKKworCWRldnByaXYtPmNfZGF0YSAmPSB+MHgxMDsKKwlvdXRiKGRldnByaXYtPmNfZGF0YSwgZGV2LT5pb2Jhc2UgKyBQQVJQT1JUX0MpOworCisJZGV2cHJpdi0+ZW5hYmxlX2lycSA9IDA7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlycXJldHVybl90IHBhcnBvcnRfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmQgUFRfUkVHU19BUkcpCit7CisJY29tZWRpX2RldmljZSAqZGV2ID0gZDsKKwljb21lZGlfc3ViZGV2aWNlICpzID0gZGV2LT5zdWJkZXZpY2VzICsgMzsKKworCWlmICghZGV2cHJpdi0+ZW5hYmxlX2lycSkgeworCQlwcmludGsoS0VSTl9FUlIgImNvbWVkaV9wYXJwb3J0OiBib2d1cyBpcnEsIGlnbm9yZWRcbiIpOworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCisJY29tZWRpX2J1Zl9wdXQocy0+YXN5bmMsIDApOworCXMtPmFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0JMT0NLIHwgQ09NRURJX0NCX0VPUzsKKworCWNvbWVkaV9ldmVudChkZXYsIHMpOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludCBwYXJwb3J0X2F0dGFjaChjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9kZXZjb25maWcgKml0KQoreworCWludCByZXQ7CisJdW5zaWduZWQgaW50IGlycTsKKwl1bnNpZ25lZCBsb25nIGlvYmFzZTsKKwljb21lZGlfc3ViZGV2aWNlICpzOworCisJaW9iYXNlID0gaXQtPm9wdGlvbnNbMF07CisJcHJpbnRrKEtFUk5fSU5GTyAiY29tZWRpJWQ6IHBhcnBvcnQ6IDB4JTA0bHggIiwgZGV2LT5taW5vciwgaW9iYXNlKTsKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKGlvYmFzZSwgUEFSUE9SVF9TSVpFLCAicGFycG9ydCAoY29tZWRpKSIpKSB7CisJCXByaW50aygiSS9PIHBvcnQgY29uZmxpY3RcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJZGV2LT5pb2Jhc2UgPSBpb2Jhc2U7CisKKwlpcnEgPSBpdC0+b3B0aW9uc1sxXTsKKwlpZiAoaXJxKSB7CisJCXByaW50aygiIGlycT0ldSIsIGlycSk7CisJCXJldCA9IGNvbWVkaV9yZXF1ZXN0X2lycShpcnEsIHBhcnBvcnRfaW50ZXJydXB0LCAwLAorCQkJImNvbWVkaV9wYXJwb3J0IiwgZGV2KTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCXByaW50aygiIGlycSBub3QgYXZhaWxhYmxlXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWRldi0+aXJxID0gaXJxOworCX0KKwlkZXYtPmJvYXJkX25hbWUgPSAicGFycG9ydCI7CisKKwlyZXQgPSBhbGxvY19zdWJkZXZpY2VzKGRldiwgNCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisJcmV0ID0gYWxsb2NfcHJpdmF0ZShkZXYsIHNpemVvZihzdHJ1Y3QgcGFycG9ydF9wcml2YXRlKSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlzID0gZGV2LT5zdWJkZXZpY2VzICsgMDsKKwlzLT50eXBlID0gQ09NRURJX1NVQkRfRElPOworCXMtPnN1YmRldl9mbGFncyA9IFNERl9SRUFEQUJMRSB8IFNERl9XUklUQUJMRTsKKwlzLT5uX2NoYW4gPSA4OworCXMtPm1heGRhdGEgPSAxOworCXMtPnJhbmdlX3RhYmxlID0gJnJhbmdlX2RpZ2l0YWw7CisJcy0+aW5zbl9iaXRzID0gcGFycG9ydF9pbnNuX2E7CisJcy0+aW5zbl9jb25maWcgPSBwYXJwb3J0X2luc25fY29uZmlnX2E7CisKKwlzID0gZGV2LT5zdWJkZXZpY2VzICsgMTsKKwlzLT50eXBlID0gQ09NRURJX1NVQkRfREk7CisJcy0+c3ViZGV2X2ZsYWdzID0gU0RGX1JFQURBQkxFOworCXMtPm5fY2hhbiA9IDU7CisJcy0+bWF4ZGF0YSA9IDE7CisJcy0+cmFuZ2VfdGFibGUgPSAmcmFuZ2VfZGlnaXRhbDsKKwlzLT5pbnNuX2JpdHMgPSBwYXJwb3J0X2luc25fYjsKKworCXMgPSBkZXYtPnN1YmRldmljZXMgKyAyOworCXMtPnR5cGUgPSBDT01FRElfU1VCRF9ETzsKKwlzLT5zdWJkZXZfZmxhZ3MgPSBTREZfV1JJVEFCTEU7CisJcy0+bl9jaGFuID0gNDsKKwlzLT5tYXhkYXRhID0gMTsKKwlzLT5yYW5nZV90YWJsZSA9ICZyYW5nZV9kaWdpdGFsOworCXMtPmluc25fYml0cyA9IHBhcnBvcnRfaW5zbl9jOworCisJcyA9IGRldi0+c3ViZGV2aWNlcyArIDM7CisJaWYgKGlycSkgeworCQlkZXYtPnJlYWRfc3ViZGV2ID0gczsKKwkJcy0+dHlwZSA9IENPTUVESV9TVUJEX0RJOworCQlzLT5zdWJkZXZfZmxhZ3MgPSBTREZfUkVBREFCTEUgfCBTREZfQ01EX1JFQUQ7CisJCXMtPm5fY2hhbiA9IDE7CisJCXMtPm1heGRhdGEgPSAxOworCQlzLT5yYW5nZV90YWJsZSA9ICZyYW5nZV9kaWdpdGFsOworCQlzLT5pbnNuX2JpdHMgPSBwYXJwb3J0X2ludHJfaW5zbjsKKwkJcy0+ZG9fY21kdGVzdCA9IHBhcnBvcnRfaW50cl9jbWR0ZXN0OworCQlzLT5kb19jbWQgPSBwYXJwb3J0X2ludHJfY21kOworCQlzLT5jYW5jZWwgPSBwYXJwb3J0X2ludHJfY2FuY2VsOworCX0gZWxzZSB7CisJCXMtPnR5cGUgPSBDT01FRElfU1VCRF9VTlVTRUQ7CisJfQorCisJZGV2cHJpdi0+YV9kYXRhID0gMDsKKwlvdXRiKGRldnByaXYtPmFfZGF0YSwgZGV2LT5pb2Jhc2UgKyBQQVJQT1JUX0EpOworCWRldnByaXYtPmNfZGF0YSA9IDA7CisJb3V0YihkZXZwcml2LT5jX2RhdGEsIGRldi0+aW9iYXNlICsgUEFSUE9SVF9DKTsKKworCXByaW50aygiXG4iKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBwYXJwb3J0X2RldGFjaChjb21lZGlfZGV2aWNlICpkZXYpCit7CisJcHJpbnRrKCJjb21lZGklZDogcGFycG9ydDogcmVtb3ZlXG4iLCBkZXYtPm1pbm9yKTsKKworCWlmIChkZXYtPmlvYmFzZSkKKwkJcmVsZWFzZV9yZWdpb24oZGV2LT5pb2Jhc2UsIFBBUlBPUlRfU0laRSk7CisKKwlpZiAoZGV2LT5pcnEpCisJCWNvbWVkaV9mcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NvbWVkaV9wY2kuaCBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jb21lZGlfcGNpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzE0YTAzNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jb21lZGlfcGNpLmgKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAgICBjb21lZGkvZHJpdmVycy9jb21lZGlfcGNpLmgKKyAgICBWYXJpb3VzIFBDSSBmdW5jdGlvbnMgZm9yIGRyaXZlcnMuCisKKyAgICBDb3B5cmlnaHQgKEMpIDIwMDcgTUVWIEx0ZC4gPGh0dHA6Ly93d3cubWV2LmNvLnVrLz4KKworICAgIENPTUVESSAtIExpbnV4IENvbnRyb2wgYW5kIE1lYXN1cmVtZW50IERldmljZSBJbnRlcmZhY2UKKyAgICBDb3B5cmlnaHQgKEMpIDIwMDAgRGF2aWQgQS4gU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworKi8KKworI2lmbmRlZiBfQ09NRURJX1BDSV9IXworI2RlZmluZSBfQ09NRURJX1BDSV9IXworCisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisKKy8qCisgKiBFbmFibGUgdGhlIFBDSSBkZXZpY2UgYW5kIHJlcXVlc3QgdGhlIHJlZ2lvbnMuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGNvbWVkaV9wY2lfZW5hYmxlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBjaGFyICpyZXNfbmFtZSkKK3sKKwlpbnQgcmM7CisKKwlyYyA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOworCWlmIChyYyA8IDApCisJCXJldHVybiByYzsKKworCXJjID0gcGNpX3JlcXVlc3RfcmVnaW9ucyhwZGV2LCByZXNfbmFtZSk7CisJaWYgKHJjIDwgMCkKKwkJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCisJcmV0dXJuIHJjOworfQorCisvKgorICogUmVsZWFzZSB0aGUgcmVnaW9ucyBhbmQgZGlzYWJsZSB0aGUgUENJIGRldmljZS4KKyAqCisgKiBUaGlzIG11c3QgYmUgbWF0Y2hlZCB3aXRoIGEgcHJldmlvdXMgc3VjY2Vzc2Z1bCBjYWxsIHRvIGNvbWVkaV9wY2lfZW5hYmxlKCkuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBjb21lZGlfcGNpX2Rpc2FibGUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NvbWVkaV90ZXN0LmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY29tZWRpX3Rlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjRjMzdkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NvbWVkaV90ZXN0LmMKQEAgLTAsMCArMSw1MjcgQEAKKy8qCisgICAgY29tZWRpL2RyaXZlcnMvY29tZWRpX3Rlc3QuYworCisgICAgR2VuZXJhdGVzIGZha2Ugd2F2ZWZvcm0gc2lnbmFscyB0aGF0IGNhbiBiZSByZWFkIHRocm91Z2gKKyAgICB0aGUgY29tbWFuZCBpbnRlcmZhY2UuICBJdCBkb2VzIF9ub3RfIHJlYWQgZnJvbSBhbnkgYm9hcmQ7CisgICAgaXQganVzdCBnZW5lcmF0ZXMgZGV0ZXJtaW5pc3RpYyB3YXZlZm9ybXMuCisgICAgVXNlZnVsIGZvciB2YXJpb3VzIHRlc3RpbmcgcHVycG9zZXMuCisKKyAgICBDb3B5cmlnaHQgKEMpIDIwMDIgSm9hY2hpbSBXdXR0a2UgPEpvYWNoaW0uV3V0dGtlQGljbi5zaWVtZW5zLmRlPgorICAgIENvcHlyaWdodCAoQykgMjAwMiBGcmFuayBNb3JpIEhlc3MgPGZtaGVzc0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKyAgICBDT01FREkgLSBMaW51eCBDb250cm9sIGFuZCBNZWFzdXJlbWVudCBEZXZpY2UgSW50ZXJmYWNlCisgICAgQ29weXJpZ2h0IChDKSAyMDAwIERhdmlkIEEuIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCitEcml2ZXI6IGNvbWVkaV90ZXN0CitEZXNjcmlwdGlvbjogZ2VuZXJhdGVzIGZha2Ugd2F2ZWZvcm1zCitBdXRob3I6IEpvYWNoaW0gV3V0dGtlIDxKb2FjaGltLld1dHRrZUBpY24uc2llbWVucy5kZT4sIEZyYW5rIE1vcmkgSGVzcworICA8Zm1oZXNzQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4sIGRzCitEZXZpY2VzOgorU3RhdHVzOiB3b3JrcworVXBkYXRlZDogU2F0LCAxNiBNYXIgMjAwMiAxNzozNDo0OCAtMDgwMAorCitUaGlzIGRyaXZlciBpcyBtYWlubHkgZm9yIHRlc3RpbmcgcHVycG9zZXMsIGJ1dCBjYW4gYWxzbyBiZSB1c2VkIHRvCitnZW5lcmF0ZSBzYW1wbGUgd2F2ZWZvcm1zIG9uIHN5c3RlbXMgdGhhdCBkb24ndCBoYXZlIGRhdGEgYWNxdWlzaXRpb24KK2hhcmR3YXJlLgorCitDb25maWd1cmF0aW9uIG9wdGlvbnM6CisgIFswXSAtIEFtcGxpdHVkZSBpbiBtaWNyb3ZvbHRzIGZvciBmYWtlIHdhdmVmb3JtcyAoZGVmYXVsdCAxIHZvbHQpCisgIFsxXSAtIFBlcmlvZCBpbiBtaWNyb3NlY29uZHMgZm9yIGZha2Ugd2F2ZWZvcm1zIChkZWZhdWx0IDAuMSBzZWMpCisKK0dlbmVyYXRlcyBhIHNhd3Rvb3RoIHdhdmUgb24gY2hhbm5lbCAwLCBzcXVhcmUgd2F2ZSBvbiBjaGFubmVsIDEsIGFkZGl0aW9uYWwKK3dhdmVmb3JtcyBjb3VsZCBiZSBhZGRlZCB0byBvdGhlciBjaGFubmVscyAoY3VycmVudGx5IHRoZXkgcmV0dXJuIGZsYXRsaW5lCit6ZXJvIHZvbHRzKS4KKworKi8KKworI2luY2x1ZGUgIi4uL2NvbWVkaWRldi5oIgorCisjaW5jbHVkZSA8YXNtL2RpdjY0Lmg+CisKKyNpbmNsdWRlICJjb21lZGlfZmMuaCIKKworLyogQm9hcmQgZGVzY3JpcHRpb25zICovCitzdHJ1Y3Qgd2F2ZWZvcm1fYm9hcmQgeworCWNvbnN0IGNoYXIgKm5hbWU7CisJaW50IGFpX2NoYW5zOworCWludCBhaV9iaXRzOworCWludCBoYXZlX2RpbzsKK307CisKKyNkZWZpbmUgTl9DSEFOUyA4CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgd2F2ZWZvcm1fYm9hcmQgd2F2ZWZvcm1fYm9hcmRzW10gPSB7CisJeworCQkubmFtZSA9CQkiY29tZWRpX3Rlc3QiLAorCQkuYWlfY2hhbnMgPQlOX0NIQU5TLAorCQkuYWlfYml0cyA9CTE2LAorCQkuaGF2ZV9kaW8gPQkwLAorCX0sCit9OworCisjZGVmaW5lIHRoaXNib2FyZCAoKGNvbnN0IHN0cnVjdCB3YXZlZm9ybV9ib2FyZCAqKWRldi0+Ym9hcmRfcHRyKQorCisvKiBEYXRhIHVuaXF1ZSB0byB0aGlzIGRyaXZlciAqLworc3RydWN0IHdhdmVmb3JtX3ByaXZhdGUgeworCXN0cnVjdCB0aW1lcl9saXN0IHRpbWVyOworCXN0cnVjdCB0aW1ldmFsIGxhc3Q7CS8qIHRpbWUgYXQgd2hpY2ggbGFzdCB0aW1lciBpbnRlcnJ1cHQgb2NjdXJlZCAqLworCXVuc2lnbmVkIGludCB1dm9sdF9hbXBsaXR1ZGU7CS8qIHdhdmVmb3JtIGFtcGxpdHVkZSBpbiBtaWNyb3ZvbHRzICovCisJdW5zaWduZWQgbG9uZyB1c2VjX3BlcmlvZDsJLyogd2F2ZWZvcm0gcGVyaW9kIGluIG1pY3Jvc2Vjb25kcyAqLworCXVuc2lnbmVkIGxvbmcgdXNlY19jdXJyZW50OyAvKiBjdXJyZW50IHRpbWUgKG1vZHVsbyB3YXZlZm9ybSBwZXJpb2QpICovCisJdW5zaWduZWQgbG9uZyB1c2VjX3JlbWFpbmRlcjsJLyogdXNlYyBzaW5jZSBsYXN0IHNjYW47ICovCisJdW5zaWduZWQgbG9uZyBhaV9jb3VudDsJLyogbnVtYmVyIG9mIGNvbnZlcnNpb25zIHJlbWFpbmluZyAqLworCXVuc2lnbmVkIGludCBzY2FuX3BlcmlvZDsJLyogc2NhbiBwZXJpb2QgaW4gdXNlYyAqLworCXVuc2lnbmVkIGludCBjb252ZXJ0X3BlcmlvZDsJLyogY29udmVyc2lvbiBwZXJpb2QgaW4gdXNlYyAqLworCXVuc2lnbmVkIHRpbWVyX3J1bm5pbmc6MTsKKwlsc2FtcGxfdCBhb19sb29wYmFja3NbTl9DSEFOU107Cit9OworI2RlZmluZSBkZXZwcml2ICgoc3RydWN0IHdhdmVmb3JtX3ByaXZhdGUgKilkZXYtPnByaXZhdGUpCisKK3N0YXRpYyBpbnQgd2F2ZWZvcm1fYXR0YWNoKGNvbWVkaV9kZXZpY2UgKmRldiwgY29tZWRpX2RldmNvbmZpZyAqaXQpOworc3RhdGljIGludCB3YXZlZm9ybV9kZXRhY2goY29tZWRpX2RldmljZSAqZGV2KTsKK3N0YXRpYyBjb21lZGlfZHJpdmVyIGRyaXZlcl93YXZlZm9ybSA9IHsKKyAgICAgIC5kcml2ZXJfbmFtZSA9CSJjb21lZGlfdGVzdCIsCisgICAgICAubW9kdWxlID0JCVRISVNfTU9EVUxFLAorICAgICAgLmF0dGFjaCA9CQl3YXZlZm9ybV9hdHRhY2gsCisgICAgICAuZGV0YWNoID0JCXdhdmVmb3JtX2RldGFjaCwKKyAgICAgIC5ib2FyZF9uYW1lID0JJndhdmVmb3JtX2JvYXJkc1swXS5uYW1lLAorICAgICAgLm9mZnNldCA9CQlzaXplb2Yoc3RydWN0IHdhdmVmb3JtX2JvYXJkKSwKKyAgICAgIC5udW1fbmFtZXMgPQlzaXplb2Yod2F2ZWZvcm1fYm9hcmRzKSAvIHNpemVvZihzdHJ1Y3Qgd2F2ZWZvcm1fYm9hcmQpLAorfTsKKworQ09NRURJX0lOSVRDTEVBTlVQKGRyaXZlcl93YXZlZm9ybSk7CisKK3N0YXRpYyBpbnQgd2F2ZWZvcm1fYWlfY21kdGVzdChjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkgICAgICAgY29tZWRpX2NtZCAqY21kKTsKK3N0YXRpYyBpbnQgd2F2ZWZvcm1fYWlfY21kKGNvbWVkaV9kZXZpY2UgKmRldiwgY29tZWRpX3N1YmRldmljZSAqcyk7CitzdGF0aWMgaW50IHdhdmVmb3JtX2FpX2NhbmNlbChjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKnMpOworc3RhdGljIGludCB3YXZlZm9ybV9haV9pbnNuX3JlYWQoY29tZWRpX2RldmljZSAqZGV2LCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJCSBjb21lZGlfaW5zbiAqaW5zbiwgbHNhbXBsX3QgKmRhdGEpOworc3RhdGljIGludCB3YXZlZm9ybV9hb19pbnNuX3dyaXRlKGNvbWVkaV9kZXZpY2UgKmRldiwgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCQkgIGNvbWVkaV9pbnNuICppbnNuLCBsc2FtcGxfdCAqZGF0YSk7CitzdGF0aWMgc2FtcGxfdCBmYWtlX3Nhd3Rvb3RoKGNvbWVkaV9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHJhbmdlLAorCQkJICAgICB1bnNpZ25lZCBsb25nIGN1cnJlbnRfdGltZSk7CitzdGF0aWMgc2FtcGxfdCBmYWtlX3NxdWFyZXdhdmUoY29tZWRpX2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgcmFuZ2UsCisJCQkgICAgICAgdW5zaWduZWQgbG9uZyBjdXJyZW50X3RpbWUpOworc3RhdGljIHNhbXBsX3QgZmFrZV9mbGF0bGluZShjb21lZGlfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCByYW5nZSwKKwkJCSAgICAgdW5zaWduZWQgbG9uZyBjdXJyZW50X3RpbWUpOworc3RhdGljIHNhbXBsX3QgZmFrZV93YXZlZm9ybShjb21lZGlfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBjaGFubmVsLAorCQkJICAgICB1bnNpZ25lZCBpbnQgcmFuZ2UsIHVuc2lnbmVkIGxvbmcgY3VycmVudF90aW1lKTsKKworLyogMTAwMCBuYW5vc2VjIGluIGEgbWljcm9zZWMgKi8KK3N0YXRpYyBjb25zdCBpbnQgbmFub19wZXJfbWljcm8gPSAxMDAwOworCisvKiBmYWtlIGFuYWxvZyBpbnB1dCByYW5nZXMgKi8KK3N0YXRpYyBjb25zdCBjb21lZGlfbHJhbmdlIHdhdmVmb3JtX2FpX3JhbmdlcyA9IHsKKwkyLAorCXsKKwkJCUJJUF9SQU5HRSgxMCksCisJCQlCSVBfUkFOR0UoNSksCisJCX0KK307CisKKy8qCisgICBUaGlzIGlzIHRoZSBiYWNrZ3JvdW5kIHJvdXRpbmUgdXNlZCB0byBnZW5lcmF0ZSBhcmJpdHJhcnkgZGF0YS4KKyAgIEl0IHNob3VsZCBydW4gaW4gdGhlIGJhY2tncm91bmQ7IHRoZXJlZm9yZSBpdCBpcyBzY2hlZHVsZWQgYnkKKyAgIGEgdGltZXIgbWVjaGFuaXNtLgorKi8KK3N0YXRpYyB2b2lkIHdhdmVmb3JtX2FpX2ludGVycnVwdCh1bnNpZ25lZCBsb25nIGFyZykKK3sKKwljb21lZGlfZGV2aWNlICpkZXYgPSAoY29tZWRpX2RldmljZSAqKSBhcmc7CisJY29tZWRpX2FzeW5jICphc3luYyA9IGRldi0+cmVhZF9zdWJkZXYtPmFzeW5jOworCWNvbWVkaV9jbWQgKmNtZCA9ICZhc3luYy0+Y21kOworCXVuc2lnbmVkIGludCBpLCBqOworCS8qIGFsbCB0aW1lcyBpbiBtaWNyb3NlYyAqLworCXVuc2lnbmVkIGxvbmcgZWxhcHNlZF90aW1lOworCXVuc2lnbmVkIGludCBudW1fc2NhbnM7CisJc3RydWN0IHRpbWV2YWwgbm93OworCisJZG9fZ2V0dGltZW9mZGF5KCZub3cpOworCisJZWxhcHNlZF90aW1lID0KKwkJMTAwMDAwMCAqIChub3cudHZfc2VjIC0gZGV2cHJpdi0+bGFzdC50dl9zZWMpICsgbm93LnR2X3VzZWMgLQorCQlkZXZwcml2LT5sYXN0LnR2X3VzZWM7CisJZGV2cHJpdi0+bGFzdCA9IG5vdzsKKwludW1fc2NhbnMgPQorCQkoZGV2cHJpdi0+dXNlY19yZW1haW5kZXIgKyBlbGFwc2VkX3RpbWUpIC8gZGV2cHJpdi0+c2Nhbl9wZXJpb2Q7CisJZGV2cHJpdi0+dXNlY19yZW1haW5kZXIgPQorCQkoZGV2cHJpdi0+dXNlY19yZW1haW5kZXIgKyBlbGFwc2VkX3RpbWUpICUgZGV2cHJpdi0+c2Nhbl9wZXJpb2Q7CisJYXN5bmMtPmV2ZW50cyA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX3NjYW5zOyBpKyspIHsKKwkJZm9yIChqID0gMDsgaiA8IGNtZC0+Y2hhbmxpc3RfbGVuOyBqKyspIHsKKwkJCWNmY193cml0ZV90b19idWZmZXIoZGV2LT5yZWFkX3N1YmRldiwKKwkJCQlmYWtlX3dhdmVmb3JtKGRldiwgQ1JfQ0hBTihjbWQtPmNoYW5saXN0W2pdKSwKKwkJCQkJQ1JfUkFOR0UoY21kLT5jaGFubGlzdFtqXSksCisJCQkJCWRldnByaXYtPnVzZWNfY3VycmVudCArCisJCQkJCWkgKiBkZXZwcml2LT5zY2FuX3BlcmlvZCArCisJCQkJCWogKiBkZXZwcml2LT5jb252ZXJ0X3BlcmlvZCkpOworCQl9CisJCWRldnByaXYtPmFpX2NvdW50Kys7CisJCWlmIChjbWQtPnN0b3Bfc3JjID09IFRSSUdfQ09VTlQKKwkJCSYmIGRldnByaXYtPmFpX2NvdW50ID49IGNtZC0+c3RvcF9hcmcpIHsKKwkJCWFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0VPQTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJZGV2cHJpdi0+dXNlY19jdXJyZW50ICs9IGVsYXBzZWRfdGltZTsKKwlkZXZwcml2LT51c2VjX2N1cnJlbnQgJT0gZGV2cHJpdi0+dXNlY19wZXJpb2Q7CisKKwlpZiAoKGFzeW5jLT5ldmVudHMgJiBDT01FRElfQ0JfRU9BKSA9PSAwICYmIGRldnByaXYtPnRpbWVyX3J1bm5pbmcpCisJCW1vZF90aW1lcigmZGV2cHJpdi0+dGltZXIsIGppZmZpZXMgKyAxKTsKKwllbHNlCisJCWRlbF90aW1lcigmZGV2cHJpdi0+dGltZXIpOworCisJY29tZWRpX2V2ZW50KGRldiwgZGV2LT5yZWFkX3N1YmRldik7Cit9CisKK3N0YXRpYyBpbnQgd2F2ZWZvcm1fYXR0YWNoKGNvbWVkaV9kZXZpY2UgKmRldiwgY29tZWRpX2RldmNvbmZpZyAqaXQpCit7CisJY29tZWRpX3N1YmRldmljZSAqczsKKwlpbnQgYW1wbGl0dWRlID0gaXQtPm9wdGlvbnNbMF07CisJaW50IHBlcmlvZCA9IGl0LT5vcHRpb25zWzFdOworCWludCBpOworCisJZGV2LT5ib2FyZF9uYW1lID0gdGhpc2JvYXJkLT5uYW1lOworCisJaWYgKGFsbG9jX3ByaXZhdGUoZGV2LCBzaXplb2Yoc3RydWN0IHdhdmVmb3JtX3ByaXZhdGUpKSA8IDApCisJCXJldHVybiAtRU5PTUVNOworCisJLyogc2V0IGRlZmF1bHQgYW1wbGl0dWRlIGFuZCBwZXJpb2QgKi8KKwlpZiAoYW1wbGl0dWRlIDw9IDApCisJCWFtcGxpdHVkZSA9IDEwMDAwMDA7CS8qIDEgdm9sdCAqLworCWlmIChwZXJpb2QgPD0gMCkKKwkJcGVyaW9kID0gMTAwMDAwOwkvKiAwLjEgc2VjICovCisKKwlkZXZwcml2LT51dm9sdF9hbXBsaXR1ZGUgPSBhbXBsaXR1ZGU7CisJZGV2cHJpdi0+dXNlY19wZXJpb2QgPSBwZXJpb2Q7CisKKwlkZXYtPm5fc3ViZGV2aWNlcyA9IDI7CisJaWYgKGFsbG9jX3N1YmRldmljZXMoZGV2LCBkZXYtPm5fc3ViZGV2aWNlcykgPCAwKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXMgPSBkZXYtPnN1YmRldmljZXMgKyAwOworCWRldi0+cmVhZF9zdWJkZXYgPSBzOworCS8qIGFuYWxvZyBpbnB1dCBzdWJkZXZpY2UgKi8KKwlzLT50eXBlID0gQ09NRURJX1NVQkRfQUk7CisJcy0+c3ViZGV2X2ZsYWdzID0gU0RGX1JFQURBQkxFIHwgU0RGX0dST1VORCB8IFNERl9DTURfUkVBRDsKKwlzLT5uX2NoYW4gPSB0aGlzYm9hcmQtPmFpX2NoYW5zOworCXMtPm1heGRhdGEgPSAoMSA8PCB0aGlzYm9hcmQtPmFpX2JpdHMpIC0gMTsKKwlzLT5yYW5nZV90YWJsZSA9ICZ3YXZlZm9ybV9haV9yYW5nZXM7CisJcy0+bGVuX2NoYW5saXN0ID0gcy0+bl9jaGFuICogMjsKKwlzLT5pbnNuX3JlYWQgPSB3YXZlZm9ybV9haV9pbnNuX3JlYWQ7CisJcy0+ZG9fY21kID0gd2F2ZWZvcm1fYWlfY21kOworCXMtPmRvX2NtZHRlc3QgPSB3YXZlZm9ybV9haV9jbWR0ZXN0OworCXMtPmNhbmNlbCA9IHdhdmVmb3JtX2FpX2NhbmNlbDsKKworCXMgPSBkZXYtPnN1YmRldmljZXMgKyAxOworCWRldi0+d3JpdGVfc3ViZGV2ID0gczsKKwkvKiBhbmFsb2cgb3V0cHV0IHN1YmRldmljZSAobG9vcGJhY2spICovCisJcy0+dHlwZSA9IENPTUVESV9TVUJEX0FPOworCXMtPnN1YmRldl9mbGFncyA9IFNERl9XUklURUFCTEUgfCBTREZfR1JPVU5EOworCXMtPm5fY2hhbiA9IHRoaXNib2FyZC0+YWlfY2hhbnM7CisJcy0+bWF4ZGF0YSA9ICgxIDw8IHRoaXNib2FyZC0+YWlfYml0cykgLSAxOworCXMtPnJhbmdlX3RhYmxlID0gJndhdmVmb3JtX2FpX3JhbmdlczsKKwlzLT5sZW5fY2hhbmxpc3QgPSBzLT5uX2NoYW4gKiAyOworCXMtPmluc25fd3JpdGUgPSB3YXZlZm9ybV9hb19pbnNuX3dyaXRlOworCXMtPmRvX2NtZCA9IE5VTEw7CisJcy0+ZG9fY21kdGVzdCA9IE5VTEw7CisJcy0+Y2FuY2VsID0gTlVMTDsKKworCS8qIE91ciBkZWZhdWx0IGxvb3BiYWNrIHZhbHVlIGlzIGp1c3QgYSAwViBmbGF0bGluZSAqLworCWZvciAoaSA9IDA7IGkgPCBzLT5uX2NoYW47IGkrKykKKwkJZGV2cHJpdi0+YW9fbG9vcGJhY2tzW2ldID0gcy0+bWF4ZGF0YSAvIDI7CisKKwlpbml0X3RpbWVyKCYoZGV2cHJpdi0+dGltZXIpKTsKKwlkZXZwcml2LT50aW1lci5mdW5jdGlvbiA9IHdhdmVmb3JtX2FpX2ludGVycnVwdDsKKwlkZXZwcml2LT50aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpZGV2OworCisJcHJpbnRrKEtFUk5fSU5GTyAiY29tZWRpJWQ6IGNvbWVkaV90ZXN0OiAiCisJCSIlaSBtaWNyb3ZvbHQsICVsaSBtaWNyb3NlY29uZCB3YXZlZm9ybSBhdHRhY2hlZFxuIiwgZGV2LT5taW5vciwKKwkJZGV2cHJpdi0+dXZvbHRfYW1wbGl0dWRlLCBkZXZwcml2LT51c2VjX3BlcmlvZCk7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgd2F2ZWZvcm1fZGV0YWNoKGNvbWVkaV9kZXZpY2UgKmRldikKK3sKKwlwcmludGsoImNvbWVkaSVkOiBjb21lZGlfdGVzdDogcmVtb3ZlXG4iLCBkZXYtPm1pbm9yKTsKKworCWlmIChkZXYtPnByaXZhdGUpCisJCXdhdmVmb3JtX2FpX2NhbmNlbChkZXYsIGRldi0+cmVhZF9zdWJkZXYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd2F2ZWZvcm1fYWlfY21kdGVzdChjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkgICAgICAgY29tZWRpX2NtZCAqY21kKQoreworCWludCBlcnIgPSAwOworCWludCB0bXA7CisKKwkvKiBzdGVwIDE6IG1ha2Ugc3VyZSB0cmlnZ2VyIHNvdXJjZXMgYXJlIHRyaXZpYWxseSB2YWxpZCAqLworCisJdG1wID0gY21kLT5zdGFydF9zcmM7CisJY21kLT5zdGFydF9zcmMgJj0gVFJJR19OT1c7CisJaWYgKCFjbWQtPnN0YXJ0X3NyYyB8fCB0bXAgIT0gY21kLT5zdGFydF9zcmMpCisJCWVycisrOworCisJdG1wID0gY21kLT5zY2FuX2JlZ2luX3NyYzsKKwljbWQtPnNjYW5fYmVnaW5fc3JjICY9IFRSSUdfVElNRVI7CisJaWYgKCFjbWQtPnNjYW5fYmVnaW5fc3JjIHx8IHRtcCAhPSBjbWQtPnNjYW5fYmVnaW5fc3JjKQorCQllcnIrKzsKKworCXRtcCA9IGNtZC0+Y29udmVydF9zcmM7CisJY21kLT5jb252ZXJ0X3NyYyAmPSBUUklHX05PVyB8IFRSSUdfVElNRVI7CisJaWYgKCFjbWQtPmNvbnZlcnRfc3JjIHx8IHRtcCAhPSBjbWQtPmNvbnZlcnRfc3JjKQorCQllcnIrKzsKKworCXRtcCA9IGNtZC0+c2Nhbl9lbmRfc3JjOworCWNtZC0+c2Nhbl9lbmRfc3JjICY9IFRSSUdfQ09VTlQ7CisJaWYgKCFjbWQtPnNjYW5fZW5kX3NyYyB8fCB0bXAgIT0gY21kLT5zY2FuX2VuZF9zcmMpCisJCWVycisrOworCisJdG1wID0gY21kLT5zdG9wX3NyYzsKKwljbWQtPnN0b3Bfc3JjICY9IFRSSUdfQ09VTlQgfCBUUklHX05PTkU7CisJaWYgKCFjbWQtPnN0b3Bfc3JjIHx8IHRtcCAhPSBjbWQtPnN0b3Bfc3JjKQorCQllcnIrKzsKKworCWlmIChlcnIpCisJCXJldHVybiAxOworCisJLyoKKwkgKiBzdGVwIDI6IG1ha2Ugc3VyZSB0cmlnZ2VyIHNvdXJjZXMgYXJlIHVuaXF1ZSBhbmQgbXV0dWFsbHkgY29tcGF0aWJsZQorCSAqLworCisJaWYgKGNtZC0+Y29udmVydF9zcmMgIT0gVFJJR19OT1cgJiYgY21kLT5jb252ZXJ0X3NyYyAhPSBUUklHX1RJTUVSKQorCQllcnIrKzsKKwlpZiAoY21kLT5zdG9wX3NyYyAhPSBUUklHX0NPVU5UICYmIGNtZC0+c3RvcF9zcmMgIT0gVFJJR19OT05FKQorCQllcnIrKzsKKworCWlmIChlcnIpCisJCXJldHVybiAyOworCisJLyogc3RlcCAzOiBtYWtlIHN1cmUgYXJndW1lbnRzIGFyZSB0cml2aWFsbHkgY29tcGF0aWJsZSAqLworCisJaWYgKGNtZC0+c3RhcnRfYXJnICE9IDApIHsKKwkJY21kLT5zdGFydF9hcmcgPSAwOworCQllcnIrKzsKKwl9CisJaWYgKGNtZC0+Y29udmVydF9zcmMgPT0gVFJJR19OT1cpIHsKKwkJaWYgKGNtZC0+Y29udmVydF9hcmcgIT0gMCkgeworCQkJY21kLT5jb252ZXJ0X2FyZyA9IDA7CisJCQllcnIrKzsKKwkJfQorCX0KKwlpZiAoY21kLT5zY2FuX2JlZ2luX3NyYyA9PSBUUklHX1RJTUVSKSB7CisJCWlmIChjbWQtPnNjYW5fYmVnaW5fYXJnIDwgbmFub19wZXJfbWljcm8pIHsKKwkJCWNtZC0+c2Nhbl9iZWdpbl9hcmcgPSBuYW5vX3Blcl9taWNybzsKKwkJCWVycisrOworCQl9CisJCWlmIChjbWQtPmNvbnZlcnRfc3JjID09IFRSSUdfVElNRVIgJiYKKwkJCWNtZC0+c2Nhbl9iZWdpbl9hcmcgPAorCQkJY21kLT5jb252ZXJ0X2FyZyAqIGNtZC0+Y2hhbmxpc3RfbGVuKSB7CisJCQljbWQtPnNjYW5fYmVnaW5fYXJnID0KKwkJCQljbWQtPmNvbnZlcnRfYXJnICogY21kLT5jaGFubGlzdF9sZW47CisJCQllcnIrKzsKKwkJfQorCX0KKwkvKgorCSAqIFhYWCB0aGVzZSBjaGVja3MgYXJlIGdlbmVyaWMgYW5kIHNob3VsZCBnbyBpbiBjb3JlIGlmIG5vdCB0aGVyZQorCSAqIGFscmVhZHkKKwkgKi8KKwlpZiAoIWNtZC0+Y2hhbmxpc3RfbGVuKSB7CisJCWNtZC0+Y2hhbmxpc3RfbGVuID0gMTsKKwkJZXJyKys7CisJfQorCWlmIChjbWQtPnNjYW5fZW5kX2FyZyAhPSBjbWQtPmNoYW5saXN0X2xlbikgeworCQljbWQtPnNjYW5fZW5kX2FyZyA9IGNtZC0+Y2hhbmxpc3RfbGVuOworCQllcnIrKzsKKwl9CisKKwlpZiAoY21kLT5zdG9wX3NyYyA9PSBUUklHX0NPVU5UKSB7CisJCWlmICghY21kLT5zdG9wX2FyZykgeworCQkJY21kLT5zdG9wX2FyZyA9IDE7CisJCQllcnIrKzsKKwkJfQorCX0gZWxzZSB7CQkvKiBUUklHX05PTkUgKi8KKwkJaWYgKGNtZC0+c3RvcF9hcmcgIT0gMCkgeworCQkJY21kLT5zdG9wX2FyZyA9IDA7CisJCQllcnIrKzsKKwkJfQorCX0KKworCWlmIChlcnIpCisJCXJldHVybiAzOworCisJLyogc3RlcCA0OiBmaXggdXAgYW55IGFyZ3VtZW50cyAqLworCisJaWYgKGNtZC0+c2Nhbl9iZWdpbl9zcmMgPT0gVFJJR19USU1FUikgeworCQl0bXAgPSBjbWQtPnNjYW5fYmVnaW5fYXJnOworCQkvKiByb3VuZCB0byBuZWFyZXN0IG1pY3Jvc2VjICovCisJCWNtZC0+c2Nhbl9iZWdpbl9hcmcgPQorCQkJbmFub19wZXJfbWljcm8gKiAoKHRtcCArCisJCQkJKG5hbm9fcGVyX21pY3JvIC8gMikpIC8gbmFub19wZXJfbWljcm8pOworCQlpZiAodG1wICE9IGNtZC0+c2Nhbl9iZWdpbl9hcmcpCisJCQllcnIrKzsKKwl9CisJaWYgKGNtZC0+Y29udmVydF9zcmMgPT0gVFJJR19USU1FUikgeworCQl0bXAgPSBjbWQtPmNvbnZlcnRfYXJnOworCQkvKiByb3VuZCB0byBuZWFyZXN0IG1pY3Jvc2VjICovCisJCWNtZC0+Y29udmVydF9hcmcgPQorCQkJbmFub19wZXJfbWljcm8gKiAoKHRtcCArCisJCQkJKG5hbm9fcGVyX21pY3JvIC8gMikpIC8gbmFub19wZXJfbWljcm8pOworCQlpZiAodG1wICE9IGNtZC0+Y29udmVydF9hcmcpCisJCQllcnIrKzsKKwl9CisKKwlpZiAoZXJyKQorCQlyZXR1cm4gNDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdhdmVmb3JtX2FpX2NtZChjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKnMpCit7CisJY29tZWRpX2NtZCAqY21kID0gJnMtPmFzeW5jLT5jbWQ7CisKKwlpZiAoY21kLT5mbGFncyAmIFRSSUdfUlQpIHsKKwkJY29tZWRpX2Vycm9yKGRldiwKKwkJCSJjb21tYW5kcyBhdCBSVCBwcmlvcml0eSBub3Qgc3VwcG9ydGVkIGluIHRoaXMgZHJpdmVyIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlkZXZwcml2LT50aW1lcl9ydW5uaW5nID0gMTsKKwlkZXZwcml2LT5haV9jb3VudCA9IDA7CisJZGV2cHJpdi0+c2Nhbl9wZXJpb2QgPSBjbWQtPnNjYW5fYmVnaW5fYXJnIC8gbmFub19wZXJfbWljcm87CisKKwlpZiAoY21kLT5jb252ZXJ0X3NyYyA9PSBUUklHX05PVykKKwkJZGV2cHJpdi0+Y29udmVydF9wZXJpb2QgPSAwOworCWVsc2UgaWYgKGNtZC0+Y29udmVydF9zcmMgPT0gVFJJR19USU1FUikKKwkJZGV2cHJpdi0+Y29udmVydF9wZXJpb2QgPSBjbWQtPmNvbnZlcnRfYXJnIC8gbmFub19wZXJfbWljcm87CisJZWxzZSB7CisJCWNvbWVkaV9lcnJvcihkZXYsICJidWcgc2V0dGluZyBjb252ZXJzaW9uIHBlcmlvZCIpOworCQlyZXR1cm4gLTE7CisJfQorCisJZG9fZ2V0dGltZW9mZGF5KCZkZXZwcml2LT5sYXN0KTsKKwlkZXZwcml2LT51c2VjX2N1cnJlbnQgPSBkZXZwcml2LT5sYXN0LnR2X3VzZWMgJSBkZXZwcml2LT51c2VjX3BlcmlvZDsKKwlkZXZwcml2LT51c2VjX3JlbWFpbmRlciA9IDA7CisKKwlkZXZwcml2LT50aW1lci5leHBpcmVzID0gamlmZmllcyArIDE7CisJYWRkX3RpbWVyKCZkZXZwcml2LT50aW1lcik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd2F2ZWZvcm1fYWlfY2FuY2VsKGNvbWVkaV9kZXZpY2UgKmRldiwgY29tZWRpX3N1YmRldmljZSAqcykKK3sKKwlkZXZwcml2LT50aW1lcl9ydW5uaW5nID0gMDsKKwlkZWxfdGltZXIoJmRldnByaXYtPnRpbWVyKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNhbXBsX3QgZmFrZV9zYXd0b290aChjb21lZGlfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCByYW5nZV9pbmRleCwKKwkJCSAgICAgdW5zaWduZWQgbG9uZyBjdXJyZW50X3RpbWUpCit7CisJY29tZWRpX3N1YmRldmljZSAqcyA9IGRldi0+cmVhZF9zdWJkZXY7CisJdW5zaWduZWQgaW50IG9mZnNldCA9IHMtPm1heGRhdGEgLyAyOworCXU2NCB2YWx1ZTsKKwljb25zdCBjb21lZGlfa3JhbmdlICprcmFuZ2UgPSAmcy0+cmFuZ2VfdGFibGUtPnJhbmdlW3JhbmdlX2luZGV4XTsKKwl1NjQgYmluYXJ5X2FtcGxpdHVkZTsKKworCWJpbmFyeV9hbXBsaXR1ZGUgPSBzLT5tYXhkYXRhOworCWJpbmFyeV9hbXBsaXR1ZGUgKj0gZGV2cHJpdi0+dXZvbHRfYW1wbGl0dWRlOworCWRvX2RpdihiaW5hcnlfYW1wbGl0dWRlLCBrcmFuZ2UtPm1heCAtIGtyYW5nZS0+bWluKTsKKworCWN1cnJlbnRfdGltZSAlPSBkZXZwcml2LT51c2VjX3BlcmlvZDsKKwl2YWx1ZSA9IGN1cnJlbnRfdGltZTsKKwl2YWx1ZSAqPSBiaW5hcnlfYW1wbGl0dWRlICogMjsKKwlkb19kaXYodmFsdWUsIGRldnByaXYtPnVzZWNfcGVyaW9kKTsKKwl2YWx1ZSAtPSBiaW5hcnlfYW1wbGl0dWRlOwkvKiBnZXQgcmlkIG9mIHNhd3Rvb3RoJ3MgZGMgb2Zmc2V0ICovCisKKwlyZXR1cm4gb2Zmc2V0ICsgdmFsdWU7Cit9CitzdGF0aWMgc2FtcGxfdCBmYWtlX3NxdWFyZXdhdmUoY29tZWRpX2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgcmFuZ2VfaW5kZXgsCisJCQkgICAgICAgdW5zaWduZWQgbG9uZyBjdXJyZW50X3RpbWUpCit7CisJY29tZWRpX3N1YmRldmljZSAqcyA9IGRldi0+cmVhZF9zdWJkZXY7CisJdW5zaWduZWQgaW50IG9mZnNldCA9IHMtPm1heGRhdGEgLyAyOworCXU2NCB2YWx1ZTsKKwljb25zdCBjb21lZGlfa3JhbmdlICprcmFuZ2UgPSAmcy0+cmFuZ2VfdGFibGUtPnJhbmdlW3JhbmdlX2luZGV4XTsKKwljdXJyZW50X3RpbWUgJT0gZGV2cHJpdi0+dXNlY19wZXJpb2Q7CisKKwl2YWx1ZSA9IHMtPm1heGRhdGE7CisJdmFsdWUgKj0gZGV2cHJpdi0+dXZvbHRfYW1wbGl0dWRlOworCWRvX2Rpdih2YWx1ZSwga3JhbmdlLT5tYXggLSBrcmFuZ2UtPm1pbik7CisKKwlpZiAoY3VycmVudF90aW1lIDwgZGV2cHJpdi0+dXNlY19wZXJpb2QgLyAyKQorCQl2YWx1ZSAqPSAtMTsKKworCXJldHVybiBvZmZzZXQgKyB2YWx1ZTsKK30KKworc3RhdGljIHNhbXBsX3QgZmFrZV9mbGF0bGluZShjb21lZGlfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCByYW5nZV9pbmRleCwKKwkJCSAgICAgdW5zaWduZWQgbG9uZyBjdXJyZW50X3RpbWUpCit7CisJcmV0dXJuIGRldi0+cmVhZF9zdWJkZXYtPm1heGRhdGEgLyAyOworfQorCisvKiBnZW5lcmF0ZXMgYSBkaWZmZXJlbnQgd2F2ZWZvcm0gZGVwZW5kaW5nIG9uIHdoYXQgY2hhbm5lbCBpcyByZWFkICovCitzdGF0aWMgc2FtcGxfdCBmYWtlX3dhdmVmb3JtKGNvbWVkaV9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IGNoYW5uZWwsCisJCQkgICAgIHVuc2lnbmVkIGludCByYW5nZSwgdW5zaWduZWQgbG9uZyBjdXJyZW50X3RpbWUpCit7CisJZW51bSB7CisJCVNBV1RPT1RIX0NIQU4sCisJCVNRVUFSRV9DSEFOLAorCX07CisJc3dpdGNoIChjaGFubmVsKSB7CisJY2FzZSBTQVdUT09USF9DSEFOOgorCQlyZXR1cm4gZmFrZV9zYXd0b290aChkZXYsIHJhbmdlLCBjdXJyZW50X3RpbWUpOworCQlicmVhazsKKwljYXNlIFNRVUFSRV9DSEFOOgorCQlyZXR1cm4gZmFrZV9zcXVhcmV3YXZlKGRldiwgcmFuZ2UsIGN1cnJlbnRfdGltZSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXJldHVybiBmYWtlX2ZsYXRsaW5lKGRldiwgcmFuZ2UsIGN1cnJlbnRfdGltZSk7Cit9CisKK3N0YXRpYyBpbnQgd2F2ZWZvcm1fYWlfaW5zbl9yZWFkKGNvbWVkaV9kZXZpY2UgKmRldiwgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCQkgY29tZWRpX2luc24gKmluc24sIGxzYW1wbF90ICpkYXRhKQoreworCWludCBpLCBjaGFuID0gQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgaW5zbi0+bjsgaSsrKQorCQlkYXRhW2ldID0gZGV2cHJpdi0+YW9fbG9vcGJhY2tzW2NoYW5dOworCisJcmV0dXJuIGluc24tPm47Cit9CisKK3N0YXRpYyBpbnQgd2F2ZWZvcm1fYW9faW5zbl93cml0ZShjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkJICBjb21lZGlfaW5zbiAqaW5zbiwgbHNhbXBsX3QgKmRhdGEpCit7CisJaW50IGksIGNoYW4gPSBDUl9DSEFOKGluc24tPmNoYW5zcGVjKTsKKworCWZvciAoaSA9IDA7IGkgPCBpbnNuLT5uOyBpKyspCisJCWRldnByaXYtPmFvX2xvb3BiYWNrc1tjaGFuXSA9IGRhdGFbaV07CisKKwlyZXR1cm4gaW5zbi0+bjsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kdDk4MTIuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kdDk4MTIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMmQyMTczCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2R0OTgxMi5jCkBAIC0wLDAgKzEsMTE2MiBAQAorLyoKKyAqIGNvbWVkaS9kcml2ZXJzL2R0OTgxMi5jCisgKiAgIENPTUVESSBkcml2ZXIgZm9yIERhdGFUcmFuc2xhdGlvbiBEVDk4MTIgVVNCIG1vZHVsZQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBBbmRlcnMgQmxvbWRlbGwgPGFuZGVycy5ibG9tZGVsbEBjb250cm9sLmx0aC5zZT4KKyAqCisgKiBDT01FREkgLSBMaW51eCBDb250cm9sIGFuZCBNZWFzdXJlbWVudCBEZXZpY2UgSW50ZXJmYWNlCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqCisgKi8KKworLyoKK0RyaXZlcjogZHQ5ODEyCitEZXNjcmlwdGlvbjogRGF0YSBUcmFuc2xhdGlvbiBEVDk4MTIgVVNCIG1vZHVsZQorQXV0aG9yOiBhbmRlcnMuYmxvbWRlbGxAY29udHJvbC5sdGguc2UgKEFuZGVycyBCbG9tZGVsbCkKK1N0YXR1czogaW4gZGV2ZWxvcG1lbnQKK0RldmljZXM6IFtEYXRhIFRyYW5zbGF0aW9uXSBEVDk4MTIgKGR0OTgxMikKK1VwZGF0ZWQ6IFN1biBOb3YgMjAgMjA6MTg6MzQgRVNUIDIwMDUKKworVGhpcyBkcml2ZXIgd29ya3MsIGJ1dCBidWxrIHRyYW5zZmVycyBub3QgaW1wbGVtZW50ZWQuIE1pZ2h0IGJlIGEgc3RhcnRpbmcgcG9pbnQKK2ZvciBzb21lb25lIGVsc2UuIEkgZm91bmQgb3V0IHRvbyBsYXRlIHRoYXQgVVNCIGhhcyB0b28gaGlnaCBsYXRlbmNpZXMgKD4xIG1zKQorZm9yIG15IG5lZWRzLgorKi8KKworLyoKKyAqIE5vdGEgQmVuZToKKyAqICAgMS4gQWxsIHdyaXRlcyB0byBjb21tYW5kIHBpcGUgaGFzIHRvIGJlIDMyIGJ5dGVzIChJU1AxMTgxQiBTSFJUUD0wID8pCisgKiAgIDIuIFRoZSBEREsgc291cmNlIChhcyBvZiBzZXAgMjAwNSkgaXMgaW4gZXJyb3IgcmVnYXJkaW5nIHRoZQorICogICAgICBpbnB1dCBNVVggYml0cyAoZXhhbXBsZSBjb2RlIHNheXMgUDQsIGJ1dCBmaXJtd2FyZSBzY2hlbWF0aWNzCisgKiAgICAgIHNheXMgUDEpLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva3JlZi5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC91c2IuaD4KKworI2luY2x1ZGUgIi4uL2NvbWVkaWRldi5oIgorCisjZGVmaW5lIERUOTgxMl9ESUFHU19CT0FSRF9JTkZPX0FERFIJMHhGQkZGCisjZGVmaW5lIERUOTgxMl9NQVhfV1JJVEVfQ01EX1BJUEVfU0laRQkzMgorI2RlZmluZSBEVDk4MTJfTUFYX1JFQURfQ01EX1BJUEVfU0laRQkzMgorCisvKgorICogU2VlIFNpbGljYW4gTGFib3JhdG9yaWVzIEM4MDUxRjAyMC8xLzIvMyBtYW51YWwKKyAqLworI2RlZmluZSBGMDIwX1NGUl9QNAkJCTB4ODQKKyNkZWZpbmUgRjAyMF9TRlJfUDEJCQkweDkwCisjZGVmaW5lIEYwMjBfU0ZSX1AyCQkJMHhhMAorI2RlZmluZSBGMDIwX1NGUl9QMwkJCTB4YjAKKyNkZWZpbmUgRjAyMF9TRlJfQU1YMENGCQkJMHhiYQorI2RlZmluZSBGMDIwX1NGUl9BTVgwU0wJCQkweGJiCisjZGVmaW5lIEYwMjBfU0ZSX0FEQzBDRgkJCTB4YmMKKyNkZWZpbmUgRjAyMF9TRlJfQURDMEwJCQkweGJlCisjZGVmaW5lIEYwMjBfU0ZSX0FEQzBICQkJMHhiZgorI2RlZmluZSBGMDIwX1NGUl9EQUMwTAkJCTB4ZDIKKyNkZWZpbmUgRjAyMF9TRlJfREFDMEgJCQkweGQzCisjZGVmaW5lIEYwMjBfU0ZSX0RBQzBDTgkJCTB4ZDQKKyNkZWZpbmUgRjAyMF9TRlJfREFDMUwJCQkweGQ1CisjZGVmaW5lIEYwMjBfU0ZSX0RBQzFICQkJMHhkNgorI2RlZmluZSBGMDIwX1NGUl9EQUMxQ04JCQkweGQ3CisjZGVmaW5lIEYwMjBfU0ZSX0FEQzBDTgkJCTB4ZTgKKworI2RlZmluZSBGMDIwX01BU0tfQURDMENGX0FNUDBHTjAJMHgwMQorI2RlZmluZSBGMDIwX01BU0tfQURDMENGX0FNUDBHTjEJMHgwMgorI2RlZmluZSBGMDIwX01BU0tfQURDMENGX0FNUDBHTjIJMHgwNAorCisjZGVmaW5lIEYwMjBfTUFTS19BREMwQ05fQUQwRU4JCTB4ODAKKyNkZWZpbmUgRjAyMF9NQVNLX0FEQzBDTl9BRDBJTlQJCTB4MjAKKyNkZWZpbmUgRjAyMF9NQVNLX0FEQzBDTl9BRDBCVVNZCTB4MTAKKworI2RlZmluZSBGMDIwX01BU0tfREFDeENOX0RBQ3hFTgkJMHg4MAorCitlbnVtIHsKKwkJCQkvKiBBL0QgIEQvQSAgREkgIERPICBDVCAqLworCURUOTgxMl9ERVZJRF9EVDk4MTJfMTAsCS8qICA4ICAgIDIgICA4ICAgOCAgIDEgICsvLSAxMFYgKi8KKwlEVDk4MTJfREVWSURfRFQ5ODEyXzJQVDUsLyogOCAgICAyICAgOCAgIDggICAxICAwLTIuNDRWICovCisjaWYgMAorCURUOTgxMl9ERVZJRF9EVDk4MTMsCS8qICAxNiAgIDIgICA0ICAgNCAgIDEgICsvLSAxMFYgKi8KKwlEVDk4MTJfREVWSURfRFQ5ODE0CS8qICAyNCAgIDIgICAwICAgMCAgIDEgICsvLSAxMFYgKi8KKyNlbmRpZgorfTsKKworZW51bSBkdDk4MTJfZ2FpbiB7CisJRFQ5ODEyX0dBSU5fMFBUMjUgPSAxLAorCURUOTgxMl9HQUlOXzBQVDUgPSAyLAorCURUOTgxMl9HQUlOXzEgPSA0LAorCURUOTgxMl9HQUlOXzIgPSA4LAorCURUOTgxMl9HQUlOXzQgPSAxNiwKKwlEVDk4MTJfR0FJTl84ID0gMzIsCisJRFQ5ODEyX0dBSU5fMTYgPSA2NCwKK307CisKK2VudW0geworCURUOTgxMl9MRUFTVF9VU0JfRklSTVdBUkVfQ01EX0NPREUgPSAwLAorCS8qIFdyaXRlIEZsYXNoIG1lbW9yeSAqLworCURUOTgxMl9XX0ZMQVNIX0RBVEEgPSAwLAorCS8qIFJlYWQgRmxhc2ggbWVtb3J5IG1pc2MgY29uZmlnIGluZm8gKi8KKwlEVDk4MTJfUl9GTEFTSF9EQVRBID0gMSwKKworCS8qCisJICogUmVnaXN0ZXIgcmVhZC93cml0ZSBjb21tYW5kcyBmb3IgcHJvY2Vzc29yCisJICovCisKKwkvKiBSZWFkIGEgc2luZ2xlIGJ5dGUgb2YgVVNCIG1lbW9yeSAqLworCURUOTgxMl9SX1NJTkdMRV9CWVRFX1JFRyA9IDIsCisJLyogV3JpdGUgYSBzaW5nbGUgYnl0ZSBvZiBVU0IgbWVtb3J5ICovCisJRFQ5ODEyX1dfU0lOR0xFX0JZVEVfUkVHID0gMywKKwkvKiBNdWx0aXBsZSBSZWFkcyBvZiBVU0IgbWVtb3J5ICovCisJRFQ5ODEyX1JfTVVMVElfQllURV9SRUcgPSA0LAorCS8qIE11bHRpcGxlIFdyaXRlcyBvZiBVU0IgbWVtb3J5ICovCisJRFQ5ODEyX1dfTVVMVElfQllURV9SRUcgPSA1LAorCS8qIFJlYWQsIChBTkQpIHdpdGggbWFzaywgT1IgdmFsdWUsIHRoZW4gd3JpdGUgKHNpbmdsZSkgKi8KKwlEVDk4MTJfUk1XX1NJTkdMRV9CWVRFX1JFRyA9IDYsCisJLyogUmVhZCwgKEFORCkgd2l0aCBtYXNrLCBPUiB2YWx1ZSwgdGhlbiB3cml0ZSAobXVsdGlwbGUpICovCisJRFQ5ODEyX1JNV19NVUxUSV9CWVRFX1JFRyA9IDcsCisKKwkvKgorCSAqIFJlZ2lzdGVyIHJlYWQvd3JpdGUgY29tbWFuZHMgZm9yIFNNQnVzCisJICovCisKKwkvKiBSZWFkIGEgc2luZ2xlIGJ5dGUgb2YgU01CdXMgKi8KKwlEVDk4MTJfUl9TSU5HTEVfQllURV9TTUJVUyA9IDgsCisJLyogV3JpdGUgYSBzaW5nbGUgYnl0ZSBvZiBTTUJ1cyAqLworCURUOTgxMl9XX1NJTkdMRV9CWVRFX1NNQlVTID0gOSwKKwkvKiBNdWx0aXBsZSBSZWFkcyBvZiBTTUJ1cyAqLworCURUOTgxMl9SX01VTFRJX0JZVEVfU01CVVMgPSAxMCwKKwkvKiBNdWx0aXBsZSBXcml0ZXMgb2YgU01CdXMgKi8KKwlEVDk4MTJfV19NVUxUSV9CWVRFX1NNQlVTID0gMTEsCisKKwkvKgorCSAqIFJlZ2lzdGVyIHJlYWQvd3JpdGUgY29tbWFuZHMgZm9yIGEgZGV2aWNlCisJICovCisKKwkvKiBSZWFkIGEgc2luZ2xlIGJ5dGUgb2YgYSBkZXZpY2UgKi8KKwlEVDk4MTJfUl9TSU5HTEVfQllURV9ERVYgPSAxMiwKKwkvKiBXcml0ZSBhIHNpbmdsZSBieXRlIG9mIGEgZGV2aWNlICovCisJRFQ5ODEyX1dfU0lOR0xFX0JZVEVfREVWID0gMTMsCisJLyogTXVsdGlwbGUgUmVhZHMgb2YgYSBkZXZpY2UgKi8KKwlEVDk4MTJfUl9NVUxUSV9CWVRFX0RFViA9IDE0LAorCS8qIE11bHRpcGxlIFdyaXRlcyBvZiBhIGRldmljZSAqLworCURUOTgxMl9XX01VTFRJX0JZVEVfREVWID0gMTUsCisKKwkvKiBOb3Qgc3VyZSBpZiB3ZSdsbCBuZWVkIHRoaXMgKi8KKwlEVDk4MTJfV19EQUNfVEhSRVNIT0xEID0gMTYsCisKKwkvKiBTZXQgaW50ZXJydXB0IG9uIGNoYW5nZSBtYXNrICovCisJRFQ5ODEyX1dfSU5UX09OX0NIQU5HRV9NQVNLID0gMTcsCisKKwkvKiBXcml0ZSAob3IgQ2xlYXIpIHRoZSBDR0wgZm9yIHRoZSBBREMgKi8KKwlEVDk4MTJfV19DR0wgPSAxOCwKKwkvKiBNdWx0aXBsZSBSZWFkcyBvZiBVU0IgbWVtb3J5ICovCisJRFQ5ODEyX1JfTVVMVElfQllURV9VU0JNRU0gPSAxOSwKKwkvKiBNdWx0aXBsZSBXcml0ZXMgdG8gVVNCIG1lbW9yeSAqLworCURUOTgxMl9XX01VTFRJX0JZVEVfVVNCTUVNID0gMjAsCisKKwkvKiBJc3N1ZSBhIHN0YXJ0IGNvbW1hbmQgdG8gYSBnaXZlbiBzdWJzeXN0ZW0gKi8KKwlEVDk4MTJfU1RBUlRfU1VCU1lTVEVNID0gMjEsCisJLyogSXNzdWUgYSBzdG9wIGNvbW1hbmQgdG8gYSBnaXZlbiBzdWJzeXN0ZW0gKi8KKwlEVDk4MTJfU1RPUF9TVUJTWVNURU0gPSAyMiwKKworCS8qIGNhbGlicmF0ZSB0aGUgYm9hcmQgdXNpbmcgQ0FMX1BPVF9DTUQgKi8KKwlEVDk4MTJfQ0FMSUJSQVRFX1BPVCA9IDIzLAorCS8qIHNldCB0aGUgREFDIEZJRk8gc2l6ZSAqLworCURUOTgxMl9XX0RBQ19GSUZPX1NJWkUgPSAyNCwKKwkvKiBXcml0ZSBvciBDbGVhciB0aGUgQ0dMIGZvciB0aGUgREFDICovCisJRFQ5ODEyX1dfQ0dMX0RBQyA9IDI1LAorCS8qIFJlYWQgYSBzaW5nbGUgdmFsdWUgZnJvbSBhIHN1YnN5c3RlbSAqLworCURUOTgxMl9SX1NJTkdMRV9WQUxVRV9DTUQgPSAyNiwKKwkvKiBXcml0ZSBhIHNpbmdsZSB2YWx1ZSB0byBhIHN1YnN5c3RlbSAqLworCURUOTgxMl9XX1NJTkdMRV9WQUxVRV9DTUQgPSAyNywKKwkvKiBWYWxpZCBEVDk4MTJfVVNCX0ZJUk1XQVJFX0NNRF9DT0RFJ3Mgd2lsbCBiZSBsZXNzIHRoYW4gdGhpcyBudW1iZXIgKi8KKwlEVDk4MTJfTUFYX1VTQl9GSVJNV0FSRV9DTURfQ09ERSwKK307CisKK3N0cnVjdCBkdDk4MTJfZmxhc2hfZGF0YSB7CisJdTE2IG51bWJ5dGVzOworCXUxNiBhZGRyZXNzOworfTsKKworI2RlZmluZSBEVDk4MTJfTUFYX05VTV9NVUxUSV9CWVRFX1JEUyAgXAorICAgICgoRFQ5ODEyX01BWF9XUklURV9DTURfUElQRV9TSVpFIC0gNCAtIDEpIC8gc2l6ZW9mKHU4KSkKKworc3RydWN0IGR0OTgxMl9yZWFkX211bHRpIHsKKwl1OCBjb3VudDsKKwl1OCBhZGRyZXNzW0RUOTgxMl9NQVhfTlVNX01VTFRJX0JZVEVfUkRTXTsKK307CisKK3N0cnVjdCBkdDk4MTJfd3JpdGVfYnl0ZSB7CisJdTggYWRkcmVzczsKKwl1OCB2YWx1ZTsKK307CisKKyNkZWZpbmUgRFQ5ODEyX01BWF9OVU1fTVVMVElfQllURV9XUlRTICBcCisgICAgKChEVDk4MTJfTUFYX1dSSVRFX0NNRF9QSVBFX1NJWkUgLSA0IC0gMSkgLyBcCisgICAgICBzaXplb2Yoc3RydWN0IGR0OTgxMl93cml0ZV9ieXRlKSkKKworc3RydWN0IGR0OTgxMl93cml0ZV9tdWx0aSB7CisJdTggY291bnQ7CisJc3RydWN0IGR0OTgxMl93cml0ZV9ieXRlIHdyaXRlW0RUOTgxMl9NQVhfTlVNX01VTFRJX0JZVEVfV1JUU107Cit9OworCitzdHJ1Y3QgZHQ5ODEyX3Jtd19ieXRlIHsKKwl1OCBhZGRyZXNzOworCXU4IGFuZF9tYXNrOworCXU4IG9yX3ZhbHVlOworfTsKKworI2RlZmluZSBEVDk4MTJfTUFYX05VTV9NVUxUSV9CWVRFX1JNV1MgIFwKKyAgICAoKERUOTgxMl9NQVhfV1JJVEVfQ01EX1BJUEVfU0laRSAtIDQgLSAxKSAvIHNpemVvZihzdHJ1Y3QgZHQ5ODEyX3Jtd19ieXRlKSkKKworc3RydWN0IGR0OTgxMl9ybXdfbXVsdGkgeworCXU4IGNvdW50OworCXN0cnVjdCBkdDk4MTJfcm13X2J5dGUgcm13W0RUOTgxMl9NQVhfTlVNX01VTFRJX0JZVEVfUk1XU107Cit9OworCitzdHJ1Y3QgZHQ5ODEyX3VzYl9jbWQgeworCXUzMiBjbWQ7CisJdW5pb24geworCQlzdHJ1Y3QgZHQ5ODEyX2ZsYXNoX2RhdGEgZmxhc2hfZGF0YV9pbmZvOworCQlzdHJ1Y3QgZHQ5ODEyX3JlYWRfbXVsdGkgcmVhZF9tdWx0aV9pbmZvOworCQlzdHJ1Y3QgZHQ5ODEyX3dyaXRlX211bHRpIHdyaXRlX211bHRpX2luZm87CisJCXN0cnVjdCBkdDk4MTJfcm13X211bHRpIHJtd19tdWx0aV9pbmZvOworCX0gdTsKKyNpZiAwCisJV1JJVEVfQllURV9JTkZPIFdyaXRlQnl0ZUluZm87CisJUkVBRF9CWVRFX0lORk8gUmVhZEJ5dGVJbmZvOworCVdSSVRFX01VTFRJX0lORk8gV3JpdGVNdWx0aUluZm87CisJUkVBRF9NVUxUSV9JTkZPIFJlYWRNdWx0aUluZm87CisJUk1XX0JZVEVfSU5GTyBSTVdCeXRlSW5mbzsKKwlSTVdfTVVMVElfSU5GTyBSTVdNdWx0aUluZm87CisJREFDX1RIUkVTSE9MRF9JTkZPIERhY1RocmVzaG9sZEluZm87CisJSU5UX09OX0NIQU5HRV9NQVNLX0lORk8gSW50T25DaGFuZ2VNYXNrSW5mbzsKKwlDR0xfSU5GTyBDZ2xJbmZvOworCVNVQlNZU1RFTV9JTkZPIFN1YnN5c3RlbUluZm87CisJQ0FMX1BPVF9DTUQgQ2FsUG90Q21kOworCVdSSVRFX0RFVl9CWVRFX0lORk8gV3JpdGVEZXZCeXRlSW5mbzsKKwlSRUFEX0RFVl9CWVRFX0lORk8gUmVhZERldkJ5dGVJbmZvOworCVdSSVRFX0RFVl9NVUxUSV9JTkZPIFdyaXRlRGV2TXVsdGlJbmZvOworCVJFQURfREVWX01VTFRJX0lORk8gUmVhZERldk11bHRpSW5mbzsKKwlSRUFEX1NJTkdMRV9WQUxVRV9JTkZPIFJlYWRTaW5nbGVWYWx1ZUluZm87CisJV1JJVEVfU0lOR0xFX1ZBTFVFX0lORk8gV3JpdGVTaW5nbGVWYWx1ZUluZm87CisjZW5kaWYKK307CisKKyNkZWZpbmUgRFQ5ODEyX05VTV9TTE9UUwkxNgorCitzdGF0aWMgREVDTEFSRV9NVVRFWChkdDk4MTJfbXV0ZXgpOworCitzdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgZHQ5ODEyX3RhYmxlW10gPSB7CisJe1VTQl9ERVZJQ0UoMHgwODY3LCAweDk4MTIpfSwKKwl7IH0JCQkvKiBUZXJtaW5hdGluZyBlbnRyeSAqLworfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRSh1c2IsIGR0OTgxMl90YWJsZSk7CisKK3N0cnVjdCB1c2JfZHQ5ODEyIHsKKwlzdHJ1Y3Qgc2xvdF9kdDk4MTIgKnNsb3Q7CisJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXY7CisJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGVyZmFjZTsKKwl1MTYgdmVuZG9yOworCXUxNiBwcm9kdWN0OworCXUxNiBkZXZpY2U7CisJdTMyIHNlcmlhbDsKKwlzdHJ1Y3QgeworCQlfX3U4IGFkZHI7CisJCXNpemVfdCBzaXplOworCX0gbWVzc2FnZV9waXBlLCBjb21tYW5kX3dyaXRlLCBjb21tYW5kX3JlYWQsIHdyaXRlX3N0cmVhbSwgcmVhZF9zdHJlYW07CisJc3RydWN0IGtyZWYga3JlZjsKKwl1MTYgYW5hbG9nX291dF9zaGFkb3dbMl07CisJdTggZGlnaXRhbF9vdXRfc2hhZG93OworfTsKKworc3RydWN0IGNvbWVkaV9kdDk4MTIgeworCXN0cnVjdCBzbG90X2R0OTgxMiAqc2xvdDsKKwl1MzIgc2VyaWFsOworfTsKKworc3RydWN0IHNsb3RfZHQ5ODEyIHsKKwlzdHJ1Y3Qgc2VtYXBob3JlIG11dGV4OworCXUzMiBzZXJpYWw7CisJc3RydWN0IHVzYl9kdDk4MTIgKnVzYjsKKwlzdHJ1Y3QgY29tZWRpX2R0OTgxMiAqY29tZWRpOworfTsKKworc3RhdGljIGNvbnN0IGNvbWVkaV9scmFuZ2UgZHQ5ODEyXzEwX2Fpbl9yYW5nZSA9IHsgMSwgeworCQkJQklQX1JBTkdFKDEwKSwKKwl9Cit9OworCitzdGF0aWMgY29uc3QgY29tZWRpX2xyYW5nZSBkdDk4MTJfMnB0NV9haW5fcmFuZ2UgPSB7IDEsIHsKKwkJCVVOSV9SQU5HRSgyLjUpLAorCX0KK307CisKK3N0YXRpYyBjb25zdCBjb21lZGlfbHJhbmdlIGR0OTgxMl8xMF9hb3V0X3JhbmdlID0geyAxLCB7CisJCQlCSVBfUkFOR0UoMTApLAorCX0KK307CisKK3N0YXRpYyBjb25zdCBjb21lZGlfbHJhbmdlIGR0OTgxMl8ycHQ1X2FvdXRfcmFuZ2UgPSB7IDEsIHsKKwkJCVVOSV9SQU5HRSgyLjUpLAorCX0KK307CisKK3N0YXRpYyBzdHJ1Y3Qgc2xvdF9kdDk4MTIgZHQ5ODEyW0RUOTgxMl9OVU1fU0xPVFNdOworCisvKiBVc2VmdWwgc2hvcnRoYW5kIGFjY2VzcyB0byBwcml2YXRlIGRhdGEgKi8KKyNkZWZpbmUgZGV2cHJpdiAoKHN0cnVjdCBjb21lZGlfZHQ5ODEyICopZGV2LT5wcml2YXRlKQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCB1c2JfZHQ5ODEyICp0b19kdDk4MTJfZGV2KHN0cnVjdCBrcmVmICpkKQoreworCXJldHVybiBjb250YWluZXJfb2YoZCwgc3RydWN0IHVzYl9kdDk4MTIsIGtyZWYpOworfQorCitzdGF0aWMgdm9pZCBkdDk4MTJfZGVsZXRlKHN0cnVjdCBrcmVmICprcmVmKQoreworCXN0cnVjdCB1c2JfZHQ5ODEyICpkZXYgPSB0b19kdDk4MTJfZGV2KGtyZWYpOworCisJdXNiX3B1dF9kZXYoZGV2LT51ZGV2KTsKKwlrZnJlZShkZXYpOworfQorCitzdGF0aWMgaW50IGR0OTgxMl9yZWFkX2luZm8oc3RydWN0IHVzYl9kdDk4MTIgKmRldiwgaW50IG9mZnNldCwgdm9pZCAqYnVmLAorCQkJICAgIHNpemVfdCBidWZfc2l6ZSkKK3sKKwlzdHJ1Y3QgZHQ5ODEyX3VzYl9jbWQgY21kOworCWludCBjb3VudCwgcmV0dmFsOworCisJY21kLmNtZCA9IGNwdV90b19sZTMyKERUOTgxMl9SX0ZMQVNIX0RBVEEpOworCWNtZC51LmZsYXNoX2RhdGFfaW5mby5hZGRyZXNzID0KKwkJY3B1X3RvX2xlMTYoRFQ5ODEyX0RJQUdTX0JPQVJEX0lORk9fQUREUiArIG9mZnNldCk7CisJY21kLnUuZmxhc2hfZGF0YV9pbmZvLm51bWJ5dGVzID0gY3B1X3RvX2xlMTYoYnVmX3NpemUpOworCisJLyogRFQ5ODEyIG9ubHkgcmVzcG9uZHMgdG8gMzIgYnl0ZSB3cml0ZXMhISAqLworCWNvdW50ID0gMzI7CisJcmV0dmFsID0gdXNiX2J1bGtfbXNnKGRldi0+dWRldiwKKwkJCSAgICAgIHVzYl9zbmRidWxrcGlwZShkZXYtPnVkZXYsCisJCQkJCSAgICAgIGRldi0+Y29tbWFuZF93cml0ZS5hZGRyKSwKKwkJCSAgICAgICZjbWQsIDMyLCAmY291bnQsIEhaICogMSk7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKwlyZXR2YWwgPSB1c2JfYnVsa19tc2coZGV2LT51ZGV2LAorCQkJICAgICAgdXNiX3JjdmJ1bGtwaXBlKGRldi0+dWRldiwKKwkJCQkJICAgICAgZGV2LT5jb21tYW5kX3JlYWQuYWRkciksCisJCQkgICAgICBidWYsIGJ1Zl9zaXplLCAmY291bnQsIEhaICogMSk7CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGludCBkdDk4MTJfcmVhZF9tdWx0aXBsZV9yZWdpc3RlcnMoc3RydWN0IHVzYl9kdDk4MTIgKmRldiwgaW50IHJlZ19jb3VudCwKKwkJCQkJICB1OCAqYWRkcmVzcywgdTggKnZhbHVlKQoreworCXN0cnVjdCBkdDk4MTJfdXNiX2NtZCBjbWQ7CisJaW50IGksIGNvdW50LCByZXR2YWw7CisKKwljbWQuY21kID0gY3B1X3RvX2xlMzIoRFQ5ODEyX1JfTVVMVElfQllURV9SRUcpOworCWNtZC51LnJlYWRfbXVsdGlfaW5mby5jb3VudCA9IHJlZ19jb3VudDsKKwlmb3IgKGkgPSAwOyBpIDwgcmVnX2NvdW50OyBpKyspCisJCWNtZC51LnJlYWRfbXVsdGlfaW5mby5hZGRyZXNzW2ldID0gYWRkcmVzc1tpXTsKKworCS8qIERUOTgxMiBvbmx5IHJlc3BvbmRzIHRvIDMyIGJ5dGUgd3JpdGVzISEgKi8KKwljb3VudCA9IDMyOworCXJldHZhbCA9IHVzYl9idWxrX21zZyhkZXYtPnVkZXYsCisJCQkgICAgICB1c2Jfc25kYnVsa3BpcGUoZGV2LT51ZGV2LAorCQkJCQkgICAgICBkZXYtPmNvbW1hbmRfd3JpdGUuYWRkciksCisJCQkgICAgICAmY21kLCAzMiwgJmNvdW50LCBIWiAqIDEpOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisJcmV0dmFsID0gdXNiX2J1bGtfbXNnKGRldi0+dWRldiwKKwkJCSAgICAgIHVzYl9yY3ZidWxrcGlwZShkZXYtPnVkZXYsCisJCQkJCSAgICAgIGRldi0+Y29tbWFuZF9yZWFkLmFkZHIpLAorCQkJICAgICAgdmFsdWUsIHJlZ19jb3VudCwgJmNvdW50LCBIWiAqIDEpOworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQgZHQ5ODEyX3dyaXRlX211bHRpcGxlX3JlZ2lzdGVycyhzdHJ1Y3QgdXNiX2R0OTgxMiAqZGV2LAorCQkJCQkgICBpbnQgcmVnX2NvdW50LCB1OCAqYWRkcmVzcywKKwkJCQkJICAgdTggKnZhbHVlKQoreworCXN0cnVjdCBkdDk4MTJfdXNiX2NtZCBjbWQ7CisJaW50IGksIGNvdW50LCByZXR2YWw7CisKKwljbWQuY21kID0gY3B1X3RvX2xlMzIoRFQ5ODEyX1dfTVVMVElfQllURV9SRUcpOworCWNtZC51LnJlYWRfbXVsdGlfaW5mby5jb3VudCA9IHJlZ19jb3VudDsKKwlmb3IgKGkgPSAwOyBpIDwgcmVnX2NvdW50OyBpKyspIHsKKwkJY21kLnUud3JpdGVfbXVsdGlfaW5mby53cml0ZVtpXS5hZGRyZXNzID0gYWRkcmVzc1tpXTsKKwkJY21kLnUud3JpdGVfbXVsdGlfaW5mby53cml0ZVtpXS52YWx1ZSA9IHZhbHVlW2ldOworCX0KKwkvKiBEVDk4MTIgb25seSByZXNwb25kcyB0byAzMiBieXRlIHdyaXRlcyEhICovCisJcmV0dmFsID0gdXNiX2J1bGtfbXNnKGRldi0+dWRldiwKKwkJCSAgICAgIHVzYl9zbmRidWxrcGlwZShkZXYtPnVkZXYsCisJCQkJCSAgICAgIGRldi0+Y29tbWFuZF93cml0ZS5hZGRyKSwKKwkJCSAgICAgICZjbWQsIDMyLCAmY291bnQsIEhaICogMSk7CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGludCBkdDk4MTJfcm13X211bHRpcGxlX3JlZ2lzdGVycyhzdHJ1Y3QgdXNiX2R0OTgxMiAqZGV2LCBpbnQgcmVnX2NvdW50LAorCQkJCQkgc3RydWN0IGR0OTgxMl9ybXdfYnl0ZSAqcm13KQoreworCXN0cnVjdCBkdDk4MTJfdXNiX2NtZCBjbWQ7CisJaW50IGksIGNvdW50LCByZXR2YWw7CisKKwljbWQuY21kID0gY3B1X3RvX2xlMzIoRFQ5ODEyX1JNV19NVUxUSV9CWVRFX1JFRyk7CisJY21kLnUucm13X211bHRpX2luZm8uY291bnQgPSByZWdfY291bnQ7CisJZm9yIChpID0gMDsgaSA8IHJlZ19jb3VudDsgaSsrKQorCQljbWQudS5ybXdfbXVsdGlfaW5mby5ybXdbaV0gPSBybXdbaV07CisKKwkvKiBEVDk4MTIgb25seSByZXNwb25kcyB0byAzMiBieXRlIHdyaXRlcyEhICovCisJcmV0dmFsID0gdXNiX2J1bGtfbXNnKGRldi0+dWRldiwKKwkJCSAgICAgIHVzYl9zbmRidWxrcGlwZShkZXYtPnVkZXYsCisJCQkJCSAgICAgIGRldi0+Y29tbWFuZF93cml0ZS5hZGRyKSwKKwkJCSAgICAgICZjbWQsIDMyLCAmY291bnQsIEhaICogMSk7CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGludCBkdDk4MTJfZGlnaXRhbF9pbihzdHJ1Y3Qgc2xvdF9kdDk4MTIgKnNsb3QsIHU4ICpiaXRzKQoreworCWludCByZXN1bHQgPSAtRU5PREVWOworCisJZG93bigmc2xvdC0+bXV0ZXgpOworCWlmIChzbG90LT51c2IpIHsKKwkJdTggcmVnWzJdID0geyBGMDIwX1NGUl9QMywgRjAyMF9TRlJfUDEgfTsKKwkJdTggdmFsdWVbMl07CisKKwkJcmVzdWx0ID0gZHQ5ODEyX3JlYWRfbXVsdGlwbGVfcmVnaXN0ZXJzKHNsb3QtPnVzYiwgMiwgcmVnLAorCQkJCQkJCXZhbHVlKTsKKwkJaWYgKHJlc3VsdCA9PSAwKSB7CisJCQkvKgorCQkJICogYml0cyAwLTYgaW4gRjAyMF9TRlJfUDMgYXJlIGJpdHMgMC02IGluIHRoZSBkaWdpdGFsCisJCQkgKiBpbnB1dCBwb3J0IGJpdCAzIGluIEYwMjBfU0ZSX1AxIGlzIGJpdCA3IGluIHRoZQorCQkJICogZGlnaXRhbCBpbnB1dCBwb3J0CisJCQkgKi8KKwkJCSpiaXRzID0gKHZhbHVlWzBdICYgMHg3ZikgfCAoKHZhbHVlWzFdICYgMHgwOCkgPDwgNCk7CisJCQkvKiBwcmludGsoIiUyLjJ4LCAlMi4yeCAtPiAlMi4yeFxuIiwKKwkJCQkgIHZhbHVlWzBdLCB2YWx1ZVsxXSwgKmJpdHMpOyAqLworCQl9CisJfQorCXVwKCZzbG90LT5tdXRleCk7CisKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW50IGR0OTgxMl9kaWdpdGFsX291dChzdHJ1Y3Qgc2xvdF9kdDk4MTIgKnNsb3QsIHU4IGJpdHMpCit7CisJaW50IHJlc3VsdCA9IC1FTk9ERVY7CisKKwlkb3duKCZzbG90LT5tdXRleCk7CisJaWYgKHNsb3QtPnVzYikgeworCQl1OCByZWdbMV07CisJCXU4IHZhbHVlWzFdOworCisJCXJlZ1swXSA9IEYwMjBfU0ZSX1AyOworCQl2YWx1ZVswXSA9IGJpdHM7CisJCXJlc3VsdCA9IGR0OTgxMl93cml0ZV9tdWx0aXBsZV9yZWdpc3RlcnMoc2xvdC0+dXNiLCAxLCByZWcsCisJCQkJCQkJIHZhbHVlKTsKKwkJc2xvdC0+dXNiLT5kaWdpdGFsX291dF9zaGFkb3cgPSBiaXRzOworCX0KKwl1cCgmc2xvdC0+bXV0ZXgpOworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQgZHQ5ODEyX2RpZ2l0YWxfb3V0X3NoYWRvdyhzdHJ1Y3Qgc2xvdF9kdDk4MTIgKnNsb3QsIHU4ICpiaXRzKQoreworCWludCByZXN1bHQgPSAtRU5PREVWOworCisJZG93bigmc2xvdC0+bXV0ZXgpOworCWlmIChzbG90LT51c2IpIHsKKwkJKmJpdHMgPSBzbG90LT51c2ItPmRpZ2l0YWxfb3V0X3NoYWRvdzsKKwkJcmVzdWx0ID0gMDsKKwl9CisJdXAoJnNsb3QtPm11dGV4KTsKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgdm9pZCBkdDk4MTJfY29uZmlndXJlX211eChzdHJ1Y3QgdXNiX2R0OTgxMiAqZGV2LAorCQkJCSBzdHJ1Y3QgZHQ5ODEyX3Jtd19ieXRlICpybXcsIGludCBjaGFubmVsKQoreworCWlmIChkZXYtPmRldmljZSA9PSBEVDk4MTJfREVWSURfRFQ5ODEyXzEwKSB7CisJCS8qIEluIHRoZSBEVDk4MTIvMTBWIE1VWCBpcyBzZWxlY3RlZCBieSBQMS41LTcgKi8KKwkJcm13LT5hZGRyZXNzID0gRjAyMF9TRlJfUDE7CisJCXJtdy0+YW5kX21hc2sgPSAweGUwOworCQlybXctPm9yX3ZhbHVlID0gY2hhbm5lbCA8PCA1OworCX0gZWxzZSB7CisJCS8qIEluIHRoZSBEVDk4MTIvMi41ViwgaW50ZXJuYWwgbXV4IGlzIHNlbGVjdGVkIGJ5IGJpdHMgMDoyICovCisJCXJtdy0+YWRkcmVzcyA9IEYwMjBfU0ZSX0FNWDBTTDsKKwkJcm13LT5hbmRfbWFzayA9IDB4ZmY7CisJCXJtdy0+b3JfdmFsdWUgPSBjaGFubmVsICYgMHgwNzsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGR0OTgxMl9jb25maWd1cmVfZ2FpbihzdHJ1Y3QgdXNiX2R0OTgxMiAqZGV2LAorCQkJCSAgc3RydWN0IGR0OTgxMl9ybXdfYnl0ZSAqcm13LAorCQkJCSAgZW51bSBkdDk4MTJfZ2FpbiBnYWluKQoreworCWlmIChkZXYtPmRldmljZSA9PSBEVDk4MTJfREVWSURfRFQ5ODEyXzEwKSB7CisJCS8qIEluIHRoZSBEVDk4MTIvMTBWLCB0aGVyZSBpcyBhbiBleHRlcm5hbCBnYWluIG9mIDAuNSAqLworCQlnYWluIDw8PSAxOworCX0KKworCXJtdy0+YWRkcmVzcyA9IEYwMjBfU0ZSX0FEQzBDRjsKKwlybXctPmFuZF9tYXNrID0gRjAyMF9NQVNLX0FEQzBDRl9BTVAwR04yIHwKKwkJCUYwMjBfTUFTS19BREMwQ0ZfQU1QMEdOMSB8CisJCQlGMDIwX01BU0tfQURDMENGX0FNUDBHTjA7CisJc3dpdGNoIChnYWluKSB7CisJCS8qCisJCSAqIDAwMCAtPiBHYWluID0gIDEKKwkJICogMDAxIC0+IEdhaW4gPSAgMgorCQkgKiAwMTAgLT4gR2FpbiA9ICA0CisJCSAqIDAxMSAtPiBHYWluID0gIDgKKwkJICogMTB4IC0+IEdhaW4gPSAxNgorCQkgKiAxMXggLT4gR2FpbiA9ICAwLjUKKwkJICovCisJY2FzZSBEVDk4MTJfR0FJTl8wUFQ1OgorCQlybXctPm9yX3ZhbHVlID0gRjAyMF9NQVNLX0FEQzBDRl9BTVAwR04yIHx8CisJCQkJRjAyMF9NQVNLX0FEQzBDRl9BTVAwR04xOworCQlicmVhazsKKwljYXNlIERUOTgxMl9HQUlOXzE6CisJCXJtdy0+b3JfdmFsdWUgPSAweDAwOworCQlicmVhazsKKwljYXNlIERUOTgxMl9HQUlOXzI6CisJCXJtdy0+b3JfdmFsdWUgPSBGMDIwX01BU0tfQURDMENGX0FNUDBHTjA7CisJCWJyZWFrOworCWNhc2UgRFQ5ODEyX0dBSU5fNDoKKwkJcm13LT5vcl92YWx1ZSA9IEYwMjBfTUFTS19BREMwQ0ZfQU1QMEdOMTsKKwkJYnJlYWs7CisJY2FzZSBEVDk4MTJfR0FJTl84OgorCQlybXctPm9yX3ZhbHVlID0gRjAyMF9NQVNLX0FEQzBDRl9BTVAwR04xIHx8CisJCQkJRjAyMF9NQVNLX0FEQzBDRl9BTVAwR04wOworCQlicmVhazsKKwljYXNlIERUOTgxMl9HQUlOXzE2OgorCQlybXctPm9yX3ZhbHVlID0gRjAyMF9NQVNLX0FEQzBDRl9BTVAwR04yOworCQlicmVhazsKKwlkZWZhdWx0OgorCQllcnIoIklsbGVnYWwgZ2FpbiAlZFxuIiwgZ2Fpbik7CisKKwl9Cit9CisKK3N0YXRpYyBpbnQgZHQ5ODEyX2FuYWxvZ19pbihzdHJ1Y3Qgc2xvdF9kdDk4MTIgKnNsb3QsIGludCBjaGFubmVsLCB1MTYgKnZhbHVlLAorCQkJICAgIGVudW0gZHQ5ODEyX2dhaW4gZ2FpbikKK3sKKwlzdHJ1Y3QgZHQ5ODEyX3Jtd19ieXRlIHJtd1szXTsKKwl1OCByZWdbM10gPSB7CisJCUYwMjBfU0ZSX0FEQzBDTiwKKwkJRjAyMF9TRlJfQURDMEgsCisJCUYwMjBfU0ZSX0FEQzBMCisJfTsKKwl1OCB2YWxbM107CisJaW50IHJlc3VsdCA9IC1FTk9ERVY7CisKKwlkb3duKCZzbG90LT5tdXRleCk7CisJaWYgKCFzbG90LT51c2IpCisJCWdvdG8gZXhpdDsKKworCS8qIDEgc2VsZWN0IHRoZSBnYWluICovCisJZHQ5ODEyX2NvbmZpZ3VyZV9nYWluKHNsb3QtPnVzYiwgJnJtd1swXSwgZ2Fpbik7CisKKwkvKiAyIHNldCB0aGUgTVVYIHRvIHNlbGVjdCB0aGUgY2hhbm5lbCAqLworCWR0OTgxMl9jb25maWd1cmVfbXV4KHNsb3QtPnVzYiwgJnJtd1sxXSwgY2hhbm5lbCk7CisKKwkvKiAzIHN0YXJ0IGNvbnZlcnNpb24gKi8KKwlybXdbMl0uYWRkcmVzcyA9IEYwMjBfU0ZSX0FEQzBDTjsKKwlybXdbMl0uYW5kX21hc2sgPSAweGZmOworCXJtd1syXS5vcl92YWx1ZSA9IEYwMjBfTUFTS19BREMwQ05fQUQwRU4gfCBGMDIwX01BU0tfQURDMENOX0FEMEJVU1k7CisKKwlyZXN1bHQgPSBkdDk4MTJfcm13X211bHRpcGxlX3JlZ2lzdGVycyhzbG90LT51c2IsIDMsIHJtdyk7CisJaWYgKHJlc3VsdCkKKwkJZ290byBleGl0OworCisJLyogcmVhZCB0aGUgc3RhdHVzIGFuZCBBREMgKi8KKwlyZXN1bHQgPSBkdDk4MTJfcmVhZF9tdWx0aXBsZV9yZWdpc3RlcnMoc2xvdC0+dXNiLCAzLCByZWcsIHZhbCk7CisJaWYgKHJlc3VsdCkKKwkJZ290byBleGl0OworCS8qCisJICogQW4gQURDIGNvbnZlcnNpb24gdGFrZXMgMTYgU0FSIGNsb2NrcyBjeWNsZXMsIGkuZS4gYWJvdXQgOXVzLgorCSAqIFRoZXJlZm9yZSwgYmV0d2VlbiB0aGUgaW5zdGFudCB0aGF0IEFEMEJVU1kgd2FzIHNldCB2aWEKKwkgKiBkdDk4MTJfcm13X211bHRpcGxlX3JlZ2lzdGVycyBhbmQgdGhlIHJlYWQgb2YgQUQwQlVTWSB2aWEKKwkgKiBkdDk4MTJfcmVhZF9tdWx0aXBsZV9yZWdpc3RlcnMsIHRoZSBjb252ZXJzaW9uIHNob3VsZCBiZSBjb21wbGV0ZQorCSAqIHNpbmNlIHRoZXNlIHR3byBvcGVyYXRpb25zIHJlcXVpcmUgdHdvIFVTQiB0cmFuc2FjdGlvbnMgZWFjaCB0YWtpbmcKKwkgKiBhdCBsZWFzdCBhIG1pbGxpc2Vjb25kIHRvIGNvbXBsZXRlLiAgSG93ZXZlciwgbGV0cyBtYWtlIHN1cmUgdGhhdAorCSAqIGNvbnZlcnNpb24gaXMgZmluaXNoZWQuCisJICovCisJaWYgKCh2YWxbMF0gJiAoRjAyMF9NQVNLX0FEQzBDTl9BRDBJTlQgfCBGMDIwX01BU0tfQURDMENOX0FEMEJVU1kpKSA9PQorCSAgICBGMDIwX01BU0tfQURDMENOX0FEMElOVCkgeworCQlzd2l0Y2ggKHNsb3QtPnVzYi0+ZGV2aWNlKSB7CisJCWNhc2UgRFQ5ODEyX0RFVklEX0RUOTgxMl8xMDoKKwkJCS8qCisJCQkgKiBGb3IgRFQ5ODEyLTEwViB0aGUgcGVyc29uYWxpdHkgbW9kdWxlIHNldCB0aGUKKwkJCSAqIGVuY29kaW5nIHRvIDIncyBjb21wbGVtZW50LiBIZW5jZSwgY29udmVydCBpdCBiZWZvcmUKKwkJCSAqIHJldHVybmluZyBpdAorCQkJICovCisJCQkqdmFsdWUgPSAoKHZhbFsxXSA8PCA4KSB8IHZhbFsyXSkgKyAweDgwMDsKKwkJCWJyZWFrOworCQljYXNlIERUOTgxMl9ERVZJRF9EVDk4MTJfMlBUNToKKwkJCSp2YWx1ZSA9ICh2YWxbMV0gPDwgOCkgfCB2YWxbMl07CisJCQlicmVhazsKKwkJfQorCX0KKworZXhpdDoKKwl1cCgmc2xvdC0+bXV0ZXgpOworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQgZHQ5ODEyX2FuYWxvZ19vdXRfc2hhZG93KHN0cnVjdCBzbG90X2R0OTgxMiAqc2xvdCwgaW50IGNoYW5uZWwsCisJCQkJICAgIHUxNiAqdmFsdWUpCit7CisJaW50IHJlc3VsdCA9IC1FTk9ERVY7CisKKwlkb3duKCZzbG90LT5tdXRleCk7CisJaWYgKHNsb3QtPnVzYikgeworCQkqdmFsdWUgPSBzbG90LT51c2ItPmFuYWxvZ19vdXRfc2hhZG93W2NoYW5uZWxdOworCQlyZXN1bHQgPSAwOworCX0KKwl1cCgmc2xvdC0+bXV0ZXgpOworCisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGludCBkdDk4MTJfYW5hbG9nX291dChzdHJ1Y3Qgc2xvdF9kdDk4MTIgKnNsb3QsIGludCBjaGFubmVsLCB1MTYgdmFsdWUpCit7CisJaW50IHJlc3VsdCA9IC1FTk9ERVY7CisKKwlkb3duKCZzbG90LT5tdXRleCk7CisJaWYgKHNsb3QtPnVzYikgeworCQlzdHJ1Y3QgZHQ5ODEyX3Jtd19ieXRlIHJtd1szXTsKKworCQlzd2l0Y2ggKGNoYW5uZWwpIHsKKwkJY2FzZSAwOgorCQkJLyogMS4gU2V0IERBQyBtb2RlICovCisJCQlybXdbMF0uYWRkcmVzcyA9IEYwMjBfU0ZSX0RBQzBDTjsKKwkJCXJtd1swXS5hbmRfbWFzayA9IDB4ZmY7CisJCQlybXdbMF0ub3JfdmFsdWUgPSBGMDIwX01BU0tfREFDeENOX0RBQ3hFTjsKKworCQkJLyogMiBsb2FkIGxvdyBieXRlIG9mIERBQyB2YWx1ZSBmaXJzdCAqLworCQkJcm13WzFdLmFkZHJlc3MgPSBGMDIwX1NGUl9EQUMwTDsKKwkJCXJtd1sxXS5hbmRfbWFzayA9IDB4ZmY7CisJCQlybXdbMV0ub3JfdmFsdWUgPSB2YWx1ZSAmIDB4ZmY7CisKKwkJCS8qIDMgbG9hZCBoaWdoIGJ5dGUgb2YgREFDIHZhbHVlIG5leHQgdG8gbGF0Y2ggdGhlCisJCQkgICAxMi1iaXQgdmFsdWUgKi8KKwkJCXJtd1syXS5hZGRyZXNzID0gRjAyMF9TRlJfREFDMEg7CisJCQlybXdbMl0uYW5kX21hc2sgPSAweGZmOworCQkJcm13WzJdLm9yX3ZhbHVlID0gKHZhbHVlID4+IDgpICYgMHhmOworCQkJYnJlYWs7CisKKwkJY2FzZSAxOgorCQkJLyogMS4gU2V0IERBQyBtb2RlICovCisJCQlybXdbMF0uYWRkcmVzcyA9IEYwMjBfU0ZSX0RBQzFDTjsKKwkJCXJtd1swXS5hbmRfbWFzayA9IDB4ZmY7CisJCQlybXdbMF0ub3JfdmFsdWUgPSBGMDIwX01BU0tfREFDeENOX0RBQ3hFTjsKKworCQkJLyogMiBsb2FkIGxvdyBieXRlIG9mIERBQyB2YWx1ZSBmaXJzdCAqLworCQkJcm13WzFdLmFkZHJlc3MgPSBGMDIwX1NGUl9EQUMxTDsKKwkJCXJtd1sxXS5hbmRfbWFzayA9IDB4ZmY7CisJCQlybXdbMV0ub3JfdmFsdWUgPSB2YWx1ZSAmIDB4ZmY7CisKKwkJCS8qIDMgbG9hZCBoaWdoIGJ5dGUgb2YgREFDIHZhbHVlIG5leHQgdG8gbGF0Y2ggdGhlCisJCQkgICAxMi1iaXQgdmFsdWUgKi8KKwkJCXJtd1syXS5hZGRyZXNzID0gRjAyMF9TRlJfREFDMUg7CisJCQlybXdbMl0uYW5kX21hc2sgPSAweGZmOworCQkJcm13WzJdLm9yX3ZhbHVlID0gKHZhbHVlID4+IDgpICYgMHhmOworCQkJYnJlYWs7CisJCX0KKwkJcmVzdWx0ID0gZHQ5ODEyX3Jtd19tdWx0aXBsZV9yZWdpc3RlcnMoc2xvdC0+dXNiLCAzLCBybXcpOworCQlzbG90LT51c2ItPmFuYWxvZ19vdXRfc2hhZG93W2NoYW5uZWxdID0gdmFsdWU7CisJfQorCXVwKCZzbG90LT5tdXRleCk7CisKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKgorICogVVNCIGZyYW1ld29yayBmdW5jdGlvbnMKKyAqLworCitzdGF0aWMgaW50IGR0OTgxMl9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZXJmYWNlLAorCQkJY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKQoreworCWludCByZXR2YWwgPSAtRU5PTUVNOworCXN0cnVjdCB1c2JfZHQ5ODEyICpkZXYgPSBOVUxMOworCXN0cnVjdCB1c2JfaG9zdF9pbnRlcmZhY2UgKmlmYWNlX2Rlc2M7CisJc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplbmRwb2ludDsKKwlpbnQgaTsKKwl1OCBmdzsKKworCS8qIGFsbG9jYXRlIG1lbW9yeSBmb3Igb3VyIGRldmljZSBzdGF0ZSBhbmQgaW5pdGlhbGl6ZSBpdCAqLworCWRldiA9IGt6YWxsb2Moc2l6ZW9mKCpkZXYpLCBHRlBfS0VSTkVMKTsKKwlpZiAoZGV2ID09IE5VTEwpIHsKKwkJZGV2X2VycigmaW50ZXJmYWNlLT5kZXYsICJPdXQgb2YgbWVtb3J5XG4iKTsKKwkJZ290byBlcnJvcjsKKwl9CisJa3JlZl9pbml0KCZkZXYtPmtyZWYpOworCisJZGV2LT51ZGV2ID0gdXNiX2dldF9kZXYoaW50ZXJmYWNlX3RvX3VzYmRldihpbnRlcmZhY2UpKTsKKwlkZXYtPmludGVyZmFjZSA9IGludGVyZmFjZTsKKworCS8qIENoZWNrIGVuZHBvaW50cyAqLworCWlmYWNlX2Rlc2MgPSBpbnRlcmZhY2UtPmN1cl9hbHRzZXR0aW5nOworCisJaWYgKGlmYWNlX2Rlc2MtPmRlc2MuYk51bUVuZHBvaW50cyAhPSA1KSB7CisJCWVycigiV3JvbmcgbnVtYmVyIG9mIGVuZHBpbnRzLiIpOworCQlyZXR2YWwgPSAtRU5PREVWOworCQlnb3RvIGVycm9yOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBpZmFjZV9kZXNjLT5kZXNjLmJOdW1FbmRwb2ludHM7ICsraSkgeworCQlpbnQgZGlyZWN0aW9uID0gLTE7CisJCWVuZHBvaW50ID0gJmlmYWNlX2Rlc2MtPmVuZHBvaW50W2ldLmRlc2M7CisJCXN3aXRjaCAoaSkgeworCQljYXNlIDA6CisJCQlkaXJlY3Rpb24gPSBVU0JfRElSX0lOOworCQkJZGV2LT5tZXNzYWdlX3BpcGUuYWRkciA9IGVuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzOworCQkJZGV2LT5tZXNzYWdlX3BpcGUuc2l6ZSA9CisJCQkJCWxlMTZfdG9fY3B1KGVuZHBvaW50LT53TWF4UGFja2V0U2l6ZSk7CisKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQlkaXJlY3Rpb24gPSBVU0JfRElSX09VVDsKKwkJCWRldi0+Y29tbWFuZF93cml0ZS5hZGRyID0gZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3M7CisJCQlkZXYtPmNvbW1hbmRfd3JpdGUuc2l6ZSA9CisJCQkJCWxlMTZfdG9fY3B1KGVuZHBvaW50LT53TWF4UGFja2V0U2l6ZSk7CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJZGlyZWN0aW9uID0gVVNCX0RJUl9JTjsKKwkJCWRldi0+Y29tbWFuZF9yZWFkLmFkZHIgPSBlbmRwb2ludC0+YkVuZHBvaW50QWRkcmVzczsKKwkJCWRldi0+Y29tbWFuZF9yZWFkLnNpemUgPQorCQkJCQlsZTE2X3RvX2NwdShlbmRwb2ludC0+d01heFBhY2tldFNpemUpOworCQkJYnJlYWs7CisJCWNhc2UgMzoKKwkJCWRpcmVjdGlvbiA9IFVTQl9ESVJfT1VUOworCQkJZGV2LT53cml0ZV9zdHJlYW0uYWRkciA9IGVuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzOworCQkJZGV2LT53cml0ZV9zdHJlYW0uc2l6ZSA9CisJCQkJCWxlMTZfdG9fY3B1KGVuZHBvaW50LT53TWF4UGFja2V0U2l6ZSk7CisJCQlicmVhazsKKwkJY2FzZSA0OgorCQkJZGlyZWN0aW9uID0gVVNCX0RJUl9JTjsKKwkJCWRldi0+cmVhZF9zdHJlYW0uYWRkciA9IGVuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzOworCQkJZGV2LT5yZWFkX3N0cmVhbS5zaXplID0KKwkJCQkJbGUxNl90b19jcHUoZW5kcG9pbnQtPndNYXhQYWNrZXRTaXplKTsKKwkJCWJyZWFrOworCQl9CisJCWlmICgoZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3MgJiBVU0JfRElSX0lOKSAhPSBkaXJlY3Rpb24pIHsKKwkJCWRldl9lcnIoJmludGVyZmFjZS0+ZGV2LAorCQkJCSJFbmRwb2ludCBoYXMgd3JvbmcgZGlyZWN0aW9uLlxuIik7CisJCQlyZXR2YWwgPSAtRU5PREVWOworCQkJZ290byBlcnJvcjsKKwkJfQorCX0KKwlpZiAoZHQ5ODEyX3JlYWRfaW5mbyhkZXYsIDAsICZmdywgc2l6ZW9mKGZ3KSkgIT0gMCkgeworCQkvKgorCQkgKiBTZWVtcyBsaWtlIGEgY29uZmlndXJhdGlvbiByZXNldCBpcyBuZWNlc3NhcnkgaWYgZHJpdmVyIGlzCisJCSAqIHJlbG9hZGVkIHdoaWxlIGRldmljZSBpcyBhdHRhY2hlZAorCQkgKi8KKwkJdXNiX3Jlc2V0X2NvbmZpZ3VyYXRpb24oZGV2LT51ZGV2KTsKKwkJZm9yIChpID0gMDsgaSA8IDEwOyBpKyspIHsKKwkJCXJldHZhbCA9IGR0OTgxMl9yZWFkX2luZm8oZGV2LCAxLCAmZncsIHNpemVvZihmdykpOworCQkJaWYgKHJldHZhbCA9PSAwKSB7CisJCQkJZGV2X2luZm8oJmludGVyZmFjZS0+ZGV2LAorCQkJCQkgInVzYl9yZXNldF9jb25maWd1cmF0aW9uIHN1Y2NlZGVkICIKKwkJCQkJICJhZnRlciAlZCBpdGVyYXRpb25zXG4iLCBpKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCWlmIChkdDk4MTJfcmVhZF9pbmZvKGRldiwgMSwgJmRldi0+dmVuZG9yLCBzaXplb2YoZGV2LT52ZW5kb3IpKSAhPSAwKSB7CisJCWVycigiRmFpbGVkIHRvIHJlYWQgdmVuZG9yLiIpOworCQlyZXR2YWwgPSAtRU5PREVWOworCQlnb3RvIGVycm9yOworCX0KKwlpZiAoZHQ5ODEyX3JlYWRfaW5mbyhkZXYsIDMsICZkZXYtPnByb2R1Y3QsCisJCQkgICAgIHNpemVvZihkZXYtPnByb2R1Y3QpKSAhPSAwKSB7CisJCWVycigiRmFpbGVkIHRvIHJlYWQgcHJvZHVjdC4iKTsKKwkJcmV0dmFsID0gLUVOT0RFVjsKKwkJZ290byBlcnJvcjsKKwl9CisJaWYgKGR0OTgxMl9yZWFkX2luZm8oZGV2LCA1LCAmZGV2LT5kZXZpY2UsIHNpemVvZihkZXYtPmRldmljZSkpICE9IDApIHsKKwkJZXJyKCJGYWlsZWQgdG8gcmVhZCBkZXZpY2UuIik7CisJCXJldHZhbCA9IC1FTk9ERVY7CisJCWdvdG8gZXJyb3I7CisJfQorCWlmIChkdDk4MTJfcmVhZF9pbmZvKGRldiwgNywgJmRldi0+c2VyaWFsLCBzaXplb2YoZGV2LT5zZXJpYWwpKSAhPSAwKSB7CisJCWVycigiRmFpbGVkIHRvIHJlYWQgc2VyaWFsLiIpOworCQlyZXR2YWwgPSAtRU5PREVWOworCQlnb3RvIGVycm9yOworCX0KKworCWRldi0+dmVuZG9yID0gbGUxNl90b19jcHUoZGV2LT52ZW5kb3IpOworCWRldi0+cHJvZHVjdCA9IGxlMTZfdG9fY3B1KGRldi0+cHJvZHVjdCk7CisJZGV2LT5kZXZpY2UgPSBsZTE2X3RvX2NwdShkZXYtPmRldmljZSk7CisJZGV2LT5zZXJpYWwgPSBsZTMyX3RvX2NwdShkZXYtPnNlcmlhbCk7CisJc3dpdGNoIChkZXYtPmRldmljZSkgeworCWNhc2UgRFQ5ODEyX0RFVklEX0RUOTgxMl8xMDoKKwkJZGV2LT5hbmFsb2dfb3V0X3NoYWRvd1swXSA9IDB4MDgwMDsKKwkJZGV2LT5hbmFsb2dfb3V0X3NoYWRvd1sxXSA9IDB4ODAwOworCQlicmVhazsKKwljYXNlIERUOTgxMl9ERVZJRF9EVDk4MTJfMlBUNToKKwkJZGV2LT5hbmFsb2dfb3V0X3NoYWRvd1swXSA9IDB4MDAwMDsKKwkJZGV2LT5hbmFsb2dfb3V0X3NoYWRvd1sxXSA9IDB4MDAwMDsKKwkJYnJlYWs7CisJfQorCWRldi0+ZGlnaXRhbF9vdXRfc2hhZG93ID0gMDsKKworCS8qIHNhdmUgb3VyIGRhdGEgcG9pbnRlciBpbiB0aGlzIGludGVyZmFjZSBkZXZpY2UgKi8KKwl1c2Jfc2V0X2ludGZkYXRhKGludGVyZmFjZSwgZGV2KTsKKworCS8qIGxldCB0aGUgdXNlciBrbm93IHdoYXQgbm9kZSB0aGlzIGRldmljZSBpcyBub3cgYXR0YWNoZWQgdG8gKi8KKwlkZXZfaW5mbygmaW50ZXJmYWNlLT5kZXYsICJVU0IgRFQ5ODEyICglNC40eC4lNC40eC4lNC40eCkgIzB4JTguOHhcbiIsCisJCSBkZXYtPnZlbmRvciwgZGV2LT5wcm9kdWN0LCBkZXYtPmRldmljZSwgZGV2LT5zZXJpYWwpOworCisJZG93bigmZHQ5ODEyX211dGV4KTsKKwl7CisJCS8qIEZpbmQgYSBzbG90IGZvciB0aGUgVVNCIGRldmljZSAqLworCQlzdHJ1Y3Qgc2xvdF9kdDk4MTIgKmZpcnN0ID0gTlVMTDsKKwkJc3RydWN0IHNsb3RfZHQ5ODEyICpiZXN0ID0gTlVMTDsKKworCQlmb3IgKGkgPSAwOyBpIDwgRFQ5ODEyX05VTV9TTE9UUzsgaSsrKSB7CisJCQlpZiAoIWZpcnN0ICYmICFkdDk4MTJbaV0udXNiICYmIGR0OTgxMltpXS5zZXJpYWwgPT0gMCkKKwkJCQlmaXJzdCA9ICZkdDk4MTJbaV07CisJCQlpZiAoIWJlc3QgJiYgZHQ5ODEyW2ldLnNlcmlhbCA9PSBkZXYtPnNlcmlhbCkKKwkJCQliZXN0ID0gJmR0OTgxMltpXTsKKwkJfQorCisJCWlmICghYmVzdCkKKwkJCWJlc3QgPSBmaXJzdDsKKworCQlpZiAoYmVzdCkgeworCQkJZG93bigmYmVzdC0+bXV0ZXgpOworCQkJYmVzdC0+dXNiID0gZGV2OworCQkJZGV2LT5zbG90ID0gYmVzdDsKKwkJCXVwKCZiZXN0LT5tdXRleCk7CisJCX0KKwl9CisJdXAoJmR0OTgxMl9tdXRleCk7CisKKwlyZXR1cm4gMDsKKworZXJyb3I6CisJaWYgKGRldikKKwkJa3JlZl9wdXQoJmRldi0+a3JlZiwgZHQ5ODEyX2RlbGV0ZSk7CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIHZvaWQgZHQ5ODEyX2Rpc2Nvbm5lY3Qoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGVyZmFjZSkKK3sKKwlzdHJ1Y3QgdXNiX2R0OTgxMiAqZGV2OworCWludCBtaW5vciA9IGludGVyZmFjZS0+bWlub3I7CisKKwlkb3duKCZkdDk4MTJfbXV0ZXgpOworCWRldiA9IHVzYl9nZXRfaW50ZmRhdGEoaW50ZXJmYWNlKTsKKwlpZiAoZGV2LT5zbG90KSB7CisJCWRvd24oJmRldi0+c2xvdC0+bXV0ZXgpOworCQlkZXYtPnNsb3QtPnVzYiA9IE5VTEw7CisJCXVwKCZkZXYtPnNsb3QtPm11dGV4KTsKKwkJZGV2LT5zbG90ID0gTlVMTDsKKwl9CisJdXNiX3NldF9pbnRmZGF0YShpbnRlcmZhY2UsIE5VTEwpOworCXVwKCZkdDk4MTJfbXV0ZXgpOworCisJLyogcXVldWUgZmluYWwgZGVzdHJ1Y3Rpb24gKi8KKwlrcmVmX3B1dCgmZGV2LT5rcmVmLCBkdDk4MTJfZGVsZXRlKTsKKworCWRldl9pbmZvKCZpbnRlcmZhY2UtPmRldiwgIlVTQiBEdDk4MTIgIyVkIG5vdyBkaXNjb25uZWN0ZWRcbiIsIG1pbm9yKTsKK30KKworc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIGR0OTgxMl91c2JfZHJpdmVyID0geworCS5uYW1lID0gImR0OTgxMiIsCisJLnByb2JlID0gZHQ5ODEyX3Byb2JlLAorCS5kaXNjb25uZWN0ID0gZHQ5ODEyX2Rpc2Nvbm5lY3QsCisJLmlkX3RhYmxlID0gZHQ5ODEyX3RhYmxlLAorfTsKKworLyoKKyAqIENvbWVkaSBmdW5jdGlvbnMKKyAqLworCitzdGF0aWMgdm9pZCBkdDk4MTJfY29tZWRpX29wZW4oY29tZWRpX2RldmljZSAqZGV2KQoreworCWRvd24oJmRldnByaXYtPnNsb3QtPm11dGV4KTsKKwlpZiAoZGV2cHJpdi0+c2xvdC0+dXNiKSB7CisJCS8qIFdlIGhhdmUgYW4gYXR0YWNoZWQgZGV2aWNlLCBmaWxsIGluIGN1cnJlbnQgcmFuZ2UgaW5mbyAqLworCQljb21lZGlfc3ViZGV2aWNlICpzOworCisJCXMgPSAmZGV2LT5zdWJkZXZpY2VzWzBdOworCQlzLT5uX2NoYW4gPSA4OworCQlzLT5tYXhkYXRhID0gMTsKKworCQlzID0gJmRldi0+c3ViZGV2aWNlc1sxXTsKKwkJcy0+bl9jaGFuID0gODsKKwkJcy0+bWF4ZGF0YSA9IDE7CisKKwkJcyA9ICZkZXYtPnN1YmRldmljZXNbMl07CisJCXMtPm5fY2hhbiA9IDg7CisJCXN3aXRjaCAoZGV2cHJpdi0+c2xvdC0+dXNiLT5kZXZpY2UpIHsKKwkJY2FzZSAwOnsKKwkJCQlzLT5tYXhkYXRhID0gNDA5NTsKKwkJCQlzLT5yYW5nZV90YWJsZSA9ICZkdDk4MTJfMTBfYWluX3JhbmdlOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgMTp7CisJCQkJcy0+bWF4ZGF0YSA9IDQwOTU7CisJCQkJcy0+cmFuZ2VfdGFibGUgPSAmZHQ5ODEyXzJwdDVfYWluX3JhbmdlOworCQkJfQorCQkJYnJlYWs7CisJCX0KKworCQlzID0gJmRldi0+c3ViZGV2aWNlc1szXTsKKwkJcy0+bl9jaGFuID0gMjsKKwkJc3dpdGNoIChkZXZwcml2LT5zbG90LT51c2ItPmRldmljZSkgeworCQljYXNlIDA6eworCQkJCXMtPm1heGRhdGEgPSA0MDk1OworCQkJCXMtPnJhbmdlX3RhYmxlID0gJmR0OTgxMl8xMF9hb3V0X3JhbmdlOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgMTp7CisJCQkJcy0+bWF4ZGF0YSA9IDQwOTU7CisJCQkJcy0+cmFuZ2VfdGFibGUgPSAmZHQ5ODEyXzJwdDVfYW91dF9yYW5nZTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJfQorCXVwKCZkZXZwcml2LT5zbG90LT5tdXRleCk7Cit9CisKK3N0YXRpYyBpbnQgZHQ5ODEyX2RpX3JpbnNuKGNvbWVkaV9kZXZpY2UgKmRldiwgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCSAgIGNvbWVkaV9pbnNuICppbnNuLCBsc2FtcGxfdCAqZGF0YSkKK3sKKwlpbnQgbjsKKwl1OCBiaXRzID0gMDsKKworCWR0OTgxMl9kaWdpdGFsX2luKGRldnByaXYtPnNsb3QsICZiaXRzKTsKKwlmb3IgKG4gPSAwOyBuIDwgaW5zbi0+bjsgbisrKQorCQlkYXRhW25dID0gKCgxIDw8IGluc24tPmNoYW5zcGVjKSAmIGJpdHMpICE9IDA7CisJcmV0dXJuIG47Cit9CisKK3N0YXRpYyBpbnQgZHQ5ODEyX2RvX3dpbnNuKGNvbWVkaV9kZXZpY2UgKmRldiwgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCSAgIGNvbWVkaV9pbnNuICppbnNuLCBsc2FtcGxfdCAqZGF0YSkKK3sKKwlpbnQgbjsKKwl1OCBiaXRzID0gMDsKKworCWR0OTgxMl9kaWdpdGFsX291dF9zaGFkb3coZGV2cHJpdi0+c2xvdCwgJmJpdHMpOworCWZvciAobiA9IDA7IG4gPCBpbnNuLT5uOyBuKyspIHsKKwkJdTggbWFzayA9IDEgPDwgaW5zbi0+Y2hhbnNwZWM7CisKKwkJYml0cyAmPSB+bWFzazsKKwkJaWYgKGRhdGFbbl0pCisJCQliaXRzIHw9IG1hc2s7CisJfQorCWR0OTgxMl9kaWdpdGFsX291dChkZXZwcml2LT5zbG90LCBiaXRzKTsKKwlyZXR1cm4gbjsKK30KKworc3RhdGljIGludCBkdDk4MTJfYWlfcmluc24oY29tZWRpX2RldmljZSAqZGV2LCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJICAgY29tZWRpX2luc24gKmluc24sIGxzYW1wbF90ICpkYXRhKQoreworCWludCBuOworCisJZm9yIChuID0gMDsgbiA8IGluc24tPm47IG4rKykgeworCQl1MTYgdmFsdWUgPSAwOworCisJCWR0OTgxMl9hbmFsb2dfaW4oZGV2cHJpdi0+c2xvdCwgaW5zbi0+Y2hhbnNwZWMsICZ2YWx1ZSwKKwkJCQkgRFQ5ODEyX0dBSU5fMSk7CisJCWRhdGFbbl0gPSB2YWx1ZTsKKwl9CisJcmV0dXJuIG47Cit9CisKK3N0YXRpYyBpbnQgZHQ5ODEyX2FvX3JpbnNuKGNvbWVkaV9kZXZpY2UgKmRldiwgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCSAgIGNvbWVkaV9pbnNuICppbnNuLCBsc2FtcGxfdCAqZGF0YSkKK3sKKwlpbnQgbjsKKwl1MTYgdmFsdWU7CisKKwlmb3IgKG4gPSAwOyBuIDwgaW5zbi0+bjsgbisrKSB7CisJCXZhbHVlID0gMDsKKwkJZHQ5ODEyX2FuYWxvZ19vdXRfc2hhZG93KGRldnByaXYtPnNsb3QsIGluc24tPmNoYW5zcGVjLCAmdmFsdWUpOworCQlkYXRhW25dID0gdmFsdWU7CisJfQorCXJldHVybiBuOworfQorCitzdGF0aWMgaW50IGR0OTgxMl9hb193aW5zbihjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkgICBjb21lZGlfaW5zbiAqaW5zbiwgbHNhbXBsX3QgKmRhdGEpCit7CisJaW50IG47CisKKwlmb3IgKG4gPSAwOyBuIDwgaW5zbi0+bjsgbisrKQorCQlkdDk4MTJfYW5hbG9nX291dChkZXZwcml2LT5zbG90LCBpbnNuLT5jaGFuc3BlYywgZGF0YVtuXSk7CisJcmV0dXJuIG47Cit9CisKK3N0YXRpYyBpbnQgZHQ5ODEyX2F0dGFjaChjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9kZXZjb25maWcgKml0KQoreworCWludCBpOworCWNvbWVkaV9zdWJkZXZpY2UgKnM7CisKKwlkZXYtPmJvYXJkX25hbWUgPSAiZHQ5ODEyIjsKKworCWlmIChhbGxvY19wcml2YXRlKGRldiwgc2l6ZW9mKHN0cnVjdCBjb21lZGlfZHQ5ODEyKSkgPCAwKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qCisJICogU3BlY2lhbCBvcGVuIHJvdXRpbmUsIHNpbmNlIFVTQiB1bml0IG1heSBiZSB1bmF0dGFjaGVkIGF0CisJICogY29tZWRpX2NvbmZpZyB0aW1lLCBoZW5jZSByYW5nZSBjYW4gbm90IGJlIGRldGVybWluZWQKKwkgKi8KKwlkZXYtPm9wZW4gPSBkdDk4MTJfY29tZWRpX29wZW47CisKKwlkZXZwcml2LT5zZXJpYWwgPSBpdC0+b3B0aW9uc1swXTsKKworCS8qIEFsbG9jYXRlIHN1YmRldmljZXMgKi8KKwlpZiAoYWxsb2Nfc3ViZGV2aWNlcyhkZXYsIDQpIDwgMCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKiBkaWdpdGFsIGlucHV0IHN1YmRldmljZSAqLworCXMgPSBkZXYtPnN1YmRldmljZXMgKyAwOworCXMtPnR5cGUgPSBDT01FRElfU1VCRF9ESTsKKwlzLT5zdWJkZXZfZmxhZ3MgPSBTREZfUkVBREFCTEU7CisJcy0+bl9jaGFuID0gMDsKKwlzLT5tYXhkYXRhID0gMTsKKwlzLT5yYW5nZV90YWJsZSA9ICZyYW5nZV9kaWdpdGFsOworCXMtPmluc25fcmVhZCA9ICZkdDk4MTJfZGlfcmluc247CisKKwkvKiBkaWdpdGFsIG91dHB1dCBzdWJkZXZpY2UgKi8KKwlzID0gZGV2LT5zdWJkZXZpY2VzICsgMTsKKwlzLT50eXBlID0gQ09NRURJX1NVQkRfRE87CisJcy0+c3ViZGV2X2ZsYWdzID0gU0RGX1dSSVRFQUJMRTsKKwlzLT5uX2NoYW4gPSAwOworCXMtPm1heGRhdGEgPSAxOworCXMtPnJhbmdlX3RhYmxlID0gJnJhbmdlX2RpZ2l0YWw7CisJcy0+aW5zbl93cml0ZSA9ICZkdDk4MTJfZG9fd2luc247CisKKwkvKiBhbmFsb2cgaW5wdXQgc3ViZGV2aWNlICovCisJcyA9IGRldi0+c3ViZGV2aWNlcyArIDI7CisJcy0+dHlwZSA9IENPTUVESV9TVUJEX0FJOworCXMtPnN1YmRldl9mbGFncyA9IFNERl9SRUFEQUJMRSB8IFNERl9HUk9VTkQ7CisJcy0+bl9jaGFuID0gMDsKKwlzLT5tYXhkYXRhID0gMTsKKwlzLT5yYW5nZV90YWJsZSA9IE5VTEw7CisJcy0+aW5zbl9yZWFkID0gJmR0OTgxMl9haV9yaW5zbjsKKworCS8qIGFuYWxvZyBvdXRwdXQgc3ViZGV2aWNlICovCisJcyA9IGRldi0+c3ViZGV2aWNlcyArIDM7CisJcy0+dHlwZSA9IENPTUVESV9TVUJEX0FPOworCXMtPnN1YmRldl9mbGFncyA9IFNERl9XUklURUFCTEU7CisJcy0+bl9jaGFuID0gMDsKKwlzLT5tYXhkYXRhID0gMTsKKwlzLT5yYW5nZV90YWJsZSA9IE5VTEw7CisJcy0+aW5zbl93cml0ZSA9ICZkdDk4MTJfYW9fd2luc247CisJcy0+aW5zbl9yZWFkID0gJmR0OTgxMl9hb19yaW5zbjsKKworCXByaW50ayhLRVJOX0lORk8gImNvbWVkaSVkOiBzdWNjZXNzZnVsbHkgYXR0YWNoZWQgdG8gZHQ5ODEyLlxuIiwKKwkgICAgICAgZGV2LT5taW5vcik7CisKKwlkb3duKCZkdDk4MTJfbXV0ZXgpOworCS8qIEZpbmQgYSBzbG90IGZvciB0aGUgY29tZWRpIGRldmljZSAqLworCXsKKwkJc3RydWN0IHNsb3RfZHQ5ODEyICpmaXJzdCA9IE5VTEw7CisJCXN0cnVjdCBzbG90X2R0OTgxMiAqYmVzdCA9IE5VTEw7CisJCWZvciAoaSA9IDA7IGkgPCBEVDk4MTJfTlVNX1NMT1RTOyBpKyspIHsKKwkJCWlmICghZmlyc3QgJiYgIWR0OTgxMltpXS5jb21lZGkpIHsKKwkJCQkvKiBGaXJzdCBmcmVlIHNsb3QgZnJvbSBjb21lZGkgc2lkZSAqLworCQkJCWZpcnN0ID0gJmR0OTgxMltpXTsKKwkJCX0KKwkJCWlmICghYmVzdCAmJgorCQkJICAgIGR0OTgxMltpXS51c2IgJiYKKwkJCSAgICBkdDk4MTJbaV0udXNiLT5zZXJpYWwgPT0gZGV2cHJpdi0+c2VyaWFsKSB7CisJCQkJLyogV2UgaGF2ZSBhbiBhdHRhY2VkIGRldmljZSB3aXRoIG1hdGNoaW5nIElEICovCisJCQkJYmVzdCA9ICZkdDk4MTJbaV07CisJCQl9CisJCX0KKwkJaWYgKCFiZXN0KQorCQkJYmVzdCA9IGZpcnN0OworCQlpZiAoYmVzdCkgeworCQkJZG93bigmYmVzdC0+bXV0ZXgpOworCQkJYmVzdC0+Y29tZWRpID0gZGV2cHJpdjsKKwkJCWJlc3QtPnNlcmlhbCA9IGRldnByaXYtPnNlcmlhbDsKKwkJCWRldnByaXYtPnNsb3QgPSBiZXN0OworCQkJdXAoJmJlc3QtPm11dGV4KTsKKwkJfQorCX0KKwl1cCgmZHQ5ODEyX211dGV4KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGR0OTgxMl9kZXRhY2goY29tZWRpX2RldmljZSAqZGV2KQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgY29tZWRpX2RyaXZlciBkdDk4MTJfY29tZWRpX2RyaXZlciA9IHsKKwkubW9kdWxlID0gVEhJU19NT0RVTEUsCisJLmRyaXZlcl9uYW1lID0gImR0OTgxMiIsCisJLmF0dGFjaCA9IGR0OTgxMl9hdHRhY2gsCisJLmRldGFjaCA9IGR0OTgxMl9kZXRhY2gsCit9OworCitzdGF0aWMgaW50IF9faW5pdCB1c2JfZHQ5ODEyX2luaXQodm9pZCkKK3sKKwlpbnQgcmVzdWx0LCBpOworCisJLyogSW5pdGlhbGl6ZSBhbGwgZHJpdmVyIHNsb3RzICovCisJZm9yIChpID0gMDsgaSA8IERUOTgxMl9OVU1fU0xPVFM7IGkrKykgeworCQlpbml0X01VVEVYKCZkdDk4MTJbaV0ubXV0ZXgpOworCQlkdDk4MTJbaV0uc2VyaWFsID0gMDsKKwkJZHQ5ODEyW2ldLnVzYiA9IE5VTEw7CisJCWR0OTgxMltpXS5jb21lZGkgPSBOVUxMOworCX0KKwlkdDk4MTJbMTJdLnNlcmlhbCA9IDB4MDsKKworCS8qIHJlZ2lzdGVyIHdpdGggdGhlIFVTQiBzdWJzeXN0ZW0gKi8KKwlyZXN1bHQgPSB1c2JfcmVnaXN0ZXIoJmR0OTgxMl91c2JfZHJpdmVyKTsKKwlpZiAocmVzdWx0KSB7CisJCXByaW50ayhLRVJOX0VSUiBLQlVJTERfTU9ETkFNRQorCQkgICAgICAgIjogdXNiX3JlZ2lzdGVyIGZhaWxlZC4gRXJyb3IgbnVtYmVyICVkXG4iLCByZXN1bHQpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKwkvKiByZWdpc3RlciB3aXRoIGNvbWVkaSAqLworCXJlc3VsdCA9IGNvbWVkaV9kcml2ZXJfcmVnaXN0ZXIoJmR0OTgxMl9jb21lZGlfZHJpdmVyKTsKKwlpZiAocmVzdWx0KSB7CisJCXVzYl9kZXJlZ2lzdGVyKCZkdDk4MTJfdXNiX2RyaXZlcik7CisJCWVycigiY29tZWRpX2RyaXZlcl9yZWdpc3RlciBmYWlsZWQuIEVycm9yIG51bWJlciAlZCIsIHJlc3VsdCk7CisJfQorCisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHVzYl9kdDk4MTJfZXhpdCh2b2lkKQoreworCS8qIHVucmVnaXN0ZXIgd2l0aCBjb21lZGkgKi8KKwljb21lZGlfZHJpdmVyX3VucmVnaXN0ZXIoJmR0OTgxMl9jb21lZGlfZHJpdmVyKTsKKworCS8qIGRlcmVnaXN0ZXIgdGhpcyBkcml2ZXIgd2l0aCB0aGUgVVNCIHN1YnN5c3RlbSAqLworCXVzYl9kZXJlZ2lzdGVyKCZkdDk4MTJfdXNiX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHVzYl9kdDk4MTJfaW5pdCk7Cittb2R1bGVfZXhpdCh1c2JfZHQ5ODEyX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJBbmRlcnMgQmxvbWRlbGwgPGFuZGVycy5ibG9tZGVsbEBjb250cm9sLmx0aC5zZT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQ29tZWRpIERUOTgxMiBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9pY3BfbXVsdGkuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9pY3BfbXVsdGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTE0NGQ3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2ljcF9tdWx0aS5jCkBAIC0wLDAgKzEsMTA4NSBAQAorLyoKKyAgICBjb21lZGkvZHJpdmVycy9pY3BfbXVsdGkuYworCisgICAgQ09NRURJIC0gTGludXggQ29udHJvbCBhbmQgTWVhc3VyZW1lbnQgRGV2aWNlIEludGVyZmFjZQorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDAyIERhdmlkIEEuIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyovCisKKy8qCitEcml2ZXI6IGljcF9tdWx0aQorRGVzY3JpcHRpb246IElub3ZhIElDUF9NVUxUSQorQXV0aG9yOiBBbm5lIFNtb3J0aGl0IDxhbm5lLnNtb3J0aGl0QHNmd3RlLmNoPgorRGV2aWNlczogW0lub3ZhXSBJQ1BfTVVMVEkgKGljcF9tdWx0aSkKK1N0YXR1czogd29ya3MKKworVGhlIGRyaXZlciB3b3JrcyBmb3IgYW5hbG9nIGlucHV0IGFuZCBvdXRwdXQgYW5kIGRpZ2l0YWwgaW5wdXQgYW5kIG91dHB1dC4KK0l0IGRvZXMgbm90IHdvcmsgd2l0aCBpbnRlcnJ1cHRzIG9yIHdpdGggdGhlIGNvdW50ZXJzLiAgQ3VycmVudGx5IG5vIHN1cHBvcnQKK2ZvciBETUEuCisKK0l0IGhhcyAxNiBzaW5nbGUtZW5kZWQgb3IgOCBkaWZmZXJlbnRpYWwgQW5hbG9ndWUgSW5wdXQgY2hhbm5lbHMgd2l0aCAxMi1iaXQKK3Jlc29sdXRpb24uICBSYW5nZXMgOiA1ViwgMTBWLCArLy01ViwgKy8tMTBWLCAwLi4yMG1BIGFuZCA0Li4yMG1BLiAgSW5wdXQKK3JhbmdlcyBjYW4gYmUgaW5kaXZpZHVhbGx5IHByb2dyYW1tZWQgZm9yIGVhY2ggY2hhbm5lbC4gIFZvbHRhZ2Ugb3IgY3VycmVudAorbWVhc3VyZW1lbnQgaXMgc2VsZWN0ZWQgYnkganVtcGVyLgorCitUaGVyZSBhcmUgNCB4IDEyLWJpdCBBbmFsb2d1ZSBPdXRwdXRzLiAgUmFuZ2VzIDogNVYsIDEwViwgKy8tNVYsICsvLTEwVgorCisxNiB4IERpZ2l0YWwgSW5wdXRzLCAyNFYKKworOCB4IERpZ2l0YWwgT3V0cHV0cywgMjRWLCAxQQorCis0IHggMTYtYml0IGNvdW50ZXJzCisKK09wdGlvbnM6CisgWzBdIC0gUENJIGJ1cyBudW1iZXIgLSBpZiBidXMgbnVtYmVyIGFuZCBzbG90IG51bWJlciBhcmUgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoZW4gZHJpdmVyIHNlYXJjaCBmb3IgZmlyc3QgdW51c2VkIGNhcmQKKyBbMV0gLSBQQ0kgc2xvdCBudW1iZXIKKyovCisKKyNpbmNsdWRlICIuLi9jb21lZGlkZXYuaCIKKworI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisKKyNpbmNsdWRlICJpY3BfbXVsdGkuaCIKKworI2RlZmluZSBERVZJQ0VfSUQJMHg4MDAwCS8qIERldmljZSBJRCAqLworCisjZGVmaW5lIElDUF9NVUxUSV9FWFRERUJVRworCisvLyBIYXJkd2FyZSB0eXBlcyBvZiB0aGUgY2FyZHMKKyNkZWZpbmUgVFlQRV9JQ1BfTVVMVEkJMAorCisjZGVmaW5lIElPUkFOR0VfSUNQX01VTFRJIAkzMgorCisjZGVmaW5lIElDUF9NVUxUSV9BRENfQ1NSCTAJLyogUi9XOiBBREMgY29tbWFuZC9zdGF0dXMgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgSUNQX01VTFRJX0FJCQkyCS8qIFI6ICAgQW5hbG9ndWUgaW5wdXQgZGF0YSAqLworI2RlZmluZSBJQ1BfTVVMVElfREFDX0NTUgk0CS8qIFIvVzogREFDIGNvbW1hbmQvc3RhdHVzIHJlZ2lzdGVyICovCisjZGVmaW5lIElDUF9NVUxUSV9BTwkJNgkvKiBSL1c6IEFuYWxvZ3VlIG91dHB1dCBkYXRhICovCisjZGVmaW5lIElDUF9NVUxUSV9ESQkJOAkvKiBSL1c6IERpZ2l0YWwgaW5vdXRzICovCisjZGVmaW5lIElDUF9NVUxUSV9ETwkJMHgwQQkvKiBSL1c6IERpZ2l0YWwgb3V0cHV0cyAqLworI2RlZmluZSBJQ1BfTVVMVElfSU5UX0VOCTB4MEMJLyogUi9XOiBJbnRlcnJ1cHQgZW5hYmxlIHJlZ2lzdGVyICovCisjZGVmaW5lIElDUF9NVUxUSV9JTlRfU1RBVAkweDBFCS8qIFIvVzogSW50ZXJydXB0IHN0YXR1cyByZWdpc3RlciAqLworI2RlZmluZSBJQ1BfTVVMVElfQ05UUjAJCTB4MTAJLyogUi9XOiBDb3VudGVyIDAgKi8KKyNkZWZpbmUgSUNQX01VTFRJX0NOVFIxCQkweDEyCS8qIFIvVzogY291bnRlciAxICovCisjZGVmaW5lIElDUF9NVUxUSV9DTlRSMgkJMHgxNAkvKiBSL1c6IENvdW50ZXIgMiAqLworI2RlZmluZSBJQ1BfTVVMVElfQ05UUjMJCTB4MTYJLyogUi9XOiBDb3VudGVyIDMgKi8KKworI2RlZmluZSBJQ1BfTVVMVElfU0laRQkJMHgyMAkvKiAzMiBieXRlcyAqLworCisvLyBEZWZpbmUgYml0cyBmcm9tIEFEQyBjb21tYW5kL3N0YXR1cyByZWdpc3RlcgorI2RlZmluZQlBRENfU1QJCTB4MDAwMQkvKiBTdGFydCBBREMgKi8KKyNkZWZpbmUJQURDX0JTWQkJMHgwMDAxCS8qIEFEQyBidXN5ICovCisjZGVmaW5lIEFEQ19CSQkJMHgwMDEwCS8qIEJpcG9sYXIgaW5wdXQgcmFuZ2UgMSA9IGJpcG9sYXIgKi8KKyNkZWZpbmUgQURDX1JBCQkweDAwMjAJLyogSW5wdXQgcmFuZ2UgMCA9IDVWLCAxID0gMTBWICovCisjZGVmaW5lCUFEQ19ESQkJMHgwMDQwCS8qIERpZmZlcmVudGlhbCBpbnB1dCBtb2RlIDEgPSBkaWZmZXJlbnRpYWwgKi8KKworLy8gRGVmaW5lIGJpdHMgZnJvbSBEQUMgY29tbWFuZC9zdGF0dXMgcmVnaXN0ZXIKKyNkZWZpbmUJREFDX1NUCQkweDAwMDEJLyogU3RhcnQgREFDICovCisjZGVmaW5lIERBQ19CU1kJCTB4MDAwMQkvKiBEQUMgYnVzeSAqLworI2RlZmluZQlEQUNfQkkJCTB4MDAxMAkvKiBCaXBvbGFyIGlucHV0IHJhbmdlIDEgPSBiaXBvbGFyICovCisjZGVmaW5lCURBQ19SQQkJMHgwMDIwCS8qIElucHV0IHJhbmdlIDAgPSA1ViwgMSA9IDEwViAqLworCisvLyBEZWZpbmUgYml0cyBmcm9tIGludGVycnVwdCBlbmFibGUvc3RhdHVzIHJlZ2lzdGVycworI2RlZmluZQlBRENfUkVBRFkJMHgwMDAxCS8qIEEvZCBjb252ZXJzaW9uIHJlYWR5IGludGVycnVwdCAqLworI2RlZmluZQlEQUNfUkVBRFkJMHgwMDAyCS8qIEQvYSBjb252ZXJzaW9uIHJlYWR5IGludGVycnVwdCAqLworI2RlZmluZQlET1VUX0VSUk9SCTB4MDAwNAkvKiBEaWdpdGFsIG91dHB1dCBlcnJvciBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUJRElOX1NUQVRVUwkweDAwMDgJLyogRGlnaXRhbCBpbnB1dCBzdGF0dXMgY2hhbmdlIGludGVycnVwdCAqLworI2RlZmluZQlDSUUwCQkweDAwMTAJLyogQ291bnRlciAwIG92ZXJydW4gaW50ZXJydXB0ICovCisjZGVmaW5lCUNJRTEJCTB4MDAyMAkvKiBDb3VudGVyIDEgb3ZlcnJ1biBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUJQ0lFMgkJMHgwMDQwCS8qIENvdW50ZXIgMiBvdmVycnVuIGludGVycnVwdCAqLworI2RlZmluZQlDSUUzCQkweDAwODAJLyogQ291bnRlciAzIG92ZXJydW4gaW50ZXJydXB0ICovCisKKy8vIFVzZWZ1bCBkZWZpbml0aW9ucworI2RlZmluZQlTdGF0dXNfSVJRCTB4MDBmZgkvLyBBbGwgaW50ZXJydXB0cworCisvLyBEZWZpbmUgYW5hbG9ndWUgcmFuZ2UKK3N0YXRpYyBjb25zdCBjb21lZGlfbHJhbmdlIHJhbmdlX2FuYWxvZyA9IHsgNCwgeworCQkJVU5JX1JBTkdFKDUpLAorCQkJVU5JX1JBTkdFKDEwKSwKKwkJCUJJUF9SQU5HRSg1KSwKKwkJCUJJUF9SQU5HRSgxMCkKKwl9Cit9OworCitzdGF0aWMgY29uc3QgY2hhciByYW5nZV9jb2Rlc19hbmFsb2dbXSA9IHsgMHgwMCwgMHgyMCwgMHgxMCwgMHgzMCB9OworCisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRm9yd2FyZCBkZWNsYXJhdGlvbnMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK3N0YXRpYyBpbnQgaWNwX211bHRpX2F0dGFjaChjb21lZGlfZGV2aWNlICogZGV2LCBjb21lZGlfZGV2Y29uZmlnICogaXQpOworc3RhdGljIGludCBpY3BfbXVsdGlfZGV0YWNoKGNvbWVkaV9kZXZpY2UgKiBkZXYpOworCisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGF0YSAmIFN0cnVjdHVyZSBkZWNsYXJhdGlvbnMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBwY2lfbGlzdF9idWlsZGVkID0gMDsJLyo+MCBsaXN0IG9mIGNhcmQgaXMga25vd24gKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworCWNvbnN0IGNoYXIgKm5hbWU7CS8vIGRyaXZlciBuYW1lCisJaW50IGRldmljZV9pZDsKKwlpbnQgaW9yYW5nZTsJCS8vIEkvTyByYW5nZSBsZW4KKwljaGFyIGhhdmVfaXJxOwkJLy8gMT1jYXJkIHN1cHBvcnQgSVJRCisJY2hhciBjYXJkdHlwZTsJCS8vIDA9SUNQIE11bHRpCisJaW50IG5fYWljaGFuOwkJLy8gbnVtIG9mIEEvRCBjaGFucworCWludCBuX2FpY2hhbmQ7CQkvLyBudW0gb2YgQS9EIGNoYW5zIGluIGRpZmYgbW9kZQorCWludCBuX2FvY2hhbjsJCS8vIG51bSBvZiBEL0EgY2hhbnMKKwlpbnQgbl9kaWNoYW47CQkvLyBudW0gb2YgREkgY2hhbnMKKwlpbnQgbl9kb2NoYW47CQkvLyBudW0gb2YgRE8gY2hhbnMKKwlpbnQgbl9jdHJzOwkJLy8gbnVtIG9mIGNvdW50ZXJzCisJaW50IGFpX21heGRhdGE7CQkvLyByZXNvbHV0aW9uIG9mIEEvRAorCWludCBhb19tYXhkYXRhOwkJLy8gcmVzb2x1dGlvbiBvZiBEL0EKKwljb25zdCBjb21lZGlfbHJhbmdlICpyYW5nZWxpc3RfYWk7CS8vIHJhbmdlbGlzdCBmb3IgQS9ECisJY29uc3QgY2hhciAqcmFuZ2Vjb2RlOwkvLyByYW5nZSBjb2RlcyBmb3IgcHJvZ3JhbW1pbmcKKwljb25zdCBjb21lZGlfbHJhbmdlICpyYW5nZWxpc3RfYW87CS8vIHJhbmdlbGlzdCBmb3IgRC9BCit9IGJvYXJkdHlwZTsKKworc3RhdGljIGNvbnN0IGJvYXJkdHlwZSBib2FyZHR5cGVzW10gPSB7CisJeyJpY3BfbXVsdGkiLAkJLy8gRHJpdmVyIG5hbWUKKwkJCURFVklDRV9JRCwJLy8gUENJIGRldmljZSBJRAorCQkJSU9SQU5HRV9JQ1BfTVVMVEksCS8vIEkvTyByYW5nZSBsZW5ndGgKKwkJCTEsCS8vIDE9Q2FyZCBzdXBwb3J0cyBpbnRlcnJ1cHRzCisJCQlUWVBFX0lDUF9NVUxUSSwJLy8gQ2FyZCB0eXBlID0gSUNQIE1VTFRJCisJCQkxNiwJLy8gTnVtIG9mIEEvRCBjaGFubmVscworCQkJOCwJLy8gTnVtIG9mIEEvRCBjaGFubmVscyBpbiBkaWZmIG1vZGUKKwkJCTQsCS8vIE51bSBvZiBEL0EgY2hhbm5lbHMKKwkJCTE2LAkvLyBOdW0gb2YgZGlnaXRhbCBpbnB1dHMKKwkJCTgsCS8vIE51bSBvZiBkaWdpdGFsIG91dHB1dHMKKwkJCTQsCS8vIE51bSBvZiBjb3VudGVycworCQkJMHgwZmZmLAkvLyBSZXNvbHV0aW9uIG9mIEEvRAorCQkJMHgwZmZmLAkvLyBSZXNvbHV0aW9uIG9mIEQvQQorCQkJJnJhbmdlX2FuYWxvZywJLy8gUmFuZ2VsaXN0IGZvciBBL0QKKwkJCXJhbmdlX2NvZGVzX2FuYWxvZywJLy8gUmFuZ2UgY29kZXMgZm9yIHByb2dyYW1taW5nCisJCSZyYW5nZV9hbmFsb2d9LAkvLyBSYW5nZWxpc3QgZm9yIEQvQQorfTsKKworI2RlZmluZSBuX2JvYXJkdHlwZXMgKHNpemVvZihib2FyZHR5cGVzKS9zaXplb2YoYm9hcmR0eXBlKSkKKworc3RhdGljIGNvbWVkaV9kcml2ZXIgZHJpdmVyX2ljcF9tdWx0aSA9IHsKKyAgICAgIGRyaXZlcl9uYW1lOiJpY3BfbXVsdGkiLAorICAgICAgbW9kdWxlOlRISVNfTU9EVUxFLAorICAgICAgYXR0YWNoOmljcF9tdWx0aV9hdHRhY2gsCisgICAgICBkZXRhY2g6aWNwX211bHRpX2RldGFjaCwKKyAgICAgIG51bV9uYW1lczpuX2JvYXJkdHlwZXMsCisgICAgICBib2FyZF9uYW1lOiZib2FyZHR5cGVzWzBdLm5hbWUsCisgICAgICBvZmZzZXQ6c2l6ZW9mKGJvYXJkdHlwZSksCit9OworCitDT01FRElfSU5JVENMRUFOVVAoZHJpdmVyX2ljcF9tdWx0aSk7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlzdHJ1Y3QgcGNpbHN0X3N0cnVjdCAqY2FyZDsJLy8gcG9pbnRlciB0byBjYXJkCisJY2hhciB2YWxpZDsJCS8vIGNhcmQgaXMgdXNhYmxlCisJdm9pZCAqaW9fYWRkcjsJCS8vIFBvaW50ZXIgdG8gbWFwcGVkIGlvIGFkZHJlc3MKKwlyZXNvdXJjZV9zaXplX3QgcGh5c19pb2Jhc2U7CS8vIFBoeXNpY2FsIGlvIGFkZHJlc3MKKwl1bnNpZ25lZCBpbnQgQWRjQ21kU3RhdHVzOwkvLyBBREMgQ29tbWFuZC9TdGF0dXMgcmVnaXN0ZXIKKwl1bnNpZ25lZCBpbnQgRGFjQ21kU3RhdHVzOwkvLyBEQUMgQ29tbWFuZC9TdGF0dXMgcmVnaXN0ZXIKKwl1bnNpZ25lZCBpbnQgSW50RW5hYmxlOwkvLyBJbnRlcnJ1cHQgRW5hYmxlIHJlZ2lzdGVyCisJdW5zaWduZWQgaW50IEludFN0YXR1czsJLy8gSW50ZXJydXB0IFN0YXR1cyByZWdpc3RlcgorCXVuc2lnbmVkIGludCBhY3RfY2hhbmxpc3RbMzJdOwkvLyBsaXN0IG9mIHNjYW5lZCBjaGFubmVsCisJdW5zaWduZWQgY2hhciBhY3RfY2hhbmxpc3RfbGVuOwkvLyBsZW4gb2Ygc2Nhbmxpc3QKKwl1bnNpZ25lZCBjaGFyIGFjdF9jaGFubGlzdF9wb3M7CS8vIGFjdHVhbCBwb3NpdGlvbiBpbiBNVVggbGlzdAorCXVuc2lnbmVkIGludCAqYWlfY2hhbmxpc3Q7CS8vIGFjdGF1bCBjaGFubGlzdAorCXNhbXBsX3QgKmFpX2RhdGE7CS8vIGRhdGEgYnVmZmVyCisJc2FtcGxfdCBhb19kYXRhWzRdOwkvLyBkYXRhIG91dHB1dCBidWZmZXIKKwlzYW1wbF90IGRpX2RhdGE7CS8vIERpZ2l0YWwgaW5wdXQgZGF0YQorCXVuc2lnbmVkIGludCBkb19kYXRhOwkvLyBSZW1lbWJlciBkaWdpdGFsIG91dHB1dCBkYXRhCit9IGljcF9tdWx0aV9wcml2YXRlOworCisjZGVmaW5lIGRldnByaXYgKChpY3BfbXVsdGlfcHJpdmF0ZSAqKWRldi0+cHJpdmF0ZSkKKyNkZWZpbmUgdGhpc19ib2FyZCAoKGNvbnN0IGJvYXJkdHlwZSAqKWRldi0+Ym9hcmRfcHRyKQorCisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJTW9yZSBmb3J3YXJkIGRlY2xhcmF0aW9ucworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworCisjaWYgMAorc3RhdGljIGludCBjaGVja19jaGFubmVsX2xpc3QoY29tZWRpX2RldmljZSAqIGRldiwgY29tZWRpX3N1YmRldmljZSAqIHMsCisJdW5zaWduZWQgaW50ICpjaGFubGlzdCwgdW5zaWduZWQgaW50IG5fY2hhbik7CisjZW5kaWYKK3N0YXRpYyB2b2lkIHNldHVwX2NoYW5uZWxfbGlzdChjb21lZGlfZGV2aWNlICogZGV2LCBjb21lZGlfc3ViZGV2aWNlICogcywKKwl1bnNpZ25lZCBpbnQgKmNoYW5saXN0LCB1bnNpZ25lZCBpbnQgbl9jaGFuKTsKK3N0YXRpYyBpbnQgaWNwX211bHRpX3Jlc2V0KGNvbWVkaV9kZXZpY2UgKiBkZXYpOworCisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRnVuY3Rpb25zCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCisKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCU5hbWU6CWljcF9tdWx0aV9pbnNuX3JlYWRfYWkKKworCURlc2NyaXB0aW9uOgorCQlUaGlzIGZ1bmN0aW9uIHJlYWRzIGEgc2luZ2xlIGFuYWxvZ3VlIGlucHV0LgorCisJUGFyYW1ldGVyczoKKwkJY29tZWRpX2RldmljZSAqZGV2CVBvaW50ZXIgdG8gY3VycmVudCBkZXZpY2Ugc3RydWN0dXJlCisJCWNvbWVkaV9zdWJkZXZpY2UgKnMJUG9pbnRlciB0byBjdXJyZW50IHN1YmRldmljZSBzdHJ1Y3R1cmUKKwkJY29tZWRpX2luc24gKmluc24JUG9pbnRlciB0byBjdXJyZW50IGNvbWVkaSBpbnN0cnVjdGlvbgorCQlsc2FtcGxfdCAqZGF0YQkJUG9pbnRlciB0byBhbmFsb2d1ZSBpbnB1dCBkYXRhCisKKwlSZXR1cm5zOmludAkJCU5tdWJlciBvZiBpbnN0cnVjdGlvbnMgZXhlY3V0ZWQKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworc3RhdGljIGludCBpY3BfbXVsdGlfaW5zbl9yZWFkX2FpKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKiBzLAorCWNvbWVkaV9pbnNuICogaW5zbiwgbHNhbXBsX3QgKiBkYXRhKQoreworCWludCBuLCB0aW1lb3V0OworCisjaWZkZWYgSUNQX01VTFRJX0VYVERFQlVHCisJcHJpbnRrKCJpY3AgbXVsdGkgRURCRzogQkdOOiBpY3BfbXVsdGlfaW5zbl9yZWFkX2FpKC4uLilcbiIpOworI2VuZGlmCisJLy8gRGlzYWJsZSBBL0QgY29udmVyc2lvbiByZWFkeSBpbnRlcnJ1cHQKKwlkZXZwcml2LT5JbnRFbmFibGUgJj0gfkFEQ19SRUFEWTsKKwl3cml0ZXcoZGV2cHJpdi0+SW50RW5hYmxlLCBkZXZwcml2LT5pb19hZGRyICsgSUNQX01VTFRJX0lOVF9FTik7CisKKwkvLyBDbGVhciBpbnRlcnJ1cHQgc3RhdHVzCisJZGV2cHJpdi0+SW50U3RhdHVzIHw9IEFEQ19SRUFEWTsKKwl3cml0ZXcoZGV2cHJpdi0+SW50U3RhdHVzLCBkZXZwcml2LT5pb19hZGRyICsgSUNQX01VTFRJX0lOVF9TVEFUKTsKKworCS8vIFNldCB1cCBhcHByb3ByaWF0ZSBjaGFubmVsLCBtb2RlIGFuZCByYW5nZSBkYXRhLCBmb3Igc3BlY2lmaWVkIGNoYW5uZWwKKwlzZXR1cF9jaGFubmVsX2xpc3QoZGV2LCBzLCAmaW5zbi0+Y2hhbnNwZWMsIDEpOworCisjaWZkZWYgSUNQX01VTFRJX0VYVERFQlVHCisJcHJpbnRrKCJpY3BfbXVsdGkgQSBTVD0lNHggSU89JXBcbiIsCisJCXJlYWR3KGRldnByaXYtPmlvX2FkZHIgKyBJQ1BfTVVMVElfQURDX0NTUiksCisJCWRldnByaXYtPmlvX2FkZHIgKyBJQ1BfTVVMVElfQURDX0NTUik7CisjZW5kaWYKKworCWZvciAobiA9IDA7IG4gPCBpbnNuLT5uOyBuKyspIHsKKwkJLy8gU2V0IHN0YXJ0IEFEQyBiaXQKKwkJZGV2cHJpdi0+QWRjQ21kU3RhdHVzIHw9IEFEQ19TVDsKKwkJd3JpdGV3KGRldnByaXYtPkFkY0NtZFN0YXR1cywKKwkJCWRldnByaXYtPmlvX2FkZHIgKyBJQ1BfTVVMVElfQURDX0NTUik7CisJCWRldnByaXYtPkFkY0NtZFN0YXR1cyAmPSB+QURDX1NUOworCisjaWZkZWYgSUNQX01VTFRJX0VYVERFQlVHCisJCXByaW50aygiaWNwIG11bHRpIEIgbj0lZCBTVD0lNHhcbiIsIG4sCisJCQlyZWFkdyhkZXZwcml2LT5pb19hZGRyICsgSUNQX01VTFRJX0FEQ19DU1IpKTsKKyNlbmRpZgorCisJCWNvbWVkaV91ZGVsYXkoMSk7CisKKyNpZmRlZiBJQ1BfTVVMVElfRVhUREVCVUcKKwkJcHJpbnRrKCJpY3AgbXVsdGkgQyBuPSVkIFNUPSU0eFxuIiwgbiwKKwkJCXJlYWR3KGRldnByaXYtPmlvX2FkZHIgKyBJQ1BfTVVMVElfQURDX0NTUikpOworI2VuZGlmCisKKwkJLy8gV2FpdCBmb3IgY29udmVyc2lvbiB0byBjb21wbGV0ZSwgb3IgZ2V0IGZlZCB1cCB3YWl0aW5nCisJCXRpbWVvdXQgPSAxMDA7CisJCXdoaWxlICh0aW1lb3V0LS0pIHsKKwkJCWlmICghKHJlYWR3KGRldnByaXYtPmlvX2FkZHIgKworCQkJCQkJSUNQX01VTFRJX0FEQ19DU1IpICYgQURDX0JTWSkpCisJCQkJZ290byBjb252X2ZpbmlzaDsKKworI2lmZGVmIElDUF9NVUxUSV9FWFRERUJVRworCQkJaWYgKCEodGltZW91dCAlIDEwKSkKKwkJCQlwcmludGsoImljcCBtdWx0aSBEIG49JWQgdG09JWQgU1Q9JTR4XG4iLCBuLAorCQkJCQl0aW1lb3V0LAorCQkJCQlyZWFkdyhkZXZwcml2LT5pb19hZGRyICsKKwkJCQkJCUlDUF9NVUxUSV9BRENfQ1NSKSk7CisjZW5kaWYKKworCQkJY29tZWRpX3VkZWxheSgxKTsKKwkJfQorCisJCS8vIElmIHdlIHJlYWNoIGhlcmUsIGEgdGltZW91dCBoYXMgb2NjdXJyZWQKKwkJY29tZWRpX2Vycm9yKGRldiwgIkEvRCBpbnNuIHRpbWVvdXQiKTsKKworCQkvLyBEaXNhYmxlIGludGVycnVwdAorCQlkZXZwcml2LT5JbnRFbmFibGUgJj0gfkFEQ19SRUFEWTsKKwkJd3JpdGV3KGRldnByaXYtPkludEVuYWJsZSwgZGV2cHJpdi0+aW9fYWRkciArIElDUF9NVUxUSV9JTlRfRU4pOworCisJCS8vIENsZWFyIGludGVycnVwdCBzdGF0dXMKKwkJZGV2cHJpdi0+SW50U3RhdHVzIHw9IEFEQ19SRUFEWTsKKwkJd3JpdGV3KGRldnByaXYtPkludFN0YXR1cywKKwkJCWRldnByaXYtPmlvX2FkZHIgKyBJQ1BfTVVMVElfSU5UX1NUQVQpOworCisJCS8vIENsZWFyIGRhdGEgcmVjZWl2ZWQKKwkJZGF0YVtuXSA9IDA7CisKKyNpZmRlZiBJQ1BfTVVMVElfRVhUREVCVUcKKwkJcHJpbnRrKCJpY3AgbXVsdGkgRURCRzogRU5EOiBpY3BfbXVsdGlfaW5zbl9yZWFkX2FpKC4uLikgbj0lZFxuIiwgbik7CisjZW5kaWYKKwkJcmV0dXJuIC1FVElNRTsKKworCSAgICAgIGNvbnZfZmluaXNoOgorCQlkYXRhW25dID0KKwkJCShyZWFkdyhkZXZwcml2LT5pb19hZGRyICsgSUNQX01VTFRJX0FJKSA+PiA0KSAmIDB4MGZmZjsKKwl9CisKKwkvLyBEaXNhYmxlIGludGVycnVwdAorCWRldnByaXYtPkludEVuYWJsZSAmPSB+QURDX1JFQURZOworCXdyaXRldyhkZXZwcml2LT5JbnRFbmFibGUsIGRldnByaXYtPmlvX2FkZHIgKyBJQ1BfTVVMVElfSU5UX0VOKTsKKworCS8vIENsZWFyIGludGVycnVwdCBzdGF0dXMKKwlkZXZwcml2LT5JbnRTdGF0dXMgfD0gQURDX1JFQURZOworCXdyaXRldyhkZXZwcml2LT5JbnRTdGF0dXMsIGRldnByaXYtPmlvX2FkZHIgKyBJQ1BfTVVMVElfSU5UX1NUQVQpOworCisjaWZkZWYgSUNQX01VTFRJX0VYVERFQlVHCisJcHJpbnRrKCJpY3AgbXVsdGkgRURCRzogRU5EOiBpY3BfbXVsdGlfaW5zbl9yZWFkX2FpKC4uLikgbj0lZFxuIiwgbik7CisjZW5kaWYKKwlyZXR1cm4gbjsKK30KKworLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJTmFtZToJaWNwX211bHRpX2luc25fd3JpdGVfYW8KKworCURlc2NyaXB0aW9uOgorCQlUaGlzIGZ1bmN0aW9uIHdyaXRlcyBhIHNpbmdsZSBhbmFsb2d1ZSBvdXRwdXQuCisKKwlQYXJhbWV0ZXJzOgorCQljb21lZGlfZGV2aWNlICpkZXYJUG9pbnRlciB0byBjdXJyZW50IGRldmljZSBzdHJ1Y3R1cmUKKwkJY29tZWRpX3N1YmRldmljZSAqcwlQb2ludGVyIHRvIGN1cnJlbnQgc3ViZGV2aWNlIHN0cnVjdHVyZQorCQljb21lZGlfaW5zbiAqaW5zbglQb2ludGVyIHRvIGN1cnJlbnQgY29tZWRpIGluc3RydWN0aW9uCisJCWxzYW1wbF90ICpkYXRhCQlQb2ludGVyIHRvIGFuYWxvZ3VlIG91dHB1dCBkYXRhCisKKwlSZXR1cm5zOmludAkJCU5tdWJlciBvZiBpbnN0cnVjdGlvbnMgZXhlY3V0ZWQKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworc3RhdGljIGludCBpY3BfbXVsdGlfaW5zbl93cml0ZV9hbyhjb21lZGlfZGV2aWNlICogZGV2LCBjb21lZGlfc3ViZGV2aWNlICogcywKKwljb21lZGlfaW5zbiAqIGluc24sIGxzYW1wbF90ICogZGF0YSkKK3sKKwlpbnQgbiwgY2hhbiwgcmFuZ2UsIHRpbWVvdXQ7CisKKyNpZmRlZiBJQ1BfTVVMVElfRVhUREVCVUcKKwlwcmludGsoImljcCBtdWx0aSBFREJHOiBCR046IGljcF9tdWx0aV9pbnNuX3dyaXRlX2FvKC4uLilcbiIpOworI2VuZGlmCisJLy8gRGlzYWJsZSBEL0EgY29udmVyc2lvbiByZWFkeSBpbnRlcnJ1cHQKKwlkZXZwcml2LT5JbnRFbmFibGUgJj0gfkRBQ19SRUFEWTsKKwl3cml0ZXcoZGV2cHJpdi0+SW50RW5hYmxlLCBkZXZwcml2LT5pb19hZGRyICsgSUNQX01VTFRJX0lOVF9FTik7CisKKwkvLyBDbGVhciBpbnRlcnJ1cHQgc3RhdHVzCisJZGV2cHJpdi0+SW50U3RhdHVzIHw9IERBQ19SRUFEWTsKKwl3cml0ZXcoZGV2cHJpdi0+SW50U3RhdHVzLCBkZXZwcml2LT5pb19hZGRyICsgSUNQX01VTFRJX0lOVF9TVEFUKTsKKworCS8vIEdldCBjaGFubmVsIG51bWJlciBhbmQgcmFuZ2UKKwljaGFuID0gQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyk7CisJcmFuZ2UgPSBDUl9SQU5HRShpbnNuLT5jaGFuc3BlYyk7CisKKwkvLyBTZXQgdXAgcmFuZ2UgYW5kIGNoYW5uZWwgZGF0YQorCS8vIEJpdCA0ID0gMSA6IEJpcG9sYXIKKwkvLyBCaXQgNSA9IDAgOiA1VgorCS8vIEJpdCA1ID0gMSA6IDEwVgorCS8vIEJpdHMgOC05IDogQ2hhbm5lbCBudW1iZXIKKwlkZXZwcml2LT5EYWNDbWRTdGF0dXMgJj0gMHhmY2NmOworCWRldnByaXYtPkRhY0NtZFN0YXR1cyB8PSB0aGlzX2JvYXJkLT5yYW5nZWNvZGVbcmFuZ2VdOworCWRldnByaXYtPkRhY0NtZFN0YXR1cyB8PSAoY2hhbiA8PCA4KTsKKworCXdyaXRldyhkZXZwcml2LT5EYWNDbWRTdGF0dXMsIGRldnByaXYtPmlvX2FkZHIgKyBJQ1BfTVVMVElfREFDX0NTUik7CisKKwlmb3IgKG4gPSAwOyBuIDwgaW5zbi0+bjsgbisrKSB7CisJCS8vIFdhaXQgZm9yIGFuYWxvZ3VlIG91dHB1dCBkYXRhIHJlZ2lzdGVyIHRvIGJlIHJlYWR5IGZvciBuZXcgZGF0YSwgb3IgZ2V0IGZlZCB1cCB3YWl0aW5nCisJCXRpbWVvdXQgPSAxMDA7CisJCXdoaWxlICh0aW1lb3V0LS0pIHsKKwkJCWlmICghKHJlYWR3KGRldnByaXYtPmlvX2FkZHIgKworCQkJCQkJSUNQX01VTFRJX0RBQ19DU1IpICYgREFDX0JTWSkpCisJCQkJZ290byBkYWNfcmVhZHk7CisKKyNpZmRlZiBJQ1BfTVVMVElfRVhUREVCVUcKKwkJCWlmICghKHRpbWVvdXQgJSAxMCkpCisJCQkJcHJpbnRrKCJpY3AgbXVsdGkgQSBuPSVkIHRtPSVkIFNUPSU0eFxuIiwgbiwKKwkJCQkJdGltZW91dCwKKwkJCQkJcmVhZHcoZGV2cHJpdi0+aW9fYWRkciArCisJCQkJCQlJQ1BfTVVMVElfREFDX0NTUikpOworI2VuZGlmCisKKwkJCWNvbWVkaV91ZGVsYXkoMSk7CisJCX0KKworCQkvLyBJZiB3ZSByZWFjaCBoZXJlLCBhIHRpbWVvdXQgaGFzIG9jY3VycmVkCisJCWNvbWVkaV9lcnJvcihkZXYsICJEL0EgaW5zbiB0aW1lb3V0Iik7CisKKwkJLy8gRGlzYWJsZSBpbnRlcnJ1cHQKKwkJZGV2cHJpdi0+SW50RW5hYmxlICY9IH5EQUNfUkVBRFk7CisJCXdyaXRldyhkZXZwcml2LT5JbnRFbmFibGUsIGRldnByaXYtPmlvX2FkZHIgKyBJQ1BfTVVMVElfSU5UX0VOKTsKKworCQkvLyBDbGVhciBpbnRlcnJ1cHQgc3RhdHVzCisJCWRldnByaXYtPkludFN0YXR1cyB8PSBEQUNfUkVBRFk7CisJCXdyaXRldyhkZXZwcml2LT5JbnRTdGF0dXMsCisJCQlkZXZwcml2LT5pb19hZGRyICsgSUNQX01VTFRJX0lOVF9TVEFUKTsKKworCQkvLyBDbGVhciBkYXRhIHJlY2VpdmVkCisJCWRldnByaXYtPmFvX2RhdGFbY2hhbl0gPSAwOworCisjaWZkZWYgSUNQX01VTFRJX0VYVERFQlVHCisJCXByaW50aygiaWNwIG11bHRpIEVEQkc6IEVORDogaWNwX211bHRpX2luc25fd3JpdGVfYW8oLi4uKSBuPSVkXG4iLCBuKTsKKyNlbmRpZgorCQlyZXR1cm4gLUVUSU1FOworCisJICAgICAgZGFjX3JlYWR5OgorCQkvLyBXcml0ZSBkYXRhIHRvIGFuYWxvZ3VlIG91dHB1dCBkYXRhIHJlZ2lzdGVyCisJCXdyaXRldyhkYXRhW25dLCBkZXZwcml2LT5pb19hZGRyICsgSUNQX01VTFRJX0FPKTsKKworCQkvLyBTZXQgREFDX1NUIGJpdCB0byB3cml0ZSB0aGUgZGF0YSB0byBzZWxlY3RlZCBjaGFubmVsCisJCWRldnByaXYtPkRhY0NtZFN0YXR1cyB8PSBEQUNfU1Q7CisJCXdyaXRldyhkZXZwcml2LT5EYWNDbWRTdGF0dXMsCisJCQlkZXZwcml2LT5pb19hZGRyICsgSUNQX01VTFRJX0RBQ19DU1IpOworCQlkZXZwcml2LT5EYWNDbWRTdGF0dXMgJj0gfkRBQ19TVDsKKworCQkvLyBTYXZlIGFuYWxvZ3VlIG91dHB1dCBkYXRhCisJCWRldnByaXYtPmFvX2RhdGFbY2hhbl0gPSBkYXRhW25dOworCX0KKworI2lmZGVmIElDUF9NVUxUSV9FWFRERUJVRworCXByaW50aygiaWNwIG11bHRpIEVEQkc6IEVORDogaWNwX211bHRpX2luc25fd3JpdGVfYW8oLi4uKSBuPSVkXG4iLCBuKTsKKyNlbmRpZgorCXJldHVybiBuOworfQorCisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlOYW1lOglpY3BfbXVsdGlfaW5zbl9yZWFkX2FvCisKKwlEZXNjcmlwdGlvbjoKKwkJVGhpcyBmdW5jdGlvbiByZWFkcyBhIHNpbmdsZSBhbmFsb2d1ZSBvdXRwdXQuCisKKwlQYXJhbWV0ZXJzOgorCQljb21lZGlfZGV2aWNlICpkZXYJUG9pbnRlciB0byBjdXJyZW50IGRldmljZSBzdHJ1Y3R1cmUKKwkJY29tZWRpX3N1YmRldmljZSAqcwlQb2ludGVyIHRvIGN1cnJlbnQgc3ViZGV2aWNlIHN0cnVjdHVyZQorCQljb21lZGlfaW5zbiAqaW5zbglQb2ludGVyIHRvIGN1cnJlbnQgY29tZWRpIGluc3RydWN0aW9uCisJCWxzYW1wbF90ICpkYXRhCQlQb2ludGVyIHRvIGFuYWxvZ3VlIG91dHB1dCBkYXRhCisKKwlSZXR1cm5zOmludAkJCU5tdWJlciBvZiBpbnN0cnVjdGlvbnMgZXhlY3V0ZWQKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworc3RhdGljIGludCBpY3BfbXVsdGlfaW5zbl9yZWFkX2FvKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKiBzLAorCWNvbWVkaV9pbnNuICogaW5zbiwgbHNhbXBsX3QgKiBkYXRhKQoreworCWludCBuLCBjaGFuOworCisJLy8gR2V0IGNoYW5uZWwgbnVtYmVyCisJY2hhbiA9IENSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpOworCisJLy8gUmVhZCBhbmFsb2d1ZSBvdXRwdXRzCisJZm9yIChuID0gMDsgbiA8IGluc24tPm47IG4rKykKKwkJZGF0YVtuXSA9IGRldnByaXYtPmFvX2RhdGFbY2hhbl07CisKKwlyZXR1cm4gbjsKK30KKworLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJTmFtZToJaWNwX211bHRpX2luc25fYml0c19kaQorCisJRGVzY3JpcHRpb246CisJCVRoaXMgZnVuY3Rpb24gcmVhZHMgdGhlIGRpZ2l0YWwgaW5wdXRzLgorCisJUGFyYW1ldGVyczoKKwkJY29tZWRpX2RldmljZSAqZGV2CVBvaW50ZXIgdG8gY3VycmVudCBkZXZpY2Ugc3RydWN0dXJlCisJCWNvbWVkaV9zdWJkZXZpY2UgKnMJUG9pbnRlciB0byBjdXJyZW50IHN1YmRldmljZSBzdHJ1Y3R1cmUKKwkJY29tZWRpX2luc24gKmluc24JUG9pbnRlciB0byBjdXJyZW50IGNvbWVkaSBpbnN0cnVjdGlvbgorCQlsc2FtcGxfdCAqZGF0YQkJUG9pbnRlciB0byBhbmFsb2d1ZSBvdXRwdXQgZGF0YQorCisJUmV0dXJuczppbnQJCQlObXViZXIgb2YgaW5zdHJ1Y3Rpb25zIGV4ZWN1dGVkCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK3N0YXRpYyBpbnQgaWNwX211bHRpX2luc25fYml0c19kaShjb21lZGlfZGV2aWNlICogZGV2LCBjb21lZGlfc3ViZGV2aWNlICogcywKKwljb21lZGlfaW5zbiAqIGluc24sIGxzYW1wbF90ICogZGF0YSkKK3sKKwlkYXRhWzFdID0gcmVhZHcoZGV2cHJpdi0+aW9fYWRkciArIElDUF9NVUxUSV9ESSk7CisKKwlyZXR1cm4gMjsKK30KKworLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJTmFtZToJaWNwX211bHRpX2luc25fYml0c19kbworCisJRGVzY3JpcHRpb246CisJCVRoaXMgZnVuY3Rpb24gd3JpdGVzIHRoZSBhcHByb3ByaWF0ZSBkaWdpdGFsIG91dHB1dHMuCisKKwlQYXJhbWV0ZXJzOgorCQljb21lZGlfZGV2aWNlICpkZXYJUG9pbnRlciB0byBjdXJyZW50IGRldmljZSBzdHJ1Y3R1cmUKKwkJY29tZWRpX3N1YmRldmljZSAqcwlQb2ludGVyIHRvIGN1cnJlbnQgc3ViZGV2aWNlIHN0cnVjdHVyZQorCQljb21lZGlfaW5zbiAqaW5zbglQb2ludGVyIHRvIGN1cnJlbnQgY29tZWRpIGluc3RydWN0aW9uCisJCWxzYW1wbF90ICpkYXRhCQlQb2ludGVyIHRvIGFuYWxvZ3VlIG91dHB1dCBkYXRhCisKKwlSZXR1cm5zOmludAkJCU5tdWJlciBvZiBpbnN0cnVjdGlvbnMgZXhlY3V0ZWQKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworc3RhdGljIGludCBpY3BfbXVsdGlfaW5zbl9iaXRzX2RvKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKiBzLAorCWNvbWVkaV9pbnNuICogaW5zbiwgbHNhbXBsX3QgKiBkYXRhKQoreworI2lmZGVmIElDUF9NVUxUSV9FWFRERUJVRworCXByaW50aygiaWNwIG11bHRpIEVEQkc6IEJHTjogaWNwX211bHRpX2luc25fYml0c19kbyguLi4pXG4iKTsKKyNlbmRpZgorCisJaWYgKGRhdGFbMF0pIHsKKwkJcy0+c3RhdGUgJj0gfmRhdGFbMF07CisJCXMtPnN0YXRlIHw9IChkYXRhWzBdICYgZGF0YVsxXSk7CisKKwkJcHJpbnRrKCJEaWdpdGFsIG91dHB1dHMgPSAlNHggXG4iLCBzLT5zdGF0ZSk7CisKKwkJd3JpdGV3KHMtPnN0YXRlLCBkZXZwcml2LT5pb19hZGRyICsgSUNQX01VTFRJX0RPKTsKKwl9CisKKwlkYXRhWzFdID0gcmVhZHcoZGV2cHJpdi0+aW9fYWRkciArIElDUF9NVUxUSV9ESSk7CisKKyNpZmRlZiBJQ1BfTVVMVElfRVhUREVCVUcKKwlwcmludGsoImljcCBtdWx0aSBFREJHOiBFTkQ6IGljcF9tdWx0aV9pbnNuX2JpdHNfZG8oLi4uKVxuIik7CisjZW5kaWYKKwlyZXR1cm4gMjsKK30KKworLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJTmFtZToJaWNwX211bHRpX2luc25fcmVhZF9jdHIKKworCURlc2NyaXB0aW9uOgorCQlUaGlzIGZ1bmN0aW9uIHJlYWRzIHRoZSBzcGVjaWZpZWQgY291bnRlci4KKworCVBhcmFtZXRlcnM6CisJCWNvbWVkaV9kZXZpY2UgKmRldglQb2ludGVyIHRvIGN1cnJlbnQgZGV2aWNlIHN0cnVjdHVyZQorCQljb21lZGlfc3ViZGV2aWNlICpzCVBvaW50ZXIgdG8gY3VycmVudCBzdWJkZXZpY2Ugc3RydWN0dXJlCisJCWNvbWVkaV9pbnNuICppbnNuCVBvaW50ZXIgdG8gY3VycmVudCBjb21lZGkgaW5zdHJ1Y3Rpb24KKwkJbHNhbXBsX3QgKmRhdGEJCVBvaW50ZXIgdG8gY291bnRlciBkYXRhCisKKwlSZXR1cm5zOmludAkJCU5tdWJlciBvZiBpbnN0cnVjdGlvbnMgZXhlY3V0ZWQKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworc3RhdGljIGludCBpY3BfbXVsdGlfaW5zbl9yZWFkX2N0cihjb21lZGlfZGV2aWNlICogZGV2LCBjb21lZGlfc3ViZGV2aWNlICogcywKKwljb21lZGlfaW5zbiAqIGluc24sIGxzYW1wbF90ICogZGF0YSkKK3sKKwlyZXR1cm4gMDsKK30KKworLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJTmFtZToJaWNwX211bHRpX2luc25fd3JpdGVfY3RyCisKKwlEZXNjcmlwdGlvbjoKKwkJVGhpcyBmdW5jdGlvbiB3cml0ZSB0byB0aGUgc3BlY2lmaWVkIGNvdW50ZXIuCisKKwlQYXJhbWV0ZXJzOgorCQljb21lZGlfZGV2aWNlICpkZXYJUG9pbnRlciB0byBjdXJyZW50IGRldmljZSBzdHJ1Y3R1cmUKKwkJY29tZWRpX3N1YmRldmljZSAqcwlQb2ludGVyIHRvIGN1cnJlbnQgc3ViZGV2aWNlIHN0cnVjdHVyZQorCQljb21lZGlfaW5zbiAqaW5zbglQb2ludGVyIHRvIGN1cnJlbnQgY29tZWRpIGluc3RydWN0aW9uCisJCWxzYW1wbF90ICpkYXRhCQlQb2ludGVyIHRvIGNvdW50ZXIgZGF0YQorCisJUmV0dXJuczppbnQJCQlObXViZXIgb2YgaW5zdHJ1Y3Rpb25zIGV4ZWN1dGVkCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK3N0YXRpYyBpbnQgaWNwX211bHRpX2luc25fd3JpdGVfY3RyKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKiBzLAorCWNvbWVkaV9pbnNuICogaW5zbiwgbHNhbXBsX3QgKiBkYXRhKQoreworCXJldHVybiAwOworfQorCisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlOYW1lOglpbnRlcnJ1cHRfc2VydmljZV9pY3BfbXVsdGkKKworCURlc2NyaXB0aW9uOgorCQlUaGlzIGZ1bmN0aW9uIGlzIHRoZSBpbnRlcnJ1cHQgc2VydmljZSByb3V0aW5lIGZvciBhbGwKKwkJaW50ZXJydXB0cyBnZW5lcmF0ZWQgYnkgdGhlIGljcCBtdWx0aSBib2FyZC4KKworCVBhcmFtZXRlcnM6CisJCWludCBpcnEKKwkJdm9pZCAqZAkJCVBvaW50ZXIgdG8gY3VycmVudCBkZXZpY2UKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworc3RhdGljIGlycXJldHVybl90IGludGVycnVwdF9zZXJ2aWNlX2ljcF9tdWx0aShpbnQgaXJxLCB2b2lkICpkIFBUX1JFR1NfQVJHKQoreworCWNvbWVkaV9kZXZpY2UgKmRldiA9IGQ7CisJaW50IGludF9ubzsKKworI2lmZGVmIElDUF9NVUxUSV9FWFRERUJVRworCXByaW50aygiaWNwIG11bHRpIEVEQkc6IEJHTjogaW50ZXJydXB0X3NlcnZpY2VfaWNwX211bHRpKCVkLC4uLilcbiIsCisJCWlycSk7CisjZW5kaWYKKworCS8vIElzIHRoaXMgaW50ZXJydXB0IGZyb20gb3VyIGJvYXJkPworCWludF9ubyA9IHJlYWR3KGRldnByaXYtPmlvX2FkZHIgKyBJQ1BfTVVMVElfSU5UX1NUQVQpICYgU3RhdHVzX0lSUTsKKwlpZiAoIWludF9ubykKKwkJLy8gTm8sIGV4aXQKKwkJcmV0dXJuIElSUV9OT05FOworCisjaWZkZWYgSUNQX01VTFRJX0VYVERFQlVHCisJcHJpbnRrKCJpY3AgbXVsdGkgRURCRzogaW50ZXJydXB0X3NlcnZpY2VfaWNwX211bHRpKCkgU1Q6ICU0eFxuIiwKKwkJcmVhZHcoZGV2cHJpdi0+aW9fYWRkciArIElDUF9NVUxUSV9JTlRfU1RBVCkpOworI2VuZGlmCisKKwkvLyBEZXRlcm1pbmUgd2hpY2ggaW50ZXJydXB0IGlzIGFjdGl2ZSAmIGhhbmRsZSBpdAorCXN3aXRjaCAoaW50X25vKSB7CisJY2FzZSBBRENfUkVBRFk6CisJCWJyZWFrOworCWNhc2UgREFDX1JFQURZOgorCQlicmVhazsKKwljYXNlIERPVVRfRVJST1I6CisJCWJyZWFrOworCWNhc2UgRElOX1NUQVRVUzoKKwkJYnJlYWs7CisJY2FzZSBDSUUwOgorCQlicmVhazsKKwljYXNlIENJRTE6CisJCWJyZWFrOworCWNhc2UgQ0lFMjoKKwkJYnJlYWs7CisJY2FzZSBDSUUzOgorCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKworCX0KKworI2lmZGVmIElDUF9NVUxUSV9FWFRERUJVRworCXByaW50aygiaWNwIG11bHRpIEVEQkc6IEVORDogaW50ZXJydXB0X3NlcnZpY2VfaWNwX211bHRpKC4uLilcbiIpOworI2VuZGlmCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisjaWYgMAorLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJTmFtZToJY2hlY2tfY2hhbm5lbF9saXN0CisKKwlEZXNjcmlwdGlvbjoKKwkJVGhpcyBmdW5jdGlvbiBjaGVja3MgaWYgdGhlIGNoYW5uZWwgbGlzdCwgcHJvdmlkZWQgYnkgdXNlcgorCQlpcyBidWlsdCBjb3JyZWN0bHkKKworCVBhcmFtZXRlcnM6CisJCWNvbWVkaV9kZXZpY2UgKmRldglQb2ludGVyIHRvIGN1cnJlbnQgc2V2aWNlIHN0cnVjdHVyZQorCQljb21lZGlfc3ViZGV2aWNlICpzCVBvaW50ZXIgdG8gY3VycmVudCBzdWJkZXZpY2Ugc3RydWN0dXJlCisJCXVuc2lnbmVkIGludCAqY2hhbmxpc3QJUG9pbnRlciB0byBwYWNrZWQgY2hhbm5lbCBsaXN0CisJCXVuc2lnbmVkIGludCBuX2NoYW4JTnVtYmVyIG9mIGNoYW5uZWxzIHRvIHNjYW4KKworCVJldHVybnM6aW50IDAgPSBmYWlsdXJlCisJCSAgICAxID0gc3VjY2VzcworCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitzdGF0aWMgaW50IGNoZWNrX2NoYW5uZWxfbGlzdChjb21lZGlfZGV2aWNlICogZGV2LCBjb21lZGlfc3ViZGV2aWNlICogcywKKwl1bnNpZ25lZCBpbnQgKmNoYW5saXN0LCB1bnNpZ25lZCBpbnQgbl9jaGFuKQoreworCXVuc2lnbmVkIGludCBpOworCisjaWZkZWYgSUNQX01VTFRJX0VYVERFQlVHCisJcHJpbnRrKCJpY3AgbXVsdGkgRURCRzogIGNoZWNrX2NoYW5uZWxfbGlzdCguLi4sJWQpXG4iLCBuX2NoYW4pOworI2VuZGlmCisJLy8gQ2hlY2sgdGhhdCB3ZSBhdCBsZWFzdCBoYXZlIG9uZSBjaGFubmVsIHRvIGNoZWNrCisJaWYgKG5fY2hhbiA8IDEpIHsKKwkJY29tZWRpX2Vycm9yKGRldiwgInJhbmdlL2NoYW5uZWwgbGlzdCBpcyBlbXB0eSEiKTsKKwkJcmV0dXJuIDA7CisJfQorCS8vIENoZWNrIGFsbCBjaGFubmVscworCWZvciAoaSA9IDA7IGkgPCBuX2NoYW47IGkrKykgeworCQkvLyBDaGVjayB0aGF0IGNoYW5uZWwgbnVtYmVyIGlzIDwgbWF4aW11bQorCQlpZiAoQ1JfQVJFRihjaGFubGlzdFtpXSkgPT0gQVJFRl9ESUZGKSB7CisJCQlpZiAoQ1JfQ0hBTihjaGFubGlzdFtpXSkgPiB0aGlzX2JvYXJkLT5uX2FpY2hhbmQpIHsKKwkJCQljb21lZGlfZXJyb3IoZGV2LAorCQkJCQkiSW5jb3JyZWN0IGRpZmZlcmVudGlhbCBhaSBjaGFubmVsIG51bWJlciIpOworCQkJCXJldHVybiAwOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKENSX0NIQU4oY2hhbmxpc3RbaV0pID4gdGhpc19ib2FyZC0+bl9haWNoYW4pIHsKKwkJCQljb21lZGlfZXJyb3IoZGV2LAorCQkJCQkiSW5jb3JyZWN0IGFpIGNoYW5uZWwgbnVtYmVyIik7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIDE7Cit9CisjZW5kaWYKKworLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJTmFtZToJc2V0dXBfY2hhbm5lbF9saXN0CisKKwlEZXNjcmlwdGlvbjoKKwkJVGhpcyBmdW5jdGlvbiBzZXRzIHRoZSBhcHByb3ByaWF0ZSBjaGFubmVsIHNlbGVjdGlvbiwKKwkJZGlmZmVyZW50aWFsIGlucHV0IG1vZGUgYW5kIHJhbmdlIGJpdHMgaW4gdGhlIEFEQyBDb21tYW5kLworCQlTdGF0dXMgcmVnaXN0ZXIuCisKKwlQYXJhbWV0ZXJzOgorCQljb21lZGlfZGV2aWNlICpkZXYJUG9pbnRlciB0byBjdXJyZW50IHNldmljZSBzdHJ1Y3R1cmUKKwkJY29tZWRpX3N1YmRldmljZSAqcwlQb2ludGVyIHRvIGN1cnJlbnQgc3ViZGV2aWNlIHN0cnVjdHVyZQorCQl1bnNpZ25lZCBpbnQgKmNoYW5saXN0CVBvaW50ZXIgdG8gcGFja2VkIGNoYW5uZWwgbGlzdAorCQl1bnNpZ25lZCBpbnQgbl9jaGFuCU51bWJlciBvZiBjaGFubmVscyB0byBzY2FuCisKKwlSZXR1cm5zOlZvaWQKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworc3RhdGljIHZvaWQgc2V0dXBfY2hhbm5lbF9saXN0KGNvbWVkaV9kZXZpY2UgKiBkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKiBzLAorCXVuc2lnbmVkIGludCAqY2hhbmxpc3QsIHVuc2lnbmVkIGludCBuX2NoYW4pCit7CisJdW5zaWduZWQgaW50IGksIHJhbmdlLCBjaGFucHJvZzsKKwl1bnNpZ25lZCBpbnQgZGlmZjsKKworI2lmZGVmIElDUF9NVUxUSV9FWFRERUJVRworCXByaW50aygiaWNwIG11bHRpIEVEQkc6ICBzZXR1cF9jaGFubmVsX2xpc3QoLi4uLCVkKVxuIiwgbl9jaGFuKTsKKyNlbmRpZgorCWRldnByaXYtPmFjdF9jaGFubGlzdF9sZW4gPSBuX2NoYW47CisJZGV2cHJpdi0+YWN0X2NoYW5saXN0X3BvcyA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgbl9jaGFuOyBpKyspIHsKKwkJLy8gR2V0IGNoYW5uZWwKKwkJY2hhbnByb2cgPSBDUl9DSEFOKGNoYW5saXN0W2ldKTsKKworCQkvLyBEZXRlcm1pbmUgaWYgaXQgaXMgYSBkaWZmZXJlbnRpYWwgY2hhbm5lbCAoQml0IDE1ICA9IDEpCisJCWlmIChDUl9BUkVGKGNoYW5saXN0W2ldKSA9PSBBUkVGX0RJRkYpIHsKKwkJCWRpZmYgPSAxOworCQkJY2hhbnByb2cgJj0gMHgwMDA3OworCQl9IGVsc2UgeworCQkJZGlmZiA9IDA7CisJCQljaGFucHJvZyAmPSAweDAwMGY7CisJCX0KKworCQkvLyBDbGVhciBjaGFubmVsLCByYW5nZSBhbmQgaW5wdXQgbW9kZSBiaXRzIGluIEEvRCBjb21tYW5kL3N0YXR1cyByZWdpc3RlcgorCQlkZXZwcml2LT5BZGNDbWRTdGF0dXMgJj0gMHhmMDBmOworCisJCS8vIFNldCBjaGFubmVsIG51bWJlciBhbmQgZGlmZmVyZW50aWFsIG1vZGUgc3RhdHVzIGJpdAorCQlpZiAoZGlmZikgeworCQkJLy8gU2V0IGNoYW5uZWwgbnVtYmVyLCBiaXRzIDktMTEgJiBtb2RlLCBiaXQgNgorCQkJZGV2cHJpdi0+QWRjQ21kU3RhdHVzIHw9IChjaGFucHJvZyA8PCA5KTsKKwkJCWRldnByaXYtPkFkY0NtZFN0YXR1cyB8PSBBRENfREk7CisJCX0gZWxzZQorCQkJLy8gU2V0IGNoYW5uZWwgbnVtYmVyLCBiaXRzIDgtMTEKKwkJCWRldnByaXYtPkFkY0NtZFN0YXR1cyB8PSAoY2hhbnByb2cgPDwgOCk7CisKKwkJLy8gR2V0IHJhbmdlIGZvciBjdXJyZW50IGNoYW5uZWwKKwkJcmFuZ2UgPSB0aGlzX2JvYXJkLT5yYW5nZWNvZGVbQ1JfUkFOR0UoY2hhbmxpc3RbaV0pXTsKKwkJLy8gU2V0IHJhbmdlLiBiaXRzIDQtNQorCQlkZXZwcml2LT5BZGNDbWRTdGF0dXMgfD0gcmFuZ2U7CisKKwkJLyogT3V0cHV0IGNoYW5uZWwsIHJhbmdlLCBtb2RlIHRvIElDUCBNdWx0aSAqLworCQl3cml0ZXcoZGV2cHJpdi0+QWRjQ21kU3RhdHVzLAorCQkJZGV2cHJpdi0+aW9fYWRkciArIElDUF9NVUxUSV9BRENfQ1NSKTsKKworI2lmZGVmIElDUF9NVUxUSV9FWFRERUJVRworCQlwcmludGsoIkdTOiAlMmQuIFslNHhdPSU0eCAlNHhcbiIsIGksIGNoYW5wcm9nLCByYW5nZSwKKwkJCWRldnByaXYtPmFjdF9jaGFubGlzdFtpXSk7CisjZW5kaWYKKwl9CisKK30KKworLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJTmFtZToJaWNwX211bHRpX3Jlc2V0CisKKwlEZXNjcmlwdGlvbjoKKwkJVGhpcyBmdW5jdGlvbiByZXNldHMgdGhlIGljcCBtdWx0aSBkZXZpY2UgdG8gYSAnc2FmZScgc3RhdGUKKworCVBhcmFtZXRlcnM6CisJCWNvbWVkaV9kZXZpY2UgKmRldglQb2ludGVyIHRvIGN1cnJlbnQgc2V2aWNlIHN0cnVjdHVyZQorCisJUmV0dXJuczppbnQJMCA9IHN1Y2Nlc3MKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworc3RhdGljIGludCBpY3BfbXVsdGlfcmVzZXQoY29tZWRpX2RldmljZSAqIGRldikKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworI2lmZGVmIElDUF9NVUxUSV9FWFRERUJVRworCXByaW50aygiaWNwX211bHRpIEVEQkc6IEJHTjogaWNwX211bHRpX3Jlc2V0KC4uLilcbiIpOworI2VuZGlmCisJLy8gQ2xlYXIgSU5UIGVuYWJsZXMgYW5kIHJlcXVlc3RzCisJd3JpdGV3KDAsIGRldnByaXYtPmlvX2FkZHIgKyBJQ1BfTVVMVElfSU5UX0VOKTsKKwl3cml0ZXcoMHgwMGZmLCBkZXZwcml2LT5pb19hZGRyICsgSUNQX01VTFRJX0lOVF9TVEFUKTsKKworCWlmICh0aGlzX2JvYXJkLT5uX2FvY2hhbikKKwkJLy8gU2V0IERBQ3MgdG8gMC4uNVYgcmFuZ2UgYW5kIDBWIG91dHB1dAorCQlmb3IgKGkgPSAwOyBpIDwgdGhpc19ib2FyZC0+bl9hb2NoYW47IGkrKykgeworCQkJZGV2cHJpdi0+RGFjQ21kU3RhdHVzICY9IDB4ZmNjZTsKKworCQkJLy8gU2V0IGNoYW5uZWwgbnVtYmVyCisJCQlkZXZwcml2LT5EYWNDbWRTdGF0dXMgfD0gKGkgPDwgOCk7CisKKwkJCS8vIE91dHB1dCAwVgorCQkJd3JpdGV3KDAsIGRldnByaXYtPmlvX2FkZHIgKyBJQ1BfTVVMVElfQU8pOworCisJCQkvLyBTZXQgc3RhcnQgY29udmVyc2lvbiBiaXQKKwkJCWRldnByaXYtPkRhY0NtZFN0YXR1cyB8PSBEQUNfU1Q7CisKKwkJCS8vIE91dHB1dCB0byBjb21tYW5kIC8gc3RhdHVzIHJlZ2lzdGVyCisJCQl3cml0ZXcoZGV2cHJpdi0+RGFjQ21kU3RhdHVzLAorCQkJCWRldnByaXYtPmlvX2FkZHIgKyBJQ1BfTVVMVElfREFDX0NTUik7CisKKwkJCS8vIERlbGF5IHRvIGFsbG93IERBQyB0aW1lIHRvIHJlY292ZXIKKwkJCWNvbWVkaV91ZGVsYXkoMSk7CisJCX0KKwkvLyBEaWdpdGFsIG91dHB1dHMgdG8gMAorCXdyaXRldygwLCBkZXZwcml2LT5pb19hZGRyICsgSUNQX01VTFRJX0RPKTsKKworI2lmZGVmIElDUF9NVUxUSV9FWFRERUJVRworCXByaW50aygiaWNwIG11bHRpIEVEQkc6IEVORDogaWNwX211bHRpX3Jlc2V0KC4uLilcbiIpOworI2VuZGlmCisJcmV0dXJuIDA7Cit9CisKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCU5hbWU6CWljcF9tdWx0aV9hdHRhY2gKKworCURlc2NyaXB0aW9uOgorCQlUaGlzIGZ1bmN0aW9uIHNldHMgdXAgYWxsIHRoZSBhcHByb3ByaWF0ZSBkYXRhIGZvciB0aGUgY3VycmVudAorCQlkZXZpY2UuCisKKwlQYXJhbWV0ZXJzOgorCQljb21lZGlfZGV2aWNlICpkZXYJUG9pbnRlciB0byBjdXJyZW50IGRldmljZSBzdHJ1Y3R1cmUKKwkJY29tZWRpX2RldmNvbmZpZyAqaXQJUG9pbnRlciB0byBjdXJyZW50IGRldmljZSBjb25maWd1cmF0aW9uCisKKwlSZXR1cm5zOmludAkwID0gc3VjY2VzcworCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitzdGF0aWMgaW50IGljcF9tdWx0aV9hdHRhY2goY29tZWRpX2RldmljZSAqIGRldiwgY29tZWRpX2RldmNvbmZpZyAqIGl0KQoreworCWNvbWVkaV9zdWJkZXZpY2UgKnM7CisJaW50IHJldCwgc3ViZGV2LCBuX3N1YmRldmljZXM7CisJdW5zaWduZWQgaW50IGlycTsKKwlzdHJ1Y3QgcGNpbHN0X3N0cnVjdCAqY2FyZCA9IE5VTEw7CisJcmVzb3VyY2Vfc2l6ZV90IGlvX2FkZHJbNV0sIGlvYmFzZTsKKwl1bnNpZ25lZCBjaGFyIHBjaV9idXMsIHBjaV9zbG90LCBwY2lfZnVuYzsKKworCXByaW50aygiaWNwX211bHRpIEVEQkc6IEJHTjogaWNwX211bHRpX2F0dGFjaCguLi4pXG4iKTsKKworCS8vIEFsb2NhdGUgcHJpdmF0ZSBkYXRhIHN0b3JhZ2Ugc3BhY2UKKwlpZiAoKHJldCA9IGFsbG9jX3ByaXZhdGUoZGV2LCBzaXplb2YoaWNwX211bHRpX3ByaXZhdGUpKSkgPCAwKQorCQlyZXR1cm4gcmV0OworCisJLy8gSW5pdGlhbGlzZSBsaXN0IG9mIFBDSSBjYXJkcyBpbiBzeXN0ZW0sIGlmIG5vdCBhbHJlYWR5IGRvbmUgc28KKwlpZiAocGNpX2xpc3RfYnVpbGRlZCsrID09IDApIHsKKwkJcGNpX2NhcmRfbGlzdF9pbml0KFBDSV9WRU5ET1JfSURfSUNQLAorI2lmZGVmIElDUF9NVUxUSV9FWFRERUJVRworCQkJMQorI2Vsc2UKKwkJCTAKKyNlbmRpZgorCQkJKTsKKwl9CisKKwlwcmludGsoIkFubmUncyBjb21lZGklZDogaWNwX211bHRpOiBib2FyZD0lcyIsIGRldi0+bWlub3IsCisJCXRoaXNfYm9hcmQtPm5hbWUpOworCisJaWYgKChjYXJkID0gc2VsZWN0X2FuZF9hbGxvY19wY2lfY2FyZChQQ0lfVkVORE9SX0lEX0lDUCwKKwkJCQl0aGlzX2JvYXJkLT5kZXZpY2VfaWQsIGl0LT5vcHRpb25zWzBdLAorCQkJCWl0LT5vcHRpb25zWzFdKSkgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU87CisKKwlkZXZwcml2LT5jYXJkID0gY2FyZDsKKworCWlmICgocGNpX2NhcmRfZGF0YShjYXJkLCAmcGNpX2J1cywgJnBjaV9zbG90LCAmcGNpX2Z1bmMsICZpb19hZGRyWzBdLAorCQkJCSZpcnEpKSA8IDApIHsKKwkJcHJpbnRrKCIgLSBDYW4ndCBnZXQgY29uZmlndXJhdGlvbiBkYXRhIVxuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCWlvYmFzZSA9IGlvX2FkZHJbMl07CisJZGV2cHJpdi0+cGh5c19pb2Jhc2UgPSBpb2Jhc2U7CisKKwlwcmludGsoIiwgYjpzOmY9JWQ6JWQ6JWQsIGlvPTB4JThsbHggXG4iLCBwY2lfYnVzLCBwY2lfc2xvdCwgcGNpX2Z1bmMsCisJCSh1bnNpZ25lZCBsb25nIGxvbmcpaW9iYXNlKTsKKworCWRldnByaXYtPmlvX2FkZHIgPSBpb3JlbWFwKGlvYmFzZSwgSUNQX01VTFRJX1NJWkUpOworCisJaWYgKGRldnByaXYtPmlvX2FkZHIgPT0gTlVMTCkgeworCQlwcmludGsoImlvcmVtYXAgZmFpbGVkLlxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKyNpZmRlZiBJQ1BfTVVMVElfRVhUREVCVUcKKwlwcmludGsoIjB4JTA4bGx4IG1hcHBlZCB0byAlcCwgIiwgKHVuc2lnbmVkIGxvbmcgbG9uZylpb2Jhc2UsCisJCWRldnByaXYtPmlvX2FkZHIpOworI2VuZGlmCisKKwlkZXYtPmJvYXJkX25hbWUgPSB0aGlzX2JvYXJkLT5uYW1lOworCisJbl9zdWJkZXZpY2VzID0gMDsKKwlpZiAodGhpc19ib2FyZC0+bl9haWNoYW4pCisJCW5fc3ViZGV2aWNlcysrOworCWlmICh0aGlzX2JvYXJkLT5uX2FvY2hhbikKKwkJbl9zdWJkZXZpY2VzKys7CisJaWYgKHRoaXNfYm9hcmQtPm5fZGljaGFuKQorCQluX3N1YmRldmljZXMrKzsKKwlpZiAodGhpc19ib2FyZC0+bl9kb2NoYW4pCisJCW5fc3ViZGV2aWNlcysrOworCWlmICh0aGlzX2JvYXJkLT5uX2N0cnMpCisJCW5fc3ViZGV2aWNlcysrOworCisJaWYgKChyZXQgPSBhbGxvY19zdWJkZXZpY2VzKGRldiwgbl9zdWJkZXZpY2VzKSkgPCAwKSB7CisJCXJldHVybiByZXQ7CisJfQorCisJaWNwX211bHRpX3Jlc2V0KGRldik7CisKKwlpZiAodGhpc19ib2FyZC0+aGF2ZV9pcnEpIHsKKwkJaWYgKGlycSkgeworCQkJaWYgKGNvbWVkaV9yZXF1ZXN0X2lycShpcnEsIGludGVycnVwdF9zZXJ2aWNlX2ljcF9tdWx0aSwKKwkJCQkJSVJRRl9TSEFSRUQsICJJbm92YSBJY3AgTXVsdGkiLCBkZXYpKSB7CisJCQkJcHJpbnRrKCIsIHVuYWJsZSB0byBhbGxvY2F0ZSBJUlEgJXUsIERJU0FCTElORyBJVCIsIGlycSk7CisJCQkJaXJxID0gMDsJLyogQ2FuJ3QgdXNlIElSUSAqLworCQkJfSBlbHNlCisJCQkJcHJpbnRrKCIsIGlycT0ldSIsIGlycSk7CisJCX0gZWxzZQorCQkJcHJpbnRrKCIsIElSUSBkaXNhYmxlZCIpOworCX0gZWxzZQorCQlpcnEgPSAwOworCisJZGV2LT5pcnEgPSBpcnE7CisKKwlwcmludGsoIi5cbiIpOworCisJc3ViZGV2ID0gMDsKKworCWlmICh0aGlzX2JvYXJkLT5uX2FpY2hhbikgeworCQlzID0gZGV2LT5zdWJkZXZpY2VzICsgc3ViZGV2OworCQlkZXYtPnJlYWRfc3ViZGV2ID0gczsKKwkJcy0+dHlwZSA9IENPTUVESV9TVUJEX0FJOworCQlzLT5zdWJkZXZfZmxhZ3MgPSBTREZfUkVBREFCTEUgfCBTREZfQ09NTU9OIHwgU0RGX0dST1VORDsKKwkJaWYgKHRoaXNfYm9hcmQtPm5fYWljaGFuZCkKKwkJCXMtPnN1YmRldl9mbGFncyB8PSBTREZfRElGRjsKKwkJcy0+bl9jaGFuID0gdGhpc19ib2FyZC0+bl9haWNoYW47CisJCXMtPm1heGRhdGEgPSB0aGlzX2JvYXJkLT5haV9tYXhkYXRhOworCQlzLT5sZW5fY2hhbmxpc3QgPSB0aGlzX2JvYXJkLT5uX2FpY2hhbjsKKwkJcy0+cmFuZ2VfdGFibGUgPSB0aGlzX2JvYXJkLT5yYW5nZWxpc3RfYWk7CisJCXMtPmluc25fcmVhZCA9IGljcF9tdWx0aV9pbnNuX3JlYWRfYWk7CisJCXN1YmRldisrOworCX0KKworCWlmICh0aGlzX2JvYXJkLT5uX2FvY2hhbikgeworCQlzID0gZGV2LT5zdWJkZXZpY2VzICsgc3ViZGV2OworCQlzLT50eXBlID0gQ09NRURJX1NVQkRfQU87CisJCXMtPnN1YmRldl9mbGFncyA9IFNERl9XUklUQUJMRSB8IFNERl9HUk9VTkQgfCBTREZfQ09NTU9OOworCQlzLT5uX2NoYW4gPSB0aGlzX2JvYXJkLT5uX2FvY2hhbjsKKwkJcy0+bWF4ZGF0YSA9IHRoaXNfYm9hcmQtPmFvX21heGRhdGE7CisJCXMtPmxlbl9jaGFubGlzdCA9IHRoaXNfYm9hcmQtPm5fYW9jaGFuOworCQlzLT5yYW5nZV90YWJsZSA9IHRoaXNfYm9hcmQtPnJhbmdlbGlzdF9hbzsKKwkJcy0+aW5zbl93cml0ZSA9IGljcF9tdWx0aV9pbnNuX3dyaXRlX2FvOworCQlzLT5pbnNuX3JlYWQgPSBpY3BfbXVsdGlfaW5zbl9yZWFkX2FvOworCQlzdWJkZXYrKzsKKwl9CisKKwlpZiAodGhpc19ib2FyZC0+bl9kaWNoYW4pIHsKKwkJcyA9IGRldi0+c3ViZGV2aWNlcyArIHN1YmRldjsKKwkJcy0+dHlwZSA9IENPTUVESV9TVUJEX0RJOworCQlzLT5zdWJkZXZfZmxhZ3MgPSBTREZfUkVBREFCTEU7CisJCXMtPm5fY2hhbiA9IHRoaXNfYm9hcmQtPm5fZGljaGFuOworCQlzLT5tYXhkYXRhID0gMTsKKwkJcy0+bGVuX2NoYW5saXN0ID0gdGhpc19ib2FyZC0+bl9kaWNoYW47CisJCXMtPnJhbmdlX3RhYmxlID0gJnJhbmdlX2RpZ2l0YWw7CisJCXMtPmlvX2JpdHMgPSAwOworCQlzLT5pbnNuX2JpdHMgPSBpY3BfbXVsdGlfaW5zbl9iaXRzX2RpOworCQlzdWJkZXYrKzsKKwl9CisKKwlpZiAodGhpc19ib2FyZC0+bl9kb2NoYW4pIHsKKwkJcyA9IGRldi0+c3ViZGV2aWNlcyArIHN1YmRldjsKKwkJcy0+dHlwZSA9IENPTUVESV9TVUJEX0RPOworCQlzLT5zdWJkZXZfZmxhZ3MgPSBTREZfV1JJVEFCTEUgfCBTREZfUkVBREFCTEU7CisJCXMtPm5fY2hhbiA9IHRoaXNfYm9hcmQtPm5fZG9jaGFuOworCQlzLT5tYXhkYXRhID0gMTsKKwkJcy0+bGVuX2NoYW5saXN0ID0gdGhpc19ib2FyZC0+bl9kb2NoYW47CisJCXMtPnJhbmdlX3RhYmxlID0gJnJhbmdlX2RpZ2l0YWw7CisJCXMtPmlvX2JpdHMgPSAoMSA8PCB0aGlzX2JvYXJkLT5uX2RvY2hhbikgLSAxOworCQlzLT5zdGF0ZSA9IDA7CisJCXMtPmluc25fYml0cyA9IGljcF9tdWx0aV9pbnNuX2JpdHNfZG87CisJCXN1YmRldisrOworCX0KKworCWlmICh0aGlzX2JvYXJkLT5uX2N0cnMpIHsKKwkJcyA9IGRldi0+c3ViZGV2aWNlcyArIHN1YmRldjsKKwkJcy0+dHlwZSA9IENPTUVESV9TVUJEX0NPVU5URVI7CisJCXMtPnN1YmRldl9mbGFncyA9IFNERl9XUklUQUJMRSB8IFNERl9HUk9VTkQgfCBTREZfQ09NTU9OOworCQlzLT5uX2NoYW4gPSB0aGlzX2JvYXJkLT5uX2N0cnM7CisJCXMtPm1heGRhdGEgPSAweGZmZmY7CisJCXMtPmxlbl9jaGFubGlzdCA9IHRoaXNfYm9hcmQtPm5fY3RyczsKKwkJcy0+c3RhdGUgPSAwOworCQlzLT5pbnNuX3JlYWQgPSBpY3BfbXVsdGlfaW5zbl9yZWFkX2N0cjsKKwkJcy0+aW5zbl93cml0ZSA9IGljcF9tdWx0aV9pbnNuX3dyaXRlX2N0cjsKKwkJc3ViZGV2Kys7CisJfQorCisJZGV2cHJpdi0+dmFsaWQgPSAxOworCisjaWZkZWYgSUNQX01VTFRJX0VYVERFQlVHCisJcHJpbnRrKCJpY3AgbXVsdGkgRURCRzogRU5EOiBpY3BfbXVsdGlfYXR0YWNoKC4uLilcbiIpOworI2VuZGlmCisKKwlyZXR1cm4gMDsKK30KKworLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJTmFtZToJaWNwX211bHRpX2RldGFjaAorCisJRGVzY3JpcHRpb246CisJCVRoaXMgZnVuY3Rpb24gcmVsZWFzZXMgYWxsIHRoZSByZXNvdXJjZXMgdXNlZCBieSB0aGUgY3VycmVudAorCQlkZXZpY2UuCisKKwlQYXJhbWV0ZXJzOgorCQljb21lZGlfZGV2aWNlICpkZXYJUG9pbnRlciB0byBjdXJyZW50IGRldmljZSBzdHJ1Y3R1cmUKKworCVJldHVybnM6aW50CTAgPSBzdWNjZXNzCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK3N0YXRpYyBpbnQgaWNwX211bHRpX2RldGFjaChjb21lZGlfZGV2aWNlICogZGV2KQoreworCisJaWYgKGRldi0+cHJpdmF0ZSkKKwkJaWYgKGRldnByaXYtPnZhbGlkKQorCQkJaWNwX211bHRpX3Jlc2V0KGRldik7CisKKwlpZiAoZGV2LT5pcnEpCisJCWNvbWVkaV9mcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKworCWlmIChkZXYtPnByaXZhdGUgJiYgZGV2cHJpdi0+aW9fYWRkcikKKwkJaW91bm1hcChkZXZwcml2LT5pb19hZGRyKTsKKworCWlmIChkZXYtPnByaXZhdGUgJiYgZGV2cHJpdi0+Y2FyZCkKKwkJcGNpX2NhcmRfZnJlZShkZXZwcml2LT5jYXJkKTsKKworCWlmICgtLXBjaV9saXN0X2J1aWxkZWQgPT0gMCkgeworCQlwY2lfY2FyZF9saXN0X2NsZWFudXAoUENJX1ZFTkRPUl9JRF9JQ1ApOworCX0KKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2ljcF9tdWx0aS5oIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2ljcF9tdWx0aS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkZjRhOGQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvaWNwX211bHRpLmgKQEAgLTAsMCArMSwyNzggQEAKKy8qCisgICAgY29tZWRpL2RyaXZlcnMvaWNwX211bHRpLmgKKworICAgIFN0dWZmIGZvciBJQ1AgTXVsdGkKKworICAgIEF1dGhvcjogQW5uZSBTbW9ydGhpdCA8YW5uZS5zbW9ydGhpdEBzZnd0ZS5jaD4KKworKi8KKworI2lmbmRlZiBfSUNQX01VTFRJX0hfCisjZGVmaW5lIF9JQ1BfTVVMVElfSF8KKworI2luY2x1ZGUgIi4uL2NvbWVkaWRldi5oIgorI2luY2x1ZGUgImNvbWVkaV9wY2kuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0cnVjdCBwY2lsc3Rfc3RydWN0IHsKKwlzdHJ1Y3QgcGNpbHN0X3N0cnVjdCAqbmV4dDsKKwlpbnQgdXNlZDsKKwlzdHJ1Y3QgcGNpX2RldiAqcGNpZGV2OworCXVuc2lnbmVkIHNob3J0IHZlbmRvcjsKKwl1bnNpZ25lZCBzaG9ydCBkZXZpY2U7CisJdW5zaWduZWQgY2hhciBwY2lfYnVzOworCXVuc2lnbmVkIGNoYXIgcGNpX3Nsb3Q7CisJdW5zaWduZWQgY2hhciBwY2lfZnVuYzsKKwlyZXNvdXJjZV9zaXplX3QgaW9fYWRkcls1XTsKKwl1bnNpZ25lZCBpbnQgaXJxOworfTsKKworc3RydWN0IHBjaWxzdF9zdHJ1Y3QgKmlub3ZhX2RldmljZXM7CS8vIHB0ciB0byByb290IGxpc3Qgb2YgYWxsIElub3ZhIGRldmljZXMKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIHBjaV9jYXJkX2xpc3RfaW5pdCh1bnNpZ25lZCBzaG9ydCBwY2lfdmVuZG9yLCBjaGFyIGRpc3BsYXkpOworc3RhdGljIHZvaWQgcGNpX2NhcmRfbGlzdF9jbGVhbnVwKHVuc2lnbmVkIHNob3J0IHBjaV92ZW5kb3IpOworc3RhdGljIHN0cnVjdCBwY2lsc3Rfc3RydWN0ICpmaW5kX2ZyZWVfcGNpX2NhcmRfYnlfZGV2aWNlKHVuc2lnbmVkIHNob3J0CisJdmVuZG9yX2lkLCB1bnNpZ25lZCBzaG9ydCBkZXZpY2VfaWQpOworc3RhdGljIGludCBmaW5kX2ZyZWVfcGNpX2NhcmRfYnlfcG9zaXRpb24odW5zaWduZWQgc2hvcnQgdmVuZG9yX2lkLAorCXVuc2lnbmVkIHNob3J0IGRldmljZV9pZCwgdW5zaWduZWQgc2hvcnQgcGNpX2J1cywKKwl1bnNpZ25lZCBzaG9ydCBwY2lfc2xvdCwgc3RydWN0IHBjaWxzdF9zdHJ1Y3QgKipjYXJkKTsKK3N0YXRpYyBzdHJ1Y3QgcGNpbHN0X3N0cnVjdCAqc2VsZWN0X2FuZF9hbGxvY19wY2lfY2FyZCh1bnNpZ25lZCBzaG9ydCB2ZW5kb3JfaWQsCisJdW5zaWduZWQgc2hvcnQgZGV2aWNlX2lkLCB1bnNpZ25lZCBzaG9ydCBwY2lfYnVzLAorCXVuc2lnbmVkIHNob3J0IHBjaV9zbG90KTsKKworc3RhdGljIGludCBwY2lfY2FyZF9hbGxvYyhzdHJ1Y3QgcGNpbHN0X3N0cnVjdCAqYW1jYyk7CitzdGF0aWMgaW50IHBjaV9jYXJkX2ZyZWUoc3RydWN0IHBjaWxzdF9zdHJ1Y3QgKmFtY2MpOworc3RhdGljIHZvaWQgcGNpX2NhcmRfbGlzdF9kaXNwbGF5KHZvaWQpOworc3RhdGljIGludCBwY2lfY2FyZF9kYXRhKHN0cnVjdCBwY2lsc3Rfc3RydWN0ICphbWNjLAorCXVuc2lnbmVkIGNoYXIgKnBjaV9idXMsIHVuc2lnbmVkIGNoYXIgKnBjaV9zbG90LAorCXVuc2lnbmVkIGNoYXIgKnBjaV9mdW5jLCByZXNvdXJjZV9zaXplX3QgKiBpb19hZGRyLCB1bnNpZ25lZCBpbnQgKmlycSk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBidWlsZCBsaXN0IG9mIElub3ZhIGNhcmRzIGluIHRoaXMgc3lzdGVtICovCitzdGF0aWMgdm9pZCBwY2lfY2FyZF9saXN0X2luaXQodW5zaWduZWQgc2hvcnQgcGNpX3ZlbmRvciwgY2hhciBkaXNwbGF5KQoreworCXN0cnVjdCBwY2lfZGV2ICpwY2lkZXY7CisJc3RydWN0IHBjaWxzdF9zdHJ1Y3QgKmlub3ZhLCAqbGFzdDsKKwlpbnQgaTsKKworCWlub3ZhX2RldmljZXMgPSBOVUxMOworCWxhc3QgPSBOVUxMOworCisJZm9yIChwY2lkZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBOVUxMKTsKKwkJcGNpZGV2ICE9IE5VTEw7CisJCXBjaWRldiA9IHBjaV9nZXRfZGV2aWNlKFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIHBjaWRldikpIHsKKwkJaWYgKHBjaWRldi0+dmVuZG9yID09IHBjaV92ZW5kb3IpIHsKKwkJCWlub3ZhID0ga21hbGxvYyhzaXplb2YoKmlub3ZhKSwgR0ZQX0tFUk5FTCk7CisJCQlpZiAoIWlub3ZhKSB7CisJCQkJcHJpbnRrKCJpY3BfbXVsdGk6IHBjaV9jYXJkX2xpc3RfaW5pdDogYWxsb2NhdGlvbiBmYWlsZWRcbiIpOworCQkJCXBjaV9kZXZfcHV0KHBjaWRldik7CisJCQkJYnJlYWs7CisJCQl9CisJCQltZW1zZXQoaW5vdmEsIDAsIHNpemVvZigqaW5vdmEpKTsKKworCQkJaW5vdmEtPnBjaWRldiA9IHBjaV9kZXZfZ2V0KHBjaWRldik7CisJCQlpZiAobGFzdCkgeworCQkJCWxhc3QtPm5leHQgPSBpbm92YTsKKwkJCX0gZWxzZSB7CisJCQkJaW5vdmFfZGV2aWNlcyA9IGlub3ZhOworCQkJfQorCQkJbGFzdCA9IGlub3ZhOworCisJCQlpbm92YS0+dmVuZG9yID0gcGNpZGV2LT52ZW5kb3I7CisJCQlpbm92YS0+ZGV2aWNlID0gcGNpZGV2LT5kZXZpY2U7CisJCQlpbm92YS0+cGNpX2J1cyA9IHBjaWRldi0+YnVzLT5udW1iZXI7CisJCQlpbm92YS0+cGNpX3Nsb3QgPSBQQ0lfU0xPVChwY2lkZXYtPmRldmZuKTsKKwkJCWlub3ZhLT5wY2lfZnVuYyA9IFBDSV9GVU5DKHBjaWRldi0+ZGV2Zm4pOworCQkJLyogTm90ZTogcmVzb3VyY2VzIG1heSBiZSBpbnZhbGlkIGlmIFBDSSBkZXZpY2UKKwkJCSAqIG5vdCBlbmFibGVkLCBidXQgdGhleSBhcmUgY29ycmVjdGVkIGluCisJCQkgKiBwY2lfY2FyZF9hbGxvYy4gKi8KKwkJCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspCisJCQkJaW5vdmEtPmlvX2FkZHJbaV0gPQorCQkJCQlwY2lfcmVzb3VyY2Vfc3RhcnQocGNpZGV2LCBpKTsKKwkJCWlub3ZhLT5pcnEgPSBwY2lkZXYtPmlycTsKKwkJfQorCX0KKworCWlmIChkaXNwbGF5KQorCQlwY2lfY2FyZF9saXN0X2Rpc3BsYXkoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBmcmVlIHVwIGxpc3Qgb2YgYW1jYyBjYXJkcyBpbiB0aGlzIHN5c3RlbSAqLworc3RhdGljIHZvaWQgcGNpX2NhcmRfbGlzdF9jbGVhbnVwKHVuc2lnbmVkIHNob3J0IHBjaV92ZW5kb3IpCit7CisJc3RydWN0IHBjaWxzdF9zdHJ1Y3QgKmlub3ZhLCAqbmV4dDsKKworCWZvciAoaW5vdmEgPSBpbm92YV9kZXZpY2VzOyBpbm92YTsgaW5vdmEgPSBuZXh0KSB7CisJCW5leHQgPSBpbm92YS0+bmV4dDsKKwkJcGNpX2Rldl9wdXQoaW5vdmEtPnBjaWRldik7CisJCWtmcmVlKGlub3ZhKTsKKwl9CisKKwlpbm92YV9kZXZpY2VzID0gTlVMTDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBmaW5kIGZpcnN0IHVudXNlZCBjYXJkIHdpdGggdGhpcyBkZXZpY2VfaWQgKi8KK3N0YXRpYyBzdHJ1Y3QgcGNpbHN0X3N0cnVjdCAqZmluZF9mcmVlX3BjaV9jYXJkX2J5X2RldmljZSh1bnNpZ25lZCBzaG9ydAorCXZlbmRvcl9pZCwgdW5zaWduZWQgc2hvcnQgZGV2aWNlX2lkKQoreworCXN0cnVjdCBwY2lsc3Rfc3RydWN0ICppbm92YSwgKm5leHQ7CisKKwlmb3IgKGlub3ZhID0gaW5vdmFfZGV2aWNlczsgaW5vdmE7IGlub3ZhID0gbmV4dCkgeworCQluZXh0ID0gaW5vdmEtPm5leHQ7CisJCWlmICgoIWlub3ZhLT51c2VkKSAmJiAoaW5vdmEtPmRldmljZSA9PSBkZXZpY2VfaWQpCisJCQkmJiAoaW5vdmEtPnZlbmRvciA9PSB2ZW5kb3JfaWQpKQorCQkJcmV0dXJuIGlub3ZhOworCisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogZmluZCBjYXJkIG9uIHJlcXVlc3RlZCBwb3NpdGlvbiAqLworc3RhdGljIGludCBmaW5kX2ZyZWVfcGNpX2NhcmRfYnlfcG9zaXRpb24odW5zaWduZWQgc2hvcnQgdmVuZG9yX2lkLAorCXVuc2lnbmVkIHNob3J0IGRldmljZV9pZCwgdW5zaWduZWQgc2hvcnQgcGNpX2J1cywKKwl1bnNpZ25lZCBzaG9ydCBwY2lfc2xvdCwgc3RydWN0IHBjaWxzdF9zdHJ1Y3QgKipjYXJkKQoreworCXN0cnVjdCBwY2lsc3Rfc3RydWN0ICppbm92YSwgKm5leHQ7CisKKwkqY2FyZCA9IE5VTEw7CisJZm9yIChpbm92YSA9IGlub3ZhX2RldmljZXM7IGlub3ZhOyBpbm92YSA9IG5leHQpIHsKKwkJbmV4dCA9IGlub3ZhLT5uZXh0OworCQlpZiAoKGlub3ZhLT52ZW5kb3IgPT0gdmVuZG9yX2lkKSAmJiAoaW5vdmEtPmRldmljZSA9PSBkZXZpY2VfaWQpCisJCQkmJiAoaW5vdmEtPnBjaV9idXMgPT0gcGNpX2J1cykKKwkJCSYmIChpbm92YS0+cGNpX3Nsb3QgPT0gcGNpX3Nsb3QpKSB7CisJCQlpZiAoIShpbm92YS0+dXNlZCkpIHsKKwkJCQkqY2FyZCA9IGlub3ZhOworCQkJCXJldHVybiAwOwkvLyBvaywgY2FyZCBpcyBmb3VuZAorCQkJfSBlbHNlIHsKKwkJCQlyZXR1cm4gMjsJLy8gY2FyZCBleGlzdCBidXQgaXMgdXNlZAorCQkJfQorCQl9CisJfQorCisJcmV0dXJuIDE7CQkvLyBubyBjYXJkIGZvdW5kCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogbWFyayBjYXJkIGFzIHVzZWQgKi8KK3N0YXRpYyBpbnQgcGNpX2NhcmRfYWxsb2Moc3RydWN0IHBjaWxzdF9zdHJ1Y3QgKmlub3ZhKQoreworCWludCBpOworCisJaWYgKCFpbm92YSkgeworCQlydF9wcmludGsoIiAtIEJVRyEhIGlub3ZhIGlzIE5VTEwhXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChpbm92YS0+dXNlZCkKKwkJcmV0dXJuIDE7CisJaWYgKGNvbWVkaV9wY2lfZW5hYmxlKGlub3ZhLT5wY2lkZXYsICJpY3BfbXVsdGkiKSkgeworCQlydF9wcmludGsoIiAtIENhbid0IGVuYWJsZSBQQ0kgZGV2aWNlIGFuZCByZXF1ZXN0IHJlZ2lvbnMhXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKwkvKiBSZXNvdXJjZXMgd2lsbCBiZSBhY2N1cmF0ZSBub3cuICovCisJZm9yIChpID0gMDsgaSA8IDU7IGkrKykKKwkJaW5vdmEtPmlvX2FkZHJbaV0gPSBwY2lfcmVzb3VyY2Vfc3RhcnQoaW5vdmEtPnBjaWRldiwgaSk7CisJaW5vdmEtPmlycSA9IGlub3ZhLT5wY2lkZXYtPmlycTsKKwlpbm92YS0+dXNlZCA9IDE7CisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogbWFyayBjYXJkIGFzIGZyZWUgKi8KK3N0YXRpYyBpbnQgcGNpX2NhcmRfZnJlZShzdHJ1Y3QgcGNpbHN0X3N0cnVjdCAqaW5vdmEpCit7CisJaWYgKCFpbm92YSkKKwkJcmV0dXJuIC0xOworCisJaWYgKCFpbm92YS0+dXNlZCkKKwkJcmV0dXJuIDE7CisJaW5vdmEtPnVzZWQgPSAwOworCWNvbWVkaV9wY2lfZGlzYWJsZShpbm92YS0+cGNpZGV2KTsKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBkaXNwbGF5IGxpc3Qgb2YgZm91bmQgY2FyZHMgKi8KK3N0YXRpYyB2b2lkIHBjaV9jYXJkX2xpc3RfZGlzcGxheSh2b2lkKQoreworCXN0cnVjdCBwY2lsc3Rfc3RydWN0ICppbm92YSwgKm5leHQ7CisKKwlwcmludGsoIkFubmUncyBMaXN0IG9mIHBjaSBjYXJkc1xuIik7CisJcHJpbnRrKCJidXM6c2xvdDpmdW5jIHZlbmRvciBkZXZpY2UgaW9faW5vdmEgaW9fZGFxIGlycSB1c2VkXG4iKTsKKworCWZvciAoaW5vdmEgPSBpbm92YV9kZXZpY2VzOyBpbm92YTsgaW5vdmEgPSBuZXh0KSB7CisJCW5leHQgPSBpbm92YS0+bmV4dDsKKwkJcHJpbnRrKCIlMmQgICAlMmQgICAlMmQgIDB4JTR4IDB4JTR4ICAgMHglOGxseCAweCU4bGx4ICAlMnUgICUyZFxuIiwgaW5vdmEtPnBjaV9idXMsIGlub3ZhLT5wY2lfc2xvdCwgaW5vdmEtPnBjaV9mdW5jLCBpbm92YS0+dmVuZG9yLCBpbm92YS0+ZGV2aWNlLCAodW5zaWduZWQgbG9uZyBsb25nKWlub3ZhLT5pb19hZGRyWzBdLCAodW5zaWduZWQgbG9uZyBsb25nKWlub3ZhLT5pb19hZGRyWzJdLCBpbm92YS0+aXJxLCBpbm92YS0+dXNlZCk7CisKKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogcmV0dXJuIGFsbCBjYXJkIGluZm9ybWF0aW9uIGZvciBkcml2ZXIgKi8KK3N0YXRpYyBpbnQgcGNpX2NhcmRfZGF0YShzdHJ1Y3QgcGNpbHN0X3N0cnVjdCAqaW5vdmEsCisJdW5zaWduZWQgY2hhciAqcGNpX2J1cywgdW5zaWduZWQgY2hhciAqcGNpX3Nsb3QsCisJdW5zaWduZWQgY2hhciAqcGNpX2Z1bmMsIHJlc291cmNlX3NpemVfdCAqIGlvX2FkZHIsIHVuc2lnbmVkIGludCAqaXJxKQoreworCWludCBpOworCisJaWYgKCFpbm92YSkKKwkJcmV0dXJuIC0xOworCSpwY2lfYnVzID0gaW5vdmEtPnBjaV9idXM7CisJKnBjaV9zbG90ID0gaW5vdmEtPnBjaV9zbG90OworCSpwY2lfZnVuYyA9IGlub3ZhLT5wY2lfZnVuYzsKKwlmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKQorCQlpb19hZGRyW2ldID0gaW5vdmEtPmlvX2FkZHJbaV07CisJKmlycSA9IGlub3ZhLT5pcnE7CisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogc2VsZWN0IGFuZCBhbGxvYyBjYXJkICovCitzdGF0aWMgc3RydWN0IHBjaWxzdF9zdHJ1Y3QgKnNlbGVjdF9hbmRfYWxsb2NfcGNpX2NhcmQodW5zaWduZWQgc2hvcnQgdmVuZG9yX2lkLAorCXVuc2lnbmVkIHNob3J0IGRldmljZV9pZCwgdW5zaWduZWQgc2hvcnQgcGNpX2J1cywKKwl1bnNpZ25lZCBzaG9ydCBwY2lfc2xvdCkKK3sKKwlzdHJ1Y3QgcGNpbHN0X3N0cnVjdCAqY2FyZDsKKwlpbnQgZXJyOworCisJaWYgKChwY2lfYnVzIDwgMSkgJiAocGNpX3Nsb3QgPCAxKSkgewkvLyB1c2UgYXV0b2RldGVjdGlvbgorCQlpZiAoKGNhcmQgPSBmaW5kX2ZyZWVfcGNpX2NhcmRfYnlfZGV2aWNlKHZlbmRvcl9pZCwKKwkJCQkJZGV2aWNlX2lkKSkgPT0gTlVMTCkgeworCQkJcnRfcHJpbnRrKCIgLSBVbnVzZWQgY2FyZCBub3QgZm91bmQgaW4gc3lzdGVtIVxuIik7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCX0gZWxzZSB7CisJCXN3aXRjaCAoZmluZF9mcmVlX3BjaV9jYXJkX2J5X3Bvc2l0aW9uKHZlbmRvcl9pZCwgZGV2aWNlX2lkLAorCQkJCXBjaV9idXMsIHBjaV9zbG90LCAmY2FyZCkpIHsKKwkJY2FzZSAxOgorCQkJcnRfcHJpbnRrCisJCQkJKCIgLSBDYXJkIG5vdCBmb3VuZCBvbiByZXF1ZXN0ZWQgcG9zaXRpb24gYjpzICVkOiVkIVxuIiwKKwkJCQlwY2lfYnVzLCBwY2lfc2xvdCk7CisJCQlyZXR1cm4gTlVMTDsKKwkJY2FzZSAyOgorCQkJcnRfcHJpbnRrCisJCQkJKCIgLSBDYXJkIG9uIHJlcXVlc3RlZCBwb3NpdGlvbiBpcyB1c2VkIGI6cyAlZDolZCFcbiIsCisJCQkJcGNpX2J1cywgcGNpX3Nsb3QpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwl9CisKKwlpZiAoKGVyciA9IHBjaV9jYXJkX2FsbG9jKGNhcmQpKSAhPSAwKSB7CisJCWlmIChlcnIgPiAwKQorCQkJcnRfcHJpbnRrKCIgLSBDYW4ndCBhbGxvY2F0ZSBjYXJkIVxuIik7CisJCS8qIGVsc2U6IGVycm9yIGFscmVhZHkgcHJpbnRlZC4gKi8KKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcmV0dXJuIGNhcmQ7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL21lNDAwMC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL21lNDAwMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0MzJhYTcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbWU0MDAwLmMKQEAgLTAsMCArMSwyMzYyIEBACisvKgorICAgY29tZWRpL2RyaXZlcnMvbWU0MDAwLmMKKyAgIFNvdXJjZSBjb2RlIGZvciB0aGUgTWVpbGhhdXMgTUUtNDAwMCBib2FyZCBmYW1pbHkuCisKKyAgIENPTUVESSAtIExpbnV4IENvbnRyb2wgYW5kIE1lYXN1cmVtZW50IERldmljZSBJbnRlcmZhY2UKKyAgIENvcHlyaWdodCAoQykgMjAwMCBEYXZpZCBBLiBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworICovCisvKgorRHJpdmVyOiBtZTQwMDAKK0Rlc2NyaXB0aW9uOiBNZWlsaGF1cyBNRS00MDAwIHNlcmllcyBib2FyZHMKK0RldmljZXM6IFtNZWlsaGF1c10gTUUtNDY1MCAobWU0MDAwKSwgTUUtNDY3MGksIE1FLTQ2ODAsIE1FLTQ2ODBpLCBNRS00NjgwaXMKK0F1dGhvcjogZ2cgKEd1ZW50ZXIgR2ViaGFyZHQgPGcuZ2ViaGFyZHRAbWVpbGhhdXMuY29tPikKK1VwZGF0ZWQ6IE1vbiwgMTggTWFyIDIwMDIgMTU6MzQ6MDEgLTA4MDAKK1N0YXR1czogYnJva2VuIChubyBzdXBwb3J0IGZvciBsb2FkaW5nIGZpcm13YXJlKQorCitTdXBwb3J0czoKKworICAgIC0gQW5hbG9nIElucHV0CisgICAgLSBBbmFsb2cgT3V0cHV0CisgICAgLSBEaWdpdGFsIEkvTworICAgIC0gQ291bnRlcgorCitDb25maWd1cmF0aW9uIE9wdGlvbnM6CisKKyAgICBbMF0gLSBQQ0kgYnVzIG51bWJlciAob3B0aW9uYWwpCisgICAgWzFdIC0gUENJIHNsb3QgbnVtYmVyIChvcHRpb25hbCkKKworICAgIElmIGJ1cy9zbG90IGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBmaXJzdCBhdmFpbGFibGUgUENJCisgICAgZGV2aWNlIHdpbGwgYmUgdXNlZC4KKworVGhlIGZpcm13YXJlIHJlcXVpcmVkIGJ5IHRoZXNlIGJvYXJkcyBpcyBhdmFpbGFibGUgaW4gdGhlCitjb21lZGlfbm9uZnJlZV9maXJtd2FyZSB0YXJiYWxsIGF2YWlsYWJsZSBmcm9tCitodHRwOi8vd3d3LmNvbWVkaS5vcmcuICBIb3dldmVyLCB0aGUgZHJpdmVyJ3Mgc3VwcG9ydCBmb3IKK2xvYWRpbmcgdGhlIGZpcm13YXJlIHRocm91Z2ggY29tZWRpX2NvbmZpZyBpcyBjdXJyZW50bHkKK2Jyb2tlbi4KKworICovCisKKyNpbmNsdWRlICIuLi9jb21lZGlkZXYuaCIKKworI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisKKyNpbmNsdWRlICJjb21lZGlfcGNpLmgiCisjaW5jbHVkZSAibWU0MDAwLmgiCisjaWYgMAorLyogZmlsZSByZW1vdmVkIGR1ZSB0byBHUEwgaW5jb21wYXRpYmlsaXR5ICovCisjaW5jbHVkZSAibWU0MDAwX2Z3LmgiCisjZW5kaWYKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBQQ0kgZGV2aWNlIHRhYmxlLgorICBUaGlzIGlzIHVzZWQgYnkgbW9kcHJvYmUgdG8gdHJhbnNsYXRlIFBDSSBJRHMgdG8gZHJpdmVycy4KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIERFRklORV9QQ0lfREVWSUNFX1RBQkxFKG1lNDAwMF9wY2lfdGFibGUpID0geworCXtQQ0lfVkVORE9SX0lEX01FSUxIQVVTLCAweDQ2NTAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCisJe1BDSV9WRU5ET1JfSURfTUVJTEhBVVMsIDB4NDY2MCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJe1BDSV9WRU5ET1JfSURfTUVJTEhBVVMsIDB4NDY2MSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJe1BDSV9WRU5ET1JfSURfTUVJTEhBVVMsIDB4NDY2MiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJe1BDSV9WRU5ET1JfSURfTUVJTEhBVVMsIDB4NDY2MywgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisKKwl7UENJX1ZFTkRPUl9JRF9NRUlMSEFVUywgMHg0NjcwLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKwl7UENJX1ZFTkRPUl9JRF9NRUlMSEFVUywgMHg0NjcxLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKwl7UENJX1ZFTkRPUl9JRF9NRUlMSEFVUywgMHg0NjcyLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKwl7UENJX1ZFTkRPUl9JRF9NRUlMSEFVUywgMHg0NjczLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKworCXtQQ0lfVkVORE9SX0lEX01FSUxIQVVTLCAweDQ2ODAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCXtQQ0lfVkVORE9SX0lEX01FSUxIQVVTLCAweDQ2ODEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCXtQQ0lfVkVORE9SX0lEX01FSUxIQVVTLCAweDQ2ODIsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCXtQQ0lfVkVORE9SX0lEX01FSUxIQVVTLCAweDQ2ODMsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCisJezB9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgbWU0MDAwX3BjaV90YWJsZSk7CisKK3N0YXRpYyBjb25zdCBtZTQwMDBfYm9hcmRfdCBtZTQwMDBfYm9hcmRzW10gPSB7CisJeyJNRS00NjUwIiwgMHg0NjUwLCB7MCwgMH0sIHsxNiwgMCwgMCwgMH0sIHs0fSwgezB9fSwKKworCXsiTUUtNDY2MCIsIDB4NDY2MCwgezAsIDB9LCB7MzIsIDAsIDE2LCAwfSwgezR9LCB7M319LAorCXsiTUUtNDY2MGkiLCAweDQ2NjEsIHswLCAwfSwgezMyLCAwLCAxNiwgMH0sIHs0fSwgezN9fSwKKwl7Ik1FLTQ2NjBzIiwgMHg0NjYyLCB7MCwgMH0sIHszMiwgOCwgMTYsIDB9LCB7NH0sIHszfX0sCisJeyJNRS00NjYwaXMiLCAweDQ2NjMsIHswLCAwfSwgezMyLCA4LCAxNiwgMH0sIHs0fSwgezN9fSwKKworCXsiTUUtNDY3MCIsIDB4NDY3MCwgezQsIDB9LCB7MzIsIDAsIDE2LCAxfSwgezR9LCB7M319LAorCXsiTUUtNDY3MGkiLCAweDQ2NzEsIHs0LCAwfSwgezMyLCAwLCAxNiwgMX0sIHs0fSwgezN9fSwKKwl7Ik1FLTQ2NzBzIiwgMHg0NjcyLCB7NCwgMH0sIHszMiwgOCwgMTYsIDF9LCB7NH0sIHszfX0sCisJeyJNRS00NjcwaXMiLCAweDQ2NzMsIHs0LCAwfSwgezMyLCA4LCAxNiwgMX0sIHs0fSwgezN9fSwKKworCXsiTUUtNDY4MCIsIDB4NDY4MCwgezQsIDR9LCB7MzIsIDAsIDE2LCAxfSwgezR9LCB7M319LAorCXsiTUUtNDY4MGkiLCAweDQ2ODEsIHs0LCA0fSwgezMyLCAwLCAxNiwgMX0sIHs0fSwgezN9fSwKKwl7Ik1FLTQ2ODBzIiwgMHg0NjgyLCB7NCwgNH0sIHszMiwgOCwgMTYsIDF9LCB7NH0sIHszfX0sCisJeyJNRS00NjgwaXMiLCAweDQ2ODMsIHs0LCA0fSwgezMyLCA4LCAxNiwgMX0sIHs0fSwgezN9fSwKKworCXswfSwKK307CisKKyNkZWZpbmUgTUU0MDAwX0JPQVJEX1ZFUlNJT05TIChzaXplb2YobWU0MDAwX2JvYXJkcykgLyBzaXplb2YobWU0MDAwX2JvYXJkX3QpIC0gMSkKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBDb21lZGkgZnVuY3Rpb24gcHJvdG90eXBlcworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIGludCBtZTQwMDBfYXR0YWNoKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGNvbWVkaV9kZXZjb25maWcgKiBpdCk7CitzdGF0aWMgaW50IG1lNDAwMF9kZXRhY2goY29tZWRpX2RldmljZSAqIGRldik7CitzdGF0aWMgY29tZWRpX2RyaXZlciBkcml2ZXJfbWU0MDAwID0geworICAgICAgZHJpdmVyX25hbWU6Im1lNDAwMCIsCisgICAgICBtb2R1bGU6VEhJU19NT0RVTEUsCisgICAgICBhdHRhY2g6bWU0MDAwX2F0dGFjaCwKKyAgICAgIGRldGFjaDptZTQwMDBfZGV0YWNoLAorfTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBNZWlsaGF1cyBmdW5jdGlvbiBwcm90b3R5cGVzCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgaW50IG1lNDAwMF9wcm9iZShjb21lZGlfZGV2aWNlICogZGV2LCBjb21lZGlfZGV2Y29uZmlnICogaXQpOworc3RhdGljIGludCBnZXRfcmVnaXN0ZXJzKGNvbWVkaV9kZXZpY2UgKiBkZXYsIHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2X3ApOworc3RhdGljIGludCBpbml0X2JvYXJkX2luZm8oY29tZWRpX2RldmljZSAqIGRldiwgc3RydWN0IHBjaV9kZXYgKnBjaV9kZXZfcCk7CitzdGF0aWMgaW50IGluaXRfYW9fY29udGV4dChjb21lZGlfZGV2aWNlICogZGV2KTsKK3N0YXRpYyBpbnQgaW5pdF9haV9jb250ZXh0KGNvbWVkaV9kZXZpY2UgKiBkZXYpOworc3RhdGljIGludCBpbml0X2Rpb19jb250ZXh0KGNvbWVkaV9kZXZpY2UgKiBkZXYpOworc3RhdGljIGludCBpbml0X2NudF9jb250ZXh0KGNvbWVkaV9kZXZpY2UgKiBkZXYpOworc3RhdGljIGludCB4aWxpbnhfZG93bmxvYWQoY29tZWRpX2RldmljZSAqIGRldik7CitzdGF0aWMgaW50IHJlc2V0X2JvYXJkKGNvbWVkaV9kZXZpY2UgKiBkZXYpOworCitzdGF0aWMgaW50IG1lNDAwMF9kaW9faW5zbl9iaXRzKGNvbWVkaV9kZXZpY2UgKiBkZXYsCisJY29tZWRpX3N1YmRldmljZSAqIHMsIGNvbWVkaV9pbnNuICogaW5zbiwgbHNhbXBsX3QgKiBkYXRhKTsKKworc3RhdGljIGludCBtZTQwMDBfZGlvX2luc25fY29uZmlnKGNvbWVkaV9kZXZpY2UgKiBkZXYsCisJY29tZWRpX3N1YmRldmljZSAqIHMsIGNvbWVkaV9pbnNuICogaW5zbiwgbHNhbXBsX3QgKiBkYXRhKTsKKworc3RhdGljIGludCBjbnRfcmVzZXQoY29tZWRpX2RldmljZSAqIGRldiwgdW5zaWduZWQgaW50IGNoYW5uZWwpOworCitzdGF0aWMgaW50IGNudF9jb25maWcoY29tZWRpX2RldmljZSAqIGRldiwKKwl1bnNpZ25lZCBpbnQgY2hhbm5lbCwgdW5zaWduZWQgaW50IG1vZGUpOworCitzdGF0aWMgaW50IG1lNDAwMF9jbnRfaW5zbl9jb25maWcoY29tZWRpX2RldmljZSAqIGRldiwKKwljb21lZGlfc3ViZGV2aWNlICogcywgY29tZWRpX2luc24gKiBpbnNuLCBsc2FtcGxfdCAqIGRhdGEpOworCitzdGF0aWMgaW50IG1lNDAwMF9jbnRfaW5zbl93cml0ZShjb21lZGlfZGV2aWNlICogZGV2LAorCWNvbWVkaV9zdWJkZXZpY2UgKiBzLCBjb21lZGlfaW5zbiAqIGluc24sIGxzYW1wbF90ICogZGF0YSk7CisKK3N0YXRpYyBpbnQgbWU0MDAwX2NudF9pbnNuX3JlYWQoY29tZWRpX2RldmljZSAqIGRldiwKKwljb21lZGlfc3ViZGV2aWNlICogcywgY29tZWRpX2luc24gKiBpbnNuLCBsc2FtcGxfdCAqIGRhdGEpOworCitzdGF0aWMgaW50IG1lNDAwMF9haV9pbnNuX3JlYWQoY29tZWRpX2RldmljZSAqIGRldiwKKwljb21lZGlfc3ViZGV2aWNlICogc3ViZGV2aWNlLCBjb21lZGlfaW5zbiAqIGluc24sIGxzYW1wbF90ICogZGF0YSk7CisKK3N0YXRpYyBpbnQgbWU0MDAwX2FpX2NhbmNlbChjb21lZGlfZGV2aWNlICogZGV2LCBjb21lZGlfc3ViZGV2aWNlICogcyk7CisKK3N0YXRpYyBpbnQgYWlfY2hlY2tfY2hhbmxpc3QoY29tZWRpX2RldmljZSAqIGRldiwKKwljb21lZGlfc3ViZGV2aWNlICogcywgY29tZWRpX2NtZCAqIGNtZCk7CisKK3N0YXRpYyBpbnQgYWlfcm91bmRfY21kX2FyZ3MoY29tZWRpX2RldmljZSAqIGRldiwKKwljb21lZGlfc3ViZGV2aWNlICogcywKKwljb21lZGlfY21kICogY21kLAorCXVuc2lnbmVkIGludCAqaW5pdF90aWNrcywKKwl1bnNpZ25lZCBpbnQgKnNjYW5fdGlja3MsIHVuc2lnbmVkIGludCAqY2hhbl90aWNrcyk7CisKK3N0YXRpYyBpbnQgYWlfcHJlcGFyZShjb21lZGlfZGV2aWNlICogZGV2LAorCWNvbWVkaV9zdWJkZXZpY2UgKiBzLAorCWNvbWVkaV9jbWQgKiBjbWQsCisJdW5zaWduZWQgaW50IGluaXRfdGlja3MsCisJdW5zaWduZWQgaW50IHNjYW5fdGlja3MsIHVuc2lnbmVkIGludCBjaGFuX3RpY2tzKTsKKworc3RhdGljIGludCBhaV93cml0ZV9jaGFubGlzdChjb21lZGlfZGV2aWNlICogZGV2LAorCWNvbWVkaV9zdWJkZXZpY2UgKiBzLCBjb21lZGlfY21kICogY21kKTsKKworc3RhdGljIGlycXJldHVybl90IG1lNDAwMF9haV9pc3IoaW50IGlycSwgdm9pZCAqZGV2X2lkIFBUX1JFR1NfQVJHKTsKKworc3RhdGljIGludCBtZTQwMDBfYWlfZG9fY21kX3Rlc3QoY29tZWRpX2RldmljZSAqIGRldiwKKwljb21lZGlfc3ViZGV2aWNlICogcywgY29tZWRpX2NtZCAqIGNtZCk7CisKK3N0YXRpYyBpbnQgbWU0MDAwX2FpX2RvX2NtZChjb21lZGlfZGV2aWNlICogZGV2LCBjb21lZGlfc3ViZGV2aWNlICogcyk7CisKK3N0YXRpYyBpbnQgbWU0MDAwX2FvX2luc25fd3JpdGUoY29tZWRpX2RldmljZSAqIGRldiwKKwljb21lZGlfc3ViZGV2aWNlICogcywgY29tZWRpX2luc24gKiBpbnNuLCBsc2FtcGxfdCAqIGRhdGEpOworCitzdGF0aWMgaW50IG1lNDAwMF9hb19pbnNuX3JlYWQoY29tZWRpX2RldmljZSAqIGRldiwKKwljb21lZGlfc3ViZGV2aWNlICogcywgY29tZWRpX2luc24gKiBpbnNuLCBsc2FtcGxfdCAqIGRhdGEpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIE1laWxoYXVzIGlubGluZSBmdW5jdGlvbnMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGlubGluZSB2b2lkIG1lNDAwMF9vdXRiKGNvbWVkaV9kZXZpY2UgKiBkZXYsIHVuc2lnbmVkIGNoYXIgdmFsdWUsCisJdW5zaWduZWQgbG9uZyBwb3J0KQoreworCVBPUlRfUERFQlVHKCItLT4gMHglMDJYIHBvcnQgMHglMDRsWFxuIiwgdmFsdWUsIHBvcnQpOworCW91dGIodmFsdWUsIHBvcnQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbWU0MDAwX291dGwoY29tZWRpX2RldmljZSAqIGRldiwgdW5zaWduZWQgbG9uZyB2YWx1ZSwKKwl1bnNpZ25lZCBsb25nIHBvcnQpCit7CisJUE9SVF9QREVCVUcoIi0tPiAweCUwOGxYIHBvcnQgMHglMDRsWFxuIiwgdmFsdWUsIHBvcnQpOworCW91dGwodmFsdWUsIHBvcnQpOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgbWU0MDAwX2lubChjb21lZGlfZGV2aWNlICogZGV2LCB1bnNpZ25lZCBsb25nIHBvcnQpCit7CisJdW5zaWduZWQgbG9uZyB2YWx1ZTsKKwl2YWx1ZSA9IGlubChwb3J0KTsKKwlQT1JUX1BERUJVRygiPC0tIDB4JTA4bFggcG9ydCAweCUwNGxYXG4iLCB2YWx1ZSwgcG9ydCk7CisJcmV0dXJuIHZhbHVlOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgbWU0MDAwX2luYihjb21lZGlfZGV2aWNlICogZGV2LCB1bnNpZ25lZCBsb25nIHBvcnQpCit7CisJdW5zaWduZWQgY2hhciB2YWx1ZTsKKwl2YWx1ZSA9IGluYihwb3J0KTsKKwlQT1JUX1BERUJVRygiPC0tIDB4JTA4WCBwb3J0IDB4JTA0bFhcbiIsIHZhbHVlLCBwb3J0KTsKKwlyZXR1cm4gdmFsdWU7Cit9CisKK3N0YXRpYyBjb25zdCBjb21lZGlfbHJhbmdlIG1lNDAwMF9haV9yYW5nZSA9IHsKKwk0LAorCXsKKwkJCVVOSV9SQU5HRSgyLjUpLAorCQkJVU5JX1JBTkdFKDEwKSwKKwkJCUJJUF9SQU5HRSgyLjUpLAorCQkJQklQX1JBTkdFKDEwKSwKKwkJfQorfTsKKworc3RhdGljIGNvbnN0IGNvbWVkaV9scmFuZ2UgbWU0MDAwX2FvX3JhbmdlID0geworCTEsCisJeworCQkJQklQX1JBTkdFKDEwKSwKKwkJfQorfTsKKworc3RhdGljIGludCBtZTQwMDBfYXR0YWNoKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGNvbWVkaV9kZXZjb25maWcgKiBpdCkKK3sKKwljb21lZGlfc3ViZGV2aWNlICpzOworCWludCByZXN1bHQ7CisKKwlDQUxMX1BERUJVRygiSW4gbWU0MDAwX2F0dGFjaCgpXG4iKTsKKworCXJlc3VsdCA9IG1lNDAwMF9wcm9iZShkZXYsIGl0KTsKKwlpZiAocmVzdWx0KQorCQlyZXR1cm4gcmVzdWx0OworCisJLyoKKwkgKiBBbGxvY2F0ZSB0aGUgc3ViZGV2aWNlIHN0cnVjdHVyZXMuICBhbGxvY19zdWJkZXZpY2UoKSBpcyBhCisJICogY29udmVuaWVudCBtYWNybyBkZWZpbmVkIGluIGNvbWVkaWRldi5oLiAgSXQgcmVsaWVzIG9uCisJICogbl9zdWJkZXZpY2VzIGJlaW5nIHNldCBjb3JyZWN0bHkuCisJICovCisJaWYgKGFsbG9jX3N1YmRldmljZXMoZGV2LCA0KSA8IDApCisJCXJldHVybiAtRU5PTUVNOworCisgICAgLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICBBbmFsb2cgaW5wdXQgc3ViZGV2aWNlCisgICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisJcyA9IGRldi0+c3ViZGV2aWNlcyArIDA7CisKKwlpZiAodGhpc2JvYXJkLT5haS5jb3VudCkgeworCQlzLT50eXBlID0gQ09NRURJX1NVQkRfQUk7CisJCXMtPnN1YmRldl9mbGFncyA9CisJCQlTREZfUkVBREFCTEUgfCBTREZfQ09NTU9OIHwgU0RGX0dST1VORCB8IFNERl9ESUZGOworCQlzLT5uX2NoYW4gPSB0aGlzYm9hcmQtPmFpLmNvdW50OworCQlzLT5tYXhkYXRhID0gMHhGRkZGOwkvLyAxNiBiaXQgQURDCisJCXMtPmxlbl9jaGFubGlzdCA9IE1FNDAwMF9BSV9DSEFOTkVMX0xJU1RfQ09VTlQ7CisJCXMtPnJhbmdlX3RhYmxlID0gJm1lNDAwMF9haV9yYW5nZTsKKwkJcy0+aW5zbl9yZWFkID0gbWU0MDAwX2FpX2luc25fcmVhZDsKKworCQlpZiAoaW5mby0+aXJxID4gMCkgeworCQkJaWYgKGNvbWVkaV9yZXF1ZXN0X2lycShpbmZvLT5pcnEsIG1lNDAwMF9haV9pc3IsCisJCQkJCUlSUUZfU0hBUkVELCAiTUUtNDAwMCIsIGRldikpIHsKKwkJCQlwcmludGsoImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9hdHRhY2goKTogVW5hYmxlIHRvIGFsbG9jYXRlIGlycVxuIiwgZGV2LT5taW5vcik7CisJCQl9IGVsc2UgeworCQkJCWRldi0+cmVhZF9zdWJkZXYgPSBzOworCQkJCXMtPnN1YmRldl9mbGFncyB8PSBTREZfQ01EX1JFQUQ7CisJCQkJcy0+Y2FuY2VsID0gbWU0MDAwX2FpX2NhbmNlbDsKKwkJCQlzLT5kb19jbWR0ZXN0ID0gbWU0MDAwX2FpX2RvX2NtZF90ZXN0OworCQkJCXMtPmRvX2NtZCA9IG1lNDAwMF9haV9kb19jbWQ7CisJCQl9CisJCX0gZWxzZSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkJImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9hdHRhY2goKTogTm8gaW50ZXJydXB0IGF2YWlsYWJsZVxuIiwKKwkJCQlkZXYtPm1pbm9yKTsKKwkJfQorCX0gZWxzZSB7CisJCXMtPnR5cGUgPSBDT01FRElfU1VCRF9VTlVTRUQ7CisJfQorCisgICAgLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICBBbmFsb2cgb3V0cHV0IHN1YmRldmljZQorICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCXMgPSBkZXYtPnN1YmRldmljZXMgKyAxOworCisJaWYgKHRoaXNib2FyZC0+YW8uY291bnQpIHsKKwkJcy0+dHlwZSA9IENPTUVESV9TVUJEX0FPOworCQlzLT5zdWJkZXZfZmxhZ3MgPSBTREZfV1JJVEVBQkxFIHwgU0RGX0NPTU1PTiB8IFNERl9HUk9VTkQ7CisJCXMtPm5fY2hhbiA9IHRoaXNib2FyZC0+YW8uY291bnQ7CisJCXMtPm1heGRhdGEgPSAweEZGRkY7CS8vIDE2IGJpdCBEQUMKKwkJcy0+cmFuZ2VfdGFibGUgPSAmbWU0MDAwX2FvX3JhbmdlOworCQlzLT5pbnNuX3dyaXRlID0gbWU0MDAwX2FvX2luc25fd3JpdGU7CisJCXMtPmluc25fcmVhZCA9IG1lNDAwMF9hb19pbnNuX3JlYWQ7CisJfSBlbHNlIHsKKwkJcy0+dHlwZSA9IENPTUVESV9TVUJEX1VOVVNFRDsKKwl9CisKKyAgICAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgIERpZ2l0YWwgSS9PIHN1YmRldmljZQorICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCXMgPSBkZXYtPnN1YmRldmljZXMgKyAyOworCisJaWYgKHRoaXNib2FyZC0+ZGlvLmNvdW50KSB7CisJCXMtPnR5cGUgPSBDT01FRElfU1VCRF9ESU87CisJCXMtPnN1YmRldl9mbGFncyA9IFNERl9SRUFEQUJMRSB8IFNERl9XUklUQUJMRTsKKwkJcy0+bl9jaGFuID0gdGhpc2JvYXJkLT5kaW8uY291bnQgKiA4OworCQlzLT5tYXhkYXRhID0gMTsKKwkJcy0+cmFuZ2VfdGFibGUgPSAmcmFuZ2VfZGlnaXRhbDsKKwkJcy0+aW5zbl9iaXRzID0gbWU0MDAwX2Rpb19pbnNuX2JpdHM7CisJCXMtPmluc25fY29uZmlnID0gbWU0MDAwX2Rpb19pbnNuX2NvbmZpZzsKKwl9IGVsc2UgeworCQlzLT50eXBlID0gQ09NRURJX1NVQkRfVU5VU0VEOworCX0KKworCS8qCisJICogQ2hlY2sgZm9yIG9wdG9pc29sYXRlZCBNRS00MDAwIHZlcnNpb24uIElmIG9uZSB0aGUgZmlyc3QKKwkgKiBwb3J0IGlzIGEgZml4ZWQgb3V0cHV0IHBvcnQgYW5kIHRoZSBzZWNvbmQgaXMgYSBmaXhlZCBpbnB1dCBwb3J0LgorCSAqLworCWlmICghbWU0MDAwX2lubChkZXYsIGluZm8tPmRpb19jb250ZXh0LmRpcl9yZWcpKSB7CisJCXMtPmlvX2JpdHMgfD0gMHhGRjsKKwkJbWU0MDAwX291dGwoZGV2LCBNRTQwMDBfRElPX0NUUkxfQklUX01PREVfMCwKKwkJCWluZm8tPmRpb19jb250ZXh0LmRpcl9yZWcpOworCX0KKworICAgIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgQ291bnRlciBzdWJkZXZpY2UKKyAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKwlzID0gZGV2LT5zdWJkZXZpY2VzICsgMzsKKworCWlmICh0aGlzYm9hcmQtPmNudC5jb3VudCkgeworCQlzLT50eXBlID0gQ09NRURJX1NVQkRfQ09VTlRFUjsKKwkJcy0+c3ViZGV2X2ZsYWdzID0gU0RGX1JFQURBQkxFIHwgU0RGX1dSSVRBQkxFOworCQlzLT5uX2NoYW4gPSB0aGlzYm9hcmQtPmNudC5jb3VudDsKKwkJcy0+bWF4ZGF0YSA9IDB4RkZGRjsJLy8gMTYgYml0IGNvdW50ZXJzCisJCXMtPmluc25fcmVhZCA9IG1lNDAwMF9jbnRfaW5zbl9yZWFkOworCQlzLT5pbnNuX3dyaXRlID0gbWU0MDAwX2NudF9pbnNuX3dyaXRlOworCQlzLT5pbnNuX2NvbmZpZyA9IG1lNDAwMF9jbnRfaW5zbl9jb25maWc7CisJfSBlbHNlIHsKKwkJcy0+dHlwZSA9IENPTUVESV9TVUJEX1VOVVNFRDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtZTQwMDBfcHJvYmUoY29tZWRpX2RldmljZSAqIGRldiwgY29tZWRpX2RldmNvbmZpZyAqIGl0KQoreworCXN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2aWNlOworCWludCByZXN1bHQsIGk7CisJbWU0MDAwX2JvYXJkX3QgKmJvYXJkOworCisJQ0FMTF9QREVCVUcoIkluIG1lNDAwMF9wcm9iZSgpXG4iKTsKKworCS8qIEFsbG9jYXRlIHByaXZhdGUgbWVtb3J5ICovCisJaWYgKGFsbG9jX3ByaXZhdGUoZGV2LCBzaXplb2YobWU0MDAwX2luZm9fdCkpIDwgMCkgeworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJLyoKKwkgKiBQcm9iZSB0aGUgZGV2aWNlIHRvIGRldGVybWluZSB3aGF0IGRldmljZSBpbiB0aGUgc2VyaWVzIGl0IGlzLgorCSAqLworCWZvciAocGNpX2RldmljZSA9IHBjaV9nZXRfZGV2aWNlKFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIE5VTEwpOworCQlwY2lfZGV2aWNlICE9IE5VTEw7CisJCXBjaV9kZXZpY2UgPQorCQlwY2lfZ2V0X2RldmljZShQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBwY2lfZGV2aWNlKSkgeworCQlpZiAocGNpX2RldmljZS0+dmVuZG9yID09IFBDSV9WRU5ET1JfSURfTUVJTEhBVVMpIHsKKwkJCWZvciAoaSA9IDA7IGkgPCBNRTQwMDBfQk9BUkRfVkVSU0lPTlM7IGkrKykgeworCQkJCWlmIChtZTQwMDBfYm9hcmRzW2ldLmRldmljZV9pZCA9PQorCQkJCQlwY2lfZGV2aWNlLT5kZXZpY2UpIHsKKwkJCQkJLyogV2FzIGEgcGFydGljdWxhciBidXMvc2xvdCByZXF1ZXN0ZWQ/ICovCisJCQkJCWlmICgoaXQtPm9wdGlvbnNbMF0gIT0gMCkKKwkJCQkJCXx8IChpdC0+b3B0aW9uc1sxXSAhPSAwKSkgeworCQkJCQkJLyogQXJlIHdlIG9uIHRoZSB3cm9uZyBidXMvc2xvdD8gKi8KKwkJCQkJCWlmIChwY2lfZGV2aWNlLT5idXMtPm51bWJlciAhPQorCQkJCQkJCWl0LT5vcHRpb25zWzBdCisJCQkJCQkJfHwgUENJX1NMT1QocGNpX2RldmljZS0+CisJCQkJCQkJCWRldmZuKSAhPQorCQkJCQkJCWl0LT5vcHRpb25zWzFdKSB7CisJCQkJCQkJY29udGludWU7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJZGV2LT5ib2FyZF9wdHIgPSBtZTQwMDBfYm9hcmRzICsgaTsKKwkJCQkJYm9hcmQgPSAobWU0MDAwX2JvYXJkX3QgKikgZGV2LT4KKwkJCQkJCWJvYXJkX3B0cjsKKwkJCQkJaW5mby0+cGNpX2Rldl9wID0gcGNpX2RldmljZTsKKwkJCQkJZ290byBmb3VuZDsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlwcmludGsoS0VSTl9FUlIKKwkJImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9wcm9iZSgpOiBObyBzdXBwb3J0ZWQgYm9hcmQgZm91bmQgKHJlcS4gYnVzL3Nsb3QgOiAlZC8lZClcbiIsCisJCWRldi0+bWlub3IsIGl0LT5vcHRpb25zWzBdLCBpdC0+b3B0aW9uc1sxXSk7CisJcmV0dXJuIC1FTk9ERVY7CisKKyAgICAgIGZvdW5kOgorCisJcHJpbnRrKEtFUk5fSU5GTworCQkiY29tZWRpJWQ6IG1lNDAwMDogbWU0MDAwX3Byb2JlKCk6IEZvdW5kICVzIGF0IFBDSSBidXMgJWQsIHNsb3QgJWRcbiIsCisJCWRldi0+bWlub3IsIG1lNDAwMF9ib2FyZHNbaV0ubmFtZSwgcGNpX2RldmljZS0+YnVzLT5udW1iZXIsCisJCVBDSV9TTE9UKHBjaV9kZXZpY2UtPmRldmZuKSk7CisKKwkvKiBTZXQgZGF0YSBpbiBkZXZpY2Ugc3RydWN0dXJlICovCisJZGV2LT5ib2FyZF9uYW1lID0gYm9hcmQtPm5hbWU7CisKKwkvKiBFbmFibGUgUENJIGRldmljZSBhbmQgcmVxdWVzdCByZWdpb25zICovCisJcmVzdWx0ID0gY29tZWRpX3BjaV9lbmFibGUocGNpX2RldmljZSwgZGV2LT5ib2FyZF9uYW1lKTsKKwlpZiAocmVzdWx0KSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkJImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9wcm9iZSgpOiBDYW5ub3QgZW5hYmxlIFBDSSBkZXZpY2UgYW5kIHJlcXVlc3QgSS9PIHJlZ2lvbnNcbiIsCisJCQlkZXYtPm1pbm9yKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKiBHZXQgdGhlIFBDSSBiYXNlIHJlZ2lzdGVycyAqLworCXJlc3VsdCA9IGdldF9yZWdpc3RlcnMoZGV2LCBwY2lfZGV2aWNlKTsKKwlpZiAocmVzdWx0KSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkJImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9wcm9iZSgpOiBDYW5ub3QgZ2V0IHJlZ2lzdGVyc1xuIiwKKwkJCWRldi0+bWlub3IpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKwkvKiBJbml0aWFsaXplIGJvYXJkIGluZm8gKi8KKwlyZXN1bHQgPSBpbml0X2JvYXJkX2luZm8oZGV2LCBwY2lfZGV2aWNlKTsKKwlpZiAocmVzdWx0KSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkJImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9wcm9iZSgpOiBDYW5ub3QgaW5pdCBiYW9yZCBpbmZvXG4iLAorCQkJZGV2LT5taW5vcik7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJLyogSW5pdCBhbmFsb2cgb3V0cHV0IGNvbnRleHQgKi8KKwlyZXN1bHQgPSBpbml0X2FvX2NvbnRleHQoZGV2KTsKKwlpZiAocmVzdWx0KSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkJImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9wcm9iZSgpOiBDYW5ub3QgaW5pdCBhbyBjb250ZXh0XG4iLAorCQkJZGV2LT5taW5vcik7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJLyogSW5pdCBhbmFsb2cgaW5wdXQgY29udGV4dCAqLworCXJlc3VsdCA9IGluaXRfYWlfY29udGV4dChkZXYpOworCWlmIChyZXN1bHQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCQkiY29tZWRpJWQ6IG1lNDAwMDogbWU0MDAwX3Byb2JlKCk6IENhbm5vdCBpbml0IGFpIGNvbnRleHRcbiIsCisJCQlkZXYtPm1pbm9yKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKiBJbml0IGRpZ2l0YWwgSS9PIGNvbnRleHQgKi8KKwlyZXN1bHQgPSBpbml0X2Rpb19jb250ZXh0KGRldik7CisJaWYgKHJlc3VsdCkgeworCQlwcmludGsoS0VSTl9FUlIKKwkJCSJjb21lZGklZDogbWU0MDAwOiBtZTQwMDBfcHJvYmUoKTogQ2Fubm90IGluaXQgZGlvIGNvbnRleHRcbiIsCisJCQlkZXYtPm1pbm9yKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKiBJbml0IGNvdW50ZXIgY29udGV4dCAqLworCXJlc3VsdCA9IGluaXRfY250X2NvbnRleHQoZGV2KTsKKwlpZiAocmVzdWx0KSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkJImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9wcm9iZSgpOiBDYW5ub3QgaW5pdCBjbnQgY29udGV4dFxuIiwKKwkJCWRldi0+bWlub3IpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qIERvd25sb2FkIHRoZSB4aWxpbnggZmlybXdhcmUgKi8KKwlyZXN1bHQgPSB4aWxpbnhfZG93bmxvYWQoZGV2KTsKKwlpZiAocmVzdWx0KSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkJImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9wcm9iZSgpOiBDYW4ndCBkb3dubG9hZCBmaXJtd2FyZVxuIiwKKwkJCWRldi0+bWlub3IpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qIE1ha2UgYSBoYXJkd2FyZSByZXNldCAqLworCXJlc3VsdCA9IHJlc2V0X2JvYXJkKGRldik7CisJaWYgKHJlc3VsdCkgeworCQlwcmludGsoS0VSTl9FUlIKKwkJCSJjb21lZGklZDogbWU0MDAwOiBtZTQwMDBfcHJvYmUoKTogQ2FuJ3QgcmVzZXQgYm9hcmRcbiIsCisJCQlkZXYtPm1pbm9yKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnZXRfcmVnaXN0ZXJzKGNvbWVkaV9kZXZpY2UgKiBkZXYsIHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2X3ApCit7CisKKwlDQUxMX1BERUJVRygiSW4gZ2V0X3JlZ2lzdGVycygpXG4iKTsKKworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHBseCByZWdiYXNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKwlpbmZvLT5wbHhfcmVnYmFzZSA9IHBjaV9yZXNvdXJjZV9zdGFydChwY2lfZGV2X3AsIDEpOworCWlmIChpbmZvLT5wbHhfcmVnYmFzZSA9PSAwKSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkJImNvbWVkaSVkOiBtZTQwMDA6IGdldF9yZWdpc3RlcnMoKTogUENJIGJhc2UgYWRkcmVzcyAxIGlzIG5vdCBhdmFpbGFibGVcbiIsCisJCQlkZXYtPm1pbm9yKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCWluZm8tPnBseF9yZWdiYXNlX3NpemUgPSBwY2lfcmVzb3VyY2VfbGVuKHBjaV9kZXZfcCwgMSk7CisKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBtZTQwMDAgcmVnYmFzZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisJaW5mby0+bWU0MDAwX3JlZ2Jhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGNpX2Rldl9wLCAyKTsKKwlpZiAoaW5mby0+bWU0MDAwX3JlZ2Jhc2UgPT0gMCkgeworCQlwcmludGsoS0VSTl9FUlIKKwkJCSJjb21lZGklZDogbWU0MDAwOiBnZXRfcmVnaXN0ZXJzKCk6IFBDSSBiYXNlIGFkZHJlc3MgMiBpcyBub3QgYXZhaWxhYmxlXG4iLAorCQkJZGV2LT5taW5vcik7CisJCXJldHVybiAtRU5PREVWOworCX0KKwlpbmZvLT5tZTQwMDBfcmVnYmFzZV9zaXplID0gcGNpX3Jlc291cmNlX2xlbihwY2lfZGV2X3AsIDIpOworCisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gdGltZXIgcmVnYmFzZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisJaW5mby0+dGltZXJfcmVnYmFzZSA9IHBjaV9yZXNvdXJjZV9zdGFydChwY2lfZGV2X3AsIDMpOworCWlmIChpbmZvLT50aW1lcl9yZWdiYXNlID09IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCQkiY29tZWRpJWQ6IG1lNDAwMDogZ2V0X3JlZ2lzdGVycygpOiBQQ0kgYmFzZSBhZGRyZXNzIDMgaXMgbm90IGF2YWlsYWJsZVxuIiwKKwkJCWRldi0+bWlub3IpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJaW5mby0+dGltZXJfcmVnYmFzZV9zaXplID0gcGNpX3Jlc291cmNlX2xlbihwY2lfZGV2X3AsIDMpOworCisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gcHJvZ3JhbSByZWdiYXNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKwlpbmZvLT5wcm9ncmFtX3JlZ2Jhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGNpX2Rldl9wLCA1KTsKKwlpZiAoaW5mby0+cHJvZ3JhbV9yZWdiYXNlID09IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCQkiY29tZWRpJWQ6IG1lNDAwMDogZ2V0X3JlZ2lzdGVycygpOiBQQ0kgYmFzZSBhZGRyZXNzIDUgaXMgbm90IGF2YWlsYWJsZVxuIiwKKwkJCWRldi0+bWlub3IpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJaW5mby0+cHJvZ3JhbV9yZWdiYXNlX3NpemUgPSBwY2lfcmVzb3VyY2VfbGVuKHBjaV9kZXZfcCwgNSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpbml0X2JvYXJkX2luZm8oY29tZWRpX2RldmljZSAqIGRldiwgc3RydWN0IHBjaV9kZXYgKnBjaV9kZXZfcCkKK3sKKwlpbnQgcmVzdWx0OworCisJQ0FMTF9QREVCVUcoIkluIGluaXRfYm9hcmRfaW5mbygpXG4iKTsKKworCS8qIEluaXQgc3BpbiBsb2NrcyAqLworCS8vc3Bpbl9sb2NrX2luaXQoJmluZm8tPnByZWxvYWRfbG9jayk7CisJLy9zcGluX2xvY2tfaW5pdCgmaW5mby0+YWlfY3RybF9sb2NrKTsKKworCS8qIEdldCB0aGUgc2VyaWFsIG51bWJlciAqLworCXJlc3VsdCA9IHBjaV9yZWFkX2NvbmZpZ19kd29yZChwY2lfZGV2X3AsIDB4MkMsICZpbmZvLT5zZXJpYWxfbm8pOworCWlmIChyZXN1bHQgIT0gUENJQklPU19TVUNDRVNTRlVMKSB7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJLyogR2V0IHRoZSBoYXJkd2FyZSByZXZpc2lvbiAqLworCXJlc3VsdCA9IHBjaV9yZWFkX2NvbmZpZ19ieXRlKHBjaV9kZXZfcCwgMHgwOCwgJmluZm8tPmh3X3JldmlzaW9uKTsKKwlpZiAocmVzdWx0ICE9IFBDSUJJT1NfU1VDQ0VTU0ZVTCkgeworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qIEdldCB0aGUgdmVuZG9yIGlkICovCisJaW5mby0+dmVuZG9yX2lkID0gcGNpX2Rldl9wLT52ZW5kb3I7CisKKwkvKiBHZXQgdGhlIGRldmljZSBpZCAqLworCWluZm8tPmRldmljZV9pZCA9IHBjaV9kZXZfcC0+ZGV2aWNlOworCisJLyogR2V0IHRoZSBpcnEgYXNzaWduZWQgdG8gdGhlIGJvYXJkICovCisJaW5mby0+aXJxID0gcGNpX2Rldl9wLT5pcnE7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpbml0X2FvX2NvbnRleHQoY29tZWRpX2RldmljZSAqIGRldikKK3sKKwlpbnQgaTsKKworCUNBTExfUERFQlVHKCJJbiBpbml0X2FvX2NvbnRleHQoKVxuIik7CisKKwlmb3IgKGkgPSAwOyBpIDwgdGhpc2JvYXJkLT5hby5jb3VudDsgaSsrKSB7CisJCS8vc3Bpbl9sb2NrX2luaXQoJmluZm8tPmFvX2NvbnRleHRbaV0udXNlX2xvY2spOworCQlpbmZvLT5hb19jb250ZXh0W2ldLmlycSA9IGluZm8tPmlycTsKKworCQlzd2l0Y2ggKGkpIHsKKwkJY2FzZSAwOgorCQkJaW5mby0+YW9fY29udGV4dFtpXS5jdHJsX3JlZyA9CisJCQkJaW5mby0+bWU0MDAwX3JlZ2Jhc2UgKyBNRTQwMDBfQU9fMDBfQ1RSTF9SRUc7CisJCQlpbmZvLT5hb19jb250ZXh0W2ldLnN0YXR1c19yZWcgPQorCQkJCWluZm8tPm1lNDAwMF9yZWdiYXNlICsgTUU0MDAwX0FPXzAwX1NUQVRVU19SRUc7CisJCQlpbmZvLT5hb19jb250ZXh0W2ldLmZpZm9fcmVnID0KKwkJCQlpbmZvLT5tZTQwMDBfcmVnYmFzZSArIE1FNDAwMF9BT18wMF9GSUZPX1JFRzsKKwkJCWluZm8tPmFvX2NvbnRleHRbaV0uc2luZ2xlX3JlZyA9CisJCQkJaW5mby0+bWU0MDAwX3JlZ2Jhc2UgKyBNRTQwMDBfQU9fMDBfU0lOR0xFX1JFRzsKKwkJCWluZm8tPmFvX2NvbnRleHRbaV0udGltZXJfcmVnID0KKwkJCQlpbmZvLT5tZTQwMDBfcmVnYmFzZSArIE1FNDAwMF9BT18wMF9USU1FUl9SRUc7CisJCQlpbmZvLT5hb19jb250ZXh0W2ldLmlycV9zdGF0dXNfcmVnID0KKwkJCQlpbmZvLT5tZTQwMDBfcmVnYmFzZSArIE1FNDAwMF9JUlFfU1RBVFVTX1JFRzsKKwkJCWluZm8tPmFvX2NvbnRleHRbaV0ucHJlbG9hZF9yZWcgPQorCQkJCWluZm8tPm1lNDAwMF9yZWdiYXNlICsgTUU0MDAwX0FPX0xPQURTRVRSRUdfWFg7CisJCQlicmVhazsKKwkJY2FzZSAxOgorCQkJaW5mby0+YW9fY29udGV4dFtpXS5jdHJsX3JlZyA9CisJCQkJaW5mby0+bWU0MDAwX3JlZ2Jhc2UgKyBNRTQwMDBfQU9fMDFfQ1RSTF9SRUc7CisJCQlpbmZvLT5hb19jb250ZXh0W2ldLnN0YXR1c19yZWcgPQorCQkJCWluZm8tPm1lNDAwMF9yZWdiYXNlICsgTUU0MDAwX0FPXzAxX1NUQVRVU19SRUc7CisJCQlpbmZvLT5hb19jb250ZXh0W2ldLmZpZm9fcmVnID0KKwkJCQlpbmZvLT5tZTQwMDBfcmVnYmFzZSArIE1FNDAwMF9BT18wMV9GSUZPX1JFRzsKKwkJCWluZm8tPmFvX2NvbnRleHRbaV0uc2luZ2xlX3JlZyA9CisJCQkJaW5mby0+bWU0MDAwX3JlZ2Jhc2UgKyBNRTQwMDBfQU9fMDFfU0lOR0xFX1JFRzsKKwkJCWluZm8tPmFvX2NvbnRleHRbaV0udGltZXJfcmVnID0KKwkJCQlpbmZvLT5tZTQwMDBfcmVnYmFzZSArIE1FNDAwMF9BT18wMV9USU1FUl9SRUc7CisJCQlpbmZvLT5hb19jb250ZXh0W2ldLmlycV9zdGF0dXNfcmVnID0KKwkJCQlpbmZvLT5tZTQwMDBfcmVnYmFzZSArIE1FNDAwMF9JUlFfU1RBVFVTX1JFRzsKKwkJCWluZm8tPmFvX2NvbnRleHRbaV0ucHJlbG9hZF9yZWcgPQorCQkJCWluZm8tPm1lNDAwMF9yZWdiYXNlICsgTUU0MDAwX0FPX0xPQURTRVRSRUdfWFg7CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJaW5mby0+YW9fY29udGV4dFtpXS5jdHJsX3JlZyA9CisJCQkJaW5mby0+bWU0MDAwX3JlZ2Jhc2UgKyBNRTQwMDBfQU9fMDJfQ1RSTF9SRUc7CisJCQlpbmZvLT5hb19jb250ZXh0W2ldLnN0YXR1c19yZWcgPQorCQkJCWluZm8tPm1lNDAwMF9yZWdiYXNlICsgTUU0MDAwX0FPXzAyX1NUQVRVU19SRUc7CisJCQlpbmZvLT5hb19jb250ZXh0W2ldLmZpZm9fcmVnID0KKwkJCQlpbmZvLT5tZTQwMDBfcmVnYmFzZSArIE1FNDAwMF9BT18wMl9GSUZPX1JFRzsKKwkJCWluZm8tPmFvX2NvbnRleHRbaV0uc2luZ2xlX3JlZyA9CisJCQkJaW5mby0+bWU0MDAwX3JlZ2Jhc2UgKyBNRTQwMDBfQU9fMDJfU0lOR0xFX1JFRzsKKwkJCWluZm8tPmFvX2NvbnRleHRbaV0udGltZXJfcmVnID0KKwkJCQlpbmZvLT5tZTQwMDBfcmVnYmFzZSArIE1FNDAwMF9BT18wMl9USU1FUl9SRUc7CisJCQlpbmZvLT5hb19jb250ZXh0W2ldLmlycV9zdGF0dXNfcmVnID0KKwkJCQlpbmZvLT5tZTQwMDBfcmVnYmFzZSArIE1FNDAwMF9JUlFfU1RBVFVTX1JFRzsKKwkJCWluZm8tPmFvX2NvbnRleHRbaV0ucHJlbG9hZF9yZWcgPQorCQkJCWluZm8tPm1lNDAwMF9yZWdiYXNlICsgTUU0MDAwX0FPX0xPQURTRVRSRUdfWFg7CisJCQlicmVhazsKKwkJY2FzZSAzOgorCQkJaW5mby0+YW9fY29udGV4dFtpXS5jdHJsX3JlZyA9CisJCQkJaW5mby0+bWU0MDAwX3JlZ2Jhc2UgKyBNRTQwMDBfQU9fMDNfQ1RSTF9SRUc7CisJCQlpbmZvLT5hb19jb250ZXh0W2ldLnN0YXR1c19yZWcgPQorCQkJCWluZm8tPm1lNDAwMF9yZWdiYXNlICsgTUU0MDAwX0FPXzAzX1NUQVRVU19SRUc7CisJCQlpbmZvLT5hb19jb250ZXh0W2ldLmZpZm9fcmVnID0KKwkJCQlpbmZvLT5tZTQwMDBfcmVnYmFzZSArIE1FNDAwMF9BT18wM19GSUZPX1JFRzsKKwkJCWluZm8tPmFvX2NvbnRleHRbaV0uc2luZ2xlX3JlZyA9CisJCQkJaW5mby0+bWU0MDAwX3JlZ2Jhc2UgKyBNRTQwMDBfQU9fMDNfU0lOR0xFX1JFRzsKKwkJCWluZm8tPmFvX2NvbnRleHRbaV0udGltZXJfcmVnID0KKwkJCQlpbmZvLT5tZTQwMDBfcmVnYmFzZSArIE1FNDAwMF9BT18wM19USU1FUl9SRUc7CisJCQlpbmZvLT5hb19jb250ZXh0W2ldLmlycV9zdGF0dXNfcmVnID0KKwkJCQlpbmZvLT5tZTQwMDBfcmVnYmFzZSArIE1FNDAwMF9JUlFfU1RBVFVTX1JFRzsKKwkJCWluZm8tPmFvX2NvbnRleHRbaV0ucHJlbG9hZF9yZWcgPQorCQkJCWluZm8tPm1lNDAwMF9yZWdiYXNlICsgTUU0MDAwX0FPX0xPQURTRVRSRUdfWFg7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaW5pdF9haV9jb250ZXh0KGNvbWVkaV9kZXZpY2UgKiBkZXYpCit7CisKKwlDQUxMX1BERUJVRygiSW4gaW5pdF9haV9jb250ZXh0KClcbiIpOworCisJaW5mby0+YWlfY29udGV4dC5pcnEgPSBpbmZvLT5pcnE7CisKKwlpbmZvLT5haV9jb250ZXh0LmN0cmxfcmVnID0gaW5mby0+bWU0MDAwX3JlZ2Jhc2UgKyBNRTQwMDBfQUlfQ1RSTF9SRUc7CisJaW5mby0+YWlfY29udGV4dC5zdGF0dXNfcmVnID0KKwkJaW5mby0+bWU0MDAwX3JlZ2Jhc2UgKyBNRTQwMDBfQUlfU1RBVFVTX1JFRzsKKwlpbmZvLT5haV9jb250ZXh0LmNoYW5uZWxfbGlzdF9yZWcgPQorCQlpbmZvLT5tZTQwMDBfcmVnYmFzZSArIE1FNDAwMF9BSV9DSEFOTkVMX0xJU1RfUkVHOworCWluZm8tPmFpX2NvbnRleHQuZGF0YV9yZWcgPSBpbmZvLT5tZTQwMDBfcmVnYmFzZSArIE1FNDAwMF9BSV9EQVRBX1JFRzsKKwlpbmZvLT5haV9jb250ZXh0LmNoYW5fdGltZXJfcmVnID0KKwkJaW5mby0+bWU0MDAwX3JlZ2Jhc2UgKyBNRTQwMDBfQUlfQ0hBTl9USU1FUl9SRUc7CisJaW5mby0+YWlfY29udGV4dC5jaGFuX3ByZV90aW1lcl9yZWcgPQorCQlpbmZvLT5tZTQwMDBfcmVnYmFzZSArIE1FNDAwMF9BSV9DSEFOX1BSRV9USU1FUl9SRUc7CisJaW5mby0+YWlfY29udGV4dC5zY2FuX3RpbWVyX2xvd19yZWcgPQorCQlpbmZvLT5tZTQwMDBfcmVnYmFzZSArIE1FNDAwMF9BSV9TQ0FOX1RJTUVSX0xPV19SRUc7CisJaW5mby0+YWlfY29udGV4dC5zY2FuX3RpbWVyX2hpZ2hfcmVnID0KKwkJaW5mby0+bWU0MDAwX3JlZ2Jhc2UgKyBNRTQwMDBfQUlfU0NBTl9USU1FUl9ISUdIX1JFRzsKKwlpbmZvLT5haV9jb250ZXh0LnNjYW5fcHJlX3RpbWVyX2xvd19yZWcgPQorCQlpbmZvLT5tZTQwMDBfcmVnYmFzZSArIE1FNDAwMF9BSV9TQ0FOX1BSRV9USU1FUl9MT1dfUkVHOworCWluZm8tPmFpX2NvbnRleHQuc2Nhbl9wcmVfdGltZXJfaGlnaF9yZWcgPQorCQlpbmZvLT5tZTQwMDBfcmVnYmFzZSArIE1FNDAwMF9BSV9TQ0FOX1BSRV9USU1FUl9ISUdIX1JFRzsKKwlpbmZvLT5haV9jb250ZXh0LnN0YXJ0X3JlZyA9IGluZm8tPm1lNDAwMF9yZWdiYXNlICsgTUU0MDAwX0FJX1NUQVJUX1JFRzsKKwlpbmZvLT5haV9jb250ZXh0LmlycV9zdGF0dXNfcmVnID0KKwkJaW5mby0+bWU0MDAwX3JlZ2Jhc2UgKyBNRTQwMDBfSVJRX1NUQVRVU19SRUc7CisJaW5mby0+YWlfY29udGV4dC5zYW1wbGVfY291bnRlcl9yZWcgPQorCQlpbmZvLT5tZTQwMDBfcmVnYmFzZSArIE1FNDAwMF9BSV9TQU1QTEVfQ09VTlRFUl9SRUc7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpbml0X2Rpb19jb250ZXh0KGNvbWVkaV9kZXZpY2UgKiBkZXYpCit7CisKKwlDQUxMX1BERUJVRygiSW4gaW5pdF9kaW9fY29udGV4dCgpXG4iKTsKKworCWluZm8tPmRpb19jb250ZXh0LmRpcl9yZWcgPSBpbmZvLT5tZTQwMDBfcmVnYmFzZSArIE1FNDAwMF9ESU9fRElSX1JFRzsKKwlpbmZvLT5kaW9fY29udGV4dC5jdHJsX3JlZyA9IGluZm8tPm1lNDAwMF9yZWdiYXNlICsgTUU0MDAwX0RJT19DVFJMX1JFRzsKKwlpbmZvLT5kaW9fY29udGV4dC5wb3J0XzBfcmVnID0KKwkJaW5mby0+bWU0MDAwX3JlZ2Jhc2UgKyBNRTQwMDBfRElPX1BPUlRfMF9SRUc7CisJaW5mby0+ZGlvX2NvbnRleHQucG9ydF8xX3JlZyA9CisJCWluZm8tPm1lNDAwMF9yZWdiYXNlICsgTUU0MDAwX0RJT19QT1JUXzFfUkVHOworCWluZm8tPmRpb19jb250ZXh0LnBvcnRfMl9yZWcgPQorCQlpbmZvLT5tZTQwMDBfcmVnYmFzZSArIE1FNDAwMF9ESU9fUE9SVF8yX1JFRzsKKwlpbmZvLT5kaW9fY29udGV4dC5wb3J0XzNfcmVnID0KKwkJaW5mby0+bWU0MDAwX3JlZ2Jhc2UgKyBNRTQwMDBfRElPX1BPUlRfM19SRUc7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpbml0X2NudF9jb250ZXh0KGNvbWVkaV9kZXZpY2UgKiBkZXYpCit7CisKKwlDQUxMX1BERUJVRygiSW4gaW5pdF9jbnRfY29udGV4dCgpXG4iKTsKKworCWluZm8tPmNudF9jb250ZXh0LmN0cmxfcmVnID0gaW5mby0+dGltZXJfcmVnYmFzZSArIE1FNDAwMF9DTlRfQ1RSTF9SRUc7CisJaW5mby0+Y250X2NvbnRleHQuY291bnRlcl8wX3JlZyA9CisJCWluZm8tPnRpbWVyX3JlZ2Jhc2UgKyBNRTQwMDBfQ05UX0NPVU5URVJfMF9SRUc7CisJaW5mby0+Y250X2NvbnRleHQuY291bnRlcl8xX3JlZyA9CisJCWluZm8tPnRpbWVyX3JlZ2Jhc2UgKyBNRTQwMDBfQ05UX0NPVU5URVJfMV9SRUc7CisJaW5mby0+Y250X2NvbnRleHQuY291bnRlcl8yX3JlZyA9CisJCWluZm8tPnRpbWVyX3JlZ2Jhc2UgKyBNRTQwMDBfQ05UX0NPVU5URVJfMl9SRUc7CisKKwlyZXR1cm4gMDsKK30KKworI2RlZmluZSBGSVJNV0FSRV9OT1RfQVZBSUxBQkxFIDEKKyNpZiBGSVJNV0FSRV9OT1RfQVZBSUxBQkxFCitleHRlcm4gdW5zaWduZWQgY2hhciAqeGlsaW54X2Zpcm07CisjZW5kaWYKKworc3RhdGljIGludCB4aWxpbnhfZG93bmxvYWQoY29tZWRpX2RldmljZSAqIGRldikKK3sKKwl1MzIgdmFsdWUgPSAwOworCXdhaXRfcXVldWVfaGVhZF90IHF1ZXVlOworCWludCBpZHggPSAwOworCWludCBzaXplID0gMDsKKworCUNBTExfUERFQlVHKCJJbiB4aWxpbnhfZG93bmxvYWQoKVxuIik7CisKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZxdWV1ZSk7CisKKwkvKgorCSAqIFNldCBQTFggbG9jYWwgaW50ZXJydXB0IDIgcG9sYXJpdHkgdG8gaGlnaC4KKwkgKiBJbnRlcnJ1cHQgaXMgdGhyb3duIGJ5IGluaXQgcGluIG9mIHhpbGlueC4KKwkgKi8KKwlvdXRsKDB4MTAsIGluZm8tPnBseF9yZWdiYXNlICsgUExYX0lOVENTUik7CisKKwkvKiBTZXQgL0NTIGFuZCAvV1JJVEUgb2YgdGhlIFhpbGlueCAqLworCXZhbHVlID0gaW5sKGluZm8tPnBseF9yZWdiYXNlICsgUExYX0lDUik7CisJdmFsdWUgfD0gMHgxMDA7CisJb3V0bCh2YWx1ZSwgaW5mby0+cGx4X3JlZ2Jhc2UgKyBQTFhfSUNSKTsKKworCS8qIEluaXQgWGlsaW54IHdpdGggQ1MxICovCisJaW5iKGluZm8tPnByb2dyYW1fcmVnYmFzZSArIDB4QzgpOworCisJLyogV2FpdCB1bnRpbCAvSU5JVCBwaW4gaXMgc2V0ICovCisJdWRlbGF5KDIwKTsKKwlpZiAoIWlubChpbmZvLT5wbHhfcmVnYmFzZSArIFBMWF9JTlRDU1IpICYgMHgyMCkgeworCQlwcmludGsoS0VSTl9FUlIKKwkJCSJjb21lZGklZDogbWU0MDAwOiB4aWxpbnhfZG93bmxvYWQoKTogQ2FuJ3QgaW5pdCBYaWxpbnhcbiIsCisJCQlkZXYtPm1pbm9yKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJLyogUmVzZXQgL0NTIGFuZCAvV1JJVEUgb2YgdGhlIFhpbGlueCAqLworCXZhbHVlID0gaW5sKGluZm8tPnBseF9yZWdiYXNlICsgUExYX0lDUik7CisJdmFsdWUgJj0gfjB4MTAwOworCW91dGwodmFsdWUsIGluZm8tPnBseF9yZWdiYXNlICsgUExYX0lDUik7CisJaWYgKEZJUk1XQVJFX05PVF9BVkFJTEFCTEUpIHsKKwkJY29tZWRpX2Vycm9yKGRldiwKKwkJCSJ4aWxpbnggZmlybXdhcmUgdW5hdmFpbGFibGUgZHVlIHRvIGxpY2Vuc2luZywgYWJvcnRpbmciKTsKKwkJcmV0dXJuIC1FSU87CisJfSBlbHNlIHsKKwkJLyogRG93bmxvYWQgWGlsaW54IGZpcm13YXJlICovCisJCXNpemUgPSAoeGlsaW54X2Zpcm1bMF0gPDwgMjQpICsgKHhpbGlueF9maXJtWzFdIDw8IDE2KSArCisJCQkoeGlsaW54X2Zpcm1bMl0gPDwgOCkgKyB4aWxpbnhfZmlybVszXTsKKwkJdWRlbGF5KDEwKTsKKworCQlmb3IgKGlkeCA9IDA7IGlkeCA8IHNpemU7IGlkeCsrKSB7CisJCQlvdXRiKHhpbGlueF9maXJtWzE2ICsgaWR4XSwgaW5mby0+cHJvZ3JhbV9yZWdiYXNlKTsKKwkJCXVkZWxheSgxMCk7CisKKwkJCS8qIENoZWNrIGlmIEJVU1kgZmxhZyBpcyBsb3cgKi8KKwkJCWlmIChpbmwoaW5mby0+cGx4X3JlZ2Jhc2UgKyBQTFhfSUNSKSAmIDB4MjApIHsKKwkJCQlwcmludGsoS0VSTl9FUlIKKwkJCQkJImNvbWVkaSVkOiBtZTQwMDA6IHhpbGlueF9kb3dubG9hZCgpOiBYaWxpbnggaXMgc3RpbGwgYnVzeSAoaWR4ID0gJWQpXG4iLAorCQkJCQlkZXYtPm1pbm9yLCBpZHgpOworCQkJCXJldHVybiAtRUlPOworCQkJfQorCQl9CisJfQorCisJLyogSWYgZG9uZSBmbGFnIGlzIGhpZ2ggZG93bmxvYWQgd2FzIHN1Y2Nlc3NmdWwgKi8KKwlpZiAoaW5sKGluZm8tPnBseF9yZWdiYXNlICsgUExYX0lDUikgJiAweDQpIHsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9FUlIKKwkJCSJjb21lZGklZDogbWU0MDAwOiB4aWxpbnhfZG93bmxvYWQoKTogRE9ORSBmbGFnIGlzIG5vdCBzZXRcbiIsCisJCQlkZXYtPm1pbm9yKTsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCQkiY29tZWRpJWQ6IG1lNDAwMDogeGlsaW54X2Rvd25sb2FkKCk6IERvd25sb2FkIG5vdCBzdWNjZXNmdWxcbiIsCisJCQlkZXYtPm1pbm9yKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJLyogU2V0IC9DUyBhbmQgL1dSSVRFICovCisJdmFsdWUgPSBpbmwoaW5mby0+cGx4X3JlZ2Jhc2UgKyBQTFhfSUNSKTsKKwl2YWx1ZSB8PSAweDEwMDsKKwlvdXRsKHZhbHVlLCBpbmZvLT5wbHhfcmVnYmFzZSArIFBMWF9JQ1IpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmVzZXRfYm9hcmQoY29tZWRpX2RldmljZSAqIGRldikKK3sKKwl1bnNpZ25lZCBsb25nIGljcjsKKworCUNBTExfUERFQlVHKCJJbiByZXNldF9ib2FyZCgpXG4iKTsKKworCS8qIE1ha2UgYSBoYXJkd2FyZSByZXNldCAqLworCWljciA9IG1lNDAwMF9pbmwoZGV2LCBpbmZvLT5wbHhfcmVnYmFzZSArIFBMWF9JQ1IpOworCWljciB8PSAweDQwMDAwMDAwOworCW1lNDAwMF9vdXRsKGRldiwgaWNyLCBpbmZvLT5wbHhfcmVnYmFzZSArIFBMWF9JQ1IpOworCWljciAmPSB+MHg0MDAwMDAwMDsKKwltZTQwMDBfb3V0bChkZXYsIGljciwgaW5mby0+cGx4X3JlZ2Jhc2UgKyBQTFhfSUNSKTsKKworCS8qIDB4ODAwMCB0byB0aGUgREFDcyBtZWFucyBhbiBvdXRwdXQgdm9sdGFnZSBvZiAwViAqLworCW1lNDAwMF9vdXRsKGRldiwgMHg4MDAwLAorCQlpbmZvLT5tZTQwMDBfcmVnYmFzZSArIE1FNDAwMF9BT18wMF9TSU5HTEVfUkVHKTsKKwltZTQwMDBfb3V0bChkZXYsIDB4ODAwMCwKKwkJaW5mby0+bWU0MDAwX3JlZ2Jhc2UgKyBNRTQwMDBfQU9fMDFfU0lOR0xFX1JFRyk7CisJbWU0MDAwX291dGwoZGV2LCAweDgwMDAsCisJCWluZm8tPm1lNDAwMF9yZWdiYXNlICsgTUU0MDAwX0FPXzAyX1NJTkdMRV9SRUcpOworCW1lNDAwMF9vdXRsKGRldiwgMHg4MDAwLAorCQlpbmZvLT5tZTQwMDBfcmVnYmFzZSArIE1FNDAwMF9BT18wM19TSU5HTEVfUkVHKTsKKworCS8qIFNldCBib3RoIHN0b3AgYml0cyBpbiB0aGUgYW5hbG9nIGlucHV0IGNvbnRyb2wgcmVnaXN0ZXIgKi8KKwltZTQwMDBfb3V0bChkZXYsCisJCU1FNDAwMF9BSV9DVFJMX0JJVF9JTU1FRElBVEVfU1RPUCB8IE1FNDAwMF9BSV9DVFJMX0JJVF9TVE9QLAorCQlpbmZvLT5tZTQwMDBfcmVnYmFzZSArIE1FNDAwMF9BSV9DVFJMX1JFRyk7CisKKwkvKiBTZXQgYm90aCBzdG9wIGJpdHMgaW4gdGhlIGFuYWxvZyBvdXRwdXQgY29udHJvbCByZWdpc3RlciAqLworCW1lNDAwMF9vdXRsKGRldiwKKwkJTUU0MDAwX0FPX0NUUkxfQklUX0lNTUVESUFURV9TVE9QIHwgTUU0MDAwX0FPX0NUUkxfQklUX1NUT1AsCisJCWluZm8tPm1lNDAwMF9yZWdiYXNlICsgTUU0MDAwX0FPXzAwX0NUUkxfUkVHKTsKKwltZTQwMDBfb3V0bChkZXYsCisJCU1FNDAwMF9BT19DVFJMX0JJVF9JTU1FRElBVEVfU1RPUCB8IE1FNDAwMF9BT19DVFJMX0JJVF9TVE9QLAorCQlpbmZvLT5tZTQwMDBfcmVnYmFzZSArIE1FNDAwMF9BT18wMV9DVFJMX1JFRyk7CisJbWU0MDAwX291dGwoZGV2LAorCQlNRTQwMDBfQU9fQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1AgfCBNRTQwMDBfQU9fQ1RSTF9CSVRfU1RPUCwKKwkJaW5mby0+bWU0MDAwX3JlZ2Jhc2UgKyBNRTQwMDBfQU9fMDJfQ1RSTF9SRUcpOworCW1lNDAwMF9vdXRsKGRldiwKKwkJTUU0MDAwX0FPX0NUUkxfQklUX0lNTUVESUFURV9TVE9QIHwgTUU0MDAwX0FPX0NUUkxfQklUX1NUT1AsCisJCWluZm8tPm1lNDAwMF9yZWdiYXNlICsgTUU0MDAwX0FPXzAzX0NUUkxfUkVHKTsKKworCS8qIEVuYWJsZSBpbnRlcnJ1cHRzIG9uIHRoZSBQTFggKi8KKwltZTQwMDBfb3V0bChkZXYsIDB4NDMsIGluZm8tPnBseF9yZWdiYXNlICsgUExYX0lOVENTUik7CisKKwkvKiBTZXQgdGhlIGFkdXN0bWVudCByZWdpc3RlciBmb3IgQU8gZGVtdXggKi8KKwltZTQwMDBfb3V0bChkZXYsIE1FNDAwMF9BT19ERU1VWF9BREpVU1RfVkFMVUUsCisJCWluZm8tPm1lNDAwMF9yZWdiYXNlICsgTUU0MDAwX0FPX0RFTVVYX0FESlVTVF9SRUcpOworCisJLyogU2V0IGRpZ2l0YWwgSS9PIGRpcmVjdGlvbiBmb3IgcG9ydCAwIHRvIG91dHB1dCBvbiBpc29sYXRlZCB2ZXJzaW9ucyAqLworCWlmICghKG1lNDAwMF9pbmwoZGV2LCBpbmZvLT5tZTQwMDBfcmVnYmFzZSArIE1FNDAwMF9ESU9fRElSX1JFRykgJiAweDEpKSB7CisJCW1lNDAwMF9vdXRsKGRldiwgMHgxLAorCQkJaW5mby0+bWU0MDAwX3JlZ2Jhc2UgKyBNRTQwMDBfRElPX0NUUkxfUkVHKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtZTQwMDBfZGV0YWNoKGNvbWVkaV9kZXZpY2UgKiBkZXYpCit7CisJQ0FMTF9QREVCVUcoIkluIG1lNDAwMF9kZXRhY2goKVxuIik7CisKKwlpZiAoaW5mbykgeworCQlpZiAoaW5mby0+cGNpX2Rldl9wKSB7CisJCQlyZXNldF9ib2FyZChkZXYpOworCQkJaWYgKGluZm8tPnBseF9yZWdiYXNlKSB7CisJCQkJY29tZWRpX3BjaV9kaXNhYmxlKGluZm8tPnBjaV9kZXZfcCk7CisJCQl9CisJCQlwY2lfZGV2X3B1dChpbmZvLT5wY2lfZGV2X3ApOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQW5hbG9nIGlucHV0IHNlY3Rpb24KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIGludCBtZTQwMDBfYWlfaW5zbl9yZWFkKGNvbWVkaV9kZXZpY2UgKiBkZXYsCisJY29tZWRpX3N1YmRldmljZSAqIHN1YmRldmljZSwgY29tZWRpX2luc24gKiBpbnNuLCBsc2FtcGxfdCAqIGRhdGEpCit7CisKKwlpbnQgY2hhbiA9IENSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpOworCWludCByYW5nID0gQ1JfUkFOR0UoaW5zbi0+Y2hhbnNwZWMpOworCWludCBhcmVmID0gQ1JfQVJFRihpbnNuLT5jaGFuc3BlYyk7CisKKwl1bnNpZ25lZCBsb25nIGVudHJ5ID0gMDsKKwl1bnNpZ25lZCBsb25nIHRtcDsKKwlsb25nIGx2YWw7CisKKwlDQUxMX1BERUJVRygiSW4gbWU0MDAwX2FpX2luc25fcmVhZCgpXG4iKTsKKworCWlmIChpbnNuLT5uID09IDApIHsKKwkJcmV0dXJuIDA7CisJfSBlbHNlIGlmIChpbnNuLT5uID4gMSkgeworCQlwcmludGsoS0VSTl9FUlIKKwkJCSJjb21lZGklZDogbWU0MDAwOiBtZTQwMDBfYWlfaW5zbl9yZWFkKCk6IEludmFsaWQgaW5zdHJ1Y3Rpb24gbGVuZ3RoICVkXG4iLAorCQkJZGV2LT5taW5vciwgaW5zbi0+bik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXN3aXRjaCAocmFuZykgeworCWNhc2UgMDoKKwkJZW50cnkgfD0gTUU0MDAwX0FJX0xJU1RfUkFOR0VfVU5JUE9MQVJfMl81OworCQlicmVhazsKKwljYXNlIDE6CisJCWVudHJ5IHw9IE1FNDAwMF9BSV9MSVNUX1JBTkdFX1VOSVBPTEFSXzEwOworCQlicmVhazsKKwljYXNlIDI6CisJCWVudHJ5IHw9IE1FNDAwMF9BSV9MSVNUX1JBTkdFX0JJUE9MQVJfMl81OworCQlicmVhazsKKwljYXNlIDM6CisJCWVudHJ5IHw9IE1FNDAwMF9BSV9MSVNUX1JBTkdFX0JJUE9MQVJfMTA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX0VSUgorCQkJImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9haV9pbnNuX3JlYWQoKTogSW52YWxpZCByYW5nZSBzcGVjaWZpZWRcbiIsCisJCQlkZXYtPm1pbm9yKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3dpdGNoIChhcmVmKSB7CisJY2FzZSBBUkVGX0dST1VORDoKKwljYXNlIEFSRUZfQ09NTU9OOgorCQlpZiAoY2hhbiA+PSB0aGlzYm9hcmQtPmFpLmNvdW50KSB7CisJCQlwcmludGsoS0VSTl9FUlIKKwkJCQkiY29tZWRpJWQ6IG1lNDAwMDogbWU0MDAwX2FpX2luc25fcmVhZCgpOiBBbmFsb2cgaW5wdXQgaXMgbm90IGF2YWlsYWJsZVxuIiwKKwkJCQlkZXYtPm1pbm9yKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWVudHJ5IHw9IE1FNDAwMF9BSV9MSVNUX0lOUFVUX1NJTkdMRV9FTkRFRCB8IGNoYW47CisJCWJyZWFrOworCisJY2FzZSBBUkVGX0RJRkY6CisJCWlmIChyYW5nID09IDAgfHwgcmFuZyA9PSAxKSB7CisJCQlwcmludGsoS0VSTl9FUlIKKwkJCQkiY29tZWRpJWQ6IG1lNDAwMDogbWU0MDAwX2FpX2luc25fcmVhZCgpOiBSYW5nZSBtdXN0IGJlIGJpcG9sYXIgd2hlbiBhcmVmID0gZGlmZlxuIiwKKwkJCQlkZXYtPm1pbm9yKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJaWYgKGNoYW4gPj0gdGhpc2JvYXJkLT5haS5kaWZmX2NvdW50KSB7CisJCQlwcmludGsoS0VSTl9FUlIKKwkJCQkiY29tZWRpJWQ6IG1lNDAwMDogbWU0MDAwX2FpX2luc25fcmVhZCgpOiBBbmFsb2cgaW5wdXQgaXMgbm90IGF2YWlsYWJsZVxuIiwKKwkJCQlkZXYtPm1pbm9yKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWVudHJ5IHw9IE1FNDAwMF9BSV9MSVNUX0lOUFVUX0RJRkZFUkVOVElBTCB8IGNoYW47CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX0VSUgorCQkJImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9haV9pbnNuX3JlYWQoKTogSW52YWxpZCBhcmVmIHNwZWNpZmllZFxuIiwKKwkJCWRldi0+bWlub3IpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwllbnRyeSB8PSBNRTQwMDBfQUlfTElTVF9MQVNUX0VOVFJZOworCisJLyogQ2xlYXIgY2hhbm5lbCBsaXN0LCBkYXRhIGZpZm8gYW5kIGJvdGggc3RvcCBiaXRzICovCisJdG1wID0gbWU0MDAwX2lubChkZXYsIGluZm8tPmFpX2NvbnRleHQuY3RybF9yZWcpOworCXRtcCAmPSB+KE1FNDAwMF9BSV9DVFJMX0JJVF9DSEFOTkVMX0ZJRk8gfAorCQlNRTQwMDBfQUlfQ1RSTF9CSVRfREFUQV9GSUZPIHwKKwkJTUU0MDAwX0FJX0NUUkxfQklUX1NUT1AgfCBNRTQwMDBfQUlfQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1ApOworCW1lNDAwMF9vdXRsKGRldiwgdG1wLCBpbmZvLT5haV9jb250ZXh0LmN0cmxfcmVnKTsKKworCS8qIFNldCB0aGUgYWNxdWlzaXRpb24gbW9kZSB0byBzaW5nbGUgKi8KKwl0bXAgJj0gfihNRTQwMDBfQUlfQ1RSTF9CSVRfTU9ERV8wIHwgTUU0MDAwX0FJX0NUUkxfQklUX01PREVfMSB8CisJCU1FNDAwMF9BSV9DVFJMX0JJVF9NT0RFXzIpOworCW1lNDAwMF9vdXRsKGRldiwgdG1wLCBpbmZvLT5haV9jb250ZXh0LmN0cmxfcmVnKTsKKworCS8qIEVuYWJsZSBjaGFubmVsIGxpc3QgYW5kIGRhdGEgZmlmbyAqLworCXRtcCB8PSBNRTQwMDBfQUlfQ1RSTF9CSVRfQ0hBTk5FTF9GSUZPIHwgTUU0MDAwX0FJX0NUUkxfQklUX0RBVEFfRklGTzsKKwltZTQwMDBfb3V0bChkZXYsIHRtcCwgaW5mby0+YWlfY29udGV4dC5jdHJsX3JlZyk7CisKKwkvKiBHZW5lcmF0ZSBjaGFubmVsIGxpc3QgZW50cnkgKi8KKwltZTQwMDBfb3V0bChkZXYsIGVudHJ5LCBpbmZvLT5haV9jb250ZXh0LmNoYW5uZWxfbGlzdF9yZWcpOworCisJLyogU2V0IHRoZSB0aW1lciB0byBtYXhpbXVtIHNhbXBsZSByYXRlICovCisJbWU0MDAwX291dGwoZGV2LCBNRTQwMDBfQUlfTUlOX1RJQ0tTLCBpbmZvLT5haV9jb250ZXh0LmNoYW5fdGltZXJfcmVnKTsKKwltZTQwMDBfb3V0bChkZXYsIE1FNDAwMF9BSV9NSU5fVElDS1MsCisJCWluZm8tPmFpX2NvbnRleHQuY2hhbl9wcmVfdGltZXJfcmVnKTsKKworCS8qIFN0YXJ0IGNvbnZlcnNpb24gYnkgZHVtbXkgcmVhZCAqLworCW1lNDAwMF9pbmwoZGV2LCBpbmZvLT5haV9jb250ZXh0LnN0YXJ0X3JlZyk7CisKKwkvKiBXYWl0IHVudGlsIHJlYWR5ICovCisJdWRlbGF5KDEwKTsKKwlpZiAoIShtZTQwMDBfaW5sKGRldiwgaW5mby0+YWlfY29udGV4dC4KKwkJCQlzdGF0dXNfcmVnKSAmIE1FNDAwMF9BSV9TVEFUVVNfQklUX0VGX0RBVEEpKSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkJImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9haV9pbnNuX3JlYWQoKTogVmFsdWUgbm90IGF2YWlsYWJsZSBhZnRlciB3YWl0XG4iLAorCQkJZGV2LT5taW5vcik7CisJCXJldHVybiAtRUlPOworCX0KKworCS8qIFJlYWQgdmFsdWUgZnJvbSBkYXRhIGZpZm8gKi8KKwlsdmFsID0gbWU0MDAwX2lubChkZXYsIGluZm8tPmFpX2NvbnRleHQuZGF0YV9yZWcpICYgMHhGRkZGOworCWRhdGFbMF0gPSBsdmFsIF4gMHg4MDAwOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgbWU0MDAwX2FpX2NhbmNlbChjb21lZGlfZGV2aWNlICogZGV2LCBjb21lZGlfc3ViZGV2aWNlICogcykKK3sKKwl1bnNpZ25lZCBsb25nIHRtcDsKKworCUNBTExfUERFQlVHKCJJbiBtZTQwMDBfYWlfY2FuY2VsKClcbiIpOworCisJLyogU3RvcCBhbnkgcnVubmluZyBjb252ZXJzaW9uICovCisJdG1wID0gbWU0MDAwX2lubChkZXYsIGluZm8tPmFpX2NvbnRleHQuY3RybF9yZWcpOworCXRtcCAmPSB+KE1FNDAwMF9BSV9DVFJMX0JJVF9TVE9QIHwgTUU0MDAwX0FJX0NUUkxfQklUX0lNTUVESUFURV9TVE9QKTsKKwltZTQwMDBfb3V0bChkZXYsIHRtcCwgaW5mby0+YWlfY29udGV4dC5jdHJsX3JlZyk7CisKKwkvKiBDbGVhciB0aGUgY29udHJvbCByZWdpc3RlciAqLworCW1lNDAwMF9vdXRsKGRldiwgMHgwLCBpbmZvLT5haV9jb250ZXh0LmN0cmxfcmVnKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFpX2NoZWNrX2NoYW5saXN0KGNvbWVkaV9kZXZpY2UgKiBkZXYsCisJY29tZWRpX3N1YmRldmljZSAqIHMsIGNvbWVkaV9jbWQgKiBjbWQpCit7CisJaW50IGFyZWY7CisJaW50IGk7CisKKwlDQUxMX1BERUJVRygiSW4gYWlfY2hlY2tfY2hhbmxpc3QoKVxuIik7CisKKwkvKiBDaGVjayB3aGV0aGVyIGEgY2hhbm5lbCBsaXN0IGlzIGF2YWlsYWJsZSAqLworCWlmICghY21kLT5jaGFubGlzdF9sZW4pIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCQkiY29tZWRpJWQ6IG1lNDAwMDogYWlfY2hlY2tfY2hhbmxpc3QoKTogTm8gY2hhbm5lbCBsaXN0IGF2YWlsYWJsZVxuIiwKKwkJCWRldi0+bWlub3IpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBDaGVjayB0aGUgY2hhbm5lbCBsaXN0IHNpemUgKi8KKwlpZiAoY21kLT5jaGFubGlzdF9sZW4gPiBNRTQwMDBfQUlfQ0hBTk5FTF9MSVNUX0NPVU5UKSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkJImNvbWVkaSVkOiBtZTQwMDA6IGFpX2NoZWNrX2NoYW5saXN0KCk6IENoYW5uZWwgbGlzdCBpcyB0byBsYXJnZVxuIiwKKwkJCWRldi0+bWlub3IpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBDaGVjayB0aGUgcG9pbnRlciAqLworCWlmICghY21kLT5jaGFubGlzdCkgeworCQlwcmludGsoS0VSTl9FUlIKKwkJCSJjb21lZGklZDogbWU0MDAwOiBhaV9jaGVja19jaGFubGlzdCgpOiBOVUxMIHBvaW50ZXIgdG8gY2hhbm5lbCBsaXN0XG4iLAorCQkJZGV2LT5taW5vcik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCS8qIENoZWNrIHdoZXRoZXIgYXJlZiBpcyBlcXVhbCBmb3IgYWxsIGVudHJpZXMgKi8KKwlhcmVmID0gQ1JfQVJFRihjbWQtPmNoYW5saXN0WzBdKTsKKwlmb3IgKGkgPSAwOyBpIDwgY21kLT5jaGFubGlzdF9sZW47IGkrKykgeworCQlpZiAoQ1JfQVJFRihjbWQtPmNoYW5saXN0W2ldKSAhPSBhcmVmKSB7CisJCQlwcmludGsoS0VSTl9FUlIKKwkJCQkiY29tZWRpJWQ6IG1lNDAwMDogYWlfY2hlY2tfY2hhbmxpc3QoKTogTW9kZSBpcyBub3QgZXF1YWwgZm9yIGFsbCBlbnRyaWVzXG4iLAorCQkJCWRldi0+bWlub3IpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisKKwkvKiBDaGVjayB3aGV0aGVyIGNoYW5uZWxzIGFyZSBhdmFpbGFibGUgZm9yIHRoaXMgZW5kaW5nICovCisJaWYgKGFyZWYgPT0gU0RGX0RJRkYpIHsKKwkJZm9yIChpID0gMDsgaSA8IGNtZC0+Y2hhbmxpc3RfbGVuOyBpKyspIHsKKwkJCWlmIChDUl9DSEFOKGNtZC0+Y2hhbmxpc3RbaV0pID49CisJCQkJdGhpc2JvYXJkLT5haS5kaWZmX2NvdW50KSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkJCSJjb21lZGklZDogbWU0MDAwOiBhaV9jaGVja19jaGFubGlzdCgpOiBDaGFubmVsIG51bWJlciB0byBoaWdoXG4iLAorCQkJCQlkZXYtPm1pbm9yKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCWZvciAoaSA9IDA7IGkgPCBjbWQtPmNoYW5saXN0X2xlbjsgaSsrKSB7CisJCQlpZiAoQ1JfQ0hBTihjbWQtPmNoYW5saXN0W2ldKSA+PSB0aGlzYm9hcmQtPmFpLmNvdW50KSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkJCSJjb21lZGklZDogbWU0MDAwOiBhaV9jaGVja19jaGFubGlzdCgpOiBDaGFubmVsIG51bWJlciB0byBoaWdoXG4iLAorCQkJCQlkZXYtPm1pbm9yKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJfQorCX0KKworCS8qIENoZWNrIGlmIGJpcG9sYXIgaXMgc2V0IGZvciBhbGwgZW50cmllcyB3aGVuIGluIGRpZmZlcmVudGlhbCBtb2RlICovCisJaWYgKGFyZWYgPT0gU0RGX0RJRkYpIHsKKwkJZm9yIChpID0gMDsgaSA8IGNtZC0+Y2hhbmxpc3RfbGVuOyBpKyspIHsKKwkJCWlmIChDUl9SQU5HRShjbWQtPmNoYW5saXN0W2ldKSAhPSAxICYmCisJCQkJQ1JfUkFOR0UoY21kLT5jaGFubGlzdFtpXSkgIT0gMikgeworCQkJCXByaW50ayhLRVJOX0VSUgorCQkJCQkiY29tZWRpJWQ6IG1lNDAwMDogYWlfY2hlY2tfY2hhbmxpc3QoKTogQmlwb2xhciBpcyBub3Qgc2VsZWN0ZWQgaW4gZGlmZmVyZW50aWFsIG1vZGVcbiIsCisJCQkJCWRldi0+bWlub3IpOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWlfcm91bmRfY21kX2FyZ3MoY29tZWRpX2RldmljZSAqIGRldiwKKwljb21lZGlfc3ViZGV2aWNlICogcywKKwljb21lZGlfY21kICogY21kLAorCXVuc2lnbmVkIGludCAqaW5pdF90aWNrcywKKwl1bnNpZ25lZCBpbnQgKnNjYW5fdGlja3MsIHVuc2lnbmVkIGludCAqY2hhbl90aWNrcykKK3sKKworCWludCByZXN0OworCisJQ0FMTF9QREVCVUcoIkluIGFpX3JvdW5kX2NtZF9hcmdzKClcbiIpOworCisJKmluaXRfdGlja3MgPSAwOworCSpzY2FuX3RpY2tzID0gMDsKKwkqY2hhbl90aWNrcyA9IDA7CisKKwlQREVCVUcoImFpX3JvdW5kX2NtZF9hcmcoKTogc3RhcnRfYXJnID0gJWRcbiIsIGNtZC0+c3RhcnRfYXJnKTsKKwlQREVCVUcoImFpX3JvdW5kX2NtZF9hcmcoKTogc2Nhbl9iZWdpbl9hcmcgPSAlZFxuIiwKKwkJY21kLT5zY2FuX2JlZ2luX2FyZyk7CisJUERFQlVHKCJhaV9yb3VuZF9jbWRfYXJnKCk6IGNvbnZlcnRfYXJnID0gJWRcbiIsIGNtZC0+Y29udmVydF9hcmcpOworCisJaWYgKGNtZC0+c3RhcnRfYXJnKSB7CisJCSppbml0X3RpY2tzID0gKGNtZC0+c3RhcnRfYXJnICogMzMpIC8gMTAwMDsKKwkJcmVzdCA9IChjbWQtPnN0YXJ0X2FyZyAqIDMzKSAlIDEwMDA7CisKKwkJaWYgKGNtZC0+ZmxhZ3MgJiBUUklHX1JPVU5EX05FQVJFU1QpIHsKKwkJCWlmIChyZXN0ID4gMzMpIHsKKwkJCQkoKmluaXRfdGlja3MpKys7CisJCQl9CisJCX0gZWxzZSBpZiAoY21kLT5mbGFncyAmIFRSSUdfUk9VTkRfVVApIHsKKwkJCWlmIChyZXN0KQorCQkJCSgqaW5pdF90aWNrcykrKzsKKwkJfQorCX0KKworCWlmIChjbWQtPnNjYW5fYmVnaW5fYXJnKSB7CisJCSpzY2FuX3RpY2tzID0gKGNtZC0+c2Nhbl9iZWdpbl9hcmcgKiAzMykgLyAxMDAwOworCQlyZXN0ID0gKGNtZC0+c2Nhbl9iZWdpbl9hcmcgKiAzMykgJSAxMDAwOworCisJCWlmIChjbWQtPmZsYWdzICYgVFJJR19ST1VORF9ORUFSRVNUKSB7CisJCQlpZiAocmVzdCA+IDMzKSB7CisJCQkJKCpzY2FuX3RpY2tzKSsrOworCQkJfQorCQl9IGVsc2UgaWYgKGNtZC0+ZmxhZ3MgJiBUUklHX1JPVU5EX1VQKSB7CisJCQlpZiAocmVzdCkKKwkJCQkoKnNjYW5fdGlja3MpKys7CisJCX0KKwl9CisKKwlpZiAoY21kLT5jb252ZXJ0X2FyZykgeworCQkqY2hhbl90aWNrcyA9IChjbWQtPmNvbnZlcnRfYXJnICogMzMpIC8gMTAwMDsKKwkJcmVzdCA9IChjbWQtPmNvbnZlcnRfYXJnICogMzMpICUgMTAwMDsKKworCQlpZiAoY21kLT5mbGFncyAmIFRSSUdfUk9VTkRfTkVBUkVTVCkgeworCQkJaWYgKHJlc3QgPiAzMykgeworCQkJCSgqY2hhbl90aWNrcykrKzsKKwkJCX0KKwkJfSBlbHNlIGlmIChjbWQtPmZsYWdzICYgVFJJR19ST1VORF9VUCkgeworCQkJaWYgKHJlc3QpCisJCQkJKCpjaGFuX3RpY2tzKSsrOworCQl9CisJfQorCisJUERFQlVHKCJhaV9yb3VuZF9jbWRfYXJncygpOiBpbml0X3RpY2tzID0gJWRcbiIsICppbml0X3RpY2tzKTsKKwlQREVCVUcoImFpX3JvdW5kX2NtZF9hcmdzKCk6IHNjYW5fdGlja3MgPSAlZFxuIiwgKnNjYW5fdGlja3MpOworCVBERUJVRygiYWlfcm91bmRfY21kX2FyZ3MoKTogY2hhbl90aWNrcyA9ICVkXG4iLCAqY2hhbl90aWNrcyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYWlfd3JpdGVfdGltZXIoY29tZWRpX2RldmljZSAqIGRldiwKKwl1bnNpZ25lZCBpbnQgaW5pdF90aWNrcywKKwl1bnNpZ25lZCBpbnQgc2Nhbl90aWNrcywgdW5zaWduZWQgaW50IGNoYW5fdGlja3MpCit7CisKKwlDQUxMX1BERUJVRygiSW4gYWlfd3JpdGVfdGltZXIoKVxuIik7CisKKwltZTQwMDBfb3V0bChkZXYsIGluaXRfdGlja3MgLSAxLAorCQlpbmZvLT5haV9jb250ZXh0LnNjYW5fcHJlX3RpbWVyX2xvd19yZWcpOworCW1lNDAwMF9vdXRsKGRldiwgMHgwLCBpbmZvLT5haV9jb250ZXh0LnNjYW5fcHJlX3RpbWVyX2hpZ2hfcmVnKTsKKworCWlmIChzY2FuX3RpY2tzKSB7CisJCW1lNDAwMF9vdXRsKGRldiwgc2Nhbl90aWNrcyAtIDEsCisJCQlpbmZvLT5haV9jb250ZXh0LnNjYW5fdGltZXJfbG93X3JlZyk7CisJCW1lNDAwMF9vdXRsKGRldiwgMHgwLCBpbmZvLT5haV9jb250ZXh0LnNjYW5fdGltZXJfaGlnaF9yZWcpOworCX0KKworCW1lNDAwMF9vdXRsKGRldiwgY2hhbl90aWNrcyAtIDEsIGluZm8tPmFpX2NvbnRleHQuY2hhbl9wcmVfdGltZXJfcmVnKTsKKwltZTQwMDBfb3V0bChkZXYsIGNoYW5fdGlja3MgLSAxLCBpbmZvLT5haV9jb250ZXh0LmNoYW5fdGltZXJfcmVnKTsKK30KKworc3RhdGljIGludCBhaV9wcmVwYXJlKGNvbWVkaV9kZXZpY2UgKiBkZXYsCisJY29tZWRpX3N1YmRldmljZSAqIHMsCisJY29tZWRpX2NtZCAqIGNtZCwKKwl1bnNpZ25lZCBpbnQgaW5pdF90aWNrcywKKwl1bnNpZ25lZCBpbnQgc2Nhbl90aWNrcywgdW5zaWduZWQgaW50IGNoYW5fdGlja3MpCit7CisKKwl1bnNpZ25lZCBsb25nIHRtcCA9IDA7CisKKwlDQUxMX1BERUJVRygiSW4gYWlfcHJlcGFyZSgpXG4iKTsKKworCS8qIFdyaXRlIHRpbWVyIGFyZ3VtZW50cyAqLworCWFpX3dyaXRlX3RpbWVyKGRldiwgaW5pdF90aWNrcywgc2Nhbl90aWNrcywgY2hhbl90aWNrcyk7CisKKwkvKiBSZXNldCBjb250cm9sIHJlZ2lzdGVyICovCisJbWU0MDAwX291dGwoZGV2LCB0bXAsIGluZm8tPmFpX2NvbnRleHQuY3RybF9yZWcpOworCisJLyogU3RhcnQgc291cmNlcyAqLworCWlmICgoY21kLT5zdGFydF9zcmMgPT0gVFJJR19FWFQgJiYKKwkJCWNtZC0+c2Nhbl9iZWdpbl9zcmMgPT0gVFJJR19USU1FUiAmJgorCQkJY21kLT5jb252ZXJ0X3NyYyA9PSBUUklHX1RJTUVSKSB8fAorCQkoY21kLT5zdGFydF9zcmMgPT0gVFJJR19FWFQgJiYKKwkJCWNtZC0+c2Nhbl9iZWdpbl9zcmMgPT0gVFJJR19GT0xMT1cgJiYKKwkJCWNtZC0+Y29udmVydF9zcmMgPT0gVFJJR19USU1FUikpIHsKKwkJdG1wID0gTUU0MDAwX0FJX0NUUkxfQklUX01PREVfMSB8CisJCQlNRTQwMDBfQUlfQ1RSTF9CSVRfQ0hBTk5FTF9GSUZPIHwKKwkJCU1FNDAwMF9BSV9DVFJMX0JJVF9EQVRBX0ZJRk87CisJfSBlbHNlIGlmIChjbWQtPnN0YXJ0X3NyYyA9PSBUUklHX0VYVCAmJgorCQljbWQtPnNjYW5fYmVnaW5fc3JjID09IFRSSUdfRVhUICYmCisJCWNtZC0+Y29udmVydF9zcmMgPT0gVFJJR19USU1FUikgeworCQl0bXAgPSBNRTQwMDBfQUlfQ1RSTF9CSVRfTU9ERV8yIHwKKwkJCU1FNDAwMF9BSV9DVFJMX0JJVF9DSEFOTkVMX0ZJRk8gfAorCQkJTUU0MDAwX0FJX0NUUkxfQklUX0RBVEFfRklGTzsKKwl9IGVsc2UgaWYgKGNtZC0+c3RhcnRfc3JjID09IFRSSUdfRVhUICYmCisJCWNtZC0+c2Nhbl9iZWdpbl9zcmMgPT0gVFJJR19FWFQgJiYKKwkJY21kLT5jb252ZXJ0X3NyYyA9PSBUUklHX0VYVCkgeworCQl0bXAgPSBNRTQwMDBfQUlfQ1RSTF9CSVRfTU9ERV8wIHwKKwkJCU1FNDAwMF9BSV9DVFJMX0JJVF9NT0RFXzEgfAorCQkJTUU0MDAwX0FJX0NUUkxfQklUX0NIQU5ORUxfRklGTyB8CisJCQlNRTQwMDBfQUlfQ1RSTF9CSVRfREFUQV9GSUZPOworCX0gZWxzZSB7CisJCXRtcCA9IE1FNDAwMF9BSV9DVFJMX0JJVF9NT0RFXzAgfAorCQkJTUU0MDAwX0FJX0NUUkxfQklUX0NIQU5ORUxfRklGTyB8CisJCQlNRTQwMDBfQUlfQ1RSTF9CSVRfREFUQV9GSUZPOworCX0KKworCS8qIFN0b3AgdHJpZ2dlcnMgKi8KKwlpZiAoY21kLT5zdG9wX3NyYyA9PSBUUklHX0NPVU5UKSB7CisJCW1lNDAwMF9vdXRsKGRldiwgY21kLT5jaGFubGlzdF9sZW4gKiBjbWQtPnN0b3BfYXJnLAorCQkJaW5mby0+YWlfY29udGV4dC5zYW1wbGVfY291bnRlcl9yZWcpOworCQl0bXAgfD0gTUU0MDAwX0FJX0NUUkxfQklUX0hGX0lSUSB8IE1FNDAwMF9BSV9DVFJMX0JJVF9TQ19JUlE7CisJfSBlbHNlIGlmIChjbWQtPnN0b3Bfc3JjID09IFRSSUdfTk9ORSAmJgorCQljbWQtPnNjYW5fZW5kX3NyYyA9PSBUUklHX0NPVU5UKSB7CisJCW1lNDAwMF9vdXRsKGRldiwgY21kLT5zY2FuX2VuZF9hcmcsCisJCQlpbmZvLT5haV9jb250ZXh0LnNhbXBsZV9jb3VudGVyX3JlZyk7CisJCXRtcCB8PSBNRTQwMDBfQUlfQ1RSTF9CSVRfSEZfSVJRIHwgTUU0MDAwX0FJX0NUUkxfQklUX1NDX0lSUTsKKwl9IGVsc2UgeworCQl0bXAgfD0gTUU0MDAwX0FJX0NUUkxfQklUX0hGX0lSUTsKKwl9CisKKwkvKiBXcml0ZSB0aGUgc2V0dXAgdG8gdGhlIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKwltZTQwMDBfb3V0bChkZXYsIHRtcCwgaW5mby0+YWlfY29udGV4dC5jdHJsX3JlZyk7CisKKwkvKiBXcml0ZSB0aGUgY2hhbm5lbCBsaXN0ICovCisJYWlfd3JpdGVfY2hhbmxpc3QoZGV2LCBzLCBjbWQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWlfd3JpdGVfY2hhbmxpc3QoY29tZWRpX2RldmljZSAqIGRldiwKKwljb21lZGlfc3ViZGV2aWNlICogcywgY29tZWRpX2NtZCAqIGNtZCkKK3sKKwl1bnNpZ25lZCBpbnQgZW50cnk7CisJdW5zaWduZWQgaW50IGNoYW47CisJdW5zaWduZWQgaW50IHJhbmc7CisJdW5zaWduZWQgaW50IGFyZWY7CisJaW50IGk7CisKKwlDQUxMX1BERUJVRygiSW4gYWlfd3JpdGVfY2hhbmxpc3QoKVxuIik7CisKKwlmb3IgKGkgPSAwOyBpIDwgY21kLT5jaGFubGlzdF9sZW47IGkrKykgeworCQljaGFuID0gQ1JfQ0hBTihjbWQtPmNoYW5saXN0W2ldKTsKKwkJcmFuZyA9IENSX1JBTkdFKGNtZC0+Y2hhbmxpc3RbaV0pOworCQlhcmVmID0gQ1JfQVJFRihjbWQtPmNoYW5saXN0W2ldKTsKKworCQllbnRyeSA9IGNoYW47CisKKwkJaWYgKHJhbmcgPT0gMCkgeworCQkJZW50cnkgfD0gTUU0MDAwX0FJX0xJU1RfUkFOR0VfVU5JUE9MQVJfMl81OworCQl9IGVsc2UgaWYgKHJhbmcgPT0gMSkgeworCQkJZW50cnkgfD0gTUU0MDAwX0FJX0xJU1RfUkFOR0VfVU5JUE9MQVJfMTA7CisJCX0gZWxzZSBpZiAocmFuZyA9PSAyKSB7CisJCQllbnRyeSB8PSBNRTQwMDBfQUlfTElTVF9SQU5HRV9CSVBPTEFSXzJfNTsKKwkJfSBlbHNlIHsKKwkJCWVudHJ5IHw9IE1FNDAwMF9BSV9MSVNUX1JBTkdFX0JJUE9MQVJfMTA7CisJCX0KKworCQlpZiAoYXJlZiA9PSBTREZfRElGRikgeworCQkJZW50cnkgfD0gTUU0MDAwX0FJX0xJU1RfSU5QVVRfRElGRkVSRU5USUFMOworCQl9IGVsc2UgeworCQkJZW50cnkgfD0gTUU0MDAwX0FJX0xJU1RfSU5QVVRfU0lOR0xFX0VOREVEOworCQl9CisKKwkJbWU0MDAwX291dGwoZGV2LCBlbnRyeSwgaW5mby0+YWlfY29udGV4dC5jaGFubmVsX2xpc3RfcmVnKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtZTQwMDBfYWlfZG9fY21kKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKiBzKQoreworCWludCBlcnI7CisJdW5zaWduZWQgaW50IGluaXRfdGlja3MgPSAwOworCXVuc2lnbmVkIGludCBzY2FuX3RpY2tzID0gMDsKKwl1bnNpZ25lZCBpbnQgY2hhbl90aWNrcyA9IDA7CisJY29tZWRpX2NtZCAqY21kID0gJnMtPmFzeW5jLT5jbWQ7CisKKwlDQUxMX1BERUJVRygiSW4gbWU0MDAwX2FpX2RvX2NtZCgpXG4iKTsKKworCS8qIFJlc2V0IHRoZSBhbmFsb2cgaW5wdXQgKi8KKwllcnIgPSBtZTQwMDBfYWlfY2FuY2VsKGRldiwgcyk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCS8qIFJvdW5kIHRoZSB0aW1lciBhcmd1bWVudHMgKi8KKwllcnIgPSBhaV9yb3VuZF9jbWRfYXJncyhkZXYsCisJCXMsIGNtZCwgJmluaXRfdGlja3MsICZzY2FuX3RpY2tzLCAmY2hhbl90aWNrcyk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCS8qIFByZXBhcmUgdGhlIEFJIGZvciBhY3F1aXNpdGlvbiAqLworCWVyciA9IGFpX3ByZXBhcmUoZGV2LCBzLCBjbWQsIGluaXRfdGlja3MsIHNjYW5fdGlja3MsIGNoYW5fdGlja3MpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwkvKiBTdGFydCBhY3F1aXN0aW9uIGJ5IGR1bW15IHJlYWQgKi8KKwltZTQwMDBfaW5sKGRldiwgaW5mby0+YWlfY29udGV4dC5zdGFydF9yZWcpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBtZTQwMDBfYWlfZG9fY21kX3Rlc3QoKToKKyAqCisgKiBUaGUgZGVtbyBjbWQuYyBpbiAuL2NvbWVkaWxpYi9kZW1vIHNwZWNpZmllcyA2IHJldHVybiB2YWx1ZXM6CisgKiAtIHN1Y2Nlc3MKKyAqIC0gaW52YWxpZCBzb3VyY2UKKyAqIC0gc291cmNlIGNvbmZsaWN0CisgKiAtIGludmFsaWQgYXJndW1lbnQKKyAqIC0gYXJndW1lbnQgY29uZmxpY3QKKyAqIC0gaW52YWxpZCBjaGFubGlzdAorICogU28gSSB0cmllZCB0byBhZG9wdCB0aGlzIHNjaGVtZS4KKyAqLworc3RhdGljIGludCBtZTQwMDBfYWlfZG9fY21kX3Rlc3QoY29tZWRpX2RldmljZSAqIGRldiwKKwljb21lZGlfc3ViZGV2aWNlICogcywgY29tZWRpX2NtZCAqIGNtZCkKK3sKKworCXVuc2lnbmVkIGludCBpbml0X3RpY2tzOworCXVuc2lnbmVkIGludCBjaGFuX3RpY2tzOworCXVuc2lnbmVkIGludCBzY2FuX3RpY2tzOworCWludCBlcnIgPSAwOworCisJQ0FMTF9QREVCVUcoIkluIG1lNDAwMF9haV9kb19jbWRfdGVzdCgpXG4iKTsKKworCVBERUJVRygibWU0MDAwX2FpX2RvX2NtZF90ZXN0KCk6IHN1YmRldiAgICAgICAgID0gJWRcbiIsIGNtZC0+c3ViZGV2KTsKKwlQREVCVUcoIm1lNDAwMF9haV9kb19jbWRfdGVzdCgpOiBmbGFncyAgICAgICAgICA9ICUwOFhcbiIsIGNtZC0+ZmxhZ3MpOworCVBERUJVRygibWU0MDAwX2FpX2RvX2NtZF90ZXN0KCk6IHN0YXJ0X3NyYyAgICAgID0gJTA4WFxuIiwKKwkJY21kLT5zdGFydF9zcmMpOworCVBERUJVRygibWU0MDAwX2FpX2RvX2NtZF90ZXN0KCk6IHN0YXJ0X2FyZyAgICAgID0gJWRcbiIsCisJCWNtZC0+c3RhcnRfYXJnKTsKKwlQREVCVUcoIm1lNDAwMF9haV9kb19jbWRfdGVzdCgpOiBzY2FuX2JlZ2luX3NyYyA9ICUwOFhcbiIsCisJCWNtZC0+c2Nhbl9iZWdpbl9zcmMpOworCVBERUJVRygibWU0MDAwX2FpX2RvX2NtZF90ZXN0KCk6IHNjYW5fYmVnaW5fYXJnID0gJWRcbiIsCisJCWNtZC0+c2Nhbl9iZWdpbl9hcmcpOworCVBERUJVRygibWU0MDAwX2FpX2RvX2NtZF90ZXN0KCk6IGNvbnZlcnRfc3JjICAgID0gJTA4WFxuIiwKKwkJY21kLT5jb252ZXJ0X3NyYyk7CisJUERFQlVHKCJtZTQwMDBfYWlfZG9fY21kX3Rlc3QoKTogY29udmVydF9hcmcgICAgPSAlZFxuIiwKKwkJY21kLT5jb252ZXJ0X2FyZyk7CisJUERFQlVHKCJtZTQwMDBfYWlfZG9fY21kX3Rlc3QoKTogc2Nhbl9lbmRfc3JjICAgPSAlMDhYXG4iLAorCQljbWQtPnNjYW5fZW5kX3NyYyk7CisJUERFQlVHKCJtZTQwMDBfYWlfZG9fY21kX3Rlc3QoKTogc2Nhbl9lbmRfYXJnICAgPSAlZFxuIiwKKwkJY21kLT5zY2FuX2VuZF9hcmcpOworCVBERUJVRygibWU0MDAwX2FpX2RvX2NtZF90ZXN0KCk6IHN0b3Bfc3JjICAgICAgID0gJTA4WFxuIiwKKwkJY21kLT5zdG9wX3NyYyk7CisJUERFQlVHKCJtZTQwMDBfYWlfZG9fY21kX3Rlc3QoKTogc3RvcF9hcmcgICAgICAgPSAlZFxuIiwgY21kLT5zdG9wX2FyZyk7CisJUERFQlVHKCJtZTQwMDBfYWlfZG9fY21kX3Rlc3QoKTogY2hhbmxpc3QgICAgICAgPSAlZFxuIiwKKwkJKHVuc2lnbmVkIGludCljbWQtPmNoYW5saXN0KTsKKwlQREVCVUcoIm1lNDAwMF9haV9kb19jbWRfdGVzdCgpOiBjaGFubGlzdF9sZW4gICA9ICVkXG4iLAorCQljbWQtPmNoYW5saXN0X2xlbik7CisKKwkvKiBPbmx5IHJvdW5kaW5nIGZsYWdzIGFyZSBpbXBsZW1lbnRlZCAqLworCWNtZC0+ZmxhZ3MgJj0gVFJJR19ST1VORF9ORUFSRVNUIHwgVFJJR19ST1VORF9VUCB8IFRSSUdfUk9VTkRfRE9XTjsKKworCS8qIFJvdW5kIHRoZSB0aW1lciBhcmd1bWVudHMgKi8KKwlhaV9yb3VuZF9jbWRfYXJncyhkZXYsIHMsIGNtZCwgJmluaXRfdGlja3MsICZzY2FuX3RpY2tzLCAmY2hhbl90aWNrcyk7CisKKwkvKgorCSAqIFN0YWdlIDEuIENoZWNrIGlmIHRoZSB0cmlnZ2VyIHNvdXJjZXMgYXJlIGdlbmVyYWxseSB2YWxpZC4KKwkgKi8KKwlzd2l0Y2ggKGNtZC0+c3RhcnRfc3JjKSB7CisJY2FzZSBUUklHX05PVzoKKwljYXNlIFRSSUdfRVhUOgorCQlicmVhazsKKwljYXNlIFRSSUdfQU5ZOgorCQljbWQtPnN0YXJ0X3NyYyAmPSBUUklHX05PVyB8IFRSSUdfRVhUOworCQllcnIrKzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fRVJSCisJCQkiY29tZWRpJWQ6IG1lNDAwMDogbWU0MDAwX2FpX2RvX2NtZF90ZXN0KCk6IEludmFsaWQgc3RhcnQgc291cmNlXG4iLAorCQkJZGV2LT5taW5vcik7CisJCWNtZC0+c3RhcnRfc3JjID0gVFJJR19OT1c7CisJCWVycisrOworCX0KKwlzd2l0Y2ggKGNtZC0+c2Nhbl9iZWdpbl9zcmMpIHsKKwljYXNlIFRSSUdfRk9MTE9XOgorCWNhc2UgVFJJR19USU1FUjoKKwljYXNlIFRSSUdfRVhUOgorCQlicmVhazsKKwljYXNlIFRSSUdfQU5ZOgorCQljbWQtPnNjYW5fYmVnaW5fc3JjICY9IFRSSUdfRk9MTE9XIHwgVFJJR19USU1FUiB8IFRSSUdfRVhUOworCQllcnIrKzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fRVJSCisJCQkiY29tZWRpJWQ6IG1lNDAwMDogbWU0MDAwX2FpX2RvX2NtZF90ZXN0KCk6IEludmFsaWQgc2NhbiBiZWdpbiBzb3VyY2VcbiIsCisJCQlkZXYtPm1pbm9yKTsKKwkJY21kLT5zY2FuX2JlZ2luX3NyYyA9IFRSSUdfRk9MTE9XOworCQllcnIrKzsKKwl9CisJc3dpdGNoIChjbWQtPmNvbnZlcnRfc3JjKSB7CisJY2FzZSBUUklHX1RJTUVSOgorCWNhc2UgVFJJR19FWFQ6CisJCWJyZWFrOworCWNhc2UgVFJJR19BTlk6CisJCWNtZC0+Y29udmVydF9zcmMgJj0gVFJJR19USU1FUiB8IFRSSUdfRVhUOworCQllcnIrKzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fRVJSCisJCQkiY29tZWRpJWQ6IG1lNDAwMDogbWU0MDAwX2FpX2RvX2NtZF90ZXN0KCk6IEludmFsaWQgY29udmVydCBzb3VyY2VcbiIsCisJCQlkZXYtPm1pbm9yKTsKKwkJY21kLT5jb252ZXJ0X3NyYyA9IFRSSUdfVElNRVI7CisJCWVycisrOworCX0KKwlzd2l0Y2ggKGNtZC0+c2Nhbl9lbmRfc3JjKSB7CisJY2FzZSBUUklHX05PTkU6CisJY2FzZSBUUklHX0NPVU5UOgorCQlicmVhazsKKwljYXNlIFRSSUdfQU5ZOgorCQljbWQtPnNjYW5fZW5kX3NyYyAmPSBUUklHX05PTkUgfCBUUklHX0NPVU5UOworCQllcnIrKzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fRVJSCisJCQkiY29tZWRpJWQ6IG1lNDAwMDogbWU0MDAwX2FpX2RvX2NtZF90ZXN0KCk6IEludmFsaWQgc2NhbiBlbmQgc291cmNlXG4iLAorCQkJZGV2LT5taW5vcik7CisJCWNtZC0+c2Nhbl9lbmRfc3JjID0gVFJJR19OT05FOworCQllcnIrKzsKKwl9CisJc3dpdGNoIChjbWQtPnN0b3Bfc3JjKSB7CisJY2FzZSBUUklHX05PTkU6CisJY2FzZSBUUklHX0NPVU5UOgorCQlicmVhazsKKwljYXNlIFRSSUdfQU5ZOgorCQljbWQtPnN0b3Bfc3JjICY9IFRSSUdfTk9ORSB8IFRSSUdfQ09VTlQ7CisJCWVycisrOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9FUlIKKwkJCSJjb21lZGklZDogbWU0MDAwOiBtZTQwMDBfYWlfZG9fY21kX3Rlc3QoKTogSW52YWxpZCBzdG9wIHNvdXJjZVxuIiwKKwkJCWRldi0+bWlub3IpOworCQljbWQtPnN0b3Bfc3JjID0gVFJJR19OT05FOworCQllcnIrKzsKKwl9CisJaWYgKGVycikgeworCQlyZXR1cm4gMTsKKwl9CisKKwkvKgorCSAqIFN0YWdlIDIuIENoZWNrIGZvciB0cmlnZ2VyIHNvdXJjZSBjb25mbGljdHMuCisJICovCisJaWYgKGNtZC0+c3RhcnRfc3JjID09IFRSSUdfTk9XICYmCisJCWNtZC0+c2Nhbl9iZWdpbl9zcmMgPT0gVFJJR19USU1FUiAmJgorCQljbWQtPmNvbnZlcnRfc3JjID09IFRSSUdfVElNRVIpIHsKKwl9IGVsc2UgaWYgKGNtZC0+c3RhcnRfc3JjID09IFRSSUdfTk9XICYmCisJCWNtZC0+c2Nhbl9iZWdpbl9zcmMgPT0gVFJJR19GT0xMT1cgJiYKKwkJY21kLT5jb252ZXJ0X3NyYyA9PSBUUklHX1RJTUVSKSB7CisJfSBlbHNlIGlmIChjbWQtPnN0YXJ0X3NyYyA9PSBUUklHX0VYVCAmJgorCQljbWQtPnNjYW5fYmVnaW5fc3JjID09IFRSSUdfVElNRVIgJiYKKwkJY21kLT5jb252ZXJ0X3NyYyA9PSBUUklHX1RJTUVSKSB7CisJfSBlbHNlIGlmIChjbWQtPnN0YXJ0X3NyYyA9PSBUUklHX0VYVCAmJgorCQljbWQtPnNjYW5fYmVnaW5fc3JjID09IFRSSUdfRk9MTE9XICYmCisJCWNtZC0+Y29udmVydF9zcmMgPT0gVFJJR19USU1FUikgeworCX0gZWxzZSBpZiAoY21kLT5zdGFydF9zcmMgPT0gVFJJR19FWFQgJiYKKwkJY21kLT5zY2FuX2JlZ2luX3NyYyA9PSBUUklHX0VYVCAmJgorCQljbWQtPmNvbnZlcnRfc3JjID09IFRSSUdfVElNRVIpIHsKKwl9IGVsc2UgaWYgKGNtZC0+c3RhcnRfc3JjID09IFRSSUdfRVhUICYmCisJCWNtZC0+c2Nhbl9iZWdpbl9zcmMgPT0gVFJJR19FWFQgJiYKKwkJY21kLT5jb252ZXJ0X3NyYyA9PSBUUklHX0VYVCkgeworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkJImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9haV9kb19jbWRfdGVzdCgpOiBJbnZhbGlkIHN0YXJ0IHRyaWdnZXIgY29tYmluYXRpb25cbiIsCisJCQlkZXYtPm1pbm9yKTsKKwkJY21kLT5zdGFydF9zcmMgPSBUUklHX05PVzsKKwkJY21kLT5zY2FuX2JlZ2luX3NyYyA9IFRSSUdfRk9MTE9XOworCQljbWQtPmNvbnZlcnRfc3JjID0gVFJJR19USU1FUjsKKwkJZXJyKys7CisJfQorCisJaWYgKGNtZC0+c3RvcF9zcmMgPT0gVFJJR19OT05FICYmIGNtZC0+c2Nhbl9lbmRfc3JjID09IFRSSUdfTk9ORSkgeworCX0gZWxzZSBpZiAoY21kLT5zdG9wX3NyYyA9PSBUUklHX0NPVU5UICYmCisJCWNtZC0+c2Nhbl9lbmRfc3JjID09IFRSSUdfTk9ORSkgeworCX0gZWxzZSBpZiAoY21kLT5zdG9wX3NyYyA9PSBUUklHX05PTkUgJiYKKwkJY21kLT5zY2FuX2VuZF9zcmMgPT0gVFJJR19DT1VOVCkgeworCX0gZWxzZSBpZiAoY21kLT5zdG9wX3NyYyA9PSBUUklHX0NPVU5UICYmCisJCWNtZC0+c2Nhbl9lbmRfc3JjID09IFRSSUdfQ09VTlQpIHsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9FUlIKKwkJCSJjb21lZGklZDogbWU0MDAwOiBtZTQwMDBfYWlfZG9fY21kX3Rlc3QoKTogSW52YWxpZCBzdG9wIHRyaWdnZXIgY29tYmluYXRpb25cbiIsCisJCQlkZXYtPm1pbm9yKTsKKwkJY21kLT5zdG9wX3NyYyA9IFRSSUdfTk9ORTsKKwkJY21kLT5zY2FuX2VuZF9zcmMgPSBUUklHX05PTkU7CisJCWVycisrOworCX0KKwlpZiAoZXJyKSB7CisJCXJldHVybiAyOworCX0KKworCS8qCisJICogU3RhZ2UgMy4gQ2hlY2sgaWYgYXJndW1lbnRzIGFyZSBnZW5lcmFsbHkgdmFsaWQuCisJICovCisJaWYgKGNtZC0+Y2hhbmxpc3RfbGVuIDwgMSkgeworCQlwcmludGsoS0VSTl9FUlIKKwkJCSJjb21lZGklZDogbWU0MDAwOiBtZTQwMDBfYWlfZG9fY21kX3Rlc3QoKTogTm8gY2hhbm5lbCBsaXN0XG4iLAorCQkJZGV2LT5taW5vcik7CisJCWNtZC0+Y2hhbmxpc3RfbGVuID0gMTsKKwkJZXJyKys7CisJfQorCWlmIChpbml0X3RpY2tzIDwgNjYpIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCQkiY29tZWRpJWQ6IG1lNDAwMDogbWU0MDAwX2FpX2RvX2NtZF90ZXN0KCk6IFN0YXJ0IGFyZyB0byBsb3dcbiIsCisJCQlkZXYtPm1pbm9yKTsKKwkJY21kLT5zdGFydF9hcmcgPSAyMDAwOworCQllcnIrKzsKKwl9CisJaWYgKHNjYW5fdGlja3MgJiYgc2Nhbl90aWNrcyA8IDY3KSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkJImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9haV9kb19jbWRfdGVzdCgpOiBTY2FuIGJlZ2luIGFyZyB0byBsb3dcbiIsCisJCQlkZXYtPm1pbm9yKTsKKwkJY21kLT5zY2FuX2JlZ2luX2FyZyA9IDIwMzE7CisJCWVycisrOworCX0KKwlpZiAoY2hhbl90aWNrcyA8IDY2KSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkJImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9haV9kb19jbWRfdGVzdCgpOiBDb252ZXJ0IGFyZyB0byBsb3dcbiIsCisJCQlkZXYtPm1pbm9yKTsKKwkJY21kLT5jb252ZXJ0X2FyZyA9IDIwMDA7CisJCWVycisrOworCX0KKwlpZiAoZXJyKSB7CisJCXJldHVybiAzOworCX0KKworCS8qCisJICogU3RhZ2UgNC4gQ2hlY2sgZm9yIGFyZ3VtZW50IGNvbmZsaWN0cy4KKwkgKi8KKwlpZiAoY21kLT5zdGFydF9zcmMgPT0gVFJJR19OT1cgJiYKKwkJY21kLT5zY2FuX2JlZ2luX3NyYyA9PSBUUklHX1RJTUVSICYmCisJCWNtZC0+Y29udmVydF9zcmMgPT0gVFJJR19USU1FUikgeworCisJCS8qIENoZWNrIHRpbWVyIGFyZ3VtZW50cyAqLworCQlpZiAoaW5pdF90aWNrcyA8IE1FNDAwMF9BSV9NSU5fVElDS1MpIHsKKwkJCXByaW50ayhLRVJOX0VSUgorCQkJCSJjb21lZGklZDogbWU0MDAwOiBtZTQwMDBfYWlfZG9fY21kX3Rlc3QoKTogSW52YWxpZCBzdGFydCBhcmdcbiIsCisJCQkJZGV2LT5taW5vcik7CisJCQljbWQtPnN0YXJ0X2FyZyA9IDIwMDA7CS8vIDY2IHRpY2tzIGF0IGxlYXN0CisJCQllcnIrKzsKKwkJfQorCQlpZiAoY2hhbl90aWNrcyA8IE1FNDAwMF9BSV9NSU5fVElDS1MpIHsKKwkJCXByaW50ayhLRVJOX0VSUgorCQkJCSJjb21lZGklZDogbWU0MDAwOiBtZTQwMDBfYWlfZG9fY21kX3Rlc3QoKTogSW52YWxpZCBjb252ZXJ0IGFyZ1xuIiwKKwkJCQlkZXYtPm1pbm9yKTsKKwkJCWNtZC0+Y29udmVydF9hcmcgPSAyMDAwOwkvLyA2NiB0aWNrcyBhdCBsZWFzdAorCQkJZXJyKys7CisJCX0KKwkJaWYgKHNjYW5fdGlja3MgPD0gY21kLT5jaGFubGlzdF9sZW4gKiBjaGFuX3RpY2tzKSB7CisJCQlwcmludGsoS0VSTl9FUlIKKwkJCQkiY29tZWRpJWQ6IG1lNDAwMDogbWU0MDAwX2FpX2RvX2NtZF90ZXN0KCk6IEludmFsaWQgc2NhbiBlbmQgYXJnXG4iLAorCQkJCWRldi0+bWlub3IpOworCQkJY21kLT5zY2FuX2VuZF9hcmcgPSAyMDAwICogY21kLT5jaGFubGlzdF9sZW4gKyAzMTsJLy8gQXQgbGVhc3Qgb25lIHRpY2sgbW9yZQorCQkJZXJyKys7CisJCX0KKwl9IGVsc2UgaWYgKGNtZC0+c3RhcnRfc3JjID09IFRSSUdfTk9XICYmCisJCWNtZC0+c2Nhbl9iZWdpbl9zcmMgPT0gVFJJR19GT0xMT1cgJiYKKwkJY21kLT5jb252ZXJ0X3NyYyA9PSBUUklHX1RJTUVSKSB7CisKKwkJLyogQ2hlY2sgdGltZXIgYXJndW1lbnRzICovCisJCWlmIChpbml0X3RpY2tzIDwgTUU0MDAwX0FJX01JTl9USUNLUykgeworCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkJImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9haV9kb19jbWRfdGVzdCgpOiBJbnZhbGlkIHN0YXJ0IGFyZ1xuIiwKKwkJCQlkZXYtPm1pbm9yKTsKKwkJCWNtZC0+c3RhcnRfYXJnID0gMjAwMDsJLy8gNjYgdGlja3MgYXQgbGVhc3QKKwkJCWVycisrOworCQl9CisJCWlmIChjaGFuX3RpY2tzIDwgTUU0MDAwX0FJX01JTl9USUNLUykgeworCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkJImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9haV9kb19jbWRfdGVzdCgpOiBJbnZhbGlkIGNvbnZlcnQgYXJnXG4iLAorCQkJCWRldi0+bWlub3IpOworCQkJY21kLT5jb252ZXJ0X2FyZyA9IDIwMDA7CS8vIDY2IHRpY2tzIGF0IGxlYXN0CisJCQllcnIrKzsKKwkJfQorCX0gZWxzZSBpZiAoY21kLT5zdGFydF9zcmMgPT0gVFJJR19FWFQgJiYKKwkJY21kLT5zY2FuX2JlZ2luX3NyYyA9PSBUUklHX1RJTUVSICYmCisJCWNtZC0+Y29udmVydF9zcmMgPT0gVFJJR19USU1FUikgeworCisJCS8qIENoZWNrIHRpbWVyIGFyZ3VtZW50cyAqLworCQlpZiAoaW5pdF90aWNrcyA8IE1FNDAwMF9BSV9NSU5fVElDS1MpIHsKKwkJCXByaW50ayhLRVJOX0VSUgorCQkJCSJjb21lZGklZDogbWU0MDAwOiBtZTQwMDBfYWlfZG9fY21kX3Rlc3QoKTogSW52YWxpZCBzdGFydCBhcmdcbiIsCisJCQkJZGV2LT5taW5vcik7CisJCQljbWQtPnN0YXJ0X2FyZyA9IDIwMDA7CS8vIDY2IHRpY2tzIGF0IGxlYXN0CisJCQllcnIrKzsKKwkJfQorCQlpZiAoY2hhbl90aWNrcyA8IE1FNDAwMF9BSV9NSU5fVElDS1MpIHsKKwkJCXByaW50ayhLRVJOX0VSUgorCQkJCSJjb21lZGklZDogbWU0MDAwOiBtZTQwMDBfYWlfZG9fY21kX3Rlc3QoKTogSW52YWxpZCBjb252ZXJ0IGFyZ1xuIiwKKwkJCQlkZXYtPm1pbm9yKTsKKwkJCWNtZC0+Y29udmVydF9hcmcgPSAyMDAwOwkvLyA2NiB0aWNrcyBhdCBsZWFzdAorCQkJZXJyKys7CisJCX0KKwkJaWYgKHNjYW5fdGlja3MgPD0gY21kLT5jaGFubGlzdF9sZW4gKiBjaGFuX3RpY2tzKSB7CisJCQlwcmludGsoS0VSTl9FUlIKKwkJCQkiY29tZWRpJWQ6IG1lNDAwMDogbWU0MDAwX2FpX2RvX2NtZF90ZXN0KCk6IEludmFsaWQgc2NhbiBlbmQgYXJnXG4iLAorCQkJCWRldi0+bWlub3IpOworCQkJY21kLT5zY2FuX2VuZF9hcmcgPSAyMDAwICogY21kLT5jaGFubGlzdF9sZW4gKyAzMTsJLy8gQXQgbGVhc3Qgb25lIHRpY2sgbW9yZQorCQkJZXJyKys7CisJCX0KKwl9IGVsc2UgaWYgKGNtZC0+c3RhcnRfc3JjID09IFRSSUdfRVhUICYmCisJCWNtZC0+c2Nhbl9iZWdpbl9zcmMgPT0gVFJJR19GT0xMT1cgJiYKKwkJY21kLT5jb252ZXJ0X3NyYyA9PSBUUklHX1RJTUVSKSB7CisKKwkJLyogQ2hlY2sgdGltZXIgYXJndW1lbnRzICovCisJCWlmIChpbml0X3RpY2tzIDwgTUU0MDAwX0FJX01JTl9USUNLUykgeworCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkJImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9haV9kb19jbWRfdGVzdCgpOiBJbnZhbGlkIHN0YXJ0IGFyZ1xuIiwKKwkJCQlkZXYtPm1pbm9yKTsKKwkJCWNtZC0+c3RhcnRfYXJnID0gMjAwMDsJLy8gNjYgdGlja3MgYXQgbGVhc3QKKwkJCWVycisrOworCQl9CisJCWlmIChjaGFuX3RpY2tzIDwgTUU0MDAwX0FJX01JTl9USUNLUykgeworCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkJImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9haV9kb19jbWRfdGVzdCgpOiBJbnZhbGlkIGNvbnZlcnQgYXJnXG4iLAorCQkJCWRldi0+bWlub3IpOworCQkJY21kLT5jb252ZXJ0X2FyZyA9IDIwMDA7CS8vIDY2IHRpY2tzIGF0IGxlYXN0CisJCQllcnIrKzsKKwkJfQorCX0gZWxzZSBpZiAoY21kLT5zdGFydF9zcmMgPT0gVFJJR19FWFQgJiYKKwkJY21kLT5zY2FuX2JlZ2luX3NyYyA9PSBUUklHX0VYVCAmJgorCQljbWQtPmNvbnZlcnRfc3JjID09IFRSSUdfVElNRVIpIHsKKworCQkvKiBDaGVjayB0aW1lciBhcmd1bWVudHMgKi8KKwkJaWYgKGluaXRfdGlja3MgPCBNRTQwMDBfQUlfTUlOX1RJQ0tTKSB7CisJCQlwcmludGsoS0VSTl9FUlIKKwkJCQkiY29tZWRpJWQ6IG1lNDAwMDogbWU0MDAwX2FpX2RvX2NtZF90ZXN0KCk6IEludmFsaWQgc3RhcnQgYXJnXG4iLAorCQkJCWRldi0+bWlub3IpOworCQkJY21kLT5zdGFydF9hcmcgPSAyMDAwOwkvLyA2NiB0aWNrcyBhdCBsZWFzdAorCQkJZXJyKys7CisJCX0KKwkJaWYgKGNoYW5fdGlja3MgPCBNRTQwMDBfQUlfTUlOX1RJQ0tTKSB7CisJCQlwcmludGsoS0VSTl9FUlIKKwkJCQkiY29tZWRpJWQ6IG1lNDAwMDogbWU0MDAwX2FpX2RvX2NtZF90ZXN0KCk6IEludmFsaWQgY29udmVydCBhcmdcbiIsCisJCQkJZGV2LT5taW5vcik7CisJCQljbWQtPmNvbnZlcnRfYXJnID0gMjAwMDsJLy8gNjYgdGlja3MgYXQgbGVhc3QKKwkJCWVycisrOworCQl9CisJfSBlbHNlIGlmIChjbWQtPnN0YXJ0X3NyYyA9PSBUUklHX0VYVCAmJgorCQljbWQtPnNjYW5fYmVnaW5fc3JjID09IFRSSUdfRVhUICYmCisJCWNtZC0+Y29udmVydF9zcmMgPT0gVFJJR19FWFQpIHsKKworCQkvKiBDaGVjayB0aW1lciBhcmd1bWVudHMgKi8KKwkJaWYgKGluaXRfdGlja3MgPCBNRTQwMDBfQUlfTUlOX1RJQ0tTKSB7CisJCQlwcmludGsoS0VSTl9FUlIKKwkJCQkiY29tZWRpJWQ6IG1lNDAwMDogbWU0MDAwX2FpX2RvX2NtZF90ZXN0KCk6IEludmFsaWQgc3RhcnQgYXJnXG4iLAorCQkJCWRldi0+bWlub3IpOworCQkJY21kLT5zdGFydF9hcmcgPSAyMDAwOwkvLyA2NiB0aWNrcyBhdCBsZWFzdAorCQkJZXJyKys7CisJCX0KKwl9CisJaWYgKGNtZC0+c3RvcF9zcmMgPT0gVFJJR19DT1VOVCkgeworCQlpZiAoY21kLT5zdG9wX2FyZyA9PSAwKSB7CisJCQlwcmludGsoS0VSTl9FUlIKKwkJCQkiY29tZWRpJWQ6IG1lNDAwMDogbWU0MDAwX2FpX2RvX2NtZF90ZXN0KCk6IEludmFsaWQgc3RvcCBhcmdcbiIsCisJCQkJZGV2LT5taW5vcik7CisJCQljbWQtPnN0b3BfYXJnID0gMTsKKwkJCWVycisrOworCQl9CisJfQorCWlmIChjbWQtPnNjYW5fZW5kX3NyYyA9PSBUUklHX0NPVU5UKSB7CisJCWlmIChjbWQtPnNjYW5fZW5kX2FyZyA9PSAwKSB7CisJCQlwcmludGsoS0VSTl9FUlIKKwkJCQkiY29tZWRpJWQ6IG1lNDAwMDogbWU0MDAwX2FpX2RvX2NtZF90ZXN0KCk6IEludmFsaWQgc2NhbiBlbmQgYXJnXG4iLAorCQkJCWRldi0+bWlub3IpOworCQkJY21kLT5zY2FuX2VuZF9hcmcgPSAxOworCQkJZXJyKys7CisJCX0KKwl9CisJaWYgKGVycikgeworCQlyZXR1cm4gNDsKKwl9CisKKwkvKgorCSAqIFN0YWdlIDUuIENoZWNrIHRoZSBjaGFubmVsIGxpc3QuCisJICovCisJaWYgKGFpX2NoZWNrX2NoYW5saXN0KGRldiwgcywgY21kKSkKKwkJcmV0dXJuIDU7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlycXJldHVybl90IG1lNDAwMF9haV9pc3IoaW50IGlycSwgdm9pZCAqZGV2X2lkIFBUX1JFR1NfQVJHKQoreworCXVuc2lnbmVkIGludCB0bXA7CisJY29tZWRpX2RldmljZSAqZGV2ID0gZGV2X2lkOworCWNvbWVkaV9zdWJkZXZpY2UgKnMgPSBkZXYtPnN1YmRldmljZXM7CisJbWU0MDAwX2FpX2NvbnRleHRfdCAqYWlfY29udGV4dCA9ICZpbmZvLT5haV9jb250ZXh0OworCWludCBpOworCWludCBjID0gMDsKKwlsb25nIGx2YWw7CisKKwlJU1JfUERFQlVHKCJtZTQwMDBfYWlfaXNyKCkgaXMgZXhlY3V0ZWRcbiIpOworCisJaWYgKCFkZXYtPmF0dGFjaGVkKSB7CisJCUlTUl9QREVCVUcoIm1lNDAwMF9haV9pc3IoKSBwcmVtYXR1cmUgaW50ZXJydXB0XG4iKTsKKwkJcmV0dXJuIElSUV9OT05FOworCX0KKworCS8qIFJlc2V0IGFsbCBldmVudHMgKi8KKwlzLT5hc3luYy0+ZXZlbnRzID0gMDsKKworCS8qIENoZWNrIGlmIGlycSBudW1iZXIgaXMgcmlnaHQgKi8KKwlpZiAoaXJxICE9IGFpX2NvbnRleHQtPmlycSkgeworCQlwcmludGsoS0VSTl9FUlIKKwkJCSJjb21lZGklZDogbWU0MDAwOiBtZTQwMDBfYWlfaXNyKCk6IEluY29ycmVjdCBpbnRlcnJ1cHQgbnVtOiAlZFxuIiwKKwkJCWRldi0+bWlub3IsIGlycSk7CisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9CisKKwlpZiAobWU0MDAwX2lubChkZXYsCisJCQlhaV9jb250ZXh0LT4KKwkJCWlycV9zdGF0dXNfcmVnKSAmIE1FNDAwMF9JUlFfU1RBVFVTX0JJVF9BSV9IRikgeworCQlJU1JfUERFQlVHCisJCQkoIm1lNDAwMF9haV9pc3IoKTogRmlmbyBoYWxmIGZ1bGwgaW50ZXJydXB0IG9jY3VyZWRcbiIpOworCisJCS8qIFJlYWQgc3RhdHVzIHJlZ2lzdGVyIHRvIGZpbmQgb3V0IHdoYXQgaGFwcGVuZWQgKi8KKwkJdG1wID0gbWU0MDAwX2lubChkZXYsIGFpX2NvbnRleHQtPmN0cmxfcmVnKTsKKworCQlpZiAoISh0bXAgJiBNRTQwMDBfQUlfU1RBVFVTX0JJVF9GRl9EQVRBKSAmJgorCQkJISh0bXAgJiBNRTQwMDBfQUlfU1RBVFVTX0JJVF9IRl9EQVRBKSAmJgorCQkJKHRtcCAmIE1FNDAwMF9BSV9TVEFUVVNfQklUX0VGX0RBVEEpKSB7CisJCQlJU1JfUERFQlVHKCJtZTQwMDBfYWlfaXNyKCk6IEZpZm8gZnVsbFxuIik7CisJCQljID0gTUU0MDAwX0FJX0ZJRk9fQ09VTlQ7CisKKwkJCS8qIEZJRk8gb3ZlcmZsb3csIHNvIHN0b3AgY29udmVyc2lvbiBhbmQgZGlzYWJsZSBhbGwgaW50ZXJydXB0cyAqLworCQkJdG1wIHw9IE1FNDAwMF9BSV9DVFJMX0JJVF9JTU1FRElBVEVfU1RPUDsKKwkJCXRtcCAmPSB+KE1FNDAwMF9BSV9DVFJMX0JJVF9IRl9JUlEgfAorCQkJCU1FNDAwMF9BSV9DVFJMX0JJVF9TQ19JUlEpOworCQkJbWU0MDAwX291dGwoZGV2LCB0bXAsIGFpX2NvbnRleHQtPmN0cmxfcmVnKTsKKworCQkJcy0+YXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRVJST1IgfCBDT01FRElfQ0JfRU9BOworCisJCQlwcmludGsoS0VSTl9FUlIKKwkJCQkiY29tZWRpJWQ6IG1lNDAwMDogbWU0MDAwX2FpX2lzcigpOiBGSUZPIG92ZXJmbG93XG4iLAorCQkJCWRldi0+bWlub3IpOworCQl9IGVsc2UgaWYgKCh0bXAgJiBNRTQwMDBfQUlfU1RBVFVTX0JJVF9GRl9EQVRBKQorCQkJJiYgISh0bXAgJiBNRTQwMDBfQUlfU1RBVFVTX0JJVF9IRl9EQVRBKQorCQkJJiYgKHRtcCAmIE1FNDAwMF9BSV9TVEFUVVNfQklUX0VGX0RBVEEpKSB7CisJCQlJU1JfUERFQlVHKCJtZTQwMDBfYWlfaXNyKCk6IEZpZm8gaGFsZiBmdWxsXG4iKTsKKworCQkJcy0+YXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfQkxPQ0s7CisKKwkJCWMgPSBNRTQwMDBfQUlfRklGT19DT1VOVCAvIDI7CisJCX0gZWxzZSB7CisJCQlwcmludGsoS0VSTl9FUlIKKwkJCQkiY29tZWRpJWQ6IG1lNDAwMDogbWU0MDAwX2FpX2lzcigpOiBDYW4ndCBkZXRlcm1pbmUgc3RhdGUgb2YgZmlmb1xuIiwKKwkJCQlkZXYtPm1pbm9yKTsKKwkJCWMgPSAwOworCisJCQkvKiBVbmRlZmluZWQgc3RhdGUsIHNvIHN0b3AgY29udmVyc2lvbiBhbmQgZGlzYWJsZSBhbGwgaW50ZXJydXB0cyAqLworCQkJdG1wIHw9IE1FNDAwMF9BSV9DVFJMX0JJVF9JTU1FRElBVEVfU1RPUDsKKwkJCXRtcCAmPSB+KE1FNDAwMF9BSV9DVFJMX0JJVF9IRl9JUlEgfAorCQkJCU1FNDAwMF9BSV9DVFJMX0JJVF9TQ19JUlEpOworCQkJbWU0MDAwX291dGwoZGV2LCB0bXAsIGFpX2NvbnRleHQtPmN0cmxfcmVnKTsKKworCQkJcy0+YXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRVJST1IgfCBDT01FRElfQ0JfRU9BOworCisJCQlwcmludGsoS0VSTl9FUlIKKwkJCQkiY29tZWRpJWQ6IG1lNDAwMDogbWU0MDAwX2FpX2lzcigpOiBVbmRlZmluZWQgRklGTyBzdGF0ZVxuIiwKKwkJCQlkZXYtPm1pbm9yKTsKKwkJfQorCisJCUlTUl9QREVCVUcoIm1lNDAwMF9haV9pc3IoKTogVHJ5IHRvIHJlYWQgJWQgdmFsdWVzXG4iLCBjKTsKKworCQlmb3IgKGkgPSAwOyBpIDwgYzsgaSsrKSB7CisJCQkvKiBSZWFkIHZhbHVlIGZyb20gZGF0YSBmaWZvICovCisJCQlsdmFsID0gaW5sKGFpX2NvbnRleHQtPmRhdGFfcmVnKSAmIDB4RkZGRjsKKwkJCWx2YWwgXj0gMHg4MDAwOworCisJCQlpZiAoIWNvbWVkaV9idWZfcHV0KHMtPmFzeW5jLCBsdmFsKSkgeworCQkJCS8qIEJ1ZmZlciBvdmVyZmxvdywgc28gc3RvcCBjb252ZXJzaW9uIGFuZCBkaXNhYmxlIGFsbCBpbnRlcnJ1cHRzICovCisJCQkJdG1wIHw9IE1FNDAwMF9BSV9DVFJMX0JJVF9JTU1FRElBVEVfU1RPUDsKKwkJCQl0bXAgJj0gfihNRTQwMDBfQUlfQ1RSTF9CSVRfSEZfSVJRIHwKKwkJCQkJTUU0MDAwX0FJX0NUUkxfQklUX1NDX0lSUSk7CisJCQkJbWU0MDAwX291dGwoZGV2LCB0bXAsIGFpX2NvbnRleHQtPmN0cmxfcmVnKTsKKworCQkJCXMtPmFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX09WRVJGTE9XOworCisJCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkJCSJjb21lZGklZDogbWU0MDAwOiBtZTQwMDBfYWlfaXNyKCk6IEJ1ZmZlciBvdmVyZmxvd1xuIiwKKwkJCQkJZGV2LT5taW5vcik7CisKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCS8qIFdvcmsgaXMgZG9uZSwgc28gcmVzZXQgdGhlIGludGVycnVwdCAqLworCQlJU1JfUERFQlVHKCJtZTQwMDBfYWlfaXNyKCk6IFJlc2V0IGZpZm8gaGFsZiBmdWxsIGludGVycnVwdFxuIik7CisJCXRtcCB8PSBNRTQwMDBfQUlfQ1RSTF9CSVRfSEZfSVJRX1JFU0VUOworCQltZTQwMDBfb3V0bChkZXYsIHRtcCwgYWlfY29udGV4dC0+Y3RybF9yZWcpOworCQl0bXAgJj0gfk1FNDAwMF9BSV9DVFJMX0JJVF9IRl9JUlFfUkVTRVQ7CisJCW1lNDAwMF9vdXRsKGRldiwgdG1wLCBhaV9jb250ZXh0LT5jdHJsX3JlZyk7CisJfQorCisJaWYgKG1lNDAwMF9pbmwoZGV2LAorCQkJYWlfY29udGV4dC0+CisJCQlpcnFfc3RhdHVzX3JlZykgJiBNRTQwMDBfSVJRX1NUQVRVU19CSVRfU0MpIHsKKwkJSVNSX1BERUJVRworCQkJKCJtZTQwMDBfYWlfaXNyKCk6IFNhbXBsZSBjb3VudGVyIGludGVycnVwdCBvY2N1cmVkXG4iKTsKKworCQlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9CTE9DSyB8IENPTUVESV9DQl9FT0E7CisKKwkJLyogQWNxdWlzaXRpb24gaXMgY29tcGxldGUsIHNvIHN0b3AgY29udmVyc2lvbiBhbmQgZGlzYWJsZSBhbGwgaW50ZXJydXB0cyAqLworCQl0bXAgPSBtZTQwMDBfaW5sKGRldiwgYWlfY29udGV4dC0+Y3RybF9yZWcpOworCQl0bXAgfD0gTUU0MDAwX0FJX0NUUkxfQklUX0lNTUVESUFURV9TVE9QOworCQl0bXAgJj0gfihNRTQwMDBfQUlfQ1RSTF9CSVRfSEZfSVJRIHwgTUU0MDAwX0FJX0NUUkxfQklUX1NDX0lSUSk7CisJCW1lNDAwMF9vdXRsKGRldiwgdG1wLCBhaV9jb250ZXh0LT5jdHJsX3JlZyk7CisKKwkJLyogUG9sbCBkYXRhIHVudGlsIGZpZm8gZW1wdHkgKi8KKwkJd2hpbGUgKGlubChhaV9jb250ZXh0LT5jdHJsX3JlZykgJiBNRTQwMDBfQUlfU1RBVFVTX0JJVF9FRl9EQVRBKSB7CisJCQkvKiBSZWFkIHZhbHVlIGZyb20gZGF0YSBmaWZvICovCisJCQlsdmFsID0gaW5sKGFpX2NvbnRleHQtPmRhdGFfcmVnKSAmIDB4RkZGRjsKKwkJCWx2YWwgXj0gMHg4MDAwOworCisJCQlpZiAoIWNvbWVkaV9idWZfcHV0KHMtPmFzeW5jLCBsdmFsKSkgeworCQkJCXByaW50ayhLRVJOX0VSUgorCQkJCQkiY29tZWRpJWQ6IG1lNDAwMDogbWU0MDAwX2FpX2lzcigpOiBCdWZmZXIgb3ZlcmZsb3dcbiIsCisJCQkJCWRldi0+bWlub3IpOworCQkJCXMtPmFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX09WRVJGTE9XOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJLyogV29yayBpcyBkb25lLCBzbyByZXNldCB0aGUgaW50ZXJydXB0ICovCisJCUlTUl9QREVCVUcKKwkJCSgibWU0MDAwX2FpX2lzcigpOiBSZXNldCBpbnRlcnJ1cHQgZnJvbSBzYW1wbGUgY291bnRlclxuIik7CisJCXRtcCB8PSBNRTQwMDBfQUlfQ1RSTF9CSVRfU0NfSVJRX1JFU0VUOworCQltZTQwMDBfb3V0bChkZXYsIHRtcCwgYWlfY29udGV4dC0+Y3RybF9yZWcpOworCQl0bXAgJj0gfk1FNDAwMF9BSV9DVFJMX0JJVF9TQ19JUlFfUkVTRVQ7CisJCW1lNDAwMF9vdXRsKGRldiwgdG1wLCBhaV9jb250ZXh0LT5jdHJsX3JlZyk7CisJfQorCisJSVNSX1BERUJVRygibWU0MDAwX2FpX2lzcigpOiBFdmVudHMgPSAweCVYXG4iLCBzLT5hc3luYy0+ZXZlbnRzKTsKKworCWlmIChzLT5hc3luYy0+ZXZlbnRzKQorCQljb21lZGlfZXZlbnQoZGV2LCBzKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBBbmFsb2cgb3V0cHV0IHNlY3Rpb24KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIGludCBtZTQwMDBfYW9faW5zbl93cml0ZShjb21lZGlfZGV2aWNlICogZGV2LAorCWNvbWVkaV9zdWJkZXZpY2UgKiBzLCBjb21lZGlfaW5zbiAqIGluc24sIGxzYW1wbF90ICogZGF0YSkKK3sKKworCWludCBjaGFuID0gQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyk7CisJaW50IHJhbmcgPSBDUl9SQU5HRShpbnNuLT5jaGFuc3BlYyk7CisJaW50IGFyZWYgPSBDUl9BUkVGKGluc24tPmNoYW5zcGVjKTsKKwl1bnNpZ25lZCBsb25nIHRtcDsKKworCUNBTExfUERFQlVHKCJJbiBtZTQwMDBfYW9faW5zbl93cml0ZSgpXG4iKTsKKworCWlmIChpbnNuLT5uID09IDApIHsKKwkJcmV0dXJuIDA7CisJfSBlbHNlIGlmIChpbnNuLT5uID4gMSkgeworCQlwcmludGsoS0VSTl9FUlIKKwkJCSJjb21lZGklZDogbWU0MDAwOiBtZTQwMDBfYW9faW5zbl93cml0ZSgpOiBJbnZhbGlkIGluc3RydWN0aW9uIGxlbmd0aCAlZFxuIiwKKwkJCWRldi0+bWlub3IsIGluc24tPm4pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoY2hhbiA+PSB0aGlzYm9hcmQtPmFvLmNvdW50KSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkJImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9hb19pbnNuX3dyaXRlKCk6IEludmFsaWQgY2hhbm5lbCAlZFxuIiwKKwkJCWRldi0+bWlub3IsIGluc24tPm4pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAocmFuZyAhPSAwKSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkJImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9hb19pbnNuX3dyaXRlKCk6IEludmFsaWQgcmFuZ2UgJWRcbiIsCisJCQlkZXYtPm1pbm9yLCBpbnNuLT5uKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGFyZWYgIT0gQVJFRl9HUk9VTkQgJiYgYXJlZiAhPSBBUkVGX0NPTU1PTikgeworCQlwcmludGsoS0VSTl9FUlIKKwkJCSJjb21lZGklZDogbWU0MDAwOiBtZTQwMDBfYW9faW5zbl93cml0ZSgpOiBJbnZhbGlkIGFyZWYgJWRcbiIsCisJCQlkZXYtPm1pbm9yLCBpbnNuLT5uKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogU3RvcCBhbnkgcnVubmluZyBjb252ZXJzaW9uICovCisJdG1wID0gbWU0MDAwX2lubChkZXYsIGluZm8tPmFvX2NvbnRleHRbY2hhbl0uY3RybF9yZWcpOworCXRtcCB8PSBNRTQwMDBfQU9fQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1A7CisJbWU0MDAwX291dGwoZGV2LCB0bXAsIGluZm8tPmFvX2NvbnRleHRbY2hhbl0uY3RybF9yZWcpOworCisJLyogQ2xlYXIgY29udHJvbCByZWdpc3RlciBhbmQgc2V0IHRvIHNpbmdsZSBtb2RlICovCisJbWU0MDAwX291dGwoZGV2LCAweDAsIGluZm8tPmFvX2NvbnRleHRbY2hhbl0uY3RybF9yZWcpOworCisJLyogV3JpdGUgZGF0YSB2YWx1ZSAqLworCW1lNDAwMF9vdXRsKGRldiwgZGF0YVswXSwgaW5mby0+YW9fY29udGV4dFtjaGFuXS5zaW5nbGVfcmVnKTsKKworCS8qIFN0b3JlIGluIHRoZSBtaXJyb3IgKi8KKwlpbmZvLT5hb19jb250ZXh0W2NoYW5dLm1pcnJvciA9IGRhdGFbMF07CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBtZTQwMDBfYW9faW5zbl9yZWFkKGNvbWVkaV9kZXZpY2UgKiBkZXYsCisJY29tZWRpX3N1YmRldmljZSAqIHMsIGNvbWVkaV9pbnNuICogaW5zbiwgbHNhbXBsX3QgKiBkYXRhKQoreworCWludCBjaGFuID0gQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyk7CisKKwlpZiAoaW5zbi0+biA9PSAwKSB7CisJCXJldHVybiAwOworCX0gZWxzZSBpZiAoaW5zbi0+biA+IDEpIHsKKwkJcHJpbnRrKCJjb21lZGklZDogbWU0MDAwOiBtZTQwMDBfYW9faW5zbl9yZWFkKCk6IEludmFsaWQgaW5zdHJ1Y3Rpb24gbGVuZ3RoXG4iLCBkZXYtPm1pbm9yKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZGF0YVswXSA9IGluZm8tPmFvX2NvbnRleHRbY2hhbl0ubWlycm9yOworCisJcmV0dXJuIDE7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRGlnaXRhbCBJL08gc2VjdGlvbgorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgaW50IG1lNDAwMF9kaW9faW5zbl9iaXRzKGNvbWVkaV9kZXZpY2UgKiBkZXYsCisJY29tZWRpX3N1YmRldmljZSAqIHMsIGNvbWVkaV9pbnNuICogaW5zbiwgbHNhbXBsX3QgKiBkYXRhKQoreworCisJQ0FMTF9QREVCVUcoIkluIG1lNDAwMF9kaW9faW5zbl9iaXRzKClcbiIpOworCisJLyogTGVuZ3RoIG9mIGRhdGEgbXVzdCBiZSAyIChtYXNrIGFuZCBuZXcgZGF0YSwgc2VlIGJlbG93KSAqLworCWlmIChpbnNuLT5uID09IDApIHsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChpbnNuLT5uICE9IDIpIHsKKwkJcHJpbnRrKCJjb21lZGklZDogbWU0MDAwOiBtZTQwMDBfZGlvX2luc25fYml0cygpOiBJbnZhbGlkIGluc3RydWN0aW9uIGxlbmd0aFxuIiwgZGV2LT5taW5vcik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qCisJICogVGhlIGluc24gZGF0YSBjb25zaXN0cyBvZiBhIG1hc2sgaW4gZGF0YVswXSBhbmQgdGhlIG5ldyBkYXRhCisJICogaW4gZGF0YVsxXS4gVGhlIG1hc2sgZGVmaW5lcyB3aGljaCBiaXRzIHdlIGFyZSBjb25jZXJuaW5nIGFib3V0LgorCSAqIFRoZSBuZXcgZGF0YSBtdXN0IGJlIGFuZGVkIHdpdGggdGhlIG1hc2suCisJICogRWFjaCBjaGFubmVsIGNvcnJlc3BvbmRzIHRvIGEgYml0LgorCSAqLworCWlmIChkYXRhWzBdKSB7CisJCS8qIENoZWNrIGlmIHJlcXVlc3RlZCBwb3J0cyBhcmUgY29uZmlndXJlZCBmb3Igb3V0cHV0ICovCisJCWlmICgocy0+aW9fYml0cyAmIGRhdGFbMF0pICE9IGRhdGFbMF0pCisJCQlyZXR1cm4gLUVJTzsKKworCQlzLT5zdGF0ZSAmPSB+ZGF0YVswXTsKKwkJcy0+c3RhdGUgfD0gZGF0YVswXSAmIGRhdGFbMV07CisKKwkJLyogV3JpdGUgb3V0IHRoZSBuZXcgZGlnaXRhbCBvdXRwdXQgbGluZXMgKi8KKwkJbWU0MDAwX291dGwoZGV2LCAocy0+c3RhdGUgPj4gMCkgJiAweEZGLAorCQkJaW5mby0+ZGlvX2NvbnRleHQucG9ydF8wX3JlZyk7CisJCW1lNDAwMF9vdXRsKGRldiwgKHMtPnN0YXRlID4+IDgpICYgMHhGRiwKKwkJCWluZm8tPmRpb19jb250ZXh0LnBvcnRfMV9yZWcpOworCQltZTQwMDBfb3V0bChkZXYsIChzLT5zdGF0ZSA+PiAxNikgJiAweEZGLAorCQkJaW5mby0+ZGlvX2NvbnRleHQucG9ydF8yX3JlZyk7CisJCW1lNDAwMF9vdXRsKGRldiwgKHMtPnN0YXRlID4+IDI0KSAmIDB4RkYsCisJCQlpbmZvLT5kaW9fY29udGV4dC5wb3J0XzNfcmVnKTsKKwl9CisKKwkvKiBPbiByZXR1cm4sIGRhdGFbMV0gY29udGFpbnMgdGhlIHZhbHVlIG9mCisJICAgdGhlIGRpZ2l0YWwgaW5wdXQgYW5kIG91dHB1dCBsaW5lcy4gKi8KKwlkYXRhWzFdID0KKwkJKChtZTQwMDBfaW5sKGRldiwgaW5mby0+ZGlvX2NvbnRleHQucG9ydF8wX3JlZykgJiAweEZGKSA8PCAwKSB8CisJCSgobWU0MDAwX2lubChkZXYsIGluZm8tPmRpb19jb250ZXh0LnBvcnRfMV9yZWcpICYgMHhGRikgPDwgOCkgfAorCQkoKG1lNDAwMF9pbmwoZGV2LCBpbmZvLT5kaW9fY29udGV4dC5wb3J0XzJfcmVnKSAmIDB4RkYpIDw8IDE2KSB8CisJCSgobWU0MDAwX2lubChkZXYsIGluZm8tPmRpb19jb250ZXh0LnBvcnRfM19yZWcpICYgMHhGRikgPDwgMjQpOworCisJcmV0dXJuIDI7Cit9CisKK3N0YXRpYyBpbnQgbWU0MDAwX2Rpb19pbnNuX2NvbmZpZyhjb21lZGlfZGV2aWNlICogZGV2LAorCWNvbWVkaV9zdWJkZXZpY2UgKiBzLCBjb21lZGlfaW5zbiAqIGluc24sIGxzYW1wbF90ICogZGF0YSkKK3sKKwl1bnNpZ25lZCBsb25nIHRtcDsKKwlpbnQgY2hhbiA9IENSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpOworCisJQ0FMTF9QREVCVUcoIkluIG1lNDAwMF9kaW9faW5zbl9jb25maWcoKVxuIik7CisKKwlpZiAoZGF0YVswXSA9PSBJTlNOX0NPTkZJR19ESU9fUVVFUlkpIHsKKwkJZGF0YVsxXSA9CisJCQkocy0+CisJCQlpb19iaXRzICYgKDEgPDwgY2hhbikpID8gQ09NRURJX09VVFBVVCA6IENPTUVESV9JTlBVVDsKKwkJcmV0dXJuIGluc24tPm47CisJfQorCisJLyoKKwkgKiBUaGUgaW5wdXQgb3Igb3V0cHV0IGNvbmZpZ3VyYXRpb24gb2YgZWFjaCBkaWdpdGFsIGxpbmUgaXMKKwkgKiBjb25maWd1cmVkIGJ5IGEgc3BlY2lhbCBpbnNuX2NvbmZpZyBpbnN0cnVjdGlvbi4gIGNoYW5zcGVjCisJICogY29udGFpbnMgdGhlIGNoYW5uZWwgdG8gYmUgY2hhbmdlZCwgYW5kIGRhdGFbMF0gY29udGFpbnMgdGhlCisJICogdmFsdWUgQ09NRURJX0lOUFVUIG9yIENPTUVESV9PVVRQVVQuCisJICogT24gdGhlIE1FLTQwMDAgaXQgaXMgb25seSBwb3NzaWJsZSB0byBzd2l0Y2ggcG9ydCB3aXNlICg4IGJpdCkKKwkgKi8KKworCXRtcCA9IG1lNDAwMF9pbmwoZGV2LCBpbmZvLT5kaW9fY29udGV4dC5jdHJsX3JlZyk7CisKKwlpZiAoZGF0YVswXSA9PSBDT01FRElfT1VUUFVUKSB7CisJCWlmIChjaGFuIDwgOCkgeworCQkJcy0+aW9fYml0cyB8PSAweEZGOworCQkJdG1wICY9IH4oTUU0MDAwX0RJT19DVFJMX0JJVF9NT0RFXzAgfAorCQkJCU1FNDAwMF9ESU9fQ1RSTF9CSVRfTU9ERV8xKTsKKwkJCXRtcCB8PSBNRTQwMDBfRElPX0NUUkxfQklUX01PREVfMDsKKwkJfSBlbHNlIGlmIChjaGFuIDwgMTYpIHsKKwkJCS8qCisJCQkgKiBDaGVjaCBmb3Igb3B0b2lzb2xhdGVkIE1FLTQwMDAgdmVyc2lvbi4gSWYgb25lIHRoZSBmaXJzdAorCQkJICogcG9ydCBpcyBhIGZpeGVkIG91dHB1dCBwb3J0IGFuZCB0aGUgc2Vjb25kIGlzIGEgZml4ZWQgaW5wdXQgcG9ydC4KKwkJCSAqLworCQkJaWYgKCFtZTQwMDBfaW5sKGRldiwgaW5mby0+ZGlvX2NvbnRleHQuZGlyX3JlZykpCisJCQkJcmV0dXJuIC1FTk9ERVY7CisKKwkJCXMtPmlvX2JpdHMgfD0gMHhGRjAwOworCQkJdG1wICY9IH4oTUU0MDAwX0RJT19DVFJMX0JJVF9NT0RFXzIgfAorCQkJCU1FNDAwMF9ESU9fQ1RSTF9CSVRfTU9ERV8zKTsKKwkJCXRtcCB8PSBNRTQwMDBfRElPX0NUUkxfQklUX01PREVfMjsKKwkJfSBlbHNlIGlmIChjaGFuIDwgMjQpIHsKKwkJCXMtPmlvX2JpdHMgfD0gMHhGRjAwMDA7CisJCQl0bXAgJj0gfihNRTQwMDBfRElPX0NUUkxfQklUX01PREVfNCB8CisJCQkJTUU0MDAwX0RJT19DVFJMX0JJVF9NT0RFXzUpOworCQkJdG1wIHw9IE1FNDAwMF9ESU9fQ1RSTF9CSVRfTU9ERV80OworCQl9IGVsc2UgaWYgKGNoYW4gPCAzMikgeworCQkJcy0+aW9fYml0cyB8PSAweEZGMDAwMDAwOworCQkJdG1wICY9IH4oTUU0MDAwX0RJT19DVFJMX0JJVF9NT0RFXzYgfAorCQkJCU1FNDAwMF9ESU9fQ1RSTF9CSVRfTU9ERV83KTsKKwkJCXRtcCB8PSBNRTQwMDBfRElPX0NUUkxfQklUX01PREVfNjsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKGNoYW4gPCA4KSB7CisJCQkvKgorCQkJICogQ2hlY2ggZm9yIG9wdG9pc29sYXRlZCBNRS00MDAwIHZlcnNpb24uIElmIG9uZSB0aGUgZmlyc3QKKwkJCSAqIHBvcnQgaXMgYSBmaXhlZCBvdXRwdXQgcG9ydCBhbmQgdGhlIHNlY29uZCBpcyBhIGZpeGVkIGlucHV0IHBvcnQuCisJCQkgKi8KKwkJCWlmICghbWU0MDAwX2lubChkZXYsIGluZm8tPmRpb19jb250ZXh0LmRpcl9yZWcpKQorCQkJCXJldHVybiAtRU5PREVWOworCisJCQlzLT5pb19iaXRzICY9IH4weEZGOworCQkJdG1wICY9IH4oTUU0MDAwX0RJT19DVFJMX0JJVF9NT0RFXzAgfAorCQkJCU1FNDAwMF9ESU9fQ1RSTF9CSVRfTU9ERV8xKTsKKwkJfSBlbHNlIGlmIChjaGFuIDwgMTYpIHsKKwkJCXMtPmlvX2JpdHMgJj0gfjB4RkYwMDsKKwkJCXRtcCAmPSB+KE1FNDAwMF9ESU9fQ1RSTF9CSVRfTU9ERV8yIHwKKwkJCQlNRTQwMDBfRElPX0NUUkxfQklUX01PREVfMyk7CisJCX0gZWxzZSBpZiAoY2hhbiA8IDI0KSB7CisJCQlzLT5pb19iaXRzICY9IH4weEZGMDAwMDsKKwkJCXRtcCAmPSB+KE1FNDAwMF9ESU9fQ1RSTF9CSVRfTU9ERV80IHwKKwkJCQlNRTQwMDBfRElPX0NUUkxfQklUX01PREVfNSk7CisJCX0gZWxzZSBpZiAoY2hhbiA8IDMyKSB7CisJCQlzLT5pb19iaXRzICY9IH4weEZGMDAwMDAwOworCQkJdG1wICY9IH4oTUU0MDAwX0RJT19DVFJMX0JJVF9NT0RFXzYgfAorCQkJCU1FNDAwMF9ESU9fQ1RSTF9CSVRfTU9ERV83KTsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorCisJbWU0MDAwX291dGwoZGV2LCB0bXAsIGluZm8tPmRpb19jb250ZXh0LmN0cmxfcmVnKTsKKworCXJldHVybiAxOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIENvdW50ZXIgc2VjdGlvbgorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgaW50IGNudF9yZXNldChjb21lZGlfZGV2aWNlICogZGV2LCB1bnNpZ25lZCBpbnQgY2hhbm5lbCkKK3sKKworCUNBTExfUERFQlVHKCJJbiBjbnRfcmVzZXQoKVxuIik7CisKKwlzd2l0Y2ggKGNoYW5uZWwpIHsKKwljYXNlIDA6CisJCW1lNDAwMF9vdXRiKGRldiwgMHgzMCwgaW5mby0+Y250X2NvbnRleHQuY3RybF9yZWcpOworCQltZTQwMDBfb3V0YihkZXYsIDB4MDAsIGluZm8tPmNudF9jb250ZXh0LmNvdW50ZXJfMF9yZWcpOworCQltZTQwMDBfb3V0YihkZXYsIDB4MDAsIGluZm8tPmNudF9jb250ZXh0LmNvdW50ZXJfMF9yZWcpOworCQlicmVhazsKKwljYXNlIDE6CisJCW1lNDAwMF9vdXRiKGRldiwgMHg3MCwgaW5mby0+Y250X2NvbnRleHQuY3RybF9yZWcpOworCQltZTQwMDBfb3V0YihkZXYsIDB4MDAsIGluZm8tPmNudF9jb250ZXh0LmNvdW50ZXJfMV9yZWcpOworCQltZTQwMDBfb3V0YihkZXYsIDB4MDAsIGluZm8tPmNudF9jb250ZXh0LmNvdW50ZXJfMV9yZWcpOworCQlicmVhazsKKwljYXNlIDI6CisJCW1lNDAwMF9vdXRiKGRldiwgMHhCMCwgaW5mby0+Y250X2NvbnRleHQuY3RybF9yZWcpOworCQltZTQwMDBfb3V0YihkZXYsIDB4MDAsIGluZm8tPmNudF9jb250ZXh0LmNvdW50ZXJfMl9yZWcpOworCQltZTQwMDBfb3V0YihkZXYsIDB4MDAsIGluZm8tPmNudF9jb250ZXh0LmNvdW50ZXJfMl9yZWcpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9FUlIKKwkJCSJjb21lZGklZDogbWU0MDAwOiBjbnRfcmVzZXQoKTogSW52YWxpZCBjaGFubmVsXG4iLAorCQkJZGV2LT5taW5vcik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNudF9jb25maWcoY29tZWRpX2RldmljZSAqIGRldiwgdW5zaWduZWQgaW50IGNoYW5uZWwsCisJdW5zaWduZWQgaW50IG1vZGUpCit7CisJaW50IHRtcCA9IDA7CisKKwlDQUxMX1BERUJVRygiSW4gY250X2NvbmZpZygpXG4iKTsKKworCXN3aXRjaCAoY2hhbm5lbCkgeworCWNhc2UgMDoKKwkJdG1wIHw9IE1FNDAwMF9DTlRfQ09VTlRFUl8wOworCQlicmVhazsKKwljYXNlIDE6CisJCXRtcCB8PSBNRTQwMDBfQ05UX0NPVU5URVJfMTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQl0bXAgfD0gTUU0MDAwX0NOVF9DT1VOVEVSXzI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX0VSUgorCQkJImNvbWVkaSVkOiBtZTQwMDA6IGNudF9jb25maWcoKTogSW52YWxpZCBjaGFubmVsXG4iLAorCQkJZGV2LT5taW5vcik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXN3aXRjaCAobW9kZSkgeworCWNhc2UgMDoKKwkJdG1wIHw9IE1FNDAwMF9DTlRfTU9ERV8wOworCQlicmVhazsKKwljYXNlIDE6CisJCXRtcCB8PSBNRTQwMDBfQ05UX01PREVfMTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQl0bXAgfD0gTUU0MDAwX0NOVF9NT0RFXzI7CisJCWJyZWFrOworCWNhc2UgMzoKKwkJdG1wIHw9IE1FNDAwMF9DTlRfTU9ERV8zOworCQlicmVhazsKKwljYXNlIDQ6CisJCXRtcCB8PSBNRTQwMDBfQ05UX01PREVfNDsKKwkJYnJlYWs7CisJY2FzZSA1OgorCQl0bXAgfD0gTUU0MDAwX0NOVF9NT0RFXzU7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX0VSUgorCQkJImNvbWVkaSVkOiBtZTQwMDA6IGNudF9jb25maWcoKTogSW52YWxpZCBjb3VudGVyIG1vZGVcbiIsCisJCQlkZXYtPm1pbm9yKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogV3JpdGUgdGhlIGNvbnRyb2wgd29yZCAqLworCXRtcCB8PSAweDMwOworCW1lNDAwMF9vdXRiKGRldiwgdG1wLCBpbmZvLT5jbnRfY29udGV4dC5jdHJsX3JlZyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtZTQwMDBfY250X2luc25fY29uZmlnKGNvbWVkaV9kZXZpY2UgKiBkZXYsCisJY29tZWRpX3N1YmRldmljZSAqIHMsIGNvbWVkaV9pbnNuICogaW5zbiwgbHNhbXBsX3QgKiBkYXRhKQoreworCisJaW50IGVycjsKKworCUNBTExfUERFQlVHKCJJbiBtZTQwMDBfY250X2luc25fY29uZmlnKClcbiIpOworCisJc3dpdGNoIChkYXRhWzBdKSB7CisJY2FzZSBHUENUX1JFU0VUOgorCQlpZiAoaW5zbi0+biAhPSAxKSB7CisJCQlwcmludGsoS0VSTl9FUlIKKwkJCQkiY29tZWRpJWQ6IG1lNDAwMDogbWU0MDAwX2NudF9pbnNuX2NvbmZpZygpOiBJbnZhbGlkIGluc3RydWN0aW9uIGxlbmd0aCVkXG4iLAorCQkJCWRldi0+bWlub3IsIGluc24tPm4pOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQllcnIgPSBjbnRfcmVzZXQoZGV2LCBpbnNuLT5jaGFuc3BlYyk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCQlicmVhazsKKwljYXNlIEdQQ1RfU0VUX09QRVJBVElPTjoKKwkJaWYgKGluc24tPm4gIT0gMikgeworCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkJImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9jbnRfaW5zbl9jb25maWcoKTogSW52YWxpZCBpbnN0cnVjdGlvbiBsZW5ndGglZFxuIiwKKwkJCQlkZXYtPm1pbm9yLCBpbnNuLT5uKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJZXJyID0gY250X2NvbmZpZyhkZXYsIGluc24tPmNoYW5zcGVjLCBkYXRhWzFdKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX0VSUgorCQkJImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9jbnRfaW5zbl9jb25maWcoKTogSW52YWxpZCBpbnN0cnVjdGlvblxuIiwKKwkJCWRldi0+bWlub3IpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMjsKK30KKworc3RhdGljIGludCBtZTQwMDBfY250X2luc25fcmVhZChjb21lZGlfZGV2aWNlICogZGV2LAorCWNvbWVkaV9zdWJkZXZpY2UgKiBzLCBjb21lZGlfaW5zbiAqIGluc24sIGxzYW1wbF90ICogZGF0YSkKK3sKKworCXVuc2lnbmVkIHNob3J0IHRtcDsKKworCUNBTExfUERFQlVHKCJJbiBtZTQwMDBfY250X2luc25fcmVhZCgpXG4iKTsKKworCWlmIChpbnNuLT5uID09IDApIHsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChpbnNuLT5uID4gMSkgeworCQlwcmludGsoS0VSTl9FUlIKKwkJCSJjb21lZGklZDogbWU0MDAwOiBtZTQwMDBfY250X2luc25fcmVhZCgpOiBJbnZhbGlkIGluc3RydWN0aW9uIGxlbmd0aCAlZFxuIiwKKwkJCWRldi0+bWlub3IsIGluc24tPm4pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzd2l0Y2ggKGluc24tPmNoYW5zcGVjKSB7CisJY2FzZSAwOgorCQl0bXAgPSBtZTQwMDBfaW5iKGRldiwgaW5mby0+Y250X2NvbnRleHQuY291bnRlcl8wX3JlZyk7CisJCWRhdGFbMF0gPSB0bXA7CisJCXRtcCA9IG1lNDAwMF9pbmIoZGV2LCBpbmZvLT5jbnRfY29udGV4dC5jb3VudGVyXzBfcmVnKTsKKwkJZGF0YVswXSB8PSB0bXAgPDwgODsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQl0bXAgPSBtZTQwMDBfaW5iKGRldiwgaW5mby0+Y250X2NvbnRleHQuY291bnRlcl8xX3JlZyk7CisJCWRhdGFbMF0gPSB0bXA7CisJCXRtcCA9IG1lNDAwMF9pbmIoZGV2LCBpbmZvLT5jbnRfY29udGV4dC5jb3VudGVyXzFfcmVnKTsKKwkJZGF0YVswXSB8PSB0bXAgPDwgODsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQl0bXAgPSBtZTQwMDBfaW5iKGRldiwgaW5mby0+Y250X2NvbnRleHQuY291bnRlcl8yX3JlZyk7CisJCWRhdGFbMF0gPSB0bXA7CisJCXRtcCA9IG1lNDAwMF9pbmIoZGV2LCBpbmZvLT5jbnRfY29udGV4dC5jb3VudGVyXzJfcmVnKTsKKwkJZGF0YVswXSB8PSB0bXAgPDwgODsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fRVJSCisJCQkiY29tZWRpJWQ6IG1lNDAwMDogbWU0MDAwX2NudF9pbnNuX3JlYWQoKTogSW52YWxpZCBjaGFubmVsICVkXG4iLAorCQkJZGV2LT5taW5vciwgaW5zbi0+Y2hhbnNwZWMpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBtZTQwMDBfY250X2luc25fd3JpdGUoY29tZWRpX2RldmljZSAqIGRldiwKKwljb21lZGlfc3ViZGV2aWNlICogcywgY29tZWRpX2luc24gKiBpbnNuLCBsc2FtcGxfdCAqIGRhdGEpCit7CisKKwl1bnNpZ25lZCBzaG9ydCB0bXA7CisKKwlDQUxMX1BERUJVRygiSW4gbWU0MDAwX2NudF9pbnNuX3dyaXRlKClcbiIpOworCisJaWYgKGluc24tPm4gPT0gMCkgeworCQlyZXR1cm4gMDsKKwl9IGVsc2UgaWYgKGluc24tPm4gPiAxKSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkJImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9jbnRfaW5zbl93cml0ZSgpOiBJbnZhbGlkIGluc3RydWN0aW9uIGxlbmd0aCAlZFxuIiwKKwkJCWRldi0+bWlub3IsIGluc24tPm4pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzd2l0Y2ggKGluc24tPmNoYW5zcGVjKSB7CisJY2FzZSAwOgorCQl0bXAgPSBkYXRhWzBdICYgMHhGRjsKKwkJbWU0MDAwX291dGIoZGV2LCB0bXAsIGluZm8tPmNudF9jb250ZXh0LmNvdW50ZXJfMF9yZWcpOworCQl0bXAgPSAoZGF0YVswXSA+PiA4KSAmIDB4RkY7CisJCW1lNDAwMF9vdXRiKGRldiwgdG1wLCBpbmZvLT5jbnRfY29udGV4dC5jb3VudGVyXzBfcmVnKTsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQl0bXAgPSBkYXRhWzBdICYgMHhGRjsKKwkJbWU0MDAwX291dGIoZGV2LCB0bXAsIGluZm8tPmNudF9jb250ZXh0LmNvdW50ZXJfMV9yZWcpOworCQl0bXAgPSAoZGF0YVswXSA+PiA4KSAmIDB4RkY7CisJCW1lNDAwMF9vdXRiKGRldiwgdG1wLCBpbmZvLT5jbnRfY29udGV4dC5jb3VudGVyXzFfcmVnKTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQl0bXAgPSBkYXRhWzBdICYgMHhGRjsKKwkJbWU0MDAwX291dGIoZGV2LCB0bXAsIGluZm8tPmNudF9jb250ZXh0LmNvdW50ZXJfMl9yZWcpOworCQl0bXAgPSAoZGF0YVswXSA+PiA4KSAmIDB4RkY7CisJCW1lNDAwMF9vdXRiKGRldiwgdG1wLCBpbmZvLT5jbnRfY29udGV4dC5jb3VudGVyXzJfcmVnKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fRVJSCisJCQkiY29tZWRpJWQ6IG1lNDAwMDogbWU0MDAwX2NudF9pbnNuX3dyaXRlKCk6IEludmFsaWQgY2hhbm5lbCAlZFxuIiwKKwkJCWRldi0+bWlub3IsIGluc24tPmNoYW5zcGVjKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK0NPTUVESV9QQ0lfSU5JVENMRUFOVVAoZHJpdmVyX21lNDAwMCwgbWU0MDAwX3BjaV90YWJsZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbWU0MDAwLmggYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbWU0MDAwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjEyYjg4NwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9tZTQwMDAuaApAQCAtMCwwICsxLDQ0NiBAQAorLyoKKyAgICBtZTQwMDAuaAorICAgIFJlZ2lzdGVyIGRlc2NyaXB0aW9ucyBhbmQgZGVmaW5lcyBmb3IgdGhlIE1FLTQwMDAgYm9hcmQgZmFtaWx5CisKKyAgICBDT01FREkgLSBMaW51eCBDb250cm9sIGFuZCBNZWFzdXJlbWVudCBEZXZpY2UgSW50ZXJmYWNlCisgICAgQ29weXJpZ2h0IChDKSAxOTk4LTkgRGF2aWQgQS4gU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworKi8KKworI2lmbmRlZiBfTUU0MDAwX0hfCisjZGVmaW5lIF9NRTQwMDBfSF8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBEZWJ1ZyBzZWN0aW9uCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyN1bmRlZiBNRTQwMDBfQ0FMTF9ERUJVRwkvLyBEZWJ1ZyBmdW5jdGlvbiBlbnRyeSBhbmQgZXhpdAorI3VuZGVmIE1FNDAwMF9QT1JUX0RFQlVHCS8vIERlYnVnIHBvcnQgYWNjZXNzCisjdW5kZWYgTUU0MDAwX0lTUl9ERUJVRwkJLy8gRGVidWcgdGhlIGludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmUKKyN1bmRlZiBNRTQwMDBfREVCVUcJCS8vIEdlbmVyYWwgcHVycG9zZSBkZWJ1ZyBtYXNzZWdlcworCisjaWZkZWYgTUU0MDAwX0NBTExfREVCVUcKKyN1bmRlZiBDQUxMX1BERUJVRworI2RlZmluZSBDQUxMX1BERUJVRyhmbXQsIGFyZ3MuLi4pIHByaW50ayhLRVJOX0RFQlVHImNvbWVkaSVkOiBtZTQwMDA6ICIgZm10LCBkZXYtPm1pbm9yLCAjI2FyZ3MpCisjZWxzZQorIyBkZWZpbmUgQ0FMTF9QREVCVUcoZm10LCBhcmdzLi4uKQkvLyBubyBkZWJ1Z2dpbmcsIGRvIG5vdGhpbmcKKyNlbmRpZgorCisjaWZkZWYgTUU0MDAwX1BPUlRfREVCVUcKKyN1bmRlZiBQT1JUX1BERUJVRworI2RlZmluZSBQT1JUX1BERUJVRyhmbXQsIGFyZ3MuLi4pIHByaW50ayhLRVJOX0RFQlVHImNvbWVkaSVkOiBtZTQwMDA6ICIgZm10LCBkZXYtPm1pbm9yLCAgIyNhcmdzKQorI2Vsc2UKKyNkZWZpbmUgUE9SVF9QREVCVUcoZm10LCBhcmdzLi4uKQkvLyBubyBkZWJ1Z2dpbmcsIGRvIG5vdGhpbmcKKyNlbmRpZgorCisjaWZkZWYgTUU0MDAwX0lTUl9ERUJVRworI3VuZGVmIElTUl9QREVCVUcKKyNkZWZpbmUgSVNSX1BERUJVRyhmbXQsIGFyZ3MuLi4pIHByaW50ayhLRVJOX0RFQlVHImNvbWVkaSVkOiBtZTQwMDA6ICIgZm10LCBkZXYtPm1pbm9yLCAgIyNhcmdzKQorI2Vsc2UKKyNkZWZpbmUgSVNSX1BERUJVRyhmbXQsIGFyZ3MuLi4pCS8vIG5vIGRlYnVnZ2luZywgZG8gbm90aGluZworI2VuZGlmCisKKyNpZmRlZiBNRTQwMDBfREVCVUcKKyN1bmRlZiBQREVCVUcKKyNkZWZpbmUgUERFQlVHKGZtdCwgYXJncy4uLikgcHJpbnRrKEtFUk5fREVCVUciY29tZWRpJWQ6IG1lNDAwMDogIiBmbXQsIGRldi0+bWlub3IsICAjI2FyZ3MpCisjZWxzZQorI2RlZmluZSBQREVCVUcoZm10LCBhcmdzLi4uKQkvLyBubyBkZWJ1Z2dpbmcsIGRvIG5vdGhpbmcKKyNlbmRpZgorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFBDSSB2ZW5kb3IgYW5kIGRldmljZSBJRHMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX01FSUxIQVVTIDB4MTQwMgorCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjUwCTB4NDY1MAkvLyBMb3cgQ29zdCB2ZXJzaW9uCisKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2NjAJMHg0NjYwCS8vIFN0YW5kYXJkIHZlcnNpb24KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2NjBJCTB4NDY2MQkvLyBJc29sYXRlZCB2ZXJzaW9uCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjYwUwkweDQ2NjIJLy8gU3RhbmRhcmQgdmVyc2lvbiB3aXRoIFNhbXBsZSBhbmQgSG9sZAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDY2MElTCTB4NDY2MwkvLyBJc29sYXRlZCB2ZXJzaW9uIHdpdGggU2FtcGxlIGFuZCBIb2xkCisKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2NzAJMHg0NjcwCS8vIFN0YW5kYXJkIHZlcnNpb24KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2NzBJCTB4NDY3MQkvLyBJc29sYXRlZCB2ZXJzaW9uCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjcwUwkweDQ2NzIJLy8gU3RhbmRhcmQgdmVyc2lvbiB3aXRoIFNhbXBsZSBhbmQgSG9sZAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDY3MElTCTB4NDY3MwkvLyBJc29sYXRlZCB2ZXJzaW9uIHdpdGggU2FtcGxlIGFuZCBIb2xkCisKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2ODAJMHg0NjgwCS8vIFN0YW5kYXJkIHZlcnNpb24KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2ODBJCTB4NDY4MQkvLyBJc29sYXRlZCB2ZXJzaW9uCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjgwUwkweDQ2ODIJLy8gU3RhbmRhcmQgdmVyc2lvbiB3aXRoIFNhbXBsZSBhbmQgSG9sZAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDY4MElTCTB4NDY4MwkvLyBJc29sYXRlZCB2ZXJzaW9uIHdpdGggU2FtcGxlIGFuZCBIb2xkCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgTUUtNDAwMCBiYXNlIHJlZ2lzdGVyIG9mZnNldHMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2RlZmluZSBNRTQwMDBfQU9fMDBfQ1RSTF9SRUcJCQkweDAwCS8vIFIvVworI2RlZmluZSBNRTQwMDBfQU9fMDBfU1RBVFVTX1JFRwkJCTB4MDQJLy8gUi9fCisjZGVmaW5lIE1FNDAwMF9BT18wMF9GSUZPX1JFRwkJCTB4MDgJLy8gXy9XCisjZGVmaW5lIE1FNDAwMF9BT18wMF9TSU5HTEVfUkVHCQkJMHgwQwkvLyBSL1cKKyNkZWZpbmUgTUU0MDAwX0FPXzAwX1RJTUVSX1JFRwkJCTB4MTAJLy8gXy9XCisKKyNkZWZpbmUgTUU0MDAwX0FPXzAxX0NUUkxfUkVHCQkJMHgxOAkvLyBSL1cKKyNkZWZpbmUgTUU0MDAwX0FPXzAxX1NUQVRVU19SRUcJCQkweDFDCS8vIFIvXworI2RlZmluZSBNRTQwMDBfQU9fMDFfRklGT19SRUcJCQkweDIwCS8vIF8vVworI2RlZmluZSBNRTQwMDBfQU9fMDFfU0lOR0xFX1JFRwkJCTB4MjQJLy8gUi9XCisjZGVmaW5lIE1FNDAwMF9BT18wMV9USU1FUl9SRUcJCQkweDI4CS8vIF8vVworCisjZGVmaW5lIE1FNDAwMF9BT18wMl9DVFJMX1JFRwkJCTB4MzAJLy8gUi9XCisjZGVmaW5lIE1FNDAwMF9BT18wMl9TVEFUVVNfUkVHCQkJMHgzNAkvLyBSL18KKyNkZWZpbmUgTUU0MDAwX0FPXzAyX0ZJRk9fUkVHCQkJMHgzOAkvLyBfL1cKKyNkZWZpbmUgTUU0MDAwX0FPXzAyX1NJTkdMRV9SRUcJCQkweDNDCS8vIFIvVworI2RlZmluZSBNRTQwMDBfQU9fMDJfVElNRVJfUkVHCQkJMHg0MAkvLyBfL1cKKworI2RlZmluZSBNRTQwMDBfQU9fMDNfQ1RSTF9SRUcJCQkweDQ4CS8vIFIvVworI2RlZmluZSBNRTQwMDBfQU9fMDNfU1RBVFVTX1JFRwkJCTB4NEMJLy8gUi9fCisjZGVmaW5lIE1FNDAwMF9BT18wM19GSUZPX1JFRwkJCTB4NTAJLy8gXy9XCisjZGVmaW5lIE1FNDAwMF9BT18wM19TSU5HTEVfUkVHCQkJMHg1NAkvLyBSL1cKKyNkZWZpbmUgTUU0MDAwX0FPXzAzX1RJTUVSX1JFRwkJCTB4NTgJLy8gXy9XCisKKyNkZWZpbmUgTUU0MDAwX0FJX0NUUkxfUkVHCQkJMHg3NAkvLyBfL1cKKyNkZWZpbmUgTUU0MDAwX0FJX1NUQVRVU19SRUcJCQkweDc0CS8vIFIvXworI2RlZmluZSBNRTQwMDBfQUlfQ0hBTk5FTF9MSVNUX1JFRwkJMHg3OAkvLyBfL1cKKyNkZWZpbmUgTUU0MDAwX0FJX0RBVEFfUkVHCQkJMHg3QwkvLyBSL18KKyNkZWZpbmUgTUU0MDAwX0FJX0NIQU5fVElNRVJfUkVHCQkweDgwCS8vIF8vVworI2RlZmluZSBNRTQwMDBfQUlfQ0hBTl9QUkVfVElNRVJfUkVHCQkweDg0CS8vIF8vVworI2RlZmluZSBNRTQwMDBfQUlfU0NBTl9USU1FUl9MT1dfUkVHCQkweDg4CS8vIF8vVworI2RlZmluZSBNRTQwMDBfQUlfU0NBTl9USU1FUl9ISUdIX1JFRwkJMHg4QwkvLyBfL1cKKyNkZWZpbmUgTUU0MDAwX0FJX1NDQU5fUFJFX1RJTUVSX0xPV19SRUcJMHg5MAkvLyBfL1cKKyNkZWZpbmUgTUU0MDAwX0FJX1NDQU5fUFJFX1RJTUVSX0hJR0hfUkVHCTB4OTQJLy8gXy9XCisjZGVmaW5lIE1FNDAwMF9BSV9TVEFSVF9SRUcJCQkweDk4CS8vIFIvXworCisjZGVmaW5lIE1FNDAwMF9JUlFfU1RBVFVTX1JFRwkJCTB4OUMJLy8gUi9fCisKKyNkZWZpbmUgTUU0MDAwX0RJT19QT1JUXzBfUkVHCQkJMHhBMAkvLyBSL1cKKyNkZWZpbmUgTUU0MDAwX0RJT19QT1JUXzFfUkVHCQkJMHhBNAkvLyBSL1cKKyNkZWZpbmUgTUU0MDAwX0RJT19QT1JUXzJfUkVHCQkJMHhBOAkvLyBSL1cKKyNkZWZpbmUgTUU0MDAwX0RJT19QT1JUXzNfUkVHCQkJMHhBQwkvLyBSL1cKKyNkZWZpbmUgTUU0MDAwX0RJT19ESVJfUkVHCQkJMHhCMAkvLyBSL1cKKworI2RlZmluZSBNRTQwMDBfQU9fTE9BRFNFVFJFR19YWAkJCTB4QjQJLy8gUi9XCisKKyNkZWZpbmUgTUU0MDAwX0RJT19DVFJMX1JFRwkJCTB4QjgJLy8gUi9XCisKKyNkZWZpbmUgTUU0MDAwX0FPX0RFTVVYX0FESlVTVF9SRUcJCTB4QkMJLy8gLS9XCisKKyNkZWZpbmUgTUU0MDAwX0FJX1NBTVBMRV9DT1VOVEVSX1JFRwkJMHhDMAkvLyBfL1cKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBWYWx1ZSB0byBhZGp1c3QgRGVtdXgKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2RlZmluZSBNRTQwMDBfQU9fREVNVVhfQURKVVNUX1ZBTFVFICAgICAgICAgICAgMHg0QworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIENvdW50ZXIgYmFzZSByZWdpc3RlciBvZmZzZXRzCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNkZWZpbmUgTUU0MDAwX0NOVF9DT1VOVEVSXzBfUkVHCQkweDAwCisjZGVmaW5lIE1FNDAwMF9DTlRfQ09VTlRFUl8xX1JFRwkJMHgwMQorI2RlZmluZSBNRTQwMDBfQ05UX0NPVU5URVJfMl9SRUcJCTB4MDIKKyNkZWZpbmUgTUU0MDAwX0NOVF9DVFJMX1JFRwkJCTB4MDMKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBQTFggYmFzZSByZWdpc3RlciBvZmZzZXRzCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNkZWZpbmUgUExYX0lOVENTUgkweDRDCS8vIEludGVycnVwdCBjb250cm9sIGFuZCBzdGF0dXMgcmVnaXN0ZXIKKyNkZWZpbmUgUExYX0lDUgkJMHg1MAkvLyBJbml0aWFsaXphdGlvbiBjb250cm9sIHJlZ2lzdGVyCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQml0cyBmb3IgdGhlIFBMWF9JQ1NSIHJlZ2lzdGVyCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNkZWZpbmUgUExYX0lOVENTUl9MT0NBTF9JTlQxX0VOICAgICAgICAgICAgIDB4MDEJLy8gSWYgc2V0LCBsb2NhbCBpbnRlcnJ1cHQgMSBpcyBlbmFibGVkIChyL3cpCisjZGVmaW5lIFBMWF9JTlRDU1JfTE9DQUxfSU5UMV9QT0wgICAgICAgICAgICAweDAyCS8vIElmIHNldCwgbG9jYWwgaW50ZXJydXB0IDEgcG9sYXJpdHkgaXMgYWN0aXZlIGhpZ2ggKHIvdykKKyNkZWZpbmUgUExYX0lOVENTUl9MT0NBTF9JTlQxX1NUQVRFICAgICAgICAgIDB4MDQJLy8gSWYgc2V0LCBsb2NhbCBpbnRlcnJ1cHQgMSBpcyBhY3RpdmUgKHIvXykKKyNkZWZpbmUgUExYX0lOVENTUl9MT0NBTF9JTlQyX0VOICAgICAgICAgICAgIDB4MDgJLy8gSWYgc2V0LCBsb2NhbCBpbnRlcnJ1cHQgMiBpcyBlbmFibGVkIChyL3cpCisjZGVmaW5lIFBMWF9JTlRDU1JfTE9DQUxfSU5UMl9QT0wgICAgICAgICAgICAweDEwCS8vIElmIHNldCwgbG9jYWwgaW50ZXJydXB0IDIgcG9sYXJpdHkgaXMgYWN0aXZlIGhpZ2ggKHIvdykKKyNkZWZpbmUgUExYX0lOVENTUl9MT0NBTF9JTlQyX1NUQVRFICAgICAgICAgIDB4MjAJLy8gSWYgc2V0LCBsb2NhbCBpbnRlcnJ1cHQgMiBpcyBhY3RpdmUgIChyL18pCisjZGVmaW5lIFBMWF9JTlRDU1JfUENJX0lOVF9FTiAgICAgICAgICAgICAgICAweDQwCS8vIElmIHNldCwgUENJIGludGVycnVwdCBpcyBlbmFibGVkIChyL3cpCisjZGVmaW5lIFBMWF9JTlRDU1JfU09GVF9JTlQgICAgICAgICAgICAgICAgICAweDgwCS8vIElmIHNldCwgYSBzb2Z0d2FyZSBpbnRlcnJ1cHQgaXMgZ2VuZXJhdGVkIChyL3cpCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQml0cyBmb3IgdGhlIFBMWF9JQ1IgcmVnaXN0ZXIKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2RlZmluZSBQTFhfSUNSX0JJVF9FRVBST01fQ0xPQ0tfU0VUCQkweDAxMDAwMDAwCisjZGVmaW5lIFBMWF9JQ1JfQklUX0VFUFJPTV9DSElQX1NFTEVDVAkJMHgwMjAwMDAwMAorI2RlZmluZSBQTFhfSUNSX0JJVF9FRVBST01fV1JJVEUJCTB4MDQwMDAwMDAKKyNkZWZpbmUgUExYX0lDUl9CSVRfRUVQUk9NX1JFQUQJCQkweDA4MDAwMDAwCisjZGVmaW5lIFBMWF9JQ1JfQklUX0VFUFJPTV9WQUxJRAkJMHgxMDAwMDAwMAorCisjZGVmaW5lIFBMWF9JQ1JfTUFTS19FRVBST00JCQkweDFGMDAwMDAwCisKKyNkZWZpbmUgRUVQUk9NX0RFTEFZCQkJCTEKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBCaXRzIGZvciB0aGUgTUU0MDAwX0FPX0NUUkxfUkVHIHJlZ2lzdGVyCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNkZWZpbmUgTUU0MDAwX0FPX0NUUkxfQklUX01PREVfMAkJMHgwMDEKKyNkZWZpbmUgTUU0MDAwX0FPX0NUUkxfQklUX01PREVfMQkJMHgwMDIKKyNkZWZpbmUgTUU0MDAwX0FPX0NUUkxfTUFTS19NT0RFCQkweDAwMworI2RlZmluZSBNRTQwMDBfQU9fQ1RSTF9CSVRfU1RPUAkJCTB4MDA0CisjZGVmaW5lIE1FNDAwMF9BT19DVFJMX0JJVF9FTkFCTEVfRklGTwkJMHgwMDgKKyNkZWZpbmUgTUU0MDAwX0FPX0NUUkxfQklUX0VOQUJMRV9FWF9UUklHCTB4MDEwCisjZGVmaW5lIE1FNDAwMF9BT19DVFJMX0JJVF9FWF9UUklHX0VER0UJCTB4MDIwCisjZGVmaW5lIE1FNDAwMF9BT19DVFJMX0JJVF9JTU1FRElBVEVfU1RPUAkweDA4MAorI2RlZmluZSBNRTQwMDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0RPCQkweDEwMAorI2RlZmluZSBNRTQwMDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0lSUQkJMHgyMDAKKyNkZWZpbmUgTUU0MDAwX0FPX0NUUkxfQklUX1JFU0VUX0lSUQkJMHg0MDAKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBCaXRzIGZvciB0aGUgTUU0MDAwX0FPX1NUQVRVU19SRUcgcmVnaXN0ZXIKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2RlZmluZSBNRTQwMDBfQU9fU1RBVFVTX0JJVF9GU00JCTB4MDEKKyNkZWZpbmUgTUU0MDAwX0FPX1NUQVRVU19CSVRfRkYJCQkweDAyCisjZGVmaW5lIE1FNDAwMF9BT19TVEFUVVNfQklUX0hGCQkJMHgwNAorI2RlZmluZSBNRTQwMDBfQU9fU1RBVFVTX0JJVF9FRgkJCTB4MDgKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBCaXRzIGZvciB0aGUgTUU0MDAwX0FJX0NUUkxfUkVHIHJlZ2lzdGVyCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNkZWZpbmUgTUU0MDAwX0FJX0NUUkxfQklUX01PREVfMAkJMHgwMDAwMDAwMQorI2RlZmluZSBNRTQwMDBfQUlfQ1RSTF9CSVRfTU9ERV8xCQkweDAwMDAwMDAyCisjZGVmaW5lIE1FNDAwMF9BSV9DVFJMX0JJVF9NT0RFXzIJCTB4MDAwMDAwMDQKKyNkZWZpbmUgTUU0MDAwX0FJX0NUUkxfQklUX1NBTVBMRV9IT0xECQkweDAwMDAwMDA4CisjZGVmaW5lIE1FNDAwMF9BSV9DVFJMX0JJVF9JTU1FRElBVEVfU1RPUAkweDAwMDAwMDEwCisjZGVmaW5lIE1FNDAwMF9BSV9DVFJMX0JJVF9TVE9QCQkJMHgwMDAwMDAyMAorI2RlZmluZSBNRTQwMDBfQUlfQ1RSTF9CSVRfQ0hBTk5FTF9GSUZPCQkweDAwMDAwMDQwCisjZGVmaW5lIE1FNDAwMF9BSV9DVFJMX0JJVF9EQVRBX0ZJRk8JCTB4MDAwMDAwODAKKyNkZWZpbmUgTUU0MDAwX0FJX0NUUkxfQklUX0ZVTExTQ0FMRQkJMHgwMDAwMDEwMAorI2RlZmluZSBNRTQwMDBfQUlfQ1RSTF9CSVRfT0ZGU0VUCQkweDAwMDAwMjAwCisjZGVmaW5lIE1FNDAwMF9BSV9DVFJMX0JJVF9FWF9UUklHX0FOQUxPRwkweDAwMDAwNDAwCisjZGVmaW5lIE1FNDAwMF9BSV9DVFJMX0JJVF9FWF9UUklHCQkweDAwMDAwODAwCisjZGVmaW5lIE1FNDAwMF9BSV9DVFJMX0JJVF9FWF9UUklHX0ZBTExJTkcJMHgwMDAwMTAwMAorI2RlZmluZSBNRTQwMDBfQUlfQ1RSTF9CSVRfRVhfSVJRCQkweDAwMDAyMDAwCisjZGVmaW5lIE1FNDAwMF9BSV9DVFJMX0JJVF9FWF9JUlFfUkVTRVQJCTB4MDAwMDQwMDAKKyNkZWZpbmUgTUU0MDAwX0FJX0NUUkxfQklUX0xFX0lSUQkJMHgwMDAwODAwMAorI2RlZmluZSBNRTQwMDBfQUlfQ1RSTF9CSVRfTEVfSVJRX1JFU0VUCQkweDAwMDEwMDAwCisjZGVmaW5lIE1FNDAwMF9BSV9DVFJMX0JJVF9IRl9JUlEJCTB4MDAwMjAwMDAKKyNkZWZpbmUgTUU0MDAwX0FJX0NUUkxfQklUX0hGX0lSUV9SRVNFVAkJMHgwMDA0MDAwMAorI2RlZmluZSBNRTQwMDBfQUlfQ1RSTF9CSVRfU0NfSVJRCQkweDAwMDgwMDAwCisjZGVmaW5lIE1FNDAwMF9BSV9DVFJMX0JJVF9TQ19JUlFfUkVTRVQJCTB4MDAxMDAwMDAKKyNkZWZpbmUgTUU0MDAwX0FJX0NUUkxfQklUX1NDX1JFTE9BRAkJMHgwMDIwMDAwMAorI2RlZmluZSBNRTQwMDBfQUlfQ1RSTF9CSVRfRVhfVFJJR19CT1RICQkweDgwMDAwMDAwCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQml0cyBmb3IgdGhlIE1FNDAwMF9BSV9TVEFUVVNfUkVHIHJlZ2lzdGVyCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNkZWZpbmUgTUU0MDAwX0FJX1NUQVRVU19CSVRfRUZfQ0hBTk5FTAkJMHgwMDQwMDAwMAorI2RlZmluZSBNRTQwMDBfQUlfU1RBVFVTX0JJVF9IRl9DSEFOTkVMCQkweDAwODAwMDAwCisjZGVmaW5lIE1FNDAwMF9BSV9TVEFUVVNfQklUX0ZGX0NIQU5ORUwJCTB4MDEwMDAwMDAKKyNkZWZpbmUgTUU0MDAwX0FJX1NUQVRVU19CSVRfRUZfREFUQQkJMHgwMjAwMDAwMAorI2RlZmluZSBNRTQwMDBfQUlfU1RBVFVTX0JJVF9IRl9EQVRBCQkweDA0MDAwMDAwCisjZGVmaW5lIE1FNDAwMF9BSV9TVEFUVVNfQklUX0ZGX0RBVEEJCTB4MDgwMDAwMDAKKyNkZWZpbmUgTUU0MDAwX0FJX1NUQVRVU19CSVRfTEUJCQkweDEwMDAwMDAwCisjZGVmaW5lIE1FNDAwMF9BSV9TVEFUVVNfQklUX0ZTTQkJMHgyMDAwMDAwMAorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEJpdHMgZm9yIHRoZSBNRTQwMDBfSVJRX1NUQVRVU19SRUcgcmVnaXN0ZXIKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2RlZmluZSBNRTQwMDBfSVJRX1NUQVRVU19CSVRfRVgJCTB4MDEKKyNkZWZpbmUgTUU0MDAwX0lSUV9TVEFUVVNfQklUX0xFCQkweDAyCisjZGVmaW5lIE1FNDAwMF9JUlFfU1RBVFVTX0JJVF9BSV9IRgkJMHgwNAorI2RlZmluZSBNRTQwMDBfSVJRX1NUQVRVU19CSVRfQU9fMF9IRgkJMHgwOAorI2RlZmluZSBNRTQwMDBfSVJRX1NUQVRVU19CSVRfQU9fMV9IRgkJMHgxMAorI2RlZmluZSBNRTQwMDBfSVJRX1NUQVRVU19CSVRfQU9fMl9IRgkJMHgyMAorI2RlZmluZSBNRTQwMDBfSVJRX1NUQVRVU19CSVRfQU9fM19IRgkJMHg0MAorI2RlZmluZSBNRTQwMDBfSVJRX1NUQVRVU19CSVRfU0MJCTB4ODAKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBCaXRzIGZvciB0aGUgTUU0MDAwX0RJT19DVFJMX1JFRyByZWdpc3RlcgorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjZGVmaW5lIE1FNDAwMF9ESU9fQ1RSTF9CSVRfTU9ERV8wCQkweDAwMDEKKyNkZWZpbmUgTUU0MDAwX0RJT19DVFJMX0JJVF9NT0RFXzEJCTB4MDAwMgorI2RlZmluZSBNRTQwMDBfRElPX0NUUkxfQklUX01PREVfMgkJMHgwMDA0CisjZGVmaW5lIE1FNDAwMF9ESU9fQ1RSTF9CSVRfTU9ERV8zCQkweDAwMDgKKyNkZWZpbmUgTUU0MDAwX0RJT19DVFJMX0JJVF9NT0RFXzQJCTB4MDAxMAorI2RlZmluZSBNRTQwMDBfRElPX0NUUkxfQklUX01PREVfNQkJMHgwMDIwCisjZGVmaW5lIE1FNDAwMF9ESU9fQ1RSTF9CSVRfTU9ERV82CQkweDAwNDAKKyNkZWZpbmUgTUU0MDAwX0RJT19DVFJMX0JJVF9NT0RFXzcJCTB4MDA4MAorCisjZGVmaW5lIE1FNDAwMF9ESU9fQ1RSTF9CSVRfRlVOQ1RJT05fMAkJMHgwMTAwCisjZGVmaW5lIE1FNDAwMF9ESU9fQ1RSTF9CSVRfRlVOQ1RJT05fMQkJMHgwMjAwCisKKyNkZWZpbmUgTUU0MDAwX0RJT19DVFJMX0JJVF9GSUZPX0hJR0hfMAkJMHgwNDAwCisjZGVmaW5lIE1FNDAwMF9ESU9fQ1RSTF9CSVRfRklGT19ISUdIXzEJCTB4MDgwMAorI2RlZmluZSBNRTQwMDBfRElPX0NUUkxfQklUX0ZJRk9fSElHSF8yCQkweDEwMDAKKyNkZWZpbmUgTUU0MDAwX0RJT19DVFJMX0JJVF9GSUZPX0hJR0hfMwkJMHgyMDAwCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgSW5mb3JtYXRpb24gYWJvdXQgdGhlIGhhcmR3YXJlIGNhcGFiaWxpdGllcworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCit0eXBlZGVmIHN0cnVjdCBtZTQwMDBfYW9faW5mbyB7CisJaW50IGNvdW50OworCWludCBmaWZvX2NvdW50OworfSBtZTQwMDBfYW9faW5mb190OworCit0eXBlZGVmIHN0cnVjdCBtZTQwMDBfYWlfaW5mbyB7CisJaW50IGNvdW50OworCWludCBzaF9jb3VudDsKKwlpbnQgZGlmZl9jb3VudDsKKwlpbnQgZXhfdHJpZ19hbmFsb2c7Cit9IG1lNDAwMF9haV9pbmZvX3Q7CisKK3R5cGVkZWYgc3RydWN0IG1lNDAwMF9kaW9faW5mbyB7CisJaW50IGNvdW50OworfSBtZTQwMDBfZGlvX2luZm9fdDsKKwordHlwZWRlZiBzdHJ1Y3QgbWU0MDAwX2NudF9pbmZvIHsKKwlpbnQgY291bnQ7Cit9IG1lNDAwMF9jbnRfaW5mb190OworCit0eXBlZGVmIHN0cnVjdCBtZTQwMDBfYm9hcmQgeworCWNvbnN0IGNoYXIgKm5hbWU7CisJdW5zaWduZWQgc2hvcnQgZGV2aWNlX2lkOworCW1lNDAwMF9hb19pbmZvX3QgYW87CisJbWU0MDAwX2FpX2luZm9fdCBhaTsKKwltZTQwMDBfZGlvX2luZm9fdCBkaW87CisJbWU0MDAwX2NudF9pbmZvX3QgY250OworfSBtZTQwMDBfYm9hcmRfdDsKKworI2RlZmluZSB0aGlzYm9hcmQgKChjb25zdCBtZTQwMDBfYm9hcmRfdCAqKWRldi0+Ym9hcmRfcHRyKQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEdsb2JhbCBib2FyZCBhbmQgc3ViZGV2aWNlIGluZm9ybWF0aW9uIHN0cnVjdHVyZXMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKwordHlwZWRlZiBzdHJ1Y3QgbWU0MDAwX2FvX2NvbnRleHQgeworCWludCBpcnE7CisKKwl1bnNpZ25lZCBsb25nIG1pcnJvcjsJLy8gU3RvcmUgdGhlIGxhc3Qgd3JpdHRlbiB2YWx1ZQorCisJdW5zaWduZWQgbG9uZyBjdHJsX3JlZzsKKwl1bnNpZ25lZCBsb25nIHN0YXR1c19yZWc7CisJdW5zaWduZWQgbG9uZyBmaWZvX3JlZzsKKwl1bnNpZ25lZCBsb25nIHNpbmdsZV9yZWc7CisJdW5zaWduZWQgbG9uZyB0aW1lcl9yZWc7CisJdW5zaWduZWQgbG9uZyBpcnFfc3RhdHVzX3JlZzsKKwl1bnNpZ25lZCBsb25nIHByZWxvYWRfcmVnOworfSBtZTQwMDBfYW9fY29udGV4dF90OworCit0eXBlZGVmIHN0cnVjdCBtZTQwMDBfYWlfY29udGV4dCB7CisJaW50IGlycTsKKworCXVuc2lnbmVkIGxvbmcgY3RybF9yZWc7CisJdW5zaWduZWQgbG9uZyBzdGF0dXNfcmVnOworCXVuc2lnbmVkIGxvbmcgY2hhbm5lbF9saXN0X3JlZzsKKwl1bnNpZ25lZCBsb25nIGRhdGFfcmVnOworCXVuc2lnbmVkIGxvbmcgY2hhbl90aW1lcl9yZWc7CisJdW5zaWduZWQgbG9uZyBjaGFuX3ByZV90aW1lcl9yZWc7CisJdW5zaWduZWQgbG9uZyBzY2FuX3RpbWVyX2xvd19yZWc7CisJdW5zaWduZWQgbG9uZyBzY2FuX3RpbWVyX2hpZ2hfcmVnOworCXVuc2lnbmVkIGxvbmcgc2Nhbl9wcmVfdGltZXJfbG93X3JlZzsKKwl1bnNpZ25lZCBsb25nIHNjYW5fcHJlX3RpbWVyX2hpZ2hfcmVnOworCXVuc2lnbmVkIGxvbmcgc3RhcnRfcmVnOworCXVuc2lnbmVkIGxvbmcgaXJxX3N0YXR1c19yZWc7CisJdW5zaWduZWQgbG9uZyBzYW1wbGVfY291bnRlcl9yZWc7Cit9IG1lNDAwMF9haV9jb250ZXh0X3Q7CisKK3R5cGVkZWYgc3RydWN0IG1lNDAwMF9kaW9fY29udGV4dCB7CisJdW5zaWduZWQgbG9uZyBkaXJfcmVnOworCXVuc2lnbmVkIGxvbmcgY3RybF9yZWc7CisJdW5zaWduZWQgbG9uZyBwb3J0XzBfcmVnOworCXVuc2lnbmVkIGxvbmcgcG9ydF8xX3JlZzsKKwl1bnNpZ25lZCBsb25nIHBvcnRfMl9yZWc7CisJdW5zaWduZWQgbG9uZyBwb3J0XzNfcmVnOworfSBtZTQwMDBfZGlvX2NvbnRleHRfdDsKKwordHlwZWRlZiBzdHJ1Y3QgbWU0MDAwX2NudF9jb250ZXh0IHsKKwl1bnNpZ25lZCBsb25nIGN0cmxfcmVnOworCXVuc2lnbmVkIGxvbmcgY291bnRlcl8wX3JlZzsKKwl1bnNpZ25lZCBsb25nIGNvdW50ZXJfMV9yZWc7CisJdW5zaWduZWQgbG9uZyBjb3VudGVyXzJfcmVnOworfSBtZTQwMDBfY250X2NvbnRleHRfdDsKKwordHlwZWRlZiBzdHJ1Y3QgbWU0MDAwX2luZm8geworCXVuc2lnbmVkIGxvbmcgcGx4X3JlZ2Jhc2U7CS8vIFBMWCBjb25maWd1cmF0aW9uIHNwYWNlIGJhc2UgYWRkcmVzcworCXVuc2lnbmVkIGxvbmcgbWU0MDAwX3JlZ2Jhc2U7CS8vIEJhc2UgYWRkcmVzcyBvZiB0aGUgTUU0MDAwCisJdW5zaWduZWQgbG9uZyB0aW1lcl9yZWdiYXNlOwkvLyBCYXNlIGFkZHJlc3Mgb2YgdGhlIHRpbWVyIGNpcmN1aXQKKwl1bnNpZ25lZCBsb25nIHByb2dyYW1fcmVnYmFzZTsJLy8gQmFzZSBhZGRyZXNzIHRvIHNldCB0aGUgcHJvZ3JhbSBwaW4gZm9yIHRoZSB4aWxpbngKKworCXVuc2lnbmVkIGxvbmcgcGx4X3JlZ2Jhc2Vfc2l6ZTsJLy8gUExYIHJlZ2lzdGVyIHNldCBzcGFjZQorCXVuc2lnbmVkIGxvbmcgbWU0MDAwX3JlZ2Jhc2Vfc2l6ZTsJLy8gTUU0MDAwIHJlZ2lzdGVyIHNldCBzcGFjZQorCXVuc2lnbmVkIGxvbmcgdGltZXJfcmVnYmFzZV9zaXplOwkvLyBUaW1lciBjaXJjdWl0IHJlZ2lzdGVyIHNldCBzcGFjZQorCXVuc2lnbmVkIGxvbmcgcHJvZ3JhbV9yZWdiYXNlX3NpemU7CS8vIFNpemUgb2YgcHJvZ3JhbSBiYXNlIGFkZHJlc3Mgb2YgdGhlIE1FNDAwMAorCisJdW5zaWduZWQgaW50IHNlcmlhbF9ubzsJLy8gU2VyaWFsIG51bWJlciBvZiB0aGUgYm9hcmQKKwl1bnNpZ25lZCBjaGFyIGh3X3JldmlzaW9uOwkvLyBIYXJkd2FyZSByZXZpc2lvbiBvZiB0aGUgYm9hcmQKKwl1bnNpZ25lZCBzaG9ydCB2ZW5kb3JfaWQ7CS8vIE1laWxoYXVzIHZlbmRvciBpZAorCXVuc2lnbmVkIHNob3J0IGRldmljZV9pZDsJLy8gRGV2aWNlIGlkCisKKwlzdHJ1Y3QgcGNpX2RldiAqcGNpX2Rldl9wOwkvLyBHZW5lcmFsIFBDSSBpbmZvcm1hdGlvbgorCisJdW5zaWduZWQgaW50IGlycTsJLy8gSVJRIGFzc2lnbmVkIGZyb20gdGhlIFBDSSBCSU9TCisKKwlzdHJ1Y3QgbWU0MDAwX2FpX2NvbnRleHQgYWlfY29udGV4dDsJLy8gQW5hbG9nIGlucHV0ICBzcGVjaWZpYyBjb250ZXh0CisJc3RydWN0IG1lNDAwMF9hb19jb250ZXh0IGFvX2NvbnRleHRbNF07CS8vIFZlY3RvciB3aXRoIGFuYWxvZyBvdXRwdXQgc3BlY2lmaWMgY29udGV4dAorCXN0cnVjdCBtZTQwMDBfZGlvX2NvbnRleHQgZGlvX2NvbnRleHQ7CS8vIERpZ2l0YWwgSS9PIHNwZWNpZmljIGNvbnRleHQKKwlzdHJ1Y3QgbWU0MDAwX2NudF9jb250ZXh0IGNudF9jb250ZXh0OwkvLyBDb3VudGVyIHNwZWNpZmljIGNvbnRleHQKK30gbWU0MDAwX2luZm9fdDsKKworI2RlZmluZSBpbmZvCSgobWU0MDAwX2luZm9fdCAqKWRldi0+cHJpdmF0ZSkKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBEZWZpbmVzIGZvciBhbmFsb2cgaW5wdXQKKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogR2VuZXJhbCBzdHVmZiAqLworI2RlZmluZSBNRTQwMDBfQUlfRklGT19DT1VOVAkJCTIwNDgKKworI2RlZmluZSBNRTQwMDBfQUlfTUlOX1RJQ0tTCQkJNjYKKyNkZWZpbmUgTUU0MDAwX0FJX01JTl9TQU1QTEVfVElNRQkJMjAwMAkvLyBNaW5pbXVtIHNhbXBsZSB0aW1lIFtuc10KKyNkZWZpbmUgTUU0MDAwX0FJX0JBU0VfRlJFUVVFTkNZCQkodW5zaWduZWQgaW50KSAzM0U2CisKKy8qIENoYW5uZWwgbGlzdCBkZWZpbmVzIGFuZCBtYXNrcyAqLworI2RlZmluZSBNRTQwMDBfQUlfQ0hBTk5FTF9MSVNUX0NPVU5UCQkxMDI0CisKKyNkZWZpbmUgTUU0MDAwX0FJX0xJU1RfSU5QVVRfU0lOR0xFX0VOREVECTB4MDAwCisjZGVmaW5lIE1FNDAwMF9BSV9MSVNUX0lOUFVUX0RJRkZFUkVOVElBTAkweDAyMAorCisjZGVmaW5lIE1FNDAwMF9BSV9MSVNUX1JBTkdFX0JJUE9MQVJfMTAJCTB4MDAwCisjZGVmaW5lIE1FNDAwMF9BSV9MSVNUX1JBTkdFX0JJUE9MQVJfMl81CTB4MDQwCisjZGVmaW5lIE1FNDAwMF9BSV9MSVNUX1JBTkdFX1VOSVBPTEFSXzEwCTB4MDgwCisjZGVmaW5lIE1FNDAwMF9BSV9MSVNUX1JBTkdFX1VOSVBPTEFSXzJfNQkweDBDMAorCisjZGVmaW5lIE1FNDAwMF9BSV9MSVNUX0xBU1RfRU5UUlkJCTB4MTAwCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgRGVmaW5lcyBmb3IgY291bnRlcnMKKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2RlZmluZSBNRTQwMDBfQ05UX0NPVU5URVJfMCAgMHgwMAorI2RlZmluZSBNRTQwMDBfQ05UX0NPVU5URVJfMSAgMHg0MAorI2RlZmluZSBNRTQwMDBfQ05UX0NPVU5URVJfMiAgMHg4MAorCisjZGVmaW5lIE1FNDAwMF9DTlRfTU9ERV8wICAgICAweDAwCS8vIENoYW5nZSBzdGF0ZSBpZiB6ZXJvIGNyb3NzaW5nCisjZGVmaW5lIE1FNDAwMF9DTlRfTU9ERV8xICAgICAweDAyCS8vIFJldHJpZ2dlcmFibGUgT25lLVNob3QKKyNkZWZpbmUgTUU0MDAwX0NOVF9NT0RFXzIgICAgIDB4MDQJLy8gQXN5bW1ldHJpY2FsIGRpdmlkZXIKKyNkZWZpbmUgTUU0MDAwX0NOVF9NT0RFXzMgICAgIDB4MDYJLy8gU3ltbWV0cmljYWwgZGl2aWRlcgorI2RlZmluZSBNRTQwMDBfQ05UX01PREVfNCAgICAgMHgwOAkvLyBDb3VudGVyIHN0YXJ0IGJ5IHNvZnR3YXJlIHRyaWdnZXIKKyNkZWZpbmUgTUU0MDAwX0NOVF9NT0RFXzUgICAgIDB4MEEJLy8gQ291bnRlciBzdGFydCBieSBoYXJkd2FyZSB0cmlnZ2VyCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL21lX2RhcS5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL21lX2RhcS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhY2NlYzIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbWVfZGFxLmMKQEAgLTAsMCArMSw4NDUgQEAKKy8qCisKKyAgIGNvbWVkaS9kcml2ZXJzL21lX2RhcS5jCisKKyAgIEhhcmR3YXJlIGRyaXZlciBmb3IgTWVpbGhhdXMgZGF0YSBhY3F1aXNpdGlvbiBjYXJkczoKKworICAgICBNRS0yMDAwaSwgTUUtMjYwMGksIE1FLTMwMDB2bTEKKworICAgQ29weXJpZ2h0IChDKSAyMDAyIE1pY2hhZWwgSGlsbG1hbm4gPGhpbGxtYW5uQHN5c2Nvbmdyb3VwLmRlPgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisqLworCisvKgorRHJpdmVyOiBtZV9kYXEKK0Rlc2NyaXB0aW9uOiBNZWlsaGF1cyBQQ0kgZGF0YSBhY3F1aXNpdGlvbiBjYXJkcworQXV0aG9yOiBNaWNoYWVsIEhpbGxtYW5uIDxoaWxsbWFubkBzeXNjb25ncm91cC5kZT4KK0RldmljZXM6IFtNZWlsaGF1c10gTUUtMjYwMGkgKG1lX2RhcSksIE1FLTIwMDBpCitTdGF0dXM6IGV4cGVyaW1lbnRhbAorCitTdXBwb3J0czoKKworICAgIEFuYWxvZyBPdXRwdXQKKworQ29uZmlndXJhdGlvbiBvcHRpb25zOgorCisgICAgWzBdIC0gUENJIGJ1cyBudW1iZXIgKG9wdGlvbmFsKQorICAgIFsxXSAtIFBDSSBzbG90IG51bWJlciAob3B0aW9uYWwpCisKKyAgICBJZiBidXMvc2xvdCBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgZmlyc3QgYXZhaWxhYmxlIFBDSQorICAgIGRldmljZSB3aWxsIGJlIHVzZWQuCisKK1RoZSAyNjAwIHJlcXVpcmVzIGEgZmlybXdhcmUgdXBsb2FkLCB3aGljaCBjYW4gYmUgYWNjb21wbGlzaGVkCit1c2luZyB0aGUgLWkgb3IgLS1pbml0LWRhdGEgb3B0aW9uIG9mIGNvbWVkaV9jb25maWcuCitUaGUgZmlybXdhcmUgY2FuIGJlCitmb3VuZCBpbiB0aGUgY29tZWRpX25vbmZyZWVfZmlybXdhcmUgdGFyYmFsbCBhdmFpbGFibGUKK2Zyb20gaHR0cDovL3d3dy5jb21lZGkub3JnCisKKyovCisKKyNpbmNsdWRlICIuLi9jb21lZGlkZXYuaCIKKworI2luY2x1ZGUgImNvbWVkaV9wY2kuaCIKKworLyojaW5jbHVkZSAibWUyNjAwX2Z3LmgiICovCisKKyNkZWZpbmUgTUVfRFJJVkVSX05BTUUJCSJtZV9kYXEiCisKKyNkZWZpbmUgTUUyMDAwX0RFVklDRV9JRAkweDIwMDAKKyNkZWZpbmUgTUUyNjAwX0RFVklDRV9JRAkweDI2MDAKKworI2RlZmluZSBQTFhfSU5UQ1NSCQkweDRDCS8qIFBMWCBpbnRlcnJ1cHQgc3RhdHVzIHJlZ2lzdGVyICovCisjZGVmaW5lIFhJTElOWF9ET1dOTE9BRF9SRVNFVAkweDQyCS8qIFhpbGlueCByZWdpc3RlcnMgKi8KKworI2RlZmluZSBNRV9DT05UUk9MXzEJCQkweDAwMDAJLyogLSB8IFcgKi8KKyNkZWZpbmUgICBJTlRFUlJVUFRfRU5BQkxFCQkoMTw8MTUpCisjZGVmaW5lICAgQ09VTlRFUl9CX0lSUQkJCSgxPDwxMikKKyNkZWZpbmUgICBDT1VOVEVSX0FfSVJRCQkJKDE8PDExKQorI2RlZmluZSAgIENIQU5MSVNUX1JFQURZX0lSUQkJKDE8PDEwKQorI2RlZmluZSAgIEVYVF9JUlEJCQkoMTw8OSkKKyNkZWZpbmUgICBBREZJRk9fSEFMRkZVTExfSVJRCQkoMTw8OCkKKyNkZWZpbmUgICBTQ0FOX0NPVU5UX0VOQUJMRQkJKDE8PDUpCisjZGVmaW5lICAgU0lNVUxUQU5FT1VTX0VOQUJMRQkJKDE8PDQpCisjZGVmaW5lICAgVFJJR0dFUl9GQUxMSU5HX0VER0UJCSgxPDwzKQorI2RlZmluZSAgIENPTlRJTlVPVVNfTU9ERQkJKDE8PDIpCisjZGVmaW5lICAgRElTQUJMRV9BREMJCQkoMDw8MCkKKyNkZWZpbmUgICBTT0ZUV0FSRV9UUklHR0VSRURfQURDCSgxPDwwKQorI2RlZmluZSAgIFNDQU5fVFJJR0dFUkVEX0FEQwkJKDI8PDApCisjZGVmaW5lICAgRVhUX1RSSUdHRVJFRF9BREMJCSgzPDwwKQorI2RlZmluZSBNRV9BRENfU1RBUlQJCQkweDAwMDAJLyogUiB8IC0gKi8KKyNkZWZpbmUgTUVfQ09OVFJPTF8yCQkJMHgwMDAyCS8qIC0gfCBXICovCisjZGVmaW5lICAgRU5BQkxFX0FERklGTwkJCSgxPDwxMCkKKyNkZWZpbmUgICBFTkFCTEVfQ0hBTkxJU1QJCSgxPDw5KQorI2RlZmluZSAgIEVOQUJMRV9QT1JUX0IJCQkoMTw8NykKKyNkZWZpbmUgICBFTkFCTEVfUE9SVF9BCQkJKDE8PDYpCisjZGVmaW5lICAgRU5BQkxFX0NPVU5URVJfQgkJKDE8PDQpCisjZGVmaW5lICAgRU5BQkxFX0NPVU5URVJfQQkJKDE8PDMpCisjZGVmaW5lICAgRU5BQkxFX0RBQwkJCSgxPDwxKQorI2RlZmluZSAgIEJVRkZFUkVEX0RBQwkJCSgxPDwwKQorI2RlZmluZSBNRV9EQUNfVVBEQVRFCQkJMHgwMDAyCS8qIFIgfCAtICovCisjZGVmaW5lIE1FX1NUQVRVUwkJCTB4MDAwNAkvKiBSIHwgLSAqLworI2RlZmluZSAgIENPVU5URVJfQl9JUlFfUEVORElORwkJKDE8PDEyKQorI2RlZmluZSAgIENPVU5URVJfQV9JUlFfUEVORElORwkJKDE8PDExKQorI2RlZmluZSAgIENIQU5MSVNUX1JFQURZX0lSUV9QRU5ESU5HCSgxPDwxMCkKKyNkZWZpbmUgICBFWFRfSVJRX1BFTkRJTkcJCSgxPDw5KQorI2RlZmluZSAgIEFERklGT19IQUxGRlVMTF9JUlFfUEVORElORwkoMTw8OCkKKyNkZWZpbmUgICBBREZJRk9fRlVMTAkJCSgxPDw0KQorI2RlZmluZSAgIEFERklGT19IQUxGRlVMTAkJKDE8PDMpCisjZGVmaW5lICAgQURGSUZPX0VNUFRZCQkJKDE8PDIpCisjZGVmaW5lICAgQ0hBTkxJU1RfRlVMTAkJCSgxPDwxKQorI2RlZmluZSAgIEZTVF9BQ1RJVkUJCQkoMTw8MCkKKyNkZWZpbmUgTUVfUkVTRVRfSU5URVJSVVBUCQkweDAwMDQJLyogLSB8IFcgKi8KKyNkZWZpbmUgTUVfRElPX1BPUlRfQQkJCTB4MDAwNgkvKiBSIHwgVyAqLworI2RlZmluZSBNRV9ESU9fUE9SVF9CCQkJMHgwMDA4CS8qIFIgfCBXICovCisjZGVmaW5lIE1FX1RJTUVSX0RBVEFfMAkJCTB4MDAwQQkvKiAtIHwgVyAqLworI2RlZmluZSBNRV9USU1FUl9EQVRBXzEJCQkweDAwMEMJLyogLSB8IFcgKi8KKyNkZWZpbmUgTUVfVElNRVJfREFUQV8yCQkJMHgwMDBFCS8qIC0gfCBXICovCisjZGVmaW5lIE1FX0NIQU5ORUxfTElTVAkJCTB4MDAxMAkvKiAtIHwgVyAqLworI2RlZmluZSAgIEFEQ19VTklQT0xBUgkJCSgxPDw2KQorI2RlZmluZSAgIEFEQ19HQUlOXzAJCQkoMDw8NCkKKyNkZWZpbmUgICBBRENfR0FJTl8xCQkJKDE8PDQpCisjZGVmaW5lICAgQURDX0dBSU5fMgkJCSgyPDw0KQorI2RlZmluZSAgIEFEQ19HQUlOXzMJCQkoMzw8NCkKKyNkZWZpbmUgTUVfUkVBRF9BRF9GSUZPCQkJMHgwMDEwCS8qIFIgfCAtICovCisjZGVmaW5lIE1FX0RBQ19DT05UUk9MCQkJMHgwMDEyCS8qIC0gfCBXICovCisjZGVmaW5lICAgREFDX1VOSVBPTEFSX0QJCSgwPDw0KQorI2RlZmluZSAgIERBQ19CSVBPTEFSX0QJCQkoMTw8NCkKKyNkZWZpbmUgICBEQUNfVU5JUE9MQVJfQwkJKDA8PDUpCisjZGVmaW5lICAgREFDX0JJUE9MQVJfQwkJCSgxPDw1KQorI2RlZmluZSAgIERBQ19VTklQT0xBUl9CCQkoMDw8NikKKyNkZWZpbmUgICBEQUNfQklQT0xBUl9CCQkJKDE8PDYpCisjZGVmaW5lICAgREFDX1VOSVBPTEFSX0EJCSgwPDw3KQorI2RlZmluZSAgIERBQ19CSVBPTEFSX0EJCQkoMTw8NykKKyNkZWZpbmUgICBEQUNfR0FJTl8wX0QJCQkoMDw8OCkKKyNkZWZpbmUgICBEQUNfR0FJTl8xX0QJCQkoMTw8OCkKKyNkZWZpbmUgICBEQUNfR0FJTl8wX0MJCQkoMDw8OSkKKyNkZWZpbmUgICBEQUNfR0FJTl8xX0MJCQkoMTw8OSkKKyNkZWZpbmUgICBEQUNfR0FJTl8wX0IJCQkoMDw8MTApCisjZGVmaW5lICAgREFDX0dBSU5fMV9CCQkJKDE8PDEwKQorI2RlZmluZSAgIERBQ19HQUlOXzBfQQkJCSgwPDwxMSkKKyNkZWZpbmUgICBEQUNfR0FJTl8xX0EJCQkoMTw8MTEpCisjZGVmaW5lIE1FX0RBQ19DT05UUk9MX1VQREFURQkJMHgwMDEyCS8qIFIgfCAtICovCisjZGVmaW5lIE1FX0RBQ19EQVRBX0EJCQkweDAwMTQJLyogLSB8IFcgKi8KKyNkZWZpbmUgTUVfREFDX0RBVEFfQgkJCTB4MDAxNgkvKiAtIHwgVyAqLworI2RlZmluZSBNRV9EQUNfREFUQV9DCQkJMHgwMDE4CS8qIC0gfCBXICovCisjZGVmaW5lIE1FX0RBQ19EQVRBX0QJCQkweDAwMUEJLyogLSB8IFcgKi8KKyNkZWZpbmUgTUVfQ09VTlRFUl9FTkREQVRBX0EJCTB4MDAxQwkvKiAtIHwgVyAqLworI2RlZmluZSBNRV9DT1VOVEVSX0VORERBVEFfQgkJMHgwMDFFCS8qIC0gfCBXICovCisjZGVmaW5lIE1FX0NPVU5URVJfU1RBUlREQVRBX0EJCTB4MDAyMAkvKiAtIHwgVyAqLworI2RlZmluZSBNRV9DT1VOVEVSX1ZBTFVFX0EJCTB4MDAyMAkvKiBSIHwgLSAqLworI2RlZmluZSBNRV9DT1VOVEVSX1NUQVJUREFUQV9CCQkweDAwMjIJLyogLSB8IFcgKi8KKyNkZWZpbmUgTUVfQ09VTlRFUl9WQUxVRV9CCQkweDAwMjIJLyogUiB8IC0gKi8KKworLyogRnVuY3Rpb24gcHJvdG90eXBlcyAqLworc3RhdGljIGludCBtZV9hdHRhY2goY29tZWRpX2RldmljZSAqZGV2LCBjb21lZGlfZGV2Y29uZmlnICppdCk7CitzdGF0aWMgaW50IG1lX2RldGFjaChjb21lZGlfZGV2aWNlICpkZXYpOworCitzdGF0aWMgY29uc3QgY29tZWRpX2xyYW5nZSBtZTIwMDBfYWlfcmFuZ2UgPSB7CisJOCwKKwl7CisJCUJJUF9SQU5HRSgxMCksCisJCUJJUF9SQU5HRSg1KSwKKwkJQklQX1JBTkdFKDIuNSksCisJCUJJUF9SQU5HRSgxLjI1KSwKKwkJVU5JX1JBTkdFKDEwKSwKKwkJVU5JX1JBTkdFKDUpLAorCQlVTklfUkFOR0UoMi41KSwKKwkJVU5JX1JBTkdFKDEuMjUpCisJfQorfTsKKworc3RhdGljIGNvbnN0IGNvbWVkaV9scmFuZ2UgbWUyNjAwX2FpX3JhbmdlID0geworCTgsCisJeworCQkJQklQX1JBTkdFKDEwKSwKKwkJCUJJUF9SQU5HRSg1KSwKKwkJCUJJUF9SQU5HRSgyLjUpLAorCQkJQklQX1JBTkdFKDEuMjUpLAorCQkJVU5JX1JBTkdFKDEwKSwKKwkJCVVOSV9SQU5HRSg1KSwKKwkJCVVOSV9SQU5HRSgyLjUpLAorCQkJVU5JX1JBTkdFKDEuMjUpCisJCX0KK307CisKK3N0YXRpYyBjb25zdCBjb21lZGlfbHJhbmdlIG1lMjYwMF9hb19yYW5nZSA9IHsKKwkzLAorCXsKKwkJCUJJUF9SQU5HRSgxMCksCisJCQlCSVBfUkFOR0UoNSksCisJCQlVTklfUkFOR0UoMTApCisJCX0KK307CisKK3N0YXRpYyBERUZJTkVfUENJX0RFVklDRV9UQUJMRShtZV9wY2lfdGFibGUpID0geworCXtQQ0lfVkVORE9SX0lEX01FSUxIQVVTLCBNRTI2MDBfREVWSUNFX0lELCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLAorCQkwfSwKKwl7UENJX1ZFTkRPUl9JRF9NRUlMSEFVUywgTUUyMDAwX0RFVklDRV9JRCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwKKwkJMH0sCisJezB9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgbWVfcGNpX3RhYmxlKTsKKworLyogQm9hcmQgc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgKi8KK3N0cnVjdCBtZV9ib2FyZCB7CisJY29uc3QgY2hhciAqbmFtZTsJLyogZHJpdmVyIG5hbWUgKi8KKwlpbnQgZGV2aWNlX2lkOworCWludCBhb19jaGFubmVsX25icjsJLyogREEgY29uZmlnICovCisJaW50IGFvX3Jlc29sdXRpb247CisJaW50IGFvX3Jlc29sdXRpb25fbWFzazsKKwljb25zdCBjb21lZGlfbHJhbmdlICphb19yYW5nZV9saXN0OworCWludCBhaV9jaGFubmVsX25icjsJLyogQUQgY29uZmlnICovCisJaW50IGFpX3Jlc29sdXRpb247CisJaW50IGFpX3Jlc29sdXRpb25fbWFzazsKKwljb25zdCBjb21lZGlfbHJhbmdlICphaV9yYW5nZV9saXN0OworCWludCBkaW9fY2hhbm5lbF9uYnI7CS8qIERJTyBjb25maWcgKi8KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbWVfYm9hcmQgbWVfYm9hcmRzW10gPSB7CisJeworCQkvKiAtLSBNRS0yNjAwaSAtLSAqLworCQkubmFtZSA9IAkJTUVfRFJJVkVSX05BTUUsCisJCS5kZXZpY2VfaWQgPQkJTUUyNjAwX0RFVklDRV9JRCwKKwkJLyogQW5hbG9nIE91dHB1dCAqLworCQkuYW9fY2hhbm5lbF9uYnIgPQk0LAorCQkuYW9fcmVzb2x1dGlvbiA9CTEyLAorCQkuYW9fcmVzb2x1dGlvbl9tYXNrID0JMHgwZmZmLAorCQkuYW9fcmFuZ2VfbGlzdCA9CSZtZTI2MDBfYW9fcmFuZ2UsCisJCS5haV9jaGFubmVsX25iciA9CTE2LAorCQkvKiBBbmFsb2cgSW5wdXQgKi8KKwkJLmFpX3Jlc29sdXRpb24gPQkxMiwKKwkJLmFpX3Jlc29sdXRpb25fbWFzayA9CTB4MGZmZiwKKwkJLmFpX3JhbmdlX2xpc3QgPQkmbWUyNjAwX2FpX3JhbmdlLAorCQkuZGlvX2NoYW5uZWxfbmJyID0JMzIsCisJCX0sCisJeworCQkvKiAtLSBNRS0yMDAwaSAtLSAqLworCQkubmFtZSA9CQkJTUVfRFJJVkVSX05BTUUsCisJCS5kZXZpY2VfaWQgPQkJTUUyMDAwX0RFVklDRV9JRCwKKwkJLyogQW5hbG9nIE91dHB1dCAqLworCQkuYW9fY2hhbm5lbF9uYnIgPQkwLAorCQkuYW9fcmVzb2x1dGlvbiA9CTAsCisJCS5hb19yZXNvbHV0aW9uX21hc2sgPQkwLAorCQkuYW9fcmFuZ2VfbGlzdCA9CU5VTEwsCisJCS5haV9jaGFubmVsX25iciA9CTE2LAorCQkvKiBBbmFsb2cgSW5wdXQgKi8KKwkJLmFpX3Jlc29sdXRpb24gPQkxMiwKKwkJLmFpX3Jlc29sdXRpb25fbWFzayA9CTB4MGZmZiwKKwkJLmFpX3JhbmdlX2xpc3QgPQkmbWUyMDAwX2FpX3JhbmdlLAorCQkuZGlvX2NoYW5uZWxfbmJyID0JMzIsCisJCX0KK307CisKKyNkZWZpbmUgbWVfYm9hcmRfbmJyIChzaXplb2YobWVfYm9hcmRzKS9zaXplb2Yoc3RydWN0IG1lX2JvYXJkKSkKKworc3RhdGljIGNvbWVkaV9kcml2ZXIgbWVfZHJpdmVyID0geworICAgICAgLmRyaXZlcl9uYW1lID0JTUVfRFJJVkVSX05BTUUsCisgICAgICAubW9kdWxlID0JCVRISVNfTU9EVUxFLAorICAgICAgLmF0dGFjaCA9CQltZV9hdHRhY2gsCisgICAgICAuZGV0YWNoID0JCW1lX2RldGFjaCwKK307CitDT01FRElfUENJX0lOSVRDTEVBTlVQKG1lX2RyaXZlciwgbWVfcGNpX3RhYmxlKTsKKworLyogUHJpdmF0ZSBkYXRhIHN0cnVjdHVyZSAqLworc3RydWN0IG1lX3ByaXZhdGVfZGF0YSB7CisJc3RydWN0IHBjaV9kZXYgKnBjaV9kZXZpY2U7CisJdm9pZCBfX2lvbWVtICpwbHhfcmVnYmFzZTsJLyogUExYIGNvbmZpZ3VyYXRpb24gYmFzZSBhZGRyZXNzICovCisJdm9pZCBfX2lvbWVtICptZV9yZWdiYXNlOwkvKiBCYXNlIGFkZHJlc3Mgb2YgdGhlIE1laWxoYXVzIGNhcmQgKi8KKwl1bnNpZ25lZCBsb25nIHBseF9yZWdiYXNlX3NpemU7CS8qIFNpemUgb2YgUExYIGNvbmZpZ3VyYXRpb24gc3BhY2UgKi8KKwl1bnNpZ25lZCBsb25nIG1lX3JlZ2Jhc2Vfc2l6ZTsJLyogU2l6ZSBvZiBNZWlsaGF1cyBzcGFjZSAqLworCisJdW5zaWduZWQgc2hvcnQgY29udHJvbF8xOwkvKiBNaXJyb3Igb2YgQ09OVFJPTF8xIHJlZ2lzdGVyICovCisJdW5zaWduZWQgc2hvcnQgY29udHJvbF8yOwkvKiBNaXJyb3Igb2YgQ09OVFJPTF8yIHJlZ2lzdGVyICovCisJdW5zaWduZWQgc2hvcnQgZGFjX2NvbnRyb2w7CS8qIE1pcnJvciBvZiB0aGUgREFDX0NPTlRST0wgcmVnaXN0ZXIgKi8KKwlpbnQgYW9fcmVhZGJhY2tbNF07CS8qIE1pcnJvciBvZiBhbmFsb2cgb3V0cHV0IGRhdGEgKi8KK307CisKKyNkZWZpbmUgZGV2X3ByaXZhdGUgKChzdHJ1Y3QgbWVfcHJpdmF0ZV9kYXRhICopZGV2LT5wcml2YXRlKQorCisvKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogSGVscGZ1bCBmdW5jdGlvbnMKKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworc3RhdGljIGlubGluZSB2b2lkIHNsZWVwKHVuc2lnbmVkIHNlYykKK3sKKwljdXJyZW50LT5zdGF0ZSA9IFRBU0tfSU5URVJSVVBUSUJMRTsKKwlzY2hlZHVsZV90aW1lb3V0KHNlYyAqIEhaKTsKK30KKworLyoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIERJR0lUQUwgSU5QVVQvT1VUUFVUIFNFQ1RJT04KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworc3RhdGljIGludCBtZV9kaW9faW5zbl9jb25maWcoY29tZWRpX2RldmljZSAqZGV2LCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJICAgICAgY29tZWRpX2luc24gKmluc24sIGxzYW1wbF90ICpkYXRhKQoreworCWludCBiaXRzOworCWludCBtYXNrID0gMSA8PCBDUl9DSEFOKGluc24tPmNoYW5zcGVjKTsKKworCS8qIGNhbGN1bGF0ZSBwb3J0ICovCisJaWYgKG1hc2sgJiAweDAwMDBmZmZmKSB7CS8qIFBvcnQgQSBpbiB1c2UgKi8KKwkJYml0cyA9IDB4MDAwMGZmZmY7CisKKwkJLyogRW5hYmxlIFBvcnQgQSAqLworCQlkZXZfcHJpdmF0ZS0+Y29udHJvbF8yIHw9IEVOQUJMRV9QT1JUX0E7CisJCXdyaXRldyhkZXZfcHJpdmF0ZS0+Y29udHJvbF8yLAorCQkJZGV2X3ByaXZhdGUtPm1lX3JlZ2Jhc2UgKyBNRV9DT05UUk9MXzIpOworCX0gZWxzZSB7CQkvKiBQb3J0IEIgaW4gdXNlICovCisKKwkJYml0cyA9IDB4ZmZmZjAwMDA7CisKKwkJLyogRW5hYmxlIFBvcnQgQiAqLworCQlkZXZfcHJpdmF0ZS0+Y29udHJvbF8yIHw9IEVOQUJMRV9QT1JUX0I7CisJCXdyaXRldyhkZXZfcHJpdmF0ZS0+Y29udHJvbF8yLAorCQkJZGV2X3ByaXZhdGUtPm1lX3JlZ2Jhc2UgKyBNRV9DT05UUk9MXzIpOworCX0KKworCWlmIChkYXRhWzBdKSB7CisJCS8qIENvbmZpZyBwb3J0IGFzIG91dHB1dCAqLworCQlzLT5pb19iaXRzIHw9IGJpdHM7CisJfSBlbHNlIHsKKwkJLyogQ29uZmlnIHBvcnQgYXMgaW5wdXQgKi8KKwkJcy0+aW9fYml0cyAmPSB+Yml0czsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworLyogRGlnaXRhbCBpbnN0YW50IGlucHV0L291dHB1dHMgKi8KK3N0YXRpYyBpbnQgbWVfZGlvX2luc25fYml0cyhjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkgICAgY29tZWRpX2luc24gKmluc24sIGxzYW1wbF90ICpkYXRhKQoreworCXVuc2lnbmVkIGludCBtYXNrID0gZGF0YVswXTsKKwlzLT5zdGF0ZSAmPSB+bWFzazsKKwlzLT5zdGF0ZSB8PSAobWFzayAmIGRhdGFbMV0pOworCisJbWFzayAmPSBzLT5pb19iaXRzOworCWlmIChtYXNrICYgMHgwMDAwZmZmZikgewkvKiBQb3J0IEEgKi8KKwkJd3JpdGV3KChzLT5zdGF0ZSAmIDB4ZmZmZiksCisJCQlkZXZfcHJpdmF0ZS0+bWVfcmVnYmFzZSArIE1FX0RJT19QT1JUX0EpOworCX0gZWxzZSB7CisJCWRhdGFbMV0gJj0gfjB4MDAwMGZmZmY7CisJCWRhdGFbMV0gfD0gcmVhZHcoZGV2X3ByaXZhdGUtPm1lX3JlZ2Jhc2UgKyBNRV9ESU9fUE9SVF9BKTsKKwl9CisKKwlpZiAobWFzayAmIDB4ZmZmZjAwMDApIHsJLyogUG9ydCBCICovCisJCXdyaXRldygoKHMtPnN0YXRlID4+IDE2KSAmIDB4ZmZmZiksCisJCQlkZXZfcHJpdmF0ZS0+bWVfcmVnYmFzZSArIE1FX0RJT19QT1JUX0IpOworCX0gZWxzZSB7CisJCWRhdGFbMV0gJj0gfjB4ZmZmZjAwMDA7CisJCWRhdGFbMV0gfD0gcmVhZHcoZGV2X3ByaXZhdGUtPm1lX3JlZ2Jhc2UgKyBNRV9ESU9fUE9SVF9CKSA8PCAxNjsKKwl9CisKKwlyZXR1cm4gMjsKK30KKworLyoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIEFOQUxPRyBJTlBVVCBTRUNUSU9OCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworLyogQW5hbG9nIGluc3RhbnQgaW5wdXQgKi8KK3N0YXRpYyBpbnQgbWVfYWlfaW5zbl9yZWFkKGNvbWVkaV9kZXZpY2UgKmRldiwgY29tZWRpX3N1YmRldmljZSAqc3ViZGV2aWNlLAorCQkJICAgY29tZWRpX2luc24gKmluc24sIGxzYW1wbF90ICpkYXRhKQoreworCXVuc2lnbmVkIHNob3J0IHZhbHVlOworCWludCBjaGFuID0gQ1JfQ0hBTigoJmluc24tPmNoYW5zcGVjKVswXSk7CisJaW50IHJhbmcgPSBDUl9SQU5HRSgoJmluc24tPmNoYW5zcGVjKVswXSk7CisJaW50IGFyZWYgPSBDUl9BUkVGKCgmaW5zbi0+Y2hhbnNwZWMpWzBdKTsKKwlpbnQgaTsKKworCS8qIHN0b3AgYW55IHJ1bm5pbmcgY29udmVyc2lvbiAqLworCWRldl9wcml2YXRlLT5jb250cm9sXzEgJj0gMHhGRkZDOworCXdyaXRldyhkZXZfcHJpdmF0ZS0+Y29udHJvbF8xLCBkZXZfcHJpdmF0ZS0+bWVfcmVnYmFzZSArIE1FX0NPTlRST0xfMSk7CisKKwkvKiBjbGVhciBjaGFubGlzdCBhbmQgYWQgZmlmbyAqLworCWRldl9wcml2YXRlLT5jb250cm9sXzIgJj0gfihFTkFCTEVfQURGSUZPIHwgRU5BQkxFX0NIQU5MSVNUKTsKKwl3cml0ZXcoZGV2X3ByaXZhdGUtPmNvbnRyb2xfMiwgZGV2X3ByaXZhdGUtPm1lX3JlZ2Jhc2UgKyBNRV9DT05UUk9MXzIpOworCisJLyogcmVzZXQgYW55IHBlbmRpbmcgaW50ZXJydXB0ICovCisJd3JpdGV3KDB4MDAsIGRldl9wcml2YXRlLT5tZV9yZWdiYXNlICsgTUVfUkVTRVRfSU5URVJSVVBUKTsKKworCS8qIGVuYWJsZSB0aGUgY2hhbmxpc3QgYW5kIEFEQyBmaWZvICovCisJZGV2X3ByaXZhdGUtPmNvbnRyb2xfMiB8PSAoRU5BQkxFX0FERklGTyB8IEVOQUJMRV9DSEFOTElTVCk7CisJd3JpdGV3KGRldl9wcml2YXRlLT5jb250cm9sXzIsIGRldl9wcml2YXRlLT5tZV9yZWdiYXNlICsgTUVfQ09OVFJPTF8yKTsKKworCS8qIHdyaXRlIHRvIGNoYW5uZWwgbGlzdCBmaWZvICovCisJLyogYjM6YjAgYXJlIHRoZSBjaGFubmVsIG51bWJlciAqLworCXZhbHVlID0gY2hhbiAmIDB4MGY7CisJLyogYjU6YjQgYXJlIHRoZSBjaGFubmVsIGdhaW4gKi8KKwl2YWx1ZSB8PSAocmFuZyAmIDB4MDMpIDw8IDQ7CisJLyogYjYgY2hhbm5lbCBwb2xhcml0eSAqLworCXZhbHVlIHw9IChyYW5nICYgMHgwNCkgPDwgNDsKKwkvKiBiNyBzaW5nbGUgb3IgZGlmZmVyZW50aWFsICovCisJdmFsdWUgfD0gKChhcmVmICYgQVJFRl9ESUZGKSA/IDB4ODAgOiAwKTsKKwl3cml0ZXcodmFsdWUgJiAweGZmLCBkZXZfcHJpdmF0ZS0+bWVfcmVnYmFzZSArIE1FX0NIQU5ORUxfTElTVCk7CisKKwkvKiBzZXQgQURDIG1vZGUgdG8gc29mdHdhcmUgdHJpZ2dlciAqLworCWRldl9wcml2YXRlLT5jb250cm9sXzEgfD0gU09GVFdBUkVfVFJJR0dFUkVEX0FEQzsKKwl3cml0ZXcoZGV2X3ByaXZhdGUtPmNvbnRyb2xfMSwgZGV2X3ByaXZhdGUtPm1lX3JlZ2Jhc2UgKyBNRV9DT05UUk9MXzEpOworCisJLyogc3RhcnQgY29udmVyc2lvbiBieSByZWFkaW5nIGZyb20gQURDX1NUQVJUICovCisJcmVhZHcoZGV2X3ByaXZhdGUtPm1lX3JlZ2Jhc2UgKyBNRV9BRENfU1RBUlQpOworCisJLyogd2FpdCBmb3IgQURDIGZpZm8gbm90IGVtcHR5IGZsYWcgKi8KKwlmb3IgKGkgPSAxMDAwMDA7IGkgPiAwOyBpLS0pCisJCWlmICghKHJlYWR3KGRldl9wcml2YXRlLT5tZV9yZWdiYXNlICsgTUVfU1RBVFVTKSAmIDB4MDAwNCkpCisJCQlicmVhazsKKworCS8qIGdldCB2YWx1ZSBmcm9tIEFEQyBmaWZvICovCisJaWYgKGkpIHsKKwkJZGF0YVswXSA9CisJCQkocmVhZHcoZGV2X3ByaXZhdGUtPm1lX3JlZ2Jhc2UgKworCQkJCU1FX1JFQURfQURfRklGTykgXiAweDgwMCkgJiAweDBGRkY7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJjb21lZGklZDogQ2Fubm90IGdldCBzaW5nbGUgdmFsdWVcbiIsCisJCSAgICAgICBkZXYtPm1pbm9yKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJLyogc3RvcCBhbnkgcnVubmluZyBjb252ZXJzaW9uICovCisJZGV2X3ByaXZhdGUtPmNvbnRyb2xfMSAmPSAweEZGRkM7CisJd3JpdGV3KGRldl9wcml2YXRlLT5jb250cm9sXzEsIGRldl9wcml2YXRlLT5tZV9yZWdiYXNlICsgTUVfQ09OVFJPTF8xKTsKKworCXJldHVybiAxOworfQorCisvKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogSEFSRFdBUkUgVFJJR0dFUkVEIEFOQUxPRyBJTlBVVCBTRUNUSU9OCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworLyogQ2FuY2VsIGFuYWxvZyBpbnB1dCBhdXRvc2NhbiAqLworc3RhdGljIGludCBtZV9haV9jYW5jZWwoY29tZWRpX2RldmljZSAqZGV2LCBjb21lZGlfc3ViZGV2aWNlICpzKQoreworCS8qIGRpc2FibGUgaW50ZXJydXB0cyAqLworCisJLyogc3RvcCBhbnkgcnVubmluZyBjb252ZXJzaW9uICovCisJZGV2X3ByaXZhdGUtPmNvbnRyb2xfMSAmPSAweEZGRkM7CisJd3JpdGV3KGRldl9wcml2YXRlLT5jb250cm9sXzEsIGRldl9wcml2YXRlLT5tZV9yZWdiYXNlICsgTUVfQ09OVFJPTF8xKTsKKworCXJldHVybiAwOworfQorCisvKiBUZXN0IGFuYWxvZyBpbnB1dCBjb21tYW5kICovCitzdGF0aWMgaW50IG1lX2FpX2RvX2NtZF90ZXN0KGNvbWVkaV9kZXZpY2UgKmRldiwgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCSAgICAgY29tZWRpX2NtZCAqY21kKQoreworCXJldHVybiAwOworfQorCisvKiBBbmFsb2cgaW5wdXQgY29tbWFuZCAqLworc3RhdGljIGludCBtZV9haV9kb19jbWQoY29tZWRpX2RldmljZSAqZGV2LCBjb21lZGlfc3ViZGV2aWNlICpzdWJkZXZpY2UpCit7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBBTkFMT0cgT1VUUFVUIFNFQ1RJT04KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisvKiBBbmFsb2cgaW5zdGFudCBvdXRwdXQgKi8KK3N0YXRpYyBpbnQgbWVfYW9faW5zbl93cml0ZShjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkgICAgY29tZWRpX2luc24gKmluc24sIGxzYW1wbF90ICpkYXRhKQoreworCWludCBjaGFuOworCWludCByYW5nOworCWludCBpOworCisJLyogRW5hYmxlIGFsbCBEQUMgKi8KKwlkZXZfcHJpdmF0ZS0+Y29udHJvbF8yIHw9IEVOQUJMRV9EQUM7CisJd3JpdGV3KGRldl9wcml2YXRlLT5jb250cm9sXzIsIGRldl9wcml2YXRlLT5tZV9yZWdiYXNlICsgTUVfQ09OVFJPTF8yKTsKKworCS8qIGFuZCBzZXQgREFDIHRvICJidWZmZXJlZCIgbW9kZSAqLworCWRldl9wcml2YXRlLT5jb250cm9sXzIgfD0gQlVGRkVSRURfREFDOworCXdyaXRldyhkZXZfcHJpdmF0ZS0+Y29udHJvbF8yLCBkZXZfcHJpdmF0ZS0+bWVfcmVnYmFzZSArIE1FX0NPTlRST0xfMik7CisKKwkvKiBTZXQgZGFjLWNvbnRyb2wgcmVnaXN0ZXIgKi8KKwlmb3IgKGkgPSAwOyBpIDwgaW5zbi0+bjsgaSsrKSB7CisJCWNoYW4gPSBDUl9DSEFOKCgmaW5zbi0+Y2hhbnNwZWMpW2ldKTsKKwkJcmFuZyA9IENSX1JBTkdFKCgmaW5zbi0+Y2hhbnNwZWMpW2ldKTsKKworCQkvKiBjbGVhciBiaXRzIGZvciB0aGlzIGNoYW5uZWwgKi8KKwkJZGV2X3ByaXZhdGUtPmRhY19jb250cm9sICY9IH4oMHgwODgwID4+IGNoYW4pOworCQlpZiAocmFuZyA9PSAwKQorCQkJZGV2X3ByaXZhdGUtPmRhY19jb250cm9sIHw9CisJCQkJKChEQUNfQklQT0xBUl9BIHwgREFDX0dBSU5fMV9BKSA+PiBjaGFuKTsKKwkJZWxzZSBpZiAocmFuZyA9PSAxKQorCQkJZGV2X3ByaXZhdGUtPmRhY19jb250cm9sIHw9CisJCQkJKChEQUNfQklQT0xBUl9BIHwgREFDX0dBSU5fMF9BKSA+PiBjaGFuKTsKKwl9CisJd3JpdGV3KGRldl9wcml2YXRlLT5kYWNfY29udHJvbCwKKwkJZGV2X3ByaXZhdGUtPm1lX3JlZ2Jhc2UgKyBNRV9EQUNfQ09OVFJPTCk7CisKKwkvKiBVcGRhdGUgZGFjLWNvbnRyb2wgcmVnaXN0ZXIgKi8KKwlyZWFkdyhkZXZfcHJpdmF0ZS0+bWVfcmVnYmFzZSArIE1FX0RBQ19DT05UUk9MX1VQREFURSk7CisKKwkvKiBTZXQgZGF0YSByZWdpc3RlciAqLworCWZvciAoaSA9IDA7IGkgPCBpbnNuLT5uOyBpKyspIHsKKwkJY2hhbiA9IENSX0NIQU4oKCZpbnNuLT5jaGFuc3BlYylbaV0pOworCQl3cml0ZXcoKGRhdGFbMF0gJiBzLT5tYXhkYXRhKSwKKwkJCWRldl9wcml2YXRlLT5tZV9yZWdiYXNlICsgTUVfREFDX0RBVEFfQSArIChjaGFuIDw8IDEpKTsKKwkJZGV2X3ByaXZhdGUtPmFvX3JlYWRiYWNrW2NoYW5dID0gKGRhdGFbMF0gJiBzLT5tYXhkYXRhKTsKKwl9CisKKwkvKiBVcGRhdGUgZGFjIHdpdGggZGF0YSByZWdpc3RlcnMgKi8KKwlyZWFkdyhkZXZfcHJpdmF0ZS0+bWVfcmVnYmFzZSArIE1FX0RBQ19VUERBVEUpOworCisJcmV0dXJuIGk7Cit9CisKKy8qIEFuYWxvZyBvdXRwdXQgcmVhZGJhY2sgKi8KK3N0YXRpYyBpbnQgbWVfYW9faW5zbl9yZWFkKGNvbWVkaV9kZXZpY2UgKmRldiwgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCSAgIGNvbWVkaV9pbnNuICppbnNuLCBsc2FtcGxfdCAqZGF0YSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBpbnNuLT5uOyBpKyspIHsKKwkJZGF0YVtpXSA9CisJCQlkZXZfcHJpdmF0ZS0+YW9fcmVhZGJhY2tbQ1JfQ0hBTigoJmluc24tPmNoYW5zcGVjKVtpXSldOworCX0KKworCXJldHVybiAxOworfQorCisvKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogSU5JVElBTElTQVRJT04gU0VDVElPTgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKKy8qIFhpbGlueCBmaXJtd2FyZSBkb3dubG9hZCBmb3IgY2FyZDogTUUtMjYwMGkgKi8KK3N0YXRpYyBpbnQgbWUyNjAwX3hpbGlueF9kb3dubG9hZChjb21lZGlfZGV2aWNlICpkZXYsCisJCQkJICB1bnNpZ25lZCBjaGFyICptZTI2MDBfZmlybXdhcmUsCisJCQkJICB1bnNpZ25lZCBpbnQgbGVuZ3RoKQoreworCXVuc2lnbmVkIGludCB2YWx1ZTsKKwl1bnNpZ25lZCBpbnQgZmlsZV9sZW5ndGg7CisJdW5zaWduZWQgaW50IGk7CisKKwkvKiBkaXNhYmxlIGlycSdzIG9uIFBMWCAqLworCXdyaXRlbCgweDAwLCBkZXZfcHJpdmF0ZS0+cGx4X3JlZ2Jhc2UgKyBQTFhfSU5UQ1NSKTsKKworCS8qIEZpcnN0LCBtYWtlIGEgZHVtbXkgcmVhZCB0byByZXNldCB4aWxpbnggKi8KKwl2YWx1ZSA9IHJlYWR3KGRldl9wcml2YXRlLT5tZV9yZWdiYXNlICsgWElMSU5YX0RPV05MT0FEX1JFU0VUKTsKKworCS8qIFdhaXQgdW50aWwgcmVzZXQgaXMgb3ZlciAqLworCXNsZWVwKDEpOworCisJLyogV3JpdGUgYSBkdW1teSB2YWx1ZSB0byBYaWxpbnggKi8KKwl3cml0ZWIoMHgwMCwgZGV2X3ByaXZhdGUtPm1lX3JlZ2Jhc2UgKyAweDApOworCXNsZWVwKDEpOworCisJLyoKKwkgKiBGb3JtYXQgb2YgdGhlIGZpcm13YXJlCisJICogQnVpbGQgbG9uZ3MgZnJvbSB0aGUgYnl0ZS13aXNlIGNvZGVkIGhlYWRlcgorCSAqIEJ5dGUgMS0zOiAgIGxlbmd0aCBvZiB0aGUgYXJyYXkKKwkgKiBCeXRlIDQtNzogICB2ZXJzaW9uCisJICogQnl0ZSA4LTExOiAgZGF0ZQorCSAqIEJ5dGUgMTItMTU6IHJlc2VydmVkCisJICovCisJaWYgKGxlbmd0aCA8IDE2KQorCQlyZXR1cm4gLUVJTlZBTDsKKwlmaWxlX2xlbmd0aCA9ICgoKHVuc2lnbmVkIGludCltZTI2MDBfZmlybXdhcmVbMF0gJiAweGZmKSA8PCAyNCkgKworCQkgICAgICAoKCh1bnNpZ25lZCBpbnQpbWUyNjAwX2Zpcm13YXJlWzFdICYgMHhmZikgPDwgMTYpICsKKwkJICAgICAgKCgodW5zaWduZWQgaW50KW1lMjYwMF9maXJtd2FyZVsyXSAmIDB4ZmYpIDw8IDgpICsKKwkJICAgICAgKCh1bnNpZ25lZCBpbnQpbWUyNjAwX2Zpcm13YXJlWzNdICYgMHhmZik7CisKKwkvKgorCSAqIExvb3AgZm9yIHdyaXRpbmcgZmlybXdhcmUgYnl0ZSBieSBieXRlIHRvIHhpbGlueAorCSAqIEZpcm13YXJlIGRhdGEgc3RhcnQgYXQgb2ZmZnNldCAxNgorCSAqLworCWZvciAoaSA9IDA7IGkgPCBmaWxlX2xlbmd0aDsgaSsrKQorCQl3cml0ZWIoKG1lMjYwMF9maXJtd2FyZVsxNiArIGldICYgMHhmZiksCisJCQlkZXZfcHJpdmF0ZS0+bWVfcmVnYmFzZSArIDB4MCk7CisKKwkvKiBXcml0ZSA1IGR1bW15IHZhbHVlcyB0byB4aWxpbnggKi8KKwlmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKQorCQl3cml0ZWIoMHgwMCwgZGV2X3ByaXZhdGUtPm1lX3JlZ2Jhc2UgKyAweDApOworCisJLyogVGVzdCBpZiB0aGVyZSB3YXMgYW4gZXJyb3IgZHVyaW5nIGRvd25sb2FkIC0+IElOVEIgd2FzIHRocm93biAqLworCXZhbHVlID0gcmVhZGwoZGV2X3ByaXZhdGUtPnBseF9yZWdiYXNlICsgUExYX0lOVENTUik7CisJaWYgKHZhbHVlICYgMHgyMCkgeworCQkvKiBEaXNhYmxlIGludGVycnVwdCAqLworCQl3cml0ZWwoMHgwMCwgZGV2X3ByaXZhdGUtPnBseF9yZWdiYXNlICsgUExYX0lOVENTUik7CisJCXByaW50ayhLRVJOX0VSUiAiY29tZWRpJWQ6IFhpbGlueCBkb3dubG9hZCBmYWlsZWRcbiIsCisJCSAgICAgICBkZXYtPm1pbm9yKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJLyogV2FpdCB1bnRpbCB0aGUgWGlsaW54IGlzIHJlYWR5IGZvciByZWFsIHdvcmsgKi8KKwlzbGVlcCgxKTsKKworCS8qIEVuYWJsZSBQTFgtSW50ZXJydXB0cyAqLworCXdyaXRlbCgweDQzLCBkZXZfcHJpdmF0ZS0+cGx4X3JlZ2Jhc2UgKyBQTFhfSU5UQ1NSKTsKKworCXJldHVybiAwOworfQorCisvKiBSZXNldCBkZXZpY2UgKi8KK3N0YXRpYyBpbnQgbWVfcmVzZXQoY29tZWRpX2RldmljZSAqZGV2KQoreworCS8qIFJlc2V0IGJvYXJkICovCisJd3JpdGV3KDB4MDAsIGRldl9wcml2YXRlLT5tZV9yZWdiYXNlICsgTUVfQ09OVFJPTF8xKTsKKwl3cml0ZXcoMHgwMCwgZGV2X3ByaXZhdGUtPm1lX3JlZ2Jhc2UgKyBNRV9DT05UUk9MXzIpOworCXdyaXRldygweDAwLCBkZXZfcHJpdmF0ZS0+bWVfcmVnYmFzZSArIE1FX1JFU0VUX0lOVEVSUlVQVCk7CisJd3JpdGV3KDB4MDAsIGRldl9wcml2YXRlLT5tZV9yZWdiYXNlICsgTUVfREFDX0NPTlRST0wpOworCisJLyogU2F2ZSB2YWx1ZXMgaW4gdGhlIGJvYXJkIGNvbnRleHQgKi8KKwlkZXZfcHJpdmF0ZS0+ZGFjX2NvbnRyb2wgPSAwOworCWRldl9wcml2YXRlLT5jb250cm9sXzEgPSAwOworCWRldl9wcml2YXRlLT5jb250cm9sXzIgPSAwOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBBdHRhY2gKKyAqCisgKiAtIFJlZ2lzdGVyIFBDSSBkZXZpY2UKKyAqIC0gRGVjbGFyZSBkZXZpY2UgZHJpdmVyIGNhcGFiaWxpdHkKKyAqLworc3RhdGljIGludCBtZV9hdHRhY2goY29tZWRpX2RldmljZSAqZGV2LCBjb21lZGlfZGV2Y29uZmlnICppdCkKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldmljZTsKKwljb21lZGlfc3ViZGV2aWNlICpzdWJkZXZpY2U7CisJc3RydWN0IG1lX2JvYXJkICpib2FyZDsKKwlyZXNvdXJjZV9zaXplX3QgcGx4X3JlZ2Jhc2VfdG1wOworCXVuc2lnbmVkIGxvbmcgcGx4X3JlZ2Jhc2Vfc2l6ZV90bXA7CisJcmVzb3VyY2Vfc2l6ZV90IG1lX3JlZ2Jhc2VfdG1wOworCXVuc2lnbmVkIGxvbmcgbWVfcmVnYmFzZV9zaXplX3RtcDsKKwlyZXNvdXJjZV9zaXplX3Qgc3dhcF9yZWdiYXNlX3RtcDsKKwl1bnNpZ25lZCBsb25nIHN3YXBfcmVnYmFzZV9zaXplX3RtcDsKKwlyZXNvdXJjZV9zaXplX3QgcmVnYmFzZV90bXA7CisJaW50IHJlc3VsdCwgZXJyb3IsIGk7CisKKwkvKiBBbGxvY2F0ZSBwcml2YXRlIG1lbW9yeSAqLworCWlmIChhbGxvY19wcml2YXRlKGRldiwgc2l6ZW9mKHN0cnVjdCBtZV9wcml2YXRlX2RhdGEpKSA8IDApCisJCXJldHVybiAtRU5PTUVNOworCisJLyogUHJvYmUgdGhlIGRldmljZSB0byBkZXRlcm1pbmUgd2hhdCBkZXZpY2UgaW4gdGhlIHNlcmllcyBpdCBpcy4gKi8KKwlmb3IgKHBjaV9kZXZpY2UgPSBwY2lfZ2V0X2RldmljZShQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBOVUxMKTsKKwkJcGNpX2RldmljZSAhPSBOVUxMOworCQlwY2lfZGV2aWNlID0KKwkJcGNpX2dldF9kZXZpY2UoUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgcGNpX2RldmljZSkpIHsKKwkJaWYgKHBjaV9kZXZpY2UtPnZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX01FSUxIQVVTKSB7CisJCQlmb3IgKGkgPSAwOyBpIDwgbWVfYm9hcmRfbmJyOyBpKyspIHsKKwkJCQlpZiAobWVfYm9hcmRzW2ldLmRldmljZV9pZCA9PQorCQkJCQlwY2lfZGV2aWNlLT5kZXZpY2UpIHsKKwkJCQkJLyoKKwkJCQkJICogd2FzIGEgcGFydGljdWxhciBidXMvc2xvdCByZXF1ZXN0ZWQ/CisJCQkJCSAqLworCQkJCQlpZiAoKGl0LT5vcHRpb25zWzBdICE9IDApCisJCQkJCQl8fCAoaXQtPm9wdGlvbnNbMV0gIT0gMCkpIHsKKwkJCQkJCS8qCisJCQkJCQkgKiBhcmUgd2Ugb24gdGhlIHdyb25nIGJ1cy9zbG90PworCQkJCQkJICovCisJCQkJCQlpZiAocGNpX2RldmljZS0+YnVzLT5udW1iZXIgIT0KKwkJCQkJCQlpdC0+b3B0aW9uc1swXQorCQkJCQkJCXx8IFBDSV9TTE9UKHBjaV9kZXZpY2UtPgorCQkJCQkJCQlkZXZmbikgIT0KKwkJCQkJCQlpdC0+b3B0aW9uc1sxXSkgeworCQkJCQkJCWNvbnRpbnVlOworCQkJCQkJfQorCQkJCQl9CisKKwkJCQkJZGV2LT5ib2FyZF9wdHIgPSBtZV9ib2FyZHMgKyBpOworCQkJCQlib2FyZCA9IChzdHJ1Y3QgbWVfYm9hcmQgKikgZGV2LT4KKwkJCQkJCWJvYXJkX3B0cjsKKwkJCQkJZGV2X3ByaXZhdGUtPnBjaV9kZXZpY2UgPSBwY2lfZGV2aWNlOworCQkJCQlnb3RvIGZvdW5kOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCXByaW50ayhLRVJOX0VSUgorCSAgICAgICAiY29tZWRpJWQ6IG5vIHN1cHBvcnRlZCBib2FyZCBmb3VuZCEgKHJlcS4gYnVzL3Nsb3QgOiAlZC8lZClcbiIsCisJICAgICAgIGRldi0+bWlub3IsIGl0LT5vcHRpb25zWzBdLCBpdC0+b3B0aW9uc1sxXSk7CisJcmV0dXJuIC1FSU87CisKK2ZvdW5kOgorCXByaW50ayhLRVJOX0lORk8gImNvbWVkaSVkOiBmb3VuZCAlcyBhdCBQQ0kgYnVzICVkLCBzbG90ICVkXG4iLAorCQlkZXYtPm1pbm9yLCBtZV9ib2FyZHNbaV0ubmFtZSwKKwkJcGNpX2RldmljZS0+YnVzLT5udW1iZXIsIFBDSV9TTE9UKHBjaV9kZXZpY2UtPmRldmZuKSk7CisKKwkvKiBFbmFibGUgUENJIGRldmljZSBhbmQgcmVxdWVzdCBQQ0kgcmVnaW9ucyAqLworCWlmIChjb21lZGlfcGNpX2VuYWJsZShwY2lfZGV2aWNlLCBNRV9EUklWRVJfTkFNRSkgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiY29tZWRpJWQ6IEZhaWxlZCB0byBlbmFibGUgUENJIGRldmljZSBhbmQgIgorCQkgICAgICAgInJlcXVlc3QgcmVnaW9uc1xuIiwgZGV2LT5taW5vcik7CisJCXJldHVybiAtRUlPOworCX0KKworCS8qIFNldCBkYXRhIGluIGRldmljZSBzdHJ1Y3R1cmUgKi8KKwlkZXYtPmJvYXJkX25hbWUgPSBib2FyZC0+bmFtZTsKKworCS8qIFJlYWQgUExYIHJlZ2lzdGVyIGJhc2UgYWRkcmVzcyBbUENJX0JBU0VfQUREUkVTUyAjMF0uICovCisJcGx4X3JlZ2Jhc2VfdG1wID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaV9kZXZpY2UsIDApOworCXBseF9yZWdiYXNlX3NpemVfdG1wID0gcGNpX3Jlc291cmNlX2xlbihwY2lfZGV2aWNlLCAwKTsKKwlkZXZfcHJpdmF0ZS0+cGx4X3JlZ2Jhc2UgPQorCQlpb3JlbWFwKHBseF9yZWdiYXNlX3RtcCwgcGx4X3JlZ2Jhc2Vfc2l6ZV90bXApOworCWRldl9wcml2YXRlLT5wbHhfcmVnYmFzZV9zaXplID0gcGx4X3JlZ2Jhc2Vfc2l6ZV90bXA7CisJaWYgKCFkZXZfcHJpdmF0ZS0+cGx4X3JlZ2Jhc2UpIHsKKwkJcHJpbnRrKCJjb21lZGklZDogRmFpbGVkIHRvIHJlbWFwIEkvTyBtZW1vcnlcbiIsIGRldi0+bWlub3IpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwkvKiBSZWFkIFN3YXAgYmFzZSBhZGRyZXNzIFtQQ0lfQkFTRV9BRERSRVNTICM1XS4gKi8KKworCXN3YXBfcmVnYmFzZV90bXAgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGNpX2RldmljZSwgNSk7CisJc3dhcF9yZWdiYXNlX3NpemVfdG1wID0gcGNpX3Jlc291cmNlX2xlbihwY2lfZGV2aWNlLCA1KTsKKworCWlmICghc3dhcF9yZWdiYXNlX3RtcCkKKwkJcHJpbnRrKEtFUk5fRVJSICJjb21lZGklZDogU3dhcCBub3QgcHJlc2VudFxuIiwgZGV2LT5taW5vcik7CisKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gV29ya2Fyb3VuZCBzdGFydCAtLS0qLworCWlmIChwbHhfcmVnYmFzZV90bXAgJiAweDAwODApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJjb21lZGklZDogUExYLUJ1ZyBkZXRlY3RlZFxuIiwgZGV2LT5taW5vcik7CisKKwkJaWYgKHN3YXBfcmVnYmFzZV90bXApIHsKKwkJCXJlZ2Jhc2VfdG1wID0gcGx4X3JlZ2Jhc2VfdG1wOworCQkJcGx4X3JlZ2Jhc2VfdG1wID0gc3dhcF9yZWdiYXNlX3RtcDsKKwkJCXN3YXBfcmVnYmFzZV90bXAgPSByZWdiYXNlX3RtcDsKKworCQkJcmVzdWx0ID0gcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwY2lfZGV2aWNlLAorCQkJCVBDSV9CQVNFX0FERFJFU1NfMCwgcGx4X3JlZ2Jhc2VfdG1wKTsKKwkJCWlmIChyZXN1bHQgIT0gUENJQklPU19TVUNDRVNTRlVMKQorCQkJCXJldHVybiAtRUlPOworCisJCQlyZXN1bHQgPSBwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBjaV9kZXZpY2UsCisJCQkJUENJX0JBU0VfQUREUkVTU181LCBzd2FwX3JlZ2Jhc2VfdG1wKTsKKwkJCWlmIChyZXN1bHQgIT0gUENJQklPU19TVUNDRVNTRlVMKQorCQkJCXJldHVybiAtRUlPOworCQl9IGVsc2UgeworCQkJcGx4X3JlZ2Jhc2VfdG1wIC09IDB4ODA7CisJCQlyZXN1bHQgPSBwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBjaV9kZXZpY2UsCisJCQkJUENJX0JBU0VfQUREUkVTU18wLCBwbHhfcmVnYmFzZV90bXApOworCQkJaWYgKHJlc3VsdCAhPSBQQ0lCSU9TX1NVQ0NFU1NGVUwpCisJCQkJcmV0dXJuIC1FSU87CisJCX0KKwl9CisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gV29ya2Fyb3VuZCBlbmQgLS0tLS0qLworCisJLyogUmVhZCBNZWlsaGF1cyByZWdpc3RlciBiYXNlIGFkZHJlc3MgW1BDSV9CQVNFX0FERFJFU1MgIzJdLiAqLworCisJbWVfcmVnYmFzZV90bXAgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGNpX2RldmljZSwgMik7CisJbWVfcmVnYmFzZV9zaXplX3RtcCA9IHBjaV9yZXNvdXJjZV9sZW4ocGNpX2RldmljZSwgMik7CisJZGV2X3ByaXZhdGUtPm1lX3JlZ2Jhc2Vfc2l6ZSA9IG1lX3JlZ2Jhc2Vfc2l6ZV90bXA7CisJZGV2X3ByaXZhdGUtPm1lX3JlZ2Jhc2UgPSBpb3JlbWFwKG1lX3JlZ2Jhc2VfdG1wLCBtZV9yZWdiYXNlX3NpemVfdG1wKTsKKwlpZiAoIWRldl9wcml2YXRlLT5tZV9yZWdiYXNlKSB7CisJCXByaW50ayhLRVJOX0VSUiAiY29tZWRpJWQ6IEZhaWxlZCB0byByZW1hcCBJL08gbWVtb3J5XG4iLAorCQkgICAgICAgZGV2LT5taW5vcik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwkvKiBEb3dubG9hZCBmaXJtd2FyZSBhbmQgcmVzZXQgY2FyZCAqLworCWlmIChib2FyZC0+ZGV2aWNlX2lkID09IE1FMjYwMF9ERVZJQ0VfSUQpIHsKKwkJdW5zaWduZWQgY2hhciAqYXV4X2RhdGE7CisJCWludCBhdXhfbGVuOworCisJCWF1eF9kYXRhID0gY29tZWRpX2F1eF9kYXRhKGl0LT5vcHRpb25zLCAwKTsKKwkJYXV4X2xlbiA9IGl0LT5vcHRpb25zW0NPTUVESV9ERVZDT05GX0FVWF9EQVRBX0xFTkdUSF07CisKKwkJaWYgKCFhdXhfZGF0YSB8fCBhdXhfbGVuIDwgMSkgeworCQkJY29tZWRpX2Vycm9yKGRldiwgIllvdSBtdXN0IHByb3ZpZGUgbWUyNjAwIGZpcm13YXJlICIKKwkJCQkgICAgICJ1c2luZyB0aGUgLS1pbml0LWRhdGEgb3B0aW9uIG9mICIKKwkJCQkgICAgICJjb21lZGlfY29uZmlnIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQltZTI2MDBfeGlsaW54X2Rvd25sb2FkKGRldiwgYXV4X2RhdGEsIGF1eF9sZW4pOworCX0KKworCW1lX3Jlc2V0KGRldik7CisKKwkvKiBkZXZpY2UgZHJpdmVyIGNhcGFiaWxpdGllcyAqLworCWVycm9yID0gYWxsb2Nfc3ViZGV2aWNlcyhkZXYsIDMpOworCWlmIChlcnJvciA8IDApCisJCXJldHVybiBlcnJvcjsKKworCXN1YmRldmljZSA9IGRldi0+c3ViZGV2aWNlcyArIDA7CisJc3ViZGV2aWNlLT50eXBlID0gQ09NRURJX1NVQkRfQUk7CisJc3ViZGV2aWNlLT5zdWJkZXZfZmxhZ3MgPSBTREZfUkVBREFCTEUgfCBTREZfQ09NTU9OIHwgU0RGX0NNRF9SRUFEOworCXN1YmRldmljZS0+bl9jaGFuID0gYm9hcmQtPmFpX2NoYW5uZWxfbmJyOworCXN1YmRldmljZS0+bWF4ZGF0YSA9IGJvYXJkLT5haV9yZXNvbHV0aW9uX21hc2s7CisJc3ViZGV2aWNlLT5sZW5fY2hhbmxpc3QgPSBib2FyZC0+YWlfY2hhbm5lbF9uYnI7CisJc3ViZGV2aWNlLT5yYW5nZV90YWJsZSA9IGJvYXJkLT5haV9yYW5nZV9saXN0OworCXN1YmRldmljZS0+Y2FuY2VsID0gbWVfYWlfY2FuY2VsOworCXN1YmRldmljZS0+aW5zbl9yZWFkID0gbWVfYWlfaW5zbl9yZWFkOworCXN1YmRldmljZS0+ZG9fY21kdGVzdCA9IG1lX2FpX2RvX2NtZF90ZXN0OworCXN1YmRldmljZS0+ZG9fY21kID0gbWVfYWlfZG9fY21kOworCisJc3ViZGV2aWNlID0gZGV2LT5zdWJkZXZpY2VzICsgMTsKKwlzdWJkZXZpY2UtPnR5cGUgPSBDT01FRElfU1VCRF9BTzsKKwlzdWJkZXZpY2UtPnN1YmRldl9mbGFncyA9IFNERl9XUklURUFCTEUgfCBTREZfQ09NTU9OOworCXN1YmRldmljZS0+bl9jaGFuID0gYm9hcmQtPmFvX2NoYW5uZWxfbmJyOworCXN1YmRldmljZS0+bWF4ZGF0YSA9IGJvYXJkLT5hb19yZXNvbHV0aW9uX21hc2s7CisJc3ViZGV2aWNlLT5sZW5fY2hhbmxpc3QgPSBib2FyZC0+YW9fY2hhbm5lbF9uYnI7CisJc3ViZGV2aWNlLT5yYW5nZV90YWJsZSA9IGJvYXJkLT5hb19yYW5nZV9saXN0OworCXN1YmRldmljZS0+aW5zbl9yZWFkID0gbWVfYW9faW5zbl9yZWFkOworCXN1YmRldmljZS0+aW5zbl93cml0ZSA9IG1lX2FvX2luc25fd3JpdGU7CisKKwlzdWJkZXZpY2UgPSBkZXYtPnN1YmRldmljZXMgKyAyOworCXN1YmRldmljZS0+dHlwZSA9IENPTUVESV9TVUJEX0RJTzsKKwlzdWJkZXZpY2UtPnN1YmRldl9mbGFncyA9IFNERl9SRUFEQUJMRSB8IFNERl9XUklURUFCTEU7CisJc3ViZGV2aWNlLT5uX2NoYW4gPSBib2FyZC0+ZGlvX2NoYW5uZWxfbmJyOworCXN1YmRldmljZS0+bWF4ZGF0YSA9IDE7CisJc3ViZGV2aWNlLT5sZW5fY2hhbmxpc3QgPSBib2FyZC0+ZGlvX2NoYW5uZWxfbmJyOworCXN1YmRldmljZS0+cmFuZ2VfdGFibGUgPSAmcmFuZ2VfZGlnaXRhbDsKKwlzdWJkZXZpY2UtPmluc25fYml0cyA9IG1lX2Rpb19pbnNuX2JpdHM7CisJc3ViZGV2aWNlLT5pbnNuX2NvbmZpZyA9IG1lX2Rpb19pbnNuX2NvbmZpZzsKKwlzdWJkZXZpY2UtPmlvX2JpdHMgPSAwOworCisJcHJpbnRrKEtFUk5fSU5GTyAiY29tZWRpJWQ6ICJNRV9EUklWRVJfTkFNRSIgYXR0YWNoZWQuXG4iLCBkZXYtPm1pbm9yKTsKKwlyZXR1cm4gMDsKK30KKworLyogRGV0YWNoICovCitzdGF0aWMgaW50IG1lX2RldGFjaChjb21lZGlfZGV2aWNlICpkZXYpCit7CisJaWYgKGRldl9wcml2YXRlKSB7CisJCWlmIChkZXZfcHJpdmF0ZS0+bWVfcmVnYmFzZSkgeworCQkJbWVfcmVzZXQoZGV2KTsKKwkJCWlvdW5tYXAoZGV2X3ByaXZhdGUtPm1lX3JlZ2Jhc2UpOworCQl9CisJCWlmIChkZXZfcHJpdmF0ZS0+cGx4X3JlZ2Jhc2UpCisJCQlpb3VubWFwKGRldl9wcml2YXRlLT5wbHhfcmVnYmFzZSk7CisJCWlmIChkZXZfcHJpdmF0ZS0+cGNpX2RldmljZSkgeworCQkJaWYgKGRldl9wcml2YXRlLT5wbHhfcmVnYmFzZV9zaXplKQorCQkJCWNvbWVkaV9wY2lfZGlzYWJsZShkZXZfcHJpdmF0ZS0+cGNpX2RldmljZSk7CisKKwkJCXBjaV9kZXZfcHV0KGRldl9wcml2YXRlLT5wY2lfZGV2aWNlKTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9taXRlLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbWl0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljYzUyNzQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbWl0ZS5jCkBAIC0wLDAgKzEsODA5IEBACisvKgorICAgIGNvbWVkaS9kcml2ZXJzL21pdGUuYworICAgIEhhcmR3YXJlIGRyaXZlciBmb3IgTkkgTWl0ZSBQQ0kgaW50ZXJmYWNlIGNoaXAKKworICAgIENPTUVESSAtIExpbnV4IENvbnRyb2wgYW5kIE1lYXN1cmVtZW50IERldmljZSBJbnRlcmZhY2UKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwMiBEYXZpZCBBLiBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisqLworCisvKgorCVRoZSBQQ0ktTUlPIEUgc2VyaWVzIGRyaXZlciB3YXMgb3JpZ2luYWxseSB3cml0dGVuIGJ5CisJVG9tYXN6IE1vdHlsZXdza2kgPC4uLj4sIGFuZCBwb3J0ZWQgdG8gY29tZWRpIGJ5IGRzLgorCisJUmVmZXJlbmNlcyBmb3Igc3BlY2lmaWNhdGlvbnM6CisKKwkgICAzMjE3NDdiLnBkZiAgUmVnaXN0ZXIgTGV2ZWwgUHJvZ3JhbW1lciBNYW51YWwgKG9ic29sZXRlKQorCSAgIDMyMTc0N2MucGRmICBSZWdpc3RlciBMZXZlbCBQcm9ncmFtbWVyIE1hbnVhbCAobmV3KQorCSAgIERBUS1TVEMgcmVmZXJlbmNlIG1hbnVhbAorCisJT3RoZXIgcG9zc2libHkgcmVsZXZhbnQgaW5mbzoKKworCSAgIDMyMDUxN2MucGRmICBVc2VyIG1hbnVhbCAob2Jzb2xldGUpCisJICAgMzIwNTE3Zi5wZGYgIFVzZXIgbWFudWFsIChuZXcpCisJICAgMzIwODg5YS5wZGYgIGRlbGV0ZQorCSAgIDMyMDkwNmMucGRmICBtYXhpbXVtIHNpZ25hbCByYXRpbmdzCisJICAgMzIxMDY2YS5wZGYgIGFib3V0IDE2eAorCSAgIDMyMTc5MWEucGRmICBkaXNjb250aW51YXRpb24gb2YgYXQtbWlvLTE2ZS0xMCByZXYuIGMKKwkgICAzMjE4MDhhLnBkZiAgYWJvdXQgYXQtbWlvLTE2ZS0xMCByZXYgUAorCSAgIDMyMTgzN2EucGRmICBkaXNjb250aW51YXRpb24gb2YgYXQtbWlvLTE2ZGUtMTAgcmV2IGQKKwkgICAzMjE4MzhhLnBkZiAgYWJvdXQgYXQtbWlvLTE2ZGUtMTAgcmV2IE4KKworCUlTU1VFUzoKKworKi8KKworLy8jZGVmaW5lIFVTRV9LTUFMTE9DCisKKyNpbmNsdWRlICJtaXRlLmgiCisKKyNpbmNsdWRlICJjb21lZGlfZmMuaCIKKyNpbmNsdWRlICJjb21lZGlfcGNpLmgiCisjaW5jbHVkZSAiLi4vY29tZWRpZGV2LmgiCisKKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisKKyNkZWZpbmUgUENJX01JVEVfU0laRQkJNDA5NgorI2RlZmluZSBQQ0lfREFRX1NJWkUJCTQwOTYKKyNkZWZpbmUgUENJX0RBUV9TSVpFXzY2MFggICAgICAgODE5MgorCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK3N0cnVjdCBtaXRlX3N0cnVjdCAqbWl0ZV9kZXZpY2VzID0gTlVMTDsKKworI2RlZmluZSBUT1BfT0ZfUEFHRSh4KSAoKHgpfCh+KFBBR0VfTUFTSykpKQorCit2b2lkIG1pdGVfaW5pdCh2b2lkKQoreworCXN0cnVjdCBwY2lfZGV2ICpwY2lkZXY7CisJc3RydWN0IG1pdGVfc3RydWN0ICptaXRlOworCisJZm9yIChwY2lkZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBOVUxMKTsKKwkJcGNpZGV2ICE9IE5VTEw7CisJCXBjaWRldiA9IHBjaV9nZXRfZGV2aWNlKFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIHBjaWRldikpIHsKKwkJaWYgKHBjaWRldi0+dmVuZG9yID09IFBDSV9WRU5ET1JfSURfTkFUSU5TVCkgeworCQkJdW5zaWduZWQgaTsKKworCQkJbWl0ZSA9IGt6YWxsb2Moc2l6ZW9mKCptaXRlKSwgR0ZQX0tFUk5FTCk7CisJCQlpZiAoIW1pdGUpIHsKKwkJCQlwcmludGsoIm1pdGU6IGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKKwkJCQlwY2lfZGV2X3B1dChwY2lkZXYpOworCQkJCXJldHVybjsKKwkJCX0KKwkJCXNwaW5fbG9ja19pbml0KCZtaXRlLT5sb2NrKTsKKwkJCW1pdGUtPnBjaWRldiA9IHBjaV9kZXZfZ2V0KHBjaWRldik7CisJCQlmb3IgKGkgPSAwOyBpIDwgTUFYX01JVEVfRE1BX0NIQU5ORUxTOyArK2kpIHsKKwkJCQltaXRlLT5jaGFubmVsc1tpXS5taXRlID0gbWl0ZTsKKwkJCQltaXRlLT5jaGFubmVsc1tpXS5jaGFubmVsID0gaTsKKwkJCQltaXRlLT5jaGFubmVsc1tpXS5kb25lID0gMTsKKwkJCX0KKwkJCW1pdGUtPm5leHQgPSBtaXRlX2RldmljZXM7CisJCQltaXRlX2RldmljZXMgPSBtaXRlOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBkdW1wX2NoaXBfc2lnbmF0dXJlKHUzMiBjc2lncl9iaXRzKQoreworCXByaW50aygibWl0ZTogdmVyc2lvbiA9ICVpLCB0eXBlID0gJWksIG1pdGUgbW9kZSA9ICVpLCBpbnRlcmZhY2UgbW9kZSA9ICVpXG4iLCBtaXRlX2NzaWdyX3ZlcnNpb24oY3NpZ3JfYml0cyksIG1pdGVfY3NpZ3JfdHlwZShjc2lncl9iaXRzKSwgbWl0ZV9jc2lncl9tbW9kZShjc2lncl9iaXRzKSwgbWl0ZV9jc2lncl9pbW9kZShjc2lncl9iaXRzKSk7CisJcHJpbnRrKCJtaXRlOiBudW0gY2hhbm5lbHMgPSAlaSwgd3JpdGUgcG9zdCBmaWZvIGRlcHRoID0gJWksIHdpbnMgPSAlaSwgaW93aW5zID0gJWlcbiIsIG1pdGVfY3NpZ3JfZG1hYyhjc2lncl9iaXRzKSwgbWl0ZV9jc2lncl93cGRlcChjc2lncl9iaXRzKSwgbWl0ZV9jc2lncl93aW5zKGNzaWdyX2JpdHMpLCBtaXRlX2NzaWdyX2lvd2lucyhjc2lncl9iaXRzKSk7Cit9CisKK3Vuc2lnbmVkIG1pdGVfZmlmb19zaXplKHN0cnVjdCBtaXRlX3N0cnVjdCAqIG1pdGUsIHVuc2lnbmVkIGNoYW5uZWwpCit7CisJdW5zaWduZWQgZmNyX2JpdHMgPSByZWFkbChtaXRlLT5taXRlX2lvX2FkZHIgKworCQlNSVRFX0ZDUihjaGFubmVsKSk7CisJdW5zaWduZWQgZW1wdHlfY291bnQgPSAoZmNyX2JpdHMgPj4gMTYpICYgMHhmZjsKKwl1bnNpZ25lZCBmdWxsX2NvdW50ID0gZmNyX2JpdHMgJiAweGZmOworCXJldHVybiBlbXB0eV9jb3VudCArIGZ1bGxfY291bnQ7Cit9CisKK2ludCBtaXRlX3NldHVwMihzdHJ1Y3QgbWl0ZV9zdHJ1Y3QgKm1pdGUsIHVuc2lnbmVkIHVzZV9pb2R3YnNyXzEpCit7CisJdW5zaWduZWQgbG9uZyBsZW5ndGg7CisJcmVzb3VyY2Vfc2l6ZV90IGFkZHI7CisJaW50IGk7CisJdTMyIGNzaWdyX2JpdHM7CisJdW5zaWduZWQgdW5rbm93bl9kbWFfYnVyc3RfYml0czsKKworCWlmIChjb21lZGlfcGNpX2VuYWJsZShtaXRlLT5wY2lkZXYsICJtaXRlIikpIHsKKwkJcHJpbnRrKCJlcnJvciBlbmFibGluZyBtaXRlIGFuZCByZXF1ZXN0aW5nIGlvIHJlZ2lvbnNcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJcGNpX3NldF9tYXN0ZXIobWl0ZS0+cGNpZGV2KTsKKworCWFkZHIgPSBwY2lfcmVzb3VyY2Vfc3RhcnQobWl0ZS0+cGNpZGV2LCAwKTsKKwltaXRlLT5taXRlX3BoeXNfYWRkciA9IGFkZHI7CisJbWl0ZS0+bWl0ZV9pb19hZGRyID0gaW9yZW1hcChhZGRyLCBQQ0lfTUlURV9TSVpFKTsKKwlpZiAoIW1pdGUtPm1pdGVfaW9fYWRkcikgeworCQlwcmludGsoImZhaWxlZCB0byByZW1hcCBtaXRlIGlvIG1lbW9yeSBhZGRyZXNzXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCXByaW50aygiTUlURToweCUwOGxseCBtYXBwZWQgdG8gJXAgIiwKKwkJKHVuc2lnbmVkIGxvbmcgbG9uZyltaXRlLT5taXRlX3BoeXNfYWRkciwgbWl0ZS0+bWl0ZV9pb19hZGRyKTsKKworCWFkZHIgPSBwY2lfcmVzb3VyY2Vfc3RhcnQobWl0ZS0+cGNpZGV2LCAxKTsKKwltaXRlLT5kYXFfcGh5c19hZGRyID0gYWRkcjsKKwlsZW5ndGggPSBwY2lfcmVzb3VyY2VfbGVuKG1pdGUtPnBjaWRldiwgMSk7CisJLy8gSW4gY2FzZSBvZiBhIDY2MHggYm9hcmQsIERBUSBzaXplIGlzIDhrIGluc3RlYWQgb2YgNGsgKHNlZSBhcyBzaG93biBieSBsc3BjaSBvdXRwdXQpCisJbWl0ZS0+ZGFxX2lvX2FkZHIgPSBpb3JlbWFwKG1pdGUtPmRhcV9waHlzX2FkZHIsIGxlbmd0aCk7CisJaWYgKCFtaXRlLT5kYXFfaW9fYWRkcikgeworCQlwcmludGsoImZhaWxlZCB0byByZW1hcCBkYXEgaW8gbWVtb3J5IGFkZHJlc3NcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJcHJpbnRrKCJEQVE6MHglMDhsbHggbWFwcGVkIHRvICVwXG4iLAorCQkodW5zaWduZWQgbG9uZyBsb25nKW1pdGUtPmRhcV9waHlzX2FkZHIsIG1pdGUtPmRhcV9pb19hZGRyKTsKKworCWlmICh1c2VfaW9kd2Jzcl8xKSB7CisJCXdyaXRlbCgwLCBtaXRlLT5taXRlX2lvX2FkZHIgKyBNSVRFX0lPRFdCU1IpOworCQlwcmludGsoIm1pdGU6IHVzaW5nIEkvTyBXaW5kb3cgQmFzZSBTaXplIHJlZ2lzdGVyIDFcbiIpOworCQl3cml0ZWwobWl0ZS0+CisJCQlkYXFfcGh5c19hZGRyIHwgV0VOQUIgfAorCQkJTUlURV9JT0RXQlNSXzFfV1NJWkVfYml0cyhsZW5ndGgpLAorCQkJbWl0ZS0+bWl0ZV9pb19hZGRyICsgTUlURV9JT0RXQlNSXzEpOworCQl3cml0ZWwoMCwgbWl0ZS0+bWl0ZV9pb19hZGRyICsgTUlURV9JT0RXQ1JfMSk7CisJfSBlbHNlIHsKKwkJd3JpdGVsKG1pdGUtPmRhcV9waHlzX2FkZHIgfCBXRU5BQiwKKwkJCW1pdGUtPm1pdGVfaW9fYWRkciArIE1JVEVfSU9EV0JTUik7CisJfQorCS8qIG1ha2Ugc3VyZSBkbWEgYnVyc3RzIHdvcmsuICBJIGdvdCB0aGlzIGZyb20gcnVubmluZyBhIGJ1cyBhbmFseXplcgorCSAgIG9uIGEgcHhpLTYyODEgYW5kIGEgcHhpLTY3MTMuICA2NzEzIHBvd2VyZWQgdXAgd2l0aCByZWdpc3RlciB2YWx1ZQorCSAgIG9mIDB4NjFmIGFuZCBidXJzdHMgd29ya2VkLiAgNjI4MSBwb3dlcmVkIHVwIHdpdGggcmVnaXN0ZXIgdmFsdWUgb2YKKwkgICAweDFmIGFuZCBidXJzdHMgZGlkbid0IHdvcmsuICBUaGUgTkkgd2luZG93cyBkcml2ZXIgcmVhZHMgdGhlIHJlZ2lzdGVyLAorCSAgIHRoZW4gZG9lcyBhIGJpdHdpc2Utb3Igb2YgMHg2MDAgd2l0aCBpdCBhbmQgd3JpdGVzIGl0IGJhY2suCisJICovCisJdW5rbm93bl9kbWFfYnVyc3RfYml0cyA9CisJCXJlYWRsKG1pdGUtPm1pdGVfaW9fYWRkciArIE1JVEVfVU5LTk9XTl9ETUFfQlVSU1RfUkVHKTsKKwl1bmtub3duX2RtYV9idXJzdF9iaXRzIHw9IFVOS05PV05fRE1BX0JVUlNUX0VOQUJMRV9CSVRTOworCXdyaXRlbCh1bmtub3duX2RtYV9idXJzdF9iaXRzLAorCQltaXRlLT5taXRlX2lvX2FkZHIgKyBNSVRFX1VOS05PV05fRE1BX0JVUlNUX1JFRyk7CisKKwljc2lncl9iaXRzID0gcmVhZGwobWl0ZS0+bWl0ZV9pb19hZGRyICsgTUlURV9DU0lHUik7CisJbWl0ZS0+bnVtX2NoYW5uZWxzID0gbWl0ZV9jc2lncl9kbWFjKGNzaWdyX2JpdHMpOworCWlmIChtaXRlLT5udW1fY2hhbm5lbHMgPiBNQVhfTUlURV9ETUFfQ0hBTk5FTFMpIHsKKwkJcHJpbnRrKCJtaXRlOiBidWc/IGNoaXAgY2xhaW1zIHRvIGhhdmUgJWkgZG1hIGNoYW5uZWxzLiAgU2V0dGluZyB0byAlaS5cbiIsIG1pdGUtPm51bV9jaGFubmVscywgTUFYX01JVEVfRE1BX0NIQU5ORUxTKTsKKwkJbWl0ZS0+bnVtX2NoYW5uZWxzID0gTUFYX01JVEVfRE1BX0NIQU5ORUxTOworCX0KKwlkdW1wX2NoaXBfc2lnbmF0dXJlKGNzaWdyX2JpdHMpOworCWZvciAoaSA9IDA7IGkgPCBtaXRlLT5udW1fY2hhbm5lbHM7IGkrKykgeworCQl3cml0ZWwoQ0hPUl9ETUFSRVNFVCwgbWl0ZS0+bWl0ZV9pb19hZGRyICsgTUlURV9DSE9SKGkpKTsKKwkJLyogZGlzYWJsZSBpbnRlcnJ1cHRzICovCisJCXdyaXRlbChDSENSX0NMUl9ETUFfSUUgfCBDSENSX0NMUl9MSU5LUF9JRSB8IENIQ1JfQ0xSX1NBUl9JRSB8CisJCQlDSENSX0NMUl9ET05FX0lFIHwgQ0hDUl9DTFJfTVJEWV9JRSB8IENIQ1JfQ0xSX0RSRFlfSUUgfAorCQkJQ0hDUl9DTFJfTENfSUUgfCBDSENSX0NMUl9DT05UX1JCX0lFLAorCQkJbWl0ZS0+bWl0ZV9pb19hZGRyICsgTUlURV9DSENSKGkpKTsKKwl9CisJbWl0ZS0+Zmlmb19zaXplID0gbWl0ZV9maWZvX3NpemUobWl0ZSwgMCk7CisJcHJpbnRrKCJtaXRlOiBmaWZvIHNpemUgaXMgJWkuXG4iLCBtaXRlLT5maWZvX3NpemUpOworCW1pdGUtPnVzZWQgPSAxOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBtaXRlX3NldHVwKHN0cnVjdCBtaXRlX3N0cnVjdCAqbWl0ZSkKK3sKKwlyZXR1cm4gbWl0ZV9zZXR1cDIobWl0ZSwgMCk7Cit9CisKK3ZvaWQgbWl0ZV9jbGVhbnVwKHZvaWQpCit7CisJc3RydWN0IG1pdGVfc3RydWN0ICptaXRlLCAqbmV4dDsKKworCWZvciAobWl0ZSA9IG1pdGVfZGV2aWNlczsgbWl0ZTsgbWl0ZSA9IG5leHQpIHsKKwkJcGNpX2Rldl9wdXQobWl0ZS0+cGNpZGV2KTsKKwkJbmV4dCA9IG1pdGUtPm5leHQ7CisJCWtmcmVlKG1pdGUpOworCX0KK30KKwordm9pZCBtaXRlX3Vuc2V0dXAoc3RydWN0IG1pdGVfc3RydWN0ICptaXRlKQoreworCS8vdW5zaWduZWQgbG9uZyBvZmZzZXQsIHN0YXJ0LCBsZW5ndGg7CisKKwlpZiAoIW1pdGUpCisJCXJldHVybjsKKworCWlmIChtaXRlLT5taXRlX2lvX2FkZHIpIHsKKwkJaW91bm1hcChtaXRlLT5taXRlX2lvX2FkZHIpOworCQltaXRlLT5taXRlX2lvX2FkZHIgPSBOVUxMOworCX0KKwlpZiAobWl0ZS0+ZGFxX2lvX2FkZHIpIHsKKwkJaW91bm1hcChtaXRlLT5kYXFfaW9fYWRkcik7CisJCW1pdGUtPmRhcV9pb19hZGRyID0gTlVMTDsKKwl9CisJaWYgKG1pdGUtPm1pdGVfcGh5c19hZGRyKSB7CisJCWNvbWVkaV9wY2lfZGlzYWJsZShtaXRlLT5wY2lkZXYpOworCQltaXRlLT5taXRlX3BoeXNfYWRkciA9IDA7CisJfQorCisJbWl0ZS0+dXNlZCA9IDA7Cit9CisKK3ZvaWQgbWl0ZV9saXN0X2RldmljZXModm9pZCkKK3sKKwlzdHJ1Y3QgbWl0ZV9zdHJ1Y3QgKm1pdGUsICpuZXh0OworCisJcHJpbnRrKCJBdmFpbGFibGUgTkkgZGV2aWNlIElEczoiKTsKKwlpZiAobWl0ZV9kZXZpY2VzKQorCQlmb3IgKG1pdGUgPSBtaXRlX2RldmljZXM7IG1pdGU7IG1pdGUgPSBuZXh0KSB7CisJCQluZXh0ID0gbWl0ZS0+bmV4dDsKKwkJCXByaW50aygiIDB4JTA0eCIsIG1pdGVfZGV2aWNlX2lkKG1pdGUpKTsKKwkJCWlmIChtaXRlLT51c2VkKQorCQkJCXByaW50aygiKHVzZWQpIik7CisJCX0KKwlwcmludGsoIlxuIik7CisKK30KKworc3RydWN0IG1pdGVfY2hhbm5lbCAqbWl0ZV9yZXF1ZXN0X2NoYW5uZWxfaW5fcmFuZ2Uoc3RydWN0IG1pdGVfc3RydWN0ICptaXRlLAorCXN0cnVjdCBtaXRlX2RtYV9kZXNjcmlwdG9yX3JpbmcgKnJpbmcsIHVuc2lnbmVkIG1pbl9jaGFubmVsLAorCXVuc2lnbmVkIG1heF9jaGFubmVsKQoreworCWludCBpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IG1pdGVfY2hhbm5lbCAqY2hhbm5lbCA9IE5VTEw7CisKKwkvLyBzcGluIGxvY2sgc28gbWl0ZV9yZWxlYXNlX2NoYW5uZWwgY2FuIGJlIGNhbGxlZCBzYWZlbHkgZnJvbSBpbnRlcnJ1cHRzCisJY29tZWRpX3NwaW5fbG9ja19pcnFzYXZlKCZtaXRlLT5sb2NrLCBmbGFncyk7CisJZm9yIChpID0gbWluX2NoYW5uZWw7IGkgPD0gbWF4X2NoYW5uZWw7ICsraSkgeworCQlpZiAobWl0ZS0+Y2hhbm5lbF9hbGxvY2F0ZWRbaV0gPT0gMCkgeworCQkJbWl0ZS0+Y2hhbm5lbF9hbGxvY2F0ZWRbaV0gPSAxOworCQkJY2hhbm5lbCA9ICZtaXRlLT5jaGFubmVsc1tpXTsKKwkJCWNoYW5uZWwtPnJpbmcgPSByaW5nOworCQkJYnJlYWs7CisJCX0KKwl9CisJY29tZWRpX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1pdGUtPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gY2hhbm5lbDsKK30KKwordm9pZCBtaXRlX3JlbGVhc2VfY2hhbm5lbChzdHJ1Y3QgbWl0ZV9jaGFubmVsICptaXRlX2NoYW4pCit7CisJc3RydWN0IG1pdGVfc3RydWN0ICptaXRlID0gbWl0ZV9jaGFuLT5taXRlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvLyBzcGluIGxvY2sgdG8gcHJldmVudCByYWNlcyB3aXRoIG1pdGVfcmVxdWVzdF9jaGFubmVsCisJY29tZWRpX3NwaW5fbG9ja19pcnFzYXZlKCZtaXRlLT5sb2NrLCBmbGFncyk7CisJaWYgKG1pdGUtPmNoYW5uZWxfYWxsb2NhdGVkW21pdGVfY2hhbi0+Y2hhbm5lbF0pIHsKKwkJbWl0ZV9kbWFfZGlzYXJtKG1pdGVfY2hhbik7CisJCW1pdGVfZG1hX3Jlc2V0KG1pdGVfY2hhbik7CisvKiBkaXNhYmxlIGFsbCBjaGFubmVsJ3MgaW50ZXJydXB0cyAoZG8gaXQgYWZ0ZXIgZGlzYXJtL3Jlc2V0IHNvCitNSVRFX0NIQ1IgcmVnIGlzbid0IGNoYW5nZWQgd2hpbGUgZG1hIGlzIHN0aWxsIGFjdGl2ZSEpICovCisJCXdyaXRlbChDSENSX0NMUl9ETUFfSUUgfCBDSENSX0NMUl9MSU5LUF9JRSB8CisJCQlDSENSX0NMUl9TQVJfSUUgfCBDSENSX0NMUl9ET05FX0lFIHwKKwkJCUNIQ1JfQ0xSX01SRFlfSUUgfCBDSENSX0NMUl9EUkRZX0lFIHwKKwkJCUNIQ1JfQ0xSX0xDX0lFIHwgQ0hDUl9DTFJfQ09OVF9SQl9JRSwKKwkJCW1pdGUtPm1pdGVfaW9fYWRkciArIE1JVEVfQ0hDUihtaXRlX2NoYW4tPmNoYW5uZWwpKTsKKwkJbWl0ZS0+Y2hhbm5lbF9hbGxvY2F0ZWRbbWl0ZV9jaGFuLT5jaGFubmVsXSA9IDA7CisJCW1pdGVfY2hhbi0+cmluZyA9IE5VTEw7CisJCW1taW93YigpOworCX0KKwljb21lZGlfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWl0ZS0+bG9jaywgZmxhZ3MpOworfQorCit2b2lkIG1pdGVfZG1hX2FybShzdHJ1Y3QgbWl0ZV9jaGFubmVsICptaXRlX2NoYW4pCit7CisJc3RydWN0IG1pdGVfc3RydWN0ICptaXRlID0gbWl0ZV9jaGFuLT5taXRlOworCWludCBjaG9yOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlNRFBSSU5USygibWl0ZV9kbWFfYXJtIGNoJWlcbiIsIGNoYW5uZWwpOworCS8qIG1lbW9yeSBiYXJyaWVyIGlzIGludGVuZGVkIHRvIGluc3VyZSBhbnkgdHdpZGRsaW5nIHdpdGggdGhlIGJ1ZmZlcgorCSAgIGlzIGRvbmUgYmVmb3JlIHdyaXRpbmcgdG8gdGhlIG1pdGUgdG8gYXJtIGRtYSB0cmFuc2ZlciAqLworCXNtcF9tYigpOworCS8qIGFybSAqLworCWNob3IgPSBDSE9SX1NUQVJUOworCWNvbWVkaV9zcGluX2xvY2tfaXJxc2F2ZSgmbWl0ZS0+bG9jaywgZmxhZ3MpOworCW1pdGVfY2hhbi0+ZG9uZSA9IDA7CisJd3JpdGVsKGNob3IsIG1pdGUtPm1pdGVfaW9fYWRkciArIE1JVEVfQ0hPUihtaXRlX2NoYW4tPmNoYW5uZWwpKTsKKwltbWlvd2IoKTsKKwljb21lZGlfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWl0ZS0+bG9jaywgZmxhZ3MpOworLy8gICAgICBtaXRlX2RtYV90Y3IobWl0ZSwgY2hhbm5lbCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW50IG1pdGVfYnVmX2NoYW5nZShzdHJ1Y3QgbWl0ZV9kbWFfZGVzY3JpcHRvcl9yaW5nICpyaW5nLCBjb21lZGlfYXN5bmMgKiBhc3luYykKK3sKKwl1bnNpZ25lZCBpbnQgbl9saW5rczsKKwlpbnQgaTsKKworCWlmIChyaW5nLT5kZXNjcmlwdG9ycykgeworCQlkbWFfZnJlZV9jb2hlcmVudChyaW5nLT5od19kZXYsCisJCQlyaW5nLT5uX2xpbmtzICogc2l6ZW9mKHN0cnVjdCBtaXRlX2RtYV9kZXNjcmlwdG9yKSwKKwkJCXJpbmctPmRlc2NyaXB0b3JzLCByaW5nLT5kZXNjcmlwdG9yc19kbWFfYWRkcik7CisJfQorCXJpbmctPmRlc2NyaXB0b3JzID0gTlVMTDsKKwlyaW5nLT5kZXNjcmlwdG9yc19kbWFfYWRkciA9IDA7CisJcmluZy0+bl9saW5rcyA9IDA7CisKKwlpZiAoYXN5bmMtPnByZWFsbG9jX2J1ZnN6ID09IDApIHsKKwkJcmV0dXJuIDA7CisJfQorCW5fbGlua3MgPSBhc3luYy0+cHJlYWxsb2NfYnVmc3ogPj4gUEFHRV9TSElGVDsKKworCU1EUFJJTlRLKCJyaW5nLT5od19kZXY9JXAsIG5fbGlua3M9MHglMDR4XG4iLCByaW5nLT5od19kZXYsIG5fbGlua3MpOworCisJcmluZy0+ZGVzY3JpcHRvcnMgPQorCQlkbWFfYWxsb2NfY29oZXJlbnQocmluZy0+aHdfZGV2LAorCQluX2xpbmtzICogc2l6ZW9mKHN0cnVjdCBtaXRlX2RtYV9kZXNjcmlwdG9yKSwKKwkJJnJpbmctPmRlc2NyaXB0b3JzX2RtYV9hZGRyLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXJpbmctPmRlc2NyaXB0b3JzKSB7CisJCXByaW50aygibWl0ZTogcmluZyBidWZmZXIgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJcmluZy0+bl9saW5rcyA9IG5fbGlua3M7CisKKwlmb3IgKGkgPSAwOyBpIDwgbl9saW5rczsgaSsrKSB7CisJCXJpbmctPmRlc2NyaXB0b3JzW2ldLmNvdW50ID0gY3B1X3RvX2xlMzIoUEFHRV9TSVpFKTsKKwkJcmluZy0+ZGVzY3JpcHRvcnNbaV0uYWRkciA9CisJCQljcHVfdG9fbGUzMihhc3luYy0+YnVmX3BhZ2VfbGlzdFtpXS5kbWFfYWRkcik7CisJCXJpbmctPmRlc2NyaXB0b3JzW2ldLm5leHQgPQorCQkJY3B1X3RvX2xlMzIocmluZy0+ZGVzY3JpcHRvcnNfZG1hX2FkZHIgKyAoaSArCisJCQkJMSkgKiBzaXplb2Yoc3RydWN0IG1pdGVfZG1hX2Rlc2NyaXB0b3IpKTsKKwl9CisJcmluZy0+ZGVzY3JpcHRvcnNbbl9saW5rcyAtIDFdLm5leHQgPQorCQljcHVfdG9fbGUzMihyaW5nLT5kZXNjcmlwdG9yc19kbWFfYWRkcik7CisJLyogYmFycmllciBpcyBtZWFudCB0byBpbnN1cmUgdGhhdCBhbGwgdGhlIHdyaXRlcyB0byB0aGUgZG1hIGRlc2NyaXB0b3JzCisJICAgaGF2ZSBjb21wbGV0ZWQgYmVmb3JlIHRoZSBkbWEgY29udHJvbGxlciBpcyBjb21tYW5kZWQgdG8gcmVhZCB0aGVtICovCisJc21wX3dtYigpOworCXJldHVybiAwOworfQorCit2b2lkIG1pdGVfcHJlcF9kbWEoc3RydWN0IG1pdGVfY2hhbm5lbCAqbWl0ZV9jaGFuLAorCXVuc2lnbmVkIGludCBudW1fZGV2aWNlX2JpdHMsIHVuc2lnbmVkIGludCBudW1fbWVtb3J5X2JpdHMpCit7CisJdW5zaWduZWQgaW50IGNob3IsIGNoY3IsIG1jciwgZGNyLCBsa2NyOworCXN0cnVjdCBtaXRlX3N0cnVjdCAqbWl0ZSA9IG1pdGVfY2hhbi0+bWl0ZTsKKworCU1EUFJJTlRLKCJtaXRlX3ByZXBfZG1hIGNoJWlcbiIsIG1pdGVfY2hhbi0+Y2hhbm5lbCk7CisKKwkvKiByZXNldCBETUEgYW5kIEZJRk8gKi8KKwljaG9yID0gQ0hPUl9ETUFSRVNFVCB8IENIT1JfRlJFU0VUOworCXdyaXRlbChjaG9yLCBtaXRlLT5taXRlX2lvX2FkZHIgKyBNSVRFX0NIT1IobWl0ZV9jaGFuLT5jaGFubmVsKSk7CisKKwkvKiBzaG9ydCBsaW5rIGNoYWluaW5nIG1vZGUgKi8KKwljaGNyID0gQ0hDUl9TRVRfRE1BX0lFIHwgQ0hDUl9MSU5LU0hPUlQgfCBDSENSX1NFVF9ET05FX0lFIHwKKwkJQ0hDUl9CVVJTVEVOOworCS8qCisJICogTGluayBDb21wbGV0ZSBJbnRlcnJ1cHQ6IGludGVycnVwdCBldmVyeSB0aW1lIGEgbGluaworCSAqIGluIE1JVEVfUklORyBpcyBjb21wbGV0ZWQuIFRoaXMgY2FuIGdlbmVyYXRlIGEgbG90IG9mCisJICogZXh0cmEgaW50ZXJydXB0cywgYnV0IHJpZ2h0IG5vdyB3ZSB1cGRhdGUgdGhlIHZhbHVlcworCSAqIG9mIGJ1Zl9pbnRfcHRyIGFuZCBidWZfaW50X2NvdW50IGF0IGVhY2ggaW50ZXJydXB0LiAgQQorCSAqIGJldHRlciBtZXRob2QgaXMgdG8gcG9sbCB0aGUgTUlURSBiZWZvcmUgZWFjaCB1c2VyCisJICogInJlYWQoKSIgdG8gY2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgYnl0ZXMgYXZhaWxhYmxlLgorCSAqLworCWNoY3IgfD0gQ0hDUl9TRVRfTENfSUU7CisJaWYgKG51bV9tZW1vcnlfYml0cyA9PSAzMiAmJiBudW1fZGV2aWNlX2JpdHMgPT0gMTYpIHsKKwkJLyogRG9pbmcgYSBjb21iaW5lZCAzMiBhbmQgMTYgYml0IGJ5dGVzd2FwIGdldHMgdGhlIDE2IGJpdCBzYW1wbGVzIGludG8gdGhlIGZpZm8gaW4gdGhlIHJpZ2h0IG9yZGVyLgorCQkgICBUZXN0ZWQgZG9pbmcgMzIgYml0IG1lbW9yeSB0byAxNiBiaXQgZGV2aWNlIHRyYW5zZmVycyB0byB0aGUgYW5hbG9nIG91dCBvZiBhIHB4aS02MjgxLAorCQkgICB3aGljaCBoYXMgbWl0ZSB2ZXJzaW9uID0gMSwgdHlwZSA9IDQuICBUaGlzIGFsc28gd29ya3MgZm9yIGRtYSByZWFkcyBmcm9tIHRoZSBjb3VudGVycworCQkgICBvbiBlLXNlcmllcyBib2FyZHMuICAqLworCQljaGNyIHw9IENIQ1JfQllURV9TV0FQX0RFVklDRSB8IENIQ1JfQllURV9TV0FQX01FTU9SWTsKKwl9CisJaWYgKG1pdGVfY2hhbi0+ZGlyID09IENPTUVESV9JTlBVVCkgeworCQljaGNyIHw9IENIQ1JfREVWX1RPX01FTTsKKwl9CisJd3JpdGVsKGNoY3IsIG1pdGUtPm1pdGVfaW9fYWRkciArIE1JVEVfQ0hDUihtaXRlX2NoYW4tPmNoYW5uZWwpKTsKKworCS8qIHRvL2Zyb20gbWVtb3J5ICovCisJbWNyID0gQ1JfUkwoNjQpIHwgQ1JfQVNFUVVQOworCXN3aXRjaCAobnVtX21lbW9yeV9iaXRzKSB7CisJY2FzZSA4OgorCQltY3IgfD0gQ1JfUFNJWkU4OworCQlicmVhazsKKwljYXNlIDE2OgorCQltY3IgfD0gQ1JfUFNJWkUxNjsKKwkJYnJlYWs7CisJY2FzZSAzMjoKKwkJbWNyIHw9IENSX1BTSVpFMzI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJ0X3ByaW50aworCQkJKCJtaXRlOiBidWchIGludmFsaWQgbWVtIGJpdCB3aWR0aCBmb3IgZG1hIHRyYW5zZmVyXG4iKTsKKwkJYnJlYWs7CisJfQorCXdyaXRlbChtY3IsIG1pdGUtPm1pdGVfaW9fYWRkciArIE1JVEVfTUNSKG1pdGVfY2hhbi0+Y2hhbm5lbCkpOworCisJLyogZnJvbS90byBkZXZpY2UgKi8KKwlkY3IgPSBDUl9STCg2NCkgfCBDUl9BU0VRVVA7CisJZGNyIHw9IENSX1BPUlRJTyB8IENSX0FNREVWSUNFIHwgQ1JfUkVRU0RSUShtaXRlX2NoYW4tPmNoYW5uZWwpOworCXN3aXRjaCAobnVtX2RldmljZV9iaXRzKSB7CisJY2FzZSA4OgorCQlkY3IgfD0gQ1JfUFNJWkU4OworCQlicmVhazsKKwljYXNlIDE2OgorCQlkY3IgfD0gQ1JfUFNJWkUxNjsKKwkJYnJlYWs7CisJY2FzZSAzMjoKKwkJZGNyIHw9IENSX1BTSVpFMzI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJ0X3ByaW50aworCQkJKCJtaXRlOiBidWchIGludmFsaWQgZGV2IGJpdCB3aWR0aCBmb3IgZG1hIHRyYW5zZmVyXG4iKTsKKwkJYnJlYWs7CisJfQorCXdyaXRlbChkY3IsIG1pdGUtPm1pdGVfaW9fYWRkciArIE1JVEVfRENSKG1pdGVfY2hhbi0+Y2hhbm5lbCkpOworCisJLyogcmVzZXQgdGhlIERBUiAqLworCXdyaXRlbCgwLCBtaXRlLT5taXRlX2lvX2FkZHIgKyBNSVRFX0RBUihtaXRlX2NoYW4tPmNoYW5uZWwpKTsKKworCS8qIHRoZSBsaW5rIGlzIDMyYml0cyAqLworCWxrY3IgPSBDUl9STCg2NCkgfCBDUl9BU0VRVVAgfCBDUl9QU0laRTMyOworCXdyaXRlbChsa2NyLCBtaXRlLT5taXRlX2lvX2FkZHIgKyBNSVRFX0xLQ1IobWl0ZV9jaGFuLT5jaGFubmVsKSk7CisKKwkvKiBzdGFydGluZyBhZGRyZXNzIGZvciBsaW5rIGNoYWluaW5nICovCisJd3JpdGVsKG1pdGVfY2hhbi0+cmluZy0+ZGVzY3JpcHRvcnNfZG1hX2FkZHIsCisJCW1pdGUtPm1pdGVfaW9fYWRkciArIE1JVEVfTEtBUihtaXRlX2NoYW4tPmNoYW5uZWwpKTsKKworCU1EUFJJTlRLKCJleGl0IG1pdGVfcHJlcF9kbWFcbiIpOworfQorCit1MzIgbWl0ZV9kZXZpY2VfYnl0ZXNfdHJhbnNmZXJyZWQoc3RydWN0IG1pdGVfY2hhbm5lbCAqbWl0ZV9jaGFuKQoreworCXN0cnVjdCBtaXRlX3N0cnVjdCAqbWl0ZSA9IG1pdGVfY2hhbi0+bWl0ZTsKKwlyZXR1cm4gcmVhZGwobWl0ZS0+bWl0ZV9pb19hZGRyICsgTUlURV9EQVIobWl0ZV9jaGFuLT5jaGFubmVsKSk7Cit9CisKK3UzMiBtaXRlX2J5dGVzX2luX3RyYW5zaXQoc3RydWN0IG1pdGVfY2hhbm5lbCAqIG1pdGVfY2hhbikKK3sKKwlzdHJ1Y3QgbWl0ZV9zdHJ1Y3QgKm1pdGUgPSBtaXRlX2NoYW4tPm1pdGU7CisJcmV0dXJuIHJlYWRsKG1pdGUtPm1pdGVfaW9fYWRkciArCisJCU1JVEVfRkNSKG1pdGVfY2hhbi0+Y2hhbm5lbCkpICYgMHgwMDAwMDBGRjsKK30KKworLy8gcmV0dXJucyBsb3dlciBib3VuZCBmb3IgbnVtYmVyIG9mIGJ5dGVzIHRyYW5zZmVycmVkIGZyb20gZGV2aWNlIHRvIG1lbW9yeQordTMyIG1pdGVfYnl0ZXNfd3JpdHRlbl90b19tZW1vcnlfbGIoc3RydWN0IG1pdGVfY2hhbm5lbCAqIG1pdGVfY2hhbikKK3sKKwl1MzIgZGV2aWNlX2J5dGVfY291bnQ7CisKKwlkZXZpY2VfYnl0ZV9jb3VudCA9IG1pdGVfZGV2aWNlX2J5dGVzX3RyYW5zZmVycmVkKG1pdGVfY2hhbik7CisJcmV0dXJuIGRldmljZV9ieXRlX2NvdW50IC0gbWl0ZV9ieXRlc19pbl90cmFuc2l0KG1pdGVfY2hhbik7Cit9CisKKy8vIHJldHVybnMgdXBwZXIgYm91bmQgZm9yIG51bWJlciBvZiBieXRlcyB0cmFuc2ZlcnJlZCBmcm9tIGRldmljZSB0byBtZW1vcnkKK3UzMiBtaXRlX2J5dGVzX3dyaXR0ZW5fdG9fbWVtb3J5X3ViKHN0cnVjdCBtaXRlX2NoYW5uZWwgKiBtaXRlX2NoYW4pCit7CisJdTMyIGluX3RyYW5zaXRfY291bnQ7CisKKwlpbl90cmFuc2l0X2NvdW50ID0gbWl0ZV9ieXRlc19pbl90cmFuc2l0KG1pdGVfY2hhbik7CisJcmV0dXJuIG1pdGVfZGV2aWNlX2J5dGVzX3RyYW5zZmVycmVkKG1pdGVfY2hhbikgLSBpbl90cmFuc2l0X2NvdW50OworfQorCisvLyByZXR1cm5zIGxvd2VyIGJvdW5kIGZvciBudW1iZXIgb2YgYnl0ZXMgcmVhZCBmcm9tIG1lbW9yeSBmb3IgdHJhbnNmZXIgdG8gZGV2aWNlCit1MzIgbWl0ZV9ieXRlc19yZWFkX2Zyb21fbWVtb3J5X2xiKHN0cnVjdCBtaXRlX2NoYW5uZWwgKiBtaXRlX2NoYW4pCit7CisJdTMyIGRldmljZV9ieXRlX2NvdW50OworCisJZGV2aWNlX2J5dGVfY291bnQgPSBtaXRlX2RldmljZV9ieXRlc190cmFuc2ZlcnJlZChtaXRlX2NoYW4pOworCXJldHVybiBkZXZpY2VfYnl0ZV9jb3VudCArIG1pdGVfYnl0ZXNfaW5fdHJhbnNpdChtaXRlX2NoYW4pOworfQorCisvLyByZXR1cm5zIHVwcGVyIGJvdW5kIGZvciBudW1iZXIgb2YgYnl0ZXMgcmVhZCBmcm9tIG1lbW9yeSBmb3IgdHJhbnNmZXIgdG8gZGV2aWNlCit1MzIgbWl0ZV9ieXRlc19yZWFkX2Zyb21fbWVtb3J5X3ViKHN0cnVjdCBtaXRlX2NoYW5uZWwgKiBtaXRlX2NoYW4pCit7CisJdTMyIGluX3RyYW5zaXRfY291bnQ7CisKKwlpbl90cmFuc2l0X2NvdW50ID0gbWl0ZV9ieXRlc19pbl90cmFuc2l0KG1pdGVfY2hhbik7CisJcmV0dXJuIG1pdGVfZGV2aWNlX2J5dGVzX3RyYW5zZmVycmVkKG1pdGVfY2hhbikgKyBpbl90cmFuc2l0X2NvdW50OworfQorCit1bnNpZ25lZCBtaXRlX2RtYV90Y3Ioc3RydWN0IG1pdGVfY2hhbm5lbCAqbWl0ZV9jaGFuKQoreworCXN0cnVjdCBtaXRlX3N0cnVjdCAqbWl0ZSA9IG1pdGVfY2hhbi0+bWl0ZTsKKwlpbnQgdGNyOworCWludCBsa2FyOworCisJbGthciA9IHJlYWRsKG1pdGUtPm1pdGVfaW9fYWRkciArIE1JVEVfTEtBUihtaXRlX2NoYW4tPmNoYW5uZWwpKTsKKwl0Y3IgPSByZWFkbChtaXRlLT5taXRlX2lvX2FkZHIgKyBNSVRFX1RDUihtaXRlX2NoYW4tPmNoYW5uZWwpKTsKKwlNRFBSSU5USygibWl0ZV9kbWFfdGNyIGNoJWksIGxrYXI9MHglMDh4IHRjcj0lZFxuIiwgbWl0ZV9jaGFuLT5jaGFubmVsLAorCQlsa2FyLCB0Y3IpOworCisJcmV0dXJuIHRjcjsKK30KKwordm9pZCBtaXRlX2RtYV9kaXNhcm0oc3RydWN0IG1pdGVfY2hhbm5lbCAqbWl0ZV9jaGFuKQoreworCXN0cnVjdCBtaXRlX3N0cnVjdCAqbWl0ZSA9IG1pdGVfY2hhbi0+bWl0ZTsKKwl1bnNpZ25lZCBjaG9yOworCisJLyogZGlzYXJtICovCisJY2hvciA9IENIT1JfQUJPUlQ7CisJd3JpdGVsKGNob3IsIG1pdGUtPm1pdGVfaW9fYWRkciArIE1JVEVfQ0hPUihtaXRlX2NoYW4tPmNoYW5uZWwpKTsKK30KKworaW50IG1pdGVfc3luY19pbnB1dF9kbWEoc3RydWN0IG1pdGVfY2hhbm5lbCAqbWl0ZV9jaGFuLCBjb21lZGlfYXN5bmMgKiBhc3luYykKK3sKKwlpbnQgY291bnQ7CisJdW5zaWduZWQgaW50IG5ieXRlcywgb2xkX2FsbG9jX2NvdW50OworCWNvbnN0IHVuc2lnbmVkIGJ5dGVzX3Blcl9zY2FuID0gY2ZjX2J5dGVzX3Blcl9zY2FuKGFzeW5jLT5zdWJkZXZpY2UpOworCisJb2xkX2FsbG9jX2NvdW50ID0gYXN5bmMtPmJ1Zl93cml0ZV9hbGxvY19jb3VudDsKKwkvLyB3cml0ZSBhbGxvYyBhcyBtdWNoIGFzIHdlIGNhbgorCWNvbWVkaV9idWZfd3JpdGVfYWxsb2MoYXN5bmMsIGFzeW5jLT5wcmVhbGxvY19idWZzeik7CisKKwluYnl0ZXMgPSBtaXRlX2J5dGVzX3dyaXR0ZW5fdG9fbWVtb3J5X2xiKG1pdGVfY2hhbik7CisJaWYgKChpbnQpKG1pdGVfYnl0ZXNfd3JpdHRlbl90b19tZW1vcnlfdWIobWl0ZV9jaGFuKSAtCisJCQlvbGRfYWxsb2NfY291bnQpID4gMCkgeworCQlydF9wcmludGsoIm1pdGU6IERNQSBvdmVyd3JpdGUgb2YgZnJlZSBhcmVhXG4iKTsKKwkJYXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfT1ZFUkZMT1c7CisJCXJldHVybiAtMTsKKwl9CisKKwljb3VudCA9IG5ieXRlcyAtIGFzeW5jLT5idWZfd3JpdGVfY291bnQ7CisJLyogaXQncyBwb3NzaWJsZSBjb3VudCB3aWxsIGJlIG5lZ2F0aXZlIGR1ZSB0bworCSAqIGNvbnNlcnZhdGl2ZSB2YWx1ZSByZXR1cm5lZCBieSBtaXRlX2J5dGVzX3dyaXR0ZW5fdG9fbWVtb3J5X2xiICovCisJaWYgKGNvdW50IDw9IDApIHsKKwkJcmV0dXJuIDA7CisJfQorCWNvbWVkaV9idWZfd3JpdGVfZnJlZShhc3luYywgY291bnQpOworCisJYXN5bmMtPnNjYW5fcHJvZ3Jlc3MgKz0gY291bnQ7CisJaWYgKGFzeW5jLT5zY2FuX3Byb2dyZXNzID49IGJ5dGVzX3Blcl9zY2FuKSB7CisJCWFzeW5jLT5zY2FuX3Byb2dyZXNzICU9IGJ5dGVzX3Blcl9zY2FuOworCQlhc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FT1M7CisJfQorCWFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0JMT0NLOworCXJldHVybiAwOworfQorCitpbnQgbWl0ZV9zeW5jX291dHB1dF9kbWEoc3RydWN0IG1pdGVfY2hhbm5lbCAqbWl0ZV9jaGFuLCBjb21lZGlfYXN5bmMgKiBhc3luYykKK3sKKwlpbnQgY291bnQ7CisJdTMyIG5ieXRlc191YiwgbmJ5dGVzX2xiOworCXVuc2lnbmVkIGludCBvbGRfYWxsb2NfY291bnQ7CisJdTMyIHN0b3BfY291bnQgPQorCQlhc3luYy0+Y21kLnN0b3BfYXJnICogY2ZjX2J5dGVzX3Blcl9zY2FuKGFzeW5jLT5zdWJkZXZpY2UpOworCisJb2xkX2FsbG9jX2NvdW50ID0gYXN5bmMtPmJ1Zl9yZWFkX2FsbG9jX2NvdW50OworCS8vIHJlYWQgYWxsb2MgYXMgbXVjaCBhcyB3ZSBjYW4KKwljb21lZGlfYnVmX3JlYWRfYWxsb2MoYXN5bmMsIGFzeW5jLT5wcmVhbGxvY19idWZzeik7CisJbmJ5dGVzX2xiID0gbWl0ZV9ieXRlc19yZWFkX2Zyb21fbWVtb3J5X2xiKG1pdGVfY2hhbik7CisJaWYgKGFzeW5jLT5jbWQuc3RvcF9zcmMgPT0gVFJJR19DT1VOVCAmJgorCQkoaW50KShuYnl0ZXNfbGIgLSBzdG9wX2NvdW50KSA+IDApCisJCW5ieXRlc19sYiA9IHN0b3BfY291bnQ7CisJbmJ5dGVzX3ViID0gbWl0ZV9ieXRlc19yZWFkX2Zyb21fbWVtb3J5X3ViKG1pdGVfY2hhbik7CisJaWYgKGFzeW5jLT5jbWQuc3RvcF9zcmMgPT0gVFJJR19DT1VOVCAmJgorCQkoaW50KShuYnl0ZXNfdWIgLSBzdG9wX2NvdW50KSA+IDApCisJCW5ieXRlc191YiA9IHN0b3BfY291bnQ7CisJaWYgKChpbnQpKG5ieXRlc191YiAtIG9sZF9hbGxvY19jb3VudCkgPiAwKSB7CisJCXJ0X3ByaW50aygibWl0ZTogRE1BIHVuZGVycnVuXG4iKTsKKwkJYXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfT1ZFUkZMT1c7CisJCXJldHVybiAtMTsKKwl9CisJY291bnQgPSBuYnl0ZXNfbGIgLSBhc3luYy0+YnVmX3JlYWRfY291bnQ7CisJaWYgKGNvdW50IDw9IDApIHsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChjb3VudCkgeworCQljb21lZGlfYnVmX3JlYWRfZnJlZShhc3luYywgY291bnQpOworCQlhc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9CTE9DSzsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3Vuc2lnbmVkIG1pdGVfZ2V0X3N0YXR1cyhzdHJ1Y3QgbWl0ZV9jaGFubmVsICptaXRlX2NoYW4pCit7CisJc3RydWN0IG1pdGVfc3RydWN0ICptaXRlID0gbWl0ZV9jaGFuLT5taXRlOworCXVuc2lnbmVkIHN0YXR1czsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJY29tZWRpX3NwaW5fbG9ja19pcnFzYXZlKCZtaXRlLT5sb2NrLCBmbGFncyk7CisJc3RhdHVzID0gcmVhZGwobWl0ZS0+bWl0ZV9pb19hZGRyICsgTUlURV9DSFNSKG1pdGVfY2hhbi0+Y2hhbm5lbCkpOworCWlmIChzdGF0dXMgJiBDSFNSX0RPTkUpIHsKKwkJbWl0ZV9jaGFuLT5kb25lID0gMTsKKwkJd3JpdGVsKENIT1JfQ0xSRE9ORSwKKwkJCW1pdGUtPm1pdGVfaW9fYWRkciArIE1JVEVfQ0hPUihtaXRlX2NoYW4tPmNoYW5uZWwpKTsKKwl9CisJbW1pb3diKCk7CisJY29tZWRpX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1pdGUtPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitpbnQgbWl0ZV9kb25lKHN0cnVjdCBtaXRlX2NoYW5uZWwgKm1pdGVfY2hhbikKK3sKKwlzdHJ1Y3QgbWl0ZV9zdHJ1Y3QgKm1pdGUgPSBtaXRlX2NoYW4tPm1pdGU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgZG9uZTsKKworCW1pdGVfZ2V0X3N0YXR1cyhtaXRlX2NoYW4pOworCWNvbWVkaV9zcGluX2xvY2tfaXJxc2F2ZSgmbWl0ZS0+bG9jaywgZmxhZ3MpOworCWRvbmUgPSBtaXRlX2NoYW4tPmRvbmU7CisJY29tZWRpX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1pdGUtPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gZG9uZTsKK30KKworI2lmZGVmIERFQlVHX01JVEUKKworc3RhdGljIHZvaWQgbWl0ZV9kZWNvZGUoY2hhciAqKmJpdF9zdHIsIHVuc2lnbmVkIGludCBiaXRzKTsKKworLyogbmFtZXMgb2YgYml0cyBpbiBtaXRlIHJlZ2lzdGVycyAqLworCitzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgbWl0ZV9DSE9SX3N0cmluZ3NbXSA9IHsKKwkic3RhcnQiLCAiY29udCIsICJzdG9wIiwgImFib3J0IiwKKwkiZnJlc2V0IiwgImNscmxjIiwgImNscnJiIiwgImNscmRvbmUiLAorCSJjbHJfbHBhdXNlIiwgInNldF9scGF1c2UiLCAiY2xyX3NlbmRfdGMiLAorCSJzZXRfc2VuZF90YyIsICIxMiIsICIxMyIsICIxNCIsCisJIjE1IiwgIjE2IiwgIjE3IiwgIjE4IiwKKwkiMTkiLCAiMjAiLCAiMjEiLCAiMjIiLAorCSIyMyIsICIyNCIsICIyNSIsICIyNiIsCisJIjI3IiwgIjI4IiwgIjI5IiwgIjMwIiwKKwkiZG1hcmVzZXQiLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IG1pdGVfQ0hDUl9zdHJpbmdzW10gPSB7CisJImNvbnRpbnVlIiwgInJpbmdidWZmIiwgIjIiLCAiMyIsCisJIjQiLCAiNSIsICI2IiwgIjciLAorCSI4IiwgIjkiLCAiMTAiLCAiMTEiLAorCSIxMiIsICIxMyIsICJidXJzdGVuIiwgImZpZm9kaXMiLAorCSJjbHJfY29udF9yYl9pZSIsICJzZXRfY29udF9yYl9pZSIsICJjbHJfbGNfaWUiLCAic2V0X2xjX2llIiwKKwkiY2xyX2RyZHlfaWUiLCAic2V0X2RyZHlfaWUiLCAiY2xyX21yZHlfaWUiLCAic2V0X21yZHlfaWUiLAorCSJjbHJfZG9uZV9pZSIsICJzZXRfZG9uZV9pZSIsICJjbHJfc2FyX2llIiwgInNldF9zYXJfaWUiLAorCSJjbHJfbGlua3BfaWUiLCAic2V0X2xpbmtwX2llIiwgImNscl9kbWFfaWUiLCAic2V0X2RtYV9pZSIsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgbWl0ZV9NQ1Jfc3RyaW5nc1tdID0geworCSJhbWRldmljZSIsICIxIiwgIjIiLCAiMyIsCisJIjQiLCAiNSIsICJwb3J0aW8iLCAicG9ydHZ4aSIsCisJInBzaXplYnl0ZSIsICJwc2l6ZWhhbGYgKGJ5dGUgJiBoYWxmID0gd29yZCkiLCAiYXNlcXhwMSIsICIxMSIsCisJIjEyIiwgIjEzIiwgImJsb2NrZW4iLCAiYmVyaGFuZCIsCisJInJlcXNpbnRsaW0vcmVxczAiLCAicmVxczEiLCAicmVxczIiLCAicmQzMiIsCisJInJkNTEyIiwgInJsMSIsICJybDIiLCAicmw4IiwKKwkiMjQiLCAiMjUiLCAiMjYiLCAiMjciLAorCSIyOCIsICIyOSIsICIzMCIsICJzdG9wZW4iLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IG1pdGVfRENSX3N0cmluZ3NbXSA9IHsKKwkiYW1kZXZpY2UiLCAiMSIsICIyIiwgIjMiLAorCSI0IiwgIjUiLCAicG9ydGlvIiwgInBvcnR2eGkiLAorCSJwc2l6ZWJ5dGUiLCAicHNpemVoYWxmIChieXRlICYgaGFsZiA9IHdvcmQpIiwgImFzZXF4cDEiLCAiYXNlcXhwMiIsCisJImFzZXF4cDgiLCAiMTMiLCAiYmxvY2tlbiIsICJiZXJoYW5kIiwKKwkicmVxc2ludGxpbSIsICJyZXFzMSIsICJyZXFzMiIsICJyZDMyIiwKKwkicmQ1MTIiLCAicmwxIiwgInJsMiIsICJybDgiLAorCSIyMyIsICIyNCIsICIyNSIsICIyNyIsCisJIjI4IiwgIndzZGV2YyIsICJ3c2RldnMiLCAicndkZXZwYWNrIiwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCBtaXRlX0xLQ1Jfc3RyaW5nc1tdID0geworCSJhbWRldmljZSIsICIxIiwgIjIiLCAiMyIsCisJIjQiLCAiNSIsICJwb3J0aW8iLCAicG9ydHZ4aSIsCisJInBzaXplYnl0ZSIsICJwc2l6ZWhhbGYgKGJ5dGUgJiBoYWxmID0gd29yZCkiLCAiYXNlcXVwIiwgImFzZXFkb3duIiwKKwkiMTIiLCAiMTMiLCAiMTQiLCAiYmVyaGFuZCIsCisJIjE2IiwgIjE3IiwgIjE4IiwgInJkMzIiLAorCSJyZDUxMiIsICJybDEiLCAicmwyIiwgInJsOCIsCisJIjI0IiwgIjI1IiwgIjI2IiwgIjI3IiwKKwkiMjgiLCAiMjkiLCAiMzAiLCAiY2huZ2VuZCIsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgbWl0ZV9DSFNSX3N0cmluZ3NbXSA9IHsKKwkiZC5lcnIwIiwgImQuZXJyMSIsICJtLmVycjAiLCAibS5lcnIxIiwKKwkibC5lcnIwIiwgImwuZXJyMSIsICJkcnEwIiwgImRycTEiLAorCSJlbmQiLCAieGZlcnIiLCAib3BlcnIwIiwgIm9wZXJyMSIsCisJInN0b3BzIiwgImhhYm9ydCIsICJzYWJvcnQiLCAiZXJyb3IiLAorCSIxNiIsICJjb250c19yYiIsICIxOCIsICJsaW5rYyIsCisJIjIwIiwgImRyZHkiLCAiMjIiLCAibXJkeSIsCisJIjI0IiwgImRvbmUiLCAiMjYiLCAic2FycyIsCisJIjI4IiwgImxwYXVzZXMiLCAiMzAiLCAiaW50IiwKK307CisKK3ZvaWQgbWl0ZV9kdW1wX3JlZ3Moc3RydWN0IG1pdGVfY2hhbm5lbCAqbWl0ZV9jaGFuKQoreworCXVuc2lnbmVkIGxvbmcgbWl0ZV9pb19hZGRyID0KKwkJKHVuc2lnbmVkIGxvbmcpbWl0ZV9jaGFuLT5taXRlLT5taXRlX2lvX2FkZHI7CisJdW5zaWduZWQgbG9uZyBhZGRyID0gMDsKKwl1bnNpZ25lZCBsb25nIHRlbXAgPSAwOworCisJcHJpbnRrKCJtaXRlX2R1bXBfcmVncyBjaCVpXG4iLCBtaXRlX2NoYW4tPmNoYW5uZWwpOworCXByaW50aygibWl0ZSBhZGRyZXNzIGlzICA9MHglMDhseFxuIiwgbWl0ZV9pb19hZGRyKTsKKworCWFkZHIgPSBtaXRlX2lvX2FkZHIgKyBNSVRFX0NIT1IoY2hhbm5lbCk7CisJcHJpbnRrKCJtaXRlIHN0YXR1c1tDSE9SXWF0IDB4JTA4bHggPTB4JTA4bHhcbiIsIGFkZHIsIHRlbXAgPQorCQlyZWFkbChhZGRyKSk7CisJbWl0ZV9kZWNvZGUobWl0ZV9DSE9SX3N0cmluZ3MsIHRlbXApOworCWFkZHIgPSBtaXRlX2lvX2FkZHIgKyBNSVRFX0NIQ1IoY2hhbm5lbCk7CisJcHJpbnRrKCJtaXRlIHN0YXR1c1tDSENSXWF0IDB4JTA4bHggPTB4JTA4bHhcbiIsIGFkZHIsIHRlbXAgPQorCQlyZWFkbChhZGRyKSk7CisJbWl0ZV9kZWNvZGUobWl0ZV9DSENSX3N0cmluZ3MsIHRlbXApOworCWFkZHIgPSBtaXRlX2lvX2FkZHIgKyBNSVRFX1RDUihjaGFubmVsKTsKKwlwcmludGsoIm1pdGUgc3RhdHVzW1RDUl0gYXQgMHglMDhseCA9MHglMDh4XG4iLCBhZGRyLCByZWFkbChhZGRyKSk7CisJYWRkciA9IG1pdGVfaW9fYWRkciArIE1JVEVfTUNSKGNoYW5uZWwpOworCXByaW50aygibWl0ZSBzdGF0dXNbTUNSXSBhdCAweCUwOGx4ID0weCUwOGx4XG4iLCBhZGRyLCB0ZW1wID0KKwkJcmVhZGwoYWRkcikpOworCW1pdGVfZGVjb2RlKG1pdGVfTUNSX3N0cmluZ3MsIHRlbXApOworCisJYWRkciA9IG1pdGVfaW9fYWRkciArIE1JVEVfTUFSKGNoYW5uZWwpOworCXByaW50aygibWl0ZSBzdGF0dXNbTUFSXSBhdCAweCUwOGx4ID0weCUwOHhcbiIsIGFkZHIsIHJlYWRsKGFkZHIpKTsKKwlhZGRyID0gbWl0ZV9pb19hZGRyICsgTUlURV9EQ1IoY2hhbm5lbCk7CisJcHJpbnRrKCJtaXRlIHN0YXR1c1tEQ1JdIGF0IDB4JTA4bHggPTB4JTA4bHhcbiIsIGFkZHIsIHRlbXAgPQorCQlyZWFkbChhZGRyKSk7CisJbWl0ZV9kZWNvZGUobWl0ZV9EQ1Jfc3RyaW5ncywgdGVtcCk7CisJYWRkciA9IG1pdGVfaW9fYWRkciArIE1JVEVfREFSKGNoYW5uZWwpOworCXByaW50aygibWl0ZSBzdGF0dXNbREFSXSBhdCAweCUwOGx4ID0weCUwOHhcbiIsIGFkZHIsIHJlYWRsKGFkZHIpKTsKKwlhZGRyID0gbWl0ZV9pb19hZGRyICsgTUlURV9MS0NSKGNoYW5uZWwpOworCXByaW50aygibWl0ZSBzdGF0dXNbTEtDUl1hdCAweCUwOGx4ID0weCUwOGx4XG4iLCBhZGRyLCB0ZW1wID0KKwkJcmVhZGwoYWRkcikpOworCW1pdGVfZGVjb2RlKG1pdGVfTEtDUl9zdHJpbmdzLCB0ZW1wKTsKKwlhZGRyID0gbWl0ZV9pb19hZGRyICsgTUlURV9MS0FSKGNoYW5uZWwpOworCXByaW50aygibWl0ZSBzdGF0dXNbTEtBUl1hdCAweCUwOGx4ID0weCUwOHhcbiIsIGFkZHIsIHJlYWRsKGFkZHIpKTsKKworCWFkZHIgPSBtaXRlX2lvX2FkZHIgKyBNSVRFX0NIU1IoY2hhbm5lbCk7CisJcHJpbnRrKCJtaXRlIHN0YXR1c1tDSFNSXWF0IDB4JTA4bHggPTB4JTA4bHhcbiIsIGFkZHIsIHRlbXAgPQorCQlyZWFkbChhZGRyKSk7CisJbWl0ZV9kZWNvZGUobWl0ZV9DSFNSX3N0cmluZ3MsIHRlbXApOworCWFkZHIgPSBtaXRlX2lvX2FkZHIgKyBNSVRFX0ZDUihjaGFubmVsKTsKKwlwcmludGsoIm1pdGUgc3RhdHVzW0ZDUl0gYXQgMHglMDhseCA9MHglMDh4XG5cbiIsIGFkZHIsIHJlYWRsKGFkZHIpKTsKK30KKworc3RhdGljIHZvaWQgbWl0ZV9kZWNvZGUoY2hhciAqKmJpdF9zdHIsIHVuc2lnbmVkIGludCBiaXRzKQoreworCWludCBpOworCisJZm9yIChpID0gMzE7IGkgPj0gMDsgaS0tKSB7CisJCWlmIChiaXRzICYgKDEgPDwgaSkpIHsKKwkJCXByaW50aygiICVzIiwgYml0X3N0cltpXSk7CisJCX0KKwl9CisJcHJpbnRrKCJcbiIpOworfQorI2VuZGlmCisKKyNpZmRlZiBNT0RVTEUKK2ludCBfX2luaXQgaW5pdF9tb2R1bGUodm9pZCkKK3sKKwltaXRlX2luaXQoKTsKKwltaXRlX2xpc3RfZGV2aWNlcygpOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgX19leGl0IGNsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJbWl0ZV9jbGVhbnVwKCk7Cit9CisKK0VYUE9SVF9TWU1CT0wobWl0ZV9kbWFfdGNyKTsKK0VYUE9SVF9TWU1CT0wobWl0ZV9kbWFfYXJtKTsKK0VYUE9SVF9TWU1CT0wobWl0ZV9kbWFfZGlzYXJtKTsKK0VYUE9SVF9TWU1CT0wobWl0ZV9zeW5jX2lucHV0X2RtYSk7CitFWFBPUlRfU1lNQk9MKG1pdGVfc3luY19vdXRwdXRfZG1hKTsKK0VYUE9SVF9TWU1CT0wobWl0ZV9zZXR1cCk7CitFWFBPUlRfU1lNQk9MKG1pdGVfc2V0dXAyKTsKK0VYUE9SVF9TWU1CT0wobWl0ZV91bnNldHVwKTsKKyNpZiAwCitFWFBPUlRfU1lNQk9MKG1pdGVfa3ZtZW1fc2VnbWVudF9sb2FkKTsKK0VYUE9SVF9TWU1CT0wobWl0ZV9sbF9mcm9tX2t2bWVtKTsKK0VYUE9SVF9TWU1CT0wobWl0ZV9zZXRyZWdzKTsKKyNlbmRpZgorRVhQT1JUX1NZTUJPTChtaXRlX2RldmljZXMpOworRVhQT1JUX1NZTUJPTChtaXRlX2xpc3RfZGV2aWNlcyk7CitFWFBPUlRfU1lNQk9MKG1pdGVfcmVxdWVzdF9jaGFubmVsX2luX3JhbmdlKTsKK0VYUE9SVF9TWU1CT0wobWl0ZV9yZWxlYXNlX2NoYW5uZWwpOworRVhQT1JUX1NZTUJPTChtaXRlX3ByZXBfZG1hKTsKK0VYUE9SVF9TWU1CT0wobWl0ZV9idWZfY2hhbmdlKTsKK0VYUE9SVF9TWU1CT0wobWl0ZV9ieXRlc193cml0dGVuX3RvX21lbW9yeV9sYik7CitFWFBPUlRfU1lNQk9MKG1pdGVfYnl0ZXNfd3JpdHRlbl90b19tZW1vcnlfdWIpOworRVhQT1JUX1NZTUJPTChtaXRlX2J5dGVzX3JlYWRfZnJvbV9tZW1vcnlfbGIpOworRVhQT1JUX1NZTUJPTChtaXRlX2J5dGVzX3JlYWRfZnJvbV9tZW1vcnlfdWIpOworRVhQT1JUX1NZTUJPTChtaXRlX2J5dGVzX2luX3RyYW5zaXQpOworRVhQT1JUX1NZTUJPTChtaXRlX2dldF9zdGF0dXMpOworRVhQT1JUX1NZTUJPTChtaXRlX2RvbmUpOworI2lmZGVmIERFQlVHX01JVEUKK0VYUE9SVF9TWU1CT0wobWl0ZV9kZWNvZGUpOworRVhQT1JUX1NZTUJPTChtaXRlX2R1bXBfcmVncyk7CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbWl0ZS5oIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL21pdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODRlYWZhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL21pdGUuaApAQCAtMCwwICsxLDQ1MyBAQAorLyoKKyAgICBtb2R1bGUvbWl0ZS5oCisgICAgSGFyZHdhcmUgZHJpdmVyIGZvciBOSSBNaXRlIFBDSSBpbnRlcmZhY2UgY2hpcAorCisgICAgQ09NRURJIC0gTGludXggQ29udHJvbCBhbmQgTWVhc3VyZW1lbnQgRGV2aWNlIEludGVyZmFjZQorICAgIENvcHlyaWdodCAoQykgMTk5OSBEYXZpZCBBLiBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisqLworCisjaWZuZGVmIF9NSVRFX0hfCisjZGVmaW5lIF9NSVRFX0hfCisKKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlICIuLi9jb21lZGlkZXYuaCIKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX05BVElOU1QJCTB4MTA5MworCisvLyAjZGVmaW5lIERFQlVHX01JVEUKKyNkZWZpbmUgUENJTUlPX0NPTVBBVAorCisjaWZkZWYgREVCVUdfTUlURQorI2RlZmluZSBNRFBSSU5USyhmb3JtYXQsYXJncy4uLikJcHJpbnRrKGZvcm1hdCAsICMjIGFyZ3MgKQorI2Vsc2UKKyNkZWZpbmUgTURQUklOVEsoZm9ybWF0LGFyZ3MuLi4pCisjZW5kaWYKKworI2RlZmluZSBNQVhfTUlURV9ETUFfQ0hBTk5FTFMgOAorCitzdHJ1Y3QgbWl0ZV9kbWFfZGVzY3JpcHRvciB7CisJdTMyIGNvdW50OworCXUzMiBhZGRyOworCXUzMiBuZXh0OworCXUzMiBkYXI7Cit9OworCitzdHJ1Y3QgbWl0ZV9kbWFfZGVzY3JpcHRvcl9yaW5nIHsKKwlzdHJ1Y3QgZGV2aWNlICpod19kZXY7CisJdW5zaWduZWQgaW50IG5fbGlua3M7CisJc3RydWN0IG1pdGVfZG1hX2Rlc2NyaXB0b3IgKmRlc2NyaXB0b3JzOworCWRtYV9hZGRyX3QgZGVzY3JpcHRvcnNfZG1hX2FkZHI7Cit9OworCitzdHJ1Y3QgbWl0ZV9jaGFubmVsIHsKKwlzdHJ1Y3QgbWl0ZV9zdHJ1Y3QgKm1pdGU7CisJdW5zaWduZWQgY2hhbm5lbDsKKwlpbnQgZGlyOworCWludCBkb25lOworCXN0cnVjdCBtaXRlX2RtYV9kZXNjcmlwdG9yX3JpbmcgKnJpbmc7Cit9OworCitzdHJ1Y3QgbWl0ZV9zdHJ1Y3QgeworCXN0cnVjdCBtaXRlX3N0cnVjdCAqbmV4dDsKKwlpbnQgdXNlZDsKKworCXN0cnVjdCBwY2lfZGV2ICpwY2lkZXY7CisJcmVzb3VyY2Vfc2l6ZV90IG1pdGVfcGh5c19hZGRyOworCXZvaWQgKm1pdGVfaW9fYWRkcjsKKwlyZXNvdXJjZV9zaXplX3QgZGFxX3BoeXNfYWRkcjsKKwl2b2lkICpkYXFfaW9fYWRkcjsKKworCXN0cnVjdCBtaXRlX2NoYW5uZWwgY2hhbm5lbHNbTUFYX01JVEVfRE1BX0NIQU5ORUxTXTsKKwlzaG9ydCBjaGFubmVsX2FsbG9jYXRlZFtNQVhfTUlURV9ETUFfQ0hBTk5FTFNdOworCWludCBudW1fY2hhbm5lbHM7CisJdW5zaWduZWQgZmlmb19zaXplOworCXNwaW5sb2NrX3QgbG9jazsKK307CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IG1pdGVfZG1hX2Rlc2NyaXB0b3JfcmluZyAqbWl0ZV9hbGxvY19yaW5nKHN0cnVjdAorCW1pdGVfc3RydWN0ICptaXRlKQoreworCXN0cnVjdCBtaXRlX2RtYV9kZXNjcmlwdG9yX3JpbmcgKnJpbmcgPQorCQlrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbWl0ZV9kbWFfZGVzY3JpcHRvcl9yaW5nKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHJpbmcgPT0gTlVMTCkKKwkJcmV0dXJuIHJpbmc7CisJcmluZy0+aHdfZGV2ID0gZ2V0X2RldmljZSgmbWl0ZS0+cGNpZGV2LT5kZXYpOworCWlmIChyaW5nLT5od19kZXYgPT0gTlVMTCkgeworCQlrZnJlZShyaW5nKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCXJpbmctPm5fbGlua3MgPSAwOworCXJpbmctPmRlc2NyaXB0b3JzID0gTlVMTDsKKwlyaW5nLT5kZXNjcmlwdG9yc19kbWFfYWRkciA9IDA7CisJcmV0dXJuIHJpbmc7Cit9OworCitzdGF0aWMgaW5saW5lIHZvaWQgbWl0ZV9mcmVlX3Jpbmcoc3RydWN0IG1pdGVfZG1hX2Rlc2NyaXB0b3JfcmluZyAqcmluZykKK3sKKwlpZiAocmluZykgeworCQlpZiAocmluZy0+ZGVzY3JpcHRvcnMpIHsKKwkJCWRtYV9mcmVlX2NvaGVyZW50KHJpbmctPmh3X2RldiwKKwkJCQlyaW5nLT5uX2xpbmtzICoKKwkJCQlzaXplb2Yoc3RydWN0IG1pdGVfZG1hX2Rlc2NyaXB0b3IpLAorCQkJCXJpbmctPmRlc2NyaXB0b3JzLCByaW5nLT5kZXNjcmlwdG9yc19kbWFfYWRkcik7CisJCX0KKwkJcHV0X2RldmljZShyaW5nLT5od19kZXYpOworCQlrZnJlZShyaW5nKTsKKwl9Cit9OworCitleHRlcm4gc3RydWN0IG1pdGVfc3RydWN0ICptaXRlX2RldmljZXM7CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IG1pdGVfaXJxKHN0cnVjdCBtaXRlX3N0cnVjdCAqbWl0ZSkKK3sKKwlyZXR1cm4gbWl0ZS0+cGNpZGV2LT5pcnE7Cit9Oworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgbWl0ZV9kZXZpY2VfaWQoc3RydWN0IG1pdGVfc3RydWN0ICptaXRlKQoreworCXJldHVybiBtaXRlLT5wY2lkZXYtPmRldmljZTsKK307CisKK3ZvaWQgbWl0ZV9pbml0KHZvaWQpOwordm9pZCBtaXRlX2NsZWFudXAodm9pZCk7CitpbnQgbWl0ZV9zZXR1cChzdHJ1Y3QgbWl0ZV9zdHJ1Y3QgKm1pdGUpOworaW50IG1pdGVfc2V0dXAyKHN0cnVjdCBtaXRlX3N0cnVjdCAqbWl0ZSwgdW5zaWduZWQgdXNlX2lvZHdic3JfMSk7Cit2b2lkIG1pdGVfdW5zZXR1cChzdHJ1Y3QgbWl0ZV9zdHJ1Y3QgKm1pdGUpOwordm9pZCBtaXRlX2xpc3RfZGV2aWNlcyh2b2lkKTsKK3N0cnVjdCBtaXRlX2NoYW5uZWwgKm1pdGVfcmVxdWVzdF9jaGFubmVsX2luX3JhbmdlKHN0cnVjdCBtaXRlX3N0cnVjdCAqbWl0ZSwKKwlzdHJ1Y3QgbWl0ZV9kbWFfZGVzY3JpcHRvcl9yaW5nICpyaW5nLCB1bnNpZ25lZCBtaW5fY2hhbm5lbCwKKwl1bnNpZ25lZCBtYXhfY2hhbm5lbCk7CitzdGF0aWMgaW5saW5lIHN0cnVjdCBtaXRlX2NoYW5uZWwgKm1pdGVfcmVxdWVzdF9jaGFubmVsKHN0cnVjdCBtaXRlX3N0cnVjdAorCSptaXRlLCBzdHJ1Y3QgbWl0ZV9kbWFfZGVzY3JpcHRvcl9yaW5nICpyaW5nKQoreworCXJldHVybiBtaXRlX3JlcXVlc3RfY2hhbm5lbF9pbl9yYW5nZShtaXRlLCByaW5nLCAwLAorCQltaXRlLT5udW1fY2hhbm5lbHMgLSAxKTsKK30KK3ZvaWQgbWl0ZV9yZWxlYXNlX2NoYW5uZWwoc3RydWN0IG1pdGVfY2hhbm5lbCAqbWl0ZV9jaGFuKTsKKwordW5zaWduZWQgbWl0ZV9kbWFfdGNyKHN0cnVjdCBtaXRlX2NoYW5uZWwgKm1pdGVfY2hhbik7Cit2b2lkIG1pdGVfZG1hX2FybShzdHJ1Y3QgbWl0ZV9jaGFubmVsICptaXRlX2NoYW4pOwordm9pZCBtaXRlX2RtYV9kaXNhcm0oc3RydWN0IG1pdGVfY2hhbm5lbCAqbWl0ZV9jaGFuKTsKK2ludCBtaXRlX3N5bmNfaW5wdXRfZG1hKHN0cnVjdCBtaXRlX2NoYW5uZWwgKm1pdGVfY2hhbiwgY29tZWRpX2FzeW5jICogYXN5bmMpOworaW50IG1pdGVfc3luY19vdXRwdXRfZG1hKHN0cnVjdCBtaXRlX2NoYW5uZWwgKm1pdGVfY2hhbiwgY29tZWRpX2FzeW5jICogYXN5bmMpOwordTMyIG1pdGVfYnl0ZXNfd3JpdHRlbl90b19tZW1vcnlfbGIoc3RydWN0IG1pdGVfY2hhbm5lbCAqbWl0ZV9jaGFuKTsKK3UzMiBtaXRlX2J5dGVzX3dyaXR0ZW5fdG9fbWVtb3J5X3ViKHN0cnVjdCBtaXRlX2NoYW5uZWwgKm1pdGVfY2hhbik7Cit1MzIgbWl0ZV9ieXRlc19yZWFkX2Zyb21fbWVtb3J5X2xiKHN0cnVjdCBtaXRlX2NoYW5uZWwgKm1pdGVfY2hhbik7Cit1MzIgbWl0ZV9ieXRlc19yZWFkX2Zyb21fbWVtb3J5X3ViKHN0cnVjdCBtaXRlX2NoYW5uZWwgKm1pdGVfY2hhbik7Cit1MzIgbWl0ZV9ieXRlc19pbl90cmFuc2l0KHN0cnVjdCBtaXRlX2NoYW5uZWwgKm1pdGVfY2hhbik7Cit1bnNpZ25lZCBtaXRlX2dldF9zdGF0dXMoc3RydWN0IG1pdGVfY2hhbm5lbCAqbWl0ZV9jaGFuKTsKK2ludCBtaXRlX2RvbmUoc3RydWN0IG1pdGVfY2hhbm5lbCAqbWl0ZV9jaGFuKTsKKworI2lmIDAKK3Vuc2lnbmVkIGxvbmcgbWl0ZV9sbF9mcm9tX2t2bWVtKHN0cnVjdCBtaXRlX3N0cnVjdCAqbWl0ZSwgY29tZWRpX2FzeW5jICogYXN5bmMsCisJaW50IGxlbik7Cit2b2lkIG1pdGVfc2V0cmVncyhzdHJ1Y3QgbWl0ZV9zdHJ1Y3QgKm1pdGUsIHVuc2lnbmVkIGxvbmcgbGxfc3RhcnQsIGludCBjaGFuLAorCWludCBkaXIpOworI2VuZGlmCisKK3ZvaWQgbWl0ZV9wcmVwX2RtYShzdHJ1Y3QgbWl0ZV9jaGFubmVsICptaXRlX2NoYW4sCisJdW5zaWduZWQgaW50IG51bV9kZXZpY2VfYml0cywgdW5zaWduZWQgaW50IG51bV9tZW1vcnlfYml0cyk7CitpbnQgbWl0ZV9idWZfY2hhbmdlKHN0cnVjdCBtaXRlX2RtYV9kZXNjcmlwdG9yX3JpbmcgKnJpbmcsCisJY29tZWRpX2FzeW5jICogYXN5bmMpOworCisjaWZkZWYgREVCVUdfTUlURQordm9pZCBtaXRlX3ByaW50X2Noc3IodW5zaWduZWQgaW50IGNoc3IpOwordm9pZCBtaXRlX2R1bXBfcmVncyhzdHJ1Y3QgbWl0ZV9jaGFubmVsICptaXRlX2NoYW4pOworI2VuZGlmCisKK3N0YXRpYyBpbmxpbmUgaW50IENIQU5fT0ZGU0VUKGludCBjaGFubmVsKQoreworCXJldHVybiAweDUwMCArIDB4MTAwICogY2hhbm5lbDsKK307CisKK2VudW0gbWl0ZV9yZWdpc3RlcnMgeworCS8qIFRoZSBiaXRzIDB4OTAxODA3MDAgaW4gTUlURV9VTktOT1dOX0RNQV9CVVJTVF9SRUcgY2FuIGJlCisJICAgd3JpdHRlbiBhbmQgcmVhZCBiYWNrLiAgVGhlIGJpdHMgMHgxZiBhbHdheXMgcmVhZCBhcyAxLgorCSAgIFRoZSByZXN0IGFsd2F5cyByZWFkIGFzIHplcm8uICovCisJTUlURV9VTktOT1dOX0RNQV9CVVJTVF9SRUcgPSAweDI4LAorCU1JVEVfSU9EV0JTUiA9IDB4YzAsCS8vSU8gRGV2aWNlIFdpbmRvdyBCYXNlIFNpemUgUmVnaXN0ZXIKKwlNSVRFX0lPRFdCU1JfMSA9IDB4YzQsCS8vIElPIERldmljZSBXaW5kb3cgQmFzZSBTaXplIFJlZ2lzdGVyIDEKKwlNSVRFX0lPRFdDUl8xID0gMHhmNCwKKwlNSVRFX1BDSV9DT05GSUdfT0ZGU0VUID0gMHgzMDAsCisJTUlURV9DU0lHUiA9IDB4NDYwCS8vY2hpcCBzaWduYXR1cmUKK307CitzdGF0aWMgaW5saW5lIGludCBNSVRFX0NIT1IoaW50IGNoYW5uZWwpCS8vIGNoYW5uZWwgb3BlcmF0aW9uCit7CisJcmV0dXJuIENIQU5fT0ZGU0VUKGNoYW5uZWwpICsgMHgwOworfTsKK3N0YXRpYyBpbmxpbmUgaW50IE1JVEVfQ0hDUihpbnQgY2hhbm5lbCkJLy8gY2hhbm5lbCBjb250cm9sCit7CisJcmV0dXJuIENIQU5fT0ZGU0VUKGNoYW5uZWwpICsgMHg0OworfTsKK3N0YXRpYyBpbmxpbmUgaW50IE1JVEVfVENSKGludCBjaGFubmVsKQkvLyB0cmFuc2ZlciBjb3VudAoreworCXJldHVybiBDSEFOX09GRlNFVChjaGFubmVsKSArIDB4ODsKK307CitzdGF0aWMgaW5saW5lIGludCBNSVRFX01DUihpbnQgY2hhbm5lbCkJLy8gbWVtb3J5IGNvbmZpZ3VyYXRpb24KK3sKKwlyZXR1cm4gQ0hBTl9PRkZTRVQoY2hhbm5lbCkgKyAweGM7Cit9Oworc3RhdGljIGlubGluZSBpbnQgTUlURV9NQVIoaW50IGNoYW5uZWwpCS8vIG1lbW9yeSBhZGRyZXNzCit7CisJcmV0dXJuIENIQU5fT0ZGU0VUKGNoYW5uZWwpICsgMHgxMDsKK307CitzdGF0aWMgaW5saW5lIGludCBNSVRFX0RDUihpbnQgY2hhbm5lbCkJLy8gZGV2aWNlIGNvbmZpZ3VyYXRpb24KK3sKKwlyZXR1cm4gQ0hBTl9PRkZTRVQoY2hhbm5lbCkgKyAweDE0OworfTsKK3N0YXRpYyBpbmxpbmUgaW50IE1JVEVfREFSKGludCBjaGFubmVsKQkvLyBkZXZpY2UgYWRkcmVzcworeworCXJldHVybiBDSEFOX09GRlNFVChjaGFubmVsKSArIDB4MTg7Cit9Oworc3RhdGljIGlubGluZSBpbnQgTUlURV9MS0NSKGludCBjaGFubmVsKQkvLyBsaW5rIGNvbmZpZ3VyYXRpb24KK3sKKwlyZXR1cm4gQ0hBTl9PRkZTRVQoY2hhbm5lbCkgKyAweDFjOworfTsKK3N0YXRpYyBpbmxpbmUgaW50IE1JVEVfTEtBUihpbnQgY2hhbm5lbCkJLy8gbGluayBhZGRyZXNzCit7CisJcmV0dXJuIENIQU5fT0ZGU0VUKGNoYW5uZWwpICsgMHgyMDsKK307CitzdGF0aWMgaW5saW5lIGludCBNSVRFX0xMS0FSKGludCBjaGFubmVsKQkvLyBzZWUgbWl0ZSBzZWN0aW9uIG9mIHRudDUwMDIgbWFudWFsCit7CisJcmV0dXJuIENIQU5fT0ZGU0VUKGNoYW5uZWwpICsgMHgyNDsKK307CitzdGF0aWMgaW5saW5lIGludCBNSVRFX0JBUihpbnQgY2hhbm5lbCkJLy8gYmFzZSBhZGRyZXNzCit7CisJcmV0dXJuIENIQU5fT0ZGU0VUKGNoYW5uZWwpICsgMHgyODsKK307CitzdGF0aWMgaW5saW5lIGludCBNSVRFX0JDUihpbnQgY2hhbm5lbCkJLy8gYmFzZSBjb3VudAoreworCXJldHVybiBDSEFOX09GRlNFVChjaGFubmVsKSArIDB4MmM7Cit9Oworc3RhdGljIGlubGluZSBpbnQgTUlURV9TQVIoaW50IGNoYW5uZWwpCS8vID8gYWRkcmVzcworeworCXJldHVybiBDSEFOX09GRlNFVChjaGFubmVsKSArIDB4MzA7Cit9Oworc3RhdGljIGlubGluZSBpbnQgTUlURV9XU0NSKGludCBjaGFubmVsKQkvLyA/Cit7CisJcmV0dXJuIENIQU5fT0ZGU0VUKGNoYW5uZWwpICsgMHgzNDsKK307CitzdGF0aWMgaW5saW5lIGludCBNSVRFX1dTRVIoaW50IGNoYW5uZWwpCS8vID8KK3sKKwlyZXR1cm4gQ0hBTl9PRkZTRVQoY2hhbm5lbCkgKyAweDM4OworfTsKK3N0YXRpYyBpbmxpbmUgaW50IE1JVEVfQ0hTUihpbnQgY2hhbm5lbCkJLy8gY2hhbm5lbCBzdGF0dXMKK3sKKwlyZXR1cm4gQ0hBTl9PRkZTRVQoY2hhbm5lbCkgKyAweDNjOworfTsKK3N0YXRpYyBpbmxpbmUgaW50IE1JVEVfRkNSKGludCBjaGFubmVsKQkvLyBmaWZvIGNvdW50Cit7CisJcmV0dXJuIENIQU5fT0ZGU0VUKGNoYW5uZWwpICsgMHg0MDsKK307CisKK2VudW0gTUlURV9JT0RXQlNSX2JpdHMgeworCVdFTkFCID0gMHg4MCwJCS8vIHdpbmRvdyBlbmFibGUKK307CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgTUlURV9JT0RXQlNSXzFfV1NJWkVfYml0cyh1bnNpZ25lZCBzaXplKQoreworCXVuc2lnbmVkIG9yZGVyID0gMDsKKwl3aGlsZSAoc2l6ZSA+Pj0gMSkKKwkJKytvcmRlcjsKKwlCVUdfT04ob3JkZXIgPCAxKTsKKwlyZXR1cm4gKG9yZGVyIC0gMSkgJiAweDFmOworfQorCitlbnVtIE1JVEVfVU5LTk9XTl9ETUFfQlVSU1RfYml0cyB7CisJVU5LTk9XTl9ETUFfQlVSU1RfRU5BQkxFX0JJVFMgPSAweDYwMAorfTsKKworc3RhdGljIGlubGluZSBpbnQgbWl0ZV9jc2lncl92ZXJzaW9uKHUzMiBjc2lncl9iaXRzKQoreworCXJldHVybiBjc2lncl9iaXRzICYgMHhmOworfTsKK3N0YXRpYyBpbmxpbmUgaW50IG1pdGVfY3NpZ3JfdHlwZSh1MzIgY3NpZ3JfYml0cykKK3sJCQkJLy8gb3JpZ2luYWwgbWl0ZSA9IDAsIG1pbmltaXRlID0gMQorCXJldHVybiAoY3NpZ3JfYml0cyA+PiA0KSAmIDB4ZjsKK307CitzdGF0aWMgaW5saW5lIGludCBtaXRlX2NzaWdyX21tb2RlKHUzMiBjc2lncl9iaXRzKQorewkJCQkvLyBtaXRlIG1vZGUsIG1pbmltaXRlID0gMQorCXJldHVybiAoY3NpZ3JfYml0cyA+PiA4KSAmIDB4MzsKK307CitzdGF0aWMgaW5saW5lIGludCBtaXRlX2NzaWdyX2ltb2RlKHUzMiBjc2lncl9iaXRzKQorewkJCQkvLyBjcHUgcG9ydCBpbnRlcmZhY2UgbW9kZSwgcGNpID0gMHgzCisJcmV0dXJuIChjc2lncl9iaXRzID4+IDEyKSAmIDB4MzsKK307CitzdGF0aWMgaW5saW5lIGludCBtaXRlX2NzaWdyX2RtYWModTMyIGNzaWdyX2JpdHMpCit7CQkJCS8vIG51bWJlciBvZiBkbWEgY2hhbm5lbHMKKwlyZXR1cm4gKGNzaWdyX2JpdHMgPj4gMTYpICYgMHhmOworfTsKK3N0YXRpYyBpbmxpbmUgaW50IG1pdGVfY3NpZ3Jfd3BkZXAodTMyIGNzaWdyX2JpdHMpCit7CQkJCS8vIHdyaXRlIHBvc3QgZmlmbyBkZXB0aAorCXVuc2lnbmVkIGludCB3cGRlcF9iaXRzID0gKGNzaWdyX2JpdHMgPj4gMjApICYgMHg3OworCWlmICh3cGRlcF9iaXRzID09IDApCisJCXJldHVybiAwOworCWVsc2UKKwkJcmV0dXJuIDEgPDwgKHdwZGVwX2JpdHMgLSAxKTsKK307CitzdGF0aWMgaW5saW5lIGludCBtaXRlX2NzaWdyX3dpbnModTMyIGNzaWdyX2JpdHMpCit7CisJcmV0dXJuIChjc2lncl9iaXRzID4+IDI0KSAmIDB4MWY7Cit9Oworc3RhdGljIGlubGluZSBpbnQgbWl0ZV9jc2lncl9pb3dpbnModTMyIGNzaWdyX2JpdHMpCit7CQkJCS8vIG51bWJlciBvZiBpbyB3aW5kb3dzCisJcmV0dXJuIChjc2lncl9iaXRzID4+IDI5KSAmIDB4NzsKK307CisKK2VudW0gTUlURV9NQ1JfYml0cyB7CisJTUNSUE9OID0gMCwKK307CisKK2VudW0gTUlURV9EQ1JfYml0cyB7CisJRENSX05PUk1BTCA9ICgxIDw8IDI5KSwKKwlEQ1JQT04gPSAwLAorfTsKKworZW51bSBNSVRFX0NIT1JfYml0cyB7CisJQ0hPUl9ETUFSRVNFVCA9ICgxIDw8IDMxKSwKKwlDSE9SX1NFVF9TRU5EX1RDID0gKDEgPDwgMTEpLAorCUNIT1JfQ0xSX1NFTkRfVEMgPSAoMSA8PCAxMCksCisJQ0hPUl9TRVRfTFBBVVNFID0gKDEgPDwgOSksCisJQ0hPUl9DTFJfTFBBVVNFID0gKDEgPDwgOCksCisJQ0hPUl9DTFJET05FID0gKDEgPDwgNyksCisJQ0hPUl9DTFJSQiA9ICgxIDw8IDYpLAorCUNIT1JfQ0xSTEMgPSAoMSA8PCA1KSwKKwlDSE9SX0ZSRVNFVCA9ICgxIDw8IDQpLAorCUNIT1JfQUJPUlQgPSAoMSA8PCAzKSwJLyogc3RvcCB3aXRob3V0IGVtcHR5aW5nIGZpZm8gKi8KKwlDSE9SX1NUT1AgPSAoMSA8PCAyKSwJLyogc3RvcCBhZnRlciBlbXB0eWluZyBmaWZvICovCisJQ0hPUl9DT05UID0gKDEgPDwgMSksCisJQ0hPUl9TVEFSVCA9ICgxIDw8IDApLAorCUNIT1JfUE9OID0gKENIT1JfQ0xSX1NFTkRfVEMgfCBDSE9SX0NMUl9MUEFVU0UpLAorfTsKKworZW51bSBNSVRFX0NIQ1JfYml0cyB7CisJQ0hDUl9TRVRfRE1BX0lFID0gKDEgPDwgMzEpLAorCUNIQ1JfQ0xSX0RNQV9JRSA9ICgxIDw8IDMwKSwKKwlDSENSX1NFVF9MSU5LUF9JRSA9ICgxIDw8IDI5KSwKKwlDSENSX0NMUl9MSU5LUF9JRSA9ICgxIDw8IDI4KSwKKwlDSENSX1NFVF9TQVJfSUUgPSAoMSA8PCAyNyksCisJQ0hDUl9DTFJfU0FSX0lFID0gKDEgPDwgMjYpLAorCUNIQ1JfU0VUX0RPTkVfSUUgPSAoMSA8PCAyNSksCisJQ0hDUl9DTFJfRE9ORV9JRSA9ICgxIDw8IDI0KSwKKwlDSENSX1NFVF9NUkRZX0lFID0gKDEgPDwgMjMpLAorCUNIQ1JfQ0xSX01SRFlfSUUgPSAoMSA8PCAyMiksCisJQ0hDUl9TRVRfRFJEWV9JRSA9ICgxIDw8IDIxKSwKKwlDSENSX0NMUl9EUkRZX0lFID0gKDEgPDwgMjApLAorCUNIQ1JfU0VUX0xDX0lFID0gKDEgPDwgMTkpLAorCUNIQ1JfQ0xSX0xDX0lFID0gKDEgPDwgMTgpLAorCUNIQ1JfU0VUX0NPTlRfUkJfSUUgPSAoMSA8PCAxNyksCisJQ0hDUl9DTFJfQ09OVF9SQl9JRSA9ICgxIDw8IDE2KSwKKwlDSENSX0ZJRk9ESVMgPSAoMSA8PCAxNSksCisJQ0hDUl9GSUZPX09OID0gMCwKKwlDSENSX0JVUlNURU4gPSAoMSA8PCAxNCksCisJQ0hDUl9OT19CVVJTVEVOID0gMCwKKwlDSENSX0JZVEVfU1dBUF9ERVZJQ0UgPSAoMSA8PCA2KSwKKwlDSENSX0JZVEVfU1dBUF9NRU1PUlkgPSAoMSA8PCA0KSwKKwlDSENSX0RJUiA9ICgxIDw8IDMpLAorCUNIQ1JfREVWX1RPX01FTSA9IENIQ1JfRElSLAorCUNIQ1JfTUVNX1RPX0RFViA9IDAsCisJQ0hDUl9OT1JNQUwgPSAoMCA8PCAwKSwKKwlDSENSX0NPTlRJTlVFID0gKDEgPDwgMCksCisJQ0hDUl9SSU5HQlVGRiA9ICgyIDw8IDApLAorCUNIQ1JfTElOS1NIT1JUID0gKDQgPDwgMCksCisJQ0hDUl9MSU5LTE9ORyA9ICg1IDw8IDApLAorCUNIQ1JQT04gPQorCQkoQ0hDUl9DTFJfRE1BX0lFIHwgQ0hDUl9DTFJfTElOS1BfSUUgfCBDSENSX0NMUl9TQVJfSUUgfAorCQlDSENSX0NMUl9ET05FX0lFIHwgQ0hDUl9DTFJfTVJEWV9JRSB8IENIQ1JfQ0xSX0RSRFlfSUUgfAorCQlDSENSX0NMUl9MQ19JRSB8IENIQ1JfQ0xSX0NPTlRfUkJfSUUpLAorfTsKKworZW51bSBDb25maWdSZWdpc3Rlcl9iaXRzIHsKKwlDUl9SRVFTX01BU0sgPSAweDcgPDwgMTYsCisJQ1JfQVNFUURPTlQgPSAweDAgPDwgMTAsCisJQ1JfQVNFUVVQID0gMHgxIDw8IDEwLAorCUNSX0FTRVFET1dOID0gMHgyIDw8IDEwLAorCUNSX0FTRVFfTUFTSyA9IDB4MyA8PCAxMCwKKwlDUl9QU0laRTggPSAoMSA8PCA4KSwKKwlDUl9QU0laRTE2ID0gKDIgPDwgOCksCisJQ1JfUFNJWkUzMiA9ICgzIDw8IDgpLAorCUNSX1BPUlRDUFUgPSAoMCA8PCA2KSwKKwlDUl9QT1JUSU8gPSAoMSA8PCA2KSwKKwlDUl9QT1JUVlhJID0gKDIgPDwgNiksCisJQ1JfUE9SVE1YSSA9ICgzIDw8IDYpLAorCUNSX0FNREVWSUNFID0gKDEgPDwgMCksCit9Oworc3RhdGljIGlubGluZSBpbnQgQ1JfUkVRUyhpbnQgc291cmNlKQoreworCXJldHVybiAoc291cmNlICYgMHg3KSA8PCAxNjsKK307CitzdGF0aWMgaW5saW5lIGludCBDUl9SRVFTRFJRKHVuc2lnbmVkIGRycV9saW5lKQoreworCS8qIFRoaXMgYWxzbyB3b3JrcyBvbiBtLXNlcmllcyB3aGVuCisJICAgdXNpbmcgY2hhbm5lbHMgKGRycV9saW5lKSA0IG9yIDUuICovCisJcmV0dXJuIENSX1JFUVMoKGRycV9saW5lICYgMHgzKSB8IDB4NCk7Cit9CitzdGF0aWMgaW5saW5lIGludCBDUl9STCh1bnNpZ25lZCBpbnQgcmV0cnlfbGltaXQpCit7CisJaW50IHZhbHVlID0gMDsKKworCXdoaWxlIChyZXRyeV9saW1pdCkgeworCQlyZXRyeV9saW1pdCA+Pj0gMTsKKwkJdmFsdWUrKzsKKwl9CisJaWYgKHZhbHVlID4gMHg3KQorCQlydF9wcmludGsoImNvbWVkaTogYnVnISByZXRyeV9saW1pdCB0b28gbGFyZ2VcbiIpOworCXJldHVybiAodmFsdWUgJiAweDcpIDw8IDIxOworfQorCitlbnVtIENIU1JfYml0cyB7CisJQ0hTUl9JTlQgPSAoMSA8PCAzMSksCisJQ0hTUl9MUEFVU0VTID0gKDEgPDwgMjkpLAorCUNIU1JfU0FSUyA9ICgxIDw8IDI3KSwKKwlDSFNSX0RPTkUgPSAoMSA8PCAyNSksCisJQ0hTUl9NUkRZID0gKDEgPDwgMjMpLAorCUNIU1JfRFJEWSA9ICgxIDw8IDIxKSwKKwlDSFNSX0xJTktDID0gKDEgPDwgMTkpLAorCUNIU1JfQ09OVFNfUkIgPSAoMSA8PCAxNyksCisJQ0hTUl9FUlJPUiA9ICgxIDw8IDE1KSwKKwlDSFNSX1NBQk9SVCA9ICgxIDw8IDE0KSwKKwlDSFNSX0hBQk9SVCA9ICgxIDw8IDEzKSwKKwlDSFNSX1NUT1BTID0gKDEgPDwgMTIpLAorCUNIU1JfT1BFUlJfbWFzayA9ICgzIDw8IDEwKSwKKwlDSFNSX09QRVJSX05PRVJST1IgPSAoMCA8PCAxMCksCisJQ0hTUl9PUEVSUl9GSUZPRVJST1IgPSAoMSA8PCAxMCksCisJQ0hTUl9PUEVSUl9MSU5LRVJST1IgPSAoMSA8PCAxMCksCS8qID8/PyAqLworCUNIU1JfWEZFUlIgPSAoMSA8PCA5KSwKKwlDSFNSX0VORCA9ICgxIDw8IDgpLAorCUNIU1JfRFJRMSA9ICgxIDw8IDcpLAorCUNIU1JfRFJRMCA9ICgxIDw8IDYpLAorCUNIU1JfTHhFUlJfbWFzayA9ICgzIDw8IDQpLAorCUNIU1JfTEJFUlIgPSAoMSA8PCA0KSwKKwlDSFNSX0xSRVJSID0gKDIgPDwgNCksCisJQ0hTUl9MT0VSUiA9ICgzIDw8IDQpLAorCUNIU1JfTXhFUlJfbWFzayA9ICgzIDw8IDIpLAorCUNIU1JfTUJFUlIgPSAoMSA8PCAyKSwKKwlDSFNSX01SRVJSID0gKDIgPDwgMiksCisJQ0hTUl9NT0VSUiA9ICgzIDw8IDIpLAorCUNIU1JfRHhFUlJfbWFzayA9ICgzIDw8IDApLAorCUNIU1JfREJFUlIgPSAoMSA8PCAwKSwKKwlDSFNSX0RSRVJSID0gKDIgPDwgMCksCisJQ0hTUl9ET0VSUiA9ICgzIDw8IDApLAorfTsKKworc3RhdGljIGlubGluZSB2b2lkIG1pdGVfZG1hX3Jlc2V0KHN0cnVjdCBtaXRlX2NoYW5uZWwgKm1pdGVfY2hhbikKK3sKKwl3cml0ZWwoQ0hPUl9ETUFSRVNFVCB8IENIT1JfRlJFU0VULAorCQltaXRlX2NoYW4tPm1pdGUtPm1pdGVfaW9fYWRkciArIE1JVEVfQ0hPUihtaXRlX2NoYW4tPmNoYW5uZWwpKTsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3BseDkwODAuaCBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9wbHg5MDgwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTVhMWE2OAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9wbHg5MDgwLmgKQEAgLTAsMCArMSw0MjkgQEAKKy8qIHBseDkwODAuaAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMiwyMDAzIEZyYW5rIE1vcmkgSGVzcyA8Zm1oZXNzQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKyAqCisgKiBJIG1vZGlmaWVkIHRoaXMgZmlsZSBmcm9tIHRoZSBwbHg5MDYwLmggaGVhZGVyIGZvciB0aGUKKyAqIHdhblhMIGRldmljZSBkcml2ZXIgaW4gdGhlIGxpbnV4IGtlcm5lbCwKKyAqIGZvciB0aGUgcmVnaXN0ZXIgb2Zmc2V0cyBhbmQgYml0IGRlZmluaXRpb25zLiAgTWFkZSBtaW5vciBtb2RpZmljYXRpb25zLAorICogYWRkZWQgcGx4OTA4MCByZWdpc3RlcnMgYW5kCisgKiBzdHJpcHBlZCBvdXQgc3R1ZmYgdGhhdCB3YXMgc3BlY2lmaWNhbGx5IGZvciB0aGUgd2FuWEwgZHJpdmVyLgorICogTm90ZTogSSd2ZSBvbmx5IG1hZGUgc3VyZSB0aGUgZGVmaW5pdGlvbnMgYXJlIGNvcnJlY3QgYXMgZmFyCisgKiBhcyBJIG1ha2UgdXNlIG9mIHRoZW0uICBUaGVyZSBhcmUgc3RpbGwgdmFyaW91cyBwbHg5MDYwLWlzbXMKKyAqIGxlZnQgaW4gdGhpcyBoZWFkZXIgZmlsZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTkgUkcgU3R1ZGlvIHMuYy4sIGh0dHA6Ly93d3cucmdzdHVkaW8uY29tLnBsLworICogV3JpdHRlbiBieSBLcnp5c3p0b2YgSGFsYXNhIDxraGNAcmdzdHVkaW8uY29tLnBsPgorICoKKyAqIFBvcnRpb25zIChDKSBTQkUgSW5jLiwgdXNlZCBieSBwZXJtaXNzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2lmbmRlZiBfX0NPTUVESV9QTFg5MDgwX0gKKyNkZWZpbmUgX19DT01FRElfUExYOTA4MF9ICisKKy8vIGRlc2NyaXB0b3IgYmxvY2sgdXNlZCBmb3IgY2hhaW5lZCBkbWEgdHJhbnNmZXJzCitzdHJ1Y3QgcGx4X2RtYV9kZXNjIHsKKwl2b2xhdGlsZSB1aW50MzJfdCBwY2lfc3RhcnRfYWRkcjsKKwl2b2xhdGlsZSB1aW50MzJfdCBsb2NhbF9zdGFydF9hZGRyOworCS8qIHRyYW5zZmVyX3NpemUgaXMgaW4gYnl0ZXMsIG9ubHkgZmlyc3QgMjMgYml0cyBvZiByZWdpc3RlciBhcmUgdXNlZCAqLworCXZvbGF0aWxlIHVpbnQzMl90IHRyYW5zZmVyX3NpemU7CisJLyogYWRkcmVzcyBvZiBuZXh0IGRlc2NyaXB0b3IgKHF1YWQgd29yZCBhbGlnbmVkKSwgcGx1cyBzb21lCisJICogYWRkaXRpb25hbCBiaXRzIChzZWUgUExYX0RNQTBfREVTQ1JJUFRPUl9SRUcpICovCisJdm9sYXRpbGUgdWludDMyX3QgbmV4dDsKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKiAgICAgICAgICAgIFJlZ2lzdGVyIE9mZnNldHMgYW5kIEJpdCBEZWZpbml0aW9ucworKioKKyoqIE5vdGU6IEFsbCBvZmZzZXRzIHplcm8gcmVsYXRpdmUuICBJRS4gU29tZSBzdGFuZGFyZCBiYXNlIGFkZHJlc3MKKyoqIG11c3QgYmUgYWRkZWQgdG8gdGhlIFJlZ2lzdGVyIE51bWJlciB0byBwcm9wZXJseSBhY2Nlc3MgdGhlIHJlZ2lzdGVyLgorKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgUExYX0xBUzBSTkdfUkVHICAgICAgICAgMHgwMDAwCS8qIEwsIExvY2FsIEFkZHIgU3BhY2UgMCBSYW5nZSBSZWdpc3RlciAqLworI2RlZmluZSBQTFhfTEFTMVJOR19SRUcgICAgICAgICAweDAwZjAJLyogTCwgTG9jYWwgQWRkciBTcGFjZSAxIFJhbmdlIFJlZ2lzdGVyICovCisjZGVmaW5lICBMUk5HX0lPICAgICAgICAgICAweDAwMDAwMDAxCS8qIE1hcCB0bzogMT1JL08sIDA9TWVtICovCisjZGVmaW5lICBMUk5HX0FOWTMyICAgICAgICAweDAwMDAwMDAwCS8qIExvY2F0ZSBhbnl3aGVyZSBpbiAzMiBiaXQgKi8KKyNkZWZpbmUgIExSTkdfTFQxTUIgICAgICAgIDB4MDAwMDAwMDIJLyogTG9jYXRlIGluIDFzdCBtZWcgKi8KKyNkZWZpbmUgIExSTkdfQU5ZNjQgICAgICAgIDB4MDAwMDAwMDQJLyogTG9jYXRlIGFueXdoZXJlIGluIDY0IGJpdCAqLworI2RlZmluZSAgTFJOR19NRU1fTUFTSyAgICAgMHhmZmZmZmZmMAkvLyBiaXRzIHRoYXQgc3BlY2lmeSByYW5nZSBmb3IgbWVtb3J5IGlvCisjZGVmaW5lICBMUk5HX0lPX01BU0sgICAgIDB4ZmZmZmZmZmEJLy8gYml0cyB0aGF0IHNwZWNpZnkgcmFuZ2UgZm9yIG5vcm1hbCBpbworCisjZGVmaW5lIFBMWF9MQVMwTUFQX1JFRyAgICAgICAgIDB4MDAwNAkvKiBMLCBMb2NhbCBBZGRyIFNwYWNlIDAgUmVtYXAgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUExYX0xBUzFNQVBfUkVHICAgICAgICAgMHgwMGY0CS8qIEwsIExvY2FsIEFkZHIgU3BhY2UgMSBSZW1hcCBSZWdpc3RlciAqLworI2RlZmluZSAgTE1BUF9FTiAgICAgICAgICAgMHgwMDAwMDAwMQkvKiBFbmFibGUgc2xhdmUgZGVjb2RlICovCisjZGVmaW5lICBMTUFQX01FTV9NQVNLICAgICAweGZmZmZmZmYwCS8vIGJpdHMgdGhhdCBzcGVjaWZ5IGRlY29kZSBmb3IgbWVtb3J5IGlvCisjZGVmaW5lICBMTUFQX0lPX01BU0sgICAgIDB4ZmZmZmZmZmEJLy8gYml0cyB0aGF0IHNwZWNpZnkgZGVjb2RlIGJpdHMgZm9yIG5vcm1hbCBpbworCisvKiBNb2RlL0FyYml0cmF0aW9uIFJlZ2lzdGVyLgorKi8KKyNkZWZpbmUgUExYX01BUkJfUkVHICAgICAgICAgMHg4CS8qIEwsIExvY2FsIEFyYml0cmF0aW9uIFJlZ2lzdGVyICovCisjZGVmaW5lIFBMWF9ETUFBUkJfUkVHICAgICAgMHhhYworZW51bSBtYXJiX2JpdHMgeworCU1BUkJfTExUX01BU0sgPSAweDAwMDAwMGZmLAkvKiBMb2NhbCBCdXMgTGF0ZW5jeSBUaW1lciAqLworCU1BUkJfTFBUX01BU0sgPSAweDAwMDBmZjAwLAkvKiBMb2NhbCBCdXMgUGF1c2UgVGltZXIgKi8KKwlNQVJCX0xURU4gPSAweDAwMDEwMDAwLAkvKiBMYXRlbmN5IFRpbWVyIEVuYWJsZSAqLworCU1BUkJfTFBFTiA9IDB4MDAwMjAwMDAsCS8qIFBhdXNlIFRpbWVyIEVuYWJsZSAqLworCU1BUkJfQlJFUSA9IDB4MDAwNDAwMDAsCS8qIExvY2FsIEJ1cyBCUkVRIEVuYWJsZSAqLworCU1BUkJfRE1BX1BSSU9SSVRZX01BU0sgPSAweDAwMTgwMDAwLAorCU1BUkJfTEJEU19HSVZFX1VQX0JVU19NT0RFID0gMHgwMDIwMDAwMCwJLyogbG9jYWwgYnVzIGRpcmVjdCBzbGF2ZSBnaXZlIHVwIGJ1cyBtb2RlICovCisJTUFSQl9EU19MTE9DS19FTkFCTEUgPSAweDAwNDAwMDAwLAkvKiBkaXJlY3Qgc2xhdmUgTExPQ0tvIyBlbmFibGUgKi8KKwlNQVJCX1BDSV9SRVFVRVNUX01PREUgPSAweDAwODAwMDAwLAorCU1BUkJfUENJdjIxX01PREUgPSAweDAxMDAwMDAwLAkvKiBwY2kgc3BlY2lmaWNhdGlvbiB2Mi4xIG1vZGUgKi8KKwlNQVJCX1BDSV9SRUFEX05PX1dSSVRFX01PREUgPSAweDAyMDAwMDAwLAorCU1BUkJfUENJX1JFQURfV0lUSF9XUklURV9GTFVTSF9NT0RFID0gMHgwNDAwMDAwMCwKKwlNQVJCX0dBVEVfVElNRVJfV0lUSF9CUkVRID0gMHgwODAwMDAwMCwJLyogZ2F0ZSBsb2NhbCBidXMgbGF0ZW5jeSB0aW1lciB3aXRoIEJSRVEgKi8KKwlNQVJCX1BDSV9SRUFEX05PX0ZMVVNIX01PREUgPSAweDEwMDAwMDAwLAorCU1BUkJfVVNFX1NVQlNZU1RFTV9JRFMgPSAweDIwMDAwMDAwLAorfTsKKworI2RlZmluZSBQTFhfQklHRU5EX1JFRyAweGMKK2VudW0gYmlnZW5kX2JpdHMgeworCUJJR0VORF9DT05GSUcgPSAweDEsCS8qIHVzZSBiaWcgZW5kaWFuIG9yZGVyaW5nIGZvciBjb25maWd1cmF0aW9uIHJlZ2lzdGVyIGFjY2Vzc2VzICovCisJQklHRU5EX0RJUkVDVF9NQVNURVIgPSAweDIsCisJQklHRU5EX0RJUkVDVF9TTEFWRV9MT0NBTDAgPSAweDQsCisJQklHRU5EX1JPTSA9IDB4OCwKKwlCSUdFTkRfQllURV9MQU5FID0gMHgxMCwJLyogdXNlIGJ5dGUgbGFuZSBjb25zaXN0aW5nIG9mIG1vc3Qgc2lnbmlmaWNhbnQgYml0cyBpbnN0ZWFkIG9mIGxlYXN0IHNpZ25pZmljYW50ICovCisJQklHRU5EX0RJUkVDVF9TTEFWRV9MT0NBTDEgPSAweDIwLAorCUJJR0VORF9ETUExID0gMHg0MCwKKwlCSUdFTkRfRE1BMCA9IDB4ODAsCit9OworCisvKiBOb3RlOiBUaGUgRXhwYW5zaW9uIFJPTSAgc3R1ZmYgaXMgb25seSByZWxldmFudCB0byB0aGUgUEMgZW52aXJvbm1lbnQuCisqKiAgICAgICBUaGlzIGV4cGFuc2lvbiBST00gY29kZSBpcyBleGVjdXRlZCBieSB0aGUgaG9zdCBDUFUgYXQgYm9vdCB0aW1lLgorKiogICAgICAgRm9yIHRoaXMgcmVhc29uIG5vIGJpdCBkZWZpbml0aW9ucyBhcmUgcHJvdmlkZWQgaGVyZS4KKyovCisjZGVmaW5lIFBMWF9ST01STkdfUkVHICAgICAgICAgMHgwMDEwCS8qIEwsIEV4cG4gUk9NIFNwYWNlIFJhbmdlIFJlZ2lzdGVyICovCisjZGVmaW5lIFBMWF9ST01NQVBfUkVHICAgICAgICAgMHgwMDE0CS8qIEwsIExvY2FsIEFkZHIgU3BhY2UgUmFuZ2UgUmVnaXN0ZXIgKi8KKworI2RlZmluZSBQTFhfUkVHSU9OMF9SRUcgICAgICAgICAweDAwMTgJLyogTCwgTG9jYWwgQnVzIFJlZ2lvbiAwIERlc2NyaXB0b3IgKi8KKyNkZWZpbmUgIFJHTl9XSURUSCAgICAgICAgIDB4MDAwMDAwMDIJLyogTG9jYWwgYnVzIHdpZHRoIGJpdHMgKi8KKyNkZWZpbmUgIFJHTl84QklUUyAgICAgICAgIDB4MDAwMDAwMDAJLyogMDggYml0IExvY2FsIEJ1cyAqLworI2RlZmluZSAgUkdOXzE2QklUUyAgICAgICAgMHgwMDAwMDAwMQkvKiAxNiBiaXQgTG9jYWwgQnVzICovCisjZGVmaW5lICBSR05fMzJCSVRTICAgICAgICAweDAwMDAwMDAyCS8qIDMyIGJpdCBMb2NhbCBCdXMgKi8KKyNkZWZpbmUgIFJHTl9NV1MgICAgICAgICAgIDB4MDAwMDAwM0MJLyogTWVtb3J5IEFjY2VzcyBXYWl0IFN0YXRlcyAqLworI2RlZmluZSAgUkdOXzBNV1MgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSAgUkdOXzFNV1MgICAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSAgUkdOXzJNV1MgICAgICAgICAgMHgwMDAwMDAwOAorI2RlZmluZSAgUkdOXzNNV1MgICAgICAgICAgMHgwMDAwMDAwQworI2RlZmluZSAgUkdOXzRNV1MgICAgICAgICAgMHgwMDAwMDAxMAorI2RlZmluZSAgUkdOXzZNV1MgICAgICAgICAgMHgwMDAwMDAxOAorI2RlZmluZSAgUkdOXzhNV1MgICAgICAgICAgMHgwMDAwMDAyMAorI2RlZmluZSAgUkdOX01SRSAgICAgICAgICAgMHgwMDAwMDA0MAkvKiBNZW1vcnkgU3BhY2UgUmVhZHkgSW5wdXQgRW5hYmxlICovCisjZGVmaW5lICBSR05fTUJFICAgICAgICAgICAweDAwMDAwMDgwCS8qIE1lbW9yeSBTcGFjZSBCdGVybSBJbnB1dCBFbmFibGUgKi8KKyNkZWZpbmUgIFJHTl9SRUFEX1BSRUZFVENIX0RJU0FCTEUgMHgwMDAwMDEwMAorI2RlZmluZSAgUkdOX1JPTV9QUkVGRVRDSF9ESVNBQkxFIDB4MDAwMDAyMDAKKyNkZWZpbmUgIFJHTl9SRUFEX1BSRUZFVENIX0NPVU5UX0VOQUJMRSAweDAwMDAwNDAwCisjZGVmaW5lICBSR05fUldTICAgICAgICAgICAweDAwM0MwMDAwCS8qIEV4cG4gUk9NIFdhaXQgU3RhdGVzICovCisjZGVmaW5lICBSR05fUlJFICAgICAgICAgICAweDAwNDAwMDAwCS8qIFJPTSBTcGFjZSBSZWFkeSBJbnB1dCBFbmFibGUgKi8KKyNkZWZpbmUgIFJHTl9SQkUgICAgICAgICAgIDB4MDA4MDAwMDAJLyogUk9NIFNwYWNlIEJ0ZXJtIElucHV0IEVuYWJsZSAqLworI2RlZmluZSAgUkdOX01CRU4gICAgICAgICAgMHgwMTAwMDAwMAkvKiBNZW1vcnkgU3BhY2UgQnVyc3QgRW5hYmxlICovCisjZGVmaW5lICBSR05fUkJFTiAgICAgICAgICAweDA0MDAwMDAwCS8qIFJPTSBTcGFjZSBCdXJzdCBFbmFibGUgKi8KKyNkZWZpbmUgIFJHTl9USFJPVCAgICAgICAgIDB4MDgwMDAwMDAJLyogRGUtYXNzZXJ0IFRSRFkgd2hlbiBGSUZPIGZ1bGwgKi8KKyNkZWZpbmUgIFJHTl9UUkQgICAgICAgICAgIDB4RjAwMDAwMDAJLyogVGFyZ2V0IFJlYWR5IERlbGF5IC84ICovCisKKyNkZWZpbmUgUExYX1JFR0lPTjFfUkVHICAgICAgICAgMHgwMGY4CS8qIEwsIExvY2FsIEJ1cyBSZWdpb24gMSBEZXNjcmlwdG9yICovCisKKyNkZWZpbmUgUExYX0RNUk5HX1JFRyAgICAgICAgICAweDAwMUMJLyogTCwgRGlyZWN0IE1hc3RlciBSYW5nZSBSZWdpc3RlciAqLworCisjZGVmaW5lIFBMWF9MQkFQTUVNX1JFRyAgICAgICAgMHgwMDIwCS8qIEwsIExjbCBCYXNlIEFkZHIgZm9yIFBDSSBtZW0gc3BhY2UgKi8KKworI2RlZmluZSBQTFhfTEJBUElPX1JFRyAgICAgICAgIDB4MDAyNAkvKiBMLCBMY2wgQmFzZSBBZGRyIGZvciBQQ0kgSS9PIHNwYWNlICovCisKKyNkZWZpbmUgUExYX0RNTUFQX1JFRyAgICAgICAgICAweDAwMjgJLyogTCwgRGlyZWN0IE1hc3RlciBSZW1hcCBSZWdpc3RlciAqLworI2RlZmluZSAgRE1NX01BRSAgICAgICAgICAgMHgwMDAwMDAwMQkvKiBEaXJlY3QgTXN0ciBNZW1vcnkgQWNjIEVuYWJsZSAqLworI2RlZmluZSAgRE1NX0lBRSAgICAgICAgICAgMHgwMDAwMDAwMgkvKiBEaXJlY3QgTXN0ciBJL08gQWNjIEVuYWJsZSAqLworI2RlZmluZSAgRE1NX0xDSyAgICAgICAgICAgMHgwMDAwMDAwNAkvKiBMT0NLIElucHV0IEVuYWJsZSAqLworI2RlZmluZSAgRE1NX1BGNCAgICAgICAgICAgMHgwMDAwMDAwOAkvKiBQcmVmZXRjaCA0IE1vZGUgRW5hYmxlICovCisjZGVmaW5lICBETU1fVEhST1QgICAgICAgICAweDAwMDAwMDEwCS8qIEFzc2VydCBJUkRZIHdoZW4gcmVhZCBGSUZPIGZ1bGwgKi8KKyNkZWZpbmUgIERNTV9QQUYwICAgICAgICAgIDB4MDAwMDAwMDAJLyogUHJvZ3JhbW1hYmxlIEFsbW9zdCBmaWxsIGxldmVsICovCisjZGVmaW5lICBETU1fUEFGMSAgICAgICAgICAweDAwMDAwMDIwCS8qIFByb2dyYW1tYWJsZSBBbG1vc3QgZmlsbCBsZXZlbCAqLworI2RlZmluZSAgRE1NX1BBRjIgICAgICAgICAgMHgwMDAwMDA0MAkvKiBQcm9ncmFtbWFibGUgQWxtb3N0IGZpbGwgbGV2ZWwgKi8KKyNkZWZpbmUgIERNTV9QQUYzICAgICAgICAgIDB4MDAwMDAwNjAJLyogUHJvZ3JhbW1hYmxlIEFsbW9zdCBmaWxsIGxldmVsICovCisjZGVmaW5lICBETU1fUEFGNCAgICAgICAgICAweDAwMDAwMDgwCS8qIFByb2dyYW1tYWJsZSBBbG1vc3QgZmlsbCBsZXZlbCAqLworI2RlZmluZSAgRE1NX1BBRjUgICAgICAgICAgMHgwMDAwMDBBMAkvKiBQcm9ncmFtbWFibGUgQWxtb3N0IGZpbGwgbGV2ZWwgKi8KKyNkZWZpbmUgIERNTV9QQUY2ICAgICAgICAgIDB4MDAwMDAwQzAJLyogUHJvZ3JhbW1hYmxlIEFsbW9zdCBmaWxsIGxldmVsICovCisjZGVmaW5lICBETU1fUEFGNyAgICAgICAgICAweDAwMDAwMEQwCS8qIFByb2dyYW1tYWJsZSBBbG1vc3QgZmlsbCBsZXZlbCAqLworI2RlZmluZSAgRE1NX01BUCAgICAgICAgICAgMHhGRkZGMDAwMAkvKiBSZW1hcCBBZGRyZXNzIEJpdHMgKi8KKworI2RlZmluZSBQTFhfQ0FSX1JFRyAgICAgICAgICAgIDB4MDAyQwkvKiBMLCBDb25maWd1cmF0aW9uIEFkZHJlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgIENBUl9DVDAgICAgICAgICAgIDB4MDAwMDAwMDAJLyogQ29uZmlnIFR5cGUgMCAqLworI2RlZmluZSAgQ0FSX0NUMSAgICAgICAgICAgMHgwMDAwMDAwMQkvKiBDb25maWcgVHlwZSAxICovCisjZGVmaW5lICBDQVJfUkVHICAgICAgICAgICAweDAwMDAwMEZDCS8qIFJlZ2lzdGVyIE51bWJlciBCaXRzICovCisjZGVmaW5lICBDQVJfRlVOICAgICAgICAgICAweDAwMDAwNzAwCS8qIEZ1bmN0aW9uIE51bWJlciBCaXRzICovCisjZGVmaW5lICBDQVJfREVWICAgICAgICAgICAweDAwMDBGODAwCS8qIERldmljZSBOdW1iZXIgQml0cyAqLworI2RlZmluZSAgQ0FSX0JVUyAgICAgICAgICAgMHgwMEZGMDAwMAkvKiBCdXMgTnVtYmVyIEJpdHMgKi8KKyNkZWZpbmUgIENBUl9DRkcgICAgICAgICAgIDB4ODAwMDAwMDAJLyogQ29uZmlnIFNwYyBBY2Nlc3MgRW5hYmxlICovCisKKyNkZWZpbmUgUExYX0RCUl9JTl9SRUcgICAgICAgICAweDAwNjAJLyogTCwgUENJIHRvIExvY2FsIERvb3JiZWxsIFJlZ2lzdGVyICovCisKKyNkZWZpbmUgUExYX0RCUl9PVVRfUkVHICAgICAgICAweDAwNjQJLyogTCwgTG9jYWwgdG8gUENJIERvb3JiZWxsIFJlZ2lzdGVyICovCisKKyNkZWZpbmUgUExYX0lOVFJDU19SRUcgICAgICAgICAweDAwNjgJLyogTCwgSW50ZXJydXB0IENvbnRyb2wvU3RhdHVzIFJlZyAqLworI2RlZmluZSAgSUNTX0FFUlIgICAgICAgICAgMHgwMDAwMDAwMQkvKiBBc3NlcnQgTFNFUlIgb24gQUJPUlQgKi8KKyNkZWZpbmUgIElDU19QRVJSICAgICAgICAgIDB4MDAwMDAwMDIJLyogQXNzZXJ0IExTRVJSIG9uIFBhcml0eSBFcnJvciAqLworI2RlZmluZSAgSUNTX1NFUlIgICAgICAgICAgMHgwMDAwMDAwNAkvKiBHZW5lcmF0ZSBQQ0kgU0VSUiMgKi8KKyNkZWZpbmUgIElDU19NQklFICAgICAgICAgIDB4MDAwMDAwMDgJLy8gbWFpbGJveCBpbnRlcnJ1cHQgZW5hYmxlCisjZGVmaW5lICBJQ1NfUElFICAgICAgICAgICAweDAwMDAwMTAwCS8qIFBDSSBJbnRlcnJ1cHQgRW5hYmxlICovCisjZGVmaW5lICBJQ1NfUERJRSAgICAgICAgICAweDAwMDAwMjAwCS8qIFBDSSBEb29yYmVsbCBJbnRlcnJ1cHQgRW5hYmxlICovCisjZGVmaW5lICBJQ1NfUEFJRSAgICAgICAgICAweDAwMDAwNDAwCS8qIFBDSSBBYm9ydCBJbnRlcnJ1cHQgRW5hYmxlICovCisjZGVmaW5lICBJQ1NfUExJRSAgICAgICAgICAweDAwMDAwODAwCS8qIFBDSSBMb2NhbCBJbnQgRW5hYmxlICovCisjZGVmaW5lICBJQ1NfUkFFICAgICAgICAgICAweDAwMDAxMDAwCS8qIFJldHJ5IEFib3J0IEVuYWJsZSAqLworI2RlZmluZSAgSUNTX1BESUEgICAgICAgICAgMHgwMDAwMjAwMAkvKiBQQ0kgRG9vcmJlbGwgSW50ZXJydXB0IEFjdGl2ZSAqLworI2RlZmluZSAgSUNTX1BBSUEgICAgICAgICAgMHgwMDAwNDAwMAkvKiBQQ0kgQWJvcnQgSW50ZXJydXB0IEFjdGl2ZSAqLworI2RlZmluZSAgSUNTX0xJQSAgICAgICAgICAgMHgwMDAwODAwMAkvKiBMb2NhbCBJbnRlcnJ1cHQgQWN0aXZlICovCisjZGVmaW5lICBJQ1NfTElFICAgICAgICAgICAweDAwMDEwMDAwCS8qIExvY2FsIEludGVycnVwdCBFbmFibGUgKi8KKyNkZWZpbmUgIElDU19MRElFICAgICAgICAgIDB4MDAwMjAwMDAJLyogTG9jYWwgRG9vcmJlbGwgSW50IEVuYWJsZSAqLworI2RlZmluZSAgSUNTX0RNQTBfRSAgICAgICAgMHgwMDA0MDAwMAkvKiBETUEgIzAgSW50ZXJydXB0IEVuYWJsZSAqLworI2RlZmluZSAgSUNTX0RNQTFfRSAgICAgICAgMHgwMDA4MDAwMAkvKiBETUEgIzEgSW50ZXJydXB0IEVuYWJsZSAqLworI2RlZmluZSAgSUNTX0xESUEgICAgICAgICAgMHgwMDEwMDAwMAkvKiBMb2NhbCBEb29yYmVsbCBJbnQgQWN0aXZlICovCisjZGVmaW5lICBJQ1NfRE1BMF9BICAgICAgICAweDAwMjAwMDAwCS8qIERNQSAjMCBJbnRlcnJ1cHQgQWN0aXZlICovCisjZGVmaW5lICBJQ1NfRE1BMV9BICAgICAgICAweDAwNDAwMDAwCS8qIERNQSAjMSBJbnRlcnJ1cHQgQWN0aXZlICovCisjZGVmaW5lICBJQ1NfQklBICAgICAgICAgICAweDAwODAwMDAwCS8qIEJJU1QgSW50ZXJydXB0IEFjdGl2ZSAqLworI2RlZmluZSAgSUNTX1RBX0RNICAgICAgICAgMHgwMTAwMDAwMAkvKiBUYXJnZXQgQWJvcnQgLSBEaXJlY3QgTWFzdGVyICovCisjZGVmaW5lICBJQ1NfVEFfRE1BMCAgICAgICAweDAyMDAwMDAwCS8qIFRhcmdldCBBYm9ydCAtIERNQSAjMCAqLworI2RlZmluZSAgSUNTX1RBX0RNQTEgICAgICAgMHgwNDAwMDAwMAkvKiBUYXJnZXQgQWJvcnQgLSBETUEgIzEgKi8KKyNkZWZpbmUgIElDU19UQV9SQSAgICAgICAgIDB4MDgwMDAwMDAJLyogVGFyZ2V0IEFib3J0IC0gUmV0cnkgVGltZW91dCAqLworI2RlZmluZSAgSUNTX01CSUEoeCkgICAgICAgKDB4MTAwMDAwMDAgPDwgKCh4KSAmIDB4MykpCS8vIG1haWxib3ggeCBpcyBhY3RpdmUKKworI2RlZmluZSBQTFhfQ09OVFJPTF9SRUcgICAgICAgIDB4MDA2QwkvKiBMLCBFRVBST00gQ250bCAmIFBDSSBDbWQgQ29kZXMgKi8KKyNkZWZpbmUgIENUTF9SRE1BICAgICAgICAgIDB4MDAwMDAwMEUJLyogRE1BIFJlYWQgQ29tbWFuZCAqLworI2RlZmluZSAgQ1RMX1dETUEgICAgICAgICAgMHgwMDAwMDA3MAkvKiBETUEgV3JpdGUgQ29tbWFuZCAqLworI2RlZmluZSAgQ1RMX1JNRU0gICAgICAgICAgMHgwMDAwMDYwMAkvKiBNZW1vcnkgUmVhZCBDb21tYW5kICovCisjZGVmaW5lICBDVExfV01FTSAgICAgICAgICAweDAwMDA3MDAwCS8qIE1lbW9yeSBXcml0ZSBDb21tYW5kICovCisjZGVmaW5lICBDVExfVVNFUk8gICAgICAgICAweDAwMDEwMDAwCS8qIFVTRVJPIG91dHB1dCBwaW4gY29udHJvbCBiaXQgKi8KKyNkZWZpbmUgIENUTF9VU0VSSSAgICAgICAgIDB4MDAwMjAwMDAJLyogVVNFUkkgaW5wdXQgcGluIGJpdCAqLworI2RlZmluZSAgQ1RMX0VFX0NMSyAgICAgICAgMHgwMTAwMDAwMAkvKiBFRVBST00gQ2xvY2sgbGluZSAqLworI2RlZmluZSAgQ1RMX0VFX0NTICAgICAgICAgMHgwMjAwMDAwMAkvKiBFRVBST00gQ2hpcCBTZWxlY3QgKi8KKyNkZWZpbmUgIENUTF9FRV9XICAgICAgICAgIDB4MDQwMDAwMDAJLyogRUVQUk9NIFdyaXRlIGJpdCAqLworI2RlZmluZSAgQ1RMX0VFX1IgICAgICAgICAgMHgwODAwMDAwMAkvKiBFRVBST00gUmVhZCBiaXQgKi8KKyNkZWZpbmUgIENUTF9FRUNISyAgICAgICAgIDB4MTAwMDAwMDAJLyogRUVQUk9NIFByZXNlbnQgYml0ICovCisjZGVmaW5lICBDVExfRUVSTEQgICAgICAgICAweDIwMDAwMDAwCS8qIEVFUFJPTSBSZWxvYWQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgIENUTF9SRVNFVCAgICAgICAgIDB4NDAwMDAwMDAJLyogISEgQWRhcHRlciBSZXNldCAhISAqLworI2RlZmluZSAgQ1RMX1JFQURZICAgICAgICAgMHg4MDAwMDAwMAkvKiBMb2NhbCBJbml0IERvbmUgKi8KKworI2RlZmluZSBQTFhfSURfUkVHCTB4NzAJLy8gaGFyZC1jb2RlZCBwbHggdmVuZG9yIGFuZCBkZXZpY2UgaWRzCisKKyNkZWZpbmUgUExYX1JFVklTSU9OX1JFRwkweDc0CS8vIHNpbGljb24gcmV2aXNpb24KKworI2RlZmluZSBQTFhfRE1BMF9NT0RFX1JFRwkweDgwCS8vIGRtYSBjaGFubmVsIDAgbW9kZSByZWdpc3RlcgorI2RlZmluZSBQTFhfRE1BMV9NT0RFX1JFRwkweDk0CS8vIGRtYSBjaGFubmVsIDAgbW9kZSByZWdpc3RlcgorI2RlZmluZSAgUExYX0xPQ0FMX0JVU18xNl9XSURFX0JJVFMJMHgxCisjZGVmaW5lICBQTFhfTE9DQUxfQlVTXzMyX1dJREVfQklUUwkweDMKKyNkZWZpbmUgIFBMWF9MT0NBTF9CVVNfV0lEVEhfTUFTSwkweDMKKyNkZWZpbmUgIFBMWF9ETUFfRU5fUkVBRFlJTl9CSVQJMHg0MAkvLyBlbmFibGUgcmVhZHkgaW4gaW5wdXQKKyNkZWZpbmUgIFBMWF9FTl9CVEVSTV9CSVQJMHg4MAkvLyBlbmFibGUgQlRFUk0jIGlucHV0CisjZGVmaW5lICBQTFhfRE1BX0xPQ0FMX0JVUlNUX0VOX0JJVAkweDEwMAkvLyBlbmFibGUgbG9jYWwgYnVyc3QgbW9kZQorI2RlZmluZSAgUExYX0VOX0NIQUlOX0JJVAkweDIwMAkvLyBlbmFibGVzIGNoYWluaW5nCisjZGVmaW5lICBQTFhfRU5fRE1BX0RPTkVfSU5UUl9CSVQJMHg0MDAJLy8gZW5hYmxlcyBpbnRlcnJ1cHQgb24gZG1hIGRvbmUKKyNkZWZpbmUgIFBMWF9MT0NBTF9BRERSX0NPTlNUX0JJVAkweDgwMAkvLyBob2xkIGxvY2FsIGFkZHJlc3MgY29uc3RhbnQgKGRvbid0IGluY3JlbWVudCkKKyNkZWZpbmUgIFBMWF9ERU1BTkRfTU9ERV9CSVQJMHgxMDAwCS8vIGVuYWJsZXMgZGVtYW5kLW1vZGUgZm9yIGRtYSB0cmFuc2ZlcgorI2RlZmluZSAgUExYX0VPVF9FTkFCTEVfQklUCTB4NDAwMAorI2RlZmluZSAgUExYX1NUT1BfTU9ERV9CSVQgMHg4MDAwCisjZGVmaW5lICBQTFhfRE1BX0lOVFJfUENJX0JJVAkweDIwMDAwCS8vIHJvdXRlcyBkbWEgaW50ZXJydXB0IHRvIHBjaSBidXMgKGluc3RlYWQgb2YgbG9jYWwgYnVzKQorCisjZGVmaW5lIFBMWF9ETUEwX1BDSV9BRERSRVNTX1JFRwkweDg0CS8vIHBjaSBhZGRyZXNzIHRoYXQgZG1hIHRyYW5zZmVycyBzdGFydCBhdAorI2RlZmluZSBQTFhfRE1BMV9QQ0lfQUREUkVTU19SRUcJMHg5OAorCisjZGVmaW5lIFBMWF9ETUEwX0xPQ0FMX0FERFJFU1NfUkVHCTB4ODgJLy8gbG9jYWwgYWRkcmVzcyB0aGF0IGRtYSB0cmFuc2ZlcnMgc3RhcnQgYXQKKyNkZWZpbmUgUExYX0RNQTFfTE9DQUxfQUREUkVTU19SRUcJMHg5YworCisjZGVmaW5lIFBMWF9ETUEwX1RSQU5TRkVSX1NJWkVfUkVHCTB4OGMJLy8gbnVtYmVyIG9mIGJ5dGVzIHRvIHRyYW5zZmVyIChmaXJzdCAyMyBiaXRzKQorI2RlZmluZSBQTFhfRE1BMV9UUkFOU0ZFUl9TSVpFX1JFRwkweGEwCisKKyNkZWZpbmUgUExYX0RNQTBfREVTQ1JJUFRPUl9SRUcJMHg5MAkvLyBkZXNjcmlwdG9yIHBvaW50ZXIgcmVnaXN0ZXIKKyNkZWZpbmUgUExYX0RNQTFfREVTQ1JJUFRPUl9SRUcJMHhhNAorI2RlZmluZSAgUExYX0RFU0NfSU5fUENJX0JJVAkweDEJLy8gZGVzY3JpcHRvciBpcyBsb2NhdGVkIGluIHBjaSBzcGFjZSAobm90IGxvY2FsIHNwYWNlKQorI2RlZmluZSAgUExYX0VORF9PRl9DSEFJTl9CSVQJMHgyCS8vIGVuZCBvZiBjaGFpbiBiaXQKKyNkZWZpbmUgIFBMWF9JTlRSX1RFUk1fQ09VTlQJMHg0CS8vIGludGVycnVwdCB3aGVuIHRoaXMgZGVzY3JpcHRvcidzIHRyYW5zZmVyIGlzIGZpbmlzaGVkCisjZGVmaW5lICBQTFhfWEZFUl9MT0NBTF9UT19QQ0kgMHg4CS8vIHRyYW5zZmVyIGZyb20gbG9jYWwgdG8gcGNpIGJ1cyAobm90IHBjaSB0byBsb2NhbCkKKworI2RlZmluZSBQTFhfRE1BMF9DU19SRUcJMHhhOAkvLyBjb21tYW5kIHN0YXR1cyByZWdpc3RlcgorI2RlZmluZSBQTFhfRE1BMV9DU19SRUcJMHhhOQorI2RlZmluZSAgUExYX0RNQV9FTl9CSVQJMHgxCS8vIGVuYWJsZSBkbWEgY2hhbm5lbAorI2RlZmluZSAgUExYX0RNQV9TVEFSVF9CSVQJMHgyCS8vIHN0YXJ0IGRtYSB0cmFuc2ZlcgorI2RlZmluZSAgUExYX0RNQV9BQk9SVF9CSVQJMHg0CS8vIGFib3J0IGRtYSB0cmFuc2ZlcgorI2RlZmluZSAgUExYX0NMRUFSX0RNQV9JTlRSX0JJVAkweDgJLy8gY2xlYXIgZG1hIGludGVycnVwdAorI2RlZmluZSAgUExYX0RNQV9ET05FX0JJVAkweDEwCS8vIHRyYW5zZmVyIGRvbmUgc3RhdHVzIGJpdAorCisjZGVmaW5lIFBMWF9ETUEwX1RIUkVTSE9MRF9SRUcJMHhiMAkvLyBjb21tYW5kIHN0YXR1cyByZWdpc3RlcgorCisvKgorICogQWNjZXNzZXMgbmVhciB0aGUgZW5kIG9mIG1lbW9yeSBjYW4gY2F1c2UgdGhlIFBMWCBjaGlwCisgKiB0byBwcmUtZmV0Y2ggZGF0YSBvZmYgb2YgZW5kLW9mLXJhbS4gIExpbWl0IHRoZSBzaXplIG9mCisgKiBtZW1vcnkgc28gaG9zdC1zaWRlIGFjY2Vzc2VzIGNhbm5vdCBvY2N1ci4KKyAqLworCisjZGVmaW5lIFBMWF9QUkVGRVRDSCAgIDMyCisKKy8qCisgKiBUaGUgUENJIEludGVyZmFjZSwgdmlhIHRoZSBQQ0ktOTA2MCBDaGlwLCBoYXMgdXAgdG8gZWlnaHQgKDgpIE1haWxib3gKKyAqIFJlZ2lzdGVycy4gIFRoZSBQVVRTIChQb3dlci1VcCBUZXN0IFN1aXRlKSBoYW5kbGVzIHRoZSBib2FyZC1zaWRlCisgKiBpbnRlcmZhY2UvaW50ZXJhY3Rpb24gdXNpbmcgdGhlIGZpcnN0IDQgcmVnaXN0ZXJzLiAgU3BlY2lmaWNhdGlvbnMgZm9yCisgKiB0aGUgdXNlIG9mIHRoZSBmdWxsIFBVVFMnIGNvbW1hbmQgYW5kIHN0YXR1cyBpbnRlcmZhY2UgaXMgY29udGFpbmVkCisgKiB3aXRoaW4gYSBzZXBhcmF0ZSBTQkUgUFVUUyBNYW51YWwuICBUaGUgSG9zdC1TaWRlIERldmljZSBEcml2ZXIgb25seQorICogdXNlcyBhIHN1YnNldCBvZiB0aGUgZnVsbCBQVVRTIGludGVyZmFjZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqICAgIE1BSUxCT1ggIygtMSkgLSBNRU0gQUNDRVNTIFNUUyAqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgTUJYX1NUU19WQUxJRCAgICAgIDB4NTc1ODQ3NDQJLyogJ1dYR0QnICovCisjZGVmaW5lIE1CWF9TVFNfRElMQVYgICAgICAweDQ0NDc1ODU3CS8qIHN3YXBwZWQgPSAnREdYVycgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKiAgICBNQUlMQk9YICMwICAtICBQVVRTIFNUQVRVUyAgICAgKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIE1CWF9TVFNfTUFTSyAgICAgICAweDAwMDAwMGZmCS8qIFBVVFMgU3RhdHVzIFJlZ2lzdGVyIGJpdHMgKi8KKyNkZWZpbmUgTUJYX1NUU19UTUFTSyAgICAgIDB4MDAwMDAwMGYJLyogcmVnaXN0ZXIgYml0cyBmb3IgVEVTVCBudW1iZXIgKi8KKworI2RlZmluZSBNQlhfU1RTX1BDSVJFU0VUICAgMHgwMDAwMDEwMAkvKiBIb3N0IGlzc3VlZCBQQ0kgcmVzZXQgcmVxdWVzdCAqLworI2RlZmluZSBNQlhfU1RTX0JVU1kgICAgICAgMHgwMDAwMDA4MAkvKiBQVVRTIGlzIGluIHByb2dyZXNzICovCisjZGVmaW5lIE1CWF9TVFNfRVJST1IgICAgICAweDAwMDAwMDQwCS8qIFBVVFMgaGFzIGZhaWxlZCAqLworI2RlZmluZSBNQlhfU1RTX1JFU0VSVkVEICAgMHgwMDAwMDBjMAkvKiBVbmRlZmluZWQgLT4gc3RhdHVzIGluIHRyYW5zaXRpb24uCisJCQkJCSAgIFdlIGFyZSBpbiBwcm9jZXNzIG9mIGNoYW5naW5nCisJCQkJCSAgIGJpdHM7IHdlIFNFVCBFcnJvciBiaXQgYmVmb3JlCisJCQkJCSAgIFJFU0VUIG9mIEJ1c3kgYml0ICovCisKKyNkZWZpbmUgTUJYX1JFU0VSVkVEXzUgICAgIDB4MDAwMDAwMjAJLyogRllJOiByZXNlcnZlZC91bnVzZWQgYml0ICovCisjZGVmaW5lIE1CWF9SRVNFUlZFRF80ICAgICAweDAwMDAwMDEwCS8qIEZZSTogcmVzZXJ2ZWQvdW51c2VkIGJpdCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKiAgICBNQUlMQk9YICMxICAtICBQVVRTIENPTU1BTkRTICAgICoqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBBbnkgYXR0ZW1wdCB0byBleGVjdXRlIGFuIHVuaW1wbGVtZW50IGNvbW1hbmQgcmVzdWx0cyBpbiB0aGUgUFVUUworICogaW50ZXJmYWNlIGV4ZWN1dGluZyBhIE5PT1AgYW5kIGNvbnRpbnVpbmcgYXMgaWYgdGhlIG9mZmVuZGluZyBjb21tYW5kCisgKiBjb21wbGV0ZWQgbm9ybWFsbHkuICBOb3RlOiB0aGlzIHN1cHBsaWVzIGEgc2ltcGxlIG1ldGhvZCB0byBpbnRlcnJvZ2F0ZQorICogbWFpbGJveCBjb21tYW5kIHByb2Nlc3NpbmcgZnVuY3Rpb25hbGl0eS4KKyAqLworCisjZGVmaW5lIE1CWF9DTURfTUFTSyAgICAgICAweGZmZmYwMDAwCS8qIFBVVFMgQ29tbWFuZCBSZWdpc3RlciBiaXRzICovCisKKyNkZWZpbmUgTUJYX0NNRF9BQk9SVEogICAgIDB4ODUwMDAwMDAJLyogYWJvcnQgYW5kIGp1bXAgKi8KKyNkZWZpbmUgTUJYX0NNRF9SRVNFVFAgICAgIDB4ODYwMDAwMDAJLyogcmVzZXQgYW5kIHBhdXNlIGF0IHN0YXJ0ICovCisjZGVmaW5lIE1CWF9DTURfUEFVU0UgICAgICAweDg3MDAwMDAwCS8qIHBhdXNlIGltbWVkaWF0ZWx5ICovCisjZGVmaW5lIE1CWF9DTURfUEFVU0VDICAgICAweDg4MDAwMDAwCS8qIHBhdXNlIG9uIGNvbXBsZXRpb24gKi8KKyNkZWZpbmUgTUJYX0NNRF9SRVNVTUUgICAgIDB4ODkwMDAwMDAJLyogcmVzdW1lIG9wZXJhdGlvbiAqLworI2RlZmluZSBNQlhfQ01EX1NURVAgICAgICAgMHg4YTAwMDAwMAkvKiBzaW5nbGUgc3RlcCB0ZXN0cyAqLworCisjZGVmaW5lIE1CWF9DTURfQlNXQVAgICAgICAweDhjMDAwMDAwCS8qIGlkZW50aWZ5IGJ5dGUgc3dhcCBzY2hlbWUgKi8KKyNkZWZpbmUgTUJYX0NNRF9CU1dBUF8wICAgIDB4OGMwMDAwMDAJLyogdXNlIHNjaGVtZSAwICovCisjZGVmaW5lIE1CWF9DTURfQlNXQVBfMSAgICAweDhjMDAwMDAxCS8qIHVzZSBzY2hlbWUgMSAqLworCisjZGVmaW5lIE1CWF9DTURfU0VUSE1TICAgICAweDhkMDAwMDAwCS8qIHNldHVwIGhvc3QgbWVtb3J5IGFjY2VzcyB3aW5kb3cKKwkJCQkJICAgc2l6ZSAqLworI2RlZmluZSBNQlhfQ01EX1NFVEhCQSAgICAgMHg4ZTAwMDAwMAkvKiBzZXR1cCBob3N0IG1lbW9yeSBhY2Nlc3MgYmFzZQorCQkJCQkgICBhZGRyZXNzICovCisjZGVmaW5lIE1CWF9DTURfTUdPICAgICAgICAweDhmMDAwMDAwCS8qIHBlcmZvcm0gbWVtb3J5IHNldHVwIGFuZCBjb250aW51ZQorCQkJCQkgICAoSUUuIERvbmUpICovCisjZGVmaW5lIE1CWF9DTURfTk9PUCAgICAgICAweEZGMDAwMDAwCS8qIGR1bW15LCBpbGxlZ2FsIGNvbW1hbmQgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKiAgICBNQUlMQk9YICMyICAtICBNRU1PUlkgU0laRSAgICAgKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIE1CWF9NRU1TWl9NQVNLICAgICAweGZmZmYwMDAwCS8qIFBVVFMgTWVtb3J5IFNpemUgUmVnaXN0ZXIgYml0cyAqLworCisjZGVmaW5lIE1CWF9NRU1TWl8xMjhLQiAgICAweDAwMDIwMDAwCS8qIDEyOCBraWxvYnl0ZSBib2FyZCAqLworI2RlZmluZSBNQlhfTUVNU1pfMjU2S0IgICAgMHgwMDA0MDAwMAkvKiAyNTYga2lsb2J5dGUgYm9hcmQgKi8KKyNkZWZpbmUgTUJYX01FTVNaXzUxMktCICAgIDB4MDAwODAwMDAJLyogNTEyIGtpbG9ieXRlIGJvYXJkICovCisjZGVmaW5lIE1CWF9NRU1TWl8xTUIgICAgICAweDAwMTAwMDAwCS8qIDEgbWVnYWJ5dGUgYm9hcmQgKi8KKyNkZWZpbmUgTUJYX01FTVNaXzJNQiAgICAgIDB4MDAyMDAwMDAJLyogMiBtZWdhYnl0ZSBib2FyZCAqLworI2RlZmluZSBNQlhfTUVNU1pfNE1CICAgICAgMHgwMDQwMDAwMAkvKiA0IG1lZ2FieXRlIGJvYXJkICovCisjZGVmaW5lIE1CWF9NRU1TWl84TUIgICAgICAweDAwODAwMDAwCS8qIDggbWVnYWJ5dGUgYm9hcmQgKi8KKyNkZWZpbmUgTUJYX01FTVNaXzE2TUIgICAgIDB4MDEwMDAwMDAJLyogMTYgbWVnYWJ5dGUgYm9hcmQgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKiogICAgTUFJTEJPWCAjMiAgLSAgQk9BUkQgVFlQRSAgICAqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIE1CWF9CVFlQRV9NQVNLICAgICAgICAgIDB4MDAwMGZmZmYJLyogUFVUUyBCb2FyZCBUeXBlIFJlZ2lzdGVyICovCisjZGVmaW5lIE1CWF9CVFlQRV9GQU1JTFlfTUFTSyAgIDB4MDAwMGZmMDAJLyogUFVUUyBCb2FyZCBGYW1pbHkgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgTUJYX0JUWVBFX1NVQlRZUEVfTUFTSyAgMHgwMDAwMDBmZgkvKiBQVVRTIEJvYXJkIFN1YnR5cGUgKi8KKworI2RlZmluZSBNQlhfQlRZUEVfUExYOTA2MCAgICAgICAweDAwMDAwMTAwCS8qIFBMWCBmYW1pbHkgdHlwZSAqLworI2RlZmluZSBNQlhfQlRZUEVfUExYOTA4MCAgICAgICAweDAwMDAwMzAwCS8qIFBMWCB3YW5YTDEwMHMgZmFtaWx5IHR5cGUgKi8KKworI2RlZmluZSBNQlhfQlRZUEVfV0FOWExfNCAgICAgICAweDAwMDAwMTA0CS8qIHdhblhMNDAwLCA0LXBvcnQgKi8KKyNkZWZpbmUgTUJYX0JUWVBFX1dBTlhMXzIgICAgICAgMHgwMDAwMDEwMgkvKiB3YW5YTDIwMCwgMi1wb3J0ICovCisjZGVmaW5lIE1CWF9CVFlQRV9XQU5YTF8xcyAgICAgIDB4MDAwMDAzMDEJLyogd2FuWEwxMDBzLCAxLXBvcnQgKi8KKyNkZWZpbmUgTUJYX0JUWVBFX1dBTlhMXzF0ICAgICAgMHgwMDAwMDQwMQkvKiB3YW5YTDEwMFQxLCAxLXBvcnQgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKiAgICBNQUlMQk9YICMzICAtICBTSE1RIE1BSUxCT1ggICAgKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIE1CWF9TTUJYX01BU0sgICAgICAgICAgIDB4MDAwMDAwZmYJLyogUFVUUyBTSE1RIE1haWxib3ggYml0cyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKiAgICBHRU5FUklDIEhPU1QtU0lERSBEUklWRVIgICAgICoqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgTUJYX0VSUiAgICAwCisjZGVmaW5lIE1CWF9PSyAgICAgMQorCisvKiBtYWlsYm94IGNoZWNrIHJvdXRpbmUgLSB0eXBlIG9mIHRlc3RpbmcgKi8KKyNkZWZpbmUgTUJYQ0hLX1NUUyAgICAgIDB4MDAJLyogY2hlY2sgZm9yIFBVVFMgc3RhdHVzICovCisjZGVmaW5lIE1CWENIS19OT1dBSVQgICAweDAxCS8qIGRvbnQgY2FyZSBhYm91dCBQVVRTIHN0YXR1cyAqLworCisvKiBzeXN0ZW0gYWxsb2NhdGVzIHRoaXMgbWFueSBieXRlcyBmb3IgYWRkcmVzcyBtYXBwaW5nIG1haWxib3ggc3BhY2UgKi8KKyNkZWZpbmUgTUJYX0FERFJfU1BBQ0VfMzYwIDB4ODAJLyogd2FuWEwxMDBzLzIwMC80MDAgKi8KKyNkZWZpbmUgTUJYX0FERFJfTUFTS18zNjAgKE1CWF9BRERSX1NQQUNFXzM2MC0xKQorCitzdGF0aWMgaW5saW5lIGludCBwbHg5MDgwX2Fib3J0X2RtYSh2b2lkICppb2Jhc2UsIHVuc2lnbmVkIGludCBjaGFubmVsKQoreworCXZvaWQgKmRtYV9jc19hZGRyOworCXVpbnQ4X3QgZG1hX3N0YXR1czsKKwljb25zdCBpbnQgdGltZW91dCA9IDEwMDAwOworCXVuc2lnbmVkIGludCBpOworCisJaWYgKGNoYW5uZWwpCisJCWRtYV9jc19hZGRyID0gaW9iYXNlICsgUExYX0RNQTFfQ1NfUkVHOworCWVsc2UKKwkJZG1hX2NzX2FkZHIgPSBpb2Jhc2UgKyBQTFhfRE1BMF9DU19SRUc7CisKKwkvLyBhYm9ydCBkbWEgdHJhbnNmZXIgaWYgbmVjZXNzYXJ5CisJZG1hX3N0YXR1cyA9IHJlYWRiKGRtYV9jc19hZGRyKTsKKwlpZiAoKGRtYV9zdGF0dXMgJiBQTFhfRE1BX0VOX0JJVCkgPT0gMCkgeworCQlyZXR1cm4gMDsKKwl9CisJLy8gd2FpdCB0byBtYWtlIHN1cmUgZG9uZSBiaXQgaXMgemVybworCWZvciAoaSA9IDA7IChkbWFfc3RhdHVzICYgUExYX0RNQV9ET05FX0JJVCkgJiYgaSA8IHRpbWVvdXQ7IGkrKykgeworCQljb21lZGlfdWRlbGF5KDEpOworCQlkbWFfc3RhdHVzID0gcmVhZGIoZG1hX2NzX2FkZHIpOworCX0KKwlpZiAoaSA9PSB0aW1lb3V0KSB7CisJCXJ0X3ByaW50aworCQkJKCJwbHg5MDgwOiBjYW5jZWwoKSB0aW1lZCBvdXQgd2FpdGluZyBmb3IgZG1hICVpIGRvbmUgY2xlYXJcbiIsCisJCQljaGFubmVsKTsKKwkJcmV0dXJuIC1FVElNRURPVVQ7CisJfQorCS8vIGRpc2FibGUgYW5kIGFib3J0IGNoYW5uZWwKKwl3cml0ZWIoUExYX0RNQV9BQk9SVF9CSVQsIGRtYV9jc19hZGRyKTsKKwkvLyB3YWl0IGZvciBkbWEgZG9uZSBiaXQKKwlkbWFfc3RhdHVzID0gcmVhZGIoZG1hX2NzX2FkZHIpOworCWZvciAoaSA9IDA7IChkbWFfc3RhdHVzICYgUExYX0RNQV9ET05FX0JJVCkgPT0gMCAmJiBpIDwgdGltZW91dDsgaSsrKSB7CisJCWNvbWVkaV91ZGVsYXkoMSk7CisJCWRtYV9zdGF0dXMgPSByZWFkYihkbWFfY3NfYWRkcik7CisJfQorCWlmIChpID09IHRpbWVvdXQpIHsKKwkJcnRfcHJpbnRrCisJCQkoInBseDkwODA6IGNhbmNlbCgpIHRpbWVkIG91dCB3YWl0aW5nIGZvciBkbWEgJWkgZG9uZSBzZXRcbiIsCisJCQljaGFubmVsKTsKKwkJcmV0dXJuIC1FVElNRURPVVQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAvKiBfX0NPTUVESV9QTFg5MDgwX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9ydGQ1MjAuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9ydGQ1MjAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NWQ1MjQyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3J0ZDUyMC5jCkBAIC0wLDAgKzEsMjI4MyBAQAorLyoKKyAgICBjb21lZGkvZHJpdmVycy9ydGQ1MjAuYworICAgIENvbWVkaSBkcml2ZXIgZm9yIFJlYWwgVGltZSBEZXZpY2VzIChSVEQpIFBDSTQ1MjAvRE03NTIwCisKKyAgICBDT01FREkgLSBMaW51eCBDb250cm9sIGFuZCBNZWFzdXJlbWVudCBEZXZpY2UgSW50ZXJmYWNlCisgICAgQ29weXJpZ2h0IChDKSAyMDAxIERhdmlkIEEuIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisqLworLyoKK0RyaXZlcjogcnRkNTIwCitEZXNjcmlwdGlvbjogUmVhbCBUaW1lIERldmljZXMgUENJNDUyMC9ETTc1MjAKK0F1dGhvcjogRGFuIENocmlzdGlhbgorRGV2aWNlczogW1JlYWwgVGltZSBEZXZpY2VzXSBETTc1MjBIUi0xIChydGQ1MjApLCBETTc1MjBIUi04LAorICBQQ0k0NTIwLCBQQ0k0NTIwLTgKK1N0YXR1czogV29ya3MuICBPbmx5IHRlc3RlZCBvbiBETTc1MjAtOC4gIE5vdCBTTVAgc2FmZS4KKworQ29uZmlndXJhdGlvbiBvcHRpb25zOgorICBbMF0gLSBQQ0kgYnVzIG9mIGRldmljZSAob3B0aW9uYWwpCisgICAgICAgICAgSWYgYnVzL3Nsb3QgaXMgbm90IHNwZWNpZmllZCwgdGhlIGZpcnN0IGF2YWlsYWJsZSBQQ0kKKyAgICAgICAgICBkZXZpY2Ugd2lsbCBiZSB1c2VkLgorICBbMV0gLSBQQ0kgc2xvdCBvZiBkZXZpY2UgKG9wdGlvbmFsKQorKi8KKy8qCisgICAgQ3JlYXRlZCBieSBEYW4gQ2hyaXN0aWFuLCBOQVNBIEFtZXMgUmVzZWFyY2ggQ2VudGVyLgorCisgICAgVGhlIFBDSTQ1MjAgaXMgYSBQQ0kgY2FyZC4gIFRoZSBETTc1MjAgaXMgYSBQQy8xMDQtcGx1cyBjYXJkLgorICAgIEJvdGggaGF2ZToKKyAgICA4LzE2IDEyIGJpdCBBREMgd2l0aCBGSUZPIGFuZCBjaGFubmVsIGdhaW4gdGFibGUKKyAgICA4IGJpdHMgaGlnaCBzcGVlZCBkaWdpdGFsIG91dCAoZm9yIGV4dGVybmFsIE1VWCkgKG9yIDggaW4gb3IgOCBvdXQpCisgICAgOCBiaXRzIGhpZ2ggc3BlZWQgZGlnaXRhbCBpbiB3aXRoIEZJRk8gYW5kIGludGVycnVwdCBvbiBjaGFuZ2UgKG9yIDggSU8pCisgICAgMiAxMiBiaXQgREFDcyB3aXRoIEZJRk9zCisgICAgMiBiaXRzIG91dHB1dAorICAgIDIgYml0cyBpbnB1dAorICAgIGJ1cyBtYXN0ZXJpbmcgRE1BCisgICAgdGltZXJzOiBBREMgc2FtcGxlLCBwYWNlciwgYnVyc3QsIGFib3V0LCBkZWxheSwgREExLCBEQTIKKyAgICBzYW1wbGUgY291bnRlcgorICAgIDMgdXNlciB0aW1lci9jb3VudGVycyAoODI1NCkKKyAgICBleHRlcm5hbCBpbnRlcnJ1cHQKKworICAgIFRoZSBETTc1MjAgaGFzIHNsaWdodGx5IGZld2VyIGZlYXR1cmVzIChmZXdlciBnYWluIHN0ZXBzKS4KKworICAgIFRoZXNlIGJvYXJkcyBjYW4gc3VwcG9ydCBleHRlcm5hbCBtdWx0aXBsZXhvcnMgYW5kIG11bHRpLWJvYXJkCisgICAgc3luY2hyb25pemF0aW9uLCBidXQgdGhpcyBkcml2ZXIgZG9lc24ndCBzdXBwb3J0IHRoYXQuCisKKyAgICBCb2FyZCBkb2NzOiBodHRwOi8vd3d3LnJ0ZHVzYS5jb20vUEMxMDQvRE0vYW5hbG9nJTIwSU8vZG03NTIwLmh0bQorICAgIERhdGEgc2hlZXQ6IGh0dHA6Ly93d3cucnRkdXNhLmNvbS9wZGYvZG03NTIwLnBkZgorICAgIEV4YW1wbGUgc291cmNlOiBodHRwOi8vd3d3LnJ0ZHVzYS5jb20vZXhhbXBsZXMvZG0vZG03NTIwLnppcAorICAgIENhbGwgdGhlbSBhbmQgYXNrIGZvciB0aGUgcmVnaXN0ZXIgbGV2ZWwgbWFudWFsLgorICAgIFBDSSBjaGlwOiBodHRwOi8vd3d3LnBseHRlY2guY29tL3Byb2R1Y3RzL3Rvb2xib3gvOTA4MC5odG0KKworICAgIE5vdGVzOgorICAgIFRoaXMgYm9hcmQgaXMgbWVtb3J5IG1hcHBlZC4gIFRoZXJlIGlzIHNvbWUgSU8gc3R1ZmYsIGJ1dCBpdCBpc24ndCBuZWVkZWQuCisKKyAgICBJIHVzZSBhIHByZXR0eSBsb29zZSBuYW1pbmcgc3R5bGUgd2l0aGluIHRoZSBkcml2ZXIgKHJ0ZF9ibGFoKS4KKyAgICBBbGwgZXh0ZXJuYWxseSB2aXNpYmxlIG5hbWVzIHNob3VsZCBiZSBydGQ1MjBfYmxhaC4KKyAgICBJIHVzZSBjYW1lbENhc2UgZm9yIHN0cnVjdHVyZXMgKGFuZCBpbnNpZGUgdGhlbSkuCisgICAgSSBtYXkgYWxzbyB1c2UgdXBwZXIgQ2FtZWxDYXNlIGZvciBmdW5jdGlvbiBuYW1lcyAob2xkIGhhYml0KS4KKworICAgIFRoaXMgYm9hcmQgaXMgc29tZXdoYXQgcmVsYXRlZCB0byB0aGUgUlREIFBDSTQ0MDAgYm9hcmQuCisKKyAgICBJIGJvcnJvd2VkIGhlYXZpbHkgZnJvbSB0aGUgbmlfbWlvX2NvbW1vbiwgbmlfYXRtaW8xNmQsIG1pdGUsIGFuZAorICAgIGRhczE4MDAsIHNpbmNlIHRoZXkgaGF2ZSB0aGUgYmVzdCBkb2N1bWVudGVkIGNvZGUuICBEcml2ZXIKKyAgICBjYl9wY2lkYXM2NC5jIHVzZXMgdGhlIHNhbWUgRE1BIGNvbnRyb2xsZXIuCisKKyAgICBBcyBmYXIgYXMgSSBjYW4gdGVsbCwgdGhlIEFib3V0IGludGVycnVwdCBkb2VzbnQgd29yayBpZiBTYW1wbGUgaXMKKyAgICBhbHNvIGVuYWJsZWQuICBJdCB0dXJucyBvdXQgdGhhdCBBYm91dCByZWFsbHkgaXNuJ3QgbmVlZGVkLCBzaW5jZQorICAgIHdlIGFsd2F5cyBjb3VudCBkb3duIHNhbXBsZXMgcmVhZC4KKworICAgIFRoZXJlIHdhcyBzb21lIHRpbWVyL2NvdW50ZXIgY29kZSwgYnV0IGl0IGRpZG4ndCBmb2xsb3cgdGhlIHJpZ2h0IEFQSS4KKworKi8KKworLyoKKyAgZHJpdmVyIHN0YXR1czoKKworICBBbmFsb2ctSW4gc3VwcG9ydHMgaW5zdHJ1Y3Rpb24gYW5kIGNvbW1hbmQgbW9kZS4KKworICBXaXRoIERNQSwgeW91IGNhbiBzYW1wbGUgYXQgMS4xNU1oeiB3aXRoIDcwJSBpZGxlIG9uIGEgNDAwTWh6IEs2LTIKKyAgKHNpbmdsZSBjaGFubmVsLCA2NEsgcmVhZCBidWZmZXIpLiAgSSBnZXQgcmFuZG9tIHN5c3RlbSBsb2NrdXBzIHdoZW4KKyAgdXNpbmcgRE1BIHdpdGggQUxJLTE1eHggYmFzZWQgc3lzdGVtcy4gIEkgaGF2ZW4ndCBiZWVuIGFibGUgdG8gdGVzdAorICBhbnkgb3RoZXIgY2hpcHNldHMuICBUaGUgbG9ja3VwcyBoYXBwZW4gc29vbiBhZnRlciB0aGUgc3RhcnQgb2YgYW4KKyAgYWNxdWlzdGlvbiwgbm90IGluIHRoZSBtaWRkbGUgb2YgYSBsb25nIHJ1bi4KKworICBXaXRob3V0IERNQSwgeW91IGNhbiBkbyA2MjBLaHogc2FtcGxpbmcgd2l0aCAyMCUgaWRsZSBvbiBhIDQwME1oeiBLNi0yCisgICh3aXRoIGEgMjU2SyByZWFkIGJ1ZmZlcikuCisKKyAgRGlnaXRhbC1JTyBhbmQgQW5hbG9nLU91dCBvbmx5IHN1cHBvcnQgaW5zdHJ1Y3Rpb24gbW9kZS4KKworKi8KKworI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisKKyNpbmNsdWRlICIuLi9jb21lZGlkZXYuaCIKKyNpbmNsdWRlICJjb21lZGlfcGNpLmgiCisKKyNkZWZpbmUgRFJWX05BTUUgInJ0ZDUyMCIKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIERyaXZlciBzcGVjaWZpYyBzdHVmZiAodHVuYWJsZSkKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworLyogRW5hYmxlIHRoaXMgdG8gdGVzdCB0aGUgbmV3IERNQSBzdXBwb3J0LiBZb3UgbWF5IGdldCBoYXJkIGxvY2sgdXBzICovCisvKiNkZWZpbmUgVVNFX0RNQSovCisKKy8qIFdlIHJlYWxseSBvbmx5IG5lZWQgMiBidWZmZXJzLiAgTW9yZSB0aGFuIHRoYXQgbWVhbnMgYmVpbmcgbXVjaAorICAgc21hcnRlciBhYm91dCBrbm93aW5nIHdoaWNoIG9uZXMgYXJlIGZ1bGwuICovCisjZGVmaW5lIERNQV9DSEFJTl9DT1VOVCAyCS8qIG1heCBETUEgc2VnbWVudHMvYnVmZmVycyBpbiBhIHJpbmcgKG1pbiAyKSAqLworCisvKiBUYXJnZXQgcGVyaW9kIGZvciBwZXJpb2RpYyB0cmFuc2ZlcnMuICBUaGlzIHNldHMgdGhlIHVzZXIgcmVhZCBsYXRlbmN5LiAqLworLyogTm90ZTogVGhlcmUgYXJlIGNlcnRhaW4gcmF0ZXMgd2hlcmUgd2UgZ2l2ZSB0aGlzIHVwIGFuZCB0cmFuc2ZlciAxLzIgRklGTyAqLworLyogSWYgdGhpcyBpcyB0b28gbG93LCBlZmZpY2llbmN5IGlzIHBvb3IgKi8KKyNkZWZpbmUgVFJBTlNfVEFSR0VUX1BFUklPRCAxMDAwMDAwMAkvKiAxMCBtcyAoaW4gbmFub3NlY29uZHMpICovCisKKy8qIFNldCBhIHByYWN0aWNhbCBsaW1pdCBvbiBob3cgbG9uZyBhIGxpc3QgdG8gc3VwcG9ydCAoYWZmZWN0cyBtZW1vcnkgdXNlKSAqLworLyogVGhlIGJvYXJkIHN1cHBvcnQgYSBjaGFubmVsIGxpc3QgdXAgdG8gdGhlIEZJRk8gbGVuZ3RoICgxSyBvciA4SykgKi8KKyNkZWZpbmUgUlREX01BWF9DSEFOTElTVAkxMjgJLyogbWF4IGNoYW5uZWwgbGlzdCB0aGF0IHdlIGFsbG93ICovCisKKy8qIHR1bmluZyBmb3IgYWkvYW8gaW5zdHJ1Y3Rpb24gZG9uZSBwb2xsaW5nICovCisjaWZkZWYgRkFTVF9TUElOCisjZGVmaW5lIFdBSVRfUVVJRVRMWQkJLyogYXMgbm90aGluZywgc3BpbiBvbiBkb25lIGJpdCAqLworI2RlZmluZSBSVERfQURDX1RJTUVPVVQJNjYwMDAJLyogMiBtc2VjIGF0IDMzbWh6IGJ1cyByYXRlICovCisjZGVmaW5lIFJURF9EQUNfVElNRU9VVAk2NjAwMAorI2RlZmluZSBSVERfRE1BX1RJTUVPVVQJMzMwMDAJLyogMSBtc2VjICovCisjZWxzZQorLyogYnkgZGVsYXlpbmcsIHBvd2VyIGFuZCBlbGVjdHJpY2FsIG5vaXNlIGFyZSByZWR1Y2VkIHNvbWV3aGF0ICovCisjZGVmaW5lIFdBSVRfUVVJRVRMWQljb21lZGlfdWRlbGF5ICgxKQorI2RlZmluZSBSVERfQURDX1RJTUVPVVQJMjAwMAkvKiBpbiB1c2VjICovCisjZGVmaW5lIFJURF9EQUNfVElNRU9VVAkyMDAwCS8qIGluIHVzZWMgKi8KKyNkZWZpbmUgUlREX0RNQV9USU1FT1VUCTEwMDAJLyogaW4gdXNlYyAqLworI2VuZGlmCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBCb2FyZCBzcGVjaWZpYyBzdHVmZgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qIHJlZ2lzdGVycyAgKi8KKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9SVEQJMHgxNDM1CisvKgorICBUaGUgYm9hcmQgaGFzIHRocmVlIG1lbW9yeSB3aW5kb3dzOiBsYXMwLCBsYXMxLCBhbmQgbGNmZyAodGhlIFBDSSBjaGlwKQorICBMYXMxIGhhcyB0aGUgZGF0YSBhbmQgY2FuIGJlIGJ1cnN0IERNQWVkIDMyYml0cyBhdCBhIHRpbWUuCisqLworI2RlZmluZSBMQ0ZHX1BDSUlOREVYCTAKKy8qIFBDSSByZWdpb24gMSBpcyBhIDI1NiBieXRlIElPIHNwYWNlIG1hcHBpbmcuICBVc2U/Pz8gKi8KKyNkZWZpbmUgTEFTMF9QQ0lJTkRFWAkyCS8qIFBDSSBtZW1vcnkgcmVzb3VyY2VzICovCisjZGVmaW5lIExBUzFfUENJSU5ERVgJMworI2RlZmluZSBMQ0ZHX1BDSVNJWkUJMHgxMDAKKyNkZWZpbmUgTEFTMF9QQ0lTSVpFCTB4MjAwCisjZGVmaW5lIExBUzFfUENJU0laRQkweDEwCisKKyNkZWZpbmUgUlREX0NMT0NLX1JBVEUJODAwMDAwMAkvKiA4TWh6IG9uYm9hcmQgY2xvY2sgKi8KKyNkZWZpbmUgUlREX0NMT0NLX0JBU0UJMTI1CS8qIGNsb2NrIHBlcmlvZCBpbiBucyAqLworCisvKiBOb3RlOiB0aGVzZSBzcGVlZCBhcmUgc2xvd2VyIHRoYW4gdGhlIHNwZWMsIGJ1dCBmaXQgdGhlIGNvdW50ZXIgcmVzb2x1dGlvbiovCisjZGVmaW5lIFJURF9NQVhfU1BFRUQJMTYyNQkvKiB3aGVuIHNhbXBsaW5nLCBpbiBuYW5vc2Vjb25kcyAqLworLyogbWF4IHNwZWVkIGlmIHdlIGRvbid0IGhhdmUgdG8gd2FpdCBmb3Igc2V0dGxpbmcgKi8KKyNkZWZpbmUgUlREX01BWF9TUEVFRF8xCTg3NQkvKiBpZiBzaW5nbGUgY2hhbm5lbCwgaW4gbmFub3NlY29uZHMgKi8KKworI2RlZmluZSBSVERfTUlOX1NQRUVECTIwOTcxNTE4NzUJLyogKDI0Yml0IGNvdW50ZXIpIGluIG5hbm9zZWNvbmRzICovCisvKiBtaW4gc3BlZWQgd2hlbiBvbmx5IDEgY2hhbm5lbCAobm8gYnVyc3QgY291bnRlcikgKi8KKyNkZWZpbmUgUlREX01JTl9TUEVFRF8xCTUwMDAwMDAJLyogMjAwSHosIGluIG5hbm9zZWNvbmRzICovCisKKyNpbmNsdWRlICJydGQ1MjAuaCIKKyNpbmNsdWRlICJwbHg5MDgwLmgiCisKKy8qIFNldHVwIGNvbnRpbnVvdXMgcmluZyBvZiAxLzIgRklGTyB0cmFuc2ZlcnMuICBTZWUgUlREIG1hbnVhbCBwOTEgKi8KKyNkZWZpbmUgRE1BX01PREVfQklUUyAoXAorCQkgICAgICAgUExYX0xPQ0FMX0JVU18xNl9XSURFX0JJVFMgXAorCQkgICAgICAgfCBQTFhfRE1BX0VOX1JFQURZSU5fQklUIFwKKwkJICAgICAgIHwgUExYX0RNQV9MT0NBTF9CVVJTVF9FTl9CSVQgXAorCQkgICAgICAgfCBQTFhfRU5fQ0hBSU5fQklUIFwKKwkJICAgICAgIHwgUExYX0RNQV9JTlRSX1BDSV9CSVQgXAorCQkgICAgICAgfCBQTFhfTE9DQUxfQUREUl9DT05TVF9CSVQgXAorCQkgICAgICAgfCBQTFhfREVNQU5EX01PREVfQklUKQorCisjZGVmaW5lIERNQV9UUkFOU0ZFUl9CSVRTIChcCisvKiBkZXNjcmlwdG9ycyBpbiBQQ0kgbWVtb3J5Ki8gCVBMWF9ERVNDX0lOX1BDSV9CSVQgXAorLyogaW50ZXJydXB0IGF0IGVuZCBvZiBibG9jayAqLyB8IFBMWF9JTlRSX1RFUk1fQ09VTlQgXAorLyogZnJvbSBib2FyZCB0byBQQ0kgKi8JCXwgUExYX1hGRVJfTE9DQUxfVE9fUENJKQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQ29tZWRpIHNwZWNpZmljIHN0dWZmCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyoKKyAgVGhlIGJvYXJkIGhhcyAzIGlucHV0IG1vZGVzIGFuZCB0aGUgZ2FpbnMgb2YgMSwyLDQsLi4uMzIgKCwgNjQsIDEyOCkKKyovCitzdGF0aWMgY29uc3QgY29tZWRpX2xyYW5nZSBydGRfYWlfNzUyMF9yYW5nZSA9IHsgMTgsIHsKKwkJCS8qICstNVYgaW5wdXQgcmFuZ2UgZ2FpbiBzdGVwcyAqLworCQkJQklQX1JBTkdFKDUuMCksCisJCQlCSVBfUkFOR0UoNS4wIC8gMiksCisJCQlCSVBfUkFOR0UoNS4wIC8gNCksCisJCQlCSVBfUkFOR0UoNS4wIC8gOCksCisJCQlCSVBfUkFOR0UoNS4wIC8gMTYpLAorCQkJQklQX1JBTkdFKDUuMCAvIDMyKSwKKwkJCS8qICstMTBWIGlucHV0IHJhbmdlIGdhaW4gc3RlcHMgKi8KKwkJCUJJUF9SQU5HRSgxMC4wKSwKKwkJCUJJUF9SQU5HRSgxMC4wIC8gMiksCisJCQlCSVBfUkFOR0UoMTAuMCAvIDQpLAorCQkJQklQX1JBTkdFKDEwLjAgLyA4KSwKKwkJCUJJUF9SQU5HRSgxMC4wIC8gMTYpLAorCQkJQklQX1JBTkdFKDEwLjAgLyAzMiksCisJCQkvKiArMTBWIGlucHV0IHJhbmdlIGdhaW4gc3RlcHMgKi8KKwkJCVVOSV9SQU5HRSgxMC4wKSwKKwkJCVVOSV9SQU5HRSgxMC4wIC8gMiksCisJCQlVTklfUkFOR0UoMTAuMCAvIDQpLAorCQkJVU5JX1JBTkdFKDEwLjAgLyA4KSwKKwkJCVVOSV9SQU5HRSgxMC4wIC8gMTYpLAorCQkJVU5JX1JBTkdFKDEwLjAgLyAzMiksCisKKwl9Cit9OworCisvKiBQQ0k0NTIwIGhhcyB0d28gbW9yZSBnYWlucyAoNiBtb3JlIGVudHJpZXMpICovCitzdGF0aWMgY29uc3QgY29tZWRpX2xyYW5nZSBydGRfYWlfNDUyMF9yYW5nZSA9IHsgMjQsIHsKKwkJCS8qICstNVYgaW5wdXQgcmFuZ2UgZ2FpbiBzdGVwcyAqLworCQkJQklQX1JBTkdFKDUuMCksCisJCQlCSVBfUkFOR0UoNS4wIC8gMiksCisJCQlCSVBfUkFOR0UoNS4wIC8gNCksCisJCQlCSVBfUkFOR0UoNS4wIC8gOCksCisJCQlCSVBfUkFOR0UoNS4wIC8gMTYpLAorCQkJQklQX1JBTkdFKDUuMCAvIDMyKSwKKwkJCUJJUF9SQU5HRSg1LjAgLyA2NCksCisJCQlCSVBfUkFOR0UoNS4wIC8gMTI4KSwKKwkJCS8qICstMTBWIGlucHV0IHJhbmdlIGdhaW4gc3RlcHMgKi8KKwkJCUJJUF9SQU5HRSgxMC4wKSwKKwkJCUJJUF9SQU5HRSgxMC4wIC8gMiksCisJCQlCSVBfUkFOR0UoMTAuMCAvIDQpLAorCQkJQklQX1JBTkdFKDEwLjAgLyA4KSwKKwkJCUJJUF9SQU5HRSgxMC4wIC8gMTYpLAorCQkJQklQX1JBTkdFKDEwLjAgLyAzMiksCisJCQlCSVBfUkFOR0UoMTAuMCAvIDY0KSwKKwkJCUJJUF9SQU5HRSgxMC4wIC8gMTI4KSwKKwkJCS8qICsxMFYgaW5wdXQgcmFuZ2UgZ2FpbiBzdGVwcyAqLworCQkJVU5JX1JBTkdFKDEwLjApLAorCQkJVU5JX1JBTkdFKDEwLjAgLyAyKSwKKwkJCVVOSV9SQU5HRSgxMC4wIC8gNCksCisJCQlVTklfUkFOR0UoMTAuMCAvIDgpLAorCQkJVU5JX1JBTkdFKDEwLjAgLyAxNiksCisJCQlVTklfUkFOR0UoMTAuMCAvIDMyKSwKKwkJCVVOSV9SQU5HRSgxMC4wIC8gNjQpLAorCQkJVU5JX1JBTkdFKDEwLjAgLyAxMjgpLAorCX0KK307CisKKy8qIFRhYmxlIG9yZGVyIG1hdGNoZXMgcmFuZ2UgdmFsdWVzICovCitzdGF0aWMgY29uc3QgY29tZWRpX2xyYW5nZSBydGRfYW9fcmFuZ2UgPSB7IDQsIHsKKwkJCVJBTkdFKDAsIDUpLAorCQkJUkFOR0UoMCwgMTApLAorCQkJUkFOR0UoLTUsIDUpLAorCQkJUkFOR0UoLTEwLCAxMCksCisJfQorfTsKKworLyoKKyAgQm9hcmQgZGVzY3JpcHRpb25zCisgKi8KK3R5cGVkZWYgc3RydWN0IHJ0ZEJvYXJkX3N0cnVjdCB7CisJY29uc3QgY2hhciAqbmFtZTsJLyogbXVzdCBiZSBmaXJzdCAqLworCWludCBkZXZpY2VfaWQ7CisJaW50IGFpQ2hhbnM7CisJaW50IGFpQml0czsKKwlpbnQgYWlNYXhHYWluOworCWludCByYW5nZTEwU3RhcnQ7CS8qIHN0YXJ0IG9mICstMTBWIHJhbmdlICovCisJaW50IHJhbmdlVW5pU3RhcnQ7CS8qIHN0YXJ0IG9mICsxMFYgcmFuZ2UgKi8KK30gcnRkQm9hcmQ7CisKK3N0YXRpYyBjb25zdCBydGRCb2FyZCBydGQ1MjBCb2FyZHNbXSA9IHsKKwl7CisJICAgICAgbmFtZToJIkRNNzUyMCIsCisJICAgICAgZGV2aWNlX2lkOjB4NzUyMCwKKwkgICAgICBhaUNoYW5zOgkxNiwKKwkgICAgICBhaUJpdHM6CTEyLAorCSAgICAgIGFpTWF4R2FpbjozMiwKKwkgICAgICByYW5nZTEwU3RhcnQ6NiwKKwkgICAgICByYW5nZVVuaVN0YXJ0OjEyLAorCQl9LAorCXsKKwkgICAgICBuYW1lOgkiUENJNDUyMCIsCisJICAgICAgZGV2aWNlX2lkOjB4NDUyMCwKKwkgICAgICBhaUNoYW5zOgkxNiwKKwkgICAgICBhaUJpdHM6CTEyLAorCSAgICAgIGFpTWF4R2FpbjoxMjgsCisJICAgICAgcmFuZ2UxMFN0YXJ0OjgsCisJICAgICAgcmFuZ2VVbmlTdGFydDoxNiwKKwkJfSwKK307CisKK3N0YXRpYyBERUZJTkVfUENJX0RFVklDRV9UQUJMRShydGQ1MjBfcGNpX3RhYmxlKSA9IHsKKwl7UENJX1ZFTkRPUl9JRF9SVEQsIDB4NzUyMCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJe1BDSV9WRU5ET1JfSURfUlRELCAweDQ1MjAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCXswfQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHJ0ZDUyMF9wY2lfdGFibGUpOworCisvKgorICogVXNlZnVsIGZvciBzaG9ydGhhbmQgYWNjZXNzIHRvIHRoZSBwYXJ0aWN1bGFyIGJvYXJkIHN0cnVjdHVyZQorICovCisjZGVmaW5lIHRoaXNib2FyZCAoKGNvbnN0IHJ0ZEJvYXJkICopZGV2LT5ib2FyZF9wdHIpCisKKy8qCisgICBUaGlzIHN0cnVjdHVyZSBpcyBmb3IgZGF0YSB1bmlxdWUgdG8gdGhpcyBoYXJkd2FyZSBkcml2ZXIuCisgICBUaGlzIGlzIGFsc28gdW5pcXVlIGZvciBlYWNoIGJvYXJkIGluIHRoZSBzeXN0ZW0uCisqLwordHlwZWRlZiBzdHJ1Y3QgeworCS8qIG1lbW9yeSBtYXBwZWQgYm9hcmQgc3RydWN0dXJlcyAqLworCXZvaWQgKmxhczA7CisJdm9pZCAqbGFzMTsKKwl2b2lkICpsY2ZnOworCisJdW5zaWduZWQgbG9uZyBpbnRDb3VudDsJLyogaW50ZXJydXB0IGNvdW50ICovCisJbG9uZyBhaUNvdW50OwkJLyogdG90YWwgdHJhbnNmZXIgc2l6ZSAoc2FtcGxlcykgKi8KKwlpbnQgdHJhbnNDb3VudDsJCS8qICMgdG8gdHJhbmZlciBkYXRhLiAwLT4xLzJGSUZPICovCisJaW50IGZsYWdzOwkJLyogZmxhZyBldmVudCBtb2RlcyAqLworCisJLyogUENJIGRldmljZSBpbmZvICovCisJc3RydWN0IHBjaV9kZXYgKnBjaV9kZXY7CisJaW50IGdvdF9yZWdpb25zOwkvKiBub24temVybyBpZiBQQ0kgcmVnaW9ucyBvd25lZCAqLworCisJLyogY2hhbm5lbCBsaXN0IGluZm8gKi8KKwkvKiBjaGFuQmlwb2xhciB0cmFja3Mgd2hldGhlciBhIGNoYW5uZWwgaXMgYmlwb2xhciAoYW5kIG5lZWRzICsyMDQ4KSAqLworCXVuc2lnbmVkIGNoYXIgY2hhbkJpcG9sYXJbUlREX01BWF9DSEFOTElTVCAvIDhdOwkvKiBiaXQgYXJyYXkgKi8KKworCS8qIHJlYWQgYmFjayBkYXRhICovCisJbHNhbXBsX3QgYW9WYWx1ZVsyXTsJLyogVXNlZCBmb3IgQU8gcmVhZCBiYWNrICovCisKKwkvKiB0aW1lciBnYXRlICh3aGVuIGVuYWJsZWQpICovCisJdTggdXRjR2F0ZVs0XTsJCS8qIDEgZXh0cmEgYWxsb3dzIHNpbXBsZSByYW5nZSBjaGVjayAqLworCisJLyogc2hhZG93IHJlZ2lzdGVycyBhZmZlY3Qgb3RoZXIgcmVnaXN0ZXJzLCBidXQgY2FudCBiZSByZWFkIGJhY2sgKi8KKwkvKiBUaGUgbWFjcm9zIGJlbG93IHVwZGF0ZSB0aGVzZSBvbiB3cml0ZXMgKi8KKwl1MTYgaW50TWFzazsJCS8qIGludGVycnVwdCBtYXNrICovCisJdTE2IGludENsZWFyTWFzazsJLyogaW50ZXJydXB0IGNsZWFyIG1hc2sgKi8KKwl1OCB1dGNDdHJsWzRdOwkJLyogY3J0bCBtb2RlIGZvciAzIHV0YyArIHJlYWQgYmFjayAqLworCXU4IGRpb1N0YXR1czsJCS8qIGNvdWxkIGJlIHJlYWQgYmFjayAoZGlvMEN0cmwpICovCisjaWZkZWYgVVNFX0RNQQorCS8qIEFsd2F5cyBETUEgMS8yIEZJRk8uICBCdWZmZXIgKGRtYUJ1ZmY/KSBpcyAoYXQgbGVhc3QpIHR3aWNlIHRoYXQgc2l6ZS4KKwkgICBBZnRlciB0cmFuc2ZlcnJpbmcsIGludGVycnVwdCBwcm9jZXNzZXMgMS8yIEZJRk8gYW5kIHBhc3NlcyB0byBjb21lZGkgKi8KKwlzMTYgZG1hME9mZnNldDsJCS8qIGN1cnJlbnQgcHJvY2Vzc2luZyBvZmZzZXQgKDAsIDEvMikgKi8KKwl1aW50MTZfdCAqZG1hMEJ1ZmZbRE1BX0NIQUlOX0NPVU5UXTsJLyogRE1BIGJ1ZmZlcnMgKGZvciBBREMpICovCisJZG1hX2FkZHJfdCBkbWEwQnVmZlBoeXNBZGRyW0RNQV9DSEFJTl9DT1VOVF07CS8qIHBoeXNpY2FsIGFkZHJlc3NlcyAqLworCXN0cnVjdCBwbHhfZG1hX2Rlc2MgKmRtYTBDaGFpbjsJLyogRE1BIGRlc2NyaXB0b3IgcmluZyBmb3IgZG1hQnVmZiAqLworCWRtYV9hZGRyX3QgZG1hMENoYWluUGh5c0FkZHI7CS8qIHBoeXNpY2FsIGFkZHJlc3NlcyAqLworCS8qIHNoYWRvdyByZWdpc3RlcnMgKi8KKwl1OCBkbWEwQ29udHJvbDsKKwl1OCBkbWExQ29udHJvbDsKKyNlbmRpZgkJCQkvKiBVU0VfRE1BICovCisJdW5zaWduZWQgZmlmb0xlbjsKK30gcnRkUHJpdmF0ZTsKKworLyogYml0IGRlZmluZXMgZm9yICJmbGFncyIgKi8KKyNkZWZpbmUgU0VORF9FT1MJMHgwMQkvKiBzZW5kIEVuZCBPZiBTY2FuIGV2ZW50cyAqLworI2RlZmluZSBETUEwX0FDVElWRQkweDAyCS8qIERNQTAgaXMgYWN0aXZlICovCisjZGVmaW5lIERNQTFfQUNUSVZFCTB4MDQJLyogRE1BMSBpcyBhY3RpdmUgKi8KKworLyogTWFjcm9zIGZvciBhY2Nlc3NpbmcgY2hhbm5lbCBsaXN0IGJpdCBhcnJheSAqLworI2RlZmluZSBDSEFOX0FSUkFZX1RFU1QoYXJyYXksaW5kZXgpIFwKKwkoKChhcnJheSlbKGluZGV4KS84XSA+PiAoKGluZGV4KSAmIDB4NykpICYgMHgxKQorI2RlZmluZSBDSEFOX0FSUkFZX1NFVChhcnJheSxpbmRleCkgXAorCSgoKGFycmF5KVsoaW5kZXgpLzhdIHw9IDEgPDwgKChpbmRleCkgJiAweDcpKSkKKyNkZWZpbmUgQ0hBTl9BUlJBWV9DTEVBUihhcnJheSxpbmRleCkgXAorCSgoKGFycmF5KVsoaW5kZXgpLzhdICY9IH4oMSA8PCAoKGluZGV4KSAmIDB4NykpKSkKKworLyoKKyAqIG1vc3QgZHJpdmVycyBkZWZpbmUgdGhlIGZvbGxvd2luZyBtYWNybyB0byBtYWtlIGl0IGVhc3kgdG8KKyAqIGFjY2VzcyB0aGUgcHJpdmF0ZSBzdHJ1Y3R1cmUuCisgKi8KKyNkZWZpbmUgZGV2cHJpdiAoKHJ0ZFByaXZhdGUgKilkZXYtPnByaXZhdGUpCisKKy8qIE1hY3JvcyB0byBhY2Nlc3MgcmVnaXN0ZXJzICovCisKKy8qIFJlc2V0IGJvYXJkICovCisjZGVmaW5lIFJ0ZFJlc2V0Qm9hcmQoZGV2KSBcCisgICAgd3JpdGVsICgwLCBkZXZwcml2LT5sYXMwK0xBUzBfQk9BUkRfUkVTRVQpCisKKy8qIFJlc2V0IGNoYW5uZWwgZ2FpbiB0YWJsZSByZWFkIHBvaW50ZXIgKi8KKyNkZWZpbmUgUnRkUmVzZXRDR1QoZGV2KSBcCisgICAgd3JpdGVsICgwLCBkZXZwcml2LT5sYXMwK0xBUzBfQ0dUX1JFU0VUKQorCisvKiBSZXNldCBjaGFubmVsIGdhaW4gdGFibGUgcmVhZCBhbmQgd3JpdGUgcG9pbnRlcnMgKi8KKyNkZWZpbmUgUnRkQ2xlYXJDR1QoZGV2KSBcCisgICAgd3JpdGVsICgwLCBkZXZwcml2LT5sYXMwK0xBUzBfQ0dUX0NMRUFSKQorCisvKiBSZXNldCBjaGFubmVsIGdhaW4gdGFibGUgcmVhZCBhbmQgd3JpdGUgcG9pbnRlcnMgKi8KKyNkZWZpbmUgUnRkRW5hYmxlQ0dUKGRldix2KSBcCisgICAgd3JpdGVsICgodiA+IDApID8gMSA6IDAsIGRldnByaXYtPmxhczArTEFTMF9DR1RfRU5BQkxFKQorCisvKiBXcml0ZSBjaGFubmVsIGdhaW4gdGFibGUgZW50cnkgKi8KKyNkZWZpbmUgUnRkV3JpdGVDR1RhYmxlKGRldix2KSBcCisgICAgd3JpdGVsICh2LCBkZXZwcml2LT5sYXMwK0xBUzBfQ0dUX1dSSVRFKQorCisvKiBXcml0ZSBDaGFubmVsIEdhaW4gTGF0Y2ggKi8KKyNkZWZpbmUgUnRkV3JpdGVDR0xhdGNoKGRldix2KSBcCisgICAgd3JpdGVsICh2LCBkZXZwcml2LT5sYXMwK0xBUzBfQ0dMX1dSSVRFKQorCisvKiBSZXNldCBBREMgRklGTyAqLworI2RlZmluZSBSdGRBZGNDbGVhckZpZm8oZGV2KSBcCisgICAgd3JpdGVsICgwLCBkZXZwcml2LT5sYXMwK0xBUzBfQURDX0ZJRk9fQ0xFQVIpCisKKy8qIFNldCBBREMgc3RhcnQgY29udmVyc2lvbiBzb3VyY2Ugc2VsZWN0ICh3cml0ZSBvbmx5KSAqLworI2RlZmluZSBSdGRBZGNDb252ZXJzaW9uU291cmNlKGRldix2KSBcCisgICAgd3JpdGVsICh2LCBkZXZwcml2LT5sYXMwK0xBUzBfQURDX0NPTlZFUlNJT04pCisKKy8qIFNldCBidXJzdCBzdGFydCBzb3VyY2Ugc2VsZWN0ICh3cml0ZSBvbmx5KSAqLworI2RlZmluZSBSdGRCdXJzdFN0YXJ0U291cmNlKGRldix2KSBcCisgICAgd3JpdGVsICh2LCBkZXZwcml2LT5sYXMwK0xBUzBfQlVSU1RfU1RBUlQpCisKKy8qIFNldCBQYWNlciBzdGFydCBzb3VyY2Ugc2VsZWN0ICh3cml0ZSBvbmx5KSAqLworI2RlZmluZSBSdGRQYWNlclN0YXJ0U291cmNlKGRldix2KSBcCisgICAgd3JpdGVsICh2LCBkZXZwcml2LT5sYXMwK0xBUzBfUEFDRVJfU1RBUlQpCisKKy8qIFNldCBQYWNlciBzdG9wIHNvdXJjZSBzZWxlY3QgKHdyaXRlIG9ubHkpICovCisjZGVmaW5lIFJ0ZFBhY2VyU3RvcFNvdXJjZShkZXYsdikgXAorICAgIHdyaXRlbCAodiwgZGV2cHJpdi0+bGFzMCtMQVMwX1BBQ0VSX1NUT1ApCisKKy8qIFNldCBQYWNlciBjbG9jayBzb3VyY2Ugc2VsZWN0ICh3cml0ZSBvbmx5KSAwPWV4dGVybmFsIDE9aW50ZXJuYWwgKi8KKyNkZWZpbmUgUnRkUGFjZXJDbG9ja1NvdXJjZShkZXYsdikgXAorICAgIHdyaXRlbCAoKHYgPiAwKSA/IDEgOiAwLCBkZXZwcml2LT5sYXMwK0xBUzBfUEFDRVJfU0VMRUNUKQorCisvKiBTZXQgc2FtcGxlIGNvdW50ZXIgc291cmNlIHNlbGVjdCAod3JpdGUgb25seSkgKi8KKyNkZWZpbmUgUnRkQWRjU2FtcGxlQ291bnRlclNvdXJjZShkZXYsdikgXAorICAgIHdyaXRlbCAodiwgZGV2cHJpdi0+bGFzMCtMQVMwX0FEQ19TQ05UX1NSQykKKworLyogU2V0IFBhY2VyIHRyaWdnZXIgbW9kZSBzZWxlY3QgKHdyaXRlIG9ubHkpIDA9c2luZ2xlIGN5Y2xlLCAxPXJlcGVhdCAqLworI2RlZmluZSBSdGRQYWNlclRyaWdnZXJNb2RlKGRldix2KSBcCisgICAgd3JpdGVsICgodiA+IDApID8gMSA6IDAsIGRldnByaXYtPmxhczArTEFTMF9QQUNFUl9SRVBFQVQpCisKKy8qIFNldCBBYm91dCBjb3VudGVyIHN0b3AgZW5hYmxlICh3cml0ZSBvbmx5KSAqLworI2RlZmluZSBSdGRBYm91dFN0b3BFbmFibGUoZGV2LHYpIFwKKyAgICB3cml0ZWwgKCh2ID4gMCkgPyAxIDogMCwgZGV2cHJpdi0+bGFzMCtMQVMwX0FDTlRfU1RPUF9FTkFCTEUpCisKKy8qIFNldCBleHRlcm5hbCB0cmlnZ2VyIHBvbGFyaXR5ICh3cml0ZSBvbmx5KSAwPXBvc2l0aXZlIGVkZ2UsIDE9bmVnYXRpdmUgKi8KKyNkZWZpbmUgUnRkVHJpZ2dlclBvbGFyaXR5KGRldix2KSBcCisgICAgd3JpdGVsICgodiA+IDApID8gMSA6IDAsIGRldnByaXYtPmxhczArTEFTMF9FVFJHX1BPTEFSSVRZKQorCisvKiBTdGFydCBzaW5nbGUgQURDIGNvbnZlcnNpb24gKi8KKyNkZWZpbmUgUnRkQWRjU3RhcnQoZGV2KSBcCisgICAgd3JpdGV3ICgwLCBkZXZwcml2LT5sYXMwK0xBUzBfQURDKQorCisvKiBSZWFkIG9uZSBBREMgZGF0YSB2YWx1ZSAoMTJiaXQgKHdpdGggc2lnbiBleHRlbmQpIGFzIDE2Yml0KSAqLworLyogTm90ZTogbWF0Y2hlcyB3aGF0IERNQSB3b3VsZCBnZXQuICBBY3R1YWwgdmFsdWUgPj4gMyAqLworI2RlZmluZSBSdGRBZGNGaWZvR2V0KGRldikgXAorICAgIHJlYWR3IChkZXZwcml2LT5sYXMxK0xBUzFfQURDX0ZJRk8pCisKKy8qIFJlYWQgdHdvIEFEQyBkYXRhIHZhbHVlcyAoRE9FU05UIFdPUkspICovCisjZGVmaW5lIFJ0ZEFkY0ZpZm9HZXQyKGRldikgXAorICAgIHJlYWRsIChkZXZwcml2LT5sYXMxK0xBUzFfQURDX0ZJRk8pCisKKy8qIEZJRk8gc3RhdHVzICovCisjZGVmaW5lIFJ0ZEZpZm9TdGF0dXMoZGV2KSBcCisgICAgcmVhZGwgKGRldnByaXYtPmxhczArTEFTMF9BREMpCisKKy8qIHBhY2VyIHN0YXJ0L3N0b3AgcmVhZD1zdGFydCwgd3JpdGU9c3RvcCovCisjZGVmaW5lIFJ0ZFBhY2VyU3RhcnQoZGV2KSBcCisgICAgcmVhZGwgKGRldnByaXYtPmxhczArTEFTMF9QQUNFUikKKyNkZWZpbmUgUnRkUGFjZXJTdG9wKGRldikgXAorICAgIHdyaXRlbCAoMCwgZGV2cHJpdi0+bGFzMCtMQVMwX1BBQ0VSKQorCisvKiBJbnRlcnJ1cHQgc3RhdHVzICovCisjZGVmaW5lIFJ0ZEludGVycnVwdFN0YXR1cyhkZXYpIFwKKyAgICByZWFkdyAoZGV2cHJpdi0+bGFzMCtMQVMwX0lUKQorCisvKiBJbnRlcnJ1cHQgbWFzayAqLworI2RlZmluZSBSdGRJbnRlcnJ1cHRNYXNrKGRldix2KSBcCisgICAgd3JpdGV3ICgoZGV2cHJpdi0+aW50TWFzayA9ICh2KSksZGV2cHJpdi0+bGFzMCtMQVMwX0lUKQorCisvKiBJbnRlcnJ1cHQgc3RhdHVzIGNsZWFyIChvbmx5IGJpdHMgc2V0IGluIG1hc2spICovCisjZGVmaW5lIFJ0ZEludGVycnVwdENsZWFyKGRldikgXAorICAgIHJlYWR3IChkZXZwcml2LT5sYXMwK0xBUzBfQ0xFQVIpCisKKy8qIEludGVycnVwdCBjbGVhciBtYXNrICovCisjZGVmaW5lIFJ0ZEludGVycnVwdENsZWFyTWFzayhkZXYsdikgXAorICAgIHdyaXRldyAoKGRldnByaXYtPmludENsZWFyTWFzayA9ICh2KSksIGRldnByaXYtPmxhczArTEFTMF9DTEVBUikKKworLyogSW50ZXJydXB0IG92ZXJydW4gc3RhdHVzICovCisjZGVmaW5lIFJ0ZEludGVycnVwdE92ZXJydW5TdGF0dXMoZGV2KSBcCisgICAgcmVhZGwgKGRldnByaXYtPmxhczArTEFTMF9PVkVSUlVOKQorCisvKiBJbnRlcnJ1cHQgb3ZlcnJ1biBjbGVhciAqLworI2RlZmluZSBSdGRJbnRlcnJ1cHRPdmVycnVuQ2xlYXIoZGV2KSBcCisgICAgd3JpdGVsICgwLCBkZXZwcml2LT5sYXMwK0xBUzBfT1ZFUlJVTikKKworLyogUGFjZXIgY291bnRlciwgMjRiaXQgKi8KKyNkZWZpbmUgUnRkUGFjZXJDb3VudChkZXYpIFwKKyAgICByZWFkbCAoZGV2cHJpdi0+bGFzMCtMQVMwX1BDTEspCisjZGVmaW5lIFJ0ZFBhY2VyQ291bnRlcihkZXYsdikgXAorICAgIHdyaXRlbCAoKHYpICYgMHhmZmZmZmYsZGV2cHJpdi0+bGFzMCtMQVMwX1BDTEspCisKKy8qIEJ1cnN0IGNvdW50ZXIsIDEwYml0ICovCisjZGVmaW5lIFJ0ZEJ1cnN0Q291bnQoZGV2KSBcCisgICAgcmVhZGwgKGRldnByaXYtPmxhczArTEFTMF9CQ0xLKQorI2RlZmluZSBSdGRCdXJzdENvdW50ZXIoZGV2LHYpIFwKKyAgICB3cml0ZWwgKCh2KSAmIDB4M2ZmLGRldnByaXYtPmxhczArTEFTMF9CQ0xLKQorCisvKiBEZWxheSBjb3VudGVyLCAxNmJpdCAqLworI2RlZmluZSBSdGREZWxheUNvdW50KGRldikgXAorICAgIHJlYWRsIChkZXZwcml2LT5sYXMwK0xBUzBfRENMSykKKyNkZWZpbmUgUnRkRGVsYXlDb3VudGVyKGRldix2KSBcCisgICAgd3JpdGVsICgodikgJiAweGZmZmYsIGRldnByaXYtPmxhczArTEFTMF9EQ0xLKQorCisvKiBBYm91dCBjb3VudGVyLCAxNmJpdCAqLworI2RlZmluZSBSdGRBYm91dENvdW50KGRldikgXAorICAgIHJlYWRsIChkZXZwcml2LT5sYXMwK0xBUzBfQUNOVCkKKyNkZWZpbmUgUnRkQWJvdXRDb3VudGVyKGRldix2KSBcCisgICAgd3JpdGVsICgodikgJiAweGZmZmYsIGRldnByaXYtPmxhczArTEFTMF9BQ05UKQorCisvKiBBREMgc2FtcGxlIGNvdW50ZXIsIDEwYml0ICovCisjZGVmaW5lIFJ0ZEFkY1NhbXBsZUNvdW50KGRldikgXAorICAgIHJlYWRsIChkZXZwcml2LT5sYXMwK0xBUzBfQURDX1NDTlQpCisjZGVmaW5lIFJ0ZEFkY1NhbXBsZUNvdW50ZXIoZGV2LHYpIFwKKyAgICB3cml0ZWwgKCh2KSAmIDB4M2ZmLCBkZXZwcml2LT5sYXMwK0xBUzBfQURDX1NDTlQpCisKKy8qIFVzZXIgVGltZXIvQ291bnRlciAoODI1NCkgKi8KKyNkZWZpbmUgUnRkVXRjQ291bnRlckdldChkZXYsbikgXAorICAgIHJlYWRiIChkZXZwcml2LT5sYXMwIFwKKyAgICAgICAgKyAoKG4gPD0gMCkgPyBMQVMwX1VUQzAgOiAoKDEgPT0gbikgPyBMQVMwX1VUQzEgOiBMQVMwX1VUQzIpKSkKKworI2RlZmluZSBSdGRVdGNDb3VudGVyUHV0KGRldixuLHYpIFwKKyAgICB3cml0ZWIgKCh2KSAmIDB4ZmYsIGRldnByaXYtPmxhczAgXAorICAgICAgICArICgobiA8PSAwKSA/IExBUzBfVVRDMCA6ICgoMSA9PSBuKSA/IExBUzBfVVRDMSA6IExBUzBfVVRDMikpKQorCisvKiBTZXQgVVRDICg4MjU0KSBjb250cm9sIGJ5dGUgICovCisjZGVmaW5lIFJ0ZFV0Y0N0cmxQdXQoZGV2LG4sdikgXAorICAgIHdyaXRlYiAoZGV2cHJpdi0+dXRjQ3RybFsobikgJiAzXSA9ICgoKG4pICYgMykgPDwgNikgfCAoKHYpICYgMHgzZiksIFwKKyAgICAgIGRldnByaXYtPmxhczAgKyBMQVMwX1VUQ19DVFJMKQorCisvKiBTZXQgVVRDbiBjbG9jayBzb3VyY2UgKHdyaXRlIG9ubHkpICovCisjZGVmaW5lIFJ0ZFV0Y0Nsb2NrU291cmNlKGRldixuLHYpIFwKKyAgICB3cml0ZXcgKHYsIGRldnByaXYtPmxhczAgXAorICAgICAgICArICgobiA8PSAwKSA/IExBUzBfVVRDMF9DTE9DSyA6IFwKKyAgICAgICAgICAgKCgxID09IG4pID8gTEFTMF9VVEMxX0NMT0NLIDogTEFTMF9VVEMyX0NMT0NLKSkpCisKKy8qIFNldCBVVENuIGdhdGUgc291cmNlICh3cml0ZSBvbmx5KSAqLworI2RlZmluZSBSdGRVdGNHYXRlU291cmNlKGRldixuLHYpIFwKKyAgICB3cml0ZXcgKHYsIGRldnByaXYtPmxhczAgXAorICAgICAgICArICgobiA8PSAwKSA/IExBUzBfVVRDMF9HQVRFIDogXAorICAgICAgICAgICAoKDEgPT0gbikgPyBMQVMwX1VUQzFfR0FURSA6IExBUzBfVVRDMl9HQVRFKSkpCisKKy8qIFVzZXIgb3V0cHV0IE4gc291cmNlIHNlbGVjdCAod3JpdGUgb25seSkgKi8KKyNkZWZpbmUgUnRkVXNyT3V0U291cmNlKGRldixuLHYpIFwKKyAgICB3cml0ZWwgKHYsZGV2cHJpdi0+bGFzMCsoKG4gPD0gMCkgPyBMQVMwX1VPVVQwX1NFTEVDVCA6IExBUzBfVU9VVDFfU0VMRUNUKSkKKworLyogRGlnaXRhbCBJTyAqLworI2RlZmluZSBSdGREaW8wUmVhZChkZXYpIFwKKyAgICAocmVhZHcgKGRldnByaXYtPmxhczArTEFTMF9ESU8wKSAmIDB4ZmYpCisjZGVmaW5lIFJ0ZERpbzBXcml0ZShkZXYsdikgXAorICAgIHdyaXRldyAoKHYpICYgMHhmZiwgZGV2cHJpdi0+bGFzMCtMQVMwX0RJTzApCisKKyNkZWZpbmUgUnRkRGlvMVJlYWQoZGV2KSBcCisgICAgKHJlYWR3IChkZXZwcml2LT5sYXMwK0xBUzBfRElPMSkgJiAweGZmKQorI2RlZmluZSBSdGREaW8xV3JpdGUoZGV2LHYpIFwKKyAgICB3cml0ZXcgKCh2KSAmIDB4ZmYsIGRldnByaXYtPmxhczArTEFTMF9ESU8xKQorCisjZGVmaW5lIFJ0ZERpb1N0YXR1c1JlYWQoZGV2KSBcCisgICAgKHJlYWR3IChkZXZwcml2LT5sYXMwK0xBUzBfRElPX1NUQVRVUykgJiAweGZmKQorI2RlZmluZSBSdGREaW9TdGF0dXNXcml0ZShkZXYsdikgXAorICAgIHdyaXRldyAoKGRldnByaXYtPmRpb1N0YXR1cyA9ICh2KSksIGRldnByaXYtPmxhczArTEFTMF9ESU9fU1RBVFVTKQorCisjZGVmaW5lIFJ0ZERpbzBDdHJsUmVhZChkZXYpIFwKKyAgICAocmVhZHcgKGRldnByaXYtPmxhczArTEFTMF9ESU8wX0NUUkwpICYgMHhmZikKKyNkZWZpbmUgUnRkRGlvMEN0cmxXcml0ZShkZXYsdikgXAorICAgIHdyaXRldyAoKHYpICYgMHhmZiwgZGV2cHJpdi0+bGFzMCtMQVMwX0RJTzBfQ1RSTCkKKworLyogRGlnaXRhbCB0byBBbmFsb2cgY29udmVydGVyICovCisvKiBXcml0ZSBvbmUgZGF0YSB2YWx1ZSAoc2lnbiArIDEyYml0ICsgbWFya2VyIGJpdHMpICovCisvKiBOb3RlOiBtYXRjaGVzIHdoYXQgRE1BIHdvdWxkIHB1dC4gIEFjdHVhbCB2YWx1ZSA8PCAzICovCisjZGVmaW5lIFJ0ZERhY0ZpZm9QdXQoZGV2LG4sdikgXAorICAgIHdyaXRldyAoKHYpLCBkZXZwcml2LT5sYXMxICsoKChuKSA9PSAwKSA/IExBUzFfREFDMV9GSUZPIDogTEFTMV9EQUMyX0ZJRk8pKQorCisvKiBTdGFydCBzaW5nbGUgREFDIGNvbnZlcnNpb24gKi8KKyNkZWZpbmUgUnRkRGFjVXBkYXRlKGRldixuKSBcCisgICAgd3JpdGV3ICgwLCBkZXZwcml2LT5sYXMwICsoKChuKSA9PSAwKSA/IExBUzBfREFDMSA6IExBUzBfREFDMikpCisKKy8qIFN0YXJ0IHNpbmdsZSBEQUMgY29udmVyc2lvbiBvbiBib3RoIERBQ3MgKi8KKyNkZWZpbmUgUnRkRGFjQm90aFVwZGF0ZShkZXYpIFwKKyAgICB3cml0ZXcgKDAsIGRldnByaXYtPmxhczArTEFTMF9EQUMpCisKKy8qIFNldCBEQUMgb3V0cHV0IHR5cGUgYW5kIHJhbmdlICovCisjZGVmaW5lIFJ0ZERhY1JhbmdlKGRldixuLHYpIFwKKyAgICB3cml0ZXcgKCh2KSAmIDcsIGRldnByaXYtPmxhczAgXAorCSsoKChuKSA9PSAwKSA/IExBUzBfREFDMV9DVFJMIDogTEFTMF9EQUMyX0NUUkwpKQorCisvKiBSZXNldCBEQUMgRklGTyAqLworI2RlZmluZSBSdGREYWNDbGVhckZpZm8oZGV2LG4pIFwKKyAgICB3cml0ZWwgKDAsIGRldnByaXYtPmxhczArKCgobikgPT0gMCkgPyBMQVMwX0RBQzFfUkVTRVQgOiBMQVMwX0RBQzJfUkVTRVQpKQorCisvKiBTZXQgc291cmNlIGZvciBETUEgMCAod3JpdGUgb25seSwgc2hhZG93PykgKi8KKyNkZWZpbmUgUnRkRG1hMFNvdXJjZShkZXYsbikgXAorICAgIHdyaXRlbCAoKG4pICYgMHhmLCBkZXZwcml2LT5sYXMwK0xBUzBfRE1BMF9TUkMpCisKKy8qIFNldCBzb3VyY2UgZm9yIERNQSAxICh3cml0ZSBvbmx5LCBzaGFkb3c/KSAqLworI2RlZmluZSBSdGREbWExU291cmNlKGRldixuKSBcCisgICAgd3JpdGVsICgobikgJiAweGYsIGRldnByaXYtPmxhczArTEFTMF9ETUExX1NSQykKKworLyogUmVzZXQgYm9hcmQgc3RhdGUgZm9yIERNQSAwICovCisjZGVmaW5lIFJ0ZERtYTBSZXNldChkZXYpIFwKKyAgICB3cml0ZWwgKDAsIGRldnByaXYtPmxhczArTEFTMF9ETUEwX1JFU0VUKQorCisvKiBSZXNldCBib2FyZCBzdGF0ZSBmb3IgRE1BIDEgKi8KKyNkZWZpbmUgUnRkRG1hMVJlc2V0KGRldikgXAorICAgIHdyaXRlbCAoMCwgZGV2cHJpdi0+bGFzMCtMQVMwX0RNQTFfU1JDKQorCisvKiBQTFg5MDgwIGludGVycnVwdCBtYXNrIGFuZCBzdGF0dXMgKi8KKyNkZWZpbmUgUnRkUGx4SW50ZXJydXB0UmVhZChkZXYpIFwKKyAgICByZWFkbCAoZGV2cHJpdi0+bGNmZytMQ0ZHX0lUQ1NSKQorI2RlZmluZSBSdGRQbHhJbnRlcnJ1cHRXcml0ZShkZXYsdikgXAorICAgIHdyaXRlbCAodiwgZGV2cHJpdi0+bGNmZytMQ0ZHX0lUQ1NSKQorCisvKiBTZXQgIG1vZGUgZm9yIERNQSAwICovCisjZGVmaW5lIFJ0ZERtYTBNb2RlKGRldixtKSBcCisgICAgd3JpdGVsICgobSksIGRldnByaXYtPmxjZmcrTENGR19ETUFNT0RFMCkKKworLyogU2V0IFBDSSBhZGRyZXNzIGZvciBETUEgMCAqLworI2RlZmluZSBSdGREbWEwUGNpQWRkcihkZXYsYSkgXAorICAgIHdyaXRlbCAoKGEpLCBkZXZwcml2LT5sY2ZnK0xDRkdfRE1BUEFEUjApCisKKy8qIFNldCBsb2NhbCBhZGRyZXNzIGZvciBETUEgMCAqLworI2RlZmluZSBSdGREbWEwTG9jYWxBZGRyKGRldixhKSBcCisgICAgd3JpdGVsICgoYSksIGRldnByaXYtPmxjZmcrTENGR19ETUFMQURSMCkKKworLyogU2V0IGJ5dGUgY291bnQgZm9yIERNQSAwICovCisjZGVmaW5lIFJ0ZERtYTBDb3VudChkZXYsYykgXAorICAgIHdyaXRlbCAoKGMpLCBkZXZwcml2LT5sY2ZnK0xDRkdfRE1BU0laMCkKKworLyogU2V0IG5leHQgZGVzY3JpcHRvciBmb3IgRE1BIDAgKi8KKyNkZWZpbmUgUnRkRG1hME5leHQoZGV2LGEpIFwKKyAgICB3cml0ZWwgKChhKSwgZGV2cHJpdi0+bGNmZytMQ0ZHX0RNQURQUjApCisKKy8qIFNldCAgbW9kZSBmb3IgRE1BIDEgKi8KKyNkZWZpbmUgUnRkRG1hMU1vZGUoZGV2LG0pIFwKKyAgICB3cml0ZWwgKChtKSwgZGV2cHJpdi0+bGNmZytMQ0ZHX0RNQU1PREUxKQorCisvKiBTZXQgUENJIGFkZHJlc3MgZm9yIERNQSAxICovCisjZGVmaW5lIFJ0ZERtYTFQY2lBZGRyKGRldixhKSBcCisgICAgd3JpdGVsICgoYSksIGRldnByaXYtPmxjZmcrTENGR19ETUFBRFIxKQorCisvKiBTZXQgbG9jYWwgYWRkcmVzcyBmb3IgRE1BIDEgKi8KKyNkZWZpbmUgUnRkRG1hMUxvY2FsQWRkcihkZXYsYSkgXAorICAgIHdyaXRlbCAoKGEpLCBkZXZwcml2LT5sY2ZnK0xDRkdfRE1BTEFEUjEpCisKKy8qIFNldCBieXRlIGNvdW50IGZvciBETUEgMSAqLworI2RlZmluZSBSdGREbWExQ291bnQoZGV2LGMpIFwKKyAgICB3cml0ZWwgKChjKSwgZGV2cHJpdi0+bGNmZytMQ0ZHX0RNQVNJWjEpCisKKy8qIFNldCBuZXh0IGRlc2NyaXB0b3IgZm9yIERNQSAxICovCisjZGVmaW5lIFJ0ZERtYTFOZXh0KGRldixhKSBcCisgICAgd3JpdGVsICgoYSksIGRldnByaXYtPmxjZmcrTENGR19ETUFEUFIxKQorCisvKiBTZXQgY29udHJvbCBmb3IgRE1BIDAgKHdyaXRlIG9ubHksIHNoYWRvdz8pICovCisjZGVmaW5lIFJ0ZERtYTBDb250cm9sKGRldixuKSBcCisgICAgd3JpdGViIChkZXZwcml2LT5kbWEwQ29udHJvbCA9IChuKSwgZGV2cHJpdi0+bGNmZytMQ0ZHX0RNQUNTUjApCisKKy8qIEdldCBzdGF0dXMgZm9yIERNQSAwICovCisjZGVmaW5lIFJ0ZERtYTBTdGF0dXMoZGV2KSBcCisgICAgcmVhZGIgKGRldnByaXYtPmxjZmcrTENGR19ETUFDU1IwKQorCisvKiBTZXQgY29udHJvbCBmb3IgRE1BIDEgKHdyaXRlIG9ubHksIHNoYWRvdz8pICovCisjZGVmaW5lIFJ0ZERtYTFDb250cm9sKGRldixuKSBcCisgICAgd3JpdGViIChkZXZwcml2LT5kbWExQ29udHJvbCA9IChuKSwgZGV2cHJpdi0+bGNmZytMQ0ZHX0RNQUNTUjEpCisKKy8qIEdldCBzdGF0dXMgZm9yIERNQSAxICovCisjZGVmaW5lIFJ0ZERtYTFTdGF0dXMoZGV2KSBcCisgICAgcmVhZGIgKGRldnByaXYtPmxjZmcrTENGR19ETUFDU1IxKQorCisvKgorICogVGhlIGNvbWVkaV9kcml2ZXIgc3RydWN0dXJlIHRlbGxzIHRoZSBDb21lZGkgY29yZSBtb2R1bGUKKyAqIHdoaWNoIGZ1bmN0aW9ucyB0byBjYWxsIHRvIGNvbmZpZ3VyZS9kZWNvbmZpZ3VyZSAoYXR0YWMvZGV0YWNoKQorICogdGhlIGJvYXJkLCBhbmQgYWxzbyBhYm91dCB0aGUga2VybmVsIG1vZHVsZSB0aGF0IGNvbnRhaW5zCisgKiB0aGUgZGV2aWNlIGNvZGUuCisgKi8KK3N0YXRpYyBpbnQgcnRkX2F0dGFjaChjb21lZGlfZGV2aWNlICogZGV2LCBjb21lZGlfZGV2Y29uZmlnICogaXQpOworc3RhdGljIGludCBydGRfZGV0YWNoKGNvbWVkaV9kZXZpY2UgKiBkZXYpOworCitzdGF0aWMgY29tZWRpX2RyaXZlciBydGQ1MjBEcml2ZXIgPSB7CisgICAgICBkcml2ZXJfbmFtZTogRFJWX05BTUUsCisgICAgICBtb2R1bGU6VEhJU19NT0RVTEUsCisgICAgICBhdHRhY2g6cnRkX2F0dGFjaCwKKyAgICAgIGRldGFjaDpydGRfZGV0YWNoLAorfTsKKworc3RhdGljIGludCBydGRfYWlfcmluc24oY29tZWRpX2RldmljZSAqIGRldiwgY29tZWRpX3N1YmRldmljZSAqIHMsCisJY29tZWRpX2luc24gKiBpbnNuLCBsc2FtcGxfdCAqIGRhdGEpOworc3RhdGljIGludCBydGRfYW9fd2luc24oY29tZWRpX2RldmljZSAqIGRldiwgY29tZWRpX3N1YmRldmljZSAqIHMsCisJY29tZWRpX2luc24gKiBpbnNuLCBsc2FtcGxfdCAqIGRhdGEpOworc3RhdGljIGludCBydGRfYW9fcmluc24oY29tZWRpX2RldmljZSAqIGRldiwgY29tZWRpX3N1YmRldmljZSAqIHMsCisJY29tZWRpX2luc24gKiBpbnNuLCBsc2FtcGxfdCAqIGRhdGEpOworc3RhdGljIGludCBydGRfZGlvX2luc25fYml0cyhjb21lZGlfZGV2aWNlICogZGV2LCBjb21lZGlfc3ViZGV2aWNlICogcywKKwljb21lZGlfaW5zbiAqIGluc24sIGxzYW1wbF90ICogZGF0YSk7CitzdGF0aWMgaW50IHJ0ZF9kaW9faW5zbl9jb25maWcoY29tZWRpX2RldmljZSAqIGRldiwgY29tZWRpX3N1YmRldmljZSAqIHMsCisJY29tZWRpX2luc24gKiBpbnNuLCBsc2FtcGxfdCAqIGRhdGEpOworc3RhdGljIGludCBydGRfYWlfY21kdGVzdChjb21lZGlfZGV2aWNlICogZGV2LCBjb21lZGlfc3ViZGV2aWNlICogcywKKwljb21lZGlfY21kICogY21kKTsKK3N0YXRpYyBpbnQgcnRkX2FpX2NtZChjb21lZGlfZGV2aWNlICogZGV2LCBjb21lZGlfc3ViZGV2aWNlICogcyk7CitzdGF0aWMgaW50IHJ0ZF9haV9jYW5jZWwoY29tZWRpX2RldmljZSAqIGRldiwgY29tZWRpX3N1YmRldmljZSAqIHMpOworLy9zdGF0aWMgaW50IHJ0ZF9haV9wb2xsIChjb21lZGlfZGV2aWNlICpkZXYsY29tZWRpX3N1YmRldmljZSAqcyk7CitzdGF0aWMgaW50IHJ0ZF9uc190b190aW1lcih1bnNpZ25lZCBpbnQgKm5zLCBpbnQgcm91bmRNb2RlKTsKK3N0YXRpYyBpcnFyZXR1cm5fdCBydGRfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmQgUFRfUkVHU19BUkcpOworc3RhdGljIGludCBydGQ1MjBfcHJvYmVfZmlmb19kZXB0aChjb21lZGlfZGV2aWNlICpkZXYpOworCisvKgorICogQXR0YWNoIGlzIGNhbGxlZCBieSB0aGUgQ29tZWRpIGNvcmUgdG8gY29uZmlndXJlIHRoZSBkcml2ZXIKKyAqIGZvciBhIHBhcnRpY3VsYXIgYm9hcmQuICBJZiB5b3Ugc3BlY2lmaWVkIGEgYm9hcmRfbmFtZSBhcnJheQorICogaW4gdGhlIGRyaXZlciBzdHJ1Y3R1cmUsIGRldi0+Ym9hcmRfcHRyIGNvbnRhaW5zIHRoYXQKKyAqIGFkZHJlc3MuCisgKi8KK3N0YXRpYyBpbnQgcnRkX2F0dGFjaChjb21lZGlfZGV2aWNlICogZGV2LCBjb21lZGlfZGV2Y29uZmlnICogaXQpCit7CQkJCS8qIGJvYXJkIG5hbWUgYW5kIG9wdGlvbnMgZmxhZ3MgKi8KKwljb21lZGlfc3ViZGV2aWNlICpzOworCXN0cnVjdCBwY2lfZGV2ICpwY2lkZXY7CisJaW50IHJldDsKKwlyZXNvdXJjZV9zaXplX3QgcGh5c0xhczA7CS8qIGNvbmZpZ3VhdGlvbiAqLworCXJlc291cmNlX3NpemVfdCBwaHlzTGFzMTsJLyogZGF0YSBhcmVhICovCisJcmVzb3VyY2Vfc2l6ZV90IHBoeXNMY2ZnOwkvKiBQTFg5MDgwICovCisjaWZkZWYgVVNFX0RNQQorCWludCBpbmRleDsKKyNlbmRpZgorCisJcHJpbnRrKCJjb21lZGklZDogcnRkNTIwIGF0dGFjaGluZy5cbiIsIGRldi0+bWlub3IpOworCisjaWYgZGVmaW5lZCAoQ09ORklHX0NPTUVESV9ERUJVRykgJiYgZGVmaW5lZCAoVVNFX0RNQSkKKwkvKiBZb3UgY2FuIHNldCB0aGlzIGEgbG9hZCB0aW1lOiBtb2Rwcm9iZSBjb21lZGkgY29tZWRpX2RlYnVnPTEgKi8KKwlpZiAoMCA9PSBjb21lZGlfZGVidWcpCS8qIGZvcmNlIERNQSBkZWJ1ZyBwcmludGtzICovCisJCWNvbWVkaV9kZWJ1ZyA9IDE7CisjZW5kaWYKKworCS8qCisJICogQWxsb2NhdGUgdGhlIHByaXZhdGUgc3RydWN0dXJlIGFyZWEuICBhbGxvY19wcml2YXRlKCkgaXMgYQorCSAqIGNvbnZlbmllbnQgbWFjcm8gZGVmaW5lZCBpbiBjb21lZGlkZXYuaC4KKwkgKi8KKwlpZiAoYWxsb2NfcHJpdmF0ZShkZXYsIHNpemVvZihydGRQcml2YXRlKSkgPCAwKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qCisJICogUHJvYmUgdGhlIGRldmljZSB0byBkZXRlcm1pbmUgd2hhdCBkZXZpY2UgaW4gdGhlIHNlcmllcyBpdCBpcy4KKwkgKi8KKwlmb3IgKHBjaWRldiA9IHBjaV9nZXRfZGV2aWNlKFBDSV9WRU5ET1JfSURfUlRELCBQQ0lfQU5ZX0lELCBOVUxMKTsKKwkJcGNpZGV2ICE9IE5VTEw7CisJCXBjaWRldiA9IHBjaV9nZXRfZGV2aWNlKFBDSV9WRU5ET1JfSURfUlRELCBQQ0lfQU5ZX0lELCBwY2lkZXYpKSB7CisJCWludCBpOworCisJCWlmIChpdC0+b3B0aW9uc1swXSB8fCBpdC0+b3B0aW9uc1sxXSkgeworCQkJaWYgKHBjaWRldi0+YnVzLT5udW1iZXIgIT0gaXQtPm9wdGlvbnNbMF0KKwkJCQl8fCBQQ0lfU0xPVChwY2lkZXYtPmRldmZuKSAhPQorCQkJCWl0LT5vcHRpb25zWzFdKSB7CisJCQkJY29udGludWU7CisJCQl9CisJCX0KKwkJZm9yKGkgPSAwOyBpIDwgc2l6ZW9mKHJ0ZDUyMEJvYXJkcykgLyBzaXplb2YocnRkNTIwQm9hcmRzWzBdKTsgKytpKQorCQl7CisJCQlpZihwY2lkZXYtPmRldmljZSA9PSBydGQ1MjBCb2FyZHNbaV0uZGV2aWNlX2lkKQorCQkJeworCQkJCWRldi0+Ym9hcmRfcHRyID0gJnJ0ZDUyMEJvYXJkc1tpXTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZihkZXYtPmJvYXJkX3B0cikgYnJlYWs7CS8qIGZvdW5kIG9uZSAqLworCX0KKwlpZiAoIXBjaWRldikgeworCQlpZiAoaXQtPm9wdGlvbnNbMF0gJiYgaXQtPm9wdGlvbnNbMV0pIHsKKwkJCXByaW50aygiTm8gUlREIGNhcmQgYXQgYnVzPSVkIHNsb3Q9JWQuXG4iLAorCQkJCWl0LT5vcHRpb25zWzBdLCBpdC0+b3B0aW9uc1sxXSk7CisJCX0gZWxzZSB7CisJCQlwcmludGsoIk5vIFJURCBjYXJkIGZvdW5kLlxuIik7CisJCX0KKwkJcmV0dXJuIC1FSU87CisJfQorCWRldnByaXYtPnBjaV9kZXYgPSBwY2lkZXY7CisJZGV2LT5ib2FyZF9uYW1lID0gdGhpc2JvYXJkLT5uYW1lOworCisJaWYgKChyZXQgPSBjb21lZGlfcGNpX2VuYWJsZShwY2lkZXYsIERSVl9OQU1FKSkgPCAwKSB7CisJCXByaW50aygiRmFpbGVkIHRvIGVuYWJsZSBQQ0kgZGV2aWNlIGFuZCByZXF1ZXN0IHJlZ2lvbnMuXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJZGV2cHJpdi0+Z290X3JlZ2lvbnMgPSAxOworCisJLyoKKwkgKiBJbml0aWFsaXplIGJhc2UgYWRkcmVzc2VzCisJICovCisJLyogR2V0IHRoZSBwaHlzaWNhbCBhZGRyZXNzIGZyb20gUENJIGNvbmZpZyAqLworCXBoeXNMYXMwID0gcGNpX3Jlc291cmNlX3N0YXJ0KGRldnByaXYtPnBjaV9kZXYsIExBUzBfUENJSU5ERVgpOworCXBoeXNMYXMxID0gcGNpX3Jlc291cmNlX3N0YXJ0KGRldnByaXYtPnBjaV9kZXYsIExBUzFfUENJSU5ERVgpOworCXBoeXNMY2ZnID0gcGNpX3Jlc291cmNlX3N0YXJ0KGRldnByaXYtPnBjaV9kZXYsIExDRkdfUENJSU5ERVgpOworCS8qIE5vdyBoYXZlIHRoZSBrZXJuZWwgbWFwIHRoaXMgaW50byBtZW1vcnkgKi8KKwkvKiBBU1NVTUUgcGFnZSBhbGlnbmVkICovCisJZGV2cHJpdi0+bGFzMCA9IGlvcmVtYXBfbm9jYWNoZShwaHlzTGFzMCwgTEFTMF9QQ0lTSVpFKTsKKwlkZXZwcml2LT5sYXMxID0gaW9yZW1hcF9ub2NhY2hlKHBoeXNMYXMxLCBMQVMxX1BDSVNJWkUpOworCWRldnByaXYtPmxjZmcgPSBpb3JlbWFwX25vY2FjaGUocGh5c0xjZmcsIExDRkdfUENJU0laRSk7CisKKwlpZiAoIWRldnByaXYtPmxhczAgfHwgIWRldnByaXYtPmxhczEgfHwgIWRldnByaXYtPmxjZmcpIHsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJRFBSSU5USygiJXM6IExBUzA9JWxseCwgTEFTMT0lbGx4LCBDRkc9JWxseC5cbiIsIGRldi0+Ym9hcmRfbmFtZSwKKwkJKHVuc2lnbmVkIGxvbmcgbG9uZylwaHlzTGFzMCwgKHVuc2lnbmVkIGxvbmcgbG9uZylwaHlzTGFzMSwKKwkJKHVuc2lnbmVkIGxvbmcgbG9uZylwaHlzTGNmZyk7CisJewkJCS8qIFRoZSBSVEQgZHJpdmVyIGRvZXMgdGhpcyAqLworCQl1bnNpZ25lZCBjaGFyIHBjaV9sYXRlbmN5OworCQl1MTYgcmV2aXNpb247CisJCS8qdWludDMyX3QgZXBsZF92ZXJzaW9uOyAqLworCisJCXBjaV9yZWFkX2NvbmZpZ193b3JkKGRldnByaXYtPnBjaV9kZXYsIFBDSV9SRVZJU0lPTl9JRCwKKwkJCSZyZXZpc2lvbik7CisJCURQUklOVEsoIiVzOiBQQ0kgcmV2aXNpb24gJWQuXG4iLCBkZXYtPmJvYXJkX25hbWUsIHJldmlzaW9uKTsKKworCQlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXZwcml2LT5wY2lfZGV2LAorCQkJUENJX0xBVEVOQ1lfVElNRVIsICZwY2lfbGF0ZW5jeSk7CisJCWlmIChwY2lfbGF0ZW5jeSA8IDMyKSB7CisJCQlwcmludGsoIiVzOiBQQ0kgbGF0ZW5jeSBjaGFuZ2VkIGZyb20gJWQgdG8gJWRcbiIsCisJCQkJZGV2LT5ib2FyZF9uYW1lLCBwY2lfbGF0ZW5jeSwgMzIpOworCQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldnByaXYtPnBjaV9kZXYsCisJCQkJUENJX0xBVEVOQ1lfVElNRVIsIDMyKTsKKwkJfSBlbHNlIHsKKwkJCURQUklOVEsoInJ0ZDUyMDogUENJIGxhdGVuY3kgPSAlZFxuIiwgcGNpX2xhdGVuY3kpOworCQl9CisKKwkJLyogVW5kb2N1bWVudGVkIEVQTEQgdmVyc2lvbiAoZG9lc250IG1hdGNoIFJURCBkcml2ZXIgcmVzdWx0cykgKi8KKwkJLypEUFJJTlRLICgicnRkNTIwOiBSZWFkaW5nIGVwbGQgZnJvbSAlcFxuIiwKKwkJICAgZGV2cHJpdi0+bGFzMCswKTsKKwkJICAgZXBsZF92ZXJzaW9uID0gcmVhZGwgKGRldnByaXYtPmxhczArMCk7CisJCSAgIGlmICgoZXBsZF92ZXJzaW9uICYgMHhGMCkgPj4gNCA9PSAweDBGKSB7CisJCSAgIERQUklOVEsoInJ0ZDUyMDogcHJlLXY4IEVQTEQuICgleClcbiIsIGVwbGRfdmVyc2lvbik7CisJCSAgIH0gZWxzZSB7CisJCSAgIERQUklOVEsoInJ0ZDUyMDogRVBMRCB2ZXJzaW9uICV4LlxuIiwgZXBsZF92ZXJzaW9uID4+IDQpOworCQkgICB9ICovCisJfQorCisJLyogU2hvdyBib2FyZCBjb25maWd1cmF0aW9uICovCisJcHJpbnRrKCIlczoiLCBkZXYtPmJvYXJkX25hbWUpOworCisJLyoKKwkgKiBBbGxvY2F0ZSB0aGUgc3ViZGV2aWNlIHN0cnVjdHVyZXMuICBhbGxvY19zdWJkZXZpY2UoKSBpcyBhCisJICogY29udmVuaWVudCBtYWNybyBkZWZpbmVkIGluIGNvbWVkaWRldi5oLgorCSAqLworCWlmIChhbGxvY19zdWJkZXZpY2VzKGRldiwgNCkgPCAwKSB7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXMgPSBkZXYtPnN1YmRldmljZXMgKyAwOworCWRldi0+cmVhZF9zdWJkZXYgPSBzOworCS8qIGFuYWxvZyBpbnB1dCBzdWJkZXZpY2UgKi8KKwlzLT50eXBlID0gQ09NRURJX1NVQkRfQUk7CisJcy0+c3ViZGV2X2ZsYWdzID0KKwkJU0RGX1JFQURBQkxFIHwgU0RGX0dST1VORCB8IFNERl9DT01NT04gfCBTREZfRElGRiB8CisJCVNERl9DTURfUkVBRDsKKwlzLT5uX2NoYW4gPSB0aGlzYm9hcmQtPmFpQ2hhbnM7CisJcy0+bWF4ZGF0YSA9ICgxIDw8IHRoaXNib2FyZC0+YWlCaXRzKSAtIDE7CisJaWYgKHRoaXNib2FyZC0+YWlNYXhHYWluIDw9IDMyKSB7CisJCXMtPnJhbmdlX3RhYmxlID0gJnJ0ZF9haV83NTIwX3JhbmdlOworCX0gZWxzZSB7CisJCXMtPnJhbmdlX3RhYmxlID0gJnJ0ZF9haV80NTIwX3JhbmdlOworCX0KKwlzLT5sZW5fY2hhbmxpc3QgPSBSVERfTUFYX0NIQU5MSVNUOwkvKiBkZXZwcml2LT5maWZvTGVuICovCisJcy0+aW5zbl9yZWFkID0gcnRkX2FpX3JpbnNuOworCXMtPmRvX2NtZCA9IHJ0ZF9haV9jbWQ7CisJcy0+ZG9fY21kdGVzdCA9IHJ0ZF9haV9jbWR0ZXN0OworCXMtPmNhbmNlbCA9IHJ0ZF9haV9jYW5jZWw7CisJLypzLT5wb2xsID0gcnRkX2FpX3BvbGw7ICovLyogbm90IHJlYWR5IHlldCAqLworCisJcyA9IGRldi0+c3ViZGV2aWNlcyArIDE7CisJLyogYW5hbG9nIG91dHB1dCBzdWJkZXZpY2UgKi8KKwlzLT50eXBlID0gQ09NRURJX1NVQkRfQU87CisJcy0+c3ViZGV2X2ZsYWdzID0gU0RGX1dSSVRBQkxFOworCXMtPm5fY2hhbiA9IDI7CisJcy0+bWF4ZGF0YSA9ICgxIDw8IHRoaXNib2FyZC0+YWlCaXRzKSAtIDE7CisJcy0+cmFuZ2VfdGFibGUgPSAmcnRkX2FvX3JhbmdlOworCXMtPmluc25fd3JpdGUgPSBydGRfYW9fd2luc247CisJcy0+aW5zbl9yZWFkID0gcnRkX2FvX3JpbnNuOworCisJcyA9IGRldi0+c3ViZGV2aWNlcyArIDI7CisJLyogZGlnaXRhbCBpL28gc3ViZGV2aWNlICovCisJcy0+dHlwZSA9IENPTUVESV9TVUJEX0RJTzsKKwlzLT5zdWJkZXZfZmxhZ3MgPSBTREZfUkVBREFCTEUgfCBTREZfV1JJVEFCTEU7CisJLyogd2Ugb25seSBzdXBwb3J0IHBvcnQgMCByaWdodCBub3cuICBJZ25vcmluZyBwb3J0IDEgYW5kIHVzZXIgSU8gKi8KKwlzLT5uX2NoYW4gPSA4OworCXMtPm1heGRhdGEgPSAxOworCXMtPnJhbmdlX3RhYmxlID0gJnJhbmdlX2RpZ2l0YWw7CisJcy0+aW5zbl9iaXRzID0gcnRkX2Rpb19pbnNuX2JpdHM7CisJcy0+aW5zbl9jb25maWcgPSBydGRfZGlvX2luc25fY29uZmlnOworCisJLyogdGltZXIvY291bnRlciBzdWJkZXZpY2VzIChub3QgY3VycmVudGx5IHN1cHBvcnRlZCkgKi8KKwlzID0gZGV2LT5zdWJkZXZpY2VzICsgMzsKKwlzLT50eXBlID0gQ09NRURJX1NVQkRfQ09VTlRFUjsKKwlzLT5zdWJkZXZfZmxhZ3MgPSBTREZfUkVBREFCTEUgfCBTREZfV1JJVEFCTEU7CisJcy0+bl9jaGFuID0gMzsKKwlzLT5tYXhkYXRhID0gMHhmZmZmOworCisJLyogaW5pdGlhbGl6ZSBib2FyZCwgcGVyIFJURCBzcGVjICovCisJLyogYWxzbywgaW5pdGlhbGl6ZSBzaGFkb3cgcmVnaXN0ZXJzICovCisJUnRkUmVzZXRCb2FyZChkZXYpOworCWNvbWVkaV91ZGVsYXkoMTAwKTsJLyogbmVlZGVkPyAqLworCVJ0ZFBseEludGVycnVwdFdyaXRlKGRldiwgMCk7CisJUnRkSW50ZXJydXB0TWFzayhkZXYsIDApOwkvKiBhbmQgc2V0cyBzaGFkb3cgKi8KKwlSdGRJbnRlcnJ1cHRDbGVhck1hc2soZGV2LCB+MCk7CS8qIGFuZCBzZXRzIHNoYWRvdyAqLworCVJ0ZEludGVycnVwdENsZWFyKGRldik7CS8qIGNsZWFycyBiaXRzIHNldCBieSBtYXNrICovCisJUnRkSW50ZXJydXB0T3ZlcnJ1bkNsZWFyKGRldik7CisJUnRkQ2xlYXJDR1QoZGV2KTsKKwlSdGRBZGNDbGVhckZpZm8oZGV2KTsKKwlSdGREYWNDbGVhckZpZm8oZGV2LCAwKTsKKwlSdGREYWNDbGVhckZpZm8oZGV2LCAxKTsKKwkvKiBjbGVhciBkaWdpdGFsIElPIGZpZm8gKi8KKwlSdGREaW9TdGF0dXNXcml0ZShkZXYsIDApOwkvKiBzYWZlIHN0YXRlLCBzZXQgc2hhZG93ICovCisJUnRkVXRjQ3RybFB1dChkZXYsIDAsIDB4MzApOwkvKiBzYWZlIHN0YXRlLCBzZXQgc2hhZG93ICovCisJUnRkVXRjQ3RybFB1dChkZXYsIDEsIDB4MzApOwkvKiBzYWZlIHN0YXRlLCBzZXQgc2hhZG93ICovCisJUnRkVXRjQ3RybFB1dChkZXYsIDIsIDB4MzApOwkvKiBzYWZlIHN0YXRlLCBzZXQgc2hhZG93ICovCisJUnRkVXRjQ3RybFB1dChkZXYsIDMsIDApOwkvKiBzYWZlIHN0YXRlLCBzZXQgc2hhZG93ICovCisJLyogVE9ETzogc2V0IHVzZXIgb3V0IHNvdXJjZSA/Pz8gKi8KKworCS8qIGNoZWNrIGlmIG91ciBpbnRlcnJ1cHQgaXMgYXZhaWxhYmxlIGFuZCBnZXQgaXQgKi8KKwlpZiAoKHJldCA9IGNvbWVkaV9yZXF1ZXN0X2lycShkZXZwcml2LT5wY2lfZGV2LT5pcnEsIHJ0ZF9pbnRlcnJ1cHQsCisJCQkJSVJRRl9TSEFSRUQsIERSVl9OQU1FLCBkZXYpKSA8IDApIHsKKwkJcHJpbnRrKCJDb3VsZCBub3QgZ2V0IGludGVycnVwdCEgKCV1KVxuIiwKKwkJCWRldnByaXYtPnBjaV9kZXYtPmlycSk7CisJCXJldHVybiByZXQ7CisJfQorCWRldi0+aXJxID0gZGV2cHJpdi0+cGNpX2Rldi0+aXJxOworCXByaW50aygiKCBpcnE9JXUgKSIsIGRldi0+aXJxKTsKKworCXJldCA9IHJ0ZDUyMF9wcm9iZV9maWZvX2RlcHRoKGRldik7CisJaWYocmV0IDwgMCkgeworCQlyZXR1cm4gcmV0OworCX0KKwlkZXZwcml2LT5maWZvTGVuID0gcmV0OworCXByaW50aygiKCBmaWZvTGVuPSVkICkiLCBkZXZwcml2LT5maWZvTGVuKTsKKworI2lmZGVmIFVTRV9ETUEKKwlpZiAoZGV2LT5pcnEgPiAwKSB7CisJCXByaW50aygiKCBETUEgYnVmZj0lZCApXG4iLCBETUFfQ0hBSU5fQ09VTlQpOworCQkvKiBUaGUgUExYOTA4MCBoYXMgMiBETUEgY29udHJvbGxlcnMsIGJ1dCB0aGVyZSBjb3VsZCBiZSA0IHNvdXJjZXM6CisJCSAgIEFEQywgZGlnaXRhbCwgREFDMSwgYW5kIERBQzIuICBTaW5jZSBvbmx5IHRoZSBBREMgc3VwcG9ydHMgY21kIG1vZGUKKwkJICAgcmlnaHQgbm93LCB0aGlzIGlzbid0IGFuIGlzc3VlICh5ZXQpICovCisJCWRldnByaXYtPmRtYTBPZmZzZXQgPSAwOworCisJCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IERNQV9DSEFJTl9DT1VOVDsgaW5kZXgrKykgeworCQkJZGV2cHJpdi0+ZG1hMEJ1ZmZbaW5kZXhdID0KKwkJCQlwY2lfYWxsb2NfY29uc2lzdGVudChkZXZwcml2LT5wY2lfZGV2LAorCQkJCXNpemVvZih1MTYpICogZGV2cHJpdi0+Zmlmb0xlbiAvIDIsCisJCQkJJmRldnByaXYtPmRtYTBCdWZmUGh5c0FkZHJbaW5kZXhdKTsKKwkJCWlmIChkZXZwcml2LT5kbWEwQnVmZltpbmRleF0gPT0gTlVMTCkgeworCQkJCXJldCA9IC1FTk9NRU07CisJCQkJZ290byBydGRfYXR0YWNoX2RpZV9lcnJvcjsKKwkJCX0KKwkJCS8qRFBSSU5USyAoImJ1ZmZbJWRdIEAgJXAgdmlydHVhbCwgJXggUENJXG4iLAorCQkJICAgaW5kZXgsCisJCQkgICBkZXZwcml2LT5kbWEwQnVmZltpbmRleF0sIGRldnByaXYtPmRtYTBCdWZmUGh5c0FkZHJbaW5kZXhdKTsgKi8KKwkJfQorCisJCS8qIHNldHVwIERNQSBkZXNjcmlwdG9yIHJpbmcgKHVzZSBjcHVfdG9fbGUzMiBmb3IgYnl0ZSBvcmRlcmluZz8pICovCisJCWRldnByaXYtPmRtYTBDaGFpbiA9CisJCQlwY2lfYWxsb2NfY29uc2lzdGVudChkZXZwcml2LT5wY2lfZGV2LAorCQkJc2l6ZW9mKHN0cnVjdCBwbHhfZG1hX2Rlc2MpICogRE1BX0NIQUlOX0NPVU5ULAorCQkJJmRldnByaXYtPmRtYTBDaGFpblBoeXNBZGRyKTsKKwkJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgRE1BX0NIQUlOX0NPVU5UOyBpbmRleCsrKSB7CisJCQlkZXZwcml2LT5kbWEwQ2hhaW5baW5kZXhdLnBjaV9zdGFydF9hZGRyID0KKwkJCQlkZXZwcml2LT5kbWEwQnVmZlBoeXNBZGRyW2luZGV4XTsKKwkJCWRldnByaXYtPmRtYTBDaGFpbltpbmRleF0ubG9jYWxfc3RhcnRfYWRkciA9CisJCQkJRE1BTEFERFJfQURDOworCQkJZGV2cHJpdi0+ZG1hMENoYWluW2luZGV4XS50cmFuc2Zlcl9zaXplID0KKwkJCQlzaXplb2YodTE2KSAqIGRldnByaXYtPmZpZm9MZW4gLyAyOworCQkJZGV2cHJpdi0+ZG1hMENoYWluW2luZGV4XS5uZXh0ID0KKwkJCQkoZGV2cHJpdi0+ZG1hMENoYWluUGh5c0FkZHIgKyAoKGluZGV4ICsKKwkJCQkJCTEpICUgKERNQV9DSEFJTl9DT1VOVCkpCisJCQkJKiBzaXplb2YoZGV2cHJpdi0+ZG1hMENoYWluWzBdKSkKKwkJCQl8IERNQV9UUkFOU0ZFUl9CSVRTOworCQkJLypEUFJJTlRLICgicmluZ1slZF0gQCVseCBQQ0k6ICV4LCBsb2NhbDogJXgsIE46IDB4JXgsIG5leHQ6ICV4XG4iLAorCQkJICAgaW5kZXgsCisJCQkgICAoKGxvbmcpZGV2cHJpdi0+ZG1hMENoYWluUGh5c0FkZHIKKwkJCSAgICsgKGluZGV4ICogc2l6ZW9mKGRldnByaXYtPmRtYTBDaGFpblswXSkpKSwKKwkJCSAgIGRldnByaXYtPmRtYTBDaGFpbltpbmRleF0ucGNpX3N0YXJ0X2FkZHIsCisJCQkgICBkZXZwcml2LT5kbWEwQ2hhaW5baW5kZXhdLmxvY2FsX3N0YXJ0X2FkZHIsCisJCQkgICBkZXZwcml2LT5kbWEwQ2hhaW5baW5kZXhdLnRyYW5zZmVyX3NpemUsCisJCQkgICBkZXZwcml2LT5kbWEwQ2hhaW5baW5kZXhdLm5leHQpOyAqLworCQl9CisKKwkJaWYgKGRldnByaXYtPmRtYTBDaGFpbiA9PSBOVUxMKSB7CisJCQlyZXQgPSAtRU5PTUVNOworCQkJZ290byBydGRfYXR0YWNoX2RpZV9lcnJvcjsKKwkJfQorCisJCVJ0ZERtYTBNb2RlKGRldiwgRE1BX01PREVfQklUUyk7CisJCVJ0ZERtYTBTb3VyY2UoZGV2LCBETUFTX0FERklGT19IQUxGX0ZVTEwpOwkvKiBzZXQgRE1BIHRyaWdnZXIgc291cmNlICovCisJfSBlbHNlIHsKKwkJcHJpbnRrKCIoIG5vIElSUS0+bm8gRE1BICkiKTsKKwl9CisjZW5kaWYgLyogVVNFX0RNQSAqLworCisJaWYgKGRldi0+aXJxKSB7CQkvKiBlbmFibGUgcGx4OTA4MCBpbnRlcnJ1cHRzICovCisJCVJ0ZFBseEludGVycnVwdFdyaXRlKGRldiwgSUNTX1BJRSB8IElDU19QTElFKTsKKwl9CisKKwlwcmludGsoIlxuY29tZWRpJWQ6IHJ0ZDUyMCBkcml2ZXIgYXR0YWNoZWQuXG4iLCBkZXYtPm1pbm9yKTsKKworCXJldHVybiAxOworCisjaWYgMAorCS8qIGhpdCBhbiBlcnJvciwgY2xlYW4gdXAgbWVtb3J5IGFuZCByZXR1cm4gcmV0ICovCisvL3J0ZF9hdHRhY2hfZGllX2Vycm9yOgorI2lmZGVmIFVTRV9ETUEKKwlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBETUFfQ0hBSU5fQ09VTlQ7IGluZGV4KyspIHsKKwkJaWYgKE5VTEwgIT0gZGV2cHJpdi0+ZG1hMEJ1ZmZbaW5kZXhdKSB7CS8qIGZyZWUgYnVmZmVyIG1lbW9yeSAqLworCQkJcGNpX2ZyZWVfY29uc2lzdGVudChkZXZwcml2LT5wY2lfZGV2LAorCQkJCXNpemVvZih1MTYpICogZGV2cHJpdi0+Zmlmb0xlbiAvIDIsCisJCQkJZGV2cHJpdi0+ZG1hMEJ1ZmZbaW5kZXhdLAorCQkJCWRldnByaXYtPmRtYTBCdWZmUGh5c0FkZHJbaW5kZXhdKTsKKwkJCWRldnByaXYtPmRtYTBCdWZmW2luZGV4XSA9IE5VTEw7CisJCX0KKwl9CisJaWYgKE5VTEwgIT0gZGV2cHJpdi0+ZG1hMENoYWluKSB7CisJCXBjaV9mcmVlX2NvbnNpc3RlbnQoZGV2cHJpdi0+cGNpX2RldiwKKwkJCXNpemVvZihzdHJ1Y3QgcGx4X2RtYV9kZXNjKQorCQkJKiBETUFfQ0hBSU5fQ09VTlQsCisJCQlkZXZwcml2LT5kbWEwQ2hhaW4sIGRldnByaXYtPmRtYTBDaGFpblBoeXNBZGRyKTsKKwkJZGV2cHJpdi0+ZG1hMENoYWluID0gTlVMTDsKKwl9CisjZW5kaWYgLyogVVNFX0RNQSAqLworCS8qIHN1YmRldmljZXMgYW5kIHByaXYgYXJlIGZyZWVkIGJ5IHRoZSBjb3JlICovCisJaWYgKGRldi0+aXJxKSB7CisJCS8qIGRpc2FibGUgaW50ZXJydXB0IGNvbnRyb2xsZXIgKi8KKwkJUnRkUGx4SW50ZXJydXB0V3JpdGUoZGV2LCBSdGRQbHhJbnRlcnJ1cHRSZWFkKGRldikKKwkJCSYgfihJQ1NfUExJRSB8IElDU19ETUEwX0UgfCBJQ1NfRE1BMV9FKSk7CisJCWNvbWVkaV9mcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKwl9CisKKwkvKiByZWxlYXNlIGFsbCByZWdpb25zIHRoYXQgd2VyZSBhbGxvY2F0ZWQgKi8KKwlpZiAoZGV2cHJpdi0+bGFzMCkgeworCQlpb3VubWFwKGRldnByaXYtPmxhczApOworCX0KKwlpZiAoZGV2cHJpdi0+bGFzMSkgeworCQlpb3VubWFwKGRldnByaXYtPmxhczEpOworCX0KKwlpZiAoZGV2cHJpdi0+bGNmZykgeworCQlpb3VubWFwKGRldnByaXYtPmxjZmcpOworCX0KKwlpZiAoZGV2cHJpdi0+cGNpX2RldikgeworCQlwY2lfZGV2X3B1dChkZXZwcml2LT5wY2lfZGV2KTsKKwl9CisJcmV0dXJuIHJldDsKKyNlbmRpZgorfQorCisvKgorICogX2RldGFjaCBpcyBjYWxsZWQgdG8gZGVjb25maWd1cmUgYSBkZXZpY2UuICBJdCBzaG91bGQgZGVhbGxvY2F0ZQorICogcmVzb3VyY2VzLgorICogVGhpcyBmdW5jdGlvbiBpcyBhbHNvIGNhbGxlZCB3aGVuIF9hdHRhY2goKSBmYWlscywgc28gaXQgc2hvdWxkIGJlCisgKiBjYXJlZnVsIG5vdCB0byByZWxlYXNlIHJlc291cmNlcyB0aGF0IHdlcmUgbm90IG5lY2Vzc2FyaWx5CisgKiBhbGxvY2F0ZWQgYnkgX2F0dGFjaCgpLiAgZGV2LT5wcml2YXRlIGFuZCBkZXYtPnN1YmRldmljZXMgYXJlCisgKiBkZWFsbG9jYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IHRoZSBjb3JlLgorICovCitzdGF0aWMgaW50IHJ0ZF9kZXRhY2goY29tZWRpX2RldmljZSAqIGRldikKK3sKKyNpZmRlZiBVU0VfRE1BCisJaW50IGluZGV4OworI2VuZGlmCisKKwlEUFJJTlRLKCJjb21lZGklZDogcnRkNTIwOiByZW1vdmluZyAoJWxkIGludHMpXG4iLAorCQlkZXYtPm1pbm9yLCAoZGV2cHJpdiA/IGRldnByaXYtPmludENvdW50IDogMEwpKTsKKwlpZiAoZGV2cHJpdiAmJiBkZXZwcml2LT5sY2ZnKSB7CisJCURQUklOVEsoIihpbnQgc3RhdHVzIDB4JXgsIG92ZXJydW4gc3RhdHVzIDB4JXgsIGZpZm8gc3RhdHVzIDB4JXgpLi4uXG4iLCAweGZmZmYgJiBSdGRJbnRlcnJ1cHRTdGF0dXMoZGV2KSwgMHhmZmZmICYgUnRkSW50ZXJydXB0T3ZlcnJ1blN0YXR1cyhkZXYpLCAoMHhmZmZmICYgUnRkRmlmb1N0YXR1cyhkZXYpKSBeIDB4NjY2Nik7CisJfQorCisJaWYgKGRldnByaXYpIHsKKwkJLyogU2h1dCBkb3duIGFueSBib2FyZCBvcHMgYnkgcmVzZXR0aW5nIGl0ICovCisjaWZkZWYgVVNFX0RNQQorCQlpZiAoZGV2cHJpdi0+bGNmZykgeworCQkJUnRkRG1hMENvbnRyb2woZGV2LCAwKTsJLyogZGlzYWJsZSBETUEgKi8KKwkJCVJ0ZERtYTFDb250cm9sKGRldiwgMCk7CS8qIGRpc2FibGUgRE1BICovCisJCQlSdGRQbHhJbnRlcnJ1cHRXcml0ZShkZXYsIElDU19QSUUgfCBJQ1NfUExJRSk7CisJCX0KKyNlbmRpZiAvKiBVU0VfRE1BICovCisJCWlmIChkZXZwcml2LT5sYXMwKSB7CisJCQlSdGRSZXNldEJvYXJkKGRldik7CisJCQlSdGRJbnRlcnJ1cHRNYXNrKGRldiwgMCk7CisJCQlSdGRJbnRlcnJ1cHRDbGVhck1hc2soZGV2LCB+MCk7CisJCQlSdGRJbnRlcnJ1cHRDbGVhcihkZXYpOwkvKiBjbGVhcnMgYml0cyBzZXQgYnkgbWFzayAqLworCQl9CisjaWZkZWYgVVNFX0RNQQorCQkvKiByZWxlYXNlIERNQSAqLworCQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBETUFfQ0hBSU5fQ09VTlQ7IGluZGV4KyspIHsKKwkJCWlmIChOVUxMICE9IGRldnByaXYtPmRtYTBCdWZmW2luZGV4XSkgeworCQkJCXBjaV9mcmVlX2NvbnNpc3RlbnQoZGV2cHJpdi0+cGNpX2RldiwKKwkJCQkJc2l6ZW9mKHUxNikgKiBkZXZwcml2LT5maWZvTGVuIC8gMiwKKwkJCQkJZGV2cHJpdi0+ZG1hMEJ1ZmZbaW5kZXhdLAorCQkJCQlkZXZwcml2LT5kbWEwQnVmZlBoeXNBZGRyW2luZGV4XSk7CisJCQkJZGV2cHJpdi0+ZG1hMEJ1ZmZbaW5kZXhdID0gTlVMTDsKKwkJCX0KKwkJfQorCQlpZiAoTlVMTCAhPSBkZXZwcml2LT5kbWEwQ2hhaW4pIHsKKwkJCXBjaV9mcmVlX2NvbnNpc3RlbnQoZGV2cHJpdi0+cGNpX2RldiwKKwkJCQlzaXplb2Yoc3RydWN0IHBseF9kbWFfZGVzYykgKiBETUFfQ0hBSU5fQ09VTlQsCisJCQkJZGV2cHJpdi0+ZG1hMENoYWluLCBkZXZwcml2LT5kbWEwQ2hhaW5QaHlzQWRkcik7CisJCQlkZXZwcml2LT5kbWEwQ2hhaW4gPSBOVUxMOworCQl9CisjZW5kaWYgLyogVVNFX0RNQSAqLworCisJCS8qIHJlbGVhc2UgSVJRICovCisJCWlmIChkZXYtPmlycSkgeworCQkJLyogZGlzYWJsZSBpbnRlcnJ1cHQgY29udHJvbGxlciAqLworCQkJUnRkUGx4SW50ZXJydXB0V3JpdGUoZGV2LCBSdGRQbHhJbnRlcnJ1cHRSZWFkKGRldikKKwkJCQkmIH4oSUNTX1BMSUUgfCBJQ1NfRE1BMF9FIHwgSUNTX0RNQTFfRSkpOworCQkJY29tZWRpX2ZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCQl9CisKKwkJLyogcmVsZWFzZSBhbGwgcmVnaW9ucyB0aGF0IHdlcmUgYWxsb2NhdGVkICovCisJCWlmIChkZXZwcml2LT5sYXMwKSB7CisJCQlpb3VubWFwKGRldnByaXYtPmxhczApOworCQl9CisJCWlmIChkZXZwcml2LT5sYXMxKSB7CisJCQlpb3VubWFwKGRldnByaXYtPmxhczEpOworCQl9CisJCWlmIChkZXZwcml2LT5sY2ZnKSB7CisJCQlpb3VubWFwKGRldnByaXYtPmxjZmcpOworCQl9CisJCWlmIChkZXZwcml2LT5wY2lfZGV2KSB7CisJCQlpZiAoZGV2cHJpdi0+Z290X3JlZ2lvbnMpIHsKKwkJCQljb21lZGlfcGNpX2Rpc2FibGUoZGV2cHJpdi0+cGNpX2Rldik7CisJCQl9CisJCQlwY2lfZGV2X3B1dChkZXZwcml2LT5wY2lfZGV2KTsKKwkJfQorCX0KKworCXByaW50aygiY29tZWRpJWQ6IHJ0ZDUyMDogcmVtb3ZlZC5cbiIsIGRldi0+bWlub3IpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgIENvbnZlcnQgYSBzaW5nbGUgY29tZWRpIGNoYW5uZWwtZ2FpbiBlbnRyeSB0byBhIFJURDUyMCB0YWJsZSBlbnRyeQorKi8KK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBydGRDb252ZXJ0Q2hhbkdhaW4oY29tZWRpX2RldmljZSAqIGRldiwKKwl1bnNpZ25lZCBpbnQgY29tZWRpQ2hhbiwgaW50IGNoYW5JbmRleCkKK3sJCQkJLyogaW5kZXggaW4gY2hhbm5lbCBsaXN0ICovCisJdW5zaWduZWQgaW50IGNoYW4sIHJhbmdlLCBhcmVmOworCXVuc2lnbmVkIHNob3J0IHIgPSAwOworCisJY2hhbiA9IENSX0NIQU4oY29tZWRpQ2hhbik7CisJcmFuZ2UgPSBDUl9SQU5HRShjb21lZGlDaGFuKTsKKwlhcmVmID0gQ1JfQVJFRihjb21lZGlDaGFuKTsKKworCXIgfD0gY2hhbiAmIDB4ZjsKKworCS8qIE5vdGU6IHdlIGFsc28gc2V0dXAgdGhlIGNoYW5uZWwgbGlzdCBiaXBvbGFyIGZsYWcgYXJyYXkgKi8KKwlpZiAocmFuZ2UgPCB0aGlzYm9hcmQtPnJhbmdlMTBTdGFydCkgewkvKiBmaXJzdCBiYXRjaCBhcmUgKy01ICovCisJCXIgfD0gMHgwMDA7CS8qICstNSByYW5nZSAqLworCQlyIHw9IChyYW5nZSAmIDB4NykgPDwgNDsJLyogZ2FpbiAqLworCQlDSEFOX0FSUkFZX1NFVChkZXZwcml2LT5jaGFuQmlwb2xhciwgY2hhbkluZGV4KTsKKwl9IGVsc2UgaWYgKHJhbmdlIDwgdGhpc2JvYXJkLT5yYW5nZVVuaVN0YXJ0KSB7CS8qIHNlY29uZCBiYXRjaCBhcmUgKy0xMCAqLworCQlyIHw9IDB4MTAwOwkvKiArLTEwIHJhbmdlICovCisJCXIgfD0gKChyYW5nZSAtIHRoaXNib2FyZC0+cmFuZ2UxMFN0YXJ0KSAmIDB4NykgPDwgNDsJLyogZ2FpbiAqLworCQlDSEFOX0FSUkFZX1NFVChkZXZwcml2LT5jaGFuQmlwb2xhciwgY2hhbkluZGV4KTsKKwl9IGVsc2UgewkJLyogbGFzdCBiYXRjaCBpcyArMTAgKi8KKwkJciB8PSAweDIwMDsJLyogKzEwIHJhbmdlICovCisJCXIgfD0gKChyYW5nZSAtIHRoaXNib2FyZC0+cmFuZ2VVbmlTdGFydCkgJiAweDcpIDw8IDQ7CS8qIGdhaW4gKi8KKwkJQ0hBTl9BUlJBWV9DTEVBUihkZXZwcml2LT5jaGFuQmlwb2xhciwgY2hhbkluZGV4KTsKKwl9CisKKwlzd2l0Y2ggKGFyZWYpIHsKKwljYXNlIEFSRUZfR1JPVU5EOgkvKiBvbi1ib2FyZCBncm91bmQgKi8KKwkJYnJlYWs7CisKKwljYXNlIEFSRUZfQ09NTU9OOgorCQlyIHw9IDB4ODA7CS8qIHJlZiBleHRlcm5hbCBhbmFsb2cgY29tbW9uICovCisJCWJyZWFrOworCisJY2FzZSBBUkVGX0RJRkY6CisJCXIgfD0gMHg0MDA7CS8qIGRpZmZlcmVudGlhbCBpbnB1dHMgKi8KKwkJYnJlYWs7CisKKwljYXNlIEFSRUZfT1RIRVI6CS8qID8/PyAqLworCQlicmVhazsKKwl9CisJLypwcmludGsgKCJjaGFuPSVkIHI9JWQgYT0lZCAtPiAweCV4XG4iLAorCSAgIGNoYW4sIHJhbmdlLCBhcmVmLCByKTsgKi8KKwlyZXR1cm4gcjsKK30KKworLyoKKyAgU2V0dXAgdGhlIGNoYW5uZWwtZ2FpbiB0YWJsZSBmcm9tIGEgY29tZWRpIGxpc3QKKyovCitzdGF0aWMgdm9pZCBydGRfbG9hZF9jaGFubmVsZ2Fpbl9saXN0KGNvbWVkaV9kZXZpY2UgKiBkZXYsCisJdW5zaWduZWQgaW50IG5fY2hhbiwgdW5zaWduZWQgaW50ICpsaXN0KQoreworCWlmIChuX2NoYW4gPiAxKSB7CS8qIHNldHVwIGNoYW5uZWwgZ2FpbiB0YWJsZSAqLworCQlpbnQgaWk7CisJCVJ0ZENsZWFyQ0dUKGRldik7CisJCVJ0ZEVuYWJsZUNHVChkZXYsIDEpOwkvKiBlbmFibGUgdGFibGUgKi8KKwkJZm9yIChpaSA9IDA7IGlpIDwgbl9jaGFuOyBpaSsrKSB7CisJCQlSdGRXcml0ZUNHVGFibGUoZGV2LCBydGRDb252ZXJ0Q2hhbkdhaW4oZGV2LCBsaXN0W2lpXSwKKwkJCQkJaWkpKTsKKwkJfQorCX0gZWxzZSB7CQkvKiBqdXN0IHVzZSB0aGUgY2hhbm5lbCBnYWluIGxhdGNoICovCisJCVJ0ZEVuYWJsZUNHVChkZXYsIDApOwkvKiBkaXNhYmxlIHRhYmxlLCBlbmFibGUgbGF0Y2ggKi8KKwkJUnRkV3JpdGVDR0xhdGNoKGRldiwgcnRkQ29udmVydENoYW5HYWluKGRldiwgbGlzdFswXSwgMCkpOworCX0KK30KKworLyogZGV0ZXJtaW5lIGZpZm8gc2l6ZSBieSBkb2luZyBhZGMgY29udmVyc2lvbnMgdW50aWwgdGhlIGZpZm8gaGFsZgorZW1wdHkgc3RhdHVzIGZsYWcgY2xlYXJzICovCitzdGF0aWMgaW50IHJ0ZDUyMF9wcm9iZV9maWZvX2RlcHRoKGNvbWVkaV9kZXZpY2UgKmRldikKK3sKKwlsc2FtcGxfdCBjaGFuc3BlYyA9IENSX1BBQ0soMCwgMCwgQVJFRl9HUk9VTkQpOworCXVuc2lnbmVkIGk7CisJc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxpbWl0ID0gMHgyMDAwOworCXVuc2lnbmVkIGZpZm9fc2l6ZSA9IDA7CisKKwlSdGRBZGNDbGVhckZpZm8oZGV2KTsKKwlydGRfbG9hZF9jaGFubmVsZ2Fpbl9saXN0KGRldiwgMSwgJmNoYW5zcGVjKTsKKwlSdGRBZGNDb252ZXJzaW9uU291cmNlKGRldiwgMCk7CS8qIHNvZnR3YXJlICovCisJLyogY29udmVydCAgc2FtcGxlcyAqLworCWZvciAoaSA9IDA7IGkgPCBsaW1pdDsgKytpKSB7CisJCXVuc2lnbmVkIGZpZm9fc3RhdHVzOworCQkvKiB0cmlnZ2VyIGNvbnZlcnNpb24gKi8KKwkJUnRkQWRjU3RhcnQoZGV2KTsKKwkJY29tZWRpX3VkZWxheSgxKTsKKwkJZmlmb19zdGF0dXMgPSBSdGRGaWZvU3RhdHVzKGRldik7CisJCWlmKChmaWZvX3N0YXR1cyAmIEZTX0FEQ19IRU1QVFkpID09IDApIHsKKwkJCWZpZm9fc2l6ZSA9IDIgKiBpOworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYoaSA9PSBsaW1pdCkKKwl7CisJCXJ0X3ByaW50aygiXG5jb21lZGk6ICVzOiBmYWlsZWQgdG8gcHJvYmUgZmlmbyBzaXplLlxuIiwgRFJWX05BTUUpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJUnRkQWRjQ2xlYXJGaWZvKGRldik7CisJaWYoZmlmb19zaXplICE9IDB4NDAwIHx8IGZpZm9fc2l6ZSAhPSAweDIwMDApCisJeworCQlydF9wcmludGsoIlxuY29tZWRpOiAlczogdW5leHBlY3RlZCBmaWZvIHNpemUgb2YgJWksIGV4cGVjdGVkIDEwMjQgb3IgODE5Mi5cbiIsCisJCQlEUlZfTkFNRSwgZmlmb19zaXplKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCXJldHVybiBmaWZvX3NpemU7Cit9CisKKy8qCisgICJpbnN0cnVjdGlvbnMiIHJlYWQvd3JpdGUgZGF0YSBpbiAib25lLXNob3QiIG9yICJzb2Z0d2FyZS10cmlnZ2VyZWQiCisgIG1vZGUgKHNpbXBsZXN0IGNhc2UpLgorICBUaGlzIGRvZXNudCB1c2UgaW50ZXJydXB0cy4KKworICBOb3RlLCB3ZSBkb24ndCBkbyBhbnkgc2V0dGxpbmcgZGVsYXlzLiAgVXNlIGEgaW5zdHJ1Y3Rpb24gbGlzdCB0bworICBzZWxlY3QsIGRlbGF5LCB0aGVuIHJlYWQuCisgKi8KK3N0YXRpYyBpbnQgcnRkX2FpX3JpbnNuKGNvbWVkaV9kZXZpY2UgKiBkZXYsCisJY29tZWRpX3N1YmRldmljZSAqIHMsIGNvbWVkaV9pbnNuICogaW5zbiwgbHNhbXBsX3QgKiBkYXRhKQoreworCWludCBuLCBpaTsKKwlpbnQgc3RhdDsKKworCS8qIGNsZWFyIGFueSBvbGQgZmlmbyBkYXRhICovCisJUnRkQWRjQ2xlYXJGaWZvKGRldik7CisKKwkvKiB3cml0ZSBjaGFubmVsIHRvIG11bHRpcGxleGVyIGFuZCBjbGVhciBjaGFubmVsIGdhaW4gdGFibGUgKi8KKwlydGRfbG9hZF9jaGFubmVsZ2Fpbl9saXN0KGRldiwgMSwgJmluc24tPmNoYW5zcGVjKTsKKworCS8qIHNldCBjb252ZXJzaW9uIHNvdXJjZSAqLworCVJ0ZEFkY0NvbnZlcnNpb25Tb3VyY2UoZGV2LCAwKTsJLyogc29mdHdhcmUgKi8KKworCS8qIGNvbnZlcnQgbiBzYW1wbGVzICovCisJZm9yIChuID0gMDsgbiA8IGluc24tPm47IG4rKykgeworCQlzMTYgZDsKKwkJLyogdHJpZ2dlciBjb252ZXJzaW9uICovCisJCVJ0ZEFkY1N0YXJ0KGRldik7CisKKwkJZm9yIChpaSA9IDA7IGlpIDwgUlREX0FEQ19USU1FT1VUOyArK2lpKSB7CisJCQlzdGF0ID0gUnRkRmlmb1N0YXR1cyhkZXYpOworCQkJaWYgKHN0YXQgJiBGU19BRENfTk9UX0VNUFRZKQkvKiAxIC0+IG5vdCBlbXB0eSAqLworCQkJCWJyZWFrOworCQkJV0FJVF9RVUlFVExZOworCQl9CisJCWlmIChpaSA+PSBSVERfQURDX1RJTUVPVVQpIHsKKwkJCURQUklOVEsoInJ0ZDUyMDogRXJyb3I6IEFEQyBuZXZlciBmaW5pc2hlZCEgRmlmb1N0YXR1cz0weCV4XG4iLCBzdGF0IF4gMHg2NjY2KTsKKwkJCXJldHVybiAtRVRJTUVET1VUOworCQl9CisKKwkJLyogcmVhZCBkYXRhICovCisJCWQgPSBSdGRBZGNGaWZvR2V0KGRldik7CS8qIGdldCAycyBjb21wIHZhbHVlICovCisJCS8qcHJpbnRrICgicnRkNTIwOiBHb3QgMHgleCBhZnRlciAlZCB1c2VjXG4iLCBkLCBpaSsxKTsgKi8KKwkJZCA9IGQgPj4gMzsJLyogbG93IDMgYml0cyBhcmUgbWFya2VyIGxpbmVzICovCisJCWlmIChDSEFOX0FSUkFZX1RFU1QoZGV2cHJpdi0+Y2hhbkJpcG9sYXIsIDApKSB7CisJCQlkYXRhW25dID0gZCArIDIwNDg7CS8qIGNvbnZlcnQgdG8gY29tZWRpIHVuc2lnbmVkIGRhdGEgKi8KKwkJfSBlbHNlIHsKKwkJCWRhdGFbbl0gPSBkOworCQl9CisJfQorCisJLyogcmV0dXJuIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyByZWFkL3dyaXR0ZW4gKi8KKwlyZXR1cm4gbjsKK30KKworLyoKKyAgR2V0IHdoYXQgd2Uga25vdyBpcyB0aGVyZS4uLi4gRmFzdCEKKyAgVGhpcyB1c2VzIDEvMiB0aGUgYnVzIGN5Y2xlcyBvZiByZWFkX2RyZWdzIChiZWxvdykuCisKKyAgVGhlIG1hbnVhbCBjbGFpbXMgdGhhdCB3ZSBjYW4gZG8gYSBsd29yZCByZWFkLCBidXQgaXQgZG9lc24ndCB3b3JrIGhlcmUuCisqLworc3RhdGljIGludCBhaV9yZWFkX24oY29tZWRpX2RldmljZSAqIGRldiwgY29tZWRpX3N1YmRldmljZSAqIHMsIGludCBjb3VudCkKK3sKKwlpbnQgaWk7CisKKwlmb3IgKGlpID0gMDsgaWkgPCBjb3VudDsgaWkrKykgeworCQlzYW1wbF90IHNhbXBsZTsKKwkJczE2IGQ7CisKKwkJaWYgKDAgPT0gZGV2cHJpdi0+YWlDb3VudCkgewkvKiBkb25lICovCisJCQlkID0gUnRkQWRjRmlmb0dldChkZXYpOwkvKiBSZWFkIE4gYW5kIGRpc2NhcmQgKi8KKwkJCWNvbnRpbnVlOworCQl9CisjaWYgMAorCQlpZiAoMCA9PSAoUnRkRmlmb1N0YXR1cyhkZXYpICYgRlNfQURDX05PVF9FTVBUWSkpIHsJLyogREVCVUcgKi8KKwkJCURQUklOVEsoImNvbWVkaTogUkVBRCBPT1BTIG9uICVkIG9mICVkXG4iLCBpaSArIDEsCisJCQkJY291bnQpOworCQkJYnJlYWs7CisJCX0KKyNlbmRpZgorCQlkID0gUnRkQWRjRmlmb0dldChkZXYpOwkvKiBnZXQgMnMgY29tcCB2YWx1ZSAqLworCisJCWQgPSBkID4+IDM7CS8qIGxvdyAzIGJpdHMgYXJlIG1hcmtlciBsaW5lcyAqLworCQlpZiAoQ0hBTl9BUlJBWV9URVNUKGRldnByaXYtPmNoYW5CaXBvbGFyLCBzLT5hc3luYy0+Y3VyX2NoYW4pKSB7CisJCQlzYW1wbGUgPSBkICsgMjA0ODsJLyogY29udmVydCB0byBjb21lZGkgdW5zaWduZWQgZGF0YSAqLworCQl9IGVsc2UgeworCQkJc2FtcGxlID0gZDsKKwkJfQorCQlpZiAoIWNvbWVkaV9idWZfcHV0KHMtPmFzeW5jLCBzYW1wbGUpKQorCQkJcmV0dXJuIC0xOworCisJCWlmIChkZXZwcml2LT5haUNvdW50ID4gMCkJLyogPCAwLCBtZWFucyByZWFkIGZvcmV2ZXIgKi8KKwkJCWRldnByaXYtPmFpQ291bnQtLTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgIHVua25vd24gYW1vdXQgb2YgZGF0YSBpcyB3YWl0aW5nIGluIGZpZm8uCisqLworc3RhdGljIGludCBhaV9yZWFkX2RyZWdzKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKiBzKQoreworCXdoaWxlIChSdGRGaWZvU3RhdHVzKGRldikgJiBGU19BRENfTk9UX0VNUFRZKSB7CS8qIDEgLT4gbm90IGVtcHR5ICovCisJCXNhbXBsX3Qgc2FtcGxlOworCQlzMTYgZCA9IFJ0ZEFkY0ZpZm9HZXQoZGV2KTsJLyogZ2V0IDJzIGNvbXAgdmFsdWUgKi8KKworCQlpZiAoMCA9PSBkZXZwcml2LT5haUNvdW50KSB7CS8qIGRvbmUgKi8KKwkJCWNvbnRpbnVlOwkvKiByZWFkIHJlc3QgKi8KKwkJfQorCisJCWQgPSBkID4+IDM7CS8qIGxvdyAzIGJpdHMgYXJlIG1hcmtlciBsaW5lcyAqLworCQlpZiAoQ0hBTl9BUlJBWV9URVNUKGRldnByaXYtPmNoYW5CaXBvbGFyLCBzLT5hc3luYy0+Y3VyX2NoYW4pKSB7CisJCQlzYW1wbGUgPSBkICsgMjA0ODsJLyogY29udmVydCB0byBjb21lZGkgdW5zaWduZWQgZGF0YSAqLworCQl9IGVsc2UgeworCQkJc2FtcGxlID0gZDsKKwkJfQorCQlpZiAoIWNvbWVkaV9idWZfcHV0KHMtPmFzeW5jLCBzYW1wbGUpKQorCQkJcmV0dXJuIC0xOworCisJCWlmIChkZXZwcml2LT5haUNvdW50ID4gMCkJLyogPCAwLCBtZWFucyByZWFkIGZvcmV2ZXIgKi8KKwkJCWRldnByaXYtPmFpQ291bnQtLTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBVU0VfRE1BCisvKgorICBUZXJtaW5hdGUgYSBETUEgdHJhbnNmZXIgYW5kIHdhaXQgZm9yIGV2ZXJ5dGhpbmcgdG8gcXVpZXQgZG93bgorKi8KK3ZvaWQgYWJvcnRfZG1hKGNvbWVkaV9kZXZpY2UgKiBkZXYsIHVuc2lnbmVkIGludCBjaGFubmVsKQorewkJCQkvKiBETUEgY2hhbm5lbCAwLCAxICovCisJdW5zaWduZWQgbG9uZyBkbWFfY3NfYWRkcjsJLyogdGhlIGNvbnRyb2wvc3RhdHVzIHJlZ2lzdGVyICovCisJdWludDhfdCBzdGF0dXM7CisJdW5zaWduZWQgaW50IGlpOworCS8vdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWRtYV9jc19hZGRyID0gKHVuc2lnbmVkIGxvbmcpZGV2cHJpdi0+bGNmZworCQkrICgoY2hhbm5lbCA9PSAwKSA/IExDRkdfRE1BQ1NSMCA6IExDRkdfRE1BQ1NSMSk7CisKKwkvLyBzcGlubG9jayBmb3IgcGx4IGRtYSBjb250cm9sL3N0YXR1cyByZWcKKwkvL2NvbWVkaV9zcGluX2xvY2tfaXJxc2F2ZSggJmRldi0+c3BpbmxvY2ssIGZsYWdzICk7CisKKwkvLyBhYm9ydCBkbWEgdHJhbnNmZXIgaWYgbmVjZXNzYXJ5CisJc3RhdHVzID0gcmVhZGIoZG1hX2NzX2FkZHIpOworCWlmICgoc3RhdHVzICYgUExYX0RNQV9FTl9CSVQpID09IDApIHsJLyogbm90IGVuYWJsZWQgKEVycm9yPykgKi8KKwkJRFBSSU5USygicnRkNTIwOiBBYm9ydERtYSBvbiBub24tYWN0aXZlIGNoYW5uZWwgJWQgKDB4JXgpXG4iLAorCQkJY2hhbm5lbCwgc3RhdHVzKTsKKwkJZ290byBhYm9ydERtYUV4aXQ7CisJfQorCisJLyogd2FpdCB0byBtYWtlIHN1cmUgZG9uZSBiaXQgaXMgemVybyAobmVlZGVkPykgKi8KKwlmb3IgKGlpID0gMDsgKHN0YXR1cyAmIFBMWF9ETUFfRE9ORV9CSVQpICYmIGlpIDwgUlREX0RNQV9USU1FT1VUOyBpaSsrKSB7CisJCVdBSVRfUVVJRVRMWTsKKwkJc3RhdHVzID0gcmVhZGIoZG1hX2NzX2FkZHIpOworCX0KKwlpZiAoc3RhdHVzICYgUExYX0RNQV9ET05FX0JJVCkgeworCQlwcmludGsoInJ0ZDUyMDogVGltZW91dCB3YWl0aW5nIGZvciBkbWEgJWkgZG9uZSBjbGVhclxuIiwKKwkJCWNoYW5uZWwpOworCQlnb3RvIGFib3J0RG1hRXhpdDsKKwl9CisKKwkvKiBkaXNhYmxlIGNoYW5uZWwgKHJlcXVpcmVkKSAqLworCXdyaXRlYigwLCBkbWFfY3NfYWRkcik7CisJY29tZWRpX3VkZWxheSgxKTsJLyogbmVlZGVkPz8gKi8KKwkvKiBzZXQgYWJvcnQgYml0IGZvciBjaGFubmVsICovCisJd3JpdGViKFBMWF9ETUFfQUJPUlRfQklULCBkbWFfY3NfYWRkcik7CisKKwkvLyB3YWl0IGZvciBkbWEgZG9uZSBiaXQgdG8gYmUgc2V0CisJc3RhdHVzID0gcmVhZGIoZG1hX2NzX2FkZHIpOworCWZvciAoaWkgPSAwOworCQkoc3RhdHVzICYgUExYX0RNQV9ET05FX0JJVCkgPT0gMCAmJiBpaSA8IFJURF9ETUFfVElNRU9VVDsKKwkJaWkrKykgeworCQlzdGF0dXMgPSByZWFkYihkbWFfY3NfYWRkcik7CisJCVdBSVRfUVVJRVRMWTsKKwl9CisJaWYgKChzdGF0dXMgJiBQTFhfRE1BX0RPTkVfQklUKSA9PSAwKSB7CisJCXByaW50aygicnRkNTIwOiBUaW1lb3V0IHdhaXRpbmcgZm9yIGRtYSAlaSBkb25lIHNldFxuIiwKKwkJCWNoYW5uZWwpOworCX0KKworICAgICAgYWJvcnREbWFFeGl0OgorCS8vY29tZWRpX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoICZkZXYtPnNwaW5sb2NrLCBmbGFncyApOworfQorCisvKgorICBQcm9jZXNzIHdoYXQgaXMgaW4gdGhlIERNQSB0cmFuc2ZlciBidWZmZXIgYW5kIHBhc3MgdG8gY29tZWRpCisgIE5vdGU6IHRoaXMgaXMgbm90IHJlLWVudHJhbnQKKyovCitzdGF0aWMgaW50IGFpX3Byb2Nlc3NfZG1hKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKiBzKQoreworCWludCBpaSwgbjsKKwlzMTYgKmRwOworCisJaWYgKGRldnByaXYtPmFpQ291bnQgPT0gMCkJLyogdHJhbnNmZXIgYWxyZWFkeSBjb21wbGV0ZSAqLworCQlyZXR1cm4gMDsKKworCWRwID0gZGV2cHJpdi0+ZG1hMEJ1ZmZbZGV2cHJpdi0+ZG1hME9mZnNldF07CisJZm9yIChpaSA9IDA7IGlpIDwgZGV2cHJpdi0+Zmlmb0xlbiAvIDI7KSB7CS8qIGNvbnZlcnQgc2FtcGxlcyAqLworCQlzYW1wbF90IHNhbXBsZTsKKworCQlpZiAoQ0hBTl9BUlJBWV9URVNUKGRldnByaXYtPmNoYW5CaXBvbGFyLCBzLT5hc3luYy0+Y3VyX2NoYW4pKSB7CisJCQlzYW1wbGUgPSAoKmRwID4+IDMpICsgMjA0ODsJLyogY29udmVydCB0byBjb21lZGkgdW5zaWduZWQgZGF0YSAqLworCQl9IGVsc2UgeworCQkJc2FtcGxlID0gKmRwID4+IDM7CS8qIGxvdyAzIGJpdHMgYXJlIG1hcmtlciBsaW5lcyAqLworCQl9CisJCSpkcCsrID0gc2FtcGxlOwkvKiBwdXQgcHJvY2Vzc2VkIHZhbHVlIGJhY2sgKi8KKworCQlpZiAoKytzLT5hc3luYy0+Y3VyX2NoYW4gPj0gcy0+YXN5bmMtPmNtZC5jaGFubGlzdF9sZW4pCisJCQlzLT5hc3luYy0+Y3VyX2NoYW4gPSAwOworCisJCSsraWk7CQkvKiBudW1iZXIgcmVhZHkgdG8gdHJhbnNmZXIgKi8KKwkJaWYgKGRldnByaXYtPmFpQ291bnQgPiAwKSB7CS8qIDwgMCwgbWVhbnMgcmVhZCBmb3JldmVyICovCisJCQlpZiAoLS1kZXZwcml2LT5haUNvdW50ID09IDApIHsJLyogZG9uZSAqLworCQkJCS8qRFBSSU5USyAoInJ0ZDUyMDogRmluYWwgJWQgc2FtcGxlc1xuIiwgaWkpOyAqLworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJLyogbm93IHBhc3MgdGhlIHdob2xlIGFycmF5IHRvIHRoZSBjb21lZGkgYnVmZmVyICovCisJZHAgPSBkZXZwcml2LT5kbWEwQnVmZltkZXZwcml2LT5kbWEwT2Zmc2V0XTsKKwluID0gY29tZWRpX2J1Zl93cml0ZV9hbGxvYyhzLT5hc3luYywgaWkgKiBzaXplb2YoczE2KSk7CisJaWYgKG4gPCAoaWkgKiBzaXplb2YoczE2KSkpIHsJLyogYW55IHJlc2lkdWFsIGlzIGFuIGVycm9yICovCisJCURQUklOVEsoInJ0ZDUyMDphaV9wcm9jZXNzX2RtYSBidWZmZXIgb3ZlcmZsb3cgJWQgc2FtcGxlcyFcbiIsCisJCQlpaSAtIChuIC8gc2l6ZW9mKHMxNikpKTsKKwkJcy0+YXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRVJST1I7CisJCXJldHVybiAtMTsKKwl9CisJY29tZWRpX2J1Zl9tZW1jcHlfdG8ocy0+YXN5bmMsIDAsIGRwLCBuKTsKKwljb21lZGlfYnVmX3dyaXRlX2ZyZWUocy0+YXN5bmMsIG4pOworCisJLyogYWx3YXlzIGF0IGxlYXN0IDEgc2NhbiAtLSAxLzIgRklGTyBpcyBsYXJnZXIgdGhhbiBvdXIgbWF4IHNjYW4gbGlzdCAqLworCXMtPmFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0JMT0NLIHwgQ09NRURJX0NCX0VPUzsKKworCWlmICgrK2RldnByaXYtPmRtYTBPZmZzZXQgPj0gRE1BX0NIQUlOX0NPVU5UKSB7CS8qIG5leHQgYnVmZmVyICovCisJCWRldnByaXYtPmRtYTBPZmZzZXQgPSAwOworCX0KKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvKiBVU0VfRE1BICovCisKKy8qCisgIEhhbmRsZSBhbGwgcnRkNTIwIGludGVycnVwdHMuCisgIFJ1bnMgYXRvbWljYWxseSBhbmQgaXMgbmV2ZXIgcmUtZW50ZXJlZC4KKyAgVGhpcyBpcyBhICJzbG93IGhhbmRsZXIiOyAgb3RoZXIgaW50ZXJydXB0cyBtYXkgYmUgYWN0aXZlLgorICBUaGUgZGF0YSBjb252ZXJzaW9uIG1heSBzb21lZGF5IGhhcHBlbiBpbiBhICJib3R0b20gaGFsZiIuCisqLworc3RhdGljIGlycXJldHVybl90IHJ0ZF9pbnRlcnJ1cHQoaW50IGlycSwJLyogaW50ZXJydXB0IG51bWJlciAoaWdub3JlZCkgKi8KKwl2b2lkICpkCQkJLyogb3VyIGRhdGEgKi8KKwlQVF9SRUdTX0FSRykKK3sJCQkJLyogY3B1IGNvbnRleHQgKGlnbm9yZWQpICovCisJY29tZWRpX2RldmljZSAqZGV2ID0gZDsJLyogbXVzdCBiZSBjYWxsZWQgImRldiIgZm9yIGRldnByaXYgKi8KKwl1MTYgc3RhdHVzOworCXUxNiBmaWZvU3RhdHVzOworCWNvbWVkaV9zdWJkZXZpY2UgKnMgPSBkZXYtPnN1YmRldmljZXMgKyAwOwkvKiBhbmFsb2cgaW4gc3ViZGV2aWNlICovCisKKwlpZiAoIWRldi0+YXR0YWNoZWQpIHsKKwkJcmV0dXJuIElSUV9OT05FOworCX0KKworCWRldnByaXYtPmludENvdW50Kys7CS8qIERFQlVHIHN0YXRpc3RpY3MgKi8KKworCWZpZm9TdGF0dXMgPSBSdGRGaWZvU3RhdHVzKGRldik7CisJLyogY2hlY2sgZm9yIEZJRk8gZnVsbCwgdGhpcyBhdXRvbWF0aWNhbGx5IGhhbHRzIHRoZSBBREMhICovCisJaWYgKCEoZmlmb1N0YXR1cyAmIEZTX0FEQ19OT1RfRlVMTCkpIHsJLyogMCAtPiBmdWxsICovCisJCURQUklOVEsoInJ0ZDUyMDogRklGTyBmdWxsISBmaWZvX3N0YXR1cz0weCV4XG4iLCAoZmlmb1N0YXR1cyBeIDB4NjY2NikgJiAweDc3NzcpOwkvKiBzaG91bGQgYmUgYWxsIDBzICovCisJCWdvdG8gYWJvcnRUcmFuc2ZlcjsKKwl9CisjaWZkZWYgVVNFX0RNQQorCWlmIChkZXZwcml2LT5mbGFncyAmIERNQTBfQUNUSVZFKSB7CS8qIENoZWNrIERNQSAqLworCQl1MzIgaXN0YXR1cyA9IFJ0ZFBseEludGVycnVwdFJlYWQoZGV2KTsKKworCQlpZiAoaXN0YXR1cyAmIElDU19ETUEwX0EpIHsKKwkJCWlmIChhaV9wcm9jZXNzX2RtYShkZXYsIHMpIDwgMCkgeworCQkJCURQUklOVEsoInJ0ZDUyMDogY29tZWRpIHJlYWQgYnVmZmVyIG92ZXJmbG93IChETUEpIHdpdGggJWxkIHRvIGdvIVxuIiwgZGV2cHJpdi0+YWlDb3VudCk7CisJCQkJUnRkRG1hMENvbnRyb2woZGV2LAorCQkJCQkoZGV2cHJpdi0+CisJCQkJCQlkbWEwQ29udHJvbCAmCisJCQkJCQl+UExYX0RNQV9TVEFSVF9CSVQpCisJCQkJCXwgUExYX0NMRUFSX0RNQV9JTlRSX0JJVCk7CisJCQkJZ290byBhYm9ydFRyYW5zZmVyOworCQkJfQorCisJCQkvKkRQUklOVEsgKCJydGQ1MjA6IERNQSB0cmFuc2ZlcjogJWxkIHRvIGdvLCBpc3RhdHVzICV4XG4iLAorCQkJICAgZGV2cHJpdi0+YWlDb3VudCwgaXN0YXR1cyk7ICovCisJCQlSdGREbWEwQ29udHJvbChkZXYsCisJCQkJKGRldnByaXYtPmRtYTBDb250cm9sICYgflBMWF9ETUFfU1RBUlRfQklUKQorCQkJCXwgUExYX0NMRUFSX0RNQV9JTlRSX0JJVCk7CisJCQlpZiAoMCA9PSBkZXZwcml2LT5haUNvdW50KSB7CS8qIGNvdW50ZWQgZG93biAqLworCQkJCURQUklOVEsoInJ0ZDUyMDogU2FtcGxlcyBEb25lIChETUEpLlxuIik7CisJCQkJZ290byB0cmFuc2ZlckRvbmU7CisJCQl9CisJCQljb21lZGlfZXZlbnQoZGV2LCBzKTsKKwkJfSBlbHNlIHsKKwkJCS8qRFBSSU5USyAoInJ0ZDUyMDogTm8gRE1BIHJlYWR5OiBpc3RhdHVzICV4XG4iLCBpc3RhdHVzKTsgKi8KKwkJfQorCX0KKwkvKiBGYWxsIHRocm91Z2ggYW5kIGNoZWNrIGZvciBvdGhlciBpbnRlcnJ1cHQgc291cmNlcyAqLworI2VuZGlmIC8qIFVTRV9ETUEgKi8KKworCXN0YXR1cyA9IFJ0ZEludGVycnVwdFN0YXR1cyhkZXYpOworCS8qIGlmIGludGVycnVwdCB3YXMgbm90IGNhdXNlZCBieSBvdXIgYm9hcmQsIG9yIGhhbmRsZWQgYWJvdmUgKi8KKwlpZiAoMCA9PSBzdGF0dXMpIHsKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KKworCWlmIChzdGF0dXMgJiBJUlFNX0FEQ19BQk9VVF9DTlQpIHsJLyogc2FtcGxlIGNvdW50IC0+IHJlYWQgRklGTyAqLworCQkvKiBzaW5jZSB0aGUgcHJpb3JpdHkgaW50ZXJydXB0IGNvbnRyb2xsZXIgbWF5IGhhdmUgcXVldWVkIGEgc2FtcGxlCisJCSAgIGNvdW50ZXIgaW50ZXJydXB0LCBldmVuIHRob3VnaCB3ZSBoYXZlIGFscmVhZHkgZmluaXNoZWQsCisJCSAgIHdlIG11c3QgaGFuZGxlIHRoZSBwb3NzaWJpbGl0eSB0aGF0IHRoZXJlIGlzIG5vIGRhdGEgaGVyZSAqLworCQlpZiAoIShmaWZvU3RhdHVzICYgRlNfQURDX0hFTVBUWSkpIHsJLyogMCAtPiAxLzIgZnVsbCAqLworCQkJLypEUFJJTlRLKCJydGQ1MjA6IFNhbXBsZSBpbnQsIHJlYWRpbmcgMS8yRklGTy4gIGZpZm9fc3RhdHVzIDB4JXhcbiIsCisJCQkgICAoZmlmb1N0YXR1cyBeIDB4NjY2NikgJiAweDc3NzcpOyAqLworCQkJaWYgKGFpX3JlYWRfbihkZXYsIHMsIGRldnByaXYtPmZpZm9MZW4gLyAyKSA8IDApIHsKKwkJCQlEUFJJTlRLKCJydGQ1MjA6IGNvbWVkaSByZWFkIGJ1ZmZlciBvdmVyZmxvdyAoMS8yRklGTykgd2l0aCAlbGQgdG8gZ28hXG4iLCBkZXZwcml2LT5haUNvdW50KTsKKwkJCQlnb3RvIGFib3J0VHJhbnNmZXI7CisJCQl9CisJCQlpZiAoMCA9PSBkZXZwcml2LT5haUNvdW50KSB7CS8qIGNvdW50ZWQgZG93biAqLworCQkJCURQUklOVEsoInJ0ZDUyMDogU2FtcGxlcyBEb25lICgxLzIpLiBmaWZvX3N0YXR1cyB3YXMgMHgleFxuIiwgKGZpZm9TdGF0dXMgXiAweDY2NjYpICYgMHg3Nzc3KTsJLyogc2hvdWxkIGJlIGFsbCAwcyAqLworCQkJCWdvdG8gdHJhbnNmZXJEb25lOworCQkJfQorCQkJY29tZWRpX2V2ZW50KGRldiwgcyk7CisJCX0gZWxzZSBpZiAoZGV2cHJpdi0+dHJhbnNDb3VudCA+IDApIHsJLyogcmVhZCBvZnRlbiAqLworCQkJLypEUFJJTlRLKCJydGQ1MjA6IFNhbXBsZSBpbnQsIHJlYWRpbmcgJWQgIGZpZm9fc3RhdHVzIDB4JXhcbiIsCisJCQkgICBkZXZwcml2LT50cmFuc0NvdW50LCAoZmlmb1N0YXR1cyBeIDB4NjY2NikgJiAweDc3NzcpOyAqLworCQkJaWYgKGZpZm9TdGF0dXMgJiBGU19BRENfTk9UX0VNUFRZKSB7CS8qIDEgLT4gbm90IGVtcHR5ICovCisJCQkJaWYgKGFpX3JlYWRfbihkZXYsIHMsIGRldnByaXYtPnRyYW5zQ291bnQpIDwgMCkgeworCQkJCQlEUFJJTlRLKCJydGQ1MjA6IGNvbWVkaSByZWFkIGJ1ZmZlciBvdmVyZmxvdyAoTikgd2l0aCAlbGQgdG8gZ28hXG4iLCBkZXZwcml2LT5haUNvdW50KTsKKwkJCQkJZ290byBhYm9ydFRyYW5zZmVyOworCQkJCX0KKwkJCQlpZiAoMCA9PSBkZXZwcml2LT5haUNvdW50KSB7CS8qIGNvdW50ZWQgZG93biAqLworCQkJCQlEUFJJTlRLKCJydGQ1MjA6IFNhbXBsZXMgRG9uZSAoTikuIGZpZm9fc3RhdHVzIHdhcyAweCV4XG4iLCAoZmlmb1N0YXR1cyBeIDB4NjY2NikgJiAweDc3NzcpOworCQkJCQlnb3RvIHRyYW5zZmVyRG9uZTsKKwkJCQl9CisJCQkJY29tZWRpX2V2ZW50KGRldiwgcyk7CisJCQl9CisJCX0gZWxzZSB7CS8qIHdhaXQgZm9yIDEvMiBGSUZPIChvbGQpICovCisJCQlEUFJJTlRLKCJydGQ1MjA6IFNhbXBsZSBpbnQuICBXYWl0IGZvciAxLzIuIGZpZm9fc3RhdHVzIDB4JXhcbiIsIChmaWZvU3RhdHVzIF4gMHg2NjY2KSAmIDB4Nzc3Nyk7CisJCX0KKwl9IGVsc2UgeworCQlEUFJJTlRLKCJydGQ1MjA6IHVua25vd24gaW50ZXJydXB0IHNvdXJjZSFcbiIpOworCX0KKworCWlmICgweGZmZmYgJiBSdGRJbnRlcnJ1cHRPdmVycnVuU3RhdHVzKGRldikpIHsJLyogaW50ZXJydXB0IG92ZXJydW4gKi8KKwkJRFBSSU5USygicnRkNTIwOiBJbnRlcnJ1cHQgb3ZlcnJ1biB3aXRoICVsZCB0byBnbyEgb3Zlcl9zdGF0dXM9MHgleFxuIiwgZGV2cHJpdi0+YWlDb3VudCwgMHhmZmZmICYgUnRkSW50ZXJydXB0T3ZlcnJ1blN0YXR1cyhkZXYpKTsKKwkJZ290byBhYm9ydFRyYW5zZmVyOworCX0KKworCS8qIGNsZWFyIHRoZSBpbnRlcnJ1cHQgKi8KKwlSdGRJbnRlcnJ1cHRDbGVhck1hc2soZGV2LCBzdGF0dXMpOworCVJ0ZEludGVycnVwdENsZWFyKGRldik7CisJcmV0dXJuIElSUV9IQU5ETEVEOworCisgICAgICBhYm9ydFRyYW5zZmVyOgorCVJ0ZEFkY0NsZWFyRmlmbyhkZXYpOwkvKiBjbGVhcnMgZnVsbCBmbGFnICovCisJcy0+YXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRVJST1I7CisJZGV2cHJpdi0+YWlDb3VudCA9IDA7CS8qIHN0b3AgYW5kIGRvbid0IHRyYW5zZmVyIGFueSBtb3JlICovCisJLyogZmFsbCBpbnRvIHRyYW5zZmVyRG9uZSAqLworCisgICAgICB0cmFuc2ZlckRvbmU6CisJUnRkUGFjZXJTdG9wU291cmNlKGRldiwgMCk7CS8qIHN0b3Agb24gU09GVFdBUkUgc3RvcCAqLworCVJ0ZFBhY2VyU3RvcChkZXYpOwkvKiBTdG9wIFBBQ0VSICovCisJUnRkQWRjQ29udmVyc2lvblNvdXJjZShkZXYsIDApOwkvKiBzb2Z0d2FyZSB0cmlnZ2VyIG9ubHkgKi8KKwlSdGRJbnRlcnJ1cHRNYXNrKGRldiwgMCk7CS8qIG1hc2sgb3V0IFNBTVBMRSAqLworI2lmZGVmIFVTRV9ETUEKKwlpZiAoZGV2cHJpdi0+ZmxhZ3MgJiBETUEwX0FDVElWRSkgeworCQlSdGRQbHhJbnRlcnJ1cHRXcml0ZShkZXYsCS8qIGRpc2FibGUgYW55IG1vcmUgaW50ZXJydXB0cyAqLworCQkJUnRkUGx4SW50ZXJydXB0UmVhZChkZXYpICYgfklDU19ETUEwX0UpOworCQlhYm9ydF9kbWEoZGV2LCAwKTsKKwkJZGV2cHJpdi0+ZmxhZ3MgJj0gfkRNQTBfQUNUSVZFOworCQkvKiBpZiBVc2luZyBETUEsIHRoZW4gd2Ugc2hvdWxkIGhhdmUgcmVhZCBldmVyeXRoaW5nIGJ5IG5vdyAqLworCQlpZiAoZGV2cHJpdi0+YWlDb3VudCA+IDApIHsKKwkJCURQUklOVEsoInJ0ZDUyMDogTG9zdCBETUEgZGF0YSEgJWxkIHJlbWFpblxuIiwKKwkJCQlkZXZwcml2LT5haUNvdW50KTsKKwkJfQorCX0KKyNlbmRpZiAvKiBVU0VfRE1BICovCisKKwlpZiAoZGV2cHJpdi0+YWlDb3VudCA+IDApIHsJLyogdGhlcmUgc2hvdWxkbid0IGJlIGFueXRoaW5nIGxlZnQgKi8KKwkJZmlmb1N0YXR1cyA9IFJ0ZEZpZm9TdGF0dXMoZGV2KTsKKwkJRFBSSU5USygicnRkNTIwOiBGaW5pc2hpbmcgdXAuICVsZCByZW1haW4sIGZpZm9TdGF0PSV4XG4iLCBkZXZwcml2LT5haUNvdW50LCAoZmlmb1N0YXR1cyBeIDB4NjY2NikgJiAweDc3NzcpOwkvKiBzaG91bGQgcmVhZCBhbGwgMHMgKi8KKwkJYWlfcmVhZF9kcmVncyhkZXYsIHMpOwkvKiByZWFkIGFueXRoaW5nIGxlZnQgaW4gRklGTyAqLworCX0KKworCXMtPmFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0VPQTsJLyogc2lnbmFsIGVuZCB0byBjb21lZGkgKi8KKwljb21lZGlfZXZlbnQoZGV2LCBzKTsKKworCS8qIGNsZWFyIHRoZSBpbnRlcnJ1cHQgKi8KKwlzdGF0dXMgPSBSdGRJbnRlcnJ1cHRTdGF0dXMoZGV2KTsKKwlSdGRJbnRlcnJ1cHRDbGVhck1hc2soZGV2LCBzdGF0dXMpOworCVJ0ZEludGVycnVwdENsZWFyKGRldik7CisKKwlmaWZvU3RhdHVzID0gUnRkRmlmb1N0YXR1cyhkZXYpOwkvKiBERUJVRyAqLworCURQUklOVEsoInJ0ZDUyMDogQWNxdWlzaXRpb24gY29tcGxldGUuICVsZCBpbnRzLCBpbnRTdGF0PSV4LCBvdmVyU3RhdD0leFxuIiwgZGV2cHJpdi0+aW50Q291bnQsIHN0YXR1cywgMHhmZmZmICYgUnRkSW50ZXJydXB0T3ZlcnJ1blN0YXR1cyhkZXYpKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworI2lmIDAKKy8qCisgIHJldHVybiB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgYXZhaWxhYmxlCisqLworc3RhdGljIGludCBydGRfYWlfcG9sbChjb21lZGlfZGV2aWNlICogZGV2LCBjb21lZGlfc3ViZGV2aWNlICogcykKK3sKKwkvKiBUT0RPOiBUaGlzIG5lZWRzIHRvIG1hc2sgaW50ZXJydXB0cywgcmVhZF9kcmVncywgYW5kIHRoZW4gcmUtZW5hYmxlICovCisJLyogTm90IHN1cmUgd2hhdCB0byBkbyBpZiBETUEgaXMgYWN0aXZlICovCisJcmV0dXJuIHMtPmFzeW5jLT5idWZfd3JpdGVfY291bnQgLSBzLT5hc3luYy0+YnVmX3JlYWRfY291bnQ7Cit9CisjZW5kaWYKKworLyoKKyAgY21kdGVzdCB0ZXN0cyBhIHBhcnRpY3VsYXIgY29tbWFuZCB0byBzZWUgaWYgaXQgaXMgdmFsaWQuCisgIFVzaW5nIHRoZSBjbWR0ZXN0IGlvY3RsLCBhIHVzZXIgY2FuIGNyZWF0ZSBhIHZhbGlkIGNtZAorICBhbmQgdGhlbiBoYXZlIGl0IGV4ZWN1dGVkIGJ5IHRoZSBjbWQgaW9jdGwgKGFzeW5jcm9ub3VzbHkpLgorCisgIGNtZHRlc3QgcmV0dXJucyAxLDIsMyw0IG9yIDAsIGRlcGVuZGluZyBvbiB3aGljaCB0ZXN0cworICB0aGUgY29tbWFuZCBwYXNzZXMuCisqLworCitzdGF0aWMgaW50IHJ0ZF9haV9jbWR0ZXN0KGNvbWVkaV9kZXZpY2UgKiBkZXYsCisJY29tZWRpX3N1YmRldmljZSAqIHMsIGNvbWVkaV9jbWQgKiBjbWQpCit7CisJaW50IGVyciA9IDA7CisJaW50IHRtcDsKKworCS8qIHN0ZXAgMTogbWFrZSBzdXJlIHRyaWdnZXIgc291cmNlcyBhcmUgdHJpdmlhbGx5IHZhbGlkICovCisKKwl0bXAgPSBjbWQtPnN0YXJ0X3NyYzsKKwljbWQtPnN0YXJ0X3NyYyAmPSBUUklHX05PVzsKKwlpZiAoIWNtZC0+c3RhcnRfc3JjIHx8IHRtcCAhPSBjbWQtPnN0YXJ0X3NyYykgeworCQllcnIrKzsKKwl9CisKKwl0bXAgPSBjbWQtPnNjYW5fYmVnaW5fc3JjOworCWNtZC0+c2Nhbl9iZWdpbl9zcmMgJj0gVFJJR19USU1FUiB8IFRSSUdfRVhUOworCWlmICghY21kLT5zY2FuX2JlZ2luX3NyYyB8fCB0bXAgIT0gY21kLT5zY2FuX2JlZ2luX3NyYykgeworCQllcnIrKzsKKwl9CisKKwl0bXAgPSBjbWQtPmNvbnZlcnRfc3JjOworCWNtZC0+Y29udmVydF9zcmMgJj0gVFJJR19USU1FUiB8IFRSSUdfRVhUOworCWlmICghY21kLT5jb252ZXJ0X3NyYyB8fCB0bXAgIT0gY21kLT5jb252ZXJ0X3NyYykgeworCQllcnIrKzsKKwl9CisKKwl0bXAgPSBjbWQtPnNjYW5fZW5kX3NyYzsKKwljbWQtPnNjYW5fZW5kX3NyYyAmPSBUUklHX0NPVU5UOworCWlmICghY21kLT5zY2FuX2VuZF9zcmMgfHwgdG1wICE9IGNtZC0+c2Nhbl9lbmRfc3JjKSB7CisJCWVycisrOworCX0KKworCXRtcCA9IGNtZC0+c3RvcF9zcmM7CisJY21kLT5zdG9wX3NyYyAmPSBUUklHX0NPVU5UIHwgVFJJR19OT05FOworCWlmICghY21kLT5zdG9wX3NyYyB8fCB0bXAgIT0gY21kLT5zdG9wX3NyYykgeworCQllcnIrKzsKKwl9CisKKwlpZiAoZXJyKQorCQlyZXR1cm4gMTsKKworCS8qIHN0ZXAgMjogbWFrZSBzdXJlIHRyaWdnZXIgc291cmNlcyBhcmUgdW5pcXVlCisJICAgYW5kIG11dHVhbGx5IGNvbXBhdGlibGUgKi8KKwkvKiBub3RlIHRoYXQgbXV0dWFsIGNvbXBhdGlibGl0eSBpcyBub3QgYW4gaXNzdWUgaGVyZSAqLworCWlmIChjbWQtPnNjYW5fYmVnaW5fc3JjICE9IFRSSUdfVElNRVIgJiYKKwkJY21kLT5zY2FuX2JlZ2luX3NyYyAhPSBUUklHX0VYVCkgeworCQllcnIrKzsKKwl9CisJaWYgKGNtZC0+Y29udmVydF9zcmMgIT0gVFJJR19USU1FUiAmJiBjbWQtPmNvbnZlcnRfc3JjICE9IFRSSUdfRVhUKSB7CisJCWVycisrOworCX0KKwlpZiAoY21kLT5zdG9wX3NyYyAhPSBUUklHX0NPVU5UICYmIGNtZC0+c3RvcF9zcmMgIT0gVFJJR19OT05FKSB7CisJCWVycisrOworCX0KKworCWlmIChlcnIpIHsKKwkJcmV0dXJuIDI7CisJfQorCisJLyogc3RlcCAzOiBtYWtlIHN1cmUgYXJndW1lbnRzIGFyZSB0cml2aWFsbHkgY29tcGF0aWJsZSAqLworCisJaWYgKGNtZC0+c3RhcnRfYXJnICE9IDApIHsKKwkJY21kLT5zdGFydF9hcmcgPSAwOworCQllcnIrKzsKKwl9CisKKwlpZiAoY21kLT5zY2FuX2JlZ2luX3NyYyA9PSBUUklHX1RJTUVSKSB7CisJCS8qIE5vdGU6IHRoZXNlIGFyZSB0aW1lIHBlcmlvZHMsIG5vdCBhY3R1YWwgcmF0ZXMgKi8KKwkJaWYgKDEgPT0gY21kLT5jaGFubGlzdF9sZW4pIHsJLyogbm8gc2Nhbm5pbmcgKi8KKwkJCWlmIChjbWQtPnNjYW5fYmVnaW5fYXJnIDwgUlREX01BWF9TUEVFRF8xKSB7CisJCQkJY21kLT5zY2FuX2JlZ2luX2FyZyA9IFJURF9NQVhfU1BFRURfMTsKKwkJCQlydGRfbnNfdG9fdGltZXIoJmNtZC0+c2Nhbl9iZWdpbl9hcmcsCisJCQkJCVRSSUdfUk9VTkRfVVApOworCQkJCWVycisrOworCQkJfQorCQkJaWYgKGNtZC0+c2Nhbl9iZWdpbl9hcmcgPiBSVERfTUlOX1NQRUVEXzEpIHsKKwkJCQljbWQtPnNjYW5fYmVnaW5fYXJnID0gUlREX01JTl9TUEVFRF8xOworCQkJCXJ0ZF9uc190b190aW1lcigmY21kLT5zY2FuX2JlZ2luX2FyZywKKwkJCQkJVFJJR19ST1VORF9ET1dOKTsKKwkJCQllcnIrKzsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChjbWQtPnNjYW5fYmVnaW5fYXJnIDwgUlREX01BWF9TUEVFRCkgeworCQkJCWNtZC0+c2Nhbl9iZWdpbl9hcmcgPSBSVERfTUFYX1NQRUVEOworCQkJCXJ0ZF9uc190b190aW1lcigmY21kLT5zY2FuX2JlZ2luX2FyZywKKwkJCQkJVFJJR19ST1VORF9VUCk7CisJCQkJZXJyKys7CisJCQl9CisJCQlpZiAoY21kLT5zY2FuX2JlZ2luX2FyZyA+IFJURF9NSU5fU1BFRUQpIHsKKwkJCQljbWQtPnNjYW5fYmVnaW5fYXJnID0gUlREX01JTl9TUEVFRDsKKwkJCQlydGRfbnNfdG9fdGltZXIoJmNtZC0+c2Nhbl9iZWdpbl9hcmcsCisJCQkJCVRSSUdfUk9VTkRfRE9XTik7CisJCQkJZXJyKys7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQkvKiBleHRlcm5hbCB0cmlnZ2VyICovCisJCS8qIHNob3VsZCBiZSBsZXZlbC9lZGdlLCBoaS9sbyBzcGVjaWZpY2F0aW9uIGhlcmUgKi8KKwkJLyogc2hvdWxkIHNwZWNpZnkgbXVsdGlwbGUgZXh0ZXJuYWwgdHJpZ2dlcnMgKi8KKwkJaWYgKGNtZC0+c2Nhbl9iZWdpbl9hcmcgPiA5KSB7CisJCQljbWQtPnNjYW5fYmVnaW5fYXJnID0gOTsKKwkJCWVycisrOworCQl9CisJfQorCWlmIChjbWQtPmNvbnZlcnRfc3JjID09IFRSSUdfVElNRVIpIHsKKwkJaWYgKDEgPT0gY21kLT5jaGFubGlzdF9sZW4pIHsJLyogbm8gc2Nhbm5pbmcgKi8KKwkJCWlmIChjbWQtPmNvbnZlcnRfYXJnIDwgUlREX01BWF9TUEVFRF8xKSB7CisJCQkJY21kLT5jb252ZXJ0X2FyZyA9IFJURF9NQVhfU1BFRURfMTsKKwkJCQlydGRfbnNfdG9fdGltZXIoJmNtZC0+Y29udmVydF9hcmcsCisJCQkJCVRSSUdfUk9VTkRfVVApOworCQkJCWVycisrOworCQkJfQorCQkJaWYgKGNtZC0+Y29udmVydF9hcmcgPiBSVERfTUlOX1NQRUVEXzEpIHsKKwkJCQljbWQtPmNvbnZlcnRfYXJnID0gUlREX01JTl9TUEVFRF8xOworCQkJCXJ0ZF9uc190b190aW1lcigmY21kLT5jb252ZXJ0X2FyZywKKwkJCQkJVFJJR19ST1VORF9ET1dOKTsKKwkJCQllcnIrKzsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChjbWQtPmNvbnZlcnRfYXJnIDwgUlREX01BWF9TUEVFRCkgeworCQkJCWNtZC0+Y29udmVydF9hcmcgPSBSVERfTUFYX1NQRUVEOworCQkJCXJ0ZF9uc190b190aW1lcigmY21kLT5jb252ZXJ0X2FyZywKKwkJCQkJVFJJR19ST1VORF9VUCk7CisJCQkJZXJyKys7CisJCQl9CisJCQlpZiAoY21kLT5jb252ZXJ0X2FyZyA+IFJURF9NSU5fU1BFRUQpIHsKKwkJCQljbWQtPmNvbnZlcnRfYXJnID0gUlREX01JTl9TUEVFRDsKKwkJCQlydGRfbnNfdG9fdGltZXIoJmNtZC0+Y29udmVydF9hcmcsCisJCQkJCVRSSUdfUk9VTkRfRE9XTik7CisJCQkJZXJyKys7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQkvKiBleHRlcm5hbCB0cmlnZ2VyICovCisJCS8qIHNlZSBhYm92ZSAqLworCQlpZiAoY21kLT5jb252ZXJ0X2FyZyA+IDkpIHsKKwkJCWNtZC0+Y29udmVydF9hcmcgPSA5OworCQkJZXJyKys7CisJCX0KKwl9CisKKyNpZiAwCisJaWYgKGNtZC0+c2Nhbl9lbmRfYXJnICE9IGNtZC0+Y2hhbmxpc3RfbGVuKSB7CisJCWNtZC0+c2Nhbl9lbmRfYXJnID0gY21kLT5jaGFubGlzdF9sZW47CisJCWVycisrOworCX0KKyNlbmRpZgorCWlmIChjbWQtPnN0b3Bfc3JjID09IFRSSUdfQ09VTlQpIHsKKwkJLyogVE9ETyBjaGVjayBmb3Igcm91bmRpbmcgZXJyb3IgZHVlIHRvIGNvdW50ZXIgd3JhcCAqLworCisJfSBlbHNlIHsKKwkJLyogVFJJR19OT05FICovCisJCWlmIChjbWQtPnN0b3BfYXJnICE9IDApIHsKKwkJCWNtZC0+c3RvcF9hcmcgPSAwOworCQkJZXJyKys7CisJCX0KKwl9CisKKwlpZiAoZXJyKSB7CisJCXJldHVybiAzOworCX0KKworCS8qIHN0ZXAgNDogZml4IHVwIGFueSBhcmd1bWVudHMgKi8KKworCWlmIChjbWQtPmNoYW5saXN0X2xlbiA+IFJURF9NQVhfQ0hBTkxJU1QpIHsKKwkJY21kLT5jaGFubGlzdF9sZW4gPSBSVERfTUFYX0NIQU5MSVNUOworCQllcnIrKzsKKwl9CisJaWYgKGNtZC0+c2Nhbl9iZWdpbl9zcmMgPT0gVFJJR19USU1FUikgeworCQl0bXAgPSBjbWQtPnNjYW5fYmVnaW5fYXJnOworCQlydGRfbnNfdG9fdGltZXIoJmNtZC0+c2Nhbl9iZWdpbl9hcmcsCisJCQljbWQtPmZsYWdzICYgVFJJR19ST1VORF9NQVNLKTsKKwkJaWYgKHRtcCAhPSBjbWQtPnNjYW5fYmVnaW5fYXJnKSB7CisJCQllcnIrKzsKKwkJfQorCX0KKwlpZiAoY21kLT5jb252ZXJ0X3NyYyA9PSBUUklHX1RJTUVSKSB7CisJCXRtcCA9IGNtZC0+Y29udmVydF9hcmc7CisJCXJ0ZF9uc190b190aW1lcigmY21kLT5jb252ZXJ0X2FyZywKKwkJCWNtZC0+ZmxhZ3MgJiBUUklHX1JPVU5EX01BU0spOworCQlpZiAodG1wICE9IGNtZC0+Y29udmVydF9hcmcpIHsKKwkJCWVycisrOworCQl9CisJCWlmIChjbWQtPnNjYW5fYmVnaW5fc3JjID09IFRSSUdfVElNRVIKKwkJCSYmIChjbWQtPnNjYW5fYmVnaW5fYXJnCisJCQkJPCAoY21kLT5jb252ZXJ0X2FyZyAqIGNtZC0+c2Nhbl9lbmRfYXJnKSkpIHsKKwkJCWNtZC0+c2Nhbl9iZWdpbl9hcmcgPQorCQkJCWNtZC0+Y29udmVydF9hcmcgKiBjbWQtPnNjYW5fZW5kX2FyZzsKKwkJCWVycisrOworCQl9CisJfQorCisJaWYgKGVycikgeworCQlyZXR1cm4gNDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAgRXhlY3V0ZSBhIGFuYWxvZyBpbiBjb21tYW5kIHdpdGggbWFueSBwb3NzaWJsZSB0cmlnZ2VyaW5nIG9wdGlvbnMuCisgIFRoZSBkYXRhIGdldCBzdG9yZWQgaW4gdGhlIGFzeW5jIHN0cnVjdHVyZSBvZiB0aGUgc3ViZGV2aWNlLgorICBUaGlzIGlzIHVzdWFsbHkgZG9uZSBieSBhbiBpbnRlcnJ1cHQgaGFuZGxlci4KKyAgVXNlcmxhbmQgZ2V0cyB0byB0aGUgZGF0YSB1c2luZyByZWFkIGNhbGxzLgorKi8KK3N0YXRpYyBpbnQgcnRkX2FpX2NtZChjb21lZGlfZGV2aWNlICogZGV2LCBjb21lZGlfc3ViZGV2aWNlICogcykKK3sKKwljb21lZGlfY21kICpjbWQgPSAmcy0+YXN5bmMtPmNtZDsKKwlpbnQgdGltZXI7CisKKwkvKiBzdG9wIGFueXRoaW5nIGN1cnJlbnRseSBydW5uaW5nICovCisJUnRkUGFjZXJTdG9wU291cmNlKGRldiwgMCk7CS8qIHN0b3Agb24gU09GVFdBUkUgc3RvcCAqLworCVJ0ZFBhY2VyU3RvcChkZXYpOwkvKiBtYWtlIHN1cmUgUEFDRVIgaXMgc3RvcHBlZCAqLworCVJ0ZEFkY0NvbnZlcnNpb25Tb3VyY2UoZGV2LCAwKTsJLyogc29mdHdhcmUgdHJpZ2dlciBvbmx5ICovCisJUnRkSW50ZXJydXB0TWFzayhkZXYsIDApOworI2lmZGVmIFVTRV9ETUEKKwlpZiAoZGV2cHJpdi0+ZmxhZ3MgJiBETUEwX0FDVElWRSkgewkvKiBjYW5jZWwgYW55dGhpbmcgcnVubmluZyAqLworCQlSdGRQbHhJbnRlcnJ1cHRXcml0ZShkZXYsCS8qIGRpc2FibGUgYW55IG1vcmUgaW50ZXJydXB0cyAqLworCQkJUnRkUGx4SW50ZXJydXB0UmVhZChkZXYpICYgfklDU19ETUEwX0UpOworCQlhYm9ydF9kbWEoZGV2LCAwKTsKKwkJZGV2cHJpdi0+ZmxhZ3MgJj0gfkRNQTBfQUNUSVZFOworCQlpZiAoUnRkUGx4SW50ZXJydXB0UmVhZChkZXYpICYgSUNTX0RNQTBfQSkgewkvKmNsZWFyIHBlbmRpbmcgaW50ICovCisJCQlSdGREbWEwQ29udHJvbChkZXYsIFBMWF9DTEVBUl9ETUFfSU5UUl9CSVQpOworCQl9CisJfQorCVJ0ZERtYTBSZXNldChkZXYpOwkvKiByZXNldCBvbmJvYXJkIHN0YXRlICovCisjZW5kaWYgLyogVVNFX0RNQSAqLworCVJ0ZEFkY0NsZWFyRmlmbyhkZXYpOwkvKiBjbGVhciBhbnkgb2xkIGRhdGEgKi8KKwlSdGRJbnRlcnJ1cHRPdmVycnVuQ2xlYXIoZGV2KTsKKwlkZXZwcml2LT5pbnRDb3VudCA9IDA7CisKKwlpZiAoIWRldi0+aXJxKSB7CS8qIHdlIG5lZWQgaW50ZXJydXB0cyBmb3IgdGhpcyAqLworCQlEUFJJTlRLKCJydGQ1MjA6IEVSUk9SISBObyBpbnRlcnJ1cHQgYXZhaWxhYmxlIVxuIik7CisJCXJldHVybiAtRU5YSU87CisJfQorCisJLyogc3RhcnQgY29uZmlndXJhdGlvbiAqLworCS8qIGxvYWQgY2hhbm5lbCBsaXN0IGFuZCByZXNldCBDR1QgKi8KKwlydGRfbG9hZF9jaGFubmVsZ2Fpbl9saXN0KGRldiwgY21kLT5jaGFubGlzdF9sZW4sIGNtZC0+Y2hhbmxpc3QpOworCisJLyogc2V0dXAgdGhlIGNvbW1vbiBjYXNlIGFuZCBvdmVycmlkZSBpZiBuZWVkZWQgKi8KKwlpZiAoY21kLT5jaGFubGlzdF9sZW4gPiAxKSB7CisJCS8qRFBSSU5USyAoInJ0ZDUyMDogTXVsdGkgY2hhbm5lbCBzZXR1cFxuIik7ICovCisJCVJ0ZFBhY2VyU3RhcnRTb3VyY2UoZGV2LCAwKTsJLyogc29mdHdhcmUgdHJpZ2dlcnMgcGFjZXIgKi8KKwkJUnRkQnVyc3RTdGFydFNvdXJjZShkZXYsIDEpOwkvKiBQQUNFUiB0cmlnZ2VycyBidXJzdCAqLworCQlSdGRBZGNDb252ZXJzaW9uU291cmNlKGRldiwgMik7CS8qIEJVUlNUIHRyaWdnZXJzIEFEQyAqLworCX0gZWxzZSB7CQkvKiBzaW5nbGUgY2hhbm5lbCAqLworCQkvKkRQUklOVEsgKCJydGQ1MjA6IHNpbmdsZSBjaGFubmVsIHNldHVwXG4iKTsgKi8KKwkJUnRkUGFjZXJTdGFydFNvdXJjZShkZXYsIDApOwkvKiBzb2Z0d2FyZSB0cmlnZ2VycyBwYWNlciAqLworCQlSdGRBZGNDb252ZXJzaW9uU291cmNlKGRldiwgMSk7CS8qIFBBQ0VSIHRyaWdnZXJzIEFEQyAqLworCX0KKwlSdGRBYm91dENvdW50ZXIoZGV2LCBkZXZwcml2LT5maWZvTGVuIC8gMiAtIDEpOwkvKiAxLzIgRklGTyAqLworCisJaWYgKFRSSUdfVElNRVIgPT0gY21kLT5zY2FuX2JlZ2luX3NyYykgeworCQkvKiBzY2FuX2JlZ2luX2FyZyBpcyBpbiBuYW5vc2Vjb25kcyAqLworCQkvKiBmaW5kIG91dCBob3cgbWFueSBzYW1wbGVzIHRvIHdhaXQgYmVmb3JlIHRyYW5zZmVycmluZyAqLworCQlpZiAoY21kLT5mbGFncyAmIFRSSUdfV0FLRV9FT1MpIHsKKwkJCS8qIHRoaXMgbWF5IGdlbmVyYXRlIHVuLXN1c3RhaW5hYmxlIGludGVycnVwdCByYXRlcyAqLworCQkJLyogdGhlIGFwcGxpY2F0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBkb2luZyB0aGUgcmlnaHQgdGhpbmcgKi8KKwkJCWRldnByaXYtPnRyYW5zQ291bnQgPSBjbWQtPmNoYW5saXN0X2xlbjsKKwkJCWRldnByaXYtPmZsYWdzIHw9IFNFTkRfRU9TOworCQl9IGVsc2UgeworCQkJLyogYXJyYW5nZSB0byB0cmFuc2ZlciBkYXRhIHBlcmlvZGljYWxseSAqLworCQkJZGV2cHJpdi0+dHJhbnNDb3VudAorCQkJCT0KKwkJCQkoVFJBTlNfVEFSR0VUX1BFUklPRCAqIGNtZC0+Y2hhbmxpc3RfbGVuKSAvCisJCQkJY21kLT5zY2FuX2JlZ2luX2FyZzsKKwkJCWlmIChkZXZwcml2LT50cmFuc0NvdW50IDwgY21kLT5jaGFubGlzdF9sZW4pIHsKKwkJCQkvKiB0cmFuZmVyIGFmdGVyIGVhY2ggc2NhbiAoYW5kIGF2b2lkIDApICovCisJCQkJZGV2cHJpdi0+dHJhbnNDb3VudCA9IGNtZC0+Y2hhbmxpc3RfbGVuOworCQkJfSBlbHNlIHsJLyogbWFrZSBhIG11bHRpcGxlIG9mIHNjYW4gbGVuZ3RoICovCisJCQkJZGV2cHJpdi0+dHJhbnNDb3VudCA9CisJCQkJCShkZXZwcml2LT50cmFuc0NvdW50ICsKKwkJCQkJY21kLT5jaGFubGlzdF9sZW4gLSAxKQorCQkJCQkvIGNtZC0+Y2hhbmxpc3RfbGVuOworCQkJCWRldnByaXYtPnRyYW5zQ291bnQgKj0gY21kLT5jaGFubGlzdF9sZW47CisJCQl9CisJCQlkZXZwcml2LT5mbGFncyB8PSBTRU5EX0VPUzsKKwkJfQorCQlpZiAoZGV2cHJpdi0+dHJhbnNDb3VudCA+PSAoZGV2cHJpdi0+Zmlmb0xlbiAvIDIpKSB7CisJCQkvKiBvdXQgb2YgY291bnRlciByYW5nZSwgdXNlIDEvMiBmaWZvIGluc3RlYWQgKi8KKwkJCWRldnByaXYtPnRyYW5zQ291bnQgPSAwOworCQkJZGV2cHJpdi0+ZmxhZ3MgJj0gflNFTkRfRU9TOworCQl9IGVsc2UgeworCQkJLyogaW50ZXJydXB0IGZvciBlYWNoIHRyYW5mZXIgKi8KKwkJCVJ0ZEFib3V0Q291bnRlcihkZXYsIGRldnByaXYtPnRyYW5zQ291bnQgLSAxKTsKKwkJfQorCisJCURQUklOVEsoInJ0ZDUyMDogc2Nhbkxlbj0lZCB0cmFuZmVyQ291bnQ9JWQgZmlmb0xlbj0lZFxuICBzY2FuVGltZShucyk9JWQgZmxhZ3M9MHgleFxuIiwgY21kLT5jaGFubGlzdF9sZW4sIGRldnByaXYtPnRyYW5zQ291bnQsIGRldnByaXYtPmZpZm9MZW4sIGNtZC0+c2Nhbl9iZWdpbl9hcmcsIGRldnByaXYtPmZsYWdzKTsKKwl9IGVsc2UgewkJLyogdW5rbm93biB0aW1pbmcsIGp1c3QgdXNlIDEvMiBGSUZPICovCisJCWRldnByaXYtPnRyYW5zQ291bnQgPSAwOworCQlkZXZwcml2LT5mbGFncyAmPSB+U0VORF9FT1M7CisJfQorCVJ0ZFBhY2VyQ2xvY2tTb3VyY2UoZGV2LCAxKTsJLyogdXNlIElOVEVSTkFMIDhNaHogY2xvY2sgc291cmNlICovCisJUnRkQWJvdXRTdG9wRW5hYmxlKGRldiwgMSk7CS8qIGp1c3QgaW50ZXJydXB0LCBkb250IHN0b3AgKi8KKworCS8qIEJVRz8/PyB0aGVzZSBsb29rIGxpa2UgZW51bWVyYXRlZCB2YWx1ZXMsIGJ1dCB0aGV5IGFyZSBiaXQgZmllbGRzICovCisKKwkvKiBGaXJzdCwgc2V0dXAgd2hlbiB0byBzdG9wICovCisJc3dpdGNoIChjbWQtPnN0b3Bfc3JjKSB7CisJY2FzZSBUUklHX0NPVU5UOgkvKiBzdG9wIGFmdGVyIE4gc2NhbnMgKi8KKwkJZGV2cHJpdi0+YWlDb3VudCA9IGNtZC0+c3RvcF9hcmcgKiBjbWQtPmNoYW5saXN0X2xlbjsKKwkJaWYgKChkZXZwcml2LT50cmFuc0NvdW50ID4gMCkKKwkJCSYmIChkZXZwcml2LT50cmFuc0NvdW50ID4gZGV2cHJpdi0+YWlDb3VudCkpIHsKKwkJCWRldnByaXYtPnRyYW5zQ291bnQgPSBkZXZwcml2LT5haUNvdW50OworCQl9CisJCWJyZWFrOworCisJY2FzZSBUUklHX05PTkU6CS8qIHN0b3Agd2hlbiBjYW5jZWwgaXMgY2FsbGVkICovCisJCWRldnByaXYtPmFpQ291bnQgPSAtMTsJLyogcmVhZCBmb3JldmVyICovCisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJRFBSSU5USygicnRkNTIwOiBXYXJuaW5nISBpZ25vcmluZyBzdG9wX3NyYyBtb2RlICVkXG4iLAorCQkJY21kLT5zdG9wX3NyYyk7CisJfQorCisJLyogU2NhbiB0aW1pbmcgKi8KKwlzd2l0Y2ggKGNtZC0+c2Nhbl9iZWdpbl9zcmMpIHsKKwljYXNlIFRSSUdfVElNRVI6CS8qIHBlcmlvZGljIHNjYW5uaW5nICovCisJCXRpbWVyID0gcnRkX25zX3RvX3RpbWVyKCZjbWQtPnNjYW5fYmVnaW5fYXJnLAorCQkJVFJJR19ST1VORF9ORUFSRVNUKTsKKwkJLyogc2V0IFBBQ0VSIGNsb2NrICovCisJCS8qRFBSSU5USyAoInJ0ZDUyMDogbG9hZGluZyAlZCBpbnRvIHBhY2VyXG4iLCB0aW1lcik7ICovCisJCVJ0ZFBhY2VyQ291bnRlcihkZXYsIHRpbWVyKTsKKworCQlicmVhazsKKworCWNhc2UgVFJJR19FWFQ6CisJCVJ0ZFBhY2VyU3RhcnRTb3VyY2UoZGV2LCAxKTsJLyogRVhURVJOQUx5IHRyaWdnZXIgcGFjZXIgKi8KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlEUFJJTlRLKCJydGQ1MjA6IFdhcm5pbmchIGlnbm9yaW5nIHNjYW5fYmVnaW5fc3JjIG1vZGUgJWRcbiIsCisJCQljbWQtPnNjYW5fYmVnaW5fc3JjKTsKKwl9CisKKwkvKiBTYW1wbGUgdGltaW5nIHdpdGhpbiBhIHNjYW4gKi8KKwlzd2l0Y2ggKGNtZC0+Y29udmVydF9zcmMpIHsKKwljYXNlIFRSSUdfVElNRVI6CS8qIHBlcmlvZGljICovCisJCWlmIChjbWQtPmNoYW5saXN0X2xlbiA+IDEpIHsJLyogb25seSBuZWVkZWQgZm9yIG11bHRpLWNoYW5uZWwgKi8KKwkJCXRpbWVyID0gcnRkX25zX3RvX3RpbWVyKCZjbWQtPmNvbnZlcnRfYXJnLAorCQkJCVRSSUdfUk9VTkRfTkVBUkVTVCk7CisJCQkvKiBzZXR1cCBCVVJTVCBjbG9jayAqLworCQkJLypEUFJJTlRLICgicnRkNTIwOiBsb2FkaW5nICVkIGludG8gYnVyc3RcbiIsIHRpbWVyKTsgKi8KKwkJCVJ0ZEJ1cnN0Q291bnRlcihkZXYsIHRpbWVyKTsKKwkJfQorCisJCWJyZWFrOworCisJY2FzZSBUUklHX0VYVDoJCS8qIGV4dGVybmFsICovCisJCVJ0ZEJ1cnN0U3RhcnRTb3VyY2UoZGV2LCAyKTsJLyogRVhURVJOQUx5IHRyaWdnZXIgYnVyc3QgKi8KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlEUFJJTlRLKCJydGQ1MjA6IFdhcm5pbmchIGlnbm9yaW5nIGNvbnZlcnRfc3JjIG1vZGUgJWRcbiIsCisJCQljbWQtPmNvbnZlcnRfc3JjKTsKKwl9CisJLyogZW5kIGNvbmZpZ3VyYXRpb24gKi8KKworCS8qIFRoaXMgZG9lc24ndCBzZWVtIHRvIHdvcmsuICBUaGVyZSBpcyBubyB3YXkgdG8gY2xlYXIgYW4gaW50ZXJydXB0CisJICAgdGhhdCB0aGUgcHJpb3JpdHkgY29udHJvbGxlciBoYXMgcXVldWVkISAqLworCVJ0ZEludGVycnVwdENsZWFyTWFzayhkZXYsIH4wKTsJLyogY2xlYXIgYW55IGV4aXN0aW5nIGZsYWdzICovCisJUnRkSW50ZXJydXB0Q2xlYXIoZGV2KTsKKworCS8qIFRPRE86IGFsbG93IG11bHRpcGxlIGludGVycnVwdCBzb3VyY2VzICovCisJaWYgKGRldnByaXYtPnRyYW5zQ291bnQgPiAwKSB7CS8qIHRyYW5zZmVyIGV2ZXJ5IE4gc2FtcGxlcyAqLworCQlSdGRJbnRlcnJ1cHRNYXNrKGRldiwgSVJRTV9BRENfQUJPVVRfQ05UKTsKKwkJRFBSSU5USygicnRkNTIwOiBUcmFuc2ZlcnJpbmcgZXZlcnkgJWRcbiIsIGRldnByaXYtPnRyYW5zQ291bnQpOworCX0gZWxzZSB7CQkvKiAxLzIgRklGTyB0cmFuc2ZlcnMgKi8KKyNpZmRlZiBVU0VfRE1BCisJCWRldnByaXYtPmZsYWdzIHw9IERNQTBfQUNUSVZFOworCisJCS8qIHBvaW50IHRvIGZpcnN0IHRyYW5zZmVyIGluIHJpbmcgKi8KKwkJZGV2cHJpdi0+ZG1hME9mZnNldCA9IDA7CisJCVJ0ZERtYTBNb2RlKGRldiwgRE1BX01PREVfQklUUyk7CisJCVJ0ZERtYTBOZXh0KGRldiwJLyogcG9pbnQgdG8gZmlyc3QgYmxvY2sgKi8KKwkJCWRldnByaXYtPmRtYTBDaGFpbltETUFfQ0hBSU5fQ09VTlQgLSAxXS5uZXh0KTsKKwkJUnRkRG1hMFNvdXJjZShkZXYsIERNQVNfQURGSUZPX0hBTEZfRlVMTCk7CS8qIHNldCBETUEgdHJpZ2dlciBzb3VyY2UgKi8KKworCQlSdGRQbHhJbnRlcnJ1cHRXcml0ZShkZXYsCS8qIGVuYWJsZSBpbnRlcnJ1cHQgKi8KKwkJCVJ0ZFBseEludGVycnVwdFJlYWQoZGV2KSB8IElDU19ETUEwX0UpOworCQkvKiBNdXN0IGJlIDIgc3RlcHMuICBTZWUgUExYIGFwcCBub3RlIGFib3V0ICJTdGFydGluZyBhIERNQSB0cmFuc2ZlciIgKi8KKwkJUnRkRG1hMENvbnRyb2woZGV2LCBQTFhfRE1BX0VOX0JJVCk7CS8qIGVuYWJsZSBETUEgKGNsZWFyIElOVFI/KSAqLworCQlSdGREbWEwQ29udHJvbChkZXYsIFBMWF9ETUFfRU5fQklUIHwgUExYX0RNQV9TVEFSVF9CSVQpOwkvKnN0YXJ0IERNQSAqLworCQlEUFJJTlRLKCJydGQ1MjA6IFVzaW5nIERNQTAgdHJhbnNmZXJzLiBwbHhJbnQgJXggUnRkSW50ICV4XG4iLAorCQkJUnRkUGx4SW50ZXJydXB0UmVhZChkZXYpLCBkZXZwcml2LT5pbnRNYXNrKTsKKyNlbHNlIC8qIFVTRV9ETUEgKi8KKwkJUnRkSW50ZXJydXB0TWFzayhkZXYsIElSUU1fQURDX0FCT1VUX0NOVCk7CisJCURQUklOVEsoInJ0ZDUyMDogVHJhbnNmZXJyaW5nIGV2ZXJ5IDEvMiBGSUZPXG4iKTsKKyNlbmRpZiAvKiBVU0VfRE1BICovCisJfQorCisJLyogQlVHOiBzdGFydF9zcmMgaXMgQVNTVU1FRCB0byBiZSBUUklHX05PVyAqLworCS8qIEJVRz8gaXQgc2VlbXMgbGlrZSB0aGluZ3MgYXJlIHJ1bm5pbmcgYmVmb3JlIHRoZSAic3RhcnQiICovCisJUnRkUGFjZXJTdGFydChkZXYpOwkvKiBTdGFydCBQQUNFUiAqLworCXJldHVybiAwOworfQorCisvKgorICBTdG9wIGEgcnVubmluZyBkYXRhIGFxdWlzaXRpb24uCisqLworc3RhdGljIGludCBydGRfYWlfY2FuY2VsKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKiBzKQoreworCXUxNiBzdGF0dXM7CisKKwlSdGRQYWNlclN0b3BTb3VyY2UoZGV2LCAwKTsJLyogc3RvcCBvbiBTT0ZUV0FSRSBzdG9wICovCisJUnRkUGFjZXJTdG9wKGRldik7CS8qIFN0b3AgUEFDRVIgKi8KKwlSdGRBZGNDb252ZXJzaW9uU291cmNlKGRldiwgMCk7CS8qIHNvZnR3YXJlIHRyaWdnZXIgb25seSAqLworCVJ0ZEludGVycnVwdE1hc2soZGV2LCAwKTsKKwlkZXZwcml2LT5haUNvdW50ID0gMDsJLyogc3RvcCBhbmQgZG9uJ3QgdHJhbnNmZXIgYW55IG1vcmUgKi8KKyNpZmRlZiBVU0VfRE1BCisJaWYgKGRldnByaXYtPmZsYWdzICYgRE1BMF9BQ1RJVkUpIHsKKwkJUnRkUGx4SW50ZXJydXB0V3JpdGUoZGV2LAkvKiBkaXNhYmxlIGFueSBtb3JlIGludGVycnVwdHMgKi8KKwkJCVJ0ZFBseEludGVycnVwdFJlYWQoZGV2KSAmIH5JQ1NfRE1BMF9FKTsKKwkJYWJvcnRfZG1hKGRldiwgMCk7CisJCWRldnByaXYtPmZsYWdzICY9IH5ETUEwX0FDVElWRTsKKwl9CisjZW5kaWYgLyogVVNFX0RNQSAqLworCXN0YXR1cyA9IFJ0ZEludGVycnVwdFN0YXR1cyhkZXYpOworCURQUklOVEsoInJ0ZDUyMDogQWNxdWlzaXRpb24gY2FuY2VsZWQuICVsZCBpbnRzLCBpbnRTdGF0PSV4LCBvdmVyU3RhdD0leFxuIiwgZGV2cHJpdi0+aW50Q291bnQsIHN0YXR1cywgMHhmZmZmICYgUnRkSW50ZXJydXB0T3ZlcnJ1blN0YXR1cyhkZXYpKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAgR2l2ZW4gYSBkZXNpcmVkIHBlcmlvZCBhbmQgdGhlIGNsb2NrIHBlcmlvZCAoYm90aCBpbiBucyksCisgIHJldHVybiB0aGUgcHJvcGVyIGNvdW50ZXIgdmFsdWUgKGRpdmlkZXItMSkuCisgIFNldHMgdGhlIG9yaWdpbmFsIHBlcmlvZCB0byBiZSB0aGUgdHJ1ZSB2YWx1ZS4KKyAgTm90ZTogeW91IGhhdmUgdG8gY2hlY2sgaWYgdGhlIHZhbHVlIGlzIGxhcmdlciB0aGFuIHRoZSBjb3VudGVyIHJhbmdlIQorKi8KK3N0YXRpYyBpbnQgcnRkX25zX3RvX3RpbWVyX2Jhc2UodW5zaWduZWQgaW50ICpuYW5vc2VjLAkvKiBkZXNpcmVkIHBlcmlvZCAoaW4gbnMpICovCisJaW50IHJvdW5kX21vZGUsIGludCBiYXNlKQorewkJCQkvKiBjbG9jayBwZXJpb2QgKGluIG5zKSAqLworCWludCBkaXZpZGVyOworCisJc3dpdGNoIChyb3VuZF9tb2RlKSB7CisJY2FzZSBUUklHX1JPVU5EX05FQVJFU1Q6CisJZGVmYXVsdDoKKwkJZGl2aWRlciA9ICgqbmFub3NlYyArIGJhc2UgLyAyKSAvIGJhc2U7CisJCWJyZWFrOworCWNhc2UgVFJJR19ST1VORF9ET1dOOgorCQlkaXZpZGVyID0gKCpuYW5vc2VjKSAvIGJhc2U7CisJCWJyZWFrOworCWNhc2UgVFJJR19ST1VORF9VUDoKKwkJZGl2aWRlciA9ICgqbmFub3NlYyArIGJhc2UgLSAxKSAvIGJhc2U7CisJCWJyZWFrOworCX0KKwlpZiAoZGl2aWRlciA8IDIpCisJCWRpdmlkZXIgPSAyOwkvKiBtaW4gaXMgZGl2aWRlIGJ5IDIgKi8KKworCS8qIE5vdGU6IHdlIGRvbid0IGNoZWNrIGZvciBtYXgsIGJlY2F1c2UgZGlmZmVyZW50IHRpbWVycworCSAgIGhhdmUgZGlmZmVyZW50IHJhbmdlcyAqLworCisJKm5hbm9zZWMgPSBiYXNlICogZGl2aWRlcjsKKwlyZXR1cm4gZGl2aWRlciAtIDE7CS8qIGNvdW50ZG93biBpcyBkaXZpc29yKzEgKi8KK30KKworLyoKKyAgR2l2ZW4gYSBkZXNpcmVkIHBlcmlvZCAoaW4gbnMpLAorICByZXR1cm4gdGhlIHByb3BlciBjb3VudGVyIHZhbHVlIChkaXZpZGVyLTEpIGZvciB0aGUgaW50ZXJuYWwgY2xvY2suCisgIFNldHMgdGhlIG9yaWdpbmFsIHBlcmlvZCB0byBiZSB0aGUgdHJ1ZSB2YWx1ZS4KKyovCitzdGF0aWMgaW50IHJ0ZF9uc190b190aW1lcih1bnNpZ25lZCBpbnQgKm5zLCBpbnQgcm91bmRfbW9kZSkKK3sKKwlyZXR1cm4gcnRkX25zX3RvX3RpbWVyX2Jhc2UobnMsIHJvdW5kX21vZGUsIFJURF9DTE9DS19CQVNFKTsKK30KKworLyoKKyAgT3V0cHV0IG9uZSAob3IgbW9yZSkgYW5hbG9nIHZhbHVlcyB0byBhIHNpbmdsZSBwb3J0IGFzIGZhc3QgYXMgcG9zc2libGUuCisqLworc3RhdGljIGludCBydGRfYW9fd2luc24oY29tZWRpX2RldmljZSAqIGRldiwKKwljb21lZGlfc3ViZGV2aWNlICogcywgY29tZWRpX2luc24gKiBpbnNuLCBsc2FtcGxfdCAqIGRhdGEpCit7CisJaW50IGk7CisJaW50IGNoYW4gPSBDUl9DSEFOKGluc24tPmNoYW5zcGVjKTsKKwlpbnQgcmFuZ2UgPSBDUl9SQU5HRShpbnNuLT5jaGFuc3BlYyk7CisKKwkvKiBDb25maWd1cmUgdGhlIG91dHB1dCByYW5nZSAodGFibGUgaW5kZXggbWF0Y2hlcyB0aGUgcmFuZ2UgdmFsdWVzKSAqLworCVJ0ZERhY1JhbmdlKGRldiwgY2hhbiwgcmFuZ2UpOworCisJLyogV3JpdGluZyBhIGxpc3Qgb2YgdmFsdWVzIHRvIGFuIEFPIGNoYW5uZWwgaXMgcHJvYmFibHkgbm90CisJICogdmVyeSB1c2VmdWwsIGJ1dCB0aGF0J3MgaG93IHRoZSBpbnRlcmZhY2UgaXMgZGVmaW5lZC4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgaW5zbi0+bjsgKytpKSB7CisJCWludCB2YWwgPSBkYXRhW2ldIDw8IDM7CisJCWludCBzdGF0ID0gMDsJLyogaW5pdGlhbGl6ZSB0byBhdm9pZCBib2d1cyB3YXJuaW5nICovCisJCWludCBpaTsKKworCQkvKiBWRVJJRlk6IGNvbWVkaSByYW5nZSBhbmQgb2Zmc2V0IGNvbnZlcnNpb25zICovCisKKwkJaWYgKChyYW5nZSA+IDEpCS8qIGJpcG9sYXIgKi8KKwkJCSYmKGRhdGFbaV0gPCAyMDQ4KSkgeworCQkJLyogb2Zmc2V0IGFuZCBzaWduIGV4dGVuZCAqLworCQkJdmFsID0gKCgoaW50KWRhdGFbaV0pIC0gMjA0OCkgPDwgMzsKKwkJfSBlbHNlIHsJLyogdW5pcG9sb3IgKi8KKwkJCXZhbCA9IGRhdGFbaV0gPDwgMzsKKwkJfQorCisJCURQUklOVEsoImNvbWVkaTogcnRkNTIwIERBQyBjaGFuPSVkIHJhbmdlPSVkIHdyaXRpbmcgJWQgYXMgMHgleFxuIiwgY2hhbiwgcmFuZ2UsIGRhdGFbaV0sIHZhbCk7CisKKwkJLyogYSB0eXBpY2FsIHByb2dyYW1taW5nIHNlcXVlbmNlICovCisJCVJ0ZERhY0ZpZm9QdXQoZGV2LCBjaGFuLCB2YWwpOwkvKiBwdXQgdGhlIHZhbHVlIGluICovCisJCVJ0ZERhY1VwZGF0ZShkZXYsIGNoYW4pOwkvKiB0cmlnZ2VyIHRoZSBjb252ZXJzaW9uICovCisKKwkJZGV2cHJpdi0+YW9WYWx1ZVtjaGFuXSA9IGRhdGFbaV07CS8qIHNhdmUgZm9yIHJlYWQgYmFjayAqLworCisJCWZvciAoaWkgPSAwOyBpaSA8IFJURF9EQUNfVElNRU9VVDsgKytpaSkgeworCQkJc3RhdCA9IFJ0ZEZpZm9TdGF0dXMoZGV2KTsKKwkJCS8qIDEgLT4gbm90IGVtcHR5ICovCisJCQlpZiAoc3RhdCAmICgoMCA9PSBjaGFuKSA/IEZTX0RBQzFfTk9UX0VNUFRZIDoKKwkJCQkJRlNfREFDMl9OT1RfRU1QVFkpKQorCQkJCWJyZWFrOworCQkJV0FJVF9RVUlFVExZOworCQl9CisJCWlmIChpaSA+PSBSVERfREFDX1RJTUVPVVQpIHsKKwkJCURQUklOVEsoInJ0ZDUyMDogRXJyb3I6IERBQyBuZXZlciBmaW5pc2hlZCEgRmlmb1N0YXR1cz0weCV4XG4iLCBzdGF0IF4gMHg2NjY2KTsKKwkJCXJldHVybiAtRVRJTUVET1VUOworCQl9CisJfQorCisJLyogcmV0dXJuIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyByZWFkL3dyaXR0ZW4gKi8KKwlyZXR1cm4gaTsKK30KKworLyogQU8gc3ViZGV2aWNlcyBzaG91bGQgaGF2ZSBhIHJlYWQgaW5zbiBhcyB3ZWxsIGFzIGEgd3JpdGUgaW5zbi4KKyAqIFVzdWFsbHkgdGhpcyBtZWFucyBjb3B5aW5nIGEgdmFsdWUgc3RvcmVkIGluIGRldnByaXYuICovCitzdGF0aWMgaW50IHJ0ZF9hb19yaW5zbihjb21lZGlfZGV2aWNlICogZGV2LAorCWNvbWVkaV9zdWJkZXZpY2UgKiBzLCBjb21lZGlfaW5zbiAqIGluc24sIGxzYW1wbF90ICogZGF0YSkKK3sKKwlpbnQgaTsKKwlpbnQgY2hhbiA9IENSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpOworCisJZm9yIChpID0gMDsgaSA8IGluc24tPm47IGkrKykgeworCQlkYXRhW2ldID0gZGV2cHJpdi0+YW9WYWx1ZVtjaGFuXTsKKwl9CisKKwlyZXR1cm4gaTsKK30KKworLyoKKyAgIFdyaXRlIGEgbWFza2VkIHNldCBvZiBiaXRzIGFuZCB0aGUgcmVhZCBiYWNrIHRoZSBwb3J0LgorICAgV2UgdHJhY2sgd2hhdCB0aGUgYml0cyBzaG91bGQgYmUgKGkuZS4gd2UgZG9uJ3QgcmVhZCB0aGUgcG9ydCBmaXJzdCkuCisKKyAgIERJTyBkZXZpY2VzIGFyZSBzbGlnaHRseSBzcGVjaWFsLiAgQWx0aG91Z2ggaXQgaXMgcG9zc2libGUgdG8KKyAqIGltcGxlbWVudCB0aGUgaW5zbl9yZWFkL2luc25fd3JpdGUgaW50ZXJmYWNlLCBpdCBpcyBtdWNoIG1vcmUKKyAqIHVzZWZ1bCB0byBhcHBsaWNhdGlvbnMgaWYgeW91IGltcGxlbWVudCB0aGUgaW5zbl9iaXRzIGludGVyZmFjZS4KKyAqIFRoaXMgYWxsb3dzIHBhY2tlZCByZWFkaW5nL3dyaXRpbmcgb2YgdGhlIERJTyBjaGFubmVscy4gIFRoZQorICogY29tZWRpIGNvcmUgY2FuIGNvbnZlcnQgYmV0d2VlbiBpbnNuX2JpdHMgYW5kIGluc25fcmVhZC93cml0ZQorICovCitzdGF0aWMgaW50IHJ0ZF9kaW9faW5zbl9iaXRzKGNvbWVkaV9kZXZpY2UgKiBkZXYsCisJY29tZWRpX3N1YmRldmljZSAqIHMsIGNvbWVkaV9pbnNuICogaW5zbiwgbHNhbXBsX3QgKiBkYXRhKQoreworCWlmIChpbnNuLT5uICE9IDIpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogVGhlIGluc24gZGF0YSBpcyBhIG1hc2sgaW4gZGF0YVswXSBhbmQgdGhlIG5ldyBkYXRhCisJICogaW4gZGF0YVsxXSwgZWFjaCBjaGFubmVsIGNvb3Jlc3BvbmRpbmcgdG8gYSBiaXQuICovCisJaWYgKGRhdGFbMF0pIHsKKwkJcy0+c3RhdGUgJj0gfmRhdGFbMF07CisJCXMtPnN0YXRlIHw9IGRhdGFbMF0gJiBkYXRhWzFdOworCisJCS8qIFdyaXRlIG91dCB0aGUgbmV3IGRpZ2l0YWwgb3V0cHV0IGxpbmVzICovCisJCVJ0ZERpbzBXcml0ZShkZXYsIHMtPnN0YXRlKTsKKwl9CisJLyogb24gcmV0dXJuLCBkYXRhWzFdIGNvbnRhaW5zIHRoZSB2YWx1ZSBvZiB0aGUgZGlnaXRhbAorCSAqIGlucHV0IGxpbmVzLiAqLworCWRhdGFbMV0gPSBSdGREaW8wUmVhZChkZXYpOworCisJLypEUFJJTlRLKCJydGQ1MjA6cG9ydF8wIHdyb3RlOiAweCV4IHJlYWQ6IDB4JXhcbiIsIHMtPnN0YXRlLCBkYXRhWzFdKTsgKi8KKworCXJldHVybiAyOworfQorCisvKgorICBDb25maWd1cmUgb25lIGJpdCBvbiBhIElPIHBvcnQgYXMgSW5wdXQgb3IgT3V0cHV0IChoZW5jZSB0aGUgbmFtZSA6LSkuCisqLworc3RhdGljIGludCBydGRfZGlvX2luc25fY29uZmlnKGNvbWVkaV9kZXZpY2UgKiBkZXYsCisJY29tZWRpX3N1YmRldmljZSAqIHMsIGNvbWVkaV9pbnNuICogaW5zbiwgbHNhbXBsX3QgKiBkYXRhKQoreworCWludCBjaGFuID0gQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyk7CisKKwkvKiBUaGUgaW5wdXQgb3Igb3V0cHV0IGNvbmZpZ3VyYXRpb24gb2YgZWFjaCBkaWdpdGFsIGxpbmUgaXMKKwkgKiBjb25maWd1cmVkIGJ5IGEgc3BlY2lhbCBpbnNuX2NvbmZpZyBpbnN0cnVjdGlvbi4gIGNoYW5zcGVjCisJICogY29udGFpbnMgdGhlIGNoYW5uZWwgdG8gYmUgY2hhbmdlZCwgYW5kIGRhdGFbMF0gY29udGFpbnMgdGhlCisJICogdmFsdWUgQ09NRURJX0lOUFVUIG9yIENPTUVESV9PVVRQVVQuICovCisJc3dpdGNoIChkYXRhWzBdKSB7CisJY2FzZSBJTlNOX0NPTkZJR19ESU9fT1VUUFVUOgorCQlzLT5pb19iaXRzIHw9IDEgPDwgY2hhbjsJLyogMSBtZWFucyBPdXQgKi8KKwkJYnJlYWs7CisJY2FzZSBJTlNOX0NPTkZJR19ESU9fSU5QVVQ6CisJCXMtPmlvX2JpdHMgJj0gfigxIDw8IGNoYW4pOworCQlicmVhazsKKwljYXNlIElOU05fQ09ORklHX0RJT19RVUVSWToKKwkJZGF0YVsxXSA9CisJCQkocy0+CisJCQlpb19iaXRzICYgKDEgPDwgY2hhbikpID8gQ09NRURJX09VVFBVVCA6IENPTUVESV9JTlBVVDsKKwkJcmV0dXJuIGluc24tPm47CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCURQUklOVEsoInJ0ZDUyMDogcG9ydF8wX2RpcmVjdGlvbj0weCV4ICgxIG1lYW5zIG91dClcbiIsIHMtPmlvX2JpdHMpOworCS8qIFRPRE8gc3VwcG9ydCBkaWdpdGFsIG1hdGNoIGludGVycnVwdHMgYW5kIHN0cm9iZXMgKi8KKwlSdGREaW9TdGF0dXNXcml0ZShkZXYsIDB4MDEpOwkvKiBtYWtlIERpbzBDdHJsIHBvaW50IHRvIGRpcmVjdGlvbiAqLworCVJ0ZERpbzBDdHJsV3JpdGUoZGV2LCBzLT5pb19iaXRzKTsJLyogc2V0IGRpcmVjdGlvbiAxIG1lYW5zIE91dCAqLworCVJ0ZERpb1N0YXR1c1dyaXRlKGRldiwgMCk7CS8qIG1ha2UgRGlvMEN0cmwgY2xlYXIgaW50ZXJydXB0cyAqLworCisJLyogcG9ydDEgY2FuIG9ubHkgYmUgYWxsIGlucHV0IG9yIGFsbCBvdXRwdXQgKi8KKworCS8qIHRoZXJlIGFyZSBhbHNvIDIgdXNlciBpbnB1dCBsaW5lcyBhbmQgMiB1c2VyIG91dHB1dCBsaW5lcyAqLworCisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBBIGNvbnZlbmllbnQgbWFjcm8gdGhhdCBkZWZpbmVzIGluaXRfbW9kdWxlKCkgYW5kIGNsZWFudXBfbW9kdWxlKCksCisgKiBhcyBuZWNlc3NhcnkuCisgKi8KK0NPTUVESV9QQ0lfSU5JVENMRUFOVVAocnRkNTIwRHJpdmVyLCBydGQ1MjBfcGNpX3RhYmxlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9ydGQ1MjAuaCBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9ydGQ1MjAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZWI1MGI4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3J0ZDUyMC5oCkBAIC0wLDAgKzEsNDEyIEBACisvKgorICAgIGNvbWVkaS9kcml2ZXJzL3J0ZDUyMC5oCisgICAgQ29tZWRpIGRyaXZlciBkZWZpbmVzIGZvciBSZWFsIFRpbWUgRGV2aWNlcyAoUlREKSBQQ0k0NTIwL0RNNzUyMAorCisgICAgQ09NRURJIC0gTGludXggQ29udHJvbCBhbmQgTWVhc3VyZW1lbnQgRGV2aWNlIEludGVyZmFjZQorICAgIENvcHlyaWdodCAoQykgMjAwMSBEYXZpZCBBLiBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorKi8KKworLyoKKyAgICBDcmVhdGVkIGJ5IERhbiBDaHJpc3RpYW4sIE5BU0EgQW1lcyBSZXNlYXJjaCBDZW50ZXIuCisgICAgU2VlIGJvYXJkIG5vdGVzIGluIHJ0ZDUyMC5jCisqLworCisvKgorICBMQVMwIFJ1bnRpbWUgQXJlYQorICBMb2NhbCBBZGRyZXNzIFNwYWNlIDAgT2Zmc2V0CQlSZWFkIEZ1bmN0aW9uCVdyaXRlIEZ1bmN0aW9uCisqLworI2RlZmluZSBMQVMwX1NQQVJFXzAwICAgIDB4MDAwMAkvLyAtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0KKyNkZWZpbmUgTEFTMF9TUEFSRV8wNCAgICAweDAwMDQJLy8gLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtCisjZGVmaW5lIExBUzBfVVNFUl9JTyAgICAgMHgwMDA4CS8vIFJlYWQgVXNlciBJbnB1dHMgICAgICAgICAgICAgICAgV3JpdGUgVXNlciBPdXRwdXRzCisjZGVmaW5lIExBUzBfU1BBUkVfMEMgICAgMHgwMDBDCS8vIC0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLQorI2RlZmluZSBMQVMwX0FEQyAgICAgICAgIDB4MDAxMAkvLyBSZWFkIEZJRk8gU3RhdHVzICAgICAgICAgICAgICAgIFNvZnR3YXJlIEEvRCBTdGFydAorI2RlZmluZSBMQVMwX0RBQzEgICAgICAgIDB4MDAxNAkvLyAtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvZnR3YXJlIEQvQTEgVXBkYXRlCisjZGVmaW5lIExBUzBfREFDMiAgICAgICAgMHgwMDE4CS8vIC0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU29mdHdhcmUgRC9BMiBVcGRhdGUKKyNkZWZpbmUgTEFTMF9TUEFSRV8xQyAgICAweDAwMUMJLy8gLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtCisjZGVmaW5lIExBUzBfU1BBUkVfMjAgICAgMHgwMDIwCS8vIC0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLQorI2RlZmluZSBMQVMwX0RBQyAgICAgICAgIDB4MDAyNAkvLyAtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvZnR3YXJlIFNpbXVsdGFuZW91cyBEL0ExIGFuZCBEL0EyIFVwZGF0ZQorI2RlZmluZSBMQVMwX1BBQ0VSICAgICAgIDB4MDAyOAkvLyBTb2Z0d2FyZSBQYWNlciBTdGFydCAgICAgICAgICAgIFNvZnR3YXJlIFBhY2VyIFN0b3AKKyNkZWZpbmUgTEFTMF9USU1FUiAgICAgICAweDAwMkMJLy8gUmVhZCBUaW1lciBDb3VudGVycyBTdGF0dXMgICAgICBIRElOIFNvZnR3YXJlIFRyaWdnZXIKKyNkZWZpbmUgTEFTMF9JVCAgICAgICAgICAweDAwMzAJLy8gUmVhZCBJbnRlcnJ1cHQgU3RhdHVzICAgICAgICAgICBXcml0ZSBJbnRlcnJ1cHQgRW5hYmxlIE1hc2sgUmVnaXN0ZXIKKyNkZWZpbmUgTEFTMF9DTEVBUiAgICAgICAweDAwMzQJLy8gQ2xlYXIgSVRzIHNldCBieSBDbGVhciBNYXNrICAgICBTZXQgSW50ZXJydXB0IENsZWFyIE1hc2sKKyNkZWZpbmUgTEFTMF9PVkVSUlVOICAgICAweDAwMzgJLy8gUmVhZCBwZW5kaW5nIGludGVycnVwdHMgICAgICAgICBDbGVhciBPdmVycnVuIFJlZ2lzdGVyCisjZGVmaW5lIExBUzBfU1BBUkVfM0MgICAgMHgwMDNDCS8vIC0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLQorCisvKgorICBMQVMwIFJ1bnRpbWUgQXJlYSBUaW1lci9Db3VudGVyLERpZy5JTworICBOYW1lCQkJTG9jYWwgQWRkcmVzcwkJCUZ1bmN0aW9uCisqLworI2RlZmluZSBMQVMwX1BDTEsgICAgICAgIDB4MDA0MAkvLyBQYWNlciBDbG9jayB2YWx1ZSAoMjRiaXQpICAgICAgICAgICAgIFBhY2VyIENsb2NrIGxvYWQgKDI0Yml0KQorI2RlZmluZSBMQVMwX0JDTEsgICAgICAgIDB4MDA0NAkvLyBCdXJzdCBDbG9jayB2YWx1ZSAoMTBiaXQpICAgICAgICAgICAgIEJ1cnN0IENsb2NrIGxvYWQgKDEwYml0KQorI2RlZmluZSBMQVMwX0FEQ19TQ05UICAgIDB4MDA0OAkvLyBBL0QgU2FtcGxlIGNvdW50ZXIgdmFsdWUgKDEwYml0KSAgICAgIEEvRCBTYW1wbGUgY291bnRlciBsb2FkICgxMGJpdCkKKyNkZWZpbmUgTEFTMF9EQUMxX1VDTlQgICAweDAwNEMJLy8gRC9BMSBVcGRhdGUgY291bnRlciB2YWx1ZSAoMTAgYml0KSAgICBEL0ExIFVwZGF0ZSBjb3VudGVyIGxvYWQgKDEwYml0KQorI2RlZmluZSBMQVMwX0RBQzJfVUNOVCAgIDB4MDA1MAkvLyBEL0EyIFVwZGF0ZSBjb3VudGVyIHZhbHVlICgxMCBiaXQpICAgIEQvQTIgVXBkYXRlIGNvdW50ZXIgbG9hZCAoMTBiaXQpCisjZGVmaW5lIExBUzBfRENOVCAgICAgICAgMHgwMDU0CS8vIERlbGF5IGNvdW50ZXIgdmFsdWUgKDE2IGJpdCkgICAgICAgICAgRGVsYXkgY291bnRlciBsb2FkICgxNmJpdCkKKyNkZWZpbmUgTEFTMF9BQ05UICAgICAgICAweDAwNTgJLy8gQWJvdXQgY291bnRlciB2YWx1ZSAoMTYgYml0KSAgICAgICAgICBBYm91dCBjb3VudGVyIGxvYWQgKDE2Yml0KQorI2RlZmluZSBMQVMwX0RBQ19DTEsgICAgIDB4MDA1QwkvLyBEQUMgY2xvY2sgdmFsdWUgKDE2Yml0KSAgICAgICAgICAgICAgIERBQyBjbG9jayBsb2FkICgxNmJpdCkKKyNkZWZpbmUgTEFTMF9VVEMwICAgICAgICAweDAwNjAJLy8gODI1NCBUQyBDb3VudGVyIDAgVXNlciBUQyAwIHZhbHVlICAgICBMb2FkIGNvdW50IGluIFRDIENvdW50ZXIgMAorI2RlZmluZSBMQVMwX1VUQzEgICAgICAgIDB4MDA2NAkvLyA4MjU0IFRDIENvdW50ZXIgMSBVc2VyIFRDIDEgdmFsdWUgICAgIExvYWQgY291bnQgaW4gVEMgQ291bnRlciAxCisjZGVmaW5lIExBUzBfVVRDMiAgICAgICAgMHgwMDY4CS8vIDgyNTQgVEMgQ291bnRlciAyIFVzZXIgVEMgMiB2YWx1ZSAgICAgTG9hZCBjb3VudCBpbiBUQyBDb3VudGVyIDIKKyNkZWZpbmUgTEFTMF9VVENfQ1RSTCAgICAweDAwNkMJLy8gODI1NCBUQyBDb250cm9sIFdvcmQgICAgICAgICAgICAgICAgICBQcm9ncmFtIGNvdW50ZXIgbW9kZSBmb3IgVEMKKyNkZWZpbmUgTEFTMF9ESU8wICAgICAgICAweDAwNzAJLy8gRGlnaXRhbCBJL08gUG9ydCAwIFJlYWQgUG9ydCAgICAgICAgICBEaWdpdGFsIEkvTyBQb3J0IDAgV3JpdGUgUG9ydAorI2RlZmluZSBMQVMwX0RJTzEgICAgICAgIDB4MDA3NAkvLyBEaWdpdGFsIEkvTyBQb3J0IDEgUmVhZCBQb3J0ICAgICAgICAgIERpZ2l0YWwgSS9PIFBvcnQgMSBXcml0ZSBQb3J0CisjZGVmaW5lIExBUzBfRElPMF9DVFJMICAgMHgwMDc4CS8vIENsZWFyIGRpZ2l0YWwgSVJRIHN0YXR1cyBmbGFnL3JlYWQgICAgQ2xlYXIgZGlnaXRhbCBjaGlwL3Byb2dyYW0gUG9ydCAwCisjZGVmaW5lIExBUzBfRElPX1NUQVRVUyAgMHgwMDdDCS8vIFJlYWQgRGlnaXRhbCBJL08gU3RhdHVzIHdvcmQgICAgICAgICAgUHJvZ3JhbSBkaWdpdGFsIGNvbnRyb2wgcmVnaXN0ZXIgJgorCisvKgorICBMQVMwIFNldHVwIEFyZWEKKyAgTmFtZQkJCUxvY2FsIEFkZHJlc3MJCQlGdW5jdGlvbgorKi8KKyNkZWZpbmUgTEFTMF9CT0FSRF9SRVNFVCAgICAgICAgMHgwMTAwCS8vIEJvYXJkIHJlc2V0CisjZGVmaW5lIExBUzBfRE1BMF9TUkMgICAgICAgICAgIDB4MDEwNAkvLyBETUEgMCBTb3VyY2VzIHNlbGVjdAorI2RlZmluZSBMQVMwX0RNQTFfU1JDICAgICAgICAgICAweDAxMDgJLy8gRE1BIDEgU291cmNlcyBzZWxlY3QKKyNkZWZpbmUgTEFTMF9BRENfQ09OVkVSU0lPTiAgICAgMHgwMTBDCS8vIEEvRCBDb252ZXJzaW9uIFNpZ25hbCBzZWxlY3QKKyNkZWZpbmUgTEFTMF9CVVJTVF9TVEFSVCAgICAgICAgMHgwMTEwCS8vIEJ1cnN0IENsb2NrIFN0YXJ0IFRyaWdnZXIgc2VsZWN0CisjZGVmaW5lIExBUzBfUEFDRVJfU1RBUlQgICAgICAgIDB4MDExNAkvLyBQYWNlciBDbG9jayBTdGFydCBUcmlnZ2VyIHNlbGVjdAorI2RlZmluZSBMQVMwX1BBQ0VSX1NUT1AgICAgICAgICAweDAxMTgJLy8gUGFjZXIgQ2xvY2sgU3RvcCBUcmlnZ2VyIHNlbGVjdAorI2RlZmluZSBMQVMwX0FDTlRfU1RPUF9FTkFCTEUgICAweDAxMUMJLy8gQWJvdXQgQ291bnRlciBTdG9wIEVuYWJsZQorI2RlZmluZSBMQVMwX1BBQ0VSX1JFUEVBVCAgICAgICAweDAxMjAJLy8gUGFjZXIgU3RhcnQgVHJpZ2dlciBNb2RlIHNlbGVjdAorI2RlZmluZSBMQVMwX0RJTl9TVEFSVCAgICAgICAgICAweDAxMjQJLy8gSGlnaCBTcGVlZCBEaWdpdGFsIElucHV0IFNhbXBsaW5nIFNpZ25hbCBzZWxlY3QKKyNkZWZpbmUgTEFTMF9ESU5fRklGT19DTEVBUiAgICAgMHgwMTI4CS8vIERpZ2l0YWwgSW5wdXQgRklGTyBDbGVhcgorI2RlZmluZSBMQVMwX0FEQ19GSUZPX0NMRUFSICAgICAweDAxMkMJLy8gQS9EIEZJRk8gQ2xlYXIKKyNkZWZpbmUgTEFTMF9DR1RfV1JJVEUgICAgICAgICAgMHgwMTMwCS8vIENoYW5uZWwgR2FpbiBUYWJsZSBXcml0ZQorI2RlZmluZSBMQVMwX0NHTF9XUklURSAgICAgICAgICAweDAxMzQJLy8gQ2hhbm5lbCBHYWluIExhdGNoIFdyaXRlCisjZGVmaW5lIExBUzBfQ0dfREFUQSAgICAgICAgICAgIDB4MDEzOAkvLyBEaWdpdGFsIFRhYmxlIFdyaXRlCisjZGVmaW5lIExBUzBfQ0dUX0VOQUJMRQkJMHgwMTNDCS8vIENoYW5uZWwgR2FpbiBUYWJsZSBFbmFibGUKKyNkZWZpbmUgTEFTMF9DR19FTkFCTEUgICAgICAgICAgMHgwMTQwCS8vIERpZ2l0YWwgVGFibGUgRW5hYmxlCisjZGVmaW5lIExBUzBfQ0dUX1BBVVNFICAgICAgICAgIDB4MDE0NAkvLyBUYWJsZSBQYXVzZSBFbmFibGUKKyNkZWZpbmUgTEFTMF9DR1RfUkVTRVQgICAgICAgICAgMHgwMTQ4CS8vIFJlc2V0IENoYW5uZWwgR2FpbiBUYWJsZQorI2RlZmluZSBMQVMwX0NHVF9DTEVBUiAgICAgICAgICAweDAxNEMJLy8gQ2xlYXIgQ2hhbm5lbCBHYWluIFRhYmxlCisjZGVmaW5lIExBUzBfREFDMV9DVFJMICAgICAgICAgIDB4MDE1MAkvLyBEL0ExIG91dHB1dCB0eXBlL3JhbmdlCisjZGVmaW5lIExBUzBfREFDMV9TUkMgICAgICAgICAgIDB4MDE1NAkvLyBEL0ExIHVwZGF0ZSBzb3VyY2UKKyNkZWZpbmUgTEFTMF9EQUMxX0NZQ0xFICAgICAgICAgMHgwMTU4CS8vIEQvQTEgY3ljbGUgbW9kZQorI2RlZmluZSBMQVMwX0RBQzFfUkVTRVQgICAgICAgICAweDAxNUMJLy8gRC9BMSBGSUZPIHJlc2V0CisjZGVmaW5lIExBUzBfREFDMV9GSUZPX0NMRUFSICAgIDB4MDE2MAkvLyBEL0ExIEZJRk8gY2xlYXIKKyNkZWZpbmUgTEFTMF9EQUMyX0NUUkwgICAgICAgICAgMHgwMTY0CS8vIEQvQTIgb3V0cHV0IHR5cGUvcmFuZ2UKKyNkZWZpbmUgTEFTMF9EQUMyX1NSQyAgICAgICAgICAgMHgwMTY4CS8vIEQvQTIgdXBkYXRlIHNvdXJjZQorI2RlZmluZSBMQVMwX0RBQzJfQ1lDTEUgICAgICAgICAweDAxNkMJLy8gRC9BMiBjeWNsZSBtb2RlCisjZGVmaW5lIExBUzBfREFDMl9SRVNFVCAgICAgICAgIDB4MDE3MAkvLyBEL0EyIEZJRk8gcmVzZXQKKyNkZWZpbmUgTEFTMF9EQUMyX0ZJRk9fQ0xFQVIgICAgMHgwMTc0CS8vIEQvQTIgRklGTyBjbGVhcgorI2RlZmluZSBMQVMwX0FEQ19TQ05UX1NSQyAgICAgICAweDAxNzgJLy8gQS9EIFNhbXBsZSBDb3VudGVyIFNvdXJjZSBzZWxlY3QKKyNkZWZpbmUgTEFTMF9QQUNFUl9TRUxFQ1QgICAgICAgMHgwMTgwCS8vIFBhY2VyIENsb2NrIHNlbGVjdAorI2RlZmluZSBMQVMwX1NCVVMwX1NSQyAgICAgICAgICAweDAxODQJLy8gU3luY0J1cyAwIFNvdXJjZSBzZWxlY3QKKyNkZWZpbmUgTEFTMF9TQlVTMF9FTkFCTEUgICAgICAgMHgwMTg4CS8vIFN5bmNCdXMgMCBlbmFibGUKKyNkZWZpbmUgTEFTMF9TQlVTMV9TUkMgICAgICAgICAgMHgwMThDCS8vIFN5bmNCdXMgMSBTb3VyY2Ugc2VsZWN0CisjZGVmaW5lIExBUzBfU0JVUzFfRU5BQkxFICAgICAgIDB4MDE5MAkvLyBTeW5jQnVzIDEgZW5hYmxlCisjZGVmaW5lIExBUzBfU0JVUzJfU1JDICAgICAgICAgIDB4MDE5OAkvLyBTeW5jQnVzIDIgU291cmNlIHNlbGVjdAorI2RlZmluZSBMQVMwX1NCVVMyX0VOQUJMRSAgICAgICAweDAxOUMJLy8gU3luY0J1cyAyIGVuYWJsZQorI2RlZmluZSBMQVMwX0VUUkdfUE9MQVJJVFkgICAgICAweDAxQTQJLy8gRXh0ZXJuYWwgVHJpZ2dlciBwb2xhcml0eSBzZWxlY3QKKyNkZWZpbmUgTEFTMF9FSU5UX1BPTEFSSVRZICAgICAgMHgwMUE4CS8vIEV4dGVybmFsIEludGVycnVwdCBwb2xhcml0eSBzZWxlY3QKKyNkZWZpbmUgTEFTMF9VVEMwX0NMT0NLICAgICAgICAgMHgwMUFDCS8vIFVUQzAgQ2xvY2sgc2VsZWN0CisjZGVmaW5lIExBUzBfVVRDMF9HQVRFICAgICAgICAgIDB4MDFCMAkvLyBVVEMwIEdhdGUgc2VsZWN0CisjZGVmaW5lIExBUzBfVVRDMV9DTE9DSyAgICAgICAgIDB4MDFCNAkvLyBVVEMxIENsb2NrIHNlbGVjdAorI2RlZmluZSBMQVMwX1VUQzFfR0FURSAgICAgICAgICAweDAxQjgJLy8gVVRDMSBHYXRlIHNlbGVjdAorI2RlZmluZSBMQVMwX1VUQzJfQ0xPQ0sgICAgICAgICAweDAxQkMJLy8gVVRDMiBDbG9jayBzZWxlY3QKKyNkZWZpbmUgTEFTMF9VVEMyX0dBVEUgICAgICAgICAgMHgwMUMwCS8vIFVUQzIgR2F0ZSBzZWxlY3QKKyNkZWZpbmUgTEFTMF9VT1VUMF9TRUxFQ1QgICAgICAgMHgwMUM0CS8vIFVzZXIgT3V0cHV0IDAgc291cmNlIHNlbGVjdAorI2RlZmluZSBMQVMwX1VPVVQxX1NFTEVDVCAgICAgICAweDAxQzgJLy8gVXNlciBPdXRwdXQgMSBzb3VyY2Ugc2VsZWN0CisjZGVmaW5lIExBUzBfRE1BMF9SRVNFVCAgICAgICAgIDB4MDFDQwkvLyBETUEwIFJlcXVlc3Qgc3RhdGUgbWFjaGluZSByZXNldAorI2RlZmluZSBMQVMwX0RNQTFfUkVTRVQgICAgICAgICAweDAxRDAJLy8gRE1BMSBSZXF1ZXN0IHN0YXRlIG1hY2hpbmUgcmVzZXQKKworLyoKKyAgTEFTMQorICBOYW1lCQkJTG9jYWwgQWRkcmVzcwkJCUZ1bmN0aW9uCisqLworI2RlZmluZSBMQVMxX0FEQ19GSUZPICAgICAgICAgICAgMHgwMDAwCS8vIFJlYWQgQS9EIEZJRk8gKDE2Yml0KSAtCisjZGVmaW5lIExBUzFfSERJT19GSUZPICAgICAgICAgICAweDAwMDQJLy8gUmVhZCBIaWdoIFNwZWVkIERpZ2l0YWwgSW5wdXQgRklGTyAoMTZiaXQpIC0KKyNkZWZpbmUgTEFTMV9EQUMxX0ZJRk8gICAgICAgICAgIDB4MDAwOAkvLyAtIFdyaXRlIEQvQTEgRklGTyAoMTZiaXQpCisjZGVmaW5lIExBUzFfREFDMl9GSUZPICAgICAgICAgICAweDAwMEMJLy8gLSBXcml0ZSBEL0EyIEZJRk8gKDE2Yml0KQorCisvKgorICBMQ0ZHOiBQTFggOTA4MCBsb2NhbCBjb25maWcgJiBydW50aW1lIHJlZ2lzdGVycworICBOYW1lCQkJTG9jYWwgQWRkcmVzcwkJCUZ1bmN0aW9uCisqLworI2RlZmluZSBMQ0ZHX0lUQ1NSICAgICAgICAgICAgICAweDAwNjgJLy8gSU5UQ1NSLCBJbnRlcnJ1cHQgQ29udHJvbC9TdGF0dXMgUmVnaXN0ZXIKKyNkZWZpbmUgTENGR19ETUFNT0RFMCAgICAgICAgICAgMHgwMDgwCS8vIERNQSBDaGFubmVsIDAgTW9kZSBSZWdpc3RlcgorI2RlZmluZSBMQ0ZHX0RNQVBBRFIwICAgICAgICAgICAweDAwODQJLy8gRE1BIENoYW5uZWwgMCBQQ0kgQWRkcmVzcyBSZWdpc3RlcgorI2RlZmluZSBMQ0ZHX0RNQUxBRFIwICAgICAgICAgICAweDAwODgJLy8gRE1BIENoYW5uZWwgMCBMb2NhbCBBZGRyZXNzIFJlZworI2RlZmluZSBMQ0ZHX0RNQVNJWjAgICAgICAgICAgICAweDAwOEMJLy8gRE1BIENoYW5uZWwgMCBUcmFuc2ZlciBTaXplIChCeXRlcykgUmVnaXN0ZXIKKyNkZWZpbmUgTENGR19ETUFEUFIwICAgICAgICAgICAgMHgwMDkwCS8vIERNQSBDaGFubmVsIDAgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyCisjZGVmaW5lIExDRkdfRE1BTU9ERTEgICAgICAgICAgIDB4MDA5NAkvLyBETUEgQ2hhbm5lbCAxIE1vZGUgUmVnaXN0ZXIKKyNkZWZpbmUgTENGR19ETUFQQURSMSAgICAgICAgICAgMHgwMDk4CS8vIERNQSBDaGFubmVsIDEgUENJIEFkZHJlc3MgUmVnaXN0ZXIKKyNkZWZpbmUgTENGR19ETUFMQURSMSAgICAgICAgICAgMHgwMDlDCS8vIERNQSBDaGFubmVsIDEgTG9jYWwgQWRkcmVzcyBSZWdpc3RlcgorI2RlZmluZSBMQ0ZHX0RNQVNJWjEgICAgICAgICAgICAweDAwQTAJLy8gRE1BIENoYW5uZWwgMSBUcmFuc2ZlciBTaXplIChCeXRlcykgUmVnaXN0ZXIKKyNkZWZpbmUgTENGR19ETUFEUFIxICAgICAgICAgICAgMHgwMEE0CS8vIERNQSBDaGFubmVsIDEgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyCisjZGVmaW5lIExDRkdfRE1BQ1NSMCAgICAgICAgICAgIDB4MDBBOAkvLyBETUEgQ2hhbm5lbCAwIENvbW1hbmQvU3RhdHVzIFJlZ2lzdGVyCisjZGVmaW5lIExDRkdfRE1BQ1NSMSAgICAgICAgICAgIDB4MDBBOQkvLyBETUEgQ2hhbm5lbCAwIENvbW1hbmQvU3RhdHVzIFJlZ2lzdGVyCisjZGVmaW5lIExDRkdfRE1BQVJCICAgICAgICAgICAgIDB4MDBBQwkvLyBETUEgQXJiaXRyYXRpb24gUmVnaXN0ZXIKKyNkZWZpbmUgTENGR19ETUFUSFIgICAgICAgICAgICAgMHgwMEIwCS8vIERNQSBUaHJlc2hvbGQgUmVnaXN0ZXIKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFJlc2lzdGVyIGJpdCBkZWZpbml0aW9ucworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8vIEZJRk8gU3RhdHVzIFdvcmQgQml0cyAoUnRkRmlmb1N0YXR1cykKKyNkZWZpbmUgRlNfREFDMV9OT1RfRU1QVFkgICAgMHgwMDAxCS8vIEQwICAtIERBQzEgRklGTyBub3QgZW1wdHkKKyNkZWZpbmUgRlNfREFDMV9IRU1QVFkgICAweDAwMDIJLy8gRDEgIC0gREFDMSBGSUZPIGhhbGYgZW1wdHkKKyNkZWZpbmUgRlNfREFDMV9OT1RfRlVMTCAgICAgMHgwMDA0CS8vIEQyICAtIERBQzEgRklGTyBub3QgZnVsbAorI2RlZmluZSBGU19EQUMyX05PVF9FTVBUWSAgICAweDAwMTAJLy8gRDQgIC0gREFDMiBGSUZPIG5vdCBlbXB0eQorI2RlZmluZSBGU19EQUMyX0hFTVBUWSAgIDB4MDAyMAkvLyBENSAgLSBEQUMyIEZJRk8gaGFsZiBlbXB0eQorI2RlZmluZSBGU19EQUMyX05PVF9GVUxMICAgICAweDAwNDAJLy8gRDYgIC0gREFDMiBGSUZPIG5vdCBmdWxsCisjZGVmaW5lIEZTX0FEQ19OT1RfRU1QVFkgICAgIDB4MDEwMAkvLyBEOCAgLSBBREMgRklGTyBub3QgZW1wdHkKKyNkZWZpbmUgRlNfQURDX0hFTVBUWSAgICAweDAyMDAJLy8gRDkgIC0gQURDIEZJRk8gaGFsZiBlbXB0eQorI2RlZmluZSBGU19BRENfTk9UX0ZVTEwgICAgICAweDA0MDAJLy8gRDEwIC0gQURDIEZJRk8gbm90IGZ1bGwKKyNkZWZpbmUgRlNfRElOX05PVF9FTVBUWSAgICAgMHgxMDAwCS8vIEQxMiAtIERJTiBGSUZPIG5vdCBlbXB0eQorI2RlZmluZSBGU19ESU5fSEVNUFRZICAgIDB4MjAwMAkvLyBEMTMgLSBESU4gRklGTyBoYWxmIGVtcHR5CisjZGVmaW5lIEZTX0RJTl9OT1RfRlVMTCAgICAgIDB4NDAwMAkvLyBEMTQgLSBESU4gRklGTyBub3QgZnVsbAorCisvLyBUaW1lciBTdGF0dXMgV29yZCBCaXRzIChHZXRUaW1lclN0YXR1cykKKyNkZWZpbmUgVFNfUENMS19HQVRFICAgMHgwMDAxCisvLyBEMCAtIFBhY2VyIENsb2NrIEdhdGUgWzAgLSBnYXRlZCwgMSAtIGVuYWJsZWRdCisjZGVmaW5lIFRTX0JDTEtfR0FURSAgIDB4MDAwMgorLy8gRDEgLSBCdXJzdCBDbG9jayBHYXRlIFswIC0gZGlzYWJsZWQsIDEgLSBydW5uaW5nXQorI2RlZmluZSBUU19EQ05UX0dBVEUgICAweDAwMDQKKy8vIEQyIC0gUGFjZXIgQ2xvY2sgRGVsYXllZCBTdGFydCBUcmlnZ2VyIFswIC0gZGVsYXkgb3ZlciwgMSAtIGRlbGF5IGluCisvLyBwcm9ncmVzc10KKyNkZWZpbmUgVFNfQUNOVF9HQVRFICAgMHgwMDA4CisvLyBEMyAtIFBhY2VyIENsb2NrIEFib3V0IFRyaWdnZXIgWzAgLSBjb21wbGV0ZWQsIDEgLSBpbiBwcm9ncmVzc10KKyNkZWZpbmUgVFNfUENMS19SVU4gICAgMHgwMDEwCisvLyBENCAtIFBhY2VyIENsb2NrIFNodXRkb3duIEZsYWcgWzAgLSBQYWNlciBDbG9jayBjYW5ub3QgYmUgc3RhcnQKKy8vIHRyaWdnZXJlZCBvbmx5IGJ5IFNvZnR3YXJlIFBhY2VyIFN0YXJ0IENvbW1hbmQsIDEgLSBQYWNlciBDbG9jayBjYW4KKy8vIGJlIHN0YXJ0IHRyaWdnZXJlZF0KKworLy8gRXh0ZXJuYWwgVHJpZ2dlciBwb2xhcml0eSBzZWxlY3QKKy8vIEV4dGVybmFsIEludGVycnVwdCBwb2xhcml0eSBzZWxlY3QKKyNkZWZpbmUgUE9MX1BPU0lUSVZFICAgICAgICAgMHgwCS8vIHBvc2l0aXZlIGVkZ2UKKyNkZWZpbmUgUE9MX05FR0FUSVZFICAgICAgICAgMHgxCS8vIG5lZ2F0aXZlIGVkZ2UKKworLy8gVXNlciBPdXRwdXQgU2lnbmFsIHNlbGVjdCAoU2V0VW91dDBTb3VyY2UsIFNldFVvdXQxU291cmNlKQorI2RlZmluZSBVT1VUX0FEQyAgICAgICAgICAgICAgICAweDAJLy8gQS9EIENvbnZlcnNpb24gU2lnbmFsCisjZGVmaW5lIFVPVVRfREFDMSAgICAgICAgICAgICAgIDB4MQkvLyBEL0ExIFVwZGF0ZQorI2RlZmluZSBVT1VUX0RBQzIgICAgICAgICAgICAgICAweDIJLy8gRC9BMiBVcGRhdGUKKyNkZWZpbmUgVU9VVF9TT0ZUV0FSRSAgICAgICAgICAgMHgzCS8vIFNvZnR3YXJlIFByb2dyYW1tYWJsZQorCisvLyBQYWNlciBjbG9jayBzZWxlY3QgKFNldFBhY2VyU291cmNlKQorI2RlZmluZSBQQ0xLX0lOVEVSTkFMICAgICAgICAgICAxCS8vIEludGVybmFsIFBhY2VyIENsb2NrCisjZGVmaW5lIFBDTEtfRVhURVJOQUwgICAgICAgICAgIDAJLy8gRXh0ZXJuYWwgUGFjZXIgQ2xvY2sKKworLy8gQS9EIFNhbXBsZSBDb3VudGVyIFNvdXJjZXMgKFNldEFkY250U291cmNlLCBTZXR1cFNhbXBsZUNvdW50ZXIpCisjZGVmaW5lIEFEQ19TQ05UX0NHVF9SRVNFVCAgICAgICAgIDB4MAkvLyBuZWVkcyByZXN0YXJ0IHdpdGggU3RhcnRQYWNlcgorI2RlZmluZSBBRENfU0NOVF9GSUZPX1dSSVRFICAgICAgICAweDEKKworLy8gQS9EIENvbnZlcnNpb24gU2lnbmFsIFNlbGVjdCAoZm9yIFNldENvbnZlcnNpb25TZWxlY3QpCisjZGVmaW5lIEFEQ19TVEFSVF9TT0ZUV0FSRSAgICAgICAgIDB4MAkvLyBTb2Z0d2FyZSBBL0QgU3RhcnQKKyNkZWZpbmUgQURDX1NUQVJUX1BDTEsgICAgICAgICAgICAgMHgxCS8vIFBhY2VyIENsb2NrIChFeHQuIEludC4gc2VlIEZ1bmMuNTA5KQorI2RlZmluZSBBRENfU1RBUlRfQkNMSyAgICAgICAgICAgICAweDIJLy8gQnVyc3QgQ2xvY2sKKyNkZWZpbmUgQURDX1NUQVJUX0RJR0lUQUxfSVQgICAgICAgMHgzCS8vIERpZ2l0YWwgSW50ZXJydXB0CisjZGVmaW5lIEFEQ19TVEFSVF9EQUMxX01BUktFUjEgICAgIDB4NAkvLyBEL0EgMSBEYXRhIE1hcmtlciAxCisjZGVmaW5lIEFEQ19TVEFSVF9EQUMyX01BUktFUjEgICAgIDB4NQkvLyBEL0EgMiBEYXRhIE1hcmtlciAxCisjZGVmaW5lIEFEQ19TVEFSVF9TQlVTMCAgICAgICAgICAgIDB4NgkvLyBTeW5jQnVzIDAKKyNkZWZpbmUgQURDX1NUQVJUX1NCVVMxICAgICAgICAgICAgMHg3CS8vIFN5bmNCdXMgMQorI2RlZmluZSBBRENfU1RBUlRfU0JVUzIgICAgICAgICAgICAweDgJLy8gU3luY0J1cyAyCisKKy8vIEJ1cnN0IENsb2NrIHN0YXJ0IHRyaWdnZXIgc2VsZWN0IChTZXRCdXJzdFN0YXJ0KQorI2RlZmluZSBCQ0xLX1NUQVJUX1NPRlRXQVJFICAgICAgICAweDAJLy8gU29mdHdhcmUgQS9EIFN0YXJ0IChTdGFydEJ1cnN0KQorI2RlZmluZSBCQ0xLX1NUQVJUX1BDTEsgICAgICAgICAgICAweDEJLy8gUGFjZXIgQ2xvY2sKKyNkZWZpbmUgQkNMS19TVEFSVF9FVFJJRyAgICAgICAgICAgMHgyCS8vIEV4dGVybmFsIFRyaWdnZXIKKyNkZWZpbmUgQkNMS19TVEFSVF9ESUdJVEFMX0lUICAgICAgMHgzCS8vIERpZ2l0YWwgSW50ZXJydXB0CisjZGVmaW5lIEJDTEtfU1RBUlRfU0JVUzAgICAgICAgICAgIDB4NAkvLyBTeW5jQnVzIDAKKyNkZWZpbmUgQkNMS19TVEFSVF9TQlVTMSAgICAgICAgICAgMHg1CS8vIFN5bmNCdXMgMQorI2RlZmluZSBCQ0xLX1NUQVJUX1NCVVMyICAgICAgICAgICAweDYJLy8gU3luY0J1cyAyCisKKy8vIFBhY2VyIENsb2NrIHN0YXJ0IHRyaWdnZXIgc2VsZWN0IChTZXRQYWNlclN0YXJ0KQorI2RlZmluZSBQQ0xLX1NUQVJUX1NPRlRXQVJFICAgICAgICAweDAJLy8gU29mdHdhcmUgUGFjZXIgU3RhcnQgKFN0YXJ0UGFjZXIpCisjZGVmaW5lIFBDTEtfU1RBUlRfRVRSSUcgICAgICAgICAgIDB4MQkvLyBFeHRlcm5hbCB0cmlnZ2VyCisjZGVmaW5lIFBDTEtfU1RBUlRfRElHSVRBTF9JVCAgICAgIDB4MgkvLyBEaWdpdGFsIGludGVycnVwdAorI2RlZmluZSBQQ0xLX1NUQVJUX1VUQzIgICAgICAgICAgICAweDMJLy8gVXNlciBUQyAyIG91dAorI2RlZmluZSBQQ0xLX1NUQVJUX1NCVVMwICAgICAgICAgICAweDQJLy8gU3luY0J1cyAwCisjZGVmaW5lIFBDTEtfU1RBUlRfU0JVUzEgICAgICAgICAgIDB4NQkvLyBTeW5jQnVzIDEKKyNkZWZpbmUgUENMS19TVEFSVF9TQlVTMiAgICAgICAgICAgMHg2CS8vIFN5bmNCdXMgMgorI2RlZmluZSBQQ0xLX1NUQVJUX0RfU09GVFdBUkUgICAgICAweDgJLy8gRGVsYXllZCBTb2Z0d2FyZSBQYWNlciBTdGFydAorI2RlZmluZSBQQ0xLX1NUQVJUX0RfRVRSSUcgICAgICAgICAweDkJLy8gRGVsYXllZCBleHRlcm5hbCB0cmlnZ2VyCisjZGVmaW5lIFBDTEtfU1RBUlRfRF9ESUdJVEFMX0lUICAgIDB4QQkvLyBEZWxheWVkIGRpZ2l0YWwgaW50ZXJydXB0CisjZGVmaW5lIFBDTEtfU1RBUlRfRF9VVEMyICAgICAgICAgIDB4QgkvLyBEZWxheWVkIFVzZXIgVEMgMiBvdXQKKyNkZWZpbmUgUENMS19TVEFSVF9EX1NCVVMwICAgICAgICAgMHhDCS8vIERlbGF5ZWQgU3luY0J1cyAwCisjZGVmaW5lIFBDTEtfU1RBUlRfRF9TQlVTMSAgICAgICAgIDB4RAkvLyBEZWxheWVkIFN5bmNCdXMgMQorI2RlZmluZSBQQ0xLX1NUQVJUX0RfU0JVUzIgICAgICAgICAweEUJLy8gRGVsYXllZCBTeW5jQnVzIDIKKyNkZWZpbmUgUENMS19TVEFSVF9FVFJJR19HQVRFRCAgICAgMHhGCS8vIEV4dGVybmFsIFRyaWdnZXIgR2F0ZWQgY29udHJvbGxlZCBtb2RlCisKKy8vIFBhY2VyIENsb2NrIFN0b3AgVHJpZ2dlciBzZWxlY3QgKFNldFBhY2VyU3RvcCkKKyNkZWZpbmUgUENMS19TVE9QX1NPRlRXQVJFICAgICAgICAgMHgwCS8vIFNvZnR3YXJlIFBhY2VyIFN0b3AgKFN0b3BQYWNlcikKKyNkZWZpbmUgUENMS19TVE9QX0VUUklHICAgICAgICAgICAgMHgxCS8vIEV4dGVybmFsIFRyaWdnZXIKKyNkZWZpbmUgUENMS19TVE9QX0RJR0lUQUxfSVQgICAgICAgMHgyCS8vIERpZ2l0YWwgSW50ZXJydXB0CisjZGVmaW5lIFBDTEtfU1RPUF9BQ05UICAgICAgICAgICAgIDB4MwkvLyBBYm91dCBDb3VudGVyCisjZGVmaW5lIFBDTEtfU1RPUF9VVEMyICAgICAgICAgICAgIDB4NAkvLyBVc2VyIFRDMiBvdXQKKyNkZWZpbmUgUENMS19TVE9QX1NCVVMwICAgICAgICAgICAgMHg1CS8vIFN5bmNCdXMgMAorI2RlZmluZSBQQ0xLX1NUT1BfU0JVUzEgICAgICAgICAgICAweDYJLy8gU3luY0J1cyAxCisjZGVmaW5lIFBDTEtfU1RPUF9TQlVTMiAgICAgICAgICAgIDB4NwkvLyBTeW5jQnVzIDIKKyNkZWZpbmUgUENMS19TVE9QX0FfU09GVFdBUkUgICAgICAgMHg4CS8vIEFib3V0IFNvZnR3YXJlIFBhY2VyIFN0b3AKKyNkZWZpbmUgUENMS19TVE9QX0FfRVRSSUcgICAgICAgICAgMHg5CS8vIEFib3V0IEV4dGVybmFsIFRyaWdnZXIKKyNkZWZpbmUgUENMS19TVE9QX0FfRElHSVRBTF9JVCAgICAgMHhBCS8vIEFib3V0IERpZ2l0YWwgSW50ZXJydXB0CisjZGVmaW5lIFBDTEtfU1RPUF9BX1VUQzIgICAgICAgICAgIDB4QwkvLyBBYm91dCBVc2VyIFRDMiBvdXQKKyNkZWZpbmUgUENMS19TVE9QX0FfU0JVUzAgICAgICAgICAgMHhECS8vIEFib3V0IFN5bmNCdXMgMAorI2RlZmluZSBQQ0xLX1NUT1BfQV9TQlVTMSAgICAgICAgICAweEUJLy8gQWJvdXQgU3luY0J1cyAxCisjZGVmaW5lIFBDTEtfU1RPUF9BX1NCVVMyICAgICAgICAgIDB4RgkvLyBBYm91dCBTeW5jQnVzIDIKKworLy8gQWJvdXQgQ291bnRlciBTdG9wIEVuYWJsZQorI2RlZmluZSBBQ05UX1NUT1AgICAgICAgICAgICAgICAgICAweDAJLy8gc3RvcCBlbmFibGUKKyNkZWZpbmUgQUNOVF9OT19TVE9QICAgICAgICAgICAgICAgMHgxCS8vIHN0b3AgZGlzYWJsZWQKKworLy8gREFDIHVwZGF0ZSBzb3VyY2UgKFNldERBQzFTdGFydCAmIFNldERBQzJTdGFydCkKKyNkZWZpbmUgREFDX1NUQVJUX1NPRlRXQVJFICAgICAgICAgMHgwCS8vIFNvZnR3YXJlIFVwZGF0ZQorI2RlZmluZSBEQUNfU1RBUlRfQ0dUICAgICAgICAgICAgICAweDEJLy8gQ0dUIGNvbnRyb2xsZWQgVXBkYXRlCisjZGVmaW5lIERBQ19TVEFSVF9EQUNfQ0xLICAgICAgICAgIDB4MgkvLyBEL0EgQ2xvY2sKKyNkZWZpbmUgREFDX1NUQVJUX0VQQ0xLICAgICAgICAgICAgMHgzCS8vIEV4dGVybmFsIFBhY2VyIENsb2NrCisjZGVmaW5lIERBQ19TVEFSVF9TQlVTMCAgICAgICAgICAgIDB4NAkvLyBTeW5jQnVzIDAKKyNkZWZpbmUgREFDX1NUQVJUX1NCVVMxICAgICAgICAgICAgMHg1CS8vIFN5bmNCdXMgMQorI2RlZmluZSBEQUNfU1RBUlRfU0JVUzIgICAgICAgICAgICAweDYJLy8gU3luY0J1cyAyCisKKy8vIERBQyBDeWNsZSBNb2RlIChTZXREQUMxQ3ljbGUsIFNldERBQzJDeWNsZSwgU2V0dXBEQUMpCisjZGVmaW5lIERBQ19DWUNMRV9TSU5HTEUgICAgICAgICAgIDB4MAkvLyBub3QgY3ljbGUKKyNkZWZpbmUgREFDX0NZQ0xFX01VTFRJICAgICAgICAgICAgMHgxCS8vIGN5Y2xlCisKKy8vIDgyNTQgT3BlcmF0aW9uIE1vZGVzIChTZXQ4MjU0TW9kZSwgU2V0dXBUaW1lckNvdW50ZXIpCisjZGVmaW5lIE04MjU0X0VWRU5UX0NPVU5URVIgICAgICAgIDAJLy8gRXZlbnQgQ291bnRlcgorI2RlZmluZSBNODI1NF9IV19PTkVfU0hPVCAgICAgICAgICAxCS8vIEhhcmR3YXJlLVJldHJpZ2dlcmFibGUgT25lLVNob3QKKyNkZWZpbmUgTTgyNTRfUkFURV9HRU5FUkFUT1IgICAgICAgMgkvLyBSYXRlIEdlbmVyYXRvcgorI2RlZmluZSBNODI1NF9TUVVBUkVfV0FWRSAgICAgICAgICAzCS8vIFNxdWFyZSBXYXZlIE1vZGUKKyNkZWZpbmUgTTgyNTRfU1dfU1RST0JFICAgICAgICAgICAgNAkvLyBTb2Z0d2FyZSBUcmlnZ2VyZWQgU3Ryb2JlCisjZGVmaW5lIE04MjU0X0hXX1NUUk9CRSAgICAgICAgICAgIDUJLy8gSGFyZHdhcmUgVHJpZ2dlcmVkIFN0cm9iZSAoUmV0cmlnZ2VyYWJsZSkKKworLy8gVXNlciBUaW1lci9Db3VudGVyIDAgQ2xvY2sgU2VsZWN0IChTZXRVdGMwQ2xvY2spCisjZGVmaW5lIENVVEMwXzhNSFogICAgICAgICAgICAgICAgIDB4MAkvLyA4TUh6CisjZGVmaW5lIENVVEMwX0VYVF9UQ19DTE9DSzEgICAgICAgIDB4MQkvLyBFeHQuIFRDIENsb2NrIDEKKyNkZWZpbmUgQ1VUQzBfRVhUX1RDX0NMT0NLMiAgICAgICAgMHgyCS8vIEV4dC4gVEMgQ2xvY2sgMgorI2RlZmluZSBDVVRDMF9FWFRfUENMSyAgICAgICAgICAgICAweDMJLy8gRXh0LiBQYWNlciBDbG9jaworCisvLyBVc2VyIFRpbWVyL0NvdW50ZXIgMSBDbG9jayBTZWxlY3QgKFNldFV0YzFDbG9jaykKKyNkZWZpbmUgQ1VUQzFfOE1IWiAgICAgICAgICAgICAgICAgMHgwCS8vIDhNSHoKKyNkZWZpbmUgQ1VUQzFfRVhUX1RDX0NMT0NLMSAgICAgICAgMHgxCS8vIEV4dC4gVEMgQ2xvY2sgMQorI2RlZmluZSBDVVRDMV9FWFRfVENfQ0xPQ0syICAgICAgICAweDIJLy8gRXh0LiBUQyBDbG9jayAyCisjZGVmaW5lIENVVEMxX0VYVF9QQ0xLICAgICAgICAgICAgIDB4MwkvLyBFeHQuIFBhY2VyIENsb2NrCisjZGVmaW5lIENVVEMxX1VUQzBfT1VUICAgICAgICAgICAgIDB4NAkvLyBVc2VyIFRpbWVyL0NvdW50ZXIgMCBvdXQKKyNkZWZpbmUgQ1VUQzFfRElOX1NJR05BTCAgICAgICAgICAgMHg1CS8vIEhpZ2gtU3BlZWQgRGlnaXRhbCBJbnB1dCAgIFNhbXBsaW5nIHNpZ25hbAorCisvLyBVc2VyIFRpbWVyL0NvdW50ZXIgMiBDbG9jayBTZWxlY3QgKFNldFV0YzJDbG9jaykKKyNkZWZpbmUgQ1VUQzJfOE1IWiAgICAgICAgICAgICAgICAgMHgwCS8vIDhNSHoKKyNkZWZpbmUgQ1VUQzJfRVhUX1RDX0NMT0NLMSAgICAgICAgMHgxCS8vIEV4dC4gVEMgQ2xvY2sgMQorI2RlZmluZSBDVVRDMl9FWFRfVENfQ0xPQ0syICAgICAgICAweDIJLy8gRXh0LiBUQyBDbG9jayAyCisjZGVmaW5lIENVVEMyX0VYVF9QQ0xLICAgICAgICAgICAgIDB4MwkvLyBFeHQuIFBhY2VyIENsb2NrCisjZGVmaW5lIENVVEMyX1VUQzFfT1VUICAgICAgICAgICAgIDB4NAkvLyBVc2VyIFRpbWVyL0NvdW50ZXIgMSBvdXQKKworLy8gVXNlciBUaW1lci9Db3VudGVyIDAgR2F0ZSBTZWxlY3QgKFNldFV0YzBHYXRlKQorI2RlZmluZSBHVVRDMF9OT1RfR0FURUQgICAgICAgICAgICAweDAJLy8gTm90IGdhdGVkCisjZGVmaW5lIEdVVEMwX0dBVEVEICAgICAgICAgICAgICAgIDB4MQkvLyBHYXRlZAorI2RlZmluZSBHVVRDMF9FWFRfVENfR0FURTEgICAgICAgICAweDIJLy8gRXh0LiBUQyBHYXRlIDEKKyNkZWZpbmUgR1VUQzBfRVhUX1RDX0dBVEUyICAgICAgICAgMHgzCS8vIEV4dC4gVEMgR2F0ZSAyCisKKy8vIFVzZXIgVGltZXIvQ291bnRlciAxIEdhdGUgU2VsZWN0IChTZXRVdGMxR2F0ZSkKKyNkZWZpbmUgR1VUQzFfTk9UX0dBVEVEICAgICAgICAgICAgMHgwCS8vIE5vdCBnYXRlZAorI2RlZmluZSBHVVRDMV9HQVRFRCAgICAgICAgICAgICAgICAweDEJLy8gR2F0ZWQKKyNkZWZpbmUgR1VUQzFfRVhUX1RDX0dBVEUxICAgICAgICAgMHgyCS8vIEV4dC4gVEMgR2F0ZSAxCisjZGVmaW5lIEdVVEMxX0VYVF9UQ19HQVRFMiAgICAgICAgIDB4MwkvLyBFeHQuIFRDIEdhdGUgMgorI2RlZmluZSBHVVRDMV9VVEMwX09VVCAgICAgICAgICAgICAweDQJLy8gVXNlciBUaW1lci9Db3VudGVyIDAgb3V0CisKKy8vIFVzZXIgVGltZXIvQ291bnRlciAyIEdhdGUgU2VsZWN0IChTZXRVdGMyR2F0ZSkKKyNkZWZpbmUgR1VUQzJfTk9UX0dBVEVEICAgICAgICAgICAgMHgwCS8vIE5vdCBnYXRlZAorI2RlZmluZSBHVVRDMl9HQVRFRCAgICAgICAgICAgICAgICAweDEJLy8gR2F0ZWQKKyNkZWZpbmUgR1VUQzJfRVhUX1RDX0dBVEUxICAgICAgICAgMHgyCS8vIEV4dC4gVEMgR2F0ZSAxCisjZGVmaW5lIEdVVEMyX0VYVF9UQ19HQVRFMiAgICAgICAgIDB4MwkvLyBFeHQuIFRDIEdhdGUgMgorI2RlZmluZSBHVVRDMl9VVEMxX09VVCAgICAgICAgICAgICAweDQJLy8gVXNlciBUaW1lci9Db3VudGVyIDEgb3V0CisKKy8vIEludGVycnVwdCBTb3VyY2UgTWFza3MgKFNldElUTWFzaywgQ2xlYXJJVE1hc2ssIEdldElUU3RhdHVzKQorI2RlZmluZSBJUlFNX0FEQ19GSUZPX1dSSVRFICAgICAgICAweDAwMDEJLy8gQURDIEZJRk8gV3JpdGUKKyNkZWZpbmUgSVJRTV9DR1RfUkVTRVQgICAgICAgICAgICAgMHgwMDAyCS8vIFJlc2V0IENHVAorI2RlZmluZSBJUlFNX0NHVF9QQVVTRSAgICAgICAgICAgICAweDAwMDgJLy8gUGF1c2UgQ0dUCisjZGVmaW5lIElSUU1fQURDX0FCT1VUX0NOVCAgICAgICAgIDB4MDAxMAkvLyBBYm91dCBDb3VudGVyIG91dAorI2RlZmluZSBJUlFNX0FEQ19ERUxBWV9DTlQgICAgICAgICAweDAwMjAJLy8gRGVsYXkgQ291bnRlciBvdXQKKyNkZWZpbmUgSVJRTV9BRENfU0FNUExFX0NOVAkgICAweDAwNDAJLy8gQURDIFNhbXBsZSBDb3VudGVyCisjZGVmaW5lIElSUU1fREFDMV9VQ05UICAgICAgICAgICAgIDB4MDA4MAkvLyBEQUMxIFVwZGF0ZSBDb3VudGVyCisjZGVmaW5lIElSUU1fREFDMl9VQ05UICAgICAgICAgICAgIDB4MDEwMAkvLyBEQUMyIFVwZGF0ZSBDb3VudGVyCisjZGVmaW5lIElSUU1fVVRDMSAgICAgICAgICAgICAgICAgIDB4MDIwMAkvLyBVc2VyIFRDMSBvdXQKKyNkZWZpbmUgSVJRTV9VVEMxX0lOViAgICAgICAgICAgICAgMHgwNDAwCS8vIFVzZXIgVEMxIG91dCwgaW52ZXJ0ZWQKKyNkZWZpbmUgSVJRTV9VVEMyICAgICAgICAgICAgICAgICAgMHgwODAwCS8vIFVzZXIgVEMyIG91dAorI2RlZmluZSBJUlFNX0RJR0lUQUxfSVQgICAgICAgICAgICAweDEwMDAJLy8gRGlnaXRhbCBJbnRlcnJ1cHQKKyNkZWZpbmUgSVJRTV9FWFRFUk5BTF9JVCAgICAgICAgICAgMHgyMDAwCS8vIEV4dGVybmFsIEludGVycnVwdAorI2RlZmluZSBJUlFNX0VUUklHX1JJU0lORyAgICAgICAgICAweDQwMDAJLy8gRXh0ZXJuYWwgVHJpZ2dlciByaXNpbmctZWRnZQorI2RlZmluZSBJUlFNX0VUUklHX0ZBTExJTkcgICAgICAgICAweDgwMDAJLy8gRXh0ZXJuYWwgVHJpZ2dlciBmYWxsaW5nLWVkZ2UKKworLy8gRE1BIFJlcXVlc3QgU291cmNlcyAoTEFTMCkKKyNkZWZpbmUgRE1BU19ESVNBQkxFRCAgICAgICAgICAgICAgMHgwCS8vIERNQSBEaXNhYmxlZAorI2RlZmluZSBETUFTX0FEQ19TQ05UICAgICAgICAgICAgICAweDEJLy8gQURDIFNhbXBsZSBDb3VudGVyCisjZGVmaW5lIERNQVNfREFDMV9VQ05UICAgICAgICAgICAgIDB4MgkvLyBEL0ExIFVwZGF0ZSBDb3VudGVyCisjZGVmaW5lIERNQVNfREFDMl9VQ05UICAgICAgICAgICAgIDB4MwkvLyBEL0EyIFVwZGF0ZSBDb3VudGVyCisjZGVmaW5lIERNQVNfVVRDMSAgICAgICAgICAgICAgICAgIDB4NAkvLyBVc2VyIFRDMSBvdXQKKyNkZWZpbmUgRE1BU19BREZJRk9fSEFMRl9GVUxMICAgICAgMHg4CS8vIEEvRCBGSUZPIGhhbGYgZnVsbAorI2RlZmluZSBETUFTX0RBQzFfRklGT19IQUxGX0VNUFRZICAweDkJLy8gRC9BMSBGSUZPIGhhbGYgZW1wdHkKKyNkZWZpbmUgRE1BU19EQUMyX0ZJRk9fSEFMRl9FTVBUWSAgMHhBCS8vIEQvQTIgRklGTyBoYWxmIGVtcHR5CisKKy8vIERNQSBMb2NhbCBBZGRyZXNzZXMgICAoMHg0MDAwMDAwMCtMQVMxIG9mZnNldCkKKyNkZWZpbmUgRE1BTEFERFJfQURDICAgICAgIDB4NDAwMDAwMDAJLy8gQS9EIEZJRk8KKyNkZWZpbmUgRE1BTEFERFJfSERJTiAgICAgIDB4NDAwMDAwMDQJLy8gSGlnaCBTcGVlZCBEaWdpdGFsIElucHV0IEZJRk8KKyNkZWZpbmUgRE1BTEFERFJfREFDMSAgICAgIDB4NDAwMDAwMDgJLy8gRC9BMSBGSUZPCisjZGVmaW5lIERNQUxBRERSX0RBQzIgICAgICAweDQwMDAwMDBDCS8vIEQvQTIgRklGTworCisvLyBQb3J0IDAgY29tcGFyZSBtb2RlcyAoU2V0RElPMENvbXBhcmVNb2RlKQorI2RlZmluZSBESU9fTU9ERV9FVkVOVCAgICAgMAkvLyBFdmVudCBNb2RlCisjZGVmaW5lIERJT19NT0RFX01BVENIICAgICAxCS8vIE1hdGNoIE1vZGUKKworLy8gRGlnaXRhbCBUYWJsZSBFbmFibGUgKFBvcnQgMSBkaXNhYmxlKQorI2RlZmluZSBEVEJMX0RJU0FCTEUgICAgICAgMAkvLyBFbmFibGUgRGlnaXRhbCBUYWJsZQorI2RlZmluZSBEVEJMX0VOQUJMRSAgICAgICAgMQkvLyBEaXNhYmxlIERpZ2l0YWwgVGFibGUKKworLy8gU2FtcGxpbmcgU2lnbmFsIGZvciBIaWdoIFNwZWVkIERpZ2l0YWwgSW5wdXQgKFNldEhkaW5TdGFydCkKKyNkZWZpbmUgSERJTl9TT0ZUV0FSRSAgICAgIDB4MAkvLyBTb2Z0d2FyZSBUcmlnZ2VyCisjZGVmaW5lIEhESU5fQURDICAgICAgICAgICAweDEJLy8gQS9EIENvbnZlcnNpb24gU2lnbmFsCisjZGVmaW5lIEhESU5fVVRDMCAgICAgICAgICAweDIJLy8gVXNlciBUQyBvdXQgMAorI2RlZmluZSBIRElOX1VUQzEgICAgICAgICAgMHgzCS8vIFVzZXIgVEMgb3V0IDEKKyNkZWZpbmUgSERJTl9VVEMyICAgICAgICAgIDB4NAkvLyBVc2VyIFRDIG91dCAyCisjZGVmaW5lIEhESU5fRVBDTEsgICAgICAgICAweDUJLy8gRXh0ZXJuYWwgUGFjZXIgQ2xvY2sKKyNkZWZpbmUgSERJTl9FVFJHICAgICAgICAgIDB4NgkvLyBFeHRlcm5hbCBUcmlnZ2VyCisKKy8vIENoYW5uZWwgR2FpbiBUYWJsZSAvIENoYW5uZWwgR2FpbiBMYXRjaAorI2RlZmluZSBDU0NfTEFUQ0ggICAgICAgICAgMAkvLyBDaGFubmVsIEdhaW4gTGF0Y2ggbW9kZQorI2RlZmluZSBDU0NfQ0dUICAgICAgICAgICAgMQkvLyBDaGFubmVsIEdhaW4gVGFibGUgbW9kZQorCisvLyBDaGFubmVsIEdhaW4gVGFibGUgUGF1c2UgRW5hYmxlCisjZGVmaW5lIENHVF9QQVVTRV9ESVNBQkxFICAwCS8vIENoYW5uZWwgR2FpbiBUYWJsZSBQYXVzZSBEaXNhYmxlCisjZGVmaW5lIENHVF9QQVVTRV9FTkFCTEUgICAxCS8vIENoYW5uZWwgR2FpbiBUYWJsZSBQYXVzZSBFbmFibGUKKworLy8gREFDIG91dHB1dCB0eXBlL3JhbmdlIChwNjMpCisjZGVmaW5lIEFPVVRfVU5JUDUgICAgICAgICAwCS8vIDAuLis1IFZvbHQKKyNkZWZpbmUgQU9VVF9VTklQMTAgICAgICAgIDEJLy8gMC4uKzEwIFZvbHQKKyNkZWZpbmUgQU9VVF9CSVA1ICAgICAgICAgIDIJLy8gLTUuLis1IFZvbHQKKyNkZWZpbmUgQU9VVF9CSVAxMCAgICAgICAgIDMJLy8gLTEwLi4rMTAgVm9sdAorCisvLyBHaGFubmVsIEdhaW4gVGFibGUgZmllbGQgZGVmaW5pdGlvbnMgKHA2MSkKKy8vIEdhaW4KKyNkZWZpbmUgR0FJTjEgICAgICAgICAgICAgIDAKKyNkZWZpbmUgR0FJTjIgICAgICAgICAgICAgIDEKKyNkZWZpbmUgR0FJTjQgICAgICAgICAgICAgIDIKKyNkZWZpbmUgR0FJTjggICAgICAgICAgICAgIDMKKyNkZWZpbmUgR0FJTjE2ICAgICAgICAgICAgIDQKKyNkZWZpbmUgR0FJTjMyICAgICAgICAgICAgIDUKKyNkZWZpbmUgR0FJTjY0ICAgICAgICAgICAgIDYKKyNkZWZpbmUgR0FJTjEyOCAgICAgICAgICAgIDcKKworLy8gSW5wdXQgcmFuZ2UvcG9sYXJpdHkKKyNkZWZpbmUgQUlOX0JJUDUgICAgICAgICAgIDAJLy8gLTUuLis1IFZvbHQKKyNkZWZpbmUgQUlOX0JJUDEwICAgICAgICAgIDEJLy8gLTEwLi4rMTAgVm9sdAorI2RlZmluZSBBSU5fVU5JUDEwICAgICAgICAgMgkvLyAwLi4rMTAgVm9sdAorCisvLyBub24gcmVmZXJlbmNlZCBzaW5nbGUgZW5kZWQgc2VsZWN0IGJpdAorI2RlZmluZSBOUlNFX0FHTkQgICAgICAgICAgMAkvLyBBR05EIHJlZmVyZW5jZWQgU0UgaW5wdXQKKyNkZWZpbmUgTlJTRV9BSU5TICAgICAgICAgIDEJLy8gQUlOIFNFTlNFIHJlZmVyZW5jZWQgU0UgaW5wdXQKKworLy8gc2luZ2xlIGVuZGVkIHZzIGRpZmZlcmVudGlhbAorI2RlZmluZSBHTkRfU0UJCTAJLy8gU2luZ2xlLUVuZGVkCisjZGVmaW5lIEdORF9ESUZGCTEJLy8gRGlmZmVyZW50aWFsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvczYyNi5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3M2MjYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjllZThjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3M2MjYuYwpAQCAtMCwwICsxLDMyNTQgQEAKKy8qCisgIGNvbWVkaS9kcml2ZXJzL3M2MjYuYworICBTZW5zb3JheSBzNjI2IENvbWVkaSBkcml2ZXIKKworICBDT01FREkgLSBMaW51eCBDb250cm9sIGFuZCBNZWFzdXJlbWVudCBEZXZpY2UgSW50ZXJmYWNlCisgIENvcHlyaWdodCAoQykgMjAwMCBEYXZpZCBBLiBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworICBCYXNlZCBvbiBTZW5zb3JheSBNb2RlbCA2MjYgTGludXggZHJpdmVyIFZlcnNpb24gMC4yCisgIENvcHlyaWdodCAoQykgMjAwMi0yMDA0IFNlbnNvcmF5IENvLiwgSW5jLgorCisgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworKi8KKworLyoKK0RyaXZlcjogczYyNgorRGVzY3JpcHRpb246IFNlbnNvcmF5IDYyNiBkcml2ZXIKK0RldmljZXM6IFtTZW5zb3JheV0gNjI2IChzNjI2KQorQXV0aG9yczogR2lhbmx1Y2EgUGFsbGkgPGdwYWxsaUBkZWlzLnVuaWJvLml0PiwKK1VwZGF0ZWQ6IEZyaSwgMTUgRmViIDIwMDggMTA6Mjg6NDIgKzAwMDAKK1N0YXR1czogZXhwZXJpbWVudGFsCisKK0NvbmZpZ3VyYXRpb24gb3B0aW9uczoKKyAgWzBdIC0gUENJIGJ1cyBvZiBkZXZpY2UgKG9wdGlvbmFsKQorICBbMV0gLSBQQ0kgc2xvdCBvZiBkZXZpY2UgKG9wdGlvbmFsKQorICBJZiBidXMvc2xvdCBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgZmlyc3Qgc3VwcG9ydGVkCisgIFBDSSBkZXZpY2UgZm91bmQgd2lsbCBiZSB1c2VkLgorCitJTlNOX0NPTkZJRyBpbnN0cnVjdGlvbnM6CisgIGFuYWxvZyBpbnB1dDoKKyAgIG5vbmUKKworICBhbmFsb2cgb3V0cHV0OgorICAgbm9uZQorCisgIGRpZ2l0YWwgY2hhbm5lbDoKKyAgIHM2MjYgaGFzIDMgZGlvIHN1YmRldmljZXMgKDIsMyBhbmQgNCkgZWFjaCB3aXRoIDE2IGkvbyBjaGFubmVscworICAgc3VwcG9ydGVkIGNvbmZpZ3VyYXRpb24gb3B0aW9uczoKKyAgIElOU05fQ09ORklHX0RJT19RVUVSWQorICAgQ09NRURJX0lOUFVUCisgICBDT01FRElfT1VUUFVUCisKKyAgZW5jb2RlcjoKKyAgIEV2ZXJ5IGNoYW5uZWwgbXVzdCBiZSBjb25maWd1cmVkIGJlZm9yZSByZWFkaW5nLgorCisgICBFeGFtcGxlIGNvZGUKKworICAgaW5zbi5pbnNuPUlOU05fQ09ORklHOyAgIC8vY29uZmlndXJhdGlvbiBpbnN0cnVjdGlvbgorICAgaW5zbi5uPTE7ICAgICAgICAgICAgICAgIC8vbnVtYmVyIG9mIG9wZXJhdGlvbiAobXVzdCBiZSAxKQorICAgaW5zbi5kYXRhPSZpbml0aWFsdmFsdWU7IC8vaW5pdGlhbCB2YWx1ZSBsb2FkZWQgaW50byBlbmNvZGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9kdXJpbmcgY29uZmlndXJhdGlvbgorICAgaW5zbi5zdWJkZXY9NTsgICAgICAgICAgIC8vZW5jb2RlciBzdWJkZXZpY2UKKyAgIGluc24uY2hhbnNwZWM9Q1JfUEFDSyhlbmNvZGVyX2NoYW5uZWwsMCxBUkVGX09USEVSKTsgLy9lbmNvZGVyX2NoYW5uZWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy90byBjb25maWd1cmUKKworICAgY29tZWRpX2RvX2luc24oY2YsJmluc24pOyAvL2V4ZWN1dGluZyBjb25maWd1cmF0aW9uCisqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2luY2x1ZGUgIi4uL2NvbWVkaWRldi5oIgorCisjaW5jbHVkZSAiY29tZWRpX3BjaS5oIgorCisjaW5jbHVkZSAiY29tZWRpX2ZjLmgiCisjaW5jbHVkZSAiczYyNi5oIgorCitNT0RVTEVfQVVUSE9SKCJHaWFubHVjYSBQYWxsaSA8Z3BhbGxpQGRlaXMudW5pYm8uaXQ+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlNlbnNvcmF5IDYyNiBDb21lZGkgZHJpdmVyIG1vZHVsZSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCit0eXBlZGVmIHN0cnVjdCBzNjI2X2JvYXJkX3N0cnVjdCB7CisJY29uc3QgY2hhciAqbmFtZTsKKwlpbnQgYWlfY2hhbnM7CisJaW50IGFpX2JpdHM7CisJaW50IGFvX2NoYW5zOworCWludCBhb19iaXRzOworCWludCBkaW9fY2hhbnM7CisJaW50IGRpb19iYW5rczsKKwlpbnQgZW5jX2NoYW5zOworfSBzNjI2X2JvYXJkOworCitzdGF0aWMgY29uc3QgczYyNl9ib2FyZCBzNjI2X2JvYXJkc1tdID0geworCXsKKwkgICAgICBuYW1lOgkiczYyNiIsCisJICAgICAgYWlfY2hhbnM6UzYyNl9BRENfQ0hBTk5FTFMsCisJICAgICAgYWlfYml0czoJMTQsCisJICAgICAgYW9fY2hhbnM6UzYyNl9EQUNfQ0hBTk5FTFMsCisJICAgICAgYW9fYml0czoJMTMsCisJICAgICAgZGlvX2NoYW5zOlM2MjZfRElPX0NIQU5ORUxTLAorCSAgICAgIGRpb19iYW5rczpTNjI2X0RJT19CQU5LUywKKwkgICAgICBlbmNfY2hhbnM6UzYyNl9FTkNPREVSX0NIQU5ORUxTLAorCQl9Cit9OworCisjZGVmaW5lIHRoaXNib2FyZCAoKGNvbnN0IHM2MjZfYm9hcmQgKilkZXYtPmJvYXJkX3B0cikKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9TNjI2IDB4MTEzMQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1M2MjYgMHg3MTQ2CisKK3N0YXRpYyBERUZJTkVfUENJX0RFVklDRV9UQUJMRShzNjI2X3BjaV90YWJsZSkgPSB7CisJe1BDSV9WRU5ET1JfSURfUzYyNiwgUENJX0RFVklDRV9JRF9TNjI2LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLAorCQkwfSwKKwl7MH0KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBzNjI2X3BjaV90YWJsZSk7CisKK3N0YXRpYyBpbnQgczYyNl9hdHRhY2goY29tZWRpX2RldmljZSAqIGRldiwgY29tZWRpX2RldmNvbmZpZyAqIGl0KTsKK3N0YXRpYyBpbnQgczYyNl9kZXRhY2goY29tZWRpX2RldmljZSAqIGRldik7CisKK3N0YXRpYyBjb21lZGlfZHJpdmVyIGRyaXZlcl9zNjI2ID0geworICAgICAgZHJpdmVyX25hbWU6InM2MjYiLAorICAgICAgbW9kdWxlOlRISVNfTU9EVUxFLAorICAgICAgYXR0YWNoOnM2MjZfYXR0YWNoLAorICAgICAgZGV0YWNoOnM2MjZfZGV0YWNoLAorfTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXN0cnVjdCBwY2lfZGV2ICpwZGV2OworCXZvaWQgKmJhc2VfYWRkcjsKKwlpbnQgZ290X3JlZ2lvbnM7CisJc2hvcnQgYWxsb2NhdGVkQnVmOworCXVpbnQ4X3QgYWlfY21kX3J1bm5pbmc7CS8vIGFpX2NtZCBpcyBydW5uaW5nCisJdWludDhfdCBhaV9jb250aW5vdXM7CS8vIGNvbnRpbm91cyBhcXVpc2l0aW9uCisJaW50IGFpX3NhbXBsZV9jb3VudDsJLy8gbnVtYmVyIG9mIHNhbXBsZXMgdG8gYXF1aXJlCisJdW5zaWduZWQgaW50IGFpX3NhbXBsZV90aW1lcjsJLy8gdGltZSBiZXR3ZWVuIHNhbXBsZXMgaW4KKwkvLyB1bml0cyBvZiB0aGUgdGltZXIKKwlpbnQgYWlfY29udmVydF9jb3VudDsJLy8gY29udmVyc2lvbiBjb3VudGVyCisJdW5zaWduZWQgaW50IGFpX2NvbnZlcnRfdGltZXI7CS8vIHRpbWUgYmV0d2VlbiBjb252ZXJzaW9uIGluCisJLy8gdW5pdHMgb2YgdGhlIHRpbWVyCisJdWludDE2X3QgQ291bnRlckludEVuYWJzOwkvL0NvdW50ZXIgaW50ZXJydXB0IGVuYWJsZQorCS8vbWFzayBmb3IgTUlTQzIgcmVnaXN0ZXIuCisJdWludDhfdCBBZGNJdGVtczsJLy9OdW1iZXIgb2YgaXRlbXMgaW4gQURDIHBvbGwKKwkvL2xpc3QuCisJRE1BQlVGIFJQU0J1ZjsJCS8vRE1BIGJ1ZmZlciB1c2VkIHRvIGhvbGQgQURDCisJLy8oUlBTMSkgcHJvZ3JhbS4KKwlETUFCVUYgQU5BQnVmOwkJLy9ETUEgYnVmZmVyIHVzZWQgdG8gcmVjZWl2ZQorCS8vQURDIGRhdGEgYW5kIGhvbGQgREFDIGRhdGEuCisJdWludDMyX3QgKnBEYWNXQnVmOwkvL1BvaW50ZXIgdG8gbG9naWNhbCBhZHJzIG9mCisJLy9ETUEgYnVmZmVyIHVzZWQgdG8gaG9sZCBEQUMKKwkvL2RhdGEuCisJdWludDE2X3QgRGFjcG9sOwkvL0ltYWdlIG9mIERBQyBwb2xhcml0eQorCS8vcmVnaXN0ZXIuCisJdWludDhfdCBUcmltU2V0cG9pbnRbMTJdOwkvL0ltYWdlcyBvZiBUcmltREFDIHNldHBvaW50cy4KKwkvL3JlZ2lzdGVycy4KKwl1aW50MTZfdCBDaGFyZ2VFbmFibGVkOwkvL0ltYWdlIG9mIE1JU0MyIEJhdHRlcnkKKwkvL0NoYXJnZSBFbmFibGVkICgwIG9yCisJLy9XUk1JU0MyX0NIQVJHRV9FTkFCTEUpLgorCXVpbnQxNl90IFdESW50ZXJ2YWw7CS8vSW1hZ2Ugb2YgTUlTQzIgd2F0Y2hkb2cKKwkvL2ludGVydmFsIGNvbnRyb2wgYml0cy4KKwl1aW50MzJfdCBJMkNBZHJzOwkvL0kyQyBkZXZpY2UgYWRkcmVzcyBmb3IKKwkvL29uYm9hcmQgRUVQUk9NIChib2FyZCByZXYKKwkvL2RlcGVuZGVudCkuCisJLy8gIHNob3J0ICAgICAgICAgSTJDYXJkczsKKwlsc2FtcGxfdCBhb19yZWFkYmFja1tTNjI2X0RBQ19DSEFOTkVMU107Cit9IHM2MjZfcHJpdmF0ZTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVpbnQxNl90IFJEREluOworCXVpbnQxNl90IFdSRE91dDsKKwl1aW50MTZfdCBSREVkZ1NlbDsKKwl1aW50MTZfdCBXUkVkZ1NlbDsKKwl1aW50MTZfdCBSRENhcFNlbDsKKwl1aW50MTZfdCBXUkNhcFNlbDsKKwl1aW50MTZfdCBSRENhcEZsZzsKKwl1aW50MTZfdCBSREludFNlbDsKKwl1aW50MTZfdCBXUkludFNlbDsKK30gZGlvX3ByaXZhdGU7CisKK3N0YXRpYyBkaW9fcHJpdmF0ZSBkaW9fcHJpdmF0ZV9BID0geworICAgICAgUkRESW46TFBfUkRESU5BLAorICAgICAgV1JET3V0OkxQX1dSRE9VVEEsCisgICAgICBSREVkZ1NlbDpMUF9SREVER1NFTEEsCisgICAgICBXUkVkZ1NlbDpMUF9XUkVER1NFTEEsCisgICAgICBSRENhcFNlbDpMUF9SRENBUFNFTEEsCisgICAgICBXUkNhcFNlbDpMUF9XUkNBUFNFTEEsCisgICAgICBSRENhcEZsZzpMUF9SRENBUEZMR0EsCisgICAgICBSREludFNlbDpMUF9SRElOVFNFTEEsCisgICAgICBXUkludFNlbDpMUF9XUklOVFNFTEEsCit9OworCitzdGF0aWMgZGlvX3ByaXZhdGUgZGlvX3ByaXZhdGVfQiA9IHsKKyAgICAgIFJEREluOkxQX1JERElOQiwKKyAgICAgIFdSRE91dDpMUF9XUkRPVVRCLAorICAgICAgUkRFZGdTZWw6TFBfUkRFREdTRUxCLAorICAgICAgV1JFZGdTZWw6TFBfV1JFREdTRUxCLAorICAgICAgUkRDYXBTZWw6TFBfUkRDQVBTRUxCLAorICAgICAgV1JDYXBTZWw6TFBfV1JDQVBTRUxCLAorICAgICAgUkRDYXBGbGc6TFBfUkRDQVBGTEdCLAorICAgICAgUkRJbnRTZWw6TFBfUkRJTlRTRUxCLAorICAgICAgV1JJbnRTZWw6TFBfV1JJTlRTRUxCLAorfTsKKworc3RhdGljIGRpb19wcml2YXRlIGRpb19wcml2YXRlX0MgPSB7CisgICAgICBSRERJbjpMUF9SRERJTkMsCisgICAgICBXUkRPdXQ6TFBfV1JET1VUQywKKyAgICAgIFJERWRnU2VsOkxQX1JERURHU0VMQywKKyAgICAgIFdSRWRnU2VsOkxQX1dSRURHU0VMQywKKyAgICAgIFJEQ2FwU2VsOkxQX1JEQ0FQU0VMQywKKyAgICAgIFdSQ2FwU2VsOkxQX1dSQ0FQU0VMQywKKyAgICAgIFJEQ2FwRmxnOkxQX1JEQ0FQRkxHQywKKyAgICAgIFJESW50U2VsOkxQX1JESU5UU0VMQywKKyAgICAgIFdSSW50U2VsOkxQX1dSSU5UU0VMQywKK307CisKKy8qIHRvIGdyb3VwIGRpbyBkZXZpY2VzICg0OCBiaXRzIG1hc2sgYW5kIGRhdGEgYXJlIG5vdCBhbGxvd2VkID8/PykKK3N0YXRpYyBkaW9fcHJpdmF0ZSAqZGlvX3ByaXZhdGVfd29yZFtdPXsKKyAgJmRpb19wcml2YXRlX0EsCisgICZkaW9fcHJpdmF0ZV9CLAorICAmZGlvX3ByaXZhdGVfQywKK307CisqLworCisjZGVmaW5lIGRldnByaXYgKChzNjI2X3ByaXZhdGUgKilkZXYtPnByaXZhdGUpCisjZGVmaW5lIGRpb3ByaXYgKChkaW9fcHJpdmF0ZSAqKXMtPnByaXZhdGUpCisKK0NPTUVESV9QQ0lfSU5JVENMRUFOVVBfTk9NT0RVTEUoZHJpdmVyX3M2MjYsIHM2MjZfcGNpX3RhYmxlKTsKKworLy9pb2N0bCByb3V0aW5lcworc3RhdGljIGludCBzNjI2X2FpX2luc25fY29uZmlnKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKiBzLAorCWNvbWVkaV9pbnNuICogaW5zbiwgbHNhbXBsX3QgKiBkYXRhKTsKKy8qIHN0YXRpYyBpbnQgczYyNl9haV9yaW5zbihjb21lZGlfZGV2aWNlICpkZXYsY29tZWRpX3N1YmRldmljZSAqcyxjb21lZGlfaW5zbiAqaW5zbixsc2FtcGxfdCAqZGF0YSk7ICovCitzdGF0aWMgaW50IHM2MjZfYWlfaW5zbl9yZWFkKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKiBzLAorCWNvbWVkaV9pbnNuICogaW5zbiwgbHNhbXBsX3QgKiBkYXRhKTsKK3N0YXRpYyBpbnQgczYyNl9haV9jbWQoY29tZWRpX2RldmljZSAqIGRldiwgY29tZWRpX3N1YmRldmljZSAqIHMpOworc3RhdGljIGludCBzNjI2X2FpX2NtZHRlc3QoY29tZWRpX2RldmljZSAqIGRldiwgY29tZWRpX3N1YmRldmljZSAqIHMsCisJY29tZWRpX2NtZCAqIGNtZCk7CitzdGF0aWMgaW50IHM2MjZfYWlfY2FuY2VsKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKiBzKTsKK3N0YXRpYyBpbnQgczYyNl9hb193aW5zbihjb21lZGlfZGV2aWNlICogZGV2LCBjb21lZGlfc3ViZGV2aWNlICogcywKKwljb21lZGlfaW5zbiAqIGluc24sIGxzYW1wbF90ICogZGF0YSk7CitzdGF0aWMgaW50IHM2MjZfYW9fcmluc24oY29tZWRpX2RldmljZSAqIGRldiwgY29tZWRpX3N1YmRldmljZSAqIHMsCisJY29tZWRpX2luc24gKiBpbnNuLCBsc2FtcGxfdCAqIGRhdGEpOworc3RhdGljIGludCBzNjI2X2Rpb19pbnNuX2JpdHMoY29tZWRpX2RldmljZSAqIGRldiwgY29tZWRpX3N1YmRldmljZSAqIHMsCisJY29tZWRpX2luc24gKiBpbnNuLCBsc2FtcGxfdCAqIGRhdGEpOworc3RhdGljIGludCBzNjI2X2Rpb19pbnNuX2NvbmZpZyhjb21lZGlfZGV2aWNlICogZGV2LCBjb21lZGlfc3ViZGV2aWNlICogcywKKwljb21lZGlfaW5zbiAqIGluc24sIGxzYW1wbF90ICogZGF0YSk7CitzdGF0aWMgaW50IHM2MjZfZGlvX3NldF9pcnEoY29tZWRpX2RldmljZSAqIGRldiwgdW5zaWduZWQgaW50IGNoYW4pOworc3RhdGljIGludCBzNjI2X2Rpb19yZXNldF9pcnEoY29tZWRpX2RldmljZSAqIGRldiwgdW5zaWduZWQgaW50IGdydW9wLAorCXVuc2lnbmVkIGludCBtYXNrKTsKK3N0YXRpYyBpbnQgczYyNl9kaW9fY2xlYXJfaXJxKGNvbWVkaV9kZXZpY2UgKiBkZXYpOworc3RhdGljIGludCBzNjI2X2VuY19pbnNuX2NvbmZpZyhjb21lZGlfZGV2aWNlICogZGV2LCBjb21lZGlfc3ViZGV2aWNlICogcywKKwljb21lZGlfaW5zbiAqIGluc24sIGxzYW1wbF90ICogZGF0YSk7CitzdGF0aWMgaW50IHM2MjZfZW5jX2luc25fcmVhZChjb21lZGlfZGV2aWNlICogZGV2LCBjb21lZGlfc3ViZGV2aWNlICogcywKKwljb21lZGlfaW5zbiAqIGluc24sIGxzYW1wbF90ICogZGF0YSk7CitzdGF0aWMgaW50IHM2MjZfZW5jX2luc25fd3JpdGUoY29tZWRpX2RldmljZSAqIGRldiwgY29tZWRpX3N1YmRldmljZSAqIHMsCisJY29tZWRpX2luc24gKiBpbnNuLCBsc2FtcGxfdCAqIGRhdGEpOworc3RhdGljIGludCBzNjI2X25zX3RvX3RpbWVyKGludCAqbmFub3NlYywgaW50IHJvdW5kX21vZGUpOworc3RhdGljIGludCBzNjI2X2FpX2xvYWRfcG9sbGxpc3QodWludDhfdCAqIHBwbCwgY29tZWRpX2NtZCAqIGNtZCk7CitzdGF0aWMgaW50IHM2MjZfYWlfaW50dHJpZyhjb21lZGlfZGV2aWNlICogZGV2LCBjb21lZGlfc3ViZGV2aWNlICogcywKKwl1bnNpZ25lZCBpbnQgdHJpZ251bSk7CitzdGF0aWMgaXJxcmV0dXJuX3QgczYyNl9pcnFfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkIFBUX1JFR1NfQVJHKTsKK3N0YXRpYyBsc2FtcGxfdCBzNjI2X2FpX3JlZ190b191aW50KGludCBkYXRhKTsKKy8qIHN0YXRpYyBsc2FtcGxfdCBzNjI2X3VpbnRfdG9fcmVnKGNvbWVkaV9zdWJkZXZpY2UgKnMsIGludCBkYXRhKTsgKi8KKworLy9lbmQgaW9jdGwgcm91dGluZXMKKworLy9pbnRlcm5hbCByb3V0aW5lcworc3RhdGljIHZvaWQgczYyNl9kaW9faW5pdChjb21lZGlfZGV2aWNlICogZGV2KTsKK3N0YXRpYyB2b2lkIFJlc2V0QURDKGNvbWVkaV9kZXZpY2UgKiBkZXYsIHVpbnQ4X3QgKiBwcGwpOworc3RhdGljIHZvaWQgTG9hZFRyaW1EQUNzKGNvbWVkaV9kZXZpY2UgKiBkZXYpOworc3RhdGljIHZvaWQgV3JpdGVUcmltREFDKGNvbWVkaV9kZXZpY2UgKiBkZXYsIHVpbnQ4X3QgTG9naWNhbENoYW4sCisJdWludDhfdCBEYWNEYXRhKTsKK3N0YXRpYyB1aW50OF90IEkyQ3JlYWQoY29tZWRpX2RldmljZSAqIGRldiwgdWludDhfdCBhZGRyKTsKK3N0YXRpYyB1aW50MzJfdCBJMkNoYW5kc2hha2UoY29tZWRpX2RldmljZSAqIGRldiwgdWludDMyX3QgdmFsKTsKK3N0YXRpYyB2b2lkIFNldERBQyhjb21lZGlfZGV2aWNlICogZGV2LCB1aW50MTZfdCBjaGFuLCBzaG9ydCBkYWNkYXRhKTsKK3N0YXRpYyB2b2lkIFNlbmREQUMoY29tZWRpX2RldmljZSAqIGRldiwgdWludDMyX3QgdmFsKTsKK3N0YXRpYyB2b2lkIFdyaXRlTUlTQzIoY29tZWRpX2RldmljZSAqIGRldiwgdWludDE2X3QgTmV3SW1hZ2UpOworc3RhdGljIHZvaWQgREVCSXRyYW5zZmVyKGNvbWVkaV9kZXZpY2UgKiBkZXYpOworc3RhdGljIHVpbnQxNl90IERFQklyZWFkKGNvbWVkaV9kZXZpY2UgKiBkZXYsIHVpbnQxNl90IGFkZHIpOworc3RhdGljIHZvaWQgREVCSXdyaXRlKGNvbWVkaV9kZXZpY2UgKiBkZXYsIHVpbnQxNl90IGFkZHIsIHVpbnQxNl90IHdkYXRhKTsKK3N0YXRpYyB2b2lkIERFQklyZXBsYWNlKGNvbWVkaV9kZXZpY2UgKiBkZXYsIHVpbnQxNl90IGFkZHIsIHVpbnQxNl90IG1hc2ssCisJdWludDE2X3Qgd2RhdGEpOworc3RhdGljIHZvaWQgQ2xvc2VETUFCKGNvbWVkaV9kZXZpY2UgKiBkZXYsIERNQUJVRiAqIHBkbWEsIHNpemVfdCBic2l6ZSk7CisKKy8vIENPVU5URVIgT0JKRUNUIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordHlwZWRlZiBzdHJ1Y3QgZW5jX3ByaXZhdGVfc3RydWN0IHsKKwkvLyBQb2ludGVycyB0byBmdW5jdGlvbnMgdGhhdCBkaWZmZXIgZm9yIEEgYW5kIEIgY291bnRlcnM6CisJdWludDE2X3QoKkdldEVuYWJsZSkgKGNvbWVkaV9kZXZpY2UgKiBkZXYsIHN0cnVjdCBlbmNfcHJpdmF0ZV9zdHJ1Y3QgKik7CS8vUmV0dXJuIGNsb2NrIGVuYWJsZS4KKwl1aW50MTZfdCgqR2V0SW50U3JjKSAoY29tZWRpX2RldmljZSAqIGRldiwgc3RydWN0IGVuY19wcml2YXRlX3N0cnVjdCAqKTsJLy9SZXR1cm4gaW50ZXJydXB0IHNvdXJjZS4KKwl1aW50MTZfdCgqR2V0TG9hZFRyaWcpIChjb21lZGlfZGV2aWNlICogZGV2LCBzdHJ1Y3QgZW5jX3ByaXZhdGVfc3RydWN0ICopOwkvL1JldHVybiBwcmVsb2FkIHRyaWdnZXIgc291cmNlLgorCXVpbnQxNl90KCpHZXRNb2RlKSAoY29tZWRpX2RldmljZSAqIGRldiwgc3RydWN0IGVuY19wcml2YXRlX3N0cnVjdCAqKTsJLy9SZXR1cm4gc3RhbmRhcmRpemVkIG9wZXJhdGluZyBtb2RlLgorCXZvaWQgKCpQdWxzZUluZGV4KSAoY29tZWRpX2RldmljZSAqIGRldiwgc3RydWN0IGVuY19wcml2YXRlX3N0cnVjdCAqKTsJLy9HZW5lcmF0ZSBzb2Z0IGluZGV4IHN0cm9iZS4KKwl2b2lkICgqU2V0RW5hYmxlKSAoY29tZWRpX2RldmljZSAqIGRldiwgc3RydWN0IGVuY19wcml2YXRlX3N0cnVjdCAqLCB1aW50MTZfdCBlbmFiKTsJLy9Qcm9ncmFtIGNsb2NrIGVuYWJsZS4KKwl2b2lkICgqU2V0SW50U3JjKSAoY29tZWRpX2RldmljZSAqIGRldiwgc3RydWN0IGVuY19wcml2YXRlX3N0cnVjdCAqLCB1aW50MTZfdCBJbnRTb3VyY2UpOwkvL1Byb2dyYW0gaW50ZXJydXB0IHNvdXJjZS4KKwl2b2lkICgqU2V0TG9hZFRyaWcpIChjb21lZGlfZGV2aWNlICogZGV2LCBzdHJ1Y3QgZW5jX3ByaXZhdGVfc3RydWN0ICosIHVpbnQxNl90IFRyaWcpOwkvL1Byb2dyYW0gcHJlbG9hZCB0cmlnZ2VyIHNvdXJjZS4KKwl2b2lkICgqU2V0TW9kZSkgKGNvbWVkaV9kZXZpY2UgKiBkZXYsIHN0cnVjdCBlbmNfcHJpdmF0ZV9zdHJ1Y3QgKiwgdWludDE2X3QgU2V0dXAsIHVpbnQxNl90IERpc2FibGVJbnRTcmMpOwkvL1Byb2dyYW0gc3RhbmRhcmRpemVkIG9wZXJhdGluZyBtb2RlLgorCXZvaWQgKCpSZXNldENhcEZsYWdzKSAoY29tZWRpX2RldmljZSAqIGRldiwgc3RydWN0IGVuY19wcml2YXRlX3N0cnVjdCAqKTsJLy9SZXNldCBldmVudCBjYXB0dXJlIGZsYWdzLgorCisJdWludDE2X3QgTXlDUkE7CQkvLyAgIEFkZHJlc3Mgb2YgQ1JBIHJlZ2lzdGVyLgorCXVpbnQxNl90IE15Q1JCOwkJLy8gICBBZGRyZXNzIG9mIENSQiByZWdpc3Rlci4KKwl1aW50MTZfdCBNeUxhdGNoTHN3OwkvLyAgIEFkZHJlc3Mgb2YgTGF0Y2ggbGVhc3Qtc2lnbmlmaWNhbnQtd29yZAorCS8vICAgcmVnaXN0ZXIuCisJdWludDE2X3QgTXlFdmVudEJpdHNbNF07CS8vICAgQml0IHRyYW5zbGF0aW9ucyBmb3IgSW50U3JjIC0tPlJETUlTQzIuCit9IGVuY19wcml2YXRlOwkJCS8vY291bnRlciBvYmplY3QKKworI2RlZmluZSBlbmNwcml2ICgoZW5jX3ByaXZhdGUgKikoZGV2LT5zdWJkZXZpY2VzKzUpLT5wcml2YXRlKQorCisvL2NvdW50ZXJzIHJvdXRpbmVzCitzdGF0aWMgdm9pZCBzNjI2X3RpbWVyX2xvYWQoY29tZWRpX2RldmljZSAqIGRldiwgZW5jX3ByaXZhdGUgKiBrLCBpbnQgdGljayk7CitzdGF0aWMgdWludDMyX3QgUmVhZExhdGNoKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGVuY19wcml2YXRlICogayk7CitzdGF0aWMgdm9pZCBSZXNldENhcEZsYWdzX0EoY29tZWRpX2RldmljZSAqIGRldiwgZW5jX3ByaXZhdGUgKiBrKTsKK3N0YXRpYyB2b2lkIFJlc2V0Q2FwRmxhZ3NfQihjb21lZGlfZGV2aWNlICogZGV2LCBlbmNfcHJpdmF0ZSAqIGspOworc3RhdGljIHVpbnQxNl90IEdldE1vZGVfQShjb21lZGlfZGV2aWNlICogZGV2LCBlbmNfcHJpdmF0ZSAqIGspOworc3RhdGljIHVpbnQxNl90IEdldE1vZGVfQihjb21lZGlfZGV2aWNlICogZGV2LCBlbmNfcHJpdmF0ZSAqIGspOworc3RhdGljIHZvaWQgU2V0TW9kZV9BKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGVuY19wcml2YXRlICogaywgdWludDE2X3QgU2V0dXAsCisJdWludDE2X3QgRGlzYWJsZUludFNyYyk7CitzdGF0aWMgdm9pZCBTZXRNb2RlX0IoY29tZWRpX2RldmljZSAqIGRldiwgZW5jX3ByaXZhdGUgKiBrLCB1aW50MTZfdCBTZXR1cCwKKwl1aW50MTZfdCBEaXNhYmxlSW50U3JjKTsKK3N0YXRpYyB2b2lkIFNldEVuYWJsZV9BKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGVuY19wcml2YXRlICogaywgdWludDE2X3QgZW5hYik7CitzdGF0aWMgdm9pZCBTZXRFbmFibGVfQihjb21lZGlfZGV2aWNlICogZGV2LCBlbmNfcHJpdmF0ZSAqIGssIHVpbnQxNl90IGVuYWIpOworc3RhdGljIHVpbnQxNl90IEdldEVuYWJsZV9BKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGVuY19wcml2YXRlICogayk7CitzdGF0aWMgdWludDE2X3QgR2V0RW5hYmxlX0IoY29tZWRpX2RldmljZSAqIGRldiwgZW5jX3ByaXZhdGUgKiBrKTsKK3N0YXRpYyB2b2lkIFNldExhdGNoU291cmNlKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGVuY19wcml2YXRlICogaywKKwl1aW50MTZfdCB2YWx1ZSk7CisvKiBzdGF0aWMgdWludDE2X3QgR2V0TGF0Y2hTb3VyY2UoY29tZWRpX2RldmljZSAqZGV2LCBlbmNfcHJpdmF0ZSAqayApOyAqLworc3RhdGljIHZvaWQgU2V0TG9hZFRyaWdfQShjb21lZGlfZGV2aWNlICogZGV2LCBlbmNfcHJpdmF0ZSAqIGssIHVpbnQxNl90IFRyaWcpOworc3RhdGljIHZvaWQgU2V0TG9hZFRyaWdfQihjb21lZGlfZGV2aWNlICogZGV2LCBlbmNfcHJpdmF0ZSAqIGssIHVpbnQxNl90IFRyaWcpOworc3RhdGljIHVpbnQxNl90IEdldExvYWRUcmlnX0EoY29tZWRpX2RldmljZSAqIGRldiwgZW5jX3ByaXZhdGUgKiBrKTsKK3N0YXRpYyB1aW50MTZfdCBHZXRMb2FkVHJpZ19CKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGVuY19wcml2YXRlICogayk7CitzdGF0aWMgdm9pZCBTZXRJbnRTcmNfQihjb21lZGlfZGV2aWNlICogZGV2LCBlbmNfcHJpdmF0ZSAqIGssCisJdWludDE2X3QgSW50U291cmNlKTsKK3N0YXRpYyB2b2lkIFNldEludFNyY19BKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGVuY19wcml2YXRlICogaywKKwl1aW50MTZfdCBJbnRTb3VyY2UpOworc3RhdGljIHVpbnQxNl90IEdldEludFNyY19BKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGVuY19wcml2YXRlICogayk7CitzdGF0aWMgdWludDE2X3QgR2V0SW50U3JjX0IoY29tZWRpX2RldmljZSAqIGRldiwgZW5jX3ByaXZhdGUgKiBrKTsKKy8qIHN0YXRpYyB2b2lkIFNldENsa011bHQoY29tZWRpX2RldmljZSAqZGV2LCBlbmNfcHJpdmF0ZSAqaywgdWludDE2X3QgdmFsdWUgKSA7ICovCisvKiBzdGF0aWMgdWludDE2X3QgR2V0Q2xrTXVsdChjb21lZGlfZGV2aWNlICpkZXYsIGVuY19wcml2YXRlICprICkgOyAqLworLyogc3RhdGljIHZvaWQgU2V0SW5kZXhQb2woY29tZWRpX2RldmljZSAqZGV2LCBlbmNfcHJpdmF0ZSAqaywgdWludDE2X3QgdmFsdWUgKTsgKi8KKy8qIHN0YXRpYyB1aW50MTZfdCBHZXRDbGtQb2woY29tZWRpX2RldmljZSAqZGV2LCBlbmNfcHJpdmF0ZSAqayApIDsgKi8KKy8qIHN0YXRpYyB2b2lkIFNldEluZGV4U3JjKCBjb21lZGlfZGV2aWNlICpkZXYsZW5jX3ByaXZhdGUgKmssIHVpbnQxNl90IHZhbHVlICk7ICAqLworLyogc3RhdGljIHVpbnQxNl90IEdldENsa1NyYyggY29tZWRpX2RldmljZSAqZGV2LGVuY19wcml2YXRlICprICk7ICAqLworLyogc3RhdGljIHZvaWQgU2V0SW5kZXhTcmMoIGNvbWVkaV9kZXZpY2UgKmRldixlbmNfcHJpdmF0ZSAqaywgdWludDE2X3QgdmFsdWUgKTsgICovCisvKiBzdGF0aWMgdWludDE2X3QgR2V0SW5kZXhTcmMoIGNvbWVkaV9kZXZpY2UgKmRldixlbmNfcHJpdmF0ZSAqayApOyAgKi8KK3N0YXRpYyB2b2lkIFB1bHNlSW5kZXhfQShjb21lZGlfZGV2aWNlICogZGV2LCBlbmNfcHJpdmF0ZSAqIGspOworc3RhdGljIHZvaWQgUHVsc2VJbmRleF9CKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGVuY19wcml2YXRlICogayk7CitzdGF0aWMgdm9pZCBQcmVsb2FkKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGVuY19wcml2YXRlICogaywgdWludDMyX3QgdmFsdWUpOworc3RhdGljIHZvaWQgQ291bnRlcnNJbml0KGNvbWVkaV9kZXZpY2UgKiBkZXYpOworLy9lbmQgaW50ZXJuYWwgcm91dGluZXMKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQ291bnRlciBvYmplY3RzIGNvbnN0cnVjdG9yLgorCisvLyBDb3VudGVyIG92ZXJmbG93L2luZGV4IGV2ZW50IGZsYWcgbWFza3MgZm9yIFJETUlTQzIuCisjZGVmaW5lIElORFhNQVNLKEMpCQkoIDEgPDwgKCAoIChDKSA+IDIgKSA/ICggKEMpICogMiAtIDEgKSA6ICggKEMpICogMiArICA0ICkgKSApCisjZGVmaW5lIE9WRVJNQVNLKEMpCQkoIDEgPDwgKCAoIChDKSA+IDIgKSA/ICggKEMpICogMiArIDUgKSA6ICggKEMpICogMiArIDEwICkgKSApCisjZGVmaW5lIEVWQklUUyhDKQkJeyAwLCBPVkVSTUFTSyhDKSwgSU5EWE1BU0soQyksIE9WRVJNQVNLKEMpIHwgSU5EWE1BU0soQykgfQorCisvLyBUcmFuc2xhdGlvbiB0YWJsZSB0byBtYXAgSW50U3JjIGludG8gZXF1aXZhbGVudCBSRE1JU0MyIGV2ZW50IGZsYWcKKy8vIGJpdHMuCisvL3N0YXRpYyBjb25zdCB1aW50MTZfdCBFdmVudEJpdHNbXVs0XSA9IHsgRVZCSVRTKDApLCBFVkJJVFMoMSksIEVWQklUUygyKSwgRVZCSVRTKDMpLCBFVkJJVFMoNCksIEVWQklUUyg1KSB9OworCisvKiBlbmNfcHJpdmF0ZTsgKi8KK3N0YXRpYyBlbmNfcHJpdmF0ZSBlbmNfcHJpdmF0ZV9kYXRhW10gPSB7CisJeworCSAgICAgIEdldEVuYWJsZTpHZXRFbmFibGVfQSwKKwkgICAgICBHZXRJbnRTcmM6R2V0SW50U3JjX0EsCisJICAgICAgR2V0TG9hZFRyaWc6R2V0TG9hZFRyaWdfQSwKKwkgICAgICBHZXRNb2RlOglHZXRNb2RlX0EsCisJICAgICAgUHVsc2VJbmRleDpQdWxzZUluZGV4X0EsCisJICAgICAgU2V0RW5hYmxlOlNldEVuYWJsZV9BLAorCSAgICAgIFNldEludFNyYzpTZXRJbnRTcmNfQSwKKwkgICAgICBTZXRMb2FkVHJpZzpTZXRMb2FkVHJpZ19BLAorCSAgICAgIFNldE1vZGU6CVNldE1vZGVfQSwKKwkgICAgICBSZXNldENhcEZsYWdzOlJlc2V0Q2FwRmxhZ3NfQSwKKwkgICAgICBNeUNSQToJTFBfQ1IwQSwKKwkgICAgICBNeUNSQjoJTFBfQ1IwQiwKKwkgICAgICBNeUxhdGNoTHN3OkxQX0NOVFIwQUxTVywKKwkgICAgICBNeUV2ZW50Qml0czpFVkJJVFMoMCksCisJCX0sCisJeworCSAgICAgIEdldEVuYWJsZTpHZXRFbmFibGVfQSwKKwkgICAgICBHZXRJbnRTcmM6R2V0SW50U3JjX0EsCisJICAgICAgR2V0TG9hZFRyaWc6R2V0TG9hZFRyaWdfQSwKKwkgICAgICBHZXRNb2RlOglHZXRNb2RlX0EsCisJICAgICAgUHVsc2VJbmRleDpQdWxzZUluZGV4X0EsCisJICAgICAgU2V0RW5hYmxlOlNldEVuYWJsZV9BLAorCSAgICAgIFNldEludFNyYzpTZXRJbnRTcmNfQSwKKwkgICAgICBTZXRMb2FkVHJpZzpTZXRMb2FkVHJpZ19BLAorCSAgICAgIFNldE1vZGU6CVNldE1vZGVfQSwKKwkgICAgICBSZXNldENhcEZsYWdzOlJlc2V0Q2FwRmxhZ3NfQSwKKwkgICAgICBNeUNSQToJTFBfQ1IxQSwKKwkgICAgICBNeUNSQjoJTFBfQ1IxQiwKKwkgICAgICBNeUxhdGNoTHN3OkxQX0NOVFIxQUxTVywKKwkgICAgICBNeUV2ZW50Qml0czpFVkJJVFMoMSksCisJCX0sCisJeworCSAgICAgIEdldEVuYWJsZTpHZXRFbmFibGVfQSwKKwkgICAgICBHZXRJbnRTcmM6R2V0SW50U3JjX0EsCisJICAgICAgR2V0TG9hZFRyaWc6R2V0TG9hZFRyaWdfQSwKKwkgICAgICBHZXRNb2RlOglHZXRNb2RlX0EsCisJICAgICAgUHVsc2VJbmRleDpQdWxzZUluZGV4X0EsCisJICAgICAgU2V0RW5hYmxlOlNldEVuYWJsZV9BLAorCSAgICAgIFNldEludFNyYzpTZXRJbnRTcmNfQSwKKwkgICAgICBTZXRMb2FkVHJpZzpTZXRMb2FkVHJpZ19BLAorCSAgICAgIFNldE1vZGU6CVNldE1vZGVfQSwKKwkgICAgICBSZXNldENhcEZsYWdzOlJlc2V0Q2FwRmxhZ3NfQSwKKwkgICAgICBNeUNSQToJTFBfQ1IyQSwKKwkgICAgICBNeUNSQjoJTFBfQ1IyQiwKKwkgICAgICBNeUxhdGNoTHN3OkxQX0NOVFIyQUxTVywKKwkgICAgICBNeUV2ZW50Qml0czpFVkJJVFMoMiksCisJCX0sCisJeworCSAgICAgIEdldEVuYWJsZTpHZXRFbmFibGVfQiwKKwkgICAgICBHZXRJbnRTcmM6R2V0SW50U3JjX0IsCisJICAgICAgR2V0TG9hZFRyaWc6R2V0TG9hZFRyaWdfQiwKKwkgICAgICBHZXRNb2RlOglHZXRNb2RlX0IsCisJICAgICAgUHVsc2VJbmRleDpQdWxzZUluZGV4X0IsCisJICAgICAgU2V0RW5hYmxlOlNldEVuYWJsZV9CLAorCSAgICAgIFNldEludFNyYzpTZXRJbnRTcmNfQiwKKwkgICAgICBTZXRMb2FkVHJpZzpTZXRMb2FkVHJpZ19CLAorCSAgICAgIFNldE1vZGU6CVNldE1vZGVfQiwKKwkgICAgICBSZXNldENhcEZsYWdzOlJlc2V0Q2FwRmxhZ3NfQiwKKwkgICAgICBNeUNSQToJTFBfQ1IwQSwKKwkgICAgICBNeUNSQjoJTFBfQ1IwQiwKKwkgICAgICBNeUxhdGNoTHN3OkxQX0NOVFIwQkxTVywKKwkgICAgICBNeUV2ZW50Qml0czpFVkJJVFMoMyksCisJCX0sCisJeworCSAgICAgIEdldEVuYWJsZTpHZXRFbmFibGVfQiwKKwkgICAgICBHZXRJbnRTcmM6R2V0SW50U3JjX0IsCisJICAgICAgR2V0TG9hZFRyaWc6R2V0TG9hZFRyaWdfQiwKKwkgICAgICBHZXRNb2RlOglHZXRNb2RlX0IsCisJICAgICAgUHVsc2VJbmRleDpQdWxzZUluZGV4X0IsCisJICAgICAgU2V0RW5hYmxlOlNldEVuYWJsZV9CLAorCSAgICAgIFNldEludFNyYzpTZXRJbnRTcmNfQiwKKwkgICAgICBTZXRMb2FkVHJpZzpTZXRMb2FkVHJpZ19CLAorCSAgICAgIFNldE1vZGU6CVNldE1vZGVfQiwKKwkgICAgICBSZXNldENhcEZsYWdzOlJlc2V0Q2FwRmxhZ3NfQiwKKwkgICAgICBNeUNSQToJTFBfQ1IxQSwKKwkgICAgICBNeUNSQjoJTFBfQ1IxQiwKKwkgICAgICBNeUxhdGNoTHN3OkxQX0NOVFIxQkxTVywKKwkgICAgICBNeUV2ZW50Qml0czpFVkJJVFMoNCksCisJCX0sCisJeworCSAgICAgIEdldEVuYWJsZTpHZXRFbmFibGVfQiwKKwkgICAgICBHZXRJbnRTcmM6R2V0SW50U3JjX0IsCisJICAgICAgR2V0TG9hZFRyaWc6R2V0TG9hZFRyaWdfQiwKKwkgICAgICBHZXRNb2RlOglHZXRNb2RlX0IsCisJICAgICAgUHVsc2VJbmRleDpQdWxzZUluZGV4X0IsCisJICAgICAgU2V0RW5hYmxlOlNldEVuYWJsZV9CLAorCSAgICAgIFNldEludFNyYzpTZXRJbnRTcmNfQiwKKwkgICAgICBTZXRMb2FkVHJpZzpTZXRMb2FkVHJpZ19CLAorCSAgICAgIFNldE1vZGU6CVNldE1vZGVfQiwKKwkgICAgICBSZXNldENhcEZsYWdzOlJlc2V0Q2FwRmxhZ3NfQiwKKwkgICAgICBNeUNSQToJTFBfQ1IyQSwKKwkgICAgICBNeUNSQjoJTFBfQ1IyQiwKKwkgICAgICBNeUxhdGNoTHN3OkxQX0NOVFIyQkxTVywKKwkgICAgICBNeUV2ZW50Qml0czpFVkJJVFMoNSksCisJCX0sCit9OworCisvLyBlbmFiL2Rpc2FibGUgYSBmdW5jdGlvbiBvciB0ZXN0IHN0YXR1cyBiaXQocykgdGhhdCBhcmUgYWNjZXNzZWQKKy8vIHRocm91Z2ggTWFpbiBDb250cm9sIFJlZ2lzdGVycyAxIG9yIDIuCisjZGVmaW5lIE1DX0VOQUJMRSggUkVHQURSUywgQ1RSTFdPUkQgKQl3cml0ZWwoICAoICh1aW50MzJfdCkoIENUUkxXT1JEICkgPDwgMTYgKSB8ICh1aW50MzJfdCkoIENUUkxXT1JEICksZGV2cHJpdi0+YmFzZV9hZGRyKyggUkVHQURSUyApICkKKworI2RlZmluZSBNQ19ESVNBQkxFKCBSRUdBRFJTLCBDVFJMV09SRCApCXdyaXRlbCggICh1aW50MzJfdCkoIENUUkxXT1JEICkgPDwgMTYgLCBkZXZwcml2LT5iYXNlX2FkZHIrKCBSRUdBRFJTICkgKQorCisjZGVmaW5lIE1DX1RFU1QoIFJFR0FEUlMsIENUUkxXT1JEICkJKCAoIHJlYWRsKGRldnByaXYtPmJhc2VfYWRkcisoIFJFR0FEUlMgKSkgJiBDVFJMV09SRCApICE9IDAgKQorCisvKiAjZGVmaW5lIFdSNzE0NihSRUdBUkRTLENUUkxXT1JEKQorICAgIHdyaXRlbChDVFJMV09SRCwodWludDMyX3QpKGRldnByaXYtPmJhc2VfYWRkcisoUkVHQVJEUykpKSAqLworI2RlZmluZSBXUjcxNDYoUkVHQVJEUyxDVFJMV09SRCkgd3JpdGVsKENUUkxXT1JELGRldnByaXYtPmJhc2VfYWRkcisoUkVHQVJEUykpCisKKy8qICNkZWZpbmUgUlI3MTQ2KFJFR0FSRFMpCisgICAgcmVhZGwoKHVpbnQzMl90KShkZXZwcml2LT5iYXNlX2FkZHIrKFJFR0FSRFMpKSkgKi8KKyNkZWZpbmUgUlI3MTQ2KFJFR0FSRFMpCQlyZWFkbChkZXZwcml2LT5iYXNlX2FkZHIrKFJFR0FSRFMpKQorCisjZGVmaW5lIEJVR0ZJWF9TVFJFRyhSRUdBRFJTKSAgICggUkVHQURSUyAtIDQgKQorCisvLyBXcml0ZSBhIHRpbWUgc2xvdCBjb250cm9sIHJlY29yZCB0byBUU0wyLgorI2RlZmluZSBWRUNUUE9SVCggVkVDVE5VTSApCQkoUF9UU0wyICsgKCAoVkVDVE5VTSkgPDwgMiApKQorI2RlZmluZSBTRVRWRUNUKCBWRUNUTlVNLCBWRUNUVkFMICkJV1I3MTQ2KFZFQ1RQT1JUKCBWRUNUTlVNICksIChWRUNUVkFMKSkKKworLy8gQ29kZSBtYWNyb3MgdXNlZCBmb3IgY29uc3RydWN0aW5nIEkyQyBjb21tYW5kIGJ5dGVzLgorI2RlZmluZSBJMkNfQjIoQVRUUixWQUwpCSggKCAoQVRUUikgPDwgNiApIHwgKCAoVkFMKSA8PCAyNCApICkKKyNkZWZpbmUgSTJDX0IxKEFUVFIsVkFMKQkoICggKEFUVFIpIDw8IDQgKSB8ICggKFZBTCkgPDwgMTYgKSApCisjZGVmaW5lIEkyQ19CMChBVFRSLFZBTCkJKCAoIChBVFRSKSA8PCAyICkgfCAoIChWQUwpIDw8ICA4ICkgKQorCitzdGF0aWMgY29uc3QgY29tZWRpX2xyYW5nZSBzNjI2X3JhbmdlX3RhYmxlID0geyAyLCB7CisJCQlSQU5HRSgtNSwgNSksCisJCQlSQU5HRSgtMTAsIDEwKSwKKwl9Cit9OworCitzdGF0aWMgaW50IHM2MjZfYXR0YWNoKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGNvbWVkaV9kZXZjb25maWcgKiBpdCkKK3sKKy8qICAgdWludDhfdAlQb2xsTGlzdDsgKi8KKy8qICAgdWludDE2X3QJQWRjRGF0YTsgKi8KKy8qICAgdWludDE2X3QJU3RhcnRWYWw7ICovCisvKiAgIHVpbnQxNl90CWluZGV4OyAqLworLyogICB1bnNpZ25lZCBpbnQgZGF0YVsxNl07ICovCisJaW50IHJlc3VsdDsKKwlpbnQgaTsKKwlpbnQgcmV0OworCXJlc291cmNlX3NpemVfdCByZXNvdXJjZVN0YXJ0OworCWRtYV9hZGRyX3QgYXBwZG1hOworCWNvbWVkaV9zdWJkZXZpY2UgKnM7CisJc3RydWN0IHBjaV9kZXYgKnBkZXY7CisKKwlpZiAoYWxsb2NfcHJpdmF0ZShkZXYsIHNpemVvZihzNjI2X3ByaXZhdGUpKSA8IDApCisJCXJldHVybiAtRU5PTUVNOworCisJZm9yIChwZGV2ID0gcGNpX2dldF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9TNjI2LCBQQ0lfREVWSUNFX0lEX1M2MjYsCisJCQlOVUxMKTsgcGRldiAhPSBOVUxMOworCQlwZGV2ID0gcGNpX2dldF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9TNjI2LAorCQkJUENJX0RFVklDRV9JRF9TNjI2LCBwZGV2KSkgeworCQlpZiAoaXQtPm9wdGlvbnNbMF0gfHwgaXQtPm9wdGlvbnNbMV0pIHsKKwkJCWlmIChwZGV2LT5idXMtPm51bWJlciA9PSBpdC0+b3B0aW9uc1swXSAmJgorCQkJCVBDSV9TTE9UKHBkZXYtPmRldmZuKSA9PSBpdC0+b3B0aW9uc1sxXSkgeworCQkJCS8qIG1hdGNoZXMgcmVxdWVzdGVkIGJ1cy9zbG90ICovCisJCQkJYnJlYWs7CisJCQl9CisJCX0gZWxzZSB7CisJCQkvKiBubyBidXMvc2xvdCBzcGVjaWZpZWQgKi8KKwkJCWJyZWFrOworCQl9CisJfQorCWRldnByaXYtPnBkZXYgPSBwZGV2OworCisJaWYgKHBkZXYgPT0gTlVMTCkgeworCQlwcmludGsoInM2MjZfYXR0YWNoOiBCb2FyZCBub3QgcHJlc2VudCEhIVxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWlmICgocmVzdWx0ID0gY29tZWRpX3BjaV9lbmFibGUocGRldiwgInM2MjYiKSkgPCAwKSB7CisJCXByaW50aygiczYyNl9hdHRhY2g6IGNvbWVkaV9wY2lfZW5hYmxlIGZhaWxzXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCWRldnByaXYtPmdvdF9yZWdpb25zID0gMTsKKworCXJlc291cmNlU3RhcnQgPSBwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2cHJpdi0+cGRldiwgMCk7CisKKwlkZXZwcml2LT5iYXNlX2FkZHIgPSBpb3JlbWFwKHJlc291cmNlU3RhcnQsIFNJWkVPRl9BRERSRVNTX1NQQUNFKTsKKwlpZiAoZGV2cHJpdi0+YmFzZV9hZGRyID09IE5VTEwpIHsKKwkJcHJpbnRrKCJzNjI2X2F0dGFjaDogSU9SRU1BUCBmYWlsZWRcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlpZiAoZGV2cHJpdi0+YmFzZV9hZGRyKSB7CisJCS8vZGlzYWJsZSBtYXN0ZXIgaW50ZXJydXB0CisJCXdyaXRlbCgwLCBkZXZwcml2LT5iYXNlX2FkZHIgKyBQX0lFUik7CisKKwkJLy9zb2Z0IHJlc2V0CisJCXdyaXRlbChNQzFfU09GVF9SRVNFVCwgZGV2cHJpdi0+YmFzZV9hZGRyICsgUF9NQzEpOworCisJCS8vRE1BIEZJWE1FIERNQS8vCisJCURFQlVHKCJzNjI2X2F0dGFjaDogRE1BIEFMTE9DQVRJT05cbiIpOworCisJCS8vYWRjIGJ1ZmZlciBhbGxvY2F0aW9uCisJCWRldnByaXYtPmFsbG9jYXRlZEJ1ZiA9IDA7CisKKwkJaWYgKChkZXZwcml2LT5BTkFCdWYuTG9naWNhbEJhc2UgPQorCQkJCXBjaV9hbGxvY19jb25zaXN0ZW50KGRldnByaXYtPnBkZXYsIERNQUJVRl9TSVpFLAorCQkJCQkmYXBwZG1hKSkgPT0gTlVMTCkgeworCQkJcHJpbnRrKCJzNjI2X2F0dGFjaDogRE1BIE1lbW9yeSBtYXBwaW5nIGVycm9yXG4iKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisKKwkJZGV2cHJpdi0+QU5BQnVmLlBoeXNpY2FsQmFzZSA9IGFwcGRtYTsKKworCQlERUJVRygiczYyNl9hdHRhY2g6IEFsbG9jRE1BQiBBREMgTG9naWNhbD0lcCwgYnNpemU9JWQsIFBoeXNpY2FsPTB4JXhcbiIsIGRldnByaXYtPkFOQUJ1Zi5Mb2dpY2FsQmFzZSwgRE1BQlVGX1NJWkUsICh1aW50MzJfdCkgZGV2cHJpdi0+QU5BQnVmLlBoeXNpY2FsQmFzZSk7CisKKwkJZGV2cHJpdi0+YWxsb2NhdGVkQnVmKys7CisKKwkJaWYgKChkZXZwcml2LT5SUFNCdWYuTG9naWNhbEJhc2UgPQorCQkJCXBjaV9hbGxvY19jb25zaXN0ZW50KGRldnByaXYtPnBkZXYsIERNQUJVRl9TSVpFLAorCQkJCQkmYXBwZG1hKSkgPT0gTlVMTCkgeworCQkJcHJpbnRrKCJzNjI2X2F0dGFjaDogRE1BIE1lbW9yeSBtYXBwaW5nIGVycm9yXG4iKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisKKwkJZGV2cHJpdi0+UlBTQnVmLlBoeXNpY2FsQmFzZSA9IGFwcGRtYTsKKworCQlERUJVRygiczYyNl9hdHRhY2g6IEFsbG9jRE1BQiBSUFMgTG9naWNhbD0lcCwgYnNpemU9JWQsIFBoeXNpY2FsPTB4JXhcbiIsIGRldnByaXYtPlJQU0J1Zi5Mb2dpY2FsQmFzZSwgRE1BQlVGX1NJWkUsICh1aW50MzJfdCkgZGV2cHJpdi0+UlBTQnVmLlBoeXNpY2FsQmFzZSk7CisKKwkJZGV2cHJpdi0+YWxsb2NhdGVkQnVmKys7CisKKwl9CisKKwlkZXYtPmJvYXJkX3B0ciA9IHM2MjZfYm9hcmRzOworCWRldi0+Ym9hcmRfbmFtZSA9IHRoaXNib2FyZC0+bmFtZTsKKworCWlmIChhbGxvY19zdWJkZXZpY2VzKGRldiwgNikgPCAwKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWRldi0+aW9iYXNlID0gKHVuc2lnbmVkIGxvbmcpZGV2cHJpdi0+YmFzZV9hZGRyOworCWRldi0+aXJxID0gZGV2cHJpdi0+cGRldi0+aXJxOworCisJLy9zZXQgdXAgaW50ZXJydXB0IGhhbmRsZXIKKwlpZiAoZGV2LT5pcnEgPT0gMCkgeworCQlwcmludGsoIiB1bmtub3duIGlycSAoYmFkKVxuIik7CisJfSBlbHNlIHsKKwkJaWYgKChyZXQgPSBjb21lZGlfcmVxdWVzdF9pcnEoZGV2LT5pcnEsIHM2MjZfaXJxX2hhbmRsZXIsCisJCQkJCUlSUUZfU0hBUkVELCAiczYyNiIsIGRldikpIDwgMCkgeworCQkJcHJpbnRrKCIgaXJxIG5vdCBhdmFpbGFibGVcbiIpOworCQkJZGV2LT5pcnEgPSAwOworCQl9CisJfQorCisJREVCVUcoInM2MjZfYXR0YWNoOiAtLSBpdCBvcHRzICAlZCwlZCAtLSBcbiIsCisJCWl0LT5vcHRpb25zWzBdLCBpdC0+b3B0aW9uc1sxXSk7CisKKwlzID0gZGV2LT5zdWJkZXZpY2VzICsgMDsKKwkvKiBhbmFsb2cgaW5wdXQgc3ViZGV2aWNlICovCisJZGV2LT5yZWFkX3N1YmRldiA9IHM7CisJLyogd2Ugc3VwcG9ydCBzaW5nbGUtZW5kZWQgKGdyb3VuZCkgYW5kIGRpZmZlcmVudGlhbCAqLworCXMtPnR5cGUgPSBDT01FRElfU1VCRF9BSTsKKwlzLT5zdWJkZXZfZmxhZ3MgPSBTREZfUkVBREFCTEUgfCBTREZfRElGRiB8IFNERl9DTURfUkVBRDsKKwlzLT5uX2NoYW4gPSB0aGlzYm9hcmQtPmFpX2NoYW5zOworCXMtPm1heGRhdGEgPSAoMHhmZmZmID4+IDIpOworCXMtPnJhbmdlX3RhYmxlID0gJnM2MjZfcmFuZ2VfdGFibGU7CisJcy0+bGVuX2NoYW5saXN0ID0gdGhpc2JvYXJkLT5haV9jaGFuczsJLyogVGhpcyBpcyB0aGUgbWF4aW11bSBjaGFubGlzdAorCQkJCQkJICAgbGVuZ3RoIHRoYXQgdGhlIGJvYXJkIGNhbgorCQkJCQkJICAgaGFuZGxlICovCisJcy0+aW5zbl9jb25maWcgPSBzNjI2X2FpX2luc25fY29uZmlnOworCXMtPmluc25fcmVhZCA9IHM2MjZfYWlfaW5zbl9yZWFkOworCXMtPmRvX2NtZCA9IHM2MjZfYWlfY21kOworCXMtPmRvX2NtZHRlc3QgPSBzNjI2X2FpX2NtZHRlc3Q7CisJcy0+Y2FuY2VsID0gczYyNl9haV9jYW5jZWw7CisKKwlzID0gZGV2LT5zdWJkZXZpY2VzICsgMTsKKwkvKiBhbmFsb2cgb3V0cHV0IHN1YmRldmljZSAqLworCXMtPnR5cGUgPSBDT01FRElfU1VCRF9BTzsKKwlzLT5zdWJkZXZfZmxhZ3MgPSBTREZfV1JJVEFCTEUgfCBTREZfUkVBREFCTEU7CisJcy0+bl9jaGFuID0gdGhpc2JvYXJkLT5hb19jaGFuczsKKwlzLT5tYXhkYXRhID0gKDB4M2ZmZik7CisJcy0+cmFuZ2VfdGFibGUgPSAmcmFuZ2VfYmlwb2xhcjEwOworCXMtPmluc25fd3JpdGUgPSBzNjI2X2FvX3dpbnNuOworCXMtPmluc25fcmVhZCA9IHM2MjZfYW9fcmluc247CisKKwlzID0gZGV2LT5zdWJkZXZpY2VzICsgMjsKKwkvKiBkaWdpdGFsIEkvTyBzdWJkZXZpY2UgKi8KKwlzLT50eXBlID0gQ09NRURJX1NVQkRfRElPOworCXMtPnN1YmRldl9mbGFncyA9IFNERl9XUklUQUJMRSB8IFNERl9SRUFEQUJMRTsKKwlzLT5uX2NoYW4gPSBTNjI2X0RJT19DSEFOTkVMUzsKKwlzLT5tYXhkYXRhID0gMTsKKwlzLT5pb19iaXRzID0gMHhmZmZmOworCXMtPnByaXZhdGUgPSAmZGlvX3ByaXZhdGVfQTsKKwlzLT5yYW5nZV90YWJsZSA9ICZyYW5nZV9kaWdpdGFsOworCXMtPmluc25fY29uZmlnID0gczYyNl9kaW9faW5zbl9jb25maWc7CisJcy0+aW5zbl9iaXRzID0gczYyNl9kaW9faW5zbl9iaXRzOworCisJcyA9IGRldi0+c3ViZGV2aWNlcyArIDM7CisJLyogZGlnaXRhbCBJL08gc3ViZGV2aWNlICovCisJcy0+dHlwZSA9IENPTUVESV9TVUJEX0RJTzsKKwlzLT5zdWJkZXZfZmxhZ3MgPSBTREZfV1JJVEFCTEUgfCBTREZfUkVBREFCTEU7CisJcy0+bl9jaGFuID0gMTY7CisJcy0+bWF4ZGF0YSA9IDE7CisJcy0+aW9fYml0cyA9IDB4ZmZmZjsKKwlzLT5wcml2YXRlID0gJmRpb19wcml2YXRlX0I7CisJcy0+cmFuZ2VfdGFibGUgPSAmcmFuZ2VfZGlnaXRhbDsKKwlzLT5pbnNuX2NvbmZpZyA9IHM2MjZfZGlvX2luc25fY29uZmlnOworCXMtPmluc25fYml0cyA9IHM2MjZfZGlvX2luc25fYml0czsKKworCXMgPSBkZXYtPnN1YmRldmljZXMgKyA0OworCS8qIGRpZ2l0YWwgSS9PIHN1YmRldmljZSAqLworCXMtPnR5cGUgPSBDT01FRElfU1VCRF9ESU87CisJcy0+c3ViZGV2X2ZsYWdzID0gU0RGX1dSSVRBQkxFIHwgU0RGX1JFQURBQkxFOworCXMtPm5fY2hhbiA9IDE2OworCXMtPm1heGRhdGEgPSAxOworCXMtPmlvX2JpdHMgPSAweGZmZmY7CisJcy0+cHJpdmF0ZSA9ICZkaW9fcHJpdmF0ZV9DOworCXMtPnJhbmdlX3RhYmxlID0gJnJhbmdlX2RpZ2l0YWw7CisJcy0+aW5zbl9jb25maWcgPSBzNjI2X2Rpb19pbnNuX2NvbmZpZzsKKwlzLT5pbnNuX2JpdHMgPSBzNjI2X2Rpb19pbnNuX2JpdHM7CisKKwlzID0gZGV2LT5zdWJkZXZpY2VzICsgNTsKKwkvKiBlbmNvZGVyIChjb3VudGVyKSBzdWJkZXZpY2UgKi8KKwlzLT50eXBlID0gQ09NRURJX1NVQkRfQ09VTlRFUjsKKwlzLT5zdWJkZXZfZmxhZ3MgPSBTREZfV1JJVEFCTEUgfCBTREZfUkVBREFCTEUgfCBTREZfTFNBTVBMOworCXMtPm5fY2hhbiA9IHRoaXNib2FyZC0+ZW5jX2NoYW5zOworCXMtPnByaXZhdGUgPSBlbmNfcHJpdmF0ZV9kYXRhOworCXMtPmluc25fY29uZmlnID0gczYyNl9lbmNfaW5zbl9jb25maWc7CisJcy0+aW5zbl9yZWFkID0gczYyNl9lbmNfaW5zbl9yZWFkOworCXMtPmluc25fd3JpdGUgPSBzNjI2X2VuY19pbnNuX3dyaXRlOworCXMtPm1heGRhdGEgPSAweGZmZmZmZjsKKwlzLT5yYW5nZV90YWJsZSA9ICZyYW5nZV91bmtub3duOworCisJLy9zdG9wIGFpX2NvbW1hbmQKKwlkZXZwcml2LT5haV9jbWRfcnVubmluZyA9IDA7CisKKwlpZiAoZGV2cHJpdi0+YmFzZV9hZGRyICYmIChkZXZwcml2LT5hbGxvY2F0ZWRCdWYgPT0gMikpIHsKKwkJZG1hX2FkZHJfdCBwUGh5c0J1ZjsKKwkJdWludDE2X3QgY2hhbjsKKworCQkvLyBlbmFiIERFQkkgYW5kIGF1ZGlvIHBpbnMsIGVuYWJsZSBJMkMgaW50ZXJmYWNlLgorCQlNQ19FTkFCTEUoUF9NQzEsIE1DMV9ERUJJIHwgTUMxX0FVRElPIHwgTUMxX0kyQyk7CisJCS8vIENvbmZpZ3VyZSBERUJJIG9wZXJhdGluZyBtb2RlLgorCQlXUjcxNDYoUF9ERUJJQ0ZHLCBERUJJX0NGR19TTEFWRTE2CS8vIExvY2FsIGJ1cyBpcyAxNgorCQkJLy8gYml0cyB3aWRlLgorCQkJfCAoREVCSV9UT1VUIDw8IERFQklfQ0ZHX1RPVVRfQklUKQkvLyBEZWNsYXJlIERFQkkKKwkJCS8vIHRyYW5zZmVyIHRpbWVvdXQKKwkJCS8vIGludGVydmFsLgorCQkJfCBERUJJX1NXQVAJLy8gU2V0IHVwIGJ5dGUgbGFuZQorCQkJLy8gc3RlZXJpbmcuCisJCQl8IERFQklfQ0ZHX0lOVEVMKTsJLy8gSW50ZWwtY29tcGF0aWJsZQorCQkvLyBsb2NhbCBidXMgKERFQkkKKwkJLy8gbmV2ZXIgdGltZXMgb3V0KS4KKwkJREVCVUcoInM2MjZfYXR0YWNoOiAlZCBkZWJpIGluaXQgLS0gJWRcbiIsCisJCQlERUJJX0NGR19TTEFWRTE2IHwgKERFQklfVE9VVCA8PCBERUJJX0NGR19UT1VUX0JJVCkgfAorCQkJREVCSV9TV0FQIHwgREVCSV9DRkdfSU5URUwsCisJCQlERUJJX0NGR19JTlRFTCB8IERFQklfQ0ZHX1RPUSB8IERFQklfQ0ZHX0lOQ1EgfAorCQkJREVCSV9DRkdfMTZRKTsKKworCQkvL0RFQkkgSU5JVCBTNjI2IFdSNzE0NiggUF9ERUJJQ0ZHLCBERUJJX0NGR19JTlRFTCB8IERFQklfQ0ZHX1RPUQorCQkvL3wgREVCSV9DRkdfSU5DUXwgREVCSV9DRkdfMTZRKTsgLy9lbmQKKworCQkvLyBQYWdpbmcgaXMgZGlzYWJsZWQuCisJCVdSNzE0NihQX0RFQklQQUdFLCBERUJJX1BBR0VfRElTQUJMRSk7CS8vIERpc2FibGUgTU1VIHBhZ2luZy4KKworCQkvLyBJbml0IEdQSU8gc28gdGhhdCBBREMgU3RhcnQqIGlzIG5lZ2F0ZWQuCisJCVdSNzE0NihQX0dQSU8sIEdQSU9fQkFTRSB8IEdQSU8xX0hJKTsKKworCQkvL0lzQm9hcmRSZXZBIGlzIGEgYm9vbGVhbiB0aGF0IGluZGljYXRlcyB3aGV0aGVyIHRoZSBib2FyZCBpcworCQkvL1JldkEuCisKKwkJLy8gVkVSU0lPTiAyLjAxIENIQU5HRTogUkVWIEEgJiBCIEJPQVJEUyBOT1cgU1VQUE9SVEVEIEJZIERZTkFNSUMKKwkJLy8gRUVQUk9NIEFERFJFU1MgU0VMRUNUSU9OLiAgSW5pdGlhbGl6ZSB0aGUgSTJDIGludGVyZmFjZSwgd2hpY2gKKwkJLy8gaXMgdXNlZCB0byBhY2Nlc3MgdGhlIG9uYm9hcmQgc2VyaWFsIEVFUFJPTS4gIFRoZSBFRVBST00ncyBJMkMKKwkJLy8gRGV2aWNlQWRkcmVzcyBpcyBoYXJkd2lyZWQgdG8gYSB2YWx1ZSB0aGF0IGlzIGRlcGVuZGVudCBvbiB0aGUKKwkJLy8gNjI2IGJvYXJkIHJldmlzaW9uLiAgT24gYWxsIGJvYXJkIHJldmlzaW9ucywgdGhlIEVFUFJPTSBzdG9yZXMKKwkJLy8gVHJpbURBQyBjYWxpYnJhdGlvbiBjb25zdGFudHMgZm9yIGFuYWxvZyBJL08uICBPbiBSZXZCIGFuZAorCQkvLyBoaWdoZXIgYm9hcmRzLCB0aGUgRGV2aWNlQWRkcmVzcyBpcyBoYXJkd2lyZWQgdG8gMCB0byBlbmFibGUKKwkJLy8gdGhlIEVFUFJPTSB0byBhbHNvIHN0b3JlIHRoZSBQQ0kgU3ViVmVuZG9ySUQgYW5kIFN1YkRldmljZUlEOworCQkvLyB0aGlzIGlzIHRoZSBhZGRyZXNzIGF0IHdoaWNoIHRoZSBTQUE3MTQ2IGV4cGVjdHMgYQorCQkvLyBjb25maWd1cmF0aW9uIEVFUFJPTSB0byByZXNpZGUuICBPbiBSZXZBIGJvYXJkcywgdGhlIEVFUFJPTQorCQkvLyBkZXZpY2UgYWRkcmVzcywgd2hpY2ggaXMgaGFyZHdpcmVkIHRvIDQsIHByZXZlbnRzIHRoZSBTQUE3MTQ2CisJCS8vIGZyb20gcmV0cmlldmluZyBQQ0kgc3ViLUlEcywgc28gdGhlIFNBQTcxNDYgdXNlcyBpdHMgYnVpbHQtaW4KKwkJLy8gZGVmYXVsdCB2YWx1ZXMsIGluc3RlYWQuCisKKwkJLy8gICAgZGV2cHJpdi0+STJDYXJkcz0gSXNCb2FyZFJldkEgPyAweEE4IDogMHhBMDsgLy8gU2V0IEkyQyBFRVBST00KKwkJLy8gRGV2aWNlVHlwZSAoMHhBMCkKKwkJLy8gYW5kIERldmljZUFkZHJlc3M8PDEuCisKKwkJZGV2cHJpdi0+STJDQWRycyA9IDB4QTA7CS8vIEkyQyBkZXZpY2UgYWRkcmVzcyBmb3Igb25ib2FyZAorCQkvLyBlZXByb20ocmV2YikKKworCQkvLyBJc3N1ZSBhbiBJMkMgQUJPUlQgY29tbWFuZCB0byBoYWx0IGFueSBJMkMgb3BlcmF0aW9uIGluCisJCS8vcHJvZ3Jlc3MgYW5kIHJlc2V0IEJVU1kgZmxhZy4KKwkJV1I3MTQ2KFBfSTJDU1RBVCwgSTJDX0NMS1NFTCB8IEkyQ19BQk9SVCk7CS8vIFdyaXRlIEkyQyBjb250cm9sOgorCQkvLyBhYm9ydCBhbnkgSTJDCisJCS8vIGFjdGl2aXR5LgorCQlNQ19FTkFCTEUoUF9NQzIsIE1DMl9VUExEX0lJQyk7CS8vIEludm9rZSBjb21tYW5kCisJCS8vIHVwbG9hZAorCQl3aGlsZSAoKFJSNzE0NihQX01DMikgJiBNQzJfVVBMRF9JSUMpID09IDApIDsJLy8gYW5kIHdhaXQgZm9yCisJCS8vIHVwbG9hZCB0bworCQkvLyBjb21wbGV0ZS4KKworCQkvLyBQZXIgU0FBNzE0NiBkYXRhIHNoZWV0LCB3cml0ZSB0byBTVEFUVVMgcmVnIHR3aWNlIHRvIHJlc2V0IGFsbAorCQkvLyBJMkMgZXJyb3IgZmxhZ3MuCisJCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKwkJCVdSNzE0NihQX0kyQ1NUQVQsIEkyQ19DTEtTRUwpOwkvLyBXcml0ZSBJMkMgY29udHJvbDogcmVzZXQKKwkJCS8vIGVycm9yIGZsYWdzLgorCQkJTUNfRU5BQkxFKFBfTUMyLCBNQzJfVVBMRF9JSUMpOwkvLyBJbnZva2UgY29tbWFuZCB1cGxvYWQKKwkJCXdoaWxlICghTUNfVEVTVChQX01DMiwgTUMyX1VQTERfSUlDKSkgOwkvLyAgIGFuZCB3YWl0IGZvcgorCQkJLy8gICB1cGxvYWQgdG8KKwkJCS8vICAgY29tcGxldGUuCisJCX0KKworCQkvLyBJbml0IGF1ZGlvIGludGVyZmFjZSBmdW5jdGlvbmFsIGF0dHJpYnV0ZXM6IHNldCBEQUMvQURDIHNlcmlhbAorCQkvLyBjbG9jayByYXRlcywgaW52ZXJ0IERBQyBzZXJpYWwgY2xvY2sgc28gdGhhdCBEQUMgZGF0YSBzZXR1cAorCQkvLyB0aW1lcyBhcmUgc2F0aXNmaWVkLCBlbmFibGUgREFDIHNlcmlhbCBjbG9jayBvdXQuCisJCVdSNzE0NihQX0FDT04yLCBBQ09OMl9JTklUKTsKKworCQkvLyBTZXQgdXAgVFNMMSBzbG90IGxpc3QsIHdoaWNoIGlzIHVzZWQgdG8gY29udHJvbCB0aGUKKwkJLy8gYWNjdW11bGF0aW9uIG9mIEFEQyBkYXRhOiBSU0QxID0gc2hpZnQgZGF0YSBpbiBvbiBTRDEuICBTSUJfQTEKKwkJLy8gPSBzdG9yZSBkYXRhIHVpbnQ4X3QgYXQgbmV4dCBhdmFpbGFibGUgbG9jYXRpb24gaW4gRkIgQlVGRkVSMQorCQkvLyByZWdpc3Rlci4KKwkJV1I3MTQ2KFBfVFNMMSwgUlNEMSB8IFNJQl9BMSk7CS8vIEZldGNoIEFEQyBoaWdoIGRhdGEKKwkJLy8gdWludDhfdC4KKwkJV1I3MTQ2KFBfVFNMMSArIDQsIFJTRDEgfCBTSUJfQTEgfCBFT1MpOwkvLyBGZXRjaCBBREMgbG93IGRhdGEKKwkJLy8gdWludDhfdDsgZW5kIG9mCisJCS8vIFRTTDEuCisKKwkJLy8gZW5hYiBUU0wxIHNsb3QgbGlzdCBzbyB0aGF0IGl0IGV4ZWN1dGVzIGFsbCB0aGUgdGltZS4KKwkJV1I3MTQ2KFBfQUNPTjEsIEFDT04xX0FEQ1NUQVJUKTsKKworCQkvLyBJbml0aWFsaXplIFJQUyByZWdpc3RlcnMgdXNlZCBmb3IgQURDLgorCisJCS8vUGh5c2ljYWwgc3RhcnQgb2YgUlBTIHByb2dyYW0uCisJCVdSNzE0NihQX1JQU0FERFIxLCAodWludDMyX3QpIGRldnByaXYtPlJQU0J1Zi5QaHlzaWNhbEJhc2UpOworCisJCVdSNzE0NihQX1JQU1BBR0UxLCAwKTsJLy8gUlBTIHByb2dyYW0gcGVyZm9ybXMgbm8KKwkJLy8gZXhwbGljaXQgbWVtIHdyaXRlcy4KKwkJV1I3MTQ2KFBfUlBTMV9UT1VULCAwKTsJLy8gRGlzYWJsZSBSUFMgdGltZW91dHMuCisKKwkJLy8gU0FBNzE0NiBCVUcgV09SS0FST1VORC4gIEluaXRpYWxpemUgU0FBNzE0NiBBREMgaW50ZXJmYWNlIHRvIGEKKwkJLy8ga25vd24gc3RhdGUgYnkgaW52b2tpbmcgQURDcyB1bnRpbCBGQiBCVUZGRVIgMSByZWdpc3RlciBzaG93cworCQkvLyB0aGF0IGl0IGlzIGNvcnJlY3RseSByZWNlaXZpbmcgQURDIGRhdGEuICBUaGlzIGlzIG5lY2Vzc2FyeQorCQkvLyBiZWNhdXNlIHRoZSBTQUE3MTQ2IEFEQyBpbnRlcmZhY2UgZG9lcyBub3Qgc3RhcnQgdXAgaW4gYQorCQkvLyBkZWZpbmVkIHN0YXRlIGFmdGVyIGEgUENJIHJlc2V0LgorCisvKiAgICAgUG9sbExpc3QgPSBFT1BMOwkJCS8vIENyZWF0ZSBhIHNpbXBsZSBwb2xsaW5nICovCisvKiAJCQkJCS8vIGxpc3QgZm9yIGFuYWxvZyBpbnB1dCAqLworLyogCQkJCQkvLyBjaGFubmVsIDAuICovCisvKiAgICAgUmVzZXRBREMoIGRldiwgJlBvbGxMaXN0ICk7ICovCisKKy8qICAgICBzNjI2X2FpX3JpbnNuKGRldixkZXYtPnN1YmRldmljZXMsTlVMTCxkYXRhKTsgLy8oICZBZGNEYXRhICk7IC8vICovCisvKiAJCQkJCQkgIC8vR2V0IGluaXRpYWwgQURDICovCisvKiAJCQkJCQkgIC8vdmFsdWUuICovCisKKy8qICAgICBTdGFydFZhbCA9IGRhdGFbMF07ICovCisKKy8qICAgICAvLyBWRVJTSU9OIDIuMDEgQ0hBTkdFOiBUSU1FT1VUIEFEREVEIFRPIFBSRVZFTlQgSEFOR0VEIEVYRUNVVElPTi4gKi8KKy8qICAgICAvLyBJbnZva2UgQURDcyB1bnRpbCB0aGUgbmV3IEFEQyB2YWx1ZSBkaWZmZXJzIGZyb20gdGhlIGluaXRpYWwgKi8KKy8qICAgICAvLyB2YWx1ZSBvciBhIHRpbWVvdXQgb2NjdXJzLiAgVGhlIHRpbWVvdXQgcHJvdGVjdHMgYWdhaW5zdCB0aGUgKi8KKy8qICAgICAvLyBwb3NzaWJpbGl0eSB0aGF0IHRoZSBkcml2ZXIgaXMgcmVzdGFydGluZyBhbmQgdGhlIEFEQyBkYXRhIGlzIGEgKi8KKy8qICAgICAvLyBmaXhlZCB2YWx1ZSByZXN1bHRpbmcgZnJvbSB0aGUgYXBwbGllZCBBREMgYW5hbG9nIGlucHV0IGJlaW5nICovCisvKiAgICAgLy8gdW51c3VhbGx5IHF1aWV0IG9yIGF0IHRoZSByYWlsLiAqLworCisvKiAgICAgZm9yICggaW5kZXggPSAwOyBpbmRleCA8IDUwMDsgaW5kZXgrKyApICovCisvKiAgICAgICB7ICovCisvKiAJczYyNl9haV9yaW5zbihkZXYsZGV2LT5zdWJkZXZpY2VzLE5VTEwsZGF0YSk7ICovCisvKiAJQWRjRGF0YSA9IGRhdGFbMF07CS8vUmVhZEFEQyggICZBZGNEYXRhICk7ICovCisvKiAJaWYgKCBBZGNEYXRhICE9IFN0YXJ0VmFsICkgKi8KKy8qIAkgIGJyZWFrOyAqLworLyogICAgICAgfSAqLworCisJCS8vIGVuZCBpbml0QURDCisKKwkJLy8gaW5pdCB0aGUgREFDIGludGVyZmFjZQorCisJCS8vIEluaXQgQXVkaW8yJ3Mgb3V0cHV0IERNQUMgYXR0cmlidXRlczogYnVyc3QgbGVuZ3RoID0gMSBEV09SRCwKKwkJLy8gdGhyZXNob2xkID0gMSBEV09SRC4KKwkJV1I3MTQ2KFBfUENJX0JUX0EsIDApOworCisJCS8vIEluaXQgQXVkaW8yJ3Mgb3V0cHV0IERNQSBwaHlzaWNhbCBhZGRyZXNzZXMuICBUaGUgcHJvdGVjdGlvbgorCQkvLyBhZGRyZXNzIGlzIHNldCB0byAxIERXT1JEIHBhc3QgdGhlIGJhc2UgYWRkcmVzcyBzbyB0aGF0IGEKKwkJLy8gc2luZ2xlIERXT1JEIHdpbGwgYmUgdHJhbnNmZXJyZWQgZWFjaCB0aW1lIGEgRE1BIHRyYW5zZmVyIGlzCisJCS8vIGVuYWJsZWQuCisKKwkJcFBoeXNCdWYgPQorCQkJZGV2cHJpdi0+QU5BQnVmLlBoeXNpY2FsQmFzZSArCisJCQkoREFDX1dETUFCVUZfT1MgKiBzaXplb2YodWludDMyX3QpKTsKKworCQlXUjcxNDYoUF9CQVNFQTJfT1VULCAodWludDMyX3QpIHBQaHlzQnVmKTsJLy8gQnVmZmVyIGJhc2UgYWRycy4KKwkJV1I3MTQ2KFBfUFJPVEEyX09VVCwgKHVpbnQzMl90KSAocFBoeXNCdWYgKyBzaXplb2YodWludDMyX3QpKSk7CS8vIFByb3RlY3Rpb24gYWRkcmVzcy4KKworCQkvLyBDYWNoZSBBdWRpbzIncyBvdXRwdXQgRE1BIGJ1ZmZlciBsb2dpY2FsIGFkZHJlc3MuICBUaGlzIGlzCisJCS8vIHdoZXJlIERBQyBkYXRhIGlzIGJ1ZmZlcmVkIGZvciBBMiBvdXRwdXQgRE1BIHRyYW5zZmVycy4KKwkJZGV2cHJpdi0+cERhY1dCdWYgPQorCQkJKHVpbnQzMl90ICopIGRldnByaXYtPkFOQUJ1Zi5Mb2dpY2FsQmFzZSArCisJCQlEQUNfV0RNQUJVRl9PUzsKKworCQkvLyBBdWRpbzIncyBvdXRwdXQgY2hhbm5lbHMgZG9lcyBub3QgdXNlIHBhZ2luZy4gIFRoZSBwcm90ZWN0aW9uCisJCS8vIHZpb2xhdGlvbiBoYW5kbGluZyBiaXQgaXMgc2V0IHNvIHRoYXQgdGhlIERNQUMgd2lsbAorCQkvLyBhdXRvbWF0aWNhbGx5IGhhbHQgYW5kIGl0cyBQQ0kgYWRkcmVzcyBwb2ludGVyIHdpbGwgYmUgcmVzZXQKKwkJLy8gd2hlbiB0aGUgcHJvdGVjdGlvbiBhZGRyZXNzIGlzIHJlYWNoZWQuCisJCVdSNzE0NihQX1BBR0VBMl9PVVQsIDgpOworCisJCS8vIEluaXRpYWxpemUgdGltZSBzbG90IGxpc3QgMiAoVFNMMiksIHdoaWNoIGlzIHVzZWQgdG8gY29udHJvbAorCQkvLyB0aGUgY2xvY2sgZ2VuZXJhdGlvbiBmb3IgYW5kIHNlcmlhbGl6YXRpb24gb2YgZGF0YSB0byBiZSBzZW50CisJCS8vIHRvIHRoZSBEQUMgZGV2aWNlcy4gIFNsb3QgMCBpcyBhIE5PUCB0aGF0IGlzIHVzZWQgdG8gdHJhcCBUU0wKKwkJLy8gZXhlY3V0aW9uOyB0aGlzIHBlcm1pdHMgb3RoZXIgc2xvdHMgdG8gYmUgc2FmZWx5IG1vZGlmaWVkCisJCS8vIHdpdGhvdXQgZmlyc3QgdHVybmluZyBvZmYgdGhlIFRTTCBzZXF1ZW5jZXIgKHdoaWNoIGlzCisJCS8vIGFwcGFyZW50bHkgaW1wb3NzaWJsZSB0byBkbykuICBBbHNvLCBTRDMgKHdoaWNoIGlzIGRyaXZlbiBieSBhCisJCS8vIHB1bGwtdXAgcmVzaXN0b3IpIGlzIHNoaWZ0ZWQgaW4gYW5kIHN0b3JlZCB0byB0aGUgTVNCIG9mCisJCS8vIEZCX0JVRkZFUjIgdG8gYmUgdXNlZCBhcyBldmlkZW5jZSB0aGF0IHRoZSBzbG90IHNlcXVlbmNlIGhhcworCQkvLyBub3QgeWV0IGZpbmlzaGVkIGV4ZWN1dGluZy4KKwkJU0VUVkVDVCgwLCBYU0QyIHwgUlNEMyB8IFNJQl9BMiB8IEVPUyk7CS8vIFNsb3QgMDogVHJhcCBUU0wKKwkJLy8gZXhlY3V0aW9uLCBzaGlmdCAweEZGCisJCS8vIGludG8gRkJfQlVGRkVSMi4KKworCQkvLyBJbml0aWFsaXplIHNsb3QgMSwgd2hpY2ggaXMgY29uc3RhbnQuICBTbG90IDEgY2F1c2VzIGEgRFdPUkQgdG8KKwkJLy8gYmUgdHJhbnNmZXJyZWQgZnJvbSBhdWRpbyBjaGFubmVsIDIncyBvdXRwdXQgRklGTyB0byB0aGUgRklGTydzCisJCS8vIG91dHB1dCBidWZmZXIgc28gdGhhdCBpdCBjYW4gYmUgc2VyaWFsaXplZCBhbmQgc2VudCB0byB0aGUgREFDCisJCS8vIGR1cmluZyBzdWJzZXF1ZW50IHNsb3RzLiAgQWxsIHJlbWFpbmluZyBzbG90cyBhcmUgZHluYW1pY2FsbHkKKwkJLy8gcG9wdWxhdGVkIGFzIHJlcXVpcmVkIGJ5IHRoZSB0YXJnZXQgREFDIGRldmljZS4KKwkJU0VUVkVDVCgxLCBMRl9BMik7CS8vIFNsb3QgMTogRmV0Y2ggRFdPUkQgZnJvbSBBdWRpbzIncworCQkvLyBvdXRwdXQgRklGTy4KKworCQkvLyBTdGFydCBEQUMncyBhdWRpbyBpbnRlcmZhY2UgKFRTTDIpIHJ1bm5pbmcuCisJCVdSNzE0NihQX0FDT04xLCBBQ09OMV9EQUNTVEFSVCk7CisKKwkJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCQkvLyBlbmQgaW5pdCBEQUMgaW50ZXJmYWNlCisKKwkJLy8gSW5pdCBUcmltIERBQ3MgdG8gY2FsaWJyYXRlZCB2YWx1ZXMuICBEbyBpdCB0d2ljZSBiZWNhdXNlIHRoZQorCQkvLyBTQUE3MTQ2IGF1ZGlvIGNoYW5uZWwgZG9lcyBub3QgYWx3YXlzIHJlc2V0IHByb3Blcmx5IGFuZAorCQkvLyBzb21ldGltZXMgY2F1c2VzIHRoZSBmaXJzdCBmZXcgVHJpbURBQyB3cml0ZXMgdG8gbWFsZnVuY3Rpb24uCisKKwkJTG9hZFRyaW1EQUNzKGRldik7CisJCUxvYWRUcmltREFDcyhkZXYpOwkvLyBJbnN1cmFuY2UuCisKKwkJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJCS8vIE1hbnVhbGx5IGluaXQgYWxsIGdhdGUgYXJyYXkgaGFyZHdhcmUgaW4gY2FzZSB0aGlzIGlzIGEgc29mdAorCQkvLyByZXNldCAod2UgaGF2ZSBubyB3YXkgb2YgZGV0ZXJtaW5pbmcgd2hldGhlciB0aGlzIGlzIGEgd2FybSBvcgorCQkvLyBjb2xkIHN0YXJ0KS4gIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2UgdGhlIGdhdGUgYXJyYXkgd2lsbAorCQkvLyByZXNldCBvbmx5IGluIHJlc3BvbnNlIHRvIGEgUENJIGhhcmQgcmVzZXQ7IHRoZXJlIGlzIG5vIHNvZnQKKwkJLy8gcmVzZXQgZnVuY3Rpb24uCisKKwkJLy8gSW5pdCBhbGwgREFDIG91dHB1dHMgdG8gMFYgYW5kIGluaXQgYWxsIERBQyBzZXRwb2ludCBhbmQKKwkJLy8gcG9sYXJpdHkgaW1hZ2VzLgorCQlmb3IgKGNoYW4gPSAwOyBjaGFuIDwgUzYyNl9EQUNfQ0hBTk5FTFM7IGNoYW4rKykKKwkJCVNldERBQyhkZXYsIGNoYW4sIDApOworCisJCS8vIEluaXQgaW1hZ2Ugb2YgV1JNSVNDMiBCYXR0ZXJ5IENoYXJnZXIgRW5hYmxlZCBjb250cm9sIGJpdC4KKwkJLy8gVGhpcyBpbWFnZSBpcyB1c2VkIHdoZW4gdGhlIHN0YXRlIG9mIHRoZSBjaGFyZ2VyIGNvbnRyb2wgYml0LAorCQkvLyB3aGljaCBoYXMgbm8gZGlyZWN0IGhhcmR3YXJlIHJlYWRiYWNrIG1lY2hhbmlzbSwgaXMgcXVlcmllZC4KKwkJZGV2cHJpdi0+Q2hhcmdlRW5hYmxlZCA9IDA7CisKKwkJLy8gSW5pdCBpbWFnZSBvZiB3YXRjaGRvZyB0aW1lciBpbnRlcnZhbCBpbiBXUk1JU0MyLiAgVGhpcyBpbWFnZQorCQkvLyBtYWludGFpbnMgdGhlIHZhbHVlIG9mIHRoZSBjb250cm9sIGJpdHMgb2YgTUlTQzIgYXJlCisJCS8vIGNvbnRpbnVvdXNseSByZXNldCB0byB6ZXJvIGFzIGxvbmcgYXMgdGhlIFdEIHRpbWVyIGlzIGRpc2FibGVkLgorCQlkZXZwcml2LT5XREludGVydmFsID0gMDsKKworCQkvLyBJbml0IENvdW50ZXIgSW50ZXJydXB0IGVuYWIgbWFzayBmb3IgUkRNSVNDMi4gIFRoaXMgbWFzayBpcworCQkvLyBhcHBsaWVkIGFnYWluc3QgTUlTQzIgd2hlbiB0ZXN0aW5nIHRvIGRldGVybWluZSB3aGljaCB0aW1lcgorCQkvLyBldmVudHMgYXJlIHJlcXVlc3RpbmcgaW50ZXJydXB0IHNlcnZpY2UuCisJCWRldnByaXYtPkNvdW50ZXJJbnRFbmFicyA9IDA7CisKKwkJLy8gSW5pdCBjb3VudGVycy4KKwkJQ291bnRlcnNJbml0KGRldik7CisKKwkJLy8gV2l0aG91dCBtb2RpZnlpbmcgdGhlIHN0YXRlIG9mIHRoZSBCYXR0ZXJ5IEJhY2t1cCBlbmFiLCBkaXNhYmxlCisJCS8vIHRoZSB3YXRjaGRvZyB0aW1lciwgc2V0IERJTyBjaGFubmVscyAwLTUgdG8gb3BlcmF0ZSBpbiB0aGUKKwkJLy8gc3RhbmRhcmQgRElPICh2cy4gY291bnRlciBvdmVyZmxvdykgbW9kZSwgZGlzYWJsZSB0aGUgYmF0dGVyeQorCQkvLyBjaGFyZ2VyLCBhbmQgcmVzZXQgdGhlIHdhdGNoZG9nIGludGVydmFsIHNlbGVjdG9yIHRvIHplcm8uCisJCVdyaXRlTUlTQzIoZGV2LCAodWludDE2X3QpIChERUJJcmVhZChkZXYsCisJCQkJCUxQX1JETUlTQzIpICYgTUlTQzJfQkFUVF9FTkFCTEUpKTsKKworCQkvLyBJbml0aWFsaXplIHRoZSBkaWdpdGFsIEkvTyBzdWJzeXN0ZW0uCisJCXM2MjZfZGlvX2luaXQoZGV2KTsKKworCQkvL2VuYWJsZSBpbnRlcnJ1cHQgdGVzdAorCQkvLyB3cml0ZWwoSVJRX0dQSU8zIHwgSVJRX1JQUzEsZGV2cHJpdi0+YmFzZV9hZGRyK1BfSUVSKTsKKwl9CisKKwlERUJVRygiczYyNl9hdHRhY2g6IGNvbWVkaSVkIHM2MjYgYXR0YWNoZWQgJTA0eFxuIiwgZGV2LT5taW5vciwKKwkJKHVpbnQzMl90KSBkZXZwcml2LT5iYXNlX2FkZHIpOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBsc2FtcGxfdCBzNjI2X2FpX3JlZ190b191aW50KGludCBkYXRhKQoreworCWxzYW1wbF90IHRlbXBkYXRhOworCisJdGVtcGRhdGEgPSAoZGF0YSA+PiAxOCk7CisJaWYgKHRlbXBkYXRhICYgMHgyMDAwKQorCQl0ZW1wZGF0YSAmPSAweDFmZmY7CisJZWxzZQorCQl0ZW1wZGF0YSArPSAoMSA8PCAxMyk7CisKKwlyZXR1cm4gdGVtcGRhdGE7Cit9CisKKy8qIHN0YXRpYyBsc2FtcGxfdCBzNjI2X3VpbnRfdG9fcmVnKGNvbWVkaV9zdWJkZXZpY2UgKnMsIGludCBkYXRhKXsgKi8KKy8qICAgcmV0dXJuIDA7ICovCisvKiB9ICovCisKK3N0YXRpYyBpcnFyZXR1cm5fdCBzNjI2X2lycV9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmQgUFRfUkVHU19BUkcpCit7CisJY29tZWRpX2RldmljZSAqZGV2ID0gZDsKKwljb21lZGlfc3ViZGV2aWNlICpzOworCWNvbWVkaV9jbWQgKmNtZDsKKwllbmNfcHJpdmF0ZSAqazsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludDMyX3QgKnJlYWRhZGRyOworCXVpbnQzMl90IGlycXR5cGUsIGlycXN0YXR1czsKKwlpbnQgaSA9IDA7CisJc2FtcGxfdCB0ZW1wZGF0YTsKKwl1aW50OF90IGdyb3VwOworCXVpbnQxNl90IGlycWJpdDsKKworCURFQlVHKCJzNjI2X2lycV9oYW5kbGVyOiBpbnRlcnJ1cHQgcmVxdWVzdCByZWNpZXZlZCEhIVxuIik7CisKKwlpZiAoZGV2LT5hdHRhY2hlZCA9PSAwKQorCQlyZXR1cm4gSVJRX05PTkU7CisJLy8gbG9jayB0byBhdm9pZCByYWNlIHdpdGggY29tZWRpX3BvbGwKKwljb21lZGlfc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+c3BpbmxvY2ssIGZsYWdzKTsKKworCS8vc2F2ZSBpbnRlcnJ1cHQgZW5hYmxlIHJlZ2lzdGVyIHN0YXRlCisJaXJxc3RhdHVzID0gcmVhZGwoZGV2cHJpdi0+YmFzZV9hZGRyICsgUF9JRVIpOworCisJLy9yZWFkIGludGVycnVwdCB0eXBlCisJaXJxdHlwZSA9IHJlYWRsKGRldnByaXYtPmJhc2VfYWRkciArIFBfSVNSKTsKKworCS8vZGlzYWJsZSBtYXN0ZXIgaW50ZXJydXB0CisJd3JpdGVsKDAsIGRldnByaXYtPmJhc2VfYWRkciArIFBfSUVSKTsKKworCS8vY2xlYXIgaW50ZXJydXB0CisJd3JpdGVsKGlycXR5cGUsIGRldnByaXYtPmJhc2VfYWRkciArIFBfSVNSKTsKKworCS8vZG8gc29tZXRoaW5ncworCURFQlVHKCJzNjI2X2lycV9oYW5kbGVyOiBpbnRlcnJ1cHQgdHlwZSAlZFxuIiwgaXJxdHlwZSk7CisKKwlzd2l0Y2ggKGlycXR5cGUpIHsKKwljYXNlIElSUV9SUFMxOgkJLy8gZW5kX29mX3NjYW4gb2NjdXJzCisKKwkJREVCVUcoInM2MjZfaXJxX2hhbmRsZXI6IFJQUzEgaXJxIGRldGVjdGVkXG4iKTsKKworCQkvLyBtYW5hZ2UgYWkgc3ViZGV2aWNlCisJCXMgPSBkZXYtPnN1YmRldmljZXM7CisJCWNtZCA9ICYocy0+YXN5bmMtPmNtZCk7CisKKwkJLy8gSW5pdCBwdHIgdG8gRE1BIGJ1ZmZlciB0aGF0IGhvbGRzIG5ldyBBREMgZGF0YS4gIFdlIHNraXAgdGhlCisJCS8vIGZpcnN0IHVpbnQxNl90IGluIHRoZSBidWZmZXIgYmVjYXVzZSBpdCBjb250YWlucyBqdW5rIGRhdGEgZnJvbQorCQkvLyB0aGUgZmluYWwgQURDIG9mIHRoZSBwcmV2aW91cyBwb2xsIGxpc3Qgc2Nhbi4KKwkJcmVhZGFkZHIgPSAoaW50MzJfdCAqKSBkZXZwcml2LT5BTkFCdWYuTG9naWNhbEJhc2UgKyAxOworCisJCS8vIGdldCB0aGUgZGF0YSBhbmQgaGFuZCBpdCBvdmVyIHRvIGNvbWVkaQorCQlmb3IgKGkgPSAwOyBpIDwgKHMtPmFzeW5jLT5jbWQuY2hhbmxpc3RfbGVuKTsgaSsrKSB7CisJCQkvLyBDb252ZXJ0IEFEQyBkYXRhIHRvIDE2LWJpdCBpbnRlZ2VyIHZhbHVlcyBhbmQgY29weSB0byBhcHBsaWNhdGlvbgorCQkJLy8gYnVmZmVyLgorCQkJdGVtcGRhdGEgPSBzNjI2X2FpX3JlZ190b191aW50KChpbnQpKnJlYWRhZGRyKTsKKwkJCXJlYWRhZGRyKys7CisKKwkJCS8vcHV0IGRhdGEgaW50byByZWFkIGJ1ZmZlcgorCQkJLy8gY29tZWRpX2J1Zl9wdXQocy0+YXN5bmMsIHRlbXBkYXRhKTsKKwkJCWlmIChjZmNfd3JpdGVfdG9fYnVmZmVyKHMsIHRlbXBkYXRhKSA9PSAwKQorCQkJCXByaW50aygiczYyNl9pcnFfaGFuZGxlcjogY2ZjX3dyaXRlX3RvX2J1ZmZlciBlcnJvciFcbiIpOworCisJCQlERUJVRygiczYyNl9pcnFfaGFuZGxlcjogYWkgY2hhbm5lbCAlZCBhY3F1aXJlZDogJWRcbiIsCisJCQkJaSwgdGVtcGRhdGEpOworCQl9CisKKwkJLy9lbmQgb2Ygc2NhbiBvY2N1cnMKKwkJcy0+YXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRU9TOworCisJCWlmICghKGRldnByaXYtPmFpX2NvbnRpbm91cykpCisJCQlkZXZwcml2LT5haV9zYW1wbGVfY291bnQtLTsKKwkJaWYgKGRldnByaXYtPmFpX3NhbXBsZV9jb3VudCA8PSAwKSB7CisJCQlkZXZwcml2LT5haV9jbWRfcnVubmluZyA9IDA7CisKKwkJCS8vIFN0b3AgUlBTIHByb2dyYW0uCisJCQlNQ19ESVNBQkxFKFBfTUMxLCBNQzFfRVJQUzEpOworCisJCQkvL3NlbmQgZW5kIG9mIGFjcXVpc2l0aW9uCisJCQlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FT0E7CisKKwkJCS8vZGlzYWJsZSBtYXN0ZXIgaW50ZXJydXB0CisJCQlpcnFzdGF0dXMgPSAwOworCQl9CisKKwkJaWYgKGRldnByaXYtPmFpX2NtZF9ydW5uaW5nICYmIGNtZC0+c2Nhbl9iZWdpbl9zcmMgPT0gVFJJR19FWFQpIHsKKwkJCURFQlVHKCJzNjI2X2lycV9oYW5kbGVyOiBlbmFibGUgaW50ZXJydXB0IG9uIGRpbyBjaGFubmVsICVkXG4iLCBjbWQtPnNjYW5fYmVnaW5fYXJnKTsKKworCQkJczYyNl9kaW9fc2V0X2lycShkZXYsIGNtZC0+c2Nhbl9iZWdpbl9hcmcpOworCisJCQlERUJVRygiczYyNl9pcnFfaGFuZGxlcjogRXh0ZXJuYWwgdHJpZ2dlciBpcyBzZXQhISFcbiIpOworCQl9CisJCS8vIHRlbGwgY29tZWRpIHRoYXQgZGF0YSBpcyB0aGVyZQorCQlERUJVRygiczYyNl9pcnFfaGFuZGxlcjogZXZlbnRzICVkXG4iLCBzLT5hc3luYy0+ZXZlbnRzKTsKKwkJY29tZWRpX2V2ZW50KGRldiwgcyk7CisJCWJyZWFrOworCWNhc2UgSVJRX0dQSU8zOgkvL2NoZWNrIGRpbyBhbmQgY29udGVyIGludGVycnVwdAorCisJCURFQlVHKCJzNjI2X2lycV9oYW5kbGVyOiBHUElPMyBpcnEgZGV0ZWN0ZWRcbiIpOworCisJCS8vIG1hbmFnZSBhaSBzdWJkZXZpY2UKKwkJcyA9IGRldi0+c3ViZGV2aWNlczsKKwkJY21kID0gJihzLT5hc3luYy0+Y21kKTsKKworCQkvL3M2MjZfZGlvX2NsZWFyX2lycShkZXYpOworCisJCWZvciAoZ3JvdXAgPSAwOyBncm91cCA8IFM2MjZfRElPX0JBTktTOyBncm91cCsrKSB7CisJCQlpcnFiaXQgPSAwOworCQkJLy9yZWFkIGludGVycnVwdCB0eXBlCisJCQlpcnFiaXQgPSBERUJJcmVhZChkZXYsCisJCQkJKChkaW9fcHJpdmF0ZSAqKSAoZGV2LT5zdWJkZXZpY2VzICsgMiArCisJCQkJCQlncm91cCktPnByaXZhdGUpLT5SRENhcEZsZyk7CisKKwkJCS8vY2hlY2sgaWYgaW50ZXJydXB0IGlzIGdlbmVyYXRlZCBmcm9tIGRpbyBjaGFubmVscworCQkJaWYgKGlycWJpdCkgeworCQkJCXM2MjZfZGlvX3Jlc2V0X2lycShkZXYsIGdyb3VwLCBpcnFiaXQpOworCQkJCURFQlVHKCJzNjI2X2lycV9oYW5kbGVyOiBjaGVjayBpbnRlcnJ1cHQgb24gZGlvIGdyb3VwICVkICVkXG4iLCBncm91cCwgaSk7CisJCQkJaWYgKGRldnByaXYtPmFpX2NtZF9ydW5uaW5nKSB7CisJCQkJCS8vY2hlY2sgaWYgaW50ZXJydXB0IGlzIGFuIGFpIGFjcXVpc2l0aW9uIHN0YXJ0IHRyaWdnZXIKKwkJCQkJaWYgKChpcnFiaXQgPj4gKGNtZC0+c3RhcnRfYXJnIC0KKwkJCQkJCQkJKDE2ICogZ3JvdXApKSkKKwkJCQkJCT09IDEKKwkJCQkJCSYmIGNtZC0+c3RhcnRfc3JjID09IFRSSUdfRVhUKSB7CisJCQkJCQlERUJVRygiczYyNl9pcnFfaGFuZGxlcjogRWRnZSBjYXB0dXJlIGludGVycnVwdCByZWNpZXZlZCBmcm9tIGNoYW5uZWwgJWRcbiIsIGNtZC0+c3RhcnRfYXJnKTsKKworCQkJCQkJLy8gU3RhcnQgZXhlY3V0aW5nIHRoZSBSUFMgcHJvZ3JhbS4KKwkJCQkJCU1DX0VOQUJMRShQX01DMSwgTUMxX0VSUFMxKTsKKworCQkJCQkJREVCVUcoInM2MjZfaXJxX2hhbmRsZXI6IGFxdWlzaXRpb24gc3RhcnQgdHJpZ2dlcmVkISEhXG4iKTsKKworCQkJCQkJaWYgKGNtZC0+c2Nhbl9iZWdpbl9zcmMgPT0KKwkJCQkJCQlUUklHX0VYVCkgeworCQkJCQkJCURFQlVHKCJzNjI2X2FpX2NtZDogZW5hYmxlIGludGVycnVwdCBvbiBkaW8gY2hhbm5lbCAlZFxuIiwgY21kLT5zY2FuX2JlZ2luX2FyZyk7CisKKwkJCQkJCQlzNjI2X2Rpb19zZXRfaXJxKGRldiwKKwkJCQkJCQkJY21kLT4KKwkJCQkJCQkJc2Nhbl9iZWdpbl9hcmcpOworCisJCQkJCQkJREVCVUcoInM2MjZfaXJxX2hhbmRsZXI6IEV4dGVybmFsIHNjYW4gdHJpZ2dlciBpcyBzZXQhISFcbiIpOworCQkJCQkJfQorCQkJCQl9CisJCQkJCWlmICgoaXJxYml0ID4+IChjbWQtPnNjYW5fYmVnaW5fYXJnIC0KKwkJCQkJCQkJKDE2ICogZ3JvdXApKSkKKwkJCQkJCT09IDEKKwkJCQkJCSYmIGNtZC0+c2Nhbl9iZWdpbl9zcmMgPT0KKwkJCQkJCVRSSUdfRVhUKSB7CisJCQkJCQlERUJVRygiczYyNl9pcnFfaGFuZGxlcjogRWRnZSBjYXB0dXJlIGludGVycnVwdCByZWNpZXZlZCBmcm9tIGNoYW5uZWwgJWRcbiIsIGNtZC0+c2Nhbl9iZWdpbl9hcmcpOworCisJCQkJCQkvLyBUcmlnZ2VyIEFEQyBzY2FuIGxvb3Agc3RhcnQgYnkgc2V0dGluZyBSUFMgU2lnbmFsIDAuCisJCQkJCQlNQ19FTkFCTEUoUF9NQzIsIE1DMl9BRENfUlBTKTsKKworCQkJCQkJREVCVUcoInM2MjZfaXJxX2hhbmRsZXI6IHNjYW4gdHJpZ2dlcmVkISEhICVkXG4iLCBkZXZwcml2LT5haV9zYW1wbGVfY291bnQpOworCQkJCQkJaWYgKGNtZC0+Y29udmVydF9zcmMgPT0KKwkJCQkJCQlUUklHX0VYVCkgeworCisJCQkJCQkJREVCVUcoInM2MjZfYWlfY21kOiBlbmFibGUgaW50ZXJydXB0IG9uIGRpbyBjaGFubmVsICVkIGdyb3VwICVkXG4iLCBjbWQtPmNvbnZlcnRfYXJnIC0gKDE2ICogZ3JvdXApLCBncm91cCk7CisKKwkJCQkJCQlkZXZwcml2LT4KKwkJCQkJCQkJYWlfY29udmVydF9jb3VudAorCQkJCQkJCQk9CisJCQkJCQkJCWNtZC0+CisJCQkJCQkJCWNoYW5saXN0X2xlbjsKKworCQkJCQkJCXM2MjZfZGlvX3NldF9pcnEoZGV2LAorCQkJCQkJCQljbWQtPgorCQkJCQkJCQljb252ZXJ0X2FyZyk7CisKKwkJCQkJCQlERUJVRygiczYyNl9pcnFfaGFuZGxlcjogRXh0ZXJuYWwgY29udmVydCB0cmlnZ2VyIGlzIHNldCEhIVxuIik7CisJCQkJCQl9CisKKwkJCQkJCWlmIChjbWQtPmNvbnZlcnRfc3JjID09CisJCQkJCQkJVFJJR19USU1FUikgeworCQkJCQkJCWsgPSAmZW5jcHJpdls1XTsKKwkJCQkJCQlkZXZwcml2LT4KKwkJCQkJCQkJYWlfY29udmVydF9jb3VudAorCQkJCQkJCQk9CisJCQkJCQkJCWNtZC0+CisJCQkJCQkJCWNoYW5saXN0X2xlbjsKKwkJCQkJCQlrLT5TZXRFbmFibGUoZGV2LCBrLAorCQkJCQkJCQlDTEtFTkFCX0FMV0FZUyk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJaWYgKChpcnFiaXQgPj4gKGNtZC0+Y29udmVydF9hcmcgLQorCQkJCQkJCQkoMTYgKiBncm91cCkpKQorCQkJCQkJPT0gMQorCQkJCQkJJiYgY21kLT5jb252ZXJ0X3NyYyA9PQorCQkJCQkJVFJJR19FWFQpIHsKKwkJCQkJCURFQlVHKCJzNjI2X2lycV9oYW5kbGVyOiBFZGdlIGNhcHR1cmUgaW50ZXJydXB0IHJlY2lldmVkIGZyb20gY2hhbm5lbCAlZFxuIiwgY21kLT5jb252ZXJ0X2FyZyk7CisKKwkJCQkJCS8vIFRyaWdnZXIgQURDIHNjYW4gbG9vcCBzdGFydCBieSBzZXR0aW5nIFJQUyBTaWduYWwgMC4KKwkJCQkJCU1DX0VOQUJMRShQX01DMiwgTUMyX0FEQ19SUFMpOworCisJCQkJCQlERUJVRygiczYyNl9pcnFfaGFuZGxlcjogYWRjIGNvbnZlcnQgdHJpZ2dlcmVkISEhXG4iKTsKKworCQkJCQkJZGV2cHJpdi0+YWlfY29udmVydF9jb3VudC0tOworCisJCQkJCQlpZiAoZGV2cHJpdi0+YWlfY29udmVydF9jb3VudCA+CisJCQkJCQkJMCkgeworCisJCQkJCQkJREVCVUcoInM2MjZfYWlfY21kOiBlbmFibGUgaW50ZXJydXB0IG9uIGRpbyBjaGFubmVsICVkIGdyb3VwICVkXG4iLCBjbWQtPmNvbnZlcnRfYXJnIC0gKDE2ICogZ3JvdXApLCBncm91cCk7CisKKwkJCQkJCQlzNjI2X2Rpb19zZXRfaXJxKGRldiwKKwkJCQkJCQkJY21kLT4KKwkJCQkJCQkJY29udmVydF9hcmcpOworCisJCQkJCQkJREVCVUcoInM2MjZfaXJxX2hhbmRsZXI6IEV4dGVybmFsIHRyaWdnZXIgaXMgc2V0ISEhXG4iKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCS8vcmVhZCBpbnRlcnJ1cHQgdHlwZQorCQlpcnFiaXQgPSBERUJJcmVhZChkZXYsIExQX1JETUlTQzIpOworCisJCS8vY2hlY2sgaW50ZXJydXB0IG9uIGNvdW50ZXJzCisJCURFQlVHKCJzNjI2X2lycV9oYW5kbGVyOiBjaGVjayBjb3VudGVycyBpbnRlcnJ1cHQgJWRcbiIsCisJCQlpcnFiaXQpOworCisJCWlmIChpcnFiaXQgJiBJUlFfQ09JTlQxQSkgeworCQkJREVCVUcoInM2MjZfaXJxX2hhbmRsZXI6IGludGVycnVwdCBvbiBjb3VudGVyIDFBIG92ZXJmbG93XG4iKTsKKwkJCWsgPSAmZW5jcHJpdlswXTsKKworCQkJLy9jbGVhciBpbnRlcnJ1cHQgY2FwdHVyZSBmbGFnCisJCQlrLT5SZXNldENhcEZsYWdzKGRldiwgayk7CisJCX0KKwkJaWYgKGlycWJpdCAmIElSUV9DT0lOVDJBKSB7CisJCQlERUJVRygiczYyNl9pcnFfaGFuZGxlcjogaW50ZXJydXB0IG9uIGNvdW50ZXIgMkEgb3ZlcmZsb3dcbiIpOworCQkJayA9ICZlbmNwcml2WzFdOworCisJCQkvL2NsZWFyIGludGVycnVwdCBjYXB0dXJlIGZsYWcKKwkJCWstPlJlc2V0Q2FwRmxhZ3MoZGV2LCBrKTsKKwkJfQorCQlpZiAoaXJxYml0ICYgSVJRX0NPSU5UM0EpIHsKKwkJCURFQlVHKCJzNjI2X2lycV9oYW5kbGVyOiBpbnRlcnJ1cHQgb24gY291bnRlciAzQSBvdmVyZmxvd1xuIik7CisJCQlrID0gJmVuY3ByaXZbMl07CisKKwkJCS8vY2xlYXIgaW50ZXJydXB0IGNhcHR1cmUgZmxhZworCQkJay0+UmVzZXRDYXBGbGFncyhkZXYsIGspOworCQl9CisJCWlmIChpcnFiaXQgJiBJUlFfQ09JTlQxQikgeworCQkJREVCVUcoInM2MjZfaXJxX2hhbmRsZXI6IGludGVycnVwdCBvbiBjb3VudGVyIDFCIG92ZXJmbG93XG4iKTsKKwkJCWsgPSAmZW5jcHJpdlszXTsKKworCQkJLy9jbGVhciBpbnRlcnJ1cHQgY2FwdHVyZSBmbGFnCisJCQlrLT5SZXNldENhcEZsYWdzKGRldiwgayk7CisJCX0KKwkJaWYgKGlycWJpdCAmIElSUV9DT0lOVDJCKSB7CisJCQlERUJVRygiczYyNl9pcnFfaGFuZGxlcjogaW50ZXJydXB0IG9uIGNvdW50ZXIgMkIgb3ZlcmZsb3dcbiIpOworCQkJayA9ICZlbmNwcml2WzRdOworCisJCQkvL2NsZWFyIGludGVycnVwdCBjYXB0dXJlIGZsYWcKKwkJCWstPlJlc2V0Q2FwRmxhZ3MoZGV2LCBrKTsKKworCQkJaWYgKGRldnByaXYtPmFpX2NvbnZlcnRfY291bnQgPiAwKSB7CisJCQkJZGV2cHJpdi0+YWlfY29udmVydF9jb3VudC0tOworCQkJCWlmIChkZXZwcml2LT5haV9jb252ZXJ0X2NvdW50ID09IDApCisJCQkJCWstPlNldEVuYWJsZShkZXYsIGssIENMS0VOQUJfSU5ERVgpOworCisJCQkJaWYgKGNtZC0+Y29udmVydF9zcmMgPT0gVFJJR19USU1FUikgeworCQkJCQlERUJVRygiczYyNl9pcnFfaGFuZGxlcjogY29udmVyIHRpbWVyIHRyaWdnZXIhISEgJWRcbiIsIGRldnByaXYtPmFpX2NvbnZlcnRfY291bnQpOworCisJCQkJCS8vIFRyaWdnZXIgQURDIHNjYW4gbG9vcCBzdGFydCBieSBzZXR0aW5nIFJQUyBTaWduYWwgMC4KKwkJCQkJTUNfRU5BQkxFKFBfTUMyLCBNQzJfQURDX1JQUyk7CisJCQkJfQorCQkJfQorCQl9CisJCWlmIChpcnFiaXQgJiBJUlFfQ09JTlQzQikgeworCQkJREVCVUcoInM2MjZfaXJxX2hhbmRsZXI6IGludGVycnVwdCBvbiBjb3VudGVyIDNCIG92ZXJmbG93XG4iKTsKKwkJCWsgPSAmZW5jcHJpdls1XTsKKworCQkJLy9jbGVhciBpbnRlcnJ1cHQgY2FwdHVyZSBmbGFnCisJCQlrLT5SZXNldENhcEZsYWdzKGRldiwgayk7CisKKwkJCWlmIChjbWQtPnNjYW5fYmVnaW5fc3JjID09IFRSSUdfVElNRVIpIHsKKwkJCQlERUJVRygiczYyNl9pcnFfaGFuZGxlcjogc2NhbiB0aW1lciB0cmlnZ2VyISEhXG4iKTsKKworCQkJCS8vIFRyaWdnZXIgQURDIHNjYW4gbG9vcCBzdGFydCBieSBzZXR0aW5nIFJQUyBTaWduYWwgMC4KKwkJCQlNQ19FTkFCTEUoUF9NQzIsIE1DMl9BRENfUlBTKTsKKwkJCX0KKworCQkJaWYgKGNtZC0+Y29udmVydF9zcmMgPT0gVFJJR19USU1FUikgeworCQkJCURFQlVHKCJzNjI2X2lycV9oYW5kbGVyOiBjb252ZXJ0IHRpbWVyIHRyaWdnZXIgaXMgc2V0XG4iKTsKKwkJCQlrID0gJmVuY3ByaXZbNF07CisJCQkJZGV2cHJpdi0+YWlfY29udmVydF9jb3VudCA9IGNtZC0+Y2hhbmxpc3RfbGVuOworCQkJCWstPlNldEVuYWJsZShkZXYsIGssIENMS0VOQUJfQUxXQVlTKTsKKwkJCX0KKwkJfQorCX0KKworCS8vZW5hYmxlIGludGVycnVwdAorCXdyaXRlbChpcnFzdGF0dXMsIGRldnByaXYtPmJhc2VfYWRkciArIFBfSUVSKTsKKworCURFQlVHKCJzNjI2X2lycV9oYW5kbGVyOiBleGl0IGludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmUuXG4iKTsKKworCWNvbWVkaV9zcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPnNwaW5sb2NrLCBmbGFncyk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaW50IHM2MjZfZGV0YWNoKGNvbWVkaV9kZXZpY2UgKiBkZXYpCit7CisJaWYgKGRldnByaXYpIHsKKwkJLy9zdG9wIGFpX2NvbW1hbmQKKwkJZGV2cHJpdi0+YWlfY21kX3J1bm5pbmcgPSAwOworCisJCWlmIChkZXZwcml2LT5iYXNlX2FkZHIpIHsKKwkJCS8vaW50ZXJydXB0IG1hc2sKKwkJCVdSNzE0NihQX0lFUiwgMCk7CS8vIERpc2FibGUgbWFzdGVyIGludGVycnVwdC4KKwkJCVdSNzE0NihQX0lTUiwgSVJRX0dQSU8zIHwgSVJRX1JQUzEpOwkvLyBDbGVhciBib2FyZCdzIElSUSBzdGF0dXMgZmxhZy4KKworCQkJLy8gRGlzYWJsZSB0aGUgd2F0Y2hkb2cgdGltZXIgYW5kIGJhdHRlcnkgY2hhcmdlci4KKwkJCVdyaXRlTUlTQzIoZGV2LCAwKTsKKworCQkJLy8gQ2xvc2UgYWxsIGludGVyZmFjZXMgb24gNzE0NiBkZXZpY2UuCisJCQlXUjcxNDYoUF9NQzEsIE1DMV9TSFVURE9XTik7CisJCQlXUjcxNDYoUF9BQ09OMSwgQUNPTjFfQkFTRSk7CisKKwkJCUNsb3NlRE1BQihkZXYsICZkZXZwcml2LT5SUFNCdWYsIERNQUJVRl9TSVpFKTsKKwkJCUNsb3NlRE1BQihkZXYsICZkZXZwcml2LT5BTkFCdWYsIERNQUJVRl9TSVpFKTsKKwkJfQorCisJCWlmIChkZXYtPmlycSkgeworCQkJY29tZWRpX2ZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCQl9CisKKwkJaWYgKGRldnByaXYtPmJhc2VfYWRkcikgeworCQkJaW91bm1hcChkZXZwcml2LT5iYXNlX2FkZHIpOworCQl9CisKKwkJaWYgKGRldnByaXYtPnBkZXYpIHsKKwkJCWlmIChkZXZwcml2LT5nb3RfcmVnaW9ucykgeworCQkJCWNvbWVkaV9wY2lfZGlzYWJsZShkZXZwcml2LT5wZGV2KTsKKwkJCX0KKwkJCXBjaV9kZXZfcHV0KGRldnByaXYtPnBkZXYpOworCQl9CisJfQorCisJREVCVUcoInM2MjZfZGV0YWNoOiBTNjI2IGRldGFjaGVkIVxuIik7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIHRoaXMgZnVuY3Rpb25zIGJ1aWxkIHRoZSBSUFMgcHJvZ3JhbSBmb3IgaGFyZHdhcmUgZHJpdmVuIGFjcXVpc3Rpb24KKyAqLwordm9pZCBSZXNldEFEQyhjb21lZGlfZGV2aWNlICogZGV2LCB1aW50OF90ICogcHBsKQoreworCXJlZ2lzdGVyIHVpbnQzMl90ICpwUlBTOworCXVpbnQzMl90IEptcEFkcnM7CisJdWludDE2X3QgaTsKKwl1aW50MTZfdCBuOworCXVpbnQzMl90IExvY2FsUFBMOworCWNvbWVkaV9jbWQgKmNtZCA9ICYoZGV2LT5zdWJkZXZpY2VzLT5hc3luYy0+Y21kKTsKKworCS8vIFN0b3AgUlBTIHByb2dyYW0gaW4gY2FzZSBpdCBpcyBjdXJyZW50bHkgcnVubmluZy4KKwlNQ19ESVNBQkxFKFBfTUMxLCBNQzFfRVJQUzEpOworCisJLy8gU2V0IHN0YXJ0aW5nIGxvZ2ljYWwgYWRkcmVzcyB0byB3cml0ZSBSUFMgY29tbWFuZHMuCisJcFJQUyA9ICh1aW50MzJfdCAqKSBkZXZwcml2LT5SUFNCdWYuTG9naWNhbEJhc2U7CisKKwkvLyBJbml0aWFsaXplIFJQUyBpbnN0cnVjdGlvbiBwb2ludGVyLgorCVdSNzE0NihQX1JQU0FERFIxLCAodWludDMyX3QpIGRldnByaXYtPlJQU0J1Zi5QaHlzaWNhbEJhc2UpOworCisJLy8gQ29uc3RydWN0IFJQUyBwcm9ncmFtIGluIFJQU0J1ZiBETUEgYnVmZmVyCisKKwlpZiAoY21kICE9IE5VTEwgJiYgY21kLT5zY2FuX2JlZ2luX3NyYyAhPSBUUklHX0ZPTExPVykgeworCQlERUJVRygiUmVzZXRBREM6IHNjYW5fYmVnaW4gcGF1c2UgaW5zZXJ0ZWRcbiIpOworCQkvLyBXYWl0IGZvciBTdGFydCB0cmlnZ2VyLgorCQkqcFJQUysrID0gUlBTX1BBVVNFIHwgUlBTX1NJR0FEQzsKKwkJKnBSUFMrKyA9IFJQU19DTFJTSUdOQUwgfCBSUFNfU0lHQURDOworCX0KKwkvLyBTQUE3MTQ2IEJVRyBXT1JLQVJPVU5EIERvIGEgZHVtbXkgREVCSSBXcml0ZS4gIFRoaXMgaXMgbmVjZXNzYXJ5CisJLy8gYmVjYXVzZSB0aGUgZmlyc3QgUlBTIERFQkkgV3JpdGUgZm9sbG93aW5nIGEgbm9uLVJQUyBERUJJIHdyaXRlCisJLy8gc2VlbXMgdG8gYWx3YXlzIGZhaWwuICBJZiB3ZSBkb24ndCBkbyB0aGlzIGR1bW15IHdyaXRlLCB0aGUgQURDCisJLy8gZ2FpbiBtaWdodCBub3QgYmUgc2V0IHRvIHRoZSB2YWx1ZSByZXF1aXJlZCBmb3IgdGhlIGZpcnN0IHNsb3QgaW4KKwkvLyB0aGUgcG9sbCBsaXN0OyB0aGUgQURDIGdhaW4gd291bGQgaW5zdGVhZCByZW1haW4gdW5jaGFuZ2VkIGZyb20KKwkvLyB0aGUgcHJldmlvdXNseSBwcm9ncmFtbWVkIHZhbHVlLgorCSpwUlBTKysgPSBSUFNfTERSRUcgfCAoUF9ERUJJQ01EID4+IDIpOwkvLyBXcml0ZSBERUJJIFdyaXRlIGNvbW1hbmQKKwkvLyBhbmQgYWRkcmVzcyB0byBzaGFkb3cgUkFNLgorCSpwUlBTKysgPSBERUJJX0NNRF9XUldPUkQgfCBMUF9HU0VMOworCSpwUlBTKysgPSBSUFNfTERSRUcgfCAoUF9ERUJJQUQgPj4gMik7CS8vIFdyaXRlIERFQkkgaW1tZWRpYXRlIGRhdGEKKwkvLyB0byBzaGFkb3cgUkFNOgorCSpwUlBTKysgPSBHU0VMX0JJUE9MQVI1VjsJLy8gYXJiaXRyYXJ5IGltbWVkaWF0ZSBkYXRhCisJLy8gdmFsdWUuCisJKnBSUFMrKyA9IFJQU19DTFJTSUdOQUwgfCBSUFNfREVCSTsJLy8gUmVzZXQgInNoYWRvdyBSQU0KKwkvLyB1cGxvYWRlZCIgZmxhZy4KKwkqcFJQUysrID0gUlBTX1VQTE9BRCB8IFJQU19ERUJJOwkvLyBJbnZva2Ugc2hhZG93IFJBTSB1cGxvYWQuCisJKnBSUFMrKyA9IFJQU19QQVVTRSB8IFJQU19ERUJJOwkvLyBXYWl0IGZvciBzaGFkb3cgdXBsb2FkIHRvIGZpbmlzaC4KKworCS8vIERpZ2l0aXplIGFsbCBzbG90cyBpbiB0aGUgcG9sbCBsaXN0LiBUaGlzIGlzIGltcGxlbWVudGVkIGFzIGEKKwkvLyBmb3IgbG9vcCB0byBsaW1pdCB0aGUgc2xvdCBjb3VudCB0byAxNiBpbiBjYXNlIHRoZSBhcHBsaWNhdGlvbgorCS8vIGZvcmdvdCB0byBzZXQgdGhlIEVPUEwgZmxhZyBpbiB0aGUgZmluYWwgc2xvdC4KKwlmb3IgKGRldnByaXYtPkFkY0l0ZW1zID0gMDsgZGV2cHJpdi0+QWRjSXRlbXMgPCAxNjsgZGV2cHJpdi0+QWRjSXRlbXMrKykgeworCQkvLyBDb252ZXJ0IGFwcGxpY2F0aW9uJ3MgcG9sbCBsaXN0IGl0ZW0gdG8gcHJpdmF0ZSBib2FyZCBjbGFzcworCQkvLyBmb3JtYXQuICBFYWNoIGFwcCBwb2xsIGxpc3QgaXRlbSBpcyBhbiB1aW50OF90IHdpdGggZm9ybQorCQkvLyAoRU9QTCx4LHgsUkFOR0UsQ0hBTjwzOjA+KSwgd2hlcmUgUkFOR0UgY29kZSBpbmRpY2F0ZXMgMCA9CisJCS8vICstMTBWLCAxID0gKy01ViwgYW5kIEVPUEwgPSBFbmQgb2YgUG9sbCBMaXN0IG1hcmtlci4KKwkJTG9jYWxQUEwgPQorCQkJKCpwcGwgPDwgOCkgfCAoKnBwbCAmIDB4MTAgPyBHU0VMX0JJUE9MQVI1ViA6CisJCQlHU0VMX0JJUE9MQVIxMFYpOworCisJCS8vIFN3aXRjaCBBREMgYW5hbG9nIGdhaW4uCisJCSpwUlBTKysgPSBSUFNfTERSRUcgfCAoUF9ERUJJQ01EID4+IDIpOwkvLyBXcml0ZSBERUJJIGNvbW1hbmQKKwkJLy8gYW5kIGFkZHJlc3MgdG8KKwkJLy8gc2hhZG93IFJBTS4KKwkJKnBSUFMrKyA9IERFQklfQ01EX1dSV09SRCB8IExQX0dTRUw7CisJCSpwUlBTKysgPSBSUFNfTERSRUcgfCAoUF9ERUJJQUQgPj4gMik7CS8vIFdyaXRlIERFQkkKKwkJLy8gaW1tZWRpYXRlIGRhdGEgdG8KKwkJLy8gc2hhZG93IFJBTS4KKwkJKnBSUFMrKyA9IExvY2FsUFBMOworCQkqcFJQUysrID0gUlBTX0NMUlNJR05BTCB8IFJQU19ERUJJOwkvLyBSZXNldCAic2hhZG93IFJBTSB1cGxvYWRlZCIKKwkJLy8gZmxhZy4KKwkJKnBSUFMrKyA9IFJQU19VUExPQUQgfCBSUFNfREVCSTsJLy8gSW52b2tlIHNoYWRvdyBSQU0gdXBsb2FkLgorCQkqcFJQUysrID0gUlBTX1BBVVNFIHwgUlBTX0RFQkk7CS8vIFdhaXQgZm9yIHNoYWRvdyB1cGxvYWQgdG8KKwkJLy8gZmluaXNoLgorCisJCS8vIFNlbGVjdCBBREMgYW5hbG9nIGlucHV0IGNoYW5uZWwuCisJCSpwUlBTKysgPSBSUFNfTERSRUcgfCAoUF9ERUJJQ01EID4+IDIpOwkvLyBXcml0ZSBERUJJIGNvbW1hbmQKKwkJLy8gYW5kIGFkZHJlc3MgdG8KKwkJLy8gc2hhZG93IFJBTS4KKwkJKnBSUFMrKyA9IERFQklfQ01EX1dSV09SRCB8IExQX0lTRUw7CisJCSpwUlBTKysgPSBSUFNfTERSRUcgfCAoUF9ERUJJQUQgPj4gMik7CS8vIFdyaXRlIERFQkkKKwkJLy8gaW1tZWRpYXRlIGRhdGEgdG8KKwkJLy8gc2hhZG93IFJBTS4KKwkJKnBSUFMrKyA9IExvY2FsUFBMOworCQkqcFJQUysrID0gUlBTX0NMUlNJR05BTCB8IFJQU19ERUJJOwkvLyBSZXNldCAic2hhZG93IFJBTSB1cGxvYWRlZCIKKwkJLy8gZmxhZy4KKwkJKnBSUFMrKyA9IFJQU19VUExPQUQgfCBSUFNfREVCSTsJLy8gSW52b2tlIHNoYWRvdyBSQU0gdXBsb2FkLgorCQkqcFJQUysrID0gUlBTX1BBVVNFIHwgUlBTX0RFQkk7CS8vIFdhaXQgZm9yIHNoYWRvdyB1cGxvYWQgdG8KKwkJLy8gZmluaXNoLgorCisJCS8vIERlbGF5IGF0IGxlYXN0IDEwIG1pY3Jvc2Vjb25kcyBmb3IgYW5hbG9nIGlucHV0IHNldHRsaW5nLgorCQkvLyBJbnN0ZWFkIG9mIHBhZGRpbmcgd2l0aCBOT1BzLCB3ZSB1c2UgUlBTX0pVTVAgaW5zdHJ1Y3Rpb25zCisJCS8vIGhlcmU7IHRoaXMgYWxsb3dzIHVzIHRvIHByb2R1Y2UgYSBsb25nZXIgZGVsYXkgdGhhbiBpcworCQkvLyBwb3NzaWJsZSB3aXRoIE5PUHMgYmVjYXVzZSBlYWNoIFJQU19KVU1QIGZsdXNoZXMgdGhlIFJQUycKKwkJLy8gaW5zdHJ1Y3Rpb24gcHJlZmV0Y2ggcGlwZWxpbmUuCisJCUptcEFkcnMgPQorCQkJKHVpbnQzMl90KSBkZXZwcml2LT5SUFNCdWYuUGh5c2ljYWxCYXNlICsKKwkJCSh1aW50MzJfdCkgKCh1bnNpZ25lZCBsb25nKXBSUFMgLQorCQkJKHVuc2lnbmVkIGxvbmcpZGV2cHJpdi0+UlBTQnVmLkxvZ2ljYWxCYXNlKTsKKwkJZm9yIChpID0gMDsgaSA8ICgxMCAqIFJQU0NMS19QRVJfVVMgLyAyKTsgaSsrKSB7CisJCQlKbXBBZHJzICs9IDg7CS8vIFJlcGVhdCB0byBpbXBsZW1lbnQgdGltZSBkZWxheToKKwkJCSpwUlBTKysgPSBSUFNfSlVNUDsJLy8gSnVtcCB0byBuZXh0IFJQUyBpbnN0cnVjdGlvbi4KKwkJCSpwUlBTKysgPSBKbXBBZHJzOworCQl9CisKKwkJaWYgKGNtZCAhPSBOVUxMICYmIGNtZC0+Y29udmVydF9zcmMgIT0gVFJJR19OT1cpIHsKKwkJCURFQlVHKCJSZXNldEFEQzogY29udmVydCBwYXVzZSBpbnNlcnRlZFxuIik7CisJCQkvLyBXYWl0IGZvciBTdGFydCB0cmlnZ2VyLgorCQkJKnBSUFMrKyA9IFJQU19QQVVTRSB8IFJQU19TSUdBREM7CisJCQkqcFJQUysrID0gUlBTX0NMUlNJR05BTCB8IFJQU19TSUdBREM7CisJCX0KKwkJLy8gU3RhcnQgQURDIGJ5IHB1bHNpbmcgR1BJTzEuCisJCSpwUlBTKysgPSBSUFNfTERSRUcgfCAoUF9HUElPID4+IDIpOwkvLyBCZWdpbiBBREMgU3RhcnQgcHVsc2UuCisJCSpwUlBTKysgPSBHUElPX0JBU0UgfCBHUElPMV9MTzsKKwkJKnBSUFMrKyA9IFJQU19OT1A7CisJCS8vIFZFUlNJT04gMi4wMyBDSEFOR0U6IFNUUkVUQ0ggT1VUIEFEQyBTVEFSVCBQVUxTRS4KKwkJKnBSUFMrKyA9IFJQU19MRFJFRyB8IChQX0dQSU8gPj4gMik7CS8vIEVuZCBBREMgU3RhcnQgcHVsc2UuCisJCSpwUlBTKysgPSBHUElPX0JBU0UgfCBHUElPMV9ISTsKKworCQkvLyBXYWl0IGZvciBBREMgdG8gY29tcGxldGUgKEdQSU8yIGlzIGFzc2VydGVkIGhpZ2ggd2hlbiBBREMgbm90CisJCS8vIGJ1c3kpIGFuZCBmb3IgZGF0YSBmcm9tIHByZXZpb3VzIGNvbnZlcnNpb24gdG8gc2hpZnQgaW50byBGQgorCQkvLyBCVUZGRVIgMSByZWdpc3Rlci4KKwkJKnBSUFMrKyA9IFJQU19QQVVTRSB8IFJQU19HUElPMjsJLy8gV2FpdCBmb3IgQURDIGRvbmUuCisKKwkJLy8gVHJhbnNmZXIgQURDIGRhdGEgZnJvbSBGQiBCVUZGRVIgMSByZWdpc3RlciB0byBETUEgYnVmZmVyLgorCQkqcFJQUysrID0gUlBTX1NUUkVHIHwgKEJVR0ZJWF9TVFJFRyhQX0ZCX0JVRkZFUjEpID4+IDIpOworCQkqcFJQUysrID0KKwkJCSh1aW50MzJfdCkgZGV2cHJpdi0+QU5BQnVmLlBoeXNpY2FsQmFzZSArCisJCQkoZGV2cHJpdi0+QWRjSXRlbXMgPDwgMik7CisKKwkJLy8gSWYgdGhpcyBzbG90J3MgRW5kT2ZQb2xsTGlzdCBmbGFnIGlzIHNldCwgYWxsIGNoYW5uZWxzIGhhdmUKKwkJLy8gbm93IGJlZW4gcHJvY2Vzc2VkLgorCQlpZiAoKnBwbCsrICYgRU9QTCkgeworCQkJZGV2cHJpdi0+QWRjSXRlbXMrKzsJLy8gQWRqdXN0IHBvbGwgbGlzdCBpdGVtIGNvdW50LgorCQkJYnJlYWs7CS8vIEV4aXQgcG9sbCBsaXN0IHByb2Nlc3NpbmcgbG9vcC4KKwkJfQorCX0KKwlERUJVRygiUmVzZXRBREM6IEFEQyBpdGVtcyAlZCBcbiIsIGRldnByaXYtPkFkY0l0ZW1zKTsKKworCS8vIFZFUlNJT04gMi4wMSBDSEFOR0U6IERFTEFZIENIQU5HRUQgRlJPTSAyNTBOUyB0byAyVVMuICBBbGxvdyB0aGUKKwkvLyBBREMgdG8gc3RhYmlsaXplIGZvciAyIG1pY3Jvc2Vjb25kcyBiZWZvcmUgc3RhcnRpbmcgdGhlIGZpbmFsCisJLy8gKGR1bW15KSBjb252ZXJzaW9uLiAgVGhpcyBkZWxheSBpcyBuZWNlc3NhcnkgdG8gYWxsb3cgc3VmZmljaWVudAorCS8vIHRpbWUgYmV0d2VlbiBsYXN0IGNvbnZlcnNpb24gZmluaXNoZWQgYW5kIHRoZSBzdGFydCBvZiB0aGUgZHVtbXkKKwkvLyBjb252ZXJzaW9uLiAgV2l0aG91dCB0aGlzIGRlbGF5LCB0aGUgbGFzdCBjb252ZXJzaW9uJ3MgZGF0YSB2YWx1ZQorCS8vIGlzIHNvbWV0aW1lcyBzZXQgdG8gdGhlIHByZXZpb3VzIGNvbnZlcnNpb24ncyBkYXRhIHZhbHVlLgorCWZvciAobiA9IDA7IG4gPCAoMiAqIFJQU0NMS19QRVJfVVMpOyBuKyspCisJCSpwUlBTKysgPSBSUFNfTk9QOworCisJLy8gU3RhcnQgYSBkdW1teSBjb252ZXJzaW9uIHRvIGNhdXNlIHRoZSBkYXRhIGZyb20gdGhlIGxhc3QKKwkvLyBjb252ZXJzaW9uIG9mIGludGVyZXN0IHRvIGJlIHNoaWZ0ZWQgaW4uCisJKnBSUFMrKyA9IFJQU19MRFJFRyB8IChQX0dQSU8gPj4gMik7CS8vIEJlZ2luIEFEQyBTdGFydCBwdWxzZS4KKwkqcFJQUysrID0gR1BJT19CQVNFIHwgR1BJTzFfTE87CisJKnBSUFMrKyA9IFJQU19OT1A7CisJLy8gVkVSU0lPTiAyLjAzIENIQU5HRTogU1RSRVRDSCBPVVQgQURDIFNUQVJUIFBVTFNFLgorCSpwUlBTKysgPSBSUFNfTERSRUcgfCAoUF9HUElPID4+IDIpOwkvLyBFbmQgQURDIFN0YXJ0IHB1bHNlLgorCSpwUlBTKysgPSBHUElPX0JBU0UgfCBHUElPMV9ISTsKKworCS8vIFdhaXQgZm9yIHRoZSBkYXRhIGZyb20gdGhlIGxhc3QgY29udmVyc2lvbiBvZiBpbnRlcmVzdCB0byBhcnJpdmUKKwkvLyBpbiBGQiBCVUZGRVIgMSByZWdpc3Rlci4KKwkqcFJQUysrID0gUlBTX1BBVVNFIHwgUlBTX0dQSU8yOwkvLyBXYWl0IGZvciBBREMgZG9uZS4KKworCS8vIFRyYW5zZmVyIGZpbmFsIEFEQyBkYXRhIGZyb20gRkIgQlVGRkVSIDEgcmVnaXN0ZXIgdG8gRE1BIGJ1ZmZlci4KKwkqcFJQUysrID0gUlBTX1NUUkVHIHwgKEJVR0ZJWF9TVFJFRyhQX0ZCX0JVRkZFUjEpID4+IDIpOwkvLworCSpwUlBTKysgPQorCQkodWludDMyX3QpIGRldnByaXYtPkFOQUJ1Zi5QaHlzaWNhbEJhc2UgKworCQkoZGV2cHJpdi0+QWRjSXRlbXMgPDwgMik7CisKKwkvLyBJbmRpY2F0ZSBBREMgc2NhbiBsb29wIGlzIGZpbmlzaGVkLgorCS8vICpwUlBTKys9IFJQU19DTFJTSUdOQUwgfCBSUFNfU0lHQURDIDsgIC8vIFNpZ25hbCBSZWFkQURDKCkgdGhhdCBzY2FuIGlzIGRvbmUuCisKKwkvL2ludm9rZSBpbnRlcnJ1cHQKKwlpZiAoZGV2cHJpdi0+YWlfY21kX3J1bm5pbmcgPT0gMSkgeworCQlERUJVRygiUmVzZXRBREM6IGluc2VydCBpcnEgaW4gQURDIFJQUyB0YXNrXG4iKTsKKwkJKnBSUFMrKyA9IFJQU19JUlE7CisJfQorCS8vIFJlc3RhcnQgUlBTIHByb2dyYW0gYXQgaXRzIGJlZ2lubmluZy4KKwkqcFJQUysrID0gUlBTX0pVTVA7CS8vIEJyYW5jaCB0byBzdGFydCBvZiBSUFMgcHJvZ3JhbS4KKwkqcFJQUysrID0gKHVpbnQzMl90KSBkZXZwcml2LT5SUFNCdWYuUGh5c2ljYWxCYXNlOworCisJLy8gRW5kIG9mIFJQUyBwcm9ncmFtIGJ1aWxkCisJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit9CisKKy8qIFRPIENPTVBMRVRFLCBJRiBORUNFU1NBUlkgKi8KK3N0YXRpYyBpbnQgczYyNl9haV9pbnNuX2NvbmZpZyhjb21lZGlfZGV2aWNlICogZGV2LCBjb21lZGlfc3ViZGV2aWNlICogcywKKwljb21lZGlfaW5zbiAqIGluc24sIGxzYW1wbF90ICogZGF0YSkKK3sKKworCXJldHVybiAtRUlOVkFMOworfQorCisvKiBzdGF0aWMgaW50IHM2MjZfYWlfcmluc24oY29tZWRpX2RldmljZSAqZGV2LGNvbWVkaV9zdWJkZXZpY2UgKnMsY29tZWRpX2luc24gKmluc24sbHNhbXBsX3QgKmRhdGEpICovCisvKiB7ICovCisvKiAgIHJlZ2lzdGVyIHVpbnQ4X3QJaTsgKi8KKy8qICAgcmVnaXN0ZXIgaW50MzJfdAkqcmVhZGFkZHI7ICovCisKKy8qICAgREVCVUcoImFzNjI2X2FpX3JpbnNuOiBhaV9yaW5zbiBlbnRlciBcbiIpOyAgKi8KKworLyogICAvLyBUcmlnZ2VyIEFEQyBzY2FuIGxvb3Agc3RhcnQgYnkgc2V0dGluZyBSUFMgU2lnbmFsIDAuICovCisvKiAgIE1DX0VOQUJMRSggUF9NQzIsIE1DMl9BRENfUlBTICk7ICovCisKKy8qICAgLy8gV2FpdCB1bnRpbCBBREMgc2NhbiBsb29wIGlzIGZpbmlzaGVkIChSUFMgU2lnbmFsIDAgcmVzZXQpLiAqLworLyogICB3aGlsZSAoIE1DX1RFU1QoIFBfTUMyLCBNQzJfQURDX1JQUyApICk7ICovCisKKy8qICAgLy8gSW5pdCBwdHIgdG8gRE1BIGJ1ZmZlciB0aGF0IGhvbGRzIG5ldyBBREMgZGF0YS4gIFdlIHNraXAgdGhlICovCisvKiAgIC8vIGZpcnN0IHVpbnQxNl90IGluIHRoZSBidWZmZXIgYmVjYXVzZSBpdCBjb250YWlucyBqdW5rIGRhdGEgZnJvbSAqLworLyogICAvLyB0aGUgZmluYWwgQURDIG9mIHRoZSBwcmV2aW91cyBwb2xsIGxpc3Qgc2Nhbi4gKi8KKy8qICAgcmVhZGFkZHIgPSAodWludDMyX3QgKilkZXZwcml2LT5BTkFCdWYuTG9naWNhbEJhc2UgKyAxOyAqLworCisvKiAgIC8vIENvbnZlcnQgQURDIGRhdGEgdG8gMTYtYml0IGludGVnZXIgdmFsdWVzIGFuZCBjb3B5IHRvIGFwcGxpY2F0aW9uICovCisvKiAgIC8vIGJ1ZmZlci4JICovCisvKiAgIGZvciAoIGkgPSAwOyBpIDwgZGV2cHJpdi0+QWRjSXRlbXM7IGkrKyApIHsgKi8KKy8qICAgICAqZGF0YSA9IHM2MjZfYWlfcmVnX3RvX3VpbnQoICpyZWFkYWRkcisrICk7ICovCisvKiAgICAgREVCVUcoInM2MjZfYWlfcmluc246IGRhdGEgJWQgXG4iLCpkYXRhKTsgKi8KKy8qICAgICBkYXRhKys7ICovCisvKiAgIH0gKi8KKworLyogICBERUJVRygiczYyNl9haV9yaW5zbjogYWlfcmluc24gZXNjYXBlIFxuIik7ICovCisvKiAgIHJldHVybiBpOyAqLworLyogfSAqLworCitzdGF0aWMgaW50IHM2MjZfYWlfaW5zbl9yZWFkKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKiBzLAorCWNvbWVkaV9pbnNuICogaW5zbiwgbHNhbXBsX3QgKiBkYXRhKQoreworCXVpbnQxNl90IGNoYW4gPSBDUl9DSEFOKGluc24tPmNoYW5zcGVjKTsKKwl1aW50MTZfdCByYW5nZSA9IENSX1JBTkdFKGluc24tPmNoYW5zcGVjKTsKKwl1aW50MTZfdCBBZGNTcGVjID0gMDsKKwl1aW50MzJfdCBHcGlvSW1hZ2U7CisJaW50IG47CisKKy8qICAgLy9pbnRlcnJ1cHQgY2FsbCB0ZXN0ICAqLworLyogICB3cml0ZWwoSVJRX0dQSU8zLGRldnByaXYtPmJhc2VfYWRkcitQX1BTUik7IC8vV3JpdGluZyBhIGxvZ2ljYWwgMSAqLworLyogCQkJCQkgICAgIC8vaW50byBhbnkgb2YgdGhlIFJQU19QU1IgKi8KKy8qIAkJCQkJICAgICAvL2JpdHMgY2F1c2VzIHRoZSAqLworLyogCQkJCQkgICAgIC8vY29ycmVzcG9uZGluZyBpbnRlcnJ1cHQgKi8KKy8qIAkJCQkJICAgICAvL3RvIGJlIGdlbmVyYXRlZCBpZiAqLworLyogCQkJCQkgICAgIC8vZW5hYmxlZCAqLworCisJREVCVUcoInM2MjZfYWlfaW5zbl9yZWFkOiBlbnRlcmluZ1xuIik7CisKKwkvLyBDb252ZXJ0IGFwcGxpY2F0aW9uJ3MgQURDIHNwZWNpZmljYXRpb24gaW50byBmb3JtCisJLy8gYXBwcm9wcmlhdGUgZm9yIHJlZ2lzdGVyIHByb2dyYW1taW5nLgorCWlmIChyYW5nZSA9PSAwKQorCQlBZGNTcGVjID0gKGNoYW4gPDwgOCkgfCAoR1NFTF9CSVBPTEFSNVYpOworCWVsc2UKKwkJQWRjU3BlYyA9IChjaGFuIDw8IDgpIHwgKEdTRUxfQklQT0xBUjEwVik7CisKKwkvLyBTd2l0Y2ggQURDIGFuYWxvZyBnYWluLgorCURFQkl3cml0ZShkZXYsIExQX0dTRUwsIEFkY1NwZWMpOwkvLyBTZXQgZ2Fpbi4KKworCS8vIFNlbGVjdCBBREMgYW5hbG9nIGlucHV0IGNoYW5uZWwuCisJREVCSXdyaXRlKGRldiwgTFBfSVNFTCwgQWRjU3BlYyk7CS8vIFNlbGVjdCBjaGFubmVsLgorCisJZm9yIChuID0gMDsgbiA8IGluc24tPm47IG4rKykgeworCisJCS8vIERlbGF5IDEwIG1pY3Jvc2Vjb25kcyBmb3IgYW5hbG9nIGlucHV0IHNldHRsaW5nLgorCQljb21lZGlfdWRlbGF5KDEwKTsKKworCQkvLyBTdGFydCBBREMgYnkgcHVsc2luZyBHUElPMSBsb3cuCisJCUdwaW9JbWFnZSA9IFJSNzE0NihQX0dQSU8pOworCQkvLyBBc3NlcnQgQURDIFN0YXJ0IGNvbW1hbmQKKwkJV1I3MTQ2KFBfR1BJTywgR3Bpb0ltYWdlICYgfkdQSU8xX0hJKTsKKwkJLy8gICBhbmQgc3RyZXRjaCBpdCBvdXQuCisJCVdSNzE0NihQX0dQSU8sIEdwaW9JbWFnZSAmIH5HUElPMV9ISSk7CisJCVdSNzE0NihQX0dQSU8sIEdwaW9JbWFnZSAmIH5HUElPMV9ISSk7CisJCS8vIE5lZ2F0ZSBBREMgU3RhcnQgY29tbWFuZC4KKwkJV1I3MTQ2KFBfR1BJTywgR3Bpb0ltYWdlIHwgR1BJTzFfSEkpOworCisJCS8vIFdhaXQgZm9yIEFEQyB0byBjb21wbGV0ZSAoR1BJTzIgaXMgYXNzZXJ0ZWQgaGlnaCB3aGVuCisJCS8vIEFEQyBub3QgYnVzeSkgYW5kIGZvciBkYXRhIGZyb20gcHJldmlvdXMgY29udmVyc2lvbiB0bworCQkvLyBzaGlmdCBpbnRvIEZCIEJVRkZFUiAxIHJlZ2lzdGVyLgorCisJCS8vIFdhaXQgZm9yIEFEQyBkb25lLgorCQl3aGlsZSAoIShSUjcxNDYoUF9QU1IpICYgUFNSX0dQSU8yKSkgOworCisJCS8vIEZldGNoIEFEQyBkYXRhLgorCQlpZiAobiAhPSAwKQorCQkJZGF0YVtuIC0gMV0gPSBzNjI2X2FpX3JlZ190b191aW50KFJSNzE0NihQX0ZCX0JVRkZFUjEpKTsKKworCQkvLyBBbGxvdyB0aGUgQURDIHRvIHN0YWJpbGl6ZSBmb3IgNCBtaWNyb3NlY29uZHMgYmVmb3JlCisJCS8vIHN0YXJ0aW5nIHRoZSBuZXh0IChmaW5hbCkgY29udmVyc2lvbi4gIFRoaXMgZGVsYXkgaXMKKwkJLy8gbmVjZXNzYXJ5IHRvIGFsbG93IHN1ZmZpY2llbnQgdGltZSBiZXR3ZWVuIGxhc3QKKwkJLy8gY29udmVyc2lvbiBmaW5pc2hlZCBhbmQgdGhlIHN0YXJ0IG9mIHRoZSBuZXh0CisJCS8vIGNvbnZlcnNpb24uICBXaXRob3V0IHRoaXMgZGVsYXksIHRoZSBsYXN0IGNvbnZlcnNpb24ncworCQkvLyBkYXRhIHZhbHVlIGlzIHNvbWV0aW1lcyBzZXQgdG8gdGhlIHByZXZpb3VzCisJCS8vIGNvbnZlcnNpb24ncyBkYXRhIHZhbHVlLgorCQljb21lZGlfdWRlbGF5KDQpOworCX0KKworCS8vIFN0YXJ0IGEgZHVtbXkgY29udmVyc2lvbiB0byBjYXVzZSB0aGUgZGF0YSBmcm9tIHRoZQorCS8vIHByZXZpb3VzIGNvbnZlcnNpb24gdG8gYmUgc2hpZnRlZCBpbi4KKwlHcGlvSW1hZ2UgPSBSUjcxNDYoUF9HUElPKTsKKworCS8vQXNzZXJ0IEFEQyBTdGFydCBjb21tYW5kCisJV1I3MTQ2KFBfR1BJTywgR3Bpb0ltYWdlICYgfkdQSU8xX0hJKTsKKwkvLyAgIGFuZCBzdHJldGNoIGl0IG91dC4KKwlXUjcxNDYoUF9HUElPLCBHcGlvSW1hZ2UgJiB+R1BJTzFfSEkpOworCVdSNzE0NihQX0dQSU8sIEdwaW9JbWFnZSAmIH5HUElPMV9ISSk7CisJLy8gTmVnYXRlIEFEQyBTdGFydCBjb21tYW5kLgorCVdSNzE0NihQX0dQSU8sIEdwaW9JbWFnZSB8IEdQSU8xX0hJKTsKKworCS8vIFdhaXQgZm9yIHRoZSBkYXRhIHRvIGFycml2ZSBpbiBGQiBCVUZGRVIgMSByZWdpc3Rlci4KKworCS8vIFdhaXQgZm9yIEFEQyBkb25lLgorCXdoaWxlICghKFJSNzE0NihQX1BTUikgJiBQU1JfR1BJTzIpKSA7CisKKwkvLyBGZXRjaCBBREMgZGF0YSBmcm9tIGF1ZGlvIGludGVyZmFjZSdzIGlucHV0IHNoaWZ0CisJLy8gcmVnaXN0ZXIuCisKKwkvLyBGZXRjaCBBREMgZGF0YS4KKwlpZiAobiAhPSAwKQorCQlkYXRhW24gLSAxXSA9IHM2MjZfYWlfcmVnX3RvX3VpbnQoUlI3MTQ2KFBfRkJfQlVGRkVSMSkpOworCisJREVCVUcoInM2MjZfYWlfaW5zbl9yZWFkOiBzYW1wbGVzICVkLCBkYXRhICVkXG4iLCBuLCBkYXRhW24gLSAxXSk7CisKKwlyZXR1cm4gbjsKK30KKworc3RhdGljIGludCBzNjI2X2FpX2xvYWRfcG9sbGxpc3QodWludDhfdCAqIHBwbCwgY29tZWRpX2NtZCAqIGNtZCkKK3sKKworCWludCBuOworCisJZm9yIChuID0gMDsgbiA8IGNtZC0+Y2hhbmxpc3RfbGVuOyBuKyspIHsKKwkJaWYgKENSX1JBTkdFKChjbWQtPmNoYW5saXN0KVtuXSkgPT0gMCkKKwkJCXBwbFtuXSA9IChDUl9DSEFOKChjbWQtPmNoYW5saXN0KVtuXSkpIHwgKFJBTkdFXzVWKTsKKwkJZWxzZQorCQkJcHBsW25dID0gKENSX0NIQU4oKGNtZC0+Y2hhbmxpc3QpW25dKSkgfCAoUkFOR0VfMTBWKTsKKwl9CisJcHBsW24gLSAxXSB8PSBFT1BMOworCisJcmV0dXJuIG47Cit9CisKK3N0YXRpYyBpbnQgczYyNl9haV9pbnR0cmlnKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKiBzLAorCXVuc2lnbmVkIGludCB0cmlnbnVtKQoreworCWlmICh0cmlnbnVtICE9IDApCisJCXJldHVybiAtRUlOVkFMOworCisJREVCVUcoInM2MjZfYWlfaW50dHJpZzogdHJpZ2dlciBhZGMgc3RhcnQuLi4iKTsKKworCS8vIFN0YXJ0IGV4ZWN1dGluZyB0aGUgUlBTIHByb2dyYW0uCisJTUNfRU5BQkxFKFBfTUMxLCBNQzFfRVJQUzEpOworCisJcy0+YXN5bmMtPmludHRyaWcgPSBOVUxMOworCisJREVCVUcoIiBkb25lXG4iKTsKKworCXJldHVybiAxOworfQorCisvKiAgVE8gQ09NUExFVEUgICovCitzdGF0aWMgaW50IHM2MjZfYWlfY21kKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKiBzKQoreworCisJdWludDhfdCBwcGxbMTZdOworCWNvbWVkaV9jbWQgKmNtZCA9ICZzLT5hc3luYy0+Y21kOworCWVuY19wcml2YXRlICprOworCWludCB0aWNrOworCisJREVCVUcoInM2MjZfYWlfY21kOiBlbnRlcmluZyBjb21tYW5kIGZ1bmN0aW9uXG4iKTsKKworCWlmIChkZXZwcml2LT5haV9jbWRfcnVubmluZykgeworCQlwcmludGsoInM2MjZfYWlfY21kOiBBbm90aGVyIGFpX2NtZCBpcyBydW5uaW5nICVkXG4iLAorCQkJZGV2LT5taW5vcik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCS8vZGlzYWJsZSBpbnRlcnJ1cHQKKwl3cml0ZWwoMCwgZGV2cHJpdi0+YmFzZV9hZGRyICsgUF9JRVIpOworCisJLy9jbGVhciBpbnRlcnJ1cHQgcmVxdWVzdAorCXdyaXRlbChJUlFfUlBTMSB8IElSUV9HUElPMywgZGV2cHJpdi0+YmFzZV9hZGRyICsgUF9JU1IpOworCisJLy9jbGVhciBhbnkgcGVuZGluZyBpbnRlcnJ1cHQKKwlzNjI2X2Rpb19jbGVhcl9pcnEoZGV2KTsKKwkvLyAgczYyNl9lbmNfY2xlYXJfaXJxKGRldik7CisKKwkvL3Jlc2V0IGFpX2NtZF9ydW5uaW5nIGZsYWcKKwlkZXZwcml2LT5haV9jbWRfcnVubmluZyA9IDA7CisKKwkvLyB0ZXN0IGlmIGNtZCBpcyB2YWxpZAorCWlmIChjbWQgPT0gTlVMTCkgeworCQlERUJVRygiczYyNl9haV9jbWQ6IE5VTEwgY29tbWFuZFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0gZWxzZSB7CisJCURFQlVHKCJzNjI2X2FpX2NtZDogY29tbWFuZCByZWNpZXZlZCEhIVxuIik7CisJfQorCisJaWYgKGRldi0+aXJxID09IDApIHsKKwkJY29tZWRpX2Vycm9yKGRldiwKKwkJCSJzNjI2X2FpX2NtZDogY2Fubm90IHJ1biBjb21tYW5kIHdpdGhvdXQgYW4gaXJxIik7CisJCXJldHVybiAtRUlPOworCX0KKworCXM2MjZfYWlfbG9hZF9wb2xsbGlzdChwcGwsIGNtZCk7CisJZGV2cHJpdi0+YWlfY21kX3J1bm5pbmcgPSAxOworCWRldnByaXYtPmFpX2NvbnZlcnRfY291bnQgPSAwOworCisJc3dpdGNoIChjbWQtPnNjYW5fYmVnaW5fc3JjKSB7CisJY2FzZSBUUklHX0ZPTExPVzoKKwkJYnJlYWs7CisJY2FzZSBUUklHX1RJTUVSOgorCQkvLyBzZXQgYSBjb250ZXIgdG8gZ2VuZXJhdGUgYWRjIHRyaWdnZXIgYXQgc2Nhbl9iZWdpbl9hcmcgaW50ZXJ2YWwKKwkJayA9ICZlbmNwcml2WzVdOworCQl0aWNrID0gczYyNl9uc190b190aW1lcigoaW50ICopJmNtZC0+c2Nhbl9iZWdpbl9hcmcsCisJCQljbWQtPmZsYWdzICYgVFJJR19ST1VORF9NQVNLKTsKKworCQkvL2xvYWQgdGltZXIgdmFsdWUgYW5kIGVuYWJsZSBpbnRlcnJ1cHQKKwkJczYyNl90aW1lcl9sb2FkKGRldiwgaywgdGljayk7CisJCWstPlNldEVuYWJsZShkZXYsIGssIENMS0VOQUJfQUxXQVlTKTsKKworCQlERUJVRygiczYyNl9haV9jbWQ6IHNjYW4gdHJpZ2dlciB0aW1lciBpcyBzZXQgd2l0aCB2YWx1ZSAlZFxuIiwKKwkJCXRpY2spOworCisJCWJyZWFrOworCWNhc2UgVFJJR19FWFQ6CisJCS8vIHNldCB0aGUgZGlnaXRhbCBsaW5lIGFuZCBpbnRlcnJ1cHQgZm9yIHNjYW4gdHJpZ2dlcgorCQlpZiAoY21kLT5zdGFydF9zcmMgIT0gVFJJR19FWFQpCisJCQlzNjI2X2Rpb19zZXRfaXJxKGRldiwgY21kLT5zY2FuX2JlZ2luX2FyZyk7CisKKwkJREVCVUcoInM2MjZfYWlfY21kOiBFeHRlcm5hbCBzY2FuIHRyaWdnZXIgaXMgc2V0ISEhXG4iKTsKKworCQlicmVhazsKKwl9CisKKwlzd2l0Y2ggKGNtZC0+Y29udmVydF9zcmMpIHsKKwljYXNlIFRSSUdfTk9XOgorCQlicmVhazsKKwljYXNlIFRSSUdfVElNRVI6CisJCS8vIHNldCBhIGNvbnRlciB0byBnZW5lcmF0ZSBhZGMgdHJpZ2dlciBhdCBjb252ZXJ0X2FyZyBpbnRlcnZhbAorCQlrID0gJmVuY3ByaXZbNF07CisJCXRpY2sgPSBzNjI2X25zX3RvX3RpbWVyKChpbnQgKikmY21kLT5jb252ZXJ0X2FyZywKKwkJCWNtZC0+ZmxhZ3MgJiBUUklHX1JPVU5EX01BU0spOworCisJCS8vbG9hZCB0aW1lciB2YWx1ZSBhbmQgZW5hYmxlIGludGVycnVwdAorCQlzNjI2X3RpbWVyX2xvYWQoZGV2LCBrLCB0aWNrKTsKKwkJay0+U2V0RW5hYmxlKGRldiwgaywgQ0xLRU5BQl9JTkRFWCk7CisKKwkJREVCVUcoInM2MjZfYWlfY21kOiBjb252ZXJ0IHRyaWdnZXIgdGltZXIgaXMgc2V0IHdpdGggdmFsdWUgJWRcbiIsIHRpY2spOworCQlicmVhazsKKwljYXNlIFRSSUdfRVhUOgorCQkvLyBzZXQgdGhlIGRpZ2l0YWwgbGluZSBhbmQgaW50ZXJydXB0IGZvciBjb252ZXJ0IHRyaWdnZXIKKwkJaWYgKGNtZC0+c2Nhbl9iZWdpbl9zcmMgIT0gVFJJR19FWFQKKwkJCSYmIGNtZC0+c3RhcnRfc3JjID09IFRSSUdfRVhUKQorCQkJczYyNl9kaW9fc2V0X2lycShkZXYsIGNtZC0+Y29udmVydF9hcmcpOworCisJCURFQlVHKCJzNjI2X2FpX2NtZDogRXh0ZXJuYWwgY29udmVydCB0cmlnZ2VyIGlzIHNldCEhIVxuIik7CisKKwkJYnJlYWs7CisJfQorCisJc3dpdGNoIChjbWQtPnN0b3Bfc3JjKSB7CisJY2FzZSBUUklHX0NPVU5UOgorCQkvLyBkYXRhIGFycml2ZXMgYXMgb25lIHBhY2tldAorCQlkZXZwcml2LT5haV9zYW1wbGVfY291bnQgPSBjbWQtPnN0b3BfYXJnOworCQlkZXZwcml2LT5haV9jb250aW5vdXMgPSAwOworCQlicmVhazsKKwljYXNlIFRSSUdfTk9ORToKKwkJLy8gY29udGlub3VzIGFxdWlzaXRpb24KKwkJZGV2cHJpdi0+YWlfY29udGlub3VzID0gMTsKKwkJZGV2cHJpdi0+YWlfc2FtcGxlX2NvdW50ID0gMDsKKwkJYnJlYWs7CisJfQorCisJUmVzZXRBREMoZGV2LCBwcGwpOworCisJc3dpdGNoIChjbWQtPnN0YXJ0X3NyYykgeworCWNhc2UgVFJJR19OT1c6CisJCS8vIFRyaWdnZXIgQURDIHNjYW4gbG9vcCBzdGFydCBieSBzZXR0aW5nIFJQUyBTaWduYWwgMC4KKwkJLy8gTUNfRU5BQkxFKCBQX01DMiwgTUMyX0FEQ19SUFMgKTsKKworCQkvLyBTdGFydCBleGVjdXRpbmcgdGhlIFJQUyBwcm9ncmFtLgorCQlNQ19FTkFCTEUoUF9NQzEsIE1DMV9FUlBTMSk7CisKKwkJREVCVUcoInM2MjZfYWlfY21kOiBBREMgdHJpZ2dlcmVkXG4iKTsKKwkJcy0+YXN5bmMtPmludHRyaWcgPSBOVUxMOworCQlicmVhazsKKwljYXNlIFRSSUdfRVhUOgorCQkvL2NvbmZpZ3VyZSBESU8gY2hhbm5lbCBmb3IgYWNxdWlzaXRpb24gdHJpZ2dlcgorCQlzNjI2X2Rpb19zZXRfaXJxKGRldiwgY21kLT5zdGFydF9hcmcpOworCisJCURFQlVHKCJzNjI2X2FpX2NtZDogRXh0ZXJuYWwgc3RhcnQgdHJpZ2dlciBpcyBzZXQhISFcbiIpOworCisJCXMtPmFzeW5jLT5pbnR0cmlnID0gTlVMTDsKKwkJYnJlYWs7CisJY2FzZSBUUklHX0lOVDoKKwkJcy0+YXN5bmMtPmludHRyaWcgPSBzNjI2X2FpX2ludHRyaWc7CisJCWJyZWFrOworCX0KKworCS8vZW5hYmxlIGludGVycnVwdAorCXdyaXRlbChJUlFfR1BJTzMgfCBJUlFfUlBTMSwgZGV2cHJpdi0+YmFzZV9hZGRyICsgUF9JRVIpOworCisJREVCVUcoInM2MjZfYWlfY21kOiBjb21tYW5kIGZ1bmN0aW9uIHRlcm1pbmF0ZWRcbiIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgczYyNl9haV9jbWR0ZXN0KGNvbWVkaV9kZXZpY2UgKiBkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKiBzLAorCWNvbWVkaV9jbWQgKiBjbWQpCit7CisJaW50IGVyciA9IDA7CisJaW50IHRtcDsKKworCS8qIGNtZHRlc3QgdGVzdHMgYSBwYXJ0aWN1bGFyIGNvbW1hbmQgdG8gc2VlIGlmIGl0IGlzIHZhbGlkLiAgVXNpbmcKKwkgKiB0aGUgY21kdGVzdCBpb2N0bCwgYSB1c2VyIGNhbiBjcmVhdGUgYSB2YWxpZCBjbWQgYW5kIHRoZW4gaGF2ZSBpdAorCSAqIGV4ZWN1dGVzIGJ5IHRoZSBjbWQgaW9jdGwuCisJICoKKwkgKiBjbWR0ZXN0IHJldHVybnMgMSwyLDMsNCBvciAwLCBkZXBlbmRpbmcgb24gd2hpY2ggdGVzdHMgdGhlCisJICogY29tbWFuZCBwYXNzZXMuICovCisKKwkvKiBzdGVwIDE6IG1ha2Ugc3VyZSB0cmlnZ2VyIHNvdXJjZXMgYXJlIHRyaXZpYWxseSB2YWxpZCAqLworCisJdG1wID0gY21kLT5zdGFydF9zcmM7CisJY21kLT5zdGFydF9zcmMgJj0gVFJJR19OT1cgfCBUUklHX0lOVCB8IFRSSUdfRVhUOworCWlmICghY21kLT5zdGFydF9zcmMgfHwgdG1wICE9IGNtZC0+c3RhcnRfc3JjKQorCQllcnIrKzsKKworCXRtcCA9IGNtZC0+c2Nhbl9iZWdpbl9zcmM7CisJY21kLT5zY2FuX2JlZ2luX3NyYyAmPSBUUklHX1RJTUVSIHwgVFJJR19FWFQgfCBUUklHX0ZPTExPVzsKKwlpZiAoIWNtZC0+c2Nhbl9iZWdpbl9zcmMgfHwgdG1wICE9IGNtZC0+c2Nhbl9iZWdpbl9zcmMpCisJCWVycisrOworCisJdG1wID0gY21kLT5jb252ZXJ0X3NyYzsKKwljbWQtPmNvbnZlcnRfc3JjICY9IFRSSUdfVElNRVIgfCBUUklHX0VYVCB8IFRSSUdfTk9XOworCWlmICghY21kLT5jb252ZXJ0X3NyYyB8fCB0bXAgIT0gY21kLT5jb252ZXJ0X3NyYykKKwkJZXJyKys7CisKKwl0bXAgPSBjbWQtPnNjYW5fZW5kX3NyYzsKKwljbWQtPnNjYW5fZW5kX3NyYyAmPSBUUklHX0NPVU5UOworCWlmICghY21kLT5zY2FuX2VuZF9zcmMgfHwgdG1wICE9IGNtZC0+c2Nhbl9lbmRfc3JjKQorCQllcnIrKzsKKworCXRtcCA9IGNtZC0+c3RvcF9zcmM7CisJY21kLT5zdG9wX3NyYyAmPSBUUklHX0NPVU5UIHwgVFJJR19OT05FOworCWlmICghY21kLT5zdG9wX3NyYyB8fCB0bXAgIT0gY21kLT5zdG9wX3NyYykKKwkJZXJyKys7CisKKwlpZiAoZXJyKQorCQlyZXR1cm4gMTsKKworCS8qIHN0ZXAgMjogbWFrZSBzdXJlIHRyaWdnZXIgc291cmNlcyBhcmUgdW5pcXVlIGFuZCBtdXR1YWxseQorCSAgIGNvbXBhdGlibGUgKi8KKworCS8qIG5vdGUgdGhhdCBtdXR1YWwgY29tcGF0aWJsaXR5IGlzIG5vdCBhbiBpc3N1ZSBoZXJlICovCisJaWYgKGNtZC0+c2Nhbl9iZWdpbl9zcmMgIT0gVFJJR19USU1FUiAmJgorCQljbWQtPnNjYW5fYmVnaW5fc3JjICE9IFRSSUdfRVhUCisJCSYmIGNtZC0+c2Nhbl9iZWdpbl9zcmMgIT0gVFJJR19GT0xMT1cpCisJCWVycisrOworCWlmIChjbWQtPmNvbnZlcnRfc3JjICE9IFRSSUdfVElNRVIgJiYKKwkJY21kLT5jb252ZXJ0X3NyYyAhPSBUUklHX0VYVCAmJiBjbWQtPmNvbnZlcnRfc3JjICE9IFRSSUdfTk9XKQorCQllcnIrKzsKKwlpZiAoY21kLT5zdG9wX3NyYyAhPSBUUklHX0NPVU5UICYmIGNtZC0+c3RvcF9zcmMgIT0gVFJJR19OT05FKQorCQllcnIrKzsKKworCWlmIChlcnIpCisJCXJldHVybiAyOworCisJLyogc3RlcCAzOiBtYWtlIHN1cmUgYXJndW1lbnRzIGFyZSB0cml2aWFsbHkgY29tcGF0aWJsZSAqLworCisJaWYgKGNtZC0+c3RhcnRfc3JjICE9IFRSSUdfRVhUICYmIGNtZC0+c3RhcnRfYXJnICE9IDApIHsKKwkJY21kLT5zdGFydF9hcmcgPSAwOworCQllcnIrKzsKKwl9CisKKwlpZiAoY21kLT5zdGFydF9zcmMgPT0gVFJJR19FWFQgJiYgY21kLT5zdGFydF9hcmcgPCAwKSB7CisJCWNtZC0+c3RhcnRfYXJnID0gMDsKKwkJZXJyKys7CisJfQorCisJaWYgKGNtZC0+c3RhcnRfc3JjID09IFRSSUdfRVhUICYmIGNtZC0+c3RhcnRfYXJnID4gMzkpIHsKKwkJY21kLT5zdGFydF9hcmcgPSAzOTsKKwkJZXJyKys7CisJfQorCisJaWYgKGNtZC0+c2Nhbl9iZWdpbl9zcmMgPT0gVFJJR19FWFQgJiYgY21kLT5zY2FuX2JlZ2luX2FyZyA8IDApIHsKKwkJY21kLT5zY2FuX2JlZ2luX2FyZyA9IDA7CisJCWVycisrOworCX0KKworCWlmIChjbWQtPnNjYW5fYmVnaW5fc3JjID09IFRSSUdfRVhUICYmIGNtZC0+c2Nhbl9iZWdpbl9hcmcgPiAzOSkgeworCQljbWQtPnNjYW5fYmVnaW5fYXJnID0gMzk7CisJCWVycisrOworCX0KKworCWlmIChjbWQtPmNvbnZlcnRfc3JjID09IFRSSUdfRVhUICYmIGNtZC0+Y29udmVydF9hcmcgPCAwKSB7CisJCWNtZC0+Y29udmVydF9hcmcgPSAwOworCQllcnIrKzsKKwl9CisKKwlpZiAoY21kLT5jb252ZXJ0X3NyYyA9PSBUUklHX0VYVCAmJiBjbWQtPmNvbnZlcnRfYXJnID4gMzkpIHsKKwkJY21kLT5jb252ZXJ0X2FyZyA9IDM5OworCQllcnIrKzsKKwl9CisjZGVmaW5lIE1BWF9TUEVFRAkyMDAwMDAJLyogaW4gbmFub3NlY29uZHMgKi8KKyNkZWZpbmUgTUlOX1NQRUVECTIwMDAwMDAwMDAJLyogaW4gbmFub3NlY29uZHMgKi8KKworCWlmIChjbWQtPnNjYW5fYmVnaW5fc3JjID09IFRSSUdfVElNRVIpIHsKKwkJaWYgKGNtZC0+c2Nhbl9iZWdpbl9hcmcgPCBNQVhfU1BFRUQpIHsKKwkJCWNtZC0+c2Nhbl9iZWdpbl9hcmcgPSBNQVhfU1BFRUQ7CisJCQllcnIrKzsKKwkJfQorCQlpZiAoY21kLT5zY2FuX2JlZ2luX2FyZyA+IE1JTl9TUEVFRCkgeworCQkJY21kLT5zY2FuX2JlZ2luX2FyZyA9IE1JTl9TUEVFRDsKKwkJCWVycisrOworCQl9CisJfSBlbHNlIHsKKwkJLyogZXh0ZXJuYWwgdHJpZ2dlciAqLworCQkvKiBzaG91bGQgYmUgbGV2ZWwvZWRnZSwgaGkvbG8gc3BlY2lmaWNhdGlvbiBoZXJlICovCisJCS8qIHNob3VsZCBzcGVjaWZ5IG11bHRpcGxlIGV4dGVybmFsIHRyaWdnZXJzICovCisvKiAgICAgaWYoY21kLT5zY2FuX2JlZ2luX2FyZz45KXsgKi8KKy8qICAgICAgIGNtZC0+c2Nhbl9iZWdpbl9hcmc9OTsgKi8KKy8qICAgICAgIGVycisrOyAqLworLyogICAgIH0gKi8KKwl9CisJaWYgKGNtZC0+Y29udmVydF9zcmMgPT0gVFJJR19USU1FUikgeworCQlpZiAoY21kLT5jb252ZXJ0X2FyZyA8IE1BWF9TUEVFRCkgeworCQkJY21kLT5jb252ZXJ0X2FyZyA9IE1BWF9TUEVFRDsKKwkJCWVycisrOworCQl9CisJCWlmIChjbWQtPmNvbnZlcnRfYXJnID4gTUlOX1NQRUVEKSB7CisJCQljbWQtPmNvbnZlcnRfYXJnID0gTUlOX1NQRUVEOworCQkJZXJyKys7CisJCX0KKwl9IGVsc2UgeworCQkvKiBleHRlcm5hbCB0cmlnZ2VyICovCisJCS8qIHNlZSBhYm92ZSAqLworLyogICAgIGlmKGNtZC0+Y29udmVydF9hcmc+OSl7ICovCisvKiAgICAgICBjbWQtPmNvbnZlcnRfYXJnPTk7ICovCisvKiAgICAgICBlcnIrKzsgKi8KKy8qICAgICB9ICovCisJfQorCisJaWYgKGNtZC0+c2Nhbl9lbmRfYXJnICE9IGNtZC0+Y2hhbmxpc3RfbGVuKSB7CisJCWNtZC0+c2Nhbl9lbmRfYXJnID0gY21kLT5jaGFubGlzdF9sZW47CisJCWVycisrOworCX0KKwlpZiAoY21kLT5zdG9wX3NyYyA9PSBUUklHX0NPVU5UKSB7CisJCWlmIChjbWQtPnN0b3BfYXJnID4gMHgwMGZmZmZmZikgeworCQkJY21kLT5zdG9wX2FyZyA9IDB4MDBmZmZmZmY7CisJCQllcnIrKzsKKwkJfQorCX0gZWxzZSB7CisJCS8qIFRSSUdfTk9ORSAqLworCQlpZiAoY21kLT5zdG9wX2FyZyAhPSAwKSB7CisJCQljbWQtPnN0b3BfYXJnID0gMDsKKwkJCWVycisrOworCQl9CisJfQorCisJaWYgKGVycikKKwkJcmV0dXJuIDM7CisKKwkvKiBzdGVwIDQ6IGZpeCB1cCBhbnkgYXJndW1lbnRzICovCisKKwlpZiAoY21kLT5zY2FuX2JlZ2luX3NyYyA9PSBUUklHX1RJTUVSKSB7CisJCXRtcCA9IGNtZC0+c2Nhbl9iZWdpbl9hcmc7CisJCXM2MjZfbnNfdG9fdGltZXIoKGludCAqKSZjbWQtPnNjYW5fYmVnaW5fYXJnLAorCQkJY21kLT5mbGFncyAmIFRSSUdfUk9VTkRfTUFTSyk7CisJCWlmICh0bXAgIT0gY21kLT5zY2FuX2JlZ2luX2FyZykKKwkJCWVycisrOworCX0KKwlpZiAoY21kLT5jb252ZXJ0X3NyYyA9PSBUUklHX1RJTUVSKSB7CisJCXRtcCA9IGNtZC0+Y29udmVydF9hcmc7CisJCXM2MjZfbnNfdG9fdGltZXIoKGludCAqKSZjbWQtPmNvbnZlcnRfYXJnLAorCQkJY21kLT5mbGFncyAmIFRSSUdfUk9VTkRfTUFTSyk7CisJCWlmICh0bXAgIT0gY21kLT5jb252ZXJ0X2FyZykKKwkJCWVycisrOworCQlpZiAoY21kLT5zY2FuX2JlZ2luX3NyYyA9PSBUUklHX1RJTUVSICYmCisJCQljbWQtPnNjYW5fYmVnaW5fYXJnIDwKKwkJCWNtZC0+Y29udmVydF9hcmcgKiBjbWQtPnNjYW5fZW5kX2FyZykgeworCQkJY21kLT5zY2FuX2JlZ2luX2FyZyA9CisJCQkJY21kLT5jb252ZXJ0X2FyZyAqIGNtZC0+c2Nhbl9lbmRfYXJnOworCQkJZXJyKys7CisJCX0KKwl9CisKKwlpZiAoZXJyKQorCQlyZXR1cm4gNDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHM2MjZfYWlfY2FuY2VsKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKiBzKQoreworCS8vIFN0b3AgUlBTIHByb2dyYW0gaW4gY2FzZSBpdCBpcyBjdXJyZW50bHkgcnVubmluZy4KKwlNQ19ESVNBQkxFKFBfTUMxLCBNQzFfRVJQUzEpOworCisJLy9kaXNhYmxlIG1hc3RlciBpbnRlcnJ1cHQKKwl3cml0ZWwoMCwgZGV2cHJpdi0+YmFzZV9hZGRyICsgUF9JRVIpOworCisJZGV2cHJpdi0+YWlfY21kX3J1bm5pbmcgPSAwOworCisJcmV0dXJuIDA7Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gZG9lc24ndCByZXF1aXJlIGEgcGFydGljdWxhciBmb3JtLCB0aGlzIGlzIGp1c3Qgd2hhdAorICogaGFwcGVucyB0byBiZSB1c2VkIGluIHNvbWUgb2YgdGhlIGRyaXZlcnMuICBJdCBzaG91bGQgY29udmVydCBucworICogbmFub3NlY29uZHMgdG8gYSBjb3VudGVyIHZhbHVlIHN1aXRhYmxlIGZvciBwcm9ncmFtbWluZyB0aGUgZGV2aWNlLgorICogQWxzbywgaXQgc2hvdWxkIGFkanVzdCBucyBzbyB0aGF0IGl0IGNvb3Jlc3BvbmRzIHRvIHRoZSBhY3R1YWwgdGltZQorICogdGhhdCB0aGUgZGV2aWNlIHdpbGwgdXNlLiAqLworc3RhdGljIGludCBzNjI2X25zX3RvX3RpbWVyKGludCAqbmFub3NlYywgaW50IHJvdW5kX21vZGUpCit7CisJaW50IGRpdmlkZXIsIGJhc2U7CisKKwliYXNlID0gNTAwOwkJLy8yTUh6IGludGVybmFsIGNsb2NrCisKKwlzd2l0Y2ggKHJvdW5kX21vZGUpIHsKKwljYXNlIFRSSUdfUk9VTkRfTkVBUkVTVDoKKwlkZWZhdWx0OgorCQlkaXZpZGVyID0gKCpuYW5vc2VjICsgYmFzZSAvIDIpIC8gYmFzZTsKKwkJYnJlYWs7CisJY2FzZSBUUklHX1JPVU5EX0RPV046CisJCWRpdmlkZXIgPSAoKm5hbm9zZWMpIC8gYmFzZTsKKwkJYnJlYWs7CisJY2FzZSBUUklHX1JPVU5EX1VQOgorCQlkaXZpZGVyID0gKCpuYW5vc2VjICsgYmFzZSAtIDEpIC8gYmFzZTsKKwkJYnJlYWs7CisJfQorCisJKm5hbm9zZWMgPSBiYXNlICogZGl2aWRlcjsKKwlyZXR1cm4gZGl2aWRlciAtIDE7Cit9CisKK3N0YXRpYyBpbnQgczYyNl9hb193aW5zbihjb21lZGlfZGV2aWNlICogZGV2LCBjb21lZGlfc3ViZGV2aWNlICogcywKKwljb21lZGlfaW5zbiAqIGluc24sIGxzYW1wbF90ICogZGF0YSkKK3sKKworCWludCBpOworCXVpbnQxNl90IGNoYW4gPSBDUl9DSEFOKGluc24tPmNoYW5zcGVjKTsKKwlpbnQxNl90IGRhY2RhdGE7CisKKwlmb3IgKGkgPSAwOyBpIDwgaW5zbi0+bjsgaSsrKSB7CisJCWRhY2RhdGEgPSAoaW50MTZfdCkgZGF0YVtpXTsKKwkJZGV2cHJpdi0+YW9fcmVhZGJhY2tbQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyldID0gZGF0YVtpXTsKKwkJZGFjZGF0YSAtPSAoMHgxZmZmKTsKKworCQlTZXREQUMoZGV2LCBjaGFuLCBkYWNkYXRhKTsKKwl9CisKKwlyZXR1cm4gaTsKK30KKworc3RhdGljIGludCBzNjI2X2FvX3JpbnNuKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKiBzLAorCWNvbWVkaV9pbnNuICogaW5zbiwgbHNhbXBsX3QgKiBkYXRhKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGluc24tPm47IGkrKykgeworCQlkYXRhW2ldID0gZGV2cHJpdi0+YW9fcmVhZGJhY2tbQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyldOworCX0KKworCXJldHVybiBpOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLyAgRElHSVRBTCBJL08gRlVOQ1RJT05TICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBBbGwgRElPIGZ1bmN0aW9ucyBhZGRyZXNzIGEgZ3JvdXAgb2YgRElPIGNoYW5uZWxzIGJ5IG1lYW5zIG9mCisvLyAiZ3JvdXAiIGFyZ3VtZW50LiAgZ3JvdXAgbWF5IGJlIDAsIDEgb3IgMiwgd2hpY2ggY29ycmVzcG9uZCB0byBESU8KKy8vIHBvcnRzIEEsIEIgYW5kIEMsIHJlc3BlY3RpdmVseS4KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitzdGF0aWMgdm9pZCBzNjI2X2Rpb19pbml0KGNvbWVkaV9kZXZpY2UgKiBkZXYpCit7CisJdWludDE2X3QgZ3JvdXA7CisJY29tZWRpX3N1YmRldmljZSAqczsKKworCS8vIFByZXBhcmUgdG8gdHJlYXQgd3JpdGVzIHRvIFdSQ2FwU2VsIGFzIGNhcHR1cmUgZGlzYWJsZXMuCisJREVCSXdyaXRlKGRldiwgTFBfTUlTQzEsIE1JU0MxX05PRURDQVApOworCisJLy8gRm9yIGVhY2ggZ3JvdXAgb2Ygc2l4dGVlbiBjaGFubmVscyAuLi4KKwlmb3IgKGdyb3VwID0gMDsgZ3JvdXAgPCBTNjI2X0RJT19CQU5LUzsgZ3JvdXArKykgeworCQlzID0gZGV2LT5zdWJkZXZpY2VzICsgMiArIGdyb3VwOworCQlERUJJd3JpdGUoZGV2LCBkaW9wcml2LT5XUkludFNlbCwgMCk7CS8vIERpc2FibGUgYWxsIGludGVycnVwdHMuCisJCURFQkl3cml0ZShkZXYsIGRpb3ByaXYtPldSQ2FwU2VsLCAweEZGRkYpOwkvLyBEaXNhYmxlIGFsbCBldmVudAorCQkvLyBjYXB0dXJlcy4KKwkJREVCSXdyaXRlKGRldiwgZGlvcHJpdi0+V1JFZGdTZWwsIDApOwkvLyBJbml0IGFsbCBESU9zIHRvCisJCS8vIGRlZmF1bHQgZWRnZQorCQkvLyBwb2xhcml0eS4KKwkJREVCSXdyaXRlKGRldiwgZGlvcHJpdi0+V1JET3V0LCAwKTsJLy8gUHJvZ3JhbSBhbGwgb3V0cHV0cworCQkvLyB0byBpbmFjdGl2ZSBzdGF0ZS4KKwl9CisJREVCVUcoInM2MjZfZGlvX2luaXQ6IERJTyBpbml0aWFsaXplZCBcbiIpOworfQorCisvKiBESU8gZGV2aWNlcyBhcmUgc2xpZ2h0bHkgc3BlY2lhbC4gIEFsdGhvdWdoIGl0IGlzIHBvc3NpYmxlIHRvCisgKiBpbXBsZW1lbnQgdGhlIGluc25fcmVhZC9pbnNuX3dyaXRlIGludGVyZmFjZSwgaXQgaXMgbXVjaCBtb3JlCisgKiB1c2VmdWwgdG8gYXBwbGljYXRpb25zIGlmIHlvdSBpbXBsZW1lbnQgdGhlIGluc25fYml0cyBpbnRlcmZhY2UuCisgKiBUaGlzIGFsbG93cyBwYWNrZWQgcmVhZGluZy93cml0aW5nIG9mIHRoZSBESU8gY2hhbm5lbHMuICBUaGUgY29tZWRpCisgKiBjb3JlIGNhbiBjb252ZXJ0IGJldHdlZW4gaW5zbl9iaXRzIGFuZCBpbnNuX3JlYWQvd3JpdGUgKi8KKworc3RhdGljIGludCBzNjI2X2Rpb19pbnNuX2JpdHMoY29tZWRpX2RldmljZSAqIGRldiwgY29tZWRpX3N1YmRldmljZSAqIHMsCisJY29tZWRpX2luc24gKiBpbnNuLCBsc2FtcGxfdCAqIGRhdGEpCit7CisKKwkvKiBMZW5ndGggb2YgZGF0YSBtdXN0IGJlIDIgKG1hc2sgYW5kIG5ldyBkYXRhLCBzZWUgYmVsb3cpICovCisJaWYgKGluc24tPm4gPT0gMCkgeworCQlyZXR1cm4gMDsKKwl9CisJaWYgKGluc24tPm4gIT0gMikgeworCQlwcmludGsoImNvbWVkaSVkOiBzNjI2OiBzNjI2X2Rpb19pbnNuX2JpdHMoKTogSW52YWxpZCBpbnN0cnVjdGlvbiBsZW5ndGhcbiIsIGRldi0+bWlub3IpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKgorCSAqIFRoZSBpbnNuIGRhdGEgY29uc2lzdHMgb2YgYSBtYXNrIGluIGRhdGFbMF0gYW5kIHRoZSBuZXcgZGF0YSBpbgorCSAqIGRhdGFbMV0uIFRoZSBtYXNrIGRlZmluZXMgd2hpY2ggYml0cyB3ZSBhcmUgY29uY2VybmluZyBhYm91dC4KKwkgKiBUaGUgbmV3IGRhdGEgbXVzdCBiZSBhbmRlZCB3aXRoIHRoZSBtYXNrLiAgRWFjaCBjaGFubmVsCisJICogY29ycmVzcG9uZHMgdG8gYSBiaXQuCisJICovCisJaWYgKGRhdGFbMF0pIHsKKwkJLyogQ2hlY2sgaWYgcmVxdWVzdGVkIHBvcnRzIGFyZSBjb25maWd1cmVkIGZvciBvdXRwdXQgKi8KKwkJaWYgKChzLT5pb19iaXRzICYgZGF0YVswXSkgIT0gZGF0YVswXSkKKwkJCXJldHVybiAtRUlPOworCisJCXMtPnN0YXRlICY9IH5kYXRhWzBdOworCQlzLT5zdGF0ZSB8PSBkYXRhWzBdICYgZGF0YVsxXTsKKworCQkvKiBXcml0ZSBvdXQgdGhlIG5ldyBkaWdpdGFsIG91dHB1dCBsaW5lcyAqLworCisJCURFQkl3cml0ZShkZXYsIGRpb3ByaXYtPldSRE91dCwgcy0+c3RhdGUpOworCX0KKwlkYXRhWzFdID0gREVCSXJlYWQoZGV2LCBkaW9wcml2LT5SRERJbik7CisKKwlyZXR1cm4gMjsKK30KKworc3RhdGljIGludCBzNjI2X2Rpb19pbnNuX2NvbmZpZyhjb21lZGlfZGV2aWNlICogZGV2LCBjb21lZGlfc3ViZGV2aWNlICogcywKKwljb21lZGlfaW5zbiAqIGluc24sIGxzYW1wbF90ICogZGF0YSkKK3sKKworCXN3aXRjaCAoZGF0YVswXSkgeworCWNhc2UgSU5TTl9DT05GSUdfRElPX1FVRVJZOgorCQlkYXRhWzFdID0KKwkJCShzLT5pb19iaXRzICYgKDEgPDwgQ1JfQ0hBTihpbnNuLT4KKwkJCQkJY2hhbnNwZWMpKSkgPyBDT01FRElfT1VUUFVUIDoKKwkJCUNPTUVESV9JTlBVVDsKKwkJcmV0dXJuIGluc24tPm47CisJCWJyZWFrOworCWNhc2UgQ09NRURJX0lOUFVUOgorCQlzLT5pb19iaXRzICY9IH4oMSA8PCBDUl9DSEFOKGluc24tPmNoYW5zcGVjKSk7CisJCWJyZWFrOworCWNhc2UgQ09NRURJX09VVFBVVDoKKwkJcy0+aW9fYml0cyB8PSAxIDw8IENSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwkJYnJlYWs7CisJfQorCURFQkl3cml0ZShkZXYsIGRpb3ByaXYtPldSRE91dCwgcy0+aW9fYml0cyk7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBzNjI2X2Rpb19zZXRfaXJxKGNvbWVkaV9kZXZpY2UgKiBkZXYsIHVuc2lnbmVkIGludCBjaGFuKQoreworCXVuc2lnbmVkIGludCBncm91cDsKKwl1bnNpZ25lZCBpbnQgYml0bWFzazsKKwl1bnNpZ25lZCBpbnQgc3RhdHVzOworCisJLy9zZWxlY3QgZGlvIGJhbmsKKwlncm91cCA9IGNoYW4gLyAxNjsKKwliaXRtYXNrID0gMSA8PCAoY2hhbiAtICgxNiAqIGdyb3VwKSk7CisJREVCVUcoInM2MjZfZGlvX3NldF9pcnE6IGVuYWJsZSBpbnRlcnJ1cHQgb24gZGlvIGNoYW5uZWwgJWQgZ3JvdXAgJWRcbiIsCisJCWNoYW4gLSAoMTYgKiBncm91cCksIGdyb3VwKTsKKworCS8vc2V0IGNoYW5uZWwgdG8gY2FwdHVyZSBwb3NpdGl2ZSBlZGdlCisJc3RhdHVzID0gREVCSXJlYWQoZGV2LAorCQkoKGRpb19wcml2YXRlICopIChkZXYtPnN1YmRldmljZXMgKyAyICsKKwkJCQlncm91cCktPnByaXZhdGUpLT5SREVkZ1NlbCk7CisJREVCSXdyaXRlKGRldiwKKwkJKChkaW9fcHJpdmF0ZSAqKSAoZGV2LT5zdWJkZXZpY2VzICsgMiArCisJCQkJZ3JvdXApLT5wcml2YXRlKS0+V1JFZGdTZWwsIGJpdG1hc2sgfCBzdGF0dXMpOworCisJLy9lbmFibGUgaW50ZXJydXB0IG9uIHNlbGVjdGVkIGNoYW5uZWwKKwlzdGF0dXMgPSBERUJJcmVhZChkZXYsCisJCSgoZGlvX3ByaXZhdGUgKikgKGRldi0+c3ViZGV2aWNlcyArIDIgKworCQkJCWdyb3VwKS0+cHJpdmF0ZSktPlJESW50U2VsKTsKKwlERUJJd3JpdGUoZGV2LAorCQkoKGRpb19wcml2YXRlICopIChkZXYtPnN1YmRldmljZXMgKyAyICsKKwkJCQlncm91cCktPnByaXZhdGUpLT5XUkludFNlbCwgYml0bWFzayB8IHN0YXR1cyk7CisKKwkvL2VuYWJsZSBlZGdlIGNhcHR1cmUgd3JpdGUgY29tbWFuZAorCURFQkl3cml0ZShkZXYsIExQX01JU0MxLCBNSVNDMV9FRENBUCk7CisKKwkvL2VuYWJsZSBlZGdlIGNhcHR1cmUgb24gc2VsZWN0ZWQgY2hhbm5lbAorCXN0YXR1cyA9IERFQklyZWFkKGRldiwKKwkJKChkaW9fcHJpdmF0ZSAqKSAoZGV2LT5zdWJkZXZpY2VzICsgMiArCisJCQkJZ3JvdXApLT5wcml2YXRlKS0+UkRDYXBTZWwpOworCURFQkl3cml0ZShkZXYsCisJCSgoZGlvX3ByaXZhdGUgKikgKGRldi0+c3ViZGV2aWNlcyArIDIgKworCQkJCWdyb3VwKS0+cHJpdmF0ZSktPldSQ2FwU2VsLCBiaXRtYXNrIHwgc3RhdHVzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHM2MjZfZGlvX3Jlc2V0X2lycShjb21lZGlfZGV2aWNlICogZGV2LCB1bnNpZ25lZCBpbnQgZ3JvdXAsCisJdW5zaWduZWQgaW50IG1hc2spCit7CisJREVCVUcoInM2MjZfZGlvX3Jlc2V0X2lycTogZGlzYWJsZSAgaW50ZXJydXB0IG9uIGRpbyBjaGFubmVsICVkIGdyb3VwICVkXG4iLCBtYXNrLCBncm91cCk7CisKKwkvL2Rpc2FibGUgZWRnZSBjYXB0dXJlIHdyaXRlIGNvbW1hbmQKKwlERUJJd3JpdGUoZGV2LCBMUF9NSVNDMSwgTUlTQzFfTk9FRENBUCk7CisKKwkvL2VuYWJsZSBlZGdlIGNhcHR1cmUgb24gc2VsZWN0ZWQgY2hhbm5lbAorCURFQkl3cml0ZShkZXYsCisJCSgoZGlvX3ByaXZhdGUgKikgKGRldi0+c3ViZGV2aWNlcyArIDIgKworCQkJCWdyb3VwKS0+cHJpdmF0ZSktPldSQ2FwU2VsLCBtYXNrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHM2MjZfZGlvX2NsZWFyX2lycShjb21lZGlfZGV2aWNlICogZGV2KQoreworCXVuc2lnbmVkIGludCBncm91cDsKKworCS8vZGlzYWJsZSBlZGdlIGNhcHR1cmUgd3JpdGUgY29tbWFuZAorCURFQkl3cml0ZShkZXYsIExQX01JU0MxLCBNSVNDMV9OT0VEQ0FQKTsKKworCWZvciAoZ3JvdXAgPSAwOyBncm91cCA8IFM2MjZfRElPX0JBTktTOyBncm91cCsrKSB7CisJCS8vY2xlYXIgcGVuZGluZyBldmVudHMgYW5kIGludGVycnVwdAorCQlERUJJd3JpdGUoZGV2LAorCQkJKChkaW9fcHJpdmF0ZSAqKSAoZGV2LT5zdWJkZXZpY2VzICsgMiArCisJCQkJCWdyb3VwKS0+cHJpdmF0ZSktPldSQ2FwU2VsLCAweGZmZmYpOworCX0KKworCXJldHVybiAwOworfQorCisvKiBOb3cgdGhpcyBmdW5jdGlvbiBpbml0aWFsaXplcyB0aGUgdmFsdWUgb2YgdGhlIGNvdW50ZXIgKGRhdGFbMF0pCisgICBhbmQgc2V0IHRoZSBzdWJkZXZpY2UuIFRvIGNvbXBsZXRlIHdpdGggdHJpZ2dlciBhbmQgaW50ZXJydXB0CisgICBjb25maWd1cmF0aW9uICovCitzdGF0aWMgaW50IHM2MjZfZW5jX2luc25fY29uZmlnKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKiBzLAorCWNvbWVkaV9pbnNuICogaW5zbiwgbHNhbXBsX3QgKiBkYXRhKQoreworCXVpbnQxNl90IFNldHVwID0gKExPQURTUkNfSU5EWCA8PCBCRl9MT0FEU1JDKSB8CS8vIFByZWxvYWQgdXBvbgorCQkvLyBpbmRleC4KKwkJKElORFhTUkNfU09GVCA8PCBCRl9JTkRYU1JDKSB8CS8vIERpc2FibGUgaGFyZHdhcmUgaW5kZXguCisJCShDTEtTUkNfQ09VTlRFUiA8PCBCRl9DTEtTUkMpIHwJLy8gT3BlcmF0aW5nIG1vZGUgaXMgQ291bnRlci4KKwkJKENMS1BPTF9QT1MgPDwgQkZfQ0xLUE9MKSB8CS8vIEFjdGl2ZSBoaWdoIGNsb2NrLgorCQkvLyggQ05URElSX1VQIDw8IEJGX0NMS1BPTCApIHwgICAgICAvLyBDb3VudCBkaXJlY3Rpb24gaXMgRG93bi4KKwkJKENMS01VTFRfMVggPDwgQkZfQ0xLTVVMVCkgfAkvLyBDbG9jayBtdWx0aXBsaWVyIGlzIDF4LgorCQkoQ0xLRU5BQl9JTkRFWCA8PCBCRl9DTEtFTkFCKTsKKwkvKiAgIHVpbnQxNl90IERpc2FibGVJbnRTcmM9VFJVRTsgKi8KKwkvLyB1aW50MzJfdCBQcmVsb2FkdmFsdWU7ICAgICAgICAgICAgICAvL0NvdW50ZXIgaW5pdGlhbCB2YWx1ZQorCXVpbnQxNl90IHZhbHVlU3JjbGF0Y2ggPSBMQVRDSFNSQ19BQl9SRUFEOworCXVpbnQxNl90IGVuYWIgPSBDTEtFTkFCX0FMV0FZUzsKKwllbmNfcHJpdmF0ZSAqayA9ICZlbmNwcml2W0NSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpXTsKKworCURFQlVHKCJzNjI2X2VuY19pbnNuX2NvbmZpZzogZW5jb2RlciBjb25maWdcbiIpOworCisJLy8gIChkYXRhPT1OVUxMKSA/IChQcmVsb2FkdmFsdWU9MCkgOiAoUHJlbG9hZHZhbHVlPWRhdGFbMF0pOworCisJay0+U2V0TW9kZShkZXYsIGssIFNldHVwLCBUUlVFKTsKKwlQcmVsb2FkKGRldiwgaywgKihpbnNuLT5kYXRhKSk7CisJay0+UHVsc2VJbmRleChkZXYsIGspOworCVNldExhdGNoU291cmNlKGRldiwgaywgdmFsdWVTcmNsYXRjaCk7CisJay0+U2V0RW5hYmxlKGRldiwgaywgKHVpbnQxNl90KSAoZW5hYiAhPSAwKSk7CisKKwlyZXR1cm4gaW5zbi0+bjsKK30KKworc3RhdGljIGludCBzNjI2X2VuY19pbnNuX3JlYWQoY29tZWRpX2RldmljZSAqIGRldiwgY29tZWRpX3N1YmRldmljZSAqIHMsCisJY29tZWRpX2luc24gKiBpbnNuLCBsc2FtcGxfdCAqIGRhdGEpCit7CisKKwlpbnQgbjsKKwllbmNfcHJpdmF0ZSAqayA9ICZlbmNwcml2W0NSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpXTsKKworCURFQlVHKCJzNjI2X2VuY19pbnNuX3JlYWQ6IGVuY29kZXIgcmVhZCBjaGFubmVsICVkIFxuIiwKKwkJQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYykpOworCisJZm9yIChuID0gMDsgbiA8IGluc24tPm47IG4rKykKKwkJZGF0YVtuXSA9IFJlYWRMYXRjaChkZXYsIGspOworCisJREVCVUcoInM2MjZfZW5jX2luc25fcmVhZDogZW5jb2RlciBzYW1wbGUgJWRcbiIsIGRhdGFbbl0pOworCisJcmV0dXJuIG47Cit9CisKK3N0YXRpYyBpbnQgczYyNl9lbmNfaW5zbl93cml0ZShjb21lZGlfZGV2aWNlICogZGV2LCBjb21lZGlfc3ViZGV2aWNlICogcywKKwljb21lZGlfaW5zbiAqIGluc24sIGxzYW1wbF90ICogZGF0YSkKK3sKKworCWVuY19wcml2YXRlICprID0gJmVuY3ByaXZbQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyldOworCisJREVCVUcoInM2MjZfZW5jX2luc25fd3JpdGU6IGVuY29kZXIgd3JpdGUgY2hhbm5lbCAlZCBcbiIsCisJCUNSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpKTsKKworCS8vIFNldCB0aGUgcHJlbG9hZCByZWdpc3RlcgorCVByZWxvYWQoZGV2LCBrLCBkYXRhWzBdKTsKKworCS8vIFNvZnR3YXJlIGluZGV4IHB1bHNlIGZvcmNlcyB0aGUgcHJlbG9hZCByZWdpc3RlciB0byBsb2FkCisJLy8gaW50byB0aGUgY291bnRlcgorCWstPlNldExvYWRUcmlnKGRldiwgaywgMCk7CisJay0+UHVsc2VJbmRleChkZXYsIGspOworCWstPlNldExvYWRUcmlnKGRldiwgaywgMik7CisKKwlERUJVRygiczYyNl9lbmNfaW5zbl93cml0ZTogRW5kIGVuY29kZXIgd3JpdGVcbiIpOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIHM2MjZfdGltZXJfbG9hZChjb21lZGlfZGV2aWNlICogZGV2LCBlbmNfcHJpdmF0ZSAqIGssIGludCB0aWNrKQoreworCXVpbnQxNl90IFNldHVwID0gKExPQURTUkNfSU5EWCA8PCBCRl9MT0FEU1JDKSB8CS8vIFByZWxvYWQgdXBvbgorCQkvLyBpbmRleC4KKwkJKElORFhTUkNfU09GVCA8PCBCRl9JTkRYU1JDKSB8CS8vIERpc2FibGUgaGFyZHdhcmUgaW5kZXguCisJCShDTEtTUkNfVElNRVIgPDwgQkZfQ0xLU1JDKSB8CS8vIE9wZXJhdGluZyBtb2RlIGlzIFRpbWVyLgorCQkoQ0xLUE9MX1BPUyA8PCBCRl9DTEtQT0wpIHwJLy8gQWN0aXZlIGhpZ2ggY2xvY2suCisJCShDTlRESVJfRE9XTiA8PCBCRl9DTEtQT0wpIHwJLy8gQ291bnQgZGlyZWN0aW9uIGlzIERvd24uCisJCShDTEtNVUxUXzFYIDw8IEJGX0NMS01VTFQpIHwJLy8gQ2xvY2sgbXVsdGlwbGllciBpcyAxeC4KKwkJKENMS0VOQUJfSU5ERVggPDwgQkZfQ0xLRU5BQik7CisJdWludDE2X3QgdmFsdWVTcmNsYXRjaCA9IExBVENIU1JDX0FfSU5EWEE7CisJLy8gIHVpbnQxNl90IGVuYWI9Q0xLRU5BQl9BTFdBWVM7CisKKwlrLT5TZXRNb2RlKGRldiwgaywgU2V0dXAsIEZBTFNFKTsKKworCS8vIFNldCB0aGUgcHJlbG9hZCByZWdpc3RlcgorCVByZWxvYWQoZGV2LCBrLCB0aWNrKTsKKworCS8vIFNvZnR3YXJlIGluZGV4IHB1bHNlIGZvcmNlcyB0aGUgcHJlbG9hZCByZWdpc3RlciB0byBsb2FkCisJLy8gaW50byB0aGUgY291bnRlcgorCWstPlNldExvYWRUcmlnKGRldiwgaywgMCk7CisJay0+UHVsc2VJbmRleChkZXYsIGspOworCisJLy9zZXQgcmVsb2FkIG9uIGNvdW50ZXIgb3ZlcmZsb3cKKwlrLT5TZXRMb2FkVHJpZyhkZXYsIGssIDEpOworCisJLy9zZXQgaW50ZXJydXB0IG9uIG92ZXJmbG93CisJay0+U2V0SW50U3JjKGRldiwgaywgSU5UU1JDX09WRVIpOworCisJU2V0TGF0Y2hTb3VyY2UoZGV2LCBrLCB2YWx1ZVNyY2xhdGNoKTsKKwkvLyAgay0+U2V0RW5hYmxlKGRldixrLCh1aW50MTZfdCkoZW5hYiAhPSAwKSk7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8gIERBQyBGVU5DVElPTlMgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvLyBTbG90IDAgYmFzZSBzZXR0aW5ncy4KKyNkZWZpbmUgVkVDVDAJKCBYU0QyIHwgUlNEMyB8IFNJQl9BMiApCS8vIFNsb3QgMCBhbHdheXMgc2hpZnRzIGluCisJCQkJCSAvLyAweEZGIGFuZCBzdG9yZSBpdCB0bworCQkJCQkgLy8gRkJfQlVGRkVSMi4KKworLy8gVHJpbURhYyBMb2dpY2FsQ2hhbi10by1QaHlzaWNhbENoYW4gbWFwcGluZyB0YWJsZS4KK3N0YXRpYyB1aW50OF90IHRyaW1jaGFuW10gPSB7IDEwLCA5LCA4LCAzLCAyLCA3LCA2LCAxLCAwLCA1LCA0IH07CisKKy8vIFRyaW1EYWMgTG9naWNhbENoYW4tdG8tRWVwcm9tQWRycyBtYXBwaW5nIHRhYmxlLgorc3RhdGljIHVpbnQ4X3QgdHJpbWFkcnNbXSA9CisJeyAweDQwLCAweDQxLCAweDQyLCAweDUwLCAweDUxLCAweDUyLCAweDUzLCAweDYwLCAweDYxLCAweDYyLCAweDYzIH07CisKK3N0YXRpYyB2b2lkIExvYWRUcmltREFDcyhjb21lZGlfZGV2aWNlICogZGV2KQoreworCXJlZ2lzdGVyIHVpbnQ4X3QgaTsKKworCS8vIENvcHkgVHJpbURhYyBzZXRwb2ludCB2YWx1ZXMgZnJvbSBFRVBST00gdG8gVHJpbURhY3MuCisJZm9yIChpID0gMDsgaSA8IChzaXplb2YodHJpbWNoYW4pIC8gc2l6ZW9mKHRyaW1jaGFuWzBdKSk7IGkrKykKKwkJV3JpdGVUcmltREFDKGRldiwgaSwgSTJDcmVhZChkZXYsIHRyaW1hZHJzW2ldKSk7Cit9CisKK3N0YXRpYyB2b2lkIFdyaXRlVHJpbURBQyhjb21lZGlfZGV2aWNlICogZGV2LCB1aW50OF90IExvZ2ljYWxDaGFuLAorCXVpbnQ4X3QgRGFjRGF0YSkKK3sKKwl1aW50MzJfdCBjaGFuOworCisJLy8gU2F2ZSB0aGUgbmV3IHNldHBvaW50IGluIGNhc2UgdGhlIGFwcGxpY2F0aW9uIG5lZWRzIHRvIHJlYWQgaXQgYmFjayBsYXRlci4KKwlkZXZwcml2LT5UcmltU2V0cG9pbnRbTG9naWNhbENoYW5dID0gKHVpbnQ4X3QpIERhY0RhdGE7CisKKwkvLyBNYXAgbG9naWNhbCBjaGFubmVsIG51bWJlciB0byBwaHlzaWNhbCBjaGFubmVsIG51bWJlci4KKwljaGFuID0gKHVpbnQzMl90KSB0cmltY2hhbltMb2dpY2FsQ2hhbl07CisKKwkvLyBTZXQgdXAgVFNMMiByZWNvcmRzIGZvciBUcmltRGFjIHdyaXRlIG9wZXJhdGlvbi4gIEFsbCBzbG90cyBzaGlmdAorCS8vIDB4RkYgaW4gZnJvbSBwdWxsZWQtdXAgU0QzIHNvIHRoYXQgdGhlIGVuZCBvZiB0aGUgc2xvdCBzZXF1ZW5jZQorCS8vIGNhbiBiZSBkZXRlY3RlZC4KKwlTRVRWRUNUKDIsIFhTRDIgfCBYRklGT18xIHwgV1MzKTsJLy8gU2xvdCAyOiBTZW5kIGhpZ2ggdWludDhfdAorCS8vIHRvIHRhcmdldCBUcmltRGFjLgorCVNFVFZFQ1QoMywgWFNEMiB8IFhGSUZPXzAgfCBXUzMpOwkvLyBTbG90IDM6IFNlbmQgbG93IHVpbnQ4X3QgdG8KKwkvLyB0YXJnZXQgVHJpbURhYy4KKwlTRVRWRUNUKDQsIFhTRDIgfCBYRklGT18zIHwgV1MxKTsJLy8gU2xvdCA0OiBTZW5kIE5PUCBoaWdoCisJLy8gdWludDhfdCB0byBEQUMwIHRvIGtlZXAKKwkvLyBjbG9jayBydW5uaW5nLgorCVNFVFZFQ1QoNSwgWFNEMiB8IFhGSUZPXzIgfCBXUzEgfCBFT1MpOwkvLyBTbG90IDU6IFNlbmQgTk9QIGxvdworCS8vIHVpbnQ4X3QgdG8gREFDMC4KKworCS8vIENvbnN0cnVjdCBhbmQgdHJhbnNtaXQgdGFyZ2V0IERBQydzIHNlcmlhbCBwYWNrZXQ6ICggMDAwMCBBQUFBCisJLy8gKSwoIEREREQgRERERCApLCggMHgwMCApLCggMHgwMCApIHdoZXJlIEE8MzowPiBpcyB0aGUgREFDCisJLy8gY2hhbm5lbCdzIGFkZHJlc3MsIGFuZCBEPDc6MD4gaXMgdGhlIERBQyBzZXRwb2ludC4gIEFwcGVuZCBhIFdPUkQKKwkvLyB2YWx1ZSAodGhhdCB3cml0ZXMgYSBjaGFubmVsIDAgTk9QIGNvbW1hbmQgdG8gYSBub24tZXhpc3RlbnQgbWFpbgorCS8vIERBQyBjaGFubmVsKSB0aGF0IHNlcnZlcyB0byBrZWVwIHRoZSBjbG9jayBydW5uaW5nIGFmdGVyIHRoZQorCS8vIHBhY2tldCBoYXMgYmVlbiBzZW50IHRvIHRoZSB0YXJnZXQgREFDLgorCisJU2VuZERBQyhkZXYsICgodWludDMyX3QpIGNoYW4gPDwgOCkJLy8gQWRkcmVzcyB0aGUgREFDIGNoYW5uZWwKKwkJLy8gd2l0aGluIHRoZSB0cmltZGFjIGRldmljZS4KKwkJfCAodWludDMyX3QpIERhY0RhdGEpOwkvLyBJbmNsdWRlIERBQyBzZXRwb2ludCBkYXRhLgorfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vICBFRVBST00gQUNDRVNTIEZVTkNUSU9OUyAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFJlYWQgdWludDhfdCBmcm9tIEVFUFJPTS4KKworc3RhdGljIHVpbnQ4X3QgSTJDcmVhZChjb21lZGlfZGV2aWNlICogZGV2LCB1aW50OF90IGFkZHIpCit7CisJdWludDhfdCBydG52YWw7CisKKwkvLyBTZW5kIEVFUFJPTSB0YXJnZXQgYWRkcmVzcy4KKwlpZiAoSTJDaGFuZHNoYWtlKGRldiwgSTJDX0IyKEkyQ19BVFRSU1RBUlQsIEkyQ1cpCS8vIEJ5dGUyID0gSTJDCisJCQkvLyBjb21tYW5kOgorCQkJLy8gd3JpdGUgdG8KKwkJCS8vIEkyQyBFRVBST00KKwkJCS8vIGRldmljZS4KKwkJCXwgSTJDX0IxKEkyQ19BVFRSU1RPUCwgYWRkcikJLy8gQnl0ZTEgPSBFRVBST00KKwkJCS8vIGludGVybmFsIHRhcmdldAorCQkJLy8gYWRkcmVzcy4KKwkJCXwgSTJDX0IwKEkyQ19BVFRSTk9QLCAwKSkpCS8vIEJ5dGUwID0gTm90CisJCS8vIHNlbnQuCisJeworCQkvLyBBYm9ydCBmdW5jdGlvbiBhbmQgZGVjbGFyZSBlcnJvciBpZiBoYW5kc2hha2UgZmFpbGVkLgorCQlERUJVRygiSTJDcmVhZDogZXJyb3IgaGFuZHNoYWtlIEkyQ3JlYWQgIGFcbiIpOworCQlyZXR1cm4gMDsKKwl9CisJLy8gRXhlY3V0ZSBFRVBST00gcmVhZC4KKwlpZiAoSTJDaGFuZHNoYWtlKGRldiwgSTJDX0IyKEkyQ19BVFRSU1RBUlQsIEkyQ1IpCS8vIEJ5dGUyID0gSTJDCisJCQkvLyBjb21tYW5kOiByZWFkCisJCQkvLyBmcm9tIEkyQyBFRVBST00KKwkJCS8vIGRldmljZS4KKwkJCXwgSTJDX0IxKEkyQ19BVFRSU1RPUCwgMCkJLy8gQnl0ZTEgcmVjZWl2ZXMKKwkJCS8vIHVpbnQ4X3QgZnJvbQorCQkJLy8gRUVQUk9NLgorCQkJfCBJMkNfQjAoSTJDX0FUVFJOT1AsIDApKSkJLy8gQnl0ZTAgPSBOb3QKKwkJLy8gc2VudC4KKwl7CisJCS8vIEFib3J0IGZ1bmN0aW9uIGFuZCBkZWNsYXJlIGVycm9yIGlmIGhhbmRzaGFrZSBmYWlsZWQuCisJCURFQlVHKCJJMkNyZWFkOiBlcnJvciBoYW5kc2hha2UgSTJDcmVhZCBiXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCS8vIFJldHVybiBjb3B5IG9mIEVFUFJPTSB2YWx1ZS4KKwlydG52YWwgPSAodWludDhfdCkgKFJSNzE0NihQX0kyQ0NUUkwpID4+IDE2KTsKKwlyZXR1cm4gcnRudmFsOworfQorCitzdGF0aWMgdWludDMyX3QgSTJDaGFuZHNoYWtlKGNvbWVkaV9kZXZpY2UgKiBkZXYsIHVpbnQzMl90IHZhbCkKK3sKKwkvLyBXcml0ZSBJMkMgY29tbWFuZCB0byBJMkMgVHJhbnNmZXIgQ29udHJvbCBzaGFkb3cgcmVnaXN0ZXIuCisJV1I3MTQ2KFBfSTJDQ1RSTCwgdmFsKTsKKworCS8vIFVwbG9hZCBJMkMgc2hhZG93IHJlZ2lzdGVycyBpbnRvIHdvcmtpbmcgcmVnaXN0ZXJzIGFuZCB3YWl0IGZvcgorCS8vIHVwbG9hZCBjb25maXJtYXRpb24uCisKKwlNQ19FTkFCTEUoUF9NQzIsIE1DMl9VUExEX0lJQyk7CisJd2hpbGUgKCFNQ19URVNUKFBfTUMyLCBNQzJfVVBMRF9JSUMpKSA7CisKKwkvLyBXYWl0IHVudGlsIEkyQyBidXMgdHJhbnNmZXIgaXMgZmluaXNoZWQgb3IgYW4gZXJyb3Igb2NjdXJzLgorCXdoaWxlICgoUlI3MTQ2KFBfSTJDQ1RSTCkgJiAoSTJDX0JVU1kgfCBJMkNfRVJSKSkgPT0gSTJDX0JVU1kpIDsKKworCS8vIFJldHVybiBub24temVybyBpZiBJMkMgZXJyb3Igb2NjdXJlZC4KKwlyZXR1cm4gUlI3MTQ2KFBfSTJDQ1RSTCkgJiBJMkNfRVJSOworCit9CisKKy8vIFByaXZhdGUgaGVscGVyIGZ1bmN0aW9uOiBXcml0ZSBzZXRwb2ludCB0byBhbiBhcHBsaWNhdGlvbiBEQUMgY2hhbm5lbC4KKworc3RhdGljIHZvaWQgU2V0REFDKGNvbWVkaV9kZXZpY2UgKiBkZXYsIHVpbnQxNl90IGNoYW4sIHNob3J0IGRhY2RhdGEpCit7CisJcmVnaXN0ZXIgdWludDE2X3Qgc2lnbm1hc2s7CisJcmVnaXN0ZXIgdWludDMyX3QgV1NJbWFnZTsKKworCS8vIEFkanVzdCBEQUMgZGF0YSBwb2xhcml0eSBhbmQgc2V0IHVwIFBvbGFyaXR5IENvbnRyb2wgUmVnaXN0ZXIKKwkvLyBpbWFnZS4KKwlzaWdubWFzayA9IDEgPDwgY2hhbjsKKwlpZiAoZGFjZGF0YSA8IDApIHsKKwkJZGFjZGF0YSA9IC1kYWNkYXRhOworCQlkZXZwcml2LT5EYWNwb2wgfD0gc2lnbm1hc2s7CisJfSBlbHNlCisJCWRldnByaXYtPkRhY3BvbCAmPSB+c2lnbm1hc2s7CisKKwkvLyBMaW1pdCBEQUMgc2V0cG9pbnQgdmFsdWUgdG8gdmFsaWQgcmFuZ2UuCisJaWYgKCh1aW50MTZfdCkgZGFjZGF0YSA+IDB4MUZGRikKKwkJZGFjZGF0YSA9IDB4MUZGRjsKKworCS8vIFNldCB1cCBUU0wyIHJlY29yZHMgKGFrYSAidmVjdG9ycyIpIGZvciBEQUMgdXBkYXRlLiAgVmVjdG9ycyBWMgorCS8vIGFuZCBWMyB0cmFuc21pdCB0aGUgc2V0cG9pbnQgdG8gdGhlIHRhcmdldCBEQUMuICBWNCBhbmQgVjUgc2VuZAorCS8vIGRhdGEgdG8gYSBub24tZXhpc3RlbnQgVHJpbURhYyBjaGFubmVsIGp1c3QgdG8ga2VlcCB0aGUgY2xvY2sKKwkvLyBydW5uaW5nIGFmdGVyIHNlbmRpbmcgZGF0YSB0byB0aGUgdGFyZ2V0IERBQy4gIFRoaXMgaXMgbmVjZXNzYXJ5CisJLy8gdG8gZWxpbWluYXRlIHRoZSBjbG9jayBnbGl0Y2ggdGhhdCB3b3VsZCBvdGhlcndpc2Ugb2NjdXIgYXQgdGhlCisJLy8gZW5kIG9mIHRoZSB0YXJnZXQgREFDJ3Mgc2VyaWFsIGRhdGEgc3RyZWFtLiAgV2hlbiB0aGUgc2VxdWVuY2UKKwkvLyByZXN0YXJ0cyBhdCBWMCAoYWZ0ZXIgZXhlY3V0aW5nIFY1KSwgdGhlIGdhdGUgYXJyYXkgYXV0b21hdGljYWxseQorCS8vIGRpc2FibGVzIGdhdGluZyBmb3IgdGhlIERBQyBjbG9jayBhbmQgYWxsIERBQyBjaGlwIHNlbGVjdHMuCisJV1NJbWFnZSA9IChjaGFuICYgMikgPyBXUzEgOiBXUzI7CS8vIENob29zZSBEQUMgY2hpcCBzZWxlY3QgdG8KKwkvLyBiZSBhc3NlcnRlZC4KKwlTRVRWRUNUKDIsIFhTRDIgfCBYRklGT18xIHwgV1NJbWFnZSk7CS8vIFNsb3QgMjogVHJhbnNtaXQgaGlnaAorCS8vIGRhdGEgYnl0ZSB0byB0YXJnZXQgREFDLgorCVNFVFZFQ1QoMywgWFNEMiB8IFhGSUZPXzAgfCBXU0ltYWdlKTsJLy8gU2xvdCAzOiBUcmFuc21pdCBsb3cgZGF0YQorCS8vIGJ5dGUgdG8gdGFyZ2V0IERBQy4KKwlTRVRWRUNUKDQsIFhTRDIgfCBYRklGT18zIHwgV1MzKTsJLy8gU2xvdCA0OiBUcmFuc21pdCB0bworCS8vIG5vbi1leGlzdGVudCBUcmltRGFjCisJLy8gY2hhbm5lbCB0byBrZWVwIGNsb2NrCisJU0VUVkVDVCg1LCBYU0QyIHwgWEZJRk9fMiB8IFdTMyB8IEVPUyk7CS8vIFNsb3QgNTogcnVubmluZyBhZnRlcgorCS8vIHdyaXRpbmcgdGFyZ2V0IERBQydzCisJLy8gbG93IGRhdGEgYnl0ZS4KKworCS8vIENvbnN0cnVjdCBhbmQgdHJhbnNtaXQgdGFyZ2V0IERBQydzIHNlcmlhbCBwYWNrZXQ6ICggQTEwRCBERERECisJLy8gKSwoIEREREQgRERERCApLCggMHgwRiApLCggMHgwMCApIHdoZXJlIEEgaXMgY2hhbjwwPiwgYW5kIEQ8MTI6MD4KKwkvLyBpcyB0aGUgREFDIHNldHBvaW50LiAgQXBwZW5kIGEgV09SRCB2YWx1ZSAodGhhdCB3cml0ZXMgdG8gYQorCS8vIG5vbi1leGlzdGVudCBUcmltRGFjIGNoYW5uZWwpIHRoYXQgc2VydmVzIHRvIGtlZXAgdGhlIGNsb2NrCisJLy8gcnVubmluZyBhZnRlciB0aGUgcGFja2V0IGhhcyBiZWVuIHNlbnQgdG8gdGhlIHRhcmdldCBEQUMuCisJU2VuZERBQyhkZXYsIDB4MEYwMDAwMDAJLy9Db250aW51ZSBjbG9jayBhZnRlciB0YXJnZXQgREFDCisJCS8vZGF0YSAod3JpdGUgdG8gbm9uLWV4aXN0ZW50CisJCS8vdHJpbWRhYykuCisJCXwgMHgwMDAwNDAwMAkvLyBBZGRyZXNzIHRoZSB0d28gbWFpbiBkdWFsLURBQworCQkvLyBkZXZpY2VzIChUU0wncyBjaGlwIHNlbGVjdCBlbmFibGVzCisJCS8vIHRhcmdldCBkZXZpY2UpLgorCQl8ICgodWludDMyX3QpIChjaGFuICYgMSkgPDwgMTUpCS8vIEFkZHJlc3MgdGhlIERBQworCQkvLyBjaGFubmVsIHdpdGhpbiB0aGUKKwkJLy8gZGV2aWNlLgorCQl8ICh1aW50MzJfdCkgZGFjZGF0YSk7CS8vIEluY2x1ZGUgREFDIHNldHBvaW50IGRhdGEuCisKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFByaXZhdGUgaGVscGVyIGZ1bmN0aW9uOiBUcmFuc21pdCBzZXJpYWwgZGF0YSB0byBEQUMgdmlhIEF1ZGlvCisvLyBjaGFubmVsIDIuICBBc3N1bWVzOiAoMSkgVFNMMiBzbG90IHJlY29yZHMgaW5pdGlhbGl6ZWQsIGFuZCAoMikKKy8vIERhY3BvbCBjb250YWlucyB2YWxpZCB0YXJnZXQgaW1hZ2UuCisKK3N0YXRpYyB2b2lkIFNlbmREQUMoY29tZWRpX2RldmljZSAqIGRldiwgdWludDMyX3QgdmFsKQoreworCisJLy8gU1RBUlQgVEhFIFNFUklBTCBDTE9DSyBSVU5OSU5HIC0tLS0tLS0tLS0tLS0KKworCS8vIEFzc2VydCBEQUMgcG9sYXJpdHkgY29udHJvbCBhbmQgZW5hYmxlIGdhdGluZyBvZiBEQUMgc2VyaWFsIGNsb2NrCisJLy8gYW5kIGF1ZGlvIGJpdCBzdHJlYW0gc2lnbmFscy4gIEF0IHRoaXMgcG9pbnQgaW4gdGltZSB3ZSBtdXN0IGJlCisJLy8gYXNzdXJlZCBvZiBiZWluZyBpbiB0aW1lIHNsb3QgMC4gIElmIHdlIGFyZSBub3QgaW4gc2xvdCAwLCB0aGUKKwkvLyBzZXJpYWwgY2xvY2sgYW5kIGF1ZGlvIHN0cmVhbSBzaWduYWxzIHdpbGwgYmUgZGlzYWJsZWQ7IHRoaXMgaXMKKwkvLyBiZWNhdXNlIHRoZSBmb2xsb3dpbmcgREVCSXdyaXRlIHN0YXRlbWVudCAod2hpY2ggZW5hYmxlcyBzaWduYWxzCisJLy8gdG8gYmUgcGFzc2VkIHRocm91Z2ggdGhlIGdhdGUgYXJyYXkpIHdvdWxkIGV4ZWN1dGUgYmVmb3JlIHRoZQorCS8vIHRyYWlsaW5nIGVkZ2Ugb2YgV1MxL1dTMyAod2hpY2ggdHVybnMgb2ZmIHRoZSBzaWduYWxzKSwgdGh1cworCS8vIGNhdXNpbmcgdGhlIHNpZ25hbHMgdG8gYmUgaW5hY3RpdmUgZHVyaW5nIHRoZSBEQUMgd3JpdGUuCisJREVCSXdyaXRlKGRldiwgTFBfREFDUE9MLCBkZXZwcml2LT5EYWNwb2wpOworCisJLy8gVFJBTlNGRVIgT1VUUFVUIERXT1JEIFZBTFVFIElOVE8gQTInUyBPVVRQVVQgRklGTyAtLS0tLS0tLS0tLS0tLS0tCisKKwkvLyBDb3B5IERBQyBzZXRwb2ludCB2YWx1ZSB0byBEQUMncyBvdXRwdXQgRE1BIGJ1ZmZlci4KKworCS8vV1I3MTQ2KCAodWludDMyX3QpZGV2cHJpdi0+cERhY1dCdWYsIHZhbCApOworCSpkZXZwcml2LT5wRGFjV0J1ZiA9IHZhbDsKKworCS8vIGVuYWIgdGhlIG91dHB1dCBETUEgdHJhbnNmZXIuICBUaGlzIHdpbGwgY2F1c2UgdGhlIERNQUMgdG8gY29weQorCS8vIHRoZSBEQUMncyBkYXRhIHZhbHVlIHRvIEEyJ3Mgb3V0cHV0IEZJRk8uICBUaGUgRE1BIHRyYW5zZmVyIHdpbGwKKwkvLyB0aGVuIGltbWVkaWF0ZWx5IHRlcm1pbmF0ZSBiZWNhdXNlIHRoZSBwcm90ZWN0aW9uIGFkZHJlc3MgaXMKKwkvLyByZWFjaGVkIHVwb24gdHJhbnNmZXIgb2YgdGhlIGZpcnN0IERXT1JEIHZhbHVlLgorCU1DX0VOQUJMRShQX01DMSwgTUMxX0EyT1VUKTsKKworCS8vIFdoaWxlIHRoZSBETUEgdHJhbnNmZXIgaXMgZXhlY3V0aW5nIC4uLgorCisJLy8gUmVzZXQgQXVkaW8yIG91dHB1dCBGSUZPJ3MgdW5kZXJmbG93IGZsYWcgKGFsb25nIHdpdGggYW55IG90aGVyCisJLy8gRklGTyB1bmRlcmZsb3cvb3ZlcmZsb3cgZmxhZ3MpLiAgV2hlbiBzZXQsIHRoaXMgZmxhZyB3aWxsCisJLy8gaW5kaWNhdGUgdGhhdCB3ZSBoYXZlIGVtZXJnZWQgZnJvbSBzbG90IDAuCisJV1I3MTQ2KFBfSVNSLCBJU1JfQUZPVSk7CisKKwkvLyBXYWl0IGZvciB0aGUgRE1BIHRyYW5zZmVyIHRvIGZpbmlzaCBzbyB0aGF0IHRoZXJlIHdpbGwgYmUgZGF0YQorCS8vIGF2YWlsYWJsZSBpbiB0aGUgRklGTyB3aGVuIHRpbWUgc2xvdCAxIHRyaWVzIHRvIHRyYW5zZmVyIGEgRFdPUkQKKwkvLyBmcm9tIHRoZSBGSUZPIHRvIHRoZSBvdXRwdXQgYnVmZmVyIHJlZ2lzdGVyLiAgV2UgdGVzdCBmb3IgRE1BCisJLy8gRG9uZSBieSBwb2xsaW5nIHRoZSBETUFDIGVuYWJsZSBmbGFnOyB0aGlzIGZsYWcgaXMgYXV0b21hdGljYWxseQorCS8vIGNsZWFyZWQgd2hlbiB0aGUgdHJhbnNmZXIgaGFzIGZpbmlzaGVkLgorCXdoaWxlICgoUlI3MTQ2KFBfTUMxKSAmIE1DMV9BMk9VVCkgIT0gMCkgOworCisJLy8gU1RBUlQgVEhFIE9VVFBVVCBTVFJFQU0gVE8gVEhFIFRBUkdFVCBEQUMgLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCS8vIEZJRk8gZGF0YSBpcyBub3cgYXZhaWxhYmxlLCBzbyB3ZSBlbmFibGUgZXhlY3V0aW9uIG9mIHRpbWUgc2xvdHMKKwkvLyAxIGFuZCBoaWdoZXIgYnkgY2xlYXJpbmcgdGhlIEVPUyBmbGFnIGluIHNsb3QgMC4gIE5vdGUgdGhhdCBTRDMKKwkvLyB3aWxsIGJlIHNoaWZ0ZWQgaW4gYW5kIHN0b3JlZCBpbiBGQl9CVUZGRVIyIGZvciBlbmQtb2Ytc2xvdC1saXN0CisJLy8gZGV0ZWN0aW9uLgorCVNFVFZFQ1QoMCwgWFNEMiB8IFJTRDMgfCBTSUJfQTIpOworCisJLy8gV2FpdCBmb3Igc2xvdCAxIHRvIGV4ZWN1dGUgdG8gZW5zdXJlIHRoYXQgdGhlIFBhY2tldCB3aWxsIGJlCisJLy8gdHJhbnNtaXR0ZWQuICBUaGlzIGlzIGRldGVjdGVkIGJ5IHBvbGxpbmcgdGhlIEF1ZGlvMiBvdXRwdXQgRklGTworCS8vIHVuZGVyZmxvdyBmbGFnLCB3aGljaCB3aWxsIGJlIHNldCB3aGVuIHNsb3QgMSBleGVjdXRpb24gaGFzCisJLy8gZmluaXNoZWQgdHJhbnNmZXJyaW5nIHRoZSBEQUMncyBkYXRhIERXT1JEIGZyb20gdGhlIG91dHB1dCBGSUZPCisJLy8gdG8gdGhlIG91dHB1dCBidWZmZXIgcmVnaXN0ZXIuCisJd2hpbGUgKChSUjcxNDYoUF9TU1IpICYgU1NSX0FGMl9PVVQpID09IDApIDsKKworCS8vIFNldCB1cCB0byB0cmFwIGV4ZWN1dGlvbiBhdCBzbG90IDAgd2hlbiB0aGUgVFNMIHNlcXVlbmNlciBjeWNsZXMKKwkvLyBiYWNrIHRvIHNsb3QgMCBhZnRlciBleGVjdXRpbmcgdGhlIEVPUyBpbiBzbG90IDUuICBBbHNvLAorCS8vIHNpbXVsdGFuZW91c2x5IHNoaWZ0IG91dCBhbmQgaW4gdGhlIDB4MDAgdGhhdCBpcyBBTFdBWVMgdGhlIHZhbHVlCisJLy8gc3RvcmVkIGluIHRoZSBsYXN0IGJ5dGUgdG8gYmUgc2hpZnRlZCBvdXQgb2YgdGhlIEZJRk8ncyBEV09SRAorCS8vIGJ1ZmZlciByZWdpc3Rlci4KKwlTRVRWRUNUKDAsIFhTRDIgfCBYRklGT18yIHwgUlNEMiB8IFNJQl9BMiB8IEVPUyk7CisKKwkvLyBXQUlUIEZPUiBUSEUgVFJBTlNBQ1RJT04gVE8gRklOSVNIIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKwkvLyBXYWl0IGZvciB0aGUgVFNMIHRvIGZpbmlzaCBleGVjdXRpbmcgYWxsIHRpbWUgc2xvdHMgYmVmb3JlCisJLy8gZXhpdGluZyB0aGlzIGZ1bmN0aW9uLiAgV2UgbXVzdCBkbyB0aGlzIHNvIHRoYXQgdGhlIG5leHQgREFDCisJLy8gd3JpdGUgZG9lc24ndCBzdGFydCwgdGhlcmVieSBlbmFibGluZyBjbG9jay9jaGlwIHNlbGVjdCBzaWduYWxzOgorCS8vIDEuIEJlZm9yZSB0aGUgVFNMIHNlcXVlbmNlIGN5Y2xlcyBiYWNrIHRvIHNsb3QgMCwgd2hpY2ggZGlzYWJsZXMKKwkvLyB0aGUgY2xvY2svY3Mgc2lnbmFsIGdhdGluZyBhbmQgdHJhcHMgc2xvdCAvLyBsaXN0IGV4ZWN1dGlvbi4gIElmCisJLy8gd2UgaGF2ZSBub3QgeWV0IGZpbmlzaGVkIHNsb3QgNSB0aGVuIHRoZSBjbG9jay9jcyBzaWduYWxzIGFyZQorCS8vIHN0aWxsIGdhdGVkIGFuZCB3ZSBoYXZlIC8vIG5vdCBmaW5pc2hlZCB0cmFuc21pdHRpbmcgdGhlIHN0cmVhbS4KKwkvLyAyLiBXaGlsZSBzbG90cyAyLTUgYXJlIGV4ZWN1dGluZyBkdWUgdG8gYSBsYXRlIHNsb3QgMCB0cmFwLiAgSW4KKwkvLyB0aGlzIGNhc2UsIHRoZSBzbG90IHNlcXVlbmNlIGlzIGN1cnJlbnRseSAvLyByZXBlYXRpbmcsIGJ1dCB3aXRoCisJLy8gY2xvY2svY3Mgc2lnbmFscyBkaXNhYmxlZC4gIFdlIG11c3Qgd2FpdCBmb3Igc2xvdCAwIHRvIHRyYXAKKwkvLyBleGVjdXRpb24gYmVmb3JlIHNldHRpbmcgLy8gdXAgdGhlIG5leHQgREFDIHNldHBvaW50IERNQSB0cmFuc2ZlcgorCS8vIGFuZCBlbmFibGluZyB0aGUgY2xvY2svY3Mgc2lnbmFscy4gIFRvIGRldGVjdCB0aGUgZW5kIG9mIHNsb3QgNSwKKwkvLyB3ZSB0ZXN0IGZvciB0aGUgRkJfQlVGRkVSMiBNU0IgY29udGVudHMgdG8gYmUgZXF1YWwgdG8gMHhGRi4gIElmCisJLy8gdGhlIFRTTCBoYXMgbm90IHlldCBmaW5pc2hlZCBleGVjdXRpbmcgc2xvdCA1IC4uLgorCWlmICgoUlI3MTQ2KFBfRkJfQlVGRkVSMikgJiAweEZGMDAwMDAwKSAhPSAwKSB7CisJCS8vIFRoZSB0cmFwIHdhcyBzZXQgb24gdGltZSBhbmQgd2UgYXJlIHN0aWxsIGV4ZWN1dGluZyBzb21ld2hlcmUKKwkJLy8gaW4gc2xvdHMgMi01LCBzbyB3ZSBub3cgd2FpdCBmb3Igc2xvdCAwIHRvIGV4ZWN1dGUgYW5kIHRyYXAKKwkJLy8gVFNMIGV4ZWN1dGlvbi4gIFRoaXMgaXMgZGV0ZWN0ZWQgd2hlbiBGQl9CVUZGRVIyIE1TQiBjaGFuZ2VzCisJCS8vIGZyb20gMHhGRiB0byAweDAwLCB3aGljaCBzbG90IDAgY2F1c2VzIHRvIGhhcHBlbiBieSBzaGlmdGluZworCQkvLyBvdXQvaW4gb24gU0QyIHRoZSAweDAwIHRoYXQgaXMgYWx3YXlzIHJlZmVyZW5jZWQgYnkgc2xvdCA1LgorCQl3aGlsZSAoKFJSNzE0NihQX0ZCX0JVRkZFUjIpICYgMHhGRjAwMDAwMCkgIT0gMCkgOworCX0KKwkvLyBFaXRoZXIgKDEpIHdlIHdlcmUgdG9vIGxhdGUgc2V0dGluZyB0aGUgc2xvdCAwIHRyYXA7IHRoZSBUU0wKKwkvLyBzZXF1ZW5jZXIgcmVzdGFydGVkIHNsb3QgMCBiZWZvcmUgd2UgY291bGQgc2V0IHRoZSBFT1MgdHJhcCBmbGFnLAorCS8vIG9yICgyKSB3ZSB3ZXJlIG5vdCBsYXRlIGFuZCBleGVjdXRpb24gaXMgbm93IHRyYXBwZWQgYXQgc2xvdCAwLgorCS8vIEluIGVpdGhlciBjYXNlLCB3ZSBtdXN0IG5vdyBjaGFuZ2Ugc2xvdCAwIHNvIHRoYXQgaXQgd2lsbCBzdG9yZQorCS8vIHZhbHVlIDB4RkYgKGluc3RlYWQgb2YgMHgwMCkgdG8gRkJfQlVGRkVSMiBuZXh0IHRpbWUgaXQgZXhlY3V0ZXMuCisJLy8gSW4gb3JkZXIgdG8gZG8gdGhpcywgd2UgcmVwcm9ncmFtIHNsb3QgMCBzbyB0aGF0IGl0IHdpbGwgc2hpZnQgaW4KKwkvLyBTRDMsIHdoaWNoIGlzIGRyaXZlbiBvbmx5IGJ5IGEgcHVsbC11cCByZXNpc3Rvci4KKwlTRVRWRUNUKDAsIFJTRDMgfCBTSUJfQTIgfCBFT1MpOworCisJLy8gV2FpdCBmb3Igc2xvdCAwIHRvIGV4ZWN1dGUsIGF0IHdoaWNoIHRpbWUgdGhlIFRTTCBpcyBzZXR1cCBmb3IKKwkvLyB0aGUgbmV4dCBEQUMgd3JpdGUuICBUaGlzIGlzIGRldGVjdGVkIHdoZW4gRkJfQlVGRkVSMiBNU0IgY2hhbmdlcworCS8vIGZyb20gMHgwMCB0byAweEZGLgorCXdoaWxlICgoUlI3MTQ2KFBfRkJfQlVGRkVSMikgJiAweEZGMDAwMDAwKSA9PSAwKSA7Cit9CisKK3N0YXRpYyB2b2lkIFdyaXRlTUlTQzIoY29tZWRpX2RldmljZSAqIGRldiwgdWludDE2X3QgTmV3SW1hZ2UpCit7CisJREVCSXdyaXRlKGRldiwgTFBfTUlTQzEsIE1JU0MxX1dFTkFCTEUpOwkvLyBlbmFiIHdyaXRlcyB0bworCS8vIE1JU0MyIHJlZ2lzdGVyLgorCURFQkl3cml0ZShkZXYsIExQX1dSTUlTQzIsIE5ld0ltYWdlKTsJLy8gV3JpdGUgbmV3IGltYWdlIHRvIE1JU0MyLgorCURFQkl3cml0ZShkZXYsIExQX01JU0MxLCBNSVNDMV9XRElTQUJMRSk7CS8vIERpc2FibGUgd3JpdGVzIHRvIE1JU0MyLgorfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEluaXRpYWxpemUgdGhlIERFQkkgaW50ZXJmYWNlIGZvciBhbGwgdHJhbnNmZXJzLgorCitzdGF0aWMgdWludDE2X3QgREVCSXJlYWQoY29tZWRpX2RldmljZSAqIGRldiwgdWludDE2X3QgYWRkcikKK3sKKwl1aW50MTZfdCByZXR2YWw7CisKKwkvLyBTZXQgdXAgREVCSSBjb250cm9sIHJlZ2lzdGVyIHZhbHVlIGluIHNoYWRvdyBSQU0uCisJV1I3MTQ2KFBfREVCSUNNRCwgREVCSV9DTURfUkRXT1JEIHwgYWRkcik7CisKKwkvLyBFeGVjdXRlIHRoZSBERUJJIHRyYW5zZmVyLgorCURFQkl0cmFuc2ZlcihkZXYpOworCisJLy8gRmV0Y2ggdGFyZ2V0IHJlZ2lzdGVyIHZhbHVlLgorCXJldHZhbCA9ICh1aW50MTZfdCkgUlI3MTQ2KFBfREVCSUFEKTsKKworCS8vIFJldHVybiByZWdpc3RlciB2YWx1ZS4KKwlyZXR1cm4gcmV0dmFsOworfQorCisvLyBFeGVjdXRlIGEgREVCSSB0cmFuc2Zlci4gIFRoaXMgbXVzdCBiZSBjYWxsZWQgZnJvbSB3aXRoaW4gYQorLy8gY3JpdGljYWwgc2VjdGlvbi4KK3N0YXRpYyB2b2lkIERFQkl0cmFuc2Zlcihjb21lZGlfZGV2aWNlICogZGV2KQoreworCS8vIEluaXRpYXRlIHVwbG9hZCBvZiBzaGFkb3cgUkFNIHRvIERFQkkgY29udHJvbCByZWdpc3Rlci4KKwlNQ19FTkFCTEUoUF9NQzIsIE1DMl9VUExEX0RFQkkpOworCisJLy8gV2FpdCBmb3IgY29tcGxldGlvbiBvZiB1cGxvYWQgZnJvbSBzaGFkb3cgUkFNIHRvIERFQkkgY29udHJvbAorCS8vIHJlZ2lzdGVyLgorCXdoaWxlICghTUNfVEVTVChQX01DMiwgTUMyX1VQTERfREVCSSkpIDsKKworCS8vIFdhaXQgdW50aWwgREVCSSB0cmFuc2ZlciBpcyBkb25lLgorCXdoaWxlIChSUjcxNDYoUF9QU1IpICYgUFNSX0RFQklfUykgOworfQorCisvLyBXcml0ZSBhIHZhbHVlIHRvIGEgZ2F0ZSBhcnJheSByZWdpc3Rlci4KK3N0YXRpYyB2b2lkIERFQkl3cml0ZShjb21lZGlfZGV2aWNlICogZGV2LCB1aW50MTZfdCBhZGRyLCB1aW50MTZfdCB3ZGF0YSkKK3sKKworCS8vIFNldCB1cCBERUJJIGNvbnRyb2wgcmVnaXN0ZXIgdmFsdWUgaW4gc2hhZG93IFJBTS4KKwlXUjcxNDYoUF9ERUJJQ01ELCBERUJJX0NNRF9XUldPUkQgfCBhZGRyKTsKKwlXUjcxNDYoUF9ERUJJQUQsIHdkYXRhKTsKKworCS8vIEV4ZWN1dGUgdGhlIERFQkkgdHJhbnNmZXIuCisJREVCSXRyYW5zZmVyKGRldik7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBSZXBsYWNlIHRoZSBzcGVjaWZpZWQgYml0cyBpbiBhIGdhdGUgYXJyYXkgcmVnaXN0ZXIuICBJbXBvcnRzOiBtYXNrCisvLyBzcGVjaWZpZXMgYml0cyB0aGF0IGFyZSB0byBiZSBwcmVzZXJ2ZWQsIHdkYXRhIGlzIG5ldyB2YWx1ZSB0byBiZQorLy8gb3InZCB3aXRoIHRoZSBtYXNrZWQgb3JpZ2luYWwuCitzdGF0aWMgdm9pZCBERUJJcmVwbGFjZShjb21lZGlfZGV2aWNlICogZGV2LCB1aW50MTZfdCBhZGRyLCB1aW50MTZfdCBtYXNrLAorCXVpbnQxNl90IHdkYXRhKQoreworCisJLy8gQ29weSB0YXJnZXQgZ2F0ZSBhcnJheSByZWdpc3RlciBpbnRvIFBfREVCSUFEIHJlZ2lzdGVyLgorCVdSNzE0NihQX0RFQklDTUQsIERFQklfQ01EX1JEV09SRCB8IGFkZHIpOwkvLyBTZXQgdXAgREVCSSBjb250cm9sCisJLy8gcmVnIHZhbHVlIGluIHNoYWRvdworCS8vIFJBTS4KKwlERUJJdHJhbnNmZXIoZGV2KTsJLy8gRXhlY3V0ZSB0aGUgREVCSQorCS8vIFJlYWQgdHJhbnNmZXIuCisKKwkvLyBXcml0ZSBiYWNrIHRoZSBtb2RpZmllZCBpbWFnZS4KKwlXUjcxNDYoUF9ERUJJQ01ELCBERUJJX0NNRF9XUldPUkQgfCBhZGRyKTsJLy8gU2V0IHVwIERFQkkgY29udHJvbAorCS8vIHJlZyB2YWx1ZSBpbiBzaGFkb3cKKwkvLyBSQU0uCisKKwlXUjcxNDYoUF9ERUJJQUQsIHdkYXRhIHwgKCh1aW50MTZfdCkgUlI3MTQ2KFBfREVCSUFEKSAmIG1hc2spKTsJLy8gTW9kaWZ5IHRoZSByZWdpc3RlciBpbWFnZS4KKwlERUJJdHJhbnNmZXIoZGV2KTsJLy8gRXhlY3V0ZSB0aGUgREVCSSBXcml0ZSB0cmFuc2Zlci4KK30KKworc3RhdGljIHZvaWQgQ2xvc2VETUFCKGNvbWVkaV9kZXZpY2UgKiBkZXYsIERNQUJVRiAqIHBkbWEsIHNpemVfdCBic2l6ZSkKK3sKKwl2b2lkICp2YnB0cjsKKwlkbWFfYWRkcl90IHZwcHRyOworCisJREVCVUcoIkNsb3NlRE1BQjogRW50ZXJpbmcgUzYyNkRSVl9DbG9zZURNQUIoKTpcbiIpOworCWlmIChwZG1hID09IE5VTEwpCisJCXJldHVybjsKKwkvL2ZpbmQgdGhlIG1hdGNoaW5nIGFsbG9jYXRpb24gZnJvbSB0aGUgYm9hcmQgc3RydWN0CisKKwl2YnB0ciA9IHBkbWEtPkxvZ2ljYWxCYXNlOworCXZwcHRyID0gcGRtYS0+UGh5c2ljYWxCYXNlOworCWlmICh2YnB0cikgeworCQlwY2lfZnJlZV9jb25zaXN0ZW50KGRldnByaXYtPnBkZXYsIGJzaXplLCB2YnB0ciwgdnBwdHIpOworCQlwZG1hLT5Mb2dpY2FsQmFzZSA9IDA7CisJCXBkbWEtPlBoeXNpY2FsQmFzZSA9IDA7CisKKwkJREVCVUcoIkNsb3NlRE1BQigpOiBMb2dpY2FsPSVwLCBic2l6ZT0lZCwgUGh5c2ljYWw9MHgleFxuIiwKKwkJCXZicHRyLCBic2l6ZSwgKHVpbnQzMl90KSB2cHB0cik7CisJfQorfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vICBDT1VOVEVSIEZVTkNUSU9OUyAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBBbGwgY291bnRlciBmdW5jdGlvbnMgYWRkcmVzcyBhIHNwZWNpZmljIGNvdW50ZXIgYnkgbWVhbnMgb2YgdGhlCisvLyAiQ291bnRlciIgYXJndW1lbnQsIHdoaWNoIGlzIGEgbG9naWNhbCBjb3VudGVyIG51bWJlci4gIFRoZSBDb3VudGVyCisvLyBhcmd1bWVudCBtYXkgaGF2ZSBhbnkgb2YgdGhlIGZvbGxvd2luZyBsZWdhbCB2YWx1ZXM6IDA9MEEsIDE9MUEsCisvLyAyPTJBLCAzPTBCLCA0PTFCLCA1PTJCLgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8vIEZvcndhcmQgZGVjbGFyYXRpb25zIGZvciBmdW5jdGlvbnMgdGhhdCBhcmUgY29tbW9uIHRvIGJvdGggQSBhbmQgQgorLy8gY291bnRlcnM6CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8gUFJJVkFURSBDT1VOVEVSIEZVTkNUSU9OUyAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFJlYWQgYSBjb3VudGVyJ3Mgb3V0cHV0IGxhdGNoLgorCitzdGF0aWMgdWludDMyX3QgUmVhZExhdGNoKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGVuY19wcml2YXRlICogaykKK3sKKwlyZWdpc3RlciB1aW50MzJfdCB2YWx1ZTsKKwkvL0RFQlVHIEZJWE1FIERFQlVHKCJSZWFkTGF0Y2g6IFJlYWQgTGF0Y2ggZW50ZXJcbiIpOworCisJLy8gTGF0Y2ggY291bnRzIGFuZCBmZXRjaCBMU1cgb2YgbGF0Y2hlZCBjb3VudHMgdmFsdWUuCisJdmFsdWUgPSAodWludDMyX3QpIERFQklyZWFkKGRldiwgay0+TXlMYXRjaExzdyk7CisKKwkvLyBGZXRjaCBNU1cgb2YgbGF0Y2hlZCBjb3VudHMgYW5kIGNvbWJpbmUgd2l0aCBMU1cuCisJdmFsdWUgfD0gKCh1aW50MzJfdCkgREVCSXJlYWQoZGV2LCBrLT5NeUxhdGNoTHN3ICsgMikgPDwgMTYpOworCisJLy8gREVCVUcgRklYTUUgREVCVUcoIlJlYWRMYXRjaDogUmVhZCBMYXRjaCBleGl0XG4iKTsKKworCS8vIFJldHVybiBsYXRjaGVkIGNvdW50cy4KKwlyZXR1cm4gdmFsdWU7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFJlc2V0IGEgY291bnRlcidzIGluZGV4IGFuZCBvdmVyZmxvdyBldmVudCBjYXB0dXJlIGZsYWdzLgorCitzdGF0aWMgdm9pZCBSZXNldENhcEZsYWdzX0EoY29tZWRpX2RldmljZSAqIGRldiwgZW5jX3ByaXZhdGUgKiBrKQoreworCURFQklyZXBsYWNlKGRldiwgay0+TXlDUkIsICh1aW50MTZfdCkgKH5DUkJNU0tfSU5UQ1RSTCksCisJCUNSQk1TS19JTlRSRVNFVENNRCB8IENSQk1TS19JTlRSRVNFVF9BKTsKK30KKworc3RhdGljIHZvaWQgUmVzZXRDYXBGbGFnc19CKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGVuY19wcml2YXRlICogaykKK3sKKwlERUJJcmVwbGFjZShkZXYsIGstPk15Q1JCLCAodWludDE2X3QpICh+Q1JCTVNLX0lOVENUUkwpLAorCQlDUkJNU0tfSU5UUkVTRVRDTUQgfCBDUkJNU0tfSU5UUkVTRVRfQik7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFJldHVybiBjb3VudGVyIHNldHVwIGluIGEgZm9ybWF0IChDT1VOVEVSX1NFVFVQKSB0aGF0IGlzIGNvbnNpc3RlbnQKKy8vIGZvciBib3RoIEEgYW5kIEIgY291bnRlcnMuCisKK3N0YXRpYyB1aW50MTZfdCBHZXRNb2RlX0EoY29tZWRpX2RldmljZSAqIGRldiwgZW5jX3ByaXZhdGUgKiBrKQoreworCXJlZ2lzdGVyIHVpbnQxNl90IGNyYTsKKwlyZWdpc3RlciB1aW50MTZfdCBjcmI7CisJcmVnaXN0ZXIgdWludDE2X3Qgc2V0dXA7CisKKwkvLyBGZXRjaCBDUkEgYW5kIENSQiByZWdpc3RlciBpbWFnZXMuCisJY3JhID0gREVCSXJlYWQoZGV2LCBrLT5NeUNSQSk7CisJY3JiID0gREVCSXJlYWQoZGV2LCBrLT5NeUNSQik7CisKKwkvLyBQb3B1bGF0ZSB0aGUgc3RhbmRhcmRpemVkIGNvdW50ZXIgc2V0dXAgYml0IGZpZWxkcy4gIE5vdGU6CisJLy8gSW5kZXhTcmMgaXMgcmVzdHJpY3RlZCB0byBFTkNfWCBvciBJbmR4UG9sLgorCXNldHVwID0gKChjcmEgJiBTVERNU0tfTE9BRFNSQykJLy8gTG9hZFNyYyAgPSBMb2FkU3JjQS4KKwkJfCAoKGNyYiA8PCAoU1REQklUX0xBVENIU1JDIC0gQ1JCQklUX0xBVENIU1JDKSkgJiBTVERNU0tfTEFUQ0hTUkMpCS8vIExhdGNoU3JjID0gTGF0Y2hTcmNBLgorCQl8ICgoY3JhIDw8IChTVERCSVRfSU5UU1JDIC0gQ1JBQklUX0lOVFNSQ19BKSkgJiBTVERNU0tfSU5UU1JDKQkvLyBJbnRTcmMgICA9IEludFNyY0EuCisJCXwgKChjcmEgPDwgKFNUREJJVF9JTkRYU1JDIC0gKENSQUJJVF9JTkRYU1JDX0EgKyAxKSkpICYgU1RETVNLX0lORFhTUkMpCS8vIEluZHhTcmMgID0gSW5keFNyY0E8MT4uCisJCXwgKChjcmEgPj4gKENSQUJJVF9JTkRYUE9MX0EgLSBTVERCSVRfSU5EWFBPTCkpICYgU1RETVNLX0lORFhQT0wpCS8vIEluZHhQb2wgID0gSW5keFBvbEEuCisJCXwgKChjcmIgPj4gKENSQkJJVF9DTEtFTkFCX0EgLSBTVERCSVRfQ0xLRU5BQikpICYgU1RETVNLX0NMS0VOQUIpKTsJLy8gQ2xrRW5hYiAgPSBDbGtFbmFiQS4KKworCS8vIEFkanVzdCBtb2RlLWRlcGVuZGVudCBwYXJhbWV0ZXJzLgorCWlmIChjcmEgJiAoMiA8PCBDUkFCSVRfQ0xLU1JDX0EpKQkvLyBJZiBUaW1lciBtb2RlIChDbGtTcmNBPDE+ID09IDEpOgorCQlzZXR1cCB8PSAoKENMS1NSQ19USU1FUiA8PCBTVERCSVRfQ0xLU1JDKQkvLyAgIEluZGljYXRlIFRpbWVyIG1vZGUuCisJCQl8ICgoY3JhIDw8IChTVERCSVRfQ0xLUE9MIC0gQ1JBQklUX0NMS1NSQ19BKSkgJiBTVERNU0tfQ0xLUE9MKQkvLyAgIFNldCBDbGtQb2wgdG8gaW5kaWNhdGUgY291bnQgZGlyZWN0aW9uIChDbGtTcmNBPDA+KS4KKwkJCXwgKE1VTFRfWDEgPDwgU1REQklUX0NMS01VTFQpKTsJLy8gICBDbGtNdWx0IG11c3QgYmUgMXggaW4gVGltZXIgbW9kZS4KKworCWVsc2UJCQkvLyBJZiBDb3VudGVyIG1vZGUgKENsa1NyY0E8MT4gPT0gMCk6CisJCXNldHVwIHw9ICgoQ0xLU1JDX0NPVU5URVIgPDwgU1REQklUX0NMS1NSQykJLy8gICBJbmRpY2F0ZSBDb3VudGVyIG1vZGUuCisJCQl8ICgoY3JhID4+IChDUkFCSVRfQ0xLUE9MX0EgLSBTVERCSVRfQ0xLUE9MKSkgJiBTVERNU0tfQ0xLUE9MKQkvLyAgIFBhc3MgdGhyb3VnaCBDbGtQb2wuCisJCQl8ICgoKGNyYSAmIENSQU1TS19DTEtNVUxUX0EpID09IChNVUxUX1gwIDw8IENSQUJJVF9DTEtNVUxUX0EpKSA/CS8vICAgRm9yY2UgQ2xrTXVsdCB0byAxeCBpZiBub3QgbGVnYWwsIGVsc2UgcGFzcyB0aHJvdWdoLgorCQkJCShNVUxUX1gxIDw8IFNUREJJVF9DTEtNVUxUKSA6CisJCQkJKChjcmEgPj4gKENSQUJJVF9DTEtNVUxUX0EgLQorCQkJCQkJCVNUREJJVF9DTEtNVUxUKSkgJgorCQkJCQlTVERNU0tfQ0xLTVVMVCkpKTsKKworCS8vIFJldHVybiBhZGp1c3RlZCBjb3VudGVyIHNldHVwLgorCXJldHVybiBzZXR1cDsKK30KKworc3RhdGljIHVpbnQxNl90IEdldE1vZGVfQihjb21lZGlfZGV2aWNlICogZGV2LCBlbmNfcHJpdmF0ZSAqIGspCit7CisJcmVnaXN0ZXIgdWludDE2X3QgY3JhOworCXJlZ2lzdGVyIHVpbnQxNl90IGNyYjsKKwlyZWdpc3RlciB1aW50MTZfdCBzZXR1cDsKKworCS8vIEZldGNoIENSQSBhbmQgQ1JCIHJlZ2lzdGVyIGltYWdlcy4KKwljcmEgPSBERUJJcmVhZChkZXYsIGstPk15Q1JBKTsKKwljcmIgPSBERUJJcmVhZChkZXYsIGstPk15Q1JCKTsKKworCS8vIFBvcHVsYXRlIHRoZSBzdGFuZGFyZGl6ZWQgY291bnRlciBzZXR1cCBiaXQgZmllbGRzLiAgTm90ZToKKwkvLyBJbmRleFNyYyBpcyByZXN0cmljdGVkIHRvIEVOQ19YIG9yIEluZHhQb2wuCisJc2V0dXAgPSAoKChjcmIgPDwgKFNUREJJVF9JTlRTUkMgLSBDUkJCSVRfSU5UU1JDX0IpKSAmIFNURE1TS19JTlRTUkMpCS8vIEludFNyYyAgID0gSW50U3JjQi4KKwkJfCAoKGNyYiA8PCAoU1REQklUX0xBVENIU1JDIC0gQ1JCQklUX0xBVENIU1JDKSkgJiBTVERNU0tfTEFUQ0hTUkMpCS8vIExhdGNoU3JjID0gTGF0Y2hTcmNCLgorCQl8ICgoY3JiIDw8IChTVERCSVRfTE9BRFNSQyAtIENSQkJJVF9MT0FEU1JDX0IpKSAmIFNURE1TS19MT0FEU1JDKQkvLyBMb2FkU3JjICA9IExvYWRTcmNCLgorCQl8ICgoY3JiIDw8IChTVERCSVRfSU5EWFBPTCAtIENSQkJJVF9JTkRYUE9MX0IpKSAmIFNURE1TS19JTkRYUE9MKQkvLyBJbmR4UG9sICA9IEluZHhQb2xCLgorCQl8ICgoY3JiID4+IChDUkJCSVRfQ0xLRU5BQl9CIC0gU1REQklUX0NMS0VOQUIpKSAmIFNURE1TS19DTEtFTkFCKQkvLyBDbGtFbmFiICA9IENsa0VuYWJCLgorCQl8ICgoY3JhID4+ICgoQ1JBQklUX0lORFhTUkNfQiArIDEpIC0gU1REQklUX0lORFhTUkMpKSAmIFNURE1TS19JTkRYU1JDKSk7CS8vIEluZHhTcmMgID0gSW5keFNyY0I8MT4uCisKKwkvLyBBZGp1c3QgbW9kZS1kZXBlbmRlbnQgcGFyYW1ldGVycy4KKwlpZiAoKGNyYiAmIENSQk1TS19DTEtNVUxUX0IpID09IChNVUxUX1gwIDw8IENSQkJJVF9DTEtNVUxUX0IpKQkvLyBJZiBFeHRlbmRlciBtb2RlIChDbGtNdWx0QiA9PSBNVUxUX1gwKToKKwkJc2V0dXAgfD0gKChDTEtTUkNfRVhURU5ERVIgPDwgU1REQklUX0NMS1NSQykJLy8gICBJbmRpY2F0ZSBFeHRlbmRlciBtb2RlLgorCQkJfCAoTVVMVF9YMSA8PCBTVERCSVRfQ0xLTVVMVCkJLy8gICBJbmRpY2F0ZSBtdWx0aXBsaWVyIGlzIDF4LgorCQkJfCAoKGNyYSA+PiAoQ1JBQklUX0NMS1NSQ19CIC0gU1REQklUX0NMS1BPTCkpICYgU1RETVNLX0NMS1BPTCkpOwkvLyAgIFNldCBDbGtQb2wgZXF1YWwgdG8gVGltZXIgY291bnQgZGlyZWN0aW9uIChDbGtTcmNCPDA+KS4KKworCWVsc2UgaWYgKGNyYSAmICgyIDw8IENSQUJJVF9DTEtTUkNfQikpCS8vIElmIFRpbWVyIG1vZGUgKENsa1NyY0I8MT4gPT0gMSk6CisJCXNldHVwIHw9ICgoQ0xLU1JDX1RJTUVSIDw8IFNUREJJVF9DTEtTUkMpCS8vICAgSW5kaWNhdGUgVGltZXIgbW9kZS4KKwkJCXwgKE1VTFRfWDEgPDwgU1REQklUX0NMS01VTFQpCS8vICAgSW5kaWNhdGUgbXVsdGlwbGllciBpcyAxeC4KKwkJCXwgKChjcmEgPj4gKENSQUJJVF9DTEtTUkNfQiAtIFNUREJJVF9DTEtQT0wpKSAmIFNURE1TS19DTEtQT0wpKTsJLy8gICBTZXQgQ2xrUG9sIGVxdWFsIHRvIFRpbWVyIGNvdW50IGRpcmVjdGlvbiAoQ2xrU3JjQjwwPikuCisKKwllbHNlCQkJLy8gSWYgQ291bnRlciBtb2RlIChDbGtTcmNCPDE+ID09IDApOgorCQlzZXR1cCB8PSAoKENMS1NSQ19DT1VOVEVSIDw8IFNUREJJVF9DTEtTUkMpCS8vICAgSW5kaWNhdGUgVGltZXIgbW9kZS4KKwkJCXwgKChjcmIgPj4gKENSQkJJVF9DTEtNVUxUX0IgLSBTVERCSVRfQ0xLTVVMVCkpICYgU1RETVNLX0NMS01VTFQpCS8vICAgQ2xvY2sgbXVsdGlwbGllciBpcyBwYXNzZWQgdGhyb3VnaC4KKwkJCXwgKChjcmIgPDwgKFNUREJJVF9DTEtQT0wgLSBDUkJCSVRfQ0xLUE9MX0IpKSAmIFNURE1TS19DTEtQT0wpKTsJLy8gICBDbG9jayBwb2xhcml0eSBpcyBwYXNzZWQgdGhyb3VnaC4KKworCS8vIFJldHVybiBhZGp1c3RlZCBjb3VudGVyIHNldHVwLgorCXJldHVybiBzZXR1cDsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBTZXQgdGhlIG9wZXJhdGluZyBtb2RlIGZvciB0aGUgc3BlY2lmaWVkIGNvdW50ZXIuICBUaGUgc2V0dXAKKy8vIHBhcmFtZXRlciBpcyB0cmVhdGVkIGFzIGEgQ09VTlRFUl9TRVRVUCBkYXRhIHR5cGUuICBUaGUgZm9sbG93aW5nCisvLyBwYXJhbWV0ZXJzIGFyZSBwcm9ncmFtbWFibGUgKGFsbCBvdGhlciBwYXJtcyBhcmUgaWdub3JlZCk6IENsa011bHQsCisvLyBDbGtQb2wsIENsa0VuYWIsIEluZGV4U3JjLCBJbmRleFBvbCwgTG9hZFNyYy4KKworc3RhdGljIHZvaWQgU2V0TW9kZV9BKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGVuY19wcml2YXRlICogaywgdWludDE2X3QgU2V0dXAsCisJdWludDE2X3QgRGlzYWJsZUludFNyYykKK3sKKwlyZWdpc3RlciB1aW50MTZfdCBjcmE7CisJcmVnaXN0ZXIgdWludDE2X3QgY3JiOworCXJlZ2lzdGVyIHVpbnQxNl90IHNldHVwID0gU2V0dXA7CS8vIENhY2hlIHRoZSBTdGFuZGFyZCBTZXR1cC4KKworCS8vIEluaXRpYWxpemUgQ1JBIGFuZCBDUkIgaW1hZ2VzLgorCWNyYSA9ICgoc2V0dXAgJiBDUkFNU0tfTE9BRFNSQ19BKQkvLyBQcmVsb2FkIHRyaWdnZXIgaXMgcGFzc2VkIHRocm91Z2guCisJCXwgKChzZXR1cCAmIFNURE1TS19JTkRYU1JDKSA+PiAoU1REQklUX0lORFhTUkMgLSAoQ1JBQklUX0lORFhTUkNfQSArIDEpKSkpOwkvLyBJbmRleFNyYyBpcyByZXN0cmljdGVkIHRvIEVOQ19YIG9yIEluZHhQb2wuCisKKwljcmIgPSAoQ1JCTVNLX0lOVFJFU0VUQ01EIHwgQ1JCTVNLX0lOVFJFU0VUX0EJLy8gUmVzZXQgYW55IHBlbmRpbmcgQ291bnRlckEgZXZlbnQgY2FwdHVyZXMuCisJCXwgKChzZXR1cCAmIFNURE1TS19DTEtFTkFCKSA8PCAoQ1JCQklUX0NMS0VOQUJfQSAtIFNUREJJVF9DTEtFTkFCKSkpOwkvLyBDbG9jayBlbmFibGUgaXMgcGFzc2VkIHRocm91Z2guCisKKwkvLyBGb3JjZSBJbnRTcmMgdG8gRGlzYWJsZWQgaWYgRGlzYWJsZUludFNyYyBpcyBhc3NlcnRlZC4KKwlpZiAoIURpc2FibGVJbnRTcmMpCisJCWNyYSB8PSAoKHNldHVwICYgU1RETVNLX0lOVFNSQykgPj4gKFNUREJJVF9JTlRTUkMgLQorCQkJCUNSQUJJVF9JTlRTUkNfQSkpOworCisJLy8gUG9wdWxhdGUgYWxsIG1vZGUtZGVwZW5kZW50IGF0dHJpYnV0ZXMgb2YgQ1JBICYgQ1JCIGltYWdlcy4KKwlzd2l0Y2ggKChzZXR1cCAmIFNURE1TS19DTEtTUkMpID4+IFNUREJJVF9DTEtTUkMpIHsKKwljYXNlIENMS1NSQ19FWFRFTkRFUjoJLy8gRXh0ZW5kZXIgTW9kZTogRm9yY2UgdG8gVGltZXIgbW9kZQorCQkvLyAoRXh0ZW5kZXIgdmFsaWQgb25seSBmb3IgQiBjb3VudGVycykuCisKKwljYXNlIENMS1NSQ19USU1FUjoJLy8gVGltZXIgTW9kZToKKwkJY3JhIHw9ICgoMiA8PCBDUkFCSVRfQ0xLU1JDX0EpCS8vICAgQ2xrU3JjQTwxPiBzZWxlY3RzIHN5c3RlbSBjbG9jaworCQkJfCAoKHNldHVwICYgU1RETVNLX0NMS1BPTCkgPj4gKFNUREJJVF9DTEtQT0wgLSBDUkFCSVRfQ0xLU1JDX0EpKQkvLyAgICAgd2l0aCBjb3VudCBkaXJlY3Rpb24gKENsa1NyY0E8MD4pIG9idGFpbmVkIGZyb20gQ2xrUG9sLgorCQkJfCAoMSA8PCBDUkFCSVRfQ0xLUE9MX0EpCS8vICAgQ2xrUG9sQSBiZWhhdmVzIGFzIGFsd2F5cy1vbiBjbG9jayBlbmFibGUuCisJCQl8IChNVUxUX1gxIDw8IENSQUJJVF9DTEtNVUxUX0EpKTsJLy8gICBDbGtNdWx0IG11c3QgYmUgMXguCisJCWJyZWFrOworCisJZGVmYXVsdDoJCS8vIENvdW50ZXIgTW9kZToKKwkJY3JhIHw9IChDTEtTUkNfQ09VTlRFUgkvLyAgIFNlbGVjdCBFTkNfQyBhbmQgRU5DX0QgYXMgY2xvY2svZGlyZWN0aW9uIGlucHV0cy4KKwkJCXwgKChzZXR1cCAmIFNURE1TS19DTEtQT0wpIDw8IChDUkFCSVRfQ0xLUE9MX0EgLSBTVERCSVRfQ0xLUE9MKSkJLy8gICBDbG9jayBwb2xhcml0eSBpcyBwYXNzZWQgdGhyb3VnaC4KKwkJCXwgKCgoc2V0dXAgJiBTVERNU0tfQ0xLTVVMVCkgPT0gKE1VTFRfWDAgPDwgU1REQklUX0NMS01VTFQpKSA/CS8vICAgRm9yY2UgbXVsdGlwbGllciB0byB4MSBpZiBub3QgbGVnYWwsIG90aGVyd2lzZSBwYXNzIHRocm91Z2guCisJCQkJKE1VTFRfWDEgPDwgQ1JBQklUX0NMS01VTFRfQSkgOgorCQkJCSgoc2V0dXAgJiBTVERNU0tfQ0xLTVVMVCkgPDwgKENSQUJJVF9DTEtNVUxUX0EgLQorCQkJCQkJU1REQklUX0NMS01VTFQpKSkpOworCX0KKworCS8vIEZvcmNlIHBvc2l0aXZlIGluZGV4IHBvbGFyaXR5IGlmIEluZHhTcmMgaXMgc29mdHdhcmUtZHJpdmVuIG9ubHksCisJLy8gb3RoZXJ3aXNlIHBhc3MgaXQgdGhyb3VnaC4KKwlpZiAofnNldHVwICYgU1RETVNLX0lORFhTUkMpCisJCWNyYSB8PSAoKHNldHVwICYgU1RETVNLX0lORFhQT0wpIDw8IChDUkFCSVRfSU5EWFBPTF9BIC0KKwkJCQlTVERCSVRfSU5EWFBPTCkpOworCisJLy8gSWYgSW50U3JjIGhhcyBiZWVuIGZvcmNlZCB0byBEaXNhYmxlZCwgdXBkYXRlIHRoZSBNSVNDMiBpbnRlcnJ1cHQKKwkvLyBlbmFibGUgbWFzayB0byBpbmRpY2F0ZSB0aGUgY291bnRlciBpbnRlcnJ1cHQgaXMgZGlzYWJsZWQuCisJaWYgKERpc2FibGVJbnRTcmMpCisJCWRldnByaXYtPkNvdW50ZXJJbnRFbmFicyAmPSB+ay0+TXlFdmVudEJpdHNbM107CisKKwkvLyBXaGlsZSByZXRhaW5pbmcgQ291bnRlckIgYW5kIExhdGNoU3JjIGNvbmZpZ3VyYXRpb25zLCBwcm9ncmFtIHRoZQorCS8vIG5ldyBjb3VudGVyIG9wZXJhdGluZyBtb2RlLgorCURFQklyZXBsYWNlKGRldiwgay0+TXlDUkEsIENSQU1TS19JTkRYU1JDX0IgfCBDUkFNU0tfQ0xLU1JDX0IsIGNyYSk7CisJREVCSXJlcGxhY2UoZGV2LCBrLT5NeUNSQiwKKwkJKHVpbnQxNl90KSAofihDUkJNU0tfSU5UQ1RSTCB8IENSQk1TS19DTEtFTkFCX0EpKSwgY3JiKTsKK30KKworc3RhdGljIHZvaWQgU2V0TW9kZV9CKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGVuY19wcml2YXRlICogaywgdWludDE2X3QgU2V0dXAsCisJdWludDE2X3QgRGlzYWJsZUludFNyYykKK3sKKwlyZWdpc3RlciB1aW50MTZfdCBjcmE7CisJcmVnaXN0ZXIgdWludDE2X3QgY3JiOworCXJlZ2lzdGVyIHVpbnQxNl90IHNldHVwID0gU2V0dXA7CS8vIENhY2hlIHRoZSBTdGFuZGFyZCBTZXR1cC4KKworCS8vIEluaXRpYWxpemUgQ1JBIGFuZCBDUkIgaW1hZ2VzLgorCWNyYSA9ICgoc2V0dXAgJiBTVERNU0tfSU5EWFNSQykgPDwgKChDUkFCSVRfSU5EWFNSQ19CICsgMSkgLSBTVERCSVRfSU5EWFNSQykpOwkvLyBJbmRleFNyYyBmaWVsZCBpcyByZXN0cmljdGVkIHRvIEVOQ19YIG9yIEluZHhQb2wuCisKKwljcmIgPSAoQ1JCTVNLX0lOVFJFU0VUQ01EIHwgQ1JCTVNLX0lOVFJFU0VUX0IJLy8gUmVzZXQgZXZlbnQgY2FwdHVyZXMgYW5kIGRpc2FibGUgaW50ZXJydXB0cy4KKwkJfCAoKHNldHVwICYgU1RETVNLX0NMS0VOQUIpIDw8IChDUkJCSVRfQ0xLRU5BQl9CIC0gU1REQklUX0NMS0VOQUIpKQkvLyBDbG9jayBlbmFibGUgaXMgcGFzc2VkIHRocm91Z2guCisJCXwgKChzZXR1cCAmIFNURE1TS19MT0FEU1JDKSA+PiAoU1REQklUX0xPQURTUkMgLSBDUkJCSVRfTE9BRFNSQ19CKSkpOwkvLyBQcmVsb2FkIHRyaWdnZXIgc291cmNlIGlzIHBhc3NlZCB0aHJvdWdoLgorCisJLy8gRm9yY2UgSW50U3JjIHRvIERpc2FibGVkIGlmIERpc2FibGVJbnRTcmMgaXMgYXNzZXJ0ZWQuCisJaWYgKCFEaXNhYmxlSW50U3JjKQorCQljcmIgfD0gKChzZXR1cCAmIFNURE1TS19JTlRTUkMpID4+IChTVERCSVRfSU5UU1JDIC0KKwkJCQlDUkJCSVRfSU5UU1JDX0IpKTsKKworCS8vIFBvcHVsYXRlIGFsbCBtb2RlLWRlcGVuZGVudCBhdHRyaWJ1dGVzIG9mIENSQSAmIENSQiBpbWFnZXMuCisJc3dpdGNoICgoc2V0dXAgJiBTVERNU0tfQ0xLU1JDKSA+PiBTVERCSVRfQ0xLU1JDKSB7CisJY2FzZSBDTEtTUkNfVElNRVI6CS8vIFRpbWVyIE1vZGU6CisJCWNyYSB8PSAoKDIgPDwgQ1JBQklUX0NMS1NSQ19CKQkvLyAgIENsa1NyY0I8MT4gc2VsZWN0cyBzeXN0ZW0gY2xvY2sKKwkJCXwgKChzZXR1cCAmIFNURE1TS19DTEtQT0wpIDw8IChDUkFCSVRfQ0xLU1JDX0IgLSBTVERCSVRfQ0xLUE9MKSkpOwkvLyAgICAgd2l0aCBkaXJlY3Rpb24gKENsa1NyY0I8MD4pIG9idGFpbmVkIGZyb20gQ2xrUG9sLgorCQljcmIgfD0gKCgxIDw8IENSQkJJVF9DTEtQT0xfQikJLy8gICBDbGtQb2xCIGJlaGF2ZXMgYXMgYWx3YXlzLW9uIGNsb2NrIGVuYWJsZS4KKwkJCXwgKE1VTFRfWDEgPDwgQ1JCQklUX0NMS01VTFRfQikpOwkvLyAgIENsa011bHRCIG11c3QgYmUgMXguCisJCWJyZWFrOworCisJY2FzZSBDTEtTUkNfRVhURU5ERVI6CS8vIEV4dGVuZGVyIE1vZGU6CisJCWNyYSB8PSAoKDIgPDwgQ1JBQklUX0NMS1NSQ19CKQkvLyAgIENsa1NyY0Igc291cmNlIGlzIE92ZXJmbG93QSAoc2FtZSBhcyAidGltZXIiKQorCQkJfCAoKHNldHVwICYgU1RETVNLX0NMS1BPTCkgPDwgKENSQUJJVF9DTEtTUkNfQiAtIFNUREJJVF9DTEtQT0wpKSk7CS8vICAgICB3aXRoIGRpcmVjdGlvbiBvYnRhaW5lZCBmcm9tIENsa1BvbC4KKwkJY3JiIHw9ICgoMSA8PCBDUkJCSVRfQ0xLUE9MX0IpCS8vICAgQ2xrUG9sQiBjb250cm9scyBJbmRleEIgLS0gYWx3YXlzIHNldCB0byBhY3RpdmUuCisJCQl8IChNVUxUX1gwIDw8IENSQkJJVF9DTEtNVUxUX0IpKTsJLy8gICBDbGtNdWx0QiBzZWxlY3RzIE92ZXJmbG93QSBhcyB0aGUgY2xvY2sgc291cmNlLgorCQlicmVhazsKKworCWRlZmF1bHQ6CQkvLyBDb3VudGVyIE1vZGU6CisJCWNyYSB8PSAoQ0xLU1JDX0NPVU5URVIgPDwgQ1JBQklUX0NMS1NSQ19CKTsJLy8gICBTZWxlY3QgRU5DX0MgYW5kIEVOQ19EIGFzIGNsb2NrL2RpcmVjdGlvbiBpbnB1dHMuCisJCWNyYiB8PSAoKChzZXR1cCAmIFNURE1TS19DTEtQT0wpID4+IChTVERCSVRfQ0xLUE9MIC0gQ1JCQklUX0NMS1BPTF9CKSkJLy8gICBDbGtQb2wgaXMgcGFzc2VkIHRocm91Z2guCisJCQl8ICgoKHNldHVwICYgU1RETVNLX0NMS01VTFQpID09IChNVUxUX1gwIDw8IFNUREJJVF9DTEtNVUxUKSkgPwkvLyAgIEZvcmNlIENsa011bHQgdG8geDEgaWYgbm90IGxlZ2FsLCBvdGhlcndpc2UgcGFzcyB0aHJvdWdoLgorCQkJCShNVUxUX1gxIDw8IENSQkJJVF9DTEtNVUxUX0IpIDoKKwkJCQkoKHNldHVwICYgU1RETVNLX0NMS01VTFQpIDw8IChDUkJCSVRfQ0xLTVVMVF9CIC0KKwkJCQkJCVNUREJJVF9DTEtNVUxUKSkpKTsKKwl9CisKKwkvLyBGb3JjZSBwb3NpdGl2ZSBpbmRleCBwb2xhcml0eSBpZiBJbmR4U3JjIGlzIHNvZnR3YXJlLWRyaXZlbiBvbmx5LAorCS8vIG90aGVyd2lzZSBwYXNzIGl0IHRocm91Z2guCisJaWYgKH5zZXR1cCAmIFNURE1TS19JTkRYU1JDKQorCQljcmIgfD0gKChzZXR1cCAmIFNURE1TS19JTkRYUE9MKSA+PiAoU1REQklUX0lORFhQT0wgLQorCQkJCUNSQkJJVF9JTkRYUE9MX0IpKTsKKworCS8vIElmIEludFNyYyBoYXMgYmVlbiBmb3JjZWQgdG8gRGlzYWJsZWQsIHVwZGF0ZSB0aGUgTUlTQzIgaW50ZXJydXB0CisJLy8gZW5hYmxlIG1hc2sgdG8gaW5kaWNhdGUgdGhlIGNvdW50ZXIgaW50ZXJydXB0IGlzIGRpc2FibGVkLgorCWlmIChEaXNhYmxlSW50U3JjKQorCQlkZXZwcml2LT5Db3VudGVySW50RW5hYnMgJj0gfmstPk15RXZlbnRCaXRzWzNdOworCisJLy8gV2hpbGUgcmV0YWluaW5nIENvdW50ZXJBIGFuZCBMYXRjaFNyYyBjb25maWd1cmF0aW9ucywgcHJvZ3JhbSB0aGUKKwkvLyBuZXcgY291bnRlciBvcGVyYXRpbmcgbW9kZS4KKwlERUJJcmVwbGFjZShkZXYsIGstPk15Q1JBLAorCQkodWludDE2X3QpICh+KENSQU1TS19JTkRYU1JDX0IgfCBDUkFNU0tfQ0xLU1JDX0IpKSwgY3JhKTsKKwlERUJJcmVwbGFjZShkZXYsIGstPk15Q1JCLCBDUkJNU0tfQ0xLRU5BQl9BIHwgQ1JCTVNLX0xBVENIU1JDLCBjcmIpOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFJldHVybi9zZXQgYSBjb3VudGVyJ3MgZW5hYmxlLiAgZW5hYjogMD1hbHdheXMgZW5hYmxlZCwgMT1lbmFibGVkIGJ5IGluZGV4LgorCitzdGF0aWMgdm9pZCBTZXRFbmFibGVfQShjb21lZGlfZGV2aWNlICogZGV2LCBlbmNfcHJpdmF0ZSAqIGssIHVpbnQxNl90IGVuYWIpCit7CisJREVCVUcoIlNldEVuYWJsZV9BOiBTZXRFbmFibGVfQSBlbnRlciAzNTQxXG4iKTsKKwlERUJJcmVwbGFjZShkZXYsIGstPk15Q1JCLAorCQkodWludDE2X3QpICh+KENSQk1TS19JTlRDVFJMIHwgQ1JCTVNLX0NMS0VOQUJfQSkpLAorCQkodWludDE2X3QpIChlbmFiIDw8IENSQkJJVF9DTEtFTkFCX0EpKTsKK30KKworc3RhdGljIHZvaWQgU2V0RW5hYmxlX0IoY29tZWRpX2RldmljZSAqIGRldiwgZW5jX3ByaXZhdGUgKiBrLCB1aW50MTZfdCBlbmFiKQoreworCURFQklyZXBsYWNlKGRldiwgay0+TXlDUkIsCisJCSh1aW50MTZfdCkgKH4oQ1JCTVNLX0lOVENUUkwgfCBDUkJNU0tfQ0xLRU5BQl9CKSksCisJCSh1aW50MTZfdCkgKGVuYWIgPDwgQ1JCQklUX0NMS0VOQUJfQikpOworfQorCitzdGF0aWMgdWludDE2X3QgR2V0RW5hYmxlX0EoY29tZWRpX2RldmljZSAqIGRldiwgZW5jX3ByaXZhdGUgKiBrKQoreworCXJldHVybiAoREVCSXJlYWQoZGV2LCBrLT5NeUNSQikgPj4gQ1JCQklUX0NMS0VOQUJfQSkgJiAxOworfQorCitzdGF0aWMgdWludDE2X3QgR2V0RW5hYmxlX0IoY29tZWRpX2RldmljZSAqIGRldiwgZW5jX3ByaXZhdGUgKiBrKQoreworCXJldHVybiAoREVCSXJlYWQoZGV2LCBrLT5NeUNSQikgPj4gQ1JCQklUX0NMS0VOQUJfQikgJiAxOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFJldHVybi9zZXQgYSBjb3VudGVyIHBhaXIncyBsYXRjaCB0cmlnZ2VyIHNvdXJjZS4gIDA6IE9uIHJlYWQKKy8vIGFjY2VzcywgMTogQSBpbmRleCBsYXRjaGVzIEEsIDI6IEIgaW5kZXggbGF0Y2hlcyBCLCAzOiBBIG92ZXJmbG93CisvLyBsYXRjaGVzIEIuCisKK3N0YXRpYyB2b2lkIFNldExhdGNoU291cmNlKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGVuY19wcml2YXRlICogaywgdWludDE2X3QgdmFsdWUpCit7CisJREVCVUcoIlNldExhdGNoU291cmNlOiBTZXRMYXRjaFNvdXJjZSBlbnRlciAzNTUwIFxuIik7CisJREVCSXJlcGxhY2UoZGV2LCBrLT5NeUNSQiwKKwkJKHVpbnQxNl90KSAofihDUkJNU0tfSU5UQ1RSTCB8IENSQk1TS19MQVRDSFNSQykpLAorCQkodWludDE2X3QpICh2YWx1ZSA8PCBDUkJCSVRfTEFUQ0hTUkMpKTsKKworCURFQlVHKCJTZXRMYXRjaFNvdXJjZTogU2V0TGF0Y2hTb3VyY2UgZXhpdCBcbiIpOworfQorCisvKiBzdGF0aWMgdWludDE2X3QgR2V0TGF0Y2hTb3VyY2UoY29tZWRpX2RldmljZSAqZGV2LCBlbmNfcHJpdmF0ZSAqayApICovCisvKiB7ICovCisvKiAgIHJldHVybiAoIERFQklyZWFkKCBkZXYsIGstPk15Q1JCKSA+PiBDUkJCSVRfTEFUQ0hTUkMgKSAmIDM7ICovCisvKiB9ICovCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFJldHVybi9zZXQgdGhlIGV2ZW50IHRoYXQgd2lsbCB0cmlnZ2VyIHRyYW5zZmVyIG9mIHRoZSBwcmVsb2FkCisvLyByZWdpc3RlciBpbnRvIHRoZSBjb3VudGVyLiAgMD1UaGlzQ250cl9JbmRleCwgMT1UaGlzQ250cl9PdmVyZmxvdywKKy8vIDI9T3ZlcmZsb3dBIChCIGNvdW50ZXJzIG9ubHkpLCAzPWRpc2FibGVkLgorCitzdGF0aWMgdm9pZCBTZXRMb2FkVHJpZ19BKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGVuY19wcml2YXRlICogaywgdWludDE2X3QgVHJpZykKK3sKKwlERUJJcmVwbGFjZShkZXYsIGstPk15Q1JBLCAodWludDE2X3QpICh+Q1JBTVNLX0xPQURTUkNfQSksCisJCSh1aW50MTZfdCkgKFRyaWcgPDwgQ1JBQklUX0xPQURTUkNfQSkpOworfQorCitzdGF0aWMgdm9pZCBTZXRMb2FkVHJpZ19CKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGVuY19wcml2YXRlICogaywgdWludDE2X3QgVHJpZykKK3sKKwlERUJJcmVwbGFjZShkZXYsIGstPk15Q1JCLAorCQkodWludDE2X3QpICh+KENSQk1TS19MT0FEU1JDX0IgfCBDUkJNU0tfSU5UQ1RSTCkpLAorCQkodWludDE2X3QpIChUcmlnIDw8IENSQkJJVF9MT0FEU1JDX0IpKTsKK30KKworc3RhdGljIHVpbnQxNl90IEdldExvYWRUcmlnX0EoY29tZWRpX2RldmljZSAqIGRldiwgZW5jX3ByaXZhdGUgKiBrKQoreworCXJldHVybiAoREVCSXJlYWQoZGV2LCBrLT5NeUNSQSkgPj4gQ1JBQklUX0xPQURTUkNfQSkgJiAzOworfQorCitzdGF0aWMgdWludDE2X3QgR2V0TG9hZFRyaWdfQihjb21lZGlfZGV2aWNlICogZGV2LCBlbmNfcHJpdmF0ZSAqIGspCit7CisJcmV0dXJuIChERUJJcmVhZChkZXYsIGstPk15Q1JCKSA+PiBDUkJCSVRfTE9BRFNSQ19CKSAmIDM7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBSZXR1cm4vc2V0IGNvdW50ZXIgaW50ZXJydXB0IHNvdXJjZSBhbmQgY2xlYXIgYW55IGNhcHR1cmVkCisvLyBpbmRleC9vdmVyZmxvdyBldmVudHMuICBJbnRTb3VyY2U6IDA9RGlzYWJsZWQsIDE9T3ZlcmZsb3dPbmx5LAorLy8gMj1JbmRleE9ubHksIDM9SW5kZXhBbmRPdmVyZmxvdy4KKworc3RhdGljIHZvaWQgU2V0SW50U3JjX0EoY29tZWRpX2RldmljZSAqIGRldiwgZW5jX3ByaXZhdGUgKiBrLAorCXVpbnQxNl90IEludFNvdXJjZSkKK3sKKwkvLyBSZXNldCBhbnkgcGVuZGluZyBjb3VudGVyIG92ZXJmbG93IG9yIGluZGV4IGNhcHR1cmVzLgorCURFQklyZXBsYWNlKGRldiwgay0+TXlDUkIsICh1aW50MTZfdCkgKH5DUkJNU0tfSU5UQ1RSTCksCisJCUNSQk1TS19JTlRSRVNFVENNRCB8IENSQk1TS19JTlRSRVNFVF9BKTsKKworCS8vIFByb2dyYW0gY291bnRlciBpbnRlcnJ1cHQgc291cmNlLgorCURFQklyZXBsYWNlKGRldiwgay0+TXlDUkEsIH5DUkFNU0tfSU5UU1JDX0EsCisJCSh1aW50MTZfdCkgKEludFNvdXJjZSA8PCBDUkFCSVRfSU5UU1JDX0EpKTsKKworCS8vIFVwZGF0ZSBNSVNDMiBpbnRlcnJ1cHQgZW5hYmxlIG1hc2suCisJZGV2cHJpdi0+Q291bnRlckludEVuYWJzID0KKwkJKGRldnByaXYtPkNvdW50ZXJJbnRFbmFicyAmIH5rLT5NeUV2ZW50Qml0c1szXSkgfCBrLT4KKwkJTXlFdmVudEJpdHNbSW50U291cmNlXTsKK30KKworc3RhdGljIHZvaWQgU2V0SW50U3JjX0IoY29tZWRpX2RldmljZSAqIGRldiwgZW5jX3ByaXZhdGUgKiBrLAorCXVpbnQxNl90IEludFNvdXJjZSkKK3sKKwl1aW50MTZfdCBjcmI7CisKKwkvLyBDYWNoZSB3cml0ZWFibGUgQ1JCIHJlZ2lzdGVyIGltYWdlLgorCWNyYiA9IERFQklyZWFkKGRldiwgay0+TXlDUkIpICYgfkNSQk1TS19JTlRDVFJMOworCisJLy8gUmVzZXQgYW55IHBlbmRpbmcgY291bnRlciBvdmVyZmxvdyBvciBpbmRleCBjYXB0dXJlcy4KKwlERUJJd3JpdGUoZGV2LCBrLT5NeUNSQiwKKwkJKHVpbnQxNl90KSAoY3JiIHwgQ1JCTVNLX0lOVFJFU0VUQ01EIHwgQ1JCTVNLX0lOVFJFU0VUX0IpKTsKKworCS8vIFByb2dyYW0gY291bnRlciBpbnRlcnJ1cHQgc291cmNlLgorCURFQkl3cml0ZShkZXYsIGstPk15Q1JCLAorCQkodWludDE2X3QpICgoY3JiICYgfkNSQk1TS19JTlRTUkNfQikgfCAoSW50U291cmNlIDw8CisJCQkJQ1JCQklUX0lOVFNSQ19CKSkpOworCisJLy8gVXBkYXRlIE1JU0MyIGludGVycnVwdCBlbmFibGUgbWFzay4KKwlkZXZwcml2LT5Db3VudGVySW50RW5hYnMgPQorCQkoZGV2cHJpdi0+Q291bnRlckludEVuYWJzICYgfmstPk15RXZlbnRCaXRzWzNdKSB8IGstPgorCQlNeUV2ZW50Qml0c1tJbnRTb3VyY2VdOworfQorCitzdGF0aWMgdWludDE2X3QgR2V0SW50U3JjX0EoY29tZWRpX2RldmljZSAqIGRldiwgZW5jX3ByaXZhdGUgKiBrKQoreworCXJldHVybiAoREVCSXJlYWQoZGV2LCBrLT5NeUNSQSkgPj4gQ1JBQklUX0lOVFNSQ19BKSAmIDM7Cit9CisKK3N0YXRpYyB1aW50MTZfdCBHZXRJbnRTcmNfQihjb21lZGlfZGV2aWNlICogZGV2LCBlbmNfcHJpdmF0ZSAqIGspCit7CisJcmV0dXJuIChERUJJcmVhZChkZXYsIGstPk15Q1JCKSA+PiBDUkJCSVRfSU5UU1JDX0IpICYgMzsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gUmV0dXJuL3NldCB0aGUgY2xvY2sgbXVsdGlwbGllci4KKworLyogc3RhdGljIHZvaWQgU2V0Q2xrTXVsdChjb21lZGlfZGV2aWNlICpkZXYsIGVuY19wcml2YXRlICprLCB1aW50MTZfdCB2YWx1ZSApICAqLworLyogeyAqLworLyogICBrLT5TZXRNb2RlKGRldiwgaywgKHVpbnQxNl90KSggKCBrLT5HZXRNb2RlKGRldiwgayApICYgflNURE1TS19DTEtNVUxUICkgfCAoIHZhbHVlIDw8IFNUREJJVF9DTEtNVUxUICkgKSwgRkFMU0UgKTsgKi8KKy8qIH0gKi8KKworLyogc3RhdGljIHVpbnQxNl90IEdldENsa011bHQoY29tZWRpX2RldmljZSAqZGV2LCBlbmNfcHJpdmF0ZSAqayApICAqLworLyogeyAqLworLyogICByZXR1cm4gKCBrLT5HZXRNb2RlKGRldiwgayApID4+IFNUREJJVF9DTEtNVUxUICkgJiAzOyAqLworLyogfSAqLworCisvKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAqLworLyogLy8gUmV0dXJuL3NldCB0aGUgY2xvY2sgcG9sYXJpdHkuICovCisKKy8qIHN0YXRpYyB2b2lkIFNldENsa1BvbCggY29tZWRpX2RldmljZSAqZGV2LGVuY19wcml2YXRlICprLCB1aW50MTZfdCB2YWx1ZSApICAqLworLyogeyAqLworLyogICBrLT5TZXRNb2RlKGRldiwgaywgKHVpbnQxNl90KSggKCBrLT5HZXRNb2RlKGRldiwgayApICYgflNURE1TS19DTEtQT0wgKSB8ICggdmFsdWUgPDwgU1REQklUX0NMS1BPTCApICksIEZBTFNFICk7ICovCisvKiB9ICovCisKKy8qIHN0YXRpYyB1aW50MTZfdCBHZXRDbGtQb2woY29tZWRpX2RldmljZSAqZGV2LCBlbmNfcHJpdmF0ZSAqayApICAqLworLyogeyAqLworLyogICByZXR1cm4gKCBrLT5HZXRNb2RlKGRldiwgayApID4+IFNUREJJVF9DTEtQT0wgKSAmIDE7ICovCisvKiB9ICovCisKKy8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vICovCisvKiAvLyBSZXR1cm4vc2V0IHRoZSBjbG9jayBzb3VyY2UuICovCisKKy8qIHN0YXRpYyB2b2lkIFNldENsa1NyYyggY29tZWRpX2RldmljZSAqZGV2LGVuY19wcml2YXRlICprLCB1aW50MTZfdCB2YWx1ZSApICAqLworLyogeyAqLworLyogICBrLT5TZXRNb2RlKGRldiwgaywgKHVpbnQxNl90KSggKCBrLT5HZXRNb2RlKGRldiwgayApICYgflNURE1TS19DTEtTUkMgKSB8ICggdmFsdWUgPDwgU1REQklUX0NMS1NSQyApICksIEZBTFNFICk7ICovCisvKiB9ICovCisKKy8qIHN0YXRpYyB1aW50MTZfdCBHZXRDbGtTcmMoIGNvbWVkaV9kZXZpY2UgKmRldixlbmNfcHJpdmF0ZSAqayApICAqLworLyogeyAqLworLyogICByZXR1cm4gKCBrLT5HZXRNb2RlKGRldiwgayApID4+IFNUREJJVF9DTEtTUkMgKSAmIDM7ICovCisvKiB9ICovCisKKy8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAqLworLyogLy8gUmV0dXJuL3NldCB0aGUgaW5kZXggcG9sYXJpdHkuICovCisKKy8qIHN0YXRpYyB2b2lkIFNldEluZGV4UG9sKGNvbWVkaV9kZXZpY2UgKmRldiwgZW5jX3ByaXZhdGUgKmssIHVpbnQxNl90IHZhbHVlICkgICovCisvKiB7ICovCisvKiAgIGstPlNldE1vZGUoZGV2LCBrLCAodWludDE2X3QpKCAoIGstPkdldE1vZGUoZGV2LCBrICkgJiB+U1RETVNLX0lORFhQT0wgKSB8ICggKHZhbHVlICE9IDApIDw8IFNUREJJVF9JTkRYUE9MICkgKSwgRkFMU0UgKTsgKi8KKy8qIH0gKi8KKworLyogc3RhdGljIHVpbnQxNl90IEdldEluZGV4UG9sKGNvbWVkaV9kZXZpY2UgKmRldiwgZW5jX3ByaXZhdGUgKmsgKSAgKi8KKy8qIHsgKi8KKy8qICAgcmV0dXJuICggay0+R2V0TW9kZShkZXYsIGsgKSA+PiBTVERCSVRfSU5EWFBPTCApICYgMTsgKi8KKy8qIH0gKi8KKworLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vICovCisvKiAvLyBSZXR1cm4vc2V0IHRoZSBpbmRleCBzb3VyY2UuICovCisKKy8qIHN0YXRpYyB2b2lkIFNldEluZGV4U3JjKGNvbWVkaV9kZXZpY2UgKmRldiwgZW5jX3ByaXZhdGUgKmssIHVpbnQxNl90IHZhbHVlICkgICovCisvKiB7ICovCisvKiAgIERFQlVHKCJTZXRJbmRleFNyYzogc2V0IGluZGV4IHNyYyBlbnRlciAzNzAwXG4iKTsgKi8KKy8qICAgay0+U2V0TW9kZShkZXYsIGssICh1aW50MTZfdCkoICggay0+R2V0TW9kZShkZXYsIGsgKSAmIH5TVERNU0tfSU5EWFNSQyApIHwgKCAodmFsdWUgIT0gMCkgPDwgU1REQklUX0lORFhTUkMgKSApLCBGQUxTRSApOyAqLworLyogfSAqLworCisvKiBzdGF0aWMgdWludDE2X3QgR2V0SW5kZXhTcmMoY29tZWRpX2RldmljZSAqZGV2LCBlbmNfcHJpdmF0ZSAqayApICAqLworLyogeyAqLworLyogICByZXR1cm4gKCBrLT5HZXRNb2RlKGRldiwgayApID4+IFNUREJJVF9JTkRYU1JDICkgJiAxOyAqLworLyogfSAqLworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBHZW5lcmF0ZSBhbiBpbmRleCBwdWxzZS4KKworc3RhdGljIHZvaWQgUHVsc2VJbmRleF9BKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGVuY19wcml2YXRlICogaykKK3sKKwlyZWdpc3RlciB1aW50MTZfdCBjcmE7CisKKwlERUJVRygiUHVsc2VJbmRleF9BOiBwdWxzZSBpbmRleCBlbnRlclxuIik7CisKKwljcmEgPSBERUJJcmVhZChkZXYsIGstPk15Q1JBKTsJLy8gUHVsc2UgaW5kZXguCisJREVCSXdyaXRlKGRldiwgay0+TXlDUkEsICh1aW50MTZfdCkgKGNyYSBeIENSQU1TS19JTkRYUE9MX0EpKTsKKwlERUJVRygiUHVsc2VJbmRleF9BOiBwdWxzZSBpbmRleCBzdGVwMVxuIik7CisJREVCSXdyaXRlKGRldiwgay0+TXlDUkEsIGNyYSk7Cit9CisKK3N0YXRpYyB2b2lkIFB1bHNlSW5kZXhfQihjb21lZGlfZGV2aWNlICogZGV2LCBlbmNfcHJpdmF0ZSAqIGspCit7CisJcmVnaXN0ZXIgdWludDE2X3QgY3JiOworCisJY3JiID0gREVCSXJlYWQoZGV2LCBrLT5NeUNSQikgJiB+Q1JCTVNLX0lOVENUUkw7CS8vIFB1bHNlIGluZGV4LgorCURFQkl3cml0ZShkZXYsIGstPk15Q1JCLCAodWludDE2X3QpIChjcmIgXiBDUkJNU0tfSU5EWFBPTF9CKSk7CisJREVCSXdyaXRlKGRldiwgay0+TXlDUkIsIGNyYik7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gV3JpdGUgdmFsdWUgaW50byBjb3VudGVyIHByZWxvYWQgcmVnaXN0ZXIuCisKK3N0YXRpYyB2b2lkIFByZWxvYWQoY29tZWRpX2RldmljZSAqIGRldiwgZW5jX3ByaXZhdGUgKiBrLCB1aW50MzJfdCB2YWx1ZSkKK3sKKwlERUJVRygiUHJlbG9hZDogcHJlbG9hZCBlbnRlclxuIik7CisJREVCSXdyaXRlKGRldiwgKHVpbnQxNl90KSAoay0+TXlMYXRjaExzdyksICh1aW50MTZfdCkgdmFsdWUpOwkvLyBXcml0ZSB2YWx1ZSB0byBwcmVsb2FkIHJlZ2lzdGVyLgorCURFQlVHKCJQcmVsb2FkOiBwcmVsb2FkIHN0ZXAgMVxuIik7CisJREVCSXdyaXRlKGRldiwgKHVpbnQxNl90KSAoay0+TXlMYXRjaExzdyArIDIpLAorCQkodWludDE2X3QpICh2YWx1ZSA+PiAxNikpOworfQorCitzdGF0aWMgdm9pZCBDb3VudGVyc0luaXQoY29tZWRpX2RldmljZSAqIGRldikKK3sKKwlpbnQgY2hhbjsKKwllbmNfcHJpdmF0ZSAqazsKKwl1aW50MTZfdCBTZXR1cCA9IChMT0FEU1JDX0lORFggPDwgQkZfTE9BRFNSQykgfAkvLyBQcmVsb2FkIHVwb24KKwkJLy8gaW5kZXguCisJCShJTkRYU1JDX1NPRlQgPDwgQkZfSU5EWFNSQykgfAkvLyBEaXNhYmxlIGhhcmR3YXJlIGluZGV4LgorCQkoQ0xLU1JDX0NPVU5URVIgPDwgQkZfQ0xLU1JDKSB8CS8vIE9wZXJhdGluZyBtb2RlIGlzIGNvdW50ZXIuCisJCShDTEtQT0xfUE9TIDw8IEJGX0NMS1BPTCkgfAkvLyBBY3RpdmUgaGlnaCBjbG9jay4KKwkJKENOVERJUl9VUCA8PCBCRl9DTEtQT0wpIHwJLy8gQ291bnQgZGlyZWN0aW9uIGlzIHVwLgorCQkoQ0xLTVVMVF8xWCA8PCBCRl9DTEtNVUxUKSB8CS8vIENsb2NrIG11bHRpcGxpZXIgaXMgMXguCisJCShDTEtFTkFCX0lOREVYIDw8IEJGX0NMS0VOQUIpOwkvLyBFbmFibGVkIGJ5IGluZGV4CisKKwkvLyBEaXNhYmxlIGFsbCBjb3VudGVyIGludGVycnVwdHMgYW5kIGNsZWFyIGFueSBjYXB0dXJlZCBjb3VudGVyIGV2ZW50cy4KKwlmb3IgKGNoYW4gPSAwOyBjaGFuIDwgUzYyNl9FTkNPREVSX0NIQU5ORUxTOyBjaGFuKyspIHsKKwkJayA9ICZlbmNwcml2W2NoYW5dOworCQlrLT5TZXRNb2RlKGRldiwgaywgU2V0dXAsIFRSVUUpOworCQlrLT5TZXRJbnRTcmMoZGV2LCBrLCAwKTsKKwkJay0+UmVzZXRDYXBGbGFncyhkZXYsIGspOworCQlrLT5TZXRFbmFibGUoZGV2LCBrLCBDTEtFTkFCX0FMV0FZUyk7CisJfQorCURFQlVHKCJDb3VudGVyc0luaXQ6IGNvdW50ZXJzIGluaXRpYWxpemVkIFxuIik7CisKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9zNjI2LmggYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvczYyNi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExZDhiMWMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvczYyNi5oCkBAIC0wLDAgKzEsODAyIEBACisvKgorICBjb21lZGkvZHJpdmVycy9zNjI2LmgKKyAgU2Vuc29yYXkgczYyNiBDb21lZGkgZHJpdmVyLCBoZWFkZXIgZmlsZQorCisgIENPTUVESSAtIExpbnV4IENvbnRyb2wgYW5kIE1lYXN1cmVtZW50IERldmljZSBJbnRlcmZhY2UKKyAgQ29weXJpZ2h0IChDKSAyMDAwIERhdmlkIEEuIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisgIEJhc2VkIG9uIFNlbnNvcmF5IE1vZGVsIDYyNiBMaW51eCBkcml2ZXIgVmVyc2lvbiAwLjIKKyAgQ29weXJpZ2h0IChDKSAyMDAyLTIwMDQgU2Vuc29yYXkgQ28uLCBJbmMuCisKKyAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisqLworCisvKgorICBEcml2ZXI6IHM2MjYubyAoczYyNi5rbykKKyAgRGVzY3JpcHRpb246IFNlbnNvcmF5IDYyNiBkcml2ZXIKKyAgRGV2aWNlczogU2Vuc29yYXkgczYyNgorICBBdXRob3JzOiBHaWFubHVjYSBQYWxsaSA8Z3BhbGxpQGRlaXMudW5pYm8uaXQ+LAorICBVcGRhdGVkOiBUaHUsIDEyIEp1bCAyMDA1CisgIFN0YXR1czogZXhwZXJpbWVudGFsCisKKyAgQ29uZmlndXJhdGlvbiBPcHRpb25zOgorICBhbmFsb2cgaW5wdXQ6CisgICBub25lCisKKyAgYW5hbG9nIG91dHB1dDoKKyAgIG5vbmUKKworICBkaWdpdGFsIGNoYW5uZWw6CisgICBzNjI2IGhhcyAzIGRpbyBzdWJkZXZpY2VzICgyLDMgYW5kIDQpIGVhY2ggd2l0aCAxNiBpL28gY2hhbm5lbHMKKyAgIHN1cHBvcnRlZCBjb25maWd1cmF0aW9uIG9wdGlvbnM6CisgICBJTlNOX0NPTkZJR19ESU9fUVVFUlkKKyAgIENPTUVESV9JTlBVVAorICAgQ09NRURJX09VVFBVVAorCisgIGVuY29kZXI6CisgICBFdmVyeSBjaGFubmVsIG11c3QgYmUgY29uZmlndXJlZCBiZWZvcmUgcmVhZGluZy4KKworICAgRXhhbXBsZSBjb2RlCisKKyAgIGluc24uaW5zbj1JTlNOX0NPTkZJRzsgICAvL2NvbmZpZ3VyYXRpb24gaW5zdHJ1Y3Rpb24KKyAgIGluc24ubj0xOyAgICAgICAgICAgICAgICAvL251bWJlciBvZiBvcGVyYXRpb24gKG11c3QgYmUgMSkKKyAgIGluc24uZGF0YT0maW5pdGlhbHZhbHVlOyAvL2luaXRpYWwgdmFsdWUgbG9hZGVkIGludG8gZW5jb2RlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZHVyaW5nIGNvbmZpZ3VyYXRpb24KKyAgIGluc24uc3ViZGV2PTU7ICAgICAgICAgICAvL2VuY29kZXIgc3ViZGV2aWNlCisgICBpbnNuLmNoYW5zcGVjPUNSX1BBQ0soZW5jb2Rlcl9jaGFubmVsLDAsQVJFRl9PVEhFUik7IC8vZW5jb2Rlcl9jaGFubmVsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vdG8gY29uZmlndXJlCisKKyAgIGNvbWVkaV9kb19pbnNuKGNmLCZpbnNuKTsgLy9leGVjdXRpbmcgY29uZmlndXJhdGlvbgorKi8KKworI2lmZGVmIF9ERUJVR18KKyNkZWZpbmUgREVCVUcoLi4uKTsgICAgICAgIHJ0X3ByaW50ayhfX1ZBX0FSR1NfXyk7CisjZWxzZQorI2RlZmluZSBERUJVRyguLi4pCisjZW5kaWYKKworI2lmICFkZWZpbmVkKFRSVUUpCisjZGVmaW5lIFRSVUUgICAgKDEpCisjZW5kaWYKKworI2lmICFkZWZpbmVkKEZBTFNFKQorI2RlZmluZSBGQUxTRSAgICgwKQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChFWFRFUk4pCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKKyNkZWZpbmUgRVhURVJOIGV4dGVybiAiQyIKKyNlbHNlCisjZGVmaW5lIEVYVEVSTiBleHRlcm4KKyNlbmRpZgorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChJTkxJTkUpCisjZGVmaW5lIElOTElORSBzdGF0aWMgX19pbmxpbmUKKyNlbmRpZgorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworI2luY2x1ZGU8bGludXgvc2xhYi5oPgorCisjZGVmaW5lIFM2MjZfU0laRSAweDAyMDAKKyNkZWZpbmUgU0laRU9GX0FERFJFU1NfU1BBQ0UJCTB4MDIwMAorI2RlZmluZSBETUFCVUZfU0laRQkJCTQwOTYJLy8gNGsgcGFnZXMKKworI2RlZmluZSBTNjI2X0FEQ19DSEFOTkVMUyAgICAgICAxNgorI2RlZmluZSBTNjI2X0RBQ19DSEFOTkVMUyAgICAgICA0CisjZGVmaW5lIFM2MjZfRU5DT0RFUl9DSEFOTkVMUyAgIDYKKyNkZWZpbmUgUzYyNl9ESU9fQ0hBTk5FTFMgICAgICAgNDgKKyNkZWZpbmUgUzYyNl9ESU9fQkFOS1MJCTMJLy8gTnVtYmVyIG9mIERJTyBncm91cHMuCisjZGVmaW5lIFM2MjZfRElPX0VYVENIQU5TCTQwCS8vIE51bWJlciBvZgorCQkJCQkvLyBleHRlbmRlZC1jYXBhYmlsaXR5CisJCQkJCS8vIERJTyBjaGFubmVscy4KKworI2RlZmluZSBOVU1fVFJJTURBQ1MJMTIJLy8gTnVtYmVyIG9mIHZhbGlkIFRyaW1EQUMgY2hhbm5lbHMuCisKKy8vIFBDSSBidXMgaW50ZXJmYWNlIHR5cGVzLgorI2RlZmluZSBJTlRFTAkJCQkxCS8vIEludGVsIGJ1cyB0eXBlLgorI2RlZmluZSBNT1RPUk9MQQkJCTIJLy8gTW90b3JvbGEgYnVzIHR5cGUuCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworI2RlZmluZSBQTEFURk9STQkJSU5URUwJLy8gKioqIFNFTEVDVCBQTEFURk9STSBUWVBFICoqKgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisjZGVmaW5lIFJBTkdFXzVWICAgICAgICAgICAgICAgIDB4MTAJLy8gKy8tNVYgcmFuZ2UKKyNkZWZpbmUgUkFOR0VfMTBWICAgICAgICAgICAgICAgMHgwMAkvLyArLy0xMFYgcmFuZ2UKKworI2RlZmluZSBFT1BMCQkJMHg4MAkvLyBFbmQgb2YgQURDIHBvbGwgbGlzdCBtYXJrZXIuCisjZGVmaW5lIEdTRUxfQklQT0xBUjVWCQkweDAwRjAJLy8gTFBfR1NFTCBzZXR0aW5nIGZvciA1ViBiaXBvbGFyIHJhbmdlLgorI2RlZmluZSBHU0VMX0JJUE9MQVIxMFYJCTB4MDBBMAkvLyBMUF9HU0VMIHNldHRpbmcgZm9yIDEwViBiaXBvbGFyIHJhbmdlLgorCisvLyBFcnJvciBjb2RlcyB0aGF0IG11c3QgYmUgdmlzaWJsZSB0byB0aGlzIGJhc2UgY2xhc3MuCisjZGVmaW5lIEVSUl9JTExFR0FMX1BBUk0JMHgwMDAxMDAwMAkvLyBJbGxlZ2FsIGZ1bmN0aW9uIHBhcmFtZXRlciB2YWx1ZSB3YXMgc3BlY2lmaWVkLgorI2RlZmluZSBFUlJfSTJDCQkJMHgwMDAyMDAwMAkvLyBJMkMgZXJyb3IuCisjZGVmaW5lIEVSUl9DT1VOVEVSU0VUVVAJMHgwMDIwMDAwMAkvLyBJbGxlZ2FsIHNldHVwIHNwZWNpZmllZCBmb3IgY291bnRlciBjaGFubmVsLgorI2RlZmluZSBFUlJfREVCSV9USU1FT1VUCTB4MDA0MDAwMDAJLy8gREVCSSB0cmFuc2ZlciB0aW1lZCBvdXQuCisKKy8vIE9yZ2FuaXphdGlvbiAocGh5c2ljYWwgb3JkZXIpIGFuZCBzaXplIChpbiBEV09SRHMpIG9mIGxvZ2ljYWwgRE1BIGJ1ZmZlcnMgY29udGFpbmVkIGJ5IEFOQV9ETUFCVUYuCisjZGVmaW5lIEFEQ19ETUFCVUZfRFdPUkRTCTQwCS8vIEFEQyBETUEgYnVmZmVyIG11c3QgaG9sZCAxNiBzYW1wbGVzLCBwbHVzIHByZS9wb3N0IGdhcmJhZ2Ugc2FtcGxlcy4KKyNkZWZpbmUgREFDX1dETUFCVUZfRFdPUkRTCTEJLy8gREFDIG91dHB1dCBETUEgYnVmZmVyIGhvbGRzIGEgc2luZ2xlIHNhbXBsZS4KKworLy8gQWxsIHJlbWFpbmluZyBzcGFjZSBpbiA0S0IgRE1BIGJ1ZmZlciBpcyBhdmFpbGFibGUgZm9yIHRoZSBSUFMxIHByb2dyYW0uCisKKy8vIEFkZHJlc3Mgb2Zmc2V0cywgaW4gRFdPUkRTLCBmcm9tIGJhc2Ugb2YgRE1BIGJ1ZmZlci4KKyNkZWZpbmUgREFDX1dETUFCVUZfT1MJCUFEQ19ETUFCVUZfRFdPUkRTCisKKy8vIEludGVycnVwdCBlbmFiIGJpdCBpbiBJU1IgYW5kIElFUi4KKyNkZWZpbmUgSVJRX0dQSU8zCQkweDAwMDAwMDQwCS8vIElSUSBlbmFibGUgZm9yIEdQSU8zLgorI2RlZmluZSBJUlFfUlBTMSAgICAgICAgICAgICAgICAweDEwMDAwMDAwCisjZGVmaW5lIElTUl9BRk9VCQkweDAwMDAwODAwCS8vIEF1ZGlvIGZpZm8KKwkJCQkJCS8vIHVuZGVyL292ZXJmbG93CisJCQkJCQkvLyBkZXRlY3RlZC4KKyNkZWZpbmUgSVJRX0NPSU5UMUEgICAgICAgICAgICAgMHgwNDAwCS8vIGNvbnRlciAxQSBvdmVyZmxvdworCQkJCQkJLy8gaW50ZXJydXB0IG1hc2sKKyNkZWZpbmUgSVJRX0NPSU5UMUIgICAgICAgICAgICAgMHgwODAwCS8vIGNvbnRlciAxQiBvdmVyZmxvdworCQkJCQkJLy8gaW50ZXJydXB0IG1hc2sKKyNkZWZpbmUgSVJRX0NPSU5UMkEgICAgICAgICAgICAgMHgxMDAwCS8vIGNvbnRlciAyQSBvdmVyZmxvdworCQkJCQkJLy8gaW50ZXJydXB0IG1hc2sKKyNkZWZpbmUgSVJRX0NPSU5UMkIgICAgICAgICAgICAgMHgyMDAwCS8vIGNvbnRlciAyQiBvdmVyZmxvdworCQkJCQkJLy8gaW50ZXJydXB0IG1hc2sKKyNkZWZpbmUgSVJRX0NPSU5UM0EgICAgICAgICAgICAgMHg0MDAwCS8vIGNvbnRlciAzQSBvdmVyZmxvdworCQkJCQkJLy8gaW50ZXJydXB0IG1hc2sKKyNkZWZpbmUgSVJRX0NPSU5UM0IgICAgICAgICAgICAgMHg4MDAwCS8vIGNvbnRlciAzQiBvdmVyZmxvdworCQkJCQkJLy8gaW50ZXJydXB0IG1hc2sKKworLy8gUlBTIGNvbW1hbmQgY29kZXMuCisjZGVmaW5lIFJQU19DTFJTSUdOQUwJCTB4MDAwMDAwMDAJLy8gQ0xFQVIgU0lHTkFMCisjZGVmaW5lIFJQU19TRVRTSUdOQUwJCTB4MTAwMDAwMDAJLy8gU0VUIFNJR05BTAorI2RlZmluZSBSUFNfTk9QCQkJMHgwMDAwMDAwMAkvLyBOT1AKKyNkZWZpbmUgUlBTX1BBVVNFCQkweDIwMDAwMDAwCS8vIFBBVVNFCisjZGVmaW5lIFJQU19VUExPQUQJCTB4NDAwMDAwMDAJLy8gVVBMT0FECisjZGVmaW5lIFJQU19KVU1QCQkweDgwMDAwMDAwCS8vIEpVTVAKKyNkZWZpbmUgUlBTX0xEUkVHCQkweDkwMDAwMTAwCS8vIExEUkVHICgxIHVpbnQzMl90IG9ubHkpCisjZGVmaW5lIFJQU19TVFJFRwkJMHhBMDAwMDEwMAkvLyBTVFJFRyAoMSB1aW50MzJfdCBvbmx5KQorI2RlZmluZSBSUFNfU1RPUAkJMHg1MDAwMDAwMAkvLyBTVE9QCisjZGVmaW5lIFJQU19JUlEgICAgICAgICAgICAgICAgIDB4NjAwMDAwMDAJLy8gSVJRCisKKyNkZWZpbmUgUlBTX0xPR0lDQUxfT1IJCTB4MDgwMDAwMDAJLy8gTG9naWNhbCBPUiBjb25kaXRpb25hbHMuCisjZGVmaW5lIFJQU19JTlZFUlQJCTB4MDQwMDAwMDAJLy8gVGVzdCBmb3IgbmVnYXRlZCBzZW1hcGhvcmVzLgorI2RlZmluZSBSUFNfREVCSQkJMHgwMDAwMDAwMgkvLyBERUJJIGRvbmUKKworI2RlZmluZSBSUFNfU0lHMAkJMHgwMDIwMDAwMAkvLyBSUFMgc2VtYXBob3JlIDAgKHVzZWQgYnkgQURDKS4KKyNkZWZpbmUgUlBTX1NJRzEJCTB4MDA0MDAwMDAJLy8gUlBTIHNlbWFwaG9yZSAxICh1c2VkIGJ5IERBQykuCisjZGVmaW5lIFJQU19TSUcyCQkweDAwODAwMDAwCS8vIFJQUyBzZW1hcGhvcmUgMiAobm90IHVzZWQpLgorI2RlZmluZSBSUFNfR1BJTzIJCTB4MDAwODAwMDAJLy8gUlBTIEdQSU8yCisjZGVmaW5lIFJQU19HUElPMwkJMHgwMDEwMDAwMAkvLyBSUFMgR1BJTzMKKworI2RlZmluZSBSUFNfU0lHQURDCQlSUFNfU0lHMAkvLyBUcmlnZ2VyL3N0YXR1cyBmb3IgQURDJ3MgUlBTIHByb2dyYW0uCisjZGVmaW5lIFJQU19TSUdEQUMJCVJQU19TSUcxCS8vIFRyaWdnZXIvc3RhdHVzIGZvciBEQUMncyBSUFMgcHJvZ3JhbS4KKworLy8gUlBTIGNsb2NrIHBhcmFtZXRlcnMuCisjZGVmaW5lIFJQU0NMS19TQ0FMQVIJCTgJLy8gVGhpcyBpcyBhcHBhcmVudCByYXRpbyBvZiBQQ0kvUlBTIGNsa3MgKHVuZG9jdW1lbnRlZCEhKS4KKyNkZWZpbmUgUlBTQ0xLX1BFUl9VUwkJKCAzMyAvIFJQU0NMS19TQ0FMQVIgKQkvLyBOdW1iZXIgb2YgUlBTIGNsb2NrcyBpbiBvbmUgbWljcm9zZWNvbmQuCisKKy8vIEV2ZW50IGNvdW50ZXIgc291cmNlIGFkZHJlc3Nlcy4KKyNkZWZpbmUgU0JBX1JQU19BMAkJMHgyNwkvLyBUaW1lIG9mIFJQUzAgYnVzeSwgaW4gUENJIGNsb2Nrcy4KKworLy8gR1BJTyBjb25zdGFudHMuCisjZGVmaW5lIEdQSU9fQkFTRQkJMHgxMDAwNDAwMAkvLyBHUElPIDAsMiwzID0gaW5wdXRzLCBHUElPMyA9IElSUTsgR1BJTzEgPSBvdXQuCisjZGVmaW5lIEdQSU8xX0xPCQkweDAwMDAwMDAwCS8vIEdQSU8xIHNldCB0byBMT1cuCisjZGVmaW5lIEdQSU8xX0hJCQkweDAwMDAxMDAwCS8vIEdQSU8xIHNldCB0byBISUdILgorCisvLyBQcmltYXJ5IFN0YXR1cyBSZWdpc3RlciAoUFNSKSBjb25zdGFudHMuCisjZGVmaW5lIFBTUl9ERUJJX0UJCTB4MDAwNDAwMDAJLy8gREVCSSBldmVudCBmbGFnLgorI2RlZmluZSBQU1JfREVCSV9TCQkweDAwMDgwMDAwCS8vIERFQkkgc3RhdHVzIGZsYWcuCisjZGVmaW5lIFBTUl9BMl9JTgkJMHgwMDAwODAwMAkvLyBBdWRpbyBvdXRwdXQgRE1BMiBwcm90ZWN0aW9uIGFkZHJlc3MgcmVhY2hlZC4KKyNkZWZpbmUgUFNSX0FGT1UJCTB4MDAwMDA4MDAJLy8gQXVkaW8gRklGTyB1bmRlci9vdmVyZmxvdyBkZXRlY3RlZC4KKyNkZWZpbmUgUFNSX0dQSU8yCQkweDAwMDAwMDIwCS8vIEdQSU8yIGlucHV0IHBpbjogMD1BZGNCdXN5LCAxPUFkY0lkbGUuCisjZGVmaW5lIFBTUl9FQzBTCQkweDAwMDAwMDAxCS8vIEV2ZW50IGNvdW50ZXIgMCB0aHJlc2hvbGQgcmVhY2hlZC4KKworLy8gU2Vjb25kYXJ5IFN0YXR1cyBSZWdpc3RlciAoU1NSKSBjb25zdGFudHMuCisjZGVmaW5lIFNTUl9BRjJfT1VUCQkweDAwMDAwMjAwCS8vIEF1ZGlvIDIgb3V0cHV0IEZJRk8gdW5kZXIvb3ZlcmZsb3cgZGV0ZWN0ZWQuCisKKy8vIE1hc3RlciBDb250cm9sIFJlZ2lzdGVyIDEgKE1DMSkgY29uc3RhbnRzLgorI2RlZmluZSBNQzFfU09GVF9SRVNFVAkJMHg4MDAwMDAwMAkvLyBJbnZva2UgNzE0NiBzb2Z0IHJlc2V0LgorI2RlZmluZSBNQzFfU0hVVERPV04JCTB4M0ZGRjAwMDAJLy8gU2h1dCBkb3duIGFsbCBNQzEtY29udHJvbGxlZCBlbmFibGVzLgorCisjZGVmaW5lIE1DMV9FUlBTMQkJMHgyMDAwCS8vIGVuYWIvZGlzYWJsZSBSUFMgdGFzayAxLgorI2RlZmluZSBNQzFfRVJQUzAJCTB4MTAwMAkvLyBlbmFiL2Rpc2FibGUgUlBTIHRhc2sgMC4KKyNkZWZpbmUgTUMxX0RFQkkJCTB4MDgwMAkvLyBlbmFiL2Rpc2FibGUgREVCSSBwaW5zLgorI2RlZmluZSBNQzFfQVVESU8JCTB4MDIwMAkvLyBlbmFiL2Rpc2FibGUgYXVkaW8gcG9ydCBwaW5zLgorI2RlZmluZSBNQzFfSTJDCQkJMHgwMTAwCS8vIGVuYWIvZGlzYWJsZSBJMkMgaW50ZXJmYWNlLgorI2RlZmluZSBNQzFfQTJPVVQJCTB4MDAwOAkvLyBlbmFiL2Rpc2FibGUgdHJhbnNmZXIgb24gQTIgb3V0LgorI2RlZmluZSBNQzFfQTJJTgkJMHgwMDA0CS8vIGVuYWIvZGlzYWJsZSB0cmFuc2ZlciBvbiBBMiBpbi4KKyNkZWZpbmUgTUMxX0ExSU4JCTB4MDAwMQkvLyBlbmFiL2Rpc2FibGUgdHJhbnNmZXIgb24gQTEgaW4uCisKKy8vIE1hc3RlciBDb250cm9sIFJlZ2lzdGVyIDIgKE1DMikgY29uc3RhbnRzLgorI2RlZmluZSBNQzJfVVBMRF9ERUJJcQkJMHgwMDAyMDAwMgkvLyBVcGxvYWQgREVCSSByZWdpc3RlcnMuCisjZGVmaW5lIE1DMl9VUExEX0lJQ3EJCTB4MDAwMTAwMDEJLy8gVXBsb2FkIEkyQyByZWdpc3RlcnMuCisjZGVmaW5lIE1DMl9SUFNTSUcyX09OcQkJMHgyMDAwMjAwMAkvLyBBc3NlcnQgUlBTX1NJRzIuCisjZGVmaW5lIE1DMl9SUFNTSUcxX09OcQkJMHgxMDAwMTAwMAkvLyBBc3NlcnQgUlBTX1NJRzEuCisjZGVmaW5lIE1DMl9SUFNTSUcwX09OcQkJMHgwODAwMDgwMAkvLyBBc3NlcnQgUlBTX1NJRzAuCisjZGVmaW5lIE1DMl9VUExEX0RFQklfTUFTS3EJMHgwMDAwMDAwMgkvLyBVcGxvYWQgREVCSSBtYXNrLgorI2RlZmluZSBNQzJfVVBMRF9JSUNfTUFTS3EJMHgwMDAwMDAwMQkvLyBVcGxvYWQgSTJDIG1hc2suCisjZGVmaW5lIE1DMl9SUFNTSUcyX01BU0txCTB4MDAwMDIwMDAJLy8gUlBTX1NJRzIgYml0IG1hc2suCisjZGVmaW5lIE1DMl9SUFNTSUcxX01BU0txCTB4MDAwMDEwMDAJLy8gUlBTX1NJRzEgYml0IG1hc2suCisjZGVmaW5lIE1DMl9SUFNTSUcwX01BU0txCTB4MDAwMDA4MDAJLy8gUlBTX1NJRzAgYml0IG1hc2suCisKKyNkZWZpbmUgTUMyX0RFTEFZVFJJR180VVNxCU1DMl9SUFNTSUcxX09OCisjZGVmaW5lIE1DMl9ERUxBWUJVU1lfNFVTcQlNQzJfUlBTU0lHMV9NQVNLCisKKyNkZWZpbmUJTUMyX0RFTEFZVFJJR182VVNxCU1DMl9SUFNTSUcyX09OCisjZGVmaW5lIE1DMl9ERUxBWUJVU1lfNlVTcQlNQzJfUlBTU0lHMl9NQVNLCisKKyNkZWZpbmUgTUMyX1VQTERfREVCSQkJMHgwMDAyCS8vIFVwbG9hZCBERUJJLgorI2RlZmluZSBNQzJfVVBMRF9JSUMJCTB4MDAwMQkvLyBVcGxvYWQgSTJDLgorI2RlZmluZSBNQzJfUlBTU0lHMgkJMHgyMDAwCS8vIFJQUyBzaWduYWwgMiAobm90IHVzZWQpLgorI2RlZmluZSBNQzJfUlBTU0lHMQkJMHgxMDAwCS8vIFJQUyBzaWduYWwgMSAoREFDIFJQUyBidXN5KS4KKyNkZWZpbmUgTUMyX1JQU1NJRzAJCTB4MDgwMAkvLyBSUFMgc2lnbmFsIDAgKEFEQyBSUFMgYnVzeSkuCisKKyNkZWZpbmUgTUMyX0FEQ19SUFMJCU1DMl9SUFNTSUcwCS8vIEFEQyBSUFMgYnVzeS4KKyNkZWZpbmUgTUMyX0RBQ19SUFMJCU1DMl9SUFNTSUcxCS8vIERBQyBSUFMgYnVzeS4KKworLy8vLy8vLy8vLy8vLy8vLy8vL29sZGllcy8vLy8vLy8vLy8vCisjZGVmaW5lIE1DMl9VUExEX0RFQklRCQkweDAwMDIwMDAyCS8vIFVwbG9hZCBERUJJIHJlZ2lzdGVycy4KKyNkZWZpbmUgTUMyX1VQTERfSUlDUQkJMHgwMDAxMDAwMQkvLyBVcGxvYWQgSTJDIHJlZ2lzdGVycy4KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLy8gUENJIEJVUyAoU0FBNzE0NikgUkVHSVNURVIgQUREUkVTUyBPRkZTRVRTIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworI2RlZmluZSBQX1BDSV9CVF9BCQkweDAwNEMJLy8gQXVkaW8gRE1BCisJCQkJCQkvLyBidXJzdC90aHJlc2hvbGQKKwkJCQkJCS8vIGNvbnRyb2wuCisjZGVmaW5lIFBfREVCSUNGRyAgICAgICAgICAgICAgIDB4MDA3QwkvLyBERUJJIGNvbmZpZ3VyYXRpb24uCisjZGVmaW5lIFBfREVCSUNNRCAgICAgICAgICAgICAgIDB4MDA4MAkvLyBERUJJIGNvbW1hbmQuCisjZGVmaW5lIFBfREVCSVBBR0UgICAgICAgICAgICAgIDB4MDA4NAkvLyBERUJJIHBhZ2UuCisjZGVmaW5lIFBfREVCSUFEICAgICAgICAgICAgICAgIDB4MDA4OAkvLyBERUJJIHRhcmdldCBhZGRyZXNzLgorI2RlZmluZSBQX0kyQ0NUUkwgICAgICAgICAgICAgICAweDAwOEMJLy8gSTJDIGNvbnRyb2wuCisjZGVmaW5lIFBfSTJDU1RBVCAgICAgICAgICAgICAgIDB4MDA5MAkvLyBJMkMgc3RhdHVzLgorI2RlZmluZSBQX0JBU0VBMl9JTgkJMHgwMEFDCS8vIEF1ZGlvIGlucHV0IDIgYmFzZQorCQkJCQkJLy8gcGh5c2ljYWwgRE1BYnVmCisJCQkJCQkvLyBhZGRyZXNzLgorI2RlZmluZSBQX1BST1RBMl9JTgkJMHgwMEIwCS8vIEF1ZGlvIGlucHV0IDIKKwkJCQkJCS8vIHBoeXNpY2FsIERNQWJ1ZgorCQkJCQkJLy8gcHJvdGVjdGlvbiBhZGRyZXNzLgorI2RlZmluZSBQX1BBR0VBMl9JTgkJMHgwMEI0CS8vIEF1ZGlvIGlucHV0IDIKKwkJCQkJCS8vIHBhZ2luZyBhdHRyaWJ1dGVzLgorI2RlZmluZSBQX0JBU0VBMl9PVVQJCTB4MDBCOAkvLyBBdWRpbyBvdXRwdXQgMiBiYXNlCisJCQkJCQkvLyBwaHlzaWNhbCBETUFidWYKKwkJCQkJCS8vIGFkZHJlc3MuCisjZGVmaW5lIFBfUFJPVEEyX09VVAkJMHgwMEJDCS8vIEF1ZGlvIG91dHB1dCAyCisJCQkJCQkvLyBwaHlzaWNhbCBETUFidWYKKwkJCQkJCS8vIHByb3RlY3Rpb24gYWRkcmVzcy4KKyNkZWZpbmUgUF9QQUdFQTJfT1VUCQkweDAwQzAJLy8gQXVkaW8gb3V0cHV0IDIKKwkJCQkJCS8vIHBhZ2luZyBhdHRyaWJ1dGVzLgorI2RlZmluZSBQX1JQU1BBR0UwICAgICAgICAgICAgICAweDAwQzQJLy8gUlBTMCBwYWdlLgorI2RlZmluZSBQX1JQU1BBR0UxICAgICAgICAgICAgICAweDAwQzgJLy8gUlBTMSBwYWdlLgorI2RlZmluZSBQX1JQUzBfVE9VVAkJMHgwMEQ0CS8vIFJQUzAgdGltZS1vdXQuCisjZGVmaW5lIFBfUlBTMV9UT1VUCQkweDAwRDgJLy8gUlBTMSB0aW1lLW91dC4KKyNkZWZpbmUgUF9JRVIgICAgICAgICAgICAgICAgICAgMHgwMERDCS8vIEludGVycnVwdCBlbmFibGUuCisjZGVmaW5lIFBfR1BJTyAgICAgICAgICAgICAgICAgIDB4MDBFMAkvLyBHZW5lcmFsLXB1cnBvc2UgSS9PLgorI2RlZmluZSBQX0VDMVNTUgkJMHgwMEU0CS8vIEV2ZW50IGNvdW50ZXIgc2V0IDEKKwkJCQkJCS8vIHNvdXJjZSBzZWxlY3QuCisjZGVmaW5lIFBfRUNUMVIJCQkweDAwRUMJLy8gRXZlbnQgY291bnRlcgorCQkJCQkJLy8gdGhyZXNob2xkIHNldCAxLgorI2RlZmluZSBQX0FDT04xICAgICAgICAgICAgICAgICAweDAwRjQJLy8gQXVkaW8gY29udHJvbCAxLgorI2RlZmluZSBQX0FDT04yICAgICAgICAgICAgICAgICAweDAwRjgJLy8gQXVkaW8gY29udHJvbCAyLgorI2RlZmluZSBQX01DMSAgICAgICAgICAgICAgICAgICAweDAwRkMJLy8gTWFzdGVyIGNvbnRyb2wgMS4KKyNkZWZpbmUgUF9NQzIgICAgICAgICAgICAgICAgICAgMHgwMTAwCS8vIE1hc3RlciBjb250cm9sIDIuCisjZGVmaW5lIFBfUlBTQUREUjAgICAgICAgICAgICAgIDB4MDEwNAkvLyBSUFMwIGluc3RydWN0aW9uIHBvaW50ZXIuCisjZGVmaW5lIFBfUlBTQUREUjEgICAgICAgICAgICAgIDB4MDEwOAkvLyBSUFMxIGluc3RydWN0aW9uIHBvaW50ZXIuCisjZGVmaW5lIFBfSVNSICAgICAgICAgICAgICAgICAgIDB4MDEwQwkvLyBJbnRlcnJ1cHQgc3RhdHVzLgorI2RlZmluZSBQX1BTUiAgICAgICAgICAgICAgICAgICAweDAxMTAJLy8gUHJpbWFyeSBzdGF0dXMuCisjZGVmaW5lIFBfU1NSICAgICAgICAgICAgICAgICAgIDB4MDExNAkvLyBTZWNvbmRhcnkgc3RhdHVzLgorI2RlZmluZSBQX0VDMVIJCQkweDAxMTgJLy8gRXZlbnQgY291bnRlciBzZXQgMS4KKyNkZWZpbmUgUF9BRFA0CQkJMHgwMTM4CS8vIExvZ2ljYWwgYXVkaW8gRE1BCisJCQkJCQkvLyBwb2ludGVyIG9mIGF1ZGlvCisJCQkJCQkvLyBpbnB1dCBGSUZPIEEyX0lOLgorI2RlZmluZSBQX0ZCX0JVRkZFUjEgICAgICAgICAgICAweDAxNDQJLy8gQXVkaW8gZmVlZGJhY2sgYnVmZmVyIDEuCisjZGVmaW5lIFBfRkJfQlVGRkVSMiAgICAgICAgICAgIDB4MDE0OAkvLyBBdWRpbyBmZWVkYmFjayBidWZmZXIgMi4KKyNkZWZpbmUgUF9UU0wxICAgICAgICAgICAgICAgICAgMHgwMTgwCS8vIEF1ZGlvIHRpbWUgc2xvdCBsaXN0IDEuCisjZGVmaW5lIFBfVFNMMiAgICAgICAgICAgICAgICAgIDB4MDFDMAkvLyBBdWRpbyB0aW1lIHNsb3QgbGlzdCAyLgorCisvLyBMT0NBTCBCVVMgKEdBVEUgQVJSQVkpIFJFR0lTVEVSIEFERFJFU1MgT0ZGU0VUUyAvLy8vLy8vLy8vLy8vLy8vLworLy8gQW5hbG9nIEkvTyByZWdpc3RlcnM6CisjZGVmaW5lIExQX0RBQ1BPTAkJMHgwMDgyCS8vICBXcml0ZSBEQUMgcG9sYXJpdHkuCisjZGVmaW5lIExQX0dTRUwJCQkweDAwODQJLy8gIFdyaXRlIEFEQyBnYWluLgorI2RlZmluZSBMUF9JU0VMCQkJMHgwMDg2CS8vICBXcml0ZSBBREMgY2hhbm5lbCBzZWxlY3QuCisvLyBEaWdpdGFsIEkvTyAod3JpdGUgb25seSk6CisjZGVmaW5lIExQX1dSSU5UU0VMQQkJMHgwMDQyCS8vICBXcml0ZSBBIGludGVycnVwdCBlbmFibGUuCisjZGVmaW5lIExQX1dSRURHU0VMQQkJMHgwMDQ0CS8vICBXcml0ZSBBIGVkZ2Ugc2VsZWN0aW9uLgorI2RlZmluZSBMUF9XUkNBUFNFTEEJCTB4MDA0NgkvLyAgV3JpdGUgQSBjYXB0dXJlIGVuYWJsZS4KKyNkZWZpbmUgTFBfV1JET1VUQQkJMHgwMDQ4CS8vICBXcml0ZSBBIGRpZ2l0YWwgb3V0cHV0LgorI2RlZmluZSBMUF9XUklOVFNFTEIJCTB4MDA1MgkvLyAgV3JpdGUgQiBpbnRlcnJ1cHQgZW5hYmxlLgorI2RlZmluZSBMUF9XUkVER1NFTEIJCTB4MDA1NAkvLyAgV3JpdGUgQiBlZGdlIHNlbGVjdGlvbi4KKyNkZWZpbmUgTFBfV1JDQVBTRUxCCQkweDAwNTYJLy8gIFdyaXRlIEIgY2FwdHVyZSBlbmFibGUuCisjZGVmaW5lIExQX1dSRE9VVEIJCTB4MDA1OAkvLyAgV3JpdGUgQiBkaWdpdGFsIG91dHB1dC4KKyNkZWZpbmUgTFBfV1JJTlRTRUxDCQkweDAwNjIJLy8gIFdyaXRlIEMgaW50ZXJydXB0IGVuYWJsZS4KKyNkZWZpbmUgTFBfV1JFREdTRUxDCQkweDAwNjQJLy8gIFdyaXRlIEMgZWRnZSBzZWxlY3Rpb24uCisjZGVmaW5lIExQX1dSQ0FQU0VMQwkJMHgwMDY2CS8vICBXcml0ZSBDIGNhcHR1cmUgZW5hYmxlLgorI2RlZmluZSBMUF9XUkRPVVRDCQkweDAwNjgJLy8gIFdyaXRlIEMgZGlnaXRhbCBvdXRwdXQuCisKKy8vIERpZ2l0YWwgSS9PIChyZWFkIG9ubHkpOgorI2RlZmluZSBMUF9SRERJTkEJCTB4MDA0MAkvLyAgUmVhZCBkaWdpdGFsIGlucHV0LgorI2RlZmluZSBMUF9SRENBUEZMR0EJCTB4MDA0OAkvLyAgUmVhZCBlZGdlcyBjYXB0dXJlZC4KKyNkZWZpbmUgTFBfUkRJTlRTRUxBCQkweDAwNEEJLy8gIFJlYWQgaW50ZXJydXB0CisJCQkJCQkvLyAgZW5hYmxlIHJlZ2lzdGVyLgorI2RlZmluZSBMUF9SREVER1NFTEEJCTB4MDA0QwkvLyAgUmVhZCBlZGdlCisJCQkJCQkvLyAgc2VsZWN0aW9uCisJCQkJCQkvLyAgcmVnaXN0ZXIuCisjZGVmaW5lIExQX1JEQ0FQU0VMQQkJMHgwMDRFCS8vICBSZWFkIGNhcHR1cmUKKwkJCQkJCS8vICBlbmFibGUgcmVnaXN0ZXIuCisjZGVmaW5lIExQX1JERElOQgkJMHgwMDUwCS8vICBSZWFkIGRpZ2l0YWwgaW5wdXQuCisjZGVmaW5lIExQX1JEQ0FQRkxHQgkJMHgwMDU4CS8vICBSZWFkIGVkZ2VzIGNhcHR1cmVkLgorI2RlZmluZSBMUF9SRElOVFNFTEIJCTB4MDA1QQkvLyAgUmVhZCBpbnRlcnJ1cHQKKwkJCQkJCS8vICBlbmFibGUgcmVnaXN0ZXIuCisjZGVmaW5lIExQX1JERURHU0VMQgkJMHgwMDVDCS8vICBSZWFkIGVkZ2UKKwkJCQkJCS8vICBzZWxlY3Rpb24KKwkJCQkJCS8vICByZWdpc3Rlci4KKyNkZWZpbmUgTFBfUkRDQVBTRUxCCQkweDAwNUUJLy8gIFJlYWQgY2FwdHVyZQorCQkJCQkJLy8gIGVuYWJsZSByZWdpc3Rlci4KKyNkZWZpbmUgTFBfUkRESU5DCQkweDAwNjAJLy8gIFJlYWQgZGlnaXRhbCBpbnB1dC4KKyNkZWZpbmUgTFBfUkRDQVBGTEdDCQkweDAwNjgJLy8gIFJlYWQgZWRnZXMgY2FwdHVyZWQuCisjZGVmaW5lIExQX1JESU5UU0VMQwkJMHgwMDZBCS8vICBSZWFkIGludGVycnVwdAorCQkJCQkJLy8gIGVuYWJsZSByZWdpc3Rlci4KKyNkZWZpbmUgTFBfUkRFREdTRUxDCQkweDAwNkMJLy8gIFJlYWQgZWRnZQorCQkJCQkJLy8gIHNlbGVjdGlvbgorCQkJCQkJLy8gIHJlZ2lzdGVyLgorI2RlZmluZSBMUF9SRENBUFNFTEMJCTB4MDA2RQkvLyAgUmVhZCBjYXB0dXJlCisJCQkJCQkvLyAgZW5hYmxlIHJlZ2lzdGVyLgorLy8gQ291bnRlciBSZWdpc3RlcnMgKHJlYWQvd3JpdGUpOgorI2RlZmluZSBMUF9DUjBBCQkJMHgwMDAwCS8vICAwQSBzZXR1cCByZWdpc3Rlci4KKyNkZWZpbmUgTFBfQ1IwQgkJCTB4MDAwMgkvLyAgMEIgc2V0dXAgcmVnaXN0ZXIuCisjZGVmaW5lIExQX0NSMUEJCQkweDAwMDQJLy8gIDFBIHNldHVwIHJlZ2lzdGVyLgorI2RlZmluZSBMUF9DUjFCCQkJMHgwMDA2CS8vICAxQiBzZXR1cCByZWdpc3Rlci4KKyNkZWZpbmUgTFBfQ1IyQQkJCTB4MDAwOAkvLyAgMkEgc2V0dXAgcmVnaXN0ZXIuCisjZGVmaW5lIExQX0NSMkIJCQkweDAwMEEJLy8gIDJCIHNldHVwIHJlZ2lzdGVyLgorLy8gQ291bnRlciBQcmVMb2FkICh3cml0ZSkgYW5kIExhdGNoIChyZWFkKSBSZWdpc3RlcnM6CisjZGVmaW5lCUxQX0NOVFIwQUxTVwkJMHgwMDBDCS8vICAwQSBsc3cuCisjZGVmaW5lCUxQX0NOVFIwQU1TVwkJMHgwMDBFCS8vICAwQSBtc3cuCisjZGVmaW5lCUxQX0NOVFIwQkxTVwkJMHgwMDEwCS8vICAwQiBsc3cuCisjZGVmaW5lCUxQX0NOVFIwQk1TVwkJMHgwMDEyCS8vICAwQiBtc3cuCisjZGVmaW5lCUxQX0NOVFIxQUxTVwkJMHgwMDE0CS8vICAxQSBsc3cuCisjZGVmaW5lCUxQX0NOVFIxQU1TVwkJMHgwMDE2CS8vICAxQSBtc3cuCisjZGVmaW5lCUxQX0NOVFIxQkxTVwkJMHgwMDE4CS8vICAxQiBsc3cuCisjZGVmaW5lCUxQX0NOVFIxQk1TVwkJMHgwMDFBCS8vICAxQiBtc3cuCisjZGVmaW5lCUxQX0NOVFIyQUxTVwkJMHgwMDFDCS8vICAyQSBsc3cuCisjZGVmaW5lCUxQX0NOVFIyQU1TVwkJMHgwMDFFCS8vICAyQSBtc3cuCisjZGVmaW5lCUxQX0NOVFIyQkxTVwkJMHgwMDIwCS8vICAyQiBsc3cuCisjZGVmaW5lCUxQX0NOVFIyQk1TVwkJMHgwMDIyCS8vICAyQiBtc3cuCisvLyBNaXNjZWxsYW5lb3VzIFJlZ2lzdGVycyAocmVhZC93cml0ZSk6CisjZGVmaW5lIExQX01JU0MxCQkweDAwODgJLy8gIFJlYWQvd3JpdGUgTWlzYzEuCisjZGVmaW5lIExQX1dSTUlTQzIJCTB4MDA5MAkvLyAgV3JpdGUgTWlzYzIuCisjZGVmaW5lIExQX1JETUlTQzIJCTB4MDA4MgkvLyAgUmVhZCBNaXNjMi4KKworLy8gQml0IG1hc2tzIGZvciBNSVNDMSByZWdpc3RlciB0aGF0IGFyZSB0aGUgc2FtZSBmb3IgcmVhZHMgYW5kIHdyaXRlcy4KKyNkZWZpbmUgTUlTQzFfV0VOQUJMRQkJMHg4MDAwCS8vIGVuYWIgd3JpdGVzIHRvCisJCQkJCQkvLyBNSVNDMiAoZXhjZXB0IENsZWFyCisJCQkJCQkvLyBXYXRjaGRvZyBiaXQpLgorI2RlZmluZSBNSVNDMV9XRElTQUJMRQkJMHgwMDAwCS8vIERpc2FibGUgd3JpdGVzIHRvIE1JU0MyLgorI2RlZmluZSBNSVNDMV9FRENBUAkJMHgxMDAwCS8vIGVuYWIgZWRnZSBjYXB0dXJlCisJCQkJCQkvLyBvbiBESU8gY2hhbnMKKwkJCQkJCS8vIHNwZWNpZmllZCBieQorCQkJCQkJLy8gTFBfV1JDQVBTRUx4LgorI2RlZmluZSBNSVNDMV9OT0VEQ0FQCQkweDAwMDAJLy8gRGlzYWJsZSBlZGdlCisJCQkJCQkvLyBjYXB0dXJlIG9uCisJCQkJCQkvLyBzcGVjaWZpZWQgRElPCisJCQkJCQkvLyBjaGFucy4KKworLy8gQml0IG1hc2tzIGZvciBNSVNDMSByZWdpc3RlciByZWFkcy4KKyNkZWZpbmUgUkRNSVNDMV9XRFRJTUVPVVQJMHg0MDAwCS8vIFdhdGNoZG9nIHRpbWVyIHRpbWVkIG91dC4KKworLy8gQml0IG1hc2tzIGZvciBNSVNDMiByZWdpc3RlciB3cml0ZXMuCisjZGVmaW5lIFdSTUlTQzJfV0RDTEVBUgkJMHg4MDAwCS8vIFJlc2V0IHdhdGNoZG9nCisJCQkJCQkvLyB0aW1lciB0byB6ZXJvLgorI2RlZmluZSBXUk1JU0MyX0NIQVJHRV9FTkFCTEUJMHg0MDAwCS8vIGVuYWIgYmF0dGVyeQorCQkJCQkJLy8gdHJpY2tsZSBjaGFyZ2luZy4KKworLy8gQml0IG1hc2tzIGZvciBNSVNDMiByZWdpc3RlciB0aGF0IGFyZSB0aGUgc2FtZSBmb3IgcmVhZHMgYW5kIHdyaXRlcy4KKyNkZWZpbmUgTUlTQzJfQkFUVF9FTkFCTEUJMHgwMDA4CS8vIEJhY2t1cCBiYXR0ZXJ5IGVuYWJsZS4KKyNkZWZpbmUgTUlTQzJfV0RFTkFCTEUJCTB4MDAwNAkvLyBXYXRjaGRvZyB0aW1lciBlbmFibGUuCisjZGVmaW5lIE1JU0MyX1dEUEVSSU9EX01BU0sJMHgwMDAzCS8vIFdhdGNoZG9nIGludGVydmFsCisJCQkJCQkvLyBzZWxlY3QgbWFzay4KKworLy8gQml0IG1hc2tzIGZvciBBQ09OMSByZWdpc3Rlci4KKyNkZWZpbmUgQTJfUlVOCQkJMHg0MDAwMDAwMAkvLyBSdW4gQTIgYmFzZWQgb24gVFNMMi4KKyNkZWZpbmUgQTFfUlVOCQkJMHgyMDAwMDAwMAkvLyBSdW4gQTEgYmFzZWQgb24gVFNMMS4KKyNkZWZpbmUgQTFfU1dBUAkJCTB4MDAyMDAwMDAJLy8gVXNlIGJpZy1lbmRpYW4gZm9yIEExLgorI2RlZmluZSBBMl9TV0FQCQkJMHgwMDEwMDAwMAkvLyBVc2UgYmlnLWVuZGlhbiBmb3IgQTIuCisjZGVmaW5lIFdTX01PREVTCQkweDAwMDE5OTk5CS8vIFdTMCA9IFRTTDEgdHJpZ2dlcgorCQkJCQkJLy8gaW5wdXQsIFdTMS1XUzQgPQorCQkJCQkJLy8gQ1MqIG91dHB1dHMuCisKKyNpZiBQTEFURk9STSA9PSBJTlRFTAkJLy8gQmFzZSBBQ09OMSBjb25maWc6CisJCQkJCQkvLyBhbHdheXMgcnVuIEExIGJhc2VkCisJCQkJCQkvLyBvbiBUU0wxLgorI2RlZmluZSBBQ09OMV9CQVNFCQkoIFdTX01PREVTIHwgQTFfUlVOICkKKyNlbGlmIFBMQVRGT1JNID09IE1PVE9ST0xBCisjZGVmaW5lIEFDT04xX0JBU0UJCSggV1NfTU9ERVMgfCBBMV9SVU4gfCBBMV9TV0FQIHwgQTJfU1dBUCApCisjZW5kaWYKKworI2RlZmluZSBBQ09OMV9BRENTVEFSVAkJQUNPTjFfQkFTRQkvLyBTdGFydCBBREM6IHJ1biBBMQorCQkJCQkJLy8gYmFzZWQgb24gVFNMMS4KKyNkZWZpbmUgQUNPTjFfREFDU1RBUlQJCSggQUNPTjFfQkFTRSB8IEEyX1JVTiApCS8vIFN0YXJ0CisJCQkJCQkJLy8gdHJhbnNtaXQgdG8KKwkJCQkJCQkvLyBEQUM6IHJ1biBBMgorCQkJCQkJCS8vIGJhc2VkIG9uCisJCQkJCQkJLy8gVFNMMi4KKyNkZWZpbmUgQUNPTjFfREFDU1RPUAkJQUNPTjFfQkFTRQkvLyBIYWx0IEEyLgorCisvLyBCaXQgbWFza3MgZm9yIEFDT04yIHJlZ2lzdGVyLgorI2RlZmluZSBBMV9DTEtTUkNfQkNMSzEJCTB4MDAwMDAwMDAJLy8gQTEgYml0IHJhdGUgPSBCQ0xLMSAoQURDKS4KKyNkZWZpbmUgQTJfQ0xLU1JDX1gxCQkweDAwODAwMDAwCS8vIEEyIGJpdCByYXRlID0gQUNMSy8xIChEQUNzKS4KKyNkZWZpbmUgQTJfQ0xLU1JDX1gyCQkweDAwQzAwMDAwCS8vIEEyIGJpdCByYXRlID0gQUNMSy8yIChEQUNzKS4KKyNkZWZpbmUgQTJfQ0xLU1JDX1g0CQkweDAxNDAwMDAwCS8vIEEyIGJpdCByYXRlID0gQUNMSy80IChEQUNzKS4KKyNkZWZpbmUgSU5WRVJUX0JDTEsyCQkweDAwMTAwMDAwCS8vIEludmVydCBCQ0xLMiAoREFDcykuCisjZGVmaW5lIEJDTEsyX09FCQkweDAwMDQwMDAwCS8vIGVuYWIgQkNMSzIgKERBQ3MpLgorI2RlZmluZSBBQ09OMl9YT1JNQVNLCQkweDAwMEMwMDAwCS8vIFhPUiBtYXNrIGZvciBBQ09OMgorCQkJCQkJLy8gYWN0aXZlLWxvdyBiaXRzLgorCisjZGVmaW5lIEFDT04yX0lOSVQJCSggQUNPTjJfWE9STUFTSyBeICggQTFfQ0xLU1JDX0JDTEsxIHwgQTJfQ0xLU1JDX1gyIHwgSU5WRVJUX0JDTEsyIHwgQkNMSzJfT0UgKSApCisKKy8vIEJpdCBtYXNrcyBmb3IgdGltZXNsb3QgcmVjb3Jkcy4KKyNkZWZpbmUgV1MxCQkgICAgIAkweDQwMDAwMDAwCS8vIFdTIG91dHB1dCB0byBhc3NlcnQuCisjZGVmaW5lIFdTMgkJICAgICAJMHgyMDAwMDAwMAorI2RlZmluZSBXUzMJCSAgICAgCTB4MTAwMDAwMDAKKyNkZWZpbmUgV1M0CQkgICAgIAkweDA4MDAwMDAwCisjZGVmaW5lIFJTRDEJCQkweDAxMDAwMDAwCS8vIFNoaWZ0IEExIGRhdGEgaW4gb24gU0QxLgorI2RlZmluZSBTRFdfQTEJCQkweDAwODAwMDAwCS8vIFN0b3JlIHJjdidkIGNoYXIgYXQKKwkJCQkJCS8vIG5leHQgY2hhciBzbG90IG9mCisJCQkJCQkvLyBEV09SRDEgYnVmZmVyLgorI2RlZmluZSBTSUJfQTEJCQkweDAwNDAwMDAwCS8vIFN0b3JlIHJjdidkIGNoYXIgYXQKKwkJCQkJCS8vIG5leHQgY2hhciBzbG90IG9mCisJCQkJCQkvLyBGQjEgYnVmZmVyLgorI2RlZmluZSBTRl9BMQkJCTB4MDAyMDAwMDAJLy8gV3JpdGUgdW5zaWduZWQgbG9uZworCQkJCQkJLy8gYnVmZmVyIHRvIGlucHV0CisJCQkJCQkvLyBGSUZPLgorCisvL1NlbGVjdCBwYXJhbGxlbC10by1zZXJpYWwgY29udmVydGVyJ3MgZGF0YSBzb3VyY2U6CisjZGVmaW5lIFhGSUZPXzAJCQkweDAwMDAwMDAwCS8vICAgRGF0YSBmaWZvIGJ5dGUgMC4KKyNkZWZpbmUgWEZJRk9fMQkJCTB4MDAwMDAwMTAJLy8gICBEYXRhIGZpZm8gYnl0ZSAxLgorI2RlZmluZSBYRklGT18yCQkJMHgwMDAwMDAyMAkvLyAgIERhdGEgZmlmbyBieXRlIDIuCisjZGVmaW5lIFhGSUZPXzMJCQkweDAwMDAwMDMwCS8vICAgRGF0YSBmaWZvIGJ5dGUgMy4KKyNkZWZpbmUgWEZCMAkJCTB4MDAwMDAwNDAJLy8gICBGQl9CVUZGRVIgYnl0ZSAwLgorI2RlZmluZSBYRkIxCQkJMHgwMDAwMDA1MAkvLyAgIEZCX0JVRkZFUiBieXRlIDEuCisjZGVmaW5lIFhGQjIJCQkweDAwMDAwMDYwCS8vICAgRkJfQlVGRkVSIGJ5dGUgMi4KKyNkZWZpbmUgWEZCMwkJCTB4MDAwMDAwNzAJLy8gICBGQl9CVUZGRVIgYnl0ZSAzLgorI2RlZmluZSBTSUJfQTIJCQkweDAwMDAwMjAwCS8vIFN0b3JlIG5leHQgZHdvcmQKKwkJCQkJCS8vIGZyb20gQTIncyBpbnB1dAorCQkJCQkJLy8gc2hpZnRlciB0byBGQjIKKwkJCQkJCS8vIGJ1ZmZlci4KKyNkZWZpbmUgU0ZfQTIJCQkweDAwMDAwMTAwCS8vIFN0b3JlIG5leHQgZHdvcmQKKwkJCQkJCS8vIGZyb20gQTIncyBpbnB1dAorCQkJCQkJLy8gc2hpZnRlciB0byBpdHMKKwkJCQkJCS8vIGlucHV0IGZpZm8uCisjZGVmaW5lIExGX0EyCQkJMHgwMDAwMDA4MAkvLyBMb2FkIG5leHQgZHdvcmQKKwkJCQkJCS8vIGZyb20gQTIncyBvdXRwdXQKKwkJCQkJCS8vIGZpZm8gaW50byBpdHMKKwkJCQkJCS8vIG91dHB1dCBkd29yZAorCQkJCQkJLy8gYnVmZmVyLgorI2RlZmluZSBYU0QyCQkJMHgwMDAwMDAwOAkvLyBTaGlmdCBkYXRhIG91dCBvbiBTRDIuCisjZGVmaW5lIFJTRDMJCQkweDAwMDAxODAwCS8vIFNoaWZ0IGRhdGEgaW4gb24gU0QzLgorI2RlZmluZSBSU0QyCQkJMHgwMDAwMTAwMAkvLyBTaGlmdCBkYXRhIGluIG9uIFNEMi4KKyNkZWZpbmUgTE9XX0EyCQkJMHgwMDAwMDAwMgkvLyBEcml2ZSBsYXN0IFNEIGxvdworCQkJCQkJLy8gZm9yIDcgY2xrcywgdGhlbgorCQkJCQkJLy8gdHJpLXN0YXRlLgorI2RlZmluZSBFT1MJCSAgICAgCTB4MDAwMDAwMDEJLy8gRW5kIG9mIHN1cGVyZnJhbWUuCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLy8gSTJDIGNvbmZpZ3VyYXRpb24gY29uc3RhbnRzLgorI2RlZmluZSBJMkNfQ0xLU0VMCQkweDA0MDAJLy8gSTJDIGJpdCByYXRlID0KKwkJCQkJCS8vIFBDSWNsay80ODAgPSA2OC43NQorCQkJCQkJLy8gS0h6LgorI2RlZmluZSBJMkNfQklUUkFURQkJNjguNzUJLy8gSTJDIGJ1cyBkYXRhIGJpdAorCQkJCQkJLy8gcmF0ZSAoZGV0ZXJtaW5lZCBieQorCQkJCQkJLy8gSTJDX0NMS1NFTCkgaW4gS0h6LgorI2RlZmluZSBJMkNfV1JUSU1FCQkxNS4wCS8vIFdvcnN0IGNhc2UgdGltZSxpbgorCQkJCQkJLy8gbXNlYywgZm9yIEVFUFJPTQorCQkJCQkJLy8gaW50ZXJuYWwgd3JpdGUgb3AuCisKKy8vIEkyQyBtYW5pZmVzdCBjb25zdGFudHMuCisKKy8vIE1heCByZXRyaWVzIHRvIHdhaXQgZm9yIEVFUFJPTSB3cml0ZS4KKyNkZWZpbmUgSTJDX1JFVFJJRVMJCSggSTJDX1dSVElNRSAqIEkyQ19CSVRSQVRFIC8gOS4wICkKKyNkZWZpbmUgSTJDX0VSUgkJCTB4MDAwMgkvLyBJMkMgY29udHJvbC9zdGF0dXMKKwkJCQkJCS8vIGZsYWcgRVJST1IuCisjZGVmaW5lIEkyQ19CVVNZCQkweDAwMDEJLy8gSTJDIGNvbnRyb2wvc3RhdHVzCisJCQkJCQkvLyBmbGFnIEJVU1kuCisjZGVmaW5lIEkyQ19BQk9SVAkJMHgwMDgwCS8vIEkyQyBzdGF0dXMgZmxhZyBBQk9SVC4KKyNkZWZpbmUgSTJDX0FUVFJTVEFSVAkJMHgzCS8vIEkyQyBhdHRyaWJ1dGUgU1RBUlQuCisjZGVmaW5lIEkyQ19BVFRSQ09OVAkJMHgyCS8vIEkyQyBhdHRyaWJ1dGUgQ09OVC4KKyNkZWZpbmUgSTJDX0FUVFJTVE9QCQkweDEJLy8gSTJDIGF0dHJpYnV0ZSBTVE9QLgorI2RlZmluZSBJMkNfQVRUUk5PUAkJMHgwCS8vIEkyQyBhdHRyaWJ1dGUgTk9QLgorCisvLyBJMkMgcmVhZCBjb21tYW5kICB8IEVFUFJPTSBhZGRyZXNzLgorI2RlZmluZSBJMkNSCQkJKCBkZXZwcml2LT5JMkNBZHJzIHwgMSApCisKKy8vIEkyQyB3cml0ZSBjb21tYW5kIHwgRUVQUk9NIGFkZHJlc3MuCisjZGVmaW5lIEkyQ1cJCQkoIGRldnByaXYtPkkyQ0FkcnMgKQorCisvLyBDb2RlIG1hY3JvcyB1c2VkIGZvciBjb25zdHJ1Y3RpbmcgSTJDIGNvbW1hbmQgYnl0ZXMuCisjZGVmaW5lIEkyQ19CMihBVFRSLFZBTCkJKCAoIChBVFRSKSA8PCA2ICkgfCAoIChWQUwpIDw8IDI0ICkgKQorI2RlZmluZSBJMkNfQjEoQVRUUixWQUwpCSggKCAoQVRUUikgPDwgNCApIHwgKCAoVkFMKSA8PCAxNiApICkKKyNkZWZpbmUgSTJDX0IwKEFUVFIsVkFMKQkoICggKEFUVFIpIDw8IDIgKSB8ICggKFZBTCkgPDwgIDggKSApCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvL29sZGVzdAorI2RlZmluZSBQX0RFQklDRkdxICAgICAgICAgICAgICAweDAwN0MJLy8gREVCSSBjb25maWd1cmF0aW9uLgorI2RlZmluZSBQX0RFQklDTURxICAgICAgICAgICAgICAweDAwODAJLy8gREVCSSBjb21tYW5kLgorI2RlZmluZSBQX0RFQklQQUdFcSAgICAgICAgICAgICAweDAwODQJLy8gREVCSSBwYWdlLgorI2RlZmluZSBQX0RFQklBRHEgICAgICAgICAgICAgICAweDAwODgJLy8gREVCSSB0YXJnZXQgYWRkcmVzcy4KKworI2RlZmluZSBERUJJX0NGR19UT1EJCTB4MDNDMDAwMDAJLy8gdGltZW91dCAoMTUgUENJIGN5Y2xlcykKKyNkZWZpbmUgREVCSV9DRkdfRkFTVFEJCTB4MTAwMDAwMDAJLy8gZmFzdCBtb2RlIGVuYWJsZQorI2RlZmluZSBERUJJX0NGR18xNlEJCTB4MDAwODAwMDAJLy8gMTYtYml0IGFjY2VzcyBlbmFibGUKKyNkZWZpbmUgREVCSV9DRkdfSU5DUQkJMHgwMDA0MDAwMAkvLyBlbmFibGUgYWRkcmVzcyBpbmNyZW1lbnQKKyNkZWZpbmUgREVCSV9DRkdfVElNRVJPRkZRCTB4MDAwMTAwMDAJLy8gZGlzYWJsZSB0aW1lcgorI2RlZmluZSBERUJJX0NNRF9SRFEJCTB4MDAwNTAwMDAJLy8gcmVhZCBpbW1lZGlhdGUgMiBieXRlcworI2RlZmluZSBERUJJX0NNRF9XUlEJCTB4MDAwNDAwMDAJLy8gd3JpdGUgaW1tZWRpYXRlIDIgYnl0ZXMKKyNkZWZpbmUgREVCSV9QQUdFX0RJU0FCTEVRCTB4MDAwMDAwMDAJLy8gcGFnaW5nIGRpc2FibGUKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gREVCSSBjb21tYW5kIGNvbnN0YW50cy4KKyNkZWZpbmUgREVCSV9DTURfU0laRTE2CQkoIDIgPDwgMTcgKQkvLyBUcmFuc2ZlciBzaXplIGlzCisJCQkJCQkvLyBhbHdheXMgMiBieXRlcy4KKyNkZWZpbmUgREVCSV9DTURfUkVBRAkJMHgwMDAxMDAwMAkvLyBSZWFkIG9wZXJhdGlvbi4KKyNkZWZpbmUgREVCSV9DTURfV1JJVEUJCTB4MDAwMDAwMDAJLy8gV3JpdGUgb3BlcmF0aW9uLgorCisvLyBSZWFkIGltbWVkaWF0ZSAyIGJ5dGVzLgorI2RlZmluZSBERUJJX0NNRF9SRFdPUkQJCSggREVCSV9DTURfUkVBRCAgfCBERUJJX0NNRF9TSVpFMTYgKQorCisvLyBXcml0ZSBpbW1lZGlhdGUgMiBieXRlcy4KKyNkZWZpbmUgREVCSV9DTURfV1JXT1JECQkoIERFQklfQ01EX1dSSVRFIHwgREVCSV9DTURfU0laRTE2ICkKKworLy8gREVCSSBjb25maWd1cmF0aW9uIGNvbnN0YW50cy4KKyNkZWZpbmUgREVCSV9DRkdfWElSUV9FTgkweDgwMDAwMDAwCS8vIGVuYWIgZXh0ZXJuYWwKKwkJCQkJCS8vIGludGVycnVwdCBvbiBHUElPMy4KKyNkZWZpbmUgREVCSV9DRkdfWFJFU1VNRQkweDQwMDAwMDAwCS8vIFJlc3VtZSBibG9jaworCQkJCQkJLy8gdHJhbnNmZXIgd2hlbiBYSVJRCisJCQkJCQkvLyBkZWFzc2VydGVkLgorI2RlZmluZSBERUJJX0NGR19GQVNUCQkweDEwMDAwMDAwCS8vIEZhc3QgbW9kZSBlbmFibGUuCisKKy8vIDQtYml0IGZpZWxkIHRoYXQgc3BlY2lmaWVzIERFQkkgdGltZW91dCB2YWx1ZSBpbiBQQ0kgY2xvY2sgY3ljbGVzOgorI2RlZmluZSBERUJJX0NGR19UT1VUX0JJVAkyMgkvLyAgIEZpbmlzaCBERUJJIGN5Y2xlIGFmdGVyCisJCQkJCS8vICAgdGhpcyBtYW55IGNsb2Nrcy4KKworLy8gMi1iaXQgZmllbGQgdGhhdCBzcGVjaWZpZXMgRW5kaWFuIGJ5dGUgbGFuZSBzdGVlcmluZzoKKyNkZWZpbmUgREVCSV9DRkdfU1dBUF9OT05FCTB4MDAwMDAwMDAJLy8gICBTdHJhaWdodCAtIGRvbid0CisJCQkJCQkvLyAgIHN3YXAgYW55IGJ5dGVzCisJCQkJCQkvLyAgIChJbnRlbCkuCisjZGVmaW5lIERFQklfQ0ZHX1NXQVBfMgkJMHgwMDEwMDAwMAkvLyAgIDItYnl0ZSBzd2FwIChNb3Rvcm9sYSkuCisjZGVmaW5lIERFQklfQ0ZHX1NXQVBfNAkJMHgwMDIwMDAwMAkvLyAgIDQtYnl0ZSBzd2FwLgorI2RlZmluZSBERUJJX0NGR18xNgkJMHgwMDA4MDAwMAkvLyBTbGF2ZSBpcyBhYmxlIHRvCisJCQkJCQkvLyBzZXJ2ZSAxNi1iaXQKKwkJCQkJCS8vIGN5Y2xlcy4KKworI2RlZmluZSBERUJJX0NGR19TTEFWRTE2CTB4MDAwODAwMDAJLy8gU2xhdmUgaXMgYWJsZSB0bworCQkJCQkJLy8gc2VydmUgMTYtYml0CisJCQkJCQkvLyBjeWNsZXMuCisjZGVmaW5lIERFQklfQ0ZHX0lOQwkJMHgwMDA0MDAwMAkvLyBlbmFiIGFkZHJlc3MKKwkJCQkJCS8vIGluY3JlbWVudCBmb3IgYmxvY2sKKwkJCQkJCS8vIHRyYW5zZmVycy4KKyNkZWZpbmUgREVCSV9DRkdfSU5URUwJCTB4MDAwMjAwMDAJLy8gSW50ZWwgc3R5bGUgbG9jYWwgYnVzLgorI2RlZmluZSBERUJJX0NGR19USU1FUk9GRgkweDAwMDEwMDAwCS8vIERpc2FibGUgdGltZXIuCisKKyNpZiBQTEFURk9STSA9PSBJTlRFTAorCisjZGVmaW5lIERFQklfVE9VVAkJNwkvLyBXYWl0IDcgUENJIGNsb2NrcworCQkJCQkJLy8gKDIxMiBucykgYmVmb3JlCisJCQkJCQkvLyBwb2xsaW5nIFJEWS4KKworLy8gSW50ZWwgYnl0ZSBsYW5lIHN0ZWVyaW5nIChwYXNzIHRocm91Z2ggYWxsIGJ5dGUgbGFuZXMpLgorI2RlZmluZSBERUJJX1NXQVAJCURFQklfQ0ZHX1NXQVBfTk9ORQorCisjZWxpZiBQTEFURk9STSA9PSBNT1RPUk9MQQorCisjZGVmaW5lIERFQklfVE9VVAkJMTUJLy8gV2FpdCAxNSBQQ0kgY2xvY2tzICg0NTQgbnMpCisJCQkJCS8vIG1heGltdW0gYmVmb3JlIHRpbWluZyBvdXQuCisjZGVmaW5lIERFQklfU1dBUAkJREVCSV9DRkdfU1dBUF8yCS8vIE1vdG9yb2xhIGJ5dGUgbGFuZSBzdGVlcmluZy4KKworI2VuZGlmCisKKy8vIERFQkkgcGFnZSB0YWJsZSBjb25zdGFudHMuCisjZGVmaW5lIERFQklfUEFHRV9ESVNBQkxFCTB4MDAwMDAwMDAJLy8gUGFnaW5nIGRpc2FibGUuCisKKy8vLy8vLy8vLy8vLy8vLy8vLy9FWFRSQSBGUk9NIE9USEVSIFNBTlNPUkFZICAqIC5oLy8vLy8vLy8KKworLy8gTG9hZFNyYyB2YWx1ZXM6CisjZGVmaW5lIExPQURTUkNfSU5EWAkJMAkvLyBQcmVsb2FkIGNvcmUgaW4gcmVzcG9uc2UgdG8KKwkJCQkJLy8gSW5kZXguCisjZGVmaW5lIExPQURTUkNfT1ZFUgkJMQkvLyBQcmVsb2FkIGNvcmUgaW4gcmVzcG9uc2UgdG8KKwkJCQkJLy8gT3ZlcmZsb3cuCisjZGVmaW5lIExPQURTUkNCX09WRVJBCQkyCS8vIFByZWxvYWQgQiBjb3JlIGluIHJlc3BvbnNlCisJCQkJCS8vIHRvIEEgT3ZlcmZsb3cuCisjZGVmaW5lIExPQURTUkNfTk9ORQkJMwkvLyBOZXZlciBwcmVsb2FkIGNvcmUuCisKKy8vIEludFNyYyB2YWx1ZXM6CisjZGVmaW5lIElOVFNSQ19OT05FIAkJMAkvLyBJbnRlcnJ1cHRzIGRpc2FibGVkLgorI2RlZmluZSBJTlRTUkNfT1ZFUiAJCTEJLy8gSW50ZXJydXB0IG9uIE92ZXJmbG93LgorI2RlZmluZSBJTlRTUkNfSU5EWCAJCTIJLy8gSW50ZXJydXB0IG9uIEluZGV4LgorI2RlZmluZSBJTlRTUkNfQk9USCAJCTMJLy8gSW50ZXJydXB0IG9uIEluZGV4IG9yIE92ZXJmbG93LgorCisvLyBMYXRjaFNyYyB2YWx1ZXM6CisjZGVmaW5lIExBVENIU1JDX0FCX1JFQUQJMAkvLyBMYXRjaCBvbiByZWFkLgorI2RlZmluZSBMQVRDSFNSQ19BX0lORFhBCTEJLy8gTGF0Y2ggQSBvbiBBIEluZGV4LgorI2RlZmluZSBMQVRDSFNSQ19CX0lORFhCCTIJLy8gTGF0Y2ggQiBvbiBCIEluZGV4LgorI2RlZmluZSBMQVRDSFNSQ19CX09WRVJBCTMJLy8gTGF0Y2ggQiBvbiBBIE92ZXJmbG93LgorCisvLyBJbmR4U3JjIHZhbHVlczoKKyNkZWZpbmUgSU5EWFNSQ19IQVJECQkwCS8vIEhhcmR3YXJlIG9yIHNvZnR3YXJlIGluZGV4LgorI2RlZmluZSBJTkRYU1JDX1NPRlQJCTEJLy8gU29mdHdhcmUgaW5kZXggb25seS4KKworLy8gSW5keFBvbCB2YWx1ZXM6CisjZGVmaW5lIElORFhQT0xfUE9TIAkJMAkvLyBJbmRleCBpbnB1dCBpcyBhY3RpdmUgaGlnaC4KKyNkZWZpbmUgSU5EWFBPTF9ORUcgCQkxCS8vIEluZGV4IGlucHV0IGlzIGFjdGl2ZSBsb3cuCisKKy8vIENsa1NyYyB2YWx1ZXM6CisjZGVmaW5lIENMS1NSQ19DT1VOVEVSCQkwCS8vIENvdW50ZXIgbW9kZS4KKyNkZWZpbmUgQ0xLU1JDX1RJTUVSCQkyCS8vIFRpbWVyIG1vZGUuCisjZGVmaW5lIENMS1NSQ19FWFRFTkRFUgkJMwkvLyBFeHRlbmRlciBtb2RlLgorCisvLyBDbGtQb2wgdmFsdWVzOgorI2RlZmluZSBDTEtQT0xfUE9TCQkwCS8vIENvdW50ZXIvRXh0ZW5kZXIgY2xvY2sgaXMKKwkJCQkJLy8gYWN0aXZlIGhpZ2guCisjZGVmaW5lIENMS1BPTF9ORUcJCTEJLy8gQ291bnRlci9FeHRlbmRlciBjbG9jayBpcworCQkJCQkvLyBhY3RpdmUgbG93LgorI2RlZmluZSBDTlRESVJfVVAJCTAJLy8gVGltZXIgY291bnRzIHVwLgorI2RlZmluZSBDTlRESVJfRE9XTiAJCTEJLy8gVGltZXIgY291bnRzIGRvd24uCisKKy8vIENsa0VuYWIgdmFsdWVzOgorI2RlZmluZSBDTEtFTkFCX0FMV0FZUwkJMAkvLyBDbG9jayBhbHdheXMgZW5hYmxlZC4KKyNkZWZpbmUgQ0xLRU5BQl9JTkRFWAkJMQkvLyBDbG9jayBpcyBlbmFibGVkIGJ5IGluZGV4LgorCisvLyBDbGtNdWx0IHZhbHVlczoKKyNkZWZpbmUgQ0xLTVVMVF80WCAJCTAJLy8gNHggY2xvY2sgbXVsdGlwbGllci4KKyNkZWZpbmUgQ0xLTVVMVF8yWCAJCTEJLy8gMnggY2xvY2sgbXVsdGlwbGllci4KKyNkZWZpbmUgQ0xLTVVMVF8xWCAJCTIJLy8gMXggY2xvY2sgbXVsdGlwbGllci4KKworLy8gQml0IEZpZWxkIHBvc2l0aW9ucyBpbiBDT1VOVEVSX1NFVFVQIHN0cnVjdHVyZToKKyNkZWZpbmUgQkZfTE9BRFNSQwkJOQkvLyBQcmVsb2FkIHRyaWdnZXIuCisjZGVmaW5lIEJGX0lORFhTUkMJCTcJLy8gSW5kZXggc291cmNlLgorI2RlZmluZSBCRl9JTkRYUE9MCQk2CS8vIEluZGV4IHBvbGFyaXR5LgorI2RlZmluZSBCRl9DTEtTUkMJCTQJLy8gQ2xvY2sgc291cmNlLgorI2RlZmluZSBCRl9DTEtQT0wJCTMJLy8gQ2xvY2sgcG9sYXJpdHkvY291bnQgZGlyZWN0aW9uLgorI2RlZmluZSBCRl9DTEtNVUxUCQkxCS8vIENsb2NrIG11bHRpcGxpZXIuCisjZGVmaW5lIEJGX0NMS0VOQUIJCTAJLy8gQ2xvY2sgZW5hYmxlLgorCisvLyBFbnVtZXJhdGVkIGNvdW50ZXIgb3BlcmF0aW5nIG1vZGVzIHNwZWNpZmllZCBieSBDbGtTcmMgYml0IGZpZWxkIGluCisvLyBhIENPVU5URVJfU0VUVVAuCisKKyNkZWZpbmUgQ0xLU1JDX0NPVU5URVIJCTAJLy8gQ291bnRlcjogRU5DX0MgY2xvY2ssIEVOQ19ECisJCQkJCS8vIGRpcmVjdGlvbi4KKyNkZWZpbmUgQ0xLU1JDX1RJTUVSCQkyCS8vIFRpbWVyOiBTWVNfQyBjbG9jaywKKwkJCQkJLy8gZGlyZWN0aW9uIHNwZWNpZmllZCBieQorCQkJCQkvLyBDbGtQb2wuCisjZGVmaW5lIENMS1NSQ19FWFRFTkRFUgkJMwkvLyBFeHRlbmRlcjogT1ZSX0EgY2xvY2ssCisJCQkJCS8vIEVOQ19EIGRpcmVjdGlvbi4KKworLy8gRW51bWVyYXRlZCBjb3VudGVyIGNsb2NrIG11bHRpcGxpZXJzLgorCisjZGVmaW5lIE1VTFRfWDAJCQkweDAwMDMJLy8gU3VwcG9ydHMgbm8gbXVsdGlwbGllcnM7CisJCQkJCS8vIGZpeGVkIHBoeXNpY2FsIG11bHRpcGxpZXIgPQorCQkJCQkvLyAzLgorI2RlZmluZSBNVUxUX1gxCQkJMHgwMDAyCS8vIFN1cHBvcnRzIG11bHRpcGxpZXIgeDE7CisJCQkJCS8vIGZpeGVkIHBoeXNpY2FsIG11bHRpcGxpZXIgPQorCQkJCQkvLyAyLgorI2RlZmluZSBNVUxUX1gyCQkJMHgwMDAxCS8vIFN1cHBvcnRzIG11bHRpcGxpZXJzIHgxLAorCQkJCQkvLyB4MjsgcGh5c2ljYWwgbXVsdGlwbGllcnMgPQorCQkJCQkvLyAxIG9yIDIuCisjZGVmaW5lIE1VTFRfWDQJCQkweDAwMDAJLy8gU3VwcG9ydHMgbXVsdGlwbGllcnMgeDEsCisJCQkJCS8vIHgyLCB4NDsgcGh5c2ljYWwKKwkJCQkJLy8gbXVsdGlwbGllcnMgPSAwLCAxIG9yIDIuCisKKy8vIFNhbml0eS1jaGVjayBsaW1pdHMgZm9yIHBhcmFtZXRlcnMuCisKKyNkZWZpbmUgTlVNX0NPVU5URVJTCQk2CS8vIE1heGltdW0gdmFsaWQgY291bnRlcgorCQkJCQkvLyBsb2dpY2FsIGNoYW5uZWwgbnVtYmVyLgorI2RlZmluZSBOVU1fSU5UU09VUkNFUwkJNAorI2RlZmluZSBOVU1fTEFUQ0hTT1VSQ0VTCTQKKyNkZWZpbmUgTlVNX0NMS01VTFRTCQk0CisjZGVmaW5lIE5VTV9DTEtTT1VSQ0VTCQk0CisjZGVmaW5lIE5VTV9DTEtQT0xTCQkyCisjZGVmaW5lIE5VTV9JTkRFWFBPTFMJCTIKKyNkZWZpbmUgTlVNX0lOREVYU09VUkNFUwkyCisjZGVmaW5lIE5VTV9MT0FEVFJJR1MJCTQKKworLy8gQml0IGZpZWxkIHBvc2l0aW9ucyBpbiBDUkEgYW5kIENSQiBjb3VudGVyIGNvbnRyb2wgcmVnaXN0ZXJzLgorCisvLyBCaXQgZmllbGQgcG9zaXRpb25zIGluIENSQToKKyNkZWZpbmUgQ1JBQklUX0lORFhTUkNfQgkxNAkvLyAgIEIgaW5kZXggc291cmNlLgorI2RlZmluZSBDUkFCSVRfQ0xLU1JDX0IJCTEyCS8vICAgQiBjbG9jayBzb3VyY2UuCisjZGVmaW5lIENSQUJJVF9JTkRYUE9MX0EJMTEJLy8gICBBIGluZGV4IHBvbGFyaXR5LgorI2RlZmluZSBDUkFCSVRfTE9BRFNSQ19BCSA5CS8vICAgQSBwcmVsb2FkIHRyaWdnZXIuCisjZGVmaW5lIENSQUJJVF9DTEtNVUxUX0EJIDcJLy8gICBBIGNsb2NrIG11bHRpcGxpZXIuCisjZGVmaW5lIENSQUJJVF9JTlRTUkNfQQkJIDUJLy8gICBBIGludGVycnVwdCBzb3VyY2UuCisjZGVmaW5lIENSQUJJVF9DTEtQT0xfQQkJIDQJLy8gICBBIGNsb2NrIHBvbGFyaXR5LgorI2RlZmluZSBDUkFCSVRfSU5EWFNSQ19BCSAyCS8vICAgQSBpbmRleCBzb3VyY2UuCisjZGVmaW5lIENSQUJJVF9DTEtTUkNfQQkJIDAJLy8gICBBIGNsb2NrIHNvdXJjZS4KKworLy8gQml0IGZpZWxkIHBvc2l0aW9ucyBpbiBDUkI6CisjZGVmaW5lIENSQkJJVF9JTlRSRVNFVENNRAkxNQkvLyAgIEludGVycnVwdCByZXNldCBjb21tYW5kLgorI2RlZmluZSBDUkJCSVRfSU5UUkVTRVRfQgkxNAkvLyAgIEIgaW50ZXJydXB0IHJlc2V0IGVuYWJsZS4KKyNkZWZpbmUgQ1JCQklUX0lOVFJFU0VUX0EJMTMJLy8gICBBIGludGVycnVwdCByZXNldCBlbmFibGUuCisjZGVmaW5lIENSQkJJVF9DTEtFTkFCX0EJMTIJLy8gICBBIGNsb2NrIGVuYWJsZS4KKyNkZWZpbmUgQ1JCQklUX0lOVFNSQ19CCQkxMAkvLyAgIEIgaW50ZXJydXB0IHNvdXJjZS4KKyNkZWZpbmUgQ1JCQklUX0xBVENIU1JDCQkgOAkvLyAgIEEvQiBsYXRjaCBzb3VyY2UuCisjZGVmaW5lIENSQkJJVF9MT0FEU1JDX0IJIDYJLy8gICBCIHByZWxvYWQgdHJpZ2dlci4KKyNkZWZpbmUgQ1JCQklUX0NMS01VTFRfQgkgMwkvLyAgIEIgY2xvY2sgbXVsdGlwbGllci4KKyNkZWZpbmUgQ1JCQklUX0NMS0VOQUJfQgkgMgkvLyAgIEIgY2xvY2sgZW5hYmxlLgorI2RlZmluZSBDUkJCSVRfSU5EWFBPTF9CCSAxCS8vICAgQiBpbmRleCBwb2xhcml0eS4KKyNkZWZpbmUgQ1JCQklUX0NMS1BPTF9CCQkgMAkvLyAgIEIgY2xvY2sgcG9sYXJpdHkuCisKKy8vIEJpdCBmaWVsZCBtYXNrcyBmb3IgQ1JBIGFuZCBDUkIuCisKKyNkZWZpbmUgQ1JBTVNLX0lORFhTUkNfQgkoICh1aW50MTZfdCkoIDMgPDwgQ1JBQklUX0lORFhTUkNfQikgKQorI2RlZmluZSBDUkFNU0tfQ0xLU1JDX0IJCSggKHVpbnQxNl90KSggMyA8PCBDUkFCSVRfQ0xLU1JDX0IpICkKKyNkZWZpbmUgQ1JBTVNLX0lORFhQT0xfQQkoICh1aW50MTZfdCkoIDEgPDwgQ1JBQklUX0lORFhQT0xfQSkgKQorI2RlZmluZSBDUkFNU0tfTE9BRFNSQ19BCSggKHVpbnQxNl90KSggMyA8PCBDUkFCSVRfTE9BRFNSQ19BKSApCisjZGVmaW5lIENSQU1TS19DTEtNVUxUX0EJKCAodWludDE2X3QpKCAzIDw8IENSQUJJVF9DTEtNVUxUX0EpICkKKyNkZWZpbmUgQ1JBTVNLX0lOVFNSQ19BCQkoICh1aW50MTZfdCkoIDMgPDwgQ1JBQklUX0lOVFNSQ19BKSApCisjZGVmaW5lIENSQU1TS19DTEtQT0xfQQkJKCAodWludDE2X3QpKCAzIDw8IENSQUJJVF9DTEtQT0xfQSkgKQorI2RlZmluZSBDUkFNU0tfSU5EWFNSQ19BCSggKHVpbnQxNl90KSggMyA8PCBDUkFCSVRfSU5EWFNSQ19BKSApCisjZGVmaW5lIENSQU1TS19DTEtTUkNfQQkJKCAodWludDE2X3QpKCAzIDw8IENSQUJJVF9DTEtTUkNfQSkgKQorCisjZGVmaW5lIENSQk1TS19JTlRSRVNFVENNRAkoICh1aW50MTZfdCkoIDEgPDwgQ1JCQklUX0lOVFJFU0VUQ01EKSApCisjZGVmaW5lIENSQk1TS19JTlRSRVNFVF9CCSggKHVpbnQxNl90KSggMSA8PCBDUkJCSVRfSU5UUkVTRVRfQikgKQorI2RlZmluZSBDUkJNU0tfSU5UUkVTRVRfQQkoICh1aW50MTZfdCkoIDEgPDwgQ1JCQklUX0lOVFJFU0VUX0EpICkKKyNkZWZpbmUgQ1JCTVNLX0NMS0VOQUJfQQkoICh1aW50MTZfdCkoIDEgPDwgQ1JCQklUX0NMS0VOQUJfQSkgKQorI2RlZmluZSBDUkJNU0tfSU5UU1JDX0IJCSggKHVpbnQxNl90KSggMyA8PCBDUkJCSVRfSU5UU1JDX0IpICkKKyNkZWZpbmUgQ1JCTVNLX0xBVENIU1JDCQkoICh1aW50MTZfdCkoIDMgPDwgQ1JCQklUX0xBVENIU1JDKSApCisjZGVmaW5lIENSQk1TS19MT0FEU1JDX0IJKCAodWludDE2X3QpKCAzIDw8IENSQkJJVF9MT0FEU1JDX0IpICkKKyNkZWZpbmUgQ1JCTVNLX0NMS01VTFRfQgkoICh1aW50MTZfdCkoIDMgPDwgQ1JCQklUX0NMS01VTFRfQikgKQorI2RlZmluZSBDUkJNU0tfQ0xLRU5BQl9CCSggKHVpbnQxNl90KSggMSA8PCBDUkJCSVRfQ0xLRU5BQl9CKSApCisjZGVmaW5lIENSQk1TS19JTkRYUE9MX0IJKCAodWludDE2X3QpKCAxIDw8IENSQkJJVF9JTkRYUE9MX0IpICkKKyNkZWZpbmUgQ1JCTVNLX0NMS1BPTF9CCQkoICh1aW50MTZfdCkoIDEgPDwgQ1JCQklUX0NMS1BPTF9CKSApCisKKyNkZWZpbmUgQ1JCTVNLX0lOVENUUkwJCSggQ1JCTVNLX0lOVFJFU0VUQ01EIHwgQ1JCTVNLX0lOVFJFU0VUX0EgfCBDUkJNU0tfSU5UUkVTRVRfQiApCS8vIEludGVycnVwdCByZXNldCBjb250cm9sIGJpdHMuCisKKy8vIEJpdCBmaWVsZCBwb3NpdGlvbnMgZm9yIHN0YW5kYXJkaXplZCBTRVRVUCBzdHJ1Y3R1cmUuCisKKyNkZWZpbmUgU1REQklUX0lOVFNSQwkJMTMKKyNkZWZpbmUgU1REQklUX0xBVENIU1JDCQkxMQorI2RlZmluZSBTVERCSVRfTE9BRFNSQwkJIDkKKyNkZWZpbmUgU1REQklUX0lORFhTUkMJCSA3CisjZGVmaW5lIFNUREJJVF9JTkRYUE9MCQkgNgorI2RlZmluZSBTVERCSVRfQ0xLU1JDCQkgNAorI2RlZmluZSBTVERCSVRfQ0xLUE9MCQkgMworI2RlZmluZSBTVERCSVRfQ0xLTVVMVAkJIDEKKyNkZWZpbmUgU1REQklUX0NMS0VOQUIJCSAwCisKKy8vIEJpdCBmaWVsZCBtYXNrcyBmb3Igc3RhbmRhcmRpemVkIFNFVFVQIHN0cnVjdHVyZS4KKworI2RlZmluZSBTVERNU0tfSU5UU1JDCQkoICh1aW50MTZfdCkoIDMgPDwgU1REQklUX0lOVFNSQyAgICkgKQorI2RlZmluZSBTVERNU0tfTEFUQ0hTUkMJCSggKHVpbnQxNl90KSggMyA8PCBTVERCSVRfTEFUQ0hTUkMgKSApCisjZGVmaW5lIFNURE1TS19MT0FEU1JDCQkoICh1aW50MTZfdCkoIDMgPDwgU1REQklUX0xPQURTUkMgICkgKQorI2RlZmluZSBTVERNU0tfSU5EWFNSQwkJKCAodWludDE2X3QpKCAxIDw8IFNUREJJVF9JTkRYU1JDICApICkKKyNkZWZpbmUgU1RETVNLX0lORFhQT0wJCSggKHVpbnQxNl90KSggMSA8PCBTVERCSVRfSU5EWFBPTCAgKSApCisjZGVmaW5lIFNURE1TS19DTEtTUkMJCSggKHVpbnQxNl90KSggMyA8PCBTVERCSVRfQ0xLU1JDICAgKSApCisjZGVmaW5lIFNURE1TS19DTEtQT0wJCSggKHVpbnQxNl90KSggMSA8PCBTVERCSVRfQ0xLUE9MICAgKSApCisjZGVmaW5lIFNURE1TS19DTEtNVUxUCQkoICh1aW50MTZfdCkoIDMgPDwgU1REQklUX0NMS01VTFQgICkgKQorI2RlZmluZSBTVERNU0tfQ0xLRU5BQgkJKCAodWludDE2X3QpKCAxIDw8IFNUREJJVF9DTEtFTkFCICApICkKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvKiB0eXBlZGVmIHN0cnVjdCBpbmRleENvdW50ZXIgKi8KKy8qIHsgKi8KKy8qICAgdW5zaWduZWQgaW50IGFvOyAqLworLyogICB1bnNpZ25lZCBpbnQgYWk7ICovCisvKiAgIHVuc2lnbmVkIGludCBkaWdvdXQ7ICovCisvKiAgIHVuc2lnbmVkIGludCBkaWdpbjsgKi8KKy8qICAgdW5zaWduZWQgaW50IGVuYzsgKi8KKy8qIH1DYWxsQ291bnRlcjsgKi8KKwordHlwZWRlZiBzdHJ1Y3QgYnVmZmVyRE1BIHsKKwlkbWFfYWRkcl90IFBoeXNpY2FsQmFzZTsKKwl2b2lkICpMb2dpY2FsQmFzZTsKKwl1aW50MzJfdCBETUFIYW5kbGU7Cit9IERNQUJVRjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy91c2JkdXguYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy91c2JkdXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTEzODI1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3VzYmR1eC5jCkBAIC0wLDAgKzEsMjkzMiBAQAorI2RlZmluZSBEUklWRVJfVkVSU0lPTiAidjIuMSIKKyNkZWZpbmUgRFJJVkVSX0FVVEhPUiAiQmVybmQgUG9yciwgQmVybmRQb3JyQGYycy5jb20iCisjZGVmaW5lIERSSVZFUl9ERVNDICJTdGlybGluZy9JVEwgVVNCLURVWCAtLSBCZXJuZC5Qb3JyQGYycy5jb20iCisvKgorICAgY29tZWRpL2RyaXZlcnMvdXNiZHV4LmMKKyAgIENvcHlyaWdodCAoQykgMjAwMy0yMDA3IEJlcm5kIFBvcnIsIEJlcm5kLlBvcnJAZjJzLmNvbQorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisgKi8KKy8qCitEcml2ZXI6IHVzYmR1eAorRGVzY3JpcHRpb246IFVuaXZlcnNpdHkgb2YgU3RpcmxpbmcgVVNCIERBUSAmIElOQ0lURSBUZWNobm9sb2d5IExpbWl0ZWQKK0RldmljZXM6IFtJVExdIFVTQi1EVVggKHVzYmR1eC5vKQorQXV0aG9yOiBCZXJuZCBQb3JyIDxCZXJuZFBvcnJAZjJzLmNvbT4KK1VwZGF0ZWQ6IDI1IE5vdiAyMDA3CitTdGF0dXM6IFRlc3RpbmcKK0NvbmZpZ3VyYXRpb24gb3B0aW9uczoKKyAgWW91IGhhdmUgdG8gdXBsb2FkIGZpcm13YXJlIHdpdGggdGhlIC1pIG9wdGlvbi4gVGhlCisgIGZpcm13YXJlIGlzIHVzdWFsbHkgaW5zdGFsbGVkIHVuZGVyIC91c3Ivc2hhcmUvdXNiIG9yCisgIC91c3IvbG9jYWwvc2hhcmUvdXNiIG9yIC9saWIvZmlybXdhcmUuCisKK0Nvbm5lY3Rpb24gc2NoZW1lIGZvciB0aGUgY291bnRlciBhdCB0aGUgZGlnaXRhbCBwb3J0OgorICAwPS9DTEswLCAxPVVQL0RPV04wLCAyPVJFU0VUMCwgND0vQ0xLMSwgNT1VUC9ET1dOMSwgNj1SRVNFVDEuCisgIFRoZSBzYW1wbGluZyByYXRlIG9mIHRoZSBjb3VudGVyIGlzIGFwcHJveGltYXRlbHkgNTAwSHouCisKK1BsZWFzZSBub3RlIHRoYXQgdW5kZXIgVVNCMi4wIHRoZSBsZW5ndGggb2YgdGhlIGNoYW5uZWwgbGlzdCBkZXRlcm1pbmVzCit0aGUgbWF4IHNhbXBsaW5nIHJhdGUuIElmIHlvdSBzYW1wbGUgb25seSBvbmUgY2hhbm5lbCB5b3UgZ2V0IDhrSHoKK3NhbXBsaW5nIHJhdGUuIElmIHlvdSBzYW1wbGUgdHdvIGNoYW5uZWxzIHlvdSBnZXQgNGtIeiBhbmQgc28gb24uCisqLworLyoKKyAqIEkgbXVzdCBnaXZlIGNyZWRpdCBoZXJlIHRvIENocmlzIEJhdWdoZXIgd2hvCisgKiB3cm90ZSB0aGUgZHJpdmVyIGZvciBBVC1NSU8tMTZkLiBJIHVzZWQgc29tZSBwYXJ0cyBvZiB0aGlzCisgKiBkcml2ZXIuIEkgYWxzbyBtdXN0IGdpdmUgY3JlZGl0cyB0byBEYXZpZCBCcm93bmVsbAorICogd2hvIHN1cHBvcnRlZCBtZSB3aXRoIHRoZSBVU0IgZGV2ZWxvcG1lbnQuCisgKgorICogQmVybmQgUG9ycgorICoKKyAqCisgKiBSZXZpc2lvbiBoaXN0b3J5OgorICogMC45NDogRC9BIG91dHB1dCBzaG91bGQgd29yayBub3cgd2l0aCBhbnkgY2hhbm5lbCBsaXN0IGNvbWJpbmF0aW9ucworICogMC45NTogLm93bmVyIGNvbW1lbnRlZCBvdXQgZm9yIGtlcm5lbCB2ZXJzIGJlbG93IDIuNC4xOQorICogICAgICAgc2FuaXR5IGNoZWNrcyBpbiBhaS9hb19jbWQKKyAqIDAuOTY6IHRyeWluZyB0byBnZXQgaXQgd29ya2luZyB3aXRoIDIuNiwgbW92ZWQgYWxsIG1lbW9yeSBhbGxvYyB0byBjb21lZGkncworICogICAgICAgYXR0YWNoIGZpbmFsIFVTQiBJRHMKKyAqICAgICAgIG1vdmVkIG1lbW9yeSBhbGxvY2F0aW9uIGNvbXBsZXRlbHkgdG8gdGhlIGNvcnJlc3BvbmRpbmcgY29tZWRpCisgKiAgICAgICBmdW5jdGlvbnMgZmlybXdhcmUgdXBsb2FkIGlzIGJ5IGZ4bG9hZCBhbmQgbm8gbG9uZ2VyIGJ5IGNvbWVkaSAoZHVlIHRvCisgKiAgICAgICBlbnVtZXJhdGlvbikKKyAqIDAuOTc6IFVTQiBJRHMgcmVjZWl2ZWQsIGFkanVzdGVkIHRhYmxlCisgKiAwLjk4OiBTTVAsIGxvY2tpbmcsIG1lbXJveSBhbGxvYzogbW92ZWQgYWxsIHVzYiBtZW1vcnkgYWxsb2MKKyAqICAgICAgIHRvIHRoZSB1c2Igc3Vic3lzdGVtIGFuZCBtb3ZlZCBhbGwgY29tZWRpIHJlbGF0ZWQgbWVtb3J5CisgKiAgICAgICBhbGxvYyB0byBjb21lZGkuCisgKiAgICAgICB8IGtlcm5lbCB8IHJlZ2lzdHJhdGlvbiB8IHVzYmR1eC11c2IgfCB1c2JkdXgtY29tZWRpIHwgY29tZWRpIHwKKyAqIDAuOTk6IFVTQiAyLjA6IGNoYW5nZWQgcHJvdG9jb2wgdG8gaXNvY2hyb25vdXMgdHJhbnNmZXIKKyAqICAgICAgICAgICAgICAgIElSUSB0cmFuc2ZlciBpcyB0b28gYnVnZ3kgYW5kIHRvbyByaXNreSBpbiAyLjAKKyAqICAgICAgICAgICAgICAgIGZvciB0aGUgaGlnaCBzcGVlZCBJU08gdHJhbnNmZXIgaXMgbm93IGEgd29ya2luZyB2ZXJzaW9uCisgKiAgICAgICAgICAgICAgICBhdmFpbGFibGUKKyAqIDAuOTliOiBJbmNyZWFzZWQgdGhlIGlzbyB0cmFuc2ZlciBidWZmZXIgZm9yIGhpZ2ggc3AudG8gMTAgYnVmZmVycy4gU29tZSBWSUEKKyAqICAgICAgICBjaGlwc2V0cyBtaXNzIG91dCBJUlFzLiBEZWVwZXIgYnVmZmVyaW5nIGlzIG5lZWRlZC4KKyAqIDEuMDA6IGZ1bGwgVVNCIDIuMCBzdXBwb3J0IGZvciB0aGUgQS9EIGNvbnZlcnRlci4gTm93OiBtYXggOGtIeiBzYW1wbGluZworICogICAgICAgcmF0ZS4KKyAqICAgICAgIEZpcm13YXJlIHZlcnMgMS4wMCBpcyBuZWVkZWQgZm9yIHRoaXMuCisgKiAgICAgICBUd28gMTYgYml0IHVwL2Rvd24vcmVzZXQgY291bnRlciB3aXRoIGEgc2FtcGxpbmcgcmF0ZSBvZiAxa0h6CisgKiAgICAgICBBbmQgbG9hZHMgb2YgY2xlYW5pbmcgdXAsIGluIHBhcnRpY3VsYXIgc3RyZWFtbGluaW5nIHRoZQorICogICAgICAgYnVsayB0cmFuc2ZlcnMuCisgKiAxLjE6ICBtb3ZlZCBFUDQgdHJhbnNmZXJzIHRvIEVQMSB0byBtYWtlIHNwYWNlIGZvciBhIFBXTSBvdXRwdXQgb24gRVA0CisgKiAxLjI6ICBhZGRlZCBQV00gc3Vwb3J0IHZpYSBFUDQKKyAqIDIuMDogIFBXTSBzZWVtcyB0byBiZSBzdGFibGUgYW5kIGlzIG5vdCBpbnRlcmZlcmluZyB3aXRoIHRoZSBvdGhlciBmdW5jdGlvbnMKKyAqIDIuMTogIGNoYW5nZWQgUFdNIEFQSQorICoKKyAqLworCisvKiBnZW5lcmF0ZXMgbG9hZHMgb2YgZGVidWcgaW5mbyAqLworLyogI2RlZmluZSBOT0lTWV9EVVhfREVCVUdCVUcgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KKyNpbmNsdWRlIDxsaW51eC91c2IuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KKworI2luY2x1ZGUgIi4uL2NvbWVkaWRldi5oIgorCisjZGVmaW5lIEJPQVJETkFNRSAidXNiZHV4IgorCisvKiB0aW1lb3V0IGZvciB0aGUgVVNCLXRyYW5zZmVyICovCisjZGVmaW5lIEVaVElNRU9VVCAzMAorCisvKiBjb25zdGFudHMgZm9yICJmaXJtd2FyZSIgdXBsb2FkIGFuZCBkb3dubG9hZCAqLworI2RlZmluZSBVU0JEVVhTVUJfRklSTVdBUkUgMHhBMAorI2RlZmluZSBWRU5ET1JfRElSX0lOICAweEMwCisjZGVmaW5lIFZFTkRPUl9ESVJfT1VUIDB4NDAKKworLyogaW50ZXJuYWwgYWRyZXNzZXMgb2YgdGhlIDgwNTEgcHJvY2Vzc29yICovCisjZGVmaW5lIFVTQkRVWFNVQl9DUFVDUyAweEU2MDAKKworLyoKKyAqIHRoZSBtaW5vciBkZXZpY2UgbnVtYmVyLCBtYWpvciBpcyAxODAgb25seSBmb3IgZGVidWdnaW5nIHB1cnBvc2VzIGFuZCB0bworICogdXBsb2FkIHNwZWNpYWwgZmlybXdhcmUgKHByb2dyYW1taW5nIHRoZSBlZXByb20gZXRjKSB3aGljaCBpcyBub3QgY29tcGF0aWJsZQorICogd2l0aCB0aGUgY29tZWRpIGZyYW13b3JrCisgKi8KKyNkZWZpbmUgVVNCRFVYU1VCX01JTk9SIDMyCisKKy8qIG1heCBsZW5naHRoIG9mIHRoZSB0cmFuc2Zlci1idWZmZXIgZm9yIHNvZnR3YXJlIHVwbG9hZCAqLworI2RlZmluZSBUQl9MRU4gMHgyMDAwCisKKy8qIElucHV0IGVuZHBvaW50IG51bWJlcjogSVNPL0lSUSAqLworI2RlZmluZSBJU09JTkVQICAgICAgICAgICA2CisKKy8qIE91dHB1dCBlbmRwb2ludCBudW1iZXI6IElTTy9JUlEgKi8KKyNkZWZpbmUgSVNPT1VURVAgICAgICAgICAgMgorCisvKiBUaGlzIEVQIHNlbmRzIERVWCBjb21tYW5kcyB0byBVU0JEVVggKi8KKyNkZWZpbmUgQ09NTUFORF9PVVRfRVAgICAgIDEKKworLyogVGhpcyBFUCByZWNlaXZlcyB0aGUgRFVYIGNvbW1hbmRzIGZyb20gVVNCRFVYICovCisjZGVmaW5lIENPTU1BTkRfSU5fRVAgICAgICAgIDgKKworLyogT3V0cHV0IGVuZHBvaW50IGZvciBQV00gKi8KKyNkZWZpbmUgUFdNX0VQICAgICAgICAgNAorCisvKiAzMDBIeiBtYXggZnJlcXUgdW5kZXIgUFdNICovCisjZGVmaW5lIE1JTl9QV01fUEVSSU9EICAoKGxvbmcpKDFFOS8zMDApKQorCisvKiBEZWZhdWx0IFBXTSBmcmVxdWVuY3kgKi8KKyNkZWZpbmUgUFdNX0RFRkFVTFRfUEVSSU9EICgobG9uZykoMUU5LzEwMCkpCisKKy8qIE51bWJlciBvZiBjaGFubmVscyAqLworI2RlZmluZSBOVU1DSEFOTkVMUyAgICAgICA4CisKKy8qIFNpemUgb2Ygb25lIEEvRCB2YWx1ZSAqLworI2RlZmluZSBTSVpFQURJTiAgICAgICAgICAoKHNpemVvZihpbnQxNl90KSkpCisKKy8qCisgKiBTaXplIG9mIHRoZSBpbnB1dC1idWZmZXIgSU4gQllURVMKKyAqIEFsd2F5cyBtdWx0aXBsZSBvZiA4IGZvciA4IG1pY3JvZnJhbWVzIHdoaWNoIGlzIG5lZWRlZCBpbiB0aGUgaGlnaHNwZWVkIG1vZGUKKyAqLworI2RlZmluZSBTSVpFSU5CVUYgICAgICAgICAoKDgqU0laRUFESU4pKQorCisvKiAxNiBieXRlcy4gKi8KKyNkZWZpbmUgU0laRUlOU05CVUYgICAgICAgMTYKKworLyogTnVtYmVyIG9mIERBIGNoYW5uZWxzICovCisjZGVmaW5lIE5VTU9VVENIQU5ORUxTICAgIDgKKworLyogc2l6ZSBvZiBvbmUgdmFsdWUgZm9yIHRoZSBEL0EgY29udmVydGVyOiBjaGFubmVsIGFuZCB2YWx1ZSAqLworI2RlZmluZSBTSVpFREFPVVQgICAgICAgICAgKChzaXplb2YoaW50OF90KStzaXplb2YoaW50MTZfdCkpKQorCisvKgorICogU2l6ZSBvZiB0aGUgb3V0cHV0LWJ1ZmZlciBpbiBieXRlcworICogQWN0dWFsbHkgb25seSB0aGUgZmlyc3QgNCB0cmlwbGV0cyBhcmUgdXNlZCBidXQgZm9yIHRoZQorICogaGlnaCBzcGVlZCBtb2RlIHdlIG5lZWQgdG8gcGFkIGl0IHRvIDggKG1pY3JvZnJhbWVzKS4KKyAqLworI2RlZmluZSBTSVpFT1VUQlVGICAgICAgICAgKCg4KlNJWkVEQU9VVCkpCisKKy8qCisgKiBTaXplIG9mIHRoZSBidWZmZXIgZm9yIHRoZSBkdXggY29tbWFuZHM6IGp1c3Qgbm93IG1heCBzaXplIGlzIGRldGVybWluZWQKKyAqIGJ5IHRoZSBhbmFsb2d1ZSBvdXQgKyBjb21tYW5kIGJ5dGUgKyBwYW5pYyBieXRlcy4uLgorICovCisjZGVmaW5lIFNJWkVPRkRVWEJVRkZFUiAgICAoKDgqU0laRURBT1VUKzIpKQorCisvKiBOdW1iZXIgb2YgaW4tVVJCcyB3aGljaCByZWNlaXZlIHRoZSBkYXRhOiBtaW49MiAqLworI2RlZmluZSBOVU1PRklOQlVGRkVSU0ZVTEwgICAgIDUKKworLyogTnVtYmVyIG9mIG91dC1VUkJzIHdoaWNoIHNlbmQgdGhlIGRhdGE6IG1pbj0yICovCisjZGVmaW5lIE5VTU9GT1VUQlVGRkVSU0ZVTEwgICAgNQorCisvKiBOdW1iZXIgb2YgaW4tVVJCcyB3aGljaCByZWNlaXZlIHRoZSBkYXRhOiBtaW49NSAqLworLyogbXVzdCBoYXZlIG1vcmUgYnVmZmVycyBkdWUgdG8gYnVnZ3kgVVNCIGN0ciAqLworI2RlZmluZSBOVU1PRklOQlVGRkVSU0hJR0ggICAgIDEwCisKKy8qIE51bWJlciBvZiBvdXQtVVJCcyB3aGljaCBzZW5kIHRoZSBkYXRhOiBtaW49NSAqLworLyogbXVzdCBoYXZlIG1vcmUgYnVmZmVycyBkdWUgdG8gYnVnZ3kgVVNCIGN0ciAqLworI2RlZmluZSBOVU1PRk9VVEJVRkZFUlNISUdIICAgIDEwCisKKy8qIFRvdGFsIG51bWJlciBvZiB1c2JkdXggZGV2aWNlcyAqLworI2RlZmluZSBOVU1VU0JEVVggICAgICAgICAgICAgMTYKKworLyogQW5hbG9ndWUgaW4gc3ViZGV2aWNlICovCisjZGVmaW5lIFNVQkRFVl9BRCAgICAgICAgICAgICAwCisKKy8qIEFuYWxvZ3VlIG91dCBzdWJkZXZpY2UgKi8KKyNkZWZpbmUgU1VCREVWX0RBICAgICAgICAgICAgIDEKKworLyogRGlnaXRhbCBJL08gKi8KKyNkZWZpbmUgU1VCREVWX0RJTyAgICAgICAgICAgIDIKKworLyogY291bnRlciAqLworI2RlZmluZSBTVUJERVZfQ09VTlRFUiAgICAgICAgMworCisvKiB0aW1lciBha2EgcHdtIG91dHB1dCAqLworI2RlZmluZSBTVUJERVZfUFdNICAgICAgICAgICAgNAorCisvKiBudW1iZXIgb2YgcmV0cmllcyB0byBnZXQgdGhlIHJpZ2h0IGR1eCBjb21tYW5kICovCisjZGVmaW5lIFJFVFJJRVMgMTAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogY29tZWRpIGNvbnN0YW50cyAqLworc3RhdGljIGNvbnN0IGNvbWVkaV9scmFuZ2UgcmFuZ2VfdXNiZHV4X2FpX3JhbmdlID0geyA0LCB7CisJCQlCSVBfUkFOR0UoNC4wOTYpLAorCQkJQklQX1JBTkdFKDQuMDk2IC8gMiksCisJCQlVTklfUkFOR0UoNC4wOTYpLAorCQkJVU5JX1JBTkdFKDQuMDk2IC8gMikKKwl9Cit9OworCitzdGF0aWMgY29uc3QgY29tZWRpX2xyYW5nZSByYW5nZV91c2JkdXhfYW9fcmFuZ2UgPSB7IDIsIHsKKwkJCUJJUF9SQU5HRSg0LjA5NiksCisJCQlVTklfUkFOR0UoNC4wOTYpLAorCX0KK307CisKKy8qCisgKiBwcml2YXRlIHN0cnVjdHVyZSBvZiBvbmUgc3ViZGV2aWNlCisgKi8KKworLyoKKyAqIFRoaXMgaXMgdGhlIHN0cnVjdHVyZSB3aGljaCBob2xkcyBhbGwgdGhlIGRhdGEgb2YKKyAqIHRoaXMgZHJpdmVyIG9uZSBzdWIgZGV2aWNlIGp1c3Qgbm93OiBBL0QKKyAqLworc3RydWN0IHVzYmR1eHN1YiB7CisJLyogYXR0YWNoZWQ/ICovCisJaW50IGF0dGFjaGVkOworCS8qIGlzIGl0IGFzc29jaWF0ZWQgd2l0aCBhIHN1YmRldmljZT8gKi8KKwlpbnQgcHJvYmVkOworCS8qIHBvaW50ZXIgdG8gdGhlIHVzYi1kZXZpY2UgKi8KKwlzdHJ1Y3QgdXNiX2RldmljZSAqdXNiZGV2OworCS8qIGFjdHVhbCBudW1iZXIgb2YgaW4tYnVmZmVycyAqLworCWludCBudW1PZkluQnVmZmVyczsKKwkvKiBhY3R1YWwgbnVtYmVyIG9mIG91dC1idWZmZXJzICovCisJaW50IG51bU9mT3V0QnVmZmVyczsKKwkvKiBJU08tdHJhbnNmZXIgaGFuZGxpbmc6IGJ1ZmZlcnMgKi8KKwlzdHJ1Y3QgdXJiICoqdXJiSW47CisJc3RydWN0IHVyYiAqKnVyYk91dDsKKwkvKiBwd20tdHJhbnNmZXIgaGFuZGxpbmcgKi8KKwlzdHJ1Y3QgdXJiICp1cmJQd207CisJLyogUFdNIHBlcmlvZCAqLworCWxzYW1wbF90IHB3bVBlcmlvZDsKKwkvKiBQV00gaW50ZXJuYWwgZGVsYXkgZm9yIHRoZSBHUElGIGluIHRoZSBGWDIgKi8KKwlpbnQ4X3QgcHdtRGVsYXk7CisJLyogc2l6ZSBvZiB0aGUgUFdNIGJ1ZmZlciB3aGljaCBob2xkcyB0aGUgYml0IHBhdHRlcm4gKi8KKwlpbnQgc2l6ZVB3bUJ1ZjsKKwkvKiBpbnB1dCBidWZmZXIgZm9yIHRoZSBJU08tdHJhbnNmZXIgKi8KKwlpbnQxNl90ICppbkJ1ZmZlcjsKKwkvKiBpbnB1dCBidWZmZXIgZm9yIHNpbmdsZSBpbnNuICovCisJaW50MTZfdCAqaW5zbkJ1ZmZlcjsKKwkvKiBvdXRwdXQgYnVmZmVyIGZvciBzaW5nbGUgREEgb3V0cHV0cyAqLworCWludDE2X3QgKm91dEJ1ZmZlcjsKKwkvKiBpbnRlcmZhY2UgbnVtYmVyICovCisJaW50IGlmbnVtOworCS8qIGludGVyZmFjZSBzdHJ1Y3R1cmUgaW4gMi42ICovCisJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGVyZmFjZTsKKwkvKiBjb21lZGkgZGV2aWNlIGZvciB0aGUgaW50ZXJydXB0IGNvbnRleHQgKi8KKwljb21lZGlfZGV2aWNlICpjb21lZGlkZXY7CisJLyogaXMgaXQgVVNCX1NQRUVEX0hJR0ggb3Igbm90PyAqLworCXNob3J0IGludCBoaWdoX3NwZWVkOworCS8qIGFzeW5jaHJvbm91cyBjb21tYW5kIGlzIHJ1bm5pbmcgKi8KKwlzaG9ydCBpbnQgYWlfY21kX3J1bm5pbmc7CisJc2hvcnQgaW50IGFvX2NtZF9ydW5uaW5nOworCS8qIHB3bSBpcyBydW5uaW5nICovCisJc2hvcnQgaW50IHB3bV9jbWRfcnVubmluZzsKKwkvKiBjb250aW5vdXMgYXF1aXNpdGlvbiAqLworCXNob3J0IGludCBhaV9jb250aW5vdXM7CisJc2hvcnQgaW50IGFvX2NvbnRpbm91czsKKwkvKiBudW1iZXIgb2Ygc2FtcGxlcyB0byBhcXVpcmUgKi8KKwlpbnQgYWlfc2FtcGxlX2NvdW50OworCWludCBhb19zYW1wbGVfY291bnQ7CisJLyogdGltZSBiZXR3ZWVuIHNhbXBsZXMgaW4gdW5pdHMgb2YgdGhlIHRpbWVyICovCisJdW5zaWduZWQgaW50IGFpX3RpbWVyOworCXVuc2lnbmVkIGludCBhb190aW1lcjsKKwkvKiBjb3VudGVyIGJldHdlZW4gYXF1aXNpdGlvbnMgKi8KKwl1bnNpZ25lZCBpbnQgYWlfY291bnRlcjsKKwl1bnNpZ25lZCBpbnQgYW9fY291bnRlcjsKKwkvKiBpbnRlcnZhbCBpbiBmcmFtZXMvdWZyYW1lcyAqLworCXVuc2lnbmVkIGludCBhaV9pbnRlcnZhbDsKKwkvKiBEL0EgY29tbWFuZHMgKi8KKwlpbnQ4X3QgKmRhY19jb21tYW5kczsKKwkvKiBjb21tYW5kcyAqLworCWludDhfdCAqZHV4X2NvbW1hbmRzOworCXN0cnVjdCBzZW1hcGhvcmUgc2VtOworfTsKKworLyoKKyAqIFRoZSBwb2ludGVyIHRvIHRoZSBwcml2YXRlIHVzYi1kYXRhIG9mIHRoZSBkcml2ZXIgaXMgYWxzbyB0aGUgcHJpdmF0ZSBkYXRhCisgKiBmb3IgdGhlIGNvbWVkaS1kZXZpY2UuICBUaGlzIGhhcyB0byBiZSBnbG9iYWwgYXMgdGhlIHVzYiBzdWJzeXN0ZW0gbmVlZHMKKyAqIGdsb2JhbCB2YXJpYWJsZXMuIFRoZSBvdGhlciByZWFzb24gaXMgdGhhdCB0aGlzIHN0cnVjdHVyZSBtdXN0IGJlIHRoZXJlCisgKiBfYmVmb3JlXyBhbnkgY29tZWRpIGNvbW1hbmQgaXMgaXNzdWVkLiBUaGUgdXNiIHN1YnN5c3RlbSBtdXN0IGJlIGluaXRpYWxpc2VkCisgKiBiZWZvcmUgY29tZWRpIGNhbiBhY2Nlc3MgaXQuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgdXNiZHV4c3ViIHVzYmR1eHN1YltOVU1VU0JEVVhdOworCitzdGF0aWMgREVDTEFSRV9NVVRFWChzdGFydF9zdG9wX3NlbSk7CisKKy8qCisgKiBTdG9wcyB0aGUgZGF0YSBhY3F1aXNpb24KKyAqIEl0IHNob3VsZCBiZSBzYWZlIHRvIGNhbGwgdGhpcyBmdW5jdGlvbiBmcm9tIGFueSBjb250ZXh0CisgKi8KK3N0YXRpYyBpbnQgdXNiZHV4c3ViX3VubGlua19JblVSQnMoc3RydWN0IHVzYmR1eHN1YiAqdXNiZHV4c3ViX3RtcCkKK3sKKwlpbnQgaSA9IDA7CisJaW50IGVyciA9IDA7CisKKwlpZiAodXNiZHV4c3ViX3RtcCAmJiB1c2JkdXhzdWJfdG1wLT51cmJJbikgeworCQlmb3IgKGkgPSAwOyBpIDwgdXNiZHV4c3ViX3RtcC0+bnVtT2ZJbkJ1ZmZlcnM7IGkrKykgeworCQkJaWYgKHVzYmR1eHN1Yl90bXAtPnVyYkluW2ldKSB7CisJCQkJLyogV2Ugd2FpdCBoZXJlIHVudGlsIGFsbCB0cmFuc2ZlcnMgaGF2ZSBiZWVuCisJCQkJICogY2FuY2VsbGVkLiAqLworCQkJCXVzYl9raWxsX3VyYih1c2JkdXhzdWJfdG1wLT51cmJJbltpXSk7CisJCQl9CisJCQlkZXZfZGJnKCZ1c2JkdXhzdWJfdG1wLT5pbnRlcmZhY2UtPmRldiwKKwkJCQkiY29tZWRpOiB1c2JkdXg6IHVubGlua2VkIEluVVJCICVkLCBlcnI9JWRcbiIsCisJCQkJaSwgZXJyKTsKKwkJfQorCX0KKwlyZXR1cm4gZXJyOworfQorCisvKgorICogVGhpcyB3aWxsIHN0b3AgYSBydW5uaW5nIGFjcXVpc2l0aW9uIG9wZXJhdGlvbgorICogSXMgY2FsbGVkIGZyb20gd2l0aGluIHRoaXMgZHJpdmVyIGZyb20gYm90aCB0aGUKKyAqIGludGVycnVwdCBjb250ZXh0IGFuZCBmcm9tIGNvbWVkaQorICovCitzdGF0aWMgaW50IHVzYmR1eF9haV9zdG9wKHN0cnVjdCB1c2JkdXhzdWIgKnRoaXNfdXNiZHV4c3ViLCBpbnQgZG9fdW5saW5rKQoreworCWludCByZXQgPSAwOworCisJaWYgKCF0aGlzX3VzYmR1eHN1YikgeworCQlkZXZfZXJyKCZ0aGlzX3VzYmR1eHN1Yi0+aW50ZXJmYWNlLT5kZXYsCisJCQkiY29tZWRpPzogdXNiZHV4X2FpX3N0b3A6IHRoaXNfdXNiZHV4c3ViPU5VTEwhXG4iKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCWRldl9kYmcoJnRoaXNfdXNiZHV4c3ViLT5pbnRlcmZhY2UtPmRldiwgImNvbWVkaTogdXNiZHV4X2FpX3N0b3BcbiIpOworCisJaWYgKGRvX3VubGluaykgeworCQkvKiBzdG9wIGFxdWlzdGlvbiAqLworCQlyZXQgPSB1c2JkdXhzdWJfdW5saW5rX0luVVJCcyh0aGlzX3VzYmR1eHN1Yik7CisJfQorCisJdGhpc191c2JkdXhzdWItPmFpX2NtZF9ydW5uaW5nID0gMDsKKworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBUaGlzIHdpbGwgY2FuY2VsIGEgcnVubmluZyBhY3F1aXNpdGlvbiBvcGVyYXRpb24uCisgKiBUaGlzIGlzIGNhbGxlZCBieSBjb21lZGkgYnV0IG5ldmVyIGZyb20gaW5zaWRlIHRoZSBkcml2ZXIuCisgKi8KK3N0YXRpYyBpbnQgdXNiZHV4X2FpX2NhbmNlbChjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKnMpCit7CisJc3RydWN0IHVzYmR1eHN1YiAqdGhpc191c2JkdXhzdWI7CisJaW50IHJlcyA9IDA7CisKKwkvKiBmb3JjZSB1bmxpbmsgb2YgYWxsIHVyYnMgKi8KKwl0aGlzX3VzYmR1eHN1YiA9IGRldi0+cHJpdmF0ZTsKKwlpZiAoIXRoaXNfdXNiZHV4c3ViKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWRldl9kYmcoJnRoaXNfdXNiZHV4c3ViLT5pbnRlcmZhY2UtPmRldiwgImNvbWVkaTogdXNiZHV4X2FpX2NhbmNlbFxuIik7CisKKwkvKiBwcmV2ZW50IG90aGVyIENQVXMgZnJvbSBzdWJtaXR0aW5nIG5ldyBjb21tYW5kcyBqdXN0IG5vdyAqLworCWRvd24oJnRoaXNfdXNiZHV4c3ViLT5zZW0pOworCWlmICghKHRoaXNfdXNiZHV4c3ViLT5wcm9iZWQpKSB7CisJCXVwKCZ0aGlzX3VzYmR1eHN1Yi0+c2VtKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCS8qIHVubGluayBvbmx5IGlmIHRoZSB1cmIgcmVhbGx5IGhhcyBiZWVuIHN1Ym1pdHRlZCAqLworCXJlcyA9IHVzYmR1eF9haV9zdG9wKHRoaXNfdXNiZHV4c3ViLCB0aGlzX3VzYmR1eHN1Yi0+YWlfY21kX3J1bm5pbmcpOworCXVwKCZ0aGlzX3VzYmR1eHN1Yi0+c2VtKTsKKwlyZXR1cm4gcmVzOworfQorCisvKiBhbmFsb2d1ZSBJTiAtIGludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmUgKi8KK3N0YXRpYyB2b2lkIHVzYmR1eHN1Yl9haV9Jc29jSXJxKHN0cnVjdCB1cmIgKnVyYikKK3sKKwlpbnQgaSwgZXJyLCBuOworCXN0cnVjdCB1c2JkdXhzdWIgKnRoaXNfdXNiZHV4c3ViOworCWNvbWVkaV9kZXZpY2UgKnRoaXNfY29tZWRpZGV2OworCWNvbWVkaV9zdWJkZXZpY2UgKnM7CisKKwkvKiB0aGUgY29udGV4dCB2YXJpYWJsZSBwb2ludHMgdG8gdGhlIHN1YmRldmljZSAqLworCXRoaXNfY29tZWRpZGV2ID0gdXJiLT5jb250ZXh0OworCS8qIHRoZSBwcml2YXRlIHN0cnVjdHVyZSBvZiB0aGUgc3ViZGV2aWNlIGlzIHN0cnVjdCB1c2JkdXhzdWIgKi8KKwl0aGlzX3VzYmR1eHN1YiA9IHRoaXNfY29tZWRpZGV2LT5wcml2YXRlOworCS8qIHN1YmRldmljZSB3aGljaCBpcyB0aGUgQUQgY29udmVydGVyICovCisJcyA9IHRoaXNfY29tZWRpZGV2LT5zdWJkZXZpY2VzICsgU1VCREVWX0FEOworCisJLyogZmlyc3Qgd2UgdGVzdCBpZiBzb21ldGhpbmcgdW51c3VhbCBoYXMganVzdCBoYXBwZW5lZCAqLworCXN3aXRjaCAodXJiLT5zdGF0dXMpIHsKKwljYXNlIDA6CisJCS8qIGNvcHkgdGhlIHJlc3VsdCBpbiB0aGUgdHJhbnNmZXIgYnVmZmVyICovCisJCW1lbWNweSh0aGlzX3VzYmR1eHN1Yi0+aW5CdWZmZXIsCisJCQl1cmItPnRyYW5zZmVyX2J1ZmZlciwgU0laRUlOQlVGKTsKKwkJYnJlYWs7CisJY2FzZSAtRUlMU0VROgorCQkvKiBlcnJvciBpbiB0aGUgSVNPY2hyb25vdXMgZGF0YSAqLworCQkvKiB3ZSBkb24ndCBjb3B5IHRoZSBkYXRhIGludG8gdGhlIHRyYW5zZmVyIGJ1ZmZlciAqLworCQkvKiBhbmQgcmVjeWNsZSB0aGUgbGFzdCBkYXRhIGJ5dGUgKi8KKwkJZGV2X2RiZygmdXJiLT5kZXYtPmRldiwKKwkJCSJjb21lZGklZDogdXNiZHV4OiBDUkMgZXJyb3IgaW4gSVNPIElOIHN0cmVhbS5cbiIsCisJCQl0aGlzX3VzYmR1eHN1Yi0+Y29tZWRpZGV2LT5taW5vcik7CisKKwkJYnJlYWs7CisKKwljYXNlIC1FQ09OTlJFU0VUOgorCWNhc2UgLUVOT0VOVDoKKwljYXNlIC1FU0hVVERPV046CisJY2FzZSAtRUNPTk5BQk9SVEVEOgorCQkvKiBoYXBwZW5zIGFmdGVyIGFuIHVubGluayBjb21tYW5kICovCisJCWlmICh0aGlzX3VzYmR1eHN1Yi0+YWlfY21kX3J1bm5pbmcpIHsKKwkJCS8qIHdlIGFyZSBzdGlsbCBydW5uaW5nIGEgY29tbWFuZCAqLworCQkJLyogdGVsbCB0aGlzIGNvbWVkaSAqLworCQkJcy0+YXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRU9BOworCQkJcy0+YXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRVJST1I7CisJCQljb21lZGlfZXZlbnQodGhpc191c2JkdXhzdWItPmNvbWVkaWRldiwgcyk7CisJCQkvKiBzdG9wIHRoZSB0cmFuc2ZlciB3L28gdW5saW5rICovCisJCQl1c2JkdXhfYWlfc3RvcCh0aGlzX3VzYmR1eHN1YiwgMCk7CisJCX0KKwkJcmV0dXJuOworCisJZGVmYXVsdDoKKwkJLyogYSByZWFsIGVycm9yIG9uIHRoZSBidXMgKi8KKwkJLyogcGFzcyBlcnJvciB0byBjb21lZGkgaWYgd2UgYXJlIHJlYWxseSBydW5uaW5nIGEgY29tbWFuZCAqLworCQlpZiAodGhpc191c2JkdXhzdWItPmFpX2NtZF9ydW5uaW5nKSB7CisJCQlkZXZfZXJyKCZ1cmItPmRldi0+ZGV2LAorCQkJCSJOb24temVybyB1cmIgc3RhdHVzIHJlY2VpdmVkIGluIGFpIGludHIgIgorCQkJCSJjb250ZXh0OiAlZFxuIiwgdXJiLT5zdGF0dXMpOworCQkJcy0+YXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRU9BOworCQkJcy0+YXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRVJST1I7CisJCQljb21lZGlfZXZlbnQodGhpc191c2JkdXhzdWItPmNvbWVkaWRldiwgcyk7CisJCQkvKiBkb24ndCBkbyBhbiB1bmxpbmsgaGVyZSAqLworCQkJdXNiZHV4X2FpX3N0b3AodGhpc191c2JkdXhzdWIsIDApOworCQl9CisJCXJldHVybjsKKwl9CisKKwkvKgorCSAqIGF0IHRoaXMgcG9pbnQgd2UgYXJlIHJlYXNvbmFibHkgc3VyZSB0aGF0IG5vdGhpbmcgZG9kZ3kgaGFzIGhhcHBlbmVkCisJICogYXJlIHdlIHJ1bm5pbmcgYSBjb21tYW5kPworCSAqLworCWlmICh1bmxpa2VseSgoISh0aGlzX3VzYmR1eHN1Yi0+YWlfY21kX3J1bm5pbmcpKSkpIHsKKwkJLyoKKwkJICogbm90IHJ1bm5pbmcgYSBjb21tYW5kLCBkbyBub3QgY29udGludWUgZXhlY3V0aW9uIGlmIG5vCisJCSAqIGFzeW5jaHJvbm91cyBjb21tYW5kIGlzIHJ1bm5pbmcgaW4gcGFydGljdWxhciBub3QgcmVzdWJtaXQKKwkJICovCisJCXJldHVybjsKKwl9CisKKwl1cmItPmRldiA9IHRoaXNfdXNiZHV4c3ViLT51c2JkZXY7CisKKwkvKiByZXN1Ym1pdCB0aGUgdXJiICovCisJZXJyID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfQVRPTUlDKTsKKwlpZiAodW5saWtlbHkoZXJyIDwgMCkpIHsKKwkJZGV2X2VycigmdXJiLT5kZXYtPmRldiwKKwkJCSJjb21lZGlfOiB1cmIgcmVzdWJtaXQgZmFpbGVkIGluIGludC1jb250ZXh0ISBlcnI9JWRcbiIsCisJCQllcnIpOworCQlpZiAoZXJyID09IC1FTDJOU1lOQykKKwkJCWRldl9lcnIoJnVyYi0+ZGV2LT5kZXYsCisJCQkJImJ1Z2d5IFVTQiBob3N0IGNvbnRyb2xsZXIgb3IgYnVnIGluIElSUSAiCisJCQkJImhhbmRsZXIhXG4iKTsKKwkJcy0+YXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRU9BOworCQlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FUlJPUjsKKwkJY29tZWRpX2V2ZW50KHRoaXNfdXNiZHV4c3ViLT5jb21lZGlkZXYsIHMpOworCQkvKiBkb24ndCBkbyBhbiB1bmxpbmsgaGVyZSAqLworCQl1c2JkdXhfYWlfc3RvcCh0aGlzX3VzYmR1eHN1YiwgMCk7CisJCXJldHVybjsKKwl9CisKKwl0aGlzX3VzYmR1eHN1Yi0+YWlfY291bnRlci0tOworCWlmIChsaWtlbHkodGhpc191c2JkdXhzdWItPmFpX2NvdW50ZXIgPiAwKSkKKwkJcmV0dXJuOworCisJLyogdGltZXIgemVybywgdHJhbnNmZXIgbWVhc3VyZW1lbnRzIHRvIGNvbWVkaSAqLworCXRoaXNfdXNiZHV4c3ViLT5haV9jb3VudGVyID0gdGhpc191c2JkdXhzdWItPmFpX3RpbWVyOworCisJLyogdGVzdCwgaWYgd2UgdHJhbnNtaXQgb25seSBhIGZpeGVkIG51bWJlciBvZiBzYW1wbGVzICovCisJaWYgKCEodGhpc191c2JkdXhzdWItPmFpX2NvbnRpbm91cykpIHsKKwkJLyogbm90IGNvbnRpbm91cywgZml4ZWQgbnVtYmVyIG9mIHNhbXBsZXMgKi8KKwkJdGhpc191c2JkdXhzdWItPmFpX3NhbXBsZV9jb3VudC0tOworCQkvKiBhbGwgc2FtcGxlcyByZWNlaXZlZD8gKi8KKwkJaWYgKHRoaXNfdXNiZHV4c3ViLT5haV9zYW1wbGVfY291bnQgPCAwKSB7CisJCQkvKiBwcmV2ZW50IGEgcmVzdWJtaXQgbmV4dCB0aW1lICovCisJCQl1c2JkdXhfYWlfc3RvcCh0aGlzX3VzYmR1eHN1YiwgMCk7CisJCQkvKiBzYXkgY29tZWRpIHRoYXQgdGhlIGFjcXVpc3Rpb24gaXMgb3ZlciAqLworCQkJcy0+YXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRU9BOworCQkJY29tZWRpX2V2ZW50KHRoaXNfdXNiZHV4c3ViLT5jb21lZGlkZXYsIHMpOworCQkJcmV0dXJuOworCQl9CisJfQorCS8qIGdldCB0aGUgZGF0YSBmcm9tIHRoZSBVU0IgYnVzIGFuZCBoYW5kIGl0IG92ZXIgdG8gY29tZWRpICovCisJbiA9IHMtPmFzeW5jLT5jbWQuY2hhbmxpc3RfbGVuOworCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKwkJLyogdHJhbnNmZXIgZGF0YSAqLworCQlpZiAoQ1JfUkFOR0Uocy0+YXN5bmMtPmNtZC5jaGFubGlzdFtpXSkgPD0gMSkgeworCQkJY29tZWRpX2J1Zl9wdXQKKwkJCQkocy0+YXN5bmMsCisJCQkJbGUxNl90b19jcHUodGhpc191c2JkdXhzdWItPgorCQkJCQlpbkJ1ZmZlcltpXSkgXiAweDgwMCk7CisJCX0gZWxzZSB7CisJCQljb21lZGlfYnVmX3B1dAorCQkJCShzLT5hc3luYywKKwkJCQlsZTE2X3RvX2NwdSh0aGlzX3VzYmR1eHN1Yi0+aW5CdWZmZXJbaV0pKTsKKwkJfQorCX0KKwkvKiB0ZWxsIGNvbWVkaSB0aGF0IGRhdGEgaXMgdGhlcmUgKi8KKwljb21lZGlfZXZlbnQodGhpc191c2JkdXhzdWItPmNvbWVkaWRldiwgcyk7Cit9CisKK3N0YXRpYyBpbnQgdXNiZHV4c3ViX3VubGlua19PdXRVUkJzKHN0cnVjdCB1c2JkdXhzdWIgKnVzYmR1eHN1Yl90bXApCit7CisJaW50IGkgPSAwOworCWludCBlcnIgPSAwOworCisJaWYgKHVzYmR1eHN1Yl90bXAgJiYgdXNiZHV4c3ViX3RtcC0+dXJiT3V0KSB7CisJCWZvciAoaSA9IDA7IGkgPCB1c2JkdXhzdWJfdG1wLT5udW1PZk91dEJ1ZmZlcnM7IGkrKykgeworCQkJaWYgKHVzYmR1eHN1Yl90bXAtPnVyYk91dFtpXSkKKwkJCQl1c2Jfa2lsbF91cmIodXNiZHV4c3ViX3RtcC0+dXJiT3V0W2ldKTsKKworCQkJZGV2X2RiZygmdXNiZHV4c3ViX3RtcC0+aW50ZXJmYWNlLT5kZXYsCisJCQkJImNvbWVkaTogdXNiZHV4OiB1bmxpbmtlZCBPdXRVUkIgJWQ6IHJlcz0lZFxuIiwKKwkJCQlpLCBlcnIpOworCQl9CisJfQorCXJldHVybiBlcnI7Cit9CisKKy8qIFRoaXMgd2lsbCBjYW5jZWwgYSBydW5uaW5nIGFjcXVpc2l0aW9uIG9wZXJhdGlvbgorICogaW4gYW55IGNvbnRleHQuCisgKi8KK3N0YXRpYyBpbnQgdXNiZHV4X2FvX3N0b3Aoc3RydWN0IHVzYmR1eHN1YiAqdGhpc191c2JkdXhzdWIsIGludCBkb191bmxpbmspCit7CisJaW50IHJldCA9IDA7CisKKwlpZiAoIXRoaXNfdXNiZHV4c3ViKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlkZXZfZGJnKCZ0aGlzX3VzYmR1eHN1Yi0+aW50ZXJmYWNlLT5kZXYsICJjb21lZGk6IHVzYmR1eF9hb19jYW5jZWxcbiIpOworCisJaWYgKGRvX3VubGluaykKKwkJcmV0ID0gdXNiZHV4c3ViX3VubGlua19PdXRVUkJzKHRoaXNfdXNiZHV4c3ViKTsKKworCXRoaXNfdXNiZHV4c3ViLT5hb19jbWRfcnVubmluZyA9IDA7CisKKwlyZXR1cm4gcmV0OworfQorCisvKiBmb3JjZSB1bmxpbmssIGlzIGNhbGxlZCBieSBjb21lZGkgKi8KK3N0YXRpYyBpbnQgdXNiZHV4X2FvX2NhbmNlbChjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKnMpCit7CisJc3RydWN0IHVzYmR1eHN1YiAqdGhpc191c2JkdXhzdWIgPSBkZXYtPnByaXZhdGU7CisJaW50IHJlcyA9IDA7CisKKwlpZiAoIXRoaXNfdXNiZHV4c3ViKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCS8qIHByZXZlbnQgb3RoZXIgQ1BVcyBmcm9tIHN1Ym1pdHRpbmcgYSBjb21tYW5kIGp1c3Qgbm93ICovCisJZG93bigmdGhpc191c2JkdXhzdWItPnNlbSk7CisJaWYgKCEodGhpc191c2JkdXhzdWItPnByb2JlZCkpIHsKKwkJdXAoJnRoaXNfdXNiZHV4c3ViLT5zZW0pOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJLyogdW5saW5rIG9ubHkgaWYgaXQgaXMgcmVhbGx5IHJ1bm5pbmcgKi8KKwlyZXMgPSB1c2JkdXhfYW9fc3RvcCh0aGlzX3VzYmR1eHN1YiwgdGhpc191c2JkdXhzdWItPmFvX2NtZF9ydW5uaW5nKTsKKwl1cCgmdGhpc191c2JkdXhzdWItPnNlbSk7CisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIHZvaWQgdXNiZHV4c3ViX2FvX0lzb2NJcnEoc3RydWN0IHVyYiAqdXJiKQoreworCWludCBpLCByZXQ7CisJaW50OF90ICpkYXRhcDsKKwlzdHJ1Y3QgdXNiZHV4c3ViICp0aGlzX3VzYmR1eHN1YjsKKwljb21lZGlfZGV2aWNlICp0aGlzX2NvbWVkaWRldjsKKwljb21lZGlfc3ViZGV2aWNlICpzOworCisJLyogdGhlIGNvbnRleHQgdmFyaWFibGUgcG9pbnRzIHRvIHRoZSBzdWJkZXZpY2UgKi8KKwl0aGlzX2NvbWVkaWRldiA9IHVyYi0+Y29udGV4dDsKKwkvKiB0aGUgcHJpdmF0ZSBzdHJ1Y3R1cmUgb2YgdGhlIHN1YmRldmljZSBpcyBzdHJ1Y3QgdXNiZHV4c3ViICovCisJdGhpc191c2JkdXhzdWIgPSB0aGlzX2NvbWVkaWRldi0+cHJpdmF0ZTsKKworCXMgPSB0aGlzX2NvbWVkaWRldi0+c3ViZGV2aWNlcyArIFNVQkRFVl9EQTsKKworCXN3aXRjaCAodXJiLT5zdGF0dXMpIHsKKwljYXNlIDA6CisJCS8qIHN1Y2Nlc3MgKi8KKwkJYnJlYWs7CisKKwljYXNlIC1FQ09OTlJFU0VUOgorCWNhc2UgLUVOT0VOVDoKKwljYXNlIC1FU0hVVERPV046CisJY2FzZSAtRUNPTk5BQk9SVEVEOgorCQkvKiBhZnRlciBhbiB1bmxpbmsgY29tbWFuZCwgdW5wbHVnLCAuLi4gZXRjICovCisJCS8qIG5vIHVubGluayBuZWVkZWQgaGVyZS4gQWxyZWFkeSBzaHV0dGluZyBkb3duLiAqLworCQlpZiAodGhpc191c2JkdXhzdWItPmFvX2NtZF9ydW5uaW5nKSB7CisJCQlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FT0E7CisJCQljb21lZGlfZXZlbnQodGhpc191c2JkdXhzdWItPmNvbWVkaWRldiwgcyk7CisJCQl1c2JkdXhfYW9fc3RvcCh0aGlzX3VzYmR1eHN1YiwgMCk7CisJCX0KKwkJcmV0dXJuOworCisJZGVmYXVsdDoKKwkJLyogYSByZWFsIGVycm9yICovCisJCWlmICh0aGlzX3VzYmR1eHN1Yi0+YW9fY21kX3J1bm5pbmcpIHsKKwkJCWRldl9lcnIoJnVyYi0+ZGV2LT5kZXYsCisJCQkJImNvbWVkaV86IE5vbi16ZXJvIHVyYiBzdGF0dXMgcmVjZWl2ZWQgaW4gYW8gIgorCQkJCSJpbnRyIGNvbnRleHQ6ICVkXG4iLCB1cmItPnN0YXR1cyk7CisJCQlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FUlJPUjsKKwkJCXMtPmFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0VPQTsKKwkJCWNvbWVkaV9ldmVudCh0aGlzX3VzYmR1eHN1Yi0+Y29tZWRpZGV2LCBzKTsKKwkJCS8qIHdlIGRvIGFuIHVubGluayBpZiB3ZSBhcmUgaW4gdGhlIGhpZ2ggc3BlZWQgbW9kZSAqLworCQkJdXNiZHV4X2FvX3N0b3AodGhpc191c2JkdXhzdWIsIDApOworCQl9CisJCXJldHVybjsKKwl9CisKKwkvKiBhcmUgd2UgYWN0dWFsbHkgcnVubmluZz8gKi8KKwlpZiAoISh0aGlzX3VzYmR1eHN1Yi0+YW9fY21kX3J1bm5pbmcpKQorCQlyZXR1cm47CisKKwkvKiBub3JtYWwgb3BlcmF0aW9uOiBleGVjdXRpbmcgYSBjb21tYW5kIGluIHRoaXMgc3ViZGV2aWNlICovCisJdGhpc191c2JkdXhzdWItPmFvX2NvdW50ZXItLTsKKwlpZiAodGhpc191c2JkdXhzdWItPmFvX2NvdW50ZXIgPD0gMCkgeworCQkvKiB0aW1lciB6ZXJvICovCisJCXRoaXNfdXNiZHV4c3ViLT5hb19jb3VudGVyID0gdGhpc191c2JkdXhzdWItPmFvX3RpbWVyOworCisJCS8qIGhhbmRsZSBub24gY29udGlub3VzIGFxdWlzaXRpb24gKi8KKwkJaWYgKCEodGhpc191c2JkdXhzdWItPmFvX2NvbnRpbm91cykpIHsKKwkJCS8qIGZpeGVkIG51bWJlciBvZiBzYW1wbGVzICovCisJCQl0aGlzX3VzYmR1eHN1Yi0+YW9fc2FtcGxlX2NvdW50LS07CisJCQlpZiAodGhpc191c2JkdXhzdWItPmFvX3NhbXBsZV9jb3VudCA8IDApIHsKKwkJCQkvKiBhbGwgc2FtcGxlcyB0cmFuc21pdHRlZCAqLworCQkJCXVzYmR1eF9hb19zdG9wKHRoaXNfdXNiZHV4c3ViLCAwKTsKKwkJCQlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FT0E7CisJCQkJY29tZWRpX2V2ZW50KHRoaXNfdXNiZHV4c3ViLT5jb21lZGlkZXYsIHMpOworCQkJCS8qIG5vIHJlc3VibWl0IG9mIHRoZSB1cmIgKi8KKwkJCQlyZXR1cm47CisJCQl9CisJCX0KKwkJLyogdHJhbnNtaXQgZGF0YSB0byB0aGUgVVNCIGJ1cyAqLworCQkoKHVpbnQ4X3QgKikgKHVyYi0+dHJhbnNmZXJfYnVmZmVyKSlbMF0gPQorCQkJcy0+YXN5bmMtPmNtZC5jaGFubGlzdF9sZW47CisJCWZvciAoaSA9IDA7IGkgPCBzLT5hc3luYy0+Y21kLmNoYW5saXN0X2xlbjsgaSsrKSB7CisJCQlzYW1wbF90IHRlbXA7CisJCQlpZiAoaSA+PSBOVU1PVVRDSEFOTkVMUykKKwkJCQlicmVhazsKKworCQkJLyogcG9pbnRlciB0byB0aGUgREEgKi8KKwkJCWRhdGFwID0KKwkJCSAgICAgICAoJigoKGludDhfdCAqKXVyYi0+dHJhbnNmZXJfYnVmZmVyKVtpICogMyArIDFdKSk7CisJCQkvKiBnZXQgdGhlIGRhdGEgZnJvbSBjb21lZGkgKi8KKwkJCXJldCA9IGNvbWVkaV9idWZfZ2V0KHMtPmFzeW5jLCAmdGVtcCk7CisJCQlkYXRhcFswXSA9IHRlbXA7CisJCQlkYXRhcFsxXSA9IHRlbXAgPj4gODsKKwkJCWRhdGFwWzJdID0gdGhpc191c2JkdXhzdWItPmRhY19jb21tYW5kc1tpXTsKKwkJCS8qIHByaW50aygiZGF0YVswXT0leCwgZGF0YVsxXT0leCwgZGF0YVsyXT0leFxuIiwgKi8KKwkJCS8qIGRhdGFwWzBdLGRhdGFwWzFdLGRhdGFwWzJdKTsgKi8KKwkJCWlmIChyZXQgPCAwKSB7CisJCQkJZGV2X2VycigmdXJiLT5kZXYtPmRldiwKKwkJCQkJImNvbWVkaTogYnVmZmVyIHVuZGVyZmxvd1xuIik7CisJCQkJcy0+YXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRU9BOworCQkJCXMtPmFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX09WRVJGTE9XOworCQkJfQorCQkJLyogdHJhbnNtaXQgZGF0YSB0byBjb21lZGkgKi8KKwkJCXMtPmFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0JMT0NLOworCQkJY29tZWRpX2V2ZW50KHRoaXNfdXNiZHV4c3ViLT5jb21lZGlkZXYsIHMpOworCQl9CisJfQorCXVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCA9IFNJWkVPVVRCVUY7CisJdXJiLT5kZXYgPSB0aGlzX3VzYmR1eHN1Yi0+dXNiZGV2OworCXVyYi0+c3RhdHVzID0gMDsKKwlpZiAodGhpc191c2JkdXhzdWItPmFvX2NtZF9ydW5uaW5nKSB7CisJCWlmICh0aGlzX3VzYmR1eHN1Yi0+aGlnaF9zcGVlZCkgeworCQkJLyogdWZyYW1lcyAqLworCQkJdXJiLT5pbnRlcnZhbCA9IDg7CisJCX0gZWxzZSB7CisJCQkvKiBmcmFtZXMgKi8KKwkJCXVyYi0+aW50ZXJ2YWwgPSAxOworCQl9CisJCXVyYi0+bnVtYmVyX29mX3BhY2tldHMgPSAxOworCQl1cmItPmlzb19mcmFtZV9kZXNjWzBdLm9mZnNldCA9IDA7CisJCXVyYi0+aXNvX2ZyYW1lX2Rlc2NbMF0ubGVuZ3RoID0gU0laRU9VVEJVRjsKKwkJdXJiLT5pc29fZnJhbWVfZGVzY1swXS5zdGF0dXMgPSAwOworCQlyZXQgPSB1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9BVE9NSUMpOworCQlpZiAocmV0IDwgMCkgeworCQkJZGV2X2VycigmdXJiLT5kZXYtPmRldiwKKwkJCQkiY29tZWRpXzogYW8gdXJiIHJlc3VibSBmYWlsZWQgaW4gaW50LWNvbnQuICIKKwkJCQkicmV0PSVkIiwgcmV0KTsKKwkJCWlmIChyZXQgPT0gRUwyTlNZTkMpCisJCQkJZGV2X2VycigmdXJiLT5kZXYtPmRldiwKKwkJCQkJImJ1Z2d5IFVTQiBob3N0IGNvbnRyb2xsZXIgb3IgYnVnIGluICIKKwkJCQkJIklSUSBoYW5kbGluZyFcbiIpOworCisJCQlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FT0E7CisJCQlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FUlJPUjsKKwkJCWNvbWVkaV9ldmVudCh0aGlzX3VzYmR1eHN1Yi0+Y29tZWRpZGV2LCBzKTsKKwkJCS8qIGRvbid0IGRvIGFuIHVubGluayBoZXJlICovCisJCQl1c2JkdXhfYW9fc3RvcCh0aGlzX3VzYmR1eHN1YiwgMCk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBpbnQgdXNiZHV4c3ViX3N0YXJ0KHN0cnVjdCB1c2JkdXhzdWIgKnVzYmR1eHN1YikKK3sKKwlpbnQgZXJyY29kZSA9IDA7CisJdWludDhfdCBsb2NhbF90cmFuc2Zlcl9idWZmZXJbMTZdOworCisJaWYgKHVzYmR1eHN1Yi0+cHJvYmVkKSB7CisJCS8qIDdmOTIgdG8gemVybyAqLworCQlsb2NhbF90cmFuc2Zlcl9idWZmZXJbMF0gPSAwOworCQllcnJjb2RlID0gdXNiX2NvbnRyb2xfbXNnKHVzYmR1eHN1Yi0+dXNiZGV2LAorCQkJLyogY3JlYXRlIGEgcGlwZSBmb3IgYSBjb250cm9sIHRyYW5zZmVyICovCisJCQl1c2Jfc25kY3RybHBpcGUodXNiZHV4c3ViLT51c2JkZXYsIDApLAorCQkJLyogYlJlcXVlc3QsICJGaXJtd2FyZSIgKi8KKwkJCVVTQkRVWFNVQl9GSVJNV0FSRSwKKwkJCS8qIGJtUmVxdWVzdFR5cGUgKi8KKwkJCVZFTkRPUl9ESVJfT1VULAorCQkJLyogVmFsdWUgKi8KKwkJCVVTQkRVWFNVQl9DUFVDUywKKwkJCS8qIEluZGV4ICovCisJCQkweDAwMDAsCisJCQkvKiBhZGRyZXNzIG9mIHRoZSB0cmFuc2ZlciBidWZmZXIgKi8KKwkJCWxvY2FsX3RyYW5zZmVyX2J1ZmZlciwKKwkJCS8qIExlbmd0aCAqLworCQkJMSwKKwkJCS8qIFRpbWVvdXQgKi8KKwkJCUVaVElNRU9VVCk7CisJCWlmIChlcnJjb2RlIDwgMCkgeworCQkJZGV2X2VycigmdXNiZHV4c3ViLT5pbnRlcmZhY2UtPmRldiwKKwkJCQkiY29tZWRpXzogY29udHJvbCBtc2cgZmFpbGVkIChzdGFydClcbiIpOworCQkJcmV0dXJuIGVycmNvZGU7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdXNiZHV4c3ViX3N0b3Aoc3RydWN0IHVzYmR1eHN1YiAqdXNiZHV4c3ViKQoreworCWludCBlcnJjb2RlID0gMDsKKworCXVpbnQ4X3QgbG9jYWxfdHJhbnNmZXJfYnVmZmVyWzE2XTsKKwlpZiAodXNiZHV4c3ViLT5wcm9iZWQpIHsKKwkJLyogN2Y5MiB0byBvbmUgKi8KKwkJbG9jYWxfdHJhbnNmZXJfYnVmZmVyWzBdID0gMTsKKwkJZXJyY29kZSA9IHVzYl9jb250cm9sX21zZyh1c2JkdXhzdWItPnVzYmRldiwKKwkJCXVzYl9zbmRjdHJscGlwZSh1c2JkdXhzdWItPnVzYmRldiwgMCksCisJCQkvKiBiUmVxdWVzdCwgIkZpcm13YXJlIiAqLworCQkJVVNCRFVYU1VCX0ZJUk1XQVJFLAorCQkJLyogYm1SZXF1ZXN0VHlwZSAqLworCQkJVkVORE9SX0RJUl9PVVQsCisJCQkvKiBWYWx1ZSAqLworCQkJVVNCRFVYU1VCX0NQVUNTLAorCQkJLyogSW5kZXggKi8KKwkJCTB4MDAwMCwgbG9jYWxfdHJhbnNmZXJfYnVmZmVyLAorCQkJLyogTGVuZ3RoICovCisJCQkxLAorCQkJLyogVGltZW91dCAqLworCQkJRVpUSU1FT1VUKTsKKwkJaWYgKGVycmNvZGUgPCAwKSB7CisJCQlkZXZfZXJyKCZ1c2JkdXhzdWItPmludGVyZmFjZS0+ZGV2LAorCQkJCSJjb21lZGlfOiBjb250cm9sIG1zZyBmYWlsZWQgKHN0b3ApXG4iKTsKKwkJCXJldHVybiBlcnJjb2RlOworCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHVzYmR1eHN1Yl91cGxvYWQoc3RydWN0IHVzYmR1eHN1YiAqdXNiZHV4c3ViLAorCQkJICAgIHVpbnQ4X3QgKmxvY2FsX3RyYW5zZmVyX2J1ZmZlciwKKwkJCSAgICB1bnNpZ25lZCBpbnQgc3RhcnRBZGRyLCB1bnNpZ25lZCBpbnQgbGVuKQoreworCWludCBlcnJjb2RlOworCisJaWYgKHVzYmR1eHN1Yi0+cHJvYmVkKSB7CisJCWRldl9kYmcoJnVzYmR1eHN1Yi0+aW50ZXJmYWNlLT5kZXYsCisJCQkiY29tZWRpJWQ6IHVzYmR1eDogdXBsb2FkaW5nICVkIGJ5dGVzIgorCQkJIiB0byBhZGRyICVkLCBmaXJzdCBieXRlPSVkLlxuIiwKKwkJCXVzYmR1eHN1Yi0+Y29tZWRpZGV2LT5taW5vciwgbGVuLAorCQkJc3RhcnRBZGRyLCBsb2NhbF90cmFuc2Zlcl9idWZmZXJbMF0pOworCQllcnJjb2RlID0gdXNiX2NvbnRyb2xfbXNnKHVzYmR1eHN1Yi0+dXNiZGV2LAorCQkJdXNiX3NuZGN0cmxwaXBlKHVzYmR1eHN1Yi0+dXNiZGV2LCAwKSwKKwkJCS8qIGJyZXF1ZXN0LCBmaXJtd2FyZSAqLworCQkJVVNCRFVYU1VCX0ZJUk1XQVJFLAorCQkJLyogYm1SZXF1ZXN0VHlwZSAqLworCQkJVkVORE9SX0RJUl9PVVQsCisJCQkvKiB2YWx1ZSAqLworCQkJc3RhcnRBZGRyLAorCQkJLyogaW5kZXggKi8KKwkJCTB4MDAwMCwKKwkJCS8qIG91ciBsb2NhbCBzYWZlIGJ1ZmZlciAqLworCQkJbG9jYWxfdHJhbnNmZXJfYnVmZmVyLAorCQkJLyogbGVuZ3RoICovCisJCQlsZW4sCisJCQkvKiB0aW1lb3V0ICovCisJCQlFWlRJTUVPVVQpOworCQlkZXZfZGJnKCZ1c2JkdXhzdWItPmludGVyZmFjZS0+ZGV2LAorCQkJImNvbWVkaV86IHJlc3VsdD0lZFxuIiwgZXJyY29kZSk7CisJCWlmIChlcnJjb2RlIDwgMCkgeworCQkJZGV2X2VycigmdXNiZHV4c3ViLT5pbnRlcmZhY2UtPmRldiwKKwkJCQkiY29tZWRpXzogdXBsb2FkIGZhaWxlZFxuIik7CisJCQlyZXR1cm4gZXJyY29kZTsKKwkJfQorCX0gZWxzZSB7CisJCS8qIG5vIGRldmljZSBvbiB0aGUgYnVzIGZvciB0aGlzIGluZGV4ICovCisJCXJldHVybiAtRUZBVUxUOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmaXJtd2FyZVVwbG9hZChzdHJ1Y3QgdXNiZHV4c3ViICp1c2JkdXhzdWIsIHVpbnQ4X3QgKmZpcm13YXJlQmluYXJ5LAorCQkJICBpbnQgc2l6ZUZpcm13YXJlKQoreworCWludCByZXQ7CisKKwlpZiAoIWZpcm13YXJlQmluYXJ5KQorCQlyZXR1cm4gMDsKKworCXJldCA9IHVzYmR1eHN1Yl9zdG9wKHVzYmR1eHN1Yik7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycigmdXNiZHV4c3ViLT5pbnRlcmZhY2UtPmRldiwKKwkJCSJjb21lZGlfOiBjYW4gbm90IHN0b3AgZmlybXdhcmVcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKwlyZXQgPSB1c2JkdXhzdWJfdXBsb2FkKHVzYmR1eHN1YiwgZmlybXdhcmVCaW5hcnksIDAsIHNpemVGaXJtd2FyZSk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycigmdXNiZHV4c3ViLT5pbnRlcmZhY2UtPmRldiwKKwkJCSJjb21lZGlfOiBmaXJtd2FyZSB1cGxvYWQgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJcmV0ID0gdXNiZHV4c3ViX3N0YXJ0KHVzYmR1eHN1Yik7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycigmdXNiZHV4c3ViLT5pbnRlcmZhY2UtPmRldiwKKwkJCSJjb21lZGlfOiBjYW4gbm90IHN0YXJ0IGZpcm13YXJlXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdXNiZHV4c3ViX3N1Ym1pdF9JblVSQnMoc3RydWN0IHVzYmR1eHN1YiAqdXNiZHV4c3ViKQoreworCWludCBpLCBlcnJGbGFnOworCisJaWYgKCF1c2JkdXhzdWIpCisJCXJldHVybiAtRUZBVUxUOworCisJLyogU3VibWl0IGFsbCBVUkJzIGFuZCBzdGFydCB0aGUgdHJhbnNmZXIgb24gdGhlIGJ1cyAqLworCWZvciAoaSA9IDA7IGkgPCB1c2JkdXhzdWItPm51bU9mSW5CdWZmZXJzOyBpKyspIHsKKwkJLyogaW4gY2FzZSBvZiBhIHJlc3VibWlzc2lvbiBhZnRlciBhbiB1bmxpbmsuLi4gKi8KKwkJdXNiZHV4c3ViLT51cmJJbltpXS0+aW50ZXJ2YWwgPSB1c2JkdXhzdWItPmFpX2ludGVydmFsOworCQl1c2JkdXhzdWItPnVyYkluW2ldLT5jb250ZXh0ID0gdXNiZHV4c3ViLT5jb21lZGlkZXY7CisJCXVzYmR1eHN1Yi0+dXJiSW5baV0tPmRldiA9IHVzYmR1eHN1Yi0+dXNiZGV2OworCQl1c2JkdXhzdWItPnVyYkluW2ldLT5zdGF0dXMgPSAwOworCQl1c2JkdXhzdWItPnVyYkluW2ldLT50cmFuc2Zlcl9mbGFncyA9IFVSQl9JU09fQVNBUDsKKwkJZGV2X2RiZygmdXNiZHV4c3ViLT5pbnRlcmZhY2UtPmRldiwKKwkJCSJjb21lZGklZDogc3VibWl0dGluZyBpbi11cmJbJWRdOiAlcCwlcCBpbnR2PSVkXG4iLAorCQkJdXNiZHV4c3ViLT5jb21lZGlkZXYtPm1pbm9yLCBpLAorCQkJKHVzYmR1eHN1Yi0+dXJiSW5baV0tPmNvbnRleHQpLAorCQkJKHVzYmR1eHN1Yi0+dXJiSW5baV0tPmRldiksCisJCQkodXNiZHV4c3ViLT51cmJJbltpXS0+aW50ZXJ2YWwpKTsKKwkJZXJyRmxhZyA9IHVzYl9zdWJtaXRfdXJiKHVzYmR1eHN1Yi0+dXJiSW5baV0sIEdGUF9BVE9NSUMpOworCQlpZiAoZXJyRmxhZykgeworCQkJZGV2X2VycigmdXNiZHV4c3ViLT5pbnRlcmZhY2UtPmRldiwKKwkJCQkiY29tZWRpXzogYWk6IHVzYl9zdWJtaXRfdXJiKCVkKSBlcnJvciAlZFxuIiwKKwkJCQlpLCBlcnJGbGFnKTsKKwkJCXJldHVybiBlcnJGbGFnOworCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHVzYmR1eHN1Yl9zdWJtaXRfT3V0VVJCcyhzdHJ1Y3QgdXNiZHV4c3ViICp1c2JkdXhzdWIpCit7CisJaW50IGksIGVyckZsYWc7CisKKwlpZiAoIXVzYmR1eHN1YikKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgdXNiZHV4c3ViLT5udW1PZk91dEJ1ZmZlcnM7IGkrKykgeworCQlkZXZfZGJnKCZ1c2JkdXhzdWItPmludGVyZmFjZS0+ZGV2LAorCQkJImNvbWVkaV86IHN1Ym1pdHRpbmcgb3V0LXVyYlslZF1cbiIsIGkpOworCQkvKiBpbiBjYXNlIG9mIGEgcmVzdWJtaXNzaW9uIGFmdGVyIGFuIHVubGluay4uLiAqLworCQl1c2JkdXhzdWItPnVyYk91dFtpXS0+Y29udGV4dCA9IHVzYmR1eHN1Yi0+Y29tZWRpZGV2OworCQl1c2JkdXhzdWItPnVyYk91dFtpXS0+ZGV2ID0gdXNiZHV4c3ViLT51c2JkZXY7CisJCXVzYmR1eHN1Yi0+dXJiT3V0W2ldLT5zdGF0dXMgPSAwOworCQl1c2JkdXhzdWItPnVyYk91dFtpXS0+dHJhbnNmZXJfZmxhZ3MgPSBVUkJfSVNPX0FTQVA7CisJCWVyckZsYWcgPSB1c2Jfc3VibWl0X3VyYih1c2JkdXhzdWItPnVyYk91dFtpXSwgR0ZQX0FUT01JQyk7CisJCWlmIChlcnJGbGFnKSB7CisJCQlkZXZfZXJyKCZ1c2JkdXhzdWItPmludGVyZmFjZS0+ZGV2LAorCQkJCSJjb21lZGlfOiBhbzogdXNiX3N1Ym1pdF91cmIoJWQpIGVycm9yICVkXG4iLAorCQkJCWksIGVyckZsYWcpOworCQkJcmV0dXJuIGVyckZsYWc7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdXNiZHV4X2FpX2NtZHRlc3QoY29tZWRpX2RldmljZSAqZGV2LCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJICAgICBjb21lZGlfY21kICpjbWQpCit7CisJaW50IGVyciA9IDAsIHRtcCwgaTsKKwl1bnNpZ25lZCBpbnQgdG1wVGltZXI7CisJc3RydWN0IHVzYmR1eHN1YiAqdGhpc191c2JkdXhzdWIgPSBkZXYtPnByaXZhdGU7CisKKwlpZiAoISh0aGlzX3VzYmR1eHN1Yi0+cHJvYmVkKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlkZXZfZGJnKCZ0aGlzX3VzYmR1eHN1Yi0+aW50ZXJmYWNlLT5kZXYsCisJCSJjb21lZGklZDogdXNiZHV4X2FpX2NtZHRlc3RcbiIsIGRldi0+bWlub3IpOworCisJLyogbWFrZSBzdXJlIHRyaWdnZXJzIGFyZSB2YWxpZCAqLworCS8qIE9ubHkgaW1tZWRpYXRlIHRyaWdnZXJzIGFyZSBhbGxvd2VkICovCisJdG1wID0gY21kLT5zdGFydF9zcmM7CisJY21kLT5zdGFydF9zcmMgJj0gVFJJR19OT1cgfCBUUklHX0lOVDsKKwlpZiAoIWNtZC0+c3RhcnRfc3JjIHx8IHRtcCAhPSBjbWQtPnN0YXJ0X3NyYykKKwkJZXJyKys7CisKKwkvKiB0cmlnZ2VyIHNob3VsZCBoYXBwZW4gdGltZWQgKi8KKwl0bXAgPSBjbWQtPnNjYW5fYmVnaW5fc3JjOworCS8qIHN0YXJ0IGEgbmV3IF9zY2FuXyB3aXRoIGEgdGltZXIgKi8KKwljbWQtPnNjYW5fYmVnaW5fc3JjICY9IFRSSUdfVElNRVI7CisJaWYgKCFjbWQtPnNjYW5fYmVnaW5fc3JjIHx8IHRtcCAhPSBjbWQtPnNjYW5fYmVnaW5fc3JjKQorCQllcnIrKzsKKworCS8qIHNjYW5uaW5nIGlzIGNvbnRpbm91cyAqLworCXRtcCA9IGNtZC0+Y29udmVydF9zcmM7CisJY21kLT5jb252ZXJ0X3NyYyAmPSBUUklHX05PVzsKKwlpZiAoIWNtZC0+Y29udmVydF9zcmMgfHwgdG1wICE9IGNtZC0+Y29udmVydF9zcmMpCisJCWVycisrOworCisJLyogaXNzdWUgYSB0cmlnZ2VyIHdoZW4gc2NhbiBpcyBmaW5pc2hlZCBhbmQgc3RhcnQgYSBuZXcgc2NhbiAqLworCXRtcCA9IGNtZC0+c2Nhbl9lbmRfc3JjOworCWNtZC0+c2Nhbl9lbmRfc3JjICY9IFRSSUdfQ09VTlQ7CisJaWYgKCFjbWQtPnNjYW5fZW5kX3NyYyB8fCB0bXAgIT0gY21kLT5zY2FuX2VuZF9zcmMpCisJCWVycisrOworCisJLyogdHJpZ2dlciBhdCB0aGUgZW5kIG9mIGNvdW50IGV2ZW50cyBvciBub3QsIHN0b3AgY29uZGl0aW9uIG9yIG5vdCAqLworCXRtcCA9IGNtZC0+c3RvcF9zcmM7CisJY21kLT5zdG9wX3NyYyAmPSBUUklHX0NPVU5UIHwgVFJJR19OT05FOworCWlmICghY21kLT5zdG9wX3NyYyB8fCB0bXAgIT0gY21kLT5zdG9wX3NyYykKKwkJZXJyKys7CisKKwlpZiAoZXJyKQorCQlyZXR1cm4gMTsKKworCS8qCisJICogc3RlcCAyOiBtYWtlIHN1cmUgdHJpZ2dlciBzb3VyY2VzIGFyZSB1bmlxdWUgYW5kIG11dHVhbGx5IGNvbXBhdGlibGUKKwkgKiBub3RlIHRoYXQgbXV0dWFsIGNvbXBhdGlibGl0eSBpcyBub3QgYW4gaXNzdWUgaGVyZQorCSAqLworCWlmIChjbWQtPnNjYW5fYmVnaW5fc3JjICE9IFRSSUdfRk9MTE9XICYmCisJCWNtZC0+c2Nhbl9iZWdpbl9zcmMgIT0gVFJJR19FWFQgJiYKKwkJY21kLT5zY2FuX2JlZ2luX3NyYyAhPSBUUklHX1RJTUVSKQorCQllcnIrKzsKKwlpZiAoY21kLT5zdG9wX3NyYyAhPSBUUklHX0NPVU5UICYmIGNtZC0+c3RvcF9zcmMgIT0gVFJJR19OT05FKQorCQllcnIrKzsKKworCWlmIChlcnIpCisJCXJldHVybiAyOworCisJLyogc3RlcCAzOiBtYWtlIHN1cmUgYXJndW1lbnRzIGFyZSB0cml2aWFsbHkgY29tcGF0aWJsZSAqLworCWlmIChjbWQtPnN0YXJ0X2FyZyAhPSAwKSB7CisJCWNtZC0+c3RhcnRfYXJnID0gMDsKKwkJZXJyKys7CisJfQorCisJaWYgKGNtZC0+c2Nhbl9iZWdpbl9zcmMgPT0gVFJJR19GT0xMT1cpIHsKKwkJLyogaW50ZXJuYWwgdHJpZ2dlciAqLworCQlpZiAoY21kLT5zY2FuX2JlZ2luX2FyZyAhPSAwKSB7CisJCQljbWQtPnNjYW5fYmVnaW5fYXJnID0gMDsKKwkJCWVycisrOworCQl9CisJfQorCisJaWYgKGNtZC0+c2Nhbl9iZWdpbl9zcmMgPT0gVFJJR19USU1FUikgeworCQlpZiAodGhpc191c2JkdXhzdWItPmhpZ2hfc3BlZWQpIHsKKwkJCS8qCisJCQkgKiBJbiBoaWdoIHNwZWVkIG1vZGUgbWljcm9mcmFtZXMgYXJlIHBvc3NpYmxlLgorCQkJICogSG93ZXZlciwgZHVyaW5nIG9uZSBtaWNyb2ZyYW1lIHdlIGNhbiByb3VnaGx5CisJCQkgKiBzYW1wbGUgb25lIGNoYW5uZWwuIFRodXMsIHRoZSBtb3JlIGNoYW5uZWxzCisJCQkgKiBhcmUgaW4gdGhlIGNoYW5uZWwgbGlzdCB0aGUgbW9yZSB0aW1lIHdlIG5lZWQuCisJCQkgKi8KKwkJCWkgPSAxOworCQkJLyogZmluZCBhIHBvd2VyIG9mIDIgZm9yIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMgKi8KKwkJCXdoaWxlIChpIDwgKGNtZC0+Y2hhbmxpc3RfbGVuKSkKKwkJCQlpID0gaSAqIDI7CisKKwkJCWlmIChjbWQtPnNjYW5fYmVnaW5fYXJnIDwgKDEwMDAwMDAgLyA4ICogaSkpIHsKKwkJCQljbWQtPnNjYW5fYmVnaW5fYXJnID0gMTAwMDAwMCAvIDggKiBpOworCQkJCWVycisrOworCQkJfQorCQkJLyogbm93IGNhbGMgdGhlIHJlYWwgc2FtcGxpbmcgcmF0ZSB3aXRoIGFsbCB0aGUKKwkJCSAqIHJvdW5kaW5nIGVycm9ycyAqLworCQkJdG1wVGltZXIgPQorCQkJCSgodW5zaWduZWQgaW50KShjbWQtPnNjYW5fYmVnaW5fYXJnIC8gMTI1MDAwKSkgKgorCQkJCTEyNTAwMDsKKwkJCWlmIChjbWQtPnNjYW5fYmVnaW5fYXJnICE9IHRtcFRpbWVyKSB7CisJCQkJY21kLT5zY2FuX2JlZ2luX2FyZyA9IHRtcFRpbWVyOworCQkJCWVycisrOworCQkJfQorCQl9IGVsc2UgeworCQkJLyogZnVsbCBzcGVlZCAqLworCQkJLyogMWtIeiBzY2FucyBldmVyeSBVU0IgZnJhbWUgKi8KKwkJCWlmIChjbWQtPnNjYW5fYmVnaW5fYXJnIDwgMTAwMDAwMCkgeworCQkJCWNtZC0+c2Nhbl9iZWdpbl9hcmcgPSAxMDAwMDAwOworCQkJCWVycisrOworCQkJfQorCQkJLyoKKwkJCSAqIGNhbGMgdGhlIHJlYWwgc2FtcGxpbmcgcmF0ZSB3aXRoIHRoZSByb3VuZGluZyBlcnJvcnMKKwkJCSAqLworCQkJdG1wVGltZXIgPSAoKHVuc2lnbmVkIGludCkoY21kLT5zY2FuX2JlZ2luX2FyZyAvCisJCQkJCTEwMDAwMDApKSAqIDEwMDAwMDA7CisJCQlpZiAoY21kLT5zY2FuX2JlZ2luX2FyZyAhPSB0bXBUaW1lcikgeworCQkJCWNtZC0+c2Nhbl9iZWdpbl9hcmcgPSB0bXBUaW1lcjsKKwkJCQllcnIrKzsKKwkJCX0KKwkJfQorCX0KKwkvKiB0aGUgc2FtZSBhcmd1bWVudCAqLworCWlmIChjbWQtPnNjYW5fZW5kX2FyZyAhPSBjbWQtPmNoYW5saXN0X2xlbikgeworCQljbWQtPnNjYW5fZW5kX2FyZyA9IGNtZC0+Y2hhbmxpc3RfbGVuOworCQllcnIrKzsKKwl9CisKKwlpZiAoY21kLT5zdG9wX3NyYyA9PSBUUklHX0NPVU5UKSB7CisJCS8qIGFueSBjb3VudCBpcyBhbGxvd2VkICovCisJfSBlbHNlIHsKKwkJLyogVFJJR19OT05FICovCisJCWlmIChjbWQtPnN0b3BfYXJnICE9IDApIHsKKwkJCWNtZC0+c3RvcF9hcmcgPSAwOworCQkJZXJyKys7CisJCX0KKwl9CisKKwlpZiAoZXJyKQorCQlyZXR1cm4gMzsKKworCXJldHVybiAwOworfQorCisvKgorICogY3JlYXRlcyB0aGUgQURDIGNvbW1hbmQgZm9yIHRoZSBNQVgxMjcxCisgKiByYW5nZSBpcyB0aGUgcmFuZ2UgdmFsdWUgZnJvbSBjb21lZGkKKyAqLworc3RhdGljIGludDhfdCBjcmVhdGVfYWRjX2NvbW1hbmQodW5zaWduZWQgaW50IGNoYW4sIGludCByYW5nZSkKK3sKKwlpbnQ4X3QgcCA9IChyYW5nZSA8PSAxKTsKKwlpbnQ4X3QgciA9ICgocmFuZ2UgJSAyKSA9PSAwKTsKKwlyZXR1cm4gKGNoYW4gPDwgNCkgfCAoKHAgPT0gMSkgPDwgMikgfCAoKHIgPT0gMSkgPDwgMyk7Cit9CisKKy8qIGJ1bGsgdHJhbnNmZXJzIHRvIHVzYmR1eCAqLworCisjZGVmaW5lIFNFTkRBRENPTU1BTkRTICAgICAgICAgICAgMAorI2RlZmluZSBTRU5EREFDT01NQU5EUyAgICAgICAgICAgIDEKKyNkZWZpbmUgU0VORERJT0NPTkZJR0NPTU1BTkQgICAgICAyCisjZGVmaW5lIFNFTkRESU9CSVRTQ09NTUFORCAgICAgICAgMworI2RlZmluZSBTRU5EU0lOR0xFQUQgICAgICAgICAgICAgIDQKKyNkZWZpbmUgUkVBRENPVU5URVJDT01NQU5EICAgICAgICA1CisjZGVmaW5lIFdSSVRFQ09VTlRFUkNPTU1BTkQgICAgICAgNgorI2RlZmluZSBTRU5EUFdNT04gICAgICAgICAgICAgICAgIDcKKyNkZWZpbmUgU0VORFBXTU9GRiAgICAgICAgICAgICAgICA4CisKK3N0YXRpYyBpbnQgc2VuZF9kdXhfY29tbWFuZHMoc3RydWN0IHVzYmR1eHN1YiAqdGhpc191c2JkdXhzdWIsIGludCBjbWRfdHlwZSkKK3sKKwlpbnQgcmVzdWx0LCBuc2VudDsKKworCXRoaXNfdXNiZHV4c3ViLT5kdXhfY29tbWFuZHNbMF0gPSBjbWRfdHlwZTsKKyNpZmRlZiBOT0lTWV9EVVhfREVCVUdCVUcKKwlwcmludGsoS0VSTl9ERUJVRyAiY29tZWRpJWQ6IHVzYmR1eDogZHV4X2NvbW1hbmRzOiAiLAorCQl0aGlzX3VzYmR1eHN1Yi0+Y29tZWRpZGV2LT5taW5vcik7CisJZm9yIChyZXN1bHQgPSAwOyByZXN1bHQgPCBTSVpFT0ZEVVhCVUZGRVI7IHJlc3VsdCsrKQorCQlwcmludGsoIiAlMDJ4IiwgdGhpc191c2JkdXhzdWItPmR1eF9jb21tYW5kc1tyZXN1bHRdKTsKKwlwcmludGsoIlxuIik7CisjZW5kaWYKKwlyZXN1bHQgPSB1c2JfYnVsa19tc2codGhpc191c2JkdXhzdWItPnVzYmRldiwKKwkJCSAgICAgIHVzYl9zbmRidWxrcGlwZSh0aGlzX3VzYmR1eHN1Yi0+dXNiZGV2LAorCQkJCQkgICAgICBDT01NQU5EX09VVF9FUCksCisJCQkgICAgICB0aGlzX3VzYmR1eHN1Yi0+ZHV4X2NvbW1hbmRzLCBTSVpFT0ZEVVhCVUZGRVIsCisJCQkgICAgICAmbnNlbnQsIDEwKTsKKwlpZiAocmVzdWx0IDwgMCkKKwkJZGV2X2VycigmdGhpc191c2JkdXhzdWItPmludGVyZmFjZS0+ZGV2LCAiY29tZWRpJWQ6ICIKKwkJCSJjb3VsZCBub3QgdHJhbnNtaXQgZHV4X2NvbW1hbmQgdG8gdGhlIHVzYi1kZXZpY2UsICIKKwkJCSJlcnI9JWRcbiIsIHRoaXNfdXNiZHV4c3ViLT5jb21lZGlkZXYtPm1pbm9yLCByZXN1bHQpOworCisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGludCByZWNlaXZlX2R1eF9jb21tYW5kcyhzdHJ1Y3QgdXNiZHV4c3ViICp0aGlzX3VzYmR1eHN1YiwgaW50IGNvbW1hbmQpCit7CisJaW50IHJlc3VsdCA9ICgtRUZBVUxUKTsKKwlpbnQgbnJlYzsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBSRVRSSUVTOyBpKyspIHsKKwkJcmVzdWx0ID0gdXNiX2J1bGtfbXNnKHRoaXNfdXNiZHV4c3ViLT51c2JkZXYsCisJCQkJICAgICAgdXNiX3JjdmJ1bGtwaXBlKHRoaXNfdXNiZHV4c3ViLT51c2JkZXYsCisJCQkJCQkgICAgICBDT01NQU5EX0lOX0VQKSwKKwkJCQkgICAgICB0aGlzX3VzYmR1eHN1Yi0+aW5zbkJ1ZmZlciwgU0laRUlOU05CVUYsCisJCQkJICAgICAgJm5yZWMsIDEpOworCQlpZiAocmVzdWx0IDwgMCkgeworCQkJZGV2X2VycigmdGhpc191c2JkdXhzdWItPmludGVyZmFjZS0+ZGV2LCAiY29tZWRpJWQ6ICIKKwkJCQkiaW5zbjogVVNCIGVycm9yICVkIHdoaWxlIHJlY2VpdmluZyBEVVggY29tbWFuZCIKKwkJCQkiXG4iLCB0aGlzX3VzYmR1eHN1Yi0+Y29tZWRpZGV2LT5taW5vciwgcmVzdWx0KTsKKwkJCXJldHVybiByZXN1bHQ7CisJCX0KKwkJaWYgKGxlMTZfdG9fY3B1KHRoaXNfdXNiZHV4c3ViLT5pbnNuQnVmZmVyWzBdKSA9PSBjb21tYW5kKQorCQkJcmV0dXJuIHJlc3VsdDsKKwl9CisJLyogdGhpcyBpcyBvbmx5IHJlYWNoZWQgaWYgdGhlIGRhdGEgaGFzIGJlZW4gcmVxdWVzdGVkIGEgY291cGxlIG9mCisJICogdGltZXMgKi8KKwlkZXZfZXJyKCZ0aGlzX3VzYmR1eHN1Yi0+aW50ZXJmYWNlLT5kZXYsICJjb21lZGklZDogaW5zbjogIgorCQkid3JvbmcgZGF0YSByZXR1cm5lZCBmcm9tIGZpcm13YXJlOiB3YW50IGNtZCAlZCwgZ290IGNtZCAlZC5cbiIsCisJCXRoaXNfdXNiZHV4c3ViLT5jb21lZGlkZXYtPm1pbm9yLCBjb21tYW5kLAorCQlsZTE2X3RvX2NwdSh0aGlzX3VzYmR1eHN1Yi0+aW5zbkJ1ZmZlclswXSkpOworCXJldHVybiAtRUZBVUxUOworfQorCitzdGF0aWMgaW50IHVzYmR1eF9haV9pbnR0cmlnKGNvbWVkaV9kZXZpY2UgKmRldiwgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCSAgICAgdW5zaWduZWQgaW50IHRyaWdudW0pCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgdXNiZHV4c3ViICp0aGlzX3VzYmR1eHN1YiA9IGRldi0+cHJpdmF0ZTsKKwlpZiAoIXRoaXNfdXNiZHV4c3ViKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWRvd24oJnRoaXNfdXNiZHV4c3ViLT5zZW0pOworCWlmICghKHRoaXNfdXNiZHV4c3ViLT5wcm9iZWQpKSB7CisJCXVwKCZ0aGlzX3VzYmR1eHN1Yi0+c2VtKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCWRldl9kYmcoJnRoaXNfdXNiZHV4c3ViLT5pbnRlcmZhY2UtPmRldiwKKwkJImNvbWVkaSVkOiB1c2JkdXhfYWlfaW50dHJpZ1xuIiwgZGV2LT5taW5vcik7CisKKwlpZiAodHJpZ251bSAhPSAwKSB7CisJCWRldl9lcnIoJnRoaXNfdXNiZHV4c3ViLT5pbnRlcmZhY2UtPmRldiwKKwkJCSJjb21lZGklZDogdXNiZHV4X2FpX2ludHRyaWc6IGludmFsaWQgdHJpZ251bVxuIiwKKwkJCWRldi0+bWlub3IpOworCQl1cCgmdGhpc191c2JkdXhzdWItPnNlbSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAoISh0aGlzX3VzYmR1eHN1Yi0+YWlfY21kX3J1bm5pbmcpKSB7CisJCXRoaXNfdXNiZHV4c3ViLT5haV9jbWRfcnVubmluZyA9IDE7CisJCXJldCA9IHVzYmR1eHN1Yl9zdWJtaXRfSW5VUkJzKHRoaXNfdXNiZHV4c3ViKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWRldl9lcnIoJnRoaXNfdXNiZHV4c3ViLT5pbnRlcmZhY2UtPmRldiwKKwkJCQkiY29tZWRpJWQ6IHVzYmR1eF9haV9pbnR0cmlnOiAiCisJCQkJInVyYlN1Ym1pdDogZXJyPSVkXG4iLCBkZXYtPm1pbm9yLCByZXQpOworCQkJdGhpc191c2JkdXhzdWItPmFpX2NtZF9ydW5uaW5nID0gMDsKKwkJCXVwKCZ0aGlzX3VzYmR1eHN1Yi0+c2VtKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwkJcy0+YXN5bmMtPmludHRyaWcgPSBOVUxMOworCX0gZWxzZSB7CisJCWRldl9lcnIoJnRoaXNfdXNiZHV4c3ViLT5pbnRlcmZhY2UtPmRldiwKKwkJCSJjb21lZGklZDogYWlfaW50dHJpZyBidXQgYWNxdSBpcyBhbHJlYWR5IHJ1bm5pbmdcbiIsCisJCQlkZXYtPm1pbm9yKTsKKwl9CisJdXAoJnRoaXNfdXNiZHV4c3ViLT5zZW0pOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IHVzYmR1eF9haV9jbWQoY29tZWRpX2RldmljZSAqZGV2LCBjb21lZGlfc3ViZGV2aWNlICpzKQoreworCWNvbWVkaV9jbWQgKmNtZCA9ICZzLT5hc3luYy0+Y21kOworCXVuc2lnbmVkIGludCBjaGFuLCByYW5nZTsKKwlpbnQgaSwgcmV0OworCXN0cnVjdCB1c2JkdXhzdWIgKnRoaXNfdXNiZHV4c3ViID0gZGV2LT5wcml2YXRlOworCWludCByZXN1bHQ7CisKKwlpZiAoIXRoaXNfdXNiZHV4c3ViKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWRldl9kYmcoJnRoaXNfdXNiZHV4c3ViLT5pbnRlcmZhY2UtPmRldiwKKwkJImNvbWVkaSVkOiB1c2JkdXhfYWlfY21kXG4iLCBkZXYtPm1pbm9yKTsKKworCS8qIGJsb2NrIG90aGVyIENQVXMgZnJvbSBzdGFydGluZyBhbiBhaV9jbWQgKi8KKwlkb3duKCZ0aGlzX3VzYmR1eHN1Yi0+c2VtKTsKKworCWlmICghKHRoaXNfdXNiZHV4c3ViLT5wcm9iZWQpKSB7CisJCXVwKCZ0aGlzX3VzYmR1eHN1Yi0+c2VtKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCWlmICh0aGlzX3VzYmR1eHN1Yi0+YWlfY21kX3J1bm5pbmcpIHsKKwkJZGV2X2VycigmdGhpc191c2JkdXhzdWItPmludGVyZmFjZS0+ZGV2LCAiY29tZWRpJWQ6ICIKKwkJCSJhaV9jbWQgbm90IHBvc3NpYmxlLiBBbm90aGVyIGFpX2NtZCBpcyBydW5uaW5nLlxuIiwKKwkJCWRldi0+bWlub3IpOworCQl1cCgmdGhpc191c2JkdXhzdWItPnNlbSk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCS8qIHNldCBjdXJyZW50IGNoYW5uZWwgb2YgdGhlIHJ1bm5pbmcgYXF1aXNpdGlvbiB0byB6ZXJvICovCisJcy0+YXN5bmMtPmN1cl9jaGFuID0gMDsKKworCXRoaXNfdXNiZHV4c3ViLT5kdXhfY29tbWFuZHNbMV0gPSBjbWQtPmNoYW5saXN0X2xlbjsKKwlmb3IgKGkgPSAwOyBpIDwgY21kLT5jaGFubGlzdF9sZW47ICsraSkgeworCQljaGFuID0gQ1JfQ0hBTihjbWQtPmNoYW5saXN0W2ldKTsKKwkJcmFuZ2UgPSBDUl9SQU5HRShjbWQtPmNoYW5saXN0W2ldKTsKKwkJaWYgKGkgPj0gTlVNQ0hBTk5FTFMpIHsKKwkJCWRldl9lcnIoJnRoaXNfdXNiZHV4c3ViLT5pbnRlcmZhY2UtPmRldiwKKwkJCQkiY29tZWRpJWQ6IGNoYW5uZWwgbGlzdCB0b28gbG9uZ1xuIiwKKwkJCQlkZXYtPm1pbm9yKTsKKwkJCWJyZWFrOworCQl9CisJCXRoaXNfdXNiZHV4c3ViLT5kdXhfY29tbWFuZHNbaSArIDJdID0KKwkJCWNyZWF0ZV9hZGNfY29tbWFuZChjaGFuLCByYW5nZSk7CisJfQorCisJZGV2X2RiZygmdGhpc191c2JkdXhzdWItPmludGVyZmFjZS0+ZGV2LAorCQkiY29tZWRpICVkOiBzZW5kaW5nIGNvbW1hbmRzIHRvIHRoZSB1c2IgZGV2aWNlOiBzaXplPSV1XG4iLAorCQlkZXYtPm1pbm9yLCBOVU1DSEFOTkVMUyk7CisKKwlyZXN1bHQgPSBzZW5kX2R1eF9jb21tYW5kcyh0aGlzX3VzYmR1eHN1YiwgU0VOREFEQ09NTUFORFMpOworCWlmIChyZXN1bHQgPCAwKSB7CisJCXVwKCZ0aGlzX3VzYmR1eHN1Yi0+c2VtKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlpZiAodGhpc191c2JkdXhzdWItPmhpZ2hfc3BlZWQpIHsKKwkJLyoKKwkJICogZXZlcnkgY2hhbm5lbCBnZXRzIGEgdGltZSB3aW5kb3cgb2YgMTI1dXMuIFRodXMsIGlmIHdlCisJCSAqIHNhbXBsZSBhbGwgOCBjaGFubmVscyB3ZSBuZWVkIDFtcy4gSWYgd2Ugc2FtcGxlIG9ubHkgb25lCisJCSAqIGNoYW5uZWwgd2UgbmVlZCBvbmx5IDEyNXVzCisJCSAqLworCQl0aGlzX3VzYmR1eHN1Yi0+YWlfaW50ZXJ2YWwgPSAxOworCQkvKiBmaW5kIGEgcG93ZXIgb2YgMiBmb3IgdGhlIGludGVydmFsICovCisJCXdoaWxlICgodGhpc191c2JkdXhzdWItPmFpX2ludGVydmFsKSA8IChjbWQtPmNoYW5saXN0X2xlbikpIHsKKwkJCXRoaXNfdXNiZHV4c3ViLT5haV9pbnRlcnZhbCA9CisJCQkJKHRoaXNfdXNiZHV4c3ViLT5haV9pbnRlcnZhbCkgKiAyOworCQl9CisJCXRoaXNfdXNiZHV4c3ViLT5haV90aW1lciA9IGNtZC0+c2Nhbl9iZWdpbl9hcmcgLyAoMTI1MDAwICoKKwkJCSh0aGlzX3VzYmR1eHN1Yi0+YWlfaW50ZXJ2YWwpKTsKKwl9IGVsc2UgeworCQkvKiBpbnRlcnZhbCBhbHdheXMgMW1zICovCisJCXRoaXNfdXNiZHV4c3ViLT5haV9pbnRlcnZhbCA9IDE7CisJCXRoaXNfdXNiZHV4c3ViLT5haV90aW1lciA9IGNtZC0+c2Nhbl9iZWdpbl9hcmcgLyAxMDAwMDAwOworCX0KKwlpZiAodGhpc191c2JkdXhzdWItPmFpX3RpbWVyIDwgMSkgeworCQlkZXZfZXJyKCZ0aGlzX3VzYmR1eHN1Yi0+aW50ZXJmYWNlLT5kZXYsICJjb21lZGklZDogYWlfY21kOiAiCisJCQkidGltZXI9JWQsIHNjYW5fYmVnaW5fYXJnPSVkLiAiCisJCQkiTm90IHByb3Blcmx5IHRlc3RlZCBieSBjbWR0ZXN0P1xuIiwgZGV2LT5taW5vciwKKwkJCXRoaXNfdXNiZHV4c3ViLT5haV90aW1lciwgY21kLT5zY2FuX2JlZ2luX2FyZyk7CisJCXVwKCZ0aGlzX3VzYmR1eHN1Yi0+c2VtKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXRoaXNfdXNiZHV4c3ViLT5haV9jb3VudGVyID0gdGhpc191c2JkdXhzdWItPmFpX3RpbWVyOworCisJaWYgKGNtZC0+c3RvcF9zcmMgPT0gVFJJR19DT1VOVCkgeworCQkvKiBkYXRhIGFycml2ZXMgYXMgb25lIHBhY2tldCAqLworCQl0aGlzX3VzYmR1eHN1Yi0+YWlfc2FtcGxlX2NvdW50ID0gY21kLT5zdG9wX2FyZzsKKwkJdGhpc191c2JkdXhzdWItPmFpX2NvbnRpbm91cyA9IDA7CisJfSBlbHNlIHsKKwkJLyogY29udGlub3VzIGFxdWlzaXRpb24gKi8KKwkJdGhpc191c2JkdXhzdWItPmFpX2NvbnRpbm91cyA9IDE7CisJCXRoaXNfdXNiZHV4c3ViLT5haV9zYW1wbGVfY291bnQgPSAwOworCX0KKworCWlmIChjbWQtPnN0YXJ0X3NyYyA9PSBUUklHX05PVykgeworCQkvKiBlbmFibGUgdGhpcyBhY3F1aXNpdGlvbiBvcGVyYXRpb24gKi8KKwkJdGhpc191c2JkdXhzdWItPmFpX2NtZF9ydW5uaW5nID0gMTsKKwkJcmV0ID0gdXNiZHV4c3ViX3N1Ym1pdF9JblVSQnModGhpc191c2JkdXhzdWIpOworCQlpZiAocmV0IDwgMCkgeworCQkJdGhpc191c2JkdXhzdWItPmFpX2NtZF9ydW5uaW5nID0gMDsKKwkJCS8qIGZpeG1lOiB1bmxpbmsgaGVyZT8/ICovCisJCQl1cCgmdGhpc191c2JkdXhzdWItPnNlbSk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJCXMtPmFzeW5jLT5pbnR0cmlnID0gTlVMTDsKKwl9IGVsc2UgeworCQkvKiBUUklHX0lOVCAqLworCQkvKiBkb24ndCBlbmFibGUgdGhlIGFjcXVpc2lvbiBvcGVyYXRpb24gKi8KKwkJLyogd2FpdCBmb3IgYW4gaW50ZXJuYWwgc2lnbmFsICovCisJCXMtPmFzeW5jLT5pbnR0cmlnID0gdXNiZHV4X2FpX2ludHRyaWc7CisJfQorCXVwKCZ0aGlzX3VzYmR1eHN1Yi0+c2VtKTsKKwlyZXR1cm4gMDsKK30KKworLyogTW9kZSAwIGlzIHVzZWQgdG8gZ2V0IGEgc2luZ2xlIGNvbnZlcnNpb24gb24gZGVtYW5kICovCitzdGF0aWMgaW50IHVzYmR1eF9haV9pbnNuX3JlYWQoY29tZWRpX2RldmljZSAqZGV2LCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJICAgICAgIGNvbWVkaV9pbnNuICppbnNuLCBsc2FtcGxfdCAqZGF0YSkKK3sKKwlpbnQgaTsKKwlsc2FtcGxfdCBvbmUgPSAwOworCWludCBjaGFuLCByYW5nZTsKKwlpbnQgZXJyOworCXN0cnVjdCB1c2JkdXhzdWIgKnRoaXNfdXNiZHV4c3ViID0gZGV2LT5wcml2YXRlOworCisJaWYgKCF0aGlzX3VzYmR1eHN1YikKKwkJcmV0dXJuIDA7CisKKwlkZXZfZGJnKCZ0aGlzX3VzYmR1eHN1Yi0+aW50ZXJmYWNlLT5kZXYsCisJCSJjb21lZGklZDogYWlfaW5zbl9yZWFkLCBpbnNuLT5uPSVkLCBpbnNuLT5zdWJkZXY9JWRcbiIsCisJCWRldi0+bWlub3IsIGluc24tPm4sIGluc24tPnN1YmRldik7CisKKwlkb3duKCZ0aGlzX3VzYmR1eHN1Yi0+c2VtKTsKKwlpZiAoISh0aGlzX3VzYmR1eHN1Yi0+cHJvYmVkKSkgeworCQl1cCgmdGhpc191c2JkdXhzdWItPnNlbSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKwlpZiAodGhpc191c2JkdXhzdWItPmFpX2NtZF9ydW5uaW5nKSB7CisJCWRldl9lcnIoJnRoaXNfdXNiZHV4c3ViLT5pbnRlcmZhY2UtPmRldiwKKwkJCSJjb21lZGklZDogYWlfaW5zbl9yZWFkIG5vdCBwb3NzaWJsZS4gIgorCQkJIkFzeW5jIENvbW1hbmQgaXMgcnVubmluZy5cbiIsIGRldi0+bWlub3IpOworCQl1cCgmdGhpc191c2JkdXhzdWItPnNlbSk7CisJCXJldHVybiAwOworCX0KKworCS8qIHNhbXBsZSBvbmUgY2hhbm5lbCAqLworCWNoYW4gPSBDUl9DSEFOKGluc24tPmNoYW5zcGVjKTsKKwlyYW5nZSA9IENSX1JBTkdFKGluc24tPmNoYW5zcGVjKTsKKwkvKiBzZXQgY29tbWFuZCBmb3IgdGhlIGZpcnN0IGNoYW5uZWwgKi8KKwl0aGlzX3VzYmR1eHN1Yi0+ZHV4X2NvbW1hbmRzWzFdID0gY3JlYXRlX2FkY19jb21tYW5kKGNoYW4sIHJhbmdlKTsKKworCS8qIGFkYyBjb21tYW5kcyAqLworCWVyciA9IHNlbmRfZHV4X2NvbW1hbmRzKHRoaXNfdXNiZHV4c3ViLCBTRU5EU0lOR0xFQUQpOworCWlmIChlcnIgPCAwKSB7CisJCXVwKCZ0aGlzX3VzYmR1eHN1Yi0+c2VtKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgaW5zbi0+bjsgaSsrKSB7CisJCWVyciA9IHJlY2VpdmVfZHV4X2NvbW1hbmRzKHRoaXNfdXNiZHV4c3ViLCBTRU5EU0lOR0xFQUQpOworCQlpZiAoZXJyIDwgMCkgeworCQkJdXAoJnRoaXNfdXNiZHV4c3ViLT5zZW0pOworCQkJcmV0dXJuIDA7CisJCX0KKwkJb25lID0gbGUxNl90b19jcHUodGhpc191c2JkdXhzdWItPmluc25CdWZmZXJbMV0pOworCQlpZiAoQ1JfUkFOR0UoaW5zbi0+Y2hhbnNwZWMpIDw9IDEpCisJCQlvbmUgPSBvbmUgXiAweDgwMDsKKworCQlkYXRhW2ldID0gb25lOworCX0KKwl1cCgmdGhpc191c2JkdXhzdWItPnNlbSk7CisJcmV0dXJuIGk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBhbmFsb2cgb3V0ICovCisKK3N0YXRpYyBpbnQgdXNiZHV4X2FvX2luc25fcmVhZChjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkgICAgICAgY29tZWRpX2luc24gKmluc24sIGxzYW1wbF90ICpkYXRhKQoreworCWludCBpOworCWludCBjaGFuID0gQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyk7CisJc3RydWN0IHVzYmR1eHN1YiAqdGhpc191c2JkdXhzdWIgPSBkZXYtPnByaXZhdGU7CisKKwlpZiAoIXRoaXNfdXNiZHV4c3ViKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWRvd24oJnRoaXNfdXNiZHV4c3ViLT5zZW0pOworCWlmICghKHRoaXNfdXNiZHV4c3ViLT5wcm9iZWQpKSB7CisJCXVwKCZ0aGlzX3VzYmR1eHN1Yi0+c2VtKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCWZvciAoaSA9IDA7IGkgPCBpbnNuLT5uOyBpKyspCisJCWRhdGFbaV0gPSB0aGlzX3VzYmR1eHN1Yi0+b3V0QnVmZmVyW2NoYW5dOworCisJdXAoJnRoaXNfdXNiZHV4c3ViLT5zZW0pOworCXJldHVybiBpOworfQorCitzdGF0aWMgaW50IHVzYmR1eF9hb19pbnNuX3dyaXRlKGNvbWVkaV9kZXZpY2UgKmRldiwgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCQljb21lZGlfaW5zbiAqaW5zbiwgbHNhbXBsX3QgKmRhdGEpCit7CisJaW50IGksIGVycjsKKwlpbnQgY2hhbiA9IENSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpOworCXN0cnVjdCB1c2JkdXhzdWIgKnRoaXNfdXNiZHV4c3ViID0gZGV2LT5wcml2YXRlOworCisJaWYgKCF0aGlzX3VzYmR1eHN1YikKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlkZXZfZGJnKCZ0aGlzX3VzYmR1eHN1Yi0+aW50ZXJmYWNlLT5kZXYsCisJCSJjb21lZGklZDogYW9faW5zbl93cml0ZVxuIiwgZGV2LT5taW5vcik7CisKKwlkb3duKCZ0aGlzX3VzYmR1eHN1Yi0+c2VtKTsKKwlpZiAoISh0aGlzX3VzYmR1eHN1Yi0+cHJvYmVkKSkgeworCQl1cCgmdGhpc191c2JkdXhzdWItPnNlbSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKwlpZiAodGhpc191c2JkdXhzdWItPmFvX2NtZF9ydW5uaW5nKSB7CisJCWRldl9lcnIoJnRoaXNfdXNiZHV4c3ViLT5pbnRlcmZhY2UtPmRldiwKKwkJCSJjb21lZGklZDogYW9faW5zbl93cml0ZTogIgorCQkJIkVSUk9SOiBhc3luY2hyb25vdXMgYW9fY21kIGlzIHJ1bm5pbmdcbiIsIGRldi0+bWlub3IpOworCQl1cCgmdGhpc191c2JkdXhzdWItPnNlbSk7CisJCXJldHVybiAwOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBpbnNuLT5uOyBpKyspIHsKKwkJZGV2X2RiZygmdGhpc191c2JkdXhzdWItPmludGVyZmFjZS0+ZGV2LAorCQkJImNvbWVkaSVkOiBhb19pbnNuX3dyaXRlOiBkYXRhW2NoYW49JWQsaT0lZF09JWRcbiIsCisJCQlkZXYtPm1pbm9yLCBjaGFuLCBpLCBkYXRhW2ldKTsKKworCQkvKiBudW1iZXIgb2YgY2hhbm5lbHM6IDEgKi8KKwkJdGhpc191c2JkdXhzdWItPmR1eF9jb21tYW5kc1sxXSA9IDE7CisJCS8qIG9uZSAxNiBiaXQgdmFsdWUgKi8KKwkJKigoaW50MTZfdCAqKSAodGhpc191c2JkdXhzdWItPmR1eF9jb21tYW5kcyArIDIpKSA9CisJCQljcHVfdG9fbGUxNihkYXRhW2ldKTsKKwkJdGhpc191c2JkdXhzdWItPm91dEJ1ZmZlcltjaGFuXSA9IGRhdGFbaV07CisJCS8qIGNoYW5uZWwgbnVtYmVyICovCisJCXRoaXNfdXNiZHV4c3ViLT5kdXhfY29tbWFuZHNbNF0gPSAoY2hhbiA8PCA2KTsKKwkJZXJyID0gc2VuZF9kdXhfY29tbWFuZHModGhpc191c2JkdXhzdWIsIFNFTkREQUNPTU1BTkRTKTsKKwkJaWYgKGVyciA8IDApIHsKKwkJCXVwKCZ0aGlzX3VzYmR1eHN1Yi0+c2VtKTsKKwkJCXJldHVybiBlcnI7CisJCX0KKwl9CisJdXAoJnRoaXNfdXNiZHV4c3ViLT5zZW0pOworCisJcmV0dXJuIGk7Cit9CisKK3N0YXRpYyBpbnQgdXNiZHV4X2FvX2ludHRyaWcoY29tZWRpX2RldmljZSAqZGV2LCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJICAgICB1bnNpZ25lZCBpbnQgdHJpZ251bSkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCB1c2JkdXhzdWIgKnRoaXNfdXNiZHV4c3ViID0gZGV2LT5wcml2YXRlOworCisJaWYgKCF0aGlzX3VzYmR1eHN1YikKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlkb3duKCZ0aGlzX3VzYmR1eHN1Yi0+c2VtKTsKKwlpZiAoISh0aGlzX3VzYmR1eHN1Yi0+cHJvYmVkKSkgeworCQl1cCgmdGhpc191c2JkdXhzdWItPnNlbSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKwlpZiAodHJpZ251bSAhPSAwKSB7CisJCWRldl9lcnIoJnRoaXNfdXNiZHV4c3ViLT5pbnRlcmZhY2UtPmRldiwKKwkJCSJjb21lZGklZDogdXNiZHV4X2FvX2ludHRyaWc6IGludmFsaWQgdHJpZ251bVxuIiwKKwkJCWRldi0+bWlub3IpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKCEodGhpc191c2JkdXhzdWItPmFvX2NtZF9ydW5uaW5nKSkgeworCQl0aGlzX3VzYmR1eHN1Yi0+YW9fY21kX3J1bm5pbmcgPSAxOworCQlyZXQgPSB1c2JkdXhzdWJfc3VibWl0X091dFVSQnModGhpc191c2JkdXhzdWIpOworCQlpZiAocmV0IDwgMCkgeworCQkJZGV2X2VycigmdGhpc191c2JkdXhzdWItPmludGVyZmFjZS0+ZGV2LAorCQkJCSJjb21lZGklZDogdXNiZHV4X2FvX2ludHRyaWc6IHN1Ym1pdFVSQjogIgorCQkJCSJlcnI9JWRcbiIsIGRldi0+bWlub3IsIHJldCk7CisJCQl0aGlzX3VzYmR1eHN1Yi0+YW9fY21kX3J1bm5pbmcgPSAwOworCQkJdXAoJnRoaXNfdXNiZHV4c3ViLT5zZW0pOworCQkJcmV0dXJuIHJldDsKKwkJfQorCQlzLT5hc3luYy0+aW50dHJpZyA9IE5VTEw7CisJfSBlbHNlIHsKKwkJZGV2X2VycigmdGhpc191c2JkdXhzdWItPmludGVyZmFjZS0+ZGV2LAorCQkJImNvbWVkaSVkOiBhb19pbnR0cmlnIGJ1dCBhY3F1IGlzIGFscmVhZHkgcnVubmluZy5cbiIsCisJCQlkZXYtPm1pbm9yKTsKKwl9CisJdXAoJnRoaXNfdXNiZHV4c3ViLT5zZW0pOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IHVzYmR1eF9hb19jbWR0ZXN0KGNvbWVkaV9kZXZpY2UgKmRldiwgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCSAgICAgY29tZWRpX2NtZCAqY21kKQoreworCWludCBlcnIgPSAwLCB0bXA7CisJc3RydWN0IHVzYmR1eHN1YiAqdGhpc191c2JkdXhzdWIgPSBkZXYtPnByaXZhdGU7CisKKwlpZiAoIXRoaXNfdXNiZHV4c3ViKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmICghKHRoaXNfdXNiZHV4c3ViLT5wcm9iZWQpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWRldl9kYmcoJnRoaXNfdXNiZHV4c3ViLT5pbnRlcmZhY2UtPmRldiwKKwkJImNvbWVkaSVkOiB1c2JkdXhfYW9fY21kdGVzdFxuIiwgZGV2LT5taW5vcik7CisKKwkvKiBtYWtlIHN1cmUgdHJpZ2dlcnMgYXJlIHZhbGlkICovCisJLyogT25seSBpbW1lZGlhdGUgdHJpZ2dlcnMgYXJlIGFsbG93ZWQgKi8KKwl0bXAgPSBjbWQtPnN0YXJ0X3NyYzsKKwljbWQtPnN0YXJ0X3NyYyAmPSBUUklHX05PVyB8IFRSSUdfSU5UOworCWlmICghY21kLT5zdGFydF9zcmMgfHwgdG1wICE9IGNtZC0+c3RhcnRfc3JjKQorCQllcnIrKzsKKworCS8qIHRyaWdnZXIgc2hvdWxkIGhhcHBlbiB0aW1lZCAqLworCXRtcCA9IGNtZC0+c2Nhbl9iZWdpbl9zcmM7CisJLyoganVzdCBub3cgd2Ugc2NhbiBhbHNvIGluIHRoZSBoaWdoIHNwZWVkIG1vZGUgZXZlcnkgZnJhbWUgKi8KKwkvKiB0aGlzIGlzIGR1ZSB0byBlaGNpIGRyaXZlciBsaW1pdGF0aW9ucyAqLworCWlmICgwKSB7CQkvKiAodGhpc191c2JkdXhzdWItPmhpZ2hfc3BlZWQpICovCisJCS8qIHN0YXJ0IGltbWlkaWF0ZWx5IGEgbmV3IHNjYW4gKi8KKwkJLyogdGhlIHNhbXBsaW5nIHJhdGUgaXMgc2V0IGJ5IHRoZSBjb3ZlcnNpb24gcmF0ZSAqLworCQljbWQtPnNjYW5fYmVnaW5fc3JjICY9IFRSSUdfRk9MTE9XOworCX0gZWxzZSB7CisJCS8qIHN0YXJ0IGEgbmV3IHNjYW4gKG91dHB1dCBhdCBvbmNlKSB3aXRoIGEgdGltZXIgKi8KKwkJY21kLT5zY2FuX2JlZ2luX3NyYyAmPSBUUklHX1RJTUVSOworCX0KKwlpZiAoIWNtZC0+c2Nhbl9iZWdpbl9zcmMgfHwgdG1wICE9IGNtZC0+c2Nhbl9iZWdpbl9zcmMpCisJCWVycisrOworCisJLyogc2Nhbm5pbmcgaXMgY29udGlub3VzICovCisJdG1wID0gY21kLT5jb252ZXJ0X3NyYzsKKwkvKiB3ZSBhbHdheXMgb3V0cHV0IGF0IDFrSHoganVzdCBub3cgYWxsIGNoYW5uZWxzIGF0IG9uY2UgKi8KKwlpZiAoMCkgewkJLyogKHRoaXNfdXNiZHV4c3ViLT5oaWdoX3NwZWVkKSAqLworCQkvKgorCQkgKiBpbiB1c2ItMi4wIG9ubHkgb25lIGNvbnZlcnNpb24gaXQgdHJhbm1pdHRlZCBidXQgd2l0aCA4a0h6L24KKwkJICovCisJCWNtZC0+Y29udmVydF9zcmMgJj0gVFJJR19USU1FUjsKKwl9IGVsc2UgeworCQkvKiBhbGwgY29udmVyc2lvbiBldmVudHMgaGFwcGVuIHNpbXVsdGFuZW91c2x5IHdpdGggYSByYXRlIG9mCisJCSAqIDFrSHovbiAqLworCQljbWQtPmNvbnZlcnRfc3JjICY9IFRSSUdfTk9XOworCX0KKwlpZiAoIWNtZC0+Y29udmVydF9zcmMgfHwgdG1wICE9IGNtZC0+Y29udmVydF9zcmMpCisJCWVycisrOworCisJLyogaXNzdWUgYSB0cmlnZ2VyIHdoZW4gc2NhbiBpcyBmaW5pc2hlZCBhbmQgc3RhcnQgYSBuZXcgc2NhbiAqLworCXRtcCA9IGNtZC0+c2Nhbl9lbmRfc3JjOworCWNtZC0+c2Nhbl9lbmRfc3JjICY9IFRSSUdfQ09VTlQ7CisJaWYgKCFjbWQtPnNjYW5fZW5kX3NyYyB8fCB0bXAgIT0gY21kLT5zY2FuX2VuZF9zcmMpCisJCWVycisrOworCisJLyogdHJpZ2dlciBhdCB0aGUgZW5kIG9mIGNvdW50IGV2ZW50cyBvciBub3QsIHN0b3AgY29uZGl0aW9uIG9yIG5vdCAqLworCXRtcCA9IGNtZC0+c3RvcF9zcmM7CisJY21kLT5zdG9wX3NyYyAmPSBUUklHX0NPVU5UIHwgVFJJR19OT05FOworCWlmICghY21kLT5zdG9wX3NyYyB8fCB0bXAgIT0gY21kLT5zdG9wX3NyYykKKwkJZXJyKys7CisKKwlpZiAoZXJyKQorCQlyZXR1cm4gMTsKKworCS8qCisJICogc3RlcCAyOiBtYWtlIHN1cmUgdHJpZ2dlciBzb3VyY2VzIGFyZSB1bmlxdWUgYW5kIG11dHVhbGx5IGNvbXBhdGlibGUKKwkgKiBub3RlIHRoYXQgbXV0dWFsIGNvbXBhdGlibGl0eSBpcyBub3QgYW4gaXNzdWUgaGVyZQorCSAqLworCWlmIChjbWQtPnNjYW5fYmVnaW5fc3JjICE9IFRSSUdfRk9MTE9XICYmCisJCWNtZC0+c2Nhbl9iZWdpbl9zcmMgIT0gVFJJR19FWFQgJiYKKwkJY21kLT5zY2FuX2JlZ2luX3NyYyAhPSBUUklHX1RJTUVSKQorCQllcnIrKzsKKwlpZiAoY21kLT5zdG9wX3NyYyAhPSBUUklHX0NPVU5UICYmIGNtZC0+c3RvcF9zcmMgIT0gVFJJR19OT05FKQorCQllcnIrKzsKKworCWlmIChlcnIpCisJCXJldHVybiAyOworCisJLyogc3RlcCAzOiBtYWtlIHN1cmUgYXJndW1lbnRzIGFyZSB0cml2aWFsbHkgY29tcGF0aWJsZSAqLworCisJaWYgKGNtZC0+c3RhcnRfYXJnICE9IDApIHsKKwkJY21kLT5zdGFydF9hcmcgPSAwOworCQllcnIrKzsKKwl9CisKKwlpZiAoY21kLT5zY2FuX2JlZ2luX3NyYyA9PSBUUklHX0ZPTExPVykgeworCQkvKiBpbnRlcm5hbCB0cmlnZ2VyICovCisJCWlmIChjbWQtPnNjYW5fYmVnaW5fYXJnICE9IDApIHsKKwkJCWNtZC0+c2Nhbl9iZWdpbl9hcmcgPSAwOworCQkJZXJyKys7CisJCX0KKwl9CisKKwlpZiAoY21kLT5zY2FuX2JlZ2luX3NyYyA9PSBUUklHX1RJTUVSKSB7CisJCS8qIHRpbWVyICovCisJCWlmIChjbWQtPnNjYW5fYmVnaW5fYXJnIDwgMTAwMDAwMCkgeworCQkJY21kLT5zY2FuX2JlZ2luX2FyZyA9IDEwMDAwMDA7CisJCQllcnIrKzsKKwkJfQorCX0KKwkvKiBub3QgdXNlZCBub3csIGlzIGZvciBsYXRlciB1c2UgKi8KKwlpZiAoY21kLT5jb252ZXJ0X3NyYyA9PSBUUklHX1RJTUVSKSB7CisJCWlmIChjbWQtPmNvbnZlcnRfYXJnIDwgMTI1MDAwKSB7CisJCQljbWQtPmNvbnZlcnRfYXJnID0gMTI1MDAwOworCQkJZXJyKys7CisJCX0KKwl9CisKKwkvKiB0aGUgc2FtZSBhcmd1bWVudCAqLworCWlmIChjbWQtPnNjYW5fZW5kX2FyZyAhPSBjbWQtPmNoYW5saXN0X2xlbikgeworCQljbWQtPnNjYW5fZW5kX2FyZyA9IGNtZC0+Y2hhbmxpc3RfbGVuOworCQllcnIrKzsKKwl9CisKKwlpZiAoY21kLT5zdG9wX3NyYyA9PSBUUklHX0NPVU5UKSB7CisJCS8qIGFueSBjb3VudCBpcyBhbGxvd2VkICovCisJfSBlbHNlIHsKKwkJLyogVFJJR19OT05FICovCisJCWlmIChjbWQtPnN0b3BfYXJnICE9IDApIHsKKwkJCWNtZC0+c3RvcF9hcmcgPSAwOworCQkJZXJyKys7CisJCX0KKwl9CisKKwlkZXZfZGJnKCZ0aGlzX3VzYmR1eHN1Yi0+aW50ZXJmYWNlLT5kZXYsICJjb21lZGklZDogZXJyPSVkLCAiCisJCSJzY2FuX2JlZ2luX3NyYz0lZCwgc2Nhbl9iZWdpbl9hcmc9JWQsIGNvbnZlcnRfc3JjPSVkLCAiCisJCSJjb252ZXJ0X2FyZz0lZFxuIiwgZGV2LT5taW5vciwgZXJyLCBjbWQtPnNjYW5fYmVnaW5fc3JjLAorCQljbWQtPnNjYW5fYmVnaW5fYXJnLCBjbWQtPmNvbnZlcnRfc3JjLCBjbWQtPmNvbnZlcnRfYXJnKTsKKworCWlmIChlcnIpCisJCXJldHVybiAzOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdXNiZHV4X2FvX2NtZChjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKnMpCit7CisJY29tZWRpX2NtZCAqY21kID0gJnMtPmFzeW5jLT5jbWQ7CisJdW5zaWduZWQgaW50IGNoYW4sIGdhaW47CisJaW50IGksIHJldDsKKwlzdHJ1Y3QgdXNiZHV4c3ViICp0aGlzX3VzYmR1eHN1YiA9IGRldi0+cHJpdmF0ZTsKKworCWlmICghdGhpc191c2JkdXhzdWIpCisJCXJldHVybiAtRUZBVUxUOworCisJZG93bigmdGhpc191c2JkdXhzdWItPnNlbSk7CisJaWYgKCEodGhpc191c2JkdXhzdWItPnByb2JlZCkpIHsKKwkJdXAoJnRoaXNfdXNiZHV4c3ViLT5zZW0pOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJZGV2X2RiZygmdGhpc191c2JkdXhzdWItPmludGVyZmFjZS0+ZGV2LAorCQkiY29tZWRpJWQ6ICVzXG4iLCBkZXYtPm1pbm9yLCBfX2Z1bmNfXyk7CisKKwkvKiBzZXQgY3VycmVudCBjaGFubmVsIG9mIHRoZSBydW5uaW5nIGFxdWlzaXRpb24gdG8gemVybyAqLworCXMtPmFzeW5jLT5jdXJfY2hhbiA9IDA7CisJZm9yIChpID0gMDsgaSA8IGNtZC0+Y2hhbmxpc3RfbGVuOyArK2kpIHsKKwkJY2hhbiA9IENSX0NIQU4oY21kLT5jaGFubGlzdFtpXSk7CisJCWdhaW4gPSBDUl9SQU5HRShjbWQtPmNoYW5saXN0W2ldKTsKKwkJaWYgKGkgPj0gTlVNT1VUQ0hBTk5FTFMpIHsKKwkJCWRldl9lcnIoJnRoaXNfdXNiZHV4c3ViLT5pbnRlcmZhY2UtPmRldiwKKwkJCQkiY29tZWRpJWQ6ICVzOiBjaGFubmVsIGxpc3QgdG9vIGxvbmdcbiIsCisJCQkJZGV2LT5taW5vciwgX19mdW5jX18pOworCQkJYnJlYWs7CisJCX0KKwkJdGhpc191c2JkdXhzdWItPmRhY19jb21tYW5kc1tpXSA9IChjaGFuIDw8IDYpOworCQlkZXZfZGJnKCZ0aGlzX3VzYmR1eHN1Yi0+aW50ZXJmYWNlLT5kZXYsCisJCQkiY29tZWRpJWQ6IGRhYyBjb21tYW5kIGZvciBjaCAlZCBpcyAleFxuIiwKKwkJCWRldi0+bWlub3IsIGksIHRoaXNfdXNiZHV4c3ViLT5kYWNfY29tbWFuZHNbaV0pOworCX0KKworCS8qIHdlIGNvdW50IGluIHN0ZXBzIG9mIDFtcyAoMTI1dXMpICovCisJLyogMTI1dXMgbW9kZSBub3QgdXNlZCB5ZXQgKi8KKwlpZiAoMCkgewkJLyogKHRoaXNfdXNiZHV4c3ViLT5oaWdoX3NwZWVkKSAqLworCQkvKiAxMjV1cyAqLworCQkvKiB0aW1pbmcgb2YgdGhlIGNvbnZlcnNpb24gaXRzZWxmOiBldmVyeSAxMjUgdXMgKi8KKwkJdGhpc191c2JkdXhzdWItPmFvX3RpbWVyID0gY21kLT5jb252ZXJ0X2FyZyAvIDEyNTAwMDsKKwl9IGVsc2UgeworCQkvKiAxbXMgKi8KKwkJLyogdGltaW5nIG9mIHRoZSBzY2FuOiB3ZSBnZXQgYWxsIGNoYW5uZWxzIGF0IG9uY2UgKi8KKwkJdGhpc191c2JkdXhzdWItPmFvX3RpbWVyID0gY21kLT5zY2FuX2JlZ2luX2FyZyAvIDEwMDAwMDA7CisJCWRldl9kYmcoJnRoaXNfdXNiZHV4c3ViLT5pbnRlcmZhY2UtPmRldiwKKwkJCSJjb21lZGklZDogc2Nhbl9iZWdpbl9zcmM9JWQsIHNjYW5fYmVnaW5fYXJnPSVkLCAiCisJCQkiY29udmVydF9zcmM9JWQsIGNvbnZlcnRfYXJnPSVkXG4iLCBkZXYtPm1pbm9yLAorCQkJY21kLT5zY2FuX2JlZ2luX3NyYywgY21kLT5zY2FuX2JlZ2luX2FyZywKKwkJCWNtZC0+Y29udmVydF9zcmMsIGNtZC0+Y29udmVydF9hcmcpOworCQlkZXZfZGJnKCZ0aGlzX3VzYmR1eHN1Yi0+aW50ZXJmYWNlLT5kZXYsCisJCQkiY29tZWRpJWQ6IGFvX3RpbWVyPSVkIChtcylcbiIsCisJCQlkZXYtPm1pbm9yLCB0aGlzX3VzYmR1eHN1Yi0+YW9fdGltZXIpOworCQlpZiAodGhpc191c2JkdXhzdWItPmFvX3RpbWVyIDwgMSkgeworCQkJZGV2X2VycigmdGhpc191c2JkdXhzdWItPmludGVyZmFjZS0+ZGV2LAorCQkJCSJjb21lZGklZDogdXNiZHV4OiBhb190aW1lcj0lZCwgIgorCQkJCSJzY2FuX2JlZ2luX2FyZz0lZC4gIgorCQkJCSJOb3QgcHJvcGVybHkgdGVzdGVkIGJ5IGNtZHRlc3Q/XG4iLAorCQkJCWRldi0+bWlub3IsIHRoaXNfdXNiZHV4c3ViLT5hb190aW1lciwKKwkJCQljbWQtPnNjYW5fYmVnaW5fYXJnKTsKKwkJCXVwKCZ0aGlzX3VzYmR1eHN1Yi0+c2VtKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorCXRoaXNfdXNiZHV4c3ViLT5hb19jb3VudGVyID0gdGhpc191c2JkdXhzdWItPmFvX3RpbWVyOworCisJaWYgKGNtZC0+c3RvcF9zcmMgPT0gVFJJR19DT1VOVCkgeworCQkvKiBub3QgY29udGlub3VzICovCisJCS8qIGNvdW50ZXIgKi8KKwkJLyogaGlnaCBzcGVlZCBhbHNvIHNjYW5zIGV2ZXJ5dGhpbmcgYXQgb25jZSAqLworCQlpZiAoMCkgewkvKiAodGhpc191c2JkdXhzdWItPmhpZ2hfc3BlZWQpICovCisJCQl0aGlzX3VzYmR1eHN1Yi0+YW9fc2FtcGxlX2NvdW50ID0KKwkJCQkoY21kLT5zdG9wX2FyZykgKiAoY21kLT5zY2FuX2VuZF9hcmcpOworCQl9IGVsc2UgeworCQkJLyogdGhlcmUncyBubyBzY2FuIGFzIHRoZSBzY2FuIGhhcyBiZWVuICovCisJCQkvKiBwZXJmIGluc2lkZSB0aGUgRlgyICovCisJCQkvKiBkYXRhIGFycml2ZXMgYXMgb25lIHBhY2tldCAqLworCQkJdGhpc191c2JkdXhzdWItPmFvX3NhbXBsZV9jb3VudCA9IGNtZC0+c3RvcF9hcmc7CisJCX0KKwkJdGhpc191c2JkdXhzdWItPmFvX2NvbnRpbm91cyA9IDA7CisJfSBlbHNlIHsKKwkJLyogY29udGlub3VzIGFxdWlzaXRpb24gKi8KKwkJdGhpc191c2JkdXhzdWItPmFvX2NvbnRpbm91cyA9IDE7CisJCXRoaXNfdXNiZHV4c3ViLT5hb19zYW1wbGVfY291bnQgPSAwOworCX0KKworCWlmIChjbWQtPnN0YXJ0X3NyYyA9PSBUUklHX05PVykgeworCQkvKiBlbmFibGUgdGhpcyBhY3F1aXNpdGlvbiBvcGVyYXRpb24gKi8KKwkJdGhpc191c2JkdXhzdWItPmFvX2NtZF9ydW5uaW5nID0gMTsKKwkJcmV0ID0gdXNiZHV4c3ViX3N1Ym1pdF9PdXRVUkJzKHRoaXNfdXNiZHV4c3ViKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCXRoaXNfdXNiZHV4c3ViLT5hb19jbWRfcnVubmluZyA9IDA7CisJCQkvKiBmaXhtZTogdW5saW5rIGhlcmU/PyAqLworCQkJdXAoJnRoaXNfdXNiZHV4c3ViLT5zZW0pOworCQkJcmV0dXJuIHJldDsKKwkJfQorCQlzLT5hc3luYy0+aW50dHJpZyA9IE5VTEw7CisJfSBlbHNlIHsKKwkJLyogVFJJR19JTlQgKi8KKwkJLyogc3VibWl0IHRoZSB1cmJzIGxhdGVyICovCisJCS8qIHdhaXQgZm9yIGFuIGludGVybmFsIHNpZ25hbCAqLworCQlzLT5hc3luYy0+aW50dHJpZyA9IHVzYmR1eF9hb19pbnR0cmlnOworCX0KKworCXVwKCZ0aGlzX3VzYmR1eHN1Yi0+c2VtKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB1c2JkdXhfZGlvX2luc25fY29uZmlnKGNvbWVkaV9kZXZpY2UgKmRldiwgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCQkgIGNvbWVkaV9pbnNuICppbnNuLCBsc2FtcGxfdCAqZGF0YSkKK3sKKwlpbnQgY2hhbiA9IENSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpOworCisJLyogVGhlIGlucHV0IG9yIG91dHB1dCBjb25maWd1cmF0aW9uIG9mIGVhY2ggZGlnaXRhbCBsaW5lIGlzCisJICogY29uZmlndXJlZCBieSBhIHNwZWNpYWwgaW5zbl9jb25maWcgaW5zdHJ1Y3Rpb24uICBjaGFuc3BlYworCSAqIGNvbnRhaW5zIHRoZSBjaGFubmVsIHRvIGJlIGNoYW5nZWQsIGFuZCBkYXRhWzBdIGNvbnRhaW5zIHRoZQorCSAqIHZhbHVlIENPTUVESV9JTlBVVCBvciBDT01FRElfT1VUUFVULiAqLworCisJc3dpdGNoIChkYXRhWzBdKSB7CisJY2FzZSBJTlNOX0NPTkZJR19ESU9fT1VUUFVUOgorCQlzLT5pb19iaXRzIHw9IDEgPDwgY2hhbjsJLyogMSBtZWFucyBPdXQgKi8KKwkJYnJlYWs7CisJY2FzZSBJTlNOX0NPTkZJR19ESU9fSU5QVVQ6CisJCXMtPmlvX2JpdHMgJj0gfigxIDw8IGNoYW4pOworCQlicmVhazsKKwljYXNlIElOU05fQ09ORklHX0RJT19RVUVSWToKKwkJZGF0YVsxXSA9CisJCQkocy0+CisJCQlpb19iaXRzICYgKDEgPDwgY2hhbikpID8gQ09NRURJX09VVFBVVCA6IENPTUVESV9JTlBVVDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJCWJyZWFrOworCX0KKwkvKiB3ZSBkb24ndCB0ZWxsIHRoZSBmaXJtd2FyZSBoZXJlIGFzIGl0IHdvdWxkIHRha2UgOCBmcmFtZXMgKi8KKwkvKiB0byBzdWJtaXQgdGhlIGluZm9ybWF0aW9uLiBXZSBkbyBpdCBpbiB0aGUgaW5zbl9iaXRzLiAqLworCXJldHVybiBpbnNuLT5uOworfQorCitzdGF0aWMgaW50IHVzYmR1eF9kaW9faW5zbl9iaXRzKGNvbWVkaV9kZXZpY2UgKmRldiwgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCQljb21lZGlfaW5zbiAqaW5zbiwgbHNhbXBsX3QgKmRhdGEpCit7CisKKwlzdHJ1Y3QgdXNiZHV4c3ViICp0aGlzX3VzYmR1eHN1YiA9IGRldi0+cHJpdmF0ZTsKKwlpbnQgZXJyOworCisJaWYgKCF0aGlzX3VzYmR1eHN1YikKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKworCWlmIChpbnNuLT5uICE9IDIpCisJCXJldHVybiAtRUlOVkFMOworCisJZG93bigmdGhpc191c2JkdXhzdWItPnNlbSk7CisKKwlpZiAoISh0aGlzX3VzYmR1eHN1Yi0+cHJvYmVkKSkgeworCQl1cCgmdGhpc191c2JkdXhzdWItPnNlbSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCS8qIFRoZSBpbnNuIGRhdGEgaXMgYSBtYXNrIGluIGRhdGFbMF0gYW5kIHRoZSBuZXcgZGF0YQorCSAqIGluIGRhdGFbMV0sIGVhY2ggY2hhbm5lbCBjb29yZXNwb25kaW5nIHRvIGEgYml0LiAqLworCXMtPnN0YXRlICY9IH5kYXRhWzBdOworCXMtPnN0YXRlIHw9IGRhdGFbMF0gJiBkYXRhWzFdOworCXRoaXNfdXNiZHV4c3ViLT5kdXhfY29tbWFuZHNbMV0gPSBzLT5pb19iaXRzOworCXRoaXNfdXNiZHV4c3ViLT5kdXhfY29tbWFuZHNbMl0gPSBzLT5zdGF0ZTsKKworCS8qIFRoaXMgY29tbWFuZCBhbHNvIHRlbGxzIHRoZSBmaXJtd2FyZSB0byByZXR1cm4gKi8KKwkvKiB0aGUgZGlnaXRhbCBpbnB1dCBsaW5lcyAqLworCWVyciA9IHNlbmRfZHV4X2NvbW1hbmRzKHRoaXNfdXNiZHV4c3ViLCBTRU5ERElPQklUU0NPTU1BTkQpOworCWlmIChlcnIgPCAwKSB7CisJCXVwKCZ0aGlzX3VzYmR1eHN1Yi0+c2VtKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJZXJyID0gcmVjZWl2ZV9kdXhfY29tbWFuZHModGhpc191c2JkdXhzdWIsIFNFTkRESU9CSVRTQ09NTUFORCk7CisJaWYgKGVyciA8IDApIHsKKwkJdXAoJnRoaXNfdXNiZHV4c3ViLT5zZW0pOworCQlyZXR1cm4gZXJyOworCX0KKworCWRhdGFbMV0gPSBsZTE2X3RvX2NwdSh0aGlzX3VzYmR1eHN1Yi0+aW5zbkJ1ZmZlclsxXSk7CisJdXAoJnRoaXNfdXNiZHV4c3ViLT5zZW0pOworCXJldHVybiAyOworfQorCisvKiByZWFkcyB0aGUgNCBjb3VudGVycywgb25seSB0d28gYXJlIHVzZWQganVzdCBub3cgKi8KK3N0YXRpYyBpbnQgdXNiZHV4X2NvdW50ZXJfcmVhZChjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkgICAgICAgY29tZWRpX2luc24gKmluc24sIGxzYW1wbF90ICpkYXRhKQoreworCXN0cnVjdCB1c2JkdXhzdWIgKnRoaXNfdXNiZHV4c3ViID0gZGV2LT5wcml2YXRlOworCWludCBjaGFuID0gaW5zbi0+Y2hhbnNwZWM7CisJaW50IGVycjsKKworCWlmICghdGhpc191c2JkdXhzdWIpCisJCXJldHVybiAtRUZBVUxUOworCisJZG93bigmdGhpc191c2JkdXhzdWItPnNlbSk7CisKKwlpZiAoISh0aGlzX3VzYmR1eHN1Yi0+cHJvYmVkKSkgeworCQl1cCgmdGhpc191c2JkdXhzdWItPnNlbSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWVyciA9IHNlbmRfZHV4X2NvbW1hbmRzKHRoaXNfdXNiZHV4c3ViLCBSRUFEQ09VTlRFUkNPTU1BTkQpOworCWlmIChlcnIgPCAwKSB7CisJCXVwKCZ0aGlzX3VzYmR1eHN1Yi0+c2VtKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwllcnIgPSByZWNlaXZlX2R1eF9jb21tYW5kcyh0aGlzX3VzYmR1eHN1YiwgUkVBRENPVU5URVJDT01NQU5EKTsKKwlpZiAoZXJyIDwgMCkgeworCQl1cCgmdGhpc191c2JkdXhzdWItPnNlbSk7CisJCXJldHVybiBlcnI7CisJfQorCisJZGF0YVswXSA9IGxlMTZfdG9fY3B1KHRoaXNfdXNiZHV4c3ViLT5pbnNuQnVmZmVyW2NoYW4gKyAxXSk7CisJdXAoJnRoaXNfdXNiZHV4c3ViLT5zZW0pOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IHVzYmR1eF9jb3VudGVyX3dyaXRlKGNvbWVkaV9kZXZpY2UgKmRldiwgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCQljb21lZGlfaW5zbiAqaW5zbiwgbHNhbXBsX3QgKmRhdGEpCit7CisJc3RydWN0IHVzYmR1eHN1YiAqdGhpc191c2JkdXhzdWIgPSBkZXYtPnByaXZhdGU7CisJaW50IGVycjsKKworCWlmICghdGhpc191c2JkdXhzdWIpCisJCXJldHVybiAtRUZBVUxUOworCisJZG93bigmdGhpc191c2JkdXhzdWItPnNlbSk7CisKKwlpZiAoISh0aGlzX3VzYmR1eHN1Yi0+cHJvYmVkKSkgeworCQl1cCgmdGhpc191c2JkdXhzdWItPnNlbSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXRoaXNfdXNiZHV4c3ViLT5kdXhfY29tbWFuZHNbMV0gPSBpbnNuLT5jaGFuc3BlYzsKKwkqKChpbnQxNl90ICopICh0aGlzX3VzYmR1eHN1Yi0+ZHV4X2NvbW1hbmRzICsgMikpID0gY3B1X3RvX2xlMTYoKmRhdGEpOworCisJZXJyID0gc2VuZF9kdXhfY29tbWFuZHModGhpc191c2JkdXhzdWIsIFdSSVRFQ09VTlRFUkNPTU1BTkQpOworCWlmIChlcnIgPCAwKSB7CisJCXVwKCZ0aGlzX3VzYmR1eHN1Yi0+c2VtKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwl1cCgmdGhpc191c2JkdXhzdWItPnNlbSk7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCB1c2JkdXhfY291bnRlcl9jb25maWcoY29tZWRpX2RldmljZSAqZGV2LCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJCSBjb21lZGlfaW5zbiAqaW5zbiwgbHNhbXBsX3QgKmRhdGEpCit7CisJLyogbm90aGluZyB0byBkbyBzbyBmYXIgKi8KKwlyZXR1cm4gMjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogUFdNICovCisKK3N0YXRpYyBpbnQgdXNiZHV4c3ViX3VubGlua19Qd21VUkJzKHN0cnVjdCB1c2JkdXhzdWIgKnVzYmR1eHN1Yl90bXApCit7CisJaW50IGVyciA9IDA7CisKKwlpZiAodXNiZHV4c3ViX3RtcCAmJiB1c2JkdXhzdWJfdG1wLT51cmJQd20pIHsKKwkJaWYgKHVzYmR1eHN1Yl90bXAtPnVyYlB3bSkKKwkJCXVzYl9raWxsX3VyYih1c2JkdXhzdWJfdG1wLT51cmJQd20pOworCQlkZXZfZGJnKCZ1c2JkdXhzdWJfdG1wLT5pbnRlcmZhY2UtPmRldiwKKwkJCSJjb21lZGk6IHVubGlua2VkIFB3bVVSQjogcmVzPSVkXG4iLCBlcnIpOworCX0KKwlyZXR1cm4gZXJyOworfQorCisvKiBUaGlzIGNhbmNlbHMgYSBydW5uaW5nIGFjcXVpc2l0aW9uIG9wZXJhdGlvbgorICogaW4gYW55IGNvbnRleHQuCisgKi8KK3N0YXRpYyBpbnQgdXNiZHV4X3B3bV9zdG9wKHN0cnVjdCB1c2JkdXhzdWIgKnRoaXNfdXNiZHV4c3ViLCBpbnQgZG9fdW5saW5rKQoreworCWludCByZXQgPSAwOworCisJaWYgKCF0aGlzX3VzYmR1eHN1YikKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlkZXZfZGJnKCZ0aGlzX3VzYmR1eHN1Yi0+aW50ZXJmYWNlLT5kZXYsICJjb21lZGk6ICVzXG4iLCBfX2Z1bmNfXyk7CisJaWYgKGRvX3VubGluaykKKwkJcmV0ID0gdXNiZHV4c3ViX3VubGlua19Qd21VUkJzKHRoaXNfdXNiZHV4c3ViKTsKKworCisJdGhpc191c2JkdXhzdWItPnB3bV9jbWRfcnVubmluZyA9IDA7CisKKwlyZXR1cm4gcmV0OworfQorCisvKiBmb3JjZSB1bmxpbmsgLSBpcyBjYWxsZWQgYnkgY29tZWRpICovCitzdGF0aWMgaW50IHVzYmR1eF9wd21fY2FuY2VsKGNvbWVkaV9kZXZpY2UgKmRldiwgY29tZWRpX3N1YmRldmljZSAqcykKK3sKKwlzdHJ1Y3QgdXNiZHV4c3ViICp0aGlzX3VzYmR1eHN1YiA9IGRldi0+cHJpdmF0ZTsKKwlpbnQgcmVzID0gMDsKKworCS8qIHVubGluayBvbmx5IGlmIGl0IGlzIHJlYWxseSBydW5uaW5nICovCisJcmVzID0gdXNiZHV4X3B3bV9zdG9wKHRoaXNfdXNiZHV4c3ViLCB0aGlzX3VzYmR1eHN1Yi0+cHdtX2NtZF9ydW5uaW5nKTsKKworCWRldl9kYmcoJnRoaXNfdXNiZHV4c3ViLT5pbnRlcmZhY2UtPmRldiwKKwkJImNvbWVkaSAlZDogc2VuZGluZyBwd20gb2ZmIGNvbW1hbmQgdG8gdGhlIHVzYiBkZXZpY2UuXG4iLAorCQlkZXYtPm1pbm9yKTsKKwlyZXMgPSBzZW5kX2R1eF9jb21tYW5kcyh0aGlzX3VzYmR1eHN1YiwgU0VORFBXTU9GRik7CisJaWYgKHJlcyA8IDApCisJCXJldHVybiByZXM7CisKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgdm9pZCB1c2JkdXhzdWJfcHdtX2lycShzdHJ1Y3QgdXJiICp1cmIpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgdXNiZHV4c3ViICp0aGlzX3VzYmR1eHN1YjsKKwljb21lZGlfZGV2aWNlICp0aGlzX2NvbWVkaWRldjsKKwljb21lZGlfc3ViZGV2aWNlICpzOworCisJLyogcHJpbnRrKEtFUk5fREVCVUcgIlBXTTogSVJRXG4iKTsgKi8KKworCS8qIHRoZSBjb250ZXh0IHZhcmlhYmxlIHBvaW50cyB0byB0aGUgc3ViZGV2aWNlICovCisJdGhpc19jb21lZGlkZXYgPSB1cmItPmNvbnRleHQ7CisJLyogdGhlIHByaXZhdGUgc3RydWN0dXJlIG9mIHRoZSBzdWJkZXZpY2UgaXMgc3RydWN0IHVzYmR1eHN1YiAqLworCXRoaXNfdXNiZHV4c3ViID0gdGhpc19jb21lZGlkZXYtPnByaXZhdGU7CisKKwlzID0gdGhpc19jb21lZGlkZXYtPnN1YmRldmljZXMgKyBTVUJERVZfREE7CisKKwlzd2l0Y2ggKHVyYi0+c3RhdHVzKSB7CisJY2FzZSAwOgorCQkvKiBzdWNjZXNzICovCisJCWJyZWFrOworCisJY2FzZSAtRUNPTk5SRVNFVDoKKwljYXNlIC1FTk9FTlQ6CisJY2FzZSAtRVNIVVRET1dOOgorCWNhc2UgLUVDT05OQUJPUlRFRDoKKwkJLyoKKwkJICogYWZ0ZXIgYW4gdW5saW5rIGNvbW1hbmQsIHVucGx1ZywgLi4uIGV0YworCQkgKiBubyB1bmxpbmsgbmVlZGVkIGhlcmUuIEFscmVhZHkgc2h1dHRpbmcgZG93bi4KKwkJICovCisJCWlmICh0aGlzX3VzYmR1eHN1Yi0+cHdtX2NtZF9ydW5uaW5nKQorCQkJdXNiZHV4X3B3bV9zdG9wKHRoaXNfdXNiZHV4c3ViLCAwKTsKKworCQlyZXR1cm47CisKKwlkZWZhdWx0OgorCQkvKiBhIHJlYWwgZXJyb3IgKi8KKwkJaWYgKHRoaXNfdXNiZHV4c3ViLT5wd21fY21kX3J1bm5pbmcpIHsKKwkJCWRldl9lcnIoJnRoaXNfdXNiZHV4c3ViLT5pbnRlcmZhY2UtPmRldiwKKwkJCQkiY29tZWRpXzogTm9uLXplcm8gdXJiIHN0YXR1cyByZWNlaXZlZCBpbiAiCisJCQkJInB3bSBpbnRyIGNvbnRleHQ6ICVkXG4iLCB1cmItPnN0YXR1cyk7CisJCQl1c2JkdXhfcHdtX3N0b3AodGhpc191c2JkdXhzdWIsIDApOworCQl9CisJCXJldHVybjsKKwl9CisKKwkvKiBhcmUgd2UgYWN0dWFsbHkgcnVubmluZz8gKi8KKwlpZiAoISh0aGlzX3VzYmR1eHN1Yi0+cHdtX2NtZF9ydW5uaW5nKSkKKwkJcmV0dXJuOworCisJdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID0gdGhpc191c2JkdXhzdWItPnNpemVQd21CdWY7CisJdXJiLT5kZXYgPSB0aGlzX3VzYmR1eHN1Yi0+dXNiZGV2OworCXVyYi0+c3RhdHVzID0gMDsKKwlpZiAodGhpc191c2JkdXhzdWItPnB3bV9jbWRfcnVubmluZykgeworCQlyZXQgPSB1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9BVE9NSUMpOworCQlpZiAocmV0IDwgMCkgeworCQkJZGV2X2VycigmdGhpc191c2JkdXhzdWItPmludGVyZmFjZS0+ZGV2LAorCQkJCSJjb21lZGlfOiBwd20gdXJiIHJlc3VibSBmYWlsZWQgaW4gaW50LWNvbnQuICIKKwkJCQkicmV0PSVkIiwgcmV0KTsKKwkJCWlmIChyZXQgPT0gRUwyTlNZTkMpCisJCQkJZGV2X2VycigmdGhpc191c2JkdXhzdWItPmludGVyZmFjZS0+ZGV2LAorCQkJCQkiYnVnZ3kgVVNCIGhvc3QgY29udHJvbGxlciBvciBidWcgaW4gIgorCQkJCQkiSVJRIGhhbmRsaW5nIVxuIik7CisKKwkJCS8qIGRvbid0IGRvIGFuIHVubGluayBoZXJlICovCisJCQl1c2JkdXhfcHdtX3N0b3AodGhpc191c2JkdXhzdWIsIDApOworCQl9CisJfQorfQorCitzdGF0aWMgaW50IHVzYmR1eHN1Yl9zdWJtaXRfUHdtVVJCcyhzdHJ1Y3QgdXNiZHV4c3ViICp1c2JkdXhzdWIpCit7CisJaW50IGVyckZsYWc7CisKKwlpZiAoIXVzYmR1eHN1YikKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlkZXZfZGJnKCZ1c2JkdXhzdWItPmludGVyZmFjZS0+ZGV2LCAiY29tZWRpXzogc3VibWl0dGluZyBwd20tdXJiXG4iKTsKKworCS8qIGluIGNhc2Ugb2YgYSByZXN1Ym1pc3Npb24gYWZ0ZXIgYW4gdW5saW5rLi4uICovCisJdXNiX2ZpbGxfYnVsa191cmIodXNiZHV4c3ViLT51cmJQd20sCisJCXVzYmR1eHN1Yi0+dXNiZGV2LAorCQl1c2Jfc25kYnVsa3BpcGUodXNiZHV4c3ViLT51c2JkZXYsIFBXTV9FUCksCisJCXVzYmR1eHN1Yi0+dXJiUHdtLT50cmFuc2Zlcl9idWZmZXIsCisJCXVzYmR1eHN1Yi0+c2l6ZVB3bUJ1ZiwgdXNiZHV4c3ViX3B3bV9pcnEsIHVzYmR1eHN1Yi0+Y29tZWRpZGV2KTsKKworCWVyckZsYWcgPSB1c2Jfc3VibWl0X3VyYih1c2JkdXhzdWItPnVyYlB3bSwgR0ZQX0FUT01JQyk7CisJaWYgKGVyckZsYWcpIHsKKwkJZGV2X2VycigmdXNiZHV4c3ViLT5pbnRlcmZhY2UtPmRldiwKKwkJCSJjb21lZGlfOiB1c2JkdXg6IHB3bTogdXNiX3N1Ym1pdF91cmIgZXJyb3IgJWRcbiIsCisJCQllcnJGbGFnKTsKKwkJcmV0dXJuIGVyckZsYWc7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHVzYmR1eF9wd21fcGVyaW9kKGNvbWVkaV9kZXZpY2UgKmRldiwgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCSAgICAgbHNhbXBsX3QgcGVyaW9kKQoreworCXN0cnVjdCB1c2JkdXhzdWIgKnRoaXNfdXNiZHV4c3ViID0gZGV2LT5wcml2YXRlOworCWludCBmeDJkZWxheSA9IDI1NTsKKworCWlmIChwZXJpb2QgPCBNSU5fUFdNX1BFUklPRCkgeworCQlkZXZfZXJyKCZ0aGlzX3VzYmR1eHN1Yi0+aW50ZXJmYWNlLT5kZXYsCisJCQkiY29tZWRpJWQ6IGlsbGVnYWwgcGVyaW9kIHNldHRpbmcgZm9yIHB3bS5cbiIsCisJCQlkZXYtPm1pbm9yKTsKKwkJcmV0dXJuIC1FQUdBSU47CisJfSBlbHNlIHsKKwkJZngyZGVsYXkgPSBwZXJpb2QgLyAoKGludCkoNio1MTIqKDEuMC8wLjAzMykpKSAtIDY7CisJCWlmIChmeDJkZWxheSA+IDI1NSkgeworCQkJZGV2X2VycigmdGhpc191c2JkdXhzdWItPmludGVyZmFjZS0+ZGV2LAorCQkJCSJjb21lZGklZDogcGVyaW9kICVkIGZvciBwd20gaXMgdG9vIGxvdy5cbiIsCisJCQkgICAgICAgZGV2LT5taW5vciwgcGVyaW9kKTsKKwkJCXJldHVybiAtRUFHQUlOOworCQl9CisJfQorCXRoaXNfdXNiZHV4c3ViLT5wd21EZWxheSA9IGZ4MmRlbGF5OworCXRoaXNfdXNiZHV4c3ViLT5wd21QZXJpb2QgPSBwZXJpb2Q7CisJZGV2X2RiZygmdGhpc191c2JkdXhzdWItPmludGVyZmFjZS0+ZGV2LCAiJXM6IGZyZXF1PSVkLCBwZXJpb2Q9JWRcbiIsCisJCV9fZnVuY19fLCBwZXJpb2QsIGZ4MmRlbGF5KTsKKwlyZXR1cm4gMDsKK30KKworLyogaXMgY2FsbGVkIGZyb20gaW5zbiBzbyB0aGVyZSdzIG5vIG5lZWQgdG8gZG8gYWxsIHRoZSBzYW5pdHkgY2hlY2tzICovCitzdGF0aWMgaW50IHVzYmR1eF9wd21fc3RhcnQoY29tZWRpX2RldmljZSAqZGV2LCBjb21lZGlfc3ViZGV2aWNlICpzKQoreworCWludCByZXQsIGk7CisJc3RydWN0IHVzYmR1eHN1YiAqdGhpc191c2JkdXhzdWIgPSBkZXYtPnByaXZhdGU7CisKKwlkZXZfZGJnKCZ0aGlzX3VzYmR1eHN1Yi0+aW50ZXJmYWNlLT5kZXYsICJjb21lZGklZDogJXNcbiIsCisJCWRldi0+bWlub3IsIF9fZnVuY19fKTsKKworCWlmICh0aGlzX3VzYmR1eHN1Yi0+cHdtX2NtZF9ydW5uaW5nKSB7CisJCS8qIGFscmVhZHkgcnVubmluZyAqLworCQlyZXR1cm4gMDsKKwl9CisKKwl0aGlzX3VzYmR1eHN1Yi0+ZHV4X2NvbW1hbmRzWzFdID0gKChpbnQ4X3QpIHRoaXNfdXNiZHV4c3ViLT5wd21EZWxheSk7CisJcmV0ID0gc2VuZF9kdXhfY29tbWFuZHModGhpc191c2JkdXhzdWIsIFNFTkRQV01PTik7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwkvKiBpbml0YWxpc2UgdGhlIGJ1ZmZlciAqLworCWZvciAoaSA9IDA7IGkgPCB0aGlzX3VzYmR1eHN1Yi0+c2l6ZVB3bUJ1ZjsgaSsrKQorCQkoKGNoYXIgKikodGhpc191c2JkdXhzdWItPnVyYlB3bS0+dHJhbnNmZXJfYnVmZmVyKSlbaV0gPSAwOworCisJdGhpc191c2JkdXhzdWItPnB3bV9jbWRfcnVubmluZyA9IDE7CisJcmV0ID0gdXNiZHV4c3ViX3N1Ym1pdF9Qd21VUkJzKHRoaXNfdXNiZHV4c3ViKTsKKwlpZiAocmV0IDwgMCkgeworCQl0aGlzX3VzYmR1eHN1Yi0+cHdtX2NtZF9ydW5uaW5nID0gMDsKKwkJcmV0dXJuIHJldDsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIGdlbmVyYXRlcyB0aGUgYml0IHBhdHRlcm4gZm9yIFBXTSB3aXRoIHRoZSBvcHRpb25hbCBzaWduIGJpdCAqLworc3RhdGljIGludCB1c2JkdXhfcHdtX3BhdHRlcm4oY29tZWRpX2RldmljZSAqZGV2LCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJICAgICAgaW50IGNoYW5uZWwsIGxzYW1wbF90IHZhbHVlLCBsc2FtcGxfdCBzaWduKQoreworCXN0cnVjdCB1c2JkdXhzdWIgKnRoaXNfdXNiZHV4c3ViID0gZGV2LT5wcml2YXRlOworCWludCBpLCBzemJ1ZjsKKwljaGFyICpwQnVmOworCWNoYXIgcHdtX21hc2s7CisJY2hhciBzZ25fbWFzazsKKwljaGFyIGM7CisKKwlpZiAoIXRoaXNfdXNiZHV4c3ViKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCS8qIHRoaXMgaXMgdGhlIERJTyBiaXQgd2hpY2ggY2FycmllcyB0aGUgUFdNIGRhdGEgKi8KKwlwd21fbWFzayA9ICgxIDw8IGNoYW5uZWwpOworCS8qIHRoaXMgaXMgdGhlIERJTyBiaXQgd2hpY2ggY2FycmllcyB0aGUgb3B0aW9uYWwgZGlyZWN0aW9uIGJpdCAqLworCXNnbl9tYXNrID0gKDE2IDw8IGNoYW5uZWwpOworCS8qIHRoaXMgaXMgdGhlIGJ1ZmZlciB3aGljaCB3aWxsIGJlIGZpbGxlZCB3aXRoIHRoZSB3aXRoIGJpdCAqLworCS8qIHBhdHRlcm4gZm9yIG9uZSBwZXJpb2QgKi8KKwlzemJ1ZiA9IHRoaXNfdXNiZHV4c3ViLT5zaXplUHdtQnVmOworCXBCdWYgPSAoY2hhciAqKSh0aGlzX3VzYmR1eHN1Yi0+dXJiUHdtLT50cmFuc2Zlcl9idWZmZXIpOworCWZvciAoaSA9IDA7IGkgPCBzemJ1ZjsgaSsrKSB7CisJCWMgPSAqcEJ1ZjsKKwkJLyogcmVzZXQgYml0cyAqLworCQljID0gYyAmICh+cHdtX21hc2spOworCQkvKiBzZXQgdGhlIGJpdCBhcyBsb25nIGFzIHRoZSBpbmRleCBpcyBsb3dlciB0aGFuIHRoZSB2YWx1ZSAqLworCQlpZiAoaSA8IHZhbHVlKQorCQkJYyA9IGMgfCBwd21fbWFzazsKKwkJLyogc2V0IHRoZSBvcHRpb25hbCBzaWduIGJpdCBmb3IgYSByZWxheSAqLworCQlpZiAoIXNpZ24pIHsKKwkJCS8qIHBvc2l0aXZlIHZhbHVlICovCisJCQljID0gYyAmICh+c2duX21hc2spOworCQl9IGVsc2UgeworCQkJLyogbmVnYXRpdmUgdmFsdWUgKi8KKwkJCWMgPSBjIHwgc2duX21hc2s7CisJCX0KKwkJKihwQnVmKyspID0gYzsKKwl9CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgdXNiZHV4X3B3bV93cml0ZShjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkgICAgY29tZWRpX2luc24gKmluc24sIGxzYW1wbF90ICpkYXRhKQoreworCXN0cnVjdCB1c2JkdXhzdWIgKnRoaXNfdXNiZHV4c3ViID0gZGV2LT5wcml2YXRlOworCisJaWYgKCF0aGlzX3VzYmR1eHN1YikKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoKGluc24tPm4pICE9IDEpIHsKKwkJLyoKKwkJICogZG9lc24ndCBtYWtlIHNlbnNlIHRvIGhhdmUgbW9yZSB0aGFuIG9uZSB2YWx1ZSBoZXJlIGJlY2F1c2UKKwkJICogaXQgd291bGQganVzdCBvdmVyd3JpdGUgdGhlIFBXTSBidWZmZXIgYSBjb3VwbGUgb2YgdGltZXMKKwkJICovCisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qCisJICogdGhlIHNpZ24gaXMgc2V0IHZpYSBhIHNwZWNpYWwgSU5TTiBvbmx5LCB0aGlzIGdpdmVzIHVzIDggYml0cyBmb3IKKwkgKiBub3JtYWwgb3BlcmF0aW9uCisJICogcmVsYXkgc2lnbiAwIGJ5IGRlZmF1bHQKKwkgKi8KKwlyZXR1cm4gdXNiZHV4X3B3bV9wYXR0ZXJuKGRldiwgcywgQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyksCisJCQkJICBkYXRhWzBdLCAwKTsKK30KKworc3RhdGljIGludCB1c2JkdXhfcHdtX3JlYWQoY29tZWRpX2RldmljZSAqeDEsIGNvbWVkaV9zdWJkZXZpY2UgKngyLAorCQkJICAgY29tZWRpX2luc24gKngzLCBsc2FtcGxfdCAqeDQpCit7CisJLyogbm90IG5lZWRlZCAqLworCXJldHVybiAtRUlOVkFMOworfTsKKworLyogc3dpdGNoZXMgb24vb2ZmIFBXTSAqLworc3RhdGljIGludCB1c2JkdXhfcHdtX2NvbmZpZyhjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkgICAgIGNvbWVkaV9pbnNuICppbnNuLCBsc2FtcGxfdCAqZGF0YSkKK3sKKwlzdHJ1Y3QgdXNiZHV4c3ViICp0aGlzX3VzYmR1eHN1YiA9IGRldi0+cHJpdmF0ZTsKKwlzd2l0Y2ggKGRhdGFbMF0pIHsKKwljYXNlIElOU05fQ09ORklHX0FSTToKKwkJLyogc3dpdGNoIGl0IG9uICovCisJCWRldl9kYmcoJnRoaXNfdXNiZHV4c3ViLT5pbnRlcmZhY2UtPmRldiwKKwkJCSJjb21lZGklZDogJXM6IHB3bSBvblxuIiwgZGV2LT5taW5vciwgX19mdW5jX18pOworCQkvKgorCQkgKiBpZiBub3QgemVybyB0aGUgUFdNIGlzIGxpbWl0ZWQgdG8gYSBjZXJ0YWluIHRpbWUgd2hpY2ggaXMKKwkJICogbm90IHN1cHBvcnRlZCBoZXJlCisJCSAqLworCQlpZiAoZGF0YVsxXSAhPSAwKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCXJldHVybiB1c2JkdXhfcHdtX3N0YXJ0KGRldiwgcyk7CisJY2FzZSBJTlNOX0NPTkZJR19ESVNBUk06CisJCWRldl9kYmcoJnRoaXNfdXNiZHV4c3ViLT5pbnRlcmZhY2UtPmRldiwKKwkJCSJjb21lZGklZDogJXM6IHB3bSBvZmZcbiIsIGRldi0+bWlub3IsIF9fZnVuY19fKTsKKwkJcmV0dXJuIHVzYmR1eF9wd21fY2FuY2VsKGRldiwgcyk7CisJY2FzZSBJTlNOX0NPTkZJR19HRVRfUFdNX1NUQVRVUzoKKwkJLyoKKwkJICogdG8gY2hlY2sgaWYgdGhlIFVTQiB0cmFuc21pc3Npb24gaGFzIGZhaWxlZCBvciBpbiBjYXNlIFBXTQorCQkgKiB3YXMgbGltaXRlZCB0byBuIGN5Y2xlcyB0byBjaGVjayBpZiBpdCBoYXMgdGVybWluYXRlZAorCQkgKi8KKwkJZGF0YVsxXSA9IHRoaXNfdXNiZHV4c3ViLT5wd21fY21kX3J1bm5pbmc7CisJCXJldHVybiAwOworCWNhc2UgSU5TTl9DT05GSUdfUFdNX1NFVF9QRVJJT0Q6CisJCWRldl9kYmcoJnRoaXNfdXNiZHV4c3ViLT5pbnRlcmZhY2UtPmRldiwKKwkJCSJjb21lZGklZDogJXM6IHNldHRpbmcgcGVyaW9kXG4iLCBkZXYtPm1pbm9yLCBfX2Z1bmNfXyk7CisJCXJldHVybiB1c2JkdXhfcHdtX3BlcmlvZChkZXYsIHMsIGRhdGFbMV0pOworCWNhc2UgSU5TTl9DT05GSUdfUFdNX0dFVF9QRVJJT0Q6CisJCWRhdGFbMV0gPSB0aGlzX3VzYmR1eHN1Yi0+cHdtUGVyaW9kOworCQlyZXR1cm4gMDsKKwljYXNlIElOU05fQ09ORklHX1BXTV9TRVRfSF9CUklER0U6CisJCS8qIHZhbHVlIGluIHRoZSBmaXJzdCBieXRlIGFuZCB0aGUgc2lnbiBpbiB0aGUgc2Vjb25kIGZvciBhCisJCSAgIHJlbGF5ICovCisJCXJldHVybiB1c2JkdXhfcHdtX3BhdHRlcm4oZGV2LCBzLAorCQkJCQkgIC8qIHRoZSBjaGFubmVsIG51bWJlciAqLworCQkJCQkgIENSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpLAorCQkJCQkgIC8qIGFjdHVhbCBQV00gZGF0YSAqLworCQkJCQkgIGRhdGFbMV0sCisJCQkJCSAgLyoganVzdCBhIHNpZ24gKi8KKwkJCQkJICAoZGF0YVsyXSAhPSAwKSk7CisJY2FzZSBJTlNOX0NPTkZJR19QV01fR0VUX0hfQlJJREdFOgorCQkvKiB2YWx1ZXMgYXJlIG5vdCBrZXB0IGluIHRoaXMgZHJpdmVyLCBub3RoaW5nIHRvIHJldHVybiBoZXJlICovCisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gLUVJTlZBTDsKK30KKworLyogZW5kIG9mIFBXTSAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCB0aWR5X3VwKHN0cnVjdCB1c2JkdXhzdWIgKnVzYmR1eHN1Yl90bXApCit7CisJaW50IGk7CisKKwlpZiAoIXVzYmR1eHN1Yl90bXApCisJCXJldHVybjsKKwlkZXZfZGJnKCZ1c2JkdXhzdWJfdG1wLT5pbnRlcmZhY2UtPmRldiwgImNvbWVkaV86IHRpZGluZyB1cFxuIik7CisKKwkvKiBzaG93cyB0aGUgdXNiIHN1YnN5c3RlbSB0aGF0IHRoZSBkcml2ZXIgaXMgZG93biAqLworCWlmICh1c2JkdXhzdWJfdG1wLT5pbnRlcmZhY2UpCisJCXVzYl9zZXRfaW50ZmRhdGEodXNiZHV4c3ViX3RtcC0+aW50ZXJmYWNlLCBOVUxMKTsKKworCXVzYmR1eHN1Yl90bXAtPnByb2JlZCA9IDA7CisKKwlpZiAodXNiZHV4c3ViX3RtcC0+dXJiSW4pIHsKKwkJaWYgKHVzYmR1eHN1Yl90bXAtPmFpX2NtZF9ydW5uaW5nKSB7CisJCQl1c2JkdXhzdWJfdG1wLT5haV9jbWRfcnVubmluZyA9IDA7CisJCQl1c2JkdXhzdWJfdW5saW5rX0luVVJCcyh1c2JkdXhzdWJfdG1wKTsKKwkJfQorCQlmb3IgKGkgPSAwOyBpIDwgdXNiZHV4c3ViX3RtcC0+bnVtT2ZJbkJ1ZmZlcnM7IGkrKykgeworCQkJa2ZyZWUodXNiZHV4c3ViX3RtcC0+dXJiSW5baV0tPnRyYW5zZmVyX2J1ZmZlcik7CisJCQl1c2JkdXhzdWJfdG1wLT51cmJJbltpXS0+dHJhbnNmZXJfYnVmZmVyID0gTlVMTDsKKwkJCXVzYl9raWxsX3VyYih1c2JkdXhzdWJfdG1wLT51cmJJbltpXSk7CisJCQl1c2JfZnJlZV91cmIodXNiZHV4c3ViX3RtcC0+dXJiSW5baV0pOworCQkJdXNiZHV4c3ViX3RtcC0+dXJiSW5baV0gPSBOVUxMOworCQl9CisJCWtmcmVlKHVzYmR1eHN1Yl90bXAtPnVyYkluKTsKKwkJdXNiZHV4c3ViX3RtcC0+dXJiSW4gPSBOVUxMOworCX0KKwlpZiAodXNiZHV4c3ViX3RtcC0+dXJiT3V0KSB7CisJCWlmICh1c2JkdXhzdWJfdG1wLT5hb19jbWRfcnVubmluZykgeworCQkJdXNiZHV4c3ViX3RtcC0+YW9fY21kX3J1bm5pbmcgPSAwOworCQkJdXNiZHV4c3ViX3VubGlua19PdXRVUkJzKHVzYmR1eHN1Yl90bXApOworCQl9CisJCWZvciAoaSA9IDA7IGkgPCB1c2JkdXhzdWJfdG1wLT5udW1PZk91dEJ1ZmZlcnM7IGkrKykgeworCQkJaWYgKHVzYmR1eHN1Yl90bXAtPnVyYk91dFtpXS0+dHJhbnNmZXJfYnVmZmVyKSB7CisJCQkJa2ZyZWUodXNiZHV4c3ViX3RtcC0+dXJiT3V0W2ldLT4KKwkJCQkJdHJhbnNmZXJfYnVmZmVyKTsKKwkJCQl1c2JkdXhzdWJfdG1wLT51cmJPdXRbaV0tPnRyYW5zZmVyX2J1ZmZlciA9CisJCQkJCU5VTEw7CisJCQl9CisJCQlpZiAodXNiZHV4c3ViX3RtcC0+dXJiT3V0W2ldKSB7CisJCQkJdXNiX2tpbGxfdXJiKHVzYmR1eHN1Yl90bXAtPnVyYk91dFtpXSk7CisJCQkJdXNiX2ZyZWVfdXJiKHVzYmR1eHN1Yl90bXAtPnVyYk91dFtpXSk7CisJCQkJdXNiZHV4c3ViX3RtcC0+dXJiT3V0W2ldID0gTlVMTDsKKwkJCX0KKwkJfQorCQlrZnJlZSh1c2JkdXhzdWJfdG1wLT51cmJPdXQpOworCQl1c2JkdXhzdWJfdG1wLT51cmJPdXQgPSBOVUxMOworCX0KKwlpZiAodXNiZHV4c3ViX3RtcC0+dXJiUHdtKSB7CisJCWlmICh1c2JkdXhzdWJfdG1wLT5wd21fY21kX3J1bm5pbmcpIHsKKwkJCXVzYmR1eHN1Yl90bXAtPnB3bV9jbWRfcnVubmluZyA9IDA7CisJCQl1c2JkdXhzdWJfdW5saW5rX1B3bVVSQnModXNiZHV4c3ViX3RtcCk7CisJCX0KKwkJa2ZyZWUodXNiZHV4c3ViX3RtcC0+dXJiUHdtLT50cmFuc2Zlcl9idWZmZXIpOworCQl1c2JkdXhzdWJfdG1wLT51cmJQd20tPnRyYW5zZmVyX2J1ZmZlciA9IE5VTEw7CisJCXVzYl9raWxsX3VyYih1c2JkdXhzdWJfdG1wLT51cmJQd20pOworCQl1c2JfZnJlZV91cmIodXNiZHV4c3ViX3RtcC0+dXJiUHdtKTsKKwkJdXNiZHV4c3ViX3RtcC0+dXJiUHdtID0gTlVMTDsKKwl9CisJa2ZyZWUodXNiZHV4c3ViX3RtcC0+aW5CdWZmZXIpOworCXVzYmR1eHN1Yl90bXAtPmluQnVmZmVyID0gTlVMTDsKKwlrZnJlZSh1c2JkdXhzdWJfdG1wLT5pbnNuQnVmZmVyKTsKKwl1c2JkdXhzdWJfdG1wLT5pbnNuQnVmZmVyID0gTlVMTDsKKwlrZnJlZSh1c2JkdXhzdWJfdG1wLT5pbkJ1ZmZlcik7CisJdXNiZHV4c3ViX3RtcC0+aW5CdWZmZXIgPSBOVUxMOworCWtmcmVlKHVzYmR1eHN1Yl90bXAtPmRhY19jb21tYW5kcyk7CisJdXNiZHV4c3ViX3RtcC0+ZGFjX2NvbW1hbmRzID0gTlVMTDsKKwlrZnJlZSh1c2JkdXhzdWJfdG1wLT5kdXhfY29tbWFuZHMpOworCXVzYmR1eHN1Yl90bXAtPmR1eF9jb21tYW5kcyA9IE5VTEw7CisJdXNiZHV4c3ViX3RtcC0+YWlfY21kX3J1bm5pbmcgPSAwOworCXVzYmR1eHN1Yl90bXAtPmFvX2NtZF9ydW5uaW5nID0gMDsKKwl1c2JkdXhzdWJfdG1wLT5wd21fY21kX3J1bm5pbmcgPSAwOworfQorCitzdGF0aWMgdW5zaWduZWQgaGV4MnVuc2lnbmVkKGNoYXIgKmgpCit7CisJdW5zaWduZWQgaGksIGxvOworCisJaWYgKGhbMF0gPiAnOScpCisJCWhpID0gaFswXSAtICdBJyArIDB4MGE7CisJZWxzZQorCQloaSA9IGhbMF0gLSAnMCc7CisKKwlpZiAoaFsxXSA+ICc5JykKKwkJbG8gPSBoWzFdIC0gJ0EnICsgMHgwYTsKKwllbHNlCisJCWxvID0gaFsxXSAtICcwJzsKKworCXJldHVybiBoaSAqIDB4MTAgKyBsbzsKK30KKworLyogZm9yIEZYMiAqLworI2RlZmluZSBGSVJNV0FSRV9NQVhfTEVOIDB4MjAwMAorCisvKiB0YWtlbiBmcm9tIERhdmlkIEJyb3duZWxsJ3MgZnhsb2FkIGFuZCBhZGp1c3RlZCBmb3IgdGhpcyBkcml2ZXIgKi8KK3N0YXRpYyBpbnQgcmVhZF9maXJtd2FyZShzdHJ1Y3QgdXNiZHV4c3ViICp1c2JkdXhzdWIsIHZvaWQgKmZpcm13YXJlUHRyLAorCQkJIGxvbmcgc2l6ZSkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmdXNiZHV4c3ViLT5pbnRlcmZhY2UtPmRldjsKKwlpbnQgaSA9IDA7CisJdW5zaWduZWQgY2hhciAqZnAgPSAoY2hhciAqKWZpcm13YXJlUHRyOworCXVuc2lnbmVkIGNoYXIgKmZpcm13YXJlQmluYXJ5ID0gTlVMTDsKKwlpbnQgcmVzID0gMDsKKwlpbnQgbWF4QWRkciA9IDA7CisKKwlmaXJtd2FyZUJpbmFyeSA9IGt6YWxsb2MoRklSTVdBUkVfTUFYX0xFTiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFmaXJtd2FyZUJpbmFyeSkgeworCQlkZXZfZXJyKGRldiwgImNvbWVkaV86IG1lbSBhbGxvYyBmb3IgZmlybXdhcmUgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJZm9yICg7OykgeworCQljaGFyIGJ1ZlsyNTZdLCAqY3A7CisJCWNoYXIgdHlwZTsKKwkJaW50IGxlbjsKKwkJaW50IGlkeCwgb2ZmOworCQlpbnQgaiA9IDA7CisKKwkJLyogZ2V0IG9uZSBsaW5lICovCisJCXdoaWxlICgoaSA8IHNpemUpICYmIChmcFtpXSAhPSAxMykgJiYgKGZwW2ldICE9IDEwKSkgeworCQkJYnVmW2pdID0gZnBbaV07CisJCQlpKys7CisJCQlqKys7CisJCQlpZiAoaiA+PSBzaXplb2YoYnVmKSkgeworCQkJCWRldl9lcnIoZGV2LCAiY29tZWRpXzogYm9ndXMgZmlybXdhcmUgZmlsZSFcbiIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJfQorCQkvKiBnZXQgcmlkIG9mIExGL0NSLy4uLiAqLworCQl3aGlsZSAoKGkgPCBzaXplKSAmJiAoKGZwW2ldID09IDEzKSB8fCAoZnBbaV0gPT0gMTApCisJCQkJfHwgKGZwW2ldID09IDApKSkgeworCQkJaSsrOworCQl9CisKKwkJYnVmW2pdID0gMDsKKwkJLyogZGV2X2RiZyhkZXYsICJjb21lZGlfOiBidWY9JXNcbiIsIGJ1Zik7ICovCisKKwkJLyoKKwkJICogRVhURU5TSU9OOgorCQkgKiAiIyBjb21tZW50LXRpbGwtZW5kLW9mLWxpbmUiLCBmb3IgY29weXJpZ2h0cyBldGMKKwkJICovCisJCWlmIChidWZbMF0gPT0gJyMnKQorCQkJY29udGludWU7CisKKwkJaWYgKGJ1ZlswXSAhPSAnOicpIHsKKwkJCWRldl9lcnIoZGV2LCAiY29tZWRpXzogdXBsb2FkOiBub3QgYW4gaWhleCByZWNvcmQ6ICVzIiwKKwkJCQlidWYpOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKworCQkvKiBSZWFkIHRoZSBsZW5ndGggZmllbGQgKHVwIHRvIDE2IGJ5dGVzKSAqLworCQlsZW4gPSBoZXgydW5zaWduZWQoYnVmICsgMSk7CisKKwkJLyogUmVhZCB0aGUgdGFyZ2V0IG9mZnNldCAqLworCQlvZmYgPSAoaGV4MnVuc2lnbmVkKGJ1ZiArIDMpICogMHgwMTAwKSArIGhleDJ1bnNpZ25lZChidWYgKyA1KTsKKworCQlpZiAoKG9mZiArIGxlbikgPiBtYXhBZGRyKQorCQkJbWF4QWRkciA9IG9mZiArIGxlbjsKKworCisJCWlmIChtYXhBZGRyID49IEZJUk1XQVJFX01BWF9MRU4pIHsKKwkJCWRldl9lcnIoZGV2LCAiY29tZWRpXzogZmlybXdhcmUgdXBsb2FkIGdvZXMgIgorCQkJCSJiZXlvbmQgRlgyIFJBTSBib3VuZGFyaWVzLlxuIik7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCQkvKiBkZXZfZGJnKGRldiwgImNvbWVkaV86IG9mZj0leCwgbGVuPSV4OlxuIiwgb2ZmLCBsZW4pOyAqLworCisJCS8qIFJlYWQgdGhlIHJlY29yZCB0eXBlICovCisJCXR5cGUgPSBoZXgydW5zaWduZWQoYnVmICsgNyk7CisKKwkJLyogSWYgdGhpcyBpcyBhbiBFT0YgcmVjb3JkLCB0aGVuIG1ha2UgaXQgc28uICovCisJCWlmICh0eXBlID09IDEpCisJCQlicmVhazsKKworCisJCWlmICh0eXBlICE9IDApIHsKKwkJCWRldl9lcnIoZGV2LCAiY29tZWRpXzogdW5zdXBwb3J0ZWQgcmVjb3JkIHR5cGU6ICV1XG4iLAorCQkJCXR5cGUpOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKworCQlmb3IgKGlkeCA9IDAsIGNwID0gYnVmICsgOTsgaWR4IDwgbGVuOyBpZHggKz0gMSwgY3AgKz0gMikgeworCQkJZmlybXdhcmVCaW5hcnlbaWR4ICsgb2ZmXSA9IGhleDJ1bnNpZ25lZChjcCk7CisJCQkvKnByaW50aygiJTAyeCAiLGZpcm13YXJlQmluYXJ5W2lkeCtvZmZdKTsgKi8KKwkJfQorCQkvKnByaW50aygiXG4iKTsgKi8KKworCQlpZiAoaSA+PSBzaXplKSB7CisJCQlkZXZfZXJyKGRldiwgImNvbWVkaV86IHVuZXhwZWN0ZWQgZW5kIG9mIGhleCBmaWxlXG4iKTsKKwkJCWJyZWFrOworCQl9CisKKwl9CisJcmVzID0gZmlybXdhcmVVcGxvYWQodXNiZHV4c3ViLCBmaXJtd2FyZUJpbmFyeSwgbWF4QWRkciArIDEpOworCWtmcmVlKGZpcm13YXJlQmluYXJ5KTsKKwlyZXR1cm4gcmVzOworfQorCisvKiBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSB1cmJzIGFuZCBpbml0aWFsaXNlIHRoZW0gKi8KK3N0YXRpYyBpbnQgdXNiZHV4c3ViX3Byb2JlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICp1aW50ZXJmLAorCQkJICAgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKQoreworCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldih1aW50ZXJmKTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmdWludGVyZi0+ZGV2OworCWludCBpOworCWludCBpbmRleDsKKworCWRldl9kYmcoZGV2LCAiY29tZWRpXzogdXNiZHV4XzogIgorCQkiZmluZGluZyBhIGZyZWUgc3RydWN0dXJlIGZvciB0aGUgdXNiLWRldmljZVxuIik7CisKKwlkb3duKCZzdGFydF9zdG9wX3NlbSk7CisJLyogbG9vayBmb3IgYSBmcmVlIHBsYWNlIGluIHRoZSB1c2JkdXggYXJyYXkgKi8KKwlpbmRleCA9IC0xOworCWZvciAoaSA9IDA7IGkgPCBOVU1VU0JEVVg7IGkrKykgeworCQlpZiAoISh1c2JkdXhzdWJbaV0ucHJvYmVkKSkgeworCQkJaW5kZXggPSBpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvKiBubyBtb3JlIHNwYWNlICovCisJaWYgKGluZGV4ID09IC0xKSB7CisJCWRldl9lcnIoZGV2LCAiVG9vIG1hbnkgdXNiZHV4LWRldmljZXMgY29ubmVjdGVkLlxuIik7CisJCXVwKCZzdGFydF9zdG9wX3NlbSk7CisJCXJldHVybiAtRU1GSUxFOworCX0KKwlkZXZfZGJnKGRldiwgImNvbWVkaV86IHVzYmR1eDogIgorCQkidXNiZHV4c3ViWyVkXSBpcyByZWFkeSB0byBjb25uZWN0IHRvIGNvbWVkaS5cbiIsIGluZGV4KTsKKworCWluaXRfTVVURVgoJih1c2JkdXhzdWJbaW5kZXhdLnNlbSkpOworCS8qIHNhdmUgYSBwb2ludGVyIHRvIHRoZSB1c2IgZGV2aWNlICovCisJdXNiZHV4c3ViW2luZGV4XS51c2JkZXYgPSB1ZGV2OworCisJLyogMi42OiBzYXZlIHRoZSBpbnRlcmZhY2UgaXRzZWxmICovCisJdXNiZHV4c3ViW2luZGV4XS5pbnRlcmZhY2UgPSB1aW50ZXJmOworCS8qIGdldCB0aGUgaW50ZXJmYWNlIG51bWJlciBmcm9tIHRoZSBpbnRlcmZhY2UgKi8KKwl1c2JkdXhzdWJbaW5kZXhdLmlmbnVtID0gdWludGVyZi0+YWx0c2V0dGluZy0+ZGVzYy5iSW50ZXJmYWNlTnVtYmVyOworCS8qIGhhbmQgdGhlIHByaXZhdGUgZGF0YSBvdmVyIHRvIHRoZSB1c2Igc3Vic3lzdGVtICovCisJLyogd2lsbCBiZSBuZWVkZWQgZm9yIGRpc2Nvbm5lY3QgKi8KKwl1c2Jfc2V0X2ludGZkYXRhKHVpbnRlcmYsICYodXNiZHV4c3ViW2luZGV4XSkpOworCisJZGV2X2RiZyhkZXYsICJjb21lZGlfOiB1c2JkdXg6IGlmbnVtPSVkXG4iLCB1c2JkdXhzdWJbaW5kZXhdLmlmbnVtKTsKKworCS8qIHRlc3QgaWYgaXQgaXMgaGlnaCBzcGVlZCAoVVNCIDIuMCkgKi8KKwl1c2JkdXhzdWJbaW5kZXhdLmhpZ2hfc3BlZWQgPQorCQkodXNiZHV4c3ViW2luZGV4XS51c2JkZXYtPnNwZWVkID09IFVTQl9TUEVFRF9ISUdIKTsKKworCS8qIGNyZWF0ZSBzcGFjZSBmb3IgdGhlIGNvbW1hbmRzIG9mIHRoZSBEQSBjb252ZXJ0ZXIgKi8KKwl1c2JkdXhzdWJbaW5kZXhdLmRhY19jb21tYW5kcyA9IGt6YWxsb2MoTlVNT1VUQ0hBTk5FTFMsIEdGUF9LRVJORUwpOworCWlmICghdXNiZHV4c3ViW2luZGV4XS5kYWNfY29tbWFuZHMpIHsKKwkJZGV2X2VycihkZXYsICJjb21lZGlfOiB1c2JkdXg6ICIKKwkJCSJlcnJvciBhbGxvYyBzcGFjZSBmb3IgZGFjIGNvbW1hbmRzXG4iKTsKKwkJdGlkeV91cCgmKHVzYmR1eHN1YltpbmRleF0pKTsKKwkJdXAoJnN0YXJ0X3N0b3Bfc2VtKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCS8qIGNyZWF0ZSBzcGFjZSBmb3IgdGhlIGNvbW1hbmRzIGdvaW5nIHRvIHRoZSB1c2IgZGV2aWNlICovCisJdXNiZHV4c3ViW2luZGV4XS5kdXhfY29tbWFuZHMgPSBremFsbG9jKFNJWkVPRkRVWEJVRkZFUiwgR0ZQX0tFUk5FTCk7CisJaWYgKCF1c2JkdXhzdWJbaW5kZXhdLmR1eF9jb21tYW5kcykgeworCQlkZXZfZXJyKGRldiwgImNvbWVkaV86IHVzYmR1eDogIgorCQkJImVycm9yIGFsbG9jIHNwYWNlIGZvciBkYWMgY29tbWFuZHNcbiIpOworCQl0aWR5X3VwKCYodXNiZHV4c3ViW2luZGV4XSkpOworCQl1cCgmc3RhcnRfc3RvcF9zZW0pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJLyogY3JlYXRlIHNwYWNlIGZvciB0aGUgaW4gYnVmZmVyIGFuZCBzZXQgaXQgdG8gemVybyAqLworCXVzYmR1eHN1YltpbmRleF0uaW5CdWZmZXIgPSBremFsbG9jKFNJWkVJTkJVRiwgR0ZQX0tFUk5FTCk7CisJaWYgKCEodXNiZHV4c3ViW2luZGV4XS5pbkJ1ZmZlcikpIHsKKwkJZGV2X2VycihkZXYsICJjb21lZGlfOiB1c2JkdXg6ICIKKwkJCSJjb3VsZCBub3QgYWxsb2Mgc3BhY2UgZm9yIGluQnVmZmVyXG4iKTsKKwkJdGlkeV91cCgmKHVzYmR1eHN1YltpbmRleF0pKTsKKwkJdXAoJnN0YXJ0X3N0b3Bfc2VtKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCS8qIGNyZWF0ZSBzcGFjZSBvZiB0aGUgaW5zdHJ1Y3Rpb24gYnVmZmVyICovCisJdXNiZHV4c3ViW2luZGV4XS5pbnNuQnVmZmVyID0ga3phbGxvYyhTSVpFSU5TTkJVRiwgR0ZQX0tFUk5FTCk7CisJaWYgKCEodXNiZHV4c3ViW2luZGV4XS5pbnNuQnVmZmVyKSkgeworCQlkZXZfZXJyKGRldiwgImNvbWVkaV86IHVzYmR1eDogIgorCQkJImNvdWxkIG5vdCBhbGxvYyBzcGFjZSBmb3IgaW5zbkJ1ZmZlclxuIik7CisJCXRpZHlfdXAoJih1c2JkdXhzdWJbaW5kZXhdKSk7CisJCXVwKCZzdGFydF9zdG9wX3NlbSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwkvKiBjcmVhdGUgc3BhY2UgZm9yIHRoZSBvdXRidWZmZXIgKi8KKwl1c2JkdXhzdWJbaW5kZXhdLm91dEJ1ZmZlciA9IGt6YWxsb2MoU0laRU9VVEJVRiwgR0ZQX0tFUk5FTCk7CisJaWYgKCEodXNiZHV4c3ViW2luZGV4XS5vdXRCdWZmZXIpKSB7CisJCWRldl9lcnIoZGV2LCAiY29tZWRpXzogdXNiZHV4OiAiCisJCQkiY291bGQgbm90IGFsbG9jIHNwYWNlIGZvciBvdXRCdWZmZXJcbiIpOworCQl0aWR5X3VwKCYodXNiZHV4c3ViW2luZGV4XSkpOworCQl1cCgmc3RhcnRfc3RvcF9zZW0pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJLyogc2V0dGluZyB0byBhbHRlcm5hdGUgc2V0dGluZyAzOiBlbmFibGluZyBpc28gZXAgYW5kIGJ1bGsgZXAuICovCisJaSA9IHVzYl9zZXRfaW50ZXJmYWNlKHVzYmR1eHN1YltpbmRleF0udXNiZGV2LAorCQkJICAgICAgdXNiZHV4c3ViW2luZGV4XS5pZm51bSwgMyk7CisJaWYgKGkgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAiY29tZWRpXzogdXNiZHV4JWQ6ICIKKwkJCSJjb3VsZCBub3Qgc2V0IGFsdGVybmF0ZSBzZXR0aW5nIDMgaW4gaGlnaCBzcGVlZC5cbiIsCisJCQlpbmRleCk7CisJCXRpZHlfdXAoJih1c2JkdXhzdWJbaW5kZXhdKSk7CisJCXVwKCZzdGFydF9zdG9wX3NlbSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKwlpZiAodXNiZHV4c3ViW2luZGV4XS5oaWdoX3NwZWVkKQorCQl1c2JkdXhzdWJbaW5kZXhdLm51bU9mSW5CdWZmZXJzID0gTlVNT0ZJTkJVRkZFUlNISUdIOworCWVsc2UKKwkJdXNiZHV4c3ViW2luZGV4XS5udW1PZkluQnVmZmVycyA9IE5VTU9GSU5CVUZGRVJTRlVMTDsKKworCXVzYmR1eHN1YltpbmRleF0udXJiSW4gPQorCQlremFsbG9jKHNpemVvZihzdHJ1Y3QgdXJiICopICogdXNiZHV4c3ViW2luZGV4XS5udW1PZkluQnVmZmVycywKKwkJR0ZQX0tFUk5FTCk7CisJaWYgKCEodXNiZHV4c3ViW2luZGV4XS51cmJJbikpIHsKKwkJZGV2X2VycihkZXYsICJjb21lZGlfOiB1c2JkdXg6IENvdWxkIG5vdCBhbGxvYy4gdXJiSW4gYXJyYXlcbiIpOworCQl0aWR5X3VwKCYodXNiZHV4c3ViW2luZGV4XSkpOworCQl1cCgmc3RhcnRfc3RvcF9zZW0pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJZm9yIChpID0gMDsgaSA8IHVzYmR1eHN1YltpbmRleF0ubnVtT2ZJbkJ1ZmZlcnM7IGkrKykgeworCQkvKiBvbmUgZnJhbWU6IDFtcyAqLworCQl1c2JkdXhzdWJbaW5kZXhdLnVyYkluW2ldID0gdXNiX2FsbG9jX3VyYigxLCBHRlBfS0VSTkVMKTsKKwkJaWYgKHVzYmR1eHN1YltpbmRleF0udXJiSW5baV0gPT0gTlVMTCkgeworCQkJZGV2X2VycihkZXYsICJjb21lZGlfOiB1c2JkdXglZDogIgorCQkJCSJDb3VsZCBub3QgYWxsb2MuIHVyYiglZClcbiIsIGluZGV4LCBpKTsKKwkJCXRpZHlfdXAoJih1c2JkdXhzdWJbaW5kZXhdKSk7CisJCQl1cCgmc3RhcnRfc3RvcF9zZW0pOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJdXNiZHV4c3ViW2luZGV4XS51cmJJbltpXS0+ZGV2ID0gdXNiZHV4c3ViW2luZGV4XS51c2JkZXY7CisJCS8qIHdpbGwgYmUgZmlsbGVkIGxhdGVyIHdpdGggYSBwb2ludGVyIHRvIHRoZSBjb21lZGktZGV2aWNlICovCisJCS8qIGFuZCBPTkxZIHRoZW4gdGhlIHVyYiBzaG91bGQgYmUgc3VibWl0dGVkICovCisJCXVzYmR1eHN1YltpbmRleF0udXJiSW5baV0tPmNvbnRleHQgPSBOVUxMOworCQl1c2JkdXhzdWJbaW5kZXhdLnVyYkluW2ldLT5waXBlID0KKwkJCXVzYl9yY3Zpc29jcGlwZSh1c2JkdXhzdWJbaW5kZXhdLnVzYmRldiwgSVNPSU5FUCk7CisJCXVzYmR1eHN1YltpbmRleF0udXJiSW5baV0tPnRyYW5zZmVyX2ZsYWdzID0gVVJCX0lTT19BU0FQOworCQl1c2JkdXhzdWJbaW5kZXhdLnVyYkluW2ldLT50cmFuc2Zlcl9idWZmZXIgPQorCQkJa3phbGxvYyhTSVpFSU5CVUYsIEdGUF9LRVJORUwpOworCQlpZiAoISh1c2JkdXhzdWJbaW5kZXhdLnVyYkluW2ldLT50cmFuc2Zlcl9idWZmZXIpKSB7CisJCQlkZXZfZXJyKGRldiwgImNvbWVkaV86IHVzYmR1eCVkOiAiCisJCQkJImNvdWxkIG5vdCBhbGxvYy4gdHJhbnNiLlxuIiwgaW5kZXgpOworCQkJdGlkeV91cCgmKHVzYmR1eHN1YltpbmRleF0pKTsKKwkJCXVwKCZzdGFydF9zdG9wX3NlbSk7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCQl1c2JkdXhzdWJbaW5kZXhdLnVyYkluW2ldLT5jb21wbGV0ZSA9IHVzYmR1eHN1Yl9haV9Jc29jSXJxOworCQl1c2JkdXhzdWJbaW5kZXhdLnVyYkluW2ldLT5udW1iZXJfb2ZfcGFja2V0cyA9IDE7CisJCXVzYmR1eHN1YltpbmRleF0udXJiSW5baV0tPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPSBTSVpFSU5CVUY7CisJCXVzYmR1eHN1YltpbmRleF0udXJiSW5baV0tPmlzb19mcmFtZV9kZXNjWzBdLm9mZnNldCA9IDA7CisJCXVzYmR1eHN1YltpbmRleF0udXJiSW5baV0tPmlzb19mcmFtZV9kZXNjWzBdLmxlbmd0aCA9IFNJWkVJTkJVRjsKKwl9CisKKwkvKiBvdXQgKi8KKwlpZiAodXNiZHV4c3ViW2luZGV4XS5oaWdoX3NwZWVkKQorCQl1c2JkdXhzdWJbaW5kZXhdLm51bU9mT3V0QnVmZmVycyA9IE5VTU9GT1VUQlVGRkVSU0hJR0g7CisJZWxzZQorCQl1c2JkdXhzdWJbaW5kZXhdLm51bU9mT3V0QnVmZmVycyA9IE5VTU9GT1VUQlVGRkVSU0ZVTEw7CisKKwl1c2JkdXhzdWJbaW5kZXhdLnVyYk91dCA9CisJCWt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB1cmIgKikgKiB1c2JkdXhzdWJbaW5kZXhdLm51bU9mT3V0QnVmZmVycywKKwkJR0ZQX0tFUk5FTCk7CisJaWYgKCEodXNiZHV4c3ViW2luZGV4XS51cmJPdXQpKSB7CisJCWRldl9lcnIoZGV2LCAiY29tZWRpXzogdXNiZHV4OiAiCisJCQkiQ291bGQgbm90IGFsbG9jLiB1cmJPdXQgYXJyYXlcbiIpOworCQl0aWR5X3VwKCYodXNiZHV4c3ViW2luZGV4XSkpOworCQl1cCgmc3RhcnRfc3RvcF9zZW0pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJZm9yIChpID0gMDsgaSA8IHVzYmR1eHN1YltpbmRleF0ubnVtT2ZPdXRCdWZmZXJzOyBpKyspIHsKKwkJLyogb25lIGZyYW1lOiAxbXMgKi8KKwkJdXNiZHV4c3ViW2luZGV4XS51cmJPdXRbaV0gPSB1c2JfYWxsb2NfdXJiKDEsIEdGUF9LRVJORUwpOworCQlpZiAodXNiZHV4c3ViW2luZGV4XS51cmJPdXRbaV0gPT0gTlVMTCkgeworCQkJZGV2X2VycihkZXYsICJjb21lZGlfOiB1c2JkdXglZDogIgorCQkJCSJDb3VsZCBub3QgYWxsb2MuIHVyYiglZClcbiIsIGluZGV4LCBpKTsKKwkJCXRpZHlfdXAoJih1c2JkdXhzdWJbaW5kZXhdKSk7CisJCQl1cCgmc3RhcnRfc3RvcF9zZW0pOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJdXNiZHV4c3ViW2luZGV4XS51cmJPdXRbaV0tPmRldiA9IHVzYmR1eHN1YltpbmRleF0udXNiZGV2OworCQkvKiB3aWxsIGJlIGZpbGxlZCBsYXRlciB3aXRoIGEgcG9pbnRlciB0byB0aGUgY29tZWRpLWRldmljZSAqLworCQkvKiBhbmQgT05MWSB0aGVuIHRoZSB1cmIgc2hvdWxkIGJlIHN1Ym1pdHRlZCAqLworCQl1c2JkdXhzdWJbaW5kZXhdLnVyYk91dFtpXS0+Y29udGV4dCA9IE5VTEw7CisJCXVzYmR1eHN1YltpbmRleF0udXJiT3V0W2ldLT5waXBlID0KKwkJCXVzYl9zbmRpc29jcGlwZSh1c2JkdXhzdWJbaW5kZXhdLnVzYmRldiwgSVNPT1VURVApOworCQl1c2JkdXhzdWJbaW5kZXhdLnVyYk91dFtpXS0+dHJhbnNmZXJfZmxhZ3MgPSBVUkJfSVNPX0FTQVA7CisJCXVzYmR1eHN1YltpbmRleF0udXJiT3V0W2ldLT50cmFuc2Zlcl9idWZmZXIgPQorCQkJa3phbGxvYyhTSVpFT1VUQlVGLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCEodXNiZHV4c3ViW2luZGV4XS51cmJPdXRbaV0tPnRyYW5zZmVyX2J1ZmZlcikpIHsKKwkJCWRldl9lcnIoZGV2LCAiY29tZWRpXzogdXNiZHV4JWQ6ICIKKwkJCQkiY291bGQgbm90IGFsbG9jLiB0cmFuc2IuXG4iLCBpbmRleCk7CisJCQl0aWR5X3VwKCYodXNiZHV4c3ViW2luZGV4XSkpOworCQkJdXAoJnN0YXJ0X3N0b3Bfc2VtKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCXVzYmR1eHN1YltpbmRleF0udXJiT3V0W2ldLT5jb21wbGV0ZSA9IHVzYmR1eHN1Yl9hb19Jc29jSXJxOworCQl1c2JkdXhzdWJbaW5kZXhdLnVyYk91dFtpXS0+bnVtYmVyX29mX3BhY2tldHMgPSAxOworCQl1c2JkdXhzdWJbaW5kZXhdLnVyYk91dFtpXS0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCA9IFNJWkVPVVRCVUY7CisJCXVzYmR1eHN1YltpbmRleF0udXJiT3V0W2ldLT5pc29fZnJhbWVfZGVzY1swXS5vZmZzZXQgPSAwOworCQl1c2JkdXhzdWJbaW5kZXhdLnVyYk91dFtpXS0+aXNvX2ZyYW1lX2Rlc2NbMF0ubGVuZ3RoID0KKwkJCVNJWkVPVVRCVUY7CisJCWlmICh1c2JkdXhzdWJbaW5kZXhdLmhpZ2hfc3BlZWQpIHsKKwkJCS8qIHVmcmFtZXMgKi8KKwkJCXVzYmR1eHN1YltpbmRleF0udXJiT3V0W2ldLT5pbnRlcnZhbCA9IDg7CisJCX0gZWxzZSB7CisJCQkvKiBmcmFtZXMgKi8KKwkJCXVzYmR1eHN1YltpbmRleF0udXJiT3V0W2ldLT5pbnRlcnZhbCA9IDE7CisJCX0KKwl9CisKKwkvKiBwd20gKi8KKwlpZiAodXNiZHV4c3ViW2luZGV4XS5oaWdoX3NwZWVkKSB7CisJCS8qIG1heCBidWxrIGVwIHNpemUgaW4gaGlnaCBzcGVlZCAqLworCQl1c2JkdXhzdWJbaW5kZXhdLnNpemVQd21CdWYgPSA1MTI7CisJCXVzYmR1eHN1YltpbmRleF0udXJiUHdtID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKKwkJaWYgKHVzYmR1eHN1YltpbmRleF0udXJiUHdtID09IE5VTEwpIHsKKwkJCWRldl9lcnIoZGV2LCAiY29tZWRpXzogdXNiZHV4JWQ6ICIKKwkJCQkiQ291bGQgbm90IGFsbG9jLiBwd20gdXJiXG4iLCBpbmRleCk7CisJCQl0aWR5X3VwKCYodXNiZHV4c3ViW2luZGV4XSkpOworCQkJdXAoJnN0YXJ0X3N0b3Bfc2VtKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCXVzYmR1eHN1YltpbmRleF0udXJiUHdtLT50cmFuc2Zlcl9idWZmZXIgPQorCQkJa3phbGxvYyh1c2JkdXhzdWJbaW5kZXhdLnNpemVQd21CdWYsIEdGUF9LRVJORUwpOworCQlpZiAoISh1c2JkdXhzdWJbaW5kZXhdLnVyYlB3bS0+dHJhbnNmZXJfYnVmZmVyKSkgeworCQkJZGV2X2VycihkZXYsICJjb21lZGlfOiB1c2JkdXglZDogIgorCQkJCSJjb3VsZCBub3QgYWxsb2MuIHRyYW5zYi4gZm9yIHB3bVxuIiwgaW5kZXgpOworCQkJdGlkeV91cCgmKHVzYmR1eHN1YltpbmRleF0pKTsKKwkJCXVwKCZzdGFydF9zdG9wX3NlbSk7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCX0gZWxzZSB7CisJCXVzYmR1eHN1YltpbmRleF0udXJiUHdtID0gTlVMTDsKKwkJdXNiZHV4c3ViW2luZGV4XS5zaXplUHdtQnVmID0gMDsKKwl9CisKKwl1c2JkdXhzdWJbaW5kZXhdLmFpX2NtZF9ydW5uaW5nID0gMDsKKwl1c2JkdXhzdWJbaW5kZXhdLmFvX2NtZF9ydW5uaW5nID0gMDsKKwl1c2JkdXhzdWJbaW5kZXhdLnB3bV9jbWRfcnVubmluZyA9IDA7CisKKwkvKiB3ZSd2ZSByZWFjaGVkIHRoZSBib3R0b20gb2YgdGhlIGZ1bmN0aW9uICovCisJdXNiZHV4c3ViW2luZGV4XS5wcm9iZWQgPSAxOworCXVwKCZzdGFydF9zdG9wX3NlbSk7CisJZGV2X2luZm8oZGV2LCAiY29tZWRpXzogdXNiZHV4JWQgIgorCQkgImhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBpbml0aWFsaXNlZC5cbiIsIGluZGV4KTsKKwkvKiBzdWNjZXNzICovCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHVzYmR1eHN1Yl9kaXNjb25uZWN0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQoreworCXN0cnVjdCB1c2JkdXhzdWIgKnVzYmR1eHN1Yl90bXAgPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOworCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldihpbnRmKTsKKworCWlmICghdXNiZHV4c3ViX3RtcCkgeworCQlkZXZfZXJyKCZpbnRmLT5kZXYsCisJCQkiY29tZWRpXzogZGlzY29ubmVjdCBjYWxsZWQgd2l0aCBudWxsIHBvaW50ZXIuXG4iKTsKKwkJcmV0dXJuOworCX0KKwlpZiAodXNiZHV4c3ViX3RtcC0+dXNiZGV2ICE9IHVkZXYpIHsKKwkJZGV2X2VycigmaW50Zi0+ZGV2LAorCQkJImNvbWVkaV86IEJVRyEgY2FsbGVkIHdpdGggd3JvbmcgcHRyISEhXG4iKTsKKwkJcmV0dXJuOworCX0KKwlkb3duKCZzdGFydF9zdG9wX3NlbSk7CisJZG93bigmdXNiZHV4c3ViX3RtcC0+c2VtKTsKKwl0aWR5X3VwKHVzYmR1eHN1Yl90bXApOworCXVwKCZ1c2JkdXhzdWJfdG1wLT5zZW0pOworCXVwKCZzdGFydF9zdG9wX3NlbSk7CisJZGV2X2RiZygmaW50Zi0+ZGV2LCAiY29tZWRpXzogZGlzY29ubmVjdGVkIGZyb20gdGhlIHVzYlxuIik7Cit9CisKKy8qIGlzIGNhbGxlZCB3aGVuIGNvbWVkaS1jb25maWcgaXMgY2FsbGVkICovCitzdGF0aWMgaW50IHVzYmR1eF9hdHRhY2goY29tZWRpX2RldmljZSAqZGV2LCBjb21lZGlfZGV2Y29uZmlnICppdCkKK3sKKwlpbnQgcmV0OworCWludCBpbmRleDsKKwlpbnQgaTsKKwlzdHJ1Y3QgdXNiZHV4c3ViICp1ZGV2OworCisJY29tZWRpX3N1YmRldmljZSAqcyA9IE5VTEw7CisJZGV2LT5wcml2YXRlID0gTlVMTDsKKworCWRvd24oJnN0YXJ0X3N0b3Bfc2VtKTsKKwkvKiBmaW5kIGEgdmFsaWQgZGV2aWNlIHdoaWNoIGhhcyBiZWVuIGRldGVjdGVkIGJ5IHRoZSBwcm9iZSBmdW5jdGlvbiBvZgorCSAqIHRoZSB1c2IgKi8KKwlpbmRleCA9IC0xOworCWZvciAoaSA9IDA7IGkgPCBOVU1VU0JEVVg7IGkrKykgeworCQlpZiAoKHVzYmR1eHN1YltpXS5wcm9iZWQpICYmICghdXNiZHV4c3ViW2ldLmF0dGFjaGVkKSkgeworCQkJaW5kZXggPSBpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoaW5kZXggPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiY29tZWRpJWQ6IHVzYmR1eDogZXJyb3I6IGF0dGFjaCBmYWlsZWQsIG5vICIKKwkJICAgICAgICJ1c2JkdXggZGV2cyBjb25uZWN0ZWQgdG8gdGhlIHVzYiBidXMuXG4iLCBkZXYtPm1pbm9yKTsKKwkJdXAoJnN0YXJ0X3N0b3Bfc2VtKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJdWRldiA9ICZ1c2JkdXhzdWJbaW5kZXhdOworCWRvd24oJnVkZXYtPnNlbSk7CisJLyogcG9pbnRlciBiYWNrIHRvIHRoZSBjb3JyZXNwb25kaW5nIGNvbWVkaSBkZXZpY2UgKi8KKwl1ZGV2LT5jb21lZGlkZXYgPSBkZXY7CisKKwkvKiB0cnlpbmcgdG8gdXBsb2FkIHRoZSBmaXJtd2FyZSBpbnRvIHRoZSBjaGlwICovCisJaWYgKGNvbWVkaV9hdXhfZGF0YShpdC0+b3B0aW9ucywgMCkgJiYKKwkJaXQtPm9wdGlvbnNbQ09NRURJX0RFVkNPTkZfQVVYX0RBVEFfTEVOR1RIXSkgeworCQlyZWFkX2Zpcm13YXJlKHVkZXYsIGNvbWVkaV9hdXhfZGF0YShpdC0+b3B0aW9ucywgMCksCisJCQkgICAgICBpdC0+b3B0aW9uc1tDT01FRElfREVWQ09ORl9BVVhfREFUQV9MRU5HVEhdKTsKKwl9CisKKwlkZXYtPmJvYXJkX25hbWUgPSBCT0FSRE5BTUU7CisKKwkvKiBzZXQgbnVtYmVyIG9mIHN1YmRldmljZXMgKi8KKwlpZiAodWRldi0+aGlnaF9zcGVlZCkgeworCQkvKiB3aXRoIHB3bSAqLworCQlkZXYtPm5fc3ViZGV2aWNlcyA9IDU7CisJfSBlbHNlIHsKKwkJLyogd2l0aG91dCBwd20gKi8KKwkJZGV2LT5uX3N1YmRldmljZXMgPSA0OworCX0KKworCS8qIGFsbG9jYXRlIHNwYWNlIGZvciB0aGUgc3ViZGV2aWNlcyAqLworCXJldCA9IGFsbG9jX3N1YmRldmljZXMoZGV2LCBkZXYtPm5fc3ViZGV2aWNlcyk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycigmdWRldi0+aW50ZXJmYWNlLT5kZXYsCisJCQkiY29tZWRpJWQ6IGVycm9yIGFsbG9jIHNwYWNlIGZvciBzdWJkZXZcbiIsIGRldi0+bWlub3IpOworCQl1cCgmc3RhcnRfc3RvcF9zZW0pOworCQlyZXR1cm4gcmV0OworCX0KKworCWRldl9pbmZvKCZ1ZGV2LT5pbnRlcmZhY2UtPmRldiwKKwkJImNvbWVkaSVkOiB1c2ItZGV2aWNlICVkIGlzIGF0dGFjaGVkIHRvIGNvbWVkaS5cbiIsCisJCWRldi0+bWlub3IsIGluZGV4KTsKKwkvKiBwcml2YXRlIHN0cnVjdHVyZSBpcyBhbHNvIHNpbXBseSB0aGUgdXNiLXN0cnVjdHVyZSAqLworCWRldi0+cHJpdmF0ZSA9IHVkZXY7CisKKwkvKiB0aGUgZmlyc3Qgc3ViZGV2aWNlIGlzIHRoZSBBL0QgY29udmVydGVyICovCisJcyA9IGRldi0+c3ViZGV2aWNlcyArIFNVQkRFVl9BRDsKKwkvKiB0aGUgVVJCcyBnZXQgdGhlIGNvbWVkaSBzdWJkZXZpY2UgKi8KKwkvKiB3aGljaCBpcyByZXNwb25zaWJsZSBmb3IgcmVhZGluZyAqLworCS8qIHRoaXMgaXMgdGhlIHN1YmRldmljZSB3aGljaCByZWFkcyBkYXRhICovCisJZGV2LT5yZWFkX3N1YmRldiA9IHM7CisJLyogdGhlIHN1YmRldmljZSByZWNlaXZlcyBhcyBwcml2YXRlIHN0cnVjdHVyZSB0aGUgKi8KKwkvKiB1c2Itc3RydWN0dXJlICovCisJcy0+cHJpdmF0ZSA9IE5VTEw7CisJLyogYW5hbG9nIGlucHV0ICovCisJcy0+dHlwZSA9IENPTUVESV9TVUJEX0FJOworCS8qIHJlYWRhYmxlIGFuZCByZWYgaXMgdG8gZ3JvdW5kICovCisJcy0+c3ViZGV2X2ZsYWdzID0gU0RGX1JFQURBQkxFIHwgU0RGX0dST1VORCB8IFNERl9DTURfUkVBRDsKKwkvKiA4IGNoYW5uZWxzICovCisJcy0+bl9jaGFuID0gODsKKwkvKiBsZW5ndGggb2YgdGhlIGNoYW5uZWxsaXN0ICovCisJcy0+bGVuX2NoYW5saXN0ID0gODsKKwkvKiBjYWxsYmFjayBmdW5jdGlvbnMgKi8KKwlzLT5pbnNuX3JlYWQgPSB1c2JkdXhfYWlfaW5zbl9yZWFkOworCXMtPmRvX2NtZHRlc3QgPSB1c2JkdXhfYWlfY21kdGVzdDsKKwlzLT5kb19jbWQgPSB1c2JkdXhfYWlfY21kOworCXMtPmNhbmNlbCA9IHVzYmR1eF9haV9jYW5jZWw7CisJLyogbWF4IHZhbHVlIGZyb20gdGhlIEEvRCBjb252ZXJ0ZXIgKDEyYml0KSAqLworCXMtPm1heGRhdGEgPSAweGZmZjsKKwkvKiByYW5nZSB0YWJsZSB0byBjb252ZXJ0IHRvIHBoeXNpY2FsIHVuaXRzICovCisJcy0+cmFuZ2VfdGFibGUgPSAoJnJhbmdlX3VzYmR1eF9haV9yYW5nZSk7CisKKwkvKiBhbmFsb2cgb3V0ICovCisJcyA9IGRldi0+c3ViZGV2aWNlcyArIFNVQkRFVl9EQTsKKwkvKiBhbmFsb2cgb3V0ICovCisJcy0+dHlwZSA9IENPTUVESV9TVUJEX0FPOworCS8qIGJhY2t3YXJkIHBvaW50ZXIgKi8KKwlkZXYtPndyaXRlX3N1YmRldiA9IHM7CisJLyogdGhlIHN1YmRldmljZSByZWNlaXZlcyBhcyBwcml2YXRlIHN0cnVjdHVyZSB0aGUgKi8KKwkvKiB1c2Itc3RydWN0dXJlICovCisJcy0+cHJpdmF0ZSA9IE5VTEw7CisJLyogYXJlIHdyaXRhYmxlICovCisJcy0+c3ViZGV2X2ZsYWdzID0gU0RGX1dSSVRBQkxFIHwgU0RGX0dST1VORCB8IFNERl9DTURfV1JJVEU7CisJLyogNCBjaGFubmVscyAqLworCXMtPm5fY2hhbiA9IDQ7CisJLyogbGVuZ3RoIG9mIHRoZSBjaGFubmVsbGlzdCAqLworCXMtPmxlbl9jaGFubGlzdCA9IDQ7CisJLyogMTIgYml0IHJlc29sdXRpb24gKi8KKwlzLT5tYXhkYXRhID0gMHgwZmZmOworCS8qIGJpcG9sYXIgcmFuZ2UgKi8KKwlzLT5yYW5nZV90YWJsZSA9ICgmcmFuZ2VfdXNiZHV4X2FvX3JhbmdlKTsKKwkvKiBjYWxsYmFjayAqLworCXMtPmRvX2NtZHRlc3QgPSB1c2JkdXhfYW9fY21kdGVzdDsKKwlzLT5kb19jbWQgPSB1c2JkdXhfYW9fY21kOworCXMtPmNhbmNlbCA9IHVzYmR1eF9hb19jYW5jZWw7CisJcy0+aW5zbl9yZWFkID0gdXNiZHV4X2FvX2luc25fcmVhZDsKKwlzLT5pbnNuX3dyaXRlID0gdXNiZHV4X2FvX2luc25fd3JpdGU7CisKKwkvKiBkaWdpdGFsIEkvTyAqLworCXMgPSBkZXYtPnN1YmRldmljZXMgKyBTVUJERVZfRElPOworCXMtPnR5cGUgPSBDT01FRElfU1VCRF9ESU87CisJcy0+c3ViZGV2X2ZsYWdzID0gU0RGX1JFQURBQkxFIHwgU0RGX1dSSVRBQkxFOworCXMtPm5fY2hhbiA9IDg7CisJcy0+bWF4ZGF0YSA9IDE7CisJcy0+cmFuZ2VfdGFibGUgPSAoJnJhbmdlX2RpZ2l0YWwpOworCXMtPmluc25fYml0cyA9IHVzYmR1eF9kaW9faW5zbl9iaXRzOworCXMtPmluc25fY29uZmlnID0gdXNiZHV4X2Rpb19pbnNuX2NvbmZpZzsKKwkvKiB3ZSBkb24ndCB1c2UgaXQgKi8KKwlzLT5wcml2YXRlID0gTlVMTDsKKworCS8qIGNvdW50ZXIgKi8KKwlzID0gZGV2LT5zdWJkZXZpY2VzICsgU1VCREVWX0NPVU5URVI7CisJcy0+dHlwZSA9IENPTUVESV9TVUJEX0NPVU5URVI7CisJcy0+c3ViZGV2X2ZsYWdzID0gU0RGX1dSSVRBQkxFIHwgU0RGX1JFQURBQkxFOworCXMtPm5fY2hhbiA9IDQ7CisJcy0+bWF4ZGF0YSA9IDB4RkZGRjsKKwlzLT5pbnNuX3JlYWQgPSB1c2JkdXhfY291bnRlcl9yZWFkOworCXMtPmluc25fd3JpdGUgPSB1c2JkdXhfY291bnRlcl93cml0ZTsKKwlzLT5pbnNuX2NvbmZpZyA9IHVzYmR1eF9jb3VudGVyX2NvbmZpZzsKKworCWlmICh1ZGV2LT5oaWdoX3NwZWVkKSB7CisJCS8qIHRpbWVyIC8gcHdtICovCisJCXMgPSBkZXYtPnN1YmRldmljZXMgKyBTVUJERVZfUFdNOworCQlzLT50eXBlID0gQ09NRURJX1NVQkRfUFdNOworCQlzLT5zdWJkZXZfZmxhZ3MgPSBTREZfV1JJVEFCTEUgfCBTREZfUFdNX0hCUklER0U7CisJCXMtPm5fY2hhbiA9IDg7CisJCS8qIHRoaXMgZGVmaW5lcyB0aGUgbWF4IGR1dHkgY3ljbGUgcmVzb2x1dGlvbiAqLworCQlzLT5tYXhkYXRhID0gdWRldi0+c2l6ZVB3bUJ1ZjsKKwkJcy0+aW5zbl93cml0ZSA9IHVzYmR1eF9wd21fd3JpdGU7CisJCXMtPmluc25fcmVhZCA9IHVzYmR1eF9wd21fcmVhZDsKKwkJcy0+aW5zbl9jb25maWcgPSB1c2JkdXhfcHdtX2NvbmZpZzsKKwkJdXNiZHV4X3B3bV9wZXJpb2QoZGV2LCBzLCBQV01fREVGQVVMVF9QRVJJT0QpOworCX0KKwkvKiBmaW5hbGx5IGRlY2lkZSB0aGF0IGl0J3MgYXR0YWNoZWQgKi8KKwl1ZGV2LT5hdHRhY2hlZCA9IDE7CisKKwl1cCgmdWRldi0+c2VtKTsKKworCXVwKCZzdGFydF9zdG9wX3NlbSk7CisKKwlkZXZfaW5mbygmdWRldi0+aW50ZXJmYWNlLT5kZXYsICJjb21lZGklZDogYXR0YWNoZWQgdG8gdXNiZHV4LlxuIiwKKwkJIGRldi0+bWlub3IpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdXNiZHV4X2RldGFjaChjb21lZGlfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHVzYmR1eHN1YiAqdXNiZHV4c3ViX3RtcDsKKworCWlmICghZGV2KSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkJImNvbWVkaT86IHVzYmR1eDogZGV0YWNoIHdpdGhvdXQgZGV2IHZhcmlhYmxlLi4uXG4iKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJdXNiZHV4c3ViX3RtcCA9IGRldi0+cHJpdmF0ZTsKKwlpZiAoIXVzYmR1eHN1Yl90bXApIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCQkiY29tZWRpPzogdXNiZHV4OiBkZXRhY2ggd2l0aG91dCBwdHIgdG8gdXNiZHV4c3ViW11cbiIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlkZXZfZGJnKCZ1c2JkdXhzdWJfdG1wLT5pbnRlcmZhY2UtPmRldiwgImNvbWVkaSVkOiBkZXRhY2ggdXNiIGRldmljZVxuIiwKKwkJZGV2LT5taW5vcik7CisKKwlkb3duKCZ1c2JkdXhzdWJfdG1wLT5zZW0pOworCS8qIERvbid0IGFsbG93IGRldGFjaCB0byBmcmVlIHRoZSBwcml2YXRlIHN0cnVjdHVyZSAqLworCS8qIEl0J3Mgb25lIGVudHJ5IG9mIG9mIHVzYmR1eHN1YltdICovCisJZGV2LT5wcml2YXRlID0gTlVMTDsKKwl1c2JkdXhzdWJfdG1wLT5hdHRhY2hlZCA9IDA7CisJdXNiZHV4c3ViX3RtcC0+Y29tZWRpZGV2ID0gTlVMTDsKKwlkZXZfZGJnKCZ1c2JkdXhzdWJfdG1wLT5pbnRlcmZhY2UtPmRldiwKKwkJImNvbWVkaSVkOiBkZXRhY2g6IHN1Y2Nlc3NmdWxseSByZW1vdmVkXG4iLCBkZXYtPm1pbm9yKTsKKwl1cCgmdXNiZHV4c3ViX3RtcC0+c2VtKTsKKwlyZXR1cm4gMDsKK30KKworLyogbWFpbiBkcml2ZXIgc3RydWN0ICovCitzdGF0aWMgY29tZWRpX2RyaXZlciBkcml2ZXJfdXNiZHV4ID0geworICAgICAgLmRyaXZlcl9uYW1lID0JInVzYmR1eCIsCisgICAgICAubW9kdWxlID0JCVRISVNfTU9EVUxFLAorICAgICAgLmF0dGFjaCA9CQl1c2JkdXhfYXR0YWNoLAorICAgICAgLmRldGFjaCA9CQl1c2JkdXhfZGV0YWNoLAorfTsKKworc3RhdGljIHZvaWQgaW5pdF91c2JfZGV2aWNlcyh2b2lkKQoreworCWludCBpbmRleDsKKworCS8qIGFsbCBkZXZpY2VzIGVudHJpZXMgYXJlIGludmFsaWQgdG8gYmVnaW4gd2l0aCAqLworCS8qIHRoZXkgd2lsbCBiZWNvbWUgdmFsaWQgYnkgdGhlIHByb2JlIGZ1bmN0aW9uICovCisJLyogYW5kIHRoZW4gZmluYWxseSBieSB0aGUgYXR0YWNoLWZ1bmN0aW9uICovCisJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgTlVNVVNCRFVYOyBpbmRleCsrKSB7CisJCW1lbXNldCgmKHVzYmR1eHN1YltpbmRleF0pLCAweDAwLCBzaXplb2YodXNiZHV4c3ViW2luZGV4XSkpOworCQlpbml0X01VVEVYKCYodXNiZHV4c3ViW2luZGV4XS5zZW0pKTsKKwl9Cit9CisKKy8qIFRhYmxlIHdpdGggdGhlIFVTQi1kZXZpY2VzOiBqdXN0IG5vdyBvbmx5IHRlc3RpbmcgSURzICovCitzdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgdXNiZHV4c3ViX3RhYmxlW10gPSB7CisJe1VTQl9ERVZJQ0UoMHgxM2Q4LCAweDAwMDEpIH0sCisJe1VTQl9ERVZJQ0UoMHgxM2Q4LCAweDAwMDIpIH0sCisJe30JCQkvKiBUZXJtaW5hdGluZyBlbnRyeSAqLworfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRSh1c2IsIHVzYmR1eHN1Yl90YWJsZSk7CisKKy8qIFRoZSB1c2JkdXhzdWItZHJpdmVyICovCitzdGF0aWMgc3RydWN0IHVzYl9kcml2ZXIgdXNiZHV4c3ViX2RyaXZlciA9IHsKKyAgICAgIC5uYW1lID0JCUJPQVJETkFNRSwKKyAgICAgIC5wcm9iZSA9CQl1c2JkdXhzdWJfcHJvYmUsCisgICAgICAuZGlzY29ubmVjdCA9CXVzYmR1eHN1Yl9kaXNjb25uZWN0LAorICAgICAgLmlkX3RhYmxlID0JdXNiZHV4c3ViX3RhYmxlLAorfTsKKworLyogQ2FuJ3QgdXNlIHRoZSBuaWNlIG1hY3JvIGFzIEkgaGF2ZSBhbHNvIHRvIGluaXRpYWxpc2UgdGhlIFVTQiAqLworLyogc3Vic3lzdGVtOiAqLworLyogcmVnaXN0ZXJpbmcgdGhlIHVzYi1zeXN0ZW0gX2FuZF8gdGhlIGNvbWVkaS1kcml2ZXIgKi8KK3N0YXRpYyBpbnQgaW5pdF91c2JkdXgodm9pZCkKK3sKKwlwcmludGsoS0VSTl9JTkZPIEtCVUlMRF9NT0ROQU1FICI6ICIKKwkgICAgICAgRFJJVkVSX1ZFUlNJT04gIjoiIERSSVZFUl9ERVNDICJcbiIpOworCWluaXRfdXNiX2RldmljZXMoKTsKKwl1c2JfcmVnaXN0ZXIoJnVzYmR1eHN1Yl9kcml2ZXIpOworCWNvbWVkaV9kcml2ZXJfcmVnaXN0ZXIoJmRyaXZlcl91c2JkdXgpOworCXJldHVybiAwOworfQorCisvKiBkZXJlZ2lzdGVyaW5nIHRoZSBjb21lZGkgZHJpdmVyIGFuZCB0aGUgdXNiLXN1YnN5c3RlbSAqLworc3RhdGljIHZvaWQgZXhpdF91c2JkdXgodm9pZCkKK3sKKwljb21lZGlfZHJpdmVyX3VucmVnaXN0ZXIoJmRyaXZlcl91c2JkdXgpOworCXVzYl9kZXJlZ2lzdGVyKCZ1c2JkdXhzdWJfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoaW5pdF91c2JkdXgpOworbW9kdWxlX2V4aXQoZXhpdF91c2JkdXgpOworCitNT0RVTEVfQVVUSE9SKERSSVZFUl9BVVRIT1IpOworTU9EVUxFX0RFU0NSSVBUSU9OKERSSVZFUl9ERVNDKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy91c2JkdXhmYXN0LmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvdXNiZHV4ZmFzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhMDBmZjAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvdXNiZHV4ZmFzdC5jCkBAIC0wLDAgKzEsMTc3OCBAQAorI2RlZmluZSBEUklWRVJfVkVSU0lPTiAidjAuOTlhIgorI2RlZmluZSBEUklWRVJfQVVUSE9SICJCZXJuZCBQb3JyLCBCZXJuZFBvcnJAZjJzLmNvbSIKKyNkZWZpbmUgRFJJVkVSX0RFU0MgIlVTQi1EVVhmYXN0LCBCZXJuZFBvcnJAZjJzLmNvbSIKKy8qCisgICBjb21lZGkvZHJpdmVycy91c2JkdXhmYXN0LmMKKyAgIENvcHlyaWdodCAoQykgMjAwNCBCZXJuZCBQb3JyLCBCZXJuZC5Qb3JyQGYycy5jb20KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyovCisKKy8qCitEcml2ZXI6IHVzYmR1eGZhc3QKK0Rlc2NyaXB0aW9uOiBJVEwgVVNCLURVWGZhc3QKK0RldmljZXM6IFtJVExdIFVTQi1EVVggKHVzYmR1eGZhc3QubykKK0F1dGhvcjogQmVybmQgUG9yciA8QmVybmRQb3JyQGYycy5jb20+CitVcGRhdGVkOiAwNCBEZWMgMjAwNgorU3RhdHVzOiB0ZXN0aW5nCisqLworCisvKgorICogSSBtdXN0IGdpdmUgY3JlZGl0IGhlcmUgdG8gQ2hyaXMgQmF1Z2hlciB3aG8KKyAqIHdyb3RlIHRoZSBkcml2ZXIgZm9yIEFULU1JTy0xNmQuIEkgdXNlZCBzb21lIHBhcnRzIG9mIHRoaXMKKyAqIGRyaXZlci4gSSBhbHNvIG11c3QgZ2l2ZSBjcmVkaXRzIHRvIERhdmlkIEJyb3duZWxsCisgKiB3aG8gc3VwcG9ydGVkIG1lIHdpdGggdGhlIFVTQiBkZXZlbG9wbWVudC4KKyAqCisgKiBCZXJuZCBQb3JyCisgKgorICoKKyAqIFJldmlzaW9uIGhpc3Rvcnk6CisgKiAwLjk6IERyb3BwaW5nIHRoZSBmaXJzdCBkYXRhIHBhY2tldCB3aGljaCBzZWVtcyB0byBiZSBmcm9tIHRoZSBsYXN0IHRyYW5zZmVyLgorICogICAgICBCdWZmZXIgb3ZlcmZsb3dzIGluIHRoZSBGWDIgYXJlIGhhbmRlZCBvdmVyIHRvIGNvbWVkaS4KKyAqIDAuOTI6IERyb3BwaW5nIG5vdyA0IHBhY2tldHMuIFRoZSBxdWFkIGJ1ZmZlciBoYXMgdG8gYmUgZW1wdGllZC4KKyAqICAgICAgIEFkZGVkIGluc24gY29tbWFuZCBiYXNpY2FsbHkgZm9yIHRlc3RpbmcuIFNhbXBsZSByYXRlIGlzIDFNSHovMTZjaD02Mi41a0h6CisgKiAwLjk5OiBJYW4gQWJib3R0IHBvaW50ZWQgb3V0IGEgYnVnIHdoaWNoIGhhcyBiZWVuIGNvcnJlY3RlZC4gVGhhbmtzIQorICogMC45OWE6IGFkZGVkIGV4dGVybmFsIHRyaWdnZXIuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KKyNpbmNsdWRlIDxsaW51eC91c2IuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KKyNpbmNsdWRlICJjb21lZGlfZmMuaCIKKyNpbmNsdWRlICIuLi9jb21lZGlkZXYuaCIKKworLy8gKHVuKWNvbW1lbnQgdGhpcyBpZiB5b3Ugd2FudCB0byBoYXZlIGRlYnVnIGluZm8uCisvLyNkZWZpbmUgQ09ORklHX0NPTUVESV9ERUJVRworI3VuZGVmICBDT05GSUdfQ09NRURJX0RFQlVHCisKKyNkZWZpbmUgQk9BUkROQU1FICJ1c2JkdXhmYXN0IgorCisvLyB0aW1lb3V0IGZvciB0aGUgVVNCLXRyYW5zZmVyCisjZGVmaW5lIEVaVElNRU9VVCAzMAorCisvLyBjb25zdGFudHMgZm9yICJmaXJtd2FyZSIgdXBsb2FkIGFuZCBkb3dubG9hZAorI2RlZmluZSBVU0JEVVhGQVNUU1VCX0ZJUk1XQVJFIDB4QTAKKyNkZWZpbmUgVkVORE9SX0RJUl9JTiAgMHhDMAorI2RlZmluZSBWRU5ET1JfRElSX09VVCAweDQwCisKKy8vIGludGVybmFsIGFkcmVzc2VzIG9mIHRoZSA4MDUxIHByb2Nlc3NvcgorI2RlZmluZSBVU0JEVVhGQVNUU1VCX0NQVUNTIDB4RTYwMAorCisvLyBtYXggbGVuZ2h0aCBvZiB0aGUgdHJhbnNmZXItYnVmZmVyIGZvciBzb2Z0d2FyZSB1cGxvYWQKKyNkZWZpbmUgVEJfTEVOIDB4MjAwMAorCisvLyBJbnB1dCBlbmRwb2ludCBudW1iZXIKKyNkZWZpbmUgQlVMS0lORVAgICAgICAgICAgIDYKKworLy8gRW5kcG9pbnQgZm9yIHRoZSBBL0QgY2hhbm5lbGxpc3Q6IGJ1bGsgT1VUCisjZGVmaW5lIENIQU5ORUxMSVNURVAgICAgIDQKKworLy8gTnVtYmVyIG9mIGNoYW5uZWxzCisjZGVmaW5lIE5VTUNIQU5ORUxTICAgICAgIDMyCisKKy8vIHNpemUgb2YgdGhlIHdhdmVmb3JtIGRlc2NyaXB0b3IKKyNkZWZpbmUgV0FWRVNJWkUgICAgICAgICAgMHgyMAorCisvLyBTaXplIG9mIG9uZSBBL0QgdmFsdWUKKyNkZWZpbmUgU0laRUFESU4gICAgICAgICAgKChzaXplb2YoaW50MTZfdCkpKQorCisvLyBTaXplIG9mIHRoZSBpbnB1dC1idWZmZXIgSU4gQllURVMKKyNkZWZpbmUgU0laRUlOQlVGICAgICAgICAgNTEyCisKKy8vIDE2IGJ5dGVzLgorI2RlZmluZSBTSVpFSU5TTkJVRiAgICAgICA1MTIKKworLy8gU2l6ZSBvZiB0aGUgYnVmZmVyIGZvciB0aGUgZHV4IGNvbW1hbmRzCisjZGVmaW5lIFNJWkVPRkRVWEJVRkZFUiAgICAyNTYJLy8gYnl0ZXMKKworLy8gTnVtYmVyIG9mIGluLVVSQnMgd2hpY2ggcmVjZWl2ZSB0aGUgZGF0YTogbWluPTUKKyNkZWZpbmUgTlVNT0ZJTkJVRkZFUlNISUdIICAgICAxMAorCisvLyBUb3RhbCBudW1iZXIgb2YgdXNiZHV4ZmFzdCBkZXZpY2VzCisjZGVmaW5lIE5VTVVTQkRVWEZBU1QgICAgICAgICAgICAgMTYKKworLy8gTnVtYmVyIG9mIHN1YmRldmljZXMKKyNkZWZpbmUgTl9TVUJERVZJQ0VTICAgICAgICAgIDEKKworLy8gQW5hbG9ndWUgaW4gc3ViZGV2aWNlCisjZGVmaW5lIFNVQkRFVl9BRCAgICAgICAgICAgICAwCisKKy8vIG1pbiBkZWxheSBzdGVwcyBmb3IgbW9yZSB0aGFuIG9uZSBjaGFubmVsCisvLyBiYXNpY2FsbHkgd2hlbiB0aGUgbXV4IGdpdmVzIHVwLiA7LSkKKyNkZWZpbmUgTUlOX1NBTVBMSU5HX1BFUklPRCA5CS8vIHN0ZXBzIGF0IDMwTUh6IGluIHRoZSBGWDIKKworLy8gTWF4IG51bWJlciBvZiAxLzMwTUh6IGRlbGF5IHN0ZXBzOgorI2RlZmluZSBNQVhfU0FNUExJTkdfUEVSSU9EIDUwMAorCisvLyBOdW1iZXIgb2YgcmVjZWl2ZWQgcGFja2V0cyB0byBpZ25vcmUgYmVmb3JlIHdlIHN0YXJ0IGhhbmRpbmcgZGF0YSBvdmVyIHRvIGNvbWVkaS4KKy8vIEl0J3MgcXVhZCBidWZmZXJpbmcgYW5kIHdlIGhhdmUgdG8gaWdub3JlIDQgcGFja2V0cy4KKyNkZWZpbmUgUEFDS0VUU19UT19JR05PUkUgNAorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIGNvbWVkaSBjb25zdGFudHMKK3N0YXRpYyBjb25zdCBjb21lZGlfbHJhbmdlIHJhbmdlX3VzYmR1eGZhc3RfYWlfcmFuZ2UgPSB7IDIsIHsKKwkJCUJJUF9SQU5HRSgwLjc1KSwKKwkJCUJJUF9SQU5HRSgwLjUpLAorCX0KK307CisKKy8qCisgKiBwcml2YXRlIHN0cnVjdHVyZSBvZiBvbmUgc3ViZGV2aWNlCisgKi8KKworLy8gVGhpcyBpcyB0aGUgc3RydWN0dXJlIHdoaWNoIGhvbGRzIGFsbCB0aGUgZGF0YSBvZiB0aGlzIGRyaXZlcgorLy8gb25lIHN1YiBkZXZpY2UganVzdCBub3c6IEEvRAordHlwZWRlZiBzdHJ1Y3QgeworCS8vIGF0dGFjaGVkPworCWludCBhdHRhY2hlZDsKKwkvLyBpcyBpdCBhc3NvY2lhdGVkIHdpdGggYSBzdWJkZXZpY2U/CisJaW50IHByb2JlZDsKKwkvLyBwb2ludGVyIHRvIHRoZSB1c2ItZGV2aWNlCisJc3RydWN0IHVzYl9kZXZpY2UgKnVzYmRldjsKKwkvLyBCVUxLLXRyYW5zZmVyIGhhbmRsaW5nOiB1cmIKKwlzdHJ1Y3QgdXJiICp1cmJJbjsKKwlpbnQ4X3QgKnRyYW5zZmVyX2J1ZmZlcjsKKwkvLyBpbnB1dCBidWZmZXIgZm9yIHNpbmdsZSBpbnNuCisJaW50MTZfdCAqaW5zbkJ1ZmZlcjsKKwkvLyBpbnRlcmZhY2UgbnVtYmVyCisJaW50IGlmbnVtOworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMCkKKwkvLyBpbnRlcmZhY2Ugc3RydWN0dXJlIGluIDIuNgorCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2U7CisjZW5kaWYKKwkvLyBjb21lZGkgZGV2aWNlIGZvciB0aGUgaW50ZXJydXB0IGNvbnRleHQKKwljb21lZGlfZGV2aWNlICpjb21lZGlkZXY7CisJLy8gYXN5bmNocm9ub3VzIGNvbW1hbmQgaXMgcnVubmluZworCXNob3J0IGludCBhaV9jbWRfcnVubmluZzsKKwkvLyBjb250aW5vdXMgYXF1aXNpdGlvbgorCXNob3J0IGludCBhaV9jb250aW5vdXM7CisJLy8gbnVtYmVyIG9mIHNhbXBsZXMgdG8gYXF1aXJlCisJbG9uZyBpbnQgYWlfc2FtcGxlX2NvdW50OworCS8vIGNvbW1hbmRzCisJdWludDhfdCAqZHV4X2NvbW1hbmRzOworCS8vIGNvdW50ZXIgd2hpY2ggaWdub3JlcyB0aGUgZmlyc3QgYnVmZmVycworCWludCBpZ25vcmU7CisJc3RydWN0IHNlbWFwaG9yZSBzZW07Cit9IHVzYmR1eGZhc3RzdWJfdDsKKworLy8gVGhlIHBvaW50ZXIgdG8gdGhlIHByaXZhdGUgdXNiLWRhdGEgb2YgdGhlIGRyaXZlcgorLy8gaXMgYWxzbyB0aGUgcHJpdmF0ZSBkYXRhIGZvciB0aGUgY29tZWRpLWRldmljZS4KKy8vIFRoaXMgaGFzIHRvIGJlIGdsb2JhbCBhcyB0aGUgdXNiIHN1YnN5c3RlbSBuZWVkcworLy8gZ2xvYmFsIHZhcmlhYmxlcy4gVGhlIG90aGVyIHJlYXNvbiBpcyB0aGF0IHRoaXMKKy8vIHN0cnVjdHVyZSBtdXN0IGJlIHRoZXJlIF9iZWZvcmVfIGFueSBjb21lZGkKKy8vIGNvbW1hbmQgaXMgaXNzdWVkLiBUaGUgdXNiIHN1YnN5c3RlbSBtdXN0IGJlCisvLyBpbml0aWFsaXNlZCBiZWZvcmUgY29tZWRpIGNhbiBhY2Nlc3MgaXQuCitzdGF0aWMgdXNiZHV4ZmFzdHN1Yl90IHVzYmR1eGZhc3RzdWJbTlVNVVNCRFVYRkFTVF07CisKK3N0YXRpYyBERUNMQVJFX01VVEVYKHN0YXJ0X3N0b3Bfc2VtKTsKKworLy8gYnVsayB0cmFuc2ZlcnMgdG8gdXNiZHV4ZmFzdAorCisjZGVmaW5lIFNFTkRBRENPTU1BTkRTICAgICAgICAgICAgMAorI2RlZmluZSBTRU5ESU5JVEVQNiAgICAgICAgICAgICAgIDEKKworc3RhdGljIGludCBzZW5kX2R1eF9jb21tYW5kcyh1c2JkdXhmYXN0c3ViX3QgKiB0aGlzX3VzYmR1eGZhc3RzdWIsIGludCBjbWRfdHlwZSkKK3sKKwlpbnQgcmVzdWx0LCBuc2VudDsKKwl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1swXSA9IGNtZF90eXBlOworI2lmZGVmIENPTkZJR19DT01FRElfREVCVUcKKwlpbnQgaTsKKwlwcmludGsoImNvbWVkaSVkOiB1c2JkdXhmYXN0OiBkdXhfY29tbWFuZHM6ICIsCisJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+Y29tZWRpZGV2LT5taW5vcik7CisJZm9yIChpID0gMDsgaSA8IFNJWkVPRkRVWEJVRkZFUjsgaSsrKSB7CisJCXByaW50aygiICUwMngiLCB0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tpXSk7CisJfQorCXByaW50aygiXG4iKTsKKyNlbmRpZgorCXJlc3VsdCA9IHVzYl9idWxrX21zZyh0aGlzX3VzYmR1eGZhc3RzdWItPnVzYmRldiwKKwkJCSAgICAgIHVzYl9zbmRidWxrcGlwZSh0aGlzX3VzYmR1eGZhc3RzdWItPnVzYmRldiwKKwkJCQkJICAgICAgQ0hBTk5FTExJU1RFUCksCisJCQkgICAgICB0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kcywgU0laRU9GRFVYQlVGRkVSLAorCQkJICAgICAgJm5zZW50LCAxMDAwMCk7CisJaWYgKHJlc3VsdCA8IDApIHsKKwkJcHJpbnRrKCJjb21lZGklZDogY291bGQgbm90IHRyYW5zbWl0IGR1eF9jb21tYW5kcyB0byB0aGUgdXNiLWRldmljZSwgZXJyPSVkXG4iLCB0aGlzX3VzYmR1eGZhc3RzdWItPmNvbWVkaWRldi0+bWlub3IsIHJlc3VsdCk7CisJfQorCXJldHVybiByZXN1bHQ7Cit9CisKKy8vIFN0b3BzIHRoZSBkYXRhIGFjcXVpc2lvbgorLy8gSXQgc2hvdWxkIGJlIHNhZmUgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uIGZyb20gYW55IGNvbnRleHQKK3N0YXRpYyBpbnQgdXNiZHV4ZmFzdHN1Yl91bmxpbmtfSW5VUkJzKHVzYmR1eGZhc3RzdWJfdCAqIHVzYmR1eGZhc3RzdWJfdG1wKQoreworCWludCBqID0gMDsKKwlpbnQgZXJyID0gMDsKKworCWlmICh1c2JkdXhmYXN0c3ViX3RtcCAmJiB1c2JkdXhmYXN0c3ViX3RtcC0+dXJiSW4pIHsKKwkJdXNiZHV4ZmFzdHN1Yl90bXAtPmFpX2NtZF9ydW5uaW5nID0gMDsKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsOCkKKwkJaiA9IHVzYl91bmxpbmtfdXJiKHVzYmR1eGZhc3RzdWJfdG1wLT51cmJJbik7CisJCWlmIChqIDwgMCkgeworCQkJZXJyID0gajsKKwkJfQorI2Vsc2UKKwkJLy8gd2FpdHMgdW50aWwgYSBydW5uaW5nIHRyYW5zZmVyIGlzIG92ZXIKKwkJdXNiX2tpbGxfdXJiKHVzYmR1eGZhc3RzdWJfdG1wLT51cmJJbik7CisJCWogPSAwOworI2VuZGlmCisJfQorI2lmZGVmIENPTkZJR19DT01FRElfREVCVUcKKwlwcmludGsoImNvbWVkaTogdXNiZHV4ZmFzdDogdW5saW5rZWQgSW5VUkI6IHJlcz0lZFxuIiwgaik7CisjZW5kaWYKKwlyZXR1cm4gZXJyOworfQorCisvKiBUaGlzIHdpbGwgc3RvcCBhIHJ1bm5pbmcgYWNxdWlzaXRpb24gb3BlcmF0aW9uICovCisvLyBJcyBjYWxsZWQgZnJvbSB3aXRoaW4gdGhpcyBkcml2ZXIgZnJvbSBib3RoIHRoZQorLy8gaW50ZXJydXB0IGNvbnRleHQgYW5kIGZyb20gY29tZWRpCitzdGF0aWMgaW50IHVzYmR1eGZhc3RfYWlfc3RvcCh1c2JkdXhmYXN0c3ViX3QgKiB0aGlzX3VzYmR1eGZhc3RzdWIsCisJaW50IGRvX3VubGluaykKK3sKKwlpbnQgcmV0ID0gMDsKKworCWlmICghdGhpc191c2JkdXhmYXN0c3ViKSB7CisJCXByaW50aygiY29tZWRpPzogdXNiZHV4ZmFzdF9haV9zdG9wOiB0aGlzX3VzYmR1eGZhc3RzdWI9TlVMTCFcbiIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisjaWZkZWYgQ09ORklHX0NPTUVESV9ERUJVRworCXByaW50aygiY29tZWRpOiB1c2JkdXhmYXN0X2FpX3N0b3BcbiIpOworI2VuZGlmCisKKwl0aGlzX3VzYmR1eGZhc3RzdWItPmFpX2NtZF9ydW5uaW5nID0gMDsKKworCWlmIChkb191bmxpbmspIHsKKwkJLy8gc3RvcCBhcXVpc3Rpb24KKwkJcmV0ID0gdXNiZHV4ZmFzdHN1Yl91bmxpbmtfSW5VUkJzKHRoaXNfdXNiZHV4ZmFzdHN1Yik7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworLy8gVGhpcyB3aWxsIGNhbmNlbCBhIHJ1bm5pbmcgYWNxdWlzaXRpb24gb3BlcmF0aW9uLgorLy8gVGhpcyBpcyBjYWxsZWQgYnkgY29tZWRpIGJ1dCBuZXZlciBmcm9tIGluc2lkZSB0aGUKKy8vIGRyaXZlci4KK3N0YXRpYyBpbnQgdXNiZHV4ZmFzdF9haV9jYW5jZWwoY29tZWRpX2RldmljZSAqIGRldiwgY29tZWRpX3N1YmRldmljZSAqIHMpCit7CisJdXNiZHV4ZmFzdHN1Yl90ICp0aGlzX3VzYmR1eGZhc3RzdWI7CisJaW50IHJlcyA9IDA7CisKKwkvLyBmb3JjZSB1bmxpbmsgb2YgYWxsIHVyYnMKKyNpZmRlZiBDT05GSUdfQ09NRURJX0RFQlVHCisJcHJpbnRrKCJjb21lZGk6IHVzYmR1eGZhc3RfYWlfY2FuY2VsXG4iKTsKKyNlbmRpZgorCXRoaXNfdXNiZHV4ZmFzdHN1YiA9IGRldi0+cHJpdmF0ZTsKKwlpZiAoIXRoaXNfdXNiZHV4ZmFzdHN1YikgeworCQlwcmludGsoImNvbWVkaTogdXNiZHV4ZmFzdF9haV9jYW5jZWw6IHRoaXNfdXNiZHV4ZmFzdHN1Yj1OVUxMXG4iKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCWRvd24oJnRoaXNfdXNiZHV4ZmFzdHN1Yi0+c2VtKTsKKwlpZiAoISh0aGlzX3VzYmR1eGZhc3RzdWItPnByb2JlZCkpIHsKKwkJdXAoJnRoaXNfdXNiZHV4ZmFzdHN1Yi0+c2VtKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCS8vIHVubGluaworCXJlcyA9IHVzYmR1eGZhc3RfYWlfc3RvcCh0aGlzX3VzYmR1eGZhc3RzdWIsIDEpOworCXVwKCZ0aGlzX3VzYmR1eGZhc3RzdWItPnNlbSk7CisKKwlyZXR1cm4gcmVzOworfQorCisvLyBhbmFsb2d1ZSBJTgorLy8gaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZQorI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwwKQorc3RhdGljIHZvaWQgdXNiZHV4ZmFzdHN1Yl9haV9JcnEoc3RydWN0IHVyYiAqdXJiKQorI2Vsc2UKK3N0YXRpYyB2b2lkIHVzYmR1eGZhc3RzdWJfYWlfSXJxKHN0cnVjdCB1cmIgKnVyYiBQVF9SRUdTX0FSRykKKyNlbmRpZgoreworCWludCBuLCBlcnI7CisJdXNiZHV4ZmFzdHN1Yl90ICp0aGlzX3VzYmR1eGZhc3RzdWI7CisJY29tZWRpX2RldmljZSAqdGhpc19jb21lZGlkZXY7CisJY29tZWRpX3N1YmRldmljZSAqczsKKwl1aW50MTZfdCAqcDsKKworCS8vIHNhbml0eSBjaGVja3MKKwkvLyBpcyB0aGUgdXJiIHRoZXJlPworCWlmICghdXJiKSB7CisJCXByaW50aygiY29tZWRpXzogdXNiZHV4ZmFzdF86IGFvIGludC1oYW5kbGVyIGNhbGxlZCB3aXRoIHVyYj1OVUxMIVxuIik7CisJCXJldHVybjsKKwl9CisJLy8gdGhlIGNvbnRleHQgdmFyaWFibGUgcG9pbnRzIHRvIHRoZSBzdWJkZXZpY2UKKwl0aGlzX2NvbWVkaWRldiA9IHVyYi0+Y29udGV4dDsKKwlpZiAoIXRoaXNfY29tZWRpZGV2KSB7CisJCXByaW50aygiY29tZWRpXzogdXNiZHV4ZmFzdF86IHVyYiBjb250ZXh0IGlzIGEgTlVMTCBwb2ludGVyIVxuIik7CisJCXJldHVybjsKKwl9CisJLy8gdGhlIHByaXZhdGUgc3RydWN0dXJlIG9mIHRoZSBzdWJkZXZpY2UgaXMgdXNiZHV4ZmFzdHN1Yl90CisJdGhpc191c2JkdXhmYXN0c3ViID0gdGhpc19jb21lZGlkZXYtPnByaXZhdGU7CisJaWYgKCF0aGlzX3VzYmR1eGZhc3RzdWIpIHsKKwkJcHJpbnRrKCJjb21lZGlfOiB1c2JkdXhmYXN0XzogcHJpdmF0ZSBvZiBjb21lZGkgc3ViZGV2IGlzIGEgTlVMTCBwb2ludGVyIVxuIik7CisJCXJldHVybjsKKwl9CisJLy8gYXJlIHdlIHJ1bm5pbmcgYSBjb21tYW5kPworCWlmICh1bmxpa2VseSghKHRoaXNfdXNiZHV4ZmFzdHN1Yi0+YWlfY21kX3J1bm5pbmcpKSkgeworCQkvLyBub3QgcnVubmluZyBhIGNvbW1hbmQKKwkJLy8gZG8gbm90IGNvbnRpbnVlIGV4ZWN1dGlvbiBpZiBubyBhc3luY2hyb25vdXMgY29tbWFuZCBpcyBydW5uaW5nCisJCS8vIGluIHBhcnRpY3VsYXIgbm90IHJlc3VibWl0CisJCXJldHVybjsKKwl9CisKKwlpZiAodW5saWtlbHkoISh0aGlzX3VzYmR1eGZhc3RzdWItPmF0dGFjaGVkKSkpIHsKKwkJLy8gbm8gY29tZWRpIGRldmljZSB0aGVyZQorCQlyZXR1cm47CisJfQorCS8vIHN1YmRldmljZSB3aGljaCBpcyB0aGUgQUQgY29udmVydGVyCisJcyA9IHRoaXNfY29tZWRpZGV2LT5zdWJkZXZpY2VzICsgU1VCREVWX0FEOworCisJLy8gZmlyc3Qgd2UgdGVzdCBpZiBzb21ldGhpbmcgdW51c3VhbCBoYXMganVzdCBoYXBwZW5lZAorCXN3aXRjaCAodXJiLT5zdGF0dXMpIHsKKwljYXNlIDA6CisJCWJyZWFrOworCisJCS8vIGhhcHBlbnMgYWZ0ZXIgYW4gdW5saW5rIGNvbW1hbmQgb3Igd2hlbiB0aGUgZGV2aWNlIGlzIHBsdWdnZWQgb3V0CisJY2FzZSAtRUNPTk5SRVNFVDoKKwljYXNlIC1FTk9FTlQ6CisJY2FzZSAtRVNIVVRET1dOOgorCWNhc2UgLUVDT05OQUJPUlRFRDoKKwkJLy8gdGVsbCB0aGlzIGNvbWVkaQorCQlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FT0E7CisJCXMtPmFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0VSUk9SOworCQljb21lZGlfZXZlbnQodGhpc191c2JkdXhmYXN0c3ViLT5jb21lZGlkZXYsIHMpOworCQkvLyBzdG9wIHRoZSB0cmFuc2ZlciB3L28gdW5saW5rCisJCXVzYmR1eGZhc3RfYWlfc3RvcCh0aGlzX3VzYmR1eGZhc3RzdWIsIDApOworCQlyZXR1cm47CisKKwlkZWZhdWx0OgorCQlwcmludGsoImNvbWVkaSVkOiB1c2JkdXhmYXN0OiBub24temVybyB1cmIgc3RhdHVzIHJlY2VpdmVkIGluIGFpIGludHIgY29udGV4dDogJWRcbiIsIHRoaXNfdXNiZHV4ZmFzdHN1Yi0+Y29tZWRpZGV2LT5taW5vciwgdXJiLT5zdGF0dXMpOworCQlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FT0E7CisJCXMtPmFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0VSUk9SOworCQljb21lZGlfZXZlbnQodGhpc191c2JkdXhmYXN0c3ViLT5jb21lZGlkZXYsIHMpOworCQl1c2JkdXhmYXN0X2FpX3N0b3AodGhpc191c2JkdXhmYXN0c3ViLCAwKTsKKwkJcmV0dXJuOworCX0KKworCXAgPSB1cmItPnRyYW5zZmVyX2J1ZmZlcjsKKwlpZiAoIXRoaXNfdXNiZHV4ZmFzdHN1Yi0+aWdub3JlKSB7CisJCWlmICghKHRoaXNfdXNiZHV4ZmFzdHN1Yi0+YWlfY29udGlub3VzKSkgeworCQkJLy8gbm90IGNvbnRpbm91cywgZml4ZWQgbnVtYmVyIG9mIHNhbXBsZXMKKwkJCW4gPSB1cmItPmFjdHVhbF9sZW5ndGggLyBzaXplb2YodWludDE2X3QpOworCQkJaWYgKHVubGlrZWx5KHRoaXNfdXNiZHV4ZmFzdHN1Yi0+YWlfc2FtcGxlX2NvdW50IDwgbikpIHsKKwkJCQkvLyB3ZSBoYXZlIHNlbmQgb25seSBhIGZyYWN0aW9uIG9mIHRoZSBieXRlcyByZWNlaXZlZAorCQkJCWNmY193cml0ZV9hcnJheV90b19idWZmZXIocywKKwkJCQkJdXJiLT50cmFuc2Zlcl9idWZmZXIsCisJCQkJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+YWlfc2FtcGxlX2NvdW50ICoKKwkJCQkJc2l6ZW9mKHVpbnQxNl90KSk7CisJCQkJdXNiZHV4ZmFzdF9haV9zdG9wKHRoaXNfdXNiZHV4ZmFzdHN1YiwgMCk7CisJCQkJLy8gc2F5IGNvbWVkaSB0aGF0IHRoZSBhY3F1aXN0aW9uIGlzIG92ZXIKKwkJCQlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FT0E7CisJCQkJY29tZWRpX2V2ZW50KHRoaXNfdXNiZHV4ZmFzdHN1Yi0+Y29tZWRpZGV2LCBzKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCQl0aGlzX3VzYmR1eGZhc3RzdWItPmFpX3NhbXBsZV9jb3VudCAtPSBuOworCQl9CisJCS8vIHdyaXRlIHRoZSBmdWxsIGJ1ZmZlciB0byBjb21lZGkKKwkJY2ZjX3dyaXRlX2FycmF5X3RvX2J1ZmZlcihzLAorCQkJdXJiLT50cmFuc2Zlcl9idWZmZXIsIHVyYi0+YWN0dWFsX2xlbmd0aCk7CisKKwkJLy8gdGVsbCBjb21lZGkgdGhhdCBkYXRhIGlzIHRoZXJlCisJCWNvbWVkaV9ldmVudCh0aGlzX3VzYmR1eGZhc3RzdWItPmNvbWVkaWRldiwgcyk7CisKKwl9IGVsc2UgeworCQkvLyBpZ25vcmUgdGhpcyBwYWNrZXQKKwkJdGhpc191c2JkdXhmYXN0c3ViLT5pZ25vcmUtLTsKKwl9CisKKwkvLyBjb21tYW5kIGlzIHN0aWxsIHJ1bm5pbmcKKwkvLyByZXN1Ym1pdCB1cmIgZm9yIEJVTEsgdHJhbnNmZXIKKwl1cmItPmRldiA9IHRoaXNfdXNiZHV4ZmFzdHN1Yi0+dXNiZGV2OworCXVyYi0+c3RhdHVzID0gMDsKKwllcnIgPSB1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9BVE9NSUMpOworCWlmIChlcnIgPCAwKSB7CisJCXByaW50aygiY29tZWRpJWQ6IHVzYmR1eGZhc3Q6IHVyYiByZXN1Ym0gZmFpbGVkOiAlZCIsCisJCQl0aGlzX3VzYmR1eGZhc3RzdWItPmNvbWVkaWRldi0+bWlub3IsIGVycik7CisJCXMtPmFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0VPQTsKKwkJcy0+YXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRVJST1I7CisJCWNvbWVkaV9ldmVudCh0aGlzX3VzYmR1eGZhc3RzdWItPmNvbWVkaWRldiwgcyk7CisJCXVzYmR1eGZhc3RfYWlfc3RvcCh0aGlzX3VzYmR1eGZhc3RzdWIsIDApOworCX0KK30KKworc3RhdGljIGludCB1c2JkdXhmYXN0c3ViX3N0YXJ0KHVzYmR1eGZhc3RzdWJfdCAqIHVzYmR1eGZhc3RzdWIpCit7CisJaW50IGVycmNvZGUgPSAwOworCXVuc2lnbmVkIGNoYXIgbG9jYWxfdHJhbnNmZXJfYnVmZmVyWzE2XTsKKworCWlmICh1c2JkdXhmYXN0c3ViLT5wcm9iZWQpIHsKKwkJLy8gN2Y5MiB0byB6ZXJvCisJCWxvY2FsX3RyYW5zZmVyX2J1ZmZlclswXSA9IDA7CisJCWVycmNvZGUgPSB1c2JfY29udHJvbF9tc2codXNiZHV4ZmFzdHN1Yi0+dXNiZGV2LAorCQkJLy8gY3JlYXRlIGEgcGlwZSBmb3IgYSBjb250cm9sIHRyYW5zZmVyCisJCQl1c2Jfc25kY3RybHBpcGUodXNiZHV4ZmFzdHN1Yi0+dXNiZGV2LCAwKSwKKwkJCS8vIGJSZXF1ZXN0LCAiRmlybXdhcmUiCisJCQlVU0JEVVhGQVNUU1VCX0ZJUk1XQVJFLAorCQkJLy8gYm1SZXF1ZXN0VHlwZQorCQkJVkVORE9SX0RJUl9PVVQsCisJCQkvLyBWYWx1ZQorCQkJVVNCRFVYRkFTVFNVQl9DUFVDUywKKwkJCS8vIEluZGV4CisJCQkweDAwMDAsCisJCQkvLyBhZGRyZXNzIG9mIHRoZSB0cmFuc2ZlciBidWZmZXIKKwkJCWxvY2FsX3RyYW5zZmVyX2J1ZmZlciwKKwkJCS8vIExlbmd0aAorCQkJMSwKKwkJCS8vIFRpbWVvdXQKKwkJCUVaVElNRU9VVCk7CisJCWlmIChlcnJjb2RlIDwgMCkgeworCQkJcHJpbnRrKCJjb21lZGlfOiB1c2JkdXhmYXN0XzogY29udHJvbCBtc2cgZmFpbGVkIChzdGFydClcbiIpOworCQkJcmV0dXJuIGVycmNvZGU7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdXNiZHV4ZmFzdHN1Yl9zdG9wKHVzYmR1eGZhc3RzdWJfdCAqIHVzYmR1eGZhc3RzdWIpCit7CisJaW50IGVycmNvZGUgPSAwOworCisJdW5zaWduZWQgY2hhciBsb2NhbF90cmFuc2Zlcl9idWZmZXJbMTZdOworCWlmICh1c2JkdXhmYXN0c3ViLT5wcm9iZWQpIHsKKwkJLy8gN2Y5MiB0byBvbmUKKwkJbG9jYWxfdHJhbnNmZXJfYnVmZmVyWzBdID0gMTsKKwkJZXJyY29kZSA9IHVzYl9jb250cm9sX21zZyh1c2JkdXhmYXN0c3ViLT51c2JkZXYsCisJCQl1c2Jfc25kY3RybHBpcGUodXNiZHV4ZmFzdHN1Yi0+dXNiZGV2LCAwKSwKKwkJCS8vIGJSZXF1ZXN0LCAiRmlybXdhcmUiCisJCQlVU0JEVVhGQVNUU1VCX0ZJUk1XQVJFLAorCQkJLy8gYm1SZXF1ZXN0VHlwZQorCQkJVkVORE9SX0RJUl9PVVQsCisJCQkvLyBWYWx1ZQorCQkJVVNCRFVYRkFTVFNVQl9DUFVDUywKKwkJCS8vIEluZGV4CisJCQkweDAwMDAsIGxvY2FsX3RyYW5zZmVyX2J1ZmZlciwKKwkJCS8vIExlbmd0aAorCQkJMSwKKwkJCS8vIFRpbWVvdXQKKwkJCUVaVElNRU9VVCk7CisJCWlmIChlcnJjb2RlIDwgMCkgeworCQkJcHJpbnRrKCJjb21lZGlfOiB1c2JkdXhmYXN0OiBjb250cm9sIG1zZyBmYWlsZWQgKHN0b3ApXG4iKTsKKwkJCXJldHVybiBlcnJjb2RlOworCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHVzYmR1eGZhc3RzdWJfdXBsb2FkKHVzYmR1eGZhc3RzdWJfdCAqIHVzYmR1eGZhc3RzdWIsCisJdW5zaWduZWQgY2hhciAqbG9jYWxfdHJhbnNmZXJfYnVmZmVyLAorCXVuc2lnbmVkIGludCBzdGFydEFkZHIsIHVuc2lnbmVkIGludCBsZW4pCit7CisJaW50IGVycmNvZGU7CisKKwlpZiAodXNiZHV4ZmFzdHN1Yi0+cHJvYmVkKSB7CisjaWZkZWYgQ09ORklHX0NPTUVESV9ERUJVRworCQlwcmludGsoImNvbWVkaSVkOiB1c2JkdXhmYXN0OiB1cGxvYWRpbmcgJWQgYnl0ZXMiLAorCQkJdXNiZHV4ZmFzdHN1Yi0+Y29tZWRpZGV2LT5taW5vciwgbGVuKTsKKwkJcHJpbnRrKCIgdG8gYWRkciAlZCwgZmlyc3QgYnl0ZT0lZC5cbiIsCisJCQlzdGFydEFkZHIsIGxvY2FsX3RyYW5zZmVyX2J1ZmZlclswXSk7CisjZW5kaWYKKwkJZXJyY29kZSA9IHVzYl9jb250cm9sX21zZyh1c2JkdXhmYXN0c3ViLT51c2JkZXYsCisJCQl1c2Jfc25kY3RybHBpcGUodXNiZHV4ZmFzdHN1Yi0+dXNiZGV2LCAwKSwKKwkJCS8vIGJyZXF1ZXN0LCBmaXJtd2FyZQorCQkJVVNCRFVYRkFTVFNVQl9GSVJNV0FSRSwKKwkJCS8vIGJtUmVxdWVzdFR5cGUKKwkJCVZFTkRPUl9ESVJfT1VULAorCQkJLy8gdmFsdWUKKwkJCXN0YXJ0QWRkciwKKwkJCS8vIGluZGV4CisJCQkweDAwMDAsCisJCQkvLyBvdXIgbG9jYWwgc2FmZSBidWZmZXIKKwkJCWxvY2FsX3RyYW5zZmVyX2J1ZmZlciwKKwkJCS8vIGxlbmd0aAorCQkJbGVuLAorCQkJLy8gdGltZW91dAorCQkJRVpUSU1FT1VUKTsKKyNpZmRlZiBDT05GSUdfQ09NRURJX0RFQlVHCisJCXByaW50aygiY29tZWRpXzogdXNiZHV4ZmFzdDogcmVzdWx0PSVkXG4iLCBlcnJjb2RlKTsKKyNlbmRpZgorCQlpZiAoZXJyY29kZSA8IDApIHsKKwkJCXByaW50aygiY29tZWRpXzogdXNiZHV4ZmFzdDogdXBwbG9hZCBmYWlsZWRcbiIpOworCQkJcmV0dXJuIGVycmNvZGU7CisJCX0KKwl9IGVsc2UgeworCQkvLyBubyBkZXZpY2Ugb24gdGhlIGJ1cyBmb3IgdGhpcyBpbmRleAorCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK2ludCBmaXJtd2FyZVVwbG9hZCh1c2JkdXhmYXN0c3ViX3QgKiB1c2JkdXhmYXN0c3ViLAorCXVuc2lnbmVkIGNoYXIgKmZpcm13YXJlQmluYXJ5LCBpbnQgc2l6ZUZpcm13YXJlKQoreworCWludCByZXQ7CisKKwlpZiAoIWZpcm13YXJlQmluYXJ5KSB7CisJCXJldHVybiAwOworCX0KKwlyZXQgPSB1c2JkdXhmYXN0c3ViX3N0b3AodXNiZHV4ZmFzdHN1Yik7CisJaWYgKHJldCA8IDApIHsKKwkJcHJpbnRrKCJjb21lZGlfOiB1c2JkdXhmYXN0OiBjYW4gbm90IHN0b3AgZmlybXdhcmVcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKwlyZXQgPSB1c2JkdXhmYXN0c3ViX3VwbG9hZCh1c2JkdXhmYXN0c3ViLAorCQlmaXJtd2FyZUJpbmFyeSwgMCwgc2l6ZUZpcm13YXJlKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcmludGsoImNvbWVkaV86IHVzYmR1eGZhc3Q6IGZpcm13YXJlIHVwbG9hZCBmYWlsZWRcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKwlyZXQgPSB1c2JkdXhmYXN0c3ViX3N0YXJ0KHVzYmR1eGZhc3RzdWIpOworCWlmIChyZXQgPCAwKSB7CisJCXByaW50aygiY29tZWRpXzogdXNiZHV4ZmFzdDogY2FuIG5vdCBzdGFydCBmaXJtd2FyZVxuIik7CisJCXJldHVybiByZXQ7CisJfQorCXJldHVybiAwOworfQorCitpbnQgdXNiZHV4ZmFzdHN1Yl9zdWJtaXRfSW5VUkJzKHVzYmR1eGZhc3RzdWJfdCAqIHVzYmR1eGZhc3RzdWIpCit7CisJaW50IGVyckZsYWc7CisKKwlpZiAoIXVzYmR1eGZhc3RzdWIpIHsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCXVzYl9maWxsX2J1bGtfdXJiKHVzYmR1eGZhc3RzdWItPnVyYkluLAorCQl1c2JkdXhmYXN0c3ViLT51c2JkZXYsCisJCXVzYl9yY3ZidWxrcGlwZSh1c2JkdXhmYXN0c3ViLT51c2JkZXYsIEJVTEtJTkVQKSwKKwkJdXNiZHV4ZmFzdHN1Yi0+dHJhbnNmZXJfYnVmZmVyLAorCQlTSVpFSU5CVUYsIHVzYmR1eGZhc3RzdWJfYWlfSXJxLCB1c2JkdXhmYXN0c3ViLT5jb21lZGlkZXYpOworCisjaWZkZWYgQ09ORklHX0NPTUVESV9ERUJVRworCXByaW50aygiY29tZWRpJWQ6IHVzYmR1eGZhc3Q6IHN1Ym1pdHRpbmcgaW4tdXJiOiAleCwleFxuIiwKKwkJdXNiZHV4ZmFzdHN1Yi0+Y29tZWRpZGV2LT5taW5vciwKKwkJKGludCkodXNiZHV4ZmFzdHN1Yi0+dXJiSW4tPmNvbnRleHQpLAorCQkoaW50KSh1c2JkdXhmYXN0c3ViLT51cmJJbi0+ZGV2KSk7CisjZW5kaWYKKwllcnJGbGFnID0gdXNiX3N1Ym1pdF91cmIodXNiZHV4ZmFzdHN1Yi0+dXJiSW4sIEdGUF9BVE9NSUMpOworCWlmIChlcnJGbGFnKSB7CisJCXByaW50aygiY29tZWRpXzogdXNiZHV4ZmFzdDogYWk6IHVzYl9zdWJtaXRfdXJiIGVycm9yICVkXG4iLAorCQkJZXJyRmxhZyk7CisJCXJldHVybiBlcnJGbGFnOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB1c2JkdXhmYXN0X2FpX2NtZHRlc3QoY29tZWRpX2RldmljZSAqIGRldiwKKwljb21lZGlfc3ViZGV2aWNlICogcywgY29tZWRpX2NtZCAqIGNtZCkKK3sKKwlpbnQgZXJyID0gMCwgc3RvcF9tYXNrID0gMDsKKwlsb25nIGludCBzdGVwcywgdG1wID0gMDsKKwlpbnQgbWluU2FtcGxQZXI7CisJdXNiZHV4ZmFzdHN1Yl90ICp0aGlzX3VzYmR1eGZhc3RzdWIgPSBkZXYtPnByaXZhdGU7CisJaWYgKCEodGhpc191c2JkdXhmYXN0c3ViLT5wcm9iZWQpKSB7CisJCXJldHVybiAtRU5PREVWOworCX0KKyNpZmRlZiBDT05GSUdfQ09NRURJX0RFQlVHCisJcHJpbnRrKCJjb21lZGklZDogdXNiZHV4ZmFzdF9haV9jbWR0ZXN0XG4iLCBkZXYtPm1pbm9yKTsKKwlwcmludGsoImNvbWVkaSVkOiB1c2JkdXhmYXN0OiBjb252ZXJ0X2FyZz0ldSBzY2FuX2JlZ2luX2FyZz0ldVxuIiwKKwkJZGV2LT5taW5vciwgY21kLT5jb252ZXJ0X2FyZywgY21kLT5zY2FuX2JlZ2luX2FyZyk7CisjZW5kaWYKKwkvKiBzdGVwIDE6IG1ha2Ugc3VyZSB0cmlnZ2VyIHNvdXJjZXMgYXJlIHRyaXZpYWxseSB2YWxpZCAqLworCisJdG1wID0gY21kLT5zdGFydF9zcmM7CisJY21kLT5zdGFydF9zcmMgJj0gVFJJR19OT1cgfCBUUklHX0VYVCB8IFRSSUdfSU5UOworCWlmICghY21kLT5zdGFydF9zcmMgfHwgdG1wICE9IGNtZC0+c3RhcnRfc3JjKQorCQllcnIrKzsKKworCXRtcCA9IGNtZC0+c2Nhbl9iZWdpbl9zcmM7CisJY21kLT5zY2FuX2JlZ2luX3NyYyAmPSBUUklHX1RJTUVSIHwgVFJJR19GT0xMT1cgfCBUUklHX0VYVDsKKwlpZiAoIWNtZC0+c2Nhbl9iZWdpbl9zcmMgfHwgdG1wICE9IGNtZC0+c2Nhbl9iZWdpbl9zcmMpCisJCWVycisrOworCisJdG1wID0gY21kLT5jb252ZXJ0X3NyYzsKKwljbWQtPmNvbnZlcnRfc3JjICY9IFRSSUdfVElNRVIgfCBUUklHX0VYVDsKKwlpZiAoIWNtZC0+Y29udmVydF9zcmMgfHwgdG1wICE9IGNtZC0+Y29udmVydF9zcmMpCisJCWVycisrOworCisJdG1wID0gY21kLT5zY2FuX2VuZF9zcmM7CisJY21kLT5zY2FuX2VuZF9zcmMgJj0gVFJJR19DT1VOVDsKKwlpZiAoIWNtZC0+c2Nhbl9lbmRfc3JjIHx8IHRtcCAhPSBjbWQtPnNjYW5fZW5kX3NyYykKKwkJZXJyKys7CisKKwl0bXAgPSBjbWQtPnN0b3Bfc3JjOworCXN0b3BfbWFzayA9IFRSSUdfQ09VTlQgfCBUUklHX05PTkU7CisJY21kLT5zdG9wX3NyYyAmPSBzdG9wX21hc2s7CisJaWYgKCFjbWQtPnN0b3Bfc3JjIHx8IHRtcCAhPSBjbWQtPnN0b3Bfc3JjKQorCQllcnIrKzsKKworCWlmIChlcnIpCisJCXJldHVybiAxOworCisJLyogc3RlcCAyOiBtYWtlIHN1cmUgdHJpZ2dlciBzb3VyY2VzIGFyZSB1bmlxdWUgYW5kIG11dHVhbGx5IGNvbXBhdGlibGUgKi8KKworCWlmIChjbWQtPnN0YXJ0X3NyYyAhPSBUUklHX05PVyAmJgorCQljbWQtPnN0YXJ0X3NyYyAhPSBUUklHX0VYVCAmJiBjbWQtPnN0YXJ0X3NyYyAhPSBUUklHX0lOVCkKKwkJZXJyKys7CisJaWYgKGNtZC0+c2Nhbl9iZWdpbl9zcmMgIT0gVFJJR19USU1FUiAmJgorCQljbWQtPnNjYW5fYmVnaW5fc3JjICE9IFRSSUdfRk9MTE9XICYmCisJCWNtZC0+c2Nhbl9iZWdpbl9zcmMgIT0gVFJJR19FWFQpCisJCWVycisrOworCWlmIChjbWQtPmNvbnZlcnRfc3JjICE9IFRSSUdfVElNRVIgJiYgY21kLT5jb252ZXJ0X3NyYyAhPSBUUklHX0VYVCkKKwkJZXJyKys7CisJaWYgKGNtZC0+c3RvcF9zcmMgIT0gVFJJR19DT1VOVCAmJgorCQljbWQtPnN0b3Bfc3JjICE9IFRSSUdfRVhUICYmIGNtZC0+c3RvcF9zcmMgIT0gVFJJR19OT05FKQorCQllcnIrKzsKKworCS8vIGNhbid0IGhhdmUgZXh0ZXJuYWwgc3RvcCBhbmQgc3RhcnQgdHJpZ2dlcnMgYXQgb25jZQorCWlmIChjbWQtPnN0YXJ0X3NyYyA9PSBUUklHX0VYVCAmJiBjbWQtPnN0b3Bfc3JjID09IFRSSUdfRVhUKQorCQllcnIrKzsKKworCWlmIChlcnIpCisJCXJldHVybiAyOworCisJLyogc3RlcCAzOiBtYWtlIHN1cmUgYXJndW1lbnRzIGFyZSB0cml2aWFsbHkgY29tcGF0aWJsZSAqLworCisJaWYgKGNtZC0+c3RhcnRfc3JjID09IFRSSUdfTk9XICYmIGNtZC0+c3RhcnRfYXJnICE9IDApIHsKKwkJY21kLT5zdGFydF9hcmcgPSAwOworCQllcnIrKzsKKwl9CisKKwlpZiAoIWNtZC0+Y2hhbmxpc3RfbGVuKSB7CisJCWVycisrOworCX0KKwlpZiAoY21kLT5zY2FuX2VuZF9hcmcgIT0gY21kLT5jaGFubGlzdF9sZW4pIHsKKwkJY21kLT5zY2FuX2VuZF9hcmcgPSBjbWQtPmNoYW5saXN0X2xlbjsKKwkJZXJyKys7CisJfQorCisJaWYgKGNtZC0+Y2hhbmxpc3RfbGVuID09IDEpIHsKKwkJbWluU2FtcGxQZXIgPSAxOworCX0gZWxzZSB7CisJCW1pblNhbXBsUGVyID0gTUlOX1NBTVBMSU5HX1BFUklPRDsKKwl9CisKKwlpZiAoY21kLT5jb252ZXJ0X3NyYyA9PSBUUklHX1RJTUVSKSB7CisJCXN0ZXBzID0gY21kLT5jb252ZXJ0X2FyZyAqIDMwOworCQlpZiAoc3RlcHMgPCAobWluU2FtcGxQZXIgKiAxMDAwKSkgeworCQkJc3RlcHMgPSBtaW5TYW1wbFBlciAqIDEwMDA7CisJCX0KKwkJaWYgKHN0ZXBzID4gKE1BWF9TQU1QTElOR19QRVJJT0QgKiAxMDAwKSkgeworCQkJc3RlcHMgPSBNQVhfU0FNUExJTkdfUEVSSU9EICogMTAwMDsKKwkJfQorCQkvLyBjYWxjIGFyZyBhZ2FpbgorCQl0bXAgPSBzdGVwcyAvIDMwOworCQlpZiAoY21kLT5jb252ZXJ0X2FyZyAhPSB0bXApIHsKKwkJCWNtZC0+Y29udmVydF9hcmcgPSB0bXA7CisJCQllcnIrKzsKKwkJfQorCX0KKworCWlmIChjbWQtPnNjYW5fYmVnaW5fc3JjID09IFRSSUdfVElNRVIpIHsKKwkJZXJyKys7CisJfQorCS8vIHN0b3Agc291cmNlCisJc3dpdGNoIChjbWQtPnN0b3Bfc3JjKSB7CisJY2FzZSBUUklHX0NPVU5UOgorCQlpZiAoIWNtZC0+c3RvcF9hcmcpIHsKKwkJCWNtZC0+c3RvcF9hcmcgPSAxOworCQkJZXJyKys7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBUUklHX05PTkU6CisJCWlmIChjbWQtPnN0b3BfYXJnICE9IDApIHsKKwkJCWNtZC0+c3RvcF9hcmcgPSAwOworCQkJZXJyKys7CisJCX0KKwkJYnJlYWs7CisJCS8vIFRSSUdfRVhUIGRvZXNuJ3QgY2FyZSBzaW5jZSBpdCBkb2Vzbid0IHRyaWdnZXIgb2ZmIGEgbnVtYmVyZWQgY2hhbm5lbAorCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCWlmIChlcnIpCisJCXJldHVybiAzOworCisJLyogc3RlcCA0OiBmaXggdXAgYW55IGFyZ3VtZW50cyAqLworCisJcmV0dXJuIDA7CisKK30KKworc3RhdGljIGludCB1c2JkdXhmYXN0X2FpX2ludHRyaWcoY29tZWRpX2RldmljZSAqIGRldiwKKwljb21lZGlfc3ViZGV2aWNlICogcywgdW5zaWduZWQgaW50IHRyaWdudW0pCit7CisJaW50IHJldDsKKwl1c2JkdXhmYXN0c3ViX3QgKnRoaXNfdXNiZHV4ZmFzdHN1YiA9IGRldi0+cHJpdmF0ZTsKKwlpZiAoIXRoaXNfdXNiZHV4ZmFzdHN1YikgeworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJZG93bigmdGhpc191c2JkdXhmYXN0c3ViLT5zZW0pOworCWlmICghKHRoaXNfdXNiZHV4ZmFzdHN1Yi0+cHJvYmVkKSkgeworCQl1cCgmdGhpc191c2JkdXhmYXN0c3ViLT5zZW0pOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisjaWZkZWYgQ09ORklHX0NPTUVESV9ERUJVRworCXByaW50aygiY29tZWRpJWQ6IHVzYmR1eGZhc3RfYWlfaW50dHJpZ1xuIiwgZGV2LT5taW5vcik7CisjZW5kaWYKKworCWlmICh0cmlnbnVtICE9IDApIHsKKwkJcHJpbnRrKCJjb21lZGklZDogdXNiZHV4ZmFzdF9haV9pbnR0cmlnOiBpbnZhbGlkIHRyaWdudW1cbiIsCisJCQlkZXYtPm1pbm9yKTsKKwkJdXAoJnRoaXNfdXNiZHV4ZmFzdHN1Yi0+c2VtKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmICghKHRoaXNfdXNiZHV4ZmFzdHN1Yi0+YWlfY21kX3J1bm5pbmcpKSB7CisJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+YWlfY21kX3J1bm5pbmcgPSAxOworCQlyZXQgPSB1c2JkdXhmYXN0c3ViX3N1Ym1pdF9JblVSQnModGhpc191c2JkdXhmYXN0c3ViKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCXByaW50aygiY29tZWRpJWQ6IHVzYmR1eGZhc3RfYWlfaW50dHJpZzogdXJiU3VibWl0OiBlcnI9JWRcbiIsIGRldi0+bWlub3IsIHJldCk7CisJCQl0aGlzX3VzYmR1eGZhc3RzdWItPmFpX2NtZF9ydW5uaW5nID0gMDsKKwkJCXVwKCZ0aGlzX3VzYmR1eGZhc3RzdWItPnNlbSk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJCXMtPmFzeW5jLT5pbnR0cmlnID0gTlVMTDsKKwl9IGVsc2UgeworCQlwcmludGsoImNvbWVkaSVkOiBhaV9pbnR0cmlnIGJ1dCBhY3F1IGlzIGFscmVhZHkgcnVubmluZ1xuIiwKKwkJCWRldi0+bWlub3IpOworCX0KKwl1cCgmdGhpc191c2JkdXhmYXN0c3ViLT5zZW0pOworCXJldHVybiAxOworfQorCisvLyBvZmZzZXRzIGZvciB0aGUgR1BJRiBieXRlcworLy8gdGhlIGZpcnN0IGJ5dGUgaXMgdGhlIGNvbW1hbmQgYnl0ZQorI2RlZmluZSBMRU5CQVNFIDErMHgwMAorI2RlZmluZSBPUEJBU0UgIDErMHgwOAorI2RlZmluZSBPVVRCQVNFIDErMHgxMAorI2RlZmluZSBMT0dCQVNFIDErMHgxOAorCitzdGF0aWMgaW50IHVzYmR1eGZhc3RfYWlfY21kKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKiBzKQoreworCWNvbWVkaV9jbWQgKmNtZCA9ICZzLT5hc3luYy0+Y21kOworCXVuc2lnbmVkIGludCBjaGFuLCBnYWluLCBybmdtYXNrID0gMHhmZjsKKwlpbnQgaSwgaiwgcmV0OworCXVzYmR1eGZhc3RzdWJfdCAqdGhpc191c2JkdXhmYXN0c3ViID0gZGV2LT5wcml2YXRlOworCWludCByZXN1bHQ7CisJbG9uZyBzdGVwcywgc3RlcHNfdG1wOworCisjaWZkZWYgQ09ORklHX0NPTUVESV9ERUJVRworCXByaW50aygiY29tZWRpJWQ6IHVzYmR1eGZhc3RfYWlfY21kXG4iLCBkZXYtPm1pbm9yKTsKKyNlbmRpZgorCWlmICghdGhpc191c2JkdXhmYXN0c3ViKSB7CisJCXJldHVybiAtRUZBVUxUOworCX0KKwlkb3duKCZ0aGlzX3VzYmR1eGZhc3RzdWItPnNlbSk7CisJaWYgKCEodGhpc191c2JkdXhmYXN0c3ViLT5wcm9iZWQpKSB7CisJCXVwKCZ0aGlzX3VzYmR1eGZhc3RzdWItPnNlbSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKwlpZiAodGhpc191c2JkdXhmYXN0c3ViLT5haV9jbWRfcnVubmluZykgeworCQlwcmludGsoImNvbWVkaSVkOiBhaV9jbWQgbm90IHBvc3NpYmxlLiBBbm90aGVyIGFpX2NtZCBpcyBydW5uaW5nLlxuIiwgZGV2LT5taW5vcik7CisJCXVwKCZ0aGlzX3VzYmR1eGZhc3RzdWItPnNlbSk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCS8vIHNldCBjdXJyZW50IGNoYW5uZWwgb2YgdGhlIHJ1bm5pbmcgYXF1aXNpdGlvbiB0byB6ZXJvCisJcy0+YXN5bmMtPmN1cl9jaGFuID0gMDsKKworCS8vIGlnbm9yZSB0aGUgZmlyc3QgYnVmZmVycyBmcm9tIHRoZSBkZXZpY2UgaWYgdGhlcmUgaXMgYW4gZXJyb3IgY29uZGl0aW9uCisJdGhpc191c2JkdXhmYXN0c3ViLT5pZ25vcmUgPSBQQUNLRVRTX1RPX0lHTk9SRTsKKworCWlmIChjbWQtPmNoYW5saXN0X2xlbiA+IDApIHsKKwkJZ2FpbiA9IENSX1JBTkdFKGNtZC0+Y2hhbmxpc3RbMF0pOworCQlmb3IgKGkgPSAwOyBpIDwgY21kLT5jaGFubGlzdF9sZW47ICsraSkgeworCQkJY2hhbiA9IENSX0NIQU4oY21kLT5jaGFubGlzdFtpXSk7CisJCQlpZiAoY2hhbiAhPSBpKSB7CisJCQkJcHJpbnRrKCJjb21lZGklZDogY21kIGlzIGFjY2VwdGluZyBvbmx5IGNvbnNlY3V0aXZlIGNoYW5uZWxzLlxuIiwgZGV2LT5taW5vcik7CisJCQkJdXAoJnRoaXNfdXNiZHV4ZmFzdHN1Yi0+c2VtKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJCWlmICgoZ2FpbiAhPSBDUl9SQU5HRShjbWQtPmNoYW5saXN0W2ldKSkKKwkJCQkmJiAoY21kLT5jaGFubGlzdF9sZW4gPiAzKSkgeworCQkJCXByaW50aygiY29tZWRpJWQ6IHRoZSBnYWluIG11c3QgYmUgdGhlIHNhbWUgZm9yIGFsbCBjaGFubmVscy5cbiIsIGRldi0+bWlub3IpOworCQkJCXVwKCZ0aGlzX3VzYmR1eGZhc3RzdWItPnNlbSk7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCQlpZiAoaSA+PSBOVU1DSEFOTkVMUykgeworCQkJCXByaW50aygiY29tZWRpJWQ6IGNoYW5uZWwgbGlzdCB0b28gbG9uZ1xuIiwKKwkJCQkJZGV2LT5taW5vcik7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisJc3RlcHMgPSAwOworCWlmIChjbWQtPnNjYW5fYmVnaW5fc3JjID09IFRSSUdfVElNRVIpIHsKKwkJcHJpbnRrKCJjb21lZGklZDogdXNiZHV4ZmFzdDogc2Nhbl9iZWdpbl9zcmM9PVRSSUdfVElNRVIgbm90IHZhbGlkLlxuIiwgZGV2LT5taW5vcik7CisJCXVwKCZ0aGlzX3VzYmR1eGZhc3RzdWItPnNlbSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAoY21kLT5jb252ZXJ0X3NyYyA9PSBUUklHX1RJTUVSKSB7CisJCXN0ZXBzID0gKGNtZC0+Y29udmVydF9hcmcgKiAzMCkgLyAxMDAwOworCX0KKwlpZiAoKHN0ZXBzIDwgTUlOX1NBTVBMSU5HX1BFUklPRCkgJiYgKGNtZC0+Y2hhbmxpc3RfbGVuICE9IDEpKSB7CisJCXByaW50aygiY29tZWRpJWQ6IHVzYmR1eGZhc3Q6IGFpX2NtZDogc3RlcHM9JWxkLCBzY2FuX2JlZ2luX2FyZz0lZC4gTm90IHByb3Blcmx5IHRlc3RlZCBieSBjbWR0ZXN0P1xuIiwgZGV2LT5taW5vciwgc3RlcHMsIGNtZC0+c2Nhbl9iZWdpbl9hcmcpOworCQl1cCgmdGhpc191c2JkdXhmYXN0c3ViLT5zZW0pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKHN0ZXBzID4gTUFYX1NBTVBMSU5HX1BFUklPRCkgeworCQlwcmludGsoImNvbWVkaSVkOiB1c2JkdXhmYXN0OiBhaV9jbWQ6IHNhbXBsaW5nIHJhdGUgdG9vIGxvdy5cbiIsCisJCQlkZXYtPm1pbm9yKTsKKwkJdXAoJnRoaXNfdXNiZHV4ZmFzdHN1Yi0+c2VtKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmICgoY21kLT5zdGFydF9zcmMgPT0gVFJJR19FWFQpICYmIChjbWQtPmNoYW5saXN0X2xlbiAhPSAxKQorCQkmJiAoY21kLT5jaGFubGlzdF9sZW4gIT0gMTYpKSB7CisJCXByaW50aygiY29tZWRpJWQ6IHVzYmR1eGZhc3Q6IGFpX2NtZDogVFJJR19FWFQgb25seSB3aXRoIDEgb3IgMTYgY2hhbm5lbHMgcG9zc2libGUuXG4iLCBkZXYtPm1pbm9yKTsKKwkJdXAoJnRoaXNfdXNiZHV4ZmFzdHN1Yi0+c2VtKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorI2lmZGVmIENPTkZJR19DT01FRElfREVCVUcKKwlwcmludGsoImNvbWVkaSVkOiB1c2JkdXhmYXN0OiBzdGVwcz0lbGQsIGNvbnZlcnRfYXJnPSV1LCBhaV90aW1lcj0ldVxuIiwKKwkJZGV2LT5taW5vciwKKwkJc3RlcHMsIGNtZC0+Y29udmVydF9hcmcsIHRoaXNfdXNiZHV4ZmFzdHN1Yi0+YWlfdGltZXIpOworI2VuZGlmCisKKwlzd2l0Y2ggKGNtZC0+Y2hhbmxpc3RfbGVuKSB7CisJCS8vIG9uZSBjaGFubmVsCisJY2FzZSAxOgorCQlpZiAoQ1JfUkFOR0UoY21kLT5jaGFubGlzdFswXSkgPiAwKQorCQkJcm5nbWFzayA9IDB4ZmYgLSAweDA0OworCQllbHNlCisJCQlybmdtYXNrID0gMHhmZjsKKworCQkvLyBmb3IgZXh0ZXJuYWwgdHJpZ2dlcjogbG9vcGluZyBpbiB0aGlzIHN0YXRlIHVudGlsIHRoZSBSRFkwIHBpbgorCQkvLyBiZWNvbWVzIHplcm8KKwkJaWYgKGNtZC0+c3RhcnRfc3JjID09IFRSSUdfRVhUKSB7CS8vIHdlIGxvb3AgaGVyZSB1bnRpbCByZWFkeSBoYXMgYmVlbiBzZXQKKwkJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW0xFTkJBU0UgKyAwXSA9IDB4MDE7CS8vIGJyYW5jaCBiYWNrIHRvIHN0YXRlIDAKKwkJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW09QQkFTRSArIDBdID0gMHgwMTsJLy8gZGVjZWlzaW9uIHN0YXRlIHcvbyBkYXRhCisJCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tPVVRCQVNFICsgMF0gPQorCQkJCTB4RkYgJiBybmdtYXNrOworCQkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbTE9HQkFTRSArIDBdID0gMHgwMDsJLy8gUkRZMCA9IDAKKwkJfSBlbHNlIHsJLy8gd2UganVzdCBwcm9jZWVkIHRvIHN0YXRlIDEKKwkJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW0xFTkJBU0UgKyAwXSA9IDE7CisJCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tPUEJBU0UgKyAwXSA9IDA7CisJCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tPVVRCQVNFICsgMF0gPQorCQkJCTB4RkYgJiBybmdtYXNrOworCQkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbTE9HQkFTRSArIDBdID0gMDsKKwkJfQorCisJCWlmIChzdGVwcyA8IE1JTl9TQU1QTElOR19QRVJJT0QpIHsKKwkJCS8vIGZvciBmYXN0IHNpbmdsZSBjaGFubmVsIGFxdSB3aXRob3V0IG11eAorCQkJaWYgKHN0ZXBzIDw9IDEpIHsKKwkJCQkvLyB3ZSBqdXN0IHN0YXkgaGVyZSBhdCBzdGF0ZSAxIGFuZCByZXhlY3V0ZSB0aGUgc2FtZSBzdGF0ZQorCQkJCS8vIHRoaXMgZ2l2ZXMgdXMgMzBNSHogc2FtcGxpbmcgcmF0ZQorCQkJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW0xFTkJBU0UgKyAxXSA9IDB4ODk7CS8vIGJyYW5jaCBiYWNrIHRvIHN0YXRlIDEKKwkJCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tPUEJBU0UgKyAxXSA9IDB4MDM7CS8vIGRlY2Vpc2lvbiBzdGF0ZSB3aXRoIGRhdGEKKwkJCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tPVVRCQVNFICsgMV0gPQorCQkJCQkweEZGICYgcm5nbWFzazsKKwkJCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tMT0dCQVNFICsgMV0gPSAweEZGOwkvLyBkb2Vzbid0IG1hdHRlcgorCQkJfSBlbHNlIHsKKwkJCQkvLyB3ZSBsb29wIHRocm91Z2ggdHdvIHN0YXRlczogZGF0YSBhbmQgZGVsYXk6IG1heCByYXRlIGlzIDE1TWh6CisJCQkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbTEVOQkFTRSArIDFdID0KKwkJCQkJc3RlcHMgLSAxOworCQkJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW09QQkFTRSArIDFdID0gMHgwMjsJLy8gZGF0YQorCQkJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW09VVEJBU0UgKyAxXSA9CisJCQkJCTB4RkYgJiBybmdtYXNrOworCQkJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW0xPR0JBU0UgKyAxXSA9IDA7CS8vIGRvZXNuJ3QgbWF0dGVyCisKKwkJCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tMRU5CQVNFICsgMl0gPSAweDA5OwkvLyBicmFuY2ggYmFjayB0byBzdGF0ZSAxCisJCQkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbT1BCQVNFICsgMl0gPSAweDAxOwkvLyBkZWNlaXNpb24gc3RhdGUgdy9vIGRhdGEKKwkJCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tPVVRCQVNFICsgMl0gPQorCQkJCQkweEZGICYgcm5nbWFzazsKKwkJCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tMT0dCQVNFICsgMl0gPSAweEZGOwkvLyBkb2Vzbid0IG1hdHRlcgorCQkJfQorCQl9IGVsc2UgeworCQkJLy8gd2UgbG9vcCB0aHJvdWdoIDMgc3RhdGVzOiAyeCBkZWxheSBhbmQgMXggZGF0YS4gVGhpcyBnaXZlcyBhIG1pbgorCQkJLy8gc2FtcGxpbmcgcmF0ZSBvZiA2MGtIei4KKworCQkJLy8gd2UgaGF2ZSAxIHN0YXRlIHdpdGggZHVyYXRpb24gMQorCQkJc3RlcHMgPSBzdGVwcyAtIDE7CisKKwkJCS8vIGRvIHRoZSBmaXJzdCBwYXJ0IG9mIHRoZSBkZWxheQorCQkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbTEVOQkFTRSArIDFdID0KKwkJCQlzdGVwcyAvIDI7CisJCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tPUEJBU0UgKyAxXSA9IDA7CisJCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tPVVRCQVNFICsgMV0gPQorCQkJCTB4RkYgJiBybmdtYXNrOworCQkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbTE9HQkFTRSArIDFdID0gMDsKKworCQkJLy8gYW5kIHRoZSBzZWNvbmQgcGFydAorCQkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbTEVOQkFTRSArIDJdID0KKwkJCQlzdGVwcyAtIHN0ZXBzIC8gMjsKKwkJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW09QQkFTRSArIDJdID0gMDsKKwkJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW09VVEJBU0UgKyAyXSA9CisJCQkJMHhGRiAmIHJuZ21hc2s7CisJCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tMT0dCQVNFICsgMl0gPSAwOworCisJCQkvLyBnZXQgdGhlIGRhdGEgYW5kIGJyYW5jaCBiYWNrCisJCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tMRU5CQVNFICsgM10gPSAweDA5OwkvLyBicmFuY2ggYmFjayB0byBzdGF0ZSAxCisJCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tPUEJBU0UgKyAzXSA9IDB4MDM7CS8vIGRlY2Vpc2lvbiBzdGF0ZSB3IGRhdGEKKwkJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW09VVEJBU0UgKyAzXSA9CisJCQkJMHhGRiAmIHJuZ21hc2s7CisJCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tMT0dCQVNFICsgM10gPSAweEZGOwkvLyBkb2Vzbid0IG1hdHRlcgorCQl9CisJCWJyZWFrOworCisJY2FzZSAyOgorCQkvLyB0d28gY2hhbm5lbHMKKwkJLy8gY29tbWl0IGRhdGEgdG8gdGhlIEZJRk8KKwkJaWYgKENSX1JBTkdFKGNtZC0+Y2hhbmxpc3RbMF0pID4gMCkKKwkJCXJuZ21hc2sgPSAweGZmIC0gMHgwNDsKKwkJZWxzZQorCQkJcm5nbWFzayA9IDB4ZmY7CisJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW0xFTkJBU0UgKyAwXSA9IDE7CisJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW09QQkFTRSArIDBdID0gMHgwMjsJLy8gZGF0YQorCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tPVVRCQVNFICsgMF0gPSAweEZGICYgcm5nbWFzazsKKwkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbTE9HQkFTRSArIDBdID0gMDsKKworCQkvLyB3ZSBoYXZlIDEgc3RhdGUgd2l0aCBkdXJhdGlvbiAxOiBzdGF0ZSAwCisJCXN0ZXBzX3RtcCA9IHN0ZXBzIC0gMTsKKworCQlpZiAoQ1JfUkFOR0UoY21kLT5jaGFubGlzdFsxXSkgPiAwKQorCQkJcm5nbWFzayA9IDB4ZmYgLSAweDA0OworCQllbHNlCisJCQlybmdtYXNrID0gMHhmZjsKKwkJLy8gZG8gdGhlIGZpcnN0IHBhcnQgb2YgdGhlIGRlbGF5CisJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW0xFTkJBU0UgKyAxXSA9IHN0ZXBzX3RtcCAvIDI7CisJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW09QQkFTRSArIDFdID0gMDsKKwkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbT1VUQkFTRSArIDFdID0gMHhGRSAmIHJuZ21hc2s7CS8vY291bnQKKwkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbTE9HQkFTRSArIDFdID0gMDsKKworCQkvLyBhbmQgdGhlIHNlY29uZCBwYXJ0CisJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW0xFTkJBU0UgKyAyXSA9CisJCQlzdGVwc190bXAgLSBzdGVwc190bXAgLyAyOworCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tPUEJBU0UgKyAyXSA9IDA7CisJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW09VVEJBU0UgKyAyXSA9IDB4RkYgJiBybmdtYXNrOworCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tMT0dCQVNFICsgMl0gPSAwOworCisJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW0xFTkJBU0UgKyAzXSA9IDE7CisJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW09QQkFTRSArIDNdID0gMHgwMjsJLy8gZGF0YQorCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tPVVRCQVNFICsgM10gPSAweEZGICYgcm5nbWFzazsKKwkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbTE9HQkFTRSArIDNdID0gMDsKKworCQkvLyB3ZSBoYXZlIDIgc3RhdGVzIHdpdGggZHVyYXRpb24gMTogc3RlcCA2IGFuZCB0aGUgSURMRSBzdGF0ZQorCQlzdGVwc190bXAgPSBzdGVwcyAtIDI7CisKKwkJaWYgKENSX1JBTkdFKGNtZC0+Y2hhbmxpc3RbMF0pID4gMCkKKwkJCXJuZ21hc2sgPSAweGZmIC0gMHgwNDsKKwkJZWxzZQorCQkJcm5nbWFzayA9IDB4ZmY7CisJCS8vIGRvIHRoZSBmaXJzdCBwYXJ0IG9mIHRoZSBkZWxheQorCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tMRU5CQVNFICsgNF0gPSBzdGVwc190bXAgLyAyOworCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tPUEJBU0UgKyA0XSA9IDA7CisJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW09VVEJBU0UgKyA0XSA9ICgweEZGIC0gMHgwMikgJiBybmdtYXNrOwkvL3Jlc2V0CisJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW0xPR0JBU0UgKyA0XSA9IDA7CisKKwkJLy8gYW5kIHRoZSBzZWNvbmQgcGFydAorCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tMRU5CQVNFICsgNV0gPQorCQkJc3RlcHNfdG1wIC0gc3RlcHNfdG1wIC8gMjsKKwkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbT1BCQVNFICsgNV0gPSAwOworCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tPVVRCQVNFICsgNV0gPSAweEZGICYgcm5nbWFzazsKKwkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbTE9HQkFTRSArIDVdID0gMDsKKworCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tMRU5CQVNFICsgNl0gPSAxOworCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tPUEJBU0UgKyA2XSA9IDA7CisJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW09VVEJBU0UgKyA2XSA9IDB4RkYgJiBybmdtYXNrOworCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tMT0dCQVNFICsgNl0gPSAwOworCQlicmVhazsKKworCWNhc2UgMzoKKwkJLy8gdGhyZWUgY2hhbm5lbHMKKwkJZm9yIChqID0gMDsgaiA8IDE7IGorKykgeworCQkJaWYgKENSX1JBTkdFKGNtZC0+Y2hhbmxpc3Rbal0pID4gMCkKKwkJCQlybmdtYXNrID0gMHhmZiAtIDB4MDQ7CisJCQllbHNlCisJCQkJcm5nbWFzayA9IDB4ZmY7CisJCQkvLyBjb21taXQgZGF0YSB0byB0aGUgRklGTyBhbmQgZG8gdGhlIGZpcnN0IHBhcnQgb2YgdGhlIGRlbGF5CisJCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tMRU5CQVNFICsgaiAqIDJdID0KKwkJCQlzdGVwcyAvIDI7CisJCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tPUEJBU0UgKyBqICogMl0gPSAweDAyOwkvLyBkYXRhCisJCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tPVVRCQVNFICsgaiAqIDJdID0gMHhGRiAmIHJuZ21hc2s7CS8vIG5vIGNoYW5nZQorCQkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbTE9HQkFTRSArIGogKiAyXSA9IDA7CisKKwkJCWlmIChDUl9SQU5HRShjbWQtPmNoYW5saXN0W2ogKyAxXSkgPiAwKQorCQkJCXJuZ21hc2sgPSAweGZmIC0gMHgwNDsKKwkJCWVsc2UKKwkJCQlybmdtYXNrID0gMHhmZjsKKwkJCS8vIGRvIHRoZSBzZWNvbmQgcGFydCBvZiB0aGUgZGVsYXkKKwkJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW0xFTkJBU0UgKyBqICogMiArIDFdID0KKwkJCQlzdGVwcyAtIHN0ZXBzIC8gMjsKKwkJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW09QQkFTRSArIGogKiAyICsgMV0gPSAwOwkvLyBubyBkYXRhCisJCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tPVVRCQVNFICsgaiAqIDIgKyAxXSA9IDB4RkUgJiBybmdtYXNrOwkvL2NvdW50CisJCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tMT0dCQVNFICsgaiAqIDIgKyAxXSA9CisJCQkJMDsKKwkJfQorCisJCS8vIDIgc3RlcHMgd2l0aCBkdXJhdGlvbiAxOiB0aGUgaWRlbGUgc3RlcCBhbmQgc3RlcCA2OgorCQlzdGVwc190bXAgPSBzdGVwcyAtIDI7CisJCS8vIGNvbW1pdCBkYXRhIHRvIHRoZSBGSUZPIGFuZCBkbyB0aGUgZmlyc3QgcGFydCBvZiB0aGUgZGVsYXkKKwkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbTEVOQkFTRSArIDRdID0gc3RlcHNfdG1wIC8gMjsKKwkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbT1BCQVNFICsgNF0gPSAweDAyOwkvLyBkYXRhCisJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW09VVEJBU0UgKyA0XSA9IDB4RkYgJiBybmdtYXNrOwkvLyBubyBjaGFuZ2UKKwkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbTE9HQkFTRSArIDRdID0gMDsKKworCQlpZiAoQ1JfUkFOR0UoY21kLT5jaGFubGlzdFswXSkgPiAwKQorCQkJcm5nbWFzayA9IDB4ZmYgLSAweDA0OworCQllbHNlCisJCQlybmdtYXNrID0gMHhmZjsKKwkJLy8gZG8gdGhlIHNlY29uZCBwYXJ0IG9mIHRoZSBkZWxheQorCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tMRU5CQVNFICsgNV0gPQorCQkJc3RlcHNfdG1wIC0gc3RlcHNfdG1wIC8gMjsKKwkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbT1BCQVNFICsgNV0gPSAwOwkvLyBubyBkYXRhCisJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW09VVEJBU0UgKyA1XSA9ICgweEZGIC0gMHgwMikgJiBybmdtYXNrOwkvLyByZXNldAorCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tMT0dCQVNFICsgNV0gPSAwOworCisJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW0xFTkJBU0UgKyA2XSA9IDE7CisJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW09QQkFTRSArIDZdID0gMDsKKwkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbT1VUQkFTRSArIDZdID0gMHhGRiAmIHJuZ21hc2s7CisJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW0xPR0JBU0UgKyA2XSA9IDA7CisKKwljYXNlIDE2OgorCQlpZiAoQ1JfUkFOR0UoY21kLT5jaGFubGlzdFswXSkgPiAwKQorCQkJcm5nbWFzayA9IDB4ZmYgLSAweDA0OworCQllbHNlCisJCQlybmdtYXNrID0gMHhmZjsKKwkJaWYgKGNtZC0+c3RhcnRfc3JjID09IFRSSUdfRVhUKSB7CS8vIHdlIGxvb3AgaGVyZSB1bnRpbCByZWFkeSBoYXMgYmVlbiBzZXQKKwkJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW0xFTkJBU0UgKyAwXSA9IDB4MDE7CS8vIGJyYW5jaCBiYWNrIHRvIHN0YXRlIDAKKwkJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW09QQkFTRSArIDBdID0gMHgwMTsJLy8gZGVjZWlzaW9uIHN0YXRlIHcvbyBkYXRhCisJCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tPVVRCQVNFICsgMF0gPSAoMHhGRiAtIDB4MDIpICYgcm5nbWFzazsJLy8gcmVzZXQKKwkJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW0xPR0JBU0UgKyAwXSA9IDB4MDA7CS8vIFJEWTAgPSAwCisJCX0gZWxzZSB7CS8vIHdlIGp1c3QgcHJvY2VlZCB0byBzdGF0ZSAxCisJCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tMRU5CQVNFICsgMF0gPSAyNTU7CS8vIDMwdXMgcmVzZXQgcHVsc2UKKwkJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW09QQkFTRSArIDBdID0gMDsKKwkJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW09VVEJBU0UgKyAwXSA9ICgweEZGIC0gMHgwMikgJiBybmdtYXNrOwkvLyByZXNldAorCQkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbTE9HQkFTRSArIDBdID0gMDsKKwkJfQorCisJCS8vIGNvbW1pdCBkYXRhIHRvIHRoZSBGSUZPCisJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW0xFTkJBU0UgKyAxXSA9IDE7CisJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW09QQkFTRSArIDFdID0gMHgwMjsJLy8gZGF0YQorCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tPVVRCQVNFICsgMV0gPSAweEZGICYgcm5nbWFzazsKKwkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbTE9HQkFTRSArIDFdID0gMDsKKworCQkvLyB3ZSBoYXZlIDIgc3RhdGVzIHdpdGggZHVyYXRpb24gMQorCQlzdGVwcyA9IHN0ZXBzIC0gMjsKKworCQkvLyBkbyB0aGUgZmlyc3QgcGFydCBvZiB0aGUgZGVsYXkKKwkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbTEVOQkFTRSArIDJdID0gc3RlcHMgLyAyOworCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tPUEJBU0UgKyAyXSA9IDA7CisJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW09VVEJBU0UgKyAyXSA9IDB4RkUgJiBybmdtYXNrOworCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tMT0dCQVNFICsgMl0gPSAwOworCisJCS8vIGFuZCB0aGUgc2Vjb25kIHBhcnQKKwkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbTEVOQkFTRSArIDNdID0KKwkJCXN0ZXBzIC0gc3RlcHMgLyAyOworCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tPUEJBU0UgKyAzXSA9IDA7CisJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW09VVEJBU0UgKyAzXSA9IDB4RkYgJiBybmdtYXNrOworCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tMT0dCQVNFICsgM10gPSAwOworCisJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW0xFTkJBU0UgKyA0XSA9IDB4MDk7CS8vIGJyYW5jaCBiYWNrIHRvIHN0YXRlIDEKKwkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbT1BCQVNFICsgNF0gPSAweDAxOwkvLyBkZWNlaXNpb24gc3RhdGUgdy9vIGRhdGEKKwkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbT1VUQkFTRSArIDRdID0gMHhGRiAmIHJuZ21hc2s7CisJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW0xPR0JBU0UgKyA0XSA9IDB4RkY7CS8vIGRvZXNuJ3QgbWF0dGVyCisKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlwcmludGsoImNvbWVkaSAlZDogdW5zdXBwb3J0ZWQgY29tYmluYXRpb24gb2YgY2hhbm5lbHNcbiIsCisJCQlkZXYtPm1pbm9yKTsKKwkJdXAoJnRoaXNfdXNiZHV4ZmFzdHN1Yi0+c2VtKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisjaWZkZWYgQ09ORklHX0NPTUVESV9ERUJVRworCXByaW50aygiY29tZWRpICVkOiBzZW5kaW5nIGNvbW1hbmRzIHRvIHRoZSB1c2IgZGV2aWNlXG4iLCBkZXYtPm1pbm9yKTsKKyNlbmRpZgorCS8vIDAgbWVhbnMgdGhhdCB0aGUgQUQgY29tbWFuZHMgYXJlIHNlbnQKKwlyZXN1bHQgPSBzZW5kX2R1eF9jb21tYW5kcyh0aGlzX3VzYmR1eGZhc3RzdWIsIFNFTkRBRENPTU1BTkRTKTsKKwlpZiAocmVzdWx0IDwgMCkgeworCQlwcmludGsoImNvbWVkaSVkOiBhZGMgY29tbWFuZCBjb3VsZCBub3QgYmUgc3VibWl0dGVkLiBBYm9ydGluZy4uLlxuIiwgZGV2LT5taW5vcik7CisJCXVwKCZ0aGlzX3VzYmR1eGZhc3RzdWItPnNlbSk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCWlmIChjbWQtPnN0b3Bfc3JjID09IFRSSUdfQ09VTlQpIHsKKwkJdGhpc191c2JkdXhmYXN0c3ViLT5haV9zYW1wbGVfY291bnQgPQorCQkJKGNtZC0+c3RvcF9hcmcpICogKGNtZC0+c2Nhbl9lbmRfYXJnKTsKKwkJaWYgKHVzYmR1eGZhc3RzdWItPmFpX3NhbXBsZV9jb3VudCA8IDEpIHsKKwkJCXByaW50aygiY29tZWRpJWQ6IChjbWQtPnN0b3BfYXJnKSooY21kLT5zY2FuX2VuZF9hcmcpPDEsIGFib3J0aW5nLlxuIiwgZGV2LT5taW5vcik7CisJCQl1cCgmdGhpc191c2JkdXhmYXN0c3ViLT5zZW0pOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJdGhpc191c2JkdXhmYXN0c3ViLT5haV9jb250aW5vdXMgPSAwOworCX0gZWxzZSB7CisJCS8vIGNvbnRpbm91cyBhcXVpc2l0aW9uCisJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+YWlfY29udGlub3VzID0gMTsKKwkJdGhpc191c2JkdXhmYXN0c3ViLT5haV9zYW1wbGVfY291bnQgPSAwOworCX0KKworCWlmICgoY21kLT5zdGFydF9zcmMgPT0gVFJJR19OT1cpIHx8IChjbWQtPnN0YXJ0X3NyYyA9PSBUUklHX0VYVCkpIHsKKwkJLy8gZW5hYmxlIHRoaXMgYWNxdWlzaXRpb24gb3BlcmF0aW9uCisJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+YWlfY21kX3J1bm5pbmcgPSAxOworCQlyZXQgPSB1c2JkdXhmYXN0c3ViX3N1Ym1pdF9JblVSQnModGhpc191c2JkdXhmYXN0c3ViKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+YWlfY21kX3J1bm5pbmcgPSAwOworCQkJLy8gZml4bWU6IHVubGluayBoZXJlPz8KKwkJCXVwKCZ0aGlzX3VzYmR1eGZhc3RzdWItPnNlbSk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJCXMtPmFzeW5jLT5pbnR0cmlnID0gTlVMTDsKKwl9IGVsc2UgeworCQkvKiBUUklHX0lOVCAqLworCQkvLyBkb24ndCBlbmFibGUgdGhlIGFjcXVpc2lvbiBvcGVyYXRpb24KKwkJLy8gd2FpdCBmb3IgYW4gaW50ZXJuYWwgc2lnbmFsCisJCXMtPmFzeW5jLT5pbnR0cmlnID0gdXNiZHV4ZmFzdF9haV9pbnR0cmlnOworCX0KKwl1cCgmdGhpc191c2JkdXhmYXN0c3ViLT5zZW0pOworCisJcmV0dXJuIDA7Cit9CisKKy8qIE1vZGUgMCBpcyB1c2VkIHRvIGdldCBhIHNpbmdsZSBjb252ZXJzaW9uIG9uIGRlbWFuZCAqLworc3RhdGljIGludCB1c2JkdXhmYXN0X2FpX2luc25fcmVhZChjb21lZGlfZGV2aWNlICogZGV2LAorCWNvbWVkaV9zdWJkZXZpY2UgKiBzLCBjb21lZGlfaW5zbiAqIGluc24sIGxzYW1wbF90ICogZGF0YSkKK3sKKwlpbnQgaSwgaiwgbiwgYWN0dWFsX2xlbmd0aDsKKwlpbnQgY2hhbiwgcmFuZ2UsIHJuZ21hc2s7CisJaW50IGVycjsKKwl1c2JkdXhmYXN0c3ViX3QgKnVzYmR1eGZhc3RzdWIgPSBkZXYtPnByaXZhdGU7CisKKwlpZiAoIXVzYmR1eGZhc3RzdWIpIHsKKwkJcHJpbnRrKCJjb21lZGklZDogYWlfaW5zbl9yZWFkOiBubyB1c2IgZGV2LlxuIiwgZGV2LT5taW5vcik7CisJCXJldHVybiAtRU5PREVWOworCX0KKyNpZmRlZiBDT05GSUdfQ09NRURJX0RFQlVHCisJcHJpbnRrKCJjb21lZGklZDogYWlfaW5zbl9yZWFkLCBpbnNuLT5uPSVkLCBpbnNuLT5zdWJkZXY9JWRcbiIsCisJCWRldi0+bWlub3IsIGluc24tPm4sIGluc24tPnN1YmRldik7CisjZW5kaWYKKwlkb3duKCZ1c2JkdXhmYXN0c3ViLT5zZW0pOworCWlmICghKHVzYmR1eGZhc3RzdWItPnByb2JlZCkpIHsKKwkJdXAoJnVzYmR1eGZhc3RzdWItPnNlbSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKwlpZiAodXNiZHV4ZmFzdHN1Yi0+YWlfY21kX3J1bm5pbmcpIHsKKwkJcHJpbnRrKCJjb21lZGklZDogYWlfaW5zbl9yZWFkIG5vdCBwb3NzaWJsZS4gQXN5bmMgQ29tbWFuZCBpcyBydW5uaW5nLlxuIiwgZGV2LT5taW5vcik7CisJCXVwKCZ1c2JkdXhmYXN0c3ViLT5zZW0pOworCQlyZXR1cm4gLUVCVVNZOworCX0KKwkvLyBzYW1wbGUgb25lIGNoYW5uZWwKKwljaGFuID0gQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyk7CisJcmFuZ2UgPSBDUl9SQU5HRShpbnNuLT5jaGFuc3BlYyk7CisJLy8gc2V0IGNvbW1hbmQgZm9yIHRoZSBmaXJzdCBjaGFubmVsCisKKwlpZiAocmFuZ2UgPiAwKQorCQlybmdtYXNrID0gMHhmZiAtIDB4MDQ7CisJZWxzZQorCQlybmdtYXNrID0gMHhmZjsKKwkvLyBjb21taXQgZGF0YSB0byB0aGUgRklGTworCXVzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tMRU5CQVNFICsgMF0gPSAxOworCXVzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tPUEJBU0UgKyAwXSA9IDB4MDI7CS8vIGRhdGEKKwl1c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbT1VUQkFTRSArIDBdID0gMHhGRiAmIHJuZ21hc2s7CisJdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW0xPR0JBU0UgKyAwXSA9IDA7CisKKwkvLyBkbyB0aGUgZmlyc3QgcGFydCBvZiB0aGUgZGVsYXkKKwl1c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbTEVOQkFTRSArIDFdID0gMTI7CisJdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW09QQkFTRSArIDFdID0gMDsKKwl1c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbT1VUQkFTRSArIDFdID0gMHhGRSAmIHJuZ21hc2s7CisJdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW0xPR0JBU0UgKyAxXSA9IDA7CisKKwl1c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbTEVOQkFTRSArIDJdID0gMTsKKwl1c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbT1BCQVNFICsgMl0gPSAwOworCXVzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tPVVRCQVNFICsgMl0gPSAweEZFICYgcm5nbWFzazsKKwl1c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbTE9HQkFTRSArIDJdID0gMDsKKworCXVzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tMRU5CQVNFICsgM10gPSAxOworCXVzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tPUEJBU0UgKyAzXSA9IDA7CisJdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW09VVEJBU0UgKyAzXSA9IDB4RkUgJiBybmdtYXNrOworCXVzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tMT0dCQVNFICsgM10gPSAwOworCisJdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW0xFTkJBU0UgKyA0XSA9IDE7CisJdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW09QQkFTRSArIDRdID0gMDsKKwl1c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbT1VUQkFTRSArIDRdID0gMHhGRSAmIHJuZ21hc2s7CisJdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW0xPR0JBU0UgKyA0XSA9IDA7CisKKwkvLyBzZWNvbmQgcGFydAorCXVzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tMRU5CQVNFICsgNV0gPSAxMjsKKwl1c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbT1BCQVNFICsgNV0gPSAwOworCXVzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tPVVRCQVNFICsgNV0gPSAweEZGICYgcm5nbWFzazsKKwl1c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbTE9HQkFTRSArIDVdID0gMDsKKworCXVzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tMRU5CQVNFICsgNl0gPSAxOworCXVzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tPUEJBU0UgKyA2XSA9IDA7CisJdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW09VVEJBU0UgKyA2XSA9IDB4RkYgJiBybmdtYXNrOworCXVzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tMT0dCQVNFICsgMF0gPSAwOworCisjaWZkZWYgQ09ORklHX0NPTUVESV9ERUJVRworCXByaW50aygiY29tZWRpICVkOiBzZW5kaW5nIGNvbW1hbmRzIHRvIHRoZSB1c2IgZGV2aWNlXG4iLCBkZXYtPm1pbm9yKTsKKyNlbmRpZgorCS8vIDAgbWVhbnMgdGhhdCB0aGUgQUQgY29tbWFuZHMgYXJlIHNlbnQKKwllcnIgPSBzZW5kX2R1eF9jb21tYW5kcyh1c2JkdXhmYXN0c3ViLCBTRU5EQURDT01NQU5EUyk7CisJaWYgKGVyciA8IDApIHsKKwkJcHJpbnRrKCJjb21lZGklZDogYWRjIGNvbW1hbmQgY291bGQgbm90IGJlIHN1Ym1pdHRlZC4gQWJvcnRpbmcuLi5cbiIsIGRldi0+bWlub3IpOworCQl1cCgmdXNiZHV4ZmFzdHN1Yi0+c2VtKTsKKwkJcmV0dXJuIGVycjsKKwl9CisjaWZkZWYgQ09ORklHX0NPTUVESV9ERUJVRworCXByaW50aygiY29tZWRpJWQ6IHVzYmR1eGZhc3Q6IHN1Ym1pdHRpbmcgaW4tdXJiOiAleCwleFxuIiwKKwkJdXNiZHV4ZmFzdHN1Yi0+Y29tZWRpZGV2LT5taW5vciwKKwkJKGludCkodXNiZHV4ZmFzdHN1Yi0+dXJiSW4tPmNvbnRleHQpLAorCQkoaW50KSh1c2JkdXhmYXN0c3ViLT51cmJJbi0+ZGV2KSk7CisjZW5kaWYKKwlmb3IgKGkgPSAwOyBpIDwgUEFDS0VUU19UT19JR05PUkU7IGkrKykgeworCQllcnIgPSB1c2JfYnVsa19tc2codXNiZHV4ZmFzdHN1Yi0+dXNiZGV2LAorCQkJCSAgIHVzYl9yY3ZidWxrcGlwZSh1c2JkdXhmYXN0c3ViLT51c2JkZXYsCisJCQkJCQkgICBCVUxLSU5FUCksCisJCQkJICAgdXNiZHV4ZmFzdHN1Yi0+dHJhbnNmZXJfYnVmZmVyLCBTSVpFSU5CVUYsCisJCQkJICAgJmFjdHVhbF9sZW5ndGgsIDEwMDAwKTsKKwkJaWYgKGVyciA8IDApIHsKKwkJCXByaW50aygiY29tZWRpJWQ6IGluc24gdGltZW91dC4gTm8gZGF0YS5cbiIsCisJCQkJZGV2LT5taW5vcik7CisJCQl1cCgmdXNiZHV4ZmFzdHN1Yi0+c2VtKTsKKwkJCXJldHVybiBlcnI7CisJCX0KKwl9CisJLy8gZGF0YSBwb2ludHMKKwlmb3IgKGkgPSAwOyBpIDwgaW5zbi0+bjspIHsKKwkJZXJyID0gdXNiX2J1bGtfbXNnKHVzYmR1eGZhc3RzdWItPnVzYmRldiwKKwkJCQkgICB1c2JfcmN2YnVsa3BpcGUodXNiZHV4ZmFzdHN1Yi0+dXNiZGV2LAorCQkJCQkJICAgQlVMS0lORVApLAorCQkJCSAgIHVzYmR1eGZhc3RzdWItPnRyYW5zZmVyX2J1ZmZlciwgU0laRUlOQlVGLAorCQkJCSAgICZhY3R1YWxfbGVuZ3RoLCAxMDAwMCk7CisJCWlmIChlcnIgPCAwKSB7CisJCQlwcmludGsoImNvbWVkaSVkOiBpbnNuIGRhdGEgZXJyb3I6ICVkXG4iLAorCQkJCWRldi0+bWlub3IsIGVycik7CisJCQl1cCgmdXNiZHV4ZmFzdHN1Yi0+c2VtKTsKKwkJCXJldHVybiBlcnI7CisJCX0KKwkJbiA9IGFjdHVhbF9sZW5ndGggLyBzaXplb2YodWludDE2X3QpOworCQlpZiAoKG4gJSAxNikgIT0gMCkgeworCQkJcHJpbnRrKCJjb21lZGklZDogaW5zbiBkYXRhIHBhY2tldCBjb3JydXB0ZWQuXG4iLAorCQkJCWRldi0+bWlub3IpOworCQkJdXAoJnVzYmR1eGZhc3RzdWItPnNlbSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlmb3IgKGogPSBjaGFuOyAoaiA8IG4pICYmIChpIDwgaW5zbi0+bik7IGogPSBqICsgMTYpIHsKKwkJCWRhdGFbaV0gPQorCQkJCSgodWludDE2X3QgKikgKHVzYmR1eGZhc3RzdWItPgorCQkJCQl0cmFuc2Zlcl9idWZmZXIpKVtqXTsKKwkJCWkrKzsKKwkJfQorCX0KKwl1cCgmdXNiZHV4ZmFzdHN1Yi0+c2VtKTsKKwlyZXR1cm4gaTsKK30KKworc3RhdGljIHVuc2lnbmVkIGhleDJ1bnNpZ25lZChjaGFyICpoKQoreworCXVuc2lnbmVkIGhpLCBsbzsKKwlpZiAoaFswXSA+ICc5JykgeworCQloaSA9IGhbMF0gLSAnQScgKyAweDBhOworCX0gZWxzZSB7CisJCWhpID0gaFswXSAtICcwJzsKKwl9CisJaWYgKGhbMV0gPiAnOScpIHsKKwkJbG8gPSBoWzFdIC0gJ0EnICsgMHgwYTsKKwl9IGVsc2UgeworCQlsbyA9IGhbMV0gLSAnMCc7CisJfQorCXJldHVybiBoaSAqIDB4MTAgKyBsbzsKK30KKworLy8gZm9yIEZYMgorI2RlZmluZSBGSVJNV0FSRV9NQVhfTEVOIDB4MjAwMAorCisvLyB0YWtlbiBmcm9tIERhdmlkIEJyb3duZWxsJ3MgZnhsb2FkIGFuZCBhZGp1c3RlZCBmb3IgdGhpcyBkcml2ZXIKK3N0YXRpYyBpbnQgcmVhZF9maXJtd2FyZSh1c2JkdXhmYXN0c3ViX3QgKiB1c2JkdXhmYXN0c3ViLCB2b2lkICpmaXJtd2FyZVB0ciwKKwlsb25nIHNpemUpCit7CisJaW50IGkgPSAwOworCXVuc2lnbmVkIGNoYXIgKmZwID0gKGNoYXIgKilmaXJtd2FyZVB0cjsKKwl1bnNpZ25lZCBjaGFyICpmaXJtd2FyZUJpbmFyeSA9IE5VTEw7CisJaW50IHJlcyA9IDA7CisJaW50IG1heEFkZHIgPSAwOworCisJZmlybXdhcmVCaW5hcnkgPSBrbWFsbG9jKEZJUk1XQVJFX01BWF9MRU4sIEdGUF9LRVJORUwpOworCWlmICghZmlybXdhcmVCaW5hcnkpIHsKKwkJcHJpbnRrKCJjb21lZGlfOiB1c2JkdXhmYXN0OiBtZW0gYWxsb2MgZm9yIGZpcm13YXJlIGZhaWxlZFxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWZvciAoOzspIHsKKwkJY2hhciBidWZbMjU2XSwgKmNwOworCQljaGFyIHR5cGU7CisJCWludCBsZW47CisJCWludCBpZHgsIG9mZjsKKwkJaW50IGogPSAwOworCisJCS8vIGdldCBvbmUgbGluZQorCQl3aGlsZSAoKGkgPCBzaXplKSAmJiAoZnBbaV0gIT0gMTMpICYmIChmcFtpXSAhPSAxMCkpIHsKKwkJCWJ1ZltqXSA9IGZwW2ldOworCQkJaSsrOworCQkJaisrOworCQkJaWYgKGogPj0gc2l6ZW9mKGJ1ZikpIHsKKwkJCQlwcmludGsoImNvbWVkaV86IHVzYmR1eGZhc3Q6IGJvZ3VzIGZpcm13YXJlIGZpbGUhXG4iKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJLy8gZ2V0IHJpZCBvZiBMRi9DUi8uLi4KKwkJd2hpbGUgKChpIDwgc2l6ZSkgJiYgKChmcFtpXSA9PSAxMykgfHwgKGZwW2ldID09IDEwKQorCQkJCXx8IChmcFtpXSA9PSAwKSkpIHsKKwkJCWkrKzsKKwkJfQorCisJCWJ1ZltqXSA9IDA7CisJCS8vcHJpbnRrKCJjb21lZGlfOiBidWY9JXNcbiIsYnVmKTsKKworCQkvKiBFWFRFTlNJT046ICIjIGNvbW1lbnQtdGlsbC1lbmQtb2YtbGluZSIsIGZvciBjb3B5cmlnaHRzIGV0YyAqLworCQlpZiAoYnVmWzBdID09ICcjJykKKwkJCWNvbnRpbnVlOworCisJCWlmIChidWZbMF0gIT0gJzonKSB7CisJCQlwcmludGsoImNvbWVkaV86IHVzYmR1eGZhc3Q6IHVwbG9hZDogbm90IGFuIGloZXggcmVjb3JkOiAlcyIsIGJ1Zik7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCisJCS8qIFJlYWQgdGhlIGxlbmd0aCBmaWVsZCAodXAgdG8gMTYgYnl0ZXMpICovCisJCWxlbiA9IGhleDJ1bnNpZ25lZChidWYgKyAxKTsKKworCQkvKiBSZWFkIHRoZSB0YXJnZXQgb2Zmc2V0ICovCisJCW9mZiA9IChoZXgydW5zaWduZWQoYnVmICsgMykgKiAweDAxMDApICsgaGV4MnVuc2lnbmVkKGJ1ZiArIDUpOworCisJCWlmICgob2ZmICsgbGVuKSA+IG1heEFkZHIpIHsKKwkJCW1heEFkZHIgPSBvZmYgKyBsZW47CisJCX0KKworCQlpZiAobWF4QWRkciA+PSBGSVJNV0FSRV9NQVhfTEVOKSB7CisJCQlwcmludGsoImNvbWVkaV86IHVzYmR1eGZhc3Q6IGZpcm13YXJlIHVwbG9hZCBnb2VzIGJleW9uZCBGWDIgUkFNIGJvdW5kYXJpZXMuIik7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCQkvL3ByaW50aygiY29tZWRpXzogdXNiZHV4ZmFzdDogb2ZmPSV4LCBsZW49JXg6IixvZmYsbGVuKTsKKworCQkvKiBSZWFkIHRoZSByZWNvcmQgdHlwZSAqLworCQl0eXBlID0gaGV4MnVuc2lnbmVkKGJ1ZiArIDcpOworCisJCS8qIElmIHRoaXMgaXMgYW4gRU9GIHJlY29yZCwgdGhlbiBtYWtlIGl0IHNvLiAqLworCQlpZiAodHlwZSA9PSAxKSB7CisJCQlicmVhazsKKwkJfQorCisJCWlmICh0eXBlICE9IDApIHsKKwkJCXByaW50aygiY29tZWRpXzogdXNiZHV4ZmFzdDogdW5zdXBwb3J0ZWQgcmVjb3JkIHR5cGU6ICV1XG4iLCB0eXBlKTsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisKKwkJZm9yIChpZHggPSAwLCBjcCA9IGJ1ZiArIDk7IGlkeCA8IGxlbjsgaWR4ICs9IDEsIGNwICs9IDIpIHsKKwkJCWZpcm13YXJlQmluYXJ5W2lkeCArIG9mZl0gPSBoZXgydW5zaWduZWQoY3ApOworCQkJLy9wcmludGsoIiUwMnggIixmaXJtd2FyZUJpbmFyeVtpZHgrb2ZmXSk7CisJCX0KKwkJLy9wcmludGsoIlxuIik7CisKKwkJaWYgKGkgPj0gc2l6ZSkgeworCQkJcHJpbnRrKCJjb21lZGlfOiB1c2JkdXhmYXN0OiB1bmV4cGVjdGVkIGVuZCBvZiBoZXggZmlsZVxuIik7CisJCQlicmVhazsKKwkJfQorCisJfQorCXJlcyA9IGZpcm13YXJlVXBsb2FkKHVzYmR1eGZhc3RzdWIsIGZpcm13YXJlQmluYXJ5LCBtYXhBZGRyICsgMSk7CisJa2ZyZWUoZmlybXdhcmVCaW5hcnkpOworCXJldHVybiByZXM7Cit9CisKK3N0YXRpYyB2b2lkIHRpZHlfdXAodXNiZHV4ZmFzdHN1Yl90ICogdXNiZHV4ZmFzdHN1Yl90bXApCit7CisjaWZkZWYgQ09ORklHX0NPTUVESV9ERUJVRworCXByaW50aygiY29tZWRpXzogdXNiZHV4ZmFzdDogdGlkaW5nIHVwXG4iKTsKKyNlbmRpZgorCWlmICghdXNiZHV4ZmFzdHN1Yl90bXApIHsKKwkJcmV0dXJuOworCX0KKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDApCisJLy8gc2hvd3MgdGhlIHVzYiBzdWJzeXN0ZW0gdGhhdCB0aGUgZHJpdmVyIGlzIGRvd24KKwlpZiAodXNiZHV4ZmFzdHN1Yl90bXAtPmludGVyZmFjZSkgeworCQl1c2Jfc2V0X2ludGZkYXRhKHVzYmR1eGZhc3RzdWJfdG1wLT5pbnRlcmZhY2UsIE5VTEwpOworCX0KKyNlbmRpZgorCisJdXNiZHV4ZmFzdHN1Yl90bXAtPnByb2JlZCA9IDA7CisKKwlpZiAodXNiZHV4ZmFzdHN1Yl90bXAtPnVyYkluKSB7CisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiw4KQorCQkvLyB3YWl0cyB1bnRpbCBhIHJ1bm5pbmcgdHJhbnNmZXIgaXMgb3ZlcgorCQkvLyB0aHVzLCB1bmRlciAyLjQgaG90cGx1Z2dpbmcgd2hpbGUgYSBjb21tYW5kCisJCS8vIGlzIHJ1bm5pbmcgaXMgbm90IHNhZmUKKwkJdXNiX2tpbGxfdXJiKHVzYmR1eGZhc3RzdWJfdG1wLT51cmJJbik7CisjZW5kaWYKKwkJaWYgKHVzYmR1eGZhc3RzdWJfdG1wLT50cmFuc2Zlcl9idWZmZXIpIHsKKwkJCWtmcmVlKHVzYmR1eGZhc3RzdWJfdG1wLT50cmFuc2Zlcl9idWZmZXIpOworCQkJdXNiZHV4ZmFzdHN1Yl90bXAtPnRyYW5zZmVyX2J1ZmZlciA9IE5VTEw7CisJCX0KKwkJdXNiX2ZyZWVfdXJiKHVzYmR1eGZhc3RzdWJfdG1wLT51cmJJbik7CisJCXVzYmR1eGZhc3RzdWJfdG1wLT51cmJJbiA9IE5VTEw7CisJfQorCWlmICh1c2JkdXhmYXN0c3ViX3RtcC0+aW5zbkJ1ZmZlcikgeworCQlrZnJlZSh1c2JkdXhmYXN0c3ViX3RtcC0+aW5zbkJ1ZmZlcik7CisJCXVzYmR1eGZhc3RzdWJfdG1wLT5pbnNuQnVmZmVyID0gTlVMTDsKKwl9CisJaWYgKHVzYmR1eGZhc3RzdWJfdG1wLT5kdXhfY29tbWFuZHMpIHsKKwkJa2ZyZWUodXNiZHV4ZmFzdHN1Yl90bXAtPmR1eF9jb21tYW5kcyk7CisJCXVzYmR1eGZhc3RzdWJfdG1wLT5kdXhfY29tbWFuZHMgPSBOVUxMOworCX0KKwl1c2JkdXhmYXN0c3ViX3RtcC0+YWlfY21kX3J1bm5pbmcgPSAwOworfQorCisvLyBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSB1cmJzIGFuZCBpbml0aWFsaXNlIHRoZW0KKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMCkKK3N0YXRpYyB2b2lkICp1c2JkdXhmYXN0c3ViX3Byb2JlKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2LAorCXVuc2lnbmVkIGludCBpbnRlcmZudW0sIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKK3sKKyNlbHNlCitzdGF0aWMgaW50IHVzYmR1eGZhc3RzdWJfcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKnVpbnRlcmYsCisJY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKQoreworCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldih1aW50ZXJmKTsKKyNlbmRpZgorCWludCBpOworCWludCBpbmRleDsKKworCWlmICh1ZGV2LT5zcGVlZCAhPSBVU0JfU1BFRURfSElHSCkgeworCQlwcmludGsoImNvbWVkaV86IHVzYmR1eGZhc3RfOiBUaGlzIGRyaXZlciBuZWVkcyBVU0IgMi4wIHRvIG9wZXJhdGUuIEFib3J0aW5nLi4uXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorI2lmZGVmIENPTkZJR19DT01FRElfREVCVUcKKwlwcmludGsoImNvbWVkaV86IHVzYmR1eGZhc3RfOiBmaW5kaW5nIGEgZnJlZSBzdHJ1Y3R1cmUgZm9yIHRoZSB1c2ItZGV2aWNlXG4iKTsKKyNlbmRpZgorCWRvd24oJnN0YXJ0X3N0b3Bfc2VtKTsKKwkvLyBsb29rIGZvciBhIGZyZWUgcGxhY2UgaW4gdGhlIHVzYmR1eGZhc3QgYXJyYXkKKwlpbmRleCA9IC0xOworCWZvciAoaSA9IDA7IGkgPCBOVU1VU0JEVVhGQVNUOyBpKyspIHsKKwkJaWYgKCEodXNiZHV4ZmFzdHN1YltpXS5wcm9iZWQpKSB7CisJCQlpbmRleCA9IGk7CisJCQlicmVhazsKKwkJfQorCX0KKworCS8vIG5vIG1vcmUgc3BhY2UKKwlpZiAoaW5kZXggPT0gLTEpIHsKKwkJcHJpbnRrKCJUb28gbWFueSB1c2JkdXhmYXN0LWRldmljZXMgY29ubmVjdGVkLlxuIik7CisJCXVwKCZzdGFydF9zdG9wX3NlbSk7CisJCXJldHVybiAtRU1GSUxFOworCX0KKyNpZmRlZiBDT05GSUdfQ09NRURJX0RFQlVHCisJcHJpbnRrKCJjb21lZGlfOiB1c2JkdXhmYXN0OiB1c2JkdXhmYXN0c3ViWyVkXSBpcyByZWFkeSB0byBjb25uZWN0IHRvIGNvbWVkaS5cbiIsIGluZGV4KTsKKyNlbmRpZgorCisJaW5pdF9NVVRFWCgmKHVzYmR1eGZhc3RzdWJbaW5kZXhdLnNlbSkpOworCS8vIHNhdmUgYSBwb2ludGVyIHRvIHRoZSB1c2IgZGV2aWNlCisJdXNiZHV4ZmFzdHN1YltpbmRleF0udXNiZGV2ID0gdWRldjsKKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwwKQorCS8vIHNhdmUgdGhlIGludGVyZmFjZSBudW1iZXIKKwl1c2JkdXhmYXN0c3ViW2luZGV4XS5pZm51bSA9IGludGVyZm51bTsKKyNlbHNlCisJLy8gMi42OiBzYXZlIHRoZSBpbnRlcmZhY2UgaXRzZWxmCisJdXNiZHV4ZmFzdHN1YltpbmRleF0uaW50ZXJmYWNlID0gdWludGVyZjsKKwkvLyBnZXQgdGhlIGludGVyZmFjZSBudW1iZXIgZnJvbSB0aGUgaW50ZXJmYWNlCisJdXNiZHV4ZmFzdHN1YltpbmRleF0uaWZudW0gPSB1aW50ZXJmLT5hbHRzZXR0aW5nLT5kZXNjLmJJbnRlcmZhY2VOdW1iZXI7CisJLy8gaGFuZCB0aGUgcHJpdmF0ZSBkYXRhIG92ZXIgdG8gdGhlIHVzYiBzdWJzeXN0ZW0KKwkvLyB3aWxsIGJlIG5lZWRlZCBmb3IgZGlzY29ubmVjdAorCXVzYl9zZXRfaW50ZmRhdGEodWludGVyZiwgJih1c2JkdXhmYXN0c3ViW2luZGV4XSkpOworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfQ09NRURJX0RFQlVHCisJcHJpbnRrKCJjb21lZGlfOiB1c2JkdXhmYXN0OiBpZm51bT0lZFxuIiwgdXNiZHV4ZmFzdHN1YltpbmRleF0uaWZudW0pOworI2VuZGlmCisJLy8gY3JlYXRlIHNwYWNlIGZvciB0aGUgY29tbWFuZHMgZ29pbmcgdG8gdGhlIHVzYiBkZXZpY2UKKwl1c2JkdXhmYXN0c3ViW2luZGV4XS5kdXhfY29tbWFuZHMgPSBrbWFsbG9jKFNJWkVPRkRVWEJVRkZFUiwKKwkJR0ZQX0tFUk5FTCk7CisJaWYgKCF1c2JkdXhmYXN0c3ViW2luZGV4XS5kdXhfY29tbWFuZHMpIHsKKwkJcHJpbnRrKCJjb21lZGlfOiB1c2JkdXhmYXN0OiBlcnJvciBhbGxvYyBzcGFjZSBmb3IgZGFjIGNvbW1hbmRzXG4iKTsKKwkJdGlkeV91cCgmKHVzYmR1eGZhc3RzdWJbaW5kZXhdKSk7CisJCXVwKCZzdGFydF9zdG9wX3NlbSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwkvLyBjcmVhdGUgc3BhY2Ugb2YgdGhlIGluc3RydWN0aW9uIGJ1ZmZlcgorCXVzYmR1eGZhc3RzdWJbaW5kZXhdLmluc25CdWZmZXIgPSBrbWFsbG9jKFNJWkVJTlNOQlVGLCBHRlBfS0VSTkVMKTsKKwlpZiAoISh1c2JkdXhmYXN0c3ViW2luZGV4XS5pbnNuQnVmZmVyKSkgeworCQlwcmludGsoImNvbWVkaV86IHVzYmR1eGZhc3Q6IGNvdWxkIG5vdCBhbGxvYyBzcGFjZSBmb3IgaW5zbkJ1ZmZlclxuIik7CisJCXRpZHlfdXAoJih1c2JkdXhmYXN0c3ViW2luZGV4XSkpOworCQl1cCgmc3RhcnRfc3RvcF9zZW0pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJLy8gc2V0dGluZyB0byBhbHRlcm5hdGUgc2V0dGluZyAxOiBlbmFibGluZyBidWxrIGVwCisJaSA9IHVzYl9zZXRfaW50ZXJmYWNlKHVzYmR1eGZhc3RzdWJbaW5kZXhdLnVzYmRldiwKKwkJdXNiZHV4ZmFzdHN1YltpbmRleF0uaWZudW0sIDEpOworCWlmIChpIDwgMCkgeworCQlwcmludGsoImNvbWVkaV86IHVzYmR1eGZhc3QlZDogY291bGQgbm90IHN3aXRjaCB0byBhbHRlcm5hdGUgc2V0dGluZyAxLlxuIiwgaW5kZXgpOworCQl0aWR5X3VwKCYodXNiZHV4ZmFzdHN1YltpbmRleF0pKTsKKwkJdXAoJnN0YXJ0X3N0b3Bfc2VtKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCXVzYmR1eGZhc3RzdWJbaW5kZXhdLnVyYkluID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKKwlpZiAodXNiZHV4ZmFzdHN1YltpbmRleF0udXJiSW4gPT0gTlVMTCkgeworCQlwcmludGsoImNvbWVkaV86IHVzYmR1eGZhc3QlZDogQ291bGQgbm90IGFsbG9jLiB1cmJcbiIsIGluZGV4KTsKKwkJdGlkeV91cCgmKHVzYmR1eGZhc3RzdWJbaW5kZXhdKSk7CisJCXVwKCZzdGFydF9zdG9wX3NlbSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwl1c2JkdXhmYXN0c3ViW2luZGV4XS50cmFuc2Zlcl9idWZmZXIgPSBrbWFsbG9jKFNJWkVJTkJVRiwgR0ZQX0tFUk5FTCk7CisJaWYgKCEodXNiZHV4ZmFzdHN1YltpbmRleF0udHJhbnNmZXJfYnVmZmVyKSkgeworCQlwcmludGsoImNvbWVkaV86IHVzYmR1eGZhc3QlZDogY291bGQgbm90IGFsbG9jLiB0cmFuc2IuXG4iLAorCQkJaW5kZXgpOworCQl0aWR5X3VwKCYodXNiZHV4ZmFzdHN1YltpbmRleF0pKTsKKwkJdXAoJnN0YXJ0X3N0b3Bfc2VtKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCS8vIHdlJ3ZlIHJlYWNoZWQgdGhlIGJvdHRvbSBvZiB0aGUgZnVuY3Rpb24KKwl1c2JkdXhmYXN0c3ViW2luZGV4XS5wcm9iZWQgPSAxOworCXVwKCZzdGFydF9zdG9wX3NlbSk7CisJcHJpbnRrKCJjb21lZGlfOiB1c2JkdXhmYXN0JWQgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IGluaXRpYWxpemVkLlxuIiwKKwkJaW5kZXgpOworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwwKQorCXJldHVybiAodm9pZCAqKSgmdXNiZHV4ZmFzdHN1YltpbmRleF0pOworI2Vsc2UKKwkvLyBzdWNjZXNzCisJcmV0dXJuIDA7CisjZW5kaWYKK30KKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwwKQorc3RhdGljIHZvaWQgdXNiZHV4ZmFzdHN1Yl9kaXNjb25uZWN0KHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2LCB2b2lkICpwdHIpCit7CisJdXNiZHV4ZmFzdHN1Yl90ICp1c2JkdXhmYXN0c3ViX3RtcCA9ICh1c2JkdXhmYXN0c3ViX3QgKikgcHRyOworI2Vsc2UKK3N0YXRpYyB2b2lkIHVzYmR1eGZhc3RzdWJfZGlzY29ubmVjdChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKK3sKKwl1c2JkdXhmYXN0c3ViX3QgKnVzYmR1eGZhc3RzdWJfdG1wID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IGludGVyZmFjZV90b191c2JkZXYoaW50Zik7CisjZW5kaWYKKwlpZiAoIXVzYmR1eGZhc3RzdWJfdG1wKSB7CisJCXByaW50aygiY29tZWRpXzogdXNiZHV4ZmFzdDogZGlzY29ubmVjdCBjYWxsZWQgd2l0aCBudWxsIHBvaW50ZXIuXG4iKTsKKwkJcmV0dXJuOworCX0KKwlpZiAodXNiZHV4ZmFzdHN1Yl90bXAtPnVzYmRldiAhPSB1ZGV2KSB7CisJCXByaW50aygiY29tZWRpXzogdXNiZHV4ZmFzdDogQlVHISBjYWxsZWQgd2l0aCB3cm9uZyBwdHIhISFcbiIpOworCQlyZXR1cm47CisJfQorCWRvd24oJnN0YXJ0X3N0b3Bfc2VtKTsKKwlkb3duKCZ1c2JkdXhmYXN0c3ViX3RtcC0+c2VtKTsKKwl0aWR5X3VwKHVzYmR1eGZhc3RzdWJfdG1wKTsKKwl1cCgmdXNiZHV4ZmFzdHN1Yl90bXAtPnNlbSk7CisJdXAoJnN0YXJ0X3N0b3Bfc2VtKTsKKyNpZmRlZiBDT05GSUdfQ09NRURJX0RFQlVHCisJcHJpbnRrKCJjb21lZGlfOiB1c2JkdXhmYXN0OiBkaXNjb25uZWN0ZWQgZnJvbSB0aGUgdXNiXG4iKTsKKyNlbmRpZgorfQorCisvLyBpcyBjYWxsZWQgd2hlbiBjb21lZGktY29uZmlnIGlzIGNhbGxlZAorc3RhdGljIGludCB1c2JkdXhmYXN0X2F0dGFjaChjb21lZGlfZGV2aWNlICogZGV2LCBjb21lZGlfZGV2Y29uZmlnICogaXQpCit7CisJaW50IHJldDsKKwlpbnQgaW5kZXg7CisJaW50IGk7CisJY29tZWRpX3N1YmRldmljZSAqcyA9IE5VTEw7CisJZGV2LT5wcml2YXRlID0gTlVMTDsKKworCWRvd24oJnN0YXJ0X3N0b3Bfc2VtKTsKKwkvLyBmaW5kIGEgdmFsaWQgZGV2aWNlIHdoaWNoIGhhcyBiZWVuIGRldGVjdGVkIGJ5IHRoZSBwcm9iZSBmdW5jdGlvbiBvZiB0aGUgdXNiCisJaW5kZXggPSAtMTsKKwlmb3IgKGkgPSAwOyBpIDwgTlVNVVNCRFVYRkFTVDsgaSsrKSB7CisJCWlmICgodXNiZHV4ZmFzdHN1YltpXS5wcm9iZWQpICYmICghdXNiZHV4ZmFzdHN1YltpXS5hdHRhY2hlZCkpIHsKKwkJCWluZGV4ID0gaTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKGluZGV4IDwgMCkgeworCQlwcmludGsoImNvbWVkaSVkOiB1c2JkdXhmYXN0OiBlcnJvcjogYXR0YWNoIGZhaWxlZCwgbm8gdXNiZHV4ZmFzdCBkZXZzIGNvbm5lY3RlZCB0byB0aGUgdXNiIGJ1cy5cbiIsIGRldi0+bWlub3IpOworCQl1cCgmc3RhcnRfc3RvcF9zZW0pOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlkb3duKCYodXNiZHV4ZmFzdHN1YltpbmRleF0uc2VtKSk7CisJLy8gcG9pbnRlciBiYWNrIHRvIHRoZSBjb3JyZXNwb25kaW5nIGNvbWVkaSBkZXZpY2UKKwl1c2JkdXhmYXN0c3ViW2luZGV4XS5jb21lZGlkZXYgPSBkZXY7CisKKwkvLyB0cnlpbmcgdG8gdXBsb2FkIHRoZSBmaXJtd2FyZSBpbnRvIHRoZSBjaGlwCisJaWYgKGNvbWVkaV9hdXhfZGF0YShpdC0+b3B0aW9ucywgMCkgJiYKKwkJaXQtPm9wdGlvbnNbQ09NRURJX0RFVkNPTkZfQVVYX0RBVEFfTEVOR1RIXSkgeworCQlyZWFkX2Zpcm13YXJlKHVzYmR1eGZhc3RzdWIsCisJCQljb21lZGlfYXV4X2RhdGEoaXQtPm9wdGlvbnMsIDApLAorCQkJaXQtPm9wdGlvbnNbQ09NRURJX0RFVkNPTkZfQVVYX0RBVEFfTEVOR1RIXSk7CisJfQorCisJZGV2LT5ib2FyZF9uYW1lID0gQk9BUkROQU1FOworCisJLyogc2V0IG51bWJlciBvZiBzdWJkZXZpY2VzICovCisJZGV2LT5uX3N1YmRldmljZXMgPSBOX1NVQkRFVklDRVM7CisKKwkvLyBhbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIHN1YmRldmljZXMKKwlpZiAoKHJldCA9IGFsbG9jX3N1YmRldmljZXMoZGV2LCBOX1NVQkRFVklDRVMpKSA8IDApIHsKKwkJcHJpbnRrKCJjb21lZGklZDogdXNiZHV4ZmFzdDogZXJyb3IgYWxsb2Mgc3BhY2UgZm9yIHN1YmRldlxuIiwKKwkJCWRldi0+bWlub3IpOworCQl1cCgmc3RhcnRfc3RvcF9zZW0pOworCQlyZXR1cm4gcmV0OworCX0KKworCXByaW50aygiY29tZWRpJWQ6IHVzYmR1eGZhc3Q6IHVzYi1kZXZpY2UgJWQgaXMgYXR0YWNoZWQgdG8gY29tZWRpLlxuIiwKKwkJZGV2LT5taW5vciwgaW5kZXgpOworCS8vIHByaXZhdGUgc3RydWN0dXJlIGlzIGFsc28gc2ltcGx5IHRoZSB1c2Itc3RydWN0dXJlCisJZGV2LT5wcml2YXRlID0gdXNiZHV4ZmFzdHN1YiArIGluZGV4OworCS8vIHRoZSBmaXJzdCBzdWJkZXZpY2UgaXMgdGhlIEEvRCBjb252ZXJ0ZXIKKwlzID0gZGV2LT5zdWJkZXZpY2VzICsgU1VCREVWX0FEOworCS8vIHRoZSBVUkJzIGdldCB0aGUgY29tZWRpIHN1YmRldmljZQorCS8vIHdoaWNoIGlzIHJlc3BvbnNpYmxlIGZvciByZWFkaW5nCisJLy8gdGhpcyBpcyB0aGUgc3ViZGV2aWNlIHdoaWNoIHJlYWRzIGRhdGEKKwlkZXYtPnJlYWRfc3ViZGV2ID0gczsKKwkvLyB0aGUgc3ViZGV2aWNlIHJlY2VpdmVzIGFzIHByaXZhdGUgc3RydWN0dXJlIHRoZQorCS8vIHVzYi1zdHJ1Y3R1cmUKKwlzLT5wcml2YXRlID0gTlVMTDsKKwkvLyBhbmFsb2cgaW5wdXQKKwlzLT50eXBlID0gQ09NRURJX1NVQkRfQUk7CisJLy8gcmVhZGFibGUgYW5kIHJlZiBpcyB0byBncm91bmQKKwlzLT5zdWJkZXZfZmxhZ3MgPSBTREZfUkVBREFCTEUgfCBTREZfR1JPVU5EIHwgU0RGX0NNRF9SRUFEOworCS8vIDE2IGNoYW5uZWxzCisJcy0+bl9jaGFuID0gMTY7CisJLy8gbGVuZ3RoIG9mIHRoZSBjaGFubmVsbGlzdAorCXMtPmxlbl9jaGFubGlzdCA9IDE2OworCS8vIGNhbGxiYWNrIGZ1bmN0aW9ucworCXMtPmluc25fcmVhZCA9IHVzYmR1eGZhc3RfYWlfaW5zbl9yZWFkOworCXMtPmRvX2NtZHRlc3QgPSB1c2JkdXhmYXN0X2FpX2NtZHRlc3Q7CisJcy0+ZG9fY21kID0gdXNiZHV4ZmFzdF9haV9jbWQ7CisJcy0+Y2FuY2VsID0gdXNiZHV4ZmFzdF9haV9jYW5jZWw7CisJLy8gbWF4IHZhbHVlIGZyb20gdGhlIEEvRCBjb252ZXJ0ZXIgKDEyYml0KzEgYml0IGZvciBvdmVyZmxvdykKKwlzLT5tYXhkYXRhID0gMHgxMDAwOworCS8vIHJhbmdlIHRhYmxlIHRvIGNvbnZlcnQgdG8gcGh5c2ljYWwgdW5pdHMKKwlzLT5yYW5nZV90YWJsZSA9ICZyYW5nZV91c2JkdXhmYXN0X2FpX3JhbmdlOworCisJLy8gZmluYWxseSBkZWNpZGUgdGhhdCBpdCdzIGF0dGFjaGVkCisJdXNiZHV4ZmFzdHN1YltpbmRleF0uYXR0YWNoZWQgPSAxOworCisJdXAoJih1c2JkdXhmYXN0c3ViW2luZGV4XS5zZW0pKTsKKworCXVwKCZzdGFydF9zdG9wX3NlbSk7CisKKwlwcmludGsoImNvbWVkaSVkOiBzdWNjZXNzZnVsbHkgYXR0YWNoZWQgdG8gdXNiZHV4ZmFzdC5cbiIsIGRldi0+bWlub3IpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdXNiZHV4ZmFzdF9kZXRhY2goY29tZWRpX2RldmljZSAqIGRldikKK3sKKwl1c2JkdXhmYXN0c3ViX3QgKnVzYmR1eGZhc3RzdWJfdG1wOworCisjaWZkZWYgQ09ORklHX0NPTUVESV9ERUJVRworCXByaW50aygiY29tZWRpJWQ6IHVzYmR1eGZhc3Q6IGRldGFjaCB1c2IgZGV2aWNlXG4iLCBkZXYtPm1pbm9yKTsKKyNlbmRpZgorCisJaWYgKCFkZXYpIHsKKwkJcHJpbnRrKCJjb21lZGk/OiB1c2JkdXhmYXN0OiBkZXRhY2ggd2l0aG91dCBkZXYgdmFyaWFibGUuLi5cbiIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwl1c2JkdXhmYXN0c3ViX3RtcCA9IGRldi0+cHJpdmF0ZTsKKwlpZiAoIXVzYmR1eGZhc3RzdWJfdG1wKSB7CisJCXByaW50aygiY29tZWRpPzogdXNiZHV4ZmFzdDogZGV0YWNoIHdpdGhvdXQgcHRyIHRvIHVzYmR1eGZhc3RzdWJbXVxuIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCWRvd24oJnVzYmR1eGZhc3RzdWJfdG1wLT5zZW0pOworCWRvd24oJnN0YXJ0X3N0b3Bfc2VtKTsKKwkvLyBEb24ndCBhbGxvdyBkZXRhY2ggdG8gZnJlZSB0aGUgcHJpdmF0ZSBzdHJ1Y3R1cmUKKwkvLyBJdCdzIG9uZSBlbnRyeSBvZiBvZiB1c2JkdXhmYXN0c3ViW10KKwlkZXYtPnByaXZhdGUgPSBOVUxMOworCXVzYmR1eGZhc3RzdWJfdG1wLT5hdHRhY2hlZCA9IDA7CisJdXNiZHV4ZmFzdHN1Yl90bXAtPmNvbWVkaWRldiA9IE5VTEw7CisjaWZkZWYgQ09ORklHX0NPTUVESV9ERUJVRworCXByaW50aygiY29tZWRpJWQ6IHVzYmR1eGZhc3Q6IGRldGFjaDogc3VjY2Vzc2Z1bGx5IHJlbW92ZWRcbiIsCisJCWRldi0+bWlub3IpOworI2VuZGlmCisJdXAoJnN0YXJ0X3N0b3Bfc2VtKTsKKwl1cCgmdXNiZHV4ZmFzdHN1Yl90bXAtPnNlbSk7CisJcmV0dXJuIDA7Cit9CisKKy8qIG1haW4gZHJpdmVyIHN0cnVjdCAqLworc3RhdGljIGNvbWVkaV9kcml2ZXIgZHJpdmVyX3VzYmR1eGZhc3QgPSB7CisgICAgICBkcml2ZXJfbmFtZToidXNiZHV4ZmFzdCIsCisgICAgICBtb2R1bGU6VEhJU19NT0RVTEUsCisgICAgICBhdHRhY2g6dXNiZHV4ZmFzdF9hdHRhY2gsCisgICAgICBkZXRhY2g6dXNiZHV4ZmFzdF9kZXRhY2gsCit9OworCitzdGF0aWMgdm9pZCBpbml0X3VzYl9kZXZpY2VzKHZvaWQpCit7CisJaW50IGluZGV4OworI2lmZGVmIENPTkZJR19DT01FRElfREVCVUcKKwlwcmludGsoImNvbWVkaV86IHVzYmR1eGZhc3Q6IHNldHRpbmcgYWxsIHBvc3NpYmxlIGRldnMgdG8gaW52YWxpZFxuIik7CisjZW5kaWYKKwkvLyBhbGwgZGV2aWNlcyBlbnRyaWVzIGFyZSBpbnZhbGlkIHRvIGJlZ2luIHdpdGgKKwkvLyB0aGV5IHdpbGwgYmVjb21lIHZhbGlkIGJ5IHRoZSBwcm9iZSBmdW5jdGlvbgorCS8vIGFuZCB0aGVuIGZpbmFsbHkgYnkgdGhlIGF0dGFjaC1mdW5jdGlvbgorCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IE5VTVVTQkRVWEZBU1Q7IGluZGV4KyspIHsKKwkJbWVtc2V0KCYodXNiZHV4ZmFzdHN1YltpbmRleF0pLCAweDAwLAorCQkJc2l6ZW9mKHVzYmR1eGZhc3RzdWJbaW5kZXhdKSk7CisJCWluaXRfTVVURVgoJih1c2JkdXhmYXN0c3ViW2luZGV4XS5zZW0pKTsKKwl9Cit9CisKKy8vIFRhYmxlIHdpdGggdGhlIFVTQi1kZXZpY2VzOiBqdXN0IG5vdyBvbmx5IHRlc3RpbmcgSURzCitzdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgdXNiZHV4ZmFzdHN1Yl90YWJsZVtdID0geworCS8vICAgICAgICB7IFVTQl9ERVZJQ0UoMHg0YjQsIDB4ODYxMyksIC8vdGVzdGluZworCS8vICAgICAgICB9LAorCXtVU0JfREVWSUNFKDB4MTNkOCwgMHgwMDEwKQkvL3JlYWwgSUQKKwkJfSwKKwl7VVNCX0RFVklDRSgweDEzZDgsIDB4MDAxMSkJLy9yZWFsIElECisJCX0sCisJe30JCQkvKiBUZXJtaW5hdGluZyBlbnRyeSAqLworfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRSh1c2IsIHVzYmR1eGZhc3RzdWJfdGFibGUpOworCisvLyBUaGUgdXNiZHV4ZmFzdHN1Yi1kcml2ZXIKK3N0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciB1c2JkdXhmYXN0c3ViX2RyaXZlciA9IHsKKyNpZmRlZiBDT01FRElfSEFWRV9VU0JfRFJJVkVSX09XTkVSCisgICAgICBvd25lcjpUSElTX01PRFVMRSwKKyNlbmRpZgorICAgICAgbmFtZTpCT0FSRE5BTUUsCisgICAgICBwcm9iZTp1c2JkdXhmYXN0c3ViX3Byb2JlLAorICAgICAgZGlzY29ubmVjdDp1c2JkdXhmYXN0c3ViX2Rpc2Nvbm5lY3QsCisgICAgICBpZF90YWJsZTp1c2JkdXhmYXN0c3ViX3RhYmxlLAorfTsKKworLy8gQ2FuJ3QgdXNlIHRoZSBuaWNlIG1hY3JvIGFzIEkgaGF2ZSBhbHNvIHRvIGluaXRpYWxpc2UgdGhlIFVTQgorLy8gc3Vic3lzdGVtOgorLy8gcmVnaXN0ZXJpbmcgdGhlIHVzYi1zeXN0ZW0gX2FuZF8gdGhlIGNvbWVkaS1kcml2ZXIKK3N0YXRpYyBpbnQgaW5pdF91c2JkdXhmYXN0KHZvaWQpCit7CisJcHJpbnRrKEtFUk5fSU5GTyBLQlVJTERfTU9ETkFNRSAiOiAiCisJICAgICAgIERSSVZFUl9WRVJTSU9OICI6IiBEUklWRVJfREVTQyAiXG4iKTsKKwlpbml0X3VzYl9kZXZpY2VzKCk7CisJdXNiX3JlZ2lzdGVyKCZ1c2JkdXhmYXN0c3ViX2RyaXZlcik7CisJY29tZWRpX2RyaXZlcl9yZWdpc3RlcigmZHJpdmVyX3VzYmR1eGZhc3QpOworCXJldHVybiAwOworfQorCisvLyBkZXJlZ2lzdGVyaW5nIHRoZSBjb21lZGkgZHJpdmVyIGFuZCB0aGUgdXNiLXN1YnN5c3RlbQorc3RhdGljIHZvaWQgZXhpdF91c2JkdXhmYXN0KHZvaWQpCit7CisJY29tZWRpX2RyaXZlcl91bnJlZ2lzdGVyKCZkcml2ZXJfdXNiZHV4ZmFzdCk7CisJdXNiX2RlcmVnaXN0ZXIoJnVzYmR1eGZhc3RzdWJfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoaW5pdF91c2JkdXhmYXN0KTsKK21vZHVsZV9leGl0KGV4aXRfdXNiZHV4ZmFzdCk7CisKK01PRFVMRV9BVVRIT1IoRFJJVkVSX0FVVEhPUik7CitNT0RVTEVfREVTQ1JJUFRJT04oRFJJVkVSX0RFU0MpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9pbnRlcnJ1cHQuaCBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvaW50ZXJydXB0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzAzOGU0NgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvaW50ZXJydXB0LmgKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAgICBsaW51eC9pbnRlcnJ1cHQuaCBjb21wYXRpYmlsaXR5IGhlYWRlcgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0NPTVBBVF9MSU5VWF9JTlRFUlJVUFRfSF8KKyNkZWZpbmUgX19DT01QQVRfTElOVVhfSU5URVJSVVBUX0hfCisKKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKworI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKworI2lmbmRlZiBJUlFfTk9ORQordHlwZWRlZiB2b2lkIGlycXJldHVybl90OworI2RlZmluZSBJUlFfTk9ORQorI2RlZmluZSBJUlFfSEFORExFRAorI2RlZmluZSBJUlFfUkVUVkFMKHgpICh2b2lkKSh4KQorI2VuZGlmCisKKyNpZm5kZWYgSVJRRl9ESVNBQkxFRAorI2RlZmluZSBJUlFGX0RJU0FCTEVEICAgICAgICAgICBTQV9JTlRFUlJVUFQKKyNkZWZpbmUgSVJRRl9TQU1QTEVfUkFORE9NICAgICAgU0FfU0FNUExFX1JBTkRPTQorI2RlZmluZSBJUlFGX1NIQVJFRCAgICAgICAgICAgICBTQV9TSElSUQorI2RlZmluZSBJUlFGX1BST0JFX1NIQVJFRCAgICAgICBTQV9QUk9CRUlSUQorI2RlZmluZSBJUlFGX1BFUkNQVSAgICAgICAgICAgICBTQV9QRVJDUFUKKyNpZmRlZiBTQV9UUklHR0VSX01BU0sKKyNkZWZpbmUgSVJRRl9UUklHR0VSX05PTkUgICAgICAgMAorI2RlZmluZSBJUlFGX1RSSUdHRVJfTE9XICAgICAgICBTQV9UUklHR0VSX0xPVworI2RlZmluZSBJUlFGX1RSSUdHRVJfSElHSCAgICAgICBTQV9UUklHR0VSX0hJR0gKKyNkZWZpbmUgSVJRRl9UUklHR0VSX0ZBTExJTkcgICAgU0FfVFJJR0dFUl9GQUxMSU5HCisjZGVmaW5lIElSUUZfVFJJR0dFUl9SSVNJTkcgICAgIFNBX1RSSUdHRVJfUklTSU5HCisjZGVmaW5lIElSUUZfVFJJR0dFUl9NQVNLICAgICAgIFNBX1RSSUdHRVJfTUFTSworI2Vsc2UKKyNkZWZpbmUgSVJRRl9UUklHR0VSX05PTkUgICAgICAgMAorI2RlZmluZSBJUlFGX1RSSUdHRVJfTE9XICAgICAgICAwCisjZGVmaW5lIElSUUZfVFJJR0dFUl9ISUdIICAgICAgIDAKKyNkZWZpbmUgSVJRRl9UUklHR0VSX0ZBTExJTkcgICAgMAorI2RlZmluZSBJUlFGX1RSSUdHRVJfUklTSU5HICAgICAwCisjZGVmaW5lIElSUUZfVFJJR0dFUl9NQVNLICAgICAgIDAKKyNlbmRpZgorI2VuZGlmCisKKyNkZWZpbmUgUFRfUkVHU19BUkcKKyNkZWZpbmUgUFRfUkVHU19DQUxMCisjZGVmaW5lIFBUX1JFR1NfTlVMTAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkva2NvbWVkaWxpYi9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkva2NvbWVkaWxpYi9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZmNjOWFkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9rY29tZWRpbGliL01ha2VmaWxlCkBAIC0wLDAgKzEsOCBAQAorb2JqLSQoQ09ORklHX0NPTUVESSkJKz0ga2NvbWVkaWxpYi5vCisKK2tjb21lZGlsaWItb2JqcyA6PQkJCQlcCisJCQlkYXRhLm8JCQlcCisJCQlrc3ltcy5vCQkJXAorCQkJZGlvLm8JCQlcCisJCQlrY29tZWRpbGliX21haW4ubwlcCisJCQlnZXQubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9rY29tZWRpbGliL2RhdGEuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkva2NvbWVkaWxpYi9kYXRhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzlhZWMyMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkva2NvbWVkaWxpYi9kYXRhLmMKQEAgLTAsMCArMSw4OSBAQAorLyoKKyAgICBrY29tZWRpbGliL2RhdGEuYworICAgIGltcGxlbWVudHMgY29tZWRpX2RhdGFfKigpIGZ1bmN0aW9ucworCisgICAgQ09NRURJIC0gTGludXggQ29udHJvbCBhbmQgTWVhc3VyZW1lbnQgRGV2aWNlIEludGVyZmFjZQorICAgIENvcHlyaWdodCAoQykgMjAwMCBEYXZpZCBBLiBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisqLworCisjaW5jbHVkZSAiLi4vY29tZWRpLmgiCisjaW5jbHVkZSAiLi4vY29tZWRpbGliLmgiCisjaW5jbHVkZSAiLi4vY29tZWRpZGV2LmgiCS8qIGZvciBjb21lZGlfdWRlbGF5KCkgKi8KKworI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorCitpbnQgY29tZWRpX2RhdGFfd3JpdGUoY29tZWRpX3QgKiBkZXYsIHVuc2lnbmVkIGludCBzdWJkZXYsIHVuc2lnbmVkIGludCBjaGFuLAorCXVuc2lnbmVkIGludCByYW5nZSwgdW5zaWduZWQgaW50IGFyZWYsIGxzYW1wbF90IGRhdGEpCit7CisJY29tZWRpX2luc24gaW5zbjsKKworCW1lbXNldCgmaW5zbiwgMCwgc2l6ZW9mKGluc24pKTsKKwlpbnNuLmluc24gPSBJTlNOX1dSSVRFOworCWluc24ubiA9IDE7CisJaW5zbi5kYXRhID0gJmRhdGE7CisJaW5zbi5zdWJkZXYgPSBzdWJkZXY7CisJaW5zbi5jaGFuc3BlYyA9IENSX1BBQ0soY2hhbiwgcmFuZ2UsIGFyZWYpOworCisJcmV0dXJuIGNvbWVkaV9kb19pbnNuKGRldiwgJmluc24pOworfQorCitpbnQgY29tZWRpX2RhdGFfcmVhZChjb21lZGlfdCAqIGRldiwgdW5zaWduZWQgaW50IHN1YmRldiwgdW5zaWduZWQgaW50IGNoYW4sCisJdW5zaWduZWQgaW50IHJhbmdlLCB1bnNpZ25lZCBpbnQgYXJlZiwgbHNhbXBsX3QgKiBkYXRhKQoreworCWNvbWVkaV9pbnNuIGluc247CisKKwltZW1zZXQoJmluc24sIDAsIHNpemVvZihpbnNuKSk7CisJaW5zbi5pbnNuID0gSU5TTl9SRUFEOworCWluc24ubiA9IDE7CisJaW5zbi5kYXRhID0gZGF0YTsKKwlpbnNuLnN1YmRldiA9IHN1YmRldjsKKwlpbnNuLmNoYW5zcGVjID0gQ1JfUEFDSyhjaGFuLCByYW5nZSwgYXJlZik7CisKKwlyZXR1cm4gY29tZWRpX2RvX2luc24oZGV2LCAmaW5zbik7Cit9CisKK2ludCBjb21lZGlfZGF0YV9yZWFkX2hpbnQoY29tZWRpX3QgKiBkZXYsIHVuc2lnbmVkIGludCBzdWJkZXYsCisJdW5zaWduZWQgaW50IGNoYW4sIHVuc2lnbmVkIGludCByYW5nZSwgdW5zaWduZWQgaW50IGFyZWYpCit7CisJY29tZWRpX2luc24gaW5zbjsKKwlsc2FtcGxfdCBkdW1teV9kYXRhOworCisJbWVtc2V0KCZpbnNuLCAwLCBzaXplb2YoaW5zbikpOworCWluc24uaW5zbiA9IElOU05fUkVBRDsKKwlpbnNuLm4gPSAwOworCWluc24uZGF0YSA9ICZkdW1teV9kYXRhOworCWluc24uc3ViZGV2ID0gc3ViZGV2OworCWluc24uY2hhbnNwZWMgPSBDUl9QQUNLKGNoYW4sIHJhbmdlLCBhcmVmKTsKKworCXJldHVybiBjb21lZGlfZG9faW5zbihkZXYsICZpbnNuKTsKK30KKworaW50IGNvbWVkaV9kYXRhX3JlYWRfZGVsYXllZChjb21lZGlfdCAqIGRldiwgdW5zaWduZWQgaW50IHN1YmRldiwKKwl1bnNpZ25lZCBpbnQgY2hhbiwgdW5zaWduZWQgaW50IHJhbmdlLCB1bnNpZ25lZCBpbnQgYXJlZiwKKwlsc2FtcGxfdCAqIGRhdGEsIHVuc2lnbmVkIGludCBuYW5vX3NlYykKK3sKKwlpbnQgcmV0dmFsOworCisJcmV0dmFsID0gY29tZWRpX2RhdGFfcmVhZF9oaW50KGRldiwgc3ViZGV2LCBjaGFuLCByYW5nZSwgYXJlZik7CisJaWYgKHJldHZhbCA8IDApCisJCXJldHVybiByZXR2YWw7CisKKwljb21lZGlfdWRlbGF5KChuYW5vX3NlYyArIDk5OSkgLyAxMDAwKTsKKworCXJldHVybiBjb21lZGlfZGF0YV9yZWFkKGRldiwgc3ViZGV2LCBjaGFuLCByYW5nZSwgYXJlZiwgZGF0YSk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2tjb21lZGlsaWIvZGlvLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2tjb21lZGlsaWIvZGlvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTlmNDg4YQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkva2NvbWVkaWxpYi9kaW8uYwpAQCAtMCwwICsxLDk1IEBACisvKgorICAgIGtjb21lZGlsaWIvZGlvLmMKKyAgICBpbXBsZW1lbnRzIGNvbWVkaV9kaW9fKigpIGZ1bmN0aW9ucworCisgICAgQ09NRURJIC0gTGludXggQ29udHJvbCBhbmQgTWVhc3VyZW1lbnQgRGV2aWNlIEludGVyZmFjZQorICAgIENvcHlyaWdodCAoQykgMjAwMCBEYXZpZCBBLiBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisqLworCisjaW5jbHVkZSAiLi4vY29tZWRpLmgiCisjaW5jbHVkZSAiLi4vY29tZWRpbGliLmgiCisKKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKworaW50IGNvbWVkaV9kaW9fY29uZmlnKGNvbWVkaV90ICogZGV2LCB1bnNpZ25lZCBpbnQgc3ViZGV2LCB1bnNpZ25lZCBpbnQgY2hhbiwKKwl1bnNpZ25lZCBpbnQgaW8pCit7CisJY29tZWRpX2luc24gaW5zbjsKKworCW1lbXNldCgmaW5zbiwgMCwgc2l6ZW9mKGluc24pKTsKKwlpbnNuLmluc24gPSBJTlNOX0NPTkZJRzsKKwlpbnNuLm4gPSAxOworCWluc24uZGF0YSA9ICZpbzsKKwlpbnNuLnN1YmRldiA9IHN1YmRldjsKKwlpbnNuLmNoYW5zcGVjID0gQ1JfUEFDSyhjaGFuLCAwLCAwKTsKKworCXJldHVybiBjb21lZGlfZG9faW5zbihkZXYsICZpbnNuKTsKK30KKworaW50IGNvbWVkaV9kaW9fcmVhZChjb21lZGlfdCAqIGRldiwgdW5zaWduZWQgaW50IHN1YmRldiwgdW5zaWduZWQgaW50IGNoYW4sCisJdW5zaWduZWQgaW50ICp2YWwpCit7CisJY29tZWRpX2luc24gaW5zbjsKKworCW1lbXNldCgmaW5zbiwgMCwgc2l6ZW9mKGluc24pKTsKKwlpbnNuLmluc24gPSBJTlNOX1JFQUQ7CisJaW5zbi5uID0gMTsKKwlpbnNuLmRhdGEgPSB2YWw7CisJaW5zbi5zdWJkZXYgPSBzdWJkZXY7CisJaW5zbi5jaGFuc3BlYyA9IENSX1BBQ0soY2hhbiwgMCwgMCk7CisKKwlyZXR1cm4gY29tZWRpX2RvX2luc24oZGV2LCAmaW5zbik7Cit9CisKK2ludCBjb21lZGlfZGlvX3dyaXRlKGNvbWVkaV90ICogZGV2LCB1bnNpZ25lZCBpbnQgc3ViZGV2LCB1bnNpZ25lZCBpbnQgY2hhbiwKKwl1bnNpZ25lZCBpbnQgdmFsKQoreworCWNvbWVkaV9pbnNuIGluc247CisKKwltZW1zZXQoJmluc24sIDAsIHNpemVvZihpbnNuKSk7CisJaW5zbi5pbnNuID0gSU5TTl9XUklURTsKKwlpbnNuLm4gPSAxOworCWluc24uZGF0YSA9ICZ2YWw7CisJaW5zbi5zdWJkZXYgPSBzdWJkZXY7CisJaW5zbi5jaGFuc3BlYyA9IENSX1BBQ0soY2hhbiwgMCwgMCk7CisKKwlyZXR1cm4gY29tZWRpX2RvX2luc24oZGV2LCAmaW5zbik7Cit9CisKK2ludCBjb21lZGlfZGlvX2JpdGZpZWxkKGNvbWVkaV90ICogZGV2LCB1bnNpZ25lZCBpbnQgc3ViZGV2LCB1bnNpZ25lZCBpbnQgbWFzaywKKwl1bnNpZ25lZCBpbnQgKmJpdHMpCit7CisJY29tZWRpX2luc24gaW5zbjsKKwlsc2FtcGxfdCBkYXRhWzJdOworCWludCByZXQ7CisKKwltZW1zZXQoJmluc24sIDAsIHNpemVvZihpbnNuKSk7CisJaW5zbi5pbnNuID0gSU5TTl9CSVRTOworCWluc24ubiA9IDI7CisJaW5zbi5kYXRhID0gZGF0YTsKKwlpbnNuLnN1YmRldiA9IHN1YmRldjsKKworCWRhdGFbMF0gPSBtYXNrOworCWRhdGFbMV0gPSAqYml0czsKKworCXJldCA9IGNvbWVkaV9kb19pbnNuKGRldiwgJmluc24pOworCisJKmJpdHMgPSBkYXRhWzFdOworCisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkva2NvbWVkaWxpYi9nZXQuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkva2NvbWVkaWxpYi9nZXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDA0YWQ0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9rY29tZWRpbGliL2dldC5jCkBAIC0wLDAgKzEsMjk0IEBACisvKgorICAgIGtjb21lZGlsaWIvZ2V0LmMKKyAgICBhIGNvbWVkbGliIGludGVyZmFjZSBmb3Iga2VybmVsIG1vZHVsZXMKKworICAgIENPTUVESSAtIExpbnV4IENvbnRyb2wgYW5kIE1lYXN1cmVtZW50IERldmljZSBJbnRlcmZhY2UKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwMCBEYXZpZCBBLiBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisqLworCisjZGVmaW5lIF9fTk9fVkVSU0lPTl9fCisjaW5jbHVkZSAiLi4vY29tZWRpLmgiCisjaW5jbHVkZSAiLi4vY29tZWRpbGliLmgiCisjaW5jbHVkZSAiLi4vY29tZWRpZGV2LmgiCisKK2ludCBjb21lZGlfZ2V0X25fc3ViZGV2aWNlcyhjb21lZGlfdCAqIGQpCit7CisJY29tZWRpX2RldmljZSAqZGV2ID0gKGNvbWVkaV9kZXZpY2UgKikgZDsKKworCXJldHVybiBkZXYtPm5fc3ViZGV2aWNlczsKK30KKworaW50IGNvbWVkaV9nZXRfdmVyc2lvbl9jb2RlKGNvbWVkaV90ICogZCkKK3sKKwlyZXR1cm4gQ09NRURJX1ZFUlNJT05fQ09ERTsKK30KKworY29uc3QgY2hhciAqY29tZWRpX2dldF9kcml2ZXJfbmFtZShjb21lZGlfdCAqIGQpCit7CisJY29tZWRpX2RldmljZSAqZGV2ID0gKGNvbWVkaV9kZXZpY2UgKikgZDsKKworCXJldHVybiBkZXYtPmRyaXZlci0+ZHJpdmVyX25hbWU7Cit9CisKK2NvbnN0IGNoYXIgKmNvbWVkaV9nZXRfYm9hcmRfbmFtZShjb21lZGlfdCAqIGQpCit7CisJY29tZWRpX2RldmljZSAqZGV2ID0gKGNvbWVkaV9kZXZpY2UgKikgZDsKKworCXJldHVybiBkZXYtPmJvYXJkX25hbWU7Cit9CisKK2ludCBjb21lZGlfZ2V0X3N1YmRldmljZV90eXBlKGNvbWVkaV90ICogZCwgdW5zaWduZWQgaW50IHN1YmRldmljZSkKK3sKKwljb21lZGlfZGV2aWNlICpkZXYgPSAoY29tZWRpX2RldmljZSAqKSBkOworCWNvbWVkaV9zdWJkZXZpY2UgKnMgPSBkZXYtPnN1YmRldmljZXMgKyBzdWJkZXZpY2U7CisKKwlyZXR1cm4gcy0+dHlwZTsKK30KKwordW5zaWduZWQgaW50IGNvbWVkaV9nZXRfc3ViZGV2aWNlX2ZsYWdzKGNvbWVkaV90ICogZCwgdW5zaWduZWQgaW50IHN1YmRldmljZSkKK3sKKwljb21lZGlfZGV2aWNlICpkZXYgPSAoY29tZWRpX2RldmljZSAqKSBkOworCWNvbWVkaV9zdWJkZXZpY2UgKnMgPSBkZXYtPnN1YmRldmljZXMgKyBzdWJkZXZpY2U7CisKKwlyZXR1cm4gcy0+c3ViZGV2X2ZsYWdzOworfQorCitpbnQgY29tZWRpX2ZpbmRfc3ViZGV2aWNlX2J5X3R5cGUoY29tZWRpX3QgKiBkLCBpbnQgdHlwZSwgdW5zaWduZWQgaW50IHN1YmQpCit7CisJY29tZWRpX2RldmljZSAqZGV2ID0gKGNvbWVkaV9kZXZpY2UgKikgZDsKKworCWlmIChzdWJkID4gZGV2LT5uX3N1YmRldmljZXMpCisJCXJldHVybiAtRU5PREVWOworCisJZm9yICg7IHN1YmQgPCBkZXYtPm5fc3ViZGV2aWNlczsgc3ViZCsrKSB7CisJCWlmIChkZXYtPnN1YmRldmljZXNbc3ViZF0udHlwZSA9PSB0eXBlKQorCQkJcmV0dXJuIHN1YmQ7CisJfQorCXJldHVybiAtMTsKK30KKworaW50IGNvbWVkaV9nZXRfbl9jaGFubmVscyhjb21lZGlfdCAqIGQsIHVuc2lnbmVkIGludCBzdWJkZXZpY2UpCit7CisJY29tZWRpX2RldmljZSAqZGV2ID0gKGNvbWVkaV9kZXZpY2UgKikgZDsKKwljb21lZGlfc3ViZGV2aWNlICpzID0gZGV2LT5zdWJkZXZpY2VzICsgc3ViZGV2aWNlOworCisJcmV0dXJuIHMtPm5fY2hhbjsKK30KKworaW50IGNvbWVkaV9nZXRfbGVuX2NoYW5saXN0KGNvbWVkaV90ICogZCwgdW5zaWduZWQgaW50IHN1YmRldmljZSkKK3sKKwljb21lZGlfZGV2aWNlICpkZXYgPSAoY29tZWRpX2RldmljZSAqKSBkOworCWNvbWVkaV9zdWJkZXZpY2UgKnMgPSBkZXYtPnN1YmRldmljZXMgKyBzdWJkZXZpY2U7CisKKwlyZXR1cm4gcy0+bGVuX2NoYW5saXN0OworfQorCitsc2FtcGxfdCBjb21lZGlfZ2V0X21heGRhdGEoY29tZWRpX3QgKiBkLCB1bnNpZ25lZCBpbnQgc3ViZGV2aWNlLAorCXVuc2lnbmVkIGludCBjaGFuKQoreworCWNvbWVkaV9kZXZpY2UgKmRldiA9IChjb21lZGlfZGV2aWNlICopIGQ7CisJY29tZWRpX3N1YmRldmljZSAqcyA9IGRldi0+c3ViZGV2aWNlcyArIHN1YmRldmljZTsKKworCWlmIChzLT5tYXhkYXRhX2xpc3QpCisJCXJldHVybiBzLT5tYXhkYXRhX2xpc3RbY2hhbl07CisKKwlyZXR1cm4gcy0+bWF4ZGF0YTsKK30KKworI2lmZGVmIEtDT01FRElMSUJfREVQUkVDQVRFRAoraW50IGNvbWVkaV9nZXRfcmFuZ2V0eXBlKGNvbWVkaV90ICogZCwgdW5zaWduZWQgaW50IHN1YmRldmljZSwKKwl1bnNpZ25lZCBpbnQgY2hhbikKK3sKKwljb21lZGlfZGV2aWNlICpkZXYgPSAoY29tZWRpX2RldmljZSAqKSBkOworCWNvbWVkaV9zdWJkZXZpY2UgKnMgPSBkZXYtPnN1YmRldmljZXMgKyBzdWJkZXZpY2U7CisJaW50IHJldDsKKworCWlmIChzLT5yYW5nZV90YWJsZV9saXN0KSB7CisJCXJldCA9IHMtPnJhbmdlX3RhYmxlX2xpc3RbY2hhbl0tPmxlbmd0aDsKKwl9IGVsc2UgeworCQlyZXQgPSBzLT5yYW5nZV90YWJsZS0+bGVuZ3RoOworCX0KKworCXJldCA9IHJldCB8IChkZXYtPm1pbm9yIDw8IDI4KSB8IChzdWJkZXZpY2UgPDwgMjQpIHwgKGNoYW4gPDwgMTYpOworCisJcmV0dXJuIHJldDsKK30KKyNlbmRpZgorCitpbnQgY29tZWRpX2dldF9uX3Jhbmdlcyhjb21lZGlfdCAqIGQsIHVuc2lnbmVkIGludCBzdWJkZXZpY2UsIHVuc2lnbmVkIGludCBjaGFuKQoreworCWNvbWVkaV9kZXZpY2UgKmRldiA9IChjb21lZGlfZGV2aWNlICopIGQ7CisJY29tZWRpX3N1YmRldmljZSAqcyA9IGRldi0+c3ViZGV2aWNlcyArIHN1YmRldmljZTsKKwlpbnQgcmV0OworCisJaWYgKHMtPnJhbmdlX3RhYmxlX2xpc3QpIHsKKwkJcmV0ID0gcy0+cmFuZ2VfdGFibGVfbGlzdFtjaGFuXS0+bGVuZ3RoOworCX0gZWxzZSB7CisJCXJldCA9IHMtPnJhbmdlX3RhYmxlLT5sZW5ndGg7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIEFMUEhBIChub24tcG9ydGFibGUpCisqLworaW50IGNvbWVkaV9nZXRfa3JhbmdlKGNvbWVkaV90ICogZCwgdW5zaWduZWQgaW50IHN1YmRldmljZSwgdW5zaWduZWQgaW50IGNoYW4sCisJdW5zaWduZWQgaW50IHJhbmdlLCBjb21lZGlfa3JhbmdlICoga3JhbmdlKQoreworCWNvbWVkaV9kZXZpY2UgKmRldiA9IChjb21lZGlfZGV2aWNlICopIGQ7CisJY29tZWRpX3N1YmRldmljZSAqcyA9IGRldi0+c3ViZGV2aWNlcyArIHN1YmRldmljZTsKKwljb25zdCBjb21lZGlfbHJhbmdlICpscjsKKworCWlmIChzLT5yYW5nZV90YWJsZV9saXN0KSB7CisJCWxyID0gcy0+cmFuZ2VfdGFibGVfbGlzdFtjaGFuXTsKKwl9IGVsc2UgeworCQlsciA9IHMtPnJhbmdlX3RhYmxlOworCX0KKwlpZiAocmFuZ2UgPj0gbHItPmxlbmd0aCkgeworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJbWVtY3B5KGtyYW5nZSwgbHItPnJhbmdlICsgcmFuZ2UsIHNpemVvZihjb21lZGlfa3JhbmdlKSk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEFMUEhBIChtYXkgYmUgcmVuYW1lZCkKKyovCit1bnNpZ25lZCBpbnQgY29tZWRpX2dldF9idWZfaGVhZF9wb3MoY29tZWRpX3QgKiBkLCB1bnNpZ25lZCBpbnQgc3ViZGV2aWNlKQoreworCWNvbWVkaV9kZXZpY2UgKmRldiA9IChjb21lZGlfZGV2aWNlICopIGQ7CisJY29tZWRpX3N1YmRldmljZSAqcyA9IGRldi0+c3ViZGV2aWNlcyArIHN1YmRldmljZTsKKwljb21lZGlfYXN5bmMgKmFzeW5jOworCisJYXN5bmMgPSBzLT5hc3luYzsKKwlpZiAoYXN5bmMgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gYXN5bmMtPmJ1Zl93cml0ZV9jb3VudDsKK30KKworaW50IGNvbWVkaV9nZXRfYnVmZmVyX2NvbnRlbnRzKGNvbWVkaV90ICogZCwgdW5zaWduZWQgaW50IHN1YmRldmljZSkKK3sKKwljb21lZGlfZGV2aWNlICpkZXYgPSAoY29tZWRpX2RldmljZSAqKSBkOworCWNvbWVkaV9zdWJkZXZpY2UgKnMgPSBkZXYtPnN1YmRldmljZXMgKyBzdWJkZXZpY2U7CisJY29tZWRpX2FzeW5jICphc3luYzsKKwl1bnNpZ25lZCBpbnQgbnVtX2J5dGVzOworCisJaWYgKHN1YmRldmljZSA+PSBkZXYtPm5fc3ViZGV2aWNlcykKKwkJcmV0dXJuIC0xOworCWFzeW5jID0gcy0+YXN5bmM7CisJaWYgKGFzeW5jID09IE5VTEwpCisJCXJldHVybiAwOworCW51bV9ieXRlcyA9IGNvbWVkaV9idWZfcmVhZF9uX2F2YWlsYWJsZShzLT5hc3luYyk7CisJcmV0dXJuIG51bV9ieXRlczsKK30KKworLyoKKyAqIEFMUEhBCisqLworaW50IGNvbWVkaV9zZXRfdXNlcl9pbnRfY291bnQoY29tZWRpX3QgKiBkLCB1bnNpZ25lZCBpbnQgc3ViZGV2aWNlLAorCXVuc2lnbmVkIGludCBidWZfdXNlcl9jb3VudCkKK3sKKwljb21lZGlfZGV2aWNlICpkZXYgPSAoY29tZWRpX2RldmljZSAqKSBkOworCWNvbWVkaV9zdWJkZXZpY2UgKnMgPSBkZXYtPnN1YmRldmljZXMgKyBzdWJkZXZpY2U7CisJY29tZWRpX2FzeW5jICphc3luYzsKKwlpbnQgbnVtX2J5dGVzOworCisJYXN5bmMgPSBzLT5hc3luYzsKKwlpZiAoYXN5bmMgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCisJbnVtX2J5dGVzID0gYnVmX3VzZXJfY291bnQgLSBhc3luYy0+YnVmX3JlYWRfY291bnQ7CisJaWYgKG51bV9ieXRlcyA8IDApCisJCXJldHVybiAtMTsKKwljb21lZGlfYnVmX3JlYWRfYWxsb2MoYXN5bmMsIG51bV9ieXRlcyk7CisJY29tZWRpX2J1Zl9yZWFkX2ZyZWUoYXN5bmMsIG51bV9ieXRlcyk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGNvbWVkaV9tYXJrX2J1ZmZlcl9yZWFkKGNvbWVkaV90ICogZCwgdW5zaWduZWQgaW50IHN1YmRldmljZSwKKwl1bnNpZ25lZCBpbnQgbnVtX2J5dGVzKQoreworCWNvbWVkaV9kZXZpY2UgKmRldiA9IChjb21lZGlfZGV2aWNlICopIGQ7CisJY29tZWRpX3N1YmRldmljZSAqcyA9IGRldi0+c3ViZGV2aWNlcyArIHN1YmRldmljZTsKKwljb21lZGlfYXN5bmMgKmFzeW5jOworCisJaWYgKHN1YmRldmljZSA+PSBkZXYtPm5fc3ViZGV2aWNlcykKKwkJcmV0dXJuIC0xOworCWFzeW5jID0gcy0+YXN5bmM7CisJaWYgKGFzeW5jID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCWNvbWVkaV9idWZfcmVhZF9hbGxvYyhhc3luYywgbnVtX2J5dGVzKTsKKwljb21lZGlfYnVmX3JlYWRfZnJlZShhc3luYywgbnVtX2J5dGVzKTsKKworCXJldHVybiAwOworfQorCitpbnQgY29tZWRpX21hcmtfYnVmZmVyX3dyaXR0ZW4oY29tZWRpX3QgKiBkLCB1bnNpZ25lZCBpbnQgc3ViZGV2aWNlLAorCXVuc2lnbmVkIGludCBudW1fYnl0ZXMpCit7CisJY29tZWRpX2RldmljZSAqZGV2ID0gKGNvbWVkaV9kZXZpY2UgKikgZDsKKwljb21lZGlfc3ViZGV2aWNlICpzID0gZGV2LT5zdWJkZXZpY2VzICsgc3ViZGV2aWNlOworCWNvbWVkaV9hc3luYyAqYXN5bmM7CisJaW50IGJ5dGVzX3dyaXR0ZW47CisKKwlpZiAoc3ViZGV2aWNlID49IGRldi0+bl9zdWJkZXZpY2VzKQorCQlyZXR1cm4gLTE7CisJYXN5bmMgPSBzLT5hc3luYzsKKwlpZiAoYXN5bmMgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCWJ5dGVzX3dyaXR0ZW4gPSBjb21lZGlfYnVmX3dyaXRlX2FsbG9jKGFzeW5jLCBudW1fYnl0ZXMpOworCWNvbWVkaV9idWZfd3JpdGVfZnJlZShhc3luYywgYnl0ZXNfd3JpdHRlbik7CisJaWYgKGJ5dGVzX3dyaXR0ZW4gIT0gbnVtX2J5dGVzKQorCQlyZXR1cm4gLTE7CisJcmV0dXJuIDA7Cit9CisKK2ludCBjb21lZGlfZ2V0X2J1ZmZlcl9zaXplKGNvbWVkaV90ICogZCwgdW5zaWduZWQgaW50IHN1YmRldikKK3sKKwljb21lZGlfZGV2aWNlICpkZXYgPSAoY29tZWRpX2RldmljZSAqKSBkOworCWNvbWVkaV9zdWJkZXZpY2UgKnMgPSBkZXYtPnN1YmRldmljZXMgKyBzdWJkZXY7CisJY29tZWRpX2FzeW5jICphc3luYzsKKworCWlmIChzdWJkZXYgPj0gZGV2LT5uX3N1YmRldmljZXMpCisJCXJldHVybiAtMTsKKwlhc3luYyA9IHMtPmFzeW5jOworCWlmIChhc3luYyA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKworCXJldHVybiBhc3luYy0+cHJlYWxsb2NfYnVmc3o7Cit9CisKK2ludCBjb21lZGlfZ2V0X2J1ZmZlcl9vZmZzZXQoY29tZWRpX3QgKiBkLCB1bnNpZ25lZCBpbnQgc3ViZGV2aWNlKQoreworCWNvbWVkaV9kZXZpY2UgKmRldiA9IChjb21lZGlfZGV2aWNlICopIGQ7CisJY29tZWRpX3N1YmRldmljZSAqcyA9IGRldi0+c3ViZGV2aWNlcyArIHN1YmRldmljZTsKKwljb21lZGlfYXN5bmMgKmFzeW5jOworCisJaWYgKHN1YmRldmljZSA+PSBkZXYtPm5fc3ViZGV2aWNlcykKKwkJcmV0dXJuIC0xOworCWFzeW5jID0gcy0+YXN5bmM7CisJaWYgKGFzeW5jID09IE5VTEwpCisJCXJldHVybiAwOworCisJcmV0dXJuIGFzeW5jLT5idWZfcmVhZF9wdHI7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2tjb21lZGlsaWIva2NvbWVkaWxpYl9tYWluLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2tjb21lZGlsaWIva2NvbWVkaWxpYl9tYWluLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTEwZmJkYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkva2NvbWVkaWxpYi9rY29tZWRpbGliX21haW4uYwpAQCAtMCwwICsxLDU2NyBAQAorLyoKKyAgICBrY29tZWRpbGliL2tjb21lZGlsaWIuYworICAgIGEgY29tZWRsaWIgaW50ZXJmYWNlIGZvciBrZXJuZWwgbW9kdWxlcworCisgICAgQ09NRURJIC0gTGludXggQ29udHJvbCBhbmQgTWVhc3VyZW1lbnQgRGV2aWNlIEludGVyZmFjZQorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDAwIERhdmlkIEEuIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyovCisKKyNkZWZpbmUgX19OT19WRVJTSU9OX18KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKyNpbmNsdWRlICIuLi9jb21lZGkuaCIKKyNpbmNsdWRlICIuLi9jb21lZGlsaWIuaCIKKyNpbmNsdWRlICIuLi9jb21lZGlkZXYuaCIKKworTU9EVUxFX0FVVEhPUigiRGF2aWQgU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkNvbWVkaSBrZXJuZWwgbGlicmFyeSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitjb21lZGlfdCAqY29tZWRpX29wZW4oY29uc3QgY2hhciAqZmlsZW5hbWUpCit7CisJc3RydWN0IGNvbWVkaV9kZXZpY2VfZmlsZV9pbmZvICpkZXZfZmlsZV9pbmZvOworCWNvbWVkaV9kZXZpY2UgKmRldjsKKwl1bnNpZ25lZCBpbnQgbWlub3I7CisKKwlpZiAoc3RybmNtcChmaWxlbmFtZSwgIi9kZXYvY29tZWRpIiwgMTEpICE9IDApCisJCXJldHVybiBOVUxMOworCisJbWlub3IgPSBzaW1wbGVfc3RydG91bChmaWxlbmFtZSArIDExLCBOVUxMLCAwKTsKKworCWlmIChtaW5vciA+PSBDT01FRElfTlVNX0JPQVJEX01JTk9SUykKKwkJcmV0dXJuIE5VTEw7CisKKwlkZXZfZmlsZV9pbmZvID0gY29tZWRpX2dldF9kZXZpY2VfZmlsZV9pbmZvKG1pbm9yKTsKKwlpZihkZXZfZmlsZV9pbmZvID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCWRldiA9IGRldl9maWxlX2luZm8tPmRldmljZTsKKworCWlmKGRldiA9PSBOVUxMIHx8ICFkZXYtPmF0dGFjaGVkKQorCQlyZXR1cm4gTlVMTDsKKworCWlmICghdHJ5X21vZHVsZV9nZXQoZGV2LT5kcml2ZXItPm1vZHVsZSkpCisJCXJldHVybiBOVUxMOworCisJcmV0dXJuIChjb21lZGlfdCAqKSBkZXY7Cit9CisKK2NvbWVkaV90ICpjb21lZGlfb3Blbl9vbGQodW5zaWduZWQgaW50IG1pbm9yKQoreworCXN0cnVjdCBjb21lZGlfZGV2aWNlX2ZpbGVfaW5mbyAqZGV2X2ZpbGVfaW5mbzsKKwljb21lZGlfZGV2aWNlICpkZXY7CisKKwlpZiAobWlub3IgPj0gQ09NRURJX05VTV9NSU5PUlMpCisJCXJldHVybiBOVUxMOworCisJZGV2X2ZpbGVfaW5mbyA9IGNvbWVkaV9nZXRfZGV2aWNlX2ZpbGVfaW5mbyhtaW5vcik7CisJaWYoZGV2X2ZpbGVfaW5mbyA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKwlkZXYgPSBkZXZfZmlsZV9pbmZvLT5kZXZpY2U7CisKKwlpZihkZXYgPT0gTlVMTCB8fCAhZGV2LT5hdHRhY2hlZCkKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXR1cm4gKGNvbWVkaV90ICopIGRldjsKK30KKworaW50IGNvbWVkaV9jbG9zZShjb21lZGlfdCAqIGQpCit7CisJY29tZWRpX2RldmljZSAqZGV2ID0gKGNvbWVkaV9kZXZpY2UgKikgZDsKKworCW1vZHVsZV9wdXQoZGV2LT5kcml2ZXItPm1vZHVsZSk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGNvbWVkaV9sb2dsZXZlbChpbnQgbmV3bGV2ZWwpCit7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgY29tZWRpX3BlcnJvcihjb25zdCBjaGFyICptZXNzYWdlKQoreworCXJ0X3ByaW50aygiJXM6IHVua25vd24gZXJyb3JcbiIsIG1lc3NhZ2UpOworfQorCitjaGFyICpjb21lZGlfc3RyZXJyb3IoaW50IGVycikKK3sKKwlyZXR1cm4gInVua25vd24gZXJyb3IiOworfQorCitpbnQgY29tZWRpX2ZpbGVubyhjb21lZGlfdCAqIGQpCit7CisJY29tZWRpX2RldmljZSAqZGV2ID0gKGNvbWVkaV9kZXZpY2UgKikgZDsKKworCS8qIHJldHVybiBzb21ldGhpbmcgcmFuZG9tICovCisJcmV0dXJuIGRldi0+bWlub3I7Cit9CisKK2ludCBjb21lZGlfY29tbWFuZChjb21lZGlfdCAqIGQsIGNvbWVkaV9jbWQgKiBjbWQpCit7CisJY29tZWRpX2RldmljZSAqZGV2ID0gKGNvbWVkaV9kZXZpY2UgKikgZDsKKwljb21lZGlfc3ViZGV2aWNlICpzOworCWNvbWVkaV9hc3luYyAqYXN5bmM7CisJdW5zaWduZWQgcnVuZmxhZ3M7CisKKwlpZiAoY21kLT5zdWJkZXYgPj0gZGV2LT5uX3N1YmRldmljZXMpCisJCXJldHVybiAtRU5PREVWOworCisJcyA9IGRldi0+c3ViZGV2aWNlcyArIGNtZC0+c3ViZGV2OworCWlmIChzLT50eXBlID09IENPTUVESV9TVUJEX1VOVVNFRCkKKwkJcmV0dXJuIC1FSU87CisKKwlhc3luYyA9IHMtPmFzeW5jOworCWlmIChhc3luYyA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmIChzLT5idXN5KQorCQlyZXR1cm4gLUVCVVNZOworCXMtPmJ1c3kgPSBkOworCisJaWYgKGFzeW5jLT5jYl9tYXNrICYgQ09NRURJX0NCX0VPUykKKwkJY21kLT5mbGFncyB8PSBUUklHX1dBS0VfRU9TOworCisJYXN5bmMtPmNtZCA9ICpjbWQ7CisKKwlydW5mbGFncyA9IFNSRl9SVU5OSU5HOworCisjaWZkZWYgQ09ORklHX0NPTUVESV9SVAorCWlmIChjb21lZGlfc3dpdGNoX3RvX3J0KGRldikgPT0gMCkKKwkJcnVuZmxhZ3MgfD0gU1JGX1JUOworI2VuZGlmCisJY29tZWRpX3NldF9zdWJkZXZpY2VfcnVuZmxhZ3MocywgfjAsIHJ1bmZsYWdzKTsKKworCWNvbWVkaV9yZXNldF9hc3luY19idWYoYXN5bmMpOworCisJcmV0dXJuIHMtPmRvX2NtZChkZXYsIHMpOworfQorCitpbnQgY29tZWRpX2NvbW1hbmRfdGVzdChjb21lZGlfdCAqIGQsIGNvbWVkaV9jbWQgKiBjbWQpCit7CisJY29tZWRpX2RldmljZSAqZGV2ID0gKGNvbWVkaV9kZXZpY2UgKikgZDsKKwljb21lZGlfc3ViZGV2aWNlICpzOworCisJaWYgKGNtZC0+c3ViZGV2ID49IGRldi0+bl9zdWJkZXZpY2VzKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXMgPSBkZXYtPnN1YmRldmljZXMgKyBjbWQtPnN1YmRldjsKKwlpZiAocy0+dHlwZSA9PSBDT01FRElfU1VCRF9VTlVTRUQpCisJCXJldHVybiAtRUlPOworCisJaWYgKHMtPmFzeW5jID09IE5VTEwpCisJCXJldHVybiAtRU5PREVWOworCisJcmV0dXJuIHMtPmRvX2NtZHRlc3QoZGV2LCBzLCBjbWQpOworfQorCisvKgorICoJQ09NRURJX0lOU04KKyAqCXBlcmZvcm0gYW4gaW5zdHJ1Y3Rpb24KKyAqLworaW50IGNvbWVkaV9kb19pbnNuKGNvbWVkaV90ICogZCwgY29tZWRpX2luc24gKiBpbnNuKQoreworCWNvbWVkaV9kZXZpY2UgKmRldiA9IChjb21lZGlfZGV2aWNlICopIGQ7CisJY29tZWRpX3N1YmRldmljZSAqczsKKwlpbnQgcmV0ID0gMDsKKworCWlmIChpbnNuLT5pbnNuICYgSU5TTl9NQVNLX1NQRUNJQUwpIHsKKwkJc3dpdGNoIChpbnNuLT5pbnNuKSB7CisJCWNhc2UgSU5TTl9HVE9EOgorCQkJeworCQkJCXN0cnVjdCB0aW1ldmFsIHR2OworCisJCQkJZG9fZ2V0dGltZW9mZGF5KCZ0dik7CisJCQkJaW5zbi0+ZGF0YVswXSA9IHR2LnR2X3NlYzsKKwkJCQlpbnNuLT5kYXRhWzFdID0gdHYudHZfdXNlYzsKKwkJCQlyZXQgPSAyOworCisJCQkJYnJlYWs7CisJCQl9CisJCWNhc2UgSU5TTl9XQUlUOgorCQkJLyogWFhYIGlzbid0IHRoZSB2YWx1ZSBzdXBwb3NlZCB0byBiZSBuYW5vc2Vjcz8gKi8KKwkJCWlmIChpbnNuLT5uICE9IDEgfHwgaW5zbi0+ZGF0YVswXSA+PSAxMDApIHsKKwkJCQlyZXQgPSAtRUlOVkFMOworCQkJCWJyZWFrOworCQkJfQorCQkJY29tZWRpX3VkZWxheShpbnNuLT5kYXRhWzBdKTsKKwkJCXJldCA9IDE7CisJCQlicmVhazsKKwkJY2FzZSBJTlNOX0lOVFRSSUc6CisJCQlpZiAoaW5zbi0+biAhPSAxKSB7CisJCQkJcmV0ID0gLUVJTlZBTDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChpbnNuLT5zdWJkZXYgPj0gZGV2LT5uX3N1YmRldmljZXMpIHsKKwkJCQlydF9wcmludGsoIiVkIG5vdCB1c2FibGUgc3ViZGV2aWNlXG4iLAorCQkJCQlpbnNuLT5zdWJkZXYpOworCQkJCXJldCA9IC1FSU5WQUw7CisJCQkJYnJlYWs7CisJCQl9CisJCQlzID0gZGV2LT5zdWJkZXZpY2VzICsgaW5zbi0+c3ViZGV2OworCQkJaWYgKCFzLT5hc3luYykgeworCQkJCXJ0X3ByaW50aygibm8gYXN5bmNcbiIpOworCQkJCXJldCA9IC1FSU5WQUw7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoIXMtPmFzeW5jLT5pbnR0cmlnKSB7CisJCQkJcnRfcHJpbnRrKCJubyBpbnR0cmlnXG4iKTsKKwkJCQlyZXQgPSAtRUFHQUlOOworCQkJCWJyZWFrOworCQkJfQorCQkJcmV0ID0gcy0+YXN5bmMtPmludHRyaWcoZGV2LCBzLCBpbnNuLT5kYXRhWzBdKTsKKwkJCWlmIChyZXQgPj0gMCkKKwkJCQlyZXQgPSAxOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXQgPSAtRUlOVkFMOworCQl9CisJfSBlbHNlIHsKKwkJLyogYSBzdWJkZXZpY2UgaW5zdHJ1Y3Rpb24gKi8KKwkJaWYgKGluc24tPnN1YmRldiA+PSBkZXYtPm5fc3ViZGV2aWNlcykgeworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKwkJcyA9IGRldi0+c3ViZGV2aWNlcyArIGluc24tPnN1YmRldjsKKworCQlpZiAocy0+dHlwZSA9PSBDT01FRElfU1VCRF9VTlVTRUQpIHsKKwkJCXJ0X3ByaW50aygiJWQgbm90IHVzZWFibGUgc3ViZGV2aWNlXG4iLCBpbnNuLT5zdWJkZXYpOworCQkJcmV0ID0gLUVJTzsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKworCQkvKiBYWFggY2hlY2sgbG9jayAqLworCisJCWlmICgocmV0ID0gY2hlY2tfY2hhbmxpc3QocywgMSwgJmluc24tPmNoYW5zcGVjKSkgPCAwKSB7CisJCQlydF9wcmludGsoImJhZCBjaGFuc3BlY1xuIik7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJZ290byBlcnJvcjsKKwkJfQorCisJCWlmIChzLT5idXN5KSB7CisJCQlyZXQgPSAtRUJVU1k7CisJCQlnb3RvIGVycm9yOworCQl9CisJCXMtPmJ1c3kgPSBkOworCisJCXN3aXRjaCAoaW5zbi0+aW5zbikgeworCQljYXNlIElOU05fUkVBRDoKKwkJCXJldCA9IHMtPmluc25fcmVhZChkZXYsIHMsIGluc24sIGluc24tPmRhdGEpOworCQkJYnJlYWs7CisJCWNhc2UgSU5TTl9XUklURToKKwkJCXJldCA9IHMtPmluc25fd3JpdGUoZGV2LCBzLCBpbnNuLCBpbnNuLT5kYXRhKTsKKwkJCWJyZWFrOworCQljYXNlIElOU05fQklUUzoKKwkJCXJldCA9IHMtPmluc25fYml0cyhkZXYsIHMsIGluc24sIGluc24tPmRhdGEpOworCQkJYnJlYWs7CisJCWNhc2UgSU5TTl9DT05GSUc6CisJCQkvKiBYWFggc2hvdWxkIGNoZWNrIGluc3RydWN0aW9uIGxlbmd0aCAqLworCQkJcmV0ID0gcy0+aW5zbl9jb25maWcoZGV2LCBzLCBpbnNuLCBpbnNuLT5kYXRhKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCQl9CisKKwkJcy0+YnVzeSA9IE5VTEw7CisJfQorCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycm9yOworI2lmIDAKKwkvKiBYWFggZG8gd2Ugd2FudCB0aGlzPyAtLSBhYmJvdHRpICNpZidlZCBpdCBvdXQgZm9yIG5vdy4gKi8KKwlpZiAocmV0ICE9IGluc24tPm4pIHsKKwkJcnRfcHJpbnRrKCJCVUc6IHJlc3VsdCBvZiBpbnNuICE9IGluc24ublxuIik7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZXJyb3I7CisJfQorI2VuZGlmCisgICAgICBlcnJvcjoKKworCXJldHVybiByZXQ7Cit9CisKKy8qCisJQ09NRURJX0xPQ0sKKwlsb2NrIHN1YmRldmljZQorCisJYXJnOgorCQlzdWJkZXZpY2UgbnVtYmVyCisKKwlyZWFkczoKKwkJbm9uZQorCisJd3JpdGVzOgorCQlub25lCisKKwluZWNlc3NhcnkgbG9ja2luZzoKKwktIGlvY3RsL3J0IGxvY2sgICh0aGlzIHR5cGUpCisJLSBsb2NrIHdoaWxlIHN1YmRldmljZSBidXN5CisJLSBsb2NrIHdoaWxlIHN1YmRldmljZSBiZWluZyBwcm9ncmFtbWVkCisKKyovCitpbnQgY29tZWRpX2xvY2soY29tZWRpX3QgKiBkLCB1bnNpZ25lZCBpbnQgc3ViZGV2aWNlKQoreworCWNvbWVkaV9kZXZpY2UgKmRldiA9IChjb21lZGlfZGV2aWNlICopIGQ7CisJY29tZWRpX3N1YmRldmljZSAqczsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQgPSAwOworCisJaWYgKHN1YmRldmljZSA+PSBkZXYtPm5fc3ViZGV2aWNlcykgeworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcyA9IGRldi0+c3ViZGV2aWNlcyArIHN1YmRldmljZTsKKworCWNvbWVkaV9zcGluX2xvY2tfaXJxc2F2ZSgmcy0+c3Bpbl9sb2NrLCBmbGFncyk7CisKKwlpZiAocy0+YnVzeSkgeworCQlyZXQgPSAtRUJVU1k7CisJfSBlbHNlIHsKKwkJaWYgKHMtPmxvY2spIHsKKwkJCXJldCA9IC1FQlVTWTsKKwkJfSBlbHNlIHsKKwkJCXMtPmxvY2sgPSBkOworCQl9CisJfQorCisJY29tZWRpX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPnNwaW5fbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHJldDsKK30KKworLyoKKwlDT01FRElfVU5MT0NLCisJdW5sb2NrIHN1YmRldmljZQorCisJYXJnOgorCQlzdWJkZXZpY2UgbnVtYmVyCisKKwlyZWFkczoKKwkJbm9uZQorCisJd3JpdGVzOgorCQlub25lCisKKyovCitpbnQgY29tZWRpX3VubG9jayhjb21lZGlfdCAqIGQsIHVuc2lnbmVkIGludCBzdWJkZXZpY2UpCit7CisJY29tZWRpX2RldmljZSAqZGV2ID0gKGNvbWVkaV9kZXZpY2UgKikgZDsKKwljb21lZGlfc3ViZGV2aWNlICpzOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJY29tZWRpX2FzeW5jICphc3luYzsKKwlpbnQgcmV0OworCisJaWYgKHN1YmRldmljZSA+PSBkZXYtPm5fc3ViZGV2aWNlcykgeworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcyA9IGRldi0+c3ViZGV2aWNlcyArIHN1YmRldmljZTsKKworCWFzeW5jID0gcy0+YXN5bmM7CisKKwljb21lZGlfc3Bpbl9sb2NrX2lycXNhdmUoJnMtPnNwaW5fbG9jaywgZmxhZ3MpOworCisJaWYgKHMtPmJ1c3kpIHsKKwkJcmV0ID0gLUVCVVNZOworCX0gZWxzZSBpZiAocy0+bG9jayAmJiBzLT5sb2NrICE9ICh2b2lkICopZCkgeworCQlyZXQgPSAtRUFDQ0VTOworCX0gZWxzZSB7CisJCXMtPmxvY2sgPSBOVUxMOworCisJCWlmIChhc3luYykgeworCQkJYXN5bmMtPmNiX21hc2sgPSAwOworCQkJYXN5bmMtPmNiX2Z1bmMgPSBOVUxMOworCQkJYXN5bmMtPmNiX2FyZyA9IE5VTEw7CisJCX0KKworCQlyZXQgPSAwOworCX0KKworCWNvbWVkaV9zcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5zcGluX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qCisJQ09NRURJX0NBTkNFTAorCWNhbmNlbCBhY3F1aXNpdGlvbiBpb2N0bAorCisJYXJnOgorCQlzdWJkZXZpY2UgbnVtYmVyCisKKwlyZWFkczoKKwkJbm90aGluZworCisJd3JpdGVzOgorCQlub3RoaW5nCisKKyovCitpbnQgY29tZWRpX2NhbmNlbChjb21lZGlfdCAqIGQsIHVuc2lnbmVkIGludCBzdWJkZXZpY2UpCit7CisJY29tZWRpX2RldmljZSAqZGV2ID0gKGNvbWVkaV9kZXZpY2UgKikgZDsKKwljb21lZGlfc3ViZGV2aWNlICpzOworCWludCByZXQgPSAwOworCisJaWYgKHN1YmRldmljZSA+PSBkZXYtPm5fc3ViZGV2aWNlcykgeworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcyA9IGRldi0+c3ViZGV2aWNlcyArIHN1YmRldmljZTsKKworCWlmIChzLT5sb2NrICYmIHMtPmxvY2sgIT0gZCkKKwkJcmV0dXJuIC1FQUNDRVM7CisKKyNpZiAwCisJaWYgKCFzLT5idXN5KQorCQlyZXR1cm4gMDsKKworCWlmIChzLT5idXN5ICE9IGQpCisJCXJldHVybiAtRUJVU1k7CisjZW5kaWYKKworCWlmICghcy0+Y2FuY2VsIHx8ICFzLT5hc3luYykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoKHJldCA9IHMtPmNhbmNlbChkZXYsIHMpKSkKKwkJcmV0dXJuIHJldDsKKworI2lmZGVmIENPTkZJR19DT01FRElfUlQKKwlpZiAoY29tZWRpX2dldF9zdWJkZXZpY2VfcnVuZmxhZ3MocykgJiBTUkZfUlQpIHsKKwkJY29tZWRpX3N3aXRjaF90b19ub25fcnQoZGV2KTsKKwl9CisjZW5kaWYKKwljb21lZGlfc2V0X3N1YmRldmljZV9ydW5mbGFncyhzLCBTUkZfUlVOTklORyB8IFNSRl9SVCwgMCk7CisJcy0+YXN5bmMtPmludHRyaWcgPSBOVUxMOworCXMtPmJ1c3kgPSBOVUxMOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgICByZWdpc3RyYXRpb24gb2YgY2FsbGJhY2sgZnVuY3Rpb25zCisgKi8KK2ludCBjb21lZGlfcmVnaXN0ZXJfY2FsbGJhY2soY29tZWRpX3QgKiBkLCB1bnNpZ25lZCBpbnQgc3ViZGV2aWNlLAorCXVuc2lnbmVkIGludCBtYXNrLCBpbnQgKCpjYikgKHVuc2lnbmVkIGludCwgdm9pZCAqKSwgdm9pZCAqYXJnKQoreworCWNvbWVkaV9kZXZpY2UgKmRldiA9IChjb21lZGlfZGV2aWNlICopIGQ7CisJY29tZWRpX3N1YmRldmljZSAqczsKKwljb21lZGlfYXN5bmMgKmFzeW5jOworCisJaWYgKHN1YmRldmljZSA+PSBkZXYtPm5fc3ViZGV2aWNlcykgeworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcyA9IGRldi0+c3ViZGV2aWNlcyArIHN1YmRldmljZTsKKworCWFzeW5jID0gcy0+YXN5bmM7CisJaWYgKHMtPnR5cGUgPT0gQ09NRURJX1NVQkRfVU5VU0VEIHx8ICFhc3luYykKKwkJcmV0dXJuIC1FSU87CisKKwkvKiBhcmUgd2UgbG9ja2VkPyAoaW9jdGwgbG9jaykgKi8KKwlpZiAocy0+bG9jayAmJiBzLT5sb2NrICE9IGQpCisJCXJldHVybiAtRUFDQ0VTOworCisJLyogYXJlIHdlIGJ1c3k/ICovCisJaWYgKHMtPmJ1c3kpCisJCXJldHVybiAtRUJVU1k7CisKKwlpZiAoIW1hc2spIHsKKwkJYXN5bmMtPmNiX21hc2sgPSAwOworCQlhc3luYy0+Y2JfZnVuYyA9IE5VTEw7CisJCWFzeW5jLT5jYl9hcmcgPSBOVUxMOworCX0gZWxzZSB7CisJCWFzeW5jLT5jYl9tYXNrID0gbWFzazsKKwkJYXN5bmMtPmNiX2Z1bmMgPSBjYjsKKwkJYXN5bmMtPmNiX2FyZyA9IGFyZzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IGNvbWVkaV9wb2xsKGNvbWVkaV90ICogZCwgdW5zaWduZWQgaW50IHN1YmRldmljZSkKK3sKKwljb21lZGlfZGV2aWNlICpkZXYgPSAoY29tZWRpX2RldmljZSAqKSBkOworCWNvbWVkaV9zdWJkZXZpY2UgKnMgPSBkZXYtPnN1YmRldmljZXM7CisJY29tZWRpX2FzeW5jICphc3luYzsKKworCWlmIChzdWJkZXZpY2UgPj0gZGV2LT5uX3N1YmRldmljZXMpIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXMgPSBkZXYtPnN1YmRldmljZXMgKyBzdWJkZXZpY2U7CisKKwlhc3luYyA9IHMtPmFzeW5jOworCWlmIChzLT50eXBlID09IENPTUVESV9TVUJEX1VOVVNFRCB8fCAhYXN5bmMpCisJCXJldHVybiAtRUlPOworCisJLyogYXJlIHdlIGxvY2tlZD8gKGlvY3RsIGxvY2spICovCisJaWYgKHMtPmxvY2sgJiYgcy0+bG9jayAhPSBkKQorCQlyZXR1cm4gLUVBQ0NFUzsKKworCS8qIGFyZSB3ZSBydW5uaW5nPyBYWFggd3Jvbmc/ICovCisJaWYgKCFzLT5idXN5KQorCQlyZXR1cm4gLUVJTzsKKworCXJldHVybiBzLT5wb2xsKGRldiwgcyk7Cit9CisKKy8qIFdBUk5JTkc6IG5vdCBwb3J0YWJsZSAqLworaW50IGNvbWVkaV9tYXAoY29tZWRpX3QgKiBkLCB1bnNpZ25lZCBpbnQgc3ViZGV2aWNlLCB2b2lkICpwdHIpCit7CisJY29tZWRpX2RldmljZSAqZGV2ID0gKGNvbWVkaV9kZXZpY2UgKikgZDsKKwljb21lZGlfc3ViZGV2aWNlICpzOworCisJaWYgKHN1YmRldmljZSA+PSBkZXYtPm5fc3ViZGV2aWNlcykgeworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcyA9IGRldi0+c3ViZGV2aWNlcyArIHN1YmRldmljZTsKKworCWlmICghcy0+YXN5bmMpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHB0cikgeworCQkqKCh2b2lkICoqKXB0cikgPSBzLT5hc3luYy0+cHJlYWxsb2NfYnVmOworCX0KKworCS8qIFhYWCBubyByZWZlcmVuY2UgY291bnRpbmcgKi8KKworCXJldHVybiAwOworfQorCisvKiBXQVJOSU5HOiBub3QgcG9ydGFibGUgKi8KK2ludCBjb21lZGlfdW5tYXAoY29tZWRpX3QgKiBkLCB1bnNpZ25lZCBpbnQgc3ViZGV2aWNlKQoreworCWNvbWVkaV9kZXZpY2UgKmRldiA9IChjb21lZGlfZGV2aWNlICopIGQ7CisJY29tZWRpX3N1YmRldmljZSAqczsKKworCWlmIChzdWJkZXZpY2UgPj0gZGV2LT5uX3N1YmRldmljZXMpIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXMgPSBkZXYtPnN1YmRldmljZXMgKyBzdWJkZXZpY2U7CisKKwlpZiAoIXMtPmFzeW5jKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIFhYWCBubyByZWZlcmVuY2UgY291bnRpbmcgKi8KKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9rY29tZWRpbGliL2tzeW1zLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2tjb21lZGlsaWIva3N5bXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NmI0NTA2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9rY29tZWRpbGliL2tzeW1zLmMKQEAgLTAsMCArMSwxNDQgQEAKKy8qCisgICAgY29tZWRpL2tjb21lZGlsaWIva3N5bXMuYworICAgIGEgY29tZWRsaWIgaW50ZXJmYWNlIGZvciBrZXJuZWwgbW9kdWxlcworCisgICAgQ09NRURJIC0gTGludXggQ29udHJvbCBhbmQgTWVhc3VyZW1lbnQgRGV2aWNlIEludGVyZmFjZQorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDAxIERhdmlkIEEuIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyovCisKKyNpZm5kZWYgRVhQT1JUX1NZTVRBQgorI2RlZmluZSBFWFBPUlRfU1lNVEFCCisjZW5kaWYKKworI2luY2x1ZGUgIi4uL2NvbWVkaS5oIgorI2luY2x1ZGUgIi4uL2NvbWVkaWxpYi5oIgorI2luY2x1ZGUgIi4uL2NvbWVkaWRldi5oIgorCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IDB4MDIwMjAwCisKKy8qIGZ1bmN0aW9ucyBzcGVjaWZpYyB0byBrY29tZWRpbGliICovCisKK0VYUE9SVF9TWU1CT0woY29tZWRpX3JlZ2lzdGVyX2NhbGxiYWNrKTsKK0VYUE9SVF9TWU1CT0woY29tZWRpX2dldF9rcmFuZ2UpOworRVhQT1JUX1NZTUJPTChjb21lZGlfZ2V0X2J1Zl9oZWFkX3Bvcyk7CitFWFBPUlRfU1lNQk9MKGNvbWVkaV9zZXRfdXNlcl9pbnRfY291bnQpOworRVhQT1JUX1NZTUJPTChjb21lZGlfbWFwKTsKK0VYUE9SVF9TWU1CT0woY29tZWRpX3VubWFwKTsKKworLyogVGhpcyBsaXN0IGNvbWVzIGZyb20gdXNlci1zcGFjZSBjb21lZGlsaWIsIHRvIHNob3cgd2hpY2gKKyAqIGZ1bmN0aW9ucyBhcmUgbm90IHBvcnRlZCB5ZXQuICovCisKK0VYUE9SVF9TWU1CT0woY29tZWRpX29wZW4pOworRVhQT1JUX1NZTUJPTChjb21lZGlfY2xvc2UpOworCisvKiBsb2dnaW5nICovCitFWFBPUlRfU1lNQk9MKGNvbWVkaV9sb2dsZXZlbCk7CitFWFBPUlRfU1lNQk9MKGNvbWVkaV9wZXJyb3IpOworRVhQT1JUX1NZTUJPTChjb21lZGlfc3RyZXJyb3IpOworLy9FWFBPUlRfU1lNQk9MKGNvbWVkaV9lcnJubyk7CitFWFBPUlRfU1lNQk9MKGNvbWVkaV9maWxlbm8pOworCisvKiBkZXZpY2UgcXVlcmllcyAqLworRVhQT1JUX1NZTUJPTChjb21lZGlfZ2V0X25fc3ViZGV2aWNlcyk7CitFWFBPUlRfU1lNQk9MKGNvbWVkaV9nZXRfdmVyc2lvbl9jb2RlKTsKK0VYUE9SVF9TWU1CT0woY29tZWRpX2dldF9kcml2ZXJfbmFtZSk7CitFWFBPUlRfU1lNQk9MKGNvbWVkaV9nZXRfYm9hcmRfbmFtZSk7CisKKy8qIHN1YmRldmljZSBxdWVyaWVzICovCitFWFBPUlRfU1lNQk9MKGNvbWVkaV9nZXRfc3ViZGV2aWNlX3R5cGUpOworRVhQT1JUX1NZTUJPTChjb21lZGlfZmluZF9zdWJkZXZpY2VfYnlfdHlwZSk7CitFWFBPUlRfU1lNQk9MKGNvbWVkaV9nZXRfc3ViZGV2aWNlX2ZsYWdzKTsKK0VYUE9SVF9TWU1CT0woY29tZWRpX2dldF9uX2NoYW5uZWxzKTsKKy8vRVhQT1JUX1NZTUJPTChjb21lZGlfcmFuZ2VfaXNfY2hhbl9zcGVjaWZpYyk7CisvL0VYUE9SVF9TWU1CT0woY29tZWRpX21heGRhdGFfaXNfY2hhbl9zcGVjaWZpYyk7CisKKy8qIGNoYW5uZWwgcXVlcmllcyAqLworRVhQT1JUX1NZTUJPTChjb21lZGlfZ2V0X21heGRhdGEpOworI2lmZGVmIEtDT01FRElMSUJfREVQUkVDQVRFRAorRVhQT1JUX1NZTUJPTChjb21lZGlfZ2V0X3JhbmdldHlwZSk7CisjZW5kaWYKK0VYUE9SVF9TWU1CT0woY29tZWRpX2dldF9uX3Jhbmdlcyk7CisvL0VYUE9SVF9TWU1CT0woY29tZWRpX2ZpbmRfcmFuZ2UpOworCisvKiBidWZmZXIgcXVlcmllcyAqLworRVhQT1JUX1NZTUJPTChjb21lZGlfZ2V0X2J1ZmZlcl9zaXplKTsKKy8vRVhQT1JUX1NZTUJPTChjb21lZGlfZ2V0X21heF9idWZmZXJfc2l6ZSk7CisvL0VYUE9SVF9TWU1CT0woY29tZWRpX3NldF9idWZmZXJfc2l6ZSk7CitFWFBPUlRfU1lNQk9MKGNvbWVkaV9nZXRfYnVmZmVyX2NvbnRlbnRzKTsKK0VYUE9SVF9TWU1CT0woY29tZWRpX2dldF9idWZmZXJfb2Zmc2V0KTsKKworLyogbG93LWxldmVsIHN0dWZmICovCisvL0VYUE9SVF9TWU1CT0woY29tZWRpX3RyaWdnZXIpOworLy9FWFBPUlRfU1lNQk9MKGNvbWVkaV9kb19pbnNubGlzdCk7CitFWFBPUlRfU1lNQk9MKGNvbWVkaV9kb19pbnNuKTsKK0VYUE9SVF9TWU1CT0woY29tZWRpX2xvY2spOworRVhQT1JUX1NZTUJPTChjb21lZGlfdW5sb2NrKTsKKworLyogcGh5c2ljYWwgdW5pdHMgKi8KKy8vRVhQT1JUX1NZTUJPTChjb21lZGlfdG9fcGh5cyk7CisvL0VYUE9SVF9TWU1CT0woY29tZWRpX2Zyb21fcGh5cyk7CisKKy8qIHN5bmNocm9ub3VzIHN0dWZmICovCitFWFBPUlRfU1lNQk9MKGNvbWVkaV9kYXRhX3JlYWQpOworRVhQT1JUX1NZTUJPTChjb21lZGlfZGF0YV9yZWFkX2hpbnQpOworRVhQT1JUX1NZTUJPTChjb21lZGlfZGF0YV9yZWFkX2RlbGF5ZWQpOworRVhQT1JUX1NZTUJPTChjb21lZGlfZGF0YV93cml0ZSk7CitFWFBPUlRfU1lNQk9MKGNvbWVkaV9kaW9fY29uZmlnKTsKK0VYUE9SVF9TWU1CT0woY29tZWRpX2Rpb19yZWFkKTsKK0VYUE9SVF9TWU1CT0woY29tZWRpX2Rpb193cml0ZSk7CitFWFBPUlRfU1lNQk9MKGNvbWVkaV9kaW9fYml0ZmllbGQpOworCisvKiBzbG93bHkgdmFyeWluZyBzdHVmZiAqLworLy9FWFBPUlRfU1lNQk9MKGNvbWVkaV9zdl9pbml0KTsKKy8vRVhQT1JUX1NZTUJPTChjb21lZGlfc3ZfdXBkYXRlKTsKKy8vRVhQT1JUX1NZTUJPTChjb21lZGlfc3ZfbWVhc3VyZSk7CisKKy8qIGNvbW1hbmRzICovCisvL0VYUE9SVF9TWU1CT0woY29tZWRpX2dldF9jbWRfc3JjX21hc2spOworLy9FWFBPUlRfU1lNQk9MKGNvbWVkaV9nZXRfY21kX2dlbmVyaWNfdGltZWQpOworRVhQT1JUX1NZTUJPTChjb21lZGlfY2FuY2VsKTsKK0VYUE9SVF9TWU1CT0woY29tZWRpX2NvbW1hbmQpOworRVhQT1JUX1NZTUJPTChjb21lZGlfY29tbWFuZF90ZXN0KTsKK0VYUE9SVF9TWU1CT0woY29tZWRpX3BvbGwpOworCisvKiBidWZmZXIgY29uZmlndXJhdGlvbiAqLworRVhQT1JUX1NZTUJPTChjb21lZGlfbWFya19idWZmZXJfcmVhZCk7CitFWFBPUlRfU1lNQk9MKGNvbWVkaV9tYXJrX2J1ZmZlcl93cml0dGVuKTsKKworLy9FWFBPUlRfU1lNQk9MKGNvbWVkaV9nZXRfcmFuZ2UpOworRVhQT1JUX1NZTUJPTChjb21lZGlfZ2V0X2xlbl9jaGFubGlzdCk7CisKKy8qIGRlcHJlY2F0ZWQgKi8KKy8vRVhQT1JUX1NZTUJPTChjb21lZGlfZ2V0X3RpbWVyKTsKKy8vRVhQT1JUX1NZTUJPTChjb21lZGlfdGltZWRfMWNoYW4pOworCisvKiBhbHBoYSAqLworLy9FWFBPUlRfU1lNQk9MKGNvbWVkaV9zZXRfZ2xvYmFsX29vcl9iZWhhdmlvcik7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9wY2lfaWRzLmggYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL3BjaV9pZHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjFiYTkwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9wY2lfaWRzLmgKQEAgLTAsMCArMSwzMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfX0NPTVBBVF9MSU5VWF9QQ0lfSURTX0gKKyNkZWZpbmUgX19DT01QQVRfTElOVVhfUENJX0lEU19ICisKKyNpbmNsdWRlIDxsaW51eC9wY2lfaWRzLmg+CisKKyNpZm5kZWYgUENJX1ZFTkRPUl9JRF9BTUNDCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfQU1DQwkweDEwZTgKKyNlbmRpZgorCisjaWZuZGVmIFBDSV9WRU5ET1JfSURfQ0JPQVJEUworI2RlZmluZSBQQ0lfVkVORE9SX0lEX0NCT0FSRFMJMHgxMzA3CisjZW5kaWYKKworI2lmbmRlZiBQQ0lfVkVORE9SX0lEX1FVQU5DT00KKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9RVUFOQ09NCTB4ODAwOAorI2VuZGlmCisKKyNpZm5kZWYgUENJX0RFVklDRV9JRF9RVUFOQ09NX0dQSUIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9RVUFOQ09NX0dQSUIJMHgzMzAyCisjZW5kaWYKKworI2VuZGlmIC8vIF9fQ09NUEFUX0xJTlVYX1BDSV9JRFNfSApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9wcm9jLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL3Byb2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTJiNzJkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9wcm9jLmMKQEAgLTAsMCArMSwxMDIgQEAKKy8qCisgICAgbW9kdWxlL3Byb2MuYworICAgIC9wcm9jIGludGVyZmFjZSBmb3IgY29tZWRpCisKKyAgICBDT01FREkgLSBMaW51eCBDb250cm9sIGFuZCBNZWFzdXJlbWVudCBEZXZpY2UgSW50ZXJmYWNlCisgICAgQ29weXJpZ2h0IChDKSAxOTk4IERhdmlkIEEuIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyovCisKKy8qCisJVGhpcyBpcyBzb21lIHNlcmlvdXMgYmxvYXR3YXJlLgorCisJVGFrZW4gZnJvbSBEYXZlIEEuJ3MgUENMLTcxMSBkcml2ZXIsICdjdXogSSB0aG91Z2h0IGl0CisJd2FzIGNvb2wuCisqLworCisjZGVmaW5lIF9fTk9fVkVSU0lPTl9fCisjaW5jbHVkZSAiY29tZWRpZGV2LmgiCisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorLy8jaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisKK2ludCBjb21lZGlfcmVhZF9wcm9jbWVtKGNoYXIgKmJ1ZiwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsIGludCBsZW4sCisJaW50ICplb2YsIHZvaWQgKmRhdGEpOworCitleHRlcm4gY29tZWRpX2RyaXZlciAqY29tZWRpX2RyaXZlcnM7CisKK2ludCBjb21lZGlfcmVhZF9wcm9jbWVtKGNoYXIgKmJ1ZiwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsIGludCBsZW4sCisJaW50ICplb2YsIHZvaWQgKmRhdGEpCit7CisJaW50IGk7CisJaW50IGRldmljZXNfcSA9IDA7CisJaW50IGwgPSAwOworCWNvbWVkaV9kcml2ZXIgKmRyaXY7CisKKwlsICs9IHNwcmludGYoYnVmICsgbCwKKwkJImNvbWVkaSB2ZXJzaW9uICIgQ09NRURJX1JFTEVBU0UgIlxuIgorCQkiZm9ybWF0IHN0cmluZzogJXNcbiIsCisJCSJcIiUyZDogJS0yMHMgJS0yMHMgJTRkXCIsaSxkcml2ZXJfbmFtZSxib2FyZF9uYW1lLG5fc3ViZGV2aWNlcyIpOworCisJZm9yIChpID0gMDsgaSA8IENPTUVESV9OVU1fQk9BUkRfTUlOT1JTOyBpKyspIHsKKwkJc3RydWN0IGNvbWVkaV9kZXZpY2VfZmlsZV9pbmZvICpkZXZfZmlsZV9pbmZvID0gY29tZWRpX2dldF9kZXZpY2VfZmlsZV9pbmZvKGkpOworCQljb21lZGlfZGV2aWNlICpkZXY7CisKKwkJaWYoZGV2X2ZpbGVfaW5mbyA9PSBOVUxMKSBjb250aW51ZTsKKwkJZGV2ID0gZGV2X2ZpbGVfaW5mby0+ZGV2aWNlOworCisJCWlmIChkZXYtPmF0dGFjaGVkKSB7CisJCQlkZXZpY2VzX3EgPSAxOworCQkJbCArPSBzcHJpbnRmKGJ1ZiArIGwsICIlMmQ6ICUtMjBzICUtMjBzICU0ZFxuIiwKKwkJCQlpLAorCQkJCWRldi0+ZHJpdmVyLT5kcml2ZXJfbmFtZSwKKwkJCQlkZXYtPmJvYXJkX25hbWUsIGRldi0+bl9zdWJkZXZpY2VzKTsKKwkJfQorCX0KKwlpZiAoIWRldmljZXNfcSkgeworCQlsICs9IHNwcmludGYoYnVmICsgbCwgIm5vIGRldmljZXNcbiIpOworCX0KKworCWZvciAoZHJpdiA9IGNvbWVkaV9kcml2ZXJzOyBkcml2OyBkcml2ID0gZHJpdi0+bmV4dCkgeworCQlsICs9IHNwcmludGYoYnVmICsgbCwgIiVzOlxuIiwgZHJpdi0+ZHJpdmVyX25hbWUpOworCQlmb3IgKGkgPSAwOyBpIDwgZHJpdi0+bnVtX25hbWVzOyBpKyspIHsKKwkJCWwgKz0gc3ByaW50ZihidWYgKyBsLCAiICVzXG4iLAorCQkJCSooY2hhciAqKikoKGNoYXIgKilkcml2LT5ib2FyZF9uYW1lICsKKwkJCQkJaSAqIGRyaXYtPm9mZnNldCkpOworCQl9CisJCWlmICghZHJpdi0+bnVtX25hbWVzKSB7CisJCQlsICs9IHNwcmludGYoYnVmICsgbCwgIiAlc1xuIiwgZHJpdi0+ZHJpdmVyX25hbWUpOworCQl9CisJfQorCisJcmV0dXJuIGw7Cit9CisKKyNpZmRlZiBDT05GSUdfUFJPQ19GUwordm9pZCBjb21lZGlfcHJvY19pbml0KHZvaWQpCit7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpjb21lZGlfcHJvYzsKKworCWNvbWVkaV9wcm9jID0gY3JlYXRlX3Byb2NfZW50cnkoImNvbWVkaSIsIFNfSUZSRUcgfCBTX0lSVUdPLCAwKTsKKwlpZiAoY29tZWRpX3Byb2MpCisJCWNvbWVkaV9wcm9jLT5yZWFkX3Byb2MgPSBjb21lZGlfcmVhZF9wcm9jbWVtOworfQorCit2b2lkIGNvbWVkaV9wcm9jX2NsZWFudXAodm9pZCkKK3sKKwlyZW1vdmVfcHJvY19lbnRyeSgiY29tZWRpIiwgMCk7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvcmFuZ2UuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvcmFuZ2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MWRjM2NkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9yYW5nZS5jCkBAIC0wLDAgKzEsMTYxIEBACisvKgorICAgIG1vZHVsZS9yYW5nZS5jCisgICAgY29tZWRpIHJvdXRpbmVzIGZvciB2b2x0YWdlIHJhbmdlcworCisgICAgQ09NRURJIC0gTGludXggQ29udHJvbCBhbmQgTWVhc3VyZW1lbnQgRGV2aWNlIEludGVyZmFjZQorICAgIENvcHlyaWdodCAoQykgMTk5Ny04IERhdmlkIEEuIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyovCisKKyNpbmNsdWRlICJjb21lZGlkZXYuaCIKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCitjb25zdCBjb21lZGlfbHJhbmdlIHJhbmdlX2JpcG9sYXIxMCA9IHsgMSwge0JJUF9SQU5HRSgxMCl9IH07Citjb25zdCBjb21lZGlfbHJhbmdlIHJhbmdlX2JpcG9sYXI1ID0geyAxLCB7QklQX1JBTkdFKDUpfSB9OworY29uc3QgY29tZWRpX2xyYW5nZSByYW5nZV9iaXBvbGFyMl81ID0geyAxLCB7QklQX1JBTkdFKDIuNSl9IH07Citjb25zdCBjb21lZGlfbHJhbmdlIHJhbmdlX3VuaXBvbGFyMTAgPSB7IDEsIHtVTklfUkFOR0UoMTApfSB9OworY29uc3QgY29tZWRpX2xyYW5nZSByYW5nZV91bmlwb2xhcjUgPSB7IDEsIHtVTklfUkFOR0UoNSl9IH07Citjb25zdCBjb21lZGlfbHJhbmdlIHJhbmdlX3Vua25vd24gPSB7IDEsIHt7MCwgMTAwMDAwMCwgVU5JVF9ub25lfX0gfTsKKworLyoKKyAgIAlDT01FRElfUkFOR0VJTkZPCisJcmFuZ2UgaW5mb3JtYXRpb24gaW9jdGwKKworCWFyZzoKKwkJcG9pbnRlciB0byByYW5nZWluZm8gc3RydWN0dXJlCisKKwlyZWFkczoKKwkJcmFuZ2UgaW5mbyBzdHJ1Y3R1cmUKKworCXdyaXRlczoKKwkJbiBjb21lZGlfa3JhbmdlIHN0cnVjdHVyZXMgdG8gcmFuZ2VpbmZvLT5yYW5nZV9wdHIKKyovCitpbnQgZG9fcmFuZ2VpbmZvX2lvY3RsKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGNvbWVkaV9yYW5nZWluZm8gKiBhcmcpCit7CisJY29tZWRpX3JhbmdlaW5mbyBpdDsKKwlpbnQgc3ViZCwgY2hhbjsKKwljb25zdCBjb21lZGlfbHJhbmdlICpscjsKKwljb21lZGlfc3ViZGV2aWNlICpzOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZpdCwgYXJnLCBzaXplb2YoY29tZWRpX3JhbmdlaW5mbykpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlzdWJkID0gKGl0LnJhbmdlX3R5cGUgPj4gMjQpICYgMHhmOworCWNoYW4gPSAoaXQucmFuZ2VfdHlwZSA+PiAxNikgJiAweGZmOworCisJaWYgKCFkZXYtPmF0dGFjaGVkKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoc3ViZCA+PSBkZXYtPm5fc3ViZGV2aWNlcykKKwkJcmV0dXJuIC1FSU5WQUw7CisJcyA9IGRldi0+c3ViZGV2aWNlcyArIHN1YmQ7CisJaWYgKHMtPnJhbmdlX3RhYmxlKSB7CisJCWxyID0gcy0+cmFuZ2VfdGFibGU7CisJfSBlbHNlIGlmIChzLT5yYW5nZV90YWJsZV9saXN0KSB7CisJCWlmIChjaGFuID49IHMtPm5fY2hhbikKKwkJCXJldHVybiAtRUlOVkFMOworCQlsciA9IHMtPnJhbmdlX3RhYmxlX2xpc3RbY2hhbl07CisJfSBlbHNlIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKFJBTkdFX0xFTkdUSChpdC5yYW5nZV90eXBlKSAhPSBsci0+bGVuZ3RoKSB7CisJCURQUklOVEsoIndyb25nIGxlbmd0aCAlZCBzaG91bGQgYmUgJWQgKDB4JTA4eClcbiIsCisJCQlSQU5HRV9MRU5HVEgoaXQucmFuZ2VfdHlwZSksIGxyLT5sZW5ndGgsIGl0LnJhbmdlX3R5cGUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoY29weV90b191c2VyKGl0LnJhbmdlX3B0ciwgbHItPnJhbmdlLAorCQkJc2l6ZW9mKGNvbWVkaV9rcmFuZ2UpICogbHItPmxlbmd0aCkpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXJlZl9pbnZhbGlkKGNvbWVkaV9zdWJkZXZpY2UgKiBzLCB1bnNpZ25lZCBpbnQgY2hhbnNwZWMpCit7CisJdW5zaWduZWQgaW50IGFyZWY7CisKKwkvLyBkaXNhYmxlIHJlcG9ydGluZyBpbnZhbGlkIGFyZWZzLi4uIG1heWJlIHNvbWVkYXkKKwlyZXR1cm4gMDsKKworCWFyZWYgPSBDUl9BUkVGKGNoYW5zcGVjKTsKKwlzd2l0Y2ggKGFyZWYpIHsKKwljYXNlIEFSRUZfRElGRjoKKwkJaWYgKHMtPnN1YmRldl9mbGFncyAmIFNERl9ESUZGKQorCQkJcmV0dXJuIDA7CisJCWJyZWFrOworCWNhc2UgQVJFRl9DT01NT046CisJCWlmIChzLT5zdWJkZXZfZmxhZ3MgJiBTREZfQ09NTU9OKQorCQkJcmV0dXJuIDA7CisJCWJyZWFrOworCWNhc2UgQVJFRl9HUk9VTkQ6CisJCWlmIChzLT5zdWJkZXZfZmxhZ3MgJiBTREZfR1JPVU5EKQorCQkJcmV0dXJuIDA7CisJCWJyZWFrOworCWNhc2UgQVJFRl9PVEhFUjoKKwkJaWYgKHMtPnN1YmRldl9mbGFncyAmIFNERl9PVEhFUikKKwkJCXJldHVybiAwOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJRFBSSU5USygic3ViZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgYXJlZiAlaSIsIGFyZWYpOworCXJldHVybiAxOworfQorCisvKgorICAgVGhpcyBmdW5jdGlvbiBjaGVja3MgZWFjaCBlbGVtZW50IGluIGEgY2hhbm5lbC9nYWluIGxpc3QgdG8gbWFrZQorICAgbWFrZSBzdXJlIGl0IGlzIHZhbGlkLgorKi8KK2ludCBjaGVja19jaGFubGlzdChjb21lZGlfc3ViZGV2aWNlICogcywgaW50IG4sIHVuc2lnbmVkIGludCAqY2hhbmxpc3QpCit7CisJaW50IGk7CisJaW50IGNoYW47CisKKwlpZiAocy0+cmFuZ2VfdGFibGUpIHsKKwkJZm9yIChpID0gMDsgaSA8IG47IGkrKykKKwkJCWlmIChDUl9DSEFOKGNoYW5saXN0W2ldKSA+PSBzLT5uX2NoYW4gfHwKKwkJCQlDUl9SQU5HRShjaGFubGlzdFtpXSkgPj0gcy0+cmFuZ2VfdGFibGUtPmxlbmd0aAorCQkJCXx8IGFyZWZfaW52YWxpZChzLCBjaGFubGlzdFtpXSkpIHsKKwkJCQlydF9wcmludGsKKwkJCQkJKCJiYWQgY2hhbmxpc3RbJWRdPTB4JTA4eCBuX2NoYW49JWQgcmFuZ2UgbGVuZ3RoPSVkXG4iLAorCQkJCQlpLCBjaGFubGlzdFtpXSwgcy0+bl9jaGFuLAorCQkJCQlzLT5yYW5nZV90YWJsZS0+bGVuZ3RoKTsKKyNpZiAwCisJCQkJZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworCQkJCQlwcmludGsoIlslZF09MHglMDh4XG4iLCBpLCBjaGFubGlzdFtpXSk7CisJCQkJfQorI2VuZGlmCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJfSBlbHNlIGlmIChzLT5yYW5nZV90YWJsZV9saXN0KSB7CisJCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKwkJCWNoYW4gPSBDUl9DSEFOKGNoYW5saXN0W2ldKTsKKwkJCWlmIChjaGFuID49IHMtPm5fY2hhbiB8fAorCQkJCUNSX1JBTkdFKGNoYW5saXN0W2ldKSA+PQorCQkJCXMtPnJhbmdlX3RhYmxlX2xpc3RbY2hhbl0tPmxlbmd0aAorCQkJCXx8IGFyZWZfaW52YWxpZChzLCBjaGFubGlzdFtpXSkpIHsKKwkJCQlydF9wcmludGsoImJhZCBjaGFubGlzdFslZF09MHglMDh4XG4iLCBpLAorCQkJCQljaGFubGlzdFtpXSk7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlydF9wcmludGsoImNvbWVkaTogKGJ1Zykgbm8gcmFuZ2UgdHlwZSBsaXN0IVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvcnQuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODViODFiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9ydC5jCkBAIC0wLDAgKzEsNDEyIEBACisvKgorICAgIGNvbWVkaS9ydC5jCisgICAgY29tZWRpIGtlcm5lbCBtb2R1bGUKKworICAgIENPTUVESSAtIExpbnV4IENvbnRyb2wgYW5kIE1lYXN1cmVtZW50IERldmljZSBJbnRlcmZhY2UKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwMCBEYXZpZCBBLiBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisqLworCisjdW5kZWYgREVCVUcKKworI2RlZmluZSBfX05PX1ZFUlNJT05fXworI2luY2x1ZGUgPGxpbnV4L2NvbWVkaWRldi5oPgorCisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworI2luY2x1ZGUgInJ0X3BlbmRfdHEuaCIKKworI2lmZGVmIENPTkZJR19DT01FRElfUlRBSQorI2luY2x1ZGUgPHJ0YWkuaD4KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0NPTUVESV9GVVNJT04KKyNpbmNsdWRlIDxudWNsZXVzL2FzbS9oYWwuaD4KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0NPTUVESV9SVEwKKyNpbmNsdWRlIDxydGxfY29yZS5oPgorI2luY2x1ZGUgPHJ0bF9zeW5jLmg+CisjZW5kaWYKKworc3RydWN0IGNvbWVkaV9pcnFfc3RydWN0IHsKKwlpbnQgcnQ7CisJaW50IGlycTsKKwkgaXJxcmV0dXJuX3QoKmhhbmRsZXIpIChpbnQgaXJxLCB2b2lkICpkZXZfaWQgUFRfUkVHU19BUkcpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJY29uc3QgY2hhciAqZGV2aWNlOworCWNvbWVkaV9kZXZpY2UgKmRldl9pZDsKK307CisKK3N0YXRpYyBpbnQgY29tZWRpX3J0X2dldF9pcnEoc3RydWN0IGNvbWVkaV9pcnFfc3RydWN0ICppdCk7CitzdGF0aWMgaW50IGNvbWVkaV9ydF9yZWxlYXNlX2lycShzdHJ1Y3QgY29tZWRpX2lycV9zdHJ1Y3QgKml0KTsKKworc3RhdGljIHN0cnVjdCBjb21lZGlfaXJxX3N0cnVjdCAqY29tZWRpX2lycXNbTlJfSVJRU107CisKK2ludCBjb21lZGlfcmVxdWVzdF9pcnEodW5zaWduZWQgaXJxLCBpcnFyZXR1cm5fdCgqaGFuZGxlcikgKGludCwKKwkJdm9pZCAqUFRfUkVHU19BUkcpLCB1bnNpZ25lZCBsb25nIGZsYWdzLCBjb25zdCBjaGFyICpkZXZpY2UsCisJY29tZWRpX2RldmljZSAqIGRldl9pZCkKK3sKKwlzdHJ1Y3QgY29tZWRpX2lycV9zdHJ1Y3QgKml0OworCWludCByZXQ7CisJLyogbnVsbCBzaGFyZWQgaW50ZXJydXB0IGZsYWcsIHNpbmNlIHJ0IGludGVycnVwdCBoYW5kbGVycyBkbyBub3QKKwkgKiBzdXBwb3J0IGl0LCBhbmQgdGhpcyB2ZXJzaW9uIG9mIGNvbWVkaV9yZXF1ZXN0X2lycSgpIGlzIG9ubHkKKwkgKiBjYWxsZWQgZm9yIGtlcm5lbHMgd2l0aCBydCBzdXBwb3J0ICovCisJdW5zaWduZWQgbG9uZyB1bnNoYXJlZF9mbGFncyA9IGZsYWdzICYgfklSUUZfU0hBUkVEOworCisJcmV0ID0gcmVxdWVzdF9pcnEoaXJxLCBoYW5kbGVyLCB1bnNoYXJlZF9mbGFncywgZGV2aWNlLCBkZXZfaWQpOworCWlmIChyZXQgPCAwKSB7CisJCS8vIHdlIGZhaWxlZCwgc28gZmFsbCBiYWNrIG9uIGFsbG93aW5nIHNoYXJlZCBpbnRlcnJ1cHQgKHdoaWNoIHdlIHdvbid0IGV2ZXIgbWFrZSBSVCkKKwkJaWYgKGZsYWdzICYgSVJRRl9TSEFSRUQpIHsKKwkJCXJ0X3ByaW50aworCQkJCSgiY29tZWRpOiBjYW5ub3QgZ2V0IHVuc2hhcmVkIGludGVycnVwdCwgd2lsbCBub3QgdXNlIFJUIGludGVycnVwdHMuXG4iKTsKKwkJCXJldCA9IHJlcXVlc3RfaXJxKGlycSwgaGFuZGxlciwgZmxhZ3MsIGRldmljZSwgZGV2X2lkKTsKKwkJfQorCQlpZiAocmV0IDwgMCkgeworCQkJcmV0dXJuIHJldDsKKwkJfQorCX0gZWxzZSB7CisJCWl0ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGNvbWVkaV9pcnFfc3RydWN0KSwgR0ZQX0tFUk5FTCk7CisJCWlmICghaXQpCisJCQlyZXR1cm4gLUVOT01FTTsKKworCQlpdC0+aGFuZGxlciA9IGhhbmRsZXI7CisJCWl0LT5pcnEgPSBpcnE7CisJCWl0LT5kZXZfaWQgPSBkZXZfaWQ7CisJCWl0LT5kZXZpY2UgPSBkZXZpY2U7CisJCWl0LT5mbGFncyA9IHVuc2hhcmVkX2ZsYWdzOworCQljb21lZGlfaXJxc1tpcnFdID0gaXQ7CisJfQorCXJldHVybiAwOworfQorCit2b2lkIGNvbWVkaV9mcmVlX2lycSh1bnNpZ25lZCBpbnQgaXJxLCBjb21lZGlfZGV2aWNlICogZGV2X2lkKQoreworCXN0cnVjdCBjb21lZGlfaXJxX3N0cnVjdCAqaXQ7CisKKwlmcmVlX2lycShpcnEsIGRldl9pZCk7CisKKwlpdCA9IGNvbWVkaV9pcnFzW2lycV07CisJaWYgKGl0ID09IE5VTEwpCisJCXJldHVybjsKKworCWlmIChpdC0+cnQpIHsKKwkJcHJpbnRrKCJyZWFsLXRpbWUgSVJRIGFsbG9jYXRlZCBhdCBib2FyZCByZW1vdmFsIChpZ25vcmUpXG4iKTsKKwkJY29tZWRpX3J0X3JlbGVhc2VfaXJxKGl0KTsKKwl9CisKKwlrZnJlZShpdCk7CisJY29tZWRpX2lycXNbaXJxXSA9IE5VTEw7Cit9CisKK2ludCBjb21lZGlfc3dpdGNoX3RvX3J0KGNvbWVkaV9kZXZpY2UgKiBkZXYpCit7CisJc3RydWN0IGNvbWVkaV9pcnFfc3RydWN0ICppdDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaXQgPSBjb21lZGlfaXJxc1tkZXYtPmlycV07CisJLyogZHJpdmVycyBtaWdodCBub3QgYmUgdXNpbmcgYW4gaW50ZXJydXB0IGZvciBjb21tYW5kcywKKwkgICBvciB3ZSBtaWdodCBub3QgaGF2ZSBiZWVuIGFibGUgdG8gZ2V0IGFuIHVuc2hhcmVkIGlycSAqLworCWlmIChpdCA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisKKwljb21lZGlfc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+c3BpbmxvY2ssIGZsYWdzKTsKKworCWlmICghZGV2LT5ydCkKKwkJY29tZWRpX3J0X2dldF9pcnEoaXQpOworCisJZGV2LT5ydCsrOworCWl0LT5ydCA9IDE7CisKKwljb21lZGlfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5zcGlubG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgY29tZWRpX3N3aXRjaF90b19ub25fcnQoY29tZWRpX2RldmljZSAqIGRldikKK3sKKwlzdHJ1Y3QgY29tZWRpX2lycV9zdHJ1Y3QgKml0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpdCA9IGNvbWVkaV9pcnFzW2Rldi0+aXJxXTsKKwlpZiAoaXQgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJY29tZWRpX3NwaW5fbG9ja19pcnFzYXZlKCZkZXYtPnNwaW5sb2NrLCBmbGFncyk7CisKKwlkZXYtPnJ0LS07CisJaWYgKCFkZXYtPnJ0KQorCQljb21lZGlfcnRfcmVsZWFzZV9pcnEoaXQpOworCisJaXQtPnJ0ID0gMDsKKworCWNvbWVkaV9zcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPnNwaW5sb2NrLCBmbGFncyk7Cit9CisKK3ZvaWQgd2FrZV91cF9pbnRfaGFuZGxlcihpbnQgYXJnMSwgdm9pZCAqYXJnMikKK3sKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoKHdhaXRfcXVldWVfaGVhZF90ICopIGFyZzIpOworfQorCit2b2lkIGNvbWVkaV9ydF9wZW5kX3dha2V1cCh3YWl0X3F1ZXVlX2hlYWRfdCAqIHEpCit7CisJcnRfcGVuZF9jYWxsKHdha2VfdXBfaW50X2hhbmRsZXIsIDAsIHEpOworfQorCisvKiBSVEFJIHNlY3Rpb24gKi8KKyNpZmRlZiBDT05GSUdfQ09NRURJX1JUQUkKKworI2lmbmRlZiBIQVZFX1JUX1JFUVVFU1RfSVJRX1dJVEhfQVJHCisjZGVmaW5lIERFQ0xBUkVfVk9JRF9JUlEoaXJxKSBcCitzdGF0aWMgdm9pZCBoYW5kbGVfdm9pZF9pcnFfICMjIGlycSAodm9pZCl7IGhhbmRsZV92b2lkX2lycShpcnEpO30KKworc3RhdGljIHZvaWQgaGFuZGxlX3ZvaWRfaXJxKGludCBpcnEpCit7CisJc3RydWN0IGNvbWVkaV9pcnFfc3RydWN0ICppdDsKKworCWl0ID0gY29tZWRpX2lycXNbaXJxXTsKKwlpZiAoaXQgPT0gTlVMTCkgeworCQlydF9wcmludGsoImNvbWVkaTogbnVsbCBpcnEgc3RydWN0P1xuIik7CisJCXJldHVybjsKKwl9CisJaXQtPmhhbmRsZXIoaXJxLCBpdC0+ZGV2X2lkIFBUX1JFR1NfTlVMTCk7CisJcnRfZW5hYmxlX2lycShpcnEpOwkvL25lZWRlZCBieSBydGFpLWFkZW9zLCBzZWVtcyBsaWtlIGl0IHNob3VsZG4ndCBodXJ0IGVhcmxpZXIgdmVyc2lvbnMKK30KKworREVDTEFSRV9WT0lEX0lSUSgwKTsKK0RFQ0xBUkVfVk9JRF9JUlEoMSk7CitERUNMQVJFX1ZPSURfSVJRKDIpOworREVDTEFSRV9WT0lEX0lSUSgzKTsKK0RFQ0xBUkVfVk9JRF9JUlEoNCk7CitERUNMQVJFX1ZPSURfSVJRKDUpOworREVDTEFSRV9WT0lEX0lSUSg2KTsKK0RFQ0xBUkVfVk9JRF9JUlEoNyk7CitERUNMQVJFX1ZPSURfSVJRKDgpOworREVDTEFSRV9WT0lEX0lSUSg5KTsKK0RFQ0xBUkVfVk9JRF9JUlEoMTApOworREVDTEFSRV9WT0lEX0lSUSgxMSk7CitERUNMQVJFX1ZPSURfSVJRKDEyKTsKK0RFQ0xBUkVfVk9JRF9JUlEoMTMpOworREVDTEFSRV9WT0lEX0lSUSgxNCk7CitERUNMQVJFX1ZPSURfSVJRKDE1KTsKK0RFQ0xBUkVfVk9JRF9JUlEoMTYpOworREVDTEFSRV9WT0lEX0lSUSgxNyk7CitERUNMQVJFX1ZPSURfSVJRKDE4KTsKK0RFQ0xBUkVfVk9JRF9JUlEoMTkpOworREVDTEFSRV9WT0lEX0lSUSgyMCk7CitERUNMQVJFX1ZPSURfSVJRKDIxKTsKK0RFQ0xBUkVfVk9JRF9JUlEoMjIpOworREVDTEFSRV9WT0lEX0lSUSgyMyk7CisKK3R5cGVkZWYgdm9pZCAoKlZfRlBfVikgKHZvaWQpOworc3RhdGljIFZfRlBfViBoYW5kbGVfdm9pZF9pcnFfcHRyc1tdID0geworCWhhbmRsZV92b2lkX2lycV8wLAorCWhhbmRsZV92b2lkX2lycV8xLAorCWhhbmRsZV92b2lkX2lycV8yLAorCWhhbmRsZV92b2lkX2lycV8zLAorCWhhbmRsZV92b2lkX2lycV80LAorCWhhbmRsZV92b2lkX2lycV81LAorCWhhbmRsZV92b2lkX2lycV82LAorCWhhbmRsZV92b2lkX2lycV83LAorCWhhbmRsZV92b2lkX2lycV84LAorCWhhbmRsZV92b2lkX2lycV85LAorCWhhbmRsZV92b2lkX2lycV8xMCwKKwloYW5kbGVfdm9pZF9pcnFfMTEsCisJaGFuZGxlX3ZvaWRfaXJxXzEyLAorCWhhbmRsZV92b2lkX2lycV8xMywKKwloYW5kbGVfdm9pZF9pcnFfMTQsCisJaGFuZGxlX3ZvaWRfaXJxXzE1LAorCWhhbmRsZV92b2lkX2lycV8xNiwKKwloYW5kbGVfdm9pZF9pcnFfMTcsCisJaGFuZGxlX3ZvaWRfaXJxXzE4LAorCWhhbmRsZV92b2lkX2lycV8xOSwKKwloYW5kbGVfdm9pZF9pcnFfMjAsCisJaGFuZGxlX3ZvaWRfaXJxXzIxLAorCWhhbmRsZV92b2lkX2lycV8yMiwKKwloYW5kbGVfdm9pZF9pcnFfMjMsCit9OworCitzdGF0aWMgaW50IGNvbWVkaV9ydF9nZXRfaXJxKHN0cnVjdCBjb21lZGlfaXJxX3N0cnVjdCAqaXQpCit7CisJcnRfcmVxdWVzdF9nbG9iYWxfaXJxKGl0LT5pcnEsIGhhbmRsZV92b2lkX2lycV9wdHJzW2l0LT5pcnFdKTsKKwlydF9zdGFydHVwX2lycShpdC0+aXJxKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNvbWVkaV9ydF9yZWxlYXNlX2lycShzdHJ1Y3QgY29tZWRpX2lycV9zdHJ1Y3QgKml0KQoreworCXJ0X3NodXRkb3duX2lycShpdC0+aXJxKTsKKwlydF9mcmVlX2dsb2JhbF9pcnEoaXQtPmlycSk7CisJcmV0dXJuIDA7Cit9CisjZWxzZQorCitzdGF0aWMgaW50IGNvbWVkaV9ydF9nZXRfaXJxKHN0cnVjdCBjb21lZGlfaXJxX3N0cnVjdCAqaXQpCit7CisJaW50IHJldDsKKworCXJldCA9IHJ0X3JlcXVlc3RfZ2xvYmFsX2lycV9hcmcoaXQtPmlycSwgaXQtPmhhbmRsZXIsIGl0LT5mbGFncywKKwkJaXQtPmRldmljZSwgaXQtPmRldl9pZCk7CisJaWYgKHJldCA8IDApIHsKKwkJcnRfcHJpbnRrKCJydF9yZXF1ZXN0X2dsb2JhbF9pcnFfYXJnKCkgcmV0dXJuZWQgJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCXJ0X3N0YXJ0dXBfaXJxKGl0LT5pcnEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY29tZWRpX3J0X3JlbGVhc2VfaXJxKHN0cnVjdCBjb21lZGlfaXJxX3N0cnVjdCAqaXQpCit7CisJcnRfc2h1dGRvd25faXJxKGl0LT5pcnEpOworCXJ0X2ZyZWVfZ2xvYmFsX2lycShpdC0+aXJxKTsKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCit2b2lkIGNvbWVkaV9ydF9pbml0KHZvaWQpCit7CisJcnRfbW91bnRfcnRhaSgpOworCXJ0X3BlbmRfdHFfaW5pdCgpOworfQorCit2b2lkIGNvbWVkaV9ydF9jbGVhbnVwKHZvaWQpCit7CisJcnRfdW1vdW50X3J0YWkoKTsKKwlydF9wZW5kX3RxX2NsZWFudXAoKTsKK30KKworI2VuZGlmCisKKy8qIEZ1c2lvbiBzZWN0aW9uICovCisjaWZkZWYgQ09ORklHX0NPTUVESV9GVVNJT04KKworc3RhdGljIHZvaWQgZnVzaW9uX2hhbmRsZV9pcnEodW5zaWduZWQgaW50IGlycSwgdm9pZCAqY29va2llKQoreworCXN0cnVjdCBjb21lZGlfaXJxX3N0cnVjdCAqaXQgPSBjb29raWU7CisKKwlpdC0+aGFuZGxlcihpcnEsIGl0LT5kZXZfaWQgUFRfUkVHU19OVUxMKTsKKwlydGhhbF9pcnFfZW5hYmxlKGlycSk7Cit9CisKK3N0YXRpYyBpbnQgY29tZWRpX3J0X2dldF9pcnEoc3RydWN0IGNvbWVkaV9pcnFfc3RydWN0ICppdCkKK3sKKwlydGhhbF9pcnFfcmVxdWVzdChpdC0+aXJxLCBmdXNpb25faGFuZGxlX2lycSwgaXQpOworCXJ0aGFsX2lycV9lbmFibGUoaXQtPmlycSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY29tZWRpX3J0X3JlbGVhc2VfaXJxKHN0cnVjdCBjb21lZGlfaXJxX3N0cnVjdCAqaXQpCit7CisJcnRoYWxfaXJxX2Rpc2FibGUoaXQtPmlycSk7CisJcnRoYWxfaXJxX3JlbGVhc2UoaXQtPmlycSk7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgY29tZWRpX3J0X2luaXQodm9pZCkKK3sKKwlydF9wZW5kX3RxX2luaXQoKTsKK30KKwordm9pZCBjb21lZGlfcnRfY2xlYW51cCh2b2lkKQoreworCXJ0X3BlbmRfdHFfY2xlYW51cCgpOworfQorCisjZW5kaWYgLypDT05GSUdfQ09NRURJX0ZVU0lPTiAqLworCisvKiBSVExpbnV4IHNlY3Rpb24gKi8KKyNpZmRlZiBDT05GSUdfQ09NRURJX1JUTAorCitzdGF0aWMgdW5zaWduZWQgaW50IGhhbmRsZV9ydGxfaXJxKHVuc2lnbmVkIGludCBpcnEgUFRfUkVHU19BUkcpCit7CisJc3RydWN0IGNvbWVkaV9pcnFfc3RydWN0ICppdDsKKworCWl0ID0gY29tZWRpX2lycXNbaXJxXTsKKwlpZiAoaXQgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisJaXQtPmhhbmRsZXIoaXJxLCBpdC0+ZGV2X2lkIFBUX1JFR1NfTlVMTCk7CisJcnRsX2hhcmRfZW5hYmxlX2lycShpcnEpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNvbWVkaV9ydF9nZXRfaXJxKHN0cnVjdCBjb21lZGlfaXJxX3N0cnVjdCAqaXQpCit7CisJcnRsX3JlcXVlc3RfZ2xvYmFsX2lycShpdC0+aXJxLCBoYW5kbGVfcnRsX2lycSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY29tZWRpX3J0X3JlbGVhc2VfaXJxKHN0cnVjdCBjb21lZGlfaXJxX3N0cnVjdCAqaXQpCit7CisJcnRsX2ZyZWVfZ2xvYmFsX2lycShpdC0+aXJxKTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBjb21lZGlfcnRfaW5pdCh2b2lkKQoreworCXJ0X3BlbmRfdHFfaW5pdCgpOworfQorCit2b2lkIGNvbWVkaV9ydF9jbGVhbnVwKHZvaWQpCit7CisJcnRfcGVuZF90cV9jbGVhbnVwKCk7Cit9CisKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0NPTUVESV9QSVJRCitzdGF0aWMgaW50IGNvbWVkaV9ydF9nZXRfaXJxKHN0cnVjdCBjb21lZGlfaXJxX3N0cnVjdCAqaXQpCit7CisJaW50IHJldDsKKworCWZyZWVfaXJxKGl0LT5pcnEsIGl0LT5kZXZfaWQpOworCXJldCA9IHJlcXVlc3RfaXJxKGl0LT5pcnEsIGl0LT5oYW5kbGVyLCBpdC0+ZmxhZ3MgfCBTQV9QUklPUklUWSwKKwkJaXQtPmRldmljZSwgaXQtPmRldl9pZCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGNvbWVkaV9ydF9yZWxlYXNlX2lycShzdHJ1Y3QgY29tZWRpX2lycV9zdHJ1Y3QgKml0KQoreworCWludCByZXQ7CisKKwlmcmVlX2lycShpdC0+aXJxLCBpdC0+ZGV2X2lkKTsKKwlyZXQgPSByZXF1ZXN0X2lycShpdC0+aXJxLCBpdC0+aGFuZGxlciwgaXQtPmZsYWdzLAorCQlpdC0+ZGV2aWNlLCBpdC0+ZGV2X2lkKTsKKworCXJldHVybiByZXQ7Cit9CisKK3ZvaWQgY29tZWRpX3J0X2luaXQodm9pZCkKK3sKKwkvL3J0X3BlbmRfdHFfaW5pdCgpOworfQorCit2b2lkIGNvbWVkaV9ydF9jbGVhbnVwKHZvaWQpCit7CisJLy9ydF9wZW5kX3RxX2NsZWFudXAoKTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9ydF9wZW5kX3RxLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL3J0X3BlbmRfdHEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTVmMDc2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9ydF9wZW5kX3RxLmMKQEAgLTAsMCArMSwxMTMgQEAKKyNkZWZpbmUgX19OT19WRVJTSU9OX18KKy8qIHJ0X3BlbmRfdHEuYyAqLworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlICJjb21lZGlkZXYuaCIJLy8gZm9yIHJ0IHNwaW5sb2NrcworI2luY2x1ZGUgInJ0X3BlbmRfdHEuaCIKKyNpZmRlZiBDT05GSUdfQ09NRURJX1JUQUkKKyNpbmNsdWRlIDxydGFpLmg+CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQ09NRURJX0ZVU0lPTgorI2luY2x1ZGUgPG51Y2xldXMvYXNtL2hhbC5oPgorI2VuZGlmCisjaWZkZWYgQ09ORklHX0NPTUVESV9SVEwKKyNpbmNsdWRlIDxydGxfY29yZS5oPgorI2VuZGlmCisKKyNpZmRlZiBzdGFuZGFsb25lCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjZGVmaW5lIHJ0X3BlbmRfdHFfaW5pdCBpbml0X21vZHVsZQorI2RlZmluZSBydF9wZW5kX3RxX2NsZWFudXAgY2xlYW51cF9tb2R1bGUKKyNlbmRpZgorCit2b2xhdGlsZSBzdGF0aWMgc3RydWN0IHJ0X3BlbmRfdHEgcnRfcGVuZF90cVtSVF9QRU5EX1RRX1NJWkVdOwordm9sYXRpbGUgc3RhdGljIHN0cnVjdCBydF9wZW5kX3RxICp2b2xhdGlsZSBydF9wZW5kX2hlYWQgPSBydF9wZW5kX3RxLAorCSp2b2xhdGlsZSBydF9wZW5kX3RhaWwgPSBydF9wZW5kX3RxOworaW50IHJ0X3BlbmRfdHFfaXJxID0gMDsKK3NwaW5sb2NrX3QgcnRfcGVuZF90cV9sb2NrID0gU1BJTl9MT0NLX1VOTE9DS0VEOworCisvLyBXQVJOSU5HOiBmb2xsb3dpbmcgY29kZSBub3QgY2hlY2tlZCBhZ2FpbnN0IHJhY2UgY29uZGl0aW9ucyB5ZXQuCisjZGVmaW5lIElOQ19DSVJDVUxBUl9QVFIocHRyLGJlZ2luLHNpemUpIGRvIHtpZigrKyhwdHIpPj0oYmVnaW4pKyhzaXplKSkgKHB0cik9KGJlZ2luKTsgfSB3aGlsZSgwKQorI2RlZmluZSBERUNfQ0lSQ1VMQVJfUFRSKHB0cixiZWdpbixzaXplKSBkbyB7aWYoLS0ocHRyKTwoYmVnaW4pKSAocHRyKT0oYmVnaW4pKyhzaXplKS0xOyB9IHdoaWxlKDApCisKK2ludCBydF9wZW5kX2NhbGwodm9pZCAoKmZ1bmMpIChpbnQgYXJnMSwgdm9pZCAqYXJnMiksIGludCBhcmcxLCB2b2lkICphcmcyKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoZnVuYyA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAocnRfcGVuZF90cV9pcnEgPD0gMCkKKwkJcmV0dXJuIC1FTk9ERVY7CisJY29tZWRpX3NwaW5fbG9ja19pcnFzYXZlKCZydF9wZW5kX3RxX2xvY2ssIGZsYWdzKTsKKwlJTkNfQ0lSQ1VMQVJfUFRSKHJ0X3BlbmRfaGVhZCwgcnRfcGVuZF90cSwgUlRfUEVORF9UUV9TSVpFKTsKKwlpZiAocnRfcGVuZF9oZWFkID09IHJ0X3BlbmRfdGFpbCkgeworCQkvLyBvdmVyZmxvdywgd2UganVzdCByZWZ1c2UgdG8gdGFrZSB0aGlzIHJlcXVlc3QKKwkJREVDX0NJUkNVTEFSX1BUUihydF9wZW5kX2hlYWQsIHJ0X3BlbmRfdHEsIFJUX1BFTkRfVFFfU0laRSk7CisJCWNvbWVkaV9zcGluX3VubG9ja19pcnFyZXN0b3JlKCZydF9wZW5kX3RxX2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIC1FQUdBSU47CisJfQorCXJ0X3BlbmRfaGVhZC0+ZnVuYyA9IGZ1bmM7CisJcnRfcGVuZF9oZWFkLT5hcmcxID0gYXJnMTsKKwlydF9wZW5kX2hlYWQtPmFyZzIgPSBhcmcyOworCWNvbWVkaV9zcGluX3VubG9ja19pcnFyZXN0b3JlKCZydF9wZW5kX3RxX2xvY2ssIGZsYWdzKTsKKyNpZmRlZiBDT05GSUdfQ09NRURJX1JUQUkKKwlydF9wZW5kX2xpbnV4X3NycShydF9wZW5kX3RxX2lycSk7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQ09NRURJX0ZVU0lPTgorCXJ0aGFsX2FwY19zY2hlZHVsZShydF9wZW5kX3RxX2lycSk7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQ09NRURJX1JUTAorCXJ0bF9nbG9iYWxfcGVuZF9pcnEocnRfcGVuZF90cV9pcnEpOworCisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIENPTkZJR19DT01FRElfUlRBSQordm9pZCBydF9wZW5kX2lycV9oYW5kbGVyKHZvaWQpCisjZWxpZiBkZWZpbmVkKENPTkZJR19DT01FRElfRlVTSU9OKQordm9pZCBydF9wZW5kX2lycV9oYW5kbGVyKHZvaWQgKmNvb2tpZSkKKyNlbGlmIGRlZmluZWQoQ09ORklHX0NPTUVESV9SVEwpCit2b2lkIHJ0X3BlbmRfaXJxX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGV2IFBUX1JFR1NfQVJHKQorI2VuZGlmCit7CisJd2hpbGUgKHJ0X3BlbmRfaGVhZCAhPSBydF9wZW5kX3RhaWwpIHsKKwkJSU5DX0NJUkNVTEFSX1BUUihydF9wZW5kX3RhaWwsIHJ0X3BlbmRfdHEsIFJUX1BFTkRfVFFfU0laRSk7CisJCXJ0X3BlbmRfdGFpbC0+ZnVuYyhydF9wZW5kX3RhaWwtPmFyZzEsIHJ0X3BlbmRfdGFpbC0+YXJnMik7CisJfQorfQorCitpbnQgcnRfcGVuZF90cV9pbml0KHZvaWQpCit7CisJcnRfcGVuZF9oZWFkID0gcnRfcGVuZF90YWlsID0gcnRfcGVuZF90cTsKKyNpZmRlZiBDT05GSUdfQ09NRURJX1JUQUkKKwlydF9wZW5kX3RxX2lycSA9IHJ0X3JlcXVlc3Rfc3JxKDAsIHJ0X3BlbmRfaXJxX2hhbmRsZXIsIE5VTEwpOworI2VuZGlmCisjaWZkZWYgQ09ORklHX0NPTUVESV9GVVNJT04KKwlydF9wZW5kX3RxX2lycSA9CisJCXJ0aGFsX2FwY19hbGxvYygiY29tZWRpIEFQQyIsIHJ0X3BlbmRfaXJxX2hhbmRsZXIsIE5VTEwpOworI2VuZGlmCisjaWZkZWYgQ09ORklHX0NPTUVESV9SVEwKKwlydF9wZW5kX3RxX2lycSA9IHJ0bF9nZXRfc29mdF9pcnEocnRfcGVuZF9pcnFfaGFuZGxlciwgInJ0X3BlbmRfaXJxIik7CisjZW5kaWYKKwlpZiAocnRfcGVuZF90cV9pcnEgPiAwKQorCQlwcmludGsoInJ0X3BlbmRfdHE6IFJUIGJvdHRvbSBoYWxmIHNjaGVkdWxlciBpbml0aWFsaXplZCBPS1xuIik7CisJZWxzZQorCQlwcmludGsoInJ0X3BlbmRfdHE6IHJ0bF9nZXRfc29mdF9pcnEgZmFpbGVkXG4iKTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBydF9wZW5kX3RxX2NsZWFudXAodm9pZCkKK3sKKwlwcmludGsoInJ0X3BlbmRfdHE6IHVubG9hZGluZ1xuIik7CisjaWZkZWYgQ09ORklHX0NPTUVESV9SVEFJCisJcnRfZnJlZV9zcnEocnRfcGVuZF90cV9pcnEpOworI2VuZGlmCisjaWZkZWYgQ09ORklHX0NPTUVESV9GVVNJT04KKwlydGhhbF9hcGNfZnJlZShydF9wZW5kX3RxX2lycSk7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQ09NRURJX1JUTAorCWZyZWVfaXJxKHJ0X3BlbmRfdHFfaXJxLCBOVUxMKTsKKyNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9ydF9wZW5kX3RxLmggYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL3J0X3BlbmRfdHEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMWVkNzFiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9ydF9wZW5kX3RxLmgKQEAgLTAsMCArMSwxMCBAQAorI2RlZmluZSBSVF9QRU5EX1RRX1NJWkUgMTYKK3N0cnVjdCBydF9wZW5kX3RxIHsKKwl2b2lkICgqZnVuYykgKGludCBhcmcxLCB2b2lkICphcmcyKTsKKwlpbnQgYXJnMTsKKwl2b2lkICphcmcyOworfTsKK2V4dGVybiBpbnQgcnRfcGVuZF9jYWxsKHZvaWQgKCpmdW5jKSAoaW50IGFyZzEsIHZvaWQgKmFyZzIpLCBpbnQgYXJnMSwKKwl2b2lkICphcmcyKTsKK2V4dGVybiBpbnQgcnRfcGVuZF90cV9pbml0KHZvaWQpOworZXh0ZXJuIHZvaWQgcnRfcGVuZF90cV9jbGVhbnVwKHZvaWQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS93cmFwcGVyLmggYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL3dyYXBwZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43N2ZjNjczCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS93cmFwcGVyLmgKQEAgLTAsMCArMSwyNSBAQAorLyoKKyAgICBsaW51eC93cmFwcGVyLmggY29tcGF0aWJpbGl0eSBoZWFkZXIKKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX19DT01QQVRfTElOVVhfV1JBUFBFUl9IXworI2RlZmluZSBfX0NPTVBBVF9MSU5VWF9XUkFQUEVSX0hfCisKKyNkZWZpbmUgbWVtX21hcF9yZXNlcnZlKHApICAgICAgc2V0X2JpdChQR19yZXNlcnZlZCwgJigocCktPmZsYWdzKSkKKyNkZWZpbmUgbWVtX21hcF91bnJlc2VydmUocCkgICAgY2xlYXJfYml0KFBHX3Jlc2VydmVkLCAmKChwKS0+ZmxhZ3MpKQorCisjZW5kaWYgLyogX19DT01QQVRfTElOVVhfV1JBUFBFUl9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VjaG8vVE9ETyBiL2RyaXZlcnMvc3RhZ2luZy9lY2hvL1RPRE8KaW5kZXggMWNhMDlhZi4uZjZkODU4MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2VjaG8vVE9ETworKysgYi9kcml2ZXJzL3N0YWdpbmcvZWNoby9UT0RPCkBAIC0xLDcgKzEsNSBAQAogVE9ETzoKIAktIGNoZWNrcGF0Y2gucGwgY2xlYW51cHMKLQktIExpbmRlbnQKLQktIHR5cGVkZWYgcmVtb3ZhbHMKIAktIGhhbmRsZSBiaXRfb3BlcmF0aW9ucy5oIChtZXJnZSBpbiBvciBtYWtlIHBhcnQgb2YgY29tbW9uIGNvZGU/KQogCS0gcmVtb3ZlIHByb2MgaW50ZXJmYWNlLCBvbmx5IHVzZSBlY2hvLmggaW50ZXJmYWNlIChwcm9jIGludGVyZmFjZSBpcwogCSAgcmFjeSBhbmQgbm90IGNvcnJlY3QuKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VjaG8vZWNoby5oIGIvZHJpdmVycy9zdGFnaW5nL2VjaG8vZWNoby5oCmluZGV4IDlmYjk1NDMuLjM0ZmI4MTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9lY2hvL2VjaG8uaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZWNoby9lY2hvLmgKQEAgLTE0OSw4ICsxNDksOCBAQAogCWludCBMYmduLCBMYmduX2FjYywgTGJnbl91cHBlciwgTGJnbl91cHBlcl9hY2M7CiAKIAkvKiBmb3JlZ3JvdW5kIGFuZCBiYWNrZ3JvdW5kIGZpbHRlciBzdGF0ZXMgKi8KLQlmaXIxNl9zdGF0ZV90IGZpcl9zdGF0ZTsKLQlmaXIxNl9zdGF0ZV90IGZpcl9zdGF0ZV9iZzsKKwlzdHJ1Y3QgZmlyMTZfc3RhdGVfdCBmaXJfc3RhdGU7CisJc3RydWN0IGZpcjE2X3N0YXRlX3QgZmlyX3N0YXRlX2JnOwogCWludDE2X3QgKmZpcl90YXBzMTZbMl07CiAKIAkvKiBEQyBibG9ja2luZyBmaWx0ZXIgc3RhdGVzICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZWNoby9maXIuaCBiL2RyaXZlcnMvc3RhZ2luZy9lY2hvL2Zpci5oCmluZGV4IDU2NDVjYjEuLmQzNWYxNjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9lY2hvL2Zpci5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lY2hvL2Zpci5oCkBAIC03MiwzNyArNzIsMzcgQEAKICAgICAxNiBiaXQgaW50ZWdlciBGSVIgZGVzY3JpcHRvci4gVGhpcyBkZWZpbmVzIHRoZSB3b3JraW5nIHN0YXRlIGZvciBhIHNpbmdsZQogICAgIGluc3RhbmNlIG9mIGFuIEZJUiBmaWx0ZXIgdXNpbmcgMTYgYml0IGludGVnZXIgY29lZmZpY2llbnRzLgogKi8KLXR5cGVkZWYgc3RydWN0IHsKK3N0cnVjdCBmaXIxNl9zdGF0ZV90IHsKIAlpbnQgdGFwczsKIAlpbnQgY3Vycl9wb3M7CiAJY29uc3QgaW50MTZfdCAqY29lZmZzOwogCWludDE2X3QgKmhpc3Rvcnk7Ci19IGZpcjE2X3N0YXRlX3Q7Cit9OwogCiAvKiEKICAgICAzMiBiaXQgaW50ZWdlciBGSVIgZGVzY3JpcHRvci4gVGhpcyBkZWZpbmVzIHRoZSB3b3JraW5nIHN0YXRlIGZvciBhIHNpbmdsZQogICAgIGluc3RhbmNlIG9mIGFuIEZJUiBmaWx0ZXIgdXNpbmcgMzIgYml0IGludGVnZXIgY29lZmZpY2llbnRzLCBhbmQgZmlsdGVyaW5nCiAgICAgMTYgYml0IGludGVnZXIgZGF0YS4KICovCi10eXBlZGVmIHN0cnVjdCB7CitzdHJ1Y3QgZmlyMzJfc3RhdGVfdCB7CiAJaW50IHRhcHM7CiAJaW50IGN1cnJfcG9zOwogCWNvbnN0IGludDMyX3QgKmNvZWZmczsKIAlpbnQxNl90ICpoaXN0b3J5OwotfSBmaXIzMl9zdGF0ZV90OworfTsKIAogLyohCiAgICAgRmxvYXRpbmcgcG9pbnQgRklSIGRlc2NyaXB0b3IuIFRoaXMgZGVmaW5lcyB0aGUgd29ya2luZyBzdGF0ZSBmb3IgYSBzaW5nbGUKICAgICBpbnN0YW5jZSBvZiBhbiBGSVIgZmlsdGVyIHVzaW5nIGZsb2F0aW5nIHBvaW50IGNvZWZmaWNpZW50cyBhbmQgZGF0YS4KICovCi10eXBlZGVmIHN0cnVjdCB7CitzdHJ1Y3QgZmlyX2Zsb2F0X3N0YXRlX3QgewogCWludCB0YXBzOwogCWludCBjdXJyX3BvczsKIAljb25zdCBmbG9hdCAqY29lZmZzOwogCWZsb2F0ICpoaXN0b3J5OwotfSBmaXJfZmxvYXRfc3RhdGVfdDsKK307CiAKLXN0YXRpYyBfX2lubGluZV9fIGNvbnN0IGludDE2X3QgKmZpcjE2X2NyZWF0ZShmaXIxNl9zdGF0ZV90ICogZmlyLAorc3RhdGljIF9faW5saW5lX18gY29uc3QgaW50MTZfdCAqZmlyMTZfY3JlYXRlKHN0cnVjdCBmaXIxNl9zdGF0ZV90ICpmaXIsCiAJCQkJCSAgICAgIGNvbnN0IGludDE2X3QgKiBjb2VmZnMsIGludCB0YXBzKQogewogCWZpci0+dGFwcyA9IHRhcHM7CkBAIC0xMTYsNyArMTE2LDcgQEAKIAlyZXR1cm4gZmlyLT5oaXN0b3J5OwogfQogCi1zdGF0aWMgX19pbmxpbmVfXyB2b2lkIGZpcjE2X2ZsdXNoKGZpcjE2X3N0YXRlX3QgKiBmaXIpCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIGZpcjE2X2ZsdXNoKHN0cnVjdCBmaXIxNl9zdGF0ZV90ICpmaXIpCiB7CiAjaWYgZGVmaW5lZChVU0VfTU1YKSAgfHwgIGRlZmluZWQoVVNFX1NTRTIpIHx8IGRlZmluZWQoX19iZmluX18pCiAJbWVtc2V0KGZpci0+aGlzdG9yeSwgMCwgMiAqIGZpci0+dGFwcyAqIHNpemVvZihpbnQxNl90KSk7CkBAIC0xMjUsNyArMTI1LDcgQEAKICNlbmRpZgogfQogCi1zdGF0aWMgX19pbmxpbmVfXyB2b2lkIGZpcjE2X2ZyZWUoZmlyMTZfc3RhdGVfdCAqIGZpcikKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgZmlyMTZfZnJlZShzdHJ1Y3QgZmlyMTZfc3RhdGVfdCAqZmlyKQogewogCWtmcmVlKGZpci0+aGlzdG9yeSk7CiB9CkBAIC0xNTcsMTkgKzE1NywxOSBAQAogfQogI2VuZGlmCiAKLXN0YXRpYyBfX2lubGluZV9fIGludDE2X3QgZmlyMTYoZmlyMTZfc3RhdGVfdCAqIGZpciwgaW50MTZfdCBzYW1wbGUpCitzdGF0aWMgX19pbmxpbmVfXyBpbnQxNl90IGZpcjE2KHN0cnVjdCBmaXIxNl9zdGF0ZV90ICpmaXIsIGludDE2X3Qgc2FtcGxlKQogewogCWludDMyX3QgeTsKICNpZiBkZWZpbmVkKFVTRV9NTVgpCiAJaW50IGk7Ci0JbW14X3QgKm1teF9jb2VmZnM7Ci0JbW14X3QgKm1teF9oaXN0OworCXVuaW9uIG1teF90ICptbXhfY29lZmZzOworCXVuaW9uIG1teF90ICptbXhfaGlzdDsKIAogCWZpci0+aGlzdG9yeVtmaXItPmN1cnJfcG9zXSA9IHNhbXBsZTsKIAlmaXItPmhpc3RvcnlbZmlyLT5jdXJyX3BvcyArIGZpci0+dGFwc10gPSBzYW1wbGU7CiAKLQltbXhfY29lZmZzID0gKG1teF90ICopIGZpci0+Y29lZmZzOwotCW1teF9oaXN0ID0gKG1teF90ICopICYgZmlyLT5oaXN0b3J5W2Zpci0+Y3Vycl9wb3NdOworCW1teF9jb2VmZnMgPSAodW5pb24gbW14X3QgKilmaXItPmNvZWZmczsKKwltbXhfaGlzdCA9ICh1bmlvbiBtbXhfdCAqKSZmaXItPmhpc3RvcnlbZmlyLT5jdXJyX3Bvc107CiAJaSA9IGZpci0+dGFwczsKIAlweG9yX3IycihtbTQsIG1tNCk7CiAJLyogOCBzYW1wbGVzIHBlciBpdGVyYXRpb24sIHNvIHRoZSBmaWx0ZXIgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDggbG9uZy4gKi8KQEAgLTE5MywxNCArMTkzLDE0IEBACiAJZW1tcygpOwogI2VsaWYgZGVmaW5lZChVU0VfU1NFMikKIAlpbnQgaTsKLQl4bW1fdCAqeG1tX2NvZWZmczsKLQl4bW1fdCAqeG1tX2hpc3Q7CisJdW5pb24geG1tX3QgKnhtbV9jb2VmZnM7CisJdW5pb24geG1tX3QgKnhtbV9oaXN0OwogCiAJZmlyLT5oaXN0b3J5W2Zpci0+Y3Vycl9wb3NdID0gc2FtcGxlOwogCWZpci0+aGlzdG9yeVtmaXItPmN1cnJfcG9zICsgZmlyLT50YXBzXSA9IHNhbXBsZTsKIAotCXhtbV9jb2VmZnMgPSAoeG1tX3QgKikgZmlyLT5jb2VmZnM7Ci0JeG1tX2hpc3QgPSAoeG1tX3QgKikgJiBmaXItPmhpc3RvcnlbZmlyLT5jdXJyX3Bvc107CisJeG1tX2NvZWZmcyA9ICh1bmlvbiB4bW1fdCAqKWZpci0+Y29lZmZzOworCXhtbV9oaXN0ID0gKHVuaW9uIHhtbV90ICopJmZpci0+aGlzdG9yeVtmaXItPmN1cnJfcG9zXTsKIAlpID0gZmlyLT50YXBzOwogCXB4b3JfcjJyKHhtbTQsIHhtbTQpOwogCS8qIDE2IHNhbXBsZXMgcGVyIGl0ZXJhdGlvbiwgc28gdGhlIGZpbHRlciBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYgbG9uZy4gKi8KQEAgLTI1MCw3ICsyNTAsNyBAQAogCXJldHVybiAoaW50MTZfdCkgKHkgPj4gMTUpOwogfQogCi1zdGF0aWMgX19pbmxpbmVfXyBjb25zdCBpbnQxNl90ICpmaXIzMl9jcmVhdGUoZmlyMzJfc3RhdGVfdCAqIGZpciwKK3N0YXRpYyBfX2lubGluZV9fIGNvbnN0IGludDE2X3QgKmZpcjMyX2NyZWF0ZShzdHJ1Y3QgZmlyMzJfc3RhdGVfdCAqZmlyLAogCQkJCQkgICAgICBjb25zdCBpbnQzMl90ICogY29lZmZzLCBpbnQgdGFwcykKIHsKIAlmaXItPnRhcHMgPSB0YXBzOwpAQCAtMjYwLDE3ICsyNjAsMTcgQEAKIAlyZXR1cm4gZmlyLT5oaXN0b3J5OwogfQogCi1zdGF0aWMgX19pbmxpbmVfXyB2b2lkIGZpcjMyX2ZsdXNoKGZpcjMyX3N0YXRlX3QgKiBmaXIpCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIGZpcjMyX2ZsdXNoKHN0cnVjdCBmaXIzMl9zdGF0ZV90ICpmaXIpCiB7CiAJbWVtc2V0KGZpci0+aGlzdG9yeSwgMCwgZmlyLT50YXBzICogc2l6ZW9mKGludDE2X3QpKTsKIH0KIAotc3RhdGljIF9faW5saW5lX18gdm9pZCBmaXIzMl9mcmVlKGZpcjMyX3N0YXRlX3QgKiBmaXIpCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIGZpcjMyX2ZyZWUoc3RydWN0IGZpcjMyX3N0YXRlX3QgKmZpcikKIHsKIAlrZnJlZShmaXItPmhpc3RvcnkpOwogfQogCi1zdGF0aWMgX19pbmxpbmVfXyBpbnQxNl90IGZpcjMyKGZpcjMyX3N0YXRlX3QgKiBmaXIsIGludDE2X3Qgc2FtcGxlKQorc3RhdGljIF9faW5saW5lX18gaW50MTZfdCBmaXIzMihzdHJ1Y3QgZmlyMzJfc3RhdGVfdCAqZmlyLCBpbnQxNl90IHNhbXBsZSkKIHsKIAlpbnQgaTsKIAlpbnQzMl90IHk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZWNoby9tbXguaCBiL2RyaXZlcnMvc3RhZ2luZy9lY2hvL21teC5oCmluZGV4IDM1NDEyZWYuLjQ0ZTVjZmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9lY2hvL21teC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lY2hvL21teC5oCkBAIC0yNyw3ICsyNyw3IEBACiAgKiB2YWx1ZXMgYnkgVUxMLCBsZXN0IHRoZXkgYmUgdHJ1bmNhdGVkIGJ5IHRoZSBjb21waWxlcikKICAqLwogCi10eXBlZGVmIHVuaW9uIHsKK3VuaW9uIG1teF90IHsKIAlsb25nIGxvbmcgcTsJCS8qIFF1YWR3b3JkICg2NC1iaXQpIHZhbHVlICovCiAJdW5zaWduZWQgbG9uZyBsb25nIHVxOwkvKiBVbnNpZ25lZCBRdWFkd29yZCAqLwogCWludCBkWzJdOwkJLyogMiBEb3VibGV3b3JkICgzMi1iaXQpIHZhbHVlcyAqLwpAQCAtMzcsMTIgKzM3LDEyIEBACiAJY2hhciBiWzhdOwkJLyogOCBCeXRlICg4LWJpdCkgdmFsdWVzICovCiAJdW5zaWduZWQgY2hhciB1Yls4XTsJLyogOCBVbnNpZ25lZCBCeXRlICovCiAJZmxvYXQgc1syXTsJCS8qIFNpbmdsZS1wcmVjaXNpb24gKDMyLWJpdCkgdmFsdWUgKi8KLX0gbW14X3Q7CQkJLyogT24gYW4gOC1ieXRlICg2NC1iaXQpIGJvdW5kYXJ5ICovCit9OwkJCQkvKiBPbiBhbiA4LWJ5dGUgKDY0LWJpdCkgYm91bmRhcnkgKi8KIAogLyogU1NFIHJlZ2lzdGVycyAqLwotdHlwZWRlZiB1bmlvbiB7Cit1bmlvbiB4bW1fdCB7CiAJY2hhciBiWzE2XTsKLX0geG1tX3Q7Cit9OwogCiAjZGVmaW5lICAgICAgICAgbW14X2kycihvcCxpbW0scmVnKSBcCiAgICAgICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgjb3AgIiAlMCwgJSUiICNyZWcgXApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9CZW5jaG1hcmsuaCBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvQmVuY2htYXJrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjJkZWUzYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvQmVuY2htYXJrLmgKQEAgLTAsMCArMSw0MzcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBoZWFkZXIgZmlsZSBmb3IgYmVuY2htYXJraW5nCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogQmVuY2htYXJrLmgsdiAkCisKKyAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAorCisgICAgICAgICAgICAgICAgJFJldmlzaW9uOiAxLjUgJCAgJERhdGU6IDIwMDgvMDQvMTcgMjE6MzY6MzIgJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgICAgIC4uLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgIDIwMDYvMDgvMTYgZC5rLjogIHN0YXJ0IG9mIGltcGxlbWVudGF0aW9uCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX0JFTkNITUFSS19IXworI2RlZmluZSBfQkVOQ0hNQVJLX0hfCisKKyNpbmNsdWRlICJnbG9iYWwuaCIKKworI2lmIChUQVJHRVRfU1lTVEVNID09IF9OT19PU18pICYmIChERVZfU1lTVEVNID09IF9ERVZfR05VX0NGNTQ4WF8pCisjaW5jbHVkZSAiY29tbW9uLmgiCisKKyNlbGlmIChUQVJHRVRfU1lTVEVNID09IF9MSU5VWF8pICYmIGRlZmluZWQoX19LRVJORUxfXykKKworLy8gICAgI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorCisjaWZkZWYgQ09ORklHX0NPTERGSVJFCisjaW5jbHVkZSA8YXNtL2NvbGRmaXJlLmg+CisjaW5jbHVkZSA8YXNtL201NDg1Z3Bpby5oPgorCisjZGVmaW5lIEJFTkNITUFSS19TRVQoeCkgICAgTUNGX0dQSU9fUE9EUl9QQ0lCRyB8PSAoMSA8PCAoeCkpCS8vICh4KzEpCisjZGVmaW5lIEJFTkNITUFSS19SRVNFVCh4KSAgTUNGX0dQSU9fUE9EUl9QQ0lCRyAmPSB+KDEgPDwgKHgpKQkvLyAoeCsxKQorI2RlZmluZSBCRU5DSE1BUktfVE9HR0xFKHgpIE1DRl9HUElPX1BPRFJfUENJQlIgXj0gKDEgPDwgKHggLSA1KSkKKyNlbHNlCisjdW5kZWYgQkVOQ0hNQVJLX01PRFVMRVMKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRFVMRVMgICAgICAgICAgIDB4MDAwMDAwMDAKKyNlbmRpZgorCisjZWxzZQorICAgIC8vIGRpc2FibGUgQmVuY2htYXJraW5nCisjdW5kZWYgQkVOQ0hNQVJLX01PRFVMRVMKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRFVMRVMgICAgICAgICAgICAgICAweDAwMDAwMDAwCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgRyBMIE8gQiBBIEwgICBEIEUgRiBJIE4gSSBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvbnN0IGRlZmluZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZm5kZWYgQkVOQ0hNQVJLX01PRFVMRVMKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRFVMRVMgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2VuZGlmCisKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8wMSAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzAyICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMDMgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8wNCAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOAorI2RlZmluZSBCRU5DSE1BUktfTU9EXzA1ICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDEwCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMDYgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMjAKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8wNyAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA0MAorI2RlZmluZSBCRU5DSE1BUktfTU9EXzA4ICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDgwCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMDkgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMDAKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8xMCAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIwMAorI2RlZmluZSBCRU5DSE1BUktfTU9EXzExICAgICAgICAgICAgICAgICAgICAweDAwMDAwNDAwCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMTIgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA4MDAKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8xMyAgICAgICAgICAgICAgICAgICAgMHgwMDAwMTAwMAorI2RlZmluZSBCRU5DSE1BUktfTU9EXzE0ICAgICAgICAgICAgICAgICAgICAweDAwMDAyMDAwCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMTUgICAgICAgICAgICAgICAgICAgIDB4MDAwMDQwMDAKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8xNiAgICAgICAgICAgICAgICAgICAgMHgwMDAwODAwMAorI2RlZmluZSBCRU5DSE1BUktfTU9EXzE3ICAgICAgICAgICAgICAgICAgICAweDAwMDEwMDAwCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMTggICAgICAgICAgICAgICAgICAgIDB4MDAwMjAwMDAKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8xOSAgICAgICAgICAgICAgICAgICAgMHgwMDA0MDAwMAorI2RlZmluZSBCRU5DSE1BUktfTU9EXzIwICAgICAgICAgICAgICAgICAgICAweDAwMDgwMDAwCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMjEgICAgICAgICAgICAgICAgICAgIDB4MDAxMDAwMDAKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8yMiAgICAgICAgICAgICAgICAgICAgMHgwMDIwMDAwMAorI2RlZmluZSBCRU5DSE1BUktfTU9EXzIzICAgICAgICAgICAgICAgICAgICAweDAwNDAwMDAwCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMjQgICAgICAgICAgICAgICAgICAgIDB4MDA4MDAwMDAKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8yNSAgICAgICAgICAgICAgICAgICAgMHgwMTAwMDAwMAorI2RlZmluZSBCRU5DSE1BUktfTU9EXzI2ICAgICAgICAgICAgICAgICAgICAweDAyMDAwMDAwCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMjcgICAgICAgICAgICAgICAgICAgIDB4MDQwMDAwMDAKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8yOCAgICAgICAgICAgICAgICAgICAgMHgwODAwMDAwMAorI2RlZmluZSBCRU5DSE1BUktfTU9EXzI5ICAgICAgICAgICAgICAgICAgICAweDEwMDAwMDAwCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMzAgICAgICAgICAgICAgICAgICAgIDB4MjAwMDAwMDAKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8zMSAgICAgICAgICAgICAgICAgICAgMHg0MDAwMDAwMAorI2RlZmluZSBCRU5DSE1BUktfTU9EXzMyICAgICAgICAgICAgICAgICAgICAweDgwMDAwMDAwCisKKyNpZiAoQkVOQ0hNQVJLX01PRFVMRVMgJiBCRU5DSE1BUktfTU9EXzAxKQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzAxX1NFVCh4KSAgICAgICAgIEJFTkNITUFSS19TRVQoeCkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8wMV9SRVNFVCh4KSAgICAgICBCRU5DSE1BUktfUkVTRVQoeCkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8wMV9UT0dHTEUoeCkgICAgICBCRU5DSE1BUktfVE9HR0xFKHgpCisjZWxzZQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzAxX1NFVCh4KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzAxX1JFU0VUKHgpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMDFfVE9HR0xFKHgpCisjZW5kaWYKKworI2lmIChCRU5DSE1BUktfTU9EVUxFUyAmIEJFTkNITUFSS19NT0RfMDIpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMDJfU0VUKHgpICAgICAgICAgQkVOQ0hNQVJLX1NFVCh4KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzAyX1JFU0VUKHgpICAgICAgIEJFTkNITUFSS19SRVNFVCh4KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzAyX1RPR0dMRSh4KSAgICAgIEJFTkNITUFSS19UT0dHTEUoeCkKKyNlbHNlCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMDJfU0VUKHgpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMDJfUkVTRVQoeCkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8wMl9UT0dHTEUoeCkKKyNlbmRpZgorCisjaWYgKEJFTkNITUFSS19NT0RVTEVTICYgQkVOQ0hNQVJLX01PRF8wMykKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8wM19TRVQoeCkgICAgICAgICBCRU5DSE1BUktfU0VUKHgpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMDNfUkVTRVQoeCkgICAgICAgQkVOQ0hNQVJLX1JFU0VUKHgpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMDNfVE9HR0xFKHgpICAgICAgQkVOQ0hNQVJLX1RPR0dMRSh4KQorI2Vsc2UKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8wM19TRVQoeCkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8wM19SRVNFVCh4KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzAzX1RPR0dMRSh4KQorI2VuZGlmCisKKyNpZiAoQkVOQ0hNQVJLX01PRFVMRVMgJiBCRU5DSE1BUktfTU9EXzA0KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzA0X1NFVCh4KSAgICAgICAgIEJFTkNITUFSS19TRVQoeCkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8wNF9SRVNFVCh4KSAgICAgICBCRU5DSE1BUktfUkVTRVQoeCkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8wNF9UT0dHTEUoeCkgICAgICBCRU5DSE1BUktfVE9HR0xFKHgpCisjZWxzZQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzA0X1NFVCh4KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzA0X1JFU0VUKHgpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMDRfVE9HR0xFKHgpCisjZW5kaWYKKworI2lmIChCRU5DSE1BUktfTU9EVUxFUyAmIEJFTkNITUFSS19NT0RfMDUpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMDVfU0VUKHgpICAgICAgICAgQkVOQ0hNQVJLX1NFVCh4KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzA1X1JFU0VUKHgpICAgICAgIEJFTkNITUFSS19SRVNFVCh4KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzA1X1RPR0dMRSh4KSAgICAgIEJFTkNITUFSS19UT0dHTEUoeCkKKyNlbHNlCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMDVfU0VUKHgpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMDVfUkVTRVQoeCkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8wNV9UT0dHTEUoeCkKKyNlbmRpZgorCisjaWYgKEJFTkNITUFSS19NT0RVTEVTICYgQkVOQ0hNQVJLX01PRF8wNikKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8wNl9TRVQoeCkgICAgICAgICBCRU5DSE1BUktfU0VUKHgpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMDZfUkVTRVQoeCkgICAgICAgQkVOQ0hNQVJLX1JFU0VUKHgpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMDZfVE9HR0xFKHgpICAgICAgQkVOQ0hNQVJLX1RPR0dMRSh4KQorI2Vsc2UKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8wNl9TRVQoeCkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8wNl9SRVNFVCh4KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzA2X1RPR0dMRSh4KQorI2VuZGlmCisKKyNpZiAoQkVOQ0hNQVJLX01PRFVMRVMgJiBCRU5DSE1BUktfTU9EXzA3KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzA3X1NFVCh4KSAgICAgICAgIEJFTkNITUFSS19TRVQoeCkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8wN19SRVNFVCh4KSAgICAgICBCRU5DSE1BUktfUkVTRVQoeCkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8wN19UT0dHTEUoeCkgICAgICBCRU5DSE1BUktfVE9HR0xFKHgpCisjZWxzZQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzA3X1NFVCh4KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzA3X1JFU0VUKHgpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMDdfVE9HR0xFKHgpCisjZW5kaWYKKworI2lmIChCRU5DSE1BUktfTU9EVUxFUyAmIEJFTkNITUFSS19NT0RfMDgpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMDhfU0VUKHgpICAgICAgICAgQkVOQ0hNQVJLX1NFVCh4KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzA4X1JFU0VUKHgpICAgICAgIEJFTkNITUFSS19SRVNFVCh4KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzA4X1RPR0dMRSh4KSAgICAgIEJFTkNITUFSS19UT0dHTEUoeCkKKyNlbHNlCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMDhfU0VUKHgpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMDhfUkVTRVQoeCkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8wOF9UT0dHTEUoeCkKKyNlbmRpZgorCisjaWYgKEJFTkNITUFSS19NT0RVTEVTICYgQkVOQ0hNQVJLX01PRF8wOSkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8wOV9TRVQoeCkgICAgICAgICBCRU5DSE1BUktfU0VUKHgpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMDlfUkVTRVQoeCkgICAgICAgQkVOQ0hNQVJLX1JFU0VUKHgpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMDlfVE9HR0xFKHgpICAgICAgQkVOQ0hNQVJLX1RPR0dMRSh4KQorI2Vsc2UKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8wOV9TRVQoeCkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8wOV9SRVNFVCh4KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzA5X1RPR0dMRSh4KQorI2VuZGlmCisKKyNpZiAoQkVOQ0hNQVJLX01PRFVMRVMgJiBCRU5DSE1BUktfTU9EXzEwKQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzEwX1NFVCh4KSAgICAgICAgIEJFTkNITUFSS19TRVQoeCkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8xMF9SRVNFVCh4KSAgICAgICBCRU5DSE1BUktfUkVTRVQoeCkKKyNlbHNlCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMTBfU0VUKHgpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMTBfUkVTRVQoeCkKKyNlbmRpZgorCisjaWYgKEJFTkNITUFSS19NT0RVTEVTICYgQkVOQ0hNQVJLX01PRF8xMSkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8xMV9TRVQoeCkgICAgICAgICBCRU5DSE1BUktfU0VUKHgpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMTFfUkVTRVQoeCkgICAgICAgQkVOQ0hNQVJLX1JFU0VUKHgpCisjZWxzZQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzExX1NFVCh4KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzExX1JFU0VUKHgpCisjZW5kaWYKKworI2lmIChCRU5DSE1BUktfTU9EVUxFUyAmIEJFTkNITUFSS19NT0RfMTIpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMTJfU0VUKHgpICAgICAgICAgQkVOQ0hNQVJLX1NFVCh4KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzEyX1JFU0VUKHgpICAgICAgIEJFTkNITUFSS19SRVNFVCh4KQorI2Vsc2UKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8xMl9TRVQoeCkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8xMl9SRVNFVCh4KQorI2VuZGlmCisKKyNpZiAoQkVOQ0hNQVJLX01PRFVMRVMgJiBCRU5DSE1BUktfTU9EXzEzKQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzEzX1NFVCh4KSAgICAgICAgIEJFTkNITUFSS19TRVQoeCkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8xM19SRVNFVCh4KSAgICAgICBCRU5DSE1BUktfUkVTRVQoeCkKKyNlbHNlCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMTNfU0VUKHgpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMTNfUkVTRVQoeCkKKyNlbmRpZgorCisjaWYgKEJFTkNITUFSS19NT0RVTEVTICYgQkVOQ0hNQVJLX01PRF8xNCkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8xNF9TRVQoeCkgICAgICAgICBCRU5DSE1BUktfU0VUKHgpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMTRfUkVTRVQoeCkgICAgICAgQkVOQ0hNQVJLX1JFU0VUKHgpCisjZWxzZQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzE0X1NFVCh4KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzE0X1JFU0VUKHgpCisjZW5kaWYKKworI2lmIChCRU5DSE1BUktfTU9EVUxFUyAmIEJFTkNITUFSS19NT0RfMTUpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMTVfU0VUKHgpICAgICAgICAgQkVOQ0hNQVJLX1NFVCh4KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzE1X1JFU0VUKHgpICAgICAgIEJFTkNITUFSS19SRVNFVCh4KQorI2Vsc2UKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8xNV9TRVQoeCkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8xNV9SRVNFVCh4KQorI2VuZGlmCisKKyNpZiAoQkVOQ0hNQVJLX01PRFVMRVMgJiBCRU5DSE1BUktfTU9EXzE2KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzE2X1NFVCh4KSAgICAgICAgIEJFTkNITUFSS19TRVQoeCkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8xNl9SRVNFVCh4KSAgICAgICBCRU5DSE1BUktfUkVTRVQoeCkKKyNlbHNlCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMTZfU0VUKHgpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMTZfUkVTRVQoeCkKKyNlbmRpZgorCisjaWYgKEJFTkNITUFSS19NT0RVTEVTICYgQkVOQ0hNQVJLX01PRF8xNykKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8xN19TRVQoeCkgICAgICAgICBCRU5DSE1BUktfU0VUKHgpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMTdfUkVTRVQoeCkgICAgICAgQkVOQ0hNQVJLX1JFU0VUKHgpCisjZWxzZQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzE3X1NFVCh4KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzE3X1JFU0VUKHgpCisjZW5kaWYKKworI2lmIChCRU5DSE1BUktfTU9EVUxFUyAmIEJFTkNITUFSS19NT0RfMTgpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMThfU0VUKHgpICAgICAgICAgQkVOQ0hNQVJLX1NFVCh4KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzE4X1JFU0VUKHgpICAgICAgIEJFTkNITUFSS19SRVNFVCh4KQorI2Vsc2UKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8xOF9TRVQoeCkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8xOF9SRVNFVCh4KQorI2VuZGlmCisKKyNpZiAoQkVOQ0hNQVJLX01PRFVMRVMgJiBCRU5DSE1BUktfTU9EXzE5KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzE5X1NFVCh4KSAgICAgICAgIEJFTkNITUFSS19TRVQoeCkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8xOV9SRVNFVCh4KSAgICAgICBCRU5DSE1BUktfUkVTRVQoeCkKKyNlbHNlCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMTlfU0VUKHgpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMTlfUkVTRVQoeCkKKyNlbmRpZgorCisjaWYgKEJFTkNITUFSS19NT0RVTEVTICYgQkVOQ0hNQVJLX01PRF8yMCkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8yMF9TRVQoeCkgICAgICAgICBCRU5DSE1BUktfU0VUKHgpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMjBfUkVTRVQoeCkgICAgICAgQkVOQ0hNQVJLX1JFU0VUKHgpCisjZWxzZQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzIwX1NFVCh4KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzIwX1JFU0VUKHgpCisjZW5kaWYKKworI2lmIChCRU5DSE1BUktfTU9EVUxFUyAmIEJFTkNITUFSS19NT0RfMjEpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMjFfU0VUKHgpICAgICAgICAgQkVOQ0hNQVJLX1NFVCh4KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzIxX1JFU0VUKHgpICAgICAgIEJFTkNITUFSS19SRVNFVCh4KQorI2Vsc2UKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8yMV9TRVQoeCkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8yMV9SRVNFVCh4KQorI2VuZGlmCisKKyNpZiAoQkVOQ0hNQVJLX01PRFVMRVMgJiBCRU5DSE1BUktfTU9EXzIyKQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzIyX1NFVCh4KSAgICAgICAgIEJFTkNITUFSS19TRVQoeCkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8yMl9SRVNFVCh4KSAgICAgICBCRU5DSE1BUktfUkVTRVQoeCkKKyNlbHNlCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMjJfU0VUKHgpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMjJfUkVTRVQoeCkKKyNlbmRpZgorCisjaWYgKEJFTkNITUFSS19NT0RVTEVTICYgQkVOQ0hNQVJLX01PRF8yMykKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8yM19TRVQoeCkgICAgICAgICBCRU5DSE1BUktfU0VUKHgpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMjNfUkVTRVQoeCkgICAgICAgQkVOQ0hNQVJLX1JFU0VUKHgpCisjZWxzZQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzIzX1NFVCh4KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzIzX1JFU0VUKHgpCisjZW5kaWYKKworI2lmIChCRU5DSE1BUktfTU9EVUxFUyAmIEJFTkNITUFSS19NT0RfMjQpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMjRfU0VUKHgpICAgICAgICAgQkVOQ0hNQVJLX1NFVCh4KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzI0X1JFU0VUKHgpICAgICAgIEJFTkNITUFSS19SRVNFVCh4KQorI2Vsc2UKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8yNF9TRVQoeCkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8yNF9SRVNFVCh4KQorI2VuZGlmCisKKyNpZiAoQkVOQ0hNQVJLX01PRFVMRVMgJiBCRU5DSE1BUktfTU9EXzI1KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzI1X1NFVCh4KSAgICAgICAgIEJFTkNITUFSS19TRVQoeCkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8yNV9SRVNFVCh4KSAgICAgICBCRU5DSE1BUktfUkVTRVQoeCkKKyNlbHNlCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMjVfU0VUKHgpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMjVfUkVTRVQoeCkKKyNlbmRpZgorCisjaWYgKEJFTkNITUFSS19NT0RVTEVTICYgQkVOQ0hNQVJLX01PRF8yNikKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8yNl9TRVQoeCkgICAgICAgICBCRU5DSE1BUktfU0VUKHgpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMjZfUkVTRVQoeCkgICAgICAgQkVOQ0hNQVJLX1JFU0VUKHgpCisjZWxzZQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzI2X1NFVCh4KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzI2X1JFU0VUKHgpCisjZW5kaWYKKworI2lmIChCRU5DSE1BUktfTU9EVUxFUyAmIEJFTkNITUFSS19NT0RfMjcpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMjdfU0VUKHgpICAgICAgICAgQkVOQ0hNQVJLX1NFVCh4KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzI3X1JFU0VUKHgpICAgICAgIEJFTkNITUFSS19SRVNFVCh4KQorI2Vsc2UKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8yN19TRVQoeCkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8yN19SRVNFVCh4KQorI2VuZGlmCisKKyNpZiAoQkVOQ0hNQVJLX01PRFVMRVMgJiBCRU5DSE1BUktfTU9EXzI4KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzI4X1NFVCh4KSAgICAgICAgIEJFTkNITUFSS19TRVQoeCkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8yOF9SRVNFVCh4KSAgICAgICBCRU5DSE1BUktfUkVTRVQoeCkKKyNlbHNlCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMjhfU0VUKHgpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMjhfUkVTRVQoeCkKKyNlbmRpZgorCisjaWYgKEJFTkNITUFSS19NT0RVTEVTICYgQkVOQ0hNQVJLX01PRF8yOSkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8yOV9TRVQoeCkgICAgICAgICBCRU5DSE1BUktfU0VUKHgpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMjlfUkVTRVQoeCkgICAgICAgQkVOQ0hNQVJLX1JFU0VUKHgpCisjZWxzZQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzI5X1NFVCh4KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzI5X1JFU0VUKHgpCisjZW5kaWYKKworI2lmIChCRU5DSE1BUktfTU9EVUxFUyAmIEJFTkNITUFSS19NT0RfMzApCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMzBfU0VUKHgpICAgICAgICAgQkVOQ0hNQVJLX1NFVCh4KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzMwX1JFU0VUKHgpICAgICAgIEJFTkNITUFSS19SRVNFVCh4KQorI2Vsc2UKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8zMF9TRVQoeCkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8zMF9SRVNFVCh4KQorI2VuZGlmCisKKyNpZiAoQkVOQ0hNQVJLX01PRFVMRVMgJiBCRU5DSE1BUktfTU9EXzMxKQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzMxX1NFVCh4KSAgICAgICAgIEJFTkNITUFSS19TRVQoeCkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8zMV9SRVNFVCh4KSAgICAgICBCRU5DSE1BUktfUkVTRVQoeCkKKyNlbHNlCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMzFfU0VUKHgpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMzFfUkVTRVQoeCkKKyNlbmRpZgorCisjaWYgKEJFTkNITUFSS19NT0RVTEVTICYgQkVOQ0hNQVJLX01PRF8zMikKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8zMl9TRVQoeCkgICAgICAgICBCRU5DSE1BUktfU0VUKHgpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMzJfUkVTRVQoeCkgICAgICAgQkVOQ0hNQVJLX1JFU0VUKHgpCisjZWxzZQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzMyX1NFVCh4KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzMyX1JFU0VUKHgpCisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIG1vZHVsIGdsb2JhbCB0eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvY2FsIHZhcnMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZW5kaWYgLy8gX0JFTkNITUFSS19IXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9EZWJ1Zy5oIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9EZWJ1Zy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1ZGU5ZDUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0RlYnVnLmgKQEAgLTAsMCArMSw3MzQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBEZWJ1ZyBpbnRlcmZhY2UKKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgICAgICAgICRSQ1NmaWxlOiBEZWJ1Zy5oLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS40ICQgICREYXRlOiAyMDA4LzEwLzE3IDE1OjMyOjMyICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorICAgICAgICAgICAgICAgICAgICAuLi4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUmV2aXNpb24gSGlzdG9yeToKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfREVCVUdfSF8KKyNkZWZpbmUgX0RFQlVHX0hfCisKKyNpbmNsdWRlICJnbG9iYWwuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgRyBMIE8gQiBBIEwgICBEIEUgRiBJIE4gSSBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGdsb2JhbCBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBUaGVzZSBkZWZpbml0aW9ucyBhcmUgaW1wb3J0YW50IGZvciBsZXZlbC1kZWJ1ZyB0cmFjZXMuCisvLyBBIG1hY3JvIERFQlVHX0dMQl9MVkwoKSBkZWZpbmVzIHRoZSBjdXJyZW50IGRlYnVnLWxldmVsIHVzaW5nIGZvbGxvd2luZyBiaXMuCisvLyBJZiB0aGUgY29ycmVzcG9uZGluZyBiaXQgaXMgc2V0IHRoZW4gdHJhY2UgbWVzc2FnZSB3aWxsIGJlIHByaW50ZWQgb3V0CisvLyAob25seSBpZiBOREVCVUcgaXMgbm90IGRlZmluZWQpLiBUaGUgdXBwZXIgZGVidWctbGV2ZWxzIGFyZSByZXNlcnZlZCBmb3IKKy8vIHRoZSBkZWJ1Zy1sZXZlbHMgQUxXQVlTLCBFUlJPUiBhbmQgQVNTRVJULgorI2RlZmluZSBERUJVR19MVkxfMDEgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgREVCVUdfTFZMXzAyICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIERFQlVHX0xWTF8wMyAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBERUJVR19MVkxfMDQgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgREVCVUdfTFZMXzA1ICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDEwCisjZGVmaW5lIERFQlVHX0xWTF8wNiAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAyMAorI2RlZmluZSBERUJVR19MVkxfMDcgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwNDAKKyNkZWZpbmUgREVCVUdfTFZMXzA4ICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDgwCisjZGVmaW5lIERFQlVHX0xWTF8wOSAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDEwMAorI2RlZmluZSBERUJVR19MVkxfMTAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMDAKKyNkZWZpbmUgREVCVUdfTFZMXzExICAgICAgICAgICAgICAgICAgICAweDAwMDAwNDAwCisjZGVmaW5lIERFQlVHX0xWTF8xMiAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDgwMAorI2RlZmluZSBERUJVR19MVkxfMTMgICAgICAgICAgICAgICAgICAgIDB4MDAwMDEwMDAKKyNkZWZpbmUgREVCVUdfTFZMXzE0ICAgICAgICAgICAgICAgICAgICAweDAwMDAyMDAwCisjZGVmaW5lIERFQlVHX0xWTF8xNSAgICAgICAgICAgICAgICAgICAgMHgwMDAwNDAwMAorI2RlZmluZSBERUJVR19MVkxfMTYgICAgICAgICAgICAgICAgICAgIDB4MDAwMDgwMDAKKyNkZWZpbmUgREVCVUdfTFZMXzE3ICAgICAgICAgICAgICAgICAgICAweDAwMDEwMDAwCisjZGVmaW5lIERFQlVHX0xWTF8xOCAgICAgICAgICAgICAgICAgICAgMHgwMDAyMDAwMAorI2RlZmluZSBERUJVR19MVkxfMTkgICAgICAgICAgICAgICAgICAgIDB4MDAwNDAwMDAKKyNkZWZpbmUgREVCVUdfTFZMXzIwICAgICAgICAgICAgICAgICAgICAweDAwMDgwMDAwCisjZGVmaW5lIERFQlVHX0xWTF8yMSAgICAgICAgICAgICAgICAgICAgMHgwMDEwMDAwMAorI2RlZmluZSBERUJVR19MVkxfMjIgICAgICAgICAgICAgICAgICAgIDB4MDAyMDAwMDAKKyNkZWZpbmUgREVCVUdfTFZMXzIzICAgICAgICAgICAgICAgICAgICAweDAwNDAwMDAwCisjZGVmaW5lIERFQlVHX0xWTF8yNCAgICAgICAgICAgICAgICAgICAgMHgwMDgwMDAwMAorI2RlZmluZSBERUJVR19MVkxfMjUgICAgICAgICAgICAgICAgICAgIDB4MDEwMDAwMDAKKyNkZWZpbmUgREVCVUdfTFZMXzI2ICAgICAgICAgICAgICAgICAgICAweDAyMDAwMDAwCisjZGVmaW5lIERFQlVHX0xWTF8yNyAgICAgICAgICAgICAgICAgICAgMHgwNDAwMDAwMAorI2RlZmluZSBERUJVR19MVkxfMjggICAgICAgICAgICAgICAgICAgIDB4MDgwMDAwMDAKKyNkZWZpbmUgREVCVUdfTFZMXzI5ICAgICAgICAgICAgICAgICAgICAweDEwMDAwMDAwCisjZGVmaW5lIERFQlVHX0xWTF9BU1NFUlQgICAgICAgICAgICAgICAgMHgyMDAwMDAwMAorI2RlZmluZSBERUJVR19MVkxfRVJST1IgICAgICAgICAgICAgICAgIDB4NDAwMDAwMDAKKyNkZWZpbmUgREVCVUdfTFZMX0FMV0FZUyAgICAgICAgICAgICAgICAweDgwMDAwMDAwCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBnbG9iYWwgdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBnbG9iYWwgdmFycworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGdsb2JhbCBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gZ2xvYmFsIG1hY3JvcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHRoaXMgbWFjcm8gZGVmaW5lcyBhIHZlcnNpb24gc3RyaW5nCisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHRoaXMgbWFjcm8gZGVmaW5lcyBhIGJ1aWxkIGluZm8gc3RyaW5nIChlLmcuIGZvciB1c2luZyBpbiBwcmludGYoKSkKKyNkZWZpbmUgREVCVUdfTUFLRV9CVUlMRF9JTkZPKHByZWZpeCxwcm9kdWN0LHByb2RpZCxkZXNjcix2ZXJzdHIsYXV0aG9yKSAiXG4iIFwKKyAgICBwcmVmaXggIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuIiBcCisgICAgcHJlZml4ICJQcm9qZWN0OiAgICIgcHJvZHVjdCAiLCAiIHByb2RpZCAgICAgICAgICAgICAgICAgICJcbiIgXAorICAgIHByZWZpeCAiRGVzY3JpcHQuOiAiIGRlc2NyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXG4iIFwKKyAgICBwcmVmaXggIkF1dGhvcjogICAgIiBhdXRob3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxuIiBcCisgICAgcHJlZml4ICJEYXRlOiAgICAgICIgX19EQVRFX18gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcbiIgXAorICAgIHByZWZpeCAiVmVyc2lvbjogICAiIHZlcnN0ciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXG4iIFwKKyAgICBwcmVmaXggIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuXG4iCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBUaGUgZGVmYXVsdCBkZWJ1Zy1sZXZlbCBpczogRVJST1IgYW5kIEFMV0FZUy4KKy8vIFlvdSBjYW4gZGVmaW5lIGFuIG90aGVyIGRlYnVnLWxldmVsIGluIHByb2plY3Qgc2V0dGluZ3MuCisjaWZuZGVmIERFRl9ERUJVR19MVkwKKyNkZWZpbmUgREVGX0RFQlVHX0xWTCAgICAgICAgICAgICAgICAgICAoREVCVUdfTFZMX0FMV0FZUyB8IERFQlVHX0xWTF9FUlJPUikKKyNlbmRpZgorI2lmbmRlZiBERUJVR19HTEJfTFZMCisjZGVmaW5lIERFQlVHX0dMQl9MVkwoKSAgICAgICAgICAgICAgICAgKERFRl9ERUJVR19MVkwpCisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNpZiAoREVWX1NZU1RFTSA9PSBfREVWX1dJTjMyXykgJiYgZGVmaW5lZCAoVFJBQ0VfTVNHKQorCisgICAgLy8gRm9yIFdJTjMyIHRoZSBtYWNybyBERUJVR19UUkFDRTAgY2FuIGJlIGRlZmluZWQgYXMgZnVuY3Rpb24gY2FsbCBUcmFjZUx2bCgpCisgICAgLy8gb3IgYXMgbWFjcm8gVFJBQ0UoKS4KKyAgICAvLworICAgIC8vIEhlcmUgdGhlIHBhcmFtZXRlciAnbHZsJyBjYW4gYmUgdXNlZCB3aXRoIG1vcmUgdGhhbiBvbmUKKyAgICAvLyBkZWJ1Zy1sZXZlbCAodXNpbmcgT1IpLgorICAgIC8vCisgICAgLy8gRXhhbXBsZTogREVCVUdfVFJBQ0UxKERFQlVHX0xWTF8zMCB8IERFQlVHX0xWTF8wMiwgIkhlbGxvICVkIiwgYkNvdW50KTsKKworI2RlZmluZSBERUJVR19UUkFDRTAobHZsLHN0cikgICAgICAgICAgICAgICBUcmFjZUx2bCgobHZsKSxzdHIpCisjZGVmaW5lIERFQlVHX1RSQUNFMShsdmwsc3RyLHAxKSAgICAgICAgICAgIFRyYWNlTHZsKChsdmwpLHN0cixwMSkKKyNkZWZpbmUgREVCVUdfVFJBQ0UyKGx2bCxzdHIscDEscDIpICAgICAgICAgVHJhY2VMdmwoKGx2bCksc3RyLHAxLHAyKQorI2RlZmluZSBERUJVR19UUkFDRTMobHZsLHN0cixwMSxwMixwMykgICAgICBUcmFjZUx2bCgobHZsKSxzdHIscDEscDIscDMpCisjZGVmaW5lIERFQlVHX1RSQUNFNChsdmwsc3RyLHAxLHAyLHAzLHA0KSAgIFRyYWNlTHZsKChsdmwpLHN0cixwMSxwMixwMyxwNCkKKyNkZWZpbmUgREVCVUdfR0xCX0xWTCgpICAgICAgICAgICAgICAgICAgICAgZHdEZWJ1Z0xldmVsX2cKKworI2Vsc2UKKworICAgIC8vIEF0IG1pY3JvY29udHJvbGxlcnMgd2UgZG8gcmVkdWNlIHRoZSBtZW1vcnkgdXNhZ2UgYnkgZGVsZXRpbmcgREVCVUdfVFJBQ0UtbGluZXMKKyAgICAvLyAoY29tcGlsZXIgZG9lcyBkZWxldGUgdGhlIGxpbmVzKS4KKyAgICAvLworICAgIC8vIEhlcmUgdGhlIHBhcmFtZXRlciAnbHZsJyBjYW4gb25seSBiZSB1c2VkIHdpdGggb25lIGRlYnVnLWxldmVsLgorICAgIC8vCisgICAgLy8gRXhhbXBsZTogREVCVUdfVFJBQ0UxKERFQlVHX0xWTF9FUlJPUiwgImVycm9yIGNvZGUgJWQiLCBkd1JldCk7CisKKyNpZiAoREVCVUdfR0xCX0xWTCgpICYgREVCVUdfTFZMX0FMV0FZUykKKyNkZWZpbmUgREVCVUdfTFZMX0FMV0FZU19UUkFDRTAoc3RyKSAgICAgICAgICAgICAgICBUUkFDRTAoc3RyKQorI2RlZmluZSBERUJVR19MVkxfQUxXQVlTX1RSQUNFMShzdHIscDEpICAgICAgICAgICAgIFRSQUNFMShzdHIscDEpCisjZGVmaW5lIERFQlVHX0xWTF9BTFdBWVNfVFJBQ0UyKHN0cixwMSxwMikgICAgICAgICAgVFJBQ0UyKHN0cixwMSxwMikKKyNkZWZpbmUgREVCVUdfTFZMX0FMV0FZU19UUkFDRTMoc3RyLHAxLHAyLHAzKSAgICAgICBUUkFDRTMoc3RyLHAxLHAyLHAzKQorI2RlZmluZSBERUJVR19MVkxfQUxXQVlTX1RSQUNFNChzdHIscDEscDIscDMscDQpICAgIFRSQUNFNChzdHIscDEscDIscDMscDQpCisjZWxzZQorI2RlZmluZSBERUJVR19MVkxfQUxXQVlTX1RSQUNFMChzdHIpCisjZGVmaW5lIERFQlVHX0xWTF9BTFdBWVNfVFJBQ0UxKHN0cixwMSkKKyNkZWZpbmUgREVCVUdfTFZMX0FMV0FZU19UUkFDRTIoc3RyLHAxLHAyKQorI2RlZmluZSBERUJVR19MVkxfQUxXQVlTX1RSQUNFMyhzdHIscDEscDIscDMpCisjZGVmaW5lIERFQlVHX0xWTF9BTFdBWVNfVFJBQ0U0KHN0cixwMSxwMixwMyxwNCkKKyNlbmRpZgorCisjaWYgKERFQlVHX0dMQl9MVkwoKSAmIERFQlVHX0xWTF9FUlJPUikKKyNkZWZpbmUgREVCVUdfTFZMX0VSUk9SX1RSQUNFMChzdHIpICAgICAgICAgICAgICAgICBUUkFDRTAoc3RyKQorI2RlZmluZSBERUJVR19MVkxfRVJST1JfVFJBQ0UxKHN0cixwMSkgICAgICAgICAgICAgIFRSQUNFMShzdHIscDEpCisjZGVmaW5lIERFQlVHX0xWTF9FUlJPUl9UUkFDRTIoc3RyLHAxLHAyKSAgICAgICAgICAgVFJBQ0UyKHN0cixwMSxwMikKKyNkZWZpbmUgREVCVUdfTFZMX0VSUk9SX1RSQUNFMyhzdHIscDEscDIscDMpICAgICAgICBUUkFDRTMoc3RyLHAxLHAyLHAzKQorI2RlZmluZSBERUJVR19MVkxfRVJST1JfVFJBQ0U0KHN0cixwMSxwMixwMyxwNCkgICAgIFRSQUNFNChzdHIscDEscDIscDMscDQpCisjZWxzZQorI2RlZmluZSBERUJVR19MVkxfRVJST1JfVFJBQ0UwKHN0cikKKyNkZWZpbmUgREVCVUdfTFZMX0VSUk9SX1RSQUNFMShzdHIscDEpCisjZGVmaW5lIERFQlVHX0xWTF9FUlJPUl9UUkFDRTIoc3RyLHAxLHAyKQorI2RlZmluZSBERUJVR19MVkxfRVJST1JfVFJBQ0UzKHN0cixwMSxwMixwMykKKyNkZWZpbmUgREVCVUdfTFZMX0VSUk9SX1RSQUNFNChzdHIscDEscDIscDMscDQpCisjZW5kaWYKKworI2lmIChERUJVR19HTEJfTFZMKCkgJiBERUJVR19MVkxfQVNTRVJUKQorI2RlZmluZSBERUJVR19MVkxfQVNTRVJUX1RSQUNFMChzdHIpICAgICAgICAgICAgICAgIFRSQUNFMChzdHIpCisjZGVmaW5lIERFQlVHX0xWTF9BU1NFUlRfVFJBQ0UxKHN0cixwMSkgICAgICAgICAgICAgVFJBQ0UxKHN0cixwMSkKKyNkZWZpbmUgREVCVUdfTFZMX0FTU0VSVF9UUkFDRTIoc3RyLHAxLHAyKSAgICAgICAgICBUUkFDRTIoc3RyLHAxLHAyKQorI2RlZmluZSBERUJVR19MVkxfQVNTRVJUX1RSQUNFMyhzdHIscDEscDIscDMpICAgICAgIFRSQUNFMyhzdHIscDEscDIscDMpCisjZGVmaW5lIERFQlVHX0xWTF9BU1NFUlRfVFJBQ0U0KHN0cixwMSxwMixwMyxwNCkgICAgVFJBQ0U0KHN0cixwMSxwMixwMyxwNCkKKyNlbHNlCisjZGVmaW5lIERFQlVHX0xWTF9BU1NFUlRfVFJBQ0UwKHN0cikKKyNkZWZpbmUgREVCVUdfTFZMX0FTU0VSVF9UUkFDRTEoc3RyLHAxKQorI2RlZmluZSBERUJVR19MVkxfQVNTRVJUX1RSQUNFMihzdHIscDEscDIpCisjZGVmaW5lIERFQlVHX0xWTF9BU1NFUlRfVFJBQ0UzKHN0cixwMSxwMixwMykKKyNkZWZpbmUgREVCVUdfTFZMX0FTU0VSVF9UUkFDRTQoc3RyLHAxLHAyLHAzLHA0KQorI2VuZGlmCisKKyNpZiAoREVCVUdfR0xCX0xWTCgpICYgREVCVUdfTFZMXzI5KQorI2RlZmluZSBERUJVR19MVkxfMjlfVFJBQ0UwKHN0cikgICAgICAgICAgICAgICAgICAgIFRSQUNFMChzdHIpCisjZGVmaW5lIERFQlVHX0xWTF8yOV9UUkFDRTEoc3RyLHAxKSAgICAgICAgICAgICAgICAgVFJBQ0UxKHN0cixwMSkKKyNkZWZpbmUgREVCVUdfTFZMXzI5X1RSQUNFMihzdHIscDEscDIpICAgICAgICAgICAgICBUUkFDRTIoc3RyLHAxLHAyKQorI2RlZmluZSBERUJVR19MVkxfMjlfVFJBQ0UzKHN0cixwMSxwMixwMykgICAgICAgICAgIFRSQUNFMyhzdHIscDEscDIscDMpCisjZGVmaW5lIERFQlVHX0xWTF8yOV9UUkFDRTQoc3RyLHAxLHAyLHAzLHA0KSAgICAgICAgVFJBQ0U0KHN0cixwMSxwMixwMyxwNCkKKyNlbHNlCisjZGVmaW5lIERFQlVHX0xWTF8yOV9UUkFDRTAoc3RyKQorI2RlZmluZSBERUJVR19MVkxfMjlfVFJBQ0UxKHN0cixwMSkKKyNkZWZpbmUgREVCVUdfTFZMXzI5X1RSQUNFMihzdHIscDEscDIpCisjZGVmaW5lIERFQlVHX0xWTF8yOV9UUkFDRTMoc3RyLHAxLHAyLHAzKQorI2RlZmluZSBERUJVR19MVkxfMjlfVFJBQ0U0KHN0cixwMSxwMixwMyxwNCkKKyNlbmRpZgorCisjaWYgKERFQlVHX0dMQl9MVkwoKSAmIERFQlVHX0xWTF8yOCkKKyNkZWZpbmUgREVCVUdfTFZMXzI4X1RSQUNFMChzdHIpICAgICAgICAgICAgICAgICAgICBUUkFDRTAoc3RyKQorI2RlZmluZSBERUJVR19MVkxfMjhfVFJBQ0UxKHN0cixwMSkgICAgICAgICAgICAgICAgIFRSQUNFMShzdHIscDEpCisjZGVmaW5lIERFQlVHX0xWTF8yOF9UUkFDRTIoc3RyLHAxLHAyKSAgICAgICAgICAgICAgVFJBQ0UyKHN0cixwMSxwMikKKyNkZWZpbmUgREVCVUdfTFZMXzI4X1RSQUNFMyhzdHIscDEscDIscDMpICAgICAgICAgICBUUkFDRTMoc3RyLHAxLHAyLHAzKQorI2RlZmluZSBERUJVR19MVkxfMjhfVFJBQ0U0KHN0cixwMSxwMixwMyxwNCkgICAgICAgIFRSQUNFNChzdHIscDEscDIscDMscDQpCisjZWxzZQorI2RlZmluZSBERUJVR19MVkxfMjhfVFJBQ0UwKHN0cikKKyNkZWZpbmUgREVCVUdfTFZMXzI4X1RSQUNFMShzdHIscDEpCisjZGVmaW5lIERFQlVHX0xWTF8yOF9UUkFDRTIoc3RyLHAxLHAyKQorI2RlZmluZSBERUJVR19MVkxfMjhfVFJBQ0UzKHN0cixwMSxwMixwMykKKyNkZWZpbmUgREVCVUdfTFZMXzI4X1RSQUNFNChzdHIscDEscDIscDMscDQpCisjZW5kaWYKKworI2lmIChERUJVR19HTEJfTFZMKCkgJiBERUJVR19MVkxfMjcpCisjZGVmaW5lIERFQlVHX0xWTF8yN19UUkFDRTAoc3RyKSAgICAgICAgICAgICAgICAgICAgVFJBQ0UwKHN0cikKKyNkZWZpbmUgREVCVUdfTFZMXzI3X1RSQUNFMShzdHIscDEpICAgICAgICAgICAgICAgICBUUkFDRTEoc3RyLHAxKQorI2RlZmluZSBERUJVR19MVkxfMjdfVFJBQ0UyKHN0cixwMSxwMikgICAgICAgICAgICAgIFRSQUNFMihzdHIscDEscDIpCisjZGVmaW5lIERFQlVHX0xWTF8yN19UUkFDRTMoc3RyLHAxLHAyLHAzKSAgICAgICAgICAgVFJBQ0UzKHN0cixwMSxwMixwMykKKyNkZWZpbmUgREVCVUdfTFZMXzI3X1RSQUNFNChzdHIscDEscDIscDMscDQpICAgICAgICBUUkFDRTQoc3RyLHAxLHAyLHAzLHA0KQorI2Vsc2UKKyNkZWZpbmUgREVCVUdfTFZMXzI3X1RSQUNFMChzdHIpCisjZGVmaW5lIERFQlVHX0xWTF8yN19UUkFDRTEoc3RyLHAxKQorI2RlZmluZSBERUJVR19MVkxfMjdfVFJBQ0UyKHN0cixwMSxwMikKKyNkZWZpbmUgREVCVUdfTFZMXzI3X1RSQUNFMyhzdHIscDEscDIscDMpCisjZGVmaW5lIERFQlVHX0xWTF8yN19UUkFDRTQoc3RyLHAxLHAyLHAzLHA0KQorI2VuZGlmCisKKyNpZiAoREVCVUdfR0xCX0xWTCgpICYgREVCVUdfTFZMXzI2KQorI2RlZmluZSBERUJVR19MVkxfMjZfVFJBQ0UwKHN0cikgICAgICAgICAgICAgICAgICAgIFRSQUNFMChzdHIpCisjZGVmaW5lIERFQlVHX0xWTF8yNl9UUkFDRTEoc3RyLHAxKSAgICAgICAgICAgICAgICAgVFJBQ0UxKHN0cixwMSkKKyNkZWZpbmUgREVCVUdfTFZMXzI2X1RSQUNFMihzdHIscDEscDIpICAgICAgICAgICAgICBUUkFDRTIoc3RyLHAxLHAyKQorI2RlZmluZSBERUJVR19MVkxfMjZfVFJBQ0UzKHN0cixwMSxwMixwMykgICAgICAgICAgIFRSQUNFMyhzdHIscDEscDIscDMpCisjZGVmaW5lIERFQlVHX0xWTF8yNl9UUkFDRTQoc3RyLHAxLHAyLHAzLHA0KSAgICAgICAgVFJBQ0U0KHN0cixwMSxwMixwMyxwNCkKKyNlbHNlCisjZGVmaW5lIERFQlVHX0xWTF8yNl9UUkFDRTAoc3RyKQorI2RlZmluZSBERUJVR19MVkxfMjZfVFJBQ0UxKHN0cixwMSkKKyNkZWZpbmUgREVCVUdfTFZMXzI2X1RSQUNFMihzdHIscDEscDIpCisjZGVmaW5lIERFQlVHX0xWTF8yNl9UUkFDRTMoc3RyLHAxLHAyLHAzKQorI2RlZmluZSBERUJVR19MVkxfMjZfVFJBQ0U0KHN0cixwMSxwMixwMyxwNCkKKyNlbmRpZgorCisjaWYgKERFQlVHX0dMQl9MVkwoKSAmIERFQlVHX0xWTF8yNSkKKyNkZWZpbmUgREVCVUdfTFZMXzI1X1RSQUNFMChzdHIpICAgICAgICAgICAgICAgICAgICBUUkFDRTAoc3RyKQorI2RlZmluZSBERUJVR19MVkxfMjVfVFJBQ0UxKHN0cixwMSkgICAgICAgICAgICAgICAgIFRSQUNFMShzdHIscDEpCisjZGVmaW5lIERFQlVHX0xWTF8yNV9UUkFDRTIoc3RyLHAxLHAyKSAgICAgICAgICAgICAgVFJBQ0UyKHN0cixwMSxwMikKKyNkZWZpbmUgREVCVUdfTFZMXzI1X1RSQUNFMyhzdHIscDEscDIscDMpICAgICAgICAgICBUUkFDRTMoc3RyLHAxLHAyLHAzKQorI2RlZmluZSBERUJVR19MVkxfMjVfVFJBQ0U0KHN0cixwMSxwMixwMyxwNCkgICAgICAgIFRSQUNFNChzdHIscDEscDIscDMscDQpCisjZWxzZQorI2RlZmluZSBERUJVR19MVkxfMjVfVFJBQ0UwKHN0cikKKyNkZWZpbmUgREVCVUdfTFZMXzI1X1RSQUNFMShzdHIscDEpCisjZGVmaW5lIERFQlVHX0xWTF8yNV9UUkFDRTIoc3RyLHAxLHAyKQorI2RlZmluZSBERUJVR19MVkxfMjVfVFJBQ0UzKHN0cixwMSxwMixwMykKKyNkZWZpbmUgREVCVUdfTFZMXzI1X1RSQUNFNChzdHIscDEscDIscDMscDQpCisjZW5kaWYKKworI2lmIChERUJVR19HTEJfTFZMKCkgJiBERUJVR19MVkxfMjQpCisjZGVmaW5lIERFQlVHX0xWTF8yNF9UUkFDRTAoc3RyKSAgICAgICAgICAgICAgICAgICAgVFJBQ0UwKHN0cikKKyNkZWZpbmUgREVCVUdfTFZMXzI0X1RSQUNFMShzdHIscDEpICAgICAgICAgICAgICAgICBUUkFDRTEoc3RyLHAxKQorI2RlZmluZSBERUJVR19MVkxfMjRfVFJBQ0UyKHN0cixwMSxwMikgICAgICAgICAgICAgIFRSQUNFMihzdHIscDEscDIpCisjZGVmaW5lIERFQlVHX0xWTF8yNF9UUkFDRTMoc3RyLHAxLHAyLHAzKSAgICAgICAgICAgVFJBQ0UzKHN0cixwMSxwMixwMykKKyNkZWZpbmUgREVCVUdfTFZMXzI0X1RSQUNFNChzdHIscDEscDIscDMscDQpICAgICAgICBUUkFDRTQoc3RyLHAxLHAyLHAzLHA0KQorI2Vsc2UKKyNkZWZpbmUgREVCVUdfTFZMXzI0X1RSQUNFMChzdHIpCisjZGVmaW5lIERFQlVHX0xWTF8yNF9UUkFDRTEoc3RyLHAxKQorI2RlZmluZSBERUJVR19MVkxfMjRfVFJBQ0UyKHN0cixwMSxwMikKKyNkZWZpbmUgREVCVUdfTFZMXzI0X1RSQUNFMyhzdHIscDEscDIscDMpCisjZGVmaW5lIERFQlVHX0xWTF8yNF9UUkFDRTQoc3RyLHAxLHAyLHAzLHA0KQorI2VuZGlmCisKKyNpZiAoREVCVUdfR0xCX0xWTCgpICYgREVCVUdfTFZMXzIzKQorI2RlZmluZSBERUJVR19MVkxfMjNfVFJBQ0UwKHN0cikgICAgICAgICAgICAgICAgICAgIFRSQUNFMChzdHIpCisjZGVmaW5lIERFQlVHX0xWTF8yM19UUkFDRTEoc3RyLHAxKSAgICAgICAgICAgICAgICAgVFJBQ0UxKHN0cixwMSkKKyNkZWZpbmUgREVCVUdfTFZMXzIzX1RSQUNFMihzdHIscDEscDIpICAgICAgICAgICAgICBUUkFDRTIoc3RyLHAxLHAyKQorI2RlZmluZSBERUJVR19MVkxfMjNfVFJBQ0UzKHN0cixwMSxwMixwMykgICAgICAgICAgIFRSQUNFMyhzdHIscDEscDIscDMpCisjZGVmaW5lIERFQlVHX0xWTF8yM19UUkFDRTQoc3RyLHAxLHAyLHAzLHA0KSAgICAgICAgVFJBQ0U0KHN0cixwMSxwMixwMyxwNCkKKyNlbHNlCisjZGVmaW5lIERFQlVHX0xWTF8yM19UUkFDRTAoc3RyKQorI2RlZmluZSBERUJVR19MVkxfMjNfVFJBQ0UxKHN0cixwMSkKKyNkZWZpbmUgREVCVUdfTFZMXzIzX1RSQUNFMihzdHIscDEscDIpCisjZGVmaW5lIERFQlVHX0xWTF8yM19UUkFDRTMoc3RyLHAxLHAyLHAzKQorI2RlZmluZSBERUJVR19MVkxfMjNfVFJBQ0U0KHN0cixwMSxwMixwMyxwNCkKKyNlbmRpZgorCisjaWYgKERFQlVHX0dMQl9MVkwoKSAmIERFQlVHX0xWTF8yMikKKyNkZWZpbmUgREVCVUdfTFZMXzIyX1RSQUNFMChzdHIpICAgICAgICAgICAgICAgICAgICBUUkFDRTAoc3RyKQorI2RlZmluZSBERUJVR19MVkxfMjJfVFJBQ0UxKHN0cixwMSkgICAgICAgICAgICAgICAgIFRSQUNFMShzdHIscDEpCisjZGVmaW5lIERFQlVHX0xWTF8yMl9UUkFDRTIoc3RyLHAxLHAyKSAgICAgICAgICAgICAgVFJBQ0UyKHN0cixwMSxwMikKKyNkZWZpbmUgREVCVUdfTFZMXzIyX1RSQUNFMyhzdHIscDEscDIscDMpICAgICAgICAgICBUUkFDRTMoc3RyLHAxLHAyLHAzKQorI2RlZmluZSBERUJVR19MVkxfMjJfVFJBQ0U0KHN0cixwMSxwMixwMyxwNCkgICAgICAgIFRSQUNFNChzdHIscDEscDIscDMscDQpCisjZWxzZQorI2RlZmluZSBERUJVR19MVkxfMjJfVFJBQ0UwKHN0cikKKyNkZWZpbmUgREVCVUdfTFZMXzIyX1RSQUNFMShzdHIscDEpCisjZGVmaW5lIERFQlVHX0xWTF8yMl9UUkFDRTIoc3RyLHAxLHAyKQorI2RlZmluZSBERUJVR19MVkxfMjJfVFJBQ0UzKHN0cixwMSxwMixwMykKKyNkZWZpbmUgREVCVUdfTFZMXzIyX1RSQUNFNChzdHIscDEscDIscDMscDQpCisjZW5kaWYKKworI2lmIChERUJVR19HTEJfTFZMKCkgJiBERUJVR19MVkxfMjEpCisjZGVmaW5lIERFQlVHX0xWTF8yMV9UUkFDRTAoc3RyKSAgICAgICAgICAgICAgICAgICAgVFJBQ0UwKHN0cikKKyNkZWZpbmUgREVCVUdfTFZMXzIxX1RSQUNFMShzdHIscDEpICAgICAgICAgICAgICAgICBUUkFDRTEoc3RyLHAxKQorI2RlZmluZSBERUJVR19MVkxfMjFfVFJBQ0UyKHN0cixwMSxwMikgICAgICAgICAgICAgIFRSQUNFMihzdHIscDEscDIpCisjZGVmaW5lIERFQlVHX0xWTF8yMV9UUkFDRTMoc3RyLHAxLHAyLHAzKSAgICAgICAgICAgVFJBQ0UzKHN0cixwMSxwMixwMykKKyNkZWZpbmUgREVCVUdfTFZMXzIxX1RSQUNFNChzdHIscDEscDIscDMscDQpICAgICAgICBUUkFDRTQoc3RyLHAxLHAyLHAzLHA0KQorI2Vsc2UKKyNkZWZpbmUgREVCVUdfTFZMXzIxX1RSQUNFMChzdHIpCisjZGVmaW5lIERFQlVHX0xWTF8yMV9UUkFDRTEoc3RyLHAxKQorI2RlZmluZSBERUJVR19MVkxfMjFfVFJBQ0UyKHN0cixwMSxwMikKKyNkZWZpbmUgREVCVUdfTFZMXzIxX1RSQUNFMyhzdHIscDEscDIscDMpCisjZGVmaW5lIERFQlVHX0xWTF8yMV9UUkFDRTQoc3RyLHAxLHAyLHAzLHA0KQorI2VuZGlmCisKKyNpZiAoREVCVUdfR0xCX0xWTCgpICYgREVCVUdfTFZMXzIwKQorI2RlZmluZSBERUJVR19MVkxfMjBfVFJBQ0UwKHN0cikgICAgICAgICAgICAgICAgICAgIFRSQUNFMChzdHIpCisjZGVmaW5lIERFQlVHX0xWTF8yMF9UUkFDRTEoc3RyLHAxKSAgICAgICAgICAgICAgICAgVFJBQ0UxKHN0cixwMSkKKyNkZWZpbmUgREVCVUdfTFZMXzIwX1RSQUNFMihzdHIscDEscDIpICAgICAgICAgICAgICBUUkFDRTIoc3RyLHAxLHAyKQorI2RlZmluZSBERUJVR19MVkxfMjBfVFJBQ0UzKHN0cixwMSxwMixwMykgICAgICAgICAgIFRSQUNFMyhzdHIscDEscDIscDMpCisjZGVmaW5lIERFQlVHX0xWTF8yMF9UUkFDRTQoc3RyLHAxLHAyLHAzLHA0KSAgICAgICAgVFJBQ0U0KHN0cixwMSxwMixwMyxwNCkKKyNlbHNlCisjZGVmaW5lIERFQlVHX0xWTF8yMF9UUkFDRTAoc3RyKQorI2RlZmluZSBERUJVR19MVkxfMjBfVFJBQ0UxKHN0cixwMSkKKyNkZWZpbmUgREVCVUdfTFZMXzIwX1RSQUNFMihzdHIscDEscDIpCisjZGVmaW5lIERFQlVHX0xWTF8yMF9UUkFDRTMoc3RyLHAxLHAyLHAzKQorI2RlZmluZSBERUJVR19MVkxfMjBfVFJBQ0U0KHN0cixwMSxwMixwMyxwNCkKKyNlbmRpZgorCisjaWYgKERFQlVHX0dMQl9MVkwoKSAmIERFQlVHX0xWTF8xOSkKKyNkZWZpbmUgREVCVUdfTFZMXzE5X1RSQUNFMChzdHIpICAgICAgICAgICAgICAgICAgICBUUkFDRTAoc3RyKQorI2RlZmluZSBERUJVR19MVkxfMTlfVFJBQ0UxKHN0cixwMSkgICAgICAgICAgICAgICAgIFRSQUNFMShzdHIscDEpCisjZGVmaW5lIERFQlVHX0xWTF8xOV9UUkFDRTIoc3RyLHAxLHAyKSAgICAgICAgICAgICAgVFJBQ0UyKHN0cixwMSxwMikKKyNkZWZpbmUgREVCVUdfTFZMXzE5X1RSQUNFMyhzdHIscDEscDIscDMpICAgICAgICAgICBUUkFDRTMoc3RyLHAxLHAyLHAzKQorI2RlZmluZSBERUJVR19MVkxfMTlfVFJBQ0U0KHN0cixwMSxwMixwMyxwNCkgICAgICAgIFRSQUNFNChzdHIscDEscDIscDMscDQpCisjZWxzZQorI2RlZmluZSBERUJVR19MVkxfMTlfVFJBQ0UwKHN0cikKKyNkZWZpbmUgREVCVUdfTFZMXzE5X1RSQUNFMShzdHIscDEpCisjZGVmaW5lIERFQlVHX0xWTF8xOV9UUkFDRTIoc3RyLHAxLHAyKQorI2RlZmluZSBERUJVR19MVkxfMTlfVFJBQ0UzKHN0cixwMSxwMixwMykKKyNkZWZpbmUgREVCVUdfTFZMXzE5X1RSQUNFNChzdHIscDEscDIscDMscDQpCisjZW5kaWYKKworI2lmIChERUJVR19HTEJfTFZMKCkgJiBERUJVR19MVkxfMTgpCisjZGVmaW5lIERFQlVHX0xWTF8xOF9UUkFDRTAoc3RyKSAgICAgICAgICAgICAgICAgICAgVFJBQ0UwKHN0cikKKyNkZWZpbmUgREVCVUdfTFZMXzE4X1RSQUNFMShzdHIscDEpICAgICAgICAgICAgICAgICBUUkFDRTEoc3RyLHAxKQorI2RlZmluZSBERUJVR19MVkxfMThfVFJBQ0UyKHN0cixwMSxwMikgICAgICAgICAgICAgIFRSQUNFMihzdHIscDEscDIpCisjZGVmaW5lIERFQlVHX0xWTF8xOF9UUkFDRTMoc3RyLHAxLHAyLHAzKSAgICAgICAgICAgVFJBQ0UzKHN0cixwMSxwMixwMykKKyNkZWZpbmUgREVCVUdfTFZMXzE4X1RSQUNFNChzdHIscDEscDIscDMscDQpICAgICAgICBUUkFDRTQoc3RyLHAxLHAyLHAzLHA0KQorI2Vsc2UKKyNkZWZpbmUgREVCVUdfTFZMXzE4X1RSQUNFMChzdHIpCisjZGVmaW5lIERFQlVHX0xWTF8xOF9UUkFDRTEoc3RyLHAxKQorI2RlZmluZSBERUJVR19MVkxfMThfVFJBQ0UyKHN0cixwMSxwMikKKyNkZWZpbmUgREVCVUdfTFZMXzE4X1RSQUNFMyhzdHIscDEscDIscDMpCisjZGVmaW5lIERFQlVHX0xWTF8xOF9UUkFDRTQoc3RyLHAxLHAyLHAzLHA0KQorI2VuZGlmCisKKyNpZiAoREVCVUdfR0xCX0xWTCgpICYgREVCVUdfTFZMXzE3KQorI2RlZmluZSBERUJVR19MVkxfMTdfVFJBQ0UwKHN0cikgICAgICAgICAgICAgICAgICAgIFRSQUNFMChzdHIpCisjZGVmaW5lIERFQlVHX0xWTF8xN19UUkFDRTEoc3RyLHAxKSAgICAgICAgICAgICAgICAgVFJBQ0UxKHN0cixwMSkKKyNkZWZpbmUgREVCVUdfTFZMXzE3X1RSQUNFMihzdHIscDEscDIpICAgICAgICAgICAgICBUUkFDRTIoc3RyLHAxLHAyKQorI2RlZmluZSBERUJVR19MVkxfMTdfVFJBQ0UzKHN0cixwMSxwMixwMykgICAgICAgICAgIFRSQUNFMyhzdHIscDEscDIscDMpCisjZGVmaW5lIERFQlVHX0xWTF8xN19UUkFDRTQoc3RyLHAxLHAyLHAzLHA0KSAgICAgICAgVFJBQ0U0KHN0cixwMSxwMixwMyxwNCkKKyNlbHNlCisjZGVmaW5lIERFQlVHX0xWTF8xN19UUkFDRTAoc3RyKQorI2RlZmluZSBERUJVR19MVkxfMTdfVFJBQ0UxKHN0cixwMSkKKyNkZWZpbmUgREVCVUdfTFZMXzE3X1RSQUNFMihzdHIscDEscDIpCisjZGVmaW5lIERFQlVHX0xWTF8xN19UUkFDRTMoc3RyLHAxLHAyLHAzKQorI2RlZmluZSBERUJVR19MVkxfMTdfVFJBQ0U0KHN0cixwMSxwMixwMyxwNCkKKyNlbmRpZgorCisjaWYgKERFQlVHX0dMQl9MVkwoKSAmIERFQlVHX0xWTF8xNikKKyNkZWZpbmUgREVCVUdfTFZMXzE2X1RSQUNFMChzdHIpICAgICAgICAgICAgICAgICAgICBUUkFDRTAoc3RyKQorI2RlZmluZSBERUJVR19MVkxfMTZfVFJBQ0UxKHN0cixwMSkgICAgICAgICAgICAgICAgIFRSQUNFMShzdHIscDEpCisjZGVmaW5lIERFQlVHX0xWTF8xNl9UUkFDRTIoc3RyLHAxLHAyKSAgICAgICAgICAgICAgVFJBQ0UyKHN0cixwMSxwMikKKyNkZWZpbmUgREVCVUdfTFZMXzE2X1RSQUNFMyhzdHIscDEscDIscDMpICAgICAgICAgICBUUkFDRTMoc3RyLHAxLHAyLHAzKQorI2RlZmluZSBERUJVR19MVkxfMTZfVFJBQ0U0KHN0cixwMSxwMixwMyxwNCkgICAgICAgIFRSQUNFNChzdHIscDEscDIscDMscDQpCisjZWxzZQorI2RlZmluZSBERUJVR19MVkxfMTZfVFJBQ0UwKHN0cikKKyNkZWZpbmUgREVCVUdfTFZMXzE2X1RSQUNFMShzdHIscDEpCisjZGVmaW5lIERFQlVHX0xWTF8xNl9UUkFDRTIoc3RyLHAxLHAyKQorI2RlZmluZSBERUJVR19MVkxfMTZfVFJBQ0UzKHN0cixwMSxwMixwMykKKyNkZWZpbmUgREVCVUdfTFZMXzE2X1RSQUNFNChzdHIscDEscDIscDMscDQpCisjZW5kaWYKKworI2lmIChERUJVR19HTEJfTFZMKCkgJiBERUJVR19MVkxfMTUpCisjZGVmaW5lIERFQlVHX0xWTF8xNV9UUkFDRTAoc3RyKSAgICAgICAgICAgICAgICAgICAgVFJBQ0UwKHN0cikKKyNkZWZpbmUgREVCVUdfTFZMXzE1X1RSQUNFMShzdHIscDEpICAgICAgICAgICAgICAgICBUUkFDRTEoc3RyLHAxKQorI2RlZmluZSBERUJVR19MVkxfMTVfVFJBQ0UyKHN0cixwMSxwMikgICAgICAgICAgICAgIFRSQUNFMihzdHIscDEscDIpCisjZGVmaW5lIERFQlVHX0xWTF8xNV9UUkFDRTMoc3RyLHAxLHAyLHAzKSAgICAgICAgICAgVFJBQ0UzKHN0cixwMSxwMixwMykKKyNkZWZpbmUgREVCVUdfTFZMXzE1X1RSQUNFNChzdHIscDEscDIscDMscDQpICAgICAgICBUUkFDRTQoc3RyLHAxLHAyLHAzLHA0KQorI2Vsc2UKKyNkZWZpbmUgREVCVUdfTFZMXzE1X1RSQUNFMChzdHIpCisjZGVmaW5lIERFQlVHX0xWTF8xNV9UUkFDRTEoc3RyLHAxKQorI2RlZmluZSBERUJVR19MVkxfMTVfVFJBQ0UyKHN0cixwMSxwMikKKyNkZWZpbmUgREVCVUdfTFZMXzE1X1RSQUNFMyhzdHIscDEscDIscDMpCisjZGVmaW5lIERFQlVHX0xWTF8xNV9UUkFDRTQoc3RyLHAxLHAyLHAzLHA0KQorI2VuZGlmCisKKyNpZiAoREVCVUdfR0xCX0xWTCgpICYgREVCVUdfTFZMXzE0KQorI2RlZmluZSBERUJVR19MVkxfMTRfVFJBQ0UwKHN0cikgICAgICAgICAgICAgICAgICAgIFRSQUNFMChzdHIpCisjZGVmaW5lIERFQlVHX0xWTF8xNF9UUkFDRTEoc3RyLHAxKSAgICAgICAgICAgICAgICAgVFJBQ0UxKHN0cixwMSkKKyNkZWZpbmUgREVCVUdfTFZMXzE0X1RSQUNFMihzdHIscDEscDIpICAgICAgICAgICAgICBUUkFDRTIoc3RyLHAxLHAyKQorI2RlZmluZSBERUJVR19MVkxfMTRfVFJBQ0UzKHN0cixwMSxwMixwMykgICAgICAgICAgIFRSQUNFMyhzdHIscDEscDIscDMpCisjZGVmaW5lIERFQlVHX0xWTF8xNF9UUkFDRTQoc3RyLHAxLHAyLHAzLHA0KSAgICAgICAgVFJBQ0U0KHN0cixwMSxwMixwMyxwNCkKKyNlbHNlCisjZGVmaW5lIERFQlVHX0xWTF8xNF9UUkFDRTAoc3RyKQorI2RlZmluZSBERUJVR19MVkxfMTRfVFJBQ0UxKHN0cixwMSkKKyNkZWZpbmUgREVCVUdfTFZMXzE0X1RSQUNFMihzdHIscDEscDIpCisjZGVmaW5lIERFQlVHX0xWTF8xNF9UUkFDRTMoc3RyLHAxLHAyLHAzKQorI2RlZmluZSBERUJVR19MVkxfMTRfVFJBQ0U0KHN0cixwMSxwMixwMyxwNCkKKyNlbmRpZgorCisjaWYgKERFQlVHX0dMQl9MVkwoKSAmIERFQlVHX0xWTF8xMykKKyNkZWZpbmUgREVCVUdfTFZMXzEzX1RSQUNFMChzdHIpICAgICAgICAgICAgICAgICAgICBUUkFDRTAoc3RyKQorI2RlZmluZSBERUJVR19MVkxfMTNfVFJBQ0UxKHN0cixwMSkgICAgICAgICAgICAgICAgIFRSQUNFMShzdHIscDEpCisjZGVmaW5lIERFQlVHX0xWTF8xM19UUkFDRTIoc3RyLHAxLHAyKSAgICAgICAgICAgICAgVFJBQ0UyKHN0cixwMSxwMikKKyNkZWZpbmUgREVCVUdfTFZMXzEzX1RSQUNFMyhzdHIscDEscDIscDMpICAgICAgICAgICBUUkFDRTMoc3RyLHAxLHAyLHAzKQorI2RlZmluZSBERUJVR19MVkxfMTNfVFJBQ0U0KHN0cixwMSxwMixwMyxwNCkgICAgICAgIFRSQUNFNChzdHIscDEscDIscDMscDQpCisjZWxzZQorI2RlZmluZSBERUJVR19MVkxfMTNfVFJBQ0UwKHN0cikKKyNkZWZpbmUgREVCVUdfTFZMXzEzX1RSQUNFMShzdHIscDEpCisjZGVmaW5lIERFQlVHX0xWTF8xM19UUkFDRTIoc3RyLHAxLHAyKQorI2RlZmluZSBERUJVR19MVkxfMTNfVFJBQ0UzKHN0cixwMSxwMixwMykKKyNkZWZpbmUgREVCVUdfTFZMXzEzX1RSQUNFNChzdHIscDEscDIscDMscDQpCisjZW5kaWYKKworI2lmIChERUJVR19HTEJfTFZMKCkgJiBERUJVR19MVkxfMTIpCisjZGVmaW5lIERFQlVHX0xWTF8xMl9UUkFDRTAoc3RyKSAgICAgICAgICAgICAgICAgICAgVFJBQ0UwKHN0cikKKyNkZWZpbmUgREVCVUdfTFZMXzEyX1RSQUNFMShzdHIscDEpICAgICAgICAgICAgICAgICBUUkFDRTEoc3RyLHAxKQorI2RlZmluZSBERUJVR19MVkxfMTJfVFJBQ0UyKHN0cixwMSxwMikgICAgICAgICAgICAgIFRSQUNFMihzdHIscDEscDIpCisjZGVmaW5lIERFQlVHX0xWTF8xMl9UUkFDRTMoc3RyLHAxLHAyLHAzKSAgICAgICAgICAgVFJBQ0UzKHN0cixwMSxwMixwMykKKyNkZWZpbmUgREVCVUdfTFZMXzEyX1RSQUNFNChzdHIscDEscDIscDMscDQpICAgICAgICBUUkFDRTQoc3RyLHAxLHAyLHAzLHA0KQorI2Vsc2UKKyNkZWZpbmUgREVCVUdfTFZMXzEyX1RSQUNFMChzdHIpCisjZGVmaW5lIERFQlVHX0xWTF8xMl9UUkFDRTEoc3RyLHAxKQorI2RlZmluZSBERUJVR19MVkxfMTJfVFJBQ0UyKHN0cixwMSxwMikKKyNkZWZpbmUgREVCVUdfTFZMXzEyX1RSQUNFMyhzdHIscDEscDIscDMpCisjZGVmaW5lIERFQlVHX0xWTF8xMl9UUkFDRTQoc3RyLHAxLHAyLHAzLHA0KQorI2VuZGlmCisKKyNpZiAoREVCVUdfR0xCX0xWTCgpICYgREVCVUdfTFZMXzExKQorI2RlZmluZSBERUJVR19MVkxfMTFfVFJBQ0UwKHN0cikgICAgICAgICAgICAgICAgICAgIFRSQUNFMChzdHIpCisjZGVmaW5lIERFQlVHX0xWTF8xMV9UUkFDRTEoc3RyLHAxKSAgICAgICAgICAgICAgICAgVFJBQ0UxKHN0cixwMSkKKyNkZWZpbmUgREVCVUdfTFZMXzExX1RSQUNFMihzdHIscDEscDIpICAgICAgICAgICAgICBUUkFDRTIoc3RyLHAxLHAyKQorI2RlZmluZSBERUJVR19MVkxfMTFfVFJBQ0UzKHN0cixwMSxwMixwMykgICAgICAgICAgIFRSQUNFMyhzdHIscDEscDIscDMpCisjZGVmaW5lIERFQlVHX0xWTF8xMV9UUkFDRTQoc3RyLHAxLHAyLHAzLHA0KSAgICAgICAgVFJBQ0U0KHN0cixwMSxwMixwMyxwNCkKKyNlbHNlCisjZGVmaW5lIERFQlVHX0xWTF8xMV9UUkFDRTAoc3RyKQorI2RlZmluZSBERUJVR19MVkxfMTFfVFJBQ0UxKHN0cixwMSkKKyNkZWZpbmUgREVCVUdfTFZMXzExX1RSQUNFMihzdHIscDEscDIpCisjZGVmaW5lIERFQlVHX0xWTF8xMV9UUkFDRTMoc3RyLHAxLHAyLHAzKQorI2RlZmluZSBERUJVR19MVkxfMTFfVFJBQ0U0KHN0cixwMSxwMixwMyxwNCkKKyNlbmRpZgorCisjaWYgKERFQlVHX0dMQl9MVkwoKSAmIERFQlVHX0xWTF8xMCkKKyNkZWZpbmUgREVCVUdfTFZMXzEwX1RSQUNFMChzdHIpICAgICAgICAgICAgICAgICAgICBUUkFDRTAoc3RyKQorI2RlZmluZSBERUJVR19MVkxfMTBfVFJBQ0UxKHN0cixwMSkgICAgICAgICAgICAgICAgIFRSQUNFMShzdHIscDEpCisjZGVmaW5lIERFQlVHX0xWTF8xMF9UUkFDRTIoc3RyLHAxLHAyKSAgICAgICAgICAgICAgVFJBQ0UyKHN0cixwMSxwMikKKyNkZWZpbmUgREVCVUdfTFZMXzEwX1RSQUNFMyhzdHIscDEscDIscDMpICAgICAgICAgICBUUkFDRTMoc3RyLHAxLHAyLHAzKQorI2RlZmluZSBERUJVR19MVkxfMTBfVFJBQ0U0KHN0cixwMSxwMixwMyxwNCkgICAgICAgIFRSQUNFNChzdHIscDEscDIscDMscDQpCisjZWxzZQorI2RlZmluZSBERUJVR19MVkxfMTBfVFJBQ0UwKHN0cikKKyNkZWZpbmUgREVCVUdfTFZMXzEwX1RSQUNFMShzdHIscDEpCisjZGVmaW5lIERFQlVHX0xWTF8xMF9UUkFDRTIoc3RyLHAxLHAyKQorI2RlZmluZSBERUJVR19MVkxfMTBfVFJBQ0UzKHN0cixwMSxwMixwMykKKyNkZWZpbmUgREVCVUdfTFZMXzEwX1RSQUNFNChzdHIscDEscDIscDMscDQpCisjZW5kaWYKKworI2lmIChERUJVR19HTEJfTFZMKCkgJiBERUJVR19MVkxfMDkpCisjZGVmaW5lIERFQlVHX0xWTF8wOV9UUkFDRTAoc3RyKSAgICAgICAgICAgICAgICAgICAgVFJBQ0UwKHN0cikKKyNkZWZpbmUgREVCVUdfTFZMXzA5X1RSQUNFMShzdHIscDEpICAgICAgICAgICAgICAgICBUUkFDRTEoc3RyLHAxKQorI2RlZmluZSBERUJVR19MVkxfMDlfVFJBQ0UyKHN0cixwMSxwMikgICAgICAgICAgICAgIFRSQUNFMihzdHIscDEscDIpCisjZGVmaW5lIERFQlVHX0xWTF8wOV9UUkFDRTMoc3RyLHAxLHAyLHAzKSAgICAgICAgICAgVFJBQ0UzKHN0cixwMSxwMixwMykKKyNkZWZpbmUgREVCVUdfTFZMXzA5X1RSQUNFNChzdHIscDEscDIscDMscDQpICAgICAgICBUUkFDRTQoc3RyLHAxLHAyLHAzLHA0KQorI2Vsc2UKKyNkZWZpbmUgREVCVUdfTFZMXzA5X1RSQUNFMChzdHIpCisjZGVmaW5lIERFQlVHX0xWTF8wOV9UUkFDRTEoc3RyLHAxKQorI2RlZmluZSBERUJVR19MVkxfMDlfVFJBQ0UyKHN0cixwMSxwMikKKyNkZWZpbmUgREVCVUdfTFZMXzA5X1RSQUNFMyhzdHIscDEscDIscDMpCisjZGVmaW5lIERFQlVHX0xWTF8wOV9UUkFDRTQoc3RyLHAxLHAyLHAzLHA0KQorI2VuZGlmCisKKyNpZiAoREVCVUdfR0xCX0xWTCgpICYgREVCVUdfTFZMXzA4KQorI2RlZmluZSBERUJVR19MVkxfMDhfVFJBQ0UwKHN0cikgICAgICAgICAgICAgICAgICAgIFRSQUNFMChzdHIpCisjZGVmaW5lIERFQlVHX0xWTF8wOF9UUkFDRTEoc3RyLHAxKSAgICAgICAgICAgICAgICAgVFJBQ0UxKHN0cixwMSkKKyNkZWZpbmUgREVCVUdfTFZMXzA4X1RSQUNFMihzdHIscDEscDIpICAgICAgICAgICAgICBUUkFDRTIoc3RyLHAxLHAyKQorI2RlZmluZSBERUJVR19MVkxfMDhfVFJBQ0UzKHN0cixwMSxwMixwMykgICAgICAgICAgIFRSQUNFMyhzdHIscDEscDIscDMpCisjZGVmaW5lIERFQlVHX0xWTF8wOF9UUkFDRTQoc3RyLHAxLHAyLHAzLHA0KSAgICAgICAgVFJBQ0U0KHN0cixwMSxwMixwMyxwNCkKKyNlbHNlCisjZGVmaW5lIERFQlVHX0xWTF8wOF9UUkFDRTAoc3RyKQorI2RlZmluZSBERUJVR19MVkxfMDhfVFJBQ0UxKHN0cixwMSkKKyNkZWZpbmUgREVCVUdfTFZMXzA4X1RSQUNFMihzdHIscDEscDIpCisjZGVmaW5lIERFQlVHX0xWTF8wOF9UUkFDRTMoc3RyLHAxLHAyLHAzKQorI2RlZmluZSBERUJVR19MVkxfMDhfVFJBQ0U0KHN0cixwMSxwMixwMyxwNCkKKyNlbmRpZgorCisjaWYgKERFQlVHX0dMQl9MVkwoKSAmIERFQlVHX0xWTF8wNykKKyNkZWZpbmUgREVCVUdfTFZMXzA3X1RSQUNFMChzdHIpICAgICAgICAgICAgICAgICAgICBUUkFDRTAoc3RyKQorI2RlZmluZSBERUJVR19MVkxfMDdfVFJBQ0UxKHN0cixwMSkgICAgICAgICAgICAgICAgIFRSQUNFMShzdHIscDEpCisjZGVmaW5lIERFQlVHX0xWTF8wN19UUkFDRTIoc3RyLHAxLHAyKSAgICAgICAgICAgICAgVFJBQ0UyKHN0cixwMSxwMikKKyNkZWZpbmUgREVCVUdfTFZMXzA3X1RSQUNFMyhzdHIscDEscDIscDMpICAgICAgICAgICBUUkFDRTMoc3RyLHAxLHAyLHAzKQorI2RlZmluZSBERUJVR19MVkxfMDdfVFJBQ0U0KHN0cixwMSxwMixwMyxwNCkgICAgICAgIFRSQUNFNChzdHIscDEscDIscDMscDQpCisjZWxzZQorI2RlZmluZSBERUJVR19MVkxfMDdfVFJBQ0UwKHN0cikKKyNkZWZpbmUgREVCVUdfTFZMXzA3X1RSQUNFMShzdHIscDEpCisjZGVmaW5lIERFQlVHX0xWTF8wN19UUkFDRTIoc3RyLHAxLHAyKQorI2RlZmluZSBERUJVR19MVkxfMDdfVFJBQ0UzKHN0cixwMSxwMixwMykKKyNkZWZpbmUgREVCVUdfTFZMXzA3X1RSQUNFNChzdHIscDEscDIscDMscDQpCisjZW5kaWYKKworI2lmIChERUJVR19HTEJfTFZMKCkgJiBERUJVR19MVkxfMDYpCisjZGVmaW5lIERFQlVHX0xWTF8wNl9UUkFDRTAoc3RyKSAgICAgICAgICAgICAgICAgICAgVFJBQ0UwKHN0cikKKyNkZWZpbmUgREVCVUdfTFZMXzA2X1RSQUNFMShzdHIscDEpICAgICAgICAgICAgICAgICBUUkFDRTEoc3RyLHAxKQorI2RlZmluZSBERUJVR19MVkxfMDZfVFJBQ0UyKHN0cixwMSxwMikgICAgICAgICAgICAgIFRSQUNFMihzdHIscDEscDIpCisjZGVmaW5lIERFQlVHX0xWTF8wNl9UUkFDRTMoc3RyLHAxLHAyLHAzKSAgICAgICAgICAgVFJBQ0UzKHN0cixwMSxwMixwMykKKyNkZWZpbmUgREVCVUdfTFZMXzA2X1RSQUNFNChzdHIscDEscDIscDMscDQpICAgICAgICBUUkFDRTQoc3RyLHAxLHAyLHAzLHA0KQorI2Vsc2UKKyNkZWZpbmUgREVCVUdfTFZMXzA2X1RSQUNFMChzdHIpCisjZGVmaW5lIERFQlVHX0xWTF8wNl9UUkFDRTEoc3RyLHAxKQorI2RlZmluZSBERUJVR19MVkxfMDZfVFJBQ0UyKHN0cixwMSxwMikKKyNkZWZpbmUgREVCVUdfTFZMXzA2X1RSQUNFMyhzdHIscDEscDIscDMpCisjZGVmaW5lIERFQlVHX0xWTF8wNl9UUkFDRTQoc3RyLHAxLHAyLHAzLHA0KQorI2VuZGlmCisKKyNpZiAoREVCVUdfR0xCX0xWTCgpICYgREVCVUdfTFZMXzA1KQorI2RlZmluZSBERUJVR19MVkxfMDVfVFJBQ0UwKHN0cikgICAgICAgICAgICAgICAgICAgIFRSQUNFMChzdHIpCisjZGVmaW5lIERFQlVHX0xWTF8wNV9UUkFDRTEoc3RyLHAxKSAgICAgICAgICAgICAgICAgVFJBQ0UxKHN0cixwMSkKKyNkZWZpbmUgREVCVUdfTFZMXzA1X1RSQUNFMihzdHIscDEscDIpICAgICAgICAgICAgICBUUkFDRTIoc3RyLHAxLHAyKQorI2RlZmluZSBERUJVR19MVkxfMDVfVFJBQ0UzKHN0cixwMSxwMixwMykgICAgICAgICAgIFRSQUNFMyhzdHIscDEscDIscDMpCisjZGVmaW5lIERFQlVHX0xWTF8wNV9UUkFDRTQoc3RyLHAxLHAyLHAzLHA0KSAgICAgICAgVFJBQ0U0KHN0cixwMSxwMixwMyxwNCkKKyNlbHNlCisjZGVmaW5lIERFQlVHX0xWTF8wNV9UUkFDRTAoc3RyKQorI2RlZmluZSBERUJVR19MVkxfMDVfVFJBQ0UxKHN0cixwMSkKKyNkZWZpbmUgREVCVUdfTFZMXzA1X1RSQUNFMihzdHIscDEscDIpCisjZGVmaW5lIERFQlVHX0xWTF8wNV9UUkFDRTMoc3RyLHAxLHAyLHAzKQorI2RlZmluZSBERUJVR19MVkxfMDVfVFJBQ0U0KHN0cixwMSxwMixwMyxwNCkKKyNlbmRpZgorCisjaWYgKERFQlVHX0dMQl9MVkwoKSAmIERFQlVHX0xWTF8wNCkKKyNkZWZpbmUgREVCVUdfTFZMXzA0X1RSQUNFMChzdHIpICAgICAgICAgICAgICAgICAgICBUUkFDRTAoc3RyKQorI2RlZmluZSBERUJVR19MVkxfMDRfVFJBQ0UxKHN0cixwMSkgICAgICAgICAgICAgICAgIFRSQUNFMShzdHIscDEpCisjZGVmaW5lIERFQlVHX0xWTF8wNF9UUkFDRTIoc3RyLHAxLHAyKSAgICAgICAgICAgICAgVFJBQ0UyKHN0cixwMSxwMikKKyNkZWZpbmUgREVCVUdfTFZMXzA0X1RSQUNFMyhzdHIscDEscDIscDMpICAgICAgICAgICBUUkFDRTMoc3RyLHAxLHAyLHAzKQorI2RlZmluZSBERUJVR19MVkxfMDRfVFJBQ0U0KHN0cixwMSxwMixwMyxwNCkgICAgICAgIFRSQUNFNChzdHIscDEscDIscDMscDQpCisjZWxzZQorI2RlZmluZSBERUJVR19MVkxfMDRfVFJBQ0UwKHN0cikKKyNkZWZpbmUgREVCVUdfTFZMXzA0X1RSQUNFMShzdHIscDEpCisjZGVmaW5lIERFQlVHX0xWTF8wNF9UUkFDRTIoc3RyLHAxLHAyKQorI2RlZmluZSBERUJVR19MVkxfMDRfVFJBQ0UzKHN0cixwMSxwMixwMykKKyNkZWZpbmUgREVCVUdfTFZMXzA0X1RSQUNFNChzdHIscDEscDIscDMscDQpCisjZW5kaWYKKworI2lmIChERUJVR19HTEJfTFZMKCkgJiBERUJVR19MVkxfMDMpCisjZGVmaW5lIERFQlVHX0xWTF8wM19UUkFDRTAoc3RyKSAgICAgICAgICAgICAgICAgICAgVFJBQ0UwKHN0cikKKyNkZWZpbmUgREVCVUdfTFZMXzAzX1RSQUNFMShzdHIscDEpICAgICAgICAgICAgICAgICBUUkFDRTEoc3RyLHAxKQorI2RlZmluZSBERUJVR19MVkxfMDNfVFJBQ0UyKHN0cixwMSxwMikgICAgICAgICAgICAgIFRSQUNFMihzdHIscDEscDIpCisjZGVmaW5lIERFQlVHX0xWTF8wM19UUkFDRTMoc3RyLHAxLHAyLHAzKSAgICAgICAgICAgVFJBQ0UzKHN0cixwMSxwMixwMykKKyNkZWZpbmUgREVCVUdfTFZMXzAzX1RSQUNFNChzdHIscDEscDIscDMscDQpICAgICAgICBUUkFDRTQoc3RyLHAxLHAyLHAzLHA0KQorI2Vsc2UKKyNkZWZpbmUgREVCVUdfTFZMXzAzX1RSQUNFMChzdHIpCisjZGVmaW5lIERFQlVHX0xWTF8wM19UUkFDRTEoc3RyLHAxKQorI2RlZmluZSBERUJVR19MVkxfMDNfVFJBQ0UyKHN0cixwMSxwMikKKyNkZWZpbmUgREVCVUdfTFZMXzAzX1RSQUNFMyhzdHIscDEscDIscDMpCisjZGVmaW5lIERFQlVHX0xWTF8wM19UUkFDRTQoc3RyLHAxLHAyLHAzLHA0KQorI2VuZGlmCisKKyNpZiAoREVCVUdfR0xCX0xWTCgpICYgREVCVUdfTFZMXzAyKQorI2RlZmluZSBERUJVR19MVkxfMDJfVFJBQ0UwKHN0cikgICAgICAgICAgICAgICAgICAgIFRSQUNFMChzdHIpCisjZGVmaW5lIERFQlVHX0xWTF8wMl9UUkFDRTEoc3RyLHAxKSAgICAgICAgICAgICAgICAgVFJBQ0UxKHN0cixwMSkKKyNkZWZpbmUgREVCVUdfTFZMXzAyX1RSQUNFMihzdHIscDEscDIpICAgICAgICAgICAgICBUUkFDRTIoc3RyLHAxLHAyKQorI2RlZmluZSBERUJVR19MVkxfMDJfVFJBQ0UzKHN0cixwMSxwMixwMykgICAgICAgICAgIFRSQUNFMyhzdHIscDEscDIscDMpCisjZGVmaW5lIERFQlVHX0xWTF8wMl9UUkFDRTQoc3RyLHAxLHAyLHAzLHA0KSAgICAgICAgVFJBQ0U0KHN0cixwMSxwMixwMyxwNCkKKyNlbHNlCisjZGVmaW5lIERFQlVHX0xWTF8wMl9UUkFDRTAoc3RyKQorI2RlZmluZSBERUJVR19MVkxfMDJfVFJBQ0UxKHN0cixwMSkKKyNkZWZpbmUgREVCVUdfTFZMXzAyX1RSQUNFMihzdHIscDEscDIpCisjZGVmaW5lIERFQlVHX0xWTF8wMl9UUkFDRTMoc3RyLHAxLHAyLHAzKQorI2RlZmluZSBERUJVR19MVkxfMDJfVFJBQ0U0KHN0cixwMSxwMixwMyxwNCkKKyNlbmRpZgorCisjaWYgKERFQlVHX0dMQl9MVkwoKSAmIERFQlVHX0xWTF8wMSkKKyNkZWZpbmUgREVCVUdfTFZMXzAxX1RSQUNFMChzdHIpICAgICAgICAgICAgICAgICAgICBUUkFDRTAoc3RyKQorI2RlZmluZSBERUJVR19MVkxfMDFfVFJBQ0UxKHN0cixwMSkgICAgICAgICAgICAgICAgIFRSQUNFMShzdHIscDEpCisjZGVmaW5lIERFQlVHX0xWTF8wMV9UUkFDRTIoc3RyLHAxLHAyKSAgICAgICAgICAgICAgVFJBQ0UyKHN0cixwMSxwMikKKyNkZWZpbmUgREVCVUdfTFZMXzAxX1RSQUNFMyhzdHIscDEscDIscDMpICAgICAgICAgICBUUkFDRTMoc3RyLHAxLHAyLHAzKQorI2RlZmluZSBERUJVR19MVkxfMDFfVFJBQ0U0KHN0cixwMSxwMixwMyxwNCkgICAgICAgIFRSQUNFNChzdHIscDEscDIscDMscDQpCisjZWxzZQorI2RlZmluZSBERUJVR19MVkxfMDFfVFJBQ0UwKHN0cikKKyNkZWZpbmUgREVCVUdfTFZMXzAxX1RSQUNFMShzdHIscDEpCisjZGVmaW5lIERFQlVHX0xWTF8wMV9UUkFDRTIoc3RyLHAxLHAyKQorI2RlZmluZSBERUJVR19MVkxfMDFfVFJBQ0UzKHN0cixwMSxwMixwMykKKyNkZWZpbmUgREVCVUdfTFZMXzAxX1RSQUNFNChzdHIscDEscDIscDMscDQpCisjZW5kaWYKKworI2RlZmluZSBERUJVR19UUkFDRTAobHZsLHN0cikgICAgICAgICAgICAgICAgICAgICAgICAgICBsdmwjI19UUkFDRTAoc3RyKQorI2RlZmluZSBERUJVR19UUkFDRTEobHZsLHN0cixwMSkgICAgICAgICAgICAgICAgICAgICAgICBsdmwjI19UUkFDRTEoc3RyLHAxKQorI2RlZmluZSBERUJVR19UUkFDRTIobHZsLHN0cixwMSxwMikgICAgICAgICAgICAgICAgICAgICBsdmwjI19UUkFDRTIoc3RyLHAxLHAyKQorI2RlZmluZSBERUJVR19UUkFDRTMobHZsLHN0cixwMSxwMixwMykgICAgICAgICAgICAgICAgICBsdmwjI19UUkFDRTMoc3RyLHAxLHAyLHAzKQorI2RlZmluZSBERUJVR19UUkFDRTQobHZsLHN0cixwMSxwMixwMyxwNCkgICAgICAgICAgICAgICBsdmwjI19UUkFDRTQoc3RyLHAxLHAyLHAzLHA0KQorCisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFRoZSBtYWNybyBERUJVR19EVU1QX0RBVEEoKSBjYW4gYmUgdXNlZCB3aXRoIHRoZSBzYW1lIGRlYnVnLWxldmVscyB0byBkdW1wCisvLyBvdXQgZGF0YSBieXRlcy4gRnVuY3Rpb24gRHVtcERhdGEoKSBoYXMgdG8gYmUgaW5jbHVkZWQuCisvLyBOT1RFOiBEVU1QX0RBVEEgaGFzIHRvIGJlIGRlZmluZWQgaW4gcHJvamVjdCBzZXR0aW5ncy4KKyNpZiAoIWRlZmluZWQgKE5ERUJVRykgJiYgZGVmaW5lZCAoRFVNUF9EQVRBKSkgfHwgKERFVl9TWVNURU0gPT0gX0RFVl9XSU4zMl8pCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworCXZvaWQgRHVtcERhdGEoY2hhciAqc3pTdHJfcCwgQllURSBNRU0gKiBwYkRhdGFfcCwgV09SRCB3U2l6ZV9wKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CQkJCS8vIHZvbiBleHRlcm4gIkMiCisjZW5kaWYKKyNkZWZpbmUgREVCVUdfRFVNUF9EQVRBKGx2bCxzdHIscHRyLHNpeikgICAgaWYgKChERUJVR19HTEJfTFZMKCkgJiAobHZsKSk9PShsdmwpKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRHVtcERhdGEgKHN0ciwgKEJZVEUgTUVNKikgKHB0ciksIChXT1JEKSAoc2l6KSk7CisjZWxzZQorCisjZGVmaW5lIERFQlVHX0RVTVBfREFUQShsdmwsc3RyLHB0cixzaXopCisKKyNlbmRpZgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVGhlIG1hY3JvIERFQlVHX0FTU0VSVCgpIGNhbiBiZSB1c2VkIHRvIHByaW50IG91dCBhbiBlcnJvciBzdHJpbmcgaWYgdGhlCisvLyBwYXJhbWV0ZXJlZCBleHByZXNpb24gZG9lcyBub3QgcmVzdWx0IFRSVUUuCisvLyBOT1RFOiBJZiBERUJVR19LRUVQX0FTU0VSVCBpcyBkZWZpbmVkLCB0aGVuIERFQlVHX0FTU0VSVC1saW5lIHdpbGwgbm90IGJlCisvLyAgICAgICBkZWxldGVkIGZyb20gY29tcGlsZXIgKGluIHJlbGVhc2UgdmVyc2lvbiB0b28pLgorI2lmICFkZWZpbmVkIChOREVCVUcpIHx8IGRlZmluZWQgKERFQlVHX0tFRVBfQVNTRVJUKQorCisjaWYgKERFVl9TWVNURU0gPT0gX0RFVl9XSU4zMl8pCisKKwkvLyBGb3IgV0lOMzIgcHJvY2VzcyB3aWxsIGJlIGtpbGxlZCBhZnRlciBjbG9zaW5nIG1lc3NhZ2UgYm94LgorCisjZGVmaW5lIERFQlVHX0FTU0VSVDAoZXhwcixzdHIpICAgICAgICAgaWYgKCEoZXhwciApICYmICgoREVCVUdfR0xCX0xWTCgpICYgREVCVUdfTFZMX0FTU0VSVCkhPTApKSB7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlQm94IChOVUxMLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBc3NlcnRpb24gZmFpbGVkOiBsaW5lICIgX19MSU5FX18gIiBmaWxlICIgX19GSUxFX18gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXG4gICAgLT4gIiBzdHIgIlxuIik7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeGl0UHJvY2VzcyAoLTEpOyB9CisKKyNkZWZpbmUgREVCVUdfQVNTRVJUMShleHByLHN0cixwMSkgICAgICBpZiAoIShleHByICkgJiYgKChERUJVR19HTEJfTFZMKCkgJiBERUJVR19MVkxfQVNTRVJUKSE9MCkpIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VCb3ggKE5VTEwsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFzc2VydGlvbiBmYWlsZWQ6IGxpbmUgIiBfX0xJTkVfXyAiIGZpbGUgIiBfX0ZJTEVfXyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcbiAgICAtPiAiIHN0ciAiXG4iKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4aXRQcm9jZXNzICgtMSk7IH0KKworI2Vsc2UKKworCS8vIEZvciBtaWNyb2NvbnRyb2xsZXJzIHByb2Nlc3Mgd2lsbCBiZSBzdG9wcGVkIHVzaW5nIGVuZGxlc3MgbG9vcC4KKworI2RlZmluZSBERUJVR19BU1NFUlQwKGV4cHIsc3RyKSAgICAgICAgIGlmICghKGV4cHIgKSkgeyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdfTFZMX0FTU0VSVF9UUkFDRTMgKCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBc3NlcnRpb24gZmFpbGVkOiBsaW5lICVkIGZpbGUgJyVzJ1xuIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgLT4gJyVzJ1xuIiwgX19MSU5FX18sIF9fRklMRV9fLCBzdHIpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKDEpOyB9CisKKyNkZWZpbmUgREVCVUdfQVNTRVJUMShleHByLHN0cixwMSkgICAgICBpZiAoIShleHByICkpIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX0xWTF9BU1NFUlRfVFJBQ0U0ICggXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQXNzZXJ0aW9uIGZhaWxlZDogbGluZSAlZCBmaWxlICclcydcbiIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgIC0+ICclcydcbiIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgIC0+IDB4JTA4bFhcbiIsIF9fTElORV9fLCBfX0ZJTEVfXywgc3RyLCAoRFdPUkQpIHAxKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICgxKTsgfQorCisjZW5kaWYKKworI2Vsc2UKKworI2RlZmluZSBERUJVR19BU1NFUlQwKGV4cHIsc3RyKQorI2RlZmluZSBERUJVR19BU1NFUlQxKGV4cHIsc3RyLHAxKQorCisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFRoZSBtYWNybyBERUJVR19PTkxZKCkgaW1wbGVtZW50cyBjb2RlLCBpZiBOREVCVUcgaXMgbm90IGRlZmluZWQuCisjaWYgIWRlZmluZWQgKERFQlVHX09OTFkpCisjaWYgIWRlZmluZWQgKE5ERUJVRykKKworI2RlZmluZSBERUJVR19PTkxZKGV4cHIpICAgIGV4cHIKKworI2Vsc2UKKworI2RlZmluZSBERUJVR19PTkxZKGV4cHIpCisKKyNlbmRpZgorI2VuZGlmCisKKyNlbmRpZiAvLyBfREVCVUdfSF8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwvRWRydjgxMzkuYyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRWRydjgxMzkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTYzNTRhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FZHJ2ODEzOS5jCkBAIC0wLDAgKzEsMTI1MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIEV0aGVybmV0IGRyaXZlciBmb3IgUmVhbHRlayBSVEw4MTM5IGNoaXBzCisgICAgICAgICAgICAgICAgZXhjZXB0IHRoZSBSVEw4MTM5QyssIGJlY2F1c2UgaXQgaGFzIGEgZGlmZmVyZW50CisgICAgICAgICAgICAgICAgVHggZGVzY3JpcHRvciBoYW5kbGluZy4KKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgICAgICAgICRSQ1NmaWxlOiBFZHJ2ODEzOS5jLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS4xMCAkICAkRGF0ZTogMjAwOC8xMS8yMSAwOTowMDozOCAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICBEZXYgQysrIGFuZCBHTlUtQ29tcGlsZXIgZm9yIG02OGsKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUmV2aXNpb24gSGlzdG9yeToKKworICAyMDA4LzAyLzA1IGQuay46ICAgc3RhcnQgb2YgaW1wbGVtZW50YXRpb24KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgImdsb2JhbC5oIgorI2luY2x1ZGUgIkVwbEluYy5oIgorI2luY2x1ZGUgImVkcnYuaCIKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIEcgTCBPIEIgQSBMICAgRCBFIEYgSSBOIEkgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8vIEJ1ZmZlciBoYW5kbGluZzoKKy8vIEFsbCBidWZmZXJzIGFyZSBjcmVhdGVkIHN0YXRpY2FsbHkgKGkuZS4gYXQgY29tcGlsZSB0aW1lIHJlc3AuIGF0CisvLyBpbml0aWFsaXNhdGlvbiB2aWEga21hbGxvYygpICkgYW5kIG5vdCBkeW5hbWljYWxseSBvbiByZXF1ZXN0IChpLmUuIHZpYQorLy8gRWRydkFsbG9jVHhNc2dCdWZmZXIoKS4KKy8vIEVkcnZBbGxvY1R4TXNnQnVmZmVyKCkgc2VhcmNoZXMgZm9yIGFuIHVudXNlZCBidWZmZXIgd2hpY2ggaXMgbGFyZ2UgZW5vdWdoLgorLy8gRWRydkluaXQoKSBtYXkgYWxsb2NhdGUgc29tZSBidWZmZXJzIHdpdGggc2l6ZXMgbGVzcyB0aGFuIG1heGltdW0gZnJhbWUKKy8vIHNpemUgKGkuZS4gMTUxNCBieXRlcyksIGUuZy4gZm9yIFNvQywgU29BLCBTdGF0dXNSZXNwb25zZSwgSWRlbnRSZXNwb25zZSwKKy8vIE5NVCByZXF1ZXN0cyAvIGNvbW1hbmRzLiBUaGUgbGVzcyB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyIHRoZSBsZXNzIHRoZQorLy8gbnVtYmVyIG9mIHRoZSBidWZmZXIuCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWZuZGVmIEVEUlZfTUFYX1RYX0JVRkZFUlMKKyNkZWZpbmUgRURSVl9NQVhfVFhfQlVGRkVSUyAgICAgMjAKKyNlbmRpZgorCisjZGVmaW5lIEVEUlZfTUFYX0ZSQU1FX1NJWkUgICAgIDB4NjAwCisKKyNkZWZpbmUgRURSVl9SWF9CVUZGRVJfU0laRSAgICAgMHg4NjEwCS8vIDMyIGtCICsgMTYgQnl0ZSArIDEsNSBrQiAoV1JBUCBpcyBlbmFibGVkKQorI2RlZmluZSBFRFJWX1JYX0JVRkZFUl9MRU5HVEggICAoRURSVl9SWF9CVUZGRVJfU0laRSAmIDB4RjgwMCkJLy8gYnVmZmVyIHNpemUgY3V0IGRvd24gdG8gMiBrQiBhbGlnbm1lbnQKKworI2RlZmluZSBFRFJWX1RYX0JVRkZFUl9TSVpFICAgICAoRURSVl9NQVhfVFhfQlVGRkVSUyAqIEVEUlZfTUFYX0ZSQU1FX1NJWkUpCS8vIG4gKiAoTVRVICsgMTQgKyA0KQorCisjZGVmaW5lIERSVl9OQU1FICAgICAgICAgICAgICAgICJlcGwiCisKKyNkZWZpbmUgRURSVl9SRUdXX0lOVF9NQVNLICAgICAgMHgzQwkvLyBpbnRlcnJ1cHQgbWFzayByZWdpc3RlcgorI2RlZmluZSBFRFJWX1JFR1dfSU5UX1NUQVRVUyAgICAweDNFCS8vIGludGVycnVwdCBzdGF0dXMgcmVnaXN0ZXIKKyNkZWZpbmUgRURSVl9SRUdXX0lOVF9ST0sgICAgICAgMHgwMDAxCS8vIFJlY2VpdmUgT0sgaW50ZXJydXB0CisjZGVmaW5lIEVEUlZfUkVHV19JTlRfUkVSICAgICAgIDB4MDAwMgkvLyBSZWNlaXZlIGVycm9yIGludGVycnVwdAorI2RlZmluZSBFRFJWX1JFR1dfSU5UX1RPSyAgICAgICAweDAwMDQJLy8gVHJhbnNtaXQgT0sgaW50ZXJydXB0CisjZGVmaW5lIEVEUlZfUkVHV19JTlRfVEVSICAgICAgIDB4MDAwOAkvLyBUcmFuc21pdCBlcnJvciBpbnRlcnJ1cHQKKyNkZWZpbmUgRURSVl9SRUdXX0lOVF9SWE9WVyAgICAgMHgwMDEwCS8vIFJ4IGJ1ZmZlciBvdmVyZmxvdyBpbnRlcnJ1cHQKKyNkZWZpbmUgRURSVl9SRUdXX0lOVF9QVU4gICAgICAgMHgwMDIwCS8vIFBhY2tldCB1bmRlcnJ1bi8gbGluayBjaGFuZ2UgaW50ZXJydXB0CisjZGVmaW5lIEVEUlZfUkVHV19JTlRfRk9WVyAgICAgIDB4MDA0MAkvLyBSeCBGSUZPIG92ZXJmbG93IGludGVycnVwdAorI2RlZmluZSBFRFJWX1JFR1dfSU5UX0xFTkNIRyAgICAweDIwMDAJLy8gQ2FibGUgbGVuZ3RoIGNoYW5nZSBpbnRlcnJ1cHQKKyNkZWZpbmUgRURSVl9SRUdXX0lOVF9USU1FT1VUICAgMHg0MDAwCS8vIFRpbWUgb3V0IGludGVycnVwdAorI2RlZmluZSBFRFJWX1JFR1dfSU5UX1NFUlIgICAgICAweDgwMDAJLy8gU3lzdGVtIGVycm9yIGludGVycnVwdAorI2RlZmluZSBFRFJWX1JFR1dfSU5UX01BU0tfREVGICAoRURSVl9SRUdXX0lOVF9ST0sgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBFRFJWX1JFR1dfSU5UX1JFUiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEVEUlZfUkVHV19JTlRfVE9LIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRURSVl9SRUdXX0lOVF9URVIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBFRFJWX1JFR1dfSU5UX1JYT1ZXIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRURSVl9SRUdXX0lOVF9GT1ZXIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRURSVl9SRUdXX0lOVF9QVU4gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBFRFJWX1JFR1dfSU5UX1RJTUVPVVQgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBFRFJWX1JFR1dfSU5UX1NFUlIpCS8vIGRlZmF1bHQgaW50ZXJydXB0IG1hc2sKKworI2RlZmluZSBFRFJWX1JFR0JfQ09NTUFORCAgICAgICAweDM3CS8vIGNvbW1hbmQgcmVnaXN0ZXIKKyNkZWZpbmUgRURSVl9SRUdCX0NPTU1BTkRfUlNUICAgMHgxMAorI2RlZmluZSBFRFJWX1JFR0JfQ09NTUFORF9SRSAgICAweDA4CisjZGVmaW5lIEVEUlZfUkVHQl9DT01NQU5EX1RFICAgIDB4MDQKKyNkZWZpbmUgRURSVl9SRUdCX0NPTU1BTkRfQlVGRSAgMHgwMQorCisjZGVmaW5lIEVEUlZfUkVHQl9DTUQ5MzQ2ICAgICAgIDB4NTAJLy8gOTNDNDYgY29tbWFuZCByZWdpc3RlcgorI2RlZmluZSBFRFJWX1JFR0JfQ01EOTM0Nl9MT0NLICAweDAwCS8vIGxvY2sgY29uZmlndXJhdGlvbiByZWdpc3RlcnMKKyNkZWZpbmUgRURSVl9SRUdCX0NNRDkzNDZfVU5MT0NLIDB4QzAJLy8gdW5sb2NrIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzCisKKyNkZWZpbmUgRURSVl9SRUdEV19SQ1IgICAgICAgICAgMHg0NAkvLyBSeCBjb25maWd1cmF0aW9uIHJlZ2lzdGVyCisjZGVmaW5lIEVEUlZfUkVHRFdfUkNSX05PX0ZUSCAgIDB4MDAwMEUwMDAJLy8gbm8gcmVjZWl2ZSBGSUZPIHRocmVzaG9sZAorI2RlZmluZSBFRFJWX1JFR0RXX1JDUl9SQkxFTjMySyAweDAwMDAxMDAwCS8vIDMyIGtCIHJlY2VpdmUgYnVmZmVyCisjZGVmaW5lIEVEUlZfUkVHRFdfUkNSX01YRE1BVU5MIDB4MDAwMDA3MDAJLy8gdW5saW1pdGVkIG1heGltdW0gRE1BIGJ1cnN0IHNpemUKKyNkZWZpbmUgRURSVl9SRUdEV19SQ1JfTk9XUkFQICAgMHgwMDAwMDA4MAkvLyBkbyBub3Qgd3JhcCBmcmFtZSBhdCBlbmQgb2YgYnVmZmVyCisjZGVmaW5lIEVEUlZfUkVHRFdfUkNSX0FFUiAgICAgIDB4MDAwMDAwMjAJLy8gYWNjZXB0IGVycm9yIGZyYW1lcyAoQ1JDLCBhbGlnbm1lbnQsIGNvbGxpZGVkKQorI2RlZmluZSBFRFJWX1JFR0RXX1JDUl9BUiAgICAgICAweDAwMDAwMDEwCS8vIGFjY2VwdCBydW50CisjZGVmaW5lIEVEUlZfUkVHRFdfUkNSX0FCICAgICAgIDB4MDAwMDAwMDgJLy8gYWNjZXB0IGJyb2FkY2FzdCBmcmFtZXMKKyNkZWZpbmUgRURSVl9SRUdEV19SQ1JfQU0gICAgICAgMHgwMDAwMDAwNAkvLyBhY2NlcHQgbXVsdGljYXN0IGZyYW1lcworI2RlZmluZSBFRFJWX1JFR0RXX1JDUl9BUE0gICAgICAweDAwMDAwMDAyCS8vIGFjY2VwdCBwaHlzaWNhbCBtYXRjaCBmcmFtZXMKKyNkZWZpbmUgRURSVl9SRUdEV19SQ1JfQUFQICAgICAgMHgwMDAwMDAwMQkvLyBhY2NlcHQgYWxsIGZyYW1lcworI2RlZmluZSBFRFJWX1JFR0RXX1JDUl9ERUYgICAgICAoRURSVl9SRUdEV19SQ1JfTk9fRlRIIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRURSVl9SRUdEV19SQ1JfUkJMRU4zMksgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBFRFJWX1JFR0RXX1JDUl9NWERNQVVOTCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEVEUlZfUkVHRFdfUkNSX05PV1JBUCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEVEUlZfUkVHRFdfUkNSX0FCIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRURSVl9SRUdEV19SQ1JfQU0gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBFRFJWX1JFR0RXX1JDUl9BUE0pCS8vIGRlZmF1bHQgdmFsdWUKKworI2RlZmluZSBFRFJWX1JFR0RXX1RDUiAgICAgICAgICAweDQwCS8vIFR4IGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIKKyNkZWZpbmUgRURSVl9SRUdEV19UQ1JfVkVSX01BU0sgMHg3Q0MwMDAwMAkvLyBtYXNrIGZvciBoYXJkd2FyZSB2ZXJzaW9uCisjZGVmaW5lIEVEUlZfUkVHRFdfVENSX1ZFUl9DICAgIDB4NzQwMDAwMDAJLy8gUlRMODEzOUMKKyNkZWZpbmUgRURSVl9SRUdEV19UQ1JfVkVSX0QgICAgMHg3NDQwMDAwMAkvLyBSVEw4MTM5RAorI2RlZmluZSBFRFJWX1JFR0RXX1RDUl9JRkc5NiAgICAweDAzMDAwMDAwCS8vIGRlZmF1bHQgaW50ZXJmcmFtZSBnYXAgKDk2MCBucykKKyNkZWZpbmUgRURSVl9SRUdEV19UQ1JfQ1JDICAgICAgMHgwMDAxMDAwMAkvLyBkaXNhYmxlIGFwcGVuZGluZyBvZiBDUkMgYnkgdGhlIGNvbnRyb2xsZXIKKyNkZWZpbmUgRURSVl9SRUdEV19UQ1JfTVhETUFVTkwgMHgwMDAwMDcwMAkvLyBtYXhpbXVtIERNQSBidXJzdCBzaXplIG9mIDIwNDggYgorI2RlZmluZSBFRFJWX1JFR0RXX1RDUl9UWFJFVFJZICAweDAwMDAwMDAwCS8vIDE2IHJldHJpZXMKKyNkZWZpbmUgRURSVl9SRUdEV19UQ1JfREVGICAgICAgKEVEUlZfUkVHRFdfVENSX0lGRzk2IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRURSVl9SRUdEV19UQ1JfTVhETUFVTkwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBFRFJWX1JFR0RXX1RDUl9UWFJFVFJZKQorCisjZGVmaW5lIEVEUlZfUkVHV19NVUxJTlQgICAgICAgIDB4NUMJLy8gbXVsdGlwbGUgaW50ZXJydXB0IHNlbGVjdCByZWdpc3RlcgorCisjZGVmaW5lIEVEUlZfUkVHRFdfTVBDICAgICAgICAgIDB4NEMJLy8gbWlzc2VkIHBhY2tldCBjb3VudGVyIHJlZ2lzdGVyCisKKyNkZWZpbmUgRURSVl9SRUdEV19UU0FEMCAgICAgICAgMHgyMAkvLyBUcmFuc21pdCBzdGFydCBhZGRyZXNzIG9mIGRlc2NyaXB0b3IgMAorI2RlZmluZSBFRFJWX1JFR0RXX1RTQUQxICAgICAgICAweDI0CS8vIFRyYW5zbWl0IHN0YXJ0IGFkZHJlc3Mgb2YgZGVzY3JpcHRvciAxCisjZGVmaW5lIEVEUlZfUkVHRFdfVFNBRDIgICAgICAgIDB4MjgJLy8gVHJhbnNtaXQgc3RhcnQgYWRkcmVzcyBvZiBkZXNjcmlwdG9yIDIKKyNkZWZpbmUgRURSVl9SRUdEV19UU0FEMyAgICAgICAgMHgyQwkvLyBUcmFuc21pdCBzdGFydCBhZGRyZXNzIG9mIGRlc2NyaXB0b3IgMworI2RlZmluZSBFRFJWX1JFR0RXX1RTRDAgICAgICAgICAweDEwCS8vIFRyYW5zbWl0IHN0YXR1cyBvZiBkZXNjcmlwdG9yIDAKKyNkZWZpbmUgRURSVl9SRUdEV19UU0RfQ1JTICAgICAgMHg4MDAwMDAwMAkvLyBDYXJyaWVyIHNlbnNlIGxvc3QKKyNkZWZpbmUgRURSVl9SRUdEV19UU0RfVEFCVCAgICAgMHg0MDAwMDAwMAkvLyBUcmFuc21pdCBBYm9ydAorI2RlZmluZSBFRFJWX1JFR0RXX1RTRF9PV0MgICAgICAweDIwMDAwMDAwCS8vIE91dCBvZiB3aW5kb3cgY29sbGlzaW9uCisjZGVmaW5lIEVEUlZfUkVHRFdfVFNEX1RYVEhfREVGIDB4MDAwMjAwMDAJLy8gVHJhbnNtaXQgRklGTyB0aHJlc2hvbGQgb2YgNjQgYnl0ZXMKKyNkZWZpbmUgRURSVl9SRUdEV19UU0RfVE9LICAgICAgMHgwMDAwODAwMAkvLyBUcmFuc21pdCBPSworI2RlZmluZSBFRFJWX1JFR0RXX1RTRF9UVU4gICAgICAweDAwMDA0MDAwCS8vIFRyYW5zbWl0IEZJRk8gdW5kZXJydW4KKyNkZWZpbmUgRURSVl9SRUdEV19UU0RfT1dOICAgICAgMHgwMDAwMjAwMAkvLyBPd25lcgorCisjZGVmaW5lIEVEUlZfUkVHRFdfUkJTVEFSVCAgICAgIDB4MzAJLy8gUmVjZWl2ZSBidWZmZXIgc3RhcnQgYWRkcmVzcworCisjZGVmaW5lIEVEUlZfUkVHV19DQVBSICAgICAgICAgIDB4MzgJLy8gQ3VycmVudCBhZGRyZXNzIG9mIHBhY2tldCByZWFkCisKKyNkZWZpbmUgRURSVl9SRUdEV19JRFIwICAgICAgICAgMHgwMAkvLyBJRCByZWdpc3RlciAwCisjZGVmaW5lIEVEUlZfUkVHRFdfSURSNCAgICAgICAgIDB4MDQJLy8gSUQgcmVnaXN0ZXIgNAorCisjZGVmaW5lIEVEUlZfUkVHRFdfTUFSMCAgICAgICAgIDB4MDgJLy8gTXVsdGljYXN0IGFkZHJlc3MgcmVnaXN0ZXIgMAorI2RlZmluZSBFRFJWX1JFR0RXX01BUjQgICAgICAgICAweDBDCS8vIE11bHRpY2FzdCBhZGRyZXNzIHJlZ2lzdGVyIDQKKworLy8gZGVmaW5lcyBmb3IgdGhlIHN0YXR1cyB3b3JkIGluIHRoZSByZWNlaXZlIGJ1ZmZlcgorI2RlZmluZSBFRFJWX1JYU1RBVF9NQVIgICAgICAgICAweDgwMDAJLy8gTXVsdGljYXN0IGFkZHJlc3MgcmVjZWl2ZWQKKyNkZWZpbmUgRURSVl9SWFNUQVRfUEFNICAgICAgICAgMHg0MDAwCS8vIFBoeXNpY2FsIGFkZHJlc3MgbWF0Y2hlZAorI2RlZmluZSBFRFJWX1JYU1RBVF9CQVIgICAgICAgICAweDIwMDAJLy8gQnJvYWRjYXN0IGFkZHJlc3MgcmVjZWl2ZWQKKyNkZWZpbmUgRURSVl9SWFNUQVRfSVNFICAgICAgICAgMHgwMDIwCS8vIEludmFsaWQgc3ltYm9sIGVycm9yCisjZGVmaW5lIEVEUlZfUlhTVEFUX1JVTlQgICAgICAgIDB4MDAxMAkvLyBSdW50IHBhY2tldCByZWNlaXZlZAorI2RlZmluZSBFRFJWX1JYU1RBVF9MT05HICAgICAgICAweDAwMDgJLy8gTG9uZyBwYWNrZXQKKyNkZWZpbmUgRURSVl9SWFNUQVRfQ1JDICAgICAgICAgMHgwMDA0CS8vIENSQyBlcnJvcgorI2RlZmluZSBFRFJWX1JYU1RBVF9GQUUgICAgICAgICAweDAwMDIJLy8gRnJhbWUgYWxpZ25tZW50IGVycm9yCisjZGVmaW5lIEVEUlZfUlhTVEFUX1JPSyAgICAgICAgIDB4MDAwMQkvLyBSZWNlaXZlIE9LCisKKyNkZWZpbmUgRURSVl9SRUdEV19XUklURShkd1JlZywgZHdWYWwpICB3cml0ZWwoZHdWYWwsIEVkcnZJbnN0YW5jZV9sLm1fcElvQWRkciArIGR3UmVnKQorI2RlZmluZSBFRFJWX1JFR1dfV1JJVEUoZHdSZWcsIHdWYWwpICAgIHdyaXRldyh3VmFsLCBFZHJ2SW5zdGFuY2VfbC5tX3BJb0FkZHIgKyBkd1JlZykKKyNkZWZpbmUgRURSVl9SRUdCX1dSSVRFKGR3UmVnLCBiVmFsKSAgICB3cml0ZWIoYlZhbCwgRWRydkluc3RhbmNlX2wubV9wSW9BZGRyICsgZHdSZWcpCisjZGVmaW5lIEVEUlZfUkVHRFdfUkVBRChkd1JlZykgICAgICAgICAgcmVhZGwoRWRydkluc3RhbmNlX2wubV9wSW9BZGRyICsgZHdSZWcpCisjZGVmaW5lIEVEUlZfUkVHV19SRUFEKGR3UmVnKSAgICAgICAgICAgcmVhZHcoRWRydkluc3RhbmNlX2wubV9wSW9BZGRyICsgZHdSZWcpCisjZGVmaW5lIEVEUlZfUkVHQl9SRUFEKGR3UmVnKSAgICAgICAgICAgcmVhZGIoRWRydkluc3RhbmNlX2wubV9wSW9BZGRyICsgZHdSZWcpCisKKy8vIFRyYWNlUG9pbnQgc3VwcG9ydCBmb3IgcmVhbHRpbWUtZGVidWdnaW5nCisjaWZkZWYgX0RCR19UUkFDRV9QT0lOVFNfCit2b2lkIFBVQkxJQyBUZ3REYmdTaWduYWxUcmFjZVBvaW50KEJZVEUgYlRyYWNlUG9pbnROdW1iZXJfcCk7Cit2b2lkIFBVQkxJQyBUZ3REYmdQb3N0VHJhY2VWYWx1ZShEV09SRCBkd1RyYWNlVmFsdWVfcCk7CisjZGVmaW5lIFRHVF9EQkdfU0lHTkFMX1RSQUNFX1BPSU5UKHApICAgVGd0RGJnU2lnbmFsVHJhY2VQb2ludChwKQorI2RlZmluZSBUR1RfREJHX1BPU1RfVFJBQ0VfVkFMVUUodikgICAgIFRndERiZ1Bvc3RUcmFjZVZhbHVlKHYpCisjZWxzZQorI2RlZmluZSBUR1RfREJHX1NJR05BTF9UUkFDRV9QT0lOVChwKQorI2RlZmluZSBUR1RfREJHX1BPU1RfVFJBQ0VfVkFMVUUodikKKyNlbmRpZgorCisjZGVmaW5lIEVEUlZfQ09VTlRfU0VORCAgICAgICAgICAgICAgICAgVEdUX0RCR19TSUdOQUxfVFJBQ0VfUE9JTlQoMikKKyNkZWZpbmUgRURSVl9DT1VOVF9USU1FT1VUICAgICAgICAgICAgICBUR1RfREJHX1NJR05BTF9UUkFDRV9QT0lOVCgzKQorI2RlZmluZSBFRFJWX0NPVU5UX1BDSV9FUlIgICAgICAgICAgICAgIFRHVF9EQkdfU0lHTkFMX1RSQUNFX1BPSU5UKDQpCisjZGVmaW5lIEVEUlZfQ09VTlRfVFggICAgICAgICAgICAgICAgICAgVEdUX0RCR19TSUdOQUxfVFJBQ0VfUE9JTlQoNSkKKyNkZWZpbmUgRURSVl9DT1VOVF9SWCAgICAgICAgICAgICAgICAgICBUR1RfREJHX1NJR05BTF9UUkFDRV9QT0lOVCg2KQorI2RlZmluZSBFRFJWX0NPVU5UX0xBVEVDT0xMSVNJT04gICAgICAgIFRHVF9EQkdfU0lHTkFMX1RSQUNFX1BPSU5UKDEwKQorI2RlZmluZSBFRFJWX0NPVU5UX1RYX0NPTF9STCAgICAgICAgICAgIFRHVF9EQkdfU0lHTkFMX1RSQUNFX1BPSU5UKDExKQorI2RlZmluZSBFRFJWX0NPVU5UX1RYX0ZVTiAgICAgICAgICAgICAgIFRHVF9EQkdfU0lHTkFMX1RSQUNFX1BPSU5UKDEyKQorI2RlZmluZSBFRFJWX0NPVU5UX1RYX0VSUiAgICAgICAgICAgICAgIFRHVF9EQkdfU0lHTkFMX1RSQUNFX1BPSU5UKDEzKQorI2RlZmluZSBFRFJWX0NPVU5UX1JYX0NSQyAgICAgICAgICAgICAgIFRHVF9EQkdfU0lHTkFMX1RSQUNFX1BPSU5UKDE0KQorI2RlZmluZSBFRFJWX0NPVU5UX1JYX0VSUiAgICAgICAgICAgICAgIFRHVF9EQkdfU0lHTkFMX1RSQUNFX1BPSU5UKDE1KQorI2RlZmluZSBFRFJWX0NPVU5UX1JYX0ZPVlcgICAgICAgICAgICAgIFRHVF9EQkdfU0lHTkFMX1RSQUNFX1BPSU5UKDE2KQorI2RlZmluZSBFRFJWX0NPVU5UX1JYX1BVTiAgICAgICAgICAgICAgIFRHVF9EQkdfU0lHTkFMX1RSQUNFX1BPSU5UKDE3KQorI2RlZmluZSBFRFJWX0NPVU5UX1JYX0ZBRSAgICAgICAgICAgICAgIFRHVF9EQkdfU0lHTkFMX1RSQUNFX1BPSU5UKDE4KQorI2RlZmluZSBFRFJWX0NPVU5UX1JYX09WVyAgICAgICAgICAgICAgIFRHVF9EQkdfU0lHTkFMX1RSQUNFX1BPSU5UKDE5KQorCisjZGVmaW5lIEVEUlZfVFJBQ0VfQ0FQUih4KSAgICAgICAgICAgICAgVEdUX0RCR19QT1NUX1RSQUNFX1ZBTFVFKCgoeCkgJiAweEZGRkYpIHwgMHgwNjAwMDAwMCkKKyNkZWZpbmUgRURSVl9UUkFDRV9SWF9DUkMoeCkgICAgICAgICAgICBUR1RfREJHX1BPU1RfVFJBQ0VfVkFMVUUoKCh4KSAmIDB4RkZGRikgfCAweDBFMDAwMDAwKQorI2RlZmluZSBFRFJWX1RSQUNFX1JYX0VSUih4KSAgICAgICAgICAgIFRHVF9EQkdfUE9TVF9UUkFDRV9WQUxVRSgoKHgpICYgMHhGRkZGKSB8IDB4MEYwMDAwMDApCisjZGVmaW5lIEVEUlZfVFJBQ0VfUlhfUFVOKHgpICAgICAgICAgICAgVEdUX0RCR19QT1NUX1RSQUNFX1ZBTFVFKCgoeCkgJiAweEZGRkYpIHwgMHgxMTAwMDAwMCkKKyNkZWZpbmUgRURSVl9UUkFDRSh4KSAgICAgICAgICAgICAgICAgICBUR1RfREJHX1BPU1RfVFJBQ0VfVkFMVUUoKCh4KSAmIDB4RkZGRjAwMDApIHwgMHgwMDAwRkVDMCkKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvY2FsIHR5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyoKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgQk9PTCAgICAgICAgICAgIG1fZlVzZWQ7CisgICAgdW5zaWduZWQgaW50ICAgIG1fdWlTaXplOworICAgIE1DRF9idWZEZXNjRmVjICptX3BCdWZEZXNjcjsKKworfSB0RWRydlR4QnVmZmVySW50ZXJuOworKi8KKworLy8gUHJpdmF0ZSBzdHJ1Y3R1cmUKK3R5cGVkZWYgc3RydWN0IHsKKwlzdHJ1Y3QgcGNpX2RldiAqbV9wUGNpRGV2OwkvLyBwb2ludGVyIHRvIFBDSSBkZXZpY2Ugc3RydWN0dXJlCisJdm9pZCAqbV9wSW9BZGRyOwkvLyBwb2ludGVyIHRvIHJlZ2lzdGVyIHNwYWNlIG9mIEV0aGVybmV0IGNvbnRyb2xsZXIKKwlCWVRFICptX3BiUnhCdWY7CS8vIHBvaW50ZXIgdG8gUnggYnVmZmVyCisJZG1hX2FkZHJfdCBtX3BSeEJ1ZkRtYTsKKwlCWVRFICptX3BiVHhCdWY7CS8vIHBvaW50ZXIgdG8gVHggYnVmZmVyCisJZG1hX2FkZHJfdCBtX3BUeEJ1ZkRtYTsKKwlCT09MIG1fYWZUeEJ1ZlVzZWRbRURSVl9NQVhfVFhfQlVGRkVSU107CisJdW5zaWduZWQgaW50IG1fdWlDdXJUeERlc2M7CisKKwl0RWRydkluaXRQYXJhbSBtX0luaXRQYXJhbTsKKwl0RWRydlR4QnVmZmVyICptX3BMYXN0VHJhbnNtaXR0ZWRUeEJ1ZmZlcjsKKworfSB0RWRydkluc3RhbmNlOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIGludCBFZHJ2SW5pdE9uZShzdHJ1Y3QgcGNpX2RldiAqcFBjaURldiwKKwkJICAgICAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICpwSWQpOworCitzdGF0aWMgdm9pZCBFZHJ2UmVtb3ZlT25lKHN0cnVjdCBwY2lfZGV2ICpwUGNpRGV2KTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIG1vZHVsIGdsb2JhbGUgdmFycworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGJ1ZmZlcnMgYW5kIGJ1ZmZlciBkZXNjcmlwdG9ycyBhbmQgcG9pbnRlcnMKKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGFFZHJ2UGNpVGJsW10gPSB7CisJezB4MTBlYywgMHg4MTM5LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKwl7MCx9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgYUVkcnZQY2lUYmwpOworCitzdGF0aWMgdEVkcnZJbnN0YW5jZSBFZHJ2SW5zdGFuY2VfbDsKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIEVkcnZEcml2ZXIgPSB7CisJLm5hbWUgPSBEUlZfTkFNRSwKKwkuaWRfdGFibGUgPSBhRWRydlBjaVRibCwKKwkucHJvYmUgPSBFZHJ2SW5pdE9uZSwKKwkucmVtb3ZlID0gRWRydlJlbW92ZU9uZSwKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIEMgTCBBIFMgUyAgPGVkcnY+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvLworLy8gRGVzY3JpcHRpb246CisvLworLy8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgUCBSIEkgViBBIFQgRSAgIEQgRSBGIEkgTiBJIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvY2FsIHR5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgdmFycworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBCWVRFIEVkcnZDYWxjSGFzaChCWVRFICogcGJNQUNfcCk7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVkcnZJbml0CisvLworLy8gRGVzY3JpcHRpb246IGZ1bmN0aW9uIGZvciBpbml0IG9mIHRoZSBFdGhlcm5ldCBjb250cm9sbGVyCisvLworLy8gUGFyYW1ldGVyczogIHBFZHJ2SW5pdFBhcmFtX3AgICAgPSBwb2ludGVyIHRvIHN0cnVjdCBpbmNsdWRpbmcgdGhlIGluaXQtcGFyYW1ldGVycworLy8KKy8vIFJldHVybnM6ICAgICBFcnJvcmNvZGUgICAgICAgICAgID0ga0VwbFN1Y2Nlc3NmdWwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0ga0VwbE5vUmVzb3VyY2UKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordEVwbEtlcm5lbCBFZHJ2SW5pdCh0RWRydkluaXRQYXJhbSAqIHBFZHJ2SW5pdFBhcmFtX3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisJaW50IGlSZXN1bHQ7CisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCS8vIGNsZWFyIGluc3RhbmNlIHN0cnVjdHVyZQorCUVQTF9NRU1TRVQoJkVkcnZJbnN0YW5jZV9sLCAwLCBzaXplb2YoRWRydkluc3RhbmNlX2wpKTsKKworCS8vIHNhdmUgdGhlIGluaXQgZGF0YQorCUVkcnZJbnN0YW5jZV9sLm1fSW5pdFBhcmFtID0gKnBFZHJ2SW5pdFBhcmFtX3A7CisKKwkvLyByZWdpc3RlciBQQ0kgZHJpdmVyCisJaVJlc3VsdCA9IHBjaV9yZWdpc3Rlcl9kcml2ZXIoJkVkcnZEcml2ZXIpOworCWlmIChpUmVzdWx0ICE9IDApIHsKKwkJcHJpbnRrKCIlcyBwY2lfcmVnaXN0ZXJfZHJpdmVyIGZhaWxlZCB3aXRoICVkXG4iLCBfX2Z1bmNfXywKKwkJICAgICAgIGlSZXN1bHQpOworCQlSZXQgPSBrRXBsTm9SZXNvdXJjZTsKKwkJZ290byBFeGl0OworCX0KKworCWlmIChFZHJ2SW5zdGFuY2VfbC5tX3BQY2lEZXYgPT0gTlVMTCkgeworCQlwcmludGsoIiVzIG1fcFBjaURldj1OVUxMXG4iLCBfX2Z1bmNfXyk7CisJCVJldCA9IGtFcGxOb1Jlc291cmNlOworCQlnb3RvIEV4aXQ7CisJfQorCS8vIHJlYWQgTUFDIGFkZHJlc3MgZnJvbSBjb250cm9sbGVyCisJcHJpbnRrKCIlcyBsb2NhbCBNQUMgPSAiLCBfX2Z1bmNfXyk7CisJZm9yIChpUmVzdWx0ID0gMDsgaVJlc3VsdCA8IDY7IGlSZXN1bHQrKykgeworCQlwRWRydkluaXRQYXJhbV9wLT5tX2FiTXlNYWNBZGRyW2lSZXN1bHRdID0KKwkJICAgIEVEUlZfUkVHQl9SRUFEKChFRFJWX1JFR0RXX0lEUjAgKyBpUmVzdWx0KSk7CisJCXByaW50aygiJTAyWCAiLAorCQkgICAgICAgKHVuc2lnbmVkIGludClwRWRydkluaXRQYXJhbV9wLT5tX2FiTXlNYWNBZGRyW2lSZXN1bHRdKTsKKwl9CisJcHJpbnRrKCJcbiIpOworCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRWRydlNodXRkb3duCisvLworLy8gRGVzY3JpcHRpb246IFNodXRkb3duIHRoZSBFdGhlcm5ldCBjb250cm9sbGVyCisvLworLy8gUGFyYW1ldGVyczogIHZvaWQKKy8vCisvLyBSZXR1cm5zOiAgICAgRXJyb3Jjb2RlICAgPSBrRXBsU3VjY2Vzc2Z1bAorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0RXBsS2VybmVsIEVkcnZTaHV0ZG93bih2b2lkKQoreworCisJLy8gdW5yZWdpc3RlciBQQ0kgZHJpdmVyCisJcHJpbnRrKCIlcyBjYWxsaW5nIHBjaV91bnJlZ2lzdGVyX2RyaXZlcigpXG4iLCBfX2Z1bmNfXyk7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZFZHJ2RHJpdmVyKTsKKworCXJldHVybiBrRXBsU3VjY2Vzc2Z1bDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRWRydkRlZmluZVJ4TWFjQWRkckVudHJ5CisvLworLy8gRGVzY3JpcHRpb246IFNldCBhIG11bHRpY2FzdCBlbnRyeSBpbnRvIHRoZSBFdGhlcm5ldCBjb250cm9sbGVyCisvLworLy8gUGFyYW1ldGVyczogIHBiTWFjQWRkcl9wICAgICA9IHBvaW50ZXIgdG8gbXVsdGljYXN0IGVudHJ5IHRvIHNldAorLy8KKy8vIFJldHVybnM6ICAgICBFcnJvcmNvZGUgICAgICAgPSBrRXBsU3VjY2Vzc2Z1bAorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0RXBsS2VybmVsIEVkcnZEZWZpbmVSeE1hY0FkZHJFbnRyeShCWVRFICogcGJNYWNBZGRyX3ApCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwlEV09SRCBkd0RhdGE7CisJQllURSBiSGFzaDsKKworCWJIYXNoID0gRWRydkNhbGNIYXNoKHBiTWFjQWRkcl9wKTsKKy8qCisgICAgZHdEYXRhID0gZXRoZXJfY3JjKDYsIHBiTWFjQWRkcl9wKTsKKworICAgIHByaW50aygiRWRydkRlZmluZVJ4TWFjQWRkckVudHJ5KCclMDJYOiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWCcpIGhhc2ggPSAldSAvICV1ICBldGhlcl9jcmMgPSAweCUwOGxYXG4iLAorICAgICAgICAoV09SRCkgcGJNYWNBZGRyX3BbMF0sIChXT1JEKSBwYk1hY0FkZHJfcFsxXSwgKFdPUkQpIHBiTWFjQWRkcl9wWzJdLAorICAgICAgICAoV09SRCkgcGJNYWNBZGRyX3BbM10sIChXT1JEKSBwYk1hY0FkZHJfcFs0XSwgKFdPUkQpIHBiTWFjQWRkcl9wWzVdLAorICAgICAgICAoV09SRCkgYkhhc2gsIChXT1JEKSAoZHdEYXRhID4+IDI2KSwgZHdEYXRhKTsKKyovCisJaWYgKGJIYXNoID4gMzEpIHsKKwkJZHdEYXRhID0gRURSVl9SRUdEV19SRUFEKEVEUlZfUkVHRFdfTUFSNCk7CisJCWR3RGF0YSB8PSAxIDw8IChiSGFzaCAtIDMyKTsKKwkJRURSVl9SRUdEV19XUklURShFRFJWX1JFR0RXX01BUjQsIGR3RGF0YSk7CisJfSBlbHNlIHsKKwkJZHdEYXRhID0gRURSVl9SRUdEV19SRUFEKEVEUlZfUkVHRFdfTUFSMCk7CisJCWR3RGF0YSB8PSAxIDw8IGJIYXNoOworCQlFRFJWX1JFR0RXX1dSSVRFKEVEUlZfUkVHRFdfTUFSMCwgZHdEYXRhKTsKKwl9CisKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFZHJ2VW5kZWZpbmVSeE1hY0FkZHJFbnRyeQorLy8KKy8vIERlc2NyaXB0aW9uOiBSZXNldCBhIG11bHRpY2FzdCBlbnRyeSBpbiB0aGUgRXRoZXJuZXQgY29udHJvbGxlcgorLy8KKy8vIFBhcmFtZXRlcnM6ICBwYk1hY0FkZHJfcCAgICAgPSBwb2ludGVyIHRvIG11bHRpY2FzdCBlbnRyeSB0byByZXNldAorLy8KKy8vIFJldHVybnM6ICAgICBFcnJvcmNvZGUgICAgICAgPSBrRXBsU3VjY2Vzc2Z1bAorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0RXBsS2VybmVsIEVkcnZVbmRlZmluZVJ4TWFjQWRkckVudHJ5KEJZVEUgKiBwYk1hY0FkZHJfcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCURXT1JEIGR3RGF0YTsKKwlCWVRFIGJIYXNoOworCisJYkhhc2ggPSBFZHJ2Q2FsY0hhc2gocGJNYWNBZGRyX3ApOworCisJaWYgKGJIYXNoID4gMzEpIHsKKwkJZHdEYXRhID0gRURSVl9SRUdEV19SRUFEKEVEUlZfUkVHRFdfTUFSNCk7CisJCWR3RGF0YSAmPSB+KDEgPDwgKGJIYXNoIC0gMzIpKTsKKwkJRURSVl9SRUdEV19XUklURShFRFJWX1JFR0RXX01BUjQsIGR3RGF0YSk7CisJfSBlbHNlIHsKKwkJZHdEYXRhID0gRURSVl9SRUdEV19SRUFEKEVEUlZfUkVHRFdfTUFSMCk7CisJCWR3RGF0YSAmPSB+KDEgPDwgYkhhc2gpOworCQlFRFJWX1JFR0RXX1dSSVRFKEVEUlZfUkVHRFdfTUFSMCwgZHdEYXRhKTsKKwl9CisKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFZHJ2QWxsb2NUeE1zZ0J1ZmZlcgorLy8KKy8vIERlc2NyaXB0aW9uOiBSZWdpc3RlciBhIFR4LUJ1ZmZlcgorLy8KKy8vIFBhcmFtZXRlcnM6ICBwQnVmZmVyX3AgICA9IHBvaW50ZXIgdG8gQnVmZmVyIHN0cnVjdHVyZQorLy8KKy8vIFJldHVybnM6ICAgICBFcnJvcmNvZGUgICA9IGtFcGxTdWNjZXNzZnVsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgPSBrRXBsRWRydk5vRnJlZUJ1ZkVudHJ5CisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3RFcGxLZXJuZWwgRWRydkFsbG9jVHhNc2dCdWZmZXIodEVkcnZUeEJ1ZmZlciAqIHBCdWZmZXJfcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCURXT1JEIGk7CisKKwlpZiAocEJ1ZmZlcl9wLT5tX3VpTWF4QnVmZmVyTGVuID4gRURSVl9NQVhfRlJBTUVfU0laRSkgeworCQlSZXQgPSBrRXBsRWRydk5vRnJlZUJ1ZkVudHJ5OworCQlnb3RvIEV4aXQ7CisJfQorCS8vIHNlYXJjaCBhIGZyZWUgVHggYnVmZmVyIHdpdGggYXBwcm9wcmlhdGUgc2l6ZQorCWZvciAoaSA9IDA7IGkgPCBFRFJWX01BWF9UWF9CVUZGRVJTOyBpKyspIHsKKwkJaWYgKEVkcnZJbnN0YW5jZV9sLm1fYWZUeEJ1ZlVzZWRbaV0gPT0gRkFMU0UpIHsKKwkJCS8vIGZyZWUgY2hhbm5lbCBmb3VuZAorCQkJRWRydkluc3RhbmNlX2wubV9hZlR4QnVmVXNlZFtpXSA9IFRSVUU7CisJCQlwQnVmZmVyX3AtPm1fdWlCdWZmZXJOdW1iZXIgPSBpOworCQkJcEJ1ZmZlcl9wLT5tX3BiQnVmZmVyID0KKwkJCSAgICBFZHJ2SW5zdGFuY2VfbC5tX3BiVHhCdWYgKworCQkJICAgIChpICogRURSVl9NQVhfRlJBTUVfU0laRSk7CisJCQlwQnVmZmVyX3AtPm1fdWlNYXhCdWZmZXJMZW4gPSBFRFJWX01BWF9GUkFNRV9TSVpFOworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKGkgPj0gRURSVl9NQVhfVFhfQlVGRkVSUykgeworCQlSZXQgPSBrRXBsRWRydk5vRnJlZUJ1ZkVudHJ5OworCQlnb3RvIEV4aXQ7CisJfQorCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRWRydlJlbGVhc2VUeE1zZ0J1ZmZlcgorLy8KKy8vIERlc2NyaXB0aW9uOiBSZWdpc3RlciBhIFR4LUJ1ZmZlcgorLy8KKy8vIFBhcmFtZXRlcnM6ICBwQnVmZmVyX3AgICA9IHBvaW50ZXIgdG8gQnVmZmVyIHN0cnVjdHVyZQorLy8KKy8vIFJldHVybnM6ICAgICBFcnJvcmNvZGUgICA9IGtFcGxTdWNjZXNzZnVsCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3RFcGxLZXJuZWwgRWRydlJlbGVhc2VUeE1zZ0J1ZmZlcih0RWRydlR4QnVmZmVyICogcEJ1ZmZlcl9wKQoreworCXVuc2lnbmVkIGludCB1aUJ1ZmZlck51bWJlcjsKKworCXVpQnVmZmVyTnVtYmVyID0gcEJ1ZmZlcl9wLT5tX3VpQnVmZmVyTnVtYmVyOworCisJaWYgKHVpQnVmZmVyTnVtYmVyIDwgRURSVl9NQVhfVFhfQlVGRkVSUykgeworCQlFZHJ2SW5zdGFuY2VfbC5tX2FmVHhCdWZVc2VkW3VpQnVmZmVyTnVtYmVyXSA9IEZBTFNFOworCX0KKworCXJldHVybiBrRXBsU3VjY2Vzc2Z1bDsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFZHJ2U2VuZFR4TXNnCisvLworLy8gRGVzY3JpcHRpb246IGltbWVkaWF0ZWx5IHN0YXJ0cyB0aGUgdHJhbnNtaXNzaW9uIG9mIHRoZSBidWZmZXIKKy8vCisvLyBQYXJhbWV0ZXJzOiAgcEJ1ZmZlcl9wICAgPSBidWZmZXIgZGVzY3JpcHRvciB0byB0cmFuc21pdAorLy8KKy8vIFJldHVybnM6ICAgICBFcnJvcmNvZGUgICA9IGtFcGxTdWNjZXNzZnVsCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3RFcGxLZXJuZWwgRWRydlNlbmRUeE1zZyh0RWRydlR4QnVmZmVyICogcEJ1ZmZlcl9wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJdW5zaWduZWQgaW50IHVpQnVmZmVyTnVtYmVyOworCURXT1JEIGR3VGVtcDsKKworCXVpQnVmZmVyTnVtYmVyID0gcEJ1ZmZlcl9wLT5tX3VpQnVmZmVyTnVtYmVyOworCisJaWYgKCh1aUJ1ZmZlck51bWJlciA+PSBFRFJWX01BWF9UWF9CVUZGRVJTKQorCSAgICB8fCAoRWRydkluc3RhbmNlX2wubV9hZlR4QnVmVXNlZFt1aUJ1ZmZlck51bWJlcl0gPT0gRkFMU0UpKSB7CisJCVJldCA9IGtFcGxFZHJ2QnVmTm90RXhpc3Rpbmc7CisJCWdvdG8gRXhpdDsKKwl9CisKKwlpZiAoRWRydkluc3RhbmNlX2wubV9wTGFzdFRyYW5zbWl0dGVkVHhCdWZmZXIgIT0gTlVMTCkgewkvLyB0cmFuc21pc3Npb24gaXMgYWxyZWFkeSBhY3RpdmUKKwkJUmV0ID0ga0VwbEludmFsaWRPcGVyYXRpb247CisJCWR3VGVtcCA9CisJCSAgICBFRFJWX1JFR0RXX1JFQUQoKEVEUlZfUkVHRFdfVFNEMCArCisJCQkJICAgICAoRWRydkluc3RhbmNlX2wubV91aUN1clR4RGVzYyAqCisJCQkJICAgICAgc2l6ZW9mKERXT1JEKSkpKTsKKwkJcHJpbnRrKCIlcyBJbnZPcCBUU0QldSA9IDB4JTA4bFgiLCBfX2Z1bmNfXywKKwkJICAgICAgIEVkcnZJbnN0YW5jZV9sLm1fdWlDdXJUeERlc2MsIGR3VGVtcCk7CisJCXByaW50aygiICBDbWQgPSAweCUwMlhcbiIsCisJCSAgICAgICAoV09SRCkgRURSVl9SRUdCX1JFQUQoRURSVl9SRUdCX0NPTU1BTkQpKTsKKwkJZ290byBFeGl0OworCX0KKwkvLyBzYXZlIHBvaW50ZXIgdG8gYnVmZmVyIHN0cnVjdHVyZSBmb3IgVHhIYW5kbGVyCisJRWRydkluc3RhbmNlX2wubV9wTGFzdFRyYW5zbWl0dGVkVHhCdWZmZXIgPSBwQnVmZmVyX3A7CisKKwlFRFJWX0NPVU5UX1NFTkQ7CisKKwkvLyBwYWQgd2l0aCB6ZXJvcyBpZiBuZWNlc3NhcnksIGJlY2F1c2UgY29udHJvbGxlciBkb2VzIG5vdCBkbyBpdAorCWlmIChwQnVmZmVyX3AtPm1fdWlUeE1zZ0xlbiA8IE1JTl9FVEhfU0laRSkgeworCQlFUExfTUVNU0VUKHBCdWZmZXJfcC0+bV9wYkJ1ZmZlciArIHBCdWZmZXJfcC0+bV91aVR4TXNnTGVuLCAwLAorCQkJICAgTUlOX0VUSF9TSVpFIC0gcEJ1ZmZlcl9wLT5tX3VpVHhNc2dMZW4pOworCQlwQnVmZmVyX3AtPm1fdWlUeE1zZ0xlbiA9IE1JTl9FVEhfU0laRTsKKwl9CisJLy8gc2V0IERNQSBhZGRyZXNzIG9mIGJ1ZmZlcgorCUVEUlZfUkVHRFdfV1JJVEUoKEVEUlZfUkVHRFdfVFNBRDAgKworCQkJICAoRWRydkluc3RhbmNlX2wubV91aUN1clR4RGVzYyAqIHNpemVvZihEV09SRCkpKSwKKwkJCSAoRWRydkluc3RhbmNlX2wubV9wVHhCdWZEbWEgKworCQkJICAodWlCdWZmZXJOdW1iZXIgKiBFRFJWX01BWF9GUkFNRV9TSVpFKSkpOworCWR3VGVtcCA9CisJICAgIEVEUlZfUkVHRFdfUkVBRCgoRURSVl9SRUdEV19UU0FEMCArCisJCQkgICAgIChFZHJ2SW5zdGFuY2VfbC5tX3VpQ3VyVHhEZXNjICogc2l6ZW9mKERXT1JEKSkpKTsKKy8vICAgIHByaW50aygiJXMgVFNBRCV1ID0gMHglMDhsWCIsIF9fZnVuY19fLCBFZHJ2SW5zdGFuY2VfbC5tX3VpQ3VyVHhEZXNjLCBkd1RlbXApOworCisJLy8gc3RhcnQgdHJhbnNtaXNzaW9uCisJRURSVl9SRUdEV19XUklURSgoRURSVl9SRUdEV19UU0QwICsKKwkJCSAgKEVkcnZJbnN0YW5jZV9sLm1fdWlDdXJUeERlc2MgKiBzaXplb2YoRFdPUkQpKSksCisJCQkgKEVEUlZfUkVHRFdfVFNEX1RYVEhfREVGIHwgcEJ1ZmZlcl9wLT5tX3VpVHhNc2dMZW4pKTsKKwlkd1RlbXAgPQorCSAgICBFRFJWX1JFR0RXX1JFQUQoKEVEUlZfUkVHRFdfVFNEMCArCisJCQkgICAgIChFZHJ2SW5zdGFuY2VfbC5tX3VpQ3VyVHhEZXNjICogc2l6ZW9mKERXT1JEKSkpKTsKKy8vICAgIHByaW50aygiIFRTRCV1ID0gMHglMDhsWCAvIDB4JTA4bFhcbiIsIEVkcnZJbnN0YW5jZV9sLm1fdWlDdXJUeERlc2MsIGR3VGVtcCwgKERXT1JEKShFRFJWX1JFR0RXX1RTRF9UWFRIX0RFRiB8IHBCdWZmZXJfcC0+bV91aVR4TXNnTGVuKSk7CisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIFJldDsKK30KKworI2lmIDAKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVkcnZUeE1zZ1JlYWR5CisvLworLy8gRGVzY3JpcHRpb246IHN0YXJ0cyBjb3B5aW5nIHRoZSBidWZmZXIgdG8gdGhlIGV0aGVybmV0IGNvbnRyb2xsZXIncyBGSUZPCisvLworLy8gUGFyYW1ldGVyczogIHBiQnVmZmVyX3AgLSBidWZmZXJkZXNjcmlwdG9yIHRvIHRyYW5zbWl0CisvLworLy8gUmV0dXJuczogICAgIEVycm9yY29kZSAtIGtFcGxTdWNjZXNzZnVsCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3RFcGxLZXJuZWwgRWRydlR4TXNnUmVhZHkodEVkcnZUeEJ1ZmZlciAqIHBCdWZmZXJfcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCXVuc2lnbmVkIGludCB1aUJ1ZmZlck51bWJlcjsKKworICAgICAgRXhpdDoKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFZHJ2VHhNc2dTdGFydAorLy8KKy8vIERlc2NyaXB0aW9uOiBzdGFydHMgdHJhbnNtaXNzaW9uIG9mIHRoZSBldGhlcm5ldCBjb250cm9sbGVyJ3MgRklGTworLy8KKy8vIFBhcmFtZXRlcnM6ICBwYkJ1ZmZlcl9wIC0gYnVmZmVyZGVzY3JpcHRvciB0byB0cmFuc21pdAorLy8KKy8vIFJldHVybnM6ICAgICBFcnJvcmNvZGUgLSBrRXBsU3VjY2Vzc2Z1bAorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0RXBsS2VybmVsIEVkcnZUeE1zZ1N0YXJ0KHRFZHJ2VHhCdWZmZXIgKiBwQnVmZmVyX3ApCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCXJldHVybiBSZXQ7Cit9CisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRWRydlJlaW5pdFJ4CisvLworLy8gRGVzY3JpcHRpb246IHJlaW5pdGlhbGl6ZSB0aGUgUnggcHJvY2VzcywgYmVjYXVzZSBvZiBlcnJvcgorLy8KKy8vIFBhcmFtZXRlcnM6ICB2b2lkCisvLworLy8gUmV0dXJuczogICAgIHZvaWQKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3RhdGljIHZvaWQgRWRydlJlaW5pdFJ4KHZvaWQpCit7CisJQllURSBiQ21kOworCisJLy8gc2ltcGx5IHN3aXRjaCBvZmYgYW5kIG9uIHRoZSByZWNlaXZlcgorCS8vIHRoaXMgd2lsbCByZXNldCB0aGUgQ0FQUiByZWdpc3RlcgorCWJDbWQgPSBFRFJWX1JFR0JfUkVBRChFRFJWX1JFR0JfQ09NTUFORCk7CisJRURSVl9SRUdCX1dSSVRFKEVEUlZfUkVHQl9DT01NQU5ELCAoYkNtZCAmIH5FRFJWX1JFR0JfQ09NTUFORF9SRSkpOworCUVEUlZfUkVHQl9XUklURShFRFJWX1JFR0JfQ09NTUFORCwgYkNtZCk7CisKKwkvLyBzZXQgcmVjZWl2ZSBjb25maWd1cmF0aW9uIHJlZ2lzdGVyCisJRURSVl9SRUdEV19XUklURShFRFJWX1JFR0RXX1JDUiwgRURSVl9SRUdEV19SQ1JfREVGKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgIEVkcnZJbnRlcnJ1cHRIYW5kbGVyCisvLworLy8gRGVzY3JpcHRpb246ICBpbnRlcnJ1cHQgaGFuZGxlcgorLy8KKy8vIFBhcmFtZXRlcnM6ICAgdm9pZAorLy8KKy8vIFJldHVybnM6ICAgICAgdm9pZAorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjaWYgMAordm9pZCBFZHJ2SW50ZXJydXB0SGFuZGxlcih2b2lkKQoreworfQorI2VuZGlmCisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDE5KQorc3RhdGljIGludCBUZ3RFdGhJc3IoaW50IG5JcnFOdW1fcCwgdm9pZCAqcHBEZXZJbnN0RGF0YV9wKQorI2Vsc2UKK3N0YXRpYyBpbnQgVGd0RXRoSXNyKGludCBuSXJxTnVtX3AsIHZvaWQgKnBwRGV2SW5zdERhdGFfcCwKKwkJICAgICBzdHJ1Y3QgcHRfcmVncyAqcHRSZWdzX3ApCisjZW5kaWYKK3sKKy8vICAgIEVkcnZJbnRlcnJ1cHRIYW5kbGVyKCk7CisJdEVkcnZSeEJ1ZmZlciBSeEJ1ZmZlcjsKKwl0RWRydlR4QnVmZmVyICpwVHhCdWZmZXI7CisJV09SRCB3U3RhdHVzOworCURXT1JEIGR3VHhTdGF0dXM7CisJRFdPUkQgZHdSeFN0YXR1czsKKwlXT1JEIHdDdXJSeDsKKwlCWVRFICpwYlJ4QnVmOworCXVuc2lnbmVkIGludCB1aUxlbmd0aDsKKwlpbnQgaUhhbmRsZWQgPSBJUlFfSEFORExFRDsKKworLy8gICAgcHJpbnRrKCKkIik7CisKKwkvLyByZWFkIHRoZSBpbnRlcnJ1cHQgc3RhdHVzCisJd1N0YXR1cyA9IEVEUlZfUkVHV19SRUFEKEVEUlZfUkVHV19JTlRfU1RBVFVTKTsKKworCS8vIGFja25vd2xlZGdlIHRoZSBpbnRlcnJ1cHRzCisJRURSVl9SRUdXX1dSSVRFKEVEUlZfUkVHV19JTlRfU1RBVFVTLCB3U3RhdHVzKTsKKworCWlmICh3U3RhdHVzID09IDApIHsKKwkJaUhhbmRsZWQgPSBJUlFfTk9ORTsKKwkJZ290byBFeGl0OworCX0KKwkvLyBwcm9jZXNzIHRhc2tzCisJaWYgKCh3U3RhdHVzICYgKEVEUlZfUkVHV19JTlRfVEVSIHwgRURSVl9SRUdXX0lOVF9UT0spKSAhPSAwKSB7CS8vIHRyYW5zbWl0IGludGVycnVwdAorCisJCWlmIChFZHJ2SW5zdGFuY2VfbC5tX3BiVHhCdWYgPT0gTlVMTCkgeworCQkJcHJpbnRrKCIlcyBUeCBidWZmZXJzIGN1cnJlbnRseSBub3QgYWxsb2NhdGVkXG4iLAorCQkJICAgICAgIF9fZnVuY19fKTsKKwkJCWdvdG8gRXhpdDsKKwkJfQorCQkvLyByZWFkIHRyYW5zbWl0IHN0YXR1cworCQlkd1R4U3RhdHVzID0KKwkJICAgIEVEUlZfUkVHRFdfUkVBRCgoRURSVl9SRUdEV19UU0QwICsKKwkJCQkgICAgIChFZHJ2SW5zdGFuY2VfbC5tX3VpQ3VyVHhEZXNjICoKKwkJCQkgICAgICBzaXplb2YoRFdPUkQpKSkpOworCQlpZiAoKGR3VHhTdGF0dXMgJiAoRURSVl9SRUdEV19UU0RfVE9LIHwgRURSVl9SRUdEV19UU0RfVEFCVCB8IEVEUlZfUkVHRFdfVFNEX1RVTikpICE9IDApIHsJLy8gdHJhbnNtaXQgZmluaXNoZWQKKwkJCUVkcnZJbnN0YW5jZV9sLm1fdWlDdXJUeERlc2MgPQorCQkJICAgIChFZHJ2SW5zdGFuY2VfbC5tX3VpQ3VyVHhEZXNjICsgMSkgJiAweDAzOworCQkJcFR4QnVmZmVyID0gRWRydkluc3RhbmNlX2wubV9wTGFzdFRyYW5zbWl0dGVkVHhCdWZmZXI7CisJCQlFZHJ2SW5zdGFuY2VfbC5tX3BMYXN0VHJhbnNtaXR0ZWRUeEJ1ZmZlciA9IE5VTEw7CisKKwkJCWlmICgoZHdUeFN0YXR1cyAmIEVEUlZfUkVHRFdfVFNEX1RPSykgIT0gMCkgeworCQkJCUVEUlZfQ09VTlRfVFg7CisJCQl9IGVsc2UgaWYgKChkd1R4U3RhdHVzICYgRURSVl9SRUdEV19UU0RfVFVOKSAhPSAwKSB7CisJCQkJRURSVl9DT1VOVF9UWF9GVU47CisJCQl9IGVsc2UgewkvLyBhc3N1bWUgRURSVl9SRUdEV19UU0RfVEFCVAorCQkJCUVEUlZfQ09VTlRfVFhfQ09MX1JMOworCQkJfQorCisvLyAgICAgICAgICAgIHByaW50aygiVCIpOworCQkJaWYgKHBUeEJ1ZmZlciAhPSBOVUxMKSB7CisJCQkJLy8gY2FsbCBUeCBoYW5kbGVyIG9mIERhdGEgbGluayBsYXllcgorCQkJCUVkcnZJbnN0YW5jZV9sLm1fSW5pdFBhcmFtLgorCQkJCSAgICBtX3BmblR4SGFuZGxlcihwVHhCdWZmZXIpOworCQkJfQorCQl9IGVsc2UgeworCQkJRURSVl9DT1VOVF9UWF9FUlI7CisJCX0KKwl9CisKKwlpZiAoKHdTdGF0dXMgJiAoRURSVl9SRUdXX0lOVF9SRVIgfCBFRFJWX1JFR1dfSU5UX0ZPVlcgfCBFRFJWX1JFR1dfSU5UX1JYT1ZXIHwgRURSVl9SRUdXX0lOVF9QVU4pKSAhPSAwKSB7CS8vIHJlY2VpdmUgZXJyb3IgaW50ZXJydXB0CisKKwkJaWYgKCh3U3RhdHVzICYgRURSVl9SRUdXX0lOVF9GT1ZXKSAhPSAwKSB7CisJCQlFRFJWX0NPVU5UX1JYX0ZPVlc7CisJCX0gZWxzZSBpZiAoKHdTdGF0dXMgJiBFRFJWX1JFR1dfSU5UX1JYT1ZXKSAhPSAwKSB7CisJCQlFRFJWX0NPVU5UX1JYX09WVzsKKwkJfSBlbHNlIGlmICgod1N0YXR1cyAmIEVEUlZfUkVHV19JTlRfUFVOKSAhPSAwKSB7CS8vIFBhY2tldCB1bmRlcnJ1bgorCQkJRURSVl9UUkFDRV9SWF9QVU4od1N0YXR1cyk7CisJCQlFRFJWX0NPVU5UX1JYX1BVTjsKKwkJfSBlbHNlIHsJLyppZiAoKHdTdGF0dXMgJiBFRFJWX1JFR1dfSU5UX1JFUikgIT0gMCkgKi8KKworCQkJRURSVl9UUkFDRV9SWF9FUlIod1N0YXR1cyk7CisJCQlFRFJWX0NPVU5UX1JYX0VSUjsKKwkJfQorCisJCS8vIHJlaW5pdGlhbGl6ZSBSeCBwcm9jZXNzCisJCUVkcnZSZWluaXRSeCgpOworCX0KKworCWlmICgod1N0YXR1cyAmIEVEUlZfUkVHV19JTlRfUk9LKSAhPSAwKSB7CS8vIHJlY2VpdmUgaW50ZXJydXB0CisKKwkJaWYgKEVkcnZJbnN0YW5jZV9sLm1fcGJSeEJ1ZiA9PSBOVUxMKSB7CisJCQlwcmludGsoIiVzIFJ4IGJ1ZmZlcnMgY3VycmVudGx5IG5vdCBhbGxvY2F0ZWRcbiIsCisJCQkgICAgICAgX19mdW5jX18pOworCQkJZ290byBFeGl0OworCQl9CisJCS8vIHJlYWQgY3VycmVudCBvZmZzZXQgaW4gcmVjZWl2ZSBidWZmZXIKKwkJd0N1clJ4ID0KKwkJICAgIChFRFJWX1JFR1dfUkVBRChFRFJWX1JFR1dfQ0FQUikgKworCQkgICAgIDB4MTApICUgRURSVl9SWF9CVUZGRVJfTEVOR1RIOworCisJCXdoaWxlICgoRURSVl9SRUdCX1JFQUQoRURSVl9SRUdCX0NPTU1BTkQpICYgRURSVl9SRUdCX0NPTU1BTkRfQlVGRSkgPT0gMCkgewkvLyBmcmFtZSBhdmFpbGFibGUKKworCQkJLy8gY2FsY3VsYXRlIHBvaW50ZXIgdG8gY3VycmVudCBmcmFtZSBpbiByZWNlaXZlIGJ1ZmZlcgorCQkJcGJSeEJ1ZiA9IEVkcnZJbnN0YW5jZV9sLm1fcGJSeEJ1ZiArIHdDdXJSeDsKKworCQkJLy8gcmVhZCByZWNlaXZlIHN0YXR1cyBEV09SRAorCQkJZHdSeFN0YXR1cyA9IGxlMzJfdG9fY3B1KCooKERXT1JEICopIHBiUnhCdWYpKTsKKworCQkJLy8gY2FsY3VsYXRlIGxlbmd0aCBvZiByZWNlaXZlZCBmcmFtZQorCQkJdWlMZW5ndGggPSBkd1J4U3RhdHVzID4+IDE2OworCisJCQlpZiAodWlMZW5ndGggPT0gMHhGRkYwKSB7CS8vIGZyYW1lIGlzIHVuZmluaXNoZWQgKG1heWJlIGVhcmx5IFJ4IGludGVycnVwdCBpcyBhY3RpdmUpCisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWlmICgoZHdSeFN0YXR1cyAmIEVEUlZfUlhTVEFUX1JPSykgPT0gMCkgewkvLyBlcnJvciBvY2N1cmVkIHdoaWxlIHJlY2VpdmluZyB0aGlzIGZyYW1lCisJCQkJLy8gaWdub3JlIGl0CisJCQkJaWYgKChkd1J4U3RhdHVzICYgRURSVl9SWFNUQVRfRkFFKSAhPSAwKSB7CisJCQkJCUVEUlZfQ09VTlRfUlhfRkFFOworCQkJCX0gZWxzZSBpZiAoKGR3UnhTdGF0dXMgJiBFRFJWX1JYU1RBVF9DUkMpICE9IDApIHsKKwkJCQkJRURSVl9UUkFDRV9SWF9DUkMoZHdSeFN0YXR1cyk7CisJCQkJCUVEUlZfQ09VTlRfUlhfQ1JDOworCQkJCX0gZWxzZSB7CisJCQkJCUVEUlZfVFJBQ0VfUlhfRVJSKGR3UnhTdGF0dXMpOworCQkJCQlFRFJWX0NPVU5UX1JYX0VSUjsKKwkJCQl9CisKKwkJCQkvLyByZWluaXRpYWxpemUgUnggcHJvY2VzcworCQkJCUVkcnZSZWluaXRSeCgpOworCisJCQkJYnJlYWs7CisJCQl9IGVsc2UgewkvLyBmcmFtZSBpcyBPSworCQkJCVJ4QnVmZmVyLm1fQnVmZmVySW5GcmFtZSA9CisJCQkJICAgIGtFZHJ2QnVmZmVyTGFzdEluRnJhbWU7CisJCQkJUnhCdWZmZXIubV91aVJ4TXNnTGVuID0gdWlMZW5ndGggLSBFVEhfQ1JDX1NJWkU7CisJCQkJUnhCdWZmZXIubV9wYkJ1ZmZlciA9CisJCQkJICAgIHBiUnhCdWYgKyBzaXplb2YoZHdSeFN0YXR1cyk7CisKKy8vICAgICAgICAgICAgICAgIHByaW50aygiUiIpOworCQkJCUVEUlZfQ09VTlRfUlg7CisKKwkJCQkvLyBjYWxsIFJ4IGhhbmRsZXIgb2YgRGF0YSBsaW5rIGxheWVyCisJCQkJRWRydkluc3RhbmNlX2wubV9Jbml0UGFyYW0uCisJCQkJICAgIG1fcGZuUnhIYW5kbGVyKCZSeEJ1ZmZlcik7CisJCQl9CisKKwkJCS8vIGNhbHVsYXRlIG5ldyBvZmZzZXQgKERXT1JEIGFsaWduZWQpCisJCQl3Q3VyUnggPQorCQkJICAgIChXT1JEKSAoKHdDdXJSeCArIHVpTGVuZ3RoICsgc2l6ZW9mKGR3UnhTdGF0dXMpICsKKwkJCQkgICAgIDMpICYgfjB4Myk7CisJCQlFRFJWX1RSQUNFX0NBUFIod0N1clJ4IC0gMHgxMCk7CisJCQlFRFJWX1JFR1dfV1JJVEUoRURSVl9SRUdXX0NBUFIsIHdDdXJSeCAtIDB4MTApOworCisJCQkvLyByZXJlYWQgY3VycmVudCBvZmZzZXQgaW4gcmVjZWl2ZSBidWZmZXIKKwkJCXdDdXJSeCA9CisJCQkgICAgKEVEUlZfUkVHV19SRUFEKEVEUlZfUkVHV19DQVBSKSArCisJCQkgICAgIDB4MTApICUgRURSVl9SWF9CVUZGRVJfTEVOR1RIOworCisJCX0KKwl9CisKKwlpZiAoKHdTdGF0dXMgJiBFRFJWX1JFR1dfSU5UX1NFUlIpICE9IDApIHsJLy8gUENJIGVycm9yCisJCUVEUlZfQ09VTlRfUENJX0VSUjsKKwl9CisKKwlpZiAoKHdTdGF0dXMgJiBFRFJWX1JFR1dfSU5UX1RJTUVPVVQpICE9IDApIHsJLy8gVGltZW91dAorCQlFRFJWX0NPVU5UX1RJTUVPVVQ7CisJfQorCisgICAgICBFeGl0OgorCXJldHVybiBpSGFuZGxlZDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRWRydkluaXRPbmUKKy8vCisvLyBEZXNjcmlwdGlvbjogaW5pdGlhbGl6ZXMgb25lIFBDSSBkZXZpY2UKKy8vCisvLyBQYXJhbWV0ZXJzOiAgcFBjaURldiAgICAgICAgICAgICA9IHBvaW50ZXIgdG8gY29ycmVzcG9uZGluZyBQQ0kgZGV2aWNlIHN0cnVjdHVyZQorLy8gICAgICAgICAgICAgIHBJZCAgICAgICAgICAgICAgICAgPSBQQ0kgZGV2aWNlIElECisvLworLy8gUmV0dXJuczogICAgIChpbnQpICAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIGludCBFZHJ2SW5pdE9uZShzdHJ1Y3QgcGNpX2RldiAqcFBjaURldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKnBJZCkKK3sKKwlpbnQgaVJlc3VsdCA9IDA7CisJRFdPUkQgZHdUZW1wOworCisJaWYgKEVkcnZJbnN0YW5jZV9sLm1fcFBjaURldiAhPSBOVUxMKSB7CS8vIEVkcnYgaXMgYWxyZWFkeSBjb25uZWN0ZWQgdG8gYSBQQ0kgZGV2aWNlCisJCXByaW50aygiJXMgZGV2aWNlICVzIGRpc2NhcmRlZFxuIiwgX19mdW5jX18sCisJCSAgICAgICBwY2lfbmFtZShwUGNpRGV2KSk7CisJCWlSZXN1bHQgPSAtRU5PREVWOworCQlnb3RvIEV4aXQ7CisJfQorCisJaWYgKHBQY2lEZXYtPnJldmlzaW9uID49IDB4MjApIHsKKwkJcHJpbnRrCisJCSAgICAoIiVzIGRldmljZSAlcyBpcyBhbiBlbmhhbmNlZCA4MTM5QysgdmVyc2lvbiwgd2hpY2ggaXMgbm90IHN1cHBvcnRlZFxuIiwKKwkJICAgICBfX2Z1bmNfXywgcGNpX25hbWUocFBjaURldikpOworCQlpUmVzdWx0ID0gLUVOT0RFVjsKKwkJZ290byBFeGl0OworCX0KKworCUVkcnZJbnN0YW5jZV9sLm1fcFBjaURldiA9IHBQY2lEZXY7CisKKwkvLyBlbmFibGUgZGV2aWNlCisJcHJpbnRrKCIlcyBlbmFibGUgZGV2aWNlXG4iLCBfX2Z1bmNfXyk7CisJaVJlc3VsdCA9IHBjaV9lbmFibGVfZGV2aWNlKHBQY2lEZXYpOworCWlmIChpUmVzdWx0ICE9IDApIHsKKwkJZ290byBFeGl0OworCX0KKworCWlmICgocGNpX3Jlc291cmNlX2ZsYWdzKHBQY2lEZXYsIDEpICYgSU9SRVNPVVJDRV9NRU0pID09IDApIHsKKwkJaVJlc3VsdCA9IC1FTk9ERVY7CisJCWdvdG8gRXhpdDsKKwl9CisKKwlwcmludGsoIiVzIHJlcXVlc3QgcmVnaW9uc1xuIiwgX19mdW5jX18pOworCWlSZXN1bHQgPSBwY2lfcmVxdWVzdF9yZWdpb25zKHBQY2lEZXYsIERSVl9OQU1FKTsKKwlpZiAoaVJlc3VsdCAhPSAwKSB7CisJCWdvdG8gRXhpdDsKKwl9CisKKwlwcmludGsoIiVzIGlvcmVtYXBcbiIsIF9fZnVuY19fKTsKKwlFZHJ2SW5zdGFuY2VfbC5tX3BJb0FkZHIgPQorCSAgICBpb3JlbWFwKHBjaV9yZXNvdXJjZV9zdGFydChwUGNpRGV2LCAxKSwKKwkJICAgIHBjaV9yZXNvdXJjZV9sZW4ocFBjaURldiwgMSkpOworCWlmIChFZHJ2SW5zdGFuY2VfbC5tX3BJb0FkZHIgPT0gTlVMTCkgewkvLyByZW1hcCBvZiBjb250cm9sbGVyJ3MgcmVnaXN0ZXIgc3BhY2UgZmFpbGVkCisJCWlSZXN1bHQgPSAtRUlPOworCQlnb3RvIEV4aXQ7CisJfQorCS8vIGVuYWJsZSBQQ0kgYnVzbWFzdGVyCisJcHJpbnRrKCIlcyBlbmFibGUgYnVzbWFzdGVyXG4iLCBfX2Z1bmNfXyk7CisJcGNpX3NldF9tYXN0ZXIocFBjaURldik7CisKKwkvLyByZXNldCBjb250cm9sbGVyCisJcHJpbnRrKCIlcyByZXNldCBjb250cm9sbGVyXG4iLCBfX2Z1bmNfXyk7CisJRURSVl9SRUdCX1dSSVRFKEVEUlZfUkVHQl9DT01NQU5ELCBFRFJWX1JFR0JfQ09NTUFORF9SU1QpOworCisJLy8gd2FpdCB1bnRpbCByZXNldCBoYXMgZmluaXNoZWQKKwlmb3IgKGlSZXN1bHQgPSA1MDA7IGlSZXN1bHQgPiAwOyBpUmVzdWx0LS0pIHsKKwkJaWYgKChFRFJWX1JFR0JfUkVBRChFRFJWX1JFR0JfQ09NTUFORCkgJiBFRFJWX1JFR0JfQ09NTUFORF9SU1QpCisJCSAgICA9PSAwKSB7CisJCQlicmVhazsKKwkJfQorCisJCXNjaGVkdWxlX3RpbWVvdXQoMTApOworCX0KKworCS8vIGNoZWNrIGhhcmR3YXJlIHZlcnNpb24sIGkuZS4gY2hpcCBJRAorCWR3VGVtcCA9IEVEUlZfUkVHRFdfUkVBRChFRFJWX1JFR0RXX1RDUik7CisJaWYgKCgoZHdUZW1wICYgRURSVl9SRUdEV19UQ1JfVkVSX01BU0spICE9IEVEUlZfUkVHRFdfVENSX1ZFUl9DKQorCSAgICAmJiAoKGR3VGVtcCAmIEVEUlZfUkVHRFdfVENSX1ZFUl9NQVNLKSAhPSBFRFJWX1JFR0RXX1RDUl9WRVJfRCkpIHsJLy8gdW5zdXBwb3J0ZWQgY2hpcAorCQlwcmludGsoIiVzIFVuc3VwcG9ydGVkIGNoaXAhIFRDUiA9IDB4JTA4bFhcbiIsIF9fZnVuY19fLAorCQkgICAgICAgZHdUZW1wKTsKKwkJaVJlc3VsdCA9IC1FTk9ERVY7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gZGlzYWJsZSBpbnRlcnJ1cHRzCisJcHJpbnRrKCIlcyBkaXNhYmxlIGludGVycnVwdHNcbiIsIF9fZnVuY19fKTsKKwlFRFJWX1JFR1dfV1JJVEUoRURSVl9SRUdXX0lOVF9NQVNLLCAwKTsKKwkvLyBhY2tub3dsZWRnZSBhbGwgcGVuZGluZyBpbnRlcnJ1cHRzCisJRURSVl9SRUdXX1dSSVRFKEVEUlZfUkVHV19JTlRfU1RBVFVTLAorCQkJRURSVl9SRUdXX1JFQUQoRURSVl9SRUdXX0lOVF9TVEFUVVMpKTsKKworCS8vIGluc3RhbGwgaW50ZXJydXB0IGhhbmRsZXIKKwlwcmludGsoIiVzIGluc3RhbGwgaW50ZXJydXB0IGhhbmRsZXJcbiIsIF9fZnVuY19fKTsKKwlpUmVzdWx0ID0KKwkgICAgcmVxdWVzdF9pcnEocFBjaURldi0+aXJxLCBUZ3RFdGhJc3IsIElSUUZfU0hBUkVELAorCQkJRFJWX05BTUUgLypwUGNpRGV2LT5kZXYubmFtZSAqLyAsIHBQY2lEZXYpOworCWlmIChpUmVzdWx0ICE9IDApIHsKKwkJZ290byBFeGl0OworCX0KKworLyoKKyAgICAvLyB1bmxvY2sgY29uZmlndXJhdGlvbiByZWdpc3RlcnMKKyAgICBwcmludGsoIiVzIHVubG9jayBjb25maWd1cmF0aW9uIHJlZ2lzdGVyc1xuIiwgX19mdW5jX18pOworICAgIEVEUlZfUkVHQl9XUklURShFRFJWX1JFR0JfQ01EOTM0NiwgRURSVl9SRUdCX0NNRDkzNDZfVU5MT0NLKTsKKworICAgIC8vIGNoZWNrIGlmIHVzZXIgc3BlY2lmaWVkIGEgTUFDIGFkZHJlc3MKKyAgICBwcmludGsoIiVzIGNoZWNrIHNwZWNpZmllZCBNQUMgYWRkcmVzc1xuIiwgX19mdW5jX18pOworICAgIGZvciAoaVJlc3VsdCA9IDA7IGlSZXN1bHQgPCA2OyBpUmVzdWx0KyspCisgICAgeworICAgICAgICBpZiAoRWRydkluc3RhbmNlX2wubV9Jbml0UGFyYW0ubV9hYk15TWFjQWRkcltpUmVzdWx0XSAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgICBwcmludGsoIiVzIHNldCBsb2NhbCBNQUMgYWRkcmVzc1xuIiwgX19mdW5jX18pOworICAgICAgICAgICAgLy8gd3JpdGUgdGhpcyBNQUMgYWRkcmVzcyB0byBjb250cm9sbGVyCisgICAgICAgICAgICBFRFJWX1JFR0RXX1dSSVRFKEVEUlZfUkVHRFdfSURSMCwKKyAgICAgICAgICAgICAgICBsZTMyX3RvX2NwdSgqKChEV09SRCopJkVkcnZJbnN0YW5jZV9sLm1fSW5pdFBhcmFtLm1fYWJNeU1hY0FkZHJbMF0pKSk7CisgICAgICAgICAgICBkd1RlbXAgPSBFRFJWX1JFR0RXX1JFQUQoRURSVl9SRUdEV19JRFIwKTsKKworICAgICAgICAgICAgRURSVl9SRUdEV19XUklURShFRFJWX1JFR0RXX0lEUjQsCisgICAgICAgICAgICAgICAgbGUzMl90b19jcHUoKigoRFdPUkQqKSZFZHJ2SW5zdGFuY2VfbC5tX0luaXRQYXJhbS5tX2FiTXlNYWNBZGRyWzRdKSkpOworICAgICAgICAgICAgZHdUZW1wID0gRURSVl9SRUdEV19SRUFEKEVEUlZfUkVHRFdfSURSNCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBpUmVzdWx0ID0gMDsKKworICAgIC8vIGxvY2sgY29uZmlndXJhdGlvbiByZWdpc3RlcnMKKyAgICBFRFJWX1JFR0JfV1JJVEUoRURSVl9SRUdCX0NNRDkzNDYsIEVEUlZfUkVHQl9DTUQ5MzQ2X0xPQ0spOworKi8KKworCS8vIGFsbG9jYXRlIGJ1ZmZlcnMKKwlwcmludGsoIiVzIGFsbG9jYXRlIGJ1ZmZlcnNcbiIsIF9fZnVuY19fKTsKKwlFZHJ2SW5zdGFuY2VfbC5tX3BiVHhCdWYgPQorCSAgICBwY2lfYWxsb2NfY29uc2lzdGVudChwUGNpRGV2LCBFRFJWX1RYX0JVRkZFUl9TSVpFLAorCQkJCSAmRWRydkluc3RhbmNlX2wubV9wVHhCdWZEbWEpOworCWlmIChFZHJ2SW5zdGFuY2VfbC5tX3BiVHhCdWYgPT0gTlVMTCkgeworCQlpUmVzdWx0ID0gLUVOT01FTTsKKwkJZ290byBFeGl0OworCX0KKworCUVkcnZJbnN0YW5jZV9sLm1fcGJSeEJ1ZiA9CisJICAgIHBjaV9hbGxvY19jb25zaXN0ZW50KHBQY2lEZXYsIEVEUlZfUlhfQlVGRkVSX1NJWkUsCisJCQkJICZFZHJ2SW5zdGFuY2VfbC5tX3BSeEJ1ZkRtYSk7CisJaWYgKEVkcnZJbnN0YW5jZV9sLm1fcGJSeEJ1ZiA9PSBOVUxMKSB7CisJCWlSZXN1bHQgPSAtRU5PTUVNOworCQlnb3RvIEV4aXQ7CisJfQorCS8vIHJlc2V0IHBvaW50ZXJzIGZvciBUeCBidWZmZXJzCisJcHJpbnRrKCIlcyByZXNldCBwb2ludGVycyBmbyBUeCBidWZmZXJzXG4iLCBfX2Z1bmNfXyk7CisJRURSVl9SRUdEV19XUklURShFRFJWX1JFR0RXX1RTQUQwLCAwKTsKKwlkd1RlbXAgPSBFRFJWX1JFR0RXX1JFQUQoRURSVl9SRUdEV19UU0FEMCk7CisJRURSVl9SRUdEV19XUklURShFRFJWX1JFR0RXX1RTQUQxLCAwKTsKKwlkd1RlbXAgPSBFRFJWX1JFR0RXX1JFQUQoRURSVl9SRUdEV19UU0FEMSk7CisJRURSVl9SRUdEV19XUklURShFRFJWX1JFR0RXX1RTQUQyLCAwKTsKKwlkd1RlbXAgPSBFRFJWX1JFR0RXX1JFQUQoRURSVl9SRUdEV19UU0FEMik7CisJRURSVl9SRUdEV19XUklURShFRFJWX1JFR0RXX1RTQUQzLCAwKTsKKwlkd1RlbXAgPSBFRFJWX1JFR0RXX1JFQUQoRURSVl9SRUdEV19UU0FEMyk7CisKKwlwcmludGsoIiAgICBDb21tYW5kID0gMHglMDJYXG4iLAorCSAgICAgICAoV09SRCkgRURSVl9SRUdCX1JFQUQoRURSVl9SRUdCX0NPTU1BTkQpKTsKKworCS8vIHNldCBwb2ludGVyIGZvciByZWNlaXZlIGJ1ZmZlciBpbiBjb250cm9sbGVyCisJcHJpbnRrKCIlcyBzZXQgcG9pbnRlciB0byBSeCBidWZmZXJcbiIsIF9fZnVuY19fKTsKKwlFRFJWX1JFR0RXX1dSSVRFKEVEUlZfUkVHRFdfUkJTVEFSVCwgRWRydkluc3RhbmNlX2wubV9wUnhCdWZEbWEpOworCisJLy8gZW5hYmxlIHRyYW5zbWl0dGVyIGFuZCByZWNlaXZlcgorCXByaW50aygiJXMgZW5hYmxlIFR4IGFuZCBSeCIsIF9fZnVuY19fKTsKKwlFRFJWX1JFR0JfV1JJVEUoRURSVl9SRUdCX0NPTU1BTkQsCisJCQkoRURSVl9SRUdCX0NPTU1BTkRfUkUgfCBFRFJWX1JFR0JfQ09NTUFORF9URSkpOworCXByaW50aygiICBDb21tYW5kID0gMHglMDJYXG4iLAorCSAgICAgICAoV09SRCkgRURSVl9SRUdCX1JFQUQoRURSVl9SRUdCX0NPTU1BTkQpKTsKKworCS8vIGNsZWFyIG1pc3NlZCBwYWNrZXQgY291bnRlciB0byBlbmFibGUgUngvVHggcHJvY2VzcworCUVEUlZfUkVHRFdfV1JJVEUoRURSVl9SRUdEV19NUEMsIDApOworCisJLy8gc2V0IHRyYW5zbWl0IGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIKKwlwcmludGsoIiVzIHNldCBUeCBjb25mIHJlZ2lzdGVyIiwgX19mdW5jX18pOworCUVEUlZfUkVHRFdfV1JJVEUoRURSVl9SRUdEV19UQ1IsIEVEUlZfUkVHRFdfVENSX0RFRik7CisJcHJpbnRrKCIgPSAweCUwOFhcbiIsIEVEUlZfUkVHRFdfUkVBRChFRFJWX1JFR0RXX1RDUikpOworCisJLy8gc2V0IHJlY2VpdmUgY29uZmlndXJhdGlvbiByZWdpc3RlcgorCXByaW50aygiJXMgc2V0IFJ4IGNvbmYgcmVnaXN0ZXIiLCBfX2Z1bmNfXyk7CisJRURSVl9SRUdEV19XUklURShFRFJWX1JFR0RXX1JDUiwgRURSVl9SRUdEV19SQ1JfREVGKTsKKwlwcmludGsoIiA9IDB4JTA4WFxuIiwgRURSVl9SRUdEV19SRUFEKEVEUlZfUkVHRFdfUkNSKSk7CisKKwkvLyByZXNldCBtdWx0aWNhc3QgTUFDIGFkZHJlc3MgZmlsdGVyCisJRURSVl9SRUdEV19XUklURShFRFJWX1JFR0RXX01BUjAsIDApOworCWR3VGVtcCA9IEVEUlZfUkVHRFdfUkVBRChFRFJWX1JFR0RXX01BUjApOworCUVEUlZfUkVHRFdfV1JJVEUoRURSVl9SRUdEV19NQVI0LCAwKTsKKwlkd1RlbXAgPSBFRFJWX1JFR0RXX1JFQUQoRURSVl9SRUdEV19NQVI0KTsKKworLyoKKyAgICAvLyBlbmFibGUgdHJhbnNtaXR0ZXIgYW5kIHJlY2VpdmVyCisgICAgcHJpbnRrKCIlcyBlbmFibGUgVHggYW5kIFJ4IiwgX19mdW5jX18pOworICAgIEVEUlZfUkVHQl9XUklURShFRFJWX1JFR0JfQ09NTUFORCwgKEVEUlZfUkVHQl9DT01NQU5EX1JFIHwgRURSVl9SRUdCX0NPTU1BTkRfVEUpKTsKKyAgICBwcmludGsoIiAgQ29tbWFuZCA9IDB4JTAyWFxuIiwgKFdPUkQpIEVEUlZfUkVHQl9SRUFEKEVEUlZfUkVHQl9DT01NQU5EKSk7CisqLworCS8vIGRpc2FibGUgZWFybHkgaW50ZXJydXB0cworCUVEUlZfUkVHV19XUklURShFRFJWX1JFR1dfTVVMSU5ULCAwKTsKKworCS8vIGVuYWJsZSBpbnRlcnJ1cHRzCisJcHJpbnRrKCIlcyBlbmFibGUgaW50ZXJydXB0c1xuIiwgX19mdW5jX18pOworCUVEUlZfUkVHV19XUklURShFRFJWX1JFR1dfSU5UX01BU0ssIEVEUlZfUkVHV19JTlRfTUFTS19ERUYpOworCisgICAgICBFeGl0OgorCXByaW50aygiJXMgZmluaXNoZWQgd2l0aCAlZFxuIiwgX19mdW5jX18sIGlSZXN1bHQpOworCXJldHVybiBpUmVzdWx0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFZHJ2UmVtb3ZlT25lCisvLworLy8gRGVzY3JpcHRpb246IHNodXRzIGRvd24gb25lIFBDSSBkZXZpY2UKKy8vCisvLyBQYXJhbWV0ZXJzOiAgcFBjaURldiAgICAgICAgICAgICA9IHBvaW50ZXIgdG8gY29ycmVzcG9uZGluZyBQQ0kgZGV2aWNlIHN0cnVjdHVyZQorLy8KKy8vIFJldHVybnM6ICAgICAodm9pZCkKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZCBFZHJ2UmVtb3ZlT25lKHN0cnVjdCBwY2lfZGV2ICpwUGNpRGV2KQoreworCisJaWYgKEVkcnZJbnN0YW5jZV9sLm1fcFBjaURldiAhPSBwUGNpRGV2KSB7CS8vIHRyeWluZyB0byByZW1vdmUgdW5rbm93biBkZXZpY2UKKwkJQlVHX09OKEVkcnZJbnN0YW5jZV9sLm1fcFBjaURldiAhPSBwUGNpRGV2KTsKKwkJZ290byBFeGl0OworCX0KKwkvLyBkaXNhYmxlIHRyYW5zbWl0dGVyIGFuZCByZWNlaXZlcgorCUVEUlZfUkVHQl9XUklURShFRFJWX1JFR0JfQ09NTUFORCwgMCk7CisKKwkvLyBkaXNhYmxlIGludGVycnVwdHMKKwlFRFJWX1JFR1dfV1JJVEUoRURSVl9SRUdXX0lOVF9NQVNLLCAwKTsKKworCS8vIHJlbW92ZSBpbnRlcnJ1cHQgaGFuZGxlcgorCWZyZWVfaXJxKHBQY2lEZXYtPmlycSwgcFBjaURldik7CisKKwkvLyBmcmVlIGJ1ZmZlcnMKKwlpZiAoRWRydkluc3RhbmNlX2wubV9wYlR4QnVmICE9IE5VTEwpIHsKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChwUGNpRGV2LCBFRFJWX1RYX0JVRkZFUl9TSVpFLAorCQkJCSAgICBFZHJ2SW5zdGFuY2VfbC5tX3BiVHhCdWYsCisJCQkJICAgIEVkcnZJbnN0YW5jZV9sLm1fcFR4QnVmRG1hKTsKKwkJRWRydkluc3RhbmNlX2wubV9wYlR4QnVmID0gTlVMTDsKKwl9CisKKwlpZiAoRWRydkluc3RhbmNlX2wubV9wYlJ4QnVmICE9IE5VTEwpIHsKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChwUGNpRGV2LCBFRFJWX1JYX0JVRkZFUl9TSVpFLAorCQkJCSAgICBFZHJ2SW5zdGFuY2VfbC5tX3BiUnhCdWYsCisJCQkJICAgIEVkcnZJbnN0YW5jZV9sLm1fcFJ4QnVmRG1hKTsKKwkJRWRydkluc3RhbmNlX2wubV9wYlJ4QnVmID0gTlVMTDsKKwl9CisJLy8gdW5tYXAgY29udHJvbGxlcidzIHJlZ2lzdGVyIHNwYWNlCisJaWYgKEVkcnZJbnN0YW5jZV9sLm1fcElvQWRkciAhPSBOVUxMKSB7CisJCWlvdW5tYXAoRWRydkluc3RhbmNlX2wubV9wSW9BZGRyKTsKKwl9CisJLy8gZGlzYWJsZSB0aGUgUENJIGRldmljZQorCXBjaV9kaXNhYmxlX2RldmljZShwUGNpRGV2KTsKKworCS8vIHJlbGVhc2UgbWVtb3J5IHJlZ2lvbnMKKwlwY2lfcmVsZWFzZV9yZWdpb25zKHBQY2lEZXYpOworCisJRWRydkluc3RhbmNlX2wubV9wUGNpRGV2ID0gTlVMTDsKKworICAgICAgRXhpdDo7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVkcnZDYWxjSGFzaAorLy8KKy8vIERlc2NyaXB0aW9uOiBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBlbnRyeSBmb3IgdGhlIGhhc2gtdGFibGUgZnJvbSBNQUMKKy8vICAgICAgICAgICAgICBhZGRyZXNzCisvLworLy8gUGFyYW1ldGVyczogIHBiTUFDX3AgLSBwb2ludGVyIHRvIE1BQyBhZGRyZXNzCisvLworLy8gUmV0dXJuczogICAgIGhhc2ggdmFsdWUKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2RlZmluZSBIQVNIX0JJVFMgICAgICAgICAgICAgIDYJLy8gdXNlZCBiaXRzIGluIGhhc2gKKyNkZWZpbmUgQ1JDMzJfUE9MWSAgICAweDA0QzExREI2CS8vCisvLyNkZWZpbmUgQ1JDMzJfUE9MWSAgICAweEVEQjg4MzIwICAvLworLy8gRyh4KSA9IHgzMiArIHgyNiArIHgyMyArIHgyMiArIHgxNiArIHgxMiArIHgxMSArIHgxMCArIHg4ICsgeDcgKyB4NSArIHg0ICsgeDIgKyB4ICsgMQorCitzdGF0aWMgQllURSBFZHJ2Q2FsY0hhc2goQllURSAqIHBiTUFDX3ApCit7CisJRFdPUkQgZHdCeXRlQ291bnRlcjsKKwlEV09SRCBkd0JpdENvdW50ZXI7CisJRFdPUkQgZHdEYXRhOworCURXT1JEIGR3Q3JjOworCURXT1JEIGR3Q2Fycnk7CisJQllURSAqcGJEYXRhOworCUJZVEUgYkhhc2g7CisKKwlwYkRhdGEgPSBwYk1BQ19wOworCisJLy8gY2FsY3VsYXRlIGNyYzMyIHZhbHVlIG9mIG1hYyBhZGRyZXNzCisJZHdDcmMgPSAweEZGRkZGRkZGOworCisJZm9yIChkd0J5dGVDb3VudGVyID0gMDsgZHdCeXRlQ291bnRlciA8IDY7IGR3Qnl0ZUNvdW50ZXIrKykgeworCQlkd0RhdGEgPSAqcGJEYXRhOworCQlwYkRhdGErKzsKKwkJZm9yIChkd0JpdENvdW50ZXIgPSAwOyBkd0JpdENvdW50ZXIgPCA4OworCQkgICAgIGR3Qml0Q291bnRlcisrLCBkd0RhdGEgPj49IDEpIHsKKwkJCWR3Q2FycnkgPSAoKChkd0NyYyA+PiAzMSkgXiBkd0RhdGEpICYgMSk7CisJCQlkd0NyYyA9IGR3Q3JjIDw8IDE7CisJCQlpZiAoZHdDYXJyeSAhPSAwKSB7CisJCQkJZHdDcmMgPSAoZHdDcmMgXiBDUkMzMl9QT0xZKSB8IGR3Q2Fycnk7CisJCQl9CisJCX0KKwl9CisKKy8vICAgIHByaW50aygiTXlDUkMgPSAweCUwOGxYXG4iLCBkd0NyYyk7CisJLy8gb25seSB1cHBlciA2IGJpdHMgKEhBU0hfQklUUykgYXJlIHVzZWQKKwkvLyB3aGljaCBwb2ludCB0byBzcGVjaWZpYyBiaXQgaW4gdGhlIGhhc2ggcmVnaXN0ZXJzCisJYkhhc2ggPSAoQllURSkgKChkd0NyYyA+PiAoMzIgLSBIQVNIX0JJVFMpKSAmIDB4M2YpOworCisJcmV0dXJuIGJIYXNoOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9FZHJ2RmVjLmggYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VkcnZGZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjI1MmZiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FZHJ2RmVjLmgKQEAgLTAsMCArMSwxMTQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBpbnRlcmZhY2UgZm9yIGV0aGVybmV0ZHJpdmVyCisgICAgICAgICAgICAgICAgImZhc3QgZXRoZXJuZXQgY29udHJvbGxlciIgKEZFQykKKyAgICAgICAgICAgICAgICBmcmVlc2NhbGUgY29sZGZpcmUgTUNGNTI4eCBhbmQgY29tcGF0aWJsZSBGRUMKKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgICAgICAgICRSQ1NmaWxlOiBFZHJ2RmVjLmgsdiAkCisKKyAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAorCisgICAgICAgICAgICAgICAgJFJldmlzaW9uOiAxLjMgJCAgJERhdGU6IDIwMDgvMDQvMTcgMjE6MzY6MzIgJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgRGV2IEMrKyBhbmQgR05VLUNvbXBpbGVyIGZvciBtNjhrCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwNS8wOC8wMSBtLmIuOiAgIHN0YXJ0IG9mIGltcGxlbWVudGF0aW9uCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX0VEUlZGRUNfSF8KKyNkZWZpbmUgX0VEUlZGRUNfSF8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvbnN0IGRlZmluZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBkbyB0aGlzIGluIGNvbmZpZyBoZWFkZXIKKyNkZWZpbmUgVEFSR0VUX0hBUkRXQVJFIFRHVEhXX1NQTENfQ0Y1NAorCisvLyBiYXNlIGFkZHJlc3NlcworI2lmICgoVEFSR0VUX0hBUkRXQVJFICYgVEdUX0NQVV9NQVNLXykgPT0gVEdUX0NQVV81MjgyKQorCisjZWxpZiAoKFRBUkdFVF9IQVJEV0FSRSAmIFRHVF9DUFVfTUFTS18pID09IFRHVF9DUFVfNTQ4NSkKKworI2Vsc2UKKworI2Vycm9yICdFUlJPUjogVGFyZ2V0IHdhcyBuZXZlciBpbXBsZW1lbnRlZCEnCisKKyNlbmRpZgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIFJ4IGFuZCBUeCBidWZmZXIgZGVzY3JpcHRvciBmb3JtYXQKK3R5cGVkZWYgc3RydWN0IHsKKwlXT1JEIG1fd1N0YXR1czsJCS8vIGNvbnRyb2wgLyBzdGF0dXMgIC0tLSAgdXNlZCBieSBlZHJ2LCBkbyBub3QgY2hhbmdlIGluIGFwcGxpY2F0aW9uCisJV09SRCBtX3dMZW5ndGg7CQkvLyB0cmFuc2ZlciBsZW5ndGgKKwlCWVRFICptX3BiRGF0YTsJCS8vIGJ1ZmZlciBhZGRyZXNzCit9IHRCdWZmZXJEZXNjcjsKKworI2lmICgoVEFSR0VUX0hBUkRXQVJFICYgVEdUX0NQVV9NQVNLXykgPT0gVEdUX0NQVV81MjgyKQorCisjZWxpZiAoKFRBUkdFVF9IQVJEV0FSRSAmIFRHVF9DUFVfTUFTS18pID09IFRHVF9DUFVfNTQ4NSkKKworI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZW5kaWYgLy8gI2lmbmRlZiBfRURSVl9GRUNfSF8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwvRWRydkZlYzUyODIuaCBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRWRydkZlYzUyODIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTZiYjFkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FZHJ2RmVjNTI4Mi5oCkBAIC0wLDAgKzEsMzQwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgb3BlblBPV0VSTElOSworCisgIERlc2NyaXB0aW9uOiAgaW50ZXJmYWNlIGZvciBldGhlcm5ldGRyaXZlcgorICAgICAgICAgICAgICAgICJmYXN0IGV0aGVybmV0IGNvbnRyb2xsZXIiIChGRUMpCisgICAgICAgICAgICAgICAgZnJlZXNjYWxlIGNvbGRmaXJlIE1DRjUyOHggYW5kIGNvbXBhdGlibGUgRkVDCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRWRydkZlYzUyODIuaCx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuMyAkICAkRGF0ZTogMjAwOC8wNC8xNyAyMTozNjozMiAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICBEZXYgQysrIGFuZCBHTlUtQ29tcGlsZXIgZm9yIG02OGsKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUmV2aXNpb24gSGlzdG9yeToKKworICAyMDA1LzA4LzAxIG0uYi46ICAgc3RhcnQgb2YgaW1wbGVtZW50YXRpb24KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfRURSVkZFQ19IXworI2RlZmluZSBfRURSVkZFQ19IXworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGJhc2UgYWRkcmVzc2VzCisjZGVmaW5lIEZFQzBfQUREUiAweDAwMDAKKyNkZWZpbmUgRkVDMV9BRERSIDB4MDAwMAkvL3RiZAorCisvLyBjb250cm9sIC8gc3RhdHVzIHJlZ2lzdGVycworI2RlZmluZSBGRUNfRUlSICAgICAgICAgICAgICAgICAweDEwMDQJLy8gaW50ZXJydXB0IGV2ZW50IHJlZ2lzdGVyCisjZGVmaW5lIEZFQ19FSU1SICAgICAgICAgICAgICAgIDB4MTAwOAkvLyBpbnRlcnJ1cHQgbWFzayByZWdpc3RlcgorI2RlZmluZSBGRUNfUkRBUiAgICAgICAgICAgICAgICAweDEwMTAJLy8gcmVjZWl2ZSBkZXNjcmlwdG9yIGFjdGl2ZSByZWdpc3RlcgorI2RlZmluZSBGRUNfVERBUiAgICAgICAgICAgICAgICAweDEwMTQJLy8gdHJhbnNtaXQgZGVzY3JpcHRvciBhY3RpdmUgcmVnaXN0ZXIKKyNkZWZpbmUgRkVDX0VDUiAgICAgICAgICAgICAgICAgMHgxMDI0CS8vIGV0aGVybmV0IGNvbnRyb2wgcmVnaXN0ZXIKKyNkZWZpbmUgRkVDX01NRlIgICAgICAgICAgICAgICAgMHgxMDQwCS8vIE1JSSBkYXRhIHJlZ2lzdGVyCisjZGVmaW5lIEZFQ19NU0NSICAgICAgICAgICAgICAgIDB4MTA0NAkvLyBNSUkgc3BlZWQgcmVnaXN0ZXIKKyNkZWZpbmUgRkVDX01JQkMgICAgICAgICAgICAgICAgMHgxMDY0CS8vIE1JQiBjb250cm9sL3N0YXR1cyByZWdpc3RlcgorI2RlZmluZSBGRUNfUkNSICAgICAgICAgICAgICAgICAweDEwODQJLy8gcmVjZWl2ZSBjb250cm9sIHJlZ2lzdGVyCisjZGVmaW5lIEZFQ19UQ1IgICAgICAgICAgICAgICAgIDB4MTBDNAkvLyB0cmFuc21pdCBjb250cm9sIHJlZ2lzdGVyCisjZGVmaW5lIEZFQ19QQUxSICAgICAgICAgICAgICAgIDB4MTBFNAkvLyBwaHlzaWNhbCBhZGRyZXNzIGxvdyByZWdpc3RlcgorI2RlZmluZSBGRUNfUEFVUiAgICAgICAgICAgICAgICAweDEwRTgJLy8gcGh5c2ljYWwgYWRkcmVzcyBoaWdoICsgdHlwZSByZWdpc3RlcgorI2RlZmluZSBGRUNfT1BEICAgICAgICAgICAgICAgICAweDEwRUMJLy8gb3Bjb2RlICsgcGF1c2UgcmVnaXN0ZXIKKyNkZWZpbmUgRkVDX0lBVVIgICAgICAgICAgICAgICAgMHgxMTE4CS8vIHVwcGVyIDMyIGJpdCBvZiBpbmRpdmlkdWFsIGhhc2ggdGFibGUKKyNkZWZpbmUgRkVDX0lBTFIgICAgICAgICAgICAgICAgMHgxMTFDCS8vIGxvd2VyIDMyIGJpdCBvZiBpbmRpdmlkdWFsIGhhc2ggdGFibGUKKyNkZWZpbmUgRkVDX0dBVVIgICAgICAgICAgICAgICAgMHgxMTIwCS8vIHVwcGVyIDMyIGJpdCBvZiBncm91cCBoYXNoIHRhYmxlCisjZGVmaW5lIEZFQ19HQUxSICAgICAgICAgICAgICAgIDB4MTEyNAkvLyBsb3dlciAzMiBiaXQgb2YgZ3JvdXAgaGFzaCB0YWJsZQorI2RlZmluZSBGRUNfVEZXUiAgICAgICAgICAgICAgICAweDExNDQJLy8gdHJhbnNtaXQgRklGTyB3YXRlcm1hcmsKKyNkZWZpbmUgRkVDX0ZSQlIgICAgICAgICAgICAgICAgMHgxMTRDCS8vIEZJRk8gcmVjZWl2ZSBib3VuZCByZWdpc3RlcgorI2RlZmluZSBGRUNfRlJTUiAgICAgICAgICAgICAgICAweDExNTAJLy8gRklGTyByZWNlaXZlIEZJRk8gc3RhcnQgcmVnaXN0ZXIKKyNkZWZpbmUgRkVDX0VSRFNSICAgICAgICAgICAgICAgMHgxMTgwCS8vIHBvaW50ZXIgdG8gcmVjZWl2ZSBkZXNjcmlwdG9yIHJpbmcKKyNkZWZpbmUgRkVDX0VURFNSICAgICAgICAgICAgICAgMHgxMTg0CS8vIHBvaW50ZXIgdG8gdHJhbnNtaXQgZGVzY3JpcHRvciByaW5nCisjZGVmaW5lIEZFQ19FTVJCUiAgICAgICAgICAgICAgIDB4MTE4OAkvLyBtYXhpbXVtIHJlY2VpdmUgYnVmZmVyIHNpemUKKworLy8gbWliIGJsb2NrIGNvdW50ZXJzIG1lbW9yeSBtYXAKKyNkZWZpbmUgRkVDX1JNT05fVF9EUk9QICAgICAgICAgMHgxMjAwCS8vIGNvdW50IG9mIGZyYW1lcyBub3QgY291bnRlZCBjb3JyZWN0bHkKKyNkZWZpbmUgRkVDX1JNT05fVF9QQUNLRVRTICAgICAgMHgxMjA0CS8vIFJNT04gdHggcGFja2V0IGNvdW50CisjZGVmaW5lIEZFQ19STU9OX1RfQkNfUEtUICAgICAgIDB4MTIwOAkvLyBSTU9OIHR4IGJyb2FkY2FzdCBwYWNrZXRzCisjZGVmaW5lIEZFQ19STU9OX1RfTUNfUEtUICAgICAgIDB4MTIwQwkvLyBSTU9OIHR4IG11bHRpY2FzdCBwYWNrZXRzCisjZGVmaW5lIEZFQ19STU9OX1RfQ1JDX0FMSUdOICAgIDB4MTIxMAkvLyBSTU9OIHR4IHBhY2tldHMgdyBDUkMvYWxpZ24gZXJyb3IKKyNkZWZpbmUgRkVDX1JNT05fVF9VTkRFUlNJWkUgICAgMHgxMjE0CS8vIFJNT04gdHggcGFja2V0cyA8IDY0IGJ5dGVzLCBnb29kIENSQworI2RlZmluZSBGRUNfUk1PTl9UX09WRVJTSVpFICAgICAweDEyMTgJLy8gUk1PTiB0eCBwYWNrZXRzID4gTUFYX0ZMIGJ5dGVzLCBnb29kIENSQworI2RlZmluZSBGRUNfUk1PTl9UX0ZSQUcgICAgICAgICAweDEyMUMJLy8gUk1PTiB0eCBwYWNrZXRzIDwgNjQgYnl0ZXMsIGJhZCBDUkMKKyNkZWZpbmUgRkVDX1JNT05fVF9KQUIgICAgICAgICAgMHgxMjIwCS8vIFJNT04gdHggcGFja2V0cyA+IE1BWF9GTCBieXRlcywgYmFkIENSQworI2RlZmluZSBGRUNfUk1PTl9UX0NPTCAgICAgICAgICAweDEyMjQJLy8gUk1PTiB0eCBjb2xsaXNpb24gY291bnQKKyNkZWZpbmUgRkVDX1JNT05fVF9QNjQgICAgICAgICAgMHgxMjI4CS8vIFJNT04gdHggICAgICAgICAgIDY0IGJ5dGUgcGFja2V0cworI2RlZmluZSBGRUNfUk1PTl9UX1A2NVRPMTI3ICAgICAweDEyMkMJLy8gUk1PTiB0eCAgIDY1IHRvICAxMjcgYnl0ZSBwYWNrZXRzCisjZGVmaW5lIEZFQ19STU9OX1RfUDEyOFRPMjU1ICAgIDB4MTIzMAkvLyBSTU9OIHR4ICAxMjggdG8gIDI1NSBieXRlIHBhY2tldHMKKyNkZWZpbmUgRkVDX1JNT05fVF9QMjU2VE81MTEgICAgMHgxMjM0CS8vIFJNT04gdHggIDI1NiB0byAgNTExIGJ5dGUgcGFja2V0cworI2RlZmluZSBGRUNfUk1PTl9UX1A1MTJUTzEwMjMgICAweDEyMzgJLy8gUk1PTiB0eCAgNTEyIHRvIDEwMjMgYnl0ZSBwYWNrZXRzCisjZGVmaW5lIEZFQ19STU9OX1RfUDEwMjRUTzIwNDcgIDB4MTIzQwkvLyBSTU9OIHR4IDEwMjQgdG8gMjA0NyBieXRlIHBhY2tldHMKKyNkZWZpbmUgRkVDX1JNT05fVF9QX0dURTIwNDggICAgMHgxMjQwCS8vIFJNT04gdHggdyA+IDIwNDggYnl0ZXMKKyNkZWZpbmUgRkVDX1JNT05fVF9PQ1RFVFMgICAgICAgMHgxMjQ0CS8vIFJNT04gdHggb2N0ZXRzCisjZGVmaW5lIEZFQ19JRUVFX1RfRFJPUCAgICAgICAgIDB4MTI0OAkvLyBjb3VudCBvZiBmcmFtZXMgbm90IGNvdW50ZWQgY29ycmVjdGx5CisjZGVmaW5lIEZFQ19JRUVFX1RfRlJBTUVfT0sgICAgIDB4MTI0QwkvLyBmcmFtZXMgdHJhbnNtaXR0ZWQgT0sKKyNkZWZpbmUgRkVDX0lFRUVfVF8xQ09MICAgICAgICAgMHgxMjUwCS8vIGZyYW1lcyB0cmFuc21pdHRlZCB3aXRoIHNpbmdsZSBjb2xsaXNpb24KKyNkZWZpbmUgRkVDX0lFRUVfVF9NQ09MICAgICAgICAgMHgxMjU0CS8vIGZyYW1lcyB0cmFuc21pdHRlZCB3aXRoIG11bHRpcGxlIGNvbGxpc2lvbnMKKyNkZWZpbmUgRkVDX0lFRUVfVF9ERUYgICAgICAgICAgMHgxMjU4CS8vIGZyYW1lcyB0cmFuc21pdHRlZCBhZnRlciBkZWZlcnJhbCBkZWxheQorI2RlZmluZSBGRUNfSUVFRV9UX0xDT0wgICAgICAgICAweDEyNUMJLy8gZnJhbWVzIHRyYW5zbWl0dGVkIHdpdGggbGF0ZSBjb2xsaXNpb25zCisjZGVmaW5lIEZFQ19JRUVFX1RfRVhDT0wgICAgICAgIDB4MTI2MAkvLyBmcmFtZXMgdHJhbnNtaXR0ZWQgd2l0aCBleGNlc3NpdmUgY29sbGlzaW9ucworI2RlZmluZSBGRUNfSUVFRV9UX01BQ0VSUiAgICAgICAweDEyNjQJLy8gZnJhbWVzIHRyYW5zbWl0dGVkIHdpdGggdHgtRklGTyB1bmRlcnJ1bgorI2RlZmluZSBGRUNfSUVFRV9UX0NTRVJSICAgICAgICAweDEyNjgJLy8gZnJhbWVzIHRyYW5zbWl0dGVkIHdpdGggY2FycmllciBzZW5zZSBlcnJvcgorI2RlZmluZSBGRUNfSUVFRV9UX1NRRSAgICAgICAgICAweDEyNkMJLy8gZnJhbWVzIHRyYW5zbWl0dGVkIHdpdGggU1FFIGVycm9yCisjZGVmaW5lIEZFQ19JRUVFX1RfRkRYRkMgICAgICAgIDB4MTI3MAkvLyBmbG93IGNvbnRyb2wgcGF1c2UgZnJhbWVzIHRyYW5zbWl0dGVkCisjZGVmaW5lIEZFQ19JRUVFX1RfT0NURVRTX09LICAgIDB4MTI3NAkvLyBvY3RldCBjb3VudCBmb3IgZnJhbWVzIHRyYW5zbWl0dGVkIHcvbyBlcnJvcgorI2RlZmluZSBGRUNfUk1PTl9SX1BBQ0tFVFMgICAgICAweDEyODQJLy8gUk1PTiByeCBwYWNrZXQgY291bnQKKyNkZWZpbmUgRkVDX1JNT05fUl9CQ19QS1QgICAgICAgMHgxMjg4CS8vIFJNT04gcnggYnJvYWRjYXN0IHBhY2tldHMKKyNkZWZpbmUgRkVDX1JNT05fUl9NQ19QS1QgICAgICAgMHgxMjhDCS8vIFJNT04gcnggbXVsdGljYXN0IHBhY2tldHMKKyNkZWZpbmUgRkVDX1JNT05fUl9DUkNfQUxJR04gICAgMHgxMjkwCS8vIFJNT04gcnggcGFja2V0cyB3IENSQy9hbGlnbiBlcnJvcgorI2RlZmluZSBGRUNfUk1PTl9SX1VOREVSU0laRSAgICAweDEyOTQJLy8gUk1PTiByeCBwYWNrZXRzIDwgNjQgYnl0ZXMsIGdvb2QgQ1JDCisjZGVmaW5lIEZFQ19STU9OX1JfT1ZFUlNJWkUgICAgIDB4MTI5OAkvLyBSTU9OIHJ4IHBhY2tldHMgPiBNQVhfRkwgYnl0ZXMsIGdvb2QgQ1JDCisjZGVmaW5lIEZFQ19STU9OX1JfRlJBRyAgICAgICAgIDB4MTI5QwkvLyBSTU9OIHJ4IHBhY2tldHMgPCA2NCBieXRlcywgYmFkIENSQworI2RlZmluZSBGRUNfUk1PTl9SX0pBQiAgICAgICAgICAweDEyQTAJLy8gUk1PTiByeCBwYWNrZXRzID4gTUFYX0ZMIGJ5dGVzLCBiYWQgQ1JDCisjZGVmaW5lIEZFQ19STU9OX1JfUkVTVkRfMCAgICAgIDB4MTJBNAkvLworI2RlZmluZSBGRUNfUk1PTl9SX1A2NCAgICAgICAgICAweDEyQTgJLy8gUk1PTiByeCAgICAgICAgICAgNjQgYnl0ZSBwYWNrZXRzCisjZGVmaW5lIEZFQ19STU9OX1JfUDY1VDAxMjcgICAgIDB4MTJBQwkvLyBSTU9OIHJ4ICAgNjUgdG8gIDEyNyBieXRlIHBhY2tldHMKKyNkZWZpbmUgRkVDX1JNT05fUl9QMTI4VE8yNTUgICAgMHgxMkIwCS8vIFJNT04gcnggIDEyOCB0byAgMjU1IGJ5dGUgcGFja2V0cworI2RlZmluZSBGRUNfUk1PTl9SX1AyNTZUTzUxMSAgICAweDEyQjQJLy8gUk1PTiByeCAgMjU2IHRvICA1MTEgYnl0ZSBwYWNrZXRzCisjZGVmaW5lIEZFQ19STU9OX1JfUDUxMlRPMTAyMyAgIDB4MTJCOAkvLyBSTU9OIHJ4ICA1MTIgdG8gMTAyMyBieXRlIHBhY2tldHMKKyNkZWZpbmUgRkVDX1JNT05fUl9QMTAyNFRPMjA0NyAgMHgxMkJDCS8vIFJNT04gcnggMTAyNCB0byAyMDQ3IGJ5dGUgcGFja2V0cworI2RlZmluZSBGRUNfUk1PTl9SX0dURTIwNDggICAgICAweDEyQzAJLy8gUk1PTiByeCB3ID4gMjA0OCBieXRlcworI2RlZmluZSBGRUNfUk1PTl9SX09DVEVUUyAgICAgICAweDEyQzQJLy8gUk1PTiByeCBvY3RldHMKKyNkZWZpbmUgRkVDX0lFRUVfUl9EUk9QICAgICAgICAgMHgxMkM4CS8vIGNvdW50IG9mIGZyYW1lcyBub3QgY291bnRlZCBjb3JyZWN0bHkKKyNkZWZpbmUgRkVDX0lFRUVfUl9GUkFNRV9PSyAgICAgMHgxMkNDCS8vIGZyYW1lcyByZWNlaXZlZCBPSworI2RlZmluZSBGRUNfSUVFRV9SX0NSQyAgICAgICAgICAweDEyRDAJLy8gZnJhbWVzIHJlY2VpdmVkIHdpdGggQ1JDIGVycm9yCisjZGVmaW5lIEZFQ19JRUVFX1JfQUxJR04gICAgICAgIDB4MTJENAkvLyBmcmFtZXMgcmVjZWl2ZWQgd2l0aCBhbGlnbm1lbnQgZXJyb3IKKyNkZWZpbmUgRkVDX0lFRUVfUl9NQUNFUlIgICAgICAgMHgxMkQ4CS8vIHJlY2VpdmUgRklGTyBvdmVyZmxvdyBjb3VudAorI2RlZmluZSBGRUNfSUVFRV9SX0ZEWEZDICAgICAgICAweDEyREMJLy8gZmxvdyBjb250cm9sIHBhdXNlIGZyYW1lcyByZWNlaXZlZAorI2RlZmluZSBGRUNfSUVFRV9SX09DVEVUU19PSyAgICAweDEyRTAJLy8gb2N0ZXQgY291bnQgZm9yIGZyYW1lcyByY3ZkIHcvbyBlcnJvcgorCisvLyByZWdpc3RlciBiaXQgZGVmaW5pdGlvbnMgYW5kIG1hY3JvcworI2RlZmluZSBGRUNfRUlSX1VOICAgICAgICAgICAgICAoMHgwMDA4MDAwMCkKKyNkZWZpbmUgRkVDX0VJUl9STCAgICAgICAgICAgICAgKDB4MDAxMDAwMDApCisjZGVmaW5lIEZFQ19FSVJfTEMgICAgICAgICAgICAgICgweDAwMjAwMDAwKQorI2RlZmluZSBGRUNfRUlSX0VCRVJSICAgICAgICAgICAoMHgwMDQwMDAwMCkKKyNkZWZpbmUgRkVDX0VJUl9NSUkgICAgICAgICAgICAgKDB4MDA4MDAwMDApCisjZGVmaW5lIEZFQ19FSVJfUlhCICAgICAgICAgICAgICgweDAxMDAwMDAwKQorI2RlZmluZSBGRUNfRUlSX1JYRiAgICAgICAgICAgICAoMHgwMjAwMDAwMCkKKyNkZWZpbmUgRkVDX0VJUl9UWEIgICAgICAgICAgICAgKDB4MDQwMDAwMDApCisjZGVmaW5lIEZFQ19FSVJfVFhGICAgICAgICAgICAgICgweDA4MDAwMDAwKQorI2RlZmluZSBGRUNfRUlSX0dSQSAgICAgICAgICAgICAoMHgxMDAwMDAwMCkKKyNkZWZpbmUgRkVDX0VJUl9CQUJUICAgICAgICAgICAgKDB4MjAwMDAwMDApCisjZGVmaW5lIEZFQ19FSVJfQkFCUiAgICAgICAgICAgICgweDQwMDAwMDAwKQorI2RlZmluZSBGRUNfRUlSX0hCRVJSICAgICAgICAgICAoMHg4MDAwMDAwMCkKKworI2RlZmluZSBGRUNfRUlNUl9VTiAgICAgICAgICAgICAoMHgwMDA4MDAwMCkKKyNkZWZpbmUgRkVDX0VJTVJfUkwgICAgICAgICAgICAgKDB4MDAxMDAwMDApCisjZGVmaW5lIEZFQ19FSU1SX0xDICAgICAgICAgICAgICgweDAwMjAwMDAwKQorI2RlZmluZSBGRUNfRUlNUl9FQkVSUiAgICAgICAgICAoMHgwMDQwMDAwMCkKKyNkZWZpbmUgRkVDX0VJTVJfTUlJICAgICAgICAgICAgKDB4MDA4MDAwMDApCisjZGVmaW5lIEZFQ19FSU1SX1JYQiAgICAgICAgICAgICgweDAxMDAwMDAwKQorI2RlZmluZSBGRUNfRUlNUl9SWEYgICAgICAgICAgICAoMHgwMjAwMDAwMCkKKyNkZWZpbmUgRkVDX0VJTVJfVFhCICAgICAgICAgICAgKDB4MDQwMDAwMDApCisjZGVmaW5lIEZFQ19FSU1SX1RYRiAgICAgICAgICAgICgweDA4MDAwMDAwKQorI2RlZmluZSBGRUNfRUlNUl9HUkEgICAgICAgICAgICAoMHgxMDAwMDAwMCkKKyNkZWZpbmUgRkVDX0VJTVJfQkFCVCAgICAgICAgICAgKDB4MjAwMDAwMDApCisjZGVmaW5lIEZFQ19FSU1SX0JBQlIgICAgICAgICAgICgweDQwMDAwMDAwKQorI2RlZmluZSBGRUNfRUlNUl9IQkVSUiAgICAgICAgICAoMHg4MDAwMDAwMCkKKworI2RlZmluZSBGRUNfUkRBUl9SX0RFU19BQ1RJVkUgICAoMHgwMTAwMDAwMCkKKworI2RlZmluZSBGRUNfVERBUl9YX0RFU19BQ1RJVkUgICAoMHgwMTAwMDAwMCkKKworI2RlZmluZSBGRUNfRUNSX1JFU0VUICAgICAgICAgICAoMHgwMDAwMDAwMSkKKyNkZWZpbmUgRkVDX0VDUl9FVEhFUl9FTiAgICAgICAgKDB4MDAwMDAwMDIpCisKKyNkZWZpbmUgRkVDX01NRlJfREFUQSh4KSAgICAgICAgKCgoeCkgJiAweEZGRkYpKQorI2RlZmluZSBGRUNfTU1GUl9UQSAgICAgICAgICAgICAoMHgwMDAyMDAwMCkKKyNkZWZpbmUgRkVDX01NRlJfUkEoeCkgICAgICAgICAgKCgoeCkgJiAweDFGKSA8PCAxOCkKKyNkZWZpbmUgRkVDX01NRlJfUEEoeCkgICAgICAgICAgKCgoeCkgJiAweDFGKSA8PCAyMykKKyNkZWZpbmUgRkVDX01NRlJfT1BfV1IgICAgICAgICAgKDB4MTAwMDAwMDApCisjZGVmaW5lIEZFQ19NTUZSX09QX1JEICAgICAgICAgICgweDIwMDAwMDAwKQorI2RlZmluZSBGRUNfTU1GUl9TVCAgICAgICAgICAgICAoMHg0MDAwMDAwMCkKKworI2RlZmluZSBGRUNfTVNDUl9NSUlfU1BFRUQoeCkgICAoKCh4KSAmIDB4MUYpIDw8IDEpCisjZGVmaW5lIEZFQ19NU0NSX0RJU19QUkVBTUJMRSAgICgweDAwMDAwMDA4KQorCisjZGVmaW5lIEZFQ19NSUJDX01JQl9JRExFICAgICAgICgweDQwMDAwMDAwKQorI2RlZmluZSBGRUNfTUlCQ19NSUJfRElTQUJMRSAgICAoMHg4MDAwMDAwMCkKKworI2RlZmluZSBGRUNfUkNSX0xPT1AgICAgICAgICAgICAoMHgwMDAwMDAwMSkKKyNkZWZpbmUgRkVDX1JDUl9EUlQgICAgICAgICAgICAgKDB4MDAwMDAwMDIpCisjZGVmaW5lIEZFQ19SQ1JfTUlJX01PREUgICAgICAgICgweDAwMDAwMDA0KQorI2RlZmluZSBGRUNfUkNSX1BST00gICAgICAgICAgICAoMHgwMDAwMDAwOCkKKyNkZWZpbmUgRkVDX1JDUl9CQ19SRUogICAgICAgICAgKDB4MDAwMDAwMTApCisjZGVmaW5lIEZFQ19SQ1JfRkNFICAgICAgICAgICAgICgweDAwMDAwMDIwKQorI2RlZmluZSBGRUNfUkNSX01BWF9GTCh4KSAgICAgICAoKCh4KSAmIDB4MDdGRikgPDwgMTYpCisKKyNkZWZpbmUgRkVDX1RDUl9HVFMgICAgICAgICAgICAgKDB4MDAwMDAwMDEpCisjZGVmaW5lIEZFQ19UQ1JfSEJDICAgICAgICAgICAgICgweDAwMDAwMDAyKQorI2RlZmluZSBGRUNfVENSX0ZERU4gICAgICAgICAgICAoMHgwMDAwMDAwNCkKKyNkZWZpbmUgRkVDX1RDUl9URkNfUEFVU0UgICAgICAgKDB4MDAwMDAwMDgpCisjZGVmaW5lIEZFQ19UQ1JfUkZDX1BBVVNFICAgICAgICgweDAwMDAwMDEwKQorCisjZGVmaW5lIEZFQ19QQUxSX0JZVEUzKHgpICAgICAgICgoKHgpICYgMHhGRikgPDwgIDApCisjZGVmaW5lIEZFQ19QQUxSX0JZVEUyKHgpICAgICAgICgoKHgpICYgMHhGRikgPDwgIDgpCisjZGVmaW5lIEZFQ19QQUxSX0JZVEUxKHgpICAgICAgICgoKHgpICYgMHhGRikgPDwgMTYpCisjZGVmaW5lIEZFQ19QQUxSX0JZVEUwKHgpICAgICAgICgoKHgpICYgMHhGRikgPDwgMjQpCisKKy8vI2RlZmluZSBGRUNfUEFVUl9UWVBFKHgpICAgICAgICAoKCh4KSAmIDB4RkZGRikgPDwgIDApCisjZGVmaW5lIEZFQ19QQVVSX0JZVEU1KHgpICAgICAgICgoKHgpICYgICAweEZGKSA8PCAxNikKKyNkZWZpbmUgRkVDX1BBVVJfQllURTQoeCkgICAgICAgKCgoeCkgJiAgIDB4RkYpIDw8IDI0KQorCisjZGVmaW5lIEZFQ19PUERfUEFVU0VfRFVSKHgpICAgICgoKHgpICYgMHhGRkZGKSkKKy8vI2RlZmluZSBGRUNfT1BEX09QQ09ERSh4KSAgICAgICAoKCh4KSAmIDB4RkZGRikgPDwgMTYpCisKKy8vbS5iLgorI2RlZmluZSBGRUNfSUFVUl9CWVRFNyh4KSAgICAgICAoKCh4KSAmIDB4RkYpIDw8ICAwKQorI2RlZmluZSBGRUNfSUFVUl9CWVRFNih4KSAgICAgICAoKCh4KSAmIDB4RkYpIDw8ICA4KQorI2RlZmluZSBGRUNfSUFVUl9CWVRFNSh4KSAgICAgICAoKCh4KSAmIDB4RkYpIDw8IDE2KQorI2RlZmluZSBGRUNfSUFVUl9CWVRFNCh4KSAgICAgICAoKCh4KSAmIDB4RkYpIDw8IDI0KQorCisjZGVmaW5lIEZFQ19JQUxSX0JZVEUzKHgpICAgICAgICgoKHgpICYgMHhGRikgPDwgIDApCisjZGVmaW5lIEZFQ19JQUxSX0JZVEUyKHgpICAgICAgICgoKHgpICYgMHhGRikgPDwgIDgpCisjZGVmaW5lIEZFQ19JQUxSX0JZVEUxKHgpICAgICAgICgoKHgpICYgMHhGRikgPDwgMTYpCisjZGVmaW5lIEZFQ19JQUxSX0JZVEUwKHgpICAgICAgICgoKHgpICYgMHhGRikgPDwgMjQpCisKKyNkZWZpbmUgRkVDX0dBVVJfQllURTcoeCkgICAgICAgKCgoeCkgJiAweEZGKSA8PCAgMCkKKyNkZWZpbmUgRkVDX0dBVVJfQllURTYoeCkgICAgICAgKCgoeCkgJiAweEZGKSA8PCAgOCkKKyNkZWZpbmUgRkVDX0dBVVJfQllURTUoeCkgICAgICAgKCgoeCkgJiAweEZGKSA8PCAxNikKKyNkZWZpbmUgRkVDX0dBVVJfQllURTQoeCkgICAgICAgKCgoeCkgJiAweEZGKSA8PCAyNCkKKworI2RlZmluZSBGRUNfR0FMUl9CWVRFMyh4KSAgICAgICAoKCh4KSAmIDB4RkYpIDw8ICAwKQorI2RlZmluZSBGRUNfR0FMUl9CWVRFMih4KSAgICAgICAoKCh4KSAmIDB4RkYpIDw8ICA4KQorI2RlZmluZSBGRUNfR0FMUl9CWVRFMSh4KSAgICAgICAoKCh4KSAmIDB4RkYpIDw8IDE2KQorI2RlZmluZSBGRUNfR0FMUl9CWVRFMCh4KSAgICAgICAoKCh4KSAmIDB4RkYpIDw8IDI0KQorLy8gXl5eXgorCisjZGVmaW5lIEZFQ19URldSX1hfV01SS182NCAgICAgICgweDAwMDAwMDAxKQorI2RlZmluZSBGRUNfVEZXUl9YX1dNUktfMTI4ICAgICAoMHgwMDAwMDAwMikKKyNkZWZpbmUgRkVDX1RGV1JfWF9XTVJLXzE5MiAgICAgKDB4MDAwMDAwMDMpCisKKy8vbS5iLgorI2RlZmluZSBGRUNfRlJCUl9SX0JPVU5EKHgpICAgICAoKCh4KSAmIDB4RkYpIDw8IDIpCisKKy8vbS5iLgorI2RlZmluZSBGRUNfRlJTUl9SX0ZTVEFSVCh4KSAgICAoKCh4KSAmIDB4RkYpIDw8IDIpCisKKy8vbS5iLgorI2RlZmluZSBGRUNfRVJEU1JfUl9ERVNfU1RBUlQoeCkgICgoKHgpICYgMHgzRkZGRkZGRikgPDwgMikKKworLy9tLmIuCisjZGVmaW5lIEZFQ19FVFNEUl9YX0RFU19TVEFSVCh4KSAgKCgoeCkgJiAweDNGRkZGRkZGKSA8PCAyKQorCisjZGVmaW5lIEZFQ19FTVJCUl9SX0JVRl9TSVpFKHgpICgoKHgpICYgMHg3RikgPDwgIDQpCisKKyNkZWZpbmUgRkVDX1J4QkRfVFIgICAgICAgICAgICAgMHgwMDAxCisjZGVmaW5lIEZFQ19SeEJEX09WICAgICAgICAgICAgIDB4MDAwMgorI2RlZmluZSBGRUNfUnhCRF9DUiAgICAgICAgICAgICAweDAwMDQKKyNkZWZpbmUgRkVDX1J4QkRfTk8gICAgICAgICAgICAgMHgwMDEwCisjZGVmaW5lIEZFQ19SeEJEX0xHICAgICAgICAgICAgIDB4MDAyMAorI2RlZmluZSBGRUNfUnhCRF9NQyAgICAgICAgICAgICAweDAwNDAKKyNkZWZpbmUgRkVDX1J4QkRfQkMgICAgICAgICAgICAgMHgwMDgwCisjZGVmaW5lIEZFQ19SeEJEX00gICAgICAgICAgICAgIDB4MDEwMAorI2RlZmluZSBGRUNfUnhCRF9MICAgICAgICAgICAgICAweDA4MDAKKyNkZWZpbmUgRkVDX1J4QkRfUjAyICAgICAgICAgICAgMHgxMDAwCisjZGVmaW5lIEZFQ19SeEJEX1cgICAgICAgICAgICAgIDB4MjAwMAorI2RlZmluZSBGRUNfUnhCRF9SMDEgICAgICAgICAgICAweDQwMDAKKyNkZWZpbmUgRkVDX1J4QkRfSU5VU0UgICAgICAgICAgMHg0MDAwCisjZGVmaW5lIEZFQ19SeEJEX0UgICAgICAgICAgICAgIDB4ODAwMAorCisvL20uYi4KKy8vI2RlZmluZSBGRUNfVHhCRF9DU0wgICAgICAgICAgICAweDAwMDEKKy8vI2RlZmluZSBGRUNfVHhCRF9VTiAgICAgICAgICAgICAweDAwMDIKKy8vI2RlZmluZSBGRUNfVHhCRF9STCAgICAgICAgICAgICAweDAwNDAKKy8vI2RlZmluZSBGRUNfVHhCRF9MQyAgICAgICAgICAgICAweDAwODAKKy8vI2RlZmluZSBGRUNfVHhCRF9IQiAgICAgICAgICAgICAweDAxMDAKKy8vI2RlZmluZSBGRUNfVHhCRF9ERUYgICAgICAgICAgICAweDAyMDAKKyNkZWZpbmUgRkVDX1R4QkRfQUJDICAgICAgICAgICAgMHgwMjAwCisvLyBeXl5eCisjZGVmaW5lIEZFQ19UeEJEX1RDICAgICAgICAgICAgIDB4MDQwMAorI2RlZmluZSBGRUNfVHhCRF9MICAgICAgICAgICAgICAweDA4MDAKKyNkZWZpbmUgRkVDX1R4QkRfVE8yICAgICAgICAgICAgMHgxMDAwCisjZGVmaW5lIEZFQ19UeEJEX1cgICAgICAgICAgICAgIDB4MjAwMAorI2RlZmluZSBGRUNfVHhCRF9UTzEgICAgICAgICAgICAweDQwMDAKKyNkZWZpbmUgRkVDX1R4QkRfSU5VU0UgICAgICAgICAgMHg0MDAwCisjZGVmaW5lIEZFQ19UeEJEX1IgICAgICAgICAgICAgIDB4ODAwMAorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIFJ4IGFuZCBUeCBidWZmZXIgZGVzY3JpcHRvciBmb3JtYXQKK3R5cGVkZWYgc3RydWN0IHsKKwlXT1JEIG1fd1N0YXR1czsJCS8vIGNvbnRyb2wgLyBzdGF0dXMgIC0tLSAgdXNlZCBieSBlZHJ2LCBkbyBub3QgY2hhbmdlIGluIGFwcGxpY2F0aW9uCisJV09SRCBtX3dMZW5ndGg7CQkvLyB0cmFuc2ZlciBsZW5ndGgKKwlCWVRFICptX3BiRGF0YTsJCS8vIGJ1ZmZlciBhZGRyZXNzCit9IHRCdWZmZXJEZXNjcjsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZiAoTk9fT0ZfSU5TVEFOQ0VTID4gMSkKKyNkZWZpbmUgRUNJX1dSSVRFX0RXX1JFRyhvZmYsdmFsKSAgICAgICAoKihEV09SRCAqKSh2b2lkICopKCZfX0lQU0JBUltvZmZdKSA9IHZhbCkKKyNkZWZpbmUgRUNJX1JFQURfRFdfUkVHKG9mZikgICAgICAgICAgICAoKihEV09SRCAqKSh2b2lkICopKCZfX0lQU0JBUltvZmZdKSkKKyNlbHNlCisjaWYgKEVEUlZfVVNFRF9FVEhfQ1RSTCA9PSAwKQorI2RlZmluZSBFQ0lfV1JJVEVfRFdfUkVHKG9mZix2YWwpICAgICAgICgqKERXT1JEICopKHZvaWQgKikoJl9fSVBTQkFSW0ZFQzBfQUREUitvZmZdKSA9IHZhbCkKKyNkZWZpbmUgRUNJX1JFQURfRFdfUkVHKG9mZikgICAgICAgICAgICAoKihEV09SRCAqKSh2b2lkICopKCZfX0lQU0JBUltGRUMwX0FERFIrb2ZmXSkpCisjZWxzZQorI2RlZmluZSBFQ0lfV1JJVEVfRFdfUkVHKG9mZix2YWwpICAgICAgICgqKERXT1JEICopKHZvaWQgKikoJl9fSVBTQkFSW0ZFQzFfQUREUitvZmZdKSA9IHZhbCkKKyNkZWZpbmUgRUNJX1JFQURfRFdfUkVHKG9mZikgICAgICAgICAgICAoKihEV09SRCAqKSh2b2lkICopKCZfX0lQU0JBUltGRUMxX0FERFIrb2ZmXSkpCisjZW5kaWYKKyNlbmRpZgorCisjZW5kaWYgLy8gI2lmbmRlZiBfRURSVl9GRUNfSF8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwvRWRydlNpbS5oIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FZHJ2U2ltLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzkzMDBlMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRWRydlNpbS5oCkBAIC0wLDAgKzEsODkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBpbnRlcmZhY2UgZm9yIGV0aGVybmV0IGRyaXZlciBzaW11bGF0aW9uCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRWRydlNpbS5oLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS4zICQgICREYXRlOiAyMDA4LzA0LzE3IDIxOjM2OjMyICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorICAgICAgICAgICAgICAgIERldiBDKysgYW5kIEdOVS1Db21waWxlciBmb3IgbTY4aworCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgIDIwMDYvMDYvMTUgZC5rLjogICBzdGFydCBvZiBpbXBsZW1lbnRhdGlvbgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9FRFJWU0lNX0hfCisjZGVmaW5lIF9FRFJWU0lNX0hfCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkIEVkcnZSeEludGVycnVwdEhhbmRsZXIoQllURSBiQnVmZmVySW5GcmFtZV9wLCBCWVRFICogcGJFdGhlcm5ldERhdGFfcCwKKwkJCSAgICBXT1JEIHdEYXRhTGVuX3ApOworCisjZW5kaWYgLy8gI2lmbmRlZiBfRURSVlNJTV9IXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGwuaCBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmU2MGY3NwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsLmgKQEAgLTAsMCArMSwyNzMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBpbmNsdWRlIGZpbGUgZm9yIEVQTCBBUEkgbGF5ZXIKKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgICAgICAgICRSQ1NmaWxlOiBFcGwuaCx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuOCAkICAkRGF0ZTogMjAwOC8xMS8xNyAxNjo0MDozOSAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICAgICAgR0NDIFYzLjQKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUmV2aXNpb24gSGlzdG9yeToKKworICAyMDA2LzA1LzIyIGQuay46ICAgc3RhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uLCB2ZXJzaW9uIDEuMDAKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfRVBMX0FQSV9IXworI2RlZmluZSBfRVBMX0FQSV9IXworCisjaW5jbHVkZSAiRXBsSW5jLmgiCisjaW5jbHVkZSAiRXBsU2RvLmgiCisjaW5jbHVkZSAiRXBsT2JkLmgiCisjaW5jbHVkZSAiRXBsTGVkLmgiCisjaW5jbHVkZSAiRXBsRXZlbnQuaCIKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvbnN0IGRlZmluZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyB0eXBlZGVmCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgaW50IG1fdWlOb2RlSWQ7CisJdEVwbE5tdFN0YXRlIG1fTm10U3RhdGU7CisJdEVwbE5tdE5vZGVFdmVudCBtX05vZGVFdmVudDsKKwlXT1JEIG1fd0Vycm9yQ29kZTsJLy8gRVBMIGVycm9yIGNvZGUgaWYgbV9Ob2RlRXZlbnQgPT0ga0VwbE5tdE5vZGVFdmVudEVycm9yCisJQk9PTCBtX2ZNYW5kYXRvcnk7CisKK30gdEVwbEFwaUV2ZW50Tm9kZTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXRFcGxObXRTdGF0ZSBtX05tdFN0YXRlOwkvLyBsb2NhbCBOTVQgc3RhdGUKKwl0RXBsTm10Qm9vdEV2ZW50IG1fQm9vdEV2ZW50OworCVdPUkQgbV93RXJyb3JDb2RlOwkvLyBFUEwgZXJyb3IgY29kZSBpZiBtX0Jvb3RFdmVudCA9PSBrRXBsTm10Qm9vdEV2ZW50RXJyb3IKKworfSB0RXBsQXBpRXZlbnRCb290OworCit0eXBlZGVmIHN0cnVjdCB7CisJdEVwbExlZFR5cGUgbV9MZWRUeXBlOwkvLyB0eXBlIG9mIHRoZSBMRUQgKGUuZy4gU3RhdHVzIG9yIEVycm9yKQorCUJPT0wgbV9mT247CQkvLyBzdGF0ZSBvZiB0aGUgTEVEIChlLmcuIG9uIG9yIG9mZikKKworfSB0RXBsQXBpRXZlbnRMZWQ7CisKK3R5cGVkZWYgZW51bSB7CisJa0VwbEFwaUV2ZW50Tm10U3RhdGVDaGFuZ2UgPSAweDEwLAkvLyBtX05tdFN0YXRlQ2hhbmdlCisvLyAgICBrRXBsQXBpRXZlbnRSZXF1ZXN0Tm10ICAgICA9IDB4MTEsICAgIC8vIG1fYk5tdENtZAorCWtFcGxBcGlFdmVudENyaXRpY2FsRXJyb3IgPSAweDEyLAkvLyBtX0ludGVybmFsRXJyb3IsIFN0YWNrIGhhbHRlZAorCWtFcGxBcGlFdmVudFdhcm5pbmcgPSAweDEzLAkvLyBtX0ludGVybmFsRXJyb3IsIFN0YWNrIHJ1bm5pbmcKKwlrRXBsQXBpRXZlbnROb2RlID0gMHgyMCwJLy8gbV9Ob2RlCisJa0VwbEFwaUV2ZW50Qm9vdCA9IDB4MjEsCS8vIG1fQm9vdAorCWtFcGxBcGlFdmVudFNkbyA9IDB4NjIsCS8vIG1fU2RvCisJa0VwbEFwaUV2ZW50T2JkQWNjZXNzID0gMHg2OSwJLy8gbV9PYmRDYlBhcmFtCisJa0VwbEFwaUV2ZW50TGVkID0gMHg3MCwJLy8gbV9MZWQKKworfSB0RXBsQXBpRXZlbnRUeXBlOworCit0eXBlZGVmIHVuaW9uIHsKKwl0RXBsRXZlbnRObXRTdGF0ZUNoYW5nZSBtX05tdFN0YXRlQ2hhbmdlOworCXRFcGxFdmVudEVycm9yIG1fSW50ZXJuYWxFcnJvcjsKKwl0RXBsU2RvQ29tRmluaXNoZWQgbV9TZG87CisJdEVwbE9iZENiUGFyYW0gbV9PYmRDYlBhcmFtOworCXRFcGxBcGlFdmVudE5vZGUgbV9Ob2RlOworCXRFcGxBcGlFdmVudEJvb3QgbV9Cb290OworCXRFcGxBcGlFdmVudExlZCBtX0xlZDsKKworfSB0RXBsQXBpRXZlbnRBcmc7CisKK3R5cGVkZWYgdEVwbEtlcm5lbChQVUJMSUMgUk9NICogdEVwbEFwaUNiRXZlbnQpICh0RXBsQXBpRXZlbnRUeXBlIEV2ZW50VHlwZV9wLAkvLyBJTjogZXZlbnQgdHlwZSAoZW51bSkKKwkJCQkJCSB0RXBsQXBpRXZlbnRBcmcgKiBwRXZlbnRBcmdfcCwJLy8gSU46IGV2ZW50IGFyZ3VtZW50ICh1bmlvbikKKwkJCQkJCSB2b2lkIEdFTkVSSUMgKiBwVXNlckFyZ19wKTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGludCBtX3VpU2l6ZU9mU3RydWN0OworCUJPT0wgbV9mQXN5bmNPbmx5OwkvLyBkbyBub3QgbmVlZCB0byByZWdpc3RlciBQUmVzCisJdW5zaWduZWQgaW50IG1fdWlOb2RlSWQ7CS8vIGxvY2FsIG5vZGUgSUQKKwlCWVRFIG1fYWJNYWNBZGRyZXNzWzZdOwkvLyBsb2NhbCBNQUMgYWRkcmVzcworCisJLy8gMHgxRjgyOiBOTVRfRmVhdHVyZUZsYWdzX1UzMgorCURXT1JEIG1fZHdGZWF0dXJlRmxhZ3M7CisJLy8gQ3ljbGUgTGVuZ3RoICgweDEwMDY6IE5NVF9DeWNsZUxlbl9VMzIpIGluIFt1c10KKwlEV09SRCBtX2R3Q3ljbGVMZW47CS8vIHJlcXVpcmVkIGZvciBlcnJvciBkZXRlY3Rpb24KKwkvLyAweDFGOTg6IE5NVF9DeWNsZVRpbWluZ19SRUMKKwkvLyAweDFGOTguMTogSXNvY2hyVHhNYXhQYXlsb2FkX1UxNgorCXVuc2lnbmVkIGludCBtX3VpSXNvY2hyVHhNYXhQYXlsb2FkOwkvLyBjb25zdAorCS8vIDB4MUY5OC4yOiBJc29jaHJSeE1heFBheWxvYWRfVTE2CisJdW5zaWduZWQgaW50IG1fdWlJc29jaHJSeE1heFBheWxvYWQ7CS8vIGNvbnN0CisJLy8gMHgxRjk4LjM6IFBSZXNNYXhMYXRlbmN5X1UzMgorCURXT1JEIG1fZHdQcmVzTWF4TGF0ZW5jeTsJLy8gY29uc3QgaW4gW25zXSwgb25seSByZXF1aXJlZCBmb3IgSWRlbnRSZXMKKwkvLyAweDFGOTguNDogUFJlcUFjdFBheWxvYWRMaW1pdF9VMTYKKwl1bnNpZ25lZCBpbnQgbV91aVByZXFBY3RQYXlsb2FkTGltaXQ7CS8vIHJlcXVpcmVkIGZvciBpbml0aWFsaXNhdGlvbiAoKzI4IGJ5dGVzKQorCS8vIDB4MUY5OC41OiBQUmVzQWN0UGF5bG9hZExpbWl0X1UxNgorCXVuc2lnbmVkIGludCBtX3VpUHJlc0FjdFBheWxvYWRMaW1pdDsJLy8gcmVxdWlyZWQgZm9yIGluaXRpYWxpc2F0aW9uIG9mIFByZXMgZnJhbWUgKCsyOCBieXRlcykKKwkvLyAweDFGOTguNjogQVNuZE1heExhdGVuY3lfVTMyCisJRFdPUkQgbV9kd0FzbmRNYXhMYXRlbmN5OwkvLyBjb25zdCBpbiBbbnNdLCBvbmx5IHJlcXVpcmVkIGZvciBJZGVudFJlcworCS8vIDB4MUY5OC43OiBNdWx0aXBsQ3ljbGVDbnRfVTgKKwl1bnNpZ25lZCBpbnQgbV91aU11bHRpcGxDeWNsZUNudDsJLy8gcmVxdWlyZWQgZm9yIGVycm9yIGRldGVjdGlvbgorCS8vIDB4MUY5OC44OiBBc3luY01UVV9VMTYKKwl1bnNpZ25lZCBpbnQgbV91aUFzeW5jTXR1OwkvLyByZXF1aXJlZCB0byBzZXQgdXAgbWF4IGZyYW1lIHNpemUKKwkvLyAweDFGOTguOTogUHJlc2NhbGVyX1UxNgorCXVuc2lnbmVkIGludCBtX3VpUHJlc2NhbGVyOwkvLyByZXF1aXJlZCBmb3Igc3luYworCS8vICQkJCBNdWx0aXBsZXhlZCBTbG90CisKKwkvLyAweDFDMTQ6IERMTF9Mb3NzT2ZGcmFtZVRvbGVyYW5jZV9VMzIgaW4gW25zXQorCURXT1JEIG1fZHdMb3NzT2ZGcmFtZVRvbGVyYW5jZTsKKworCS8vIDB4MUY4QTogTk1UX01OQ3ljbGVUaW1pbmdfUkVDCisJLy8gMHgxRjhBLjE6IFdhaXRTb0NQUmVxX1UzMiBpbiBbbnNdCisJRFdPUkQgbV9kd1dhaXRTb2NQcmVxOworCisJLy8gMHgxRjhBLjI6IEFzeW5jU2xvdFRpbWVvdXRfVTMyIGluIFtuc10KKwlEV09SRCBtX2R3QXN5bmNTbG90VGltZW91dDsKKworCURXT1JEIG1fZHdEZXZpY2VUeXBlOwkvLyBOTVRfRGV2aWNlVHlwZV9VMzIKKwlEV09SRCBtX2R3VmVuZG9ySWQ7CS8vIE5NVF9JZGVudGl0eU9iamVjdF9SRUMuVmVuZG9ySWRfVTMyCisJRFdPUkQgbV9kd1Byb2R1Y3RDb2RlOwkvLyBOTVRfSWRlbnRpdHlPYmplY3RfUkVDLlByb2R1Y3RDb2RlX1UzMgorCURXT1JEIG1fZHdSZXZpc2lvbk51bWJlcjsJLy8gTk1UX0lkZW50aXR5T2JqZWN0X1JFQy5SZXZpc2lvbk5vX1UzMgorCURXT1JEIG1fZHdTZXJpYWxOdW1iZXI7CS8vIE5NVF9JZGVudGl0eU9iamVjdF9SRUMuU2VyaWFsTm9fVTMyCisJUVdPUkQgbV9xd1ZlbmRvclNwZWNpZmljRXh0MTsKKwlEV09SRCBtX2R3VmVyaWZ5Q29uZmlndXJhdGlvbkRhdGU7CS8vIENGTV9WZXJpZnlDb25maWd1cmF0aW9uX1JFQy5Db25mRGF0ZV9VMzIKKwlEV09SRCBtX2R3VmVyaWZ5Q29uZmlndXJhdGlvblRpbWU7CS8vIENGTV9WZXJpZnlDb25maWd1cmF0aW9uX1JFQy5Db25mVGltZV9VMzIKKwlEV09SRCBtX2R3QXBwbGljYXRpb25Td0RhdGU7CS8vIFBETF9Mb2NWZXJBcHBsU3dfUkVDLkFwcGxTd0RhdGVfVTMyIG9uIHByb2dyYW1tYWJsZSBkZXZpY2Ugb3IgZGF0ZSBwb3J0aW9uIG9mIE5NVF9NYW51ZmFjdFN3VmVyc19WUyBvbiBub24tcHJvZ3JhbW1hYmxlIGRldmljZQorCURXT1JEIG1fZHdBcHBsaWNhdGlvblN3VGltZTsJLy8gUERMX0xvY1ZlckFwcGxTd19SRUMuQXBwbFN3VGltZV9VMzIgb24gcHJvZ3JhbW1hYmxlIGRldmljZSBvciB0aW1lIHBvcnRpb24gb2YgTk1UX01hbnVmYWN0U3dWZXJzX1ZTIG9uIG5vbi1wcm9ncmFtbWFibGUgZGV2aWNlCisJRFdPUkQgbV9kd0lwQWRkcmVzczsKKwlEV09SRCBtX2R3U3VibmV0TWFzazsKKwlEV09SRCBtX2R3RGVmYXVsdEdhdGV3YXk7CisJQllURSBtX3NIb3N0bmFtZVszMl07CisJQllURSBtX2FiVmVuZG9yU3BlY2lmaWNFeHQyWzQ4XTsKKworCWNoYXIgKm1fcHN6RGV2TmFtZTsJLy8gTk1UX01hbnVmYWN0RGV2TmFtZV9WUyAoMHgxMDA4LzAgbG9jYWwgT0QpCisJY2hhciAqbV9wc3pId1ZlcnNpb247CS8vIE5NVF9NYW51ZmFjdEh3VmVyc19WUyAgKDB4MTAwOS8wIGxvY2FsIE9EKQorCWNoYXIgKm1fcHN6U3dWZXJzaW9uOwkvLyBOTVRfTWFudWZhY3RTd1ZlcnNfVlMgICgweDEwMEEvMCBsb2NhbCBPRCkKKworCXRFcGxBcGlDYkV2ZW50IG1fcGZuQ2JFdmVudDsKKwl2b2lkICptX3BFdmVudFVzZXJBcmc7CisJdEVwbFN5bmNDYiBtX3BmbkNiU3luYzsKKworfSB0RXBsQXBpSW5pdFBhcmFtOworCit0eXBlZGVmIHN0cnVjdCB7CisJdm9pZCAqbV9wSW1hZ2U7CisJdW5zaWduZWQgaW50IG1fdWlTaXplOworCit9IHRFcGxBcGlQcm9jZXNzSW1hZ2U7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIFBVQkxJQyBFcGxBcGlJbml0aWFsaXplKHRFcGxBcGlJbml0UGFyYW0gKiBwSW5pdFBhcmFtX3ApOworCit0RXBsS2VybmVsIFBVQkxJQyBFcGxBcGlTaHV0ZG93bih2b2lkKTsKKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsQXBpUmVhZE9iamVjdCh0RXBsU2RvQ29tQ29uSGRsICogcFNkb0NvbUNvbkhkbF9wLAorCQkJCSAgIHVuc2lnbmVkIGludCB1aU5vZGVJZF9wLAorCQkJCSAgIHVuc2lnbmVkIGludCB1aUluZGV4X3AsCisJCQkJICAgdW5zaWduZWQgaW50IHVpU3ViaW5kZXhfcCwKKwkJCQkgICB2b2lkICpwRHN0RGF0YV9sZV9wLAorCQkJCSAgIHVuc2lnbmVkIGludCAqcHVpU2l6ZV9wLAorCQkJCSAgIHRFcGxTZG9UeXBlIFNkb1R5cGVfcCwgdm9pZCAqcFVzZXJBcmdfcCk7CisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbEFwaVdyaXRlT2JqZWN0KHRFcGxTZG9Db21Db25IZGwgKiBwU2RvQ29tQ29uSGRsX3AsCisJCQkJICAgIHVuc2lnbmVkIGludCB1aU5vZGVJZF9wLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgdWlJbmRleF9wLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgdWlTdWJpbmRleF9wLAorCQkJCSAgICB2b2lkICpwU3JjRGF0YV9sZV9wLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgdWlTaXplX3AsCisJCQkJICAgIHRFcGxTZG9UeXBlIFNkb1R5cGVfcCwgdm9pZCAqcFVzZXJBcmdfcCk7CisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbEFwaUZyZWVTZG9DaGFubmVsKHRFcGxTZG9Db21Db25IZGwgU2RvQ29tQ29uSGRsX3ApOworCit0RXBsS2VybmVsIFBVQkxJQyBFcGxBcGlSZWFkTG9jYWxPYmplY3QodW5zaWduZWQgaW50IHVpSW5kZXhfcCwKKwkJCQkJdW5zaWduZWQgaW50IHVpU3ViaW5kZXhfcCwKKwkJCQkJdm9pZCAqcERzdERhdGFfcCwKKwkJCQkJdW5zaWduZWQgaW50ICpwdWlTaXplX3ApOworCit0RXBsS2VybmVsIFBVQkxJQyBFcGxBcGlXcml0ZUxvY2FsT2JqZWN0KHVuc2lnbmVkIGludCB1aUluZGV4X3AsCisJCQkJCSB1bnNpZ25lZCBpbnQgdWlTdWJpbmRleF9wLAorCQkJCQkgdm9pZCAqcFNyY0RhdGFfcCwKKwkJCQkJIHVuc2lnbmVkIGludCB1aVNpemVfcCk7CisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbEFwaUNiT2JkQWNjZXNzKHRFcGxPYmRDYlBhcmFtIE1FTSAqIHBQYXJhbV9wKTsKKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsQXBpTGlua09iamVjdCh1bnNpZ25lZCBpbnQgdWlPYmpJbmRleF9wLAorCQkJCSAgIHZvaWQgKnBWYXJfcCwKKwkJCQkgICB1bnNpZ25lZCBpbnQgKnB1aVZhckVudHJpZXNfcCwKKwkJCQkgICB0RXBsT2JkU2l6ZSAqIHBFbnRyeVNpemVfcCwKKwkJCQkgICB1bnNpZ25lZCBpbnQgdWlGaXJzdFN1YmluZGV4X3ApOworCit0RXBsS2VybmVsIFBVQkxJQyBFcGxBcGlFeGVjTm10Q29tbWFuZCh0RXBsTm10RXZlbnQgTm10RXZlbnRfcCk7CisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbEFwaVByb2Nlc3Modm9pZCk7CisKKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVF9NTikpICE9IDApCit0RXBsS2VybmVsIFBVQkxJQyBFcGxBcGlNblRyaWdnZXJTdGF0ZUNoYW5nZSh1bnNpZ25lZCBpbnQgdWlOb2RlSWRfcCwKKwkJCQkJICAgICB0RXBsTm10Tm9kZUNvbW1hbmQgTm9kZUNvbW1hbmRfcCk7CisjZW5kaWYKKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsQXBpR2V0SWRlbnRSZXNwb25zZSh1bnNpZ25lZCBpbnQgdWlOb2RlSWRfcCwKKwkJCQkJIHRFcGxJZGVudFJlc3BvbnNlICoqCisJCQkJCSBwcElkZW50UmVzcG9uc2VfcCk7CisKKy8vIGZ1bmN0aW9ucyBmb3IgcHJvY2VzcyBpbWFnZSB3aWxsIGJlIGltcGxlbWVudGVkIGluIHNlcGFyYXRlIGZpbGUKK3RFcGxLZXJuZWwgUFVCTElDIEVwbEFwaVByb2Nlc3NJbWFnZVNldHVwKHZvaWQpOwordEVwbEtlcm5lbCBQVUJMSUMgRXBsQXBpUHJvY2Vzc0ltYWdlRXhjaGFuZ2VJbih0RXBsQXBpUHJvY2Vzc0ltYWdlICogcFBJX3ApOwordEVwbEtlcm5lbCBQVUJMSUMgRXBsQXBpUHJvY2Vzc0ltYWdlRXhjaGFuZ2VPdXQodEVwbEFwaVByb2Nlc3NJbWFnZSAqIHBQSV9wKTsKKworI2VuZGlmIC8vICNpZm5kZWYgX0VQTF9BUElfSF8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsQW1pLmggYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbEFtaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmYTA0YTQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbEFtaS5oCkBAIC0wLDAgKzEsMzYyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgb3BlblBPV0VSTElOSworCisgIERlc2NyaXB0aW9uOiAgRGVmaW5pdGlvbnMgZm9yIEFic3RyYWN0IE1lbW9yeSBJbnRlcmZhY2UKKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgICAgICAgICRSQ1NmaWxlOiBFcGxBbWkuaCx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuMiAkICAkRGF0ZTogMjAwOC8wNC8xNyAyMTozNjozMiAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICBHQ0MKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUmV2aXNpb24gSGlzdG9yeToKKworICAgMDYuMDMuMjAwMCAgLXJzCisgICAgICAgICAgICAgICBJbXBsZW1lbnRhdGlvbgorCisgICAxNi4wOS4yMDAyICAtYXMKKyAgICAgICAgICAgICAgIFRvIHNhdmUgY29kZSBzcGFjZSB0aGUgZnVuY3Rpb25zIEFtaVNldEJ5dGUgYW5kIEFtaUdldEJ5dGUKKyAgICAgICAgICAgICAgIGFyZSByZXBsYWNlZCBieSBtYWNyb3MuIEZvciB0YXJnZXRzIHdoaWNoIGFzc2lnbiBCWVRFIGJ5CisgICAgICAgICAgICAgICBhbiAxNkJpdCB0eXBlLCB0aGUgZGVmaW5pdGlvbiBvZiBtYWNyb3MgbXVzdCBjaGFuZ2VkIHRvCisgICAgICAgICAgICAgICBmdW5jdGlvbnMuCisKKyAgIDIzLjAyLjIwMDUgIHIuZC46CisgICAgICAgICAgICAgICBGdW5jdGlvbnMgaW5jbHVkZWQgZm9yIGV4dGVuZGVkIGRhdGEgdHlwZXMgc3VjaCBhcyBVTlNJR05FRDI0LAorICAgICAgICAgICAgICAgVU5TSUdORUQ0MCwgLi4uCisKKyAgIDEzLjA2LjIwMDYgIGQuay46CisgICAgICAgICAgICAgICBFeHRlbmRlZCB0aGUgaW50ZXJmYWNlIGZvciBFUEwgd2l0aCB0aGUgZGlmZmVyZW50IGZ1bmN0aW9ucworICAgICAgICAgICAgICAgZm9yIGxpdHRsZSBlbmRpYW4gYW5kIGJpZyBlbmRpYW4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfRVBMQU1JX0hfCisjZGVmaW5lIF9FUExBTUlfSF8KKworI2lmICgoREVWX1NZU1RFTSAmIF9ERVZfNjRCSVRfU1VQUE9SVF8pID09IDApCisvLyAgICAjaWZkZWYgVVNFX1ZBUjY0CisjZXJyb3IgJ0VSUk9SOiBkZXZlbG9wbWVudCBzeXN0ZW0gZG9lcyBub3Qgc3VwcG9ydCA2NCBiaXQgb3BlcmF0aW9ucyEnCisvLyAgICAjZW5kaWYKKyNlbmRpZgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIHR5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIFByb3RvdHlwZW4KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2lmIChUQVJHRVRfU1lTVEVNID09IF9XSU4zMl8pCisjaWYgZGVmaW5lZChJTkxJTkVfRlVOQ1RJT05fREVGKQorI3VuZGVmICBJTkxJTkVfRlVOQ1RJT04KKyNkZWZpbmUgSU5MSU5FX0ZVTkNUSU9OICAgICBJTkxJTkVfRlVOQ1RJT05fREVGCisjZGVmaW5lIElOTElORV9FTkFCTEVEICAgICAgVFJVRQorI2RlZmluZSBFUExfQU1JX0lOTElORUQKKyNpbmNsdWRlICIuLi9FcGxTdGFjay9hbWl4ODYuYyIKKyNlbmRpZgorCisjZWxpZiAoVEFSR0VUX1NZU1RFTSA9PSBfTElOVVhfKQorI2lmIGRlZmluZWQoX19tNjhrX18pCQkvLyBpdCBpcyBhbiBiaWcgZW5kaWFuIG1hY2hpbmUKKyNpZiBkZWZpbmVkKElOTElORV9GVU5DVElPTl9ERUYpCisjdW5kZWYgIElOTElORV9GVU5DVElPTgorI2RlZmluZSBJTkxJTkVfRlVOQ1RJT04gICAgIElOTElORV9GVU5DVElPTl9ERUYKKyNkZWZpbmUgSU5MSU5FX0VOQUJMRUQgICAgICBUUlVFCisjZGVmaW5lIEVQTF9BTUlfSU5MSU5FRAorI2luY2x1ZGUgIi4uL0VwbFN0YWNrL2FtaWJlLmMiCisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gd3JpdGUgZnVuY3Rpb25zCisvLworLy8gVG8gc2F2ZSBjb2RlIHNwYWNlIHRoZSBmdW5jdGlvbiBBbWlTZXRCeXRlIGlzIHJlcGxhY2VkIGJ5CisvLyBhbiBtYWNyby4KKy8vIHZvaWQgICBQVUJMSUMgIEFtaVNldEJ5dGUgICh2b2lkIEZBUiogcEFkZHJfcCwgQllURSBiQnl0ZVZhbF9wKTsKKworI2RlZmluZSBBbWlTZXRCeXRlVG9CZShwQWRkcl9wLCBiQnl0ZVZhbF9wKSAgeyooQllURSBGQVIqKShwQWRkcl9wKSA9IChiQnl0ZVZhbF9wKTt9CisjZGVmaW5lIEFtaVNldEJ5dGVUb0xlKHBBZGRyX3AsIGJCeXRlVmFsX3ApICB7KihCWVRFIEZBUiopKHBBZGRyX3ApID0gKGJCeXRlVmFsX3ApO30KKworI2lmICFkZWZpbmVkKElOTElORV9FTkFCTEVEKQorCXZvaWQgUFVCTElDIEFtaVNldFdvcmRUb0JlKHZvaWQgRkFSICogcEFkZHJfcCwgV09SRCB3V29yZFZhbF9wKTsKKwl2b2lkIFBVQkxJQyBBbWlTZXREd29yZFRvQmUodm9pZCBGQVIgKiBwQWRkcl9wLCBEV09SRCBkd0R3b3JkVmFsX3ApOworCXZvaWQgUFVCTElDIEFtaVNldFdvcmRUb0xlKHZvaWQgRkFSICogcEFkZHJfcCwgV09SRCB3V29yZFZhbF9wKTsKKwl2b2lkIFBVQkxJQyBBbWlTZXREd29yZFRvTGUodm9pZCBGQVIgKiBwQWRkcl9wLCBEV09SRCBkd0R3b3JkVmFsX3ApOworI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gcmVhZCBmdW5jdGlvbnMKKy8vCisvLyBUbyBzYXZlIGNvZGUgc3BhY2UgdGhlIGZ1bmN0aW9uIEFtaUdldEJ5dGUgaXMgcmVwbGFjZWQgYnkKKy8vIGFuIG1hY3JvLgorLy8gQllURSAgIFBVQkxJQyAgQW1pR2V0Qnl0ZSAgKHZvaWQgRkFSKiBwQWRkcl9wKTsKKworI2RlZmluZSBBbWlHZXRCeXRlRnJvbUJlKHBBZGRyX3ApICAoKihCWVRFIEZBUiopKHBBZGRyX3ApKQorI2RlZmluZSBBbWlHZXRCeXRlRnJvbUxlKHBBZGRyX3ApICAoKihCWVRFIEZBUiopKHBBZGRyX3ApKQorCisjaWYgIWRlZmluZWQoSU5MSU5FX0VOQUJMRUQpCisKKwlXT1JEIFBVQkxJQyBBbWlHZXRXb3JkRnJvbUJlKHZvaWQgRkFSICogcEFkZHJfcCk7CisJRFdPUkQgUFVCTElDIEFtaUdldER3b3JkRnJvbUJlKHZvaWQgRkFSICogcEFkZHJfcCk7CisJV09SRCBQVUJMSUMgQW1pR2V0V29yZEZyb21MZSh2b2lkIEZBUiAqIHBBZGRyX3ApOworCURXT1JEIFBVQkxJQyBBbWlHZXREd29yZEZyb21MZSh2b2lkIEZBUiAqIHBBZGRyX3ApOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBBbWlTZXREd29yZDI0KCkKKy8vCisvLyBEZXNjcmlwdGlvbjogc2V0cyBhIDI0IGJpdCB2YWx1ZSB0byBhIGJ1ZmZlcgorLy8KKy8vIFBhcmFtZXRlcnM6ICBwQWRkcl9wICAgICAgICAgPSBwb2ludGVyIHRvIGRlc3RpbmF0aW9uIGJ1ZmZlcgorLy8gICAgICAgICAgICAgIGR3RHdvcmRWYWxfcCAgICA9IHZhbHVlIHRvIHNldAorLy8KKy8vIFJldHVybjogICAgICB2b2lkCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCXZvaWQgUFVCTElDIEFtaVNldER3b3JkMjRUb0JlKHZvaWQgRkFSICogcEFkZHJfcCwgRFdPUkQgZHdEd29yZFZhbF9wKTsKKwl2b2lkIFBVQkxJQyBBbWlTZXREd29yZDI0VG9MZSh2b2lkIEZBUiAqIHBBZGRyX3AsIERXT1JEIGR3RHdvcmRWYWxfcCk7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEFtaUdldER3b3JkMjQoKQorLy8KKy8vIERlc2NyaXB0aW9uOiByZWFkcyBhIDI0IGJpdCB2YWx1ZSBmcm9tIGEgYnVmZmVyCisvLworLy8gUGFyYW1ldGVyczogIHBBZGRyX3AgICAgICAgICA9IHBvaW50ZXIgdG8gc291cmNlIGJ1ZmZlcgorLy8KKy8vIFJldHVybjogICAgICBEV09SRCAgICAgICAgICAgPSByZWFkIHZhbHVlCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCURXT1JEIFBVQkxJQyBBbWlHZXREd29yZDI0RnJvbUJlKHZvaWQgRkFSICogcEFkZHJfcCk7CisJRFdPUkQgUFVCTElDIEFtaUdldER3b3JkMjRGcm9tTGUodm9pZCBGQVIgKiBwQWRkcl9wKTsKKworLy8jaWZkZWYgVVNFX1ZBUjY0CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEFtaVNldFF3b3JkNDAoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBzZXRzIGEgNDAgYml0IHZhbHVlIHRvIGEgYnVmZmVyCisvLworLy8gUGFyYW1ldGVyczogIHBBZGRyX3AgICAgICAgICA9IHBvaW50ZXIgdG8gZGVzdGluYXRpb24gYnVmZmVyCisvLyAgICAgICAgICAgICAgcXdRd29yZFZhbF9wICAgID0gcXVhZHJ1cGxlIHdvcmQgdmFsdWUKKy8vCisvLyBSZXR1cm46ICAgICAgdm9pZAorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKwl2b2lkIFBVQkxJQyBBbWlTZXRRd29yZDQwVG9CZSh2b2lkIEZBUiAqIHBBZGRyX3AsIFFXT1JEIHF3UXdvcmRWYWxfcCk7CisJdm9pZCBQVUJMSUMgQW1pU2V0UXdvcmQ0MFRvTGUodm9pZCBGQVIgKiBwQWRkcl9wLCBRV09SRCBxd1F3b3JkVmFsX3ApOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBBbWlHZXRRd29yZDQwKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogcmVhZHMgYSA0MCBiaXQgdmFsdWUgZnJvbSBhIGJ1ZmZlcgorLy8KKy8vIFBhcmFtZXRlcnM6ICBwQWRkcl9wICAgICAgICAgPSBwb2ludGVyIHRvIHNvdXJjZSBidWZmZXIKKy8vCisvLyBSZXR1cm46ICAgICAgUVdPUkQKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisJUVdPUkQgUFVCTElDIEFtaUdldFF3b3JkNDBGcm9tQmUodm9pZCBGQVIgKiBwQWRkcl9wKTsKKwlRV09SRCBQVUJMSUMgQW1pR2V0UXdvcmQ0MEZyb21MZSh2b2lkIEZBUiAqIHBBZGRyX3ApOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBBbWlTZXRRd29yZDQ4KCkKKy8vCisvLyBEZXNjcmlwdGlvbjogc2V0cyBhIDQ4IGJpdCB2YWx1ZSB0byBhIGJ1ZmZlcgorLy8KKy8vIFBhcmFtZXRlcnM6ICBwQWRkcl9wICAgICAgICAgPSBwb2ludGVyIHRvIGRlc3RpbmF0aW9uIGJ1ZmZlcgorLy8gICAgICAgICAgICAgIHF3UXdvcmRWYWxfcCAgICA9IHF1YWRydXBsZSB3b3JkIHZhbHVlCisvLworLy8gUmV0dXJuOiAgICAgIHZvaWQKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisJdm9pZCBQVUJMSUMgQW1pU2V0UXdvcmQ0OFRvQmUodm9pZCBGQVIgKiBwQWRkcl9wLCBRV09SRCBxd1F3b3JkVmFsX3ApOworCXZvaWQgUFVCTElDIEFtaVNldFF3b3JkNDhUb0xlKHZvaWQgRkFSICogcEFkZHJfcCwgUVdPUkQgcXdRd29yZFZhbF9wKTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgQW1pR2V0UXdvcmQ0OCgpCisvLworLy8gRGVzY3JpcHRpb246IHJlYWRzIGEgNDggYml0IHZhbHVlIGZyb20gYSBidWZmZXIKKy8vCisvLyBQYXJhbWV0ZXJzOiAgcEFkZHJfcCAgICAgICAgID0gcG9pbnRlciB0byBzb3VyY2UgYnVmZmVyCisvLworLy8gUmV0dXJuOiAgICAgIFFXT1JECisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCVFXT1JEIFBVQkxJQyBBbWlHZXRRd29yZDQ4RnJvbUJlKHZvaWQgRkFSICogcEFkZHJfcCk7CisJUVdPUkQgUFVCTElDIEFtaUdldFF3b3JkNDhGcm9tTGUodm9pZCBGQVIgKiBwQWRkcl9wKTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgQW1pU2V0UXdvcmQ1NigpCisvLworLy8gRGVzY3JpcHRpb246IHNldHMgYSA1NiBiaXQgdmFsdWUgdG8gYSBidWZmZXIKKy8vCisvLyBQYXJhbWV0ZXJzOiAgcEFkZHJfcCAgICAgICAgID0gcG9pbnRlciB0byBkZXN0aW5hdGlvbiBidWZmZXIKKy8vICAgICAgICAgICAgICBxd1F3b3JkVmFsX3AgICAgPSBxdWFkcnVwbGUgd29yZCB2YWx1ZQorLy8KKy8vIFJldHVybjogICAgICB2b2lkCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCXZvaWQgUFVCTElDIEFtaVNldFF3b3JkNTZUb0JlKHZvaWQgRkFSICogcEFkZHJfcCwgUVdPUkQgcXdRd29yZFZhbF9wKTsKKwl2b2lkIFBVQkxJQyBBbWlTZXRRd29yZDU2VG9MZSh2b2lkIEZBUiAqIHBBZGRyX3AsIFFXT1JEIHF3UXdvcmRWYWxfcCk7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEFtaUdldFF3b3JkNTYoKQorLy8KKy8vIERlc2NyaXB0aW9uOiByZWFkcyBhIDU2IGJpdCB2YWx1ZSBmcm9tIGEgYnVmZmVyCisvLworLy8gUGFyYW1ldGVyczogIHBBZGRyX3AgICAgICAgICA9IHBvaW50ZXIgdG8gc291cmNlIGJ1ZmZlcgorLy8KKy8vIFJldHVybjogICAgICBRV09SRAorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKwlRV09SRCBQVUJMSUMgQW1pR2V0UXdvcmQ1NkZyb21CZSh2b2lkIEZBUiAqIHBBZGRyX3ApOworCVFXT1JEIFBVQkxJQyBBbWlHZXRRd29yZDU2RnJvbUxlKHZvaWQgRkFSICogcEFkZHJfcCk7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEFtaVNldFF3b3JkNjQoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBzZXRzIGEgNjQgYml0IHZhbHVlIHRvIGEgYnVmZmVyCisvLworLy8gUGFyYW1ldGVyczogIHBBZGRyX3AgICAgICAgICA9IHBvaW50ZXIgdG8gZGVzdGluYXRpb24gYnVmZmVyCisvLyAgICAgICAgICAgICAgcXdRd29yZFZhbF9wICAgID0gcXVhZHJ1cGxlIHdvcmQgdmFsdWUKKy8vCisvLyBSZXR1cm46ICAgICAgdm9pZAorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKwl2b2lkIFBVQkxJQyBBbWlTZXRRd29yZDY0VG9CZSh2b2lkIEZBUiAqIHBBZGRyX3AsIFFXT1JEIHF3UXdvcmRWYWxfcCk7CisJdm9pZCBQVUJMSUMgQW1pU2V0UXdvcmQ2NFRvTGUodm9pZCBGQVIgKiBwQWRkcl9wLCBRV09SRCBxd1F3b3JkVmFsX3ApOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBBbWlHZXRRd29yZDY0KCkKKy8vCisvLyBEZXNjcmlwdGlvbjogcmVhZHMgYSA2NCBiaXQgdmFsdWUgZnJvbSBhIGJ1ZmZlcgorLy8KKy8vIFBhcmFtZXRlcnM6ICBwQWRkcl9wICAgICAgICAgPSBwb2ludGVyIHRvIHNvdXJjZSBidWZmZXIKKy8vCisvLyBSZXR1cm46ICAgICAgdm9pZAorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKwlRV09SRCBQVUJMSUMgQW1pR2V0UXdvcmQ2NEZyb21CZSh2b2lkIEZBUiAqIHBBZGRyX3ApOworCVFXT1JEIFBVQkxJQyBBbWlHZXRRd29yZDY0RnJvbUxlKHZvaWQgRkFSICogcEFkZHJfcCk7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEFtaVNldFRpbWVPZkRheSgpCisvLworLy8gRGVzY3JpcHRpb246IHNldHMgYSBUSU1FX09GX0RBWSAoQ0FOb3BlbikgdmFsdWUgdG8gYSBidWZmZXIKKy8vCisvLyBQYXJhbWV0ZXJzOiAgcEFkZHJfcCAgICAgICAgID0gcG9pbnRlciB0byBkZXN0aW5hdGlvbiBidWZmZXIKKy8vICAgICAgICAgICAgICBwVGltZU9mRGF5X3AgICAgPSBwb2ludGVyIHRvIHN0cnVjdCBUSU1FX09GX0RBWQorLy8KKy8vIFJldHVybjogICAgICB2b2lkCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCXZvaWQgUFVCTElDIEFtaVNldFRpbWVPZkRheSh2b2lkIEZBUiAqIHBBZGRyX3AsCisJCQkJICAgIHRUaW1lT2ZEYXkgRkFSICogcFRpbWVPZkRheV9wKTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgQW1pR2V0VGltZU9mRGF5KCkKKy8vCisvLyBEZXNjcmlwdGlvbjogcmVhZHMgYSBUSU1FX09GX0RBWSAoQ0FOb3BlbikgdmFsdWUgZnJvbSBhIGJ1ZmZlcgorLy8KKy8vIFBhcmFtZXRlcnM6ICBwQWRkcl9wICAgICAgICAgPSBwb2ludGVyIHRvIHNvdXJjZSBidWZmZXIKKy8vICAgICAgICAgICAgICBwVGltZU9mRGF5X3AgICAgPSBwb2ludGVyIHRvIHN0cnVjdCBUSU1FX09GX0RBWQorLy8KKy8vIFJldHVybjogICAgICB2b2lkCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCXZvaWQgUFVCTElDIEFtaUdldFRpbWVPZkRheSh2b2lkIEZBUiAqIHBBZGRyX3AsCisJCQkJICAgIHRUaW1lT2ZEYXkgRkFSICogcFRpbWVPZkRheV9wKTsKKworI2VuZGlmCisKKyN1bmRlZiAgSU5MSU5FX0VOQUJMRUQJCS8vIGRpc2FibGUgYWN0dWFsIGlubGluaW5nIG9mIGZ1bmN0aW9ucworI2RlZmluZSBFUExfQU1JX0lOQ0xVREVECisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisjZW5kaWYJCQkJLy8gaWZuZGVmIF9FUExBTUlfSF8KKy8vIERpZSBsZXR6dGUgWmVpbGUgbXXfIHVuYmVkaW5ndCBlaW5lIGxlZXJlIFplaWxlIHNlaW4sIHdlaWwgbWFuY2hlIENvbXBpbGVyLy8gZGFtaXQgZWluIFByb2JsZW0gaGFiZW4sIHdlbm4gZGFzIG5pY2h0IHNvIGlzdCAoei5CLiBHTlUgb2RlciBCb3JsYW5kIEMrKyBCdWlsZGVyKS4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsQXBpR2VuZXJpYy5jIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxBcGlHZW5lcmljLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWUxOWUzNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsQXBpR2VuZXJpYy5jCkBAIC0wLDAgKzEsMjA2MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIHNvdXJjZSBmaWxlIGZvciBnZW5lcmljIEVQTCBBUEkgbW9kdWxlCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRXBsQXBpR2VuZXJpYy5jLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS4yMSAkICAkRGF0ZTogMjAwOC8xMS8yMSAwOTowMDozOCAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICAgICAgR0NDIFYzLjQKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUmV2aXNpb24gSGlzdG9yeToKKworICAyMDA2LzA5LzA1IGQuay46ICAgc3RhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uLCB2ZXJzaW9uIDEuMDAKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkVwbC5oIgorI2luY2x1ZGUgImtlcm5lbC9FcGxEbGxrLmgiCisjaW5jbHVkZSAia2VybmVsL0VwbEVycm9ySGFuZGxlcmsuaCIKKyNpbmNsdWRlICJrZXJuZWwvRXBsRXZlbnRrLmgiCisjaW5jbHVkZSAia2VybmVsL0VwbE5tdGsuaCIKKyNpbmNsdWRlICJrZXJuZWwvRXBsT2Jkay5oIgorI2luY2x1ZGUgImtlcm5lbC9FcGxUaW1lcmsuaCIKKyNpbmNsdWRlICJrZXJuZWwvRXBsRGxsa0NhbC5oIgorI2luY2x1ZGUgImtlcm5lbC9FcGxQZG9rQ2FsLmgiCisjaW5jbHVkZSAidXNlci9FcGxEbGx1Q2FsLmgiCisjaW5jbHVkZSAidXNlci9FcGxMZWR1LmgiCisjaW5jbHVkZSAidXNlci9FcGxObXRDbnUuaCIKKyNpbmNsdWRlICJ1c2VyL0VwbE5tdE1udS5oIgorI2luY2x1ZGUgInVzZXIvRXBsU2RvQ29tdS5oIgorI2luY2x1ZGUgInVzZXIvRXBsSWRlbnR1LmgiCisjaW5jbHVkZSAidXNlci9FcGxTdGF0dXN1LmgiCisKKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1BET0spKSAhPSAwKQorI2luY2x1ZGUgImtlcm5lbC9FcGxQZG9rLmgiCisjZW5kaWYKKworI2luY2x1ZGUgIlNoYXJlZEJ1ZmYuaCIKKworI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9PQkRLKSkgPT0gMCkKKyNlcnJvciAiRVBMIEFQSSBsYXllciBuZWVkcyBFUEwgbW9kdWxlIE9CREshIgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIEcgTCBPIEIgQSBMICAgRCBFIEYgSSBOIEkgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBtb2R1bCBnbG9iYWxlIHZhcnMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICBDIEwgQSBTIFMgIEVwbEFwaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLy8KKy8vIERlc2NyaXB0aW9uOgorLy8KKy8vCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgIFAgUiBJIFYgQSBUIEUgICBEIEUgRiBJIE4gSSBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvbnN0IGRlZmluZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCB0eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordHlwZWRlZiBzdHJ1Y3QgeworCXRFcGxBcGlJbml0UGFyYW0gbV9Jbml0UGFyYW07CisKK30gdEVwbEFwaUluc3RhbmNlOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgdmFycworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHRFcGxBcGlJbnN0YW5jZSBFcGxBcGlJbnN0YW5jZV9nOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gTk1UIHN0YXRlIGNoYW5nZSBldmVudCBjYWxsYmFjayBmdW5jdGlvbgorc3RhdGljIHRFcGxLZXJuZWwgUFVCTElDIEVwbEFwaUNiTm10U3RhdGVDaGFuZ2UodEVwbEV2ZW50Tm10U3RhdGVDaGFuZ2UKKwkJCQkJCU5tdFN0YXRlQ2hhbmdlX3ApOworCisvLyB1cGRhdGUgRExMIGNvbmZpZ3VyYXRpb24gZnJvbSBPRAorc3RhdGljIHRFcGxLZXJuZWwgUFVCTElDIEVwbEFwaVVwZGF0ZURsbENvbmZpZyhCT09MIGZVcGRhdGVJZGVudGl0eV9wKTsKKworLy8gdXBkYXRlIE9EIGZyb20gaW5pdCBwYXJhbQorc3RhdGljIHRFcGxLZXJuZWwgUFVCTElDIEVwbEFwaVVwZGF0ZU9iZCh2b2lkKTsKKworLy8gcHJvY2VzcyBldmVudHMgZnJvbSB1c2VyIGV2ZW50IHF1ZXVlCitzdGF0aWMgdEVwbEtlcm5lbCBQVUJMSUMgRXBsQXBpUHJvY2Vzc0V2ZW50KHRFcGxFdmVudCAqIHBFcGxFdmVudF9wKTsKKworI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfU0RPQykpICE9IDApCisvLyBjYWxsYmFjayBmdW5jdGlvbiBvZiBTRE8gbW9kdWxlCitzdGF0aWMgdEVwbEtlcm5lbCBQVUJMSUMgRXBsQXBpQ2JTZG9Db24odEVwbFNkb0NvbUZpbmlzaGVkICogcFNkb0NvbUZpbmlzaGVkX3ApOworI2VuZGlmCisKKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVF9NTikpICE9IDApCisvLyBjYWxsYmFjayBmdW5jdGlvbnMgb2YgTm10TW51IG1vZHVsZQorc3RhdGljIHRFcGxLZXJuZWwgUFVCTElDIEVwbEFwaUNiTm9kZUV2ZW50KHVuc2lnbmVkIGludCB1aU5vZGVJZF9wLAorCQkJCQkgICB0RXBsTm10Tm9kZUV2ZW50IE5vZGVFdmVudF9wLAorCQkJCQkgICB0RXBsTm10U3RhdGUgTm10U3RhdGVfcCwKKwkJCQkJICAgV09SRCB3RXJyb3JDb2RlX3AsCisJCQkJCSAgIEJPT0wgZk1hbmRhdG9yeV9wKTsKKworc3RhdGljIHRFcGxLZXJuZWwgUFVCTElDIEVwbEFwaUNiQm9vdEV2ZW50KHRFcGxObXRCb290RXZlbnQgQm9vdEV2ZW50X3AsCisJCQkJCSAgIHRFcGxObXRTdGF0ZSBObXRTdGF0ZV9wLAorCQkJCQkgICBXT1JEIHdFcnJvckNvZGVfcCk7CisjZW5kaWYKKworI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTEVEVSkpICE9IDApCisvLyBjYWxsYmFjayBmdW5jdGlvbiBvZiBMZWR1IG1vZHVsZQorc3RhdGljIHRFcGxLZXJuZWwgUFVCTElDIEVwbEFwaUNiTGVkU3RhdGVDaGFuZ2UodEVwbExlZFR5cGUgTGVkVHlwZV9wLAorCQkJCQkJQk9PTCBmT25fcCk7CisjZW5kaWYKKworLy8gT0QgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24gKGltcGxlbWVudGVkIGluIE9iamRpY3QuYykKK3RFcGxLZXJuZWwgUFVCTElDIEVwbE9iZEluaXRSYW0odEVwbE9iZEluaXRQYXJhbSBNRU0gKiBwSW5pdFBhcmFtX3ApOworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgIFAgVSBCIEwgSSBDICAgRiBVIE4gQyBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsQXBpSW5pdGlhbGl6ZSgpCisvLworLy8gRGVzY3JpcHRpb246IGFkZCBhbmQgaW5pdGlhbGl6ZSBuZXcgaW5zdGFuY2Ugb2YgRVBMIHN0YWNrLgorLy8gICAgICAgICAgICAgIEFmdGVyIHJldHVybiBmcm9tIHRoaXMgZnVuY3Rpb24gdGhlIGFwcGxpY2F0aW9uIG11c3Qgc3RhcnQKKy8vICAgICAgICAgICAgICB0aGUgTk1UIHN0YXRlIG1hY2hpbmUgdmlhCisvLyAgICAgICAgICAgICAgRXBsQXBpRXhlY05tdENvbW1hbmQoa0VwbE5tdEV2ZW50U3dSZXNldCkKKy8vICAgICAgICAgICAgICBhbmQgdGhlcmVieSB0aGUgd2hvbGUgRVBMIHN0YWNrIDotKQorLy8KKy8vIFBhcmFtZXRlcnM6ICBwSW5pdFBhcmFtX3AgICAgICAgICAgICA9IGluaXRpYWxpc2F0aW9uIHBhcmFtZXRlcnMKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbEFwaUluaXRpYWxpemUodEVwbEFwaUluaXRQYXJhbSAqIHBJbml0UGFyYW1fcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCXRFcGxPYmRJbml0UGFyYW0gT2JkSW5pdFBhcmFtOworCXRFcGxEbGxrSW5pdFBhcmFtIERsbGtJbml0UGFyYW07CisjaWZuZGVmIEVQTF9OT19GSUZPCisJdFNoYkVycm9yIFNoYkVycm9yOworI2VuZGlmCisKKwkvLyByZXNldCBpbnN0YW5jZSBzdHJ1Y3R1cmUKKwlFUExfTUVNU0VUKCZFcGxBcGlJbnN0YW5jZV9nLCAwLCBzaXplb2YoRXBsQXBpSW5zdGFuY2VfZykpOworCisJRVBMX01FTUNQWSgmRXBsQXBpSW5zdGFuY2VfZy5tX0luaXRQYXJhbSwgcEluaXRQYXJhbV9wLAorCQkgICBtaW4oc2l6ZW9mKHRFcGxBcGlJbml0UGFyYW0pLAorCQkgICAgICAgcEluaXRQYXJhbV9wLT5tX3VpU2l6ZU9mU3RydWN0KSk7CisKKwkvLyBjaGVjayBldmVudCBjYWxsYmFjayBmdW5jdGlvbiBwb2ludGVyCisJaWYgKEVwbEFwaUluc3RhbmNlX2cubV9Jbml0UGFyYW0ubV9wZm5DYkV2ZW50ID09IE5VTEwpIHsJLy8gYXBwbGljYXRpb24gbXVzdCBhbHdheXMgaGF2ZSBhbiBldmVudCBjYWxsYmFjayBmdW5jdGlvbgorCQlSZXQgPSBrRXBsQXBpSW52YWxpZFBhcmFtOworCQlnb3RvIEV4aXQ7CisJfQorI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9PQkRLKSkgIT0gMCkKKwkvLyBpbml0IE9ECisvLyBGSVhNRQorLy8gICAgUmV0ID0gRXBsT2JkSW5pdFJhbSgmT2JkSW5pdFBhcmFtKTsKKy8vICAgIGlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpCisvLyAgICB7CisvLyAgICAgICAgZ290byBFeGl0OworLy8gICAgfQorCisJLy8gaW5pdGlhbGl6ZSBFcGxPYmQgbW9kdWxlCisJUmV0ID0gRXBsT2JkSW5pdCgmT2JkSW5pdFBhcmFtKTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCWdvdG8gRXhpdDsKKwl9CisjZW5kaWYKKworI2lmbmRlZiBFUExfTk9fRklGTworCVNoYkVycm9yID0gU2hiSW5pdCgpOworCWlmIChTaGJFcnJvciAhPSBrU2hiT2spIHsKKwkJUmV0ID0ga0VwbE5vUmVzb3VyY2U7CisJCWdvdG8gRXhpdDsKKwl9CisjZW5kaWYKKworCS8vIGluaXRpYWxpemUgRXBsRXZlbnRrIG1vZHVsZQorCVJldCA9IEVwbEV2ZW50a0luaXQoRXBsQXBpSW5zdGFuY2VfZy5tX0luaXRQYXJhbS5tX3BmbkNiU3luYyk7CisJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQlnb3RvIEV4aXQ7CisJfQorCS8vIGluaXRpYWxpemUgRXBsRXZlbnR1IG1vZHVsZQorCVJldCA9IEVwbEV2ZW50dUluaXQoRXBsQXBpUHJvY2Vzc0V2ZW50KTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gaW5pdCBFcGxUaW1lcmsgbW9kdWxlCisJUmV0ID0gRXBsVGltZXJrSW5pdCgpOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKwkvLyBpbml0aWFsaXplIEVwbE5tdGsgbW9kdWxlIGJlZm9yZSBETEwKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1USykpICE9IDApCisJUmV0ID0gRXBsTm10a0luaXQoKTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCWdvdG8gRXhpdDsKKwl9CisjZW5kaWYKKworCS8vIGluaXRpYWxpemUgRXBsRGxsayBtb2R1bGUKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfRExMSykpICE9IDApCisJRVBMX01FTUNQWShEbGxrSW5pdFBhcmFtLm1fYmVfYWJTcmNNYWMsCisJCSAgIEVwbEFwaUluc3RhbmNlX2cubV9Jbml0UGFyYW0ubV9hYk1hY0FkZHJlc3MsIDYpOworCVJldCA9IEVwbERsbGtBZGRJbnN0YW5jZSgmRGxsa0luaXRQYXJhbSk7CisJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQlnb3RvIEV4aXQ7CisJfQorCS8vIGluaXRpYWxpemUgRXBsRXJyb3JIYW5kbGVyayBtb2R1bGUKKwlSZXQgPSBFcGxFcnJvckhhbmRsZXJrSW5pdCgpOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKwkvLyBpbml0aWFsaXplIEVwbERsbGtDYWwgbW9kdWxlCisJUmV0ID0gRXBsRGxsa0NhbEFkZEluc3RhbmNlKCk7CisJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQlnb3RvIEV4aXQ7CisJfQorI2VuZGlmCisKKwkvLyBpbml0aWFsaXplIEVwbERsbHVDYWwgbW9kdWxlCisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX0RMTFUpKSAhPSAwKQorCVJldCA9IEVwbERsbHVDYWxBZGRJbnN0YW5jZSgpOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKyNlbmRpZgorCisJLy8gaW5pdGlhbGl6ZSBFcGxQZG9rIG1vZHVsZQorI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfUERPSykpICE9IDApCisJUmV0ID0gRXBsUGRva0FkZEluc3RhbmNlKCk7CisJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQlnb3RvIEV4aXQ7CisJfQorCisJUmV0ID0gRXBsUGRva0NhbEFkZEluc3RhbmNlKCk7CisJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQlnb3RvIEV4aXQ7CisJfQorI2VuZGlmCisKKwkvLyBpbml0aWFsaXplIEVwbE5tdENudSBtb2R1bGUKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UX0NOKSkgIT0gMCkKKwlSZXQgPSBFcGxObXRDbnVBZGRJbnN0YW5jZShFcGxBcGlJbnN0YW5jZV9nLm1fSW5pdFBhcmFtLm1fdWlOb2RlSWQpOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKyNlbmRpZgorCisJLy8gaW5pdGlhbGl6ZSBFcGxObXR1IG1vZHVsZQorI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRVKSkgIT0gMCkKKwlSZXQgPSBFcGxObXR1SW5pdCgpOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKwkvLyByZWdpc3RlciBOTVQgZXZlbnQgY2FsbGJhY2sgZnVuY3Rpb24KKwlSZXQgPSBFcGxObXR1UmVnaXN0ZXJTdGF0ZUNoYW5nZUNiKEVwbEFwaUNiTm10U3RhdGVDaGFuZ2UpOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKyNlbmRpZgorCisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVF9NTikpICE9IDApCisJLy8gaW5pdGlhbGl6ZSBFcGxObXRNbnUgbW9kdWxlCisJUmV0ID0gRXBsTm10TW51SW5pdChFcGxBcGlDYk5vZGVFdmVudCwgRXBsQXBpQ2JCb290RXZlbnQpOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKwkvLyBpbml0aWFsaXplIEVwbElkZW50dSBtb2R1bGUKKwlSZXQgPSBFcGxJZGVudHVJbml0KCk7CisJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQlnb3RvIEV4aXQ7CisJfQorCS8vIGluaXRpYWxpemUgRXBsU3RhdHVzdSBtb2R1bGUKKwlSZXQgPSBFcGxTdGF0dXN1SW5pdCgpOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKyNlbmRpZgorCisJLy8gaW5pdGlhbGl6ZSBFcGxMZWR1IG1vZHVsZQorI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9MRURVKSkgIT0gMCkKKwlSZXQgPSBFcGxMZWR1SW5pdChFcGxBcGlDYkxlZFN0YXRlQ2hhbmdlKTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCWdvdG8gRXhpdDsKKwl9CisjZW5kaWYKKworCS8vIGluaXQgU0RPIG1vZHVsZQorI2lmICgoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1NET1MpKSAhPSAwKSB8fCBcCisgICAgICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfU0RPQykpICE9IDApKQorCS8vIGluaXQgc2RvIGNvbW1hbmQgbGF5ZXIKKwlSZXQgPSBFcGxTZG9Db21Jbml0KCk7CisJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQlnb3RvIEV4aXQ7CisJfQorI2VuZGlmCisKKwkvLyB0aGUgYXBwbGljYXRpb24gbXVzdCBzdGFydCBOTVQgc3RhdGUgbWFjaGluZQorCS8vIHZpYSBFcGxBcGlFeGVjTm10Q29tbWFuZChrRXBsTm10RXZlbnRTd1Jlc2V0KQorCS8vIGFuZCB0aGVyZWJ5IHRoZSB3aG9sZSBFUEwgc3RhY2sKKworICAgICAgRXhpdDoKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxBcGlTaHV0ZG93bigpCisvLworLy8gRGVzY3JpcHRpb246IGRlbGV0ZXMgYW4gaW5zdGFuY2Ugb2YgRVBMIHN0YWNrCisvLworLy8gUGFyYW1ldGVyczogIChub25lKQorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsQXBpU2h1dGRvd24odm9pZCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJLy8gJCQkIGQuay46IGNoZWNrIGlmIE5NVCBzdGF0ZSBpcyBOTVRfR1NfT0ZGCisKKwkvLyAkJCQgZC5rLjogbWF5YmUgZGVsZXRlIGV2ZW50IHF1ZXVlcyBhdCBmaXJzdCwgYnV0IHRoaXMgaW1wbGllcyB0aGF0CisJLy8gICAgICAgICAgIG5vIG90aGVyIG1vZHVsZSBtdXN0IG5vdCB1c2UgdGhlIGV2ZW50IHF1ZXVlcyBmb3IgY29tbXVuaWNhdGlvbgorCS8vICAgICAgICAgICBkdXJpbmcgc2h1dGRvd24uCisKKwkvLyBkZWxldGUgaW5zdGFuY2UgZm9yIGFsbCBtb2R1bGVzCisKKwkvLyBkZWluaXRpYWxpemUgRXBsU2RvQ29tIG1vZHVsZQorI2lmICgoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1NET1MpKSAhPSAwKSB8fCBcCisgICAgICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfU0RPQykpICE9IDApKQorCVJldCA9IEVwbFNkb0NvbURlbEluc3RhbmNlKCk7CisvLyAgICBQUklOVEYxKCJFcGxTZG9Db21EZWxJbnN0YW5jZSgpOiAgMHglWFxuIiwgUmV0KTsKKyNlbmRpZgorCisJLy8gZGVpbml0aWFsaXplIEVwbExlZHUgbW9kdWxlCisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX0xFRFUpKSAhPSAwKQorCVJldCA9IEVwbExlZHVEZWxJbnN0YW5jZSgpOworLy8gICAgUFJJTlRGMSgiRXBsTGVkdURlbEluc3RhbmNlKCk6ICAgIDB4JVhcbiIsIFJldCk7CisjZW5kaWYKKworI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRfTU4pKSAhPSAwKQorCS8vIGRlaW5pdGlhbGl6ZSBFcGxObXRNbnUgbW9kdWxlCisJUmV0ID0gRXBsTm10TW51RGVsSW5zdGFuY2UoKTsKKy8vICAgIFBSSU5URjEoIkVwbE5tdE1udURlbEluc3RhbmNlKCk6ICAweCVYXG4iLCBSZXQpOworCisJLy8gZGVpbml0aWFsaXplIEVwbElkZW50dSBtb2R1bGUKKwlSZXQgPSBFcGxJZGVudHVEZWxJbnN0YW5jZSgpOworLy8gICAgUFJJTlRGMSgiRXBsSWRlbnR1RGVsSW5zdGFuY2UoKTogIDB4JVhcbiIsIFJldCk7CisKKwkvLyBkZWluaXRpYWxpemUgRXBsU3RhdHVzdSBtb2R1bGUKKwlSZXQgPSBFcGxTdGF0dXN1RGVsSW5zdGFuY2UoKTsKKy8vICAgIFBSSU5URjEoIkVwbFN0YXR1c3VEZWxJbnN0YW5jZSgpOiAgMHglWFxuIiwgUmV0KTsKKyNlbmRpZgorCisJLy8gZGVpbml0aWFsaXplIEVwbE5tdENudSBtb2R1bGUKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UX0NOKSkgIT0gMCkKKwlSZXQgPSBFcGxObXRDbnVEZWxJbnN0YW5jZSgpOworLy8gICAgUFJJTlRGMSgiRXBsTm10Q251RGVsSW5zdGFuY2UoKTogIDB4JVhcbiIsIFJldCk7CisjZW5kaWYKKworCS8vIGRlaW5pdGlhbGl6ZSBFcGxObXR1IG1vZHVsZQorI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRVKSkgIT0gMCkKKwlSZXQgPSBFcGxObXR1RGVsSW5zdGFuY2UoKTsKKy8vICAgIFBSSU5URjEoIkVwbE5tdHVEZWxJbnN0YW5jZSgpOiAgICAweCVYXG4iLCBSZXQpOworI2VuZGlmCisKKwkvLyBkZWluaXRpYWxpemUgRXBsRGxsdUNhbCBtb2R1bGUKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfRExMVSkpICE9IDApCisJUmV0ID0gRXBsRGxsdUNhbERlbEluc3RhbmNlKCk7CisvLyAgICBQUklOVEYxKCJFcGxEbGx1Q2FsRGVsSW5zdGFuY2UoKTogMHglWFxuIiwgUmV0KTsKKworI2VuZGlmCisKKwkvLyBkZWluaXRpYWxpemUgRXBsRXZlbnR1IG1vZHVsZQorCVJldCA9IEVwbEV2ZW50dURlbEluc3RhbmNlKCk7CisvLyAgICBQUklOVEYxKCJFcGxFdmVudHVEZWxJbnN0YW5jZSgpOiAgMHglWFxuIiwgUmV0KTsKKworCS8vIGRlaW5pdGlhbGl6ZSBFcGxObXRrIG1vZHVsZQorI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRLKSkgIT0gMCkKKwlSZXQgPSBFcGxObXRrRGVsSW5zdGFuY2UoKTsKKy8vICAgIFBSSU5URjEoIkVwbE5tdGtEZWxJbnN0YW5jZSgpOiAgICAweCVYXG4iLCBSZXQpOworI2VuZGlmCisKKwkvLyBkZWluaXRpYWxpemUgRXBsRGxsayBtb2R1bGUKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfRExMSykpICE9IDApCisJUmV0ID0gRXBsRGxsa0RlbEluc3RhbmNlKCk7CisvLyAgICBQUklOVEYxKCJFcGxEbGxrRGVsSW5zdGFuY2UoKTogICAgMHglWFxuIiwgUmV0KTsKKworCS8vIGRlaW5pdGlhbGl6ZSBFcGxEbGxrQ2FsIG1vZHVsZQorCVJldCA9IEVwbERsbGtDYWxEZWxJbnN0YW5jZSgpOworLy8gICAgUFJJTlRGMSgiRXBsRGxsa0NhbERlbEluc3RhbmNlKCk6IDB4JVhcbiIsIFJldCk7CisjZW5kaWYKKworCS8vIGRlaW5pdGlhbGl6ZSBFcGxFdmVudGsgbW9kdWxlCisJUmV0ID0gRXBsRXZlbnRrRGVsSW5zdGFuY2UoKTsKKy8vICAgIFBSSU5URjEoIkVwbEV2ZW50a0RlbEluc3RhbmNlKCk6ICAweCVYXG4iLCBSZXQpOworCisJLy8gZGVpbml0aWFsaXplIEVwbFRpbWVyayBtb2R1bGUKKwlSZXQgPSBFcGxUaW1lcmtEZWxJbnN0YW5jZSgpOworLy8gICAgUFJJTlRGMSgiRXBsVGltZXJrRGVsSW5zdGFuY2UoKTogIDB4JVhcbiIsIFJldCk7CisKKyNpZm5kZWYgRVBMX05PX0ZJRk8KKwlTaGJFeGl0KCk7CisjZW5kaWYKKworCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRnVuY3Rpb246ICAgIEVwbEFwaUV4ZWNObXRDb21tYW5kKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogZXhlY3V0ZXMgYSBOTVQgY29tbWFuZCwgaS5lLiBwb3N0IHRoZSBOTVQgY29tbWFuZC9ldmVudCB0byB0aGUKKy8vICAgICAgICAgICAgICBOTVRrIG1vZHVsZS4gTk1UIGNvbW1hbmRzIHdoaWNoIGFyZSBub3QgYXBwcm9wcmlhdGUgaW4gdGhlIGN1cnJlbnQKKy8vICAgICAgICAgICAgICBOTVQgc3RhdGUgYXJlIHNpbGVudGx5IGlnbm9yZWQuIFBsZWFzZSBrZWVwIGluIG1pbmQgdGhhdCB0aGUKKy8vICAgICAgICAgICAgICBOTVQgc3RhdGUgbWF5IGNoYW5nZSB1bnRpbCB0aGUgTk1UIGNvbW1hbmQgaXMgYWN0dWFsbHkgZXhlY3V0ZWQuCisvLworLy8gUGFyYW1ldGVyczogIE5tdEV2ZW50X3AgICAgICAgICAgICAgID0gTk1UIGNvbW1hbmQvZXZlbnQKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8gU3RhdGU6CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsQXBpRXhlY05tdENvbW1hbmQodEVwbE5tdEV2ZW50IE5tdEV2ZW50X3ApCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRVKSkgIT0gMCkKKwlSZXQgPSBFcGxObXR1Tm10RXZlbnQoTm10RXZlbnRfcCk7CisjZW5kaWYKKworCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRnVuY3Rpb246ICAgIEVwbEFwaUxpbmtPYmplY3QoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBGdW5jdGlvbiBtYXBzIGFycmF5IG9mIGFwcGxpY2F0aW9uIHZhcmlhYmxlcyBvbnRvIHNwZWNpZmllZCBvYmplY3QgaW4gT0QKKy8vCisvLyBQYXJhbWV0ZXJzOiAgdWlPYmpJbmRleF9wICAgICAgICAgICAgPSBGdW5jdGlvbiBtYXBzIHZhcmlhYmxlcyBmb3IgdGhpcyBvYmplY3QgaW5kZXgKKy8vICAgICAgICAgICAgICBwVmFyX3AgICAgICAgICAgICAgICAgICA9IFBvaW50ZXIgdG8gZGF0YSBtZW1vcnkgYXJlYSBmb3IgdGhlIHNwZWNpZmllZCBvYmplY3QKKy8vICAgICAgICAgICAgICBwdWlWYXJFbnRyaWVzX3AgICAgICAgICA9IElOOiBwb2ludGVyIHRvIG51bWJlciBvZiBlbnRyaWVzIHRvIG1hcAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1VUOiBwb2ludGVyIHRvIG51bWJlciBvZiBhY3R1YWxseSB1c2VkIGVudHJpZXMKKy8vICAgICAgICAgICAgICBwRW50cnlTaXplX3AgICAgICAgICAgICA9IElOOiBwb2ludGVyIHRvIHNpemUgb2Ygb25lIGVudHJ5OworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHNpemUgaXMgemVybywgdGhlIGFjdHVhbCBzaXplIHdpbGwgYmUgcmVhZCBmcm9tIE9ECisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPVVQ6IHBvaW50ZXIgdG8gZW50aXJlIHNpemUgb2YgYWxsIGVudHJpZXMgbWFwcGVkCisvLyAgICAgICAgICAgICAgdWlGaXJzdFN1YmluZGV4X3AgICAgICAgPSBUaGlzIGlzIHRoZSBmaXJzdCBzdWJpbmRleCB0byBiZSBtYXBwZWQuCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vIFN0YXRlOgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbEFwaUxpbmtPYmplY3QodW5zaWduZWQgaW50IHVpT2JqSW5kZXhfcCwKKwkJCQkgICB2b2lkICpwVmFyX3AsCisJCQkJICAgdW5zaWduZWQgaW50ICpwdWlWYXJFbnRyaWVzX3AsCisJCQkJICAgdEVwbE9iZFNpemUgKiBwRW50cnlTaXplX3AsCisJCQkJICAgdW5zaWduZWQgaW50IHVpRmlyc3RTdWJpbmRleF9wKQoreworCUJZVEUgYlZhckVudHJpZXM7CisJQllURSBiSW5kZXhFbnRyaWVzOworCUJZVEUgTUVNICpwYkRhdGE7CisJdW5zaWduZWQgaW50IHVpU3ViaW5kZXg7CisJdEVwbFZhclBhcmFtIFZhclBhcmFtOworCXRFcGxPYmRTaXplIEVudHJ5U2l6ZTsKKwl0RXBsT2JkU2l6ZSBVc2VkU2l6ZTsKKworCXRFcGxLZXJuZWwgUmV0Q29kZSA9IGtFcGxTdWNjZXNzZnVsOworCisJaWYgKChwVmFyX3AgPT0gTlVMTCkKKwkgICAgfHwgKHB1aVZhckVudHJpZXNfcCA9PSBOVUxMKQorCSAgICB8fCAoKnB1aVZhckVudHJpZXNfcCA9PSAwKQorCSAgICB8fCAocEVudHJ5U2l6ZV9wID09IE5VTEwpKSB7CisJCVJldENvZGUgPSBrRXBsQXBpSW52YWxpZFBhcmFtOworCQlnb3RvIEV4aXQ7CisJfQorCisJcGJEYXRhID0gKEJZVEUgTUVNICopIHBWYXJfcDsKKwliVmFyRW50cmllcyA9IChCWVRFKSAqIHB1aVZhckVudHJpZXNfcDsKKwlVc2VkU2l6ZSA9IDA7CisKKwkvLyBpbml0IFZhclBhcmFtIHN0cnVjdHVyZSB3aXRoIGRlZmF1bHQgdmFsdWVzCisJVmFyUGFyYW0ubV91aUluZGV4ID0gdWlPYmpJbmRleF9wOworCVZhclBhcmFtLm1fVmFsaWRGbGFnID0ga1ZhclZhbGlkQWxsOworCisJaWYgKHVpRmlyc3RTdWJpbmRleF9wICE9IDApIHsJLy8gY2hlY2sgaWYgb2JqZWN0IGV4aXN0cyBieSByZWFkaW5nIHN1YmluZGV4IDB4MDAsCisJCS8vIGJlY2F1c2UgdXNlciB3YW50cyB0byBsaW5rIGEgdmFyaWFibGUgdG8gYSBzdWJpbmRleCB1bmVxdWFsIDB4MDAKKwkJLy8gcmVhZCBudW1iZXIgb2YgZW50cmllcworCQlFbnRyeVNpemUgPSAodEVwbE9iZFNpemUpIHNpemVvZihiSW5kZXhFbnRyaWVzKTsKKwkJUmV0Q29kZSA9IEVwbE9iZFJlYWRFbnRyeSh1aU9iakluZGV4X3AsCisJCQkJCSAgMHgwMCwKKwkJCQkJICAodm9pZCBHRU5FUklDICopJmJJbmRleEVudHJpZXMsCisJCQkJCSAgJkVudHJ5U2l6ZSk7CisKKwkJaWYgKChSZXRDb2RlICE9IGtFcGxTdWNjZXNzZnVsKSB8fCAoYkluZGV4RW50cmllcyA9PSAweDAwKSkgeworCQkJLy8gT2JqZWN0IGRvZXNuJ3QgZXhpc3Qgb3IgaW52YWxpZCBlbnRyeSBudW1iZXIKKwkJCVJldENvZGUgPSBrRXBsT2JkSW5kZXhOb3RFeGlzdDsKKwkJCWdvdG8gRXhpdDsKKwkJfQorCX0gZWxzZSB7CQkvLyB1c2VyIHdhbnRzIHRvIGxpbmsgYSB2YXJpYWJsZSB0byBzdWJpbmRleCAweDAwCisJCS8vIHRoYXQncyBPSworCQliSW5kZXhFbnRyaWVzID0gMDsKKwl9CisKKwkvLyBDb3JyZWN0IG51bWJlciBvZiBlbnRyaWVzIGlmIG51bWJlciByZWFkIGZyb20gT0QgaXMgZ3JlYXRlcgorCS8vIHRoYW4gdGhlIHNwZWNpZmllZCBudW1iZXIuCisJLy8gVGhpcyBpcyBkb25lLCBzbyB0aGF0IHdlIGRvIG5vdCBzZXQgbW9yZSBlbnRyaWVzIHRoYW4gc3ViaW5kZXhlcyB0aGUKKwkvLyBvYmplY3QgYWN0dWFsbHkgaGFzLgorCWlmICgoYkluZGV4RW50cmllcyA+IChiVmFyRW50cmllcyArIHVpRmlyc3RTdWJpbmRleF9wIC0gMSkpICYmCisJICAgIChiVmFyRW50cmllcyAhPSAweDAwKSkgeworCQliSW5kZXhFbnRyaWVzID0gKEJZVEUpIChiVmFyRW50cmllcyArIHVpRmlyc3RTdWJpbmRleF9wIC0gMSk7CisJfQorCS8vIG1hcCBlbnRyaWVzCisJZm9yICh1aVN1YmluZGV4ID0gdWlGaXJzdFN1YmluZGV4X3A7IHVpU3ViaW5kZXggPD0gYkluZGV4RW50cmllczsKKwkgICAgIHVpU3ViaW5kZXgrKykgeworCQkvLyBpZiBwYXNzZWQgZW50cnkgc2l6ZSBpcyAwLCB0aGVuIGdldCBzaXplIGZyb20gT0QKKwkJaWYgKCpwRW50cnlTaXplX3AgPT0gMHgwMCkgeworCQkJLy8gcmVhZCBlbnRyeSBzaXplCisJCQlFbnRyeVNpemUgPSBFcGxPYmRHZXREYXRhU2l6ZSh1aU9iakluZGV4X3AsIHVpU3ViaW5kZXgpOworCisJCQlpZiAoRW50cnlTaXplID09IDB4MDApIHsKKwkJCQkvLyBpbnZhbGlkIGVudHJ5IHNpemUgKG1heWJlIG9iamVjdCBkb2Vzbid0IGV4aXN0IG9yIGVudHJ5IG9mIHR5cGUgRE9NQUlOIGlzIGVtcHR5KQorCQkJCVJldENvZGUgPSBrRXBsT2JkU3ViaW5kZXhOb3RFeGlzdDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfSBlbHNlIHsJLy8gdXNlIHBhc3NlZCBlbnRyeSBzaXplCisJCQlFbnRyeVNpemUgPSAqcEVudHJ5U2l6ZV9wOworCQl9CisKKwkJVmFyUGFyYW0ubV91aVN1YmluZGV4ID0gdWlTdWJpbmRleDsKKworCQkvLyBzZXQgcG9pbnRlciB0byB1c2VyIHZhcgorCQlWYXJQYXJhbS5tX1NpemUgPSBFbnRyeVNpemU7CisJCVZhclBhcmFtLm1fcERhdGEgPSBwYkRhdGE7CisKKwkJVXNlZFNpemUgKz0gRW50cnlTaXplOworCQlwYkRhdGEgKz0gRW50cnlTaXplOworCisJCVJldENvZGUgPSBFcGxPYmREZWZpbmVWYXIoJlZhclBhcmFtKTsKKwkJaWYgKFJldENvZGUgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCWJyZWFrOworCQl9CisJfQorCisJLy8gc2V0IG51bWJlciBvZiBtYXBwZWQgZW50cmllcyBhbmQgZW50cnkgc2l6ZQorCSpwdWlWYXJFbnRyaWVzX3AgPSAoKGJJbmRleEVudHJpZXMgLSB1aUZpcnN0U3ViaW5kZXhfcCkgKyAxKTsKKwkqcEVudHJ5U2l6ZV9wID0gVXNlZFNpemU7CisKKyAgICAgIEV4aXQ6CisKKwlyZXR1cm4gKFJldENvZGUpOworCit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsQXBpUmVhZE9iamVjdCgpCisvLworLy8gRGVzY3JpcHRpb246IHJlYWRzIHRoZSBzcGVjaWZpZWQgZW50cnkgZnJvbSB0aGUgT0Qgb2YgdGhlIHNwZWNpZmllZCBub2RlLgorLy8gICAgICAgICAgICAgIElmIHRoaXMgbm9kZSBpcyBhIHJlbW90ZSBub2RlLCBpdCBwZXJmb3JtcyBhIFNETyB0cmFuc2Zlciwgd2hpY2gKKy8vICAgICAgICAgICAgICBtZWFucyB0aGlzIGZ1bmN0aW9uIHJldHVybnMga0VwbEFwaVRhc2tEZWZlcnJlZCBhbmQgdGhlIGFwcGxpY2F0aW9uCisvLyAgICAgICAgICAgICAgaXMgaW5mb3JtZWQgdmlhIHRoZSBldmVudCBjYWxsYmFjayBmdW5jdGlvbiB3aGVuIHRoZSB0YXNrIGlzIGNvbXBsZXRlZC4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgcFNkb0NvbUNvbkhkbF9wICAgICAgICAgPSBJTk9VVDogcG9pbnRlciB0byBTRE8gY29ubmVjdGlvbiBoYW5kbGUgKG1heSBiZSBOVUxMIGluIGNhc2Ugb2YgbG9jYWwgT0QgYWNjZXNzKQorLy8gICAgICAgICAgICAgIHVpTm9kZUlkX3AgICAgICAgICAgICAgID0gSU46IG5vZGUgSUQgKDAgPSBpdHNlbGYpCisvLyAgICAgICAgICAgICAgdWlJbmRleF9wICAgICAgICAgICAgICAgPSBJTjogaW5kZXggb2Ygb2JqZWN0IGluIE9ECisvLyAgICAgICAgICAgICAgdWlTdWJpbmRleF9wICAgICAgICAgICAgPSBJTjogc3ViLWluZGV4IG9mIG9iamVjdCBpbiBPRAorLy8gICAgICAgICAgICAgIHBEc3REYXRhX2xlX3AgICAgICAgICAgID0gT1VUOiBwb2ludGVyIHRvIGRhdGEgaW4gbGl0dGxlIGVuZGlhbgorLy8gICAgICAgICAgICAgIHB1aVNpemVfcCAgICAgICAgICAgICAgID0gSU5PVVQ6IHBvaW50ZXIgdG8gc2l6ZSBvZiBkYXRhCisvLyAgICAgICAgICAgICAgU2RvVHlwZV9wICAgICAgICAgICAgICAgPSBJTjogdHlwZSBvZiBTRE8gdHJhbnNmZXIKKy8vICAgICAgICAgICAgICBwVXNlckFyZ19wICAgICAgICAgICAgICA9IElOOiB1c2VyLWRlZmluYWJsZSBhcmd1bWVudCBwb2ludGVyLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoIHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBldmVudCBjYWxsYmFjayBmdW5jdGlvbgorLy8KKy8vIFJldHVybjogICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbEFwaVJlYWRPYmplY3QodEVwbFNkb0NvbUNvbkhkbCAqIHBTZG9Db21Db25IZGxfcCwKKwkJCQkgICB1bnNpZ25lZCBpbnQgdWlOb2RlSWRfcCwKKwkJCQkgICB1bnNpZ25lZCBpbnQgdWlJbmRleF9wLAorCQkJCSAgIHVuc2lnbmVkIGludCB1aVN1YmluZGV4X3AsCisJCQkJICAgdm9pZCAqcERzdERhdGFfbGVfcCwKKwkJCQkgICB1bnNpZ25lZCBpbnQgKnB1aVNpemVfcCwKKwkJCQkgICB0RXBsU2RvVHlwZSBTZG9UeXBlX3AsIHZvaWQgKnBVc2VyQXJnX3ApCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCWlmICgodWlJbmRleF9wID09IDApIHx8IChwRHN0RGF0YV9sZV9wID09IE5VTEwpIHx8IChwdWlTaXplX3AgPT0gTlVMTCkKKwkgICAgfHwgKCpwdWlTaXplX3AgPT0gMCkpIHsKKwkJUmV0ID0ga0VwbEFwaUludmFsaWRQYXJhbTsKKwkJZ290byBFeGl0OworCX0KKworCWlmICh1aU5vZGVJZF9wID09IDAgfHwgdWlOb2RlSWRfcCA9PSBFcGxPYmRHZXROb2RlSWQoKSkgewkvLyBsb2NhbCBPRCBhY2Nlc3MgY2FuIGJlIHBlcmZvcm1lZAorCQl0RXBsT2JkU2l6ZSBPYmRTaXplOworCisJCU9iZFNpemUgPSAodEVwbE9iZFNpemUpICogcHVpU2l6ZV9wOworCQlSZXQgPQorCQkgICAgRXBsT2JkUmVhZEVudHJ5VG9MZSh1aUluZGV4X3AsIHVpU3ViaW5kZXhfcCwgcERzdERhdGFfbGVfcCwKKwkJCQkJJk9iZFNpemUpOworCQkqcHVpU2l6ZV9wID0gKHVuc2lnbmVkIGludClPYmRTaXplOworCX0gZWxzZSB7CQkvLyBwZXJmb3JtIFNETyB0cmFuc2ZlcgorI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfU0RPQykpICE9IDApCisJCXRFcGxTZG9Db21UcmFuc1BhcmFtQnlJbmRleCBUcmFuc1BhcmFtQnlJbmRleDsKKy8vICAgIHRFcGxTZG9Db21Db25IZGwgICAgICAgICAgICBTZG9Db21Db25IZGw7CisKKwkJLy8gY2hlY2sgaWYgYXBwbGljYXRpb24gcHJvdmlkZXMgc3BhY2UgZm9yIGhhbmRsZQorCQlpZiAocFNkb0NvbUNvbkhkbF9wID09IE5VTEwpIHsKKwkJCVJldCA9IGtFcGxBcGlJbnZhbGlkUGFyYW07CisJCQlnb3RvIEV4aXQ7CisvLyAgICAgICAgICAgIHBTZG9Db21Db25IZGxfcCA9ICZTZG9Db21Db25IZGw7CisJCX0KKwkJLy8gaW5pdCBjb21tYW5kIGxheWVyIGNvbm5lY3Rpb24KKwkJUmV0ID0gRXBsU2RvQ29tRGVmaW5lQ29uKHBTZG9Db21Db25IZGxfcCwgdWlOb2RlSWRfcCwJLy8gdGFyZ2V0IG5vZGUgaWQKKwkJCQkJIFNkb1R5cGVfcCk7CS8vIFNETyB0eXBlCisJCWlmICgoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSAmJiAoUmV0ICE9IGtFcGxTZG9Db21IYW5kbGVFeGlzdHMpKSB7CisJCQlnb3RvIEV4aXQ7CisJCX0KKwkJVHJhbnNQYXJhbUJ5SW5kZXgubV9wRGF0YSA9IHBEc3REYXRhX2xlX3A7CisJCVRyYW5zUGFyYW1CeUluZGV4Lm1fU2RvQWNjZXNzVHlwZSA9IGtFcGxTZG9BY2Nlc3NUeXBlUmVhZDsKKwkJVHJhbnNQYXJhbUJ5SW5kZXgubV9TZG9Db21Db25IZGwgPSAqcFNkb0NvbUNvbkhkbF9wOworCQlUcmFuc1BhcmFtQnlJbmRleC5tX3VpRGF0YVNpemUgPSAqcHVpU2l6ZV9wOworCQlUcmFuc1BhcmFtQnlJbmRleC5tX3VpSW5kZXggPSB1aUluZGV4X3A7CisJCVRyYW5zUGFyYW1CeUluZGV4Lm1fdWlTdWJpbmRleCA9IHVpU3ViaW5kZXhfcDsKKwkJVHJhbnNQYXJhbUJ5SW5kZXgubV9wZm5TZG9GaW5pc2hlZENiID0gRXBsQXBpQ2JTZG9Db247CisJCVRyYW5zUGFyYW1CeUluZGV4Lm1fcFVzZXJBcmcgPSBwVXNlckFyZ19wOworCisJCVJldCA9IEVwbFNkb0NvbUluaXRUcmFuc2ZlckJ5SW5kZXgoJlRyYW5zUGFyYW1CeUluZGV4KTsKKwkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJZ290byBFeGl0OworCQl9CisJCVJldCA9IGtFcGxBcGlUYXNrRGVmZXJyZWQ7CisKKyNlbHNlCisJCVJldCA9IGtFcGxBcGlJbnZhbGlkUGFyYW07CisjZW5kaWYKKwl9CisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIFJldDsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxBcGlXcml0ZU9iamVjdCgpCisvLworLy8gRGVzY3JpcHRpb246IHdyaXRlcyB0aGUgc3BlY2lmaWVkIGVudHJ5IHRvIHRoZSBPRCBvZiB0aGUgc3BlY2lmaWVkIG5vZGUuCisvLyAgICAgICAgICAgICAgSWYgdGhpcyBub2RlIGlzIGEgcmVtb3RlIG5vZGUsIGl0IHBlcmZvcm1zIGEgU0RPIHRyYW5zZmVyLCB3aGljaAorLy8gICAgICAgICAgICAgIG1lYW5zIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBrRXBsQXBpVGFza0RlZmVycmVkIGFuZCB0aGUgYXBwbGljYXRpb24KKy8vICAgICAgICAgICAgICBpcyBpbmZvcm1lZCB2aWEgdGhlIGV2ZW50IGNhbGxiYWNrIGZ1bmN0aW9uIHdoZW4gdGhlIHRhc2sgaXMgY29tcGxldGVkLgorLy8KKy8vIFBhcmFtZXRlcnM6ICBwU2RvQ29tQ29uSGRsX3AgICAgICAgICA9IElOT1VUOiBwb2ludGVyIHRvIFNETyBjb25uZWN0aW9uIGhhbmRsZSAobWF5IGJlIE5VTEwgaW4gY2FzZSBvZiBsb2NhbCBPRCBhY2Nlc3MpCisvLyAgICAgICAgICAgICAgdWlOb2RlSWRfcCAgICAgICAgICAgICAgPSBJTjogbm9kZSBJRCAoMCA9IGl0c2VsZikKKy8vICAgICAgICAgICAgICB1aUluZGV4X3AgICAgICAgICAgICAgICA9IElOOiBpbmRleCBvZiBvYmplY3QgaW4gT0QKKy8vICAgICAgICAgICAgICB1aVN1YmluZGV4X3AgICAgICAgICAgICA9IElOOiBzdWItaW5kZXggb2Ygb2JqZWN0IGluIE9ECisvLyAgICAgICAgICAgICAgcFNyY0RhdGFfbGVfcCAgICAgICAgICAgPSBJTjogcG9pbnRlciB0byBkYXRhIGluIGxpdHRsZSBlbmRpYW4KKy8vICAgICAgICAgICAgICB1aVNpemVfcCAgICAgICAgICAgICAgICA9IElOOiBzaXplIG9mIGRhdGEgaW4gYnl0ZXMKKy8vICAgICAgICAgICAgICBTZG9UeXBlX3AgICAgICAgICAgICAgICA9IElOOiB0eXBlIG9mIFNETyB0cmFuc2ZlcgorLy8gICAgICAgICAgICAgIHBVc2VyQXJnX3AgICAgICAgICAgICAgID0gSU46IHVzZXItZGVmaW5hYmxlIGFyZ3VtZW50IHBvaW50ZXIsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2ggd2lsbCBiZSBwYXNzZWQgdG8gdGhlIGV2ZW50IGNhbGxiYWNrIGZ1bmN0aW9uCisvLworLy8gUmV0dXJuOiAgICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsQXBpV3JpdGVPYmplY3QodEVwbFNkb0NvbUNvbkhkbCAqIHBTZG9Db21Db25IZGxfcCwKKwkJCQkgICAgdW5zaWduZWQgaW50IHVpTm9kZUlkX3AsCisJCQkJICAgIHVuc2lnbmVkIGludCB1aUluZGV4X3AsCisJCQkJICAgIHVuc2lnbmVkIGludCB1aVN1YmluZGV4X3AsCisJCQkJICAgIHZvaWQgKnBTcmNEYXRhX2xlX3AsCisJCQkJICAgIHVuc2lnbmVkIGludCB1aVNpemVfcCwKKwkJCQkgICAgdEVwbFNkb1R5cGUgU2RvVHlwZV9wLCB2b2lkICpwVXNlckFyZ19wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwlpZiAoKHVpSW5kZXhfcCA9PSAwKSB8fCAocFNyY0RhdGFfbGVfcCA9PSBOVUxMKSB8fCAodWlTaXplX3AgPT0gMCkpIHsKKwkJUmV0ID0ga0VwbEFwaUludmFsaWRQYXJhbTsKKwkJZ290byBFeGl0OworCX0KKworCWlmICh1aU5vZGVJZF9wID09IDAgfHwgdWlOb2RlSWRfcCA9PSBFcGxPYmRHZXROb2RlSWQoKSkgewkvLyBsb2NhbCBPRCBhY2Nlc3MgY2FuIGJlIHBlcmZvcm1lZAorCisJCVJldCA9CisJCSAgICBFcGxPYmRXcml0ZUVudHJ5RnJvbUxlKHVpSW5kZXhfcCwgdWlTdWJpbmRleF9wLAorCQkJCQkgICBwU3JjRGF0YV9sZV9wLCB1aVNpemVfcCk7CisJfSBlbHNlIHsJCS8vIHBlcmZvcm0gU0RPIHRyYW5zZmVyCisjaWYgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9TRE9DKSkgIT0gMCkKKwkJdEVwbFNkb0NvbVRyYW5zUGFyYW1CeUluZGV4IFRyYW5zUGFyYW1CeUluZGV4OworLy8gICAgdEVwbFNkb0NvbUNvbkhkbCAgICAgICAgICAgIFNkb0NvbUNvbkhkbDsKKworCQkvLyBjaGVjayBpZiBhcHBsaWNhdGlvbiBwcm92aWRlcyBzcGFjZSBmb3IgaGFuZGxlCisJCWlmIChwU2RvQ29tQ29uSGRsX3AgPT0gTlVMTCkgeworCQkJUmV0ID0ga0VwbEFwaUludmFsaWRQYXJhbTsKKwkJCWdvdG8gRXhpdDsKKy8vICAgICAgICAgICAgcFNkb0NvbUNvbkhkbF9wID0gJlNkb0NvbUNvbkhkbDsKKwkJfQorCQkvLyBkLmsuOiBIb3cgdG8gcmVjeWNsZSBjb21tYW5kIGxheWVyIGNvbm5lY3Rpb24/CisJCS8vICAgICAgIFRyeSB0byByZWRlZmluZSBpdCwgd2hpY2ggd2lsbCByZXR1cm4ga0VwbFNkb0NvbUhhbmRsZUV4aXN0cworCQkvLyAgICAgICBhbmQgdGhlIGV4aXN0aW5nIGNvbW1hbmQgbGF5ZXIgaGFuZGxlLgorCQkvLyAgICAgICBJZiB0aGUgcmV0dXJuZWQgaGFuZGxlIGlzIGJ1c3ksIEVwbFNkb0NvbUluaXRUcmFuc2ZlckJ5SW5kZXgoKQorCQkvLyAgICAgICB3aWxsIHJldHVybiB3aXRoIGVycm9yLgorCQkvLyAkJCQgZC5rLjogQ29sbGlzaW9ucyBtYXkgb2NjdXIgd2l0aCBDb25maWd1cmF0aW9uIE1hbmFnZXIsIGlmIGJvdGggdGhlIGFwcGxpY2F0aW9uIGFuZAorCQkvLyAgICAgICAgICAgQ29uZmlndXJhdGlvbiBNYW5hZ2VyLCBhcmUgdHJ5aW5nIHRvIGNvbW11bmljYXRlIHdpdGggdGhlIHZlcnkgc2FtZSBub2RlLgorCQkvLyAgICAgcG9zc2libGUgc29sdXRpb246IGRpc2FsbG93IGNvbW11bmljYXRpb24gYnkgYXBwbGljYXRpb24gaWYgQ29uZmlndXJhdGlvbiBNYW5hZ2VyIGlzIGJ1c3kKKworCQkvLyBpbml0IGNvbW1hbmQgbGF5ZXIgY29ubmVjdGlvbgorCQlSZXQgPSBFcGxTZG9Db21EZWZpbmVDb24ocFNkb0NvbUNvbkhkbF9wLCB1aU5vZGVJZF9wLAkvLyB0YXJnZXQgbm9kZSBpZAorCQkJCQkgU2RvVHlwZV9wKTsJLy8gU0RPIHR5cGUKKwkJaWYgKChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpICYmIChSZXQgIT0ga0VwbFNkb0NvbUhhbmRsZUV4aXN0cykpIHsKKwkJCWdvdG8gRXhpdDsKKwkJfQorCQlUcmFuc1BhcmFtQnlJbmRleC5tX3BEYXRhID0gcFNyY0RhdGFfbGVfcDsKKwkJVHJhbnNQYXJhbUJ5SW5kZXgubV9TZG9BY2Nlc3NUeXBlID0ga0VwbFNkb0FjY2Vzc1R5cGVXcml0ZTsKKwkJVHJhbnNQYXJhbUJ5SW5kZXgubV9TZG9Db21Db25IZGwgPSAqcFNkb0NvbUNvbkhkbF9wOworCQlUcmFuc1BhcmFtQnlJbmRleC5tX3VpRGF0YVNpemUgPSB1aVNpemVfcDsKKwkJVHJhbnNQYXJhbUJ5SW5kZXgubV91aUluZGV4ID0gdWlJbmRleF9wOworCQlUcmFuc1BhcmFtQnlJbmRleC5tX3VpU3ViaW5kZXggPSB1aVN1YmluZGV4X3A7CisJCVRyYW5zUGFyYW1CeUluZGV4Lm1fcGZuU2RvRmluaXNoZWRDYiA9IEVwbEFwaUNiU2RvQ29uOworCQlUcmFuc1BhcmFtQnlJbmRleC5tX3BVc2VyQXJnID0gcFVzZXJBcmdfcDsKKworCQlSZXQgPSBFcGxTZG9Db21Jbml0VHJhbnNmZXJCeUluZGV4KCZUcmFuc1BhcmFtQnlJbmRleCk7CisJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCWdvdG8gRXhpdDsKKwkJfQorCQlSZXQgPSBrRXBsQXBpVGFza0RlZmVycmVkOworCisjZWxzZQorCQlSZXQgPSBrRXBsQXBpSW52YWxpZFBhcmFtOworI2VuZGlmCisJfQorCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsQXBpRnJlZVNkb0NoYW5uZWwoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBmcmVlcyB0aGUgc3BlY2lmaWVkIFNETyBjaGFubmVsLgorLy8gICAgICAgICAgICAgIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgZWFjaCBjYWxsIHRvIEVwbEFwaVJlYWRPYmplY3QoKS9FcGxBcGlXcml0ZU9iamVjdCgpCisvLyAgICAgICAgICAgICAgd2hpY2ggcmV0dXJucyBrRXBsQXBpVGFza0RlZmVycmVkIGFuZCB0aGUgYXBwbGljYXRpb24KKy8vICAgICAgICAgICAgICBpcyBpbmZvcm1lZCB2aWEgdGhlIGV2ZW50IGNhbGxiYWNrIGZ1bmN0aW9uIHdoZW4gdGhlIHRhc2sgaXMgY29tcGxldGVkLgorLy8KKy8vIFBhcmFtZXRlcnM6ICBTZG9Db21Db25IZGxfcCAgICAgICAgICA9IElOOiBTRE8gY29ubmVjdGlvbiBoYW5kbGUKKy8vCisvLyBSZXR1cm46ICAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIFBVQkxJQyBFcGxBcGlGcmVlU2RvQ2hhbm5lbCh0RXBsU2RvQ29tQ29uSGRsIFNkb0NvbUNvbkhkbF9wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1NET0MpKSAhPSAwKQorCisJLy8gaW5pdCBjb21tYW5kIGxheWVyIGNvbm5lY3Rpb24KKwlSZXQgPSBFcGxTZG9Db21VbmRlZmluZUNvbihTZG9Db21Db25IZGxfcCk7CisKKyNlbHNlCisJUmV0ID0ga0VwbEFwaUludmFsaWRQYXJhbTsKKyNlbmRpZgorCisJcmV0dXJuIFJldDsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxBcGlSZWFkTG9jYWxPYmplY3QoKQorLy8KKy8vIERlc2NyaXB0aW9uOiByZWFkcyB0aGUgc3BlY2lmaWVkIGVudHJ5IGZyb20gdGhlIGxvY2FsIE9ELgorLy8KKy8vIFBhcmFtZXRlcnM6ICB1aUluZGV4X3AgICAgICAgICAgICAgICA9IElOOiBpbmRleCBvZiBvYmplY3QgaW4gT0QKKy8vICAgICAgICAgICAgICB1aVN1YmluZGV4X3AgICAgICAgICAgICA9IElOOiBzdWItaW5kZXggb2Ygb2JqZWN0IGluIE9ECisvLyAgICAgICAgICAgICAgcERzdERhdGFfcCAgICAgICAgICAgICAgPSBPVVQ6IHBvaW50ZXIgdG8gZGF0YSBpbiBwbGF0Zm9ybSBieXRlIG9yZGVyCisvLyAgICAgICAgICAgICAgcHVpU2l6ZV9wICAgICAgICAgICAgICAgPSBJTk9VVDogcG9pbnRlciB0byBzaXplIG9mIGRhdGEKKy8vCisvLyBSZXR1cm46ICAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIFBVQkxJQyBFcGxBcGlSZWFkTG9jYWxPYmplY3QodW5zaWduZWQgaW50IHVpSW5kZXhfcCwKKwkJCQkJdW5zaWduZWQgaW50IHVpU3ViaW5kZXhfcCwKKwkJCQkJdm9pZCAqcERzdERhdGFfcCwKKwkJCQkJdW5zaWduZWQgaW50ICpwdWlTaXplX3ApCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwl0RXBsT2JkU2l6ZSBPYmRTaXplOworCisJT2JkU2l6ZSA9ICh0RXBsT2JkU2l6ZSkgKiBwdWlTaXplX3A7CisJUmV0ID0gRXBsT2JkUmVhZEVudHJ5KHVpSW5kZXhfcCwgdWlTdWJpbmRleF9wLCBwRHN0RGF0YV9wLCAmT2JkU2l6ZSk7CisJKnB1aVNpemVfcCA9ICh1bnNpZ25lZCBpbnQpT2JkU2l6ZTsKKworCXJldHVybiBSZXQ7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsQXBpV3JpdGVMb2NhbE9iamVjdCgpCisvLworLy8gRGVzY3JpcHRpb246IHdyaXRlcyB0aGUgc3BlY2lmaWVkIGVudHJ5IHRvIHRoZSBsb2NhbCBPRC4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgdWlJbmRleF9wICAgICAgICAgICAgICAgPSBJTjogaW5kZXggb2Ygb2JqZWN0IGluIE9ECisvLyAgICAgICAgICAgICAgdWlTdWJpbmRleF9wICAgICAgICAgICAgPSBJTjogc3ViLWluZGV4IG9mIG9iamVjdCBpbiBPRAorLy8gICAgICAgICAgICAgIHBTcmNEYXRhX3AgICAgICAgICAgICAgID0gSU46IHBvaW50ZXIgdG8gZGF0YSBpbiBwbGF0Zm9ybSBieXRlIG9yZGVyCisvLyAgICAgICAgICAgICAgdWlTaXplX3AgICAgICAgICAgICAgICAgPSBJTjogc2l6ZSBvZiBkYXRhIGluIGJ5dGVzCisvLworLy8gUmV0dXJuOiAgICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsQXBpV3JpdGVMb2NhbE9iamVjdCh1bnNpZ25lZCBpbnQgdWlJbmRleF9wLAorCQkJCQkgdW5zaWduZWQgaW50IHVpU3ViaW5kZXhfcCwKKwkJCQkJIHZvaWQgKnBTcmNEYXRhX3AsCisJCQkJCSB1bnNpZ25lZCBpbnQgdWlTaXplX3ApCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCVJldCA9CisJICAgIEVwbE9iZFdyaXRlRW50cnkodWlJbmRleF9wLCB1aVN1YmluZGV4X3AsIHBTcmNEYXRhX3AsCisJCQkgICAgICh0RXBsT2JkU2l6ZSkgdWlTaXplX3ApOworCisJcmV0dXJuIFJldDsKK30KKworI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UX01OKSkgIT0gMCkKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsQXBpTW5UcmlnZ2VyU3RhdGVDaGFuZ2UoKQorLy8KKy8vIERlc2NyaXB0aW9uOiB0cmlnZ2VycyB0aGUgc3BlY2lmaWVkIG5vZGUgY29tbWFuZCBmb3IgdGhlIHNwZWNpZmllZCBub2RlLgorLy8KKy8vIFBhcmFtZXRlcnM6ICB1aU5vZGVJZF9wICAgICAgICAgICAgICA9IG5vZGUgSUQgZm9yIHdoaWNoIHRoZSBub2RlIGNvbW1hbmQgd2lsbCBiZSBleGVjdXRlZAorLy8gICAgICAgICAgICAgIE5vZGVDb21tYW5kX3AgICAgICAgICAgID0gbm9kZSBjb21tYW5kCisvLworLy8gUmV0dXJuOiAgICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsQXBpTW5UcmlnZ2VyU3RhdGVDaGFuZ2UodW5zaWduZWQgaW50IHVpTm9kZUlkX3AsCisJCQkJCSAgICAgdEVwbE5tdE5vZGVDb21tYW5kIE5vZGVDb21tYW5kX3ApCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCVJldCA9IEVwbE5tdE1udVRyaWdnZXJTdGF0ZUNoYW5nZSh1aU5vZGVJZF9wLCBOb2RlQ29tbWFuZF9wKTsKKworCXJldHVybiBSZXQ7Cit9CisKKyNlbmRpZiAvLyAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVF9NTikpICE9IDApCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbEFwaUNiT2JkQWNjZXNzCisvLworLy8gRGVzY3JpcHRpb246IGNhbGxiYWNrIGZ1bmN0aW9uIGZvciBPRCBhY2Nlc3NlcworLy8KKy8vIFBhcmFtZXRlcnM6ICBwUGFyYW1fcCAgICAgICAgICAgICAgICA9IE9CRCBwYXJhbWV0ZXIKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbEFwaUNiT2JkQWNjZXNzKHRFcGxPYmRDYlBhcmFtIE1FTSAqIHBQYXJhbV9wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKyNpZiAoRVBMX0FQSV9PQkRfRk9SV0FSRF9FVkVOVCAhPSBGQUxTRSkKKwl0RXBsQXBpRXZlbnRBcmcgRXZlbnRBcmc7CisKKwkvLyBjYWxsIHVzZXIgY2FsbGJhY2sKKwkvLyBtdXN0IGJlIGRpc2FibGVkIGZvciBFcGxBcGlMaW51eEtlcm5lbC5jLCBiZWNhdXNlIG9mIHJlZW50cmFuY3kgcHJvYmxlbQorCS8vIGZvciBsb2NhbCBPRCBhY2Nlc3MuIFRoaXMgaXMgbm90IHNvIGJhZCBhcyB1c2VyIGNhbGxiYWNrIGZ1bmN0aW9uIGluCisJLy8gYXBwbGljYXRpb24gZG9lcyBub3QgdXNlIE9EIGNhbGxiYWNrcyBhdCB0aGUgbW9tZW50LgorCUV2ZW50QXJnLm1fT2JkQ2JQYXJhbSA9ICpwUGFyYW1fcDsKKwlSZXQgPSBFcGxBcGlJbnN0YW5jZV9nLm1fSW5pdFBhcmFtLm1fcGZuQ2JFdmVudChrRXBsQXBpRXZlbnRPYmRBY2Nlc3MsCisJCQkJCQkJJkV2ZW50QXJnLAorCQkJCQkJCUVwbEFwaUluc3RhbmNlX2cuCisJCQkJCQkJbV9Jbml0UGFyYW0uCisJCQkJCQkJbV9wRXZlbnRVc2VyQXJnKTsKKyNlbmRpZgorCisJc3dpdGNoIChwUGFyYW1fcC0+bV91aUluZGV4KSB7CisJCS8vY2FzZSAweDEwMDY6ICAgIC8vIE5NVF9DeWNsZUxlbl9VMzIgKHZhbGlkIG9uIHJlc2V0KQorCWNhc2UgMHgxQzE0OgkJLy8gRExMX0xvc3NPZkZyYW1lVG9sZXJhbmNlX1UzMgorCQkvL2Nhc2UgMHgxRjk4OiAgICAvLyBOTVRfQ3ljbGVUaW1pbmdfUkVDICh2YWxpZCBvbiByZXNldCkKKwkJeworCQkJaWYgKHBQYXJhbV9wLT5tX09iZEV2ZW50ID09IGtFcGxPYmRFdlBvc3RXcml0ZSkgeworCQkJCS8vIHVwZGF0ZSBETEwgY29uZmlndXJhdGlvbgorCQkJCVJldCA9IEVwbEFwaVVwZGF0ZURsbENvbmZpZyhGQUxTRSk7CisJCQl9CisJCQlicmVhazsKKwkJfQorCisJY2FzZSAweDEwMjA6CQkvLyBDRk1fVmVyaWZ5Q29uZmlndXJhdGlvbl9SRUMuQ29uZklkX1UzMiAhPSAwCisJCXsKKwkJCWlmICgocFBhcmFtX3AtPm1fT2JkRXZlbnQgPT0ga0VwbE9iZEV2UG9zdFdyaXRlKQorCQkJICAgICYmIChwUGFyYW1fcC0+bV91aVN1YkluZGV4ID09IDMpCisJCQkgICAgJiYgKCooKERXT1JEICopIHBQYXJhbV9wLT5tX3BBcmcpICE9IDApKSB7CisJCQkJRFdPUkQgZHdWZXJpZnlDb25mSW52YWxpZCA9IDA7CisJCQkJLy8gc2V0IENGTV9WZXJpZnlDb25maWd1cmF0aW9uX1JFQy5WZXJpZnlDb25mSW52YWxpZF9VMzIgdG8gMAorCQkJCVJldCA9CisJCQkJICAgIEVwbE9iZFdyaXRlRW50cnkoMHgxMDIwLCA0LAorCQkJCQkJICAgICAmZHdWZXJpZnlDb25mSW52YWxpZCwgNCk7CisJCQkJLy8gaWdub3JlIGFueSBlcnJvciBiZWNhdXNlIHRoaXMgb2JqZWt0IGlzIG9wdGlvbmFsCisJCQkJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJCQl9CisJCQlicmVhazsKKwkJfQorCisJY2FzZSAweDFGOUU6CQkvLyBOTVRfUmVzZXRDbWRfVTgKKwkJeworCQkJaWYgKHBQYXJhbV9wLT5tX09iZEV2ZW50ID09IGtFcGxPYmRFdlByZVdyaXRlKSB7CisJCQkJQllURSBiTm10Q29tbWFuZDsKKworCQkJCWJObXRDb21tYW5kID0gKigoQllURSAqKSBwUGFyYW1fcC0+bV9wQXJnKTsKKwkJCQkvLyBjaGVjayB2YWx1ZSByYW5nZQorCQkJCXN3aXRjaCAoKHRFcGxObXRDb21tYW5kKSBiTm10Q29tbWFuZCkgeworCQkJCWNhc2Uga0VwbE5tdENtZFJlc2V0Tm9kZToKKwkJCQljYXNlIGtFcGxObXRDbWRSZXNldENvbW11bmljYXRpb246CisJCQkJY2FzZSBrRXBsTm10Q21kUmVzZXRDb25maWd1cmF0aW9uOgorCQkJCWNhc2Uga0VwbE5tdENtZFN3UmVzZXQ6CisJCQkJY2FzZSBrRXBsTm10Q21kSW52YWxpZFNlcnZpY2U6CisJCQkJCS8vIHZhbGlkIGNvbW1hbmQgaWRlbnRpZmllciBzcGVjaWZpZWQKKwkJCQkJYnJlYWs7CisKKwkJCQlkZWZhdWx0OgorCQkJCQlwUGFyYW1fcC0+bV9kd0Fib3J0Q29kZSA9CisJCQkJCSAgICBFUExfU0RPQUNfVkFMVUVfUkFOR0VfRVhDRUVERUQ7CisJCQkJCVJldCA9IGtFcGxPYmRBY2Nlc3NWaW9sYXRpb247CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0gZWxzZSBpZiAocFBhcmFtX3AtPm1fT2JkRXZlbnQgPT0ga0VwbE9iZEV2UG9zdFdyaXRlKSB7CisJCQkJQllURSBiTm10Q29tbWFuZDsKKworCQkJCWJObXRDb21tYW5kID0gKigoQllURSAqKSBwUGFyYW1fcC0+bV9wQXJnKTsKKwkJCQkvLyBjaGVjayB2YWx1ZSByYW5nZQorCQkJCXN3aXRjaCAoKHRFcGxObXRDb21tYW5kKSBiTm10Q29tbWFuZCkgeworCQkJCWNhc2Uga0VwbE5tdENtZFJlc2V0Tm9kZToKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UVSkpICE9IDApCisJCQkJCVJldCA9CisJCQkJCSAgICBFcGxObXR1Tm10RXZlbnQKKwkJCQkJICAgIChrRXBsTm10RXZlbnRSZXNldE5vZGUpOworI2VuZGlmCisJCQkJCWJyZWFrOworCisJCQkJY2FzZSBrRXBsTm10Q21kUmVzZXRDb21tdW5pY2F0aW9uOgorI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRVKSkgIT0gMCkKKwkJCQkJUmV0ID0KKwkJCQkJICAgIEVwbE5tdHVObXRFdmVudAorCQkJCQkgICAgKGtFcGxObXRFdmVudFJlc2V0Q29tKTsKKyNlbmRpZgorCQkJCQlicmVhazsKKworCQkJCWNhc2Uga0VwbE5tdENtZFJlc2V0Q29uZmlndXJhdGlvbjoKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UVSkpICE9IDApCisJCQkJCVJldCA9CisJCQkJCSAgICBFcGxObXR1Tm10RXZlbnQKKwkJCQkJICAgIChrRXBsTm10RXZlbnRSZXNldENvbmZpZyk7CisjZW5kaWYKKwkJCQkJYnJlYWs7CisKKwkJCQljYXNlIGtFcGxObXRDbWRTd1Jlc2V0OgorI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRVKSkgIT0gMCkKKwkJCQkJUmV0ID0KKwkJCQkJICAgIEVwbE5tdHVObXRFdmVudAorCQkJCQkgICAgKGtFcGxObXRFdmVudFN3UmVzZXQpOworI2VuZGlmCisJCQkJCWJyZWFrOworCisJCQkJY2FzZSBrRXBsTm10Q21kSW52YWxpZFNlcnZpY2U6CisJCQkJCWJyZWFrOworCisJCQkJZGVmYXVsdDoKKwkJCQkJcFBhcmFtX3AtPm1fZHdBYm9ydENvZGUgPQorCQkJCQkgICAgRVBMX1NET0FDX1ZBTFVFX1JBTkdFX0VYQ0VFREVEOworCQkJCQlSZXQgPSBrRXBsT2JkQWNjZXNzVmlvbGF0aW9uOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJfQorCisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisvL0V4aXQ6CisJcmV0dXJuIFJldDsKK30KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICBQIFIgSSBWIEEgVCBFICAgRiBVIE4gQyBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbEFwaVByb2Nlc3NFdmVudAorLy8KKy8vIERlc2NyaXB0aW9uOiBwcm9jZXNzZXMgZXZlbnRzIGZyb20gZXZlbnQgcXVldWUgYW5kIGZvcndhcmRzIHRoZXNlIHRvCisvLyAgICAgICAgICAgICAgdGhlIGFwcGxpY2F0aW9uJ3MgZXZlbnQgY2FsbGJhY2sgZnVuY3Rpb24KKy8vCisvLyBQYXJhbWV0ZXJzOiAgcEVwbEV2ZW50X3AgPSAgIHBvaW50ZXIgdG8gZXZlbnQKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgPSBlcnJvcmNvZGUKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdEVwbEtlcm5lbCBQVUJMSUMgRXBsQXBpUHJvY2Vzc0V2ZW50KHRFcGxFdmVudCAqIHBFcGxFdmVudF9wKQoreworCXRFcGxLZXJuZWwgUmV0OworCXRFcGxFdmVudEVycm9yICpwRXZlbnRFcnJvcjsKKwl0RXBsQXBpRXZlbnRUeXBlIEV2ZW50VHlwZTsKKworCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJLy8gcHJvY2VzcyBldmVudAorCXN3aXRjaCAocEVwbEV2ZW50X3AtPm1fRXZlbnRUeXBlKSB7CisJCS8vIGVycm9yIGV2ZW50CisJY2FzZSBrRXBsRXZlbnRUeXBlRXJyb3I6CisJCXsKKwkJCXBFdmVudEVycm9yID0gKHRFcGxFdmVudEVycm9yICopIHBFcGxFdmVudF9wLT5tX3BBcmc7CisJCQlzd2l0Y2ggKHBFdmVudEVycm9yLT5tX0V2ZW50U291cmNlKSB7CisJCQkJLy8gdHJlYXQgdGhlIGVycm9ycyBmcm9tIHRoZSBmb2xsb3dpbmcgc291cmNlcyBhcyBjcml0aWNhbAorCQkJY2FzZSBrRXBsRXZlbnRTb3VyY2VFdmVudGs6CisJCQljYXNlIGtFcGxFdmVudFNvdXJjZUV2ZW50dToKKwkJCWNhc2Uga0VwbEV2ZW50U291cmNlRGxsazoKKwkJCQl7CisJCQkJCUV2ZW50VHlwZSA9IGtFcGxBcGlFdmVudENyaXRpY2FsRXJyb3I7CisJCQkJCS8vIGhhbHQgdGhlIHN0YWNrIGJ5IGVudGVyaW5nIE5NVCBzdGF0ZSBPZmYKKwkJCQkJUmV0ID0KKwkJCQkJICAgIEVwbE5tdHVObXRFdmVudAorCQkJCQkgICAgKGtFcGxObXRFdmVudENyaXRpY2FsRXJyb3IpOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyB0aGUgb3RoZXIgZXJyb3JzIGFyZSBqdXN0IHdhcm5pbmdzCisJCQlkZWZhdWx0OgorCQkJCXsKKwkJCQkJRXZlbnRUeXBlID0ga0VwbEFwaUV2ZW50V2FybmluZzsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCisJCQkvLyBjYWxsIHVzZXIgY2FsbGJhY2sKKwkJCVJldCA9CisJCQkgICAgRXBsQXBpSW5zdGFuY2VfZy5tX0luaXRQYXJhbS5tX3BmbkNiRXZlbnQoRXZlbnRUeXBlLAorCQkJCQkJCQkgICAgICAodEVwbEFwaUV2ZW50QXJnCisJCQkJCQkJCSAgICAgICAqKQorCQkJCQkJCQkgICAgICBwRXZlbnRFcnJvciwKKwkJCQkJCQkJICAgICAgRXBsQXBpSW5zdGFuY2VfZy4KKwkJCQkJCQkJICAgICAgbV9Jbml0UGFyYW0uCisJCQkJCQkJCSAgICAgIG1fcEV2ZW50VXNlckFyZyk7CisJCQkvLyBkaXNjYXJkIGVycm9yIGZyb20gY2FsbGJhY2sgZnVuY3Rpb24sIGJlY2F1c2UgdGhpcyBjb3VsZCBnZW5lcmF0ZSBhbiBlbmRsZXNzIGxvb3AKKwkJCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCQkJYnJlYWs7CisJCX0KKworCQkvLyBhdCBwcmVzZW50LCB0aGVyZSBhcmUgbm8gb3RoZXIgZXZlbnRzIGZvciB0aGlzIG1vZHVsZQorCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbEFwaUNiTm10U3RhdGVDaGFuZ2UKKy8vCisvLyBEZXNjcmlwdGlvbjogY2FsbGJhY2sgZnVuY3Rpb24gZm9yIE5NVCBzdGF0ZSBjaGFuZ2VzCisvLworLy8gUGFyYW1ldGVyczogIE5tdFN0YXRlQ2hhbmdlX3AgICAgICAgID0gTk1UIHN0YXRlIGNoYW5nZSBldmVudAorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHRFcGxLZXJuZWwgUFVCTElDIEVwbEFwaUNiTm10U3RhdGVDaGFuZ2UodEVwbEV2ZW50Tm10U3RhdGVDaGFuZ2UKKwkJCQkJCU5tdFN0YXRlQ2hhbmdlX3ApCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwlCWVRFIGJObXRTdGF0ZTsKKwl0RXBsQXBpRXZlbnRBcmcgRXZlbnRBcmc7CisKKwkvLyBzYXZlIE5NVCBzdGF0ZSBpbiBPRAorCWJObXRTdGF0ZSA9IChCWVRFKSBObXRTdGF0ZUNoYW5nZV9wLm1fTmV3Tm10U3RhdGU7CisJUmV0ID0gRXBsT2JkV3JpdGVFbnRyeSgweDFGOEMsIDAsICZiTm10U3RhdGUsIDEpOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKwkvLyBkbyB3b3JrIHdoaWNoIG11c3QgYmUgZG9uZSBpbiB0aGF0IHN0YXRlCisJc3dpdGNoIChObXRTdGF0ZUNoYW5nZV9wLm1fTmV3Tm10U3RhdGUpIHsKKwkJLy8gRVBMIHN0YWNrIGlzIG5vdCBydW5uaW5nCisJY2FzZSBrRXBsTm10R3NPZmY6CisJCWJyZWFrOworCisJCS8vIGZpcnN0IGluaXQgb2YgdGhlIGhhcmR3YXJlCisJY2FzZSBrRXBsTm10R3NJbml0aWFsaXNpbmc6CisjaWYgMAorI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9TRE9fVURQKSkgIT0gMCkKKwkJLy8gY29uZmlndXJlIFNETyB2aWEgVURQIChpLmUuIGJpbmQgaXQgdG8gdGhlIEVQTCBldGhlcm5ldCBpbnRlcmZhY2UpCisJCVJldCA9CisJCSAgICBFcGxTZG9VZHB1Q29uZmlnKEVwbEFwaUluc3RhbmNlX2cubV9Jbml0UGFyYW0ubV9kd0lwQWRkcmVzcywKKwkJCQkgICAgIEVQTF9DX1NET19FUExfUE9SVCk7CisJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCWdvdG8gRXhpdDsKKwkJfQorI2VuZGlmCisjZW5kaWYKKworCQlicmVhazsKKworCQkvLyBpbml0IG9mIHRoZSBtYW51ZmFjdHVyZXItc3BlY2lmaWMgcHJvZmlsZSBhcmVhIGFuZCB0aGUKKwkJLy8gc3RhbmRhcmRpc2VkIGRldmljZSBwcm9maWxlIGFyZWEKKwljYXNlIGtFcGxObXRHc1Jlc2V0QXBwbGljYXRpb246CisJCXsKKwkJCS8vIHJlc2V0IGFwcGxpY2F0aW9uIHBhcnQgb2YgT0QKKwkJCVJldCA9IEVwbE9iZEFjY2Vzc09kUGFydChrRXBsT2JkUGFydEFwcCwKKwkJCQkJCSBrRXBsT2JkRGlyTG9hZCk7CisJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQkJZ290byBFeGl0OworCQkJfQorCisJCQlicmVhazsKKwkJfQorCisJCS8vIGluaXQgb2YgdGhlIGNvbW11bmljYXRpb24gcHJvZmlsZSBhcmVhCisJY2FzZSBrRXBsTm10R3NSZXNldENvbW11bmljYXRpb246CisJCXsKKwkJCS8vIHJlc2V0IGNvbW11bmljYXRpb24gcGFydCBvZiBPRAorCQkJUmV0ID0gRXBsT2JkQWNjZXNzT2RQYXJ0KGtFcGxPYmRQYXJ0R2VuLAorCQkJCQkJIGtFcGxPYmREaXJMb2FkKTsKKworCQkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJCWdvdG8gRXhpdDsKKwkJCX0KKwkJCS8vICQkJCBkLmsuOiB1cGRhdGUgT0Qgb25seSBpZiBPRCB3YXMgbm90IGxvYWRlZCBmcm9tIG5vbi12b2xhdGlsZSBtZW1vcnkKKwkJCVJldCA9IEVwbEFwaVVwZGF0ZU9iZCgpOworCQkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJCWdvdG8gRXhpdDsKKwkJCX0KKworCQkJYnJlYWs7CisJCX0KKworCQkvLyBidWlsZCB0aGUgY29uZmlndXJhdGlvbiB3aXRoIGluZm9zIGZyb20gT0QKKwljYXNlIGtFcGxObXRHc1Jlc2V0Q29uZmlndXJhdGlvbjoKKwkJeworCisJCQlSZXQgPSBFcGxBcGlVcGRhdGVEbGxDb25maWcoVFJVRSk7CisJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQkJZ290byBFeGl0OworCQkJfQorCisJCQlicmVhazsKKwkJfQorCisJCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJLy8gQ04gcGFydCBvZiB0aGUgc3RhdGUgbWFjaGluZQorCisJCS8vIG5vZGUgbGlzdGUgZm9yIEVQTC1GcmFtZXMgYW5kIGNoZWNrIHRpbWVvdXQKKwljYXNlIGtFcGxObXRDc05vdEFjdGl2ZToKKwkJeworCQkJLy8gaW5kaWNhdGUgY29tcGxldGlvbiBvZiByZXNldCBpbiBOTVRfUmVzZXRDbWRfVTgKKwkJCWJObXRTdGF0ZSA9IChCWVRFKSBrRXBsTm10Q21kSW52YWxpZFNlcnZpY2U7CisJCQlSZXQgPSBFcGxPYmRXcml0ZUVudHJ5KDB4MUY5RSwgMCwgJmJObXRTdGF0ZSwgMSk7CisJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQkJZ290byBFeGl0OworCQkJfQorCisJCQlicmVhazsKKwkJfQorCisJCS8vIG5vZGUgcHJvY2VzcyBvbmx5IGFzeW5jIGZyYW1lcworCWNhc2Uga0VwbE5tdENzUHJlT3BlcmF0aW9uYWwxOgorCQl7CisJCQlicmVhazsKKwkJfQorCisJCS8vIG5vZGUgcHJvY2VzcyBpc29jaHJvbnVzIGFuZCBhc3luY2hyb251cyBmcmFtZXMKKwljYXNlIGtFcGxObXRDc1ByZU9wZXJhdGlvbmFsMjoKKwkJeworCQkJYnJlYWs7CisJCX0KKworCQkvLyBub2RlIHNob3VsZCBiZSBjb25maWd1cmVkIHVuZCBhcHBsaWNhdGlvbiBpcyByZWFkeQorCWNhc2Uga0VwbE5tdENzUmVhZHlUb09wZXJhdGU6CisJCXsKKwkJCWJyZWFrOworCQl9CisKKwkJLy8gbm9ybWFsIHdvcmsgc3RhdGUKKwljYXNlIGtFcGxObXRDc09wZXJhdGlvbmFsOgorCQl7CisJCQlicmVhazsKKwkJfQorCisJCS8vIG5vZGUgc3RvcHBlZCBieSBNTgorCQkvLyAtPiBvbmx5IHByb2Nlc3MgYXN5bmNocm9udXMgZnJhbWVzCisJY2FzZSBrRXBsTm10Q3NTdG9wcGVkOgorCQl7CisJCQlicmVhazsKKwkJfQorCisJCS8vIG5vIEVQTCBjeWNsZQorCQkvLyAtPiBub3JtYWwgZXRoZXJuZXQgY29tbXVuaWNhdGlvbgorCWNhc2Uga0VwbE5tdENzQmFzaWNFdGhlcm5ldDoKKwkJeworCQkJYnJlYWs7CisJCX0KKworCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCS8vIE1OIHBhcnQgb2YgdGhlIHN0YXRlIG1hY2hpbmUKKworCQkvLyBub2RlIGxpc3RlbnMgZm9yIEVQTC1GcmFtZXMgYW5kIGNoZWNrIHRpbWVvdXQKKwljYXNlIGtFcGxObXRNc05vdEFjdGl2ZToKKwkJeworCQkJYnJlYWs7CisJCX0KKworCQkvLyBub2RlIHByb2Nlc3NlcyBvbmx5IGFzeW5jIGZyYW1lcworCWNhc2Uga0VwbE5tdE1zUHJlT3BlcmF0aW9uYWwxOgorCQl7CisJCQlicmVhazsKKwkJfQorCisJCS8vIG5vZGUgcHJvY2Vzc2VzIGlzb2Nocm9ub3VzIGFuZCBhc3luY2hyb25vdXMgZnJhbWVzCisJY2FzZSBrRXBsTm10TXNQcmVPcGVyYXRpb25hbDI6CisJCXsKKwkJCWJyZWFrOworCQl9CisKKwkJLy8gbm9kZSBzaG91bGQgYmUgY29uZmlndXJlZCB1bmQgYXBwbGljYXRpb24gaXMgcmVhZHkKKwljYXNlIGtFcGxObXRNc1JlYWR5VG9PcGVyYXRlOgorCQl7CisJCQlicmVhazsKKwkJfQorCisJCS8vIG5vcm1hbCB3b3JrIHN0YXRlCisJY2FzZSBrRXBsTm10TXNPcGVyYXRpb25hbDoKKwkJeworCQkJYnJlYWs7CisJCX0KKworCQkvLyBubyBFUEwgY3ljbGUKKwkJLy8gLT4gbm9ybWFsIGV0aGVybmV0IGNvbW11bmljYXRpb24KKwljYXNlIGtFcGxObXRNc0Jhc2ljRXRoZXJuZXQ6CisJCXsKKwkJCWJyZWFrOworCQl9CisKKwlkZWZhdWx0OgorCQl7CisJCQlUUkFDRTAKKwkJCSAgICAoIkVwbEFwaUNiTm10U3RhdGVDaGFuZ2UoKTogdW5oYW5kbGVkIE5NVCBzdGF0ZVxuIik7CisJCX0KKwl9CisKKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX0xFRFUpKSAhPSAwKQorCS8vIGZvcndhcmQgZXZlbnQgdG8gTGVkIG1vZHVsZQorCVJldCA9IEVwbExlZHVDYk5tdFN0YXRlQ2hhbmdlKE5tdFN0YXRlQ2hhbmdlX3ApOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKyNlbmRpZgorCisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVF9NTikpICE9IDApCisJLy8gZm9yd2FyZCBldmVudCB0byBObXRNbiBtb2R1bGUKKwlSZXQgPSBFcGxObXRNbnVDYk5tdFN0YXRlQ2hhbmdlKE5tdFN0YXRlQ2hhbmdlX3ApOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKyNlbmRpZgorCisJLy8gY2FsbCB1c2VyIGNhbGxiYWNrCisJRXZlbnRBcmcubV9ObXRTdGF0ZUNoYW5nZSA9IE5tdFN0YXRlQ2hhbmdlX3A7CisJUmV0ID0KKwkgICAgRXBsQXBpSW5zdGFuY2VfZy5tX0luaXRQYXJhbS4KKwkgICAgbV9wZm5DYkV2ZW50KGtFcGxBcGlFdmVudE5tdFN0YXRlQ2hhbmdlLCAmRXZlbnRBcmcsCisJCQkgRXBsQXBpSW5zdGFuY2VfZy5tX0luaXRQYXJhbS5tX3BFdmVudFVzZXJBcmcpOworCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbEFwaVVwZGF0ZURsbENvbmZpZworLy8KKy8vIERlc2NyaXB0aW9uOiB1cGRhdGUgY29uZmlndXJhdGlvbiBvZiBETEwKKy8vCisvLyBQYXJhbWV0ZXJzOiAgZlVwZGF0ZUlkZW50aXR5X3AgICAgICAgPSBUUlVFLCBpZiBpZGVudGl0eSBtdXN0IGJlIHVwZGF0ZWQKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB0RXBsS2VybmVsIFBVQkxJQyBFcGxBcGlVcGRhdGVEbGxDb25maWcoQk9PTCBmVXBkYXRlSWRlbnRpdHlfcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCXRFcGxEbGxDb25maWdQYXJhbSBEbGxDb25maWdQYXJhbTsKKwl0RXBsRGxsSWRlbnRQYXJhbSBEbGxJZGVudFBhcmFtOworCXRFcGxPYmRTaXplIE9iZFNpemU7CisJV09SRCB3VGVtcDsKKwlCWVRFIGJUZW1wOworCisJLy8gY29uZmlndXJlIERsbAorCUVQTF9NRU1TRVQoJkRsbENvbmZpZ1BhcmFtLCAwLCBzaXplb2YoRGxsQ29uZmlnUGFyYW0pKTsKKwlEbGxDb25maWdQYXJhbS5tX3VpTm9kZUlkID0gRXBsT2JkR2V0Tm9kZUlkKCk7CisKKwkvLyBDeWNsZSBMZW5ndGggKDB4MTAwNjogTk1UX0N5Y2xlTGVuX1UzMikgaW4gW3VzXQorCU9iZFNpemUgPSA0OworCVJldCA9CisJICAgIEVwbE9iZFJlYWRFbnRyeSgweDEwMDYsIDAsICZEbGxDb25maWdQYXJhbS5tX2R3Q3ljbGVMZW4sICZPYmRTaXplKTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gMHgxRjgyOiBOTVRfRmVhdHVyZUZsYWdzX1UzMgorCU9iZFNpemUgPSA0OworCVJldCA9CisJICAgIEVwbE9iZFJlYWRFbnRyeSgweDFGODIsIDAsICZEbGxDb25maWdQYXJhbS5tX2R3RmVhdHVyZUZsYWdzLAorCQkJICAgICZPYmRTaXplKTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gZC5rLiBUaGVyZSBpcyBubyBkZXBlbmRhbmNlIGJldHdlZW4gRmVhdHVyZUZsYWdzIGFuZCBhc3luYy1vbmx5IENOCisJRGxsQ29uZmlnUGFyYW0ubV9mQXN5bmNPbmx5ID0gRXBsQXBpSW5zdGFuY2VfZy5tX0luaXRQYXJhbS5tX2ZBc3luY09ubHk7CisKKwkvLyAweDFDMTQ6IERMTF9Mb3NzT2ZGcmFtZVRvbGVyYW5jZV9VMzIgaW4gW25zXQorCU9iZFNpemUgPSA0OworCVJldCA9CisJICAgIEVwbE9iZFJlYWRFbnRyeSgweDFDMTQsIDAsICZEbGxDb25maWdQYXJhbS5tX2R3TG9zc09mRnJhbWVUb2xlcmFuY2UsCisJCQkgICAgJk9iZFNpemUpOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKwkvLyAweDFGOTg6IE5NVF9DeWNsZVRpbWluZ19SRUMKKwkvLyAweDFGOTguMTogSXNvY2hyVHhNYXhQYXlsb2FkX1UxNgorCU9iZFNpemUgPSAyOworCVJldCA9IEVwbE9iZFJlYWRFbnRyeSgweDFGOTgsIDEsICZ3VGVtcCwgJk9iZFNpemUpOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKwlEbGxDb25maWdQYXJhbS5tX3VpSXNvY2hyVHhNYXhQYXlsb2FkID0gd1RlbXA7CisKKwkvLyAweDFGOTguMjogSXNvY2hyUnhNYXhQYXlsb2FkX1UxNgorCU9iZFNpemUgPSAyOworCVJldCA9IEVwbE9iZFJlYWRFbnRyeSgweDFGOTgsIDIsICZ3VGVtcCwgJk9iZFNpemUpOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKwlEbGxDb25maWdQYXJhbS5tX3VpSXNvY2hyUnhNYXhQYXlsb2FkID0gd1RlbXA7CisKKwkvLyAweDFGOTguMzogUFJlc01heExhdGVuY3lfVTMyCisJT2JkU2l6ZSA9IDQ7CisJUmV0ID0KKwkgICAgRXBsT2JkUmVhZEVudHJ5KDB4MUY5OCwgMywgJkRsbENvbmZpZ1BhcmFtLm1fZHdQcmVzTWF4TGF0ZW5jeSwKKwkJCSAgICAmT2JkU2l6ZSk7CisJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQlnb3RvIEV4aXQ7CisJfQorCS8vIDB4MUY5OC40OiBQUmVxQWN0UGF5bG9hZExpbWl0X1UxNgorCU9iZFNpemUgPSAyOworCVJldCA9IEVwbE9iZFJlYWRFbnRyeSgweDFGOTgsIDQsICZ3VGVtcCwgJk9iZFNpemUpOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKwlEbGxDb25maWdQYXJhbS5tX3VpUHJlcUFjdFBheWxvYWRMaW1pdCA9IHdUZW1wOworCisJLy8gMHgxRjk4LjU6IFBSZXNBY3RQYXlsb2FkTGltaXRfVTE2CisJT2JkU2l6ZSA9IDI7CisJUmV0ID0gRXBsT2JkUmVhZEVudHJ5KDB4MUY5OCwgNSwgJndUZW1wLCAmT2JkU2l6ZSk7CisJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQlnb3RvIEV4aXQ7CisJfQorCURsbENvbmZpZ1BhcmFtLm1fdWlQcmVzQWN0UGF5bG9hZExpbWl0ID0gd1RlbXA7CisKKwkvLyAweDFGOTguNjogQVNuZE1heExhdGVuY3lfVTMyCisJT2JkU2l6ZSA9IDQ7CisJUmV0ID0KKwkgICAgRXBsT2JkUmVhZEVudHJ5KDB4MUY5OCwgNiwgJkRsbENvbmZpZ1BhcmFtLm1fZHdBc25kTWF4TGF0ZW5jeSwKKwkJCSAgICAmT2JkU2l6ZSk7CisJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQlnb3RvIEV4aXQ7CisJfQorCS8vIDB4MUY5OC43OiBNdWx0aXBsQ3ljbGVDbnRfVTgKKwlPYmRTaXplID0gMTsKKwlSZXQgPSBFcGxPYmRSZWFkRW50cnkoMHgxRjk4LCA3LCAmYlRlbXAsICZPYmRTaXplKTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCWdvdG8gRXhpdDsKKwl9CisJRGxsQ29uZmlnUGFyYW0ubV91aU11bHRpcGxDeWNsZUNudCA9IGJUZW1wOworCisJLy8gMHgxRjk4Ljg6IEFzeW5jTVRVX1UxNgorCU9iZFNpemUgPSAyOworCVJldCA9IEVwbE9iZFJlYWRFbnRyeSgweDFGOTgsIDgsICZ3VGVtcCwgJk9iZFNpemUpOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKwlEbGxDb25maWdQYXJhbS5tX3VpQXN5bmNNdHUgPSB3VGVtcDsKKworCS8vICQkJCBQcmVzY2FsZXIKKworI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRfTU4pKSAhPSAwKQorCS8vIDB4MUY4QS4xOiBXYWl0U29DUFJlcV9VMzIgaW4gW25zXQorCU9iZFNpemUgPSA0OworCVJldCA9CisJICAgIEVwbE9iZFJlYWRFbnRyeSgweDFGOEEsIDEsICZEbGxDb25maWdQYXJhbS5tX2R3V2FpdFNvY1ByZXEsCisJCQkgICAgJk9iZFNpemUpOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKwkvLyAweDFGOEEuMjogQXN5bmNTbG90VGltZW91dF9VMzIgaW4gW25zXSAob3B0aW9uYWwpCisJT2JkU2l6ZSA9IDQ7CisJUmV0ID0KKwkgICAgRXBsT2JkUmVhZEVudHJ5KDB4MUY4QSwgMiwgJkRsbENvbmZpZ1BhcmFtLm1fZHdBc3luY1Nsb3RUaW1lb3V0LAorCQkJICAgICZPYmRTaXplKTsKKy8qICAgIGlmKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkKKyAgICB7CisgICAgICAgIGdvdG8gRXhpdDsKKyAgICB9Ki8KKyNlbmRpZgorCisJRGxsQ29uZmlnUGFyYW0ubV91aVNpemVPZlN0cnVjdCA9IHNpemVvZihEbGxDb25maWdQYXJhbSk7CisJUmV0ID0gRXBsRGxsa0NvbmZpZygmRGxsQ29uZmlnUGFyYW0pOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKworCWlmIChmVXBkYXRlSWRlbnRpdHlfcCAhPSBGQUxTRSkgeworCQkvLyBjb25maWd1cmUgSWRlbnRpdHkKKwkJRVBMX01FTVNFVCgmRGxsSWRlbnRQYXJhbSwgMCwgc2l6ZW9mKERsbElkZW50UGFyYW0pKTsKKwkJT2JkU2l6ZSA9IDQ7CisJCVJldCA9CisJCSAgICBFcGxPYmRSZWFkRW50cnkoMHgxMDAwLCAwLCAmRGxsSWRlbnRQYXJhbS5tX2R3RGV2aWNlVHlwZSwKKwkJCQkgICAgJk9iZFNpemUpOworCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQlnb3RvIEV4aXQ7CisJCX0KKworCQlPYmRTaXplID0gNDsKKwkJUmV0ID0KKwkJICAgIEVwbE9iZFJlYWRFbnRyeSgweDEwMTgsIDEsICZEbGxJZGVudFBhcmFtLm1fZHdWZW5kb3JJZCwKKwkJCQkgICAgJk9iZFNpemUpOworCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQlnb3RvIEV4aXQ7CisJCX0KKwkJT2JkU2l6ZSA9IDQ7CisJCVJldCA9CisJCSAgICBFcGxPYmRSZWFkRW50cnkoMHgxMDE4LCAyLCAmRGxsSWRlbnRQYXJhbS5tX2R3UHJvZHVjdENvZGUsCisJCQkJICAgICZPYmRTaXplKTsKKwkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJZ290byBFeGl0OworCQl9CisJCU9iZFNpemUgPSA0OworCQlSZXQgPQorCQkgICAgRXBsT2JkUmVhZEVudHJ5KDB4MTAxOCwgMywKKwkJCQkgICAgJkRsbElkZW50UGFyYW0ubV9kd1JldmlzaW9uTnVtYmVyLAorCQkJCSAgICAmT2JkU2l6ZSk7CisJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCWdvdG8gRXhpdDsKKwkJfQorCQlPYmRTaXplID0gNDsKKwkJUmV0ID0KKwkJICAgIEVwbE9iZFJlYWRFbnRyeSgweDEwMTgsIDQsICZEbGxJZGVudFBhcmFtLm1fZHdTZXJpYWxOdW1iZXIsCisJCQkJICAgICZPYmRTaXplKTsKKwkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJZ290byBFeGl0OworCQl9CisKKwkJRGxsSWRlbnRQYXJhbS5tX2R3SXBBZGRyZXNzID0KKwkJICAgIEVwbEFwaUluc3RhbmNlX2cubV9Jbml0UGFyYW0ubV9kd0lwQWRkcmVzczsKKwkJRGxsSWRlbnRQYXJhbS5tX2R3U3VibmV0TWFzayA9CisJCSAgICBFcGxBcGlJbnN0YW5jZV9nLm1fSW5pdFBhcmFtLm1fZHdTdWJuZXRNYXNrOworCQlFUExfTUVNQ1BZKERsbElkZW50UGFyYW0ubV9zSG9zdG5hbWUsCisJCQkgICBFcGxBcGlJbnN0YW5jZV9nLm1fSW5pdFBhcmFtLm1fc0hvc3RuYW1lLAorCQkJICAgc2l6ZW9mKERsbElkZW50UGFyYW0ubV9zSG9zdG5hbWUpKTsKKworCQlPYmRTaXplID0gNDsKKwkJUmV0ID0KKwkJICAgIEVwbE9iZFJlYWRFbnRyeSgweDEwMjAsIDEsCisJCQkJICAgICZEbGxJZGVudFBhcmFtLm1fZHdWZXJpZnlDb25maWd1cmF0aW9uRGF0ZSwKKwkJCQkgICAgJk9iZFNpemUpOworCQkvLyBpZ25vcmUgYW55IGVycm9yLCBiZWNhdXNlIHRoaXMgb2JqZWN0IGlzIG9wdGlvbmFsCisKKwkJT2JkU2l6ZSA9IDQ7CisJCVJldCA9CisJCSAgICBFcGxPYmRSZWFkRW50cnkoMHgxMDIwLCAyLAorCQkJCSAgICAmRGxsSWRlbnRQYXJhbS5tX2R3VmVyaWZ5Q29uZmlndXJhdGlvblRpbWUsCisJCQkJICAgICZPYmRTaXplKTsKKwkJLy8gaWdub3JlIGFueSBlcnJvciwgYmVjYXVzZSB0aGlzIG9iamVjdCBpcyBvcHRpb25hbAorCisJCS8vICQkJCBkLmsuOiBmaWxsIHJlc3Qgb2YgaWRlbnQgc3RydWN0dXJlCisKKwkJRGxsSWRlbnRQYXJhbS5tX3VpU2l6ZU9mU3RydWN0ID0gc2l6ZW9mKERsbElkZW50UGFyYW0pOworCQlSZXQgPSBFcGxEbGxrU2V0SWRlbnRpdHkoJkRsbElkZW50UGFyYW0pOworCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQlnb3RvIEV4aXQ7CisJCX0KKwl9CisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsQXBpVXBkYXRlT2JkCisvLworLy8gRGVzY3JpcHRpb246IHVwZGF0ZSBPRCBmcm9tIGluaXQgcGFyYW0KKy8vCisvLyBQYXJhbWV0ZXJzOiAgKG5vbmUpCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdEVwbEtlcm5lbCBQVUJMSUMgRXBsQXBpVXBkYXRlT2JkKHZvaWQpCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwlXT1JEIHdUZW1wOworCUJZVEUgYlRlbXA7CisKKwkvLyBzZXQgbm9kZSBpZCBpbiBPRAorCVJldCA9IEVwbE9iZFNldE5vZGVJZChFcGxBcGlJbnN0YW5jZV9nLm1fSW5pdFBhcmFtLm1fdWlOb2RlSWQsCS8vIG5vZGUgaWQKKwkJCSAgICAgIGtFcGxPYmROb2RlSWRIYXJkd2FyZSk7CS8vIHNldCBieSBoYXJkd2FyZQorCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKworCWlmIChFcGxBcGlJbnN0YW5jZV9nLm1fSW5pdFBhcmFtLm1fZHdDeWNsZUxlbiAhPSAtMSkgeworCQlSZXQgPQorCQkgICAgRXBsT2JkV3JpdGVFbnRyeSgweDEwMDYsIDAsCisJCQkJICAgICAmRXBsQXBpSW5zdGFuY2VfZy5tX0luaXRQYXJhbS5tX2R3Q3ljbGVMZW4sCisJCQkJICAgICA0KTsKKy8qICAgIGlmKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkKKyAgICB7CisgICAgICAgIGdvdG8gRXhpdDsKKyAgICB9Ki8KKwl9CisKKwlpZiAoRXBsQXBpSW5zdGFuY2VfZy5tX0luaXRQYXJhbS5tX2R3TG9zc09mRnJhbWVUb2xlcmFuY2UgIT0gLTEpIHsKKwkJUmV0ID0KKwkJICAgIEVwbE9iZFdyaXRlRW50cnkoMHgxQzE0LCAwLAorCQkJCSAgICAgJkVwbEFwaUluc3RhbmNlX2cubV9Jbml0UGFyYW0uCisJCQkJICAgICBtX2R3TG9zc09mRnJhbWVUb2xlcmFuY2UsIDQpOworCQkvKiAgICAgICAgaWYoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKQorCQkgICB7CisJCSAgIGdvdG8gRXhpdDsKKwkJICAgfSAqLworCX0KKwkvLyBkLmsuIFRoZXJlIGlzIG5vIGRlcGVuZGFuY2UgYmV0d2VlbiBGZWF0dXJlRmxhZ3MgYW5kIGFzeW5jLW9ubHkgQ04uCisJaWYgKEVwbEFwaUluc3RhbmNlX2cubV9Jbml0UGFyYW0ubV9kd0ZlYXR1cmVGbGFncyAhPSAtMSkgeworCQlSZXQgPQorCQkgICAgRXBsT2JkV3JpdGVFbnRyeSgweDFGODIsIDAsCisJCQkJICAgICAmRXBsQXBpSW5zdGFuY2VfZy5tX0luaXRQYXJhbS4KKwkJCQkgICAgIG1fZHdGZWF0dXJlRmxhZ3MsIDQpOworCQkvKiAgICBpZihSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpCisJCSAgIHsKKwkJICAgZ290byBFeGl0OworCQkgICB9ICovCisJfQorCisJd1RlbXAgPSAoV09SRCkgRXBsQXBpSW5zdGFuY2VfZy5tX0luaXRQYXJhbS5tX3VpSXNvY2hyVHhNYXhQYXlsb2FkOworCVJldCA9IEVwbE9iZFdyaXRlRW50cnkoMHgxRjk4LCAxLCAmd1RlbXAsIDIpOworLyogICAgaWYoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKQorICAgIHsKKyAgICAgICAgZ290byBFeGl0OworICAgIH0qLworCisJd1RlbXAgPSAoV09SRCkgRXBsQXBpSW5zdGFuY2VfZy5tX0luaXRQYXJhbS5tX3VpSXNvY2hyUnhNYXhQYXlsb2FkOworCVJldCA9IEVwbE9iZFdyaXRlRW50cnkoMHgxRjk4LCAyLCAmd1RlbXAsIDIpOworLyogICAgaWYoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKQorICAgIHsKKyAgICAgICAgZ290byBFeGl0OworICAgIH0qLworCisJUmV0ID0KKwkgICAgRXBsT2JkV3JpdGVFbnRyeSgweDFGOTgsIDMsCisJCQkgICAgICZFcGxBcGlJbnN0YW5jZV9nLm1fSW5pdFBhcmFtLm1fZHdQcmVzTWF4TGF0ZW5jeSwKKwkJCSAgICAgNCk7CisvKiAgICBpZihSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpCisgICAgeworICAgICAgICBnb3RvIEV4aXQ7CisgICAgfSovCisKKwlpZiAoRXBsQXBpSW5zdGFuY2VfZy5tX0luaXRQYXJhbS5tX3VpUHJlcUFjdFBheWxvYWRMaW1pdCA8PQorCSAgICBFUExfQ19ETExfSVNPQ0hSX01BWF9QQVlMKSB7CisJCXdUZW1wID0KKwkJICAgIChXT1JEKSBFcGxBcGlJbnN0YW5jZV9nLm1fSW5pdFBhcmFtLm1fdWlQcmVxQWN0UGF5bG9hZExpbWl0OworCQlSZXQgPSBFcGxPYmRXcml0ZUVudHJ5KDB4MUY5OCwgNCwgJndUZW1wLCAyKTsKKy8qICAgIGlmKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkKKyAgICB7CisgICAgICAgIGdvdG8gRXhpdDsKKyAgICB9Ki8KKwl9CisKKwlpZiAoRXBsQXBpSW5zdGFuY2VfZy5tX0luaXRQYXJhbS5tX3VpUHJlc0FjdFBheWxvYWRMaW1pdCA8PQorCSAgICBFUExfQ19ETExfSVNPQ0hSX01BWF9QQVlMKSB7CisJCXdUZW1wID0KKwkJICAgIChXT1JEKSBFcGxBcGlJbnN0YW5jZV9nLm1fSW5pdFBhcmFtLm1fdWlQcmVzQWN0UGF5bG9hZExpbWl0OworCQlSZXQgPSBFcGxPYmRXcml0ZUVudHJ5KDB4MUY5OCwgNSwgJndUZW1wLCAyKTsKKy8qICAgIGlmKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkKKyAgICB7CisgICAgICAgIGdvdG8gRXhpdDsKKyAgICB9Ki8KKwl9CisKKwlSZXQgPQorCSAgICBFcGxPYmRXcml0ZUVudHJ5KDB4MUY5OCwgNiwKKwkJCSAgICAgJkVwbEFwaUluc3RhbmNlX2cubV9Jbml0UGFyYW0ubV9kd0FzbmRNYXhMYXRlbmN5LAorCQkJICAgICA0KTsKKy8qICAgIGlmKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkKKyAgICB7CisgICAgICAgIGdvdG8gRXhpdDsKKyAgICB9Ki8KKworCWlmIChFcGxBcGlJbnN0YW5jZV9nLm1fSW5pdFBhcmFtLm1fdWlNdWx0aXBsQ3ljbGVDbnQgPD0gMHhGRikgeworCQliVGVtcCA9IChCWVRFKSBFcGxBcGlJbnN0YW5jZV9nLm1fSW5pdFBhcmFtLm1fdWlNdWx0aXBsQ3ljbGVDbnQ7CisJCVJldCA9IEVwbE9iZFdyaXRlRW50cnkoMHgxRjk4LCA3LCAmYlRlbXAsIDEpOworLyogICAgaWYoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKQorICAgIHsKKyAgICAgICAgZ290byBFeGl0OworICAgIH0qLworCX0KKworCWlmIChFcGxBcGlJbnN0YW5jZV9nLm1fSW5pdFBhcmFtLm1fdWlBc3luY010dSA8PQorCSAgICBFUExfQ19ETExfTUFYX0FTWU5DX01UVSkgeworCQl3VGVtcCA9IChXT1JEKSBFcGxBcGlJbnN0YW5jZV9nLm1fSW5pdFBhcmFtLm1fdWlBc3luY010dTsKKwkJUmV0ID0gRXBsT2JkV3JpdGVFbnRyeSgweDFGOTgsIDgsICZ3VGVtcCwgMik7CisvKiAgICBpZihSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpCisgICAgeworICAgICAgICBnb3RvIEV4aXQ7CisgICAgfSovCisJfQorCisJaWYgKEVwbEFwaUluc3RhbmNlX2cubV9Jbml0UGFyYW0ubV91aVByZXNjYWxlciA8PSAxMDAwKSB7CisJCXdUZW1wID0gKFdPUkQpIEVwbEFwaUluc3RhbmNlX2cubV9Jbml0UGFyYW0ubV91aVByZXNjYWxlcjsKKwkJUmV0ID0gRXBsT2JkV3JpdGVFbnRyeSgweDFGOTgsIDksICZ3VGVtcCwgMik7CisJCS8vIGlnbm9yZSByZXR1cm4gY29kZQorCQlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwl9CisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVF9NTikpICE9IDApCisJaWYgKEVwbEFwaUluc3RhbmNlX2cubV9Jbml0UGFyYW0ubV9kd1dhaXRTb2NQcmVxICE9IC0xKSB7CisJCVJldCA9CisJCSAgICBFcGxPYmRXcml0ZUVudHJ5KDB4MUY4QSwgMSwKKwkJCQkgICAgICZFcGxBcGlJbnN0YW5jZV9nLm1fSW5pdFBhcmFtLgorCQkJCSAgICAgbV9kd1dhaXRTb2NQcmVxLCA0KTsKKwkJLyogICAgICAgIGlmKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkKKwkJICAgeworCQkgICBnb3RvIEV4aXQ7CisJCSAgIH0gKi8KKwl9CisKKwlpZiAoKEVwbEFwaUluc3RhbmNlX2cubV9Jbml0UGFyYW0ubV9kd0FzeW5jU2xvdFRpbWVvdXQgIT0gMCkKKwkgICAgJiYgKEVwbEFwaUluc3RhbmNlX2cubV9Jbml0UGFyYW0ubV9kd0FzeW5jU2xvdFRpbWVvdXQgIT0gLTEpKSB7CisJCVJldCA9CisJCSAgICBFcGxPYmRXcml0ZUVudHJ5KDB4MUY4QSwgMiwKKwkJCQkgICAgICZFcGxBcGlJbnN0YW5jZV9nLm1fSW5pdFBhcmFtLgorCQkJCSAgICAgbV9kd0FzeW5jU2xvdFRpbWVvdXQsIDQpOworCQkvKiAgICAgICAgaWYoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKQorCQkgICB7CisJCSAgIGdvdG8gRXhpdDsKKwkJICAgfSAqLworCX0KKyNlbmRpZgorCisJLy8gY29uZmlndXJlIElkZW50aXR5CisJaWYgKEVwbEFwaUluc3RhbmNlX2cubV9Jbml0UGFyYW0ubV9kd0RldmljZVR5cGUgIT0gLTEpIHsKKwkJUmV0ID0KKwkJICAgIEVwbE9iZFdyaXRlRW50cnkoMHgxMDAwLCAwLAorCQkJCSAgICAgJkVwbEFwaUluc3RhbmNlX2cubV9Jbml0UGFyYW0uCisJCQkJICAgICBtX2R3RGV2aWNlVHlwZSwgNCk7CisvKiAgICAgICAgaWYoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIEV4aXQ7CisgICAgICAgIH0qLworCX0KKworCWlmIChFcGxBcGlJbnN0YW5jZV9nLm1fSW5pdFBhcmFtLm1fZHdWZW5kb3JJZCAhPSAtMSkgeworCQlSZXQgPQorCQkgICAgRXBsT2JkV3JpdGVFbnRyeSgweDEwMTgsIDEsCisJCQkJICAgICAmRXBsQXBpSW5zdGFuY2VfZy5tX0luaXRQYXJhbS5tX2R3VmVuZG9ySWQsCisJCQkJICAgICA0KTsKKy8qICAgICAgICBpZihSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gRXhpdDsKKyAgICAgICAgfSovCisJfQorCisJaWYgKEVwbEFwaUluc3RhbmNlX2cubV9Jbml0UGFyYW0ubV9kd1Byb2R1Y3RDb2RlICE9IC0xKSB7CisJCVJldCA9CisJCSAgICBFcGxPYmRXcml0ZUVudHJ5KDB4MTAxOCwgMiwKKwkJCQkgICAgICZFcGxBcGlJbnN0YW5jZV9nLm1fSW5pdFBhcmFtLgorCQkJCSAgICAgbV9kd1Byb2R1Y3RDb2RlLCA0KTsKKy8qICAgICAgICBpZihSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gRXhpdDsKKyAgICAgICAgfSovCisJfQorCisJaWYgKEVwbEFwaUluc3RhbmNlX2cubV9Jbml0UGFyYW0ubV9kd1JldmlzaW9uTnVtYmVyICE9IC0xKSB7CisJCVJldCA9CisJCSAgICBFcGxPYmRXcml0ZUVudHJ5KDB4MTAxOCwgMywKKwkJCQkgICAgICZFcGxBcGlJbnN0YW5jZV9nLm1fSW5pdFBhcmFtLgorCQkJCSAgICAgbV9kd1JldmlzaW9uTnVtYmVyLCA0KTsKKy8qICAgICAgICBpZihSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gRXhpdDsKKyAgICAgICAgfSovCisJfQorCisJaWYgKEVwbEFwaUluc3RhbmNlX2cubV9Jbml0UGFyYW0ubV9kd1NlcmlhbE51bWJlciAhPSAtMSkgeworCQlSZXQgPQorCQkgICAgRXBsT2JkV3JpdGVFbnRyeSgweDEwMTgsIDQsCisJCQkJICAgICAmRXBsQXBpSW5zdGFuY2VfZy5tX0luaXRQYXJhbS4KKwkJCQkgICAgIG1fZHdTZXJpYWxOdW1iZXIsIDQpOworLyogICAgICAgIGlmKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBFeGl0OworICAgICAgICB9Ki8KKwl9CisKKwlpZiAoRXBsQXBpSW5zdGFuY2VfZy5tX0luaXRQYXJhbS5tX3BzekRldk5hbWUgIT0gTlVMTCkgeworCQkvLyB3cml0ZSBEZXZpY2UgTmFtZSAoMHgxMDA4KQorCQlSZXQgPQorCQkgICAgRXBsT2JkV3JpdGVFbnRyeSgweDEwMDgsIDAsCisJCQkJICAgICAodm9pZCBHRU5FUklDICopRXBsQXBpSW5zdGFuY2VfZy4KKwkJCQkgICAgIG1fSW5pdFBhcmFtLm1fcHN6RGV2TmFtZSwKKwkJCQkgICAgICh0RXBsT2JkU2l6ZSkgc3RybGVuKEVwbEFwaUluc3RhbmNlX2cuCisJCQkJCQkJICBtX0luaXRQYXJhbS4KKwkJCQkJCQkgIG1fcHN6RGV2TmFtZSkpOworLyogICAgICAgIGlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gRXhpdDsKKyAgICAgICAgfSovCisJfQorCisJaWYgKEVwbEFwaUluc3RhbmNlX2cubV9Jbml0UGFyYW0ubV9wc3pId1ZlcnNpb24gIT0gTlVMTCkgeworCQkvLyB3cml0ZSBIYXJkd2FyZSB2ZXJzaW9uICgweDEwMDkpCisJCVJldCA9CisJCSAgICBFcGxPYmRXcml0ZUVudHJ5KDB4MTAwOSwgMCwKKwkJCQkgICAgICh2b2lkIEdFTkVSSUMgKilFcGxBcGlJbnN0YW5jZV9nLgorCQkJCSAgICAgbV9Jbml0UGFyYW0ubV9wc3pId1ZlcnNpb24sCisJCQkJICAgICAodEVwbE9iZFNpemUpIHN0cmxlbihFcGxBcGlJbnN0YW5jZV9nLgorCQkJCQkJCSAgbV9Jbml0UGFyYW0uCisJCQkJCQkJICBtX3Bzekh3VmVyc2lvbikpOworLyogICAgICAgIGlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gRXhpdDsKKyAgICAgICAgfSovCisJfQorCisJaWYgKEVwbEFwaUluc3RhbmNlX2cubV9Jbml0UGFyYW0ubV9wc3pTd1ZlcnNpb24gIT0gTlVMTCkgeworCQkvLyB3cml0ZSBTb2Z0d2FyZSB2ZXJzaW9uICgweDEwMEEpCisJCVJldCA9CisJCSAgICBFcGxPYmRXcml0ZUVudHJ5KDB4MTAwQSwgMCwKKwkJCQkgICAgICh2b2lkIEdFTkVSSUMgKilFcGxBcGlJbnN0YW5jZV9nLgorCQkJCSAgICAgbV9Jbml0UGFyYW0ubV9wc3pTd1ZlcnNpb24sCisJCQkJICAgICAodEVwbE9iZFNpemUpIHN0cmxlbihFcGxBcGlJbnN0YW5jZV9nLgorCQkJCQkJCSAgbV9Jbml0UGFyYW0uCisJCQkJCQkJICBtX3BzelN3VmVyc2lvbikpOworLyogICAgICAgIGlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gRXhpdDsKKyAgICAgICAgfSovCisJfQorCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbEFwaUNiU2RvQ29uCisvLworLy8gRGVzY3JpcHRpb246IGNhbGxiYWNrIGZ1bmN0aW9uIGZvciBTRE8gdHJhbnNmZXJzCisvLworLy8gUGFyYW1ldGVyczogIHBTZG9Db21GaW5pc2hlZF9wICAgICAgID0gU0RPIHBhcmFtZXRlcgorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfU0RPQykpICE9IDApCitzdGF0aWMgdEVwbEtlcm5lbCBQVUJMSUMgRXBsQXBpQ2JTZG9Db24odEVwbFNkb0NvbUZpbmlzaGVkICogcFNkb0NvbUZpbmlzaGVkX3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisJdEVwbEFwaUV2ZW50QXJnIEV2ZW50QXJnOworCisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwkvLyBjYWxsIHVzZXIgY2FsbGJhY2sKKwlFdmVudEFyZy5tX1NkbyA9ICpwU2RvQ29tRmluaXNoZWRfcDsKKwlSZXQgPSBFcGxBcGlJbnN0YW5jZV9nLm1fSW5pdFBhcmFtLm1fcGZuQ2JFdmVudChrRXBsQXBpRXZlbnRTZG8sCisJCQkJCQkJJkV2ZW50QXJnLAorCQkJCQkJCUVwbEFwaUluc3RhbmNlX2cuCisJCQkJCQkJbV9Jbml0UGFyYW0uCisJCQkJCQkJbV9wRXZlbnRVc2VyQXJnKTsKKworCXJldHVybiBSZXQ7CisKK30KKyNlbmRpZgorCisjaWYgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRfTU4pKSAhPSAwKQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxBcGlDYk5vZGVFdmVudAorLy8KKy8vIERlc2NyaXB0aW9uOiBjYWxsYmFjayBmdW5jdGlvbiBmb3Igbm9kZSBldmVudHMKKy8vCisvLyBQYXJhbWV0ZXJzOiAgdWlOb2RlSWRfcCAgICAgICAgICAgICAgPSBub2RlIElEIG9mIHRoZSBDTgorLy8gICAgICAgICAgICAgIE5vZGVFdmVudF9wICAgICAgICAgICAgID0gZXZlbnQgZnJvbSB0aGUgc3BlY2lmaWVkIENOCisvLyAgICAgICAgICAgICAgTm10U3RhdGVfcCAgICAgICAgICAgICAgPSBjdXJyZW50IE5NVCBzdGF0ZSBvZiB0aGUgQ04KKy8vICAgICAgICAgICAgICB3RXJyb3JDb2RlX3AgICAgICAgICAgICA9IEVQTCBlcnJvciBjb2RlIGlmIE5vZGVFdmVudF9wPT1rRXBsTm10Tm9kZUV2ZW50RXJyb3IKKy8vICAgICAgICAgICAgICBmTWFuZGF0b3J5X3AgICAgICAgICAgICA9IGZsYWcgaWYgQ04gaXMgbWFuZGF0b3J5CisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdEVwbEtlcm5lbCBQVUJMSUMgRXBsQXBpQ2JOb2RlRXZlbnQodW5zaWduZWQgaW50IHVpTm9kZUlkX3AsCisJCQkJCSAgIHRFcGxObXROb2RlRXZlbnQgTm9kZUV2ZW50X3AsCisJCQkJCSAgIHRFcGxObXRTdGF0ZSBObXRTdGF0ZV9wLAorCQkJCQkgICBXT1JEIHdFcnJvckNvZGVfcCwgQk9PTCBmTWFuZGF0b3J5X3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisJdEVwbEFwaUV2ZW50QXJnIEV2ZW50QXJnOworCisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwkvLyBjYWxsIHVzZXIgY2FsbGJhY2sKKwlFdmVudEFyZy5tX05vZGUubV91aU5vZGVJZCA9IHVpTm9kZUlkX3A7CisJRXZlbnRBcmcubV9Ob2RlLm1fTm9kZUV2ZW50ID0gTm9kZUV2ZW50X3A7CisJRXZlbnRBcmcubV9Ob2RlLm1fTm10U3RhdGUgPSBObXRTdGF0ZV9wOworCUV2ZW50QXJnLm1fTm9kZS5tX3dFcnJvckNvZGUgPSB3RXJyb3JDb2RlX3A7CisJRXZlbnRBcmcubV9Ob2RlLm1fZk1hbmRhdG9yeSA9IGZNYW5kYXRvcnlfcDsKKworCVJldCA9IEVwbEFwaUluc3RhbmNlX2cubV9Jbml0UGFyYW0ubV9wZm5DYkV2ZW50KGtFcGxBcGlFdmVudE5vZGUsCisJCQkJCQkJJkV2ZW50QXJnLAorCQkJCQkJCUVwbEFwaUluc3RhbmNlX2cuCisJCQkJCQkJbV9Jbml0UGFyYW0uCisJCQkJCQkJbV9wRXZlbnRVc2VyQXJnKTsKKworCXJldHVybiBSZXQ7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsQXBpQ2JCb290RXZlbnQKKy8vCisvLyBEZXNjcmlwdGlvbjogY2FsbGJhY2sgZnVuY3Rpb24gZm9yIGJvb3QgZXZlbnRzCisvLworLy8gUGFyYW1ldGVyczogIEJvb3RFdmVudF9wICAgICAgICAgICAgID0gZXZlbnQgZnJvbSB0aGUgYm9vdC11cCBwcm9jZXNzCisvLyAgICAgICAgICAgICAgTm10U3RhdGVfcCAgICAgICAgICAgICAgPSBjdXJyZW50IGxvY2FsIE5NVCBzdGF0ZQorLy8gICAgICAgICAgICAgIHdFcnJvckNvZGVfcCAgICAgICAgICAgID0gRVBMIGVycm9yIGNvZGUgaWYgQm9vdEV2ZW50X3A9PWtFcGxObXRCb290RXZlbnRFcnJvcgorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHRFcGxLZXJuZWwgUFVCTElDIEVwbEFwaUNiQm9vdEV2ZW50KHRFcGxObXRCb290RXZlbnQgQm9vdEV2ZW50X3AsCisJCQkJCSAgIHRFcGxObXRTdGF0ZSBObXRTdGF0ZV9wLAorCQkJCQkgICBXT1JEIHdFcnJvckNvZGVfcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKwl0RXBsQXBpRXZlbnRBcmcgRXZlbnRBcmc7CisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCS8vIGNhbGwgdXNlciBjYWxsYmFjaworCUV2ZW50QXJnLm1fQm9vdC5tX0Jvb3RFdmVudCA9IEJvb3RFdmVudF9wOworCUV2ZW50QXJnLm1fQm9vdC5tX05tdFN0YXRlID0gTm10U3RhdGVfcDsKKwlFdmVudEFyZy5tX0Jvb3QubV93RXJyb3JDb2RlID0gd0Vycm9yQ29kZV9wOworCisJUmV0ID0gRXBsQXBpSW5zdGFuY2VfZy5tX0luaXRQYXJhbS5tX3BmbkNiRXZlbnQoa0VwbEFwaUV2ZW50Qm9vdCwKKwkJCQkJCQkmRXZlbnRBcmcsCisJCQkJCQkJRXBsQXBpSW5zdGFuY2VfZy4KKwkJCQkJCQltX0luaXRQYXJhbS4KKwkJCQkJCQltX3BFdmVudFVzZXJBcmcpOworCisJcmV0dXJuIFJldDsKKworfQorCisjZW5kaWYgLy8gKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRfTU4pKSAhPSAwKQorCisjaWYgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9MRURVKSkgIT0gMCkKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsQXBpQ2JMZWRTdGF0ZUNoYW5nZQorLy8KKy8vIERlc2NyaXB0aW9uOiBjYWxsYmFjayBmdW5jdGlvbiBmb3IgTEVEIGNoYW5nZSBldmVudHMuCisvLworLy8gUGFyYW1ldGVyczogIExlZFR5cGVfcCAgICAgICA9IHR5cGUgb2YgTEVECisvLyAgICAgICAgICAgICAgZk9uX3AgICAgICAgICAgID0gc3RhdGUgb2YgTEVECisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICA9IGVycm9yY29kZQorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB0RXBsS2VybmVsIFBVQkxJQyBFcGxBcGlDYkxlZFN0YXRlQ2hhbmdlKHRFcGxMZWRUeXBlIExlZFR5cGVfcCwKKwkJCQkJCUJPT0wgZk9uX3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisJdEVwbEFwaUV2ZW50QXJnIEV2ZW50QXJnOworCisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwkvLyBjYWxsIHVzZXIgY2FsbGJhY2sKKwlFdmVudEFyZy5tX0xlZC5tX0xlZFR5cGUgPSBMZWRUeXBlX3A7CisJRXZlbnRBcmcubV9MZWQubV9mT24gPSBmT25fcDsKKworCVJldCA9IEVwbEFwaUluc3RhbmNlX2cubV9Jbml0UGFyYW0ubV9wZm5DYkV2ZW50KGtFcGxBcGlFdmVudExlZCwKKwkJCQkJCQkmRXZlbnRBcmcsCisJCQkJCQkJRXBsQXBpSW5zdGFuY2VfZy4KKwkJCQkJCQltX0luaXRQYXJhbS4KKwkJCQkJCQltX3BFdmVudFVzZXJBcmcpOworCisJcmV0dXJuIFJldDsKKworfQorCisjZW5kaWYKKworLy8gRU9GCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbEFwaUxpbnV4LmggYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbEFwaUxpbnV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTJjZDEyNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsQXBpTGludXguaApAQCAtMCwwICsxLDE0MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIGluY2x1ZGUgZmlsZSBmb3IgRVBMIEFQSSBsYXllciBmb3IgTGludXggKGtlcm5lbCBhbmQgdXNlciBzcGFjZSkKKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgICAgICAgICRSQ1NmaWxlOiBFcGxBcGlMaW51eC5oLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS41ICQgICREYXRlOiAyMDA4LzA4LzI1IDEyOjE3OjQxICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorICAgICAgICAgICAgICAgIEtFSUwgdVZpc2lvbiAyCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwNi8xMC8xMSBkLmsuOiAgIHN0YXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiwgdmVyc2lvbiAxLjAwCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX0VQTF9BUElfTElOVVhfSF8KKyNkZWZpbmUgX0VQTF9BUElfTElOVVhfSF8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvbnN0IGRlZmluZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNkZWZpbmUgRVBMTElOX0RFVl9OQU1FICAgICAiZXBsIgkvLyB1c2VkIGZvciAiL2RldiIgYW5kICIvcHJvYyIgZW50cnkKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBDb21tYW5kcyBmb3IgPGlvY3RsPgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2RlZmluZSBFUExMSU5fQ01EX0lOSVRJQUxJWkUgICAgICAgICAgICAgICAwCS8vIHVsQXJnX3AgfiB0RXBsQXBpSW5pdFBhcmFtKgorI2RlZmluZSBFUExMSU5fQ01EX1BJX0lOICAgICAgICAgICAgICAgICAgICAxCS8vIHVsQXJnX3AgfiB0RXBsQXBpUHJvY2Vzc0ltYWdlKgorI2RlZmluZSBFUExMSU5fQ01EX1BJX09VVCAgICAgICAgICAgICAgICAgICAyCS8vIHVsQXJnX3AgfiB0RXBsQXBpUHJvY2Vzc0ltYWdlKgorI2RlZmluZSBFUExMSU5fQ01EX1dSSVRFX09CSkVDVCAgICAgICAgICAgICAzCS8vIHVsQXJnX3AgfiB0RXBsTGluU2RvT2JqZWN0KgorI2RlZmluZSBFUExMSU5fQ01EX1JFQURfT0JKRUNUICAgICAgICAgICAgICA0CS8vIHVsQXJnX3AgfiB0RXBsTGluU2RvT2JqZWN0KgorI2RlZmluZSBFUExMSU5fQ01EX1dSSVRFX0xPQ0FMX09CSkVDVCAgICAgICA1CS8vIHVsQXJnX3AgfiB0RXBsTGluTG9jYWxPYmplY3QqCisjZGVmaW5lIEVQTExJTl9DTURfUkVBRF9MT0NBTF9PQkpFQ1QgICAgICAgIDYJLy8gdWxBcmdfcCB+IHRFcGxMaW5Mb2NhbE9iamVjdCoKKyNkZWZpbmUgRVBMTElOX0NNRF9GUkVFX1NET19DSEFOTkVMICAgICAgICAgNwkvLyB1bEFyZ19wIH4gdEVwbFNkb0NvbUNvbkhkbAorI2RlZmluZSBFUExMSU5fQ01EX05NVF9DT01NQU5EICAgICAgICAgICAgICA4CS8vIHVsQXJnX3AgfiB0RXBsTm10RXZlbnQKKyNkZWZpbmUgRVBMTElOX0NNRF9HRVRfRVZFTlQgICAgICAgICAgICAgICAgOQkvLyB1bEFyZ19wIH4gdEVwbExpbkV2ZW50KgorI2RlZmluZSBFUExMSU5fQ01EX01OX1RSSUdHRVJfU1RBVEVfQ0hBTkdFIDEwCS8vIHVsQXJnX3AgfiB0RXBsTGluTm9kZUNtZE9iamVjdCoKKyNkZWZpbmUgRVBMTElOX0NNRF9QSV9TRVRVUCAgICAgICAgICAgICAgICAxMQkvLyB1bEFyZ19wIH4gMAorI2RlZmluZSBFUExMSU5fQ01EX1NIVVRET1dOICAgICAgICAgICAgICAgIDEyCS8vIHVsQXJnX3AgfiAwCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyB0eXBlZGVmCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgaW50IG1fdWlFdmVudEFyZ1NpemU7CisJdEVwbEFwaUV2ZW50QXJnICptX3BFdmVudEFyZzsKKwl0RXBsQXBpRXZlbnRUeXBlICptX3BFdmVudFR5cGU7CisJdEVwbEtlcm5lbCBtX1JldENiRXZlbnQ7CisKK30gdEVwbExpbkV2ZW50OworCit0eXBlZGVmIHN0cnVjdCB7CisJdEVwbFNkb0NvbUNvbkhkbCBtX1Nkb0NvbUNvbkhkbDsKKwlCT09MIG1fZlZhbGlkU2RvQ29tQ29uSGRsOworCXVuc2lnbmVkIGludCBtX3VpTm9kZUlkOworCXVuc2lnbmVkIGludCBtX3VpSW5kZXg7CisJdW5zaWduZWQgaW50IG1fdWlTdWJpbmRleDsKKwl2b2lkICptX2xlX3BEYXRhOworCXVuc2lnbmVkIGludCBtX3VpU2l6ZTsKKwl0RXBsU2RvVHlwZSBtX1Nkb1R5cGU7CisJdm9pZCAqbV9wVXNlckFyZzsKKworfSB0RXBsTGluU2RvT2JqZWN0OworCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgaW50IG1fdWlJbmRleDsKKwl1bnNpZ25lZCBpbnQgbV91aVN1YmluZGV4OworCXZvaWQgKm1fcERhdGE7CisJdW5zaWduZWQgaW50IG1fdWlTaXplOworCit9IHRFcGxMaW5Mb2NhbE9iamVjdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGludCBtX3VpTm9kZUlkOworCXRFcGxObXROb2RlQ29tbWFuZCBtX05vZGVDb21tYW5kOworCit9IHRFcGxMaW5Ob2RlQ21kT2JqZWN0OworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2VuZGlmIC8vICNpZm5kZWYgX0VQTF9BUElfTElOVVhfSF8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsQXBpTGludXhLZXJuZWwuYyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsQXBpTGludXhLZXJuZWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNWNhMDYyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxBcGlMaW51eEtlcm5lbC5jCkBAIC0wLDAgKzEsMTI2MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIExpbnV4IGtlcm5lbCBtb2R1bGUgYXMgd3JhcHBlciBvZiBFUEwgQVBJIGxheWVyLAorICAgICAgICAgICAgICAgIGkuZS4gY291bnRlcnBhcnQgdG8gYSBMaW51eCBhcHBsaWNhdGlvbgorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgJFJDU2ZpbGU6IEVwbEFwaUxpbnV4S2VybmVsLmMsdiAkCisKKyAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAorCisgICAgICAgICAgICAgICAgJFJldmlzaW9uOiAxLjkgJCAgJERhdGU6IDIwMDgvMTEvMjEgMDk6MDA6MzggJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgR05VLUNvbXBpbGVyIGZvciBtNjhrCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwNi8xMC8xMSBkLmsuOiAgSW5pdGlhbCBWZXJzaW9uCisgIDIwMDgvMDQvMTAgbS51LjogIENoYW5nZWQgdG8gbmV3IGNoYXIgZHJpdmVyIGluaXQKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy8ga2VybmVsIG1vZHVsIGFuZCBkcml2ZXIKKworLy8jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorLy8jaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2NkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisvLyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKy8vI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorLy8jaW5jbHVkZSA8bGludXgvaW5pdC5oPgorLy8jaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKworLy8gc2NoZWR1bGluZworI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisKKy8vIG1lbW9yeSBhY2Nlc3MKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKworI2lmZGVmIENPTkZJR19ERVZGU19GUworI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CisjaW5jbHVkZSA8bGludXgvZGV2ZnNfZnNfa2VybmVsLmg+CisjZW5kaWYKKworI2luY2x1ZGUgIkVwbC5oIgorI2luY2x1ZGUgIkVwbEFwaUxpbnV4LmgiCisvLyNpbmNsdWRlICJrZXJuZWwvRXBsUGRva0NhbC5oIgorI2luY2x1ZGUgInByb2NfZnMuaCIKKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMCkKKyAgICAvLyByZW1vdmUgKCJtYWtlIGludmlzaWJsZSIpIG9ic29sZXRlIHN5bWJvbHMgZm9yIGtlcm5lbCB2ZXJzaW9ucyAyLjYKKyAgICAvLyBhbmQgaGlnaGVyCisjZGVmaW5lIE1PRF9JTkNfVVNFX0NPVU5UCisjZGVmaW5lIE1PRF9ERUNfVVNFX0NPVU5UCisjZGVmaW5lIEVYUE9SVF9OT19TWU1CT0xTCisjZWxzZQorI2Vycm9yICJUaGlzIGRyaXZlciBuZWVkcyBhIDIuNi54IGtlcm5lbCBvciBoaWdoZXIiCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgRyBMIE8gQiBBIEwgICBEIEUgRiBJIE4gSSBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy8gTWV0YWluZm9ybWF0aW9uCitNT0RVTEVfTElDRU5TRSgiRHVhbCBCU0QvR1BMIik7CisjaWZkZWYgTU9EVUxFX0FVVEhPUgorTU9EVUxFX0FVVEhPUigiRGFuaWVsLktydWVnZXJAU1lTVEVDLWVsZWN0cm9uaWMuY29tIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkVQTCBBUEkgZHJpdmVyIik7CisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBDb25maWd1cmF0aW9uCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZGVmaW5lIEVQTExJTl9EUlZfTkFNRSAgICAgInN5c3RlY19lcGwiCS8vIHVzZWQgZm9yIDxyZWdpc3Rlcl9jaHJkZXY+CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgQ29uc3RhbnQgZGVmaW5pdGlvbnMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIFRyYWNlUG9pbnQgc3VwcG9ydCBmb3IgcmVhbHRpbWUtZGVidWdnaW5nCisjaWZkZWYgX0RCR19UUkFDRV9QT0lOVFNfCit2b2lkIFBVQkxJQyBUZ3REYmdTaWduYWxUcmFjZVBvaW50KEJZVEUgYlRyYWNlUG9pbnROdW1iZXJfcCk7CisjZGVmaW5lIFRHVF9EQkdfU0lHTkFMX1RSQUNFX1BPSU5UKHApICAgVGd0RGJnU2lnbmFsVHJhY2VQb2ludChwKQorI2Vsc2UKKyNkZWZpbmUgVEdUX0RCR19TSUdOQUxfVFJBQ0VfUE9JTlQocCkKKyNlbmRpZgorCisjZGVmaW5lIEVWRU5UX1NUQVRFX0lOSVQgICAgICAgIDAKKyNkZWZpbmUgRVZFTlRfU1RBVEVfSU9DVEwgICAgICAgMQkvLyBpb2N0bCBlbnRlcmVkIGFuZCByZWFkeSB0byByZWNlaXZlIEVQTCBldmVudAorI2RlZmluZSBFVkVOVF9TVEFURV9SRUFEWSAgICAgICAyCS8vIEVQTCBldmVudCBjYW4gYmUgZm9yd2FyZGVkIHRvIHVzZXIgYXBwbGljYXRpb24KKyNkZWZpbmUgRVZFTlRfU1RBVEVfVEVSTSAgICAgICAgMwkvLyB0ZXJtaW5hdGUgcHJvY2Vzc2luZworCisjZGVmaW5lIEVQTF9TVEFURV9OT1RPUEVOICAgICAgIDAKKyNkZWZpbmUgRVBMX1NUQVRFX05PVElOSVQgICAgICAgMQorI2RlZmluZSBFUExfU1RBVEVfUlVOTklORyAgICAgICAyCisjZGVmaW5lIEVQTF9TVEFURV9TSFVURE9XTiAgICAgIDMKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBHbG9iYWwgdmFyaWFibGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWZkZWYgQ09ORklHX0RFVkZTX0ZTCisKKyAgICAvLyBkcml2ZXIgbWFqb3IgbnVtYmVyCitzdGF0aWMgaW50IG5EcnZNYWpvck51bWJlcl9nOworCisjZWxzZQorCisgICAgLy8gZGV2aWNlIG51bWJlciAobWFqb3IgYW5kIG1pbm9yKQorc3RhdGljIGRldl90IG5EZXZOdW1fZzsKK3N0YXRpYyBzdHJ1Y3QgY2RldiAqcEVwbF9jZGV2X2c7CisKKyNlbmRpZgorCitzdGF0aWMgdm9sYXRpbGUgdW5zaWduZWQgaW50IHVpRXBsU3RhdGVfZyA9IEVQTF9TVEFURV9OT1RPUEVOOworCitzdGF0aWMgc3RydWN0IHNlbWFwaG9yZSBTZW1hcGhvcmVDYkV2ZW50X2c7CS8vIHNlbWFwaG9yZSBmb3IgRXBsTGluQ2JFdmVudAorc3RhdGljIHdhaXRfcXVldWVfaGVhZF90IFdhaXRRdWV1ZUNiRXZlbnRfZzsJLy8gd2FpdCBxdWV1ZSBFcGxMaW5DYkV2ZW50CitzdGF0aWMgd2FpdF9xdWV1ZV9oZWFkX3QgV2FpdFF1ZXVlUHJvY2Vzc19nOwkvLyB3YWl0IHF1ZXVlIGZvciBFcGxBcGlQcm9jZXNzICh1c2VyIHByb2Nlc3MpCitzdGF0aWMgd2FpdF9xdWV1ZV9oZWFkX3QgV2FpdFF1ZXVlUmVsZWFzZV9nOwkvLyB3YWl0IHF1ZXVlIGZvciBFcGxMaW5SZWxlYXNlCitzdGF0aWMgYXRvbWljX3QgQXRvbWljRXZlbnRTdGF0ZV9nID0gQVRPTUlDX0lOSVQoRVZFTlRfU1RBVEVfSU5JVCk7CitzdGF0aWMgdEVwbEFwaUV2ZW50VHlwZSBFdmVudFR5cGVfZzsJLy8gZXZlbnQgdHlwZSAoZW51bSkKK3N0YXRpYyB0RXBsQXBpRXZlbnRBcmcgKnBFdmVudEFyZ19nOwkvLyBldmVudCBhcmd1bWVudCAodW5pb24pCitzdGF0aWMgdEVwbEtlcm5lbCBSZXRDYkV2ZW50X2c7CS8vIHJldHVybiBjb2RlIGZyb20gZXZlbnQgY2FsbGJhY2sgZnVuY3Rpb24KK3N0YXRpYyB3YWl0X3F1ZXVlX2hlYWRfdCBXYWl0UXVldWVDYlN5bmNfZzsJLy8gd2FpdCBxdWV1ZSBFcGxMaW5DYlN5bmMKK3N0YXRpYyB3YWl0X3F1ZXVlX2hlYWRfdCBXYWl0UXVldWVQSV9Jbl9nOwkvLyB3YWl0IHF1ZXVlIGZvciBFcGxBcGlQcm9jZXNzSW1hZ2VFeGNoYW5nZUluICh1c2VyIHByb2Nlc3MpCitzdGF0aWMgYXRvbWljX3QgQXRvbWljU3luY1N0YXRlX2cgPSBBVE9NSUNfSU5JVChFVkVOVF9TVEFURV9JTklUKTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBMb2NhbCB0eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordHlwZWRlZiBzdHJ1Y3QgeworCXZvaWQgKm1fcFVzZXJBcmc7CisJdm9pZCAqbV9wRGF0YTsKKworfSB0RXBsTGluU2RvQnVmSGVhZGVyOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIExvY2FsIHZhcmlhYmxlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBQcm90b3R5cGVzIG9mIGludGVybmFsIGZ1bmN0aW9ucworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsTGluQ2JFdmVudCh0RXBsQXBpRXZlbnRUeXBlIEV2ZW50VHlwZV9wLAkvLyBJTjogZXZlbnQgdHlwZSAoZW51bSkKKwkJCQl0RXBsQXBpRXZlbnRBcmcgKiBwRXZlbnRBcmdfcCwJLy8gSU46IGV2ZW50IGFyZ3VtZW50ICh1bmlvbikKKwkJCQl2b2lkIEdFTkVSSUMgKiBwVXNlckFyZ19wKTsKKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsTGluQ2JTeW5jKHZvaWQpOworCitzdGF0aWMgaW50IF9faW5pdCBFcGxMaW5Jbml0KHZvaWQpOworc3RhdGljIHZvaWQgX19leGl0IEVwbExpbkV4aXQodm9pZCk7CisKK3N0YXRpYyBpbnQgRXBsTGluT3BlbihzdHJ1Y3QgaW5vZGUgKnBEZXZpY2VGaWxlX3AsIHN0cnVjdCBmaWxlICpwSW5zdGFuY2VfcCk7CitzdGF0aWMgaW50IEVwbExpblJlbGVhc2Uoc3RydWN0IGlub2RlICpwRGV2aWNlRmlsZV9wLCBzdHJ1Y3QgZmlsZSAqcEluc3RhbmNlX3ApOworc3RhdGljIHNzaXplX3QgRXBsTGluUmVhZChzdHJ1Y3QgZmlsZSAqcEluc3RhbmNlX3AsIGNoYXIgKnBEc3RCdWZmX3AsCisJCQkgIHNpemVfdCBCdWZmU2l6ZV9wLCBsb2ZmX3QgKiBwRmlsZU9mZnNfcCk7CitzdGF0aWMgc3NpemVfdCBFcGxMaW5Xcml0ZShzdHJ1Y3QgZmlsZSAqcEluc3RhbmNlX3AsIGNvbnN0IGNoYXIgKnBTcmNCdWZmX3AsCisJCQkgICBzaXplX3QgQnVmZlNpemVfcCwgbG9mZl90ICogcEZpbGVPZmZzX3ApOworc3RhdGljIGludCBFcGxMaW5Jb2N0bChzdHJ1Y3QgaW5vZGUgKnBEZXZpY2VGaWxlX3AsIHN0cnVjdCBmaWxlICpwSW5zdGFuY2VfcCwKKwkJICAgICAgIHVuc2lnbmVkIGludCB1aUlvY3RsQ21kX3AsIHVuc2lnbmVkIGxvbmcgdWxBcmdfcCk7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgS2VybmVsIE1vZHVsZSBzcGVjaWZpYyBEYXRhIFN0cnVjdHVyZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0VYUE9SVF9OT19TWU1CT0xTOworCittb2R1bGVfaW5pdChFcGxMaW5Jbml0KTsKK21vZHVsZV9leGl0KEVwbExpbkV4aXQpOworCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBFcGxMaW5GaWxlT3BzX2cgPSB7CisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLm9wZW4gPSBFcGxMaW5PcGVuLAorCS5yZWxlYXNlID0gRXBsTGluUmVsZWFzZSwKKwkucmVhZCA9IEVwbExpblJlYWQsCisJLndyaXRlID0gRXBsTGluV3JpdGUsCisJLmlvY3RsID0gRXBsTGluSW9jdGwsCisKK307CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgUCBVIEIgTCBJIEMgICBGIFUgTiBDIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIEluaXRhaWxpemUgRHJpdmVyCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIC0+IGluc21vZCBkcml2ZXIKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBpbnQgX19pbml0IEVwbExpbkluaXQodm9pZCkKK3sKKworCXRFcGxLZXJuZWwgRXBsUmV0OworCWludCBpRXJyOworCWludCBpUmV0OworI2lmZGVmIENPTkZJR19ERVZGU19GUworCWludCBuTWlub3JOdW1iZXI7CisjZW5kaWYKKworCVRSQUNFMCgiRVBMOiArIEVwbExpbkluaXQuLi5cbiIpOworCVRSQUNFMigiRVBMOiAgIERyaXZlciBidWlsZDogJXMgLyAlc1xuIiwgX19EQVRFX18sIF9fVElNRV9fKTsKKworCWlSZXQgPSAwOworCisJLy8gaW5pdGlhbGl6ZSBnbG9iYWwgdmFyaWFibGVzCisJYXRvbWljX3NldCgmQXRvbWljRXZlbnRTdGF0ZV9nLCBFVkVOVF9TVEFURV9JTklUKTsKKwlzZW1hX2luaXQoJlNlbWFwaG9yZUNiRXZlbnRfZywgMSk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmV2FpdFF1ZXVlQ2JFdmVudF9nKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZXYWl0UXVldWVQcm9jZXNzX2cpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJldhaXRRdWV1ZVJlbGVhc2VfZyk7CisKKyNpZmRlZiBDT05GSUdfREVWRlNfRlMKKworCS8vIHJlZ2lzdGVyIGNoYXJhY3RlciBkZXZpY2UgaGFuZGxlcgorCVRSQUNFMigiRVBMOiAgIEluc3RhbGxpbmcgRHJpdmVyICclcycsIFZlcnNpb24gJXMuLi5cbiIsCisJICAgICAgIEVQTExJTl9EUlZfTkFNRSwgRVBMX1BST0RVQ1RfVkVSU0lPTik7CisJVFJBQ0UwKCJFUEw6ICAgKHVzaW5nIGR5bmFtaWMgbWFqb3IgbnVtYmVyIGFzc2lnbm1lbnQpXG4iKTsKKwluRHJ2TWFqb3JOdW1iZXJfZyA9CisJICAgIHJlZ2lzdGVyX2NocmRldigwLCBFUExMSU5fRFJWX05BTUUsICZFcGxMaW5GaWxlT3BzX2cpOworCWlmIChuRHJ2TWFqb3JOdW1iZXJfZyAhPSAwKSB7CisJCVRSQUNFMgorCQkgICAgKCJFUEw6ICAgRHJpdmVyICclcycgaW5zdGFsbGVkIHN1Y2Nlc3NmdWwsIGFzc2lnbmVkIE1ham9yTnVtYmVyPSVkXG4iLAorCQkgICAgIEVQTExJTl9EUlZfTkFNRSwgbkRydk1ham9yTnVtYmVyX2cpOworCX0gZWxzZSB7CisJCVRSQUNFMQorCQkgICAgKCJFUEw6ICAgRVJST1I6IERyaXZlciAnJXMnIGlzIHVuYWJsZSB0byBnZXQgYSBmcmVlIE1ham9yTnVtYmVyIVxuIiwKKwkJICAgICBFUExMSU5fRFJWX05BTUUpOworCQlpUmV0ID0gLUVJTzsKKwkJZ290byBFeGl0OworCX0KKworCS8vIGNyZWF0ZSBkZXZpY2Ugbm9kZSBpbiBERVZGUworCW5NaW5vck51bWJlciA9IDA7CisJVFJBQ0UxKCJFUEw6ICAgQ3JlYXRpbmcgZGV2aWNlIG5vZGUgJy9kZXYvJXMnLi4uXG4iLCBFUExMSU5fREVWX05BTUUpOworCWlFcnIgPQorCSAgICBkZXZmc19ta19jZGV2KE1LREVWKG5EcnZNYWpvck51bWJlcl9nLCBuTWlub3JOdW1iZXIpLAorCQkJICBTX0lGQ0hSIHwgU19JUlVHTyB8IFNfSVdVR08sIEVQTExJTl9ERVZfTkFNRSk7CisJaWYgKGlFcnIgPT0gMCkgeworCQlUUkFDRTEoIkVQTDogICBEZXZpY2Ugbm9kZSAnL2Rldi8lcycgY3JlYXRlZCBzdWNjZXNzZnVsLlxuIiwKKwkJICAgICAgIEVQTExJTl9ERVZfTkFNRSk7CisJfSBlbHNlIHsKKwkJVFJBQ0UxKCJFUEw6ICAgRVJST1I6IHVuYWJsZSB0byBjcmVhdGUgZGV2aWNlIG5vZGUgJy9kZXYvJXMnXG4iLAorCQkgICAgICAgRVBMTElOX0RFVl9OQU1FKTsKKwkJaVJldCA9IC1FSU87CisJCWdvdG8gRXhpdDsKKwl9CisKKyNlbHNlCisKKwkvLyByZWdpc3RlciBjaGFyYWN0ZXIgZGV2aWNlIGhhbmRsZXIKKwkvLyBvbmx5IG9uZSBNaW5vciByZXF1aXJlZAorCVRSQUNFMigiRVBMOiAgIEluc3RhbGxpbmcgRHJpdmVyICclcycsIFZlcnNpb24gJXMuLi5cbiIsCisJICAgICAgIEVQTExJTl9EUlZfTkFNRSwgRVBMX1BST0RVQ1RfVkVSU0lPTik7CisJaVJldCA9IGFsbG9jX2NocmRldl9yZWdpb24oJm5EZXZOdW1fZywgMCwgMSwgRVBMTElOX0RSVl9OQU1FKTsKKwlpZiAoaVJldCA9PSAwKSB7CisJCVRSQUNFMgorCQkgICAgKCJFUEw6ICAgRHJpdmVyICclcycgaW5zdGFsbGVkIHN1Y2Nlc3NmdWwsIGFzc2lnbmVkIE1ham9yTnVtYmVyPSVkXG4iLAorCQkgICAgIEVQTExJTl9EUlZfTkFNRSwgTUFKT1IobkRldk51bV9nKSk7CisJfSBlbHNlIHsKKwkJVFJBQ0UxCisJCSAgICAoIkVQTDogICBFUlJPUjogRHJpdmVyICclcycgaXMgdW5hYmxlIHRvIGdldCBhIGZyZWUgTWFqb3JOdW1iZXIhXG4iLAorCQkgICAgIEVQTExJTl9EUlZfTkFNRSk7CisJCWlSZXQgPSAtRUlPOworCQlnb3RvIEV4aXQ7CisJfQorCisJLy8gcmVnaXN0ZXIgY2RldiBzdHJ1Y3R1cmUKKwlwRXBsX2NkZXZfZyA9IGNkZXZfYWxsb2MoKTsKKwlwRXBsX2NkZXZfZy0+b3BzID0gJkVwbExpbkZpbGVPcHNfZzsKKwlwRXBsX2NkZXZfZy0+b3duZXIgPSBUSElTX01PRFVMRTsKKwlpRXJyID0gY2Rldl9hZGQocEVwbF9jZGV2X2csIG5EZXZOdW1fZywgMSk7CisJaWYgKGlFcnIpIHsKKwkJVFJBQ0UyKCJFUEw6ICAgRVJST1IgJWQ6IERyaXZlciAnJXMnIGNvdWxkIG5vdCBiZSBhZGRlZCFcbiIsCisJCSAgICAgICBpRXJyLCBFUExMSU5fRFJWX05BTUUpOworCQlpUmV0ID0gLUVJTzsKKwkJZ290byBFeGl0OworCX0KKyNlbmRpZgorCisJLy8gY3JlYXRlIGRldmljZSBub2RlIGluIFBST0NGUworCUVwbFJldCA9IEVwbExpblByb2NJbml0KCk7CisJaWYgKEVwbFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQlnb3RvIEV4aXQ7CisJfQorCisgICAgICBFeGl0OgorCisJVFJBQ0UxKCJFUEw6IC0gRXBsTGluSW5pdCAoaVJldD0lZClcbiIsIGlSZXQpOworCXJldHVybiAoaVJldCk7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBSZW1vdmUgRHJpdmVyCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIC0+IHJtbW9kIGRyaXZlcgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQgX19leGl0IEVwbExpbkV4aXQodm9pZCkKK3sKKworCXRFcGxLZXJuZWwgRXBsUmV0OworCisJLy8gZGVsZXRlIGluc3RhbmNlIGZvciBhbGwgbW9kdWxlcworLy8gICAgRXBsUmV0ID0gRXBsQXBpU2h1dGRvd24oKTsKKy8vICAgIHByaW50aygiRXBsQXBpU2h1dGRvd24oKTogIDB4JVhcbiIsIEVwbFJldCk7CisKKwkvLyBkZWluaXRpYWxpemUgcHJvYyBmcworCUVwbFJldCA9IEVwbExpblByb2NGcmVlKCk7CisJcHJpbnRrKCJFcGxMaW5Qcm9jRnJlZSgpOiAgICAgICAgMHglWFxuIiwgRXBsUmV0KTsKKworCVRSQUNFMCgiRVBMOiArIEVwbExpbkV4aXQuLi5cbiIpOworCisjaWZkZWYgQ09ORklHX0RFVkZTX0ZTCisKKwkvLyByZW1vdmUgZGV2aWNlIG5vZGUgZnJvbSBERVZGUworCWRldmZzX3JlbW92ZShFUExMSU5fREVWX05BTUUpOworCVRSQUNFMSgiRVBMOiAgIERldmljZSBub2RlICcvZGV2LyVzJyByZW1vdmVkLlxuIiwgRVBMTElOX0RFVl9OQU1FKTsKKworCS8vIHVucmVnaXN0ZXIgY2hhcmFjdGVyIGRldmljZSBoYW5kbGVyCisJdW5yZWdpc3Rlcl9jaHJkZXYobkRydk1ham9yTnVtYmVyX2csIEVQTExJTl9EUlZfTkFNRSk7CisKKyNlbHNlCisKKwkvLyByZW1vdmUgY2RldiBzdHJ1Y3R1cmUKKwljZGV2X2RlbChwRXBsX2NkZXZfZyk7CisKKwkvLyB1bnJlZ2lzdGVyIGNoYXJhY3RlciBkZXZpY2UgaGFuZGxlcgorCXVucmVnaXN0ZXJfY2hyZGV2X3JlZ2lvbihuRGV2TnVtX2csIDEpOworCisjZW5kaWYKKworCVRSQUNFMSgiRVBMOiAgIERyaXZlciAnJXMnIHJlbW92ZWQuXG4iLCBFUExMSU5fRFJWX05BTUUpOworCisJVFJBQ0UwKCJFUEw6IC0gRXBsTGluRXhpdFxuIik7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBPcGVuIERyaXZlcgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICAtPiBvcGVuKCIvZGV2L2RyaXZlciIsIE9fUkRXUikuLi4KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBpbnQgRXBsTGluT3BlbihzdHJ1Y3QgaW5vZGUgKnBEZXZpY2VGaWxlX3AsCS8vIGluZm9ybWF0aW9uIGFib3V0IHRoZSBkZXZpY2UgdG8gb3BlbgorCQkgICAgICBzdHJ1Y3QgZmlsZSAqcEluc3RhbmNlX3ApCS8vIGluZm9ybWF0aW9uIGFib3V0IGRyaXZlciBpbnN0YW5jZQoreworCisJaW50IGlSZXQ7CisKKwlUUkFDRTAoIkVQTDogKyBFcGxMaW5PcGVuLi4uXG4iKTsKKworCU1PRF9JTkNfVVNFX0NPVU5UOworCisJaWYgKHVpRXBsU3RhdGVfZyAhPSBFUExfU1RBVEVfTk9UT1BFTikgewkvLyBzdGFjayBhbHJlYWR5IGluaXRpYWxpemVkCisJCWlSZXQgPSAtRUFMUkVBRFk7CisJfSBlbHNlIHsKKwkJYXRvbWljX3NldCgmQXRvbWljRXZlbnRTdGF0ZV9nLCBFVkVOVF9TVEFURV9JTklUKTsKKwkJc2VtYV9pbml0KCZTZW1hcGhvcmVDYkV2ZW50X2csIDEpOworCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZXYWl0UXVldWVDYkV2ZW50X2cpOworCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZXYWl0UXVldWVQcm9jZXNzX2cpOworCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZXYWl0UXVldWVSZWxlYXNlX2cpOworCQlhdG9taWNfc2V0KCZBdG9taWNTeW5jU3RhdGVfZywgRVZFTlRfU1RBVEVfSU5JVCk7CisJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJldhaXRRdWV1ZUNiU3luY19nKTsKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmV2FpdFF1ZXVlUElfSW5fZyk7CisKKwkJdWlFcGxTdGF0ZV9nID0gRVBMX1NUQVRFX05PVElOSVQ7CisJCWlSZXQgPSAwOworCX0KKworCVRSQUNFMSgiRVBMOiAtIEVwbExpbk9wZW4gKGlSZXQ9JWQpXG4iLCBpUmV0KTsKKwlyZXR1cm4gKGlSZXQpOworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgQ2xvc2UgRHJpdmVyCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIC0+IGNsb3NlKGRldmljZSkuLi4KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBpbnQgRXBsTGluUmVsZWFzZShzdHJ1Y3QgaW5vZGUgKnBEZXZpY2VGaWxlX3AsCS8vIGluZm9ybWF0aW9uIGFib3V0IHRoZSBkZXZpY2UgdG8gb3BlbgorCQkJIHN0cnVjdCBmaWxlICpwSW5zdGFuY2VfcCkJLy8gaW5mb3JtYXRpb24gYWJvdXQgZHJpdmVyIGluc3RhbmNlCit7CisKKwl0RXBsS2VybmVsIEVwbFJldCA9IGtFcGxTdWNjZXNzZnVsOworCWludCBpUmV0OworCisJVFJBQ0UwKCJFUEw6ICsgRXBsTGluUmVsZWFzZS4uLlxuIik7CisKKwlpZiAodWlFcGxTdGF0ZV9nICE9IEVQTF9TVEFURV9OT1RJTklUKSB7CisJCS8vIHBhc3MgY29udHJvbCB0byBzeW5jIGtlcm5lbCB0aHJlYWQsIGJ1dCBzaWduYWwgdGVybWluYXRpb24KKwkJYXRvbWljX3NldCgmQXRvbWljU3luY1N0YXRlX2csIEVWRU5UX1NUQVRFX1RFUk0pOworCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJldhaXRRdWV1ZUNiU3luY19nKTsKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZXYWl0UXVldWVQSV9Jbl9nKTsKKworCQkvLyBwYXNzIGNvbnRyb2wgdG8gZXZlbnQgcXVldWUga2VybmVsIHRocmVhZAorCQlhdG9taWNfc2V0KCZBdG9taWNFdmVudFN0YXRlX2csIEVWRU5UX1NUQVRFX1RFUk0pOworCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJldhaXRRdWV1ZUNiRXZlbnRfZyk7CisKKwkJaWYgKHVpRXBsU3RhdGVfZyA9PSBFUExfU1RBVEVfUlVOTklORykgewkvLyBwb3N0IE5tdEV2ZW50U3dpdGNoT2ZmCisJCQlFcGxSZXQgPSBFcGxBcGlFeGVjTm10Q29tbWFuZChrRXBsTm10RXZlbnRTd2l0Y2hPZmYpOworCisJCX0KKworCQlpZiAoRXBsUmV0ID09IGtFcGxTdWNjZXNzZnVsKSB7CisJCQlUUkFDRTAoIkVQTDogICB3YWl0aW5nIGZvciBOTVRfR1NfT0ZGXG4iKTsKKwkJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShXYWl0UXVldWVSZWxlYXNlX2csCisJCQkJCQkgKHVpRXBsU3RhdGVfZyA9PQorCQkJCQkJICBFUExfU1RBVEVfU0hVVERPV04pKTsKKwkJfSBlbHNlIHsJLy8gcG9zdCBObXRFdmVudFN3aXRjaE9mZiBmYWlsZWQKKwkJCVRSQUNFMCgiRVBMOiAgIGV2ZW50IHBvc3QgZmFpbGVkXG4iKTsKKwkJfQorCisJCS8vICQkJCBkLmsuOiBXaGF0IGlmIHdhaXRpbmcgd2FzIGludGVycnVwdGVkIGJ5IHNpZ25hbD8KKworCQlUUkFDRTAoIkVQTDogICBjYWxsIEVwbEFwaVNodXRkb3duKClcbiIpOworCQkvLyBFUEwgc3RhY2sgY2FuIGJlIHNhZmVseSBzaHV0IGRvd24KKwkJLy8gZGVsZXRlIGluc3RhbmNlIGZvciBhbGwgRVBMIG1vZHVsZXMKKwkJRXBsUmV0ID0gRXBsQXBpU2h1dGRvd24oKTsKKwkJcHJpbnRrKCJFcGxBcGlTaHV0ZG93bigpOiAgMHglWFxuIiwgRXBsUmV0KTsKKwl9CisKKwl1aUVwbFN0YXRlX2cgPSBFUExfU1RBVEVfTk9UT1BFTjsKKwlpUmV0ID0gMDsKKworCU1PRF9ERUNfVVNFX0NPVU5UOworCisJVFJBQ0UxKCJFUEw6IC0gRXBsTGluUmVsZWFzZSAoaVJldD0lZClcbiIsIGlSZXQpOworCXJldHVybiAoaVJldCk7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBSZWFkIERhdGEgZnJvbSBEcml2ZXIKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgLT4gcmVhZCguLi4pCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgc3NpemVfdCBFcGxMaW5SZWFkKHN0cnVjdCBmaWxlICpwSW5zdGFuY2VfcCwJLy8gaW5mb3JtYXRpb24gYWJvdXQgZHJpdmVyIGluc3RhbmNlCisJCQkgIGNoYXIgKnBEc3RCdWZmX3AsCS8vIGFkZHJlc3Mgb2YgYnVmZmVyIHRvIGZpbGwgd2l0aCBkYXRhCisJCQkgIHNpemVfdCBCdWZmU2l6ZV9wLAkvLyBsZW5ndGggb2YgdGhlIGJ1ZmZlcgorCQkJICBsb2ZmX3QgKiBwRmlsZU9mZnNfcCkJLy8gb2Zmc2V0IGluIHRoZSBmaWxlCit7CisKKwlpbnQgaVJldDsKKworCVRSQUNFMCgiRVBMOiArIEVwbExpblJlYWQuLi5cbiIpOworCisJVFJBQ0UwKCJFUEw6ICAgU29ycnksIHRoaXMgb3BlcmF0aW9uIGlzbid0IHN1cHBvcnRlZC5cbiIpOworCWlSZXQgPSAtRUlOVkFMOworCisJVFJBQ0UxKCJFUEw6IC0gRXBsTGluUmVhZCAoaVJldD0lZClcbiIsIGlSZXQpOworCXJldHVybiAoaVJldCk7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBXcml0ZSBEYXRhIHRvIERyaXZlcgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICAtPiB3cml0ZSguLi4pCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgc3NpemVfdCBFcGxMaW5Xcml0ZShzdHJ1Y3QgZmlsZSAqcEluc3RhbmNlX3AsCS8vIGluZm9ybWF0aW9uIGFib3V0IGRyaXZlciBpbnN0YW5jZQorCQkJICAgY29uc3QgY2hhciAqcFNyY0J1ZmZfcCwJLy8gYWRkcmVzcyBvZiBidWZmZXIgdG8gZ2V0IGRhdGEgZnJvbQorCQkJICAgc2l6ZV90IEJ1ZmZTaXplX3AsCS8vIGxlbmd0aCBvZiB0aGUgYnVmZmVyCisJCQkgICBsb2ZmX3QgKiBwRmlsZU9mZnNfcCkJLy8gb2Zmc2V0IGluIHRoZSBmaWxlCit7CisKKwlpbnQgaVJldDsKKworCVRSQUNFMCgiRVBMOiArIEVwbExpbldyaXRlLi4uXG4iKTsKKworCVRSQUNFMCgiRVBMOiAgIFNvcnJ5LCB0aGlzIG9wZXJhdGlvbiBpc24ndCBzdXBwb3J0ZWQuXG4iKTsKKwlpUmV0ID0gLUVJTlZBTDsKKworCVRSQUNFMSgiRVBMOiAtIEVwbExpbldyaXRlIChpUmV0PSVkKVxuIiwgaVJldCk7CisJcmV0dXJuIChpUmV0KTsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIEdlbmVyaWMgQWNjZXNzIHRvIERyaXZlcgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICAtPiBpb2N0bCguLi4pCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgaW50IEVwbExpbklvY3RsKHN0cnVjdCBpbm9kZSAqcERldmljZUZpbGVfcCwJLy8gaW5mb3JtYXRpb24gYWJvdXQgdGhlIGRldmljZSB0byBvcGVuCisJCSAgICAgICBzdHJ1Y3QgZmlsZSAqcEluc3RhbmNlX3AsCS8vIGluZm9ybWF0aW9uIGFib3V0IGRyaXZlciBpbnN0YW5jZQorCQkgICAgICAgdW5zaWduZWQgaW50IHVpSW9jdGxDbWRfcCwJLy8gSW9jdGwgY29tbWFuZCB0byBleGVjdXRlCisJCSAgICAgICB1bnNpZ25lZCBsb25nIHVsQXJnX3ApCS8vIElvY3RsIGNvbW1hbmQgc3BlY2lmaWMgYXJndW1lbnQvcGFyYW1ldGVyCit7CisKKwl0RXBsS2VybmVsIEVwbFJldDsKKwlpbnQgaUVycjsKKwlpbnQgaVJldDsKKworLy8gICAgVFJBQ0UxKCJFUEw6ICsgRXBsTGluSW9jdGwgKHVpSW9jdGxDbWRfcD0lZCkuLi5cbiIsIHVpSW9jdGxDbWRfcCk7CisKKwlpUmV0ID0gLUVJTlZBTDsKKworCXN3aXRjaCAodWlJb2N0bENtZF9wKSB7CisJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwljYXNlIEVQTExJTl9DTURfSU5JVElBTElaRToKKwkJeworCQkJdEVwbEFwaUluaXRQYXJhbSBFcGxBcGlJbml0UGFyYW07CisKKwkJCWlFcnIgPQorCQkJICAgIGNvcHlfZnJvbV91c2VyKCZFcGxBcGlJbml0UGFyYW0sCisJCQkJCSAgIChjb25zdCB2b2lkICopdWxBcmdfcCwKKwkJCQkJICAgc2l6ZW9mKEVwbEFwaUluaXRQYXJhbSkpOworCQkJaWYgKGlFcnIgIT0gMCkgeworCQkJCWlSZXQgPSAtRUlPOworCQkJCWdvdG8gRXhpdDsKKwkJCX0KKworCQkJRXBsQXBpSW5pdFBhcmFtLm1fcGZuQ2JFdmVudCA9IEVwbExpbkNiRXZlbnQ7CisJCQlFcGxBcGlJbml0UGFyYW0ubV9wZm5DYlN5bmMgPSBFcGxMaW5DYlN5bmM7CisKKwkJCUVwbFJldCA9IEVwbEFwaUluaXRpYWxpemUoJkVwbEFwaUluaXRQYXJhbSk7CisKKwkJCXVpRXBsU3RhdGVfZyA9IEVQTF9TVEFURV9SVU5OSU5HOworCisJCQlpUmV0ID0gKGludClFcGxSZXQ7CisJCQlicmVhazsKKwkJfQorCisJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwljYXNlIEVQTExJTl9DTURfU0hVVERPV046CisJCXsJCS8vIHNodXRkb3duIHRoZSB0aHJlYWRzCisKKwkJCS8vIHBhc3MgY29udHJvbCB0byBzeW5jIGtlcm5lbCB0aHJlYWQsIGJ1dCBzaWduYWwgdGVybWluYXRpb24KKwkJCWF0b21pY19zZXQoJkF0b21pY1N5bmNTdGF0ZV9nLCBFVkVOVF9TVEFURV9URVJNKTsKKwkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmV2FpdFF1ZXVlQ2JTeW5jX2cpOworCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZXYWl0UXVldWVQSV9Jbl9nKTsKKworCQkJLy8gcGFzcyBjb250cm9sIHRvIGV2ZW50IHF1ZXVlIGtlcm5lbCB0aHJlYWQKKwkJCWF0b21pY19zZXQoJkF0b21pY0V2ZW50U3RhdGVfZywgRVZFTlRfU1RBVEVfVEVSTSk7CisJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJldhaXRRdWV1ZUNiRXZlbnRfZyk7CisKKwkJCWlmICh1aUVwbFN0YXRlX2cgPT0gRVBMX1NUQVRFX1JVTk5JTkcpIHsJLy8gcG9zdCBObXRFdmVudFN3aXRjaE9mZgorCQkJCUVwbFJldCA9CisJCQkJICAgIEVwbEFwaUV4ZWNObXRDb21tYW5kKGtFcGxObXRFdmVudFN3aXRjaE9mZik7CisKKwkJCX0KKworCQkJaVJldCA9IDA7CisJCQlicmVhazsKKwkJfQorCisJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwljYXNlIEVQTExJTl9DTURfUkVBRF9MT0NBTF9PQkpFQ1Q6CisJCXsKKwkJCXRFcGxMaW5Mb2NhbE9iamVjdCBMb2NhbE9iamVjdDsKKwkJCXZvaWQgKnBEYXRhOworCisJCQlpRXJyID0KKwkJCSAgICBjb3B5X2Zyb21fdXNlcigmTG9jYWxPYmplY3QsIChjb25zdCB2b2lkICopdWxBcmdfcCwKKwkJCQkJICAgc2l6ZW9mKExvY2FsT2JqZWN0KSk7CisJCQlpZiAoaUVyciAhPSAwKSB7CisJCQkJaVJldCA9IC1FSU87CisJCQkJZ290byBFeGl0OworCQkJfQorCisJCQlpZiAoKExvY2FsT2JqZWN0Lm1fcERhdGEgPT0gTlVMTCkKKwkJCSAgICB8fCAoTG9jYWxPYmplY3QubV91aVNpemUgPT0gMCkpIHsKKwkJCQlpUmV0ID0gKGludClrRXBsQXBpSW52YWxpZFBhcmFtOworCQkJCWdvdG8gRXhpdDsKKwkJCX0KKworCQkJcERhdGEgPSB2bWFsbG9jKExvY2FsT2JqZWN0Lm1fdWlTaXplKTsKKwkJCWlmIChwRGF0YSA9PSBOVUxMKSB7CS8vIG5vIG1lbW9yeSBhdmFpbGFibGUKKwkJCQlpUmV0ID0gLUVOT01FTTsKKwkJCQlnb3RvIEV4aXQ7CisJCQl9CisKKwkJCUVwbFJldCA9CisJCQkgICAgRXBsQXBpUmVhZExvY2FsT2JqZWN0KExvY2FsT2JqZWN0Lm1fdWlJbmRleCwKKwkJCQkJCSAgTG9jYWxPYmplY3QubV91aVN1YmluZGV4LAorCQkJCQkJICBwRGF0YSwgJkxvY2FsT2JqZWN0Lm1fdWlTaXplKTsKKworCQkJaWYgKEVwbFJldCA9PSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJCWlFcnIgPQorCQkJCSAgICBjb3B5X3RvX3VzZXIoTG9jYWxPYmplY3QubV9wRGF0YSwgcERhdGEsCisJCQkJCQkgTG9jYWxPYmplY3QubV91aVNpemUpOworCisJCQkJdmZyZWUocERhdGEpOworCisJCQkJaWYgKGlFcnIgIT0gMCkgeworCQkJCQlpUmV0ID0gLUVJTzsKKwkJCQkJZ290byBFeGl0OworCQkJCX0KKwkJCQkvLyByZXR1cm4gYWN0dWFsIHNpemUgKExvY2FsT2JqZWN0Lm1fdWlTaXplKQorCQkJCWlFcnIgPSBwdXRfdXNlcihMb2NhbE9iamVjdC5tX3VpU2l6ZSwKKwkJCQkJCSh1bnNpZ25lZCBpbnQgKikodWxBcmdfcCArCisJCQkJCQkJCSAodW5zaWduZWQgbG9uZykKKwkJCQkJCQkJICZMb2NhbE9iamVjdC4KKwkJCQkJCQkJIG1fdWlTaXplIC0KKwkJCQkJCQkJICh1bnNpZ25lZCBsb25nKQorCQkJCQkJCQkgJkxvY2FsT2JqZWN0KSk7CisJCQkJaWYgKGlFcnIgIT0gMCkgeworCQkJCQlpUmV0ID0gLUVJTzsKKwkJCQkJZ290byBFeGl0OworCQkJCX0KKworCQkJfSBlbHNlIHsKKwkJCQl2ZnJlZShwRGF0YSk7CisJCQl9CisKKwkJCWlSZXQgPSAoaW50KUVwbFJldDsKKwkJCWJyZWFrOworCQl9CisKKwkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCWNhc2UgRVBMTElOX0NNRF9XUklURV9MT0NBTF9PQkpFQ1Q6CisJCXsKKwkJCXRFcGxMaW5Mb2NhbE9iamVjdCBMb2NhbE9iamVjdDsKKwkJCXZvaWQgKnBEYXRhOworCisJCQlpRXJyID0KKwkJCSAgICBjb3B5X2Zyb21fdXNlcigmTG9jYWxPYmplY3QsIChjb25zdCB2b2lkICopdWxBcmdfcCwKKwkJCQkJICAgc2l6ZW9mKExvY2FsT2JqZWN0KSk7CisJCQlpZiAoaUVyciAhPSAwKSB7CisJCQkJaVJldCA9IC1FSU87CisJCQkJZ290byBFeGl0OworCQkJfQorCisJCQlpZiAoKExvY2FsT2JqZWN0Lm1fcERhdGEgPT0gTlVMTCkKKwkJCSAgICB8fCAoTG9jYWxPYmplY3QubV91aVNpemUgPT0gMCkpIHsKKwkJCQlpUmV0ID0gKGludClrRXBsQXBpSW52YWxpZFBhcmFtOworCQkJCWdvdG8gRXhpdDsKKwkJCX0KKworCQkJcERhdGEgPSB2bWFsbG9jKExvY2FsT2JqZWN0Lm1fdWlTaXplKTsKKwkJCWlmIChwRGF0YSA9PSBOVUxMKSB7CS8vIG5vIG1lbW9yeSBhdmFpbGFibGUKKwkJCQlpUmV0ID0gLUVOT01FTTsKKwkJCQlnb3RvIEV4aXQ7CisJCQl9CisJCQlpRXJyID0KKwkJCSAgICBjb3B5X2Zyb21fdXNlcihwRGF0YSwgTG9jYWxPYmplY3QubV9wRGF0YSwKKwkJCQkJICAgTG9jYWxPYmplY3QubV91aVNpemUpOworCQkJaWYgKGlFcnIgIT0gMCkgeworCQkJCWlSZXQgPSAtRUlPOworCQkJCWdvdG8gRXhpdDsKKwkJCX0KKworCQkJRXBsUmV0ID0KKwkJCSAgICBFcGxBcGlXcml0ZUxvY2FsT2JqZWN0KExvY2FsT2JqZWN0Lm1fdWlJbmRleCwKKwkJCQkJCSAgIExvY2FsT2JqZWN0Lm1fdWlTdWJpbmRleCwKKwkJCQkJCSAgIHBEYXRhLCBMb2NhbE9iamVjdC5tX3VpU2l6ZSk7CisKKwkJCXZmcmVlKHBEYXRhKTsKKworCQkJaVJldCA9IChpbnQpRXBsUmV0OworCQkJYnJlYWs7CisJCX0KKworCWNhc2UgRVBMTElOX0NNRF9SRUFEX09CSkVDVDoKKwkJeworCQkJdEVwbExpblNkb09iamVjdCBTZG9PYmplY3Q7CisJCQl2b2lkICpwRGF0YTsKKwkJCXRFcGxMaW5TZG9CdWZIZWFkZXIgKnBCdWZIZWFkZXI7CisJCQl0RXBsU2RvQ29tQ29uSGRsICpwU2RvQ29tQ29uSGRsOworCisJCQlpRXJyID0KKwkJCSAgICBjb3B5X2Zyb21fdXNlcigmU2RvT2JqZWN0LCAoY29uc3Qgdm9pZCAqKXVsQXJnX3AsCisJCQkJCSAgIHNpemVvZihTZG9PYmplY3QpKTsKKwkJCWlmIChpRXJyICE9IDApIHsKKwkJCQlpUmV0ID0gLUVJTzsKKwkJCQlnb3RvIEV4aXQ7CisJCQl9CisKKwkJCWlmICgoU2RvT2JqZWN0Lm1fbGVfcERhdGEgPT0gTlVMTCkKKwkJCSAgICB8fCAoU2RvT2JqZWN0Lm1fdWlTaXplID09IDApKSB7CisJCQkJaVJldCA9IChpbnQpa0VwbEFwaUludmFsaWRQYXJhbTsKKwkJCQlnb3RvIEV4aXQ7CisJCQl9CisKKwkJCXBCdWZIZWFkZXIgPQorCQkJICAgICh0RXBsTGluU2RvQnVmSGVhZGVyICopCisJCQkgICAgdm1hbGxvYyhzaXplb2YodEVwbExpblNkb0J1ZkhlYWRlcikgKworCQkJCSAgICBTZG9PYmplY3QubV91aVNpemUpOworCQkJaWYgKHBCdWZIZWFkZXIgPT0gTlVMTCkgewkvLyBubyBtZW1vcnkgYXZhaWxhYmxlCisJCQkJaVJldCA9IC1FTk9NRU07CisJCQkJZ290byBFeGl0OworCQkJfQorCQkJLy8gaW5pdGlhdGUgdGVtcG9yYXJ5IGJ1ZmZlcgorCQkJcEJ1ZkhlYWRlci0+bV9wVXNlckFyZyA9IFNkb09iamVjdC5tX3BVc2VyQXJnOwkvLyBvcmlnaW5hbCB1c2VyIGFyZ3VtZW50IHBvaW50ZXIKKwkJCXBCdWZIZWFkZXItPm1fcERhdGEgPSBTZG9PYmplY3QubV9sZV9wRGF0YTsJLy8gb3JpZ2luYWwgZGF0YSBwb2ludGVyIGZyb20gYXBwCisJCQlwRGF0YSA9IHBCdWZIZWFkZXIgKyBzaXplb2YodEVwbExpblNkb0J1ZkhlYWRlcik7CisKKwkJCWlmIChTZG9PYmplY3QubV9mVmFsaWRTZG9Db21Db25IZGwgIT0gRkFMU0UpIHsKKwkJCQlwU2RvQ29tQ29uSGRsID0gJlNkb09iamVjdC5tX1Nkb0NvbUNvbkhkbDsKKwkJCX0gZWxzZSB7CisJCQkJcFNkb0NvbUNvbkhkbCA9IE5VTEw7CisJCQl9CisKKwkJCUVwbFJldCA9CisJCQkgICAgRXBsQXBpUmVhZE9iamVjdChwU2RvQ29tQ29uSGRsLAorCQkJCQkgICAgIFNkb09iamVjdC5tX3VpTm9kZUlkLAorCQkJCQkgICAgIFNkb09iamVjdC5tX3VpSW5kZXgsCisJCQkJCSAgICAgU2RvT2JqZWN0Lm1fdWlTdWJpbmRleCwgcERhdGEsCisJCQkJCSAgICAgJlNkb09iamVjdC5tX3VpU2l6ZSwKKwkJCQkJICAgICBTZG9PYmplY3QubV9TZG9UeXBlLCBwQnVmSGVhZGVyKTsKKworCQkJLy8gcmV0dXJuIGFjdHVhbCBTRE8gaGFuZGxlIChTZG9PYmplY3QubV9TZG9Db21Db25IZGwpCisJCQlpRXJyID0gcHV0X3VzZXIoU2RvT2JqZWN0Lm1fU2RvQ29tQ29uSGRsLAorCQkJCQkodW5zaWduZWQgaW50ICopKHVsQXJnX3AgKworCQkJCQkJCSAodW5zaWduZWQgbG9uZykKKwkJCQkJCQkgJlNkb09iamVjdC4KKwkJCQkJCQkgbV9TZG9Db21Db25IZGwgLQorCQkJCQkJCSAodW5zaWduZWQgbG9uZykKKwkJCQkJCQkgJlNkb09iamVjdCkpOworCQkJaWYgKGlFcnIgIT0gMCkgeworCQkJCWlSZXQgPSAtRUlPOworCQkJCWdvdG8gRXhpdDsKKwkJCX0KKworCQkJaWYgKEVwbFJldCA9PSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJCWlFcnIgPQorCQkJCSAgICBjb3B5X3RvX3VzZXIoU2RvT2JqZWN0Lm1fbGVfcERhdGEsIHBEYXRhLAorCQkJCQkJIFNkb09iamVjdC5tX3VpU2l6ZSk7CisKKwkJCQl2ZnJlZShwQnVmSGVhZGVyKTsKKworCQkJCWlmIChpRXJyICE9IDApIHsKKwkJCQkJaVJldCA9IC1FSU87CisJCQkJCWdvdG8gRXhpdDsKKwkJCQl9CisJCQkJLy8gcmV0dXJuIGFjdHVhbCBzaXplIChTZG9PYmplY3QubV91aVNpemUpCisJCQkJaUVyciA9IHB1dF91c2VyKFNkb09iamVjdC5tX3VpU2l6ZSwKKwkJCQkJCSh1bnNpZ25lZCBpbnQgKikodWxBcmdfcCArCisJCQkJCQkJCSAodW5zaWduZWQgbG9uZykKKwkJCQkJCQkJICZTZG9PYmplY3QuCisJCQkJCQkJCSBtX3VpU2l6ZSAtCisJCQkJCQkJCSAodW5zaWduZWQgbG9uZykKKwkJCQkJCQkJICZTZG9PYmplY3QpKTsKKwkJCQlpZiAoaUVyciAhPSAwKSB7CisJCQkJCWlSZXQgPSAtRUlPOworCQkJCQlnb3RvIEV4aXQ7CisJCQkJfQorCQkJfSBlbHNlIGlmIChFcGxSZXQgIT0ga0VwbEFwaVRhc2tEZWZlcnJlZCkgewkvLyBlcnJvciBvY3VycmVkCisJCQkJdmZyZWUocEJ1ZkhlYWRlcik7CisJCQkJaWYgKGlFcnIgIT0gMCkgeworCQkJCQlpUmV0ID0gLUVJTzsKKwkJCQkJZ290byBFeGl0OworCQkJCX0KKwkJCX0KKworCQkJaVJldCA9IChpbnQpRXBsUmV0OworCQkJYnJlYWs7CisJCX0KKworCWNhc2UgRVBMTElOX0NNRF9XUklURV9PQkpFQ1Q6CisJCXsKKwkJCXRFcGxMaW5TZG9PYmplY3QgU2RvT2JqZWN0OworCQkJdm9pZCAqcERhdGE7CisJCQl0RXBsTGluU2RvQnVmSGVhZGVyICpwQnVmSGVhZGVyOworCQkJdEVwbFNkb0NvbUNvbkhkbCAqcFNkb0NvbUNvbkhkbDsKKworCQkJaUVyciA9CisJCQkgICAgY29weV9mcm9tX3VzZXIoJlNkb09iamVjdCwgKGNvbnN0IHZvaWQgKil1bEFyZ19wLAorCQkJCQkgICBzaXplb2YoU2RvT2JqZWN0KSk7CisJCQlpZiAoaUVyciAhPSAwKSB7CisJCQkJaVJldCA9IC1FSU87CisJCQkJZ290byBFeGl0OworCQkJfQorCisJCQlpZiAoKFNkb09iamVjdC5tX2xlX3BEYXRhID09IE5VTEwpCisJCQkgICAgfHwgKFNkb09iamVjdC5tX3VpU2l6ZSA9PSAwKSkgeworCQkJCWlSZXQgPSAoaW50KWtFcGxBcGlJbnZhbGlkUGFyYW07CisJCQkJZ290byBFeGl0OworCQkJfQorCisJCQlwQnVmSGVhZGVyID0KKwkJCSAgICAodEVwbExpblNkb0J1ZkhlYWRlciAqKQorCQkJICAgIHZtYWxsb2Moc2l6ZW9mKHRFcGxMaW5TZG9CdWZIZWFkZXIpICsKKwkJCQkgICAgU2RvT2JqZWN0Lm1fdWlTaXplKTsKKwkJCWlmIChwQnVmSGVhZGVyID09IE5VTEwpIHsJLy8gbm8gbWVtb3J5IGF2YWlsYWJsZQorCQkJCWlSZXQgPSAtRU5PTUVNOworCQkJCWdvdG8gRXhpdDsKKwkJCX0KKwkJCS8vIGluaXRpYXRlIHRlbXBvcmFyeSBidWZmZXIKKwkJCXBCdWZIZWFkZXItPm1fcFVzZXJBcmcgPSBTZG9PYmplY3QubV9wVXNlckFyZzsJLy8gb3JpZ2luYWwgdXNlciBhcmd1bWVudCBwb2ludGVyCisJCQlwQnVmSGVhZGVyLT5tX3BEYXRhID0gU2RvT2JqZWN0Lm1fbGVfcERhdGE7CS8vIG9yaWdpbmFsIGRhdGEgcG9pbnRlciBmcm9tIGFwcAorCQkJcERhdGEgPSBwQnVmSGVhZGVyICsgc2l6ZW9mKHRFcGxMaW5TZG9CdWZIZWFkZXIpOworCisJCQlpRXJyID0KKwkJCSAgICBjb3B5X2Zyb21fdXNlcihwRGF0YSwgU2RvT2JqZWN0Lm1fbGVfcERhdGEsCisJCQkJCSAgIFNkb09iamVjdC5tX3VpU2l6ZSk7CisKKwkJCWlmIChpRXJyICE9IDApIHsKKwkJCQlpUmV0ID0gLUVJTzsKKwkJCQlnb3RvIEV4aXQ7CisJCQl9CisKKwkJCWlmIChTZG9PYmplY3QubV9mVmFsaWRTZG9Db21Db25IZGwgIT0gRkFMU0UpIHsKKwkJCQlwU2RvQ29tQ29uSGRsID0gJlNkb09iamVjdC5tX1Nkb0NvbUNvbkhkbDsKKwkJCX0gZWxzZSB7CisJCQkJcFNkb0NvbUNvbkhkbCA9IE5VTEw7CisJCQl9CisKKwkJCUVwbFJldCA9CisJCQkgICAgRXBsQXBpV3JpdGVPYmplY3QocFNkb0NvbUNvbkhkbCwKKwkJCQkJICAgICAgU2RvT2JqZWN0Lm1fdWlOb2RlSWQsCisJCQkJCSAgICAgIFNkb09iamVjdC5tX3VpSW5kZXgsCisJCQkJCSAgICAgIFNkb09iamVjdC5tX3VpU3ViaW5kZXgsIHBEYXRhLAorCQkJCQkgICAgICBTZG9PYmplY3QubV91aVNpemUsCisJCQkJCSAgICAgIFNkb09iamVjdC5tX1Nkb1R5cGUsIHBCdWZIZWFkZXIpOworCisJCQkvLyByZXR1cm4gYWN0dWFsIFNETyBoYW5kbGUgKFNkb09iamVjdC5tX1Nkb0NvbUNvbkhkbCkKKwkJCWlFcnIgPSBwdXRfdXNlcihTZG9PYmplY3QubV9TZG9Db21Db25IZGwsCisJCQkJCSh1bnNpZ25lZCBpbnQgKikodWxBcmdfcCArCisJCQkJCQkJICh1bnNpZ25lZCBsb25nKQorCQkJCQkJCSAmU2RvT2JqZWN0LgorCQkJCQkJCSBtX1Nkb0NvbUNvbkhkbCAtCisJCQkJCQkJICh1bnNpZ25lZCBsb25nKQorCQkJCQkJCSAmU2RvT2JqZWN0KSk7CisJCQlpZiAoaUVyciAhPSAwKSB7CisJCQkJaVJldCA9IC1FSU87CisJCQkJZ290byBFeGl0OworCQkJfQorCisJCQlpZiAoRXBsUmV0ICE9IGtFcGxBcGlUYXNrRGVmZXJyZWQpIHsJLy8gc3VjY2VlZGVkIG9yIGVycm9yIG9jdXJyZWQsIGJ1dCB0YXNrIG5vdCBkZWZlcnJlZAorCQkJCXZmcmVlKHBCdWZIZWFkZXIpOworCQkJfQorCisJCQlpUmV0ID0gKGludClFcGxSZXQ7CisJCQlicmVhazsKKwkJfQorCisJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwljYXNlIEVQTExJTl9DTURfRlJFRV9TRE9fQ0hBTk5FTDoKKwkJeworCQkJLy8gZm9yd2FyZCBTRE8gaGFuZGxlIHRvIEVQTCBzdGFjaworCQkJRXBsUmV0ID0KKwkJCSAgICBFcGxBcGlGcmVlU2RvQ2hhbm5lbCgodEVwbFNkb0NvbUNvbkhkbCkgdWxBcmdfcCk7CisKKwkJCWlSZXQgPSAoaW50KUVwbFJldDsKKwkJCWJyZWFrOworCQl9CisKKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVF9NTikpICE9IDApCisJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwljYXNlIEVQTExJTl9DTURfTU5fVFJJR0dFUl9TVEFURV9DSEFOR0U6CisJCXsKKwkJCXRFcGxMaW5Ob2RlQ21kT2JqZWN0IE5vZGVDbWRPYmplY3Q7CisKKwkJCWlFcnIgPQorCQkJICAgIGNvcHlfZnJvbV91c2VyKCZOb2RlQ21kT2JqZWN0LAorCQkJCQkgICAoY29uc3Qgdm9pZCAqKXVsQXJnX3AsCisJCQkJCSAgIHNpemVvZihOb2RlQ21kT2JqZWN0KSk7CisJCQlpZiAoaUVyciAhPSAwKSB7CisJCQkJaVJldCA9IC1FSU87CisJCQkJZ290byBFeGl0OworCQkJfQorCisJCQlFcGxSZXQgPQorCQkJICAgIEVwbEFwaU1uVHJpZ2dlclN0YXRlQ2hhbmdlKE5vZGVDbWRPYmplY3QubV91aU5vZGVJZCwKKwkJCQkJCSAgICAgICBOb2RlQ21kT2JqZWN0LgorCQkJCQkJICAgICAgIG1fTm9kZUNvbW1hbmQpOworCQkJaVJldCA9IChpbnQpRXBsUmV0OworCQkJYnJlYWs7CisJCX0KKyNlbmRpZgorCisJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwljYXNlIEVQTExJTl9DTURfR0VUX0VWRU5UOgorCQl7CisJCQl0RXBsTGluRXZlbnQgRXZlbnQ7CisKKwkJCS8vIHNhdmUgZXZlbnQgc3RydWN0dXJlCisJCQlpRXJyID0KKwkJCSAgICBjb3B5X2Zyb21fdXNlcigmRXZlbnQsIChjb25zdCB2b2lkICopdWxBcmdfcCwKKwkJCQkJICAgc2l6ZW9mKEV2ZW50KSk7CisJCQlpZiAoaUVyciAhPSAwKSB7CisJCQkJaVJldCA9IC1FSU87CisJCQkJZ290byBFeGl0OworCQkJfQorCQkJLy8gc2F2ZSByZXR1cm4gY29kZSBmcm9tIGFwcGxpY2F0aW9uJ3MgZXZlbnQgY2FsbGJhY2sgZnVuY3Rpb24KKwkJCVJldENiRXZlbnRfZyA9IEV2ZW50Lm1fUmV0Q2JFdmVudDsKKworCQkJaWYgKFJldENiRXZlbnRfZyA9PSBrRXBsU2h1dGRvd24pIHsKKwkJCQkvLyBwYXNzIGNvbnRyb2wgdG8gZXZlbnQgcXVldWUga2VybmVsIHRocmVhZCwgYnV0IHNpZ25hbCB0ZXJtaW5hdGlvbgorCQkJCWF0b21pY19zZXQoJkF0b21pY0V2ZW50U3RhdGVfZywKKwkJCQkJICAgRVZFTlRfU1RBVEVfVEVSTSk7CisJCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZXYWl0UXVldWVDYkV2ZW50X2cpOworCQkJCS8vIGV4aXQgd2l0aCBlcnJvciAtPiBFcGxBcGlQcm9jZXNzKCkgd2lsbCBsZWF2ZSB0aGUgaW5maW5pdGUgbG9vcAorCQkJCWlSZXQgPSAxOworCQkJCWdvdG8gRXhpdDsKKwkJCX0KKwkJCS8vIHBhc3MgY29udHJvbCB0byBldmVudCBxdWV1ZSBrZXJuZWwgdGhyZWFkCisJCQlhdG9taWNfc2V0KCZBdG9taWNFdmVudFN0YXRlX2csIEVWRU5UX1NUQVRFX0lPQ1RMKTsKKwkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmV2FpdFF1ZXVlQ2JFdmVudF9nKTsKKworCQkJLy8gZmFsbCBhc2xlZXAgaXRzZWxmIGluIG93biB3YWl0IHF1ZXVlCisJCQlpRXJyID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKFdhaXRRdWV1ZVByb2Nlc3NfZywKKwkJCQkJCQkoYXRvbWljX3JlYWQKKwkJCQkJCQkgKCZBdG9taWNFdmVudFN0YXRlX2cpCisJCQkJCQkJID09IEVWRU5UX1NUQVRFX1JFQURZKQorCQkJCQkJCXx8CisJCQkJCQkJKGF0b21pY19yZWFkCisJCQkJCQkJICgmQXRvbWljRXZlbnRTdGF0ZV9nKQorCQkJCQkJCSA9PSBFVkVOVF9TVEFURV9URVJNKSk7CisJCQlpZiAoaUVyciAhPSAwKSB7CS8vIHdhaXRpbmcgd2FzIGludGVycnVwdGVkIGJ5IHNpZ25hbAorCQkJCS8vIHBhc3MgY29udHJvbCB0byBldmVudCBxdWV1ZSBrZXJuZWwgdGhyZWFkLCBidXQgc2lnbmFsIHRlcm1pbmF0aW9uCisJCQkJYXRvbWljX3NldCgmQXRvbWljRXZlbnRTdGF0ZV9nLAorCQkJCQkgICBFVkVOVF9TVEFURV9URVJNKTsKKwkJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJldhaXRRdWV1ZUNiRXZlbnRfZyk7CisJCQkJLy8gZXhpdCB3aXRoIHRoaXMgZXJyb3IgLT4gRXBsQXBpUHJvY2VzcygpIHdpbGwgbGVhdmUgdGhlIGluZmluaXRlIGxvb3AKKwkJCQlpUmV0ID0gaUVycjsKKwkJCQlnb3RvIEV4aXQ7CisJCQl9IGVsc2UgaWYgKGF0b21pY19yZWFkKCZBdG9taWNFdmVudFN0YXRlX2cpID09IEVWRU5UX1NUQVRFX1RFUk0pIHsJLy8gdGVybWluYXRpb24gaW4gcHJvZ3Jlc3MKKwkJCQkvLyBwYXNzIGNvbnRyb2wgdG8gZXZlbnQgcXVldWUga2VybmVsIHRocmVhZCwgYnV0IHNpZ25hbCB0ZXJtaW5hdGlvbgorCQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmV2FpdFF1ZXVlQ2JFdmVudF9nKTsKKwkJCQkvLyBleGl0IHdpdGggdGhpcyBlcnJvciAtPiBFcGxBcGlQcm9jZXNzKCkgd2lsbCBsZWF2ZSB0aGUgaW5maW5pdGUgbG9vcAorCQkJCWlSZXQgPSAxOworCQkJCWdvdG8gRXhpdDsKKwkJCX0KKwkJCS8vIGNvcHkgZXZlbnQgdG8gdXNlciBzcGFjZQorCQkJaUVyciA9CisJCQkgICAgY29weV90b191c2VyKEV2ZW50Lm1fcEV2ZW50VHlwZSwgJkV2ZW50VHlwZV9nLAorCQkJCQkgc2l6ZW9mKEV2ZW50VHlwZV9nKSk7CisJCQlpZiAoaUVyciAhPSAwKSB7CS8vIG5vdCBhbGwgZGF0YSBjb3VsZCBiZSBjb3BpZWQKKwkJCQlpUmV0ID0gLUVJTzsKKwkJCQlnb3RvIEV4aXQ7CisJCQl9CisJCQkvLyAkJCQgZC5rLiBwZXJmb3JtIFNETyBldmVudCBwcm9jZXNzaW5nCisJCQlpZiAoRXZlbnRUeXBlX2cgPT0ga0VwbEFwaUV2ZW50U2RvKSB7CisJCQkJdm9pZCAqcERhdGE7CisJCQkJdEVwbExpblNkb0J1ZkhlYWRlciAqcEJ1ZkhlYWRlcjsKKworCQkJCXBCdWZIZWFkZXIgPQorCQkJCSAgICAodEVwbExpblNkb0J1ZkhlYWRlciAqKSBwRXZlbnRBcmdfZy0+bV9TZG8uCisJCQkJICAgIG1fcFVzZXJBcmc7CisJCQkJcERhdGEgPQorCQkJCSAgICBwQnVmSGVhZGVyICsgc2l6ZW9mKHRFcGxMaW5TZG9CdWZIZWFkZXIpOworCisJCQkJaWYgKHBFdmVudEFyZ19nLT5tX1Nkby5tX1Nkb0FjY2Vzc1R5cGUgPT0KKwkJCQkgICAga0VwbFNkb0FjY2Vzc1R5cGVSZWFkKSB7CisJCQkJCS8vIGNvcHkgcmVhZCBkYXRhIHRvIHVzZXIgc3BhY2UKKwkJCQkJaUVyciA9CisJCQkJCSAgICBjb3B5X3RvX3VzZXIocEJ1ZkhlYWRlci0+bV9wRGF0YSwKKwkJCQkJCQkgcERhdGEsCisJCQkJCQkJIHBFdmVudEFyZ19nLT5tX1Nkby4KKwkJCQkJCQkgbV91aVRyYW5zZmVycmVkQnl0ZSk7CisJCQkJCWlmIChpRXJyICE9IDApIHsJLy8gbm90IGFsbCBkYXRhIGNvdWxkIGJlIGNvcGllZAorCQkJCQkJaVJldCA9IC1FSU87CisJCQkJCQlnb3RvIEV4aXQ7CisJCQkJCX0KKwkJCQl9CisJCQkJcEV2ZW50QXJnX2ctPm1fU2RvLm1fcFVzZXJBcmcgPQorCQkJCSAgICBwQnVmSGVhZGVyLT5tX3BVc2VyQXJnOworCQkJCXZmcmVlKHBCdWZIZWFkZXIpOworCQkJfQorCisJCQlpRXJyID0KKwkJCSAgICBjb3B5X3RvX3VzZXIoRXZlbnQubV9wRXZlbnRBcmcsIHBFdmVudEFyZ19nLAorCQkJCQkgbWluKHNpemVvZih0RXBsQXBpRXZlbnRBcmcpLAorCQkJCQkgICAgIEV2ZW50Lm1fdWlFdmVudEFyZ1NpemUpKTsKKwkJCWlmIChpRXJyICE9IDApIHsJLy8gbm90IGFsbCBkYXRhIGNvdWxkIGJlIGNvcGllZAorCQkJCWlSZXQgPSAtRUlPOworCQkJCWdvdG8gRXhpdDsKKwkJCX0KKwkJCS8vIHJldHVybiB0byBFcGxBcGlQcm9jZXNzKCksIHdoaWNoIHdpbGwgY2FsbCB0aGUgYXBwbGljYXRpb24ncyBldmVudCBjYWxsYmFjayBmdW5jdGlvbgorCQkJaVJldCA9IDA7CisKKwkJCWJyZWFrOworCQl9CisKKwkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCWNhc2UgRVBMTElOX0NNRF9QSV9TRVRVUDoKKwkJeworCQkJRXBsUmV0ID0gRXBsQXBpUHJvY2Vzc0ltYWdlU2V0dXAoKTsKKwkJCWlSZXQgPSAoaW50KUVwbFJldDsKKworCQkJYnJlYWs7CisJCX0KKworCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJY2FzZSBFUExMSU5fQ01EX1BJX0lOOgorCQl7CisJCQl0RXBsQXBpUHJvY2Vzc0ltYWdlIFByb2Nlc3NJbWFnZUluOworCisJCQkvLyBzYXZlIHByb2Nlc3MgaW1hZ2Ugc3RydWN0dXJlCisJCQlpRXJyID0KKwkJCSAgICBjb3B5X2Zyb21fdXNlcigmUHJvY2Vzc0ltYWdlSW4sCisJCQkJCSAgIChjb25zdCB2b2lkICopdWxBcmdfcCwKKwkJCQkJICAgc2l6ZW9mKFByb2Nlc3NJbWFnZUluKSk7CisJCQlpZiAoaUVyciAhPSAwKSB7CisJCQkJaVJldCA9IC1FSU87CisJCQkJZ290byBFeGl0OworCQkJfQorCQkJLy8gcGFzcyBjb250cm9sIHRvIGV2ZW50IHF1ZXVlIGtlcm5lbCB0aHJlYWQKKwkJCWF0b21pY19zZXQoJkF0b21pY1N5bmNTdGF0ZV9nLCBFVkVOVF9TVEFURV9JT0NUTCk7CisKKwkJCS8vIGZhbGwgYXNsZWVwIGl0c2VsZiBpbiBvd24gd2FpdCBxdWV1ZQorCQkJaUVyciA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShXYWl0UXVldWVQSV9Jbl9nLAorCQkJCQkJCShhdG9taWNfcmVhZAorCQkJCQkJCSAoJkF0b21pY1N5bmNTdGF0ZV9nKSA9PQorCQkJCQkJCSBFVkVOVF9TVEFURV9SRUFEWSkKKwkJCQkJCQl8fAorCQkJCQkJCShhdG9taWNfcmVhZAorCQkJCQkJCSAoJkF0b21pY1N5bmNTdGF0ZV9nKSA9PQorCQkJCQkJCSBFVkVOVF9TVEFURV9URVJNKSk7CisJCQlpZiAoaUVyciAhPSAwKSB7CS8vIHdhaXRpbmcgd2FzIGludGVycnVwdGVkIGJ5IHNpZ25hbAorCQkJCS8vIHBhc3MgY29udHJvbCB0byBzeW5jIGtlcm5lbCB0aHJlYWQsIGJ1dCBzaWduYWwgdGVybWluYXRpb24KKwkJCQlhdG9taWNfc2V0KCZBdG9taWNTeW5jU3RhdGVfZywKKwkJCQkJICAgRVZFTlRfU1RBVEVfVEVSTSk7CisJCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZXYWl0UXVldWVDYlN5bmNfZyk7CisJCQkJLy8gZXhpdCB3aXRoIHRoaXMgZXJyb3IgLT4gYXBwbGljYXRpb24gd2lsbCBsZWF2ZSB0aGUgaW5maW5pdGUgbG9vcAorCQkJCWlSZXQgPSBpRXJyOworCQkJCWdvdG8gRXhpdDsKKwkJCX0gZWxzZSBpZiAoYXRvbWljX3JlYWQoJkF0b21pY1N5bmNTdGF0ZV9nKSA9PSBFVkVOVF9TVEFURV9URVJNKSB7CS8vIHRlcm1pbmF0aW9uIGluIHByb2dyZXNzCisJCQkJLy8gcGFzcyBjb250cm9sIHRvIHN5bmMga2VybmVsIHRocmVhZCwgYnV0IHNpZ25hbCB0ZXJtaW5hdGlvbgorCQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmV2FpdFF1ZXVlQ2JTeW5jX2cpOworCQkJCS8vIGV4aXQgd2l0aCB0aGlzIGVycm9yIC0+IGFwcGxpY2F0aW9uIHdpbGwgbGVhdmUgdGhlIGluZmluaXRlIGxvb3AKKwkJCQlpUmV0ID0gMTsKKwkJCQlnb3RvIEV4aXQ7CisJCQl9CisJCQkvLyBleGNoYW5nZSBwcm9jZXNzIGltYWdlCisJCQlFcGxSZXQgPSBFcGxBcGlQcm9jZXNzSW1hZ2VFeGNoYW5nZUluKCZQcm9jZXNzSW1hZ2VJbik7CisKKwkJCS8vIHJldHVybiB0byBFcGxBcGlQcm9jZXNzSW1hZ2VFeGNoYW5nZUluKCkKKwkJCWlSZXQgPSAoaW50KUVwbFJldDsKKworCQkJYnJlYWs7CisJCX0KKworCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJY2FzZSBFUExMSU5fQ01EX1BJX09VVDoKKwkJeworCQkJdEVwbEFwaVByb2Nlc3NJbWFnZSBQcm9jZXNzSW1hZ2VPdXQ7CisKKwkJCS8vIHNhdmUgcHJvY2VzcyBpbWFnZSBzdHJ1Y3R1cmUKKwkJCWlFcnIgPQorCQkJICAgIGNvcHlfZnJvbV91c2VyKCZQcm9jZXNzSW1hZ2VPdXQsCisJCQkJCSAgIChjb25zdCB2b2lkICopdWxBcmdfcCwKKwkJCQkJICAgc2l6ZW9mKFByb2Nlc3NJbWFnZU91dCkpOworCQkJaWYgKGlFcnIgIT0gMCkgeworCQkJCWlSZXQgPSAtRUlPOworCQkJCWdvdG8gRXhpdDsKKwkJCX0KKworCQkJaWYgKGF0b21pY19yZWFkKCZBdG9taWNTeW5jU3RhdGVfZykgIT0KKwkJCSAgICBFVkVOVF9TVEFURV9SRUFEWSkgeworCQkJCWlSZXQgPSAoaW50KWtFcGxJbnZhbGlkT3BlcmF0aW9uOworCQkJCWdvdG8gRXhpdDsKKwkJCX0KKwkJCS8vIGV4Y2hhbmdlIHByb2Nlc3MgaW1hZ2UKKwkJCUVwbFJldCA9CisJCQkgICAgRXBsQXBpUHJvY2Vzc0ltYWdlRXhjaGFuZ2VPdXQoJlByb2Nlc3NJbWFnZU91dCk7CisKKwkJCS8vIHBhc3MgY29udHJvbCB0byBzeW5jIGtlcm5lbCB0aHJlYWQKKwkJCWF0b21pY19zZXQoJkF0b21pY1N5bmNTdGF0ZV9nLCBFVkVOVF9TVEFURV9URVJNKTsKKwkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmV2FpdFF1ZXVlQ2JTeW5jX2cpOworCisJCQkvLyByZXR1cm4gdG8gRXBsQXBpUHJvY2Vzc0ltYWdlRXhjaGFuZ2VvdXQoKQorCQkJaVJldCA9IChpbnQpRXBsUmV0OworCisJCQlicmVhazsKKwkJfQorCisJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwljYXNlIEVQTExJTl9DTURfTk1UX0NPTU1BTkQ6CisJCXsKKwkJCS8vIGZvcndhcmQgTk1UIGNvbW1hbmQgdG8gRVBMIHN0YWNrCisJCQlFcGxSZXQgPSBFcGxBcGlFeGVjTm10Q29tbWFuZCgodEVwbE5tdEV2ZW50KSB1bEFyZ19wKTsKKworCQkJaVJldCA9IChpbnQpRXBsUmV0OworCisJCQlicmVhazsKKwkJfQorCisJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlkZWZhdWx0OgorCQl7CisJCQlicmVhazsKKwkJfQorCX0KKworICAgICAgRXhpdDoKKworLy8gICAgVFJBQ0UxKCJFUEw6IC0gRXBsTGluSW9jdGwgKGlSZXQ9JWQpXG4iLCBpUmV0KTsKKwlyZXR1cm4gKGlSZXQpOworCit9CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgUCBSIEkgViBBIFQgRSAgIEYgVSBOIEMgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworCit0RXBsS2VybmVsIFBVQkxJQyBFcGxMaW5DYkV2ZW50KHRFcGxBcGlFdmVudFR5cGUgRXZlbnRUeXBlX3AsCS8vIElOOiBldmVudCB0eXBlIChlbnVtKQorCQkJCXRFcGxBcGlFdmVudEFyZyAqIHBFdmVudEFyZ19wLAkvLyBJTjogZXZlbnQgYXJndW1lbnQgKHVuaW9uKQorCQkJCXZvaWQgR0VORVJJQyAqIHBVc2VyQXJnX3ApCit7CisJdEVwbEtlcm5lbCBFcGxSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwlpbnQgaUVycjsKKworCS8vIGJsb2NrIGFueSBmdXJ0aGVyIGNhbGwgdG8gdGhpcyBmdW5jdGlvbiwgaS5lLiBlbnRlciBjcml0aWNhbCBzZWN0aW9uCisJaUVyciA9IGRvd25faW50ZXJydXB0aWJsZSgmU2VtYXBob3JlQ2JFdmVudF9nKTsKKwlpZiAoaUVyciAhPSAwKSB7CS8vIHdhaXRpbmcgd2FzIGludGVycnVwdGVkIGJ5IHNpZ25hbAorCQlFcGxSZXQgPSBrRXBsU2h1dGRvd247CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gd2FpdCBmb3IgRXBsQXBpUHJvY2VzcygpIHRvIGNhbGwgaW9jdGwKKwkvLyBub3JtYWxseSBpdCBzaG91bGQgYmUgd2FpdGluZyBhbHJlYWR5IGZvciB1cyB0byBwYXNzIGEgbmV3IGV2ZW50CisJaUVyciA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShXYWl0UXVldWVDYkV2ZW50X2csCisJCQkJCShhdG9taWNfcmVhZCgmQXRvbWljRXZlbnRTdGF0ZV9nKSA9PQorCQkJCQkgRVZFTlRfU1RBVEVfSU9DVEwpCisJCQkJCXx8IChhdG9taWNfcmVhZCgmQXRvbWljRXZlbnRTdGF0ZV9nKSA9PQorCQkJCQkgICAgRVZFTlRfU1RBVEVfVEVSTSkpOworCWlmICgoaUVyciAhPSAwKSB8fCAoYXRvbWljX3JlYWQoJkF0b21pY0V2ZW50U3RhdGVfZykgPT0gRVZFTlRfU1RBVEVfVEVSTSkpIHsJLy8gd2FpdGluZyB3YXMgaW50ZXJydXB0ZWQgYnkgc2lnbmFsCisJCUVwbFJldCA9IGtFcGxTaHV0ZG93bjsKKwkJZ290byBMZWF2ZUNyaXRpY2FsU2VjdGlvbjsKKwl9CisJLy8gc2F2ZSBldmVudCBpbmZvcm1hdGlvbiBmb3IgaW9jdGwKKwlFdmVudFR5cGVfZyA9IEV2ZW50VHlwZV9wOworCXBFdmVudEFyZ19nID0gcEV2ZW50QXJnX3A7CisKKwkvLyBwYXNzIGNvbnRyb2wgdG8gYXBwbGljYXRpb24ncyBldmVudCBjYWxsYmFjayBmdW5jdGlvbiwgaS5lLiBFcGxBcGlQcm9jZXNzKCkKKwlhdG9taWNfc2V0KCZBdG9taWNFdmVudFN0YXRlX2csIEVWRU5UX1NUQVRFX1JFQURZKTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJldhaXRRdWV1ZVByb2Nlc3NfZyk7CisKKwkvLyBub3csIHRoZSBhcHBsaWNhdGlvbidzIGV2ZW50IGNhbGxiYWNrIGZ1bmN0aW9uIHByb2Nlc3NlcyB0aGUgZXZlbnQKKworCS8vIHdhaXQgZm9yIGNvbXBsZXRpb24gb2YgYXBwbGljYXRpb24ncyBldmVudCBjYWxsYmFjayBmdW5jdGlvbiwgaS5lLiBFcGxBcGlQcm9jZXNzKCkgY2FsbHMgaW9jdGwgYWdhaW4KKwlpRXJyID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKFdhaXRRdWV1ZUNiRXZlbnRfZywKKwkJCQkJKGF0b21pY19yZWFkKCZBdG9taWNFdmVudFN0YXRlX2cpID09CisJCQkJCSBFVkVOVF9TVEFURV9JT0NUTCkKKwkJCQkJfHwgKGF0b21pY19yZWFkKCZBdG9taWNFdmVudFN0YXRlX2cpID09CisJCQkJCSAgICBFVkVOVF9TVEFURV9URVJNKSk7CisJaWYgKChpRXJyICE9IDApIHx8IChhdG9taWNfcmVhZCgmQXRvbWljRXZlbnRTdGF0ZV9nKSA9PSBFVkVOVF9TVEFURV9URVJNKSkgewkvLyB3YWl0aW5nIHdhcyBpbnRlcnJ1cHRlZCBieSBzaWduYWwKKwkJRXBsUmV0ID0ga0VwbFNodXRkb3duOworCQlnb3RvIExlYXZlQ3JpdGljYWxTZWN0aW9uOworCX0KKwkvLyByZWFkIHJldHVybiBjb2RlIGZyb20gYXBwbGljYXRpb24ncyBldmVudCBjYWxsYmFjayBmdW5jdGlvbgorCUVwbFJldCA9IFJldENiRXZlbnRfZzsKKworICAgICAgTGVhdmVDcml0aWNhbFNlY3Rpb246CisJdXAoJlNlbWFwaG9yZUNiRXZlbnRfZyk7CisKKyAgICAgIEV4aXQ6CisJLy8gY2hlY2sgaWYgTk1UX0dTX09GRiBpcyByZWFjaGVkCisJaWYgKEV2ZW50VHlwZV9wID09IGtFcGxBcGlFdmVudE5tdFN0YXRlQ2hhbmdlKSB7CisJCWlmIChwRXZlbnRBcmdfcC0+bV9ObXRTdGF0ZUNoYW5nZS5tX05ld05tdFN0YXRlID09IGtFcGxObXRHc09mZikgewkvLyBOTVQgc3RhdGUgbWFjaGluZSB3YXMgc2h1dCBkb3duCisJCQlUUkFDRTAoIkVQTDogICBFcGxMaW5DYkV2ZW50KE5NVF9HU19PRkYpXG4iKTsKKwkJCXVpRXBsU3RhdGVfZyA9IEVQTF9TVEFURV9TSFVURE9XTjsKKwkJCWF0b21pY19zZXQoJkF0b21pY0V2ZW50U3RhdGVfZywgRVZFTlRfU1RBVEVfVEVSTSk7CisJCQl3YWtlX3VwKCZXYWl0UXVldWVSZWxlYXNlX2cpOworCQl9IGVsc2UgewkvLyBOTVQgc3RhdGUgbWFjaGluZSBpcyBydW5uaW5nCisJCQl1aUVwbFN0YXRlX2cgPSBFUExfU1RBVEVfUlVOTklORzsKKwkJfQorCX0KKworCXJldHVybiBFcGxSZXQ7Cit9CisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbExpbkNiU3luYyh2b2lkKQoreworCXRFcGxLZXJuZWwgRXBsUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJaW50IGlFcnI7CisKKwkvLyBjaGVjayBpZiB1c2VyIHByb2Nlc3Mgd2FpdHMgZm9yIHN5bmMKKwlpZiAoYXRvbWljX3JlYWQoJkF0b21pY1N5bmNTdGF0ZV9nKSA9PSBFVkVOVF9TVEFURV9JT0NUTCkgeworCQkvLyBwYXNzIGNvbnRyb2wgdG8gYXBwbGljYXRpb24sIGkuZS4gRXBsQXBpUHJvY2Vzc0ltYWdlRXhjaGFuZ2VJbigpCisJCWF0b21pY19zZXQoJkF0b21pY1N5bmNTdGF0ZV9nLCBFVkVOVF9TVEFURV9SRUFEWSk7CisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmV2FpdFF1ZXVlUElfSW5fZyk7CisKKwkJLy8gbm93LCB0aGUgYXBwbGljYXRpb24gcHJvY2Vzc2VzIHRoZSBzeW5jIGV2ZW50CisKKwkJLy8gd2FpdCBmb3IgY2FsbCBvZiBFcGxBcGlQcm9jZXNzSW1hZ2VFeGNoYW5nZU91dCgpCisJCWlFcnIgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoV2FpdFF1ZXVlQ2JTeW5jX2csCisJCQkJCQkoYXRvbWljX3JlYWQoJkF0b21pY1N5bmNTdGF0ZV9nKQorCQkJCQkJID09IEVWRU5UX1NUQVRFX0lPQ1RMKQorCQkJCQkJfHwKKwkJCQkJCShhdG9taWNfcmVhZCgmQXRvbWljU3luY1N0YXRlX2cpCisJCQkJCQkgPT0gRVZFTlRfU1RBVEVfVEVSTSkpOworCQlpZiAoKGlFcnIgIT0gMCkgfHwgKGF0b21pY19yZWFkKCZBdG9taWNFdmVudFN0YXRlX2cpID09IEVWRU5UX1NUQVRFX0lPQ1RMKSkgewkvLyB3YWl0aW5nIHdhcyBpbnRlcnJ1cHRlZCBieSBzaWduYWwgb3IgYXBwbGljYXRpb24gY2FsbGVkIHdyb25nIGZ1bmN0aW9uCisJCQlFcGxSZXQgPSBrRXBsU2h1dGRvd247CisJCX0KKwl9IGVsc2UgewkJLy8gYXBwbGljYXRpb24gaXMgY3VycmVudGx5IG5vdCB3YWl0aW5nIGZvciBzeW5jCisJCS8vIGNvbnRpbnVlIHdpdGhvdXQgaW50ZXJydXB0aW9uCisJCS8vIFRQRE8gYXJlIHNldCB2YWxpZCBieSBjYWxsZXIgKGkuZS4gRXBsRXZlbnRrUHJvY2VzcygpKQorCX0KKworCVRHVF9EQkdfU0lHTkFMX1RSQUNFX1BPSU5UKDEpOworCisJcmV0dXJuIEVwbFJldDsKK30KKworLy8gRU9GCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbEFwaVByb2Nlc3NJbWFnZS5jIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxBcGlQcm9jZXNzSW1hZ2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjJmZGYyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxBcGlQcm9jZXNzSW1hZ2UuYwpAQCAtMCwwICsxLDM0NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIHNvdXJjZSBmaWxlIGZvciBFUEwgQVBJIG1vZHVsZSAocHJvY2VzcyBpbWFnZSkKKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgICAgICAgICRSQ1NmaWxlOiBFcGxBcGlQcm9jZXNzSW1hZ2UuYyx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuNyAkICAkRGF0ZTogMjAwOC8xMS8xMyAxNzoxMzowOSAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICAgICAgR0NDIFYzLjQKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUmV2aXNpb24gSGlzdG9yeToKKworICAyMDA2LzEwLzEwIGQuay46ICAgc3RhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uLCB2ZXJzaW9uIDEuMDAKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkVwbC5oIgorLy8jaW5jbHVkZSAia2VybmVsL0VwbFBkb2tDYWwuaCIKKworI2lmIChUQVJHRVRfU1lTVEVNID09IF9MSU5VWF8pICYmIGRlZmluZWQoX19LRVJORUxfXykKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIEcgTCBPIEIgQSBMICAgRCBFIEYgSSBOIEkgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBtb2R1bCBnbG9iYWxlIHZhcnMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICBDIEwgQSBTIFMgIEVwbEFwaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLy8KKy8vIERlc2NyaXB0aW9uOgorLy8KKy8vCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgIFAgUiBJIFYgQSBUIEUgICBEIEUgRiBJIE4gSSBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvbnN0IGRlZmluZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCB0eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmICgoRVBMX0FQSV9QUk9DRVNTX0lNQUdFX1NJWkVfSU4gPiAwKSB8fCAoRVBMX0FQSV9QUk9DRVNTX0lNQUdFX1NJWkVfT1VUID4gMCkpCit0eXBlZGVmIHN0cnVjdCB7CisjaWYgRVBMX0FQSV9QUk9DRVNTX0lNQUdFX1NJWkVfSU4gPiAwCisJQllURSBtX2FiUHJvY2Vzc0ltYWdlSW5wdXRbRVBMX0FQSV9QUk9DRVNTX0lNQUdFX1NJWkVfSU5dOworI2VuZGlmCisjaWYgRVBMX0FQSV9QUk9DRVNTX0lNQUdFX1NJWkVfT1VUID4gMAorCUJZVEUgbV9hYlByb2Nlc3NJbWFnZU91dHB1dFtFUExfQVBJX1BST0NFU1NfSU1BR0VfU0laRV9PVVRdOworI2VuZGlmCisKK30gdEVwbEFwaVByb2Nlc3NJbWFnZUluc3RhbmNlOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgdmFycworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHRFcGxBcGlQcm9jZXNzSW1hZ2VJbnN0YW5jZSBFcGxBcGlQcm9jZXNzSW1hZ2VJbnN0YW5jZV9nOworI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgIFAgVSBCIEwgSSBDICAgRiBVIE4gQyBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsQXBpUHJvY2Vzc0ltYWdlU2V0dXAoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBzZXRzIHVwIHN0YXRpYyBwcm9jZXNzIGltYWdlCisvLworLy8gUGFyYW1ldGVyczogIChub25lKQorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsQXBpUHJvY2Vzc0ltYWdlU2V0dXAodm9pZCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworI2lmICgoRVBMX0FQSV9QUk9DRVNTX0lNQUdFX1NJWkVfSU4gPiAwKSB8fCAoRVBMX0FQSV9QUk9DRVNTX0lNQUdFX1NJWkVfT1VUID4gMCkpCisJdW5zaWduZWQgaW50IHVpVmFyRW50cmllczsKKwl0RXBsT2JkU2l6ZSBPYmRTaXplOworI2VuZGlmCisKKyNpZiBFUExfQVBJX1BST0NFU1NfSU1BR0VfU0laRV9JTiA+IDAKKwl1aVZhckVudHJpZXMgPSBFUExfQVBJX1BST0NFU1NfSU1BR0VfU0laRV9JTjsKKwlPYmRTaXplID0gMTsKKwlSZXQgPSBFcGxBcGlMaW5rT2JqZWN0KDB4MjAwMCwKKwkJCSAgICAgICBFcGxBcGlQcm9jZXNzSW1hZ2VJbnN0YW5jZV9nLgorCQkJICAgICAgIG1fYWJQcm9jZXNzSW1hZ2VJbnB1dCwgJnVpVmFyRW50cmllcywgJk9iZFNpemUsCisJCQkgICAgICAgMSk7CisKKwl1aVZhckVudHJpZXMgPSBFUExfQVBJX1BST0NFU1NfSU1BR0VfU0laRV9JTjsKKwlPYmRTaXplID0gMTsKKwlSZXQgPSBFcGxBcGlMaW5rT2JqZWN0KDB4MjAwMSwKKwkJCSAgICAgICBFcGxBcGlQcm9jZXNzSW1hZ2VJbnN0YW5jZV9nLgorCQkJICAgICAgIG1fYWJQcm9jZXNzSW1hZ2VJbnB1dCwgJnVpVmFyRW50cmllcywgJk9iZFNpemUsCisJCQkgICAgICAgMSk7CisKKwlPYmRTaXplID0gMjsKKwl1aVZhckVudHJpZXMgPSBFUExfQVBJX1BST0NFU1NfSU1BR0VfU0laRV9JTiAvIE9iZFNpemU7CisJUmV0ID0gRXBsQXBpTGlua09iamVjdCgweDIwMTAsCisJCQkgICAgICAgRXBsQXBpUHJvY2Vzc0ltYWdlSW5zdGFuY2VfZy4KKwkJCSAgICAgICBtX2FiUHJvY2Vzc0ltYWdlSW5wdXQsICZ1aVZhckVudHJpZXMsICZPYmRTaXplLAorCQkJICAgICAgIDEpOworCisJT2JkU2l6ZSA9IDI7CisJdWlWYXJFbnRyaWVzID0gRVBMX0FQSV9QUk9DRVNTX0lNQUdFX1NJWkVfSU4gLyBPYmRTaXplOworCVJldCA9IEVwbEFwaUxpbmtPYmplY3QoMHgyMDExLAorCQkJICAgICAgIEVwbEFwaVByb2Nlc3NJbWFnZUluc3RhbmNlX2cuCisJCQkgICAgICAgbV9hYlByb2Nlc3NJbWFnZUlucHV0LCAmdWlWYXJFbnRyaWVzLCAmT2JkU2l6ZSwKKwkJCSAgICAgICAxKTsKKworCU9iZFNpemUgPSA0OworCXVpVmFyRW50cmllcyA9IEVQTF9BUElfUFJPQ0VTU19JTUFHRV9TSVpFX0lOIC8gT2JkU2l6ZTsKKwlSZXQgPSBFcGxBcGlMaW5rT2JqZWN0KDB4MjAyMCwKKwkJCSAgICAgICBFcGxBcGlQcm9jZXNzSW1hZ2VJbnN0YW5jZV9nLgorCQkJICAgICAgIG1fYWJQcm9jZXNzSW1hZ2VJbnB1dCwgJnVpVmFyRW50cmllcywgJk9iZFNpemUsCisJCQkgICAgICAgMSk7CisKKwlPYmRTaXplID0gNDsKKwl1aVZhckVudHJpZXMgPSBFUExfQVBJX1BST0NFU1NfSU1BR0VfU0laRV9JTiAvIE9iZFNpemU7CisJUmV0ID0gRXBsQXBpTGlua09iamVjdCgweDIwMjEsCisJCQkgICAgICAgRXBsQXBpUHJvY2Vzc0ltYWdlSW5zdGFuY2VfZy4KKwkJCSAgICAgICBtX2FiUHJvY2Vzc0ltYWdlSW5wdXQsICZ1aVZhckVudHJpZXMsICZPYmRTaXplLAorCQkJICAgICAgIDEpOworI2VuZGlmCisKKyNpZiBFUExfQVBJX1BST0NFU1NfSU1BR0VfU0laRV9PVVQgPiAwCisJdWlWYXJFbnRyaWVzID0gRVBMX0FQSV9QUk9DRVNTX0lNQUdFX1NJWkVfT1VUOworCU9iZFNpemUgPSAxOworCVJldCA9IEVwbEFwaUxpbmtPYmplY3QoMHgyMDMwLAorCQkJICAgICAgIEVwbEFwaVByb2Nlc3NJbWFnZUluc3RhbmNlX2cuCisJCQkgICAgICAgbV9hYlByb2Nlc3NJbWFnZU91dHB1dCwgJnVpVmFyRW50cmllcywgJk9iZFNpemUsCisJCQkgICAgICAgMSk7CisKKwl1aVZhckVudHJpZXMgPSBFUExfQVBJX1BST0NFU1NfSU1BR0VfU0laRV9PVVQ7CisJT2JkU2l6ZSA9IDE7CisJUmV0ID0gRXBsQXBpTGlua09iamVjdCgweDIwMzEsCisJCQkgICAgICAgRXBsQXBpUHJvY2Vzc0ltYWdlSW5zdGFuY2VfZy4KKwkJCSAgICAgICBtX2FiUHJvY2Vzc0ltYWdlT3V0cHV0LCAmdWlWYXJFbnRyaWVzLCAmT2JkU2l6ZSwKKwkJCSAgICAgICAxKTsKKworCU9iZFNpemUgPSAyOworCXVpVmFyRW50cmllcyA9IEVQTF9BUElfUFJPQ0VTU19JTUFHRV9TSVpFX09VVCAvIE9iZFNpemU7CisJUmV0ID0gRXBsQXBpTGlua09iamVjdCgweDIwNDAsCisJCQkgICAgICAgRXBsQXBpUHJvY2Vzc0ltYWdlSW5zdGFuY2VfZy4KKwkJCSAgICAgICBtX2FiUHJvY2Vzc0ltYWdlT3V0cHV0LCAmdWlWYXJFbnRyaWVzLCAmT2JkU2l6ZSwKKwkJCSAgICAgICAxKTsKKworCU9iZFNpemUgPSAyOworCXVpVmFyRW50cmllcyA9IEVQTF9BUElfUFJPQ0VTU19JTUFHRV9TSVpFX09VVCAvIE9iZFNpemU7CisJUmV0ID0gRXBsQXBpTGlua09iamVjdCgweDIwNDEsCisJCQkgICAgICAgRXBsQXBpUHJvY2Vzc0ltYWdlSW5zdGFuY2VfZy4KKwkJCSAgICAgICBtX2FiUHJvY2Vzc0ltYWdlT3V0cHV0LCAmdWlWYXJFbnRyaWVzLCAmT2JkU2l6ZSwKKwkJCSAgICAgICAxKTsKKworCU9iZFNpemUgPSA0OworCXVpVmFyRW50cmllcyA9IEVQTF9BUElfUFJPQ0VTU19JTUFHRV9TSVpFX09VVCAvIE9iZFNpemU7CisJUmV0ID0gRXBsQXBpTGlua09iamVjdCgweDIwNTAsCisJCQkgICAgICAgRXBsQXBpUHJvY2Vzc0ltYWdlSW5zdGFuY2VfZy4KKwkJCSAgICAgICBtX2FiUHJvY2Vzc0ltYWdlT3V0cHV0LCAmdWlWYXJFbnRyaWVzLCAmT2JkU2l6ZSwKKwkJCSAgICAgICAxKTsKKworCU9iZFNpemUgPSA0OworCXVpVmFyRW50cmllcyA9IEVQTF9BUElfUFJPQ0VTU19JTUFHRV9TSVpFX09VVCAvIE9iZFNpemU7CisJUmV0ID0gRXBsQXBpTGlua09iamVjdCgweDIwNTEsCisJCQkgICAgICAgRXBsQXBpUHJvY2Vzc0ltYWdlSW5zdGFuY2VfZy4KKwkJCSAgICAgICBtX2FiUHJvY2Vzc0ltYWdlT3V0cHV0LCAmdWlWYXJFbnRyaWVzLCAmT2JkU2l6ZSwKKwkJCSAgICAgICAxKTsKKyNlbmRpZgorCisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBGdW5jdGlvbjogICAgRXBsQXBpUHJvY2Vzc0ltYWdlRXhjaGFuZ2VJbigpCisvLworLy8gRGVzY3JpcHRpb246IHJlcGxhY2VzIHBhc3NlZCBpbnB1dCBwcm9jZXNzIGltYWdlIHdpdGggdGhlIG9uZSBvZiBFUEwgc3RhY2sKKy8vCisvLyBQYXJhbWV0ZXJzOiAgcFBJX3AgICAgICAgICAgICAgICAgICAgPSBpbnB1dCBwcm9jZXNzIGltYWdlCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vIFN0YXRlOgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbEFwaVByb2Nlc3NJbWFnZUV4Y2hhbmdlSW4odEVwbEFwaVByb2Nlc3NJbWFnZSAqIHBQSV9wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKyNpZiBFUExfQVBJX1BST0NFU1NfSU1BR0VfU0laRV9JTiA+IDAKKyNpZiAoVEFSR0VUX1NZU1RFTSA9PSBfTElOVVhfKSAmJiBkZWZpbmVkKF9fS0VSTkVMX18pCisJY29weV90b191c2VyKHBQSV9wLT5tX3BJbWFnZSwKKwkJICAgICBFcGxBcGlQcm9jZXNzSW1hZ2VJbnN0YW5jZV9nLm1fYWJQcm9jZXNzSW1hZ2VJbnB1dCwKKwkJICAgICBtaW4ocFBJX3AtPm1fdWlTaXplLAorCQkJIHNpemVvZihFcGxBcGlQcm9jZXNzSW1hZ2VJbnN0YW5jZV9nLgorCQkJCW1fYWJQcm9jZXNzSW1hZ2VJbnB1dCkpKTsKKyNlbHNlCisJRVBMX01FTUNQWShwUElfcC0+bV9wSW1hZ2UsCisJCSAgIEVwbEFwaVByb2Nlc3NJbWFnZUluc3RhbmNlX2cubV9hYlByb2Nlc3NJbWFnZUlucHV0LAorCQkgICBtaW4ocFBJX3AtPm1fdWlTaXplLAorCQkgICAgICAgc2l6ZW9mKEVwbEFwaVByb2Nlc3NJbWFnZUluc3RhbmNlX2cuCisJCQkgICAgICBtX2FiUHJvY2Vzc0ltYWdlSW5wdXQpKSk7CisjZW5kaWYKKyNlbmRpZgorCisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBGdW5jdGlvbjogICAgRXBsQXBpUHJvY2Vzc0ltYWdlRXhjaGFuZ2VPdXQoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBjb3BpZXMgcGFzc2VkIG91dHB1dCBwcm9jZXNzIGltYWdlIHRvIEVQTCBzdGFjay4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgcFBJX3AgICAgICAgICAgICAgICAgICAgPSBvdXRwdXQgcHJvY2VzcyBpbWFnZQorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLyBTdGF0ZToKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIFBVQkxJQyBFcGxBcGlQcm9jZXNzSW1hZ2VFeGNoYW5nZU91dCh0RXBsQXBpUHJvY2Vzc0ltYWdlICogcFBJX3ApCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworI2lmIEVQTF9BUElfUFJPQ0VTU19JTUFHRV9TSVpFX09VVCA+IDAKKyNpZiAoVEFSR0VUX1NZU1RFTSA9PSBfTElOVVhfKSAmJiBkZWZpbmVkKF9fS0VSTkVMX18pCisJY29weV9mcm9tX3VzZXIoRXBsQXBpUHJvY2Vzc0ltYWdlSW5zdGFuY2VfZy5tX2FiUHJvY2Vzc0ltYWdlT3V0cHV0LAorCQkgICAgICAgcFBJX3AtPm1fcEltYWdlLAorCQkgICAgICAgbWluKHBQSV9wLT5tX3VpU2l6ZSwKKwkJCSAgIHNpemVvZihFcGxBcGlQcm9jZXNzSW1hZ2VJbnN0YW5jZV9nLgorCQkJCSAgbV9hYlByb2Nlc3NJbWFnZU91dHB1dCkpKTsKKyNlbHNlCisJRVBMX01FTUNQWShFcGxBcGlQcm9jZXNzSW1hZ2VJbnN0YW5jZV9nLm1fYWJQcm9jZXNzSW1hZ2VPdXRwdXQsCisJCSAgIHBQSV9wLT5tX3BJbWFnZSwKKwkJICAgbWluKHBQSV9wLT5tX3VpU2l6ZSwKKwkJICAgICAgIHNpemVvZihFcGxBcGlQcm9jZXNzSW1hZ2VJbnN0YW5jZV9nLgorCQkJICAgICAgbV9hYlByb2Nlc3NJbWFnZU91dHB1dCkpKTsKKyNlbmRpZgorI2VuZGlmCisKKwlyZXR1cm4gUmV0OworfQorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgIFAgUiBJIFYgQSBUIEUgICBGIFUgTiBDIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKworLy8gRU9GCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbENmZy5oIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxDZmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGU5NThhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxDZmcuaApAQCAtMCwwICsxLDE5NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIGNvbmZpZ3VyYXRpb24gZmlsZQorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgJFJDU2ZpbGU6IEVwbENmZy5oLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS40ICQgICREYXRlOiAyMDA4LzEwLzE3IDE1OjMyOjMyICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorICAgICAgICAgICAgICAgICAgICAuLi4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUmV2aXNpb24gSGlzdG9yeToKKworICAyMDA2LzA2LzA2ICAgIGsudC46IFN0YXJ0IG9mIEltcGxlbWVudGF0aW9uCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX0VQTENGR19IXworI2RlZmluZSBfRVBMQ0ZHX0hfCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIGdlbmVyaWMgZGVmaW5lcyB3aGljaCBmb3Igd2hvbGUgRVBMIFN0YWNrCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjZGVmaW5lIEVQTF9VU0VfREVMRVRFSU5TVF9GVU5DIFRSVUUKKworLy8gbmVlZGVkIHRvIHN1cHBvcnQgZGF0YXR5cGVzIG92ZXIgMzIgYml0IGJ5IGdsb2JhbC5oCisjZGVmaW5lIFVTRV9WQVI2NAorCisvLyBFUExfTUFYX0lOU1RBTkNFUyBzcGVjaWZpZXMgY291bnQgb2YgaW5zdGFuY2VzIG9mIGFsbCBFUEwgbW9kdWxlcy4KKy8vIElmIGl0IGlzIGdyZWF0ZXIgdGhhbiAxIHRoZSBmaXJzdCBwYXJhbWV0ZXIgb2YgYWxsCisvLyBmdW5jdGlvbnMgaXMgdGhlIGluc3RhbmNlIG51bWJlci4KKyNkZWZpbmUgRVBMX01BWF9JTlNUQU5DRVMgICAgICAgICAgICAgICAxCisKKy8vIFRoaXMgZGVmaW5lcyB0aGUgdGFyZ2V0IGhhcmR3YXJlLiBIZXJlIGlzIGVuY29kZWQgd2ljaCBDUFUgYW5kIHdpY2ggZXh0ZXJuYWwKKy8vIHBlcmlwaGVyYWxzIGFyZSBjb25uZWN0ZWQuIEZvciBwb3NzaWJsZSB2YWx1ZXMgcmVmZXJlIHRvIHRhcmdldC5oLiBJZgorLy8gbmVjZXNzYXJ5IHZhbHVlIGlzIG5vdCBhdmFpbGFibGUgRVBMIHN0YWNrIGhhcyB0bworLy8gYmUgYWRhcHRlZCBhbmQgdGVzdGVkLgorI2RlZmluZSBUQVJHRVRfSEFSRFdBUkUgICAgICAgICAgICAgICAgIFRHVEhXX1BDX1dSQVBQCisKKy8vIHVzZSBubyBGSUZPcywgbWFrZSBkaXJlY3QgY2FsbHMKKy8vI2RlZmluZSBFUExfTk9fRklGTworCisvLyB1c2Ugbm8gSVBDIGJldHdlZW4gdXNlci0gYW5kIGtlcm5lbHNwYWNlIG1vZHVsZXMsIG1ha2UgZGlyZWN0IGNhbGxzCisjZGVmaW5lIEVQTF9OT19VU0VSX0tFUk5FTAorCisjaWZuZGVmIEJFTkNITUFSS19NT0RVTEVTCisjZGVmaW5lIEJFTkNITUFSS19NT0RVTEVTICAgICAgIDAJLy8weEVFODAwMDQyTAorI2VuZGlmCisKKy8vIERlZmF1bHQgZGVmdWcgbGV2ZWw6CisvLyBPbmx5IGRlYnVnIHRyYWNlcyBvZiB0aGVzZSBtb2R1bGVzIHdpbGwgYmUgY29tcGlsZWQgd2hpY2ggZmxhZ3MgYXJlIHNldCBpbiBkZWZpbmUgREVGX0RFQlVHX0xWTC4KKyNpZm5kZWYgREVGX0RFQlVHX0xWTAorI2RlZmluZSBERUZfREVCVUdfTFZMICAgICAgICAgICAweEVDMDAwMDAwTAorI2VuZGlmCisvLyAgIEVQTF9EQkdMVkxfT0JEICAgICAgICAgPSAgIDB4MDAwMDAwMDRMCisvLyAqIEVQTF9EQkdMVkxfQVNTRVJUICAgICAgPSAgIDB4MjAwMDAwMDBMCisvLyAqIEVQTF9EQkdMVkxfRVJST1IgICAgICAgPSAgIDB4NDAwMDAwMDBMCisvLyAqIEVQTF9EQkdMVkxfQUxXQVlTICAgICAgPSAgIDB4ODAwMDAwMDBMCisKKy8vIEVQTF9NT0RVTEVfSU5URUdSQVRJT04gZGVmaW5lcyBhbGwgbW9kdWxlcyB3aGljaCBhcmUgaW5jbHVkZWQgaW4KKy8vIEVQTCBhcHBsaWNhdGlvbi4gUGxlYXNlIGFkZCBvciBkZWxldGUgbW9kdWxlcyBmb3IgeW91ciBhcHBsaWNhdGlvbi4KKyNkZWZpbmUgRVBMX01PRFVMRV9JTlRFR1JBVElPTiBFUExfTU9EVUxFX09CREsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRVBMX01PRFVMRV9QRE9LIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEVQTF9NT0RVTEVfTk1UX01OIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEVQTF9NT0RVTEVfU0RPUyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBFUExfTU9EVUxFX1NET0MgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRVBMX01PRFVMRV9TRE9fQVNORCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBFUExfTU9EVUxFX1NET19VRFAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRVBMX01PRFVMRV9OTVRfQ04gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRVBMX01PRFVMRV9OTVRVIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEVQTF9NT0RVTEVfTk1USyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBFUExfTU9EVUxFX0RMTEsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRVBMX01PRFVMRV9ETExVIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEVQTF9NT0RVTEVfVkVUSAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBFUExfTU9EVUxFX09CRFUKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gRVBMIGV0aGVybmV0IGRyaXZlciAoRWRydikgc3BlY2lmaWMgZGVmaW5lcworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisvLyBzd2l0Y2ggdGhpcyBkZWZpbmUgdG8gVFJVRSBpZiBFZHJ2IHN1cHBvcnRzIGZhc3QgdHggZnJhbWVzCisjZGVmaW5lIEVEUlZfRkFTVF9UWEZSQU1FUyAgICAgICAgICAgICAgRkFMU0UKKy8vI2RlZmluZSBFRFJWX0ZBU1RfVFhGUkFNRVMgICAgICAgICAgICAgIFRSVUUKKworLy8gc3dpdGNoIHRoaXMgZGVmaW5lIHRvIFRSVUUgaWYgRWRydiBzdXBwb3J0cyBlYXJseSByZWNlaXZlIGludGVycnVwdHMKKyNkZWZpbmUgRURSVl9FQVJMWV9SWF9JTlQgICAgICAgICAgICAgICBGQUxTRQorLy8jZGVmaW5lIEVEUlZfRUFSTFlfUlhfSU5UICAgICAgICAgICAgICAgVFJVRQorCisvLyBlbmFibGVzIHNldHRpbmcgb2Ygc2V2ZXJhbCBwb3J0IHBpbnMgZm9yIGJlbmNobWFya2luZyBwdXJwb3NlcworI2RlZmluZSBFRFJWX0JFTkNITUFSSyAgICAgICAgICAgICAgICAgIEZBTFNFCisvLyNkZWZpbmUgRURSVl9CRU5DSE1BUksgICAgICAgICAgICAgICAgICBUUlVFIC8vIE1DRl9HUElPX1BPRFJfUENJQlIKKworLy8gQ2FsbCBUeCBoYW5kbGVyIChpLmUuIEVwbERsbENiRnJhbWVUcmFuc21pdHRlZCgpKSBhbHJlYWR5IGlmIERNQSBoYXMgZmluaXNoZWQsCisvLyBvdGhlcndpc2UgY2FsbCB0aGUgVHggaGFuZGxlciBpZiBmcmFtZSB3YXMgYWN0dWFsbHkgdHJhbnNtaXR0ZWQgb3ZlciBldGhlcm5ldC4KKyNkZWZpbmUgRURSVl9ETUFfVFhfSEFORExFUiAgICAgICAgICAgICBGQUxTRQorLy8jZGVmaW5lIEVEUlZfRE1BX1RYX0hBTkRMRVIgICAgICAgICAgICAgVFJVRQorCisvLyBudW1iZXIgb2YgdXNlZCBldGhlcm5ldCBjb250cm9sbGVyCisvLyNkZWZpbmUgRURSVl9VU0VEX0VUSF9DVFJMICAgICAgICAgICAgICAxCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIERhdGEgTGluayBMYXllciAoRExMKSBzcGVjaWZpYyBkZWZpbmVzCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKy8vIHN3aXRjaCB0aGlzIGRlZmluZSB0byBUUlVFIGlmIEVkcnYgc3VwcG9ydHMgZmFzdCB0eCBmcmFtZXMKKy8vIGFuZCBETEwgc2hhbGwgcGFzcyBQUmVzIGFzIHJlYWR5IHRvIEVkcnYgYWZ0ZXIgU29DCisjZGVmaW5lIEVQTF9ETExfUFJFU19SRUFEWV9BRlRFUl9TT0MgICAgRkFMU0UKKy8vI2RlZmluZSBFUExfRExMX1BSRVNfUkVBRFlfQUZURVJfU09DICAgIFRSVUUKKworLy8gc3dpdGNoIHRoaXMgZGVmaW5lIHRvIFRSVUUgaWYgRWRydiBzdXBwb3J0cyBmYXN0IHR4IGZyYW1lcworLy8gYW5kIERMTCBzaGFsbCBwYXNzIFBSZXMgYXMgcmVhZHkgdG8gRWRydiBhZnRlciBTb0EKKyNkZWZpbmUgRVBMX0RMTF9QUkVTX1JFQURZX0FGVEVSX1NPQSAgICBGQUxTRQorLy8jZGVmaW5lIEVQTF9ETExfUFJFU19SRUFEWV9BRlRFUl9TT0EgICAgVFJVRQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBPQkQgc3BlY2lmaWMgZGVmaW5lcworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisvLyBzd2l0Y2ggdGhpcyBkZWZpbmUgdG8gVFJVRSBpZiBFcGwgc2hvdWxkIGNvbXBhcmUgb2JqZWN0IHJhbmdlCisvLyBhdXRvbWF0aWNseQorI2RlZmluZSBFUExfT0JEX0NIRUNLX09CSkVDVF9SQU5HRSAgICAgICAgICBGQUxTRQorLy8jZGVmaW5lIEVQTF9PQkRfQ0hFQ0tfT0JKRUNUX1JBTkdFICAgICAgICAgIFRSVUUKKworLy8gc2V0IHRoaXMgZGVmaW5lIHRvIFRSVUUgaWYgdGhlcmUgYXJlIHN0cmluZ3Mgb3IgZG9tYWlucyBpbiBPRCwgd2hpY2gKKy8vIG1heSBiZSBjaGFuZ2VkIGluIG9iamVjdCBzaXplIGFuZC9vciBvYmplY3QgZGF0YSBwb2ludGVyIGJ5IGl0cyBvYmplY3QKKy8vIGNhbGxiYWNrIGZ1bmN0aW9uIChjYWxsZWQgZXZlbnQga09iZEV2V3JTdHJpbmdEb21haW4pCisvLyNkZWZpbmUgRVBMX09CRF9VU0VfU1RSSU5HX0RPTUFJTl9JTl9SQU0gICAgRkFMU0UKKyNkZWZpbmUgRVBMX09CRF9VU0VfU1RSSU5HX0RPTUFJTl9JTl9SQU0gICAgVFJVRQorCisjZGVmaW5lIEVQTF9PQkRfVVNFX1ZBUklBQkxFX1NVQklOREVYX1RBQiBUUlVFCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIFRpbWVyIG1vZHVsZSBzcGVjaWZpYyBkZWZpbmVzCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKy8vIGlmIFRSVUUgaXQgdXNlcyB0aGUgVGltZXIgbW9kdWxlIGltcGxlbWVudGF0aW9uIG9mIEVQTCB1c2VyIGFsc28gaW4gRVBMIGtlcm5lbAorI2RlZmluZSBFUExfVElNRVJfVVNFX1VTRVIgICAgICAgICAgICAgIFRSVUUKKworLy8gaWYgVFJVRSB0aGUgaGlnaCByZXNvbHV0aW9uIHRpbWVyIG1vZHVsZSB3aWxsIGJlIHVzZWQKKyNkZWZpbmUgRVBMX1RJTUVSX1VTRV9ISUdIUkVTICAgICAgICAgICAgICBUUlVFCisvLyNkZWZpbmUgRVBMX1RJTUVSX1VTRV9ISUdIUkVTICAgICAgICAgICAgICBGQUxTRQorCisjZW5kaWYgLy9fRVBMQ0ZHX0hfCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbERlZi5oIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxEZWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZGM4MTA4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxEZWYuaApAQCAtMCwwICsxLDM1NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIGluY2x1ZGUgZmlsZSBmb3IgRVBMIGRlZmF1bHQgY29uc3RhbnRzCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRXBsRGVmLmgsdiAkCisKKyAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAorCisgICAgICAgICAgICAgICAgJFJldmlzaW9uOiAxLjE1ICQgICREYXRlOiAyMDA4LzEwLzE3IDE1OjMyOjMyICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorICAgICAgICAgICAgICAgICAgICBHQ0MgVjMuNAorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgIDIwMDYvMDUvMjIgZC5rLjogICBzdGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24sIHZlcnNpb24gMS4wMAorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9FUExfREVGX0hfCisjZGVmaW5lIF9FUExfREVGX0hfCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZGVmaW5lIEVQTF9DX0FEUl9CUk9BRENBU1QgICAgICAgICAweEZGCS8vIEVQTCBicm9hZGNhc3QgYWRkcmVzcworI2RlZmluZSBFUExfQ19BRFJfRElBR19ERUZfTk9ERV9JRCAgMHhGRAkvLyBFUEwgZGVmYXVsdCBhZGRyZXNzIG9mIGRpZ25vc3RpYyBkZXZpY2UKKyNkZWZpbmUgRVBMX0NfQURSX0RVTU1ZX05PREVfSUQgICAgIDB4RkMJLy8gRVBMIGR1bW15IG5vZGUgYWRkcmVzcworI2RlZmluZSBFUExfQ19BRFJfSU5WQUxJRCAgICAgICAgICAgMHgwMAkvLyBpbnZhbGlkIEVQTCBhZGRyZXNzCisjZGVmaW5lIEVQTF9DX0FEUl9NTl9ERUZfTk9ERV9JRCAgICAweEYwCS8vIEVQTCBkZWZhdWx0IGFkZHJlc3Mgb2YgTU4KKyNkZWZpbmUgRVBMX0NfQURSX1JUMV9ERUZfTk9ERV9JRCAgIDB4RkUJLy8gRVBMIGRlZmF1bHQgYWRkcmVzcyBvZiByb3V0ZXIgdHlwZSAxCisjZGVmaW5lIEVQTF9DX0RMTF9BU05EX1BSSU9fTk1UUlFTVCA3CS8vIGluY3JlYXNlZCBBU25kIHJlcXVlc3QgcHJpb3JpdHkgdG8gYmUgdXNlZCBieSBOTVQgUmVxdWVzdHMKKyNkZWZpbmUgRVBMX0NfRExMX0FTTkRfUFJJT19TVEQgICAgIDAJLy8gc3RhbmRhcmQgQVNuZCByZXF1ZXN0IHByaW9yaXR5CisjZGVmaW5lIEVQTF9DX0RMTF9FVEhFUlRZUEVfRVBMICAgICAweDg4QUIKKyNkZWZpbmUgRVBMX0NfRExMX0lTT0NIUl9NQVhfUEFZTCAgIDE0OTAJLy8gQnl0ZTogbWF4aW11bSBzaXplIG9mIFBSZXEgYW5kIFBSZXMgcGF5bG9hZCBkYXRhLCByZXF1aXJlcyBDX0lQX01BWF9NVFUKKyNkZWZpbmUgRVBMX0NfRExMX01BWF9BU1lOQ19NVFUgICAgIDE1MDAJLy8gQnl0ZTogbWF4aW11bSBhc3luY2hyb25vdXMgcGF5bG9hZCBpbiBieXRlcworI2RlZmluZSBFUExfQ19ETExfTUFYX1BBWUxfT0ZGU0VUICAgMTQ5OQkvLyBCeXRlOiBtYXhpbXVtIG9mZnNldCBvZiBFdGhlcm5ldCBmcmFtZSBwYXlsb2FkLCByZXF1aXJlcyBDX0lQX01BWF9NVFUKKyNkZWZpbmUgRVBMX0NfRExMX01BWF9SUyAgICAgICAgICAgIDcKKyNkZWZpbmUgRVBMX0NfRExMX01JTl9BU1lOQ19NVFUgICAgIDI4MgkvLyBCeXRlOiBtaW5pbXVtIGFzeW5jaHJvbm91cyBwYXlsb2FkIGluIGJ5dGVzLgorI2RlZmluZSBFUExfQ19ETExfTUlOX1BBWUxfT0ZGU0VUICAgNDUJLy8gQnl0ZTogbWluaW11bSBvZmZzZXQgb2YgRXRoZXJuZXQgZnJhbWUgcGF5bG9hZAorI2RlZmluZSBFUExfQ19ETExfTVVMVElDQVNUX0FTTkQgICAgMHgwMTExMUUwMDAwMDRMTAkvLyBFUEwgQVNuZCBtdWx0aWNhc3QgTUFDIGFkZHJlc3MsIGNhbm9uaWNhbCBmb3JtCisjZGVmaW5lIEVQTF9DX0RMTF9NVUxUSUNBU1RfUFJFUyAgICAweDAxMTExRTAwMDAwMkxMCS8vIEVQTCBQUmVzIG11bHRpY2FzdCBNQUMgYWRkcmVzcywgY2Fub25pY2FsIGZvcm0KKyNkZWZpbmUgRVBMX0NfRExMX01VTFRJQ0FTVF9TT0EgICAgIDB4MDExMTFFMDAwMDAzTEwJLy8gRVBMIFNvQSBtdWx0aWNhc3QgTUFDIGFkZHJlc3MsIGNhbm9uaWNhbCBmb3JtCisjZGVmaW5lIEVQTF9DX0RMTF9NVUxUSUNBU1RfU09DICAgICAweDAxMTExRTAwMDAwMUxMCS8vIEVQTCBTb2MgbXVsdGljYXN0IE1BQyBhZGRyZXNzLCBjYW5vbmljYWwgZm9ybQorI2RlZmluZSBFUExfQ19ETExfUFJFT1AxX1NUQVJUX0NZQ0xFUyAxMAkvLyBudW1iZXIgb2YgdW5hc3NpZ25pbmcgU29BIGZyYW1lcyBhdCBzdGFydCBvZiBOTVRfTVNfUFJFX09QRVJBVElPTkFMXzEKKyNkZWZpbmUgRVBMX0NfRExMX1RfQklUVElNRSAgICAgICAgIDEwCS8vIG5zOiBUcmFuc21pc3Npb24gdGltZSBwZXIgYml0IG9uIDEwMCBNYml0L3MgbmV0d29yaworI2RlZmluZSBFUExfQ19ETExfVF9FUExfUERPX0hFQURFUiAgMTAJLy8gQnl0ZTogc2l6ZSBvZiBQUmVxIGFuZCBQUmVzIEVQTCBQRE8gbWVzc2FnZSBoZWFkZXIKKyNkZWZpbmUgRVBMX0NfRExMX1RfRVRIMl9XUkFQUEVSICAgIDE4CS8vIEJ5dGU6IHNpemUgb2YgRXRoZXJuZXQgdHlwZSBJSSB3cmFwcGVyIGNvbnNpc3Rpbmcgb2YgaGVhZGVyIGFuZCBjaGVja3N1bQorI2RlZmluZSBFUExfQ19ETExfVF9JRkcgICAgICAgICAgICAgNjQwCS8vIG5zOiBFdGhlcm5ldCBJbnRlcmZyYW1lIEdhcAorI2RlZmluZSBFUExfQ19ETExfVF9NSU5fRlJBTUUgICAgICAgNTEyMAkvLyBuczogU2l6ZSBvZiBtaW5pbXVtIEV0aGVybmV0IGZyYW1lICh3aXRob3V0IHByZWFtYmxlKQorI2RlZmluZSBFUExfQ19ETExfVF9QUkVBTUJMRSAgICAgICAgOTYwCS8vIG5zOiBTaXplIG9mIEV0aGVybmV0IGZyYW1lIHByZWFtYmxlCisKKyNkZWZpbmUgRVBMX0NfRExMX01JTlNJWkVfU09DICAgICAgIDM2CS8vIG1pbmltdW0gc2l6ZSBvZiBTb0Mgd2l0aG91dCBwYWRkaW5nIGFuZCBDUkMKKyNkZWZpbmUgRVBMX0NfRExMX01JTlNJWkVfUFJFUSAgICAgIDYwCS8vIG1pbmltdW0gc2l6ZSBvZiBQUmVjIHdpdGhvdXQgQ1JDCisjZGVmaW5lIEVQTF9DX0RMTF9NSU5TSVpFX1BSRVMgICAgICA2MAkvLyBtaW5pbXVtIHNpemUgb2YgUFJlcyB3aXRob3V0IENSQworI2RlZmluZSBFUExfQ19ETExfTUlOU0laRV9TT0EgICAgICAgMjQJLy8gbWluaW11bSBzaXplIG9mIFNvQSB3aXRob3V0IHBhZGRpbmcgYW5kIENSQworI2RlZmluZSBFUExfQ19ETExfTUlOU0laRV9JREVOVFJFUyAgMTc2CS8vIG1pbmltdW0gc2l6ZSBvZiBJZGVudFJlc3BvbnNlIHdpdGhvdXQgQ1JDCisjZGVmaW5lIEVQTF9DX0RMTF9NSU5TSVpFX1NUQVRVU1JFUyA3MgkvLyBtaW5pbXVtIHNpemUgb2YgU3RhdHVzUmVzcG9uc2Ugd2l0aG91dCBDUkMKKyNkZWZpbmUgRVBMX0NfRExMX01JTlNJWkVfTk1UQ01EICAgIDIwCS8vIG1pbmltdW0gc2l6ZSBvZiBObXRDb21tYW5kIHdpdGhvdXQgQ29tbWFuZERhdGEsIHBhZGRpbmcgYW5kIENSQworI2RlZmluZSBFUExfQ19ETExfTUlOU0laRV9OTVRDTURFWFQgNTIJLy8gbWluaW11bSBzaXplIG9mIE5tdENvbW1hbmQgd2l0aG91dCBwYWRkaW5nIGFuZCBDUkMKKyNkZWZpbmUgRVBMX0NfRExMX01JTlNJWkVfTk1UUkVRICAgIDIwCS8vIG1pbmltdW0gc2l6ZSBvZiBObXRSZXF1ZXN0IHdpdGhvdXQgQ29tbWFuZERhdGEsIHBhZGRpbmcgYW5kIENSQworI2RlZmluZSBFUExfQ19ETExfTUlOU0laRV9OTVRSRVFFWFQgNTIJLy8gbWluaW11bSBzaXplIG9mIE5tdFJlcXVlc3Qgd2l0aG91dCBwYWRkaW5nIGFuZCBDUkMKKworI2RlZmluZSBFUExfQ19FUlJfTU9OSVRPUl9ERUxBWSAgICAgMTAJLy8gRXJyb3IgbW9uaXRvcmluZyBzdGFydCBkZWxheSAobm90IHVzZWQgaW4gRFMgMS4wLjApCisjZGVmaW5lIEVQTF9DX0lQX0FEUl9JTlZBTElEICAgICAgICAweDAwMDAwMDAwTAkvLyBpbnZhbGlkIElQIGFkZHJlc3MgKDAuMC4wLjApIHVzZWQgdG8gaW5kaWNhdGUgbm8gY2hhbmdlCisjZGVmaW5lIEVQTF9DX0lQX0lOVkFMSURfTVRVICAgICAgICAwCS8vIEJ5dGU6IGludmFsaWQgTVRVIHNpemUgdXNlZCB0byBpbmRpY2F0ZSBubyBjaGFuZ2UKKyNkZWZpbmUgRVBMX0NfSVBfTUFYX01UVSAgICAgICAgICAgIDE1MTgJLy8gQnl0ZTogbWF4aW11bSBzaXplIGluIGJ5dGVzIG9mIHRoZSBJUCBzdGFjayB3aGljaCBtdXN0IGJlIHByb2Nlc3NlZC4KKyNkZWZpbmUgRVBMX0NfSVBfTUlOX01UVSAgICAgICAgICAgIDMwMAkvLyBCeXRlOiBtaW5pbXVtIHNpemUgaW4gYnl0ZXMgb2YgdGhlIElQIHN0YWNrIHdoaWNoIG11c3QgYmUgcHJvY2Vzc2VkLgorI2RlZmluZSBFUExfQ19OTVRfU1RBVEVfVE9MRVJBTkNFICAgNQkvLyBDeWNsZXM6IG1heGltdW0gcmVhY3Rpb24gdGltZSB0byBOTVQgc3RhdGUgY29tbWFuZHMKKyNkZWZpbmUgRVBMX0NfTk1UX1NUQVRSRVFfQ1lDTEUgICAgIDUJLy8gc2VjOiBTdGF0dXNSZXF1ZXN0IGN5Y2xlIHRpbWUgdG8gYmUgYXBwbGllZCB0byBBc3luY09ubHkgQ05zCisjZGVmaW5lIEVQTF9DX1NET19FUExfUE9SVCAgICAgICAgICAzODE5CisKKyNkZWZpbmUgRVBMX0NfRExMX01BWF9BU05EX1NFUlZJQ0VfSURTICA1CS8vIHNlZSB0RXBsRGxsQXNuZFNlcnZpY2VJZCBpbiBFcGxEbGwuaAorCisvLyBEZWZhdWx0IGNvbmZpZ3VyYXRpb24KKy8vID09PT09PT09PT09PT09PT09PT09PT0KKworI2lmbmRlZiBFUExfRF9QRE9fR3JhbnVsYXJpdHlfVTgKKyNkZWZpbmUgRVBMX0RfUERPX0dyYW51bGFyaXR5X1U4ICAgIDgJLy8gbWluaW11bSBzaXplIG9mIG9iamVjdHMgdG8gYmUgbWFwcGVkIGluIGJpdHMgVU5TSUdORUQ4IE8gTyAxIDEKKyNlbmRpZgorCisjaWZuZGVmIEVQTF9OTVRfTUFYX05PREVfSUQKKyNkZWZpbmUgRVBMX05NVF9NQVhfTk9ERV9JRCAgICAgICAgIDI1NAkvLyBtYXhpbXVtIG5vZGUtSUQKKyNlbmRpZgorCisjaWZuZGVmIEVQTF9EX05NVF9NYXhDTk51bWJlcl9VOAorI2RlZmluZSBFUExfRF9OTVRfTWF4Q05OdW1iZXJfVTggICAgMjM5CS8vIG1heGltdW0gbnVtYmVyIG9mIHN1cHBvcnRlZCByZWd1bGFyIENOcyBpbiB0aGUgTm9kZSBJRCByYW5nZSAxIC4uIDIzOSBVTlNJR05FRDggTyBPIDIzOSAyMzkKKyNlbmRpZgorCisvLyBkZWZpbmVzIGZvciBFUEwgQVBJIGxheWVyIHN0YXRpYyBwcm9jZXNzIGltYWdlCisjaWZuZGVmIEVQTF9BUElfUFJPQ0VTU19JTUFHRV9TSVpFX0lOCisjZGVmaW5lIEVQTF9BUElfUFJPQ0VTU19JTUFHRV9TSVpFX0lOICAgMAorI2VuZGlmCisKKyNpZm5kZWYgRVBMX0FQSV9QUk9DRVNTX0lNQUdFX1NJWkVfT1VUCisjZGVmaW5lIEVQTF9BUElfUFJPQ0VTU19JTUFHRV9TSVpFX09VVCAgMAorI2VuZGlmCisKKy8vIGNvbmZpZ3VyZSB3aGV0aGVyIE9EIGFjY2VzcyBldmVudHMgc2hhbGwgYmUgZm9yd2FyZGVkCisvLyB0byB1c2VyIGNhbGxiYWNrIGZ1bmN0aW9uLgorLy8gQmVjYXVzZSBvZiByZWVudHJhbmN5IGZvciBsb2NhbCBPRCBhY2Nlc3NlcywgdGhpcyBoYXMgdG8gYmUgZGlzYWJsZWQKKy8vIHdoZW4gYXBwbGljYXRpb24gcmVzaWRlcyBpbiBvdGhlciBhZGRyZXNzIHNwYWNlIGFzIHRoZSBzdGFjayAoZS5nLiBpZgorLy8gRXBsQXBpTGludXhVc2VyLmMgYW5kIEVwbEFwaUxpbnV4S2VybmVsLmMgYXJlIHVzZWQpCisjaWZuZGVmIEVQTF9BUElfT0JEX0ZPUldBUkRfRVZFTlQKKyNkZWZpbmUgRVBMX0FQSV9PQkRfRk9SV0FSRF9FVkVOVCAgICAgICBUUlVFCisjZW5kaWYKKworI2lmbmRlZiBFUExfT0JEX01BWF9TVFJJTkdfU0laRQorI2RlZmluZSBFUExfT0JEX01BWF9TVFJJTkdfU0laRSAgICAgICAgMzIJLy8gaXMgdXNlZCBmb3Igb2JqZWN0cyAweDEwMDgvMHgxMDA5LzB4MTAwQQorI2VuZGlmCisKKyNpZm5kZWYgRVBMX09CRF9VU0VfU1RPUkVfUkVTVE9SRQorI2RlZmluZSBFUExfT0JEX1VTRV9TVE9SRV9SRVNUT1JFICAgICAgIEZBTFNFCisjZW5kaWYKKworI2lmbmRlZiBFUExfT0JEX0NIRUNLX09CSkVDVF9SQU5HRQorI2RlZmluZSBFUExfT0JEX0NIRUNLX09CSkVDVF9SQU5HRSAgICAgIFRSVUUKKyNlbmRpZgorCisjaWZuZGVmIEVQTF9PQkRfVVNFX1NUUklOR19ET01BSU5fSU5fUkFNCisjZGVmaW5lIEVQTF9PQkRfVVNFX1NUUklOR19ET01BSU5fSU5fUkFNICAgIFRSVUUKKyNlbmRpZgorCisjaWZuZGVmIEVQTF9PQkRfVVNFX1ZBUklBQkxFX1NVQklOREVYX1RBQgorI2RlZmluZSBFUExfT0JEX1VTRV9WQVJJQUJMRV9TVUJJTkRFWF9UQUIgICBUUlVFCisjZW5kaWYKKworI2lmbmRlZiBFUExfT0JEX1VTRV9LRVJORUwKKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX09CRFUpKSA9PSAwKQorI2RlZmluZSBFUExfT0JEX1VTRV9LRVJORUwgICAgICAgICAgICAgICAgICBUUlVFCisjZWxzZQorI2RlZmluZSBFUExfT0JEX1VTRV9LRVJORUwgICAgICAgICAgICAgICAgICBGQUxTRQorI2VuZGlmCisjZW5kaWYKKworI2lmbmRlZiBFUExfT0JEX0lOQ0xVREVfQTAwMF9UT19ERVZJQ0VfUEFSVAorI2RlZmluZSBFUExfT0JEX0lOQ0xVREVfQTAwMF9UT19ERVZJQ0VfUEFSVCBGQUxTRQorI2VuZGlmCisKKyNpZm5kZWYgRVBMX1ZFVEhfTkFNRQorI2RlZmluZSBFUExfVkVUSF9OQU1FICAgICAgICJlcGwiCS8vIG5hbWUgb2YgbmV0IGRldmljZSBpbiBMaW51eAorI2VuZGlmCisKKy8qCisjZGVmaW5lIEVQTF9EX0NGR19Db25maWdNYW5hZ2VyX0JPT0wgLy8gQWJpbGl0eSBvZiBhIE1OIG5vZGUgdG8gcGVyZm9ybSBDb25maWd1cmF0aW9uIE1hbmFnZXIgZnVuY3Rpb25zIEJPT0xFQU4gTyAtIE4gLQorI2RlZmluZSBFUExfRF9DRk1fVmVyaWZ5Q29uZl9CT09MICAgLy8gU3VwcG9ydCBvZiBvYmplY3RzIENGTV9WZXJpZnlDb25maWd1cmF0aW9uX1JFQywgQ0ZNX0V4cENvbmZEYXRlTGlzdF9BVTMyLCBDRk1fRXhwQ29uZlRpbWVMaXN0X0FVMzIgQk9PTEVBTiBPIE8gTiBOCisjZGVmaW5lIEVQTF9EX0NGTV9WZXJpZnlDb25mSWRfQk9PTCAvLyBTdXBwb3J0IG9mIG9iamVjdHMgQ0ZNX1ZlcmlmeUNvbmZpZ3VyYXRpb25fUkVDLkNvbmZJZF9VMzIgYW5kIENGTV9FeHBDb25mSWRMaXN0X0FVMzIgQk9PTEVBTiBPIE8gTiBOCisjZGVmaW5lIEVQTF9EX0RMTF9DTkZlYXR1cmVJc29jaHJfQk9PTCAvLyBDTpJzIGFiaWxpdHkgdG8gcGVyZm9ybSBpc29jaHJvbm91cyBmdW5jdGlvbnMgQk9PTEVBTiAtIE8gLSBZCisjZGVmaW5lIEVQTF9EX0RMTF9DTkZlYXR1cmVNdWx0aXBsZXhfQk9PTCAvLyBub2RlknMgYWJpbGl0eSB0byBwZXJmb3JtIGNvbnRyb2wgb2YgbXVsdGlwbGV4ZWQgaXNvY2hyb25vdXMgY29tbXVuaWNhdGlvbiBCT09MRUFOIC0gTyAtIE4KKyNkZWZpbmUgRVBMX0RfRExMX0ZlYXR1cmVDTl9CT09MIC8vIG5vZGWScyBhYmlsaXR5IHRvIHBlcmZvcm0gQ04gZnVuY3Rpb25zIEJPT0xFQU4gTyBPIFkgWQorI2RlZmluZSBFUExfRF9ETExfRmVhdHVyZU1OX0JPT0wgLy8gbm9kZZJzIGFiaWxpdHkgdG8gcGVyZm9ybSBNTiBmdW5jdGlvbnMgQk9PTEVBTiBNIE8gLSBOCisjZGVmaW5lIEVQTF9EX0RMTF9NTkZlYXR1cmVNdWx0aXBsZXhfQk9PTCAvLyBNTpJzIGFiaWxpdHkgdG8gcGVyZm9ybSBjb250cm9sIG9mIG11bHRpcGxleGVkIGlzb2Nocm9ub3VzIGNvbW11bmljYXRpb24gQk9PTEVBTiBPIC0gWSAtCisjZGVmaW5lIEVQTF9EX0RMTF9NTkZlYXR1cmVQUmVzVHhfQk9PTCAvLyBNTpJzIGFiaWxpdHkgdG8gdHJhbnNtaXQgUFJlcyBCT09MRUFOIE8gLSBZIC0KKyNkZWZpbmUgRVBMX0RfTk1UX0FTbmRSeE1heFBheWxvYWRfVTE2IC8vIHNpemUgb2YgQVNuZCBmcmFtZSByZWNlaXZlIGJ1ZmZlciBVTlNJR05FRDE2IE0gTSAtIC0KKyNkZWZpbmUgRVBMX0RfTk1UX0FTbmRUeE1heFBheWxvYWRfVTE2IC8vIHNpemUgb2YgQVNuZCBmcmFtZSB0cmFuc21pdCBidWZmZXIgVU5TSUdORUQxNiBNIE0gLSAtCisjZGVmaW5lIEVQTF9EX05NVF9DTkFTbmQyU29DX1UzMiAvLyBtaW5pbXVtIGRlbGF5IGJldHdlZW4gZW5kIG9mIHJlY2VwdGlvbiBvZiBBU25kIGFuZCBzdGFydCBvZiByZWNlcHRpb24gb2YgU29DIFVOU0lHTkVEMzIgLSBNIC0gLQorI2RlZmluZSBFUExfRF9OTVRfQ05BU25kTWF4TGF0ZW5jeV9VMzIgLy8gZGVsYXkgYmV0d2VlbiBlbmQgb2YgU29BIHJlY2VwdGlvbiBhbmQgc3RhcnQgb2YgQVNuZCB0cmFuc21pc3Npb24gVU5TSUdORUQzMiAtIE0gLSAtCisjZGVmaW5lIEVQTF9EX05NVF9DTlBSZXNNYXhMYXRlbmN5X1UzMiAvLyBkZWxheSBiZXR3ZWVuIGVuZCBvZiBQUmVxIHJlY2VwdGlvbiBhbmQgc3RhcnQgb2YgUFJlcyB0cmFuc21pc3Npb24gVU5TSUdORUQzMiAtIE0gLSAtCisjZGVmaW5lIEVQTF9EX05NVF9DTlNvQzJQUmVxX1UzMiAvLyBDTiBTb0MgaGFuZGxpbmcgbWF4aW11bSB0aW1lLCBhIHN1YnNlcXVlbnQgUFJlcSB3b26SdCBiZSBoYW5kbGVkIGJlZm9yZSBTb0MgaGFuZGxpbmcgd2FzIGZpbmlzaGVkIFVOU0lHTkVEMzIgLSBNIC0gLQorI2RlZmluZSBFUExfRF9OTVRfRGV2aWNlVHlwZV9VMzIgLy8gRGV2aWNlIFR5cGUgSUQgVU5TSUdORUQzMiBNIE0gLSAtCisjZGVmaW5lIEVQTF9EX05NVF9FUExWZXJzX1U4IEVQTCAvLyBWZXJzaW9uIGltcGxlbWVudGVkIGJ5IHRoZSBkZXZpY2UgVU5TSUdORUQ4IE0gTSAtIC0KKyNkZWZpbmUgRVBMX0RfTk1UX0V4dFN0YXRlQ21kX0JPT0wgLy8gYWJpdGlsdHkgdG8gc3VwcG9ydCBFeHRlbmRlZCBOTVQgU3RhdGUgQ29tbWFuZHMgQk9PTEVBTiBPIE8gWSBZCisjZGVmaW5lIEVQTF9EX05NVF9JbmZvU3ZjX0JPT0wgLy8gYWJpbGl0eSB0byBzdXBwb3J0IE5NVCBJbmZvIFNlcnZpY2VzIEJPT0xFQU4gTyAtIFkgLQorI2RlZmluZSBFUExfRF9OTVRfSW50ZXJmYWNlQWRkcl9YaF9PU1RSIC8vIFBoeXNpY2FsIEFkZHJlc3Mgb2YgSW50ZXJmYWNlIE5vLiBYaCBPQ1RFVF9TVFJJTkcgTSBNIC0gLQorI2RlZmluZSBFUExfRF9OTVRfSW50ZXJmYWNlRGVzY3JfWGhfVlNUUiAvLyBEZXNjcmlwdGlvbiB0ZXh0IG9mIEludGVyZmFjZSBOby4gWGggVklTSUJMRV9TVFJJTkdNIE0gLSAtCisjZGVmaW5lIEVQTF9EX05NVF9JbnRlcmZhY2VNdHVfWGhfVTMyIC8vIE1UVSBvZiBJbnRlcmZhY2UgTm8uIFhoIFVOU0lHTkVEMzIgTSBNIC0gLQorI2RlZmluZSBFUExfRF9OTVRfSW50ZXJmYWNlVHlwZV9YaF9VOCAvLyBUeXBlIG9mIEludGVyZmFjZSBOby4gWGggVU5TSUdORUQ4IE0gTSAtIC0KKyNkZWZpbmUgRVBMX0RfTk1UX0lzb2NoclJ4TWF4UGF5bG9hZF9VMTYgLy8gc2l6ZSBvZiBpc29jaHJvbm91cyBmcmFtZSByZWNlaXZlIGJ1ZmZlciBVTlNJR05FRDE2IE0gTSAtIC0KKyNkZWZpbmUgRVBMX0RfTk1UX0lzb2NoclR4TWF4UGF5bG9hZF9VMTYgLy8gc2l6ZSBvZiBpc29jaHJvbm91cyBmcmFtZSB0cmFuc21pdCBidWZmZXIgVU5TSUdORUQxNiBNIE0gLSAtCisjZGVmaW5lIEVQTF9EX05NVF9NYW51ZmFjdERldk5hbWVfVlMgLy8gTWFudWZhY3R1cmVyIERldmljZSBOYW1lIFZJU0lCTEVfU1RSSU5HIE8gTyAtIC0KKyNkZWZpbmUgRVBMX0RfTk1UX01hbnVmYWN0SHdWZXJzX1ZTIC8vIE1hbnVmYWN0dXJlciBIVyB2ZXJzaW9uIFZJU0lCTEVfU1RSSU5HIE8gTyAtIC0KKyNkZWZpbmUgRVBMX0RfTk1UX01hbnVmYWN0U3dWZXJzX1ZTIC8vIE1hbnVmYWN0dXJlciBTVyB2ZXJzaW9uIFZJU0lCTEVfU1RSSU5HIE8gTyAtIC0KKyNkZWZpbmUgRVBMX0RfTk1UX01heENOTm9kZUlEX1U4IC8vIG1heGltdW0gTm9kZSBJRCBhdmFpbGFibGUgZm9yIHJlZ3VsYXIgQ05zIHRoZSBlbnRyeSBwcm92aWRlcyBhbiB1cHBlciBsaW1pdCB0byB0aGUgTm9kZUlEIGF2YWlsYWJsZSBmb3IgY3Jvc3MgdHJhZmZpYyBQRE8gcmVjZXB0aW9uIGZyb20gYSByZWd1bGFyIENOIFVOU0lHTkVEOCBPIE8gMjM5IDIzOQorI2RlZmluZSBFUExfRF9OTVRfTWF4Q05OdW1iZXJfVTggLy8gbWF4aW11bSBudW1iZXIgb2Ygc3VwcG9ydGVkIHJlZ3VsYXIgQ05zIGluIHRoZSBOb2RlIElEIHJhbmdlIDEgLi4gMjM5IFVOU0lHTkVEOCBPIE8gMjM5IDIzOQorI2RlZmluZSBFUExfRF9OTVRfTWF4SGVhcnRiZWF0c19VOCAvLyBudW1iZXIgb2YgZ3VhcmQgY2hhbm5lbHMgVU5TSUdORUQ4IE8gTyAyNTQgMjU0CisjZGVmaW5lIEVQTF9EX05NVF9NTkFTbmQyU29DX1UzMiAvLyBtaW5pbXVtIGRlbGF5IGJldHdlZW4gZW5kIG9mIHJlY2VwdGlvbiBvZiBBU25kIGFuZCBzdGFydCBvZiB0cmFuc21pc3Npb24gb2YgU29DIFVOU0lHTkVEMzIgTSAtIC0gLQorI2RlZmluZSBFUExfRF9OTVRfTU5NdWx0aXBsQ3ljTWF4X1U4IC8vIG1heGltdW0gbnVtYmVyIG9mIEVQTCBjeWNsZXMgcGVyIG11bHRpcGxleGVkIGN5Y2xlIFVOU0lHTkVEOCBPIC0gMCAtCisjZGVmaW5lIEVQTF9EX05NVF9NTlBSZXMyUFJlcV9VMzIgLy8gZGVsYXkgYmV0d2VlbiBlbmQgb2YgUFJlcyByZWNlcHRpb24gYW5kIHN0YXJ0IG9mIFBSZXEgdHJhbnNtaXNzaW9uIFVOU0lHTkVEMzIgTSAtIC0gLQorI2RlZmluZSBFUExfRF9OTVRfTU5QUmVzMlBSZXNfVTMyIC8vIGRlbGF5IGJldHdlZW4gZW5kIG9mIHJlY2VwdGlvbiBvZiBQUmVzIGZyb20gQ05uIGFuZCBzdGFydCBvZiB0cmFuc21pc3Npb24gb2YgUFJlcyBieSBNTiBVTlNJR05FRDMyIE0gLSAtIC0KKyNkZWZpbmUgRVBMX0RfTk1UX01OUFJlc1J4MlNvQV9VMzIgLy8gZGVsYXkgYmV0d2VlbiBlbmQgb2YgcmVjZXB0aW9uIG9mIFBSZXMgZnJvbSBDTm4gYW5kIHN0YXJ0IG9mIHRyYW5zbWlzc2lvbiBvZiBTb0EgYnkgTU4gVU5TSUdORUQzMiBNIC0gLSAtCisjZGVmaW5lIEVQTF9EX05NVF9NTlBSZXNUeDJTb0FfVTMyIC8vIGRlbGF5IGJldHdlZW4gZW5kIG9mIFBSZXMgdHJhbnNtaXNzaW9uIGJ5IE1OIGFuZCBzdGFydCBvZiB0cmFuc21pc3Npb24gb2YgU29BIGJ5IE1OIFVOU0lHTkVEMzIgTSAtIC0gLQorI2RlZmluZSBFUExfRF9OTVRfTU5Tb0EyQVNuZFR4X1UzMiAvLyBkZWxheSBiZXR3ZWVuIGVuZCBvZiB0cmFuc21pc3Npb24gb2YgU29BIGFuZCBzdGFydCBvZiB0cmFuc21pc3Npb24gb2YgQVNuZCBieSBNTiBVTlNJR05FRDMyIE0gLSAtIC0KKyNkZWZpbmUgRVBMX0RfTk1UX01OU29DMlBSZXFfVTMyIC8vIE1OIG1pbmltdW0gZGVsYXkgYmV0d2VlbiBlbmQgb2YgU29DIHRyYW5zbWlzc2lvbiBhbmQgc3RhcnQgb2YgUFJlcSB0cmFuc21pc3Npb24gVU5TSUdORUQzMiBNIC0gLSAtCisjZGVmaW5lIEVQTF9EX05NVF9OTVRTdmNWaWFVRFBJUF9CT09MIC8vIEFiaWxpdHkgb2YgYSBub2RlIHRvIHBlcmZvcm0gTk1UIHNlcnZpY2VzIHZpYSBVRFAvSVAgQk9PTEVBTiBPIC0gWSAtCisjZGVmaW5lIEVQTF9EX05NVF9Ob2RlSURCeUhXX0JPT0wgLy8gQWJpbGl0eSBvZiBhIG5vZGUgdG8gc3VwcG9ydCBOb2RlSUQgc2V0dXAgYnkgSFcgQk9PTEVBTiBPIE8gWSBZCisjZGVmaW5lIEVQTF9EX05NVF9Ob2RlSURCeVNXX0JPT0wgLy8gQWJpbGl0eSBvZiBhIG5vZGUgdG8gc3VwcG9ydCBOb2RlSUQgc2V0dXAgYnkgU1cgQk9PTEVBTiBPIE8gTiBOCisjZGVmaW5lIEVQTF9EX05NVF9Qcm9kdWN0Q29kZV9VMzIgLy8gSWRlbnRpdHkgT2JqZWN0IFByb2R1Y3QgQ29kZSBVTlNJR05FRDMyIE0gTSAtIC0KKyNkZWZpbmUgRVBMX0RfTk1UX1JldmlzaW9uTm9fVTMyIC8vIElkZW50aXR5IE9iamVjdCBSZXZpc2lvbiBOdW1iZXIgVU5TSUdORUQzMiBNIE0gLSAtCisjZGVmaW5lIEVQTF9EX05NVF9TZXJpYWxOb19VMzIgLy8gSWRlbnRpdHkgT2JqZWN0IFNlcmlhbCBOdW1iZXIgVU5TSUdORUQzMiBNIE0gLSAtCisjZGVmaW5lIEVQTF9EX05NVF9TaW1wbGVCb290X0JPT0wgLy8gQWJpbGl0eSBvZiBhIE1OIG5vZGUgdG8gcGVyZm9ybSBTaW1wbGUgQm9vdCBQcm9jZXNzLCBpZiBub3Qgc2V0IEluZGl2dWFsIEJvb3QgUHJvY2VzcyBzaGFsbCBiZSBwcm92aWNlZCBCT09MRUFOIE0gLSAtIC0KKyNkZWZpbmUgRVBMX0RfTk1UX1ZlbmRvcklEX1UzMiAvLyBJZGVudGl0eSBPYmplY3QgVmVuZG9yIElEIFVOU0lHTkVEMzIgTSBNIC0gLQorI2RlZmluZSBFUExfRF9OV0xfRm9yd2FyZF9CT09MIC8vIEFiaWxpdHkgb2Ygbm9kZSB0byBmb3J3YXJkIGRhdGFncmFtcyBCT09MRUFOIE8gTyBOIE4KKyNkZWZpbmUgRVBMX0RfTldMX0lQU3VwcG9ydF9CT09MIC8vIEFiaWxpdHkgb2YgdGhlIG5vZGUgY3VtbXVuaWNhdGUgdmlhIElQIEJPT0xFQU4gLSAtIFkgWQorI2RlZmluZSBFUExfRF9QRE9fRHluYW1pY01hcHBpbmdfQk9PTCAvLyBBYmlsaXR5IG9mIGEgbm9kZSB0byBwZXJmb3JtIGR5bmFtaWMgUERPIG1hcHBpbmcgQk9PTEVBTiBPIE8gWSBZCisjZGVmaW5lIEVQTF9EX1BET19NYXhEZXNjck1lbV9VMzIgLy8gbWF4aW11bSBjdW11bGF0aXZlIG1lbW9yeSBjb25zdW1wdGlvbiBvZiBUUERPIGFuZCBSUERPIGRlc2NyaWJpbmcgb2JqZWN0cyBpbiBieXRlIFVOU0lHTkVEMzIgTyBPIE1BWF9VMzIgTUFYX1UzMgorI2RlZmluZSBFUExfRF9QRE9fUlBET0NoYW5uZWxzX1U4IC8vIG51bWJlciBvZiBzdXBwb3J0ZWQgUlBETyBjaGFubmVscyBVTlNJR05FRDggTyBPIDI1NiAyNTYKKyNkZWZpbmUgRVBMX0RfUERPX1JQRE9NYXhNZW1fVTMyIC8vIE1heGltdW0gbWVtb3J5IGF2YWlsYWJsZSBmb3IgUlBETyBkYXRhIHBlciBFUEwgY3ljbGUgaW4gYnl0ZSBVTlNJR05FRDMyIE8gTyBNQVhfVTMyIE1BWF9VMzIKKyNkZWZpbmUgRVBMX0RfUERPX1JQRE9PYmplY3RzX1U4IC8vIE51bWJlciBvZiBzdXBwb3J0ZWQgbWFwcGVkIG9iamVjdHMgcGVyIFJQRE8gY2hhbm5lbCBVTlNJR05FRDggTyBPIDI1NCAyNTQKKyNkZWZpbmUgRVBMX0RfUERPX1RQRE9DaGFubmVsc19VOCAvLyBudW1iZXIgb2Ygc3VwcG9ydGVkIFRQRE8gY2hhbm5lbHMgVU5TSUdORUQ4IE8gLSAyNTYgLQorI2RlZmluZSBFUExfRF9QRE9fVFBET01heE1lbV9VMzIgLy8gTWF4aW11bSBtZW1vcnkgYXZhaWxhYmxlIGZvciBUUERPIGRhdGEgcGVyIEVQTCBjeWNsZSBpbiBieXRlIFVOU0lHTkVEMzIgTyBPIE1BWF9VMzIgTUFYX1UzMgorI2RlZmluZSBFUExfRF9QRE9fVFBET09iamVjdHNfVTggLy8gTnVtYmVyIG9mIHN1cHBvcnRlZCBtYXBwZWQgb2JqZWN0cyBwZXIgVFBETyBjaGFubmVsIFVOU0lHTkVEOCBPIE8gMjU0IDI1NAorI2RlZmluZSBFUExfRF9TRE9fVmlhQVNuZF9CT09MIC8vIEFiaWxpdHkgb2YgYSBDTiB0byBwZXJmb3JtIFNETyB0cmFuc2ZlciBieSBFUEwgQVNuZCBCT09MRUFOIC0gTSAtIC0KKyNkZWZpbmUgRVBMX0RfU0RPX1ZpYVBET19CT09MIC8vIEFiaWxpdHkgb2YgYSBub2RlIHRvIHBlcmZvcm0gU0RPIHRyYW5zZmVyIGJ5IFBETyBCT09MRUFOIE8gTyBOIE4KKyNkZWZpbmUgRVBMX0RfU0RPX1ZpYVVEUElQX0JPT0wgLy8gQWJpbGl0eSBvZiBhIENOIHRvIHBlcmZvcm0gU0RPIHRyYW5zZmVyIGJ5IFVEUC9JUCBCT09MRUFOIC0gTSAtIC0KKyNkZWZpbmUgRVBMX0RfU1lOX09wdGltaXplZFN5bmNfQk9PTCAvLyBBYmlsaXR5IG9mIG5vZGUgdG8gcGVyZm9ybSBvcHRpbWl6ZWQgc3luY2hyb25pc2F0aW9uIEJPT0xFQU4gTyBPIE4gTgorKi8KKworLy8gRW1lcmdlbmN5IGVycm9yIGNvZGVzCisvLyA9PT09PT09PT09PT09PT09PT09PT09CisjZGVmaW5lIEVQTF9FX05PX0VSUk9SICAgICAgICAgICAgICAgICAgMHgwMDAwCisvLyAweEZ4eHggbWFudWZhY3R1cmVyIHNwZWNpZmljIGVycm9yIGNvZGVzCisjZGVmaW5lIEVQTF9FX05NVF9OT19JREVOVF9SRVMgICAgICAgICAgMHhGMDAxCisjZGVmaW5lIEVQTF9FX05NVF9OT19TVEFUVVNfUkVTICAgICAgICAgMHhGMDAyCisKKy8vIDB4ODE2eCBIVyBlcnJvcnMKKyNkZWZpbmUgRVBMX0VfRExMX0JBRF9QSFlTX01PREUgICAgICAgICAweDgxNjEKKyNkZWZpbmUgRVBMX0VfRExMX0NPTExJU0lPTiAgICAgICAgICAgICAweDgxNjIKKyNkZWZpbmUgRVBMX0VfRExMX0NPTExJU0lPTl9USCAgICAgICAgICAweDgxNjMKKyNkZWZpbmUgRVBMX0VfRExMX0NSQ19USCAgICAgICAgICAgICAgICAweDgxNjQKKyNkZWZpbmUgRVBMX0VfRExMX0xPU1NfT0ZfTElOSyAgICAgICAgICAweDgxNjUKKyNkZWZpbmUgRVBMX0VfRExMX01BQ19CVUZGRVIgICAgICAgICAgICAweDgxNjYKKy8vIDB4ODJ4eCBQcm90b2NvbCBlcnJvcnMKKyNkZWZpbmUgRVBMX0VfRExMX0FERFJFU1NfQ09ORkxJQ1QgICAgICAweDgyMDEKKyNkZWZpbmUgRVBMX0VfRExMX01VTFRJUExFX01OICAgICAgICAgICAweDgyMDIKKy8vIDB4ODIxeCBGcmFtZSBzaXplIGVycm9ycworI2RlZmluZSBFUExfRV9QRE9fU0hPUlRfUlggICAgICAgICAgICAgIDB4ODIxMAorI2RlZmluZSBFUExfRV9QRE9fTUFQX1ZFUlMgICAgICAgICAgICAgIDB4ODIxMQorI2RlZmluZSBFUExfRV9OTVRfQVNORF9NVFVfRElGICAgICAgICAgIDB4ODIxMgorI2RlZmluZSBFUExfRV9OTVRfQVNORF9NVFVfTElNICAgICAgICAgIDB4ODIxMworI2RlZmluZSBFUExfRV9OTVRfQVNORF9UWF9MSU0gICAgICAgICAgIDB4ODIxNAorLy8gMHg4MjN4IFRpbWluZyBlcnJvcnMKKyNkZWZpbmUgRVBMX0VfTk1UX0NZQ0xFX0xFTiAgICAgICAgICAgICAweDgyMzEKKyNkZWZpbmUgRVBMX0VfRExMX0NZQ0xFX0VYQ0VFRCAgICAgICAgICAweDgyMzIKKyNkZWZpbmUgRVBMX0VfRExMX0NZQ0xFX0VYQ0VFRF9USCAgICAgICAweDgyMzMKKyNkZWZpbmUgRVBMX0VfTk1UX0lETEVfTElNICAgICAgICAgICAgICAweDgyMzQKKyNkZWZpbmUgRVBMX0VfRExMX0pJVFRFUl9USCAgICAgICAgICAgICAweDgyMzUKKyNkZWZpbmUgRVBMX0VfRExMX0xBVEVfUFJFU19USCAgICAgICAgICAweDgyMzYKKyNkZWZpbmUgRVBMX0VfTk1UX1BSRVFfQ04gICAgICAgICAgICAgICAweDgyMzcKKyNkZWZpbmUgRVBMX0VfTk1UX1BSRVFfTElNICAgICAgICAgICAgICAweDgyMzgKKyNkZWZpbmUgRVBMX0VfTk1UX1BSRVNfQ04gICAgICAgICAgICAgICAweDgyMzkKKyNkZWZpbmUgRVBMX0VfTk1UX1BSRVNfUlhfTElNICAgICAgICAgICAweDgyM0EKKyNkZWZpbmUgRVBMX0VfTk1UX1BSRVNfVFhfTElNICAgICAgICAgICAweDgyM0IKKy8vIDB4ODI0eCBGcmFtZSBlcnJvcnMKKyNkZWZpbmUgRVBMX0VfRExMX0lOVkFMSURfRk9STUFUICAgICAgICAweDgyNDEKKyNkZWZpbmUgRVBMX0VfRExMX0xPU1NfUFJFUV9USCAgICAgICAgICAweDgyNDIKKyNkZWZpbmUgRVBMX0VfRExMX0xPU1NfUFJFU19USCAgICAgICAgICAweDgyNDMKKyNkZWZpbmUgRVBMX0VfRExMX0xPU1NfU09BX1RIICAgICAgICAgICAweDgyNDQKKyNkZWZpbmUgRVBMX0VfRExMX0xPU1NfU09DX1RIICAgICAgICAgICAweDgyNDUKKy8vIDB4ODR4eCBCb290VXAgRXJyb3JzCisjZGVmaW5lIEVQTF9FX05NVF9CQTEgICAgICAgICAgICAgICAgICAgMHg4NDEwCS8vIG90aGVyIE1OIGluIE1zTm90QWN0aXZlIGFjdGl2ZQorI2RlZmluZSBFUExfRV9OTVRfQkExX05PX01OX1NVUFBPUlQgICAgIDB4ODQxMQkvLyBNTiBpcyBub3Qgc3VwcG9ydGVkCisjZGVmaW5lIEVQTF9FX05NVF9CUE8xICAgICAgICAgICAgICAgICAgMHg4NDIwCS8vIG1hbmRhdG9yeSBDTiB3YXMgbm90IGZvdW5kIG9yIGZhaWxlZCBpbiBCb290U3RlcDEKKyNkZWZpbmUgRVBMX0VfTk1UX0JQTzFfR0VUX0lERU5UICAgICAgICAweDg0MjEJLy8gSWRlbnRSZXMgd2FzIG5vdCByZWNlaXZlZAorI2RlZmluZSBFUExfRV9OTVRfQlBPMV9ERVZJQ0VfVFlQRSAgICAgIDB4ODQyMgkvLyB3cm9uZyBkZXZpY2UgdHlwZQorI2RlZmluZSBFUExfRV9OTVRfQlBPMV9WRU5ET1JfSUQgICAgICAgIDB4ODQyMwkvLyB3cm9uZyB2ZW5kb3IgSUQKKyNkZWZpbmUgRVBMX0VfTk1UX0JQTzFfUFJPRFVDVF9DT0RFICAgICAweDg0MjQJLy8gd3JvbmcgcHJvZHVjdCBjb2RlCisjZGVmaW5lIEVQTF9FX05NVF9CUE8xX1JFVklTSU9OX05PICAgICAgMHg4NDI1CS8vIHdyb25nIHJldmlzaW9uIG51bWJlcgorI2RlZmluZSBFUExfRV9OTVRfQlBPMV9TRVJJQUxfTk8gICAgICAgIDB4ODQyNgkvLyB3cm9uZyBzZXJpYWwgbnVtYmVyCisjZGVmaW5lIEVQTF9FX05NVF9CUE8xX0NGX1ZFUklGWSAgICAgICAgMHg4NDI4CS8vIHZlcmlmaWNhdGlvbiBvZiBjb25maWd1cmF0aW9uIGZhaWxlZAorI2RlZmluZSBFUExfRV9OTVRfQlBPMiAgICAgICAgICAgICAgICAgIDB4ODQzMAkvLyBtYW5kYXRvcnkgQ04gZmFpbGVkIGluIEJvb3RTdGVwMgorI2RlZmluZSBFUExfRV9OTVRfQlJPICAgICAgICAgICAgICAgICAgIDB4ODQ0MAkvLyBDaGVja0NvbW11bmljYXRpb24gZmFpbGVkIGZvciBtYW5kYXRvcnkgQ04KKyNkZWZpbmUgRVBMX0VfTk1UX1dST05HX1NUQVRFICAgICAgICAgICAweDg0ODAJLy8gbWFuZGF0b3J5IENOIGhhcyB3cm9uZyBOTVQgc3RhdGUKKworLy8gRGVmaW5lcyBmb3Igb2JqZWN0IDB4MUY4MCBOTVRfU3RhcnRVcF9VMzIKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorI2RlZmluZSBFUExfTk1UU1RfU1RBUlRBTExOT0RFUyAgICAgICAgIDB4MDAwMDAwMDJMCS8vIEJpdCAxCisjZGVmaW5lIEVQTF9OTVRTVF9OT19BVVRPU1RBUlQgICAgICAgICAgMHgwMDAwMDAwNEwJLy8gQml0IDIKKyNkZWZpbmUgRVBMX05NVFNUX05PX1NUQVJUTk9ERSAgICAgICAgICAweDAwMDAwMDA4TAkvLyBCaXQgMworI2RlZmluZSBFUExfTk1UU1RfUkVTRVRBTExfTUFORF9DTiAgICAgIDB4MDAwMDAwMTBMCS8vIEJpdCA0CisjZGVmaW5lIEVQTF9OTVRTVF9TVE9QQUxMX01BTkRfQ04gICAgICAgMHgwMDAwMDA0MEwJLy8gQml0IDYKKyNkZWZpbmUgRVBMX05NVFNUX05PX0FVVE9QUkVPUDIgICAgICAgICAweDAwMDAwMDgwTAkvLyBCaXQgNworI2RlZmluZSBFUExfTk1UU1RfTk9fQVVUT1JFQURZVE9PUCAgICAgIDB4MDAwMDAxMDBMCS8vIEJpdCA4CisjZGVmaW5lIEVQTF9OTVRTVF9FWFRfQ05JREVOVENIRUNLICAgICAgMHgwMDAwMDIwMEwJLy8gQml0IDkKKyNkZWZpbmUgRVBMX05NVFNUX1NXVkVSU0lPTkNIRUNLICAgICAgICAweDAwMDAwNDAwTAkvLyBCaXQgMTAKKyNkZWZpbmUgRVBMX05NVFNUX0NPTkZDSEVDSyAgICAgICAgICAgICAweDAwMDAwODAwTAkvLyBCaXQgMTEKKyNkZWZpbmUgRVBMX05NVFNUX05PX1JFVFVSTl9QUkVPUDEgICAgICAweDAwMDAxMDAwTAkvLyBCaXQgMTIKKyNkZWZpbmUgRVBMX05NVFNUX0JBU0lDRVRIRVJORVQgICAgICAgICAweDAwMDAyMDAwTAkvLyBCaXQgMTMKKworLy8gRGVmaW5lcyBmb3Igb2JqZWN0IDB4MUY4MSBOTVRfTm9kZUFzc2lnbm1lbnRfQVUzMgorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyNkZWZpbmUgRVBMX05PREVBU1NJR05fTk9ERV9FWElTVFMgICAgICAweDAwMDAwMDAxTAkvLyBCaXQgMAorI2RlZmluZSBFUExfTk9ERUFTU0lHTl9OT0RFX0lTX0NOICAgICAgIDB4MDAwMDAwMDJMCS8vIEJpdCAxCisjZGVmaW5lIEVQTF9OT0RFQVNTSUdOX1NUQVJUX0NOICAgICAgICAgMHgwMDAwMDAwNEwJLy8gQml0IDIKKyNkZWZpbmUgRVBMX05PREVBU1NJR05fTUFOREFUT1JZX0NOICAgICAweDAwMDAwMDA4TAkvLyBCaXQgMworI2RlZmluZSBFUExfTk9ERUFTU0lHTl9LRUVQQUxJVkUgICAgICAgIDB4MDAwMDAwMTBMCS8vY3VycmVudGx5IG5vdCB1c2VkIGluIEVQTCBWMiBzdGFuZGFyZAorI2RlZmluZSBFUExfTk9ERUFTU0lHTl9TV1ZFUlNJT05DSEVDSyAgIDB4MDAwMDAwMjBMCS8vIEJpdCA1CisjZGVmaW5lIEVQTF9OT0RFQVNTSUdOX1NXVVBEQVRFICAgICAgICAgMHgwMDAwMDA0MEwJLy8gQml0IDYKKyNkZWZpbmUgRVBMX05PREVBU1NJR05fQVNZTkNPTkxZX05PREUgICAweDAwMDAwMTAwTAkvLyBCaXQgOAorI2RlZmluZSBFUExfTk9ERUFTU0lHTl9NVUxUSVBMRVhFRF9DTiAgIDB4MDAwMDAyMDBMCS8vIEJpdCA5CisjZGVmaW5lIEVQTF9OT0RFQVNTSUdOX1JUMSAgICAgICAgICAgICAgMHgwMDAwMDQwMEwJLy8gQml0IDEwCisjZGVmaW5lIEVQTF9OT0RFQVNTSUdOX1JUMiAgICAgICAgICAgICAgMHgwMDAwMDgwMEwJLy8gQml0IDExCisjZGVmaW5lIEVQTF9OT0RFQVNTSUdOX01OX1BSRVMgICAgICAgICAgMHgwMDAwMTAwMEwJLy8gQml0IDEyCisjZGVmaW5lIEVQTF9OT0RFQVNTSUdOX1ZBTElEICAgICAgICAgICAgMHg4MDAwMDAwMEwJLy8gQml0IDMxCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyB0eXBlZGVmCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2VuZGlmIC8vICNpZm5kZWYgX0VQTF9ERUZfSF8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsRGxsLmggYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbERsbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2NjU3ZjIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbERsbC5oCkBAIC0wLDAgKzEsMjA1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgb3BlblBPV0VSTElOSworCisgIERlc2NyaXB0aW9uOiAgaW5jbHVkZSBmaWxlIGZvciBETEwgbW9kdWxlCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRXBsRGxsLmgsdiAkCisKKyAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAorCisgICAgICAgICAgICAgICAgJFJldmlzaW9uOiAxLjQgJCAgJERhdGU6IDIwMDgvMDQvMTcgMjE6MzY6MzIgJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgICAgIEdDQyBWMy40CisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwNi8wNi8wOCBkLmsuOiAgIHN0YXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiwgdmVyc2lvbiAxLjAwCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX0VQTF9ETExfSF8KKyNkZWZpbmUgX0VQTF9ETExfSF8KKworI2luY2x1ZGUgIkVwbEluYy5oIgorI2luY2x1ZGUgIkVwbEZyYW1lLmgiCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWZuZGVmIEVQTF9ETExfTUFYX0FTTkRfU0VSVklDRV9JRAorI2RlZmluZSBFUExfRExMX01BWF9BU05EX1NFUlZJQ0VfSUQgKEVQTF9DX0RMTF9NQVhfQVNORF9TRVJWSUNFX0lEUyArIDEpCS8vIGxhc3QgaXMga0VwbERsbEFzbmRTZG8gPT0gNQorI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyB0eXBlZGVmCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0eXBlZGVmIGVudW0geworCWtFcGxEbGxBc25kTm90RGVmaW5lZCA9IDB4MDAsCisJa0VwbERsbEFzbmRJZGVudFJlc3BvbnNlID0gMHgwMSwKKwlrRXBsRGxsQXNuZFN0YXR1c1Jlc3BvbnNlID0gMHgwMiwKKwlrRXBsRGxsQXNuZE5tdFJlcXVlc3QgPSAweDAzLAorCWtFcGxEbGxBc25kTm10Q29tbWFuZCA9IDB4MDQsCisJa0VwbERsbEFzbmRTZG8gPSAweDA1Cit9IHRFcGxEbGxBc25kU2VydmljZUlkOworCit0eXBlZGVmIGVudW0geworCWtFcGxEbGxBc25kRmlsdGVyTm9uZSA9IDB4MDAsCisJa0VwbERsbEFzbmRGaWx0ZXJMb2NhbCA9IDB4MDEsCS8vIHJlY2VpdmUgb25seSBBU25kIGZyYW1lcyB3aXRoIGxvY2FsIG9yIGJyb2FkY2FzdCBub2RlIElECisJa0VwbERsbEFzbmRGaWx0ZXJBbnkgPSAweDAyLAkvLyByZWNlaXZlIGFueSBBU25kIGZyYW1lCit9IHRFcGxEbGxBc25kRmlsdGVyOworCit0eXBlZGVmIGVudW0geworCWtFcGxEbGxSZXFTZXJ2aWNlTm8gPSAweDAwLAorCWtFcGxEbGxSZXFTZXJ2aWNlSWRlbnQgPSAweDAxLAorCWtFcGxEbGxSZXFTZXJ2aWNlU3RhdHVzID0gMHgwMiwKKwlrRXBsRGxsUmVxU2VydmljZU5tdFJlcXVlc3QgPSAweDAzLAorCWtFcGxEbGxSZXFTZXJ2aWNlVW5zcGVjaWZpZWQgPSAweEZGLAorCit9IHRFcGxEbGxSZXFTZXJ2aWNlSWQ7CisKK3R5cGVkZWYgZW51bSB7CisJa0VwbERsbEFzeW5jUmVxUHJpb05tdCA9IDB4MDcsCS8vIFBSSU9fTk1UX1JFUVVFU1QKKwlrRXBsRGxsQXN5bmNSZXFQcmlvNiA9IDB4MDYsCisJa0VwbERsbEFzeW5jUmVxUHJpbzUgPSAweDA1LAorCWtFcGxEbGxBc3luY1JlcVByaW80ID0gMHgwNCwKKwlrRXBsRGxsQXN5bmNSZXFQcmlvR2VuZXJpYyA9IDB4MDMsCS8vIFBSSU9fR0VORVJJQ19SRVFVRVNUCisJa0VwbERsbEFzeW5jUmVxUHJpbzIgPSAweDAyLAkvLyB0aWxsIFdTUCAwLjEuMzogUFJJT19BQk9WRV9HRU5FUklDCisJa0VwbERsbEFzeW5jUmVxUHJpbzEgPSAweDAxLAkvLyB0aWxsIFdTUCAwLjEuMzogUFJJT19CRUxPV19HRU5FUklDCisJa0VwbERsbEFzeW5jUmVxUHJpbzAgPSAweDAwLAkvLyB0aWxsIFdTUCAwLjEuMzogUFJJT19HRU5FUklDX1JFUVVFU1QKKworfSB0RXBsRGxsQXN5bmNSZXFQcmlvcml0eTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGludCBtX3VpRnJhbWVTaXplOworCXRFcGxGcmFtZSAqbV9wRnJhbWU7CisJdEVwbE5ldFRpbWUgbV9OZXRUaW1lOworCit9IHRFcGxGcmFtZUluZm87CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBpbnQgbV91aVNpemVPZlN0cnVjdDsKKwlCT09MIG1fZkFzeW5jT25seTsJLy8gZG8gbm90IG5lZWQgdG8gcmVnaXN0ZXIgUFJlcy1GcmFtZQorCXVuc2lnbmVkIGludCBtX3VpTm9kZUlkOwkvLyBsb2NhbCBub2RlIElECisKKwkvLyAweDFGODI6IE5NVF9GZWF0dXJlRmxhZ3NfVTMyCisJRFdPUkQgbV9kd0ZlYXR1cmVGbGFnczsKKwkvLyBDeWNsZSBMZW5ndGggKDB4MTAwNjogTk1UX0N5Y2xlTGVuX1UzMikgaW4gW3VzXQorCURXT1JEIG1fZHdDeWNsZUxlbjsJLy8gcmVxdWlyZWQgZm9yIGVycm9yIGRldGVjdGlvbgorCS8vIDB4MUY5ODogTk1UX0N5Y2xlVGltaW5nX1JFQworCS8vIDB4MUY5OC4xOiBJc29jaHJUeE1heFBheWxvYWRfVTE2CisJdW5zaWduZWQgaW50IG1fdWlJc29jaHJUeE1heFBheWxvYWQ7CS8vIGNvbnN0CisJLy8gMHgxRjk4LjI6IElzb2NoclJ4TWF4UGF5bG9hZF9VMTYKKwl1bnNpZ25lZCBpbnQgbV91aUlzb2NoclJ4TWF4UGF5bG9hZDsJLy8gY29uc3QKKwkvLyAweDFGOTguMzogUFJlc01heExhdGVuY3lfVTMyCisJRFdPUkQgbV9kd1ByZXNNYXhMYXRlbmN5OwkvLyBjb25zdCBpbiBbbnNdLCBvbmx5IHJlcXVpcmVkIGZvciBJZGVudFJlcworCS8vIDB4MUY5OC40OiBQUmVxQWN0UGF5bG9hZExpbWl0X1UxNgorCXVuc2lnbmVkIGludCBtX3VpUHJlcUFjdFBheWxvYWRMaW1pdDsJLy8gcmVxdWlyZWQgZm9yIGluaXRpYWxpc2F0aW9uICgrMjQgYnl0ZXMpCisJLy8gMHgxRjk4LjU6IFBSZXNBY3RQYXlsb2FkTGltaXRfVTE2CisJdW5zaWduZWQgaW50IG1fdWlQcmVzQWN0UGF5bG9hZExpbWl0OwkvLyByZXF1aXJlZCBmb3IgaW5pdGlhbGlzYXRpb24gb2YgUHJlcyBmcmFtZSAoKzI0IGJ5dGVzKQorCS8vIDB4MUY5OC42OiBBU25kTWF4TGF0ZW5jeV9VMzIKKwlEV09SRCBtX2R3QXNuZE1heExhdGVuY3k7CS8vIGNvbnN0IGluIFtuc10sIG9ubHkgcmVxdWlyZWQgZm9yIElkZW50UmVzCisJLy8gMHgxRjk4Ljc6IE11bHRpcGxDeWNsZUNudF9VOAorCXVuc2lnbmVkIGludCBtX3VpTXVsdGlwbEN5Y2xlQ250OwkvLyByZXF1aXJlZCBmb3IgZXJyb3IgZGV0ZWN0aW9uCisJLy8gMHgxRjk4Ljg6IEFzeW5jTVRVX1UxNgorCXVuc2lnbmVkIGludCBtX3VpQXN5bmNNdHU7CS8vIHJlcXVpcmVkIHRvIHNldCB1cCBtYXggZnJhbWUgc2l6ZQorCS8vICQkJCAweDFGOTguOTogUHJlc2NhbGVyX1UxNgorCS8vICQkJCBNdWx0aXBsZXhlZCBTbG90CisKKwkvLyAweDFDMTQ6IERMTF9Mb3NzT2ZGcmFtZVRvbGVyYW5jZV9VMzIgaW4gW25zXQorCURXT1JEIG1fZHdMb3NzT2ZGcmFtZVRvbGVyYW5jZTsKKworCS8vIDB4MUY4QTogTk1UX01OQ3ljbGVUaW1pbmdfUkVDCisJLy8gMHgxRjhBLjE6IFdhaXRTb0NQUmVxX1UzMiBpbiBbbnNdCisJRFdPUkQgbV9kd1dhaXRTb2NQcmVxOworCisJLy8gMHgxRjhBLjI6IEFzeW5jU2xvdFRpbWVvdXRfVTMyIGluIFtuc10KKwlEV09SRCBtX2R3QXN5bmNTbG90VGltZW91dDsKKworfSB0RXBsRGxsQ29uZmlnUGFyYW07CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBpbnQgbV91aVNpemVPZlN0cnVjdDsKKwlEV09SRCBtX2R3RGV2aWNlVHlwZTsJLy8gTk1UX0RldmljZVR5cGVfVTMyCisJRFdPUkQgbV9kd1ZlbmRvcklkOwkvLyBOTVRfSWRlbnRpdHlPYmplY3RfUkVDLlZlbmRvcklkX1UzMgorCURXT1JEIG1fZHdQcm9kdWN0Q29kZTsJLy8gTk1UX0lkZW50aXR5T2JqZWN0X1JFQy5Qcm9kdWN0Q29kZV9VMzIKKwlEV09SRCBtX2R3UmV2aXNpb25OdW1iZXI7CS8vIE5NVF9JZGVudGl0eU9iamVjdF9SRUMuUmV2aXNpb25Ob19VMzIKKwlEV09SRCBtX2R3U2VyaWFsTnVtYmVyOwkvLyBOTVRfSWRlbnRpdHlPYmplY3RfUkVDLlNlcmlhbE5vX1UzMgorCVFXT1JEIG1fcXdWZW5kb3JTcGVjaWZpY0V4dDE7CisJRFdPUkQgbV9kd1ZlcmlmeUNvbmZpZ3VyYXRpb25EYXRlOwkvLyBDRk1fVmVyaWZ5Q29uZmlndXJhdGlvbl9SRUMuQ29uZkRhdGVfVTMyCisJRFdPUkQgbV9kd1ZlcmlmeUNvbmZpZ3VyYXRpb25UaW1lOwkvLyBDRk1fVmVyaWZ5Q29uZmlndXJhdGlvbl9SRUMuQ29uZlRpbWVfVTMyCisJRFdPUkQgbV9kd0FwcGxpY2F0aW9uU3dEYXRlOwkvLyBQRExfTG9jVmVyQXBwbFN3X1JFQy5BcHBsU3dEYXRlX1UzMiBvbiBwcm9ncmFtbWFibGUgZGV2aWNlIG9yIGRhdGUgcG9ydGlvbiBvZiBOTVRfTWFudWZhY3RTd1ZlcnNfVlMgb24gbm9uLXByb2dyYW1tYWJsZSBkZXZpY2UKKwlEV09SRCBtX2R3QXBwbGljYXRpb25Td1RpbWU7CS8vIFBETF9Mb2NWZXJBcHBsU3dfUkVDLkFwcGxTd1RpbWVfVTMyIG9uIHByb2dyYW1tYWJsZSBkZXZpY2Ugb3IgdGltZSBwb3J0aW9uIG9mIE5NVF9NYW51ZmFjdFN3VmVyc19WUyBvbiBub24tcHJvZ3JhbW1hYmxlIGRldmljZQorCURXT1JEIG1fZHdJcEFkZHJlc3M7CisJRFdPUkQgbV9kd1N1Ym5ldE1hc2s7CisJRFdPUkQgbV9kd0RlZmF1bHRHYXRld2F5OworCUJZVEUgbV9zSG9zdG5hbWVbMzJdOworCUJZVEUgbV9hYlZlbmRvclNwZWNpZmljRXh0Mls0OF07CisKK30gdEVwbERsbElkZW50UGFyYW07CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBpbnQgbV91aU5vZGVJZDsKKwlXT1JEIG1fd1ByZXFQYXlsb2FkTGltaXQ7CS8vIG9iamVjdCAweDFGOEI6IE5NVF9NTlBSZXFQYXlsb2FkTGltaXRMaXN0X0FVMTYKKwlXT1JEIG1fd1ByZXNQYXlsb2FkTGltaXQ7CS8vIG9iamVjdCAweDFGOEQ6IE5NVF9QUmVzUGF5bG9hZExpbWl0TGlzdF9BVTE2CisJRFdPUkQgbV9kd1ByZXNUaW1lb3V0OwkvLyBvYmplY3QgMHgxRjkyOiBOTVRfTU5DTlBSZXNUaW1lb3V0X0FVMzIKKworfSB0RXBsRGxsTm9kZUluZm87CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZW5kaWYgLy8gI2lmbmRlZiBfRVBMX0RMTF9IXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxEbGxDYWwuaCBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsRGxsQ2FsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQ0NjAwOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsRGxsQ2FsLmgKQEAgLTAsMCArMSwxMjMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBpbmNsdWRlIGZpbGUgZm9yIERMTCBDb21tdW5pY2F0aW9uIEFic3RyYWN0aW9uIExheWVyIG1vZHVsZQorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgJFJDU2ZpbGU6IEVwbERsbENhbC5oLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS40ICQgICREYXRlOiAyMDA4LzA0LzE3IDIxOjM2OjMyICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorICAgICAgICAgICAgICAgICAgICBHQ0MgVjMuNAorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgIDIwMDYvMDYvMjAgZC5rLjogICBzdGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24sIHZlcnNpb24gMS4wMAorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9FUExfRExMQ0FMX0hfCisjZGVmaW5lIF9FUExfRExMQ0FMX0hfCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvKiNpZm5kZWYgRVBMX0RMTENBTF9CVUZGRVJfSURfUlgKKyNkZWZpbmUgRVBMX0RMTENBTF9CVUZGRVJfSURfUlggICAgIkVwbFNibERsbENhbFJ4IgorI2VuZGlmCisKKyNpZm5kZWYgRVBMX0RMTENBTF9CVUZGRVJfU0laRV9SWAorI2RlZmluZSBFUExfRExMQ0FMX0JVRkZFUl9TSVpFX1JYICAzMjc2NworI2VuZGlmCisqLworI2lmbmRlZiBFUExfRExMQ0FMX0JVRkZFUl9JRF9UWF9OTVQKKyNkZWZpbmUgRVBMX0RMTENBTF9CVUZGRVJfSURfVFhfTk1UICAgICAiRXBsU2JsRGxsQ2FsVHhObXQiCisjZW5kaWYKKworI2lmbmRlZiBFUExfRExMQ0FMX0JVRkZFUl9TSVpFX1RYX05NVAorI2RlZmluZSBFUExfRExMQ0FMX0JVRkZFUl9TSVpFX1RYX05NVCAgIDMyNzY3CisjZW5kaWYKKworI2lmbmRlZiBFUExfRExMQ0FMX0JVRkZFUl9JRF9UWF9HRU4KKyNkZWZpbmUgRVBMX0RMTENBTF9CVUZGRVJfSURfVFhfR0VOICAgICAiRXBsU2JsRGxsQ2FsVHhHZW4iCisjZW5kaWYKKworI2lmbmRlZiBFUExfRExMQ0FMX0JVRkZFUl9TSVpFX1RYX0dFTgorI2RlZmluZSBFUExfRExMQ0FMX0JVRkZFUl9TSVpFX1RYX0dFTiAgIDMyNzY3CisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHR5cGVkZWYKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3R5cGVkZWYgc3RydWN0IHsKKwl0RXBsRGxsQXNuZFNlcnZpY2VJZCBtX1NlcnZpY2VJZDsKKwl0RXBsRGxsQXNuZEZpbHRlciBtX0ZpbHRlcjsKKworfSB0RXBsRGxsQ2FsQXNuZFNlcnZpY2VJZEZpbHRlcjsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXRFcGxEbGxSZXFTZXJ2aWNlSWQgbV9TZXJ2aWNlOworCXVuc2lnbmVkIGludCBtX3VpTm9kZUlkOworCUJZVEUgbV9iU29hRmxhZzE7CisKK30gdEVwbERsbENhbElzc3VlUmVxdWVzdDsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNlbmRpZiAvLyAjaWZuZGVmIF9FUExfRExMS0NBTF9IXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxEbGxrLmMgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbERsbGsuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTIyNjQxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxEbGxrLmMKQEAgLTAsMCArMSw0MDU0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgb3BlblBPV0VSTElOSworCisgIERlc2NyaXB0aW9uOiAgc291cmNlIGZpbGUgZm9yIGtlcm5lbCBETEwgbW9kdWxlCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRXBsRGxsay5jLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS4yMSAkICAkRGF0ZTogMjAwOC8xMS8xMyAxNzoxMzowOSAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICAgICAgR0NDIFYzLjQKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUmV2aXNpb24gSGlzdG9yeToKKworICAyMDA2LzA2LzEyIGQuay46ICAgc3RhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uLCB2ZXJzaW9uIDEuMDAKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgImtlcm5lbC9FcGxEbGxrLmgiCisjaW5jbHVkZSAia2VybmVsL0VwbERsbGtDYWwuaCIKKyNpbmNsdWRlICJrZXJuZWwvRXBsRXZlbnRrLmgiCisjaW5jbHVkZSAia2VybmVsL0VwbE5tdGsuaCIKKyNpbmNsdWRlICJlZHJ2LmgiCisjaW5jbHVkZSAiQmVuY2htYXJrLmgiCisKKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1BET0spKSAhPSAwKQorI2luY2x1ZGUgImtlcm5lbC9FcGxQZG9rLmgiCisjZW5kaWYKKworI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfVkVUSCkpICE9IDApCisjaW5jbHVkZSAia2VybmVsL1ZpcnR1YWxFdGhlcm5ldC5oIgorI2VuZGlmCisKKy8vI2lmIEVQTF9USU1FUl9VU0VfSElHSFJFUyAhPSBGQUxTRQorI2luY2x1ZGUgImtlcm5lbC9FcGxUaW1lckhpZ2hSZXNrLmgiCisvLyNlbmRpZgorCisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX0RMTEspKSAhPSAwKQorCisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVEspKSA9PSAwKQorI2Vycm9yICJFUEwgbW9kdWxlIERMTEsgbmVlZHMgRVBMIG1vZHVsZSBOTVRLISIKKyNlbmRpZgorCisjaWYgKEVQTF9ETExfUFJFU19SRUFEWV9BRlRFUl9TT0EgIT0gRkFMU0UpICYmIChFUExfRExMX1BSRVNfUkVBRFlfQUZURVJfU09DICE9IEZBTFNFKQorI2Vycm9yICJFUEwgbW9kdWxlIERMTEs6IHNlbGVjdCBvbmx5IG9uZSBvZiBFUExfRExMX1BSRVNfUkVBRFlfQUZURVJfU09BIGFuZCBFUExfRExMX1BSRVNfUkVBRFlfQUZURVJfU09DLiIKKyNlbmRpZgorCisjaWYgKChFUExfRExMX1BSRVNfUkVBRFlfQUZURVJfU09BICE9IEZBTFNFKSB8fCAoRVBMX0RMTF9QUkVTX1JFQURZX0FGVEVSX1NPQyAhPSBGQUxTRSkpIFwKKyAgICAmJiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVF9NTikpID09IDApCisjZXJyb3IgIkVQTCBtb2R1bGUgRExMSzogY3VycmVudGx5LCBFUExfRExMX1BSRVNfUkVBRFlfQUZURVJfKiBpcyBub3Qgc3VwcG9ydGVkIGlmIEVQTF9NT0RVTEVfTk1UX01OIGlzIGVuYWJsZWQuIgorI2VuZGlmCisKKyNpZiAoRURSVl9GQVNUX1RYRlJBTUVTID09IEZBTFNFKSAmJiBcCisgICAgKChFUExfRExMX1BSRVNfUkVBRFlfQUZURVJfU09BICE9IEZBTFNFKSB8fCAoRVBMX0RMTF9QUkVTX1JFQURZX0FGVEVSX1NPQyAhPSBGQUxTRSkpCisjZXJyb3IgIkVQTCBtb2R1bGUgRExMSzogRVBMX0RMTF9QUkVTX1JFQURZX0FGVEVSXyogaXMgZW5hYmxlZCwgYnV0IG5vdCBFRFJWX0ZBU1RfVFhGUkFNRVMuIgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIEcgTCBPIEIgQSBMICAgRCBFIEYgSSBOIEkgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBUcmFjZVBvaW50IHN1cHBvcnQgZm9yIHJlYWx0aW1lLWRlYnVnZ2luZworI2lmZGVmIF9EQkdfVFJBQ0VfUE9JTlRTXwordm9pZCBQVUJMSUMgVGd0RGJnU2lnbmFsVHJhY2VQb2ludChCWVRFIGJUcmFjZVBvaW50TnVtYmVyX3ApOwordm9pZCBQVUJMSUMgVGd0RGJnUG9zdFRyYWNlVmFsdWUoRFdPUkQgZHdUcmFjZVZhbHVlX3ApOworI2RlZmluZSBUR1RfREJHX1NJR05BTF9UUkFDRV9QT0lOVChwKSAgIFRndERiZ1NpZ25hbFRyYWNlUG9pbnQocCkKKyNkZWZpbmUgVEdUX0RCR19QT1NUX1RSQUNFX1ZBTFVFKHYpICAgICBUZ3REYmdQb3N0VHJhY2VWYWx1ZSh2KQorI2Vsc2UKKyNkZWZpbmUgVEdUX0RCR19TSUdOQUxfVFJBQ0VfUE9JTlQocCkKKyNkZWZpbmUgVEdUX0RCR19QT1NUX1RSQUNFX1ZBTFVFKHYpCisjZW5kaWYKKyNkZWZpbmUgRVBMX0RMTEtfREJHX1BPU1RfVFJBQ0VfVkFMVUUoRXZlbnRfcCwgdWlOb2RlSWRfcCwgd0Vycm9yQ29kZV9wKSBcCisgICAgVEdUX0RCR19QT1NUX1RSQUNFX1ZBTFVFKChrRXBsRXZlbnRTaW5rRGxsayA8PCAyOCkgfCAoRXZlbnRfcCA8PCAyNCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICh1aU5vZGVJZF9wIDw8IDE2KSB8IHdFcnJvckNvZGVfcCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgQyBMIEEgUyBTICBFcGxEbGxrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8vCisvLyBEZXNjcmlwdGlvbjoKKy8vCisvLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICBQIFIgSSBWIEEgVCBFICAgRCBFIEYgSSBOIEkgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBkZWZpbmVzIGZvciBpbmRleGVzIG9mIHRFcGxEbGxJbnN0YW5jZS5tX3BUeEZyYW1lSW5mbworI2RlZmluZSBFUExfRExMS19UWEZSQU1FX0lERU5UUkVTICAgMAkvLyBJZGVudFJlc3BvbnNlIG9uIENOIC8gTU4KKyNkZWZpbmUgRVBMX0RMTEtfVFhGUkFNRV9TVEFUVVNSRVMgIDEJLy8gU3RhdHVzUmVzcG9uc2Ugb24gQ04gLyBNTgorI2RlZmluZSBFUExfRExMS19UWEZSQU1FX05NVFJFUSAgICAgMgkvLyBOTVQgUmVxdWVzdCBmcm9tIEZJRk8gb24gQ04gLyBNTgorI2RlZmluZSBFUExfRExMS19UWEZSQU1FX05PTkVQTCAgICAgMwkvLyBub24tRVBMIGZyYW1lIGZyb20gRklGTyBvbiBDTiAvIE1OCisjZGVmaW5lIEVQTF9ETExLX1RYRlJBTUVfUFJFUyAgICAgICA0CS8vIFBSZXMgb24gQ04gLyBNTgorI2RlZmluZSBFUExfRExMS19UWEZSQU1FX1NPQyAgICAgICAgNQkvLyBTb0Mgb24gTU4KKyNkZWZpbmUgRVBMX0RMTEtfVFhGUkFNRV9TT0EgICAgICAgIDYJLy8gU29BIG9uIE1OCisjZGVmaW5lIEVQTF9ETExLX1RYRlJBTUVfUFJFUSAgICAgICA3CS8vIFBSZXEgb24gTU4KKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UX01OKSkgIT0gMCkKKyNkZWZpbmUgRVBMX0RMTEtfVFhGUkFNRV9DT1VOVCAgICAgICg3ICsgRVBMX0RfTk1UX01heENOTnVtYmVyX1U4ICsgMikJLy8gb24gTU46IDcgKyBNYXhQUmVxIG9mIHJlZ3VsYXIgQ05zICsgMSBEaWFnICsgMSBSb3V0ZXIKKyNlbHNlCisjZGVmaW5lIEVQTF9ETExLX1RYRlJBTUVfQ09VTlQgICAgICA1CS8vIG9uIENOOiA1CisjZW5kaWYKKworI2RlZmluZSBFUExfRExMS19CVUZMRU5fRU1QVFkgICAgICAgMAkvLyBidWZmZXIgaXMgZW1wdHkKKyNkZWZpbmUgRVBMX0RMTEtfQlVGTEVOX0ZJTExJTkcgICAgIDEJLy8ganVzdCB0aGUgYnVmZmVyIGlzIGJlaW5nIGZpbGxlZAorI2RlZmluZSBFUExfRExMS19CVUZMRU5fTUlOICAgICAgICAgNjAJLy8gbWluaW11bSBldGhlcm5ldCBmcmFtZSBsZW5ndGgKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvY2FsIHR5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0eXBlZGVmIGVudW0geworCWtFcGxEbGxHc0luaXQgPSAweDAwLAkvLyBNTi9DTjogaW5pdGlhbGlzYXRpb24gKDwgUHJlT3AyKQorCWtFcGxEbGxDc1dhaXRQcmVxID0gMHgwMSwJLy8gQ046IHdhaXQgZm9yIFBSZXEgZnJhbWUKKwlrRXBsRGxsQ3NXYWl0U29jID0gMHgwMiwJLy8gQ046IHdhaXQgZm9yIFNvQyBmcmFtZQorCWtFcGxEbGxDc1dhaXRTb2EgPSAweDAzLAkvLyBDTjogd2FpdCBmb3IgU29BIGZyYW1lCisJa0VwbERsbE1zTm9uQ3ljbGljID0gMHgwNCwJLy8gTU46IHJlZHVjZWQgRVBMIGN5Y2xlIChQcmVPcDEpCisJa0VwbERsbE1zV2FpdFNvY1RyaWcgPSAweDA1LAkvLyBNTjogd2FpdCBmb3IgU29DIHRyaWdnZXIgKGN5Y2xlIHRpbWVyKQorCWtFcGxEbGxNc1dhaXRQcmVxVHJpZyA9IDB4MDYsCS8vIE1OOiB3YWl0IGZvciAoZmlyc3QpIFBSZXEgdHJpZ2dlciAoV2FpdFNvQ1BSZXFfVTMyKQorCWtFcGxEbGxNc1dhaXRQcmVzID0gMHgwNywJLy8gTU46IHdhaXQgZm9yIFBSZXMgZnJhbWUgZnJvbSBDTgorCWtFcGxEbGxNc1dhaXRTb2FUcmlnID0gMHgwOCwJLy8gTU46IHdhaXQgZm9yIFNvQSB0cmlnZ2VyIChQUmVzIHRyYW5zbWl0dGVkKQorCWtFcGxEbGxNc1dhaXRBc25kVHJpZyA9IDB4MDksCS8vIE1OOiB3YWl0IGZvciBBU25kIHRyaWdnZXIgKFNvQSB0cmFuc21pdHRlZCkKKwlrRXBsRGxsTXNXYWl0QXNuZCA9IDB4MEEsCS8vIE1OOiB3YWl0IGZvciBBU25kIGZyYW1lIGlmIFNvQSBjb250YWluZWQgaW52aXRhdGlvbgorCit9IHRFcGxEbGxTdGF0ZTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCUJZVEUgbV9iZV9hYlNyY01hY1s2XTsKKwl0RWRydlR4QnVmZmVyICptX3BUeEJ1ZmZlcjsJLy8gQnVmZmVycyBmb3IgVHgtRnJhbWVzCisJdW5zaWduZWQgaW50IG1fdWlNYXhUeEZyYW1lczsKKwlCWVRFIG1fYkZsYWcxOwkJLy8gRmxhZyAxIHdpdGggRU4sIEVDIGZvciBQUmVzLCBTdGF0dXNSZXMKKwlCWVRFIG1fYk1uRmxhZzE7CS8vIEZsYWcgMSB3aXRoIEVBLCBFUiBmcm9tIFBSZXEsIFNvQSBvZiBNTgorCUJZVEUgbV9iRmxhZzI7CQkvLyBGbGFnIDIgd2l0aCBQUiBhbmQgUlMgZm9yIFBSZXMsIFN0YXR1c1JlcywgSWRlbnRSZXMKKwl0RXBsRGxsQ29uZmlnUGFyYW0gbV9EbGxDb25maWdQYXJhbTsKKwl0RXBsRGxsSWRlbnRQYXJhbSBtX0RsbElkZW50UGFyYW07CisJdEVwbERsbFN0YXRlIG1fRGxsU3RhdGU7CisJdEVwbERsbGtDYkFzeW5jIG1fcGZuQ2JBc3luYzsKKwl0RXBsRGxsQXNuZEZpbHRlciBtX2FBc25kRmlsdGVyW0VQTF9ETExfTUFYX0FTTkRfU0VSVklDRV9JRF07CisKKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVF9NTikpICE9IDApCisJdEVwbERsbGtOb2RlSW5mbyAqbV9wRmlyc3ROb2RlSW5mbzsKKwl0RXBsRGxsa05vZGVJbmZvICptX3BDdXJOb2RlSW5mbzsKKwl0RXBsRGxsa05vZGVJbmZvIG1fYU5vZGVJbmZvW0VQTF9OTVRfTUFYX05PREVfSURdOworCXRFcGxEbGxSZXFTZXJ2aWNlSWQgbV9MYXN0UmVxU2VydmljZUlkOworCXVuc2lnbmVkIGludCBtX3VpTGFzdFRhcmdldE5vZGVJZDsKKyNlbmRpZgorCisjaWYgRVBMX1RJTUVSX1VTRV9ISUdIUkVTICE9IEZBTFNFCisJdEVwbFRpbWVySGRsIG1fVGltZXJIZGxDeWNsZTsJLy8gdXNlZCBmb3IgRVBMIGN5Y2xlIG1vbml0b3Jpbmcgb24gQ04gYW5kIGdlbmVyYXRpb24gb24gTU4KKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVF9NTikpICE9IDApCisJdEVwbFRpbWVySGRsIG1fVGltZXJIZGxSZXNwb25zZTsJLy8gdXNlZCBmb3IgQ04gcmVzcG9uc2UgbW9uaXRvcmluZworI2VuZGlmCQkJCS8vKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRfTU4pKSAhPSAwKQorI2VuZGlmCisKKwl1bnNpZ25lZCBpbnQgbV91aUN5Y2xlQ291bnQ7CS8vIGN5Y2xlIGNvdW50ZXIgKG5lZWRlZCBmb3IgbXVsdGlwbGV4ZWQgY3ljbGUgc3VwcG9ydCkKKwl1bnNpZ25lZCBsb25nIGxvbmcgbV91bGxGcmFtZVRpbWVvdXQ7CS8vIGZyYW1lIHRpbWVvdXQgKGN5Y2xlIGxlbmd0aCArIGxvc3Mgb2YgZnJhbWUgdG9sZXJhbmNlKQorCit9IHRFcGxEbGxrSW5zdGFuY2U7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCB2YXJzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBpZiBubyBkeW5hbWljIG1lbW9yeSBhbGxvY2F0aW9uIHNoYWxsIGJlIHVzZWQKKy8vIGRlZmluZSBzdHJ1Y3R1cmVzIHN0YXRpY2FsbHkKK3N0YXRpYyB0RXBsRGxsa0luc3RhbmNlIEVwbERsbGtJbnN0YW5jZV9nOworCitzdGF0aWMgdEVkcnZUeEJ1ZmZlciBhRXBsRGxsa1R4QnVmZmVyX2xbRVBMX0RMTEtfVFhGUkFNRV9DT1VOVF07CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBjaGFuZ2UgRExMIHN0YXRlIG9uIGV2ZW50CitzdGF0aWMgdEVwbEtlcm5lbCBFcGxEbGxrQ2hhbmdlU3RhdGUodEVwbE5tdEV2ZW50IE5tdEV2ZW50X3AsCisJCQkJICAgICB0RXBsTm10U3RhdGUgTm10U3RhdGVfcCk7CisKKy8vIGNhbGxlZCBmcm9tIEVkcnZJbnRlcnJ1cHRIYW5kbGVyKCkKK3N0YXRpYyB2b2lkIEVwbERsbGtDYkZyYW1lUmVjZWl2ZWQodEVkcnZSeEJ1ZmZlciAqIHBSeEJ1ZmZlcl9wKTsKKworLy8gY2FsbGVkIGZyb20gRWRydkludGVycnVwdEhhbmRsZXIoKQorc3RhdGljIHZvaWQgRXBsRGxsa0NiRnJhbWVUcmFuc21pdHRlZCh0RWRydlR4QnVmZmVyICogcFR4QnVmZmVyX3ApOworCisvLyBjaGVjayBmcmFtZSBhbmQgc2V0IG1pc3NpbmcgaW5mb3JtYXRpb24KK3N0YXRpYyB0RXBsS2VybmVsIEVwbERsbGtDaGVja0ZyYW1lKHRFcGxGcmFtZSAqIHBGcmFtZV9wLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgdWlGcmFtZVNpemVfcCk7CisKKy8vIGNhbGxlZCBieSBoaWdoIHJlc29sdXRpb24gdGltZXIgbW9kdWxlIHRvIG1vbml0b3IgRVBMIGN5Y2xlIGFzIENOCisjaWYgRVBMX1RJTUVSX1VTRV9ISUdIUkVTICE9IEZBTFNFCitzdGF0aWMgdEVwbEtlcm5lbCBQVUJMSUMgRXBsRGxsa0NiQ25UaW1lcih0RXBsVGltZXJFdmVudEFyZyAqIHBFdmVudEFyZ19wKTsKKyNlbmRpZgorCisjaWYgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRfTU4pKSAhPSAwKQorLy8gTU46IHJldHVybnMgaW50ZXJuYWwgbm9kZSBpbmZvIHN0cnVjdHVyZQorc3RhdGljIHRFcGxEbGxrTm9kZUluZm8gKkVwbERsbGtHZXROb2RlSW5mbyh1bnNpZ25lZCBpbnQgdWlOb2RlSWRfcCk7CisKKy8vIHRyYW5zbWl0IFNvQQorc3RhdGljIHRFcGxLZXJuZWwgRXBsRGxsa01uU2VuZFNvYSh0RXBsTm10U3RhdGUgTm10U3RhdGVfcCwKKwkJCQkgICB0RXBsRGxsU3RhdGUgKiBwRGxsU3RhdGVQcm9wb3NlZF9wLAorCQkJCSAgIEJPT0wgZkVuYWJsZUludml0YXRpb25fcCk7CisKK3N0YXRpYyB0RXBsS2VybmVsIEVwbERsbGtNblNlbmRTb2Modm9pZCk7CisKK3N0YXRpYyB0RXBsS2VybmVsIEVwbERsbGtNblNlbmRQcmVxKHRFcGxObXRTdGF0ZSBObXRTdGF0ZV9wLAorCQkJCSAgICB0RXBsRGxsU3RhdGUgKiBwRGxsU3RhdGVQcm9wb3NlZF9wKTsKKworc3RhdGljIHRFcGxLZXJuZWwgRXBsRGxsa0FzeW5jRnJhbWVOb3RSZWNlaXZlZCh0RXBsRGxsUmVxU2VydmljZUlkCisJCQkJCSAgICAgICBSZXFTZXJ2aWNlSWRfcCwKKwkJCQkJICAgICAgIHVuc2lnbmVkIGludCB1aU5vZGVJZF9wKTsKKworc3RhdGljIHRFcGxLZXJuZWwgUFVCTElDIEVwbERsbGtDYk1uVGltZXJDeWNsZSh0RXBsVGltZXJFdmVudEFyZyAqIHBFdmVudEFyZ19wKTsKKworc3RhdGljIHRFcGxLZXJuZWwgUFVCTElDIEVwbERsbGtDYk1uVGltZXJSZXNwb25zZSh0RXBsVGltZXJFdmVudEFyZyAqCisJCQkJCQkgIHBFdmVudEFyZ19wKTsKKworI2VuZGlmCisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgUCBVIEIgTCBJIEMgICBGIFUgTiBDIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxEbGxrQWRkSW5zdGFuY2UoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBhZGQgYW5kIGluaXRpYWxpemUgbmV3IGluc3RhbmNlIG9mIEVQTCBzdGFjaworLy8KKy8vIFBhcmFtZXRlcnM6ICBwSW5pdFBhcmFtX3AgICAgICAgICAgICA9IGluaXRpYWxpc2F0aW9uIHBhcmFtZXRlcnMgbGlrZSBNQUMgYWRkcmVzcworLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordEVwbEtlcm5lbCBFcGxEbGxrQWRkSW5zdGFuY2UodEVwbERsbGtJbml0UGFyYW0gKiBwSW5pdFBhcmFtX3ApCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwl1bnNpZ25lZCBpbnQgdWlJbmRleDsKKwl0RWRydkluaXRQYXJhbSBFZHJ2SW5pdFBhcmFtOworCisJLy8gcmVzZXQgaW5zdGFuY2Ugc3RydWN0dXJlCisJRVBMX01FTVNFVCgmRXBsRGxsa0luc3RhbmNlX2csIDAsIHNpemVvZihFcGxEbGxrSW5zdGFuY2VfZykpOworCisjaWYgRVBMX1RJTUVSX1VTRV9ISUdIUkVTICE9IEZBTFNFCisJUmV0ID0gRXBsVGltZXJIaWdoUmVza0luaXQoKTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CS8vIGVycm9yIG9jY3VyZWQgd2hpbGUgaW5pdGlhbGl6aW5nIGhpZ2ggcmVzb2x1dGlvbiB0aW1lciBtb2R1bGUKKwkJZ290byBFeGl0OworCX0KKyNlbmRpZgorCisJLy8gaWYgZHluYW1pYyBtZW1vcnkgYWxsb2NhdGlvbiBhdmFpbGFibGUKKwkvLyBhbGxvY2F0ZSBpbnN0YW5jZSBzdHJ1Y3R1cmUKKwkvLyBhbGxvY2F0ZSBUUERPIGFuZCBSUERPIHRhYmxlIHdpdGggZGVmYXVsdCBzaXplCisKKwkvLyBpbml0aWFsaXplIGFuZCBsaW5rIHBvaW50ZXJzIGluIGluc3RhbmNlIHN0cnVjdHVyZSB0byBmcmFtZSB0YWJsZXMKKwlFcGxEbGxrSW5zdGFuY2VfZy5tX3BUeEJ1ZmZlciA9IGFFcGxEbGxrVHhCdWZmZXJfbDsKKwlFcGxEbGxrSW5zdGFuY2VfZy5tX3VpTWF4VHhGcmFtZXMgPQorCSAgICBzaXplb2YoYUVwbERsbGtUeEJ1ZmZlcl9sKSAvIHNpemVvZih0RWRydlR4QnVmZmVyKTsKKworCS8vIGluaXRpYWxpemUgc3RhdGUKKwlFcGxEbGxrSW5zdGFuY2VfZy5tX0RsbFN0YXRlID0ga0VwbERsbEdzSW5pdDsKKworI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UX01OKSkgIT0gMCkKKwkvLyBzZXQgdXAgbm9kZSBpbmZvIHN0cnVjdHVyZQorCWZvciAodWlJbmRleCA9IDA7IHVpSW5kZXggPCB0YWJlbnRyaWVzKEVwbERsbGtJbnN0YW5jZV9nLm1fYU5vZGVJbmZvKTsKKwkgICAgIHVpSW5kZXgrKykgeworCQlFcGxEbGxrSW5zdGFuY2VfZy5tX2FOb2RlSW5mb1t1aUluZGV4XS5tX3VpTm9kZUlkID0gdWlJbmRleCArIDE7CisJCUVwbERsbGtJbnN0YW5jZV9nLm1fYU5vZGVJbmZvW3VpSW5kZXhdLm1fd1ByZXNQYXlsb2FkTGltaXQgPQorCQkgICAgMHhGRkZGOworCX0KKyNlbmRpZgorCisJLy8gaW5pdGlhbGl6ZSBFZHJ2CisJRVBMX01FTUNQWShFZHJ2SW5pdFBhcmFtLm1fYWJNeU1hY0FkZHIsIHBJbml0UGFyYW1fcC0+bV9iZV9hYlNyY01hYywgNik7CisJRWRydkluaXRQYXJhbS5tX3BmblJ4SGFuZGxlciA9IEVwbERsbGtDYkZyYW1lUmVjZWl2ZWQ7CisJRWRydkluaXRQYXJhbS5tX3BmblR4SGFuZGxlciA9IEVwbERsbGtDYkZyYW1lVHJhbnNtaXR0ZWQ7CisJUmV0ID0gRWRydkluaXQoJkVkcnZJbml0UGFyYW0pOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsJLy8gZXJyb3Igb2NjdXJlZCB3aGlsZSBpbml0aWFsaXppbmcgZXRoZXJuZXQgZHJpdmVyCisJCWdvdG8gRXhpdDsKKwl9CisJLy8gY29weSBsb2NhbCBNQUMgYWRkcmVzcyBmcm9tIEV0aGVybmV0IGRyaXZlciBiYWNrIHRvIGxvY2FsIGluc3RhbmNlIHN0cnVjdHVyZQorCS8vIGJlY2F1c2UgRXRoZXJuZXQgZHJpdmVyIG1heSBoYXZlIHJlYWQgaXQgZnJvbSBjb250cm9sbGVyIEVFUFJPTQorCUVQTF9NRU1DUFkoRXBsRGxsa0luc3RhbmNlX2cubV9iZV9hYlNyY01hYywgRWRydkluaXRQYXJhbS5tX2FiTXlNYWNBZGRyLAorCQkgICA2KTsKKwlFUExfTUVNQ1BZKHBJbml0UGFyYW1fcC0+bV9iZV9hYlNyY01hYywgRWRydkluaXRQYXJhbS5tX2FiTXlNYWNBZGRyLCA2KTsKKworCS8vIGluaXRpYWxpemUgVHhCdWZmZXIgYXJyYXkKKwlmb3IgKHVpSW5kZXggPSAwOyB1aUluZGV4IDwgRXBsRGxsa0luc3RhbmNlX2cubV91aU1heFR4RnJhbWVzOworCSAgICAgdWlJbmRleCsrKSB7CisJCUVwbERsbGtJbnN0YW5jZV9nLm1fcFR4QnVmZmVyW3VpSW5kZXhdLm1fcGJCdWZmZXIgPSBOVUxMOworCX0KKworI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfVkVUSCkpICE9IDApCisJUmV0ID0gVkV0aEFkZEluc3RhbmNlKHBJbml0UGFyYW1fcCk7CisjZW5kaWYKKworICAgICAgRXhpdDoKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxEbGxrRGVsSW5zdGFuY2UoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBkZWxldGVzIGFuIGluc3RhbmNlIG9mIEVQTCBzdGFjaworLy8KKy8vIFBhcmFtZXRlcnM6ICAobm9uZSkKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgRXBsRGxsa0RlbEluc3RhbmNlKHZvaWQpCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCS8vIHJlc2V0IHN0YXRlCisJRXBsRGxsa0luc3RhbmNlX2cubV9EbGxTdGF0ZSA9IGtFcGxEbGxHc0luaXQ7CisKKyNpZiBFUExfVElNRVJfVVNFX0hJR0hSRVMgIT0gRkFMU0UKKwlSZXQgPSBFcGxUaW1lckhpZ2hSZXNrRGVsSW5zdGFuY2UoKTsKKyNlbmRpZgorCisjaWYgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9WRVRIKSkgIT0gMCkKKwlSZXQgPSBWRXRoRGVsSW5zdGFuY2UoKTsKKyNlbmRpZgorCisJUmV0ID0gRWRydlNodXRkb3duKCk7CisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsRGxsa0NyZWF0ZVR4RnJhbWUKKy8vCisvLyBEZXNjcmlwdGlvbjogY3JlYXRlcyB0aGUgYnVmZmVyIGZvciBhIFR4IGZyYW1lIGFuZCByZWdpc3RlcnMgaXQgdG8gdGhlCisvLyAgICAgICAgICAgICAgZXRoZXJuZXQgZHJpdmVyCisvLworLy8gUGFyYW1ldGVyczogIHB1aUhhbmRsZV9wICAgICAgICAgICAgID0gT1VUOiBoYW5kbGUgdG8gZnJhbWUgYnVmZmVyCisvLyAgICAgICAgICAgICAgcHBGcmFtZV9wICAgICAgICAgICAgICAgPSBPVVQ6IHBvaW50ZXIgdG8gcG9pbnRlciBvZiBFUEwgZnJhbWUKKy8vICAgICAgICAgICAgICBwdWlGcmFtZVNpemVfcCAgICAgICAgICA9IElOL09VVDogcG9pbnRlciB0byBzaXplIG9mIGZyYW1lCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5lZCBzaXplIGlzIGFsd2F5cyBlcXVhbCBvciBsYXJnZXIgdGhhbgorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkIHNpemUsIGlmIHRoYXQgaXMgbm90IHBvc3NpYmxlCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbiBlcnJvciB3aWxsIGJlIHJldHVybmVkCisvLyAgICAgICAgICAgICAgTXNnVHlwZV9wICAgICAgICAgICAgICAgPSBFUEwgbWVzc2FnZSB0eXBlCisvLyAgICAgICAgICAgICAgU2VydmljZUlkX3AgICAgICAgICAgICAgPSBTZXJ2aWNlIElEIGluIGNhc2Ugb2YgQVNuZCBmcmFtZSwgb3RoZXJ3aXNlCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrRXBsRGxsQXNuZE5vdERlZmluZWQKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgRXBsRGxsa0NyZWF0ZVR4RnJhbWUodW5zaWduZWQgaW50ICpwdWlIYW5kbGVfcCwKKwkJCQl0RXBsRnJhbWUgKiogcHBGcmFtZV9wLAorCQkJCXVuc2lnbmVkIGludCAqcHVpRnJhbWVTaXplX3AsCisJCQkJdEVwbE1zZ1R5cGUgTXNnVHlwZV9wLAorCQkJCXRFcGxEbGxBc25kU2VydmljZUlkIFNlcnZpY2VJZF9wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJdEVwbEZyYW1lICpwVHhGcmFtZTsKKwl1bnNpZ25lZCBpbnQgdWlIYW5kbGUgPSBFcGxEbGxrSW5zdGFuY2VfZy5tX3VpTWF4VHhGcmFtZXM7CisJdEVkcnZUeEJ1ZmZlciAqcFR4QnVmZmVyID0gTlVMTDsKKworCWlmIChNc2dUeXBlX3AgPT0ga0VwbE1zZ1R5cGVBc25kKSB7CisJCS8vIHNlYXJjaCBmb3IgZml4ZWQgVHggYnVmZmVycworCQlpZiAoU2VydmljZUlkX3AgPT0ga0VwbERsbEFzbmRJZGVudFJlc3BvbnNlKSB7CisJCQl1aUhhbmRsZSA9IEVQTF9ETExLX1RYRlJBTUVfSURFTlRSRVM7CisJCX0gZWxzZSBpZiAoU2VydmljZUlkX3AgPT0ga0VwbERsbEFzbmRTdGF0dXNSZXNwb25zZSkgeworCQkJdWlIYW5kbGUgPSBFUExfRExMS19UWEZSQU1FX1NUQVRVU1JFUzsKKwkJfSBlbHNlIGlmICgoU2VydmljZUlkX3AgPT0ga0VwbERsbEFzbmRObXRSZXF1ZXN0KQorCQkJICAgfHwgKFNlcnZpY2VJZF9wID09IGtFcGxEbGxBc25kTm10Q29tbWFuZCkpIHsKKwkJCXVpSGFuZGxlID0gRVBMX0RMTEtfVFhGUkFNRV9OTVRSRVE7CisJCX0KKworCQlpZiAodWlIYW5kbGUgPj0gRXBsRGxsa0luc3RhbmNlX2cubV91aU1heFR4RnJhbWVzKSB7CS8vIGxvb2sgZm9yIGZyZWUgZW50cnkKKwkJCXVpSGFuZGxlID0gRVBMX0RMTEtfVFhGUkFNRV9QUkVROworCQkJcFR4QnVmZmVyID0gJkVwbERsbGtJbnN0YW5jZV9nLm1fcFR4QnVmZmVyW3VpSGFuZGxlXTsKKwkJCWZvciAoOyB1aUhhbmRsZSA8IEVwbERsbGtJbnN0YW5jZV9nLm1fdWlNYXhUeEZyYW1lczsKKwkJCSAgICAgdWlIYW5kbGUrKywgcFR4QnVmZmVyKyspIHsKKwkJCQlpZiAocFR4QnVmZmVyLT5tX3BiQnVmZmVyID09IE5VTEwpIHsJLy8gZnJlZSBlbnRyeSBmb3VuZAorCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKwl9IGVsc2UgaWYgKE1zZ1R5cGVfcCA9PSBrRXBsTXNnVHlwZU5vbkVwbCkgeworCQl1aUhhbmRsZSA9IEVQTF9ETExLX1RYRlJBTUVfTk9ORVBMOworCX0gZWxzZSBpZiAoTXNnVHlwZV9wID09IGtFcGxNc2dUeXBlUHJlcykgeworCQl1aUhhbmRsZSA9IEVQTF9ETExLX1RYRlJBTUVfUFJFUzsKKwl9IGVsc2UgaWYgKE1zZ1R5cGVfcCA9PSBrRXBsTXNnVHlwZVNvYykgeworCQl1aUhhbmRsZSA9IEVQTF9ETExLX1RYRlJBTUVfU09DOworCX0gZWxzZSBpZiAoTXNnVHlwZV9wID09IGtFcGxNc2dUeXBlU29hKSB7CisJCXVpSGFuZGxlID0gRVBMX0RMTEtfVFhGUkFNRV9TT0E7CisJfSBlbHNlIHsJCS8vIGxvb2sgZm9yIGZyZWUgZW50cnkKKwkJdWlIYW5kbGUgPSBFUExfRExMS19UWEZSQU1FX1BSRVE7CisJCXBUeEJ1ZmZlciA9ICZFcGxEbGxrSW5zdGFuY2VfZy5tX3BUeEJ1ZmZlclt1aUhhbmRsZV07CisJCWZvciAoOyB1aUhhbmRsZSA8IEVwbERsbGtJbnN0YW5jZV9nLm1fdWlNYXhUeEZyYW1lczsKKwkJICAgICB1aUhhbmRsZSsrLCBwVHhCdWZmZXIrKykgeworCQkJaWYgKHBUeEJ1ZmZlci0+bV9wYkJ1ZmZlciA9PSBOVUxMKSB7CS8vIGZyZWUgZW50cnkgZm91bmQKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAocFR4QnVmZmVyLT5tX3BiQnVmZmVyICE9IE5VTEwpIHsKKwkJCVJldCA9IGtFcGxFZHJ2Tm9GcmVlQnVmRW50cnk7CisJCQlnb3RvIEV4aXQ7CisJCX0KKwl9CisKKwkvLyB0ZXN0IGlmIHJlcXVlc3RlZCBlbnRyeSBpcyBmcmVlCisJcFR4QnVmZmVyID0gJkVwbERsbGtJbnN0YW5jZV9nLm1fcFR4QnVmZmVyW3VpSGFuZGxlXTsKKwlpZiAocFR4QnVmZmVyLT5tX3BiQnVmZmVyICE9IE5VTEwpIHsJLy8gZW50cnkgaXMgbm90IGZyZWUKKwkJUmV0ID0ga0VwbEVkcnZOb0ZyZWVCdWZFbnRyeTsKKwkJZ290byBFeGl0OworCX0KKwkvLyBzZXR1cCBUeCBidWZmZXIKKwlwVHhCdWZmZXItPm1fRXBsTXNnVHlwZSA9IE1zZ1R5cGVfcDsKKwlwVHhCdWZmZXItPm1fdWlNYXhCdWZmZXJMZW4gPSAqcHVpRnJhbWVTaXplX3A7CisKKwlSZXQgPSBFZHJ2QWxsb2NUeE1zZ0J1ZmZlcihwVHhCdWZmZXIpOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsJLy8gZXJyb3Igb2NjdXJlZCB3aGlsZSByZWdpc3RlcmluZyBUeCBmcmFtZQorCQlnb3RvIEV4aXQ7CisJfQorCS8vIGJlY2F1c2UgYnVmZmVyIHNpemUgbWF5IGJlIGxhcmdlciB0aGFuIHJlcXVlc3RlZAorCS8vIG1lbW9yaXplIHJlYWwgbGVuZ3RoIG9mIGZyYW1lCisJcFR4QnVmZmVyLT5tX3VpVHhNc2dMZW4gPSAqcHVpRnJhbWVTaXplX3A7CisKKwkvLyBmaWxsIHdob2xlIGZyYW1lIHdpdGggMAorCUVQTF9NRU1TRVQocFR4QnVmZmVyLT5tX3BiQnVmZmVyLCAwLCBwVHhCdWZmZXItPm1fdWlNYXhCdWZmZXJMZW4pOworCisJcFR4RnJhbWUgPSAodEVwbEZyYW1lICopIHBUeEJ1ZmZlci0+bV9wYkJ1ZmZlcjsKKworCWlmIChNc2dUeXBlX3AgIT0ga0VwbE1zZ1R5cGVOb25FcGwpIHsJLy8gZmlsbCBvdXQgRnJhbWUgb25seSBpZiBpdCBpcyBhbiBFUEwgZnJhbWUKKwkJLy8gZXRoZXJ0eXBlCisJCUFtaVNldFdvcmRUb0JlKCZwVHhGcmFtZS0+bV9iZV93RXRoZXJUeXBlLAorCQkJICAgICAgIEVQTF9DX0RMTF9FVEhFUlRZUEVfRVBMKTsKKwkJLy8gc291cmNlIG5vZGUgSUQKKwkJQW1pU2V0Qnl0ZVRvTGUoJnBUeEZyYW1lLT5tX2xlX2JTcmNOb2RlSWQsCisJCQkgICAgICAgKEJZVEUpIEVwbERsbGtJbnN0YW5jZV9nLm1fRGxsQ29uZmlnUGFyYW0uCisJCQkgICAgICAgbV91aU5vZGVJZCk7CisJCS8vIHNvdXJjZSBNQUMgYWRkcmVzcworCQlFUExfTUVNQ1BZKCZwVHhGcmFtZS0+bV9iZV9hYlNyY01hY1swXSwKKwkJCSAgICZFcGxEbGxrSW5zdGFuY2VfZy5tX2JlX2FiU3JjTWFjWzBdLCA2KTsKKwkJc3dpdGNoIChNc2dUeXBlX3ApIHsKKwkJY2FzZSBrRXBsTXNnVHlwZUFzbmQ6CisJCQkvLyBkZXN0aW5hdGlvbiBNQUMgYWRkcmVzcworCQkJQW1pU2V0UXdvcmQ0OFRvQmUoJnBUeEZyYW1lLT5tX2JlX2FiRHN0TWFjWzBdLAorCQkJCQkgIEVQTF9DX0RMTF9NVUxUSUNBU1RfQVNORCk7CisJCQkvLyBkZXN0aW5hdGlvbiBub2RlIElECisJCQlzd2l0Y2ggKFNlcnZpY2VJZF9wKSB7CisJCQljYXNlIGtFcGxEbGxBc25kSWRlbnRSZXNwb25zZToKKwkJCWNhc2Uga0VwbERsbEFzbmRTdGF0dXNSZXNwb25zZToKKwkJCQl7CS8vIElkZW50UmVzcG9uc2VzIGFuZCBTdGF0dXNSZXNwb25zZXMgYXJlIEJyb2FkY2FzdAorCQkJCQlBbWlTZXRCeXRlVG9MZSgmcFR4RnJhbWUtPgorCQkJCQkJICAgICAgIG1fbGVfYkRzdE5vZGVJZCwKKwkJCQkJCSAgICAgICAoQllURSkKKwkJCQkJCSAgICAgICBFUExfQ19BRFJfQlJPQURDQVNUKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQlkZWZhdWx0OgorCQkJCWJyZWFrOworCQkJfQorCQkJLy8gQVNuZCBTZXJ2aWNlIElECisJCQlBbWlTZXRCeXRlVG9MZSgmcFR4RnJhbWUtPm1fRGF0YS5tX0FzbmQubV9sZV9iU2VydmljZUlkLAorCQkJCSAgICAgICBTZXJ2aWNlSWRfcCk7CisJCQlicmVhazsKKworCQljYXNlIGtFcGxNc2dUeXBlU29jOgorCQkJLy8gZGVzdGluYXRpb24gTUFDIGFkZHJlc3MKKwkJCUFtaVNldFF3b3JkNDhUb0JlKCZwVHhGcmFtZS0+bV9iZV9hYkRzdE1hY1swXSwKKwkJCQkJICBFUExfQ19ETExfTVVMVElDQVNUX1NPQyk7CisJCQkvLyBkZXN0aW5hdGlvbiBub2RlIElECisJCQlBbWlTZXRCeXRlVG9MZSgmcFR4RnJhbWUtPm1fbGVfYkRzdE5vZGVJZCwKKwkJCQkgICAgICAgKEJZVEUpIEVQTF9DX0FEUl9CUk9BRENBU1QpOworCQkJLy8gcmVzZXQgRmxhZ3MKKwkJCS8vQW1pU2V0Qnl0ZVRvTGUoJnBUeEZyYW1lLT5tX0RhdGEubV9Tb2MubV9sZV9iRmxhZzEsIChCWVRFKSAwKTsKKwkJCS8vQW1pU2V0Qnl0ZVRvTGUoJnBUeEZyYW1lLT5tX0RhdGEubV9Tb2MubV9sZV9iRmxhZzIsIChCWVRFKSAwKTsKKwkJCWJyZWFrOworCisJCWNhc2Uga0VwbE1zZ1R5cGVTb2E6CisJCQkvLyBkZXN0aW5hdGlvbiBNQUMgYWRkcmVzcworCQkJQW1pU2V0UXdvcmQ0OFRvQmUoJnBUeEZyYW1lLT5tX2JlX2FiRHN0TWFjWzBdLAorCQkJCQkgIEVQTF9DX0RMTF9NVUxUSUNBU1RfU09BKTsKKwkJCS8vIGRlc3RpbmF0aW9uIG5vZGUgSUQKKwkJCUFtaVNldEJ5dGVUb0xlKCZwVHhGcmFtZS0+bV9sZV9iRHN0Tm9kZUlkLAorCQkJCSAgICAgICAoQllURSkgRVBMX0NfQURSX0JST0FEQ0FTVCk7CisJCQkvLyByZXNldCBGbGFncworCQkJLy9BbWlTZXRCeXRlVG9MZSgmcFR4RnJhbWUtPm1fRGF0YS5tX1NvYS5tX2xlX2JGbGFnMSwgKEJZVEUpIDApOworCQkJLy9BbWlTZXRCeXRlVG9MZSgmcFR4RnJhbWUtPm1fRGF0YS5tX1NvYS5tX2xlX2JGbGFnMiwgKEJZVEUpIDApOworCQkJLy8gRVBMIHByb2ZpbGUgdmVyc2lvbgorCQkJQW1pU2V0Qnl0ZVRvTGUoJnBUeEZyYW1lLT5tX0RhdGEubV9Tb2EubV9sZV9iRXBsVmVyc2lvbiwKKwkJCQkgICAgICAgKEJZVEUpIEVQTF9TUEVDX1ZFUlNJT04pOworCQkJYnJlYWs7CisKKwkJY2FzZSBrRXBsTXNnVHlwZVByZXM6CisJCQkvLyBkZXN0aW5hdGlvbiBNQUMgYWRkcmVzcworCQkJQW1pU2V0UXdvcmQ0OFRvQmUoJnBUeEZyYW1lLT5tX2JlX2FiRHN0TWFjWzBdLAorCQkJCQkgIEVQTF9DX0RMTF9NVUxUSUNBU1RfUFJFUyk7CisJCQkvLyBkZXN0aW5hdGlvbiBub2RlIElECisJCQlBbWlTZXRCeXRlVG9MZSgmcFR4RnJhbWUtPm1fbGVfYkRzdE5vZGVJZCwKKwkJCQkgICAgICAgKEJZVEUpIEVQTF9DX0FEUl9CUk9BRENBU1QpOworCQkJLy8gcmVzZXQgRmxhZ3MKKwkJCS8vQW1pU2V0Qnl0ZVRvTGUoJnBUeEZyYW1lLT5tX0RhdGEubV9QcmVzLm1fbGVfYkZsYWcxLCAoQllURSkgMCk7CisJCQkvL0FtaVNldEJ5dGVUb0xlKCZwVHhGcmFtZS0+bV9EYXRhLm1fUHJlcy5tX2xlX2JGbGFnMiwgKEJZVEUpIDApOworCQkJLy8gUERPIHNpemUKKwkJCS8vQW1pU2V0V29yZFRvTGUoJnBUeEZyYW1lLT5tX0RhdGEubV9QcmVzLm1fbGVfd1NpemUsIDApOworCQkJYnJlYWs7CisKKwkJY2FzZSBrRXBsTXNnVHlwZVByZXE6CisJCQkvLyByZXNldCBGbGFncworCQkJLy9BbWlTZXRCeXRlVG9MZSgmcFR4RnJhbWUtPm1fRGF0YS5tX1ByZXEubV9sZV9iRmxhZzEsIChCWVRFKSAwKTsKKwkJCS8vQW1pU2V0Qnl0ZVRvTGUoJnBUeEZyYW1lLT5tX0RhdGEubV9QcmVxLm1fbGVfYkZsYWcyLCAoQllURSkgMCk7CisJCQkvLyBQRE8gc2l6ZQorCQkJLy9BbWlTZXRXb3JkVG9MZSgmcFR4RnJhbWUtPm1fRGF0YS5tX1ByZXEubV9sZV93U2l6ZSwgMCk7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwkJLy8gRVBMIG1lc3NhZ2UgdHlwZQorCQlBbWlTZXRCeXRlVG9MZSgmcFR4RnJhbWUtPm1fbGVfYk1lc3NhZ2VUeXBlLCAoQllURSkgTXNnVHlwZV9wKTsKKwl9CisKKwkqcHBGcmFtZV9wID0gcFR4RnJhbWU7CisJKnB1aUZyYW1lU2l6ZV9wID0gcFR4QnVmZmVyLT5tX3VpTWF4QnVmZmVyTGVuOworCSpwdWlIYW5kbGVfcCA9IHVpSGFuZGxlOworCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbERsbGtEZWxldGVUeEZyYW1lCisvLworLy8gRGVzY3JpcHRpb246IGRlbGV0ZXMgdGhlIGJ1ZmZlciBmb3IgYSBUeCBmcmFtZSBhbmQgZnJlZXMgaXQgaW4gdGhlCisvLyAgICAgICAgICAgICAgZXRoZXJuZXQgZHJpdmVyCisvLworLy8gUGFyYW1ldGVyczogIHVpSGFuZGxlX3AgICAgICAgICAgICAgID0gSU46IGhhbmRsZSB0byBmcmFtZSBidWZmZXIKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgRXBsRGxsa0RlbGV0ZVR4RnJhbWUodW5zaWduZWQgaW50IHVpSGFuZGxlX3ApCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwl0RWRydlR4QnVmZmVyICpwVHhCdWZmZXIgPSBOVUxMOworCisJaWYgKHVpSGFuZGxlX3AgPj0gRXBsRGxsa0luc3RhbmNlX2cubV91aU1heFR4RnJhbWVzKSB7CS8vIGhhbmRsZSBpcyBub3QgdmFsaWQKKwkJUmV0ID0ga0VwbERsbElsbGVnYWxIZGw7CisJCWdvdG8gRXhpdDsKKwl9CisKKwlwVHhCdWZmZXIgPSAmRXBsRGxsa0luc3RhbmNlX2cubV9wVHhCdWZmZXJbdWlIYW5kbGVfcF07CisKKwkvLyBtYXJrIGJ1ZmZlciBhcyBmcmVlIHNvIHRoYXQgZnJhbWUgd2lsbCBub3QgYmUgc2VuZCBpbiBmdXR1cmUgYW55bW9yZQorCS8vICQkJCBkLmsuIFdoYXQncyB1cCB3aXRoIHJ1bm5pbmcgdHJhbnNtaXNzaW9ucz8KKwlwVHhCdWZmZXItPm1fdWlUeE1zZ0xlbiA9IEVQTF9ETExLX0JVRkxFTl9FTVBUWTsKKwlwVHhCdWZmZXItPm1fcGJCdWZmZXIgPSBOVUxMOworCisJLy8gZGVsZXRlIFR4IGJ1ZmZlcgorCVJldCA9IEVkcnZSZWxlYXNlVHhNc2dCdWZmZXIocFR4QnVmZmVyKTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CS8vIGVycm9yIG9jY3VyZWQgd2hpbGUgcmVsZWFzaW5nIFR4IGZyYW1lCisJCWdvdG8gRXhpdDsKKwl9CisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsRGxsa1Byb2Nlc3MKKy8vCisvLyBEZXNjcmlwdGlvbjogcHJvY2VzcyB0aGUgcGFzc2VkIGV2ZW50CisvLworLy8gUGFyYW1ldGVyczogIHBFdmVudF9wICAgICAgICAgICAgICAgID0gZXZlbnQgdG8gYmUgcHJvY2Vzc2VkCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIEVwbERsbGtQcm9jZXNzKHRFcGxFdmVudCAqIHBFdmVudF9wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJdEVwbEZyYW1lICpwVHhGcmFtZTsKKwl0RWRydlR4QnVmZmVyICpwVHhCdWZmZXI7CisJdW5zaWduZWQgaW50IHVpSGFuZGxlOworCXVuc2lnbmVkIGludCB1aUZyYW1lU2l6ZTsKKwlCWVRFIGFiTXVsdGljYXN0TWFjWzZdOworCXRFcGxEbGxBc3luY1JlcVByaW9yaXR5IEFzeW5jUmVxUHJpb3JpdHk7CisJdW5zaWduZWQgaW50IHVpRnJhbWVDb3VudDsKKwl0RXBsTm10U3RhdGUgTm10U3RhdGU7CisjaWYgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9QRE9LKSkgIT0gMCkKKwl0RXBsRnJhbWVJbmZvIEZyYW1lSW5mbzsKKyNlbmRpZgorCisJc3dpdGNoIChwRXZlbnRfcC0+bV9FdmVudFR5cGUpIHsKKwljYXNlIGtFcGxFdmVudFR5cGVEbGxrQ3JlYXRlOgorCQl7CisJCQkvLyAkJCQgcmVzZXQgZXRoZXJuZXQgZHJpdmVyCisKKwkJCU5tdFN0YXRlID0gKigodEVwbE5tdFN0YXRlICopIHBFdmVudF9wLT5tX3BBcmcpOworCisJCQkvLyBpbml0aWFsaXplIGZsYWdzIGZvciBQUmVzIGFuZCBTdGF0dXNSZXMKKwkJCUVwbERsbGtJbnN0YW5jZV9nLm1fYkZsYWcxID0gRVBMX0ZSQU1FX0ZMQUcxX0VDOworCQkJRXBsRGxsa0luc3RhbmNlX2cubV9iTW5GbGFnMSA9IDA7CisJCQlFcGxEbGxrSW5zdGFuY2VfZy5tX2JGbGFnMiA9IDA7CisKKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVF9NTikpICE9IDApCisJCQkvLyBpbml0aWFsaXplIGxpbmtlZCBub2RlIGxpc3QKKwkJCUVwbERsbGtJbnN0YW5jZV9nLm1fcEZpcnN0Tm9kZUluZm8gPSBOVUxMOworI2VuZGlmCisKKwkJCS8vIHJlZ2lzdGVyIFR4RnJhbWVzIGluIEVkcnYKKworCQkJLy8gSWRlbnRSZXNwb25zZQorCQkJdWlGcmFtZVNpemUgPSBFUExfQ19ETExfTUlOU0laRV9JREVOVFJFUzsKKwkJCVJldCA9CisJCQkgICAgRXBsRGxsa0NyZWF0ZVR4RnJhbWUoJnVpSGFuZGxlLCAmcFR4RnJhbWUsCisJCQkJCQkgJnVpRnJhbWVTaXplLCBrRXBsTXNnVHlwZUFzbmQsCisJCQkJCQkga0VwbERsbEFzbmRJZGVudFJlc3BvbnNlKTsKKwkJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsJLy8gZXJyb3Igb2NjdXJlZCB3aGlsZSByZWdpc3RlcmluZyBUeCBmcmFtZQorCQkJCWdvdG8gRXhpdDsKKwkJCX0KKwkJCS8vIEVQTCBwcm9maWxlIHZlcnNpb24KKwkJCUFtaVNldEJ5dGVUb0xlKCZwVHhGcmFtZS0+bV9EYXRhLm1fQXNuZC5tX1BheWxvYWQuCisJCQkJICAgICAgIG1fSWRlbnRSZXNwb25zZS5tX2xlX2JFcGxQcm9maWxlVmVyc2lvbiwKKwkJCQkgICAgICAgKEJZVEUpIEVQTF9TUEVDX1ZFUlNJT04pOworCQkJLy8gRmVhdHVyZUZsYWdzCisJCQlBbWlTZXREd29yZFRvTGUoJnBUeEZyYW1lLT5tX0RhdGEubV9Bc25kLm1fUGF5bG9hZC4KKwkJCQkJbV9JZGVudFJlc3BvbnNlLm1fbGVfZHdGZWF0dXJlRmxhZ3MsCisJCQkJCUVwbERsbGtJbnN0YW5jZV9nLm1fRGxsQ29uZmlnUGFyYW0uCisJCQkJCW1fZHdGZWF0dXJlRmxhZ3MpOworCQkJLy8gTVRVCisJCQlBbWlTZXRXb3JkVG9MZSgmcFR4RnJhbWUtPm1fRGF0YS5tX0FzbmQubV9QYXlsb2FkLgorCQkJCSAgICAgICBtX0lkZW50UmVzcG9uc2UubV9sZV93TXR1LAorCQkJCSAgICAgICAoV09SRCkgRXBsRGxsa0luc3RhbmNlX2cuCisJCQkJICAgICAgIG1fRGxsQ29uZmlnUGFyYW0ubV91aUFzeW5jTXR1KTsKKwkJCS8vIFBvbGxJblNpemUKKwkJCUFtaVNldFdvcmRUb0xlKCZwVHhGcmFtZS0+bV9EYXRhLm1fQXNuZC5tX1BheWxvYWQuCisJCQkJICAgICAgIG1fSWRlbnRSZXNwb25zZS5tX2xlX3dQb2xsSW5TaXplLAorCQkJCSAgICAgICAoV09SRCkgRXBsRGxsa0luc3RhbmNlX2cuCisJCQkJICAgICAgIG1fRGxsQ29uZmlnUGFyYW0uCisJCQkJICAgICAgIG1fdWlQcmVxQWN0UGF5bG9hZExpbWl0KTsKKwkJCS8vIFBvbGxPdXRTaXplCisJCQlBbWlTZXRXb3JkVG9MZSgmcFR4RnJhbWUtPm1fRGF0YS5tX0FzbmQubV9QYXlsb2FkLgorCQkJCSAgICAgICBtX0lkZW50UmVzcG9uc2UubV9sZV93UG9sbE91dFNpemUsCisJCQkJICAgICAgIChXT1JEKSBFcGxEbGxrSW5zdGFuY2VfZy4KKwkJCQkgICAgICAgbV9EbGxDb25maWdQYXJhbS4KKwkJCQkgICAgICAgbV91aVByZXNBY3RQYXlsb2FkTGltaXQpOworCQkJLy8gUmVzcG9uc2VUaW1lIC8gUHJlc01heExhdGVuY3kKKwkJCUFtaVNldER3b3JkVG9MZSgmcFR4RnJhbWUtPm1fRGF0YS5tX0FzbmQubV9QYXlsb2FkLgorCQkJCQltX0lkZW50UmVzcG9uc2UubV9sZV9kd1Jlc3BvbnNlVGltZSwKKwkJCQkJRXBsRGxsa0luc3RhbmNlX2cubV9EbGxDb25maWdQYXJhbS4KKwkJCQkJbV9kd1ByZXNNYXhMYXRlbmN5KTsKKwkJCS8vIERldmljZVR5cGUKKwkJCUFtaVNldER3b3JkVG9MZSgmcFR4RnJhbWUtPm1fRGF0YS5tX0FzbmQubV9QYXlsb2FkLgorCQkJCQltX0lkZW50UmVzcG9uc2UubV9sZV9kd0RldmljZVR5cGUsCisJCQkJCUVwbERsbGtJbnN0YW5jZV9nLm1fRGxsSWRlbnRQYXJhbS4KKwkJCQkJbV9kd0RldmljZVR5cGUpOworCQkJLy8gVmVuZG9ySWQKKwkJCUFtaVNldER3b3JkVG9MZSgmcFR4RnJhbWUtPm1fRGF0YS5tX0FzbmQubV9QYXlsb2FkLgorCQkJCQltX0lkZW50UmVzcG9uc2UubV9sZV9kd1ZlbmRvcklkLAorCQkJCQlFcGxEbGxrSW5zdGFuY2VfZy5tX0RsbElkZW50UGFyYW0uCisJCQkJCW1fZHdWZW5kb3JJZCk7CisJCQkvLyBQcm9kdWN0Q29kZQorCQkJQW1pU2V0RHdvcmRUb0xlKCZwVHhGcmFtZS0+bV9EYXRhLm1fQXNuZC5tX1BheWxvYWQuCisJCQkJCW1fSWRlbnRSZXNwb25zZS5tX2xlX2R3UHJvZHVjdENvZGUsCisJCQkJCUVwbERsbGtJbnN0YW5jZV9nLm1fRGxsSWRlbnRQYXJhbS4KKwkJCQkJbV9kd1Byb2R1Y3RDb2RlKTsKKwkJCS8vIFJldmlzaW9uTnVtYmVyCisJCQlBbWlTZXREd29yZFRvTGUoJnBUeEZyYW1lLT5tX0RhdGEubV9Bc25kLm1fUGF5bG9hZC4KKwkJCQkJbV9JZGVudFJlc3BvbnNlLm1fbGVfZHdSZXZpc2lvbk51bWJlciwKKwkJCQkJRXBsRGxsa0luc3RhbmNlX2cubV9EbGxJZGVudFBhcmFtLgorCQkJCQltX2R3UmV2aXNpb25OdW1iZXIpOworCQkJLy8gU2VyaWFsTnVtYmVyCisJCQlBbWlTZXREd29yZFRvTGUoJnBUeEZyYW1lLT5tX0RhdGEubV9Bc25kLm1fUGF5bG9hZC4KKwkJCQkJbV9JZGVudFJlc3BvbnNlLm1fbGVfZHdTZXJpYWxOdW1iZXIsCisJCQkJCUVwbERsbGtJbnN0YW5jZV9nLm1fRGxsSWRlbnRQYXJhbS4KKwkJCQkJbV9kd1NlcmlhbE51bWJlcik7CisJCQkvLyBWZW5kb3JTcGVjaWZpY0V4dDEKKwkJCUFtaVNldFF3b3JkNjRUb0xlKCZwVHhGcmFtZS0+bV9EYXRhLm1fQXNuZC5tX1BheWxvYWQuCisJCQkJCSAgbV9JZGVudFJlc3BvbnNlLgorCQkJCQkgIG1fbGVfcXdWZW5kb3JTcGVjaWZpY0V4dDEsCisJCQkJCSAgRXBsRGxsa0luc3RhbmNlX2cubV9EbGxJZGVudFBhcmFtLgorCQkJCQkgIG1fcXdWZW5kb3JTcGVjaWZpY0V4dDEpOworCQkJLy8gVmVyaWZ5Q29uZmlndXJhdGlvbkRhdGUKKwkJCUFtaVNldER3b3JkVG9MZSgmcFR4RnJhbWUtPm1fRGF0YS5tX0FzbmQubV9QYXlsb2FkLgorCQkJCQltX0lkZW50UmVzcG9uc2UuCisJCQkJCW1fbGVfZHdWZXJpZnlDb25maWd1cmF0aW9uRGF0ZSwKKwkJCQkJRXBsRGxsa0luc3RhbmNlX2cubV9EbGxJZGVudFBhcmFtLgorCQkJCQltX2R3VmVyaWZ5Q29uZmlndXJhdGlvbkRhdGUpOworCQkJLy8gVmVyaWZ5Q29uZmlndXJhdGlvblRpbWUKKwkJCUFtaVNldER3b3JkVG9MZSgmcFR4RnJhbWUtPm1fRGF0YS5tX0FzbmQubV9QYXlsb2FkLgorCQkJCQltX0lkZW50UmVzcG9uc2UuCisJCQkJCW1fbGVfZHdWZXJpZnlDb25maWd1cmF0aW9uVGltZSwKKwkJCQkJRXBsRGxsa0luc3RhbmNlX2cubV9EbGxJZGVudFBhcmFtLgorCQkJCQltX2R3VmVyaWZ5Q29uZmlndXJhdGlvblRpbWUpOworCQkJLy8gQXBwbGljYXRpb25Td0RhdGUKKwkJCUFtaVNldER3b3JkVG9MZSgmcFR4RnJhbWUtPm1fRGF0YS5tX0FzbmQubV9QYXlsb2FkLgorCQkJCQltX0lkZW50UmVzcG9uc2UuCisJCQkJCW1fbGVfZHdBcHBsaWNhdGlvblN3RGF0ZSwKKwkJCQkJRXBsRGxsa0luc3RhbmNlX2cubV9EbGxJZGVudFBhcmFtLgorCQkJCQltX2R3QXBwbGljYXRpb25Td0RhdGUpOworCQkJLy8gQXBwbGljYXRpb25Td1RpbWUKKwkJCUFtaVNldER3b3JkVG9MZSgmcFR4RnJhbWUtPm1fRGF0YS5tX0FzbmQubV9QYXlsb2FkLgorCQkJCQltX0lkZW50UmVzcG9uc2UuCisJCQkJCW1fbGVfZHdBcHBsaWNhdGlvblN3VGltZSwKKwkJCQkJRXBsRGxsa0luc3RhbmNlX2cubV9EbGxJZGVudFBhcmFtLgorCQkJCQltX2R3QXBwbGljYXRpb25Td1RpbWUpOworCQkJLy8gSVBBZGRyZXNzCisJCQlBbWlTZXREd29yZFRvTGUoJnBUeEZyYW1lLT5tX0RhdGEubV9Bc25kLm1fUGF5bG9hZC4KKwkJCQkJbV9JZGVudFJlc3BvbnNlLm1fbGVfZHdJcEFkZHJlc3MsCisJCQkJCUVwbERsbGtJbnN0YW5jZV9nLm1fRGxsSWRlbnRQYXJhbS4KKwkJCQkJbV9kd0lwQWRkcmVzcyk7CisJCQkvLyBTdWJuZXRNYXNrCisJCQlBbWlTZXREd29yZFRvTGUoJnBUeEZyYW1lLT5tX0RhdGEubV9Bc25kLm1fUGF5bG9hZC4KKwkJCQkJbV9JZGVudFJlc3BvbnNlLm1fbGVfZHdTdWJuZXRNYXNrLAorCQkJCQlFcGxEbGxrSW5zdGFuY2VfZy5tX0RsbElkZW50UGFyYW0uCisJCQkJCW1fZHdTdWJuZXRNYXNrKTsKKwkJCS8vIERlZmF1bHRHYXRld2F5CisJCQlBbWlTZXREd29yZFRvTGUoJnBUeEZyYW1lLT5tX0RhdGEubV9Bc25kLm1fUGF5bG9hZC4KKwkJCQkJbV9JZGVudFJlc3BvbnNlLm1fbGVfZHdEZWZhdWx0R2F0ZXdheSwKKwkJCQkJRXBsRGxsa0luc3RhbmNlX2cubV9EbGxJZGVudFBhcmFtLgorCQkJCQltX2R3RGVmYXVsdEdhdGV3YXkpOworCQkJLy8gSG9zdE5hbWUKKwkJCUVQTF9NRU1DUFkoJnBUeEZyYW1lLT5tX0RhdGEubV9Bc25kLm1fUGF5bG9hZC4KKwkJCQkgICBtX0lkZW50UmVzcG9uc2UubV9sZV9zSG9zdG5hbWVbMF0sCisJCQkJICAgJkVwbERsbGtJbnN0YW5jZV9nLm1fRGxsSWRlbnRQYXJhbS4KKwkJCQkgICBtX3NIb3N0bmFtZVswXSwKKwkJCQkgICBzaXplb2YoRXBsRGxsa0luc3RhbmNlX2cubV9EbGxJZGVudFBhcmFtLgorCQkJCQkgIG1fc0hvc3RuYW1lKSk7CisJCQkvLyBWZW5kb3JTcGVjaWZpY0V4dDIKKwkJCUVQTF9NRU1DUFkoJnBUeEZyYW1lLT5tX0RhdGEubV9Bc25kLm1fUGF5bG9hZC4KKwkJCQkgICBtX0lkZW50UmVzcG9uc2UubV9sZV9hYlZlbmRvclNwZWNpZmljRXh0MlswXSwKKwkJCQkgICAmRXBsRGxsa0luc3RhbmNlX2cubV9EbGxJZGVudFBhcmFtLgorCQkJCSAgIG1fYWJWZW5kb3JTcGVjaWZpY0V4dDJbMF0sCisJCQkJICAgc2l6ZW9mKEVwbERsbGtJbnN0YW5jZV9nLm1fRGxsSWRlbnRQYXJhbS4KKwkJCQkJICBtX2FiVmVuZG9yU3BlY2lmaWNFeHQyKSk7CisKKwkJCS8vIFN0YXR1c1Jlc3BvbnNlCisJCQl1aUZyYW1lU2l6ZSA9IEVQTF9DX0RMTF9NSU5TSVpFX1NUQVRVU1JFUzsKKwkJCVJldCA9CisJCQkgICAgRXBsRGxsa0NyZWF0ZVR4RnJhbWUoJnVpSGFuZGxlLCAmcFR4RnJhbWUsCisJCQkJCQkgJnVpRnJhbWVTaXplLCBrRXBsTXNnVHlwZUFzbmQsCisJCQkJCQkga0VwbERsbEFzbmRTdGF0dXNSZXNwb25zZSk7CisJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CS8vIGVycm9yIG9jY3VyZWQgd2hpbGUgcmVnaXN0ZXJpbmcgVHggZnJhbWUKKwkJCQlnb3RvIEV4aXQ7CisJCQl9CisJCQkvLyBQUmVzICQkJCBtYXliZSBtb3ZlIHRoaXMgdG8gUERPIG1vZHVsZQorCQkJaWYgKChFcGxEbGxrSW5zdGFuY2VfZy5tX0RsbENvbmZpZ1BhcmFtLm1fZkFzeW5jT25seSA9PQorCQkJICAgICBGQUxTRSkKKwkJCSAgICAmJiAoRXBsRGxsa0luc3RhbmNlX2cubV9EbGxDb25maWdQYXJhbS5tX3VpUHJlc0FjdFBheWxvYWRMaW1pdCA+PSAzNikpIHsJLy8gaXQgaXMgbm90IGNvbmZpZ3VyZWQgYXMgYXN5bmMtb25seSBDTiwKKwkJCQkvLyBzbyB0YWtlIHBhcnQgaW4gaXNvY2hyb25vdXMgcGhhc2UgYW5kIHJlZ2lzdGVyIFBSZXMgZnJhbWUKKwkJCQl1aUZyYW1lU2l6ZSA9CisJCQkJICAgIEVwbERsbGtJbnN0YW5jZV9nLm1fRGxsQ29uZmlnUGFyYW0uCisJCQkJICAgIG1fdWlQcmVzQWN0UGF5bG9hZExpbWl0ICsgMjQ7CisJCQkJUmV0ID0KKwkJCQkgICAgRXBsRGxsa0NyZWF0ZVR4RnJhbWUoJnVpSGFuZGxlLCAmcFR4RnJhbWUsCisJCQkJCQkJICZ1aUZyYW1lU2l6ZSwKKwkJCQkJCQkga0VwbE1zZ1R5cGVQcmVzLAorCQkJCQkJCSBrRXBsRGxsQXNuZE5vdERlZmluZWQpOworCQkJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsJLy8gZXJyb3Igb2NjdXJlZCB3aGlsZSByZWdpc3RlcmluZyBUeCBmcmFtZQorCQkJCQlnb3RvIEV4aXQ7CisJCQkJfQorI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfUERPSykpICE9IDApCisJCQkJLy8gaW5pdGlhbGx5IGVuY29kZSBUUERPIC0+IGluZm9ybSBQRE8gbW9kdWxlCisJCQkJRnJhbWVJbmZvLm1fcEZyYW1lID0gcFR4RnJhbWU7CisJCQkJRnJhbWVJbmZvLm1fdWlGcmFtZVNpemUgPSB1aUZyYW1lU2l6ZTsKKwkJCQlSZXQgPSBFcGxQZG9rQ2JQZG9UcmFuc21pdHRlZCgmRnJhbWVJbmZvKTsKKyNlbmRpZgorCQkJCS8vIHJlc2V0IGN5Y2xlIGNvdW50ZXIKKwkJCQlFcGxEbGxrSW5zdGFuY2VfZy5tX3VpQ3ljbGVDb3VudCA9IDA7CisJCQl9IGVsc2UgewkvLyBpdCBpcyBhbiBhc3luYy1vbmx5IENOCisJCQkJLy8gZm9vbCBFcGxEbGxrQ2hhbmdlU3RhdGUoKSB0byB0aGluayB0aGF0IFBSZXMgd2FzIG5vdCBleHBlY3RlZAorCQkJCUVwbERsbGtJbnN0YW5jZV9nLm1fdWlDeWNsZUNvdW50ID0gMTsKKwkJCX0KKworCQkJLy8gTk1UIHJlcXVlc3QKKwkJCXVpRnJhbWVTaXplID0gRVBMX0NfSVBfTUFYX01UVTsKKwkJCVJldCA9CisJCQkgICAgRXBsRGxsa0NyZWF0ZVR4RnJhbWUoJnVpSGFuZGxlLCAmcFR4RnJhbWUsCisJCQkJCQkgJnVpRnJhbWVTaXplLCBrRXBsTXNnVHlwZUFzbmQsCisJCQkJCQkga0VwbERsbEFzbmRObXRSZXF1ZXN0KTsKKwkJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsJLy8gZXJyb3Igb2NjdXJlZCB3aGlsZSByZWdpc3RlcmluZyBUeCBmcmFtZQorCQkJCWdvdG8gRXhpdDsKKwkJCX0KKwkJCS8vIG1hcmsgVHggYnVmZmVyIGFzIGVtcHR5CisJCQlFcGxEbGxrSW5zdGFuY2VfZy5tX3BUeEJ1ZmZlclt1aUhhbmRsZV0ubV91aVR4TXNnTGVuID0KKwkJCSAgICBFUExfRExMS19CVUZMRU5fRU1QVFk7CisKKwkJCS8vIG5vbi1FUEwgZnJhbWUKKwkJCXVpRnJhbWVTaXplID0gRVBMX0NfSVBfTUFYX01UVTsKKwkJCVJldCA9CisJCQkgICAgRXBsRGxsa0NyZWF0ZVR4RnJhbWUoJnVpSGFuZGxlLCAmcFR4RnJhbWUsCisJCQkJCQkgJnVpRnJhbWVTaXplLAorCQkJCQkJIGtFcGxNc2dUeXBlTm9uRXBsLAorCQkJCQkJIGtFcGxEbGxBc25kTm90RGVmaW5lZCk7CisJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CS8vIGVycm9yIG9jY3VyZWQgd2hpbGUgcmVnaXN0ZXJpbmcgVHggZnJhbWUKKwkJCQlnb3RvIEV4aXQ7CisJCQl9CisJCQkvLyBtYXJrIFR4IGJ1ZmZlciBhcyBlbXB0eQorCQkJRXBsRGxsa0luc3RhbmNlX2cubV9wVHhCdWZmZXJbdWlIYW5kbGVdLm1fdWlUeE1zZ0xlbiA9CisJCQkgICAgRVBMX0RMTEtfQlVGTEVOX0VNUFRZOworCisJCQkvLyByZWdpc3RlciBtdWx0aWNhc3QgTUFDcyBpbiBldGhlcm5ldCBkcml2ZXIKKwkJCUFtaVNldFF3b3JkNDhUb0JlKCZhYk11bHRpY2FzdE1hY1swXSwKKwkJCQkJICBFUExfQ19ETExfTVVMVElDQVNUX1NPQyk7CisJCQlSZXQgPSBFZHJ2RGVmaW5lUnhNYWNBZGRyRW50cnkoYWJNdWx0aWNhc3RNYWMpOworCQkJQW1pU2V0UXdvcmQ0OFRvQmUoJmFiTXVsdGljYXN0TWFjWzBdLAorCQkJCQkgIEVQTF9DX0RMTF9NVUxUSUNBU1RfU09BKTsKKwkJCVJldCA9IEVkcnZEZWZpbmVSeE1hY0FkZHJFbnRyeShhYk11bHRpY2FzdE1hYyk7CisJCQlBbWlTZXRRd29yZDQ4VG9CZSgmYWJNdWx0aWNhc3RNYWNbMF0sCisJCQkJCSAgRVBMX0NfRExMX01VTFRJQ0FTVF9QUkVTKTsKKwkJCVJldCA9IEVkcnZEZWZpbmVSeE1hY0FkZHJFbnRyeShhYk11bHRpY2FzdE1hYyk7CisJCQlBbWlTZXRRd29yZDQ4VG9CZSgmYWJNdWx0aWNhc3RNYWNbMF0sCisJCQkJCSAgRVBMX0NfRExMX01VTFRJQ0FTVF9BU05EKTsKKwkJCVJldCA9IEVkcnZEZWZpbmVSeE1hY0FkZHJFbnRyeShhYk11bHRpY2FzdE1hYyk7CisKKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVF9NTikpICE9IDApCisJCQlpZiAoTm10U3RhdGUgPj0ga0VwbE5tdE1zTm90QWN0aXZlKSB7CS8vIGxvY2FsIG5vZGUgaXMgTU4KKwkJCQl1bnNpZ25lZCBpbnQgdWlJbmRleDsKKworCQkJCS8vIFNvQworCQkJCXVpRnJhbWVTaXplID0gRVBMX0NfRExMX01JTlNJWkVfU09DOworCQkJCVJldCA9CisJCQkJICAgIEVwbERsbGtDcmVhdGVUeEZyYW1lKCZ1aUhhbmRsZSwgJnBUeEZyYW1lLAorCQkJCQkJCSAmdWlGcmFtZVNpemUsCisJCQkJCQkJIGtFcGxNc2dUeXBlU29jLAorCQkJCQkJCSBrRXBsRGxsQXNuZE5vdERlZmluZWQpOworCQkJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsJLy8gZXJyb3Igb2NjdXJlZCB3aGlsZSByZWdpc3RlcmluZyBUeCBmcmFtZQorCQkJCQlnb3RvIEV4aXQ7CisJCQkJfQorCQkJCS8vIFNvQQorCQkJCXVpRnJhbWVTaXplID0gRVBMX0NfRExMX01JTlNJWkVfU09BOworCQkJCVJldCA9CisJCQkJICAgIEVwbERsbGtDcmVhdGVUeEZyYW1lKCZ1aUhhbmRsZSwgJnBUeEZyYW1lLAorCQkJCQkJCSAmdWlGcmFtZVNpemUsCisJCQkJCQkJIGtFcGxNc2dUeXBlU29hLAorCQkJCQkJCSBrRXBsRGxsQXNuZE5vdERlZmluZWQpOworCQkJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsJLy8gZXJyb3Igb2NjdXJlZCB3aGlsZSByZWdpc3RlcmluZyBUeCBmcmFtZQorCQkJCQlnb3RvIEV4aXQ7CisJCQkJfQorCisJCQkJZm9yICh1aUluZGV4ID0gMDsKKwkJCQkgICAgIHVpSW5kZXggPAorCQkJCSAgICAgdGFiZW50cmllcyhFcGxEbGxrSW5zdGFuY2VfZy5tX2FOb2RlSW5mbyk7CisJCQkJICAgICB1aUluZGV4KyspIHsKKy8vICAgICAgICAgICAgICAgICAgICBFcGxEbGxrSW5zdGFuY2VfZy5tX2FOb2RlSW5mb1t1aUluZGV4XS5tX3VpTm9kZUlkID0gdWlJbmRleCArIDE7CisJCQkJCUVwbERsbGtJbnN0YW5jZV9nLm1fYU5vZGVJbmZvW3VpSW5kZXhdLgorCQkJCQkgICAgbV93UHJlc1BheWxvYWRMaW1pdCA9CisJCQkJCSAgICAoV09SRCkgRXBsRGxsa0luc3RhbmNlX2cuCisJCQkJCSAgICBtX0RsbENvbmZpZ1BhcmFtLgorCQkJCQkgICAgbV91aUlzb2NoclJ4TWF4UGF5bG9hZDsKKwkJCQl9CisKKwkJCQkvLyBjYWxjdWxhdGUgY3ljbGUgbGVuZ3RoCisJCQkJRXBsRGxsa0luc3RhbmNlX2cubV91bGxGcmFtZVRpbWVvdXQgPSAxMDAwTEwKKwkJCQkgICAgKgorCQkJCSAgICAoKHVuc2lnbmVkIGxvbmcgbG9uZylFcGxEbGxrSW5zdGFuY2VfZy4KKwkJCQkgICAgIG1fRGxsQ29uZmlnUGFyYW0ubV9kd0N5Y2xlTGVuKTsKKwkJCX0KKyNlbmRpZiAvLygoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UX01OKSkgIT0gMCkKKworCQkJUmV0ID0gRXBsRGxsa0NhbEFzeW5jQ2xlYXJCdWZmZXIoKTsKKworCQkJYnJlYWs7CisJCX0KKworCWNhc2Uga0VwbEV2ZW50VHlwZURsbGtEZXN0cm95OgorCQl7CisJCQkvLyBkZXN0cm95IGFsbCBkYXRhIHN0cnVjdHVyZXMKKworCQkJTm10U3RhdGUgPSAqKCh0RXBsTm10U3RhdGUgKikgcEV2ZW50X3AtPm1fcEFyZyk7CisKKwkJCS8vIGRlbGV0ZSBUeCBmcmFtZXMKKwkJCVJldCA9IEVwbERsbGtEZWxldGVUeEZyYW1lKEVQTF9ETExLX1RYRlJBTUVfSURFTlRSRVMpOworCQkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgewkvLyBlcnJvciBvY2N1cmVkIHdoaWxlIGRlcmVnaXN0ZXJpbmcgVHggZnJhbWUKKwkJCQlnb3RvIEV4aXQ7CisJCQl9CisKKwkJCVJldCA9IEVwbERsbGtEZWxldGVUeEZyYW1lKEVQTF9ETExLX1RYRlJBTUVfU1RBVFVTUkVTKTsKKwkJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsJLy8gZXJyb3Igb2NjdXJlZCB3aGlsZSBkZXJlZ2lzdGVyaW5nIFR4IGZyYW1lCisJCQkJZ290byBFeGl0OworCQkJfQorCisJCQlSZXQgPSBFcGxEbGxrRGVsZXRlVHhGcmFtZShFUExfRExMS19UWEZSQU1FX1BSRVMpOworCQkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgewkvLyBlcnJvciBvY2N1cmVkIHdoaWxlIGRlcmVnaXN0ZXJpbmcgVHggZnJhbWUKKwkJCQlnb3RvIEV4aXQ7CisJCQl9CisKKwkJCVJldCA9IEVwbERsbGtEZWxldGVUeEZyYW1lKEVQTF9ETExLX1RYRlJBTUVfTk1UUkVRKTsKKwkJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsJLy8gZXJyb3Igb2NjdXJlZCB3aGlsZSBkZXJlZ2lzdGVyaW5nIFR4IGZyYW1lCisJCQkJZ290byBFeGl0OworCQkJfQorCisJCQlSZXQgPSBFcGxEbGxrRGVsZXRlVHhGcmFtZShFUExfRExMS19UWEZSQU1FX05PTkVQTCk7CisJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CS8vIGVycm9yIG9jY3VyZWQgd2hpbGUgZGVyZWdpc3RlcmluZyBUeCBmcmFtZQorCQkJCWdvdG8gRXhpdDsKKwkJCX0KKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVF9NTikpICE9IDApCisJCQlpZiAoTm10U3RhdGUgPj0ga0VwbE5tdE1zTm90QWN0aXZlKSB7CS8vIGxvY2FsIG5vZGUgd2FzIE1OCisJCQkJdW5zaWduZWQgaW50IHVpSW5kZXg7CisKKwkJCQlSZXQgPQorCQkJCSAgICBFcGxEbGxrRGVsZXRlVHhGcmFtZShFUExfRExMS19UWEZSQU1FX1NPQyk7CisJCQkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgewkvLyBlcnJvciBvY2N1cmVkIHdoaWxlIGRlcmVnaXN0ZXJpbmcgVHggZnJhbWUKKwkJCQkJZ290byBFeGl0OworCQkJCX0KKworCQkJCVJldCA9CisJCQkJICAgIEVwbERsbGtEZWxldGVUeEZyYW1lKEVQTF9ETExLX1RYRlJBTUVfU09BKTsKKwkJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CS8vIGVycm9yIG9jY3VyZWQgd2hpbGUgZGVyZWdpc3RlcmluZyBUeCBmcmFtZQorCQkJCQlnb3RvIEV4aXQ7CisJCQkJfQorCisJCQkJZm9yICh1aUluZGV4ID0gMDsKKwkJCQkgICAgIHVpSW5kZXggPAorCQkJCSAgICAgdGFiZW50cmllcyhFcGxEbGxrSW5zdGFuY2VfZy5tX2FOb2RlSW5mbyk7CisJCQkJICAgICB1aUluZGV4KyspIHsKKwkJCQkJaWYgKEVwbERsbGtJbnN0YW5jZV9nLgorCQkJCQkgICAgbV9hTm9kZUluZm9bdWlJbmRleF0uCisJCQkJCSAgICBtX3BQcmVxVHhCdWZmZXIgIT0gTlVMTCkgeworCQkJCQkJdWlIYW5kbGUgPQorCQkJCQkJICAgIEVwbERsbGtJbnN0YW5jZV9nLgorCQkJCQkJICAgIG1fYU5vZGVJbmZvW3VpSW5kZXhdLgorCQkJCQkJICAgIG1fcFByZXFUeEJ1ZmZlciAtCisJCQkJCQkgICAgRXBsRGxsa0luc3RhbmNlX2cuCisJCQkJCQkgICAgbV9wVHhCdWZmZXI7CisJCQkJCQlFcGxEbGxrSW5zdGFuY2VfZy4KKwkJCQkJCSAgICBtX2FOb2RlSW5mb1t1aUluZGV4XS4KKwkJCQkJCSAgICBtX3BQcmVxVHhCdWZmZXIgPSBOVUxMOworCQkJCQkJUmV0ID0KKwkJCQkJCSAgICBFcGxEbGxrRGVsZXRlVHhGcmFtZQorCQkJCQkJICAgICh1aUhhbmRsZSk7CisJCQkJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CS8vIGVycm9yIG9jY3VyZWQgd2hpbGUgZGVyZWdpc3RlcmluZyBUeCBmcmFtZQorCQkJCQkJCWdvdG8gRXhpdDsKKwkJCQkJCX0KKworCQkJCQl9CisJCQkJCUVwbERsbGtJbnN0YW5jZV9nLm1fYU5vZGVJbmZvW3VpSW5kZXhdLgorCQkJCQkgICAgbV93UHJlc1BheWxvYWRMaW1pdCA9IDB4RkZGRjsKKwkJCQl9CisJCQl9CisjZW5kaWYgLy8oKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVF9NTikpICE9IDApCisKKwkJCS8vIGRlcmVnaXN0ZXIgbXVsdGljYXN0IE1BQ3MgaW4gZXRoZXJuZXQgZHJpdmVyCisJCQlBbWlTZXRRd29yZDQ4VG9CZSgmYWJNdWx0aWNhc3RNYWNbMF0sCisJCQkJCSAgRVBMX0NfRExMX01VTFRJQ0FTVF9TT0MpOworCQkJUmV0ID0gRWRydlVuZGVmaW5lUnhNYWNBZGRyRW50cnkoYWJNdWx0aWNhc3RNYWMpOworCQkJQW1pU2V0UXdvcmQ0OFRvQmUoJmFiTXVsdGljYXN0TWFjWzBdLAorCQkJCQkgIEVQTF9DX0RMTF9NVUxUSUNBU1RfU09BKTsKKwkJCVJldCA9IEVkcnZVbmRlZmluZVJ4TWFjQWRkckVudHJ5KGFiTXVsdGljYXN0TWFjKTsKKwkJCUFtaVNldFF3b3JkNDhUb0JlKCZhYk11bHRpY2FzdE1hY1swXSwKKwkJCQkJICBFUExfQ19ETExfTVVMVElDQVNUX1BSRVMpOworCQkJUmV0ID0gRWRydlVuZGVmaW5lUnhNYWNBZGRyRW50cnkoYWJNdWx0aWNhc3RNYWMpOworCQkJQW1pU2V0UXdvcmQ0OFRvQmUoJmFiTXVsdGljYXN0TWFjWzBdLAorCQkJCQkgIEVQTF9DX0RMTF9NVUxUSUNBU1RfQVNORCk7CisJCQlSZXQgPSBFZHJ2VW5kZWZpbmVSeE1hY0FkZHJFbnRyeShhYk11bHRpY2FzdE1hYyk7CisKKwkJCS8vIGRlbGV0ZSB0aW1lcgorI2lmIEVQTF9USU1FUl9VU0VfSElHSFJFUyAhPSBGQUxTRQorCQkJUmV0ID0KKwkJCSAgICBFcGxUaW1lckhpZ2hSZXNrRGVsZXRlVGltZXIoJkVwbERsbGtJbnN0YW5jZV9nLgorCQkJCQkJCW1fVGltZXJIZGxDeWNsZSk7CisjZW5kaWYKKworCQkJYnJlYWs7CisJCX0KKworCWNhc2Uga0VwbEV2ZW50VHlwZURsbGtGaWxsVHg6CisJCXsKKwkJCS8vIGZpbGwgVHhCdWZmZXIgb2Ygc3BlY2lmaWVkIHByaW9yaXR5IHdpdGggbmV3IGZyYW1lIGlmIGVtcHR5CisKKwkJCXBUeEZyYW1lID0gTlVMTDsKKwkJCUFzeW5jUmVxUHJpb3JpdHkgPQorCQkJICAgICooKHRFcGxEbGxBc3luY1JlcVByaW9yaXR5ICopIHBFdmVudF9wLT5tX3BBcmcpOworCQkJc3dpdGNoIChBc3luY1JlcVByaW9yaXR5KSB7CisJCQljYXNlIGtFcGxEbGxBc3luY1JlcVByaW9ObXQ6CS8vIE5NVCByZXF1ZXN0IHByaW9yaXR5CisJCQkJeworCQkJCQlwVHhCdWZmZXIgPQorCQkJCQkgICAgJkVwbERsbGtJbnN0YW5jZV9nLgorCQkJCQkgICAgbV9wVHhCdWZmZXIKKwkJCQkJICAgIFtFUExfRExMS19UWEZSQU1FX05NVFJFUV07CisJCQkJCWlmIChwVHhCdWZmZXItPm1fcGJCdWZmZXIgIT0gTlVMTCkgewkvLyBObXRSZXF1ZXN0IGRvZXMgZXhpc3QKKwkJCQkJCS8vIGNoZWNrIGlmIGZyYW1lIGlzIGVtcHR5IGFuZCBub3QgYmVpbmcgZmlsbGVkCisJCQkJCQlpZiAocFR4QnVmZmVyLT5tX3VpVHhNc2dMZW4gPT0KKwkJCQkJCSAgICBFUExfRExMS19CVUZMRU5fRU1QVFkpIHsKKwkJCQkJCQkvLyBtYXJrIFR4IGJ1ZmZlciBhcyBmaWxsaW5nIGlzIGluIHByb2Nlc3MKKwkJCQkJCQlwVHhCdWZmZXItPgorCQkJCQkJCSAgICBtX3VpVHhNc2dMZW4gPQorCQkJCQkJCSAgICBFUExfRExMS19CVUZMRU5fRklMTElORzsKKwkJCQkJCQkvLyBzZXQgbWF4IGJ1ZmZlciBzaXplIGFzIGlucHV0IHBhcmFtZXRlcgorCQkJCQkJCXVpRnJhbWVTaXplID0KKwkJCQkJCQkgICAgcFR4QnVmZmVyLT4KKwkJCQkJCQkgICAgbV91aU1heEJ1ZmZlckxlbjsKKwkJCQkJCQkvLyBjb3B5IGZyYW1lIGZyb20gc2hhcmVkIGxvb3AgYnVmZmVyIHRvIFR4IGJ1ZmZlcgorCQkJCQkJCVJldCA9CisJCQkJCQkJICAgIEVwbERsbGtDYWxBc3luY0dldFR4RnJhbWUKKwkJCQkJCQkgICAgKHBUeEJ1ZmZlci0+CisJCQkJCQkJICAgICBtX3BiQnVmZmVyLAorCQkJCQkJCSAgICAgJnVpRnJhbWVTaXplLAorCQkJCQkJCSAgICAgQXN5bmNSZXFQcmlvcml0eSk7CisJCQkJCQkJaWYgKFJldCA9PQorCQkJCQkJCSAgICBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJCQkJCQlwVHhGcmFtZSA9CisJCQkJCQkJCSAgICAodEVwbEZyYW1lCisJCQkJCQkJCSAgICAgKikKKwkJCQkJCQkJICAgIHBUeEJ1ZmZlci0+CisJCQkJCQkJCSAgICBtX3BiQnVmZmVyOworCQkJCQkJCQlSZXQgPQorCQkJCQkJCQkgICAgRXBsRGxsa0NoZWNrRnJhbWUKKwkJCQkJCQkJICAgIChwVHhGcmFtZSwKKwkJCQkJCQkJICAgICB1aUZyYW1lU2l6ZSk7CisKKwkJCQkJCQkJLy8gc2V0IGJ1ZmZlciB2YWxpZAorCQkJCQkJCQlwVHhCdWZmZXItPgorCQkJCQkJCQkgICAgbV91aVR4TXNnTGVuCisJCQkJCQkJCSAgICA9CisJCQkJCQkJCSAgICB1aUZyYW1lU2l6ZTsKKwkJCQkJCQl9IGVsc2UgaWYgKFJldCA9PSBrRXBsRGxsQXN5bmNUeEJ1ZmZlckVtcHR5KSB7CS8vIGVtcHR5IFR4IGJ1ZmZlciBpcyBub3QgYSByZWFsIHByb2JsZW0KKwkJCQkJCQkJLy8gc28ganVzdCBpZ25vcmUgaXQKKwkJCQkJCQkJUmV0ID0KKwkJCQkJCQkJICAgIGtFcGxTdWNjZXNzZnVsOworCQkJCQkJCQkvLyBtYXJrIFR4IGJ1ZmZlciBhcyBlbXB0eQorCQkJCQkJCQlwVHhCdWZmZXItPgorCQkJCQkJCQkgICAgbV91aVR4TXNnTGVuCisJCQkJCQkJCSAgICA9CisJCQkJCQkJCSAgICBFUExfRExMS19CVUZMRU5fRU1QVFk7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJZGVmYXVsdDoJLy8gZ2VuZXJpYyBwcmlvcml0eQorCQkJCXsKKwkJCQkJcFR4QnVmZmVyID0KKwkJCQkJICAgICZFcGxEbGxrSW5zdGFuY2VfZy4KKwkJCQkJICAgIG1fcFR4QnVmZmVyCisJCQkJCSAgICBbRVBMX0RMTEtfVFhGUkFNRV9OT05FUExdOworCQkJCQlpZiAocFR4QnVmZmVyLT5tX3BiQnVmZmVyICE9IE5VTEwpIHsJLy8gbm9uLUVQTCBmcmFtZSBkb2VzIGV4aXN0CisJCQkJCQkvLyBjaGVjayBpZiBmcmFtZSBpcyBlbXB0eSBhbmQgbm90IGJlaW5nIGZpbGxlZAorCQkJCQkJaWYgKHBUeEJ1ZmZlci0+bV91aVR4TXNnTGVuID09CisJCQkJCQkgICAgRVBMX0RMTEtfQlVGTEVOX0VNUFRZKSB7CisJCQkJCQkJLy8gbWFyayBUeCBidWZmZXIgYXMgZmlsbGluZyBpcyBpbiBwcm9jZXNzCisJCQkJCQkJcFR4QnVmZmVyLT4KKwkJCQkJCQkgICAgbV91aVR4TXNnTGVuID0KKwkJCQkJCQkgICAgRVBMX0RMTEtfQlVGTEVOX0ZJTExJTkc7CisJCQkJCQkJLy8gc2V0IG1heCBidWZmZXIgc2l6ZSBhcyBpbnB1dCBwYXJhbWV0ZXIKKwkJCQkJCQl1aUZyYW1lU2l6ZSA9CisJCQkJCQkJICAgIHBUeEJ1ZmZlci0+CisJCQkJCQkJICAgIG1fdWlNYXhCdWZmZXJMZW47CisJCQkJCQkJLy8gY29weSBmcmFtZSBmcm9tIHNoYXJlZCBsb29wIGJ1ZmZlciB0byBUeCBidWZmZXIKKwkJCQkJCQlSZXQgPQorCQkJCQkJCSAgICBFcGxEbGxrQ2FsQXN5bmNHZXRUeEZyYW1lCisJCQkJCQkJICAgIChwVHhCdWZmZXItPgorCQkJCQkJCSAgICAgbV9wYkJ1ZmZlciwKKwkJCQkJCQkgICAgICZ1aUZyYW1lU2l6ZSwKKwkJCQkJCQkgICAgIEFzeW5jUmVxUHJpb3JpdHkpOworCQkJCQkJCWlmIChSZXQgPT0KKwkJCQkJCQkgICAga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCQkJCQkJcFR4RnJhbWUgPQorCQkJCQkJCQkgICAgKHRFcGxGcmFtZQorCQkJCQkJCQkgICAgICopCisJCQkJCQkJCSAgICBwVHhCdWZmZXItPgorCQkJCQkJCQkgICAgbV9wYkJ1ZmZlcjsKKwkJCQkJCQkJUmV0ID0KKwkJCQkJCQkJICAgIEVwbERsbGtDaGVja0ZyYW1lCisJCQkJCQkJCSAgICAocFR4RnJhbWUsCisJCQkJCQkJCSAgICAgdWlGcmFtZVNpemUpOworCisJCQkJCQkJCS8vIHNldCBidWZmZXIgdmFsaWQKKwkJCQkJCQkJcFR4QnVmZmVyLT4KKwkJCQkJCQkJICAgIG1fdWlUeE1zZ0xlbgorCQkJCQkJCQkgICAgPQorCQkJCQkJCQkgICAgdWlGcmFtZVNpemU7CisJCQkJCQkJfSBlbHNlIGlmIChSZXQgPT0ga0VwbERsbEFzeW5jVHhCdWZmZXJFbXB0eSkgewkvLyBlbXB0eSBUeCBidWZmZXIgaXMgbm90IGEgcmVhbCBwcm9ibGVtCisJCQkJCQkJCS8vIHNvIGp1c3QgaWdub3JlIGl0CisJCQkJCQkJCVJldCA9CisJCQkJCQkJCSAgICBrRXBsU3VjY2Vzc2Z1bDsKKwkJCQkJCQkJLy8gbWFyayBUeCBidWZmZXIgYXMgZW1wdHkKKwkJCQkJCQkJcFR4QnVmZmVyLT4KKwkJCQkJCQkJICAgIG1fdWlUeE1zZ0xlbgorCQkJCQkJCQkgICAgPQorCQkJCQkJCQkgICAgRVBMX0RMTEtfQlVGTEVOX0VNUFRZOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisKKwkJCU5tdFN0YXRlID0gRXBsTm10a0dldE5tdFN0YXRlKCk7CisKKwkJCWlmICgoTm10U3RhdGUgPT0ga0VwbE5tdENzQmFzaWNFdGhlcm5ldCkgfHwgKE5tdFN0YXRlID09IGtFcGxObXRNc0Jhc2ljRXRoZXJuZXQpKSB7CS8vIHNlbmQgZnJhbWUgaW1tZWRpYXRlbHkKKwkJCQlpZiAocFR4RnJhbWUgIT0gTlVMTCkgewkvLyBmcmFtZSBpcyBwcmVzZW50CisJCQkJCS8vIHBhZGRpbmcgaXMgZG9uZSBieSBFZHJ2IG9yIGV0aGVybmV0IGNvbnRyb2xsZXIKKwkJCQkJUmV0ID0gRWRydlNlbmRUeE1zZyhwVHhCdWZmZXIpOworCQkJCX0gZWxzZSB7CS8vIG5vIGZyYW1lIG1vdmVkIHRvIFR4QnVmZmVyCisJCQkJCS8vIGNoZWNrIGlmIFR4QnVmZmVycyBjb250YWluIHVuc2VudCBmcmFtZXMKKwkJCQkJaWYgKEVwbERsbGtJbnN0YW5jZV9nLm1fcFR4QnVmZmVyW0VQTF9ETExLX1RYRlJBTUVfTk1UUkVRXS5tX3VpVHhNc2dMZW4gPiBFUExfRExMS19CVUZMRU5fRU1QVFkpIHsJLy8gTk1UIHJlcXVlc3QgVHggYnVmZmVyIGNvbnRhaW5zIGEgZnJhbWUKKwkJCQkJCVJldCA9CisJCQkJCQkgICAgRWRydlNlbmRUeE1zZworCQkJCQkJICAgICgmRXBsRGxsa0luc3RhbmNlX2cuCisJCQkJCQkgICAgIG1fcFR4QnVmZmVyCisJCQkJCQkgICAgIFtFUExfRExMS19UWEZSQU1FX05NVFJFUV0pOworCQkJCQl9IGVsc2UgaWYgKEVwbERsbGtJbnN0YW5jZV9nLm1fcFR4QnVmZmVyW0VQTF9ETExLX1RYRlJBTUVfTk9ORVBMXS5tX3VpVHhNc2dMZW4gPiBFUExfRExMS19CVUZMRU5fRU1QVFkpIHsJLy8gbm9uLUVQTCBUeCBidWZmZXIgY29udGFpbnMgYSBmcmFtZQorCQkJCQkJUmV0ID0KKwkJCQkJCSAgICBFZHJ2U2VuZFR4TXNnCisJCQkJCQkgICAgKCZFcGxEbGxrSW5zdGFuY2VfZy4KKwkJCQkJCSAgICAgbV9wVHhCdWZmZXIKKwkJCQkJCSAgICAgW0VQTF9ETExLX1RYRlJBTUVfTk9ORVBMXSk7CisJCQkJCX0KKwkJCQkJaWYgKFJldCA9PSBrRXBsSW52YWxpZE9wZXJhdGlvbikgewkvLyBpZ25vcmUgZXJyb3IgaWYgY2F1c2VkIGJ5IGFscmVhZHkgYWN0aXZlIHRyYW5zbWlzc2lvbgorCQkJCQkJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJCQkJCX0KKwkJCQl9CisJCQkJLy8gcmVzZXQgUFJlcyBmbGFnIDIKKwkJCQlFcGxEbGxrSW5zdGFuY2VfZy5tX2JGbGFnMiA9IDA7CisJCQl9IGVsc2UgeworCQkJCS8vIHVwZGF0ZSBGbGFnIDIgKFBSLCBSUykKKwkJCQlSZXQgPQorCQkJCSAgICBFcGxEbGxrQ2FsQXN5bmNHZXRUeENvdW50KCZBc3luY1JlcVByaW9yaXR5LAorCQkJCQkJCSAgICAgICZ1aUZyYW1lQ291bnQpOworCQkJCWlmIChBc3luY1JlcVByaW9yaXR5ID09IGtFcGxEbGxBc3luY1JlcVByaW9ObXQpIHsJLy8gbm9uLWVtcHR5IEZJRk8gd2l0aCBoaWdodGVzdCBwcmlvcml0eSBpcyBmb3IgTk1UIHJlcXVlc3RzCisJCQkJCWlmIChFcGxEbGxrSW5zdGFuY2VfZy5tX3BUeEJ1ZmZlcltFUExfRExMS19UWEZSQU1FX05NVFJFUV0ubV91aVR4TXNnTGVuID4gRVBMX0RMTEtfQlVGTEVOX0VNUFRZKSB7CS8vIE5NVCByZXF1ZXN0IFR4IGJ1ZmZlciBjb250YWlucyBhIGZyYW1lCisJCQkJCQkvLyBhZGQgb25lIG1vcmUgZnJhbWUKKwkJCQkJCXVpRnJhbWVDb3VudCsrOworCQkJCQl9CisJCQkJfSBlbHNlIHsJLy8gbm9uLWVtcHR5IEZJRk8gd2l0aCBoaWdoZXN0IHByaW9yaXR5IGlzIGZvciBnZW5lcmljIGZyYW1lcworCQkJCQlpZiAoRXBsRGxsa0luc3RhbmNlX2cubV9wVHhCdWZmZXJbRVBMX0RMTEtfVFhGUkFNRV9OTVRSRVFdLm1fdWlUeE1zZ0xlbiA+IEVQTF9ETExLX0JVRkxFTl9FTVBUWSkgewkvLyBOTVQgcmVxdWVzdCBUeCBidWZmZXIgY29udGFpbnMgYSBmcmFtZQorCQkJCQkJLy8gdXNlIE5NVCByZXF1ZXN0IEZJRk8sIGJlY2F1c2Ugb2YgaGlnaGVyIHByaW9yaXR5CisJCQkJCQl1aUZyYW1lQ291bnQgPSAxOworCQkJCQkJQXN5bmNSZXFQcmlvcml0eSA9CisJCQkJCQkgICAga0VwbERsbEFzeW5jUmVxUHJpb05tdDsKKwkJCQkJfSBlbHNlIGlmIChFcGxEbGxrSW5zdGFuY2VfZy5tX3BUeEJ1ZmZlcltFUExfRExMS19UWEZSQU1FX05PTkVQTF0ubV91aVR4TXNnTGVuID4gRVBMX0RMTEtfQlVGTEVOX0VNUFRZKSB7CS8vIG5vbi1FUEwgVHggYnVmZmVyIGNvbnRhaW5zIGEgZnJhbWUKKwkJCQkJCS8vIHVzZSBOTVQgcmVxdWVzdCBGSUZPLCBiZWNhdXNlIG9mIGhpZ2hlciBwcmlvcml0eQorCQkJCQkJLy8gYWRkIG9uZSBtb3JlIGZyYW1lCisJCQkJCQl1aUZyYW1lQ291bnQrKzsKKwkJCQkJfQorCQkJCX0KKworCQkJCWlmICh1aUZyYW1lQ291bnQgPiA3KSB7CS8vIGxpbWl0IGZyYW1lIHJlcXVlc3QgdG8gc2VuZCBjb3VudGVyIHRvIDcKKwkJCQkJdWlGcmFtZUNvdW50ID0gNzsKKwkJCQl9CisJCQkJaWYgKHVpRnJhbWVDb3VudCA+IDApIHsKKwkJCQkJRXBsRGxsa0luc3RhbmNlX2cubV9iRmxhZzIgPQorCQkJCQkgICAgKEJZVEUpICgoKEFzeW5jUmVxUHJpb3JpdHkgPDwKKwkJCQkJCSAgICAgIEVQTF9GUkFNRV9GTEFHMl9QUl9TSElGVCkKKwkJCQkJCSAgICAgJiBFUExfRlJBTUVfRkxBRzJfUFIpCisJCQkJCQkgICAgfCAodWlGcmFtZUNvdW50ICYKKwkJCQkJCSAgICAgICBFUExfRlJBTUVfRkxBRzJfUlMpKTsKKwkJCQl9IGVsc2UgeworCQkJCQlFcGxEbGxrSW5zdGFuY2VfZy5tX2JGbGFnMiA9IDA7CisJCQkJfQorCQkJfQorCisJCQlicmVhazsKKwkJfQorCisjaWYgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRfTU4pKSAhPSAwKQorCWNhc2Uga0VwbEV2ZW50VHlwZURsbGtTdGFydFJlZHVjZWRDeWNsZToKKwkJeworCQkJLy8gc3RhcnQgdGhlIHJlZHVjZWQgY3ljbGUgYnkgcHJvZ3JhbW1pbmcgdGhlIGN5Y2xlIHRpbWVyCisJCQkvLyBpdCBpcyBpc3N1ZWQgYnkgTk1UIE1OIG1vZHVsZSwgd2hlbiBQcmVPcDEgaXMgZW50ZXJlZAorCisJCQkvLyBjbGVhciB0aGUgYXN5bmNocm9ub3VzIHF1ZXVlcworCQkJUmV0ID0gRXBsRGxsa0NhbEFzeW5jQ2xlYXJRdWV1ZXMoKTsKKworCQkJLy8gcmVzZXQgY3ljbGUgY291bnRlciAoZXZlcnl0aW1lIGEgU29BIGlzIHRyaWdnZXJkIGluIFByZU9wMSB0aGUgY291bnRlciBpcyBpbmNyZW1lbnRlZAorCQkJLy8gYW5kIHdoZW4gaXQgcmVhY2hlcyBFUExfQ19ETExfUFJFT1AxX1NUQVJUX0NZQ0xFUyB0aGUgU29BIG1heSBjb250YWluIGludml0YXRpb25zKQorCQkJRXBsRGxsa0luc3RhbmNlX2cubV91aUN5Y2xlQ291bnQgPSAwOworCisJCQkvLyByZW1vdmUgYW55IENOIGZyb20gaXNvY2hyb25vdXMgcGhhc2UKKwkJCXdoaWxlIChFcGxEbGxrSW5zdGFuY2VfZy5tX3BGaXJzdE5vZGVJbmZvICE9IE5VTEwpIHsKKwkJCQlFcGxEbGxrRGVsZXRlTm9kZShFcGxEbGxrSW5zdGFuY2VfZy4KKwkJCQkJCSAgbV9wRmlyc3ROb2RlSW5mby0+bV91aU5vZGVJZCk7CisJCQl9CisKKwkJCS8vIGNoYW5nZSBzdGF0ZSB0byBOb25DeWNsaWMsCisJCQkvLyBoZW5jZSBFcGxEbGxrQ2hhbmdlU3RhdGUoKSB3aWxsIG5vdCBpZ25vcmUgdGhlIG5leHQgY2FsbAorCQkJRXBsRGxsa0luc3RhbmNlX2cubV9EbGxTdGF0ZSA9IGtFcGxEbGxNc05vbkN5Y2xpYzsKKworI2lmIEVQTF9USU1FUl9VU0VfSElHSFJFUyAhPSBGQUxTRQorCQkJaWYgKEVwbERsbGtJbnN0YW5jZV9nLm1fRGxsQ29uZmlnUGFyYW0uCisJCQkgICAgbV9kd0FzeW5jU2xvdFRpbWVvdXQgIT0gMCkgeworCQkJCVJldCA9CisJCQkJICAgIEVwbFRpbWVySGlnaFJlc2tNb2RpZnlUaW1lck5zCisJCQkJICAgICgmRXBsRGxsa0luc3RhbmNlX2cubV9UaW1lckhkbEN5Y2xlLAorCQkJCSAgICAgRXBsRGxsa0luc3RhbmNlX2cubV9EbGxDb25maWdQYXJhbS4KKwkJCQkgICAgIG1fZHdBc3luY1Nsb3RUaW1lb3V0LAorCQkJCSAgICAgRXBsRGxsa0NiTW5UaW1lckN5Y2xlLCAwTCwgRkFMU0UpOworCQkJfQorI2VuZGlmCisKKwkJCWJyZWFrOworCQl9CisjZW5kaWYKKworI2lmIEVQTF9ETExfUFJFU19SRUFEWV9BRlRFUl9TT0EgIT0gRkFMU0UKKwljYXNlIGtFcGxFdmVudFR5cGVEbGxrUHJlc1JlYWR5OgorCQl7CisJCQkvLyBwb3N0IFBSZXMgdG8gdHJhbnNtaXQgRklGTworCisJCQlObXRTdGF0ZSA9IEVwbE5tdGtHZXRObXRTdGF0ZSgpOworCisJCQlpZiAoTm10U3RhdGUgIT0ga0VwbE5tdENzQmFzaWNFdGhlcm5ldCkgeworCQkJCS8vIERvZXMgUFJlcyBleGlzdD8KKwkJCQlpZiAoRXBsRGxsa0luc3RhbmNlX2cubV9wVHhCdWZmZXJbRVBMX0RMTEtfVFhGUkFNRV9QUkVTXS5tX3BiQnVmZmVyICE9IE5VTEwpIHsJLy8gUFJlcyBkb2VzIGV4aXN0CisJCQkJCXBUeEZyYW1lID0KKwkJCQkJICAgICh0RXBsRnJhbWUgKikgRXBsRGxsa0luc3RhbmNlX2cuCisJCQkJCSAgICBtX3BUeEJ1ZmZlcltFUExfRExMS19UWEZSQU1FX1BSRVNdLgorCQkJCQkgICAgbV9wYkJ1ZmZlcjsKKwkJCQkJLy8gdXBkYXRlIGZyYW1lIChOTVQgc3RhdGUsIFJELCBSUywgUFIsIE1TLCBFTiBmbGFncykKKwkJCQkJaWYgKE5tdFN0YXRlIDwga0VwbE5tdENzUHJlT3BlcmF0aW9uYWwyKSB7CS8vIE5NVCBzdGF0ZSBpcyBub3QgUHJlT3AyLCBSZWFkeVRvT3Agb3IgT3AKKwkJCQkJCS8vIGZha2UgTk1UIHN0YXRlIFByZU9wMiwgYmVjYXVzZSBQUmVzIHdpbGwgYmUgc2VudCBvbmx5IGluIFByZU9wMiBvciBncmVhdGVyCisJCQkJCQlObXRTdGF0ZSA9CisJCQkJCQkgICAga0VwbE5tdENzUHJlT3BlcmF0aW9uYWwyOworCQkJCQl9CisJCQkJCUFtaVNldEJ5dGVUb0xlKCZwVHhGcmFtZS0+bV9EYXRhLm1fUHJlcy4KKwkJCQkJCSAgICAgICBtX2xlX2JObXRTdGF0dXMsCisJCQkJCQkgICAgICAgKEJZVEUpIE5tdFN0YXRlKTsKKwkJCQkJQW1pU2V0Qnl0ZVRvTGUoJnBUeEZyYW1lLT5tX0RhdGEubV9QcmVzLgorCQkJCQkJICAgICAgIG1fbGVfYkZsYWcyLAorCQkJCQkJICAgICAgIEVwbERsbGtJbnN0YW5jZV9nLgorCQkJCQkJICAgICAgIG1fYkZsYWcyKTsKKwkJCQkJaWYgKE5tdFN0YXRlICE9IGtFcGxObXRDc09wZXJhdGlvbmFsKSB7CS8vIG1hcmsgUERPIGFzIGludmFsaWQgaW4gTk1UIHN0YXRlIE9wCisJCQkJCQkvLyAkJCQgcmVzZXQgb25seSBSRCBmbGFnOyBzZXQgb3RoZXIgZmxhZ3MgYXBwcm9wcmlhdGVseQorCQkJCQkJQW1pU2V0Qnl0ZVRvTGUoJnBUeEZyYW1lLT4KKwkJCQkJCQkgICAgICAgbV9EYXRhLm1fUHJlcy4KKwkJCQkJCQkgICAgICAgbV9sZV9iRmxhZzEsIDApOworCQkJCQl9CisJCQkJCS8vICQkJCBtYWtlIGZ1bmN0aW9uIHRoYXQgdXBkYXRlcyBQcmVzLCBTdGF0dXNSZXMKKwkJCQkJLy8gbWFyayBQUmVzIGZyYW1lIGFzIHJlYWR5IGZvciB0cmFuc21pc3Npb24KKwkJCQkJUmV0ID0KKwkJCQkJICAgIEVkcnZUeE1zZ1JlYWR5KCZFcGxEbGxrSW5zdGFuY2VfZy4KKwkJCQkJCQkgICBtX3BUeEJ1ZmZlcgorCQkJCQkJCSAgIFtFUExfRExMS19UWEZSQU1FX1BSRVNdKTsKKwkJCQl9CisJCQl9CisKKwkJCWJyZWFrOworCQl9CisjZW5kaWYKKwlkZWZhdWx0OgorCQl7CisJCQlBU1NFUlRNU0coRkFMU0UsCisJCQkJICAiRXBsRGxsa1Byb2Nlc3MoKTogdW5oYW5kbGVkIGV2ZW50IHR5cGUhXG4iKTsKKwkJfQorCX0KKworICAgICAgRXhpdDoKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxEbGxrQ29uZmlnCisvLworLy8gRGVzY3JpcHRpb246IGNvbmZpZ3VyZSBwYXJhbWV0ZXJzIG9mIERMTAorLy8KKy8vIFBhcmFtZXRlcnM6ICBwRGxsQ29uZmlnUGFyYW1fcCAgICAgICA9IGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycworLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordEVwbEtlcm5lbCBFcGxEbGxrQ29uZmlnKHRFcGxEbGxDb25maWdQYXJhbSAqIHBEbGxDb25maWdQYXJhbV9wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKy8vIGQuay4gY2hlY2sgb2YgTk1UIHN0YXRlIGRpc2FibGVkLCBiZWNhdXNlIEN5Y2xlTGVuIGlzIHByb2dyYW1tZWQgYXQgcnVuIHRpbWUgYnkgTU4gd2l0aG91dCByZXNldCBvZiBDTgorLyp0RXBsTm10U3RhdGUgICAgTm10U3RhdGU7CisKKyAgICBObXRTdGF0ZSA9IEVwbE5tdGtHZXRObXRTdGF0ZSgpOworCisgICAgaWYgKE5tdFN0YXRlID4ga0VwbE5tdEdzUmVzZXRDb25maWd1cmF0aW9uKQorICAgIHsgICAvLyBvbmx5IGFsbG93ZWQgaW4gc3RhdGUgRExMX0dTX0lOSVQKKyAgICAgICAgUmV0ID0ga0VwbEludmFsaWRPcGVyYXRpb247CisgICAgICAgIGdvdG8gRXhpdDsKKyAgICB9CisqLworCUVQTF9NRU1DUFkoJkVwbERsbGtJbnN0YW5jZV9nLm1fRGxsQ29uZmlnUGFyYW0sIHBEbGxDb25maWdQYXJhbV9wLAorCQkgICAocERsbENvbmZpZ1BhcmFtX3AtPm1fdWlTaXplT2ZTdHJ1Y3QgPAorCQkgICAgc2l6ZW9mKHRFcGxEbGxDb25maWdQYXJhbSkgPyBwRGxsQ29uZmlnUGFyYW1fcC0+CisJCSAgICBtX3VpU2l6ZU9mU3RydWN0IDogc2l6ZW9mKHRFcGxEbGxDb25maWdQYXJhbSkpKTsKKworCWlmICgoRXBsRGxsa0luc3RhbmNlX2cubV9EbGxDb25maWdQYXJhbS5tX2R3Q3ljbGVMZW4gIT0gMCkKKwkgICAgJiYgKEVwbERsbGtJbnN0YW5jZV9nLm1fRGxsQ29uZmlnUGFyYW0ubV9kd0xvc3NPZkZyYW1lVG9sZXJhbmNlICE9IDApKSB7CS8vIG1vbml0b3IgRVBMIGN5Y2xlLCBjYWxjdWxhdGUgZnJhbWUgdGltZW91dAorCQlFcGxEbGxrSW5zdGFuY2VfZy5tX3VsbEZyYW1lVGltZW91dCA9ICgxMDAwTEwKKwkJCQkJCSAgICAgICAqCisJCQkJCQkgICAgICAgKCh1bnNpZ25lZCBsb25nIGxvbmcpCisJCQkJCQkJRXBsRGxsa0luc3RhbmNlX2cuCisJCQkJCQkJbV9EbGxDb25maWdQYXJhbS4KKwkJCQkJCQltX2R3Q3ljbGVMZW4pKQorCQkgICAgKworCQkgICAgKCh1bnNpZ25lZCBsb25nIGxvbmcpRXBsRGxsa0luc3RhbmNlX2cubV9EbGxDb25maWdQYXJhbS4KKwkJICAgICBtX2R3TG9zc09mRnJhbWVUb2xlcmFuY2UpOworCX0gZWxzZSB7CisJCUVwbERsbGtJbnN0YW5jZV9nLm1fdWxsRnJhbWVUaW1lb3V0ID0gMExMOworCX0KKworCWlmIChFcGxEbGxrSW5zdGFuY2VfZy5tX0RsbENvbmZpZ1BhcmFtLm1fZkFzeW5jT25seSAhPSBGQUxTRSkgewkvLyBpdCBpcyBjb25maWd1cmVkIGFzIGFzeW5jLW9ubHkgQ04KKwkJLy8gZGlzYWJsZSBtdWx0aXBsZXhlZCBjeWNsZSwgdGhhdCBtX3VpQ3ljbGVDb3VudCB3aWxsIG5vdCBiZSBpbmNyZW1lbnRlZCBzcHVyaW91c2x5IG9uIFNvQworCQlFcGxEbGxrSW5zdGFuY2VfZy5tX0RsbENvbmZpZ1BhcmFtLm1fdWlNdWx0aXBsQ3ljbGVDbnQgPSAwOworCX0KKy8vRXhpdDoKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxEbGxrU2V0SWRlbnRpdHkKKy8vCisvLyBEZXNjcmlwdGlvbjogY29uZmlndXJlIGlkZW50aXR5IG9mIGxvY2FsIG5vZGUgZm9yIElkZW50UmVzcG9uc2UKKy8vCisvLyBQYXJhbWV0ZXJzOiAgcERsbElkZW50UGFyYW1fcCAgICAgICAgPSBpZGVudGl0eQorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordEVwbEtlcm5lbCBFcGxEbGxrU2V0SWRlbnRpdHkodEVwbERsbElkZW50UGFyYW0gKiBwRGxsSWRlbnRQYXJhbV9wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwlFUExfTUVNQ1BZKCZFcGxEbGxrSW5zdGFuY2VfZy5tX0RsbElkZW50UGFyYW0sIHBEbGxJZGVudFBhcmFtX3AsCisJCSAgIChwRGxsSWRlbnRQYXJhbV9wLT5tX3VpU2l6ZU9mU3RydWN0IDwKKwkJICAgIHNpemVvZih0RXBsRGxsSWRlbnRQYXJhbSkgPyBwRGxsSWRlbnRQYXJhbV9wLT4KKwkJICAgIG1fdWlTaXplT2ZTdHJ1Y3QgOiBzaXplb2YodEVwbERsbElkZW50UGFyYW0pKSk7CisKKwkvLyAkJCQgaWYgSWRlbnRSZXNwb25zZSBmcmFtZSBleGlzdHMgdXBkYXRlIGl0CisKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxEbGxrUmVnQXN5bmNIYW5kbGVyCisvLworLy8gRGVzY3JpcHRpb246IHJlZ2lzdGVycyBoYW5kbGVyIGZvciBub24tRVBMIGZyYW1lcworLy8KKy8vIFBhcmFtZXRlcnM6ICBwZm5EbGxrQ2JBc3luY19wICAgICAgICA9IHBvaW50ZXIgdG8gY2FsbGJhY2sgZnVuY3Rpb24KKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgRXBsRGxsa1JlZ0FzeW5jSGFuZGxlcih0RXBsRGxsa0NiQXN5bmMgcGZuRGxsa0NiQXN5bmNfcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJaWYgKEVwbERsbGtJbnN0YW5jZV9nLm1fcGZuQ2JBc3luYyA9PSBOVUxMKSB7CS8vIG5vIGhhbmRsZXIgcmVnaXN0ZXJlZCB5ZXQKKwkJRXBsRGxsa0luc3RhbmNlX2cubV9wZm5DYkFzeW5jID0gcGZuRGxsa0NiQXN5bmNfcDsKKwl9IGVsc2UgewkJLy8gaGFuZGxlciBhbHJlYWR5IHJlZ2lzdGVyZWQKKwkJUmV0ID0ga0VwbERsbENiQXN5bmNSZWdpc3RlcmVkOworCX0KKworCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbERsbGtEZXJlZ0FzeW5jSGFuZGxlcgorLy8KKy8vIERlc2NyaXB0aW9uOiBkZXJlZ2lzdGVycyBoYW5kbGVyIGZvciBub24tRVBMIGZyYW1lcworLy8KKy8vIFBhcmFtZXRlcnM6ICBwZm5EbGxrQ2JBc3luY19wICAgICAgICA9IHBvaW50ZXIgdG8gY2FsbGJhY2sgZnVuY3Rpb24KKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgRXBsRGxsa0RlcmVnQXN5bmNIYW5kbGVyKHRFcGxEbGxrQ2JBc3luYyBwZm5EbGxrQ2JBc3luY19wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwlpZiAoRXBsRGxsa0luc3RhbmNlX2cubV9wZm5DYkFzeW5jID09IHBmbkRsbGtDYkFzeW5jX3ApIHsJLy8gc2FtZSBoYW5kbGVyIGlzIHJlZ2lzdGVyZWQKKwkJLy8gZGVyZWdpc3RlciBpdAorCQlFcGxEbGxrSW5zdGFuY2VfZy5tX3BmbkNiQXN5bmMgPSBOVUxMOworCX0gZWxzZSB7CQkvLyB3cm9uZyBoYW5kbGVyIG9yIG5vIGhhbmRsZXIgcmVnaXN0ZXJlZAorCQlSZXQgPSBrRXBsRGxsQ2JBc3luY1JlZ2lzdGVyZWQ7CisJfQorCisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsRGxsa1NldEFzbmRTZXJ2aWNlSWRGaWx0ZXIoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBzZXRzIHRoZSBzcGVjaWZpZWQgbm9kZSBJRCBmaWx0ZXIgZm9yIHRoZSBzcGVjaWZpZWQKKy8vICAgICAgICAgICAgICBBc25kU2VydmljZUlkLiBJdCByZWdpc3RlcnMgQ19ETExfTVVMVElDQVNUX0FTTkQgaW4gZXRoZXJuZXQKKy8vICAgICAgICAgICAgICBkcml2ZXIgaWYgYW55IEFzbmRTZXJ2aWNlSWQgaXMgb3Blbi4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgU2VydmljZUlkX3AgICAgICAgICAgICAgPSBBU25kIFNlcnZpY2UgSUQKKy8vICAgICAgICAgICAgICBGaWx0ZXJfcCAgICAgICAgICAgICAgICA9IG5vZGUgSUQgZmlsdGVyCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIEVwbERsbGtTZXRBc25kU2VydmljZUlkRmlsdGVyKHRFcGxEbGxBc25kU2VydmljZUlkIFNlcnZpY2VJZF9wLAorCQkJCQkgdEVwbERsbEFzbmRGaWx0ZXIgRmlsdGVyX3ApCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCWlmIChTZXJ2aWNlSWRfcCA8IHRhYmVudHJpZXMoRXBsRGxsa0luc3RhbmNlX2cubV9hQXNuZEZpbHRlcikpIHsKKwkJRXBsRGxsa0luc3RhbmNlX2cubV9hQXNuZEZpbHRlcltTZXJ2aWNlSWRfcF0gPSBGaWx0ZXJfcDsKKwl9CisKKwlyZXR1cm4gUmV0OworfQorCisjaWYgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRfTU4pKSAhPSAwKQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxEbGxrU2V0RmxhZzFPZk5vZGUoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBzZXRzIEZsYWcxIChmb3IgUFJlcSBhbmQgU29BKSBvZiB0aGUgc3BlY2lmaWVkIG5vZGUgSUQuCisvLworLy8gUGFyYW1ldGVyczogIHVpTm9kZUlkX3AgICAgICAgICAgICAgID0gbm9kZSBJRAorLy8gICAgICAgICAgICAgIGJTb2FGbGFnMV9wICAgICAgICAgICAgID0gZmxhZzEKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgRXBsRGxsa1NldEZsYWcxT2ZOb2RlKHVuc2lnbmVkIGludCB1aU5vZGVJZF9wLCBCWVRFIGJTb2FGbGFnMV9wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJdEVwbERsbGtOb2RlSW5mbyAqcE5vZGVJbmZvOworCisJcE5vZGVJbmZvID0gRXBsRGxsa0dldE5vZGVJbmZvKHVpTm9kZUlkX3ApOworCWlmIChwTm9kZUluZm8gPT0gTlVMTCkgewkvLyBubyBub2RlIGluZm8gc3RydWN0dXJlIGF2YWlsYWJsZQorCQlSZXQgPSBrRXBsRGxsTm9Ob2RlSW5mbzsKKwkJZ290byBFeGl0OworCX0KKwkvLyBzdG9yZSBmbGFnMSBpbiBpbnRlcm5hbCBub2RlIGluZm8gc3RydWN0dXJlCisJcE5vZGVJbmZvLT5tX2JTb2FGbGFnMSA9IGJTb2FGbGFnMV9wOworCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbERsbGtHZXRGaXJzdE5vZGVJbmZvKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogcmV0dXJucyBmaXJzdCBpbmZvIHN0cnVjdHVyZSBvZiBmaXJzdCBub2RlIGluIGlzb2Nocm9ub3VzIHBoYXNlLgorLy8gICAgICAgICAgICAgIEl0IGlzIG9ubHkgdXNlZnVsIGZvciBFcnJvckhhbmRsZXJrIG1vZHVsZS4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgcHBOb2RlSW5mb19wICAgICAgICAgICAgPSBwb2ludGVyIHRvIHBvaW50ZXIgb2YgaW50ZXJuYWwgbm9kZSBpbmZvIHN0cnVjdHVyZQorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordEVwbEtlcm5lbCBFcGxEbGxrR2V0Rmlyc3ROb2RlSW5mbyh0RXBsRGxsa05vZGVJbmZvICoqIHBwTm9kZUluZm9fcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJKnBwTm9kZUluZm9fcCA9IEVwbERsbGtJbnN0YW5jZV9nLm1fcEZpcnN0Tm9kZUluZm87CisKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxEbGxrQWRkTm9kZSgpCisvLworLy8gRGVzY3JpcHRpb246IGFkZHMgdGhlIHNwZWNpZmllZCBub2RlIHRvIHRoZSBpc29jaHJvbm91cyBwaGFzZS4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgcE5vZGVJbmZvX3AgICAgICAgICAgICAgPSBwb2ludGVyIG9mIG5vZGUgaW5mbyBzdHJ1Y3R1cmUKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgRXBsRGxsa0FkZE5vZGUodEVwbERsbE5vZGVJbmZvICogcE5vZGVJbmZvX3ApCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwl0RXBsRGxsa05vZGVJbmZvICpwSW50Tm9kZUluZm87CisJdEVwbERsbGtOb2RlSW5mbyAqKnBwSW50Tm9kZUluZm87CisJdW5zaWduZWQgaW50IHVpSGFuZGxlOworCXRFcGxGcmFtZSAqcEZyYW1lOworCXVuc2lnbmVkIGludCB1aUZyYW1lU2l6ZTsKKworCXBJbnROb2RlSW5mbyA9IEVwbERsbGtHZXROb2RlSW5mbyhwTm9kZUluZm9fcC0+bV91aU5vZGVJZCk7CisJaWYgKHBJbnROb2RlSW5mbyA9PSBOVUxMKSB7CS8vIG5vIG5vZGUgaW5mbyBzdHJ1Y3R1cmUgYXZhaWxhYmxlCisJCVJldCA9IGtFcGxEbGxOb05vZGVJbmZvOworCQlnb3RvIEV4aXQ7CisJfQorCisJRVBMX0RMTEtfREJHX1BPU1RfVFJBQ0VfVkFMVUUoa0VwbEV2ZW50VHlwZURsbGtBZGROb2RlLAorCQkJCSAgICAgIHBOb2RlSW5mb19wLT5tX3VpTm9kZUlkLCAwKTsKKworCS8vIGNvcHkgbm9kZSBjb25maWd1cmF0aW9uCisJcEludE5vZGVJbmZvLT5tX2R3UHJlc1RpbWVvdXQgPSBwTm9kZUluZm9fcC0+bV9kd1ByZXNUaW1lb3V0OworCXBJbnROb2RlSW5mby0+bV93UHJlc1BheWxvYWRMaW1pdCA9IHBOb2RlSW5mb19wLT5tX3dQcmVzUGF5bG9hZExpbWl0OworCisJLy8gJCQkIGQuay46IGFjdHVhbGx5IGFkZCBub2RlIG9ubHkgaWYgTU4uIE9uIENOIGl0IGlzIHN1ZmZpY2llbnQgdG8gdXBkYXRlIHRoZSBub2RlIGNvbmZpZ3VyYXRpb24KKwlpZiAocE5vZGVJbmZvX3AtPm1fdWlOb2RlSWQgPT0gRXBsRGxsa0luc3RhbmNlX2cubV9EbGxDb25maWdQYXJhbS5tX3VpTm9kZUlkKSB7CS8vIHdlIHNoYWxsIHNlbmQgUFJlcyBvdXJzZWxmCisJCS8vIGluc2VydCBvdXIgbm9kZSBhdCB0aGUgZW5kIG9mIHRoZSBsaXN0CisJCXBwSW50Tm9kZUluZm8gPSAmRXBsRGxsa0luc3RhbmNlX2cubV9wRmlyc3ROb2RlSW5mbzsKKwkJd2hpbGUgKCgqcHBJbnROb2RlSW5mbyAhPSBOVUxMKQorCQkgICAgICAgJiYgKCgqcHBJbnROb2RlSW5mbyktPm1fcE5leHROb2RlSW5mbyAhPSBOVUxMKSkgeworCQkJcHBJbnROb2RlSW5mbyA9ICYoKnBwSW50Tm9kZUluZm8pLT5tX3BOZXh0Tm9kZUluZm87CisJCX0KKwkJaWYgKCpwcEludE5vZGVJbmZvICE9IE5VTEwpIHsKKwkJCWlmICgoKnBwSW50Tm9kZUluZm8pLT5tX3VpTm9kZUlkID09IHBOb2RlSW5mb19wLT5tX3VpTm9kZUlkKSB7CS8vIG5vZGUgd2FzIGFscmVhZHkgYWRkZWQgdG8gbGlzdAorCQkJCS8vICQkJCBkLmsuIG1heWJlIHRoaXMgc2hvdWxkIGJlIGFuIGVycm9yCisJCQkJZ290byBFeGl0OworCQkJfSBlbHNlIHsJLy8gYWRkIG91ciBub2RlIGF0IHRoZSBlbmQgb2YgdGhlIGxpc3QKKwkJCQlwcEludE5vZGVJbmZvID0KKwkJCQkgICAgJigqcHBJbnROb2RlSW5mbyktPm1fcE5leHROb2RlSW5mbzsKKwkJCX0KKwkJfQorCQkvLyBzZXQgIlBSZXEiLVR4QnVmZmVyIHRvIFBSZXMtVHhCdWZmZXIKKwkJcEludE5vZGVJbmZvLT5tX3BQcmVxVHhCdWZmZXIgPQorCQkgICAgJkVwbERsbGtJbnN0YW5jZV9nLm1fcFR4QnVmZmVyW0VQTF9ETExLX1RYRlJBTUVfUFJFU107CisJfSBlbHNlIHsJCS8vIG5vcm1hbCBDTiBzaGFsbCBiZSBhZGRlZCB0byBpc29jaHJvbm91cyBwaGFzZQorCQkvLyBpbnNlcnQgbm9kZSBpbnRvIGxpc3QgaW4gYXNjZW5kaW5nIG9yZGVyCisJCXBwSW50Tm9kZUluZm8gPSAmRXBsRGxsa0luc3RhbmNlX2cubV9wRmlyc3ROb2RlSW5mbzsKKwkJd2hpbGUgKCgqcHBJbnROb2RlSW5mbyAhPSBOVUxMKQorCQkgICAgICAgJiYgKCgqcHBJbnROb2RlSW5mbyktPm1fdWlOb2RlSWQgPAorCQkJICAgcE5vZGVJbmZvX3AtPm1fdWlOb2RlSWQpCisJCSAgICAgICAmJiAoKCpwcEludE5vZGVJbmZvKS0+bV91aU5vZGVJZCAhPQorCQkJICAgRXBsRGxsa0luc3RhbmNlX2cubV9EbGxDb25maWdQYXJhbS5tX3VpTm9kZUlkKSkgeworCQkJcHBJbnROb2RlSW5mbyA9ICYoKnBwSW50Tm9kZUluZm8pLT5tX3BOZXh0Tm9kZUluZm87CisJCX0KKwkJaWYgKCgqcHBJbnROb2RlSW5mbyAhPSBOVUxMKSAmJiAoKCpwcEludE5vZGVJbmZvKS0+bV91aU5vZGVJZCA9PSBwTm9kZUluZm9fcC0+bV91aU5vZGVJZCkpIHsJLy8gbm9kZSB3YXMgYWxyZWFkeSBhZGRlZCB0byBsaXN0CisJCQkvLyAkJCQgZC5rLiBtYXliZSB0aGlzIHNob3VsZCBiZSBhbiBlcnJvcgorCQkJZ290byBFeGl0OworCQl9CisJfQorCisJLy8gaW5pdGlhbGl6ZSBlbGVtZW50cyBvZiBpbnRlcm5hbCBub2RlIGluZm8gc3RydWN0dXJlCisJcEludE5vZGVJbmZvLT5tX2JTb2FGbGFnMSA9IDA7CisJcEludE5vZGVJbmZvLT5tX2ZTb2Z0RGVsZXRlID0gRkFMU0U7CisJcEludE5vZGVJbmZvLT5tX05tdFN0YXRlID0ga0VwbE5tdENzTm90QWN0aXZlOworCWlmIChwSW50Tm9kZUluZm8tPm1fcFByZXFUeEJ1ZmZlciA9PSBOVUxMKSB7CS8vIGNyZWF0ZSBUeEJ1ZmZlciBlbnRyeQorCQl1aUZyYW1lU2l6ZSA9IHBOb2RlSW5mb19wLT5tX3dQcmVxUGF5bG9hZExpbWl0ICsgMjQ7CisJCVJldCA9CisJCSAgICBFcGxEbGxrQ3JlYXRlVHhGcmFtZSgmdWlIYW5kbGUsICZwRnJhbWUsICZ1aUZyYW1lU2l6ZSwKKwkJCQkJIGtFcGxNc2dUeXBlUHJlcSwKKwkJCQkJIGtFcGxEbGxBc25kTm90RGVmaW5lZCk7CisJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCWdvdG8gRXhpdDsKKwkJfQorCQlwSW50Tm9kZUluZm8tPm1fcFByZXFUeEJ1ZmZlciA9CisJCSAgICAmRXBsRGxsa0luc3RhbmNlX2cubV9wVHhCdWZmZXJbdWlIYW5kbGVdOworCQlBbWlTZXRCeXRlVG9MZSgmcEZyYW1lLT5tX2xlX2JEc3ROb2RlSWQsCisJCQkgICAgICAgKEJZVEUpIHBOb2RlSW5mb19wLT5tX3VpTm9kZUlkKTsKKworCQkvLyBzZXQgdXAgZGVzdGluYXRpb24gTUFDIGFkZHJlc3MKKwkJRVBMX01FTUNQWShwRnJhbWUtPm1fYmVfYWJEc3RNYWMsIHBJbnROb2RlSW5mby0+bV9iZV9hYk1hY0FkZHIsCisJCQkgICA2KTsKKworI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfUERPSykpICE9IDApCisJCXsKKwkJCXRFcGxGcmFtZUluZm8gRnJhbWVJbmZvOworCisJCQkvLyBpbml0aWFsbHkgZW5jb2RlIFRQRE8gLT4gaW5mb3JtIFBETyBtb2R1bGUKKwkJCUZyYW1lSW5mby5tX3BGcmFtZSA9IHBGcmFtZTsKKwkJCUZyYW1lSW5mby5tX3VpRnJhbWVTaXplID0gdWlGcmFtZVNpemU7CisJCQlSZXQgPSBFcGxQZG9rQ2JQZG9UcmFuc21pdHRlZCgmRnJhbWVJbmZvKTsKKwkJfQorI2VuZGlmCisJfQorCXBJbnROb2RlSW5mby0+bV91bERsbEVycm9yRXZlbnRzID0gMEw7CisJLy8gYWRkIG5vZGUgdG8gbGlzdAorCXBJbnROb2RlSW5mby0+bV9wTmV4dE5vZGVJbmZvID0gKnBwSW50Tm9kZUluZm87CisJKnBwSW50Tm9kZUluZm8gPSBwSW50Tm9kZUluZm87CisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsRGxsa0RlbGV0ZU5vZGUoKQorLy8KKy8vIERlc2NyaXB0aW9uOiByZW1vdmVzIHRoZSBzcGVjaWZpZWQgbm9kZSBmcm9tIHRoZSBpc29jaHJvbm91cyBwaGFzZS4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgdWlOb2RlSWRfcCAgICAgICAgICAgICAgPSBub2RlIElECisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIEVwbERsbGtEZWxldGVOb2RlKHVuc2lnbmVkIGludCB1aU5vZGVJZF9wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJdEVwbERsbGtOb2RlSW5mbyAqcEludE5vZGVJbmZvOworCXRFcGxEbGxrTm9kZUluZm8gKipwcEludE5vZGVJbmZvOworCXVuc2lnbmVkIGludCB1aUhhbmRsZTsKKworCXBJbnROb2RlSW5mbyA9IEVwbERsbGtHZXROb2RlSW5mbyh1aU5vZGVJZF9wKTsKKwlpZiAocEludE5vZGVJbmZvID09IE5VTEwpIHsJLy8gbm8gbm9kZSBpbmZvIHN0cnVjdHVyZSBhdmFpbGFibGUKKwkJUmV0ID0ga0VwbERsbE5vTm9kZUluZm87CisJCWdvdG8gRXhpdDsKKwl9CisKKwlFUExfRExMS19EQkdfUE9TVF9UUkFDRV9WQUxVRShrRXBsRXZlbnRUeXBlRGxsa0RlbE5vZGUsIHVpTm9kZUlkX3AsIDApOworCisJLy8gc2VhcmNoIG5vZGUgaW4gd2hvbGUgbGlzdAorCXBwSW50Tm9kZUluZm8gPSAmRXBsRGxsa0luc3RhbmNlX2cubV9wRmlyc3ROb2RlSW5mbzsKKwl3aGlsZSAoKCpwcEludE5vZGVJbmZvICE9IE5VTEwpCisJICAgICAgICYmICgoKnBwSW50Tm9kZUluZm8pLT5tX3VpTm9kZUlkICE9IHVpTm9kZUlkX3ApKSB7CisJCXBwSW50Tm9kZUluZm8gPSAmKCpwcEludE5vZGVJbmZvKS0+bV9wTmV4dE5vZGVJbmZvOworCX0KKwlpZiAoKCpwcEludE5vZGVJbmZvID09IE5VTEwpIHx8ICgoKnBwSW50Tm9kZUluZm8pLT5tX3VpTm9kZUlkICE9IHVpTm9kZUlkX3ApKSB7CS8vIG5vZGUgd2FzIG5vdCBmb3VuZCBpbiBsaXN0CisJCS8vICQkJCBkLmsuIG1heWJlIHRoaXMgc2hvdWxkIGJlIGFuIGVycm9yCisJCWdvdG8gRXhpdDsKKwl9CisJLy8gcmVtb3ZlIG5vZGUgZnJvbSBsaXN0CisJKnBwSW50Tm9kZUluZm8gPSBwSW50Tm9kZUluZm8tPm1fcE5leHROb2RlSW5mbzsKKworCWlmICgocEludE5vZGVJbmZvLT5tX3BQcmVxVHhCdWZmZXIgIT0gTlVMTCkKKwkgICAgJiYgKHBJbnROb2RlSW5mby0+bV9wUHJlcVR4QnVmZmVyICE9ICZFcGxEbGxrSW5zdGFuY2VfZy5tX3BUeEJ1ZmZlcltFUExfRExMS19UWEZSQU1FX1BSRVNdKSkgewkvLyBkZWxldGUgVHhCdWZmZXIgZW50cnkKKwkJdWlIYW5kbGUgPQorCQkgICAgcEludE5vZGVJbmZvLT5tX3BQcmVxVHhCdWZmZXIgLQorCQkgICAgRXBsRGxsa0luc3RhbmNlX2cubV9wVHhCdWZmZXI7CisJCXBJbnROb2RlSW5mby0+bV9wUHJlcVR4QnVmZmVyID0gTlVMTDsKKwkJUmV0ID0gRXBsRGxsa0RlbGV0ZVR4RnJhbWUodWlIYW5kbGUpOworLyogICAgICAgIGlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gRXhpdDsKKyAgICAgICAgfSovCisJfQorCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbERsbGtTb2Z0RGVsZXRlTm9kZSgpCisvLworLy8gRGVzY3JpcHRpb246IHJlbW92ZXMgdGhlIHNwZWNpZmllZCBub2RlIG5vdCBpbW1lZGlhdGVseSBmcm9tIHRoZSBpc29jaHJvbm91cyBwaGFzZS4KKy8vICAgICAgICAgICAgICBJbnN0ZWFkIHRoZSB3aWxsIGJlIHJlbW92ZWQgYWZ0ZXIgZXJyb3IgKGxhdGUvbG9zcyBQUmVzKSB3aXRob3V0CisvLyAgICAgICAgICAgICAgY2hhcmdpbmcgdGhlIGVycm9yLgorLy8KKy8vIFBhcmFtZXRlcnM6ICB1aU5vZGVJZF9wICAgICAgICAgICAgICA9IG5vZGUgSUQKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgRXBsRGxsa1NvZnREZWxldGVOb2RlKHVuc2lnbmVkIGludCB1aU5vZGVJZF9wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJdEVwbERsbGtOb2RlSW5mbyAqcEludE5vZGVJbmZvOworCisJcEludE5vZGVJbmZvID0gRXBsRGxsa0dldE5vZGVJbmZvKHVpTm9kZUlkX3ApOworCWlmIChwSW50Tm9kZUluZm8gPT0gTlVMTCkgewkvLyBubyBub2RlIGluZm8gc3RydWN0dXJlIGF2YWlsYWJsZQorCQlSZXQgPSBrRXBsRGxsTm9Ob2RlSW5mbzsKKwkJZ290byBFeGl0OworCX0KKworCUVQTF9ETExLX0RCR19QT1NUX1RSQUNFX1ZBTFVFKGtFcGxFdmVudFR5cGVEbGxrU29mdERlbE5vZGUsCisJCQkJICAgICAgdWlOb2RlSWRfcCwgMCk7CisKKwlwSW50Tm9kZUluZm8tPm1fZlNvZnREZWxldGUgPSBUUlVFOworCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7Cit9CisKKyNlbmRpZiAvLygoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UX01OKSkgIT0gMCkKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICBQIFIgSSBWIEEgVCBFICAgRiBVIE4gQyBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbERsbGtDaGFuZ2VTdGF0ZQorLy8KKy8vIERlc2NyaXB0aW9uOiBjaGFuZ2UgRExMIHN0YXRlIG9uIGV2ZW50IGFuZCBkaWFnbm9zZSBzb21lIGNvbW11bmljYXRpb24gZXJyb3JzCisvLworLy8gUGFyYW1ldGVyczogIE5tdEV2ZW50X3AgICAgICAgICAgICAgID0gRExMIGV2ZW50ICh3cmFwcGVkIGluIE5NVCBldmVudCkKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB0RXBsS2VybmVsIEVwbERsbGtDaGFuZ2VTdGF0ZSh0RXBsTm10RXZlbnQgTm10RXZlbnRfcCwKKwkJCQkgICAgIHRFcGxObXRTdGF0ZSBObXRTdGF0ZV9wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJdEVwbEV2ZW50IEV2ZW50OworCXRFcGxFcnJvckhhbmRsZXJrRXZlbnQgRGxsRXZlbnQ7CisKKwlEbGxFdmVudC5tX3VsRGxsRXJyb3JFdmVudHMgPSAwOworCURsbEV2ZW50Lm1fdWlOb2RlSWQgPSAwOworCURsbEV2ZW50Lm1fTm10U3RhdGUgPSBObXRTdGF0ZV9wOworCisJc3dpdGNoIChObXRTdGF0ZV9wKSB7CisJY2FzZSBrRXBsTm10R3NPZmY6CisJY2FzZSBrRXBsTm10R3NJbml0aWFsaXNpbmc6CisJY2FzZSBrRXBsTm10R3NSZXNldEFwcGxpY2F0aW9uOgorCWNhc2Uga0VwbE5tdEdzUmVzZXRDb21tdW5pY2F0aW9uOgorCWNhc2Uga0VwbE5tdEdzUmVzZXRDb25maWd1cmF0aW9uOgorCWNhc2Uga0VwbE5tdENzQmFzaWNFdGhlcm5ldDoKKwkJLy8gZW50ZXIgRExMX0dTX0lOSVQKKwkJRXBsRGxsa0luc3RhbmNlX2cubV9EbGxTdGF0ZSA9IGtFcGxEbGxHc0luaXQ7CisJCWJyZWFrOworCisJY2FzZSBrRXBsTm10Q3NOb3RBY3RpdmU6CisJY2FzZSBrRXBsTm10Q3NQcmVPcGVyYXRpb25hbDE6CisJCS8vIHJlZHVjZWQgRVBMIGN5Y2xlIGlzIGFjdGl2ZQorCQlpZiAoTm10RXZlbnRfcCA9PSBrRXBsTm10RXZlbnREbGxDZVNvYykgewkvLyBTb0MgcmVjZWl2ZWQKKwkJCS8vIGVudGVyIERMTF9DU19XQUlUX1BSRVEKKwkJCUVwbERsbGtJbnN0YW5jZV9nLm1fRGxsU3RhdGUgPSBrRXBsRGxsQ3NXYWl0UHJlcTsKKwkJfSBlbHNlIHsKKwkJCS8vIGVudGVyIERMTF9HU19JTklUCisJCQlFcGxEbGxrSW5zdGFuY2VfZy5tX0RsbFN0YXRlID0ga0VwbERsbEdzSW5pdDsKKwkJfQorCQlicmVhazsKKworCWNhc2Uga0VwbE5tdENzUHJlT3BlcmF0aW9uYWwyOgorCWNhc2Uga0VwbE5tdENzUmVhZHlUb09wZXJhdGU6CisJY2FzZSBrRXBsTm10Q3NPcGVyYXRpb25hbDoKKwkJLy8gZnVsbCBFUEwgY3ljbGUgaXMgYWN0aXZlCisKKwkJc3dpdGNoIChFcGxEbGxrSW5zdGFuY2VfZy5tX0RsbFN0YXRlKSB7CisJCWNhc2Uga0VwbERsbENzV2FpdFByZXE6CisJCQlzd2l0Y2ggKE5tdEV2ZW50X3ApIHsKKwkJCQkvLyBETExfQ1QyCisJCQljYXNlIGtFcGxObXRFdmVudERsbENlUHJlcToKKwkJCQkvLyBlbnRlciBETExfQ1NfV0FJVF9TT0EKKwkJCQlEbGxFdmVudC5tX3VsRGxsRXJyb3JFdmVudHMgfD0KKwkJCQkgICAgRVBMX0RMTF9FUlJfQ05fUkVDVkRfUFJFUTsKKwkJCQlFcGxEbGxrSW5zdGFuY2VfZy5tX0RsbFN0YXRlID0ga0VwbERsbENzV2FpdFNvYTsKKwkJCQlicmVhazsKKworCQkJCS8vIERMTF9DVDgKKwkJCWNhc2Uga0VwbE5tdEV2ZW50RGxsQ2VGcmFtZVRpbWVvdXQ6CisJCQkJaWYgKE5tdFN0YXRlX3AgPT0ga0VwbE5tdENzUHJlT3BlcmF0aW9uYWwyKSB7CS8vIGlnbm9yZSBmcmFtZSB0aW1lb3V0IGluIFByZU9wMiwKKwkJCQkJLy8gYmVjYXVzZSB0aGUgcHJldmlvdXNseSBjb25maWd1cmVkIGN5Y2xlIGxlbgorCQkJCQkvLyBtYXkgYmUgd3JvbmcuCisJCQkJCS8vIDIwMDgvMTAvMTUgZC5rLiBJZiBpdCB3b3VsZCBub3QgYmUgaWdub3JlZCwKKwkJCQkJLy8gd2Ugd291bGQgZ28gY3ljbGljYWxseSB0byBQcmVPcDEgYW5kIG9uIG5leHQKKwkJCQkJLy8gU29DIGJhY2sgdG8gUHJlT3AyLgorCQkJCQlicmVhazsKKwkJCQl9CisJCQkJLy8gcmVwb3J0IERMTF9DRVZfTE9TU19TT0MgYW5kIERMTF9DRVZfTE9TU19TT0EKKwkJCQlEbGxFdmVudC5tX3VsRGxsRXJyb3JFdmVudHMgfD0KKwkJCQkgICAgRVBMX0RMTF9FUlJfQ05fTE9TU19TT0EgfAorCQkJCSAgICBFUExfRExMX0VSUl9DTl9MT1NTX1NPQzsKKworCQkJCS8vIGVudGVyIERMTF9DU19XQUlUX1NPQworCQkJCUVwbERsbGtJbnN0YW5jZV9nLm1fRGxsU3RhdGUgPSBrRXBsRGxsQ3NXYWl0U29jOworCQkJCWJyZWFrOworCisJCQljYXNlIGtFcGxObXRFdmVudERsbENlU29hOgorCQkJCS8vIGNoZWNrIGlmIG11bHRpcGxleGVkIGFuZCBQUmVxIHNob3VsZCBoYXZlIGJlZW4gcmVjZWl2ZWQgaW4gdGhpcyBjeWNsZQorCQkJCS8vIGFuZCBpZiA+PSBOTVRfQ1NfUkVBRFlfVE9fT1BFUkFURQorCQkJCWlmICgoRXBsRGxsa0luc3RhbmNlX2cubV91aUN5Y2xlQ291bnQgPT0gMCkKKwkJCQkgICAgJiYgKE5tdFN0YXRlX3AgPj0ga0VwbE5tdENzUmVhZHlUb09wZXJhdGUpKSB7CS8vIHJlcG9ydCBETExfQ0VWX0xPU1NfT0ZfUFJFUQorCQkJCQlEbGxFdmVudC5tX3VsRGxsRXJyb3JFdmVudHMgfD0KKwkJCQkJICAgIEVQTF9ETExfRVJSX0NOX0xPU1NfUFJFUTsKKwkJCQl9CisJCQkJLy8gZW50ZXIgRExMX0NTX1dBSVRfU09DCisJCQkJRXBsRGxsa0luc3RhbmNlX2cubV9EbGxTdGF0ZSA9IGtFcGxEbGxDc1dhaXRTb2M7CisJCQkJYnJlYWs7CisKKwkJCQkvLyBETExfQ1Q3CisJCQljYXNlIGtFcGxObXRFdmVudERsbENlU29jOgorCQkJY2FzZSBrRXBsTm10RXZlbnREbGxDZUFzbmQ6CisJCQkJLy8gcmVwb3J0IERMTF9DRVZfTE9TU19TT0EKKwkJCQlEbGxFdmVudC5tX3VsRGxsRXJyb3JFdmVudHMgfD0KKwkJCQkgICAgRVBMX0RMTF9FUlJfQ05fTE9TU19TT0E7CisKKwkJCWNhc2Uga0VwbE5tdEV2ZW50RGxsQ2VQcmVzOgorCQkJZGVmYXVsdDoKKwkJCQkvLyByZW1haW4gaW4gdGhpcyBzdGF0ZQorCQkJCWJyZWFrOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBrRXBsRGxsQ3NXYWl0U29jOgorCQkJc3dpdGNoIChObXRFdmVudF9wKSB7CisJCQkJLy8gRExMX0NUMQorCQkJY2FzZSBrRXBsTm10RXZlbnREbGxDZVNvYzoKKwkJCQkvLyBzdGFydCBvZiBjeWNsZSBhbmQgaXNvY2hyb25vdXMgcGhhc2UKKwkJCQkvLyBlbnRlciBETExfQ1NfV0FJVF9QUkVRCisJCQkJRXBsRGxsa0luc3RhbmNlX2cubV9EbGxTdGF0ZSA9CisJCQkJICAgIGtFcGxEbGxDc1dhaXRQcmVxOworCQkJCWJyZWFrOworCisJCQkJLy8gRExMX0NUNAorLy8gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIGtFcGxObXRFdmVudERsbENlUHJlczoKKwkJCWNhc2Uga0VwbE5tdEV2ZW50RGxsQ2VGcmFtZVRpbWVvdXQ6CisJCQkJaWYgKE5tdFN0YXRlX3AgPT0ga0VwbE5tdENzUHJlT3BlcmF0aW9uYWwyKSB7CS8vIGlnbm9yZSBmcmFtZSB0aW1lb3V0IGluIFByZU9wMiwKKwkJCQkJLy8gYmVjYXVzZSB0aGUgcHJldmlvdXNseSBjb25maWd1cmVkIGN5Y2xlIGxlbgorCQkJCQkvLyBtYXkgYmUgd3JvbmcuCisJCQkJCS8vIDIwMDgvMTAvMTUgZC5rLiBJZiBpdCB3b3VsZCBub3QgYmUgaWdub3JlZCwKKwkJCQkJLy8gd2Ugd291bGQgZ28gY3ljbGljYWxseSB0byBQcmVPcDEgYW5kIG9uIG5leHQKKwkJCQkJLy8gU29DIGJhY2sgdG8gUHJlT3AyLgorCQkJCQlicmVhazsKKwkJCQl9CisJCQkJLy8gZmFsbCB0aHJvdWdoCisKKwkJCWNhc2Uga0VwbE5tdEV2ZW50RGxsQ2VQcmVxOgorCQkJY2FzZSBrRXBsTm10RXZlbnREbGxDZVNvYToKKwkJCQkvLyByZXBvcnQgRExMX0NFVl9MT1NTX1NPQworCQkJCURsbEV2ZW50Lm1fdWxEbGxFcnJvckV2ZW50cyB8PQorCQkJCSAgICBFUExfRExMX0VSUl9DTl9MT1NTX1NPQzsKKworCQkJY2FzZSBrRXBsTm10RXZlbnREbGxDZUFzbmQ6CisJCQlkZWZhdWx0OgorCQkJCS8vIHJlbWFpbiBpbiB0aGlzIHN0YXRlCisJCQkJYnJlYWs7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIGtFcGxEbGxDc1dhaXRTb2E6CisJCQlzd2l0Y2ggKE5tdEV2ZW50X3ApIHsKKwkJCWNhc2Uga0VwbE5tdEV2ZW50RGxsQ2VGcmFtZVRpbWVvdXQ6CisJCQkJLy8gRExMX0NUMworCQkJCWlmIChObXRTdGF0ZV9wID09IGtFcGxObXRDc1ByZU9wZXJhdGlvbmFsMikgewkvLyBpZ25vcmUgZnJhbWUgdGltZW91dCBpbiBQcmVPcDIsCisJCQkJCS8vIGJlY2F1c2UgdGhlIHByZXZpb3VzbHkgY29uZmlndXJlZCBjeWNsZSBsZW4KKwkJCQkJLy8gbWF5IGJlIHdyb25nLgorCQkJCQkvLyAyMDA4LzEwLzE1IGQuay4gSWYgaXQgd291bGQgbm90IGJlIGlnbm9yZWQsCisJCQkJCS8vIHdlIHdvdWxkIGdvIGN5Y2xpY2FsbHkgdG8gUHJlT3AxIGFuZCBvbiBuZXh0CisJCQkJCS8vIFNvQyBiYWNrIHRvIFByZU9wMi4KKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCS8vIGZhbGwgdGhyb3VnaAorCisJCQljYXNlIGtFcGxObXRFdmVudERsbENlUHJlcToKKwkJCQkvLyByZXBvcnQgRExMX0NFVl9MT1NTX1NPQyBhbmQgRExMX0NFVl9MT1NTX1NPQQorCQkJCURsbEV2ZW50Lm1fdWxEbGxFcnJvckV2ZW50cyB8PQorCQkJCSAgICBFUExfRExMX0VSUl9DTl9MT1NTX1NPQSB8CisJCQkJICAgIEVQTF9ETExfRVJSX0NOX0xPU1NfU09DOworCisJCQljYXNlIGtFcGxObXRFdmVudERsbENlU29hOgorCQkJCS8vIGVudGVyIERMTF9DU19XQUlUX1NPQworCQkJCUVwbERsbGtJbnN0YW5jZV9nLm1fRGxsU3RhdGUgPSBrRXBsRGxsQ3NXYWl0U29jOworCQkJCWJyZWFrOworCisJCQkJLy8gRExMX0NUOQorCQkJY2FzZSBrRXBsTm10RXZlbnREbGxDZVNvYzoKKwkJCQkvLyByZXBvcnQgRExMX0NFVl9MT1NTX1NPQQorCQkJCURsbEV2ZW50Lm1fdWxEbGxFcnJvckV2ZW50cyB8PQorCQkJCSAgICBFUExfRExMX0VSUl9DTl9MT1NTX1NPQTsKKworCQkJCS8vIGVudGVyIERMTF9DU19XQUlUX1BSRVEKKwkJCQlFcGxEbGxrSW5zdGFuY2VfZy5tX0RsbFN0YXRlID0KKwkJCQkgICAga0VwbERsbENzV2FpdFByZXE7CisJCQkJYnJlYWs7CisKKwkJCQkvLyBETExfQ1QxMAorCQkJY2FzZSBrRXBsTm10RXZlbnREbGxDZUFzbmQ6CisJCQkJLy8gcmVwb3J0IERMTF9DRVZfTE9TU19TT0EKKwkJCQlEbGxFdmVudC5tX3VsRGxsRXJyb3JFdmVudHMgfD0KKwkJCQkgICAgRVBMX0RMTF9FUlJfQ05fTE9TU19TT0E7CisKKwkJCWNhc2Uga0VwbE5tdEV2ZW50RGxsQ2VQcmVzOgorCQkJZGVmYXVsdDoKKwkJCQkvLyByZW1haW4gaW4gdGhpcyBzdGF0ZQorCQkJCWJyZWFrOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBrRXBsRGxsR3NJbml0OgorCQkJLy8gZW50ZXIgRExMX0NTX1dBSVRfUFJFUQorCQkJRXBsRGxsa0luc3RhbmNlX2cubV9EbGxTdGF0ZSA9IGtFcGxEbGxDc1dhaXRQcmVxOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCisJY2FzZSBrRXBsTm10Q3NTdG9wcGVkOgorCQkvLyBmdWxsIEVQTCBjeWNsZSBpcyBhY3RpdmUsIGJ1dCB3aXRob3V0IFBSZXEvUFJlcworCisJCXN3aXRjaCAoRXBsRGxsa0luc3RhbmNlX2cubV9EbGxTdGF0ZSkgeworCQljYXNlIGtFcGxEbGxDc1dhaXRQcmVxOgorCQkJc3dpdGNoIChObXRFdmVudF9wKSB7CisJCQkJLy8gRExMX0NUMgorCQkJY2FzZSBrRXBsTm10RXZlbnREbGxDZVByZXE6CisJCQkJLy8gZW50ZXIgRExMX0NTX1dBSVRfU09BCisJCQkJRXBsRGxsa0luc3RhbmNlX2cubV9EbGxTdGF0ZSA9IGtFcGxEbGxDc1dhaXRTb2E7CisJCQkJYnJlYWs7CisKKwkJCQkvLyBETExfQ1Q4CisJCQljYXNlIGtFcGxObXRFdmVudERsbENlRnJhbWVUaW1lb3V0OgorCQkJCS8vIHJlcG9ydCBETExfQ0VWX0xPU1NfU09DIGFuZCBETExfQ0VWX0xPU1NfU09BCisJCQkJRGxsRXZlbnQubV91bERsbEVycm9yRXZlbnRzIHw9CisJCQkJICAgIEVQTF9ETExfRVJSX0NOX0xPU1NfU09BIHwKKwkJCQkgICAgRVBMX0RMTF9FUlJfQ05fTE9TU19TT0M7CisKKwkJCWNhc2Uga0VwbE5tdEV2ZW50RGxsQ2VTb2E6CisJCQkJLy8gTk1UX0NTX1NUT1BQRUQgYWN0aXZlCisJCQkJLy8gaXQgaXMgT2sgaWYgbm8gUFJlcSB3YXMgcmVjZWl2ZWQKKworCQkJCS8vIGVudGVyIERMTF9DU19XQUlUX1NPQworCQkJCUVwbERsbGtJbnN0YW5jZV9nLm1fRGxsU3RhdGUgPSBrRXBsRGxsQ3NXYWl0U29jOworCQkJCWJyZWFrOworCisJCQkJLy8gRExMX0NUNworCQkJY2FzZSBrRXBsTm10RXZlbnREbGxDZVNvYzoKKwkJCWNhc2Uga0VwbE5tdEV2ZW50RGxsQ2VBc25kOgorCQkJCS8vIHJlcG9ydCBETExfQ0VWX0xPU1NfU09BCisJCQkJRGxsRXZlbnQubV91bERsbEVycm9yRXZlbnRzIHw9CisJCQkJICAgIEVQTF9ETExfRVJSX0NOX0xPU1NfU09BOworCisJCQljYXNlIGtFcGxObXRFdmVudERsbENlUHJlczoKKwkJCWRlZmF1bHQ6CisJCQkJLy8gcmVtYWluIGluIHRoaXMgc3RhdGUKKwkJCQlicmVhazsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2Uga0VwbERsbENzV2FpdFNvYzoKKwkJCXN3aXRjaCAoTm10RXZlbnRfcCkgeworCQkJCS8vIERMTF9DVDEKKwkJCWNhc2Uga0VwbE5tdEV2ZW50RGxsQ2VTb2M6CisJCQkJLy8gc3RhcnQgb2YgY3ljbGUgYW5kIGlzb2Nocm9ub3VzIHBoYXNlCisJCQkJLy8gZW50ZXIgRExMX0NTX1dBSVRfU09BCisJCQkJRXBsRGxsa0luc3RhbmNlX2cubV9EbGxTdGF0ZSA9IGtFcGxEbGxDc1dhaXRTb2E7CisJCQkJYnJlYWs7CisKKwkJCQkvLyBETExfQ1Q0CisvLyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2Uga0VwbE5tdEV2ZW50RGxsQ2VQcmVzOgorCQkJY2FzZSBrRXBsTm10RXZlbnREbGxDZVByZXE6CisJCQljYXNlIGtFcGxObXRFdmVudERsbENlU29hOgorCQkJY2FzZSBrRXBsTm10RXZlbnREbGxDZUZyYW1lVGltZW91dDoKKwkJCQkvLyByZXBvcnQgRExMX0NFVl9MT1NTX1NPQworCQkJCURsbEV2ZW50Lm1fdWxEbGxFcnJvckV2ZW50cyB8PQorCQkJCSAgICBFUExfRExMX0VSUl9DTl9MT1NTX1NPQzsKKworCQkJY2FzZSBrRXBsTm10RXZlbnREbGxDZUFzbmQ6CisJCQlkZWZhdWx0OgorCQkJCS8vIHJlbWFpbiBpbiB0aGlzIHN0YXRlCisJCQkJYnJlYWs7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIGtFcGxEbGxDc1dhaXRTb2E6CisJCQlzd2l0Y2ggKE5tdEV2ZW50X3ApIHsKKwkJCQkvLyBETExfQ1QzCisJCQljYXNlIGtFcGxObXRFdmVudERsbENlRnJhbWVUaW1lb3V0OgorCQkJCS8vIHJlcG9ydCBETExfQ0VWX0xPU1NfU09DIGFuZCBETExfQ0VWX0xPU1NfU09BCisJCQkJRGxsRXZlbnQubV91bERsbEVycm9yRXZlbnRzIHw9CisJCQkJICAgIEVQTF9ETExfRVJSX0NOX0xPU1NfU09BIHwKKwkJCQkgICAgRVBMX0RMTF9FUlJfQ05fTE9TU19TT0M7CisKKwkJCWNhc2Uga0VwbE5tdEV2ZW50RGxsQ2VTb2E6CisJCQkJLy8gZW50ZXIgRExMX0NTX1dBSVRfU09DCisJCQkJRXBsRGxsa0luc3RhbmNlX2cubV9EbGxTdGF0ZSA9IGtFcGxEbGxDc1dhaXRTb2M7CisJCQkJYnJlYWs7CisKKwkJCQkvLyBETExfQ1Q5CisJCQljYXNlIGtFcGxObXRFdmVudERsbENlU29jOgorCQkJCS8vIHJlcG9ydCBETExfQ0VWX0xPU1NfU09BCisJCQkJRGxsRXZlbnQubV91bERsbEVycm9yRXZlbnRzIHw9CisJCQkJICAgIEVQTF9ETExfRVJSX0NOX0xPU1NfU09BOworCQkJCS8vIHJlbWFpbiBpbiBETExfQ1NfV0FJVF9TT0EKKwkJCQlicmVhazsKKworCQkJCS8vIERMTF9DVDEwCisJCQljYXNlIGtFcGxObXRFdmVudERsbENlQXNuZDoKKwkJCQkvLyByZXBvcnQgRExMX0NFVl9MT1NTX1NPQQorCQkJCURsbEV2ZW50Lm1fdWxEbGxFcnJvckV2ZW50cyB8PQorCQkJCSAgICBFUExfRExMX0VSUl9DTl9MT1NTX1NPQTsKKworCQkJY2FzZSBrRXBsTm10RXZlbnREbGxDZVByZXE6CisJCQkJLy8gTk1UX0NTX1NUT1BQRUQgYWN0aXZlIGFuZCB3ZSBkbyBub3QgZXhwZWN0IGFueSBQUmVxCisJCQkJLy8gc28ganVzdCBpZ25vcmUgaXQKKwkJCWNhc2Uga0VwbE5tdEV2ZW50RGxsQ2VQcmVzOgorCQkJZGVmYXVsdDoKKwkJCQkvLyByZW1haW4gaW4gdGhpcyBzdGF0ZQorCQkJCWJyZWFrOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBrRXBsRGxsR3NJbml0OgorCQlkZWZhdWx0OgorCQkJLy8gZW50ZXIgRExMX0NTX1dBSVRfUFJFUQorCQkJRXBsRGxsa0luc3RhbmNlX2cubV9EbGxTdGF0ZSA9IGtFcGxEbGxDc1dhaXRTb2E7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKworI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UX01OKSkgIT0gMCkKKwljYXNlIGtFcGxObXRNc05vdEFjdGl2ZToKKwljYXNlIGtFcGxObXRNc0Jhc2ljRXRoZXJuZXQ6CisJCWJyZWFrOworCisJY2FzZSBrRXBsTm10TXNQcmVPcGVyYXRpb25hbDE6CisJCS8vIHJlZHVjZWQgRVBMIGN5Y2xlIGlzIGFjdGl2ZQorCQlpZiAoRXBsRGxsa0luc3RhbmNlX2cubV9EbGxTdGF0ZSAhPSBrRXBsRGxsTXNOb25DeWNsaWMpIHsJLy8gc3RvcCBjeWNsZSB0aW1lcgorI2lmIEVQTF9USU1FUl9VU0VfSElHSFJFUyAhPSBGQUxTRQorCQkJUmV0ID0KKwkJCSAgICBFcGxUaW1lckhpZ2hSZXNrRGVsZXRlVGltZXIoJkVwbERsbGtJbnN0YW5jZV9nLgorCQkJCQkJCW1fVGltZXJIZGxDeWNsZSk7CisjZW5kaWYKKwkJCUVwbERsbGtJbnN0YW5jZV9nLm1fRGxsU3RhdGUgPSBrRXBsRGxsTXNOb25DeWNsaWM7CisKKwkJCS8vIHN0b3AgZnVydGhlciBwcm9jZXNzaW5nLAorCQkJLy8gYmVjYXVzZSBpdCB3aWxsIGJlIHJlc3RhcnRlZCBieSBOTVQgTU4gbW9kdWxlCisJCQlicmVhazsKKwkJfQorCisJCXN3aXRjaCAoTm10RXZlbnRfcCkgeworCQljYXNlIGtFcGxObXRFdmVudERsbE1lU29jVHJpZzoKKwkJY2FzZSBrRXBsTm10RXZlbnREbGxDZUFzbmQ6CisJCQl7CS8vIGJlY2F1c2Ugb2YgcmVkdWNlZCBFUEwgY3ljbGUgU29BIHNoYWxsIGJlIHRyaWdnZXJlZCwgbm90IFNvQworCQkJCXRFcGxEbGxTdGF0ZSBEdW1teURsbFN0YXRlOworCisJCQkJUmV0ID0KKwkJCQkgICAgRXBsRGxsa0FzeW5jRnJhbWVOb3RSZWNlaXZlZAorCQkJCSAgICAoRXBsRGxsa0luc3RhbmNlX2cubV9MYXN0UmVxU2VydmljZUlkLAorCQkJCSAgICAgRXBsRGxsa0luc3RhbmNlX2cubV91aUxhc3RUYXJnZXROb2RlSWQpOworCisJCQkJLy8gZ28gYWhlYWQgYW5kIHNlbmQgU29BCisJCQkJUmV0ID0gRXBsRGxsa01uU2VuZFNvYShObXRTdGF0ZV9wLAorCQkJCQkJICAgICAgICZEdW1teURsbFN0YXRlLAorCQkJCQkJICAgICAgIChFcGxEbGxrSW5zdGFuY2VfZy4KKwkJCQkJCQltX3VpQ3ljbGVDb3VudCA+PQorCQkJCQkJCUVQTF9DX0RMTF9QUkVPUDFfU1RBUlRfQ1lDTEVTKSk7CisJCQkJLy8gaW5jcmVtZW50IGN5Y2xlIGNvdW50ZXIgdG8gZGV0ZWN0IGlmIEVQTF9DX0RMTF9QUkVPUDFfU1RBUlRfQ1lDTEVTIGVtcHR5IGN5Y2xlcyBhcmUgZWxhcHNlZAorCQkJCUVwbERsbGtJbnN0YW5jZV9nLm1fdWlDeWNsZUNvdW50Kys7CisKKwkJCQkvLyByZXByb2dyYW0gdGltZXIKKyNpZiBFUExfVElNRVJfVVNFX0hJR0hSRVMgIT0gRkFMU0UKKwkJCQlpZiAoRXBsRGxsa0luc3RhbmNlX2cubV9EbGxDb25maWdQYXJhbS4KKwkJCQkgICAgbV9kd0FzeW5jU2xvdFRpbWVvdXQgIT0gMCkgeworCQkJCQlSZXQgPQorCQkJCQkgICAgRXBsVGltZXJIaWdoUmVza01vZGlmeVRpbWVyTnMKKwkJCQkJICAgICgmRXBsRGxsa0luc3RhbmNlX2cubV9UaW1lckhkbEN5Y2xlLAorCQkJCQkgICAgIEVwbERsbGtJbnN0YW5jZV9nLm1fRGxsQ29uZmlnUGFyYW0uCisJCQkJCSAgICAgbV9kd0FzeW5jU2xvdFRpbWVvdXQsCisJCQkJCSAgICAgRXBsRGxsa0NiTW5UaW1lckN5Y2xlLCAwTCwgRkFMU0UpOworCQkJCX0KKyNlbmRpZgorCQkJCWJyZWFrOworCQkJfQorCisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKworCWNhc2Uga0VwbE5tdE1zUHJlT3BlcmF0aW9uYWwyOgorCWNhc2Uga0VwbE5tdE1zUmVhZHlUb09wZXJhdGU6CisJY2FzZSBrRXBsTm10TXNPcGVyYXRpb25hbDoKKwkJLy8gZnVsbCBFUEwgY3ljbGUgaXMgYWN0aXZlCisJCXN3aXRjaCAoTm10RXZlbnRfcCkgeworCQljYXNlIGtFcGxObXRFdmVudERsbE1lU29jVHJpZzoKKwkJCXsKKwkJCQkvLyB1cGRhdGUgY3ljbGUgY291bnRlcgorCQkJCWlmIChFcGxEbGxrSW5zdGFuY2VfZy5tX0RsbENvbmZpZ1BhcmFtLm1fdWlNdWx0aXBsQ3ljbGVDbnQgPiAwKSB7CS8vIG11bHRpcGxleGVkIGN5Y2xlIGFjdGl2ZQorCQkJCQlFcGxEbGxrSW5zdGFuY2VfZy5tX3VpQ3ljbGVDb3VudCA9CisJCQkJCSAgICAoRXBsRGxsa0luc3RhbmNlX2cubV91aUN5Y2xlQ291bnQgKworCQkJCQkgICAgIDEpICUKKwkJCQkJICAgIEVwbERsbGtJbnN0YW5jZV9nLm1fRGxsQ29uZmlnUGFyYW0uCisJCQkJCSAgICBtX3VpTXVsdGlwbEN5Y2xlQ250OworCQkJCQkvLyAkJCQgY2hlY2sgbXVsdGlwbGV4ZWQgY3ljbGUgcmVzdGFydAorCQkJCQkvLyAgICAgLT4gdG9nZ2xlIE1DIGZsYWcKKwkJCQkJLy8gICAgIC0+IGNoYW5nZSBub2RlIGxpbmtlZCBsaXN0CisJCQkJfSBlbHNlIHsJLy8gbm9uLW11bHRpcGxleGVkIGN5Y2xlIGFjdGl2ZQorCQkJCQkvLyBzdGFydCB3aXRoIGZpcnN0IG5vZGUgaW4gaXNvY2hyb25vdXMgcGhhc2UKKwkJCQkJRXBsRGxsa0luc3RhbmNlX2cubV9wQ3VyTm9kZUluZm8gPSBOVUxMOworCQkJCX0KKworCQkJCXN3aXRjaCAoRXBsRGxsa0luc3RhbmNlX2cubV9EbGxTdGF0ZSkgeworCQkJCWNhc2Uga0VwbERsbE1zTm9uQ3ljbGljOgorCQkJCQl7CS8vIHN0YXJ0IGNvbnRpbnVvdXMgY3ljbGUgdGltZXIKKyNpZiBFUExfVElNRVJfVVNFX0hJR0hSRVMgIT0gRkFMU0UKKwkJCQkJCVJldCA9CisJCQkJCQkgICAgRXBsVGltZXJIaWdoUmVza01vZGlmeVRpbWVyTnMKKwkJCQkJCSAgICAoJkVwbERsbGtJbnN0YW5jZV9nLgorCQkJCQkJICAgICBtX1RpbWVySGRsQ3ljbGUsCisJCQkJCQkgICAgIEVwbERsbGtJbnN0YW5jZV9nLgorCQkJCQkJICAgICBtX3VsbEZyYW1lVGltZW91dCwKKwkJCQkJCSAgICAgRXBsRGxsa0NiTW5UaW1lckN5Y2xlLCAwTCwKKwkJCQkJCSAgICAgVFJVRSk7CisjZW5kaWYKKwkJCQkJCS8vIGNvbnRpbnVlIHdpdGggc2VuZGluZyBTb0MKKwkJCQkJfQorCisJCQkJY2FzZSBrRXBsRGxsTXNXYWl0QXNuZDoKKwkJCQljYXNlIGtFcGxEbGxNc1dhaXRTb2NUcmlnOgorCQkJCQl7CS8vIGlmIG1fTGFzdFJlcVNlcnZpY2VJZCBpcyBzdGlsbCB2YWxpZCwKKwkJCQkJCS8vIFNvQSB3YXMgbm90IGNvcnJlY3RseSBhbnN3ZXJlZAorCQkJCQkJLy8gYW5kIHVzZXIgcGFydCBoYXMgdG8gYmUgaW5mb3JtZWQKKwkJCQkJCVJldCA9CisJCQkJCQkgICAgRXBsRGxsa0FzeW5jRnJhbWVOb3RSZWNlaXZlZAorCQkJCQkJICAgIChFcGxEbGxrSW5zdGFuY2VfZy4KKwkJCQkJCSAgICAgbV9MYXN0UmVxU2VydmljZUlkLAorCQkJCQkJICAgICBFcGxEbGxrSW5zdGFuY2VfZy4KKwkJCQkJCSAgICAgbV91aUxhc3RUYXJnZXROb2RlSWQpOworCisJCQkJCQkvLyBzZW5kIFNvQworCQkJCQkJUmV0ID0gRXBsRGxsa01uU2VuZFNvYygpOworCisJCQkJCQkvLyBuZXcgRExMIHN0YXRlCisJCQkJCQlFcGxEbGxrSW5zdGFuY2VfZy5tX0RsbFN0YXRlID0KKwkJCQkJCSAgICBrRXBsRGxsTXNXYWl0UHJlcVRyaWc7CisKKwkJCQkJCS8vIHN0YXJ0IFdhaXRTb0NQUmVxIFRpbWVyCisjaWYgRVBMX1RJTUVSX1VTRV9ISUdIUkVTICE9IEZBTFNFCisJCQkJCQlSZXQgPQorCQkJCQkJICAgIEVwbFRpbWVySGlnaFJlc2tNb2RpZnlUaW1lck5zCisJCQkJCQkgICAgKCZFcGxEbGxrSW5zdGFuY2VfZy4KKwkJCQkJCSAgICAgbV9UaW1lckhkbFJlc3BvbnNlLAorCQkJCQkJICAgICBFcGxEbGxrSW5zdGFuY2VfZy4KKwkJCQkJCSAgICAgbV9EbGxDb25maWdQYXJhbS4KKwkJCQkJCSAgICAgbV9kd1dhaXRTb2NQcmVxLAorCQkJCQkJICAgICBFcGxEbGxrQ2JNblRpbWVyUmVzcG9uc2UsCisJCQkJCQkgICAgIDBMLCBGQUxTRSk7CisjZW5kaWYKKwkJCQkJCWJyZWFrOworCQkJCQl9CisKKwkJCQlkZWZhdWx0OgorCQkJCQl7CS8vIHdyb25nIERMTCBzdGF0ZSAvIGN5Y2xlIHRpbWUgZXhjZWVkZWQKKwkJCQkJCURsbEV2ZW50Lm1fdWxEbGxFcnJvckV2ZW50cyB8PQorCQkJCQkJICAgIEVQTF9ETExfRVJSX01OX0NZQ1RJTUVFWENFRUQ7CisJCQkJCQlFcGxEbGxrSW5zdGFuY2VfZy5tX0RsbFN0YXRlID0KKwkJCQkJCSAgICBrRXBsRGxsTXNXYWl0U29jVHJpZzsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCisJCQkJYnJlYWs7CisJCQl9CisKKwkJY2FzZSBrRXBsTm10RXZlbnREbGxNZVByZXNUaW1lb3V0OgorCQkJeworCisJCQkJc3dpdGNoIChFcGxEbGxrSW5zdGFuY2VfZy5tX0RsbFN0YXRlKSB7CisJCQkJY2FzZSBrRXBsRGxsTXNXYWl0UHJlczoKKwkJCQkJewkvLyBQUmVzIG5vdCByZWNlaXZlZAorCisJCQkJCQlpZiAoRXBsRGxsa0luc3RhbmNlX2cubV9wQ3VyTm9kZUluZm8tPm1fZlNvZnREZWxldGUgPT0gRkFMU0UpIHsJLy8gbm9ybWFsIGlzb2Nocm9ub3VzIENOCisJCQkJCQkJRGxsRXZlbnQuCisJCQkJCQkJICAgIG1fdWxEbGxFcnJvckV2ZW50cworCQkJCQkJCSAgICB8PQorCQkJCQkJCSAgICBFUExfRExMX0VSUl9NTl9DTl9MT1NTX1BSRVM7CisJCQkJCQkJRGxsRXZlbnQubV91aU5vZGVJZCA9CisJCQkJCQkJICAgIEVwbERsbGtJbnN0YW5jZV9nLgorCQkJCQkJCSAgICBtX3BDdXJOb2RlSW5mby0+CisJCQkJCQkJICAgIG1fdWlOb2RlSWQ7CisJCQkJCQl9IGVsc2UgewkvLyBDTiBzaGFsbCBiZSBkZWxldGVkIHNvZnRseQorCQkJCQkJCUV2ZW50Lm1fRXZlbnRTaW5rID0KKwkJCQkJCQkgICAga0VwbEV2ZW50U2lua0RsbGtDYWw7CisJCQkJCQkJRXZlbnQubV9FdmVudFR5cGUgPQorCQkJCQkJCSAgICBrRXBsRXZlbnRUeXBlRGxsa1NvZnREZWxOb2RlOworCQkJCQkJCS8vICQkJCBkLmsuIHNldCBFdmVudC5tX05ldFRpbWUgdG8gY3VycmVudCB0aW1lCisJCQkJCQkJRXZlbnQubV91aVNpemUgPQorCQkJCQkJCSAgICBzaXplb2YodW5zaWduZWQKKwkJCQkJCQkJICAgaW50KTsKKwkJCQkJCQlFdmVudC5tX3BBcmcgPQorCQkJCQkJCSAgICAmRXBsRGxsa0luc3RhbmNlX2cuCisJCQkJCQkJICAgIG1fcEN1ck5vZGVJbmZvLT4KKwkJCQkJCQkgICAgbV91aU5vZGVJZDsKKwkJCQkJCQlSZXQgPQorCQkJCQkJCSAgICBFcGxFdmVudGtQb3N0CisJCQkJCQkJICAgICgmRXZlbnQpOworCQkJCQkJfQorCisJCQkJCQkvLyBjb250aW51ZSB3aXRoIHNlbmRpbmcgbmV4dCBQUmVxCisJCQkJCX0KKworCQkJCWNhc2Uga0VwbERsbE1zV2FpdFByZXFUcmlnOgorCQkJCQl7CisJCQkJCQkvLyBzZW5kIG5leHQgUFJlcQorCQkJCQkJUmV0ID0KKwkJCQkJCSAgICBFcGxEbGxrTW5TZW5kUHJlcQorCQkJCQkJICAgIChObXRTdGF0ZV9wLAorCQkJCQkJICAgICAmRXBsRGxsa0luc3RhbmNlX2cuCisJCQkJCQkgICAgIG1fRGxsU3RhdGUpOworCisJCQkJCQlicmVhazsKKwkJCQkJfQorCisJCQkJZGVmYXVsdDoKKwkJCQkJewkvLyB3cm9uZyBETEwgc3RhdGUKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCisJCQkJYnJlYWs7CisJCQl9CisKKwkJY2FzZSBrRXBsTm10RXZlbnREbGxDZVByZXM6CisJCQl7CisKKwkJCQlzd2l0Y2ggKEVwbERsbGtJbnN0YW5jZV9nLm1fRGxsU3RhdGUpIHsKKwkJCQljYXNlIGtFcGxEbGxNc1dhaXRQcmVzOgorCQkJCQl7CS8vIFBSZXMgcmVjZWl2ZWQKKwkJCQkJCS8vIHNlbmQgbmV4dCBQUmVxCisJCQkJCQlSZXQgPQorCQkJCQkJICAgIEVwbERsbGtNblNlbmRQcmVxCisJCQkJCQkgICAgKE5tdFN0YXRlX3AsCisJCQkJCQkgICAgICZFcGxEbGxrSW5zdGFuY2VfZy4KKwkJCQkJCSAgICAgbV9EbGxTdGF0ZSk7CisKKwkJCQkJCWJyZWFrOworCQkJCQl9CisKKwkJCQlkZWZhdWx0OgorCQkJCQl7CS8vIHdyb25nIERMTCBzdGF0ZQorCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisKKwkJCQlicmVhazsKKwkJCX0KKworCQljYXNlIGtFcGxObXRFdmVudERsbE1lU29hVHJpZzoKKwkJCXsKKworCQkJCXN3aXRjaCAoRXBsRGxsa0luc3RhbmNlX2cubV9EbGxTdGF0ZSkgeworCQkJCWNhc2Uga0VwbERsbE1zV2FpdFNvYVRyaWc6CisJCQkJCXsJLy8gTU4gUFJlcyBzZW50CisJCQkJCQkvLyBzZW5kIFNvQQorCQkJCQkJUmV0ID0KKwkJCQkJCSAgICBFcGxEbGxrTW5TZW5kU29hKE5tdFN0YXRlX3AsCisJCQkJCQkJCSAgICAgJkVwbERsbGtJbnN0YW5jZV9nLgorCQkJCQkJCQkgICAgIG1fRGxsU3RhdGUsCisJCQkJCQkJCSAgICAgVFJVRSk7CisKKwkJCQkJCWJyZWFrOworCQkJCQl9CisKKwkJCQlkZWZhdWx0OgorCQkJCQl7CS8vIHdyb25nIERMTCBzdGF0ZQorCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisKKwkJCQlicmVhazsKKwkJCX0KKworCQljYXNlIGtFcGxObXRFdmVudERsbENlQXNuZDoKKwkJCXsJLy8gQVNuZCBoYXMgYmVlbiByZWNlaXZlZCwgYnV0IGl0IG1heSBiZSBub3QgdGhlIHJlcXVlc3RlZCBvbmUKKy8qCisgICAgICAgICAgICAgICAgICAgIC8vIHJlcG9ydCBpZiBTb0Egd2FzIGNvcnJlY3RseSBhbnN3ZXJlZAorICAgICAgICAgICAgICAgICAgICBSZXQgPSBFcGxEbGxrQXN5bmNGcmFtZU5vdFJlY2VpdmVkKEVwbERsbGtJbnN0YW5jZV9nLm1fTGFzdFJlcVNlcnZpY2VJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFcGxEbGxrSW5zdGFuY2VfZy5tX3VpTGFzdFRhcmdldE5vZGVJZCk7CisqLworCQkJCWlmIChFcGxEbGxrSW5zdGFuY2VfZy5tX0RsbFN0YXRlID09CisJCQkJICAgIGtFcGxEbGxNc1dhaXRBc25kKSB7CisJCQkJCUVwbERsbGtJbnN0YW5jZV9nLm1fRGxsU3RhdGUgPQorCQkJCQkgICAga0VwbERsbE1zV2FpdFNvY1RyaWc7CisJCQkJfQorCQkJCWJyZWFrOworCQkJfQorCisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKyNlbmRpZiAvLygoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UX01OKSkgIT0gMCkKKworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCWlmIChEbGxFdmVudC5tX3VsRGxsRXJyb3JFdmVudHMgIT0gMCkgewkvLyBlcnJvciBldmVudCBzZXQgLT4gcG9zdCBpdCB0byBlcnJvciBoYW5kbGVyCisJCUV2ZW50Lm1fRXZlbnRTaW5rID0ga0VwbEV2ZW50U2lua0Vycms7CisJCUV2ZW50Lm1fRXZlbnRUeXBlID0ga0VwbEV2ZW50VHlwZURsbEVycm9yOworCQkvLyAkJCQgZC5rLiBzZXQgRXZlbnQubV9OZXRUaW1lIHRvIGN1cnJlbnQgdGltZQorCQlFdmVudC5tX3VpU2l6ZSA9IHNpemVvZihEbGxFdmVudCk7CisJCUV2ZW50Lm1fcEFyZyA9ICZEbGxFdmVudDsKKwkJUmV0ID0gRXBsRXZlbnRrUG9zdCgmRXZlbnQpOworCX0KKworCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbERsbGtDYkZyYW1lUmVjZWl2ZWQoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBjYWxsZWQgZnJvbSBFZHJ2SW50ZXJydXB0SGFuZGxlcigpCisvLworLy8gUGFyYW1ldGVyczogIHBSeEJ1ZmZlcl9wICAgICAgICAgICAgID0gcmVjZWl2ZSBidWZmZXIgc3RydWN0dXJlCisvLworLy8gUmV0dXJuczogICAgIChub25lKQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZCBFcGxEbGxrQ2JGcmFtZVJlY2VpdmVkKHRFZHJ2UnhCdWZmZXIgKiBwUnhCdWZmZXJfcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCXRFcGxObXRTdGF0ZSBObXRTdGF0ZTsKKwl0RXBsTm10RXZlbnQgTm10RXZlbnQgPSBrRXBsTm10RXZlbnROb0V2ZW50OworCXRFcGxFdmVudCBFdmVudDsKKwl0RXBsRnJhbWUgKnBGcmFtZTsKKwl0RXBsRnJhbWUgKnBUeEZyYW1lOworCXRFZHJ2VHhCdWZmZXIgKnBUeEJ1ZmZlciA9IE5VTEw7CisJdEVwbEZyYW1lSW5mbyBGcmFtZUluZm87CisJdEVwbE1zZ1R5cGUgTXNnVHlwZTsKKwl0RXBsRGxsUmVxU2VydmljZUlkIFJlcVNlcnZpY2VJZDsKKwl1bnNpZ25lZCBpbnQgdWlBc25kU2VydmljZUlkOworCXVuc2lnbmVkIGludCB1aU5vZGVJZDsKKwlCWVRFIGJGbGFnMTsKKworCUJFTkNITUFSS19NT0RfMDJfU0VUKDMpOworCU5tdFN0YXRlID0gRXBsTm10a0dldE5tdFN0YXRlKCk7CisKKwlpZiAoTm10U3RhdGUgPD0ga0VwbE5tdEdzUmVzZXRDb25maWd1cmF0aW9uKSB7CisJCWdvdG8gRXhpdDsKKwl9CisKKwlwRnJhbWUgPSAodEVwbEZyYW1lICopIHBSeEJ1ZmZlcl9wLT5tX3BiQnVmZmVyOworCisjaWYgRURSVl9FQVJMWV9SWF9JTlQgIT0gRkFMU0UKKwlzd2l0Y2ggKHBSeEJ1ZmZlcl9wLT5tX0J1ZmZlckluRnJhbWUpIHsKKwljYXNlIGtFZHJ2QnVmZmVyRmlyc3RJbkZyYW1lOgorCQl7CisJCQlNc2dUeXBlID0KKwkJCSAgICAodEVwbE1zZ1R5cGUpIEFtaUdldEJ5dGVGcm9tTGUoJnBGcmFtZS0+CisJCQkJCQkJICAgbV9sZV9iTWVzc2FnZVR5cGUpOworCQkJaWYgKE1zZ1R5cGUgPT0ga0VwbE1zZ1R5cGVQcmVxKSB7CisJCQkJaWYgKEVwbERsbGtJbnN0YW5jZV9nLm1fRGxsU3RhdGUgPT0ga0VwbERsbENzV2FpdFByZXEpIHsJLy8gUFJlcSBleHBlY3RlZCBhbmQgYWN0dWFsbHkgcmVjZWl2ZWQKKwkJCQkJLy8gZC5rLjogVGhlIGNvbmRpdGlvbiBhYm92ZSBpcyBzdWZmaWNlbnQsIGJlY2F1c2UgRVBMIGN5Y2xlIGlzIGFjdGl2ZQorCQkJCQkvLyAgICAgICBhbmQgbm8gbm9uLUVQTCBmcmFtZSBzaGFsbCBiZSByZWNlaXZlZCBpbiBpc29jaHJvbm91cyBwaGFzZS4KKwkJCQkJLy8gc3RhcnQgdHJhbnNtaXNzaW9uIFBSZXMKKwkJCQkJLy8gJCQkIFdoYXQgaWYgVHggYnVmZmVyIGlzIGludmFsaWQ/CisJCQkJCXBUeEJ1ZmZlciA9CisJCQkJCSAgICAmRXBsRGxsa0luc3RhbmNlX2cuCisJCQkJCSAgICBtX3BUeEJ1ZmZlcltFUExfRExMS19UWEZSQU1FX1BSRVNdOworI2lmIChFUExfRExMX1BSRVNfUkVBRFlfQUZURVJfU09BICE9IEZBTFNFKSB8fCAoRVBMX0RMTF9QUkVTX1JFQURZX0FGVEVSX1NPQyAhPSBGQUxTRSkKKwkJCQkJUmV0ID0gRWRydlR4TXNnU3RhcnQocFR4QnVmZmVyKTsKKyNlbHNlCisJCQkJCXBUeEZyYW1lID0KKwkJCQkJICAgICh0RXBsRnJhbWUgKikgcFR4QnVmZmVyLT5tX3BiQnVmZmVyOworCQkJCQkvLyB1cGRhdGUgZnJhbWUgKE5NVCBzdGF0ZSwgUkQsIFJTLCBQUiwgTVMsIEVOIGZsYWdzKQorCQkJCQlBbWlTZXRCeXRlVG9MZSgmcFR4RnJhbWUtPm1fRGF0YS5tX1ByZXMuCisJCQkJCQkgICAgICAgbV9sZV9iTm10U3RhdHVzLAorCQkJCQkJICAgICAgIChCWVRFKSBObXRTdGF0ZSk7CisJCQkJCUFtaVNldEJ5dGVUb0xlKCZwVHhGcmFtZS0+bV9EYXRhLm1fUHJlcy4KKwkJCQkJCSAgICAgICBtX2xlX2JGbGFnMiwKKwkJCQkJCSAgICAgICBFcGxEbGxrSW5zdGFuY2VfZy4KKwkJCQkJCSAgICAgICBtX2JGbGFnMik7CisJCQkJCWlmIChObXRTdGF0ZSAhPSBrRXBsTm10Q3NPcGVyYXRpb25hbCkgewkvLyBtYXJrIFBETyBhcyBpbnZhbGlkIGluIE5NVCBzdGF0ZSBPcAorCQkJCQkJLy8gJCQkIHJlc2V0IG9ubHkgUkQgZmxhZzsgc2V0IG90aGVyIGZsYWdzIGFwcHJvcHJpYXRlbHkKKwkJCQkJCUFtaVNldEJ5dGVUb0xlKCZwVHhGcmFtZS0+CisJCQkJCQkJICAgICAgIG1fRGF0YS5tX1ByZXMuCisJCQkJCQkJICAgICAgIG1fbGVfYkZsYWcxLCAwKTsKKwkJCQkJfQorCQkJCQkvLyAkJCQgbWFrZSBmdW5jdGlvbiB0aGF0IHVwZGF0ZXMgUHJlcywgU3RhdHVzUmVzCisJCQkJCS8vIHNlbmQgUFJlcyBmcmFtZQorCQkJCQlSZXQgPSBFZHJ2U2VuZFR4TXNnKHBUeEJ1ZmZlcik7CisjZW5kaWYKKwkJCQl9CisJCQl9CisJCQlnb3RvIEV4aXQ7CisJCX0KKworCWNhc2Uga0VkcnZCdWZmZXJNaWRkbGVJbkZyYW1lOgorCQl7CisJCQlnb3RvIEV4aXQ7CisJCX0KKworCWNhc2Uga0VkcnZCdWZmZXJMYXN0SW5GcmFtZToKKwkJeworCQkJYnJlYWs7CisJCX0KKwl9CisjZW5kaWYKKworCUZyYW1lSW5mby5tX3BGcmFtZSA9IHBGcmFtZTsKKwlGcmFtZUluZm8ubV91aUZyYW1lU2l6ZSA9IHBSeEJ1ZmZlcl9wLT5tX3VpUnhNc2dMZW47CisJRnJhbWVJbmZvLm1fTmV0VGltZS5tX2R3TmFub1NlYyA9IHBSeEJ1ZmZlcl9wLT5tX05ldFRpbWUubV9kd05hbm9TZWM7CisJRnJhbWVJbmZvLm1fTmV0VGltZS5tX2R3U2VjID0gcFJ4QnVmZmVyX3AtPm1fTmV0VGltZS5tX2R3U2VjOworCisJaWYgKEFtaUdldFdvcmRGcm9tQmUoJnBGcmFtZS0+bV9iZV93RXRoZXJUeXBlKSAhPSBFUExfQ19ETExfRVRIRVJUWVBFX0VQTCkgewkvLyBub24tRVBMIGZyYW1lCisJCS8vVFJBQ0UyKCJFcGxEbGxrQ2JGcmFtZVJlY2VpdmVkOiBwZm5DYkFzeW5jPTB4JXAgU3JjTUFDPTB4JWxseFxuIiwgRXBsRGxsa0luc3RhbmNlX2cubV9wZm5DYkFzeW5jLCBBbWlHZXRRd29yZDQ4RnJvbUJlKHBGcmFtZS0+bV9iZV9hYlNyY01hYykpOworCQlpZiAoRXBsRGxsa0luc3RhbmNlX2cubV9wZm5DYkFzeW5jICE9IE5VTEwpIHsJLy8gaGFuZGxlciBmb3IgYXN5bmMgZnJhbWVzIGlzIHJlZ2lzdGVyZWQKKwkJCUVwbERsbGtJbnN0YW5jZV9nLm1fcGZuQ2JBc3luYygmRnJhbWVJbmZvKTsKKwkJfQorCisJCWdvdG8gRXhpdDsKKwl9CisKKwlNc2dUeXBlID0gKHRFcGxNc2dUeXBlKSBBbWlHZXRCeXRlRnJvbUxlKCZwRnJhbWUtPm1fbGVfYk1lc3NhZ2VUeXBlKTsKKwlzd2l0Y2ggKE1zZ1R5cGUpIHsKKwljYXNlIGtFcGxNc2dUeXBlUHJlcToKKwkJeworCQkJLy8gUFJlcSBmcmFtZQorCQkJLy8gZC5rLjogKHdlIGFzc3VtZSB0aGF0IHRoaXMgUFJlcSBmcmFtZSBpcyBpbnRlbmRlZCBmb3IgdXMgYW5kIGRvbid0IGNoZWNrIERzdE5vZGVJZCkKKwkJCWlmIChBbWlHZXRCeXRlRnJvbUxlKCZwRnJhbWUtPm1fbGVfYkRzdE5vZGVJZCkgIT0gRXBsRGxsa0luc3RhbmNlX2cubV9EbGxDb25maWdQYXJhbS5tX3VpTm9kZUlkKSB7CS8vIHRoaXMgUFJlcSBpcyBub3QgaW50ZW5kZWQgZm9yIHVzCisJCQkJZ290byBFeGl0OworCQkJfQorCQkJTm10RXZlbnQgPSBrRXBsTm10RXZlbnREbGxDZVByZXE7CisKKwkJCWlmIChObXRTdGF0ZSA+PSBrRXBsTm10TXNOb3RBY3RpdmUpIHsJLy8gTU4gaXMgYWN0aXZlIC0+IHdyb25nIG1zZyB0eXBlCisJCQkJYnJlYWs7CisJCQl9CisjaWYgRURSVl9FQVJMWV9SWF9JTlQgPT0gRkFMU0UKKwkJCWlmIChObXRTdGF0ZSA+PSBrRXBsTm10Q3NQcmVPcGVyYXRpb25hbDIpIHsJLy8gcmVzcG9uZCB0byBhbmQgcHJvY2VzcyBQUmVxIGZyYW1lcyBvbmx5IGluIFByZU9wMiwgUmVhZHlUb09wIGFuZCBPcAorCQkJCS8vIERvZXMgUFJlcyBleGlzdD8KKwkJCQlwVHhCdWZmZXIgPQorCQkJCSAgICAmRXBsRGxsa0luc3RhbmNlX2cuCisJCQkJICAgIG1fcFR4QnVmZmVyW0VQTF9ETExLX1RYRlJBTUVfUFJFU107CisJCQkJaWYgKHBUeEJ1ZmZlci0+bV9wYkJ1ZmZlciAhPSBOVUxMKSB7CS8vIFBSZXMgZG9lcyBleGlzdAorI2lmIChFUExfRExMX1BSRVNfUkVBRFlfQUZURVJfU09BICE9IEZBTFNFKSB8fCAoRVBMX0RMTF9QUkVTX1JFQURZX0FGVEVSX1NPQyAhPSBGQUxTRSkKKwkJCQkJRWRydlR4TXNnU3RhcnQocFR4QnVmZmVyKTsKKyNlbHNlCisJCQkJCXBUeEZyYW1lID0KKwkJCQkJICAgICh0RXBsRnJhbWUgKikgcFR4QnVmZmVyLT5tX3BiQnVmZmVyOworCQkJCQkvLyB1cGRhdGUgZnJhbWUgKE5NVCBzdGF0ZSwgUkQsIFJTLCBQUiwgTVMsIEVOIGZsYWdzKQorCQkJCQlBbWlTZXRCeXRlVG9MZSgmcFR4RnJhbWUtPm1fRGF0YS5tX1ByZXMuCisJCQkJCQkgICAgICAgbV9sZV9iTm10U3RhdHVzLAorCQkJCQkJICAgICAgIChCWVRFKSBObXRTdGF0ZSk7CisJCQkJCUFtaVNldEJ5dGVUb0xlKCZwVHhGcmFtZS0+bV9EYXRhLm1fUHJlcy4KKwkJCQkJCSAgICAgICBtX2xlX2JGbGFnMiwKKwkJCQkJCSAgICAgICBFcGxEbGxrSW5zdGFuY2VfZy4KKwkJCQkJCSAgICAgICBtX2JGbGFnMik7CisJCQkJCWJGbGFnMSA9CisJCQkJCSAgICBBbWlHZXRCeXRlRnJvbUxlKCZwRnJhbWUtPm1fRGF0YS4KKwkJCQkJCQkgICAgIG1fUHJlcS4KKwkJCQkJCQkgICAgIG1fbGVfYkZsYWcxKTsKKwkJCQkJLy8gc2F2ZSBFQSBmbGFnCisJCQkJCUVwbERsbGtJbnN0YW5jZV9nLm1fYk1uRmxhZzEgPQorCQkJCQkgICAgKEVwbERsbGtJbnN0YW5jZV9nLgorCQkJCQkgICAgIG1fYk1uRmxhZzEgJiB+RVBMX0ZSQU1FX0ZMQUcxX0VBKQorCQkJCQkgICAgfCAoYkZsYWcxICYgRVBMX0ZSQU1FX0ZMQUcxX0VBKTsKKwkJCQkJLy8gcHJlc2VydmUgTVMgZmxhZworCQkJCQliRmxhZzEgJj0gRVBMX0ZSQU1FX0ZMQUcxX01TOworCQkJCQkvLyBhZGQgRU4gZmxhZyBmcm9tIEVycm9yIHNpZ25hbGluZyBtb2R1bGUKKwkJCQkJYkZsYWcxIHw9CisJCQkJCSAgICBFcGxEbGxrSW5zdGFuY2VfZy4KKwkJCQkJICAgIG1fYkZsYWcxICYgRVBMX0ZSQU1FX0ZMQUcxX0VOOworCQkJCQlpZiAoTm10U3RhdGUgIT0ga0VwbE5tdENzT3BlcmF0aW9uYWwpIHsJLy8gbWFyayBQRE8gYXMgaW52YWxpZCBpbiBOTVQgc3RhdGUgT3AKKwkJCQkJCS8vIHJlc2V0IG9ubHkgUkQgZmxhZworCQkJCQkJQW1pU2V0Qnl0ZVRvTGUoJnBUeEZyYW1lLT4KKwkJCQkJCQkgICAgICAgbV9EYXRhLm1fUHJlcy4KKwkJCQkJCQkgICAgICAgbV9sZV9iRmxhZzEsCisJCQkJCQkJICAgICAgIGJGbGFnMSk7CisJCQkJCX0gZWxzZSB7CS8vIGxlYXZlIFJEIGZsYWcgdW50b3VjaGVkCisJCQkJCQlBbWlTZXRCeXRlVG9MZSgmcFR4RnJhbWUtPgorCQkJCQkJCSAgICAgICBtX0RhdGEubV9QcmVzLgorCQkJCQkJCSAgICAgICBtX2xlX2JGbGFnMSwKKwkJCQkJCQkgICAgICAgKEFtaUdldEJ5dGVGcm9tTGUKKwkJCQkJCQkJKCZwVHhGcmFtZS0+CisJCQkJCQkJCSBtX0RhdGEubV9QcmVzLgorCQkJCQkJCQkgbV9sZV9iRmxhZzEpICYKKwkJCQkJCQkJRVBMX0ZSQU1FX0ZMQUcxX1JEKQorCQkJCQkJCSAgICAgICB8IGJGbGFnMSk7CisJCQkJCX0KKwkJCQkJLy8gJCQkIHVwZGF0ZSBFUExfRExMX1BSRVNfUkVBRFlfQUZURVJfKiBjb2RlCisJCQkJCS8vIHNlbmQgUFJlcyBmcmFtZQorCQkJCQlSZXQgPSBFZHJ2U2VuZFR4TXNnKHBUeEJ1ZmZlcik7CisJCQkJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCQkJCWdvdG8gRXhpdDsKKwkJCQkJfQorI2VuZGlmCisJCQkJfQorI2VuZGlmCisJCQkJLy8gaW5mb3JtIFBETyBtb2R1bGUKKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1BET0spKSAhPSAwKQorCQkJCWlmIChObXRTdGF0ZSA+PSBrRXBsTm10Q3NSZWFkeVRvT3BlcmF0ZSkgewkvLyBpbmZvcm0gUERPIG1vZHVsZSBvbmx5IGluIFJlYWR5VG9PcCBhbmQgT3AKKwkJCQkJaWYgKE5tdFN0YXRlICE9IGtFcGxObXRDc09wZXJhdGlvbmFsKSB7CisJCQkJCQkvLyByZXNldCBSRCBmbGFnIGFuZCBhbGwgb3RoZXIgZmxhZ3MsIGJ1dCB0aGF0IGRvZXMgbm90IG1hdHRlciwgYmVjYXVzZSB0aGV5IHdlcmUgcHJvY2Vzc2VkIGFib3ZlCisJCQkJCQlBbWlTZXRCeXRlVG9MZSgmcEZyYW1lLT5tX0RhdGEuCisJCQkJCQkJICAgICAgIG1fUHJlcS4KKwkJCQkJCQkgICAgICAgbV9sZV9iRmxhZzEsIDApOworCQkJCQl9CisJCQkJCS8vIGNvbXBhcmVzIHJlYWwgZnJhbWUgc2l6ZSBhbmQgUERPIHNpemUKKwkJCQkJaWYgKCh1bnNpZ25lZAorCQkJCQkgICAgIGludCkoQW1pR2V0V29yZEZyb21MZSgmcEZyYW1lLT4KKwkJCQkJCQkJICAgbV9EYXRhLgorCQkJCQkJCQkgICBtX1ByZXEuCisJCQkJCQkJCSAgIG1fbGVfd1NpemUpICsKKwkJCQkJCSAgMjQpCisJCQkJCSAgICA+IEZyYW1lSW5mby5tX3VpRnJhbWVTaXplKSB7CS8vIGZvcm1hdCBlcnJvcgorCQkJCQkJdEVwbEVycm9ySGFuZGxlcmtFdmVudCBEbGxFdmVudDsKKworCQkJCQkJRGxsRXZlbnQubV91bERsbEVycm9yRXZlbnRzID0KKwkJCQkJCSAgICBFUExfRExMX0VSUl9JTlZBTElEX0ZPUk1BVDsKKwkJCQkJCURsbEV2ZW50Lm1fdWlOb2RlSWQgPQorCQkJCQkJICAgIEFtaUdldEJ5dGVGcm9tTGUoJnBGcmFtZS0+CisJCQkJCQkJCSAgICAgbV9sZV9iU3JjTm9kZUlkKTsKKwkJCQkJCURsbEV2ZW50Lm1fTm10U3RhdGUgPSBObXRTdGF0ZTsKKwkJCQkJCUV2ZW50Lm1fRXZlbnRTaW5rID0KKwkJCQkJCSAgICBrRXBsRXZlbnRTaW5rRXJyazsKKwkJCQkJCUV2ZW50Lm1fRXZlbnRUeXBlID0KKwkJCQkJCSAgICBrRXBsRXZlbnRUeXBlRGxsRXJyb3I7CisJCQkJCQlFdmVudC5tX05ldFRpbWUgPQorCQkJCQkJICAgIEZyYW1lSW5mby5tX05ldFRpbWU7CisJCQkJCQlFdmVudC5tX3VpU2l6ZSA9CisJCQkJCQkgICAgc2l6ZW9mKERsbEV2ZW50KTsKKwkJCQkJCUV2ZW50Lm1fcEFyZyA9ICZEbGxFdmVudDsKKwkJCQkJCVJldCA9IEVwbEV2ZW50a1Bvc3QoJkV2ZW50KTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJCS8vIGZvcndhcmQgUFJlcSBmcmFtZSBhcyBSUERPIHRvIFBETyBtb2R1bGUKKwkJCQkJUmV0ID0gRXBsUGRva0NiUGRvUmVjZWl2ZWQoJkZyYW1lSW5mbyk7CisKKwkJCQl9CisjaWYgKEVQTF9ETExfUFJFU19SRUFEWV9BRlRFUl9TT0MgIT0gRkFMU0UpCisJCQkJaWYgKHBUeEJ1ZmZlci0+bV9wYkJ1ZmZlciAhPSBOVUxMKSB7CS8vIFBSZXMgZG9lcyBleGlzdAorCQkJCQkvLyBpbmZvcm0gUERPIG1vZHVsZSBhYm91dCBQUmVzIGFmdGVyIFBSZXEKKwkJCQkJRnJhbWVJbmZvLm1fcEZyYW1lID0KKwkJCQkJICAgICh0RXBsRnJhbWUgKikgcFR4QnVmZmVyLT5tX3BiQnVmZmVyOworCQkJCQlGcmFtZUluZm8ubV91aUZyYW1lU2l6ZSA9CisJCQkJCSAgICBwVHhCdWZmZXItPm1fdWlNYXhCdWZmZXJMZW47CisJCQkJCVJldCA9CisJCQkJCSAgICBFcGxQZG9rQ2JQZG9UcmFuc21pdHRlZCgmRnJhbWVJbmZvKTsKKwkJCQl9CisjZW5kaWYKKyNlbmRpZgorCisjaWYgRURSVl9FQVJMWV9SWF9JTlQgPT0gRkFMU0UKKwkJCQkvLyAkJCQgaW5mb3JtIGVtZXJnZW5jeSBwcm90b2NvbCBoYW5kbGluZyAoZXJyb3Igc2lnbmFsaW5nIG1vZHVsZSkgYWJvdXQgZmxhZ3MKKwkJCX0KKyNlbmRpZgorCisJCQkvLyByZXNldCBjeWNsZSBjb3VudGVyCisJCQlFcGxEbGxrSW5zdGFuY2VfZy5tX3VpQ3ljbGVDb3VudCA9IDA7CisKKwkJCWJyZWFrOworCQl9CisKKwljYXNlIGtFcGxNc2dUeXBlUHJlczoKKwkJeworI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UX01OKSkgIT0gMCkKKwkJCXRFcGxEbGxrTm9kZUluZm8gKnBJbnROb2RlSW5mbzsKKwkJCXRFcGxIZWFydGJlYXRFdmVudCBIZWFydGJlYXRFdmVudDsKKyNlbmRpZgorCisJCQkvLyBQUmVzIGZyYW1lCisJCQlObXRFdmVudCA9IGtFcGxObXRFdmVudERsbENlUHJlczsKKworCQkJdWlOb2RlSWQgPSBBbWlHZXRCeXRlRnJvbUxlKCZwRnJhbWUtPm1fbGVfYlNyY05vZGVJZCk7CisKKwkJCWlmICgoTm10U3RhdGUgPj0ga0VwbE5tdENzUHJlT3BlcmF0aW9uYWwyKQorCQkJICAgICYmIChObXRTdGF0ZSA8PSBrRXBsTm10Q3NPcGVyYXRpb25hbCkpIHsJLy8gcHJvY2VzcyBQUmVzIGZyYW1lcyBvbmx5IGluIFByZU9wMiwgUmVhZHlUb09wIGFuZCBPcCBvZiBDTgorCisjaWYgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRfTU4pKSAhPSAwKQorCQkJCXBJbnROb2RlSW5mbyA9IEVwbERsbGtHZXROb2RlSW5mbyh1aU5vZGVJZCk7CisJCQkJaWYgKHBJbnROb2RlSW5mbyA9PSBOVUxMKSB7CS8vIG5vIG5vZGUgaW5mbyBzdHJ1Y3R1cmUgYXZhaWxhYmxlCisJCQkJCVJldCA9IGtFcGxEbGxOb05vZGVJbmZvOworCQkJCQlnb3RvIEV4aXQ7CisJCQkJfQorCQkJfSBlbHNlIGlmIChFcGxEbGxrSW5zdGFuY2VfZy5tX0RsbFN0YXRlID09IGtFcGxEbGxNc1dhaXRQcmVzKSB7CS8vIG9yIHByb2Nlc3MgUFJlcyBmcmFtZXMgaW4gTXNXYWl0UHJlcworCisJCQkJcEludE5vZGVJbmZvID0gRXBsRGxsa0luc3RhbmNlX2cubV9wQ3VyTm9kZUluZm87CisJCQkJaWYgKChwSW50Tm9kZUluZm8gPT0gTlVMTCkgfHwgKHBJbnROb2RlSW5mby0+bV91aU5vZGVJZCAhPSB1aU5vZGVJZCkpIHsJLy8gaWdub3JlIFBSZXMsIGJlY2F1c2UgaXQgaXMgZnJvbSB3cm9uZyBDTgorCQkJCQkvLyAkJCQgbWF5YmUgcG9zdCBldmVudCB0byBObXRNbiBtb2R1bGUKKwkJCQkJZ290byBFeGl0OworCQkJCX0KKwkJCQkvLyBmb3J3YXJkIEZsYWcyIHRvIGFzeW5jaHJvbm91cyBzY2hlZHVsZXIKKwkJCQliRmxhZzEgPQorCQkJCSAgICBBbWlHZXRCeXRlRnJvbUxlKCZwRnJhbWUtPm1fRGF0YS5tX0FzbmQuCisJCQkJCQkgICAgIG1fUGF5bG9hZC5tX1N0YXR1c1Jlc3BvbnNlLgorCQkJCQkJICAgICBtX2xlX2JGbGFnMik7CisJCQkJUmV0ID0KKwkJCQkgICAgRXBsRGxsa0NhbEFzeW5jU2V0UGVuZGluZ1JlcXVlc3RzKHVpTm9kZUlkLAorCQkJCQkJCQkgICAgICAoKHRFcGxEbGxBc3luY1JlcVByaW9yaXR5KSAoKGJGbGFnMSAmIEVQTF9GUkFNRV9GTEFHMl9QUikgPj4gRVBMX0ZSQU1FX0ZMQUcyX1BSX1NISUZUKSksIChiRmxhZzEgJiBFUExfRlJBTUVfRkxBRzJfUlMpKTsKKworI2VuZGlmCisJCQl9IGVsc2UgewkvLyBpZ25vcmUgUFJlcywgYmVjYXVzZSBpdCB3YXMgcmVjZWl2ZWQgaW4gd3JvbmcgTk1UIHN0YXRlCisJCQkJLy8gYnV0IGV4ZWN1dGUgRXBsRGxsa0NoYW5nZVN0YXRlKCkgYW5kIHBvc3QgZXZlbnQgdG8gTk1UIG1vZHVsZQorCQkJCWJyZWFrOworCQkJfQorCisjaWYgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRfTU4pKSAhPSAwKQorCQkJewkvLyBjaGVjayBOTVQgc3RhdGUgb2YgQ04KKwkJCQlIZWFydGJlYXRFdmVudC5tX3dFcnJvckNvZGUgPSBFUExfRV9OT19FUlJPUjsKKwkJCQlIZWFydGJlYXRFdmVudC5tX05tdFN0YXRlID0KKwkJCQkgICAgKHRFcGxObXRTdGF0ZSkgKEFtaUdldEJ5dGVGcm9tTGUKKwkJCQkJCSAgICAoJnBGcmFtZS0+bV9EYXRhLm1fUHJlcy4KKwkJCQkJCSAgICAgbV9sZV9iTm10U3RhdHVzKSB8CisJCQkJCQkgICAgRVBMX05NVF9UWVBFX0NTKTsKKwkJCQlpZiAocEludE5vZGVJbmZvLT5tX05tdFN0YXRlICE9IEhlYXJ0YmVhdEV2ZW50Lm1fTm10U3RhdGUpIHsJLy8gTk1UIHN0YXRlIG9mIENOIGhhcyBjaGFuZ2VkIC0+IHBvc3QgZXZlbnQgdG8gTm10TW51IG1vZHVsZQorCQkJCQlpZiAocEludE5vZGVJbmZvLT5tX2ZTb2Z0RGVsZXRlID09IEZBTFNFKSB7CS8vIG5vcm1hbCBpc29jaHJvbm91cyBDTgorCQkJCQkJSGVhcnRiZWF0RXZlbnQubV91aU5vZGVJZCA9CisJCQkJCQkgICAgdWlOb2RlSWQ7CisJCQkJCQlFdmVudC5tX0V2ZW50U2luayA9CisJCQkJCQkgICAga0VwbEV2ZW50U2lua05tdE1udTsKKwkJCQkJCUV2ZW50Lm1fRXZlbnRUeXBlID0KKwkJCQkJCSAgICBrRXBsRXZlbnRUeXBlSGVhcnRiZWF0OworCQkJCQkJRXZlbnQubV91aVNpemUgPQorCQkJCQkJICAgIHNpemVvZihIZWFydGJlYXRFdmVudCk7CisJCQkJCQlFdmVudC5tX3BBcmcgPSAmSGVhcnRiZWF0RXZlbnQ7CisJCQkJCX0gZWxzZSB7CS8vIENOIHNoYWxsIGJlIGRlbGV0ZWQgc29mdGx5CisJCQkJCQlFdmVudC5tX0V2ZW50U2luayA9CisJCQkJCQkgICAga0VwbEV2ZW50U2lua0RsbGtDYWw7CisJCQkJCQlFdmVudC5tX0V2ZW50VHlwZSA9CisJCQkJCQkgICAga0VwbEV2ZW50VHlwZURsbGtTb2Z0RGVsTm9kZTsKKwkJCQkJCUV2ZW50Lm1fdWlTaXplID0KKwkJCQkJCSAgICBzaXplb2YodW5zaWduZWQgaW50KTsKKwkJCQkJCUV2ZW50Lm1fcEFyZyA9CisJCQkJCQkgICAgJnBJbnROb2RlSW5mby0+bV91aU5vZGVJZDsKKwkJCQkJfQorCQkJCQlFdmVudC5tX05ldFRpbWUgPSBGcmFtZUluZm8ubV9OZXRUaW1lOworCQkJCQlSZXQgPSBFcGxFdmVudGtQb3N0KCZFdmVudCk7CisKKwkJCQkJLy8gc2F2ZSBjdXJyZW50IE5NVCBzdGF0ZSBvZiBDTiBpbiBpbnRlcm5hbCBub2RlIHN0cnVjdHVyZQorCQkJCQlwSW50Tm9kZUluZm8tPm1fTm10U3RhdGUgPQorCQkJCQkgICAgSGVhcnRiZWF0RXZlbnQubV9ObXRTdGF0ZTsKKwkJCQl9CisJCQl9CisjZW5kaWYKKworCQkJLy8gaW5mb3JtIFBETyBtb2R1bGUKKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1BET0spKSAhPSAwKQorCQkJaWYgKChObXRTdGF0ZSAhPSBrRXBsTm10Q3NQcmVPcGVyYXRpb25hbDIpCisJCQkgICAgJiYgKE5tdFN0YXRlICE9IGtFcGxObXRNc1ByZU9wZXJhdGlvbmFsMikpIHsJLy8gaW5mb3JtIFBETyBtb2R1bGUgb25seSBpbiBSZWFkeVRvT3AgYW5kIE9wCisJCQkJLy8gY29tcGFyZSByZWFsIGZyYW1lIHNpemUgYW5kIFBETyBzaXplPworCQkJCWlmICgoKHVuc2lnbmVkCisJCQkJICAgICAgaW50KShBbWlHZXRXb3JkRnJvbUxlKCZwRnJhbWUtPm1fRGF0YS4KKwkJCQkJCQkgICAgbV9QcmVzLm1fbGVfd1NpemUpICsKKwkJCQkJICAgMjQpCisJCQkJICAgICA+IEZyYW1lSW5mby5tX3VpRnJhbWVTaXplKQorI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UX01OKSkgIT0gMCkKKwkJCQkgICAgfHwKKwkJCQkgICAgKEFtaUdldFdvcmRGcm9tTGUKKwkJCQkgICAgICgmcEZyYW1lLT5tX0RhdGEubV9QcmVzLm1fbGVfd1NpemUpID4KKwkJCQkgICAgIHBJbnROb2RlSW5mby0+bV93UHJlc1BheWxvYWRMaW1pdCkKKyNlbmRpZgorCQkJCSAgICApIHsJLy8gZm9ybWF0IGVycm9yCisJCQkJCXRFcGxFcnJvckhhbmRsZXJrRXZlbnQgRGxsRXZlbnQ7CisKKwkJCQkJRGxsRXZlbnQubV91bERsbEVycm9yRXZlbnRzID0KKwkJCQkJICAgIEVQTF9ETExfRVJSX0lOVkFMSURfRk9STUFUOworCQkJCQlEbGxFdmVudC5tX3VpTm9kZUlkID0gdWlOb2RlSWQ7CisJCQkJCURsbEV2ZW50Lm1fTm10U3RhdGUgPSBObXRTdGF0ZTsKKwkJCQkJRXZlbnQubV9FdmVudFNpbmsgPSBrRXBsRXZlbnRTaW5rRXJyazsKKwkJCQkJRXZlbnQubV9FdmVudFR5cGUgPQorCQkJCQkgICAga0VwbEV2ZW50VHlwZURsbEVycm9yOworCQkJCQlFdmVudC5tX05ldFRpbWUgPSBGcmFtZUluZm8ubV9OZXRUaW1lOworCQkJCQlFdmVudC5tX3VpU2l6ZSA9IHNpemVvZihEbGxFdmVudCk7CisJCQkJCUV2ZW50Lm1fcEFyZyA9ICZEbGxFdmVudDsKKwkJCQkJUmV0ID0gRXBsRXZlbnRrUG9zdCgmRXZlbnQpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJaWYgKChObXRTdGF0ZSAhPSBrRXBsTm10Q3NPcGVyYXRpb25hbCkKKwkJCQkgICAgJiYgKE5tdFN0YXRlICE9IGtFcGxObXRNc09wZXJhdGlvbmFsKSkgeworCQkJCQkvLyByZXNldCBSRCBmbGFnIGFuZCBhbGwgb3RoZXIgZmxhZ3MsIGJ1dCB0aGF0IGRvZXMgbm90IG1hdHRlciwgYmVjYXVzZSB0aGV5IHdlcmUgcHJvY2Vzc2VkIGFib3ZlCisJCQkJCUFtaVNldEJ5dGVUb0xlKCZwRnJhbWUtPm1fRGF0YS5tX1ByZXMuCisJCQkJCQkgICAgICAgbV9sZV9iRmxhZzEsIDApOworCQkJCX0KKwkJCQlSZXQgPSBFcGxQZG9rQ2JQZG9SZWNlaXZlZCgmRnJhbWVJbmZvKTsKKwkJCX0KKyNlbmRpZgorCisJCQlicmVhazsKKwkJfQorCisJY2FzZSBrRXBsTXNnVHlwZVNvYzoKKwkJeworCQkJLy8gU29DIGZyYW1lCisJCQlObXRFdmVudCA9IGtFcGxObXRFdmVudERsbENlU29jOworCisJCQlpZiAoTm10U3RhdGUgPj0ga0VwbE5tdE1zTm90QWN0aXZlKSB7CS8vIE1OIGlzIGFjdGl2ZSAtPiB3cm9uZyBtc2cgdHlwZQorCQkJCWJyZWFrOworCQkJfQorI2lmIEVQTF9ETExfUFJFU19SRUFEWV9BRlRFUl9TT0MgIT0gRkFMU0UKKwkJCS8vIHBvc3QgUFJlcyB0byB0cmFuc21pdCBGSUZPIG9mIHRoZSBldGhlcm5ldCBjb250cm9sbGVyLCBidXQgZG9uJ3Qgc3RhcnQKKwkJCS8vIHRyYW5zbWlzc2lvbiBvdmVyIGJ1cworCQkJcFR4QnVmZmVyID0KKwkJCSAgICAmRXBsRGxsa0luc3RhbmNlX2cuCisJCQkgICAgbV9wVHhCdWZmZXJbRVBMX0RMTEtfVFhGUkFNRV9QUkVTXTsKKwkJCS8vIERvZXMgUFJlcyBleGlzdD8KKwkJCWlmIChwVHhCdWZmZXItPm1fcGJCdWZmZXIgIT0gTlVMTCkgewkvLyBQUmVzIGRvZXMgZXhpc3QKKwkJCQlwVHhGcmFtZSA9ICh0RXBsRnJhbWUgKikgcFR4QnVmZmVyLT5tX3BiQnVmZmVyOworCQkJCS8vIHVwZGF0ZSBmcmFtZSAoTk1UIHN0YXRlLCBSRCwgUlMsIFBSLCBNUywgRU4gZmxhZ3MpCisJCQkJaWYgKE5tdFN0YXRlIDwga0VwbE5tdENzUHJlT3BlcmF0aW9uYWwyKSB7CS8vIE5NVCBzdGF0ZSBpcyBub3QgUHJlT3AyLCBSZWFkeVRvT3Agb3IgT3AKKwkJCQkJLy8gZmFrZSBOTVQgc3RhdGUgUHJlT3AyLCBiZWNhdXNlIFBSZXMgd2lsbCBiZSBzZW50IG9ubHkgaW4gUHJlT3AyIG9yIGdyZWF0ZXIKKwkJCQkJTm10U3RhdGUgPSBrRXBsTm10Q3NQcmVPcGVyYXRpb25hbDI7CisJCQkJfQorCQkJCUFtaVNldEJ5dGVUb0xlKCZwVHhGcmFtZS0+bV9EYXRhLm1fUHJlcy4KKwkJCQkJICAgICAgIG1fbGVfYk5tdFN0YXR1cywKKwkJCQkJICAgICAgIChCWVRFKSBObXRTdGF0ZSk7CisJCQkJQW1pU2V0Qnl0ZVRvTGUoJnBUeEZyYW1lLT5tX0RhdGEubV9QcmVzLgorCQkJCQkgICAgICAgbV9sZV9iRmxhZzIsCisJCQkJCSAgICAgICBFcGxEbGxrSW5zdGFuY2VfZy5tX2JGbGFnMik7CisJCQkJaWYgKE5tdFN0YXRlICE9IGtFcGxObXRDc09wZXJhdGlvbmFsKSB7CS8vIG1hcmsgUERPIGFzIGludmFsaWQgaW4gTk1UIHN0YXRlIE9wCisJCQkJCS8vICQkJCByZXNldCBvbmx5IFJEIGZsYWc7IHNldCBvdGhlciBmbGFncyBhcHByb3ByaWF0ZWx5CisJCQkJCUFtaVNldEJ5dGVUb0xlKCZwVHhGcmFtZS0+bV9EYXRhLm1fUHJlcy4KKwkJCQkJCSAgICAgICBtX2xlX2JGbGFnMSwgMCk7CisJCQkJfQorCQkJCS8vICQkJCBtYWtlIGZ1bmN0aW9uIHRoYXQgdXBkYXRlcyBQcmVzLCBTdGF0dXNSZXMKKwkJCQkvLyBtYXJrIFBSZXMgZnJhbWUgYXMgcmVhZHkgZm9yIHRyYW5zbWlzc2lvbgorCQkJCVJldCA9IEVkcnZUeE1zZ1JlYWR5KHBUeEJ1ZmZlcik7CisJCQl9CisjZW5kaWYKKworCQkJaWYgKE5tdFN0YXRlID49IGtFcGxObXRDc1ByZU9wZXJhdGlvbmFsMikgewkvLyBTb0MgZnJhbWVzIG9ubHkgaW4gUHJlT3AyLCBSZWFkeVRvT3AgYW5kIE9wCisJCQkJLy8gdHJpZ2dlciBzeW5jaHJvbm91cyB0YXNrCisJCQkJRXZlbnQubV9FdmVudFNpbmsgPSBrRXBsRXZlbnRTaW5rU3luYzsKKwkJCQlFdmVudC5tX0V2ZW50VHlwZSA9IGtFcGxFdmVudFR5cGVTeW5jOworCQkJCUV2ZW50Lm1fdWlTaXplID0gMDsKKwkJCQlSZXQgPSBFcGxFdmVudGtQb3N0KCZFdmVudCk7CisKKwkJCQkvLyB1cGRhdGUgY3ljbGUgY291bnRlcgorCQkJCWlmIChFcGxEbGxrSW5zdGFuY2VfZy5tX0RsbENvbmZpZ1BhcmFtLm1fdWlNdWx0aXBsQ3ljbGVDbnQgPiAwKSB7CS8vIG11bHRpcGxleGVkIGN5Y2xlIGFjdGl2ZQorCQkJCQlFcGxEbGxrSW5zdGFuY2VfZy5tX3VpQ3ljbGVDb3VudCA9CisJCQkJCSAgICAoRXBsRGxsa0luc3RhbmNlX2cubV91aUN5Y2xlQ291bnQgKworCQkJCQkgICAgIDEpICUKKwkJCQkJICAgIEVwbERsbGtJbnN0YW5jZV9nLm1fRGxsQ29uZmlnUGFyYW0uCisJCQkJCSAgICBtX3VpTXVsdGlwbEN5Y2xlQ250OworCQkJCX0KKwkJCX0KKwkJCS8vIHJlcHJvZ3JhbSB0aW1lcgorI2lmIEVQTF9USU1FUl9VU0VfSElHSFJFUyAhPSBGQUxTRQorCQkJaWYgKEVwbERsbGtJbnN0YW5jZV9nLm1fdWxsRnJhbWVUaW1lb3V0ICE9IDApIHsKKwkJCQlSZXQgPQorCQkJCSAgICBFcGxUaW1lckhpZ2hSZXNrTW9kaWZ5VGltZXJOcworCQkJCSAgICAoJkVwbERsbGtJbnN0YW5jZV9nLm1fVGltZXJIZGxDeWNsZSwKKwkJCQkgICAgIEVwbERsbGtJbnN0YW5jZV9nLm1fdWxsRnJhbWVUaW1lb3V0LAorCQkJCSAgICAgRXBsRGxsa0NiQ25UaW1lciwgMEwsIEZBTFNFKTsKKwkJCX0KKyNlbmRpZgorCisJCQlicmVhazsKKwkJfQorCisJY2FzZSBrRXBsTXNnVHlwZVNvYToKKwkJeworCQkJLy8gU29BIGZyYW1lCisJCQlObXRFdmVudCA9IGtFcGxObXRFdmVudERsbENlU29hOworCisJCQlpZiAoTm10U3RhdGUgPj0ga0VwbE5tdE1zTm90QWN0aXZlKSB7CS8vIE1OIGlzIGFjdGl2ZSAtPiB3cm9uZyBtc2cgdHlwZQorCQkJCWJyZWFrOworCQkJfQorCisJCQlwVHhGcmFtZSA9IE5VTEw7CisKKwkJCWlmICgoTm10U3RhdGUgJiBFUExfTk1UX1NVUEVSU1RBVEVfTUFTSykgIT0gRVBMX05NVF9DU19FUExNT0RFKSB7CS8vIGRvIG5vdCByZXNwb25kLCBpZiBOTVQgc3RhdGUgaXMgPCBQcmVPcDEgKGkuZS4gbm90IEVQTF9NT0RFKQorCQkJCWJyZWFrOworCQkJfQorCQkJLy8gY2hlY2sgVGFyZ2V0Tm9kZUlkCisJCQl1aU5vZGVJZCA9CisJCQkgICAgQW1pR2V0Qnl0ZUZyb21MZSgmcEZyYW1lLT5tX0RhdGEubV9Tb2EuCisJCQkJCSAgICAgbV9sZV9iUmVxU2VydmljZVRhcmdldCk7CisJCQlpZiAodWlOb2RlSWQgPT0gRXBsRGxsa0luc3RhbmNlX2cubV9EbGxDb25maWdQYXJhbS5tX3VpTm9kZUlkKSB7CS8vIGxvY2FsIG5vZGUgaXMgdGhlIHRhcmdldCBvZiB0aGUgY3VycmVudCByZXF1ZXN0CisKKwkJCQkvLyBjaGVjayBTZXJ2aWNlSWQKKwkJCQlSZXFTZXJ2aWNlSWQgPQorCQkJCSAgICAodEVwbERsbFJlcVNlcnZpY2VJZCkKKwkJCQkgICAgQW1pR2V0Qnl0ZUZyb21MZSgmcEZyYW1lLT5tX0RhdGEubV9Tb2EuCisJCQkJCQkgICAgIG1fbGVfYlJlcVNlcnZpY2VJZCk7CisJCQkJaWYgKFJlcVNlcnZpY2VJZCA9PSBrRXBsRGxsUmVxU2VydmljZVN0YXR1cykgewkvLyBTdGF0dXNSZXF1ZXN0CisJCQkJCWlmIChFcGxEbGxrSW5zdGFuY2VfZy5tX3BUeEJ1ZmZlcltFUExfRExMS19UWEZSQU1FX1NUQVRVU1JFU10ubV9wYkJ1ZmZlciAhPSBOVUxMKSB7CS8vIFN0YXR1c1JlcyBkb2VzIGV4aXN0CisKKwkJCQkJCXBUeEZyYW1lID0KKwkJCQkJCSAgICAodEVwbEZyYW1lICopCisJCQkJCQkgICAgRXBsRGxsa0luc3RhbmNlX2cuCisJCQkJCQkgICAgbV9wVHhCdWZmZXIKKwkJCQkJCSAgICBbRVBMX0RMTEtfVFhGUkFNRV9TVEFUVVNSRVNdLgorCQkJCQkJICAgIG1fcGJCdWZmZXI7CisJCQkJCQkvLyB1cGRhdGUgU3RhdHVzUmVzIGZyYW1lIChOTVQgc3RhdGUsIEVOLCBFQywgUlMsIFBSIGZsYWdzKQorCQkJCQkJQW1pU2V0Qnl0ZVRvTGUoJnBUeEZyYW1lLT4KKwkJCQkJCQkgICAgICAgbV9EYXRhLm1fQXNuZC4KKwkJCQkJCQkgICAgICAgbV9QYXlsb2FkLgorCQkJCQkJCSAgICAgICBtX1N0YXR1c1Jlc3BvbnNlLgorCQkJCQkJCSAgICAgICBtX2xlX2JObXRTdGF0dXMsCisJCQkJCQkJICAgICAgIChCWVRFKSBObXRTdGF0ZSk7CisJCQkJCQlBbWlTZXRCeXRlVG9MZSgmcFR4RnJhbWUtPgorCQkJCQkJCSAgICAgICBtX0RhdGEubV9Bc25kLgorCQkJCQkJCSAgICAgICBtX1BheWxvYWQuCisJCQkJCQkJICAgICAgIG1fU3RhdHVzUmVzcG9uc2UuCisJCQkJCQkJICAgICAgIG1fbGVfYkZsYWcxLAorCQkJCQkJCSAgICAgICBFcGxEbGxrSW5zdGFuY2VfZy4KKwkJCQkJCQkgICAgICAgbV9iRmxhZzEpOworCQkJCQkJQW1pU2V0Qnl0ZVRvTGUoJnBUeEZyYW1lLT4KKwkJCQkJCQkgICAgICAgbV9EYXRhLm1fQXNuZC4KKwkJCQkJCQkgICAgICAgbV9QYXlsb2FkLgorCQkJCQkJCSAgICAgICBtX1N0YXR1c1Jlc3BvbnNlLgorCQkJCQkJCSAgICAgICBtX2xlX2JGbGFnMiwKKwkJCQkJCQkgICAgICAgRXBsRGxsa0luc3RhbmNlX2cuCisJCQkJCQkJICAgICAgIG1fYkZsYWcyKTsKKwkJCQkJCS8vIHNlbmQgU3RhdHVzUmVzCisJCQkJCQlSZXQgPQorCQkJCQkJICAgIEVkcnZTZW5kVHhNc2cKKwkJCQkJCSAgICAoJkVwbERsbGtJbnN0YW5jZV9nLgorCQkJCQkJICAgICBtX3BUeEJ1ZmZlcgorCQkJCQkJICAgICBbRVBMX0RMTEtfVFhGUkFNRV9TVEFUVVNSRVNdKTsKKwkJCQkJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCQkJCQlnb3RvIEV4aXQ7CisJCQkJCQl9CisJCQkJCQlUR1RfREJHX1NJR05BTF9UUkFDRV9QT0lOVCg4KTsKKworCQkJCQkJLy8gdXBkYXRlIGVycm9yIHNpZ25hbGluZworCQkJCQkJYkZsYWcxID0KKwkJCQkJCSAgICBBbWlHZXRCeXRlRnJvbUxlKCZwRnJhbWUtPgorCQkJCQkJCQkgICAgIG1fRGF0YS4KKwkJCQkJCQkJICAgICBtX1NvYS4KKwkJCQkJCQkJICAgICBtX2xlX2JGbGFnMSk7CisJCQkJCQlpZiAoKChiRmxhZzEgXiBFcGxEbGxrSW5zdGFuY2VfZy5tX2JNbkZsYWcxKSAmIEVQTF9GUkFNRV9GTEFHMV9FUikgIT0gMCkgewkvLyBleGNlcHRpb24gcmVzZXQgZmxhZyB3YXMgY2hhbmdlZCBieSBNTgorCQkJCQkJCS8vIGFzc3VtZSBzYW1lIHN0YXRlIGZvciBFQyBpbiBuZXh0IGN5Y2xlIChjbGVhciBhbGwgb3RoZXIgYml0cykKKwkJCQkJCQlpZiAoKGJGbGFnMSAmCisJCQkJCQkJICAgICBFUExfRlJBTUVfRkxBRzFfRVIpCisJCQkJCQkJICAgICE9IDApIHsKKwkJCQkJCQkJLy8gc2V0IEVDIGFuZCByZXNldCByZXN0CisJCQkJCQkJCUVwbERsbGtJbnN0YW5jZV9nLgorCQkJCQkJCQkgICAgbV9iRmxhZzEgPQorCQkJCQkJCQkgICAgRVBMX0ZSQU1FX0ZMQUcxX0VDOworCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCS8vIHJlc2V0IGNvbXBsZXRlIGZsYWcgMSAoaW5jbHVkaW5nIEVDIGFuZCBFTikKKwkJCQkJCQkJRXBsRGxsa0luc3RhbmNlX2cuCisJCQkJCQkJCSAgICBtX2JGbGFnMSA9CisJCQkJCQkJCSAgICAwOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJCS8vIHNhdmUgZmxhZyAxIGZyb20gTU4gZm9yIFN0YXR1cyByZXF1ZXN0IHJlc3BvbnNlIGN5Y2xlCisJCQkJCQlFcGxEbGxrSW5zdGFuY2VfZy5tX2JNbkZsYWcxID0KKwkJCQkJCSAgICBiRmxhZzE7CisJCQkJCX0KKwkJCQl9IGVsc2UgaWYgKFJlcVNlcnZpY2VJZCA9PSBrRXBsRGxsUmVxU2VydmljZUlkZW50KSB7CS8vIElkZW50UmVxdWVzdAorCQkJCQlpZiAoRXBsRGxsa0luc3RhbmNlX2cubV9wVHhCdWZmZXJbRVBMX0RMTEtfVFhGUkFNRV9JREVOVFJFU10ubV9wYkJ1ZmZlciAhPSBOVUxMKSB7CS8vIElkZW50UmVzIGRvZXMgZXhpc3QKKwkJCQkJCXBUeEZyYW1lID0KKwkJCQkJCSAgICAodEVwbEZyYW1lICopCisJCQkJCQkgICAgRXBsRGxsa0luc3RhbmNlX2cuCisJCQkJCQkgICAgbV9wVHhCdWZmZXIKKwkJCQkJCSAgICBbRVBMX0RMTEtfVFhGUkFNRV9JREVOVFJFU10uCisJCQkJCQkgICAgbV9wYkJ1ZmZlcjsKKwkJCQkJCS8vIHVwZGF0ZSBJZGVudFJlcyBmcmFtZSAoTk1UIHN0YXRlLCBSUywgUFIgZmxhZ3MpCisJCQkJCQlBbWlTZXRCeXRlVG9MZSgmcFR4RnJhbWUtPgorCQkJCQkJCSAgICAgICBtX0RhdGEubV9Bc25kLgorCQkJCQkJCSAgICAgICBtX1BheWxvYWQuCisJCQkJCQkJICAgICAgIG1fSWRlbnRSZXNwb25zZS4KKwkJCQkJCQkgICAgICAgbV9sZV9iTm10U3RhdHVzLAorCQkJCQkJCSAgICAgICAoQllURSkgTm10U3RhdGUpOworCQkJCQkJQW1pU2V0Qnl0ZVRvTGUoJnBUeEZyYW1lLT4KKwkJCQkJCQkgICAgICAgbV9EYXRhLm1fQXNuZC4KKwkJCQkJCQkgICAgICAgbV9QYXlsb2FkLgorCQkJCQkJCSAgICAgICBtX0lkZW50UmVzcG9uc2UuCisJCQkJCQkJICAgICAgIG1fbGVfYkZsYWcyLAorCQkJCQkJCSAgICAgICBFcGxEbGxrSW5zdGFuY2VfZy4KKwkJCQkJCQkgICAgICAgbV9iRmxhZzIpOworCQkJCQkJLy8gc2VuZCBJZGVudFJlcworCQkJCQkJUmV0ID0KKwkJCQkJCSAgICBFZHJ2U2VuZFR4TXNnCisJCQkJCQkgICAgKCZFcGxEbGxrSW5zdGFuY2VfZy4KKwkJCQkJCSAgICAgbV9wVHhCdWZmZXIKKwkJCQkJCSAgICAgW0VQTF9ETExLX1RYRlJBTUVfSURFTlRSRVNdKTsKKwkJCQkJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCQkJCQlnb3RvIEV4aXQ7CisJCQkJCQl9CisJCQkJCQlUR1RfREJHX1NJR05BTF9UUkFDRV9QT0lOVCg3KTsKKwkJCQkJfQorCQkJCX0gZWxzZSBpZiAoUmVxU2VydmljZUlkID09IGtFcGxEbGxSZXFTZXJ2aWNlTm10UmVxdWVzdCkgewkvLyBObXRSZXF1ZXN0CisJCQkJCWlmIChFcGxEbGxrSW5zdGFuY2VfZy5tX3BUeEJ1ZmZlcltFUExfRExMS19UWEZSQU1FX05NVFJFUV0ubV9wYkJ1ZmZlciAhPSBOVUxMKSB7CS8vIE5tdFJlcXVlc3QgZG9lcyBleGlzdAorCQkJCQkJLy8gY2hlY2sgaWYgZnJhbWUgaXMgbm90IGVtcHR5IGFuZCBub3QgYmVpbmcgZmlsbGVkCisJCQkJCQlpZiAoRXBsRGxsa0luc3RhbmNlX2cuCisJCQkJCQkgICAgbV9wVHhCdWZmZXIKKwkJCQkJCSAgICBbRVBMX0RMTEtfVFhGUkFNRV9OTVRSRVFdLgorCQkJCQkJICAgIG1fdWlUeE1zZ0xlbiA+CisJCQkJCQkgICAgRVBMX0RMTEtfQlVGTEVOX0ZJTExJTkcpIHsKKwkJCQkJCQkvKmlmIChFcGxEbGxrSW5zdGFuY2VfZy5tX3BUeEJ1ZmZlcltFUExfRExMS19UWEZSQU1FX05NVFJFUV0ubV91aVR4TXNnTGVuIDwgRVBMX0RMTEtfQlVGTEVOX01JTikKKwkJCQkJCQkgICB7ICAgLy8gcGFkIGZyYW1lCisJCQkJCQkJICAgRXBsRGxsa0luc3RhbmNlX2cubV9wVHhCdWZmZXJbRVBMX0RMTEtfVFhGUkFNRV9OTVRSRVFdLm1fdWlUeE1zZ0xlbiA9IEVQTF9ETExLX0JVRkxFTl9NSU47CisJCQkJCQkJICAgfSAqLworCQkJCQkJCS8vIG1lbW9yaXplIHRyYW5zbWlzc2lvbgorCQkJCQkJCXBUeEZyYW1lID0KKwkJCQkJCQkgICAgKHRFcGxGcmFtZSAqKSAxOworCQkJCQkJCS8vIHNlbmQgTm10UmVxdWVzdAorCQkJCQkJCVJldCA9CisJCQkJCQkJICAgIEVkcnZTZW5kVHhNc2cKKwkJCQkJCQkgICAgKCZFcGxEbGxrSW5zdGFuY2VfZy4KKwkJCQkJCQkgICAgIG1fcFR4QnVmZmVyCisJCQkJCQkJICAgICBbRVBMX0RMTEtfVFhGUkFNRV9OTVRSRVFdKTsKKwkJCQkJCQlpZiAoUmV0ICE9CisJCQkJCQkJICAgIGtFcGxTdWNjZXNzZnVsKSB7CisJCQkJCQkJCWdvdG8gRXhpdDsKKwkJCQkJCQl9CisKKwkJCQkJCX0KKwkJCQkJfQorCisJCQkJfSBlbHNlIGlmIChSZXFTZXJ2aWNlSWQgPT0ga0VwbERsbFJlcVNlcnZpY2VVbnNwZWNpZmllZCkgewkvLyB1bnNwZWNpZmllZCBpbnZpdGUKKwkJCQkJaWYgKEVwbERsbGtJbnN0YW5jZV9nLm1fcFR4QnVmZmVyW0VQTF9ETExLX1RYRlJBTUVfTk9ORVBMXS5tX3BiQnVmZmVyICE9IE5VTEwpIHsJLy8gbm9uLUVQTCBmcmFtZSBkb2VzIGV4aXN0CisJCQkJCQkvLyBjaGVjayBpZiBmcmFtZSBpcyBub3QgZW1wdHkgYW5kIG5vdCBiZWluZyBmaWxsZWQKKwkJCQkJCWlmIChFcGxEbGxrSW5zdGFuY2VfZy4KKwkJCQkJCSAgICBtX3BUeEJ1ZmZlcgorCQkJCQkJICAgIFtFUExfRExMS19UWEZSQU1FX05PTkVQTF0uCisJCQkJCQkgICAgbV91aVR4TXNnTGVuID4KKwkJCQkJCSAgICBFUExfRExMS19CVUZMRU5fRklMTElORykgeworCQkJCQkJCS8qaWYgKEVwbERsbGtJbnN0YW5jZV9nLm1fcFR4QnVmZmVyW0VQTF9ETExLX1RYRlJBTUVfTk1UUkVRXS5tX3VpVHhNc2dMZW4gPCBFUExfRExMS19CVUZMRU5fTUlOKQorCQkJCQkJCSAgIHsgICAvLyBwYWQgZnJhbWUKKwkJCQkJCQkgICBFcGxEbGxrSW5zdGFuY2VfZy5tX3BUeEJ1ZmZlcltFUExfRExMS19UWEZSQU1FX05NVFJFUV0ubV91aVR4TXNnTGVuID0gRVBMX0RMTEtfQlVGTEVOX01JTjsKKwkJCQkJCQkgICB9ICovCisJCQkJCQkJLy8gbWVtb3JpemUgdHJhbnNtaXNzaW9uCisJCQkJCQkJcFR4RnJhbWUgPQorCQkJCQkJCSAgICAodEVwbEZyYW1lICopIDE7CisJCQkJCQkJLy8gc2VuZCBub24tRVBMIGZyYW1lCisJCQkJCQkJUmV0ID0KKwkJCQkJCQkgICAgRWRydlNlbmRUeE1zZworCQkJCQkJCSAgICAoJkVwbERsbGtJbnN0YW5jZV9nLgorCQkJCQkJCSAgICAgbV9wVHhCdWZmZXIKKwkJCQkJCQkgICAgIFtFUExfRExMS19UWEZSQU1FX05PTkVQTF0pOworCQkJCQkJCWlmIChSZXQgIT0KKwkJCQkJCQkgICAga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCQkJCQkJZ290byBFeGl0OworCQkJCQkJCX0KKworCQkJCQkJfQorCQkJCQl9CisKKwkJCQl9IGVsc2UgaWYgKFJlcVNlcnZpY2VJZCA9PSBrRXBsRGxsUmVxU2VydmljZU5vKSB7CS8vIG5vIGFzeW5jIHNlcnZpY2UgcmVxdWVzdGVkIC0+IGRvIG5vdGhpbmcKKwkJCQl9CisJCQl9CisjaWYgRVBMX0RMTF9QUkVTX1JFQURZX0FGVEVSX1NPQSAhPSBGQUxTRQorCQkJaWYgKHBUeEZyYW1lID09IE5VTEwpIHsJLy8gc2lnbmFsIHByb2Nlc3MgZnVuY3Rpb24gcmVhZGluZXNzIG9mIFBSZXMgZnJhbWUKKwkJCQlFdmVudC5tX0V2ZW50U2luayA9IGtFcGxFdmVudFNpbmtEbGxrOworCQkJCUV2ZW50Lm1fRXZlbnRUeXBlID0ga0VwbEV2ZW50VHlwZURsbGtQcmVzUmVhZHk7CisJCQkJRXZlbnQubV91aVNpemUgPSAwOworCQkJCUV2ZW50Lm1fcEFyZyA9IE5VTEw7CisJCQkJUmV0ID0gRXBsRXZlbnRrUG9zdCgmRXZlbnQpOworCQkJfQorI2VuZGlmCisKKwkJCS8vIGluZm9ybSBQRE8gbW9kdWxlCisjaWYgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9QRE9LKSkgIT0gMCkKKy8vICAgICAgICAgICAgUmV0ID0gRXBsUGRva0NiU29hKCZGcmFtZUluZm8pOworI2VuZGlmCisKKwkJCS8vICQkJCBwdXQgU3JjTm9kZUlkLCBOTVQgc3RhdGUgYW5kIE5ldFRpbWUgYXMgSGVhcnRiZWF0RXZlbnQgaW50byBldmVudHF1ZXVlCisKKwkJCS8vICQkJCBpbmZvcm0gZW1lcmdlbmN5IHByb3RvY29sIGhhbmRsaW5nIGFib3V0IGZsYWdzCisJCQlicmVhazsKKwkJfQorCisJY2FzZSBrRXBsTXNnVHlwZUFzbmQ6CisJCXsKKwkJCS8vIEFTbmQgZnJhbWUKKwkJCU5tdEV2ZW50ID0ga0VwbE5tdEV2ZW50RGxsQ2VBc25kOworCisJCQkvLyBBU25kIHNlcnZpY2UgcmVnaXN0ZXJlZD8KKwkJCXVpQXNuZFNlcnZpY2VJZCA9CisJCQkgICAgKHVuc2lnbmVkIGludClBbWlHZXRCeXRlRnJvbUxlKCZwRnJhbWUtPm1fRGF0YS4KKwkJCQkJCQkgICBtX0FzbmQuCisJCQkJCQkJICAgbV9sZV9iU2VydmljZUlkKTsKKworI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UX01OKSkgIT0gMCkKKwkJCWlmICgoRXBsRGxsa0luc3RhbmNlX2cubV9EbGxTdGF0ZSA+PSBrRXBsRGxsTXNOb25DeWNsaWMpCisJCQkgICAgJiYKKwkJCSAgICAoKCgodEVwbERsbEFzbmRTZXJ2aWNlSWQpIHVpQXNuZFNlcnZpY2VJZCkgPT0KKwkJCSAgICAgIGtFcGxEbGxBc25kU3RhdHVzUmVzcG9uc2UpCisJCQkgICAgIHx8ICgoKHRFcGxEbGxBc25kU2VydmljZUlkKSB1aUFzbmRTZXJ2aWNlSWQpID09IGtFcGxEbGxBc25kSWRlbnRSZXNwb25zZSkpKSB7CS8vIFN0YXR1c1JlcyBvciBJZGVudFJlcyByZWNlaXZlZAorCQkJCXVpTm9kZUlkID0KKwkJCQkgICAgQW1pR2V0Qnl0ZUZyb21MZSgmcEZyYW1lLT5tX2xlX2JTcmNOb2RlSWQpOworCQkJCWlmICgoRXBsRGxsa0luc3RhbmNlX2cubV9MYXN0UmVxU2VydmljZUlkID09CisJCQkJICAgICAoKHRFcGxEbGxSZXFTZXJ2aWNlSWQpIHVpQXNuZFNlcnZpY2VJZCkpCisJCQkJICAgICYmICh1aU5vZGVJZCA9PSBFcGxEbGxrSW5zdGFuY2VfZy5tX3VpTGFzdFRhcmdldE5vZGVJZCkpIHsJLy8gbWFyayByZXF1ZXN0IGFzIHJlc3BvbmRlZAorCQkJCQlFcGxEbGxrSW5zdGFuY2VfZy5tX0xhc3RSZXFTZXJ2aWNlSWQgPQorCQkJCQkgICAga0VwbERsbFJlcVNlcnZpY2VObzsKKwkJCQl9CisJCQkJaWYgKCgodEVwbERsbEFzbmRTZXJ2aWNlSWQpIHVpQXNuZFNlcnZpY2VJZCkgPT0ga0VwbERsbEFzbmRJZGVudFJlc3BvbnNlKSB7CS8vIG1lbW9yaXplIE1BQyBhZGRyZXNzIG9mIENOIGZvciBQUmVxCisJCQkJCXRFcGxEbGxrTm9kZUluZm8gKnBJbnROb2RlSW5mbzsKKworCQkJCQlwSW50Tm9kZUluZm8gPQorCQkJCQkgICAgRXBsRGxsa0dldE5vZGVJbmZvKHVpTm9kZUlkKTsKKwkJCQkJaWYgKHBJbnROb2RlSW5mbyA9PSBOVUxMKSB7CS8vIG5vIG5vZGUgaW5mbyBzdHJ1Y3R1cmUgYXZhaWxhYmxlCisJCQkJCQlSZXQgPSBrRXBsRGxsTm9Ob2RlSW5mbzsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCUVQTF9NRU1DUFkocEludE5vZGVJbmZvLT4KKwkJCQkJCQkgICBtX2JlX2FiTWFjQWRkciwKKwkJCQkJCQkgICBwRnJhbWUtPgorCQkJCQkJCSAgIG1fYmVfYWJTcmNNYWMsIDYpOworCQkJCQl9CisJCQkJfQorCQkJCS8vIGZvcndhcmQgRmxhZzIgdG8gYXN5bmNocm9ub3VzIHNjaGVkdWxlcgorCQkJCWJGbGFnMSA9CisJCQkJICAgIEFtaUdldEJ5dGVGcm9tTGUoJnBGcmFtZS0+bV9EYXRhLm1fQXNuZC4KKwkJCQkJCSAgICAgbV9QYXlsb2FkLm1fU3RhdHVzUmVzcG9uc2UuCisJCQkJCQkgICAgIG1fbGVfYkZsYWcyKTsKKwkJCQlSZXQgPQorCQkJCSAgICBFcGxEbGxrQ2FsQXN5bmNTZXRQZW5kaW5nUmVxdWVzdHModWlOb2RlSWQsCisJCQkJCQkJCSAgICAgICgodEVwbERsbEFzeW5jUmVxUHJpb3JpdHkpICgoYkZsYWcxICYgRVBMX0ZSQU1FX0ZMQUcyX1BSKSA+PiBFUExfRlJBTUVfRkxBRzJfUFJfU0hJRlQpKSwgKGJGbGFnMSAmIEVQTF9GUkFNRV9GTEFHMl9SUykpOworCQkJfQorI2VuZGlmCisKKwkJCWlmICh1aUFzbmRTZXJ2aWNlSWQgPCBFUExfRExMX01BWF9BU05EX1NFUlZJQ0VfSUQpIHsJLy8gQVNuZCBzZXJ2aWNlIElEIGlzIHZhbGlkCisJCQkJaWYgKEVwbERsbGtJbnN0YW5jZV9nLm1fYUFzbmRGaWx0ZXJbdWlBc25kU2VydmljZUlkXSA9PSBrRXBsRGxsQXNuZEZpbHRlckFueSkgewkvLyBBU25kIHNlcnZpY2UgSUQgaXMgcmVnaXN0ZXJlZAorCQkJCQkvLyBmb3J3YXJkIGZyYW1lIHZpYSBhc3luYyByZWNlaXZlIEZJRk8gdG8gdXNlcnNwYWNlCisJCQkJCVJldCA9CisJCQkJCSAgICBFcGxEbGxrQ2FsQXN5bmNGcmFtZVJlY2VpdmVkCisJCQkJCSAgICAoJkZyYW1lSW5mbyk7CisJCQkJfSBlbHNlIGlmIChFcGxEbGxrSW5zdGFuY2VfZy5tX2FBc25kRmlsdGVyW3VpQXNuZFNlcnZpY2VJZF0gPT0ga0VwbERsbEFzbmRGaWx0ZXJMb2NhbCkgewkvLyBBU25kIHNlcnZpY2UgSUQgaXMgcmVnaXN0ZXJlZCwgYnV0IG9ubHkgbG9jYWwgbm9kZSBJRCBvciBicm9hZGNhc3RzCisJCQkJCS8vIHNoYWxsIGJlIGZvcndhcmRlZAorCQkJCQl1aU5vZGVJZCA9CisJCQkJCSAgICBBbWlHZXRCeXRlRnJvbUxlKCZwRnJhbWUtPgorCQkJCQkJCSAgICAgbV9sZV9iRHN0Tm9kZUlkKTsKKwkJCQkJaWYgKCh1aU5vZGVJZCA9PQorCQkJCQkgICAgIEVwbERsbGtJbnN0YW5jZV9nLm1fRGxsQ29uZmlnUGFyYW0uCisJCQkJCSAgICAgbV91aU5vZGVJZCkKKwkJCQkJICAgIHx8ICh1aU5vZGVJZCA9PSBFUExfQ19BRFJfQlJPQURDQVNUKSkgewkvLyBBU25kIGZyYW1lIGlzIGludGVuZGVkIGZvciB1cworCQkJCQkJLy8gZm9yd2FyZCBmcmFtZSB2aWEgYXN5bmMgcmVjZWl2ZSBGSUZPIHRvIHVzZXJzcGFjZQorCQkJCQkJUmV0ID0KKwkJCQkJCSAgICBFcGxEbGxrQ2FsQXN5bmNGcmFtZVJlY2VpdmVkCisJCQkJCQkgICAgKCZGcmFtZUluZm8pOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCX0KKworCWRlZmF1bHQ6CisJCXsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKE5tdEV2ZW50ICE9IGtFcGxObXRFdmVudE5vRXZlbnQpIHsJLy8gZXZlbnQgZm9yIERMTCBhbmQgTk1UIHN0YXRlIG1hY2hpbmUgZ2VuZXJhdGVkCisJCVJldCA9IEVwbERsbGtDaGFuZ2VTdGF0ZShObXRFdmVudCwgTm10U3RhdGUpOworCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQlnb3RvIEV4aXQ7CisJCX0KKworCQlpZiAoKE5tdEV2ZW50ICE9IGtFcGxObXRFdmVudERsbENlQXNuZCkKKwkJICAgICYmICgoTm10U3RhdGUgPD0ga0VwbE5tdENzUHJlT3BlcmF0aW9uYWwxKSB8fCAoTm10RXZlbnQgIT0ga0VwbE5tdEV2ZW50RGxsQ2VQcmVzKSkpIHsJLy8gTk1UIHN0YXRlIG1hY2hpbmUgaXMgbm90IGludGVyZXN0ZWQgaW4gQVNuZCBmcmFtZXMgYW5kIFBSZXMgZnJhbWVzIHdoZW4gbm90IENzTm90QWN0aXZlIG9yIENzUHJlT3AxCisJCQkvLyBpbmZvcm0gTk1UIG1vZHVsZQorCQkJRXZlbnQubV9FdmVudFNpbmsgPSBrRXBsRXZlbnRTaW5rTm10azsKKwkJCUV2ZW50Lm1fRXZlbnRUeXBlID0ga0VwbEV2ZW50VHlwZU5tdEV2ZW50OworCQkJRXZlbnQubV91aVNpemUgPSBzaXplb2YoTm10RXZlbnQpOworCQkJRXZlbnQubV9wQXJnID0gJk5tdEV2ZW50OworCQkJUmV0ID0gRXBsRXZlbnRrUG9zdCgmRXZlbnQpOworCQl9CisJfQorCisgICAgICBFeGl0OgorCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJRFdPUkQgZHdBcmc7CisKKwkJQkVOQ0hNQVJLX01PRF8wMl9UT0dHTEUoOSk7CisKKwkJZHdBcmcgPSBFcGxEbGxrSW5zdGFuY2VfZy5tX0RsbFN0YXRlIHwgKE5tdEV2ZW50IDw8IDgpOworCisJCS8vIEVycm9yIGV2ZW50IGZvciBBUEkgbGF5ZXIKKwkJUmV0ID0gRXBsRXZlbnRrUG9zdEVycm9yKGtFcGxFdmVudFNvdXJjZURsbGssCisJCQkJCSBSZXQsIHNpemVvZihkd0FyZyksICZkd0FyZyk7CisJfQorCUJFTkNITUFSS19NT0RfMDJfUkVTRVQoMyk7CisJcmV0dXJuOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxEbGxrQ2JGcmFtZVRyYW5zbWl0dGVkKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogY2FsbGVkIGZyb20gRWRydkludGVycnVwdEhhbmRsZXIoKS4KKy8vICAgICAgICAgICAgICBJdCBzaWduYWxzCisvLworLy8gUGFyYW1ldGVyczogIHBSeEJ1ZmZlcl9wICAgICAgICAgICAgID0gcmVjZWl2ZSBidWZmZXIgc3RydWN0dXJlCisvLworLy8gUmV0dXJuczogICAgIChub25lKQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZCBFcGxEbGxrQ2JGcmFtZVRyYW5zbWl0dGVkKHRFZHJ2VHhCdWZmZXIgKiBwVHhCdWZmZXJfcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCXRFcGxFdmVudCBFdmVudDsKKwl0RXBsRGxsQXN5bmNSZXFQcmlvcml0eSBQcmlvcml0eTsKKwl0RXBsTm10U3RhdGUgTm10U3RhdGU7CisKKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1BET0spKSAhPSAwKSBcCisgICAgJiYgKEVQTF9ETExfUFJFU19SRUFEWV9BRlRFUl9TT0MgPT0gRkFMU0UpCisJdEVwbEZyYW1lSW5mbyBGcmFtZUluZm87CisjZW5kaWYKKworCU5tdFN0YXRlID0gRXBsTm10a0dldE5tdFN0YXRlKCk7CisKKwlpZiAoTm10U3RhdGUgPD0ga0VwbE5tdEdzUmVzZXRDb25maWd1cmF0aW9uKSB7CisJCWdvdG8gRXhpdDsKKwl9CisKKwlpZiAoKHBUeEJ1ZmZlcl9wIC0gRXBsRGxsa0luc3RhbmNlX2cubV9wVHhCdWZmZXIpID09IEVQTF9ETExLX1RYRlJBTUVfTk1UUkVRKSB7CS8vIGZyYW1lIGZyb20gTk1UIHJlcXVlc3QgRklGTyBzZW50CisJCS8vIG1hcmsgVHgtYnVmZmVyIGFzIGVtcHR5CisJCXBUeEJ1ZmZlcl9wLT5tX3VpVHhNc2dMZW4gPSBFUExfRExMS19CVUZMRU5fRU1QVFk7CisKKwkJLy8gcG9zdCBldmVudCB0byBETEwKKwkJUHJpb3JpdHkgPSBrRXBsRGxsQXN5bmNSZXFQcmlvTm10OworCQlFdmVudC5tX0V2ZW50U2luayA9IGtFcGxFdmVudFNpbmtEbGxrOworCQlFdmVudC5tX0V2ZW50VHlwZSA9IGtFcGxFdmVudFR5cGVEbGxrRmlsbFR4OworCQlFUExfTUVNU0VUKCZFdmVudC5tX05ldFRpbWUsIDB4MDAsIHNpemVvZihFdmVudC5tX05ldFRpbWUpKTsKKwkJRXZlbnQubV9wQXJnID0gJlByaW9yaXR5OworCQlFdmVudC5tX3VpU2l6ZSA9IHNpemVvZihQcmlvcml0eSk7CisJCVJldCA9IEVwbEV2ZW50a1Bvc3QoJkV2ZW50KTsKKwl9IGVsc2UgaWYgKChwVHhCdWZmZXJfcCAtIEVwbERsbGtJbnN0YW5jZV9nLm1fcFR4QnVmZmVyKSA9PSBFUExfRExMS19UWEZSQU1FX05PTkVQTCkgewkvLyBmcmFtZSBmcm9tIGdlbmVyaWMgcHJpb3JpdHkgRklGTyBzZW50CisJCS8vIG1hcmsgVHgtYnVmZmVyIGFzIGVtcHR5CisJCXBUeEJ1ZmZlcl9wLT5tX3VpVHhNc2dMZW4gPSBFUExfRExMS19CVUZMRU5fRU1QVFk7CisKKwkJLy8gcG9zdCBldmVudCB0byBETEwKKwkJUHJpb3JpdHkgPSBrRXBsRGxsQXN5bmNSZXFQcmlvR2VuZXJpYzsKKwkJRXZlbnQubV9FdmVudFNpbmsgPSBrRXBsRXZlbnRTaW5rRGxsazsKKwkJRXZlbnQubV9FdmVudFR5cGUgPSBrRXBsRXZlbnRUeXBlRGxsa0ZpbGxUeDsKKwkJRVBMX01FTVNFVCgmRXZlbnQubV9OZXRUaW1lLCAweDAwLCBzaXplb2YoRXZlbnQubV9OZXRUaW1lKSk7CisJCUV2ZW50Lm1fcEFyZyA9ICZQcmlvcml0eTsKKwkJRXZlbnQubV91aVNpemUgPSBzaXplb2YoUHJpb3JpdHkpOworCQlSZXQgPSBFcGxFdmVudGtQb3N0KCZFdmVudCk7CisJfQorI2lmICgoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1BET0spKSAhPSAwKSBcCisgICAgJiYgKEVQTF9ETExfUFJFU19SRUFEWV9BRlRFUl9TT0MgPT0gRkFMU0UpKSBcCisgICAgfHwgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRfTU4pKSAhPSAwKQorCWVsc2UgaWYgKChwVHhCdWZmZXJfcC0+bV9FcGxNc2dUeXBlID09IGtFcGxNc2dUeXBlUHJlcSkKKwkJIHx8IChwVHhCdWZmZXJfcC0+bV9FcGxNc2dUeXBlID09IGtFcGxNc2dUeXBlUHJlcykpIHsJLy8gUFJlcyByZXNwLiBQUmVxIGZyYW1lIHNlbnQKKworI2lmICgoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1BET0spKSAhPSAwKSBcCisgICAgICAgICAgICAmJiAoRVBMX0RMTF9QUkVTX1JFQURZX0FGVEVSX1NPQyA9PSBGQUxTRSkpCisJCXsKKwkJCS8vIGluZm9ybSBQRE8gbW9kdWxlCisJCQlGcmFtZUluZm8ubV9wRnJhbWUgPQorCQkJICAgICh0RXBsRnJhbWUgKikgcFR4QnVmZmVyX3AtPm1fcGJCdWZmZXI7CisJCQlGcmFtZUluZm8ubV91aUZyYW1lU2l6ZSA9IHBUeEJ1ZmZlcl9wLT5tX3VpTWF4QnVmZmVyTGVuOworCQkJUmV0ID0gRXBsUGRva0NiUGRvVHJhbnNtaXR0ZWQoJkZyYW1lSW5mbyk7CisJCX0KKyNlbmRpZgorCisjaWYgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRfTU4pKSAhPSAwKQorCQl7CisJCQkvLyBpZiBvd24gUHJlcyBvbiBNTiwgdHJpZ2dlciBTb0EKKwkJCWlmICgoTm10U3RhdGUgPj0ga0VwbE5tdE1zUHJlT3BlcmF0aW9uYWwyKQorCQkJICAgICYmIChwVHhCdWZmZXJfcCA9PQorCQkJCSZFcGxEbGxrSW5zdGFuY2VfZy4KKwkJCQltX3BUeEJ1ZmZlcltFUExfRExMS19UWEZSQU1FX1BSRVNdKSkgeworCQkJCVJldCA9CisJCQkJICAgIEVwbERsbGtDaGFuZ2VTdGF0ZShrRXBsTm10RXZlbnREbGxNZVNvYVRyaWcsCisJCQkJCQkgICAgICAgTm10U3RhdGUpOworCQkJfQorCQl9CisjZW5kaWYKKworI2lmIEVQTF9ETExfUFJFU19SRUFEWV9BRlRFUl9TT0EgIT0gRkFMU0UKKwkJZ290byBFeGl0OworI2VuZGlmCisJfQorI2VuZGlmCisjaWYgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRfTU4pKSAhPSAwKQorCWVsc2UgaWYgKHBUeEJ1ZmZlcl9wLT5tX0VwbE1zZ1R5cGUgPT0ga0VwbE1zZ1R5cGVTb2EpIHsJLy8gU29BIGZyYW1lIHNlbnQKKwkJdEVwbE5tdEV2ZW50IE5tdEV2ZW50ID0ga0VwbE5tdEV2ZW50RGxsTWVTb2FTZW50OworCisJCS8vIGNoZWNrIGlmIHdlIGFyZSBpbnZpdGVkCisJCWlmIChFcGxEbGxrSW5zdGFuY2VfZy5tX3VpTGFzdFRhcmdldE5vZGVJZCA9PQorCQkgICAgRXBsRGxsa0luc3RhbmNlX2cubV9EbGxDb25maWdQYXJhbS5tX3VpTm9kZUlkKSB7CisJCQl0RXBsRnJhbWUgKnBUeEZyYW1lOworCisJCQlpZiAoRXBsRGxsa0luc3RhbmNlX2cubV9MYXN0UmVxU2VydmljZUlkID09IGtFcGxEbGxSZXFTZXJ2aWNlU3RhdHVzKSB7CS8vIFN0YXR1c1JlcXVlc3QKKwkJCQlpZiAoRXBsRGxsa0luc3RhbmNlX2cubV9wVHhCdWZmZXJbRVBMX0RMTEtfVFhGUkFNRV9TVEFUVVNSRVNdLm1fcGJCdWZmZXIgIT0gTlVMTCkgewkvLyBTdGF0dXNSZXMgZG9lcyBleGlzdAorCisJCQkJCXBUeEZyYW1lID0KKwkJCQkJICAgICh0RXBsRnJhbWUgKikgRXBsRGxsa0luc3RhbmNlX2cuCisJCQkJCSAgICBtX3BUeEJ1ZmZlcgorCQkJCQkgICAgW0VQTF9ETExLX1RYRlJBTUVfU1RBVFVTUkVTXS4KKwkJCQkJICAgIG1fcGJCdWZmZXI7CisJCQkJCS8vIHVwZGF0ZSBTdGF0dXNSZXMgZnJhbWUgKE5NVCBzdGF0ZSwgRU4sIEVDLCBSUywgUFIgZmxhZ3MpCisJCQkJCUFtaVNldEJ5dGVUb0xlKCZwVHhGcmFtZS0+bV9EYXRhLm1fQXNuZC4KKwkJCQkJCSAgICAgICBtX1BheWxvYWQuCisJCQkJCQkgICAgICAgbV9TdGF0dXNSZXNwb25zZS4KKwkJCQkJCSAgICAgICBtX2xlX2JObXRTdGF0dXMsCisJCQkJCQkgICAgICAgKEJZVEUpIE5tdFN0YXRlKTsKKwkJCQkJQW1pU2V0Qnl0ZVRvTGUoJnBUeEZyYW1lLT5tX0RhdGEubV9Bc25kLgorCQkJCQkJICAgICAgIG1fUGF5bG9hZC4KKwkJCQkJCSAgICAgICBtX1N0YXR1c1Jlc3BvbnNlLgorCQkJCQkJICAgICAgIG1fbGVfYkZsYWcxLAorCQkJCQkJICAgICAgIEVwbERsbGtJbnN0YW5jZV9nLgorCQkJCQkJICAgICAgIG1fYkZsYWcxKTsKKwkJCQkJQW1pU2V0Qnl0ZVRvTGUoJnBUeEZyYW1lLT5tX0RhdGEubV9Bc25kLgorCQkJCQkJICAgICAgIG1fUGF5bG9hZC4KKwkJCQkJCSAgICAgICBtX1N0YXR1c1Jlc3BvbnNlLgorCQkJCQkJICAgICAgIG1fbGVfYkZsYWcyLAorCQkJCQkJICAgICAgIEVwbERsbGtJbnN0YW5jZV9nLgorCQkJCQkJICAgICAgIG1fYkZsYWcyKTsKKwkJCQkJLy8gc2VuZCBTdGF0dXNSZXMKKwkJCQkJUmV0ID0KKwkJCQkJICAgIEVkcnZTZW5kVHhNc2coJkVwbERsbGtJbnN0YW5jZV9nLgorCQkJCQkJCSAgbV9wVHhCdWZmZXIKKwkJCQkJCQkgIFtFUExfRExMS19UWEZSQU1FX1NUQVRVU1JFU10pOworCQkJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQkJCQlnb3RvIEV4aXQ7CisJCQkJCX0KKwkJCQkJVEdUX0RCR19TSUdOQUxfVFJBQ0VfUE9JTlQoOCk7CisKKwkJCQl9CisJCQl9IGVsc2UgaWYgKEVwbERsbGtJbnN0YW5jZV9nLm1fTGFzdFJlcVNlcnZpY2VJZCA9PSBrRXBsRGxsUmVxU2VydmljZUlkZW50KSB7CS8vIElkZW50UmVxdWVzdAorCQkJCWlmIChFcGxEbGxrSW5zdGFuY2VfZy5tX3BUeEJ1ZmZlcltFUExfRExMS19UWEZSQU1FX0lERU5UUkVTXS5tX3BiQnVmZmVyICE9IE5VTEwpIHsJLy8gSWRlbnRSZXMgZG9lcyBleGlzdAorCQkJCQlwVHhGcmFtZSA9CisJCQkJCSAgICAodEVwbEZyYW1lICopIEVwbERsbGtJbnN0YW5jZV9nLgorCQkJCQkgICAgbV9wVHhCdWZmZXIKKwkJCQkJICAgIFtFUExfRExMS19UWEZSQU1FX0lERU5UUkVTXS4KKwkJCQkJICAgIG1fcGJCdWZmZXI7CisJCQkJCS8vIHVwZGF0ZSBJZGVudFJlcyBmcmFtZSAoTk1UIHN0YXRlLCBSUywgUFIgZmxhZ3MpCisJCQkJCUFtaVNldEJ5dGVUb0xlKCZwVHhGcmFtZS0+bV9EYXRhLm1fQXNuZC4KKwkJCQkJCSAgICAgICBtX1BheWxvYWQuCisJCQkJCQkgICAgICAgbV9JZGVudFJlc3BvbnNlLgorCQkJCQkJICAgICAgIG1fbGVfYk5tdFN0YXR1cywKKwkJCQkJCSAgICAgICAoQllURSkgTm10U3RhdGUpOworCQkJCQlBbWlTZXRCeXRlVG9MZSgmcFR4RnJhbWUtPm1fRGF0YS5tX0FzbmQuCisJCQkJCQkgICAgICAgbV9QYXlsb2FkLgorCQkJCQkJICAgICAgIG1fSWRlbnRSZXNwb25zZS4KKwkJCQkJCSAgICAgICBtX2xlX2JGbGFnMiwKKwkJCQkJCSAgICAgICBFcGxEbGxrSW5zdGFuY2VfZy4KKwkJCQkJCSAgICAgICBtX2JGbGFnMik7CisJCQkJCS8vIHNlbmQgSWRlbnRSZXMKKwkJCQkJUmV0ID0KKwkJCQkJICAgIEVkcnZTZW5kVHhNc2coJkVwbERsbGtJbnN0YW5jZV9nLgorCQkJCQkJCSAgbV9wVHhCdWZmZXIKKwkJCQkJCQkgIFtFUExfRExMS19UWEZSQU1FX0lERU5UUkVTXSk7CisJCQkJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCQkJCWdvdG8gRXhpdDsKKwkJCQkJfQorCQkJCQlUR1RfREJHX1NJR05BTF9UUkFDRV9QT0lOVCg3KTsKKwkJCQl9CisJCQl9IGVsc2UgaWYgKEVwbERsbGtJbnN0YW5jZV9nLm1fTGFzdFJlcVNlcnZpY2VJZCA9PSBrRXBsRGxsUmVxU2VydmljZU5tdFJlcXVlc3QpIHsJLy8gTm10UmVxdWVzdAorCQkJCWlmIChFcGxEbGxrSW5zdGFuY2VfZy5tX3BUeEJ1ZmZlcltFUExfRExMS19UWEZSQU1FX05NVFJFUV0ubV9wYkJ1ZmZlciAhPSBOVUxMKSB7CS8vIE5tdFJlcXVlc3QgZG9lcyBleGlzdAorCQkJCQkvLyBjaGVjayBpZiBmcmFtZSBpcyBub3QgZW1wdHkgYW5kIG5vdCBiZWluZyBmaWxsZWQKKwkJCQkJaWYgKEVwbERsbGtJbnN0YW5jZV9nLgorCQkJCQkgICAgbV9wVHhCdWZmZXIKKwkJCQkJICAgIFtFUExfRExMS19UWEZSQU1FX05NVFJFUV0uCisJCQkJCSAgICBtX3VpVHhNc2dMZW4gPgorCQkJCQkgICAgRVBMX0RMTEtfQlVGTEVOX0ZJTExJTkcpIHsKKwkJCQkJCS8vIGNoZWNrIGlmIHRoaXMgZnJhbWUgaXMgYSBOTVQgY29tbWFuZCwKKwkJCQkJCS8vIHRoZW4gZm9yd2FyZCB0aGlzIGZyYW1lIGJhY2sgdG8gTm10TW51IG1vZHVsZSwKKwkJCQkJCS8vIGJlY2F1c2UgaXQgbmVlZHMgdGhlIHRpbWUsIHdoZW4gdGhpcyBmcmFtZSBpcworCQkJCQkJLy8gYWN0dWFsbHkgc2VudCwgdG8gc3RhcnQgdGhlIHRpbWVyIGZvciBtb25pdG9yaW5nCisJCQkJCQkvLyB0aGUgTk1UIHN0YXRlIGNoYW5nZS4KKworCQkJCQkJcFR4RnJhbWUgPQorCQkJCQkJICAgICh0RXBsRnJhbWUgKikKKwkJCQkJCSAgICBFcGxEbGxrSW5zdGFuY2VfZy4KKwkJCQkJCSAgICBtX3BUeEJ1ZmZlcgorCQkJCQkJICAgIFtFUExfRExMS19UWEZSQU1FX05NVFJFUV0uCisJCQkJCQkgICAgbV9wYkJ1ZmZlcjsKKwkJCQkJCWlmICgoQW1pR2V0Qnl0ZUZyb21MZQorCQkJCQkJICAgICAoJnBUeEZyYW1lLT4KKwkJCQkJCSAgICAgIG1fbGVfYk1lc3NhZ2VUeXBlKQorCQkJCQkJICAgICA9PSAoQllURSkga0VwbE1zZ1R5cGVBc25kKQorCQkJCQkJICAgICYmCisJCQkJCQkgICAgKEFtaUdldEJ5dGVGcm9tTGUKKwkJCQkJCSAgICAgKCZwVHhGcmFtZS0+bV9EYXRhLm1fQXNuZC4KKwkJCQkJCSAgICAgIG1fbGVfYlNlcnZpY2VJZCkKKwkJCQkJCSAgICAgPT0gKEJZVEUpIGtFcGxEbGxBc25kTm10Q29tbWFuZCkpIHsJLy8gcG9zdCBldmVudCBkaXJlY3RseSB0byBObXRNbnUgbW9kdWxlCisJCQkJCQkJRXZlbnQubV9FdmVudFNpbmsgPQorCQkJCQkJCSAgICBrRXBsRXZlbnRTaW5rTm10TW51OworCQkJCQkJCUV2ZW50Lm1fRXZlbnRUeXBlID0KKwkJCQkJCQkgICAga0VwbEV2ZW50VHlwZU5tdE1udU5tdENtZFNlbnQ7CisJCQkJCQkJRXZlbnQubV91aVNpemUgPQorCQkJCQkJCSAgICBFcGxEbGxrSW5zdGFuY2VfZy4KKwkJCQkJCQkgICAgbV9wVHhCdWZmZXIKKwkJCQkJCQkgICAgW0VQTF9ETExLX1RYRlJBTUVfTk1UUkVRXS4KKwkJCQkJCQkgICAgbV91aVR4TXNnTGVuOworCQkJCQkJCUV2ZW50Lm1fcEFyZyA9IHBUeEZyYW1lOworCQkJCQkJCVJldCA9CisJCQkJCQkJICAgIEVwbEV2ZW50a1Bvc3QKKwkJCQkJCQkgICAgKCZFdmVudCk7CisKKwkJCQkJCX0KKwkJCQkJCS8vIHNlbmQgTm10UmVxdWVzdAorCQkJCQkJUmV0ID0KKwkJCQkJCSAgICBFZHJ2U2VuZFR4TXNnCisJCQkJCQkgICAgKCZFcGxEbGxrSW5zdGFuY2VfZy4KKwkJCQkJCSAgICAgbV9wVHhCdWZmZXIKKwkJCQkJCSAgICAgW0VQTF9ETExLX1RYRlJBTUVfTk1UUkVRXSk7CisJCQkJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQkJCQkJZ290byBFeGl0OworCQkJCQkJfQorCisJCQkJCX0KKwkJCQl9CisKKwkJCX0gZWxzZSBpZiAoRXBsRGxsa0luc3RhbmNlX2cubV9MYXN0UmVxU2VydmljZUlkID09IGtFcGxEbGxSZXFTZXJ2aWNlVW5zcGVjaWZpZWQpIHsJLy8gdW5zcGVjaWZpZWQgaW52aXRlCisJCQkJaWYgKEVwbERsbGtJbnN0YW5jZV9nLm1fcFR4QnVmZmVyW0VQTF9ETExLX1RYRlJBTUVfTk9ORVBMXS5tX3BiQnVmZmVyICE9IE5VTEwpIHsJLy8gbm9uLUVQTCBmcmFtZSBkb2VzIGV4aXN0CisJCQkJCS8vIGNoZWNrIGlmIGZyYW1lIGlzIG5vdCBlbXB0eSBhbmQgbm90IGJlaW5nIGZpbGxlZAorCQkJCQlpZiAoRXBsRGxsa0luc3RhbmNlX2cuCisJCQkJCSAgICBtX3BUeEJ1ZmZlcgorCQkJCQkgICAgW0VQTF9ETExLX1RYRlJBTUVfTk9ORVBMXS4KKwkJCQkJICAgIG1fdWlUeE1zZ0xlbiA+CisJCQkJCSAgICBFUExfRExMS19CVUZMRU5fRklMTElORykgeworCQkJCQkJLy8gc2VuZCBub24tRVBMIGZyYW1lCisJCQkJCQlSZXQgPQorCQkJCQkJICAgIEVkcnZTZW5kVHhNc2cKKwkJCQkJCSAgICAoJkVwbERsbGtJbnN0YW5jZV9nLgorCQkJCQkJICAgICBtX3BUeEJ1ZmZlcgorCQkJCQkJICAgICBbRVBMX0RMTEtfVFhGUkFNRV9OT05FUExdKTsKKwkJCQkJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCQkJCQlnb3RvIEV4aXQ7CisJCQkJCQl9CisKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCS8vIEFTbmQgZnJhbWUgd2FzIHNlbnQsIHJlbW92ZSB0aGUgcmVxdWVzdAorCQkJRXBsRGxsa0luc3RhbmNlX2cubV9MYXN0UmVxU2VydmljZUlkID0KKwkJCSAgICBrRXBsRGxsUmVxU2VydmljZU5vOworCQl9CisJCS8vIGZvcndhcmQgZXZlbnQgdG8gRXJyb3JIYW5kbGVyIGFuZCBQRE8gbW9kdWxlCisJCUV2ZW50Lm1fRXZlbnRTaW5rID0ga0VwbEV2ZW50U2lua05tdGs7CisJCUV2ZW50Lm1fRXZlbnRUeXBlID0ga0VwbEV2ZW50VHlwZU5tdEV2ZW50OworCQlFdmVudC5tX3VpU2l6ZSA9IHNpemVvZihObXRFdmVudCk7CisJCUV2ZW50Lm1fcEFyZyA9ICZObXRFdmVudDsKKwkJUmV0ID0gRXBsRXZlbnRrUG9zdCgmRXZlbnQpOworCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQlnb3RvIEV4aXQ7CisJCX0KKwl9CisjZW5kaWYKKworI2lmIEVQTF9ETExfUFJFU19SRUFEWV9BRlRFUl9TT0EgIT0gRkFMU0UKKwllbHNlIHsJCQkvLyBkLmsuOiBXaHkgdGhhdCBlbHNlPyBvbiBDTiBpdCBpcyBlbnRlcmVkIG9uIElkZW50UmVzIGFuZCBTdGF0dXNSZXMKKwkJZ290byBFeGl0OworCX0KKworCS8vIHNpZ25hbCBwcm9jZXNzIGZ1bmN0aW9uIHJlYWRpbmVzcyBvZiBQUmVzIGZyYW1lCisJRXZlbnQubV9FdmVudFNpbmsgPSBrRXBsRXZlbnRTaW5rRGxsazsKKwlFdmVudC5tX0V2ZW50VHlwZSA9IGtFcGxFdmVudFR5cGVEbGxrUHJlc1JlYWR5OworCUV2ZW50Lm1fdWlTaXplID0gMDsKKwlFdmVudC5tX3BBcmcgPSBOVUxMOworCVJldCA9IEVwbEV2ZW50a1Bvc3QoJkV2ZW50KTsKKworI2VuZGlmCisKKyAgICAgIEV4aXQ6CisJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQlEV09SRCBkd0FyZzsKKworCQlCRU5DSE1BUktfTU9EXzAyX1RPR0dMRSg5KTsKKworCQlkd0FyZyA9CisJCSAgICBFcGxEbGxrSW5zdGFuY2VfZy5tX0RsbFN0YXRlIHwgKHBUeEJ1ZmZlcl9wLT4KKwkJCQkJCSAgICBtX0VwbE1zZ1R5cGUgPDwgMTYpOworCisJCS8vIEVycm9yIGV2ZW50IGZvciBBUEkgbGF5ZXIKKwkJUmV0ID0gRXBsRXZlbnRrUG9zdEVycm9yKGtFcGxFdmVudFNvdXJjZURsbGssCisJCQkJCSBSZXQsIHNpemVvZihkd0FyZyksICZkd0FyZyk7CisJfQorCisJcmV0dXJuOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxEbGxrQ2hlY2tGcmFtZSgpCisvLworLy8gRGVzY3JpcHRpb246IGNoZWNrIGZyYW1lIGFuZCBzZXQgbWlzc2luZyBpbmZvcm1hdGlvbgorLy8KKy8vIFBhcmFtZXRlcnM6ICBwRnJhbWVfcCAgICAgICAgICAgICAgICA9IGV0aGVybmV0IGZyYW1lCisvLyAgICAgICAgICAgICAgdWlGcmFtZVNpemVfcCAgICAgICAgICAgPSBzaXplIG9mIGZyYW1lCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdEVwbEtlcm5lbCBFcGxEbGxrQ2hlY2tGcmFtZSh0RXBsRnJhbWUgKiBwRnJhbWVfcCwKKwkJCQkgICAgdW5zaWduZWQgaW50IHVpRnJhbWVTaXplX3ApCit7CisJdEVwbE1zZ1R5cGUgTXNnVHlwZTsKKwlXT1JEIHdFdGhlclR5cGU7CisKKwkvLyBjaGVjayBmcmFtZQorCWlmIChwRnJhbWVfcCAhPSBOVUxMKSB7CisJCS8vIGNoZWNrIFNyY01BQworCQlpZiAoQW1pR2V0UXdvcmQ0OEZyb21CZShwRnJhbWVfcC0+bV9iZV9hYlNyY01hYykgPT0gMCkgeworCQkJLy8gc291cmNlIE1BQyBhZGRyZXNzCisJCQlFUExfTUVNQ1BZKCZwRnJhbWVfcC0+bV9iZV9hYlNyY01hY1swXSwKKwkJCQkgICAmRXBsRGxsa0luc3RhbmNlX2cubV9iZV9hYlNyY01hY1swXSwgNik7CisJCX0KKwkJLy8gY2hlY2sgZXRoZXJ0eXBlCisJCXdFdGhlclR5cGUgPSBBbWlHZXRXb3JkRnJvbUJlKCZwRnJhbWVfcC0+bV9iZV93RXRoZXJUeXBlKTsKKwkJaWYgKHdFdGhlclR5cGUgPT0gMCkgeworCQkJLy8gYXNzdW1lIEVQTCBmcmFtZQorCQkJd0V0aGVyVHlwZSA9IEVQTF9DX0RMTF9FVEhFUlRZUEVfRVBMOworCQkJQW1pU2V0V29yZFRvQmUoJnBGcmFtZV9wLT5tX2JlX3dFdGhlclR5cGUsIHdFdGhlclR5cGUpOworCQl9CisKKwkJaWYgKHdFdGhlclR5cGUgPT0gRVBMX0NfRExMX0VUSEVSVFlQRV9FUEwpIHsKKwkJCS8vIHNvdXJjZSBub2RlIElECisJCQlBbWlTZXRCeXRlVG9MZSgmcEZyYW1lX3AtPm1fbGVfYlNyY05vZGVJZCwKKwkJCQkgICAgICAgKEJZVEUpIEVwbERsbGtJbnN0YW5jZV9nLgorCQkJCSAgICAgICBtX0RsbENvbmZpZ1BhcmFtLm1fdWlOb2RlSWQpOworCisJCQkvLyBjaGVjayBtZXNzYWdlIHR5cGUKKwkJCU1zZ1R5cGUgPQorCQkJICAgIEFtaUdldEJ5dGVGcm9tTGUoJnBGcmFtZV9wLT5tX2xlX2JNZXNzYWdlVHlwZSk7CisJCQlpZiAoTXNnVHlwZSA9PSAwKSB7CisJCQkJTXNnVHlwZSA9IGtFcGxNc2dUeXBlQXNuZDsKKwkJCQlBbWlTZXRCeXRlVG9MZSgmcEZyYW1lX3AtPm1fbGVfYk1lc3NhZ2VUeXBlLAorCQkJCQkgICAgICAgKEJZVEUpIE1zZ1R5cGUpOworCQkJfQorCisJCQlpZiAoTXNnVHlwZSA9PSBrRXBsTXNnVHlwZUFzbmQpIHsKKwkJCQkvLyBkZXN0aW5hdGlvbiBNQUMgYWRkcmVzcworCQkJCUFtaVNldFF3b3JkNDhUb0JlKCZwRnJhbWVfcC0+bV9iZV9hYkRzdE1hY1swXSwKKwkJCQkJCSAgRVBMX0NfRExMX01VTFRJQ0FTVF9BU05EKTsKKwkJCX0KKworCQl9CisJfQorCisJcmV0dXJuIGtFcGxTdWNjZXNzZnVsOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxEbGxrQ2JDblRpbWVyKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogY2FsbGVkIGJ5IHRpbWVyIG1vZHVsZS4gSXQgbW9uaXRvcnMgdGhlIEVQTCBjeWNsZSB3aGVuIGl0IGlzIGEgQ04uCisvLworLy8gUGFyYW1ldGVyczogIHBFdmVudEFyZ19wICAgICAgICAgICAgID0gdGltZXIgZXZlbnQgYXJndW1lbnQKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZiBFUExfVElNRVJfVVNFX0hJR0hSRVMgIT0gRkFMU0UKK3N0YXRpYyB0RXBsS2VybmVsIFBVQkxJQyBFcGxEbGxrQ2JDblRpbWVyKHRFcGxUaW1lckV2ZW50QXJnICogcEV2ZW50QXJnX3ApCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwl0RXBsTm10U3RhdGUgTm10U3RhdGU7CisKKyNpZiBFUExfVElNRVJfVVNFX0hJR0hSRVMgIT0gRkFMU0UKKwlpZiAocEV2ZW50QXJnX3AtPm1fVGltZXJIZGwgIT0gRXBsRGxsa0luc3RhbmNlX2cubV9UaW1lckhkbEN5Y2xlKSB7CS8vIHpvbWJpZSBjYWxsYmFjaworCQkvLyBqdXN0IGV4aXQKKwkJZ290byBFeGl0OworCX0KKyNlbmRpZgorCisJTm10U3RhdGUgPSBFcGxObXRrR2V0Tm10U3RhdGUoKTsKKworCWlmIChObXRTdGF0ZSA8PSBrRXBsTm10R3NSZXNldENvbmZpZ3VyYXRpb24pIHsKKwkJZ290byBFeGl0OworCX0KKworCVJldCA9IEVwbERsbGtDaGFuZ2VTdGF0ZShrRXBsTm10RXZlbnREbGxDZUZyYW1lVGltZW91dCwgTm10U3RhdGUpOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKwkvLyAyMDA4LzEwLzE1IGQuay4gcmVwcm9ncmFtbWluZyBvZiB0aW1lciBub3QgbmVjZXNzYXJ5LAorCS8vIGJlY2F1c2UgaXQgd2lsbCBiZSBwcm9ncmFtbWVkLCB3aGVuIFNvQyBpcyByZWNlaXZlZC4KKy8qCisgICAgLy8gcmVwcm9ncmFtIHRpbWVyCisjaWYgRVBMX1RJTUVSX1VTRV9ISUdIUkVTICE9IEZBTFNFCisgICAgaWYgKChObXRTdGF0ZSA+IGtFcGxObXRDc1ByZU9wZXJhdGlvbmFsMSkKKyAgICAgICAgJiYgKEVwbERsbGtJbnN0YW5jZV9nLm1fdWxsRnJhbWVUaW1lb3V0ICE9IDApKQorICAgIHsKKyAgICAgICAgUmV0ID0gRXBsVGltZXJIaWdoUmVza01vZGlmeVRpbWVyTnMoJkVwbERsbGtJbnN0YW5jZV9nLm1fVGltZXJIZGxDeWNsZSwgRXBsRGxsa0luc3RhbmNlX2cubV91bGxGcmFtZVRpbWVvdXQsIEVwbERsbGtDYkNuVGltZXIsIDBMLCBGQUxTRSk7CisgICAgfQorI2VuZGlmCisqLworCisgICAgICBFeGl0OgorCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJRFdPUkQgZHdBcmc7CisKKwkJQkVOQ0hNQVJLX01PRF8wMl9UT0dHTEUoOSk7CisKKwkJZHdBcmcgPQorCQkgICAgRXBsRGxsa0luc3RhbmNlX2cuCisJCSAgICBtX0RsbFN0YXRlIHwgKGtFcGxObXRFdmVudERsbENlRnJhbWVUaW1lb3V0IDw8IDgpOworCisJCS8vIEVycm9yIGV2ZW50IGZvciBBUEkgbGF5ZXIKKwkJUmV0ID0gRXBsRXZlbnRrUG9zdEVycm9yKGtFcGxFdmVudFNvdXJjZURsbGssCisJCQkJCSBSZXQsIHNpemVvZihkd0FyZyksICZkd0FyZyk7CisJfQorCisJcmV0dXJuIFJldDsKK30KKyNlbmRpZgorCisjaWYgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRfTU4pKSAhPSAwKQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxEbGxrQ2JNblRpbWVyQ3ljbGUoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBjYWxsZWQgYnkgdGltZXIgbW9kdWxlLiBJdCB0cmlnZ2VycyB0aGUgU29DIHdoZW4gaXQgaXMgYSBNTi4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgcEV2ZW50QXJnX3AgICAgICAgICAgICAgPSB0aW1lciBldmVudCBhcmd1bWVudAorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHRFcGxLZXJuZWwgUFVCTElDIEVwbERsbGtDYk1uVGltZXJDeWNsZSh0RXBsVGltZXJFdmVudEFyZyAqIHBFdmVudEFyZ19wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJdEVwbE5tdFN0YXRlIE5tdFN0YXRlOworCisjaWYgRVBMX1RJTUVSX1VTRV9ISUdIUkVTICE9IEZBTFNFCisJaWYgKHBFdmVudEFyZ19wLT5tX1RpbWVySGRsICE9IEVwbERsbGtJbnN0YW5jZV9nLm1fVGltZXJIZGxDeWNsZSkgewkvLyB6b21iaWUgY2FsbGJhY2sKKwkJLy8ganVzdCBleGl0CisJCWdvdG8gRXhpdDsKKwl9CisjZW5kaWYKKworCU5tdFN0YXRlID0gRXBsTm10a0dldE5tdFN0YXRlKCk7CisKKwlpZiAoTm10U3RhdGUgPD0ga0VwbE5tdEdzUmVzZXRDb25maWd1cmF0aW9uKSB7CisJCWdvdG8gRXhpdDsKKwl9CisKKwlSZXQgPSBFcGxEbGxrQ2hhbmdlU3RhdGUoa0VwbE5tdEV2ZW50RGxsTWVTb2NUcmlnLCBObXRTdGF0ZSk7CisKKyAgICAgIEV4aXQ6CisJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQlEV09SRCBkd0FyZzsKKworCQlCRU5DSE1BUktfTU9EXzAyX1RPR0dMRSg5KTsKKworCQlkd0FyZyA9CisJCSAgICBFcGxEbGxrSW5zdGFuY2VfZy4KKwkJICAgIG1fRGxsU3RhdGUgfCAoa0VwbE5tdEV2ZW50RGxsTWVTb2NUcmlnIDw8IDgpOworCisJCS8vIEVycm9yIGV2ZW50IGZvciBBUEkgbGF5ZXIKKwkJUmV0ID0gRXBsRXZlbnRrUG9zdEVycm9yKGtFcGxFdmVudFNvdXJjZURsbGssCisJCQkJCSBSZXQsIHNpemVvZihkd0FyZyksICZkd0FyZyk7CisJfQorCisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsRGxsa0NiTW5UaW1lclJlc3BvbnNlKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogY2FsbGVkIGJ5IHRpbWVyIG1vZHVsZS4gSXQgbW9uaXRvcnMgdGhlIFBSZXMgdGltZW91dC4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgcEV2ZW50QXJnX3AgICAgICAgICAgICAgPSB0aW1lciBldmVudCBhcmd1bWVudAorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHRFcGxLZXJuZWwgUFVCTElDIEVwbERsbGtDYk1uVGltZXJSZXNwb25zZSh0RXBsVGltZXJFdmVudEFyZyAqCisJCQkJCQkgIHBFdmVudEFyZ19wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJdEVwbE5tdFN0YXRlIE5tdFN0YXRlOworCisjaWYgRVBMX1RJTUVSX1VTRV9ISUdIUkVTICE9IEZBTFNFCisJaWYgKHBFdmVudEFyZ19wLT5tX1RpbWVySGRsICE9IEVwbERsbGtJbnN0YW5jZV9nLm1fVGltZXJIZGxSZXNwb25zZSkgewkvLyB6b21iaWUgY2FsbGJhY2sKKwkJLy8ganVzdCBleGl0CisJCWdvdG8gRXhpdDsKKwl9CisjZW5kaWYKKworCU5tdFN0YXRlID0gRXBsTm10a0dldE5tdFN0YXRlKCk7CisKKwlpZiAoTm10U3RhdGUgPD0ga0VwbE5tdEdzUmVzZXRDb25maWd1cmF0aW9uKSB7CisJCWdvdG8gRXhpdDsKKwl9CisKKwlSZXQgPSBFcGxEbGxrQ2hhbmdlU3RhdGUoa0VwbE5tdEV2ZW50RGxsTWVQcmVzVGltZW91dCwgTm10U3RhdGUpOworCisgICAgICBFeGl0OgorCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJRFdPUkQgZHdBcmc7CisKKwkJQkVOQ0hNQVJLX01PRF8wMl9UT0dHTEUoOSk7CisKKwkJZHdBcmcgPQorCQkgICAgRXBsRGxsa0luc3RhbmNlX2cuCisJCSAgICBtX0RsbFN0YXRlIHwgKGtFcGxObXRFdmVudERsbE1lUHJlc1RpbWVvdXQgPDwgOCk7CisKKwkJLy8gRXJyb3IgZXZlbnQgZm9yIEFQSSBsYXllcgorCQlSZXQgPSBFcGxFdmVudGtQb3N0RXJyb3Ioa0VwbEV2ZW50U291cmNlRGxsaywKKwkJCQkJIFJldCwgc2l6ZW9mKGR3QXJnKSwgJmR3QXJnKTsKKwl9CisKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxEbGxrR2V0Tm9kZUluZm8oKQorLy8KKy8vIERlc2NyaXB0aW9uOiByZXR1cm5zIG5vZGUgaW5mbyBzdHJ1Y3R1cmUgb2YgdGhlIHNwZWNpZmllZCBub2RlLgorLy8KKy8vIFBhcmFtZXRlcnM6ICB1aU5vZGVJZF9wICAgICAgICAgICAgICA9IG5vZGUgSUQKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbERsbGtOb2RlSW5mbyogICAgICAgPSBwb2ludGVyIHRvIGludGVybmFsIG5vZGUgaW5mbyBzdHJ1Y3R1cmUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHRFcGxEbGxrTm9kZUluZm8gKkVwbERsbGtHZXROb2RlSW5mbyh1bnNpZ25lZCBpbnQgdWlOb2RlSWRfcCkKK3sKKwkvLyAkJCQgZC5rLjogdXNlIGhhc2ggYWxnb3JpdGhtIHRvIHJldHJpZXZlIHRoZSBhcHByb3ByaWF0ZSBub2RlIGluZm8gc3RydWN0dXJlCisJLy8gICAgICAgICAgIGlmIHNpemUgb2YgYXJyYXkgaXMgbGVzcyB0aGFuIDI1NC4KKwl1aU5vZGVJZF9wLS07CQkvLyBub2RlIElEIHN0YXJ0cyBhdCAxIGJ1dCBhcnJheSBhdCAwCisJaWYgKHVpTm9kZUlkX3AgPj0gdGFiZW50cmllcyhFcGxEbGxrSW5zdGFuY2VfZy5tX2FOb2RlSW5mbykpIHsKKwkJcmV0dXJuIE5VTEw7CisJfSBlbHNlIHsKKwkJcmV0dXJuICZFcGxEbGxrSW5zdGFuY2VfZy5tX2FOb2RlSW5mb1t1aU5vZGVJZF9wXTsKKwl9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbERsbGtNblNlbmRTb2EoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBpdCB1cGRhdGVzIGFuZCB0cmFuc21pdHMgdGhlIFNvQS4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgTm10U3RhdGVfcCAgICAgICAgICAgICAgPSBjdXJyZW50IE5NVCBzdGF0ZQorLy8gICAgICAgICAgICAgIHBEbGxTdGF0ZVByb3Bvc2VkX3AgICAgID0gcHJvcG9zZWQgRExMIHN0YXRlCisvLyAgICAgICAgICAgICAgZkVuYWJsZUludml0YXRpb25fcCAgICAgPSBlbmFibGUgaW52aXRhdGlvbiBmb3IgYXN5bmNocm9ub3VzIHBoYXNlCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdCB3aWxsIGJlIGRpc2FibGVkIGZvciBFUExfQ19ETExfUFJFT1AxX1NUQVJUX0NZQ0xFUyBTb0FzCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdEVwbEtlcm5lbCBFcGxEbGxrTW5TZW5kU29hKHRFcGxObXRTdGF0ZSBObXRTdGF0ZV9wLAorCQkJCSAgIHRFcGxEbGxTdGF0ZSAqIHBEbGxTdGF0ZVByb3Bvc2VkX3AsCisJCQkJICAgQk9PTCBmRW5hYmxlSW52aXRhdGlvbl9wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJdEVkcnZUeEJ1ZmZlciAqcFR4QnVmZmVyID0gTlVMTDsKKwl0RXBsRnJhbWUgKnBUeEZyYW1lOworCXRFcGxEbGxrTm9kZUluZm8gKnBOb2RlSW5mbzsKKworCSpwRGxsU3RhdGVQcm9wb3NlZF9wID0ga0VwbERsbE1zTm9uQ3ljbGljOworCisJcFR4QnVmZmVyID0gJkVwbERsbGtJbnN0YW5jZV9nLm1fcFR4QnVmZmVyW0VQTF9ETExLX1RYRlJBTUVfU09BXTsKKwlpZiAocFR4QnVmZmVyLT5tX3BiQnVmZmVyICE9IE5VTEwpIHsJLy8gU29BIGRvZXMgZXhpc3QKKwkJcFR4RnJhbWUgPSAodEVwbEZyYW1lICopIHBUeEJ1ZmZlci0+bV9wYkJ1ZmZlcjsKKworCQlpZiAoZkVuYWJsZUludml0YXRpb25fcCAhPSBGQUxTRSkgewkvLyBmZXRjaCB0YXJnZXQgb2YgYXN5bmNocm9ub3VzIHBoYXNlCisJCQlpZiAoRXBsRGxsa0luc3RhbmNlX2cubV9iRmxhZzIgPT0gMCkgewkvLyBvd24gcXVldWVzIGFyZSBlbXB0eQorCQkJCUVwbERsbGtJbnN0YW5jZV9nLm1fTGFzdFJlcVNlcnZpY2VJZCA9CisJCQkJICAgIGtFcGxEbGxSZXFTZXJ2aWNlTm87CisJCQl9IGVsc2UgaWYgKCgodEVwbERsbEFzeW5jUmVxUHJpb3JpdHkpIChFcGxEbGxrSW5zdGFuY2VfZy5tX2JGbGFnMiA+PiBFUExfRlJBTUVfRkxBRzJfUFJfU0hJRlQpKSA9PSBrRXBsRGxsQXN5bmNSZXFQcmlvTm10KSB7CS8vIGZyYW1lcyBpbiBvd24gTk1UIHJlcXVlc3QgcXVldWUgYXZhaWxhYmxlCisJCQkJRXBsRGxsa0luc3RhbmNlX2cubV9MYXN0UmVxU2VydmljZUlkID0KKwkJCQkgICAga0VwbERsbFJlcVNlcnZpY2VObXRSZXF1ZXN0OworCQkJfSBlbHNlIHsKKwkJCQlFcGxEbGxrSW5zdGFuY2VfZy5tX0xhc3RSZXFTZXJ2aWNlSWQgPQorCQkJCSAgICBrRXBsRGxsUmVxU2VydmljZVVuc3BlY2lmaWVkOworCQkJfQorCQkJUmV0ID0KKwkJCSAgICBFcGxEbGxrQ2FsQXN5bmNHZXRTb2FSZXF1ZXN0KCZFcGxEbGxrSW5zdGFuY2VfZy4KKwkJCQkJCQkgbV9MYXN0UmVxU2VydmljZUlkLAorCQkJCQkJCSAmRXBsRGxsa0luc3RhbmNlX2cuCisJCQkJCQkJIG1fdWlMYXN0VGFyZ2V0Tm9kZUlkKTsKKwkJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCQlnb3RvIEV4aXQ7CisJCQl9CisJCQlpZiAoRXBsRGxsa0luc3RhbmNlX2cubV9MYXN0UmVxU2VydmljZUlkICE9IGtFcGxEbGxSZXFTZXJ2aWNlTm8pIHsJLy8gYXN5bmNocm9ub3VzIHBoYXNlIHdpbGwgYmUgYXNzaWduZWQgdG8gb25lIG5vZGUKKwkJCQlpZiAoRXBsRGxsa0luc3RhbmNlX2cubV91aUxhc3RUYXJnZXROb2RlSWQgPT0gRVBMX0NfQURSX0lOVkFMSUQpIHsJLy8gZXhjaGFuZ2UgaW52YWxpZCBub2RlIElEIHdpdGggbG9jYWwgbm9kZSBJRAorCQkJCQlFcGxEbGxrSW5zdGFuY2VfZy5tX3VpTGFzdFRhcmdldE5vZGVJZCA9CisJCQkJCSAgICBFcGxEbGxrSW5zdGFuY2VfZy5tX0RsbENvbmZpZ1BhcmFtLgorCQkJCQkgICAgbV91aU5vZGVJZDsKKwkJCQkJLy8gZC5rLiBETEwgc3RhdGUgV2FpdEFzbmRUcmlnIGlzIG5vdCBoZWxwZnVsOworCQkJCQkvLyAgICAgIHNvIGp1c3Qgc3RlcCBvdmVyIHRvIFdhaXRTb2NUcmlnLAorCQkJCQkvLyAgICAgIGJlY2F1c2Ugb3duIEFTbmQgaXMgc2VudCBhdXRvbWF0aWNhbGx5IGluIENiRnJhbWVUcmFuc21pdHRlZCgpIGFmdGVyIFNvQS4KKwkJCQkJLy8qcERsbFN0YXRlUHJvcG9zZWRfcCA9IGtFcGxEbGxNc1dhaXRBc25kVHJpZzsKKwkJCQkJKnBEbGxTdGF0ZVByb3Bvc2VkX3AgPQorCQkJCQkgICAga0VwbERsbE1zV2FpdFNvY1RyaWc7CisJCQkJfSBlbHNlIHsJLy8gYXNzaWdubWVudCB0byBDTgorCQkJCQkqcERsbFN0YXRlUHJvcG9zZWRfcCA9CisJCQkJCSAgICBrRXBsRGxsTXNXYWl0QXNuZDsKKwkJCQl9CisKKwkJCQlwTm9kZUluZm8gPQorCQkJCSAgICBFcGxEbGxrR2V0Tm9kZUluZm8oRXBsRGxsa0luc3RhbmNlX2cuCisJCQkJCQkgICAgICAgbV91aUxhc3RUYXJnZXROb2RlSWQpOworCQkJCWlmIChwTm9kZUluZm8gPT0gTlVMTCkgewkvLyBubyBub2RlIGluZm8gc3RydWN0dXJlIGF2YWlsYWJsZQorCQkJCQlSZXQgPSBrRXBsRGxsTm9Ob2RlSW5mbzsKKwkJCQkJZ290byBFeGl0OworCQkJCX0KKwkJCQkvLyB1cGRhdGUgZnJhbWUgKEVBLCBFUiBmbGFncykKKwkJCQlBbWlTZXRCeXRlVG9MZSgmcFR4RnJhbWUtPm1fRGF0YS5tX1NvYS4KKwkJCQkJICAgICAgIG1fbGVfYkZsYWcxLAorCQkJCQkgICAgICAgcE5vZGVJbmZvLT4KKwkJCQkJICAgICAgIG1fYlNvYUZsYWcxICYgKEVQTF9GUkFNRV9GTEFHMV9FQQorCQkJCQkJCSAgICAgIHwKKwkJCQkJCQkgICAgICBFUExfRlJBTUVfRkxBRzFfRVIpKTsKKwkJCX0gZWxzZSB7CS8vIG5vIGFzc2lnbm1lbnQgb2YgYXN5bmNocm9ub3VzIHBoYXNlCisJCQkJKnBEbGxTdGF0ZVByb3Bvc2VkX3AgPSBrRXBsRGxsTXNXYWl0U29jVHJpZzsKKwkJCQlFcGxEbGxrSW5zdGFuY2VfZy5tX3VpTGFzdFRhcmdldE5vZGVJZCA9CisJCQkJICAgIEVQTF9DX0FEUl9JTlZBTElEOworCQkJfQorCisJCQkvLyB1cGRhdGUgZnJhbWUgKHRhcmdldCkKKwkJCUFtaVNldEJ5dGVUb0xlKCZwVHhGcmFtZS0+bV9EYXRhLm1fU29hLgorCQkJCSAgICAgICBtX2xlX2JSZXFTZXJ2aWNlSWQsCisJCQkJICAgICAgIChCWVRFKSBFcGxEbGxrSW5zdGFuY2VfZy4KKwkJCQkgICAgICAgbV9MYXN0UmVxU2VydmljZUlkKTsKKwkJCUFtaVNldEJ5dGVUb0xlKCZwVHhGcmFtZS0+bV9EYXRhLm1fU29hLgorCQkJCSAgICAgICBtX2xlX2JSZXFTZXJ2aWNlVGFyZ2V0LAorCQkJCSAgICAgICAoQllURSkgRXBsRGxsa0luc3RhbmNlX2cuCisJCQkJICAgICAgIG1fdWlMYXN0VGFyZ2V0Tm9kZUlkKTsKKworCQl9IGVsc2UgewkvLyBpbnZpdGUgbm9ib2R5CisJCQkvLyB1cGRhdGUgZnJhbWUgKHRhcmdldCkKKwkJCUFtaVNldEJ5dGVUb0xlKCZwVHhGcmFtZS0+bV9EYXRhLm1fU29hLgorCQkJCSAgICAgICBtX2xlX2JSZXFTZXJ2aWNlSWQsIChCWVRFKSAwKTsKKwkJCUFtaVNldEJ5dGVUb0xlKCZwVHhGcmFtZS0+bV9EYXRhLm1fU29hLgorCQkJCSAgICAgICBtX2xlX2JSZXFTZXJ2aWNlVGFyZ2V0LCAoQllURSkgMCk7CisJCX0KKworCQkvLyB1cGRhdGUgZnJhbWUgKE5NVCBzdGF0ZSkKKwkJQW1pU2V0Qnl0ZVRvTGUoJnBUeEZyYW1lLT5tX0RhdGEubV9Tb2EubV9sZV9iTm10U3RhdHVzLAorCQkJICAgICAgIChCWVRFKSBObXRTdGF0ZV9wKTsKKworCQkvLyBzZW5kIFNvQSBmcmFtZQorCQlSZXQgPSBFZHJ2U2VuZFR4TXNnKHBUeEJ1ZmZlcik7CisJfQorCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbERsbGtNblNlbmRTb2MoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBpdCB1cGRhdGVzIGFuZCB0cmFuc21pdHMgdGhlIFNvQS4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgKG5vbmUpCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdEVwbEtlcm5lbCBFcGxEbGxrTW5TZW5kU29jKHZvaWQpCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwl0RWRydlR4QnVmZmVyICpwVHhCdWZmZXIgPSBOVUxMOworCXRFcGxGcmFtZSAqcFR4RnJhbWU7CisJdEVwbEV2ZW50IEV2ZW50OworCisJcFR4QnVmZmVyID0gJkVwbERsbGtJbnN0YW5jZV9nLm1fcFR4QnVmZmVyW0VQTF9ETExLX1RYRlJBTUVfU09DXTsKKwlpZiAocFR4QnVmZmVyLT5tX3BiQnVmZmVyICE9IE5VTEwpIHsJLy8gU29DIGRvZXMgZXhpc3QKKwkJcFR4RnJhbWUgPSAodEVwbEZyYW1lICopIHBUeEJ1ZmZlci0+bV9wYkJ1ZmZlcjsKKworCQkvLyAkJCQgdXBkYXRlIE5ldFRpbWUKKworCQkvLyBzZW5kIFNvQyBmcmFtZQorCQlSZXQgPSBFZHJ2U2VuZFR4TXNnKHBUeEJ1ZmZlcik7CisJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCWdvdG8gRXhpdDsKKwkJfQorCQkvLyB0cmlnZ2VyIHN5bmNocm9ub3VzIHRhc2sKKwkJRXZlbnQubV9FdmVudFNpbmsgPSBrRXBsRXZlbnRTaW5rU3luYzsKKwkJRXZlbnQubV9FdmVudFR5cGUgPSBrRXBsRXZlbnRUeXBlU3luYzsKKwkJRXZlbnQubV91aVNpemUgPSAwOworCQlSZXQgPSBFcGxFdmVudGtQb3N0KCZFdmVudCk7CisJfQorCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbERsbGtNblNlbmRQcmVxKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogaXQgdXBkYXRlcyBhbmQgdHJhbnNtaXRzIHRoZSBQUmVxIGZvciB0aGUgbmV4dCBpc29jaHJvbm91cyBDTgorLy8gICAgICAgICAgICAgIG9yIG93biBQUmVzIGlmIGVuYWJsZWQuCisvLworLy8gUGFyYW1ldGVyczogIE5tdFN0YXRlX3AgICAgICAgICAgICAgID0gY3VycmVudCBOTVQgc3RhdGUKKy8vICAgICAgICAgICAgICBwRGxsU3RhdGVQcm9wb3NlZF9wICAgICA9IHByb3Bvc2VkIERMTCBzdGF0ZQorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHRFcGxLZXJuZWwgRXBsRGxsa01uU2VuZFByZXEodEVwbE5tdFN0YXRlIE5tdFN0YXRlX3AsCisJCQkJICAgIHRFcGxEbGxTdGF0ZSAqIHBEbGxTdGF0ZVByb3Bvc2VkX3ApCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwl0RWRydlR4QnVmZmVyICpwVHhCdWZmZXIgPSBOVUxMOworCXRFcGxGcmFtZSAqcFR4RnJhbWU7CisJQllURSBiRmxhZzEgPSAwOworCisJaWYgKEVwbERsbGtJbnN0YW5jZV9nLm1fcEN1ck5vZGVJbmZvID09IE5VTEwpIHsJLy8gc3RhcnQgd2l0aCBmaXJzdCBpc29jaHJvbm91cyBDTgorCQlFcGxEbGxrSW5zdGFuY2VfZy5tX3BDdXJOb2RlSW5mbyA9CisJCSAgICBFcGxEbGxrSW5zdGFuY2VfZy5tX3BGaXJzdE5vZGVJbmZvOworCX0gZWxzZSB7CQkvLyBpdGVyYXRlIHRvIG5leHQgaXNvY2hyb25vdXMgQ04KKwkJRXBsRGxsa0luc3RhbmNlX2cubV9wQ3VyTm9kZUluZm8gPQorCQkgICAgRXBsRGxsa0luc3RhbmNlX2cubV9wQ3VyTm9kZUluZm8tPm1fcE5leHROb2RlSW5mbzsKKwl9CisKKwlpZiAoRXBsRGxsa0luc3RhbmNlX2cubV9wQ3VyTm9kZUluZm8gPT0gTlVMTCkgewkvLyBsYXN0IGlzb2Nocm9ub3VzIENOIHJlYWNoZWQKKwkJUmV0ID0gRXBsRGxsa01uU2VuZFNvYShObXRTdGF0ZV9wLCBwRGxsU3RhdGVQcm9wb3NlZF9wLCBUUlVFKTsKKwkJZ290byBFeGl0OworCX0gZWxzZSB7CisJCXBUeEJ1ZmZlciA9IEVwbERsbGtJbnN0YW5jZV9nLm1fcEN1ck5vZGVJbmZvLT5tX3BQcmVxVHhCdWZmZXI7CisJCWJGbGFnMSA9CisJCSAgICBFcGxEbGxrSW5zdGFuY2VfZy5tX3BDdXJOb2RlSW5mby0+CisJCSAgICBtX2JTb2FGbGFnMSAmIEVQTF9GUkFNRV9GTEFHMV9FQTsKKwkJKnBEbGxTdGF0ZVByb3Bvc2VkX3AgPSBrRXBsRGxsTXNXYWl0UHJlczsKKworCQkvLyBzdGFydCBQUmVzIFRpbWVyCisJCS8vICQkJCBkLmsuOiBtYXliZSBtb3ZlIHRoaXMgY2FsbCB0byBDYkZyYW1lVHJhbnNtaXR0ZWQoKSwgYmVjYXVzZSB0aGUgdGltZSBzaG91bGQgcnVuIGZyb20gdGhlcmUKKyNpZiBFUExfVElNRVJfVVNFX0hJR0hSRVMgIT0gRkFMU0UKKwkJUmV0ID0KKwkJICAgIEVwbFRpbWVySGlnaFJlc2tNb2RpZnlUaW1lck5zKCZFcGxEbGxrSW5zdGFuY2VfZy4KKwkJCQkJCSAgbV9UaW1lckhkbFJlc3BvbnNlLAorCQkJCQkJICBFcGxEbGxrSW5zdGFuY2VfZy4KKwkJCQkJCSAgbV9wQ3VyTm9kZUluZm8tPgorCQkJCQkJICBtX2R3UHJlc1RpbWVvdXQsCisJCQkJCQkgIEVwbERsbGtDYk1uVGltZXJSZXNwb25zZSwgMEwsCisJCQkJCQkgIEZBTFNFKTsKKyNlbmRpZgorCX0KKworCWlmIChwVHhCdWZmZXIgPT0gTlVMTCkgewkvLyBQUmVxIGRvZXMgbm90IGV4aXN0CisJCVJldCA9IGtFcGxEbGxUeEJ1Zk5vdFJlYWR5OworCQlnb3RvIEV4aXQ7CisJfQorCisJcFR4RnJhbWUgPSAodEVwbEZyYW1lICopIHBUeEJ1ZmZlci0+bV9wYkJ1ZmZlcjsKKworCWlmIChwVHhGcmFtZSAhPSBOVUxMKSB7CS8vIFBSZXEgZG9lcyBleGlzdAorCQlpZiAoTm10U3RhdGVfcCA9PSBrRXBsTm10TXNPcGVyYXRpb25hbCkgewkvLyBsZWF2ZSBSRCBmbGFnIHVudG91Y2hlZAorCQkJYkZsYWcxIHw9CisJCQkgICAgQW1pR2V0Qnl0ZUZyb21MZSgmcFR4RnJhbWUtPm1fRGF0YS5tX1ByZXEuCisJCQkJCSAgICAgbV9sZV9iRmxhZzEpICYgRVBMX0ZSQU1FX0ZMQUcxX1JEOworCQl9CisKKwkJaWYgKHBUeEJ1ZmZlciA9PSAmRXBsRGxsa0luc3RhbmNlX2cubV9wVHhCdWZmZXJbRVBMX0RMTEtfVFhGUkFNRV9QUkVTXSkgewkvLyBQUmVzIG9mIE1OIHdpbGwgYmUgc2VudAorCQkJLy8gdXBkYXRlIE5NVCBzdGF0ZQorCQkJQW1pU2V0Qnl0ZVRvTGUoJnBUeEZyYW1lLT5tX0RhdGEubV9QcmVzLm1fbGVfYk5tdFN0YXR1cywKKwkJCQkgICAgICAgKEJZVEUpIE5tdFN0YXRlX3ApOworCQkJKnBEbGxTdGF0ZVByb3Bvc2VkX3AgPSBrRXBsRGxsTXNXYWl0U29hVHJpZzsKKwkJfQorCQkvLyAkJCQgZC5rLiBzZXQgRVBMX0ZSQU1FX0ZMQUcxX01TIGlmIG5lY2Vzc2FyeQorCQkvLyB1cGRhdGUgZnJhbWUgKEZsYWcxKQorCQlBbWlTZXRCeXRlVG9MZSgmcFR4RnJhbWUtPm1fRGF0YS5tX1ByZXEubV9sZV9iRmxhZzEsIGJGbGFnMSk7CisKKwkJLy8gY2FsY3VsYXRlIGZyYW1lIHNpemUgZnJvbSBwYXlsb2FkIHNpemUKKwkJcFR4QnVmZmVyLT5tX3VpVHhNc2dMZW4gPQorCQkgICAgQW1pR2V0V29yZEZyb21MZSgmcFR4RnJhbWUtPm1fRGF0YS5tX1ByZXEubV9sZV93U2l6ZSkgKyAyNDsKKworCQkvLyBzZW5kIFBSZXEgZnJhbWUKKwkJUmV0ID0gRWRydlNlbmRUeE1zZyhwVHhCdWZmZXIpOworCX0gZWxzZSB7CisJCVJldCA9IGtFcGxEbGxUeEZyYW1lSW52YWxpZDsKKwl9CisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsRGxsa0FzeW5jRnJhbWVOb3RSZWNlaXZlZCgpCisvLworLy8gRGVzY3JpcHRpb246IHBhc3NlcyBlbXB0eSBBU25kIGZyYW1lIHRvIHJlY2VpdmUgRklGTy4KKy8vICAgICAgICAgICAgICBJdCB3aWxsIGJlIGNhbGxlZCBvbmx5IGZvciBmcmFtZXMgd2l0aCByZWdpc3RlcmVkIEFzbmRTZXJ2aWNlSWRzCisvLyAgICAgICAgICAgICAgKG9ubHkga0VwbERsbEFzbmRGaWx0ZXJBbnkpLgorLy8KKy8vIFBhcmFtZXRlcnM6ICBub25lCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdEVwbEtlcm5lbCBFcGxEbGxrQXN5bmNGcmFtZU5vdFJlY2VpdmVkKHRFcGxEbGxSZXFTZXJ2aWNlSWQKKwkJCQkJICAgICAgIFJlcVNlcnZpY2VJZF9wLAorCQkJCQkgICAgICAgdW5zaWduZWQgaW50IHVpTm9kZUlkX3ApCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwlCWVRFIGFiQnVmZmVyWzE4XTsKKwl0RXBsRnJhbWUgKnBGcmFtZSA9ICh0RXBsRnJhbWUgKikgYWJCdWZmZXI7CisJdEVwbEZyYW1lSW5mbyBGcmFtZUluZm87CisKKwkvLyBjaGVjayBpZiBwcmV2aW91cyBTb0EgaW52aXRhdGlvbiB3YXMgbm90IGFuc3dlcmVkCisJc3dpdGNoIChSZXFTZXJ2aWNlSWRfcCkgeworCWNhc2Uga0VwbERsbFJlcVNlcnZpY2VJZGVudDoKKwljYXNlIGtFcGxEbGxSZXFTZXJ2aWNlU3RhdHVzOgorCQkvLyBBU25kIHNlcnZpY2UgcmVnaXN0ZXJlZD8KKwkJaWYgKEVwbERsbGtJbnN0YW5jZV9nLm1fYUFzbmRGaWx0ZXJbUmVxU2VydmljZUlkX3BdID09IGtFcGxEbGxBc25kRmlsdGVyQW55KSB7CS8vIEFTbmQgc2VydmljZSBJRCBpcyByZWdpc3RlcmVkCisJCQlBbWlTZXRCeXRlVG9MZSgmcEZyYW1lLT5tX2xlX2JTcmNOb2RlSWQsCisJCQkJICAgICAgIChCWVRFKSB1aU5vZGVJZF9wKTsKKwkJCS8vIEVQTCBNc2dUeXBlIEFTbmQKKwkJCUFtaVNldEJ5dGVUb0xlKCZwRnJhbWUtPm1fbGVfYk1lc3NhZ2VUeXBlLAorCQkJCSAgICAgICAoQllURSkga0VwbE1zZ1R5cGVBc25kKTsKKwkJCS8vIEFTbmQgU2VydmljZSBJRAorCQkJQW1pU2V0Qnl0ZVRvTGUoJnBGcmFtZS0+bV9EYXRhLm1fQXNuZC5tX2xlX2JTZXJ2aWNlSWQsCisJCQkJICAgICAgIChCWVRFKSBSZXFTZXJ2aWNlSWRfcCk7CisJCQkvLyBjcmVhdGUgZnJhbWUgaW5mbyBzdHJ1Y3R1cmUKKwkJCUZyYW1lSW5mby5tX3BGcmFtZSA9IHBGcmFtZTsKKwkJCUZyYW1lSW5mby5tX3VpRnJhbWVTaXplID0gMTg7CS8vIGVtcHR5IG5vbiBleGlzdGluZyBBU25kIGZyYW1lCisJCQkvLyBmb3J3YXJkIGZyYW1lIHZpYSBhc3luYyByZWNlaXZlIEZJRk8gdG8gdXNlcnNwYWNlCisJCQlSZXQgPSBFcGxEbGxrQ2FsQXN5bmNGcmFtZVJlY2VpdmVkKCZGcmFtZUluZm8pOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCS8vIG5vIGludml0YXRpb24gaXNzdWVkIG9yIGl0IHdhcyBzdWNjZXNzZnVsbHkgYW5zd2VyZWQgb3IgaXQgaXMgdW5pbnRlcmVzdGluZworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gUmV0OworfQorCisjZW5kaWYgLy8oKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVF9NTikpICE9IDApCisKKyNlbmRpZiAvLyAjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX0RMTEspKSAhPSAwKQorLy8gRU9GCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbERsbGtDYWwuYyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsRGxsa0NhbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1OTA4M2UKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbERsbGtDYWwuYwpAQCAtMCwwICsxLDEyNjAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBzb3VyY2UgZmlsZSBmb3Iga2VybmVsIERMTCBDb21tdW5pY2F0aW9uIEFic3RyYWN0aW9uIExheWVyIG1vZHVsZQorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgJFJDU2ZpbGU6IEVwbERsbGtDYWwuYyx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuNyAkICAkRGF0ZTogMjAwOC8xMS8xMyAxNzoxMzowOSAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICAgICAgR0NDIFYzLjQKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUmV2aXNpb24gSGlzdG9yeToKKworICAyMDA2LzA2LzE1IGQuay46ICAgc3RhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uLCB2ZXJzaW9uIDEuMDAKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgImtlcm5lbC9FcGxEbGxrQ2FsLmgiCisjaW5jbHVkZSAia2VybmVsL0VwbERsbGsuaCIKKyNpbmNsdWRlICJrZXJuZWwvRXBsRXZlbnRrLmgiCisKKyNpbmNsdWRlICJFcGxEbGxDYWwuaCIKKyNpZm5kZWYgRVBMX05PX0ZJRk8KKyNpbmNsdWRlICJTaGFyZWRCdWZmLmgiCisjZW5kaWYKKworI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9ETExLKSkgIT0gMCkKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIEcgTCBPIEIgQSBMICAgRCBFIEYgSSBOIEkgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWZuZGVmIG1pbgorI2RlZmluZSBtaW4oYSxiKSAgICAgICAgICAgICgoKGEpIDwgKGIpKSA/IChhKSA6IChiKSkKKyNlbmRpZgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBtb2R1bCBnbG9iYWxlIHZhcnMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICBDIEwgQSBTIFMgIEVwbERsbGtDYWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLy8KKy8vIERlc2NyaXB0aW9uOgorLy8KKy8vCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgIFAgUiBJIFYgQSBUIEUgICBEIEUgRiBJIE4gSSBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvbnN0IGRlZmluZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNkZWZpbmUgRVBMX0RMTEtDQUxfTUFYX1FVRVVFUyAgNQkvLyBDbkdlblJlcSwgQ25ObXRSZXEsIHtNbkdlblJlcSwgTW5ObXRSZXF9LCBNbklkZW50UmVxLCBNblN0YXR1c1JlcQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3R5cGVkZWYgc3RydWN0IHsKKyNpZm5kZWYgRVBMX05PX0ZJRk8KKy8vICAgIHRTaGJJbnN0YW5jZSAgICBtX1NoYkluc3RhbmNlUng7ICAgICAgLy8gRklGTyBmb3IgUnggQVNuZCBmcmFtZXMKKwl0U2hiSW5zdGFuY2UgbV9TaGJJbnN0YW5jZVR4Tm10OwkvLyBGSUZPIGZvciBUeCBmcmFtZXMgd2l0aCBOTVQgcmVxdWVzdCBwcmlvcml0eQorCXRTaGJJbnN0YW5jZSBtX1NoYkluc3RhbmNlVHhHZW47CS8vIEZJRk8gZm9yIFR4IGZyYW1lcyB3aXRoIGdlbmVyaWMgcHJpb3JpdHkKKyNlbHNlCisJdW5zaWduZWQgaW50IG1fdWlGcmFtZVNpemVObXQ7CisJQllURSBtX2FiRnJhbWVObXRbMTUwMF07CisJdW5zaWduZWQgaW50IG1fdWlGcmFtZVNpemVHZW47CisJQllURSBtX2FiRnJhbWVHZW5bMTUwMF07CisjZW5kaWYKKworCXRFcGxEbGxrQ2FsU3RhdGlzdGljcyBtX1N0YXRpc3RpY3M7CisKKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVF9NTikpICE9IDApCisJLy8gSWRlbnRSZXF1ZXN0IHF1ZXVlIHdpdGggQ04gbm9kZSBJRHMKKwl1bnNpZ25lZCBpbnQgbV9hdWlRdWV1ZUlkZW50UmVxW0VQTF9EX05NVF9NYXhDTk51bWJlcl9VOCArIDFdOwkvLyAxIGVudHJ5IGlzIHJlc2VydmVkIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gZnVsbCBhbmQgZW1wdHkKKwl1bnNpZ25lZCBpbnQgbV91aVdyaXRlSWRlbnRSZXE7CisJdW5zaWduZWQgaW50IG1fdWlSZWFkSWRlbnRSZXE7CisKKwkvLyBTdGF0dXNSZXF1ZXN0IHF1ZXVlIHdpdGggQ04gbm9kZSBJRHMKKwl1bnNpZ25lZCBpbnQgbV9hdWlRdWV1ZVN0YXR1c1JlcVtFUExfRF9OTVRfTWF4Q05OdW1iZXJfVTggKyAxXTsJLy8gMSBlbnRyeSBpcyByZXNlcnZlZCB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIGZ1bGwgYW5kIGVtcHR5CisJdW5zaWduZWQgaW50IG1fdWlXcml0ZVN0YXR1c1JlcTsKKwl1bnNpZ25lZCBpbnQgbV91aVJlYWRTdGF0dXNSZXE7CisKKwl1bnNpZ25lZCBpbnQgbV9hdWlRdWV1ZUNuUmVxdWVzdHNbMjU0ICogMl07CisJLy8gZmlyc3QgMjU0IGVudHJpZXMgcmVwcmVzZW50IHRoZSBnZW5lcmljIHJlcXVlc3RzIG9mIHRoZSBjb3JyZXNwb25kaW5nIG5vZGUKKwkvLyBzZWNvbmQgMjU0IGVudHJpZXMgcmVwcmVzZW50IHRoZSBOTVQgcmVxdWVzdHMgb2YgdGhlIGNvcnJlc3BvbmRpbmcgbm9kZQorCXVuc2lnbmVkIGludCBtX3VpTmV4dFF1ZXVlQ25SZXF1ZXN0OworCXVuc2lnbmVkIGludCBtX3VpTmV4dFJlcXVlc3RRdWV1ZTsKKyNlbmRpZgorCit9IHRFcGxEbGxrQ2FsSW5zdGFuY2U7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCB2YXJzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBpZiBubyBkeW5hbWljIG1lbW9yeSBhbGxvY2F0aW9uIHNoYWxsIGJlIHVzZWQKKy8vIGRlZmluZSBzdHJ1Y3R1cmVzIHN0YXRpY2FsbHkKK3N0YXRpYyB0RXBsRGxsa0NhbEluc3RhbmNlIEVwbERsbGtDYWxJbnN0YW5jZV9nOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICBQIFUgQiBMIEkgQyAgIEYgVSBOIEMgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbERsbGtDYWxBZGRJbnN0YW5jZSgpCisvLworLy8gRGVzY3JpcHRpb246IGFkZCBhbmQgaW5pdGlhbGl6ZSBuZXcgaW5zdGFuY2Ugb2YgRExMIENBTCBtb2R1bGUKKy8vCisvLyBQYXJhbWV0ZXJzOiAgbm9uZQorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordEVwbEtlcm5lbCBFcGxEbGxrQ2FsQWRkSW5zdGFuY2UoKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisjaWZuZGVmIEVQTF9OT19GSUZPCisJdFNoYkVycm9yIFNoYkVycm9yOworCXVuc2lnbmVkIGludCBmU2hiTmV3Q3JlYXRlZDsKKworLyogICAgU2hiRXJyb3IgPSBTaGJDaXJBbGxvY0J1ZmZlciAoRVBMX0RMTENBTF9CVUZGRVJfU0laRV9SWCwgRVBMX0RMTENBTF9CVUZGRVJfSURfUlgsCisgICAgICAgICZFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX1NoYkluc3RhbmNlUngsICZmU2hiTmV3Q3JlYXRlZCk7CisgICAgLy8gcmV0dXJucyBrU2hiT2ssIGtTaGJPcGVuTWlzbWF0Y2gsIGtTaGJPdXRPZk1lbSBvciBrU2hiSW52YWxpZEFyZworCisgICAgaWYgKFNoYkVycm9yICE9IGtTaGJPaykKKyAgICB7CisgICAgICAgIFJldCA9IGtFcGxOb1Jlc291cmNlOworICAgIH0KKyovCisJU2hiRXJyb3IgPQorCSAgICBTaGJDaXJBbGxvY0J1ZmZlcihFUExfRExMQ0FMX0JVRkZFUl9TSVpFX1RYX05NVCwKKwkJCSAgICAgIEVQTF9ETExDQUxfQlVGRkVSX0lEX1RYX05NVCwKKwkJCSAgICAgICZFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX1NoYkluc3RhbmNlVHhObXQsCisJCQkgICAgICAmZlNoYk5ld0NyZWF0ZWQpOworCS8vIHJldHVybnMga1NoYk9rLCBrU2hiT3Blbk1pc21hdGNoLCBrU2hiT3V0T2ZNZW0gb3Iga1NoYkludmFsaWRBcmcKKworCWlmIChTaGJFcnJvciAhPSBrU2hiT2spIHsKKwkJUmV0ID0ga0VwbE5vUmVzb3VyY2U7CisJfQorCisvKiAgICBTaGJFcnJvciA9IFNoYkNpclNldFNpZ25hbEhhbmRsZXJOZXdEYXRhIChFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX1NoYkluc3RhbmNlVHhObXQsIEVwbERsbGtDYWxUeE5tdFNpZ25hbEhhbmRsZXIsIGtTaGJQcmlvcml0eU5vcm1hbCk7CisgICAgLy8gcmV0dXJucyBrU2hiT2ssIGtTaGJBbHJlYWR5U2lnbmFsaW5nIG9yIGtTaGJJbnZhbGlkQXJnCisKKyAgICBpZiAoU2hiRXJyb3IgIT0ga1NoYk9rKQorICAgIHsKKyAgICAgICAgUmV0ID0ga0VwbE5vUmVzb3VyY2U7CisgICAgfQorKi8KKwlTaGJFcnJvciA9CisJICAgIFNoYkNpckFsbG9jQnVmZmVyKEVQTF9ETExDQUxfQlVGRkVSX1NJWkVfVFhfR0VOLAorCQkJICAgICAgRVBMX0RMTENBTF9CVUZGRVJfSURfVFhfR0VOLAorCQkJICAgICAgJkVwbERsbGtDYWxJbnN0YW5jZV9nLm1fU2hiSW5zdGFuY2VUeEdlbiwKKwkJCSAgICAgICZmU2hiTmV3Q3JlYXRlZCk7CisJLy8gcmV0dXJucyBrU2hiT2ssIGtTaGJPcGVuTWlzbWF0Y2gsIGtTaGJPdXRPZk1lbSBvciBrU2hiSW52YWxpZEFyZworCisJaWYgKFNoYkVycm9yICE9IGtTaGJPaykgeworCQlSZXQgPSBrRXBsTm9SZXNvdXJjZTsKKwl9CisKKy8qICAgIFNoYkVycm9yID0gU2hiQ2lyU2V0U2lnbmFsSGFuZGxlck5ld0RhdGEgKEVwbERsbGtDYWxJbnN0YW5jZV9nLm1fU2hiSW5zdGFuY2VUeEdlbiwgRXBsRGxsa0NhbFR4R2VuU2lnbmFsSGFuZGxlciwga1NoYlByaW9yaXR5Tm9ybWFsKTsKKyAgICAvLyByZXR1cm5zIGtTaGJPaywga1NoYkFscmVhZHlTaWduYWxpbmcgb3Iga1NoYkludmFsaWRBcmcKKworICAgIGlmIChTaGJFcnJvciAhPSBrU2hiT2spCisgICAgeworICAgICAgICBSZXQgPSBrRXBsTm9SZXNvdXJjZTsKKyAgICB9CisqLworI2Vsc2UKKwlFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX3VpRnJhbWVTaXplTm10ID0gMDsKKwlFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX3VpRnJhbWVTaXplR2VuID0gMDsKKyNlbmRpZgorCisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsRGxsa0NhbERlbEluc3RhbmNlKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogZGVsZXRlcyBpbnN0YW5jZSBvZiBETEwgQ0FMIG1vZHVsZQorLy8KKy8vIFBhcmFtZXRlcnM6ICBub25lCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIEVwbERsbGtDYWxEZWxJbnN0YW5jZSgpCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKyNpZm5kZWYgRVBMX05PX0ZJRk8KKwl0U2hiRXJyb3IgU2hiRXJyb3I7CisKKy8qICAgIFNoYkVycm9yID0gU2hiQ2lyUmVsZWFzZUJ1ZmZlciAoRXBsRGxsa0NhbEluc3RhbmNlX2cubV9TaGJJbnN0YW5jZVJ4KTsKKyAgICBpZiAoU2hiRXJyb3IgIT0ga1NoYk9rKQorICAgIHsKKyAgICAgICAgUmV0ID0ga0VwbE5vUmVzb3VyY2U7CisgICAgfQorICAgIEVwbERsbGtDYWxJbnN0YW5jZV9nLm1fU2hiSW5zdGFuY2VSeCA9IE5VTEw7CisqLworCVNoYkVycm9yID0gU2hiQ2lyUmVsZWFzZUJ1ZmZlcihFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX1NoYkluc3RhbmNlVHhObXQpOworCWlmIChTaGJFcnJvciAhPSBrU2hiT2spIHsKKwkJUmV0ID0ga0VwbE5vUmVzb3VyY2U7CisJfQorCUVwbERsbGtDYWxJbnN0YW5jZV9nLm1fU2hiSW5zdGFuY2VUeE5tdCA9IE5VTEw7CisKKwlTaGJFcnJvciA9IFNoYkNpclJlbGVhc2VCdWZmZXIoRXBsRGxsa0NhbEluc3RhbmNlX2cubV9TaGJJbnN0YW5jZVR4R2VuKTsKKwlpZiAoU2hiRXJyb3IgIT0ga1NoYk9rKSB7CisJCVJldCA9IGtFcGxOb1Jlc291cmNlOworCX0KKwlFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX1NoYkluc3RhbmNlVHhHZW4gPSBOVUxMOworCisjZWxzZQorCUVwbERsbGtDYWxJbnN0YW5jZV9nLm1fdWlGcmFtZVNpemVObXQgPSAwOworCUVwbERsbGtDYWxJbnN0YW5jZV9nLm1fdWlGcmFtZVNpemVHZW4gPSAwOworI2VuZGlmCisKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxEbGxrQ2FsUHJvY2VzcworLy8KKy8vIERlc2NyaXB0aW9uOiBwcm9jZXNzIHRoZSBwYXNzZWQgY29uZmlndXJhdGlvbgorLy8KKy8vIFBhcmFtZXRlcnM6ICBwRXZlbnRfcCAgICAgICAgICAgICAgICA9IGV2ZW50IGNvbnRhaW5pbmcgY29uZmlndXJhdGlvbiBvcHRpb25zCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIEVwbERsbGtDYWxQcm9jZXNzKHRFcGxFdmVudCAqIHBFdmVudF9wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwlzd2l0Y2ggKHBFdmVudF9wLT5tX0V2ZW50VHlwZSkgeworCWNhc2Uga0VwbEV2ZW50VHlwZURsbGtTZXJ2RmlsdGVyOgorCQl7CisJCQl0RXBsRGxsQ2FsQXNuZFNlcnZpY2VJZEZpbHRlciAqcFNlcnZGaWx0ZXI7CisKKwkJCXBTZXJ2RmlsdGVyID0KKwkJCSAgICAodEVwbERsbENhbEFzbmRTZXJ2aWNlSWRGaWx0ZXIgKikgcEV2ZW50X3AtPm1fcEFyZzsKKwkJCVJldCA9CisJCQkgICAgRXBsRGxsa1NldEFzbmRTZXJ2aWNlSWRGaWx0ZXIocFNlcnZGaWx0ZXItPgorCQkJCQkJCSAgbV9TZXJ2aWNlSWQsCisJCQkJCQkJICBwU2VydkZpbHRlci0+CisJCQkJCQkJICBtX0ZpbHRlcik7CisJCQlicmVhazsKKwkJfQorCisjaWYgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRfTU4pKSAhPSAwKQorCWNhc2Uga0VwbEV2ZW50VHlwZURsbGtJc3N1ZVJlcToKKwkJeworCQkJdEVwbERsbENhbElzc3VlUmVxdWVzdCAqcElzc3VlUmVxOworCisJCQlwSXNzdWVSZXEgPSAodEVwbERsbENhbElzc3VlUmVxdWVzdCAqKSBwRXZlbnRfcC0+bV9wQXJnOworCQkJUmV0ID0KKwkJCSAgICBFcGxEbGxrQ2FsSXNzdWVSZXF1ZXN0KHBJc3N1ZVJlcS0+bV9TZXJ2aWNlLAorCQkJCQkJICAgcElzc3VlUmVxLT5tX3VpTm9kZUlkLAorCQkJCQkJICAgcElzc3VlUmVxLT5tX2JTb2FGbGFnMSk7CisJCQlicmVhazsKKwkJfQorCisJY2FzZSBrRXBsRXZlbnRUeXBlRGxsa0FkZE5vZGU6CisJCXsKKwkJCXRFcGxEbGxOb2RlSW5mbyAqcE5vZGVJbmZvOworCisJCQlwTm9kZUluZm8gPSAodEVwbERsbE5vZGVJbmZvICopIHBFdmVudF9wLT5tX3BBcmc7CisJCQlSZXQgPSBFcGxEbGxrQWRkTm9kZShwTm9kZUluZm8pOworCQkJYnJlYWs7CisJCX0KKworCWNhc2Uga0VwbEV2ZW50VHlwZURsbGtEZWxOb2RlOgorCQl7CisJCQl1bnNpZ25lZCBpbnQgKnB1aU5vZGVJZDsKKworCQkJcHVpTm9kZUlkID0gKHVuc2lnbmVkIGludCAqKXBFdmVudF9wLT5tX3BBcmc7CisJCQlSZXQgPSBFcGxEbGxrRGVsZXRlTm9kZSgqcHVpTm9kZUlkKTsKKwkJCWJyZWFrOworCQl9CisKKwljYXNlIGtFcGxFdmVudFR5cGVEbGxrU29mdERlbE5vZGU6CisJCXsKKwkJCXVuc2lnbmVkIGludCAqcHVpTm9kZUlkOworCisJCQlwdWlOb2RlSWQgPSAodW5zaWduZWQgaW50ICopcEV2ZW50X3AtPm1fcEFyZzsKKwkJCVJldCA9IEVwbERsbGtTb2Z0RGVsZXRlTm9kZSgqcHVpTm9kZUlkKTsKKwkJCWJyZWFrOworCQl9CisjZW5kaWYKKworCWNhc2Uga0VwbEV2ZW50VHlwZURsbGtJZGVudGl0eToKKwkJeworCQkJdEVwbERsbElkZW50UGFyYW0gKnBJZGVudFBhcmFtOworCisJCQlwSWRlbnRQYXJhbSA9ICh0RXBsRGxsSWRlbnRQYXJhbSAqKSBwRXZlbnRfcC0+bV9wQXJnOworCQkJaWYgKHBJZGVudFBhcmFtLT5tX3VpU2l6ZU9mU3RydWN0ID4gcEV2ZW50X3AtPm1fdWlTaXplKSB7CisJCQkJcElkZW50UGFyYW0tPm1fdWlTaXplT2ZTdHJ1Y3QgPQorCQkJCSAgICBwRXZlbnRfcC0+bV91aVNpemU7CisJCQl9CisJCQlSZXQgPSBFcGxEbGxrU2V0SWRlbnRpdHkocElkZW50UGFyYW0pOworCQkJYnJlYWs7CisJCX0KKworCWNhc2Uga0VwbEV2ZW50VHlwZURsbGtDb25maWc6CisJCXsKKwkJCXRFcGxEbGxDb25maWdQYXJhbSAqcENvbmZpZ1BhcmFtOworCisJCQlwQ29uZmlnUGFyYW0gPSAodEVwbERsbENvbmZpZ1BhcmFtICopIHBFdmVudF9wLT5tX3BBcmc7CisJCQlpZiAocENvbmZpZ1BhcmFtLT5tX3VpU2l6ZU9mU3RydWN0ID4gcEV2ZW50X3AtPm1fdWlTaXplKSB7CisJCQkJcENvbmZpZ1BhcmFtLT5tX3VpU2l6ZU9mU3RydWN0ID0KKwkJCQkgICAgcEV2ZW50X3AtPm1fdWlTaXplOworCQkJfQorCQkJUmV0ID0gRXBsRGxsa0NvbmZpZyhwQ29uZmlnUGFyYW0pOworCQkJYnJlYWs7CisJCX0KKworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworLy9FeGl0OgorCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbERsbGtDYWxBc3luY0dldFR4Q291bnQoKQorLy8KKy8vIERlc2NyaXB0aW9uOiByZXR1cm5zIGNvdW50IG9mIFR4IGZyYW1lcyBvZiBGSUZPIHdpdGggaGlnaGVzdCBwcmlvcml0eQorLy8KKy8vIFBhcmFtZXRlcnM6ICBub25lCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIEVwbERsbGtDYWxBc3luY0dldFR4Q291bnQodEVwbERsbEFzeW5jUmVxUHJpb3JpdHkgKiBwUHJpb3JpdHlfcCwKKwkJCQkgICAgIHVuc2lnbmVkIGludCAqcHVpQ291bnRfcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworI2lmbmRlZiBFUExfTk9fRklGTworCXRTaGJFcnJvciBTaGJFcnJvcjsKKwl1bnNpZ25lZCBsb25nIHVsRnJhbWVDb3VudDsKKworCS8vIGdldCBmcmFtZSBjb3VudCBvZiBUeCBGSUZPIHdpdGggTk1UIHJlcXVlc3QgcHJpb3JpdHkKKwlTaGJFcnJvciA9CisJICAgIFNoYkNpckdldFJlYWRCbG9ja0NvdW50KEVwbERsbGtDYWxJbnN0YW5jZV9nLm1fU2hiSW5zdGFuY2VUeE5tdCwKKwkJCQkgICAgJnVsRnJhbWVDb3VudCk7CisJLy8gcmV0dXJucyBrU2hiT2ssIGtTaGJJbnZhbGlkQXJnCisKKwkvLyBlcnJvciBoYW5kbGluZworCWlmIChTaGJFcnJvciAhPSBrU2hiT2spIHsKKwkJUmV0ID0ga0VwbE5vUmVzb3VyY2U7CisJCWdvdG8gRXhpdDsKKwl9CisKKwlpZiAodWxGcmFtZUNvdW50ID4KKwkgICAgRXBsRGxsa0NhbEluc3RhbmNlX2cubV9TdGF0aXN0aWNzLm1fdWxNYXhUeEZyYW1lQ291bnRObXQpIHsKKwkJRXBsRGxsa0NhbEluc3RhbmNlX2cubV9TdGF0aXN0aWNzLm1fdWxNYXhUeEZyYW1lQ291bnRObXQgPQorCQkgICAgdWxGcmFtZUNvdW50OworCX0KKworCWlmICh1bEZyYW1lQ291bnQgIT0gMCkgewkvLyBOTVQgcmVxdWVzdHMgYXJlIGluIHF1ZXVlCisJCSpwUHJpb3JpdHlfcCA9IGtFcGxEbGxBc3luY1JlcVByaW9ObXQ7CisJCSpwdWlDb3VudF9wID0gKHVuc2lnbmVkIGludCl1bEZyYW1lQ291bnQ7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gZ2V0IGZyYW1lIGNvdW50IG9mIFR4IEZJRk8gd2l0aCBnZW5lcmljIHByaW9yaXR5CisJU2hiRXJyb3IgPQorCSAgICBTaGJDaXJHZXRSZWFkQmxvY2tDb3VudChFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX1NoYkluc3RhbmNlVHhHZW4sCisJCQkJICAgICZ1bEZyYW1lQ291bnQpOworCS8vIHJldHVybnMga1NoYk9rLCBrU2hiSW52YWxpZEFyZworCisJLy8gZXJyb3IgaGFuZGxpbmcKKwlpZiAoU2hiRXJyb3IgIT0ga1NoYk9rKSB7CisJCVJldCA9IGtFcGxOb1Jlc291cmNlOworCQlnb3RvIEV4aXQ7CisJfQorCisJaWYgKHVsRnJhbWVDb3VudCA+CisJICAgIEVwbERsbGtDYWxJbnN0YW5jZV9nLm1fU3RhdGlzdGljcy5tX3VsTWF4VHhGcmFtZUNvdW50R2VuKSB7CisJCUVwbERsbGtDYWxJbnN0YW5jZV9nLm1fU3RhdGlzdGljcy5tX3VsTWF4VHhGcmFtZUNvdW50R2VuID0KKwkJICAgIHVsRnJhbWVDb3VudDsKKwl9CisKKwkqcFByaW9yaXR5X3AgPSBrRXBsRGxsQXN5bmNSZXFQcmlvR2VuZXJpYzsKKwkqcHVpQ291bnRfcCA9ICh1bnNpZ25lZCBpbnQpdWxGcmFtZUNvdW50OworCisgICAgICBFeGl0OgorI2Vsc2UKKwlpZiAoRXBsRGxsa0NhbEluc3RhbmNlX2cubV91aUZyYW1lU2l6ZU5tdCA+IDApIHsKKwkJKnBQcmlvcml0eV9wID0ga0VwbERsbEFzeW5jUmVxUHJpb05tdDsKKwkJKnB1aUNvdW50X3AgPSAxOworCX0gZWxzZSBpZiAoRXBsRGxsa0NhbEluc3RhbmNlX2cubV91aUZyYW1lU2l6ZUdlbiA+IDApIHsKKwkJKnBQcmlvcml0eV9wID0ga0VwbERsbEFzeW5jUmVxUHJpb0dlbmVyaWM7CisJCSpwdWlDb3VudF9wID0gMTsKKwl9IGVsc2UgeworCQkqcFByaW9yaXR5X3AgPSBrRXBsRGxsQXN5bmNSZXFQcmlvR2VuZXJpYzsKKwkJKnB1aUNvdW50X3AgPSAwOworCX0KKyNlbmRpZgorCisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsRGxsa0NhbEFzeW5jR2V0VHhGcmFtZSgpCisvLworLy8gRGVzY3JpcHRpb246IHJldHVybnMgVHggZnJhbWVzIGZyb20gRklGTyB3aXRoIHNwZWNpZmllZCBwcmlvcml0eQorLy8KKy8vIFBhcmFtZXRlcnM6ICBwRnJhbWVfcCAgICAgICAgICAgICAgICA9IElOOiBwb2ludGVyIHRvIGJ1ZmZlcgorLy8gICAgICAgICAgICAgIHB1aUZyYW1lU2l6ZV9wICAgICAgICAgID0gSU46IG1heCBzaXplIG9mIGJ1ZmZlcgorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1VUOiBhY3R1YWwgc2l6ZSBvZiBmcmFtZQorLy8gICAgICAgICAgICAgIFByaW9yaXR5X3AgICAgICAgICAgICAgID0gSU46IHByaW9yaXR5CisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIEVwbERsbGtDYWxBc3luY0dldFR4RnJhbWUodm9pZCAqcEZyYW1lX3AsCisJCQkJICAgICB1bnNpZ25lZCBpbnQgKnB1aUZyYW1lU2l6ZV9wLAorCQkJCSAgICAgdEVwbERsbEFzeW5jUmVxUHJpb3JpdHkgUHJpb3JpdHlfcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworI2lmbmRlZiBFUExfTk9fRklGTworCXRTaGJFcnJvciBTaGJFcnJvcjsKKwl1bnNpZ25lZCBsb25nIHVsRnJhbWVTaXplOworCisJc3dpdGNoIChQcmlvcml0eV9wKSB7CisJY2FzZSBrRXBsRGxsQXN5bmNSZXFQcmlvTm10OgkvLyBOTVQgcmVxdWVzdCBwcmlvcml0eQorCQlTaGJFcnJvciA9CisJCSAgICBTaGJDaXJSZWFkRGF0YUJsb2NrKEVwbERsbGtDYWxJbnN0YW5jZV9nLm1fU2hiSW5zdGFuY2VUeE5tdCwKKwkJCQkJKEJZVEUgKikgcEZyYW1lX3AsICpwdWlGcmFtZVNpemVfcCwKKwkJCQkJJnVsRnJhbWVTaXplKTsKKwkJLy8gcmV0dXJucyBrU2hiT2ssIGtTaGJEYXRhVHJ1bmNhdGVkLCBrU2hiSW52YWxpZEFyZywga1NoYk5vUmVhZGFibGVEYXRhCisJCWJyZWFrOworCisJZGVmYXVsdDoJCS8vIGdlbmVyaWMgcHJpb3JpdHkKKwkJU2hiRXJyb3IgPQorCQkgICAgU2hiQ2lyUmVhZERhdGFCbG9jayhFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX1NoYkluc3RhbmNlVHhHZW4sCisJCQkJCShCWVRFICopIHBGcmFtZV9wLCAqcHVpRnJhbWVTaXplX3AsCisJCQkJCSZ1bEZyYW1lU2l6ZSk7CisJCS8vIHJldHVybnMga1NoYk9rLCBrU2hiRGF0YVRydW5jYXRlZCwga1NoYkludmFsaWRBcmcsIGtTaGJOb1JlYWRhYmxlRGF0YQorCQlicmVhazsKKworCX0KKworCS8vIGVycm9yIGhhbmRsaW5nCisJaWYgKFNoYkVycm9yICE9IGtTaGJPaykgeworCQlpZiAoU2hiRXJyb3IgPT0ga1NoYk5vUmVhZGFibGVEYXRhKSB7CisJCQlSZXQgPSBrRXBsRGxsQXN5bmNUeEJ1ZmZlckVtcHR5OworCQl9IGVsc2UgewkvLyBvdGhlciBlcnJvcgorCQkJUmV0ID0ga0VwbE5vUmVzb3VyY2U7CisJCX0KKwkJZ290byBFeGl0OworCX0KKworCSpwdWlGcmFtZVNpemVfcCA9ICh1bnNpZ25lZCBpbnQpdWxGcmFtZVNpemU7CisKKyAgICAgIEV4aXQ6CisjZWxzZQorCXN3aXRjaCAoUHJpb3JpdHlfcCkgeworCWNhc2Uga0VwbERsbEFzeW5jUmVxUHJpb05tdDoJLy8gTk1UIHJlcXVlc3QgcHJpb3JpdHkKKwkJKnB1aUZyYW1lU2l6ZV9wID0KKwkJICAgIG1pbigqcHVpRnJhbWVTaXplX3AsIEVwbERsbGtDYWxJbnN0YW5jZV9nLm1fdWlGcmFtZVNpemVObXQpOworCQlFUExfTUVNQ1BZKHBGcmFtZV9wLCBFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX2FiRnJhbWVObXQsCisJCQkgICAqcHVpRnJhbWVTaXplX3ApOworCQlFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX3VpRnJhbWVTaXplTm10ID0gMDsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgkJLy8gZ2VuZXJpYyBwcmlvcml0eQorCQkqcHVpRnJhbWVTaXplX3AgPQorCQkgICAgbWluKCpwdWlGcmFtZVNpemVfcCwgRXBsRGxsa0NhbEluc3RhbmNlX2cubV91aUZyYW1lU2l6ZUdlbik7CisJCUVQTF9NRU1DUFkocEZyYW1lX3AsIEVwbERsbGtDYWxJbnN0YW5jZV9nLm1fYWJGcmFtZUdlbiwKKwkJCSAgICpwdWlGcmFtZVNpemVfcCk7CisJCUVwbERsbGtDYWxJbnN0YW5jZV9nLm1fdWlGcmFtZVNpemVHZW4gPSAwOworCQlicmVhazsKKwl9CisKKyNlbmRpZgorCisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsRGxsa0NhbEFzeW5jRnJhbWVSZWNlaXZlZCgpCisvLworLy8gRGVzY3JpcHRpb246IHBhc3NlcyBBU25kIGZyYW1lIHRvIHJlY2VpdmUgRklGTy4KKy8vICAgICAgICAgICAgICBJdCB3aWxsIGJlIGNhbGxlZCBvbmx5IGZvciBmcmFtZXMgd2l0aCByZWdpc3RlcmVkIEFzbmRTZXJ2aWNlSWRzLgorLy8KKy8vIFBhcmFtZXRlcnM6ICBub25lCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIEVwbERsbGtDYWxBc3luY0ZyYW1lUmVjZWl2ZWQodEVwbEZyYW1lSW5mbyAqIHBGcmFtZUluZm9fcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCXRFcGxFdmVudCBFdmVudDsKKworCUV2ZW50Lm1fRXZlbnRTaW5rID0ga0VwbEV2ZW50U2lua0RsbHVDYWw7CisJRXZlbnQubV9FdmVudFR5cGUgPSBrRXBsRXZlbnRUeXBlQXNuZFJ4OworCUV2ZW50Lm1fcEFyZyA9IHBGcmFtZUluZm9fcC0+bV9wRnJhbWU7CisJRXZlbnQubV91aVNpemUgPSBwRnJhbWVJbmZvX3AtPm1fdWlGcmFtZVNpemU7CisJLy8gcGFzcyBOZXRUaW1lIG9mIGZyYW1lIHRvIHVzZXJzcGFjZQorCUV2ZW50Lm1fTmV0VGltZSA9IHBGcmFtZUluZm9fcC0+bV9OZXRUaW1lOworCisJUmV0ID0gRXBsRXZlbnRrUG9zdCgmRXZlbnQpOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJRXBsRGxsa0NhbEluc3RhbmNlX2cubV9TdGF0aXN0aWNzLm1fdWxDdXJSeEZyYW1lQ291bnQrKzsKKwl9IGVsc2UgeworCQlFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX1N0YXRpc3RpY3MubV91bE1heFJ4RnJhbWVDb3VudCsrOworCX0KKworCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbERsbGtDYWxBc3luY1NlbmQoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBwdXRzIHRoZSBnaXZlbiBmcmFtZSBpbnRvIHRoZSB0cmFuc21pdCBGSUZPIHdpdGggdGhlIHNwZWNpZmllZAorLy8gICAgICAgICAgICAgIHByaW9yaXR5LgorLy8KKy8vIFBhcmFtZXRlcnM6ICBwRnJhbWVJbmZvX3AgICAgICAgICAgICA9IGZyYW1lIGluZm8gc3RydWN0dXJlCisvLyAgICAgICAgICAgICAgUHJpb3JpdHlfcCAgICAgICAgICAgICAgPSBwcmlvcml0eQorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordEVwbEtlcm5lbCBFcGxEbGxrQ2FsQXN5bmNTZW5kKHRFcGxGcmFtZUluZm8gKiBwRnJhbWVJbmZvX3AsCisJCQkgICAgICAgdEVwbERsbEFzeW5jUmVxUHJpb3JpdHkgUHJpb3JpdHlfcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCXRFcGxFdmVudCBFdmVudDsKKyNpZm5kZWYgRVBMX05PX0ZJRk8KKwl0U2hiRXJyb3IgU2hiRXJyb3I7CisKKwlzd2l0Y2ggKFByaW9yaXR5X3ApIHsKKwljYXNlIGtFcGxEbGxBc3luY1JlcVByaW9ObXQ6CS8vIE5NVCByZXF1ZXN0IHByaW9yaXR5CisJCVNoYkVycm9yID0KKwkJICAgIFNoYkNpcldyaXRlRGF0YUJsb2NrKEVwbERsbGtDYWxJbnN0YW5jZV9nLgorCQkJCQkgbV9TaGJJbnN0YW5jZVR4Tm10LAorCQkJCQkgcEZyYW1lSW5mb19wLT5tX3BGcmFtZSwKKwkJCQkJIHBGcmFtZUluZm9fcC0+bV91aUZyYW1lU2l6ZSk7CisJCS8vIHJldHVybnMga1NoYk9rLCBrU2hiRXhjZWVkRGF0YVNpemVMaW1pdCwga1NoYkJ1ZmZlckZ1bGwsIGtTaGJJbnZhbGlkQXJnCisJCWJyZWFrOworCisJZGVmYXVsdDoJCS8vIGdlbmVyaWMgcHJpb3JpdHkKKwkJU2hiRXJyb3IgPQorCQkgICAgU2hiQ2lyV3JpdGVEYXRhQmxvY2soRXBsRGxsa0NhbEluc3RhbmNlX2cuCisJCQkJCSBtX1NoYkluc3RhbmNlVHhHZW4sCisJCQkJCSBwRnJhbWVJbmZvX3AtPm1fcEZyYW1lLAorCQkJCQkgcEZyYW1lSW5mb19wLT5tX3VpRnJhbWVTaXplKTsKKwkJLy8gcmV0dXJucyBrU2hiT2ssIGtTaGJFeGNlZWREYXRhU2l6ZUxpbWl0LCBrU2hiQnVmZmVyRnVsbCwga1NoYkludmFsaWRBcmcKKwkJYnJlYWs7CisKKwl9CisKKwkvLyBlcnJvciBoYW5kbGluZworCXN3aXRjaCAoU2hiRXJyb3IpIHsKKwljYXNlIGtTaGJPazoKKwkJYnJlYWs7CisKKwljYXNlIGtTaGJFeGNlZWREYXRhU2l6ZUxpbWl0OgorCQlSZXQgPSBrRXBsRGxsQXN5bmNUeEJ1ZmZlckZ1bGw7CisJCWJyZWFrOworCisJY2FzZSBrU2hiQnVmZmVyRnVsbDoKKwkJUmV0ID0ga0VwbERsbEFzeW5jVHhCdWZmZXJGdWxsOworCQlicmVhazsKKworCWNhc2Uga1NoYkludmFsaWRBcmc6CisJZGVmYXVsdDoKKwkJUmV0ID0ga0VwbE5vUmVzb3VyY2U7CisJCWJyZWFrOworCX0KKworI2Vsc2UKKworCXN3aXRjaCAoUHJpb3JpdHlfcCkgeworCWNhc2Uga0VwbERsbEFzeW5jUmVxUHJpb05tdDoJLy8gTk1UIHJlcXVlc3QgcHJpb3JpdHkKKwkJaWYgKEVwbERsbGtDYWxJbnN0YW5jZV9nLm1fdWlGcmFtZVNpemVObXQgPT0gMCkgeworCQkJRVBMX01FTUNQWShFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX2FiRnJhbWVObXQsCisJCQkJICAgcEZyYW1lSW5mb19wLT5tX3BGcmFtZSwKKwkJCQkgICBwRnJhbWVJbmZvX3AtPm1fdWlGcmFtZVNpemUpOworCQkJRXBsRGxsa0NhbEluc3RhbmNlX2cubV91aUZyYW1lU2l6ZU5tdCA9CisJCQkgICAgcEZyYW1lSW5mb19wLT5tX3VpRnJhbWVTaXplOworCQl9IGVsc2UgeworCQkJUmV0ID0ga0VwbERsbEFzeW5jVHhCdWZmZXJGdWxsOworCQkJZ290byBFeGl0OworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoJCS8vIGdlbmVyaWMgcHJpb3JpdHkKKwkJaWYgKEVwbERsbGtDYWxJbnN0YW5jZV9nLm1fdWlGcmFtZVNpemVHZW4gPT0gMCkgeworCQkJRVBMX01FTUNQWShFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX2FiRnJhbWVHZW4sCisJCQkJICAgcEZyYW1lSW5mb19wLT5tX3BGcmFtZSwKKwkJCQkgICBwRnJhbWVJbmZvX3AtPm1fdWlGcmFtZVNpemUpOworCQkJRXBsRGxsa0NhbEluc3RhbmNlX2cubV91aUZyYW1lU2l6ZUdlbiA9CisJCQkgICAgcEZyYW1lSW5mb19wLT5tX3VpRnJhbWVTaXplOworCQl9IGVsc2UgeworCQkJUmV0ID0ga0VwbERsbEFzeW5jVHhCdWZmZXJGdWxsOworCQkJZ290byBFeGl0OworCQl9CisJCWJyZWFrOworCX0KKworI2VuZGlmCisKKwkvLyBwb3N0IGV2ZW50IHRvIERMTAorCUV2ZW50Lm1fRXZlbnRTaW5rID0ga0VwbEV2ZW50U2lua0RsbGs7CisJRXZlbnQubV9FdmVudFR5cGUgPSBrRXBsRXZlbnRUeXBlRGxsa0ZpbGxUeDsKKwlFUExfTUVNU0VUKCZFdmVudC5tX05ldFRpbWUsIDB4MDAsIHNpemVvZihFdmVudC5tX05ldFRpbWUpKTsKKwlFdmVudC5tX3BBcmcgPSAmUHJpb3JpdHlfcDsKKwlFdmVudC5tX3VpU2l6ZSA9IHNpemVvZihQcmlvcml0eV9wKTsKKwlSZXQgPSBFcGxFdmVudGtQb3N0KCZFdmVudCk7CisKKyNpZmRlZiBFUExfTk9fRklGTworICAgICAgRXhpdDoKKyNlbmRpZgorCisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsRGxsa0NhbEFzeW5jQ2xlYXJCdWZmZXIoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBjbGVhcnMgdGhlIHRyYW5zbWl0IGJ1ZmZlcgorLy8KKy8vIFBhcmFtZXRlcnM6ICAobm9uZSkKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgRXBsRGxsa0NhbEFzeW5jQ2xlYXJCdWZmZXIodm9pZCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworI2lmbmRlZiBFUExfTk9fRklGTworCXRTaGJFcnJvciBTaGJFcnJvcjsKKworCVNoYkVycm9yID0KKwkgICAgU2hiQ2lyUmVzZXRCdWZmZXIoRXBsRGxsa0NhbEluc3RhbmNlX2cubV9TaGJJbnN0YW5jZVR4Tm10LCAxMDAwLAorCQkJICAgICAgTlVMTCk7CisJU2hiRXJyb3IgPQorCSAgICBTaGJDaXJSZXNldEJ1ZmZlcihFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX1NoYkluc3RhbmNlVHhHZW4sIDEwMDAsCisJCQkgICAgICBOVUxMKTsKKworI2Vsc2UKKwlFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX3VpRnJhbWVTaXplTm10ID0gMDsKKwlFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX3VpRnJhbWVTaXplR2VuID0gMDsKKyNlbmRpZgorCisvLyAgICBFUExfTUVNU0VUKCZFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX1N0YXRpc3RpY3MsIDAsIHNpemVvZiAodEVwbERsbGtDYWxTdGF0aXN0aWNzKSk7CisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsRGxsa0NhbEFzeW5jQ2xlYXJRdWV1ZXMoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBjbGVhcnMgdGhlIHRyYW5zbWl0IGJ1ZmZlcgorLy8KKy8vIFBhcmFtZXRlcnM6ICAobm9uZSkKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVF9NTikpICE9IDApCit0RXBsS2VybmVsIEVwbERsbGtDYWxBc3luY0NsZWFyUXVldWVzKHZvaWQpCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCS8vIGNsZWFyIE1OIGFzeW5jaHJvbm91cyBxdWV1ZXMKKwlFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX3VpTmV4dFF1ZXVlQ25SZXF1ZXN0ID0gMDsKKwlFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX3VpTmV4dFJlcXVlc3RRdWV1ZSA9IDA7CisJRXBsRGxsa0NhbEluc3RhbmNlX2cubV91aVJlYWRJZGVudFJlcSA9IDA7CisJRXBsRGxsa0NhbEluc3RhbmNlX2cubV91aVdyaXRlSWRlbnRSZXEgPSAwOworCUVwbERsbGtDYWxJbnN0YW5jZV9nLm1fdWlSZWFkU3RhdHVzUmVxID0gMDsKKwlFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX3VpV3JpdGVTdGF0dXNSZXEgPSAwOworCisJcmV0dXJuIFJldDsKK30KKyNlbmRpZgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxEbGxrQ2FsR2V0U3RhdGlzdGljcygpCisvLworLy8gRGVzY3JpcHRpb246IHJldHVybnMgc3RhdGlzdGljcyBvZiB0aGUgYXN5bmNocm9ub3VzIHF1ZXVlcy4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgcHBTdGF0aXN0aWNzICAgICAgICAgICAgPSBzdGF0aXN0aWNzIHN0cnVjdHVyZQorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordEVwbEtlcm5lbCBFcGxEbGxrQ2FsR2V0U3RhdGlzdGljcyh0RXBsRGxsa0NhbFN0YXRpc3RpY3MgKiogcHBTdGF0aXN0aWNzKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisjaWZuZGVmIEVQTF9OT19GSUZPCisJdFNoYkVycm9yIFNoYkVycm9yOworCisJU2hiRXJyb3IgPQorCSAgICBTaGJDaXJHZXRSZWFkQmxvY2tDb3VudChFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX1NoYkluc3RhbmNlVHhObXQsCisJCQkJICAgICZFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX1N0YXRpc3RpY3MuCisJCQkJICAgIG1fdWxDdXJUeEZyYW1lQ291bnRObXQpOworCVNoYkVycm9yID0KKwkgICAgU2hiQ2lyR2V0UmVhZEJsb2NrQ291bnQoRXBsRGxsa0NhbEluc3RhbmNlX2cubV9TaGJJbnN0YW5jZVR4R2VuLAorCQkJCSAgICAmRXBsRGxsa0NhbEluc3RhbmNlX2cubV9TdGF0aXN0aWNzLgorCQkJCSAgICBtX3VsQ3VyVHhGcmFtZUNvdW50R2VuKTsKKy8vICAgIFNoYkVycm9yID0gU2hiQ2lyR2V0UmVhZEJsb2NrQ291bnQgKEVwbERsbGtDYWxJbnN0YW5jZV9nLm1fU2hiSW5zdGFuY2VSeCwgJkVwbERsbGtDYWxJbnN0YW5jZV9nLm1fU3RhdGlzdGljcy5tX3VsQ3VyUnhGcmFtZUNvdW50KTsKKworI2Vsc2UKKwlpZiAoRXBsRGxsa0NhbEluc3RhbmNlX2cubV91aUZyYW1lU2l6ZU5tdCA+IDApIHsKKwkJRXBsRGxsa0NhbEluc3RhbmNlX2cubV9TdGF0aXN0aWNzLm1fdWxDdXJUeEZyYW1lQ291bnRObXQgPSAxOworCX0gZWxzZSB7CisJCUVwbERsbGtDYWxJbnN0YW5jZV9nLm1fU3RhdGlzdGljcy5tX3VsQ3VyVHhGcmFtZUNvdW50Tm10ID0gMDsKKwl9CisJaWYgKEVwbERsbGtDYWxJbnN0YW5jZV9nLm1fdWlGcmFtZVNpemVHZW4gPiAwKSB7CisJCUVwbERsbGtDYWxJbnN0YW5jZV9nLm1fU3RhdGlzdGljcy5tX3VsQ3VyVHhGcmFtZUNvdW50R2VuID0gMTsKKwl9IGVsc2UgeworCQlFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX1N0YXRpc3RpY3MubV91bEN1clR4RnJhbWVDb3VudEdlbiA9IDA7CisJfQorI2VuZGlmCisKKwkqcHBTdGF0aXN0aWNzID0gJkVwbERsbGtDYWxJbnN0YW5jZV9nLm1fU3RhdGlzdGljczsKKwlyZXR1cm4gUmV0OworfQorCisjaWYgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRfTU4pKSAhPSAwKQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxEbGxrQ2FsSXNzdWVSZXF1ZXN0KCkKKy8vCisvLyBEZXNjcmlwdGlvbjogaXNzdWVzIGEgU3RhdHVzUmVxdWVzdCBvciBhIElkZW50UmVxdWVzdCB0byB0aGUgc3BlY2lmaWVkIG5vZGUuCisvLworLy8gUGFyYW1ldGVyczogIFNlcnZpY2VfcCAgICAgICAgICAgICAgID0gcmVxdWVzdCBzZXJ2aWNlIElECisvLyAgICAgICAgICAgICAgdWlOb2RlSWRfcCAgICAgICAgICAgICAgPSBub2RlIElECisvLyAgICAgICAgICAgICAgYlNvYUZsYWcxX3AgICAgICAgICAgICAgPSBmbGFnMSBmb3IgdGhpcyBub2RlICh0cmFuc21pdCBpbiBTb0EgYW5kIFBSZXEpCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiAweEZGIHRoaXMgZmxhZyBpcyBpZ25vcmVkLgorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordEVwbEtlcm5lbCBFcGxEbGxrQ2FsSXNzdWVSZXF1ZXN0KHRFcGxEbGxSZXFTZXJ2aWNlSWQgU2VydmljZV9wLAorCQkJCSAgdW5zaWduZWQgaW50IHVpTm9kZUlkX3AsIEJZVEUgYlNvYUZsYWcxX3ApCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCWlmIChiU29hRmxhZzFfcCAhPSAweEZGKSB7CisJCVJldCA9IEVwbERsbGtTZXRGbGFnMU9mTm9kZSh1aU5vZGVJZF9wLCBiU29hRmxhZzFfcCk7CisJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCWdvdG8gRXhpdDsKKwkJfQorCX0KKwkvLyBhZGQgbm9kZSB0byBhcHByb3ByaWF0ZSByZXF1ZXN0IHF1ZXVlCisJc3dpdGNoIChTZXJ2aWNlX3ApIHsKKwljYXNlIGtFcGxEbGxSZXFTZXJ2aWNlSWRlbnQ6CisJCXsKKwkJCWlmICgoKEVwbERsbGtDYWxJbnN0YW5jZV9nLm1fdWlXcml0ZUlkZW50UmVxICsKKwkJCSAgICAgIDEpICUKKwkJCSAgICAgdGFiZW50cmllcyhFcGxEbGxrQ2FsSW5zdGFuY2VfZy4KKwkJCQkJbV9hdWlRdWV1ZUlkZW50UmVxKSkKKwkJCSAgICA9PSBFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX3VpUmVhZElkZW50UmVxKSB7CS8vIHF1ZXVlIGlzIGZ1bGwKKwkJCQlSZXQgPSBrRXBsRGxsQXN5bmNUeEJ1ZmZlckZ1bGw7CisJCQkJZ290byBFeGl0OworCQkJfQorCQkJRXBsRGxsa0NhbEluc3RhbmNlX2cuCisJCQkgICAgbV9hdWlRdWV1ZUlkZW50UmVxW0VwbERsbGtDYWxJbnN0YW5jZV9nLgorCQkJCQkgICAgICAgbV91aVdyaXRlSWRlbnRSZXFdID0gdWlOb2RlSWRfcDsKKwkJCUVwbERsbGtDYWxJbnN0YW5jZV9nLm1fdWlXcml0ZUlkZW50UmVxID0KKwkJCSAgICAoRXBsRGxsa0NhbEluc3RhbmNlX2cubV91aVdyaXRlSWRlbnRSZXEgKworCQkJICAgICAxKSAlCisJCQkgICAgdGFiZW50cmllcyhFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX2F1aVF1ZXVlSWRlbnRSZXEpOworCQkJYnJlYWs7CisJCX0KKworCWNhc2Uga0VwbERsbFJlcVNlcnZpY2VTdGF0dXM6CisJCXsKKwkJCWlmICgoKEVwbERsbGtDYWxJbnN0YW5jZV9nLm1fdWlXcml0ZVN0YXR1c1JlcSArCisJCQkgICAgICAxKSAlCisJCQkgICAgIHRhYmVudHJpZXMoRXBsRGxsa0NhbEluc3RhbmNlX2cuCisJCQkJCW1fYXVpUXVldWVTdGF0dXNSZXEpKQorCQkJICAgID09IEVwbERsbGtDYWxJbnN0YW5jZV9nLm1fdWlSZWFkU3RhdHVzUmVxKSB7CS8vIHF1ZXVlIGlzIGZ1bGwKKwkJCQlSZXQgPSBrRXBsRGxsQXN5bmNUeEJ1ZmZlckZ1bGw7CisJCQkJZ290byBFeGl0OworCQkJfQorCQkJRXBsRGxsa0NhbEluc3RhbmNlX2cuCisJCQkgICAgbV9hdWlRdWV1ZVN0YXR1c1JlcVtFcGxEbGxrQ2FsSW5zdGFuY2VfZy4KKwkJCQkJCW1fdWlXcml0ZVN0YXR1c1JlcV0gPQorCQkJICAgIHVpTm9kZUlkX3A7CisJCQlFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX3VpV3JpdGVTdGF0dXNSZXEgPQorCQkJICAgIChFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX3VpV3JpdGVTdGF0dXNSZXEgKworCQkJICAgICAxKSAlCisJCQkgICAgdGFiZW50cmllcyhFcGxEbGxrQ2FsSW5zdGFuY2VfZy4KKwkJCQkgICAgICAgbV9hdWlRdWV1ZVN0YXR1c1JlcSk7CisJCQlicmVhazsKKwkJfQorCisJZGVmYXVsdDoKKwkJeworCQkJUmV0ID0ga0VwbERsbEludmFsaWRQYXJhbTsKKwkJCWdvdG8gRXhpdDsKKwkJfQorCX0KKworICAgICAgRXhpdDoKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxEbGxrQ2FsQXN5bmNHZXRTb2FSZXF1ZXN0KCkKKy8vCisvLyBEZXNjcmlwdGlvbjogcmV0dXJucyBuZXh0IHJlcXVlc3QgZm9yIFNvQS4gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgRExMayBtb2R1bGUuCisvLworLy8gUGFyYW1ldGVyczogIHBSZXFTZXJ2aWNlSWRfcCAgICAgICAgID0gcG9pbnRlciB0byByZXF1ZXN0IHNlcnZpY2UgSUQKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOOiBhdmFpbGFibGUgcmVxdWVzdCBmb3IgTU4gTk1UIG9yIGdlbmVyaWMgcmVxdWVzdCBxdWV1ZSAoRmxhZzIuUFIpCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3Iga0VwbERsbFJlcVNlcnZpY2VObyBpZiBxdWV1ZXMgYXJlIGVtcHR5CisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPVVQ6IG5leHQgcmVxdWVzdAorLy8gICAgICAgICAgICAgIHB1aU5vZGVJZF9wICAgICAgICAgICAgID0gT1VUOiBwb2ludGVyIHRvIG5vZGUgSUQgb2YgbmV4dCByZXF1ZXN0CisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gRVBMX0NfQURSX0lOVkFMSUQsIGlmIHJlcXVlc3QgaXMgc2VsZiBhZGRyZXNzZWQKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgRXBsRGxsa0NhbEFzeW5jR2V0U29hUmVxdWVzdCh0RXBsRGxsUmVxU2VydmljZUlkICogcFJlcVNlcnZpY2VJZF9wLAorCQkJCQl1bnNpZ25lZCBpbnQgKnB1aU5vZGVJZF9wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJdW5zaWduZWQgaW50IHVpQ291bnQ7CisKKy8vICAgICpwUmVxU2VydmljZUlkX3AgPSBrRXBsRGxsUmVxU2VydmljZU5vOworCisJZm9yICh1aUNvdW50ID0gRVBMX0RMTEtDQUxfTUFYX1FVRVVFUzsgdWlDb3VudCA+IDA7IHVpQ291bnQtLSkgeworCQlzd2l0Y2ggKEVwbERsbGtDYWxJbnN0YW5jZV9nLm1fdWlOZXh0UmVxdWVzdFF1ZXVlKSB7CisJCWNhc2UgMDoKKwkJCXsJLy8gQ25HZW5SZXEKKwkJCQlmb3IgKDsKKwkJCQkgICAgIEVwbERsbGtDYWxJbnN0YW5jZV9nLgorCQkJCSAgICAgbV91aU5leHRRdWV1ZUNuUmVxdWVzdCA8CisJCQkJICAgICAodGFiZW50cmllcworCQkJCSAgICAgIChFcGxEbGxrQ2FsSW5zdGFuY2VfZy4KKwkJCQkgICAgICAgbV9hdWlRdWV1ZUNuUmVxdWVzdHMpIC8gMik7CisJCQkJICAgICBFcGxEbGxrQ2FsSW5zdGFuY2VfZy4KKwkJCQkgICAgIG1fdWlOZXh0UXVldWVDblJlcXVlc3QrKykgeworCQkJCQlpZiAoRXBsRGxsa0NhbEluc3RhbmNlX2cubV9hdWlRdWV1ZUNuUmVxdWVzdHNbRXBsRGxsa0NhbEluc3RhbmNlX2cubV91aU5leHRRdWV1ZUNuUmVxdWVzdF0gPiAwKSB7CS8vIG5vbiBlbXB0eSBxdWV1ZSBmb3VuZAorCQkJCQkJLy8gcmVtb3ZlIG9uZSByZXF1ZXN0IGZyb20gcXVldWUKKwkJCQkJCUVwbERsbGtDYWxJbnN0YW5jZV9nLgorCQkJCQkJICAgIG1fYXVpUXVldWVDblJlcXVlc3RzCisJCQkJCQkgICAgW0VwbERsbGtDYWxJbnN0YW5jZV9nLgorCQkJCQkJICAgICBtX3VpTmV4dFF1ZXVlQ25SZXF1ZXN0XS0tOworCQkJCQkJKnB1aU5vZGVJZF9wID0KKwkJCQkJCSAgICBFcGxEbGxrQ2FsSW5zdGFuY2VfZy4KKwkJCQkJCSAgICBtX3VpTmV4dFF1ZXVlQ25SZXF1ZXN0ICsgMTsKKwkJCQkJCSpwUmVxU2VydmljZUlkX3AgPQorCQkJCQkJICAgIGtFcGxEbGxSZXFTZXJ2aWNlVW5zcGVjaWZpZWQ7CisJCQkJCQlFcGxEbGxrQ2FsSW5zdGFuY2VfZy4KKwkJCQkJCSAgICBtX3VpTmV4dFF1ZXVlQ25SZXF1ZXN0Kys7CisJCQkJCQlpZiAoRXBsRGxsa0NhbEluc3RhbmNlX2cubV91aU5leHRRdWV1ZUNuUmVxdWVzdCA+PSAodGFiZW50cmllcyhFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX2F1aVF1ZXVlQ25SZXF1ZXN0cykgLyAyKSkgewkvLyBsYXN0IG5vZGUgcmVhY2hlZAorCQkJCQkJCS8vIGNvbnRpbnVlIHdpdGggQ25ObXRSZXEgcXVldWUgYXQgbmV4dCBTb0EKKwkJCQkJCQlFcGxEbGxrQ2FsSW5zdGFuY2VfZy4KKwkJCQkJCQkgICAgbV91aU5leHRSZXF1ZXN0UXVldWUKKwkJCQkJCQkgICAgPSAxOworCQkJCQkJfQorCQkJCQkJZ290byBFeGl0OworCQkJCQl9CisJCQkJfQorCQkJCS8vIGFsbCBDbkdlblJlcSBxdWV1ZXMgYXJlIGVtcHR5IC0+IGNvbnRpbnVlIHdpdGggQ25ObXRSZXEgcXVldWUKKwkJCQlFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX3VpTmV4dFJlcXVlc3RRdWV1ZSA9IDE7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJY2FzZSAxOgorCQkJewkvLyBDbk5tdFJlcQorCQkJCWZvciAoOworCQkJCSAgICAgRXBsRGxsa0NhbEluc3RhbmNlX2cuCisJCQkJICAgICBtX3VpTmV4dFF1ZXVlQ25SZXF1ZXN0IDwKKwkJCQkgICAgIHRhYmVudHJpZXMoRXBsRGxsa0NhbEluc3RhbmNlX2cuCisJCQkJCQltX2F1aVF1ZXVlQ25SZXF1ZXN0cyk7CisJCQkJICAgICBFcGxEbGxrQ2FsSW5zdGFuY2VfZy4KKwkJCQkgICAgIG1fdWlOZXh0UXVldWVDblJlcXVlc3QrKykgeworCQkJCQlpZiAoRXBsRGxsa0NhbEluc3RhbmNlX2cubV9hdWlRdWV1ZUNuUmVxdWVzdHNbRXBsRGxsa0NhbEluc3RhbmNlX2cubV91aU5leHRRdWV1ZUNuUmVxdWVzdF0gPiAwKSB7CS8vIG5vbiBlbXB0eSBxdWV1ZSBmb3VuZAorCQkJCQkJLy8gcmVtb3ZlIG9uZSByZXF1ZXN0IGZyb20gcXVldWUKKwkJCQkJCUVwbERsbGtDYWxJbnN0YW5jZV9nLgorCQkJCQkJICAgIG1fYXVpUXVldWVDblJlcXVlc3RzCisJCQkJCQkgICAgW0VwbERsbGtDYWxJbnN0YW5jZV9nLgorCQkJCQkJICAgICBtX3VpTmV4dFF1ZXVlQ25SZXF1ZXN0XS0tOworCQkJCQkJKnB1aU5vZGVJZF9wID0KKwkJCQkJCSAgICBFcGxEbGxrQ2FsSW5zdGFuY2VfZy4KKwkJCQkJCSAgICBtX3VpTmV4dFF1ZXVlQ25SZXF1ZXN0ICsgMSAtCisJCQkJCQkgICAgKHRhYmVudHJpZXMKKwkJCQkJCSAgICAgKEVwbERsbGtDYWxJbnN0YW5jZV9nLgorCQkJCQkJICAgICAgbV9hdWlRdWV1ZUNuUmVxdWVzdHMpIC8KKwkJCQkJCSAgICAgMik7CisJCQkJCQkqcFJlcVNlcnZpY2VJZF9wID0KKwkJCQkJCSAgICBrRXBsRGxsUmVxU2VydmljZU5tdFJlcXVlc3Q7CisJCQkJCQlFcGxEbGxrQ2FsSW5zdGFuY2VfZy4KKwkJCQkJCSAgICBtX3VpTmV4dFF1ZXVlQ25SZXF1ZXN0Kys7CisJCQkJCQlpZiAoRXBsRGxsa0NhbEluc3RhbmNlX2cubV91aU5leHRRdWV1ZUNuUmVxdWVzdCA+IHRhYmVudHJpZXMoRXBsRGxsa0NhbEluc3RhbmNlX2cubV9hdWlRdWV1ZUNuUmVxdWVzdHMpKSB7CS8vIGxhc3Qgbm9kZSByZWFjaGVkCisJCQkJCQkJLy8gcmVzdGFydCBDbkdlblJlcSBxdWV1ZQorCQkJCQkJCUVwbERsbGtDYWxJbnN0YW5jZV9nLgorCQkJCQkJCSAgICBtX3VpTmV4dFF1ZXVlQ25SZXF1ZXN0CisJCQkJCQkJICAgID0gMDsKKwkJCQkJCQkvLyBjb250aW51ZSB3aXRoIE1uR2VuUmVxIHF1ZXVlIGF0IG5leHQgU29BCisJCQkJCQkJRXBsRGxsa0NhbEluc3RhbmNlX2cuCisJCQkJCQkJICAgIG1fdWlOZXh0UmVxdWVzdFF1ZXVlCisJCQkJCQkJICAgID0gMjsKKwkJCQkJCX0KKwkJCQkJCWdvdG8gRXhpdDsKKwkJCQkJfQorCQkJCX0KKwkJCQkvLyByZXN0YXJ0IENuR2VuUmVxIHF1ZXVlCisJCQkJRXBsRGxsa0NhbEluc3RhbmNlX2cubV91aU5leHRRdWV1ZUNuUmVxdWVzdCA9IDA7CisJCQkJLy8gYWxsIENuTm10UmVxIHF1ZXVlcyBhcmUgZW1wdHkgLT4gY29udGludWUgd2l0aCBNbkdlblJlcSBxdWV1ZQorCQkJCUVwbERsbGtDYWxJbnN0YW5jZV9nLm1fdWlOZXh0UmVxdWVzdFF1ZXVlID0gMjsKKwkJCQlicmVhazsKKwkJCX0KKworCQljYXNlIDI6CisJCQl7CS8vIE1uTm10UmVxIGFuZCBNbkdlblJlcQorCQkJCS8vIG5leHQgcXVldWUgd2lsbCBiZSBNbklkZW50UmVxIHF1ZXVlCisJCQkJRXBsRGxsa0NhbEluc3RhbmNlX2cubV91aU5leHRSZXF1ZXN0UXVldWUgPSAzOworCQkJCWlmICgqcFJlcVNlcnZpY2VJZF9wICE9IGtFcGxEbGxSZXFTZXJ2aWNlTm8pIHsKKwkJCQkJKnB1aU5vZGVJZF9wID0gRVBMX0NfQURSX0lOVkFMSUQ7CS8vIERMTGsgbXVzdCBleGNoYW5nZSB0aGlzIHdpdGggdGhlIGFjdHVhbCBub2RlIElECisJCQkJCWdvdG8gRXhpdDsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9CisKKwkJY2FzZSAzOgorCQkJewkvLyBNbklkZW50UmVxCisJCQkJLy8gbmV4dCBxdWV1ZSB3aWxsIGJlIE1uU3RhdHVzUmVxIHF1ZXVlCisJCQkJRXBsRGxsa0NhbEluc3RhbmNlX2cubV91aU5leHRSZXF1ZXN0UXVldWUgPSA0OworCQkJCWlmIChFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX3VpUmVhZElkZW50UmVxICE9IEVwbERsbGtDYWxJbnN0YW5jZV9nLm1fdWlXcml0ZUlkZW50UmVxKSB7CS8vIHF1ZXVlIGlzIG5vdCBlbXB0eQorCQkJCQkqcHVpTm9kZUlkX3AgPQorCQkJCQkgICAgRXBsRGxsa0NhbEluc3RhbmNlX2cuCisJCQkJCSAgICBtX2F1aVF1ZXVlSWRlbnRSZXEKKwkJCQkJICAgIFtFcGxEbGxrQ2FsSW5zdGFuY2VfZy4KKwkJCQkJICAgICBtX3VpUmVhZElkZW50UmVxXTsKKwkJCQkJRXBsRGxsa0NhbEluc3RhbmNlX2cubV91aVJlYWRJZGVudFJlcSA9CisJCQkJCSAgICAoRXBsRGxsa0NhbEluc3RhbmNlX2cuCisJCQkJCSAgICAgbV91aVJlYWRJZGVudFJlcSArCisJCQkJCSAgICAgMSkgJQorCQkJCQkgICAgdGFiZW50cmllcyhFcGxEbGxrQ2FsSW5zdGFuY2VfZy4KKwkJCQkJCSAgICAgICBtX2F1aVF1ZXVlSWRlbnRSZXEpOworCQkJCQkqcFJlcVNlcnZpY2VJZF9wID0KKwkJCQkJICAgIGtFcGxEbGxSZXFTZXJ2aWNlSWRlbnQ7CisJCQkJCWdvdG8gRXhpdDsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9CisKKwkJY2FzZSA0OgorCQkJewkvLyBNblN0YXR1c1JlcQorCQkJCS8vIG5leHQgcXVldWUgd2lsbCBiZSBDbkdlblJlcSBxdWV1ZQorCQkJCUVwbERsbGtDYWxJbnN0YW5jZV9nLm1fdWlOZXh0UmVxdWVzdFF1ZXVlID0gMDsKKwkJCQlpZiAoRXBsRGxsa0NhbEluc3RhbmNlX2cubV91aVJlYWRTdGF0dXNSZXEgIT0gRXBsRGxsa0NhbEluc3RhbmNlX2cubV91aVdyaXRlU3RhdHVzUmVxKSB7CS8vIHF1ZXVlIGlzIG5vdCBlbXB0eQorCQkJCQkqcHVpTm9kZUlkX3AgPQorCQkJCQkgICAgRXBsRGxsa0NhbEluc3RhbmNlX2cuCisJCQkJCSAgICBtX2F1aVF1ZXVlU3RhdHVzUmVxCisJCQkJCSAgICBbRXBsRGxsa0NhbEluc3RhbmNlX2cuCisJCQkJCSAgICAgbV91aVJlYWRTdGF0dXNSZXFdOworCQkJCQlFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX3VpUmVhZFN0YXR1c1JlcSA9CisJCQkJCSAgICAoRXBsRGxsa0NhbEluc3RhbmNlX2cuCisJCQkJCSAgICAgbV91aVJlYWRTdGF0dXNSZXEgKworCQkJCQkgICAgIDEpICUKKwkJCQkJICAgIHRhYmVudHJpZXMoRXBsRGxsa0NhbEluc3RhbmNlX2cuCisJCQkJCQkgICAgICAgbV9hdWlRdWV1ZVN0YXR1c1JlcSk7CisJCQkJCSpwUmVxU2VydmljZUlkX3AgPQorCQkJCQkgICAga0VwbERsbFJlcVNlcnZpY2VTdGF0dXM7CisJCQkJCWdvdG8gRXhpdDsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9CisKKwkJfQorCX0KKworICAgICAgRXhpdDoKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxEbGxrQ2FsQXN5bmNTZXRQZW5kaW5nUmVxdWVzdHMoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBzZXRzIHRoZSBwZW5kaW5nIGFzeW5jaHJvbm91cyBmcmFtZSByZXF1ZXN0cyBvZiB0aGUgc3BlY2lmaWVkIG5vZGUuCisvLyAgICAgICAgICAgICAgVGhpcyB3aWxsIGFkZCB0aGUgbm9kZSB0byB0aGUgYXN5bmNocm9ub3VzIHJlcXVlc3Qgc2NoZWR1bGVyLgorLy8KKy8vIFBhcmFtZXRlcnM6ICB1aU5vZGVJZF9wICAgICAgICAgICAgICA9IG5vZGUgSUQKKy8vICAgICAgICAgICAgICBBc3luY1JlcVByaW9fcCAgICAgICAgICA9IGFzeW5jaHJvbm91cyByZXF1ZXN0IHByaW9yaXR5CisvLyAgICAgICAgICAgICAgdWlDb3VudF9wICAgICAgICAgICAgICAgPSBjb3VudCBvZiBhc3luY2hyb25vdXMgZnJhbWVzCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIEVwbERsbGtDYWxBc3luY1NldFBlbmRpbmdSZXF1ZXN0cyh1bnNpZ25lZCBpbnQgdWlOb2RlSWRfcCwKKwkJCQkJICAgICB0RXBsRGxsQXN5bmNSZXFQcmlvcml0eQorCQkJCQkgICAgIEFzeW5jUmVxUHJpb19wLAorCQkJCQkgICAgIHVuc2lnbmVkIGludCB1aUNvdW50X3ApCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCS8vIGFkZCBub2RlIHRvIGFwcHJvcHJpYXRlIHJlcXVlc3QgcXVldWUKKwlzd2l0Y2ggKEFzeW5jUmVxUHJpb19wKSB7CisJY2FzZSBrRXBsRGxsQXN5bmNSZXFQcmlvTm10OgorCQl7CisJCQl1aU5vZGVJZF9wLS07CisJCQlpZiAodWlOb2RlSWRfcCA+PQorCQkJICAgICh0YWJlbnRyaWVzCisJCQkgICAgIChFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX2F1aVF1ZXVlQ25SZXF1ZXN0cykgLyAyKSkgeworCQkJCVJldCA9IGtFcGxEbGxJbnZhbGlkUGFyYW07CisJCQkJZ290byBFeGl0OworCQkJfQorCQkJdWlOb2RlSWRfcCArPQorCQkJICAgIHRhYmVudHJpZXMoRXBsRGxsa0NhbEluc3RhbmNlX2cuCisJCQkJICAgICAgIG1fYXVpUXVldWVDblJlcXVlc3RzKSAvIDI7CisJCQlFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX2F1aVF1ZXVlQ25SZXF1ZXN0c1t1aU5vZGVJZF9wXSA9CisJCQkgICAgdWlDb3VudF9wOworCQkJYnJlYWs7CisJCX0KKworCWRlZmF1bHQ6CisJCXsKKwkJCXVpTm9kZUlkX3AtLTsKKwkJCWlmICh1aU5vZGVJZF9wID49CisJCQkgICAgKHRhYmVudHJpZXMKKwkJCSAgICAgKEVwbERsbGtDYWxJbnN0YW5jZV9nLm1fYXVpUXVldWVDblJlcXVlc3RzKSAvIDIpKSB7CisJCQkJUmV0ID0ga0VwbERsbEludmFsaWRQYXJhbTsKKwkJCQlnb3RvIEV4aXQ7CisJCQl9CisJCQlFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX2F1aVF1ZXVlQ25SZXF1ZXN0c1t1aU5vZGVJZF9wXSA9CisJCQkgICAgdWlDb3VudF9wOworCQkJYnJlYWs7CisJCX0KKwl9CisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIFJldDsKK30KKyNlbmRpZiAvLygoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UX01OKSkgIT0gMCkKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICBQIFIgSSBWIEEgVCBFICAgRiBVIE4gQyBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgQ2FsbGJhY2sgaGFuZGxlciBmb3IgbmV3IGRhdGEgc2lnbmFsaW5nCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWZuZGVmIEVQTF9OT19GSUZPCisvKnN0YXRpYyB2b2lkICBFcGxEbGxrQ2FsVHhObXRTaWduYWxIYW5kbGVyICgKKyAgICB0U2hiSW5zdGFuY2UgcFNoYlJ4SW5zdGFuY2VfcCwKKyAgICB1bnNpZ25lZCBsb25nIHVsRGF0YVNpemVfcCkKK3sKK3RFcGxLZXJuZWwgICAgICBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKK3RFcGxFdmVudCAgICAgICBFdmVudDsKK3RFcGxEbGxBc3luY1JlcVByaW9yaXR5IFByaW9yaXR5OworI2lmbmRlZiBFUExfTk9fRklGTwordFNoYkVycm9yICAgU2hiRXJyb3I7Cit1bnNpZ25lZCBsb25nICAgdWxCbG9ja0NvdW50OworCisgICAgU2hiRXJyb3IgPSBTaGJDaXJHZXRSZWFkQmxvY2tDb3VudCAoRXBsRGxsa0NhbEluc3RhbmNlX2cubV9TaGJJbnN0YW5jZVR4Tm10LCAmdWxCbG9ja0NvdW50KTsKKyAgICBpZiAodWxCbG9ja0NvdW50ID4gRXBsRGxsa0NhbEluc3RhbmNlX2cubV9TdGF0aXN0aWNzLm1fdWxNYXhUeEZyYW1lQ291bnRObXQpCisgICAgeworICAgICAgICBFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX1N0YXRpc3RpY3MubV91bE1heFR4RnJhbWVDb3VudE5tdCA9IHVsQmxvY2tDb3VudDsKKyAgICB9CisKKyNlbmRpZgorCisgICAgLy8gcG9zdCBldmVudCB0byBETEwKKyAgICBQcmlvcml0eSA9IGtFcGxEbGxBc3luY1JlcVByaW9ObXQ7CisgICAgRXZlbnQubV9FdmVudFNpbmsgPSBrRXBsRXZlbnRTaW5rRGxsazsKKyAgICBFdmVudC5tX0V2ZW50VHlwZSA9IGtFcGxFdmVudFR5cGVEbGxrRmlsbFR4OworICAgIEVQTF9NRU1TRVQoJkV2ZW50Lm1fTmV0VGltZSwgMHgwMCwgc2l6ZW9mKEV2ZW50Lm1fTmV0VGltZSkpOworICAgIEV2ZW50Lm1fcEFyZyA9ICZQcmlvcml0eTsKKyAgICBFdmVudC5tX3VpU2l6ZSA9IHNpemVvZihQcmlvcml0eSk7CisgICAgUmV0ID0gRXBsRXZlbnRrUG9zdCgmRXZlbnQpOworCit9CisKK3N0YXRpYyB2b2lkICBFcGxEbGxrQ2FsVHhHZW5TaWduYWxIYW5kbGVyICgKKyAgICB0U2hiSW5zdGFuY2UgcFNoYlJ4SW5zdGFuY2VfcCwKKyAgICB1bnNpZ25lZCBsb25nIHVsRGF0YVNpemVfcCkKK3sKK3RFcGxLZXJuZWwgICAgICBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKK3RFcGxFdmVudCAgICAgICBFdmVudDsKK3RFcGxEbGxBc3luY1JlcVByaW9yaXR5IFByaW9yaXR5OworI2lmbmRlZiBFUExfTk9fRklGTwordFNoYkVycm9yICAgU2hiRXJyb3I7Cit1bnNpZ25lZCBsb25nICAgdWxCbG9ja0NvdW50OworCisgICAgU2hiRXJyb3IgPSBTaGJDaXJHZXRSZWFkQmxvY2tDb3VudCAoRXBsRGxsa0NhbEluc3RhbmNlX2cubV9TaGJJbnN0YW5jZVR4R2VuLCAmdWxCbG9ja0NvdW50KTsKKyAgICBpZiAodWxCbG9ja0NvdW50ID4gRXBsRGxsa0NhbEluc3RhbmNlX2cubV9TdGF0aXN0aWNzLm1fdWxNYXhUeEZyYW1lQ291bnRHZW4pCisgICAgeworICAgICAgICBFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX1N0YXRpc3RpY3MubV91bE1heFR4RnJhbWVDb3VudEdlbiA9IHVsQmxvY2tDb3VudDsKKyAgICB9CisKKyNlbmRpZgorCisgICAgLy8gcG9zdCBldmVudCB0byBETEwKKyAgICBQcmlvcml0eSA9IGtFcGxEbGxBc3luY1JlcVByaW9HZW5lcmljOworICAgIEV2ZW50Lm1fRXZlbnRTaW5rID0ga0VwbEV2ZW50U2lua0RsbGs7CisgICAgRXZlbnQubV9FdmVudFR5cGUgPSBrRXBsRXZlbnRUeXBlRGxsa0ZpbGxUeDsKKyAgICBFUExfTUVNU0VUKCZFdmVudC5tX05ldFRpbWUsIDB4MDAsIHNpemVvZihFdmVudC5tX05ldFRpbWUpKTsKKyAgICBFdmVudC5tX3BBcmcgPSAmUHJpb3JpdHk7CisgICAgRXZlbnQubV91aVNpemUgPSBzaXplb2YoUHJpb3JpdHkpOworICAgIFJldCA9IEVwbEV2ZW50a1Bvc3QoJkV2ZW50KTsKKworfQorKi8KKyNlbmRpZgorCisjZW5kaWYgLy8gI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9ETExLKSkgIT0gMCkKKworLy8gRU9GCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbERsbHVDYWwuYyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsRGxsdUNhbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmNGExNzQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbERsbHVDYWwuYwpAQCAtMCwwICsxLDUyOSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIHNvdXJjZSBmaWxlIGZvciBETEwgQ29tbXVuaWNhdGlvbiBBYnN0cmFjdGlvbiBMYXllciBtb2R1bGUgaW4gRVBMIHVzZXIgcGFydAorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgJFJDU2ZpbGU6IEVwbERsbHVDYWwuYyx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuNyAkICAkRGF0ZTogMjAwOC8xMC8xNyAxNTozMjozMiAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICAgICAgR0NDIFYzLjQKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUmV2aXNpb24gSGlzdG9yeToKKworICAyMDA2LzA2LzIwIGQuay46ICAgc3RhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uLCB2ZXJzaW9uIDEuMDAKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgInVzZXIvRXBsRGxsdUNhbC5oIgorI2luY2x1ZGUgInVzZXIvRXBsRXZlbnR1LmgiCisKKyNpbmNsdWRlICJFcGxEbGxDYWwuaCIKKworLy8gaW5jbHVkZSBvbmx5IGlmIGRpcmVjdCBjYWxsIGJldHdlZW4gdXNlci0gYW5kIGtlcm5lbHNwYWNlIGlzIGVuYWJsZWQKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfRExMSykpICE9IDApCisjaW5jbHVkZSAia2VybmVsL0VwbERsbGtDYWwuaCIKKyNlbmRpZgorCisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX0RMTFUpKSAhPSAwKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICBHIEwgTyBCIEEgTCAgIEQgRSBGIEkgTiBJIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvY2FsIHR5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbW9kdWwgZ2xvYmFsZSB2YXJzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgQyBMIEEgUyBTICBFcGxEbGx1Q2FsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8vCisvLyBEZXNjcmlwdGlvbjoKKy8vCisvLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICBQIFIgSSBWIEEgVCBFICAgRCBFIEYgSSBOIEkgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3R5cGVkZWYgc3RydWN0IHsKKwl0RXBsRGxsdUNiQXNuZCBtX2FwZm5EbGx1Q2JBc25kW0VQTF9ETExfTUFYX0FTTkRfU0VSVklDRV9JRF07CisKK30gdEVwbERsbHVDYWxJbnN0YW5jZTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvY2FsIHZhcnMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIGlmIG5vIGR5bmFtaWMgbWVtb3J5IGFsbG9jYXRpb24gc2hhbGwgYmUgdXNlZAorLy8gZGVmaW5lIHN0cnVjdHVyZXMgc3RhdGljYWxseQorc3RhdGljIHRFcGxEbGx1Q2FsSW5zdGFuY2UgRXBsRGxsdUNhbEluc3RhbmNlX2c7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdEVwbEtlcm5lbCBFcGxEbGx1Q2FsU2V0QXNuZFNlcnZpY2VJZEZpbHRlcih0RXBsRGxsQXNuZFNlcnZpY2VJZAorCQkJCQkJICAgU2VydmljZUlkX3AsCisJCQkJCQkgICB0RXBsRGxsQXNuZEZpbHRlciBGaWx0ZXJfcCk7CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgUCBVIEIgTCBJIEMgICBGIFUgTiBDIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxEbGx1Q2FsQWRkSW5zdGFuY2UoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBhZGQgYW5kIGluaXRpYWxpemUgbmV3IGluc3RhbmNlIG9mIERMTCBDQUwgbW9kdWxlCisvLworLy8gUGFyYW1ldGVyczogIG5vbmUKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgRXBsRGxsdUNhbEFkZEluc3RhbmNlKCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJLy8gcmVzZXQgaW5zdGFuY2Ugc3RydWN0dXJlCisJRVBMX01FTVNFVCgmRXBsRGxsdUNhbEluc3RhbmNlX2csIDAsIHNpemVvZihFcGxEbGx1Q2FsSW5zdGFuY2VfZykpOworCisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsRGxsdUNhbERlbEluc3RhbmNlKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogZGVsZXRlcyBhbiBpbnN0YW5jZSBvZiBETEwgQ0FMIG1vZHVsZQorLy8KKy8vIFBhcmFtZXRlcnM6ICBub25lCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIEVwbERsbHVDYWxEZWxJbnN0YW5jZSgpCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCS8vIHJlc2V0IGluc3RhbmNlIHN0cnVjdHVyZQorCUVQTF9NRU1TRVQoJkVwbERsbHVDYWxJbnN0YW5jZV9nLCAwLCBzaXplb2YoRXBsRGxsdUNhbEluc3RhbmNlX2cpKTsKKworCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbERsbHVDYWxQcm9jZXNzCisvLworLy8gRGVzY3JpcHRpb246IHByb2Nlc3MgdGhlIHBhc3NlZCBhc3luY2ggZnJhbWUKKy8vCisvLyBQYXJhbWV0ZXJzOiAgcEV2ZW50X3AgICAgICAgICAgICAgICAgPSBldmVudCBjb250YWluaW5nIGZyYW1lIHRvIGJlIHByb2Nlc3NlZAorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordEVwbEtlcm5lbCBFcGxEbGx1Q2FsUHJvY2Vzcyh0RXBsRXZlbnQgKiBwRXZlbnRfcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCXRFcGxNc2dUeXBlIE1zZ1R5cGU7CisJdW5zaWduZWQgaW50IHVpQXNuZFNlcnZpY2VJZDsKKwl0RXBsRnJhbWVJbmZvIEZyYW1lSW5mbzsKKworCWlmIChwRXZlbnRfcC0+bV9FdmVudFR5cGUgPT0ga0VwbEV2ZW50VHlwZUFzbmRSeCkgeworCQlGcmFtZUluZm8ubV9wRnJhbWUgPSAodEVwbEZyYW1lICopIHBFdmVudF9wLT5tX3BBcmc7CisJCUZyYW1lSW5mby5tX3VpRnJhbWVTaXplID0gcEV2ZW50X3AtPm1fdWlTaXplOworCQkvLyBleHRyYWN0IE5ldFRpbWUKKwkJRnJhbWVJbmZvLm1fTmV0VGltZSA9IHBFdmVudF9wLT5tX05ldFRpbWU7CisKKwkJTXNnVHlwZSA9CisJCSAgICAodEVwbE1zZ1R5cGUpIEFtaUdldEJ5dGVGcm9tTGUoJkZyYW1lSW5mby5tX3BGcmFtZS0+CisJCQkJCQkgICBtX2xlX2JNZXNzYWdlVHlwZSk7CisJCWlmIChNc2dUeXBlICE9IGtFcGxNc2dUeXBlQXNuZCkgeworCQkJUmV0ID0ga0VwbEludmFsaWRPcGVyYXRpb247CisJCQlnb3RvIEV4aXQ7CisJCX0KKworCQl1aUFzbmRTZXJ2aWNlSWQgPQorCQkgICAgKHVuc2lnbmVkIGludClBbWlHZXRCeXRlRnJvbUxlKCZGcmFtZUluZm8ubV9wRnJhbWUtPm1fRGF0YS4KKwkJCQkJCSAgIG1fQXNuZC5tX2xlX2JTZXJ2aWNlSWQpOworCQlpZiAodWlBc25kU2VydmljZUlkIDwgRVBMX0RMTF9NQVhfQVNORF9TRVJWSUNFX0lEKSB7CS8vIEFTbmQgc2VydmljZSBJRCBpcyB2YWxpZAorCQkJaWYgKEVwbERsbHVDYWxJbnN0YW5jZV9nLm1fYXBmbkRsbHVDYkFzbmRbdWlBc25kU2VydmljZUlkXSAhPSBOVUxMKSB7CS8vIGhhbmRsZXIgd2FzIHJlZ2lzdGVyZWQKKwkJCQlSZXQgPQorCQkJCSAgICBFcGxEbGx1Q2FsSW5zdGFuY2VfZy4KKwkJCQkgICAgbV9hcGZuRGxsdUNiQXNuZFt1aUFzbmRTZXJ2aWNlSWRdCisJCQkJICAgICgmRnJhbWVJbmZvKTsKKwkJCX0KKwkJfQorCX0KKworICAgICAgRXhpdDoKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxEbGx1Q2FsUmVnQXNuZFNlcnZpY2UoKQorLy8KKy8vIERlc2NyaXB0aW9uOiByZWdpc3RlcnMgdGhlIHNwZWNpZmllZCBoYW5kbGVyIGZvciB0aGUgc3BlY2lmaWVkCisvLyAgICAgICAgICAgICAgQXNuZFNlcnZpY2VJZCB3aXRoIHRoZSBzcGVjaWZpZWQgbm9kZSBJRCBmaWx0ZXIuCisvLworLy8gUGFyYW1ldGVyczogIFNlcnZpY2VJZF9wICAgICAgICAgICAgID0gQVNuZCBTZXJ2aWNlIElECisvLyAgICAgICAgICAgICAgcGZuRGxsdUNiQXNuZF9wICAgICAgICAgPSBjYWxsYmFjayBmdW5jdGlvbgorLy8gICAgICAgICAgICAgIEZpbHRlcl9wICAgICAgICAgICAgICAgID0gbm9kZSBJRCBmaWx0ZXIKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgRXBsRGxsdUNhbFJlZ0FzbmRTZXJ2aWNlKHRFcGxEbGxBc25kU2VydmljZUlkIFNlcnZpY2VJZF9wLAorCQkJCSAgICB0RXBsRGxsdUNiQXNuZCBwZm5EbGx1Q2JBc25kX3AsCisJCQkJICAgIHRFcGxEbGxBc25kRmlsdGVyIEZpbHRlcl9wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwlpZiAoU2VydmljZUlkX3AgPCB0YWJlbnRyaWVzKEVwbERsbHVDYWxJbnN0YW5jZV9nLm1fYXBmbkRsbHVDYkFzbmQpKSB7CisJCS8vIG1lbW9yaXplIGZ1bmN0aW9uIHBvaW50ZXIKKwkJRXBsRGxsdUNhbEluc3RhbmNlX2cubV9hcGZuRGxsdUNiQXNuZFtTZXJ2aWNlSWRfcF0gPQorCQkgICAgcGZuRGxsdUNiQXNuZF9wOworCisJCWlmIChwZm5EbGx1Q2JBc25kX3AgPT0gTlVMTCkgewkvLyBjbG9zZSBmaWx0ZXIKKwkJCUZpbHRlcl9wID0ga0VwbERsbEFzbmRGaWx0ZXJOb25lOworCQl9CisJCS8vIHNldCBmaWx0ZXIgaW4gRExMIG1vZHVsZSBpbiBrZXJuZWwgcGFydAorCQlSZXQgPSBFcGxEbGx1Q2FsU2V0QXNuZFNlcnZpY2VJZEZpbHRlcihTZXJ2aWNlSWRfcCwgRmlsdGVyX3ApOworCisJfQorCisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsRGxsdUNhbEFzeW5jU2VuZCgpCisvLworLy8gRGVzY3JpcHRpb246IHNlbmRzIHRoZSBmcmFtZSB3aXRoIHRoZSBzcGVjaWZpZWQgcHJpb3JpdHkuCisvLworLy8gUGFyYW1ldGVyczogIHBGcmFtZUluZm9fcCAgICAgICAgICAgID0gZnJhbWUKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdWlGcmFtZVNpemUgZG9lcyBub3QgaW5jbHVkZSB0aGUKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV0aGVybmV0IGhlYWRlciAoMTQgYnl0ZXMpCisvLyAgICAgICAgICAgICAgUHJpb3JpdHlfcCAgICAgICAgICAgICAgPSBwcmlvcml0eQorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordEVwbEtlcm5lbCBFcGxEbGx1Q2FsQXN5bmNTZW5kKHRFcGxGcmFtZUluZm8gKiBwRnJhbWVJbmZvX3AsCisJCQkgICAgICAgdEVwbERsbEFzeW5jUmVxUHJpb3JpdHkgUHJpb3JpdHlfcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX0RMTEspKSAhPSAwKQorCXBGcmFtZUluZm9fcC0+bV91aUZyYW1lU2l6ZSArPSAxNDsJLy8gYWRkIHNpemUgb2YgZXRoZXJuZXQgaGVhZGVyCisJUmV0ID0gRXBsRGxsa0NhbEFzeW5jU2VuZChwRnJhbWVJbmZvX3AsIFByaW9yaXR5X3ApOworI2Vsc2UKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKyNlbmRpZgorCisJcmV0dXJuIFJldDsKK30KKworI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRfTU4pKSAhPSAwKQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxEbGx1Q2FsSXNzdWVSZXF1ZXN0KCkKKy8vCisvLyBEZXNjcmlwdGlvbjogaXNzdWVzIGEgU3RhdHVzUmVxdWVzdCBvciBhIElkZW50UmVxdWVzdCB0byB0aGUgc3BlY2lmaWVkIG5vZGUuCisvLworLy8gUGFyYW1ldGVyczogIFNlcnZpY2VfcCAgICAgICAgICAgICAgID0gcmVxdWVzdCBzZXJ2aWNlIElECisvLyAgICAgICAgICAgICAgdWlOb2RlSWRfcCAgICAgICAgICAgICAgPSBub2RlIElECisvLyAgICAgICAgICAgICAgYlNvYUZsYWcxX3AgICAgICAgICAgICAgPSBmbGFnMSBmb3IgdGhpcyBub2RlICh0cmFuc21pdCBpbiBTb0EgYW5kIFBSZXEpCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiAweEZGIHRoaXMgZmxhZyBpcyBpZ25vcmVkLgorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordEVwbEtlcm5lbCBFcGxEbGx1Q2FsSXNzdWVSZXF1ZXN0KHRFcGxEbGxSZXFTZXJ2aWNlSWQgU2VydmljZV9wLAorCQkJCSAgdW5zaWduZWQgaW50IHVpTm9kZUlkX3AsIEJZVEUgYlNvYUZsYWcxX3ApCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCS8vIGFkZCBub2RlIHRvIGFwcHJvcHJpYXRlIHJlcXVlc3QgcXVldWUKKwlzd2l0Y2ggKFNlcnZpY2VfcCkgeworCWNhc2Uga0VwbERsbFJlcVNlcnZpY2VJZGVudDoKKwljYXNlIGtFcGxEbGxSZXFTZXJ2aWNlU3RhdHVzOgorCQl7CisJCQl0RXBsRXZlbnQgRXZlbnQ7CisJCQl0RXBsRGxsQ2FsSXNzdWVSZXF1ZXN0IElzc3VlUmVxOworCisJCQlFdmVudC5tX0V2ZW50U2luayA9IGtFcGxFdmVudFNpbmtEbGxrQ2FsOworCQkJRXZlbnQubV9FdmVudFR5cGUgPSBrRXBsRXZlbnRUeXBlRGxsa0lzc3VlUmVxOworCQkJSXNzdWVSZXEubV9TZXJ2aWNlID0gU2VydmljZV9wOworCQkJSXNzdWVSZXEubV91aU5vZGVJZCA9IHVpTm9kZUlkX3A7CisJCQlJc3N1ZVJlcS5tX2JTb2FGbGFnMSA9IGJTb2FGbGFnMV9wOworCQkJRXZlbnQubV9wQXJnID0gJklzc3VlUmVxOworCQkJRXZlbnQubV91aVNpemUgPSBzaXplb2YoSXNzdWVSZXEpOworCisJCQlSZXQgPSBFcGxFdmVudHVQb3N0KCZFdmVudCk7CisJCQlicmVhazsKKwkJfQorCisJZGVmYXVsdDoKKwkJeworCQkJUmV0ID0ga0VwbERsbEludmFsaWRQYXJhbTsKKwkJCWdvdG8gRXhpdDsKKwkJfQorCX0KKworICAgICAgRXhpdDoKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxEbGx1Q2FsQWRkTm9kZSgpCisvLworLy8gRGVzY3JpcHRpb246IGFkZHMgdGhlIHNwZWNpZmllZCBub2RlIHRvIHRoZSBpc29jaHJvbm91cyBwaGFzZS4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgcE5vZGVJbmZvX3AgICAgICAgICAgICAgPSBwb2ludGVyIG9mIG5vZGUgaW5mbyBzdHJ1Y3R1cmUKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgRXBsRGxsdUNhbEFkZE5vZGUodEVwbERsbE5vZGVJbmZvICogcE5vZGVJbmZvX3ApCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwl0RXBsRXZlbnQgRXZlbnQ7CisKKwlFdmVudC5tX0V2ZW50U2luayA9IGtFcGxFdmVudFNpbmtEbGxrQ2FsOworCUV2ZW50Lm1fRXZlbnRUeXBlID0ga0VwbEV2ZW50VHlwZURsbGtBZGROb2RlOworCUV2ZW50Lm1fcEFyZyA9IHBOb2RlSW5mb19wOworCUV2ZW50Lm1fdWlTaXplID0gc2l6ZW9mKHRFcGxEbGxOb2RlSW5mbyk7CisKKwlSZXQgPSBFcGxFdmVudHVQb3N0KCZFdmVudCk7CisKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxEbGx1Q2FsRGVsZXRlTm9kZSgpCisvLworLy8gRGVzY3JpcHRpb246IHJlbW92ZXMgdGhlIHNwZWNpZmllZCBub2RlIGZyb20gdGhlIGlzb2Nocm9ub3VzIHBoYXNlLgorLy8KKy8vIFBhcmFtZXRlcnM6ICB1aU5vZGVJZF9wICAgICAgICAgICAgICA9IG5vZGUgSUQKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgRXBsRGxsdUNhbERlbGV0ZU5vZGUodW5zaWduZWQgaW50IHVpTm9kZUlkX3ApCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwl0RXBsRXZlbnQgRXZlbnQ7CisKKwlFdmVudC5tX0V2ZW50U2luayA9IGtFcGxFdmVudFNpbmtEbGxrQ2FsOworCUV2ZW50Lm1fRXZlbnRUeXBlID0ga0VwbEV2ZW50VHlwZURsbGtEZWxOb2RlOworCUV2ZW50Lm1fcEFyZyA9ICZ1aU5vZGVJZF9wOworCUV2ZW50Lm1fdWlTaXplID0gc2l6ZW9mKHVpTm9kZUlkX3ApOworCisJUmV0ID0gRXBsRXZlbnR1UG9zdCgmRXZlbnQpOworCisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsRGxsdUNhbFNvZnREZWxldGVOb2RlKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogcmVtb3ZlcyB0aGUgc3BlY2lmaWVkIG5vZGUgc29mdGx5IGZyb20gdGhlIGlzb2Nocm9ub3VzIHBoYXNlLgorLy8KKy8vIFBhcmFtZXRlcnM6ICB1aU5vZGVJZF9wICAgICAgICAgICAgICA9IG5vZGUgSUQKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgRXBsRGxsdUNhbFNvZnREZWxldGVOb2RlKHVuc2lnbmVkIGludCB1aU5vZGVJZF9wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJdEVwbEV2ZW50IEV2ZW50OworCisJRXZlbnQubV9FdmVudFNpbmsgPSBrRXBsRXZlbnRTaW5rRGxsa0NhbDsKKwlFdmVudC5tX0V2ZW50VHlwZSA9IGtFcGxFdmVudFR5cGVEbGxrU29mdERlbE5vZGU7CisJRXZlbnQubV9wQXJnID0gJnVpTm9kZUlkX3A7CisJRXZlbnQubV91aVNpemUgPSBzaXplb2YodWlOb2RlSWRfcCk7CisKKwlSZXQgPSBFcGxFdmVudHVQb3N0KCZFdmVudCk7CisKKwlyZXR1cm4gUmV0OworfQorCisjZW5kaWYgLy8gKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRfTU4pKSAhPSAwKQorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgIFAgUiBJIFYgQSBUIEUgICBGIFUgTiBDIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsRGxsdUNhbFNldEFzbmRTZXJ2aWNlSWRGaWx0ZXIoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBmb3J3YXJkcyBjYWxsIHRvIEVwbERsbGtTZXRBc25kU2VydmljZUlkRmlsdGVyKCkgaW4ga2VybmVsIHBhcnQKKy8vCisvLyBQYXJhbWV0ZXJzOiAgU2VydmljZUlkX3AgICAgICAgICAgICAgPSBBU25kIFNlcnZpY2UgSUQKKy8vICAgICAgICAgICAgICBGaWx0ZXJfcCAgICAgICAgICAgICAgICA9IG5vZGUgSUQgZmlsdGVyCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdEVwbEtlcm5lbCBFcGxEbGx1Q2FsU2V0QXNuZFNlcnZpY2VJZEZpbHRlcih0RXBsRGxsQXNuZFNlcnZpY2VJZAorCQkJCQkJICAgU2VydmljZUlkX3AsCisJCQkJCQkgICB0RXBsRGxsQXNuZEZpbHRlciBGaWx0ZXJfcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCXRFcGxFdmVudCBFdmVudDsKKwl0RXBsRGxsQ2FsQXNuZFNlcnZpY2VJZEZpbHRlciBTZXJ2RmlsdGVyOworCisJRXZlbnQubV9FdmVudFNpbmsgPSBrRXBsRXZlbnRTaW5rRGxsa0NhbDsKKwlFdmVudC5tX0V2ZW50VHlwZSA9IGtFcGxFdmVudFR5cGVEbGxrU2VydkZpbHRlcjsKKwlTZXJ2RmlsdGVyLm1fU2VydmljZUlkID0gU2VydmljZUlkX3A7CisJU2VydkZpbHRlci5tX0ZpbHRlciA9IEZpbHRlcl9wOworCUV2ZW50Lm1fcEFyZyA9ICZTZXJ2RmlsdGVyOworCUV2ZW50Lm1fdWlTaXplID0gc2l6ZW9mKFNlcnZGaWx0ZXIpOworCisJUmV0ID0gRXBsRXZlbnR1UG9zdCgmRXZlbnQpOworCisJcmV0dXJuIFJldDsKK30KKworI2VuZGlmIC8vICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfRExMVSkpICE9IDApCisKKy8vIEVPRgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxFcnJEZWYuaCBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsRXJyRGVmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmFlZTEyYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsRXJyRGVmLmgKQEAgLTAsMCArMSwyOTQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBkZWZpbml0aW9ucyBmb3IgYWxsIEVQTC1mdW5jdGlvbiByZXR1cm4gY29kZXMKKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgICAgICAgICRSQ1NmaWxlOiBFcGxFcnJEZWYuaCx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuOSAkICAkRGF0ZTogMjAwOC8wNi8yMyAxNDo1NjozMyAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICAgICAgYWxsCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwNS8xMi8wNSAtYXM6ICAgc3RhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uLCB2ZXJzaW9uIDEuMDAKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfRVBMX0VSUk9SREVGX0hfCisjZGVmaW5lIF9FUExfRVJST1JERUZfSF8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHJldHVybiBjb2RlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordHlwZWRlZiBlbnVtIHsKKwkvLyBhcmVhIGZvciBnZW5lcmljIGVycm9ycyAweDAwMDAgLSAweDAwMEYKKwlrRXBsU3VjY2Vzc2Z1bCA9IDB4MDAwMCwJLy8gbm8gZXJyb3Ivc3VjY2Vzc2Z1bCBydW4KKwlrRXBsSWxsZWdhbEluc3RhbmNlID0gMHgwMDAxLAkvLyB0aGUgY2FsbGVkIEluc3RhbnogZG9lcyBub3QgZXhpc3QKKwlrRXBsSW52YWxpZEluc3RhbmNlUGFyYW0gPSAweDAwMDIsCS8vCisJa0VwbE5vRnJlZUluc3RhbmNlID0gMHgwMDAzLAkvLyBYeHhBZGRJbnN0YW5jZSB3YXMgY2FsbGVkIGJ1dCBubyBmcmVlIGluc3RhbmNlIGlzIGF2YWlsYWJsZQorCWtFcGxXcm9uZ1NpZ25hdHVyZSA9IDB4MDAwNCwJLy8gd3Jvbmcgc2lnbmF0dXJlIHdoaWxlIHdyaXRpbmcgdG8gb2JqZWN0IDB4MTAxMCBvciAweDEwMTEKKwlrRXBsSW52YWxpZE9wZXJhdGlvbiA9IDB4MDAwNSwJLy8gb3BlcmF0aW9uIG5vdCBhbGxvd2VkIGluIHRoaXMgc2l0dWF0aW9uCisJa0VwbEludmFsaWROb2RlSWQgPSAweDAwMDcsCS8vIGludmFsaWQgTm9kZUlkIHdhcyBzcGVjaWZpZWQKKwlrRXBsTm9SZXNvdXJjZSA9IDB4MDAwOCwJLy8gcmVzb3VyY2UgY291bGQgbm90IGJlIGNyZWF0ZWQgKFdpbmRvd3MsIFB4Uk9TLCAuLi4pCisJa0VwbFNodXRkb3duID0gMHgwMDA5LAkvLyBzdGFjayBpcyBzaHV0dGluZyBkb3duCisJa0VwbFJlamVjdCA9IDB4MDAwQSwJLy8gcmVqZWN0IHRoZSBzdWJzZXF1ZW50IGNvbW1hbmQKKworCS8vIGFyZWEgZm9yIEVEUlYgbW9kdWxlIDB4MDAxMCAtIDB4MDAxRgorLy8gICAga0VwbEVkcnZOb0ZyYW1lICAgICAgICAgICAgID0gMHgwMDEwLCAgICAgICAvLyBubyBDQU4gbWVzc2FnZSB3YXMgcmVjZWl2ZWQKKy8vICAgIGtFcGxFZHJ2TXNnSGlnaCAgICAgICAgICAgICA9IDB4MDAxMSwgICAgICAgLy8gQ0FOIG1lc3NhZ2Ugd2l0aCBoaWdoIHByaW9yaXR5IHdhcyByZWNlaXZlZAorLy8gICAga0VwbEVkcnZNc2dMb3cgICAgICAgICAgICAgID0gMHgwMDEyLCAgICAgICAvLyBDQU4gbWVzc2FnZSB3aXRoIGxvdyBwcmlvcml0eSB3YXMgcmVjZWl2ZWQKKwlrRXBsRWRydkluaXRFcnJvciA9IDB4MDAxMywJLy8gaW5pdGlhbGlzYXRpb24gZXJyb3IKKwlrRXBsRWRydk5vRnJlZUJ1ZkVudHJ5ID0gMHgwMDE0LAkvLyBubyBmcmVlIGVudHJ5IGluIGludGVybmFsIGJ1ZmZlciB0YWJsZSBmb3IgVHggZnJhbWVzCisJa0VwbEVkcnZCdWZOb3RFeGlzdGluZyA9IDB4MDAxNSwJLy8gc3BlY2lmaWVkIFR4IGJ1ZmZlciBkb2VzIG5vdCBleGlzdAorLy8gICAga0VwbEVkcnZOb0ZyZWVDaGFubmVsICAgICAgID0gMHgwMDE0LCAgICAgICAvLyBDQU4gY29udHJvbGxlciBoYXMgbm90IGEgZnJlZSBjaGFubmVsCisvLyAgICBrRXBsRWRydlR4QnVmZkhpZ2hPdmVycnVuICAgPSAweDAwMTUsICAgICAgIC8vIGJ1ZmZlciBmb3IgaGlnaCBwcmlvcml0eSBDQU4gdHJhbnNtaXQgbWVzc2FnZXMgaGFzIG92ZXJydW4KKy8vICAgIGtFcGxFZHJ2VHhCdWZmTG93T3ZlcnJ1biAgICA9IDB4MDAxNiwgICAgICAgLy8gYnVmZmVyIGZvciBsb3cgcHJpb3JpdHkgQ0FOIHRyYW5zbWl0IG1lc3NhZ2VzIGhhcyBvdmVycnVuCisvLyAgICBrRXBsRWRydklsbGVnYWxCZGkgICAgICAgICAgPSAweDAwMTcsICAgICAgIC8vIHVuc3VwcG9ydGVkIGJhdWRyYXRlIHdpdGhpbiBiYXVkcmF0ZSB0YWJsZQorLy8gICAga0VwbEVkcnZCdXN5ICAgICAgICAgICAgICAgID0gMHgwMDE4LCAgICAgICAvLyByZW1vdGUgZnJhbWUgY2FuIG5vdCBiZSB1cGRhdGVkIGJlY2F1c2Ugbm8gYnVzIGNvbnRhY3Qgb3IgQ0FOCisJLy8gdHJhbnNtaXNzaW9uIGlzIGFjdGl2CisvLyAgICBrRXBsRWRydkludmFsaWREcml2ZXJUeXBlICAgPSAweDAwMTksICAgICAgIC8vIChQQzogV2luZG93cyBvciBMaW51eCkgaW52YWxpZCBkcml2ZXIgdHlwZQorLy8gICAga0VwbEVkcnZEcml2ZXJOb3RGb3VuZCAgICAgID0gMHgwMDFBLCAgICAgICAvLyAoUEM6IFdpbmRvd3Mgb3IgTGludXgpIGRyaXZlciAoRExMKSBjb3VsZCBub3QgYmUgZm91bmQKKy8vICAgIGtFcGxFZHJ2SW52YWxpZEJhc2VBZGRyZXNzICA9IDB4MDAxQiwgICAgICAgLy8gKFBDOiBXaW5kb3dzIG9yIExpbnV4KSBkcml2ZXIgY291bGQgbm90IGZvdW5kIHRoZSBDQU4gY29udHJvbGxlcgorLy8gICAga0VwbEVkcnZJbnZhbGlkUGFyYW0gICAgICAgID0gMHgwMDFDLCAgICAgICAvLyBpbnZhbGlkIHBhcmFtIGluIGZ1bmN0aW9uIGNhbGwKKworCS8vIGFyZWEgZm9yIENPQiBtb2R1bGUgMHgwMDIwIC0gMHgwMDJGCisvKiAgICBrRXBsQ29iTm9GcmVlRW50cnkgICAgICAgICAgPSAweDAwMjAsICAgICAgIC8vIG5vIGZyZWUgZW50cnkgaW4gUlgtIG9yIFRYLUNPQiB0YWJsZQorICAgIGtFcGxDb2JBbHJlYWR5RXhpc3QgICAgICAgICA9IDB4MDAyMSwgICAgICAgLy8gQ09CLUlEIGFscmVhZHkgZXhpc3RzIGluIFJYLSByZXNwLiBUWC1DT0IgdGFibGUKKyAgICAqLworCWtFcGxEbGxJbGxlZ2FsSGRsID0gMHgwMDIyLAkvLyBpbGxlZ2FsIGhhbmRsZSBmb3IgYSBUeEZyYW1lIHdhcyBwYXNzZWQKKwlrRXBsRGxsQ2JBc3luY1JlZ2lzdGVyZWQgPSAweDAwMjMsCS8vIGhhbmRsZXIgZm9yIG5vbi1FUEwgZnJhbWVzIHdhcyBhbHJlYWR5IHJlZ2lzdGVyZWQgYmVmb3JlCisvLyAgICBrRXBsRGxsQXN5bmNSeEJ1ZmZlckZ1bGwgICAgPSAweDAwMjQsICAgICAgIC8vIHJlY2VpdmUgYnVmZmVyIGZvciBhc3luY2hyb25vdXMgZnJhbWVzIGlzIGZ1bGwKKwlrRXBsRGxsQXN5bmNUeEJ1ZmZlckVtcHR5ID0gMHgwMDI1LAkvLyB0cmFuc21pdCBidWZmZXIgZm9yIGFzeW5jaHJvbm91cyBmcmFtZXMgaXMgZW1wdHkKKwlrRXBsRGxsQXN5bmNUeEJ1ZmZlckZ1bGwgPSAweDAwMjYsCS8vIHRyYW5zbWl0IGJ1ZmZlciBmb3IgYXN5bmNocm9ub3VzIGZyYW1lcyBpcyBmdWxsCisJa0VwbERsbE5vTm9kZUluZm8gPSAweDAwMjcsCS8vIE1OOiB0b28gbGVzcyBzcGFjZSBpbiB0aGUgaW50ZXJuYWwgbm9kZSBpbmZvIHN0cnVjdHVyZQorCWtFcGxEbGxJbnZhbGlkUGFyYW0gPSAweDAwMjgsCS8vIGludmFsaWQgcGFyYW1ldGVycyBwYXNzZWQgdG8gZnVuY3Rpb24KKwlrRXBsRGxsVHhCdWZOb3RSZWFkeSA9IDB4MDAyRSwJLy8gVHhCdWZmZXIgKGUuZy4gZm9yIFBSZXEpIGlzIG5vdCByZWFkeSB5ZXQKKwlrRXBsRGxsVHhGcmFtZUludmFsaWQgPSAweDAwMkYsCS8vIFR4RnJhbWUgKGUuZy4gZm9yIFBSZXEpIGlzIGludmFsaWQgb3IgZG9lcyBub3QgZXhpc3QKKy8qICAgIGtFcGxDb2JJbGxlZ2FsQ2FuSWQgICAgICAgICA9IDB4MDAyMywgICAgICAgLy8gQ09CLUlEIGlzIG5vdCBhbGxvd2VkIChsaWtlIDB4MDAwIGlzIHJlc2VydmVkIGZvciBOTVQsIC4uLikKKyAgICBrRXBsQ29iSW52YWxpZENhbklkICAgICAgICAgPSAweDAwMjQsICAgICAgIC8vIENPQi1JRCBpcyBzd2l0Y2hlZCBvZmYKKyAgICBrRXBsQ29iQ2RydlN0YXRlU2V0ICAgICAgICAgPSAweDAwMjUsICAgICAgIC8vIGF0IGxlYXN0IG9uZSBiaXQgb2YgQ0FOIGRyaXZlciBzdGF0ZSBpcyBzZXQKKyAgICBrRXBsQ29iTm9GcmVlRW50cnlIaWdoQnVmICAgPSAweDAwMjYsICAgICAgIC8vIG5vIGZyZWUgZW50cnkgaW4gaGlnaCBwcmlvdGl0eSBSWC0gb3IgVFgtQ09CIHRhYmxlCisgICAga0VwbENvYk93bklkICAgICAgICAgICAgICAgID0gMHgwMDI3LCAgICAgICAvLyBDT0ItSUQgYWxyZWFkeSBleGlzdHMgaW4gb3duIG1vZHVsZSB3aGljaCBjYWxscyBDb2JEZWZpbmUoKSBvciBDb2JDaGVjaygpCisqLworCS8vIGFyZWEgZm9yIE9CRCBtb2R1bGUgMHgwMDMwIC0gMHgwMDNGCisJa0VwbE9iZElsbGVnYWxQYXJ0ID0gMHgwMDMwLAkvLyB1bmtub3duIE9EIHBhcnQKKwlrRXBsT2JkSW5kZXhOb3RFeGlzdCA9IDB4MDAzMSwJLy8gb2JqZWN0IGluZGV4IGRvZXMgbm90IGV4aXN0IGluIE9ECisJa0VwbE9iZFN1YmluZGV4Tm90RXhpc3QgPSAweDAwMzIsCS8vIHN1YmluZGV4IGRvZXMgbm90IGV4aXN0IGluIG9iamVjdCBpbmRleAorCWtFcGxPYmRSZWFkVmlvbGF0aW9uID0gMHgwMDMzLAkvLyByZWFkIGFjY2VzcyB0byBhIHdyaXRlLW9ubHkgb2JqZWN0CisJa0VwbE9iZFdyaXRlVmlvbGF0aW9uID0gMHgwMDM0LAkvLyB3cml0ZSBhY2Nlc3MgdG8gYSByZWFkLW9ubHkgb2JqZWN0CisJa0VwbE9iZEFjY2Vzc1Zpb2xhdGlvbiA9IDB4MDAzNSwJLy8gYWNjZXNzIG5vdCBhbGxvd2VkCisJa0VwbE9iZFVua25vd25PYmplY3RUeXBlID0gMHgwMDM2LAkvLyBvYmplY3QgdHlwZSBub3QgZGVmaW5lZC9rbm93bgorCWtFcGxPYmRWYXJFbnRyeU5vdEV4aXN0ID0gMHgwMDM3LAkvLyBvYmplY3QgZG9lcyBub3QgY29udGFpbiBWYXJFbnRyeSBzdHJ1Y3R1cmUKKwlrRXBsT2JkVmFsdWVUb29Mb3cgPSAweDAwMzgsCS8vIHZhbHVlIHRvIHdyaXRlIHRvIGFuIG9iamVjdCBpcyB0b28gbG93CisJa0VwbE9iZFZhbHVlVG9vSGlnaCA9IDB4MDAzOSwJLy8gdmFsdWUgdG8gd3JpdGUgdG8gYW4gb2JqZWN0IGlzIHRvbyBoaWdoCisJa0VwbE9iZFZhbHVlTGVuZ3RoRXJyb3IgPSAweDAwM0EsCS8vIHZhbHVlIHRvIHdyaXRlIGlzIHRvIGxvbmcgb3IgdG8gc2hvcnQKKy8vICAgIGtFcGxPYmRJbGxlZ2FsRmxvYXQgICAgICAgICA9IDB4MDAzQiwgICAgICAgLy8gaWxsZWdhbCBmbG9hdCB2YXJpYWJsZQorLy8gICAga0VwbE9iZFdyb25nT2RCdWlsZGVyS2V5ICAgID0gMHgwMDNGLCAgICAgICAvLyBPRCB3YXMgZ2VuZXJhdGVkIHdpdGggZGVtbyB2ZXJzaW9uIG9mIHRvb2wgT0RCdWlsZGVyCisKKwkvLyBhcmVhIGZvciBOTVQgbW9kdWxlIDB4MDA0MCAtIDB4MDA0RgorCWtFcGxObXRVbmtub3duQ29tbWFuZCA9IDB4MDA0MCwJLy8gdW5rbm93biBOTVQgY29tbWFuZAorCWtFcGxObXRJbnZhbGlkRnJhbWVQb2ludGVyID0gMHgwMDQxLAkvLyBwb2ludGVyIHRvIHRoZSBmcmFtZSBpcyBub3QgdmFsaWQKKwlrRXBsTm10SW52YWxpZEV2ZW50ID0gMHgwMDQyLAkvLyBpbnZhbGlkIGV2ZW50IHNlbmQgdG8gTk1ULW1vZHVsCisJa0VwbE5tdEludmFsaWRTdGF0ZSA9IDB4MDA0MywJLy8gdW5rbm93biBzdGF0ZSBpbiBOTVQtU3RhdGUtTWFzY2hpbmUKKwlrRXBsTm10SW52YWxpZFBhcmFtID0gMHgwMDQ0LAkvLyBpbnZhbGlkIHBhcmFtZXRlcnMgc3BlY2lmaWVkCisKKwkvLyBhcmVhIGZvciBTRE8vVURQIG1vZHVsZSAweDAwNTAgLSAweDAwNUYKKwlrRXBsU2RvVWRwTWlzc0NiID0gMHgwMDUwLAkvLyBtaXNzaW5nIGNhbGxiYWNrLWZ1bmN0aW9uIHBvaW50ZXIgZHVyaW5nIGludGkgb2YKKwkvLyBtb2R1bGUKKwlrRXBsU2RvVWRwTm9Tb2NrZXQgPSAweDAwNTEsCS8vIGVycm9yIGR1cmluZyBpbml0IG9mIHNvY2tldAorCWtFcGxTZG9VZHBTb2NrZXRFcnJvciA9IDB4MDA1MiwJLy8gZXJyb3IgZHVyaW5nIHVzYWdlIG9mIHNvY2tldAorCWtFcGxTZG9VZHBUaHJlYWRFcnJvciA9IDB4MDA1MywJLy8gZXJyb3IgZHVyaW5nIHN0YXJ0IG9mIGxpc3RlbiB0aHJlYWQKKwlrRXBsU2RvVWRwTm9GcmVlSGFuZGxlID0gMHgwMDU0LAkvLyBubyBmcmVlIGNvbm5lY3Rpb24gaGFuZGxlIGZvciBVZHAKKwlrRXBsU2RvVWRwU2VuZEVycm9yID0gMHgwMDU1LAkvLyBFcnJvciBkdXJpbmcgc2VuZCBvZiBmcmFtZQorCWtFcGxTZG9VZHBJbnZhbGlkSGRsID0gMHgwMDU2LAkvLyB0aGUgY29ubmVjdGlvbiBoYW5kbGUgaXMgaW52YWxpZAorCisJLy8gYXJlYSBmb3IgU0RPIFNlcXVlbmNlIGxheWVyIG1vZHVsZSAweDAwNjAgLSAweDAwNkYKKwlrRXBsU2RvU2VxTWlzc0NiID0gMHgwMDYwLAkvLyBubyBjYWxsYmFjay1mdW5jdGlvbiBhc3NpZ24KKwlrRXBsU2RvU2VxTm9GcmVlSGFuZGxlID0gMHgwMDYxLAkvLyBubyBmcmVlIGhhbmRsZSBmb3IgY29ubmVjdGlvbgorCWtFcGxTZG9TZXFJbnZhbGlkSGRsID0gMHgwMDYyLAkvLyBpbnZhbGlkIGhhbmRsZSBpbiBTRE8gc2VxdWVuY2UgbGF5ZXIKKwlrRXBsU2RvU2VxVW5zdXBwb3J0ZWRQcm90ID0gMHgwMDYzLAkvLyB1bnN1cHBvcnRlZCBQcm90b2NvbCBzZWxlY3RlZAorCWtFcGxTZG9TZXFOb0ZyZWVIaXN0b3J5ID0gMHgwMDY0LAkvLyBubyBmcmVlIGVudHJ5IGluIGhpc3RvcnkKKwlrRXBsU2RvU2VxRnJhbWVTaXplRXJyb3IgPSAweDAwNjUsCS8vIHRoZSBzaXplIG9mIHRoZSBmcmFtZXMgaXMgbm90IGNvcnJlY3QKKwlrRXBsU2RvU2VxUmVxdWVzdEFja05lZWRlZCA9IDB4MDA2NiwJLy8gaW5kZWljYXRlcyB0aGF0IHRoZSBoaXN0b3J5IGJ1ZmZlciBpcyBmdWxsCisJLy8gYW5kIGEgYWNrIHJlcXVlc3QgaXMgbmVlZGVkCisJa0VwbFNkb1NlcUludmFsaWRGcmFtZSA9IDB4MDA2NywJLy8gZnJhbWUgbm90IHZhbGlkCisJa0VwbFNkb1NlcUNvbm5lY3Rpb25CdXN5ID0gMHgwMDY4LAkvLyBjb25uZWN0aW9uIGlzIGJ1c3kgLT4gcmV0cnkgbGF0ZXIKKwlrRXBsU2RvU2VxSW52YWxpZEV2ZW50ID0gMHgwMDY5LAkvLyBpbnZhbGlkIGV2ZW50IHJlY2VpdmVkCisKKwkvLyBhcmVhIGZvciBTRE8gQ29tbWFuZCBMYXllciBNb2R1bGUgMHgwMDcwIC0gMHgwMDdGCisJa0VwbFNkb0NvbVVuc3VwcG9ydGVkUHJvdCA9IDB4MDA3MCwJLy8gdW5zdXBwb3J0ZWQgUHJvdG9jb2wgc2VsZWN0ZWQKKwlrRXBsU2RvQ29tTm9GcmVlSGFuZGxlID0gMHgwMDcxLAkvLyBubyBmcmVlIGhhbmRsZSBmb3IgY29ubmVjdGlvbgorCWtFcGxTZG9Db21JbnZhbGlkU2VydmljZVR5cGUgPSAweDAwNzIsCS8vIGludmFsaWQgU0RPIHNlcnZpY2UgdHlwZSBzcGVjaWZpZWQKKwlrRXBsU2RvQ29tSW52YWxpZEhhbmRsZSA9IDB4MDA3MywJLy8gaGFuZGxlIGludmFsaWQKKwlrRXBsU2RvQ29tSW52YWxpZFNlbmRUeXBlID0gMHgwMDc0LAkvLyB0aGUgc3RhdGVkIHRvIG9mIGZyYW1lIHRvIHNlbmQgaXMKKwkvLyBub3QgcG9zc2libGUKKwlrRXBsU2RvQ29tTm90UmVzcG9uc2libGUgPSAweDAwNzUsCS8vIGludGVybmFsIGVycm9yOiBjb21tYW5kIGxheWVyIGhhbmRsZSBpcworCS8vIG5vdCByZXNwb25zaWJsZSBmb3IgdGhpcyBldmVudCBmcm9tIHNlcXVlbmNlIGxheWVyCisJa0VwbFNkb0NvbUhhbmRsZUV4aXN0cyA9IDB4MDA3NiwJLy8gaGFuZGxlIHRvIHNhbWUgbm9kZSBhbHJlYWR5IGV4aXN0cworCWtFcGxTZG9Db21IYW5kbGVCdXN5ID0gMHgwMDc3LAkvLyB0cmFuc2ZlciB2aWEgdGhpcyBoYW5kbGUgaXMgYWxyZWFkeSBydW5uaW5nCisJa0VwbFNkb0NvbUludmFsaWRQYXJhbSA9IDB4MDA3OCwJLy8gaW52YWxpZCBwYXJhbWV0ZXJzIHBhc3NlZCB0byBmdW5jdGlvbgorCisJLy8gYXJlYSBmb3IgRVBMIEV2ZW50LU1vZHVsIDB4MDA4MCAtIDB4MDA4RgorCWtFcGxFdmVudFVua25vd25TaW5rID0gMHgwMDgwLAkvLyB1bmtub3duIHNpbmsgZm9yIGV2ZW50CisJa0VwbEV2ZW50UG9zdEVycm9yID0gMHgwMDgxLAkvLyBlcnJvciBkdXJpbmcgcG9zdCBvZiBldmVudAorCisJLy8gYXJlYSBmb3IgRVBMIFRpbWVyIE1vZHVsIDB4MDA5MCAtIDB4MDA5RgorCWtFcGxUaW1lckludmFsaWRIYW5kbGUgPSAweDAwOTAsCS8vIGludmFsaWQgaGFuZGxlIGZvciB0aW1lcgorCWtFcGxUaW1lck5vVGltZXJDcmVhdGVkID0gMHgwMDkxLAkvLyBubyB0aW1lciB3YXMgY3JlYXRlZCBjYXVzZWQgYnkKKwkvLyBhbiBlcnJvcgorCisJLy8gYXJlYSBmb3IgRVBMIFNETy9Bc25kIE1vZHVsZSAweDAwQTAgLSAweDBBRgorCWtFcGxTZG9Bc25kSW52YWxpZE5vZGVJZCA9IDB4MDBBMCwJLy8wIG5vZGUgaWQgaXMgaW52YWxpZAorCWtFcGxTZG9Bc25kTm9GcmVlSGFuZGxlID0gMHgwMEExLAkvLyBubyBmcmVlIGhhbmRsZSBmb3IgY29ubmVjdGlvbgorCWtFcGxTZG9Bc25kSW52YWxpZEhhbmRsZSA9IDB4MDBBMiwJLy8gaGFuZGxlIGZvciBjb25uZWN0aW9uIGlzIGludmFsaWQKKworCS8vIGFyZWEgZm9yIFBETyBtb2R1bGUgMHgwMEIwIC0gMHgwMEJGCisJa0VwbFBkb05vdEV4aXN0ID0gMHgwMEIwLAkvLyBzZWxlY3RlZCBQRE8gZG9lcyBub3QgZXhpc3QKKwlrRXBsUGRvTGVuZ3RoRXhjZWVkZWQgPSAweDAwQjEsCS8vIGxlbmd0aCBvZiBQRE8gbWFwcGluZyBleGNlZWRlcyA2NCBiaXMKKwlrRXBsUGRvR3JhbnVsYXJpdHlNaXNtYXRjaCA9IDB4MDBCMiwJLy8gY29uZmlndXJlZCBQRE8gZ3JhbnVsYXJpdHkgaXMgbm90IGVxdWFsIHRvIHN1cHBvcnRlZCBncmFudWxhcml0eQorCWtFcGxQZG9Jbml0RXJyb3IgPSAweDAwQjMsCS8vIGVycm9yIGR1cmluZyBpbml0aWFsaXNhdGlvbiBvZiBQRE8gbW9kdWxlCisJa0VwbFBkb0Vycm9yUGRvRW5jb2RlID0gMHgwMEI0LAkvLyBlcnJvciBkdXJpbmcgZW5jb2RpbmcgYSBQRE8KKwlrRXBsUGRvRXJyb3JQZG9EZWNvZGUgPSAweDAwQjUsCS8vIGVycm9yIGR1cmluZyBkZWNvZGluZyBhIFBETworCWtFcGxQZG9FcnJvclNlbmQgPSAweDAwQjYsCS8vIGVycm9yIGR1cmluZyBzZW5kaW5nIGEgUERPCisJa0VwbFBkb0Vycm9yU3luY1dpbiA9IDB4MDBCNywJLy8gdGhlIFNZTkMgd2luZG93IHJ1bnMgb3V0IGR1cmluZyBzZW5kaW5nIFNZTkMtUERPcworCWtFcGxQZG9FcnJvck1hcHAgPSAweDAwQjgsCS8vIGludmFsaWQgUERPIG1hcHBpbmcKKwlrRXBsUGRvVmFyTm90Rm91bmQgPSAweDAwQjksCS8vIHZhcmlhYmxlIHdhcyBub3QgZm91bmQgaW4gZnVuY3Rpb24gUGRvU2lnbmFsVmFyKCkKKwlrRXBsUGRvRXJyb3JFbWN5UGRvTGVuID0gMHgwMEJBLAkvLyB0aGUgbGVuZ3RoIG9mIGEgcmVjZWl2ZWQgUERPIGlzIHVuZXF1YWwgdG8gdGhlIGV4cGVjdGVkIHZhbHVlCisJa0VwbFBkb1dyaXRlQ29uc3RPYmplY3QgPSAweDAwQkIsCS8vIGNvbnN0YW50IG9iamVjdCBjYW4gbm90IGJlIHdyaXR0ZW4KKwkvLyAob25seSBUeFR5cGUsIEluaGliaXQtLCBFdmVudCBUaW1lIGZvciBDQU5vcGVuIEtpdCkKKworCS8vIGFyZWEgZm9yIExTUyBzbGF2ZSBtb2R1bGUKKy8qICAgIGtFcGxMc3NzUmVzZXROb2RlICAgICAgICAgICA9IDB4MDA4MCwgICAgICAgLy8gTk1UIGNvbW1hbmQgInJlc2V0IG5vZGUiIGhhcyB0byBiZSBwcm9jZXNzZWQgYWZ0ZXIgTFNTIGNvbmZpZ3VyYXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5ldyBvZiBOb2RlSWQKKyAgICBrRXBsTHNzc0ludmFsaWROb2RlSWQgICAgICAgPSAweDAwODEsICAgICAgIC8vIG5vIHZhbGlkIE5vZGVJZCBpcyBjb25maWd1cmVkIC0+IHdhaXQgdW50aWwgaXQgaXMgY29uZmlndXJlZCB3aXRoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBMU1Mgc2VydmljZSBiZWZvcmUgY2FsbGluZyBDY21Db25uZWN0VG9OZXQoKQorKi8KKwkvLyBhcmVhIGZvciBlbWVyZ2VuY3kgY29uc3VtZXIgbW9kdWxlIDB4MDA5MCAtIDB4MDA5RgorLyogICAga0VwbEVtY2NOb0ZyZWVQcm9kdWNlckVudHJ5ID0gMHgwMDkwLCAgICAgICAvLyBubyBmcmVlIGVudHJ5IHRvIGFkZCBhIEVtZXJnZW5jeSBQcm9kdWNlcgorICAgIGtFcGxFbWNjTm9kZUlkTm90RXhpc3QgICAgICA9IDB4MDA5MSwgICAgICAgLy8gc2VsZWN0ZWQgTm9kZUlkIHdhcyBuZXZlciBhZGRlZAorICAgIGtFcGxFbWNjTm9kZUlkSW52YWxpZCAgICAgICA9IDB4MDA5MiwgICAgICAgLy8gc2VsZWN0ZWQgTm9kZUlkIGlzIG91dHNpZGUgb2YgcmFuZ2UgKDB4MDEgdW50aWwgMHg3RikKKyAgICBrRXBsRW1jY05vZGVJZEV4aXN0ICAgICAgICAgPSAweDAwOTMsICAgICAgIC8vIHNlbGVjdGVkIE5vZGVJZCBhbHJlYWR5IGV4aXN0CisqLworCS8vIGFyZWEgZm9yIGR5bmFtaWMgT0QgMHgwMEEwIC0gMHgwMEFGCisvKiAgICBrRXBsRHluTm9NZW1vcnkgICAgICAgICAgICAgPSAweDAwQTAsICAgICAgIC8vIG5vIG1lbW9yeSBhdmFpbGFibGUKKyAgICBrRXBsRHluSW52YWxpZENvbmZpZyAgICAgICAgPSAweDAwQTEsICAgICAgIC8vIGludmFsaWQgY29uZmlndXJhdGlvbiBpbiBzZWdtZW50IGNvbnRhaW5lcgorKi8KKwkvLyBhcmVhIGZvciBoZXJ0YmVhdCBjb25zdW1lciBtb2R1bGUgMHgwMEIwIC0gMHgwMEJGCisvKiAgICBrRXBsSGJjRW50cnlOb3RFeGlzdCAgICAgICAgPSAweDAwQjAsICAgICAgIC8vIEhlYXJ0YmVhdCBQcm9kdWNlciBub2RlIG5vdCBjb25maWd1cmVkCisgICAga0VwbEhiY0VudHJ5QWxyZWFkeUV4aXN0ICAgID0gMHgwMEIxLCAgICAgICAvLyBOb2RlSWQgd2FzIGFscmVhZHkgZGVmaW5lZCBpbiBoZWFydGJlYXQgY29uc3VtZXIgdGFibGUgKG9iamVjdCAweDEwMTYpCisqLworCS8vIENvbmZpZ3VyYXRpb24gbWFuYWdlciBtb2R1bGUgMHgwMEMwIC0gMHgwMENGCisJa0VwbENmZ01hQ29uZmlnRXJyb3IgPSAweDAwQzAsCS8vIGVycm9yIGluIGNvbmZpZ3VyYXRpb24gbWFuYWdlcgorCWtFcGxDZmdNYVNkb2NUaW1lT3V0RXJyb3IgPSAweDAwQzEsCS8vIGVycm9yIGluIGNvbmZpZ3VyYXRpb24gbWFuYWdlciwgU2RvIHRpbWVvdXQKKwlrRXBsQ2ZnTWFJbnZhbGlkRGNmID0gMHgwMEMyLAkvLyBjb25maWdyYXRpb24gZmlsZSBub3QgdmFsaWQKKwlrRXBsQ2ZnTWFVbnN1cHBvcnRlZERjZiA9IDB4MDBDMywJLy8gdW5zdXBwb3J0ZWQgRGNmIGZvcm1hdAorCWtFcGxDZmdNYUNvbmZpZ1dpdGhFcnJvcnMgPSAweDAwQzQsCS8vIGNvbmZpZ3VyYXRpb24gZmluaXNoZWQgd2l0aCBlcnJvcnMKKwlrRXBsQ2ZnTWFOb0ZyZWVDb25maWcgPSAweDAwQzUsCS8vIG5vIGZyZWUgY29uZmlndXJhdGlvbiBlbnRyeQorCWtFcGxDZmdNYU5vQ29uZmlnRGF0YSA9IDB4MDBDNiwJLy8gbm8gY29uZmlndXJhdGlvbiBkYXRhIHByZXNlbnQKKwlrRXBsQ2ZnTWFVbnN1cHBEYXRhdHlwZURjZiA9IDB4MDBDNywJLy8gdW5zdXBwb3J0ZWQgZGF0YXR5cGUgZm91bmQgaW4gZGNmCisJLy8gLT4gdGhpcyBlbnRyeSB3YXMgbm90IGNvbmZpZ3VyZWQKKworCS8vIGFyZWEgZm9yIExTUyBtYXN0ZXIgbW9kdWxlIDB4MDBEMCAtIDB4MDBERgorLyogICAga0VwbExzc21JbGxlZ2FsTW9kZSAgICAgICAgID0gMHgwMEQwLCAgICAgICAvLyBpbGxlZ2FsIExTUyBtb2RlIChvcGVyYXRpb24gLyBjb25maWd1cmF0aW9uKQorICAgIGtFcGxMc3NtSWxsZWdhbFN0YXRlICAgICAgICA9IDB4MDBEMSwgICAgICAgLy8gZnVuY3Rpb24gd2FzIGNhbGxlZCBpbiBpbGxlZ2FsIHN0YXRlIG9mIExTUyBtYXN0ZXIKKyAgICBrRXBsTHNzbUJ1c3kgICAgICAgICAgICAgICAgPSAweDAwRDIsICAgICAgIC8vIExTUyBwcm9jZXNzIGlzIGJ1c3kgd2l0aCBhbiBwcmV2aW91cyBzZXJ2aWNlCisgICAga0VwbExzc21JbGxlZ2FsQ21kICAgICAgICAgID0gMHgwMEQzLCAgICAgICAvLyBpbGxlZ2FsIGNvbW1hbmQgY29kZSB3YXMgc2V0IGZvciBmdW5jdGlvbiBMc3NtSW5xdWlyZUlkZW50aXR5KCkKKyAgICBrRXBsTHNzbVRpbWVvdXQgICAgICAgICAgICAgPSAweDAwRDQsICAgICAgIC8vIExTUyBzbGF2ZSBkaWQgbm90IGFuc3dlciBhIExTUyBzZXJ2aWNlCisgICAga0VwbExzc21FcnJvckluQ29uZmlybSAgICAgID0gMHgwMEQ1LCAgICAgICAvLyBMU1Mgc2xhdmUgcmVwbGllZCBhbiBlcnJvciBjb2RlIGZvciBhIExTUyBzZXJ2aWNlCisqLworCS8vIGFyZWEgZm9yIENDTSBtb2R1bGVzIDB4MDBFMCAtIDB4RUYKKy8qICAgIGtFcGxDY21TdG9yZVVudmFsaWRTdGF0ZSAgICA9IDB4MDBFMCwgICAgICAgLy8gbWVtb3J5IGRldmljZSBub3QgYXZhaWxhYmxlIGR1ZSBkZXZpY2Ugc3RhdGUKKyAgICBrRXBsQ2NtU3RvcmVId0Vycm9yICAgICAgICAgPSAweDAwRTEsICAgICAgIC8vIGh3IGVycm9yIGR1ZSBkZXZpY2UgYWNjZXNzCisqLworCS8vIGFyZWEgZm9yIFNSRE8gbW9kdWxlIDB4MDEwMCAtIDB4MDExRgorLyogICAga0VwbFNyZG9Ob3RFeGlzdCAgICAgICAgICAgID0gMHgwMTAwLCAgICAgICAvLyBzZWxlY3RlZCBTUkRPIGRvZXMgbm90IGV4aXN0CisgICAga0VwbFNyZG9HcmFudWxhcml0eU1pc21hdGNoID0gMHgwMTAxLCAgICAgICAvLyBjb25maWd1cmVkIFNSRE8gZ3JhbnVsYXJpdHkgaXMgbm90IGVxdWFsIHRvIHN1cHBvcnRlZCBncmFudWxhcml0eQorICAgIGtFcGxTcmRvQ2ZnVGltaW5nRXJyb3IgICAgICA9IDB4MDEwMiwgICAgICAgLy8gY29uZmlndXJhdGlvbiBpcyBub3Qgb2sgKFRpbWluZykKKyAgICBrRXBsU3Jkb0NmZ0lkRXJyb3IgICAgICAgICAgPSAweDAxMDMsICAgICAgIC8vIGNvbmZpZ3VyYXRpb24gaXMgbm90IG9rIChDb2JJZHMpCisgICAga0VwbFNyZG9DZmdDcmNFcnJvciAgICAgICAgID0gMHgwMTA0LCAgICAgICAvLyBjb25maWd1cmF0aW9uIGlzIG5vdCBvayAoQ1JDKQorICAgIGtFcGxTcmRvTm10RXJyb3IgICAgICAgICAgICA9IDB4MDEwNSwgICAgICAgLy8gYW4gYWN0aW9uIHdhcyB0cmllZCBpbiBhIHdyb25nIE5NVCBzdGF0ZQorICAgIGtFcGxTcmRvSW52YWxpZENmZyAgICAgICAgICA9IDB4MDEwNiwgICAgICAgLy8gYW4gYWN0aW9uIHdhcyB0cmllZCB3aXRoIGFuIGludmFsZCBTUkRPIGNvbmZpZ3VyYXRpb24KKyAgICBrRXBsU3Jkb0ludmFsaWQgICAgICAgICAgICAgPSAweDAxMDcsICAgICAgIC8vIGFuIGFjdGlvbiB3YXMgdHJpZWQgd2l0aCBhbiBpbnZhbGQgU1JETworICAgIGtFcGxTcmRvUnhUeENvbmZsaWN0ICAgICAgICA9IDB4MDEwOCwgICAgICAgLy8gYW4gdHJhbnNtaXNzaW9uIHdhcyB0cmllZCB3aXRoIGFuIHJlY2VpdmUgU1JETyAob3IgdGhlIG90aGVyIHdheSkKKyAgICBrRXBsU3Jkb0lsbGVnYWxDYW5JZCAgICAgICAgPSAweDAxMDksICAgICAgIC8vIHRoZSBDYW5JZCBpcyBpbnZhbGlkCisgICAga0VwbFNyZG9DYW5JZEFscmVhZHlJblVzZSAgID0gMHgwMTBBLCAgICAgICAvLyB0aGUgQ2FuSWQgaXMgYWxyZWFkeSBpbiB1c2UKKyAgICBrRXBsU3Jkb05vdEluT3JkZXIgICAgICAgICAgPSAweDAxMEIsICAgICAgIC8vIHRoZSB0d28gbWVzc2FnZXMgb2YgYSBTUkRPIGFyZSBub3QgaW4gb3JkZXIKKyAgICBrRXBsU3Jkb1NjdFRpbWVvdXQgICAgICAgICAgPSAweDAxMEMsICAgICAgIC8vIHRpbWVvdXQgb2YgU0NUCisgICAga0VwbFNyZG9TcnZ0VGltZW91dCAgICAgICAgID0gMHgwMTBELCAgICAgICAvLyB0aW1lb3V0IG9mIFNSVlQKKyAgICBrRXBsU3Jkb0NhbklkTm90VmFsaWQgICAgICAgPSAweDAxMEUsICAgICAgIC8vIG9uZSBvZiByZWNlaXZlZCBDQU4tSURzIGFyZSBub3QgZXF1YWwgdG8gY29uZmlndXJlZCBvbmUKKyAgICBrRXBsU3Jkb0RsY05vdFZhbGlkICAgICAgICAgPSAweDAxMEYsICAgICAgIC8vIG9uZSBvZiByZWNlaXZlZCBDQU4tRExDIGFyZSBub3QgZXF1YWwgdG8gY29uZmlndXJlZCBvbmUKKyAgICBrRXBsU3Jkb0Vycm9yTWFwcCAgICAgICAgICAgPSAweDAxMTAsICAgICAgIC8vIHdyb25nIHZhbHVlcyBpbiBtYXBwaW5nIGZvdW5kCisgICAga0VwbFNyZG9EYXRhRXJyb3IgICAgICAgICAgID0gMHgwMTExLCAgICAgICAvLyBkYXRhIG9mIENBTiBtZXNzYWdlcyBhcmUgbm90IGludmVycworICAgIGtFcGxTcmRvTGVuZ3RoRXhjZWVkZWQgICAgICA9IDB4MDExMiwgICAgICAgLy8gbGVuZ3RoIG9mIFNSRE8gbWFwcGluZyBleGNlZWRlcyA2NCBiaXQgcGVyIENBTi1tZXNzYWdlCisgICAga0VwbFNyZG9Ob3RIYW5kbGVkSW5BcHAgICAgID0gMHgwMTEzLCAgICAgICAvLyB0aGUgU1JETyBlcnJvciB3YXMgbm90IGhhbmRsZWQgaW4gQXBwU3Jkb0Vycm9yKCkKKyAgICBrRXBsU3Jkb092ZXJydW4gICAgICAgICAgICAgPSAweDAxMTQgICAgICAgIC8vIGEgUnhTUkRPIHdhcyByZWNlaXZlZCBidXQgdGhlIHBldmlvdXMgb25lIHdhcyBub3QgZWxzZSBwcm9jZXNzZWQKKyovCisKKwlrRXBsQXBpVGFza0RlZmVycmVkID0gMHgwMTQwLAkvLyBFUEwgcGVyZm9ybXMgdGFzayBpbiBiYWNrZ3JvdW5kIGFuZCBpbmZvcm1zIHRoZSBhcHBsaWNhdGlvbiAob3IgdmljZS12ZXJzYSksIHdoZW4gaXQgaXMgZmluaXNoZWQKKwlrRXBsQXBpSW52YWxpZFBhcmFtID0gMHgwMTQyLAkvLyBwYXNzZWQgaW52YWxpZCBwYXJhbWV0ZXJzIHRvIGEgZnVuY3Rpb24gKGUuZy4gaW52YWxpZCBub2RlIGlkKQorCisJLy8gYXJlYSB1bnRpbGwgMHgwN0ZGIGlzIHJlc2VydmVkCisJLy8gYXJlYSBmb3IgdXNlciBhcHBsaWNhdGlvbiBmcm9tIDB4MDgwMCB0byAweDdGRkYKKworfSB0RXBsS2VybmVsOworCisjZW5kaWYKKy8vRU9GCisKKy8vIERpZSBsZXR6dGUgWmVpbGUgbXXfIHVuYmVkaW5ndCBlaW5lIGxlZXJlIFplaWxlIHNlaW4sIHdlaWwgbWFuY2hlIENvbXBpbGVyCisvLyBkYW1pdCBlaW4gUHJvYmxlbSBoYWJlbiwgd2VubiBkYXMgbmljaHQgc28gaXN0ICh6LkIuIEdOVSBvZGVyIEJvcmxhbmQgQysrIEJ1aWxkZXIpLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxFcnJvckhhbmRsZXJrLmMgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbEVycm9ySGFuZGxlcmsuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTI1MjFmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxFcnJvckhhbmRsZXJrLmMKQEAgLTAsMCArMSw4MTAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBzb3VyY2UgZmlsZSBmb3IgZXJyb3IgaGFuZGxlciBtb2R1bGUKKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgICAgICAgICRSQ1NmaWxlOiBFcGxFcnJvckhhbmRsZXJrLmMsdiAkCisKKyAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAorCisgICAgICAgICAgICAgICAgJFJldmlzaW9uOiAxLjkgJCAgJERhdGU6IDIwMDgvMTAvMTcgMTU6MzI6MzIgJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgICAgIEdDQyBWMy40CisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwNi8xMC8wMiBkLmsuOiAgIHN0YXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAia2VybmVsL0VwbEVycm9ySGFuZGxlcmsuaCIKKyNpbmNsdWRlICJFcGxObXQuaCIKKyNpbmNsdWRlICJrZXJuZWwvRXBsRXZlbnRrLmgiCisjaW5jbHVkZSAia2VybmVsL0VwbE9iZGsuaCIJLy8gZnVuY3Rpb24gcHJvdG90eXBzIG9mIHRoZSBFcGxPQkQtTW9kdWwKKyNpbmNsdWRlICJrZXJuZWwvRXBsRGxsay5oIgorCisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX0RMTEspKSAhPSAwKQorCisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX09CREspKSA9PSAwKQorI2Vycm9yICJFUEwgRXJyb3JIYW5kbGVyIG1vZHVsZSBuZWVkcyBFUEwgbW9kdWxlIE9CREshIgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIEcgTCBPIEIgQSBMICAgRCBFIEYgSSBOIEkgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3R5cGVkZWYgc3RydWN0IHsKKwlEV09SRCBtX2R3Q3VtdWxhdGl2ZUNudDsJLy8gc3ViaW5kZXggMQorCURXT1JEIG1fZHdUaHJlc2hvbGRDbnQ7CS8vIHN1YmluZGV4IDIKKwlEV09SRCBtX2R3VGhyZXNob2xkOwkvLyBzdWJpbmRleCAzCisKK30gdEVwbEVycm9ySGFuZGxlcmtFcnJvckNvdW50ZXI7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl0RXBsRXJyb3JIYW5kbGVya0Vycm9yQ291bnRlciBtX0NuTG9zc1NvYzsJLy8gb2JqZWN0IDB4MUMwQgorCXRFcGxFcnJvckhhbmRsZXJrRXJyb3JDb3VudGVyIG1fQ25Mb3NzUHJlcTsJLy8gb2JqZWN0IDB4MUMwRAorCXRFcGxFcnJvckhhbmRsZXJrRXJyb3JDb3VudGVyIG1fQ25DcmNFcnI7CS8vIG9iamVjdCAweDFDMEYKKwl1bnNpZ25lZCBsb25nIG1fdWxEbGxFcnJvckV2ZW50czsKKworI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UX01OKSkgIT0gMCkKKwl0RXBsRXJyb3JIYW5kbGVya0Vycm9yQ291bnRlciBtX01uQ3JjRXJyOwkvLyBvYmplY3QgMHgxQzAwCisJdEVwbEVycm9ySGFuZGxlcmtFcnJvckNvdW50ZXIgbV9NbkN5Y1RpbWVFeGNlZWQ7CS8vIG9iamVjdCAweDFDMDIKKwlEV09SRCBtX2Fkd01uQ25Mb3NzUHJlc0N1bUNudFsyNTRdOwkvLyBvYmplY3QgMHgxQzA3CisJRFdPUkQgbV9hZHdNbkNuTG9zc1ByZXNUaHJDbnRbMjU0XTsJLy8gb2JqZWN0IDB4MUMwOAorCURXT1JEIG1fYWR3TW5Dbkxvc3NQcmVzVGhyZXNob2xkWzI1NF07CS8vIG9iamVjdCAweDFDMDkKKwlCT09MIG1fYWZNbkNuTG9zc1ByZXNFdmVudFsyNTRdOworI2VuZGlmCisKK30gdEVwbEVycm9ySGFuZGxlcmtJbnN0YW5jZTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIG1vZHVsIGdsb2JhbGUgdmFycworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHRFcGxFcnJvckhhbmRsZXJrSW5zdGFuY2UgRXBsRXJyb3JIYW5kbGVya0luc3RhbmNlX2c7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdEVwbEtlcm5lbCBFcGxFcnJvckhhbmRsZXJrTGlua0Vycm9yQ291bnRlcih0RXBsRXJyb3JIYW5kbGVya0Vycm9yQ291bnRlcgorCQkJCQkJICAgKiBwRXJyb3JDb3VudGVyX3AsCisJCQkJCQkgICB1bnNpZ25lZCBpbnQgdWlJbmRleF9wKTsKKworI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UX01OKSkgIT0gMCkKK3N0YXRpYyB0RXBsS2VybmVsIEVwbEVycm9ySGFuZGxlcmtMaW5rQXJyYXkoRFdPUkQgKiBwZHdWYWx1ZV9wLAorCQkJCQkgICAgdW5zaWduZWQgaW50IHVpVmFsdWVDb3VudF9wLAorCQkJCQkgICAgdW5zaWduZWQgaW50IHVpSW5kZXhfcCk7CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgQyBMIEEgUyBTICA8RXBsLUtlcm5lbHNwYWNlLUVycm9yLUhhbmRsZXI+ICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8vCisvLyBEZXNjcmlwdGlvbjoKKy8vCisvLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICBQIFUgQiBMIEkgQyAgIEYgVSBOIEMgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbEVycm9ySGFuZGxlcmtJbml0CisvLworLy8gRGVzY3JpcHRpb246IGZ1bmN0aW9uIGluaXRpYWxpemUgdGhlIGZpcnN0IGluc3RhbmNlCisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOgorLy8KKy8vCisvLyBSZXR1cm5zOiAgICAgIHRFcEtlcm5lbCAgPSBlcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3RFcGxLZXJuZWwgUFVCTElDIEVwbEVycm9ySGFuZGxlcmtJbml0KHZvaWQpCit7CisJdEVwbEtlcm5lbCBSZXQ7CisKKwlSZXQgPSBFcGxFcnJvckhhbmRsZXJrQWRkSW5zdGFuY2UoKTsKKworCXJldHVybiBSZXQ7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsRXJyb3JIYW5kbGVya0FkZEluc3RhbmNlCisvLworLy8gRGVzY3JpcHRpb246IGZ1bmN0aW9uIGFkZCBvbmUgbW9yZSBpbnN0YW5jZQorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczoKKy8vCisvLworLy8gUmV0dXJuczogICAgICB0RXBLZXJuZWwgID0gZXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0RXBsS2VybmVsIFBVQkxJQyBFcGxFcnJvckhhbmRsZXJrQWRkSW5zdGFuY2Uodm9pZCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKworCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJLy8gcmVzZXQgb25seSBldmVudCB2YXJpYWJsZSwKKwkvLyBhbGwgb3RoZXIgaW5zdGFuY2UgbWVtYmVycyBhcmUgcmVzZXQgYnkgT0Qgb3IgbWF5IGtlZXAgdGhlaXIgY3VycmVudCB2YWx1ZQorCS8vIGQuay46IHRoaXMgaXMgbmVjZXNzYXJ5IGZvciB0aGUgY3VtdWxhdGl2ZSBjb3VudGVycywgd2hpY2ggc2hhbGwgbm90IGJlIHJlc2V0CisJRXBsRXJyb3JIYW5kbGVya0luc3RhbmNlX2cubV91bERsbEVycm9yRXZlbnRzID0gMDsKKworCS8vIGxpbmsgY291bnRlcnMgdG8gT0QKKwkvLyAkJCQgZC5rLiBpZiBPRCByZXNpZGVzIGluIHVzZXJzcGFjZSwgZmV0Y2ggcG9pbnRlciB0byBzaGFyZWQgbWVtb3J5LAorCS8vICAgICAgICAgIHdoaWNoIHNoYWxsIGhhdmUgdGhlIHNhbWUgc3RydWN0dXJlIGFzIHRoZSBpbnN0YW5jZSAobmVlZHMgdG8gYmUgZGVjbGFyZWQgZ2xvYmFsbHkpLgorCS8vICAgICAgICAgIE90aGVyIGlkZWE6IGVycm9yIGNvdW50ZXIgc2hhbGwgYmVsb25nIHRvIHRoZSBwcm9jZXNzIGltYWdlCisJLy8gICAgICAgICAgKHJlc2V0IG9mIGNvdW50ZXJzIGJ5IFNETyB3cml0ZSBhcmUgYSBsaXR0bGUgYml0IHRyaWNreSkuCisKKwlSZXQgPQorCSAgICBFcGxFcnJvckhhbmRsZXJrTGlua0Vycm9yQ291bnRlcigmRXBsRXJyb3JIYW5kbGVya0luc3RhbmNlX2cuCisJCQkJCSAgICAgbV9Dbkxvc3NTb2MsIDB4MUMwQik7CisJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQlnb3RvIEV4aXQ7CisJfQorCisJUmV0ID0KKwkgICAgRXBsRXJyb3JIYW5kbGVya0xpbmtFcnJvckNvdW50ZXIoJkVwbEVycm9ySGFuZGxlcmtJbnN0YW5jZV9nLgorCQkJCQkgICAgIG1fQ25Mb3NzUHJlcSwgMHgxQzBEKTsKKwkvLyBpZ25vcmUgcmV0dXJuIGNvZGUsIGJlY2F1c2Ugb2JqZWN0IDB4MUMwRCBpcyBjb25kaXRpb25hbAorCisJUmV0ID0KKwkgICAgRXBsRXJyb3JIYW5kbGVya0xpbmtFcnJvckNvdW50ZXIoJkVwbEVycm9ySGFuZGxlcmtJbnN0YW5jZV9nLgorCQkJCQkgICAgIG1fQ25DcmNFcnIsIDB4MUMwRik7CisJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQlnb3RvIEV4aXQ7CisJfQorI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UX01OKSkgIT0gMCkKKwlSZXQgPQorCSAgICBFcGxFcnJvckhhbmRsZXJrTGlua0Vycm9yQ291bnRlcigmRXBsRXJyb3JIYW5kbGVya0luc3RhbmNlX2cuCisJCQkJCSAgICAgbV9NbkNyY0VyciwgMHgxQzAwKTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCWdvdG8gRXhpdDsKKwl9CisKKwlSZXQgPQorCSAgICBFcGxFcnJvckhhbmRsZXJrTGlua0Vycm9yQ291bnRlcigmRXBsRXJyb3JIYW5kbGVya0luc3RhbmNlX2cuCisJCQkJCSAgICAgbV9NbkN5Y1RpbWVFeGNlZWQsIDB4MUMwMik7CisJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQlnb3RvIEV4aXQ7CisJfQorCisJUmV0ID0KKwkgICAgRXBsRXJyb3JIYW5kbGVya0xpbmtBcnJheShFcGxFcnJvckhhbmRsZXJrSW5zdGFuY2VfZy4KKwkJCQkgICAgICBtX2Fkd01uQ25Mb3NzUHJlc0N1bUNudCwKKwkJCQkgICAgICB0YWJlbnRyaWVzKEVwbEVycm9ySGFuZGxlcmtJbnN0YW5jZV9nLgorCQkJCQkJIG1fYWR3TW5Dbkxvc3NQcmVzQ3VtQ250KSwKKwkJCQkgICAgICAweDFDMDcpOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKworCVJldCA9CisJICAgIEVwbEVycm9ySGFuZGxlcmtMaW5rQXJyYXkoRXBsRXJyb3JIYW5kbGVya0luc3RhbmNlX2cuCisJCQkJICAgICAgbV9hZHdNbkNuTG9zc1ByZXNUaHJDbnQsCisJCQkJICAgICAgdGFiZW50cmllcyhFcGxFcnJvckhhbmRsZXJrSW5zdGFuY2VfZy4KKwkJCQkJCSBtX2Fkd01uQ25Mb3NzUHJlc1RockNudCksCisJCQkJICAgICAgMHgxQzA4KTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCWdvdG8gRXhpdDsKKwl9CisKKwlSZXQgPQorCSAgICBFcGxFcnJvckhhbmRsZXJrTGlua0FycmF5KEVwbEVycm9ySGFuZGxlcmtJbnN0YW5jZV9nLgorCQkJCSAgICAgIG1fYWR3TW5Dbkxvc3NQcmVzVGhyZXNob2xkLAorCQkJCSAgICAgIHRhYmVudHJpZXMoRXBsRXJyb3JIYW5kbGVya0luc3RhbmNlX2cuCisJCQkJCQkgbV9hZHdNbkNuTG9zc1ByZXNUaHJlc2hvbGQpLAorCQkJCSAgICAgIDB4MUMwOSk7CisJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQlnb3RvIEV4aXQ7CisJfQorI2VuZGlmCisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIFJldDsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxFcnJvckhhbmRsZXJrRGVsSW5zdGFuY2UKKy8vCisvLyBEZXNjcmlwdGlvbjogZnVuY3Rpb24gZGVsZXRlIGluc3RhbmNlIGFuIGZyZWUgdGhlIGJ1ZmZlcnN0cnVjdHVyZQorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczoKKy8vCisvLworLy8gUmV0dXJuczogICAgICB0RXBLZXJuZWwgID0gZXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0RXBsS2VybmVsIFBVQkxJQyBFcGxFcnJvckhhbmRsZXJrRGVsSW5zdGFuY2UoKQoreworCXRFcGxLZXJuZWwgUmV0OworCisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwlyZXR1cm4gUmV0OworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbEVycm9ySGFuZGxlcmtQcm9jZXNzCisvLworLy8gRGVzY3JpcHRpb246IHByb2Nlc3NlcyBlcnJvciBldmVudHMgZnJvbSBETEwKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6ICBwRXZlbnRfcCA9IHBvaW50ZXIgdG8gZXZlbnQtc3RydWN0dXIgZnJvbSBidWZmZXIKKy8vCisvLworLy8gUmV0dXJuczogICAgICB0RXBLZXJuZWwgID0gZXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0RXBsS2VybmVsIFBVQkxJQyBFcGxFcnJvckhhbmRsZXJrUHJvY2Vzcyh0RXBsRXZlbnQgKiBwRXZlbnRfcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKwl1bnNpZ25lZCBsb25nIHVsRGxsRXJyb3JFdmVudHM7CisJdEVwbEV2ZW50IEV2ZW50OworCXRFcGxObXRFdmVudCBObXRFdmVudDsKKworCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJLy8gY2hlY2sgbV9FdmVudFR5cGUKKwlzd2l0Y2ggKHBFdmVudF9wLT5tX0V2ZW50VHlwZSkgeworCWNhc2Uga0VwbEV2ZW50VHlwZURsbEVycm9yOgorCQl7CisJCQl0RXBsRXJyb3JIYW5kbGVya0V2ZW50ICpwRXJySGFuZGxlckV2ZW50ID0KKwkJCSAgICAodEVwbEVycm9ySGFuZGxlcmtFdmVudCAqKSBwRXZlbnRfcC0+bV9wQXJnOworCisJCQl1bERsbEVycm9yRXZlbnRzID0gcEVyckhhbmRsZXJFdmVudC0+bV91bERsbEVycm9yRXZlbnRzOworCisJCQkvLyBjaGVjayB0aGUgc2V2ZXJhbCBlcnJvciBldmVudHMKKwkJCWlmICgoRXBsRXJyb3JIYW5kbGVya0luc3RhbmNlX2cubV9Dbkxvc3NTb2MuCisJCQkgICAgIG1fZHdUaHJlc2hvbGQgPiAwKQorCQkJICAgICYmICgodWxEbGxFcnJvckV2ZW50cyAmIEVQTF9ETExfRVJSX0NOX0xPU1NfU09DKSAhPSAwKSkgewkvLyBsb3NzIG9mIFNvQyBldmVudCBvY2N1cmVkCisJCQkJLy8gaW5jcmVtZW50IGN1bXVsYXRpdmUgY291bnRlciBieSAxCisJCQkJRXBsRXJyb3JIYW5kbGVya0luc3RhbmNlX2cubV9Dbkxvc3NTb2MuCisJCQkJICAgIG1fZHdDdW11bGF0aXZlQ250Kys7CisJCQkJLy8gaW5jcmVtZW50IHRocmVzaG9sZCBjb3VudGVyIGJ5IDgKKwkJCQlFcGxFcnJvckhhbmRsZXJrSW5zdGFuY2VfZy5tX0NuTG9zc1NvYy4KKwkJCQkgICAgbV9kd1RocmVzaG9sZENudCArPSA4OworCQkJCWlmIChFcGxFcnJvckhhbmRsZXJrSW5zdGFuY2VfZy5tX0NuTG9zc1NvYy5tX2R3VGhyZXNob2xkQ250ID49IEVwbEVycm9ySGFuZGxlcmtJbnN0YW5jZV9nLm1fQ25Mb3NzU29jLm1fZHdUaHJlc2hvbGQpIHsJLy8gdGhyZXNob2xkIGlzIHJlYWNoZWQKKwkJCQkJLy8gJCQkIGQuay46IGdlbmVyYXRlIGVycm9yIGhpc3RvcnkgZW50cnkgRV9ETExfTE9TU19TT0NfVEgKKworCQkJCQkvLyBwb3N0IGV2ZW50IHRvIE5NVCBzdGF0ZSBtYWNoaW5lCisJCQkJCU5tdEV2ZW50ID0ga0VwbE5tdEV2ZW50Tm10Q3ljbGVFcnJvcjsKKwkJCQkJRXZlbnQubV9FdmVudFNpbmsgPSBrRXBsRXZlbnRTaW5rTm10azsKKwkJCQkJRXZlbnQubV9FdmVudFR5cGUgPQorCQkJCQkgICAga0VwbEV2ZW50VHlwZU5tdEV2ZW50OworCQkJCQlFdmVudC5tX3BBcmcgPSAmTm10RXZlbnQ7CisJCQkJCUV2ZW50Lm1fdWlTaXplID0gc2l6ZW9mKE5tdEV2ZW50KTsKKwkJCQkJUmV0ID0gRXBsRXZlbnRrUG9zdCgmRXZlbnQpOworCQkJCX0KKwkJCQlFcGxFcnJvckhhbmRsZXJrSW5zdGFuY2VfZy5tX3VsRGxsRXJyb3JFdmVudHMgfD0KKwkJCQkgICAgRVBMX0RMTF9FUlJfQ05fTE9TU19TT0M7CisJCQl9CisKKwkJCWlmICgoRXBsRXJyb3JIYW5kbGVya0luc3RhbmNlX2cubV9Dbkxvc3NQcmVxLgorCQkJICAgICBtX2R3VGhyZXNob2xkID4gMCkKKwkJCSAgICAmJiAoKHVsRGxsRXJyb3JFdmVudHMgJiBFUExfRExMX0VSUl9DTl9MT1NTX1BSRVEpICE9IDApKSB7CS8vIGxvc3Mgb2YgUFJlcSBldmVudCBvY2N1cmVkCisJCQkJLy8gaW5jcmVtZW50IGN1bXVsYXRpdmUgY291bnRlciBieSAxCisJCQkJRXBsRXJyb3JIYW5kbGVya0luc3RhbmNlX2cubV9Dbkxvc3NQcmVxLgorCQkJCSAgICBtX2R3Q3VtdWxhdGl2ZUNudCsrOworCQkJCS8vIGluY3JlbWVudCB0aHJlc2hvbGQgY291bnRlciBieSA4CisJCQkJRXBsRXJyb3JIYW5kbGVya0luc3RhbmNlX2cubV9Dbkxvc3NQcmVxLgorCQkJCSAgICBtX2R3VGhyZXNob2xkQ250ICs9IDg7CisJCQkJaWYgKEVwbEVycm9ySGFuZGxlcmtJbnN0YW5jZV9nLm1fQ25Mb3NzUHJlcS5tX2R3VGhyZXNob2xkQ250ID49IEVwbEVycm9ySGFuZGxlcmtJbnN0YW5jZV9nLm1fQ25Mb3NzUHJlcS5tX2R3VGhyZXNob2xkKSB7CS8vIHRocmVzaG9sZCBpcyByZWFjaGVkCisJCQkJCS8vICQkJCBkLmsuOiBnZW5lcmF0ZSBlcnJvciBoaXN0b3J5IGVudHJ5IEVfRExMX0xPU1NfUFJFUV9USAorCisJCQkJCS8vIHBvc3QgZXZlbnQgdG8gTk1UIHN0YXRlIG1hY2hpbmUKKwkJCQkJTm10RXZlbnQgPSBrRXBsTm10RXZlbnRObXRDeWNsZUVycm9yOworCQkJCQlFdmVudC5tX0V2ZW50U2luayA9IGtFcGxFdmVudFNpbmtObXRrOworCQkJCQlFdmVudC5tX0V2ZW50VHlwZSA9CisJCQkJCSAgICBrRXBsRXZlbnRUeXBlTm10RXZlbnQ7CisJCQkJCUV2ZW50Lm1fcEFyZyA9ICZObXRFdmVudDsKKwkJCQkJRXZlbnQubV91aVNpemUgPSBzaXplb2YoTm10RXZlbnQpOworCQkJCQlSZXQgPSBFcGxFdmVudGtQb3N0KCZFdmVudCk7CisJCQkJfQorCQkJfQorCisJCQlpZiAoKEVwbEVycm9ySGFuZGxlcmtJbnN0YW5jZV9nLm1fQ25Mb3NzUHJlcS4KKwkJCSAgICAgbV9kd1RocmVzaG9sZENudCA+IDApCisJCQkgICAgJiYgKCh1bERsbEVycm9yRXZlbnRzICYgRVBMX0RMTF9FUlJfQ05fUkVDVkRfUFJFUSkgIT0gMCkpIHsJLy8gUFJlcSBjb3JyZWN0bHkgcmVjZWl2ZWQKKwkJCQkvLyBkZWNyZW1lbnQgdGhyZXNob2xkIGNvdW50ZXIgYnkgMQorCQkJCUVwbEVycm9ySGFuZGxlcmtJbnN0YW5jZV9nLm1fQ25Mb3NzUHJlcS4KKwkJCQkgICAgbV9kd1RocmVzaG9sZENudC0tOworCQkJfQorCisJCQlpZiAoKEVwbEVycm9ySGFuZGxlcmtJbnN0YW5jZV9nLm1fQ25DcmNFcnIuCisJCQkgICAgIG1fZHdUaHJlc2hvbGQgPiAwKQorCQkJICAgICYmICgodWxEbGxFcnJvckV2ZW50cyAmIEVQTF9ETExfRVJSX0NOX0NSQykgIT0gMCkpIHsJLy8gQ1JDIGVycm9yIGV2ZW50IG9jY3VyZWQKKwkJCQkvLyBpbmNyZW1lbnQgY3VtdWxhdGl2ZSBjb3VudGVyIGJ5IDEKKwkJCQlFcGxFcnJvckhhbmRsZXJrSW5zdGFuY2VfZy5tX0NuQ3JjRXJyLgorCQkJCSAgICBtX2R3Q3VtdWxhdGl2ZUNudCsrOworCQkJCS8vIGluY3JlbWVudCB0aHJlc2hvbGQgY291bnRlciBieSA4CisJCQkJRXBsRXJyb3JIYW5kbGVya0luc3RhbmNlX2cubV9DbkNyY0Vyci4KKwkJCQkgICAgbV9kd1RocmVzaG9sZENudCArPSA4OworCQkJCWlmIChFcGxFcnJvckhhbmRsZXJrSW5zdGFuY2VfZy5tX0NuQ3JjRXJyLm1fZHdUaHJlc2hvbGRDbnQgPj0gRXBsRXJyb3JIYW5kbGVya0luc3RhbmNlX2cubV9DbkNyY0Vyci5tX2R3VGhyZXNob2xkKSB7CS8vIHRocmVzaG9sZCBpcyByZWFjaGVkCisJCQkJCS8vICQkJCBkLmsuOiBnZW5lcmF0ZSBlcnJvciBoaXN0b3J5IGVudHJ5IEVfRExMX0NSQ19USAorCisJCQkJCS8vIHBvc3QgZXZlbnQgdG8gTk1UIHN0YXRlIG1hY2hpbmUKKwkJCQkJTm10RXZlbnQgPSBrRXBsTm10RXZlbnRObXRDeWNsZUVycm9yOworCQkJCQlFdmVudC5tX0V2ZW50U2luayA9IGtFcGxFdmVudFNpbmtObXRrOworCQkJCQlFdmVudC5tX0V2ZW50VHlwZSA9CisJCQkJCSAgICBrRXBsRXZlbnRUeXBlTm10RXZlbnQ7CisJCQkJCUV2ZW50Lm1fcEFyZyA9ICZObXRFdmVudDsKKwkJCQkJRXZlbnQubV91aVNpemUgPSBzaXplb2YoTm10RXZlbnQpOworCQkJCQlSZXQgPSBFcGxFdmVudGtQb3N0KCZFdmVudCk7CisJCQkJfQorCQkJCUVwbEVycm9ySGFuZGxlcmtJbnN0YW5jZV9nLm1fdWxEbGxFcnJvckV2ZW50cyB8PQorCQkJCSAgICBFUExfRExMX0VSUl9DTl9DUkM7CisJCQl9CisKKwkJCWlmICgodWxEbGxFcnJvckV2ZW50cyAmIEVQTF9ETExfRVJSX0lOVkFMSURfRk9STUFUKSAhPSAwKSB7CS8vIGludmFsaWQgZm9ybWF0IGVycm9yIG9jY3VyZWQgKG9ubHkgZGlyZWN0IHJlYWN0aW9uKQorCQkJCS8vICQkJCBkLmsuOiBnZW5lcmF0ZSBlcnJvciBoaXN0b3J5IGVudHJ5IEVfRExMX0lOVkFMSURfRk9STUFUCisjaWYgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRfTU4pKSAhPSAwKQorCQkJCWlmIChwRXJySGFuZGxlckV2ZW50LT5tX05tdFN0YXRlID49IGtFcGxObXRNc05vdEFjdGl2ZSkgewkvLyBNTiBpcyBhY3RpdmUKKwkJCQkJaWYgKHBFcnJIYW5kbGVyRXZlbnQtPm1fdWlOb2RlSWQgIT0gMCkgeworCQkJCQkJdEVwbEhlYXJ0YmVhdEV2ZW50CisJCQkJCQkgICAgSGVhcnRiZWF0RXZlbnQ7CisKKwkJCQkJCS8vIHJlbW92ZSBub2RlIGZyb20gaXNvY2hyb25vdXMgcGhhc2UKKwkJCQkJCVJldCA9CisJCQkJCQkgICAgRXBsRGxsa0RlbGV0ZU5vZGUKKwkJCQkJCSAgICAocEVyckhhbmRsZXJFdmVudC0+CisJCQkJCQkgICAgIG1fdWlOb2RlSWQpOworCisJCQkJCQkvLyBpbmZvcm0gTm10TW51IG1vZHVsZSBhYm91dCBzdGF0ZSBjaGFuZ2UsIHdoaWNoIHNoYWxsIHNlbmQgTk1UIGNvbW1hbmQgUmVzZXROb2RlIHRvIHRoaXMgQ04KKwkJCQkJCUhlYXJ0YmVhdEV2ZW50Lm1fdWlOb2RlSWQgPQorCQkJCQkJICAgIHBFcnJIYW5kbGVyRXZlbnQtPgorCQkJCQkJICAgIG1fdWlOb2RlSWQ7CisJCQkJCQlIZWFydGJlYXRFdmVudC5tX05tdFN0YXRlID0KKwkJCQkJCSAgICBrRXBsTm10Q3NOb3RBY3RpdmU7CisJCQkJCQlIZWFydGJlYXRFdmVudC5tX3dFcnJvckNvZGUgPQorCQkJCQkJICAgIEVQTF9FX0RMTF9JTlZBTElEX0ZPUk1BVDsKKwkJCQkJCUV2ZW50Lm1fRXZlbnRTaW5rID0KKwkJCQkJCSAgICBrRXBsRXZlbnRTaW5rTm10TW51OworCQkJCQkJRXZlbnQubV9FdmVudFR5cGUgPQorCQkJCQkJICAgIGtFcGxFdmVudFR5cGVIZWFydGJlYXQ7CisJCQkJCQlFdmVudC5tX3VpU2l6ZSA9CisJCQkJCQkgICAgc2l6ZW9mKEhlYXJ0YmVhdEV2ZW50KTsKKwkJCQkJCUV2ZW50Lm1fcEFyZyA9ICZIZWFydGJlYXRFdmVudDsKKwkJCQkJCVJldCA9IEVwbEV2ZW50a1Bvc3QoJkV2ZW50KTsKKwkJCQkJfQorCQkJCQkvLyAkJCQgYW5kIGVsc2Ugc2hvdWxkIGxlYWQgdG8gSW50ZXJuQ29tRXJyb3IKKwkJCQl9IGVsc2UKKyNlbmRpZgorCQkJCXsJLy8gQ04gaXMgYWN0aXZlCisJCQkJCS8vIHBvc3QgZXZlbnQgdG8gTk1UIHN0YXRlIG1hY2hpbmUKKwkJCQkJTm10RXZlbnQgPSBrRXBsTm10RXZlbnRJbnRlcm5Db21FcnJvcjsKKwkJCQkJRXZlbnQubV9FdmVudFNpbmsgPSBrRXBsRXZlbnRTaW5rTm10azsKKwkJCQkJRXZlbnQubV9FdmVudFR5cGUgPQorCQkJCQkgICAga0VwbEV2ZW50VHlwZU5tdEV2ZW50OworCQkJCQlFdmVudC5tX3BBcmcgPSAmTm10RXZlbnQ7CisJCQkJCUV2ZW50Lm1fdWlTaXplID0gc2l6ZW9mKE5tdEV2ZW50KTsKKwkJCQkJUmV0ID0gRXBsRXZlbnRrUG9zdCgmRXZlbnQpOworCQkJCX0KKwkJCX0KKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVF9NTikpICE9IDApCisJCQlpZiAoKEVwbEVycm9ySGFuZGxlcmtJbnN0YW5jZV9nLm1fTW5DcmNFcnIuCisJCQkgICAgIG1fZHdUaHJlc2hvbGQgPiAwKQorCQkJICAgICYmICgodWxEbGxFcnJvckV2ZW50cyAmIEVQTF9ETExfRVJSX01OX0NSQykgIT0gMCkpIHsJLy8gQ1JDIGVycm9yIGV2ZW50IG9jY3VyZWQKKwkJCQkvLyBpbmNyZW1lbnQgY3VtdWxhdGl2ZSBjb3VudGVyIGJ5IDEKKwkJCQlFcGxFcnJvckhhbmRsZXJrSW5zdGFuY2VfZy5tX01uQ3JjRXJyLgorCQkJCSAgICBtX2R3Q3VtdWxhdGl2ZUNudCsrOworCQkJCS8vIGluY3JlbWVudCB0aHJlc2hvbGQgY291bnRlciBieSA4CisJCQkJRXBsRXJyb3JIYW5kbGVya0luc3RhbmNlX2cubV9NbkNyY0Vyci4KKwkJCQkgICAgbV9kd1RocmVzaG9sZENudCArPSA4OworCQkJCWlmIChFcGxFcnJvckhhbmRsZXJrSW5zdGFuY2VfZy5tX01uQ3JjRXJyLm1fZHdUaHJlc2hvbGRDbnQgPj0gRXBsRXJyb3JIYW5kbGVya0luc3RhbmNlX2cubV9NbkNyY0Vyci5tX2R3VGhyZXNob2xkKSB7CS8vIHRocmVzaG9sZCBpcyByZWFjaGVkCisJCQkJCS8vICQkJCBkLmsuOiBnZW5lcmF0ZSBlcnJvciBoaXN0b3J5IGVudHJ5IEVfRExMX0NSQ19USAorCisJCQkJCS8vIHBvc3QgZXZlbnQgdG8gTk1UIHN0YXRlIG1hY2hpbmUKKwkJCQkJTm10RXZlbnQgPSBrRXBsTm10RXZlbnRObXRDeWNsZUVycm9yOworCQkJCQlFdmVudC5tX0V2ZW50U2luayA9IGtFcGxFdmVudFNpbmtObXRrOworCQkJCQlFdmVudC5tX0V2ZW50VHlwZSA9CisJCQkJCSAgICBrRXBsRXZlbnRUeXBlTm10RXZlbnQ7CisJCQkJCUV2ZW50Lm1fcEFyZyA9ICZObXRFdmVudDsKKwkJCQkJRXZlbnQubV91aVNpemUgPSBzaXplb2YoTm10RXZlbnQpOworCQkJCQlSZXQgPSBFcGxFdmVudGtQb3N0KCZFdmVudCk7CisJCQkJfQorCQkJCUVwbEVycm9ySGFuZGxlcmtJbnN0YW5jZV9nLm1fdWxEbGxFcnJvckV2ZW50cyB8PQorCQkJCSAgICBFUExfRExMX0VSUl9NTl9DUkM7CisJCQl9CisKKwkJCWlmICgoRXBsRXJyb3JIYW5kbGVya0luc3RhbmNlX2cubV9NbkN5Y1RpbWVFeGNlZWQuCisJCQkgICAgIG1fZHdUaHJlc2hvbGQgPiAwKQorCQkJICAgICYmICgodWxEbGxFcnJvckV2ZW50cyAmIEVQTF9ETExfRVJSX01OX0NZQ1RJTUVFWENFRUQpICE9IDApKSB7CS8vIGN5Y2xlIHRpbWUgZXhjZWVkZWQgZXZlbnQgb2NjdXJlZAorCQkJCS8vIGluY3JlbWVudCBjdW11bGF0aXZlIGNvdW50ZXIgYnkgMQorCQkJCUVwbEVycm9ySGFuZGxlcmtJbnN0YW5jZV9nLm1fTW5DeWNUaW1lRXhjZWVkLgorCQkJCSAgICBtX2R3Q3VtdWxhdGl2ZUNudCsrOworCQkJCS8vIGluY3JlbWVudCB0aHJlc2hvbGQgY291bnRlciBieSA4CisJCQkJRXBsRXJyb3JIYW5kbGVya0luc3RhbmNlX2cubV9NbkN5Y1RpbWVFeGNlZWQuCisJCQkJICAgIG1fZHdUaHJlc2hvbGRDbnQgKz0gODsKKwkJCQlpZiAoRXBsRXJyb3JIYW5kbGVya0luc3RhbmNlX2cubV9NbkN5Y1RpbWVFeGNlZWQubV9kd1RocmVzaG9sZENudCA+PSBFcGxFcnJvckhhbmRsZXJrSW5zdGFuY2VfZy5tX01uQ3ljVGltZUV4Y2VlZC5tX2R3VGhyZXNob2xkKSB7CS8vIHRocmVzaG9sZCBpcyByZWFjaGVkCisJCQkJCS8vICQkJCBkLmsuOiBnZW5lcmF0ZSBlcnJvciBoaXN0b3J5IGVudHJ5IEVfRExMX0NZQ0xFX0VYQ0VFRF9USAorCisJCQkJCS8vIHBvc3QgZXZlbnQgdG8gTk1UIHN0YXRlIG1hY2hpbmUKKwkJCQkJTm10RXZlbnQgPSBrRXBsTm10RXZlbnRObXRDeWNsZUVycm9yOworCQkJCQlFdmVudC5tX0V2ZW50U2luayA9IGtFcGxFdmVudFNpbmtObXRrOworCQkJCQlFdmVudC5tX0V2ZW50VHlwZSA9CisJCQkJCSAgICBrRXBsRXZlbnRUeXBlTm10RXZlbnQ7CisJCQkJCUV2ZW50Lm1fcEFyZyA9ICZObXRFdmVudDsKKwkJCQkJRXZlbnQubV91aVNpemUgPSBzaXplb2YoTm10RXZlbnQpOworCQkJCQlSZXQgPSBFcGxFdmVudGtQb3N0KCZFdmVudCk7CisJCQkJfQorCQkJCS8vICQkJCBkLmsuOiBlbHNlIGdlbmVyYXRlIGVycm9yIGhpc3RvcnkgZW50cnkgRV9ETExfQ1lDTEVfRVhDRUVECisJCQkJRXBsRXJyb3JIYW5kbGVya0luc3RhbmNlX2cubV91bERsbEVycm9yRXZlbnRzIHw9CisJCQkJICAgIEVQTF9ETExfRVJSX01OX0NZQ1RJTUVFWENFRUQ7CisJCQl9CisKKwkJCWlmICgodWxEbGxFcnJvckV2ZW50cyAmIEVQTF9ETExfRVJSX01OX0NOX0xPU1NfUFJFUykgIT0gMCkgewkvLyBDTiBsb3NzIFBSZXMgZXZlbnQgb2NjdXJlZAorCQkJCXVuc2lnbmVkIGludCB1aU5vZGVJZDsKKworCQkJCXVpTm9kZUlkID0gcEVyckhhbmRsZXJFdmVudC0+bV91aU5vZGVJZCAtIDE7CisJCQkJaWYgKCh1aU5vZGVJZCA8CisJCQkJICAgICB0YWJlbnRyaWVzKEVwbEVycm9ySGFuZGxlcmtJbnN0YW5jZV9nLgorCQkJCQkJbV9hZHdNbkNuTG9zc1ByZXNDdW1DbnQpKQorCQkJCSAgICAmJiAoRXBsRXJyb3JIYW5kbGVya0luc3RhbmNlX2cuCisJCQkJCW1fYWR3TW5Dbkxvc3NQcmVzVGhyZXNob2xkW3VpTm9kZUlkXSA+CisJCQkJCTApKSB7CisJCQkJCS8vIGluY3JlbWVudCBjdW11bGF0aXZlIGNvdW50ZXIgYnkgMQorCQkJCQlFcGxFcnJvckhhbmRsZXJrSW5zdGFuY2VfZy4KKwkJCQkJICAgIG1fYWR3TW5Dbkxvc3NQcmVzQ3VtQ250W3VpTm9kZUlkXSsrOworCQkJCQkvLyBpbmNyZW1lbnQgdGhyZXNob2xkIGNvdW50ZXIgYnkgOAorCQkJCQlFcGxFcnJvckhhbmRsZXJrSW5zdGFuY2VfZy4KKwkJCQkJICAgIG1fYWR3TW5Dbkxvc3NQcmVzVGhyQ250W3VpTm9kZUlkXSArPQorCQkJCQkgICAgODsKKwkJCQkJaWYgKEVwbEVycm9ySGFuZGxlcmtJbnN0YW5jZV9nLgorCQkJCQkgICAgbV9hZHdNbkNuTG9zc1ByZXNUaHJDbnRbdWlOb2RlSWRdCisJCQkJCSAgICA+PSBFcGxFcnJvckhhbmRsZXJrSW5zdGFuY2VfZy5tX2Fkd01uQ25Mb3NzUHJlc1RocmVzaG9sZFt1aU5vZGVJZF0pIHsJLy8gdGhyZXNob2xkIGlzIHJlYWNoZWQKKwkJCQkJCXRFcGxIZWFydGJlYXRFdmVudAorCQkJCQkJICAgIEhlYXJ0YmVhdEV2ZW50OworCisJCQkJCQkvLyAkJCQgZC5rLjogZ2VuZXJhdGUgZXJyb3IgaGlzdG9yeSBlbnRyeSBFX0RMTF9MT1NTX1BSRVNfVEgKKworCQkJCQkJLy8gcmVtb3ZlIG5vZGUgZnJvbSBpc29jaHJvbm91cyBwaGFzZQorCQkJCQkJUmV0ID0KKwkJCQkJCSAgICBFcGxEbGxrRGVsZXRlTm9kZQorCQkJCQkJICAgIChwRXJySGFuZGxlckV2ZW50LT4KKwkJCQkJCSAgICAgbV91aU5vZGVJZCk7CisKKwkJCQkJCS8vIGluZm9ybSBObXRNbnUgbW9kdWxlIGFib3V0IHN0YXRlIGNoYW5nZSwgd2hpY2ggc2hhbGwgc2VuZCBOTVQgY29tbWFuZCBSZXNldE5vZGUgdG8gdGhpcyBDTgorCQkJCQkJSGVhcnRiZWF0RXZlbnQubV91aU5vZGVJZCA9CisJCQkJCQkgICAgcEVyckhhbmRsZXJFdmVudC0+CisJCQkJCQkgICAgbV91aU5vZGVJZDsKKwkJCQkJCUhlYXJ0YmVhdEV2ZW50Lm1fTm10U3RhdGUgPQorCQkJCQkJICAgIGtFcGxObXRDc05vdEFjdGl2ZTsKKwkJCQkJCUhlYXJ0YmVhdEV2ZW50Lm1fd0Vycm9yQ29kZSA9CisJCQkJCQkgICAgRVBMX0VfRExMX0xPU1NfUFJFU19USDsKKwkJCQkJCUV2ZW50Lm1fRXZlbnRTaW5rID0KKwkJCQkJCSAgICBrRXBsRXZlbnRTaW5rTm10TW51OworCQkJCQkJRXZlbnQubV9FdmVudFR5cGUgPQorCQkJCQkJICAgIGtFcGxFdmVudFR5cGVIZWFydGJlYXQ7CisJCQkJCQlFdmVudC5tX3VpU2l6ZSA9CisJCQkJCQkgICAgc2l6ZW9mKEhlYXJ0YmVhdEV2ZW50KTsKKwkJCQkJCUV2ZW50Lm1fcEFyZyA9ICZIZWFydGJlYXRFdmVudDsKKwkJCQkJCVJldCA9IEVwbEV2ZW50a1Bvc3QoJkV2ZW50KTsKKwkJCQkJfQorCQkJCQlFcGxFcnJvckhhbmRsZXJrSW5zdGFuY2VfZy4KKwkJCQkJICAgIG1fYWZNbkNuTG9zc1ByZXNFdmVudFt1aU5vZGVJZF0gPQorCQkJCQkgICAgVFJVRTsKKwkJCQl9CisJCQl9CisjZW5kaWYKKworCQkJYnJlYWs7CisJCX0KKworCQkvLyBOTVQgZXZlbnQKKwljYXNlIGtFcGxFdmVudFR5cGVObXRFdmVudDoKKwkJeworCQkJaWYgKCgqKHRFcGxObXRFdmVudCAqKSBwRXZlbnRfcC0+bV9wQXJnKSA9PSBrRXBsTm10RXZlbnREbGxDZVNvYSkgewkvLyBTb0EgZXZlbnQgb2YgQ04gLT4gZGVjcmVtZW50IHRocmVzaG9sZCBjb3VudGVycworCisJCQkJaWYgKChFcGxFcnJvckhhbmRsZXJrSW5zdGFuY2VfZy5tX3VsRGxsRXJyb3JFdmVudHMgJiBFUExfRExMX0VSUl9DTl9MT1NTX1NPQykgPT0gMCkgewkvLyBkZWNyZW1lbnQgbG9zcyBvZiBTb0MgdGhyZXNob2xkIGNvdW50ZXIsIGJlY2F1c2UgaXQgZGlkbid0IG9jY3VyIGxhc3QgY3ljbGUKKwkJCQkJaWYgKEVwbEVycm9ySGFuZGxlcmtJbnN0YW5jZV9nLgorCQkJCQkgICAgbV9Dbkxvc3NTb2MubV9kd1RocmVzaG9sZENudCA+IDApIHsKKwkJCQkJCUVwbEVycm9ySGFuZGxlcmtJbnN0YW5jZV9nLgorCQkJCQkJICAgIG1fQ25Mb3NzU29jLgorCQkJCQkJICAgIG1fZHdUaHJlc2hvbGRDbnQtLTsKKwkJCQkJfQorCQkJCX0KKworCQkJCWlmICgoRXBsRXJyb3JIYW5kbGVya0luc3RhbmNlX2cubV91bERsbEVycm9yRXZlbnRzICYgRVBMX0RMTF9FUlJfQ05fQ1JDKSA9PSAwKSB7CS8vIGRlY3JlbWVudCBDUkMgdGhyZXNob2xkIGNvdW50ZXIsIGJlY2F1c2UgaXQgZGlkbid0IG9jY3VyIGxhc3QgY3ljbGUKKwkJCQkJaWYgKEVwbEVycm9ySGFuZGxlcmtJbnN0YW5jZV9nLgorCQkJCQkgICAgbV9DbkNyY0Vyci5tX2R3VGhyZXNob2xkQ250ID4gMCkgeworCQkJCQkJRXBsRXJyb3JIYW5kbGVya0luc3RhbmNlX2cuCisJCQkJCQkgICAgbV9DbkNyY0Vyci4KKwkJCQkJCSAgICBtX2R3VGhyZXNob2xkQ250LS07CisJCQkJCX0KKwkJCQl9CisJCQl9CisjaWYgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRfTU4pKSAhPSAwKQorCQkJZWxzZSBpZiAoKCoodEVwbE5tdEV2ZW50ICopIHBFdmVudF9wLT5tX3BBcmcpID09IGtFcGxObXRFdmVudERsbE1lU29hU2VudCkgewkvLyBTb0EgZXZlbnQgb2YgTU4gLT4gZGVjcmVtZW50IHRocmVzaG9sZCBjb3VudGVycworCQkJCXRFcGxEbGxrTm9kZUluZm8gKnBJbnROb2RlSW5mbzsKKwkJCQl1bnNpZ25lZCBpbnQgdWlOb2RlSWQ7CisKKwkJCQlSZXQgPSBFcGxEbGxrR2V0Rmlyc3ROb2RlSW5mbygmcEludE5vZGVJbmZvKTsKKwkJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQkvLyBpdGVyYXRlIHRocm91Z2ggbm9kZSBpbmZvIHN0cnVjdHVyZSBsaXN0CisJCQkJd2hpbGUgKHBJbnROb2RlSW5mbyAhPSBOVUxMKSB7CisJCQkJCXVpTm9kZUlkID0gcEludE5vZGVJbmZvLT5tX3VpTm9kZUlkIC0gMTsKKwkJCQkJaWYgKHVpTm9kZUlkIDwKKwkJCQkJICAgIHRhYmVudHJpZXMKKwkJCQkJICAgIChFcGxFcnJvckhhbmRsZXJrSW5zdGFuY2VfZy4KKwkJCQkJICAgICBtX2Fkd01uQ25Mb3NzUHJlc0N1bUNudCkpIHsKKwkJCQkJCWlmIChFcGxFcnJvckhhbmRsZXJrSW5zdGFuY2VfZy4KKwkJCQkJCSAgICBtX2FmTW5Dbkxvc3NQcmVzRXZlbnQKKwkJCQkJCSAgICBbdWlOb2RlSWRdID09IEZBTFNFKSB7CisJCQkJCQkJaWYgKEVwbEVycm9ySGFuZGxlcmtJbnN0YW5jZV9nLm1fYWR3TW5Dbkxvc3NQcmVzVGhyQ250W3VpTm9kZUlkXSA+IDApIHsKKwkJCQkJCQkJRXBsRXJyb3JIYW5kbGVya0luc3RhbmNlX2cuCisJCQkJCQkJCSAgICBtX2Fkd01uQ25Mb3NzUHJlc1RockNudAorCQkJCQkJCQkgICAgW3VpTm9kZUlkXS0tOworCQkJCQkJCX0KKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJRXBsRXJyb3JIYW5kbGVya0luc3RhbmNlX2cuCisJCQkJCQkJICAgIG1fYWZNbkNuTG9zc1ByZXNFdmVudAorCQkJCQkJCSAgICBbdWlOb2RlSWRdID0gRkFMU0U7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJcEludE5vZGVJbmZvID0KKwkJCQkJICAgIHBJbnROb2RlSW5mby0+bV9wTmV4dE5vZGVJbmZvOworCQkJCX0KKworCQkJCWlmICgoRXBsRXJyb3JIYW5kbGVya0luc3RhbmNlX2cubV91bERsbEVycm9yRXZlbnRzICYgRVBMX0RMTF9FUlJfTU5fQ1JDKSA9PSAwKSB7CS8vIGRlY3JlbWVudCBDUkMgdGhyZXNob2xkIGNvdW50ZXIsIGJlY2F1c2UgaXQgZGlkbid0IG9jY3VyIGxhc3QgY3ljbGUKKwkJCQkJaWYgKEVwbEVycm9ySGFuZGxlcmtJbnN0YW5jZV9nLgorCQkJCQkgICAgbV9NbkNyY0Vyci5tX2R3VGhyZXNob2xkQ250ID4gMCkgeworCQkJCQkJRXBsRXJyb3JIYW5kbGVya0luc3RhbmNlX2cuCisJCQkJCQkgICAgbV9NbkNyY0Vyci4KKwkJCQkJCSAgICBtX2R3VGhyZXNob2xkQ250LS07CisJCQkJCX0KKwkJCQl9CisKKwkJCQlpZiAoKEVwbEVycm9ySGFuZGxlcmtJbnN0YW5jZV9nLm1fdWxEbGxFcnJvckV2ZW50cyAmIEVQTF9ETExfRVJSX01OX0NZQ1RJTUVFWENFRUQpID09IDApIHsJLy8gZGVjcmVtZW50IGN5Y2xlIGV4Y2VlZCB0aHJlc2hvbGQgY291bnRlciwgYmVjYXVzZSBpdCBkaWRuJ3Qgb2NjdXIgbGFzdCBjeWNsZQorCQkJCQlpZiAoRXBsRXJyb3JIYW5kbGVya0luc3RhbmNlX2cuCisJCQkJCSAgICBtX01uQ3ljVGltZUV4Y2VlZC5tX2R3VGhyZXNob2xkQ250ID4KKwkJCQkJICAgIDApIHsKKwkJCQkJCUVwbEVycm9ySGFuZGxlcmtJbnN0YW5jZV9nLgorCQkJCQkJICAgIG1fTW5DeWNUaW1lRXhjZWVkLgorCQkJCQkJICAgIG1fZHdUaHJlc2hvbGRDbnQtLTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKyNlbmRpZgorCisJCQkvLyByZXNldCBlcnJvciBldmVudHMKKwkJCUVwbEVycm9ySGFuZGxlcmtJbnN0YW5jZV9nLm1fdWxEbGxFcnJvckV2ZW50cyA9IDBMOworCisJCQlicmVhazsKKwkJfQorCisJCS8vIHVua25vd24gdHlwZQorCWRlZmF1bHQ6CisJCXsKKwkJfQorCisJfQkJCS8vIGVuZCBvZiBzd2l0Y2gocEV2ZW50X3AtPm1fRXZlbnRUeXBlKQorCisJcmV0dXJuIFJldDsKKworfQorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgIFAgUiBJIFYgQSBUIEUgICBGIFUgTiBDIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsRXJyb3JIYW5kbGVya0xpbmtFcnJvckNvdW50ZXIKKy8vCisvLyBEZXNjcmlwdGlvbjogbGluayBzcGVjaWZpZWQgZXJyb3IgY291bnRlciBzdHJ1Y3R1cmUgdG8gT0QgZW50cnkKKy8vCisvLyBQYXJhbWV0ZXJzOiAgcEVycm9yQ291bnRlcl9wICAgICAgICAgPSBwb2ludGVyIHRvIGVycm9yIGNvdW50ZXIgc3RydWN0dXJlCisvLyAgICAgICAgICAgICAgdWlJbmRleF9wICAgICAgICAgICAgICAgPSBPRCBpbmRleAorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHRFcGxLZXJuZWwgRXBsRXJyb3JIYW5kbGVya0xpbmtFcnJvckNvdW50ZXIodEVwbEVycm9ySGFuZGxlcmtFcnJvckNvdW50ZXIKKwkJCQkJCSAgICogcEVycm9yQ291bnRlcl9wLAorCQkJCQkJICAgdW5zaWduZWQgaW50IHVpSW5kZXhfcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCXRFcGxWYXJQYXJhbSBWYXJQYXJhbTsKKworCVZhclBhcmFtLm1fcERhdGEgPSAmcEVycm9yQ291bnRlcl9wLT5tX2R3Q3VtdWxhdGl2ZUNudDsKKwlWYXJQYXJhbS5tX1NpemUgPSBzaXplb2YoRFdPUkQpOworCVZhclBhcmFtLm1fdWlJbmRleCA9IHVpSW5kZXhfcDsKKwlWYXJQYXJhbS5tX3VpU3ViaW5kZXggPSAweDAxOworCVZhclBhcmFtLm1fVmFsaWRGbGFnID0ga1ZhclZhbGlkQWxsOworCVJldCA9IEVwbE9iZERlZmluZVZhcigmVmFyUGFyYW0pOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKworCVZhclBhcmFtLm1fcERhdGEgPSAmcEVycm9yQ291bnRlcl9wLT5tX2R3VGhyZXNob2xkQ250OworCVZhclBhcmFtLm1fU2l6ZSA9IHNpemVvZihEV09SRCk7CisJVmFyUGFyYW0ubV91aUluZGV4ID0gdWlJbmRleF9wOworCVZhclBhcmFtLm1fdWlTdWJpbmRleCA9IDB4MDI7CisJVmFyUGFyYW0ubV9WYWxpZEZsYWcgPSBrVmFyVmFsaWRBbGw7CisJUmV0ID0gRXBsT2JkRGVmaW5lVmFyKCZWYXJQYXJhbSk7CisJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQlnb3RvIEV4aXQ7CisJfQorCisJVmFyUGFyYW0ubV9wRGF0YSA9ICZwRXJyb3JDb3VudGVyX3AtPm1fZHdUaHJlc2hvbGQ7CisJVmFyUGFyYW0ubV9TaXplID0gc2l6ZW9mKERXT1JEKTsKKwlWYXJQYXJhbS5tX3VpSW5kZXggPSB1aUluZGV4X3A7CisJVmFyUGFyYW0ubV91aVN1YmluZGV4ID0gMHgwMzsKKwlWYXJQYXJhbS5tX1ZhbGlkRmxhZyA9IGtWYXJWYWxpZEFsbDsKKwlSZXQgPSBFcGxPYmREZWZpbmVWYXIoJlZhclBhcmFtKTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCWdvdG8gRXhpdDsKKwl9CisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsRXJyb3JIYW5kbGVya0xpbmtFcnJvckNvdW50ZXIKKy8vCisvLyBEZXNjcmlwdGlvbjogbGluayBzcGVjaWZpZWQgZXJyb3IgY291bnRlciBzdHJ1Y3R1cmUgdG8gT0QgZW50cnkKKy8vCisvLyBQYXJhbWV0ZXJzOiAgcEVycm9yQ291bnRlcl9wICAgICAgICAgPSBwb2ludGVyIHRvIGVycm9yIGNvdW50ZXIgc3RydWN0dXJlCisvLyAgICAgICAgICAgICAgdWlJbmRleF9wICAgICAgICAgICAgICAgPSBPRCBpbmRleAorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UX01OKSkgIT0gMCkKK3N0YXRpYyB0RXBsS2VybmVsIEVwbEVycm9ySGFuZGxlcmtMaW5rQXJyYXkoRFdPUkQgKiBwZHdWYWx1ZV9wLAorCQkJCQkgICAgdW5zaWduZWQgaW50IHVpVmFsdWVDb3VudF9wLAorCQkJCQkgICAgdW5zaWduZWQgaW50IHVpSW5kZXhfcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCXRFcGxWYXJQYXJhbSBWYXJQYXJhbTsKKwl0RXBsT2JkU2l6ZSBFbnRyeVNpemU7CisJQllURSBiSW5kZXhFbnRyaWVzOworCisJRW50cnlTaXplID0gKHRFcGxPYmRTaXplKSBzaXplb2YoYkluZGV4RW50cmllcyk7CisJUmV0ID0gRXBsT2JkUmVhZEVudHJ5KHVpSW5kZXhfcCwKKwkJCSAgICAgIDB4MDAsICh2b2lkIEdFTkVSSUMgKikmYkluZGV4RW50cmllcywgJkVudHJ5U2l6ZSk7CisKKwlpZiAoKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgfHwgKGJJbmRleEVudHJpZXMgPT0gMHgwMCkpIHsKKwkJLy8gT2JqZWN0IGRvZXNuJ3QgZXhpc3Qgb3IgaW52YWxpZCBlbnRyeSBudW1iZXIKKwkJUmV0ID0ga0VwbE9iZEluZGV4Tm90RXhpc3Q7CisJCWdvdG8gRXhpdDsKKwl9CisKKwlpZiAoYkluZGV4RW50cmllcyA8IHVpVmFsdWVDb3VudF9wKSB7CisJCXVpVmFsdWVDb3VudF9wID0gYkluZGV4RW50cmllczsKKwl9CisKKwlWYXJQYXJhbS5tX1NpemUgPSBzaXplb2YoRFdPUkQpOworCVZhclBhcmFtLm1fdWlJbmRleCA9IHVpSW5kZXhfcDsKKwlWYXJQYXJhbS5tX1ZhbGlkRmxhZyA9IGtWYXJWYWxpZEFsbDsKKworCWZvciAoVmFyUGFyYW0ubV91aVN1YmluZGV4ID0gMHgwMTsKKwkgICAgIFZhclBhcmFtLm1fdWlTdWJpbmRleCA8PSB1aVZhbHVlQ291bnRfcDsgVmFyUGFyYW0ubV91aVN1YmluZGV4KyspIHsKKwkJVmFyUGFyYW0ubV9wRGF0YSA9IHBkd1ZhbHVlX3A7CisJCVJldCA9IEVwbE9iZERlZmluZVZhcigmVmFyUGFyYW0pOworCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQlnb3RvIEV4aXQ7CisJCX0KKwkJcGR3VmFsdWVfcCsrOworCX0KKworICAgICAgRXhpdDoKKwlyZXR1cm4gUmV0OworfQorI2VuZGlmIC8vKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRfTU4pKSAhPSAwKQorCisjZW5kaWYgLy8oKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX0RMTEspKSAhPSAwKQorCisvLyBFT0YKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsRXZlbnQuaCBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsRXZlbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNmRjMWI5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxFdmVudC5oCkBAIC0wLDAgKzEsMjc5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgb3BlblBPV0VSTElOSworCisgIERlc2NyaXB0aW9uOiAgaW5jbHVkZSBmaWxlIGZvciBldmVudCBtb2R1bGUKKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgICAgICAgICRSQ1NmaWxlOiBFcGxFdmVudC5oLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS44ICQgICREYXRlOiAyMDA4LzExLzE3IDE2OjQwOjM5ICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorICAgICAgICAgICAgICAgICAgICBHQ0MgVjMuNAorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgIDIwMDYvMDYvMTIgZC5rLjogICBzdGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24sIHZlcnNpb24gMS4wMAorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9FUExfRVZFTlRfSF8KKyNkZWZpbmUgX0VQTF9FVkVOVF9IXworCisjaW5jbHVkZSAiRXBsSW5jLmgiCisjaW5jbHVkZSAiRXBsTm10LmgiCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBuYW1lIGFuZCBzaXplIG9mIGV2ZW50IHF1ZXVlcworI2RlZmluZSBFUExfRVZFTlRfTkFNRV9TSEJfS0VSTkVMX1RPX1VTRVIgICAiU2hiS2VybmVsVG9Vc2VyIgorI2lmbmRlZiBFUExfRVZFTlRfU0laRV9TSEJfS0VSTkVMX1RPX1VTRVIKKyNkZWZpbmUgRVBMX0VWRU5UX1NJWkVfU0hCX0tFUk5FTF9UT19VU0VSICAgMzI3NjgJLy8gMzIga0J5dGUKKyNlbmRpZgorCisjZGVmaW5lIEVQTF9FVkVOVF9OQU1FX1NIQl9VU0VSX1RPX0tFUk5FTCAgICJTaGJVc2VyVG9LZXJuZWwiCisjaWZuZGVmIEVQTF9FVkVOVF9TSVpFX1NIQl9VU0VSX1RPX0tFUk5FTAorI2RlZmluZSBFUExfRVZFTlRfU0laRV9TSEJfVVNFUl9UT19LRVJORUwgICAzMjc2OAkvLyAzMiBrQnl0ZQorI2VuZGlmCisKKy8vIG1heCBzaXplIG9mIGV2ZW50IGFyZ3VtZW50CisjaWZuZGVmIEVQTF9NQVhfRVZFTlRfQVJHX1NJWkUKKyNkZWZpbmUgRVBMX01BWF9FVkVOVF9BUkdfU0laRSAgICAgIDI1NgkvLyBiZWNhdXNlIG9mIFBETworI2VuZGlmCisKKyNkZWZpbmUgRVBMX0RMTF9FUlJfTU5fQ1JDICAgICAgICAgICAweDAwMDAwMDAxTAkvLyBvYmplY3QgMHgxQzAwCisjZGVmaW5lIEVQTF9ETExfRVJSX01OX0NPTExJU0lPTiAgICAgMHgwMDAwMDAwMkwJLy8gb2JqZWN0IDB4MUMwMQorI2RlZmluZSBFUExfRExMX0VSUl9NTl9DWUNUSU1FRVhDRUVEIDB4MDAwMDAwMDRMCS8vIG9iamVjdCAweDFDMDIKKyNkZWZpbmUgRVBMX0RMTF9FUlJfTU5fTE9TU19MSU5LICAgICAweDAwMDAwMDA4TAkvLyBvYmplY3QgMHgxQzAzCisjZGVmaW5lIEVQTF9ETExfRVJSX01OX0NOX0xBVEVfUFJFUyAgMHgwMDAwMDAxMEwJLy8gb2JqZWN0cyAweDFDMDQtMHgxQzA2CisjZGVmaW5lIEVQTF9ETExfRVJSX01OX0NOX0xPU1NfUFJFUyAgMHgwMDAwMDA4MEwJLy8gb2JqZWN0cyAweDFDMDctMHgxQzA5CisjZGVmaW5lIEVQTF9ETExfRVJSX0NOX0NPTExJU0lPTiAgICAgMHgwMDAwMDQwMEwJLy8gb2JqZWN0IDB4MUMwQQorI2RlZmluZSBFUExfRExMX0VSUl9DTl9MT1NTX1NPQyAgICAgIDB4MDAwMDA4MDBMCS8vIG9iamVjdCAweDFDMEIKKyNkZWZpbmUgRVBMX0RMTF9FUlJfQ05fTE9TU19TT0EgICAgICAweDAwMDAxMDAwTAkvLyBvYmplY3QgMHgxQzBDCisjZGVmaW5lIEVQTF9ETExfRVJSX0NOX0xPU1NfUFJFUSAgICAgMHgwMDAwMjAwMEwJLy8gb2JqZWN0IDB4MUMwRAorI2RlZmluZSBFUExfRExMX0VSUl9DTl9SRUNWRF9QUkVRICAgIDB4MDAwMDQwMDBMCS8vIGRlY3JlbWVudCBvYmplY3QgMHgxQzBELzIKKyNkZWZpbmUgRVBMX0RMTF9FUlJfQ05fU09DX0pJVFRFUiAgICAweDAwMDA4MDAwTAkvLyBvYmplY3QgMHgxQzBFCisjZGVmaW5lIEVQTF9ETExfRVJSX0NOX0NSQyAgICAgICAgICAgMHgwMDAxMDAwMEwJLy8gb2JqZWN0IDB4MUMwRgorI2RlZmluZSBFUExfRExMX0VSUl9DTl9MT1NTX0xJTksgICAgIDB4MDAwMjAwMDBMCS8vIG9iamVjdCAweDFDMTAKKyNkZWZpbmUgRVBMX0RMTF9FUlJfTU5fTE9TU19TVEFUUkVTICAweDAwMDQwMDAwTAkvLyBvYmplY3RzIDB4MUMxNS0weDFDMTcgKHNob3VsZCBiZSBvcGVyYXRlZCBieSBObXRNbnUgbW9kdWxlKQorI2RlZmluZSBFUExfRExMX0VSUl9CQURfUEhZU19NT0RFICAgIDB4MDAwODAwMDBMCS8vIG5vIG9iamVjdAorI2RlZmluZSBFUExfRExMX0VSUl9NQUNfQlVGRkVSICAgICAgIDB4MDAxMDAwMDBMCS8vIG5vIG9iamVjdCAoTk1UX0dUNikKKyNkZWZpbmUgRVBMX0RMTF9FUlJfSU5WQUxJRF9GT1JNQVQgICAweDAwMjAwMDAwTAkvLyBubyBvYmplY3QgKE5NVF9HVDYpCisjZGVmaW5lIEVQTF9ETExfRVJSX0FERFJFU1NfQ09ORkxJQ1QgMHgwMDQwMDAwMEwJLy8gbm8gb2JqZWN0IChyZW1vdmUgQ04gZnJvbSBjb25maWd1cmF0aW9uKQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gdHlwZWRlZgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gRXZlbnRUeXBlIGRldGVybWluZXMgdGhlIGFyZ3VtZW50IG9mIHRoZSBldmVudAordHlwZWRlZiBlbnVtIHsKKwlrRXBsRXZlbnRUeXBlTm10RXZlbnQgPSAweDAxLAkvLyBOTVQgZXZlbnQKKwkvLyBhcmcgaXMgcG9pbnRlciB0byB0RXBsTm10RXZlbnQKKwlrRXBsRXZlbnRUeXBlUGRvUnggPSAweDAyLAkvLyBQRE8gZnJhbWUgcmVjZWl2ZWQgZXZlbnQgKFBSZXMvUFJlcSkKKwkvLyBhcmcgaXMgcG9pbnRlciB0byB0RXBsRnJhbWUKKwlrRXBsRXZlbnRUeXBlUGRvVHggPSAweDAzLAkvLyBQRE8gZnJhbWUgdHJhbnNtaXR0ZWQgZXZlbnQgKFBSZXMvUFJlcSkKKwkvLyBhcmcgaXMgcG9pbnRlciB0byB0RXBsRnJhbWVJbmZvCisJa0VwbEV2ZW50VHlwZVBkb1NvYSA9IDB4MDQsCS8vIFNvQSBmcmFtZSByZWNlaXZlZCBldmVudCAoaXNvY2hyb25vdXMgcGhhc2UgY29tcGxldGVkKQorCS8vIGFyZyBpcyBwb2ludGVyIHRvIG5vdGhpbmcKKwlrRXBsRXZlbnRUeXBlU3luYyA9IDB4MDUsCS8vIFN5bmMgZXZlbnQgKGUuZy4gU29DIG9yIGFudGljaXBhdGVkIFNvQykKKwkvLyBhcmcgaXMgcG9pbnRlciB0byBub3RoaW5nCisJa0VwbEV2ZW50VHlwZVRpbWVyID0gMHgwNiwJLy8gVGltZXIgZXZlbnQKKwkvLyBhcmcgaXMgcG9pbnRlciB0byB0RXBsVGltZXJFdmVudEFyZworCWtFcGxFdmVudFR5cGVIZWFydGJlYXQgPSAweDA3LAkvLyBIZWFydGJlYXQgZXZlbnQKKwkvLyBhcmcgaXMgcG9pbnRlciB0byB0RXBsSGVhcnRiZWF0RXZlbnQKKwlrRXBsRXZlbnRUeXBlRGxsa0NyZWF0ZSA9IDB4MDgsCS8vIERMTCBrZXJuZWwgY3JlYXRlIGV2ZW50CisJLy8gYXJnIGlzIHBvaW50ZXIgdG8gdGhlIG5ldyB0RXBsTm10U3RhdGUKKwlrRXBsRXZlbnRUeXBlRGxsa0Rlc3Ryb3kgPSAweDA5LAkvLyBETEwga2VybmVsIGRlc3Ryb3kgZXZlbnQKKwkvLyBhcmcgaXMgcG9pbnRlciB0byB0aGUgb2xkIHRFcGxObXRTdGF0ZQorCWtFcGxFdmVudFR5cGVEbGxrRmlsbFR4ID0gMHgwQSwJLy8gRExMIGtlcm5lbCBmaWxsIFR4QnVmZmVyIGV2ZW50CisJLy8gYXJnIGlzIHBvaW50ZXIgdG8gdEVwbERsbEFzeW5jUmVxUHJpb3JpdHkKKwlrRXBsRXZlbnRUeXBlRGxsa1ByZXNSZWFkeSA9IDB4MEIsCS8vIERMTCBrZXJuZWwgUFJlcyByZWFkeSBldmVudAorCS8vIGFyZyBpcyBwb2ludGVyIHRvIG5vdGhpbmcKKwlrRXBsRXZlbnRUeXBlRXJyb3IgPSAweDBDLAkvLyBFcnJvciBldmVudCBmb3IgQVBJIGxheWVyCisJLy8gYXJnIGlzIHBvaW50ZXIgdG8gdEVwbEV2ZW50RXJyb3IKKwlrRXBsRXZlbnRUeXBlTm10U3RhdGVDaGFuZ2UgPSAweDBELAkvLyBpbmRpY2F0ZSBjaGFuZ2Ugb2YgTk1ULVN0YXRlCisJLy8gYXJnIGlzIHBvaW50ZXIgdG8gdEVwbEV2ZW50Tm10U3RhdGVDaGFuZ2UKKwlrRXBsRXZlbnRUeXBlRGxsRXJyb3IgPSAweDBFLAkvLyBETEwgZXJyb3IgZXZlbnQgZm9yIEVycm9yIGhhbmRsZXIKKwkvLyBhcmcgaXMgcG9pbnRlciB0byB0RXBsRXJyb3JIYW5kbGVya0V2ZW50CisJa0VwbEV2ZW50VHlwZUFzbmRSeCA9IDB4MEYsCS8vIHJlY2VpdmVkIEFTbmQgZnJhbWUgZm9yIERMTCB1c2VyIG1vZHVsZQorCS8vIGFyZyBpcyBwb2ludGVyIHRvIHRFcGxGcmFtZQorCWtFcGxFdmVudFR5cGVEbGxrU2VydkZpbHRlciA9IDB4MTAsCS8vIGNvbmZpZ3VyZSBTZXJ2aWNlSWRGaWx0ZXIKKwkvLyBhcmcgaXMgcG9pbnRlciB0byB0RXBsRGxsQ2FsU2VydmljZUlkRmlsdGVyCisJa0VwbEV2ZW50VHlwZURsbGtJZGVudGl0eSA9IDB4MTEsCS8vIGNvbmZpZ3VyZSBJZGVudGl0eQorCS8vIGFyZyBpcyBwb2ludGVyIHRvIHRFcGxEbGxJZGVudFBhcmFtCisJa0VwbEV2ZW50VHlwZURsbGtDb25maWcgPSAweDEyLAkvLyBjb25maWd1cmUgQ29uZmlnUGFyYW0KKwkvLyBhcmcgaXMgcG9pbnRlciB0byB0RXBsRGxsQ29uZmlnUGFyYW0KKwlrRXBsRXZlbnRUeXBlRGxsa0lzc3VlUmVxID0gMHgxMywJLy8gaXNzdWUgSWRlbnQvU3RhdHVzIHJlcXVlc3QKKwkvLyBhcmcgaXMgcG9pbnRlciB0byB0RXBsRGxsQ2FsSXNzdWVSZXF1ZXN0CisJa0VwbEV2ZW50VHlwZURsbGtBZGROb2RlID0gMHgxNCwJLy8gYWRkIG5vZGUgdG8gaXNvY2hyb25vdXMgcGhhc2UKKwkvLyBhcmcgaXMgcG9pbnRlciB0byB0RXBsRGxsTm9kZUluZm8KKwlrRXBsRXZlbnRUeXBlRGxsa0RlbE5vZGUgPSAweDE1LAkvLyByZW1vdmUgbm9kZSBmcm9tIGlzb2Nocm9ub3VzIHBoYXNlCisJLy8gYXJnIGlzIHBvaW50ZXIgdG8gdW5zaWduZWQgaW50CisJa0VwbEV2ZW50VHlwZURsbGtTb2Z0RGVsTm9kZSA9IDB4MTYsCS8vIHJlbW92ZSBub2RlIHNvZnRseSBmcm9tIGlzb2Nocm9ub3VzIHBoYXNlCisJLy8gYXJnIGlzIHBvaW50ZXIgdG8gdW5zaWduZWQgaW50CisJa0VwbEV2ZW50VHlwZURsbGtTdGFydFJlZHVjZWRDeWNsZSA9IDB4MTcsCS8vIHN0YXJ0IHJlZHVjZWQgRVBMIGN5Y2xlIG9uIE1OCisJLy8gYXJnIGlzIHBvaW50ZXIgdG8gbm90aGluZworCWtFcGxFdmVudFR5cGVObXRNbnVObXRDbWRTZW50ID0gMHgxOCwJLy8gTk1UIGNvbW1hbmQgd2FzIGFjdHVhbGx5IHNlbnQKKwkvLyBhcmcgaXMgcG9pbnRlciB0byB0RXBsRnJhbWUKKworfSB0RXBsRXZlbnRUeXBlOworCisvLyBFdmVudFNpbmsgZGV0ZXJtaW5lcyB0aGUgY29uc3VtZXIgb2YgdGhlIGV2ZW50Cit0eXBlZGVmIGVudW0geworCWtFcGxFdmVudFNpbmtTeW5jID0gMHgwMCwJLy8gU3luYyBldmVudCBmb3IgYXBwbGljYXRpb24gb3Iga2VybmVsIEVQTCBtb2R1bGUKKwlrRXBsRXZlbnRTaW5rTm10ayA9IDB4MDEsCS8vIGV2ZW50cyBmb3IgTm10ayBtb2R1bGUKKwlrRXBsRXZlbnRTaW5rRGxsayA9IDB4MDIsCS8vIGV2ZW50cyBmb3IgRGxsayBtb2R1bGUKKwlrRXBsRXZlbnRTaW5rRGxsdUNhbCA9IDB4MDMsCS8vIGV2ZW50cyBmb3IgRGxsdUNhbCBtb2R1bGUKKwlrRXBsRXZlbnRTaW5rRGxsa0NhbCA9IDB4MDQsCS8vIGV2ZW50cyBmb3IgRGxsa0NhbCBtb2R1bGUKKwlrRXBsRXZlbnRTaW5rUGRvayA9IDB4MDUsCS8vIGV2ZW50cyBmb3IgUGRvayBtb2R1bGUKKwlrRXBsRXZlbnRTaW5rTm10dSA9IDB4MDYsCS8vIGV2ZW50cyBmb3IgTm10dSBtb2R1bGUKKwlrRXBsRXZlbnRTaW5rRXJyayA9IDB4MDcsCS8vIGV2ZW50cyBmb3IgRXJyb3IgaGFuZGxlciBtb2R1bGUKKwlrRXBsRXZlbnRTaW5rRXJydSA9IDB4MDgsCS8vIGV2ZW50cyBmb3IgRXJyb3Igc2lnbmFsaW5nIG1vZHVsZQorCWtFcGxFdmVudFNpbmtTZG9Bc3lTZXEgPSAweDA5LAkvLyBldmVudHMgZm9yIGFzeW5jcm9ub3VzIFNETyBTZXF1ZW5jZSBMYXllciBtb2R1bGUKKwlrRXBsRXZlbnRTaW5rTm10TW51ID0gMHgwQSwJLy8gZXZlbnRzIGZvciBObXRNbnUgbW9kdWxlCisJa0VwbEV2ZW50U2lua0xlZHUgPSAweDBCLAkvLyBldmVudHMgZm9yIExlZHUgbW9kdWxlCisJa0VwbEV2ZW50U2lua0FwaSA9IDB4MEYsCS8vIGV2ZW50cyBmb3IgQVBJIG1vZHVsZQorCit9IHRFcGxFdmVudFNpbms7CisKKy8vIEV2ZW50U291cmNlIGRldGVybWluZXMgdGhlIHNvdXJjZSBvZiBhbiBlcnJvcmV2ZW50Cit0eXBlZGVmIGVudW0geworCS8vIGtlcm5lbHNwYWNlIG1vZHVsZXMKKwlrRXBsRXZlbnRTb3VyY2VEbGxrID0gMHgwMSwJLy8gRGxsayBtb2R1bGUKKwlrRXBsRXZlbnRTb3VyY2VObXRrID0gMHgwMiwJLy8gTm10ayBtb2R1bGUKKwlrRXBsRXZlbnRTb3VyY2VPYmRrID0gMHgwMywJLy8gT2JkayBtb2R1bGUKKwlrRXBsRXZlbnRTb3VyY2VQZG9rID0gMHgwNCwJLy8gUGRvayBtb2R1bGUKKwlrRXBsRXZlbnRTb3VyY2VUaW1lcmsgPSAweDA1LAkvLyBUaW1lcmsgbW9kdWxlCisJa0VwbEV2ZW50U291cmNlRXZlbnRrID0gMHgwNiwJLy8gRXZlbnRrIG1vZHVsZQorCWtFcGxFdmVudFNvdXJjZVN5bmNDYiA9IDB4MDcsCS8vIHN5bmMtQ2IKKwlrRXBsRXZlbnRTb3VyY2VFcnJrID0gMHgwOCwJLy8gRXJyb3IgaGFuZGxlciBtb2R1bGUKKworCS8vIHVzZXJzcGFjZSBtb2R1bGVzCisJa0VwbEV2ZW50U291cmNlRGxsdSA9IDB4MTAsCS8vIERsbHUgbW9kdWxlCisJa0VwbEV2ZW50U291cmNlTm10dSA9IDB4MTEsCS8vIE5tdHUgbW9kdWxlCisJa0VwbEV2ZW50U291cmNlTm10Q251ID0gMHgxMiwJLy8gTm10Q251IG1vZHVsZQorCWtFcGxFdmVudFNvdXJjZU5tdE1udSA9IDB4MTMsCS8vIE5tdE1udSBtb2R1bGUKKwlrRXBsRXZlbnRTb3VyY2VPYmR1ID0gMHgxNCwJLy8gT2JkdSBtb2R1bGUKKwlrRXBsRXZlbnRTb3VyY2VTZG9VZHAgPSAweDE1LAkvLyBTZG8vVWRwIG1vZHVsZQorCWtFcGxFdmVudFNvdXJjZVNkb0FzbmQgPSAweDE2LAkvLyBTZG8vQXNuZCBtb2R1bGUKKwlrRXBsRXZlbnRTb3VyY2VTZG9Bc3lTZXEgPSAweDE3LAkvLyBTZG8gYXN5bmNocm9udXMgU2VxdWVuY2UgTGF5ZXIgbW9kdWxlCisJa0VwbEV2ZW50U291cmNlU2RvQ29tID0gMHgxOCwJLy8gU2RvIGNvbW1hbmQgbGF5ZXIgbW9kdWxlCisJa0VwbEV2ZW50U291cmNlVGltZXJ1ID0gMHgxOSwJLy8gVGltZXJ1IG1vZHVsZQorCWtFcGxFdmVudFNvdXJjZUNmZ01hdSA9IDB4MUEsCS8vIENmZ01hdSBtb2R1bGUKKwlrRXBsRXZlbnRTb3VyY2VFdmVudHUgPSAweDFCLAkvLyBFdmVudHUgbW9kdWxlCisJa0VwbEV2ZW50U291cmNlRXBsQXBpID0gMHgxQywJLy8gQXBpIG1vZHVsZQorCWtFcGxFdmVudFNvdXJjZUxlZHUgPSAweDFELAkvLyBMZWR1IG1vZHVsZQorCit9IHRFcGxFdmVudFNvdXJjZTsKKworLy8gc3RydWN0dXJlIG9mIEVQTCBldmVudCAoZWxlbWVudCBvcmRlciBtdXN0IG5vdCBiZSBjaGFuZ2VkISkKK3R5cGVkZWYgc3RydWN0IHsKKwl0RXBsRXZlbnRUeXBlIG1fRXZlbnRUeXBlIC8qOjI4ICovIDsJLy8gZXZlbnQgdHlwZQorCXRFcGxFdmVudFNpbmsgbV9FdmVudFNpbmsgLyo6NCAqLyA7CS8vIGV2ZW50IHNpbmsKKwl0RXBsTmV0VGltZSBtX05ldFRpbWU7CS8vIHRpbWVzdGFtcAorCXVuc2lnbmVkIGludCBtX3VpU2l6ZTsJLy8gc2l6ZSBvZiBhcmd1bWVudAorCXZvaWQgKm1fcEFyZzsJCS8vIGFyZ3VtZW50IG9mIGV2ZW50CisKK30gdEVwbEV2ZW50OworCisvLyBzaG9ydCBzdHJ1Y3R1cmUgb2YgRVBMIGV2ZW50IHdpdGhvdXQgYXJndW1lbnQgYW5kIGl0cyBzaXplIChlbGVtZW50IG9yZGVyIG11c3Qgbm90IGJlIGNoYW5nZWQhKQordHlwZWRlZiBzdHJ1Y3QgeworCXRFcGxFdmVudFR5cGUgbV9FdmVudFR5cGUgLyo6MjggKi8gOwkvLyBldmVudCB0eXBlCisJdEVwbEV2ZW50U2luayBtX0V2ZW50U2luayAvKjo0ICovIDsJLy8gZXZlbnQgc2luaworCXRFcGxOZXRUaW1lIG1fTmV0VGltZTsJLy8gdGltZXN0YW1wCisKK30gdEVwbEV2ZW50U2hvcnQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBpbnQgbV91aUluZGV4OworCXVuc2lnbmVkIGludCBtX3VpU3ViSW5kZXg7CisKK30gdEVwbEV2ZW50T2JkRXJyb3I7CisKKy8vIHN0cnVjdHVyZSBmb3Iga0VwbEV2ZW50VHlwZUVycm9yCit0eXBlZGVmIHN0cnVjdCB7CisJdEVwbEV2ZW50U291cmNlIG1fRXZlbnRTb3VyY2U7CS8vIG1vZHVsZSB3aGljaCBwb3N0ZWQgdGhpcyBlcnJvciBldmVudAorCXRFcGxLZXJuZWwgbV9FcGxFcnJvcjsJLy8gRVBMIGVycm9yIHdoaWNoIG9jY3VyZWQKKwl1bmlvbiB7CisJCUJZVEUgbV9iQXJnOworCQlEV09SRCBtX2R3QXJnOworCQl0RXBsRXZlbnRTb3VyY2UgbV9FdmVudFNvdXJjZTsJLy8gZnJvbSBFdmVudGsvdSBtb2R1bGUgKG9yaWdpbmF0aW5nIGVycm9yIHNvdXJjZSkKKwkJdEVwbEV2ZW50T2JkRXJyb3IgbV9PYmRFcnJvcjsJLy8gZnJvbSBPYmQgbW9kdWxlCisvLyAgICAgICAgdEVwbEVyckhpc3RvcnlFbnRyeSAgICAgbV9IaXN0b3J5RW50cnk7IC8vIGZyb20gTm10ay91IG1vZHVsZQorCisJfSBtX0FyZzsKKworfSB0RXBsRXZlbnRFcnJvcjsKKworLy8gc3RydWN0dXJlIGZvciBrRXBsRXZlbnRUeXBlRGxsRXJyb3IKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBsb25nIG1fdWxEbGxFcnJvckV2ZW50czsJLy8gRVBMX0RMTF9FUlJfKgorCXVuc2lnbmVkIGludCBtX3VpTm9kZUlkOworCXRFcGxObXRTdGF0ZSBtX05tdFN0YXRlOworCit9IHRFcGxFcnJvckhhbmRsZXJrRXZlbnQ7CisKKy8vIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGdldCBpbmZvcm1lZCBhYm91dCBzeW5jIGV2ZW50Cit0eXBlZGVmIHRFcGxLZXJuZWwoUFVCTElDICogdEVwbFN5bmNDYikgKHZvaWQpOworCisvLyBjYWxsYmFjayBmdW5jdGlvbiBmb3IgZ2VuZXJpYyBldmVudHMKK3R5cGVkZWYgdEVwbEtlcm5lbChQVUJMSUMgKiB0RXBsUHJvY2Vzc0V2ZW50Q2IpICh0RXBsRXZlbnQgKiBwRXBsRXZlbnRfcCk7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZW5kaWYgLy8gI2lmbmRlZiBfRVBMX0VWRU5UX0hfCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbEV2ZW50ay5jIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxFdmVudGsuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDY4YTZjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxFdmVudGsuYwpAQCAtMCwwICsxLDg1MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIHNvdXJjZSBmaWxlIGZvciBFcGwtS2VybmVsc3BhY2UtRXZlbnQtTW9kdWwKKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgICAgICAgICRSQ1NmaWxlOiBFcGxFdmVudGsuYyx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuOSAkICAkRGF0ZTogMjAwOC8xMC8xNyAxNTozMjozMiAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICAgICAgR0NDIFYzLjQKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUmV2aXNpb24gSGlzdG9yeToKKworICAyMDA2LzA2LzIwIGsudC46ICAgc3RhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJrZXJuZWwvRXBsRXZlbnRrLmgiCisjaW5jbHVkZSAia2VybmVsL0VwbE5tdGsuaCIKKyNpbmNsdWRlICJrZXJuZWwvRXBsRGxsay5oIgorI2luY2x1ZGUgImtlcm5lbC9FcGxEbGxrQ2FsLmgiCisjaW5jbHVkZSAia2VybmVsL0VwbEVycm9ySGFuZGxlcmsuaCIKKyNpbmNsdWRlICJCZW5jaG1hcmsuaCIKKworI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfUERPSykpICE9IDApCisjaW5jbHVkZSAia2VybmVsL0VwbFBkb2suaCIKKyNpbmNsdWRlICJrZXJuZWwvRXBsUGRva0NhbC5oIgorI2VuZGlmCisKKyNpZmRlZiBFUExfTk9fRklGTworI2luY2x1ZGUgInVzZXIvRXBsRXZlbnR1LmgiCisjZWxzZQorI2luY2x1ZGUgIlNoYXJlZEJ1ZmYuaCIKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICBHIEwgTyBCIEEgTCAgIEQgRSBGIEkgTiBJIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gVHJhY2VQb2ludCBzdXBwb3J0IGZvciByZWFsdGltZS1kZWJ1Z2dpbmcKKyNpZmRlZiBfREJHX1RSQUNFX1BPSU5UU18KK3ZvaWQgUFVCTElDIFRndERiZ1NpZ25hbFRyYWNlUG9pbnQoQllURSBiVHJhY2VQb2ludE51bWJlcl9wKTsKK3ZvaWQgUFVCTElDIFRndERiZ1Bvc3RUcmFjZVZhbHVlKERXT1JEIGR3VHJhY2VWYWx1ZV9wKTsKKyNkZWZpbmUgVEdUX0RCR19TSUdOQUxfVFJBQ0VfUE9JTlQocCkgICBUZ3REYmdTaWduYWxUcmFjZVBvaW50KHApCisjZGVmaW5lIFRHVF9EQkdfUE9TVF9UUkFDRV9WQUxVRSh2KSAgICAgVGd0RGJnUG9zdFRyYWNlVmFsdWUodikKKyNlbHNlCisjZGVmaW5lIFRHVF9EQkdfU0lHTkFMX1RSQUNFX1BPSU5UKHApCisjZGVmaW5lIFRHVF9EQkdfUE9TVF9UUkFDRV9WQUxVRSh2KQorI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCB0eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordHlwZWRlZiBzdHJ1Y3QgeworI2lmbmRlZiBFUExfTk9fRklGTworCXRTaGJJbnN0YW5jZSBtX3BTaGJLZXJuZWxUb1VzZXJJbnN0YW5jZTsKKwl0U2hiSW5zdGFuY2UgbV9wU2hiVXNlclRvS2VybmVsSW5zdGFuY2U7CisjZWxzZQorCisjZW5kaWYKKwl0RXBsU3luY0NiIG1fcGZuQ2JTeW5jOworCXVuc2lnbmVkIGludCBtX3VpVXNlclRvS2VybmVsRnVsbENvdW50OworCit9IHRFcGxFdmVudGtJbnN0YW5jZTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIG1vZHVsIGdsb2JhbGUgdmFycworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N0YXRpYyB0RXBsRXZlbnRrSW5zdGFuY2UgRXBsRXZlbnRrSW5zdGFuY2VfZzsKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBjYWxsYmFjayBmdW5jdGlvbiBmb3IgaW5jb21pbmcgZXZlbnRzCisjaWZuZGVmIEVQTF9OT19GSUZPCitzdGF0aWMgdm9pZCBFcGxFdmVudGtSeFNpZ25hbEhhbmRsZXJDYih0U2hiSW5zdGFuY2UgcFNoYlJ4SW5zdGFuY2VfcCwKKwkJCQkgICAgICAgdW5zaWduZWQgbG9uZyB1bERhdGFTaXplX3ApOworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIEMgTCBBIFMgUyAgPEVwbC1LZXJuZWxzcGFjZS1FdmVudD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvLworLy8gRGVzY3JpcHRpb246CisvLworLy8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgUCBVIEIgTCBJIEMgICBGIFUgTiBDIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxFdmVudGtJbml0CisvLworLy8gRGVzY3JpcHRpb246IGZ1bmN0aW9uIGluaXRpYWxpemVzIHRoZSBmaXJzdCBpbnN0YW5jZQorLy8KKy8vIFBhcmFtZXRlcnM6ICBwZm5DYlN5bmNfcCA9IGNhbGxiYWNrLWZ1bmN0aW9uIGZvciBzeW5jIGV2ZW50CisvLworLy8gUmV0dXJuczogICAgIHRFcEtlcm5lbCAgID0gZXJyb3Jjb2RlCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsRXZlbnRrSW5pdCh0RXBsU3luY0NiIHBmbkNiU3luY19wKQoreworCXRFcGxLZXJuZWwgUmV0OworCisJUmV0ID0gRXBsRXZlbnRrQWRkSW5zdGFuY2UocGZuQ2JTeW5jX3ApOworCisJcmV0dXJuIFJldDsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxFdmVudGtBZGRJbnN0YW5jZQorLy8KKy8vIERlc2NyaXB0aW9uOiBmdW5jdGlvbiBhZGRzIG9uZSBtb3JlIGluc3RhbmNlCisvLworLy8gUGFyYW1ldGVyczogIHBmbkNiU3luY19wID0gY2FsbGJhY2stZnVuY3Rpb24gZm9yIHN5bmMgZXZlbnQKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwS2VybmVsICAgPSBlcnJvcmNvZGUKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIFBVQkxJQyBFcGxFdmVudGtBZGRJbnN0YW5jZSh0RXBsU3luY0NiIHBmbkNiU3luY19wKQoreworCXRFcGxLZXJuZWwgUmV0OworI2lmbmRlZiBFUExfTk9fRklGTworCXRTaGJFcnJvciBTaGJFcnJvcjsKKwl1bnNpZ25lZCBpbnQgZlNoYk5ld0NyZWF0ZWQ7CisjZW5kaWYKKworCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJLy8gaW5pdCBpbnN0YW5jZSBzdHJ1Y3R1cmUKKwlFcGxFdmVudGtJbnN0YW5jZV9nLm1fdWlVc2VyVG9LZXJuZWxGdWxsQ291bnQgPSAwOworCisJLy8gc2F2ZSBjYi1mdW5jdGlvbgorCUVwbEV2ZW50a0luc3RhbmNlX2cubV9wZm5DYlN5bmMgPSBwZm5DYlN5bmNfcDsKKworI2lmbmRlZiBFUExfTk9fRklGTworCS8vIGluaXQgc2hhcmVkIGxvb3AgYnVmZmVyCisJLy8ga2VybmVsIC0+IHVzZXIKKwlTaGJFcnJvciA9IFNoYkNpckFsbG9jQnVmZmVyKEVQTF9FVkVOVF9TSVpFX1NIQl9LRVJORUxfVE9fVVNFUiwKKwkJCQkgICAgIEVQTF9FVkVOVF9OQU1FX1NIQl9LRVJORUxfVE9fVVNFUiwKKwkJCQkgICAgICZFcGxFdmVudGtJbnN0YW5jZV9nLgorCQkJCSAgICAgbV9wU2hiS2VybmVsVG9Vc2VySW5zdGFuY2UsCisJCQkJICAgICAmZlNoYk5ld0NyZWF0ZWQpOworCWlmIChTaGJFcnJvciAhPSBrU2hiT2spIHsKKwkJRVBMX0RCR0xWTF9FVkVOVEtfVFJBQ0UxCisJCSAgICAoIkVwbEV2ZW50a0FkZEluc3RhbmNlKCk6IFNoYkNpckFsbG9jQnVmZmVyKEsyVSkgLT4gMHglWFxuIiwKKwkJICAgICBTaGJFcnJvcik7CisJCVJldCA9IGtFcGxOb1Jlc291cmNlOworCQlnb3RvIEV4aXQ7CisJfQorCS8vIHVzZXIgLT4ga2VybmVsCisJU2hiRXJyb3IgPSBTaGJDaXJBbGxvY0J1ZmZlcihFUExfRVZFTlRfU0laRV9TSEJfVVNFUl9UT19LRVJORUwsCisJCQkJICAgICBFUExfRVZFTlRfTkFNRV9TSEJfVVNFUl9UT19LRVJORUwsCisJCQkJICAgICAmRXBsRXZlbnRrSW5zdGFuY2VfZy4KKwkJCQkgICAgIG1fcFNoYlVzZXJUb0tlcm5lbEluc3RhbmNlLAorCQkJCSAgICAgJmZTaGJOZXdDcmVhdGVkKTsKKwlpZiAoU2hiRXJyb3IgIT0ga1NoYk9rKSB7CisJCUVQTF9EQkdMVkxfRVZFTlRLX1RSQUNFMQorCQkgICAgKCJFcGxFdmVudGtBZGRJbnN0YW5jZSgpOiBTaGJDaXJBbGxvY0J1ZmZlcihVMkspIC0+IDB4JVhcbiIsCisJCSAgICAgU2hiRXJyb3IpOworCQlSZXQgPSBrRXBsTm9SZXNvdXJjZTsKKwkJZ290byBFeGl0OworCX0KKwkvLyByZWdpc3RlciBldmVudGhhbmRsZXIKKwlTaGJFcnJvciA9CisJICAgIFNoYkNpclNldFNpZ25hbEhhbmRsZXJOZXdEYXRhKEVwbEV2ZW50a0luc3RhbmNlX2cuCisJCQkJCSAgbV9wU2hiVXNlclRvS2VybmVsSW5zdGFuY2UsCisJCQkJCSAgRXBsRXZlbnRrUnhTaWduYWxIYW5kbGVyQ2IsCisJCQkJCSAga3NoYlByaW9yaXR5SGlnaCk7CisJaWYgKFNoYkVycm9yICE9IGtTaGJPaykgeworCQlFUExfREJHTFZMX0VWRU5US19UUkFDRTEKKwkJICAgICgiRXBsRXZlbnRrQWRkSW5zdGFuY2UoKTogU2hiQ2lyU2V0U2lnbmFsSGFuZGxlck5ld0RhdGEoVTJLKSAtPiAweCVYXG4iLAorCQkgICAgIFNoYkVycm9yKTsKKwkJUmV0ID0ga0VwbE5vUmVzb3VyY2U7CisJCWdvdG8gRXhpdDsKKwl9CisKKyAgICAgIEV4aXQ6CisjZW5kaWYKKworCXJldHVybiBSZXQ7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsRXZlbnRrRGVsSW5zdGFuY2UKKy8vCisvLyBEZXNjcmlwdGlvbjogZnVuY3Rpb24gZGVsZXRlcyBpbnN0YW5jZSBhbmQgZnJlZXMgdGhlIGJ1ZmZlcnMKKy8vCisvLyBQYXJhbWV0ZXJzOiAgdm9pZAorLy8KKy8vIFJldHVybnM6ICAgICB0RXBLZXJuZWwgICA9IGVycm9yY29kZQorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbEV2ZW50a0RlbEluc3RhbmNlKCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKyNpZm5kZWYgRVBMX05PX0ZJRk8KKwl0U2hiRXJyb3IgU2hiRXJyb3I7CisjZW5kaWYKKworCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCisjaWZuZGVmIEVQTF9OT19GSUZPCisJLy8gc2V0IGV2ZW50aGFuZGxlciB0byBOVUxMCisJU2hiRXJyb3IgPQorCSAgICBTaGJDaXJTZXRTaWduYWxIYW5kbGVyTmV3RGF0YShFcGxFdmVudGtJbnN0YW5jZV9nLgorCQkJCQkgIG1fcFNoYlVzZXJUb0tlcm5lbEluc3RhbmNlLCBOVUxMLAorCQkJCQkgIGtTaGJQcmlvcml0eU5vcm1hbCk7CisJaWYgKFNoYkVycm9yICE9IGtTaGJPaykgeworCQlFUExfREJHTFZMX0VWRU5US19UUkFDRTEKKwkJICAgICgiRXBsRXZlbnRrRGVsSW5zdGFuY2UoKTogU2hiQ2lyU2V0U2lnbmFsSGFuZGxlck5ld0RhdGEoVTJLKSAtPiAweCVYXG4iLAorCQkgICAgIFNoYkVycm9yKTsKKwkJUmV0ID0ga0VwbE5vUmVzb3VyY2U7CisJfQorCS8vIGZyZWUgYnVmZmVyIFVzZXIgLT4gS2VybmVsCisJU2hiRXJyb3IgPQorCSAgICBTaGJDaXJSZWxlYXNlQnVmZmVyKEVwbEV2ZW50a0luc3RhbmNlX2cubV9wU2hiVXNlclRvS2VybmVsSW5zdGFuY2UpOworCWlmIChTaGJFcnJvciAhPSBrU2hiT2spIHsKKwkJRVBMX0RCR0xWTF9FVkVOVEtfVFJBQ0UxCisJCSAgICAoIkVwbEV2ZW50a0RlbEluc3RhbmNlKCk6IFNoYkNpclJlbGVhc2VCdWZmZXIoVTJLKSAtPiAweCVYXG4iLAorCQkgICAgIFNoYkVycm9yKTsKKwkJUmV0ID0ga0VwbE5vUmVzb3VyY2U7CisJfSBlbHNlIHsKKwkJRXBsRXZlbnRrSW5zdGFuY2VfZy5tX3BTaGJVc2VyVG9LZXJuZWxJbnN0YW5jZSA9IE5VTEw7CisJfQorCisJLy8gZnJlZSBidWZmZXIgIEtlcm5lbCAtPiBVc2VyCisJU2hiRXJyb3IgPQorCSAgICBTaGJDaXJSZWxlYXNlQnVmZmVyKEVwbEV2ZW50a0luc3RhbmNlX2cubV9wU2hiS2VybmVsVG9Vc2VySW5zdGFuY2UpOworCWlmIChTaGJFcnJvciAhPSBrU2hiT2spIHsKKwkJRVBMX0RCR0xWTF9FVkVOVEtfVFJBQ0UxCisJCSAgICAoIkVwbEV2ZW50a0RlbEluc3RhbmNlKCk6IFNoYkNpclJlbGVhc2VCdWZmZXIoSzJVKSAtPiAweCVYXG4iLAorCQkgICAgIFNoYkVycm9yKTsKKwkJUmV0ID0ga0VwbE5vUmVzb3VyY2U7CisJfSBlbHNlIHsKKwkJRXBsRXZlbnRrSW5zdGFuY2VfZy5tX3BTaGJLZXJuZWxUb1VzZXJJbnN0YW5jZSA9IE5VTEw7CisJfQorI2VuZGlmCisKKwlyZXR1cm4gUmV0OworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbEV2ZW50a1Byb2Nlc3MKKy8vCisvLyBEZXNjcmlwdGlvbjogS2VybmVsdGhyZWFkIHRoYXQgZGlzcGF0Y2hlcyBldmVudHMgaW4ga2VybmVsIHBhcnQKKy8vCisvLyBQYXJhbWV0ZXJzOiAgcEV2ZW50X3AgICAgPSBwb2ludGVyIHRvIGV2ZW50LXN0cnVjdHVyZSBmcm9tIGJ1ZmZlcgorLy8KKy8vIFJldHVybnM6ICAgICB0RXBLZXJuZWwgICA9IGVycm9yY29kZQorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbEV2ZW50a1Byb2Nlc3ModEVwbEV2ZW50ICogcEV2ZW50X3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisJdEVwbEV2ZW50U291cmNlIEV2ZW50U291cmNlOworCisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwkvLyBlcnJvciBoYW5kbGluZyBpZiBldmVudCBxdWV1ZSBpcyBmdWxsCisJaWYgKEVwbEV2ZW50a0luc3RhbmNlX2cubV91aVVzZXJUb0tlcm5lbEZ1bGxDb3VudCA+IDApIHsJLy8gVXNlclRvS2VybmVsIGV2ZW50IHF1ZXVlIGhhcyBydW4gb3V0IG9mIHNwYWNlIC0+IGtFcGxObXRFdmVudEludGVybkNvbUVycm9yCisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVEspKSAhPSAwKQorCQl0RXBsRXZlbnQgRXZlbnQ7CisJCXRFcGxObXRFdmVudCBObXRFdmVudDsKKyNlbmRpZgorI2lmbmRlZiBFUExfTk9fRklGTworCQl0U2hiRXJyb3IgU2hiRXJyb3I7CisjZW5kaWYKKworCQkvLyBkaXJlY3RseSBjYWxsIE5NVGsgcHJvY2VzcyBmdW5jdGlvbiwgYmVjYXVzZSBldmVudCBxdWV1ZSBpcyBmdWxsCisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVEspKSAhPSAwKQorCQlObXRFdmVudCA9IGtFcGxObXRFdmVudEludGVybkNvbUVycm9yOworCQlFdmVudC5tX0V2ZW50U2luayA9IGtFcGxFdmVudFNpbmtObXRrOworCQlFdmVudC5tX05ldFRpbWUubV9kd05hbm9TZWMgPSAwOworCQlFdmVudC5tX05ldFRpbWUubV9kd1NlYyA9IDA7CisJCUV2ZW50Lm1fRXZlbnRUeXBlID0ga0VwbEV2ZW50VHlwZU5tdEV2ZW50OworCQlFdmVudC5tX3BBcmcgPSAmTm10RXZlbnQ7CisJCUV2ZW50Lm1fdWlTaXplID0gc2l6ZW9mKE5tdEV2ZW50KTsKKwkJUmV0ID0gRXBsTm10a1Byb2Nlc3MoJkV2ZW50KTsKKyNlbmRpZgorCisJCS8vIE5NVCBzdGF0ZSBtYWNoaW5lIGNoYW5nZWQgdG8gcmVzZXQgKGkuZS4gTk1UX0dTX1JFU0VUX0NPTU1VTklDQVRJT04pCisJCS8vIG5vdywgaXQgaXMgc2FmZSB0byByZXNldCB0aGUgY291bnRlciBhbmQgZW1wdHkgdGhlIGV2ZW50IHF1ZXVlCisjaWZuZGVmIEVQTF9OT19GSUZPCisJCVNoYkVycm9yID0KKwkJICAgIFNoYkNpclJlc2V0QnVmZmVyKEVwbEV2ZW50a0luc3RhbmNlX2cuCisJCQkJICAgICAgbV9wU2hiVXNlclRvS2VybmVsSW5zdGFuY2UsIDEwMDAsIE5VTEwpOworI2VuZGlmCisKKwkJRXBsRXZlbnRrSW5zdGFuY2VfZy5tX3VpVXNlclRvS2VybmVsRnVsbENvdW50ID0gMDsKKwkJVEdUX0RCR19TSUdOQUxfVFJBQ0VfUE9JTlQoMjIpOworCisJCS8vIGFsc28gZGlzY2FyZCB0aGUgY3VycmVudCBldmVudCAoaXQgZG9lc24ndCBtYXR0ZXIgaWYgd2UgbG9zZSBhbm90aGVyIGV2ZW50KQorCQlnb3RvIEV4aXQ7CisJfQorCS8vIGNoZWNrIG1fRXZlbnRTaW5rCisJc3dpdGNoIChwRXZlbnRfcC0+bV9FdmVudFNpbmspIHsKKwljYXNlIGtFcGxFdmVudFNpbmtTeW5jOgorCQl7CisJCQlpZiAoRXBsRXZlbnRrSW5zdGFuY2VfZy5tX3BmbkNiU3luYyAhPSBOVUxMKSB7CisJCQkJUmV0ID0gRXBsRXZlbnRrSW5zdGFuY2VfZy5tX3BmbkNiU3luYygpOworCQkJCWlmIChSZXQgPT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1BET0spKSAhPSAwKQorCQkJCQkvLyBtYXJrIFRQRE9zIGFzIHZhbGlkCisJCQkJCVJldCA9IEVwbFBkb2tDYWxTZXRUcGRvc1ZhbGlkKFRSVUUpOworI2VuZGlmCisJCQkJfSBlbHNlIGlmICgoUmV0ICE9IGtFcGxSZWplY3QpCisJCQkJCSAgICYmIChSZXQgIT0ga0VwbFNodXRkb3duKSkgeworCQkJCQlFdmVudFNvdXJjZSA9IGtFcGxFdmVudFNvdXJjZVN5bmNDYjsKKworCQkJCQkvLyBFcnJvciBldmVudCBmb3IgQVBJIGxheWVyCisJCQkJCUVwbEV2ZW50a1Bvc3RFcnJvcgorCQkJCQkgICAgKGtFcGxFdmVudFNvdXJjZUV2ZW50aywgUmV0LAorCQkJCQkgICAgIHNpemVvZihFdmVudFNvdXJjZSksICZFdmVudFNvdXJjZSk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCX0KKworCQkvLyBOTVQtS2VybmVsLU1vZHVsCisJY2FzZSBrRXBsRXZlbnRTaW5rTm10azoKKwkJeworI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRLKSkgIT0gMCkKKwkJCVJldCA9IEVwbE5tdGtQcm9jZXNzKHBFdmVudF9wKTsKKwkJCWlmICgoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSAmJiAoUmV0ICE9IGtFcGxTaHV0ZG93bikpIHsKKwkJCQlFdmVudFNvdXJjZSA9IGtFcGxFdmVudFNvdXJjZU5tdGs7CisKKwkJCQkvLyBFcnJvciBldmVudCBmb3IgQVBJIGxheWVyCisJCQkJRXBsRXZlbnRrUG9zdEVycm9yKGtFcGxFdmVudFNvdXJjZUV2ZW50aywKKwkJCQkJCSAgIFJldCwKKwkJCQkJCSAgIHNpemVvZihFdmVudFNvdXJjZSksCisJCQkJCQkgICAmRXZlbnRTb3VyY2UpOworCQkJfQorI2VuZGlmCisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX0RMTEspKSAhPSAwKQorCQkJaWYgKChwRXZlbnRfcC0+bV9FdmVudFR5cGUgPT0ga0VwbEV2ZW50VHlwZU5tdEV2ZW50KQorCQkJICAgICYmCisJCQkgICAgKCgqKCh0RXBsTm10RXZlbnQgKikgcEV2ZW50X3AtPm1fcEFyZykgPT0KKwkJCSAgICAgIGtFcGxObXRFdmVudERsbENlU29hKQorI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UX01OKSkgIT0gMCkKKwkJCSAgICAgfHwgKCooKHRFcGxObXRFdmVudCAqKSBwRXZlbnRfcC0+bV9wQXJnKSA9PQorCQkJCSBrRXBsTm10RXZlbnREbGxNZVNvYVNlbnQpCisjZW5kaWYKKwkJCSAgICApKSB7CS8vIGZvcndhcmQgU29BIGV2ZW50IHRvIGVycm9yIGhhbmRsZXIKKwkJCQlSZXQgPSBFcGxFcnJvckhhbmRsZXJrUHJvY2VzcyhwRXZlbnRfcCk7CisJCQkJaWYgKChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpCisJCQkJICAgICYmIChSZXQgIT0ga0VwbFNodXRkb3duKSkgeworCQkJCQlFdmVudFNvdXJjZSA9IGtFcGxFdmVudFNvdXJjZUVycms7CisKKwkJCQkJLy8gRXJyb3IgZXZlbnQgZm9yIEFQSSBsYXllcgorCQkJCQlFcGxFdmVudGtQb3N0RXJyb3IKKwkJCQkJICAgIChrRXBsRXZlbnRTb3VyY2VFdmVudGssIFJldCwKKwkJCQkJICAgICBzaXplb2YoRXZlbnRTb3VyY2UpLCAmRXZlbnRTb3VyY2UpOworCQkJCX0KKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1BET0spKSAhPSAwKQorCQkJCS8vIGZvcndhcmQgU29BIGV2ZW50IHRvIFBETyBtb2R1bGUKKwkJCQlwRXZlbnRfcC0+bV9FdmVudFR5cGUgPSBrRXBsRXZlbnRUeXBlUGRvU29hOworCQkJCVJldCA9IEVwbFBkb2tQcm9jZXNzKHBFdmVudF9wKTsKKwkJCQlpZiAoKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkKKwkJCQkgICAgJiYgKFJldCAhPSBrRXBsU2h1dGRvd24pKSB7CisJCQkJCUV2ZW50U291cmNlID0ga0VwbEV2ZW50U291cmNlUGRvazsKKworCQkJCQkvLyBFcnJvciBldmVudCBmb3IgQVBJIGxheWVyCisJCQkJCUVwbEV2ZW50a1Bvc3RFcnJvcgorCQkJCQkgICAgKGtFcGxFdmVudFNvdXJjZUV2ZW50aywgUmV0LAorCQkJCQkgICAgIHNpemVvZihFdmVudFNvdXJjZSksICZFdmVudFNvdXJjZSk7CisJCQkJfQorI2VuZGlmCisKKwkJCX0KKwkJCWJyZWFrOworI2VuZGlmCisJCX0KKworCQkvLyBldmVudHMgZm9yIERsbGsgbW9kdWxlCisJY2FzZSBrRXBsRXZlbnRTaW5rRGxsazoKKwkJeworI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9ETExLKSkgIT0gMCkKKwkJCVJldCA9IEVwbERsbGtQcm9jZXNzKHBFdmVudF9wKTsKKwkJCWlmICgoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSAmJiAoUmV0ICE9IGtFcGxTaHV0ZG93bikpIHsKKwkJCQlFdmVudFNvdXJjZSA9IGtFcGxFdmVudFNvdXJjZURsbGs7CisKKwkJCQkvLyBFcnJvciBldmVudCBmb3IgQVBJIGxheWVyCisJCQkJRXBsRXZlbnRrUG9zdEVycm9yKGtFcGxFdmVudFNvdXJjZUV2ZW50aywKKwkJCQkJCSAgIFJldCwKKwkJCQkJCSAgIHNpemVvZihFdmVudFNvdXJjZSksCisJCQkJCQkgICAmRXZlbnRTb3VyY2UpOworCQkJfQorI2VuZGlmCisJCQlicmVhazsKKwkJfQorCisJCS8vIGV2ZW50cyBmb3IgRGxsa0NhbCBtb2R1bGUKKwljYXNlIGtFcGxFdmVudFNpbmtEbGxrQ2FsOgorCQl7CisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX0RMTEspKSAhPSAwKQorCQkJUmV0ID0gRXBsRGxsa0NhbFByb2Nlc3MocEV2ZW50X3ApOworCQkJaWYgKChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpICYmIChSZXQgIT0ga0VwbFNodXRkb3duKSkgeworCQkJCUV2ZW50U291cmNlID0ga0VwbEV2ZW50U291cmNlRGxsazsKKworCQkJCS8vIEVycm9yIGV2ZW50IGZvciBBUEkgbGF5ZXIKKwkJCQlFcGxFdmVudGtQb3N0RXJyb3Ioa0VwbEV2ZW50U291cmNlRXZlbnRrLAorCQkJCQkJICAgUmV0LAorCQkJCQkJICAgc2l6ZW9mKEV2ZW50U291cmNlKSwKKwkJCQkJCSAgICZFdmVudFNvdXJjZSk7CisJCQl9CisjZW5kaWYKKwkJCWJyZWFrOworCQl9CisKKwkJLy8KKwljYXNlIGtFcGxFdmVudFNpbmtQZG9rOgorCQl7CisJCQkvLyBQRE8tTW9kdWxlCisjaWYgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9QRE9LKSkgIT0gMCkKKwkJCVJldCA9IEVwbFBkb2tQcm9jZXNzKHBFdmVudF9wKTsKKwkJCWlmICgoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSAmJiAoUmV0ICE9IGtFcGxTaHV0ZG93bikpIHsKKwkJCQlFdmVudFNvdXJjZSA9IGtFcGxFdmVudFNvdXJjZVBkb2s7CisKKwkJCQkvLyBFcnJvciBldmVudCBmb3IgQVBJIGxheWVyCisJCQkJRXBsRXZlbnRrUG9zdEVycm9yKGtFcGxFdmVudFNvdXJjZUV2ZW50aywKKwkJCQkJCSAgIFJldCwKKwkJCQkJCSAgIHNpemVvZihFdmVudFNvdXJjZSksCisJCQkJCQkgICAmRXZlbnRTb3VyY2UpOworCQkJfQorI2VuZGlmCisJCQlicmVhazsKKwkJfQorCisJCS8vIGV2ZW50cyBmb3IgRXJyb3IgaGFuZGxlciBtb2R1bGUKKwljYXNlIGtFcGxFdmVudFNpbmtFcnJrOgorCQl7CisJCQkvLyBvbmx5IGNhbGwgZXJyb3IgaGFuZGxlciBpZiBETEwgaXMgcHJlc2VudAorI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9ETExLKSkgIT0gMCkKKwkJCVJldCA9IEVwbEVycm9ySGFuZGxlcmtQcm9jZXNzKHBFdmVudF9wKTsKKwkJCWlmICgoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSAmJiAoUmV0ICE9IGtFcGxTaHV0ZG93bikpIHsKKwkJCQlFdmVudFNvdXJjZSA9IGtFcGxFdmVudFNvdXJjZUVycms7CisKKwkJCQkvLyBFcnJvciBldmVudCBmb3IgQVBJIGxheWVyCisJCQkJRXBsRXZlbnRrUG9zdEVycm9yKGtFcGxFdmVudFNvdXJjZUV2ZW50aywKKwkJCQkJCSAgIFJldCwKKwkJCQkJCSAgIHNpemVvZihFdmVudFNvdXJjZSksCisJCQkJCQkgICAmRXZlbnRTb3VyY2UpOworCQkJfQorCQkJYnJlYWs7CisjZW5kaWYKKwkJfQorCisJCS8vIHVua25vd24gc2luaworCWRlZmF1bHQ6CisJCXsKKwkJCVJldCA9IGtFcGxFdmVudFVua25vd25TaW5rOworCQl9CisKKwl9CQkJLy8gZW5kIG9mIHN3aXRjaChwRXZlbnRfcC0+bV9FdmVudFNpbmspCisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIFJldDsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxFdmVudGtQb3N0CisvLworLy8gRGVzY3JpcHRpb246IHBvc3QgZXZlbnRzIGZyb20ga2VybmVsIHBhcnQKKy8vCisvLyBQYXJhbWV0ZXJzOiAgcEV2ZW50X3AgICAgPSBwb2ludGVyIHRvIGV2ZW50LXN0cnVjdHVyZSBmcm9tIGJ1ZmZlcgorLy8KKy8vIFJldHVybnM6ICAgICB0RXBLZXJuZWwgICA9IGVycm9yY29kZQorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbEV2ZW50a1Bvc3QodEVwbEV2ZW50ICogcEV2ZW50X3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisjaWZuZGVmIEVQTF9OT19GSUZPCisJdFNoYkVycm9yIFNoYkVycm9yOworCXRTaGJDaXJDaHVuayBTaGJDaXJDaHVuazsKKwl1bnNpZ25lZCBsb25nIHVsRGF0YVNpemU7CisJdW5zaWduZWQgaW50IGZCdWZmZXJDb21wbGV0ZWQ7CisjZW5kaWYKKworCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJLy8gdGhlIGV2ZW50IG11c3QgYmUgcG9zdGVkIGJ5IHVzaW5nIHRoZSBhYkJ1ZmZlcgorCS8vIGl0IGlzIG5lZWRlIGJlY2F1c2UgdGhlIEFyZ3VtZW50IG11c3QgYnkgY29waWVkCisJLy8gdG8gdGhlIGJ1ZmZlciB0b28gYW5kIG5vdCBvbmx5IHRoZSBwb2ludGVyCisKKyNpZm5kZWYgRVBMX05PX0ZJRk8KKwkvLyAyMDA2LzA4LzAzIGQuay46IEV2ZW50IGFuZCBhcmd1bWVudCBhcmUgcG9zdGVkIGFzIHNlcGFyYXRlIGNodW5rcyB0byB0aGUgZXZlbnQgcXVldWUuCisJdWxEYXRhU2l6ZSA9CisJICAgIHNpemVvZih0RXBsRXZlbnQpICsKKwkgICAgKChwRXZlbnRfcC0+bV9wQXJnICE9IE5VTEwpID8gcEV2ZW50X3AtPm1fdWlTaXplIDogMCk7CisjZW5kaWYKKworCS8vIGRlY2lkZSBpbiB3aGljaCBidWZmZXIgdGhlIGV2ZW50IGhhdmUgdG8gd3JpdGUKKwlzd2l0Y2ggKHBFdmVudF9wLT5tX0V2ZW50U2luaykgeworCQkvLyBrZXJuZWxzcGFjZSBtb2R1bGVzCisJY2FzZSBrRXBsRXZlbnRTaW5rU3luYzoKKwljYXNlIGtFcGxFdmVudFNpbmtObXRrOgorCWNhc2Uga0VwbEV2ZW50U2lua0RsbGs6CisJY2FzZSBrRXBsRXZlbnRTaW5rRGxsa0NhbDoKKwljYXNlIGtFcGxFdmVudFNpbmtQZG9rOgorCWNhc2Uga0VwbEV2ZW50U2lua0Vycms6CisJCXsKKyNpZm5kZWYgRVBMX05PX0ZJRk8KKwkJCS8vIHBvc3QgbWVzc2FnZQorCQkJQkVOQ0hNQVJLX01PRF8yN19TRVQoMik7CisJCQlTaGJFcnJvciA9CisJCQkgICAgU2hiQ2lyQWxsb2NEYXRhQmxvY2soRXBsRXZlbnRrSW5zdGFuY2VfZy4KKwkJCQkJCSBtX3BTaGJVc2VyVG9LZXJuZWxJbnN0YW5jZSwKKwkJCQkJCSAmU2hiQ2lyQ2h1bmssIHVsRGF0YVNpemUpOworCQkJc3dpdGNoIChTaGJFcnJvcikgeworCQkJY2FzZSBrU2hiT2s6CisJCQkJYnJlYWs7CisKKwkJCWNhc2Uga1NoYkJ1ZmZlckZ1bGw6CisJCQkJeworCQkJCQlFcGxFdmVudGtJbnN0YW5jZV9nLgorCQkJCQkgICAgbV91aVVzZXJUb0tlcm5lbEZ1bGxDb3VudCsrOworCQkJCQlSZXQgPSBrRXBsRXZlbnRQb3N0RXJyb3I7CisJCQkJCWdvdG8gRXhpdDsKKwkJCQl9CisKKwkJCWRlZmF1bHQ6CisJCQkJeworCQkJCQlFUExfREJHTFZMX0VWRU5US19UUkFDRTEKKwkJCQkJICAgICgiRXBsRXZlbnRrUG9zdCgpOiBTaGJDaXJBbGxvY0RhdGFCbG9jayhVMkspIC0+IDB4JVhcbiIsCisJCQkJCSAgICAgU2hiRXJyb3IpOworCQkJCQlSZXQgPSBrRXBsRXZlbnRQb3N0RXJyb3I7CisJCQkJCWdvdG8gRXhpdDsKKwkJCQl9CisJCQl9CisJCQlTaGJFcnJvciA9CisJCQkgICAgU2hiQ2lyV3JpdGVEYXRhQ2h1bmsoRXBsRXZlbnRrSW5zdGFuY2VfZy4KKwkJCQkJCSBtX3BTaGJVc2VyVG9LZXJuZWxJbnN0YW5jZSwKKwkJCQkJCSAmU2hiQ2lyQ2h1bmssIHBFdmVudF9wLAorCQkJCQkJIHNpemVvZih0RXBsRXZlbnQpLAorCQkJCQkJICZmQnVmZmVyQ29tcGxldGVkKTsKKwkJCWlmIChTaGJFcnJvciAhPSBrU2hiT2spIHsKKwkJCQlFUExfREJHTFZMX0VWRU5US19UUkFDRTEKKwkJCQkgICAgKCJFcGxFdmVudGtQb3N0KCk6IFNoYkNpcldyaXRlRGF0YUNodW5rKFUySykgLT4gMHglWFxuIiwKKwkJCQkgICAgIFNoYkVycm9yKTsKKwkJCQlSZXQgPSBrRXBsRXZlbnRQb3N0RXJyb3I7CisJCQkJZ290byBFeGl0OworCQkJfQorCQkJaWYgKGZCdWZmZXJDb21wbGV0ZWQgPT0gRkFMU0UpIHsKKwkJCQlTaGJFcnJvciA9CisJCQkJICAgIFNoYkNpcldyaXRlRGF0YUNodW5rKEVwbEV2ZW50a0luc3RhbmNlX2cuCisJCQkJCQkJIG1fcFNoYlVzZXJUb0tlcm5lbEluc3RhbmNlLAorCQkJCQkJCSAmU2hiQ2lyQ2h1bmssCisJCQkJCQkJIHBFdmVudF9wLT5tX3BBcmcsCisJCQkJCQkJICh1bnNpZ25lZCBsb25nKQorCQkJCQkJCSBwRXZlbnRfcC0+bV91aVNpemUsCisJCQkJCQkJICZmQnVmZmVyQ29tcGxldGVkKTsKKwkJCQlpZiAoKFNoYkVycm9yICE9IGtTaGJPaykKKwkJCQkgICAgfHwgKGZCdWZmZXJDb21wbGV0ZWQgPT0gRkFMU0UpKSB7CisJCQkJCUVQTF9EQkdMVkxfRVZFTlRLX1RSQUNFMQorCQkJCQkgICAgKCJFcGxFdmVudGtQb3N0KCk6IFNoYkNpcldyaXRlRGF0YUNodW5rMihVMkspIC0+IDB4JVhcbiIsCisJCQkJCSAgICAgU2hiRXJyb3IpOworCQkJCQlSZXQgPSBrRXBsRXZlbnRQb3N0RXJyb3I7CisJCQkJCWdvdG8gRXhpdDsKKwkJCQl9CisJCQl9CisJCQlCRU5DSE1BUktfTU9EXzI3X1JFU0VUKDIpOworCisjZWxzZQorCQkJUmV0ID0gRXBsRXZlbnRrUHJvY2VzcyhwRXZlbnRfcCk7CisjZW5kaWYKKworCQkJYnJlYWs7CisJCX0KKworCQkvLyB1c2Vyc3BhY2UgbW9kdWxlcworCWNhc2Uga0VwbEV2ZW50U2lua05tdHU6CisJY2FzZSBrRXBsRXZlbnRTaW5rTm10TW51OgorCWNhc2Uga0VwbEV2ZW50U2lua1Nkb0FzeVNlcToKKwljYXNlIGtFcGxFdmVudFNpbmtBcGk6CisJY2FzZSBrRXBsRXZlbnRTaW5rRGxsdUNhbDoKKwljYXNlIGtFcGxFdmVudFNpbmtFcnJ1OgorCQl7CisjaWZuZGVmIEVQTF9OT19GSUZPCisJCQkvLyBwb3N0IG1lc3NhZ2UKKy8vICAgICAgICAgICAgQkVOQ0hNQVJLX01PRF8yN19TRVQoMyk7ICAgIC8vIDc0ILVzIHVudGlsIHJlc2V0CisJCQlTaGJFcnJvciA9CisJCQkgICAgU2hiQ2lyQWxsb2NEYXRhQmxvY2soRXBsRXZlbnRrSW5zdGFuY2VfZy4KKwkJCQkJCSBtX3BTaGJLZXJuZWxUb1VzZXJJbnN0YW5jZSwKKwkJCQkJCSAmU2hiQ2lyQ2h1bmssIHVsRGF0YVNpemUpOworCQkJaWYgKFNoYkVycm9yICE9IGtTaGJPaykgeworCQkJCUVQTF9EQkdMVkxfRVZFTlRLX1RSQUNFMQorCQkJCSAgICAoIkVwbEV2ZW50a1Bvc3QoKTogU2hiQ2lyQWxsb2NEYXRhQmxvY2soSzJVKSAtPiAweCVYXG4iLAorCQkJCSAgICAgU2hiRXJyb3IpOworCQkJCVJldCA9IGtFcGxFdmVudFBvc3RFcnJvcjsKKwkJCQlnb3RvIEV4aXQ7CisJCQl9CisJCQlTaGJFcnJvciA9CisJCQkgICAgU2hiQ2lyV3JpdGVEYXRhQ2h1bmsoRXBsRXZlbnRrSW5zdGFuY2VfZy4KKwkJCQkJCSBtX3BTaGJLZXJuZWxUb1VzZXJJbnN0YW5jZSwKKwkJCQkJCSAmU2hiQ2lyQ2h1bmssIHBFdmVudF9wLAorCQkJCQkJIHNpemVvZih0RXBsRXZlbnQpLAorCQkJCQkJICZmQnVmZmVyQ29tcGxldGVkKTsKKwkJCWlmIChTaGJFcnJvciAhPSBrU2hiT2spIHsKKwkJCQlFUExfREJHTFZMX0VWRU5US19UUkFDRTEKKwkJCQkgICAgKCJFcGxFdmVudGtQb3N0KCk6IFNoYkNpcldyaXRlRGF0YUNodW5rKEsyVSkgLT4gMHglWFxuIiwKKwkJCQkgICAgIFNoYkVycm9yKTsKKwkJCQlSZXQgPSBrRXBsRXZlbnRQb3N0RXJyb3I7CisJCQkJZ290byBFeGl0OworCQkJfQorCQkJaWYgKGZCdWZmZXJDb21wbGV0ZWQgPT0gRkFMU0UpIHsKKwkJCQlTaGJFcnJvciA9CisJCQkJICAgIFNoYkNpcldyaXRlRGF0YUNodW5rKEVwbEV2ZW50a0luc3RhbmNlX2cuCisJCQkJCQkJIG1fcFNoYktlcm5lbFRvVXNlckluc3RhbmNlLAorCQkJCQkJCSAmU2hiQ2lyQ2h1bmssCisJCQkJCQkJIHBFdmVudF9wLT5tX3BBcmcsCisJCQkJCQkJICh1bnNpZ25lZCBsb25nKQorCQkJCQkJCSBwRXZlbnRfcC0+bV91aVNpemUsCisJCQkJCQkJICZmQnVmZmVyQ29tcGxldGVkKTsKKwkJCQlpZiAoKFNoYkVycm9yICE9IGtTaGJPaykKKwkJCQkgICAgfHwgKGZCdWZmZXJDb21wbGV0ZWQgPT0gRkFMU0UpKSB7CisJCQkJCUVQTF9EQkdMVkxfRVZFTlRLX1RSQUNFMQorCQkJCQkgICAgKCJFcGxFdmVudGtQb3N0KCk6IFNoYkNpcldyaXRlRGF0YUNodW5rMihLMlUpIC0+IDB4JVhcbiIsCisJCQkJCSAgICAgU2hiRXJyb3IpOworCQkJCQlSZXQgPSBrRXBsRXZlbnRQb3N0RXJyb3I7CisJCQkJCWdvdG8gRXhpdDsKKwkJCQl9CisJCQl9CisvLyAgICAgICAgICAgIEJFTkNITUFSS19NT0RfMjdfUkVTRVQoMyk7ICAvLyA4MiC1cyB1bnRpbCBTaGJDaXJHZXRSZWFkRGF0YVNpemUoKSBpbiBFcGxFdmVudHUKKworI2Vsc2UKKwkJCVJldCA9IEVwbEV2ZW50dVByb2Nlc3MocEV2ZW50X3ApOworI2VuZGlmCisKKwkJCWJyZWFrOworCQl9CisKKwlkZWZhdWx0OgorCQl7CisJCQlSZXQgPSBrRXBsRXZlbnRVbmtub3duU2luazsKKwkJfQorCisJfQkJCS8vIGVuZCBvZiBzd2l0Y2gocEV2ZW50X3AtPm1fRXZlbnRTaW5rKQorCisjaWZuZGVmIEVQTF9OT19GSUZPCisgICAgICBFeGl0OgorI2VuZGlmCisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsRXZlbnRrUG9zdEVycm9yCisvLworLy8gRGVzY3JpcHRpb246IHBvc3QgZXJyb3IgZXZlbnQgZnJvbSBrZXJuZWwgcGFydCB0byBBUEkgbGF5ZXIKKy8vCisvLyBQYXJhbWV0ZXJzOiAgRXZlbnRTb3VyY2VfcCAgID0gc291cmNlLW1vZHVsZSBvZiB0aGUgZXJyb3IgZXZlbnQKKy8vICAgICAgICAgICAgICBFcGxFcnJvcl9wICAgICAgPSBjb2RlIG9mIG9jY3VyZWQgZXJyb3IKKy8vICAgICAgICAgICAgICBBcmdTaXplX3AgICAgICAgPSBzaXplIG9mIHRoZSBhcmd1bWVudAorLy8gICAgICAgICAgICAgIHBBcmdfcCAgICAgICAgICA9IHBvaW50ZXIgdG8gdGhlIGFyZ3VtZW50CisvLworLy8gUmV0dXJuczogICAgIHRFcEtlcm5lbCAgICAgICA9IGVycm9yY29kZQorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbEV2ZW50a1Bvc3RFcnJvcih0RXBsRXZlbnRTb3VyY2UgRXZlbnRTb3VyY2VfcCwKKwkJCQkgICAgIHRFcGxLZXJuZWwgRXBsRXJyb3JfcCwKKwkJCQkgICAgIHVuc2lnbmVkIGludCB1aUFyZ1NpemVfcCwgdm9pZCAqcEFyZ19wKQoreworCXRFcGxLZXJuZWwgUmV0OworCUJZVEUgYWJCdWZmZXJbRVBMX01BWF9FVkVOVF9BUkdfU0laRV07CisJdEVwbEV2ZW50RXJyb3IgKnBFdmVudEVycm9yID0gKHRFcGxFdmVudEVycm9yICopIGFiQnVmZmVyOworCXRFcGxFdmVudCBFcGxFdmVudDsKKworCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJLy8gY3JlYXRlIGFyZ3VtZW50CisJcEV2ZW50RXJyb3ItPm1fRXZlbnRTb3VyY2UgPSBFdmVudFNvdXJjZV9wOworCXBFdmVudEVycm9yLT5tX0VwbEVycm9yID0gRXBsRXJyb3JfcDsKKwlFUExfTUVNQ1BZKCZwRXZlbnRFcnJvci0+bV9BcmcsIHBBcmdfcCwgdWlBcmdTaXplX3ApOworCisJLy8gY3JlYXRlIGV2ZW50CisJRXBsRXZlbnQubV9FdmVudFR5cGUgPSBrRXBsRXZlbnRUeXBlRXJyb3I7CisJRXBsRXZlbnQubV9FdmVudFNpbmsgPSBrRXBsRXZlbnRTaW5rQXBpOworCUVQTF9NRU1TRVQoJkVwbEV2ZW50Lm1fTmV0VGltZSwgMHgwMCwgc2l6ZW9mKEVwbEV2ZW50Lm1fTmV0VGltZSkpOworCUVwbEV2ZW50Lm1fdWlTaXplID0KKwkgICAgKHNpemVvZihFdmVudFNvdXJjZV9wKSArIHNpemVvZihFcGxFcnJvcl9wKSArIHVpQXJnU2l6ZV9wKTsKKwlFcGxFdmVudC5tX3BBcmcgPSAmYWJCdWZmZXJbMF07CisKKwkvLyBwb3N0IGVycm9yZXZlbnQKKwlSZXQgPSBFcGxFdmVudGtQb3N0KCZFcGxFdmVudCk7CisKKwlyZXR1cm4gUmV0OworfQorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgIFAgUiBJIFYgQSBUIEUgICBGIFUgTiBDIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsRXZlbnRrUnhTaWduYWxIYW5kbGVyQ2IoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBDYWxsYmFjay1mdW5jdGlvbiBmb3IgZXZlbnRzIGZyb20gdXNlciBhbmQga2VybmVsIHBhcnQKKy8vCisvLyBQYXJhbWV0ZXJzOiAgcFNoYlJ4SW5zdGFuY2VfcCAgICA9IEluc3RhbmNlLXBvaW50ZXIgb2YgYnVmZmVyCisvLyAgICAgICAgICAgICAgdWxEYXRhU2l6ZV9wICAgICAgICA9IHNpemUgb2YgZGF0YQorLy8KKy8vIFJldHVybnM6IHZvaWQKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWZuZGVmIEVQTF9OT19GSUZPCitzdGF0aWMgdm9pZCBFcGxFdmVudGtSeFNpZ25hbEhhbmRsZXJDYih0U2hiSW5zdGFuY2UgcFNoYlJ4SW5zdGFuY2VfcCwKKwkJCQkgICAgICAgdW5zaWduZWQgbG9uZyB1bERhdGFTaXplX3ApCit7CisJdEVwbEV2ZW50ICpwRXBsRXZlbnQ7CisJdFNoYkVycm9yIFNoYkVycm9yOworLy91bnNpZ25lZCBsb25nICAgdWxCbG9ja0NvdW50OworLy91bnNpZ25lZCBsb25nICAgdWxEYXRhU2l6ZTsKKwlCWVRFIGFiRGF0YUJ1ZmZlcltzaXplb2YodEVwbEV2ZW50KSArIEVQTF9NQVhfRVZFTlRfQVJHX1NJWkVdOworCS8vIGQuay46IGFiRGF0YUJ1ZmZlciBjb250YWlucyB0aGUgY29tcGxldGUgdEVwbEV2ZW50IHN0cnVjdHVyZQorCS8vICAgICAgIGFuZCBiZWhpbmQgdGhpcyB0aGUgYXJndW1lbnQKKworCVRHVF9EQkdfU0lHTkFMX1RSQUNFX1BPSU5UKDIwKTsKKworCUJFTkNITUFSS19NT0RfMjdfUkVTRVQoMCk7CisJLy8gY29weSBkYXRhIGZyb20gZXZlbnQgcXVldWUKKwlTaGJFcnJvciA9IFNoYkNpclJlYWREYXRhQmxvY2socFNoYlJ4SW5zdGFuY2VfcCwKKwkJCQkgICAgICAgJmFiRGF0YUJ1ZmZlclswXSwKKwkJCQkgICAgICAgc2l6ZW9mKGFiRGF0YUJ1ZmZlciksICZ1bERhdGFTaXplX3ApOworCWlmIChTaGJFcnJvciAhPSBrU2hiT2spIHsKKwkJLy8gZXJyb3IgZ290byBleGl0CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gcmVzb2x2ZSB0aGUgcG9pbnRlciB0byB0aGUgZXZlbnQgc3RydWN0dXJlCisJcEVwbEV2ZW50ID0gKHRFcGxFdmVudCAqKSBhYkRhdGFCdWZmZXI7CisJLy8gc2V0IERhdGFzaXplCisJcEVwbEV2ZW50LT5tX3VpU2l6ZSA9ICh1bERhdGFTaXplX3AgLSBzaXplb2YodEVwbEV2ZW50KSk7CisJaWYgKHBFcGxFdmVudC0+bV91aVNpemUgPiAwKSB7CisJCS8vIHNldCBwb2ludGVyIHRvIGFyZ3VtZW50CisJCXBFcGxFdmVudC0+bV9wQXJnID0gJmFiRGF0YUJ1ZmZlcltzaXplb2YodEVwbEV2ZW50KV07CisJfSBlbHNlIHsKKwkJLy9zZXQgcG9pbnRlciB0byBOVUxMCisJCXBFcGxFdmVudC0+bV9wQXJnID0gTlVMTDsKKwl9CisKKwlCRU5DSE1BUktfTU9EXzI3X1NFVCgwKTsKKwkvLyBjYWxsIHByb2Nlc3NmdW5jdGlvbgorCUVwbEV2ZW50a1Byb2Nlc3MocEVwbEV2ZW50KTsKKworICAgICAgRXhpdDoKKwlyZXR1cm47Cit9CisjZW5kaWYKKworLy8gRU9GCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbEV2ZW50dS5jIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxFdmVudHUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTVmOWE4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxFdmVudHUuYwpAQCAtMCwwICsxLDgxNCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIHNvdXJjZSBmaWxlIGZvciBFcGwtVXNlcnNwYWNlLUV2ZW50LU1vZHVsCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRXBsRXZlbnR1LmMsdiAkCisKKyAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAorCisgICAgICAgICAgICAgICAgJFJldmlzaW9uOiAxLjggJCAgJERhdGU6IDIwMDgvMTEvMTcgMTY6NDA6MzkgJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgICAgIEdDQyBWMy40CisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwNi8wNi8yMCBrLnQuOiAgIHN0YXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAidXNlci9FcGxFdmVudHUuaCIKKyNpbmNsdWRlICJ1c2VyL0VwbE5tdHUuaCIKKyNpbmNsdWRlICJ1c2VyL0VwbE5tdE1udS5oIgorI2luY2x1ZGUgInVzZXIvRXBsU2RvQXN5U2VxdS5oIgorI2luY2x1ZGUgInVzZXIvRXBsRGxsdUNhbC5oIgorI2luY2x1ZGUgInVzZXIvRXBsTGVkdS5oIgorI2luY2x1ZGUgIkJlbmNobWFyay5oIgorCisjaWZkZWYgRVBMX05PX0ZJRk8KKyNpbmNsdWRlICJrZXJuZWwvRXBsRXZlbnRrLmgiCisjZWxzZQorI2luY2x1ZGUgIlNoYXJlZEJ1ZmYuaCIKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICBHIEwgTyBCIEEgTCAgIEQgRSBGIEkgTiBJIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gVHJhY2VQb2ludCBzdXBwb3J0IGZvciByZWFsdGltZS1kZWJ1Z2dpbmcKKyNpZmRlZiBfREJHX1RSQUNFX1BPSU5UU18KK3ZvaWQgUFVCTElDIFRndERiZ1NpZ25hbFRyYWNlUG9pbnQoQllURSBiVHJhY2VQb2ludE51bWJlcl9wKTsKK3ZvaWQgUFVCTElDIFRndERiZ1Bvc3RUcmFjZVZhbHVlKERXT1JEIGR3VHJhY2VWYWx1ZV9wKTsKKyNkZWZpbmUgVEdUX0RCR19TSUdOQUxfVFJBQ0VfUE9JTlQocCkgICBUZ3REYmdTaWduYWxUcmFjZVBvaW50KHApCisjZGVmaW5lIFRHVF9EQkdfUE9TVF9UUkFDRV9WQUxVRSh2KSAgICAgVGd0RGJnUG9zdFRyYWNlVmFsdWUodikKKyNlbHNlCisjZGVmaW5lIFRHVF9EQkdfU0lHTkFMX1RSQUNFX1BPSU5UKHApCisjZGVmaW5lIFRHVF9EQkdfUE9TVF9UUkFDRV9WQUxVRSh2KQorI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCB0eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordHlwZWRlZiBzdHJ1Y3QgeworI2lmbmRlZiBFUExfTk9fRklGTworCXRTaGJJbnN0YW5jZSBtX3BTaGJLZXJuZWxUb1VzZXJJbnN0YW5jZTsKKwl0U2hiSW5zdGFuY2UgbV9wU2hiVXNlclRvS2VybmVsSW5zdGFuY2U7CisjZW5kaWYKKwl0RXBsUHJvY2Vzc0V2ZW50Q2IgbV9wZm5BcGlQcm9jZXNzRXZlbnRDYjsKKworfSB0RXBsRXZlbnR1SW5zdGFuY2U7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBtb2R1bCBnbG9iYWxlIHZhcnMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vI2lmbmRlZiBFUExfTk9fRklGTworc3RhdGljIHRFcGxFdmVudHVJbnN0YW5jZSBFcGxFdmVudHVJbnN0YW5jZV9nOworLy8jZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZm5kZWYgRVBMX05PX0ZJRk8KKy8vIGNhbGxiYWNrIGZ1bmN0aW9uIGZvciBpbmNvbW1pbmcgZXZlbnRzCitzdGF0aWMgdm9pZCBFcGxFdmVudHVSeFNpZ25hbEhhbmRsZXJDYih0U2hiSW5zdGFuY2UgcFNoYlJ4SW5zdGFuY2VfcCwKKwkJCQkgICAgICAgdW5zaWduZWQgbG9uZyB1bERhdGFTaXplX3ApOworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIEMgTCBBIFMgUyAgPEVwbC1Vc2VyLUV2ZW50PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvLworLy8gRGVzY3JpcHRpb246CisvLworLy8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgUCBVIEIgTCBJIEMgICBGIFUgTiBDIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxFdmVudHVJbml0CisvLworLy8gRGVzY3JpcHRpb246IGZ1bmN0aW9uIGluaXRpYWxpemUgdGhlIGZpcnN0IGluc3RhbmNlCisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOiAgcGZuQXBpUHJvY2Vzc0V2ZW50Q2JfcCAgPSBmdW5jdGlvbiBwb2ludGVyIGZvciBBUEkgZXZlbnQgY2FsbGJhY2sKKy8vCisvLworLy8gUmV0dXJuczogICAgICB0RXBLZXJuZWwgID0gZXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0RXBsS2VybmVsIFBVQkxJQyBFcGxFdmVudHVJbml0KHRFcGxQcm9jZXNzRXZlbnRDYiBwZm5BcGlQcm9jZXNzRXZlbnRDYl9wKQoreworCXRFcGxLZXJuZWwgUmV0OworCisJUmV0ID0gRXBsRXZlbnR1QWRkSW5zdGFuY2UocGZuQXBpUHJvY2Vzc0V2ZW50Q2JfcCk7CisKKwlyZXR1cm4gUmV0OworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbEV2ZW50dUFkZEluc3RhbmNlCisvLworLy8gRGVzY3JpcHRpb246IGZ1bmN0aW9uIGFkZCBvbmUgbW9yZSBpbnN0YW5jZQorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczogIHBmbkFwaVByb2Nlc3NFdmVudENiX3AgID0gZnVuY3Rpb24gcG9pbnRlciBmb3IgQVBJIGV2ZW50IGNhbGxiYWNrCisvLworLy8KKy8vIFJldHVybnM6ICAgICAgdEVwS2VybmVsICA9IGVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordEVwbEtlcm5lbCBQVUJMSUMgRXBsRXZlbnR1QWRkSW5zdGFuY2UodEVwbFByb2Nlc3NFdmVudENiCisJCQkJICAgICAgIHBmbkFwaVByb2Nlc3NFdmVudENiX3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisjaWZuZGVmIEVQTF9OT19GSUZPCisJdFNoYkVycm9yIFNoYkVycm9yOworCXVuc2lnbmVkIGludCBmU2hiTmV3Q3JlYXRlZDsKKyNlbmRpZgorCisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwkvLyBpbml0IGluc3RhbmNlIHZhcmlhYmxlcworCUVwbEV2ZW50dUluc3RhbmNlX2cubV9wZm5BcGlQcm9jZXNzRXZlbnRDYiA9IHBmbkFwaVByb2Nlc3NFdmVudENiX3A7CisKKyNpZm5kZWYgRVBMX05PX0ZJRk8KKwkvLyBpbml0IHNoYXJlZCBsb29wIGJ1ZmZlcgorCS8vIGtlcm5lbCAtPiB1c2VyCisJU2hiRXJyb3IgPSBTaGJDaXJBbGxvY0J1ZmZlcihFUExfRVZFTlRfU0laRV9TSEJfS0VSTkVMX1RPX1VTRVIsCisJCQkJICAgICBFUExfRVZFTlRfTkFNRV9TSEJfS0VSTkVMX1RPX1VTRVIsCisJCQkJICAgICAmRXBsRXZlbnR1SW5zdGFuY2VfZy4KKwkJCQkgICAgIG1fcFNoYktlcm5lbFRvVXNlckluc3RhbmNlLAorCQkJCSAgICAgJmZTaGJOZXdDcmVhdGVkKTsKKwlpZiAoU2hiRXJyb3IgIT0ga1NoYk9rKSB7CisJCUVQTF9EQkdMVkxfRVZFTlRLX1RSQUNFMQorCQkgICAgKCJFcGxFdmVudHVBZGRJbnN0YW5jZSgpOiBTaGJDaXJBbGxvY0J1ZmZlcihLMlUpIC0+IDB4JVhcbiIsCisJCSAgICAgU2hiRXJyb3IpOworCQlSZXQgPSBrRXBsTm9SZXNvdXJjZTsKKwkJZ290byBFeGl0OworCX0KKworCS8vIHVzZXIgLT4ga2VybmVsCisJU2hiRXJyb3IgPSBTaGJDaXJBbGxvY0J1ZmZlcihFUExfRVZFTlRfU0laRV9TSEJfVVNFUl9UT19LRVJORUwsCisJCQkJICAgICBFUExfRVZFTlRfTkFNRV9TSEJfVVNFUl9UT19LRVJORUwsCisJCQkJICAgICAmRXBsRXZlbnR1SW5zdGFuY2VfZy4KKwkJCQkgICAgIG1fcFNoYlVzZXJUb0tlcm5lbEluc3RhbmNlLAorCQkJCSAgICAgJmZTaGJOZXdDcmVhdGVkKTsKKwlpZiAoU2hiRXJyb3IgIT0ga1NoYk9rKSB7CisJCUVQTF9EQkdMVkxfRVZFTlRLX1RSQUNFMQorCQkgICAgKCJFcGxFdmVudHVBZGRJbnN0YW5jZSgpOiBTaGJDaXJBbGxvY0J1ZmZlcihVMkspIC0+IDB4JVhcbiIsCisJCSAgICAgU2hiRXJyb3IpOworCQlSZXQgPSBrRXBsTm9SZXNvdXJjZTsKKwkJZ290byBFeGl0OworCX0KKwkvLyByZWdpc3RlciBldmVudGhhbmRsZXIKKwlTaGJFcnJvciA9CisJICAgIFNoYkNpclNldFNpZ25hbEhhbmRsZXJOZXdEYXRhKEVwbEV2ZW50dUluc3RhbmNlX2cuCisJCQkJCSAgbV9wU2hiS2VybmVsVG9Vc2VySW5zdGFuY2UsCisJCQkJCSAgRXBsRXZlbnR1UnhTaWduYWxIYW5kbGVyQ2IsCisJCQkJCSAga1NoYlByaW9yaXR5Tm9ybWFsKTsKKwlpZiAoU2hiRXJyb3IgIT0ga1NoYk9rKSB7CisJCUVQTF9EQkdMVkxfRVZFTlRLX1RSQUNFMQorCQkgICAgKCJFcGxFdmVudHVBZGRJbnN0YW5jZSgpOiBTaGJDaXJTZXRTaWduYWxIYW5kbGVyTmV3RGF0YShLMlUpIC0+IDB4JVhcbiIsCisJCSAgICAgU2hiRXJyb3IpOworCQlSZXQgPSBrRXBsTm9SZXNvdXJjZTsKKwkJZ290byBFeGl0OworCX0KKworICAgICAgRXhpdDoKKyNlbmRpZgorCisJcmV0dXJuIFJldDsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxFdmVudHVEZWxJbnN0YW5jZQorLy8KKy8vIERlc2NyaXB0aW9uOiBmdW5jdGlvbiBkZWxldGUgaW5zdGFuY2UgYW4gZnJlZSB0aGUgYnVmZmVyc3RydWN0dXJlCisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOgorLy8KKy8vCisvLyBSZXR1cm5zOiAgICAgIHRFcEtlcm5lbCAgPSBlcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3RFcGxLZXJuZWwgUFVCTElDIEVwbEV2ZW50dURlbEluc3RhbmNlKCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKyNpZm5kZWYgRVBMX05PX0ZJRk8KKwl0U2hiRXJyb3IgU2hiRXJyb3I7CisjZW5kaWYKKworCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCisjaWZuZGVmIEVQTF9OT19GSUZPCisJLy8gc2V0IGV2ZW50aGFuZGxlciB0byBOVUxMCisJU2hiRXJyb3IgPQorCSAgICBTaGJDaXJTZXRTaWduYWxIYW5kbGVyTmV3RGF0YShFcGxFdmVudHVJbnN0YW5jZV9nLgorCQkJCQkgIG1fcFNoYktlcm5lbFRvVXNlckluc3RhbmNlLCBOVUxMLAorCQkJCQkgIGtTaGJQcmlvcml0eU5vcm1hbCk7CisJaWYgKFNoYkVycm9yICE9IGtTaGJPaykgeworCQlFUExfREJHTFZMX0VWRU5US19UUkFDRTEKKwkJICAgICgiRXBsRXZlbnR1RGVsSW5zdGFuY2UoKTogU2hiQ2lyU2V0U2lnbmFsSGFuZGxlck5ld0RhdGEoSzJVKSAtPiAweCVYXG4iLAorCQkgICAgIFNoYkVycm9yKTsKKwkJUmV0ID0ga0VwbE5vUmVzb3VyY2U7CisJfQorCS8vIGZyZWUgYnVmZmVyIFVzZXIgLT4gS2VybmVsCisJU2hiRXJyb3IgPQorCSAgICBTaGJDaXJSZWxlYXNlQnVmZmVyKEVwbEV2ZW50dUluc3RhbmNlX2cubV9wU2hiVXNlclRvS2VybmVsSW5zdGFuY2UpOworCWlmICgoU2hiRXJyb3IgIT0ga1NoYk9rKSAmJiAoU2hiRXJyb3IgIT0ga1NoYk1lbVVzZWRCeU90aGVyUHJvY3MpKSB7CisJCUVQTF9EQkdMVkxfRVZFTlRLX1RSQUNFMQorCQkgICAgKCJFcGxFdmVudHVEZWxJbnN0YW5jZSgpOiBTaGJDaXJSZWxlYXNlQnVmZmVyKFUySykgLT4gMHglWFxuIiwKKwkJICAgICBTaGJFcnJvcik7CisJCVJldCA9IGtFcGxOb1Jlc291cmNlOworCX0gZWxzZSB7CisJCUVwbEV2ZW50dUluc3RhbmNlX2cubV9wU2hiVXNlclRvS2VybmVsSW5zdGFuY2UgPSBOVUxMOworCX0KKworCS8vIGZyZWUgYnVmZmVyICBLZXJuZWwgLT4gVXNlcgorCVNoYkVycm9yID0KKwkgICAgU2hiQ2lyUmVsZWFzZUJ1ZmZlcihFcGxFdmVudHVJbnN0YW5jZV9nLm1fcFNoYktlcm5lbFRvVXNlckluc3RhbmNlKTsKKwlpZiAoKFNoYkVycm9yICE9IGtTaGJPaykgJiYgKFNoYkVycm9yICE9IGtTaGJNZW1Vc2VkQnlPdGhlclByb2NzKSkgeworCQlFUExfREJHTFZMX0VWRU5US19UUkFDRTEKKwkJICAgICgiRXBsRXZlbnR1RGVsSW5zdGFuY2UoKTogU2hiQ2lyUmVsZWFzZUJ1ZmZlcihLMlUpIC0+IDB4JVhcbiIsCisJCSAgICAgU2hiRXJyb3IpOworCQlSZXQgPSBrRXBsTm9SZXNvdXJjZTsKKwl9IGVsc2UgeworCQlFcGxFdmVudHVJbnN0YW5jZV9nLm1fcFNoYktlcm5lbFRvVXNlckluc3RhbmNlID0gTlVMTDsKKwl9CisKKyNlbmRpZgorCisJcmV0dXJuIFJldDsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxFdmVudHVQcm9jZXNzCisvLworLy8gRGVzY3JpcHRpb246IEtlcm5lbHRocmVhZCB0aGF0IGRpc3BhdGNoZXMgZXZlbnRzIGluIGtlcm5lbHNwYWNlCisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOiAgcEV2ZW50X3AgPSBwb2ludGVyIHRvIGV2ZW50LXN0cnVjdHVyIGZyb20gYnVmZmVyCisvLworLy8KKy8vIFJldHVybnM6ICAgICAgdEVwS2VybmVsICA9IGVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordEVwbEtlcm5lbCBQVUJMSUMgRXBsRXZlbnR1UHJvY2Vzcyh0RXBsRXZlbnQgKiBwRXZlbnRfcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKwl0RXBsRXZlbnRTb3VyY2UgRXZlbnRTb3VyY2U7CisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCS8vIGNoZWNrIG1fRXZlbnRTaW5rCisJc3dpdGNoIChwRXZlbnRfcC0+bV9FdmVudFNpbmspIHsKKwkJLy8gTk1ULVVzZXItTW9kdWxlCisJY2FzZSBrRXBsRXZlbnRTaW5rTm10dToKKwkJeworI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UVSkpICE9IDApCisJCQlSZXQgPSBFcGxObXR1UHJvY2Vzc0V2ZW50KHBFdmVudF9wKTsKKwkJCWlmICgoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSAmJiAoUmV0ICE9IGtFcGxTaHV0ZG93bikpIHsKKwkJCQlFdmVudFNvdXJjZSA9IGtFcGxFdmVudFNvdXJjZU5tdHU7CisKKwkJCQkvLyBFcnJvciBldmVudCBmb3IgQVBJIGxheWVyCisJCQkJRXBsRXZlbnR1UG9zdEVycm9yKGtFcGxFdmVudFNvdXJjZUV2ZW50dSwKKwkJCQkJCSAgIFJldCwKKwkJCQkJCSAgIHNpemVvZihFdmVudFNvdXJjZSksCisJCQkJCQkgICAmRXZlbnRTb3VyY2UpOworCQkJfQorI2VuZGlmCisJCQlicmVhazsKKwkJfQorCisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVF9NTikpICE9IDApCisJCS8vIE5NVC1NTi1Vc2VyLU1vZHVsZQorCWNhc2Uga0VwbEV2ZW50U2lua05tdE1udToKKwkJeworCQkJUmV0ID0gRXBsTm10TW51UHJvY2Vzc0V2ZW50KHBFdmVudF9wKTsKKwkJCWlmICgoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSAmJiAoUmV0ICE9IGtFcGxTaHV0ZG93bikpIHsKKwkJCQlFdmVudFNvdXJjZSA9IGtFcGxFdmVudFNvdXJjZU5tdE1udTsKKworCQkJCS8vIEVycm9yIGV2ZW50IGZvciBBUEkgbGF5ZXIKKwkJCQlFcGxFdmVudHVQb3N0RXJyb3Ioa0VwbEV2ZW50U291cmNlRXZlbnR1LAorCQkJCQkJICAgUmV0LAorCQkJCQkJICAgc2l6ZW9mKEV2ZW50U291cmNlKSwKKwkJCQkJCSAgICZFdmVudFNvdXJjZSk7CisJCQl9CisJCQlicmVhazsKKwkJfQorI2VuZGlmCisKKyNpZiAoKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9TRE9DKSkgIT0gMCkgICBcCisgICAgIHx8ICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfU0RPUykpICE9IDApKQorCQkvLyBldmVudHMgZm9yIGFzeW5jaHJvbnVzIFNETyBTZXF1ZW5jZSBMYXllcgorCWNhc2Uga0VwbEV2ZW50U2lua1Nkb0FzeVNlcToKKwkJeworCQkJUmV0ID0gRXBsU2RvQXN5U2VxUHJvY2Vzc0V2ZW50KHBFdmVudF9wKTsKKwkJCWlmICgoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSAmJiAoUmV0ICE9IGtFcGxTaHV0ZG93bikpIHsKKwkJCQlFdmVudFNvdXJjZSA9IGtFcGxFdmVudFNvdXJjZVNkb0FzeVNlcTsKKworCQkJCS8vIEVycm9yIGV2ZW50IGZvciBBUEkgbGF5ZXIKKwkJCQlFcGxFdmVudHVQb3N0RXJyb3Ioa0VwbEV2ZW50U291cmNlRXZlbnR1LAorCQkJCQkJICAgUmV0LAorCQkJCQkJICAgc2l6ZW9mKEV2ZW50U291cmNlKSwKKwkJCQkJCSAgICZFdmVudFNvdXJjZSk7CisJCQl9CisJCQlicmVhazsKKwkJfQorI2VuZGlmCisKKwkJLy8gTEVEIHVzZXIgcGFydCBtb2R1bGUKKwljYXNlIGtFcGxFdmVudFNpbmtMZWR1OgorCQl7CisjaWYgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9MRURVKSkgIT0gMCkKKwkJCVJldCA9IEVwbExlZHVQcm9jZXNzRXZlbnQocEV2ZW50X3ApOworCQkJaWYgKChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpICYmIChSZXQgIT0ga0VwbFNodXRkb3duKSkgeworCQkJCUV2ZW50U291cmNlID0ga0VwbEV2ZW50U291cmNlTGVkdTsKKworCQkJCS8vIEVycm9yIGV2ZW50IGZvciBBUEkgbGF5ZXIKKwkJCQlFcGxFdmVudHVQb3N0RXJyb3Ioa0VwbEV2ZW50U291cmNlRXZlbnR1LAorCQkJCQkJICAgUmV0LAorCQkJCQkJICAgc2l6ZW9mKEV2ZW50U291cmNlKSwKKwkJCQkJCSAgICZFdmVudFNvdXJjZSk7CisJCQl9CisjZW5kaWYKKwkJCWJyZWFrOworCQl9CisKKwkJLy8gZXZlbnQgZm9yIEVQTCBhcGkKKwljYXNlIGtFcGxFdmVudFNpbmtBcGk6CisJCXsKKwkJCWlmIChFcGxFdmVudHVJbnN0YW5jZV9nLm1fcGZuQXBpUHJvY2Vzc0V2ZW50Q2IgIT0gTlVMTCkgeworCQkJCVJldCA9CisJCQkJICAgIEVwbEV2ZW50dUluc3RhbmNlX2cuCisJCQkJICAgIG1fcGZuQXBpUHJvY2Vzc0V2ZW50Q2IocEV2ZW50X3ApOworCQkJCWlmICgoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKQorCQkJCSAgICAmJiAoUmV0ICE9IGtFcGxTaHV0ZG93bikpIHsKKwkJCQkJRXZlbnRTb3VyY2UgPSBrRXBsRXZlbnRTb3VyY2VFcGxBcGk7CisKKwkJCQkJLy8gRXJyb3IgZXZlbnQgZm9yIEFQSSBsYXllcgorCQkJCQlFcGxFdmVudHVQb3N0RXJyb3IKKwkJCQkJICAgIChrRXBsRXZlbnRTb3VyY2VFdmVudHUsIFJldCwKKwkJCQkJICAgICBzaXplb2YoRXZlbnRTb3VyY2UpLCAmRXZlbnRTb3VyY2UpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCX0KKworCWNhc2Uga0VwbEV2ZW50U2lua0RsbHVDYWw6CisJCXsKKwkJCVJldCA9IEVwbERsbHVDYWxQcm9jZXNzKHBFdmVudF9wKTsKKwkJCWlmICgoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSAmJiAoUmV0ICE9IGtFcGxTaHV0ZG93bikpIHsKKwkJCQlFdmVudFNvdXJjZSA9IGtFcGxFdmVudFNvdXJjZURsbHU7CisKKwkJCQkvLyBFcnJvciBldmVudCBmb3IgQVBJIGxheWVyCisJCQkJRXBsRXZlbnR1UG9zdEVycm9yKGtFcGxFdmVudFNvdXJjZUV2ZW50dSwKKwkJCQkJCSAgIFJldCwKKwkJCQkJCSAgIHNpemVvZihFdmVudFNvdXJjZSksCisJCQkJCQkgICAmRXZlbnRTb3VyY2UpOworCQkJfQorCQkJYnJlYWs7CisKKwkJfQorCisJY2FzZSBrRXBsRXZlbnRTaW5rRXJydToKKwkJeworCQkJLyoKKwkJCSAgIFJldCA9IEVwbEVycnVQcm9jZXNzKHBFdmVudF9wKTsKKwkJCSAgIGlmICgoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSAmJiAoUmV0ICE9IGtFcGxTaHV0ZG93bikpCisJCQkgICB7CisJCQkgICBFdmVudFNvdXJjZSA9IGtFcGxFdmVudFNvdXJjZUVycnU7CisKKwkJCSAgIC8vIEVycm9yIGV2ZW50IGZvciBBUEkgbGF5ZXIKKwkJCSAgIEVwbEV2ZW50dVBvc3RFcnJvcihrRXBsRXZlbnRTb3VyY2VFdmVudHUsCisJCQkgICBSZXQsCisJCQkgICBzaXplb2YoRXZlbnRTb3VyY2UpLAorCQkJICAgJkV2ZW50U291cmNlKTsKKwkJCSAgIH0KKwkJCSAqLworCQkJYnJlYWs7CisKKwkJfQorCisJCS8vIHVua25vd24gc2luaworCWRlZmF1bHQ6CisJCXsKKwkJCVJldCA9IGtFcGxFdmVudFVua25vd25TaW5rOworCQl9CisKKwl9CQkJLy8gZW5kIG9mIHN3aXRjaChwRXZlbnRfcC0+bV9FdmVudFNpbmspCisKKwlyZXR1cm4gUmV0OworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbEV2ZW50dVBvc3QKKy8vCisvLyBEZXNjcmlwdGlvbjogcG9zdCBldmVudHMgZnJvbSB1c2Vyc3BhY2UKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6ICBwRXZlbnRfcCA9IHBvaW50ZXIgdG8gZXZlbnQtc3RydWN0dXIgZnJvbSBidWZmZXIKKy8vCisvLworLy8gUmV0dXJuczogICAgICB0RXBLZXJuZWwgID0gZXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0RXBsS2VybmVsIFBVQkxJQyBFcGxFdmVudHVQb3N0KHRFcGxFdmVudCAqIHBFdmVudF9wKQoreworCXRFcGxLZXJuZWwgUmV0OworI2lmbmRlZiBFUExfTk9fRklGTworCXRTaGJFcnJvciBTaGJFcnJvcjsKKwl0U2hiQ2lyQ2h1bmsgU2hiQ2lyQ2h1bms7CisJdW5zaWduZWQgbG9uZyB1bERhdGFTaXplOworCXVuc2lnbmVkIGludCBmQnVmZmVyQ29tcGxldGVkOworI2VuZGlmCisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworI2lmbmRlZiBFUExfTk9fRklGTworCS8vIDIwMDYvMDgvMDMgZC5rLjogRXZlbnQgYW5kIGFyZ3VtZW50IGFyZSBwb3N0ZWQgYXMgc2VwYXJhdGUgY2h1bmtzIHRvIHRoZSBldmVudCBxdWV1ZS4KKwl1bERhdGFTaXplID0KKwkgICAgc2l6ZW9mKHRFcGxFdmVudCkgKworCSAgICAoKHBFdmVudF9wLT5tX3BBcmcgIT0gTlVMTCkgPyBwRXZlbnRfcC0+bV91aVNpemUgOiAwKTsKKyNlbmRpZgorCisJLy8gZGVjaWRlIGluIHdoaWNoIGJ1ZmZlciB0aGUgZXZlbnQgaGF2ZSB0byB3cml0ZQorCXN3aXRjaCAocEV2ZW50X3AtPm1fRXZlbnRTaW5rKSB7CisJCS8vIGtlcm5lbHNwYWNlIG1vZHVsZXMKKwljYXNlIGtFcGxFdmVudFNpbmtTeW5jOgorCWNhc2Uga0VwbEV2ZW50U2lua05tdGs6CisJY2FzZSBrRXBsRXZlbnRTaW5rRGxsazoKKwljYXNlIGtFcGxFdmVudFNpbmtEbGxrQ2FsOgorCWNhc2Uga0VwbEV2ZW50U2lua1Bkb2s6CisJY2FzZSBrRXBsRXZlbnRTaW5rRXJyazoKKwkJeworI2lmbmRlZiBFUExfTk9fRklGTworCQkJLy8gcG9zdCBtZXNzYWdlCisJCQlTaGJFcnJvciA9CisJCQkgICAgU2hiQ2lyQWxsb2NEYXRhQmxvY2soRXBsRXZlbnR1SW5zdGFuY2VfZy4KKwkJCQkJCSBtX3BTaGJVc2VyVG9LZXJuZWxJbnN0YW5jZSwKKwkJCQkJCSAmU2hiQ2lyQ2h1bmssIHVsRGF0YVNpemUpOworCQkJaWYgKFNoYkVycm9yICE9IGtTaGJPaykgeworCQkJCUVQTF9EQkdMVkxfRVZFTlRLX1RSQUNFMQorCQkJCSAgICAoIkVwbEV2ZW50dVBvc3QoKTogU2hiQ2lyQWxsb2NEYXRhQmxvY2soVTJLKSAtPiAweCVYXG4iLAorCQkJCSAgICAgU2hiRXJyb3IpOworCQkJCVJldCA9IGtFcGxFdmVudFBvc3RFcnJvcjsKKwkJCQlnb3RvIEV4aXQ7CisJCQl9CisJCQlTaGJFcnJvciA9CisJCQkgICAgU2hiQ2lyV3JpdGVEYXRhQ2h1bmsoRXBsRXZlbnR1SW5zdGFuY2VfZy4KKwkJCQkJCSBtX3BTaGJVc2VyVG9LZXJuZWxJbnN0YW5jZSwKKwkJCQkJCSAmU2hiQ2lyQ2h1bmssIHBFdmVudF9wLAorCQkJCQkJIHNpemVvZih0RXBsRXZlbnQpLAorCQkJCQkJICZmQnVmZmVyQ29tcGxldGVkKTsKKwkJCWlmIChTaGJFcnJvciAhPSBrU2hiT2spIHsKKwkJCQlFUExfREJHTFZMX0VWRU5US19UUkFDRTEKKwkJCQkgICAgKCJFcGxFdmVudHVQb3N0KCk6IFNoYkNpcldyaXRlRGF0YUNodW5rKFUySykgLT4gMHglWFxuIiwKKwkJCQkgICAgIFNoYkVycm9yKTsKKwkJCQlSZXQgPSBrRXBsRXZlbnRQb3N0RXJyb3I7CisJCQkJZ290byBFeGl0OworCQkJfQorCQkJaWYgKGZCdWZmZXJDb21wbGV0ZWQgPT0gRkFMU0UpIHsKKwkJCQlTaGJFcnJvciA9CisJCQkJICAgIFNoYkNpcldyaXRlRGF0YUNodW5rKEVwbEV2ZW50dUluc3RhbmNlX2cuCisJCQkJCQkJIG1fcFNoYlVzZXJUb0tlcm5lbEluc3RhbmNlLAorCQkJCQkJCSAmU2hiQ2lyQ2h1bmssCisJCQkJCQkJIHBFdmVudF9wLT5tX3BBcmcsCisJCQkJCQkJICh1bnNpZ25lZCBsb25nKQorCQkJCQkJCSBwRXZlbnRfcC0+bV91aVNpemUsCisJCQkJCQkJICZmQnVmZmVyQ29tcGxldGVkKTsKKwkJCQlpZiAoKFNoYkVycm9yICE9IGtTaGJPaykKKwkJCQkgICAgfHwgKGZCdWZmZXJDb21wbGV0ZWQgPT0gRkFMU0UpKSB7CisJCQkJCUVQTF9EQkdMVkxfRVZFTlRLX1RSQUNFMQorCQkJCQkgICAgKCJFcGxFdmVudHVQb3N0KCk6IFNoYkNpcldyaXRlRGF0YUNodW5rMihVMkspIC0+IDB4JVhcbiIsCisJCQkJCSAgICAgU2hiRXJyb3IpOworCQkJCQlSZXQgPSBrRXBsRXZlbnRQb3N0RXJyb3I7CisJCQkJCWdvdG8gRXhpdDsKKwkJCQl9CisJCQl9CisjZWxzZQorCQkJUmV0ID0gRXBsRXZlbnRrUHJvY2VzcyhwRXZlbnRfcCk7CisjZW5kaWYKKworCQkJYnJlYWs7CisJCX0KKworCQkvLyB1c2Vyc3BhY2UgbW9kdWxlcworCWNhc2Uga0VwbEV2ZW50U2lua05tdE1udToKKwljYXNlIGtFcGxFdmVudFNpbmtObXR1OgorCWNhc2Uga0VwbEV2ZW50U2lua1Nkb0FzeVNlcToKKwljYXNlIGtFcGxFdmVudFNpbmtBcGk6CisJY2FzZSBrRXBsRXZlbnRTaW5rRGxsdUNhbDoKKwljYXNlIGtFcGxFdmVudFNpbmtFcnJ1OgorCWNhc2Uga0VwbEV2ZW50U2lua0xlZHU6CisJCXsKKyNpZm5kZWYgRVBMX05PX0ZJRk8KKwkJCS8vIHBvc3QgbWVzc2FnZQorCQkJU2hiRXJyb3IgPQorCQkJICAgIFNoYkNpckFsbG9jRGF0YUJsb2NrKEVwbEV2ZW50dUluc3RhbmNlX2cuCisJCQkJCQkgbV9wU2hiS2VybmVsVG9Vc2VySW5zdGFuY2UsCisJCQkJCQkgJlNoYkNpckNodW5rLCB1bERhdGFTaXplKTsKKwkJCWlmIChTaGJFcnJvciAhPSBrU2hiT2spIHsKKwkJCQlFUExfREJHTFZMX0VWRU5US19UUkFDRTEKKwkJCQkgICAgKCJFcGxFdmVudHVQb3N0KCk6IFNoYkNpckFsbG9jRGF0YUJsb2NrKEsyVSkgLT4gMHglWFxuIiwKKwkJCQkgICAgIFNoYkVycm9yKTsKKwkJCQlSZXQgPSBrRXBsRXZlbnRQb3N0RXJyb3I7CisJCQkJZ290byBFeGl0OworCQkJfQorCQkJU2hiRXJyb3IgPQorCQkJICAgIFNoYkNpcldyaXRlRGF0YUNodW5rKEVwbEV2ZW50dUluc3RhbmNlX2cuCisJCQkJCQkgbV9wU2hiS2VybmVsVG9Vc2VySW5zdGFuY2UsCisJCQkJCQkgJlNoYkNpckNodW5rLCBwRXZlbnRfcCwKKwkJCQkJCSBzaXplb2YodEVwbEV2ZW50KSwKKwkJCQkJCSAmZkJ1ZmZlckNvbXBsZXRlZCk7CisJCQlpZiAoU2hiRXJyb3IgIT0ga1NoYk9rKSB7CisJCQkJRVBMX0RCR0xWTF9FVkVOVEtfVFJBQ0UxCisJCQkJICAgICgiRXBsRXZlbnR1UG9zdCgpOiBTaGJDaXJXcml0ZURhdGFDaHVuayhLMlUpIC0+IDB4JVhcbiIsCisJCQkJICAgICBTaGJFcnJvcik7CisJCQkJUmV0ID0ga0VwbEV2ZW50UG9zdEVycm9yOworCQkJCWdvdG8gRXhpdDsKKwkJCX0KKwkJCWlmIChmQnVmZmVyQ29tcGxldGVkID09IEZBTFNFKSB7CisJCQkJU2hiRXJyb3IgPQorCQkJCSAgICBTaGJDaXJXcml0ZURhdGFDaHVuayhFcGxFdmVudHVJbnN0YW5jZV9nLgorCQkJCQkJCSBtX3BTaGJLZXJuZWxUb1VzZXJJbnN0YW5jZSwKKwkJCQkJCQkgJlNoYkNpckNodW5rLAorCQkJCQkJCSBwRXZlbnRfcC0+bV9wQXJnLAorCQkJCQkJCSAodW5zaWduZWQgbG9uZykKKwkJCQkJCQkgcEV2ZW50X3AtPm1fdWlTaXplLAorCQkJCQkJCSAmZkJ1ZmZlckNvbXBsZXRlZCk7CisJCQkJaWYgKChTaGJFcnJvciAhPSBrU2hiT2spCisJCQkJICAgIHx8IChmQnVmZmVyQ29tcGxldGVkID09IEZBTFNFKSkgeworCQkJCQlFUExfREJHTFZMX0VWRU5US19UUkFDRTEKKwkJCQkJICAgICgiRXBsRXZlbnR1UG9zdCgpOiBTaGJDaXJXcml0ZURhdGFDaHVuazIoSzJVKSAtPiAweCVYXG4iLAorCQkJCQkgICAgIFNoYkVycm9yKTsKKwkJCQkJUmV0ID0ga0VwbEV2ZW50UG9zdEVycm9yOworCQkJCQlnb3RvIEV4aXQ7CisJCQkJfQorCQkJfQorI2Vsc2UKKwkJCVJldCA9IEVwbEV2ZW50dVByb2Nlc3MocEV2ZW50X3ApOworI2VuZGlmCisKKwkJCWJyZWFrOworCQl9CisKKwlkZWZhdWx0OgorCQl7CisJCQlSZXQgPSBrRXBsRXZlbnRVbmtub3duU2luazsKKwkJfQorCisJfQkJCS8vIGVuZCBvZiBzd2l0Y2gocEV2ZW50X3AtPm1fRXZlbnRTaW5rKQorCisjaWZuZGVmIEVQTF9OT19GSUZPCisgICAgICBFeGl0OgorI2VuZGlmCisJcmV0dXJuIFJldDsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxFdmVudHVQb3N0RXJyb3IKKy8vCisvLyBEZXNjcmlwdGlvbjogcG9zdCBlcnJvcmV2ZW50IGZyb20gdXNlcnNwYWNlCisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOiAgRXZlbnRTb3VyY2VfcCAgID0gc291cmNlLW1vZHVsZSBvZiB0aGUgZXJyb3JldmVudAorLy8gICAgICAgICAgICAgIEVwbEVycm9yX3AgICAgID0gY29kZSBvZiBvY2N1cmVkIGVycm9yCisvLyAgICAgICAgICAgICAgdWlBcmdTaXplX3AgICAgID0gc2l6ZSBvZiB0aGUgYXJndW1lbnQKKy8vICAgICAgICAgICAgICBwQXJnX3AgICAgICAgICAgPSBwb2ludGVyIHRvIHRoZSBhcmd1bWVudAorLy8KKy8vCisvLyBSZXR1cm5zOiAgICAgIHRFcEtlcm5lbCAgPSBlcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3RFcGxLZXJuZWwgUFVCTElDIEVwbEV2ZW50dVBvc3RFcnJvcih0RXBsRXZlbnRTb3VyY2UgRXZlbnRTb3VyY2VfcCwKKwkJCQkgICAgIHRFcGxLZXJuZWwgRXBsRXJyb3JfcCwKKwkJCQkgICAgIHVuc2lnbmVkIGludCB1aUFyZ1NpemVfcCwgdm9pZCAqcEFyZ19wKQoreworCXRFcGxLZXJuZWwgUmV0OworCUJZVEUgYWJCdWZmZXJbRVBMX01BWF9FVkVOVF9BUkdfU0laRV07CisJdEVwbEV2ZW50RXJyb3IgKnBFdmVudEVycm9yID0gKHRFcGxFdmVudEVycm9yICopIGFiQnVmZmVyOworCXRFcGxFdmVudCBFcGxFdmVudDsKKworCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJLy8gY3JlYXRlIGFyZ3VtZW50CisJcEV2ZW50RXJyb3ItPm1fRXZlbnRTb3VyY2UgPSBFdmVudFNvdXJjZV9wOworCXBFdmVudEVycm9yLT5tX0VwbEVycm9yID0gRXBsRXJyb3JfcDsKKwlFUExfTUVNQ1BZKCZwRXZlbnRFcnJvci0+bV9BcmcsIHBBcmdfcCwgdWlBcmdTaXplX3ApOworCisJLy8gY3JlYXRlIGV2ZW50CisJRXBsRXZlbnQubV9FdmVudFR5cGUgPSBrRXBsRXZlbnRUeXBlRXJyb3I7CisJRXBsRXZlbnQubV9FdmVudFNpbmsgPSBrRXBsRXZlbnRTaW5rQXBpOworCUVQTF9NRU1TRVQoJkVwbEV2ZW50Lm1fTmV0VGltZSwgMHgwMCwgc2l6ZW9mKEVwbEV2ZW50Lm1fTmV0VGltZSkpOworCUVwbEV2ZW50Lm1fdWlTaXplID0KKwkgICAgKHNpemVvZihFdmVudFNvdXJjZV9wKSArIHNpemVvZihFcGxFcnJvcl9wKSArIHVpQXJnU2l6ZV9wKTsKKwlFcGxFdmVudC5tX3BBcmcgPSAmYWJCdWZmZXJbMF07CisKKwkvLyBwb3N0IGVycm9yZXZlbnQKKwlSZXQgPSBFcGxFdmVudHVQb3N0KCZFcGxFdmVudCk7CisKKwlyZXR1cm4gUmV0OworfQorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgIFAgUiBJIFYgQSBUIEUgICBGIFUgTiBDIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsRXZlbnR1UnhTaWduYWxIYW5kbGVyQ2IoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBDYWxsYmFjay1mdW5jdGlvbiBmb3IgZXZldHMgZnJvbSBrZXJuZWxzcGFjZQorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczogIHBTaGJSeEluc3RhbmNlX3AgICAgPSBJbnN0YW5jZS1wb2ludGVyIGZvciBidWZmZXIKKy8vICAgICAgICAgICAgICB1bERhdGFTaXplX3AgICAgICAgID0gc2l6ZSBvZiBkYXRhCisvLworLy8KKy8vIFJldHVybnM6IHZvaWQKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNpZm5kZWYgRVBMX05PX0ZJRk8KK3N0YXRpYyB2b2lkIEVwbEV2ZW50dVJ4U2lnbmFsSGFuZGxlckNiKHRTaGJJbnN0YW5jZSBwU2hiUnhJbnN0YW5jZV9wLAorCQkJCSAgICAgICB1bnNpZ25lZCBsb25nIHVsRGF0YVNpemVfcCkKK3sKKwl0RXBsRXZlbnQgKnBFcGxFdmVudDsKKwl0U2hiRXJyb3IgU2hiRXJyb3I7CisvL3Vuc2lnbmVkIGxvbmcgICB1bEJsb2NrQ291bnQ7CisvL3Vuc2lnbmVkIGxvbmcgICB1bERhdGFTaXplOworCUJZVEUgYWJEYXRhQnVmZmVyW3NpemVvZih0RXBsRXZlbnQpICsgRVBMX01BWF9FVkVOVF9BUkdfU0laRV07CisJLy8gZC5rLjogYWJEYXRhQnVmZmVyIGNvbnRhaW5zIHRoZSBjb21wbGV0ZSB0RXBsRXZlbnQgc3RydWN0dXJlCisJLy8gICAgICAgYW5kIGJlaGluZCB0aGlzIHRoZSBhcmd1bWVudAorCisJVEdUX0RCR19TSUdOQUxfVFJBQ0VfUE9JTlQoMjEpOworCisvLyBkLmsuIG5vdCBuZWVkZWQgYmVjYXVzZSBpdCBpcyBhbHJlYWR5IGRvbmUgaW4gU2hhcmVkQnVmZgorLyogICAgZG8KKyAgICB7CisgICAgICAgIEJFTkNITUFSS19NT0RfMjhfU0VUKDEpOyAgICAvLyA0ILVzIHVudGlsIHJlc2V0CisgICAgICAgIC8vIGdldCBtZXNzYWdlc2l6ZQorICAgICAgICBTaGJFcnJvciA9IFNoYkNpckdldFJlYWREYXRhU2l6ZSAocFNoYlJ4SW5zdGFuY2VfcCwgJnVsRGF0YVNpemUpOworICAgICAgICBpZihTaGJFcnJvciAhPSBrU2hiT2spCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGVycm9yIGdvdG8gZXhpdAorICAgICAgICAgICAgZ290byBFeGl0OworICAgICAgICB9CisKKyAgICAgICAgQkVOQ0hNQVJLX01PRF8yOF9SRVNFVCgxKTsgIC8vIDE0ILVzIHVudGlsIHNldAorKi8KKwkvLyBjb3B5IGRhdGEgZnJvbSBldmVudCBxdWV1ZQorCVNoYkVycm9yID0gU2hiQ2lyUmVhZERhdGFCbG9jayhwU2hiUnhJbnN0YW5jZV9wLAorCQkJCSAgICAgICAmYWJEYXRhQnVmZmVyWzBdLAorCQkJCSAgICAgICBzaXplb2YoYWJEYXRhQnVmZmVyKSwgJnVsRGF0YVNpemVfcCk7CisJaWYgKFNoYkVycm9yICE9IGtTaGJPaykgeworCQkvLyBlcnJvciBnb3RvIGV4aXQKKwkJZ290byBFeGl0OworCX0KKwkvLyByZXNvbHZlIHRoZSBwb2ludGVyIHRvIHRoZSBldmVudCBzdHJ1Y3R1cmUKKwlwRXBsRXZlbnQgPSAodEVwbEV2ZW50ICopIGFiRGF0YUJ1ZmZlcjsKKwkvLyBzZXQgRGF0YXNpemUKKwlwRXBsRXZlbnQtPm1fdWlTaXplID0gKHVsRGF0YVNpemVfcCAtIHNpemVvZih0RXBsRXZlbnQpKTsKKwlpZiAocEVwbEV2ZW50LT5tX3VpU2l6ZSA+IDApIHsKKwkJLy8gc2V0IHBvaW50ZXIgdG8gYXJndW1lbnQKKwkJcEVwbEV2ZW50LT5tX3BBcmcgPSAmYWJEYXRhQnVmZmVyW3NpemVvZih0RXBsRXZlbnQpXTsKKwl9IGVsc2UgeworCQkvL3NldCBwb2ludGVyIHRvIE5VTEwKKwkJcEVwbEV2ZW50LT5tX3BBcmcgPSBOVUxMOworCX0KKworCUJFTkNITUFSS19NT0RfMjhfU0VUKDEpOworCS8vIGNhbGwgcHJvY2Vzc2Z1bmN0aW9uCisJRXBsRXZlbnR1UHJvY2VzcyhwRXBsRXZlbnQpOworCisJQkVOQ0hNQVJLX01PRF8yOF9SRVNFVCgxKTsKKwkvLyByZWFkIG51bWJlciBvZiBsZWZ0IG1lc3NhZ2VzIHRvIHByb2Nlc3MKKy8vIGQuay4gbm90IG5lZWRlZCBiZWNhdXNlIGl0IGlzIGFscmVhZHkgZG9uZSBpbiBTaGFyZWRCdWZmCisvKiAgICAgICAgU2hiRXJyb3IgPSBTaGJDaXJHZXRSZWFkQmxvY2tDb3VudCAocFNoYlJ4SW5zdGFuY2VfcCwgJnVsQmxvY2tDb3VudCk7CisgICAgICAgIGlmIChTaGJFcnJvciAhPSBrU2hiT2spCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGVycm9yIGdvdG8gZXhpdAorICAgICAgICAgICAgZ290byBFeGl0OworICAgICAgICB9CisgICAgfSB3aGlsZSAodWxCbG9ja0NvdW50ID4gMCk7CisqLworICAgICAgRXhpdDoKKwlyZXR1cm47Cit9CisjZW5kaWYKKworLy8gRU9GCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbEZyYW1lLmggYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbEZyYW1lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWE3ZjhiOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsRnJhbWUuaApAQCAtMCwwICsxLDM0NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIGluY2x1ZGUgZmlsZSBmb3IgRVBMIGZyYW1lcworCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgJFJDU2ZpbGU6IEVwbEZyYW1lLmgsdiAkCisKKyAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAorCisgICAgICAgICAgICAgICAgJFJldmlzaW9uOiAxLjUgJCAgJERhdGU6IDIwMDgvMDYvMjMgMTQ6NTY6MzMgJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgICAgIEdDQyBWMy40CisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwNi8wNS8yMiBkLmsuOiAgIHN0YXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiwgdmVyc2lvbiAxLjAwCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX0VQTF9GUkFNRV9IXworI2RlZmluZSBfRVBMX0ZSQU1FX0hfCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBkZWZpbmVzIGZvciBFcGxGcmFtZS5tX3dGbGFnCisjZGVmaW5lIEVQTF9GUkFNRV9GTEFHMV9SRCAgICAgICAgICAweDAxCS8vIHJlYWR5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFBSZXEsIFBSZXMpCisjZGVmaW5lIEVQTF9GUkFNRV9GTEFHMV9FUiAgICAgICAgICAweDAyCS8vIGV4Y2VwdGlvbiByZXNldCAoZXJyb3Igc2lnbmFsbGluZykgICAgICAgKFNvQSkKKyNkZWZpbmUgRVBMX0ZSQU1FX0ZMQUcxX0VBICAgICAgICAgIDB4MDQJLy8gZXhjZXB0aW9uIGFja25vd2xlZGdlIChlcnJvciBzaWduYWxsaW5nKSAoUFJlcSwgU29BKQorI2RlZmluZSBFUExfRlJBTUVfRkxBRzFfRUMgICAgICAgICAgMHgwOAkvLyBleGNlcHRpb24gY2xlYXIgKGVycm9yIHNpZ25hbGxpbmcpICAgICAgIChTdGF0dXNSZXMpCisjZGVmaW5lIEVQTF9GUkFNRV9GTEFHMV9FTiAgICAgICAgICAweDEwCS8vIGV4Y2VwdGlvbiBuZXcgKGVycm9yIHNpZ25hbGxpbmcpICAgICAgICAgKFBSZXMsIFN0YXR1c1JlcykKKyNkZWZpbmUgRVBMX0ZSQU1FX0ZMQUcxX01TICAgICAgICAgIDB4MjAJLy8gbXVsdGlwbGV4ZWQgc2xvdCAgICAgICAgICAgICAgICAgICAgICAgICAoUFJlcSkKKyNkZWZpbmUgRVBMX0ZSQU1FX0ZMQUcxX1BTICAgICAgICAgIDB4NDAJLy8gcHJlc2NhbGVkIHNsb3QgICAgICAgICAgICAgICAgICAgICAgICAgICAoU29DKQorI2RlZmluZSBFUExfRlJBTUVfRkxBRzFfTUMgICAgICAgICAgMHg4MAkvLyBtdWx0aXBsZXhlZCBjeWNsZSBjb21wbGV0ZWQgICAgICAgICAgICAgIChTb0MpCisjZGVmaW5lIEVQTF9GUkFNRV9GTEFHMl9SUyAgICAgICAgICAweDA3CS8vIG51bWJlciBvZiBwZW5kaW5nIHJlcXVlc3RzIHRvIHNlbmQgICAgICAgKFBSZXMsIFN0YXR1c1JlcywgSWRlbnRSZXMpCisjZGVmaW5lIEVQTF9GUkFNRV9GTEFHMl9QUiAgICAgICAgICAweDM4CS8vIHByaW9yaXR5IG9mIHJlcXVlc3RlZCBhc3luY2guIGZyYW1lICAgICAgKFBSZXMsIFN0YXR1c1JlcywgSWRlbnRSZXMpCisjZGVmaW5lIEVQTF9GUkFNRV9GTEFHMl9QUl9TSElGVCAgICAzCS8vIHNoaWZ0IG9mIHByaW9yaXR5IG9mIHJlcXVlc3RlZCBhc3luY2guIGZyYW1lCisKKy8vIGVycm9yIGhpc3Rvcnkvc3RhdHVzIGVudHJ5IHR5cGVzCisjZGVmaW5lIEVQTF9FUlJfRU5UUllUWVBFX1NUQVRVUyAgICAgICAgMHg4MDAwCisjZGVmaW5lIEVQTF9FUlJfRU5UUllUWVBFX0hJU1RPUlkgICAgICAgMHgwMDAwCisjZGVmaW5lIEVQTF9FUlJfRU5UUllUWVBFX0VNQ1kgICAgICAgICAgMHg0MDAwCisjZGVmaW5lIEVQTF9FUlJfRU5UUllUWVBFX01PREVfQUNUSVZFICAgMHgxMDAwCisjZGVmaW5lIEVQTF9FUlJfRU5UUllUWVBFX01PREVfQ0xFQVJFRCAgMHgyMDAwCisjZGVmaW5lIEVQTF9FUlJfRU5UUllUWVBFX01PREVfT0NDVVJSRUQgMHgzMDAwCisjZGVmaW5lIEVQTF9FUlJfRU5UUllUWVBFX01PREVfTUFTSyAgICAgMHgzMDAwCisjZGVmaW5lIEVQTF9FUlJfRU5UUllUWVBFX1BST0ZfVkVORE9SICAgMHgwMDAxCisjZGVmaW5lIEVQTF9FUlJfRU5UUllUWVBFX1BST0ZfRVBMICAgICAgMHgwMDAyCisjZGVmaW5lIEVQTF9FUlJfRU5UUllUWVBFX1BST0ZfTUFTSyAgICAgMHgwRkZGCisKKy8vIGRlZmluZXMgZm9yIEVQTCB2ZXJzaW9uIC8gUERPIHZlcnNpb24KKyNkZWZpbmUgRVBMX1ZFUlNJT05fU1VCICAgICAgICAgICAgIDB4MEYJLy8gc3ViIHZlcnNpb24KKyNkZWZpbmUgRVBMX1ZFUlNJT05fTUFJTiAgICAgICAgICAgIDB4RjAJLy8gbWFpbiB2ZXJzaW9uCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyB0eXBlZGVmCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyAkJCQgZC5rLjogbW92ZSB0aGlzIGRlZmluaXRpb24gdG8gZ2xvYmFsLmgKKy8vIGJ5dGUtYWxpZ24gc3RydWN0dXJlcworI2lmZGVmIF9NU0NfVkVSCisjICAgIHByYWdtYSBwYWNrKCBwdXNoLCBwYWNraW5nICkKKyMgICAgcHJhZ21hIHBhY2soIDEgKQorIyAgICBkZWZpbmUgUEFDS19TVFJVQ1QKKyNlbGlmIGRlZmluZWQoIF9fR05VQ19fICkKKyMgICAgZGVmaW5lIFBBQ0tfU1RSVUNUICAgIF9fYXR0cmlidXRlX18oKHBhY2tlZCkpCisjZWxzZQorIyAgICBlcnJvciB5b3UgbXVzdCBieXRlLWFsaWduIHRoZXNlIHN0cnVjdHVyZXMgd2l0aCB0aGUgYXBwcm9wcmlhdGUgY29tcGlsZXIgZGlyZWN0aXZlcworI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IHsKKwkvLyBPZmZzZXQgMTcKKwlCWVRFIG1fbGVfYlJlczE7CS8vIHJlc2VydmVkCisJLy8gT2Zmc2V0IDE4CisJQllURSBtX2xlX2JGbGFnMTsJLy8gRmxhZ3M6IE1DLCBQUworCS8vIE9mZnNldCAxOQorCUJZVEUgbV9sZV9iRmxhZzI7CS8vIEZsYWdzOiByZXMKKwkvLyBPZmZzZXQgMjAKKwl0RXBsTmV0VGltZSBtX2xlX05ldFRpbWU7CS8vIHN1cHBvcnRlZCBpZiBEX05NVF9OZXRUaW1lSXNSZWFsVGltZV9CT09MIGlzIHNldAorCS8vIE9mZnNldCAyOAorCVFXT1JEIG1fbGVfUmVsYXRpdmVUaW1lOwkvLyBpbiB1cyAoc3VwcG9ydGVkIGlmIERfTk1UX1JlbGF0aXZlVGltZV9CT09MIGlzIHNldCkKKworfSBQQUNLX1NUUlVDVCB0RXBsU29jRnJhbWU7CisKK3R5cGVkZWYgc3RydWN0IHsKKwkvLyBPZmZzZXQgMTcKKwlCWVRFIG1fbGVfYlJlczE7CS8vIHJlc2VydmVkCisJLy8gT2Zmc2V0IDE4CisJQllURSBtX2xlX2JGbGFnMTsJLy8gRmxhZ3M6IE1TLCBFQSwgUkQKKwkvLyBPZmZzZXQgMTkKKwlCWVRFIG1fbGVfYkZsYWcyOwkvLyBGbGFnczogcmVzCisJLy8gT2Zmc2V0IDIwCisJQllURSBtX2xlX2JQZG9WZXJzaW9uOworCS8vIE9mZnNldCAyMQorCUJZVEUgbV9sZV9iUmVzMjsJLy8gcmVzZXJ2ZWQKKwkvLyBPZmZzZXQgMjIKKwlXT1JEIG1fbGVfd1NpemU7CisJLy8gT2Zmc2V0IDI0CisJQllURSBtX2xlX2FiUGF5bG9hZFsyNTYgLypEX05NVF9Jc29jaHJSeE1heFBheWxvYWRfVTE2ICovIF07CisKK30gUEFDS19TVFJVQ1QgdEVwbFByZXFGcmFtZTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCS8vIE9mZnNldCAxNworCUJZVEUgbV9sZV9iTm10U3RhdHVzOwkvLyBOTVQgc3RhdGUKKwkvLyBPZmZzZXQgMTgKKwlCWVRFIG1fbGVfYkZsYWcxOwkvLyBGbGFnczogTVMsIEVOLCBSRAorCS8vIE9mZnNldCAxOQorCUJZVEUgbV9sZV9iRmxhZzI7CS8vIEZsYWdzOiBQUiwgUlMKKwkvLyBPZmZzZXQgMjAKKwlCWVRFIG1fbGVfYlBkb1ZlcnNpb247CisJLy8gT2Zmc2V0IDIxCisJQllURSBtX2xlX2JSZXMyOwkvLyByZXNlcnZlZAorCS8vIE9mZnNldCAyMgorCVdPUkQgbV9sZV93U2l6ZTsKKwkvLyBPZmZzZXQgMjQKKwlCWVRFIG1fbGVfYWJQYXlsb2FkWzI1NgkvKkRfTk1UX0lzb2NoclJ4TWF4UGF5bG9hZF9VMTYKKwkJCQkgICAvIERfTk1UX0lzb2NoclR4TWF4UGF5bG9hZF9VMTYgKi8gXTsKKworfSBQQUNLX1NUUlVDVCB0RXBsUHJlc0ZyYW1lOworCit0eXBlZGVmIHN0cnVjdCB7CisJLy8gT2Zmc2V0IDE3CisJQllURSBtX2xlX2JObXRTdGF0dXM7CS8vIE5NVCBzdGF0ZQorCS8vIE9mZnNldCAxOAorCUJZVEUgbV9sZV9iRmxhZzE7CS8vIEZsYWdzOiBFQSwgRVIKKwkvLyBPZmZzZXQgMTkKKwlCWVRFIG1fbGVfYkZsYWcyOwkvLyBGbGFnczogcmVzCisJLy8gT2Zmc2V0IDIwCisJQllURSBtX2xlX2JSZXFTZXJ2aWNlSWQ7CisJLy8gT2Zmc2V0IDIxCisJQllURSBtX2xlX2JSZXFTZXJ2aWNlVGFyZ2V0OworCS8vIE9mZnNldCAyMgorCUJZVEUgbV9sZV9iRXBsVmVyc2lvbjsKKworfSBQQUNLX1NUUlVDVCB0RXBsU29hRnJhbWU7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlXT1JEIG1fd0VudHJ5VHlwZTsKKwlXT1JEIG1fd0Vycm9yQ29kZTsKKwl0RXBsTmV0VGltZSBtX1RpbWVTdGFtcDsKKwlCWVRFIG1fYWJBZGRJbmZvWzhdOworCit9IFBBQ0tfU1RSVUNUIHRFcGxFcnJIaXN0b3J5RW50cnk7CisKK3R5cGVkZWYgc3RydWN0IHsKKwkvLyBPZmZzZXQgMTgKKwlCWVRFIG1fbGVfYkZsYWcxOwkvLyBGbGFnczogRU4sIEVDCisJQllURSBtX2xlX2JGbGFnMjsJLy8gRmxhZ3M6IFBSLCBSUworCUJZVEUgbV9sZV9iTm10U3RhdHVzOwkvLyBOTVQgc3RhdGUKKwlCWVRFIG1fbGVfYlJlczFbM107CisJUVdPUkQgbV9sZV9xd1N0YXRpY0Vycm9yOwkvLyBzdGF0aWMgZXJyb3IgYml0IGZpZWxkCisJdEVwbEVyckhpc3RvcnlFbnRyeSBtX2xlX2FFcnJIaXN0b3J5RW50cnlbMTRdOworCit9IFBBQ0tfU1RSVUNUIHRFcGxTdGF0dXNSZXNwb25zZTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCS8vIE9mZnNldCAxOAorCUJZVEUgbV9sZV9iRmxhZzE7CS8vIEZsYWdzOiByZXMKKwlCWVRFIG1fbGVfYkZsYWcyOwkvLyBGbGFnczogUFIsIFJTCisJQllURSBtX2xlX2JObXRTdGF0dXM7CS8vIE5NVCBzdGF0ZQorCUJZVEUgbV9sZV9iSWRlbnRSZXNwRmxhZ3M7CS8vIEZsYWdzOiBGVworCUJZVEUgbV9sZV9iRXBsUHJvZmlsZVZlcnNpb247CisJQllURSBtX2xlX2JSZXMxOworCURXT1JEIG1fbGVfZHdGZWF0dXJlRmxhZ3M7CS8vIE5NVF9GZWF0dXJlRmxhZ3NfVTMyCisJV09SRCBtX2xlX3dNdHU7CQkvLyBOTVRfQ3ljbGVUaW1pbmdfUkVDLkFzeW5jTVRVX1UxNjogQ19JUF9NSU5fTVRVIC0gQ19JUF9NQVhfTVRVCisJV09SRCBtX2xlX3dQb2xsSW5TaXplOwkvLyBOTVRfQ3ljbGVUaW1pbmdfUkVDLlBSZXFBY3RQYXlsb2FkX1UxNgorCVdPUkQgbV9sZV93UG9sbE91dFNpemU7CS8vIE5NVF9DeWNsZVRpbWluZ19SRUMuUFJlc0FjdFBheWxvYWRfVTE2CisJRFdPUkQgbV9sZV9kd1Jlc3BvbnNlVGltZTsJLy8gTk1UX0N5Y2xlVGltaW5nX1JFQy5QUmVzTWF4TGF0ZW5jeV9VMzIKKwlXT1JEIG1fbGVfd1JlczI7CisJRFdPUkQgbV9sZV9kd0RldmljZVR5cGU7CS8vIE5NVF9EZXZpY2VUeXBlX1UzMgorCURXT1JEIG1fbGVfZHdWZW5kb3JJZDsJLy8gTk1UX0lkZW50aXR5T2JqZWN0X1JFQy5WZW5kb3JJZF9VMzIKKwlEV09SRCBtX2xlX2R3UHJvZHVjdENvZGU7CS8vIE5NVF9JZGVudGl0eU9iamVjdF9SRUMuUHJvZHVjdENvZGVfVTMyCisJRFdPUkQgbV9sZV9kd1JldmlzaW9uTnVtYmVyOwkvLyBOTVRfSWRlbnRpdHlPYmplY3RfUkVDLlJldmlzaW9uTm9fVTMyCisJRFdPUkQgbV9sZV9kd1NlcmlhbE51bWJlcjsJLy8gTk1UX0lkZW50aXR5T2JqZWN0X1JFQy5TZXJpYWxOb19VMzIKKwlRV09SRCBtX2xlX3F3VmVuZG9yU3BlY2lmaWNFeHQxOworCURXT1JEIG1fbGVfZHdWZXJpZnlDb25maWd1cmF0aW9uRGF0ZTsJLy8gQ0ZNX1ZlcmlmeUNvbmZpZ3VyYXRpb25fUkVDLkNvbmZEYXRlX1UzMgorCURXT1JEIG1fbGVfZHdWZXJpZnlDb25maWd1cmF0aW9uVGltZTsJLy8gQ0ZNX1ZlcmlmeUNvbmZpZ3VyYXRpb25fUkVDLkNvbmZUaW1lX1UzMgorCURXT1JEIG1fbGVfZHdBcHBsaWNhdGlvblN3RGF0ZTsJLy8gUERMX0xvY1ZlckFwcGxTd19SRUMuQXBwbFN3RGF0ZV9VMzIgb24gcHJvZ3JhbW1hYmxlIGRldmljZSBvciBkYXRlIHBvcnRpb24gb2YgTk1UX01hbnVmYWN0U3dWZXJzX1ZTIG9uIG5vbi1wcm9ncmFtbWFibGUgZGV2aWNlCisJRFdPUkQgbV9sZV9kd0FwcGxpY2F0aW9uU3dUaW1lOwkvLyBQRExfTG9jVmVyQXBwbFN3X1JFQy5BcHBsU3dUaW1lX1UzMiBvbiBwcm9ncmFtbWFibGUgZGV2aWNlIG9yIHRpbWUgcG9ydGlvbiBvZiBOTVRfTWFudWZhY3RTd1ZlcnNfVlMgb24gbm9uLXByb2dyYW1tYWJsZSBkZXZpY2UKKwlEV09SRCBtX2xlX2R3SXBBZGRyZXNzOworCURXT1JEIG1fbGVfZHdTdWJuZXRNYXNrOworCURXT1JEIG1fbGVfZHdEZWZhdWx0R2F0ZXdheTsKKwlCWVRFIG1fbGVfc0hvc3RuYW1lWzMyXTsKKwlCWVRFIG1fbGVfYWJWZW5kb3JTcGVjaWZpY0V4dDJbNDhdOworCit9IFBBQ0tfU1RSVUNUIHRFcGxJZGVudFJlc3BvbnNlOworCit0eXBlZGVmIHN0cnVjdCB7CisJLy8gT2Zmc2V0IDE4CisJQllURSBtX2xlX2JObXRDb21tYW5kSWQ7CisJQllURSBtX2xlX2JSZXMxOworCUJZVEUgbV9sZV9hYk5tdENvbW1hbmREYXRhWzMyXTsKKworfSBQQUNLX1NUUlVDVCB0RXBsTm10Q29tbWFuZFNlcnZpY2U7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlCWVRFIG1fbGVfYlJlc2VydmVkOworCUJZVEUgbV9sZV9iVHJhbnNhY3Rpb25JZDsKKwlCWVRFIG1fbGVfYkZsYWdzOworCUJZVEUgbV9sZV9iQ29tbWFuZElkOworCVdPUkQgbV9sZV93U2VnbWVudFNpemU7CisJV09SRCBtX2xlX3dSZXNlcnZlZDsKKwlCWVRFIG1fbGVfYWJDb21tYW5kRGF0YVs4XTsJLy8ganVzdCByZXNlcnZlIGEgbWluaW11bSBudW1iZXIgb2YgYnl0ZXMgYXMgYSBwbGFjZWhvbGRlcgorCit9IFBBQ0tfU1RSVUNUIHRFcGxBc3lTZG9Db207CisKKy8vIGFzeW5jaHJvbm91cyBTRE8gU2VxdWVuY2UgSGVhZGVyCit0eXBlZGVmIHN0cnVjdCB7CisJQllURSBtX2xlX2JSZWNTZXFOdW1Db247CisJQllURSBtX2xlX2JTZW5kU2VxTnVtQ29uOworCUJZVEUgbV9sZV9hYlJlc2VydmVkWzJdOworCXRFcGxBc3lTZG9Db20gbV9sZV9hYlNkb1NlcVBheWxvYWQ7CisKK30gUEFDS19TVFJVQ1QgdEVwbEFzeVNkb1NlcTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCS8vIE9mZnNldCAxOAorCUJZVEUgbV9sZV9iTm10Q29tbWFuZElkOworCUJZVEUgbV9sZV9iVGFyZ2V0Tm9kZUlkOworCUJZVEUgbV9sZV9hYk5tdENvbW1hbmREYXRhWzMyXTsKKworfSBQQUNLX1NUUlVDVCB0RXBsTm10UmVxdWVzdFNlcnZpY2U7CisKK3R5cGVkZWYgdW5pb24geworCS8vIE9mZnNldCAxOAorCXRFcGxTdGF0dXNSZXNwb25zZSBtX1N0YXR1c1Jlc3BvbnNlOworCXRFcGxJZGVudFJlc3BvbnNlIG1fSWRlbnRSZXNwb25zZTsKKwl0RXBsTm10Q29tbWFuZFNlcnZpY2UgbV9ObXRDb21tYW5kU2VydmljZTsKKwl0RXBsTm10UmVxdWVzdFNlcnZpY2UgbV9ObXRSZXF1ZXN0U2VydmljZTsKKwl0RXBsQXN5U2RvU2VxIG1fU2RvU2VxdWVuY2VGcmFtZTsKKwlCWVRFIG1fbGVfYWJQYXlsb2FkWzI1NgkvKkRfTk1UX0FTbmRUeE1heFBheWxvYWRfVTE2CisJCQkJICAgLyBEX05NVF9BU25kUnhNYXhQYXlsb2FkX1UxNiAqLyBdOworCit9IHRFcGxBc25kUGF5bG9hZDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCS8vIE9mZnNldCAxNworCUJZVEUgbV9sZV9iU2VydmljZUlkOworCS8vIE9mZnNldCAxOAorCXRFcGxBc25kUGF5bG9hZCBtX1BheWxvYWQ7CisKK30gUEFDS19TVFJVQ1QgdEVwbEFzbmRGcmFtZTsKKwordHlwZWRlZiB1bmlvbiB7CisJLy8gT2Zmc2V0IDE3CisJdEVwbFNvY0ZyYW1lIG1fU29jOworCXRFcGxQcmVxRnJhbWUgbV9QcmVxOworCXRFcGxQcmVzRnJhbWUgbV9QcmVzOworCXRFcGxTb2FGcmFtZSBtX1NvYTsKKwl0RXBsQXNuZEZyYW1lIG1fQXNuZDsKKworfSB0RXBsRnJhbWVEYXRhOworCit0eXBlZGVmIHN0cnVjdCB7CisJLy8gT2Zmc2V0IDAKKwlCWVRFIG1fYmVfYWJEc3RNYWNbNl07CS8vIE1BQyBhZGRyZXNzIG9mIHRoZSBhZGRyZXNzZWQgbm9kZXMKKwkvLyBPZmZzZXQgNgorCUJZVEUgbV9iZV9hYlNyY01hY1s2XTsJLy8gTUFDIGFkZHJlc3Mgb2YgdGhlIHRyYW5zbWl0dGluZyBub2RlCisJLy8gT2Zmc2V0IDEyCisJV09SRCBtX2JlX3dFdGhlclR5cGU7CS8vIEV0aGVybmV0IG1lc3NhZ2UgdHlwZSAoYmlnIGVuZGlhbikKKwkvLyBPZmZzZXQgMTQKKwlCWVRFIG1fbGVfYk1lc3NhZ2VUeXBlOwkvLyBFUEwgbWVzc2FnZSB0eXBlCisJLy8gT2Zmc2V0IDE1CisJQllURSBtX2xlX2JEc3ROb2RlSWQ7CS8vIEVQTCBub2RlIElEIG9mIHRoZSBhZGRyZXNzZWQgbm9kZXMKKwkvLyBPZmZzZXQgMTYKKwlCWVRFIG1fbGVfYlNyY05vZGVJZDsJLy8gRVBMIG5vZGUgSUQgb2YgdGhlIHRyYW5zbWl0dGluZyBub2RlCisJLy8gT2Zmc2V0IDE3CisJdEVwbEZyYW1lRGF0YSBtX0RhdGE7CisKK30gUEFDS19TVFJVQ1QgdEVwbEZyYW1lOworCisvLyB1bi1ieXRlLWFsaWduIHN0cnVjdHVyZXMKKyNpZmRlZiBfTVNDX1ZFUgorIyAgICBwcmFnbWEgcGFjayggcG9wLCBwYWNraW5nICkKKyNlbmRpZgorCit0eXBlZGVmIGVudW0geworCWtFcGxNc2dUeXBlTm9uRXBsID0gMHgwMCwKKwlrRXBsTXNnVHlwZVNvYyA9IDB4MDEsCisJa0VwbE1zZ1R5cGVQcmVxID0gMHgwMywKKwlrRXBsTXNnVHlwZVByZXMgPSAweDA0LAorCWtFcGxNc2dUeXBlU29hID0gMHgwNSwKKwlrRXBsTXNnVHlwZUFzbmQgPSAweDA2LAorCit9IHRFcGxNc2dUeXBlOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2VuZGlmIC8vICNpZm5kZWYgX0VQTF9GUkFNRV9IXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxJZGVudHUuYyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsSWRlbnR1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2U1OWVmMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsSWRlbnR1LmMKQEAgLTAsMCArMSw0ODggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBzb3VyY2UgZmlsZSBmb3IgSWRlbnR1LU1vZHVsZQorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgJFJDU2ZpbGU6IEVwbElkZW50dS5jLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS44ICQgICREYXRlOiAyMDA4LzExLzIxIDA5OjAwOjM4ICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorICAgICAgICAgICAgICAgICAgICBHQ0MgVjMuNAorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgIDIwMDYvMTEvMTUgZC5rLjogICBzdGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgInVzZXIvRXBsSWRlbnR1LmgiCisjaW5jbHVkZSAidXNlci9FcGxEbGx1Q2FsLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIEcgTCBPIEIgQSBMICAgRCBFIEYgSSBOIEkgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBtb2R1bCBnbG9iYWxlIHZhcnMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICBDIEwgQSBTIFMgIDx4eHh4eD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLy8KKy8vIERlc2NyaXB0aW9uOgorLy8KKy8vCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgIFAgUiBJIFYgQSBUIEUgICBEIEUgRiBJIE4gSSBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvbnN0IGRlZmluZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCB0eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordHlwZWRlZiBzdHJ1Y3QgeworCXRFcGxJZGVudFJlc3BvbnNlICptX2FwSWRlbnRSZXNwb25zZVsyNTRdOwkvLyB0aGUgSWRlbnRSZXNwb25zZSBhcmUgbWFuYWdlZCBkeW5hbWljYWxseQorCXRFcGxJZGVudHVDYlJlc3BvbnNlIG1fYXBmbkNiUmVzcG9uc2VbMjU0XTsKKworfSB0RXBsSWRlbnR1SW5zdGFuY2U7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCB2YXJzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdEVwbElkZW50dUluc3RhbmNlIEVwbElkZW50dUluc3RhbmNlX2c7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdEVwbEtlcm5lbCBQVUJMSUMgRXBsSWRlbnR1Q2JJZGVudFJlc3BvbnNlKHRFcGxGcmFtZUluZm8gKiBwRnJhbWVJbmZvX3ApOworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgIFAgVSBCIEwgSSBDICAgRiBVIE4gQyBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsSWRlbnR1SW5pdAorLy8KKy8vIERlc2NyaXB0aW9uOiBpbml0IGZpcnN0IGluc3RhbmNlIG9mIHRoZSBtb2R1bGUKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6CisvLworLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICA9IGVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMgRXBsSWRlbnR1SW5pdCgpCit7CisJdEVwbEtlcm5lbCBSZXQ7CisKKwlSZXQgPSBFcGxJZGVudHVBZGRJbnN0YW5jZSgpOworCisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsSWRlbnR1QWRkSW5zdGFuY2UKKy8vCisvLyBEZXNjcmlwdGlvbjogaW5pdCBvdGhlciBpbnN0YW5jZXMgb2YgdGhlIG1vZHVsZQorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczoKKy8vCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgID0gZXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxJZGVudHVBZGRJbnN0YW5jZSgpCit7CisJdEVwbEtlcm5lbCBSZXQ7CisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCS8vIHJlc2V0IGluc3RhbmNlIHN0cnVjdHVyZQorCUVQTF9NRU1TRVQoJkVwbElkZW50dUluc3RhbmNlX2csIDAsIHNpemVvZihFcGxJZGVudHVJbnN0YW5jZV9nKSk7CisKKwkvLyByZWdpc3RlciBJZGVudFJlc3BvbnNlIGNhbGxiYWNrIGZ1bmN0aW9uCisJUmV0ID0KKwkgICAgRXBsRGxsdUNhbFJlZ0FzbmRTZXJ2aWNlKGtFcGxEbGxBc25kSWRlbnRSZXNwb25zZSwKKwkJCQkgICAgIEVwbElkZW50dUNiSWRlbnRSZXNwb25zZSwKKwkJCQkgICAgIGtFcGxEbGxBc25kRmlsdGVyQW55KTsKKworCXJldHVybiBSZXQ7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsSWRlbnR1RGVsSW5zdGFuY2UKKy8vCisvLyBEZXNjcmlwdGlvbjogZGVsZXRlIGluc3RhbmNlCisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOgorLy8KKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgPSBlcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbElkZW50dURlbEluc3RhbmNlKCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKworCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJLy8gZGVyZWdpc3RlciBJZGVudFJlc3BvbnNlIGNhbGxiYWNrIGZ1bmN0aW9uCisJUmV0ID0KKwkgICAgRXBsRGxsdUNhbFJlZ0FzbmRTZXJ2aWNlKGtFcGxEbGxBc25kSWRlbnRSZXNwb25zZSwgTlVMTCwKKwkJCQkgICAgIGtFcGxEbGxBc25kRmlsdGVyTm9uZSk7CisKKwlSZXQgPSBFcGxJZGVudHVSZXNldCgpOworCisJcmV0dXJuIFJldDsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxJZGVudHVSZXNldAorLy8KKy8vIERlc2NyaXB0aW9uOiByZXNldHMgdGhpcyBpbnN0YW5jZQorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczoKKy8vCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgID0gZXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxJZGVudHVSZXNldCgpCit7CisJdEVwbEtlcm5lbCBSZXQ7CisJaW50IGlJbmRleDsKKworCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJZm9yIChpSW5kZXggPSAwOworCSAgICAgaUluZGV4IDwgdGFiZW50cmllcyhFcGxJZGVudHVJbnN0YW5jZV9nLm1fYXBJZGVudFJlc3BvbnNlKTsKKwkgICAgIGlJbmRleCsrKSB7CisJCWlmIChFcGxJZGVudHVJbnN0YW5jZV9nLm1fYXBJZGVudFJlc3BvbnNlW2lJbmRleF0gIT0gTlVMTCkgewkvLyBmcmVlIG1lbW9yeQorCQkJRVBMX0ZSRUUoRXBsSWRlbnR1SW5zdGFuY2VfZy5tX2FwSWRlbnRSZXNwb25zZVtpSW5kZXhdKTsKKwkJfQorCX0KKworCUVQTF9NRU1TRVQoJkVwbElkZW50dUluc3RhbmNlX2csIDAsIHNpemVvZihFcGxJZGVudHVJbnN0YW5jZV9nKSk7CisKKwlyZXR1cm4gUmV0OworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbElkZW50dUdldElkZW50UmVzcG9uc2UKKy8vCisvLyBEZXNjcmlwdGlvbjogcmV0dXJucyB0aGUgSWRlbnRSZXNwb25zZSBmb3IgdGhlIHNwZWNpZmllZCBub2RlLgorLy8KKy8vIFBhcmFtZXRlcnM6ICB1aU5vZGVJZF9wICAgICAgICAgICAgICAgICAgPSBJTjogbm9kZSBJRAorLy8gICAgICAgICAgICAgIHBwSWRlbnRSZXNwb25zZV9wICAgICAgICAgICA9IE9VVDogcG9pbnRlciB0byBwb2ludGVyIG9mIElkZW50UmVzcG9uc2UKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcXVhbHMgTlVMTCwgaWYgbm8gSWRlbnRSZXNwb25zZSBhdmFpbGFibGUKKy8vCisvLyBSZXR1cm46ICAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vIFN0YXRlOiAgICAgICBub3QgdGVzdGVkCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsSWRlbnR1R2V0SWRlbnRSZXNwb25zZSh1bnNpZ25lZCBpbnQgdWlOb2RlSWRfcCwKKwkJCQkJICAgIHRFcGxJZGVudFJlc3BvbnNlICoqCisJCQkJCSAgICBwcElkZW50UmVzcG9uc2VfcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKworCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJLy8gZGVjcmVtZW50IG5vZGUgSUQsIGJlY2F1c2UgYXJyYXkgaXMgemVybyBiYXNlZAorCXVpTm9kZUlkX3AtLTsKKwlpZiAodWlOb2RlSWRfcCA8IHRhYmVudHJpZXMoRXBsSWRlbnR1SW5zdGFuY2VfZy5tX2FwSWRlbnRSZXNwb25zZSkpIHsKKwkJKnBwSWRlbnRSZXNwb25zZV9wID0KKwkJICAgIEVwbElkZW50dUluc3RhbmNlX2cubV9hcElkZW50UmVzcG9uc2VbdWlOb2RlSWRfcF07CisJfSBlbHNlIHsJCS8vIGludmFsaWQgbm9kZSBJRCBzcGVjaWZpZWQKKwkJKnBwSWRlbnRSZXNwb25zZV9wID0gTlVMTDsKKwkJUmV0ID0ga0VwbEludmFsaWROb2RlSWQ7CisJfQorCisJcmV0dXJuIFJldDsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxJZGVudHVSZXF1ZXN0SWRlbnRSZXNwb25zZQorLy8KKy8vIERlc2NyaXB0aW9uOiByZXR1cm5zIHRoZSBJZGVudFJlc3BvbnNlIGZvciB0aGUgc3BlY2lmaWVkIG5vZGUuCisvLworLy8gUGFyYW1ldGVyczogIHVpTm9kZUlkX3AgICAgICAgICAgICAgICAgICA9IElOOiBub2RlIElECisvLyAgICAgICAgICAgICAgcGZuQ2JSZXNwb25zZV9wICAgICAgICAgICAgID0gSU46IGZ1bmN0aW9uIHBvaW50ZXIgdG8gY2FsbGJhY2sgZnVuY3Rpb24KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaCB3aWxsIGJlIGNhbGxlZCBpZiBJZGVudFJlc3BvbnNlIGlzIHJlY2VpdmVkCisvLworLy8gUmV0dXJuOiAgICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLyBTdGF0ZTogICAgICAgbm90IHRlc3RlZAorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbElkZW50dVJlcXVlc3RJZGVudFJlc3BvbnNlKHVuc2lnbmVkIGludCB1aU5vZGVJZF9wLAorCQkJCQkJdEVwbElkZW50dUNiUmVzcG9uc2UKKwkJCQkJCXBmbkNiUmVzcG9uc2VfcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKworCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJLy8gZGVjcmVtZW50IG5vZGUgSUQsIGJlY2F1c2UgYXJyYXkgaXMgemVybyBiYXNlZAorCXVpTm9kZUlkX3AtLTsKKwlpZiAodWlOb2RlSWRfcCA8IHRhYmVudHJpZXMoRXBsSWRlbnR1SW5zdGFuY2VfZy5tX2FwZm5DYlJlc3BvbnNlKSkgeworI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRfTU4pKSAhPSAwKQorCQlpZiAoRXBsSWRlbnR1SW5zdGFuY2VfZy5tX2FwZm5DYlJlc3BvbnNlW3VpTm9kZUlkX3BdICE9IE5VTEwpIHsJLy8gcmVxdWVzdCBhbHJlYWR5IGlzc3VlZCAobWF5YmUgYnkgc29tZW9uZSBlbHNlKQorCQkJUmV0ID0ga0VwbEludmFsaWRPcGVyYXRpb247CisJCX0gZWxzZSB7CisJCQlFcGxJZGVudHVJbnN0YW5jZV9nLm1fYXBmbkNiUmVzcG9uc2VbdWlOb2RlSWRfcF0gPQorCQkJICAgIHBmbkNiUmVzcG9uc2VfcDsKKwkJCVJldCA9CisJCQkgICAgRXBsRGxsdUNhbElzc3VlUmVxdWVzdChrRXBsRGxsUmVxU2VydmljZUlkZW50LAorCQkJCQkJICAgKHVpTm9kZUlkX3AgKyAxKSwgMHhGRik7CisJCX0KKyNlbHNlCisJCVJldCA9IGtFcGxJbnZhbGlkT3BlcmF0aW9uOworI2VuZGlmCisJfSBlbHNlIHsJCS8vIGludmFsaWQgbm9kZSBJRCBzcGVjaWZpZWQKKwkJUmV0ID0ga0VwbEludmFsaWROb2RlSWQ7CisJfQorCisJcmV0dXJuIFJldDsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxJZGVudHVHZXRSdW5uaW5nUmVxdWVzdHMKKy8vCisvLyBEZXNjcmlwdGlvbjogcmV0dXJucyBhIGJpdCBmaWVsZCB3aXRoIHRoZSBydW5uaW5nIHJlcXVlc3RzIGZvciBub2RlLUlEIDEtMzIKKy8vICAgICAgICAgICAgICBqdXN0IGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMKKy8vCisvLworLy8gUGFyYW1ldGVyczoKKy8vCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgID0gZXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0VQTERMTEVYUE9SVCBEV09SRCBQVUJMSUMgRXBsSWRlbnR1R2V0UnVubmluZ1JlcXVlc3RzKHZvaWQpCit7CisJRFdPUkQgZHdSZXFzID0gMDsKKwl1bnNpZ25lZCBpbnQgdWlJbmRleDsKKworCWZvciAodWlJbmRleCA9IDA7IHVpSW5kZXggPCAzMjsgdWlJbmRleCsrKSB7CisJCWlmIChFcGxJZGVudHVJbnN0YW5jZV9nLm1fYXBmbkNiUmVzcG9uc2VbdWlJbmRleF0gIT0gTlVMTCkgeworCQkJZHdSZXFzIHw9ICgxIDw8IHVpSW5kZXgpOworCQl9CisJfQorCisJcmV0dXJuIGR3UmVxczsKK30KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICBQIFIgSSBWIEEgVCBFICAgRiBVIE4gQyBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbElkZW50dUNiSWRlbnRSZXNwb25zZQorLy8KKy8vIERlc2NyaXB0aW9uOiBjYWxsYmFjayBmdW5rdGlvbiBmb3IgSWRlbnRSZXNwb25zZQorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczogIHBGcmFtZUluZm9fcCAgICAgICAgICAgID0gRnJhbWUgd2l0aCB0aGUgSWRlbnRSZXNwb25zZQorLy8KKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB0RXBsS2VybmVsIFBVQkxJQyBFcGxJZGVudHVDYklkZW50UmVzcG9uc2UodEVwbEZyYW1lSW5mbyAqIHBGcmFtZUluZm9fcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCXVuc2lnbmVkIGludCB1aU5vZGVJZDsKKwl1bnNpZ25lZCBpbnQgdWlJbmRleDsKKwl0RXBsSWRlbnR1Q2JSZXNwb25zZSBwZm5DYlJlc3BvbnNlOworCisJdWlOb2RlSWQgPSBBbWlHZXRCeXRlRnJvbUxlKCZwRnJhbWVJbmZvX3AtPm1fcEZyYW1lLT5tX2xlX2JTcmNOb2RlSWQpOworCisJdWlJbmRleCA9IHVpTm9kZUlkIC0gMTsKKworCWlmICh1aUluZGV4IDwgdGFiZW50cmllcyhFcGxJZGVudHVJbnN0YW5jZV9nLm1fYXBmbkNiUmVzcG9uc2UpKSB7CisJCS8vIG1lbW9yaXplIHBvaW50ZXIgdG8gY2FsbGJhY2sgZnVuY3Rpb24KKwkJcGZuQ2JSZXNwb25zZSA9IEVwbElkZW50dUluc3RhbmNlX2cubV9hcGZuQ2JSZXNwb25zZVt1aUluZGV4XTsKKwkJLy8gcmVzZXQgY2FsbGJhY2sgZnVuY3Rpb24gcG9pbnRlciBzbyB0aGF0IGNhbGxlciBtYXkgaXNzdWUgbmV4dCByZXF1ZXN0IGltbWVkaWF0ZWx5CisJCUVwbElkZW50dUluc3RhbmNlX2cubV9hcGZuQ2JSZXNwb25zZVt1aUluZGV4XSA9IE5VTEw7CisKKwkJaWYgKHBGcmFtZUluZm9fcC0+bV91aUZyYW1lU2l6ZSA8IEVQTF9DX0RMTF9NSU5TSVpFX0lERU5UUkVTKSB7CS8vIElkZW50UmVzcG9uc2Ugbm90IHJlY2VpdmVkIG9yIGl0IGhhcyBpbnZhbGlkIHNpemUKKwkJCWlmIChwZm5DYlJlc3BvbnNlID09IE5VTEwpIHsJLy8gcmVzcG9uc2Ugd2FzIG5vdCByZXF1ZXN0ZWQKKwkJCQlnb3RvIEV4aXQ7CisJCQl9CisJCQlSZXQgPSBwZm5DYlJlc3BvbnNlKHVpTm9kZUlkLCBOVUxMKTsKKwkJfSBlbHNlIHsJLy8gSWRlbnRSZXNwb25zZSByZWNlaXZlZAorCQkJaWYgKEVwbElkZW50dUluc3RhbmNlX2cubV9hcElkZW50UmVzcG9uc2VbdWlJbmRleF0gPT0gTlVMTCkgewkvLyBtZW1vcnkgZm9yIElkZW50UmVzcG9uc2UgbXVzdCBiZSBhbGxvY2F0ZWQKKwkJCQlFcGxJZGVudHVJbnN0YW5jZV9nLm1fYXBJZGVudFJlc3BvbnNlW3VpSW5kZXhdID0KKwkJCQkgICAgRVBMX01BTExPQyhzaXplb2YodEVwbElkZW50UmVzcG9uc2UpKTsKKwkJCQlpZiAoRXBsSWRlbnR1SW5zdGFuY2VfZy5tX2FwSWRlbnRSZXNwb25zZVt1aUluZGV4XSA9PSBOVUxMKSB7CS8vIG1hbGxvYyBmYWlsZWQKKwkJCQkJaWYgKHBmbkNiUmVzcG9uc2UgPT0gTlVMTCkgewkvLyByZXNwb25zZSB3YXMgbm90IHJlcXVlc3RlZAorCQkJCQkJZ290byBFeGl0OworCQkJCQl9CisJCQkJCVJldCA9CisJCQkJCSAgICBwZm5DYlJlc3BvbnNlKHVpTm9kZUlkLAorCQkJCQkJCSAgJnBGcmFtZUluZm9fcC0+CisJCQkJCQkJICBtX3BGcmFtZS0+bV9EYXRhLgorCQkJCQkJCSAgbV9Bc25kLm1fUGF5bG9hZC4KKwkJCQkJCQkgIG1fSWRlbnRSZXNwb25zZSk7CisJCQkJCWdvdG8gRXhpdDsKKwkJCQl9CisJCQl9CisJCQkvLyBjb3B5IElkZW50UmVzcG9uc2UgdG8gaW5zdGFuY2Ugc3RydWN0dXJlCisJCQlFUExfTUVNQ1BZKEVwbElkZW50dUluc3RhbmNlX2cuCisJCQkJICAgbV9hcElkZW50UmVzcG9uc2VbdWlJbmRleF0sCisJCQkJICAgJnBGcmFtZUluZm9fcC0+bV9wRnJhbWUtPm1fRGF0YS5tX0FzbmQuCisJCQkJICAgbV9QYXlsb2FkLm1fSWRlbnRSZXNwb25zZSwKKwkJCQkgICBzaXplb2YodEVwbElkZW50UmVzcG9uc2UpKTsKKwkJCWlmIChwZm5DYlJlc3BvbnNlID09IE5VTEwpIHsJLy8gcmVzcG9uc2Ugd2FzIG5vdCByZXF1ZXN0ZWQKKwkJCQlnb3RvIEV4aXQ7CisJCQl9CisJCQlSZXQgPQorCQkJICAgIHBmbkNiUmVzcG9uc2UodWlOb2RlSWQsCisJCQkJCSAgRXBsSWRlbnR1SW5zdGFuY2VfZy4KKwkJCQkJICBtX2FwSWRlbnRSZXNwb25zZVt1aUluZGV4XSk7CisJCX0KKwl9CisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIFJldDsKK30KKworLy8gRU9GCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbEluYy5oIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxJbmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43N2Y5M2QxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxJbmMuaApAQCAtMCwwICsxLDM4NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIGJhc2ljIGluY2x1ZGUgZmlsZSBmb3IgaW50ZXJuYWwgRVBMIHN0YWNrIG1vZHVsZXMKKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgICAgICAgICRSQ1NmaWxlOiBFcGxJbmMuaCx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuOCAkICAkRGF0ZTogMjAwOC8xMS8xNyAxNjo0MDozOSAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICAgICAgR0NDIFYzLjQKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUmV2aXNpb24gSGlzdG9yeToKKworICAyMDA2LzA1LzIyIGQuay46ICAgc3RhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uLCB2ZXJzaW9uIDEuMDAKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfRVBMX0lOQ19IXworI2RlZmluZSBfRVBMX0lOQ19IXworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBpbmNsdWRlIGZpbGVzCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjaWYgZGVmaW5lZChXSU4zMikgfHwgZGVmaW5lZChfV0lOMzIpCisKKyNpZmRlZiBVTkRFUl9SVFNTCisJLy8gUlRYIGhlYWRlcgorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNpbmNsdWRlIDxwcm9jZXNzLmg+CisjaW5jbHVkZSA8cnRhcGkuaD4KKworI2VsaWYgX19CT1JMQU5EQ19fCisJLy8gYm9ybGFuZCBDIGhlYWRlcgorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNpbmNsdWRlIDxwcm9jZXNzLmg+CisKKyNlbGlmIFdJTkNFCisjaW5jbHVkZSA8d2luZG93cy5oPgorCisjZWxzZQorCS8vIE1TVkMgbmVlZHMgdG8gaW5jbHVkZSB3aW5kb3dzLmggYXQgZmlyc3QKKwkvLyB0aGUgZm9sbG93aW5nIGRlZmluZXMgYXIgbmVjZXNzYXJ5IGZvciBmdW5jdGlvbiBwcm90b3R5cGVzIGZvciB3YWl0YWJsZSB0aW1lcnMKKyNkZWZpbmUgX1dJTjMyX1dJTkRPV1MgMHgwNDAxCisjZGVmaW5lIF9XSU4zMl9XSU5OVCAgIDB4MDQwMAorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNpbmNsdWRlIDxwcm9jZXNzLmg+CisjZW5kaWYKKworI2VuZGlmCisKKy8vIGRlZmluZXMgZm9yIG1vZHVsZSBpbnRlZ3JhdGlvbgorLy8gcG9zc2libGUgb3RoZXIgaW5jbHVkZSBmaWxlIG5lZWRlZAorLy8gVGhlc2UgY29uc3RhbnRzIGRlZmluZXMgbW9kdWxlcyB3aGljaCBjYW4gYmUgaW5jbHVkZWQgaW4gdGhlIEVwbCBhcHBsaWNhdGlvbi4KKy8vIFVzZSB0aGlzIGNvbnN0YW50cyBmb3IgZGVmaW5lIEVQTF9NT0RVTEVfSU5URUdSQVRJT04gaW4gZmlsZSBFcGxDZmcuaC4KKyNkZWZpbmUgRVBMX01PRFVMRV9PQkRLICAgICAgICAweDAwMDAwMDAxTAkvLyBPQkQga2VybmVsIHBhcnQgbW9kdWxlCisjZGVmaW5lIEVQTF9NT0RVTEVfUERPSyAgICAgICAgMHgwMDAwMDAwMkwJLy8gUERPIGtlcm5lbCBwYXJ0IG1vZHVsZQorI2RlZmluZSBFUExfTU9EVUxFX05NVF9NTiAgICAgIDB4MDAwMDAwMDRMCS8vIE5NVCBNTiBtb2R1bGUKKyNkZWZpbmUgRVBMX01PRFVMRV9TRE9TICAgICAgICAweDAwMDAwMDA4TAkvLyBTRE8gU2VydmVyIG1vZHVsZQorI2RlZmluZSBFUExfTU9EVUxFX1NET0MgICAgICAgIDB4MDAwMDAwMTBMCS8vIFNETyBDbGllbnQgbW9kdWxlCisjZGVmaW5lIEVQTF9NT0RVTEVfU0RPX0FTTkQgICAgMHgwMDAwMDAyMEwJLy8gU0RPIG92ZXIgQXNuZCBtb2R1bGUKKyNkZWZpbmUgRVBMX01PRFVMRV9TRE9fVURQICAgICAweDAwMDAwMDQwTAkvLyBTRE8gb3ZlciBVRFAgbW9kdWxlCisjZGVmaW5lIEVQTF9NT0RVTEVfU0RPX1BETyAgICAgMHgwMDAwMDA4MEwJLy8gU0RPIGluIFBETyBtb2R1bGUKKyNkZWZpbmUgRVBMX01PRFVMRV9OTVRfQ04gICAgICAweDAwMDAwMTAwTAkvLyBOTVQgQ04gbW9kdWxlCisjZGVmaW5lIEVQTF9NT0RVTEVfTk1UVSAgICAgICAgMHgwMDAwMDIwMEwJLy8gTk1UIHVzZXIgcGFydCBtb2R1bGUKKyNkZWZpbmUgRVBMX01PRFVMRV9OTVRLICAgICAgICAweDAwMDAwNDAwTAkvLyBOTVQga2VybmVsIHBhcnQgbW9kdWxlCisjZGVmaW5lIEVQTF9NT0RVTEVfRExMSyAgICAgICAgMHgwMDAwMDgwMEwJLy8gRExMIGtlcm5lbCBwYXJ0IG1vZHVsZQorI2RlZmluZSBFUExfTU9EVUxFX0RMTFUgICAgICAgIDB4MDAwMDEwMDBMCS8vIERMTCB1c2VyIHBhcnQgbW9kdWxlCisjZGVmaW5lIEVQTF9NT0RVTEVfT0JEVSAgICAgICAgMHgwMDAwMjAwMEwJLy8gT0JEIHVzZXIgcGFydCBtb2R1bGUKKyNkZWZpbmUgRVBMX01PRFVMRV9DRkdNQSAgICAgICAweDAwMDA0MDAwTAkvLyBDb25maWd1YXJ0aW9hbiBNYW5hZ2VyIG1vZHVsZQorI2RlZmluZSBFUExfTU9EVUxFX1ZFVEggICAgICAgIDB4MDAwMDgwMDBMCS8vIHZpcnR1YWwgZXRoZXJuZXQgZHJpdmVyIG1vZHVsZQorI2RlZmluZSBFUExfTU9EVUxFX1BET1UgICAgICAgIDB4MDAwMTAwMDBMCS8vIFBETyB1c2VyIHBhcnQgbW9kdWxlCisjZGVmaW5lIEVQTF9NT0RVTEVfTEVEVSAgICAgICAgMHgwMDAyMDAwMEwJLy8gTEVEIHVzZXIgcGFydCBtb2R1bGUKKworI2luY2x1ZGUgIkVwbENmZy5oIgkJLy8gRVBMIGNvbmZpZ3VyYXRpb24gZmlsZSAoY29uZmlndXJhdGlvbiBmcm9tIGFwcGxpY2F0aW9uKQorCisjaW5jbHVkZSAiZ2xvYmFsLmgiCQkvLyBnbG9iYWwgZGVmaW5pdGlvbnMKKworI2luY2x1ZGUgIkVwbERlZi5oIgkJLy8gRVBMIGNvbmZpZ3VyYXRpb24gZmlsZSAoZGVmYXVsdCBjb25maWd1cmF0aW9uKQorI2luY2x1ZGUgIkVwbEluc3REZWYuaCIJCS8vIGRlZmluZXMgbWFjcm9zIGZvciBpbnN0YW5jZSB0eXBlcyBhbmQgdGFibGUKKyNpbmNsdWRlICJEZWJ1Zy5oIgkJLy8gZGVidWcgZGVmaW5pdGlvbnMKKworI2luY2x1ZGUgIkVwbEVyckRlZi5oIgkJLy8gRVBMIGVycm9yIGNvZGVzIGZvciBBUEkgZnVudGlvbnMKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHR5cGVkZWYKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIElFRUUgMTU4OCBjb25mb3JtYW50IG5ldCB0aW1lIHN0cnVjdHVyZQordHlwZWRlZiBzdHJ1Y3QgeworCURXT1JEIG1fZHdTZWM7CisJRFdPUkQgbV9kd05hbm9TZWM7CisKK30gdEVwbE5ldFRpbWU7CisKKyNpbmNsdWRlICJFcGxUYXJnZXQuaCIJCS8vIHRhcmdldCBzcGVjaWZpYyBmdW5jdGlvbnMgYW5kIGRlZmluaXRpb25zCisKKyNpbmNsdWRlICJFcGxBbWkuaCIKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbWFjcm9zCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNkZWZpbmUgRVBMX1NQRUNfVkVSU0lPTiAgICAgICAgICAgICAgICAgICAgMHgyMAkvLyBFVEhFUk5FVCBQb3dlcmxpbmsgVi4gMi4wCisjZGVmaW5lIEVQTF9TVEFDS19WRVJTSU9OKHZlcixyZXYscmVsKSAgICAgICgoKChEV09SRCkodmVyKSkgJiAweEZGKXwoKCgoRFdPUkQpKHJldikpJjB4RkYpPDw4KXwoKChEV09SRCkocmVsKSk8PDE2KSkKKyNkZWZpbmUgRVBMX09CSjEwMThfVkVSU0lPTih2ZXIscmV2LHJlbCkgICAgKCgoKERXT1JEKSh2ZXIpKTw8MTYpIHwoKChEV09SRCkocmV2KSkmMHhGRkZGKSkKKyNkZWZpbmUgRVBMX1NUUklOR19WRVJTSU9OKHZlcixyZXYscmVsKSAgICAgIlYiICN2ZXIgIi4iICNyZXYgIiByIiAjcmVsCisKKyNpbmNsdWRlICJFcGxWZXJzaW9uLmgiCisKKy8vIGRlZmluZXMgZm9yIEVQTCBGZWF0dXJlRmxhZ3MKKyNkZWZpbmUgRVBMX0ZFQVRVUkVfSVNPQ0hSICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgRVBMX0ZFQVRVUkVfU0RPX1VEUCAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgRVBMX0ZFQVRVUkVfU0RPX0FTTkQgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgRVBMX0ZFQVRVUkVfU0RPX1BETyAgICAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgRVBMX0ZFQVRVUkVfTk1UX0lORk8gICAgICAgIDB4MDAwMDAwMTAKKyNkZWZpbmUgRVBMX0ZFQVRVUkVfTk1UX0VYVCAgICAgICAgIDB4MDAwMDAwMjAKKyNkZWZpbmUgRVBMX0ZFQVRVUkVfUERPX0RZTiAgICAgICAgIDB4MDAwMDAwNDAKKyNkZWZpbmUgRVBMX0ZFQVRVUkVfTk1UX1VEUCAgICAgICAgIDB4MDAwMDAwODAKKyNkZWZpbmUgRVBMX0ZFQVRVUkVfQ0ZHTUEgICAgICAgICAgIDB4MDAwMDAxMDAKKyNkZWZpbmUgRVBMX0ZFQVRVUkVfRExMX01VTFRJUExFWCAgIDB4MDAwMDAyMDAKKyNkZWZpbmUgRVBMX0ZFQVRVUkVfTk9ERUlEX1NXICAgICAgIDB4MDAwMDA0MDAKKyNkZWZpbmUgRVBMX0ZFQVRVUkVfTk1UX0JBU0lDRVRIICAgIDB4MDAwMDA4MDAKKyNkZWZpbmUgRVBMX0ZFQVRVUkVfUlQxICAgICAgICAgICAgIDB4MDAwMDEwMDAKKyNkZWZpbmUgRVBMX0ZFQVRVUkVfUlQyICAgICAgICAgICAgIDB4MDAwMDIwMDAKKworLy8gZ2VuZXJhdGUgRVBMIE5NVF9GZWF0dXJlRmxhZ3NfVTMyCisjaWZuZGVmIEVQTF9ERUZfRkVBVFVSRV9JU09DSFIKKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX0RMTEspKSAhPSAwKQorI2RlZmluZSBFUExfREVGX0ZFQVRVUkVfSVNPQ0hSICAgICAgICAgIChFUExfRkVBVFVSRV9JU09DSFIpCisjZWxzZQorI2RlZmluZSBFUExfREVGX0ZFQVRVUkVfSVNPQ0hSICAgICAgICAgIDAKKyNlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgRVBMX0RFRl9GRUFUVVJFX1NET19BU05ECisjaWYgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9TRE9fQVNORCkpICE9IDApCisjZGVmaW5lIEVQTF9ERUZfRkVBVFVSRV9TRE9fQVNORCAgICAgICAgKEVQTF9GRUFUVVJFX1NET19BU05EKQorI2Vsc2UKKyNkZWZpbmUgRVBMX0RFRl9GRUFUVVJFX1NET19BU05EICAgICAgICAwCisjZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIEVQTF9ERUZfRkVBVFVSRV9TRE9fVURQCisjaWYgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9TRE9fVURQKSkgIT0gMCkKKyNkZWZpbmUgRVBMX0RFRl9GRUFUVVJFX1NET19VRFAgICAgICAgICAoRVBMX0ZFQVRVUkVfU0RPX1VEUCkKKyNlbHNlCisjZGVmaW5lIEVQTF9ERUZfRkVBVFVSRV9TRE9fVURQICAgICAgICAgMAorI2VuZGlmCisjZW5kaWYKKworI2lmbmRlZiBFUExfREVGX0ZFQVRVUkVfU0RPX1BETworI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfU0RPX1BETykpICE9IDApCisjZGVmaW5lIEVQTF9ERUZfRkVBVFVSRV9TRE9fUERPICAgICAgICAgKEVQTF9GRUFUVVJFX1NET19QRE8pCisjZWxzZQorI2RlZmluZSBFUExfREVGX0ZFQVRVUkVfU0RPX1BETyAgICAgICAgIDAKKyNlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgRVBMX0RFRl9GRUFUVVJFX1BET19EWU4KKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1BET0spKSAhPSAwKQorI2RlZmluZSBFUExfREVGX0ZFQVRVUkVfUERPX0RZTiAgICAgICAgIChFUExfRkVBVFVSRV9QRE9fRFlOKQorI2Vsc2UKKyNkZWZpbmUgRVBMX0RFRl9GRUFUVVJFX1BET19EWU4gICAgICAgICAwCisjZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIEVQTF9ERUZfRkVBVFVSRV9DRkdNQQorI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfQ0ZHTUEpKSAhPSAwKQorI2RlZmluZSBFUExfREVGX0ZFQVRVUkVfQ0ZHTUEgICAgICAgICAgIChFUExfRkVBVFVSRV9DRkdNQSkKKyNlbHNlCisjZGVmaW5lIEVQTF9ERUZfRkVBVFVSRV9DRkdNQSAgICAgICAgICAgMAorI2VuZGlmCisjZW5kaWYKKworI2RlZmluZSBFUExfREVGX0ZFQVRVUkVfRkxBR1MgICAgICAgICAgICAgICAgICAgKEVQTF9ERUZfRkVBVFVSRV9JU09DSFIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBFUExfREVGX0ZFQVRVUkVfU0RPX0FTTkQgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBFUExfREVGX0ZFQVRVUkVfU0RPX1VEUCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEVQTF9ERUZfRkVBVFVSRV9TRE9fUERPIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRVBMX0RFRl9GRUFUVVJFX1BET19EWU4gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBFUExfREVGX0ZFQVRVUkVfQ0ZHTUEpCisKKyNpZm5kZWYgdGFiZW50cmllcworI2RlZmluZSB0YWJlbnRyaWVzKGEpICAgKHNpemVvZihhKS9zaXplb2YoKihhKSkpCisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvbnN0IGRlZmluZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIGRlZmluaXRpb25zIGZvciBETEwgZXhwb3J0CisjaWYgKChERVZfU1lTVEVNID09IF9ERVZfV0lOMzJfKSB8fCAoREVWX1NZU1RFTSA9PSBfREVWX1dJTl9DRV8pKSAmJiBkZWZpbmVkIChDT1BfTElCKQorCisjZGVmaW5lIEVQTERMTEVYUE9SVCAgICBfX2RlY2xzcGVjIChkbGxleHBvcnQpCisKKyNlbHNlCisKKyNkZWZpbmUgRVBMRExMRVhQT1JUCisKKyNlbmRpZgorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBjb21tb24gZGVidWcgbWFjcm9zCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBmb3IgdXNpbmcgbWFjcm8gREVCVUdfVFJBQ0V4KCkKKy8vCisvLyBFeGFtcGxlOgorLy8gICAgICBERUJVR19UUkFDRTEgKEVQTF9EQkdMVkxfT0JELCAiVmFsdWUgaXMgJWRcbiIgLCB3T2JqZWN0SW5kZXgpOworLy8KKy8vIFRoaXMgbWVzc2FnZSBvbmx5IHdpbGwgYmUgcHJpbnRlZCBpZjoKKy8vICAgICAgLSBOREVCVUcgaXMgbm90IGRlZmluZWQgICAgIEFORCAhISEKKy8vICAgICAgLSBmbGFnIDB4MDAwMDAwMDRMIGlzIHNldCBpbiBERUZfREVCVUdfTFZMIChjYW4gYmUgZGVmaW5lZCBpbiBjb3BjZmcuaCkKKy8vCisvLyBkZWZhdWx0IGxldmVsIGlzIGRlZmluZWQgaW4gY29wZGVmLmgKKworLy8gZGVidWctbGV2ZWwgYW5kIFRSQUNFLW1hY3JvcyAgICAgICAgIC8vIHN0YW5kYXJkLWxldmVsICAgLy8gZmxhZ3MgZm9yIERFRl9ERUJVR19MVkwKKyNkZWZpbmUgRVBMX0RCR0xWTF9FRFJWICAgICAgICAgICAgICAgICBERUJVR19MVkxfMDEJLy8gMHgwMDAwMDAwMUwKKyNkZWZpbmUgRVBMX0RCR0xWTF9FRFJWX1RSQUNFMCAgICAgICAgICBERUJVR19MVkxfMDFfVFJBQ0UwCisjZGVmaW5lIEVQTF9EQkdMVkxfRURSVl9UUkFDRTEgICAgICAgICAgREVCVUdfTFZMXzAxX1RSQUNFMQorI2RlZmluZSBFUExfREJHTFZMX0VEUlZfVFJBQ0UyICAgICAgICAgIERFQlVHX0xWTF8wMV9UUkFDRTIKKyNkZWZpbmUgRVBMX0RCR0xWTF9FRFJWX1RSQUNFMyAgICAgICAgICBERUJVR19MVkxfMDFfVFJBQ0UzCisjZGVmaW5lIEVQTF9EQkdMVkxfRURSVl9UUkFDRTQgICAgICAgICAgREVCVUdfTFZMXzAxX1RSQUNFNAorCisjZGVmaW5lIEVQTF9EQkdMVkxfRExMICAgICAgICAgICAgICAgICAgREVCVUdfTFZMXzAyCS8vIDB4MDAwMDAwMDJMCisjZGVmaW5lIEVQTF9EQkdMVkxfRExMX1RSQUNFMCAgICAgICAgICAgREVCVUdfTFZMXzAyX1RSQUNFMAorI2RlZmluZSBFUExfREJHTFZMX0RMTF9UUkFDRTEgICAgICAgICAgIERFQlVHX0xWTF8wMl9UUkFDRTEKKyNkZWZpbmUgRVBMX0RCR0xWTF9ETExfVFJBQ0UyICAgICAgICAgICBERUJVR19MVkxfMDJfVFJBQ0UyCisjZGVmaW5lIEVQTF9EQkdMVkxfRExMX1RSQUNFMyAgICAgICAgICAgREVCVUdfTFZMXzAyX1RSQUNFMworI2RlZmluZSBFUExfREJHTFZMX0RMTF9UUkFDRTQgICAgICAgICAgIERFQlVHX0xWTF8wMl9UUkFDRTQKKworI2RlZmluZSBFUExfREJHTFZMX09CRCAgICAgICAgICAgICAgICAgIERFQlVHX0xWTF8wMwkvLyAweDAwMDAwMDA0TAorI2RlZmluZSBFUExfREJHTFZMX09CRF9UUkFDRTAgICAgICAgICAgIERFQlVHX0xWTF8wM19UUkFDRTAKKyNkZWZpbmUgRVBMX0RCR0xWTF9PQkRfVFJBQ0UxICAgICAgICAgICBERUJVR19MVkxfMDNfVFJBQ0UxCisjZGVmaW5lIEVQTF9EQkdMVkxfT0JEX1RSQUNFMiAgICAgICAgICAgREVCVUdfTFZMXzAzX1RSQUNFMgorI2RlZmluZSBFUExfREJHTFZMX09CRF9UUkFDRTMgICAgICAgICAgIERFQlVHX0xWTF8wM19UUkFDRTMKKyNkZWZpbmUgRVBMX0RCR0xWTF9PQkRfVFJBQ0U0ICAgICAgICAgICBERUJVR19MVkxfMDNfVFJBQ0U0CisKKyNkZWZpbmUgRVBMX0RCR0xWTF9OTVRLICAgICAgICAgICAgICAgICBERUJVR19MVkxfMDQJLy8gMHgwMDAwMDAwOEwKKyNkZWZpbmUgRVBMX0RCR0xWTF9OTVRLX1RSQUNFMCAgICAgICAgICBERUJVR19MVkxfMDRfVFJBQ0UwCisjZGVmaW5lIEVQTF9EQkdMVkxfTk1US19UUkFDRTEgICAgICAgICAgREVCVUdfTFZMXzA0X1RSQUNFMQorI2RlZmluZSBFUExfREJHTFZMX05NVEtfVFJBQ0UyICAgICAgICAgIERFQlVHX0xWTF8wNF9UUkFDRTIKKyNkZWZpbmUgRVBMX0RCR0xWTF9OTVRLX1RSQUNFMyAgICAgICAgICBERUJVR19MVkxfMDRfVFJBQ0UzCisjZGVmaW5lIEVQTF9EQkdMVkxfTk1US19UUkFDRTQgICAgICAgICAgREVCVUdfTFZMXzA0X1RSQUNFNAorCisjZGVmaW5lIEVQTF9EQkdMVkxfTk1UQ04gICAgICAgICAgICAgICAgREVCVUdfTFZMXzA1CS8vIDB4MDAwMDAwMTBMCisjZGVmaW5lIEVQTF9EQkdMVkxfTk1UQ05fVFJBQ0UwICAgICAgICAgREVCVUdfTFZMXzA1X1RSQUNFMAorI2RlZmluZSBFUExfREJHTFZMX05NVENOX1RSQUNFMSAgICAgICAgIERFQlVHX0xWTF8wNV9UUkFDRTEKKyNkZWZpbmUgRVBMX0RCR0xWTF9OTVRDTl9UUkFDRTIgICAgICAgICBERUJVR19MVkxfMDVfVFJBQ0UyCisjZGVmaW5lIEVQTF9EQkdMVkxfTk1UQ05fVFJBQ0UzICAgICAgICAgREVCVUdfTFZMXzA1X1RSQUNFMworI2RlZmluZSBFUExfREJHTFZMX05NVENOX1RSQUNFNCAgICAgICAgIERFQlVHX0xWTF8wNV9UUkFDRTQKKworI2RlZmluZSBFUExfREJHTFZMX05NVFUgICAgICAgICAgICAgICAgIERFQlVHX0xWTF8wNgkvLyAweDAwMDAwMDIwTAorI2RlZmluZSBFUExfREJHTFZMX05NVFVfVFJBQ0UwICAgICAgICAgIERFQlVHX0xWTF8wNl9UUkFDRTAKKyNkZWZpbmUgRVBMX0RCR0xWTF9OTVRVX1RSQUNFMSAgICAgICAgICBERUJVR19MVkxfMDZfVFJBQ0UxCisjZGVmaW5lIEVQTF9EQkdMVkxfTk1UVV9UUkFDRTIgICAgICAgICAgREVCVUdfTFZMXzA2X1RSQUNFMgorI2RlZmluZSBFUExfREJHTFZMX05NVFVfVFJBQ0UzICAgICAgICAgIERFQlVHX0xWTF8wNl9UUkFDRTMKKyNkZWZpbmUgRVBMX0RCR0xWTF9OTVRVX1RSQUNFNCAgICAgICAgICBERUJVR19MVkxfMDZfVFJBQ0U0CisKKyNkZWZpbmUgRVBMX0RCR0xWTF9OTVRNTiAgICAgICAgICAgICAgICBERUJVR19MVkxfMDcJLy8gMHgwMDAwMDA0MEwKKyNkZWZpbmUgRVBMX0RCR0xWTF9OTVRNTl9UUkFDRTAgICAgICAgICBERUJVR19MVkxfMDdfVFJBQ0UwCisjZGVmaW5lIEVQTF9EQkdMVkxfTk1UTU5fVFJBQ0UxICAgICAgICAgREVCVUdfTFZMXzA3X1RSQUNFMQorI2RlZmluZSBFUExfREJHTFZMX05NVE1OX1RSQUNFMiAgICAgICAgIERFQlVHX0xWTF8wN19UUkFDRTIKKyNkZWZpbmUgRVBMX0RCR0xWTF9OTVRNTl9UUkFDRTMgICAgICAgICBERUJVR19MVkxfMDdfVFJBQ0UzCisjZGVmaW5lIEVQTF9EQkdMVkxfTk1UTU5fVFJBQ0U0ICAgICAgICAgREVCVUdfTFZMXzA3X1RSQUNFNAorCisvLy4uLgorCisjZGVmaW5lIEVQTF9EQkdMVkxfU0RPICAgICAgICAgICAgICAgICAgREVCVUdfTFZMXzI1CS8vIDB4MDEwMDAwMDAKKyNkZWZpbmUgRVBMX0RCR0xWTF9TRE9fVFJBQ0UwICAgICAgICAgICBERUJVR19MVkxfMjVfVFJBQ0UwCisjZGVmaW5lIEVQTF9EQkdMVkxfU0RPX1RSQUNFMSAgICAgICAgICAgREVCVUdfTFZMXzI1X1RSQUNFMQorI2RlZmluZSBFUExfREJHTFZMX1NET19UUkFDRTIgICAgICAgICAgIERFQlVHX0xWTF8yNV9UUkFDRTIKKyNkZWZpbmUgRVBMX0RCR0xWTF9TRE9fVFJBQ0UzICAgICAgICAgICBERUJVR19MVkxfMjVfVFJBQ0UzCisjZGVmaW5lIEVQTF9EQkdMVkxfU0RPX1RSQUNFNCAgICAgICAgICAgREVCVUdfTFZMXzI1X1RSQUNFNAorCisjZGVmaW5lIEVQTF9EQkdMVkxfVkVUSCAgICAgICAgICAgICAgICAgREVCVUdfTFZMXzI2CS8vIDB4MDIwMDAwMDAKKyNkZWZpbmUgRVBMX0RCR0xWTF9WRVRIX1RSQUNFMCAgICAgICAgICBERUJVR19MVkxfMjZfVFJBQ0UwCisjZGVmaW5lIEVQTF9EQkdMVkxfVkVUSF9UUkFDRTEgICAgICAgICAgREVCVUdfTFZMXzI2X1RSQUNFMQorI2RlZmluZSBFUExfREJHTFZMX1ZFVEhfVFJBQ0UyICAgICAgICAgIERFQlVHX0xWTF8yNl9UUkFDRTIKKyNkZWZpbmUgRVBMX0RCR0xWTF9WRVRIX1RSQUNFMyAgICAgICAgICBERUJVR19MVkxfMjZfVFJBQ0UzCisjZGVmaW5lIEVQTF9EQkdMVkxfVkVUSF9UUkFDRTQgICAgICAgICAgREVCVUdfTFZMXzI2X1RSQUNFNAorCisjZGVmaW5lIEVQTF9EQkdMVkxfRVZFTlRLICAgICAgICAgICAgICAgREVCVUdfTFZMXzI3CS8vIDB4MDQwMDAwMDAKKyNkZWZpbmUgRVBMX0RCR0xWTF9FVkVOVEtfVFJBQ0UwICAgICAgICBERUJVR19MVkxfMjdfVFJBQ0UwCisjZGVmaW5lIEVQTF9EQkdMVkxfRVZFTlRLX1RSQUNFMSAgICAgICAgREVCVUdfTFZMXzI3X1RSQUNFMQorI2RlZmluZSBFUExfREJHTFZMX0VWRU5US19UUkFDRTIgICAgICAgIERFQlVHX0xWTF8yN19UUkFDRTIKKyNkZWZpbmUgRVBMX0RCR0xWTF9FVkVOVEtfVFJBQ0UzICAgICAgICBERUJVR19MVkxfMjdfVFJBQ0UzCisjZGVmaW5lIEVQTF9EQkdMVkxfRVZFTlRLX1RSQUNFNCAgICAgICAgREVCVUdfTFZMXzI3X1RSQUNFNAorCisjZGVmaW5lIEVQTF9EQkdMVkxfRVZFTlRVICAgICAgICAgICAgICAgREVCVUdfTFZMXzI4CS8vIDB4MDgwMDAwMDAKKyNkZWZpbmUgRVBMX0RCR0xWTF9FVkVOVFVfVFJBQ0UwICAgICAgICBERUJVR19MVkxfMjhfVFJBQ0UwCisjZGVmaW5lIEVQTF9EQkdMVkxfRVZFTlRVX1RSQUNFMSAgICAgICAgREVCVUdfTFZMXzI4X1RSQUNFMQorI2RlZmluZSBFUExfREJHTFZMX0VWRU5UVV9UUkFDRTIgICAgICAgIERFQlVHX0xWTF8yOF9UUkFDRTIKKyNkZWZpbmUgRVBMX0RCR0xWTF9FVkVOVFVfVFJBQ0UzICAgICAgICBERUJVR19MVkxfMjhfVFJBQ0UzCisjZGVmaW5lIEVQTF9EQkdMVkxfRVZFTlRVX1RSQUNFNCAgICAgICAgREVCVUdfTFZMXzI4X1RSQUNFNAorCisvLyBTaGFyZWRCdWZmCisjZGVmaW5lIEVQTF9EQkdMVkxfU0hCICAgICAgICAgICAgICAgICAgREVCVUdfTFZMXzI5CS8vIDB4MTAwMDAwMDAKKyNkZWZpbmUgRVBMX0RCR0xWTF9TSEJfVFJBQ0UwICAgICAgICAgICBERUJVR19MVkxfMjlfVFJBQ0UwCisjZGVmaW5lIEVQTF9EQkdMVkxfU0hCX1RSQUNFMSAgICAgICAgICAgREVCVUdfTFZMXzI5X1RSQUNFMQorI2RlZmluZSBFUExfREJHTFZMX1NIQl9UUkFDRTIgICAgICAgICAgIERFQlVHX0xWTF8yOV9UUkFDRTIKKyNkZWZpbmUgRVBMX0RCR0xWTF9TSEJfVFJBQ0UzICAgICAgICAgICBERUJVR19MVkxfMjlfVFJBQ0UzCisjZGVmaW5lIEVQTF9EQkdMVkxfU0hCX1RSQUNFNCAgICAgICAgICAgREVCVUdfTFZMXzI5X1RSQUNFNAorCisjZGVmaW5lIEVQTF9EQkdMVkxfQVNTRVJUICAgICAgICAgICAgICAgREVCVUdfTFZMX0FTU0VSVAkvLyAweDIwMDAwMDAwTAorI2RlZmluZSBFUExfREJHTFZMX0FTU0VSVF9UUkFDRTAgICAgICAgIERFQlVHX0xWTF9BU1NFUlRfVFJBQ0UwCisjZGVmaW5lIEVQTF9EQkdMVkxfQVNTRVJUX1RSQUNFMSAgICAgICAgREVCVUdfTFZMX0FTU0VSVF9UUkFDRTEKKyNkZWZpbmUgRVBMX0RCR0xWTF9BU1NFUlRfVFJBQ0UyICAgICAgICBERUJVR19MVkxfQVNTRVJUX1RSQUNFMgorI2RlZmluZSBFUExfREJHTFZMX0FTU0VSVF9UUkFDRTMgICAgICAgIERFQlVHX0xWTF9BU1NFUlRfVFJBQ0UzCisjZGVmaW5lIEVQTF9EQkdMVkxfQVNTRVJUX1RSQUNFNCAgICAgICAgREVCVUdfTFZMX0FTU0VSVF9UUkFDRTQKKworI2RlZmluZSBFUExfREJHTFZMX0VSUk9SICAgICAgICAgICAgICAgIERFQlVHX0xWTF9FUlJPUgkvLyAweDQwMDAwMDAwTAorI2RlZmluZSBFUExfREJHTFZMX0VSUk9SX1RSQUNFMCAgICAgICAgIERFQlVHX0xWTF9FUlJPUl9UUkFDRTAKKyNkZWZpbmUgRVBMX0RCR0xWTF9FUlJPUl9UUkFDRTEgICAgICAgICBERUJVR19MVkxfRVJST1JfVFJBQ0UxCisjZGVmaW5lIEVQTF9EQkdMVkxfRVJST1JfVFJBQ0UyICAgICAgICAgREVCVUdfTFZMX0VSUk9SX1RSQUNFMgorI2RlZmluZSBFUExfREJHTFZMX0VSUk9SX1RSQUNFMyAgICAgICAgIERFQlVHX0xWTF9FUlJPUl9UUkFDRTMKKyNkZWZpbmUgRVBMX0RCR0xWTF9FUlJPUl9UUkFDRTQgICAgICAgICBERUJVR19MVkxfRVJST1JfVFJBQ0U0CisKKyNkZWZpbmUgRVBMX0RCR0xWTF9BTFdBWVMgICAgICAgICAgICAgICBERUJVR19MVkxfQUxXQVlTCS8vIDB4ODAwMDAwMDBMCisjZGVmaW5lIEVQTF9EQkdMVkxfQUxXQVlTX1RSQUNFMCAgICAgICAgREVCVUdfTFZMX0FMV0FZU19UUkFDRTAKKyNkZWZpbmUgRVBMX0RCR0xWTF9BTFdBWVNfVFJBQ0UxICAgICAgICBERUJVR19MVkxfQUxXQVlTX1RSQUNFMQorI2RlZmluZSBFUExfREJHTFZMX0FMV0FZU19UUkFDRTIgICAgICAgIERFQlVHX0xWTF9BTFdBWVNfVFJBQ0UyCisjZGVmaW5lIEVQTF9EQkdMVkxfQUxXQVlTX1RSQUNFMyAgICAgICAgREVCVUdfTFZMX0FMV0FZU19UUkFDRTMKKyNkZWZpbmUgRVBMX0RCR0xWTF9BTFdBWVNfVFJBQ0U0ICAgICAgICBERUJVR19MVkxfQUxXQVlTX1RSQUNFNAorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gdHlwZWRlZgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNlbmRpZiAvLyAjaWZuZGVmIF9FUExfSU5DX0hfCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbEluc3REZWYuaCBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsSW5zdERlZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5ZWZiZjIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbEluc3REZWYuaApAQCAtMCwwICsxLDM3NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIGRlZmluaXRpb25zIGZvciBnZW5lcmF0aW5nIGluc3RhbmNlcworCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgJFJDU2ZpbGU6IEVwbEluc3REZWYuaCx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuNCAkICAkRGF0ZTogMjAwOC8wNC8xNyAyMTozNjozMiAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICAgICAgLi4uCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgci5kLjogZmlyc3QgaW1wbGVtZW50YXRpb24KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfRVBMSU5TVERFRl9IXworI2RlZmluZSBfRVBMSU5TVERFRl9IXworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyB0eXBlcyBhbmQgbWFjcm9zIGZvciBnZW5lcmF0aW5nIGluc3RhbmNlcworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCit0eXBlZGVmIGVudW0geworCWtTdGF0ZVVudXNlZCA9IDAsCisJa1N0YXRlRGVsZXRlZCA9IDEsCisJa1N0YXRlVXNlZCA9IDB4RkYKK30gdEluc3RTdGF0ZTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordHlwZWRlZiB2b2lkIE1FTSAqdEVwbFB0ckluc3RhbmNlOwordHlwZWRlZiBCWVRFIHRFcGxJbnN0YW5jZUhkbDsKKworLy8gZGVmaW5lIGNvbnN0IGZvciBpbGxlZ2FsZSB2YWx1ZXMKKyNkZWZpbmUgQ0NNX0lMTElOU1RBTkNFICAgICAgTlVMTAorI2RlZmluZSBDQ01fSUxMSU5TVEFOQ0VfSERMICAweEZGCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBpZiBtb3JlIHRoYW4gb25lIGluc3RhbmNlIHRoZW4gdXNlIHRoaXMgbWFjcm9zCisjaWYgKEVQTF9NQVhfSU5TVEFOQ0VTID4gMSkKKworICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyBtYWNybyBkZWZpbml0aW9uIGZvciBpbnN0YW5jZSB0YWJsZSBkZWZpbml0aW9uCisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgLy8gbWVtb3J5IGF0dHJpYnV0ZXMgZm9yIGluc3RhbmNlIHRhYmxlCisjZGVmaW5lIElOU1RfTkVBUgkJLy8gZmFzdGVyIGFjY2VzcyB0byB2YXJpYWJsZXMKKyNkZWZpbmUgSU5TVF9GQVIJCS8vIHZhcmlhYmxlcyB3aWNoIGhhdmUgdG8gbG9jYXRlZCBpbiB4ZGF0YQorI2RlZmluZSBTVEFUSUMJCQkvLyBwcmV2ZW50IHdhcm5pbmdzIGZvciB2YXJpYWJsZXMgd2l0aCBzYW1lIG5hbWUKKworI2RlZmluZSBJTlNUQU5DRV9UWVBFX0JFR0lOICAgICB0eXBlZGVmIHN0cnVjdCB7CisjZGVmaW5lIElOU1RBTkNFX1RZUEVfRU5EICAgICAgIH0gdEVwbEluc3RhbmNlSW5mbzsKKworICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyBtYWNybyBkZWZpbml0aW9uIGZvciBBUEkgaW50ZXJmYWNlCisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgLy8gZGVjbGFyYXRpb246CisKKyAgICAvLyBtYWNyb3MgZm9yIGRlY2xhcmF0aW9uIHdpdGhpbiBmdW5jdGlvbiBoZWFkZXIgb3IgcHJvdG90eXBlIG9mIEFQSSBmdW5jdGlvbnMKKyNkZWZpbmUgQ0NNX0RFQ0xfSU5TVEFOQ0VfSERMICAgICAgICAgICAgICAgICAgIHRFcGxJbnN0YW5jZUhkbCBJbnN0YW5jZUhhbmRsZQorI2RlZmluZSBDQ01fREVDTF9JTlNUQU5DRV9IRExfICAgICAgICAgICAgICAgICAgdEVwbEluc3RhbmNlSGRsIEluc3RhbmNlSGFuZGxlLAorCisgICAgLy8gbWFjcm9zIGZvciBkZWNsYXJhdGlvbiBvZiBwb2ludGVyIHRvIGluc3RhbmNlIGhhbmRsZSB3aXRoaW4gZnVuY3Rpb24gaGVhZGVyIG9yIHByb3RvdHlwZSBvZiBBUEkgZnVuY3Rpb25zCisjZGVmaW5lIENDTV9ERUNMX1BUUl9JTlNUQU5DRV9IREwgICAgICAgICAgICAgICB0RXBsSW5zdGFuY2VIZGwgTUVNKiBwSW5zdGFuY2VIYW5kbGUKKyNkZWZpbmUgQ0NNX0RFQ0xfUFRSX0lOU1RBTkNFX0hETF8gICAgICAgICAgICAgIHRFcGxJbnN0YW5jZUhkbCBNRU0qIHBJbnN0YW5jZUhhbmRsZSwKKworICAgIC8vIG1hY3JvcyBmb3IgZGVjbGFyYXRpb24gaW5zdGFuY2UgYXMgbG9rYWNsIHZhcmlhYmxlIHdpdGhpbiBmdW5jdGlvbnMKKyNkZWZpbmUgQ0NNX0RFQ0xfSU5TVEFOQ0VfUFRSX0xPQ0FMICAgICAgICAgICAgIHRDY21JbnN0YW5jZUluZm8gTUVNKiBwSW5zdGFuY2U7CisjZGVmaW5lIENDTV9ERUNMX1BUUl9JTlNUQU5DRV9IRExfTE9DQUwgICAgICAgICB0RXBsSW5zdGFuY2VIZGwgIE1FTSogcEluc3RhbmNlSGFuZGxlOworCisgICAgLy8gcmVmZXJlbmNlOgorCisgICAgLy8gbWFjcm9zIGZvciByZWZlcmVuY2Ugb2YgaW5zdGFuY2UgaGFuZGxlIGZvciBmdW5jdGlvbiBwYXJhbWV0ZXJzCisjZGVmaW5lIENDTV9JTlNUQU5DRV9IREwgICAgICAgICAgICAgICAgICAgICAgICBJbnN0YW5jZUhhbmRsZQorI2RlZmluZSBDQ01fSU5TVEFOQ0VfSERMXyAgICAgICAgICAgICAgICAgICAgICAgSW5zdGFuY2VIYW5kbGUsCisKKyAgICAvLyBtYWNyb3MgZm9yIHJlZmVyZW5jZSBvZiBpbnN0YW5jZSBwYXJhbWV0ZXIgZm9yIGZ1bmN0aW9uIHBhcmFtZXRlcnMKKyNkZWZpbmUgQ0NNX0lOU1RBTkNFX1BBUkFNKHBhcikgICAgICAgICAgICAgICAgIHBhcgorI2RlZmluZSBDQ01fSU5TVEFOQ0VfUEFSQU1fKHBhcikgICAgICAgICAgICAgICAgcGFyLAorCisgICAgLy8gbWFjcm9zIGZvciByZWZlcmVuY2Ugb2YgaW5zdGFuY2UgcGFyYW1ldGVyIGZvciB3cml0aW5nIG9yIHJlYWRpbmcgdmFsdWVzCisjZGVmaW5lIENDTV9JTlNUX0VOVFJZICAgICAgICAgICAgICAgICAgICAgICAgICAoKigodEVwbFB0ckluc3RhbmNlKXBJbnN0YW5jZSkpCisKKyAgICAvLyBwcm9jZXNzaW5nOgorCisgICAgLy8gbWFjcm9zIGZvciBwcm9jZXNzIGluc3RhbmNlIGhhbmRsZQorI2RlZmluZSBDQ01fQ0hFQ0tfSU5TVEFOQ0VfSERMKCkgICAgICAgICAgICAgICAgaWYgKEluc3RhbmNlSGFuZGxlID49IEVQTF9NQVhfSU5TVEFOQ0VTKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtyZXR1cm4gKGtFcGxJbGxlZ2FsSW5zdGFuY2UpO30KKworICAgIC8vIG1hY3JvcyBmb3IgcHJvY2VzcyBwb2ludGVyIHRvIGluc3RhbmNlIGhhbmRsZQorI2RlZmluZSBDQ01fQ0hFQ0tfUFRSX0lOU1RBTkNFX0hETCgpICAgICAgICAgICAgaWYgKHBJbnN0YW5jZUhhbmRsZSA9PSBOVUxMKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtyZXR1cm4gKGtFcGxJbnZhbGlkSW5zdGFuY2VQYXJhbSk7fQorCisgICAgLy8gVGhpcyBtYWNybyByZXR1cm5lZCB0aGUgaGFuZGxlIGFuZCBwb2ludGVyIHRvIG5leHQgZnJlZSBpbnN0YW5jZS4KKyNkZWZpbmUgQ0NNX0dFVF9GUkVFX0lOU1RBTkNFX0FORF9IREwoKSAgICAgICAgIHBJbnN0YW5jZSA9IENjbUdldEZyZWVJbnN0YW5jZUFuZEhhbmRsZSAocEluc3RhbmNlSGFuZGxlKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTU0VSVCAoKnBJbnN0YW5jZUhhbmRsZSAhPSBDQ01fSUxMSU5TVEFOQ0VfSERMKTsKKworI2RlZmluZSBDQ01fQ0hFQ0tfSU5TVEFOQ0VfUFRSKCkgICAgICAgICAgICAgICAgaWYgKHBJbnN0YW5jZSA9PSBDQ01fSUxMSU5TVEFOQ0UpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3JldHVybiAoa0VwbE5vRnJlZUluc3RhbmNlKTt9CisKKyNkZWZpbmUgQ0NNX0dFVF9JTlNUQU5DRV9QVFIoKSAgICAgICAgICAgICAgICAgIHBJbnN0YW5jZSA9IENjbUdldEluc3RhbmNlUHRyIChJbnN0YW5jZUhhbmRsZSk7CisjZGVmaW5lIENDTV9HRVRfRlJFRV9JTlNUQU5DRV9QVFIoKSAgICAgICAgICAgICBwSW5zdGFuY2UgPSBHZXRGcmVlSW5zdGFuY2UgKCk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBU1NFUlQgKHBJbnN0YW5jZSAhPSBDQ01fSUxMSU5TVEFOQ0UpOworCisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vIG1hY3JvIGRlZmluaXRpb24gZm9yIHN0YWNrIGludGVyZmFjZQorICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIC8vIG1hY3JvcyBmb3IgZGVjbGFyYXRpb24gd2l0aGluIHRoZSBmdW5jdGlvbiBoZWFkZXIsIHByb3RvdHlwZSBvciBsb2NhbCB2YXIgbGlzdAorICAgIC8vIERlY2xhcmF0aW9uIG9mIHBvaW50ZXJzIHdpdGhpbiBmdW5jdGlvbiBwYXJhbWF0ZXIgbGlzdCBtdXN0IGRlZmluZWQgYXMgdm9pZCBNRU0qCisgICAgLy8gcG9pbnRlci4KKyNkZWZpbmUgRVBMX01DT19ERUNMX0lOU1RBTkNFX1BUUiAgICAgICAgICAgICAgICAgICB2b2lkIE1FTSogcEluc3RhbmNlCisjZGVmaW5lIEVQTF9NQ09fREVDTF9JTlNUQU5DRV9QVFJfICAgICAgICAgICAgICAgICAgdm9pZCBNRU0qIHBJbnN0YW5jZSwKKyNkZWZpbmUgRVBMX01DT19ERUNMX0lOU1RBTkNFX1BUUl9MT0NBTCAgICAgICAgICAgICB0RXBsUHRySW5zdGFuY2UgIHBJbnN0YW5jZTsKKworICAgIC8vIG1hY3JvcyBmb3IgcmVmZXJlbmNlIG9mIHBvaW50ZXIgdG8gaW5zdGFuY2UKKyAgICAvLyBUaGVzZSBtYWNyb3MgYXJlIHVzZWQgZm9yIHBhcmFtZXRlciBwYXNzaW5nIHRvIGNhbGxlZCBmdW5jdGlvbi4KKyNkZWZpbmUgRVBMX01DT19JTlNUQU5DRV9QVFIgICAgICAgICAgICAgICAgICAgICAgICBwSW5zdGFuY2UKKyNkZWZpbmUgRVBMX01DT19JTlNUQU5DRV9QVFJfICAgICAgICAgICAgICAgICAgICAgICBwSW5zdGFuY2UsCisjZGVmaW5lIEVQTF9NQ09fQUREUl9JTlNUQU5DRV9QVFJfICAgICAgICAgICAgICAgICAgJnBJbnN0YW5jZSwKKworICAgIC8vIG1hY3JvIGZvciBhY2Nlc3Mgb2Ygc3RydWN0IG1lbWJlcnMgb2Ygb25lIGluc3RhbmNlCisgICAgLy8gQW4gYWNjZXNzIHRvIGEgbWVtYmVyIG9mIGluc3RhbmNlIHRhYmxlIG11c3QgYmUgY2FzdGVkIGJ5IHRoZSBsb2NhbAorICAgIC8vIGRlZmluZWQgdHlwZSBvZiBpbnN0YW5jZSB0YWJsZS4KKyNkZWZpbmUgRVBMX01DT19JTlNUX0VOVFJZICAgICAgICAgICAgICAgICAgICAgICAgICAoKih0RXBsUHRySW5zdGFuY2UpcEluc3RhbmNlKQorI2RlZmluZSBFUExfTUNPX0dMQl9WQVIodmFyKSAgICAgICAgICAgICAgICAgICAgICAgICgoKHRFcGxQdHJJbnN0YW5jZSlwSW5zdGFuY2UpLT52YXIpCisKKyAgICAvLyBtYWNyb3MgZm9yIHByb2Nlc3MgcG9pbnRlciB0byBpbnN0YW5jZQorI2RlZmluZSBFUExfTUNPX0dFVF9JTlNUQU5DRV9QVFIoKSAgICAgICAgICAgICAgICAgIHBJbnN0YW5jZSA9ICh0RXBsUHRySW5zdGFuY2UpIEdldEluc3RhbmNlUHRyIChJbnN0YW5jZUhhbmRsZSk7CisjZGVmaW5lIEVQTF9NQ09fR0VUX0ZSRUVfSU5TVEFOQ0VfUFRSKCkgICAgICAgICAgICAgcEluc3RhbmNlID0gKHRFcGxQdHJJbnN0YW5jZSkgR2V0RnJlZUluc3RhbmNlICgpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNTRVJUIChwSW5zdGFuY2UgIT0gQ0NNX0lMTElOU1RBTkNFKTsKKworICAgIC8vIFRoaXMgbWFjcm8gc2hvdWxkIGJlIHVzZWQgdG8gY2hlY2sgdGhlIHBhc3NlZCBwb2ludGVyIHRvIGFuIHB1YmxpYyBmdW5jdGlvbgorI2RlZmluZSBFUExfTUNPX0NIRUNLX0lOU1RBTkNFX1NUQVRFKCkgICAgICAgICAgICAgIEFTU0VSVCAocEluc3RhbmNlICE9IE5VTEwpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNTRVJUICgoKHRFcGxQdHJJbnN0YW5jZSlwSW5zdGFuY2UpLT5tX0luc3RTdGF0ZSA9PSBrU3RhdGVVc2VkKTsKKworICAgIC8vIG1hY3JvcyBmb3IgZGVjbGFyYXRpb24gb2YgcG9pbnRlciB0byBpbnN0YW5jZSBwb2ludGVyCisjZGVmaW5lIEVQTF9NQ09fREVDTF9QVFJfSU5TVEFOQ0VfUFRSICAgICAgICAgICAgICAgdm9pZCBNRU0qICBNRU0qIHBJbnN0YW5jZVB0cgorI2RlZmluZSBFUExfTUNPX0RFQ0xfUFRSX0lOU1RBTkNFX1BUUl8gICAgICAgICAgICAgIHZvaWQgTUVNKiAgTUVNKiBwSW5zdGFuY2VQdHIsCisKKyAgICAvLyBtYWNyb3MgZm9yIHJlZmVyZW5jZSBvZiBwb2ludGVyIHRvIGluc3RhbmNlIHBvaW50ZXIKKyAgICAvLyBUaGVzZSBtYWNyb3MgYXJlIHVzZWQgZm9yIHBhcmFtZXRlciBwYXNzaW5nIHRvIGNhbGxlZCBmdW5jdGlvbi4KKyNkZWZpbmUgRVBMX01DT19QVFJfSU5TVEFOQ0VfUFRSICAgICAgICAgICAgICAgICAgICBwSW5zdGFuY2VQdHIKKyNkZWZpbmUgRVBMX01DT19QVFJfSU5TVEFOQ0VfUFRSXyAgICAgICAgICAgICAgICAgICBwSW5zdGFuY2VQdHIsCisKKyAgICAvLyBtYWNyb3MgZm9yIHByb2Nlc3MgcG9pbnRlciB0byBpbnN0YW5jZSBwb2ludGVyCisjZGVmaW5lIEVQTF9NQ09fQ0hFQ0tfUFRSX0lOU1RBTkNFX1BUUigpICAgICAgICAgICAgQVNTRVJUIChwSW5zdGFuY2VQdHIgIT0gTlVMTCk7CisjZGVmaW5lIEVQTF9NQ09fU0VUX1BUUl9JTlNUQU5DRV9QVFIoKSAgICAgICAgICAgICAgKCpwSW5zdGFuY2VQdHIgPSBwSW5zdGFuY2UpOworCisjZGVmaW5lIEVQTF9NQ09fSU5TVEFOQ0VfUEFSQU0oYSkgICAgICAgICAgICAgICAgICAgKGEpCisjZGVmaW5lIEVQTF9NQ09fSU5TVEFOQ0VfUEFSQU1fKGEpICAgICAgICAgICAgICAgICAgKGEpLAorI2RlZmluZSBFUExfTUNPX0lOU1RBTkNFX1BBUkFNX0lEWF8oKSAgICAgICAgICAgICAgIEVQTF9NQ09fSU5TVEFOQ0VfUEFSQU1fIChFUExfTUNPX0dMQl9WQVIgKG1fYkluc3RJbmRleCkpCisjZGVmaW5lIEVQTF9NQ09fSU5TVEFOQ0VfUEFSQU1fSURYKCkgICAgICAgICAgICAgICAgRVBMX01DT19JTlNUQU5DRV9QQVJBTSAoRVBMX01DT19HTEJfVkFSIChtX2JJbnN0SW5kZXgpKQorI2RlZmluZSBFUExfTUNPX1dSSVRFX0lOU1RBTkNFX1NUQVRFKGEpICAgICAgICAgICAgIEVQTF9NQ09fR0xCX1ZBUiAobV9JbnN0U3RhdGUpID0gYTsKKworICAgIC8vIHRoaXMgbWFjcm8gZGVsZXRlcyBhbGwgaW5zdGFuY2UgZW50cmllcyBhcyB1bnVzZWQKKyNkZWZpbmUgRVBMX01DT19ERUxFVEVfSU5TVEFOQ0VfVEFCTEUoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdEVwbEluc3RhbmNlSW5mbyBNRU0qICAgcEluc3RhbmNlICAgICAgID0gJmFFcGxJbnN0YW5jZVRhYmxlX2dbMF07IFwKKyAgICAgICAgdEZhc3RCeXRlICAgICAgICAgICAgICAgSW5zdE51bWJlciAgICAgID0gMDsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdEZhc3RCeXRlICAgICAgICAgICAgICAgaSAgICAgICAgICAgICAgID0gRVBMX01BWF9JTlNUQU5DRVM7ICAgICAgIFwKKyAgICAgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHBJbnN0YW5jZS0+bV9JbnN0U3RhdGUgPSAoQllURSkga1N0YXRlVW51c2VkOyAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHBJbnN0YW5jZS0+bV9iSW5zdEluZGV4ID0gKEJZVEUpIEluc3ROdW1iZXI7ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHBJbnN0YW5jZSsrOyBJbnN0TnVtYmVyKys7IGktLTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSB3aGlsZSAoaSAhPSAwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisKKyAgICAvLyBkZWZpbml0aW9uIG9mIGZ1bmN0aW9ucyB3aGljaCBoYXMgdG8gYmUgZGVmaW5lZCBpbiBlYWNoIG1vZHVsZSBvZiBDQU5vcGVuIHN0YWNrCisjZGVmaW5lIEVQTF9NQ09fREVGSU5FX0lOU1RBTkNFX0ZDVCgpIFwKKyAgICAgICAgc3RhdGljIHRFcGxQdHJJbnN0YW5jZSBHZXRJbnN0YW5jZVB0ciAodEVwbEluc3RhbmNlSGRsIEluc3RIYW5kbGVfcCk7ICBcCisgICAgICAgIHN0YXRpYyB0RXBsUHRySW5zdGFuY2UgR2V0RnJlZUluc3RhbmNlICh2b2lkKTsKKyNkZWZpbmUgRVBMX01DT19ERUNMX0lOU1RBTkNFX0ZDVCgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHN0YXRpYyB0RXBsUHRySW5zdGFuY2UgR2V0SW5zdGFuY2VQdHIgKHRFcGxJbnN0YW5jZUhkbCBJbnN0SGFuZGxlX3ApIHsgXAorICAgICAgICAgICAgcmV0dXJuICZhRXBsSW5zdGFuY2VUYWJsZV9nW0luc3RIYW5kbGVfcF07IH0gICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgc3RhdGljIHRFcGxQdHJJbnN0YW5jZSBHZXRGcmVlSW5zdGFuY2UgKHZvaWQpIHsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB0RXBsSW5zdGFuY2VJbmZvIE1FTSogICBwSW5zdGFuY2UgICA9ICZhRXBsSW5zdGFuY2VUYWJsZV9nWzBdOyAgICAgXAorICAgICAgICAgICAgdEZhc3RCeXRlICAgICAgICAgICAgICAgaSAgICAgICAgICAgPSBFUExfTUFYX0lOU1RBTkNFUzsgICAgICAgICAgIFwKKyAgICAgICAgICAgIGRvIHsgaWYgKHBJbnN0YW5jZS0+bV9JbnN0U3RhdGUgIT0ga1N0YXRlVXNlZCkgeyAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAodEVwbFB0ckluc3RhbmNlKSBwSW5zdGFuY2U7IH0gICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHBJbnN0YW5jZSsrOyBpLS07IH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHdoaWxlIChpICE9IDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICByZXR1cm4gQ0NNX0lMTElOU1RBTkNFOyB9CisKKyAgICAvLyB0aGlzIG1hY3JvIGRlZmluZXMgdGhlIGluc3RhbmNlIHRhYmxlLiBFYWNoIGVudHJ5IGlzIHJlc2VydmVkIGZvciBhbiBpbnN0YW5jZSBvZiBDQU5vcGVuLgorI2RlZmluZSBFUExfTUNPX0RFQ0xfSU5TVEFOQ0VfVkFSKCkgXAorICAgICAgICBzdGF0aWMgdEVwbEluc3RhbmNlSW5mbyBNRU0gYUVwbEluc3RhbmNlVGFibGVfZyBbRVBMX01BWF9JTlNUQU5DRVNdOworCisgICAgLy8gdGhpcyBtYWNybyBkZWZpbmVzIG1lbWJlciB2YXJpYWJsZXMgaW4gaW5zdGFuY2UgdGFibGUgd2hpY2ggYXJlIG5lZWRlZCBpbgorICAgIC8vIGFsbCBtb2R1bGVzIG9mIEVwbCBzdGFjaworI2RlZmluZSBFUExfTUNPX0RFQ0xfSU5TVEFOQ0VfTUVNQkVSKCkgXAorICAgICAgICBTVEFUSUMgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9JbnN0U3RhdGU7IFwKKyAgICAgICAgU1RBVElDICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fYkluc3RJbmRleDsKKworI2RlZmluZSBFUExfTUNPX0lOU1RBTkNFX1BBUkFNX0lEWF8oKSAgICAgICAgICAgRVBMX01DT19JTlNUQU5DRV9QQVJBTV8gKEVQTF9NQ09fR0xCX1ZBUiAobV9iSW5zdEluZGV4KSkKKyNkZWZpbmUgRVBMX01DT19JTlNUQU5DRV9QQVJBTV9JRFgoKSAgICAgICAgICAgIEVQTF9NQ09fSU5TVEFOQ0VfUEFSQU0gKEVQTF9NQ09fR0xCX1ZBUiAobV9iSW5zdEluZGV4KSkKKworI2Vsc2UgLy8gb25seSBvbmUgaW5zdGFuY2UgaXMgdXNlZAorCisgICAgLy8gTWVtb3J5IGF0dHJpYnV0ZXMgZm9yIGluc3RhbmNlIHRhYmxlLgorI2RlZmluZSBJTlNUX05FQVIgICBORUFSCS8vIGZhc3RlciBhY2Nlc3MgdG8gdmFyaWFibGVzCisjZGVmaW5lIElOU1RfRkFSICAgIE1FTQkJLy8gdmFyaWFibGVzIHdpY2ggaGF2ZSB0byBsb2NhdGVkIGluIHhkYXRhCisjZGVmaW5lIFNUQVRJQyAgICAgIHN0YXRpYwkvLyBwcmV2ZW50IHdhcm5pbmdzIGZvciB2YXJpYWJsZXMgd2l0aCBzYW1lIG5hbWUKKworI2RlZmluZSBJTlNUQU5DRV9UWVBFX0JFR0lOCisjZGVmaW5lIElOU1RBTkNFX1RZUEVfRU5ECisKKy8vIG1hY3JvcyBmb3IgZGVjbGFyYXRpb24sIGluaXRpYWxpemluZyBhbmQgbWVtYmVyIGFjY2VzcyBmb3IgaW5zdGFuY2UgaGFuZGxlCisvLyBUaGlzIGNsYXNzIG9mIG1hY3JvcyBhcmUgdXNlZCBieSBBUEkgZnVuY3Rpb24gdG8gaW5mb3JtIENDTS1tb2R1bCB3aGljaAorLy8gaW5zdGFuY2UgaXMgdG8gYmUgdXNlZC4KKworICAgIC8vIG1hY3JvcyBmb3IgcmVmZXJlbmNlIG9mIGluc3RhbmNlIGhhbmRsZQorICAgIC8vIFRoZXNlIG1hY3JvcyBhcmUgdXNlZCBmb3IgcGFyYW1ldGVyIHBhc3NpbmcgdG8gQ0FOb3BlbiBBUEkgZnVuY3Rpb24uCisjZGVmaW5lIENDTV9JTlNUQU5DRV9IREwKKyNkZWZpbmUgQ0NNX0lOU1RBTkNFX0hETF8KKworI2RlZmluZSBDQ01fREVDTF9JTlNUQU5DRV9QVFJfTE9DQUwKKworICAgIC8vIG1hY3JvcyBmb3IgZGVjbGFyYXRpb24gd2l0aGluIHRoZSBmdW5jdGlvbiBoZWFkZXIgb3IgcHJvdG90eXBlCisjZGVmaW5lIENDTV9ERUNMX0lOU1RBTkNFX0hETCAgICAgICAgICAgICAgICAgICB2b2lkCisjZGVmaW5lIENDTV9ERUNMX0lOU1RBTkNFX0hETF8KKworICAgIC8vIG1hY3JvcyBmb3IgcHJvY2VzcyBpbnN0YW5jZSBoYW5kbGUKKyNkZWZpbmUgQ0NNX0NIRUNLX0lOU1RBTkNFX0hETCgpCisKKyAgICAvLyBtYWNyb3MgZm9yIGRlY2xhcmF0aW9uIG9mIHBvaW50ZXIgdG8gaW5zdGFuY2UgaGFuZGxlCisjZGVmaW5lIENDTV9ERUNMX1BUUl9JTlNUQU5DRV9IREwgICAgICAgICAgICAgICB2b2lkCisjZGVmaW5lIENDTV9ERUNMX1BUUl9JTlNUQU5DRV9IRExfCisKKyAgICAvLyBtYWNyb3MgZm9yIHByb2Nlc3MgcG9pbnRlciB0byBpbnN0YW5jZSBoYW5kbGUKKyNkZWZpbmUgQ0NNX0NIRUNLX1BUUl9JTlNUQU5DRV9IREwoKQorCisgICAgLy8gVGhpcyBtYWNybyByZXR1cm5lZCB0aGUgaGFuZGxlIGFuZCBwb2ludGVyIHRvIG5leHQgZnJlZSBpbnN0YW5jZS4KKyNkZWZpbmUgQ0NNX0dFVF9GUkVFX0lOU1RBTkNFX0FORF9IREwoKQorCisjZGVmaW5lIENDTV9DSEVDS19JTlNUQU5DRV9QVFIoKQorCisjZGVmaW5lIENDTV9HRVRfSU5TVEFOQ0VfUFRSKCkKKyNkZWZpbmUgQ0NNX0dFVF9GUkVFX0lOU1RBTkNFX1BUUigpCisKKyNkZWZpbmUgQ0NNX0lOU1RBTkNFX1BBUkFNKHBhcikKKyNkZWZpbmUgQ0NNX0lOU1RBTkNFX1BBUkFNXyhwYXIpCisKKyNkZWZpbmUgQ0NNX0lOU1RfRU5UUlkgICAgICAgICAgICAgICAgICAgICAgICAgIGFDY21JbnN0YW5jZVRhYmxlX2dbMF0KKworLy8gbWFjcm9zIGZvciBkZWNsYXJhdGlvbiwgaW5pdGlhbGl6aW5nIGFuZCBtZW1iZXIgYWNjZXNzIGZvciBpbnN0YW5jZSBwb2ludGVyCisvLyBUaGlzIGNsYXNzIG9mIG1hY3JvcyBhcmUgdXNlZCBieSBDQU5vcGVuIGludGVybmFsIGZ1bmN0aW9uIHRvIHBvaW50IHRvIG9uZSBpbnN0YW5jZS4KKworICAgIC8vIG1hY3JvcyBmb3IgZGVjbGFyYXRpb24gd2l0aGluIHRoZSBmdW5jdGlvbiBoZWFkZXIsIHByb3RvdHlwZSBvciBsb2NhbCB2YXIgbGlzdAorI2RlZmluZSBFUExfTUNPX0RFQ0xfSU5TVEFOQ0VfUFRSICAgICAgICAgICAgICAgICAgIHZvaWQKKyNkZWZpbmUgRVBMX01DT19ERUNMX0lOU1RBTkNFX1BUUl8KKyNkZWZpbmUgRVBMX01DT19ERUNMX0lOU1RBTkNFX1BUUl9MT0NBTAorCisgICAgLy8gbWFjcm9zIGZvciByZWZlcmVuY2Ugb2YgcG9pbnRlciB0byBpbnN0YW5jZQorICAgIC8vIFRoZXNlIG1hY3JvcyBhcmUgdXNlZCBmb3IgcGFyYW1ldGVyIHBhc3NpbmcgdG8gY2FsbGVkIGZ1bmN0aW9uLgorI2RlZmluZSBFUExfTUNPX0lOU1RBTkNFX1BUUgorI2RlZmluZSBFUExfTUNPX0lOU1RBTkNFX1BUUl8KKyNkZWZpbmUgRVBMX01DT19BRERSX0lOU1RBTkNFX1BUUl8KKworICAgIC8vIG1hY3JvcyBmb3IgcHJvY2VzcyBwb2ludGVyIHRvIGluc3RhbmNlCisjZGVmaW5lIEVQTF9NQ09fR0VUX0lOU1RBTkNFX1BUUigpCisjZGVmaW5lIEVQTF9NQ09fR0VUX0ZSRUVfSU5TVEFOQ0VfUFRSKCkKKworICAgIC8vIFRoaXMgbWFjcm8gc2hvdWxkIGJlIHVzZWQgdG8gY2hlY2sgdGhlIHBhc3NlZCBwb2ludGVyIHRvIGFuIHB1YmxpYyBmdW5jdGlvbgorI2RlZmluZSBFUExfTUNPX0NIRUNLX0lOU1RBTkNFX1NUQVRFKCkKKworICAgIC8vIG1hY3JvcyBmb3IgZGVjbGFyYXRpb24gb2YgcG9pbnRlciB0byBpbnN0YW5jZSBwb2ludGVyCisjZGVmaW5lIEVQTF9NQ09fREVDTF9QVFJfSU5TVEFOQ0VfUFRSICAgICAgICAgICAgICAgdm9pZAorI2RlZmluZSBFUExfTUNPX0RFQ0xfUFRSX0lOU1RBTkNFX1BUUl8KKworICAgIC8vIG1hY3JvcyBmb3IgcmVmZXJlbmNlIG9mIHBvaW50ZXIgdG8gaW5zdGFuY2UgcG9pbnRlcgorICAgIC8vIFRoZXNlIG1hY3JvcyBhcmUgdXNlZCBmb3IgcGFyYW1ldGVyIHBhc3NpbmcgdG8gY2FsbGVkIGZ1bmN0aW9uLgorI2RlZmluZSBFUExfTUNPX1BUUl9JTlNUQU5DRV9QVFIKKyNkZWZpbmUgRVBMX01DT19QVFJfSU5TVEFOQ0VfUFRSXworCisgICAgLy8gbWFjcm9zIGZvciBwcm9jZXNzIHBvaW50ZXIgdG8gaW5zdGFuY2UgcG9pbnRlcgorI2RlZmluZSBFUExfTUNPX0NIRUNLX1BUUl9JTlNUQU5DRV9QVFIoKQorI2RlZmluZSBFUExfTUNPX1NFVF9QVFJfSU5TVEFOQ0VfUFRSKCkKKworI2RlZmluZSBFUExfTUNPX0lOU1RBTkNFX1BBUkFNKGEpCisjZGVmaW5lIEVQTF9NQ09fSU5TVEFOQ0VfUEFSQU1fKGEpCisjZGVmaW5lIEVQTF9NQ09fSU5TVEFOQ0VfUEFSQU1fSURYXygpCisjZGVmaW5lIEVQTF9NQ09fSU5TVEFOQ0VfUEFSQU1fSURYKCkKKworICAgIC8vIG1hY3JvIGZvciBhY2Nlc3Mgb2Ygc3RydWN0IG1lbWJlcnMgb2Ygb25lIGluc3RhbmNlCisjZGVmaW5lIEVQTF9NQ09fSU5TVF9FTlRSWSAgICAgICAgICAgICAgICAgICAgICAgICAgYUVwbEluc3RhbmNlVGFibGVfZ1swXQorI2RlZmluZSBFUExfTUNPX0dMQl9WQVIodmFyKSAgICAgICAgICAgICAgICAgICAgICAgICh2YXIpCisjZGVmaW5lIEVQTF9NQ09fV1JJVEVfSU5TVEFOQ0VfU1RBVEUoYSkKKworICAgIC8vIHRoaXMgbWFjcm8gZGVsZXRlcyBhbGwgaW5zdGFuY2UgZW50cmllcyBhcyB1bnVzZWQKKyNkZWZpbmUgRVBMX01DT19ERUxFVEVfSU5TVEFOQ0VfVEFCTEUoKQorCisgICAgLy8gZGVmaW5pdGlvbiBvZiBmdW5jdGlvbnMgd2hpY2ggaGFzIHRvIGJlIGRlZmluZWQgaW4gZWFjaCBtb2R1bGUgb2YgQ0FOb3BlbiBzdGFjaworI2RlZmluZSBFUExfTUNPX0RFRklORV9JTlNUQU5DRV9GQ1QoKQorI2RlZmluZSBFUExfTUNPX0RFQ0xfSU5TVEFOQ0VfRkNUKCkKKworICAgIC8vIHRoaXMgbWFjcm8gZGVmaW5lcyB0aGUgaW5zdGFuY2UgdGFibGUuIEVhY2ggZW50cnkgaXMgcmVzZXJ2ZWQgZm9yIGFuIGluc3RhbmNlIG9mIENBTm9wZW4uCisjZGVmaW5lIEVQTF9NQ09fREVDTF9JTlNUQU5DRV9WQVIoKQorCisgICAgLy8gdGhpcyBtYWNybyBkZWZpbmVzIG1lbWJlciB2YXJpYWJsZXMgaW4gaW5zdGFuY2UgdGFibGUgd2hpY2ggYXJlIG5lZWRlZCBpbgorICAgIC8vIGFsbCBtb2R1bGVzIG9mIENBTm9wZW4gc3RhY2sKKyNkZWZpbmUgRVBMX01DT19ERUNMX0lOU1RBTkNFX01FTUJFUigpCisKKyNlbmRpZgorCisvKgorI2lmIChDRFJWX01BWF9JTlNUQU5DRVMgPiAxKQorCisgICAgI2RlZmluZSBDRFJWX1JFRU5UUkFOVCAgICAgICAgICAgICAgICAgICAgICAgICAgUkVFTlRSQU5UCisKKyNlbHNlCisKKyAgICAjZGVmaW5lIENEUlZfUkVFTlRSQU5UCisKKyNlbmRpZgorKi8KKworI2VuZGlmIC8vIF9FUExJTlNUREVGX0hfCisKKy8vIERpZSBsZXR6dGUgWmVpbGUgbXXfIHVuYmVkaW5ndCBlaW5lIGxlZXJlIFplaWxlIHNlaW4sIHdlaWwgbWFuY2hlIENvbXBpbGVyCisvLyBkYW1pdCBlaW4gUHJvYmxlbSBoYWJlbiwgd2VubiBkYXMgbmljaHQgc28gaXN0ICh6LkIuIEdOVSBvZGVyIEJvcmxhbmQgQysrIEJ1aWxkZXIpLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxMZWQuaCBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsTGVkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmEyOWFlZDMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbExlZC5oCkBAIC0wLDAgKzEsOTIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBpbmNsdWRlIGZpbGUgZm9yIHN0YXR1cyBhbmQgZXJyb3IgTEVECisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRXBsTGVkLmgsdiAkCisKKyAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAorCisgICAgICAgICAgICAgICAgJFJldmlzaW9uOiAxLjEgJCAgJERhdGU6IDIwMDgvMTEvMTcgMTY6NDA6MzkgJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgICAgIEdDQyBWMy40CisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwOC8xMS8xNyBkLmsuOiAgIHN0YXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9FUExMRURfSF8KKyNkZWZpbmUgX0VQTExFRF9IXworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHR5cGVkZWYKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3R5cGVkZWYgZW51bSB7CisJa0VwbExlZFR5cGVTdGF0dXMgPSAweDAwLAorCWtFcGxMZWRUeXBlRXJyb3IgPSAweDAxLAorCit9IHRFcGxMZWRUeXBlOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2VuZGlmIC8vICNpZm5kZWYgX0VQTExFRF9IXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxObXQuaCBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsTm10LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGMxMWU1YgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsTm10LmgKQEAgLTAsMCArMSwyMzAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBnbG9iYWwgaW5jbHVkZSBmaWxlIGZvciBFUEwtTk1ULU1vZHVsZXMKKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgICAgICAgICRSQ1NmaWxlOiBFcGxObXQuaCx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuNiAkICAkRGF0ZTogMjAwOC8xMS8xNyAxNjo0MDozOSAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICAgICAgR0NDIFYzLjQKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUmV2aXNpb24gSGlzdG9yeToKKworICAyMDA2LzA2LzA5IGsudC46ICAgc3RhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX0VQTE5NVF9IXworI2RlZmluZSBfRVBMTk1UX0hfCisKKyNpbmNsdWRlICJFcGxJbmMuaCIKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvbnN0IGRlZmluZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIGRlZmluZSBzdXBlci1zdGF0ZXMgYW5kIG1hc2tzIHRvIGlkZW50aWZ5IGEgc3VwZXItc3RhdGUKKyNkZWZpbmUgRVBMX05NVF9HU19QT1dFUkVEICAgICAgICAgIDB4MDAwOAkvLyBzdXBlciBzdGF0ZQorI2RlZmluZSBFUExfTk1UX0dTX0lOSVRJQUxJU0FUSU9OICAgMHgwMDA5CS8vIHN1cGVyIHN0YXRlCisjZGVmaW5lIEVQTF9OTVRfR1NfQ09NTVVOSUNBVElORyAgICAweDAwMEMJLy8gc3VwZXIgc3RhdGUKKyNkZWZpbmUgRVBMX05NVF9DU19FUExNT0RFICAgICAgICAgIDB4MDAwRAkvLyBzdXBlciBzdGF0ZQorI2RlZmluZSBFUExfTk1UX01TX0VQTE1PREUgICAgICAgICAgMHgwMDBECS8vIHN1cGVyIHN0YXRlCisKKyNkZWZpbmUgRVBMX05NVF9TVVBFUlNUQVRFX01BU0sgICAgIDB4MDAwRgkvLyBtYXNrIHRvIHNlbGVjdCBzdGF0ZQorCisjZGVmaW5lIEVQTF9OTVRfVFlQRV9VTkRFRklORUQgICAgICAweDAwMDAJLy8gdHlwZSBvZiBOTVQgc3RhdGUgaXMgc3RpbGwgdW5kZWZpbmVkCisjZGVmaW5lIEVQTF9OTVRfVFlQRV9DUyAgICAgICAgICAgICAweDAxMDAJLy8gQ1MgdHlwZSBvZiBOTVQgc3RhdGUKKyNkZWZpbmUgRVBMX05NVF9UWVBFX01TICAgICAgICAgICAgIDB4MDIwMAkvLyBNUyB0eXBlIG9mIE5NVCBzdGF0ZQorI2RlZmluZSBFUExfTk1UX1RZUEVfTUFTSyAgICAgICAgICAgMHgwMzAwCS8vIG1hc2sgdG8gc2VsZWN0IHR5cGUgb2YgTk1UIHN0YXRlIChpLmUuIENTIG9yIE1TKQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gdHlwZWRlZgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gdGhlIGxvd2VyIEJ5dGUgb2YgdGhlIE5NVC1TdGF0ZSBpcyBlbmNvZGVkCisvLyBsaWtlIHRoZSB2YWx1ZXMgaW4gdGhlIEVQTC1TdGFuZGFyZAorLy8gdGhlIGhpZ2hlciBieXRlIGlzIHVzZWQgdG8gZW5jb2RlIE1OCisvLyAoQml0IDEgb2YgdGhlIGhpZ2hlciBieXRlID0gMSkgb3IgQ04gKEJpdCAwIG9mIHRoZQorLy8gaGlnaGVyIGJ5dGUgID0gMSkKKy8vIHRoZSBzdXBlci1zdGF0ZXMgYXJlIG5vdCBtZW50aW9uZWQgaW4gdGhpcworLy8gZW51bSBiZWNhdXNlIHRoZXkgYXJlIG5vIHJlYWwgc3RhdGVzCisvLyAtLT4gdGhlcmUgYXJlIG1hc2tzIGRlZmluZWQgdG8gaW5kZW50aWZ5IHRoZQorLy8gc3VwZXItc3RhdGVzCisKK3R5cGVkZWYgZW51bSB7CisJa0VwbE5tdEdzT2ZmID0gMHgwMDAwLAorCWtFcGxObXRHc0luaXRpYWxpc2luZyA9IDB4MDAxOSwKKwlrRXBsTm10R3NSZXNldEFwcGxpY2F0aW9uID0gMHgwMDI5LAorCWtFcGxObXRHc1Jlc2V0Q29tbXVuaWNhdGlvbiA9IDB4MDAzOSwKKwlrRXBsTm10R3NSZXNldENvbmZpZ3VyYXRpb24gPSAweDAwNzksCisJa0VwbE5tdENzTm90QWN0aXZlID0gMHgwMTFDLAorCWtFcGxObXRDc1ByZU9wZXJhdGlvbmFsMSA9IDB4MDExRCwKKwlrRXBsTm10Q3NTdG9wcGVkID0gMHgwMTRELAorCWtFcGxObXRDc1ByZU9wZXJhdGlvbmFsMiA9IDB4MDE1RCwKKwlrRXBsTm10Q3NSZWFkeVRvT3BlcmF0ZSA9IDB4MDE2RCwKKwlrRXBsTm10Q3NPcGVyYXRpb25hbCA9IDB4MDFGRCwKKwlrRXBsTm10Q3NCYXNpY0V0aGVybmV0ID0gMHgwMTFFLAorCWtFcGxObXRNc05vdEFjdGl2ZSA9IDB4MDIxQywKKwlrRXBsTm10TXNQcmVPcGVyYXRpb25hbDEgPSAweDAyMUQsCisJa0VwbE5tdE1zUHJlT3BlcmF0aW9uYWwyID0gMHgwMjVELAorCWtFcGxObXRNc1JlYWR5VG9PcGVyYXRlID0gMHgwMjZELAorCWtFcGxObXRNc09wZXJhdGlvbmFsID0gMHgwMkZELAorCWtFcGxObXRNc0Jhc2ljRXRoZXJuZXQgPSAweDAyMUUKK30gdEVwbE5tdFN0YXRlOworCisvLyBOTVQtZXZlbnRzCit0eXBlZGVmIGVudW0geworCS8vIEV2ZW50cyBmcm9tIERMTAorCS8vIEV2ZW50cyBkZWZpbmVkIGJ5IEVQTCBWMiBzcGVjaWZpY2F0aW9uCisJa0VwbE5tdEV2ZW50Tm9FdmVudCA9IDB4MDAsCisvLyAgICBrRXBsTm10RXZlbnREbGxNZVByZXMgICAgICAgICAgID0gICAweDAxLAorCWtFcGxObXRFdmVudERsbE1lUHJlc1RpbWVvdXQgPSAweDAyLAorLy8gICAga0VwbE5tdEV2ZW50RGxsTWVBc25kICAgICAgICAgICA9ICAgMHgwMywKKy8vICAgIGtFcGxObXRFdmVudERsbE1lQXNuZFRpbWVvdXQgICAgPSAgIDB4MDQsCisJa0VwbE5tdEV2ZW50RGxsTWVTb2FTZW50ID0gMHgwNCwKKwlrRXBsTm10RXZlbnREbGxNZVNvY1RyaWcgPSAweDA1LAorCWtFcGxObXRFdmVudERsbE1lU29hVHJpZyA9IDB4MDYsCisJa0VwbE5tdEV2ZW50RGxsQ2VTb2MgPSAweDA3LAorCWtFcGxObXRFdmVudERsbENlUHJlcSA9IDB4MDgsCisJa0VwbE5tdEV2ZW50RGxsQ2VQcmVzID0gMHgwOSwKKwlrRXBsTm10RXZlbnREbGxDZVNvYSA9IDB4MEEsCisJa0VwbE5tdEV2ZW50RGxsQ2VBc25kID0gMHgwQiwKKwlrRXBsTm10RXZlbnREbGxDZUZyYW1lVGltZW91dCA9IDB4MEMsCisKKwkvLyBFdmVudHMgdHJpZ2dlcmVkIGJ5IE5NVC1Db21tYW5kcworCWtFcGxObXRFdmVudFN3UmVzZXQgPSAweDEwLAkvLyBOTVRfR1QxLCBOTVRfR1QyLCBOTVRfR1Q4CisJa0VwbE5tdEV2ZW50UmVzZXROb2RlID0gMHgxMSwKKwlrRXBsTm10RXZlbnRSZXNldENvbSA9IDB4MTIsCisJa0VwbE5tdEV2ZW50UmVzZXRDb25maWcgPSAweDEzLAorCWtFcGxObXRFdmVudEVudGVyUHJlT3BlcmF0aW9uYWwyID0gMHgxNCwKKwlrRXBsTm10RXZlbnRFbmFibGVSZWFkeVRvT3BlcmF0ZSA9IDB4MTUsCisJa0VwbE5tdEV2ZW50U3RhcnROb2RlID0gMHgxNiwJLy8gTk1UX0NUNworCWtFcGxObXRFdmVudFN0b3BOb2RlID0gMHgxNywKKworCS8vIEV2ZW50cyB0cmlnZ2VyZWQgYnkgaGlnaGVyIGxheWVyCisJa0VwbE5tdEV2ZW50RW50ZXJSZXNldEFwcCA9IDB4MjAsCisJa0VwbE5tdEV2ZW50RW50ZXJSZXNldENvbSA9IDB4MjEsCisJa0VwbE5tdEV2ZW50SW50ZXJuQ29tRXJyb3IgPSAweDIyLAkvLyBOTVRfR1Q2LCBpbnRlcm5hbCBjb21tdW5pY2F0aW9uIGVycm9yIC0+IGVudGVyIFJlc2V0Q29tbXVuaWNhdGlvbgorCWtFcGxObXRFdmVudEVudGVyUmVzZXRDb25maWcgPSAweDIzLAorCWtFcGxObXRFdmVudEVudGVyQ3NOb3RBY3RpdmUgPSAweDI0LAorCWtFcGxObXRFdmVudEVudGVyTXNOb3RBY3RpdmUgPSAweDI1LAorCWtFcGxObXRFdmVudFRpbWVyQmFzaWNFdGhlcm5ldCA9IDB4MjYsCS8vIE5NVF9DVDM7IHRpbWVyIHRyaWdnZXJlZCBzdGF0ZSBjaGFuZ2UgKE5vdEFjdGl2ZSAtPiBCYXNpY0V0aCkKKwlrRXBsTm10RXZlbnRUaW1lck1zUHJlT3AxID0gMHgyNywJLy8gZW50ZXIgUHJlT3AxIG9uIE1OIChOb3RBY3RpdmUgLT4gTXNQcmVPcDEpCisJa0VwbE5tdEV2ZW50Tm10Q3ljbGVFcnJvciA9IDB4MjgsCS8vIE5NVF9DVDExLCBOTVRfTVQ2OyBlcnJvciBkdXJpbmcgY3ljbGUgLT4gZW50ZXIgUHJlT3AxCisJa0VwbE5tdEV2ZW50VGltZXJNc1ByZU9wMiA9IDB4MjksCS8vIGVudGVyIFByZU9wMiBvbiBNTiAoTXNQcmVPcDEgLT4gTXNQcmVPcDIgaWYga0VwbE5tdEV2ZW50QWxsTWFuZGF0b3J5Q05JZGVudCkKKwlrRXBsTm10RXZlbnRBbGxNYW5kYXRvcnlDTklkZW50ID0gMHgyQSwJLy8gZW50ZXIgUHJlT3AyIG9uIE1OIGlmIGtFcGxObXRFdmVudFRpbWVyTXNQcmVPcDIKKwlrRXBsTm10RXZlbnRFbnRlclJlYWR5VG9PcGVyYXRlID0gMHgyQiwJLy8gYXBwbGljYXRpb24gcmVhZHkgZm9yIHRoZSBzdGF0ZSBSZWFkeVRvT3AKKwlrRXBsTm10RXZlbnRFbnRlck1zT3BlcmF0aW9uYWwgPSAweDJDLAkvLyBlbnRlciBPcGVyYXRpb25hbCBvbiBNTgorCWtFcGxObXRFdmVudFN3aXRjaE9mZiA9IDB4MkQsCS8vIGVudGVyIHN0YXRlIE9mZgorCWtFcGxObXRFdmVudENyaXRpY2FsRXJyb3IgPSAweDJFLAkvLyBlbnRlciBzdGF0ZSBPZmYgYmVjYXVzZSBvZiBjcml0aWNhbCBlcnJvcgorCit9IHRFcGxObXRFdmVudDsKKworLy8gdHlwZSBmb3IgYXJndW1lbnQgb2YgZXZlbnQga0VwbEV2ZW50VHlwZU5tdFN0YXRlQ2hhbmdlCit0eXBlZGVmIHN0cnVjdCB7CisJdEVwbE5tdFN0YXRlIG1fTmV3Tm10U3RhdGU7CisJdEVwbE5tdEV2ZW50IG1fTm10RXZlbnQ7CisKK30gdEVwbEV2ZW50Tm10U3RhdGVDaGFuZ2U7CisKKy8vIHN0cnVjdHVyZSBmb3Iga0VwbEV2ZW50VHlwZUhlYXJ0YmVhdAordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGludCBtX3VpTm9kZUlkOwkvLyBOb2RlSWQKKwl0RXBsTm10U3RhdGUgbV9ObXRTdGF0ZTsJLy8gTk1UIHN0YXRlIChyZW1lbWJlciBkaXN0aW5ndWlzaCBiZXR3ZWVuIE1OIC8gQ04pCisJV09SRCBtX3dFcnJvckNvZGU7CS8vIEVQTCBlcnJvciBjb2RlIGluIGNhc2Ugb2YgTk1UIHN0YXRlIE5vdEFjdGl2ZQorCit9IHRFcGxIZWFydGJlYXRFdmVudDsKKwordHlwZWRlZiBlbnVtIHsKKwlrRXBsTm10Tm9kZUV2ZW50Rm91bmQgPSAweDAwLAorCWtFcGxObXROb2RlRXZlbnRVcGRhdGVTdyA9IDB4MDEsCS8vIGFwcGxpY2F0aW9uIHNoYWxsIHVwZGF0ZSBzb2Z0d2FyZSBvbiBDTgorCWtFcGxObXROb2RlRXZlbnRDaGVja0NvbmYgPSAweDAyLAkvLyBhcHBsaWNhdGlvbiAvIENvbmZpZ3VyYXRpb24gTWFuYWdlciBzaGFsbCBjaGVjayBhbmQgdXBkYXRlIGNvbmZpZ3VyYXRpb24gb24gQ04KKwlrRXBsTm10Tm9kZUV2ZW50VXBkYXRlQ29uZiA9IDB4MDMsCS8vIGFwcGxpY2F0aW9uIC8gQ29uZmlndXJhdGlvbiBNYW5hZ2VyIHNoYWxsIHVwZGF0ZSBjb25maWd1cmF0aW9uIG9uIENOIChjaGVjayB3YXMgZG9uZSBieSBObXRNbiBtb2R1bGUpCisJa0VwbE5tdE5vZGVFdmVudFZlcmlmeUNvbmYgPSAweDA0LAkvLyBhcHBsaWNhdGlvbiAvIENvbmZpZ3VyYXRpb24gTWFuYWdlciBzaGFsbCB2ZXJpZnkgY29uZmlndXJhdGlvbiBvZiBDTgorCWtFcGxObXROb2RlRXZlbnRSZWFkeVRvU3RhcnQgPSAweDA1LAkvLyBpc3N1ZWQgaWYgRVBMX05NVFNUX05PX1NUQVJUTk9ERSBzZXQKKwkvLyBhcHBsaWNhdGlvbiBtdXN0IGNhbGwgRXBsTm10TW51U2VuZE5tdENvbW1hbmQoa0VwbE5tdENtZFN0YXJ0Tm9kZSkgbWFudWFsbHkKKwlrRXBsTm10Tm9kZUV2ZW50Tm10U3RhdGUgPSAweDA2LAorCWtFcGxObXROb2RlRXZlbnRFcnJvciA9IDB4MDcsCS8vIE5NVCBlcnJvciBvZiBDTgorCit9IHRFcGxObXROb2RlRXZlbnQ7CisKK3R5cGVkZWYgZW51bSB7CisJa0VwbE5tdE5vZGVDb21tYW5kQm9vdCA9IDB4MDEsCS8vIGlmIEVQTF9OT0RFQVNTSUdOX1NUQVJUX0NOIG5vdCBzZXQgaXQgbXVzdCBiZSBpc3N1ZWQgYWZ0ZXIga0VwbE5tdE5vZGVFdmVudEZvdW5kCisJa0VwbE5tdE5vZGVDb21tYW5kU3dPayA9IDB4MDIsCS8vIGFwcGxpY2F0aW9uIHVwZGF0ZWQgc29mdHdhcmUgb24gQ04gc3VjY2Vzc2Z1bGx5CisJa0VwbE5tdE5vZGVDb21tYW5kU3dVcGRhdGVkID0gMHgwMywJLy8gYXBwbGljYXRpb24gdXBkYXRlZCBzb2Z0d2FyZSBvbiBDTiBzdWNjZXNzZnVsbHkKKwlrRXBsTm10Tm9kZUNvbW1hbmRDb25mT2sgPSAweDA0LAkvLyBhcHBsaWNhdGlvbiAvIENvbmZpZ3VyYXRpb24gTWFuYWdlciBoYXMgdXBkYXRlZCBjb25maWd1cmF0aW9uIG9uIENOIHN1Y2Nlc3NmdWxseQorCWtFcGxObXROb2RlQ29tbWFuZENvbmZSZXNldCA9IDB4MDUsCS8vIGFwcGxpY2F0aW9uIC8gQ29uZmlndXJhdGlvbiBNYW5hZ2VyIGhhcyB1cGRhdGVkIGNvbmZpZ3VyYXRpb24gb24gQ04gc3VjY2Vzc2Z1bGx5CisJLy8gYW5kIENOIG5lZWRzIFJlc2V0Q29uZiBzbyB0aGF0IHRoZSBjb25maWd1cmF0aW9uIGdldHMgYWN0aXZlZAorCWtFcGxObXROb2RlQ29tbWFuZENvbmZFcnIgPSAweDA2LAkvLyBhcHBsaWNhdGlvbiAvIENvbmZpZ3VyYXRpb24gTWFuYWdlciBmYWlsZWQgb24gdXBkYXRpbmcgY29uZmlndXJhdGlvbiBvbiBDTgorCWtFcGxObXROb2RlQ29tbWFuZFN0YXJ0ID0gMHgwNywJLy8gaWYgRVBMX05NVFNUX05PX1NUQVJUTk9ERSBzZXQgaXQgbXVzdCBiZSBpc3N1ZWQgYWZ0ZXIga0VwbE5tdE5vZGVFdmVudFJlYWR5VG9TdGFydAorCit9IHRFcGxObXROb2RlQ29tbWFuZDsKKwordHlwZWRlZiBlbnVtIHsKKwlrRXBsTm10Qm9vdEV2ZW50Qm9vdFN0ZXAxRmluaXNoID0gMHgwMCwJLy8gUHJlT3AyIGlzIHBvc3NpYmxlCisJa0VwbE5tdEJvb3RFdmVudEJvb3RTdGVwMkZpbmlzaCA9IDB4MDEsCS8vIFJlYWR5VG9PcCBpcyBwb3NzaWJsZQorCWtFcGxObXRCb290RXZlbnRDaGVja0NvbUZpbmlzaCA9IDB4MDIsCS8vIE9wZXJhdGlvbmFsIGlzIHBvc3NpYmxlCisJa0VwbE5tdEJvb3RFdmVudE9wZXJhdGlvbmFsID0gMHgwMywJLy8gYWxsIG1hbmRhdG9yeSBDTnMgYXJlIE9wZXJhdGlvbmFsCisJa0VwbE5tdEJvb3RFdmVudEVycm9yID0gMHgwNCwJLy8gYm9vdCBwcm9jZXNzIGhhbHRlZCBiZWNhdXNlIG9mIGFuIGVycm9yCisKK30gdEVwbE5tdEJvb3RFdmVudDsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNlbmRpZiAvLyAjaWZuZGVmIF9FUExOTVRfSF8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsTm10Q251LmMgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbE5tdENudS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyZjQ2ZGEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbE5tdENudS5jCkBAIC0wLDAgKzEsNzA0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgb3BlblBPV0VSTElOSworCisgIERlc2NyaXB0aW9uOiAgc291cmNlIGZpbGUgZm9yIE5NVC1DTi1Vc2Vyc3BhY2UtTW9kdWxlCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRXBsTm10Q251LmMsdiAkCisKKyAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAorCisgICAgICAgICAgICAgICAgJFJldmlzaW9uOiAxLjYgJCAgJERhdGU6IDIwMDgvMTAvMTcgMTU6MzI6MzIgJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgICAgIEdDQyBWMy40CisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwNi8wNi8wOSBrLnQuOiAgIHN0YXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiRXBsSW5jLmgiCisjaW5jbHVkZSAidXNlci9FcGxObXRDbnUuaCIKKyNpbmNsdWRlICJ1c2VyL0VwbERsbHVDYWwuaCIKKworI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRfQ04pKSAhPSAwKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICBHIEwgTyBCIEEgTCAgIEQgRSBGIEkgTiBJIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvY2FsIHR5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgaW50IG1fdWlOb2RlSWQ7CisJdEVwbE5tdHVDaGVja0V2ZW50Q2FsbGJhY2sgbV9wZm5DaGVja0V2ZW50Q2I7CisKK30gdEVwbE5tdENudUluc3RhbmNlOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbW9kdWwgZ2xvYmFsZSB2YXJzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdEVwbE5tdENudUluc3RhbmNlIEVwbE5tdENudUluc3RhbmNlX2c7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdEVwbE5tdENvbW1hbmQgRXBsTm10Q251R2V0Tm10Q29tbWFuZCh0RXBsRnJhbWVJbmZvICogcEZyYW1lSW5mb19wKTsKKworc3RhdGljIEJPT0wgRXBsTm10Q251Tm9kZUlkTGlzdChCWVRFICogcGJObXRDb21tYW5kRGF0ZV9wKTsKKworc3RhdGljIHRFcGxLZXJuZWwgUFVCTElDIEVwbE5tdENudUNvbW1hbmRDYih0RXBsRnJhbWVJbmZvICogcEZyYW1lSW5mb19wKTsKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICBQIFUgQiBMIEkgQyAgIEYgVSBOIEMgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE5tdENudUluaXQKKy8vCisvLyBEZXNjcmlwdGlvbjogaW5pdCB0aGUgZmlyc3QgaW5zdGFuY2Ugb2YgdGhlIG1vZHVsZQorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczogICAgICB1aU5vZGVJZF9wID0gTm9kZUlkIG9mIHRoZSBsb2NhbCBub2RlCisvLworLy8KKy8vIFJldHVybnM6ICAgICAgICAgdEVwbEtlcm5lbCA9IGVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbE5tdENudUluaXQodW5zaWduZWQgaW50IHVpTm9kZUlkX3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisKKwlSZXQgPSBFcGxObXRDbnVBZGRJbnN0YW5jZSh1aU5vZGVJZF9wKTsKKworCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE5tdENudUFkZEluc3RhbmNlCisvLworLy8gRGVzY3JpcHRpb246IGluaXQgdGhlIGFkZCBuZXcgaW5zdGFuY2Ugb2YgdGhlIG1vZHVsZQorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczogICAgICB1aU5vZGVJZF9wID0gTm9kZUlkIG9mIHRoZSBsb2NhbCBub2RlCisvLworLy8KKy8vIFJldHVybnM6ICAgICAgICAgdEVwbEtlcm5lbCA9IGVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbE5tdENudUFkZEluc3RhbmNlKHVuc2lnbmVkIGludCB1aU5vZGVJZF9wKQoreworCXRFcGxLZXJuZWwgUmV0OworCisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwkvLyByZXNldCBpbnN0YW5jZSBzdHJ1Y3R1cmUKKwlFUExfTUVNU0VUKCZFcGxObXRDbnVJbnN0YW5jZV9nLCAwLCBzaXplb2YoRXBsTm10Q251SW5zdGFuY2VfZykpOworCisJLy8gc2F2ZSBub2RlaWQKKwlFcGxObXRDbnVJbnN0YW5jZV9nLm1fdWlOb2RlSWQgPSB1aU5vZGVJZF9wOworCisJLy8gcmVnaXN0ZXIgY2FsbGJhY2stZnVuY3Rpb24gZm9yIE5NVC1jb21tYW5kcworI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9ETExVKSkgIT0gMCkKKwlSZXQgPSBFcGxEbGx1Q2FsUmVnQXNuZFNlcnZpY2Uoa0VwbERsbEFzbmRObXRDb21tYW5kLAorCQkJCSAgICAgICBFcGxObXRDbnVDb21tYW5kQ2IsCisJCQkJICAgICAgIGtFcGxEbGxBc25kRmlsdGVyTG9jYWwpOworI2VuZGlmCisKKwlyZXR1cm4gUmV0OworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE5tdENudURlbEluc3RhbmNlCisvLworLy8gRGVzY3JpcHRpb246IGRlbHRlIGluc3RhbmNlIG9mIHRoZSBtb2R1bGUKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6CisvLworLy8KKy8vIFJldHVybnM6ICAgICAgICAgdEVwbEtlcm5lbCA9IGVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbE5tdENudURlbEluc3RhbmNlKCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKworCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX0RMTFUpKSAhPSAwKQorCS8vIGRlcmVnaXN0ZXIgY2FsbGJhY2sgZnVuY3Rpb24gZnJvbSBETEwKKwlSZXQgPSBFcGxEbGx1Q2FsUmVnQXNuZFNlcnZpY2Uoa0VwbERsbEFzbmRObXRDb21tYW5kLAorCQkJCSAgICAgICBOVUxMLCBrRXBsRGxsQXNuZEZpbHRlck5vbmUpOworI2VuZGlmCisKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxObXRDbnVTZW5kTm10UmVxdWVzdAorLy8KKy8vIERlc2NyaXB0aW9uOiBTZW5kIGFuIE5NVC1SZXF1ZXN0IHRvIHRoZSBNTgorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczogICAgICB1aU5vZGVJZF9wID0gTm9kZUlkIG9mIHRoZSBsb2NhbCBub2RlCisvLyAgICAgICAgICAgICAgICAgIE5tdENvbW1hbmRfcCA9IHJlcXVlc3RlZCBOTVQtQ29tbWFuZAorLy8KKy8vCisvLyBSZXR1cm5zOiAgICAgICAgIHRFcGxLZXJuZWwgPSBlcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxObXRDbnVTZW5kTm10UmVxdWVzdCh1bnNpZ25lZCBpbnQgdWlOb2RlSWRfcCwKKwkJCQkJCSAgICAgICB0RXBsTm10Q29tbWFuZAorCQkJCQkJICAgICAgIE5tdENvbW1hbmRfcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKwl0RXBsRnJhbWVJbmZvIE5tdFJlcXVlc3RGcmFtZUluZm87CisJdEVwbEZyYW1lIE5tdFJlcXVlc3RGcmFtZTsKKworCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJLy8gYnVpbGQgZnJhbWUKKwlFUExfTUVNU0VUKCZObXRSZXF1ZXN0RnJhbWUubV9iZV9hYkRzdE1hY1swXSwgMHgwMCwgc2l6ZW9mKE5tdFJlcXVlc3RGcmFtZS5tX2JlX2FiRHN0TWFjKSk7CS8vIHNldCBieSBETEwKKwlFUExfTUVNU0VUKCZObXRSZXF1ZXN0RnJhbWUubV9iZV9hYlNyY01hY1swXSwgMHgwMCwgc2l6ZW9mKE5tdFJlcXVlc3RGcmFtZS5tX2JlX2FiU3JjTWFjKSk7CS8vIHNldCBieSBETEwKKwlBbWlTZXRXb3JkVG9CZSgmTm10UmVxdWVzdEZyYW1lLm1fYmVfd0V0aGVyVHlwZSwKKwkJICAgICAgIEVQTF9DX0RMTF9FVEhFUlRZUEVfRVBMKTsKKwlBbWlTZXRCeXRlVG9MZSgmTm10UmVxdWVzdEZyYW1lLm1fbGVfYkRzdE5vZGVJZCwgKEJZVEUpIEVQTF9DX0FEUl9NTl9ERUZfTk9ERV9JRCk7CS8vIG5vZGUgaWQgb2YgdGhlIE1OCisJQW1pU2V0Qnl0ZVRvTGUoJk5tdFJlcXVlc3RGcmFtZS5tX2xlX2JNZXNzYWdlVHlwZSwKKwkJICAgICAgIChCWVRFKSBrRXBsTXNnVHlwZUFzbmQpOworCUFtaVNldEJ5dGVUb0xlKCZObXRSZXF1ZXN0RnJhbWUubV9EYXRhLm1fQXNuZC5tX2xlX2JTZXJ2aWNlSWQsCisJCSAgICAgICAoQllURSkga0VwbERsbEFzbmRObXRSZXF1ZXN0KTsKKwlBbWlTZXRCeXRlVG9MZSgmTm10UmVxdWVzdEZyYW1lLm1fRGF0YS5tX0FzbmQubV9QYXlsb2FkLgorCQkgICAgICAgbV9ObXRSZXF1ZXN0U2VydmljZS5tX2xlX2JObXRDb21tYW5kSWQsCisJCSAgICAgICAoQllURSkgTm10Q29tbWFuZF9wKTsKKwlBbWlTZXRCeXRlVG9MZSgmTm10UmVxdWVzdEZyYW1lLm1fRGF0YS5tX0FzbmQubV9QYXlsb2FkLm1fTm10UmVxdWVzdFNlcnZpY2UubV9sZV9iVGFyZ2V0Tm9kZUlkLCAoQllURSkgdWlOb2RlSWRfcCk7CS8vIHRhcmdldCBmb3IgdGhlIG5tdCBjb21tYW5kCisJRVBMX01FTVNFVCgmTm10UmVxdWVzdEZyYW1lLm1fRGF0YS5tX0FzbmQubV9QYXlsb2FkLm1fTm10UmVxdWVzdFNlcnZpY2UuCisJCSAgIG1fbGVfYWJObXRDb21tYW5kRGF0YVswXSwgMHgwMCwKKwkJICAgc2l6ZW9mKE5tdFJlcXVlc3RGcmFtZS5tX0RhdGEubV9Bc25kLm1fUGF5bG9hZC4KKwkJCSAgbV9ObXRSZXF1ZXN0U2VydmljZS5tX2xlX2FiTm10Q29tbWFuZERhdGEpKTsKKworCS8vIGJ1aWxkIGluZm8tc3RydWN0dXJlCisJTm10UmVxdWVzdEZyYW1lSW5mby5tX05ldFRpbWUubV9kd05hbm9TZWMgPSAwOworCU5tdFJlcXVlc3RGcmFtZUluZm8ubV9OZXRUaW1lLm1fZHdTZWMgPSAwOworCU5tdFJlcXVlc3RGcmFtZUluZm8ubV9wRnJhbWUgPSAmTm10UmVxdWVzdEZyYW1lOworCU5tdFJlcXVlc3RGcmFtZUluZm8ubV91aUZyYW1lU2l6ZSA9IEVQTF9DX0RMTF9NSU5TSVpFX05NVFJFUTsJLy8gc2l6ZW9mKE5tdFJlcXVlc3RGcmFtZSk7CisKKwkvLyBzZW5kIE5NVC1SZXF1ZXN0CisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX0RMTFUpKSAhPSAwKQorCVJldCA9IEVwbERsbHVDYWxBc3luY1NlbmQoJk5tdFJlcXVlc3RGcmFtZUluZm8sCS8vIHBvaW50ZXIgdG8gZnJhbWVpbmZvCisJCQkJICBrRXBsRGxsQXN5bmNSZXFQcmlvTm10KTsJLy8gcHJpb3JpdHkKKyNlbmRpZgorCisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsTm10Q251UmVnaXN0ZXJTdGF0ZUNoYW5nZUNiCisvLworLy8gRGVzY3JpcHRpb246IHJlZ2lzdGVyIENhbGxiYWNrLWZ1bmN0aW9uIGdvIGdldCBpbmZvcm1lZCBhYm91dCBhCisvLyAgICAgICAgICAgICAgTk1ULUNoYW5nZS1TdGF0ZS1FdmVudAorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczogIHBmbkVwbE5tdFN0YXRlQ2hhbmdlQ2JfcCA9IGZ1bmN0aW9ucG9pbnRlcgorLy8KKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgPSBlcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDCitFcGxObXRDbnVSZWdpc3RlckNoZWNrRXZlbnRDYih0RXBsTm10dUNoZWNrRXZlbnRDYWxsYmFjaworCQkJICAgICAgcGZuRXBsTm10Q2hlY2tFdmVudENiX3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCS8vIHNhdmUgY2FsbGJhY2stZnVuY3Rpb24gaW4gbW9kdWwgZ2xvYmFsIHZhcgorCUVwbE5tdENudUluc3RhbmNlX2cubV9wZm5DaGVja0V2ZW50Q2IgPSBwZm5FcGxObXRDaGVja0V2ZW50Q2JfcDsKKworCXJldHVybiBSZXQ7CisKK30KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICBQIFIgSSBWIEEgVCBFICAgRiBVIE4gQyBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE5tdENudUNvbW1hbmRDYgorLy8KKy8vIERlc2NyaXB0aW9uOiBjYWxsYmFjayBmdW5rdGlvbiBmb3IgTk1ULUNvbW1hbmRzCisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOiAgICAgIHBGcmFtZUluZm9fcCA9IEZyYW1lIHdpdGggdGhlIE5NVC1Db21tYW5kbworLy8KKy8vCisvLyBSZXR1cm5zOiAgICAgICAgIHRFcGxLZXJuZWwgPSBlcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N0YXRpYyB0RXBsS2VybmVsIFBVQkxJQyBFcGxObXRDbnVDb21tYW5kQ2IodEVwbEZyYW1lSW5mbyAqIHBGcmFtZUluZm9fcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCXRFcGxObXRDb21tYW5kIE5tdENvbW1hbmQ7CisJQk9PTCBmTm9kZUlkSW5MaXN0OworCXRFcGxObXRFdmVudCBObXRFdmVudCA9IGtFcGxObXRFdmVudE5vRXZlbnQ7CisKKwlpZiAocEZyYW1lSW5mb19wID09IE5VTEwpIHsKKwkJUmV0ID0ga0VwbE5tdEludmFsaWRGcmFtZVBvaW50ZXI7CisJCWdvdG8gRXhpdDsKKwl9CisKKwlObXRDb21tYW5kID0gRXBsTm10Q251R2V0Tm10Q29tbWFuZChwRnJhbWVJbmZvX3ApOworCisJLy8gY2hlY2sgTk1ULUNvbW1hbmQKKwlzd2l0Y2ggKE5tdENvbW1hbmQpIHsKKworCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkvLyBwbGFpbiBOTVQgc3RhdGUgY29tbWFuZHMKKwljYXNlIGtFcGxObXRDbWRTdGFydE5vZGU6CisJCXsJCS8vIHNlbmQgTk1ULUV2ZW50IHRvIHN0YXRlIG1hc2NoaW5lIGtFcGxObXRFdmVudFN0YXJ0Tm9kZQorCQkJTm10RXZlbnQgPSBrRXBsTm10RXZlbnRTdGFydE5vZGU7CisJCQlicmVhazsKKwkJfQorCisJY2FzZSBrRXBsTm10Q21kU3RvcE5vZGU6CisJCXsJCS8vIHNlbmQgTk1ULUV2ZW50IHRvIHN0YXRlIG1hc2NoaW5lIGtFcGxObXRFdmVudFN0b3BOb2RlCisJCQlObXRFdmVudCA9IGtFcGxObXRFdmVudFN0b3BOb2RlOworCQkJYnJlYWs7CisJCX0KKworCWNhc2Uga0VwbE5tdENtZEVudGVyUHJlT3BlcmF0aW9uYWwyOgorCQl7CQkvLyBzZW5kIE5NVC1FdmVudCB0byBzdGF0ZSBtYXNjaGluZSBrRXBsTm10RXZlbnRFbnRlclByZU9wZXJhdGlvbmFsMgorCQkJTm10RXZlbnQgPSBrRXBsTm10RXZlbnRFbnRlclByZU9wZXJhdGlvbmFsMjsKKwkJCWJyZWFrOworCQl9CisKKwljYXNlIGtFcGxObXRDbWRFbmFibGVSZWFkeVRvT3BlcmF0ZToKKwkJewkJLy8gc2VuZCBOTVQtRXZlbnQgdG8gc3RhdGUgbWFzY2hpbmUga0VwbE5tdEV2ZW50RW5hYmxlUmVhZHlUb09wZXJhdGUKKwkJCU5tdEV2ZW50ID0ga0VwbE5tdEV2ZW50RW5hYmxlUmVhZHlUb09wZXJhdGU7CisJCQlicmVhazsKKwkJfQorCisJY2FzZSBrRXBsTm10Q21kUmVzZXROb2RlOgorCQl7CQkvLyBzZW5kIE5NVC1FdmVudCB0byBzdGF0ZSBtYXNjaGluZSBrRXBsTm10RXZlbnRSZXNldE5vZGUKKwkJCU5tdEV2ZW50ID0ga0VwbE5tdEV2ZW50UmVzZXROb2RlOworCQkJYnJlYWs7CisJCX0KKworCWNhc2Uga0VwbE5tdENtZFJlc2V0Q29tbXVuaWNhdGlvbjoKKwkJewkJLy8gc2VuZCBOTVQtRXZlbnQgdG8gc3RhdGUgbWFzY2hpbmUga0VwbE5tdEV2ZW50UmVzZXRDb20KKwkJCU5tdEV2ZW50ID0ga0VwbE5tdEV2ZW50UmVzZXRDb207CisJCQlicmVhazsKKwkJfQorCisJY2FzZSBrRXBsTm10Q21kUmVzZXRDb25maWd1cmF0aW9uOgorCQl7CQkvLyBzZW5kIE5NVC1FdmVudCB0byBzdGF0ZSBtYXNjaGluZSBrRXBsTm10RXZlbnRSZXNldENvbmZpZworCQkJTm10RXZlbnQgPSBrRXBsTm10RXZlbnRSZXNldENvbmZpZzsKKwkJCWJyZWFrOworCQl9CisKKwljYXNlIGtFcGxObXRDbWRTd1Jlc2V0OgorCQl7CQkvLyBzZW5kIE5NVC1FdmVudCB0byBzdGF0ZSBtYXNjaGluZSBrRXBsTm10RXZlbnRTd1Jlc2V0CisJCQlObXRFdmVudCA9IGtFcGxObXRFdmVudFN3UmVzZXQ7CisJCQlicmVhazsKKwkJfQorCisJCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCS8vIGV4dGVuZGVkIE5NVCBzdGF0ZSBjb21tYW5kcworCisJY2FzZSBrRXBsTm10Q21kU3RhcnROb2RlRXg6CisJCXsKKwkJCS8vIGNoZWNrIGlmIG93biBub2RlaWQgaXMgaW4gRVBMIG5vZGUgbGlzdAorCQkJZk5vZGVJZEluTGlzdCA9CisJCQkgICAgRXBsTm10Q251Tm9kZUlkTGlzdCgmCisJCQkJCQkocEZyYW1lSW5mb19wLT5tX3BGcmFtZS0+bV9EYXRhLgorCQkJCQkJIG1fQXNuZC5tX1BheWxvYWQuCisJCQkJCQkgbV9ObXRDb21tYW5kU2VydmljZS4KKwkJCQkJCSBtX2xlX2FiTm10Q29tbWFuZERhdGFbMF0pKTsKKwkJCWlmIChmTm9kZUlkSW5MaXN0ICE9IEZBTFNFKSB7CS8vIG93biBub2RlaWQgaW4gbGlzdAorCQkJCS8vIHNlbmQgZXZlbnQgdG8gcHJvY2VzcyBjb21tYW5kCisJCQkJTm10RXZlbnQgPSBrRXBsTm10RXZlbnRTdGFydE5vZGU7CisJCQl9CisJCQlicmVhazsKKwkJfQorCisJY2FzZSBrRXBsTm10Q21kU3RvcE5vZGVFeDoKKwkJewkJLy8gY2hlY2sgaWYgb3duIG5vZGVpZCBpcyBpbiBFUEwgbm9kZSBsaXN0CisJCQlmTm9kZUlkSW5MaXN0ID0KKwkJCSAgICBFcGxObXRDbnVOb2RlSWRMaXN0KCZwRnJhbWVJbmZvX3AtPm1fcEZyYW1lLT5tX0RhdGEuCisJCQkJCQltX0FzbmQubV9QYXlsb2FkLgorCQkJCQkJbV9ObXRDb21tYW5kU2VydmljZS4KKwkJCQkJCW1fbGVfYWJObXRDb21tYW5kRGF0YVswXSk7CisJCQlpZiAoZk5vZGVJZEluTGlzdCAhPSBGQUxTRSkgewkvLyBvd24gbm9kZWlkIGluIGxpc3QKKwkJCQkvLyBzZW5kIGV2ZW50IHRvIHByb2Nlc3MgY29tbWFuZAorCQkJCU5tdEV2ZW50ID0ga0VwbE5tdEV2ZW50U3RvcE5vZGU7CisJCQl9CisJCQlicmVhazsKKwkJfQorCisJY2FzZSBrRXBsTm10Q21kRW50ZXJQcmVPcGVyYXRpb25hbDJFeDoKKwkJewkJLy8gY2hlY2sgaWYgb3duIG5vZGVpZCBpcyBpbiBFUEwgbm9kZSBsaXN0CisJCQlmTm9kZUlkSW5MaXN0ID0KKwkJCSAgICBFcGxObXRDbnVOb2RlSWRMaXN0KCZwRnJhbWVJbmZvX3AtPm1fcEZyYW1lLT5tX0RhdGEuCisJCQkJCQltX0FzbmQubV9QYXlsb2FkLgorCQkJCQkJbV9ObXRDb21tYW5kU2VydmljZS4KKwkJCQkJCW1fbGVfYWJObXRDb21tYW5kRGF0YVswXSk7CisJCQlpZiAoZk5vZGVJZEluTGlzdCAhPSBGQUxTRSkgewkvLyBvd24gbm9kZWlkIGluIGxpc3QKKwkJCQkvLyBzZW5kIGV2ZW50IHRvIHByb2Nlc3MgY29tbWFuZAorCQkJCU5tdEV2ZW50ID0ga0VwbE5tdEV2ZW50RW50ZXJQcmVPcGVyYXRpb25hbDI7CisJCQl9CisJCQlicmVhazsKKwkJfQorCisJY2FzZSBrRXBsTm10Q21kRW5hYmxlUmVhZHlUb09wZXJhdGVFeDoKKwkJewkJLy8gY2hlY2sgaWYgb3duIG5vZGVpZCBpcyBpbiBFUEwgbm9kZSBsaXN0CisJCQlmTm9kZUlkSW5MaXN0ID0KKwkJCSAgICBFcGxObXRDbnVOb2RlSWRMaXN0KCZwRnJhbWVJbmZvX3AtPm1fcEZyYW1lLT5tX0RhdGEuCisJCQkJCQltX0FzbmQubV9QYXlsb2FkLgorCQkJCQkJbV9ObXRDb21tYW5kU2VydmljZS4KKwkJCQkJCW1fbGVfYWJObXRDb21tYW5kRGF0YVswXSk7CisJCQlpZiAoZk5vZGVJZEluTGlzdCAhPSBGQUxTRSkgewkvLyBvd24gbm9kZWlkIGluIGxpc3QKKwkJCQkvLyBzZW5kIGV2ZW50IHRvIHByb2Nlc3MgY29tbWFuZAorCQkJCU5tdEV2ZW50ID0ga0VwbE5tdEV2ZW50RW5hYmxlUmVhZHlUb09wZXJhdGU7CisJCQl9CisJCQlicmVhazsKKwkJfQorCisJY2FzZSBrRXBsTm10Q21kUmVzZXROb2RlRXg6CisJCXsJCS8vIGNoZWNrIGlmIG93biBub2RlaWQgaXMgaW4gRVBMIG5vZGUgbGlzdAorCQkJZk5vZGVJZEluTGlzdCA9CisJCQkgICAgRXBsTm10Q251Tm9kZUlkTGlzdCgmcEZyYW1lSW5mb19wLT5tX3BGcmFtZS0+bV9EYXRhLgorCQkJCQkJbV9Bc25kLm1fUGF5bG9hZC4KKwkJCQkJCW1fTm10Q29tbWFuZFNlcnZpY2UuCisJCQkJCQltX2xlX2FiTm10Q29tbWFuZERhdGFbMF0pOworCQkJaWYgKGZOb2RlSWRJbkxpc3QgIT0gRkFMU0UpIHsJLy8gb3duIG5vZGVpZCBpbiBsaXN0CisJCQkJLy8gc2VuZCBldmVudCB0byBwcm9jZXNzIGNvbW1hbmQKKwkJCQlObXRFdmVudCA9IGtFcGxObXRFdmVudFJlc2V0Tm9kZTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisKKwljYXNlIGtFcGxObXRDbWRSZXNldENvbW11bmljYXRpb25FeDoKKwkJewkJLy8gY2hlY2sgaWYgb3duIG5vZGVpZCBpcyBpbiBFUEwgbm9kZSBsaXN0CisJCQlmTm9kZUlkSW5MaXN0ID0KKwkJCSAgICBFcGxObXRDbnVOb2RlSWRMaXN0KCZwRnJhbWVJbmZvX3AtPm1fcEZyYW1lLT5tX0RhdGEuCisJCQkJCQltX0FzbmQubV9QYXlsb2FkLgorCQkJCQkJbV9ObXRDb21tYW5kU2VydmljZS4KKwkJCQkJCW1fbGVfYWJObXRDb21tYW5kRGF0YVswXSk7CisJCQlpZiAoZk5vZGVJZEluTGlzdCAhPSBGQUxTRSkgewkvLyBvd24gbm9kZWlkIGluIGxpc3QKKwkJCQkvLyBzZW5kIGV2ZW50IHRvIHByb2Nlc3MgY29tbWFuZAorCQkJCU5tdEV2ZW50ID0ga0VwbE5tdEV2ZW50UmVzZXRDb207CisJCQl9CisJCQlicmVhazsKKwkJfQorCisJY2FzZSBrRXBsTm10Q21kUmVzZXRDb25maWd1cmF0aW9uRXg6CisJCXsJCS8vIGNoZWNrIGlmIG93biBub2RlaWQgaXMgaW4gRVBMIG5vZGUgbGlzdAorCQkJZk5vZGVJZEluTGlzdCA9CisJCQkgICAgRXBsTm10Q251Tm9kZUlkTGlzdCgmcEZyYW1lSW5mb19wLT5tX3BGcmFtZS0+bV9EYXRhLgorCQkJCQkJbV9Bc25kLm1fUGF5bG9hZC4KKwkJCQkJCW1fTm10Q29tbWFuZFNlcnZpY2UuCisJCQkJCQltX2xlX2FiTm10Q29tbWFuZERhdGFbMF0pOworCQkJaWYgKGZOb2RlSWRJbkxpc3QgIT0gRkFMU0UpIHsJLy8gb3duIG5vZGVpZCBpbiBsaXN0CisJCQkJLy8gc2VuZCBldmVudCB0byBwcm9jZXNzIGNvbW1hbmQKKwkJCQlObXRFdmVudCA9IGtFcGxObXRFdmVudFJlc2V0Q29uZmlnOworCQkJfQorCQkJYnJlYWs7CisJCX0KKworCWNhc2Uga0VwbE5tdENtZFN3UmVzZXRFeDoKKwkJewkJLy8gY2hlY2sgaWYgb3duIG5vZGVpZCBpcyBpbiBFUEwgbm9kZSBsaXN0CisJCQlmTm9kZUlkSW5MaXN0ID0KKwkJCSAgICBFcGxObXRDbnVOb2RlSWRMaXN0KCZwRnJhbWVJbmZvX3AtPm1fcEZyYW1lLT5tX0RhdGEuCisJCQkJCQltX0FzbmQubV9QYXlsb2FkLgorCQkJCQkJbV9ObXRDb21tYW5kU2VydmljZS4KKwkJCQkJCW1fbGVfYWJObXRDb21tYW5kRGF0YVswXSk7CisJCQlpZiAoZk5vZGVJZEluTGlzdCAhPSBGQUxTRSkgewkvLyBvd24gbm9kZWlkIGluIGxpc3QKKwkJCQkvLyBzZW5kIGV2ZW50IHRvIHByb2Nlc3MgY29tbWFuZAorCQkJCU5tdEV2ZW50ID0ga0VwbE5tdEV2ZW50U3dSZXNldDsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisKKwkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJLy8gTk1UIG1hbmFnaW5nIGNvbW1hbmRzCisKKwkJLy8gVE9ETzogYWRkIGZ1bmN0aW9ucyB0byBwcm9jZXNzIG1hbmFnaW5nIGNvbW1hbmQgKG9wdGlvbmFsKQorCisJY2FzZSBrRXBsTm10Q21kTmV0SG9zdE5hbWVTZXQ6CisJCXsKKwkJCWJyZWFrOworCQl9CisKKwljYXNlIGtFcGxObXRDbWRGbHVzaEFycEVudHJ5OgorCQl7CisJCQlicmVhazsKKwkJfQorCisJCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCS8vIE5NVCBpbmZvIHNlcnZpY2VzCisKKwkJLy8gVE9ETzogZm9yd2FyZCBldmVudCB3aXRoIGluZm9zIHRvIHRoZSBhcHBsaWNhdGlvbiAob3B0aW9uYWwpCisKKwljYXNlIGtFcGxObXRDbWRQdWJsaXNoQ29uZmlndXJlZENOOgorCQl7CisJCQlicmVhazsKKwkJfQorCisJY2FzZSBrRXBsTm10Q21kUHVibGlzaEFjdGl2ZUNOOgorCQl7CisJCQlicmVhazsKKwkJfQorCisJY2FzZSBrRXBsTm10Q21kUHVibGlzaFByZU9wZXJhdGlvbmFsMToKKwkJeworCQkJYnJlYWs7CisJCX0KKworCWNhc2Uga0VwbE5tdENtZFB1Ymxpc2hQcmVPcGVyYXRpb25hbDI6CisJCXsKKwkJCWJyZWFrOworCQl9CisKKwljYXNlIGtFcGxObXRDbWRQdWJsaXNoUmVhZHlUb09wZXJhdGU6CisJCXsKKwkJCWJyZWFrOworCQl9CisKKwljYXNlIGtFcGxObXRDbWRQdWJsaXNoT3BlcmF0aW9uYWw6CisJCXsKKwkJCWJyZWFrOworCQl9CisKKwljYXNlIGtFcGxObXRDbWRQdWJsaXNoU3RvcHBlZDoKKwkJeworCQkJYnJlYWs7CisJCX0KKworCWNhc2Uga0VwbE5tdENtZFB1Ymxpc2hFbWVyZ2VuY3lOZXc6CisJCXsKKwkJCWJyZWFrOworCQl9CisKKwljYXNlIGtFcGxObXRDbWRQdWJsaXNoVGltZToKKwkJeworCQkJYnJlYWs7CisJCX0KKworCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCS8vIGVycm9yIGZyb20gTU4KKwkJLy8gLT4gcmVxdWVzdGVkIGNvbW1hbmQgbm90IHN1cHBvcnRlZCBieSBNTgorCWNhc2Uga0VwbE5tdENtZEludmFsaWRTZXJ2aWNlOgorCQl7CisKKwkJCS8vIFRPRE86IGVycm9yZXZlbnQgdG8gYXBwbGljYXRpb24KKwkJCWJyZWFrOworCQl9CisKKwkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJLy8gZGVmYXVsdAorCWRlZmF1bHQ6CisJCXsKKwkJCVJldCA9IGtFcGxObXRVbmtub3duQ29tbWFuZDsKKwkJCWdvdG8gRXhpdDsKKwkJfQorCisJfQkJCS8vIGVuZCBvZiBzd2l0Y2goTm10Q29tbWFuZCkKKworCWlmIChObXRFdmVudCAhPSBrRXBsTm10RXZlbnROb0V2ZW50KSB7CisJCWlmIChFcGxObXRDbnVJbnN0YW5jZV9nLm1fcGZuQ2hlY2tFdmVudENiICE9IE5VTEwpIHsKKwkJCVJldCA9IEVwbE5tdENudUluc3RhbmNlX2cubV9wZm5DaGVja0V2ZW50Q2IoTm10RXZlbnQpOworCQkJaWYgKFJldCA9PSBrRXBsUmVqZWN0KSB7CisJCQkJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJCQkJZ290byBFeGl0OworCQkJfSBlbHNlIGlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCQlnb3RvIEV4aXQ7CisJCQl9CisJCX0KKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UVSkpICE9IDApCisJCVJldCA9IEVwbE5tdHVObXRFdmVudChObXRFdmVudCk7CisjZW5kaWYKKwl9CisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIFJldDsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxObXRDbnVHZXRObXRDb21tYW5kKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogcmV0dXJucyB0aGUgTk1ULUNvbW1hbmQgZnJvbSB0aGUgZnJhbWUKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6ICAgICAgcEZyYW1lSW5mb19wID0gcG9pbnRlciB0byB0aGUgRnJhbWUKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCB0aGUgTk1ULUNvbW1hbmQKKy8vCisvLworLy8gUmV0dXJuczogICAgICAgICB0RXBsTm10Q29tbWFuZCA9IE5NVC1Db21tYW5kCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdGF0aWMgdEVwbE5tdENvbW1hbmQgRXBsTm10Q251R2V0Tm10Q29tbWFuZCh0RXBsRnJhbWVJbmZvICogcEZyYW1lSW5mb19wKQoreworCXRFcGxObXRDb21tYW5kIE5tdENvbW1hbmQ7CisJdEVwbE5tdENvbW1hbmRTZXJ2aWNlICpwTm10Q29tbWFuZFNlcnZpY2U7CisKKwlwTm10Q29tbWFuZFNlcnZpY2UgPQorCSAgICAmcEZyYW1lSW5mb19wLT5tX3BGcmFtZS0+bV9EYXRhLm1fQXNuZC5tX1BheWxvYWQuCisJICAgIG1fTm10Q29tbWFuZFNlcnZpY2U7CisKKwlObXRDb21tYW5kID0KKwkgICAgKHRFcGxObXRDb21tYW5kKSBBbWlHZXRCeXRlRnJvbUxlKCZwTm10Q29tbWFuZFNlcnZpY2UtPgorCQkJCQkgICAgICBtX2xlX2JObXRDb21tYW5kSWQpOworCisJcmV0dXJuIE5tdENvbW1hbmQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE5tdENudU5vZGVJZExpc3QoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBjaGVjayBpZiB0aGUgb3duIG5vZGVpZCBpcyBzZXQgaW4gRVBMIE5vZGUgTGlzdAorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczogICAgICBwYk5tdENvbW1hbmREYXRlX3AgPSBwb2ludGVyIHRvIHRoZSBkYXRhIG9mIHRoZSBOTVQgQ29tbWFuZAorLy8KKy8vCisvLyBSZXR1cm5zOiAgICAgICAgIEJPT0wgPSBUUlVFIGlmIG5vZGVpZCBpcyBzZXQgaW4gRVBMIE5vZGUgTGlzdAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0UgaWYgbm9kZWlkIG5vdCBzZXQgaW4gRVBMIE5vZGUgTGlzdAorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3RhdGljIEJPT0wgRXBsTm10Q251Tm9kZUlkTGlzdChCWVRFICogcGJObXRDb21tYW5kRGF0ZV9wKQoreworCUJPT0wgZk5vZGVJZEluTGlzdDsKKwl1bnNpZ25lZCBpbnQgdWlCeXRlT2Zmc2V0OworCUJZVEUgYkJpdE9mZnNldDsKKwlCWVRFIGJOb2RlTGlzdEJ5dGU7CisKKwkvLyBnZXQgYnl0ZS1vZmZzZXQgb2YgdGhlIG93biBub2RlaWQgaW4gTm9kZUlkTGlzdAorCS8vIGRldmlkZSB0aG91Z2ggOAorCXVpQnl0ZU9mZnNldCA9ICh1bnNpZ25lZCBpbnQpKEVwbE5tdENudUluc3RhbmNlX2cubV91aU5vZGVJZCA+PiAzKTsKKwkvLyBnZXQgYml0b2Zmc2V0CisJYkJpdE9mZnNldCA9IChCWVRFKSBFcGxObXRDbnVJbnN0YW5jZV9nLm1fdWlOb2RlSWQgJSA4OworCisJYk5vZGVMaXN0Qnl0ZSA9IEFtaUdldEJ5dGVGcm9tTGUoJnBiTm10Q29tbWFuZERhdGVfcFt1aUJ5dGVPZmZzZXRdKTsKKwlpZiAoKGJOb2RlTGlzdEJ5dGUgJiBiQml0T2Zmc2V0KSA9PSAwKSB7CisJCWZOb2RlSWRJbkxpc3QgPSBGQUxTRTsKKwl9IGVsc2UgeworCQlmTm9kZUlkSW5MaXN0ID0gVFJVRTsKKwl9CisKKwlyZXR1cm4gZk5vZGVJZEluTGlzdDsKK30KKworI2VuZGlmIC8vICNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UX0NOKSkgIT0gMCkKKworLy8gRU9GCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbE5tdE1udS5jIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxObXRNbnUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWQwYjZjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxObXRNbnUuYwpAQCAtMCwwICsxLDI4MzUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBzb3VyY2UgZmlsZSBmb3IgTk1ULU1OLU1vZHVsZQorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgJFJDU2ZpbGU6IEVwbE5tdE1udS5jLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS4xOCAkICAkRGF0ZTogMjAwOC8xMS8xOSAwOTo1MjoyNCAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICAgICAgR0NDIFYzLjQKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUmV2aXNpb24gSGlzdG9yeToKKworICAyMDA2LzA2LzA5IGsudC46ICAgc3RhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJ1c2VyL0VwbE5tdE1udS5oIgorI2luY2x1ZGUgInVzZXIvRXBsVGltZXJ1LmgiCisjaW5jbHVkZSAidXNlci9FcGxJZGVudHUuaCIKKyNpbmNsdWRlICJ1c2VyL0VwbFN0YXR1c3UuaCIKKyNpbmNsdWRlICJ1c2VyL0VwbE9iZHUuaCIKKyNpbmNsdWRlICJ1c2VyL0VwbERsbHVDYWwuaCIKKyNpbmNsdWRlICJCZW5jaG1hcmsuaCIKKworI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UX01OKSkgIT0gMCkKKworI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfT0JEVSkpID09IDApICYmIChFUExfT0JEX1VTRV9LRVJORUwgPT0gRkFMU0UpCisjZXJyb3IgIkVQTCBObXRNbnUgbW9kdWxlIG5lZWRzIEVQTCBtb2R1bGUgT0JEVSBvciBPQkRLISIKKyNlbmRpZgorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgIFAgUiBJIFYgQSBUIEUgICBEIEUgRiBJIE4gSSBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvbnN0IGRlZmluZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIFRyYWNlUG9pbnQgc3VwcG9ydCBmb3IgcmVhbHRpbWUtZGVidWdnaW5nCisjaWZkZWYgX0RCR19UUkFDRV9QT0lOVFNfCit2b2lkIFBVQkxJQyBUZ3REYmdTaWduYWxUcmFjZVBvaW50KEJZVEUgYlRyYWNlUG9pbnROdW1iZXJfcCk7Cit2b2lkIFBVQkxJQyBUZ3REYmdQb3N0VHJhY2VWYWx1ZShEV09SRCBkd1RyYWNlVmFsdWVfcCk7CisjZGVmaW5lIFRHVF9EQkdfU0lHTkFMX1RSQUNFX1BPSU5UKHApICAgVGd0RGJnU2lnbmFsVHJhY2VQb2ludChwKQorI2RlZmluZSBUR1RfREJHX1BPU1RfVFJBQ0VfVkFMVUUodikgICAgIFRndERiZ1Bvc3RUcmFjZVZhbHVlKHYpCisjZWxzZQorI2RlZmluZSBUR1RfREJHX1NJR05BTF9UUkFDRV9QT0lOVChwKQorI2RlZmluZSBUR1RfREJHX1BPU1RfVFJBQ0VfVkFMVUUodikKKyNlbmRpZgorI2RlZmluZSBFUExfTk1UTU5VX0RCR19QT1NUX1RSQUNFX1ZBTFVFKEV2ZW50X3AsIHVpTm9kZUlkX3AsIHdFcnJvckNvZGVfcCkgXAorICAgIFRHVF9EQkdfUE9TVF9UUkFDRV9WQUxVRSgoa0VwbEV2ZW50U2lua05tdE1udSA8PCAyOCkgfCAoRXZlbnRfcCA8PCAyNCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICh1aU5vZGVJZF9wIDw8IDE2KSB8IHdFcnJvckNvZGVfcCkKKworLy8gZGVmaW5lcyBmb3IgZmxhZ3MgaW4gbm9kZSBpbmZvIHN0cnVjdHVyZQorI2RlZmluZSBFUExfTk1UTU5VX05PREVfRkxBR19JU09DSFJPTiAgICAgICAweDAwMDEJLy8gQ04gaXMgYmVpbmcgYWNjZXNzZWQgaXNvY2hyb25vdXNseQorI2RlZmluZSBFUExfTk1UTU5VX05PREVfRkxBR19OT1RfU0NBTk5FRCAgICAweDAwMDIJLy8gQ04gd2FzIG5vdCBzY2FubmVkIG9uY2UgLT4gZGVjcmVtZW50IFNpZ25hbENvdW50ZXIgYW5kIHJlc2V0IGZsYWcKKyNkZWZpbmUgRVBMX05NVE1OVV9OT0RFX0ZMQUdfSEFMVEVEICAgICAgICAgMHgwMDA0CS8vIGJvb3QgcHJvY2VzcyBmb3IgdGhpcyBDTiBpcyBoYWx0ZWQKKyNkZWZpbmUgRVBMX05NVE1OVV9OT0RFX0ZMQUdfTk1UX0NNRF9JU1NVRUQgMHgwMDA4CS8vIE5NVCBjb21tYW5kIHdhcyBqdXN0IGlzc3VlZCwgd3JvbmcgTk1UIHN0YXRlcyB3aWxsIGJlIHRvbGVyYXRlZAorI2RlZmluZSBFUExfTk1UTU5VX05PREVfRkxBR19DT1VOVF9TVEFUUkVRICAweDAzMDAJLy8gY291bnRlciBmb3IgU3RhdHVzUmVxdWVzdCB0aW1lciBoYW5kbGUKKyNkZWZpbmUgRVBMX05NVE1OVV9OT0RFX0ZMQUdfQ09VTlRfTE9OR0VSICAgMHgwQzAwCS8vIGNvdW50ZXIgZm9yIGxvbmdlciB0aW1lb3V0cyB0aW1lciBoYW5kbGUKKyNkZWZpbmUgRVBMX05NVE1OVV9OT0RFX0ZMQUdfSU5DX1NUQVRSRVEgICAgMHgwMTAwCS8vIGluY3JlbWVudCBmb3IgU3RhdHVzUmVxdWVzdCB0aW1lciBoYW5kbGUKKyNkZWZpbmUgRVBMX05NVE1OVV9OT0RFX0ZMQUdfSU5DX0xPTkdFUiAgICAgMHgwNDAwCS8vIGluY3JlbWVudCBmb3IgbG9uZ2VyIHRpbWVvdXRzIHRpbWVyIGhhbmRsZQorCQkgICAgLy8gVGhlc2UgY291bnRlcnMgd2lsbCBiZSBpbmNyZW1lbnRlZCBhdCBldmVyeSB0aW1lciBzdGFydAorCQkgICAgLy8gYW5kIGNvcGllZCB0byB0aW1lcmFyZy4gV2hlbiB0aGUgdGltZXIgZXZlbnQgb2NjdXJlcworCQkgICAgLy8gYm90aCB3aWxsIGJlIGNvbXBhcmVkIGFuZCBpZiB1bmVxdWFsIHRoZSB0aW1lciBldmVudAorCQkgICAgLy8gd2lsbCBiZSBkaXNjYXJkZWQsIGJlY2F1c2UgaXQgaXMgYW4gb2xkIG9uZS4KKworLy8gZGVmaW5lcyBmb3IgdGltZXIgYXJndW1lbnRzIHRvIGRyYXcgYSBkaXN0aW5jdGlvbiBiZXR3ZWVuIHNlcnZlcmFsIGV2ZW50cworI2RlZmluZSBFUExfTk1UTU5VX1RJTUVSQVJHX05PREVfTUFTSyAgIDB4MDAwMDAwRkZMCS8vIG1hc2sgdGhhdCBjb250YWlucyB0aGUgbm9kZS1JRAorI2RlZmluZSBFUExfTk1UTU5VX1RJTUVSQVJHX0lERU5UUkVRICAgIDB4MDAwMTAwMDBMCS8vIHRpbWVyIGV2ZW50IGlzIGZvciBJZGVudFJlcXVlc3QKKyNkZWZpbmUgRVBMX05NVE1OVV9USU1FUkFSR19TVEFUUkVRICAgICAweDAwMDIwMDAwTAkvLyB0aW1lciBldmVudCBpcyBmb3IgU3RhdHVzUmVxdWVzdAorI2RlZmluZSBFUExfTk1UTU5VX1RJTUVSQVJHX0xPTkdFUiAgICAgIDB4MDAwNDAwMDBMCS8vIHRpbWVyIGV2ZW50IGlzIGZvciBsb25nZXIgdGltZW91dHMKKyNkZWZpbmUgRVBMX05NVE1OVV9USU1FUkFSR19TVEFURV9NT04gICAweDAwMDgwMDAwTAkvLyB0aW1lciBldmVudCBmb3IgU3RhdHVzUmVxdWVzdCB0byBtb25pdG9yIGV4ZWN1dGlvbiBvZiBOTVQgc3RhdGUgY2hhbmdlcworI2RlZmluZSBFUExfTk1UTU5VX1RJTUVSQVJHX0NPVU5UX1NSICAgIDB4MDAwMDAzMDBMCS8vIGNvdW50ZXIgZm9yIFN0YXR1c1JlcXVlc3QKKyNkZWZpbmUgRVBMX05NVE1OVV9USU1FUkFSR19DT1VOVF9MTyAgICAweDAwMDAwQzAwTAkvLyBjb3VudGVyIGZvciBsb25nZXIgdGltZW91dHMKKwkJICAgIC8vIFRoZSBjb3VudGVycyBtdXN0IGhhdmUgdGhlIHNhbWUgcG9zaXRpb24gYXMgaW4gdGhlIG5vZGUgZmxhZ3MgYWJvdmUuCisKKyNkZWZpbmUgRVBMX05NVE1OVV9TRVRfRkxBR1NfVElNRVJBUkdfU1RBVFJFUShwTm9kZUluZm9fcCwgdWlOb2RlSWRfcCwgVGltZXJBcmdfcCkgXAorICAgIHBOb2RlSW5mb19wLT5tX3dGbGFncyA9IFwKKyAgICAgICAgKChwTm9kZUluZm9fcC0+bV93RmxhZ3MgKyBFUExfTk1UTU5VX05PREVfRkxBR19JTkNfU1RBVFJFUSkgXAorICAgICAgICAgJiBFUExfTk1UTU5VX05PREVfRkxBR19DT1VOVF9TVEFUUkVRKSBcCisgICAgICAgIHwgKHBOb2RlSW5mb19wLT5tX3dGbGFncyAmIH5FUExfTk1UTU5VX05PREVfRkxBR19DT1VOVF9TVEFUUkVRKTsgXAorICAgIFRpbWVyQXJnX3AubV91bEFyZyA9IEVQTF9OTVRNTlVfVElNRVJBUkdfU1RBVFJFUSB8IHVpTm9kZUlkX3AgfCBcCisgICAgICAgIChwTm9kZUluZm9fcC0+bV93RmxhZ3MgJiBFUExfTk1UTU5VX05PREVfRkxBR19DT1VOVF9TVEFUUkVRKTsgXAorICAgIFRpbWVyQXJnX3AubV9FdmVudFNpbmsgPSBrRXBsRXZlbnRTaW5rTm10TW51OworCisjZGVmaW5lIEVQTF9OTVRNTlVfU0VUX0ZMQUdTX1RJTUVSQVJHX0lERU5UUkVRKHBOb2RlSW5mb19wLCB1aU5vZGVJZF9wLCBUaW1lckFyZ19wKSBcCisgICAgcE5vZGVJbmZvX3AtPm1fd0ZsYWdzID0gXAorICAgICAgICAoKHBOb2RlSW5mb19wLT5tX3dGbGFncyArIEVQTF9OTVRNTlVfTk9ERV9GTEFHX0lOQ19TVEFUUkVRKSBcCisgICAgICAgICAmIEVQTF9OTVRNTlVfTk9ERV9GTEFHX0NPVU5UX1NUQVRSRVEpIFwKKyAgICAgICAgfCAocE5vZGVJbmZvX3AtPm1fd0ZsYWdzICYgfkVQTF9OTVRNTlVfTk9ERV9GTEFHX0NPVU5UX1NUQVRSRVEpOyBcCisgICAgVGltZXJBcmdfcC5tX3VsQXJnID0gRVBMX05NVE1OVV9USU1FUkFSR19JREVOVFJFUSB8IHVpTm9kZUlkX3AgfCBcCisgICAgICAgIChwTm9kZUluZm9fcC0+bV93RmxhZ3MgJiBFUExfTk1UTU5VX05PREVfRkxBR19DT1VOVF9TVEFUUkVRKTsgXAorICAgIFRpbWVyQXJnX3AubV9FdmVudFNpbmsgPSBrRXBsRXZlbnRTaW5rTm10TW51OworCisjZGVmaW5lIEVQTF9OTVRNTlVfU0VUX0ZMQUdTX1RJTUVSQVJHX0xPTkdFUihwTm9kZUluZm9fcCwgdWlOb2RlSWRfcCwgVGltZXJBcmdfcCkgXAorICAgIHBOb2RlSW5mb19wLT5tX3dGbGFncyA9IFwKKyAgICAgICAgKChwTm9kZUluZm9fcC0+bV93RmxhZ3MgKyBFUExfTk1UTU5VX05PREVfRkxBR19JTkNfTE9OR0VSKSBcCisgICAgICAgICAmIEVQTF9OTVRNTlVfTk9ERV9GTEFHX0NPVU5UX0xPTkdFUikgXAorICAgICAgICB8IChwTm9kZUluZm9fcC0+bV93RmxhZ3MgJiB+RVBMX05NVE1OVV9OT0RFX0ZMQUdfQ09VTlRfTE9OR0VSKTsgXAorICAgIFRpbWVyQXJnX3AubV91bEFyZyA9IEVQTF9OTVRNTlVfVElNRVJBUkdfTE9OR0VSIHwgdWlOb2RlSWRfcCB8IFwKKyAgICAgICAgKHBOb2RlSW5mb19wLT5tX3dGbGFncyAmIEVQTF9OTVRNTlVfTk9ERV9GTEFHX0NPVU5UX0xPTkdFUik7IFwKKyAgICBUaW1lckFyZ19wLm1fRXZlbnRTaW5rID0ga0VwbEV2ZW50U2lua05tdE1udTsKKworI2RlZmluZSBFUExfTk1UTU5VX1NFVF9GTEFHU19USU1FUkFSR19TVEFURV9NT04ocE5vZGVJbmZvX3AsIHVpTm9kZUlkX3AsIFRpbWVyQXJnX3ApIFwKKyAgICBwTm9kZUluZm9fcC0+bV93RmxhZ3MgPSBcCisgICAgICAgICgocE5vZGVJbmZvX3AtPm1fd0ZsYWdzICsgRVBMX05NVE1OVV9OT0RFX0ZMQUdfSU5DX1NUQVRSRVEpIFwKKyAgICAgICAgICYgRVBMX05NVE1OVV9OT0RFX0ZMQUdfQ09VTlRfU1RBVFJFUSkgXAorICAgICAgICB8IChwTm9kZUluZm9fcC0+bV93RmxhZ3MgJiB+RVBMX05NVE1OVV9OT0RFX0ZMQUdfQ09VTlRfU1RBVFJFUSk7IFwKKyAgICBUaW1lckFyZ19wLm1fdWxBcmcgPSBFUExfTk1UTU5VX1RJTUVSQVJHX1NUQVRFX01PTiB8IHVpTm9kZUlkX3AgfCBcCisgICAgICAgIChwTm9kZUluZm9fcC0+bV93RmxhZ3MgJiBFUExfTk1UTU5VX05PREVfRkxBR19DT1VOVF9TVEFUUkVRKTsgXAorICAgIFRpbWVyQXJnX3AubV9FdmVudFNpbmsgPSBrRXBsRXZlbnRTaW5rTm10TW51OworCisvLyBkZWZpbmVzIGZvciBnbG9iYWwgZmxhZ3MKKyNkZWZpbmUgRVBMX05NVE1OVV9GTEFHX0hBTFRFRCAgICAgICAgICAweDAwMDEJLy8gYm9vdCBwcm9jZXNzIGlzIGhhbHRlZAorI2RlZmluZSBFUExfTk1UTU5VX0ZMQUdfQVBQX0lORk9STUVEICAgIDB4MDAwMgkvLyBhcHBsaWNhdGlvbiB3YXMgaW5mb3JtZWQgYWJvdXQgcG9zc2libGUgTk1UIHN0YXRlIGNoYW5nZQorCisvLyByZXR1cm4gcG9pbnRlciB0byBub2RlIGluZm8gc3RydWN0dXJlIGZvciBzcGVjaWZpZWQgbm9kZSBJRAorLy8gZC5rLiBtYXkgYmUgcmVwbGFjZWQgYnkgc3BlY2lhbCAoaGFzaCkgZnVuY3Rpb24gaWYgbm9kZSBJRCBhcnJheSBpcyBzbWFsbGVyIHRoYW4gMjU0CisjZGVmaW5lIEVQTF9OTVRNTlVfR0VUX05PREVJTkZPKHVpTm9kZUlkX3ApICgmRXBsTm10TW51SW5zdGFuY2VfZy5tX2FOb2RlSW5mb1t1aU5vZGVJZF9wIC0gMV0pCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCB0eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordHlwZWRlZiBlbnVtIHsKKwlrRXBsTm10TW51SW50Tm9kZUV2ZW50Tm9JZGVudFJlc3BvbnNlID0gMHgwMCwKKwlrRXBsTm10TW51SW50Tm9kZUV2ZW50SWRlbnRSZXNwb25zZSA9IDB4MDEsCisJa0VwbE5tdE1udUludE5vZGVFdmVudEJvb3QgPSAweDAyLAorCWtFcGxObXRNbnVJbnROb2RlRXZlbnRFeGVjUmVzZXQgPSAweDAzLAorCWtFcGxObXRNbnVJbnROb2RlRXZlbnRDb25maWd1cmVkID0gMHgwNCwKKwlrRXBsTm10TW51SW50Tm9kZUV2ZW50Tm9TdGF0dXNSZXNwb25zZSA9IDB4MDUsCisJa0VwbE5tdE1udUludE5vZGVFdmVudFN0YXR1c1Jlc3BvbnNlID0gMHgwNiwKKwlrRXBsTm10TW51SW50Tm9kZUV2ZW50SGVhcnRiZWF0ID0gMHgwNywKKwlrRXBsTm10TW51SW50Tm9kZUV2ZW50Tm10Q21kU2VudCA9IDB4MDgsCisJa0VwbE5tdE1udUludE5vZGVFdmVudFRpbWVySWRlbnRSZXEgPSAweDA5LAorCWtFcGxObXRNbnVJbnROb2RlRXZlbnRUaW1lclN0YXRSZXEgPSAweDBBLAorCWtFcGxObXRNbnVJbnROb2RlRXZlbnRUaW1lclN0YXRlTW9uID0gMHgwQiwKKwlrRXBsTm10TW51SW50Tm9kZUV2ZW50VGltZXJMb25nZXIgPSAweDBDLAorCWtFcGxObXRNbnVJbnROb2RlRXZlbnRFcnJvciA9IDB4MEQsCisKK30gdEVwbE5tdE1udUludE5vZGVFdmVudDsKKwordHlwZWRlZiBlbnVtIHsKKwlrRXBsTm10TW51Tm9kZVN0YXRlVW5rbm93biA9IDB4MDAsCisJa0VwbE5tdE1udU5vZGVTdGF0ZUlkZW50aWZpZWQgPSAweDAxLAorCWtFcGxObXRNbnVOb2RlU3RhdGVSZXNldENvbmYgPSAweDAyLAkvLyBDTiByZXNldCBhZnRlciBjb25maWd1cmF0aW9uIHVwZGF0ZQorCWtFcGxObXRNbnVOb2RlU3RhdGVDb25maWd1cmVkID0gMHgwMywJLy8gQm9vdFN0ZXAxIGNvbXBsZXRlZAorCWtFcGxObXRNbnVOb2RlU3RhdGVSZWFkeVRvT3AgPSAweDA0LAkvLyBCb290U3RlcDIgY29tcGxldGVkCisJa0VwbE5tdE1udU5vZGVTdGF0ZUNvbUNoZWNrZWQgPSAweDA1LAkvLyBDb21tdW5pY2F0aW9uIGNoZWNrZWQgc3VjY2Vzc2Z1bGx5CisJa0VwbE5tdE1udU5vZGVTdGF0ZU9wZXJhdGlvbmFsID0gMHgwNiwJLy8gQ04gaXMgaW4gTk1UIHN0YXRlIE9QRVJBVElPTkFMCisKK30gdEVwbE5tdE1udU5vZGVTdGF0ZTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXRFcGxUaW1lckhkbCBtX1RpbWVySGRsU3RhdFJlcTsJLy8gdGltZXIgdG8gZGVsYXkgU3RhdHVzUmVxdWVzdHMgYW5kIElkZW50UmVxdWVzdHMKKwl0RXBsVGltZXJIZGwgbV9UaW1lckhkbExvbmdlcjsJLy8gMm5kIHRpbWVyIGZvciBOTVQgY29tbWFuZCBFbmFibGVSZWFkeVRvT3AgYW5kIENoZWNrQ29tbXVuaWNhdGlvbgorCXRFcGxObXRNbnVOb2RlU3RhdGUgbV9Ob2RlU3RhdGU7CS8vIGludGVybmFsIG5vZGUgc3RhdGUgKGtpbmQgb2Ygc3ViIHN0YXRlIG9mIE5NVCBzdGF0ZSkKKwlEV09SRCBtX2R3Tm9kZUNmZzsJLy8gc3ViaW5kZXggZnJvbSAweDFGODEKKwlXT1JEIG1fd0ZsYWdzOwkJLy8gZmxhZ3M6IENOIGlzIGJlaW5nIGFjY2Vzc2VkIGlzb2Nocm9ub3VzbHkKKworfSB0RXBsTm10TW51Tm9kZUluZm87CisKK3R5cGVkZWYgc3RydWN0IHsKKwl0RXBsTm10TW51Tm9kZUluZm8gbV9hTm9kZUluZm9bRVBMX05NVF9NQVhfTk9ERV9JRF07CisJdEVwbFRpbWVySGRsIG1fVGltZXJIZGxObXRTdGF0ZTsJLy8gdGltZW91dCBmb3Igc3RheSBpbiBOTVQgc3RhdGUKKwl1bnNpZ25lZCBpbnQgbV91aU1hbmRhdG9yeVNsYXZlQ291bnQ7CisJdW5zaWduZWQgaW50IG1fdWlTaWduYWxTbGF2ZUNvdW50OworCXVuc2lnbmVkIGxvbmcgbV91bFN0YXR1c1JlcXVlc3REZWxheTsJLy8gaW4gW21zXSAob2JqZWN0IDB4MTAwNiAqIEVQTF9DX05NVF9TVEFUUkVRX0NZQ0xFKQorCXVuc2lnbmVkIGxvbmcgbV91bFRpbWVvdXRSZWFkeVRvT3A7CS8vIGluIFttc10gKG9iamVjdCAweDFGODkvNSkKKwl1bnNpZ25lZCBsb25nIG1fdWxUaW1lb3V0Q2hlY2tDb207CS8vIGluIFttc10gKG9iamVjdCAweDEwMDYgKiBNdWx0aXBsZXhlZEN5Y2xlQ291bnQpCisJV09SRCBtX3dGbGFnczsJCS8vIGdsb2JhbCBmbGFncworCURXT1JEIG1fZHdObXRTdGFydHVwOwkvLyBvYmplY3QgMHgxRjgwIE5NVF9TdGFydFVwX1UzMgorCXRFcGxObXRNbnVDYk5vZGVFdmVudCBtX3BmbkNiTm9kZUV2ZW50OworCXRFcGxObXRNbnVDYkJvb3RFdmVudCBtX3BmbkNiQm9vdEV2ZW50OworCit9IHRFcGxObXRNbnVJbnN0YW5jZTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvY2FsIHZhcnMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB0RXBsTm10TW51SW5zdGFuY2UgRXBsTm10TW51SW5zdGFuY2VfZzsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB0RXBsS2VybmVsIFBVQkxJQyBFcGxObXRNbnVDYk5tdFJlcXVlc3QodEVwbEZyYW1lSW5mbyAqIHBGcmFtZUluZm9fcCk7CisKK3N0YXRpYyB0RXBsS2VybmVsIFBVQkxJQyBFcGxObXRNbnVDYklkZW50UmVzcG9uc2UodW5zaWduZWQgaW50IHVpTm9kZUlkX3AsCisJCQkJCQkgIHRFcGxJZGVudFJlc3BvbnNlICoKKwkJCQkJCSAgcElkZW50UmVzcG9uc2VfcCk7CisKK3N0YXRpYyB0RXBsS2VybmVsIFBVQkxJQyBFcGxObXRNbnVDYlN0YXR1c1Jlc3BvbnNlKHVuc2lnbmVkIGludCB1aU5vZGVJZF9wLAorCQkJCQkJICAgdEVwbFN0YXR1c1Jlc3BvbnNlICoKKwkJCQkJCSAgIHBTdGF0dXNSZXNwb25zZV9wKTsKKworc3RhdGljIHRFcGxLZXJuZWwgRXBsTm10TW51Q2hlY2tObXRTdGF0ZSh1bnNpZ25lZCBpbnQgdWlOb2RlSWRfcCwKKwkJCQkJIHRFcGxObXRNbnVOb2RlSW5mbyAqIHBOb2RlSW5mb19wLAorCQkJCQkgdEVwbE5tdFN0YXRlIE5vZGVObXRTdGF0ZV9wLAorCQkJCQkgV09SRCB3RXJyb3JDb2RlX3AsCisJCQkJCSB0RXBsTm10U3RhdGUgTG9jYWxObXRTdGF0ZV9wKTsKKworc3RhdGljIHRFcGxLZXJuZWwgRXBsTm10TW51U3RhcnRCb290U3RlcDEodm9pZCk7CisKK3N0YXRpYyB0RXBsS2VybmVsIEVwbE5tdE1udVN0YXJ0Qm9vdFN0ZXAyKHZvaWQpOworCitzdGF0aWMgdEVwbEtlcm5lbCBFcGxObXRNbnVTdGFydENoZWNrQ29tKHZvaWQpOworCitzdGF0aWMgdEVwbEtlcm5lbCBFcGxObXRNbnVOb2RlQm9vdFN0ZXAyKHVuc2lnbmVkIGludCB1aU5vZGVJZF9wLAorCQkJCQkgdEVwbE5tdE1udU5vZGVJbmZvICogcE5vZGVJbmZvX3ApOworCitzdGF0aWMgdEVwbEtlcm5lbCBFcGxObXRNbnVOb2RlQ2hlY2tDb20odW5zaWduZWQgaW50IHVpTm9kZUlkX3AsCisJCQkJCXRFcGxObXRNbnVOb2RlSW5mbyAqIHBOb2RlSW5mb19wKTsKKworc3RhdGljIHRFcGxLZXJuZWwgRXBsTm10TW51U3RhcnROb2Rlcyh2b2lkKTsKKworc3RhdGljIHRFcGxLZXJuZWwgRXBsTm10TW51UHJvY2Vzc0ludGVybmFsRXZlbnQodW5zaWduZWQgaW50IHVpTm9kZUlkX3AsCisJCQkJCQl0RXBsTm10U3RhdGUgTm9kZU5tdFN0YXRlX3AsCisJCQkJCQlXT1JEIHdFcnJvckNvZGVfcCwKKwkJCQkJCXRFcGxObXRNbnVJbnROb2RlRXZlbnQKKwkJCQkJCU5vZGVFdmVudF9wKTsKKworc3RhdGljIHRFcGxLZXJuZWwgRXBsTm10TW51UmVzZXQodm9pZCk7CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgUCBVIEIgTCBJIEMgICBGIFUgTiBDIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxObXRNbnVJbml0CisvLworLy8gRGVzY3JpcHRpb246IGluaXQgZmlyc3QgaW5zdGFuY2Ugb2YgdGhlIG1vZHVsZQorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczoKKy8vCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgID0gZXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgRXBsTm10TW51SW5pdCh0RXBsTm10TW51Q2JOb2RlRXZlbnQgcGZuQ2JOb2RlRXZlbnRfcCwKKwkJCSB0RXBsTm10TW51Q2JCb290RXZlbnQgcGZuQ2JCb290RXZlbnRfcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKworCVJldCA9IEVwbE5tdE1udUFkZEluc3RhbmNlKHBmbkNiTm9kZUV2ZW50X3AsIHBmbkNiQm9vdEV2ZW50X3ApOworCisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsTm10TW51QWRkSW5zdGFuY2UKKy8vCisvLyBEZXNjcmlwdGlvbjogaW5pdCBvdGhlciBpbnN0YW5jZXMgb2YgdGhlIG1vZHVsZQorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczoKKy8vCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgID0gZXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgRXBsTm10TW51QWRkSW5zdGFuY2UodEVwbE5tdE1udUNiTm9kZUV2ZW50IHBmbkNiTm9kZUV2ZW50X3AsCisJCQkJdEVwbE5tdE1udUNiQm9vdEV2ZW50IHBmbkNiQm9vdEV2ZW50X3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCS8vIHJlc2V0IGluc3RhbmNlIHN0cnVjdHVyZQorCUVQTF9NRU1TRVQoJkVwbE5tdE1udUluc3RhbmNlX2csIDAsIHNpemVvZihFcGxObXRNbnVJbnN0YW5jZV9nKSk7CisKKwlpZiAoKHBmbkNiTm9kZUV2ZW50X3AgPT0gTlVMTCkgfHwgKHBmbkNiQm9vdEV2ZW50X3AgPT0gTlVMTCkpIHsKKwkJUmV0ID0ga0VwbE5tdEludmFsaWRQYXJhbTsKKwkJZ290byBFeGl0OworCX0KKwlFcGxObXRNbnVJbnN0YW5jZV9nLm1fcGZuQ2JOb2RlRXZlbnQgPSBwZm5DYk5vZGVFdmVudF9wOworCUVwbE5tdE1udUluc3RhbmNlX2cubV9wZm5DYkJvb3RFdmVudCA9IHBmbkNiQm9vdEV2ZW50X3A7CisKKwkvLyBpbml0aWFsaXplIFN0YXR1c1JlcXVlc3QgZGVsYXkKKwlFcGxObXRNbnVJbnN0YW5jZV9nLm1fdWxTdGF0dXNSZXF1ZXN0RGVsYXkgPSA1MDAwTDsKKworCS8vIHJlZ2lzdGVyIE5tdE1uUmVzcG9uc2UgY2FsbGJhY2sgZnVuY3Rpb24KKwlSZXQgPQorCSAgICBFcGxEbGx1Q2FsUmVnQXNuZFNlcnZpY2Uoa0VwbERsbEFzbmRObXRSZXF1ZXN0LAorCQkJCSAgICAgRXBsTm10TW51Q2JObXRSZXF1ZXN0LAorCQkJCSAgICAga0VwbERsbEFzbmRGaWx0ZXJMb2NhbCk7CisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIFJldDsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxObXRNbnVEZWxJbnN0YW5jZQorLy8KKy8vIERlc2NyaXB0aW9uOiBkZWxldGUgaW5zdGFuY2UKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6CisvLworLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICA9IGVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIEVwbE5tdE1udURlbEluc3RhbmNlKCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKworCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJLy8gZGVyZWdpc3RlciBObXRNblJlc3BvbnNlIGNhbGxiYWNrIGZ1bmN0aW9uCisJUmV0ID0KKwkgICAgRXBsRGxsdUNhbFJlZ0FzbmRTZXJ2aWNlKGtFcGxEbGxBc25kTm10UmVxdWVzdCwgTlVMTCwKKwkJCQkgICAgIGtFcGxEbGxBc25kRmlsdGVyTm9uZSk7CisKKwlSZXQgPSBFcGxObXRNbnVSZXNldCgpOworCisJcmV0dXJuIFJldDsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxObXRNbnVTZW5kTm10Q29tbWFuZEV4CisvLworLy8gRGVzY3JpcHRpb246IHNlbmRzIHRoZSBzcGVjaWZpZWQgTk1UIGNvbW1hbmQgdG8gdGhlIHNwZWNpZmllZCBub2RlLgorLy8KKy8vIFBhcmFtZXRlcnM6ICB1aU5vZGVJZF9wICAgICAgICAgICAgICA9IG5vZGUgSUQgdG8gd2hpY2ggdGhlIE5NVCBjb21tYW5kIHdpbGwgYmUgc2VudAorLy8gICAgICAgICAgICAgIE5tdENvbW1hbmRfcCAgICAgICAgICAgID0gTk1UIGNvbW1hbmQKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordEVwbEtlcm5lbCBFcGxObXRNbnVTZW5kTm10Q29tbWFuZEV4KHVuc2lnbmVkIGludCB1aU5vZGVJZF9wLAorCQkJCSAgICAgdEVwbE5tdENvbW1hbmQgTm10Q29tbWFuZF9wLAorCQkJCSAgICAgdm9pZCAqcE5tdENvbW1hbmREYXRhX3AsCisJCQkJICAgICB1bnNpZ25lZCBpbnQgdWlEYXRhU2l6ZV9wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJdEVwbEZyYW1lSW5mbyBGcmFtZUluZm87CisJQllURSBhYkJ1ZmZlcltFUExfQ19ETExfTUlOU0laRV9OTVRDTURFWFRdOworCXRFcGxGcmFtZSAqcEZyYW1lID0gKHRFcGxGcmFtZSAqKSBhYkJ1ZmZlcjsKKwlCT09MIGZTb2Z0RGVsZXRlTm9kZSA9IEZBTFNFOworCisJaWYgKCh1aU5vZGVJZF9wID09IDApIHx8ICh1aU5vZGVJZF9wID4gRVBMX0NfQURSX0JST0FEQ0FTVCkpIHsJLy8gaW52YWxpZCBub2RlIElEIHNwZWNpZmllZAorCQlSZXQgPSBrRXBsSW52YWxpZE5vZGVJZDsKKwkJZ290byBFeGl0OworCX0KKworCWlmICgocE5tdENvbW1hbmREYXRhX3AgIT0gTlVMTCkKKwkgICAgJiYgKHVpRGF0YVNpemVfcCA+CisJCShFUExfQ19ETExfTUlOU0laRV9OTVRDTURFWFQgLSBFUExfQ19ETExfTUlOU0laRV9OTVRDTUQpKSkgeworCQlSZXQgPSBrRXBsTm10SW52YWxpZFBhcmFtOworCQlnb3RvIEV4aXQ7CisJfQorCS8vICQkJCBkLmsuIG1heSBiZSBjaGVjayBpbiBmdXR1cmUgdmVyc2lvbnMgaWYgdGhlIGNhbGxlciB3YW50cyB0byBwZXJmb3JtIHByb2hpYml0ZWQgc3RhdGUgdHJhbnNpdGlvbnMKKwkvLyAgICAgdGhlIENOIHNob3VsZCBub3QgcGVyZm9ybSB0aGVzZSB0cmFuc2l0aW9ucywgYnV0IHRoZSBleHBlY3RlZCBOTVQgc3RhdGUgd2lsbCBiZSBjaGFuZ2VkIGFuZCBuZXZlciBmdWxsZmlsbGVkLgorCisJLy8gYnVpbGQgZnJhbWUKKwlFUExfTUVNU0VUKHBGcmFtZSwgMHgwMCwgc2l6ZW9mKGFiQnVmZmVyKSk7CisJQW1pU2V0Qnl0ZVRvTGUoJnBGcmFtZS0+bV9sZV9iRHN0Tm9kZUlkLCAoQllURSkgdWlOb2RlSWRfcCk7CisJQW1pU2V0Qnl0ZVRvTGUoJnBGcmFtZS0+bV9EYXRhLm1fQXNuZC5tX2xlX2JTZXJ2aWNlSWQsCisJCSAgICAgICAoQllURSkga0VwbERsbEFzbmRObXRDb21tYW5kKTsKKwlBbWlTZXRCeXRlVG9MZSgmcEZyYW1lLT5tX0RhdGEubV9Bc25kLm1fUGF5bG9hZC5tX05tdENvbW1hbmRTZXJ2aWNlLgorCQkgICAgICAgbV9sZV9iTm10Q29tbWFuZElkLCAoQllURSkgTm10Q29tbWFuZF9wKTsKKwlpZiAoKHBObXRDb21tYW5kRGF0YV9wICE9IE5VTEwpICYmICh1aURhdGFTaXplX3AgPiAwKSkgewkvLyBjb3B5IGNvbW1hbmQgZGF0YSB0byBmcmFtZQorCQlFUExfTUVNQ1BZKCZwRnJhbWUtPm1fRGF0YS5tX0FzbmQubV9QYXlsb2FkLm1fTm10Q29tbWFuZFNlcnZpY2UuCisJCQkgICBtX2xlX2FiTm10Q29tbWFuZERhdGFbMF0sIHBObXRDb21tYW5kRGF0YV9wLAorCQkJICAgdWlEYXRhU2l6ZV9wKTsKKwl9CisJLy8gYnVpbGQgaW5mbyBzdHJ1Y3R1cmUKKwlGcmFtZUluZm8ubV9OZXRUaW1lLm1fZHdOYW5vU2VjID0gMDsKKwlGcmFtZUluZm8ubV9OZXRUaW1lLm1fZHdTZWMgPSAwOworCUZyYW1lSW5mby5tX3BGcmFtZSA9IHBGcmFtZTsKKwlGcmFtZUluZm8ubV91aUZyYW1lU2l6ZSA9IHNpemVvZihhYkJ1ZmZlcik7CisKKwkvLyBzZW5kIE5NVC1SZXF1ZXN0CisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX0RMTFUpKSAhPSAwKQorCVJldCA9IEVwbERsbHVDYWxBc3luY1NlbmQoJkZyYW1lSW5mbywJLy8gcG9pbnRlciB0byBmcmFtZWluZm8KKwkJCQkgIGtFcGxEbGxBc3luY1JlcVByaW9ObXQpOwkvLyBwcmlvcml0eQorI2VuZGlmCisJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQlnb3RvIEV4aXQ7CisJfQorCisJRVBMX0RCR0xWTF9OTVRNTl9UUkFDRTIoIk5NVENtZCglMDJYLT4lMDJYKVxuIiwgTm10Q29tbWFuZF9wLAorCQkJCXVpTm9kZUlkX3ApOworCisJc3dpdGNoIChObXRDb21tYW5kX3ApIHsKKwljYXNlIGtFcGxObXRDbWRTdGFydE5vZGU6CisJY2FzZSBrRXBsTm10Q21kRW50ZXJQcmVPcGVyYXRpb25hbDI6CisJY2FzZSBrRXBsTm10Q21kRW5hYmxlUmVhZHlUb09wZXJhdGU6CisJCXsKKwkJCS8vIG5vdGhpbmcgbGVmdCB0byBkbywKKwkJCS8vIGJlY2F1c2UgYW55IGZ1cnRoZXIgcHJvY2Vzc2luZyBpcyBkb25lCisJCQkvLyB3aGVuIHRoZSBOTVQgY29tbWFuZCBpcyBhY3R1YWxseSBzZW50CisJCQlnb3RvIEV4aXQ7CisJCX0KKworCWNhc2Uga0VwbE5tdENtZFN0b3BOb2RlOgorCQl7CisJCQlmU29mdERlbGV0ZU5vZGUgPSBUUlVFOworCQkJYnJlYWs7CisJCX0KKworCWNhc2Uga0VwbE5tdENtZFJlc2V0Tm9kZToKKwljYXNlIGtFcGxObXRDbWRSZXNldENvbW11bmljYXRpb246CisJY2FzZSBrRXBsTm10Q21kUmVzZXRDb25maWd1cmF0aW9uOgorCWNhc2Uga0VwbE5tdENtZFN3UmVzZXQ6CisJCXsKKwkJCWJyZWFrOworCQl9CisKKwlkZWZhdWx0OgorCQlnb3RvIEV4aXQ7CisJfQorCisJLy8gcmVtb3ZlIENOIGZyb20gaXNvY2hyb25vdXMgcGhhc2U7CisJLy8gVGhpcyBtdXN0IGJlIGRvbmUgaGVyZSBhbmQgbm90IHdoZW4gTk1UIGNvbW1hbmQgaXMgYWN0dWFsbHkgc2VudAorCS8vIGJlY2F1c2UgaXQgd2lsbCBiZSB0b28gbGF0ZSBhbmQgbWF5IGNhdXNlIHVud2FudGVkIGVycm9ycworCWlmICh1aU5vZGVJZF9wICE9IEVQTF9DX0FEUl9CUk9BRENBU1QpIHsKKwkJaWYgKGZTb2Z0RGVsZXRlTm9kZSA9PSBGQUxTRSkgewkvLyByZW1vdmUgQ04gaW1tZWRpYXRlbHkgZnJvbSBpc29jaHJvbm91cyBwaGFzZQorCQkJUmV0ID0gRXBsRGxsdUNhbERlbGV0ZU5vZGUodWlOb2RlSWRfcCk7CisJCX0gZWxzZSB7CS8vIHJlbW92ZSBDTiBmcm9tIGlzb2Nocm9ub3VzIHBoYXNlIHNvZnRseQorCQkJUmV0ID0gRXBsRGxsdUNhbFNvZnREZWxldGVOb2RlKHVpTm9kZUlkX3ApOworCQl9CisJfSBlbHNlIHsJCS8vIGRvIGl0IGZvciBhbGwgYWN0aXZlIENOcworCQlmb3IgKHVpTm9kZUlkX3AgPSAxOworCQkgICAgIHVpTm9kZUlkX3AgPD0gdGFiZW50cmllcyhFcGxObXRNbnVJbnN0YW5jZV9nLm1fYU5vZGVJbmZvKTsKKwkJICAgICB1aU5vZGVJZF9wKyspIHsKKwkJCWlmICgoRVBMX05NVE1OVV9HRVRfTk9ERUlORk8odWlOb2RlSWRfcCktPgorCQkJICAgICBtX2R3Tm9kZUNmZyAmIChFUExfTk9ERUFTU0lHTl9OT0RFX0lTX0NOIHwKKwkJCQkJICAgIEVQTF9OT0RFQVNTSUdOX05PREVfRVhJU1RTKSkgIT0gMCkgeworCQkJCWlmIChmU29mdERlbGV0ZU5vZGUgPT0gRkFMU0UpIHsJLy8gcmVtb3ZlIENOIGltbWVkaWF0ZWx5IGZyb20gaXNvY2hyb25vdXMgcGhhc2UKKwkJCQkJUmV0ID0gRXBsRGxsdUNhbERlbGV0ZU5vZGUodWlOb2RlSWRfcCk7CisJCQkJfSBlbHNlIHsJLy8gcmVtb3ZlIENOIGZyb20gaXNvY2hyb25vdXMgcGhhc2Ugc29mdGx5CisJCQkJCVJldCA9CisJCQkJCSAgICBFcGxEbGx1Q2FsU29mdERlbGV0ZU5vZGUKKwkJCQkJICAgICh1aU5vZGVJZF9wKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsTm10TW51U2VuZE5tdENvbW1hbmQKKy8vCisvLyBEZXNjcmlwdGlvbjogc2VuZHMgdGhlIHNwZWNpZmllZCBOTVQgY29tbWFuZCB0byB0aGUgc3BlY2lmaWVkIG5vZGUuCisvLworLy8gUGFyYW1ldGVyczogIHVpTm9kZUlkX3AgICAgICAgICAgICAgID0gbm9kZSBJRCB0byB3aGljaCB0aGUgTk1UIGNvbW1hbmQgd2lsbCBiZSBzZW50CisvLyAgICAgICAgICAgICAgTm10Q29tbWFuZF9wICAgICAgICAgICAgPSBOTVQgY29tbWFuZAorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIEVwbE5tdE1udVNlbmRObXRDb21tYW5kKHVuc2lnbmVkIGludCB1aU5vZGVJZF9wLAorCQkJCSAgIHRFcGxObXRDb21tYW5kIE5tdENvbW1hbmRfcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJUmV0ID0gRXBsTm10TW51U2VuZE5tdENvbW1hbmRFeCh1aU5vZGVJZF9wLCBObXRDb21tYW5kX3AsIE5VTEwsIDApOworCisvL0V4aXQ6CisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsTm10TW51VHJpZ2dlclN0YXRlQ2hhbmdlCisvLworLy8gRGVzY3JpcHRpb246IHRyaWdnZXJzIHRoZSBzcGVjaWZpZWQgbm9kZSBjb21tYW5kIGZvciB0aGUgc3BlY2lmaWVkIG5vZGUuCisvLworLy8gUGFyYW1ldGVyczogIHVpTm9kZUlkX3AgICAgICAgICAgICAgID0gbm9kZSBJRCBmb3Igd2hpY2ggdGhlIG5vZGUgY29tbWFuZCB3aWxsIGJlIGV4ZWN1dGVkCisvLyAgICAgICAgICAgICAgTm9kZUNvbW1hbmRfcCAgICAgICAgICAgPSBub2RlIGNvbW1hbmQKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordEVwbEtlcm5lbCBFcGxObXRNbnVUcmlnZ2VyU3RhdGVDaGFuZ2UodW5zaWduZWQgaW50IHVpTm9kZUlkX3AsCisJCQkJICAgICAgIHRFcGxObXROb2RlQ29tbWFuZCBOb2RlQ29tbWFuZF9wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJdEVwbE5tdE1udUludE5vZGVFdmVudCBOb2RlRXZlbnQ7CisJdEVwbE9iZFNpemUgT2JkU2l6ZTsKKwlCWVRFIGJObXRTdGF0ZTsKKwlXT1JEIHdFcnJvckNvZGUgPSBFUExfRV9OT19FUlJPUjsKKworCWlmICgodWlOb2RlSWRfcCA9PSAwKSB8fCAodWlOb2RlSWRfcCA+PSBFUExfQ19BRFJfQlJPQURDQVNUKSkgeworCQlSZXQgPSBrRXBsSW52YWxpZE5vZGVJZDsKKwkJZ290byBFeGl0OworCX0KKworCXN3aXRjaCAoTm9kZUNvbW1hbmRfcCkgeworCWNhc2Uga0VwbE5tdE5vZGVDb21tYW5kQm9vdDoKKwkJeworCQkJTm9kZUV2ZW50ID0ga0VwbE5tdE1udUludE5vZGVFdmVudEJvb3Q7CisJCQlicmVhazsKKwkJfQorCisJY2FzZSBrRXBsTm10Tm9kZUNvbW1hbmRDb25mT2s6CisJCXsKKwkJCU5vZGVFdmVudCA9IGtFcGxObXRNbnVJbnROb2RlRXZlbnRDb25maWd1cmVkOworCQkJYnJlYWs7CisJCX0KKworCWNhc2Uga0VwbE5tdE5vZGVDb21tYW5kQ29uZkVycjoKKwkJeworCQkJTm9kZUV2ZW50ID0ga0VwbE5tdE1udUludE5vZGVFdmVudEVycm9yOworCQkJd0Vycm9yQ29kZSA9IEVQTF9FX05NVF9CUE8xX0NGX1ZFUklGWTsKKwkJCWJyZWFrOworCQl9CisKKwljYXNlIGtFcGxObXROb2RlQ29tbWFuZENvbmZSZXNldDoKKwkJeworCQkJTm9kZUV2ZW50ID0ga0VwbE5tdE1udUludE5vZGVFdmVudEV4ZWNSZXNldDsKKwkJCWJyZWFrOworCQl9CisKKwlkZWZhdWx0OgorCQl7CQkvLyBpbnZhbGlkIG5vZGUgY29tbWFuZAorCQkJZ290byBFeGl0OworCQl9CisJfQorCisJLy8gZmV0Y2ggY3VycmVudCBOTVQgc3RhdGUKKwlPYmRTaXplID0gMTsKKwlSZXQgPSBFcGxPYmR1UmVhZEVudHJ5KDB4MUY4RSwgdWlOb2RlSWRfcCwgJmJObXRTdGF0ZSwgJk9iZFNpemUpOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKworCVJldCA9IEVwbE5tdE1udVByb2Nlc3NJbnRlcm5hbEV2ZW50KHVpTm9kZUlkX3AsCisJCQkJCSAgICAodEVwbE5tdFN0YXRlKSAoYk5tdFN0YXRlIHwKKwkJCQkJCQkgICAgRVBMX05NVF9UWVBFX0NTKSwKKwkJCQkJICAgIHdFcnJvckNvZGUsIE5vZGVFdmVudCk7CisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsTm10TW51Q2JObXRTdGF0ZUNoYW5nZQorLy8KKy8vIERlc2NyaXB0aW9uOiBjYWxsYmFjayBmdW5jdGlvbiBmb3IgTk1UIHN0YXRlIGNoYW5nZXMKKy8vCisvLyBQYXJhbWV0ZXJzOiAgTm10U3RhdGVDaGFuZ2VfcCAgICAgICAgPSBOTVQgc3RhdGUgY2hhbmdlIGV2ZW50CisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIFBVQkxJQyBFcGxObXRNbnVDYk5tdFN0YXRlQ2hhbmdlKHRFcGxFdmVudE5tdFN0YXRlQ2hhbmdlCisJCQkJCSAgICBObXRTdGF0ZUNoYW5nZV9wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwkvLyBkbyB3b3JrIHdoaWNoIG11c3QgYmUgZG9uZSBpbiB0aGF0IHN0YXRlCisJc3dpdGNoIChObXRTdGF0ZUNoYW5nZV9wLm1fTmV3Tm10U3RhdGUpIHsKKwkJLy8gRVBMIHN0YWNrIGlzIG5vdCBydW5uaW5nCisvKiAgICAgICAgY2FzZSBrRXBsTm10R3NPZmY6CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAvLyBmaXJzdCBpbml0IG9mIHRoZSBoYXJkd2FyZQorICAgICAgICBjYXNlIGtFcGxObXRHc0luaXRpYWxpc2luZzoKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIC8vIGluaXQgb2YgdGhlIG1hbnVmYWN0dXJlci1zcGVjaWZpYyBwcm9maWxlIGFyZWEgYW5kIHRoZQorICAgICAgICAvLyBzdGFuZGFyZGlzZWQgZGV2aWNlIHByb2ZpbGUgYXJlYQorICAgICAgICBjYXNlIGtFcGxObXRHc1Jlc2V0QXBwbGljYXRpb246CisgICAgICAgIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLy8gaW5pdCBvZiB0aGUgY29tbXVuaWNhdGlvbiBwcm9maWxlIGFyZWEKKyAgICAgICAgY2FzZSBrRXBsTm10R3NSZXNldENvbW11bmljYXRpb246CisgICAgICAgIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisqLworCQkvLyBidWlsZCB0aGUgY29uZmlndXJhdGlvbiB3aXRoIGluZm9zIGZyb20gT0QKKwljYXNlIGtFcGxObXRHc1Jlc2V0Q29uZmlndXJhdGlvbjoKKwkJeworCQkJRFdPUkQgZHdUaW1lb3V0OworCQkJdEVwbE9iZFNpemUgT2JkU2l6ZTsKKworCQkJLy8gcmVhZCBvYmplY3QgMHgxRjgwIE5NVF9TdGFydFVwX1UzMgorCQkJT2JkU2l6ZSA9IDQ7CisJCQlSZXQgPQorCQkJICAgIEVwbE9iZHVSZWFkRW50cnkoMHgxRjgwLCAwLAorCQkJCQkgICAgICZFcGxObXRNbnVJbnN0YW5jZV9nLgorCQkJCQkgICAgIG1fZHdObXRTdGFydHVwLCAmT2JkU2l6ZSk7CisJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQkJYnJlYWs7CisJCQl9CisJCQkvLyBjb21wdXRlIFN0YXR1c1JlcURlbGF5ID0gb2JqZWN0IDB4MTAwNiAqIEVQTF9DX05NVF9TVEFUUkVRX0NZQ0xFCisJCQlPYmRTaXplID0gc2l6ZW9mKGR3VGltZW91dCk7CisJCQlSZXQgPSBFcGxPYmR1UmVhZEVudHJ5KDB4MTAwNiwgMCwgJmR3VGltZW91dCwgJk9iZFNpemUpOworCQkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKGR3VGltZW91dCAhPSAwTCkgeworCQkJCUVwbE5tdE1udUluc3RhbmNlX2cubV91bFN0YXR1c1JlcXVlc3REZWxheSA9CisJCQkJICAgIGR3VGltZW91dCAqIEVQTF9DX05NVF9TVEFUUkVRX0NZQ0xFIC8gMTAwMEw7CisJCQkJaWYgKEVwbE5tdE1udUluc3RhbmNlX2cuCisJCQkJICAgIG1fdWxTdGF0dXNSZXF1ZXN0RGVsYXkgPT0gMEwpIHsKKwkJCQkJRXBsTm10TW51SW5zdGFuY2VfZy5tX3VsU3RhdHVzUmVxdWVzdERlbGF5ID0gMUw7CS8vIGF0IGxlYXN0IDEgbXMKKwkJCQl9CisJCQkJLy8gJCQkIGZldGNoIGFuZCB1c2UgTXVsdGlwbGV4ZWRDeWNsZUNvdW50IGZyb20gT0QKKwkJCQlFcGxObXRNbnVJbnN0YW5jZV9nLm1fdWxUaW1lb3V0Q2hlY2tDb20gPQorCQkJCSAgICBkd1RpbWVvdXQgKiBFUExfQ19OTVRfU1RBVFJFUV9DWUNMRSAvIDEwMDBMOworCQkJCWlmIChFcGxObXRNbnVJbnN0YW5jZV9nLm1fdWxUaW1lb3V0Q2hlY2tDb20gPT0KKwkJCQkgICAgMEwpIHsKKwkJCQkJRXBsTm10TW51SW5zdGFuY2VfZy5tX3VsVGltZW91dENoZWNrQ29tID0gMUw7CS8vIGF0IGxlYXN0IDEgbXMKKwkJCQl9CisJCQl9CisJCQkvLyBmZXRjaCBSZWFkeVRvT3AgVGltZW91dCBmcm9tIE9ECisJCQlPYmRTaXplID0gc2l6ZW9mKGR3VGltZW91dCk7CisJCQlSZXQgPSBFcGxPYmR1UmVhZEVudHJ5KDB4MUY4OSwgNSwgJmR3VGltZW91dCwgJk9iZFNpemUpOworCQkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKGR3VGltZW91dCAhPSAwTCkgeworCQkJCS8vIGNvbnZlcnQgW3VzXSB0byBbbXNdCisJCQkJZHdUaW1lb3V0IC89IDEwMDBMOworCQkJCWlmIChkd1RpbWVvdXQgPT0gMEwpIHsKKwkJCQkJZHdUaW1lb3V0ID0gMUw7CS8vIGF0IGxlYXN0IDEgbXMKKwkJCQl9CisJCQkJRXBsTm10TW51SW5zdGFuY2VfZy5tX3VsVGltZW91dFJlYWR5VG9PcCA9CisJCQkJICAgIGR3VGltZW91dDsKKwkJCX0gZWxzZSB7CisJCQkJRXBsTm10TW51SW5zdGFuY2VfZy5tX3VsVGltZW91dFJlYWR5VG9PcCA9IDBMOworCQkJfQorCQkJYnJlYWs7CisJCX0KKy8qCisgICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgLy8gQ04gcGFydCBvZiB0aGUgc3RhdGUgbWFjaGluZQorCisgICAgICAgIC8vIG5vZGUgbGlzdGUgZm9yIEVQTC1GcmFtZXMgYW5kIGNoZWNrIHRpbWVvdXQKKyAgICAgICAgY2FzZSBrRXBsTm10Q3NOb3RBY3RpdmU6CisgICAgICAgIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLy8gbm9kZSBwcm9jZXNzIG9ubHkgYXN5bmMgZnJhbWVzCisgICAgICAgIGNhc2Uga0VwbE5tdENzUHJlT3BlcmF0aW9uYWwxOgorICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8vIG5vZGUgcHJvY2VzcyBpc29jaHJvbnVzIGFuZCBhc3luY2hyb251cyBmcmFtZXMKKyAgICAgICAgY2FzZSBrRXBsTm10Q3NQcmVPcGVyYXRpb25hbDI6CisgICAgICAgIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLy8gbm9kZSBzaG91bGQgYmUgY29uZmlndXJlZCB1bmQgYXBwbGljYXRpb24gaXMgcmVhZHkKKyAgICAgICAgY2FzZSBrRXBsTm10Q3NSZWFkeVRvT3BlcmF0ZToKKyAgICAgICAgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvLyBub3JtYWwgd29yayBzdGF0ZQorICAgICAgICBjYXNlIGtFcGxObXRDc09wZXJhdGlvbmFsOgorICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8vIG5vZGUgc3RvcHBlZCBieSBNTgorICAgICAgICAvLyAtPiBvbmx5IHByb2Nlc3MgYXN5bmNocm9udXMgZnJhbWVzCisgICAgICAgIGNhc2Uga0VwbE5tdENzU3RvcHBlZDoKKyAgICAgICAgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvLyBubyBFUEwgY3ljbGUKKyAgICAgICAgLy8gLT4gbm9ybWFsIGV0aGVybmV0IGNvbW11bmljYXRpb24KKyAgICAgICAgY2FzZSBrRXBsTm10Q3NCYXNpY0V0aGVybmV0OgorICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorKi8KKwkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkvLyBNTiBwYXJ0IG9mIHRoZSBzdGF0ZSBtYWNoaW5lCisKKwkJLy8gbm9kZSBsaXN0ZW5zIGZvciBFUEwtRnJhbWVzIGFuZCBjaGVjayB0aW1lb3V0CisJY2FzZSBrRXBsTm10TXNOb3RBY3RpdmU6CisJCXsKKwkJCWJyZWFrOworCQl9CisKKwkJLy8gbm9kZSBwcm9jZXNzZXMgb25seSBhc3luYyBmcmFtZXMKKwljYXNlIGtFcGxObXRNc1ByZU9wZXJhdGlvbmFsMToKKwkJeworCQkJRFdPUkQgZHdUaW1lb3V0OworCQkJdEVwbFRpbWVyQXJnIFRpbWVyQXJnOworCQkJdEVwbE9iZFNpemUgT2JkU2l6ZTsKKwkJCXRFcGxFdmVudCBFdmVudDsKKworCQkJLy8gY2xlYXIgZ2xvYmFsIGZsYWdzLCBlLmcuIHJlZW5hYmxlIGJvb3QgcHJvY2VzcworCQkJRXBsTm10TW51SW5zdGFuY2VfZy5tX3dGbGFncyA9IDA7CisKKwkJCS8vIHJlc2V0IElkZW50UmVzcG9uc2VzIGFuZCBydW5uaW5nIElkZW50UmVxdWVzdHMgYW5kIFN0YXR1c1JlcXVlc3RzCisJCQlSZXQgPSBFcGxJZGVudHVSZXNldCgpOworCQkJUmV0ID0gRXBsU3RhdHVzdVJlc2V0KCk7CisKKwkJCS8vIHJlc2V0IHRpbWVycworCQkJUmV0ID0gRXBsTm10TW51UmVzZXQoKTsKKworCQkJLy8gMjAwOC8xMS8xOCBkLmsuIHJlc2V0IGludGVybmFsIG5vZGUgaW5mbyBpcyBub3QgbmVjZXNzYXJ5LAorCQkJLy8gICAgICAgICAgICAgICAgIGJlY2F1c2UgdGltZXIgZmxhZ3MgYXJlIGltcG9ydGFudCBhbmQgb3RoZXIKKwkJCS8vICAgICAgICAgICAgICAgICB0aGluZ3MgYXJlIHJlc2V0IGJ5IEVwbE5tdE1udVN0YXJ0Qm9vdFN0ZXAxKCkuCisvKgorICAgICAgICAgICAgRVBMX01FTVNFVChFcGxObXRNbnVJbnN0YW5jZV9nLm1fYU5vZGVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YgKEVwbE5tdE1udUluc3RhbmNlX2cubV9hTm9kZUluZm8pKTsKKyovCisKKwkJCS8vIGluZm9ybSBETEwgYWJvdXQgTk1UIHN0YXRlIGNoYW5nZSwKKwkJCS8vIHNvIHRoYXQgaXQgY2FuIGNsZWFyIHRoZSBhc3luY2hvbm91cyBxdWV1ZXMgYW5kIHN0YXJ0IHRoZSByZWR1Y2VkIGN5Y2xlCisJCQlFdmVudC5tX0V2ZW50U2luayA9IGtFcGxFdmVudFNpbmtEbGxrOworCQkJRXZlbnQubV9FdmVudFR5cGUgPSBrRXBsRXZlbnRUeXBlRGxsa1N0YXJ0UmVkdWNlZEN5Y2xlOworCQkJRVBMX01FTVNFVCgmRXZlbnQubV9OZXRUaW1lLCAweDAwLAorCQkJCSAgIHNpemVvZihFdmVudC5tX05ldFRpbWUpKTsKKwkJCUV2ZW50Lm1fcEFyZyA9IE5VTEw7CisJCQlFdmVudC5tX3VpU2l6ZSA9IDA7CisJCQlSZXQgPSBFcGxFdmVudHVQb3N0KCZFdmVudCk7CisJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQkJYnJlYWs7CisJCQl9CisJCQkvLyByZXNldCBhbGwgbm9kZXMKKwkJCS8vIGQuay46IHNraXAgdGhpcyBzdGVwIGlmIHdhcyBqdXN0IGRvbmUgYmVmb3JlLCBlLmcuIGJlY2F1c2Ugb2YgYSBSZXNldE5vZGUgY29tbWFuZCBmcm9tIGEgZGlhZ25vc3RpYyBub2RlCisJCQlpZiAoTm10U3RhdGVDaGFuZ2VfcC5tX05tdEV2ZW50ID09CisJCQkgICAga0VwbE5tdEV2ZW50VGltZXJNc1ByZU9wMSkgeworCQkJCUJFTkNITUFSS19NT0RfMDdfVE9HR0xFKDkpOworCisJCQkJRVBMX05NVE1OVV9EQkdfUE9TVF9UUkFDRV9WQUxVRSgwLAorCQkJCQkJCQlFUExfQ19BRFJfQlJPQURDQVNULAorCQkJCQkJCQlrRXBsTm10Q21kUmVzZXROb2RlKTsKKworCQkJCVJldCA9CisJCQkJICAgIEVwbE5tdE1udVNlbmRObXRDb21tYW5kKEVQTF9DX0FEUl9CUk9BRENBU1QsCisJCQkJCQkJICAgIGtFcGxObXRDbWRSZXNldE5vZGUpOworCQkJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJLy8gc3RhcnQgbmV0d29yayBzY2FuCisJCQlSZXQgPSBFcGxObXRNbnVTdGFydEJvb3RTdGVwMSgpOworCisJCQkvLyBzdGFydCB0aW1lciBmb3IgMHgxRjg5LzIgTU5UaW1lb3V0UHJlT3AxX1UzMgorCQkJT2JkU2l6ZSA9IHNpemVvZihkd1RpbWVvdXQpOworCQkJUmV0ID0gRXBsT2JkdVJlYWRFbnRyeSgweDFGODksIDIsICZkd1RpbWVvdXQsICZPYmRTaXplKTsKKwkJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChkd1RpbWVvdXQgIT0gMEwpIHsKKwkJCQlkd1RpbWVvdXQgLz0gMTAwMEw7CisJCQkJaWYgKGR3VGltZW91dCA9PSAwTCkgeworCQkJCQlkd1RpbWVvdXQgPSAxTDsJLy8gYXQgbGVhc3QgMSBtcworCQkJCX0KKwkJCQlUaW1lckFyZy5tX0V2ZW50U2luayA9IGtFcGxFdmVudFNpbmtObXRNbnU7CisJCQkJVGltZXJBcmcubV91bEFyZyA9IDA7CisJCQkJUmV0ID0KKwkJCQkgICAgRXBsVGltZXJ1TW9kaWZ5VGltZXJNcygmRXBsTm10TW51SW5zdGFuY2VfZy4KKwkJCQkJCQkgICBtX1RpbWVySGRsTm10U3RhdGUsCisJCQkJCQkJICAgZHdUaW1lb3V0LCBUaW1lckFyZyk7CisJCQl9CisJCQlicmVhazsKKwkJfQorCisJCS8vIG5vZGUgcHJvY2Vzc2VzIGlzb2Nocm9ub3VzIGFuZCBhc3luY2hyb25vdXMgZnJhbWVzCisJY2FzZSBrRXBsTm10TXNQcmVPcGVyYXRpb25hbDI6CisJCXsKKwkJCS8vIGFkZCBpZGVudGlmaWVkIENOcyB0byBpc29jaHJvbm91cyBwaGFzZQorCQkJLy8gc2VuZCBFbmFibGVSZWFkeVRvT3AgdG8gYWxsIGlkZW50aWZpZWQgQ05zCisJCQlSZXQgPSBFcGxObXRNbnVTdGFydEJvb3RTdGVwMigpOworCisJCQkvLyB3YWl0IGZvciBOTVQgc3RhdGUgY2hhbmdlIG9mIENOcworCQkJYnJlYWs7CisJCX0KKworCQkvLyBub2RlIHNob3VsZCBiZSBjb25maWd1cmVkIHVuZCBhcHBsaWNhdGlvbiBpcyByZWFkeQorCWNhc2Uga0VwbE5tdE1zUmVhZHlUb09wZXJhdGU6CisJCXsKKwkJCS8vIGNoZWNrIGlmIFBSZXMgb2YgQ05zIGFyZSBPSworCQkJLy8gZC5rLiB0aGF0IG1lYW5zIHdhaXQgQ3ljbGVMZW5ndGggKiBNdWx0aXBsZXhDeWNsZUNvdW50IChpLmUuIHN0YXJ0IHRpbWVyKQorCQkJLy8gICAgICBiZWNhdXNlIERsbGsgY2hlY2tzIFBSZXMgb2YgQ05zIGF1dG9tYXRpY2FsbHkgaW4gUmVhZHlUb09wCisJCQlSZXQgPSBFcGxObXRNbnVTdGFydENoZWNrQ29tKCk7CisJCQlicmVhazsKKwkJfQorCisJCS8vIG5vcm1hbCB3b3JrIHN0YXRlCisJY2FzZSBrRXBsTm10TXNPcGVyYXRpb25hbDoKKwkJeworCQkJLy8gc2VuZCBTdGFydE5vZGUgdG8gQ05zCisJCQkvLyB3YWl0IGZvciBOTVQgc3RhdGUgY2hhbmdlIG9mIENOcworCQkJUmV0ID0gRXBsTm10TW51U3RhcnROb2RlcygpOworCQkJYnJlYWs7CisJCX0KKworCQkvLyBubyBFUEwgY3ljbGUKKwkJLy8gLT4gbm9ybWFsIGV0aGVybmV0IGNvbW11bmljYXRpb24KKwljYXNlIGtFcGxObXRNc0Jhc2ljRXRoZXJuZXQ6CisJCXsKKwkJCWJyZWFrOworCQl9CisKKwlkZWZhdWx0OgorCQl7CisvLyAgICAgICAgICAgIFRSQUNFMCgiRXBsTm10TW51Q2JObXRTdGF0ZUNoYW5nZSgpOiB1bmhhbmRsZWQgTk1UIHN0YXRlXG4iKTsKKwkJfQorCX0KKworCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE5tdE1udUNiQ2hlY2tFdmVudAorLy8KKy8vIERlc2NyaXB0aW9uOiBjYWxsYmFjayBmdW5rdGlvbiBmb3IgTk1UIGV2ZW50cyBiZWZvcmUgdGhleSBhcmUgYWN0dWFsbHkgZXhlY3V0ZWQuCisvLyAgICAgICAgICAgICAgVGhlIEVQTCBBUEkgbGF5ZXIgbXVzdCBmb3J3YXJkIE5NVCBldmVudHMgZnJvbSBObXRDbnUgbW9kdWxlLgorLy8gICAgICAgICAgICAgIFRoaXMgbW9kdWxlIHdpbGwgcmVqZWN0IHNvbWUgTk1UIGNvbW1hbmRzIHdoaWxlIE1OLgorLy8KKy8vIFBhcmFtZXRlcnM6ICBObXRFdmVudF9wICAgICAgICAgICAgICA9IG91dHN0YW5kaW5nIE5NVCBldmVudCBmb3IgYXBwcm92YWwKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLyAgICAgICAgICAgICAgICAgICAgICBrRXBsUmVqZWN0ICAgICAgPSByZWplY3QgdGhlIE5NVCBldmVudAorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbE5tdE1udUNiQ2hlY2tFdmVudCh0RXBsTm10RXZlbnQgTm10RXZlbnRfcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsTm10dVByb2Nlc3NFdmVudAorLy8KKy8vIERlc2NyaXB0aW9uOiBwcm9jZXNzZXMgZXZlbnRzIGZyb20gZXZlbnQgcXVldWUKKy8vCisvLyBQYXJhbWV0ZXJzOiAgcEV2ZW50X3AgICAgICAgID0gcG9pbnRlciB0byBldmVudAorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgPSBlcnJvcmNvZGUKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMgRXBsTm10TW51UHJvY2Vzc0V2ZW50KHRFcGxFdmVudCAqIHBFdmVudF9wKQoreworCXRFcGxLZXJuZWwgUmV0OworCisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwkvLyBwcm9jZXNzIGV2ZW50CisJc3dpdGNoIChwRXZlbnRfcC0+bV9FdmVudFR5cGUpIHsKKwkJLy8gdGltZXIgZXZlbnQKKwljYXNlIGtFcGxFdmVudFR5cGVUaW1lcjoKKwkJeworCQkJdEVwbFRpbWVyRXZlbnRBcmcgKnBUaW1lckV2ZW50QXJnID0KKwkJCSAgICAodEVwbFRpbWVyRXZlbnRBcmcgKikgcEV2ZW50X3AtPm1fcEFyZzsKKwkJCXVuc2lnbmVkIGludCB1aU5vZGVJZDsKKworCQkJdWlOb2RlSWQgPQorCQkJICAgICh1bnNpZ25lZCBpbnQpKHBUaW1lckV2ZW50QXJnLT4KKwkJCQkJICAgbV91bEFyZyAmCisJCQkJCSAgIEVQTF9OTVRNTlVfVElNRVJBUkdfTk9ERV9NQVNLKTsKKwkJCWlmICh1aU5vZGVJZCAhPSAwKSB7CisJCQkJdEVwbE9iZFNpemUgT2JkU2l6ZTsKKwkJCQlCWVRFIGJObXRTdGF0ZTsKKwkJCQl0RXBsTm10TW51Tm9kZUluZm8gKnBOb2RlSW5mbzsKKworCQkJCXBOb2RlSW5mbyA9IEVQTF9OTVRNTlVfR0VUX05PREVJTkZPKHVpTm9kZUlkKTsKKworCQkJCU9iZFNpemUgPSAxOworCQkJCVJldCA9CisJCQkJICAgIEVwbE9iZHVSZWFkRW50cnkoMHgxRjhFLCB1aU5vZGVJZCwKKwkJCQkJCSAgICAgJmJObXRTdGF0ZSwgJk9iZFNpemUpOworCQkJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJaWYgKChwVGltZXJFdmVudEFyZy0+CisJCQkJICAgICBtX3VsQXJnICYgRVBMX05NVE1OVV9USU1FUkFSR19JREVOVFJFUSkgIT0KKwkJCQkgICAgMEwpIHsKKwkJCQkJaWYgKChwTm9kZUluZm8tPgorCQkJCQkgICAgIG1fd0ZsYWdzICYKKwkJCQkJICAgICBFUExfTk1UTU5VX05PREVfRkxBR19DT1VOVF9TVEFUUkVRKQorCQkJCQkgICAgIT0gKHBUaW1lckV2ZW50QXJnLT5tX3VsQXJnICYgRVBMX05NVE1OVV9USU1FUkFSR19DT1VOVF9TUikpIHsJLy8gdGhpcyBpcyBhbiBvbGQgKGFscmVhZHkgZGVsZXRlZCBvciBtb2RpZmllZCkgdGltZXIKKwkJCQkJCS8vIGJ1dCBub3QgdGhlIGN1cnJlbnQgdGltZXIKKwkJCQkJCS8vIHNvIGRpc2NhcmQgaXQKKwkJCQkJCUVQTF9OTVRNTlVfREJHX1BPU1RfVFJBQ0VfVkFMVUUKKwkJCQkJCSAgICAoa0VwbE5tdE1udUludE5vZGVFdmVudFRpbWVySWRlbnRSZXEsCisJCQkJCQkgICAgIHVpTm9kZUlkLAorCQkJCQkJICAgICAoKHBOb2RlSW5mby0+CisJCQkJCQkgICAgICAgbV9Ob2RlU3RhdGUgPDwgOCkKKwkJCQkJCSAgICAgIHwgMHhGRikpOworCisJCQkJCQlicmVhazsKKwkJCQkJfQorLyoKKyAgICAgICAgICAgICAgICAgICAgRVBMX05NVE1OVV9EQkdfUE9TVF9UUkFDRV9WQUxVRShrRXBsTm10TW51SW50Tm9kZUV2ZW50VGltZXJJZGVudFJlcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aU5vZGVJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHBOb2RlSW5mby0+bV9Ob2RlU3RhdGUgPDwgOCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAweDgwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKChwTm9kZUluZm8tPm1fd0ZsYWdzICYgRVBMX05NVE1OVV9OT0RFX0ZMQUdfQ09VTlRfU1RBVFJFUSkgPj4gNikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoKHBUaW1lckV2ZW50QXJnLT5tX3VsQXJnICYgRVBMX05NVE1OVV9USU1FUkFSR19DT1VOVF9TUikgPj4gOCkpKTsKKyovCisJCQkJCVJldCA9CisJCQkJCSAgICBFcGxObXRNbnVQcm9jZXNzSW50ZXJuYWxFdmVudAorCQkJCQkgICAgKHVpTm9kZUlkLAorCQkJCQkgICAgICh0RXBsTm10U3RhdGUpIChiTm10U3RhdGUgfAorCQkJCQkJCSAgICAgRVBMX05NVF9UWVBFX0NTKSwKKwkJCQkJICAgICBFUExfRV9OT19FUlJPUiwKKwkJCQkJICAgICBrRXBsTm10TW51SW50Tm9kZUV2ZW50VGltZXJJZGVudFJlcSk7CisJCQkJfQorCisJCQkJZWxzZSBpZiAoKHBUaW1lckV2ZW50QXJnLT4KKwkJCQkJICBtX3VsQXJnICYgRVBMX05NVE1OVV9USU1FUkFSR19TVEFUUkVRKQorCQkJCQkgIT0gMEwpIHsKKwkJCQkJaWYgKChwTm9kZUluZm8tPgorCQkJCQkgICAgIG1fd0ZsYWdzICYKKwkJCQkJICAgICBFUExfTk1UTU5VX05PREVfRkxBR19DT1VOVF9TVEFUUkVRKQorCQkJCQkgICAgIT0gKHBUaW1lckV2ZW50QXJnLT5tX3VsQXJnICYgRVBMX05NVE1OVV9USU1FUkFSR19DT1VOVF9TUikpIHsJLy8gdGhpcyBpcyBhbiBvbGQgKGFscmVhZHkgZGVsZXRlZCBvciBtb2RpZmllZCkgdGltZXIKKwkJCQkJCS8vIGJ1dCBub3QgdGhlIGN1cnJlbnQgdGltZXIKKwkJCQkJCS8vIHNvIGRpc2NhcmQgaXQKKwkJCQkJCUVQTF9OTVRNTlVfREJHX1BPU1RfVFJBQ0VfVkFMVUUKKwkJCQkJCSAgICAoa0VwbE5tdE1udUludE5vZGVFdmVudFRpbWVyU3RhdFJlcSwKKwkJCQkJCSAgICAgdWlOb2RlSWQsCisJCQkJCQkgICAgICgocE5vZGVJbmZvLT4KKwkJCQkJCSAgICAgICBtX05vZGVTdGF0ZSA8PCA4KQorCQkJCQkJICAgICAgfCAweEZGKSk7CisKKwkJCQkJCWJyZWFrOworCQkJCQl9CisvKgorICAgICAgICAgICAgICAgICAgICBFUExfTk1UTU5VX0RCR19QT1NUX1RSQUNFX1ZBTFVFKGtFcGxObXRNbnVJbnROb2RlRXZlbnRUaW1lclN0YXRSZXEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlOb2RlSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChwTm9kZUluZm8tPm1fTm9kZVN0YXRlIDw8IDgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMHg4MAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICgocE5vZGVJbmZvLT5tX3dGbGFncyAmIEVQTF9OTVRNTlVfTk9ERV9GTEFHX0NPVU5UX1NUQVRSRVEpID4+IDYpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKChwVGltZXJFdmVudEFyZy0+bV91bEFyZyAmIEVQTF9OTVRNTlVfVElNRVJBUkdfQ09VTlRfU1IpID4+IDgpKSk7CisqLworCQkJCQlSZXQgPQorCQkJCQkgICAgRXBsTm10TW51UHJvY2Vzc0ludGVybmFsRXZlbnQKKwkJCQkJICAgICh1aU5vZGVJZCwKKwkJCQkJICAgICAodEVwbE5tdFN0YXRlKSAoYk5tdFN0YXRlIHwKKwkJCQkJCQkgICAgIEVQTF9OTVRfVFlQRV9DUyksCisJCQkJCSAgICAgRVBMX0VfTk9fRVJST1IsCisJCQkJCSAgICAga0VwbE5tdE1udUludE5vZGVFdmVudFRpbWVyU3RhdFJlcSk7CisJCQkJfQorCisJCQkJZWxzZSBpZiAoKHBUaW1lckV2ZW50QXJnLT4KKwkJCQkJICBtX3VsQXJnICYKKwkJCQkJICBFUExfTk1UTU5VX1RJTUVSQVJHX1NUQVRFX01PTikgIT0KKwkJCQkJIDBMKSB7CisJCQkJCWlmICgocE5vZGVJbmZvLT4KKwkJCQkJICAgICBtX3dGbGFncyAmCisJCQkJCSAgICAgRVBMX05NVE1OVV9OT0RFX0ZMQUdfQ09VTlRfU1RBVFJFUSkKKwkJCQkJICAgICE9IChwVGltZXJFdmVudEFyZy0+bV91bEFyZyAmIEVQTF9OTVRNTlVfVElNRVJBUkdfQ09VTlRfU1IpKSB7CS8vIHRoaXMgaXMgYW4gb2xkIChhbHJlYWR5IGRlbGV0ZWQgb3IgbW9kaWZpZWQpIHRpbWVyCisJCQkJCQkvLyBidXQgbm90IHRoZSBjdXJyZW50IHRpbWVyCisJCQkJCQkvLyBzbyBkaXNjYXJkIGl0CisJCQkJCQlFUExfTk1UTU5VX0RCR19QT1NUX1RSQUNFX1ZBTFVFCisJCQkJCQkgICAgKGtFcGxObXRNbnVJbnROb2RlRXZlbnRUaW1lclN0YXRlTW9uLAorCQkJCQkJICAgICB1aU5vZGVJZCwKKwkJCQkJCSAgICAgKChwTm9kZUluZm8tPgorCQkJCQkJICAgICAgIG1fTm9kZVN0YXRlIDw8IDgpCisJCQkJCQkgICAgICB8IDB4RkYpKTsKKworCQkJCQkJYnJlYWs7CisJCQkJCX0KKy8qCisgICAgICAgICAgICAgICAgICAgIEVQTF9OTVRNTlVfREJHX1BPU1RfVFJBQ0VfVkFMVUUoa0VwbE5tdE1udUludE5vZGVFdmVudFRpbWVyU3RhdFJlcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aU5vZGVJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHBOb2RlSW5mby0+bV9Ob2RlU3RhdGUgPDwgOCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAweDgwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKChwTm9kZUluZm8tPm1fd0ZsYWdzICYgRVBMX05NVE1OVV9OT0RFX0ZMQUdfQ09VTlRfU1RBVFJFUSkgPj4gNikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoKHBUaW1lckV2ZW50QXJnLT5tX3VsQXJnICYgRVBMX05NVE1OVV9USU1FUkFSR19DT1VOVF9TUikgPj4gOCkpKTsKKyovCisJCQkJCVJldCA9CisJCQkJCSAgICBFcGxObXRNbnVQcm9jZXNzSW50ZXJuYWxFdmVudAorCQkJCQkgICAgKHVpTm9kZUlkLAorCQkJCQkgICAgICh0RXBsTm10U3RhdGUpIChiTm10U3RhdGUgfAorCQkJCQkJCSAgICAgRVBMX05NVF9UWVBFX0NTKSwKKwkJCQkJICAgICBFUExfRV9OT19FUlJPUiwKKwkJCQkJICAgICBrRXBsTm10TW51SW50Tm9kZUV2ZW50VGltZXJTdGF0ZU1vbik7CisJCQkJfQorCisJCQkJZWxzZSBpZiAoKHBUaW1lckV2ZW50QXJnLT4KKwkJCQkJICBtX3VsQXJnICYgRVBMX05NVE1OVV9USU1FUkFSR19MT05HRVIpCisJCQkJCSAhPSAwTCkgeworCQkJCQlpZiAoKHBOb2RlSW5mby0+CisJCQkJCSAgICAgbV93RmxhZ3MgJgorCQkJCQkgICAgIEVQTF9OTVRNTlVfTk9ERV9GTEFHX0NPVU5UX0xPTkdFUikKKwkJCQkJICAgICE9IChwVGltZXJFdmVudEFyZy0+bV91bEFyZyAmIEVQTF9OTVRNTlVfVElNRVJBUkdfQ09VTlRfTE8pKSB7CS8vIHRoaXMgaXMgYW4gb2xkIChhbHJlYWR5IGRlbGV0ZWQgb3IgbW9kaWZpZWQpIHRpbWVyCisJCQkJCQkvLyBidXQgbm90IHRoZSBjdXJyZW50IHRpbWVyCisJCQkJCQkvLyBzbyBkaXNjYXJkIGl0CisJCQkJCQlFUExfTk1UTU5VX0RCR19QT1NUX1RSQUNFX1ZBTFVFCisJCQkJCQkgICAgKGtFcGxObXRNbnVJbnROb2RlRXZlbnRUaW1lckxvbmdlciwKKwkJCQkJCSAgICAgdWlOb2RlSWQsCisJCQkJCQkgICAgICgocE5vZGVJbmZvLT4KKwkJCQkJCSAgICAgICBtX05vZGVTdGF0ZSA8PCA4KQorCQkJCQkJICAgICAgfCAweEZGKSk7CisKKwkJCQkJCWJyZWFrOworCQkJCQl9CisvKgorICAgICAgICAgICAgICAgICAgICBFUExfTk1UTU5VX0RCR19QT1NUX1RSQUNFX1ZBTFVFKGtFcGxObXRNbnVJbnROb2RlRXZlbnRUaW1lckxvbmdlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aU5vZGVJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHBOb2RlSW5mby0+bV9Ob2RlU3RhdGUgPDwgOCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAweDgwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKChwTm9kZUluZm8tPm1fd0ZsYWdzICYgRVBMX05NVE1OVV9OT0RFX0ZMQUdfQ09VTlRfTE9OR0VSKSA+PiA2KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICgocFRpbWVyRXZlbnRBcmctPm1fdWxBcmcgJiBFUExfTk1UTU5VX1RJTUVSQVJHX0NPVU5UX0xPKSA+PiA4KSkpOworKi8KKwkJCQkJUmV0ID0KKwkJCQkJICAgIEVwbE5tdE1udVByb2Nlc3NJbnRlcm5hbEV2ZW50CisJCQkJCSAgICAodWlOb2RlSWQsCisJCQkJCSAgICAgKHRFcGxObXRTdGF0ZSkgKGJObXRTdGF0ZSB8CisJCQkJCQkJICAgICBFUExfTk1UX1RZUEVfQ1MpLAorCQkJCQkgICAgIEVQTF9FX05PX0VSUk9SLAorCQkJCQkgICAgIGtFcGxObXRNbnVJbnROb2RlRXZlbnRUaW1lckxvbmdlcik7CisJCQkJfQorCisJCQl9IGVsc2UgewkvLyBnbG9iYWwgdGltZXIgZXZlbnQKKwkJCX0KKwkJCWJyZWFrOworCQl9CisKKwljYXNlIGtFcGxFdmVudFR5cGVIZWFydGJlYXQ6CisJCXsKKwkJCXRFcGxIZWFydGJlYXRFdmVudCAqcEhlYXJ0YmVhdEV2ZW50ID0KKwkJCSAgICAodEVwbEhlYXJ0YmVhdEV2ZW50ICopIHBFdmVudF9wLT5tX3BBcmc7CisKKwkJCVJldCA9CisJCQkgICAgRXBsTm10TW51UHJvY2Vzc0ludGVybmFsRXZlbnQocEhlYXJ0YmVhdEV2ZW50LT4KKwkJCQkJCQkgIG1fdWlOb2RlSWQsCisJCQkJCQkJICBwSGVhcnRiZWF0RXZlbnQtPgorCQkJCQkJCSAgbV9ObXRTdGF0ZSwKKwkJCQkJCQkgIHBIZWFydGJlYXRFdmVudC0+CisJCQkJCQkJICBtX3dFcnJvckNvZGUsCisJCQkJCQkJICBrRXBsTm10TW51SW50Tm9kZUV2ZW50SGVhcnRiZWF0KTsKKwkJCWJyZWFrOworCQl9CisKKwljYXNlIGtFcGxFdmVudFR5cGVObXRNbnVObXRDbWRTZW50OgorCQl7CisJCQl0RXBsRnJhbWUgKnBGcmFtZSA9ICh0RXBsRnJhbWUgKikgcEV2ZW50X3AtPm1fcEFyZzsKKwkJCXVuc2lnbmVkIGludCB1aU5vZGVJZDsKKwkJCXRFcGxObXRDb21tYW5kIE5tdENvbW1hbmQ7CisJCQlCWVRFIGJObXRTdGF0ZTsKKworCQkJdWlOb2RlSWQgPSBBbWlHZXRCeXRlRnJvbUxlKCZwRnJhbWUtPm1fbGVfYkRzdE5vZGVJZCk7CisJCQlObXRDb21tYW5kID0KKwkJCSAgICAodEVwbE5tdENvbW1hbmQpIEFtaUdldEJ5dGVGcm9tTGUoJnBGcmFtZS0+bV9EYXRhLgorCQkJCQkJCSAgICAgIG1fQXNuZC5tX1BheWxvYWQuCisJCQkJCQkJICAgICAgbV9ObXRDb21tYW5kU2VydmljZS4KKwkJCQkJCQkgICAgICBtX2xlX2JObXRDb21tYW5kSWQpOworCisJCQlzd2l0Y2ggKE5tdENvbW1hbmQpIHsKKwkJCWNhc2Uga0VwbE5tdENtZFN0YXJ0Tm9kZToKKwkJCQliTm10U3RhdGUgPQorCQkJCSAgICAoQllURSkgKGtFcGxObXRDc09wZXJhdGlvbmFsICYgMHhGRik7CisJCQkJYnJlYWs7CisKKwkJCWNhc2Uga0VwbE5tdENtZFN0b3BOb2RlOgorCQkJCWJObXRTdGF0ZSA9IChCWVRFKSAoa0VwbE5tdENzU3RvcHBlZCAmIDB4RkYpOworCQkJCWJyZWFrOworCisJCQljYXNlIGtFcGxObXRDbWRFbnRlclByZU9wZXJhdGlvbmFsMjoKKwkJCQliTm10U3RhdGUgPQorCQkJCSAgICAoQllURSkgKGtFcGxObXRDc1ByZU9wZXJhdGlvbmFsMiAmIDB4RkYpOworCQkJCWJyZWFrOworCisJCQljYXNlIGtFcGxObXRDbWRFbmFibGVSZWFkeVRvT3BlcmF0ZToKKwkJCQkvLyBkLmsuIGRvIG5vdCBjaGFuZ2UgZXhwZWN0ZWQgbm9kZSBzdGF0ZSwgYmVjYXVzZSBvZiBEUyAxLjAuMCA3LjMuMS4yLjEgUGxhaW4gTk1UIFN0YXRlIENvbW1hbmQKKwkJCQkvLyAgICAgIGFuZCBiZWNhdXNlIG5vZGUgbWF5IG5vdCBjaGFuZ2UgTk1UIHN0YXRlIHdpdGhpbiBFUExfQ19OTVRfU1RBVEVfVE9MRVJBTkNFCisJCQkJYk5tdFN0YXRlID0KKwkJCQkgICAgKEJZVEUpIChrRXBsTm10Q3NQcmVPcGVyYXRpb25hbDIgJiAweEZGKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBrRXBsTm10Q21kUmVzZXROb2RlOgorCQkJY2FzZSBrRXBsTm10Q21kUmVzZXRDb21tdW5pY2F0aW9uOgorCQkJY2FzZSBrRXBsTm10Q21kUmVzZXRDb25maWd1cmF0aW9uOgorCQkJY2FzZSBrRXBsTm10Q21kU3dSZXNldDoKKwkJCQliTm10U3RhdGUgPSAoQllURSkgKGtFcGxObXRDc05vdEFjdGl2ZSAmIDB4RkYpOworCQkJCS8vIEVwbE5tdE1udVByb2Nlc3NJbnRlcm5hbEV2ZW50KCkgc2V0cyBpbnRlcm5hbCBub2RlIHN0YXRlIHRvIGtFcGxObXRNbnVOb2RlU3RhdGVVbmtub3duCisJCQkJLy8gYWZ0ZXIgbmV4dCB1bnJlc3BvbmRlZCBJZGVudFJlcXVlc3QvU3RhdHVzUmVxdWVzdAorCQkJCWJyZWFrOworCisJCQlkZWZhdWx0OgorCQkJCWdvdG8gRXhpdDsKKwkJCX0KKworCQkJLy8gcHJvY2VzcyBhcyBpbnRlcm5hbCBldmVudCB3aGljaCB1cGRhdGUgZXhwZWN0ZWQgTk1UIHN0YXRlIGluIE9ECisJCQlpZiAodWlOb2RlSWQgIT0gRVBMX0NfQURSX0JST0FEQ0FTVCkgeworCQkJCVJldCA9IEVwbE5tdE1udVByb2Nlc3NJbnRlcm5hbEV2ZW50KHVpTm9kZUlkLAorCQkJCQkJCQkgICAgKHRFcGxObXRTdGF0ZSkKKwkJCQkJCQkJICAgIChiTm10U3RhdGUgfAorCQkJCQkJCQkgICAgIEVQTF9OTVRfVFlQRV9DUyksCisJCQkJCQkJCSAgICAwLAorCQkJCQkJCQkgICAga0VwbE5tdE1udUludE5vZGVFdmVudE5tdENtZFNlbnQpOworCisJCQl9IGVsc2UgewkvLyBwcm9jZXNzIGludGVybmFsIGV2ZW50IGZvciBhbGwgYWN0aXZlIG5vZGVzIChleGNlcHQgbXlzZWxmKQorCisJCQkJZm9yICh1aU5vZGVJZCA9IDE7CisJCQkJICAgICB1aU5vZGVJZCA8PQorCQkJCSAgICAgdGFiZW50cmllcyhFcGxObXRNbnVJbnN0YW5jZV9nLgorCQkJCQkJbV9hTm9kZUluZm8pOyB1aU5vZGVJZCsrKSB7CisJCQkJCWlmICgoRVBMX05NVE1OVV9HRVRfTk9ERUlORk8odWlOb2RlSWQpLT4KKwkJCQkJICAgICBtX2R3Tm9kZUNmZyAmCisJCQkJCSAgICAgKEVQTF9OT0RFQVNTSUdOX05PREVfSVNfQ04gfAorCQkJCQkgICAgICBFUExfTk9ERUFTU0lHTl9OT0RFX0VYSVNUUykpICE9CisJCQkJCSAgICAwKSB7CisJCQkJCQlSZXQgPQorCQkJCQkJICAgIEVwbE5tdE1udVByb2Nlc3NJbnRlcm5hbEV2ZW50CisJCQkJCQkgICAgKHVpTm9kZUlkLAorCQkJCQkJICAgICAodEVwbE5tdFN0YXRlKSAoYk5tdFN0YXRlIHwKKwkJCQkJCQkJICAgICBFUExfTk1UX1RZUEVfQ1MpLAorCQkJCQkJICAgICAwLAorCQkJCQkJICAgICBrRXBsTm10TW51SW50Tm9kZUV2ZW50Tm10Q21kU2VudCk7CisKKwkJCQkJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCQkJCQlnb3RvIEV4aXQ7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisKKwkJCWJyZWFrOworCQl9CisKKwlkZWZhdWx0OgorCQl7CisJCQlSZXQgPSBrRXBsTm10SW52YWxpZEV2ZW50OworCQl9CisKKwl9CisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsTm10TW51R2V0UnVubmluZ1RpbWVyU3RhdFJlcQorLy8KKy8vIERlc2NyaXB0aW9uOiByZXR1cm5zIGEgYml0IGZpZWxkIHdpdGggcnVubmluZyBTdGF0UmVxIHRpbWVycworLy8gICAgICAgICAgICAgIGp1c3QgZm9yIGRlYnVnZ2luZyBwdXJwb3NlcworLy8KKy8vIFBhcmFtZXRlcnM6ICAobm9uZSkKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsTm10TW51R2V0RGlhZ25vc3RpY0luZm8odW5zaWduZWQgaW50CisJCQkJCSAgICAgKnB1aU1hbmRhdG9yeVNsYXZlQ291bnRfcCwKKwkJCQkJICAgICB1bnNpZ25lZCBpbnQKKwkJCQkJICAgICAqcHVpU2lnbmFsU2xhdmVDb3VudF9wLAorCQkJCQkgICAgIFdPUkQgKiBwd0ZsYWdzX3ApCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCWlmICgocHVpTWFuZGF0b3J5U2xhdmVDb3VudF9wID09IE5VTEwpCisJICAgIHx8IChwdWlTaWduYWxTbGF2ZUNvdW50X3AgPT0gTlVMTCkKKwkgICAgfHwgKHB3RmxhZ3NfcCA9PSBOVUxMKSkgeworCQlSZXQgPSBrRXBsTm10SW52YWxpZFBhcmFtOworCQlnb3RvIEV4aXQ7CisJfQorCisJKnB1aU1hbmRhdG9yeVNsYXZlQ291bnRfcCA9IEVwbE5tdE1udUluc3RhbmNlX2cubV91aU1hbmRhdG9yeVNsYXZlQ291bnQ7CisJKnB1aVNpZ25hbFNsYXZlQ291bnRfcCA9IEVwbE5tdE1udUluc3RhbmNlX2cubV91aVNpZ25hbFNsYXZlQ291bnQ7CisJKnB3RmxhZ3NfcCA9IEVwbE5tdE1udUluc3RhbmNlX2cubV93RmxhZ3M7CisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsTm10TW51R2V0UnVubmluZ1RpbWVyU3RhdFJlcQorLy8KKy8vIERlc2NyaXB0aW9uOiByZXR1cm5zIGEgYml0IGZpZWxkIHdpdGggcnVubmluZyBTdGF0UmVxIHRpbWVycworLy8gICAgICAgICAgICAgIGp1c3QgZm9yIGRlYnVnZ2luZyBwdXJwb3NlcworLy8KKy8vIFBhcmFtZXRlcnM6ICAobm9uZSkKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qCitEV09SRCBFcGxObXRNbnVHZXRSdW5uaW5nVGltZXJTdGF0UmVxKHZvaWQpCit7Cit0RXBsS2VybmVsICAgICAgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7Cit1bnNpZ25lZCBpbnQgICAgdWlJbmRleDsKK3RFcGxObXRNbnVOb2RlSW5mbyogcE5vZGVJbmZvOworCisgICAgcE5vZGVJbmZvID0gRXBsTm10TW51SW5zdGFuY2VfZy5tX2FOb2RlSW5mbzsKKyAgICBmb3IgKHVpSW5kZXggPSAxOyB1aUluZGV4IDw9IHRhYmVudHJpZXMoRXBsTm10TW51SW5zdGFuY2VfZy5tX2FOb2RlSW5mbyk7IHVpSW5kZXgrKywgcE5vZGVJbmZvKyspCisgICAgeworICAgICAgICBpZiAocE5vZGVJbmZvLT5tX05vZGVTdGF0ZSA9PSBrRXBsTm10TW51Tm9kZVN0YXRlQ29uZmlndXJlZCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gcmVzZXQgZmxhZyAic2Nhbm5lZCBvbmNlIgorICAgICAgICAgICAgcE5vZGVJbmZvLT5tX3dGbGFncyAmPSB+RVBMX05NVE1OVV9OT0RFX0ZMQUdfU0NBTk5FRDsKKworICAgICAgICAgICAgUmV0ID0gRXBsTm10TW51Tm9kZUJvb3RTdGVwMih1aUluZGV4LCBwTm9kZUluZm8pOworICAgICAgICAgICAgaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnb3RvIEV4aXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBFcGxObXRNbnVJbnN0YW5jZV9nLm1fdWlTaWduYWxTbGF2ZUNvdW50Kys7CisgICAgICAgICAgICAvLyBzaWduYWwgc2xhdmUgY291bnRlciBzaGFsbCBiZSBkZWNyZW1lbnRlZCBpZiBTdGF0dXNSZXF1ZXN0IHdhcyBzZW50IG9uY2UgdG8gYSBDTgorICAgICAgICAgICAgLy8gbWFuZGF0b3J5IHNsYXZlIGNvdW50ZXIgc2hhbGwgYmUgZGVjcmVtZW50ZWQgaWYgbWFuZGF0b3J5IENOIGlzIFJlYWR5VG9PcAorICAgICAgICB9CisgICAgfQorCitFeGl0OgorICAgIHJldHVybiBSZXQ7Cit9CisqLworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgIFAgUiBJIFYgQSBUIEUgICBGIFUgTiBDIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsTm10TW51Q2JObXRSZXF1ZXN0CisvLworLy8gRGVzY3JpcHRpb246IGNhbGxiYWNrIGZ1bmt0aW9uIGZvciBObXRSZXF1ZXN0CisvLworLy8gUGFyYW1ldGVyczogIHBGcmFtZUluZm9fcCAgICAgICAgICAgID0gRnJhbWUgd2l0aCB0aGUgTm10UmVxdWVzdAorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHRFcGxLZXJuZWwgUFVCTElDIEVwbE5tdE1udUNiTm10UmVxdWVzdCh0RXBsRnJhbWVJbmZvICogcEZyYW1lSW5mb19wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwkvLyAkJCQgcGVyZm9ybSBOTVRSZXF1ZXN0CisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsTm10TW51Q2JJZGVudFJlc3BvbnNlCisvLworLy8gRGVzY3JpcHRpb246IGNhbGxiYWNrIGZ1bmt0aW9uIGZvciBJZGVudFJlc3BvbnNlCisvLworLy8gUGFyYW1ldGVyczogIHVpTm9kZUlkX3AgICAgICAgICAgICAgID0gbm9kZSBJRCBmb3Igd2hpY2ggSWRlbnRSZXBvbnNlIHdhcyByZWNlaXZlZAorLy8gICAgICAgICAgICAgIHBJZGVudFJlc3BvbnNlX3AgICAgICAgID0gcG9pbnRlciB0byBJZGVudFJlc3BvbnNlCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBOVUxMIGlmIG5vZGUgZGlkIG5vdCBhbnN3ZXIKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHRFcGxLZXJuZWwgUFVCTElDIEVwbE5tdE1udUNiSWRlbnRSZXNwb25zZSh1bnNpZ25lZCBpbnQgdWlOb2RlSWRfcCwKKwkJCQkJCSAgdEVwbElkZW50UmVzcG9uc2UgKgorCQkJCQkJICBwSWRlbnRSZXNwb25zZV9wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwlpZiAocElkZW50UmVzcG9uc2VfcCA9PSBOVUxMKSB7CS8vIG5vZGUgZGlkIG5vdCBhbnN3ZXIKKwkJUmV0ID0gRXBsTm10TW51UHJvY2Vzc0ludGVybmFsRXZlbnQodWlOb2RlSWRfcCwga0VwbE5tdENzTm90QWN0aXZlLCBFUExfRV9OTVRfTk9fSURFTlRfUkVTLAkvLyB3YXMgRVBMX0VfTk9fRVJST1IKKwkJCQkJCSAgICBrRXBsTm10TW51SW50Tm9kZUV2ZW50Tm9JZGVudFJlc3BvbnNlKTsKKwl9IGVsc2UgewkJLy8gbm9kZSBhbnN3ZXJlZCBJZGVudFJlcXVlc3QKKwkJdEVwbE9iZFNpemUgT2JkU2l6ZTsKKwkJRFdPUkQgZHdEZXZUeXBlOworCQlXT1JEIHdFcnJvckNvZGUgPSBFUExfRV9OT19FUlJPUjsKKwkJdEVwbE5tdFN0YXRlIE5tdFN0YXRlID0KKwkJICAgICh0RXBsTm10U3RhdGUpIChBbWlHZXRCeXRlRnJvbUxlCisJCQkJICAgICgmcElkZW50UmVzcG9uc2VfcC0+CisJCQkJICAgICBtX2xlX2JObXRTdGF0dXMpIHwgRVBMX05NVF9UWVBFX0NTKTsKKworCQkvLyBjaGVjayBJZGVudFJlc3BvbnNlICQkJCBtb3ZlIHRvIFByb2Nlc3NJbnRlcm4sIGJlY2F1c2UgdGhpcyBmdW5jdGlvbiBtYXkgYmUgY2FsbGVkIGFsc28gaWYgQ04KKworCQkvLyBjaGVjayBEZXZpY2VUeXBlICgweDFGODQpCisJCU9iZFNpemUgPSA0OworCQlSZXQgPQorCQkgICAgRXBsT2JkdVJlYWRFbnRyeSgweDFGODQsIHVpTm9kZUlkX3AsICZkd0RldlR5cGUsICZPYmRTaXplKTsKKwkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJZ290byBFeGl0OworCQl9CisJCWlmIChkd0RldlR5cGUgIT0gMEwpIHsJLy8gYWN0dWFsbHkgY29tcGFyZSBpdCB3aXRoIERldmljZVR5cGUgZnJvbSBJZGVudFJlc3BvbnNlCisJCQlpZiAoQW1pR2V0RHdvcmRGcm9tTGUoJnBJZGVudFJlc3BvbnNlX3AtPm1fbGVfZHdEZXZpY2VUeXBlKSAhPSBkd0RldlR5cGUpIHsJLy8gd3JvbmcgRGV2aWNlVHlwZQorCQkJCU5tdFN0YXRlID0ga0VwbE5tdENzTm90QWN0aXZlOworCQkJCXdFcnJvckNvZGUgPSBFUExfRV9OTVRfQlBPMV9ERVZJQ0VfVFlQRTsKKwkJCX0KKwkJfQorCisJCVJldCA9IEVwbE5tdE1udVByb2Nlc3NJbnRlcm5hbEV2ZW50KHVpTm9kZUlkX3AsCisJCQkJCQkgICAgTm10U3RhdGUsCisJCQkJCQkgICAgd0Vycm9yQ29kZSwKKwkJCQkJCSAgICBrRXBsTm10TW51SW50Tm9kZUV2ZW50SWRlbnRSZXNwb25zZSk7CisJfQorCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE5tdE1udUNiU3RhdHVzUmVzcG9uc2UKKy8vCisvLyBEZXNjcmlwdGlvbjogY2FsbGJhY2sgZnVua3Rpb24gZm9yIFN0YXR1c1Jlc3BvbnNlCisvLworLy8gUGFyYW1ldGVyczogIHVpTm9kZUlkX3AgICAgICAgICAgICAgID0gbm9kZSBJRCBmb3Igd2hpY2ggSWRlbnRSZXBvbnNlIHdhcyByZWNlaXZlZAorLy8gICAgICAgICAgICAgIHBJZGVudFJlc3BvbnNlX3AgICAgICAgID0gcG9pbnRlciB0byBJZGVudFJlc3BvbnNlCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBOVUxMIGlmIG5vZGUgZGlkIG5vdCBhbnN3ZXIKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHRFcGxLZXJuZWwgUFVCTElDIEVwbE5tdE1udUNiU3RhdHVzUmVzcG9uc2UodW5zaWduZWQgaW50IHVpTm9kZUlkX3AsCisJCQkJCQkgICB0RXBsU3RhdHVzUmVzcG9uc2UgKgorCQkJCQkJICAgcFN0YXR1c1Jlc3BvbnNlX3ApCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCWlmIChwU3RhdHVzUmVzcG9uc2VfcCA9PSBOVUxMKSB7CS8vIG5vZGUgZGlkIG5vdCBhbnN3ZXIKKwkJUmV0ID0gRXBsTm10TW51UHJvY2Vzc0ludGVybmFsRXZlbnQodWlOb2RlSWRfcCwga0VwbE5tdENzTm90QWN0aXZlLCBFUExfRV9OTVRfTk9fU1RBVFVTX1JFUywJLy8gd2FzIEVQTF9FX05PX0VSUk9SCisJCQkJCQkgICAga0VwbE5tdE1udUludE5vZGVFdmVudE5vU3RhdHVzUmVzcG9uc2UpOworCX0gZWxzZSB7CQkvLyBub2RlIGFuc3dlcmVkIFN0YXR1c1JlcXVlc3QKKwkJUmV0ID0gRXBsTm10TW51UHJvY2Vzc0ludGVybmFsRXZlbnQodWlOb2RlSWRfcCwKKwkJCQkJCSAgICAodEVwbE5tdFN0YXRlKQorCQkJCQkJICAgIChBbWlHZXRCeXRlRnJvbUxlCisJCQkJCQkgICAgICgmcFN0YXR1c1Jlc3BvbnNlX3AtPgorCQkJCQkJICAgICAgbV9sZV9iTm10U3RhdHVzKSB8CisJCQkJCQkgICAgIEVQTF9OTVRfVFlQRV9DUyksCisJCQkJCQkgICAgRVBMX0VfTk9fRVJST1IsCisJCQkJCQkgICAga0VwbE5tdE1udUludE5vZGVFdmVudFN0YXR1c1Jlc3BvbnNlKTsKKwl9CisKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxObXRNbnVTdGFydEJvb3RTdGVwMQorLy8KKy8vIERlc2NyaXB0aW9uOiBzdGFydHMgQm9vdFN0ZXAxCisvLworLy8gUGFyYW1ldGVyczogIChub25lKQorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdEVwbEtlcm5lbCBFcGxObXRNbnVTdGFydEJvb3RTdGVwMSh2b2lkKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJdW5zaWduZWQgaW50IHVpU3ViSW5kZXg7CisJdW5zaWduZWQgaW50IHVpTG9jYWxOb2RlSWQ7CisJRFdPUkQgZHdOb2RlQ2ZnOworCXRFcGxPYmRTaXplIE9iZFNpemU7CisKKwkvLyAkJCQgZC5rLjogc2F2ZSBjdXJyZW50IHRpbWUgZm9yIDB4MUY4OS8yIE1OVGltZW91dFByZU9wMV9VMzIKKworCS8vIHN0YXJ0IG5ldHdvcmsgc2NhbgorCUVwbE5tdE1udUluc3RhbmNlX2cubV91aU1hbmRhdG9yeVNsYXZlQ291bnQgPSAwOworCUVwbE5tdE1udUluc3RhbmNlX2cubV91aVNpZ25hbFNsYXZlQ291bnQgPSAwOworCS8vIGNoZWNrIDB4MUY4MQorCXVpTG9jYWxOb2RlSWQgPSBFcGxPYmR1R2V0Tm9kZUlkKCk7CisJZm9yICh1aVN1YkluZGV4ID0gMTsgdWlTdWJJbmRleCA8PSAyNTQ7IHVpU3ViSW5kZXgrKykgeworCQlPYmRTaXplID0gNDsKKwkJUmV0ID0KKwkJICAgIEVwbE9iZHVSZWFkRW50cnkoMHgxRjgxLCB1aVN1YkluZGV4LCAmZHdOb2RlQ2ZnLCAmT2JkU2l6ZSk7CisJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCWdvdG8gRXhpdDsKKwkJfQorCQlpZiAodWlTdWJJbmRleCAhPSB1aUxvY2FsTm9kZUlkKSB7CisJCQkvLyByZXNldCBmbGFncyAibm90IHNjYW5uZWQiIGFuZCAiaXNvY2hyb25vdXMiCisJCQlFUExfTk1UTU5VX0dFVF9OT0RFSU5GTyh1aVN1YkluZGV4KS0+bV93RmxhZ3MgJj0KKwkJCSAgICB+KEVQTF9OTVRNTlVfTk9ERV9GTEFHX0lTT0NIUk9OIHwKKwkJCSAgICAgIEVQTF9OTVRNTlVfTk9ERV9GTEFHX05PVF9TQ0FOTkVEKTsKKworCQkJaWYgKHVpU3ViSW5kZXggPT0gRVBMX0NfQURSX0RJQUdfREVGX05PREVfSUQpIHsJLy8gZGlhZ25vc3RpYyBub2RlIG11c3QgYmUgc2Nhbm5lZCBieSBNTiBpbiBhbnkgY2FzZQorCQkJCWR3Tm9kZUNmZyB8PQorCQkJCSAgICAoRVBMX05PREVBU1NJR05fTk9ERV9JU19DTiB8CisJCQkJICAgICBFUExfTk9ERUFTU0lHTl9OT0RFX0VYSVNUUyk7CisJCQkJLy8gYW5kIGl0IG11c3QgYmUgaXNvY2hyb25vdXNseSBhY2Nlc3NlZAorCQkJCWR3Tm9kZUNmZyAmPSB+RVBMX05PREVBU1NJR05fQVNZTkNPTkxZX05PREU7CisJCQl9CisJCQkvLyBzYXZlIG5vZGUgY29uZmlnIGluIGxvY2FsIG5vZGUgaW5mbyBzdHJ1Y3R1cmUKKwkJCUVQTF9OTVRNTlVfR0VUX05PREVJTkZPKHVpU3ViSW5kZXgpLT5tX2R3Tm9kZUNmZyA9CisJCQkgICAgZHdOb2RlQ2ZnOworCQkJRVBMX05NVE1OVV9HRVRfTk9ERUlORk8odWlTdWJJbmRleCktPm1fTm9kZVN0YXRlID0KKwkJCSAgICBrRXBsTm10TW51Tm9kZVN0YXRlVW5rbm93bjsKKworCQkJaWYgKChkd05vZGVDZmcgJiAoRVBMX05PREVBU1NJR05fTk9ERV9JU19DTiB8IEVQTF9OT0RFQVNTSUdOX05PREVfRVhJU1RTKSkgIT0gMCkgewkvLyBub2RlIGlzIGNvbmZpZ3VyZWQgYXMgQ04KKwkJCQkvLyBpZGVudGlmeSB0aGUgbm9kZQorCQkJCVJldCA9CisJCQkJICAgIEVwbElkZW50dVJlcXVlc3RJZGVudFJlc3BvbnNlKHVpU3ViSW5kZXgsCisJCQkJCQkJCSAgRXBsTm10TW51Q2JJZGVudFJlc3BvbnNlKTsKKwkJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQkJCWdvdG8gRXhpdDsKKwkJCQl9CisJCQkJLy8gc2V0IGZsYWcgIm5vdCBzY2FubmVkIgorCQkJCUVQTF9OTVRNTlVfR0VUX05PREVJTkZPKHVpU3ViSW5kZXgpLT5tX3dGbGFncyB8PQorCQkJCSAgICBFUExfTk1UTU5VX05PREVfRkxBR19OT1RfU0NBTk5FRDsKKwkJCQlFcGxObXRNbnVJbnN0YW5jZV9nLm1fdWlTaWduYWxTbGF2ZUNvdW50Kys7CisJCQkJLy8gc2lnbmFsIHNsYXZlIGNvdW50ZXIgc2hhbGwgYmUgZGVjcmVtZW50ZWQgaWYgSWRlbnRSZXF1ZXN0IHdhcyBzZW50IG9uY2UgdG8gYSBDTgorCisJCQkJaWYgKChkd05vZGVDZmcgJiBFUExfTk9ERUFTU0lHTl9NQU5EQVRPUllfQ04pICE9IDApIHsJLy8gbm9kZSBpcyBhIG1hbmRhdG9yeSBDTgorCQkJCQlFcGxObXRNbnVJbnN0YW5jZV9nLgorCQkJCQkgICAgbV91aU1hbmRhdG9yeVNsYXZlQ291bnQrKzsKKwkJCQkJLy8gbWFuZGF0b3J5IHNsYXZlIGNvdW50ZXIgc2hhbGwgYmUgZGVjcmVtZW50ZWQgaWYgbWFuZGF0b3J5IENOIHdhcyBjb25maWd1cmVkIHN1Y2Nlc3NmdWxseQorCQkJCX0KKwkJCX0KKwkJfSBlbHNlIHsJLy8gc3ViaW5kZXggb2YgTU4KKwkJCWlmICgoZHdOb2RlQ2ZnICYgKEVQTF9OT0RFQVNTSUdOX01OX1BSRVMgfCBFUExfTk9ERUFTU0lHTl9OT0RFX0VYSVNUUykpICE9IDApIHsJLy8gTU4gc2hhbGwgc2VuZCBQUmVzCisJCQkJdEVwbERsbE5vZGVJbmZvIERsbE5vZGVJbmZvOworCisJCQkJRVBMX01FTVNFVCgmRGxsTm9kZUluZm8sIDAsCisJCQkJCSAgIHNpemVvZihEbGxOb2RlSW5mbykpOworCQkJCURsbE5vZGVJbmZvLm1fdWlOb2RlSWQgPSB1aUxvY2FsTm9kZUlkOworCisJCQkJUmV0ID0gRXBsRGxsdUNhbEFkZE5vZGUoJkRsbE5vZGVJbmZvKTsKKwkJCX0KKwkJfQorCX0KKworICAgICAgRXhpdDoKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxObXRNbnVTdGFydEJvb3RTdGVwMgorLy8KKy8vIERlc2NyaXB0aW9uOiBzdGFydHMgQm9vdFN0ZXAyLgorLy8gICAgICAgICAgICAgIFRoYXQgbWVhbnMgYWRkIG5vZGVzIHRvIGlzb2Nocm9ub3VzIHBoYXNlIGFuZCBzZW5kCisvLyAgICAgICAgICAgICAgTk1UIEVuYWJsZVJlYWR5VG9PcC4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgKG5vbmUpCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB0RXBsS2VybmVsIEVwbE5tdE1udVN0YXJ0Qm9vdFN0ZXAyKHZvaWQpCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwl1bnNpZ25lZCBpbnQgdWlJbmRleDsKKwl0RXBsTm10TW51Tm9kZUluZm8gKnBOb2RlSW5mbzsKKworCWlmICgoRXBsTm10TW51SW5zdGFuY2VfZy5tX3dGbGFncyAmIEVQTF9OTVRNTlVfRkxBR19IQUxURUQpID09IDApIHsJLy8gYm9vdCBwcm9jZXNzIGlzIG5vdCBoYWx0ZWQKKwkJLy8gYWRkIG5vZGVzIHRvIGlzb2Nocm9ub3VzIHBoYXNlIGFuZCBzZW5kIE5NVCBFbmFibGVSZWFkeVRvT3AKKwkJRXBsTm10TW51SW5zdGFuY2VfZy5tX3VpTWFuZGF0b3J5U2xhdmVDb3VudCA9IDA7CisJCUVwbE5tdE1udUluc3RhbmNlX2cubV91aVNpZ25hbFNsYXZlQ291bnQgPSAwOworCQkvLyByZXNldCBmbGFnIHRoYXQgYXBwbGljYXRpb24gd2FzIGluZm9ybWVkIGFib3V0IHBvc3NpYmxlIHN0YXRlIGNoYW5nZQorCQlFcGxObXRNbnVJbnN0YW5jZV9nLm1fd0ZsYWdzICY9IH5FUExfTk1UTU5VX0ZMQUdfQVBQX0lORk9STUVEOworCisJCXBOb2RlSW5mbyA9IEVwbE5tdE1udUluc3RhbmNlX2cubV9hTm9kZUluZm87CisJCWZvciAodWlJbmRleCA9IDE7CisJCSAgICAgdWlJbmRleCA8PSB0YWJlbnRyaWVzKEVwbE5tdE1udUluc3RhbmNlX2cubV9hTm9kZUluZm8pOworCQkgICAgIHVpSW5kZXgrKywgcE5vZGVJbmZvKyspIHsKKwkJCWlmIChwTm9kZUluZm8tPm1fTm9kZVN0YXRlID09CisJCQkgICAga0VwbE5tdE1udU5vZGVTdGF0ZUNvbmZpZ3VyZWQpIHsKKwkJCQlSZXQgPQorCQkJCSAgICBFcGxObXRNbnVOb2RlQm9vdFN0ZXAyKHVpSW5kZXgsIHBOb2RlSW5mbyk7CisJCQkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJCQlnb3RvIEV4aXQ7CisJCQkJfQorCQkJCS8vIHNldCBmbGFnICJub3Qgc2Nhbm5lZCIKKwkJCQlwTm9kZUluZm8tPm1fd0ZsYWdzIHw9CisJCQkJICAgIEVQTF9OTVRNTlVfTk9ERV9GTEFHX05PVF9TQ0FOTkVEOworCisJCQkJRXBsTm10TW51SW5zdGFuY2VfZy5tX3VpU2lnbmFsU2xhdmVDb3VudCsrOworCQkJCS8vIHNpZ25hbCBzbGF2ZSBjb3VudGVyIHNoYWxsIGJlIGRlY3JlbWVudGVkIGlmIFN0YXR1c1JlcXVlc3Qgd2FzIHNlbnQgb25jZSB0byBhIENOCisKKwkJCQlpZiAoKHBOb2RlSW5mby0+bV9kd05vZGVDZmcgJiBFUExfTk9ERUFTU0lHTl9NQU5EQVRPUllfQ04pICE9IDApIHsJLy8gbm9kZSBpcyBhIG1hbmRhdG9yeSBDTgorCQkJCQlFcGxObXRNbnVJbnN0YW5jZV9nLgorCQkJCQkgICAgbV91aU1hbmRhdG9yeVNsYXZlQ291bnQrKzsKKwkJCQl9CisJCQkJLy8gbWFuZGF0b3J5IHNsYXZlIGNvdW50ZXIgc2hhbGwgYmUgZGVjcmVtZW50ZWQgaWYgbWFuZGF0b3J5IENOIGlzIFJlYWR5VG9PcAorCQkJfQorCQl9CisJfQorCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE5tdE1udU5vZGVCb290U3RlcDIKKy8vCisvLyBEZXNjcmlwdGlvbjogc3RhcnRzIEJvb3RTdGVwMiBmb3IgdGhlIHNwZWNpZmllZCBub2RlLgorLy8gICAgICAgICAgICAgIFRoaXMgbWVhbnMgdGhlIENOIGlzIGFkZGVkIHRvIGlzb2Nocm9ub3VzIHBoYXNlIGlmIG5vdAorLy8gICAgICAgICAgICAgIGFzeW5jLW9ubHkgYW5kIGl0IGdldHMgdGhlIE5NVCBjb21tYW5kIEVuYWJsZVJlYWR5VG9PcC4KKy8vICAgICAgICAgICAgICBUaGUgQ04gbXVzdCBiZSBpbiBub2RlIHN0YXRlIENvbmZpZ3VyZWQsIHdoZW4gaXQgZW50ZXJzCisvLyAgICAgICAgICAgICAgQm9vdFN0ZXAyLiBXaGVuIEJvb3RTdGVwMiBmaW5pc2hlcywgdGhlIENOIGlzIGluIG5vZGUgc3RhdGUKKy8vICAgICAgICAgICAgICBSZWFkeVRvT3AuCisvLyAgICAgICAgICAgICAgSWYgVGltZW91dFJlYWR5VG9PcCBpbiBvYmplY3QgMHgxRjg5LzUgaXMgY29uZmlndXJlZCwKKy8vICAgICAgICAgICAgICBUaW1lckhkbExvbmdlciB3aWxsIGJlIHN0YXJ0ZWQgd2l0aCB0aGlzIHRpbWVvdXQuCisvLworLy8gUGFyYW1ldGVyczogIHVpTm9kZUlkX3AgICAgICAgICAgICAgID0gbm9kZSBJRAorLy8gICAgICAgICAgICAgIHBOb2RlSW5mb19wICAgICAgICAgICAgID0gcG9pbnRlciB0byBpbnRlcm5hbCBub2RlIGluZm8gc3RydWN0dXJlCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB0RXBsS2VybmVsIEVwbE5tdE1udU5vZGVCb290U3RlcDIodW5zaWduZWQgaW50IHVpTm9kZUlkX3AsCisJCQkJCSB0RXBsTm10TW51Tm9kZUluZm8gKiBwTm9kZUluZm9fcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCXRFcGxEbGxOb2RlSW5mbyBEbGxOb2RlSW5mbzsKKwlEV09SRCBkd05vZGVDZmc7CisJdEVwbE9iZFNpemUgT2JkU2l6ZTsKKwl0RXBsVGltZXJBcmcgVGltZXJBcmc7CisKKwlkd05vZGVDZmcgPSBwTm9kZUluZm9fcC0+bV9kd05vZGVDZmc7CisJaWYgKChkd05vZGVDZmcgJiBFUExfTk9ERUFTU0lHTl9BU1lOQ09OTFlfTk9ERSkgPT0gMCkgewkvLyBhZGQgbm9kZSB0byBpc29jaHJvbm91cyBwaGFzZQorCQlEbGxOb2RlSW5mby5tX3VpTm9kZUlkID0gdWlOb2RlSWRfcDsKKwkJT2JkU2l6ZSA9IDQ7CisJCVJldCA9CisJCSAgICBFcGxPYmR1UmVhZEVudHJ5KDB4MUY5MiwgdWlOb2RlSWRfcCwKKwkJCQkgICAgICZEbGxOb2RlSW5mby5tX2R3UHJlc1RpbWVvdXQsICZPYmRTaXplKTsKKwkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJZ290byBFeGl0OworCQl9CisKKwkJT2JkU2l6ZSA9IDI7CisJCVJldCA9CisJCSAgICBFcGxPYmR1UmVhZEVudHJ5KDB4MUY4QiwgdWlOb2RlSWRfcCwKKwkJCQkgICAgICZEbGxOb2RlSW5mby5tX3dQcmVxUGF5bG9hZExpbWl0LAorCQkJCSAgICAgJk9iZFNpemUpOworCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQlnb3RvIEV4aXQ7CisJCX0KKworCQlPYmRTaXplID0gMjsKKwkJUmV0ID0KKwkJICAgIEVwbE9iZHVSZWFkRW50cnkoMHgxRjhELCB1aU5vZGVJZF9wLAorCQkJCSAgICAgJkRsbE5vZGVJbmZvLm1fd1ByZXNQYXlsb2FkTGltaXQsCisJCQkJICAgICAmT2JkU2l6ZSk7CisJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCWdvdG8gRXhpdDsKKwkJfQorCisJCXBOb2RlSW5mb19wLT5tX3dGbGFncyB8PSBFUExfTk1UTU5VX05PREVfRkxBR19JU09DSFJPTjsKKworCQlSZXQgPSBFcGxEbGx1Q2FsQWRkTm9kZSgmRGxsTm9kZUluZm8pOworCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQlnb3RvIEV4aXQ7CisJCX0KKworCX0KKworCUVQTF9OTVRNTlVfREJHX1BPU1RfVFJBQ0VfVkFMVUUoMCwKKwkJCQkJdWlOb2RlSWRfcCwKKwkJCQkJa0VwbE5tdENtZEVuYWJsZVJlYWR5VG9PcGVyYXRlKTsKKworCVJldCA9CisJICAgIEVwbE5tdE1udVNlbmRObXRDb21tYW5kKHVpTm9kZUlkX3AsIGtFcGxObXRDbWRFbmFibGVSZWFkeVRvT3BlcmF0ZSk7CisJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQlnb3RvIEV4aXQ7CisJfQorCisJaWYgKEVwbE5tdE1udUluc3RhbmNlX2cubV91bFRpbWVvdXRSZWFkeVRvT3AgIT0gMEwpIHsJLy8gc3RhcnQgdGltZXIKKwkJLy8gd2hlbiB0aGUgdGltZXIgZXhwaXJlcyB0aGUgQ04gbXVzdCBiZSBSZWFkeVRvT3AKKwkJRVBMX05NVE1OVV9TRVRfRkxBR1NfVElNRVJBUkdfTE9OR0VSKHBOb2RlSW5mb19wLCB1aU5vZGVJZF9wLAorCQkJCQkJICAgICBUaW1lckFyZyk7CisvLyAgICAgICAgVGltZXJBcmcubV9FdmVudFNpbmsgPSBrRXBsRXZlbnRTaW5rTm10TW51OworLy8gICAgICAgIFRpbWVyQXJnLm1fdWxBcmcgPSBFUExfTk1UTU5VX1RJTUVSQVJHX0xPTkdFUiB8IHVpTm9kZUlkX3A7CisJCVJldCA9CisJCSAgICBFcGxUaW1lcnVNb2RpZnlUaW1lck1zKCZwTm9kZUluZm9fcC0+bV9UaW1lckhkbExvbmdlciwKKwkJCQkJICAgRXBsTm10TW51SW5zdGFuY2VfZy4KKwkJCQkJICAgbV91bFRpbWVvdXRSZWFkeVRvT3AsIFRpbWVyQXJnKTsKKwl9CisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsTm10TW51U3RhcnRDaGVja0NvbQorLy8KKy8vIERlc2NyaXB0aW9uOiBzdGFydHMgQ2hlY2tDb21tdW5pY2F0aW9uCisvLworLy8gUGFyYW1ldGVyczogIChub25lKQorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdEVwbEtlcm5lbCBFcGxObXRNbnVTdGFydENoZWNrQ29tKHZvaWQpCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwl1bnNpZ25lZCBpbnQgdWlJbmRleDsKKwl0RXBsTm10TW51Tm9kZUluZm8gKnBOb2RlSW5mbzsKKworCWlmICgoRXBsTm10TW51SW5zdGFuY2VfZy5tX3dGbGFncyAmIEVQTF9OTVRNTlVfRkxBR19IQUxURUQpID09IDApIHsJLy8gYm9vdCBwcm9jZXNzIGlzIG5vdCBoYWx0ZWQKKwkJLy8gd2FpdCBzb21lIHRpbWUgYW5kIGNoZWNrIHRoYXQgbm8gY29tbXVuaWNhdGlvbiBlcnJvciBvY2N1cnMKKwkJRXBsTm10TW51SW5zdGFuY2VfZy5tX3VpTWFuZGF0b3J5U2xhdmVDb3VudCA9IDA7CisJCUVwbE5tdE1udUluc3RhbmNlX2cubV91aVNpZ25hbFNsYXZlQ291bnQgPSAwOworCQkvLyByZXNldCBmbGFnIHRoYXQgYXBwbGljYXRpb24gd2FzIGluZm9ybWVkIGFib3V0IHBvc3NpYmxlIHN0YXRlIGNoYW5nZQorCQlFcGxObXRNbnVJbnN0YW5jZV9nLm1fd0ZsYWdzICY9IH5FUExfTk1UTU5VX0ZMQUdfQVBQX0lORk9STUVEOworCisJCXBOb2RlSW5mbyA9IEVwbE5tdE1udUluc3RhbmNlX2cubV9hTm9kZUluZm87CisJCWZvciAodWlJbmRleCA9IDE7CisJCSAgICAgdWlJbmRleCA8PSB0YWJlbnRyaWVzKEVwbE5tdE1udUluc3RhbmNlX2cubV9hTm9kZUluZm8pOworCQkgICAgIHVpSW5kZXgrKywgcE5vZGVJbmZvKyspIHsKKwkJCWlmIChwTm9kZUluZm8tPm1fTm9kZVN0YXRlID09CisJCQkgICAga0VwbE5tdE1udU5vZGVTdGF0ZVJlYWR5VG9PcCkgeworCQkJCVJldCA9IEVwbE5tdE1udU5vZGVDaGVja0NvbSh1aUluZGV4LCBwTm9kZUluZm8pOworCQkJCWlmIChSZXQgPT0ga0VwbFJlamVjdCkgewkvLyB0aW1lciB3YXMgc3RhcnRlZAorCQkJCQkvLyB3YWl0IHVudGlsIGl0IGV4cGlyZXMKKwkJCQkJaWYgKChwTm9kZUluZm8tPm1fZHdOb2RlQ2ZnICYgRVBMX05PREVBU1NJR05fTUFOREFUT1JZX0NOKSAhPSAwKSB7CS8vIG5vZGUgaXMgYSBtYW5kYXRvcnkgQ04KKwkJCQkJCUVwbE5tdE1udUluc3RhbmNlX2cuCisJCQkJCQkgICAgbV91aU1hbmRhdG9yeVNsYXZlQ291bnQrKzsKKwkJCQkJfQorCQkJCX0gZWxzZSBpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQkJCWdvdG8gRXhpdDsKKwkJCQl9CisJCQkJLy8gc2V0IGZsYWcgIm5vdCBzY2FubmVkIgorCQkJCXBOb2RlSW5mby0+bV93RmxhZ3MgfD0KKwkJCQkgICAgRVBMX05NVE1OVV9OT0RFX0ZMQUdfTk9UX1NDQU5ORUQ7CisKKwkJCQlFcGxObXRNbnVJbnN0YW5jZV9nLm1fdWlTaWduYWxTbGF2ZUNvdW50Kys7CisJCQkJLy8gc2lnbmFsIHNsYXZlIGNvdW50ZXIgc2hhbGwgYmUgZGVjcmVtZW50ZWQgaWYgdGltZW91dCBlbGFwc2VkIGFuZCByZWdhcmRsZXNzIG9mIGFuIGVycm9yCisJCQkJLy8gbWFuZGF0b3J5IHNsYXZlIGNvdW50ZXIgc2hhbGwgYmUgZGVjcmVtZW50ZWQgaWYgdGltZW91dCBlbGFwc2VkIGFuZCBubyBlcnJvciBvY2N1cmVkCisJCQl9CisJCX0KKwl9CisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworICAgICAgRXhpdDoKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxObXRNbnVOb2RlQ2hlY2tDb20KKy8vCisvLyBEZXNjcmlwdGlvbjogY2hlY2tzIGNvbW11bmljYXRpb24gb2YgdGhlIHNwZWNpZmllZCBub2RlLgorLy8gICAgICAgICAgICAgIFRoYXQgbWVhbnMgd2FpdCBzb21lIHRpbWUgYW5kIGlmIG5vIGVycm9yIG9jY3VyZWQgZXZlcnl0aGluZworLy8gICAgICAgICAgICAgIGlzIE9LLgorLy8KKy8vIFBhcmFtZXRlcnM6ICB1aU5vZGVJZF9wICAgICAgICAgICAgICA9IG5vZGUgSUQKKy8vICAgICAgICAgICAgICBwTm9kZUluZm9fcCAgICAgICAgICAgICA9IHBvaW50ZXIgdG8gaW50ZXJuYWwgbm9kZSBpbmZvIHN0cnVjdHVyZQorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdEVwbEtlcm5lbCBFcGxObXRNbnVOb2RlQ2hlY2tDb20odW5zaWduZWQgaW50IHVpTm9kZUlkX3AsCisJCQkJCXRFcGxObXRNbnVOb2RlSW5mbyAqIHBOb2RlSW5mb19wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJRFdPUkQgZHdOb2RlQ2ZnOworCXRFcGxUaW1lckFyZyBUaW1lckFyZzsKKworCWR3Tm9kZUNmZyA9IHBOb2RlSW5mb19wLT5tX2R3Tm9kZUNmZzsKKwlpZiAoKChkd05vZGVDZmcgJiBFUExfTk9ERUFTU0lHTl9BU1lOQ09OTFlfTk9ERSkgPT0gMCkKKwkgICAgJiYgKEVwbE5tdE1udUluc3RhbmNlX2cubV91bFRpbWVvdXRDaGVja0NvbSAhPSAwTCkpIHsJLy8gQ04gaXMgbm90IGFzeW5jLW9ubHkgYW5kIHRpbWVvdXQgZm9yIENoZWNrQ29tIHdhcyBzZXQKKworCQkvLyBjaGVjayBjb21tdW5pY2F0aW9uLAorCQkvLyB0aGF0IG1lYW5zIHdhaXQgc29tZSB0aW1lIGFuZCBpZiBubyBlcnJvciBvY2N1cmVkIGV2ZXJ5dGhpbmcgaXMgT0s7CisKKwkJLy8gc3RhcnQgdGltZXIgKHdoZW4gdGhlIHRpbWVyIGV4cGlyZXMgdGhlIENOIG11c3QgYmUgc3RpbGwgUmVhZHlUb09wKQorCQlFUExfTk1UTU5VX1NFVF9GTEFHU19USU1FUkFSR19MT05HRVIocE5vZGVJbmZvX3AsIHVpTm9kZUlkX3AsCisJCQkJCQkgICAgIFRpbWVyQXJnKTsKKy8vICAgICAgICBUaW1lckFyZy5tX0V2ZW50U2luayA9IGtFcGxFdmVudFNpbmtObXRNbnU7CisvLyAgICAgICAgVGltZXJBcmcubV91bEFyZyA9IEVQTF9OTVRNTlVfVElNRVJBUkdfTE9OR0VSIHwgdWlOb2RlSWRfcDsKKwkJUmV0ID0KKwkJICAgIEVwbFRpbWVydU1vZGlmeVRpbWVyTXMoJnBOb2RlSW5mb19wLT5tX1RpbWVySGRsTG9uZ2VyLAorCQkJCQkgICBFcGxObXRNbnVJbnN0YW5jZV9nLgorCQkJCQkgICBtX3VsVGltZW91dENoZWNrQ29tLCBUaW1lckFyZyk7CisKKwkJLy8gdXBkYXRlIG1hbmRhdG9yeSBzbGF2ZSBjb3VudGVyLCBiZWNhdXNlIHRpbWVyIHdhcyBzdGFydGVkCisJCWlmIChSZXQgPT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCVJldCA9IGtFcGxSZWplY3Q7CisJCX0KKwl9IGVsc2UgewkJLy8gdGltZXIgd2FzIG5vdCBzdGFydGVkCisJCS8vIGFzc3VtZSBldmVyeXRoaW5nIGlzIE9LCisJCXBOb2RlSW5mb19wLT5tX05vZGVTdGF0ZSA9IGtFcGxObXRNbnVOb2RlU3RhdGVDb21DaGVja2VkOworCX0KKworLy9FeGl0OgorCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE5tdE1udVN0YXJ0Tm9kZXMKKy8vCisvLyBEZXNjcmlwdGlvbjogcmVhbGx5IHN0YXJ0cyBhbGwgbm9kZXMgd2hpY2ggYXJlIFJlYWR5VG9PcCBhbmQgQ2hlY2tDb20gZGlkIG5vdCBmYWlsCisvLworLy8gUGFyYW1ldGVyczogIChub25lKQorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdEVwbEtlcm5lbCBFcGxObXRNbnVTdGFydE5vZGVzKHZvaWQpCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwl1bnNpZ25lZCBpbnQgdWlJbmRleDsKKwl0RXBsTm10TW51Tm9kZUluZm8gKnBOb2RlSW5mbzsKKworCWlmICgoRXBsTm10TW51SW5zdGFuY2VfZy5tX3dGbGFncyAmIEVQTF9OTVRNTlVfRkxBR19IQUxURUQpID09IDApIHsJLy8gYm9vdCBwcm9jZXNzIGlzIG5vdCBoYWx0ZWQKKwkJLy8gc2VuZCBOTVQgY29tbWFuZCBTdGFydCBOb2RlCisJCUVwbE5tdE1udUluc3RhbmNlX2cubV91aU1hbmRhdG9yeVNsYXZlQ291bnQgPSAwOworCQlFcGxObXRNbnVJbnN0YW5jZV9nLm1fdWlTaWduYWxTbGF2ZUNvdW50ID0gMDsKKwkJLy8gcmVzZXQgZmxhZyB0aGF0IGFwcGxpY2F0aW9uIHdhcyBpbmZvcm1lZCBhYm91dCBwb3NzaWJsZSBzdGF0ZSBjaGFuZ2UKKwkJRXBsTm10TW51SW5zdGFuY2VfZy5tX3dGbGFncyAmPSB+RVBMX05NVE1OVV9GTEFHX0FQUF9JTkZPUk1FRDsKKworCQlwTm9kZUluZm8gPSBFcGxObXRNbnVJbnN0YW5jZV9nLm1fYU5vZGVJbmZvOworCQlmb3IgKHVpSW5kZXggPSAxOworCQkgICAgIHVpSW5kZXggPD0gdGFiZW50cmllcyhFcGxObXRNbnVJbnN0YW5jZV9nLm1fYU5vZGVJbmZvKTsKKwkJICAgICB1aUluZGV4KyssIHBOb2RlSW5mbysrKSB7CisJCQlpZiAocE5vZGVJbmZvLT5tX05vZGVTdGF0ZSA9PQorCQkJICAgIGtFcGxObXRNbnVOb2RlU3RhdGVDb21DaGVja2VkKSB7CisJCQkJaWYgKChFcGxObXRNbnVJbnN0YW5jZV9nLgorCQkJCSAgICAgbV9kd05tdFN0YXJ0dXAgJiBFUExfTk1UU1RfU1RBUlRBTExOT0RFUykKKwkJCQkgICAgPT0gMCkgeworCQkJCQlFUExfTk1UTU5VX0RCR19QT1NUX1RSQUNFX1ZBTFVFKDAsCisJCQkJCQkJCQl1aUluZGV4LAorCQkJCQkJCQkJa0VwbE5tdENtZFN0YXJ0Tm9kZSk7CisKKwkJCQkJUmV0ID0KKwkJCQkJICAgIEVwbE5tdE1udVNlbmRObXRDb21tYW5kKHVpSW5kZXgsCisJCQkJCQkJCSAgICBrRXBsTm10Q21kU3RhcnROb2RlKTsKKwkJCQkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJCQkJZ290byBFeGl0OworCQkJCQl9CisJCQkJfQorCisJCQkJaWYgKChwTm9kZUluZm8tPm1fZHdOb2RlQ2ZnICYgRVBMX05PREVBU1NJR05fTUFOREFUT1JZX0NOKSAhPSAwKSB7CS8vIG5vZGUgaXMgYSBtYW5kYXRvcnkgQ04KKwkJCQkJRXBsTm10TW51SW5zdGFuY2VfZy4KKwkJCQkJICAgIG1fdWlNYW5kYXRvcnlTbGF2ZUNvdW50Kys7CisJCQkJfQorCQkJCS8vIHNldCBmbGFnICJub3Qgc2Nhbm5lZCIKKwkJCQlwTm9kZUluZm8tPm1fd0ZsYWdzIHw9CisJCQkJICAgIEVQTF9OTVRNTlVfTk9ERV9GTEFHX05PVF9TQ0FOTkVEOworCisJCQkJRXBsTm10TW51SW5zdGFuY2VfZy5tX3VpU2lnbmFsU2xhdmVDb3VudCsrOworCQkJCS8vIHNpZ25hbCBzbGF2ZSBjb3VudGVyIHNoYWxsIGJlIGRlY3JlbWVudGVkIGlmIFN0YXR1c1JlcXVlc3Qgd2FzIHNlbnQgb25jZSB0byBhIENOCisJCQkJLy8gbWFuZGF0b3J5IHNsYXZlIGNvdW50ZXIgc2hhbGwgYmUgZGVjcmVtZW50ZWQgaWYgbWFuZGF0b3J5IENOIGlzIE9QRVJBVElPTkFMCisJCQl9CisJCX0KKworCQkvLyAkJCQgaW5mb3JtIGFwcGxpY2F0aW9uIGlmIEVQTF9OTVRTVF9OT19TVEFSVE5PREUgaXMgc2V0CisKKwkJaWYgKChFcGxObXRNbnVJbnN0YW5jZV9nLgorCQkgICAgIG1fZHdObXRTdGFydHVwICYgRVBMX05NVFNUX1NUQVJUQUxMTk9ERVMpICE9IDApIHsKKwkJCUVQTF9OTVRNTlVfREJHX1BPU1RfVFJBQ0VfVkFMVUUoMCwgRVBMX0NfQURSX0JST0FEQ0FTVCwKKwkJCQkJCQlrRXBsTm10Q21kU3RhcnROb2RlKTsKKworCQkJUmV0ID0KKwkJCSAgICBFcGxObXRNbnVTZW5kTm10Q29tbWFuZChFUExfQ19BRFJfQlJPQURDQVNULAorCQkJCQkJICAgIGtFcGxObXRDbWRTdGFydE5vZGUpOworCQkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJCWdvdG8gRXhpdDsKKwkJCX0KKwkJfQorCX0KKworICAgICAgRXhpdDoKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxObXRNbnVQcm9jZXNzSW50ZXJuYWxFdmVudAorLy8KKy8vIERlc2NyaXB0aW9uOiBwcm9jZXNzZXMgaW50ZXJuYWwgbm9kZSBldmVudHMKKy8vCisvLyBQYXJhbWV0ZXJzOiAgdWlOb2RlSWRfcCAgICAgICAgICAgICAgPSBub2RlIElECisvLyAgICAgICAgICAgICAgTm9kZU5tdFN0YXRlX3AgICAgICAgICAgPSBOTVQgc3RhdGUgb2YgQ04KKy8vICAgICAgICAgICAgICBOb2RlRXZlbnRfcCAgICAgICAgICAgICA9IG9jY3VyZWQgZXZlbnRzCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdEVwbEtlcm5lbCBFcGxObXRNbnVQcm9jZXNzSW50ZXJuYWxFdmVudCh1bnNpZ25lZCBpbnQgdWlOb2RlSWRfcCwKKwkJCQkJCXRFcGxObXRTdGF0ZSBOb2RlTm10U3RhdGVfcCwKKwkJCQkJCVdPUkQgd0Vycm9yQ29kZV9wLAorCQkJCQkJdEVwbE5tdE1udUludE5vZGVFdmVudAorCQkJCQkJTm9kZUV2ZW50X3ApCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwl0RXBsTm10U3RhdGUgTm10U3RhdGU7CisJdEVwbE5tdE1udU5vZGVJbmZvICpwTm9kZUluZm87CisJdEVwbFRpbWVyQXJnIFRpbWVyQXJnOworCisJcE5vZGVJbmZvID0gRVBMX05NVE1OVV9HRVRfTk9ERUlORk8odWlOb2RlSWRfcCk7CisJTm10U3RhdGUgPSBFcGxObXR1R2V0Tm10U3RhdGUoKTsKKwlpZiAoTm10U3RhdGUgPD0ga0VwbE5tdE1zTm90QWN0aXZlKSB7CS8vIE1OIGlzIG5vdCBhY3RpdmUKKwkJZ290byBFeGl0OworCX0KKworCXN3aXRjaCAoTm9kZUV2ZW50X3ApIHsKKwljYXNlIGtFcGxObXRNbnVJbnROb2RlRXZlbnRJZGVudFJlc3BvbnNlOgorCQl7CisJCQlCWVRFIGJObXRTdGF0ZTsKKworCQkJRVBMX05NVE1OVV9EQkdfUE9TVF9UUkFDRV9WQUxVRShOb2RlRXZlbnRfcCwKKwkJCQkJCQl1aU5vZGVJZF9wLAorCQkJCQkJCXBOb2RlSW5mby0+bV9Ob2RlU3RhdGUpOworCisJCQlpZiAocE5vZGVJbmZvLT5tX05vZGVTdGF0ZSAhPQorCQkJICAgIGtFcGxObXRNbnVOb2RlU3RhdGVSZXNldENvbmYpIHsKKwkJCQlwTm9kZUluZm8tPm1fTm9kZVN0YXRlID0KKwkJCQkgICAga0VwbE5tdE1udU5vZGVTdGF0ZUlkZW50aWZpZWQ7CisJCQl9CisJCQkvLyByZXNldCBmbGFncyBJU09DSFJPTiBhbmQgTk1UX0NNRF9JU1NVRUQKKwkJCXBOb2RlSW5mby0+bV93RmxhZ3MgJj0gfihFUExfTk1UTU5VX05PREVfRkxBR19JU09DSFJPTgorCQkJCQkJIHwKKwkJCQkJCSBFUExfTk1UTU5VX05PREVfRkxBR19OTVRfQ01EX0lTU1VFRCk7CisKKwkJCWlmICgoTm10U3RhdGUgPT0ga0VwbE5tdE1zUHJlT3BlcmF0aW9uYWwxKQorCQkJICAgICYmCisJCQkgICAgKChwTm9kZUluZm8tPgorCQkJICAgICAgbV93RmxhZ3MgJiBFUExfTk1UTU5VX05PREVfRkxBR19OT1RfU0NBTk5FRCkgIT0KKwkJCSAgICAgMCkpIHsKKwkJCQkvLyBkZWNyZW1lbnQgb25seSBzaWduYWwgc2xhdmUgY291bnQKKwkJCQlFcGxObXRNbnVJbnN0YW5jZV9nLm1fdWlTaWduYWxTbGF2ZUNvdW50LS07CisJCQkJcE5vZGVJbmZvLT5tX3dGbGFncyAmPQorCQkJCSAgICB+RVBMX05NVE1OVV9OT0RFX0ZMQUdfTk9UX1NDQU5ORUQ7CisJCQl9CisJCQkvLyB1cGRhdGUgb2JqZWN0IDB4MUY4RiBOTVRfTU5Ob2RlRXhwU3RhdGVfQVU4IHRvIFByZU9wMSAoZXZlbiBpZiBsb2NhbCBzdGF0ZSA+PSBQcmVPcDIpCisJCQliTm10U3RhdGUgPSAoQllURSkgKGtFcGxObXRDc1ByZU9wZXJhdGlvbmFsMSAmIDB4RkYpOworCQkJUmV0ID0KKwkJCSAgICBFcGxPYmR1V3JpdGVFbnRyeSgweDFGOEYsIHVpTm9kZUlkX3AsICZiTm10U3RhdGUsCisJCQkJCSAgICAgIDEpOworCisJCQkvLyBjaGVjayBOTVQgc3RhdGUgb2YgQ04KKwkJCVJldCA9CisJCQkgICAgRXBsTm10TW51Q2hlY2tObXRTdGF0ZSh1aU5vZGVJZF9wLCBwTm9kZUluZm8sCisJCQkJCQkgICBOb2RlTm10U3RhdGVfcCwgd0Vycm9yQ29kZV9wLAorCQkJCQkJICAgTm10U3RhdGUpOworCQkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJCWlmIChSZXQgPT0ga0VwbFJlamVjdCkgeworCQkJCQlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9CisJCQkvLyByZXF1ZXN0IFN0YXR1c1Jlc3BvbnNlIGltbWVkaWF0ZWx5LAorCQkJLy8gYmVjYXVzZSB3ZSB3YW50IGEgZmFzdCBib290LXVwIG9mIENOcworCQkJUmV0ID0KKwkJCSAgICBFcGxTdGF0dXN1UmVxdWVzdFN0YXR1c1Jlc3BvbnNlKHVpTm9kZUlkX3AsCisJCQkJCQkJICAgIEVwbE5tdE1udUNiU3RhdHVzUmVzcG9uc2UpOworCQkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJCUVQTF9OTVRNTlVfREJHX1BPU1RfVFJBQ0VfVkFMVUUoTm9kZUV2ZW50X3AsCisJCQkJCQkJCXVpTm9kZUlkX3AsCisJCQkJCQkJCVJldCk7CisKKwkJCQlpZiAoUmV0ID09IGtFcGxJbnZhbGlkT3BlcmF0aW9uKSB7CS8vIHRoZSBvbmx5IHNpdHVhdGlvbiB3aGVuIHRoaXMgc2hvdWxkIGhhcHBlbiBpcywgd2hlbgorCQkJCQkvLyBTdGF0dXNSZXNwb25zZSB3YXMgYWxyZWFkeSByZXF1ZXN0ZWQgZnJvbSB3aXRoaW4KKwkJCQkJLy8gdGhlIFN0YXRSZXEgdGltZXIgZXZlbnQuCisJCQkJCS8vIHNvIGlnbm9yZSB0aGlzIGVycm9yLgorCQkJCQlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwkJCQl9IGVsc2UgeworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisKKwkJCWlmIChwTm9kZUluZm8tPm1fTm9kZVN0YXRlICE9CisJCQkgICAga0VwbE5tdE1udU5vZGVTdGF0ZVJlc2V0Q29uZikgeworCQkJCS8vIGluZm9ybSBhcHBsaWNhdGlvbgorCQkJCVJldCA9CisJCQkJICAgIEVwbE5tdE1udUluc3RhbmNlX2cuCisJCQkJICAgIG1fcGZuQ2JOb2RlRXZlbnQodWlOb2RlSWRfcCwKKwkJCQkJCSAgICAga0VwbE5tdE5vZGVFdmVudEZvdW5kLAorCQkJCQkJICAgICBOb2RlTm10U3RhdGVfcCwKKwkJCQkJCSAgICAgRVBMX0VfTk9fRVJST1IsCisJCQkJCQkgICAgIChwTm9kZUluZm8tPgorCQkJCQkJICAgICAgbV9kd05vZGVDZmcgJgorCQkJCQkJICAgICAgRVBMX05PREVBU1NJR05fTUFOREFUT1JZX0NOKQorCQkJCQkJICAgICAhPSAwKTsKKwkJCQlpZiAoUmV0ID09IGtFcGxSZWplY3QpIHsJLy8gaW50ZXJydXB0IGJvb3QgcHJvY2VzcyBvbiB1c2VyIHJlcXVlc3QKKwkJCQkJRVBMX05NVE1OVV9EQkdfUE9TVF9UUkFDRV9WQUxVRQorCQkJCQkgICAgKE5vZGVFdmVudF9wLCB1aU5vZGVJZF9wLAorCQkJCQkgICAgICgocE5vZGVJbmZvLT5tX05vZGVTdGF0ZSA8PCA4KQorCQkJCQkgICAgICB8IFJldCkpOworCisJCQkJCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCQkJCQlicmVhazsKKwkJCQl9IGVsc2UgaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJCQlFUExfTk1UTU5VX0RCR19QT1NUX1RSQUNFX1ZBTFVFCisJCQkJCSAgICAoTm9kZUV2ZW50X3AsIHVpTm9kZUlkX3AsCisJCQkJCSAgICAgKChwTm9kZUluZm8tPm1fTm9kZVN0YXRlIDw8IDgpCisJCQkJCSAgICAgIHwgUmV0KSk7CisKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJLy8gY29udGludWUgQm9vdFN0ZXAxCisJCX0KKworCWNhc2Uga0VwbE5tdE1udUludE5vZGVFdmVudEJvb3Q6CisJCXsKKworCQkJLy8gJCQkIGNoZWNrIGlkZW50aWZpY2F0aW9uICh2ZW5kb3IgSUQsIHByb2R1Y3QgY29kZSwgcmV2aXNpb24gbm8sIHNlcmlhbCBubykKKworCQkJaWYgKHBOb2RlSW5mby0+bV9Ob2RlU3RhdGUgPT0KKwkJCSAgICBrRXBsTm10TW51Tm9kZVN0YXRlSWRlbnRpZmllZCkgeworCQkJCS8vICQkJCBjaGVjayBzb2Z0d2FyZQorCisJCQkJLy8gY2hlY2svc3RhcnQgY29uZmlndXJhdGlvbgorCQkJCS8vIGluZm9ybSBhcHBsaWNhdGlvbgorCQkJCVJldCA9CisJCQkJICAgIEVwbE5tdE1udUluc3RhbmNlX2cuCisJCQkJICAgIG1fcGZuQ2JOb2RlRXZlbnQodWlOb2RlSWRfcCwKKwkJCQkJCSAgICAga0VwbE5tdE5vZGVFdmVudENoZWNrQ29uZiwKKwkJCQkJCSAgICAgTm9kZU5tdFN0YXRlX3AsCisJCQkJCQkgICAgIEVQTF9FX05PX0VSUk9SLAorCQkJCQkJICAgICAocE5vZGVJbmZvLT4KKwkJCQkJCSAgICAgIG1fZHdOb2RlQ2ZnICYKKwkJCQkJCSAgICAgIEVQTF9OT0RFQVNTSUdOX01BTkRBVE9SWV9DTikKKwkJCQkJCSAgICAgIT0gMCk7CisJCQkJaWYgKFJldCA9PSBrRXBsUmVqZWN0KSB7CS8vIGludGVycnVwdCBib290IHByb2Nlc3Mgb24gdXNlciByZXF1ZXN0CisJCQkJCUVQTF9OTVRNTlVfREJHX1BPU1RfVFJBQ0VfVkFMVUUKKwkJCQkJICAgIChrRXBsTm10TW51SW50Tm9kZUV2ZW50Qm9vdCwKKwkJCQkJICAgICB1aU5vZGVJZF9wLAorCQkJCQkgICAgICgocE5vZGVJbmZvLT5tX05vZGVTdGF0ZSA8PCA4KQorCQkJCQkgICAgICB8IFJldCkpOworCisJCQkJCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCQkJCQlicmVhazsKKwkJCQl9IGVsc2UgaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJCQlFUExfTk1UTU5VX0RCR19QT1NUX1RSQUNFX1ZBTFVFCisJCQkJCSAgICAoa0VwbE5tdE1udUludE5vZGVFdmVudEJvb3QsCisJCQkJCSAgICAgdWlOb2RlSWRfcCwKKwkJCQkJICAgICAoKHBOb2RlSW5mby0+bV9Ob2RlU3RhdGUgPDwgOCkKKwkJCQkJICAgICAgfCBSZXQpKTsKKworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9IGVsc2UgaWYgKHBOb2RlSW5mby0+bV9Ob2RlU3RhdGUgIT0ga0VwbE5tdE1udU5vZGVTdGF0ZVJlc2V0Q29uZikgewkvLyB3cm9uZyBDTiBzdGF0ZQorCQkJCS8vIGlnbm9yZSBldmVudAorCQkJCWJyZWFrOworCQkJfQorCQkJLy8gJCQkIGQuay46IGN1cnJlbnRseSB3ZSBhc3N1bWUgY29uZmlndXJhdGlvbiBpcyBPSworCisJCQkvLyBjb250aW51ZSBCb290U3RlcDEKKwkJfQorCisJY2FzZSBrRXBsTm10TW51SW50Tm9kZUV2ZW50Q29uZmlndXJlZDoKKwkJeworCQkJaWYgKChwTm9kZUluZm8tPm1fTm9kZVN0YXRlICE9CisJCQkgICAgIGtFcGxObXRNbnVOb2RlU3RhdGVJZGVudGlmaWVkKQorCQkJICAgICYmIChwTm9kZUluZm8tPm1fTm9kZVN0YXRlICE9IGtFcGxObXRNbnVOb2RlU3RhdGVSZXNldENvbmYpKSB7CS8vIHdyb25nIENOIHN0YXRlCisJCQkJLy8gaWdub3JlIGV2ZW50CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCXBOb2RlSW5mby0+bV9Ob2RlU3RhdGUgPSBrRXBsTm10TW51Tm9kZVN0YXRlQ29uZmlndXJlZDsKKworCQkJaWYgKE5tdFN0YXRlID09IGtFcGxObXRNc1ByZU9wZXJhdGlvbmFsMSkgeworCQkJCWlmICgocE5vZGVJbmZvLT5tX2R3Tm9kZUNmZyAmIEVQTF9OT0RFQVNTSUdOX01BTkRBVE9SWV9DTikgIT0gMCkgewkvLyBkZWNyZW1lbnQgbWFuZGF0b3J5IENOIGNvdW50ZXIKKwkJCQkJRXBsTm10TW51SW5zdGFuY2VfZy4KKwkJCQkJICAgIG1fdWlNYW5kYXRvcnlTbGF2ZUNvdW50LS07CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQkvLyBwdXQgb3B0aW9uYWwgbm9kZSB0byBuZXh0IHN0ZXAgKEJvb3RTdGVwMikKKwkJCQlSZXQgPQorCQkJCSAgICBFcGxObXRNbnVOb2RlQm9vdFN0ZXAyKHVpTm9kZUlkX3AsCisJCQkJCQkJICAgcE5vZGVJbmZvKTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisKKwljYXNlIGtFcGxObXRNbnVJbnROb2RlRXZlbnROb0lkZW50UmVzcG9uc2U6CisJCXsKKwkJCWlmICgoTm10U3RhdGUgPT0ga0VwbE5tdE1zUHJlT3BlcmF0aW9uYWwxKQorCQkJICAgICYmCisJCQkgICAgKChwTm9kZUluZm8tPgorCQkJICAgICAgbV93RmxhZ3MgJiBFUExfTk1UTU5VX05PREVfRkxBR19OT1RfU0NBTk5FRCkgIT0KKwkJCSAgICAgMCkpIHsKKwkJCQkvLyBkZWNyZW1lbnQgb25seSBzaWduYWwgc2xhdmUgY291bnQKKwkJCQlFcGxObXRNbnVJbnN0YW5jZV9nLm1fdWlTaWduYWxTbGF2ZUNvdW50LS07CisJCQkJcE5vZGVJbmZvLT5tX3dGbGFncyAmPQorCQkJCSAgICB+RVBMX05NVE1OVV9OT0RFX0ZMQUdfTk9UX1NDQU5ORUQ7CisJCQl9CisKKwkJCWlmIChwTm9kZUluZm8tPm1fTm9kZVN0YXRlICE9CisJCQkgICAga0VwbE5tdE1udU5vZGVTdGF0ZVJlc2V0Q29uZikgeworCQkJCXBOb2RlSW5mby0+bV9Ob2RlU3RhdGUgPQorCQkJCSAgICBrRXBsTm10TW51Tm9kZVN0YXRlVW5rbm93bjsKKwkJCX0KKwkJCS8vICQkJCBkLmsuIGNoZWNrIHN0YXJ0IHRpbWUgZm9yIDB4MUY4OS8yIE1OVGltZW91dFByZU9wMV9VMzIKKwkJCS8vICQkJCBkLmsuIGNoZWNrIGluZGl2aWR1YWwgdGltZW91dCAweDFGODkvNiBNTklkZW50aWZpY2F0aW9uVGltZW91dF9VMzIKKwkJCS8vIGlmIG1hbmRhdG9yeSBub2RlIGFuZCB0aW1lb3V0IGVsYXBzZWQgLT4gaGFsdCBib290IHByb2NlZHVyZQorCQkJLy8gdHJpZ2dlciBJZGVudFJlcXVlc3QgYWdhaW4gKGlmID49IFByZU9wMiwgYWZ0ZXIgZGVsYXkpCisJCQlpZiAoTm10U3RhdGUgPj0ga0VwbE5tdE1zUHJlT3BlcmF0aW9uYWwyKSB7CS8vIHN0YXJ0IHRpbWVyCisJCQkJRVBMX05NVE1OVV9TRVRfRkxBR1NfVElNRVJBUkdfSURFTlRSRVEKKwkJCQkgICAgKHBOb2RlSW5mbywgdWlOb2RlSWRfcCwgVGltZXJBcmcpOworLy8gICAgICAgICAgICAgICAgVGltZXJBcmcubV9FdmVudFNpbmsgPSBrRXBsRXZlbnRTaW5rTm10TW51OworLy8gICAgICAgICAgICAgICAgVGltZXJBcmcubV91bEFyZyA9IEVQTF9OTVRNTlVfVElNRVJBUkdfSURFTlRSRVEgfCB1aU5vZGVJZF9wOworLyoKKyAgICAgICAgICAgICAgICBFUExfTk1UTU5VX0RCR19QT1NUX1RSQUNFX1ZBTFVFKGtFcGxObXRNbnVJbnROb2RlRXZlbnROb0lkZW50UmVzcG9uc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aU5vZGVJZF9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChwTm9kZUluZm8tPm1fTm9kZVN0YXRlIDw8IDgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAweDgwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoKHBOb2RlSW5mby0+bV93RmxhZ3MgJiBFUExfTk1UTU5VX05PREVfRkxBR19DT1VOVF9TVEFUUkVRKSA+PiA2KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKChUaW1lckFyZy5tX3VsQXJnICYgRVBMX05NVE1OVV9USU1FUkFSR19DT1VOVF9TUikgPj4gOCkpKTsKKyovCisJCQkJUmV0ID0KKwkJCQkgICAgRXBsVGltZXJ1TW9kaWZ5VGltZXJNcygmcE5vZGVJbmZvLT4KKwkJCQkJCQkgICBtX1RpbWVySGRsU3RhdFJlcSwKKwkJCQkJCQkgICBFcGxObXRNbnVJbnN0YW5jZV9nLgorCQkJCQkJCSAgIG1fdWxTdGF0dXNSZXF1ZXN0RGVsYXksCisJCQkJCQkJICAgVGltZXJBcmcpOworCQkJfSBlbHNlIHsJLy8gdHJpZ2dlciBJZGVudFJlcXVlc3QgaW1tZWRpYXRlbHkKKwkJCQlSZXQgPQorCQkJCSAgICBFcGxJZGVudHVSZXF1ZXN0SWRlbnRSZXNwb25zZSh1aU5vZGVJZF9wLAorCQkJCQkJCQkgIEVwbE5tdE1udUNiSWRlbnRSZXNwb25zZSk7CisJCQl9CisJCQlicmVhazsKKwkJfQorCisJY2FzZSBrRXBsTm10TW51SW50Tm9kZUV2ZW50U3RhdHVzUmVzcG9uc2U6CisJCXsKKwkJCWlmICgoTm10U3RhdGUgPj0ga0VwbE5tdE1zUHJlT3BlcmF0aW9uYWwyKQorCQkJICAgICYmCisJCQkgICAgKChwTm9kZUluZm8tPgorCQkJICAgICAgbV93RmxhZ3MgJiBFUExfTk1UTU5VX05PREVfRkxBR19OT1RfU0NBTk5FRCkgIT0KKwkJCSAgICAgMCkpIHsKKwkJCQkvLyBkZWNyZW1lbnQgb25seSBzaWduYWwgc2xhdmUgY291bnQgaWYgY2hlY2tlZCBvbmNlIGZvciBSZWFkeVRvT3AsIENoZWNrQ29tLCBPcGVyYXRpb25hbAorCQkJCUVwbE5tdE1udUluc3RhbmNlX2cubV91aVNpZ25hbFNsYXZlQ291bnQtLTsKKwkJCQlwTm9kZUluZm8tPm1fd0ZsYWdzICY9CisJCQkJICAgIH5FUExfTk1UTU5VX05PREVfRkxBR19OT1RfU0NBTk5FRDsKKwkJCX0KKwkJCS8vIGNoZWNrIE5NVCBzdGF0ZSBvZiBDTgorCQkJUmV0ID0KKwkJCSAgICBFcGxObXRNbnVDaGVja05tdFN0YXRlKHVpTm9kZUlkX3AsIHBOb2RlSW5mbywKKwkJCQkJCSAgIE5vZGVObXRTdGF0ZV9wLCB3RXJyb3JDb2RlX3AsCisJCQkJCQkgICBObXRTdGF0ZSk7CisJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQkJaWYgKFJldCA9PSBrRXBsUmVqZWN0KSB7CisJCQkJCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCQkJCX0KKwkJCQlicmVhazsKKwkJCX0KKworCQkJaWYgKE5tdFN0YXRlID09IGtFcGxObXRNc1ByZU9wZXJhdGlvbmFsMSkgeworCQkJCS8vIHJlcXVlc3QgbmV4dCBTdGF0dXNSZXNwb25zZSBpbW1lZGlhdGVseQorCQkJCVJldCA9CisJCQkJICAgIEVwbFN0YXR1c3VSZXF1ZXN0U3RhdHVzUmVzcG9uc2UodWlOb2RlSWRfcCwKKwkJCQkJCQkJICAgIEVwbE5tdE1udUNiU3RhdHVzUmVzcG9uc2UpOworCQkJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCQkJRVBMX05NVE1OVV9EQkdfUE9TVF9UUkFDRV9WQUxVRQorCQkJCQkgICAgKE5vZGVFdmVudF9wLCB1aU5vZGVJZF9wLCBSZXQpOworCQkJCX0KKworCQkJfSBlbHNlIGlmICgocE5vZGVJbmZvLT5tX3dGbGFncyAmIEVQTF9OTVRNTlVfTk9ERV9GTEFHX0lTT0NIUk9OKSA9PSAwKSB7CS8vIHN0YXJ0IHRpbWVyCisJCQkJLy8gbm90IGlzb2Nocm9ub3VzbHkgYWNjZXNzZWQgQ04gKGUuZy4gYXN5bmMtb25seSBvciBzdG9wcGVkIENOKQorCQkJCUVQTF9OTVRNTlVfU0VUX0ZMQUdTX1RJTUVSQVJHX1NUQVRSRVEocE5vZGVJbmZvLAorCQkJCQkJCQkgICAgICB1aU5vZGVJZF9wLAorCQkJCQkJCQkgICAgICBUaW1lckFyZyk7CisvLyAgICAgICAgICAgICAgICBUaW1lckFyZy5tX0V2ZW50U2luayA9IGtFcGxFdmVudFNpbmtObXRNbnU7CisvLyAgICAgICAgICAgICAgICBUaW1lckFyZy5tX3VsQXJnID0gRVBMX05NVE1OVV9USU1FUkFSR19TVEFUUkVRIHwgdWlOb2RlSWRfcDsKKy8qCisgICAgICAgICAgICAgICAgRVBMX05NVE1OVV9EQkdfUE9TVF9UUkFDRV9WQUxVRShrRXBsTm10TW51SW50Tm9kZUV2ZW50U3RhdHVzUmVzcG9uc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aU5vZGVJZF9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChwTm9kZUluZm8tPm1fTm9kZVN0YXRlIDw8IDgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAweDgwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoKHBOb2RlSW5mby0+bV93RmxhZ3MgJiBFUExfTk1UTU5VX05PREVfRkxBR19DT1VOVF9TVEFUUkVRKSA+PiA2KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKChUaW1lckFyZy5tX3VsQXJnICYgRVBMX05NVE1OVV9USU1FUkFSR19DT1VOVF9TUikgPj4gOCkpKTsKKyovCisJCQkJUmV0ID0KKwkJCQkgICAgRXBsVGltZXJ1TW9kaWZ5VGltZXJNcygmcE5vZGVJbmZvLT4KKwkJCQkJCQkgICBtX1RpbWVySGRsU3RhdFJlcSwKKwkJCQkJCQkgICBFcGxObXRNbnVJbnN0YW5jZV9nLgorCQkJCQkJCSAgIG1fdWxTdGF0dXNSZXF1ZXN0RGVsYXksCisJCQkJCQkJICAgVGltZXJBcmcpOworCQkJfQorCisJCQlicmVhazsKKwkJfQorCisJY2FzZSBrRXBsTm10TW51SW50Tm9kZUV2ZW50Tm9TdGF0dXNSZXNwb25zZToKKwkJeworCQkJLy8gZnVuY3Rpb24gQ2hlY2tObXRTdGF0ZSBzZXRzIG5vZGUgc3RhdGUgdG8gdW5rbm93biBpZiBuZWNlc3NhcnkKKy8qCisgICAgICAgICAgICBpZiAoKE5tdFN0YXRlID49IGtFcGxObXRNc1ByZU9wZXJhdGlvbmFsMikKKyAgICAgICAgICAgICAgICAmJiAoKHBOb2RlSW5mby0+bV93RmxhZ3MgJiBFUExfTk1UTU5VX05PREVfRkxBR19OT1RfU0NBTk5FRCkgIT0gMCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gZGVjcmVtZW50IG9ubHkgc2lnbmFsIHNsYXZlIGNvdW50IGlmIGNoZWNrZWQgb25jZSBmb3IgUmVhZHlUb09wLCBDaGVja0NvbSwgT3BlcmF0aW9uYWwKKyAgICAgICAgICAgICAgICBFcGxObXRNbnVJbnN0YW5jZV9nLm1fdWlTaWduYWxTbGF2ZUNvdW50LS07CisgICAgICAgICAgICAgICAgcE5vZGVJbmZvLT5tX3dGbGFncyAmPSB+RVBMX05NVE1OVV9OT0RFX0ZMQUdfTk9UX1NDQU5ORUQ7CisgICAgICAgICAgICB9CisqLworCQkJLy8gY2hlY2sgTk1UIHN0YXRlIG9mIENOCisJCQlSZXQgPQorCQkJICAgIEVwbE5tdE1udUNoZWNrTm10U3RhdGUodWlOb2RlSWRfcCwgcE5vZGVJbmZvLAorCQkJCQkJICAgTm9kZU5tdFN0YXRlX3AsIHdFcnJvckNvZGVfcCwKKwkJCQkJCSAgIE5tdFN0YXRlKTsKKwkJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCQlpZiAoUmV0ID09IGtFcGxSZWplY3QpIHsKKwkJCQkJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJCQkJfQorCQkJCWJyZWFrOworCQkJfQorCisJCQlicmVhazsKKwkJfQorCisJY2FzZSBrRXBsTm10TW51SW50Tm9kZUV2ZW50RXJyb3I6CisJCXsJCS8vIGN1cnJlbnRseSBvbmx5IGlzc3VlZCBvbiBrRXBsTm10Tm9kZUNvbW1hbmRDb25mRXJyCisKKwkJCWlmIChwTm9kZUluZm8tPm1fTm9kZVN0YXRlICE9IGtFcGxObXRNbnVOb2RlU3RhdGVJZGVudGlmaWVkKSB7CS8vIHdyb25nIENOIHN0YXRlCisJCQkJLy8gaWdub3JlIGV2ZW50CisJCQkJYnJlYWs7CisJCQl9CisJCQkvLyBjaGVjayBOTVQgc3RhdGUgb2YgQ04KKwkJCVJldCA9CisJCQkgICAgRXBsTm10TW51Q2hlY2tObXRTdGF0ZSh1aU5vZGVJZF9wLCBwTm9kZUluZm8sCisJCQkJCQkgICBrRXBsTm10Q3NOb3RBY3RpdmUsCisJCQkJCQkgICB3RXJyb3JDb2RlX3AsIE5tdFN0YXRlKTsKKwkJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCQlpZiAoUmV0ID09IGtFcGxSZWplY3QpIHsKKwkJCQkJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJCQkJfQorCQkJCWJyZWFrOworCQkJfQorCisJCQlicmVhazsKKwkJfQorCisJY2FzZSBrRXBsTm10TW51SW50Tm9kZUV2ZW50RXhlY1Jlc2V0OgorCQl7CisJCQlpZiAocE5vZGVJbmZvLT5tX05vZGVTdGF0ZSAhPSBrRXBsTm10TW51Tm9kZVN0YXRlSWRlbnRpZmllZCkgewkvLyB3cm9uZyBDTiBzdGF0ZQorCQkJCS8vIGlnbm9yZSBldmVudAorCQkJCWJyZWFrOworCQkJfQorCisJCQlwTm9kZUluZm8tPm1fTm9kZVN0YXRlID0ga0VwbE5tdE1udU5vZGVTdGF0ZVJlc2V0Q29uZjsKKworCQkJRVBMX05NVE1OVV9EQkdfUE9TVF9UUkFDRV9WQUxVRShOb2RlRXZlbnRfcCwKKwkJCQkJCQl1aU5vZGVJZF9wLAorCQkJCQkJCSgoKE5vZGVObXRTdGF0ZV9wICYKKwkJCQkJCQkgICAweEZGKSA8PCA4KQorCQkJCQkJCSB8CisJCQkJCQkJIGtFcGxObXRDbWRSZXNldENvbmZpZ3VyYXRpb24pKTsKKworCQkJLy8gc2VuZCBOTVQgcmVzZXQgY29uZmlndXJhdGlvbiB0byBDTiBmb3IgYWN0aXZhdGlvbiBvZiBjb25maWd1cmF0aW9uCisJCQlSZXQgPQorCQkJICAgIEVwbE5tdE1udVNlbmRObXRDb21tYW5kKHVpTm9kZUlkX3AsCisJCQkJCQkgICAga0VwbE5tdENtZFJlc2V0Q29uZmlndXJhdGlvbik7CisKKwkJCWJyZWFrOworCQl9CisKKwljYXNlIGtFcGxObXRNbnVJbnROb2RlRXZlbnRIZWFydGJlYXQ6CisJCXsKKy8qCisgICAgICAgICAgICBpZiAoKE5tdFN0YXRlID49IGtFcGxObXRNc1ByZU9wZXJhdGlvbmFsMikKKyAgICAgICAgICAgICAgICAmJiAoKHBOb2RlSW5mby0+bV93RmxhZ3MgJiBFUExfTk1UTU5VX05PREVfRkxBR19OT1RfU0NBTk5FRCkgIT0gMCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gZGVjcmVtZW50IG9ubHkgc2lnbmFsIHNsYXZlIGNvdW50IGlmIGNoZWNrZWQgb25jZSBmb3IgUmVhZHlUb09wLCBDaGVja0NvbSwgT3BlcmF0aW9uYWwKKyAgICAgICAgICAgICAgICBFcGxObXRNbnVJbnN0YW5jZV9nLm1fdWlTaWduYWxTbGF2ZUNvdW50LS07CisgICAgICAgICAgICAgICAgcE5vZGVJbmZvLT5tX3dGbGFncyAmPSB+RVBMX05NVE1OVV9OT0RFX0ZMQUdfTk9UX1NDQU5ORUQ7CisgICAgICAgICAgICB9CisqLworCQkJLy8gY2hlY2sgTk1UIHN0YXRlIG9mIENOCisJCQlSZXQgPQorCQkJICAgIEVwbE5tdE1udUNoZWNrTm10U3RhdGUodWlOb2RlSWRfcCwgcE5vZGVJbmZvLAorCQkJCQkJICAgTm9kZU5tdFN0YXRlX3AsIHdFcnJvckNvZGVfcCwKKwkJCQkJCSAgIE5tdFN0YXRlKTsKKwkJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCQlpZiAoUmV0ID09IGtFcGxSZWplY3QpIHsKKwkJCQkJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJCQkJfQorCQkJCWJyZWFrOworCQkJfQorCisJCQlicmVhazsKKwkJfQorCisJY2FzZSBrRXBsTm10TW51SW50Tm9kZUV2ZW50VGltZXJJZGVudFJlcToKKwkJeworCQkJRVBMX0RCR0xWTF9OTVRNTl9UUkFDRTEKKwkJCSAgICAoIlRpbWVyU3RhdFJlcS0+SWRlbnRSZXEoJTAyWClcbiIsIHVpTm9kZUlkX3ApOworCQkJLy8gdHJpZ2dlciBJZGVudFJlcXVlc3QgYWdhaW4KKwkJCVJldCA9CisJCQkgICAgRXBsSWRlbnR1UmVxdWVzdElkZW50UmVzcG9uc2UodWlOb2RlSWRfcCwKKwkJCQkJCQkgIEVwbE5tdE1udUNiSWRlbnRSZXNwb25zZSk7CisJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQkJRVBMX05NVE1OVV9EQkdfUE9TVF9UUkFDRV9WQUxVRShOb2RlRXZlbnRfcCwKKwkJCQkJCQkJdWlOb2RlSWRfcCwKKwkJCQkJCQkJKCgoTm9kZU5tdFN0YXRlX3AgJiAweEZGKSA8PCA4KQorCQkJCQkJCQkgfCBSZXQpKTsKKwkJCQlpZiAoUmV0ID09IGtFcGxJbnZhbGlkT3BlcmF0aW9uKSB7CS8vIHRoaXMgY2FuIGhhcHBlbiBiZWNhdXNlIG9mIGEgYnVnIGluIEVwbFRpbWVydUxpbnV4S2VybmVsLmMKKwkJCQkJLy8gc28gaWdub3JlIHRoaXMgZXJyb3IuCisJCQkJCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCQkJCX0KKwkJCX0KKworCQkJYnJlYWs7CisJCX0KKworCWNhc2Uga0VwbE5tdE1udUludE5vZGVFdmVudFRpbWVyU3RhdGVNb246CisJCXsKKwkJCS8vIHJlc2V0IE5NVCBzdGF0ZSBjaGFuZ2UgZmxhZworCQkJLy8gYmVjYXVzZSBmcm9tIG5vdyBvbiB0aGUgQ04gbXVzdCBoYXZlIHRoZSBjb3JyZWN0IE5NVCBzdGF0ZQorCQkJcE5vZGVJbmZvLT5tX3dGbGFncyAmPQorCQkJICAgIH5FUExfTk1UTU5VX05PREVfRkxBR19OTVRfQ01EX0lTU1VFRDsKKworCQkJLy8gY29udGludWUgd2l0aCBub3JtYWwgU3RhdFJlcSBwcm9jZXNzaW5nCisJCX0KKworCWNhc2Uga0VwbE5tdE1udUludE5vZGVFdmVudFRpbWVyU3RhdFJlcToKKwkJeworCQkJRVBMX0RCR0xWTF9OTVRNTl9UUkFDRTEoIlRpbWVyU3RhdFJlcS0+U3RhdFJlcSglMDJYKVxuIiwKKwkJCQkJCXVpTm9kZUlkX3ApOworCQkJLy8gcmVxdWVzdCBuZXh0IFN0YXR1c1Jlc3BvbnNlCisJCQlSZXQgPQorCQkJICAgIEVwbFN0YXR1c3VSZXF1ZXN0U3RhdHVzUmVzcG9uc2UodWlOb2RlSWRfcCwKKwkJCQkJCQkgICAgRXBsTm10TW51Q2JTdGF0dXNSZXNwb25zZSk7CisJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQkJRVBMX05NVE1OVV9EQkdfUE9TVF9UUkFDRV9WQUxVRShOb2RlRXZlbnRfcCwKKwkJCQkJCQkJdWlOb2RlSWRfcCwKKwkJCQkJCQkJKCgoTm9kZU5tdFN0YXRlX3AgJiAweEZGKSA8PCA4KQorCQkJCQkJCQkgfCBSZXQpKTsKKwkJCQlpZiAoUmV0ID09IGtFcGxJbnZhbGlkT3BlcmF0aW9uKSB7CS8vIHRoZSBvbmx5IHNpdHVhdGlvbiB3aGVuIHRoaXMgc2hvdWxkIGhhcHBlbiBpcywgd2hlbgorCQkJCQkvLyBTdGF0dXNSZXNwb25zZSB3YXMgYWxyZWFkeSByZXF1ZXN0ZWQgd2hpbGUgcHJvY2Vzc2luZworCQkJCQkvLyBldmVudCBJZGVudFJlc3BvbnNlLgorCQkJCQkvLyBzbyBpZ25vcmUgdGhpcyBlcnJvci4KKwkJCQkJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJCQkJfQorCQkJfQorCisJCQlicmVhazsKKwkJfQorCisJY2FzZSBrRXBsTm10TW51SW50Tm9kZUV2ZW50VGltZXJMb25nZXI6CisJCXsKKwkJCXN3aXRjaCAocE5vZGVJbmZvLT5tX05vZGVTdGF0ZSkgeworCQkJY2FzZSBrRXBsTm10TW51Tm9kZVN0YXRlQ29uZmlndXJlZDoKKwkJCQl7CS8vIG5vZGUgc2hvdWxkIGJlIFJlYWR5VG9PcCBidXQgaXQgaXMgbm90CisKKwkJCQkJLy8gY2hlY2sgTk1UIHN0YXRlIHdoaWNoIHNoYWxsIGJlIGludGVudGlvbmFsbHkgd3JvbmcsIHNvIHRoYXQgRVJST1JfVFJFQVRNRU5UIHdpbGwgYmUgc3RhcnRlZAorCQkJCQlSZXQgPQorCQkJCQkgICAgRXBsTm10TW51Q2hlY2tObXRTdGF0ZSh1aU5vZGVJZF9wLAorCQkJCQkJCQkgICBwTm9kZUluZm8sCisJCQkJCQkJCSAgIGtFcGxObXRDc05vdEFjdGl2ZSwKKwkJCQkJCQkJICAgRVBMX0VfTk1UX0JQTzIsCisJCQkJCQkJCSAgIE5tdFN0YXRlKTsKKwkJCQkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJCQkJaWYgKFJldCA9PSBrRXBsUmVqZWN0KSB7CisJCQkJCQkJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJCQkJCQl9CisJCQkJCQlicmVhazsKKwkJCQkJfQorCisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJY2FzZSBrRXBsTm10TW51Tm9kZVN0YXRlUmVhZHlUb09wOgorCQkJCXsJLy8gQ2hlY2tDb20gZmluaXNoZWQgc3VjY2Vzc2Z1bGx5CisKKwkJCQkJcE5vZGVJbmZvLT5tX05vZGVTdGF0ZSA9CisJCQkJCSAgICBrRXBsTm10TW51Tm9kZVN0YXRlQ29tQ2hlY2tlZDsKKworCQkJCQlpZiAoKHBOb2RlSW5mby0+CisJCQkJCSAgICAgbV93RmxhZ3MgJgorCQkJCQkgICAgIEVQTF9OTVRNTlVfTk9ERV9GTEFHX05PVF9TQ0FOTkVEKQorCQkJCQkgICAgIT0gMCkgeworCQkJCQkJLy8gZGVjcmVtZW50IG9ubHkgc2lnbmFsIHNsYXZlIGNvdW50IGlmIGNoZWNrZWQgb25jZSBmb3IgUmVhZHlUb09wLCBDaGVja0NvbSwgT3BlcmF0aW9uYWwKKwkJCQkJCUVwbE5tdE1udUluc3RhbmNlX2cuCisJCQkJCQkgICAgbV91aVNpZ25hbFNsYXZlQ291bnQtLTsKKwkJCQkJCXBOb2RlSW5mby0+bV93RmxhZ3MgJj0KKwkJCQkJCSAgICB+RVBMX05NVE1OVV9OT0RFX0ZMQUdfTk9UX1NDQU5ORUQ7CisJCQkJCX0KKworCQkJCQlpZiAoKHBOb2RlSW5mby0+CisJCQkJCSAgICAgbV9kd05vZGVDZmcgJgorCQkJCQkgICAgIEVQTF9OT0RFQVNTSUdOX01BTkRBVE9SWV9DTikgIT0KKwkJCQkJICAgIDApIHsKKwkJCQkJCS8vIGRlY3JlbWVudCBtYW5kYXRvcnkgc2xhdmUgY291bnRlcgorCQkJCQkJRXBsTm10TW51SW5zdGFuY2VfZy4KKwkJCQkJCSAgICBtX3VpTWFuZGF0b3J5U2xhdmVDb3VudC0tOworCQkJCQl9CisJCQkJCWlmIChObXRTdGF0ZSAhPSBrRXBsTm10TXNSZWFkeVRvT3BlcmF0ZSkgeworCQkJCQkJRVBMX05NVE1OVV9EQkdfUE9TVF9UUkFDRV9WQUxVRQorCQkJCQkJICAgIChOb2RlRXZlbnRfcCwgdWlOb2RlSWRfcCwKKwkJCQkJCSAgICAgKCgoTm9kZU5tdFN0YXRlX3AgJiAweEZGKQorCQkJCQkJICAgICAgIDw8IDgpCisJCQkJCQkgICAgICB8IGtFcGxObXRDbWRTdGFydE5vZGUpKTsKKworCQkJCQkJLy8gc3RhcnQgb3B0aW9uYWwgQ04KKwkJCQkJCVJldCA9CisJCQkJCQkgICAgRXBsTm10TW51U2VuZE5tdENvbW1hbmQKKwkJCQkJCSAgICAodWlOb2RlSWRfcCwKKwkJCQkJCSAgICAga0VwbE5tdENtZFN0YXJ0Tm9kZSk7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQlkZWZhdWx0OgorCQkJCXsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCX0KKworCWNhc2Uga0VwbE5tdE1udUludE5vZGVFdmVudE5tdENtZFNlbnQ6CisJCXsKKwkJCUJZVEUgYk5tdFN0YXRlOworCisJCQkvLyB1cGRhdGUgZXhwZWN0ZWQgTk1UIHN0YXRlIHdpdGggdGhlIG9uZSB0aGF0IHJlc3VsdHMKKwkJCS8vIGZyb20gdGhlIHNlbnQgTk1UIGNvbW1hbmQKKwkJCWJObXRTdGF0ZSA9IChCWVRFKSAoTm9kZU5tdFN0YXRlX3AgJiAweEZGKTsKKworCQkJLy8gd3JpdGUgb2JqZWN0IDB4MUY4RiBOTVRfTU5Ob2RlRXhwU3RhdGVfQVU4CisJCQlSZXQgPQorCQkJICAgIEVwbE9iZHVXcml0ZUVudHJ5KDB4MUY4RiwgdWlOb2RlSWRfcCwgJmJObXRTdGF0ZSwKKwkJCQkJICAgICAgMSk7CisJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQkJZ290byBFeGl0OworCQkJfQorCisJCQlpZiAoTm9kZU5tdFN0YXRlX3AgPT0ga0VwbE5tdENzTm90QWN0aXZlKSB7CS8vIHJlc3RhcnQgcHJvY2Vzc2luZyB3aXRoIElkZW50UmVxdWVzdAorCQkJCUVQTF9OTVRNTlVfU0VUX0ZMQUdTX1RJTUVSQVJHX0lERU5UUkVRCisJCQkJICAgIChwTm9kZUluZm8sIHVpTm9kZUlkX3AsIFRpbWVyQXJnKTsKKwkJCX0gZWxzZSB7CS8vIG1vbml0b3IgTk1UIHN0YXRlIGNoYW5nZSB3aXRoIFN0YXR1c1JlcXVlc3QgYWZ0ZXIKKwkJCQkvLyB0aGUgY29ycmVzcG9uZGluZyBkZWxheTsKKwkJCQkvLyB1bnRpbCB0aGVuIHdyb25nIE5NVCBzdGF0ZXMgd2lsbCBiZSBpZ25vcmVkCisJCQkJRVBMX05NVE1OVV9TRVRfRkxBR1NfVElNRVJBUkdfU1RBVEVfTU9OCisJCQkJICAgIChwTm9kZUluZm8sIHVpTm9kZUlkX3AsIFRpbWVyQXJnKTsKKworCQkJCS8vIHNldCBOTVQgc3RhdGUgY2hhbmdlIGZsYWcKKwkJCQlwTm9kZUluZm8tPm1fd0ZsYWdzIHw9CisJCQkJICAgIEVQTF9OTVRNTlVfTk9ERV9GTEFHX05NVF9DTURfSVNTVUVEOworCQkJfQorCisJCQlSZXQgPQorCQkJICAgIEVwbFRpbWVydU1vZGlmeVRpbWVyTXMoJnBOb2RlSW5mby0+CisJCQkJCQkgICBtX1RpbWVySGRsU3RhdFJlcSwKKwkJCQkJCSAgIEVwbE5tdE1udUluc3RhbmNlX2cuCisJCQkJCQkgICBtX3VsU3RhdHVzUmVxdWVzdERlbGF5LAorCQkJCQkJICAgVGltZXJBcmcpOworCisJCQkvLyBmaW5pc2ggcHJvY2Vzc2luZywgYmVjYXVzZSBObXRTdGF0ZV9wIGlzIHRoZSBleHBlY3RlZCBhbmQgbm90IHRoZSBjdXJyZW50IHN0YXRlCisJCQlnb3RvIEV4aXQ7CisJCX0KKworCWRlZmF1bHQ6CisJCXsKKwkJCWJyZWFrOworCQl9CisJfQorCisJLy8gY2hlY2sgaWYgbmV0d29yayBpcyByZWFkeSB0byBjaGFuZ2UgbG9jYWwgTk1UIHN0YXRlIGFuZCB0aGlzIHdhcyBub3QgZG9uZSBiZWZvcmUKKwlpZiAoKEVwbE5tdE1udUluc3RhbmNlX2cubV93RmxhZ3MgJiAoRVBMX05NVE1OVV9GTEFHX0hBTFRFRCB8IEVQTF9OTVRNTlVfRkxBR19BUFBfSU5GT1JNRUQpKSA9PSAwKSB7CS8vIGJvb3QgcHJvY2VzcyBpcyBub3QgaGFsdGVkCisJCXN3aXRjaCAoTm10U3RhdGUpIHsKKwkJY2FzZSBrRXBsTm10TXNQcmVPcGVyYXRpb25hbDE6CisJCQl7CisJCQkJaWYgKChFcGxObXRNbnVJbnN0YW5jZV9nLm1fdWlTaWduYWxTbGF2ZUNvdW50ID09CisJCQkJICAgICAwKQorCQkJCSAgICAmJiAoRXBsTm10TW51SW5zdGFuY2VfZy5tX3VpTWFuZGF0b3J5U2xhdmVDb3VudCA9PSAwKSkgewkvLyBhbGwgb3B0aW9uYWwgQ05zIHNjYW5uZWQgb25jZSBhbmQgYWxsIG1hbmRhdG9yeSBDTnMgY29uZmlndXJlZCBzdWNjZXNzZnVsbHkKKwkJCQkJRXBsTm10TW51SW5zdGFuY2VfZy5tX3dGbGFncyB8PQorCQkJCQkgICAgRVBMX05NVE1OVV9GTEFHX0FQUF9JTkZPUk1FRDsKKwkJCQkJLy8gaW5mb3JtIGFwcGxpY2F0aW9uCisJCQkJCVJldCA9CisJCQkJCSAgICBFcGxObXRNbnVJbnN0YW5jZV9nLgorCQkJCQkgICAgbV9wZm5DYkJvb3RFdmVudAorCQkJCQkgICAgKGtFcGxObXRCb290RXZlbnRCb290U3RlcDFGaW5pc2gsCisJCQkJCSAgICAgTm10U3RhdGUsIEVQTF9FX05PX0VSUk9SKTsKKwkJCQkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJCQkJaWYgKFJldCA9PSBrRXBsUmVqZWN0KSB7CisJCQkJCQkJLy8gd2FpdCBmb3IgYXBwbGljYXRpb24KKwkJCQkJCQlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwkJCQkJCX0KKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJCS8vIGVudGVyIFByZU9wMgorCQkJCQlSZXQgPQorCQkJCQkgICAgRXBsTm10dU5tdEV2ZW50CisJCQkJCSAgICAoa0VwbE5tdEV2ZW50QWxsTWFuZGF0b3J5Q05JZGVudCk7CisJCQkJfQorCQkJCWJyZWFrOworCQkJfQorCisJCWNhc2Uga0VwbE5tdE1zUHJlT3BlcmF0aW9uYWwyOgorCQkJeworCQkJCWlmICgoRXBsTm10TW51SW5zdGFuY2VfZy5tX3VpU2lnbmFsU2xhdmVDb3VudCA9PQorCQkJCSAgICAgMCkKKwkJCQkgICAgJiYgKEVwbE5tdE1udUluc3RhbmNlX2cubV91aU1hbmRhdG9yeVNsYXZlQ291bnQgPT0gMCkpIHsJLy8gYWxsIG9wdGlvbmFsIENOcyBjaGVja2VkIG9uY2UgZm9yIFJlYWR5VG9PcCBhbmQgYWxsIG1hbmRhdG9yeSBDTnMgYXJlIFJlYWR5VG9PcAorCQkJCQlFcGxObXRNbnVJbnN0YW5jZV9nLm1fd0ZsYWdzIHw9CisJCQkJCSAgICBFUExfTk1UTU5VX0ZMQUdfQVBQX0lORk9STUVEOworCQkJCQkvLyBpbmZvcm0gYXBwbGljYXRpb24KKwkJCQkJUmV0ID0KKwkJCQkJICAgIEVwbE5tdE1udUluc3RhbmNlX2cuCisJCQkJCSAgICBtX3BmbkNiQm9vdEV2ZW50CisJCQkJCSAgICAoa0VwbE5tdEJvb3RFdmVudEJvb3RTdGVwMkZpbmlzaCwKKwkJCQkJICAgICBObXRTdGF0ZSwgRVBMX0VfTk9fRVJST1IpOworCQkJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQkJCQlpZiAoUmV0ID09IGtFcGxSZWplY3QpIHsKKwkJCQkJCQkvLyB3YWl0IGZvciBhcHBsaWNhdGlvbgorCQkJCQkJCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCQkJCQkJfQorCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJLy8gZW50ZXIgUmVhZHlUb09wCisJCQkJCVJldCA9CisJCQkJCSAgICBFcGxObXR1Tm10RXZlbnQKKwkJCQkJICAgIChrRXBsTm10RXZlbnRFbnRlclJlYWR5VG9PcGVyYXRlKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9CisKKwkJY2FzZSBrRXBsTm10TXNSZWFkeVRvT3BlcmF0ZToKKwkJCXsKKwkJCQlpZiAoKEVwbE5tdE1udUluc3RhbmNlX2cubV91aVNpZ25hbFNsYXZlQ291bnQgPT0KKwkJCQkgICAgIDApCisJCQkJICAgICYmIChFcGxObXRNbnVJbnN0YW5jZV9nLm1fdWlNYW5kYXRvcnlTbGF2ZUNvdW50ID09IDApKSB7CS8vIGFsbCBDTnMgY2hlY2tlZCBmb3IgZXJyb3JsZXNzIGNvbW11bmljYXRpb24KKwkJCQkJRXBsTm10TW51SW5zdGFuY2VfZy5tX3dGbGFncyB8PQorCQkJCQkgICAgRVBMX05NVE1OVV9GTEFHX0FQUF9JTkZPUk1FRDsKKwkJCQkJLy8gaW5mb3JtIGFwcGxpY2F0aW9uCisJCQkJCVJldCA9CisJCQkJCSAgICBFcGxObXRNbnVJbnN0YW5jZV9nLgorCQkJCQkgICAgbV9wZm5DYkJvb3RFdmVudAorCQkJCQkgICAgKGtFcGxObXRCb290RXZlbnRDaGVja0NvbUZpbmlzaCwKKwkJCQkJICAgICBObXRTdGF0ZSwgRVBMX0VfTk9fRVJST1IpOworCQkJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQkJCQlpZiAoUmV0ID09IGtFcGxSZWplY3QpIHsKKwkJCQkJCQkvLyB3YWl0IGZvciBhcHBsaWNhdGlvbgorCQkJCQkJCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCQkJCQkJfQorCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJLy8gZW50ZXIgT3BlcmF0aW9uYWwKKwkJCQkJUmV0ID0KKwkJCQkJICAgIEVwbE5tdHVObXRFdmVudAorCQkJCQkgICAgKGtFcGxObXRFdmVudEVudGVyTXNPcGVyYXRpb25hbCk7CisJCQkJfQorCQkJCWJyZWFrOworCQkJfQorCisJCWNhc2Uga0VwbE5tdE1zT3BlcmF0aW9uYWw6CisJCQl7CisJCQkJaWYgKChFcGxObXRNbnVJbnN0YW5jZV9nLm1fdWlTaWduYWxTbGF2ZUNvdW50ID09CisJCQkJICAgICAwKQorCQkJCSAgICAmJiAoRXBsTm10TW51SW5zdGFuY2VfZy5tX3VpTWFuZGF0b3J5U2xhdmVDb3VudCA9PSAwKSkgewkvLyBhbGwgb3B0aW9uYWwgQ05zIHNjYW5uZWQgb25jZSBhbmQgYWxsIG1hbmRhdG9yeSBDTnMgYXJlIE9QRVJBVElPTkFMCisJCQkJCUVwbE5tdE1udUluc3RhbmNlX2cubV93RmxhZ3MgfD0KKwkJCQkJICAgIEVQTF9OTVRNTlVfRkxBR19BUFBfSU5GT1JNRUQ7CisJCQkJCS8vIGluZm9ybSBhcHBsaWNhdGlvbgorCQkJCQlSZXQgPQorCQkJCQkgICAgRXBsTm10TW51SW5zdGFuY2VfZy4KKwkJCQkJICAgIG1fcGZuQ2JCb290RXZlbnQKKwkJCQkJICAgIChrRXBsTm10Qm9vdEV2ZW50T3BlcmF0aW9uYWwsCisJCQkJCSAgICAgTm10U3RhdGUsIEVQTF9FX05PX0VSUk9SKTsKKwkJCQkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJCQkJaWYgKFJldCA9PSBrRXBsUmVqZWN0KSB7CisJCQkJCQkJLy8gaWdub3JlIGVycm9yIGNvZGUKKwkJCQkJCQlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwkJCQkJCX0KKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCQkJCWJyZWFrOworCQkJfQorCisJCWRlZmF1bHQ6CisJCQl7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsTm10TW51Q2hlY2tObXRTdGF0ZQorLy8KKy8vIERlc2NyaXB0aW9uOiBjaGVja3MgdGhlIE5NVCBzdGF0ZSwgaS5lLiBldmFsdWF0ZXMgaXQgd2l0aCBvYmplY3QgMHgxRjhGCisvLyAgICAgICAgICAgICAgTk1UX01OTm9kZUV4cFN0YXRlX0FVOCBhbmQgdXBkYXRlcyBvYmplY3QgMHgxRjhFCisvLyAgICAgICAgICAgICAgTk1UX01OTm9kZUN1cnJTdGF0ZV9BVTguCisvLyAgICAgICAgICAgICAgSXQgbWFuaXB1bGF0ZXMgbV9Ob2RlU3RhdGUgaW4gaW50ZXJuYWwgbm9kZSBpbmZvIHN0cnVjdHVyZS4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgdWlOb2RlSWRfcCAgICAgICAgICAgICAgPSBub2RlIElECisvLyAgICAgICAgICAgICAgTm9kZU5tdFN0YXRlX3AgICAgICAgICAgPSBOTVQgc3RhdGUgb2YgQ04KKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLyAgICAgICAgICAgICAgICAgIGtFcGxSZWplY3QgICAgICAgICAgPSBDTiB3YXMgaW4gd3Jvbmcgc3RhdGUgYW5kIGhhcyBiZWVuIHJlc2V0CisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHRFcGxLZXJuZWwgRXBsTm10TW51Q2hlY2tObXRTdGF0ZSh1bnNpZ25lZCBpbnQgdWlOb2RlSWRfcCwKKwkJCQkJIHRFcGxObXRNbnVOb2RlSW5mbyAqIHBOb2RlSW5mb19wLAorCQkJCQkgdEVwbE5tdFN0YXRlIE5vZGVObXRTdGF0ZV9wLAorCQkJCQkgV09SRCB3RXJyb3JDb2RlX3AsCisJCQkJCSB0RXBsTm10U3RhdGUgTG9jYWxObXRTdGF0ZV9wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJdEVwbE9iZFNpemUgT2JkU2l6ZTsKKwlCWVRFIGJObXRTdGF0ZTsKKwlCWVRFIGJObXRTdGF0ZVByZXY7CisJdEVwbE5tdFN0YXRlIEV4cE5tdFN0YXRlOworCisJT2JkU2l6ZSA9IDE7CisJLy8gcmVhZCBvYmplY3QgMHgxRjhGIE5NVF9NTk5vZGVFeHBTdGF0ZV9BVTgKKwlSZXQgPSBFcGxPYmR1UmVhZEVudHJ5KDB4MUY4RiwgdWlOb2RlSWRfcCwgJmJObXRTdGF0ZSwgJk9iZFNpemUpOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKwkvLyBjb21wdXRlIGV4cGVjdGVkIE5NVCBzdGF0ZQorCUV4cE5tdFN0YXRlID0gKHRFcGxObXRTdGF0ZSkgKGJObXRTdGF0ZSB8IEVQTF9OTVRfVFlQRV9DUyk7CisJLy8gY29tcHV0ZSBCWVRFIG9mIGN1cnJlbnQgTk1UIHN0YXRlCisJYk5tdFN0YXRlID0gKChCWVRFKSBOb2RlTm10U3RhdGVfcCAmIDB4RkYpOworCisJaWYgKEV4cE5tdFN0YXRlID09IGtFcGxObXRDc05vdEFjdGl2ZSkgewkvLyBpZ25vcmUgdGhlIGN1cnJlbnQgc3RhdGUsIGJlY2F1c2UgdGhlIENOIHNoYWxsIGJlIG5vdCBhY3RpdmUKKwkJUmV0ID0ga0VwbFJlamVjdDsKKwkJZ290byBFeGl0OworCX0gZWxzZSBpZiAoKEV4cE5tdFN0YXRlID09IGtFcGxObXRDc1ByZU9wZXJhdGlvbmFsMikKKwkJICAgJiYgKE5vZGVObXRTdGF0ZV9wID09IGtFcGxObXRDc1JlYWR5VG9PcGVyYXRlKSkgewkvLyBDTiBzd2l0Y2hlZCB0byBSZWFkeVRvT3AKKwkJLy8gZGVsZXRlIHRpbWVyIGZvciB0aW1lb3V0IGhhbmRsaW5nCisJCVJldCA9IEVwbFRpbWVydURlbGV0ZVRpbWVyKCZwTm9kZUluZm9fcC0+bV9UaW1lckhkbExvbmdlcik7CisJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCWdvdG8gRXhpdDsKKwkJfQorCQlwTm9kZUluZm9fcC0+bV9Ob2RlU3RhdGUgPSBrRXBsTm10TW51Tm9kZVN0YXRlUmVhZHlUb09wOworCisJCS8vIHVwZGF0ZSBvYmplY3QgMHgxRjhGIE5NVF9NTk5vZGVFeHBTdGF0ZV9BVTggdG8gUmVhZHlUb09wCisJCVJldCA9IEVwbE9iZHVXcml0ZUVudHJ5KDB4MUY4RiwgdWlOb2RlSWRfcCwgJmJObXRTdGF0ZSwgMSk7CisJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCWdvdG8gRXhpdDsKKwkJfQorCisJCWlmICgocE5vZGVJbmZvX3AtPm1fZHdOb2RlQ2ZnICYgRVBMX05PREVBU1NJR05fTUFOREFUT1JZX0NOKSAhPSAwKSB7CS8vIG5vZGUgaXMgYSBtYW5kYXRvcnkgQ04gLT4gZGVjcmVtZW50IGNvdW50ZXIKKwkJCUVwbE5tdE1udUluc3RhbmNlX2cubV91aU1hbmRhdG9yeVNsYXZlQ291bnQtLTsKKwkJfQorCQlpZiAoTG9jYWxObXRTdGF0ZV9wID49IGtFcGxObXRNc1JlYWR5VG9PcGVyYXRlKSB7CS8vIHN0YXJ0IHByb2NlZHVyZSBDaGVja0NvbW11bmljYXRpb24gZm9yIHRoaXMgbm9kZQorCQkJUmV0ID0gRXBsTm10TW51Tm9kZUNoZWNrQ29tKHVpTm9kZUlkX3AsIHBOb2RlSW5mb19wKTsKKwkJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCQlnb3RvIEV4aXQ7CisJCQl9CisKKwkJCWlmICgoTG9jYWxObXRTdGF0ZV9wID09IGtFcGxObXRNc09wZXJhdGlvbmFsKQorCQkJICAgICYmIChwTm9kZUluZm9fcC0+bV9Ob2RlU3RhdGUgPT0KKwkJCQlrRXBsTm10TW51Tm9kZVN0YXRlQ29tQ2hlY2tlZCkpIHsKKwkJCQlFUExfTk1UTU5VX0RCR19QT1NUX1RSQUNFX1ZBTFVFKDAsIHVpTm9kZUlkX3AsCisJCQkJCQkJCSgoKE5vZGVObXRTdGF0ZV9wICYgMHhGRikgPDwgOCkKKwkJCQkJCQkJIHwKKwkJCQkJCQkJIGtFcGxObXRDbWRTdGFydE5vZGUpKTsKKworCQkJCS8vIGltbWVkaWF0ZWx5IHN0YXJ0IG9wdGlvbmFsIENOLCBiZWNhdXNlIGNvbW11bmljYXRpb24gaXMgYWx3YXlzIE9LIChlLmcuIGFzeW5jLW9ubHkgQ04pCisJCQkJUmV0ID0KKwkJCQkgICAgRXBsTm10TW51U2VuZE5tdENvbW1hbmQodWlOb2RlSWRfcCwKKwkJCQkJCQkgICAga0VwbE5tdENtZFN0YXJ0Tm9kZSk7CisJCQkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJCQlnb3RvIEV4aXQ7CisJCQkJfQorCQkJfQorCQl9CisKKwl9IGVsc2UgaWYgKChFeHBObXRTdGF0ZSA9PSBrRXBsTm10Q3NSZWFkeVRvT3BlcmF0ZSkKKwkJICAgJiYgKE5vZGVObXRTdGF0ZV9wID09IGtFcGxObXRDc09wZXJhdGlvbmFsKSkgewkvLyBDTiBzd2l0Y2hlZCB0byBPUEVSQVRJT05BTAorCQlwTm9kZUluZm9fcC0+bV9Ob2RlU3RhdGUgPSBrRXBsTm10TW51Tm9kZVN0YXRlT3BlcmF0aW9uYWw7CisKKwkJaWYgKChwTm9kZUluZm9fcC0+bV9kd05vZGVDZmcgJiBFUExfTk9ERUFTU0lHTl9NQU5EQVRPUllfQ04pICE9IDApIHsJLy8gbm9kZSBpcyBhIG1hbmRhdG9yeSBDTiAtPiBkZWNyZW1lbnQgY291bnRlcgorCQkJRXBsTm10TW51SW5zdGFuY2VfZy5tX3VpTWFuZGF0b3J5U2xhdmVDb3VudC0tOworCQl9CisKKwl9IGVsc2UgaWYgKChFeHBObXRTdGF0ZSAhPSBOb2RlTm10U3RhdGVfcCkKKwkJICAgJiYgISgoRXhwTm10U3RhdGUgPT0ga0VwbE5tdENzUHJlT3BlcmF0aW9uYWwxKQorCQkJJiYgKE5vZGVObXRTdGF0ZV9wID09IGtFcGxObXRDc1ByZU9wZXJhdGlvbmFsMikpKSB7CS8vIENOIGlzIG5vdCBpbiBleHBlY3RlZCBOTVQgc3RhdGUgKHdpdGhvdXQgdGhlIGV4Y2VwdGlvbnMgYWJvdmUpCisJCVdPUkQgd2JlRXJyb3JDb2RlOworCisJCWlmICgocE5vZGVJbmZvX3AtPgorCQkgICAgIG1fd0ZsYWdzICYgRVBMX05NVE1OVV9OT0RFX0ZMQUdfTk9UX1NDQU5ORUQpICE9IDApIHsKKwkJCS8vIGRlY3JlbWVudCBvbmx5IHNpZ25hbCBzbGF2ZSBjb3VudCBpZiBjaGVja2VkIG9uY2UKKwkJCUVwbE5tdE1udUluc3RhbmNlX2cubV91aVNpZ25hbFNsYXZlQ291bnQtLTsKKwkJCXBOb2RlSW5mb19wLT5tX3dGbGFncyAmPQorCQkJICAgIH5FUExfTk1UTU5VX05PREVfRkxBR19OT1RfU0NBTk5FRDsKKwkJfQorCisJCWlmIChwTm9kZUluZm9fcC0+bV9Ob2RlU3RhdGUgPT0ga0VwbE5tdE1udU5vZGVTdGF0ZVVua25vd24pIHsJLy8gQ04gaXMgYWxyZWFkeSBpbiBzdGF0ZSB1bmtub3duLCB3aGljaCBtZWFucyB0aGF0IGl0IGdvdAorCQkJLy8gTk1UIHJlc2V0IGNvbW1hbmQgZWFybGllcgorCQkJZ290byBFeGl0OworCQl9CisJCS8vIC0+IENOIGlzIGluIHdyb25nIE5NVCBzdGF0ZQorCQlwTm9kZUluZm9fcC0+bV9Ob2RlU3RhdGUgPSBrRXBsTm10TW51Tm9kZVN0YXRlVW5rbm93bjsKKworCQlpZiAod0Vycm9yQ29kZV9wID09IDApIHsJLy8gYXNzdW1lIHdyb25nIE5NVCBzdGF0ZSBlcnJvcgorCQkJaWYgKChwTm9kZUluZm9fcC0+bV93RmxhZ3MgJiBFUExfTk1UTU5VX05PREVfRkxBR19OTVRfQ01EX0lTU1VFRCkgIT0gMCkgewkvLyBOTVQgY29tbWFuZCBoYXMgYmVlbiBqdXN0IGlzc3VlZDsKKwkJCQkvLyBpZ25vcmUgd3JvbmcgTk1UIHN0YXRlIHVudGlsIHRpbWVyIGV4cGlyZXM7CisJCQkJLy8gb3RoZXIgZXJyb3JzIGxpa2UgTE9TU19QUkVTX1RIIGFyZSBzdGlsbCBwcm9jZXNzZWQKKwkJCQlnb3RvIEV4aXQ7CisJCQl9CisKKwkJCXdFcnJvckNvZGVfcCA9IEVQTF9FX05NVF9XUk9OR19TVEFURTsKKwkJfQorCisJCUJFTkNITUFSS19NT0RfMDdfVE9HR0xFKDkpOworCisJCS8vICQkJCBzdGFydCBFUlJPUl9UUkVBVE1FTlQgYW5kIGluZm9ybSBhcHBsaWNhdGlvbgorCQlSZXQgPSBFcGxObXRNbnVJbnN0YW5jZV9nLm1fcGZuQ2JOb2RlRXZlbnQodWlOb2RlSWRfcCwKKwkJCQkJCQkgICBrRXBsTm10Tm9kZUV2ZW50RXJyb3IsCisJCQkJCQkJICAgTm9kZU5tdFN0YXRlX3AsCisJCQkJCQkJICAgd0Vycm9yQ29kZV9wLAorCQkJCQkJCSAgIChwTm9kZUluZm9fcC0+CisJCQkJCQkJICAgIG1fZHdOb2RlQ2ZnICYKKwkJCQkJCQkgICAgRVBMX05PREVBU1NJR05fTUFOREFUT1JZX0NOKQorCQkJCQkJCSAgICE9IDApOworCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQlnb3RvIEV4aXQ7CisJCX0KKworCQlFUExfTk1UTU5VX0RCR19QT1NUX1RSQUNFX1ZBTFVFKDAsCisJCQkJCQl1aU5vZGVJZF9wLAorCQkJCQkJKCgoTm9kZU5tdFN0YXRlX3AgJiAweEZGKSA8PCA4KQorCQkJCQkJIHwga0VwbE5tdENtZFJlc2V0Tm9kZSkpOworCisJCS8vIHJlc2V0IENOCisJCS8vIHN0b3JlIGVycm9yIGNvZGUgaW4gTk1UIGNvbW1hbmQgZGF0YSBmb3IgZGlhZ25vc3RpYyBwdXJwb3NlCisJCUFtaVNldFdvcmRUb0xlKCZ3YmVFcnJvckNvZGUsIHdFcnJvckNvZGVfcCk7CisJCVJldCA9CisJCSAgICBFcGxObXRNbnVTZW5kTm10Q29tbWFuZEV4KHVpTm9kZUlkX3AsIGtFcGxObXRDbWRSZXNldE5vZGUsCisJCQkJCSAgICAgICZ3YmVFcnJvckNvZGUsCisJCQkJCSAgICAgIHNpemVvZih3YmVFcnJvckNvZGUpKTsKKwkJaWYgKFJldCA9PSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJUmV0ID0ga0VwbFJlamVjdDsKKwkJfQorCisJCWdvdG8gRXhpdDsKKwl9CisJLy8gY2hlY2sgaWYgTk1UX01OTm9kZUN1cnJTdGF0ZV9BVTggaGFzIHRvIGJlIGNoYW5nZWQKKwlPYmRTaXplID0gMTsKKwlSZXQgPSBFcGxPYmR1UmVhZEVudHJ5KDB4MUY4RSwgdWlOb2RlSWRfcCwgJmJObXRTdGF0ZVByZXYsICZPYmRTaXplKTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCWdvdG8gRXhpdDsKKwl9CisJaWYgKGJObXRTdGF0ZSAhPSBiTm10U3RhdGVQcmV2KSB7CisJCS8vIHVwZGF0ZSBvYmplY3QgMHgxRjhFIE5NVF9NTk5vZGVDdXJyU3RhdGVfQVU4CisJCVJldCA9IEVwbE9iZHVXcml0ZUVudHJ5KDB4MUY4RSwgdWlOb2RlSWRfcCwgJmJObXRTdGF0ZSwgMSk7CisJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCWdvdG8gRXhpdDsKKwkJfQorCQlSZXQgPSBFcGxObXRNbnVJbnN0YW5jZV9nLm1fcGZuQ2JOb2RlRXZlbnQodWlOb2RlSWRfcCwKKwkJCQkJCQkgICBrRXBsTm10Tm9kZUV2ZW50Tm10U3RhdGUsCisJCQkJCQkJICAgTm9kZU5tdFN0YXRlX3AsCisJCQkJCQkJICAgd0Vycm9yQ29kZV9wLAorCQkJCQkJCSAgIChwTm9kZUluZm9fcC0+CisJCQkJCQkJICAgIG1fZHdOb2RlQ2ZnICYKKwkJCQkJCQkgICAgRVBMX05PREVBU1NJR05fTUFOREFUT1JZX0NOKQorCQkJCQkJCSAgICE9IDApOworCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQlnb3RvIEV4aXQ7CisJCX0KKwl9CisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsTm10TW51UmVzZXQKKy8vCisvLyBEZXNjcmlwdGlvbjogcmVzZXQgaW50ZXJuYWwgc3RydWN0dXJlcywgZS5nLiB0aW1lcnMKKy8vCisvLyBQYXJhbWV0ZXJzOiAgdm9pZAorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdEVwbEtlcm5lbCBFcGxObXRNbnVSZXNldCh2b2lkKQoreworCXRFcGxLZXJuZWwgUmV0OworCWludCBpSW5kZXg7CisKKwlSZXQgPSBFcGxUaW1lcnVEZWxldGVUaW1lcigmRXBsTm10TW51SW5zdGFuY2VfZy5tX1RpbWVySGRsTm10U3RhdGUpOworCisJZm9yIChpSW5kZXggPSAxOyBpSW5kZXggPD0gdGFiZW50cmllcyhFcGxObXRNbnVJbnN0YW5jZV9nLm1fYU5vZGVJbmZvKTsKKwkgICAgIGlJbmRleCsrKSB7CisJCS8vIGRlbGV0ZSB0aW1lciBoYW5kbGVzCisJCVJldCA9CisJCSAgICBFcGxUaW1lcnVEZWxldGVUaW1lcigmRVBMX05NVE1OVV9HRVRfTk9ERUlORk8oaUluZGV4KS0+CisJCQkJCSBtX1RpbWVySGRsU3RhdFJlcSk7CisJCVJldCA9CisJCSAgICBFcGxUaW1lcnVEZWxldGVUaW1lcigmRVBMX05NVE1OVV9HRVRfTk9ERUlORk8oaUluZGV4KS0+CisJCQkJCSBtX1RpbWVySGRsTG9uZ2VyKTsKKwl9CisKKwlyZXR1cm4gUmV0OworfQorCisjZW5kaWYgLy8gI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRfTU4pKSAhPSAwKQorCisvLyBFT0YKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsTm10ay5jIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxObXRrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGUyZDBlMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsTm10ay5jCkBAIC0wLDAgKzEsMTg0MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIHNvdXJjZSBmaWxlIGZvciBOTVQtS2VybmVsc3BhY2UtTW9kdWxlCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRXBsTm10ay5jLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS4xMiAkICAkRGF0ZTogMjAwOC8xMS8xMyAxNzoxMzowOSAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICAgICAgR0NDIFYzLjQKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUmV2aXNpb24gSGlzdG9yeToKKworICAyMDA2LzA2LzA5IGsudC46ICAgc3RhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJrZXJuZWwvRXBsTm10ay5oIgorI2luY2x1ZGUgImtlcm5lbC9FcGxUaW1lcmsuaCIKKworI2luY2x1ZGUgImtlcm5lbC9FcGxEbGxrLmgiCS8vIGZvciBFcGxEbGxrUHJvY2VzcygpCisKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1USykpICE9IDApCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICBHIEwgTyBCIEEgTCAgIEQgRSBGIEkgTiBJIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gVHJhY2VQb2ludCBzdXBwb3J0IGZvciByZWFsdGltZS1kZWJ1Z2dpbmcKKyNpZmRlZiBfREJHX1RSQUNFX1BPSU5UU18KK3ZvaWQgUFVCTElDIFRndERiZ1NpZ25hbFRyYWNlUG9pbnQoQllURSBiVHJhY2VQb2ludE51bWJlcl9wKTsKK3ZvaWQgUFVCTElDIFRndERiZ1Bvc3RUcmFjZVZhbHVlKERXT1JEIGR3VHJhY2VWYWx1ZV9wKTsKKyNkZWZpbmUgVEdUX0RCR19TSUdOQUxfVFJBQ0VfUE9JTlQocCkgICBUZ3REYmdTaWduYWxUcmFjZVBvaW50KHApCisjZGVmaW5lIFRHVF9EQkdfUE9TVF9UUkFDRV9WQUxVRSh2KSAgICAgVGd0RGJnUG9zdFRyYWNlVmFsdWUodikKKyNlbHNlCisjZGVmaW5lIFRHVF9EQkdfU0lHTkFMX1RSQUNFX1BPSU5UKHApCisjZGVmaW5lIFRHVF9EQkdfUE9TVF9UUkFDRV9WQUxVRSh2KQorI2VuZGlmCisjZGVmaW5lIEVQTF9OTVRLX0RCR19QT1NUX1RSQUNFX1ZBTFVFKE5tdEV2ZW50X3AsIE9sZE5tdFN0YXRlX3AsIE5ld05tdFN0YXRlX3ApIFwKKyAgICBUR1RfREJHX1BPU1RfVFJBQ0VfVkFMVUUoKGtFcGxFdmVudFNpbmtObXRrIDw8IDI4KSB8IChObXRFdmVudF9wIDw8IDE2KSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKChPbGRObXRTdGF0ZV9wICYgMHhGRikgPDwgOCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IChOZXdObXRTdGF0ZV9wICYgMHhGRikpCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCB0eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHN0cnVjdCBmb3IgaW5zdGFuY2UgdGFibGUKK0lOU1RBTkNFX1RZUEVfQkVHSU4gRVBMX01DT19ERUNMX0lOU1RBTkNFX01FTUJFUigpCisKK1NUQVRJQyB2b2xhdGlsZSB0RXBsTm10U3RhdGUgSU5TVF9GQVIgbV9ObXRTdGF0ZTsKK1NUQVRJQyB2b2xhdGlsZSBCT09MIElOU1RfRkFSIG1fZkVuYWJsZVJlYWR5VG9PcGVyYXRlOworU1RBVElDIHZvbGF0aWxlIEJPT0wgSU5TVF9GQVIgbV9mQXBwUmVhZHlUb09wZXJhdGU7CitTVEFUSUMgdm9sYXRpbGUgQk9PTCBJTlNUX0ZBUiBtX2ZUaW1lck1zUHJlT3AyOworU1RBVElDIHZvbGF0aWxlIEJPT0wgSU5TVF9GQVIgbV9mQWxsTWFuZGF0b3J5Q05JZGVudDsKK1NUQVRJQyB2b2xhdGlsZSBCT09MIElOU1RfRkFSIG1fZkZyb3plbjsKKworSU5TVEFOQ0VfVFlQRV9FTkQKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBtb2R1bCBnbG9iYWxlIHZhcnMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBUaGlzIG1hY3JvIHJlcGxhY2UgdGhlIHVuc3BlY2lmaWMgcG9pbnRlciB0byBhbiBpbnN0YW5jZSB0aHJvdWdoCisvLyB0aGUgbW9kdWwgc3BlY2lmaWMgdHlwZSBmb3IgdGhlIGxvY2FsIGluc3RhbmNlIHRhYmxlLiBUaGlzIG1hY3JvCisvLyBtdXN0IGRlZmluZWQgaW4gZWFjaCBtb2R1bC4KKy8vI2RlZmluZSB0RXBsUHRySW5zdGFuY2UgICAgICAgICAgICAgdEVwbEluc3RhbmNlSW5mbyBNRU0qCitFUExfTUNPX0RFQ0xfSU5TVEFOQ0VfVkFSKCkKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMX01DT19ERUZJTkVfSU5TVEFOQ0VfRkNUKCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgQyBMIEEgUyBTICA8Tk1UX0tlcm5lbC1Nb2R1bGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8vCisvLyBEZXNjcmlwdGlvbjogVGhpcyBtb2R1bGUgcmVhbGl6ZSB0aGUgTk1ULVN0YXRlLU1hY2hpbmUgb2YgdGhlIEVQTC1TdGFjaworLy8KKy8vCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICBQIFUgQiBMIEkgQyAgIEYgVSBOIEMgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICAgICAgRXBsTm10a0luaXQKKy8vCisvLyBEZXNjcmlwdGlvbjogaW5pdGlhbGl6ZXMgdGhlIGZpcnN0IGluc3RhbmNlCisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOiAgRVBMX01DT19ERUNMX1BUUl9JTlNUQU5DRV9QVFIgPSBJbnN0YW5jZSBwb2ludGVyCisvLyAgICAgICAgICAgICAgdWlOb2RlSWRfcCA9IE5vZGUgSWQgb2YgdGhlIGxva2FsIG5vZGUKKy8vCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgID0gICBFcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxObXRrSW5pdChFUExfTUNPX0RFQ0xfUFRSX0lOU1RBTkNFX1BUUikKK3sKKwl0RXBsS2VybmVsIFJldDsKKworCVJldCA9IEVwbE5tdGtBZGRJbnN0YW5jZShFUExfTUNPX1BUUl9JTlNUQU5DRV9QVFIpOworCisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgICAgIEVwbE5tdGtBZGRJbnN0YW5jZQorLy8KKy8vIERlc2NyaXB0aW9uOiBhZGRzIGEgbmV3IGluc3RhbmNlCisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOiAgRVBMX01DT19ERUNMX1BUUl9JTlNUQU5DRV9QVFIgPSBJbnN0YW5jZSBwb2ludGVyCisvLworLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICA9ICAgRXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMgRXBsTm10a0FkZEluc3RhbmNlKEVQTF9NQ09fREVDTF9QVFJfSU5TVEFOQ0VfUFRSKQoreworCUVQTF9NQ09fREVDTF9JTlNUQU5DRV9QVFJfTE9DQUwgdEVwbEtlcm5lbCBSZXQ7CisvL3RFcGxFdmVudCAgICAgICAgICAgICAgIEV2ZW50OworLy90RXBsRXZlbnRObXRTdGF0ZUNoYW5nZSBObXRTdGF0ZUNoYW5nZTsKKworCS8vIGNoZWNrIGlmIHBvaW50ZXIgdG8gaW5zdGFuY2UgcG9pbnRlciB2YWxpZAorCS8vIGdldCBmcmVlIGluc3RhbmNlIGFuZCBzZXQgdGhlIGdsb2JhbGUgaW5zdGFuY2UgcG9pbnRlcgorCS8vIHNldCBhbHNvIHRoZSBpbnN0YW5jZSBhZGRyIHRvIHBhcmFtZXRlcmxpc3QKKwlFUExfTUNPX0NIRUNLX1BUUl9JTlNUQU5DRV9QVFIoKTsKKwlFUExfTUNPX0dFVF9GUkVFX0lOU1RBTkNFX1BUUigpOworCUVQTF9NQ09fU0VUX1BUUl9JTlNUQU5DRV9QVFIoKTsKKworCS8vIHNpZ24gaW5zdGFuY2UgYXMgdXNlZAorCUVQTF9NQ09fV1JJVEVfSU5TVEFOQ0VfU1RBVEUoa1N0YXRlVXNlZCk7CisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCS8vIGluaXRpYWxpemUgaW50ZXJuIHZhaWFibGVzCisJLy8gMjAwNi8wNy8zMSBkLmsuOiBzZXQgTk1ULVN0YXRlIHRvIGtFcGxObXRHc09mZgorCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9IGtFcGxObXRHc09mZjsKKwkvLyBzZXQgTk1ULVN0YXRlIHRvIGtFcGxObXRHc0luaXRpYWxpc2luZworCS8vRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0ga0VwbE5tdEdzSW5pdGlhbGlzaW5nOworCisJLy8gc2V0IGZsYWdzIHRvIEZBTFNFCisJRVBMX01DT19HTEJfVkFSKG1fZkVuYWJsZVJlYWR5VG9PcGVyYXRlKSA9IEZBTFNFOworCUVQTF9NQ09fR0xCX1ZBUihtX2ZBcHBSZWFkeVRvT3BlcmF0ZSkgPSBGQUxTRTsKKwlFUExfTUNPX0dMQl9WQVIobV9mVGltZXJNc1ByZU9wMikgPSBGQUxTRTsKKwlFUExfTUNPX0dMQl9WQVIobV9mQWxsTWFuZGF0b3J5Q05JZGVudCkgPSBGQUxTRTsKKwlFUExfTUNPX0dMQl9WQVIobV9mRnJvemVuKSA9IEZBTFNFOworCisvLyAgICBFUExfTUNPX0dMQl9WQVIobV9UaW1lckhkbCkgPSAwOworCisJLy8gaW5mb3JtIGhpZ2hlciBsYXllciBhYm91dCBzdGF0ZSBjaGFuZ2UKKwkvLyAyMDA2LzA3LzMxIGQuay46IFRoZSBFUEwgQVBJIGxheWVyL2FwcGxpY2F0aW9uIGhhcyB0byBzdGFydCBOTVQgc3RhdGUKKwkvLyAgICAgICAgICAgICAgICAgIG1hY2hpbmUgdmlhIE5tdEV2ZW50U3dSZXNldCBhZnRlciBpbml0aWFsaXNhdGlvbiBvZgorCS8vICAgICAgICAgICAgICAgICAgYWxsIG1vZHVsZXMgaGFzIGJlZW4gY29tcGxldGVkLiBETEwgaGFzIHRvIGJlIGluaXRpYWxpc2VkCisJLy8gICAgICAgICAgICAgICAgICBhZnRlciBOTVRrIGJlY2F1c2UgTk1UIHN0YXRlIHNoYWxsIG5vdCBiZSB1bmluaXRpYWxpc2VkCisJLy8gICAgICAgICAgICAgICAgICBhdCB0aGF0IHRpbWUuCisvKiAgICBObXRTdGF0ZUNoYW5nZS5tX05ld05tdFN0YXRlID0gRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpOworICAgIE5tdFN0YXRlQ2hhbmdlLm1fTm10RXZlbnQgPSBrRXBsTm10RXZlbnROb0V2ZW50OworICAgIEV2ZW50Lm1fRXZlbnRTaW5rID0ga0VwbEV2ZW50U2lua05tdHU7CisgICAgRXZlbnQubV9FdmVudFR5cGUgPSBrRXBsRXZlbnRUeXBlTm10U3RhdGVDaGFuZ2U7CisgICAgRVBMX01FTVNFVCgmRXZlbnQubV9OZXRUaW1lLCAweDAwLCBzaXplb2YoRXZlbnQubV9OZXRUaW1lKSk7CisgICAgRXZlbnQubV9wQXJnID0gJk5tdFN0YXRlQ2hhbmdlOworICAgIEV2ZW50Lm1fdWlTaXplID0gc2l6ZW9mKE5tdFN0YXRlQ2hhbmdlKTsKKyAgICBSZXQgPSBFcGxFdmVudGtQb3N0KCZFdmVudCk7CisqLworCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgICAgICBFcGxObXRrRGVsSW5zdGFuY2UKKy8vCisvLyBEZXNjcmlwdGlvbjogZGVsZXRlIGluc3RhbmNlCisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOiAgRVBMX01DT19ERUNMX1BUUl9JTlNUQU5DRV9QVFIgPSBJbnN0YW5jZSBwb2ludGVyCisvLworLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICA9ICAgRXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjaWYgKEVQTF9VU0VfREVMRVRFSU5TVF9GVU5DICE9IEZBTFNFKQorRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbE5tdGtEZWxJbnN0YW5jZShFUExfTUNPX0RFQ0xfUFRSX0lOU1RBTkNFX1BUUikKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCS8vIGNoZWNrIGZvciBhbGwgQVBJIGZ1bmN0aW9uIGlmIGluc3RhbmNlIGlzIHZhbGlkCisJRVBMX01DT19DSEVDS19JTlNUQU5DRV9TVEFURSgpOworCisJLy8gc2V0IE5NVC1TdGF0ZSB0byBrRXBsTm10R3NPZmYKKwlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPSBrRXBsTm10R3NPZmY7CisKKwkvLyBzaWduIGluc3RhbmNlIGFzIHVudXNlZAorCUVQTF9NQ09fV1JJVEVfSU5TVEFOQ0VfU1RBVEUoa1N0YXRlVW51c2VkKTsKKworCS8vIGRlbGV0ZSB0aW1lcgorLy8gICAgUmV0ID0gRXBsVGltZXJrRGVsZXRlVGltZXIoJkVQTF9NQ09fR0xCX1ZBUihtX1RpbWVySGRsKSk7CisKKwlyZXR1cm4gUmV0OworfQorI2VuZGlmIC8vIChFUExfVVNFX0RFTEVURUlOU1RfRlVOQyAhPSBGQUxTRSkKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgICAgIEVwbE5tdGtQcm9jZXNzCisvLworLy8gRGVzY3JpcHRpb246IG1haW4gcHJvY2VzcyBmdW5jdGlvbgorLy8gICAgICAgICAgICAgIC0+IHByb2Nlc3MgTk1ULVN0YXRlLU1hc2NoaW5lIHVuZCByZWFkIE5NVC1FdmVudHMgZnJvbSBRdWV1ZQorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczogIEVQTF9NQ09fREVDTF9QVFJfSU5TVEFOQ0VfUFRSXyA9IEluc3RhbmNlIHBvaW50ZXIKKy8vICAgICAgICAgICAgICBwRXZlbnRfcCAgICA9ICAgRXBsLUV2ZW50IHdpdGggTk1ULWV2ZW50IHRvIHByb2Nlc3MKKy8vCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgID0gICBFcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxObXRrUHJvY2VzcyhFUExfTUNPX0RFQ0xfUFRSX0lOU1RBTkNFX1BUUl8KKwkJCQkJICAgICAgdEVwbEV2ZW50ICogcEV2ZW50X3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisJdEVwbE5tdFN0YXRlIE9sZE5tdFN0YXRlOworCXRFcGxObXRFdmVudCBObXRFdmVudDsKKwl0RXBsRXZlbnQgRXZlbnQ7CisJdEVwbEV2ZW50Tm10U3RhdGVDaGFuZ2UgTm10U3RhdGVDaGFuZ2U7CisKKwkvLyBjaGVjayBmb3IgYWxsIEFQSSBmdW5jdGlvbiBpZiBpbnN0YW5jZSBpcyB2YWxpZAorCUVQTF9NQ09fQ0hFQ0tfSU5TVEFOQ0VfU1RBVEUoKTsKKworCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJc3dpdGNoIChwRXZlbnRfcC0+bV9FdmVudFR5cGUpIHsKKwljYXNlIGtFcGxFdmVudFR5cGVObXRFdmVudDoKKwkJeworCQkJTm10RXZlbnQgPSAqKCh0RXBsTm10RXZlbnQgKikgcEV2ZW50X3AtPm1fcEFyZyk7CisJCQlicmVhazsKKwkJfQorCisJY2FzZSBrRXBsRXZlbnRUeXBlVGltZXI6CisJCXsKKwkJCU5tdEV2ZW50ID0KKwkJCSAgICAodEVwbE5tdEV2ZW50KSAoKHRFcGxUaW1lckV2ZW50QXJnICopIHBFdmVudF9wLT4KKwkJCQkJICAgIG1fcEFyZyktPm1fdWxBcmc7CisJCQlicmVhazsKKwkJfQorCWRlZmF1bHQ6CisJCXsKKwkJCVJldCA9IGtFcGxObXRJbnZhbGlkRXZlbnQ7CisJCQlnb3RvIEV4aXQ7CisJCX0KKwl9CisKKwkvLyBzYXZlIE5NVC1TdGF0ZQorCS8vIG5lZWRlZCBmb3IgbGF0ZXIgY29tcGFyaXNvbiB0bworCS8vIGluZm9ybSBoZ2hlciBsYXllciBhYm91dCBzdGF0ZSBjaGFuZ2UKKwlPbGRObXRTdGF0ZSA9IEVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKTsKKworCS8vIE5NVC1TdGF0ZS1NYXNjaGluZQorCXN3aXRjaCAoRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpKSB7CisJCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJLy8gZ2VuZXJhbCBwYXJ0IG9mIHRoZSBzdGF0ZW1hc2NoaW5lCisKKwkJLy8gZmlyc3QgaW5pdCBvZiB0aGUgaGFyZHdhcmUKKwljYXNlIGtFcGxObXRHc09mZjoKKwkJeworCQkJLy8gbGVhdmUgdGhpcyBzdGF0ZSBvbmx5IGlmIGhpZ2hlciBsYXllciBzYXlzIHNvCisJCQlpZiAoTm10RXZlbnQgPT0ga0VwbE5tdEV2ZW50U3dSZXNldCkgewkvLyBuZXcgc3RhdGUga0VwbE5tdEdzSW5pdGlhbGlzaW5nCisJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkgICAga0VwbE5tdEdzSW5pdGlhbGlzaW5nOworCQkJfQorCQkJYnJlYWs7CisJCX0KKworCQkvLyBmaXJzdCBpbml0IG9mIHRoZSBoYXJkd2FyZQorCWNhc2Uga0VwbE5tdEdzSW5pdGlhbGlzaW5nOgorCQl7CisJCQkvLyBsZWF2ZSB0aGlzIHN0YXRlIG9ubHkgaWYgaGlnaGVyIGxheWVyIHNheXMgc28KKworCQkJLy8gY2hlY2sgZXZlbnRzCisJCQlzd2l0Y2ggKE5tdEV2ZW50KSB7CisJCQkJLy8gMjAwNi8wNy8zMSBkLmsuOiByZWFjdCBhbHNvIG9uIE5NVCByZXNldCBjb21tYW5kcyBpbiBSZXNldEFwcCBzdGF0ZQorCQkJCS8vIE5NVCBDb21tYW5kIFN3aXRjaE9mZgorCQkJY2FzZSBrRXBsTm10RXZlbnRDcml0aWNhbEVycm9yOgorCQkJY2FzZSBrRXBsTm10RXZlbnRTd2l0Y2hPZmY6CisJCQkJeworCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdEdzT2ZmOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBuZXcgc3RhdGUga0VwbE5tdEdzUmVzZXRBcHBsaWNhdGlvbgorCQkJY2FzZSBrRXBsTm10RXZlbnRFbnRlclJlc2V0QXBwOgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRHc1Jlc2V0QXBwbGljYXRpb247CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJZGVmYXVsdDoKKwkJCQl7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQl9CisKKwkJLy8gaW5pdCBvZiB0aGUgbWFudWZhY3R1cmVyLXNwZWNpZmljIHByb2ZpbGUgYXJlYSBhbmQgdGhlCisJCS8vIHN0YW5kYXJkaXNlZCBkZXZpY2UgcHJvZmlsZSBhcmVhCisJY2FzZSBrRXBsTm10R3NSZXNldEFwcGxpY2F0aW9uOgorCQl7CisJCQkvLyBjaGVjayBldmVudHMKKwkJCXN3aXRjaCAoTm10RXZlbnQpIHsKKwkJCQkvLyAyMDA2LzA3LzMxIGQuay46IHJlYWN0IGFsc28gb24gTk1UIHJlc2V0IGNvbW1hbmRzIGluIFJlc2V0QXBwIHN0YXRlCisJCQkJLy8gTk1UIENvbW1hbmQgU3dpdGNoT2ZmCisJCQljYXNlIGtFcGxObXRFdmVudENyaXRpY2FsRXJyb3I6CisJCQljYXNlIGtFcGxObXRFdmVudFN3aXRjaE9mZjoKKwkJCQl7CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10R3NPZmY7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIE5NVCBDb21tYW5kIFN3UmVzZXQKKwkJCWNhc2Uga0VwbE5tdEV2ZW50U3dSZXNldDoKKwkJCQl7CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10R3NJbml0aWFsaXNpbmc7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIGxlYXZlIHRoaXMgc3RhdGUgb25seSBpZiBoaWdoZXIgbGF5ZXIKKwkJCQkvLyBzYXkgc28KKwkJCWNhc2Uga0VwbE5tdEV2ZW50RW50ZXJSZXNldENvbToKKwkJCQl7CisJCQkJCS8vIG5ldyBzdGF0ZSBrRXBsTm10R3NSZXNldENvbW11bmljYXRpb24KKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRHc1Jlc2V0Q29tbXVuaWNhdGlvbjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQlkZWZhdWx0OgorCQkJCXsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCX0KKworCQkvLyBpbml0IG9mIHRoZSBjb21tdW5pY2F0aW9uIHByb2ZpbGUgYXJlYQorCWNhc2Uga0VwbE5tdEdzUmVzZXRDb21tdW5pY2F0aW9uOgorCQl7CisJCQkvLyBjaGVjayBldmVudHMKKwkJCXN3aXRjaCAoTm10RXZlbnQpIHsKKwkJCQkvLyAyMDA2LzA3LzMxIGQuay46IHJlYWN0IGFsc28gb24gTk1UIHJlc2V0IGNvbW1hbmRzIGluIFJlc2V0Q29tbSBzdGF0ZQorCQkJCS8vIE5NVCBDb21tYW5kIFN3aXRjaE9mZgorCQkJY2FzZSBrRXBsTm10RXZlbnRDcml0aWNhbEVycm9yOgorCQkJY2FzZSBrRXBsTm10RXZlbnRTd2l0Y2hPZmY6CisJCQkJeworCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdEdzT2ZmOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBOTVQgQ29tbWFuZCBTd1Jlc2V0CisJCQljYXNlIGtFcGxObXRFdmVudFN3UmVzZXQ6CisJCQkJeworCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdEdzSW5pdGlhbGlzaW5nOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBOTVQgQ29tbWFuZCBSZXNldE5vZGUKKwkJCWNhc2Uga0VwbE5tdEV2ZW50UmVzZXROb2RlOgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRHc1Jlc2V0QXBwbGljYXRpb247CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIGxlYXZlIHRoaXMgc3RhdGUgb25seSBpZiBoaWdoZXIgbGF5ZXIKKwkJCQkvLyBzYXkgc28KKwkJCWNhc2Uga0VwbE5tdEV2ZW50RW50ZXJSZXNldENvbmZpZzoKKwkJCQl7CisJCQkJCS8vIG5ldyBzdGF0ZSBrRXBsTm10R3NSZXNldENvbW11bmljYXRpb24KKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRHc1Jlc2V0Q29uZmlndXJhdGlvbjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQlkZWZhdWx0OgorCQkJCXsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCX0KKworCQkvLyBidWlsZCB0aGUgY29uZmlndXJhdGlvbiB3aXRoIGluZm9zIGZyb20gT0QKKwljYXNlIGtFcGxObXRHc1Jlc2V0Q29uZmlndXJhdGlvbjoKKwkJeworCQkJLy8gcmVzZXQgZmxhZ3MKKwkJCUVQTF9NQ09fR0xCX1ZBUihtX2ZFbmFibGVSZWFkeVRvT3BlcmF0ZSkgPSBGQUxTRTsKKwkJCUVQTF9NQ09fR0xCX1ZBUihtX2ZBcHBSZWFkeVRvT3BlcmF0ZSkgPSBGQUxTRTsKKwkJCUVQTF9NQ09fR0xCX1ZBUihtX2ZGcm96ZW4pID0gRkFMU0U7CisKKwkJCS8vIGNoZWNrIGV2ZW50cworCQkJc3dpdGNoIChObXRFdmVudCkgeworCQkJCS8vIDIwMDYvMDcvMzEgZC5rLjogcmVhY3QgYWxzbyBvbiBOTVQgcmVzZXQgY29tbWFuZHMgaW4gUmVzZXRDb25mIHN0YXRlCisJCQkJLy8gTk1UIENvbW1hbmQgU3dpdGNoT2ZmCisJCQljYXNlIGtFcGxObXRFdmVudENyaXRpY2FsRXJyb3I6CisJCQljYXNlIGtFcGxObXRFdmVudFN3aXRjaE9mZjoKKwkJCQl7CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10R3NPZmY7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIE5NVCBDb21tYW5kIFN3UmVzZXQKKwkJCWNhc2Uga0VwbE5tdEV2ZW50U3dSZXNldDoKKwkJCQl7CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10R3NJbml0aWFsaXNpbmc7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIE5NVCBDb21tYW5kIFJlc2V0Tm9kZQorCQkJY2FzZSBrRXBsTm10RXZlbnRSZXNldE5vZGU6CisJCQkJeworCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdEdzUmVzZXRBcHBsaWNhdGlvbjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gTk1UIENvbW1hbmQgUmVzZXRDb21tdW5pY2F0aW9uCisJCQljYXNlIGtFcGxObXRFdmVudFJlc2V0Q29tOgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRHc1Jlc2V0Q29tbXVuaWNhdGlvbjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gbGVhdmUgdGhpcyBzdGF0ZSBvbmx5IGlmIGhpZ2hlciBsYXllciBzYXlzIHNvCisJCQljYXNlIGtFcGxObXRFdmVudEVudGVyQ3NOb3RBY3RpdmU6CisJCQkJewkvLyBOb2RlIHNob3VsZCBiZSBDTgorCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdENzTm90QWN0aXZlOworCQkJCQlicmVhazsKKworCQkJCX0KKworCQkJY2FzZSBrRXBsTm10RXZlbnRFbnRlck1zTm90QWN0aXZlOgorCQkJCXsJLy8gTm9kZSBzaG91bGQgYmUgQ04KKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UX01OKSkgPT0gMCkKKwkJCQkJLy8gbm8gTU4gZnVuY3Rpb25hbGl0eQorCQkJCQkvLyBUT0RPOiAtY3JlYXRlIGVycm9yIEVfTk1UX0JBMV9OT19NTl9TVVBQT1JUCisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX2ZGcm96ZW4pID0gVFJVRTsKKyNlbHNlCisKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRNc05vdEFjdGl2ZTsKKyNlbmRpZgorCQkJCQlicmVhazsKKworCQkJCX0KKworCQkJZGVmYXVsdDoKKwkJCQl7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQl9CisKKwkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkvLyBDTiBwYXJ0IG9mIHRoZSBzdGF0ZW1hc2NoaW5lCisKKwkJLy8gbm9kZSBsaXN0ZSBmb3IgRVBMLUZyYW1lcyBhbmQgY2hlY2sgdGltZW91dAorCWNhc2Uga0VwbE5tdENzTm90QWN0aXZlOgorCQl7CisKKwkJCS8vIGNoZWNrIGV2ZW50cworCQkJc3dpdGNoIChObXRFdmVudCkgeworCQkJCS8vIDIwMDYvMDcvMzEgZC5rLjogcmVhY3QgYWxzbyBvbiBOTVQgcmVzZXQgY29tbWFuZHMgaW4gTm90QWN0aXZlIHN0YXRlCisJCQkJLy8gTk1UIENvbW1hbmQgU3dpdGNoT2ZmCisJCQljYXNlIGtFcGxObXRFdmVudENyaXRpY2FsRXJyb3I6CisJCQljYXNlIGtFcGxObXRFdmVudFN3aXRjaE9mZjoKKwkJCQl7CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10R3NPZmY7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIE5NVCBDb21tYW5kIFN3UmVzZXQKKwkJCWNhc2Uga0VwbE5tdEV2ZW50U3dSZXNldDoKKwkJCQl7CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10R3NJbml0aWFsaXNpbmc7CisvLyAgICAgICAgICAgICAgICAgICAgUmV0ID0gRXBsVGltZXJrRGVsZXRlVGltZXIoJkVQTF9NQ09fR0xCX1ZBUihtX1RpbWVySGRsKSk7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIE5NVCBDb21tYW5kIFJlc2V0Tm9kZQorCQkJY2FzZSBrRXBsTm10RXZlbnRSZXNldE5vZGU6CisJCQkJeworCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdEdzUmVzZXRBcHBsaWNhdGlvbjsKKy8vICAgICAgICAgICAgICAgICAgICBSZXQgPSBFcGxUaW1lcmtEZWxldGVUaW1lcigmRVBMX01DT19HTEJfVkFSKG1fVGltZXJIZGwpKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gTk1UIENvbW1hbmQgUmVzZXRDb21tdW5pY2F0aW9uCisJCQkJLy8gb3IgaW50ZXJuYWwgQ29tbXVuaWNhdGlvbiBlcnJvcgorCQkJY2FzZSBrRXBsTm10RXZlbnRSZXNldENvbToKKwkJCWNhc2Uga0VwbE5tdEV2ZW50SW50ZXJuQ29tRXJyb3I6CisJCQkJeworCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdEdzUmVzZXRDb21tdW5pY2F0aW9uOworLy8gICAgICAgICAgICAgICAgICAgIFJldCA9IEVwbFRpbWVya0RlbGV0ZVRpbWVyKCZFUExfTUNPX0dMQl9WQVIobV9UaW1lckhkbCkpOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBOTVQgQ29tbWFuZCBSZXNldCBDb25maWd1cmF0aW9uCisJCQljYXNlIGtFcGxObXRFdmVudFJlc2V0Q29uZmlnOgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRHc1Jlc2V0Q29uZmlndXJhdGlvbjsKKy8vICAgICAgICAgICAgICAgICAgICBSZXQgPSBFcGxUaW1lcmtEZWxldGVUaW1lcigmRVBMX01DT19HTEJfVkFSKG1fVGltZXJIZGwpKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gc2VlIGlmIFNvQSBvciBTb0MgcmVjZWl2ZWQKKwkJCQkvLyBrLnQuIDIwLjA3LjIwMDY6IG9ubHkgU29BIGZvcmNlcyBjaGFuZ2Ugb2Ygc3RhdGUKKwkJCQkvLyBzZWUgRVBMIFYyIERTIDEuMC4wIHAuMjY3CisJCQkJLy8gY2FzZSBrRXBsTm10RXZlbnREbGxDZVNvYzoKKwkJCWNhc2Uga0VwbE5tdEV2ZW50RGxsQ2VTb2E6CisJCQkJewkvLyBuZXcgc3RhdGUgUFJFX09QRVJBVElPTkFMMQorCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdENzUHJlT3BlcmF0aW9uYWwxOworLy8gICAgICAgICAgICAgICAgICAgIFJldCA9IEVwbFRpbWVya0RlbGV0ZVRpbWVyKCZFUExfTUNPX0dMQl9WQVIobV9UaW1lckhkbCkpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJLy8gdGltZW91dCBmb3IgU29BIGFuZCBTb2MKKwkJCWNhc2Uga0VwbE5tdEV2ZW50VGltZXJCYXNpY0V0aGVybmV0OgorCQkJCXsKKwkJCQkJLy8gbmV3IHN0YXRlIEJBU0lDX0VUSEVSTkVUCisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10Q3NCYXNpY0V0aGVybmV0OworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCWRlZmF1bHQ6CisJCQkJeworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CS8vIGVuZCBvZiBzd2l0Y2goTm10RXZlbnQpCisKKwkJCWJyZWFrOworCQl9CisKKwkJLy8gbm9kZSBwcm9jZXNzZXMgb25seSBhc3luYyBmcmFtZXMKKwljYXNlIGtFcGxObXRDc1ByZU9wZXJhdGlvbmFsMToKKwkJeworCisJCQkvLyBjaGVjayBldmVudHMKKwkJCXN3aXRjaCAoTm10RXZlbnQpIHsKKwkJCQkvLyBOTVQgQ29tbWFuZCBTd2l0Y2hPZmYKKwkJCWNhc2Uga0VwbE5tdEV2ZW50Q3JpdGljYWxFcnJvcjoKKwkJCWNhc2Uga0VwbE5tdEV2ZW50U3dpdGNoT2ZmOgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRHc09mZjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gTk1UIENvbW1hbmQgU3dSZXNldAorCQkJY2FzZSBrRXBsTm10RXZlbnRTd1Jlc2V0OgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRHc0luaXRpYWxpc2luZzsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gTk1UIENvbW1hbmQgUmVzZXROb2RlCisJCQljYXNlIGtFcGxObXRFdmVudFJlc2V0Tm9kZToKKwkJCQl7CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10R3NSZXNldEFwcGxpY2F0aW9uOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBOTVQgQ29tbWFuZCBSZXNldENvbW11bmljYXRpb24KKwkJCQkvLyBvciBpbnRlcm5hbCBDb21tdW5pY2F0aW9uIGVycm9yCisJCQljYXNlIGtFcGxObXRFdmVudFJlc2V0Q29tOgorCQkJY2FzZSBrRXBsTm10RXZlbnRJbnRlcm5Db21FcnJvcjoKKwkJCQl7CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10R3NSZXNldENvbW11bmljYXRpb247CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIE5NVCBDb21tYW5kIFJlc2V0IENvbmZpZ3VyYXRpb24KKwkJCWNhc2Uga0VwbE5tdEV2ZW50UmVzZXRDb25maWc6CisJCQkJeworCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdEdzUmVzZXRDb25maWd1cmF0aW9uOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBOTVQgQ29tbWFuZCBTdG9wTm9kZQorCQkJY2FzZSBrRXBsTm10RXZlbnRTdG9wTm9kZToKKwkJCQl7CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10Q3NTdG9wcGVkOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBjaGVjayBpZiBTb0MgcmVjZWl2ZWQKKwkJCWNhc2Uga0VwbE5tdEV2ZW50RGxsQ2VTb2M6CisJCQkJeworCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdENzUHJlT3BlcmF0aW9uYWwyOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCWRlZmF1bHQ6CisJCQkJeworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCX0JLy8gZW5kIG9mIHN3aXRjaChObXRFdmVudCkKKworCQkJYnJlYWs7CisJCX0KKworCQkvLyBub2RlIHByb2Nlc3NlcyBpc29jaHJvbm91cyBhbmQgYXN5bmNocm9ub3VzIGZyYW1lcworCWNhc2Uga0VwbE5tdENzUHJlT3BlcmF0aW9uYWwyOgorCQl7CisJCQkvLyBjaGVjayBldmVudHMKKwkJCXN3aXRjaCAoTm10RXZlbnQpIHsKKwkJCQkvLyBOTVQgQ29tbWFuZCBTd2l0Y2hPZmYKKwkJCWNhc2Uga0VwbE5tdEV2ZW50Q3JpdGljYWxFcnJvcjoKKwkJCWNhc2Uga0VwbE5tdEV2ZW50U3dpdGNoT2ZmOgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRHc09mZjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gTk1UIENvbW1hbmQgU3dSZXNldAorCQkJY2FzZSBrRXBsTm10RXZlbnRTd1Jlc2V0OgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRHc0luaXRpYWxpc2luZzsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gTk1UIENvbW1hbmQgUmVzZXROb2RlCisJCQljYXNlIGtFcGxObXRFdmVudFJlc2V0Tm9kZToKKwkJCQl7CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10R3NSZXNldEFwcGxpY2F0aW9uOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBOTVQgQ29tbWFuZCBSZXNldENvbW11bmljYXRpb24KKwkJCQkvLyBvciBpbnRlcm5hbCBDb21tdW5pY2F0aW9uIGVycm9yCisJCQljYXNlIGtFcGxObXRFdmVudFJlc2V0Q29tOgorCQkJY2FzZSBrRXBsTm10RXZlbnRJbnRlcm5Db21FcnJvcjoKKwkJCQl7CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10R3NSZXNldENvbW11bmljYXRpb247CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIE5NVCBDb21tYW5kIFJlc2V0IENvbmZpZ3VyYXRpb24KKwkJCWNhc2Uga0VwbE5tdEV2ZW50UmVzZXRDb25maWc6CisJCQkJeworCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdEdzUmVzZXRDb25maWd1cmF0aW9uOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBOTVQgQ29tbWFuZCBTdG9wTm9kZQorCQkJY2FzZSBrRXBsTm10RXZlbnRTdG9wTm9kZToKKwkJCQl7CisJCQkJCS8vIHJlc2V0IGZsYWdzCisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX2ZFbmFibGVSZWFkeVRvT3BlcmF0ZSkKKwkJCQkJICAgID0gRkFMU0U7CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX2ZBcHBSZWFkeVRvT3BlcmF0ZSkgPQorCQkJCQkgICAgRkFMU0U7CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10Q3NTdG9wcGVkOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBlcnJvciBvY2N1cmVkCisJCQljYXNlIGtFcGxObXRFdmVudE5tdEN5Y2xlRXJyb3I6CisJCQkJeworCQkJCQkvLyByZXNldCBmbGFncworCQkJCQlFUExfTUNPX0dMQl9WQVIobV9mRW5hYmxlUmVhZHlUb09wZXJhdGUpCisJCQkJCSAgICA9IEZBTFNFOworCQkJCQlFUExfTUNPX0dMQl9WQVIobV9mQXBwUmVhZHlUb09wZXJhdGUpID0KKwkJCQkJICAgIEZBTFNFOworCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdENzUHJlT3BlcmF0aW9uYWwxOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBjaGVjayBpZiBhcHBsaWNhdGlvbiBpcyByZWFkeSB0byBvcGVyYXRlCisJCQljYXNlIGtFcGxObXRFdmVudEVudGVyUmVhZHlUb09wZXJhdGU6CisJCQkJeworCQkJCQkvLyBjaGVjayBpZiBjb21tYW5kIE5NVEVuYWJsZVJlYWR5VG9PcGVyYXRlIGZyb20gTU4gd2FzIHJlY2VpdmVkCisJCQkJCWlmIChFUExfTUNPX0dMQl9WQVIobV9mRW5hYmxlUmVhZHlUb09wZXJhdGUpID09IFRSVUUpIHsJLy8gcmVzZXQgZmxhZ3MKKwkJCQkJCUVQTF9NQ09fR0xCX1ZBUgorCQkJCQkJICAgIChtX2ZFbmFibGVSZWFkeVRvT3BlcmF0ZSkgPQorCQkJCQkJICAgIEZBTFNFOworCQkJCQkJRVBMX01DT19HTEJfVkFSCisJCQkJCQkgICAgKG1fZkFwcFJlYWR5VG9PcGVyYXRlKSA9CisJCQkJCQkgICAgRkFMU0U7CisJCQkJCQkvLyBjaGFuZ2Ugc3RhdGUKKwkJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCQkgICAga0VwbE5tdENzUmVhZHlUb09wZXJhdGU7CisJCQkJCX0gZWxzZSB7CS8vIHNldCBGbGFnCisJCQkJCQlFUExfTUNPX0dMQl9WQVIKKwkJCQkJCSAgICAobV9mQXBwUmVhZHlUb09wZXJhdGUpID0KKwkJCQkJCSAgICBUUlVFOworCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIE5NVCBDb21tYW5kbyBFbmFibGVSZWFkeVRvT3BlcmF0ZQorCQkJY2FzZSBrRXBsTm10RXZlbnRFbmFibGVSZWFkeVRvT3BlcmF0ZToKKwkJCQl7CisJCQkJCS8vIGNoZWNrIGlmIGFwcGxpY2F0aW9uIGlzIHJlYWR5CisJCQkJCWlmIChFUExfTUNPX0dMQl9WQVIobV9mQXBwUmVhZHlUb09wZXJhdGUpID09IFRSVUUpIHsJLy8gcmVzZXQgZmxhZ3MKKwkJCQkJCUVQTF9NQ09fR0xCX1ZBUgorCQkJCQkJICAgIChtX2ZFbmFibGVSZWFkeVRvT3BlcmF0ZSkgPQorCQkJCQkJICAgIEZBTFNFOworCQkJCQkJRVBMX01DT19HTEJfVkFSCisJCQkJCQkgICAgKG1fZkFwcFJlYWR5VG9PcGVyYXRlKSA9CisJCQkJCQkgICAgRkFMU0U7CisJCQkJCQkvLyBjaGFuZ2Ugc3RhdGUKKwkJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCQkgICAga0VwbE5tdENzUmVhZHlUb09wZXJhdGU7CisJCQkJCX0gZWxzZSB7CS8vIHNldCBGbGFnCisJCQkJCQlFUExfTUNPX0dMQl9WQVIKKwkJCQkJCSAgICAobV9mRW5hYmxlUmVhZHlUb09wZXJhdGUpID0KKwkJCQkJCSAgICBUUlVFOworCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJZGVmYXVsdDoKKwkJCQl7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJfQkvLyBlbmQgb2Ygc3dpdGNoKE5tdEV2ZW50KQorCQkJYnJlYWs7CisJCX0KKworCQkvLyBub2RlIHNob3VsZCBiZSBjb25maWd1cmVkIHVuZCBhcHBsaWNhdGlvbiBpcyByZWFkeQorCWNhc2Uga0VwbE5tdENzUmVhZHlUb09wZXJhdGU6CisJCXsKKwkJCS8vIGNoZWNrIGV2ZW50cworCQkJc3dpdGNoIChObXRFdmVudCkgeworCQkJCS8vIE5NVCBDb21tYW5kIFN3aXRjaE9mZgorCQkJY2FzZSBrRXBsTm10RXZlbnRDcml0aWNhbEVycm9yOgorCQkJY2FzZSBrRXBsTm10RXZlbnRTd2l0Y2hPZmY6CisJCQkJeworCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdEdzT2ZmOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBOTVQgQ29tbWFuZCBTd1Jlc2V0CisJCQljYXNlIGtFcGxObXRFdmVudFN3UmVzZXQ6CisJCQkJeworCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdEdzSW5pdGlhbGlzaW5nOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBOTVQgQ29tbWFuZCBSZXNldE5vZGUKKwkJCWNhc2Uga0VwbE5tdEV2ZW50UmVzZXROb2RlOgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRHc1Jlc2V0QXBwbGljYXRpb247CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIE5NVCBDb21tYW5kIFJlc2V0Q29tbXVuaWNhdGlvbgorCQkJCS8vIG9yIGludGVybmFsIENvbW11bmljYXRpb24gZXJyb3IKKwkJCWNhc2Uga0VwbE5tdEV2ZW50UmVzZXRDb206CisJCQljYXNlIGtFcGxObXRFdmVudEludGVybkNvbUVycm9yOgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRHc1Jlc2V0Q29tbXVuaWNhdGlvbjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gTk1UIENvbW1hbmQgUmVzZXRDb25maWd1cmF0aW9uCisJCQljYXNlIGtFcGxObXRFdmVudFJlc2V0Q29uZmlnOgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRHc1Jlc2V0Q29uZmlndXJhdGlvbjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gTk1UIENvbW1hbmQgU3RvcE5vZGUKKwkJCWNhc2Uga0VwbE5tdEV2ZW50U3RvcE5vZGU6CisJCQkJeworCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdENzU3RvcHBlZDsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gZXJyb3Igb2NjdXJlZAorCQkJY2FzZSBrRXBsTm10RXZlbnRObXRDeWNsZUVycm9yOgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRDc1ByZU9wZXJhdGlvbmFsMTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gTk1UIENvbW1hbmQgU3RhcnROb2RlCisJCQljYXNlIGtFcGxObXRFdmVudFN0YXJ0Tm9kZToKKwkJCQl7CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10Q3NPcGVyYXRpb25hbDsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQlkZWZhdWx0OgorCQkJCXsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQl9CS8vIGVuZCBvZiBzd2l0Y2goTm10RXZlbnQpCisJCQlicmVhazsKKwkJfQorCisJCS8vIG5vcm1hbCB3b3JrIHN0YXRlCisJY2FzZSBrRXBsTm10Q3NPcGVyYXRpb25hbDoKKwkJeworCisJCQkvLyBjaGVjayBldmVudHMKKwkJCXN3aXRjaCAoTm10RXZlbnQpIHsKKwkJCQkvLyBOTVQgQ29tbWFuZCBTd2l0Y2hPZmYKKwkJCWNhc2Uga0VwbE5tdEV2ZW50Q3JpdGljYWxFcnJvcjoKKwkJCWNhc2Uga0VwbE5tdEV2ZW50U3dpdGNoT2ZmOgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRHc09mZjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gTk1UIENvbW1hbmQgU3dSZXNldAorCQkJY2FzZSBrRXBsTm10RXZlbnRTd1Jlc2V0OgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRHc0luaXRpYWxpc2luZzsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gTk1UIENvbW1hbmQgUmVzZXROb2RlCisJCQljYXNlIGtFcGxObXRFdmVudFJlc2V0Tm9kZToKKwkJCQl7CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10R3NSZXNldEFwcGxpY2F0aW9uOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBOTVQgQ29tbWFuZCBSZXNldENvbW11bmljYXRpb24KKwkJCQkvLyBvciBpbnRlcm5hbCBDb21tdW5pY2F0aW9uIGVycm9yCisJCQljYXNlIGtFcGxObXRFdmVudFJlc2V0Q29tOgorCQkJY2FzZSBrRXBsTm10RXZlbnRJbnRlcm5Db21FcnJvcjoKKwkJCQl7CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10R3NSZXNldENvbW11bmljYXRpb247CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIE5NVCBDb21tYW5kIFJlc2V0Q29uZmlndXJhdGlvbgorCQkJY2FzZSBrRXBsTm10RXZlbnRSZXNldENvbmZpZzoKKwkJCQl7CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10R3NSZXNldENvbmZpZ3VyYXRpb247CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIE5NVCBDb21tYW5kIFN0b3BOb2RlCisJCQljYXNlIGtFcGxObXRFdmVudFN0b3BOb2RlOgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRDc1N0b3BwZWQ7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIE5NVCBDb21tYW5kIEVudGVyUHJlT3BlcmF0aW9uYWwyCisJCQljYXNlIGtFcGxObXRFdmVudEVudGVyUHJlT3BlcmF0aW9uYWwyOgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRDc1ByZU9wZXJhdGlvbmFsMjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gZXJyb3Igb2NjdXJlZAorCQkJY2FzZSBrRXBsTm10RXZlbnRObXRDeWNsZUVycm9yOgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRDc1ByZU9wZXJhdGlvbmFsMTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQlkZWZhdWx0OgorCQkJCXsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQl9CS8vIGVuZCBvZiBzd2l0Y2goTm10RXZlbnQpCisJCQlicmVhazsKKwkJfQorCisJCS8vIG5vZGUgc3RvcHBlZCBieSBNTgorCQkvLyAtPiBvbmx5IHByb2Nlc3MgYXN5bmNocm9ub3VzIGZyYW1lcworCWNhc2Uga0VwbE5tdENzU3RvcHBlZDoKKwkJeworCQkJLy8gY2hlY2sgZXZlbnRzCisJCQlzd2l0Y2ggKE5tdEV2ZW50KSB7CisJCQkJLy8gTk1UIENvbW1hbmQgU3dpdGNoT2ZmCisJCQljYXNlIGtFcGxObXRFdmVudENyaXRpY2FsRXJyb3I6CisJCQljYXNlIGtFcGxObXRFdmVudFN3aXRjaE9mZjoKKwkJCQl7CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10R3NPZmY7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIE5NVCBDb21tYW5kIFN3UmVzZXQKKwkJCWNhc2Uga0VwbE5tdEV2ZW50U3dSZXNldDoKKwkJCQl7CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10R3NJbml0aWFsaXNpbmc7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIE5NVCBDb21tYW5kIFJlc2V0Tm9kZQorCQkJY2FzZSBrRXBsTm10RXZlbnRSZXNldE5vZGU6CisJCQkJeworCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdEdzUmVzZXRBcHBsaWNhdGlvbjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gTk1UIENvbW1hbmQgUmVzZXRDb21tdW5pY2F0aW9uCisJCQkJLy8gb3IgaW50ZXJuYWwgQ29tbXVuaWNhdGlvbiBlcnJvcgorCQkJY2FzZSBrRXBsTm10RXZlbnRSZXNldENvbToKKwkJCWNhc2Uga0VwbE5tdEV2ZW50SW50ZXJuQ29tRXJyb3I6CisJCQkJeworCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdEdzUmVzZXRDb21tdW5pY2F0aW9uOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBOTVQgQ29tbWFuZCBSZXNldENvbmZpZ3VyYXRpb24KKwkJCWNhc2Uga0VwbE5tdEV2ZW50UmVzZXRDb25maWc6CisJCQkJeworCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdEdzUmVzZXRDb25maWd1cmF0aW9uOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBOTVQgQ29tbWFuZCBFbnRlclByZU9wZXJhdGlvbmFsMgorCQkJY2FzZSBrRXBsTm10RXZlbnRFbnRlclByZU9wZXJhdGlvbmFsMjoKKwkJCQl7CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10Q3NQcmVPcGVyYXRpb25hbDI7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIGVycm9yIG9jY3VyZWQKKwkJCWNhc2Uga0VwbE5tdEV2ZW50Tm10Q3ljbGVFcnJvcjoKKwkJCQl7CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10Q3NQcmVPcGVyYXRpb25hbDE7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJZGVmYXVsdDoKKwkJCQl7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJfQkvLyBlbmQgb2Ygc3dpdGNoKE5tdEV2ZW50KQorCQkJYnJlYWs7CisJCX0KKworCQkvLyBubyBlcGwgY3ljbGUKKwkJLy8gLT4gbm9ybWFsIGV0aGVybmV0IGNvbW11bmljYXRpb24KKwljYXNlIGtFcGxObXRDc0Jhc2ljRXRoZXJuZXQ6CisJCXsKKwkJCS8vIGNoZWNrIGV2ZW50cworCQkJc3dpdGNoIChObXRFdmVudCkgeworCQkJCS8vIE5NVCBDb21tYW5kIFN3aXRjaE9mZgorCQkJY2FzZSBrRXBsTm10RXZlbnRDcml0aWNhbEVycm9yOgorCQkJY2FzZSBrRXBsTm10RXZlbnRTd2l0Y2hPZmY6CisJCQkJeworCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdEdzT2ZmOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBOTVQgQ29tbWFuZCBTd1Jlc2V0CisJCQljYXNlIGtFcGxObXRFdmVudFN3UmVzZXQ6CisJCQkJeworCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdEdzSW5pdGlhbGlzaW5nOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBOTVQgQ29tbWFuZCBSZXNldE5vZGUKKwkJCWNhc2Uga0VwbE5tdEV2ZW50UmVzZXROb2RlOgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRHc1Jlc2V0QXBwbGljYXRpb247CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIE5NVCBDb21tYW5kIFJlc2V0Q29tbXVuaWNhdGlvbgorCQkJCS8vIG9yIGludGVybmFsIENvbW11bmljYXRpb24gZXJyb3IKKwkJCWNhc2Uga0VwbE5tdEV2ZW50UmVzZXRDb206CisJCQljYXNlIGtFcGxObXRFdmVudEludGVybkNvbUVycm9yOgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRHc1Jlc2V0Q29tbXVuaWNhdGlvbjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gTk1UIENvbW1hbmQgUmVzZXRDb25maWd1cmF0aW9uCisJCQljYXNlIGtFcGxObXRFdmVudFJlc2V0Q29uZmlnOgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRHc1Jlc2V0Q29uZmlndXJhdGlvbjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gZXJyb3Igb2NjdXJlZAorCQkJCS8vIGQuay46IGhvdyBkb2VzIHRoaXMgZXJyb3Igb2NjdXI/IG9uIENSQyBlcnJvcnMKKy8qICAgICAgICAgICAgICAgIGNhc2Uga0VwbE5tdEV2ZW50Tm10Q3ljbGVFcnJvcjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9IGtFcGxObXRDc1ByZU9wZXJhdGlvbmFsMTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorKi8KKwkJCWNhc2Uga0VwbE5tdEV2ZW50RGxsQ2VTb2M6CisJCQljYXNlIGtFcGxObXRFdmVudERsbENlUHJlcToKKwkJCWNhc2Uga0VwbE5tdEV2ZW50RGxsQ2VQcmVzOgorCQkJY2FzZSBrRXBsTm10RXZlbnREbGxDZVNvYToKKwkJCQl7CS8vIEVwbC1GcmFtZSBvbiBuZXQgLT4gc3RvcCBhbnkgY29tbXVuaWNhdGlvbgorCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdENzUHJlT3BlcmF0aW9uYWwxOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCWRlZmF1bHQ6CisJCQkJeworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCX0JLy8gZW5kIG9mIHN3aXRjaChObXRFdmVudCkKKworCQkJYnJlYWs7CisJCX0KKworCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCS8vIE1OIHBhcnQgb2YgdGhlIHN0YXRlbWFzY2hpbmUKKworCQkvLyBNTiBsaXN0ZW4gdG8gbmV0d29yaworCQkvLyAtPiBpZiBubyBFUEwgdHJhZmZpYyBnbyB0byBuZXh0IHN0YXRlCisJY2FzZSBrRXBsTm10TXNOb3RBY3RpdmU6CisJCXsKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UX01OKSkgPT0gMCkKKwkJCS8vIG5vIE1OIGZ1bmN0aW9uYWxpdHkKKwkJCS8vIFRPRE86IC1jcmVhdGUgZXJyb3IgRV9OTVRfQkExX05PX01OX1NVUFBPUlQKKwkJCUVQTF9NQ09fR0xCX1ZBUihtX2ZGcm96ZW4pID0gVFJVRTsKKyNlbHNlCisKKwkJCS8vIGNoZWNrIGV2ZW50cworCQkJc3dpdGNoIChObXRFdmVudCkgeworCQkJCS8vIE5NVCBDb21tYW5kIFN3aXRjaE9mZgorCQkJY2FzZSBrRXBsTm10RXZlbnRDcml0aWNhbEVycm9yOgorCQkJY2FzZSBrRXBsTm10RXZlbnRTd2l0Y2hPZmY6CisJCQkJeworCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdEdzT2ZmOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBOTVQgQ29tbWFuZCBTd1Jlc2V0CisJCQljYXNlIGtFcGxObXRFdmVudFN3UmVzZXQ6CisJCQkJeworCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdEdzSW5pdGlhbGlzaW5nOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBOTVQgQ29tbWFuZCBSZXNldE5vZGUKKwkJCWNhc2Uga0VwbE5tdEV2ZW50UmVzZXROb2RlOgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRHc1Jlc2V0QXBwbGljYXRpb247CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIE5NVCBDb21tYW5kIFJlc2V0Q29tbXVuaWNhdGlvbgorCQkJCS8vIG9yIGludGVybmFsIENvbW11bmljYXRpb24gZXJyb3IKKwkJCWNhc2Uga0VwbE5tdEV2ZW50UmVzZXRDb206CisJCQljYXNlIGtFcGxObXRFdmVudEludGVybkNvbUVycm9yOgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRHc1Jlc2V0Q29tbXVuaWNhdGlvbjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gTk1UIENvbW1hbmQgUmVzZXRDb25maWd1cmF0aW9uCisJCQljYXNlIGtFcGxObXRFdmVudFJlc2V0Q29uZmlnOgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRHc1Jlc2V0Q29uZmlndXJhdGlvbjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gRVBMIGZyYW1lcyByZWNlaXZlZAorCQkJY2FzZSBrRXBsTm10RXZlbnREbGxDZVNvYzoKKwkJCWNhc2Uga0VwbE5tdEV2ZW50RGxsQ2VTb2E6CisJCQkJewkvLyBvdGhlciBNTiBpbiBuZXR3b3JrCisJCQkJCS8vICQkJCBkLmsuOiBnZW5lcmF0ZSBlcnJvciBoaXN0b3J5IGVudHJ5CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX2ZGcm96ZW4pID0gVFJVRTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gdGltZW91dCBldmVudAorCQkJY2FzZSBrRXBsTm10RXZlbnRUaW1lckJhc2ljRXRoZXJuZXQ6CisJCQkJeworCQkJCQlpZiAoRVBMX01DT19HTEJfVkFSKG1fZkZyb3plbikgPT0gRkFMU0UpIHsJLy8gbmV3IHN0YXRlIEJhc2ljRXRoZXJuZXQKKwkJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCQkgICAga0VwbE5tdE1zQmFzaWNFdGhlcm5ldDsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyB0aW1lb3V0IGV2ZW50CisJCQljYXNlIGtFcGxObXRFdmVudFRpbWVyTXNQcmVPcDE6CisJCQkJeworCQkJCQlpZiAoRVBMX01DT19HTEJfVkFSKG1fZkZyb3plbikgPT0gRkFMU0UpIHsJLy8gbmV3IHN0YXRlIFByZU9wMQorCQkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJCSAgICBrRXBsTm10TXNQcmVPcGVyYXRpb25hbDE7CisJCQkJCQlFUExfTUNPX0dMQl9WQVIKKwkJCQkJCSAgICAobV9mVGltZXJNc1ByZU9wMikgPSBGQUxTRTsKKwkJCQkJCUVQTF9NQ09fR0xCX1ZBUgorCQkJCQkJICAgIChtX2ZBbGxNYW5kYXRvcnlDTklkZW50KSA9CisJCQkJCQkgICAgRkFMU0U7CisKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCWRlZmF1bHQ6CisJCQkJeworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCX0JLy8gZW5kIG9mIHN3aXRjaChObXRFdmVudCkKKworI2VuZGlmIC8vICgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRfTU4pKSA9PSAwKQorCisJCQlicmVhazsKKwkJfQorI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRfTU4pKSAhPSAwKQorCQkvLyBNTiBwcm9jZXNzIHJlZHVjZXMgZXBsIGN5Y2xlCisJY2FzZSBrRXBsTm10TXNQcmVPcGVyYXRpb25hbDE6CisJCXsKKwkJCS8vIGNoZWNrIGV2ZW50cworCQkJc3dpdGNoIChObXRFdmVudCkgeworCQkJCS8vIE5NVCBDb21tYW5kIFN3aXRjaE9mZgorCQkJY2FzZSBrRXBsTm10RXZlbnRDcml0aWNhbEVycm9yOgorCQkJY2FzZSBrRXBsTm10RXZlbnRTd2l0Y2hPZmY6CisJCQkJeworCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdEdzT2ZmOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBOTVQgQ29tbWFuZCBTd1Jlc2V0CisJCQljYXNlIGtFcGxObXRFdmVudFN3UmVzZXQ6CisJCQkJeworCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdEdzSW5pdGlhbGlzaW5nOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBOTVQgQ29tbWFuZCBSZXNldE5vZGUKKwkJCWNhc2Uga0VwbE5tdEV2ZW50UmVzZXROb2RlOgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRHc1Jlc2V0QXBwbGljYXRpb247CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIE5NVCBDb21tYW5kIFJlc2V0Q29tbXVuaWNhdGlvbgorCQkJCS8vIG9yIGludGVybmFsIENvbW11bmljYXRpb24gZXJyb3IKKwkJCWNhc2Uga0VwbE5tdEV2ZW50UmVzZXRDb206CisJCQljYXNlIGtFcGxObXRFdmVudEludGVybkNvbUVycm9yOgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRHc1Jlc2V0Q29tbXVuaWNhdGlvbjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gTk1UIENvbW1hbmQgUmVzZXRDb25maWd1cmF0aW9uCisJCQljYXNlIGtFcGxObXRFdmVudFJlc2V0Q29uZmlnOgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRHc1Jlc2V0Q29uZmlndXJhdGlvbjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gRVBMIGZyYW1lcyByZWNlaXZlZAorCQkJY2FzZSBrRXBsTm10RXZlbnREbGxDZVNvYzoKKwkJCWNhc2Uga0VwbE5tdEV2ZW50RGxsQ2VTb2E6CisJCQkJewkvLyBvdGhlciBNTiBpbiBuZXR3b3JrCisJCQkJCS8vICQkJCBkLmsuOiBnZW5lcmF0ZSBlcnJvciBoaXN0b3J5IGVudHJ5CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10R3NSZXNldENvbW11bmljYXRpb247CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIGVycm9yIG9jY3VyZWQKKwkJCQkvLyBkLmsuIE1TUHJlT3AxLT5DU1ByZU9wMTogbm9uc2Vuc2UgLT4ga2VlcCBzdGF0ZQorCQkJCS8qCisJCQkJICAgY2FzZSBrRXBsTm10RXZlbnRObXRDeWNsZUVycm9yOgorCQkJCSAgIHsKKwkJCQkgICBFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPSBrRXBsTm10Q3NQcmVPcGVyYXRpb25hbDE7CisJCQkJICAgYnJlYWs7CisJCQkJICAgfQorCQkJCSAqLworCisJCQljYXNlIGtFcGxObXRFdmVudEFsbE1hbmRhdG9yeUNOSWRlbnQ6CisJCQkJewkvLyBhbGwgbWFuZGF0b3J5IENOIGlkZW50aWZpZWQKKwkJCQkJaWYgKEVQTF9NQ09fR0xCX1ZBUihtX2ZUaW1lck1zUHJlT3AyKSAhPQorCQkJCQkgICAgRkFMU0UpIHsKKwkJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCQkgICAga0VwbE5tdE1zUHJlT3BlcmF0aW9uYWwyOworCQkJCQl9IGVsc2UgeworCQkJCQkJRVBMX01DT19HTEJfVkFSCisJCQkJCQkgICAgKG1fZkFsbE1hbmRhdG9yeUNOSWRlbnQpID0KKwkJCQkJCSAgICBUUlVFOworCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJY2FzZSBrRXBsTm10RXZlbnRUaW1lck1zUHJlT3AyOgorCQkJCXsJLy8gcmVzaWRlbmNlIHRpbWUgZm9yIFByZU9wMSBpcyBlbGFwc2VkCisJCQkJCWlmIChFUExfTUNPX0dMQl9WQVIKKwkJCQkJICAgIChtX2ZBbGxNYW5kYXRvcnlDTklkZW50KSAhPSBGQUxTRSkgeworCQkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJCSAgICBrRXBsTm10TXNQcmVPcGVyYXRpb25hbDI7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlFUExfTUNPX0dMQl9WQVIKKwkJCQkJCSAgICAobV9mVGltZXJNc1ByZU9wMikgPSBUUlVFOworCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJZGVmYXVsdDoKKwkJCQl7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJfQkvLyBlbmQgb2Ygc3dpdGNoKE5tdEV2ZW50KQorCQkJYnJlYWs7CisJCX0KKworCQkvLyBNTiBwcm9jZXNzIGZ1bGwgZXBsIGN5Y2xlCisJY2FzZSBrRXBsTm10TXNQcmVPcGVyYXRpb25hbDI6CisJCXsKKwkJCS8vIGNoZWNrIGV2ZW50cworCQkJc3dpdGNoIChObXRFdmVudCkgeworCQkJCS8vIE5NVCBDb21tYW5kIFN3aXRjaE9mZgorCQkJY2FzZSBrRXBsTm10RXZlbnRDcml0aWNhbEVycm9yOgorCQkJY2FzZSBrRXBsTm10RXZlbnRTd2l0Y2hPZmY6CisJCQkJeworCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdEdzT2ZmOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBOTVQgQ29tbWFuZCBTd1Jlc2V0CisJCQljYXNlIGtFcGxObXRFdmVudFN3UmVzZXQ6CisJCQkJeworCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdEdzSW5pdGlhbGlzaW5nOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBOTVQgQ29tbWFuZCBSZXNldE5vZGUKKwkJCWNhc2Uga0VwbE5tdEV2ZW50UmVzZXROb2RlOgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRHc1Jlc2V0QXBwbGljYXRpb247CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIE5NVCBDb21tYW5kIFJlc2V0Q29tbXVuaWNhdGlvbgorCQkJCS8vIG9yIGludGVybmFsIENvbW11bmljYXRpb24gZXJyb3IKKwkJCWNhc2Uga0VwbE5tdEV2ZW50UmVzZXRDb206CisJCQljYXNlIGtFcGxObXRFdmVudEludGVybkNvbUVycm9yOgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRHc1Jlc2V0Q29tbXVuaWNhdGlvbjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gTk1UIENvbW1hbmQgUmVzZXRDb25maWd1cmF0aW9uCisJCQljYXNlIGtFcGxObXRFdmVudFJlc2V0Q29uZmlnOgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRHc1Jlc2V0Q29uZmlndXJhdGlvbjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gRVBMIGZyYW1lcyByZWNlaXZlZAorCQkJY2FzZSBrRXBsTm10RXZlbnREbGxDZVNvYzoKKwkJCWNhc2Uga0VwbE5tdEV2ZW50RGxsQ2VTb2E6CisJCQkJewkvLyBvdGhlciBNTiBpbiBuZXR3b3JrCisJCQkJCS8vICQkJCBkLmsuOiBnZW5lcmF0ZSBlcnJvciBoaXN0b3J5IGVudHJ5CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10R3NSZXNldENvbW11bmljYXRpb247CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIGVycm9yIG9jY3VyZWQKKwkJCWNhc2Uga0VwbE5tdEV2ZW50Tm10Q3ljbGVFcnJvcjoKKwkJCQl7CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10TXNQcmVPcGVyYXRpb25hbDE7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJY2FzZSBrRXBsTm10RXZlbnRFbnRlclJlYWR5VG9PcGVyYXRlOgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRNc1JlYWR5VG9PcGVyYXRlOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCWRlZmF1bHQ6CisJCQkJeworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCX0JLy8gZW5kIG9mIHN3aXRjaChObXRFdmVudCkKKworCQkJYnJlYWs7CisJCX0KKworCQkvLyBhbGwgbWFkYXRvcnkgbm9kZXMgcmVhZHkgdG8gb3BlcmF0ZQorCQkvLyAtPiBNTiBwcm9jZXNzIGZ1bGwgZXBsIGN5Y2xlCisJY2FzZSBrRXBsTm10TXNSZWFkeVRvT3BlcmF0ZToKKwkJeworCisJCQkvLyBjaGVjayBldmVudHMKKwkJCXN3aXRjaCAoTm10RXZlbnQpIHsKKwkJCQkvLyBOTVQgQ29tbWFuZCBTd2l0Y2hPZmYKKwkJCWNhc2Uga0VwbE5tdEV2ZW50Q3JpdGljYWxFcnJvcjoKKwkJCWNhc2Uga0VwbE5tdEV2ZW50U3dpdGNoT2ZmOgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRHc09mZjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gTk1UIENvbW1hbmQgU3dSZXNldAorCQkJY2FzZSBrRXBsTm10RXZlbnRTd1Jlc2V0OgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRHc0luaXRpYWxpc2luZzsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gTk1UIENvbW1hbmQgUmVzZXROb2RlCisJCQljYXNlIGtFcGxObXRFdmVudFJlc2V0Tm9kZToKKwkJCQl7CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10R3NSZXNldEFwcGxpY2F0aW9uOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBOTVQgQ29tbWFuZCBSZXNldENvbW11bmljYXRpb24KKwkJCQkvLyBvciBpbnRlcm5hbCBDb21tdW5pY2F0aW9uIGVycm9yCisJCQljYXNlIGtFcGxObXRFdmVudFJlc2V0Q29tOgorCQkJY2FzZSBrRXBsTm10RXZlbnRJbnRlcm5Db21FcnJvcjoKKwkJCQl7CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10R3NSZXNldENvbW11bmljYXRpb247CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIE5NVCBDb21tYW5kIFJlc2V0Q29uZmlndXJhdGlvbgorCQkJY2FzZSBrRXBsTm10RXZlbnRSZXNldENvbmZpZzoKKwkJCQl7CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10R3NSZXNldENvbmZpZ3VyYXRpb247CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIEVQTCBmcmFtZXMgcmVjZWl2ZWQKKwkJCWNhc2Uga0VwbE5tdEV2ZW50RGxsQ2VTb2M6CisJCQljYXNlIGtFcGxObXRFdmVudERsbENlU29hOgorCQkJCXsJLy8gb3RoZXIgTU4gaW4gbmV0d29yaworCQkJCQkvLyAkJCQgZC5rLjogZ2VuZXJhdGUgZXJyb3IgaGlzdG9yeSBlbnRyeQorCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdEdzUmVzZXRDb21tdW5pY2F0aW9uOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBlcnJvciBvY2N1cmVkCisJCQljYXNlIGtFcGxObXRFdmVudE5tdEN5Y2xlRXJyb3I6CisJCQkJeworCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdE1zUHJlT3BlcmF0aW9uYWwxOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCWNhc2Uga0VwbE5tdEV2ZW50RW50ZXJNc09wZXJhdGlvbmFsOgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRNc09wZXJhdGlvbmFsOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCWRlZmF1bHQ6CisJCQkJeworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCX0JLy8gZW5kIG9mIHN3aXRjaChObXRFdmVudCkKKworCQkJYnJlYWs7CisJCX0KKworCQkvLyBub3JtYWwgZXBsY3ljbGUgcHJvY2Vzc2luZworCWNhc2Uga0VwbE5tdE1zT3BlcmF0aW9uYWw6CisJCXsKKwkJCS8vIGNoZWNrIGV2ZW50cworCQkJc3dpdGNoIChObXRFdmVudCkgeworCQkJCS8vIE5NVCBDb21tYW5kIFN3aXRjaE9mZgorCQkJY2FzZSBrRXBsTm10RXZlbnRDcml0aWNhbEVycm9yOgorCQkJY2FzZSBrRXBsTm10RXZlbnRTd2l0Y2hPZmY6CisJCQkJeworCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdEdzT2ZmOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBOTVQgQ29tbWFuZCBTd1Jlc2V0CisJCQljYXNlIGtFcGxObXRFdmVudFN3UmVzZXQ6CisJCQkJeworCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdEdzSW5pdGlhbGlzaW5nOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBOTVQgQ29tbWFuZCBSZXNldE5vZGUKKwkJCWNhc2Uga0VwbE5tdEV2ZW50UmVzZXROb2RlOgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRHc1Jlc2V0QXBwbGljYXRpb247CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIE5NVCBDb21tYW5kIFJlc2V0Q29tbXVuaWNhdGlvbgorCQkJCS8vIG9yIGludGVybmFsIENvbW11bmljYXRpb24gZXJyb3IKKwkJCWNhc2Uga0VwbE5tdEV2ZW50UmVzZXRDb206CisJCQljYXNlIGtFcGxObXRFdmVudEludGVybkNvbUVycm9yOgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRHc1Jlc2V0Q29tbXVuaWNhdGlvbjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gTk1UIENvbW1hbmQgUmVzZXRDb25maWd1cmF0aW9uCisJCQljYXNlIGtFcGxObXRFdmVudFJlc2V0Q29uZmlnOgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRHc1Jlc2V0Q29uZmlndXJhdGlvbjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gRVBMIGZyYW1lcyByZWNlaXZlZAorCQkJY2FzZSBrRXBsTm10RXZlbnREbGxDZVNvYzoKKwkJCWNhc2Uga0VwbE5tdEV2ZW50RGxsQ2VTb2E6CisJCQkJewkvLyBvdGhlciBNTiBpbiBuZXR3b3JrCisJCQkJCS8vICQkJCBkLmsuOiBnZW5lcmF0ZSBlcnJvciBoaXN0b3J5IGVudHJ5CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10R3NSZXNldENvbW11bmljYXRpb247CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIGVycm9yIG9jY3VyZWQKKwkJCWNhc2Uga0VwbE5tdEV2ZW50Tm10Q3ljbGVFcnJvcjoKKwkJCQl7CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10TXNQcmVPcGVyYXRpb25hbDE7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJZGVmYXVsdDoKKwkJCQl7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJfQkvLyBlbmQgb2Ygc3dpdGNoKE5tdEV2ZW50KQorCQkJYnJlYWs7CisJCX0KKworCQkvLyAgbm9ybWFsIGV0aGVybmV0IHRyYWZmaWMKKwljYXNlIGtFcGxObXRNc0Jhc2ljRXRoZXJuZXQ6CisJCXsKKworCQkJLy8gY2hlY2sgZXZlbnRzCisJCQlzd2l0Y2ggKE5tdEV2ZW50KSB7CisJCQkJLy8gTk1UIENvbW1hbmQgU3dpdGNoT2ZmCisJCQljYXNlIGtFcGxObXRFdmVudENyaXRpY2FsRXJyb3I6CisJCQljYXNlIGtFcGxObXRFdmVudFN3aXRjaE9mZjoKKwkJCQl7CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10R3NPZmY7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIE5NVCBDb21tYW5kIFN3UmVzZXQKKwkJCWNhc2Uga0VwbE5tdEV2ZW50U3dSZXNldDoKKwkJCQl7CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10R3NJbml0aWFsaXNpbmc7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIE5NVCBDb21tYW5kIFJlc2V0Tm9kZQorCQkJY2FzZSBrRXBsTm10RXZlbnRSZXNldE5vZGU6CisJCQkJeworCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdEdzUmVzZXRBcHBsaWNhdGlvbjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gTk1UIENvbW1hbmQgUmVzZXRDb21tdW5pY2F0aW9uCisJCQkJLy8gb3IgaW50ZXJuYWwgQ29tbXVuaWNhdGlvbiBlcnJvcgorCQkJY2FzZSBrRXBsTm10RXZlbnRSZXNldENvbToKKwkJCWNhc2Uga0VwbE5tdEV2ZW50SW50ZXJuQ29tRXJyb3I6CisJCQkJeworCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdEdzUmVzZXRDb21tdW5pY2F0aW9uOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBOTVQgQ29tbWFuZCBSZXNldENvbmZpZ3VyYXRpb24KKwkJCWNhc2Uga0VwbE5tdEV2ZW50UmVzZXRDb25maWc6CisJCQkJeworCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdEdzUmVzZXRDb25maWd1cmF0aW9uOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBFUEwgZnJhbWVzIHJlY2VpdmVkCisJCQljYXNlIGtFcGxObXRFdmVudERsbENlU29jOgorCQkJY2FzZSBrRXBsTm10RXZlbnREbGxDZVNvYToKKwkJCQl7CS8vIG90aGVyIE1OIGluIG5ldHdvcmsKKwkJCQkJLy8gJCQkIGQuay46IGdlbmVyYXRlIGVycm9yIGhpc3RvcnkgZW50cnkKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRHc1Jlc2V0Q29tbXVuaWNhdGlvbjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gZXJyb3Igb2NjdXJlZAorCQkJCS8vIGQuay4gQkUtPlByZU9wMSBvbiBjeWNsZSBlcnJvcj8gTm8KKy8qICAgICAgICAgICAgICAgIGNhc2Uga0VwbE5tdEV2ZW50Tm10Q3ljbGVFcnJvcjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9IGtFcGxObXRDc1ByZU9wZXJhdGlvbmFsMTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorKi8KKwkJCWRlZmF1bHQ6CisJCQkJeworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCX0JLy8gZW5kIG9mIHN3aXRjaChObXRFdmVudCkKKwkJCWJyZWFrOworCQl9CisjZW5kaWYgLy8jaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVF9NTikpICE9IDApCisKKwlkZWZhdWx0OgorCQl7CisJCQkvL0RFQlVHX0VQTF9EQkdMVkxfTk1US19UUkFDRTAoRVBMX0RCR0xWTF9OTVQgLCJFcnJvciBpbiBFcGxObXRQcm9jZXNzOiBVbmtub3duIE5NVC1TdGF0ZSIpOworCQkJLy9FUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPSBrRXBsTm10R3NSZXNldEFwcGxpY2F0aW9uOworCQkJUmV0ID0ga0VwbE5tdEludmFsaWRTdGF0ZTsKKwkJCWdvdG8gRXhpdDsKKwkJfQorCisJfQkJCS8vIGVuZCBvZiBzd2l0Y2goTm10RXZlbnQpCisKKwkvLyBpbmZvcm0gaGlnaGVyIGxheWVyIGFib3V0IFN0YXRlLUNoYW5nZSBpZiBuZWVkZWQKKwlpZiAoT2xkTm10U3RhdGUgIT0gRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpKSB7CisJCUVQTF9OTVRLX0RCR19QT1NUX1RSQUNFX1ZBTFVFKE5tdEV2ZW50LCBPbGRObXRTdGF0ZSwKKwkJCQkJICAgICAgRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpKTsKKworCQkvLyBkLmsuOiBtZW1vcml6ZSBOTVQgc3RhdGUgYmVmb3JlIHBvc3RpbmcgYW55IGV2ZW50cworCQlObXRTdGF0ZUNoYW5nZS5tX05ld05tdFN0YXRlID0gRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpOworCisJCS8vIGluZm9ybSBETEwKKwkJaWYgKChPbGRObXRTdGF0ZSA+IGtFcGxObXRHc1Jlc2V0Q29uZmlndXJhdGlvbikKKwkJICAgICYmIChFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPD0KKwkJCWtFcGxObXRHc1Jlc2V0Q29uZmlndXJhdGlvbikpIHsKKwkJCS8vIHNlbmQgRExMIERFSU5JVAorCQkJRXZlbnQubV9FdmVudFNpbmsgPSBrRXBsRXZlbnRTaW5rRGxsazsKKwkJCUV2ZW50Lm1fRXZlbnRUeXBlID0ga0VwbEV2ZW50VHlwZURsbGtEZXN0cm95OworCQkJRVBMX01FTVNFVCgmRXZlbnQubV9OZXRUaW1lLCAweDAwLAorCQkJCSAgIHNpemVvZihFdmVudC5tX05ldFRpbWUpKTsKKwkJCUV2ZW50Lm1fcEFyZyA9ICZPbGRObXRTdGF0ZTsKKwkJCUV2ZW50Lm1fdWlTaXplID0gc2l6ZW9mKE9sZE5tdFN0YXRlKTsKKwkJCS8vIGQuay46IGRpcmVjdGx5IGNhbGwgRExMayBwcm9jZXNzIGZ1bmN0aW9uLCBiZWNhdXNlCisJCQkvLyAgICAgICAxLiBleGVjdXRpb24gb2YgcHJvY2VzcyBmdW5jdGlvbiBpcyBzdGlsbCBzeW5jaG9uaXplZCBhbmQgc2VyaWFsaXplZCwKKwkJCS8vICAgICAgIDIuIGl0IGlzIHRoZSBzYW1lIGFzIHdpdGhvdXQgZXZlbnQgcXVldWVzIChpLmUuIHdlbGwgdGVzdGVkKSwKKwkJCS8vICAgICAgIDMuIERMTGsgd2lsbCBnZXQgdGhvc2UgbmVjZXNzYXJ5IGV2ZW50cyBldmVuIGlmIGV2ZW50IHF1ZXVlIGlzIGZ1bGwsCisJCQkvLyAgICAgICA0LiBldmVudCBxdWV1ZSBpcyB2ZXJ5IGluZWZmaWNpZW50CisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX0RMTEspKSAhPSAwKQorCQkJUmV0ID0gRXBsRGxsa1Byb2Nlc3MoJkV2ZW50KTsKKyNlbHNlCisJCQlSZXQgPSBFcGxFdmVudGtQb3N0KCZFdmVudCk7CisjZW5kaWYKKwkJfSBlbHNlIGlmICgoT2xkTm10U3RhdGUgPD0ga0VwbE5tdEdzUmVzZXRDb25maWd1cmF0aW9uKQorCQkJICAgJiYgKEVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA+CisJCQkgICAgICAga0VwbE5tdEdzUmVzZXRDb25maWd1cmF0aW9uKSkgeworCQkJLy8gc2VuZCBETEwgSU5JVAorCQkJRXZlbnQubV9FdmVudFNpbmsgPSBrRXBsRXZlbnRTaW5rRGxsazsKKwkJCUV2ZW50Lm1fRXZlbnRUeXBlID0ga0VwbEV2ZW50VHlwZURsbGtDcmVhdGU7CisJCQlFUExfTUVNU0VUKCZFdmVudC5tX05ldFRpbWUsIDB4MDAsCisJCQkJICAgc2l6ZW9mKEV2ZW50Lm1fTmV0VGltZSkpOworCQkJRXZlbnQubV9wQXJnID0gJk5tdFN0YXRlQ2hhbmdlLm1fTmV3Tm10U3RhdGU7CisJCQlFdmVudC5tX3VpU2l6ZSA9IHNpemVvZihObXRTdGF0ZUNoYW5nZS5tX05ld05tdFN0YXRlKTsKKwkJCS8vIGQuay46IGRpcmVjdGx5IGNhbGwgRExMayBwcm9jZXNzIGZ1bmN0aW9uLCBiZWNhdXNlCisJCQkvLyAgICAgICAxLiBleGVjdXRpb24gb2YgcHJvY2VzcyBmdW5jdGlvbiBpcyBzdGlsbCBzeW5jaG9uaXplZCBhbmQgc2VyaWFsaXplZCwKKwkJCS8vICAgICAgIDIuIGl0IGlzIHRoZSBzYW1lIGFzIHdpdGhvdXQgZXZlbnQgcXVldWVzIChpLmUuIHdlbGwgdGVzdGVkKSwKKwkJCS8vICAgICAgIDMuIERMTGsgd2lsbCBnZXQgdGhvc2UgbmVjZXNzYXJ5IGV2ZW50cyBldmVuIGlmIGV2ZW50IHF1ZXVlIGlzIGZ1bGwKKwkJCS8vICAgICAgIDQuIGV2ZW50IHF1ZXVlIGlzIHZlcnkgaW5lZmZpY2llbnQKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfRExMSykpICE9IDApCisJCQlSZXQgPSBFcGxEbGxrUHJvY2VzcygmRXZlbnQpOworI2Vsc2UKKwkJCVJldCA9IEVwbEV2ZW50a1Bvc3QoJkV2ZW50KTsKKyNlbmRpZgorCQl9IGVsc2UKKwkJICAgIGlmICgoRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID09IGtFcGxObXRDc0Jhc2ljRXRoZXJuZXQpCisJCQl8fCAoRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID09CisJCQkgICAga0VwbE5tdE1zQmFzaWNFdGhlcm5ldCkpIHsKKwkJCXRFcGxEbGxBc3luY1JlcVByaW9yaXR5IEFzeW5jUmVxUHJpb3JpdHk7CisKKwkJCS8vIHNlbmQgRExMIEZpbGwgQXN5bmMgVHggQnVmZmVyLCBiZWNhdXNlIHN0YXRlIEJhc2ljRXRoZXJuZXQgd2FzIGVudGVyZWQKKwkJCUV2ZW50Lm1fRXZlbnRTaW5rID0ga0VwbEV2ZW50U2lua0RsbGs7CisJCQlFdmVudC5tX0V2ZW50VHlwZSA9IGtFcGxFdmVudFR5cGVEbGxrRmlsbFR4OworCQkJRVBMX01FTVNFVCgmRXZlbnQubV9OZXRUaW1lLCAweDAwLAorCQkJCSAgIHNpemVvZihFdmVudC5tX05ldFRpbWUpKTsKKwkJCUFzeW5jUmVxUHJpb3JpdHkgPSBrRXBsRGxsQXN5bmNSZXFQcmlvR2VuZXJpYzsKKwkJCUV2ZW50Lm1fcEFyZyA9ICZBc3luY1JlcVByaW9yaXR5OworCQkJRXZlbnQubV91aVNpemUgPSBzaXplb2YoQXN5bmNSZXFQcmlvcml0eSk7CisJCQkvLyBkLmsuOiBkaXJlY3RseSBjYWxsIERMTGsgcHJvY2VzcyBmdW5jdGlvbiwgYmVjYXVzZQorCQkJLy8gICAgICAgMS4gZXhlY3V0aW9uIG9mIHByb2Nlc3MgZnVuY3Rpb24gaXMgc3RpbGwgc3luY2hvbml6ZWQgYW5kIHNlcmlhbGl6ZWQsCisJCQkvLyAgICAgICAyLiBpdCBpcyB0aGUgc2FtZSBhcyB3aXRob3V0IGV2ZW50IHF1ZXVlcyAoaS5lLiB3ZWxsIHRlc3RlZCksCisJCQkvLyAgICAgICAzLiBETExrIHdpbGwgZ2V0IHRob3NlIG5lY2Vzc2FyeSBldmVudHMgZXZlbiBpZiBldmVudCBxdWV1ZSBpcyBmdWxsCisJCQkvLyAgICAgICA0LiBldmVudCBxdWV1ZSBpcyB2ZXJ5IGluZWZmaWNpZW50CisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX0RMTEspKSAhPSAwKQorCQkJUmV0ID0gRXBsRGxsa1Byb2Nlc3MoJkV2ZW50KTsKKyNlbHNlCisJCQlSZXQgPSBFcGxFdmVudGtQb3N0KCZFdmVudCk7CisjZW5kaWYKKwkJfQorCQkvLyBpbmZvcm0gaGlnaGVyIGxheWVyIGFib3V0IHN0YXRlIGNoYW5nZQorCQlObXRTdGF0ZUNoYW5nZS5tX05tdEV2ZW50ID0gTm10RXZlbnQ7CisJCUV2ZW50Lm1fRXZlbnRTaW5rID0ga0VwbEV2ZW50U2lua05tdHU7CisJCUV2ZW50Lm1fRXZlbnRUeXBlID0ga0VwbEV2ZW50VHlwZU5tdFN0YXRlQ2hhbmdlOworCQlFUExfTUVNU0VUKCZFdmVudC5tX05ldFRpbWUsIDB4MDAsIHNpemVvZihFdmVudC5tX05ldFRpbWUpKTsKKwkJRXZlbnQubV9wQXJnID0gJk5tdFN0YXRlQ2hhbmdlOworCQlFdmVudC5tX3VpU2l6ZSA9IHNpemVvZihObXRTdGF0ZUNoYW5nZSk7CisJCVJldCA9IEVwbEV2ZW50a1Bvc3QoJkV2ZW50KTsKKwkJRVBMX0RCR0xWTF9OTVRLX1RSQUNFMgorCQkgICAgKCJFcGxObXRrUHJvY2VzcyhOTVQtRXZlbnQgPSAweCUwNFgpOiBOZXcgTk1ULVN0YXRlID0gMHglMDNYXG4iLAorCQkgICAgIE5tdEV2ZW50LCBObXRTdGF0ZUNoYW5nZS5tX05ld05tdFN0YXRlKTsKKworCX0KKworICAgICAgRXhpdDoKKworCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE5tdGtHZXRObXRTdGF0ZQorLy8KKy8vIERlc2NyaXB0aW9uOiByZXR1cm4gdGhlIGFjdHVlbGwgTk1ULVN0YXRlIGFuZCB0aGUgYml0cworLy8gICAgICAgICAgICAgIHRvIGZvciBNTi0gb3IgQ04tbW9kZQorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczogIEVQTF9NQ09fREVDTF9QVFJfSU5TVEFOQ0VfUFRSXyA9IEluc3RhbmNlcG9pbnRlcgorLy8KKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbE5tdFN0YXRlID0gTk1ULVN0YXRlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdEVwbE5tdFN0YXRlIFBVQkxJQworRXBsTm10a0dldE5tdFN0YXRlKEVQTF9NQ09fREVDTF9QVFJfSU5TVEFOQ0VfUFRSKQoreworCXRFcGxObXRTdGF0ZSBObXRTdGF0ZTsKKworCU5tdFN0YXRlID0gRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpOworCisJcmV0dXJuIE5tdFN0YXRlOworCit9CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgUCBSIEkgViBBIFQgRSAgIEQgRSBGIEkgTiBJIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworRVBMX01DT19ERUNMX0lOU1RBTkNFX0ZDVCgpCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOgorLy8KKy8vIERlc2NyaXB0aW9uOgorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczoKKy8vCisvLworLy8gUmV0dXJuczoKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNlbmRpZiAvLyAjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVEspKSAhPSAwKQorLy8gRU9GCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbE5tdGtDYWwuYyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsTm10a0NhbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhZDcxYTcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbE5tdGtDYWwuYwpAQCAtMCwwICsxLDE0OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIHNvdXJjZSBmaWxlIGZvciBjb21tdW5pY2F0aW9uIGFic3RyYWN0aW9uIGxheWVyIG9mIHRoZQorICAgICAgICAgICAgICAgIE5NVC1LZXJuZWwtTW9kdWxlCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRXBsTm10a0NhbC5jLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS4zICQgICREYXRlOiAyMDA4LzA0LzE3IDIxOjM2OjMyICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorICAgICAgICAgICAgICAgIEtFSUwgdVZpc2lvbiAyCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwNi8wNi8xNiAtay50LjogICBzdGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgImtlcm5lbC9FcGxObXRrQ2FsLmgiCisKKy8vIFRPRE86IGluaXQgZnVuY3Rpb24gbmVlZGVkIHRvIHByZXBhcmUgRXBsTm10a0dldE5tdFN0YXRlIGZvcgorLy8gICAgICAgaW8tY29udHJvbGwtY2FsbCBmcm9tIEVwbE5tdHVDYWwtTW9kdWwKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgRyBMIE8gQiBBIEwgICBEIEUgRiBJIE4gSSBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvbnN0IGRlZmluZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCB0eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIG1vZHVsIGdsb2JhbGUgdmFycworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgUCBVIEIgTCBJIEMgICBGIFUgTiBDIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOgorLy8KKy8vIERlc2NyaXB0aW9uOgorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczoKKy8vCisvLworLy8gUmV0dXJuczoKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICBQIFIgSSBWIEEgVCBFICAgRiBVIE4gQyBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246CisvLworLy8gRGVzY3JpcHRpb246CisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOgorLy8KKy8vCisvLyBSZXR1cm5zOgorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBFT0YKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsTm10dS5jIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxObXR1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2RlMTZhMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsTm10dS5jCkBAIC0wLDAgKzEsNzA4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgb3BlblBPV0VSTElOSworCisgIERlc2NyaXB0aW9uOiAgc291cmNlIGZpbGUgZm9yIE5NVC1Vc2Vyc3BhY2UtTW9kdWxlCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRXBsTm10dS5jLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS44ICQgICREYXRlOiAyMDA4LzExLzEwIDE3OjE3OjQyICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorICAgICAgICAgICAgICAgICAgICBHQ0MgVjMuNAorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgIDIwMDYvMDYvMDkgay50LjogICBzdGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkVwbEluYy5oIgorI2luY2x1ZGUgInVzZXIvRXBsTm10dS5oIgorI2luY2x1ZGUgInVzZXIvRXBsT2JkdS5oIgorI2luY2x1ZGUgInVzZXIvRXBsVGltZXJ1LmgiCisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVEspKSAhPSAwKQorI2luY2x1ZGUgImtlcm5lbC9FcGxObXRrLmgiCisjZW5kaWYKKworI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRVKSkgIT0gMCkKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIEcgTCBPIEIgQSBMICAgRCBFIEYgSSBOIEkgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3R5cGVkZWYgc3RydWN0IHsKKwl0RXBsTm10dVN0YXRlQ2hhbmdlQ2FsbGJhY2sgbV9wZm5ObXRDaGFuZ2VDYjsKKwl0RXBsVGltZXJIZGwgbV9UaW1lckhkbDsKKworfSB0RXBsTm10dUluc3RhbmNlOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbW9kdWwgZ2xvYmFsZSB2YXJzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdEVwbE5tdHVJbnN0YW5jZSBFcGxObXR1SW5zdGFuY2VfZzsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgUCBVIEIgTCBJIEMgICBGIFUgTiBDIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxObXR1SW5pdAorLy8KKy8vIERlc2NyaXB0aW9uOiBpbml0IGZpcnN0IGluc3RhbmNlIG9mIHRoZSBtb2R1bGUKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6CisvLworLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICA9IGVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbE5tdHVJbml0KCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKworCVJldCA9IEVwbE5tdHVBZGRJbnN0YW5jZSgpOworCisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsTm10dUFkZEluc3RhbmNlCisvLworLy8gRGVzY3JpcHRpb246IGluaXQgb3RoZXIgaW5zdGFuY2VzIG9mIHRoZSBtb2R1bGUKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6CisvLworLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICA9IGVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbE5tdHVBZGRJbnN0YW5jZSgpCit7CisJdEVwbEtlcm5lbCBSZXQ7CisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCUVwbE5tdHVJbnN0YW5jZV9nLm1fcGZuTm10Q2hhbmdlQ2IgPSBOVUxMOworCisJcmV0dXJuIFJldDsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxObXR1RGVsSW5zdGFuY2UKKy8vCisvLyBEZXNjcmlwdGlvbjogZGVsZXRlIGluc3RhbmNlCisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOgorLy8KKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgPSBlcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxObXR1RGVsSW5zdGFuY2UoKQoreworCXRFcGxLZXJuZWwgUmV0OworCisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwlFcGxObXR1SW5zdGFuY2VfZy5tX3Bmbk5tdENoYW5nZUNiID0gTlVMTDsKKworCS8vIGRlbGV0ZSB0aW1lcgorCVJldCA9IEVwbFRpbWVydURlbGV0ZVRpbWVyKCZFcGxObXR1SW5zdGFuY2VfZy5tX1RpbWVySGRsKTsKKworCXJldHVybiBSZXQ7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsTm10dU5tdEV2ZW50CisvLworLy8gRGVzY3JpcHRpb246IHNlbmRzIHRoZSBOTVQtRXZlbnQgdG8gdGhlIE5NVC1TdGF0ZS1NYXNjaGluZQorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczogIE5tdEV2ZW50X3AgID0gTk1ULUV2ZW50IHRvIHNlbmQKKy8vCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgID0gZXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMgRXBsTm10dU5tdEV2ZW50KHRFcGxObXRFdmVudCBObXRFdmVudF9wKQoreworCXRFcGxLZXJuZWwgUmV0OworCXRFcGxFdmVudCBFdmVudDsKKworCUV2ZW50Lm1fRXZlbnRTaW5rID0ga0VwbEV2ZW50U2lua05tdGs7CisJRXZlbnQubV9OZXRUaW1lLm1fZHdOYW5vU2VjID0gMDsKKwlFdmVudC5tX05ldFRpbWUubV9kd1NlYyA9IDA7CisJRXZlbnQubV9FdmVudFR5cGUgPSBrRXBsRXZlbnRUeXBlTm10RXZlbnQ7CisJRXZlbnQubV9wQXJnID0gJk5tdEV2ZW50X3A7CisJRXZlbnQubV91aVNpemUgPSBzaXplb2YoTm10RXZlbnRfcCk7CisKKwlSZXQgPSBFcGxFdmVudHVQb3N0KCZFdmVudCk7CisKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxObXR1R2V0Tm10U3RhdGUKKy8vCisvLyBEZXNjcmlwdGlvbjogcmV0dXJucyB0aGUgYWN0dWVsbCBOTVQtU3RhdGUKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6CisvLworLy8KKy8vIFJldHVybnM6ICAgICB0RXBsTm10U3RhdGUgID0gTk1ULVN0YXRlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdEVwbE5tdFN0YXRlIFBVQkxJQyBFcGxObXR1R2V0Tm10U3RhdGUoKQoreworCXRFcGxObXRTdGF0ZSBObXRTdGF0ZTsKKworCS8vICQkJCBjYWxsIGZ1bmN0aW9uIG9mIGNvbW11bmljYXRpb24gYWJzdHJhY3Rpb24gbGF5ZXIKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1USykpICE9IDApCisJTm10U3RhdGUgPSBFcGxObXRrR2V0Tm10U3RhdGUoKTsKKyNlbHNlCisJTm10U3RhdGUgPSAwOworI2VuZGlmCisKKwlyZXR1cm4gTm10U3RhdGU7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE5tdHVQcm9jZXNzRXZlbnQKKy8vCisvLyBEZXNjcmlwdGlvbjogcHJvY2Vzc2VzIGV2ZW50cyBmcm9tIGV2ZW50IHF1ZXVlCisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOiAgcEVwbEV2ZW50X3AgPSAgIHBvaW50ZXIgdG8gZXZlbnQKKy8vCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgID0gZXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMgRXBsTm10dVByb2Nlc3NFdmVudCh0RXBsRXZlbnQgKiBwRXBsRXZlbnRfcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKworCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJLy8gcHJvY2VzcyBldmVudAorCXN3aXRjaCAocEVwbEV2ZW50X3AtPm1fRXZlbnRUeXBlKSB7CisJCS8vIHN0YXRlIGNoYW5nZSBvZiBOTVQtTW9kdWxlCisJY2FzZSBrRXBsRXZlbnRUeXBlTm10U3RhdGVDaGFuZ2U6CisJCXsKKwkJCXRFcGxFdmVudE5tdFN0YXRlQ2hhbmdlICpwTm10U3RhdGVDaGFuZ2U7CisKKwkJCS8vIGRlbGV0ZSB0aW1lcgorCQkJUmV0ID0KKwkJCSAgICBFcGxUaW1lcnVEZWxldGVUaW1lcigmRXBsTm10dUluc3RhbmNlX2cubV9UaW1lckhkbCk7CisKKwkJCXBObXRTdGF0ZUNoYW5nZSA9CisJCQkgICAgKHRFcGxFdmVudE5tdFN0YXRlQ2hhbmdlICopIHBFcGxFdmVudF9wLT5tX3BBcmc7CisKKwkJCS8vIGNhbGwgY2ItZnVuY3Rpb25zIHRvIGluZm9ybSBoaWdoZXIgbGF5ZXIKKwkJCWlmIChFcGxObXR1SW5zdGFuY2VfZy5tX3Bmbk5tdENoYW5nZUNiICE9IE5VTEwpIHsKKwkJCQlSZXQgPQorCQkJCSAgICBFcGxObXR1SW5zdGFuY2VfZy4KKwkJCQkgICAgbV9wZm5ObXRDaGFuZ2VDYigqcE5tdFN0YXRlQ2hhbmdlKTsKKwkJCX0KKworCQkJaWYgKFJldCA9PSBrRXBsU3VjY2Vzc2Z1bCkgewkvLyBldmVyeXRoaW5nIGlzIE9LLCBzbyBzd2l0Y2ggdG8gbmV4dCBzdGF0ZSBpZiBuZWNlc3NhcnkKKwkJCQlzd2l0Y2ggKHBObXRTdGF0ZUNoYW5nZS0+bV9OZXdObXRTdGF0ZSkgeworCQkJCQkvLyBFUEwgc3RhY2sgaXMgbm90IHJ1bm5pbmcKKwkJCQljYXNlIGtFcGxObXRHc09mZjoKKwkJCQkJYnJlYWs7CisKKwkJCQkJLy8gZmlyc3QgaW5pdCBvZiB0aGUgaGFyZHdhcmUKKwkJCQljYXNlIGtFcGxObXRHc0luaXRpYWxpc2luZzoKKwkJCQkJeworCQkJCQkJUmV0ID0KKwkJCQkJCSAgICBFcGxObXR1Tm10RXZlbnQKKwkJCQkJCSAgICAoa0VwbE5tdEV2ZW50RW50ZXJSZXNldEFwcCk7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCisJCQkJCS8vIGluaXQgb2YgdGhlIG1hbnVmYWN0dXJlci1zcGVjaWZpYyBwcm9maWxlIGFyZWEgYW5kIHRoZQorCQkJCQkvLyBzdGFuZGFyZGlzZWQgZGV2aWNlIHByb2ZpbGUgYXJlYQorCQkJCWNhc2Uga0VwbE5tdEdzUmVzZXRBcHBsaWNhdGlvbjoKKwkJCQkJeworCQkJCQkJUmV0ID0KKwkJCQkJCSAgICBFcGxObXR1Tm10RXZlbnQKKwkJCQkJCSAgICAoa0VwbE5tdEV2ZW50RW50ZXJSZXNldENvbSk7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCisJCQkJCS8vIGluaXQgb2YgdGhlIGNvbW11bmljYXRpb24gcHJvZmlsZSBhcmVhCisJCQkJY2FzZSBrRXBsTm10R3NSZXNldENvbW11bmljYXRpb246CisJCQkJCXsKKwkJCQkJCVJldCA9CisJCQkJCQkgICAgRXBsTm10dU5tdEV2ZW50CisJCQkJCQkgICAgKGtFcGxObXRFdmVudEVudGVyUmVzZXRDb25maWcpOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKworCQkJCQkvLyBidWlsZCB0aGUgY29uZmlndXJhdGlvbiB3aXRoIGluZm9zIGZyb20gT0QKKwkJCQljYXNlIGtFcGxObXRHc1Jlc2V0Q29uZmlndXJhdGlvbjoKKwkJCQkJeworCQkJCQkJdW5zaWduZWQgaW50IHVpTm9kZUlkOworCisJCQkJCQkvLyBnZXQgbm9kZSBJRCBmcm9tIE9ECisjaWYgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9PQkRVKSkgIT0gMCkgfHwgKEVQTF9PQkRfVVNFX0tFUk5FTCAhPSBGQUxTRSkKKwkJCQkJCXVpTm9kZUlkID0KKwkJCQkJCSAgICBFcGxPYmR1R2V0Tm9kZUlkCisJCQkJCQkgICAgKEVQTF9NQ09fUFRSX0lOU1RBTkNFX1BUUik7CisjZWxzZQorCQkJCQkJdWlOb2RlSWQgPSAwOworI2VuZGlmCisJCQkJCQkvL2NoZWNrIG5vZGUgSUQgaWYgbm90IHNob3VsZCBiZSBtYXN0ZXIgb3Igc2xhdmUKKwkJCQkJCWlmICh1aU5vZGVJZCA9PSBFUExfQ19BRFJfTU5fREVGX05PREVfSUQpIHsJLy8gbm9kZSBzaGFsbCBiZSBNTgorI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UX01OKSkgIT0gMCkKKwkJCQkJCQlSZXQgPQorCQkJCQkJCSAgICBFcGxObXR1Tm10RXZlbnQKKwkJCQkJCQkgICAgKGtFcGxObXRFdmVudEVudGVyTXNOb3RBY3RpdmUpOworI2Vsc2UKKwkJCQkJCQlUUkFDRTAKKwkJCQkJCQkgICAgKCJFcGxObXR1UHJvY2VzcygpOiBubyBNTiBmdW5jdGlvbmFsaXR5IGltcGxlbWVudGVkXG4iKTsKKyNlbmRpZgorCQkJCQkJfSBlbHNlIHsJLy8gbm9kZSBzaGFsbCBiZSBDTgorCQkJCQkJCVJldCA9CisJCQkJCQkJICAgIEVwbE5tdHVObXRFdmVudAorCQkJCQkJCSAgICAoa0VwbE5tdEV2ZW50RW50ZXJDc05vdEFjdGl2ZSk7CisJCQkJCQl9CisJCQkJCQlicmVhazsKKwkJCQkJfQorCisJCQkJCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJCQkJLy8gQ04gcGFydCBvZiB0aGUgc3RhdGUgbWFjaGluZQorCisJCQkJCS8vIG5vZGUgbGlzdGVucyBmb3IgRVBMLUZyYW1lcyBhbmQgY2hlY2sgdGltZW91dAorCQkJCWNhc2Uga0VwbE5tdENzTm90QWN0aXZlOgorCQkJCQl7CisJCQkJCQlEV09SRCBkd0J1ZmZlcjsKKwkJCQkJCXRFcGxPYmRTaXplIE9iZFNpemU7CisJCQkJCQl0RXBsVGltZXJBcmcgVGltZXJBcmc7CisKKwkJCQkJCS8vIGNyZWF0ZSB0aW1lciB0byBzd2l0Y2ggYXV0b21hdGljYWxseSB0byBCYXNpY0V0aGVybmV0IGlmIG5vIE1OIGF2YWlsYWJsZSBpbiBuZXR3b3JrCisKKwkJCQkJCS8vIHJlYWQgTk1UX0NOQmFzaWNFdGhlcm5ldFRpbWVyb3V0X1UzMiBmcm9tIE9ECisJCQkJCQlPYmRTaXplID0gc2l6ZW9mKGR3QnVmZmVyKTsKKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX09CRFUpKSAhPSAwKSB8fCAoRVBMX09CRF9VU0VfS0VSTkVMICE9IEZBTFNFKQorCQkJCQkJUmV0ID0KKwkJCQkJCSAgICBFcGxPYmR1UmVhZEVudHJ5CisJCQkJCQkgICAgKEVQTF9NQ09fUFRSX0lOU1RBTkNFX1BUUl8KKwkJCQkJCSAgICAgMHgxRjk5LCAweDAwLCAmZHdCdWZmZXIsCisJCQkJCQkgICAgICZPYmRTaXplKTsKKyNlbHNlCisJCQkJCQlSZXQgPSBrRXBsT2JkSW5kZXhOb3RFeGlzdDsKKyNlbmRpZgorCQkJCQkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQkJaWYgKGR3QnVmZmVyICE9IDApIHsJLy8gQmFzaWNFdGhlcm5ldCBpcyBlbmFibGVkCisJCQkJCQkJLy8gY29udmVydCB1cyBpbnRvIG1zCisJCQkJCQkJZHdCdWZmZXIgPQorCQkJCQkJCSAgICBkd0J1ZmZlciAvIDEwMDA7CisJCQkJCQkJaWYgKGR3QnVmZmVyID09IDApIHsJLy8gdGltZXIgd2FzIGJlbG93IG9uZSBtcworCQkJCQkJCQkvLyBzZXQgb25lIG1zCisJCQkJCQkJCWR3QnVmZmVyID0gMTsKKwkJCQkJCQl9CisJCQkJCQkJVGltZXJBcmcubV9FdmVudFNpbmsgPQorCQkJCQkJCSAgICBrRXBsRXZlbnRTaW5rTm10azsKKwkJCQkJCQlUaW1lckFyZy5tX3VsQXJnID0KKwkJCQkJCQkgICAgKHVuc2lnbmVkIGxvbmcpCisJCQkJCQkJICAgIGtFcGxObXRFdmVudFRpbWVyQmFzaWNFdGhlcm5ldDsKKwkJCQkJCQlSZXQgPQorCQkJCQkJCSAgICBFcGxUaW1lcnVNb2RpZnlUaW1lck1zCisJCQkJCQkJICAgICgmRXBsTm10dUluc3RhbmNlX2cuCisJCQkJCQkJICAgICBtX1RpbWVySGRsLAorCQkJCQkJCSAgICAgKHVuc2lnbmVkIGxvbmcpCisJCQkJCQkJICAgICBkd0J1ZmZlciwKKwkJCQkJCQkgICAgIFRpbWVyQXJnKTsKKwkJCQkJCQkvLyBwb3RlbnRpYWwgZXJyb3IgaXMgZm9yd2FyZGVkIHRvIGV2ZW50IHF1ZXVlIHdoaWNoIGdlbmVyYXRlcyBlcnJvciBldmVudAorCQkJCQkJfQorCQkJCQkJYnJlYWs7CisJCQkJCX0KKworCQkJCQkvLyBub2RlIHByb2Nlc3NlcyBvbmx5IGFzeW5jIGZyYW1lcworCQkJCWNhc2Uga0VwbE5tdENzUHJlT3BlcmF0aW9uYWwxOgorCQkJCQl7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCisJCQkJCS8vIG5vZGUgcHJvY2Vzc2VzIGlzb2Nocm9ub3VzIGFuZCBhc3luY2hyb25vdXMgZnJhbWVzCisJCQkJY2FzZSBrRXBsTm10Q3NQcmVPcGVyYXRpb25hbDI6CisJCQkJCXsKKwkJCQkJCVJldCA9CisJCQkJCQkgICAgRXBsTm10dU5tdEV2ZW50CisJCQkJCQkgICAgKGtFcGxObXRFdmVudEVudGVyUmVhZHlUb09wZXJhdGUpOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKworCQkJCQkvLyBub2RlIHNob3VsZCBiZSBjb25maWd1cmVkIHVuZCBhcHBsaWNhdGlvbiBpcyByZWFkeQorCQkJCWNhc2Uga0VwbE5tdENzUmVhZHlUb09wZXJhdGU6CisJCQkJCXsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisKKwkJCQkJLy8gbm9ybWFsIHdvcmsgc3RhdGUKKwkJCQljYXNlIGtFcGxObXRDc09wZXJhdGlvbmFsOgorCQkJCQl7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCisJCQkJCS8vIG5vZGUgc3RvcHBlZCBieSBNTgorCQkJCQkvLyAtPiBvbmx5IHByb2Nlc3MgYXN5bmNocm9ub3VzIGZyYW1lcworCQkJCWNhc2Uga0VwbE5tdENzU3RvcHBlZDoKKwkJCQkJeworCQkJCQkJYnJlYWs7CisJCQkJCX0KKworCQkJCQkvLyBubyBFUEwgY3ljbGUKKwkJCQkJLy8gLT4gbm9ybWFsIGV0aGVybmV0IGNvbW11bmljYXRpb24KKwkJCQljYXNlIGtFcGxObXRDc0Jhc2ljRXRoZXJuZXQ6CisJCQkJCXsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisKKwkJCQkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkJCQkvLyBNTiBwYXJ0IG9mIHRoZSBzdGF0ZSBtYWNoaW5lCisKKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVF9NTikpICE9IDApCisJCQkJCS8vIG5vZGUgbGlzdGVucyBmb3IgRVBMLUZyYW1lcyBhbmQgY2hlY2sgdGltZW91dAorCQkJCWNhc2Uga0VwbE5tdE1zTm90QWN0aXZlOgorCQkJCQl7CisJCQkJCQlEV09SRCBkd0J1ZmZlcjsKKwkJCQkJCXRFcGxPYmRTaXplIE9iZFNpemU7CisJCQkJCQl0RXBsVGltZXJBcmcgVGltZXJBcmc7CisKKwkJCQkJCS8vIGNyZWF0ZSB0aW1lciB0byBzd2l0Y2ggYXV0b21hdGljYWxseSB0byBCYXNpY0V0aGVybmV0L1ByZU9wMSBpZiBubyBvdGhlciBNTiBhY3RpdmUgaW4gbmV0d29yaworCisJCQkJCQkvLyBjaGVjayBOTVRfU3RhcnRVcF9VMzIuQml0MTMKKwkJCQkJCS8vIHJlYWQgTk1UX1N0YXJ0VXBfVTMyIGZyb20gT0QKKwkJCQkJCU9iZFNpemUgPSBzaXplb2YoZHdCdWZmZXIpOworI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfT0JEVSkpICE9IDApIHx8IChFUExfT0JEX1VTRV9LRVJORUwgIT0gRkFMU0UpCisJCQkJCQlSZXQgPQorCQkJCQkJICAgIEVwbE9iZHVSZWFkRW50cnkKKwkJCQkJCSAgICAoRVBMX01DT19QVFJfSU5TVEFOQ0VfUFRSXworCQkJCQkJICAgICAweDFGODAsIDB4MDAsICZkd0J1ZmZlciwKKwkJCQkJCSAgICAgJk9iZFNpemUpOworI2Vsc2UKKwkJCQkJCVJldCA9IGtFcGxPYmRJbmRleE5vdEV4aXN0OworI2VuZGlmCisJCQkJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisKKwkJCQkJCWlmICgoZHdCdWZmZXIgJiBFUExfTk1UU1RfQkFTSUNFVEhFUk5FVCkgPT0gMCkgewkvLyBOTVRfU3RhcnRVcF9VMzIuQml0MTMgPT0gMAorCQkJCQkJCS8vIG5ldyBzdGF0ZSBQcmVPcGVyYXRpb25hbDEKKwkJCQkJCQlUaW1lckFyZy5tX3VsQXJnID0KKwkJCQkJCQkgICAgKHVuc2lnbmVkIGxvbmcpCisJCQkJCQkJICAgIGtFcGxObXRFdmVudFRpbWVyTXNQcmVPcDE7CisJCQkJCQl9IGVsc2UgewkvLyBOTVRfU3RhcnRVcF9VMzIuQml0MTMgPT0gMQorCQkJCQkJCS8vIG5ldyBzdGF0ZSBCYXNpY0V0aGVybmV0CisJCQkJCQkJVGltZXJBcmcubV91bEFyZyA9CisJCQkJCQkJICAgICh1bnNpZ25lZCBsb25nKQorCQkJCQkJCSAgICBrRXBsTm10RXZlbnRUaW1lckJhc2ljRXRoZXJuZXQ7CisJCQkJCQl9CisKKwkJCQkJCS8vIHJlYWQgTk1UX0Jvb3RUaW1lX1JFQy5NTldhaXROb3RBY3RfVTMyIGZyb20gT0QKKwkJCQkJCU9iZFNpemUgPSBzaXplb2YoZHdCdWZmZXIpOworI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfT0JEVSkpICE9IDApIHx8IChFUExfT0JEX1VTRV9LRVJORUwgIT0gRkFMU0UpCisJCQkJCQlSZXQgPQorCQkJCQkJICAgIEVwbE9iZHVSZWFkRW50cnkKKwkJCQkJCSAgICAoRVBMX01DT19QVFJfSU5TVEFOQ0VfUFRSXworCQkJCQkJICAgICAweDFGODksIDB4MDEsICZkd0J1ZmZlciwKKwkJCQkJCSAgICAgJk9iZFNpemUpOworI2Vsc2UKKwkJCQkJCVJldCA9IGtFcGxPYmRJbmRleE5vdEV4aXN0OworI2VuZGlmCisJCQkJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCQkvLyBjb252ZXJ0IHVzIGludG8gbXMKKwkJCQkJCWR3QnVmZmVyID0gZHdCdWZmZXIgLyAxMDAwOworCQkJCQkJaWYgKGR3QnVmZmVyID09IDApIHsJLy8gdGltZXIgd2FzIGJlbG93IG9uZSBtcworCQkJCQkJCS8vIHNldCBvbmUgbXMKKwkJCQkJCQlkd0J1ZmZlciA9IDE7CisJCQkJCQl9CisJCQkJCQlUaW1lckFyZy5tX0V2ZW50U2luayA9CisJCQkJCQkgICAga0VwbEV2ZW50U2lua05tdGs7CisJCQkJCQlSZXQgPQorCQkJCQkJICAgIEVwbFRpbWVydU1vZGlmeVRpbWVyTXMKKwkJCQkJCSAgICAoJkVwbE5tdHVJbnN0YW5jZV9nLgorCQkJCQkJICAgICBtX1RpbWVySGRsLAorCQkJCQkJICAgICAodW5zaWduZWQgbG9uZylkd0J1ZmZlciwKKwkJCQkJCSAgICAgVGltZXJBcmcpOworCQkJCQkJLy8gcG90ZW50aWFsIGVycm9yIGlzIGZvcndhcmRlZCB0byBldmVudCBxdWV1ZSB3aGljaCBnZW5lcmF0ZXMgZXJyb3IgZXZlbnQKKwkJCQkJCWJyZWFrOworCQkJCQl9CisKKwkJCQkJLy8gbm9kZSBwcm9jZXNzZXMgb25seSBhc3luYyBmcmFtZXMKKwkJCQljYXNlIGtFcGxObXRNc1ByZU9wZXJhdGlvbmFsMToKKwkJCQkJeworCQkJCQkJRFdPUkQgZHdCdWZmZXIgPSAwOworCQkJCQkJdEVwbE9iZFNpemUgT2JkU2l6ZTsKKwkJCQkJCXRFcGxUaW1lckFyZyBUaW1lckFyZzsKKworCQkJCQkJLy8gY3JlYXRlIHRpbWVyIHRvIHN3aXRjaCBhdXRvbWF0aWNhbGx5IHRvIFByZU9wMiBpZiBNTiBpZGVudGlmaWVkIGFsbCBtYW5kYXRvcnkgQ05zCisKKwkJCQkJCS8vIHJlYWQgTk1UX0Jvb3RUaW1lX1JFQy5NTldhaXRQcmVPcDFfVTMyIGZyb20gT0QKKwkJCQkJCU9iZFNpemUgPSBzaXplb2YoZHdCdWZmZXIpOworI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfT0JEVSkpICE9IDApIHx8IChFUExfT0JEX1VTRV9LRVJORUwgIT0gRkFMU0UpCisJCQkJCQlSZXQgPQorCQkJCQkJICAgIEVwbE9iZHVSZWFkRW50cnkKKwkJCQkJCSAgICAoRVBMX01DT19QVFJfSU5TVEFOQ0VfUFRSXworCQkJCQkJICAgICAweDFGODksIDB4MDMsICZkd0J1ZmZlciwKKwkJCQkJCSAgICAgJk9iZFNpemUpOworCQkJCQkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJCQkJCS8vIGlnbm9yZSBlcnJvciwgYmVjYXVzZSB0aGlzIHRpbWVvdXQgaXMgb3B0aW9uYWwKKwkJCQkJCQlkd0J1ZmZlciA9IDA7CisJCQkJCQl9CisjZW5kaWYKKwkJCQkJCWlmIChkd0J1ZmZlciA9PSAwKSB7CS8vIGRlbGF5IGlzIGRlYWN0aXZhdGVkCisJCQkJCQkJLy8gaW1tZWRpYXRlbHkgcG9zdCB0aW1lciBldmVudAorCQkJCQkJCVJldCA9CisJCQkJCQkJICAgIEVwbE5tdHVObXRFdmVudAorCQkJCQkJCSAgICAoa0VwbE5tdEV2ZW50VGltZXJNc1ByZU9wMik7CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCQkvLyBjb252ZXJ0IHVzIGludG8gbXMKKwkJCQkJCWR3QnVmZmVyID0gZHdCdWZmZXIgLyAxMDAwOworCQkJCQkJaWYgKGR3QnVmZmVyID09IDApIHsJLy8gdGltZXIgd2FzIGJlbG93IG9uZSBtcworCQkJCQkJCS8vIHNldCBvbmUgbXMKKwkJCQkJCQlkd0J1ZmZlciA9IDE7CisJCQkJCQl9CisJCQkJCQlUaW1lckFyZy5tX0V2ZW50U2luayA9CisJCQkJCQkgICAga0VwbEV2ZW50U2lua05tdGs7CisJCQkJCQlUaW1lckFyZy5tX3VsQXJnID0KKwkJCQkJCSAgICAodW5zaWduZWQgbG9uZykKKwkJCQkJCSAgICBrRXBsTm10RXZlbnRUaW1lck1zUHJlT3AyOworCQkJCQkJUmV0ID0KKwkJCQkJCSAgICBFcGxUaW1lcnVNb2RpZnlUaW1lck1zCisJCQkJCQkgICAgKCZFcGxObXR1SW5zdGFuY2VfZy4KKwkJCQkJCSAgICAgbV9UaW1lckhkbCwKKwkJCQkJCSAgICAgKHVuc2lnbmVkIGxvbmcpZHdCdWZmZXIsCisJCQkJCQkgICAgIFRpbWVyQXJnKTsKKwkJCQkJCS8vIHBvdGVudGlhbCBlcnJvciBpcyBmb3J3YXJkZWQgdG8gZXZlbnQgcXVldWUgd2hpY2ggZ2VuZXJhdGVzIGVycm9yIGV2ZW50CisJCQkJCQlicmVhazsKKwkJCQkJfQorCisJCQkJCS8vIG5vZGUgcHJvY2Vzc2VzIGlzb2Nocm9ub3VzIGFuZCBhc3luY2hyb25vdXMgZnJhbWVzCisJCQkJY2FzZSBrRXBsTm10TXNQcmVPcGVyYXRpb25hbDI6CisJCQkJCXsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisKKwkJCQkJLy8gbm9kZSBzaG91bGQgYmUgY29uZmlndXJlZCB1bmQgYXBwbGljYXRpb24gaXMgcmVhZHkKKwkJCQljYXNlIGtFcGxObXRNc1JlYWR5VG9PcGVyYXRlOgorCQkJCQl7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCisJCQkJCS8vIG5vcm1hbCB3b3JrIHN0YXRlCisJCQkJY2FzZSBrRXBsTm10TXNPcGVyYXRpb25hbDoKKwkJCQkJeworCQkJCQkJYnJlYWs7CisJCQkJCX0KKworCQkJCQkvLyBubyBFUEwgY3ljbGUKKwkJCQkJLy8gLT4gbm9ybWFsIGV0aGVybmV0IGNvbW11bmljYXRpb24KKwkJCQljYXNlIGtFcGxObXRNc0Jhc2ljRXRoZXJuZXQ6CisJCQkJCXsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisjZW5kaWYgLy8gKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRfTU4pKSAhPSAwKQorCisJCQkJZGVmYXVsdDoKKwkJCQkJeworCQkJCQkJVFJBQ0UxCisJCQkJCQkgICAgKCJFcGxObXR1UHJvY2VzcygpOiB1bmhhbmRsZWQgTk1UIHN0YXRlIDB4JVhcbiIsCisJCQkJCQkgICAgIHBObXRTdGF0ZUNoYW5nZS0+CisJCQkJCQkgICAgIG1fTmV3Tm10U3RhdGUpOworCQkJCQl9CisJCQkJfQorCQkJfSBlbHNlIGlmIChSZXQgPT0ga0VwbFJlamVjdCkgewkvLyBhcHBsaWNhdGlvbiB3YW50cyB0byBjaGFuZ2UgTk1UIHN0YXRlIGl0c2VsZgorCQkJCS8vIGl0J3MgT0sKKwkJCQlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwkJCX0KKworCQkJRVBMX0RCR0xWTF9OTVRVX1RSQUNFMAorCQkJICAgICgiRXBsTm10dVByb2Nlc3NFdmVudCgpOiBOTVQtU3RhdGUtTWFzY2hpbmUgYW5ub3VuY2UgY2hhbmdlIG9mIE5NVCBTdGF0ZVxuIik7CisJCQlicmVhazsKKwkJfQorCisJZGVmYXVsdDoKKwkJeworCQkJUmV0ID0ga0VwbE5tdEludmFsaWRFdmVudDsKKwkJfQorCisJfQorCisvL0V4aXQ6CisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsTm10dVJlZ2lzdGVyU3RhdGVDaGFuZ2VDYgorLy8KKy8vIERlc2NyaXB0aW9uOiByZWdpc3RlciBDYWxsYmFjay1mdW5jdGlvbiBnbyBnZXQgaW5mb3JtZWQgYWJvdXQgYQorLy8gICAgICAgICAgICAgIE5NVC1DaGFuZ2UtU3RhdGUtRXZlbnQKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6ICBwZm5FcGxObXRTdGF0ZUNoYW5nZUNiX3AgPSBmdW5jdGlvbnBvaW50ZXIKKy8vCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgID0gZXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMKK0VwbE5tdHVSZWdpc3RlclN0YXRlQ2hhbmdlQ2IodEVwbE5tdHVTdGF0ZUNoYW5nZUNhbGxiYWNrCisJCQkgICAgIHBmbkVwbE5tdFN0YXRlQ2hhbmdlQ2JfcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKworCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJLy8gc2F2ZSBjYWxsYmFjay1mdW5jdGlvbiBpbiBtb2R1bCBnbG9iYWwgdmFyCisJRXBsTm10dUluc3RhbmNlX2cubV9wZm5ObXRDaGFuZ2VDYiA9IHBmbkVwbE5tdFN0YXRlQ2hhbmdlQ2JfcDsKKworCXJldHVybiBSZXQ7CisKK30KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICBQIFIgSSBWIEEgVCBFICAgRiBVIE4gQyBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246CisvLworLy8gRGVzY3JpcHRpb246CisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOgorLy8KKy8vCisvLyBSZXR1cm5zOgorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZW5kaWYgLy8gI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRVKSkgIT0gMCkKKworLy8gRU9GCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbE5tdHVDYWwuYyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsTm10dUNhbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhMjllZjUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbE5tdHVDYWwuYwpAQCAtMCwwICsxLDE1OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIHNvdXJjZSBmaWxlIGZvciBjb21tdW5pY2F0aW9uIGFic3RyYWN0aW9uIGxheWVyIG9mIHRoZQorICAgICAgICAgICAgICAgIE5NVC1Vc2Vyc3BhY2UtTW9kdWxlCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRXBsTm10dUNhbC5jLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS40ICQgICREYXRlOiAyMDA4LzEwLzE3IDE1OjMyOjMyICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorICAgICAgICAgICAgICAgIEtFSUwgdVZpc2lvbiAyCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwNi8wNi8xNiAtay50LjogICBzdGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgInVzZXIvRXBsTm10dUNhbC5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICBHIEwgTyBCIEEgTCAgIEQgRSBGIEkgTiBJIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvY2FsIHR5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbW9kdWwgZ2xvYmFsZSB2YXJzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICBQIFUgQiBMIEkgQyAgIEYgVSBOIEMgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE5tdGtDYWxHZXRObXRTdGF0ZQorLy8KKy8vIERlc2NyaXB0aW9uOiByZXR1cm4gY3VycmVudCBOTVQtU3RhdGUKKy8vICAgICAgICAgICAgICAtPiBlbmNhcHN1bGF0ZSBhY2Nlc3MgdG8ga2VybmVsc3BhY2UKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6CisvLworLy8KKy8vIFJldHVybnM6ICAgICB0RXBsTm10U3RhdGUgPSBjdXJyZW50IE5NVC1TdGF0ZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHRFcGxObXRTdGF0ZSBQVUJMSUMgRXBsTm10a0NhbEdldE5tdFN0YXRlKCkKK3sKKwl0RXBsTm10U3RhdGUgTm10U3RhdGU7CisJLy8gZm9yIHRlc3QgZGlyZWt0IGNhbGwgZm9yIEVwbE5tdGtHZXRObXRTdGF0ZSgpCisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVEspKSAhPSAwKQorCU5tdFN0YXRlID0gRXBsTm10a0dldE5tdFN0YXRlKCk7CisjZWxzZQorCU5tdFN0YXRlID0gMDsKKyNlbmRpZgorCXJldHVybiBObXRTdGF0ZTsKK30KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICBQIFIgSSBWIEEgVCBFICAgRiBVIE4gQyBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246CisvLworLy8gRGVzY3JpcHRpb246CisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOgorLy8KKy8vCisvLyBSZXR1cm5zOgorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBFT0YKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsT2JkLmMgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbE9iZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmYmIxOTYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbE9iZC5jCkBAIC0wLDAgKzEsMzI2MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIHNvdXJjZSBmaWxlIGZvciBhcGkgZnVuY3Rpb24gb2YgRXBsT0JELU1vZHVsZQorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgJFJDU2ZpbGU6IEVwbE9iZC5jLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS4xMiAkICAkRGF0ZTogMjAwOC8xMC8xNyAxNTozMjozMiAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICBNaWNyb3NvZnQgVkM3CisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwNi8wNi8wMiBrLnQuOiAgIHN0YXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiwgdmVyc2lvbiAxLjAwCisJCSAgICAgLT5iYXNlZCBvbiBDQU5vcGVuIE9CRC1Nb2R1bAorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiRXBsSW5jLmgiCisjaW5jbHVkZSAia2VybmVsL0VwbE9iZGsuaCIJLy8gZnVuY3Rpb24gcHJvdG90eXBzIG9mIHRoZSBFcGxPQkQtTW9kdWwKKworI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9PQkRLKSkgIT0gMCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgRyBMIE8gQiBBIEwgICBEIEUgRiBJIE4gSSBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvbnN0IGRlZmluZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIGZsb2F0IGRlZmluaXRpb25zIGFuZCBtYWNyb3MKKyNkZWZpbmUgX1NISUZURURfRVhQT05FTlRfTUFTS19TUCAgIDB4ZmYKKyNkZWZpbmUgX0JJQVNfU1AgICAgICAgICAgICAgICAgICAgIDEyNgorI2RlZmluZSBUX1NQICAgICAgICAgICAgICAgICAgICAgICAgMjMKKyNkZWZpbmUgRVhQT05FTlRfREVOT1JNX1NQICAgICAgICAgICgtX0JJQVNfU1ApCisjZGVmaW5lIEJBU0VfVE9fVEhFX1RfU1AgICAgICAgICAgICAoKGZsb2F0KSA4Mzg4NjA4LjApCisjZGVmaW5lIEdFVF9FWFBPTkVOVF9TUCh4KSAgICAgICAgICAoKCgoeCkgPj4gVF9TUCkgJiBfU0hJRlRFRF9FWFBPTkVOVF9NQVNLX1NQKSAtIF9CSUFTX1NQKQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIHN0cnVjdCBmb3IgaW5zdGFuY2UgdGFibGUKK0lOU1RBTkNFX1RZUEVfQkVHSU4gRVBMX01DT19ERUNMX0lOU1RBTkNFX01FTUJFUigpCisKK1NUQVRJQyB0RXBsT2JkSW5pdFBhcmFtIElOU1RfRkFSIG1fT2JkSW5pdFBhcmFtOworU1RBVElDIHRFcGxPYmRTdG9yZUxvYWRPYmpDYWxsYmFjayBJTlNUX05FQVIgbV9mcFN0b3JlTG9hZE9iakNhbGxiYWNrOworCitJTlNUQU5DRV9UWVBFX0VORAorLy8gZGVjb21wb3NpdGlvbiBvZiBmbG9hdAordHlwZWRlZiB1bmlvbiB7CisJdEVwbE9iZFJlYWwzMiBtX2ZsUmVhbFBhcnQ7CisJaW50IG1fbkludGVnZXJQYXJ0OworCit9IHRFcGxPYmRSZWFsUGFydHM7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBtb2R1bCBnbG9iYWxlIHZhcnMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIFRoaXMgbWFjcm8gcmVwbGFjZSB0aGUgdW5zcGVjaWZpYyBwb2ludGVyIHRvIGFuIGluc3RhbmNlIHRocm91Z2gKKy8vIHRoZSBtb2R1bCBzcGVjaWZpYyB0eXBlIGZvciB0aGUgbG9jYWwgaW5zdGFuY2UgdGFibGUuIFRoaXMgbWFjcm8KKy8vIG11c3QgZGVmaW5lZCBpbiBlYWNoIG1vZHVsLgorLy8jZGVmaW5lIHRFcGxQdHJJbnN0YW5jZSAgICAgICAgICAgICB0RXBsSW5zdGFuY2VJbmZvIE1FTSoKKworRVBMX01DT19ERUNMX0lOU1RBTkNFX1ZBUigpCisKK0JZVEUgTUVNIGFiRXBsT2JkVHJhc2hPYmplY3RfZ1s4XTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0VQTF9NQ09fREVGSU5FX0lOU1RBTkNFX0ZDVCgpCisKK3N0YXRpYyB0RXBsS2VybmVsIEVwbE9iZENhbGxPYmplY3RDYWxsYmFjayhFUExfTUNPX0RFQ0xfSU5TVEFOQ0VfUFRSXworCQkJCQkgICB0RXBsT2JkQ2FsbGJhY2sgZnBDYWxsYmFja19wLAorCQkJCQkgICB0RXBsT2JkQ2JQYXJhbSBNRU0gKiBwQ2JQYXJhbV9wKTsKKworc3RhdGljIHRFcGxPYmRTaXplIEVwbE9iZEdldERhdGFTaXplSW50ZXJuKHRFcGxPYmRTdWJFbnRyeVB0ciBwU3ViSW5kZXhFbnRyeV9wKTsKKworc3RhdGljIHRFcGxPYmRTaXplIEVwbE9iZEdldFN0ckxlbih2b2lkICpwT2JqRGF0YV9wLAorCQkJCSAgIHRFcGxPYmRTaXplIE9iakxlbl9wLCB0RXBsT2JkVHlwZSBPYmpUeXBlX3ApOworCisjaWYgKEVQTF9PQkRfQ0hFQ0tfT0JKRUNUX1JBTkdFICE9IEZBTFNFKQorc3RhdGljIHRFcGxLZXJuZWwgRXBsT2JkQ2hlY2tPYmplY3RSYW5nZSh0RXBsT2JkU3ViRW50cnlQdHIgcFN1YmluZGV4RW50cnlfcCwKKwkJCQkJIHZvaWQgKnBEYXRhX3ApOworI2VuZGlmCisKK3N0YXRpYyB0RXBsS2VybmVsIEVwbE9iZEdldFZhckVudHJ5KHRFcGxPYmRTdWJFbnRyeVB0ciBwU3ViaW5kZXhFbnRyeV9wLAorCQkJCSAgICB0RXBsT2JkVmFyRW50cnkgTUVNICoqIHBwVmFyRW50cnlfcCk7CisKK3N0YXRpYyB0RXBsS2VybmVsIEVwbE9iZEdldEVudHJ5KEVQTF9NQ09fREVDTF9JTlNUQU5DRV9QVFJfCisJCQkJIHVuc2lnbmVkIGludCB1aUluZGV4X3AsCisJCQkJIHVuc2lnbmVkIGludCB1aVN1YmluZGV4X3AsCisJCQkJIHRFcGxPYmRFbnRyeVB0ciAqIHBwT2JkRW50cnlfcCwKKwkJCQkgdEVwbE9iZFN1YkVudHJ5UHRyICogcHBPYmRTdWJFbnRyeV9wKTsKKworc3RhdGljIHRFcGxPYmRTaXplIEVwbE9iZEdldE9iamVjdFNpemUodEVwbE9iZFN1YkVudHJ5UHRyIHBTdWJJbmRleEVudHJ5X3ApOworCitzdGF0aWMgdEVwbEtlcm5lbCBFcGxPYmRHZXRJbmRleEludGVybih0RXBsT2JkSW5pdFBhcmFtIE1FTSAqIHBJbml0UGFyYW1fcCwKKwkJCQkgICAgICAgdW5zaWduZWQgaW50IHVpSW5kZXhfcCwKKwkJCQkgICAgICAgdEVwbE9iZEVudHJ5UHRyICogcHBPYmRFbnRyeV9wKTsKKworc3RhdGljIHRFcGxLZXJuZWwgRXBsT2JkR2V0U3ViaW5kZXhJbnRlcm4odEVwbE9iZEVudHJ5UHRyIHBPYmRFbnRyeV9wLAorCQkJCQkgIHVuc2lnbmVkIGludCB1aVN1YkluZGV4X3AsCisJCQkJCSAgdEVwbE9iZFN1YkVudHJ5UHRyICogcHBPYmRTdWJFbnRyeV9wKTsKKworc3RhdGljIHRFcGxLZXJuZWwgRXBsT2JkQWNjZXNzT2RQYXJ0SW50ZXJuKEVQTF9NQ09fREVDTF9JTlNUQU5DRV9QVFJfCisJCQkJCSAgIHRFcGxPYmRQYXJ0IEN1cnJlbnRPZFBhcnRfcCwKKwkJCQkJICAgdEVwbE9iZEVudHJ5UHRyIHBPYmRFbnR5X3AsCisJCQkJCSAgIHRFcGxPYmREaXIgRGlyZWN0aW9uX3ApOworCitzdGF0aWMgdm9pZCAqRXBsT2JkR2V0T2JqZWN0RGVmYXVsdFB0cih0RXBsT2JkU3ViRW50cnlQdHIgcFN1YkluZGV4RW50cnlfcCk7CitzdGF0aWMgdm9pZCBNRU0gKkVwbE9iZEdldE9iamVjdEN1cnJlbnRQdHIodEVwbE9iZFN1YkVudHJ5UHRyIHBTdWJJbmRleEVudHJ5X3ApOworCisjaWYgKEVQTF9PQkRfVVNFX1NUT1JFX1JFU1RPUkUgIT0gRkFMU0UpCisKK3N0YXRpYyB0RXBsS2VybmVsIEVwbE9iZENhbGxTdG9yZUNhbGxiYWNrKEVQTF9NQ09fREVDTF9JTlNUQU5DRV9QVFJfCisJCQkJCSAgdEVwbE9iZENiU3RvcmVQYXJhbSBNRU0gKgorCQkJCQkgIHBDYlN0b3JlUGFyYW1fcCk7CisKKyNlbmRpZiAvLyAoRVBMX09CRF9VU0VfU1RPUkVfUkVTVE9SRSAhPSBGQUxTRSkKKworc3RhdGljIHZvaWQgRXBsT2JkQ29weU9iamVjdERhdGEodm9pZCBNRU0gKiBwRHN0RGF0YV9wLAorCQkJCSB2b2lkICpwU3JjRGF0YV9wLAorCQkJCSB0RXBsT2JkU2l6ZSBPYmpTaXplX3AsIHRFcGxPYmRUeXBlIE9ialR5cGVfcCk7CisKK3ZvaWQgKkVwbE9iZEdldE9iamVjdERhdGFQdHJJbnRlcm4odEVwbE9iZFN1YkVudHJ5UHRyIHBTdWJpbmRleEVudHJ5X3ApOworCitzdGF0aWMgdEVwbEtlcm5lbCBFcGxPYmRJc051bWVyaWNhbEludGVybih0RXBsT2JkU3ViRW50cnlQdHIgcE9iZFN1YkVudHJ5X3AsCisJCQkJCSAgQk9PTCAqIHBmRW50cnlOdW1lcmljYWxfcCk7CisKK3N0YXRpYyB0RXBsS2VybmVsIFBVQkxJQyBFcGxPYmRXcml0ZUVudHJ5UHJlKEVQTF9NQ09fREVDTF9JTlNUQU5DRV9QVFJfCisJCQkJCSAgICAgdW5zaWduZWQgaW50IHVpSW5kZXhfcCwKKwkJCQkJICAgICB1bnNpZ25lZCBpbnQgdWlTdWJJbmRleF9wLAorCQkJCQkgICAgIHZvaWQgKnBTcmNEYXRhX3AsCisJCQkJCSAgICAgdm9pZCAqKnBwRHN0RGF0YV9wLAorCQkJCQkgICAgIHRFcGxPYmRTaXplIFNpemVfcCwKKwkJCQkJICAgICB0RXBsT2JkRW50cnlQdHIgKiBwcE9iZEVudHJ5X3AsCisJCQkJCSAgICAgdEVwbE9iZFN1YkVudHJ5UHRyICogcHBTdWJFbnRyeV9wLAorCQkJCQkgICAgIHRFcGxPYmRDYlBhcmFtIE1FTSAqIHBDYlBhcmFtX3AsCisJCQkJCSAgICAgdEVwbE9iZFNpemUgKiBwT2JkU2l6ZV9wKTsKKworc3RhdGljIHRFcGxLZXJuZWwgUFVCTElDIEVwbE9iZFdyaXRlRW50cnlQb3N0KEVQTF9NQ09fREVDTF9JTlNUQU5DRV9QVFJfCisJCQkJCSAgICAgIHRFcGxPYmRFbnRyeVB0ciBwT2JkRW50cnlfcCwKKwkJCQkJICAgICAgdEVwbE9iZFN1YkVudHJ5UHRyIHBTdWJFbnRyeV9wLAorCQkJCQkgICAgICB0RXBsT2JkQ2JQYXJhbSBNRU0gKiBwQ2JQYXJhbV9wLAorCQkJCQkgICAgICB2b2lkICpwU3JjRGF0YV9wLAorCQkJCQkgICAgICB2b2lkICpwRHN0RGF0YV9wLAorCQkJCQkgICAgICB0RXBsT2JkU2l6ZSBPYmRTaXplX3ApOworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgIFAgVSBCIEwgSSBDICAgRiBVIE4gQyBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsT2JkSW5pdCgpCisvLworLy8gRGVzY3JpcHRpb246IGluaXRpYWxpemVzIHRoZSBmaXJzdCBpbnN0YW5jZQorLy8KKy8vIFBhcmFtZXRlcnM6ICBwSW5pdFBhcmFtX3AgICAgPSBpbml0IHBhcmFtZXRlcgorLy8KKy8vIFJldHVybjogICAgICB0RXBsS2VybmVsICAgICAgPSAgIGVycm9yY29kZQorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxPYmRJbml0KEVQTF9NQ09fREVDTF9QVFJfSU5TVEFOQ0VfUFRSXworCQkJCQkgIHRFcGxPYmRJbml0UGFyYW0gTUVNICogcEluaXRQYXJhbV9wKQoreworCisJdEVwbEtlcm5lbCBSZXQ7CisJRVBMX01DT19ERUxFVEVfSU5TVEFOQ0VfVEFCTEUoKTsKKworCWlmIChwSW5pdFBhcmFtX3AgPT0gTlVMTCkgeworCQlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwkJZ290byBFeGl0OworCX0KKworCVJldCA9IEVwbE9iZEFkZEluc3RhbmNlKEVQTF9NQ09fUFRSX0lOU1RBTkNFX1BUUl8gcEluaXRQYXJhbV9wKTsKKworICAgICAgRXhpdDoKKwlyZXR1cm4gUmV0OworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE9iZEFkZEluc3RhbmNlKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogYWRkcyBhIG5ldyBpbnN0YW5jZQorLy8KKy8vIFBhcmFtZXRlcnM6ICBwSW5pdFBhcmFtX3AKKy8vCisvLyBSZXR1cm46ICAgICAgdEVwbEtlcm5lbAorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxPYmRBZGRJbnN0YW5jZShFUExfTUNPX0RFQ0xfUFRSX0lOU1RBTkNFX1BUUl8KKwkJCQkJCSB0RXBsT2JkSW5pdFBhcmFtIE1FTSAqCisJCQkJCQkgcEluaXRQYXJhbV9wKQoreworCisJRVBMX01DT19ERUNMX0lOU1RBTkNFX1BUUl9MT0NBTCB0RXBsS2VybmVsIFJldDsKKworCS8vIGNoZWNrIGlmIHBvaW50ZXIgdG8gaW5zdGFuY2UgcG9pbnRlciB2YWxpZAorCS8vIGdldCBmcmVlIGluc3RhbmNlIGFuZCBzZXQgdGhlIGdsb2JhbGUgaW5zdGFuY2UgcG9pbnRlcgorCS8vIHNldCBhbHNvIHRoZSBpbnN0YW5jZSBhZGRyIHRvIHBhcmFtZXRlcmxpc3QKKwlFUExfTUNPX0NIRUNLX1BUUl9JTlNUQU5DRV9QVFIoKTsKKwlFUExfTUNPX0dFVF9GUkVFX0lOU1RBTkNFX1BUUigpOworCUVQTF9NQ09fU0VUX1BUUl9JTlNUQU5DRV9QVFIoKTsKKworCS8vIHNhdmUgaW5pdCBwYXJhbWV0ZXJzCisJRVBMX01FTUNQWSgmRVBMX01DT19HTEJfVkFSKG1fT2JkSW5pdFBhcmFtKSwgcEluaXRQYXJhbV9wLAorCQkgICBzaXplb2YodEVwbE9iZEluaXRQYXJhbSkpOworCisJLy8gY2xlYXIgY2FsbGJhY2sgZnVuY3Rpb24gZm9yIGNvbW1hbmQgTE9BRCBhbmQgU1RPUkUKKwlFUExfTUNPX0dMQl9WQVIobV9mcFN0b3JlTG9hZE9iakNhbGxiYWNrKSA9IE5VTEw7CisKKwkvLyBzaWduIGluc3RhbmNlIGFzIHVzZWQKKwlFUExfTUNPX1dSSVRFX0lOU1RBTkNFX1NUQVRFKGtTdGF0ZVVzZWQpOworCisJLy8gaW5pdGlhbGl6ZSBvYmplY3QgZGljdGlvbmFyeQorCS8vIHNvIGFsbCBhbGwgVmFyRW50cmllcyB3aWxsIGJlIGluaXRpYWxpemVkIHRvIHRyYXNoIG9iamVjdCBhbmQgZGVmYXVsdCB2YWx1ZXMgd2lsbCBiZSBzZXQgdG8gY3VycmVudCBkYXRhCisJUmV0ID0gRXBsT2JkQWNjZXNzT2RQYXJ0KEVQTF9NQ09fSU5TVEFOQ0VfUFRSXworCQkJCSBrRXBsT2JkUGFydEFsbCwga0VwbE9iZERpckluaXQpOworCisJcmV0dXJuIFJldDsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxPYmREZWxldGVJbnN0YW5jZSgpCisvLworLy8gRGVzY3JpcHRpb246IGRlbGV0ZSBpbnN0YW5jZQorLy8KKy8vIFBhcmFtZXRlcnM6ICBFUExfTUNPX0RFQ0xfSU5TVEFOQ0VfUFRSCisvLworLy8gUmV0dXJuOiAgICAgIHRFcGxLZXJuZWwKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2lmIChFUExfVVNFX0RFTEVURUlOU1RfRlVOQyAhPSBGQUxTRSkKK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxPYmREZWxldGVJbnN0YW5jZShFUExfTUNPX0RFQ0xfSU5TVEFOQ0VfUFRSKQoreworCS8vIGNoZWNrIGZvciBhbGwgQVBJIGZ1bmN0aW9uIGlmIGluc3RhbmNlIGlzIHZhbGlkCisJRVBMX01DT19DSEVDS19JTlNUQU5DRV9TVEFURSgpOworCisJLy8gc2lnbiBpbnN0YW5jZSBhcyB1bnVzZWQKKwlFUExfTUNPX1dSSVRFX0lOU1RBTkNFX1NUQVRFKGtTdGF0ZVVudXNlZCk7CisKKwlyZXR1cm4ga0VwbFN1Y2Nlc3NmdWw7CisKK30KKyNlbmRpZiAvLyAoRVBMX1VTRV9ERUxFVEVJTlNUX0ZVTkMgIT0gRkFMU0UpCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE9iZFdyaXRlRW50cnkoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBGdW5jdGlvbiB3cml0ZXMgZGF0YSB0byBhbiBPQkQgZW50cnkuIFN0cmluZ3MKKy8vICAgICAgICAgICAgICBhcmUgc3RvcmVkIHdpdGggYWRkZWQgJ1wwJyBjaGFyYWN0ZXIuCisvLworLy8gUGFyYW1ldGVyczogIEVQTF9NQ09fREVDTF9JTlNUQU5DRV9QVFJfCisvLyAgICAgICAgICAgICAgdWlJbmRleF9wICAgICAgID0gICBJbmRleCBvZiB0aGUgT0QgZW50cnkKKy8vICAgICAgICAgICAgICB1aVN1YkluZGV4X3AgICAgPSAgIFN1YmluZGV4IG9mIHRoZSBPRCBFbnRyeQorLy8gICAgICAgICAgICAgIHBTcmNEYXRhX3AgICAgICA9ICAgUG9pbnRlciB0byB0aGUgZGF0YSB0byB3cml0ZQorLy8gICAgICAgICAgICAgIFNpemVfcCAgICAgICAgICA9ICAgU2l6ZSBvZiB0aGUgZGF0YSBpbiBCeXRlCisvLworLy8gUmV0dXJuOiAgICAgIHRFcGxLZXJuZWwgICAgICA9ICAgRXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxPYmRXcml0ZUVudHJ5KEVQTF9NQ09fREVDTF9JTlNUQU5DRV9QVFJfCisJCQkJCQl1bnNpZ25lZCBpbnQgdWlJbmRleF9wLAorCQkJCQkJdW5zaWduZWQgaW50IHVpU3ViSW5kZXhfcCwKKwkJCQkJCXZvaWQgKnBTcmNEYXRhX3AsCisJCQkJCQl0RXBsT2JkU2l6ZSBTaXplX3ApCit7CisKKwl0RXBsS2VybmVsIFJldDsKKwl0RXBsT2JkRW50cnlQdHIgcE9iZEVudHJ5OworCXRFcGxPYmRTdWJFbnRyeVB0ciBwU3ViRW50cnk7CisJdEVwbE9iZENiUGFyYW0gTUVNIENiUGFyYW07CisJdm9pZCBNRU0gKnBEc3REYXRhOworCXRFcGxPYmRTaXplIE9iZFNpemU7CisKKwlSZXQgPSBFcGxPYmRXcml0ZUVudHJ5UHJlKEVQTF9NQ09fSU5TVEFOQ0VfUFRSXworCQkJCSAgdWlJbmRleF9wLAorCQkJCSAgdWlTdWJJbmRleF9wLAorCQkJCSAgcFNyY0RhdGFfcCwKKwkJCQkgICZwRHN0RGF0YSwKKwkJCQkgIFNpemVfcCwKKwkJCQkgICZwT2JkRW50cnksICZwU3ViRW50cnksICZDYlBhcmFtLCAmT2JkU2l6ZSk7CisJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQlnb3RvIEV4aXQ7CisJfQorCisJUmV0ID0gRXBsT2JkV3JpdGVFbnRyeVBvc3QoRVBMX01DT19JTlNUQU5DRV9QVFJfCisJCQkJICAgcE9iZEVudHJ5LAorCQkJCSAgIHBTdWJFbnRyeSwKKwkJCQkgICAmQ2JQYXJhbSwgcFNyY0RhdGFfcCwgcERzdERhdGEsIE9iZFNpemUpOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKworICAgICAgRXhpdDoKKworCXJldHVybiBSZXQ7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsT2JkUmVhZEVudHJ5KCkKKy8vCisvLyBEZXNjcmlwdGlvbjogVGhlIGZ1bmN0aW9uIHJlYWRzIGFuIG9iamVjdCBlbnRyeS4gVGhlIGFwcGxpY2F0aW9uCisvLyAgICAgICAgICAgICAgY2FuIGFsd2F5cyByZWFkIHRoZSBkYXRhIGV2ZW4gaWYgYXR0cmliIGtFcGxPYmRBY2NSZWFkCisvLyAgICAgICAgICAgICAgaXMgbm90IHNldC4gVGhlIGF0dHJpYiBpcyBvbmx5IGNoZWNrZWQgdXAgZm9yIFNETyB0cmFuc2Zlci4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgRVBMX01DT19ERUNMX0lOU1RBTkNFX1BUUl8KKy8vICAgICAgICAgICAgICB1aUluZGV4X3AgICAgICAgPSBJbmRleCBvb2YgdGhlIE9EIGVudHJ5IHRvIHJlYWQKKy8vICAgICAgICAgICAgICB1aVN1YkluZGV4X3AgICAgPSBTdWJpbmRleCB0byByZWFkCisvLyAgICAgICAgICAgICAgcERzdERhdGFfcCAgICAgID0gcG9pbnRlciB0byB0aGUgYnVmZmVyIGZvciBkYXRhCisvLyAgICAgICAgICAgICAgT2Zmc2V0X3AgICAgICAgID0gb2Zmc2V0IGluIGRhdGEgZm9yIHJlYWQgYWNjZXNzCisvLyAgICAgICAgICAgICAgcFNpemVfcCAgICAgICAgID0gSU46IFNpemUgb2YgdGhlIGJ1ZmZlcgorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9VVDogbnVtYmVyIG9mIHJlYWRlZCBCeXRlcworLy8KKy8vIFJldHVybjogICAgICB0RXBsS2VybmVsCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbE9iZFJlYWRFbnRyeShFUExfTUNPX0RFQ0xfSU5TVEFOQ0VfUFRSXworCQkJCQkgICAgICAgdW5zaWduZWQgaW50IHVpSW5kZXhfcCwKKwkJCQkJICAgICAgIHVuc2lnbmVkIGludCB1aVN1YkluZGV4X3AsCisJCQkJCSAgICAgICB2b2lkICpwRHN0RGF0YV9wLAorCQkJCQkgICAgICAgdEVwbE9iZFNpemUgKiBwU2l6ZV9wKQoreworCisJdEVwbEtlcm5lbCBSZXQ7CisJdEVwbE9iZEVudHJ5UHRyIHBPYmRFbnRyeTsKKwl0RXBsT2JkU3ViRW50cnlQdHIgcFN1YkVudHJ5OworCXRFcGxPYmRDYlBhcmFtIE1FTSBDYlBhcmFtOworCXZvaWQgKnBTcmNEYXRhOworCXRFcGxPYmRTaXplIE9iZFNpemU7CisKKwkvLyBjaGVjayBmb3IgYWxsIEFQSSBmdW5jdGlvbiBpZiBpbnN0YW5jZSBpcyB2YWxpZAorCUVQTF9NQ09fQ0hFQ0tfSU5TVEFOQ0VfU1RBVEUoKTsKKworCUFTU0VSVChwRHN0RGF0YV9wICE9IE5VTEwpOworCUFTU0VSVChwU2l6ZV9wICE9IE5VTEwpOworCisJLy8gZ2V0IGFkZHJlc3Mgb2YgaW5kZXggYW5kIHN1YmluZGV4IGVudHJ5CisJUmV0ID0gRXBsT2JkR2V0RW50cnkoRVBMX01DT19JTlNUQU5DRV9QVFJfCisJCQkgICAgIHVpSW5kZXhfcCwgdWlTdWJJbmRleF9wLCAmcE9iZEVudHJ5LCAmcFN1YkVudHJ5KTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gZ2V0IHBvaW50ZXIgdG8gb2JqZWN0IGRhdGEKKwlwU3JjRGF0YSA9IEVwbE9iZEdldE9iamVjdERhdGFQdHJJbnRlcm4ocFN1YkVudHJ5KTsKKworCS8vIGNoZWNrIHNvdXJjZSBwb2ludGVyCisJaWYgKHBTcmNEYXRhID09IE5VTEwpIHsKKwkJUmV0ID0ga0VwbE9iZFJlYWRWaW9sYXRpb247CisJCWdvdG8gRXhpdDsKKwl9CisJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkvLyBhZGRyZXNzIG9mIHNvdXJjZSBkYXRhIHRvIHN0cnVjdHVyZSBvZiBjYWxsYmFjayBwYXJhbWV0ZXJzCisJLy8gc28gY2FsbGJhY2sgZnVuY3Rpb24gY2FuIGNoYW5nZSB0aGlzIGRhdGEgYmVmb3JlIHJlYWRpbmcKKwlDYlBhcmFtLm1fdWlJbmRleCA9IHVpSW5kZXhfcDsKKwlDYlBhcmFtLm1fdWlTdWJJbmRleCA9IHVpU3ViSW5kZXhfcDsKKwlDYlBhcmFtLm1fcEFyZyA9IHBTcmNEYXRhOworCUNiUGFyYW0ubV9PYmRFdmVudCA9IGtFcGxPYmRFdlByZVJlYWQ7CisJUmV0ID0gRXBsT2JkQ2FsbE9iamVjdENhbGxiYWNrKEVQTF9NQ09fSU5TVEFOQ0VfUFRSXworCQkJCSAgICAgICBwT2JkRW50cnktPm1fZnBDYWxsYmFjaywgJkNiUGFyYW0pOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKwkvLyBnZXQgc2l6ZSBvZiBkYXRhIGFuZCBjaGVjayBpZiBhcHBsaWNhdGlvbiBoYXMgcmVzZXJ2ZWQgZW5vdWdoIG1lbW9yeQorCU9iZFNpemUgPSBFcGxPYmRHZXREYXRhU2l6ZUludGVybihwU3ViRW50cnkpOworCS8vIGNoZWNrIGlmIG9mZnNldCBnaXZlbiBhbmQgY2FsYyBjb3JyZWN0IG51bWJlciBvZiBieXRlcyB0byByZWFkCisJaWYgKCpwU2l6ZV9wIDwgT2JkU2l6ZSkgeworCQlSZXQgPSBrRXBsT2JkVmFsdWVMZW5ndGhFcnJvcjsKKwkJZ290byBFeGl0OworCX0KKwkvLyByZWFkIHZhbHVlIGZyb20gb2JqZWN0CisJRVBMX01FTUNQWShwRHN0RGF0YV9wLCBwU3JjRGF0YSwgT2JkU2l6ZSk7CisJKnBTaXplX3AgPSBPYmRTaXplOworCisJLy8gd3JpdGUgYWRkcmVzcyBvZiBkZXN0aW5hdGlvbiBkYXRhIHRvIHN0cnVjdHVyZSBvZiBjYWxsYmFjayBwYXJhbWV0ZXJzCisJLy8gc28gY2FsbGJhY2sgZnVuY3Rpb24gY2FuIGNoYW5nZSB0aGlzIGRhdGEgYWZ0ZXIgcmVhZGluZworCUNiUGFyYW0ubV9wQXJnID0gcERzdERhdGFfcDsKKwlDYlBhcmFtLm1fT2JkRXZlbnQgPSBrRXBsT2JkRXZQb3N0UmVhZDsKKwlSZXQgPSBFcGxPYmRDYWxsT2JqZWN0Q2FsbGJhY2soRVBMX01DT19JTlNUQU5DRV9QVFJfCisJCQkJICAgICAgIHBPYmRFbnRyeS0+bV9mcENhbGxiYWNrLCAmQ2JQYXJhbSk7CisKKyAgICAgIEV4aXQ6CisKKwlyZXR1cm4gUmV0OworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE9iZEFjY2Vzc09kUGFydCgpCisvLworLy8gRGVzY3JpcHRpb246IHJlc3RvcmVzIGRlZmF1bHQgdmFsdWVzIG9mIG9uZSBwYXJ0IG9mIE9ECisvLworLy8gUGFyYW1ldGVyczogIE9iZFBhcnRfcAorLy8gICAgICAgICAgICAgIERpcmVjdGlvbl9wCisvLworLy8gUmV0dXJuOiAgICAgIHRFcGxLZXJuZWwKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMgRXBsT2JkQWNjZXNzT2RQYXJ0KEVQTF9NQ09fREVDTF9JTlNUQU5DRV9QVFJfCisJCQkJCQkgIHRFcGxPYmRQYXJ0IE9iZFBhcnRfcCwKKwkJCQkJCSAgdEVwbE9iZERpciBEaXJlY3Rpb25fcCkKK3sKKworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJQk9PTCBmUGFydEZvdW50OworCXRFcGxPYmRFbnRyeVB0ciBwT2JkRW50cnk7CisKKwkvLyBjaGVjayBmb3IgYWxsIEFQSSBmdW5jdGlvbiBpZiBpbnN0YW5jZSBpcyB2YWxpZAorCUVQTF9NQ09fQ0hFQ0tfSU5TVEFOQ0VfU1RBVEUoKTsKKworCS8vICBwYXJ0IGFsd2F5cyBoYXMgdG8gYmUgdW5lcXVhbCB0byBOVUxMCisJcE9iZEVudHJ5ID0gRVBMX01DT19HTEJfVkFSKG1fT2JkSW5pdFBhcmFtLm1fcFBhcnQpOworCUFTU0VSVE1TRyhwT2JkRW50cnkgIT0gTlVMTCwKKwkJICAiRXBsT2JkQWNjZXNzT2RQYXJ0KCk6IG5vICBPRCBwYXJ0IGlzIGRlZmluZWQhXG4iKTsKKworCS8vIGlmIE9iZFBhcnRfcCBpcyBub3QgdmFsaWQgZlBhcnRGb3VuZCBrZWVwcyBGQUxTRSBhbmQgZnVuY3Rpb24gcmV0dXJucyBrRXBsT2JkSWxsZWdhbFBhcnQKKwlmUGFydEZvdW50ID0gRkFMU0U7CisKKwkvLyBhY2Nlc3MgdG8gIHBhcnQKKwlpZiAoKE9iZFBhcnRfcCAmIGtFcGxPYmRQYXJ0R2VuKSAhPSAwKSB7CisJCWZQYXJ0Rm91bnQgPSBUUlVFOworCisJCVJldCA9IEVwbE9iZEFjY2Vzc09kUGFydEludGVybihFUExfTUNPX0lOU1RBTkNFX1BUUl8KKwkJCQkJICAgICAgIGtFcGxPYmRQYXJ0R2VuLCBwT2JkRW50cnksCisJCQkJCSAgICAgICBEaXJlY3Rpb25fcCk7CisJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCWdvdG8gRXhpdDsKKwkJfQorCX0KKwkvLyBhY2Nlc3MgdG8gbWFudWZhY3R1cmVyIHBhcnQKKwlwT2JkRW50cnkgPSBFUExfTUNPX0dMQl9WQVIobV9PYmRJbml0UGFyYW0ubV9wTWFudWZhY3R1cmVyUGFydCk7CisKKwlpZiAoKChPYmRQYXJ0X3AgJiBrRXBsT2JkUGFydE1hbikgIT0gMCkgJiYgKHBPYmRFbnRyeSAhPSBOVUxMKSkgeworCQlmUGFydEZvdW50ID0gVFJVRTsKKworCQlSZXQgPSBFcGxPYmRBY2Nlc3NPZFBhcnRJbnRlcm4oRVBMX01DT19JTlNUQU5DRV9QVFJfCisJCQkJCSAgICAgICBrRXBsT2JkUGFydE1hbiwgcE9iZEVudHJ5LAorCQkJCQkgICAgICAgRGlyZWN0aW9uX3ApOworCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQlnb3RvIEV4aXQ7CisJCX0KKwl9CisJLy8gYWNjZXNzIHRvIGRldmljZSBwYXJ0CisJcE9iZEVudHJ5ID0gRVBMX01DT19HTEJfVkFSKG1fT2JkSW5pdFBhcmFtLm1fcERldmljZVBhcnQpOworCisJaWYgKCgoT2JkUGFydF9wICYga0VwbE9iZFBhcnREZXYpICE9IDApICYmIChwT2JkRW50cnkgIT0gTlVMTCkpIHsKKwkJZlBhcnRGb3VudCA9IFRSVUU7CisKKwkJUmV0ID0gRXBsT2JkQWNjZXNzT2RQYXJ0SW50ZXJuKEVQTF9NQ09fSU5TVEFOQ0VfUFRSXworCQkJCQkgICAgICAga0VwbE9iZFBhcnREZXYsIHBPYmRFbnRyeSwKKwkJCQkJICAgICAgIERpcmVjdGlvbl9wKTsKKwkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJZ290byBFeGl0OworCQl9CisJfQorI2lmIChkZWZpbmVkIChFUExfT0JEX1VTRVJfT0QpICYmIChFUExfT0JEX1VTRVJfT0QgIT0gRkFMU0UpKQorCXsKKwkJLy8gYWNjZXNzIHRvIHVzZXIgcGFydAorCQlwT2JkRW50cnkgPSBFUExfTUNPX0dMQl9WQVIobV9PYmRJbml0UGFyYW0ubV9wVXNlclBhcnQpOworCisJCWlmICgoKE9iZFBhcnRfcCAmIGtFcGxPYmRQYXJ0VXNyKSAhPSAwKSAmJiAocE9iZEVudHJ5ICE9IE5VTEwpKSB7CisJCQlmUGFydEZvdW50ID0gVFJVRTsKKworCQkJUmV0ID0gRXBsT2JkQWNjZXNzT2RQYXJ0SW50ZXJuKEVQTF9NQ09fSU5TVEFOQ0VfUFRSXworCQkJCQkJICAgICAgIGtFcGxPYmRQYXJ0VXNyLAorCQkJCQkJICAgICAgIHBPYmRFbnRyeSwgRGlyZWN0aW9uX3ApOworCQkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJCWdvdG8gRXhpdDsKKwkJCX0KKwkJfQorCX0KKyNlbmRpZgorCisJLy8gbm8gYWNjZXNzIHRvIGFuIE9EIHBhcnQgd2FzIGRvbmU/IGlsbGVnYWwgT0QgcGFydCB3YXMgc3BlY2lmaWVkIQorCWlmIChmUGFydEZvdW50ID09IEZBTFNFKSB7CisJCVJldCA9IGtFcGxPYmRJbGxlZ2FsUGFydDsKKwl9CisKKyAgICAgIEV4aXQ6CisKKwlyZXR1cm4gUmV0OworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE9iZERlZmluZVZhcigpCisvLworLy8gRGVzY3JpcHRpb246IGRlZmluZXMgYSB2YXJpYWJsZSBpbiBPRAorLy8KKy8vIFBhcmFtZXRlcnM6ICBwRXBsVmFyUGFyYW1fcAorLy8KKy8vIFJldHVybjogICAgICB0RXBsS2VybmVsCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbE9iZERlZmluZVZhcihFUExfTUNPX0RFQ0xfSU5TVEFOQ0VfUFRSXworCQkJCQkgICAgICAgdEVwbFZhclBhcmFtIE1FTSAqIHBWYXJQYXJhbV9wKQoreworCisJdEVwbEtlcm5lbCBSZXQ7CisJdEVwbE9iZFZhckVudHJ5IE1FTSAqcFZhckVudHJ5OworCXRFcGxWYXJQYXJhbVZhbGlkIFZhclZhbGlkOworCXRFcGxPYmRTdWJFbnRyeVB0ciBwU3ViaW5kZXhFbnRyeTsKKworCS8vIGNoZWNrIGZvciBhbGwgQVBJIGZ1bmN0aW9uIGlmIGluc3RhbmNlIGlzIHZhbGlkCisJRVBMX01DT19DSEVDS19JTlNUQU5DRV9TVEFURSgpOworCisJQVNTRVJUKHBWYXJQYXJhbV9wICE9IE5VTEwpOwkvLyBpcyBub3QgYWxsb3dlZCB0byBiZSBOVUxMCisKKwkvLyBnZXQgYWRkcmVzcyBvZiBzdWJpbmRleCBlbnRyeQorCVJldCA9IEVwbE9iZEdldEVudHJ5KEVQTF9NQ09fSU5TVEFOQ0VfUFRSXworCQkJICAgICBwVmFyUGFyYW1fcC0+bV91aUluZGV4LAorCQkJICAgICBwVmFyUGFyYW1fcC0+bV91aVN1YmluZGV4LCBOVUxMLCAmcFN1YmluZGV4RW50cnkpOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKwkvLyBnZXQgdmFyIGVudHJ5CisJUmV0ID0gRXBsT2JkR2V0VmFyRW50cnkocFN1YmluZGV4RW50cnksICZwVmFyRW50cnkpOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKworCVZhclZhbGlkID0gcFZhclBhcmFtX3AtPm1fVmFsaWRGbGFnOworCisJLy8gY29weSBvbmx5IHRoaXMgdmFsdWVzLCB3aGljaCB2YWxpZCBmbGFnIGlzIHNldAorCWlmICgoVmFyVmFsaWQgJiBrVmFyVmFsaWRTaXplKSAhPSAwKSB7CisJCWlmIChwU3ViaW5kZXhFbnRyeS0+bV9UeXBlICE9IGtFcGxPYmRUeXBEb21haW4pIHsKKwkJCXRFcGxPYmRTaXplIERhdGFTaXplOworCisJCQkvLyBjaGVjayBwYXNzZWQgc2l6ZSBwYXJhbWV0ZXIKKwkJCURhdGFTaXplID0gRXBsT2JkR2V0T2JqZWN0U2l6ZShwU3ViaW5kZXhFbnRyeSk7CisJCQlpZiAoRGF0YVNpemUgIT0gcFZhclBhcmFtX3AtPm1fU2l6ZSkgewkvLyBzaXplIG9mIHZhcmlhYmxlIGRvZXMgbm90IG1hdGNoCisJCQkJUmV0ID0ga0VwbE9iZFZhbHVlTGVuZ3RoRXJyb3I7CisJCQkJZ290byBFeGl0OworCQkJfQorCQl9IGVsc2UgewkvLyBzaXplIGNhbiBiZSBzZXQgb25seSBmb3Igb2JqZWN0cyBvZiB0eXBlIERPTUFJTgorCQkJcFZhckVudHJ5LT5tX1NpemUgPSBwVmFyUGFyYW1fcC0+bV9TaXplOworCQl9CisJfQorCisJaWYgKChWYXJWYWxpZCAmIGtWYXJWYWxpZERhdGEpICE9IDApIHsKKwkJcFZhckVudHJ5LT5tX3BEYXRhID0gcFZhclBhcmFtX3AtPm1fcERhdGE7CisJfQorLyoKKyAgICAjaWYgKEVQTF9QRE9fVVNFX1NUQVRJQ19NQVBQSU5HID09IEZBTFNFKQorICAgIHsKKyAgICAgICAgaWYgKChWYXJWYWxpZCAmIGtWYXJWYWxpZENhbGxiYWNrKSAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgIHBWYXJFbnRyeS0+bV9mcENhbGxiYWNrID0gcFZhclBhcmFtX3AtPm1fZnBDYWxsYmFjazsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgoVmFyVmFsaWQgJiBrVmFyVmFsaWRBcmcpICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICAgcFZhckVudHJ5LT5tX3BBcmcgPSBwVmFyUGFyYW1fcC0+bV9wQXJnOworICAgICAgICB9CisgICAgfQorICAgICNlbmRpZgorKi8KKwkvLyBSZXQgaXMgYWxyZWFkeSBzZXQgdG8ga0VwbFN1Y2Nlc3NmdWwgZnJvbSBPYmRHZXRWYXJJbnRlcm4oKQorCisgICAgICBFeGl0OgorCisJcmV0dXJuIFJldDsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxPYmRHZXRPYmplY3REYXRhUHRyKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogSXQgcmV0dXJuZXMgdGhlIGN1cnJlbnQgZGF0YSBwb2ludGVyLiBCdXQgaWYgb2JqZWN0IGlzIGFuCisvLyAgICAgICAgICAgICAgY29uc3RhbnQgb2JqZWN0IGl0IHJldHVybmVzIHRoZSBkZWZhdWx0IHBvaW50ZXIuCisvLworLy8gUGFyYW1ldGVyczogIHVpSW5kZXhfcCAgICA9ICAgSW5kZXggb2YgdGhlIGVudHJ5CisvLyAgICAgICAgICAgICAgdWlTdWJpbmRleF9wID0gICBTdWJpbmRleCBvZiB0aGUgZW50cnkKKy8vCisvLyBSZXR1cm46ICAgICAgdm9pZCAqICAgID0gcG9pbnRlciB0byBvYmplY3QgZGF0YQorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0VQTERMTEVYUE9SVCB2b2lkICpQVUJMSUMgRXBsT2JkR2V0T2JqZWN0RGF0YVB0cihFUExfTUNPX0RFQ0xfSU5TVEFOQ0VfUFRSXworCQkJCQkJIHVuc2lnbmVkIGludCB1aUluZGV4X3AsCisJCQkJCQkgdW5zaWduZWQgaW50IHVpU3ViSW5kZXhfcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKwl2b2lkICpwRGF0YTsKKwl0RXBsT2JkRW50cnlQdHIgcE9iZEVudHJ5OworCXRFcGxPYmRTdWJFbnRyeVB0ciBwT2JkU3ViRW50cnk7CisKKwkvLyBnZXQgcG9pbnRlciB0byBpbmRleCBzdHJ1Y3R1cmUKKwlSZXQgPSBFcGxPYmRHZXRJbmRleEludGVybigmRVBMX01DT19HTEJfVkFSKG1fT2JkSW5pdFBhcmFtKSwKKwkJCQkgICB1aUluZGV4X3AsICZwT2JkRW50cnkpOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJcERhdGEgPSBOVUxMOworCQlnb3RvIEV4aXQ7CisJfQorCS8vIGdldCBwb2ludGVyIHRvIHN1YmluZGV4IHN0cnVjdHVyZQorCVJldCA9IEVwbE9iZEdldFN1YmluZGV4SW50ZXJuKHBPYmRFbnRyeSwgdWlTdWJJbmRleF9wLCAmcE9iZFN1YkVudHJ5KTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCXBEYXRhID0gTlVMTDsKKwkJZ290byBFeGl0OworCX0KKwkvLyBnZXQgRGF0YXBvaW50ZXIKKwlwRGF0YSA9IEVwbE9iZEdldE9iamVjdERhdGFQdHJJbnRlcm4ocE9iZFN1YkVudHJ5KTsKKworICAgICAgRXhpdDoKKwlyZXR1cm4gcERhdGE7CisKK30KKworI2lmIChkZWZpbmVkIChFUExfT0JEX1VTRVJfT0QpICYmIChFUExfT0JEX1VTRVJfT0QgIT0gRkFMU0UpKQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxPYmRSZWdpc3RlclVzZXJPZCgpCisvLworLy8gRGVzY3JpcHRpb246IGZ1bmN0aW9uIHJlZ2lzdGVycyB0aGUgdXNlciBPRAorLy8KKy8vIFBhcmFtZXRlcnM6ICBwVXNlck9kX3AgICA9cG9pbnRlciB0byB1c2VyIE9EZAorLy8KKy8vIFJldHVybjogICAgIHRFcGxLZXJuZWwgPSBlcnJvcmNvZGUKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbE9iZFJlZ2lzdGVyVXNlck9kKEVQTF9NQ09fREVDTF9JTlNUQU5DRV9QVFJfCisJCQkJCQkgICAgdEVwbE9iZEVudHJ5UHRyIHBVc2VyT2RfcCkKK3sKKworCUVQTF9NQ09fQ0hFQ0tfSU5TVEFOQ0VfU1RBVEUoKTsKKworCUVQTF9NQ09fR0xCX1ZBUihtX09iZEluaXRQYXJhbS5tX3BVc2VyUGFydCkgPSBwVXNlck9kX3A7CisKKwlyZXR1cm4ga0VwbFN1Y2Nlc3NmdWw7CisKK30KKworI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE9iZEluaXRWYXJFbnRyeSgpCisvLworLy8gRGVzY3JpcHRpb246IGZ1bmN0aW9uIHRvIGluaXRpYWxpemUgVmFyRW50cnkgZGVwZW5kZW5lZCBvbiBvYmplY3QgdHlwZQorLy8KKy8vIFBhcmFtZXRlcnM6ICBwVmFyRW50cnlfcCA9IHBvaW50ZXIgdG8gdmFyIGVudHJ5IHN0cnVjdHVyZQorLy8gICAgICAgICAgICAgIFR5cGVfcCAgICAgID0gb2JqZWN0IHR5cGUKKy8vICAgICAgICAgICAgICBPYmRTaXplX3AgICA9IHNpemUgb2Ygb2JqZWN0IGRhdGEKKy8vCisvLyBSZXR1cm5zOiAgICAgbm9uZQorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0VQTERMTEVYUE9SVCB2b2lkIFBVQkxJQyBFcGxPYmRJbml0VmFyRW50cnkoRVBMX01DT19ERUNMX0lOU1RBTkNFX1BUUl8KKwkJCQkJICAgIHRFcGxPYmRWYXJFbnRyeSBNRU0gKiBwVmFyRW50cnlfcCwKKwkJCQkJICAgIHRFcGxPYmRUeXBlIFR5cGVfcCwKKwkJCQkJICAgIHRFcGxPYmRTaXplIE9iZFNpemVfcCkKK3sKKy8qCisgICAgI2lmIChFUExfUERPX1VTRV9TVEFUSUNfTUFQUElORyA9PSBGQUxTRSkKKyAgICB7CisgICAgICAgIC8vIHJlc2V0IHBvaW50ZXIgdG8gVkFSIGNhbGxiYWNrIGFuZCBhcmd1bWVudAorICAgICAgICBwVmFyRW50cnlfcC0+bV9mcENhbGxiYWNrICA9IE5VTEw7CisgICAgICAgIHBWYXJFbnRyeV9wLT5tX3BBcmcgPSBOVUxMOworICAgIH0KKyAgICAjZW5kaWYKKyovCisKKy8vIDEwLWRlYy0yMDA0IHIuZC46IHRoaXMgZnVuY3Rpb24gd2lsbCBub3QgYmUgdXNlZCBmb3Igc3RyaW5ncworCWlmICgoVHlwZV9wID09IGtFcGxPYmRUeXBEb21haW4pKQorLy8gICAgICAgICAoYlR5cGVfcCA9PSBrRXBsT2JkVHlwVlN0cmluZykgLyogfHwKKy8vICAgICAgICAgKGJUeXBlX3AgPT0ga0VwbE9iZFR5cE9TdHJpbmcpIHx8CisvLyAgICAgICAgIChiVHlwZV9wID09IGtFcGxPYmRUeXBVU3RyaW5nKSAgICAqLyApCisJeworCQkvLyB2YXJpYWJsZXMgd2hpY2ggYXJlIGRlZmluZWQgYXMgRE9NQUlOIG9yIFZTVFJJTkcgc2hvdWxkIG5vdCBwb2ludCB0bworCQkvLyB0cmFzaCBvYmplY3QsIGJlY2F1c2UgdGhpcyB0cmFzaCBvYmplY3QgY29udGFpbnMgb25seSA4IGJ5dGVzLiBET01BSU5TIG9yCisJCS8vIFNUUklOR1MgY2FuIGJlIGxvbmdlci4KKwkJcFZhckVudHJ5X3AtPm1fcERhdGEgPSBOVUxMOworCQlwVmFyRW50cnlfcC0+bV9TaXplID0gMDsKKwl9IGVsc2UgeworCQkvLyBzZXQgYWRkcmVzcyB0byB2YXJpYWJsZSBkYXRhIHRvIHRyYXNoIG9iamVjdAorCQkvLyBUaGlzIHByZXZlbnRzIGFuIGFjY2VzcyB2aW9sYXRpb24gaWYgdXNlciBmb3JnZXRzIHRvIGNhbGwgRXBsT2JkRGVmaW5lVmFyKCkKKwkJLy8gZm9yIHRoaXMgdmFyaWFibGUgYnV0IG1hcHBlcyBpdCBpbiBhIFBETy4KKwkJcFZhckVudHJ5X3AtPm1fcERhdGEgPSAmYWJFcGxPYmRUcmFzaE9iamVjdF9nWzBdOworCQlwVmFyRW50cnlfcC0+bV9TaXplID0gT2JkU2l6ZV9wOworCX0KKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxPYmRHZXREYXRhU2l6ZSgpCisvLworLy8gRGVzY3JpcHRpb246IGZ1bmN0aW9uIHRvIGluaXRpYWxpemUgVmFyRW50cnkgZGVwZW5kZW5lZCBvbiBvYmplY3QgdHlwZQorLy8KKy8vICAgICAgICAgICAgICBnZXRzIHRoZSBkYXRhIHNpemUgb2YgYW4gb2JqZWN0CisvLyAgICAgICAgICAgICAgZm9yIHN0cmluZyBvYmplY3RzIGl0IHJldHVybmVzIHRoZSBzdHJpbmcgbGVuZ3RoCisvLworLy8gUGFyYW1ldGVyczogIEVQTF9NQ09fREVDTF9JTlNUQU5DRV9QVFJfID0gSW5zdGFuY2Vwb2ludGVyCisvLyAgICAgICAgICAgICAgdWlJbmRleF9wICAgPSAgIEluZGV4CisvLyAgICAgICAgICAgICAgdWlTdWJJbmRleF9wPSAgIFN1YmluZGV4CisvLworLy8gUmV0dXJuOiAgICAgIHRFcGxPYmRTaXplCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VQTERMTEVYUE9SVCB0RXBsT2JkU2l6ZSBQVUJMSUMgRXBsT2JkR2V0RGF0YVNpemUoRVBMX01DT19ERUNMX0lOU1RBTkNFX1BUUl8KKwkJCQkJCSAgdW5zaWduZWQgaW50IHVpSW5kZXhfcCwKKwkJCQkJCSAgdW5zaWduZWQgaW50IHVpU3ViSW5kZXhfcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKwl0RXBsT2JkU2l6ZSBPYmRTaXplOworCXRFcGxPYmRFbnRyeVB0ciBwT2JkRW50cnk7CisJdEVwbE9iZFN1YkVudHJ5UHRyIHBPYmRTdWJFbnRyeTsKKworCS8vIGdldCBwb2ludGVyIHRvIGluZGV4IHN0cnVjdHVyZQorCVJldCA9IEVwbE9iZEdldEluZGV4SW50ZXJuKCZFUExfTUNPX0dMQl9WQVIobV9PYmRJbml0UGFyYW0pLAorCQkJCSAgIHVpSW5kZXhfcCwgJnBPYmRFbnRyeSk7CisJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQlPYmRTaXplID0gMDsKKwkJZ290byBFeGl0OworCX0KKwkvLyBnZXQgcG9pbnRlciB0byBzdWJpbmRleCBzdHJ1Y3R1cmUKKwlSZXQgPSBFcGxPYmRHZXRTdWJpbmRleEludGVybihwT2JkRW50cnksIHVpU3ViSW5kZXhfcCwgJnBPYmRTdWJFbnRyeSk7CisJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQlPYmRTaXplID0gMDsKKwkJZ290byBFeGl0OworCX0KKwkvLyBnZXQgc2l6ZQorCU9iZFNpemUgPSBFcGxPYmRHZXREYXRhU2l6ZUludGVybihwT2JkU3ViRW50cnkpOworICAgICAgRXhpdDoKKwlyZXR1cm4gT2JkU2l6ZTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsT2JkR2V0Tm9kZUlkKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogZnVuY3Rpb24gcmV0dXJucyBub2RlaWQgZnJvbSBlbnRyeSAweDFGOTMKKy8vCisvLworLy8gUGFyYW1ldGVyczogIEVQTF9NQ09fREVDTF9JTlNUQU5DRV9QVFIgPSBJbnN0YW5jZXBvaW50ZXIKKy8vCisvLyBSZXR1cm46ICAgICAgdW5zaWduZWQgaW50ID0gTm9kZSBJZAorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdW5zaWduZWQgaW50IFBVQkxJQyBFcGxPYmRHZXROb2RlSWQoRVBMX01DT19ERUNMX0lOU1RBTkNFX1BUUikKK3sKKwl0RXBsS2VybmVsIFJldDsKKwl0RXBsT2JkU2l6ZSBPYmRTaXplOworCUJZVEUgYk5vZGVJZDsKKworCWJOb2RlSWQgPSAwOworCU9iZFNpemUgPSBzaXplb2YoYk5vZGVJZCk7CisJUmV0ID0gRXBsT2JkUmVhZEVudHJ5KEVQTF9NQ09fUFRSX0lOU1RBTkNFX1BUUl8KKwkJCSAgICAgIEVQTF9PQkRfTk9ERV9JRF9JTkRFWCwKKwkJCSAgICAgIEVQTF9PQkRfTk9ERV9JRF9TVUJJTkRFWCwgJmJOb2RlSWQsICZPYmRTaXplKTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCWJOb2RlSWQgPSBFUExfQ19BRFJfSU5WQUxJRDsKKwkJZ290byBFeGl0OworCX0KKworICAgICAgRXhpdDoKKwlyZXR1cm4gKHVuc2lnbmVkIGludCliTm9kZUlkOworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE9iZFNldE5vZGVJZCgpCisvLworLy8gRGVzY3JpcHRpb246IGZ1bmN0aW9uIHNldHMgbm9kZWlkIGluIGVudHJ5IDB4MUY5MworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOiAgRVBMX01DT19ERUNMX0lOU1RBTkNFX1BUUl8gPSBJbnN0YW5jZXBvaW50ZXIKKy8vICAgICAgICAgICAgICB1aU5vZGVJZF9wICA9ICAgTm9kZSBJZCB0byBzZXQKKy8vICAgICAgICAgICAgICBOb2RlSWRUeXBlX3A9ICAgVHlwZSBvbiB3aGljaCB3YXkgdGhlIE5vZGUgSWQgd2FzIHNldAorLy8KKy8vIFJldHVybjogICAgICB0RXBsS2VybmVsID0gRXJyb3Jjb2RlCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxPYmRTZXROb2RlSWQoRVBMX01DT19ERUNMX1BUUl9JTlNUQU5DRV9QVFJfCisJCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgdWlOb2RlSWRfcCwKKwkJCQkJICAgICAgIHRFcGxPYmROb2RlSWRUeXBlIE5vZGVJZFR5cGVfcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKwl0RXBsT2JkU2l6ZSBPYmRTaXplOworCUJZVEUgZkh3Qm9vbDsKKwlCWVRFIGJOb2RlSWQ7CisKKwkvLyBjaGVjayBOb2RlIElkCisJaWYgKHVpTm9kZUlkX3AgPT0gRVBMX0NfQURSX0lOVkFMSUQpIHsKKwkJUmV0ID0ga0VwbEludmFsaWROb2RlSWQ7CisJCWdvdG8gRXhpdDsKKwl9CisJYk5vZGVJZCA9IChCWVRFKSB1aU5vZGVJZF9wOworCU9iZFNpemUgPSBzaXplb2YoQllURSk7CisJLy8gd3JpdGUgTm9kZUlkIHRvIE9EIGVudHJ5CisJUmV0ID0gRXBsT2JkV3JpdGVFbnRyeShFUExfTUNPX1BUUl9JTlNUQU5DRV9QVFJfCisJCQkgICAgICAgRVBMX09CRF9OT0RFX0lEX0lOREVYLAorCQkJICAgICAgIEVQTF9PQkRfTk9ERV9JRF9TVUJJTkRFWCwgJmJOb2RlSWQsIE9iZFNpemUpOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKwkvLyBzZXQgSFdCT09MLUZsYWcgaW4gU3ViaW5kZXggRVBMX09CRF9OT0RFX0lEX0hXQk9PTF9TVUJJTkRFWAorCXN3aXRjaCAoTm9kZUlkVHlwZV9wKSB7CisJCS8vIHR5cGUgdW5rbm93bgorCWNhc2Uga0VwbE9iZE5vZGVJZFVua25vd246CisJCXsKKwkJCWZId0Jvb2wgPSBPQkRfRkFMU0U7CisJCQlicmVhazsKKwkJfQorCisJY2FzZSBrRXBsT2JkTm9kZUlkU29mdHdhcmU6CisJCXsKKwkJCWZId0Jvb2wgPSBPQkRfRkFMU0U7CisJCQlicmVhazsKKwkJfQorCisJY2FzZSBrRXBsT2JkTm9kZUlkSGFyZHdhcmU6CisJCXsKKwkJCWZId0Jvb2wgPSBPQkRfVFJVRTsKKwkJCWJyZWFrOworCQl9CisKKwlkZWZhdWx0OgorCQl7CisJCQlmSHdCb29sID0gT0JEX0ZBTFNFOworCQl9CisKKwl9CQkJLy8gZW5kIG9mIHN3aXRjaCAoTm9kZUlkVHlwZV9wKQorCisJLy8gd3JpdGUgZmxhZworCU9iZFNpemUgPSBzaXplb2YoZkh3Qm9vbCk7CisJUmV0ID0gRXBsT2JkV3JpdGVFbnRyeShFUExfTUNPX1BUUl9JTlNUQU5DRV9QVFIKKwkJCSAgICAgICBFUExfT0JEX05PREVfSURfSU5ERVgsCisJCQkgICAgICAgRVBMX09CRF9OT0RFX0lEX0hXQk9PTF9TVUJJTkRFWCwKKwkJCSAgICAgICAmZkh3Qm9vbCwgT2JkU2l6ZSk7CisJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQlnb3RvIEV4aXQ7CisJfQorCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE9iZElzTnVtZXJpY2FsKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogZnVuY3Rpb24gY2hlY2tzIGlmIGEgZW50cnkgaXMgbnVtZXJpY2FsIG9yIG5vdAorLy8KKy8vCisvLyBQYXJhbWV0ZXJzOiAgRVBMX01DT19ERUNMX0lOU1RBTkNFX1BUUl8gPSBJbnN0YW5jZXBvaW50ZXIKKy8vICAgICAgICAgICAgICB1aUluZGV4X3AgICAgICAgICAgID0gSW5kZXgKKy8vICAgICAgICAgICAgICB1aVN1YkluZGV4X3AgICAgICAgID0gU3ViaW5kZXgKKy8vICAgICAgICAgICAgICBwZkVudHJ5TnVtZXJpY2FsX3AgID0gcG9pbnRlciB0byBCT09MIGZvciByZXR1cm52YWx1ZQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gVFJVRSBpZiBlbnRyeSBhIG51bWVyaWNhbCB2YWx1ZQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gRkFMU0UgaWYgZW50cnkgbm90IGEgbnVtZXJpY2FsIHZhbHVlCisvLworLy8gUmV0dXJuOiAgICAgIHRFcGxLZXJuZWwgPSBFcnJvcmNvZGUKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbE9iZElzTnVtZXJpY2FsKEVQTF9NQ09fREVDTF9JTlNUQU5DRV9QVFJfCisJCQkJCQkgdW5zaWduZWQgaW50IHVpSW5kZXhfcCwKKwkJCQkJCSB1bnNpZ25lZCBpbnQgdWlTdWJJbmRleF9wLAorCQkJCQkJIEJPT0wgKiBwZkVudHJ5TnVtZXJpY2FsX3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisJdEVwbE9iZEVudHJ5UHRyIHBPYmRFbnRyeTsKKwl0RXBsT2JkU3ViRW50cnlQdHIgcE9iZFN1YkVudHJ5OworCisJLy8gZ2V0IHBvaW50ZXIgdG8gaW5kZXggc3RydWN0dXJlCisJUmV0ID0gRXBsT2JkR2V0SW5kZXhJbnRlcm4oJkVQTF9NQ09fR0xCX1ZBUihtX09iZEluaXRQYXJhbSksCisJCQkJICAgdWlJbmRleF9wLCAmcE9iZEVudHJ5KTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gZ2V0IHBvaW50ZXIgdG8gc3ViaW5kZXggc3RydWN0dXJlCisJUmV0ID0gRXBsT2JkR2V0U3ViaW5kZXhJbnRlcm4ocE9iZEVudHJ5LCB1aVN1YkluZGV4X3AsICZwT2JkU3ViRW50cnkpOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKworCVJldCA9IEVwbE9iZElzTnVtZXJpY2FsSW50ZXJuKHBPYmRTdWJFbnRyeSwgcGZFbnRyeU51bWVyaWNhbF9wKTsKKworICAgICAgRXhpdDoKKwlyZXR1cm4gUmV0OworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE9iZFJlYWRFbnRyeVRvTGUoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBUaGUgZnVuY3Rpb24gcmVhZHMgYW4gb2JqZWN0IGVudHJ5IGZyb20gdGhlIGJ5dGVvZGVyCisvLyAgICAgICAgICAgICAgb2YgdGhlIHN5c3RlbSB0byB0aGUgbGl0dGxlIGVuZGlhbiBieXRlb3JkZXIgZm9yIG51bWVyaWNhbCB2YWx1ZXMuCisvLyAgICAgICAgICAgICAgRm9yIG90aGVyIHR5cGVzIGEgbm9ybWFsIHJlYWQgd2lsbCBiZSBwcm9jZXNzZWQuIFRoaXMgaXMgdXNlZnVsbCBmb3IKKy8vICAgICAgICAgICAgICB0aGUgUERPIGFuZCBTRE8gbW9kdWxlLiBUaGUgYXBwbGljYXRpb24KKy8vICAgICAgICAgICAgICBjYW4gYWx3YXlzIHJlYWQgdGhlIGRhdGEgZXZlbiBpZiBhdHRyaWIga0VwbE9iZEFjY1JlYWQKKy8vICAgICAgICAgICAgICBpcyBub3Qgc2V0LiBUaGUgYXR0cmliIGlzIG9ubHkgY2hlY2tlZCB1cCBmb3IgU0RPIHRyYW5zZmVyLgorLy8KKy8vIFBhcmFtZXRlcnM6ICBFUExfTUNPX0RFQ0xfSU5TVEFOQ0VfUFRSXworLy8gICAgICAgICAgICAgIHVpSW5kZXhfcCAgICAgICA9IEluZGV4IG9mIHRoZSBPRCBlbnRyeSB0byByZWFkCisvLyAgICAgICAgICAgICAgdWlTdWJJbmRleF9wICAgID0gU3ViaW5kZXggdG8gcmVhZAorLy8gICAgICAgICAgICAgIHBEc3REYXRhX3AgICAgICA9IHBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBmb3IgZGF0YQorLy8gICAgICAgICAgICAgIE9mZnNldF9wICAgICAgICA9IG9mZnNldCBpbiBkYXRhIGZvciByZWFkIGFjY2VzcworLy8gICAgICAgICAgICAgIHBTaXplX3AgICAgICAgICA9IElOOiBTaXplIG9mIHRoZSBidWZmZXIKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPVVQ6IG51bWJlciBvZiByZWFkZWQgQnl0ZXMKKy8vCisvLyBSZXR1cm46ICAgICAgdEVwbEtlcm5lbAorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMgRXBsT2JkUmVhZEVudHJ5VG9MZShFUExfTUNPX0RFQ0xfSU5TVEFOQ0VfUFRSXworCQkJCQkJICAgdW5zaWduZWQgaW50IHVpSW5kZXhfcCwKKwkJCQkJCSAgIHVuc2lnbmVkIGludCB1aVN1YkluZGV4X3AsCisJCQkJCQkgICB2b2lkICpwRHN0RGF0YV9wLAorCQkJCQkJICAgdEVwbE9iZFNpemUgKiBwU2l6ZV9wKQoreworCXRFcGxLZXJuZWwgUmV0OworCXRFcGxPYmRFbnRyeVB0ciBwT2JkRW50cnk7CisJdEVwbE9iZFN1YkVudHJ5UHRyIHBTdWJFbnRyeTsKKwl0RXBsT2JkQ2JQYXJhbSBNRU0gQ2JQYXJhbTsKKwl2b2lkICpwU3JjRGF0YTsKKwl0RXBsT2JkU2l6ZSBPYmRTaXplOworCisJLy8gY2hlY2sgZm9yIGFsbCBBUEkgZnVuY3Rpb24gaWYgaW5zdGFuY2UgaXMgdmFsaWQKKwlFUExfTUNPX0NIRUNLX0lOU1RBTkNFX1NUQVRFKCk7CisKKwlBU1NFUlQocERzdERhdGFfcCAhPSBOVUxMKTsKKwlBU1NFUlQocFNpemVfcCAhPSBOVUxMKTsKKworCS8vIGdldCBhZGRyZXNzIG9mIGluZGV4IGFuZCBzdWJpbmRleCBlbnRyeQorCVJldCA9IEVwbE9iZEdldEVudHJ5KEVQTF9NQ09fSU5TVEFOQ0VfUFRSXworCQkJICAgICB1aUluZGV4X3AsIHVpU3ViSW5kZXhfcCwgJnBPYmRFbnRyeSwgJnBTdWJFbnRyeSk7CisJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQlnb3RvIEV4aXQ7CisJfQorCS8vIGdldCBwb2ludGVyIHRvIG9iamVjdCBkYXRhCisJcFNyY0RhdGEgPSBFcGxPYmRHZXRPYmplY3REYXRhUHRySW50ZXJuKHBTdWJFbnRyeSk7CisKKwkvLyBjaGVjayBzb3VyY2UgcG9pbnRlcgorCWlmIChwU3JjRGF0YSA9PSBOVUxMKSB7CisJCVJldCA9IGtFcGxPYmRSZWFkVmlvbGF0aW9uOworCQlnb3RvIEV4aXQ7CisJfQorCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJLy8gYWRkcmVzcyBvZiBzb3VyY2UgZGF0YSB0byBzdHJ1Y3R1cmUgb2YgY2FsbGJhY2sgcGFyYW1ldGVycworCS8vIHNvIGNhbGxiYWNrIGZ1bmN0aW9uIGNhbiBjaGFuZ2UgdGhpcyBkYXRhIGJlZm9yZSByZWFkaW5nCisJQ2JQYXJhbS5tX3VpSW5kZXggPSB1aUluZGV4X3A7CisJQ2JQYXJhbS5tX3VpU3ViSW5kZXggPSB1aVN1YkluZGV4X3A7CisJQ2JQYXJhbS5tX3BBcmcgPSBwU3JjRGF0YTsKKwlDYlBhcmFtLm1fT2JkRXZlbnQgPSBrRXBsT2JkRXZQcmVSZWFkOworCVJldCA9IEVwbE9iZENhbGxPYmplY3RDYWxsYmFjayhFUExfTUNPX0lOU1RBTkNFX1BUUl8KKwkJCQkgICAgICAgcE9iZEVudHJ5LT5tX2ZwQ2FsbGJhY2ssICZDYlBhcmFtKTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gZ2V0IHNpemUgb2YgZGF0YSBhbmQgY2hlY2sgaWYgYXBwbGljYXRpb24gaGFzIHJlc2VydmVkIGVub3VnaCBtZW1vcnkKKwlPYmRTaXplID0gRXBsT2JkR2V0RGF0YVNpemVJbnRlcm4ocFN1YkVudHJ5KTsKKwkvLyBjaGVjayBpZiBvZmZzZXQgZ2l2ZW4gYW5kIGNhbGMgY29ycmVjdCBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZAorCWlmICgqcFNpemVfcCA8IE9iZFNpemUpIHsKKwkJUmV0ID0ga0VwbE9iZFZhbHVlTGVuZ3RoRXJyb3I7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gY2hlY2sgaWYgbnVtZXJpY2FsIHR5cGUKKwlzd2l0Y2ggKHBTdWJFbnRyeS0+bV9UeXBlKSB7CisJCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJLy8gdHlwZXMgd2l0aG91dCBhbWkKKwljYXNlIGtFcGxPYmRUeXBWU3RyaW5nOgorCWNhc2Uga0VwbE9iZFR5cE9TdHJpbmc6CisJY2FzZSBrRXBsT2JkVHlwRG9tYWluOgorCWRlZmF1bHQ6CisJCXsKKwkJCS8vIHJlYWQgdmFsdWUgZnJvbSBvYmplY3QKKwkJCUVQTF9NRU1DUFkocERzdERhdGFfcCwgcFNyY0RhdGEsIE9iZFNpemUpOworCQkJYnJlYWs7CisJCX0KKworCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCS8vIG51bWVyaWNhbCB0eXBlIHdoaWNoIG5lZWRzIGFtaS13cml0ZQorCQkvLyA4IGJpdCBvciBzbWFsbGVyIHZhbHVlcworCWNhc2Uga0VwbE9iZFR5cEJvb2w6CisJY2FzZSBrRXBsT2JkVHlwSW50ODoKKwljYXNlIGtFcGxPYmRUeXBVSW50ODoKKwkJeworCQkJQW1pU2V0Qnl0ZVRvTGUocERzdERhdGFfcCwgKigoQllURSAqKSBwU3JjRGF0YSkpOworCQkJYnJlYWs7CisJCX0KKworCQkvLyAxNiBiaXQgdmFsdWVzCisJY2FzZSBrRXBsT2JkVHlwSW50MTY6CisJY2FzZSBrRXBsT2JkVHlwVUludDE2OgorCQl7CisJCQlBbWlTZXRXb3JkVG9MZShwRHN0RGF0YV9wLCAqKChXT1JEICopIHBTcmNEYXRhKSk7CisJCQlicmVhazsKKwkJfQorCisJCS8vIDI0IGJpdCB2YWx1ZXMKKwljYXNlIGtFcGxPYmRUeXBJbnQyNDoKKwljYXNlIGtFcGxPYmRUeXBVSW50MjQ6CisJCXsKKwkJCUFtaVNldER3b3JkMjRUb0xlKHBEc3REYXRhX3AsICooKERXT1JEICopIHBTcmNEYXRhKSk7CisJCQlicmVhazsKKwkJfQorCisJCS8vIDMyIGJpdCB2YWx1ZXMKKwljYXNlIGtFcGxPYmRUeXBJbnQzMjoKKwljYXNlIGtFcGxPYmRUeXBVSW50MzI6CisJY2FzZSBrRXBsT2JkVHlwUmVhbDMyOgorCQl7CisJCQlBbWlTZXREd29yZFRvTGUocERzdERhdGFfcCwgKigoRFdPUkQgKikgcFNyY0RhdGEpKTsKKwkJCWJyZWFrOworCQl9CisKKwkJLy8gNDAgYml0IHZhbHVlcworCWNhc2Uga0VwbE9iZFR5cEludDQwOgorCWNhc2Uga0VwbE9iZFR5cFVJbnQ0MDoKKwkJeworCQkJQW1pU2V0UXdvcmQ0MFRvTGUocERzdERhdGFfcCwgKigoUVdPUkQgKikgcFNyY0RhdGEpKTsKKwkJCWJyZWFrOworCQl9CisKKwkJLy8gNDggYml0IHZhbHVlcworCWNhc2Uga0VwbE9iZFR5cEludDQ4OgorCWNhc2Uga0VwbE9iZFR5cFVJbnQ0ODoKKwkJeworCQkJQW1pU2V0UXdvcmQ0OFRvTGUocERzdERhdGFfcCwgKigoUVdPUkQgKikgcFNyY0RhdGEpKTsKKwkJCWJyZWFrOworCQl9CisKKwkJLy8gNTYgYml0IHZhbHVlcworCWNhc2Uga0VwbE9iZFR5cEludDU2OgorCWNhc2Uga0VwbE9iZFR5cFVJbnQ1NjoKKwkJeworCQkJQW1pU2V0UXdvcmQ1NlRvTGUocERzdERhdGFfcCwgKigoUVdPUkQgKikgcFNyY0RhdGEpKTsKKwkJCWJyZWFrOworCQl9CisKKwkJLy8gNjQgYml0IHZhbHVlcworCWNhc2Uga0VwbE9iZFR5cEludDY0OgorCWNhc2Uga0VwbE9iZFR5cFVJbnQ2NDoKKwljYXNlIGtFcGxPYmRUeXBSZWFsNjQ6CisJCXsKKwkJCUFtaVNldFF3b3JkNjRUb0xlKHBEc3REYXRhX3AsICooKFFXT1JEICopIHBTcmNEYXRhKSk7CisJCQlicmVhazsKKwkJfQorCisJCS8vIHRpbWUgb2YgZGF5CisJY2FzZSBrRXBsT2JkVHlwVGltZU9mRGF5OgorCWNhc2Uga0VwbE9iZFR5cFRpbWVEaWZmOgorCQl7CisJCQlBbWlTZXRUaW1lT2ZEYXkocERzdERhdGFfcCwgKCh0VGltZU9mRGF5ICopIHBTcmNEYXRhKSk7CisJCQlicmVhazsKKwkJfQorCisJfQkJCS8vIGVuZCBvZiBzd2l0Y2gocFN1YkVudHJ5LT5tX1R5cGUpCisKKwkqcFNpemVfcCA9IE9iZFNpemU7CisKKwkvLyB3cml0ZSBhZGRyZXNzIG9mIGRlc3RpbmF0aW9uIGRhdGEgdG8gc3RydWN0dXJlIG9mIGNhbGxiYWNrIHBhcmFtZXRlcnMKKwkvLyBzbyBjYWxsYmFjayBmdW5jdGlvbiBjYW4gY2hhbmdlIHRoaXMgZGF0YSBhZnRlciByZWFkaW5nCisJQ2JQYXJhbS5tX3BBcmcgPSBwRHN0RGF0YV9wOworCUNiUGFyYW0ubV9PYmRFdmVudCA9IGtFcGxPYmRFdlBvc3RSZWFkOworCVJldCA9IEVwbE9iZENhbGxPYmplY3RDYWxsYmFjayhFUExfTUNPX0lOU1RBTkNFX1BUUl8KKwkJCQkgICAgICAgcE9iZEVudHJ5LT5tX2ZwQ2FsbGJhY2ssICZDYlBhcmFtKTsKKworICAgICAgRXhpdDoKKworCXJldHVybiBSZXQ7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsT2JkV3JpdGVFbnRyeUZyb21MZSgpCisvLworLy8gRGVzY3JpcHRpb246IEZ1bmN0aW9uIHdyaXRlcyBkYXRhIHRvIGFuIE9CRCBlbnRyeSBmcm9tIGEgc291cmNlIHdpdGgKKy8vICAgICAgICAgICAgICBsaXR0bGUgZW5kaWFuIGJ5dGVvcmRlciB0byB0aGUgb2Qgd2l0aCBzeXN0ZW0gc3BlY3VpZmljCisvLyAgICAgICAgICAgICAgYnl0ZW9yZGVyLiBOb3QgbnVtZXJpY2FsIHZhbHVlcyB3aWxsIG9ubHkgYnkgY29waWVkLiBTdHJpbmdzCisvLyAgICAgICAgICAgICAgYXJlIHN0b3JlZCB3aXRoIGFkZGVkICdcMCcgY2hhcmFjdGVyLgorLy8KKy8vIFBhcmFtZXRlcnM6ICBFUExfTUNPX0RFQ0xfSU5TVEFOQ0VfUFRSXworLy8gICAgICAgICAgICAgIHVpSW5kZXhfcCAgICAgICA9ICAgSW5kZXggb2YgdGhlIE9EIGVudHJ5CisvLyAgICAgICAgICAgICAgdWlTdWJJbmRleF9wICAgID0gICBTdWJpbmRleCBvZiB0aGUgT0QgRW50cnkKKy8vICAgICAgICAgICAgICBwU3JjRGF0YV9wICAgICAgPSAgIFBvaW50ZXIgdG8gdGhlIGRhdGEgdG8gd3JpdGUKKy8vICAgICAgICAgICAgICBTaXplX3AgICAgICAgICAgPSAgIFNpemUgb2YgdGhlIGRhdGEgaW4gQnl0ZQorLy8KKy8vIFJldHVybjogICAgICB0RXBsS2VybmVsICAgICAgPSAgIEVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbE9iZFdyaXRlRW50cnlGcm9tTGUoRVBMX01DT19ERUNMX0lOU1RBTkNFX1BUUl8KKwkJCQkJCSAgICAgIHVuc2lnbmVkIGludCB1aUluZGV4X3AsCisJCQkJCQkgICAgICB1bnNpZ25lZCBpbnQgdWlTdWJJbmRleF9wLAorCQkJCQkJICAgICAgdm9pZCAqcFNyY0RhdGFfcCwKKwkJCQkJCSAgICAgIHRFcGxPYmRTaXplIFNpemVfcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKwl0RXBsT2JkRW50cnlQdHIgcE9iZEVudHJ5OworCXRFcGxPYmRTdWJFbnRyeVB0ciBwU3ViRW50cnk7CisJdEVwbE9iZENiUGFyYW0gTUVNIENiUGFyYW07CisJdm9pZCBNRU0gKnBEc3REYXRhOworCXRFcGxPYmRTaXplIE9iZFNpemU7CisJUVdPUkQgcXdCdWZmZXI7CisJdm9pZCAqcEJ1ZmZlciA9ICZxd0J1ZmZlcjsKKworCVJldCA9IEVwbE9iZFdyaXRlRW50cnlQcmUoRVBMX01DT19JTlNUQU5DRV9QVFJfCisJCQkJICB1aUluZGV4X3AsCisJCQkJICB1aVN1YkluZGV4X3AsCisJCQkJICBwU3JjRGF0YV9wLAorCQkJCSAgJnBEc3REYXRhLAorCQkJCSAgU2l6ZV9wLAorCQkJCSAgJnBPYmRFbnRyeSwgJnBTdWJFbnRyeSwgJkNiUGFyYW0sICZPYmRTaXplKTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCWdvdG8gRXhpdDsKKwl9CisKKwkvLyBjaGVjayBpZiBudW1lcmljYWwgdHlwZQorCXN3aXRjaCAocFN1YkVudHJ5LT5tX1R5cGUpIHsKKwkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkvLyB0eXBlcyB3aXRob3V0IGFtaQorCWRlZmF1bHQ6CisJCXsJCS8vIGRvIG5vdGhpbmcsIGkuZS4gdXNlIHRoZSBnaXZlbiBzb3VyY2UgcG9pbnRlcgorCQkJcEJ1ZmZlciA9IHBTcmNEYXRhX3A7CisJCQlicmVhazsKKwkJfQorCisJCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJLy8gbnVtZXJpY2FsIHR5cGUgd2hpY2ggbmVlZHMgYW1pLXdyaXRlCisJCS8vIDggYml0IG9yIHNtYWxsZXIgdmFsdWVzCisJY2FzZSBrRXBsT2JkVHlwQm9vbDoKKwljYXNlIGtFcGxPYmRUeXBJbnQ4OgorCWNhc2Uga0VwbE9iZFR5cFVJbnQ4OgorCQl7CisJCQkqKChCWVRFICopIHBCdWZmZXIpID0gQW1pR2V0Qnl0ZUZyb21MZShwU3JjRGF0YV9wKTsKKwkJCWJyZWFrOworCQl9CisKKwkJLy8gMTYgYml0IHZhbHVlcworCWNhc2Uga0VwbE9iZFR5cEludDE2OgorCWNhc2Uga0VwbE9iZFR5cFVJbnQxNjoKKwkJeworCQkJKigoV09SRCAqKSBwQnVmZmVyKSA9IEFtaUdldFdvcmRGcm9tTGUocFNyY0RhdGFfcCk7CisJCQlicmVhazsKKwkJfQorCisJCS8vIDI0IGJpdCB2YWx1ZXMKKwljYXNlIGtFcGxPYmRUeXBJbnQyNDoKKwljYXNlIGtFcGxPYmRUeXBVSW50MjQ6CisJCXsKKwkJCSooKERXT1JEICopIHBCdWZmZXIpID0gQW1pR2V0RHdvcmQyNEZyb21MZShwU3JjRGF0YV9wKTsKKwkJCWJyZWFrOworCQl9CisKKwkJLy8gMzIgYml0IHZhbHVlcworCWNhc2Uga0VwbE9iZFR5cEludDMyOgorCWNhc2Uga0VwbE9iZFR5cFVJbnQzMjoKKwljYXNlIGtFcGxPYmRUeXBSZWFsMzI6CisJCXsKKwkJCSooKERXT1JEICopIHBCdWZmZXIpID0gQW1pR2V0RHdvcmRGcm9tTGUocFNyY0RhdGFfcCk7CisJCQlicmVhazsKKwkJfQorCisJCS8vIDQwIGJpdCB2YWx1ZXMKKwljYXNlIGtFcGxPYmRUeXBJbnQ0MDoKKwljYXNlIGtFcGxPYmRUeXBVSW50NDA6CisJCXsKKwkJCSooKFFXT1JEICopIHBCdWZmZXIpID0gQW1pR2V0UXdvcmQ0MEZyb21MZShwU3JjRGF0YV9wKTsKKwkJCWJyZWFrOworCQl9CisKKwkJLy8gNDggYml0IHZhbHVlcworCWNhc2Uga0VwbE9iZFR5cEludDQ4OgorCWNhc2Uga0VwbE9iZFR5cFVJbnQ0ODoKKwkJeworCQkJKigoUVdPUkQgKikgcEJ1ZmZlcikgPSBBbWlHZXRRd29yZDQ4RnJvbUxlKHBTcmNEYXRhX3ApOworCQkJYnJlYWs7CisJCX0KKworCQkvLyA1NiBiaXQgdmFsdWVzCisJY2FzZSBrRXBsT2JkVHlwSW50NTY6CisJY2FzZSBrRXBsT2JkVHlwVUludDU2OgorCQl7CisJCQkqKChRV09SRCAqKSBwQnVmZmVyKSA9IEFtaUdldFF3b3JkNTZGcm9tTGUocFNyY0RhdGFfcCk7CisJCQlicmVhazsKKwkJfQorCisJCS8vIDY0IGJpdCB2YWx1ZXMKKwljYXNlIGtFcGxPYmRUeXBJbnQ2NDoKKwljYXNlIGtFcGxPYmRUeXBVSW50NjQ6CisJY2FzZSBrRXBsT2JkVHlwUmVhbDY0OgorCQl7CisJCQkqKChRV09SRCAqKSBwQnVmZmVyKSA9IEFtaUdldFF3b3JkNjRGcm9tTGUocFNyY0RhdGFfcCk7CisJCQlicmVhazsKKwkJfQorCisJCS8vIHRpbWUgb2YgZGF5CisJY2FzZSBrRXBsT2JkVHlwVGltZU9mRGF5OgorCWNhc2Uga0VwbE9iZFR5cFRpbWVEaWZmOgorCQl7CisJCQlBbWlHZXRUaW1lT2ZEYXkocEJ1ZmZlciwgKCh0VGltZU9mRGF5ICopIHBTcmNEYXRhX3ApKTsKKwkJCWJyZWFrOworCQl9CisKKwl9CQkJLy8gZW5kIG9mIHN3aXRjaChwU3ViRW50cnktPm1fVHlwZSkKKworCVJldCA9IEVwbE9iZFdyaXRlRW50cnlQb3N0KEVQTF9NQ09fSU5TVEFOQ0VfUFRSXworCQkJCSAgIHBPYmRFbnRyeSwKKwkJCQkgICBwU3ViRW50cnksCisJCQkJICAgJkNiUGFyYW0sIHBCdWZmZXIsIHBEc3REYXRhLCBPYmRTaXplKTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCWdvdG8gRXhpdDsKKwl9CisKKyAgICAgIEV4aXQ6CisKKwlyZXR1cm4gUmV0OworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE9iZEdldEFjY2Vzc1R5cGUoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBGdW5jdGlvbiByZXR1cm5zIGFjY2Vzc3R5cGUgb2YgdGhlIGVudHJ5CisvLworLy8gUGFyYW1ldGVyczogIEVQTF9NQ09fREVDTF9JTlNUQU5DRV9QVFJfCisvLyAgICAgICAgICAgICAgdWlJbmRleF9wICAgICAgID0gICBJbmRleCBvZiB0aGUgT0QgZW50cnkKKy8vICAgICAgICAgICAgICB1aVN1YkluZGV4X3AgICAgPSAgIFN1YmluZGV4IG9mIHRoZSBPRCBFbnRyeQorLy8gICAgICAgICAgICAgIHBBY2Nlc3NUeXBfcCAgICA9ICAgcG9pbnRlciB0byBidWZmZXIgdG8gc3RvcmUgYWNjZXNzdHlwZQorLy8KKy8vIFJldHVybjogICAgICB0RXBsS2VybmVsICAgICA9ICAgZXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMgRXBsT2JkR2V0QWNjZXNzVHlwZShFUExfTUNPX0RFQ0xfSU5TVEFOQ0VfUFRSXworCQkJCQkJICAgdW5zaWduZWQgaW50IHVpSW5kZXhfcCwKKwkJCQkJCSAgIHVuc2lnbmVkIGludCB1aVN1YkluZGV4X3AsCisJCQkJCQkgICB0RXBsT2JkQWNjZXNzICogcEFjY2Vzc1R5cF9wKQoreworCXRFcGxLZXJuZWwgUmV0OworCXRFcGxPYmRFbnRyeVB0ciBwT2JkRW50cnk7CisJdEVwbE9iZFN1YkVudHJ5UHRyIHBPYmRTdWJFbnRyeTsKKworCS8vIGdldCBwb2ludGVyIHRvIGluZGV4IHN0cnVjdHVyZQorCVJldCA9IEVwbE9iZEdldEluZGV4SW50ZXJuKCZFUExfTUNPX0dMQl9WQVIobV9PYmRJbml0UGFyYW0pLAorCQkJCSAgIHVpSW5kZXhfcCwgJnBPYmRFbnRyeSk7CisJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQlnb3RvIEV4aXQ7CisJfQorCS8vIGdldCBwb2ludGVyIHRvIHN1YmluZGV4IHN0cnVjdHVyZQorCVJldCA9IEVwbE9iZEdldFN1YmluZGV4SW50ZXJuKHBPYmRFbnRyeSwgdWlTdWJJbmRleF9wLCAmcE9iZFN1YkVudHJ5KTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gZ2V0IGFjY2Vzc1R5cGUKKwkqcEFjY2Vzc1R5cF9wID0gcE9iZFN1YkVudHJ5LT5tX0FjY2VzczsKKworICAgICAgRXhpdDoKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxPYmRTZWFyY2hWYXJFbnRyeSgpCisvLworLy8gRGVzY3JpcHRpb246IGdldHMgdmFyaWFibGUgZnJvbSBPRAorLy8KKy8vIFBhcmFtZXRlcnM6ICB1aUluZGV4X3AgICAgICAgPSAgIGluZGV4IG9mIHRoZSB2YXIgZW50cnkgdG8gc2VhcmNoCisvLyAgICAgICAgICAgICAgdWlTdWJpbmRleF9wICAgID0gICBzdWJpbmRleCBvZiB2YXIgZW50cnkgdG8gc2VhcmNoCisvLyAgICAgICAgICAgICAgcHBWYXJFbnRyeV9wICAgID0gICBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSB2YXJlbnRyeQorLy8KKy8vIFJldHVybjogICAgICB0RXBsS2VybmVsCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsT2JkU2VhcmNoVmFyRW50cnkoRVBMX01DT19ERUNMX0lOU1RBTkNFX1BUUl8KKwkJCQkgICAgICAgdW5zaWduZWQgaW50IHVpSW5kZXhfcCwKKwkJCQkgICAgICAgdW5zaWduZWQgaW50IHVpU3ViaW5kZXhfcCwKKwkJCQkgICAgICAgdEVwbE9iZFZhckVudHJ5IE1FTSAqKiBwcFZhckVudHJ5X3ApCit7CisKKwl0RXBsS2VybmVsIFJldDsKKwl0RXBsT2JkU3ViRW50cnlQdHIgcFN1YmluZGV4RW50cnk7CisKKwkvLyBjaGVjayBmb3IgYWxsIEFQSSBmdW5jdGlvbiBpZiBpbnN0YW5jZSBpcyB2YWxpZAorCUVQTF9NQ09fQ0hFQ0tfSU5TVEFOQ0VfU1RBVEUoKTsKKworCS8vIGdldCBhZGRyZXNzIG9mIHN1YmluZGV4IGVudHJ5CisJUmV0ID0gRXBsT2JkR2V0RW50cnkoRVBMX01DT19JTlNUQU5DRV9QVFJfCisJCQkgICAgIHVpSW5kZXhfcCwgdWlTdWJpbmRleF9wLCBOVUxMLCAmcFN1YmluZGV4RW50cnkpOworCWlmIChSZXQgPT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJLy8gZ2V0IHZhciBlbnRyeQorCQlSZXQgPSBFcGxPYmRHZXRWYXJFbnRyeShwU3ViaW5kZXhFbnRyeSwgcHBWYXJFbnRyeV9wKTsKKwl9CisKKwlyZXR1cm4gUmV0OworCit9CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgUCBSIEkgViBBIFQgRSAgIEQgRSBGIEkgTiBJIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworCitFUExfTUNPX0RFQ0xfSU5TVEFOQ0VfRkNUKCkKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE9iZENhbGxPYmplY3RDYWxsYmFjaygpCisvLworLy8gRGVzY3JpcHRpb246IGNhbGxzIGNhbGxiYWNrIGZ1bmN0aW9uIG9mIGFuIG9iamVjdCBvciBvZiBhIHZhcmlhYmxlCisvLworLy8gUGFyYW1ldGVyczogIGZwQ2FsbGJhY2tfcAorLy8gICAgICAgICAgICAgIHBDYlBhcmFtX3AKKy8vCisvLyBSZXR1cm46ICAgICAgdEVwbEtlcm5lbAorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdGF0aWMgdEVwbEtlcm5lbCBFcGxPYmRDYWxsT2JqZWN0Q2FsbGJhY2soRVBMX01DT19ERUNMX0lOU1RBTkNFX1BUUl8KKwkJCQkJICAgdEVwbE9iZENhbGxiYWNrIGZwQ2FsbGJhY2tfcCwKKwkJCQkJICAgdEVwbE9iZENiUGFyYW0gTUVNICogcENiUGFyYW1fcCkKK3sKKworCXRFcGxLZXJuZWwgUmV0OworCXRFcGxPYmRDYWxsYmFjayBNRU0gZnBDYWxsYmFjazsKKworCS8vIGNoZWNrIGZvciBhbGwgQVBJIGZ1bmN0aW9uIGlmIGluc3RhbmNlIGlzIHZhbGlkCisJRVBMX01DT19DSEVDS19JTlNUQU5DRV9TVEFURSgpOworCisJQVNTRVJUKHBDYlBhcmFtX3AgIT0gTlVMTCk7CisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCS8vIGNoZWNrIGFkZHJlc3Mgb2YgY2FsbGJhY2sgZnVuY3Rpb24gYmVmb3JlIGNhbGxpbmcgaXQKKwlpZiAoZnBDYWxsYmFja19wICE9IE5VTEwpIHsKKwkJLy8gS0VJTCBDNTEgVjYuMDEgaGFzIGEgYnVnLgorCQkvLyBUaGVyZWZvcmUgdGhlIHBhcmFtZXRlciBmcENhbGxiYWNrX3AgaGFzIHRvIGJlIGNvcGllZCBpbiBsb2NhbCB2YXJpYWJsZSBmcENhbGxiYWNrLgorCQlmcENhbGxiYWNrID0gZnBDYWxsYmFja19wOworCisJCS8vIGNhbGwgY2FsbGJhY2sgZnVuY3Rpb24gZm9yIHRoaXMgb2JqZWN0CisJCVJldCA9IGZwQ2FsbGJhY2soRVBMX01DT19JTlNUQU5DRV9QQVJBTV9JRFhfKCkKKwkJCQkgcENiUGFyYW1fcCk7CisJfQorCisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsT2JkR2V0RGF0YVNpemVJbnRlcm4oKQorLy8KKy8vIERlc2NyaXB0aW9uOiBnZXRzIHRoZSBkYXRhIHNpemUgb2YgYW4gb2JqZWN0CisvLyAgICAgICAgICAgICAgZm9yIHN0cmluZyBvYmplY3RzIGl0IHJldHVybmVzIHRoZSBzdHJpbmcgbGVuZ3RoCisvLworLy8gUGFyYW1ldGVyczogIHBTdWJJbmRleEVudHJ5X3AKKy8vCisvLyBSZXR1cm46ICAgICAgdEVwbE9iZFNpemUKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdEVwbE9iZFNpemUgRXBsT2JkR2V0RGF0YVNpemVJbnRlcm4odEVwbE9iZFN1YkVudHJ5UHRyIHBTdWJJbmRleEVudHJ5X3ApCit7CisKKwl0RXBsT2JkU2l6ZSBEYXRhU2l6ZTsKKwl2b2lkIE1FTSAqcERhdGE7CisKKwkvLyBJZiBPRCBlbnRyeSBpcyBkZWZpbmVkIGJ5IG1hY3JvIEVQTF9PQkRfU1VCSU5ERVhfUk9NX1ZTVFJJTkcKKwkvLyB0aGVuIHRoZSBjdXJyZW50IHBvaW50ZXIgaXMgYWx3YXlzIE5VTEwuIFRoZSBmdW5jdGlvbgorCS8vIHJldHVybnMgdGhlIGxlbmd0aCBvZiBkZWZhdWx0IHN0cmluZy4KKwlEYXRhU2l6ZSA9IEVwbE9iZEdldE9iamVjdFNpemUocFN1YkluZGV4RW50cnlfcCk7CisKKwlpZiAocFN1YkluZGV4RW50cnlfcC0+bV9UeXBlID09IGtFcGxPYmRUeXBWU3RyaW5nKSB7CisJCS8vIFRoZSBwb2ludGVyIHRvIGN1cnJlbnQgdmFsdWUgY2FuIGJlIHJlY2VpdmVkIGZyb20gRXBsT2JkR2V0T2JqZWN0Q3VycmVudFB0cigpCisJCXBEYXRhID0KKwkJICAgICgodm9pZCBNRU0gKilFcGxPYmRHZXRPYmplY3RDdXJyZW50UHRyKHBTdWJJbmRleEVudHJ5X3ApKTsKKwkJaWYgKHBEYXRhICE9IE5VTEwpIHsKKwkJCURhdGFTaXplID0KKwkJCSAgICBFcGxPYmRHZXRTdHJMZW4oKHZvaWQgKilwRGF0YSwgRGF0YVNpemUsCisJCQkJCSAgICBwU3ViSW5kZXhFbnRyeV9wLT5tX1R5cGUpOworCQl9CisKKwl9CisKKwlyZXR1cm4gRGF0YVNpemU7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsT2JkR2V0U3RyTGVuKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogVGhlIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIGxlbmd0aCBvZiBzdHJpbmcuIFRoZSAnXDAnCisvLyAgICAgICAgICAgICAgY2hhcmFjdGVyIGlzIGluY2x1ZGVkISEKKy8vCisvLyBQYXJhbWV0ZXJzOiAgcE9iakRhdGFfcCAgICAgICAgICA9IHBvaW50ZXIgdG8gc3RyaW5nCisvLyAgICAgICAgICAgICAgT2JqTGVuX3AgICAgICAgICAgICA9IG1heC4gbGVuZ3RoIG9mIG9iamVjdHIgZW50cnkKKy8vICAgICAgICAgICAgICBiT2JqVHlwZV9wICAgICAgICAgID0gb2JqZWN0IHR5cGUgKFZTVFJJTkcsIC4uLikKKy8vCisvLyBSZXR1cm5zOiAgICAgc3RyaW5nIGxlbmd0aCArIDEKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdEVwbE9iZFNpemUgRXBsT2JkR2V0U3RyTGVuKHZvaWQgKnBPYmpEYXRhX3AsCisJCQkJICAgdEVwbE9iZFNpemUgT2JqTGVuX3AsIHRFcGxPYmRUeXBlIE9ialR5cGVfcCkKK3sKKworCXRFcGxPYmRTaXplIFN0ckxlbiA9IDA7CisJQllURSAqcGJTdHJpbmc7CisKKwlpZiAocE9iakRhdGFfcCA9PSBOVUxMKSB7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJLy8gVmlzaWJsZSBTdHJpbmc6IGRhdGEgZm9ybWF0IGJ5dGUKKwlpZiAoT2JqVHlwZV9wID09IGtFcGxPYmRUeXBWU3RyaW5nKSB7CisJCXBiU3RyaW5nID0gcE9iakRhdGFfcDsKKworCQlmb3IgKFN0ckxlbiA9IDA7IFN0ckxlbiA8IE9iakxlbl9wOyBTdHJMZW4rKykgeworCQkJaWYgKCpwYlN0cmluZyA9PSAnXDAnKSB7CisJCQkJU3RyTGVuKys7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCXBiU3RyaW5nKys7CisJCX0KKwl9CisJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJLy8gb3RoZXIgc3RyaW5nIHR5cGVzIC4uLgorCisgICAgICBFeGl0OgorCXJldHVybiAoU3RyTGVuKTsKKworfQorCisjaWYgKEVQTF9PQkRfQ0hFQ0tfT0JKRUNUX1JBTkdFICE9IEZBTFNFKQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxPYmRDaGVja09iamVjdFJhbmdlKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogZnVuY3Rpb24gdG8gY2hlY2sgdmFsdWUgcmFuZ2Ugb2Ygb2JqZWN0IGRhdGEKKy8vCisvLyBOT1RJQ0U6IFRoZSBwb2ludGVyIG9mIGRhdGEgKHBEYXRhX3ApIG11c3QgcG9pbnQgb3V0IHRvIGFuIGV2ZW4gYWRkcmVzcywKKy8vICAgICAgICAgaWYgT2JqVHlwZSBpcyB1bmVxdWFsIHRvIGtFcGxPYmRUeXBJbnQ4IG9yIGtFcGxPYmRUeXBVSW50OCEgQnV0IGl0IGlzCisvLyAgICAgICAgIGFsd2F5cyByZWFsaWNlZCBiZWNhdXNlIHBvaW50ZXIgbV9wRGVmYXVsdCBwb2ludHMgYWx3YXlzIHRvIGFuCisvLyAgICAgICAgIGFycmF5IG9mIHRoZSBTUEVDSUZJRUQgdHlwZS4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgcFN1YmluZGV4RW50cnlfcAorLy8gICAgICAgICAgICAgIHBEYXRhX3AKKy8vCisvLyBSZXR1cm46ICAgICAgdEVwbEtlcm5lbAorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB0RXBsS2VybmVsIEVwbE9iZENoZWNrT2JqZWN0UmFuZ2UodEVwbE9iZFN1YkVudHJ5UHRyIHBTdWJpbmRleEVudHJ5X3AsCisJCQkJCSB2b2lkICpwRGF0YV9wKQoreworCisJdEVwbEtlcm5lbCBSZXQ7CisJdm9pZCAqcFJhbmdlRGF0YTsKKworCUFTU0VSVE1TRyhwU3ViaW5kZXhFbnRyeV9wICE9IE5VTEwsCisJCSAgIkVwbE9iZENoZWNrT2JqZWN0UmFuZ2UoKTogbm8gYWRkcmVzcyB0byBzdWJpbmRleCBzdHJ1Y3QhXG4iKTsKKworCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJLy8gY2hlY2sgaWYgZGF0YSByYW5nZSBoYXMgdG8gYmUgY2hlY2tlZAorCWlmICgocFN1YmluZGV4RW50cnlfcC0+bV9BY2Nlc3MgJiBrRXBsT2JkQWNjUmFuZ2UpID09IDApIHsKKwkJZ290byBFeGl0OworCX0KKwkvLyBnZXQgYWRkcmVzcyBvZiBkZWZhdWx0IGRhdGEKKwlwUmFuZ2VEYXRhID0gcFN1YmluZGV4RW50cnlfcC0+bV9wRGVmYXVsdDsKKworCS8vIGp1bXAgdG8gY2FsbGVkIG9iamVjdCB0eXBlCisJc3dpdGNoICgodEVwbE9iZFR5cGUpIHBTdWJpbmRleEVudHJ5X3AtPm1fVHlwZSkgeworCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkvLyBPYmRUeXBlIGtFcGxPYmRUeXBCb29sIHdpbGwgbm90IGJlIGNoZWNrZWQgYmVjYXVzZSB0aGVyZSBhcmUgb25seQorCQkvLyB0d28gcG9zc2libGUgdmFsdWVzIDAgb3IgMS4KKworCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkvLyBPYmRUeXBlcyB3aGljaCBoYXMgdG8gYmUgY2hlY2sgdXAgYmVjYXVzZSBudW1lcmljYWwgdmFsdWVzCisJY2FzZSBrRXBsT2JkVHlwSW50ODoKKworCQkvLyBzd2l0Y2ggdG8gbG93ZXIgbGltaXQKKwkJcFJhbmdlRGF0YSA9ICgodEVwbE9iZEludGVnZXI4ICopIHBSYW5nZURhdGEpICsgMTsKKworCQkvLyBjaGVjayBpZiB2YWx1ZSBpcyB0byBsb3cKKwkJaWYgKCooKHRFcGxPYmRJbnRlZ2VyOCAqKSBwRGF0YV9wKSA8CisJCSAgICAqKCh0RXBsT2JkSW50ZWdlcjggKikgcFJhbmdlRGF0YSkpIHsKKwkJCVJldCA9IGtFcGxPYmRWYWx1ZVRvb0xvdzsKKwkJCWJyZWFrOworCQl9CisJCS8vIHN3aXRjaCB0byBoaWdoZXIgbGltaXQKKwkJcFJhbmdlRGF0YSA9ICgodEVwbE9iZEludGVnZXI4ICopIHBSYW5nZURhdGEpICsgMTsKKworCQkvLyBjaGVjayBpZiB2YWx1ZSBpcyB0byBoaWdoCisJCWlmICgqKCh0RXBsT2JkSW50ZWdlcjggKikgcERhdGFfcCkgPgorCQkgICAgKigodEVwbE9iZEludGVnZXI4ICopIHBSYW5nZURhdGEpKSB7CisJCQlSZXQgPSBrRXBsT2JkVmFsdWVUb29IaWdoOworCQl9CisKKwkJYnJlYWs7CisKKwljYXNlIGtFcGxPYmRUeXBVSW50ODoKKworCQkvLyBzd2l0Y2ggdG8gbG93ZXIgbGltaXQKKwkJcFJhbmdlRGF0YSA9ICgodEVwbE9iZFVuc2lnbmVkOCAqKSBwUmFuZ2VEYXRhKSArIDE7CisKKwkJLy8gY2hlY2sgaWYgdmFsdWUgaXMgdG8gbG93CisJCWlmICgqKCh0RXBsT2JkVW5zaWduZWQ4ICopIHBEYXRhX3ApIDwKKwkJICAgICooKHRFcGxPYmRVbnNpZ25lZDggKikgcFJhbmdlRGF0YSkpIHsKKwkJCVJldCA9IGtFcGxPYmRWYWx1ZVRvb0xvdzsKKwkJCWJyZWFrOworCQl9CisJCS8vIHN3aXRjaCB0byBoaWdoZXIgbGltaXQKKwkJcFJhbmdlRGF0YSA9ICgodEVwbE9iZFVuc2lnbmVkOCAqKSBwUmFuZ2VEYXRhKSArIDE7CisKKwkJLy8gY2hlY2sgaWYgdmFsdWUgaXMgdG8gaGlnaAorCQlpZiAoKigodEVwbE9iZFVuc2lnbmVkOCAqKSBwRGF0YV9wKSA+CisJCSAgICAqKCh0RXBsT2JkVW5zaWduZWQ4ICopIHBSYW5nZURhdGEpKSB7CisJCQlSZXQgPSBrRXBsT2JkVmFsdWVUb29IaWdoOworCQl9CisKKwkJYnJlYWs7CisKKwljYXNlIGtFcGxPYmRUeXBJbnQxNjoKKworCQkvLyBzd2l0Y2ggdG8gbG93ZXIgbGltaXQKKwkJcFJhbmdlRGF0YSA9ICgodEVwbE9iZEludGVnZXIxNiAqKSBwUmFuZ2VEYXRhKSArIDE7CisKKwkJLy8gY2hlY2sgaWYgdmFsdWUgaXMgdG8gbG93CisJCWlmICgqKCh0RXBsT2JkSW50ZWdlcjE2ICopIHBEYXRhX3ApIDwKKwkJICAgICooKHRFcGxPYmRJbnRlZ2VyMTYgKikgcFJhbmdlRGF0YSkpIHsKKwkJCVJldCA9IGtFcGxPYmRWYWx1ZVRvb0xvdzsKKwkJCWJyZWFrOworCQl9CisJCS8vIHN3aXRjaCB0byBoaWdoZXIgbGltaXQKKwkJcFJhbmdlRGF0YSA9ICgodEVwbE9iZEludGVnZXIxNiAqKSBwUmFuZ2VEYXRhKSArIDE7CisKKwkJLy8gY2hlY2sgaWYgdmFsdWUgaXMgdG8gaGlnaAorCQlpZiAoKigodEVwbE9iZEludGVnZXIxNiAqKSBwRGF0YV9wKSA+CisJCSAgICAqKCh0RXBsT2JkSW50ZWdlcjE2ICopIHBSYW5nZURhdGEpKSB7CisJCQlSZXQgPSBrRXBsT2JkVmFsdWVUb29IaWdoOworCQl9CisKKwkJYnJlYWs7CisKKwljYXNlIGtFcGxPYmRUeXBVSW50MTY6CisKKwkJLy8gc3dpdGNoIHRvIGxvd2VyIGxpbWl0CisJCXBSYW5nZURhdGEgPSAoKHRFcGxPYmRVbnNpZ25lZDE2ICopIHBSYW5nZURhdGEpICsgMTsKKworCQkvLyBjaGVjayBpZiB2YWx1ZSBpcyB0byBsb3cKKwkJaWYgKCooKHRFcGxPYmRVbnNpZ25lZDE2ICopIHBEYXRhX3ApIDwKKwkJICAgICooKHRFcGxPYmRVbnNpZ25lZDE2ICopIHBSYW5nZURhdGEpKSB7CisJCQlSZXQgPSBrRXBsT2JkVmFsdWVUb29Mb3c7CisJCQlicmVhazsKKwkJfQorCQkvLyBzd2l0Y2ggdG8gaGlnaGVyIGxpbWl0CisJCXBSYW5nZURhdGEgPSAoKHRFcGxPYmRVbnNpZ25lZDE2ICopIHBSYW5nZURhdGEpICsgMTsKKworCQkvLyBjaGVjayBpZiB2YWx1ZSBpcyB0byBoaWdoCisJCWlmICgqKCh0RXBsT2JkVW5zaWduZWQxNiAqKSBwRGF0YV9wKSA+CisJCSAgICAqKCh0RXBsT2JkVW5zaWduZWQxNiAqKSBwUmFuZ2VEYXRhKSkgeworCQkJUmV0ID0ga0VwbE9iZFZhbHVlVG9vSGlnaDsKKwkJfQorCisJCWJyZWFrOworCisJY2FzZSBrRXBsT2JkVHlwSW50MzI6CisKKwkJLy8gc3dpdGNoIHRvIGxvd2VyIGxpbWl0CisJCXBSYW5nZURhdGEgPSAoKHRFcGxPYmRJbnRlZ2VyMzIgKikgcFJhbmdlRGF0YSkgKyAxOworCisJCS8vIGNoZWNrIGlmIHZhbHVlIGlzIHRvIGxvdworCQlpZiAoKigodEVwbE9iZEludGVnZXIzMiAqKSBwRGF0YV9wKSA8CisJCSAgICAqKCh0RXBsT2JkSW50ZWdlcjMyICopIHBSYW5nZURhdGEpKSB7CisJCQlSZXQgPSBrRXBsT2JkVmFsdWVUb29Mb3c7CisJCQlicmVhazsKKwkJfQorCQkvLyBzd2l0Y2ggdG8gaGlnaGVyIGxpbWl0CisJCXBSYW5nZURhdGEgPSAoKHRFcGxPYmRJbnRlZ2VyMzIgKikgcFJhbmdlRGF0YSkgKyAxOworCisJCS8vIGNoZWNrIGlmIHZhbHVlIGlzIHRvIGhpZ2gKKwkJaWYgKCooKHRFcGxPYmRJbnRlZ2VyMzIgKikgcERhdGFfcCkgPgorCQkgICAgKigodEVwbE9iZEludGVnZXIzMiAqKSBwUmFuZ2VEYXRhKSkgeworCQkJUmV0ID0ga0VwbE9iZFZhbHVlVG9vSGlnaDsKKwkJfQorCisJCWJyZWFrOworCisJY2FzZSBrRXBsT2JkVHlwVUludDMyOgorCisJCS8vIHN3aXRjaCB0byBsb3dlciBsaW1pdAorCQlwUmFuZ2VEYXRhID0gKCh0RXBsT2JkVW5zaWduZWQzMiAqKSBwUmFuZ2VEYXRhKSArIDE7CisKKwkJLy8gY2hlY2sgaWYgdmFsdWUgaXMgdG8gbG93CisJCWlmICgqKCh0RXBsT2JkVW5zaWduZWQzMiAqKSBwRGF0YV9wKSA8CisJCSAgICAqKCh0RXBsT2JkVW5zaWduZWQzMiAqKSBwUmFuZ2VEYXRhKSkgeworCQkJUmV0ID0ga0VwbE9iZFZhbHVlVG9vTG93OworCQkJYnJlYWs7CisJCX0KKwkJLy8gc3dpdGNoIHRvIGhpZ2hlciBsaW1pdAorCQlwUmFuZ2VEYXRhID0gKCh0RXBsT2JkVW5zaWduZWQzMiAqKSBwUmFuZ2VEYXRhKSArIDE7CisKKwkJLy8gY2hlY2sgaWYgdmFsdWUgaXMgdG8gaGlnaAorCQlpZiAoKigodEVwbE9iZFVuc2lnbmVkMzIgKikgcERhdGFfcCkgPgorCQkgICAgKigodEVwbE9iZFVuc2lnbmVkMzIgKikgcFJhbmdlRGF0YSkpIHsKKwkJCVJldCA9IGtFcGxPYmRWYWx1ZVRvb0hpZ2g7CisJCX0KKworCQlicmVhazsKKworCWNhc2Uga0VwbE9iZFR5cFJlYWwzMjoKKworCQkvLyBzd2l0Y2ggdG8gbG93ZXIgbGltaXQKKwkJcFJhbmdlRGF0YSA9ICgodEVwbE9iZFJlYWwzMiAqKSBwUmFuZ2VEYXRhKSArIDE7CisKKwkJLy8gY2hlY2sgaWYgdmFsdWUgaXMgdG8gbG93CisJCWlmICgqKCh0RXBsT2JkUmVhbDMyICopIHBEYXRhX3ApIDwKKwkJICAgICooKHRFcGxPYmRSZWFsMzIgKikgcFJhbmdlRGF0YSkpIHsKKwkJCVJldCA9IGtFcGxPYmRWYWx1ZVRvb0xvdzsKKwkJCWJyZWFrOworCQl9CisJCS8vIHN3aXRjaCB0byBoaWdoZXIgbGltaXQKKwkJcFJhbmdlRGF0YSA9ICgodEVwbE9iZFJlYWwzMiAqKSBwUmFuZ2VEYXRhKSArIDE7CisKKwkJLy8gY2hlY2sgaWYgdmFsdWUgaXMgdG8gaGlnaAorCQlpZiAoKigodEVwbE9iZFJlYWwzMiAqKSBwRGF0YV9wKSA+CisJCSAgICAqKCh0RXBsT2JkUmVhbDMyICopIHBSYW5nZURhdGEpKSB7CisJCQlSZXQgPSBrRXBsT2JkVmFsdWVUb29IaWdoOworCQl9CisKKwkJYnJlYWs7CisKKwkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwljYXNlIGtFcGxPYmRUeXBJbnQ0MDoKKwljYXNlIGtFcGxPYmRUeXBJbnQ0ODoKKwljYXNlIGtFcGxPYmRUeXBJbnQ1NjoKKwljYXNlIGtFcGxPYmRUeXBJbnQ2NDoKKworCQkvLyBzd2l0Y2ggdG8gbG93ZXIgbGltaXQKKwkJcFJhbmdlRGF0YSA9ICgoc2lnbmVkIFFXT1JEICopcFJhbmdlRGF0YSkgKyAxOworCisJCS8vIGNoZWNrIGlmIHZhbHVlIGlzIHRvIGxvdworCQlpZiAoKigoc2lnbmVkIFFXT1JEICopcERhdGFfcCkgPCAqKChzaWduZWQgUVdPUkQgKilwUmFuZ2VEYXRhKSkgeworCQkJUmV0ID0ga0VwbE9iZFZhbHVlVG9vTG93OworCQkJYnJlYWs7CisJCX0KKwkJLy8gc3dpdGNoIHRvIGhpZ2hlciBsaW1pdAorCQlwUmFuZ2VEYXRhID0gKChzaWduZWQgUVdPUkQgKilwUmFuZ2VEYXRhKSArIDE7CisKKwkJLy8gY2hlY2sgaWYgdmFsdWUgaXMgdG8gaGlnaAorCQlpZiAoKigoc2lnbmVkIFFXT1JEICopcERhdGFfcCkgPiAqKChzaWduZWQgUVdPUkQgKilwUmFuZ2VEYXRhKSkgeworCQkJUmV0ID0ga0VwbE9iZFZhbHVlVG9vSGlnaDsKKwkJfQorCisJCWJyZWFrOworCisJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJY2FzZSBrRXBsT2JkVHlwVUludDQwOgorCWNhc2Uga0VwbE9iZFR5cFVJbnQ0ODoKKwljYXNlIGtFcGxPYmRUeXBVSW50NTY6CisJY2FzZSBrRXBsT2JkVHlwVUludDY0OgorCisJCS8vIHN3aXRjaCB0byBsb3dlciBsaW1pdAorCQlwUmFuZ2VEYXRhID0gKCh1bnNpZ25lZCBRV09SRCAqKXBSYW5nZURhdGEpICsgMTsKKworCQkvLyBjaGVjayBpZiB2YWx1ZSBpcyB0byBsb3cKKwkJaWYgKCooKHVuc2lnbmVkIFFXT1JEICopcERhdGFfcCkgPAorCQkgICAgKigodW5zaWduZWQgUVdPUkQgKilwUmFuZ2VEYXRhKSkgeworCQkJUmV0ID0ga0VwbE9iZFZhbHVlVG9vTG93OworCQkJYnJlYWs7CisJCX0KKwkJLy8gc3dpdGNoIHRvIGhpZ2hlciBsaW1pdAorCQlwUmFuZ2VEYXRhID0gKCh1bnNpZ25lZCBRV09SRCAqKXBSYW5nZURhdGEpICsgMTsKKworCQkvLyBjaGVjayBpZiB2YWx1ZSBpcyB0byBoaWdoCisJCWlmICgqKCh1bnNpZ25lZCBRV09SRCAqKXBEYXRhX3ApID4KKwkJICAgICooKHVuc2lnbmVkIFFXT1JEICopcFJhbmdlRGF0YSkpIHsKKwkJCVJldCA9IGtFcGxPYmRWYWx1ZVRvb0hpZ2g7CisJCX0KKworCQlicmVhazsKKworCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCWNhc2Uga0VwbE9iZFR5cFJlYWw2NDoKKworCQkvLyBzd2l0Y2ggdG8gbG93ZXIgbGltaXQKKwkJcFJhbmdlRGF0YSA9ICgodEVwbE9iZFJlYWw2NCAqKSBwUmFuZ2VEYXRhKSArIDE7CisKKwkJLy8gY2hlY2sgaWYgdmFsdWUgaXMgdG8gbG93CisJCWlmICgqKCh0RXBsT2JkUmVhbDY0ICopIHBEYXRhX3ApIDwKKwkJICAgICooKHRFcGxPYmRSZWFsNjQgKikgcFJhbmdlRGF0YSkpIHsKKwkJCVJldCA9IGtFcGxPYmRWYWx1ZVRvb0xvdzsKKwkJCWJyZWFrOworCQl9CisJCS8vIHN3aXRjaCB0byBoaWdoZXIgbGltaXQKKwkJcFJhbmdlRGF0YSA9ICgodEVwbE9iZFJlYWw2NCAqKSBwUmFuZ2VEYXRhKSArIDE7CisKKwkJLy8gY2hlY2sgaWYgdmFsdWUgaXMgdG8gaGlnaAorCQlpZiAoKigodEVwbE9iZFJlYWw2NCAqKSBwRGF0YV9wKSA+CisJCSAgICAqKCh0RXBsT2JkUmVhbDY0ICopIHBSYW5nZURhdGEpKSB7CisJCQlSZXQgPSBrRXBsT2JkVmFsdWVUb29IaWdoOworCQl9CisKKwkJYnJlYWs7CisKKwkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwljYXNlIGtFcGxPYmRUeXBUaW1lT2ZEYXk6CisJY2FzZSBrRXBsT2JkVHlwVGltZURpZmY6CisJCWJyZWFrOworCisJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCS8vIE9iZFR5cGVzIGtFcGxPYmRUeXBYU3RyaW5nIGFuZCBrRXBsT2JkVHlwRG9tYWluIGNhbiBub3QgYmUgY2hlY2t0IGJlY2F1c2UKKwkJLy8gdGhleSBoYXZlIG5vIG51bWVyaWNhbCB2YWx1ZS4KKwlkZWZhdWx0OgorCisJCVJldCA9IGtFcGxPYmRVbmtub3duT2JqZWN0VHlwZTsKKwkJYnJlYWs7CisJfQorCisgICAgICBFeGl0OgorCisJcmV0dXJuIFJldDsKKworfQorI2VuZGlmIC8vIChFUExfT0JEX0NIRUNLX09CSkVDVF9SQU5HRSAhPSBGQUxTRSkKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsT2JkV3JpdGVFbnRyeVByZSgpCisvLworLy8gRGVzY3JpcHRpb246IEZ1bmN0aW9uIHByZXBhcmVzIHdyaXRlIG9mIGRhdGEgdG8gYW4gT0JEIGVudHJ5LiBTdHJpbmdzCisvLyAgICAgICAgICAgICAgYXJlIHN0b3JlZCB3aXRoIGFkZGVkICdcMCcgY2hhcmFjdGVyLgorLy8KKy8vIFBhcmFtZXRlcnM6ICBFUExfTUNPX0RFQ0xfSU5TVEFOQ0VfUFRSXworLy8gICAgICAgICAgICAgIHVpSW5kZXhfcCAgICAgICA9ICAgSW5kZXggb2YgdGhlIE9EIGVudHJ5CisvLyAgICAgICAgICAgICAgdWlTdWJJbmRleF9wICAgID0gICBTdWJpbmRleCBvZiB0aGUgT0QgRW50cnkKKy8vICAgICAgICAgICAgICBwU3JjRGF0YV9wICAgICAgPSAgIFBvaW50ZXIgdG8gdGhlIGRhdGEgdG8gd3JpdGUKKy8vICAgICAgICAgICAgICBTaXplX3AgICAgICAgICAgPSAgIFNpemUgb2YgdGhlIGRhdGEgaW4gQnl0ZQorLy8KKy8vIFJldHVybjogICAgICB0RXBsS2VybmVsICAgICAgPSAgIEVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdEVwbEtlcm5lbCBQVUJMSUMgRXBsT2JkV3JpdGVFbnRyeVByZShFUExfTUNPX0RFQ0xfSU5TVEFOQ0VfUFRSXworCQkJCQkgICAgIHVuc2lnbmVkIGludCB1aUluZGV4X3AsCisJCQkJCSAgICAgdW5zaWduZWQgaW50IHVpU3ViSW5kZXhfcCwKKwkJCQkJICAgICB2b2lkICpwU3JjRGF0YV9wLAorCQkJCQkgICAgIHZvaWQgKipwcERzdERhdGFfcCwKKwkJCQkJICAgICB0RXBsT2JkU2l6ZSBTaXplX3AsCisJCQkJCSAgICAgdEVwbE9iZEVudHJ5UHRyICogcHBPYmRFbnRyeV9wLAorCQkJCQkgICAgIHRFcGxPYmRTdWJFbnRyeVB0ciAqIHBwU3ViRW50cnlfcCwKKwkJCQkJICAgICB0RXBsT2JkQ2JQYXJhbSBNRU0gKiBwQ2JQYXJhbV9wLAorCQkJCQkgICAgIHRFcGxPYmRTaXplICogcE9iZFNpemVfcCkKK3sKKworCXRFcGxLZXJuZWwgUmV0OworCXRFcGxPYmRFbnRyeVB0ciBwT2JkRW50cnk7CisJdEVwbE9iZFN1YkVudHJ5UHRyIHBTdWJFbnRyeTsKKwl0RXBsT2JkQWNjZXNzIEFjY2VzczsKKwl2b2lkIE1FTSAqcERzdERhdGE7CisJdEVwbE9iZFNpemUgT2JkU2l6ZTsKKwlCT09MIGZFbnRyeU51bWVyaWNhbDsKKworI2lmIChFUExfT0JEX1VTRV9TVFJJTkdfRE9NQUlOX0lOX1JBTSAhPSBGQUxTRSkKKwl0RXBsT2JkVlN0cmluZ0RvbWFpbiBNRU0gTWVtVlN0cmluZ0RvbWFpbjsKKwl2b2lkIE1FTSAqcEN1cnJEYXRhOworI2VuZGlmCisKKwkvLyBjaGVjayBmb3IgYWxsIEFQSSBmdW5jdGlvbiBpZiBpbnN0YW5jZSBpcyB2YWxpZAorCUVQTF9NQ09fQ0hFQ0tfSU5TVEFOQ0VfU1RBVEUoKTsKKworCUFTU0VSVChwU3JjRGF0YV9wICE9IE5VTEwpOwkvLyBzaG91bGQgbmV2ZXIgYmUgTlVMTAorCisJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkvLyBnZXQgYWRkcmVzcyBvZiBpbmRleCBhbmQgc3ViaW5kZXggZW50cnkKKwlSZXQgPSBFcGxPYmRHZXRFbnRyeShFUExfTUNPX0lOU1RBTkNFX1BUUl8KKwkJCSAgICAgdWlJbmRleF9wLCB1aVN1YkluZGV4X3AsICZwT2JkRW50cnksICZwU3ViRW50cnkpOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKwkvLyBnZXQgcG9pbnRlciB0byBvYmplY3QgZGF0YQorCXBEc3REYXRhID0gKHZvaWQgTUVNICopRXBsT2JkR2V0T2JqZWN0RGF0YVB0ckludGVybihwU3ViRW50cnkpOworCisJQWNjZXNzID0gKHRFcGxPYmRBY2Nlc3MpIHBTdWJFbnRyeS0+bV9BY2Nlc3M7CisKKwkvLyBjaGVjayBhY2Nlc3MgZm9yIHdyaXRlCisJLy8gYWNjZXNzIHZpb2xhdGlvbiBpZiBhZHJlc3MgdG8gY3VycmVudCB2YWx1ZSBpcyBOVUxMCisJaWYgKCgoQWNjZXNzICYga0VwbE9iZEFjY0NvbnN0KSAhPSAwKSB8fCAocERzdERhdGEgPT0gTlVMTCkpIHsKKwkJUmV0ID0ga0VwbE9iZEFjY2Vzc1Zpb2xhdGlvbjsKKwkJZ290byBFeGl0OworCX0KKwkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCS8vIGdldCBzaXplIG9mIG9iamVjdAorCS8vIC1hcyBPYmRTaXplID0gT2JkR2V0T2JqZWN0U2l6ZSAocFN1YkVudHJ5KTsKKworCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJLy8gVG8gdXNlIHRoZSBzYW1lIGNhbGxiYWNrIGZ1bmN0aW9uIGZvciBPYmRXcml0ZUVudHJ5IGFzIHdlbGwgYXMgZm9yCisJLy8gYW4gU0RPIGRvd25sb2FkIGNhbGwgYXQgZmlyc3QgKGtFcGxPYmRFdlByZS4uLikgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uCisJLy8gd2l0aCB0aGUgYXJndW1lbnQgcG9pbnRlciB0byBvYmplY3Qgc2l6ZS4KKwlwQ2JQYXJhbV9wLT5tX3VpSW5kZXggPSB1aUluZGV4X3A7CisJcENiUGFyYW1fcC0+bV91aVN1YkluZGV4ID0gdWlTdWJJbmRleF9wOworCisJLy8gQmVjYXVzZSBvYmplY3Qgc2l6ZSBhbmQgb2JqZWN0IHBvaW50ZXIgYXJlCisJLy8gYWRhcHRlZCBieSB1c2VyIGNhbGxiYWNrIGZ1bmN0aW9uLCByZS1yZWFkCisJLy8gdGhpcyB2YWx1ZXMuCisJT2JkU2l6ZSA9IEVwbE9iZEdldE9iamVjdFNpemUocFN1YkVudHJ5KTsKKwlwRHN0RGF0YSA9ICh2b2lkIE1FTSAqKUVwbE9iZEdldE9iamVjdERhdGFQdHJJbnRlcm4ocFN1YkVudHJ5KTsKKworCS8vIDA5LWRlYy0yMDA0IHIuZC46CisJLy8gICAgICBGdW5jdGlvbiBFcGxPYmRXcml0ZUVudHJ5KCkgY2FsbHMgbmV3IGV2ZW50IGtFcGxPYmRFdldyU3RyaW5nRG9tYWluCisJLy8gICAgICBmb3IgU3RyaW5nIG9yIERvbWFpbiB3aGljaCBsZXRzIGNhbGxlZCBtb2R1bGUgZGlyZWN0bHkgY2hhbmdlCisJLy8gICAgICB0aGUgZGF0YSBwb2ludGVyIG9yIHNpemUuIFRoaXMgcHJldmVudHMgYSByZWN1cnNpdmUgY2FsbCB0bworCS8vICAgICAgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIGlmIGl0IGNhbGxzIEVwbE9iZEdldEVudHJ5KCkuCisjaWYgKEVQTF9PQkRfVVNFX1NUUklOR19ET01BSU5fSU5fUkFNICE9IEZBTFNFKQorCWlmICgocFN1YkVudHJ5LT5tX1R5cGUgPT0ga0VwbE9iZFR5cFZTdHJpbmcpIHx8CisJICAgIChwU3ViRW50cnktPm1fVHlwZSA9PSBrRXBsT2JkVHlwRG9tYWluKSB8fAorCSAgICAocFN1YkVudHJ5LT5tX1R5cGUgPT0ga0VwbE9iZFR5cE9TdHJpbmcpKSB7CisJCWlmIChwU3ViRW50cnktPm1fVHlwZSA9PSBrRXBsT2JkVHlwVlN0cmluZykgeworCQkJLy8gcmVzZXJ2ZSBvbmUgYnl0ZSBmb3IgMC10ZXJtaW5hdGlvbgorCQkJLy8gLWFzIE9iZFNpemUgLT0gMTsKKwkJCVNpemVfcCArPSAxOworCQl9CisJCS8vIGZpbGwgb3V0IG5ldyBhcmctc3RydWN0CisJCU1lbVZTdHJpbmdEb21haW4ubV9Eb3dubG9hZFNpemUgPSBTaXplX3A7CisJCU1lbVZTdHJpbmdEb21haW4ubV9PYmpTaXplID0gT2JkU2l6ZTsKKwkJTWVtVlN0cmluZ0RvbWFpbi5tX3BEYXRhID0gcERzdERhdGE7CisKKwkJcENiUGFyYW1fcC0+bV9PYmRFdmVudCA9IGtFcGxPYmRFdldyU3RyaW5nRG9tYWluOworCQlwQ2JQYXJhbV9wLT5tX3BBcmcgPSAmTWVtVlN0cmluZ0RvbWFpbjsKKwkJLy8gIGNhbGwgdXNlciBjYWxsYmFjaworCQlSZXQgPSBFcGxPYmRDYWxsT2JqZWN0Q2FsbGJhY2soRVBMX01DT19JTlNUQU5DRV9QVFJfCisJCQkJCSAgICAgICBwT2JkRW50cnktPm1fZnBDYWxsYmFjaywKKwkJCQkJICAgICAgIHBDYlBhcmFtX3ApOworCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQlnb3RvIEV4aXQ7CisJCX0KKwkJLy8gd3JpdGUgYmFjayBuZXcgc2V0dGluZ3MKKwkJcEN1cnJEYXRhID0gcFN1YkVudHJ5LT5tX3BDdXJyZW50OworCQlpZiAoKHBTdWJFbnRyeS0+bV9UeXBlID09IGtFcGxPYmRUeXBWU3RyaW5nKQorCQkgICAgfHwgKHBTdWJFbnRyeS0+bV9UeXBlID09IGtFcGxPYmRUeXBPU3RyaW5nKSkgeworCQkJKCh0RXBsT2JkVlN0cmluZyBNRU0gKikgcEN1cnJEYXRhKS0+bV9TaXplID0KKwkJCSAgICBNZW1WU3RyaW5nRG9tYWluLm1fT2JqU2l6ZTsKKwkJCSgodEVwbE9iZFZTdHJpbmcgTUVNICopIHBDdXJyRGF0YSktPm1fcFN0cmluZyA9CisJCQkgICAgTWVtVlN0cmluZ0RvbWFpbi5tX3BEYXRhOworCQl9IGVsc2UJCS8vIGlmIChwU2Rvc1RhYmxlRW50cnlfcC0+bV9iT2JqVHlwZSA9PSBrRXBsT2JkVHlwRG9tYWluKQorCQl7CisJCQkoKHRFcGxPYmRWYXJFbnRyeSBNRU0gKikgcEN1cnJEYXRhKS0+bV9TaXplID0KKwkJCSAgICBNZW1WU3RyaW5nRG9tYWluLm1fT2JqU2l6ZTsKKwkJCSgodEVwbE9iZFZhckVudHJ5IE1FTSAqKSBwQ3VyckRhdGEpLT5tX3BEYXRhID0KKwkJCSAgICAodm9pZCBNRU0gKilNZW1WU3RyaW5nRG9tYWluLm1fcERhdGE7CisJCX0KKworCQkvLyBCZWNhdXNlIG9iamVjdCBzaXplIGFuZCBvYmplY3QgcG9pbnRlciBhcmUKKwkJLy8gYWRhcHRlZCBieSB1c2VyIGNhbGxiYWNrIGZ1bmN0aW9uLCByZS1yZWFkCisJCS8vIHRoaXMgdmFsdWVzLgorCQlPYmRTaXplID0gTWVtVlN0cmluZ0RvbWFpbi5tX09ialNpemU7CisJCXBEc3REYXRhID0gKHZvaWQgTUVNICopTWVtVlN0cmluZ0RvbWFpbi5tX3BEYXRhOworCX0KKyNlbmRpZiAvLyNpZiAoT0JEX1VTRV9TVFJJTkdfRE9NQUlOX0lOX1JBTSAhPSBGQUxTRSkKKworCS8vIDA3LWRlYy0yMDA0IHIuZC46IHNpemUgZnJvbSBhcHBsaWNhdGlvbiBpcyBuZWVkZWQgYmVjYXVzZSBjYWxsYmFjayBmdW5jdGlvbiBjYW4gY2hhbmdlIHRoZSBvYmplY3Qgc2l6ZQorCS8vIC1hcyAxNi4xMS4wNCBDYlBhcmFtLm1fcEFyZyAgICAgPSAmT2JkU2l6ZTsKKwkvLyAwOS1kZWMtMjAwNCByLmQuOiBDYlBhcmFtLm1fcEFyZyAgICAgPSAmU2l6ZV9wOworCXBDYlBhcmFtX3AtPm1fcEFyZyA9ICZPYmRTaXplOworCXBDYlBhcmFtX3AtPm1fT2JkRXZlbnQgPSBrRXBsT2JkRXZJbml0V3JpdGU7CisJUmV0ID0gRXBsT2JkQ2FsbE9iamVjdENhbGxiYWNrKEVQTF9NQ09fSU5TVEFOQ0VfUFRSXworCQkJCSAgICAgICBwT2JkRW50cnktPm1fZnBDYWxsYmFjaywgcENiUGFyYW1fcCk7CisJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQlnb3RvIEV4aXQ7CisJfQorCisJaWYgKFNpemVfcCA+IE9iZFNpemUpIHsKKwkJUmV0ID0ga0VwbE9iZFZhbHVlTGVuZ3RoRXJyb3I7CisJCWdvdG8gRXhpdDsKKwl9CisKKwlpZiAocFN1YkVudHJ5LT5tX1R5cGUgPT0ga0VwbE9iZFR5cFZTdHJpbmcpIHsKKwkJaWYgKCgoY2hhciBNRU0gKilwU3JjRGF0YV9wKVtTaXplX3AgLSAxXSA9PSAnXDAnKSB7CS8vIGxhc3QgYnl0ZSBvZiBzb3VyY2Ugc3RyaW5nIGNvbnRhaW5zIG51bGwgY2hhcmFjdGVyCisKKwkJCS8vIHJlc2VydmUgb25lIGJ5dGUgaW4gZGVzdGluYXRpb24gZm9yIDAtdGVybWluYXRpb24KKwkJCVNpemVfcCAtPSAxOworCQl9IGVsc2UgaWYgKFNpemVfcCA+PSBPYmRTaXplKSB7CS8vIHNvdXJjZSBzdHJpbmcgaXMgbm90IDAtdGVybWluYXRlZAorCQkJLy8gYW5kIGRlc3RpbmF0aW9uIGJ1ZmZlciBpcyB0b28gc2hvcnQKKwkJCVJldCA9IGtFcGxPYmRWYWx1ZUxlbmd0aEVycm9yOworCQkJZ290byBFeGl0OworCQl9CisJfQorCisJUmV0ID0gRXBsT2JkSXNOdW1lcmljYWxJbnRlcm4ocFN1YkVudHJ5LCAmZkVudHJ5TnVtZXJpY2FsKTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCWdvdG8gRXhpdDsKKwl9CisKKwlpZiAoKGZFbnRyeU51bWVyaWNhbCAhPSBGQUxTRSkKKwkgICAgJiYgKFNpemVfcCAhPSBPYmRTaXplKSkgeworCQkvLyB0eXBlIGlzIG51bWVyaWNhbCwgdGhlcmVmb3Igc2l6ZSBoYXMgdG8gZml0LCBidXQgaXQgZG9lcyBub3QuCisJCVJldCA9IGtFcGxPYmRWYWx1ZUxlbmd0aEVycm9yOworCQlnb3RvIEV4aXQ7CisJfQorCS8vIHVzZSBnaXZlbiBzaXplLCBiZWNhdXNlIG5vbi1udW1lcmljYWwgb2JqZWN0cyBjYW4gYmUgd3JpdHRlbiB3aXRoIHNob3J0ZXIgdmFsdWVzCisJT2JkU2l6ZSA9IFNpemVfcDsKKworCS8vIHNldCBvdXRwdXQgcGFyYW1ldGVycworCSpwT2JkU2l6ZV9wID0gT2JkU2l6ZTsKKwkqcHBPYmRFbnRyeV9wID0gcE9iZEVudHJ5OworCSpwcFN1YkVudHJ5X3AgPSBwU3ViRW50cnk7CisJKnBwRHN0RGF0YV9wID0gcERzdERhdGE7CisKKwkvLyBhbGwgY2hlY2tzIGFyZSBkb25lCisJLy8gdGhlIGNhbGxlciBtYXkgbm93IGNvbnZlcnQgdGhlIG51bWVyaWFsIHNvdXJjZSB2YWx1ZSB0byBwbGF0Zm9ybSBieXRlIG9yZGVyIGluIGEgdGVtcG9yYXJ5IGJ1ZmZlcgorCisgICAgICBFeGl0OgorCisJcmV0dXJuIFJldDsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxPYmRXcml0ZUVudHJ5UG9zdCgpCisvLworLy8gRGVzY3JpcHRpb246IEZ1bmN0aW9uIGZpbmlzaGVzIHdyaXRlIG9mIGRhdGEgdG8gYW4gT0JEIGVudHJ5LiBTdHJpbmdzCisvLyAgICAgICAgICAgICAgYXJlIHN0b3JlZCB3aXRoIGFkZGVkICdcMCcgY2hhcmFjdGVyLgorLy8KKy8vIFBhcmFtZXRlcnM6ICBFUExfTUNPX0RFQ0xfSU5TVEFOQ0VfUFRSXworLy8gICAgICAgICAgICAgIHVpSW5kZXhfcCAgICAgICA9ICAgSW5kZXggb2YgdGhlIE9EIGVudHJ5CisvLyAgICAgICAgICAgICAgdWlTdWJJbmRleF9wICAgID0gICBTdWJpbmRleCBvZiB0aGUgT0QgRW50cnkKKy8vICAgICAgICAgICAgICBwU3JjRGF0YV9wICAgICAgPSAgIFBvaW50ZXIgdG8gdGhlIGRhdGEgdG8gd3JpdGUKKy8vICAgICAgICAgICAgICBTaXplX3AgICAgICAgICAgPSAgIFNpemUgb2YgdGhlIGRhdGEgaW4gQnl0ZQorLy8KKy8vIFJldHVybjogICAgICB0RXBsS2VybmVsICAgICAgPSAgIEVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdEVwbEtlcm5lbCBQVUJMSUMgRXBsT2JkV3JpdGVFbnRyeVBvc3QoRVBMX01DT19ERUNMX0lOU1RBTkNFX1BUUl8KKwkJCQkJICAgICAgdEVwbE9iZEVudHJ5UHRyIHBPYmRFbnRyeV9wLAorCQkJCQkgICAgICB0RXBsT2JkU3ViRW50cnlQdHIgcFN1YkVudHJ5X3AsCisJCQkJCSAgICAgIHRFcGxPYmRDYlBhcmFtIE1FTSAqIHBDYlBhcmFtX3AsCisJCQkJCSAgICAgIHZvaWQgKnBTcmNEYXRhX3AsCisJCQkJCSAgICAgIHZvaWQgKnBEc3REYXRhX3AsCisJCQkJCSAgICAgIHRFcGxPYmRTaXplIE9iZFNpemVfcCkKK3sKKworCXRFcGxLZXJuZWwgUmV0OworCisJLy8gY2FsbGVyIGNvbnZlcnRlZCB0aGUgc291cmNlIHZhbHVlIHRvIHBsYXRmb3JtIGJ5dGUgb3JkZXIKKwkvLyBub3cgdGhlIHJhbmdlIG9mIHRoZSB2YWx1ZSBtYXkgYmUgY2hlY2tlZAorCisjaWYgKEVQTF9PQkRfQ0hFQ0tfT0JKRUNUX1JBTkdFICE9IEZBTFNFKQorCXsKKwkJLy8gY2hlY2sgZGF0YSByYW5nZQorCQlSZXQgPSBFcGxPYmRDaGVja09iamVjdFJhbmdlKHBTdWJFbnRyeV9wLCBwU3JjRGF0YV9wKTsKKwkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJZ290byBFeGl0OworCQl9CisJfQorI2VuZGlmCisKKwkvLyBub3cgY2FsbCB1c2VyIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGNoZWNrIHZhbHVlCisJLy8gd3JpdGUgYWRkcmVzcyBvZiBzb3VyY2UgZGF0YSB0byBzdHJ1Y3R1cmUgb2YgY2FsbGJhY2sgcGFyYW1ldGVycworCS8vIHNvIGNhbGxiYWNrIGZ1bmN0aW9uIGNhbiBjaGVjayB0aGlzIGRhdGEKKwlwQ2JQYXJhbV9wLT5tX3BBcmcgPSBwU3JjRGF0YV9wOworCXBDYlBhcmFtX3AtPm1fT2JkRXZlbnQgPSBrRXBsT2JkRXZQcmVXcml0ZTsKKwlSZXQgPSBFcGxPYmRDYWxsT2JqZWN0Q2FsbGJhY2soRVBMX01DT19JTlNUQU5DRV9QVFJfCisJCQkJICAgICAgIHBPYmRFbnRyeV9wLT5tX2ZwQ2FsbGJhY2ssIHBDYlBhcmFtX3ApOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKwkvLyBjb3B5IG9iamVjdCBkYXRhIHRvIE9CRAorCUVQTF9NRU1DUFkocERzdERhdGFfcCwgcFNyY0RhdGFfcCwgT2JkU2l6ZV9wKTsKKworCS8vIHRlcm1pbmF0ZSBzdHJpbmcgd2l0aCAwCisJaWYgKHBTdWJFbnRyeV9wLT5tX1R5cGUgPT0ga0VwbE9iZFR5cFZTdHJpbmcpIHsKKwkJKChjaGFyIE1FTSAqKXBEc3REYXRhX3ApW09iZFNpemVfcF0gPSAnXDAnOworCX0KKwkvLyB3cml0ZSBhZGRyZXNzIG9mIGRlc3RpbmF0aW9uIHRvIHN0cnVjdHVyZSBvZiBjYWxsYmFjayBwYXJhbWV0ZXJzCisJLy8gc28gY2FsbGJhY2sgZnVuY3Rpb24gY2FuIGNoYW5nZSBkYXRhIHN1YnNlcXVlbnRseQorCXBDYlBhcmFtX3AtPm1fcEFyZyA9IHBEc3REYXRhX3A7CisJcENiUGFyYW1fcC0+bV9PYmRFdmVudCA9IGtFcGxPYmRFdlBvc3RXcml0ZTsKKwlSZXQgPSBFcGxPYmRDYWxsT2JqZWN0Q2FsbGJhY2soRVBMX01DT19JTlNUQU5DRV9QVFJfCisJCQkJICAgICAgIHBPYmRFbnRyeV9wLT5tX2ZwQ2FsbGJhY2ssIHBDYlBhcmFtX3ApOworCisgICAgICBFeGl0OgorCisJcmV0dXJuIFJldDsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxPYmRHZXRPYmplY3RTaXplKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogZnVuY3Rpb24gdG8gZ2V0IHNpemUgb2Ygb2JqZWN0CisvLyAgICAgICAgICAgICAgVGhlIGZ1bmN0aW9uIGRldGVybWluZXMgaWYgYW4gb2JqZWN0IHR5cGUgYW4gZml4ZWQgZGF0YSB0eXBlIChCWVRFLCBXT1JELCAuLi4pCisvLyAgICAgICAgICAgICAgb3Igbm9uIGZpeGVkIG9iamVjdCAoc3RyaW5nLCBkb21haW4pLiBUaGlzIGluZm9ybWF0aW9uIGlzIHVzZWQgdG8gZGVjaWRlCisvLyAgICAgICAgICAgICAgaWYgZG93bmxvYWQgZGF0YSBhcmUgc3RvcmVkIHRlbXBvcmFyeSBvciBub3QuIEZvciBvYmplY3RzIHdpdGggZml4ZWQgZGF0YSBsZW5ndGgKKy8vICAgICAgICAgICAgICBhbmQgdHlwZXMgYSB2YWx1ZSByYW5nZSBjaGVja2luZyBjYW4gcHJvY2Vzcy4KKy8vICAgICAgICAgICAgICBGb3Igc3RyaW5ncyB0aGUgZnVuY3Rpb24gcmV0dXJucyB0aGUgd2hvbGUgb2JqZWN0IHNpemUgbm90IHRoZQorLy8gICAgICAgICAgICAgIGxlbmd0aCBvZiBzdHJpbmcuCisvLworLy8gUGFyYW1ldGVyczogIHBTdWJJbmRleEVudHJ5X3AKKy8vCisvLyBSZXR1cm46ICAgICAgdEVwbE9iZFNpemUKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdEVwbE9iZFNpemUgRXBsT2JkR2V0T2JqZWN0U2l6ZSh0RXBsT2JkU3ViRW50cnlQdHIgcFN1YkluZGV4RW50cnlfcCkKK3sKKworCXRFcGxPYmRTaXplIERhdGFTaXplID0gMDsKKwl2b2lkICpwRGF0YTsKKworCXN3aXRjaCAocFN1YkluZGV4RW50cnlfcC0+bV9UeXBlKSB7CisJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJY2FzZSBrRXBsT2JkVHlwQm9vbDoKKworCQlEYXRhU2l6ZSA9IDE7CisJCWJyZWFrOworCisJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCS8vIE9iZFR5cGVzIHdoaWNoIGhhcyB0byBiZSBjaGVjayBiZWNhdXNlIG51bWVyaWNhbCB2YWx1ZXMKKwljYXNlIGtFcGxPYmRUeXBJbnQ4OgorCQlEYXRhU2l6ZSA9IHNpemVvZih0RXBsT2JkSW50ZWdlcjgpOworCQlicmVhazsKKworCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCWNhc2Uga0VwbE9iZFR5cFVJbnQ4OgorCQlEYXRhU2l6ZSA9IHNpemVvZih0RXBsT2JkVW5zaWduZWQ4KTsKKwkJYnJlYWs7CisKKwkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwljYXNlIGtFcGxPYmRUeXBJbnQxNjoKKwkJRGF0YVNpemUgPSBzaXplb2YodEVwbE9iZEludGVnZXIxNik7CisJCWJyZWFrOworCisJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJY2FzZSBrRXBsT2JkVHlwVUludDE2OgorCQlEYXRhU2l6ZSA9IHNpemVvZih0RXBsT2JkVW5zaWduZWQxNik7CisJCWJyZWFrOworCisJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJY2FzZSBrRXBsT2JkVHlwSW50MzI6CisJCURhdGFTaXplID0gc2l6ZW9mKHRFcGxPYmRJbnRlZ2VyMzIpOworCQlicmVhazsKKworCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCWNhc2Uga0VwbE9iZFR5cFVJbnQzMjoKKwkJRGF0YVNpemUgPSBzaXplb2YodEVwbE9iZFVuc2lnbmVkMzIpOworCQlicmVhazsKKworCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCWNhc2Uga0VwbE9iZFR5cFJlYWwzMjoKKwkJRGF0YVNpemUgPSBzaXplb2YodEVwbE9iZFJlYWwzMik7CisJCWJyZWFrOworCisJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCS8vIE9iZFR5cGVzIHdoaWNoIGhhcyB0byBiZSBub3QgY2hlY2tlZCBiZWNhdXNlIG5vdCBOVU0gdmFsdWVzCisJY2FzZSBrRXBsT2JkVHlwRG9tYWluOgorCisJCXBEYXRhID0gKHZvaWQgKilwU3ViSW5kZXhFbnRyeV9wLT5tX3BDdXJyZW50OworCQlpZiAoKHZvaWQgTUVNICopcERhdGEgIT0gKHZvaWQgTUVNICopTlVMTCkgeworCQkJRGF0YVNpemUgPSAoKHRFcGxPYmRWYXJFbnRyeSBNRU0gKikgcERhdGEpLT5tX1NpemU7CisJCX0KKwkJYnJlYWs7CisKKwkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwljYXNlIGtFcGxPYmRUeXBWU3RyaW5nOgorCQkvL2Nhc2Uga0VwbE9iZFR5cFVTdHJpbmc6CisKKwkJLy8gSWYgT0QgZW50cnkgaXMgZGVmaW5lZCBieSBtYWNybyBFUExfT0JEX1NVQklOREVYX1JPTV9WU1RSSU5HCisJCS8vIHRoZW4gdGhlIGN1cnJlbnQgcG9pbnRlciBpcyBhbHdheXMgTlVMTC4gVGhlIGZ1bmN0aW9uCisJCS8vIHJldHVybnMgdGhlIGxlbmd0aCBvZiBkZWZhdWx0IHN0cmluZy4KKwkJcERhdGEgPSAodm9pZCAqKXBTdWJJbmRleEVudHJ5X3AtPm1fcEN1cnJlbnQ7CisJCWlmICgodm9pZCBNRU0gKilwRGF0YSAhPSAodm9pZCBNRU0gKilOVUxMKSB7CisJCQkvLyBUaGUgbWF4LiBzaXplIG9mIHN0cmluZ3MgZGVmaW5lZCBieSBTVFJJTkctTWFjcm8gaXMgc3RvcmVkIGluCisJCQkvLyB0RXBsT2JkVlN0cmluZyBvZiBjdXJyZW50IHZhbHVlLgorCQkJLy8gKHR5cGVzIHRFcGxPYmRWU3RyaW5nLCB0RXBsT2JkT1N0cmluZyBhbmQgdEVwbE9iZFVTdHJpbmcgaGFzIHRoZSBzYW1lIG1lbWJlcnMpCisJCQlEYXRhU2l6ZSA9ICgodEVwbE9iZFZTdHJpbmcgTUVNICopIHBEYXRhKS0+bV9TaXplOworCQl9IGVsc2UgeworCQkJLy8gVGhlIGN1cnJlbnQgcG9zaXRpb24gaXMgbm90IGRlY2xlYXJlZC4gVGhlIHN0cmluZworCQkJLy8gaXMgbG9jYXRlZCBpbiBST00sIHRoZXJlZm9yIHVzZSBkZWZhdWx0IHBvaW50ZXIuCisJCQlwRGF0YSA9ICh2b2lkICopcFN1YkluZGV4RW50cnlfcC0+bV9wRGVmYXVsdDsKKwkJCWlmICgoQ09OU1Qgdm9pZCBST00gKilwRGF0YSAhPSAoQ09OU1Qgdm9pZCBST00gKilOVUxMKSB7CisJCQkJLy8gVGhlIG1heC4gc2l6ZSBvZiBzdHJpbmdzIGRlZmluZWQgYnkgU1RSSU5HLU1hY3JvIGlzIHN0b3JlZCBpbgorCQkJCS8vIHRFcGxPYmRWU3RyaW5nIG9mIGRlZmF1bHQgdmFsdWUuCisJCQkJRGF0YVNpemUgPQorCQkJCSAgICAoKENPTlNUIHRFcGxPYmRWU3RyaW5nIFJPTSAqKSBwRGF0YSktPgorCQkJCSAgICBtX1NpemU7CisJCQl9CisJCX0KKworCQlicmVhazsKKworCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCWNhc2Uga0VwbE9iZFR5cE9TdHJpbmc6CisKKwkJcERhdGEgPSAodm9pZCAqKXBTdWJJbmRleEVudHJ5X3AtPm1fcEN1cnJlbnQ7CisJCWlmICgodm9pZCBNRU0gKilwRGF0YSAhPSAodm9pZCBNRU0gKilOVUxMKSB7CisJCQkvLyBUaGUgbWF4LiBzaXplIG9mIHN0cmluZ3MgZGVmaW5lZCBieSBTVFJJTkctTWFjcm8gaXMgc3RvcmVkIGluCisJCQkvLyB0RXBsT2JkVlN0cmluZyBvZiBjdXJyZW50IHZhbHVlLgorCQkJLy8gKHR5cGVzIHRFcGxPYmRWU3RyaW5nLCB0RXBsT2JkT1N0cmluZyBhbmQgdEVwbE9iZFVTdHJpbmcgaGFzIHRoZSBzYW1lIG1lbWJlcnMpCisJCQlEYXRhU2l6ZSA9ICgodEVwbE9iZE9TdHJpbmcgTUVNICopIHBEYXRhKS0+bV9TaXplOworCQl9IGVsc2UgeworCQkJLy8gVGhlIGN1cnJlbnQgcG9zaXRpb24gaXMgbm90IGRlY2xlYXJlZC4gVGhlIHN0cmluZworCQkJLy8gaXMgbG9jYXRlZCBpbiBST00sIHRoZXJlZm9yIHVzZSBkZWZhdWx0IHBvaW50ZXIuCisJCQlwRGF0YSA9ICh2b2lkICopcFN1YkluZGV4RW50cnlfcC0+bV9wRGVmYXVsdDsKKwkJCWlmICgoQ09OU1Qgdm9pZCBST00gKilwRGF0YSAhPSAoQ09OU1Qgdm9pZCBST00gKilOVUxMKSB7CisJCQkJLy8gVGhlIG1heC4gc2l6ZSBvZiBzdHJpbmdzIGRlZmluZWQgYnkgU1RSSU5HLU1hY3JvIGlzIHN0b3JlZCBpbgorCQkJCS8vIHRFcGxPYmRWU3RyaW5nIG9mIGRlZmF1bHQgdmFsdWUuCisJCQkJRGF0YVNpemUgPQorCQkJCSAgICAoKENPTlNUIHRFcGxPYmRPU3RyaW5nIFJPTSAqKSBwRGF0YSktPgorCQkJCSAgICBtX1NpemU7CisJCQl9CisJCX0KKwkJYnJlYWs7CisKKwkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwljYXNlIGtFcGxPYmRUeXBJbnQyNDoKKwljYXNlIGtFcGxPYmRUeXBVSW50MjQ6CisKKwkJRGF0YVNpemUgPSAzOworCQlicmVhazsKKworCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCWNhc2Uga0VwbE9iZFR5cEludDQwOgorCWNhc2Uga0VwbE9iZFR5cFVJbnQ0MDoKKworCQlEYXRhU2l6ZSA9IDU7CisJCWJyZWFrOworCisJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJY2FzZSBrRXBsT2JkVHlwSW50NDg6CisJY2FzZSBrRXBsT2JkVHlwVUludDQ4OgorCisJCURhdGFTaXplID0gNjsKKwkJYnJlYWs7CisKKwkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwljYXNlIGtFcGxPYmRUeXBJbnQ1NjoKKwljYXNlIGtFcGxPYmRUeXBVSW50NTY6CisKKwkJRGF0YVNpemUgPSA3OworCQlicmVhazsKKworCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCWNhc2Uga0VwbE9iZFR5cEludDY0OgorCWNhc2Uga0VwbE9iZFR5cFVJbnQ2NDoKKwljYXNlIGtFcGxPYmRUeXBSZWFsNjQ6CisKKwkJRGF0YVNpemUgPSA4OworCQlicmVhazsKKworCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCWNhc2Uga0VwbE9iZFR5cFRpbWVPZkRheToKKwljYXNlIGtFcGxPYmRUeXBUaW1lRGlmZjoKKworCQlEYXRhU2l6ZSA9IDY7CisJCWJyZWFrOworCisJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIERhdGFTaXplOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxPYmRHZXRPYmplY3REZWZhdWx0UHRyKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogZnVuY3Rpb24gdG8gZ2V0IHRoZSBkZWZhdWx0IHBvaW50ZXIgKHR5cGUgc3BlY2lmaWMpCisvLworLy8gUGFyYW1ldGVyczogIHBTdWJJbmRleEVudHJ5X3AgICAgPSBwb2ludGVyIHRvIHN1YmluZGV4IHN0cnVjdHVyZQorLy8KKy8vIFJldHVybnM6ICAgICAodm9pZCAqKSAgID0gcG9pbnRlciB0byBkZWZhdWx0IHZhbHVlCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQgKkVwbE9iZEdldE9iamVjdERlZmF1bHRQdHIodEVwbE9iZFN1YkVudHJ5UHRyIHBTdWJJbmRleEVudHJ5X3ApCit7CisKKwl2b2lkICpwRGVmYXVsdDsKKwl0RXBsT2JkVHlwZSBUeXBlOworCisJQVNTRVJUTVNHKHBTdWJJbmRleEVudHJ5X3AgIT0gTlVMTCwKKwkJICAiRXBsT2JkR2V0T2JqZWN0RGVmYXVsdFB0cigpOiBwb2ludGVyIHRvIFN1YkVudHJ5IG5vdCB2YWxpZCFcbiIpOworCisJLy8gZ2V0IGFkZHJlc3MgdG8gZGVmYXVsdCBkYXRhIGZyb20gZGVmYXVsdCBwb2ludGVyCisJcERlZmF1bHQgPSBwU3ViSW5kZXhFbnRyeV9wLT5tX3BEZWZhdWx0OworCWlmIChwRGVmYXVsdCAhPSBOVUxMKSB7CisJCS8vIHRoZXJlIGFyZSBzb21lIHNwZWNpYWwgdHlwZXMsIHdob3NlIGRlZmF1bHQgcG9pbnRlciBhbHdheXMgaXMgTlVMTCBvciBoYXMgdG8gZ2V0IGZyb20gb3RoZXIgc3RydWN0dXJlCisJCS8vIGdldCB0eXBlIGZyb20gc3ViaW5kZXggc3RydWN0dXJlCisJCVR5cGUgPSBwU3ViSW5kZXhFbnRyeV9wLT5tX1R5cGU7CisKKwkJLy8gY2hlY2sgaWYgb2JqZWN0IHR5cGUgaXMgYSBzdHJpbmcgdmFsdWUKKwkJaWYgKChUeXBlID09IGtFcGxPYmRUeXBWU3RyaW5nKQkvKiB8fAorCQkJCQkJICAgKFR5cGUgPT0ga0VwbE9iZFR5cFVTdHJpbmcpICovICkgeworCisJCQkvLyBFUExfT0JEX1NVQklOREVYX1JBTV9WU1RSSU5HCisJCQkvLyAgICB0RXBsT2JkU2l6ZSAgICAgICAgIG1fU2l6ZTsgICAgICAgLS0+IHNpemUgb2YgZGVmYXVsdCBzdHJpbmcKKwkJCS8vICAgIGNoYXIgKiAgICBtX3BEZWZTdHJpbmc7IC0tPiBwb2ludGVyIHRvICBkZWZhdWx0IHN0cmluZworCQkJLy8gICAgY2hhciAqICAgIG1fcFN0cmluZzsgICAgLS0+IHBvaW50ZXIgdG8gc3RyaW5nIGluIFJBTQorCQkJLy8KKwkJCXBEZWZhdWx0ID0KKwkJCSAgICAodm9pZCAqKSgodEVwbE9iZFZTdHJpbmcgKikgcERlZmF1bHQpLT5tX3BTdHJpbmc7CisJCX0gZWxzZSBpZiAoVHlwZSA9PSBrRXBsT2JkVHlwT1N0cmluZykgeworCQkJcERlZmF1bHQgPQorCQkJICAgICh2b2lkICopKCh0RXBsT2JkT1N0cmluZyAqKSBwRGVmYXVsdCktPm1fcFN0cmluZzsKKwkJfQorCX0KKworCXJldHVybiBwRGVmYXVsdDsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxPYmRHZXRWYXJFbnRyeSgpCisvLworLy8gRGVzY3JpcHRpb246IGdldHMgYSB2YXJpYWJsZSBlbnRyeSBvZiBhbiBvYmplY3QKKy8vCisvLyBQYXJhbWV0ZXJzOiAgcFN1YmluZGV4RW50cnlfcAorLy8gICAgICAgICAgICAgIHBwVmFyRW50cnlfcAorLy8KKy8vIFJldHVybjogICAgICB0Q29wS2VybmVsCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHRFcGxLZXJuZWwgRXBsT2JkR2V0VmFyRW50cnkodEVwbE9iZFN1YkVudHJ5UHRyIHBTdWJpbmRleEVudHJ5X3AsCisJCQkJICAgIHRFcGxPYmRWYXJFbnRyeSBNRU0gKiogcHBWYXJFbnRyeV9wKQoreworCisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsT2JkVmFyRW50cnlOb3RFeGlzdDsKKworCUFTU0VSVChwcFZhckVudHJ5X3AgIT0gTlVMTCk7CS8vIGlzIG5vdCBhbGxvd2VkIHRvIGJlIE5VTEwKKwlBU1NFUlQocFN1YmluZGV4RW50cnlfcCAhPSBOVUxMKTsKKworCS8vIGNoZWNrIFZBUi1GbGFnIC0gb25seSB0aGlzIG9iamVjdCBwb2ludHMgdG8gdmFyaWFibGVzCisJaWYgKChwU3ViaW5kZXhFbnRyeV9wLT5tX0FjY2VzcyAmIGtFcGxPYmRBY2NWYXIpICE9IDApIHsKKwkJLy8gY2hlY2sgaWYgb2JqZWN0IGlzIGFuIGFycmF5CisJCWlmICgocFN1YmluZGV4RW50cnlfcC0+bV9BY2Nlc3MgJiBrRXBsT2JkQWNjQXJyYXkpICE9IDApIHsKKwkJCSpwcFZhckVudHJ5X3AgPQorCQkJICAgICYoKHRFcGxPYmRWYXJFbnRyeSBNRU0gKikgcFN1YmluZGV4RW50cnlfcC0+CisJCQkgICAgICBtX3BDdXJyZW50KVtwU3ViaW5kZXhFbnRyeV9wLT5tX3VpU3ViSW5kZXggLSAxXTsKKwkJfSBlbHNlIHsKKwkJCSpwcFZhckVudHJ5X3AgPQorCQkJICAgICh0RXBsT2JkVmFyRW50cnkgTUVNICopIHBTdWJpbmRleEVudHJ5X3AtPgorCQkJICAgIG1fcEN1cnJlbnQ7CisJCX0KKworCQlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwl9CisKKwlyZXR1cm4gUmV0OworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE9iZEdldEVudHJ5KCkKKy8vCisvLyBEZXNjcmlwdGlvbjogZ2V0cyBhIGluZGV4IGVudHJ5IGZyb20gT0QKKy8vCisvLyBQYXJhbWV0ZXJzOiAgdWlJbmRleF9wICAgICAgID0gICBJbmRleCBudW1iZXIKKy8vICAgICAgICAgICAgICB1aVN1YmluZGV4X3AgICAgPSAgIFN1YmluZGV4IG51bWJlcgorLy8gICAgICAgICAgICAgIHBwT2JkRW50cnlfcCAgICA9ICAgcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgZW50cnkKKy8vICAgICAgICAgICAgICBwcE9iZFN1YkVudHJ5X3AgPSAgIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIHN1YmVudHJ5CisvLworLy8gUmV0dXJuOiAgICAgIHRFcGxLZXJuZWwKKworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB0RXBsS2VybmVsIEVwbE9iZEdldEVudHJ5KEVQTF9NQ09fREVDTF9JTlNUQU5DRV9QVFJfCisJCQkJIHVuc2lnbmVkIGludCB1aUluZGV4X3AsCisJCQkJIHVuc2lnbmVkIGludCB1aVN1YmluZGV4X3AsCisJCQkJIHRFcGxPYmRFbnRyeVB0ciAqIHBwT2JkRW50cnlfcCwKKwkJCQkgdEVwbE9iZFN1YkVudHJ5UHRyICogcHBPYmRTdWJFbnRyeV9wKQoreworCisJdEVwbE9iZEVudHJ5UHRyIHBPYmRFbnRyeTsKKwl0RXBsT2JkQ2JQYXJhbSBNRU0gQ2JQYXJhbTsKKwl0RXBsS2VybmVsIFJldDsKKworCS8vIGNoZWNrIGZvciBhbGwgQVBJIGZ1bmN0aW9uIGlmIGluc3RhbmNlIGlzIHZhbGlkCisJRVBMX01DT19DSEVDS19JTlNUQU5DRV9TVEFURSgpOworCisJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkvLyBnZXQgYWRkcmVzcyBvZiBlbnRyeSBvZiBpbmRleAorCVJldCA9CisJICAgIEVwbE9iZEdldEluZGV4SW50ZXJuKCZFUExfTUNPX0dMQl9WQVIobV9PYmRJbml0UGFyYW0pLCB1aUluZGV4X3AsCisJCQkJICZwT2JkRW50cnkpOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKwkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCS8vIGdldCBhZGRyZXNzIG9mIGVudHJ5IG9mIHN1YmluZGV4CisJUmV0ID0gRXBsT2JkR2V0U3ViaW5kZXhJbnRlcm4ocE9iZEVudHJ5LCB1aVN1YmluZGV4X3AsIHBwT2JkU3ViRW50cnlfcCk7CisJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQlnb3RvIEV4aXQ7CisJfQorCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJLy8gY2FsbCBjYWxsYmFjayBmdW5jdGlvbiB0byBpbmZvcm0gdXNlci9zdGFjayB0aGF0IGFuIG9iamVjdCB3aWxsIGJlIHNlYXJjaGVkCisJLy8gaWYgdGhlIGNhbGxlZCBtb2R1bGUgcmV0dXJuZXMgYW4gZXJyb3IgdGhlbiB3ZSBhYm9ydCB0aGUgc2VhcmNoaW5nIHdpdGgga0VwbE9iZEluZGV4Tm90RXhpc3QKKwlDYlBhcmFtLm1fdWlJbmRleCA9IHVpSW5kZXhfcDsKKwlDYlBhcmFtLm1fdWlTdWJJbmRleCA9IHVpU3ViaW5kZXhfcDsKKwlDYlBhcmFtLm1fcEFyZyA9IE5VTEw7CisJQ2JQYXJhbS5tX09iZEV2ZW50ID0ga0VwbE9iZEV2Q2hlY2tFeGlzdDsKKwlSZXQgPSBFcGxPYmRDYWxsT2JqZWN0Q2FsbGJhY2soRVBMX01DT19JTlNUQU5DRV9QVFJfCisJCQkJICAgICAgIHBPYmRFbnRyeS0+bV9mcENhbGxiYWNrLCAmQ2JQYXJhbSk7CisJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQlSZXQgPSBrRXBsT2JkSW5kZXhOb3RFeGlzdDsKKwkJZ290byBFeGl0OworCX0KKwkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCS8vIGl0IGlzIGFsbG93ZWQgdG8gc2V0IHBwT2JkRW50cnlfcCB0byBOVUxMCisJLy8gaWYgc28sIG5vIGFkZHJlc3Mgd2lsbCBiZSB3cml0dGVuIHRvIGNhbGxpbmcgZnVuY3Rpb24KKwlpZiAocHBPYmRFbnRyeV9wICE9IE5VTEwpIHsKKwkJKnBwT2JkRW50cnlfcCA9IHBPYmRFbnRyeTsKKwl9CisKKyAgICAgIEV4aXQ6CisKKwlyZXR1cm4gUmV0OworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE9iZEdldE9iamVjdEN1cnJlbnRQdHIoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBmdW5jdGlvbiB0byBnZXQgQ3VycmVudCBwb2ludGVyICh0eXBlIHNwZWNpZmljKQorLy8KKy8vIFBhcmFtZXRlcnM6ICBwU3ViSW5kZXhFbnRyeV9wCisvLworLy8gUmV0dXJuOiAgICAgIHZvaWQgTUVNKgorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkIE1FTSAqRXBsT2JkR2V0T2JqZWN0Q3VycmVudFB0cih0RXBsT2JkU3ViRW50cnlQdHIgcFN1YkluZGV4RW50cnlfcCkKK3sKKworCXZvaWQgTUVNICpwRGF0YTsKKwl1bnNpZ25lZCBpbnQgdWlBcnJheUluZGV4OworCXRFcGxPYmRTaXplIFNpemU7CisKKwlwRGF0YSA9IHBTdWJJbmRleEVudHJ5X3AtPm1fcEN1cnJlbnQ7CisKKwkvLyBjaGVjayBpZiBjb25zdGFudCBvYmplY3QKKwlpZiAocERhdGEgIT0gTlVMTCkgeworCQkvLyBjaGVjayBpZiBvYmplY3QgaXMgYW4gYXJyYXkKKwkJaWYgKChwU3ViSW5kZXhFbnRyeV9wLT5tX0FjY2VzcyAmIGtFcGxPYmRBY2NBcnJheSkgIT0gMCkgeworCQkJLy8gY2FsY3VsYXRlIGNvcnJlY3QgZGF0YSBwb2ludGVyCisJCQl1aUFycmF5SW5kZXggPSBwU3ViSW5kZXhFbnRyeV9wLT5tX3VpU3ViSW5kZXggLSAxOworCQkJaWYgKChwU3ViSW5kZXhFbnRyeV9wLT5tX0FjY2VzcyAmIGtFcGxPYmRBY2NWYXIpICE9IDApIHsKKwkJCQlTaXplID0gc2l6ZW9mKHRFcGxPYmRWYXJFbnRyeSk7CisJCQl9IGVsc2UgeworCQkJCVNpemUgPSBFcGxPYmRHZXRPYmplY3RTaXplKHBTdWJJbmRleEVudHJ5X3ApOworCQkJfQorCQkJcERhdGEgPSAoKEJZVEUgTUVNICopIHBEYXRhKSArIChTaXplICogdWlBcnJheUluZGV4KTsKKwkJfQorCQkvLyBjaGVjayBpZiBWYXJFbnRyeQorCQlpZiAoKHBTdWJJbmRleEVudHJ5X3AtPm1fQWNjZXNzICYga0VwbE9iZEFjY1ZhcikgIT0gMCkgeworCQkJLy8gVGhlIGRhdGEgcG9pbnRlciBpcyBzdG9yZWQgaW4gVmFyRW50cnktPnBEYXRhCisJCQlwRGF0YSA9ICgodEVwbE9iZFZhckVudHJ5IE1FTSAqKSBwRGF0YSktPm1fcERhdGE7CisJCX0KKwkJLy8gdGhlIGRlZmF1bHQgcG9pbnRlciBpcyBzdG9yZWQgZm9yIHN0cmluZ3MgaW4gdEVwbE9iZFZTdHJpbmcKKwkJZWxzZSBpZiAoKHBTdWJJbmRleEVudHJ5X3AtPm1fVHlwZSA9PSBrRXBsT2JkVHlwVlN0cmluZykJLyogfHwKKwkJCQkJCQkJCQkgICAocFN1YkluZGV4RW50cnlfcC0+bV9UeXBlID09IGtFcGxPYmRUeXBVU3RyaW5nKSAgICAqLworCQkJICkgeworCQkJcERhdGEgPQorCQkJICAgICh2b2lkIE1FTSAqKSgodEVwbE9iZFZTdHJpbmcgTUVNICopIHBEYXRhKS0+CisJCQkgICAgbV9wU3RyaW5nOworCQl9IGVsc2UgaWYgKHBTdWJJbmRleEVudHJ5X3AtPm1fVHlwZSA9PSBrRXBsT2JkVHlwT1N0cmluZykgeworCQkJcERhdGEgPQorCQkJICAgICh2b2lkIE1FTSAqKSgodEVwbE9iZE9TdHJpbmcgTUVNICopIHBEYXRhKS0+CisJCQkgICAgbV9wU3RyaW5nOworCQl9CisJfQorCisJcmV0dXJuIHBEYXRhOworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE9iZEdldEluZGV4SW50ZXJuKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogZ2V0cyBhIGluZGV4IGVudHJ5IGZyb20gT0QKKy8vCisvLyBQYXJhbWV0ZXJzOiAgcEluaXRQYXJhbV9wCisvLyAgICAgICAgICAgICAgdWlJbmRleF9wCisvLyAgICAgICAgICAgICAgcHBPYmRFbnRyeV9wCisvLworLy8gUmV0dXJuOiAgICAgIHRFcGxLZXJuZWwKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdEVwbEtlcm5lbCBFcGxPYmRHZXRJbmRleEludGVybih0RXBsT2JkSW5pdFBhcmFtIE1FTSAqIHBJbml0UGFyYW1fcCwKKwkJCQkgICAgICAgdW5zaWduZWQgaW50IHVpSW5kZXhfcCwKKwkJCQkgICAgICAgdEVwbE9iZEVudHJ5UHRyICogcHBPYmRFbnRyeV9wKQoreworCisJdEVwbE9iZEVudHJ5UHRyIHBPYmRFbnRyeTsKKwl0RXBsS2VybmVsIFJldDsKKwl1bnNpZ25lZCBpbnQgdWlJbmRleDsKKworI2lmIChkZWZpbmVkIChFUExfT0JEX1VTRVJfT0QpICYmIChFUExfT0JEX1VTRVJfT0QgIT0gRkFMU0UpKQorCisJdW5zaWduZWQgaW50IG5Mb29wOworCisJLy8gaWYgdXNlciBPRCBpcyB1c2VkIHRoZW4gb2JqZWt0cyBhbHNvIGhhcyB0byBiZSBzZWFyY2hlZCBpbiB1c2VyIE9ECisJLy8gdGhlcmUgaXMgbGVzcyBjb2RlIG5lZWQgaWYgd2UgZG8gdGhpcyBpbiBhIGxvb3AKKwluTG9vcCA9IDI7CisKKyNlbmRpZgorCisJQVNTRVJUTVNHKHBwT2JkRW50cnlfcCAhPSBOVUxMLAorCQkgICJFcGxPYmRHZXRJbmRleEludGVybigpOiBwb2ludGVyIHRvIGluZGV4IGVudHJ5IGlzIE5VTEwhXG4iKTsKKworCVJldCA9IGtFcGxPYmRJbmRleE5vdEV4aXN0OworCisJLy8gZ2V0IHN0YXJ0IGFkZHJlc3Mgb2YgT0QgcGFydAorCS8vIHN0YXJ0IGFkZHJlc3MgZGVwZW5kcyBvbiBvYmplY3QgaW5kZXggYmVjYXVzZQorCS8vIG9iamVjdCBkaWN0aW9uYXJ5IGlzIGRpdmlkZWQgaW4gMyBwYXJ0cworCWlmICgodWlJbmRleF9wID49IDB4MTAwMCkgJiYgKHVpSW5kZXhfcCA8IDB4MjAwMCkpIHsKKwkJcE9iZEVudHJ5ID0gcEluaXRQYXJhbV9wLT5tX3BQYXJ0OworCX0gZWxzZSBpZiAoKHVpSW5kZXhfcCA+PSAweDIwMDApICYmICh1aUluZGV4X3AgPCAweDYwMDApKSB7CisJCXBPYmRFbnRyeSA9IHBJbml0UGFyYW1fcC0+bV9wTWFudWZhY3R1cmVyUGFydDsKKwl9CisJLy8gaW5kZXggcmFuZ2UgMHhBMDAwIHRvIDB4RkZGRiBpcyByZXNlcnZlZCBmb3IgRFNQLTQwNQorCS8vIERTLTMwMSBkZWZpbmVzIHRoYXQgcmFuZ2UgMHg2MDAwIHRvIDB4OUZGRiAoISEhKSBpcyBzdG9yZWQgaWYgInN0b3JlIiB3YXMgd3JpdHRlbiB0byAweDEwMTAvMy4KKwkvLyBUaGVyZWZvcmUgZGVmYXVsdCBjb25maWd1cmF0aW9uIGlzIE9CRF9JTkNMVURFX0EwMDBfVE9fREVWSUNFX1BBUlQgPSBGQUxTRS4KKwkvLyBCdXQgYSBDQU5vcGVuIEFwcGxpY2F0aW9uIHdoaWNoIGRvZXMgbm90IGltcGxlbWVudCBkeW5hbWljIE9EIG9yIHVzZXItT0QgYnV0IHdhbnRzIHRvIHVzZSBzdGF0aWMgb2JqZXRzIDB4QTAwMC4uLgorCS8vIHNob3VsZCBzZXQgT0JEX0lOQ0xVREVfQTAwMF9UT19ERVZJQ0VfUEFSVCB0byBUUlVFLgorCisjaWYgKEVQTF9PQkRfSU5DTFVERV9BMDAwX1RPX0RFVklDRV9QQVJUID09IEZBTFNFKQorCWVsc2UgaWYgKCh1aUluZGV4X3AgPj0gMHg2MDAwKSAmJiAodWlJbmRleF9wIDwgMHg5RkZGKSkKKyNlbHNlCisJZWxzZSBpZiAoKHVpSW5kZXhfcCA+PSAweDYwMDApICYmICh1aUluZGV4X3AgPCAweEZGRkYpKQorI2VuZGlmCisJeworCQlwT2JkRW50cnkgPSBwSW5pdFBhcmFtX3AtPm1fcERldmljZVBhcnQ7CisJfQorCisjaWYgKGRlZmluZWQgKEVQTF9PQkRfVVNFUl9PRCkgJiYgKEVQTF9PQkRfVVNFUl9PRCAhPSBGQUxTRSkpCisKKwkvLyBpZiBpbmRleCBkb2VzIG5vdCBtYXRjaCBpbiBzdGF0aWMgT0QgdGhlbiBpbmRleCBvbmx5IGhhcyB0byBiZSBzZWFyY2hlZCBpbiB1c2VyIE9ECisJZWxzZSB7CisJCS8vIGJlZ2luIGZyb20gZmlyc3QgZW50cnkgb2YgdXNlciBPRCBwYXJ0CisJCXBPYmRFbnRyeSA9IHBJbml0UGFyYW1fcC0+bV9wVXNlclBhcnQ7CisKKwkJLy8gbm8gdXNlciBPRCBpcyBhdmFpbGFibGUKKwkJaWYgKHBPYmRFbnRyeSA9PSBOVUxMKSB7CisJCQlnb3RvIEV4aXQ7CisJCX0KKwkJLy8gbG9vcCBtdXN0IG9ubHkgcnVuIG9uY2UKKwkJbkxvb3AgPSAxOworCX0KKworCWRvIHsKKworI2Vsc2UKKworCS8vIG5vIHVzZXIgT0QgaXMgYXZhaWxhYmxlCisJLy8gc28gb3RoZXIgb2JqZWN0IGNhbiBiZSBmb3VuZCBpbiBPRAorCWVsc2UgeworCQlSZXQgPSBrRXBsT2JkSWxsZWdhbFBhcnQ7CisJCWdvdG8gRXhpdDsKKwl9CisKKyNlbmRpZgorCisJLy8gbm90ZToKKwkvLyBUaGUgZW5kIG9mIEluZGV4IHRhYmxlIGlzIG1hcmtlZCB3aXRoIG1fdWlJbmRleCA9IDB4RkZGRi4KKwkvLyBJZiB0aGlzIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIHdpdGggd0luZGV4X3AgPSAweEZGRkYsIGVudHJ5CisJLy8gc2hvdWxkIG5vdCBiZSBmb3VuZC4gVGhlcmVmb3IgaXQgaXMgaW1wb3J0YW50IHRvIHVzZQorCS8vIHdoaWxle30gaW5zdGVhZCBvZiBkb3t9d2hpbGUgISEhCisKKwkvLyBnZXQgZmlyc3QgaW5kZXggb2YgaW5kZXggdGFibGUKKwl1aUluZGV4ID0gcE9iZEVudHJ5LT5tX3VpSW5kZXg7CisKKwkvLyBzZWFyY2ggSW5kZXggaW4gT0QgcGFydAorCXdoaWxlICh1aUluZGV4ICE9IEVQTF9PQkRfVEFCTEVfSU5ERVhfRU5EKSB7CisJCS8vIGdvIHRvIHRoZSBlbmQgb2YgdGhpcyBmdW5jdGlvbiBpZiBpbmRleCBpcyBmb3VuZAorCQlpZiAodWlJbmRleF9wID09IHVpSW5kZXgpIHsKKwkJCS8vIHdyaXRlIGFkZHJlc3Mgb2YgT0QgZW50cnkgdG8gY2FsbGluZyBmdW5jdGlvbgorCQkJKnBwT2JkRW50cnlfcCA9IHBPYmRFbnRyeTsKKwkJCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCQkJZ290byBFeGl0OworCQl9CisJCS8vIG9iamVjdHMgYXJlIHNvcnRlZCBpbiBPRAorCQkvLyBpZiB0aGUgY3VycmVudCBpbmRleCBpbiBPRCBpcyBncmVhdGVyIHRoYW4gdGhlIGluZGV4IHdoaWNoIGlzIHRvIHNlYXJjaCB0aGVuIGJyZWFrIGxvb3AKKwkJLy8gaW4gdGhpcyBjYXNlIHVzZXIgT0QgaGFzIHRvIGJlIHNlYXJjaCB0b28KKwkJaWYgKHVpSW5kZXhfcCA8IHVpSW5kZXgpIHsKKwkJCWJyZWFrOworCQl9CisJCS8vIG5leHQgZW50cnkgaW4gaW5kZXggdGFibGUKKwkJcE9iZEVudHJ5Kys7CisKKwkJLy8gZ2V0IG5leHQgaW5kZXggb2YgaW5kZXggdGFibGUKKwkJdWlJbmRleCA9IHBPYmRFbnRyeS0+bV91aUluZGV4OworCX0KKworI2lmIChkZWZpbmVkIChFUExfT0JEX1VTRVJfT0QpICYmIChFUExfT0JEX1VTRVJfT0QgIT0gRkFMU0UpKQorCisJLy8gYmVnaW4gZnJvbSBmaXJzdCBlbnRyeSBvZiB1c2VyIE9EIHBhcnQKKwlwT2JkRW50cnkgPSBwSW5pdFBhcmFtX3AtPm1fcFVzZXJQYXJ0OworCisJLy8gbm8gdXNlciBPRCBpcyBhdmFpbGFibGUKKwlpZiAocE9iZEVudHJ5ID09IE5VTEwpIHsKKwkJZ290byBFeGl0OworCX0KKwkvLyBzd2l0Y2ggbmV4dCBsb29wIGZvciB1c2VyIE9ECisJbkxvb3AtLTsKKworfQorCit3aGlsZSAobkxvb3AgPiAwKSA7CisKKyNlbmRpZgorCisgICAgLy8gaW4gdGhpcyBsaW5lIEluZGV4IHdhcyBub3QgZm91bmQKKworRXhpdDoKKworcmV0dXJuIFJldDsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxPYmRHZXRTdWJpbmRleEludGVybigpCisvLworLy8gRGVzY3JpcHRpb246IGdldHMgYSBzdWJpbmRleCBlbnRyeSBmcm9tIGEgaW5kZXggZW50cnkKKy8vCisvLyBQYXJhbWV0ZXJzOiAgcE9iZEVudHJ5X3AKKy8vICAgICAgICAgICAgICBiU3ViSW5kZXhfcAorLy8gICAgICAgICAgICAgIHBwT2JkU3ViRW50cnlfcAorLy8KKy8vIFJldHVybjogICAgICB0RXBsS2VybmVsCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHRFcGxLZXJuZWwgRXBsT2JkR2V0U3ViaW5kZXhJbnRlcm4odEVwbE9iZEVudHJ5UHRyIHBPYmRFbnRyeV9wLAorCQkJCQkgIHVuc2lnbmVkIGludCB1aVN1YkluZGV4X3AsCisJCQkJCSAgdEVwbE9iZFN1YkVudHJ5UHRyICogcHBPYmRTdWJFbnRyeV9wKQoreworCisJdEVwbE9iZFN1YkVudHJ5UHRyIHBTdWJFbnRyeTsKKwl1bnNpZ25lZCBpbnQgblN1YkluZGV4Q291bnQ7CisJdEVwbEtlcm5lbCBSZXQ7CisKKwlBU1NFUlRNU0cocE9iZEVudHJ5X3AgIT0gTlVMTCwKKwkJICAiRXBsT2JkR2V0U3ViaW5kZXhJbnRlcm4oKTogcG9pbnRlciB0byBpbmRleCBpcyBOVUxMIVxuIik7CisJQVNTRVJUTVNHKHBwT2JkU3ViRW50cnlfcCAhPSBOVUxMLAorCQkgICJFcGxPYmRHZXRTdWJpbmRleEludGVybigpOiBwb2ludGVyIHRvIHN1YmluZGV4IGlzIE5VTEwhXG4iKTsKKworCVJldCA9IGtFcGxPYmRTdWJpbmRleE5vdEV4aXN0OworCisJLy8gZ2V0IHN0YXJ0IGFkZHJlc3Mgb2Ygc3ViaW5kZXggdGFibGUgYW5kIGNvdW50IG9mIHN1YmluZGljZXMKKwlwU3ViRW50cnkgPSBwT2JkRW50cnlfcC0+bV9wU3ViSW5kZXg7CisJblN1YkluZGV4Q291bnQgPSBwT2JkRW50cnlfcC0+bV91aUNvdW50OworCUFTU0VSVE1TRygocFN1YkVudHJ5ICE9IE5VTEwpICYmIChuU3ViSW5kZXhDb3VudCA+IDApLCAiT2JkR2V0U3ViaW5kZXhJbnRlcm4oKTogaW52YWxpZCBzdWJpbmRleCB0YWJsZSB3aXRoaW4gaW5kZXggdGFibGUhXG4iKTsJLy8gc2hvdWxkIG5ldmVyIGJlIE5VTEwKKworCS8vIHNlYXJjaCBzdWJpbmRleCBpbiBzdWJpbmRleCB0YWJsZQorCXdoaWxlIChuU3ViSW5kZXhDb3VudCA+IDApIHsKKwkJLy8gY2hlY2sgaWYgYXJyYXkgaXMgZm91bmQKKwkJaWYgKChwU3ViRW50cnktPm1fQWNjZXNzICYga0VwbE9iZEFjY0FycmF5KSAhPSAwKSB7CisJCQkvLyBjaGVjayBpZiBzdWJpbmRleCBpcyBpbiByYW5nZQorCQkJaWYgKHVpU3ViSW5kZXhfcCA8IHBPYmRFbnRyeV9wLT5tX3VpQ291bnQpIHsKKwkJCQkvLyB1cGRhdGUgc3ViaW5kZXggbnVtYmVyIChzdWJpbmRleCBlbnRyeSBvZiBhbiBhcnJheSBpcyBhbHdheXMgaW4gUkFNICEhISkKKwkJCQlwU3ViRW50cnktPm1fdWlTdWJJbmRleCA9IHVpU3ViSW5kZXhfcDsKKwkJCQkqcHBPYmRTdWJFbnRyeV9wID0gcFN1YkVudHJ5OworCQkJCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCQkJCWdvdG8gRXhpdDsKKwkJCX0KKwkJfQorCQkvLyBnbyB0byB0aGUgZW5kIG9mIHRoaXMgZnVuY3Rpb24gaWYgc3ViaW5kZXggaXMgZm91bmQKKwkJZWxzZSBpZiAodWlTdWJJbmRleF9wID09IHBTdWJFbnRyeS0+bV91aVN1YkluZGV4KSB7CisJCQkqcHBPYmRTdWJFbnRyeV9wID0gcFN1YkVudHJ5OworCQkJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJCQlnb3RvIEV4aXQ7CisJCX0KKwkJLy8gb2JqZWN0cyBhcmUgc29ydGVkIGluIE9ECisJCS8vIGlmIHRoZSBjdXJyZW50IHN1YmluZGV4IGluIE9EIGlzIGdyZWF0ZXIgdGhhbiB0aGUgc3ViaW5kZXggd2hpY2ggaXMgdG8gc2VhcmNoIHRoZW4gYnJlYWsgbG9vcAorCQkvLyBpbiB0aGlzIGNhc2UgdXNlciBPRCBoYXMgdG8gYmUgc2VhcmNoIHRvbworCQlpZiAodWlTdWJJbmRleF9wIDwgcFN1YkVudHJ5LT5tX3VpU3ViSW5kZXgpIHsKKwkJCWJyZWFrOworCQl9CisKKwkJcFN1YkVudHJ5Kys7CisJCW5TdWJJbmRleENvdW50LS07CisJfQorCisJLy8gaW4gdGhpcyBsaW5lIFN1YkluZGV4IHdhcyBub3QgZm91bnQKKworICAgICAgRXhpdDoKKworCXJldHVybiBSZXQ7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsT2JkU2V0U3RvcmVMb2FkT2JqQ2FsbGJhY2soKQorLy8KKy8vIERlc2NyaXB0aW9uOiBmdW5jdGlvbiBzZXQgYWRkcmVzcyB0byBjYWxsYmFja2Z1bmN0aW9uIGZvciBjb21tYW5kIFN0b3JlIGFuZCBMb2FkCisvLworLy8gUGFyYW1ldGVyczogIGZwQ2FsbGJhY2tfcAorLy8KKy8vIFJldHVybjogICAgICB0RXBsS2VybmVsCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNpZiAoRVBMX09CRF9VU0VfU1RPUkVfUkVTVE9SRSAhPSBGQUxTRSkKK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQworRXBsT2JkU2V0U3RvcmVMb2FkT2JqQ2FsbGJhY2soRVBMX01DT19ERUNMX0lOU1RBTkNFX1BUUl8KKwkJCSAgICAgIHRFcGxPYmRTdG9yZUxvYWRPYmpDYWxsYmFjayBmcENhbGxiYWNrX3ApCit7CisKKwlFUExfTUNPX0NIRUNLX0lOU1RBTkNFX1NUQVRFKCk7CisKKwkvLyBzZXQgbmV3IGFkZHJlc3Mgb2YgY2FsbGJhY2sgZnVuY3Rpb24KKwlFUExfTUNPX0dMQl9WQVIobV9mcFN0b3JlTG9hZE9iakNhbGxiYWNrKSA9IGZwQ2FsbGJhY2tfcDsKKworCXJldHVybiBrRXBsU3VjY2Vzc2Z1bDsKKworfQorI2VuZGlmIC8vIChFUExfT0JEX1VTRV9TVE9SRV9SRVNUT1JFICE9IEZBTFNFKQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxPYmRBY2Nlc3NPZFBhcnRJbnRlcm4oKQorLy8KKy8vIERlc2NyaXB0aW9uOiBydW5zIHRocm91Z2ggT0QgYW5kIGV4ZWN1dGVzIGEgam9iCisvLworLy8gUGFyYW1ldGVyczogIEN1cnJlbnRPZFBhcnRfcAorLy8gICAgICAgICAgICAgIHBPYmRFbnR5X3AKKy8vICAgICAgICAgICAgICBEaXJlY3Rpb25fcCAgICAgPSB3aGF0IGlzIHRvIGRvIChsb2FkIHZhbHVlcyBmcm9tIGZsYXNoIG9yIEVFUFJPTSwgc3RvcmUsIC4uLikKKy8vCisvLyBSZXR1cm46ICAgICAgdEVwbEtlcm5lbAorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB0RXBsS2VybmVsIEVwbE9iZEFjY2Vzc09kUGFydEludGVybihFUExfTUNPX0RFQ0xfSU5TVEFOQ0VfUFRSXworCQkJCQkgICB0RXBsT2JkUGFydCBDdXJyZW50T2RQYXJ0X3AsCisJCQkJCSAgIHRFcGxPYmRFbnRyeVB0ciBwT2JkRW50eV9wLAorCQkJCQkgICB0RXBsT2JkRGlyIERpcmVjdGlvbl9wKQoreworCisJdEVwbE9iZFN1YkVudHJ5UHRyIHBTdWJJbmRleDsKKwl1bnNpZ25lZCBpbnQgblN1YkluZGV4Q291bnQ7CisJdEVwbE9iZEFjY2VzcyBBY2Nlc3M7CisJdm9pZCBNRU0gKnBEc3REYXRhOworCXZvaWQgKnBEZWZhdWx0OworCXRFcGxPYmRTaXplIE9ialNpemU7CisJdEVwbEtlcm5lbCBSZXQ7CisJdEVwbE9iZENiU3RvcmVQYXJhbSBNRU0gQ2JTdG9yZTsKKwl0RXBsT2JkVmFyRW50cnkgTUVNICpwVmFyRW50cnk7CisKKwlBU1NFUlQocE9iZEVudHlfcCAhPSBOVUxMKTsKKworCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJLy8gcHJlcGFyZSBzdHJ1Y3R1cmUgZm9yIFNUT1JFIFJFU1RPUkUgY2FsbGJhY2sgZnVuY3Rpb24KKwlDYlN0b3JlLm1fYkN1cnJlbnRPZFBhcnQgPSAoQllURSkgQ3VycmVudE9kUGFydF9wOworCUNiU3RvcmUubV9wRGF0YSA9IE5VTEw7CisJQ2JTdG9yZS5tX09ialNpemUgPSAwOworCisJLy8gY29tbWFuZCBvZiBmaXJzdCBhY3Rpb24gZGVwZW5kcyBvbiBkaXJlY3Rpb24gdG8gYWNjZXNzCisjaWYgKEVQTF9PQkRfVVNFX1NUT1JFX1JFU1RPUkUgIT0gRkFMU0UpCisJaWYgKERpcmVjdGlvbl9wID09IGtFcGxPYmREaXJMb2FkKSB7CisJCUNiU3RvcmUubV9iQ29tbWFuZCA9IChCWVRFKSBrRXBsT2JkQ29tbU9wZW5SZWFkOworCisJCS8vIGNhbGwgY2FsbGJhY2sgZnVuY3Rpb24gZm9yIHByZXZpb3VzIGNvbW1hbmQKKwkJUmV0ID0gRXBsT2JkQ2FsbFN0b3JlQ2FsbGJhY2soRVBMX01DT19JTlNUQU5DRV9QVFJfICYgQ2JTdG9yZSk7CisJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCWdvdG8gRXhpdDsKKwkJfQorCQkvLyBzZXQgY29tbWFuZCBmb3IgaW5kZXggYW5kIHN1YmluZGV4IGxvb3AKKwkJQ2JTdG9yZS5tX2JDb21tYW5kID0gKEJZVEUpIGtFcGxPYmRDb21tUmVhZE9iajsKKwl9IGVsc2UgaWYgKERpcmVjdGlvbl9wID09IGtFcGxPYmREaXJTdG9yZSkgeworCQlDYlN0b3JlLm1fYkNvbW1hbmQgPSAoQllURSkga0VwbE9iZENvbW1PcGVuV3JpdGU7CisKKwkJLy8gY2FsbCBjYWxsYmFjayBmdW5jdGlvbiBmb3IgcHJldmlvdXMgY29tbWFuZAorCQlSZXQgPSBFcGxPYmRDYWxsU3RvcmVDYWxsYmFjayhFUExfTUNPX0lOU1RBTkNFX1BUUl8gJiBDYlN0b3JlKTsKKwkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJZ290byBFeGl0OworCQl9CisJCS8vIHNldCBjb21tYW5kIGZvciBpbmRleCBhbmQgc3ViaW5kZXggbG9vcAorCQlDYlN0b3JlLm1fYkNvbW1hbmQgPSAoQllURSkga0VwbE9iZENvbW1Xcml0ZU9iajsKKwl9CisjZW5kaWYgLy8gKEVQTF9PQkRfVVNFX1NUT1JFX1JFU1RPUkUgIT0gRkFMU0UpCisKKwkvLyB3ZSBzaG91bGQgbm90IHJlc3RvcmUgdGhlIE9EIHZhbHVlcyBoZXJlCisJLy8gdGhlIG5leHQgTk1UIGNvbW1hbmQgIlJlc2V0IE5vZGUiIG9yICJSZXNldCBDb21tdW5pY2F0aW9uIiByZXNldHMgdGhlIE9EIGRhdGEKKwlpZiAoRGlyZWN0aW9uX3AgIT0ga0VwbE9iZERpclJlc3RvcmUpIHsKKwkJLy8gd2FsayB0aHJvdWdoIE9EIHBhcnQgdGlsbCBlbmQgaXMgZm91bmQKKwkJd2hpbGUgKHBPYmRFbnR5X3AtPm1fdWlJbmRleCAhPSBFUExfT0JEX1RBQkxFX0lOREVYX0VORCkgeworCQkJLy8gZ2V0IGFkZHJlc3MgdG8gc3ViaW5kZXggdGFibGUgYW5kIGNvdW50IG9mIHN1YmluZGljZXMKKwkJCXBTdWJJbmRleCA9IHBPYmRFbnR5X3AtPm1fcFN1YkluZGV4OworCQkJblN1YkluZGV4Q291bnQgPSBwT2JkRW50eV9wLT5tX3VpQ291bnQ7CisJCQlBU1NFUlQoKHBTdWJJbmRleCAhPSBOVUxMKSAmJiAoblN1YkluZGV4Q291bnQgPiAwKSk7CS8vIHNob3VsZCBuZXZlciBiZSBOVUxMCisKKwkJCS8vIHdhbGsgdGhyb3VnaCBzdWJpbmRleCB0YWJsZSB0aWxsIGFsbCBzdWJpbmljZXMgd2VyZSByZXN0b3JlZAorCQkJd2hpbGUgKG5TdWJJbmRleENvdW50ICE9IDApIHsKKwkJCQlBY2Nlc3MgPSAodEVwbE9iZEFjY2VzcykgcFN1YkluZGV4LT5tX0FjY2VzczsKKworCQkJCS8vIGdldCBwb2ludGVyIHRvIGN1cnJlbnQgYW5kIGRlZmF1bHQgZGF0YQorCQkJCXBEZWZhdWx0ID0gRXBsT2JkR2V0T2JqZWN0RGVmYXVsdFB0cihwU3ViSW5kZXgpOworCQkJCXBEc3REYXRhID0gRXBsT2JkR2V0T2JqZWN0Q3VycmVudFB0cihwU3ViSW5kZXgpOworCisJCQkJLy8gTk9URSAoZm9yIGtFcGxPYmRUeXBWU3RyaW5nKToKKwkJCQkvLyAgICAgIFRoZSBmdW5jdGlvbiByZXR1cm5lcyB0aGUgbWF4LiBudW1iZXIgb2YgYnl0ZXMgZm9yIGEKKwkJCQkvLyAgICAgIGN1cnJlbnQgc3RyaW5nLgorCQkJCS8vICAgICAgci5kLjogRm9yIHN0aW5ncyB0aGUgZGVmYXVsdC1zaXplIHdpbGwgYmUgcmVhZCBpbiBvdGhlciBsaW5lcyBmb2xsb3dpbmcgKGtFcGxPYmREaXJJbml0KS4KKwkJCQlPYmpTaXplID0gRXBsT2JkR2V0T2JqZWN0U2l6ZShwU3ViSW5kZXgpOworCisJCQkJLy8gc3dpdGNoIGRpcmVjdGlvbiBvZiBPRCBhY2Nlc3MKKwkJCQlzd2l0Y2ggKERpcmVjdGlvbl9wKSB7CisJCQkJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCQkJCS8vIFZhckVudHJ5IHN0cnVjdHVyZXMgaGFzIHRvIGJlIGluaXRpYWxpemVkCisJCQkJY2FzZSBrRXBsT2JkRGlySW5pdDoKKworCQkJCQkvLyBJZiBWQVItRmxhZyBpcyBzZXQsIG1fcEN1cnJlbnQgbWVhbnMgbm90IGFkZHJlc3Mgb2YgZGF0YQorCQkJCQkvLyBidXQgYWRkcmVzcyBvZiB0RXBsT2JkVmFyRW50cnkuIEFkZHJlc3Mgb2YgZGF0YSBoYXMgdG8gYmUgZ2V0IGZyb20KKwkJCQkJLy8gdGhpcyBzdHJ1Y3R1cmUuCisJCQkJCWlmICgoQWNjZXNzICYga0VwbE9iZEFjY1ZhcikgIT0gMCkgeworCQkJCQkJRXBsT2JkR2V0VmFyRW50cnkocFN1YkluZGV4LAorCQkJCQkJCQkgICZwVmFyRW50cnkpOworCQkJCQkJRXBsT2JkSW5pdFZhckVudHJ5KHBWYXJFbnRyeSwKKwkJCQkJCQkJICAgcFN1YkluZGV4LT4KKwkJCQkJCQkJICAgbV9UeXBlLAorCQkJCQkJCQkgICBPYmpTaXplKTsKKy8qCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChBY2Nlc3MgJiBrRXBsT2JkQWNjQXJyYXkpID09IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFcGxPYmRJbml0VmFyRW50cnkgKHBTdWJJbmRleC0+bV9wQ3VycmVudCwgcFN1YkluZGV4LT5tX1R5cGUsIE9ialNpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFcGxPYmRJbml0VmFyRW50cnkgKCh0RXBsT2JkVmFyRW50cnkgTUVNKikgKCgoQllURSBNRU0qKSBwU3ViSW5kZXgtPm1fcEN1cnJlbnQpICsgKHNpemVvZiAodEVwbE9iZFZhckVudHJ5KSAqIHBTdWJJbmRleC0+bV91aVN1YkluZGV4KSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3ViSW5kZXgtPm1fVHlwZSwgT2JqU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorKi8KKwkJCQkJCS8vIGF0IHRoaXMgdGltZSBubyBhcHBsaWNhdGlvbiB2YXJpYWJsZSBpcyBkZWZpbmVkICEhIQorCQkJCQkJLy8gdGhlcmVmb3JlIGRhdGEgY2FuIG5vdCBiZSBjb3BpZWQuCisJCQkJCQlicmVhazsKKwkJCQkJfSBlbHNlIGlmIChwU3ViSW5kZXgtPm1fVHlwZSA9PQorCQkJCQkJICAga0VwbE9iZFR5cFZTdHJpbmcpIHsKKwkJCQkJCS8vIElmIHBvaW50ZXIgbV9wQ3VycmVudCBpcyBub3QgZXF1YWwgdG8gTlVMTCB0aGVuIHRoZQorCQkJCQkJLy8gc3RyaW5nIHdhcyBkZWZpbmVkIHdpdGggRVBMX09CRF9TVUJJTkRFWF9SQU1fVlNUUklORy4gVGhlIGN1cnJlbnQKKwkJCQkJCS8vIHBvaW50ZXIgcG9pbnRzIHRvIHN0cnVjdCB0RXBsT2JkVlN0cmluZyBsb2NhdGVkIGluIE1FTS4KKwkJCQkJCS8vIFRoZSBlbGVtZW50IHNpemUgaW5jbHVkZXMgdGhlIG1heC4gbnVtYmVyIG9mCisJCQkJCQkvLyBieXRlcy4gVGhlIGVsZW1lbnQgbV9wU3RyaW5nIGluY2x1ZGVzIHRoZSBwb2ludGVyCisJCQkJCQkvLyB0byBzdHJpbmcgaW4gTUVNLiBUaGUgbWVtb3J5IGxvY2F0aW9uIG9mIGRlZmF1bHQgc3RyaW5nCisJCQkJCQkvLyBtdXN0IGJlIGNvcGllZCB0byBtZW1vcnkgbG9jYXRpb24gb2YgY3VycmVudCBzdHJpbmcuCisKKwkJCQkJCXBEc3REYXRhID0KKwkJCQkJCSAgICBwU3ViSW5kZXgtPm1fcEN1cnJlbnQ7CisJCQkJCQlpZiAocERzdERhdGEgIT0gTlVMTCkgeworCQkJCQkJCS8vIDA4LWRlYy0yMDA0OiBjb2RlIG9wdGltaXphdGlvbiAhISEKKwkJCQkJCQkvLyAgICAgICAgICAgICAgZW50cmllcyAoKHRFcGxPYmRWU3RyaW5nRGVmIFJPTSopIHBTdWJJbmRleC0+bV9wRGVmYXVsdCktPm1fcFN0cmluZworCQkJCQkJCS8vICAgICAgICAgICAgICBhbmQgKCh0RXBsT2JkVlN0cmluZ0RlZiBST00qKSBwU3ViSW5kZXgtPm1fcERlZmF1bHQpLT5tX1NpemUgd2VyZSByZWFkCisJCQkJCQkJLy8gICAgICAgICAgICAgIHR3aWNlLiB0aGF0cyBub3QgbmVjZXNzYXJ5IQorCisJCQkJCQkJLy8gRm9yIGNvcHlpbmcgZGF0YSB3ZSBoYXZlIHRvIHNldCB0aGUgZGVzdGluYXRpb24gcG9pbnRlciB0byB0aGUgcmVhbCBSQU0gc3RyaW5nLiBUaGlzCisJCQkJCQkJLy8gcG9pbnRlciB0byBSQU0gc3RyaW5nIGlzIGxvY2F0ZWQgaW4gZGVmYXVsdCBzdHJpbmcgaW5mbyBzdHJ1Y3R1cmUuICh0cmFuc2xhdGVkIHIuZC4pCisJCQkJCQkJcERzdERhdGEgPQorCQkJCQkJCSAgICAodm9pZCBNRU0KKwkJCQkJCQkgICAgICopKCh0RXBsT2JkVlN0cmluZ0RlZiBST00gKikgcFN1YkluZGV4LT5tX3BEZWZhdWx0KS0+bV9wU3RyaW5nOworCQkJCQkJCU9ialNpemUgPQorCQkJCQkJCSAgICAoKHRFcGxPYmRWU3RyaW5nRGVmCisJCQkJCQkJICAgICAgUk9NICopIHBTdWJJbmRleC0+CisJCQkJCQkJICAgICBtX3BEZWZhdWx0KS0+CisJCQkJCQkJICAgIG1fU2l6ZTsKKworCQkJCQkJCSgodEVwbE9iZFZTdHJpbmcgTUVNICopCisJCQkJCQkJIHBTdWJJbmRleC0+CisJCQkJCQkJIG1fcEN1cnJlbnQpLT4KKwkJCQkgICAgIG1fcFN0cmluZyA9IHBEc3REYXRhOworCQkJCQkJCSgodEVwbE9iZFZTdHJpbmcgTUVNICopCisJCQkJCQkJIHBTdWJJbmRleC0+CisJCQkJCQkJIG1fcEN1cnJlbnQpLT5tX1NpemUgPQorCQkJCSAgICAgT2JqU2l6ZTsKKwkJCQkJCX0KKworCQkJCQl9IGVsc2UgaWYgKHBTdWJJbmRleC0+bV9UeXBlID09CisJCQkJCQkgICBrRXBsT2JkVHlwT1N0cmluZykgeworCQkJCQkJcERzdERhdGEgPQorCQkJCQkJICAgIHBTdWJJbmRleC0+bV9wQ3VycmVudDsKKwkJCQkJCWlmIChwRHN0RGF0YSAhPSBOVUxMKSB7CisJCQkJCQkJLy8gMDgtZGVjLTIwMDQ6IGNvZGUgb3B0aW1pemF0aW9uICEhIQorCQkJCQkJCS8vICAgICAgICAgICAgICBlbnRyaWVzICgodEVwbE9iZE9TdHJpbmdEZWYgUk9NKikgcFN1YkluZGV4LT5tX3BEZWZhdWx0KS0+bV9wU3RyaW5nCisJCQkJCQkJLy8gICAgICAgICAgICAgIGFuZCAoKHRFcGxPYmRPU3RyaW5nRGVmIFJPTSopIHBTdWJJbmRleC0+bV9wRGVmYXVsdCktPm1fU2l6ZSB3ZXJlIHJlYWQKKwkJCQkJCQkvLyAgICAgICAgICAgICAgdHdpY2UuIHRoYXRzIG5vdCBuZWNlc3NhcnkhCisKKwkJCQkJCQkvLyBGb3IgY29weWluZyBkYXRhIHdlIGhhdmUgdG8gc2V0IHRoZSBkZXN0aW5hdGlvbiBwb2ludGVyIHRvIHRoZSByZWFsIFJBTSBzdHJpbmcuIFRoaXMKKwkJCQkJCQkvLyBwb2ludGVyIHRvIFJBTSBzdHJpbmcgaXMgbG9jYXRlZCBpbiBkZWZhdWx0IHN0cmluZyBpbmZvIHN0cnVjdHVyZS4gKHRyYW5zbGF0ZWQgci5kLikKKwkJCQkJCQlwRHN0RGF0YSA9CisJCQkJCQkJICAgICh2b2lkIE1FTQorCQkJCQkJCSAgICAgKikoKHRFcGxPYmRPU3RyaW5nRGVmIFJPTSAqKSBwU3ViSW5kZXgtPm1fcERlZmF1bHQpLT5tX3BTdHJpbmc7CisJCQkJCQkJT2JqU2l6ZSA9CisJCQkJCQkJICAgICgodEVwbE9iZE9TdHJpbmdEZWYKKwkJCQkJCQkgICAgICBST00gKikgcFN1YkluZGV4LT4KKwkJCQkJCQkgICAgIG1fcERlZmF1bHQpLT4KKwkJCQkJCQkgICAgbV9TaXplOworCisJCQkJCQkJKCh0RXBsT2JkT1N0cmluZyBNRU0gKikKKwkJCQkJCQkgcFN1YkluZGV4LT4KKwkJCQkJCQkgbV9wQ3VycmVudCktPgorCQkJCSAgICAgbV9wU3RyaW5nID0gcERzdERhdGE7CisJCQkJCQkJKCh0RXBsT2JkT1N0cmluZyBNRU0gKikKKwkJCQkJCQkgcFN1YkluZGV4LT4KKwkJCQkJCQkgbV9wQ3VycmVudCktPm1fU2l6ZSA9CisJCQkJICAgICBPYmpTaXplOworCQkJCQkJfQorCisJCQkJCX0KKworCQkJCQkvLyBubyBicmVhayAhISBiZWNhdXNlIGNvcHkgb2YgZGF0YSBoYXMgdG8gZG9uZSB0b28uCisKKwkJCQkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJCQkJLy8gYWxsIG9iamVjdHMgaGFzIHRvIGJlIHJlc3RvcmVkIHdpdGggZGVmYXVsdCB2YWx1ZXMKKwkJCQljYXNlIGtFcGxPYmREaXJSZXN0b3JlOgorCisJCQkJCS8vIDA5LWRlYy0yMDA0IHIuZC46IG9wdGltaXphdGlvbiEgdGhlIHNhbWUgY29kZSBmb3Iga0VwbE9iZERpclJlc3RvcmUgYW5kIGtFcGxPYmREaXJMb2FkCisJCQkJCS8vICAgICAgICAgICAgICAgICAgIGlzIHJlcGxhY2VkIHRvIGZ1bmN0aW9uIE9iZENvcHlPYmplY3REYXRhKCkgd2l0aCBhIG5ldyBwYXJhbWV0ZXIuCisKKwkJCQkJLy8gcmVzdG9yZSBvYmplY3QgZGF0YSBmb3IgaW5pdCBwaGFzZQorCQkJCQlFcGxPYmRDb3B5T2JqZWN0RGF0YShwRHN0RGF0YSwgcERlZmF1bHQsCisJCQkJCQkJICAgICBPYmpTaXplLAorCQkJCQkJCSAgICAgcFN1YkluZGV4LT5tX1R5cGUpOworCQkJCQlicmVhazsKKworCQkJCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkJCQkvLyBvYmplY3RzIHdpdGggYXR0cmlidXRlIGtFcGxPYmRBY2NTdG9yZSBoYXMgdG8gYmUgbG9hZCBmcm9tIEVFUFJPTSBvciBmcm9tIGEgZmlsZQorCQkJCWNhc2Uga0VwbE9iZERpckxvYWQ6CisKKwkJCQkJLy8gcmVzdG9yZSBvYmplY3QgZGF0YSBmb3IgaW5pdCBwaGFzZQorCQkJCQlFcGxPYmRDb3B5T2JqZWN0RGF0YShwRHN0RGF0YSwgcERlZmF1bHQsCisJCQkJCQkJICAgICBPYmpTaXplLAorCQkJCQkJCSAgICAgcFN1YkluZGV4LT5tX1R5cGUpOworCisJCQkJCS8vIG5vIGJyZWFrICEhIGJlY2F1c2UgY2FsbGJhY2sgZnVuY3Rpb24gaGFzIHRvIGJlIGNhbGxlZCB0b28uCisKKwkJCQkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJCQkJLy8gb2JqZWN0cyB3aXRoIGF0dHJpYnV0ZSBrRXBsT2JkQWNjU3RvcmUgaGFzIHRvIGJlIHN0b3JlZCBpbiBFRVBST00gb3IgaW4gYSBmaWxlCisJCQkJY2FzZSBrRXBsT2JkRGlyU3RvcmU6CisKKwkJCQkJLy8gd2hlbiBhdHRyaWJ1dGUga0VwbE9iZEFjY1N0b3JlIGlzIHNldCwgdGhlbiBjYWxsIGNhbGxiYWNrIGZ1bmN0aW9uCisjaWYgKEVQTF9PQkRfVVNFX1NUT1JFX1JFU1RPUkUgIT0gRkFMU0UpCisJCQkJCWlmICgoQWNjZXNzICYga0VwbE9iZEFjY1N0b3JlKSAhPSAwKSB7CisJCQkJCQkvLyBmaWxsIG91dCBkYXRhIHBvaW50ZXIgYW5kIHNpemUgb2YgZGF0YQorCQkJCQkJQ2JTdG9yZS5tX3BEYXRhID0gcERzdERhdGE7CisJCQkJCQlDYlN0b3JlLm1fT2JqU2l6ZSA9IE9ialNpemU7CisKKwkJCQkJCS8vIGNhbGwgY2FsbGJhY2sgZnVuY3Rpb24gZm9yIHJlYWQgb3Igd3JpdGUgb2JqZWN0CisJCQkJCQlSZXQgPQorCQkJCQkJICAgIE9iZENhbGxTdG9yZUNhbGxiYWNrCisJCQkJCQkgICAgKEVQTF9NQ09fSU5TVEFOQ0VfUFRSXyAmCisJCQkJCQkgICAgIENiU3RvcmUpOworCQkJCQkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJCQkJCWdvdG8gRXhpdDsKKwkJCQkJCX0KKwkJCQkJfQorI2VuZGlmIC8vIChFUExfT0JEX1VTRV9TVE9SRV9SRVNUT1JFICE9IEZBTFNFKQorCQkJCQlicmVhazsKKworCQkJCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkJCQkvLyBpZiBPRCBCdWlsZGVyIGtleSBoYXMgdG8gYmUgY2hlY2tlZCBubyBhY2Nlc3MgdG8gc3ViaW5kZXggYW5kIGRhdGEgc2hvdWxkIGJlIG1hZGUKKwkJCQljYXNlIGtFcGxPYmREaXJPQktDaGVjazoKKworCQkJCQkvLyBubyBicmVhayAhISBiZWNhdXNlIHdlIHdhbnQgdG8gYnJlYWsgdGhlIHNlY29uZCBsb29wIHRvby4KKworCQkJCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkJCQkvLyB1bmtub3duIERpcmVjdGlvbgorCQkJCWRlZmF1bHQ6CisKKwkJCQkJLy8gc28gd2UgY2FuIGJyZWFrIHRoZSBzZWNvbmQgbG9vcCBlYXJsZXIKKwkJCQkJblN1YkluZGV4Q291bnQgPSAxOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQluU3ViSW5kZXhDb3VudC0tOworCisJCQkJLy8gbmV4dCBzdWJpbmRleCBlbnRyeQorCQkJCWlmICgoQWNjZXNzICYga0VwbE9iZEFjY0FycmF5KSA9PSAwKSB7CisJCQkJCXBTdWJJbmRleCsrOworCQkJCQlpZiAoKG5TdWJJbmRleENvdW50ID4gMCkKKwkJCQkJICAgICYmCisJCQkJCSAgICAoKHBTdWJJbmRleC0+CisJCQkJCSAgICAgIG1fQWNjZXNzICYga0VwbE9iZEFjY0FycmF5KSAhPQorCQkJCQkgICAgIDApKSB7CisJCQkJCQkvLyBuZXh0IHN1YmluZGV4IHBvaW50cyB0byBhbiBhcnJheQorCQkJCQkJLy8gcmVzZXQgc3ViaW5kZXggbnVtYmVyCisJCQkJCQlwU3ViSW5kZXgtPm1fdWlTdWJJbmRleCA9IDE7CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQlpZiAoblN1YkluZGV4Q291bnQgPiAwKSB7CisJCQkJCQkvLyBuZXh0IHN1YmluZGV4IHBvaW50cyB0byBhbiBhcnJheQorCQkJCQkJLy8gaW5jcmVtZW50IHN1YmluZGV4IG51bWJlcgorCQkJCQkJcFN1YkluZGV4LT5tX3VpU3ViSW5kZXgrKzsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKworCQkJLy8gbmV4dCBpbmRleCBlbnRyeQorCQkJcE9iZEVudHlfcCsrOworCQl9CisJfQorCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJLy8gY29tbWFuZCBvZiBsYXN0IGFjdGlvbiBkZXBlbmRzIG9uIGRpcmVjdGlvbiB0byBhY2Nlc3MKKwlpZiAoRGlyZWN0aW9uX3AgPT0ga0VwbE9iZERpck9CS0NoZWNrKSB7CisKKwkJZ290byBFeGl0OworCX0KKyNpZiAoRVBMX09CRF9VU0VfU1RPUkVfUkVTVE9SRSAhPSBGQUxTRSkKKwllbHNlIHsKKwkJaWYgKERpcmVjdGlvbl9wID09IGtFcGxPYmREaXJMb2FkKSB7CisJCQlDYlN0b3JlLm1fYkNvbW1hbmQgPSAoQllURSkga0VwbE9iZENvbW1DbG9zZVJlYWQ7CisJCX0gZWxzZSBpZiAoRGlyZWN0aW9uX3AgPT0ga0VwbE9iZERpclN0b3JlKSB7CisJCQlDYlN0b3JlLm1fYkNvbW1hbmQgPSAoQllURSkga0VwbE9iZENvbW1DbG9zZVdyaXRlOworCQl9IGVsc2UgaWYgKERpcmVjdGlvbl9wID09IGtFcGxPYmREaXJSZXN0b3JlKSB7CisJCQlDYlN0b3JlLm1fYkNvbW1hbmQgPSAoQllURSkga0VwbE9iZENvbW1DbGVhcjsKKwkJfSBlbHNlIHsKKwkJCWdvdG8gRXhpdDsKKwkJfQorCisJCS8vIGNhbGwgY2FsbGJhY2sgZnVuY3Rpb24gZm9yIGxhc3QgY29tbWFuZAorCQlSZXQgPSBFcGxPYmRDYWxsU3RvcmVDYWxsYmFjayhFUExfTUNPX0lOU1RBTkNFX1BUUl8gJiBDYlN0b3JlKTsKKwl9CisjZW5kaWYgLy8gKEVQTF9PQkRfVVNFX1NUT1JFX1JFU1RPUkUgIT0gRkFMU0UpCisKKy8vICAgIGdvdG8gRXhpdDsKKworICAgICAgRXhpdDoKKworCXJldHVybiBSZXQ7CisKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRnVuY3Rpb246ICAgIEVwbE9iZENvcHlPYmplY3REYXRhKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogY2hlY2tzIHBvaW50ZXJzIHRvIG9iamVjdCBkYXRhIGFuZCBjb3B5IHRoZW0gZnJvbSBzb3VyY2UgdG8gZGVzdGluYXRpb24KKy8vCisvLyBQYXJhbWV0ZXJzOiAgcERzdERhdGFfcCAgICAgICAgICAgICAgPSBkZXN0aW5hdGlvbiBwb2ludGVyCisvLyAgICAgICAgICAgICAgcFNyY0RhdGFfcCAgICAgICAgICAgICAgPSBzb3VyY2UgcG9pbnRlcgorLy8gICAgICAgICAgICAgIE9ialNpemVfcCAgICAgICAgICAgICAgID0gc2l6ZSBvZiBvYmplY3QKKy8vICAgICAgICAgICAgICBPYmpUeXBlX3AgICAgICAgICAgICAgICA9CisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZCBFcGxPYmRDb3B5T2JqZWN0RGF0YSh2b2lkIE1FTSAqIHBEc3REYXRhX3AsCisJCQkJIHZvaWQgKnBTcmNEYXRhX3AsCisJCQkJIHRFcGxPYmRTaXplIE9ialNpemVfcCwgdEVwbE9iZFR5cGUgT2JqVHlwZV9wKQoreworCisJdEVwbE9iZFNpemUgU3RyU2l6ZSA9IDA7CisKKwkvLyBpdCBpcyBhbGxvd2VkIHRvIHNldCBkZWZhdWx0IGFuZCBjdXJyZW50IGFkZHJlc3MgdG8gTlVMTCAobm90aGluZyB0byBjb3B5KQorCWlmIChwRHN0RGF0YV9wICE9IE5VTEwpIHsKKworCQlpZiAoT2JqVHlwZV9wID09IGtFcGxPYmRUeXBWU3RyaW5nKSB7CisJCQkvLyBUaGUgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgcmVhbGx5IG51bWJlciBvZiBjaGFyYWN0ZXJzIG9mIHN0cmluZy4gVGhlCisJCQkvLyBvYmplY3QgZW50cnkgc2l6ZSBjYW4gYmUgYmlnZ2VyIGFzIHN0cmluZyBzaXplIG9mIGRlZmF1bHQgc3RyaW5nLgorCQkJLy8gVGhlICdcMCctdGVybWluYXRpb24gaXMgaW5jbHVkZWQuIEEgc3RyaW5nIHdpdGggbm8gY2hhcmFjdGVycyBoYXMgYQorCQkJLy8gc2l6ZSBvZiAxLgorCQkJU3RyU2l6ZSA9CisJCQkgICAgRXBsT2JkR2V0U3RyTGVuKCh2b2lkICopcFNyY0RhdGFfcCwgT2JqU2l6ZV9wLAorCQkJCQkgICAga0VwbE9iZFR5cFZTdHJpbmcpOworCisJCQkvLyBJZiB0aGUgc3RyaW5nIGxlbmd0aCBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGVudHJ5IHNpemUgaW4gT0QgdGhlbiBvbmx5IGNvcHkKKwkJCS8vIGVudHJ5IHNpemUgLSAxIGFuZCBhbHdheXMgc2V0IHRoZSAnXDAnLXRlcm1pbmF0aW9uLgorCQkJaWYgKFN0clNpemUgPj0gT2JqU2l6ZV9wKSB7CisJCQkJU3RyU2l6ZSA9IE9ialNpemVfcCAtIDE7CisJCQl9CisJCX0KKworCQlpZiAocFNyY0RhdGFfcCAhPSBOVUxMKSB7CisJCQkvLyBjb3B5IGRhdGEKKwkJCUVQTF9NRU1DUFkocERzdERhdGFfcCwgcFNyY0RhdGFfcCwgT2JqU2l6ZV9wKTsKKworCQkJaWYgKE9ialR5cGVfcCA9PSBrRXBsT2JkVHlwVlN0cmluZykgeworCQkJCSgoY2hhciBNRU0gKilwRHN0RGF0YV9wKVtTdHJTaXplXSA9ICdcMCc7CisJCQl9CisJCX0KKwl9CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsT2JkSXNOdW1lcmljYWxJbnRlcm4oKQorLy8KKy8vIERlc2NyaXB0aW9uOiBmdW5jdGlvbiBjaGVja3MgaWYgYSBlbnRyeSBpcyBudW1lcmljYWwgb3Igbm90CisvLworLy8KKy8vIFBhcmFtZXRlcnM6ICBFUExfTUNPX0RFQ0xfSU5TVEFOQ0VfUFRSXyA9IEluc3RhbmNlcG9pbnRlcgorLy8gICAgICAgICAgICAgIHVpSW5kZXhfcCAgICAgICAgICAgPSBJbmRleAorLy8gICAgICAgICAgICAgIHVpU3ViSW5kZXhfcCAgICAgICAgPSBTdWJpbmRleAorLy8gICAgICAgICAgICAgIHBmRW50cnlOdW1lcmljYWxfcCAgPSBwb2ludGVyIHRvIEJPT0wgZm9yIHJldHVybnZhbHVlCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPiBUUlVFIGlmIGVudHJ5IGEgbnVtZXJpY2FsIHZhbHVlCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPiBGQUxTRSBpZiBlbnRyeSBub3QgYSBudW1lcmljYWwgdmFsdWUKKy8vCisvLyBSZXR1cm46ICAgICAgdEVwbEtlcm5lbCA9IEVycm9yY29kZQorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdGF0aWMgdEVwbEtlcm5lbCBFcGxPYmRJc051bWVyaWNhbEludGVybih0RXBsT2JkU3ViRW50cnlQdHIgcE9iZFN1YkVudHJ5X3AsCisJCQkJCSAgQk9PTCAqIHBmRW50cnlOdW1lcmljYWxfcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJLy8gZ2V0IFR5cGUKKwlpZiAoKHBPYmRTdWJFbnRyeV9wLT5tX1R5cGUgPT0ga0VwbE9iZFR5cFZTdHJpbmcpCisJICAgIHx8IChwT2JkU3ViRW50cnlfcC0+bV9UeXBlID09IGtFcGxPYmRUeXBPU3RyaW5nKQorCSAgICB8fCAocE9iZFN1YkVudHJ5X3AtPm1fVHlwZSA9PSBrRXBsT2JkVHlwRG9tYWluKSkgewkvLyBub3QgbnVtZXJpY2FsIHR5cGVzCisJCSpwZkVudHJ5TnVtZXJpY2FsX3AgPSBGQUxTRTsKKwl9IGVsc2UgewkJLy8gbnVtZXJpY2FsIHR5cGVzCisJCSpwZkVudHJ5TnVtZXJpY2FsX3AgPSBUUlVFOworCX0KKworCXJldHVybiBSZXQ7CisKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gZnVuY3Rpb24gdG8gY2xhc3NpZnkgb2JqZWN0IHR5cGUgKGZpeGVkL25vbiBmaXhlZCkKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRnVuY3Rpb246ICAgIEVwbE9iZENhbGxTdG9yZUNhbGxiYWNrKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogY2hlY2tzIGFkZHJlc3MgdG8gY2FsbGJhY2sgZnVuY3Rpb24gYW5kIGNhbGxlcyBpdCB3aGVuIHVuZXF1YWwKKy8vICAgICAgICAgICAgICB0byBOVUxMCisvLworLy8gUGFyYW1ldGVyczogIEVQTF9NQ09fREVDTF9JTlNUQU5DRV9QVFJfID0gKGluc3RhbmNlIHBvaW50ZXIpCisvLyAgICAgICAgICAgICAgcENiU3RvcmVQYXJhbV9wICAgICAgICA9IGFkZHJlc3MgdG8gY2FsbGJhY2sgcGFyYW1ldGVycworLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2lmIChFUExfT0JEX1VTRV9TVE9SRV9SRVNUT1JFICE9IEZBTFNFKQorc3RhdGljIHRFcGxLZXJuZWwgRXBsT2JkQ2FsbFN0b3JlQ2FsbGJhY2soRVBMX01DT19ERUNMX0lOU1RBTkNFX1BUUl8KKwkJCQkJICB0RXBsT2JkQ2JTdG9yZVBhcmFtIE1FTSAqCisJCQkJCSAgcENiU3RvcmVQYXJhbV9wKQoreworCisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCUFTU0VSVChwQ2JTdG9yZVBhcmFtX3AgIT0gTlVMTCk7CisKKwkvLyBjaGVjayBpZiBmdW5jdGlvbiBwb2ludGVyIGlzIE5VTEwgLSBpZiBzbywgbm8gY2FsbGJhY2sgc2hvdWxkIGJlIGNhbGxlZAorCWlmIChFUExfTUNPX0dMQl9WQVIobV9mcFN0b3JlTG9hZE9iakNhbGxiYWNrKSAhPSBOVUxMKSB7CisJCVJldCA9CisJCSAgICBFUExfTUNPX0dMQl9WQVIobV9mcFN0b3JlTG9hZE9iakNhbGxiYWNrKQorCQkgICAgKEVQTF9NQ09fSU5TVEFOQ0VfUEFSQU1fSURYXygpCisJCSAgICAgcENiU3RvcmVQYXJhbV9wKTsKKwl9CisKKwlyZXR1cm4gUmV0OworCit9CisjZW5kaWYgLy8gKEVQTF9PQkRfVVNFX1NUT1JFX1JFU1RPUkUgIT0gRkFMU0UpCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxPYmRHZXRPYmplY3REYXRhUHRySW50ZXJuKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogRnVuY3Rpb24gZ2V0cyB0aGUgZGF0YSBwb2ludGVyIG9mIGFuIG9iamVjdC4KKy8vICAgICAgICAgICAgICBJdCByZXR1cm5lcyB0aGUgY3VycmVudCBkYXRhIHBvaW50ZXIuIEJ1dCBpZiBvYmplY3QgaXMgYW4KKy8vICAgICAgICAgICAgICBjb25zdGFudCBvYmplY3QgaXQgcmV0dXJuZXMgdGhlIGRlZmF1bHQgcG9pbnRlci4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgcFN1YmluZGV4RW50cnlfcCA9IHBvaW50ZXIgdG8gc3ViaW5kZXggZW50cnkKKy8vCisvLyBSZXR1cm46ICAgICAgdm9pZCAqICAgID0gcG9pbnRlciB0byBvYmplY3QgZGF0YQorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQgKkVwbE9iZEdldE9iamVjdERhdGFQdHJJbnRlcm4odEVwbE9iZFN1YkVudHJ5UHRyIHBTdWJpbmRleEVudHJ5X3ApCit7CisKKwl2b2lkICpwRGF0YTsKKwl0RXBsT2JkQWNjZXNzIEFjY2VzczsKKworCUFTU0VSVE1TRyhwU3ViaW5kZXhFbnRyeV9wICE9IE5VTEwsCisJCSAgIkVwbE9iZEdldE9iamVjdERhdGFQdHJJbnRlcm4oKTogcG9pbnRlciB0byBTdWJFbnRyeSBub3QgdmFsaWQhXG4iKTsKKworCS8vIHRoZXJlIGFyZSBhcmUgc29tZSBvYmplY3RzIHdob3NlIGRhdGEgcG9pbnRlciBoYXMgdG8gZ2V0IGZyb20gb3RoZXIgc3RydWN0dXJlCisJLy8gZ2V0IGFjY2VzcyB0eXBlIGZvciB0aGlzIG9iamVjdAorCUFjY2VzcyA9IHBTdWJpbmRleEVudHJ5X3AtPm1fQWNjZXNzOworCisJLy8gSWYgb2JqZWN0IGhhcyBhY2Nlc3MgdHlwZSA9IGNvbnN0LAorCS8vIGZvciBkYXRhIG9ubHkgZXhpc3RzIGRlZmF1bHQgdmFsdWVzLgorCWlmICgoQWNjZXNzICYga0VwbE9iZEFjY0NvbnN0KSAhPSAwKSB7CisJCS8vIFRoZSBwb2ludGVyIHRvIGRlZnVhbHQgdmFsdWUgY2FuIGJlIHJlY2VpdmVkIGZyb20gT2JkR2V0T2JqZWN0RGVmYXVsdFB0cigpCisJCXBEYXRhID0gKCh2b2lkICopRXBsT2JkR2V0T2JqZWN0RGVmYXVsdFB0cihwU3ViaW5kZXhFbnRyeV9wKSk7CisJfSBlbHNlIHsKKwkJLy8gVGhlIHBvaW50ZXIgdG8gY3VycmVudCB2YWx1ZSBjYW4gYmUgcmVjZWl2ZWQgZnJvbSBPYmRHZXRPYmplY3RDdXJyZW50UHRyKCkKKwkJcERhdGEgPSAoKHZvaWQgKilFcGxPYmRHZXRPYmplY3RDdXJyZW50UHRyKHBTdWJpbmRleEVudHJ5X3ApKTsKKwl9CisKKwlyZXR1cm4gcERhdGE7CisKK30KKyNlbmRpZiAvLyBlbmQgb2YgI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9PQkRLKSkgIT0gMCkKKy8vIEVPRgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxPYmQuaCBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsT2JkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODhjYzExZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsT2JkLmgKQEAgLTAsMCArMSw0NjQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBpbmNsdWRlIGZpbGUgZm9yIGFwaSBmdW5jdGlvbiBvZiBFcGxPQkQtTW9kdWxlCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRXBsT2JkLmgsdiAkCisKKyAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAorCisgICAgICAgICAgICAgICAgJFJldmlzaW9uOiAxLjUgJCAgJERhdGU6IDIwMDgvMDQvMTcgMjE6MzY6MzIgJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgTWljcm9zb2Z0IFZDNworCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgIDIwMDYvMDYvMDIgay50LjogICBzdGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24sIHZlcnNpb24gMS4wMAorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiRXBsSW5jLmgiCisKKyNpZm5kZWYgX0VQTE9CRF9IXworI2RlZmluZSBfRVBMT0JEX0hfCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIGRlZmluZXMKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworI2RlZmluZSBFUExfT0JEX1RBQkxFX0lOREVYX0VORCAgICAgMHhGRkZGCisKKy8vIGZvciB0aGUgdXNhZ2Ugb2YgQk9PTEVBTiBpbiBPRAorI2RlZmluZSBPQkRfVFJVRSAgICAweDAxCisjZGVmaW5lIE9CRF9GQUxTRSAgIDB4MDAKKworLy8gZGVmYXVsdCBPRCBpbmRleCBmb3IgTm9kZSBpZAorI2RlZmluZSBFUExfT0JEX05PREVfSURfSU5ERVggICAgICAgICAgICAgICAweDFGOTMKKy8vIGRlZmF1bHQgc3ViaW5kZXggZm9yIE5vZGVJZCBpbiBPRAorI2RlZmluZSBFUExfT0JEX05PREVfSURfU1VCSU5ERVggICAgICAgICAgICAweDAxCisvLyBkZWZhdWx0IHN1YmluZGV4IGZvciBOb2RlSURCeUhXX0JPT0wKKyNkZWZpbmUgRVBMX09CRF9OT0RFX0lEX0hXQk9PTF9TVUJJTkRFWCAgICAgMHgwMgorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBlbnVtcworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisvLyBkaXJlY3Rpb25zIGZvciBhY2Nlc3MgdG8gb2JqZWN0IGRpY3Rpb25hcnkKK3R5cGVkZWYgZW51bSB7CisJa0VwbE9iZERpckluaXQgPSAweDAwLAkvLyBpbml0aWFsaXNpbmcgYWZ0ZXIgcG93ZXIgb24KKwlrRXBsT2JkRGlyU3RvcmUgPSAweDAxLAkvLyBzdG9yZSBhbGwgb2JqZWN0IHZhbHVlcyB0byBub24gdm9sYXRpbGUgbWVtb3J5CisJa0VwbE9iZERpckxvYWQgPSAweDAyLAkvLyBsb2FkIGFsbCBvYmplY3QgdmFsdWVzIGZyb20gbm9uIHZvbGF0aWxlIG1lbW9yeQorCWtFcGxPYmREaXJSZXN0b3JlID0gMHgwMywJLy8gZGVsZXRlcyBub24gdm9sYXRpbGUgbWVtb3J5IChyZXN0b3JlKQorCWtFcGxPYmREaXJPQktDaGVjayA9IDB4RkYJLy8gcmVzZXJ2ZWQKK30gdEVwbE9iZERpcjsKKworLy8gY29tbWFuZHMgZm9yIHN0b3JlCit0eXBlZGVmIGVudW0geworCWtFcGxPYmRDb21tTm90aGluZyA9IDB4MDAsCisJa0VwbE9iZENvbW1PcGVuV3JpdGUgPSAweDAxLAorCWtFcGxPYmRDb21tV3JpdGVPYmogPSAweDAyLAorCWtFcGxPYmRDb21tQ2xvc2VXcml0ZSA9IDB4MDMsCisJa0VwbE9iZENvbW1PcGVuUmVhZCA9IDB4MDQsCisJa0VwbE9iZENvbW1SZWFkT2JqID0gMHgwNSwKKwlrRXBsT2JkQ29tbUNsb3NlUmVhZCA9IDB4MDYsCisJa0VwbE9iZENvbW1DbGVhciA9IDB4MDcsCisJa0VwbE9iZENvbW1Vbmtub3duID0gMHhGRgorfSB0RXBsT2JkQ29tbWFuZDsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gZXZlbnRzIG9mIG9iamVjdCBjYWxsYmFjayBmdW5jdGlvbgordHlwZWRlZiBlbnVtIHsKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wQXJnIHBvaW50cyB0bworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJa0VwbE9iZEV2Q2hlY2tFeGlzdCA9IDB4MDYsCS8vIGNoZWNraW5nIGlmIG9iamVjdCBkb2VzIGV4aXN0IChyZWFkaW5nIGFuZCB3cml0aW5nKSAgICBOVUxMCisJa0VwbE9iZEV2UHJlUmVhZCA9IDB4MDAsCS8vIGJlZm9yZSByZWFkaW5nIGFuIG9iamVjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UgZGF0YSBidWZmZXIgaW4gT0QKKwlrRXBsT2JkRXZQb3N0UmVhZCA9IDB4MDEsCS8vIGFmdGVyIHJlYWRpbmcgYW4gb2JqZWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbiBkYXRhIGJ1ZmZlciBmcm9tIGNhbGxlcgorCWtFcGxPYmRFdldyU3RyaW5nRG9tYWluID0gMHgwNywJLy8gZXZlbnQgZm9yIGNoYW5naW5nIHN0cmluZy9kb21haW4gZGF0YSBwb2ludGVyIG9yIHNpemUgIHN0cnVjdCB0RXBsT2JkVlN0cmluZ0RvbWFpbiBpbiBSQU0KKwlrRXBsT2JkRXZJbml0V3JpdGUgPSAweDA0LAkvLyBpbml0aWFsaXplcyB3cml0aW5nIGFuIG9iamVjdCAoY2hlY2tpbmcgb2JqZWN0IHNpemUpICAgc2l6ZSBvZiBvYmplY3QgaW4gT0QgKHRFcGxPYmRTaXplKQorCWtFcGxPYmRFdlByZVdyaXRlID0gMHgwMiwJLy8gYmVmb3JlIHdyaXRpbmcgYW4gb2JqZWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZSBkYXRhIGJ1ZmZlciBmcm9tIGNhbGxlcgorCWtFcGxPYmRFdlBvc3RXcml0ZSA9IDB4MDMsCS8vIGFmdGVyIHdyaXRpbmcgYW4gb2JqZWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbiBkYXRhIGJ1ZmZlciBpbiBPRAorLy8gICAga0VwbE9iZEV2QWJvcnRTZG8gICAgICAgICAgICAgID0gMHgwNSAgICAgLy8gYWZ0ZXIgYW4gYWJvcnQgb2YgYW4gU0RPIHRyYW5zZmVyCisKK30gdEVwbE9iZEV2ZW50OworCisvLyBwYXJ0IG9mIE9EIChiaXQgb3JpZW50ZWQpCit0eXBlZGVmIHVuc2lnbmVkIGludCB0RXBsT2JkUGFydDsKKworI2RlZmluZSBrRXBsT2JkUGFydE5vICAgICAgICAgIDB4MDAJLy8gbm90aGluZworI2RlZmluZSBrRXBsT2JkUGFydEdlbiAgICAgICAgIDB4MDEJLy8gIHBhcnQgICAgICAoMHgxMDAwIC0gMHgxRkZGKQorI2RlZmluZSBrRXBsT2JkUGFydE1hbiAgICAgICAgIDB4MDIJLy8gbWFudWZhY3R1cmVyIHBhcnQgKDB4MjAwMCAtIDB4NUZGRikKKyNkZWZpbmUga0VwbE9iZFBhcnREZXYgICAgICAgICAweDA0CS8vIGRldmljZSBwYXJ0ICAgICAgICgweDYwMDAgLSAweDlGRkYpCisjZGVmaW5lIGtFcGxPYmRQYXJ0VXNyICAgICAgICAgMHgwOAkvLyBkeW5hbWljIHBhcnQgZS5nLiBmb3IgSUNFNjExMzEtMworCisvLyBjb21iaW5hdGlvbnMKKyNkZWZpbmUga0VwbE9iZFBhcnRBcHAgICAgICAgICAoICAgICAgICAgICAgICBrRXBsT2JkUGFydE1hbiB8IGtFcGxPYmRQYXJ0RGV2IHwga0VwbE9iZFBhcnRVc3IpCS8vIG1hbnVmYWN0dXJlciBhbmQgZGV2aWNlIHBhcnQgKDB4MjAwMCAtIDB4OUZGRikgYW5kIHVzZXIgT0QKKyNkZWZpbmUga0VwbE9iZFBhcnRBbGwgICAgICAgICAoa0VwbE9iZFBhcnRHZW4gfCBrRXBsT2JkUGFydE1hbiB8IGtFcGxPYmRQYXJ0RGV2IHwga0VwbE9iZFBhcnRVc3IpCS8vIHdob2xlIE9ECisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGFjY2VzcyB0eXBlcyBmb3Igb2JqZWN0cworLy8gbXVzdCBiZSBhIGRpZmluZSBiZWNhdXNlIGJpdC1mbGFncwordHlwZWRlZiB1bnNpZ25lZCBpbnQgdEVwbE9iZEFjY2VzczsKKworI2RlZmluZSBrRXBsT2JkQWNjUmVhZCAgICAgICAgIDB4MDEJLy8gb2JqZWN0IGNhbiBiZSByZWFkCisjZGVmaW5lIGtFcGxPYmRBY2NXcml0ZSAgICAgICAgMHgwMgkvLyBvYmplY3QgY2FuIGJlIHdyaXR0ZW4KKyNkZWZpbmUga0VwbE9iZEFjY0NvbnN0ICAgICAgICAweDA0CS8vIG9iamVjdCBjb250YWlucyBhIGNvbnN0YW50IHZhbHVlCisjZGVmaW5lIGtFcGxPYmRBY2NQZG8gICAgICAgICAgMHgwOAkvLyBvYmplY3QgY2FuIGJlIG1hcHBlZCBpbiBhIFBETworI2RlZmluZSBrRXBsT2JkQWNjQXJyYXkgICAgICAgIDB4MTAJLy8gb2JqZWN0IGNvbnRhaW5zIGFuIGFycmF5IG9mIG51bWVyaWNhbCB2YWx1ZXMKKyNkZWZpbmUga0VwbE9iZEFjY1JhbmdlICAgICAgICAweDIwCS8vIG9iamVjdCBjb250YWlucyBsb3dlciBhbmQgdXBwZXIgbGltaXQKKyNkZWZpbmUga0VwbE9iZEFjY1ZhciAgICAgICAgICAweDQwCS8vIG9iamVjdCBkYXRhIGlzIHBsYWNlZCBpbiBhcHBsaWNhdGlvbgorI2RlZmluZSBrRXBsT2JkQWNjU3RvcmUgICAgICAgIDB4ODAJLy8gb2JqZWN0IGRhdGEgY2FuIGJlIHN0b3JlZCB0byBub24gdm9sYXRpbGUgbWVtb3J5CisKKy8vIGNvbWJpbmF0aW9ucyAobm90IGFsbCBjb21iaW5hdGlvbnMgYXJlIHJlcXVpcmVkKQorI2RlZmluZSBrRXBsT2JkQWNjUiAgICAgICAgICAgICgwICAgICAgICAgICAgfCAwICAgICAgICAgIHwgMCAgICAgICAgICAgIHwgMCAgICAgICAgICB8IDAgICAgICAgICAgICB8IDAgICAgICAgICAgICB8IGtFcGxPYmRBY2NSZWFkKQorI2RlZmluZSBrRXBsT2JkQWNjVyAgICAgICAgICAgICgwICAgICAgICAgICAgfCAwICAgICAgICAgIHwgMCAgICAgICAgICAgIHwgMCAgICAgICAgICB8IDAgICAgICAgICAgICB8IGtFcGxPYmRBY2NXcml0ZSB8IDAgICAgICAgICAgKQorI2RlZmluZSBrRXBsT2JkQWNjUlcgICAgICAgICAgICgwICAgICAgICAgICAgfCAwICAgICAgICAgIHwgMCAgICAgICAgICAgIHwgMCAgICAgICAgICB8IDAgICAgICAgICAgICB8IGtFcGxPYmRBY2NXcml0ZSB8IGtFcGxPYmRBY2NSZWFkKQorI2RlZmluZSBrRXBsT2JkQWNjQ1IgICAgICAgICAgICgwICAgICAgICAgICAgfCAwICAgICAgICAgIHwgMCAgICAgICAgICAgIHwgMCAgICAgICAgICB8IGtFcGxPYmRBY2NDb25zdCB8IDAgICAgICAgICAgICB8IGtFcGxPYmRBY2NSZWFkKQorI2RlZmluZSBrRXBsT2JkQWNjR1IgICAgICAgICAgICgwICAgICAgICAgICAgfCAwICAgICAgICAgIHwga0VwbE9iZEFjY1JhbmdlIHwgMCAgICAgICAgICB8IDAgICAgICAgICAgICB8IDAgICAgICAgICAgICB8IGtFcGxPYmRBY2NSZWFkKQorI2RlZmluZSBrRXBsT2JkQWNjR1cgICAgICAgICAgICgwICAgICAgICAgICAgfCAwICAgICAgICAgIHwga0VwbE9iZEFjY1JhbmdlIHwgMCAgICAgICAgICB8IDAgICAgICAgICAgICB8IGtFcGxPYmRBY2NXcml0ZSB8IDAgICAgICAgICAgKQorI2RlZmluZSBrRXBsT2JkQWNjR1JXICAgICAgICAgICgwICAgICAgICAgICAgfCAwICAgICAgICAgIHwga0VwbE9iZEFjY1JhbmdlIHwgMCAgICAgICAgICB8IDAgICAgICAgICAgICB8IGtFcGxPYmRBY2NXcml0ZSB8IGtFcGxPYmRBY2NSZWFkKQorI2RlZmluZSBrRXBsT2JkQWNjVlIgICAgICAgICAgICgwICAgICAgICAgICAgfCBrRXBsT2JkQWNjVmFyIHwgMCAgICAgICAgICAgIHwgMCAgICAgICAgICB8IDAgICAgICAgICAgICB8IDAgICAgICAgICAgICB8IGtFcGxPYmRBY2NSZWFkKQorI2RlZmluZSBrRXBsT2JkQWNjVlcgICAgICAgICAgICgwICAgICAgICAgICAgfCBrRXBsT2JkQWNjVmFyIHwgMCAgICAgICAgICAgIHwgMCAgICAgICAgICB8IDAgICAgICAgICAgICB8IGtFcGxPYmRBY2NXcml0ZSB8IDAgICAgICAgICAgKQorI2RlZmluZSBrRXBsT2JkQWNjVlJXICAgICAgICAgICgwICAgICAgICAgICAgfCBrRXBsT2JkQWNjVmFyIHwgMCAgICAgICAgICAgIHwgMCAgICAgICAgICB8IDAgICAgICAgICAgICB8IGtFcGxPYmRBY2NXcml0ZSB8IGtFcGxPYmRBY2NSZWFkKQorI2RlZmluZSBrRXBsT2JkQWNjVlBSICAgICAgICAgICgwICAgICAgICAgICAgfCBrRXBsT2JkQWNjVmFyIHwgMCAgICAgICAgICAgIHwga0VwbE9iZEFjY1BkbyB8IDAgICAgICAgICAgICB8IDAgICAgICAgICAgICB8IGtFcGxPYmRBY2NSZWFkKQorI2RlZmluZSBrRXBsT2JkQWNjVlBXICAgICAgICAgICgwICAgICAgICAgICAgfCBrRXBsT2JkQWNjVmFyIHwgMCAgICAgICAgICAgIHwga0VwbE9iZEFjY1BkbyB8IDAgICAgICAgICAgICB8IGtFcGxPYmRBY2NXcml0ZSB8IDAgICAgICAgICAgKQorI2RlZmluZSBrRXBsT2JkQWNjVlBSVyAgICAgICAgICgwICAgICAgICAgICAgfCBrRXBsT2JkQWNjVmFyIHwgMCAgICAgICAgICAgIHwga0VwbE9iZEFjY1BkbyB8IDAgICAgICAgICAgICB8IGtFcGxPYmRBY2NXcml0ZSB8IGtFcGxPYmRBY2NSZWFkKQorI2RlZmluZSBrRXBsT2JkQWNjVkdSICAgICAgICAgICgwICAgICAgICAgICAgfCBrRXBsT2JkQWNjVmFyIHwga0VwbE9iZEFjY1JhbmdlIHwgMCAgICAgICAgICB8IDAgICAgICAgICAgICB8IDAgICAgICAgICAgICB8IGtFcGxPYmRBY2NSZWFkKQorI2RlZmluZSBrRXBsT2JkQWNjVkdXICAgICAgICAgICgwICAgICAgICAgICAgfCBrRXBsT2JkQWNjVmFyIHwga0VwbE9iZEFjY1JhbmdlIHwgMCAgICAgICAgICB8IDAgICAgICAgICAgICB8IGtFcGxPYmRBY2NXcml0ZSB8IDAgICAgICAgICAgKQorI2RlZmluZSBrRXBsT2JkQWNjVkdSVyAgICAgICAgICgwICAgICAgICAgICAgfCBrRXBsT2JkQWNjVmFyIHwga0VwbE9iZEFjY1JhbmdlIHwgMCAgICAgICAgICB8IDAgICAgICAgICAgICB8IGtFcGxPYmRBY2NXcml0ZSB8IGtFcGxPYmRBY2NSZWFkKQorI2RlZmluZSBrRXBsT2JkQWNjVkdQUiAgICAgICAgICgwICAgICAgICAgICAgfCBrRXBsT2JkQWNjVmFyIHwga0VwbE9iZEFjY1JhbmdlIHwga0VwbE9iZEFjY1BkbyB8IDAgICAgICAgICAgICB8IDAgICAgICAgICAgICB8IGtFcGxPYmRBY2NSZWFkKQorI2RlZmluZSBrRXBsT2JkQWNjVkdQVyAgICAgICAgICgwICAgICAgICAgICAgfCBrRXBsT2JkQWNjVmFyIHwga0VwbE9iZEFjY1JhbmdlIHwga0VwbE9iZEFjY1BkbyB8IDAgICAgICAgICAgICB8IGtFcGxPYmRBY2NXcml0ZSB8IDAgICAgICAgICAgKQorI2RlZmluZSBrRXBsT2JkQWNjVkdQUlcgICAgICAgICgwICAgICAgICAgICAgfCBrRXBsT2JkQWNjVmFyIHwga0VwbE9iZEFjY1JhbmdlIHwga0VwbE9iZEFjY1BkbyB8IDAgICAgICAgICAgICB8IGtFcGxPYmRBY2NXcml0ZSB8IGtFcGxPYmRBY2NSZWFkKQorI2RlZmluZSBrRXBsT2JkQWNjU1IgICAgICAgICAgIChrRXBsT2JkQWNjU3RvcmUgfCAwICAgICAgICAgIHwgMCAgICAgICAgICAgIHwgMCAgICAgICAgICB8IDAgICAgICAgICAgICB8IDAgICAgICAgICAgICB8IGtFcGxPYmRBY2NSZWFkKQorI2RlZmluZSBrRXBsT2JkQWNjU1cgICAgICAgICAgIChrRXBsT2JkQWNjU3RvcmUgfCAwICAgICAgICAgIHwgMCAgICAgICAgICAgIHwgMCAgICAgICAgICB8IDAgICAgICAgICAgICB8IGtFcGxPYmRBY2NXcml0ZSB8IDAgICAgICAgICAgKQorI2RlZmluZSBrRXBsT2JkQWNjU1JXICAgICAgICAgIChrRXBsT2JkQWNjU3RvcmUgfCAwICAgICAgICAgIHwgMCAgICAgICAgICAgIHwgMCAgICAgICAgICB8IDAgICAgICAgICAgICB8IGtFcGxPYmRBY2NXcml0ZSB8IGtFcGxPYmRBY2NSZWFkKQorI2RlZmluZSBrRXBsT2JkQWNjU0NSICAgICAgICAgIChrRXBsT2JkQWNjU3RvcmUgfCAwICAgICAgICAgIHwgMCAgICAgICAgICAgIHwgMCAgICAgICAgICB8IGtFcGxPYmRBY2NDb25zdCB8IDAgICAgICAgICAgICB8IGtFcGxPYmRBY2NSZWFkKQorI2RlZmluZSBrRXBsT2JkQWNjU0dSICAgICAgICAgIChrRXBsT2JkQWNjU3RvcmUgfCAwICAgICAgICAgIHwga0VwbE9iZEFjY1JhbmdlIHwgMCAgICAgICAgICB8IDAgICAgICAgICAgICB8IDAgICAgICAgICAgICB8IGtFcGxPYmRBY2NSZWFkKQorI2RlZmluZSBrRXBsT2JkQWNjU0dXICAgICAgICAgIChrRXBsT2JkQWNjU3RvcmUgfCAwICAgICAgICAgIHwga0VwbE9iZEFjY1JhbmdlIHwgMCAgICAgICAgICB8IDAgICAgICAgICAgICB8IGtFcGxPYmRBY2NXcml0ZSB8IDAgICAgICAgICAgKQorI2RlZmluZSBrRXBsT2JkQWNjU0dSVyAgICAgICAgIChrRXBsT2JkQWNjU3RvcmUgfCAwICAgICAgICAgIHwga0VwbE9iZEFjY1JhbmdlIHwgMCAgICAgICAgICB8IDAgICAgICAgICAgICB8IGtFcGxPYmRBY2NXcml0ZSB8IGtFcGxPYmRBY2NSZWFkKQorI2RlZmluZSBrRXBsT2JkQWNjU1ZSICAgICAgICAgIChrRXBsT2JkQWNjU3RvcmUgfCBrRXBsT2JkQWNjVmFyIHwgMCAgICAgICAgICAgIHwgMCAgICAgICAgICB8IDAgICAgICAgICAgICB8IDAgICAgICAgICAgICB8IGtFcGxPYmRBY2NSZWFkKQorI2RlZmluZSBrRXBsT2JkQWNjU1ZXICAgICAgICAgIChrRXBsT2JkQWNjU3RvcmUgfCBrRXBsT2JkQWNjVmFyIHwgMCAgICAgICAgICAgIHwgMCAgICAgICAgICB8IDAgICAgICAgICAgICB8IGtFcGxPYmRBY2NXcml0ZSB8IDAgICAgICAgICAgKQorI2RlZmluZSBrRXBsT2JkQWNjU1ZSVyAgICAgICAgIChrRXBsT2JkQWNjU3RvcmUgfCBrRXBsT2JkQWNjVmFyIHwgMCAgICAgICAgICAgIHwgMCAgICAgICAgICB8IDAgICAgICAgICAgICB8IGtFcGxPYmRBY2NXcml0ZSB8IGtFcGxPYmRBY2NSZWFkKQorI2RlZmluZSBrRXBsT2JkQWNjU1ZQUiAgICAgICAgIChrRXBsT2JkQWNjU3RvcmUgfCBrRXBsT2JkQWNjVmFyIHwgMCAgICAgICAgICAgIHwga0VwbE9iZEFjY1BkbyB8IDAgICAgICAgICAgICB8IDAgICAgICAgICAgICB8IGtFcGxPYmRBY2NSZWFkKQorI2RlZmluZSBrRXBsT2JkQWNjU1ZQVyAgICAgICAgIChrRXBsT2JkQWNjU3RvcmUgfCBrRXBsT2JkQWNjVmFyIHwgMCAgICAgICAgICAgIHwga0VwbE9iZEFjY1BkbyB8IDAgICAgICAgICAgICB8IGtFcGxPYmRBY2NXcml0ZSB8IDAgICAgICAgICAgKQorI2RlZmluZSBrRXBsT2JkQWNjU1ZQUlcgICAgICAgIChrRXBsT2JkQWNjU3RvcmUgfCBrRXBsT2JkQWNjVmFyIHwgMCAgICAgICAgICAgIHwga0VwbE9iZEFjY1BkbyB8IDAgICAgICAgICAgICB8IGtFcGxPYmRBY2NXcml0ZSB8IGtFcGxPYmRBY2NSZWFkKQorI2RlZmluZSBrRXBsT2JkQWNjU1ZHUiAgICAgICAgIChrRXBsT2JkQWNjU3RvcmUgfCBrRXBsT2JkQWNjVmFyIHwga0VwbE9iZEFjY1JhbmdlIHwgMCAgICAgICAgICB8IDAgICAgICAgICAgICB8IDAgICAgICAgICAgICB8IGtFcGxPYmRBY2NSZWFkKQorI2RlZmluZSBrRXBsT2JkQWNjU1ZHVyAgICAgICAgIChrRXBsT2JkQWNjU3RvcmUgfCBrRXBsT2JkQWNjVmFyIHwga0VwbE9iZEFjY1JhbmdlIHwgMCAgICAgICAgICB8IDAgICAgICAgICAgICB8IGtFcGxPYmRBY2NXcml0ZSB8IDAgICAgICAgICAgKQorI2RlZmluZSBrRXBsT2JkQWNjU1ZHUlcgICAgICAgIChrRXBsT2JkQWNjU3RvcmUgfCBrRXBsT2JkQWNjVmFyIHwga0VwbE9iZEFjY1JhbmdlIHwgMCAgICAgICAgICB8IDAgICAgICAgICAgICB8IGtFcGxPYmRBY2NXcml0ZSB8IGtFcGxPYmRBY2NSZWFkKQorI2RlZmluZSBrRXBsT2JkQWNjU1ZHUFIgICAgICAgIChrRXBsT2JkQWNjU3RvcmUgfCBrRXBsT2JkQWNjVmFyIHwga0VwbE9iZEFjY1JhbmdlIHwga0VwbE9iZEFjY1BkbyB8IDAgICAgICAgICAgICB8IDAgICAgICAgICAgICB8IGtFcGxPYmRBY2NSZWFkKQorI2RlZmluZSBrRXBsT2JkQWNjU1ZHUFcgICAgICAgIChrRXBsT2JkQWNjU3RvcmUgfCBrRXBsT2JkQWNjVmFyIHwga0VwbE9iZEFjY1JhbmdlIHwga0VwbE9iZEFjY1BkbyB8IDAgICAgICAgICAgICB8IGtFcGxPYmRBY2NXcml0ZSB8IDAgICAgICAgICAgKQorI2RlZmluZSBrRXBsT2JkQWNjU1ZHUFJXICAgICAgIChrRXBsT2JkQWNjU3RvcmUgfCBrRXBsT2JkQWNjVmFyIHwga0VwbE9iZEFjY1JhbmdlIHwga0VwbE9iZEFjY1BkbyB8IDAgICAgICAgICAgICB8IGtFcGxPYmRBY2NXcml0ZSB8IGtFcGxPYmRBY2NSZWFkKQorCit0eXBlZGVmIHVuc2lnbmVkIGludCB0RXBsT2JkU2l6ZTsJLy8gRm9yIGFsbCBvYmplY3RzIGFzIG9iamVjdHMgc2l6ZSBhcmUgdXNlZCBhbiB1bnNpZ25lZCBpbnQuCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHR5cGVzIGZvciBkYXRhIHR5cGVzIGRlZmluZWQgaW4gRFMzMDEKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gdHlwZXMgb2Ygb2JqZWN0cyBpbiBvYmplY3QgZGljdGlvbmFyeQorLy8gRFMtMzAxIGRlZmluZXMgdGhlc2UgdHlwZXMgYXMgV09SRAordHlwZWRlZiBlbnVtIHsKKy8vIHR5cGVzIHdoaWNoIGFyZSBhbHdheXMgc3VwcG9ydGVkCisJa0VwbE9iZFR5cEJvb2wgPSAweDAwMDEsCisKKwlrRXBsT2JkVHlwSW50OCA9IDB4MDAwMiwKKwlrRXBsT2JkVHlwSW50MTYgPSAweDAwMDMsCisJa0VwbE9iZFR5cEludDMyID0gMHgwMDA0LAorCWtFcGxPYmRUeXBVSW50OCA9IDB4MDAwNSwKKwlrRXBsT2JkVHlwVUludDE2ID0gMHgwMDA2LAorCWtFcGxPYmRUeXBVSW50MzIgPSAweDAwMDcsCisJa0VwbE9iZFR5cFJlYWwzMiA9IDB4MDAwOCwKKwlrRXBsT2JkVHlwVlN0cmluZyA9IDB4MDAwOSwKKwlrRXBsT2JkVHlwT1N0cmluZyA9IDB4MDAwQSwKKwlrRXBsT2JkVHlwRG9tYWluID0gMHgwMDBGLAorCisJa0VwbE9iZFR5cEludDI0ID0gMHgwMDEwLAorCWtFcGxPYmRUeXBVSW50MjQgPSAweDAwMTYsCisKKwlrRXBsT2JkVHlwUmVhbDY0ID0gMHgwMDExLAorCWtFcGxPYmRUeXBJbnQ0MCA9IDB4MDAxMiwKKwlrRXBsT2JkVHlwSW50NDggPSAweDAwMTMsCisJa0VwbE9iZFR5cEludDU2ID0gMHgwMDE0LAorCWtFcGxPYmRUeXBJbnQ2NCA9IDB4MDAxNSwKKwlrRXBsT2JkVHlwVUludDQwID0gMHgwMDE4LAorCWtFcGxPYmRUeXBVSW50NDggPSAweDAwMTksCisJa0VwbE9iZFR5cFVJbnQ1NiA9IDB4MDAxQSwKKwlrRXBsT2JkVHlwVUludDY0ID0gMHgwMDFCLAorCWtFcGxPYmRUeXBUaW1lT2ZEYXkgPSAweDAwMEMsCisJa0VwbE9iZFR5cFRpbWVEaWZmID0gMHgwMDBECit9IHRFcGxPYmRUeXBlOworLy8gb3RoZXIgdHlwZXMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyB2ZXJzaW9uCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHR5cGVzIGZvciBkYXRhIHR5cGVzIGRlZmluZWQgaW4gRFMzMDEKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIHRFcGxPYmRCb29sZWFuOwkvLyAwMDAxCit0eXBlZGVmIHNpZ25lZCBjaGFyIHRFcGxPYmRJbnRlZ2VyODsJLy8gMDAwMgordHlwZWRlZiBzaWduZWQgc2hvcnQgaW50IHRFcGxPYmRJbnRlZ2VyMTY7CS8vIDAwMDMKK3R5cGVkZWYgc2lnbmVkIGxvbmcgdEVwbE9iZEludGVnZXIzMjsJLy8gMDAwNAordHlwZWRlZiB1bnNpZ25lZCBjaGFyIHRFcGxPYmRVbnNpZ25lZDg7CS8vIDAwMDUKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgaW50IHRFcGxPYmRVbnNpZ25lZDE2OwkvLyAwMDA2Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgdEVwbE9iZFVuc2lnbmVkMzI7CS8vIDAwMDcKK3R5cGVkZWYgZmxvYXQgdEVwbE9iZFJlYWwzMjsJLy8gMDAwOAordHlwZWRlZiB1bnNpZ25lZCBjaGFyIHRFcGxPYmREb21haW47CS8vIDAwMEYKK3R5cGVkZWYgc2lnbmVkIGxvbmcgdEVwbE9iZEludGVnZXIyNDsJLy8gMDAxMAordHlwZWRlZiB1bnNpZ25lZCBsb25nIHRFcGxPYmRVbnNpZ25lZDI0OwkvLyAwMDE2CisKK3R5cGVkZWYgc2lnbmVkIFFXT1JEIHRFcGxPYmRJbnRlZ2VyNDA7CS8vIDAwMTIKK3R5cGVkZWYgc2lnbmVkIFFXT1JEIHRFcGxPYmRJbnRlZ2VyNDg7CS8vIDAwMTMKK3R5cGVkZWYgc2lnbmVkIFFXT1JEIHRFcGxPYmRJbnRlZ2VyNTY7CS8vIDAwMTQKK3R5cGVkZWYgc2lnbmVkIFFXT1JEIHRFcGxPYmRJbnRlZ2VyNjQ7CS8vIDAwMTUKKwordHlwZWRlZiB1bnNpZ25lZCBRV09SRCB0RXBsT2JkVW5zaWduZWQ0MDsJLy8gMDAxOAordHlwZWRlZiB1bnNpZ25lZCBRV09SRCB0RXBsT2JkVW5zaWduZWQ0ODsJLy8gMDAxOQordHlwZWRlZiB1bnNpZ25lZCBRV09SRCB0RXBsT2JkVW5zaWduZWQ1NjsJLy8gMDAxQQordHlwZWRlZiB1bnNpZ25lZCBRV09SRCB0RXBsT2JkVW5zaWduZWQ2NDsJLy8gMDAxQgorCit0eXBlZGVmIGRvdWJsZSB0RXBsT2JkUmVhbDY0OwkvLyAwMDExCisKK3R5cGVkZWYgdFRpbWVPZkRheSB0RXBsT2JkVGltZU9mRGF5OwkvLyAwMDBDCit0eXBlZGVmIHRUaW1lT2ZEYXkgdEVwbE9iZFRpbWVEaWZmZXJlbmNlOwkvLyAwMDBECisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHN0cnVjdHVyIGZvciBkZWZpbmluZyBhIHZhcmlhYmxlCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0eXBlZGVmIGVudW0geworCWtWYXJWYWxpZFNpemUgPSAweDAxLAorCWtWYXJWYWxpZERhdGEgPSAweDAyLAorLy8gICAga1ZhclZhbGlkQ2FsbGJhY2sgICAgICAgPSAweDA0LAorLy8gICAga1ZhclZhbGlkQXJnICAgICAgICAgICAgPSAweDA4LAorCisJa1ZhclZhbGlkQWxsID0gMHgwMwkvLyBjdXJyZW50bHkgb25seSBzaXplIGFuZCBkYXRhIGFyZSBpbXBsZW1lbnRlZCBhbmQgdXNlZAorfSB0RXBsVmFyUGFyYW1WYWxpZDsKKwordHlwZWRlZiB0RXBsS2VybmVsKFBVQkxJQyBST00gKiB0RXBsVmFyQ2FsbGJhY2spIChDQ01fREVDTF9JTlNUQU5DRV9IRExfCisJCQkJCQkgIHZvaWQgKnBQYXJhbV9wKTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXRFcGxWYXJQYXJhbVZhbGlkIG1fVmFsaWRGbGFnOworCXVuc2lnbmVkIGludCBtX3VpSW5kZXg7CisJdW5zaWduZWQgaW50IG1fdWlTdWJpbmRleDsKKwl0RXBsT2JkU2l6ZSBtX1NpemU7CisJdm9pZCBNRU0gKm1fcERhdGE7CisvLyAgICB0RXBsVmFyQ2FsbGJhY2sgICAgIG1fZnBDYWxsYmFjazsKKy8vICAgIHZvaWQgKiAgICAgICBtX3BBcmc7CisKK30gdEVwbFZhclBhcmFtOworCit0eXBlZGVmIHN0cnVjdCB7CisJdm9pZCBNRU0gKm1fcERhdGE7CisJdEVwbE9iZFNpemUgbV9TaXplOworLyoKKyAgICAjaWYgKEVQTF9QRE9fVVNFX1NUQVRJQ19NQVBQSU5HID09IEZBTFNFKQorICAgICAgICB0RXBsVmFyQ2FsbGJhY2sgICAgbV9mcENhbGxiYWNrOworICAgICAgICB2b2lkICogICBtX3BBcmc7CisgICAgI2VuZGlmCisqLworfSB0RXBsT2JkVmFyRW50cnk7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl0RXBsT2JkU2l6ZSBtX1NpemU7CisJQllURSAqbV9wU3RyaW5nOworCit9IHRFcGxPYmRPU3RyaW5nOwkJLy8gMDAwQworCit0eXBlZGVmIHN0cnVjdCB7CisJdEVwbE9iZFNpemUgbV9TaXplOworCWNoYXIgKm1fcFN0cmluZzsKK30gdEVwbE9iZFZTdHJpbmc7CQkvLyAwMDBECisKK3R5cGVkZWYgc3RydWN0IHsKKwl0RXBsT2JkU2l6ZSBtX1NpemU7CisJY2hhciAqbV9wRGVmU3RyaW5nOwkvLyAkJCQgZC5rLiBpdCBpcyB1bnVzZWQsIHNvIHdlIGNvdWxkIGRlbGV0ZSBpdAorCWNoYXIgKm1fcFN0cmluZzsKKworfSB0RXBsT2JkVlN0cmluZ0RlZjsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXRFcGxPYmRTaXplIG1fU2l6ZTsKKwlCWVRFICptX3BEZWZTdHJpbmc7CS8vICQkJCBkLmsuIGl0IGlzIHVudXNlZCwgc28gd2UgY291bGQgZGVsZXRlIGl0CisJQllURSAqbV9wU3RyaW5nOworCit9IHRFcGxPYmRPU3RyaW5nRGVmOworCisvL3IuZC4gcGFyYW1ldGVyIHN0cnVjdCBmb3IgY2hhbmdpbmcgb2JqZWN0IHNpemUgYW5kL29yIHBvaW50ZXIgdG8gZGF0YSBvZiBTdHJpbmdzIG9yIERvbWFpbnMKK3R5cGVkZWYgc3RydWN0IHsKKwl0RXBsT2JkU2l6ZSBtX0Rvd25sb2FkU2l6ZTsJLy8gZG93bmxvYWQgc2l6ZSBmcm9tIFNETyBvciBBUFAKKwl0RXBsT2JkU2l6ZSBtX09ialNpemU7CS8vIGN1cnJlbnQgb2JqZWN0IHNpemUgZnJvbSBPRCAtIHNob3VsZCBiZSBjaGFuZ2VkIGZyb20gY2FsbGJhY2sgZnVuY3Rpb24KKwl2b2lkICptX3BEYXRhOwkJLy8gY3VycmVudCBvYmplY3QgcHRyICBmcm9tIE9EIC0gc2hvdWxkIGJlIGNoYW5nZWQgZnJvbSBjYWxsYmFjayBmdW5jdGlvbgorCit9IHRFcGxPYmRWU3RyaW5nRG9tYWluOwkJLy8gMDAwRAorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyB0eXBlcworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gc3ViaW5kZXhzdHJ1Y3QKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gQ2hhbmdlIG5vdCB0aGUgb3JkZXIgZm9yIHRoaXMgc3RydWN0ISEhCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgaW50IG1fdWlTdWJJbmRleDsKKwl0RXBsT2JkVHlwZSBtX1R5cGU7CisJdEVwbE9iZEFjY2VzcyBtX0FjY2VzczsKKwl2b2lkICptX3BEZWZhdWx0OworCXZvaWQgTUVNICptX3BDdXJyZW50OwkvLyBwb2ludHMgYWx3YXlzIHRvIFJBTQorCit9IHRFcGxPYmRTdWJFbnRyeTsKKworLy8gci5kLjogaGFzIGFsd2F5cyB0byBiZSAgYmVjYXVzZSBuZXcgT0JELU1hY3JvcyBmb3IgYXJyYXlzCit0eXBlZGVmIHRFcGxPYmRTdWJFbnRyeSAqdEVwbE9iZFN1YkVudHJ5UHRyOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjYWxsYmFjayBmdW5jdGlvbiBmb3Igb2JqZGljdGlvbmFyeSBtb2R1bAorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBwYXJhbWV0ZXJzIGZvciBjYWxsYmFjayBmdW5jdGlvbgordHlwZWRlZiBzdHJ1Y3QgeworCXRFcGxPYmRFdmVudCBtX09iZEV2ZW50OworCXVuc2lnbmVkIGludCBtX3VpSW5kZXg7CisJdW5zaWduZWQgaW50IG1fdWlTdWJJbmRleDsKKwl2b2lkICptX3BBcmc7CisJRFdPUkQgbV9kd0Fib3J0Q29kZTsKKworfSB0RXBsT2JkQ2JQYXJhbTsKKworLy8gZGVmaW5lIHR5cGUgZm9yIGNhbGxiYWNrIGZ1bmN0aW9uOiBwUGFyYW1fcCBwb2ludHMgdG8gdEVwbE9iZENiUGFyYW0KK3R5cGVkZWYgdEVwbEtlcm5lbChQVUJMSUMgUk9NICogdEVwbE9iZENhbGxiYWNrKSAoQ0NNX0RFQ0xfSU5TVEFOQ0VfSERMXworCQkJCQkJICB0RXBsT2JkQ2JQYXJhbSBNRU0gKgorCQkJCQkJICBwUGFyYW1fcCk7CisKKy8vIGRvIG5vdCBjaGFuZ2UgdGhlIG9yZGVyIGZvciB0aGlzIHN0cnVjdCEhIQorCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgaW50IG1fdWlJbmRleDsKKwl0RXBsT2JkU3ViRW50cnlQdHIgbV9wU3ViSW5kZXg7CisJdW5zaWduZWQgaW50IG1fdWlDb3VudDsKKwl0RXBsT2JkQ2FsbGJhY2sgbV9mcENhbGxiYWNrOwkvLyBmdW5jdGlvbiBpcyBjYWxsZWQgYmFjayBpZiBvYmplY3QgYWNjZXNzCisKK30gdEVwbE9iZEVudHJ5OworCisvLyBhbGx3YXlzICBwb2ludGVyCit0eXBlZGVmIHRFcGxPYmRFbnRyeSAqdEVwbE9iZEVudHJ5UHRyOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBzdHJ1Y3R1ciB0byBpbml0aWFsaXplIE9CRCBtb2R1bGUKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordHlwZWRlZiBzdHJ1Y3QgeworCXRFcGxPYmRFbnRyeVB0ciBtX3BQYXJ0OworCXRFcGxPYmRFbnRyeVB0ciBtX3BNYW51ZmFjdHVyZXJQYXJ0OworCXRFcGxPYmRFbnRyeVB0ciBtX3BEZXZpY2VQYXJ0OworCisjaWYgKGRlZmluZWQgKEVQTF9PQkRfVVNFUl9PRCkgJiYgKEVQTF9PQkRfVVNFUl9PRCAhPSBGQUxTRSkpCisKKwl0RXBsT2JkRW50cnlQdHIgbV9wVXNlclBhcnQ7CisKKyNlbmRpZgorCit9IHRFcGxPYmRJbml0UGFyYW07CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHN0cnVjdHVyIGZvciBwYXJhbWV0ZXJzIG9mIFNUT1JFIFJFU1RPUkUgY29tbWFuZAorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0eXBlZGVmIHN0cnVjdCB7CisJdEVwbE9iZENvbW1hbmQgbV9iQ29tbWFuZDsKKwl0RXBsT2JkUGFydCBtX2JDdXJyZW50T2RQYXJ0OworCXZvaWQgTUVNICptX3BEYXRhOworCXRFcGxPYmRTaXplIG1fT2JqU2l6ZTsKKworfSB0RXBsT2JkQ2JTdG9yZVBhcmFtOworCit0eXBlZGVmIHRFcGxLZXJuZWwoUFVCTElDIFJPTSAqIHRJbml0VGFiRW50cnlDYWxsYmFjaykgKHZvaWQgTUVNICogcFRhYkVudHJ5X3AsCisJCQkJCQkJdW5zaWduZWQgaW50CisJCQkJCQkJdWlPYmpJbmRleF9wKTsKKwordHlwZWRlZiB0RXBsS2VybmVsKFBVQkxJQyBST00gKgorCQkgICB0RXBsT2JkU3RvcmVMb2FkT2JqQ2FsbGJhY2spIChDQ01fREVDTF9JTlNUQU5DRV9IRExfCisJCQkJCQkgdEVwbE9iZENiU3RvcmVQYXJhbSBNRU0gKgorCQkJCQkJIHBDYlN0b3JlUGFyYW1fcCk7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHRoaXMgc3R1Y3R1cmUgaXMgdXNlZCBmb3IgcGFyYW1ldGVycyBmb3IgZnVuY3Rpb24gT2JkSW5pdE1vZHVsZVRhYigpCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgaW50IG1fdWlMb3dlck9iakluZGV4OwkvLyBsb3dlciBsaW1pdCBvZiBPYmpJbmRleAorCXVuc2lnbmVkIGludCBtX3VpVXBwZXJPYmpJbmRleDsJLy8gdXBwZXIgbGltaXQgb2YgT2JqSW5kZXgKKwl0SW5pdFRhYkVudHJ5Q2FsbGJhY2sgbV9mcEluaXRUYWJFbnRyeTsJLy8gd2lsbCBiZSBjYWxsZWQgaWYgT2JqSW5kZXggd2FzIGZvdW5kCisJdm9pZCBNRU0gKm1fcFRhYkJhc2U7CS8vIGJhc2UgYWRkcmVzcyBvZiB0YWJsZQorCXVuc2lnbmVkIGludCBtX3VpRW50cnlTaXplOwkvLyBzaXplIG9mIHRhYmxlIGVudHJ5ICAgICAgLy8gMjUtZmViLTIwMDUgci5kLjogZXhwYW5zaW9uIGZyb20gQllURSB0byBXT1JEIG5lY2Vzc2FyeSBmb3IgUERPIGJpdCBtYXBwaW5nCisJdW5zaWduZWQgaW50IG1fdWlNYXhFbnRyaWVzOwkvLyBtYXguIHRhYmVsIGVudHJpZXMKKworfSB0RXBsT2JkTW9kdWxUYWJQYXJhbTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgZW51bSBmb3IgZnVuY3Rpb24gRXBsT2JkU2V0Tm9kZUlkCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3R5cGVkZWYgZW51bSB7CisJa0VwbE9iZE5vZGVJZFVua25vd24gPSAweDAwLAkvLyB1bmtub3duIGhvdyB0aGUgbm9kZSBpZCB3YXMgc2V0CisJa0VwbE9iZE5vZGVJZFNvZnR3YXJlID0gMHgwMSwJLy8gbm9kZSBpZCBzZXQgYnkgc29mdHdhcmUKKwlrRXBsT2JkTm9kZUlkSGFyZHdhcmUgPSAweDAyCS8vIG5vZGUgaWQgc2V0IGJ5IGhhcmR3YXJlCit9IHRFcGxPYmROb2RlSWRUeXBlOworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBnbG9iYWwgdmFyaWFibGVzCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIHB1YmxpYyBmdW5jdGlvbnMKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworI2VuZGlmIC8vICNpZm5kZWYgX0VQTE9CRF9IXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxPYmRNYWNyby5oIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxPYmRNYWNyby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzZjJhZDgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbE9iZE1hY3JvLmgKQEAgLTAsMCArMSwzNTQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBpbmNsdWRlIGZpbGUgZm9yIG1hY3JvcyBvZiBFcGxPQkQtTW9kdWxlCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRXBsT2JkTWFjcm8uaCx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuNCAkICAkRGF0ZTogMjAwOC8wNC8xNyAyMTozNjozMiAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICAgICAgR0NDIFYzLjQKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUmV2aXNpb24gSGlzdG9yeToKKworICAyMDA2LzA2LzA1IGsudC46ICAgc3RhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uCisgICAgICAgICAgICAgICAgICAgIC0+IGJhc2VkIG9uIENBTm9wZW4gT2JkTWFjcm8uaAorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmIGRlZmluZWQgKEVQTF9PQkRfREVGSU5FX01BQ1JPKQorCisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjaWYgZGVmaW5lZCAoRVBMX09CRF9DUkVBVEVfUk9NX0RBVEEpCisKKy8vICAgICAgICAjcHJhZ21hIG1lc3NhZ2UgKCJFUExfT0JEX0NSRUFURV9ST01fREFUQSIpCisKKyNkZWZpbmUgRVBMX09CRF9CRUdJTigpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljICBEV09SRCAgZHdPYmRfT0JLX2cgPSAweDAwMDA7CisjZGVmaW5lIEVQTF9PQkRfRU5EKCkKKworCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZGVmaW5lIEVQTF9PQkRfQkVHSU5fUEFSVF9HRU5FUklDKCkKKyNkZWZpbmUgRVBMX09CRF9CRUdJTl9QQVJUX01BTlVGQUNUVVJFUigpCisjZGVmaW5lIEVQTF9PQkRfQkVHSU5fUEFSVF9ERVZJQ0UoKQorI2RlZmluZSBFUExfT0JEX0VORF9QQVJUKCkKKworCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZGVmaW5lIEVQTF9PQkRfQkVHSU5fSU5ERVhfUkFNKGluZCxjbnQsY2FsbCkKKyNkZWZpbmUgRVBMX09CRF9FTkRfSU5ERVgoaW5kKQorI2RlZmluZSBFUExfT0JEX1JBTV9JTkRFWF9SQU1fQVJSQVkoaW5kLGNudCxjYWxsLHR5cCxhY2MsZHR5cCxuYW1lLGRlZikgICAgICAgICBzdGF0aWMgIHRFcGxPYmRVbnNpZ25lZDggICAgeERlZiMjaW5kIyNfMHgwMF9nID0gKGNudCk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWMgIGR0eXAgIHhEZWYjI2luZCMjXzB4MDFfZyA9IChkZWYpOworI2RlZmluZSBFUExfT0JEX1JBTV9JTkRFWF9SQU1fVkFSQVJSQVkoaW5kLGNudCxjYWxsLHR5cCxhY2MsZHR5cCxuYW1lLGRlZikgICAgICBzdGF0aWMgIHRFcGxPYmRVbnNpZ25lZDggICAgeERlZiMjaW5kIyNfMHgwMF9nID0gKGNudCk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWMgIGR0eXAgIHhEZWYjI2luZCMjXzB4MDFfZyA9IChkZWYpOworI2RlZmluZSBFUExfT0JEX1JBTV9JTkRFWF9SQU1fVkFSQVJSQVlfTk9JTklUKGluZCxjbnQsY2FsbCx0eXAsYWNjLGR0eXAsbmFtZSkgICBzdGF0aWMgIHRFcGxPYmRVbnNpZ25lZDggICAgeERlZiMjaW5kIyNfMHgwMF9nID0gKGNudCk7CisKKwkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2RlZmluZSBFUExfT0JEX1NVQklOREVYX1JBTV9WQVIoaW5kLHN1Yix0eXAsYWNjLGR0eXAsbmFtZSx2YWwpICAgICAgICAgICAgICAgICBzdGF0aWMgIGR0eXAgIHhEZWYjI2luZCMjXyMjc3ViIyNfZyAgICAgICAgPSB2YWw7CisjZGVmaW5lIEVQTF9PQkRfU1VCSU5ERVhfUkFNX1ZBUl9SRyhpbmQsc3ViLHR5cCxhY2MsZHR5cCxuYW1lLHZhbCxsb3csaGlnaCkgICAgIHN0YXRpYyAgZHR5cCAgeERlZiMjaW5kIyNfIyNzdWIjI19nWzNdICAgICA9IHt2YWwsbG93LGhpZ2h9OworI2RlZmluZSBFUExfT0JEX1NVQklOREVYX1JBTV9WQVJfTk9JTklUKGluZCxzdWIsdHlwLGFjYyxkdHlwLG5hbWUpCisjZGVmaW5lIEVQTF9PQkRfU1VCSU5ERVhfUkFNX1ZTVFJJTkcoaW5kLHN1YixhY2MsbmFtZSxzaXplLHZhbCkgICAgICAgICAgICAgICAgIHN0YXRpYyBjaGFyICBNRU0gc3pDdXIjI2luZCMjXyMjc3ViIyNfZ1tzaXplKzFdOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljICB0RXBsT2JkVlN0cmluZ0RlZiAgeERlZiMjaW5kIyNfIyNzdWIjI19nID0ge3NpemUsIHZhbCwgc3pDdXIjI2luZCMjXyMjc3ViIyNfZ307CisKKyNkZWZpbmUgRVBMX09CRF9TVUJJTkRFWF9SQU1fT1NUUklORyhpbmQsc3ViLGFjYyxuYW1lLHNpemUpICAgICAgICAgICAgICAgICAgICAgc3RhdGljICBCWVRFICBNRU0gYkN1ciMjaW5kIyNfIyNzdWIjI19nW3NpemVdOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljICB0RXBsT2JkT1N0cmluZ0RlZiAgeERlZiMjaW5kIyNfIyNzdWIjI19nID0ge3NpemUsICgoQllURSopIiIpLCBiQ3VyIyNpbmQjI18jI3N1YiMjX2d9OworI2RlZmluZSBFUExfT0JEX1NVQklOREVYX1JBTV9ET01BSU4oaW5kLHN1YixhY2MsbmFtZSkKKyNkZWZpbmUgRVBMX09CRF9TVUJJTkRFWF9SQU1fVVNFUkRFRihpbmQsc3ViLHR5cCxhY2MsZHR5cCxuYW1lLHZhbCkgICAgICAgICAgICAgc3RhdGljICBkdHlwICB4RGVmIyNpbmQjI18jI3N1YiMjX2cgICAgICAgID0gdmFsOworI2RlZmluZSBFUExfT0JEX1NVQklOREVYX1JBTV9VU0VSREVGX1JHKGluZCxzdWIsdHlwLGFjYyxkdHlwLG5hbWUsdmFsLGxvdyxoaWdoKSBzdGF0aWMgIGR0eXAgIHhEZWYjI2luZCMjXyMjc3ViIyNfZ1szXSAgICAgPSB7dmFsLGxvdyxoaWdofTsKKyNkZWZpbmUgRVBMX09CRF9TVUJJTkRFWF9SQU1fVVNFUkRFRl9OT0lOSVQoaW5kLHN1Yix0eXAsYWNjLGR0eXAsbmFtZSkKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZWxpZiBkZWZpbmVkIChFUExfT0JEX0NSRUFURV9SQU1fREFUQSkKKworLy8gICAgICAgICNwcmFnbWEgbWVzc2FnZSAoIkVQTF9PQkRfQ1JFQVRFX1JBTV9EQVRBIikKKworI2RlZmluZSBFUExfT0JEX0JFR0lOKCkKKyNkZWZpbmUgRVBMX09CRF9FTkQoKQorCisJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgRVBMX09CRF9CRUdJTl9QQVJUX0dFTkVSSUMoKQorI2RlZmluZSBFUExfT0JEX0JFR0lOX1BBUlRfTUFOVUZBQ1RVUkVSKCkKKyNkZWZpbmUgRVBMX09CRF9CRUdJTl9QQVJUX0RFVklDRSgpCisjZGVmaW5lIEVQTF9PQkRfRU5EX1BBUlQoKQorCisJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgRVBMX09CRF9CRUdJTl9JTkRFWF9SQU0oaW5kLGNudCxjYWxsKQorI2RlZmluZSBFUExfT0JEX0VORF9JTkRFWChpbmQpCisjZGVmaW5lIEVQTF9PQkRfUkFNX0lOREVYX1JBTV9BUlJBWShpbmQsY250LGNhbGwsdHlwLGFjYyxkdHlwLG5hbWUsZGVmKSAgICAgICAgIHN0YXRpYyBkdHlwICAgICAgICAgTUVNIGF4Q3VyIyNpbmQjI19nW2NudF07CisjZGVmaW5lIEVQTF9PQkRfUkFNX0lOREVYX1JBTV9WQVJBUlJBWShpbmQsY250LGNhbGwsdHlwLGFjYyxkdHlwLG5hbWUsZGVmKSAgICAgIHN0YXRpYyB0RXBsT2JkVmFyRW50cnkgTUVNIGFWYXJFbnRyeSMjaW5kIyNfZ1tjbnRdOworI2RlZmluZSBFUExfT0JEX1JBTV9JTkRFWF9SQU1fVkFSQVJSQVlfTk9JTklUKGluZCxjbnQsY2FsbCx0eXAsYWNjLGR0eXAsbmFtZSkgICBzdGF0aWMgdEVwbE9iZFZhckVudHJ5IE1FTSBhVmFyRW50cnkjI2luZCMjX2dbY250XTsKKworCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZGVmaW5lIEVQTF9PQkRfU1VCSU5ERVhfUkFNX1ZBUihpbmQsc3ViLHR5cCxhY2MsZHR5cCxuYW1lLHZhbCkgICAgICAgICAgICAgICAgIHN0YXRpYyBkdHlwICAgICAgICAgTUVNIHhDdXIjI2luZCMjXyMjc3ViIyNfZzsKKyNkZWZpbmUgRVBMX09CRF9TVUJJTkRFWF9SQU1fVkFSX1JHKGluZCxzdWIsdHlwLGFjYyxkdHlwLG5hbWUsdmFsLGxvdyxoaWdoKSAgICAgc3RhdGljIGR0eXAgICAgICAgICBNRU0geEN1ciMjaW5kIyNfIyNzdWIjI19nOworI2RlZmluZSBFUExfT0JEX1NVQklOREVYX1JBTV9WU1RSSU5HKGluZCxzdWIsYWNjLG5hbWUsc2l6ZSx2YWwpICAgICAgICAgICAgICAgICBzdGF0aWMgdEVwbE9iZFZTdHJpbmcgIE1FTSB4Q3VyIyNpbmQjI18jI3N1YiMjX2c7CisjZGVmaW5lIEVQTF9PQkRfU1VCSU5ERVhfUkFNX09TVFJJTkcoaW5kLHN1YixhY2MsbmFtZSxzaXplKSAgICAgICAgICAgICAgICAgICAgIHN0YXRpYyB0RXBsT2JkT1N0cmluZyAgTUVNIHhDdXIjI2luZCMjXyMjc3ViIyNfZzsKKyNkZWZpbmUgRVBMX09CRF9TVUJJTkRFWF9SQU1fVkFSX05PSU5JVChpbmQsc3ViLHR5cCxhY2MsZHR5cCxuYW1lKSAgICAgICAgICAgICAgc3RhdGljIGR0eXAgICAgICAgICBNRU0geEN1ciMjaW5kIyNfIyNzdWIjI19nOworI2RlZmluZSBFUExfT0JEX1NVQklOREVYX1JBTV9ET01BSU4oaW5kLHN1YixhY2MsbmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWMgdEVwbE9iZFZhckVudHJ5IE1FTSBWYXJFbnRyeSMjaW5kIyNfIyNzdWIjI19nOworI2RlZmluZSBFUExfT0JEX1NVQklOREVYX1JBTV9VU0VSREVGKGluZCxzdWIsdHlwLGFjYyxkdHlwLG5hbWUsdmFsKSAgICAgICAgICAgICBzdGF0aWMgdEVwbE9iZFZhckVudHJ5IE1FTSBWYXJFbnRyeSMjaW5kIyNfIyNzdWIjI19nOworI2RlZmluZSBFUExfT0JEX1NVQklOREVYX1JBTV9VU0VSREVGX1JHKGluZCxzdWIsdHlwLGFjYyxkdHlwLG5hbWUsdmFsLGxvdyxoaWdoKSBzdGF0aWMgdEVwbE9iZFZhckVudHJ5IE1FTSBWYXJFbnRyeSMjaW5kIyNfIyNzdWIjI19nOworI2RlZmluZSBFUExfT0JEX1NVQklOREVYX1JBTV9VU0VSREVGX05PSU5JVChpbmQsc3ViLHR5cCxhY2MsZHR5cCxuYW1lKSAgICAgICAgICBzdGF0aWMgdEVwbE9iZFZhckVudHJ5IE1FTSBWYXJFbnRyeSMjaW5kIyNfIyNzdWIjI19nOworCisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZWxpZiBkZWZpbmVkIChFUExfT0JEX0NSRUFURV9TVUJJTkRFWF9UQUIpCisKKy8vICAgICAgICAjcHJhZ21hIG1lc3NhZ2UgKCJFUExfT0JEX0NSRUFURV9TVUJJTkRFWF9UQUIiKQorCisjZGVmaW5lIEVQTF9PQkRfQkVHSU4oKQorI2RlZmluZSBFUExfT0JEX0VORCgpCisKKwkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2RlZmluZSBFUExfT0JEX0JFR0lOX1BBUlRfR0VORVJJQygpCisjZGVmaW5lIEVQTF9PQkRfQkVHSU5fUEFSVF9NQU5VRkFDVFVSRVIoKQorI2RlZmluZSBFUExfT0JEX0JFR0lOX1BBUlRfREVWSUNFKCkKKyNkZWZpbmUgRVBMX09CRF9FTkRfUEFSVCgpCisKKwkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2RlZmluZSBFUExfT0JEX0JFR0lOX0lOREVYX1JBTShpbmQsY250LGNhbGwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWMgdEVwbE9iZFN1YkVudHJ5IE1FTSBhT2JkU3ViRW50cnkjI2luZCMjUmFtX2dbY250XT0geworI2RlZmluZSBFUExfT0JEX0VORF9JTkRFWChpbmQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFUExfT0JEX0VORF9TVUJJTkRFWCgpfTsKKyNkZWZpbmUgRVBMX09CRF9SQU1fSU5ERVhfUkFNX0FSUkFZKGluZCxjbnQsY2FsbCx0eXAsYWNjLGR0eXAsbmFtZSxkZWYpICAgICAgICAgc3RhdGljIHRFcGxPYmRTdWJFbnRyeSBNRU0gYU9iZFN1YkVudHJ5IyNpbmQjI1JhbV9nW109IHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHswLCBrRXBsT2JkVHlwVUludDgsIGtFcGxPYmRBY2NDUiwgICAgICAgICAgJnhEZWYjI2luZCMjXzB4MDBfZywgICBOVUxMfSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsxLCB0eXAsICAgICAgICAgIChhY2MpfGtFcGxPYmRBY2NBcnJheSwgJnhEZWYjI2luZCMjXzB4MDFfZywgICAmYXhDdXIjI2luZCMjX2dbMF19LCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVBMX09CRF9FTkRfU1VCSU5ERVgoKX07CisjZGVmaW5lIEVQTF9PQkRfUkFNX0lOREVYX1JBTV9WQVJBUlJBWShpbmQsY250LGNhbGwsdHlwLGFjYyxkdHlwLG5hbWUsZGVmKSAgICAgIHN0YXRpYyB0RXBsT2JkU3ViRW50cnkgTUVNIGFPYmRTdWJFbnRyeSMjaW5kIyNSYW1fZ1tdPSB7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MCwga0VwbE9iZFR5cFVJbnQ4LCBrRXBsT2JkQWNjQ1IsICAgICAgICAgICAgICAgICAgICAgJnhEZWYjI2luZCMjXzB4MDBfZywgICBOVUxMfSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsxLCB0eXAsICAgICAgICAgIChhY2MpfGtFcGxPYmRBY2NBcnJheXxrRXBsT2JkQWNjVmFyLCAmeERlZiMjaW5kIyNfMHgwMV9nLCAgICZhVmFyRW50cnkjI2luZCMjX2dbMF19LCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVBMX09CRF9FTkRfU1VCSU5ERVgoKX07CisjZGVmaW5lIEVQTF9PQkRfUkFNX0lOREVYX1JBTV9WQVJBUlJBWV9OT0lOSVQoaW5kLGNudCxjYWxsLHR5cCxhY2MsZHR5cCxuYW1lKSAgIHN0YXRpYyB0RXBsT2JkU3ViRW50cnkgTUVNIGFPYmRTdWJFbnRyeSMjaW5kIyNSYW1fZ1tdPSB7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MCwga0VwbE9iZFR5cFVJbnQ4LCBrRXBsT2JkQWNjQ1IsICAgICAgICAgICAgICAgICAgICAgJnhEZWYjI2luZCMjXzB4MDBfZywgICBOVUxMfSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsxLCB0eXAsICAgICAgICAgIChhY2MpfGtFcGxPYmRBY2NBcnJheXxrRXBsT2JkQWNjVmFyLCBOVUxMLCAgICAgICAgICAgICAgICAgICZhVmFyRW50cnkjI2luZCMjX2dbMF19LCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVBMX09CRF9FTkRfU1VCSU5ERVgoKX07CisKKwkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2RlZmluZSBFUExfT0JEX1NVQklOREVYX1JBTV9WQVIoaW5kLHN1Yix0eXAsYWNjLGR0eXAsbmFtZSx2YWwpICAgICAgICAgICAgICAgICB7c3ViLHR5cCwgICAgICAgICAgICAoYWNjKSwgICAgICAgICAgICAgICAgICAgICAgICAmeERlZiMjaW5kIyNfIyNzdWIjI19nLCAgICZ4Q3VyIyNpbmQjI18jI3N1YiMjX2d9LAorI2RlZmluZSBFUExfT0JEX1NVQklOREVYX1JBTV9WQVJfUkcoaW5kLHN1Yix0eXAsYWNjLGR0eXAsbmFtZSx2YWwsbG93LGhpZ2gpICAgICB7c3ViLHR5cCwgICAgICAgICAgICAoYWNjKXxrRXBsT2JkQWNjUmFuZ2UsICAgICAgICAgICAmeERlZiMjaW5kIyNfIyNzdWIjI19nWzBdLCZ4Q3VyIyNpbmQjI18jI3N1YiMjX2d9LAorI2RlZmluZSBFUExfT0JEX1NVQklOREVYX1JBTV9WQVJfTk9JTklUKGluZCxzdWIsdHlwLGFjYyxkdHlwLG5hbWUpICAgICAgICAgICAgICB7c3ViLHR5cCwgICAgICAgICAgICAoYWNjKSwgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAgICZ4Q3VyIyNpbmQjI18jI3N1YiMjX2d9LAorI2RlZmluZSBFUExfT0JEX1NVQklOREVYX1JBTV9WU1RSSU5HKGluZCxzdWIsYWNjLG5hbWUsc2l6ZSx2YWwpICAgICAgICAgICAgICAgICB7c3ViLGtFcGxPYmRUeXBWU3RyaW5nLChhY2MpLyp8a0VwbE9iZEFjY1ZhciovLCAgICAgICAgICZ4RGVmIyNpbmQjI18jI3N1YiMjX2csICAgJnhDdXIjI2luZCMjXyMjc3ViIyNfZ30sCisjZGVmaW5lIEVQTF9PQkRfU1VCSU5ERVhfUkFNX09TVFJJTkcoaW5kLHN1YixhY2MsbmFtZSxzaXplKSAgICAgICAgICAgICAgICAgICAgIHtzdWIsa0VwbE9iZFR5cE9TdHJpbmcsKGFjYykvKnxrRXBsT2JkQWNjVmFyKi8sICAgICAgICAgJnhEZWYjI2luZCMjXyMjc3ViIyNfZywgICAmeEN1ciMjaW5kIyNfIyNzdWIjI19nfSwKKyNkZWZpbmUgRVBMX09CRF9TVUJJTkRFWF9SQU1fRE9NQUlOKGluZCxzdWIsYWNjLG5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAge3N1YixrRXBsT2JkVHlwRG9tYWluLCAoYWNjKXxrRXBsT2JkQWNjVmFyLCAgICAgICAgICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICZWYXJFbnRyeSMjaW5kIyNfIyNzdWIjI19nfSwKKyNkZWZpbmUgRVBMX09CRF9TVUJJTkRFWF9SQU1fVVNFUkRFRihpbmQsc3ViLHR5cCxhY2MsZHR5cCxuYW1lLHZhbCkgICAgICAgICAgICAge3N1Yix0eXAsICAgICAgICAgICAoYWNjKXxrRXBsT2JkQWNjVmFyLCAgICAgICAgICAgICAmeERlZiMjaW5kIyNfIyNzdWIjI19nLCAgICZWYXJFbnRyeSMjaW5kIyNfIyNzdWIjI19nfSwKKyNkZWZpbmUgRVBMX09CRF9TVUJJTkRFWF9SQU1fVVNFUkRFRl9SRyhpbmQsc3ViLHR5cCxhY2MsZHR5cCxuYW1lLHZhbCxsb3csaGlnaCkge3N1Yix0eXAsICAgICAgICAgICAoYWNjKXxrRXBsT2JkQWNjVmFyfGtFcGxPYmRBY2NSYW5nZSwmeERlZiMjaW5kIyNfIyNzdWIjI19nWzBdLCZWYXJFbnRyeSMjaW5kIyNfIyNzdWIjI19nfSwKKyNkZWZpbmUgRVBMX09CRF9TVUJJTkRFWF9SQU1fVVNFUkRFRl9OT0lOSVQoaW5kLHN1Yix0eXAsYWNjLGR0eXAsbmFtZSkgICAgICAgICAge3N1Yix0eXAsICAgICAgICAgICAoYWNjKXxrRXBsT2JkQWNjVmFyLCAgICAgICAgICAgICBOVUxMLCAgICAmVmFyRW50cnkjI2luZCMjXyMjc3ViIyNfZ30sCisKKyAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNlbGlmIGRlZmluZWQgKEVQTF9PQkRfQ1JFQVRFX0lOREVYX1RBQikKKworLy8gICAgICAgICNwcmFnbWEgbWVzc2FnZSAoIkVQTF9PQkRfQ1JFQVRFX0lOREVYX1RBQiIpCisKKyNkZWZpbmUgRVBMX09CRF9CRUdJTigpCisjZGVmaW5lIEVQTF9PQkRfRU5EKCkKKworCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZGVmaW5lIEVQTF9PQkRfQkVHSU5fUEFSVF9HRU5FUklDKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWMgIHRFcGxPYmRFbnRyeSAgYU9iZFRhYl9nW10gICAgICA9IHsKKyNkZWZpbmUgRVBMX09CRF9CRUdJTl9QQVJUX01BTlVGQUNUVVJFUigpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljICB0RXBsT2JkRW50cnkgIGFPYmRUYWJNYW51ZmFjdHVyZXJfZ1tdID0geworI2RlZmluZSBFUExfT0JEX0JFR0lOX1BBUlRfREVWSUNFKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWMgIHRFcGxPYmRFbnRyeSAgYU9iZFRhYkRldmljZV9nW10gICAgICAgPSB7CisjZGVmaW5lIEVQTF9PQkRfRU5EX1BBUlQoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtFUExfT0JEX1RBQkxFX0lOREVYX0VORCwodEVwbE9iZFN1YkVudHJ5UHRyKSZkd09iZF9PQktfZywwLE5VTEx9fTsKKworCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZGVmaW5lIEVQTF9PQkRfQkVHSU5fSU5ERVhfUkFNKGluZCxjbnQsY2FsbCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtpbmQsKHRFcGxPYmRTdWJFbnRyeVB0cikmYU9iZFN1YkVudHJ5IyNpbmQjI1JhbV9nWzBdLGNudCwodEVwbE9iZENhbGxiYWNrKWNhbGx9LAorI2RlZmluZSBFUExfT0JEX0VORF9JTkRFWChpbmQpCisjZGVmaW5lIEVQTF9PQkRfUkFNX0lOREVYX1JBTV9BUlJBWShpbmQsY250LGNhbGwsdHlwLGFjYyxkdHlwLG5hbWUsZGVmKSAgICAgICAgIHtpbmQsKHRFcGxPYmRTdWJFbnRyeVB0cikmYU9iZFN1YkVudHJ5IyNpbmQjI1JhbV9nWzBdLChjbnQpKzEsKHRFcGxPYmRDYWxsYmFjayljYWxsfSwKKyNkZWZpbmUgRVBMX09CRF9SQU1fSU5ERVhfUkFNX1ZBUkFSUkFZKGluZCxjbnQsY2FsbCx0eXAsYWNjLGR0eXAsbmFtZSxkZWYpICAgICAge2luZCwodEVwbE9iZFN1YkVudHJ5UHRyKSZhT2JkU3ViRW50cnkjI2luZCMjUmFtX2dbMF0sKGNudCkrMSwodEVwbE9iZENhbGxiYWNrKWNhbGx9LAorI2RlZmluZSBFUExfT0JEX1JBTV9JTkRFWF9SQU1fVkFSQVJSQVlfTk9JTklUKGluZCxjbnQsY2FsbCx0eXAsYWNjLGR0eXAsbmFtZSkgICB7aW5kLCh0RXBsT2JkU3ViRW50cnlQdHIpJmFPYmRTdWJFbnRyeSMjaW5kIyNSYW1fZ1swXSwoY250KSsxLCh0RXBsT2JkQ2FsbGJhY2spY2FsbH0sCisKKwkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2RlZmluZSBFUExfT0JEX1NVQklOREVYX1JBTV9WQVIoaW5kLHN1Yix0eXAsYWNjLGR0eXAsbmFtZSx2YWwpCisjZGVmaW5lIEVQTF9PQkRfU1VCSU5ERVhfUkFNX1ZBUl9SRyhpbmQsc3ViLHR5cCxhY2MsZHR5cCxuYW1lLHZhbCxsb3csaGlnaCkKKyNkZWZpbmUgRVBMX09CRF9TVUJJTkRFWF9SQU1fVlNUUklORyhpbmQsc3ViLGFjYyxuYW1lLHNpemUsdmFsKQorI2RlZmluZSBFUExfT0JEX1NVQklOREVYX1JBTV9PU1RSSU5HKGluZCxzdWIsYWNjLG5hbWUsc2l6ZSkKKyNkZWZpbmUgRVBMX09CRF9TVUJJTkRFWF9SQU1fVkFSX05PSU5JVChpbmQsc3ViLHR5cCxhY2MsZHR5cCxuYW1lKQorI2RlZmluZSBFUExfT0JEX1NVQklOREVYX1JBTV9ET01BSU4oaW5kLHN1YixhY2MsbmFtZSkKKyNkZWZpbmUgRVBMX09CRF9TVUJJTkRFWF9SQU1fVVNFUkRFRihpbmQsc3ViLHR5cCxhY2MsZHR5cCxuYW1lLHZhbCkKKyNkZWZpbmUgRVBMX09CRF9TVUJJTkRFWF9SQU1fVVNFUkRFRl9SRyhpbmQsc3ViLHR5cCxhY2MsZHR5cCxuYW1lLHZhbCxsb3csaGlnaCkKKyNkZWZpbmUgRVBMX09CRF9TVUJJTkRFWF9SQU1fVVNFUkRFRl9OT0lOSVQoaW5kLHN1Yix0eXAsYWNjLGR0eXAsbmFtZSkKKworCSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNlbGlmIGRlZmluZWQgKEVQTF9PQkRfQ1JFQVRFX0lOSVRfRlVOQ1RJT04pCisKKy8vICAgICAgICAjcHJhZ21hIG1lc3NhZ2UgKCJFUExfT0JEX0NSRUFURV9JTklUX0ZVTkNUSU9OIikKKworI2RlZmluZSBFUExfT0JEX0JFR0lOKCkKKyNkZWZpbmUgRVBMX09CRF9FTkQoKQorCisJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgRVBMX09CRF9CRUdJTl9QQVJUX0dFTkVSSUMoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbml0UGFyYW0tPm1fcFBhcnQgICAgICA9ICh0RXBsT2JkRW50cnlQdHIpICZhT2JkVGFiX2dbMF07CisjZGVmaW5lIEVQTF9PQkRfQkVHSU5fUEFSVF9NQU5VRkFDVFVSRVIoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbml0UGFyYW0tPm1fcE1hbnVmYWN0dXJlclBhcnQgPSAodEVwbE9iZEVudHJ5UHRyKSAmYU9iZFRhYk1hbnVmYWN0dXJlcl9nWzBdOworI2RlZmluZSBFUExfT0JEX0JFR0lOX1BBUlRfREVWSUNFKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5pdFBhcmFtLT5tX3BEZXZpY2VQYXJ0ICAgICAgID0gKHRFcGxPYmRFbnRyeVB0cikgJmFPYmRUYWJEZXZpY2VfZ1swXTsKKyNkZWZpbmUgRVBMX09CRF9FTkRfUEFSVCgpCisKKwkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2RlZmluZSBFUExfT0JEX0JFR0lOX0lOREVYX1JBTShpbmQsY250LGNhbGwpCisjZGVmaW5lIEVQTF9PQkRfRU5EX0lOREVYKGluZCkKKyNkZWZpbmUgRVBMX09CRF9SQU1fSU5ERVhfUkFNX0FSUkFZKGluZCxjbnQsY2FsbCx0eXAsYWNjLGR0eXAsbmFtZSxkZWYpCisjZGVmaW5lIEVQTF9PQkRfUkFNX0lOREVYX1JBTV9WQVJBUlJBWShpbmQsY250LGNhbGwsdHlwLGFjYyxkdHlwLG5hbWUsZGVmKQorI2RlZmluZSBFUExfT0JEX1JBTV9JTkRFWF9SQU1fVkFSQVJSQVlfTk9JTklUKGluZCxjbnQsY2FsbCx0eXAsYWNjLGR0eXAsbmFtZSkKKworCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZGVmaW5lIEVQTF9PQkRfU1VCSU5ERVhfUkFNX1ZBUihpbmQsc3ViLHR5cCxhY2MsZHR5cCxuYW1lLHZhbCkKKyNkZWZpbmUgRVBMX09CRF9TVUJJTkRFWF9SQU1fVkFSX1JHKGluZCxzdWIsdHlwLGFjYyxkdHlwLG5hbWUsdmFsLGxvdyxoaWdoKQorI2RlZmluZSBFUExfT0JEX1NVQklOREVYX1JBTV9WU1RSSU5HKGluZCxzdWIsYWNjLG5hbWUsc2l6ZSx2YWwpCisjZGVmaW5lIEVQTF9PQkRfU1VCSU5ERVhfUkFNX09TVFJJTkcoaW5kLHN1YixhY2MsbmFtZSxzaXplKQorI2RlZmluZSBFUExfT0JEX1NVQklOREVYX1JBTV9WQVJfTk9JTklUKGluZCxzdWIsdHlwLGFjYyxkdHlwLG5hbWUpCisjZGVmaW5lIEVQTF9PQkRfU1VCSU5ERVhfUkFNX0RPTUFJTihpbmQsc3ViLGFjYyxuYW1lKQorI2RlZmluZSBFUExfT0JEX1NVQklOREVYX1JBTV9VU0VSREVGKGluZCxzdWIsdHlwLGFjYyxkdHlwLG5hbWUsdmFsKQorI2RlZmluZSBFUExfT0JEX1NVQklOREVYX1JBTV9VU0VSREVGX1JHKGluZCxzdWIsdHlwLGFjYyxkdHlwLG5hbWUsdmFsLGxvdyxoaWdoKQorI2RlZmluZSBFUExfT0JEX1NVQklOREVYX1JBTV9VU0VSREVGX05PSU5JVChpbmQsc3ViLHR5cCxhY2MsZHR5cCxuYW1lKQorCisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZWxpZiBkZWZpbmVkIChFUExfT0JEX0NSRUFURV9JTklUX1NVQklOREVYKQorCisvLyAgICAgICAgI3ByYWdtYSBtZXNzYWdlICgiRVBMX09CRF9DUkVBVEVfSU5JVF9TVUJJTkRFWCIpCisKKyNkZWZpbmUgRVBMX09CRF9CRUdJTigpCisjZGVmaW5lIEVQTF9PQkRfRU5EKCkKKworCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZGVmaW5lIEVQTF9PQkRfQkVHSU5fUEFSVF9HRU5FUklDKCkKKyNkZWZpbmUgRVBMX09CRF9CRUdJTl9QQVJUX01BTlVGQUNUVVJFUigpCisjZGVmaW5lIEVQTF9PQkRfQkVHSU5fUEFSVF9ERVZJQ0UoKQorI2RlZmluZSBFUExfT0JEX0VORF9QQVJUKCkKKworCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZGVmaW5lIEVQTF9PQkRfQkVHSU5fSU5ERVhfUkFNKGluZCxjbnQsY2FsbCkJLy9DQ01fU1VCSU5ERVhfUkFNX09OTFkgKEVQTF9NRU1DUFkgKCZhT2JkU3ViRW50cnkjI2luZCMjUmFtX2dbMF0sJmFPYmRTdWJFbnRyeSMjaW5kIyNSb21fZ1swXSxzaXplb2YoYU9iZFN1YkVudHJ5IyNpbmQjI1JhbV9nKSkpOworI2RlZmluZSBFUExfT0JEX0VORF9JTkRFWChpbmQpCisjZGVmaW5lIEVQTF9PQkRfUkFNX0lOREVYX1JBTV9BUlJBWShpbmQsY250LGNhbGwsdHlwLGFjYyxkdHlwLG5hbWUsZGVmKQkvL0VQTF9NRU1DUFkgKCZhT2JkU3ViRW50cnkjI2luZCMjUmFtX2dbMF0sJmFPYmRTdWJFbnRyeSMjaW5kIyNSb21fZ1swXSxzaXplb2YoYU9iZFN1YkVudHJ5IyNpbmQjI1JhbV9nKSk7CisjZGVmaW5lIEVQTF9PQkRfUkFNX0lOREVYX1JBTV9WQVJBUlJBWShpbmQsY250LGNhbGwsdHlwLGFjYyxkdHlwLG5hbWUsZGVmKQkvL0VQTF9NRU1DUFkgKCZhT2JkU3ViRW50cnkjI2luZCMjUmFtX2dbMF0sJmFPYmRTdWJFbnRyeSMjaW5kIyNSb21fZ1swXSxzaXplb2YoYU9iZFN1YkVudHJ5IyNpbmQjI1JhbV9nKSk7CisjZGVmaW5lIEVQTF9PQkRfUkFNX0lOREVYX1JBTV9WQVJBUlJBWV9OT0lOSVQoaW5kLGNudCxjYWxsLHR5cCxhY2MsZHR5cCxuYW1lKQkvL0VQTF9NRU1DUFkgKCZhT2JkU3ViRW50cnkjI2luZCMjUmFtX2dbMF0sJmFPYmRTdWJFbnRyeSMjaW5kIyNSb21fZ1swXSxzaXplb2YoYU9iZFN1YkVudHJ5IyNpbmQjI1JhbV9nKSk7CisKKwkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2RlZmluZSBFUExfT0JEX1NVQklOREVYX1JBTV9WQVIoaW5kLHN1Yix0eXAsYWNjLGR0eXAsbmFtZSx2YWwpCisjZGVmaW5lIEVQTF9PQkRfU1VCSU5ERVhfUkFNX1ZBUl9SRyhpbmQsc3ViLHR5cCxhY2MsZHR5cCxuYW1lLHZhbCxsb3csaGlnaCkKKyNkZWZpbmUgRVBMX09CRF9TVUJJTkRFWF9SQU1fVlNUUklORyhpbmQsc3ViLGFjYyxuYW1lLHNpemUsdmFsKQorI2RlZmluZSBFUExfT0JEX1NVQklOREVYX1JBTV9PU1RSSU5HKGluZCxzdWIsYWNjLG5hbWUsc2l6ZSkKKyNkZWZpbmUgRVBMX09CRF9TVUJJTkRFWF9SQU1fVkFSX05PSU5JVChpbmQsc3ViLHR5cCxhY2MsZHR5cCxuYW1lKQorI2RlZmluZSBFUExfT0JEX1NVQklOREVYX1JBTV9ET01BSU4oaW5kLHN1YixhY2MsbmFtZSkKKyNkZWZpbmUgRVBMX09CRF9TVUJJTkRFWF9SQU1fVVNFUkRFRihpbmQsc3ViLHR5cCxhY2MsZHR5cCxuYW1lLHZhbCkKKyNkZWZpbmUgRVBMX09CRF9TVUJJTkRFWF9SQU1fVVNFUkRFRl9SRyhpbmQsc3ViLHR5cCxhY2MsZHR5cCxuYW1lLHZhbCxsb3csaGlnaCkKKyNkZWZpbmUgRVBMX09CRF9TVUJJTkRFWF9SQU1fVVNFUkRFRl9OT0lOSVQoaW5kLHN1Yix0eXAsYWNjLGR0eXAsbmFtZSkKKworICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2Vsc2UKKworLy8gICAgICAgICNwcmFnbWEgbWVzc2FnZSAoIkVMU0UgT0YgREVGSU5FIikKKworI2RlZmluZSBFUExfT0JEX0JFR0lOKCkKKyNkZWZpbmUgRVBMX09CRF9FTkQoKQorCisJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgRVBMX09CRF9CRUdJTl9QQVJUX0dFTkVSSUMoKQorI2RlZmluZSBFUExfT0JEX0JFR0lOX1BBUlRfTUFOVUZBQ1RVUkVSKCkKKyNkZWZpbmUgRVBMX09CRF9CRUdJTl9QQVJUX0RFVklDRSgpCisjZGVmaW5lIEVQTF9PQkRfRU5EX1BBUlQoKQorCisJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgRVBMX09CRF9CRUdJTl9JTkRFWF9SQU0oaW5kLGNudCxjYWxsKQorI2RlZmluZSBFUExfT0JEX0VORF9JTkRFWChpbmQpCisjZGVmaW5lIEVQTF9PQkRfUkFNX0lOREVYX1JBTV9BUlJBWShpbmQsY250LGNhbGwsdHlwLGFjYyxkdHlwLG5hbWUsZGVmKQorI2RlZmluZSBFUExfT0JEX1JBTV9JTkRFWF9SQU1fVkFSQVJSQVkoaW5kLGNudCxjYWxsLHR5cCxhY2MsZHR5cCxuYW1lLGRlZikKKyNkZWZpbmUgRVBMX09CRF9SQU1fSU5ERVhfUkFNX1ZBUkFSUkFZX05PSU5JVChpbmQsY250LGNhbGwsdHlwLGFjYyxkdHlwLG5hbWUpCisKKwkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2RlZmluZSBFUExfT0JEX1NVQklOREVYX1JBTV9WQVIoaW5kLHN1Yix0eXAsYWNjLGR0eXAsbmFtZSx2YWwpCisjZGVmaW5lIEVQTF9PQkRfU1VCSU5ERVhfUkFNX1ZBUl9SRyhpbmQsc3ViLHR5cCxhY2MsZHR5cCxuYW1lLHZhbCxsb3csaGlnaCkKKyNkZWZpbmUgRVBMX09CRF9TVUJJTkRFWF9SQU1fVlNUUklORyhpbmQsc3ViLGFjYyxuYW1lLHNpemVzLHZhbCkKKyNkZWZpbmUgRVBMX09CRF9TVUJJTkRFWF9SQU1fT1NUUklORyhpbmQsc3ViLGFjYyxuYW1lLHNpemUpCisjZGVmaW5lIEVQTF9PQkRfU1VCSU5ERVhfUkFNX1ZBUl9OT0lOSVQoaW5kLHN1Yix0eXAsYWNjLGR0eXAsbmFtZSkKKyNkZWZpbmUgRVBMX09CRF9TVUJJTkRFWF9SQU1fRE9NQUlOKGluZCxzdWIsYWNjLG5hbWUpCisjZGVmaW5lIEVQTF9PQkRfU1VCSU5ERVhfUkFNX1VTRVJERUYoaW5kLHN1Yix0eXAsYWNjLGR0eXAsbmFtZSx2YWwpCisjZGVmaW5lIEVQTF9PQkRfU1VCSU5ERVhfUkFNX1VTRVJERUZfUkcoaW5kLHN1Yix0eXAsYWNjLGR0eXAsbmFtZSx2YWwsbG93LGhpZ2gpCisjZGVmaW5lIEVQTF9PQkRfU1VCSU5ERVhfUkFNX1VTRVJERUZfTk9JTklUKGluZCxzdWIsdHlwLGFjYyxkdHlwLG5hbWUpCisKKyNlbmRpZgorCisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZWxpZiBkZWZpbmVkIChFUExfT0JEX1VOREVGSU5FX01BQ1JPKQorCisvLyAgICAjcHJhZ21hIG1lc3NhZ2UgKCJFUExfT0JEX1VOREVGSU5FX01BQ1JPIikKKworI3VuZGVmIEVQTF9PQkRfQkVHSU4KKyN1bmRlZiBFUExfT0JEX0VORAorCisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyN1bmRlZiBFUExfT0JEX0JFR0lOX1BBUlRfR0VORVJJQworI3VuZGVmIEVQTF9PQkRfQkVHSU5fUEFSVF9NQU5VRkFDVFVSRVIKKyN1bmRlZiBFUExfT0JEX0JFR0lOX1BBUlRfREVWSUNFCisjdW5kZWYgRVBMX09CRF9FTkRfUEFSVAorCisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyN1bmRlZiBFUExfT0JEX0JFR0lOX0lOREVYX1JBTQorI3VuZGVmIEVQTF9PQkRfRU5EX0lOREVYCisjdW5kZWYgRVBMX09CRF9SQU1fSU5ERVhfUkFNX0FSUkFZCisjdW5kZWYgRVBMX09CRF9SQU1fSU5ERVhfUkFNX1ZBUkFSUkFZCisjdW5kZWYgRVBMX09CRF9SQU1fSU5ERVhfUkFNX1ZBUkFSUkFZX05PSU5JVAorCisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyN1bmRlZiBFUExfT0JEX1NVQklOREVYX1JBTV9WQVIKKyN1bmRlZiBFUExfT0JEX1NVQklOREVYX1JBTV9WQVJfUkcKKyN1bmRlZiBFUExfT0JEX1NVQklOREVYX1JBTV9WU1RSSU5HCisjdW5kZWYgRVBMX09CRF9TVUJJTkRFWF9SQU1fT1NUUklORworI3VuZGVmIEVQTF9PQkRfU1VCSU5ERVhfUkFNX1ZBUl9OT0lOSVQKKyN1bmRlZiBFUExfT0JEX1NVQklOREVYX1JBTV9ET01BSU4KKyN1bmRlZiBFUExfT0JEX1NVQklOREVYX1JBTV9VU0VSREVGCisjdW5kZWYgRVBMX09CRF9TVUJJTkRFWF9SQU1fVVNFUkRFRl9SRworI3VuZGVmIEVQTF9PQkRfU1VCSU5ERVhfUkFNX1VTRVJERUZfTk9JTklUCisKKyNlbHNlCisKKyNlcnJvciAibm90aGluZyBkZWZpbmVkIgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsT2Jka0NhbC5jIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxPYmRrQ2FsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGM5YWY4OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsT2Jka0NhbC5jCkBAIC0wLDAgKzEsMTQ3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgb3BlblBPV0VSTElOSworCisgIERlc2NyaXB0aW9uOiAgc291cmNlIGZpbGUgZm9yIGNvbW11bmljYXRpb24gYWJzdHJhY3Rpb24gbGF5ZXIKKyAgICAgICAgICAgICAgICBmb3IgdGhlIEVwbC1PYmQtS2VybmVsc3BhY2UtTW9kdWwKKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgICAgICAgICRSQ1NmaWxlOiBFcGxPYmRrQ2FsLmMsdiAkCisKKyAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAorCisgICAgICAgICAgICAgICAgJFJldmlzaW9uOiAxLjMgJCAgJERhdGU6IDIwMDgvMDQvMTcgMjE6MzY6MzIgJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgS0VJTCB1VmlzaW9uIDIKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUmV2aXNpb24gSGlzdG9yeToKKworICAyMDA2LzA2LzE5IGsudC46ICAgc3RhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJFcGxJbmMuaCIKKyNpbmNsdWRlICJrZXJuZWwvRXBsT2Jka0NhbC5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICBHIEwgTyBCIEEgTCAgIEQgRSBGIEkgTiBJIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvY2FsIHR5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbW9kdWwgZ2xvYmFsZSB2YXJzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICBQIFUgQiBMIEkgQyAgIEYgVSBOIEMgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246CisvLworLy8gRGVzY3JpcHRpb246CisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOgorLy8KKy8vCisvLyBSZXR1cm5zOgorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgIFAgUiBJIFYgQSBUIEUgICBGIFUgTiBDIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjoKKy8vCisvLyBEZXNjcmlwdGlvbjoKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6CisvLworLy8KKy8vIFJldHVybnM6CisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIEVPRgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxPYmR1LmMgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbE9iZHUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMThkMTUyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxPYmR1LmMKQEAgLTAsMCArMSw1MTcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBzb3VyY2UgZmlsZSBmb3IgRXBsLU9iZC1Vc2Vyc3BhY2UtbW9kdWxlCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRXBsT2JkdS5jLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS41ICQgICREYXRlOiAyMDA4LzEwLzE3IDE1OjMyOjMyICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorICAgICAgICAgICAgICAgICAgICBHQ0MgVjMuNAorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgIDIwMDYvMDYvMTkgay50LjogICBzdGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkVwbEluYy5oIgorI2luY2x1ZGUgInVzZXIvRXBsT2JkdS5oIgorI2luY2x1ZGUgInVzZXIvRXBsT2JkdUNhbC5oIgorCisjaWYgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9PQkRVKSkgIT0gMCkKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIEcgTCBPIEIgQSBMICAgRCBFIEYgSSBOIEkgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBtb2R1bCBnbG9iYWxlIHZhcnMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgIFAgVSBCIEwgSSBDICAgRiBVIE4gQyBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsT2JkdVdyaXRlRW50cnkoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBGdW5jdGlvbiB3cml0ZXMgZGF0YSB0byBhbiBPQkQgZW50cnkuIFN0cmluZ3MKKy8vICAgICAgICAgICAgICBhcmUgc3RvcmVkIHdpdGggYWRkZWQgJ1wwJyBjaGFyYWN0ZXIuCisvLworLy8gUGFyYW1ldGVyczogIHVpSW5kZXhfcCAgICAgICA9ICAgSW5kZXggb2YgdGhlIE9EIGVudHJ5CisvLyAgICAgICAgICAgICAgdWlTdWJJbmRleF9wICAgID0gICBTdWJpbmRleCBvZiB0aGUgT0QgRW50cnkKKy8vICAgICAgICAgICAgICBwU3JjRGF0YV9wICAgICAgPSAgIFBvaW50ZXIgdG8gdGhlIGRhdGEgdG8gd3JpdGUKKy8vICAgICAgICAgICAgICBTaXplX3AgICAgICAgICAgPSAgIFNpemUgb2YgdGhlIGRhdGEgaW4gQnl0ZQorLy8KKy8vIFJldHVybjogICAgICB0RXBsS2VybmVsICAgICAgPSAgIEVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbE9iZHVXcml0ZUVudHJ5KHVuc2lnbmVkIGludCB1aUluZGV4X3AsCisJCQkJCQkgdW5zaWduZWQgaW50IHVpU3ViSW5kZXhfcCwKKwkJCQkJCSB2b2lkICpwU3JjRGF0YV9wLAorCQkJCQkJIHRFcGxPYmRTaXplIFNpemVfcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKworCVJldCA9IEVwbE9iZHVDYWxXcml0ZUVudHJ5KHVpSW5kZXhfcCwgdWlTdWJJbmRleF9wLCBwU3JjRGF0YV9wLCBTaXplX3ApOworCisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsT2JkdVJlYWRFbnRyeSgpCisvLworLy8gRGVzY3JpcHRpb246IFRoZSBmdW5jdGlvbiByZWFkcyBhbiBvYmplY3QgZW50cnkuIFRoZSBhcHBsaWNhdGlvbgorLy8gICAgICAgICAgICAgIGNhbiBhbHdheXMgcmVhZCB0aGUgZGF0YSBldmVuIGlmIGF0dHJpYiBrRXBsT2JkQWNjUmVhZAorLy8gICAgICAgICAgICAgIGlzIG5vdCBzZXQuIFRoZSBhdHRyaWIgaXMgb25seSBjaGVja2VkIHVwIGZvciBTRE8gdHJhbnNmZXIuCisvLworLy8gUGFyYW1ldGVyczogIHVpSW5kZXhfcCAgICAgICA9IEluZGV4IG9vZiB0aGUgT0QgZW50cnkgdG8gcmVhZAorLy8gICAgICAgICAgICAgIHVpU3ViSW5kZXhfcCAgICA9IFN1YmluZGV4IHRvIHJlYWQKKy8vICAgICAgICAgICAgICBwRHN0RGF0YV9wICAgICAgPSBwb2ludGVyIHRvIHRoZSBidWZmZXIgZm9yIGRhdGEKKy8vICAgICAgICAgICAgICBPZmZzZXRfcCAgICAgICAgPSBvZmZzZXQgaW4gZGF0YSBmb3IgcmVhZCBhY2Nlc3MKKy8vICAgICAgICAgICAgICBwU2l6ZV9wICAgICAgICAgPSBJTjogU2l6ZSBvZiB0aGUgYnVmZmVyCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1VUOiBudW1iZXIgb2YgcmVhZGVkIEJ5dGVzCisvLworLy8gUmV0dXJuOiAgICAgIHRFcGxLZXJuZWwgICAgICA9ICAgZXJyb3Jjb2RlCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxPYmR1UmVhZEVudHJ5KHVuc2lnbmVkIGludCB1aUluZGV4X3AsCisJCQkJCQl1bnNpZ25lZCBpbnQgdWlTdWJJbmRleF9wLAorCQkJCQkJdm9pZCAqcERzdERhdGFfcCwKKwkJCQkJCXRFcGxPYmRTaXplICogcFNpemVfcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKworCVJldCA9IEVwbE9iZHVDYWxSZWFkRW50cnkodWlJbmRleF9wLCB1aVN1YkluZGV4X3AsIHBEc3REYXRhX3AsIHBTaXplX3ApOworCisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsT2JkQWNjZXNzT2RQYXJ0KCkKKy8vCisvLyBEZXNjcmlwdGlvbjogcmVzdG9yZXMgZGVmYXVsdCB2YWx1ZXMgb2Ygb25lIHBhcnQgb2YgT0QKKy8vCisvLyBQYXJhbWV0ZXJzOiAgT2JkUGFydF9wICAgICAgID0gb2QtcGFydCB0byByZXNldAorLy8gICAgICAgICAgICAgIERpcmVjdGlvbl9wICAgICA9IGRpcmVjdG9yeSBmbGFnIGZvcgorLy8KKy8vIFJldHVybjogICAgICB0RXBsS2VybmVsICA9IGVycm9yY29kZQorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMgRXBsT2JkdUFjY2Vzc09kUGFydCh0RXBsT2JkUGFydCBPYmRQYXJ0X3AsCisJCQkJCQkgICB0RXBsT2JkRGlyIERpcmVjdGlvbl9wKQoreworCXRFcGxLZXJuZWwgUmV0OworCisJUmV0ID0gRXBsT2JkdUNhbEFjY2Vzc09kUGFydChPYmRQYXJ0X3AsIERpcmVjdGlvbl9wKTsKKworCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE9iZHVEZWZpbmVWYXIoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBkZWZpbmVzIGEgdmFyaWFibGUgaW4gT0QKKy8vCisvLyBQYXJhbWV0ZXJzOiAgcEVwbFZhclBhcmFtX3AgPSB2YXJlbnRyeQorLy8KKy8vIFJldHVybjogICAgICB0RXBsS2VybmVsICA9ICAgZXJyb3Jjb2RlCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxPYmR1RGVmaW5lVmFyKHRFcGxWYXJQYXJhbSBNRU0gKiBwVmFyUGFyYW1fcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKworCVJldCA9IEVwbE9iZHVDYWxEZWZpbmVWYXIocFZhclBhcmFtX3ApOworCisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsT2JkdUdldE9iamVjdERhdGFQdHIoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBJdCByZXR1cm5lcyB0aGUgY3VycmVudCBkYXRhIHBvaW50ZXIuIEJ1dCBpZiBvYmplY3QgaXMgYW4KKy8vICAgICAgICAgICAgICBjb25zdGFudCBvYmplY3QgaXQgcmV0dXJuZXMgdGhlIGRlZmF1bHQgcG9pbnRlci4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgdWlJbmRleF9wICAgID0gICBJbmRleCBvZiB0aGUgZW50cnkKKy8vICAgICAgICAgICAgICB1aVN1YmluZGV4X3AgPSAgIFN1YmluZGV4IG9mIHRoZSBlbnRyeQorLy8KKy8vIFJldHVybjogICAgICB2b2lkICogICAgPSBwb2ludGVyIHRvIG9iamVjdCBkYXRhCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VQTERMTEVYUE9SVCB2b2lkICpQVUJMSUMgRXBsT2JkdUdldE9iamVjdERhdGFQdHIodW5zaWduZWQgaW50IHVpSW5kZXhfcCwKKwkJCQkJCSAgdW5zaWduZWQgaW50IHVpU3ViSW5kZXhfcCkKK3sKKwl2b2lkICpwRGF0YTsKKworCXBEYXRhID0gRXBsT2JkdUNhbEdldE9iamVjdERhdGFQdHIodWlJbmRleF9wLCB1aVN1YkluZGV4X3ApOworCisJcmV0dXJuIHBEYXRhOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxPYmR1UmVnaXN0ZXJVc2VyT2QoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBmdW5jdGlvbiByZWdpc3RlcnMgdGhlIHVzZXIgT0QKKy8vCisvLyBQYXJhbWV0ZXJzOiAgcFVzZXJPZF9wICAgPXBvaW50ZXIgdG8gdXNlciBPRGQKKy8vCisvLyBSZXR1cm46ICAgICB0RXBsS2VybmVsID0gZXJyb3Jjb2RlCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNpZiAoZGVmaW5lZCAoRVBMX09CRF9VU0VSX09EKSAmJiAoRVBMX09CRF9VU0VSX09EICE9IEZBTFNFKSkKK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxPYmR1UmVnaXN0ZXJVc2VyT2QodEVwbE9iZEVudHJ5UHRyIHBVc2VyT2RfcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKworCVJldCA9IEVwbE9iZHVDYWxSZWdpc3RlclVzZXJPZChwVXNlck9kX3ApOworCisJcmV0dXJuIFJldDsKKworfQorI2VuZGlmCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxPYmR1SW5pdFZhckVudHJ5KCkKKy8vCisvLyBEZXNjcmlwdGlvbjogZnVuY3Rpb24gdG8gaW5pdGlhbGl6ZSBWYXJFbnRyeSBkZXBlbmRlbmVkIG9uIG9iamVjdCB0eXBlCisvLworLy8gUGFyYW1ldGVyczogIHBWYXJFbnRyeV9wID0gcG9pbnRlciB0byB2YXIgZW50cnkgc3RydWN0dXJlCisvLyAgICAgICAgICAgICAgYlR5cGVfcCAgICAgPSBvYmplY3QgdHlwZQorLy8gICAgICAgICAgICAgIE9iZFNpemVfcCAgID0gc2l6ZSBvZiBvYmplY3QgZGF0YQorLy8KKy8vIFJldHVybnM6ICAgICBub25lCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VQTERMTEVYUE9SVCB2b2lkIFBVQkxJQyBFcGxPYmR1SW5pdFZhckVudHJ5KHRFcGxPYmRWYXJFbnRyeSBNRU0gKiBwVmFyRW50cnlfcCwKKwkJCQkJICAgICBCWVRFIGJUeXBlX3AsCisJCQkJCSAgICAgdEVwbE9iZFNpemUgT2JkU2l6ZV9wKQoreworCUVwbE9iZHVDYWxJbml0VmFyRW50cnkocFZhckVudHJ5X3AsIGJUeXBlX3AsIE9iZFNpemVfcCk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE9iZHVHZXREYXRhU2l6ZSgpCisvLworLy8gRGVzY3JpcHRpb246IGZ1bmN0aW9uIHRvIGluaXRpYWxpemUgVmFyRW50cnkgZGVwZW5kZW5lZCBvbiBvYmplY3QgdHlwZQorLy8KKy8vICAgICAgICAgICAgICBnZXRzIHRoZSBkYXRhIHNpemUgb2YgYW4gb2JqZWN0CisvLyAgICAgICAgICAgICAgZm9yIHN0cmluZyBvYmplY3RzIGl0IHJldHVybmVzIHRoZSBzdHJpbmcgbGVuZ3RoCisvLworLy8gUGFyYW1ldGVyczogIHVpSW5kZXhfcCAgID0gICBJbmRleAorLy8gICAgICAgICAgICAgIHVpU3ViSW5kZXhfcD0gICBTdWJpbmRleAorLy8KKy8vIFJldHVybjogICAgICB0RXBsT2JkU2l6ZQorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdEVwbE9iZFNpemUgUFVCTElDIEVwbE9iZHVHZXREYXRhU2l6ZSh1bnNpZ25lZCBpbnQgdWlJbmRleF9wLAorCQkJCQkJICAgdW5zaWduZWQgaW50IHVpU3ViSW5kZXhfcCkKK3sKKwl0RXBsT2JkU2l6ZSBTaXplOworCisJU2l6ZSA9IEVwbE9iZHVDYWxHZXREYXRhU2l6ZSh1aUluZGV4X3AsIHVpU3ViSW5kZXhfcCk7CisKKwlyZXR1cm4gU2l6ZTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsT2JkdUdldE5vZGVJZCgpCisvLworLy8gRGVzY3JpcHRpb246IGZ1bmN0aW9uIHJldHVybnMgbm9kZWlkIGZyb20gZW50cnkgMHgxRjkzCisvLworLy8KKy8vIFBhcmFtZXRlcnM6CisvLworLy8gUmV0dXJuOiAgICAgIHVuc2lnbmVkIGludCA9IE5vZGUgSWQKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHVuc2lnbmVkIGludCBQVUJMSUMgRXBsT2JkdUdldE5vZGVJZCgpCit7CisJdW5zaWduZWQgaW50IHVpTm9kZUlkOworCisJdWlOb2RlSWQgPSBFcGxPYmR1Q2FsR2V0Tm9kZUlkKCk7CisKKwlyZXR1cm4gdWlOb2RlSWQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE9iZHVTZXROb2RlSWQoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBmdW5jdGlvbiBzZXRzIG5vZGVpZCBpbiBlbnRyeSAweDFGOTMKKy8vCisvLworLy8gUGFyYW1ldGVyczogIHVpTm9kZUlkX3AgID0gICBOb2RlIElkIHRvIHNldAorLy8gICAgICAgICAgICAgIE5vZGVJZFR5cGVfcD0gICBUeXBlIG9uIHdoaWNoIHdheSB0aGUgTm9kZSBJZCB3YXMgc2V0CisvLworLy8gUmV0dXJuOiAgICAgIHRFcGxLZXJuZWwgPSBFcnJvcmNvZGUKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbE9iZHVTZXROb2RlSWQodW5zaWduZWQgaW50IHVpTm9kZUlkX3AsCisJCQkJCQl0RXBsT2JkTm9kZUlkVHlwZSBOb2RlSWRUeXBlX3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisKKwlSZXQgPSBFcGxPYmR1Q2FsU2V0Tm9kZUlkKHVpTm9kZUlkX3AsIE5vZGVJZFR5cGVfcCk7CisKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxPYmR1R2V0QWNjZXNzVHlwZSgpCisvLworLy8gRGVzY3JpcHRpb246IEZ1bmN0aW9uIHJldHVybnMgYWNjZXNzdHlwZSBvZiB0aGUgZW50cnkKKy8vCisvLyBQYXJhbWV0ZXJzOiAgdWlJbmRleF9wICAgICAgID0gICBJbmRleCBvZiB0aGUgT0QgZW50cnkKKy8vICAgICAgICAgICAgICB1aVN1YkluZGV4X3AgICAgPSAgIFN1YmluZGV4IG9mIHRoZSBPRCBFbnRyeQorLy8gICAgICAgICAgICAgIHBBY2Nlc3NUeXBfcCAgICA9ICAgcG9pbnRlciB0byBidWZmZXIgdG8gc3RvcmUgYWNjZXNzdHlwCisvLworLy8gUmV0dXJuOiAgICAgIHRFcGxLZXJuZWwgICAgICA9ICAgRXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMgRXBsT2JkdUdldEFjY2Vzc1R5cGUodW5zaWduZWQgaW50IHVpSW5kZXhfcCwKKwkJCQkJCSAgICB1bnNpZ25lZCBpbnQgdWlTdWJJbmRleF9wLAorCQkJCQkJICAgIHRFcGxPYmRBY2Nlc3MgKgorCQkJCQkJICAgIHBBY2Nlc3NUeXBfcCkKK3sKKwl0RXBsT2JkQWNjZXNzIEFjY2Vzc1R5cGU7CisKKwlBY2Nlc3NUeXBlID0KKwkgICAgRXBsT2JkdUNhbEdldEFjY2Vzc1R5cGUodWlJbmRleF9wLCB1aVN1YkluZGV4X3AsIHBBY2Nlc3NUeXBfcCk7CisKKwlyZXR1cm4gQWNjZXNzVHlwZTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsT2JkUmVhZHVFbnRyeVRvTGUoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBUaGUgZnVuY3Rpb24gcmVhZHMgYW4gb2JqZWN0IGVudHJ5IGZyb20gdGhlIGJ5dGVvZGVyCisvLyAgICAgICAgICAgICAgb2YgdGhlIHN5c3RlbSB0byB0aGUgbGl0dGxlIGVuZGlhbiBieXRlb3JkZXIgZm9yIG51bWVyaWMgdmFsdWVzLgorLy8gICAgICAgICAgICAgIEZvciBvdGhlciB0eXBlcyBhIG5vcm1hbCByZWFkIHdpbGwgYmUgcHJvY2Vzc2VkLiBUaGlzIGlzIHVzZWZ1bGwgZm9yCisvLyAgICAgICAgICAgICAgdGhlIFBETyBhbmQgU0RPIG1vZHVsZS4gVGhlIGFwcGxpY2F0aW9uCisvLyAgICAgICAgICAgICAgY2FuIGFsd2F5cyByZWFkIHRoZSBkYXRhIGV2ZW4gaWYgYXR0cmliIGtFcGxPYmRBY2NSZWFkCisvLyAgICAgICAgICAgICAgaXMgbm90IHNldC4gVGhlIGF0dHJpYiBpcyBvbmx5IGNoZWNrZWQgdXAgZm9yIFNETyB0cmFuc2Zlci4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgRVBMX01DT19ERUNMX0lOU1RBTkNFX1BUUl8KKy8vICAgICAgICAgICAgICB1aUluZGV4X3AgICAgICAgPSBJbmRleCBvZiB0aGUgT0QgZW50cnkgdG8gcmVhZAorLy8gICAgICAgICAgICAgIHVpU3ViSW5kZXhfcCAgICA9IFN1YmluZGV4IHRvIHJlYWQKKy8vICAgICAgICAgICAgICBwRHN0RGF0YV9wICAgICAgPSBwb2ludGVyIHRvIHRoZSBidWZmZXIgZm9yIGRhdGEKKy8vICAgICAgICAgICAgICBPZmZzZXRfcCAgICAgICAgPSBvZmZzZXQgaW4gZGF0YSBmb3IgcmVhZCBhY2Nlc3MKKy8vICAgICAgICAgICAgICBwU2l6ZV9wICAgICAgICAgPSBJTjogU2l6ZSBvZiB0aGUgYnVmZmVyCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1VUOiBudW1iZXIgb2YgcmVhZGVkIEJ5dGVzCisvLworLy8gUmV0dXJuOiAgICAgIHRFcGxLZXJuZWwKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbE9iZHVSZWFkRW50cnlUb0xlKHVuc2lnbmVkIGludCB1aUluZGV4X3AsCisJCQkJCQkgICAgdW5zaWduZWQgaW50IHVpU3ViSW5kZXhfcCwKKwkJCQkJCSAgICB2b2lkICpwRHN0RGF0YV9wLAorCQkJCQkJICAgIHRFcGxPYmRTaXplICogcFNpemVfcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKworCVJldCA9CisJICAgIEVwbE9iZHVDYWxSZWFkRW50cnlUb0xlKHVpSW5kZXhfcCwgdWlTdWJJbmRleF9wLCBwRHN0RGF0YV9wLAorCQkJCSAgICBwU2l6ZV9wKTsKKworCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE9iZHVXcml0ZUVudHJ5RnJvbUxlKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogRnVuY3Rpb24gd3JpdGVzIGRhdGEgdG8gYW4gT0JEIGVudHJ5IGZyb20gYSBzb3VyY2Ugd2l0aAorLy8gICAgICAgICAgICAgIGxpdHRsZSBlbmRpYW4gYnl0ZW9yZGVyIHRvIHRoZSBvZCB3aXRoIHN5c3RlbSBzcGVjdWlmaWMKKy8vICAgICAgICAgICAgICBieXRlb3JkZXIuIE5vdCBudW1lcmljIHZhbHVlcyB3aWxsIG9ubHkgYnkgY29waWVkLiBTdHJpbmdzCisvLyAgICAgICAgICAgICAgYXJlIHN0b3JlZCB3aXRoIGFkZGVkICdcMCcgY2hhcmFjdGVyLgorLy8KKy8vIFBhcmFtZXRlcnM6ICBFUExfTUNPX0RFQ0xfSU5TVEFOQ0VfUFRSXworLy8gICAgICAgICAgICAgIHVpSW5kZXhfcCAgICAgICA9ICAgSW5kZXggb2YgdGhlIE9EIGVudHJ5CisvLyAgICAgICAgICAgICAgdWlTdWJJbmRleF9wICAgID0gICBTdWJpbmRleCBvZiB0aGUgT0QgRW50cnkKKy8vICAgICAgICAgICAgICBwU3JjRGF0YV9wICAgICAgPSAgIFBvaW50ZXIgdG8gdGhlIGRhdGEgdG8gd3JpdGUKKy8vICAgICAgICAgICAgICBTaXplX3AgICAgICAgICAgPSAgIFNpemUgb2YgdGhlIGRhdGEgaW4gQnl0ZQorLy8KKy8vIFJldHVybjogICAgICB0RXBsS2VybmVsICAgICAgPSAgIEVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbE9iZHVXcml0ZUVudHJ5RnJvbUxlKHVuc2lnbmVkIGludCB1aUluZGV4X3AsCisJCQkJCQkgICAgICAgdW5zaWduZWQgaW50CisJCQkJCQkgICAgICAgdWlTdWJJbmRleF9wLAorCQkJCQkJICAgICAgIHZvaWQgKnBTcmNEYXRhX3AsCisJCQkJCQkgICAgICAgdEVwbE9iZFNpemUgU2l6ZV9wKQoreworCXRFcGxLZXJuZWwgUmV0OworCisJUmV0ID0KKwkgICAgRXBsT2JkdUNhbFdyaXRlRW50cnlGcm9tTGUodWlJbmRleF9wLCB1aVN1YkluZGV4X3AsIHBTcmNEYXRhX3AsCisJCQkJICAgICAgIFNpemVfcCk7CisKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxPYmR1U2VhcmNoVmFyRW50cnkoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBnZXRzIHZhcmlhYmxlIGZyb20gT0QKKy8vCisvLyBQYXJhbWV0ZXJzOiAgdWlJbmRleF9wICAgICAgID0gICBpbmRleCBvZiB0aGUgdmFyIGVudHJ5IHRvIHNlYXJjaAorLy8gICAgICAgICAgICAgIHVpU3ViaW5kZXhfcCAgICA9ICAgc3ViaW5kZXggb2YgdmFyIGVudHJ5IHRvIHNlYXJjaAorLy8gICAgICAgICAgICAgIHBwVmFyRW50cnlfcCAgICA9ICAgcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgdmFyZW50cnkKKy8vCisvLyBSZXR1cm46ICAgICAgdEVwbEtlcm5lbAorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMgRXBsT2JkdVNlYXJjaFZhckVudHJ5KEVQTF9NQ09fREVDTF9JTlNUQU5DRV9QVFJfCisJCQkJCQkgICAgIHVuc2lnbmVkIGludCB1aUluZGV4X3AsCisJCQkJCQkgICAgIHVuc2lnbmVkIGludCB1aVN1YmluZGV4X3AsCisJCQkJCQkgICAgIHRFcGxPYmRWYXJFbnRyeSBNRU0gKioKKwkJCQkJCSAgICAgcHBWYXJFbnRyeV9wKQoreworCXRFcGxLZXJuZWwgUmV0OworCisJUmV0ID0gRXBsT2JkdUNhbFNlYXJjaFZhckVudHJ5KHVpSW5kZXhfcCwgdWlTdWJpbmRleF9wLCBwcFZhckVudHJ5X3ApOworCisJcmV0dXJuIFJldDsKK30KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICBQIFIgSSBWIEEgVCBFICAgRiBVIE4gQyBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246CisvLworLy8gRGVzY3JpcHRpb246CisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOgorLy8KKy8vCisvLyBSZXR1cm5zOgorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZW5kaWYgLy8gI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9PQkRVKSkgIT0gMCkKKworLy8gRU9GCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbE9iZHVDYWwuYyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsT2JkdUNhbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1YjNkZjAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbE9iZHVDYWwuYwpAQCAtMCwwICsxLDU1OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIHNvdXJjZSBmaWxlIGZvciBjb21tdW5pY2F0aW9uIGFic3RyYWN0aW9uIGxheWVyCisgICAgICAgICAgICAgICAgZm9yIHRoZSBFcGwtT2JkLVVzZXJzcGFjZS1Nb2R1bAorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgJFJDU2ZpbGU6IEVwbE9iZHVDYWwuYyx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuNiAkICAkRGF0ZTogMjAwOC8xMC8xNyAxNTozMjozMiAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICAgICAgR0NDIFYzLjQKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUmV2aXNpb24gSGlzdG9yeToKKworICAyMDA2LzA2LzE5IGsudC46ICAgc3RhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSAiRXBsSW5jLmgiCisjaW5jbHVkZSAidXNlci9FcGxPYmR1Q2FsLmgiCisjaW5jbHVkZSAia2VybmVsL0VwbE9iZGsuaCIKKworI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfT0JEVSkpICE9IDApICYmIChFUExfT0JEX1VTRV9LRVJORUwgIT0gRkFMU0UpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIEcgTCBPIEIgQSBMICAgRCBFIEYgSSBOIEkgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBtb2R1bCBnbG9iYWxlIHZhcnMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgIFAgVSBCIEwgSSBDICAgRiBVIE4gQyBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsT2JkdUNhbFdyaXRlRW50cnkoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBGdW5jdGlvbiBlbmNhcHN1bGF0ZSBhY2Nlc3Mgb2YgZnVuY3Rpb24gRXBsT2JkV3JpdGVFbnRyeQorLy8KKy8vIFBhcmFtZXRlcnM6ICB1aUluZGV4X3AgICAgICAgPSAgIEluZGV4IG9mIHRoZSBPRCBlbnRyeQorLy8gICAgICAgICAgICAgIHVpU3ViSW5kZXhfcCAgICA9ICAgU3ViaW5kZXggb2YgdGhlIE9EIEVudHJ5CisvLyAgICAgICAgICAgICAgcFNyY0RhdGFfcCAgICAgID0gICBQb2ludGVyIHRvIHRoZSBkYXRhIHRvIHdyaXRlCisvLyAgICAgICAgICAgICAgU2l6ZV9wICAgICAgICAgID0gICBTaXplIG9mIHRoZSBkYXRhIGluIEJ5dGUKKy8vCisvLyBSZXR1cm46ICAgICAgdEVwbEtlcm5lbCAgICAgID0gICBFcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxPYmR1Q2FsV3JpdGVFbnRyeSh1bnNpZ25lZCBpbnQgdWlJbmRleF9wLAorCQkJCQkJICAgIHVuc2lnbmVkIGludCB1aVN1YkluZGV4X3AsCisJCQkJCQkgICAgdm9pZCAqcFNyY0RhdGFfcCwKKwkJCQkJCSAgICB0RXBsT2JkU2l6ZSBTaXplX3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfT0JESykpICE9IDApCisJUmV0ID0gRXBsT2JkV3JpdGVFbnRyeSh1aUluZGV4X3AsIHVpU3ViSW5kZXhfcCwgcFNyY0RhdGFfcCwgU2l6ZV9wKTsKKyNlbHNlCisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisjZW5kaWYKKworCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE9iZHVDYWxSZWFkRW50cnkoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBGdW5jdGlvbiBlbmNhcHN1bGF0ZSBhY2Nlc3Mgb2YgZnVuY3Rpb24gRXBsT2JkUmVhZEVudHJ5CisvLworLy8gUGFyYW1ldGVyczogIHVpSW5kZXhfcCAgICAgICA9IEluZGV4IG9vZiB0aGUgT0QgZW50cnkgdG8gcmVhZAorLy8gICAgICAgICAgICAgIHVpU3ViSW5kZXhfcCAgICA9IFN1YmluZGV4IHRvIHJlYWQKKy8vICAgICAgICAgICAgICBwRHN0RGF0YV9wICAgICAgPSBwb2ludGVyIHRvIHRoZSBidWZmZXIgZm9yIGRhdGEKKy8vICAgICAgICAgICAgICBPZmZzZXRfcCAgICAgICAgPSBvZmZzZXQgaW4gZGF0YSBmb3IgcmVhZCBhY2Nlc3MKKy8vICAgICAgICAgICAgICBwU2l6ZV9wICAgICAgICAgPSBJTjogU2l6ZSBvZiB0aGUgYnVmZmVyCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1VUOiBudW1iZXIgb2YgcmVhZGVkIEJ5dGVzCisvLworLy8gUmV0dXJuOiAgICAgIHRFcGxLZXJuZWwgICAgICA9ICAgZXJyb3Jjb2RlCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxPYmR1Q2FsUmVhZEVudHJ5KHVuc2lnbmVkIGludCB1aUluZGV4X3AsCisJCQkJCQkgICB1bnNpZ25lZCBpbnQgdWlTdWJJbmRleF9wLAorCQkJCQkJICAgdm9pZCAqcERzdERhdGFfcCwKKwkJCQkJCSAgIHRFcGxPYmRTaXplICogcFNpemVfcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKworI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9PQkRLKSkgIT0gMCkKKwlSZXQgPSBFcGxPYmRSZWFkRW50cnkodWlJbmRleF9wLCB1aVN1YkluZGV4X3AsIHBEc3REYXRhX3AsIHBTaXplX3ApOworI2Vsc2UKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKyNlbmRpZgorCisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsT2JkdUNhbEFjY2Vzc09kUGFydCgpCisvLworLy8gRGVzY3JpcHRpb246IEZ1bmN0aW9uIGVuY2Fwc3VsYXRlIGFjY2VzcyBvZiBmdW5jdGlvbiBFcGxPYmRBY2Nlc3NPZFBhcnQKKy8vCisvLyBQYXJhbWV0ZXJzOiAgT2JkUGFydF9wICAgICAgID0gb2QtcGFydCB0byByZXNldAorLy8gICAgICAgICAgICAgIERpcmVjdGlvbl9wICAgICA9IGRpcmVjdG9yeSBmbGFnIGZvcgorLy8KKy8vIFJldHVybjogICAgICB0RXBsS2VybmVsICA9IGVycm9yY29kZQorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMgRXBsT2JkdUNhbEFjY2Vzc09kUGFydCh0RXBsT2JkUGFydCBPYmRQYXJ0X3AsCisJCQkJCQkgICAgICB0RXBsT2JkRGlyIERpcmVjdGlvbl9wKQoreworCXRFcGxLZXJuZWwgUmV0OworCisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX09CREspKSAhPSAwKQorCVJldCA9IEVwbE9iZEFjY2Vzc09kUGFydChPYmRQYXJ0X3AsIERpcmVjdGlvbl9wKTsKKyNlbHNlCisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisjZW5kaWYKKworCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE9iZHVDYWxEZWZpbmVWYXIoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBGdW5jdGlvbiBlbmNhcHN1bGF0ZSBhY2Nlc3Mgb2YgZnVuY3Rpb24gRXBsT2JkRGVmaW5lVmFyCisvLworLy8gUGFyYW1ldGVyczogIHBFcGxWYXJQYXJhbV9wID0gdmFyZW50cnkKKy8vCisvLyBSZXR1cm46ICAgICAgdEVwbEtlcm5lbCAgPSAgIGVycm9yY29kZQorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMgRXBsT2JkdUNhbERlZmluZVZhcih0RXBsVmFyUGFyYW0gTUVNICoKKwkJCQkJCSAgIHBWYXJQYXJhbV9wKQoreworCXRFcGxLZXJuZWwgUmV0OworCisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX09CREspKSAhPSAwKQorCVJldCA9IEVwbE9iZERlZmluZVZhcihwVmFyUGFyYW1fcCk7CisjZWxzZQorCVJldCA9IGtFcGxTdWNjZXNzZnVsOworI2VuZGlmCisKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxPYmR1Q2FsR2V0T2JqZWN0RGF0YVB0cigpCisvLworLy8gRGVzY3JpcHRpb246IEZ1bmN0aW9uIGVuY2Fwc3VsYXRlIGFjY2VzcyBvZiBmdW5jdGlvbiBFcGxPYmRHZXRPYmplY3REYXRhUHRyCisvLworLy8gUGFyYW1ldGVyczogIHVpSW5kZXhfcCAgICA9ICAgSW5kZXggb2YgdGhlIGVudHJ5CisvLyAgICAgICAgICAgICAgdWlTdWJpbmRleF9wID0gICBTdWJpbmRleCBvZiB0aGUgZW50cnkKKy8vCisvLyBSZXR1cm46ICAgICAgdm9pZCAqICAgID0gcG9pbnRlciB0byBvYmplY3QgZGF0YQorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdm9pZCAqUFVCTElDIEVwbE9iZHVDYWxHZXRPYmplY3REYXRhUHRyKHVuc2lnbmVkIGludCB1aUluZGV4X3AsCisJCQkJCQkgICAgIHVuc2lnbmVkIGludCB1aVN1YkluZGV4X3ApCit7CisJdm9pZCAqcERhdGE7CisKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfT0JESykpICE9IDApCisJcERhdGEgPSBFcGxPYmRHZXRPYmplY3REYXRhUHRyKHVpSW5kZXhfcCwgdWlTdWJJbmRleF9wKTsKKyNlbHNlCisJcERhdGEgPSBOVUxMOworI2VuZGlmCisKKwlyZXR1cm4gcERhdGE7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE9iZHVDYWxSZWdpc3RlclVzZXJPZCgpCisvLworLy8gRGVzY3JpcHRpb246IEZ1bmN0aW9uIGVuY2Fwc3VsYXRlIGFjY2VzcyBvZiBmdW5jdGlvbiBFcGxPYmRSZWdpc3RlclVzZXJPZAorLy8KKy8vIFBhcmFtZXRlcnM6ICBwVXNlck9kX3AgICA9IHBvaW50ZXIgdG8gdXNlciBPRAorLy8KKy8vIFJldHVybjogICAgIHRFcGxLZXJuZWwgPSBlcnJvcmNvZGUKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2lmIChkZWZpbmVkIChFUExfT0JEX1VTRVJfT0QpICYmIChFUExfT0JEX1VTRVJfT0QgIT0gRkFMU0UpKQorRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbE9iZHVDYWxSZWdpc3RlclVzZXJPZCh0RXBsT2JkRW50cnlQdHIKKwkJCQkJCQlwVXNlck9kX3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfT0JESykpICE9IDApCisJUmV0ID0gRXBsT2JkUmVnaXN0ZXJVc2VyT2QocFVzZXJPZF9wKTsKKyNlbHNlCisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisjZW5kaWYKKworCXJldHVybiBSZXQ7CisKK30KKyNlbmRpZgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsT2JkdUNhbEluaXRWYXJFbnRyeSgpCisvLworLy8gRGVzY3JpcHRpb246IEZ1bmN0aW9uIGVuY2Fwc3VsYXRlIGFjY2VzcyBvZiBmdW5jdGlvbiBFcGxPYmRJbml0VmFyRW50cnkKKy8vCisvLyBQYXJhbWV0ZXJzOiAgcFZhckVudHJ5X3AgPSBwb2ludGVyIHRvIHZhciBlbnRyeSBzdHJ1Y3R1cmUKKy8vICAgICAgICAgICAgICBiVHlwZV9wICAgICA9IG9iamVjdCB0eXBlCisvLyAgICAgICAgICAgICAgT2JkU2l6ZV9wICAgPSBzaXplIG9mIG9iamVjdCBkYXRhCisvLworLy8gUmV0dXJuczogICAgIG5vbmUKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHZvaWQgUFVCTElDIEVwbE9iZHVDYWxJbml0VmFyRW50cnkodEVwbE9iZFZhckVudHJ5IE1FTSAqCisJCQkJCQlwVmFyRW50cnlfcCwgQllURSBiVHlwZV9wLAorCQkJCQkJdEVwbE9iZFNpemUgT2JkU2l6ZV9wKQoreworI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9PQkRLKSkgIT0gMCkKKwlFcGxPYmRJbml0VmFyRW50cnkocFZhckVudHJ5X3AsIGJUeXBlX3AsIE9iZFNpemVfcCk7CisjZW5kaWYKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsT2JkdUNhbEdldERhdGFTaXplKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogRnVuY3Rpb24gZW5jYXBzdWxhdGUgYWNjZXNzIG9mIGZ1bmN0aW9uIEVwbE9iZEdldERhdGFTaXplCisvLworLy8gICAgICAgICAgICAgIGdldHMgdGhlIGRhdGEgc2l6ZSBvZiBhbiBvYmplY3QKKy8vICAgICAgICAgICAgICBmb3Igc3RyaW5nIG9iamVjdHMgaXQgcmV0dXJuZXMgdGhlIHN0cmluZyBsZW5ndGgKKy8vCisvLyBQYXJhbWV0ZXJzOiAgdWlJbmRleF9wICAgPSAgIEluZGV4CisvLyAgICAgICAgICAgICAgdWlTdWJJbmRleF9wPSAgIFN1YmluZGV4CisvLworLy8gUmV0dXJuOiAgICAgIHRFcGxPYmRTaXplCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VQTERMTEVYUE9SVCB0RXBsT2JkU2l6ZSBQVUJMSUMgRXBsT2JkdUNhbEdldERhdGFTaXplKHVuc2lnbmVkIGludCB1aUluZGV4X3AsCisJCQkJCQkgICAgICB1bnNpZ25lZCBpbnQgdWlTdWJJbmRleF9wKQoreworCXRFcGxPYmRTaXplIFNpemU7CisKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfT0JESykpICE9IDApCisJU2l6ZSA9IEVwbE9iZEdldERhdGFTaXplKHVpSW5kZXhfcCwgdWlTdWJJbmRleF9wKTsKKyNlbHNlCisJU2l6ZSA9IDA7CisjZW5kaWYKKworCXJldHVybiBTaXplOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxPYmR1Q2FsR2V0Tm9kZUlkKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogRnVuY3Rpb24gZW5jYXBzdWxhdGUgYWNjZXNzIG9mIGZ1bmN0aW9uIEVwbE9iZEdldE5vZGVJZAorLy8KKy8vCisvLyBQYXJhbWV0ZXJzOgorLy8KKy8vIFJldHVybjogICAgICB1bnNpZ25lZCBpbnQgPSBOb2RlIElkCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VQTERMTEVYUE9SVCB1bnNpZ25lZCBpbnQgUFVCTElDIEVwbE9iZHVDYWxHZXROb2RlSWQoKQoreworCXVuc2lnbmVkIGludCB1aU5vZGVJZDsKKworI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9PQkRLKSkgIT0gMCkKKwl1aU5vZGVJZCA9IEVwbE9iZEdldE5vZGVJZCgpOworI2Vsc2UKKwl1aU5vZGVJZCA9IDA7CisjZW5kaWYKKworCXJldHVybiB1aU5vZGVJZDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsT2JkdUNhbFNldE5vZGVJZCgpCisvLworLy8gRGVzY3JpcHRpb246IEZ1bmN0aW9uIGVuY2Fwc3VsYXRlIGFjY2VzcyBvZiBmdW5jdGlvbiBFcGxPYmRTZXROb2RlSWQKKy8vCisvLworLy8gUGFyYW1ldGVyczogIHVpTm9kZUlkX3AgID0gICBOb2RlIElkIHRvIHNldAorLy8gICAgICAgICAgICAgIE5vZGVJZFR5cGVfcD0gICBUeXBlIG9uIHdoaWNoIHdheSB0aGUgTm9kZSBJZCB3YXMgc2V0CisvLworLy8gUmV0dXJuOiAgICAgIHRFcGxLZXJuZWwgPSBFcnJvcmNvZGUKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbE9iZHVDYWxTZXROb2RlSWQodW5zaWduZWQgaW50IHVpTm9kZUlkX3AsCisJCQkJCQkgICB0RXBsT2JkTm9kZUlkVHlwZQorCQkJCQkJICAgTm9kZUlkVHlwZV9wKQoreworCXRFcGxLZXJuZWwgUmV0OworCisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX09CREspKSAhPSAwKQorCVJldCA9IEVwbE9iZFNldE5vZGVJZCh1aU5vZGVJZF9wLCBOb2RlSWRUeXBlX3ApOworI2Vsc2UKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKyNlbmRpZgorCisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsT2JkdUNhbEdldEFjY2Vzc1R5cGUoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBGdW5jdGlvbiBlbmNhcHN1bGF0ZSBhY2Nlc3Mgb2YgZnVuY3Rpb24gRXBsT2JkR2V0QWNjZXNzVHlwZQorLy8KKy8vIFBhcmFtZXRlcnM6ICB1aUluZGV4X3AgICAgICAgPSAgIEluZGV4IG9mIHRoZSBPRCBlbnRyeQorLy8gICAgICAgICAgICAgIHVpU3ViSW5kZXhfcCAgICA9ICAgU3ViaW5kZXggb2YgdGhlIE9EIEVudHJ5CisvLyAgICAgICAgICAgICAgcEFjY2Vzc1R5cF9wICAgID0gICBwb2ludGVyIHRvIGJ1ZmZlciB0byBzdG9yZSBhY2Nlc3N0eXBlCisvLworLy8gUmV0dXJuOiAgICAgIHRFcGxLZXJuZWwgICAgICA9ICAgZXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMgRXBsT2JkdUNhbEdldEFjY2Vzc1R5cGUodW5zaWduZWQgaW50IHVpSW5kZXhfcCwKKwkJCQkJCSAgICAgICB1bnNpZ25lZCBpbnQKKwkJCQkJCSAgICAgICB1aVN1YkluZGV4X3AsCisJCQkJCQkgICAgICAgdEVwbE9iZEFjY2VzcyAqCisJCQkJCQkgICAgICAgcEFjY2Vzc1R5cF9wKQoreworCXRFcGxPYmRBY2Nlc3MgQWNjZXNUeXBlOworCisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX09CREspKSAhPSAwKQorCUFjY2VzVHlwZSA9IEVwbE9iZEdldEFjY2Vzc1R5cGUodWlJbmRleF9wLCB1aVN1YkluZGV4X3AsIHBBY2Nlc3NUeXBfcCk7CisjZWxzZQorCUFjY2VzVHlwZSA9IDA7CisjZW5kaWYKKworCXJldHVybiBBY2Nlc1R5cGU7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsT2JkdUNhbFJlYWRFbnRyeVRvTGUoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBGdW5jdGlvbiBlbmNhcHN1bGF0ZSBhY2Nlc3Mgb2YgZnVuY3Rpb24gRXBsT2JkUmVhZEVudHJ5VG9MZQorLy8KKy8vIFBhcmFtZXRlcnM6ICB1aUluZGV4X3AgICAgICAgPSBJbmRleCBvZiB0aGUgT0QgZW50cnkgdG8gcmVhZAorLy8gICAgICAgICAgICAgIHVpU3ViSW5kZXhfcCAgICA9IFN1YmluZGV4IHRvIHJlYWQKKy8vICAgICAgICAgICAgICBwRHN0RGF0YV9wICAgICAgPSBwb2ludGVyIHRvIHRoZSBidWZmZXIgZm9yIGRhdGEKKy8vICAgICAgICAgICAgICBPZmZzZXRfcCAgICAgICAgPSBvZmZzZXQgaW4gZGF0YSBmb3IgcmVhZCBhY2Nlc3MKKy8vICAgICAgICAgICAgICBwU2l6ZV9wICAgICAgICAgPSBJTjogU2l6ZSBvZiB0aGUgYnVmZmVyCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1VUOiBudW1iZXIgb2YgcmVhZGVkIEJ5dGVzCisvLworLy8gUmV0dXJuOiAgICAgIHRFcGxLZXJuZWwKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbE9iZHVDYWxSZWFkRW50cnlUb0xlKHVuc2lnbmVkIGludCB1aUluZGV4X3AsCisJCQkJCQkgICAgICAgdW5zaWduZWQgaW50CisJCQkJCQkgICAgICAgdWlTdWJJbmRleF9wLAorCQkJCQkJICAgICAgIHZvaWQgKnBEc3REYXRhX3AsCisJCQkJCQkgICAgICAgdEVwbE9iZFNpemUgKiBwU2l6ZV9wKQoreworCXRFcGxLZXJuZWwgUmV0OworCisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX09CREspKSAhPSAwKQorCVJldCA9IEVwbE9iZFJlYWRFbnRyeVRvTGUodWlJbmRleF9wLCB1aVN1YkluZGV4X3AsIHBEc3REYXRhX3AsIHBTaXplX3ApOworI2Vsc2UKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKyNlbmRpZgorCisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsT2JkdUNhbFdyaXRlRW50cnlGcm9tTGUoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBGdW5jdGlvbiBlbmNhcHN1bGF0ZSBhY2Nlc3Mgb2YgZnVuY3Rpb24gRXBsT2JkV3JpdGVFbnRyeUZyb21MZQorLy8KKy8vIFBhcmFtZXRlcnM6ICB1aUluZGV4X3AgICAgICAgPSAgIEluZGV4IG9mIHRoZSBPRCBlbnRyeQorLy8gICAgICAgICAgICAgIHVpU3ViSW5kZXhfcCAgICA9ICAgU3ViaW5kZXggb2YgdGhlIE9EIEVudHJ5CisvLyAgICAgICAgICAgICAgcFNyY0RhdGFfcCAgICAgID0gICBQb2ludGVyIHRvIHRoZSBkYXRhIHRvIHdyaXRlCisvLyAgICAgICAgICAgICAgU2l6ZV9wICAgICAgICAgID0gICBTaXplIG9mIHRoZSBkYXRhIGluIEJ5dGUKKy8vCisvLyBSZXR1cm46ICAgICAgdEVwbEtlcm5lbCAgICAgID0gICBFcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxPYmR1Q2FsV3JpdGVFbnRyeUZyb21MZSh1bnNpZ25lZCBpbnQKKwkJCQkJCQkgIHVpSW5kZXhfcCwKKwkJCQkJCQkgIHVuc2lnbmVkIGludAorCQkJCQkJCSAgdWlTdWJJbmRleF9wLAorCQkJCQkJCSAgdm9pZCAqcFNyY0RhdGFfcCwKKwkJCQkJCQkgIHRFcGxPYmRTaXplIFNpemVfcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKworI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9PQkRLKSkgIT0gMCkKKwlSZXQgPQorCSAgICBFcGxPYmRXcml0ZUVudHJ5RnJvbUxlKHVpSW5kZXhfcCwgdWlTdWJJbmRleF9wLCBwU3JjRGF0YV9wLCBTaXplX3ApOworI2Vsc2UKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKyNlbmRpZgorCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE9iZHVDYWxTZWFyY2hWYXJFbnRyeSgpCisvLworLy8gRGVzY3JpcHRpb246IGdldHMgdmFyaWFibGUgZnJvbSBPRAorLy8KKy8vIFBhcmFtZXRlcnM6ICB1aUluZGV4X3AgICAgICAgPSAgIGluZGV4IG9mIHRoZSB2YXIgZW50cnkgdG8gc2VhcmNoCisvLyAgICAgICAgICAgICAgdWlTdWJpbmRleF9wICAgID0gICBzdWJpbmRleCBvZiB2YXIgZW50cnkgdG8gc2VhcmNoCisvLyAgICAgICAgICAgICAgcHBWYXJFbnRyeV9wICAgID0gICBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSB2YXJlbnRyeQorLy8KKy8vIFJldHVybjogICAgICB0RXBsS2VybmVsCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQworRXBsT2JkdUNhbFNlYXJjaFZhckVudHJ5KEVQTF9NQ09fREVDTF9JTlNUQU5DRV9QVFJfIHVuc2lnbmVkIGludCB1aUluZGV4X3AsCisJCQkgdW5zaWduZWQgaW50IHVpU3ViaW5kZXhfcCwKKwkJCSB0RXBsT2JkVmFyRW50cnkgTUVNICoqIHBwVmFyRW50cnlfcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKworI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9PQkRLKSkgIT0gMCkKKwlSZXQgPSBFcGxPYmRTZWFyY2hWYXJFbnRyeSh1aUluZGV4X3AsIHVpU3ViaW5kZXhfcCwgcHBWYXJFbnRyeV9wKTsKKyNlbHNlCisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisjZW5kaWYKKwlyZXR1cm4gUmV0OworfQorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgIFAgUiBJIFYgQSBUIEUgICBGIFUgTiBDIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjoKKy8vCisvLyBEZXNjcmlwdGlvbjoKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6CisvLworLy8KKy8vIFJldHVybnM6CisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNlbmRpZiAvLygoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfT0JEVSkpICE9IDApCisKKy8vIEVPRgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxPYmpEZWYuaCBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsT2JqRGVmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzcxMzEyNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsT2JqRGVmLmgKQEAgLTAsMCArMSwyMDggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBkZWZpbmVzIG9iamRpY3QgZGljdGlvbmFyeQorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgJFJDU2ZpbGU6IEVwbE9iakRlZi5oLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS40ICQgICREYXRlOiAyMDA4LzA0LzE3IDIxOjM2OjMyICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorICAgICAgICAgICAgICAgICAgICBHQ0MgVjMuNAorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgIDIwMDYvMDYvMDYgICAgay50LjogICB0YWtlIE9iakRlZi5oIGZyb20gQ0FOb3BlbiBhbmQgbW9kaWZ5IGZvciBFUEwKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfRVBMT0JKREVGX0hfCisjZGVmaW5lIF9FUExPQkpERUZfSF8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHNlY3VyaXR5IGNoZWNrcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIG1hY3JvcyB0byBoZWxwIGJ1aWxkaW5nIE9ECisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2lmIChkZWZpbmVkIChFUExfT0JEX1VTRV9WQVJJQUJMRV9TVUJJTkRFWF9UQUIpICYmIChFUExfT0JEX1VTRV9WQVJJQUJMRV9TVUJJTkRFWF9UQUIgIT0gRkFMU0UpKQorCisjZGVmaW5lIENDTV9TVUJJTkRFWF9SQU1fT05MWShhKSAgICBhOworI2RlZmluZSBDQ01fU1VCSU5ERVhfUkFNX09ORU9GKGEsYikgYQorCisjZWxzZQorCisjZGVmaW5lIENDTV9TVUJJTkRFWF9SQU1fT05MWShhKQorI2RlZmluZSBDQ01fU1VCSU5ERVhfUkFNX09ORU9GKGEsYikgYgorCisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFRvIHByZXZlbnQgdW51c2VkIG1lbW9yeSBpbiBzdWJpbmRleCB0YWJsZXMgd2UgbmVlZCB0aGlzIG1hY3JvLgorLy8gQnV0IG5vdCBhbGwgY29tcGlsZXJzIHN1cHBvcnQgdG8gcHJlc2V0IHRoZSBsYXN0IHN0cnVjdCB2YWx1ZSBmb2xsb3dlZCBieSBhIGNvbW1hLgorLy8gQ29tcGlsZXJzIHdoaWNoIGRvZXMgbm90IHN1cHBvcnQgYSBjb21tYSBhZnRlciBsYXN0IHN0cnVjdCB2YWx1ZSBoYXMgdG8gcGxhY2UgaW4gYSBkdW1teSBzdWJpbmRleC4KKyNpZiAoKERFVl9TWVNURU0gJiBfREVWX0NPTU1BX0VYVF8pICE9IDApCisKKyNkZWZpbmUgRVBMX09CRF9FTkRfU1VCSU5ERVgoKQorI2RlZmluZSBFUExfT0JEX01BWF9BUlJBWV9TVUJFTlRSSUVTICAgIDIKKworI2Vsc2UKKworI2RlZmluZSBFUExfT0JEX0VORF9TVUJJTkRFWCgpICAgICAgICAgIHswLDAsMCxOVUxMLE5VTEx9CisjZGVmaW5lIEVQTF9PQkRfTUFYX0FSUkFZX1NVQkVOVFJJRVMgICAgMworCisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBnbG9iYWxlIHZhcnMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjcmVhdGlvbiBvZiBkYXRhIGluIFJPTSBtZW1vcnkKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgRVBMX09CRF9DUkVBVEVfUk9NX0RBVEEKKyNpbmNsdWRlICJvYmpkaWN0LmgiCisjdW5kZWYgRVBMX09CRF9DUkVBVEVfUk9NX0RBVEEKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY3JlYXRpb24gb2YgZGF0YSBpbiBSQU0gbWVtb3J5CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNkZWZpbmUgRVBMX09CRF9DUkVBVEVfUkFNX0RBVEEKKyNpbmNsdWRlICJvYmpkaWN0LmgiCisjdW5kZWYgRVBMX09CRF9DUkVBVEVfUkFNX0RBVEEKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY3JlYXRpb24gb2Ygc3ViaW5kZXggdGFibGVzIGluIFJPTSBhbmQgUkFNCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNkZWZpbmUgRVBMX09CRF9DUkVBVEVfU1VCSU5ERVhfVEFCCisjaW5jbHVkZSAib2JqZGljdC5oIgorI3VuZGVmIEVQTF9PQkRfQ1JFQVRFX1NVQklOREVYX1RBQgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjcmVhdGlvbiBvZiBpbmRleCB0YWJsZXMgZm9yIGdlbmVyaWMsIG1hbnVmYWN0dXJlciBhbmQgZGV2aWNlIHBhcnQKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2RlZmluZSBFUExfT0JEX0NSRUFURV9JTkRFWF9UQUIKKyNpbmNsdWRlICJvYmpkaWN0LmgiCisjdW5kZWYgRVBMX09CRF9DUkVBVEVfSU5ERVhfVEFCCisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgUCBVIEIgTCBJIEMgICBGIFUgTiBDIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVQTF9PQkRfSU5JVF9SQU1fTkFNRSgpCisvLworLy8gRGVzY3JpcHRpb246IGZ1bmN0aW9uIHRvIGluaXRpYWxpemUgb2JqZWN0IGRpY3Rpb25hcnkKKy8vCisvLyBQYXJhbWV0ZXJzOiAgcEluaXRQYXJhbV9wICAgID0gcG9pbnRlciB0byBpbml0IHBhcmFtIHN0cnVjdCBvZiBFcGwKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vIFN0YXRlOgorLy8KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVQTF9PQkRfSU5JVF9SQU1fTkFNRSh0RXBsT2JkSW5pdFBhcmFtIE1FTSAqCisJCQkJCQkgICAgIHBJbml0UGFyYW1fcCkKK3sKKworCXRFcGxPYmRJbml0UGFyYW0gTUVNICpwSW5pdFBhcmFtID0gcEluaXRQYXJhbV9wOworCisJLy8gY2hlY2sgaWYgcG9pbnRlciB0byBwYXJhbWV0ZXIgc3RydWN0dXJlIGlzIHZhbGlkCisJLy8gaWYgbm90IHRoZW4gb25seSBjb3B5IHN1YmluZGV4IHRhYmxlcyBiZWxvdworCWlmIChwSW5pdFBhcmFtICE9IE5VTEwpIHsKKwkJLy8gYXQgZmlyc3QgZGVsZXRlIGFsbCBwYXJhbWV0ZXJzIChhbGwgcG9pbnRlcnMgd2lsbCBiZSBzZXQgenUgTlVMTCkKKwkJRVBMX01FTVNFVChwSW5pdFBhcmFtLCAwLCBzaXplb2YodEVwbE9iZEluaXRQYXJhbSkpOworCisjZGVmaW5lIEVQTF9PQkRfQ1JFQVRFX0lOSVRfRlVOQ1RJT04KKwkJeworCQkJLy8gaW5zZXJ0cyBjb2RlIHRvIGluaXQgcG9pbnRlciB0byBpbmRleCB0YWJsZXMKKyNpbmNsdWRlICJvYmpkaWN0LmgiCisJCX0KKyN1bmRlZiBFUExfT0JEX0NSRUFURV9JTklUX0ZVTkNUSU9OCisKKyNpZiAoZGVmaW5lZCAoRVBMX09CRF9VU0VSX09EKSAmJiAoRVBMX09CRF9VU0VSX09EICE9IEZBTFNFKSkKKwkJeworCQkJLy8gdG8gYmVnaW4gbm8gdXNlciBPRCBpcyBkZWZpbmVkCisJCQlwSW5pdFBhcmFtX3AtPm1fcFVzZXJQYXJ0ID0gTlVMTDsKKwkJfQorI2VuZGlmCisJfQorI2RlZmluZSBFUExfT0JEX0NSRUFURV9JTklUX1NVQklOREVYCisJeworCQkvLyBpbnNlcnRzIGNvZGUgdG8gY29weSBzdWJpbmRleCB0YWJsZXMKKyNpbmNsdWRlICJvYmpkaWN0LmgiCisJfQorI3VuZGVmIEVQTF9PQkRfQ1JFQVRFX0lOSVRfU1VCSU5ERVgKKworCXJldHVybiBrRXBsU3VjY2Vzc2Z1bDsKKworfQorCisjZW5kaWYgLy8gX0VQTE9CSkRFRl9IXworCisvLyBEaWUgbGV0enRlIFplaWxlIG113yB1bmJlZGluZ3QgZWluZSBsZWVyZSBaZWlsZSBzZWluLCB3ZWlsIG1hbmNoZSBDb21waWxlcgorLy8gZGFtaXQgZWluIFByb2JsZW0gaGFiZW4sIHdlbm4gZGFzIG5pY2h0IHNvIGlzdCAoei5CLiBHTlUgb2RlciBCb3JsYW5kIEMrKyBCdWlsZGVyKS4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsUGRvLmggYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbFBkby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyMmFjODYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbFBkby5oCkBAIC0wLDAgKzEsMTE3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgb3BlblBPV0VSTElOSworCisgIERlc2NyaXB0aW9uOiAgaW5jbHVkZSBmaWxlIGZvciBQRE8gbW9kdWxlCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRXBsUGRvLmgsdiAkCisKKyAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAorCisgICAgICAgICAgICAgICAgJFJldmlzaW9uOiAxLjUgJCAgJERhdGU6IDIwMDgvMDQvMTcgMjE6MzY6MzIgJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgICAgIEdDQyBWMy40CisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwNi8wNS8yMiBkLmsuOiAgIHN0YXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiwgdmVyc2lvbiAxLjAwCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX0VQTF9QRE9fSF8KKyNkZWZpbmUgX0VQTF9QRE9fSF8KKworI2luY2x1ZGUgIkVwbEluYy5oIgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gaW52YWxpZCBQRE8tTm9kZUlkCisjZGVmaW5lIEVQTF9QRE9fSU5WQUxJRF9OT0RFX0lEICAgICAweEZGCisvLyBOb2RlSWQgZm9yIFBSZXEgUlBETworI2RlZmluZSBFUExfUERPX1BSRVFfTk9ERV9JRCAgICAgICAgMHgwMAorLy8gTm9kZUlkIGZvciBQUmVzIFRQRE8KKyNkZWZpbmUgRVBMX1BET19QUkVTX05PREVfSUQgICAgICAgIDB4MDAKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHR5cGVkZWYKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3R5cGVkZWYgc3RydWN0IHsKKwl2b2lkICptX3BWYXI7CisJV09SRCBtX3dPZmZzZXQ7CQkvLyBpbiBCaXRzCisJV09SRCBtX3dTaXplOwkJLy8gaW4gQml0cworCUJPT0wgbV9mTnVtZXJpYzsJLy8gbnVtZXJpYyB2YWx1ZSAtPiB1c2UgQU1JIGZ1bmN0aW9ucworCit9IHRFcGxQZG9NYXBwaW5nOworCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgaW50IG1fdWlTaXplT2ZTdHJ1Y3Q7CisJdW5zaWduZWQgaW50IG1fdWlQZG9JZDsKKwl1bnNpZ25lZCBpbnQgbV91aU5vZGVJZDsKKwkvLyAweEZGPWludmFsaWQsIFJQRE86IDB4MDA9UFJlcSwgbG9jYWxOb2RlSWQ9UFJlcywgcmVtb3RlTm9kZUlkPVBSZXMKKwkvLyAgICAgICAgICAgICAgIFRQRE86IDB4MDA9UFJlcywgTU46IENuTm9kZUlkPVBSZXEKKworCUJPT0wgbV9mVHhSeDsKKwlCWVRFIG1fYk1hcHBpbmdWZXJzaW9uOworCXVuc2lnbmVkIGludCBtX3VpTWF4TWFwcGluZ0VudHJpZXM7CS8vIG1heGltdW0gbnVtYmVyIG9mIG1hcHBpbmcgZW50cmllcywgaS5lLiBzaXplIG9mIG1fYVBkb01hcHBpbmcKKwl0RXBsUGRvTWFwcGluZyBtX2FQZG9NYXBwaW5nWzFdOworCit9IHRFcGxQZG9QYXJhbTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNlbmRpZiAvLyAjaWZuZGVmIF9FUExfUERPX0hfCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbFBkb2suYyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsUGRvay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1OTk5YjQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbFBkb2suYwpAQCAtMCwwICsxLDY5NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIHNvdXJjZSBmaWxlIGZvciBrZXJuZWwgUERPIG1vZHVsZQorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgJFJDU2ZpbGU6IEVwbFBkb2suYyx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuOCAkICAkRGF0ZTogMjAwOC8xMC8xNyAxNTozMjozMiAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICAgICAgR0NDIFYzLjQKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUmV2aXNpb24gSGlzdG9yeToKKworICAyMDA2LzA1LzIyIGQuay46ICAgc3RhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uLCB2ZXJzaW9uIDEuMDAKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgImtlcm5lbC9FcGxQZG9rLmgiCisjaW5jbHVkZSAia2VybmVsL0VwbFBkb2tDYWwuaCIKKyNpbmNsdWRlICJrZXJuZWwvRXBsRXZlbnRrLmgiCisjaW5jbHVkZSAia2VybmVsL0VwbE9iZGsuaCIKKworI2lmIChERVZfU1lTVEVNID09IF9ERVZfR05VX0NGNTQ4WF8pCisjaW5jbHVkZSAicGxjY29yZS5oIgorI2RlZmluZSBQRE9fTEVEIDB4MDgKKyNlbmRpZgorCisjaWYgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9QRE9LKSkgIT0gMCkKKworI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfRExMSykpID09IDApCisKKyNlcnJvciAnRVJST1I6IE1pc3NpbmcgRExMay1Nb2R1bCEnCisKKyNlbmRpZgorCisjaWYgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9PQkRLKSkgPT0gMCkKKworI2Vycm9yICdFUlJPUjogTWlzc2luZyBPQkRrLU1vZHVsIScKKworI2VuZGlmCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICBHIEwgTyBCIEEgTCAgIEQgRSBGIEkgTiBJIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2RlZmluZSBFUExfUERPS19PQkRfSURYX1JYX0NPTU1fUEFSQU0gIDB4MTQwMAorI2RlZmluZSBFUExfUERPS19PQkRfSURYX1JYX01BUFBfUEFSQU0gIDB4MTYwMAorI2RlZmluZSBFUExfUERPS19PQkRfSURYX1RYX0NPTU1fUEFSQU0gIDB4MTgwMAorI2RlZmluZSBFUExfUERPS19PQkRfSURYX1RYX01BUFBfUEFSQU0gIDB4MUEwMAorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBtb2R1bCBnbG9iYWxlIHZhcnMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICBDIEwgQSBTIFMgIEVwbFBkb2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLy8KKy8vIERlc2NyaXB0aW9uOgorLy8KKy8vCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgIFAgUiBJIFYgQSBUIEUgICBEIEUgRiBJIE4gSSBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvbnN0IGRlZmluZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCB0eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvY2FsIHZhcnMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgIFAgVSBCIEwgSSBDICAgRiBVIE4gQyBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsUGRva0FkZEluc3RhbmNlKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogYWRkIGFuZCBpbml0aWFsaXplIG5ldyBpbnN0YW5jZSBvZiBFUEwgc3RhY2sKKy8vCisvLyBQYXJhbWV0ZXJzOiAgbm9uZQorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordEVwbEtlcm5lbCBFcGxQZG9rQWRkSW5zdGFuY2Uodm9pZCkKK3sKKworCXJldHVybiBrRXBsU3VjY2Vzc2Z1bDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsUGRva0RlbEluc3RhbmNlKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogZGVsZXRlcyBhbiBpbnN0YW5jZSBvZiBFUEwgc3RhY2sKKy8vCisvLyBQYXJhbWV0ZXJzOiAgbm9uZQorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordEVwbEtlcm5lbCBFcGxQZG9rRGVsSW5zdGFuY2Uodm9pZCkKK3sKKworCXJldHVybiBrRXBsU3VjY2Vzc2Z1bDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsUGRva0NiUGRvUmVjZWl2ZWQKKy8vCisvLyBEZXNjcmlwdGlvbjogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgRExMIGlmIFBSZXMgb3IgUFJlcSBmcmFtZSB3YXMKKy8vICAgICAgICAgICAgICByZWNlaXZlZC4gSXQgcG9zdHMgdGhlIGZyYW1lIHRvIHRoZSBldmVudCBxdWV1ZS4KKy8vICAgICAgICAgICAgICBJdCBpcyBjYWxsZWQgaW4gc3RhdGVzIE5NVF9DU19SRUFEWV9UT19PUEVSQVRFIGFuZCBOTVRfQ1NfT1BFUkFUSU9OQUwuCisvLyAgICAgICAgICAgICAgVGhlIHBhc3NlZCBQRE8gbmVlZHMgbm90IHRvIGJlIHZhbGlkLgorLy8KKy8vIFBhcmFtZXRlcnM6ICBwRnJhbWVJbmZvX3AgICAgICAgICAgICA9IHBvaW50ZXIgdG8gZnJhbWUgaW5mbyBzdHJ1Y3R1cmUKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgRXBsUGRva0NiUGRvUmVjZWl2ZWQodEVwbEZyYW1lSW5mbyAqIHBGcmFtZUluZm9fcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCXRFcGxFdmVudCBFdmVudDsKKworI2lmIChERVZfU1lTVEVNID09IF9ERVZfR05VX0NGNTQ4WF8pCisJLy8gcmVzZXQgTEVECisvLyAgICBNQ0ZfR1BJT19QT0RSX1BDSUJHICY9IH5QRE9fTEVEOyAgLy8gTGV2ZWwKKyNlbmRpZgorCisJRXZlbnQubV9FdmVudFNpbmsgPSBrRXBsRXZlbnRTaW5rUGRvazsKKwlFdmVudC5tX0V2ZW50VHlwZSA9IGtFcGxFdmVudFR5cGVQZG9SeDsKKwkvLyBsaW1pdCBjb3BpZWQgZGF0YSB0byBzaXplIG9mIFBETyAoYmVjYXVzZSBmcm9tIHNvbWUgQ05zIHRoZSBmcmFtZSBpcyBsYXJnZXIgdGhhbiBuZWNlc3NhcnkpCisJRXZlbnQubV91aVNpemUgPSBBbWlHZXRXb3JkRnJvbUxlKCZwRnJhbWVJbmZvX3AtPm1fcEZyYW1lLT5tX0RhdGEubV9QcmVzLm1fbGVfd1NpemUpICsgMjQ7CS8vIHBGcmFtZUluZm9fcC0+bV91aUZyYW1lU2l6ZTsKKwlFdmVudC5tX3BBcmcgPSBwRnJhbWVJbmZvX3AtPm1fcEZyYW1lOworCVJldCA9IEVwbEV2ZW50a1Bvc3QoJkV2ZW50KTsKKworI2lmIChERVZfU1lTVEVNID09IF9ERVZfR05VX0NGNTQ4WF8pCisJLy8gc2V0IExFRAorLy8gICAgTUNGX0dQSU9fUE9EUl9QQ0lCRyB8PSBQRE9fTEVEOyAgLy8gTGV2ZWwKKyNlbmRpZgorCisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsUGRva0NiUGRvVHJhbnNtaXR0ZWQKKy8vCisvLyBEZXNjcmlwdGlvbjogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgRExMIGlmIFBSZXMgb3IgUFJlcSBmcmFtZSB3YXMKKy8vICAgICAgICAgICAgICBzZW50LiBJdCBwb3N0cyB0aGUgcG9pbnRlciB0byB0aGUgZnJhbWUgdG8gdGhlIGV2ZW50IHF1ZXVlLgorLy8gICAgICAgICAgICAgIEl0IGlzIGNhbGxlZCBpbiBOTVRfQ1NfUFJFX09QRVJBVElPTkFMXzIsCisvLyAgICAgICAgICAgICAgTk1UX0NTX1JFQURZX1RPX09QRVJBVEUgYW5kIE5NVF9DU19PUEVSQVRJT05BTC4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgcEZyYW1lSW5mb19wICAgICAgICAgICAgPSBwb2ludGVyIHRvIGZyYW1lIGluZm8gc3RydWN0dXJlCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIEVwbFBkb2tDYlBkb1RyYW5zbWl0dGVkKHRFcGxGcmFtZUluZm8gKiBwRnJhbWVJbmZvX3ApCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwl0RXBsRXZlbnQgRXZlbnQ7CisKKyNpZiAoREVWX1NZU1RFTSA9PSBfREVWX0dOVV9DRjU0OFhfKQorCS8vIHJlc2V0IExFRAorCU1DRl9HUElPX1BPRFJfUENJQkcgJj0gflBET19MRUQ7CS8vIExldmVsCisjZW5kaWYKKworCUV2ZW50Lm1fRXZlbnRTaW5rID0ga0VwbEV2ZW50U2lua1Bkb2s7CisJRXZlbnQubV9FdmVudFR5cGUgPSBrRXBsRXZlbnRUeXBlUGRvVHg7CisJRXZlbnQubV91aVNpemUgPSBzaXplb2YodEVwbEZyYW1lSW5mbyk7CisJRXZlbnQubV9wQXJnID0gcEZyYW1lSW5mb19wOworCVJldCA9IEVwbEV2ZW50a1Bvc3QoJkV2ZW50KTsKKworI2lmIChERVZfU1lTVEVNID09IF9ERVZfR05VX0NGNTQ4WF8pCisJLy8gc2V0IExFRAorCU1DRl9HUElPX1BPRFJfUENJQkcgfD0gUERPX0xFRDsJLy8gTGV2ZWwKKyNlbmRpZgorCisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsUGRva0NiU29hCisvLworLy8gRGVzY3JpcHRpb246IFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IERMTCBpZiBTb0EgZnJhbWUgd2FzCisvLyAgICAgICAgICAgICAgcmVjZWl2ZWQgcmVzcC4gc2VudC4gSXQgcG9zdHMgdGhpcyBldmVudCB0byB0aGUgZXZlbnQgcXVldWUuCisvLworLy8gUGFyYW1ldGVyczogIHBGcmFtZUluZm9fcCAgICAgICAgICAgID0gcG9pbnRlciB0byBmcmFtZSBpbmZvIHN0cnVjdHVyZQorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordEVwbEtlcm5lbCBFcGxQZG9rQ2JTb2EodEVwbEZyYW1lSW5mbyAqIHBGcmFtZUluZm9fcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCXRFcGxFdmVudCBFdmVudDsKKworCUV2ZW50Lm1fRXZlbnRTaW5rID0ga0VwbEV2ZW50U2lua1Bkb2s7CisJRXZlbnQubV9FdmVudFR5cGUgPSBrRXBsRXZlbnRUeXBlUGRvU29hOworCUV2ZW50Lm1fdWlTaXplID0gMDsKKwlFdmVudC5tX3BBcmcgPSBOVUxMOworCVJldCA9IEVwbEV2ZW50a1Bvc3QoJkV2ZW50KTsKKworCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbFBkb2tQcm9jZXNzCisvLworLy8gRGVzY3JpcHRpb246IFRoaXMgZnVuY3Rpb24gcHJvY2Vzc2VzIGFsbCByZWNlaXZlZCBhbmQgdHJhbnNtaXR0ZWQgUERPcy4KKy8vICAgICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIG11c3Qgbm90IGJlIGludGVycnVwdGVkIGJ5IGFueSBvdGhlciB0YXNrCisvLyAgICAgICAgICAgICAgZXhjZXB0IElTUnMgKGxpa2UgdGhlIGV0aGVybmV0IGRyaXZlciBJU1IsIHdoaWNoIG1heSBjYWxsCisvLyAgICAgICAgICAgICAgRXBsUGRva0NiRnJhbWVSZWNlaXZlZCgpIG9yIEVwbFBkb2tDYkZyYW1lVHJhbnNtaXR0ZWQoKSkuCisvLworLy8gUGFyYW1ldGVyczogIHBFdmVudF9wICAgICAgICAgICAgICAgID0gcG9pbnRlciB0byBldmVudCBzdHJ1Y3R1cmUKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgRXBsUGRva1Byb2Nlc3ModEVwbEV2ZW50ICogcEV2ZW50X3ApCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwlXT1JEIHdQZG9TaXplOworCVdPUkQgd0JpdE9mZnNldDsKKwlXT1JEIHdCaXRTaXplOworCVdPUkQgd1ZhclNpemU7CisJUVdPUkQgcXdPYmplY3RNYXBwaW5nOworCUJZVEUgYk1hcHBTdWJpbmRleDsKKwlCWVRFIGJPYmRTdWJpbmRleDsKKwlXT1JEIHdPYmRNYXBwSW5kZXg7CisJV09SRCB3T2JkQ29tbUluZGV4OworCVdPUkQgd1Bkb0lkOworCUJZVEUgYk9iZERhdGE7CisJQllURSBiT2JqZWN0Q291bnQ7CisJQllURSBiRnJhbWVEYXRhOworCUJPT0wgZlZhbGlkOworCXRFcGxPYmRTaXplIE9iZFNpemU7CisJdEVwbEZyYW1lICpwRnJhbWU7CisJdEVwbEZyYW1lSW5mbyAqcEZyYW1lSW5mbzsKKwl1bnNpZ25lZCBpbnQgdWlOb2RlSWQ7CisJdEVwbE1zZ1R5cGUgTXNnVHlwZTsKKworCS8vIDB4RkY9aW52YWxpZCwgUlBETzogMHgwMD1QUmVxLCBsb2NhbE5vZGVJZD1QUmVzLCByZW1vdGVOb2RlSWQ9UFJlcworCS8vICAgICAgICAgICAgICAgVFBETzogMHgwMD1QUmVzLCBNTjogQ25Ob2RlSWQ9UFJlcQorCisJc3dpdGNoIChwRXZlbnRfcC0+bV9FdmVudFR5cGUpIHsKKwljYXNlIGtFcGxFdmVudFR5cGVQZG9SeDoJLy8gUlBETyByZWNlaXZlZAorCQlwRnJhbWUgPSAodEVwbEZyYW1lICopIHBFdmVudF9wLT5tX3BBcmc7CisKKwkJLy8gY2hlY2sgaWYgcmVjZWl2ZWQgUlBETyBpcyB2YWxpZAorCQliRnJhbWVEYXRhID0KKwkJICAgIEFtaUdldEJ5dGVGcm9tTGUoJnBGcmFtZS0+bV9EYXRhLm1fUHJlcy5tX2xlX2JGbGFnMSk7CisJCWlmICgoYkZyYW1lRGF0YSAmIEVQTF9GUkFNRV9GTEFHMV9SRCkgPT0gMCkgewkvLyBSUERPIGludmFsaWQKKwkJCWdvdG8gRXhpdDsKKwkJfQorCQkvLyByZXRyaWV2ZSBFUEwgbWVzc2FnZSB0eXBlCisJCU1zZ1R5cGUgPSBBbWlHZXRCeXRlRnJvbUxlKCZwRnJhbWUtPm1fbGVfYk1lc3NhZ2VUeXBlKTsKKwkJaWYgKE1zZ1R5cGUgPT0ga0VwbE1zZ1R5cGVQcmVxKSB7CS8vIFJQRE8gaXMgUFJlcSBmcmFtZQorCQkJdWlOb2RlSWQgPSBFUExfUERPX1BSRVFfTk9ERV9JRDsJLy8gMHgwMAorCQl9IGVsc2UgewkvLyBSUERPIGlzIFBSZXMgZnJhbWUKKwkJCS8vIHJldHJpZXZlIG5vZGUgSUQKKwkJCXVpTm9kZUlkID0gQW1pR2V0Qnl0ZUZyb21MZSgmcEZyYW1lLT5tX2xlX2JTcmNOb2RlSWQpOworCQl9CisKKwkJLy8gc2VhcmNoIGZvciBhcHByb3ByaWF0ZSB2YWxpZCBSUERPIGluIE9ECisJCXdPYmRNYXBwSW5kZXggPSBFUExfUERPS19PQkRfSURYX1JYX01BUFBfUEFSQU07CisJCWZvciAod09iZENvbW1JbmRleCA9IEVQTF9QRE9LX09CRF9JRFhfUlhfQ09NTV9QQVJBTTsKKwkJICAgICB3T2JkQ29tbUluZGV4IDwgKEVQTF9QRE9LX09CRF9JRFhfUlhfQ09NTV9QQVJBTSArIDB4MDBGRik7CisJCSAgICAgd09iZENvbW1JbmRleCsrLCB3T2JkTWFwcEluZGV4KyspIHsKKwkJCU9iZFNpemUgPSAxOworCQkJLy8gcmVhZCBub2RlIElEIGZyb20gT0QKKwkJCVJldCA9CisJCQkgICAgRXBsT2JkUmVhZEVudHJ5KHdPYmRDb21tSW5kZXgsIDB4MDEsICZiT2JkRGF0YSwKKwkJCQkJICAgICZPYmRTaXplKTsKKwkJCWlmICgoUmV0ID09IGtFcGxPYmRJbmRleE5vdEV4aXN0KQorCQkJICAgIHx8IChSZXQgPT0ga0VwbE9iZFN1YmluZGV4Tm90RXhpc3QpCisJCQkgICAgfHwgKFJldCA9PSBrRXBsT2JkSWxsZWdhbFBhcnQpKSB7CS8vIFBETyBkb2VzIG5vdCBleGlzdDsgbGFzdCBQRE8gcmVhY2hlZAorCQkJCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCQkJCWdvdG8gRXhpdDsKKwkJCX0gZWxzZSBpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CS8vIG90aGVyIGZhdGFsIGVycm9yIG9jY3VyZWQKKwkJCQlnb3RvIEV4aXQ7CisJCQl9CisJCQkvLyBlbnRyeSByZWFkIHN1Y2Nlc3NmdWxseQorCQkJaWYgKGJPYmREYXRhICE9IHVpTm9kZUlkKSB7CS8vIG5vZGUgSUQgZG9lcyBub3QgZXF1YWwgLSB3cm9uZyBQRE8sIHRyeSBuZXh0IFBETyBpbiBPRAorCQkJCWNvbnRpbnVlOworCQkJfQorCQkJT2JkU2l6ZSA9IDE7CisJCQkvLyByZWFkIG51bWJlciBvZiBtYXBwZWQgb2JqZWN0cyBmcm9tIE9EOyB0aGlzIGluZGljYXRlcyBpZiB0aGUgUERPIGlzIHZhbGlkCisJCQlSZXQgPQorCQkJICAgIEVwbE9iZFJlYWRFbnRyeSh3T2JkTWFwcEluZGV4LCAweDAwLCAmYk9iamVjdENvdW50LAorCQkJCQkgICAgJk9iZFNpemUpOworCQkJaWYgKChSZXQgPT0ga0VwbE9iZEluZGV4Tm90RXhpc3QpCisJCQkgICAgfHwgKFJldCA9PSBrRXBsT2JkU3ViaW5kZXhOb3RFeGlzdCkKKwkJCSAgICB8fCAoUmV0ID09IGtFcGxPYmRJbGxlZ2FsUGFydCkpIHsJLy8gUERPIGRvZXMgbm90IGV4aXN0OyBsYXN0IFBETyByZWFjaGVkCisJCQkJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJCQkJZ290byBFeGl0OworCQkJfSBlbHNlIGlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsJLy8gb3RoZXIgZmF0YWwgZXJyb3Igb2NjdXJlZAorCQkJCWdvdG8gRXhpdDsKKwkJCX0KKwkJCS8vIGVudHJ5IHJlYWQgc3VjY2Vzc2Z1bGx5CisJCQlpZiAoYk9iamVjdENvdW50ID09IDApIHsJLy8gUERPIGluIE9EIG5vdCB2YWxpZCwgdHJ5IG5leHQgUERPIGluIE9ECisJCQkJY29udGludWU7CisJCQl9CisKKwkJCU9iZFNpemUgPSAxOworCQkJLy8gY2hlY2sgUERPIG1hcHBpbmcgdmVyc2lvbgorCQkJUmV0ID0KKwkJCSAgICBFcGxPYmRSZWFkRW50cnkod09iZENvbW1JbmRleCwgMHgwMiwgJmJPYmREYXRhLAorCQkJCQkgICAgJk9iZFNpemUpOworCQkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgewkvLyBvdGhlciBmYXRhbCBlcnJvciBvY2N1cmVkCisJCQkJZ290byBFeGl0OworCQkJfQorCQkJLy8gZW50cnkgcmVhZCBzdWNjZXNzZnVsbHkKKwkJCS8vIHJldHJpZXZlIFBETyB2ZXJzaW9uIGZyb20gZnJhbWUKKwkJCWJGcmFtZURhdGEgPQorCQkJICAgIEFtaUdldEJ5dGVGcm9tTGUoJnBGcmFtZS0+bV9EYXRhLm1fUHJlcy4KKwkJCQkJICAgICBtX2xlX2JQZG9WZXJzaW9uKTsKKwkJCWlmICgoYk9iZERhdGEgJiBFUExfVkVSU0lPTl9NQUlOKSAhPSAoYkZyYW1lRGF0YSAmIEVQTF9WRVJTSU9OX01BSU4pKSB7CS8vIFBETyB2ZXJzaW9ucyBkbyBub3QgbWF0Y2gKKwkJCQkvLyAkJCQgcmFpc2UgUERPIGVycm9yCisJCQkJLy8gdGVybWlhdGUgcHJvY2Vzc2luZyBvZiB0aGlzIFJQRE8KKwkJCQlnb3RvIEV4aXQ7CisJCQl9CisJCQkvLyB2YWxpZCBSUERPIGZvdW5kCisKKwkJCS8vIHJldHJpZXZlIFBETyBzaXplCisJCQl3UGRvU2l6ZSA9CisJCQkgICAgQW1pR2V0V29yZEZyb21MZSgmcEZyYW1lLT5tX0RhdGEubV9QcmVzLm1fbGVfd1NpemUpOworCisJCQkvLyBwcm9jZXNzIG1hcHBpbmcKKwkJCWZvciAoYk1hcHBTdWJpbmRleCA9IDE7IGJNYXBwU3ViaW5kZXggPD0gYk9iamVjdENvdW50OworCQkJICAgICBiTWFwcFN1YmluZGV4KyspIHsKKwkJCQlPYmRTaXplID0gODsJLy8gUVdPUkQKKwkJCQkvLyByZWFkIG9iamVjdCBtYXBwaW5nIGZyb20gT0QKKwkJCQlSZXQgPQorCQkJCSAgICBFcGxPYmRSZWFkRW50cnkod09iZE1hcHBJbmRleCwKKwkJCQkJCSAgICBiTWFwcFN1YmluZGV4LAorCQkJCQkJICAgICZxd09iamVjdE1hcHBpbmcsICZPYmRTaXplKTsKKwkJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CS8vIG90aGVyIGZhdGFsIGVycm9yIG9jY3VyZWQKKwkJCQkJZ290byBFeGl0OworCQkJCX0KKwkJCQkvLyBjaGVjayBpZiBvYmplY3QgbWFwcGluZyBlbnRyeSBpcyB2YWxpZCwgaS5lLiB1bmVxdWFsIHplcm8sIGJlY2F1c2UgImVtcHR5IiBlbnRyaWVzIGFyZSBhbGxvd2VkCisJCQkJaWYgKHF3T2JqZWN0TWFwcGluZyA9PSAwKSB7CS8vIGludmFsaWQgZW50cnksIGNvbnRpbnVlIHdpdGggbmV4dCBlbnRyeQorCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJLy8gZGVjb2RlIG9iamVjdCBtYXBwaW5nCisJCQkJd09iZENvbW1JbmRleCA9CisJCQkJICAgIChXT1JEKSAocXdPYmplY3RNYXBwaW5nICYKKwkJCQkJICAgIDB4MDAwMDAwMDAwMDAwRkZGRkxMKTsKKwkJCQliT2JkU3ViaW5kZXggPQorCQkJCSAgICAoQllURSkgKChxd09iamVjdE1hcHBpbmcgJgorCQkJCQkgICAgIDB4MDAwMDAwMDAwMEZGMDAwMExMKSA+PiAxNik7CisJCQkJd0JpdE9mZnNldCA9CisJCQkJICAgIChXT1JEKSAoKHF3T2JqZWN0TWFwcGluZyAmCisJCQkJCSAgICAgMHgwMDAwRkZGRjAwMDAwMDAwTEwpID4+IDMyKTsKKwkJCQl3Qml0U2l6ZSA9CisJCQkJICAgIChXT1JEKSAoKHF3T2JqZWN0TWFwcGluZyAmCisJCQkJCSAgICAgMHhGRkZGMDAwMDAwMDAwMDAwTEwpID4+IDQ4KTsKKworCQkJCS8vIGNoZWNrIGlmIG9iamVjdCBleGNlZWRzIFBETyBzaXplCisJCQkJaWYgKCgod0JpdE9mZnNldCArIHdCaXRTaXplKSA+PiAzKSA+IHdQZG9TaXplKSB7CS8vIHdyb25nIG9iamVjdCBtYXBwaW5nOyBQRE8gc2l6ZSBpcyB0b28gbG93CisJCQkJCS8vICQkJCByYWlzZSBQRE8gZXJyb3IKKwkJCQkJLy8gdGVybWluYXRlIHByb2Nlc3Npbmcgb2YgdGhpcyBSUERPCisJCQkJCWdvdG8gRXhpdDsKKwkJCQl9CisJCQkJLy8gY29weSBvYmplY3QgZnJvbSBSUERPIHRvIHByb2Nlc3MvT0QgdmFyaWFibGUKKwkJCQlPYmRTaXplID0gd0JpdFNpemUgPj4gMzsKKwkJCQlSZXQgPQorCQkJCSAgICBFcGxPYmRXcml0ZUVudHJ5RnJvbUxlKHdPYmRDb21tSW5kZXgsCisJCQkJCQkJICAgYk9iZFN1YmluZGV4LAorCQkJCQkJCSAgICZwRnJhbWUtPm1fRGF0YS4KKwkJCQkJCQkgICBtX1ByZXMuCisJCQkJCQkJICAgbV9sZV9hYlBheWxvYWRbKHdCaXRPZmZzZXQgPj4gMyldLCBPYmRTaXplKTsKKwkJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CS8vIG90aGVyIGZhdGFsIGVycm9yIG9jY3VyZWQKKwkJCQkJZ290byBFeGl0OworCQkJCX0KKworCQkJfQorCisJCQkvLyBwcm9jZXNzaW5nIGZpbmlzaGVkIHN1Y2Nlc3NmdWxseQorCQkJZ290byBFeGl0OworCQl9CisJCWJyZWFrOworCisJY2FzZSBrRXBsRXZlbnRUeXBlUGRvVHg6CS8vIFRQRE8gdHJhbnNtaXR0ZWQKKwkJcEZyYW1lSW5mbyA9ICh0RXBsRnJhbWVJbmZvICopIHBFdmVudF9wLT5tX3BBcmc7CisJCXBGcmFtZSA9IHBGcmFtZUluZm8tPm1fcEZyYW1lOworCisJCS8vIHNldCBUUERPIGludmFsaWQsIHNvIHRoYXQgb25seSBmdWxseSBwcm9jZXNzZWQgVFBET3MgYXJlIHNlbnQgYXMgdmFsaWQKKwkJYkZyYW1lRGF0YSA9CisJCSAgICBBbWlHZXRCeXRlRnJvbUxlKCZwRnJhbWUtPm1fRGF0YS5tX1ByZXMubV9sZV9iRmxhZzEpOworCQlBbWlTZXRCeXRlVG9MZSgmcEZyYW1lLT5tX0RhdGEubV9QcmVzLm1fbGVfYkZsYWcxLAorCQkJICAgICAgIChiRnJhbWVEYXRhICYgfkVQTF9GUkFNRV9GTEFHMV9SRCkpOworCisJCS8vIHJldHJpZXZlIEVQTCBtZXNzYWdlIHR5cGUKKwkJTXNnVHlwZSA9IEFtaUdldEJ5dGVGcm9tTGUoJnBGcmFtZS0+bV9sZV9iTWVzc2FnZVR5cGUpOworCQlpZiAoTXNnVHlwZSA9PSBrRXBsTXNnVHlwZVByZXMpIHsJLy8gVFBETyBpcyBQUmVzIGZyYW1lCisJCQl1aU5vZGVJZCA9IEVQTF9QRE9fUFJFU19OT0RFX0lEOwkvLyAweDAwCisJCX0gZWxzZSB7CS8vIFRQRE8gaXMgUFJlcSBmcmFtZQorCQkJLy8gcmV0cmlldmUgbm9kZSBJRAorCQkJdWlOb2RlSWQgPSBBbWlHZXRCeXRlRnJvbUxlKCZwRnJhbWUtPm1fbGVfYkRzdE5vZGVJZCk7CisJCX0KKworCQkvLyBzZWFyY2ggZm9yIGFwcHJvcHJpYXRlIHZhbGlkIFRQRE8gaW4gT0QKKwkJd09iZE1hcHBJbmRleCA9IEVQTF9QRE9LX09CRF9JRFhfVFhfTUFQUF9QQVJBTTsKKwkJd09iZENvbW1JbmRleCA9IEVQTF9QRE9LX09CRF9JRFhfVFhfQ09NTV9QQVJBTTsKKwkJZm9yICh3UGRvSWQgPSAwOzsgd1Bkb0lkKyssIHdPYmRDb21tSW5kZXgrKywgd09iZE1hcHBJbmRleCsrKSB7CisJCQlPYmRTaXplID0gMTsKKwkJCS8vIHJlYWQgbm9kZSBJRCBmcm9tIE9ECisJCQlSZXQgPQorCQkJICAgIEVwbE9iZFJlYWRFbnRyeSh3T2JkQ29tbUluZGV4LCAweDAxLCAmYk9iZERhdGEsCisJCQkJCSAgICAmT2JkU2l6ZSk7CisJCQlpZiAoKFJldCA9PSBrRXBsT2JkSW5kZXhOb3RFeGlzdCkKKwkJCSAgICB8fCAoUmV0ID09IGtFcGxPYmRTdWJpbmRleE5vdEV4aXN0KQorCQkJICAgIHx8IChSZXQgPT0ga0VwbE9iZElsbGVnYWxQYXJ0KSkgewkvLyBQRE8gZG9lcyBub3QgZXhpc3Q7IGxhc3QgUERPIHJlYWNoZWQKKwkJCQlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwkJCQlnb3RvIEV4aXQ7CisJCQl9IGVsc2UgaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgewkvLyBvdGhlciBmYXRhbCBlcnJvciBvY2N1cmVkCisJCQkJZ290byBFeGl0OworCQkJfQorCQkJLy8gZW50cnkgcmVhZCBzdWNjZXNzZnVsbHkKKwkJCWlmIChiT2JkRGF0YSAhPSB1aU5vZGVJZCkgewkvLyBub2RlIElEIGRvZXMgbm90IGVxdWFsIC0gd3JvbmcgUERPLCB0cnkgbmV4dCBQRE8gaW4gT0QKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCU9iZFNpemUgPSAxOworCQkJLy8gcmVhZCBudW1iZXIgb2YgbWFwcGVkIG9iamVjdHMgZnJvbSBPRDsgdGhpcyBpbmRpY2F0ZXMgaWYgdGhlIFBETyBpcyB2YWxpZAorCQkJUmV0ID0KKwkJCSAgICBFcGxPYmRSZWFkRW50cnkod09iZE1hcHBJbmRleCwgMHgwMCwgJmJPYmplY3RDb3VudCwKKwkJCQkJICAgICZPYmRTaXplKTsKKwkJCWlmICgoUmV0ID09IGtFcGxPYmRJbmRleE5vdEV4aXN0KQorCQkJICAgIHx8IChSZXQgPT0ga0VwbE9iZFN1YmluZGV4Tm90RXhpc3QpCisJCQkgICAgfHwgKFJldCA9PSBrRXBsT2JkSWxsZWdhbFBhcnQpKSB7CS8vIFBETyBkb2VzIG5vdCBleGlzdDsgbGFzdCBQRE8gcmVhY2hlZAorCQkJCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCQkJCWdvdG8gRXhpdDsKKwkJCX0gZWxzZSBpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CS8vIG90aGVyIGZhdGFsIGVycm9yIG9jY3VyZWQKKwkJCQlnb3RvIEV4aXQ7CisJCQl9CisJCQkvLyBlbnRyeSByZWFkIHN1Y2Nlc3NmdWxseQorCQkJaWYgKGJPYmplY3RDb3VudCA9PSAwKSB7CS8vIFBETyBpbiBPRCBub3QgdmFsaWQsIHRyeSBuZXh0IFBETyBpbiBPRAorCQkJCWNvbnRpbnVlOworCQkJfQorCQkJLy8gdmFsaWQgVFBETyBmb3VuZAorCisJCQlPYmRTaXplID0gMTsKKwkJCS8vIGdldCBQRE8gbWFwcGluZyB2ZXJzaW9uIGZyb20gT0QKKwkJCVJldCA9CisJCQkgICAgRXBsT2JkUmVhZEVudHJ5KHdPYmRDb21tSW5kZXgsIDB4MDIsICZiT2JkRGF0YSwKKwkJCQkJICAgICZPYmRTaXplKTsKKwkJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsJLy8gb3RoZXIgZmF0YWwgZXJyb3Igb2NjdXJlZAorCQkJCWdvdG8gRXhpdDsKKwkJCX0KKwkJCS8vIGVudHJ5IHJlYWQgc3VjY2Vzc2Z1bGx5CisJCQkvLyBzZXQgUERPIHZlcnNpb24gaW4gZnJhbWUKKwkJCUFtaVNldEJ5dGVUb0xlKCZwRnJhbWUtPm1fRGF0YS5tX1ByZXMubV9sZV9iUGRvVmVyc2lvbiwKKwkJCQkgICAgICAgYk9iZERhdGEpOworCisJCQkvLyBjYWxjdWxhdGUgUERPIHNpemUKKwkJCXdQZG9TaXplID0gMDsKKworCQkJLy8gcHJvY2VzcyBtYXBwaW5nCisJCQlmb3IgKGJNYXBwU3ViaW5kZXggPSAxOyBiTWFwcFN1YmluZGV4IDw9IGJPYmplY3RDb3VudDsKKwkJCSAgICAgYk1hcHBTdWJpbmRleCsrKSB7CisJCQkJT2JkU2l6ZSA9IDg7CS8vIFFXT1JECisJCQkJLy8gcmVhZCBvYmplY3QgbWFwcGluZyBmcm9tIE9ECisJCQkJUmV0ID0KKwkJCQkgICAgRXBsT2JkUmVhZEVudHJ5KHdPYmRNYXBwSW5kZXgsCisJCQkJCQkgICAgYk1hcHBTdWJpbmRleCwKKwkJCQkJCSAgICAmcXdPYmplY3RNYXBwaW5nLCAmT2JkU2l6ZSk7CisJCQkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgewkvLyBvdGhlciBmYXRhbCBlcnJvciBvY2N1cmVkCisJCQkJCWdvdG8gRXhpdDsKKwkJCQl9CisJCQkJLy8gY2hlY2sgaWYgb2JqZWN0IG1hcHBpbmcgZW50cnkgaXMgdmFsaWQsIGkuZS4gdW5lcXVhbCB6ZXJvLCBiZWNhdXNlICJlbXB0eSIgZW50cmllcyBhcmUgYWxsb3dlZAorCQkJCWlmIChxd09iamVjdE1hcHBpbmcgPT0gMCkgewkvLyBpbnZhbGlkIGVudHJ5LCBjb250aW51ZSB3aXRoIG5leHQgZW50cnkKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCS8vIGRlY29kZSBvYmplY3QgbWFwcGluZworCQkJCXdPYmRDb21tSW5kZXggPQorCQkJCSAgICAoV09SRCkgKHF3T2JqZWN0TWFwcGluZyAmCisJCQkJCSAgICAweDAwMDAwMDAwMDAwMEZGRkZMTCk7CisJCQkJYk9iZFN1YmluZGV4ID0KKwkJCQkgICAgKEJZVEUpICgocXdPYmplY3RNYXBwaW5nICYKKwkJCQkJICAgICAweDAwMDAwMDAwMDBGRjAwMDBMTCkgPj4gMTYpOworCQkJCXdCaXRPZmZzZXQgPQorCQkJCSAgICAoV09SRCkgKChxd09iamVjdE1hcHBpbmcgJgorCQkJCQkgICAgIDB4MDAwMEZGRkYwMDAwMDAwMExMKSA+PiAzMik7CisJCQkJd0JpdFNpemUgPQorCQkJCSAgICAoV09SRCkgKChxd09iamVjdE1hcHBpbmcgJgorCQkJCQkgICAgIDB4RkZGRjAwMDAwMDAwMDAwMExMKSA+PiA0OCk7CisKKwkJCQkvLyBjYWxjdWxhdGUgbWF4IFBETyBzaXplCisJCQkJT2JkU2l6ZSA9IHdCaXRTaXplID4+IDM7CisJCQkJd1ZhclNpemUgPSAod0JpdE9mZnNldCA+PiAzKSArIChXT1JEKSBPYmRTaXplOworCQkJCWlmICgodW5zaWduZWQgaW50KSh3VmFyU2l6ZSArIDI0KSA+IHBGcmFtZUluZm8tPm1fdWlGcmFtZVNpemUpIHsJLy8gVFBETyBpcyB0b28gc2hvcnQKKwkJCQkJLy8gJCQkIHJhaXNlIFBETyBlcnJvciwgc2V0IFJldAorCQkJCQlnb3RvIEV4aXQ7CisJCQkJfQorCQkJCWlmICh3VmFyU2l6ZSA+IHdQZG9TaXplKSB7CS8vIG1lbW9yaXplIG5ldyBQRE8gc2l6ZQorCQkJCQl3UGRvU2l6ZSA9IHdWYXJTaXplOworCQkJCX0KKwkJCQkvLyBjb3B5IG9iamVjdCBmcm9tIHByb2Nlc3MvT0QgdmFyaWFibGUgdG8gVFBETworCQkJCVJldCA9CisJCQkJICAgIEVwbE9iZFJlYWRFbnRyeVRvTGUod09iZENvbW1JbmRleCwKKwkJCQkJCQliT2JkU3ViaW5kZXgsCisJCQkJCQkJJnBGcmFtZS0+bV9EYXRhLm1fUHJlcy4KKwkJCQkJCQltX2xlX2FiUGF5bG9hZFsod0JpdE9mZnNldCA+PiAzKV0sICZPYmRTaXplKTsKKwkJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CS8vIG90aGVyIGZhdGFsIGVycm9yIG9jY3VyZWQKKwkJCQkJZ290byBFeGl0OworCQkJCX0KKworCQkJfQorCisJCQkvLyBzZXQgUERPIHNpemUgaW4gZnJhbWUKKwkJCUFtaVNldFdvcmRUb0xlKCZwRnJhbWUtPm1fRGF0YS5tX1ByZXMubV9sZV93U2l6ZSwKKwkJCQkgICAgICAgd1Bkb1NpemUpOworCisJCQlSZXQgPSBFcGxQZG9rQ2FsQXJlVHBkb3NWYWxpZCgmZlZhbGlkKTsKKwkJCWlmIChmVmFsaWQgIT0gRkFMU0UpIHsKKwkJCQkvLyBzZXQgVFBETyB2YWxpZAorCQkJCWJGcmFtZURhdGEgPQorCQkJCSAgICBBbWlHZXRCeXRlRnJvbUxlKCZwRnJhbWUtPm1fRGF0YS5tX1ByZXMuCisJCQkJCQkgICAgIG1fbGVfYkZsYWcxKTsKKwkJCQlBbWlTZXRCeXRlVG9MZSgmcEZyYW1lLT5tX0RhdGEubV9QcmVzLgorCQkJCQkgICAgICAgbV9sZV9iRmxhZzEsCisJCQkJCSAgICAgICAoYkZyYW1lRGF0YSB8CisJCQkJCQlFUExfRlJBTUVfRkxBRzFfUkQpKTsKKwkJCX0KKwkJCS8vIHByb2Nlc3NpbmcgZmluaXNoZWQgc3VjY2Vzc2Z1bGx5CisKKwkJCWdvdG8gRXhpdDsKKwkJfQorCQlicmVhazsKKworCWNhc2Uga0VwbEV2ZW50VHlwZVBkb1NvYToJLy8gU29BIHJlY2VpdmVkCisKKwkJLy8gaW52YWxpZGF0ZSBUUERPcworCQlSZXQgPSBFcGxQZG9rQ2FsU2V0VHBkb3NWYWxpZChGQUxTRSk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJeworCQkJQVNTRVJUTVNHKEZBTFNFLAorCQkJCSAgIkVwbFBkb2tQcm9jZXNzKCk6IHVuaGFuZGxlZCBldmVudCB0eXBlIVxuIik7CisJCX0KKwl9CisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIFJldDsKK30KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICBQIFIgSSBWIEEgVCBFICAgRiBVIE4gQyBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246CisvLworLy8gRGVzY3JpcHRpb246CisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOgorLy8KKy8vCisvLyBSZXR1cm5zOgorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZW5kaWYgLy8gI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfUERPSykpICE9IDApCisKKy8vIEVPRgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxQZG9rQ2FsLmMgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbFBkb2tDYWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDRjNDc1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxQZG9rQ2FsLmMKQEAgLTAsMCArMSwyNjYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBzb3VyY2UgZmlsZSBmb3Iga2VybmVsIFBETyBDb21tdW5pY2F0aW9uIEFic3RyYWN0aW9uIExheWVyIG1vZHVsZQorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgJFJDU2ZpbGU6IEVwbFBkb2tDYWwuYyx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuNiAkICAkRGF0ZTogMjAwOC8xMC8xNyAxNTozMjozMiAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICAgICAgR0NDIFYzLjQKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUmV2aXNpb24gSGlzdG9yeToKKworICAyMDA2LzA2LzI3IGQuay46ICAgc3RhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uLCB2ZXJzaW9uIDEuMDAKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgImtlcm5lbC9FcGxQZG9rQ2FsLmgiCisKKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1BET0spKSAhPSAwKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICBHIEwgTyBCIEEgTCAgIEQgRSBGIEkgTiBJIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvY2FsIHR5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbW9kdWwgZ2xvYmFsZSB2YXJzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgQyBMIEEgUyBTICBFcGxQZG9rQ2FsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8vCisvLyBEZXNjcmlwdGlvbjoKKy8vCisvLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICBQIFIgSSBWIEEgVCBFICAgRCBFIEYgSSBOIEkgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3R5cGVkZWYgc3RydWN0IHsKKwlCT09MIG1fZlRwZG9zVmFsaWQ7CisKK30gdEVwbFBkb2tDYWxJbnN0YW5jZTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvY2FsIHZhcnMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB0RXBsUGRva0NhbEluc3RhbmNlIEVwbFBkb2tDYWxJbnN0YW5jZV9nOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICBQIFUgQiBMIEkgQyAgIEYgVSBOIEMgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbFBkb2tDYWxBZGRJbnN0YW5jZSgpCisvLworLy8gRGVzY3JpcHRpb246IGFkZCBhbmQgaW5pdGlhbGl6ZSBuZXcgaW5zdGFuY2Ugb2YgRVBMIHN0YWNrCisvLworLy8gUGFyYW1ldGVyczogIG5vbmUKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgRXBsUGRva0NhbEFkZEluc3RhbmNlKHZvaWQpCit7CisKKwlFUExfTUVNU0VUKCZFcGxQZG9rQ2FsSW5zdGFuY2VfZywgMCwgc2l6ZW9mKEVwbFBkb2tDYWxJbnN0YW5jZV9nKSk7CisKKwlyZXR1cm4ga0VwbFN1Y2Nlc3NmdWw7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbFBkb2tDYWxEZWxJbnN0YW5jZSgpCisvLworLy8gRGVzY3JpcHRpb246IGRlbGV0ZXMgYW4gaW5zdGFuY2Ugb2YgRVBMIHN0YWNrCisvLworLy8gUGFyYW1ldGVyczogIG5vbmUKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgRXBsUGRva0NhbERlbEluc3RhbmNlKHZvaWQpCit7CisKKwlyZXR1cm4ga0VwbFN1Y2Nlc3NmdWw7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbFBkb2tDYWxTZXRUcGRvc1ZhbGlkKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogVGhpcyBmdW5jdGlvbiBzZXRzIHRoZSB2YWxpZGl0eSBmbGFnIGZvciBUUERPcyB0byB0aGUKKy8vICAgICAgICAgICAgICBzcGVjaWZpZWQgdmFsdWUuCisvLworLy8gUGFyYW1ldGVyczogIGZWYWxpZF9wICAgICAgICAgICAgICAgID0gdmFsaWRpdHkgZmxhZworLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordEVwbEtlcm5lbCBFcGxQZG9rQ2FsU2V0VHBkb3NWYWxpZChCT09MIGZWYWxpZF9wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwlFcGxQZG9rQ2FsSW5zdGFuY2VfZy5tX2ZUcGRvc1ZhbGlkID0gZlZhbGlkX3A7CisKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxQZG9rQ2FsQXJlVHBkb3NWYWxpZCgpCisvLworLy8gRGVzY3JpcHRpb246IFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgdmFsaWRpdHkgZmxhZyBmb3IgVFBET3MuCisvLworLy8gUGFyYW1ldGVyczogIHBmVmFsaWRfcCAgICAgICAgICAgICAgID0gT1VUOiB2YWxpZGl0eSBmbGFnCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIEVwbFBkb2tDYWxBcmVUcGRvc1ZhbGlkKEJPT0wgKiBwZlZhbGlkX3ApCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCSpwZlZhbGlkX3AgPSBFcGxQZG9rQ2FsSW5zdGFuY2VfZy5tX2ZUcGRvc1ZhbGlkOworCisJcmV0dXJuIFJldDsKK30KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICBQIFIgSSBWIEEgVCBFICAgRiBVIE4gQyBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246CisvLworLy8gRGVzY3JpcHRpb246CisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOgorLy8KKy8vCisvLyBSZXR1cm5zOgorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZW5kaWYKKworLy8gRU9GCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbFBkb3UuYyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsUGRvdS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3YjEwNjUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbFBkb3UuYwpAQCAtMCwwICsxLDU2NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIHNvdXJjZSBmaWxlIGZvciB1c2VyIFBETyBtb2R1bGUKKyAgICAgICAgICAgICAgICBDdXJyZW50bHksIHRoaXMgbW9kdWxlIGp1c3QgaW1wbGVtZW50cyBhIE9EIGNhbGxiYWNrIGZ1bmN0aW9uCisgICAgICAgICAgICAgICAgdG8gY2hlY2sgaWYgdGhlIFBETyBjb25maWd1cmF0aW9uIGlzIHZhbGlkLgorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgJFJDU2ZpbGU6IEVwbFBkb3UuYyx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuNSAkICAkRGF0ZTogMjAwOC8xMC8xNyAxNTozMjozMiAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICAgICAgR0NDIFYzLjQKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUmV2aXNpb24gSGlzdG9yeToKKworICAyMDA2LzA1LzIyIGQuay46ICAgc3RhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uLCB2ZXJzaW9uIDEuMDAKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkVwbEluYy5oIgorLy8jaW5jbHVkZSAidXNlci9FcGxQZG91Q2FsLmgiCisjaW5jbHVkZSAidXNlci9FcGxPYmR1LmgiCisjaW5jbHVkZSAidXNlci9FcGxQZG91LmgiCisjaW5jbHVkZSAiRXBsU2RvQWMuaCIKKworI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfUERPVSkpICE9IDApCisKKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX09CRFUpKSA9PSAwKSAmJiAoRVBMX09CRF9VU0VfS0VSTkVMID09IEZBTFNFKQorI2Vycm9yICJFUEwgUERPdSBtb2R1bGUgbmVlZHMgRVBMIG1vZHVsZSBPQkRVIG9yIE9CREshIgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIEcgTCBPIEIgQSBMICAgRCBFIEYgSSBOIEkgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZGVmaW5lIEVQTF9QRE9VX09CRF9JRFhfUlhfQ09NTV9QQVJBTSAgMHgxNDAwCisjZGVmaW5lIEVQTF9QRE9VX09CRF9JRFhfUlhfTUFQUF9QQVJBTSAgMHgxNjAwCisjZGVmaW5lIEVQTF9QRE9VX09CRF9JRFhfVFhfQ09NTV9QQVJBTSAgMHgxODAwCisjZGVmaW5lIEVQTF9QRE9VX09CRF9JRFhfVFhfTUFQUF9QQVJBTSAgMHgxQTAwCisjZGVmaW5lIEVQTF9QRE9VX09CRF9JRFhfTUFQUF9QQVJBTSAgICAgMHgwMjAwCisjZGVmaW5lIEVQTF9QRE9VX09CRF9JRFhfTUFTSyAgICAgICAgICAgMHhGRjAwCisjZGVmaW5lIEVQTF9QRE9VX1BET19JRF9NQVNLICAgICAgICAgICAgMHgwMEZGCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCB0eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIG1vZHVsIGdsb2JhbGUgdmFycworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIEMgTCBBIFMgUyAgRXBsUGRvdSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvLworLy8gRGVzY3JpcHRpb246CisvLworLy8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgUCBSIEkgViBBIFQgRSAgIEQgRSBGIEkgTiBJIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvY2FsIHR5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgdmFycworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB0RXBsS2VybmVsIEVwbFBkb3VDaGVja1Bkb1ZhbGlkaXR5KHRFcGxPYmRDYlBhcmFtIE1FTSAqIHBQYXJhbV9wLAorCQkJCQkgIHVuc2lnbmVkIGludCB1aUluZGV4X3ApOworCitzdGF0aWMgdm9pZCBFcGxQZG91RGVjb2RlT2JqZWN0TWFwcGluZyhRV09SRCBxd09iamVjdE1hcHBpbmdfcCwKKwkJCQkgICAgICAgdW5zaWduZWQgaW50ICpwdWlJbmRleF9wLAorCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgKnB1aVN1YkluZGV4X3AsCisJCQkJICAgICAgIHVuc2lnbmVkIGludCAqcHVpQml0T2Zmc2V0X3AsCisJCQkJICAgICAgIHVuc2lnbmVkIGludCAqcHVpQml0U2l6ZV9wKTsKKworc3RhdGljIHRFcGxLZXJuZWwgRXBsUGRvdUNoZWNrT2JqZWN0TWFwcGluZyhRV09SRCBxd09iamVjdE1hcHBpbmdfcCwKKwkJCQkJICAgIHRFcGxPYmRBY2Nlc3MgQWNjZXNzVHlwZV9wLAorCQkJCQkgICAgRFdPUkQgKiBwZHdBYm9ydENvZGVfcCwKKwkJCQkJICAgIHVuc2lnbmVkIGludCAqcHVpUGRvU2l6ZV9wKTsKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICBQIFUgQiBMIEkgQyAgIEYgVSBOIEMgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbFBkb3VBZGRJbnN0YW5jZSgpCisvLworLy8gRGVzY3JpcHRpb246IGFkZCBhbmQgaW5pdGlhbGl6ZSBuZXcgaW5zdGFuY2Ugb2YgRVBMIHN0YWNrCisvLworLy8gUGFyYW1ldGVyczogIG5vbmUKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgRXBsUGRvdUFkZEluc3RhbmNlKHZvaWQpCit7CisKKwlyZXR1cm4ga0VwbFN1Y2Nlc3NmdWw7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbFBkb3VEZWxJbnN0YW5jZSgpCisvLworLy8gRGVzY3JpcHRpb246IGRlbGV0ZXMgYW4gaW5zdGFuY2Ugb2YgRVBMIHN0YWNrCisvLworLy8gUGFyYW1ldGVyczogIG5vbmUKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgRXBsUGRvdURlbEluc3RhbmNlKHZvaWQpCit7CisKKwlyZXR1cm4ga0VwbFN1Y2Nlc3NmdWw7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbFBkb3VDYk9iZEFjY2VzcworLy8KKy8vIERlc2NyaXB0aW9uOiBjYWxsYmFjayBmdW5jdGlvbiBmb3IgT0QgYWNjZXNzZXMKKy8vCisvLyBQYXJhbWV0ZXJzOiAgcFBhcmFtX3AgICAgICAgICAgICAgICAgPSBPQkQgcGFyYW1ldGVyCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIFBVQkxJQyBFcGxQZG91Q2JPYmRBY2Nlc3ModEVwbE9iZENiUGFyYW0gTUVNICogcFBhcmFtX3ApCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwl1bnNpZ25lZCBpbnQgdWlQZG9JZDsKKwl1bnNpZ25lZCBpbnQgdWlJbmRleFR5cGU7CisJdEVwbE9iZFNpemUgT2JkU2l6ZTsKKwlCWVRFIGJPYmplY3RDb3VudDsKKwlRV09SRCBxd09iamVjdE1hcHBpbmc7CisJdEVwbE9iZEFjY2VzcyBBY2Nlc3NUeXBlOworCUJZVEUgYk1hcHBTdWJpbmRleDsKKwl1bnNpZ25lZCBpbnQgdWlDdXJQZG9TaXplOworCVdPUkQgd01heFBkb1NpemU7CisJdW5zaWduZWQgaW50IHVpU3ViSW5kZXg7CisKKwkvLyBmZXRjaCBQRE8gSUQKKwl1aVBkb0lkID0gcFBhcmFtX3AtPm1fdWlJbmRleCAmIEVQTF9QRE9VX1BET19JRF9NQVNLOworCisJLy8gZmV0Y2ggb2JqZWN0IGluZGV4IHR5cGUKKwl1aUluZGV4VHlwZSA9IHBQYXJhbV9wLT5tX3VpSW5kZXggJiBFUExfUERPVV9PQkRfSURYX01BU0s7CisKKwlpZiAocFBhcmFtX3AtPm1fT2JkRXZlbnQgIT0ga0VwbE9iZEV2UHJlV3JpdGUpIHsJLy8gcmVhZCBhY2Nlc3NlcywgcG9zdCB3cml0ZSBldmVudHMgZXRjLiBhcmUgT0sKKwkJcFBhcmFtX3AtPm1fZHdBYm9ydENvZGUgPSAwOworCQlnb3RvIEV4aXQ7CisJfQorCS8vIGNoZWNrIGluZGV4IHR5cGUKKwlzd2l0Y2ggKHVpSW5kZXhUeXBlKSB7CisJY2FzZSBFUExfUERPVV9PQkRfSURYX1JYX0NPTU1fUEFSQU06CisJCS8vIFJQRE8gY29tbXVuaWNhdGlvbiBwYXJhbWV0ZXIgYWNjZXNzZWQKKwljYXNlIEVQTF9QRE9VX09CRF9JRFhfVFhfQ09NTV9QQVJBTToKKwkJewkJLy8gVFBETyBjb21tdW5pY2F0aW9uIHBhcmFtZXRlciBhY2Nlc3NlZAorCQkJUmV0ID0gRXBsUGRvdUNoZWNrUGRvVmFsaWRpdHkocFBhcmFtX3AsCisJCQkJCQkgICAgICAoRVBMX1BET1VfT0JEX0lEWF9NQVBQX1BBUkFNCisJCQkJCQkgICAgICAgfCBwUGFyYW1fcC0+bV91aUluZGV4KSk7CisJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CS8vIFBETyBpcyB2YWxpZCBvciBkb2VzIG5vdCBleGlzdAorCQkJCWdvdG8gRXhpdDsKKwkJCX0KKworCQkJZ290byBFeGl0OworCQl9CisKKwljYXNlIEVQTF9QRE9VX09CRF9JRFhfUlhfTUFQUF9QQVJBTToKKwkJewkJLy8gUlBETyBtYXBwaW5nIHBhcmFtZXRlciBhY2Nlc3NlZAorCisJCQlBY2Nlc3NUeXBlID0ga0VwbE9iZEFjY1dyaXRlOworCQkJYnJlYWs7CisJCX0KKworCWNhc2UgRVBMX1BET1VfT0JEX0lEWF9UWF9NQVBQX1BBUkFNOgorCQl7CQkvLyBUUERPIG1hcHBpbmcgcGFyYW1ldGVyIGFjY2Vzc2VkCisKKwkJCUFjY2Vzc1R5cGUgPSBrRXBsT2JkQWNjUmVhZDsKKwkJCWJyZWFrOworCQl9CisKKwlkZWZhdWx0OgorCQl7CQkvLyB0aGlzIGNhbGxiYWNrIGZ1bmN0aW9uIGlzIG9ubHkgZm9yCisJCQkvLyBQRE8gbWFwcGluZyBhbmQgY29tbXVuaWNhdGlvbiBwYXJhbWV0ZXJzCisJCQlwUGFyYW1fcC0+bV9kd0Fib3J0Q29kZSA9IEVQTF9TRE9BQ19HRU5FUkFMX0VSUk9SOworCQkJZ290byBFeGl0OworCQl9CisJfQorCisJLy8gUlBETyBhbmQgVFBETyBtYXBwaW5nIHBhcmFtZXRlciBhY2Nlc3NlZAorCisJaWYgKHBQYXJhbV9wLT5tX3VpU3ViSW5kZXggPT0gMCkgewkvLyBvYmplY3QgbWFwcGluZyBjb3VudCBhY2Nlc3NlZAorCisJCS8vIFBETyBpcyBlbmFibGVkIG9yIGRpc2FibGVkCisJCWJPYmplY3RDb3VudCA9ICooKEJZVEUgKikgcFBhcmFtX3AtPm1fcEFyZyk7CisKKwkJaWYgKGJPYmplY3RDb3VudCA9PSAwKSB7CS8vIFBETyBzaGFsbCBiZSBkaXNhYmxlZAorCisJCQkvLyB0aGF0IGlzIGFsd2F5cyBwb3NzaWJsZQorCQkJZ290byBFeGl0OworCQl9CisJCS8vIFBETyBzaGFsbCBiZSBlbmFibGVkCisJCS8vIGl0IHNob3VsZCBoYXZlIGJlZW4gZGlzYWJsZWQgZm9yIHRoaXMgb3BlcmF0aW9uCisJCVJldCA9IEVwbFBkb3VDaGVja1Bkb1ZhbGlkaXR5KHBQYXJhbV9wLCBwUGFyYW1fcC0+bV91aUluZGV4KTsKKwkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgewkvLyBQRE8gaXMgdmFsaWQgb3IgZG9lcyBub3QgZXhpc3QKKwkJCWdvdG8gRXhpdDsKKwkJfQorCisJCWlmIChBY2Nlc3NUeXBlID09IGtFcGxPYmRBY2NXcml0ZSkgeworCQkJdWlTdWJJbmRleCA9IDB4MDQ7CS8vIFBSZXFBY3RQYXlsb2FkTGltaXRfVTE2CisJCX0gZWxzZSB7CisJCQl1aVN1YkluZGV4ID0gMHgwNTsJLy8gUFJlc0FjdFBheWxvYWRMaW1pdF9VMTYKKwkJfQorCisJCS8vIGZldGNoIG1heGltdW0gUERPIHNpemUgZnJvbSBPYmplY3QgMUY5OGg6IE5NVF9DeWNsZVRpbWluZ19SRUMKKwkJT2JkU2l6ZSA9IHNpemVvZih3TWF4UGRvU2l6ZSk7CisJCVJldCA9CisJCSAgICBFcGxPYmR1UmVhZEVudHJ5KDB4MUY5OCwgdWlTdWJJbmRleCwgJndNYXhQZG9TaXplLAorCQkJCSAgICAgJk9iZFNpemUpOworCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CS8vIG90aGVyIGZhdGFsIGVycm9yIG9jY3VyZWQKKwkJCXBQYXJhbV9wLT5tX2R3QWJvcnRDb2RlID0gRVBMX1NET0FDX0dFTkVSQUxfRVJST1I7CisJCQlnb3RvIEV4aXQ7CisJCX0KKwkJLy8gY2hlY2sgYWxsIG9iamVjdG1hcHBpbmdzCisJCWZvciAoYk1hcHBTdWJpbmRleCA9IDE7IGJNYXBwU3ViaW5kZXggPD0gYk9iamVjdENvdW50OworCQkgICAgIGJNYXBwU3ViaW5kZXgrKykgeworCQkJLy8gcmVhZCBvYmplY3QgbWFwcGluZyBmcm9tIE9ECisJCQlPYmRTaXplID0gc2l6ZW9mKHF3T2JqZWN0TWFwcGluZyk7CS8vIFFXT1JECisJCQlSZXQgPSBFcGxPYmR1UmVhZEVudHJ5KHBQYXJhbV9wLT5tX3VpSW5kZXgsCisJCQkJCSAgICAgICBiTWFwcFN1YmluZGV4LCAmcXdPYmplY3RNYXBwaW5nLAorCQkJCQkgICAgICAgJk9iZFNpemUpOworCQkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgewkvLyBvdGhlciBmYXRhbCBlcnJvciBvY2N1cmVkCisJCQkJcFBhcmFtX3AtPm1fZHdBYm9ydENvZGUgPQorCQkJCSAgICBFUExfU0RPQUNfR0VORVJBTF9FUlJPUjsKKwkJCQlnb3RvIEV4aXQ7CisJCQl9CisJCQkvLyBjaGVjayBvYmplY3QgbWFwcGluZworCQkJUmV0ID0gRXBsUGRvdUNoZWNrT2JqZWN0TWFwcGluZyhxd09iamVjdE1hcHBpbmcsCisJCQkJCQkJQWNjZXNzVHlwZSwKKwkJCQkJCQkmcFBhcmFtX3AtPgorCQkJCQkJCW1fZHdBYm9ydENvZGUsCisJCQkJCQkJJnVpQ3VyUGRvU2l6ZSk7CisJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CS8vIGlsbGVnYWwgb2JqZWN0IG1hcHBpbmcKKwkJCQlnb3RvIEV4aXQ7CisJCQl9CisKKwkJCWlmICh1aUN1clBkb1NpemUgPiB3TWF4UGRvU2l6ZSkgewkvLyBtYXBwaW5nIGV4Y2VlZHMgb2JqZWN0IHNpemUKKwkJCQlwUGFyYW1fcC0+bV9kd0Fib3J0Q29kZSA9CisJCQkJICAgIEVQTF9TRE9BQ19HRU5FUkFMX0VSUk9SOworCQkJCVJldCA9IGtFcGxQZG9WYXJOb3RGb3VuZDsKKwkJCX0KKworCQl9CisKKwl9IGVsc2UgewkJLy8gT2JqZWN0TWFwcGluZworCQlSZXQgPSBFcGxQZG91Q2hlY2tQZG9WYWxpZGl0eShwUGFyYW1fcCwgcFBhcmFtX3AtPm1fdWlJbmRleCk7CisJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsJLy8gUERPIGlzIHZhbGlkIG9yIGRvZXMgbm90IGV4aXN0CisJCQlnb3RvIEV4aXQ7CisJCX0KKwkJLy8gY2hlY2sgZXhpc3RlbmNlIG9mIG9iamVjdCBhbmQgdmFsaWRpdHkgb2Ygb2JqZWN0IGxlbmd0aAorCisJCXF3T2JqZWN0TWFwcGluZyA9ICooKFFXT1JEICopIHBQYXJhbV9wLT5tX3BBcmcpOworCisJCVJldCA9IEVwbFBkb3VDaGVja09iamVjdE1hcHBpbmcocXdPYmplY3RNYXBwaW5nLAorCQkJCQkJQWNjZXNzVHlwZSwKKwkJCQkJCSZwUGFyYW1fcC0+bV9kd0Fib3J0Q29kZSwKKwkJCQkJCSZ1aUN1clBkb1NpemUpOworCisJfQorCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7Cit9CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgUCBSIEkgViBBIFQgRSAgIEYgVSBOIEMgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxQZG91Q2hlY2tQZG9WYWxpZGl0eQorLy8KKy8vIERlc2NyaXB0aW9uOiBjaGVjayBpZiBQRE8gaXMgdmFsaWQKKy8vCisvLyBQYXJhbWV0ZXJzOiAgcFBhcmFtX3AgICAgICAgICAgICAgICAgPSBPQkQgcGFyYW1ldGVyCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdEVwbEtlcm5lbCBFcGxQZG91Q2hlY2tQZG9WYWxpZGl0eSh0RXBsT2JkQ2JQYXJhbSBNRU0gKiBwUGFyYW1fcCwKKwkJCQkJICB1bnNpZ25lZCBpbnQgdWlJbmRleF9wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJdEVwbE9iZFNpemUgT2JkU2l6ZTsKKwlCWVRFIGJPYmplY3RDb3VudDsKKworCU9iZFNpemUgPSAxOworCS8vIHJlYWQgbnVtYmVyIG9mIG1hcHBlZCBvYmplY3RzIGZyb20gT0Q7IHRoaXMgaW5kaWNhdGVzIGlmIHRoZSBQRE8gaXMgdmFsaWQKKwlSZXQgPSBFcGxPYmR1UmVhZEVudHJ5KHVpSW5kZXhfcCwgMHgwMCwgJmJPYmplY3RDb3VudCwgJk9iZFNpemUpOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsJLy8gb3RoZXIgZmF0YWwgZXJyb3Igb2NjdXJlZAorCQlwUGFyYW1fcC0+bV9kd0Fib3J0Q29kZSA9CisJCSAgICBFUExfU0RPQUNfR0VOX0lOVEVSTkFMX0lOQ09NUEFUSUJJTElUWTsKKwkJZ290byBFeGl0OworCX0KKwkvLyBlbnRyeSByZWFkIHN1Y2Nlc3NmdWxseQorCWlmIChiT2JqZWN0Q291bnQgIT0gMCkgewkvLyBQRE8gaW4gT0QgaXMgc3RpbGwgdmFsaWQKKwkJcFBhcmFtX3AtPm1fZHdBYm9ydENvZGUgPSBFUExfU0RPQUNfR0VOX1BBUkFNX0lOQ09NUEFUSUJJTElUWTsKKwkJUmV0ID0ga0VwbFBkb05vdEV4aXN0OworCQlnb3RvIEV4aXQ7CisJfQorCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbFBkb3VEZWNvZGVPYmplY3RNYXBwaW5nCisvLworLy8gRGVzY3JpcHRpb246IGRlY29kZXMgdGhlIGdpdmVuIG9iamVjdCBtYXBwaW5nIGVudHJ5IGludG8gaW5kZXgsIHN1YmluZGV4LAorLy8gICAgICAgICAgICAgIGJpdCBvZmZzZXQgYW5kIGJpdCBzaXplLgorLy8KKy8vIFBhcmFtZXRlcnM6ICBxd09iamVjdE1hcHBpbmdfcCAgICAgICA9IG9iamVjdCBtYXBwaW5nIGVudHJ5CisvLyAgICAgICAgICAgICAgcHVpSW5kZXhfcCAgICAgICAgICAgICAgPSBbT1VUXSBwb2ludGVyIHRvIG9iamVjdCBpbmRleAorLy8gICAgICAgICAgICAgIHB1aVN1YkluZGV4X3AgICAgICAgICAgID0gW09VVF0gcG9pbnRlciB0byBzdWJpbmRleAorLy8gICAgICAgICAgICAgIHB1aUJpdE9mZnNldF9wICAgICAgICAgID0gW09VVF0gcG9pbnRlciB0byBiaXQgb2Zmc2V0CisvLyAgICAgICAgICAgICAgcHVpQml0U2l6ZV9wICAgICAgICAgICAgPSBbT1VUXSBwb2ludGVyIHRvIGJpdCBzaXplCisvLworLy8gUmV0dXJuczogICAgICh2b2lkKQorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkIEVwbFBkb3VEZWNvZGVPYmplY3RNYXBwaW5nKFFXT1JEIHF3T2JqZWN0TWFwcGluZ19wLAorCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgKnB1aUluZGV4X3AsCisJCQkJICAgICAgIHVuc2lnbmVkIGludCAqcHVpU3ViSW5kZXhfcCwKKwkJCQkgICAgICAgdW5zaWduZWQgaW50ICpwdWlCaXRPZmZzZXRfcCwKKwkJCQkgICAgICAgdW5zaWduZWQgaW50ICpwdWlCaXRTaXplX3ApCit7CisJKnB1aUluZGV4X3AgPSAodW5zaWduZWQgaW50KQorCSAgICAocXdPYmplY3RNYXBwaW5nX3AgJiAweDAwMDAwMDAwMDAwMEZGRkZMTCk7CisKKwkqcHVpU3ViSW5kZXhfcCA9ICh1bnNpZ25lZCBpbnQpCisJICAgICgocXdPYmplY3RNYXBwaW5nX3AgJiAweDAwMDAwMDAwMDBGRjAwMDBMTCkgPj4gMTYpOworCisJKnB1aUJpdE9mZnNldF9wID0gKHVuc2lnbmVkIGludCkKKwkgICAgKChxd09iamVjdE1hcHBpbmdfcCAmIDB4MDAwMEZGRkYwMDAwMDAwMExMKSA+PiAzMik7CisKKwkqcHVpQml0U2l6ZV9wID0gKHVuc2lnbmVkIGludCkKKwkgICAgKChxd09iamVjdE1hcHBpbmdfcCAmIDB4RkZGRjAwMDAwMDAwMDAwMExMKSA+PiA0OCk7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsUGRvdUNoZWNrT2JqZWN0TWFwcGluZworLy8KKy8vIERlc2NyaXB0aW9uOiBjaGVja3MgdGhlIGdpdmVuIG9iamVjdCBtYXBwaW5nIGVudHJ5LgorLy8KKy8vIFBhcmFtZXRlcnM6ICBxd09iamVjdE1hcHBpbmdfcCAgICAgICA9IG9iamVjdCBtYXBwaW5nIGVudHJ5CisvLyAgICAgICAgICAgICAgQWNjZXNzVHlwZV9wICAgICAgICAgICAgPSBhY2Nlc3MgdHlwZSB0byBtYXBwZWQgb2JqZWN0OgorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGUgPSBSUERPIGFuZCByZWFkID0gVFBETworLy8gICAgICAgICAgICAgIHB1aVBkb1NpemVfcCAgICAgICAgICAgID0gW09VVF0gcG9pbnRlciB0byBjb3ZlcmVkIFBETyBzaXplCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob2Zmc2V0ICsgc2l6ZSkgaW4gYnl0ZTsKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgaWYgbWFwcGluZyBmYWlsZWQKKy8vICAgICAgICAgICAgICBwZHdBYm9ydENvZGVfcCAgICAgICAgICA9IFtPVVRdIHBvaW50ZXIgdG8gU0RPIGFib3J0IGNvZGU7CisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIGlmIG1hcHBpbmcgaXMgcG9zc2libGUKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHRFcGxLZXJuZWwgRXBsUGRvdUNoZWNrT2JqZWN0TWFwcGluZyhRV09SRCBxd09iamVjdE1hcHBpbmdfcCwKKwkJCQkJICAgIHRFcGxPYmRBY2Nlc3MgQWNjZXNzVHlwZV9wLAorCQkJCQkgICAgRFdPUkQgKiBwZHdBYm9ydENvZGVfcCwKKwkJCQkJICAgIHVuc2lnbmVkIGludCAqcHVpUGRvU2l6ZV9wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJdEVwbE9iZFNpemUgT2JkU2l6ZTsKKwl1bnNpZ25lZCBpbnQgdWlJbmRleDsKKwl1bnNpZ25lZCBpbnQgdWlTdWJJbmRleDsKKwl1bnNpZ25lZCBpbnQgdWlCaXRPZmZzZXQ7CisJdW5zaWduZWQgaW50IHVpQml0U2l6ZTsKKwl0RXBsT2JkQWNjZXNzIEFjY2Vzc1R5cGU7CisJQk9PTCBmTnVtZXJpY2FsOworCisJaWYgKHF3T2JqZWN0TWFwcGluZ19wID09IDApIHsJLy8gZGlzY2FyZCB6ZXJvIHZhbHVlCisJCSpwdWlQZG9TaXplX3AgPSAwOworCQlnb3RvIEV4aXQ7CisJfQorCS8vIGRlY29kZSBvYmplY3QgbWFwcGluZworCUVwbFBkb3VEZWNvZGVPYmplY3RNYXBwaW5nKHF3T2JqZWN0TWFwcGluZ19wLAorCQkJCSAgICZ1aUluZGV4LAorCQkJCSAgICZ1aVN1YkluZGV4LCAmdWlCaXRPZmZzZXQsICZ1aUJpdFNpemUpOworCisJaWYgKCh1aUJpdE9mZnNldCAmIDB4NykgIT0gMHgwKSB7CS8vIGJpdCBtYXBwaW5nIGlzIG5vdCBzdXBwb3J0ZWQKKwkJKnBkd0Fib3J0Q29kZV9wID0gRVBMX1NET0FDX0dFTkVSQUxfRVJST1I7CisJCVJldCA9IGtFcGxQZG9HcmFudWxhcml0eU1pc21hdGNoOworCQlnb3RvIEV4aXQ7CisJfQorCisJaWYgKCh1aUJpdFNpemUgJiAweDcpICE9IDB4MCkgewkvLyBiaXQgbWFwcGluZyBpcyBub3Qgc3VwcG9ydGVkCisJCSpwZHdBYm9ydENvZGVfcCA9IEVQTF9TRE9BQ19HRU5FUkFMX0VSUk9SOworCQlSZXQgPSBrRXBsUGRvR3JhbnVsYXJpdHlNaXNtYXRjaDsKKwkJZ290byBFeGl0OworCX0KKwkvLyBjaGVjayBhY2Nlc3MgdHlwZQorCVJldCA9IEVwbE9iZHVHZXRBY2Nlc3NUeXBlKHVpSW5kZXgsIHVpU3ViSW5kZXgsICZBY2Nlc3NUeXBlKTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CS8vIGVudHJ5IGRvZXNuJ3QgZXhpc3QKKwkJKnBkd0Fib3J0Q29kZV9wID0gRVBMX1NET0FDX09CSkVDVF9OT1RfRVhJU1Q7CisJCWdvdG8gRXhpdDsKKwl9CisKKwlpZiAoKEFjY2Vzc1R5cGUgJiBrRXBsT2JkQWNjUGRvKSA9PSAwKSB7CS8vIG9iamVjdCBpcyBub3QgbWFwcGFibGUKKwkJKnBkd0Fib3J0Q29kZV9wID0gRVBMX1NET0FDX09CSkVDVF9OT1RfTUFQUEFCTEU7CisJCVJldCA9IGtFcGxQZG9WYXJOb3RGb3VuZDsKKwkJZ290byBFeGl0OworCX0KKworCWlmICgoQWNjZXNzVHlwZSAmIEFjY2Vzc1R5cGVfcCkgPT0gMCkgewkvLyBvYmplY3QgaXMgbm90IHdyaXRlYWJsZSAoUlBETykgb3IgcmVhZGFibGUgKFRQRE8pIHJlc3BlY3RpdmVseQorCQkqcGR3QWJvcnRDb2RlX3AgPSBFUExfU0RPQUNfT0JKRUNUX05PVF9NQVBQQUJMRTsKKwkJUmV0ID0ga0VwbFBkb1Zhck5vdEZvdW5kOworCQlnb3RvIEV4aXQ7CisJfQorCisJT2JkU2l6ZSA9IEVwbE9iZHVHZXREYXRhU2l6ZSh1aUluZGV4LCB1aVN1YkluZGV4KTsKKwlpZiAoT2JkU2l6ZSA8ICh1aUJpdFNpemUgPj4gMykpIHsJLy8gb2JqZWN0IGRvZXMgbm90IGV4aXN0IG9yIGhhcyBzbWFsbGVyIHNpemUKKwkJKnBkd0Fib3J0Q29kZV9wID0gRVBMX1NET0FDX0dFTkVSQUxfRVJST1I7CisJCVJldCA9IGtFcGxQZG9WYXJOb3RGb3VuZDsKKwl9CisKKwlSZXQgPSBFcGxPYmR1SXNOdW1lcmljYWwodWlJbmRleCwgdWlTdWJJbmRleCwgJmZOdW1lcmljYWwpOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsJLy8gZW50cnkgZG9lc24ndCBleGlzdAorCQkqcGR3QWJvcnRDb2RlX3AgPSBFUExfU0RPQUNfT0JKRUNUX05PVF9FWElTVDsKKwkJZ290byBFeGl0OworCX0KKworCWlmICgoZk51bWVyaWNhbCAhPSBGQUxTRSkKKwkgICAgJiYgKCh1aUJpdFNpemUgPj4gMykgIT0gT2JkU2l6ZSkpIHsKKwkJLy8gb2JqZWN0IGlzIG51bWVyaWNhbCwKKwkJLy8gdGhlcmVmb3Igc2l6ZSBoYXMgdG8gZml0LCBidXQgaXQgZG9lcyBub3QuCisJCSpwZHdBYm9ydENvZGVfcCA9IEVQTF9TRE9BQ19HRU5FUkFMX0VSUk9SOworCQlSZXQgPSBrRXBsUGRvVmFyTm90Rm91bmQ7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gY2FsdWNhbGVkIG5lZWRlZCBQRE8gc2l6ZQorCSpwdWlQZG9TaXplX3AgPSAodWlCaXRPZmZzZXQgPj4gMykgKyAodWlCaXRTaXplID4+IDMpOworCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7Cit9CisKKyNlbmRpZiAvLyAjaWYgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9QRE9VKSkgIT0gMCkKKworLy8gRU9GCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbFNkby5oIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxTZG8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xY2IzZjJkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxTZG8uaApAQCAtMCwwICsxLDI0NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIGluY2x1ZGUgZmlsZSBmb3IgYXBpIGZ1bmN0aW9uIG9mIHRoZSBzZG8gbW9kdWxlCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRXBsU2RvLmgsdiAkCisKKyAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAorCisgICAgICAgICAgICAgICAgJFJldmlzaW9uOiAxLjYgJCAgJERhdGU6IDIwMDgvMDQvMTcgMjE6MzY6MzIgJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgICAgIEdDQyBWMy40CisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAyMDA2LzA2LzI2IGsudC46ICAgc3RhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJFcGxJbmMuaCIKKyNpbmNsdWRlICJFcGxGcmFtZS5oIgorI2luY2x1ZGUgIkVwbFNkb0FjLmgiCisKKyNpZm5kZWYgX0VQTFNET19IXworI2RlZmluZSBfRVBMU0RPX0hfCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gZ2xvYmFsIGRlZmluZXMKKyNpZm5kZWYgRVBMX1NET19NQVhfUEFZTE9BRAorI2RlZmluZSBFUExfU0RPX01BWF9QQVlMT0FEICAgICAyNTYKKyNlbmRpZgorCisvLyBoYW5kbGUgYmV0d2VlbiBQcm90b2NvbCBBYnN0cmFjdGlvbiBMYXllciBhbmQgYXN5bmNocm9ub3VzIFNETyBTZXF1ZW5jZSBMYXllcgorI2RlZmluZSBFUExfU0RPX1VEUF9IQU5ETEUgICAgICAweDgwMDAKKyNkZWZpbmUgRVBMX1NET19BU05EX0hBTkRMRSAgICAgMHg0MDAwCisjZGVmaW5lIEVQTF9TRE9fQVNZX0hBTkRMRV9NQVNLIDB4QzAwMAorI2RlZmluZSBFUExfU0RPX0FTWV9JTlZBTElEX0hETCAweDNGRkYKKworLy8gaGFuZGxlIGJldHdlZW4gIFNETyBTZXF1ZW5jZSBMYXllciBhbmQgc2RvIGNvbW1hbmQgbGF5ZXIKKyNkZWZpbmUgRVBMX1NET19BU1lfSEFORExFICAgICAgMHg4MDAwCisjZGVmaW5lIEVQTF9TRE9fUERPX0hBTkRMRSAgICAgIDB4NDAwMAorI2RlZmluZSBFUExfU0RPX1NFUV9IQU5ETEVfTUFTSyAweEMwMDAKKyNkZWZpbmUgRVBMX1NET19TRVFfSU5WQUxJRF9IREwgMHgzRkZGCisKKyNkZWZpbmUgRVBMX0FTTkRfSEVBREVSX1NJWkUgICAgICAgIDQKKy8vI2RlZmluZSBFUExfU0VRX0hFQURFUl9TSVpFICAgICAgICAgNAorI2RlZmluZSBFUExfRVRIRVJORVRfSEVBREVSX1NJWkUgICAgMTQKKworI2RlZmluZSBFUExfU0VRX05VTV9NQVNLICAgICAgICAgICAgMHhGQworCisvLyBzaXplIGZvciBzZW5kIGJ1ZmZlciBhbmQgaGlzdG9yeQorI2RlZmluZSBFUExfTUFYX1NET19GUkFNRV9TSVpFICAgICAgRVBMX0NfSVBfTUlOX01UVQorLy8gc2l6ZSBmb3IgcmVjZWl2ZSBmcmFtZQorLy8gLT4gbmVlZGVkIGJlY2F1c2UgU05ELUtpdCBzZW5kcyB1cCB0byAxNTE4IEJ5dGUKKy8vICAgIHdpdGhvdXQgU2RvLUNvbW1hbmQ6IE1heGltdW0gU2VnbWVudCBTaXplCisjZGVmaW5lIEVQTF9NQVhfU0RPX1JFQ19GUkFNRV9TSVpFICBFUExfQ19JUF9NQVhfTVRVCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyB0eXBlZGVmCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gaGFuZGxlIGJldHdlZW4gUHJvdG9jb2wgQWJzdHJhY3Rpb24gTGF5ZXIgYW5kIGFzeW5jaHJvbnV1cyBTRE8gU2VxdWVuY2UgTGF5ZXIKK3R5cGVkZWYgdW5zaWduZWQgaW50IHRFcGxTZG9Db25IZGw7CisKKy8vIGNhbGxiYWNrIGZ1bmN0aW9uIHBvaW50ZXIgZm9yIFByb3RvY29sIEFic3RyYWN0aW9uIExheWVyIHRvIGNhbGwKKy8vIGFzeW5jaHJvbnV1cyBTRE8gU2VxdWVuY2UgTGF5ZXIKK3R5cGVkZWYgdEVwbEtlcm5lbChQVUJMSUMgKiB0RXBsU2VxdUxheWVyUmVjZWl2ZUNiKSAodEVwbFNkb0NvbkhkbCBDb25IZGxfcCwKKwkJCQkJCSAgICAgdEVwbEFzeVNkb1NlcSAqCisJCQkJCQkgICAgIHBTZG9TZXFEYXRhX3AsCisJCQkJCQkgICAgIHVuc2lnbmVkIGludCB1aURhdGFTaXplX3ApOworCisvLyBoYW5kbGUgYmV0d2VlbiBhc3luY2hyb251dXMgU0RPIFNlcXVlbmNlIExheWVyIGFuZCBTRE8gQ29tbWFuZCBsYXllcgordHlwZWRlZiB1bnNpZ25lZCBpbnQgdEVwbFNkb1NlcUNvbkhkbDsKKworLy8gY2FsbGJhY2sgZnVuY3Rpb24gcG9pbnRlciBmb3IgYXN5bmNocm9udXVzIFNETyBTZXF1ZW5jZSBMYXllciB0byBjYWxsCisvLyBTRE8gQ29tbWFuZCBsYXllciBmb3IgcmVjZWl2ZWQgZGF0YQordHlwZWRlZiB0RXBsS2VybmVsKFBVQkxJQyAqCisJCSAgIHRFcGxTZG9Db21SZWNlaXZlQ2IpICh0RXBsU2RvU2VxQ29uSGRsIFNkb1NlcUNvbkhkbF9wLAorCQkJCQkgdEVwbEFzeVNkb0NvbSAqIHBBc3lTZG9Db21fcCwKKwkJCQkJIHVuc2lnbmVkIGludCB1aURhdGFTaXplX3ApOworCisvLyBzdGF0dXMgb2YgY29ubmVjdGlvbgordHlwZWRlZiBlbnVtIHsKKwlrQXN5U2RvQ29uU3RhdGVDb25uZWN0ZWQgPSAweDAwLAorCWtBc3lTZG9Db25TdGF0ZUluaXRFcnJvciA9IDB4MDEsCisJa0FzeVNkb0NvblN0YXRlQ29uQ2xvc2VkID0gMHgwMiwKKwlrQXN5U2RvQ29uU3RhdGVBY2tSZWNlaXZlZCA9IDB4MDMsCisJa0FzeVNkb0NvblN0YXRlRnJhbWVTZW5kZWQgPSAweDA0LAorCWtBc3lTZG9Db25TdGF0ZVRpbWVvdXQgPSAweDA1Cit9IHRFcGxBc3lTZG9Db25TdGF0ZTsKKworLy8gY2FsbGJhY2sgZnVuY3Rpb24gcG9pbnRlciBmb3IgYXN5bmNocm9udXVzIFNETyBTZXF1ZW5jZSBMYXllciB0byBjYWxsCisvLyBTRE8gQ29tbWFuZCBsYXllciBmb3IgY29ubmVjdGlvbiBzdGF0dXMKK3R5cGVkZWYgdEVwbEtlcm5lbChQVUJMSUMgKiB0RXBsU2RvQ29tQ29uQ2IpICh0RXBsU2RvU2VxQ29uSGRsIFNkb1NlcUNvbkhkbF9wLAorCQkJCQkgICAgICB0RXBsQXN5U2RvQ29uU3RhdGUKKwkJCQkJICAgICAgQXN5U2RvQ29uU3RhdGVfcCk7CisKKy8vIGhhbmRsZSBiZXR3ZWVuICBTRE8gQ29tbWFuZCBsYXllciBhbmQgYXBwbGljYXRpb24KK3R5cGVkZWYgdW5zaWduZWQgaW50IHRFcGxTZG9Db21Db25IZGw7CisKKy8vIHN0YXR1cyBvZiBjb25uZWN0aW9uCit0eXBlZGVmIGVudW0geworCWtFcGxTZG9Db21UcmFuc2Zlck5vdEFjdGl2ZSA9IDB4MDAsCisJa0VwbFNkb0NvbVRyYW5zZmVyUnVubmluZyA9IDB4MDEsCisJa0VwbFNkb0NvbVRyYW5zZmVyVHhBYm9ydGVkID0gMHgwMiwKKwlrRXBsU2RvQ29tVHJhbnNmZXJSeEFib3J0ZWQgPSAweDAzLAorCWtFcGxTZG9Db21UcmFuc2ZlckZpbmlzaGVkID0gMHgwNCwKKwlrRXBsU2RvQ29tVHJhbnNmZXJMb3dlckxheWVyQWJvcnQgPSAweDA1Cit9IHRFcGxTZG9Db21Db25TdGF0ZTsKKworLy8gU0RPIFNlcnZpY2VzIGFuZCBDb21tYW5kLUlkcyBmcm9tIERTIDEuMC4wIHAuMTUyCit0eXBlZGVmIGVudW0geworCWtFcGxTZG9TZXJ2aWNlTklMID0gMHgwMCwKKwlrRXBsU2RvU2VydmljZVdyaXRlQnlJbmRleCA9IDB4MDEsCisJa0VwbFNkb1NlcnZpY2VSZWFkQnlJbmRleCA9IDB4MDIKKwkgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSAgICAvLyB0aGUgZm9sbG93aW5nIHNlcnZpY2VzIGFyZSBvcHRpb25hbCBhbmQKKwkgICAgLy8gbm90IHN1cHBvcnRlZCBub3cKKy8qCisgICAga0VwbFNkb1NlcnZpY2VXcml0ZUFsbEJ5SW5kZXggICA9IDB4MDMsCisgICAga0VwbFNkb1NlcnZpY2VSZWFkQWxsQnlJbmRleCAgICA9IDB4MDQsCisgICAga0VwbFNkb1NlcnZpY2VXcml0ZUJ5TmFtZSAgICAgICA9IDB4MDUsCisgICAga0VwbFNkb1NlcnZpY2VSZWFkQnlOYW1lICAgICAgICA9IDB4MDYsCisKKyAgICBrRXBsU2RvU2VydmljZUZpbGVXcml0ZSAgICAgICAgID0gMHgyMCwKKyAgICBrRXBsU2RvU2VydmljZUZpbGVSZWFkICAgICAgICAgID0gMHgyMSwKKworICAgIGtFcGxTZG9TZXJ2aWNlV3JpdGVNdWx0aUJ5SW5kZXggPSAweDMxLAorICAgIGtFcGxTZG9TZXJ2aWNlUmVhZE11bHRpQnlJbmRleCAgPSAweDMyLAorCisgICAga0VwbFNkb1NlcnZpY2VNYXhTZWdTaXplICAgICAgICA9IDB4NzAKKworICAgIC8vIDB4ODAgLSAweEZGIG1hbnVmYWN0dXJlciBzcGVjaWZpYworCisgKi8KK30gdEVwbFNkb1NlcnZpY2VUeXBlOworCisvLyBkZXNjcmliZXMgaWYgcmVhZCBvciB3cml0ZSBhY2Nlc3MKK3R5cGVkZWYgZW51bSB7CisJa0VwbFNkb0FjY2Vzc1R5cGVSZWFkID0gMHgwMCwKKwlrRXBsU2RvQWNjZXNzVHlwZVdyaXRlID0gMHgwMQorfSB0RXBsU2RvQWNjZXNzVHlwZTsKKwordHlwZWRlZiBlbnVtIHsKKwlrRXBsU2RvVHlwZUF1dG8gPSAweDAwLAorCWtFcGxTZG9UeXBlVWRwID0gMHgwMSwKKwlrRXBsU2RvVHlwZUFzbmQgPSAweDAyLAorCWtFcGxTZG9UeXBlUGRvID0gMHgwMworfSB0RXBsU2RvVHlwZTsKKwordHlwZWRlZiBlbnVtIHsKKwlrRXBsU2RvVHJhbnNBdXRvID0gMHgwMCwKKwlrRXBsU2RvVHJhbnNFeHBlZGl0ZWQgPSAweDAxLAorCWtFcGxTZG9UcmFuc1NlZ21lbnRlZCA9IDB4MDIKK30gdEVwbFNkb1RyYW5zVHlwZTsKKworLy8gc3RydWN0dXJlIHRvIGluZm9ybSBhcHBsaWNhdGlvbiBhYm91dCBmaW5pc2ggb2YgU0RPIHRyYW5zZmVyCit0eXBlZGVmIHN0cnVjdCB7CisJdEVwbFNkb0NvbUNvbkhkbCBtX1Nkb0NvbUNvbkhkbDsKKwl0RXBsU2RvQ29tQ29uU3RhdGUgbV9TZG9Db21Db25TdGF0ZTsKKwlEV09SRCBtX2R3QWJvcnRDb2RlOworCXRFcGxTZG9BY2Nlc3NUeXBlIG1fU2RvQWNjZXNzVHlwZTsKKwl1bnNpZ25lZCBpbnQgbV91aU5vZGVJZDsJLy8gTm9kZUlkIG9mIHRoZSB0YXJnZXQKKwl1bnNpZ25lZCBpbnQgbV91aVRhcmdldEluZGV4OwkvLyBpbmRleCB3aGljaCB3YXMgYWNjZXNzZWQKKwl1bnNpZ25lZCBpbnQgbV91aVRhcmdldFN1YkluZGV4OwkvLyBzdWJpbmRleCB3aGljaCB3YXMgYWNjZXNzZWQKKwl1bnNpZ25lZCBpbnQgbV91aVRyYW5zZmVycmVkQnl0ZTsJLy8gbnVtYmVyIG9mIGJ5dGVzIHRyYW5zZmVycmVkCisJdm9pZCAqbV9wVXNlckFyZzsJLy8gdXNlciBkZWZpbmFibGUgYXJndW1lbnQgcG9pbnRlcgorCit9IHRFcGxTZG9Db21GaW5pc2hlZDsKKworLy8gY2FsbGJhY2sgZnVuY3Rpb24gcG9pbnRlciB0byBpbmZvcm0gYXBwbGljYXRpb24gYWJvdXQgY29ubmVjdGlvbgordHlwZWRlZiB0RXBsS2VybmVsKFBVQkxJQyAqIHRFcGxTZG9GaW5pc2hlZENiKSAodEVwbFNkb0NvbUZpbmlzaGVkICoKKwkJCQkJCXBTZG9Db21GaW5pc2hlZF9wKTsKKworLy8gc3RydWN0dXJlIHRvIGluaXQgU0RPIHRyYW5zZmVyIHRvIFJlYWQgb3IgV3JpdGUgYnkgSW5kZXgKK3R5cGVkZWYgc3RydWN0IHsKKwl0RXBsU2RvQ29tQ29uSGRsIG1fU2RvQ29tQ29uSGRsOworCXVuc2lnbmVkIGludCBtX3VpSW5kZXg7CisJdW5zaWduZWQgaW50IG1fdWlTdWJpbmRleDsKKwl2b2lkICptX3BEYXRhOworCXVuc2lnbmVkIGludCBtX3VpRGF0YVNpemU7CisJdW5zaWduZWQgaW50IG1fdWlUaW1lb3V0OwkvLyBub3QgdXNlZCBpbiB0aGlzIHZlcnNpb24KKwl0RXBsU2RvQWNjZXNzVHlwZSBtX1Nkb0FjY2Vzc1R5cGU7CisJdEVwbFNkb0ZpbmlzaGVkQ2IgbV9wZm5TZG9GaW5pc2hlZENiOworCXZvaWQgKm1fcFVzZXJBcmc7CS8vIHVzZXIgZGVmaW5hYmxlIGFyZ3VtZW50IHBvaW50ZXIKKworfSB0RXBsU2RvQ29tVHJhbnNQYXJhbUJ5SW5kZXg7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZW5kaWYgLy8gI2lmbmRlZiBfRVBMU0RPX0hfCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbFNkb0FjLmggYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbFNkb0FjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDAwZmIzOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsU2RvQWMuaApAQCAtMCwwICsxLDExMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIGRlZmluaXRpb25zIGZvciBTRE8gQWJvcnQgY29kZXMKKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgICAgICAgICRSQ1NmaWxlOiBFcGxTZG9BYy5oLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS40ICQgICREYXRlOiAyMDA4LzA0LzE3IDIxOjM2OjMyICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorICAgICAgICAgICAgICAgICAgICAuLi4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUmV2aXNpb24gSGlzdG9yeToKKworICAyMDA2LzA2LzMwIGsudC46IGZpcnN0IGltcGxlbWVudGF0aW9uCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX0VQTFNET0FDX0hfCisjZGVmaW5lIF9FUExTRE9BQ19IXworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBTRE8gYWJvcnQgY29kZXMKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworI2RlZmluZSAgICBFUExfU0RPQUNfVElNRV9PVVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNTA0MDAwMEwKKyNkZWZpbmUgICAgRVBMX1NET0FDX1VOS05PV05fQ09NTUFORF9TUEVDSUZJRVIgICAgICAgICAgIDB4MDUwNDAwMDFMCisjZGVmaW5lICAgIEVQTF9TRE9BQ19JTlZBTElEX0JMT0NLX1NJWkUgICAgICAgICAgICAgICAgICAweDA1MDQwMDAyTAorI2RlZmluZSAgICBFUExfU0RPQUNfSU5WQUxJRF9TRVFVRU5DRV9OVU1CRVIgICAgICAgICAgICAgMHgwNTA0MDAwM0wKKyNkZWZpbmUgICAgRVBMX1NET0FDX09VVF9PRl9NRU1PUlkgICAgICAgICAgICAgICAgICAgICAgIDB4MDUwNDAwMDVMCisjZGVmaW5lICAgIEVQTF9TRE9BQ19VTlNVUFBPUlRFRF9BQ0NFU1MgICAgICAgICAgICAgICAgICAweDA2MDEwMDAwTAorI2RlZmluZSAgICBFUExfU0RPQUNfUkVBRF9UT19XUklURV9PTkxZX09CSiAgICAgICAgICAgICAgMHgwNjAxMDAwMUwKKyNkZWZpbmUgICAgRVBMX1NET0FDX1dSSVRFX1RPX1JFQURfT05MWV9PQkogICAgICAgICAgICAgIDB4MDYwMTAwMDJMCisjZGVmaW5lICAgIEVQTF9TRE9BQ19PQkpFQ1RfTk9UX0VYSVNUICAgICAgICAgICAgICAgICAgICAweDA2MDIwMDAwTAorI2RlZmluZSAgICBFUExfU0RPQUNfT0JKRUNUX05PVF9NQVBQQUJMRSAgICAgICAgICAgICAgICAgMHgwNjA0MDA0MUwKKyNkZWZpbmUgICAgRVBMX1NET0FDX1BET19MRU5HVEhfRVhDRUVERUQgICAgICAgICAgICAgICAgIDB4MDYwNDAwNDJMCisjZGVmaW5lICAgIEVQTF9TRE9BQ19HRU5fUEFSQU1fSU5DT01QQVRJQklMSVRZICAgICAgICAgICAweDA2MDQwMDQzTAorI2RlZmluZSAgICBFUExfU0RPQUNfSU5WQUxJRF9IRUFSVEJFQVRfREVDICAgICAgICAgICAgICAgMHgwNjA0MDA0NEwKKyNkZWZpbmUgICAgRVBMX1NET0FDX0dFTl9JTlRFUk5BTF9JTkNPTVBBVElCSUxJVFkgICAgICAgIDB4MDYwNDAwNDdMCisjZGVmaW5lICAgIEVQTF9TRE9BQ19BQ0NFU1NfRkFJTEVEX0RVRV9IV19FUlJPUiAgICAgICAgICAweDA2MDYwMDAwTAorI2RlZmluZSAgICBFUExfU0RPQUNfREFUQV9UWVBFX0xFTkdUSF9OT1RfTUFUQ0ggICAgICAgICAgMHgwNjA3MDAxMEwKKyNkZWZpbmUgICAgRVBMX1NET0FDX0RBVEFfVFlQRV9MRU5HVEhfVE9PX0hJR0ggICAgICAgICAgIDB4MDYwNzAwMTJMCisjZGVmaW5lICAgIEVQTF9TRE9BQ19EQVRBX1RZUEVfTEVOR1RIX1RPT19MT1cgICAgICAgICAgICAweDA2MDcwMDEzTAorI2RlZmluZSAgICBFUExfU0RPQUNfU1VCX0lOREVYX05PVF9FWElTVCAgICAgICAgICAgICAgICAgMHgwNjA5MDAxMUwKKyNkZWZpbmUgICAgRVBMX1NET0FDX1ZBTFVFX1JBTkdFX0VYQ0VFREVEICAgICAgICAgICAgICAgIDB4MDYwOTAwMzBMCisjZGVmaW5lICAgIEVQTF9TRE9BQ19WQUxVRV9SQU5HRV9UT09fSElHSCAgICAgICAgICAgICAgICAweDA2MDkwMDMxTAorI2RlZmluZSAgICBFUExfU0RPQUNfVkFMVUVfUkFOR0VfVE9PX0xPVyAgICAgICAgICAgICAgICAgMHgwNjA5MDAzMkwKKyNkZWZpbmUgICAgRVBMX1NET0FDX01BWF9WQUxVRV9MRVNTX01JTl9WQUxVRSAgICAgICAgICAgIDB4MDYwOTAwMzZMCisjZGVmaW5lICAgIEVQTF9TRE9BQ19HRU5FUkFMX0VSUk9SICAgICAgICAgICAgICAgICAgICAgICAweDA4MDAwMDAwTAorI2RlZmluZSAgICBFUExfU0RPQUNfREFUQV9OT1RfVFJBTlNGX09SX1NUT1JFRCAgICAgICAgICAgMHgwODAwMDAyMEwKKyNkZWZpbmUgICAgRVBMX1NET0FDX0RBVEFfTk9UX1RSQU5TRl9EVUVfTE9DQUxfQ09OVFJPTCAgIDB4MDgwMDAwMjFMCisjZGVmaW5lICAgIEVQTF9TRE9BQ19EQVRBX05PVF9UUkFOU0ZfRFVFX0RFVklDRV9TVEFURSAgICAweDA4MDAwMDIyTAorI2RlZmluZSAgICBFUExfU0RPQUNfT0JKRUNUX0RJQ1RJT05BUllfTk9UX0VYSVNUICAgICAgICAgMHgwODAwMDAyM0wKKyNkZWZpbmUgICAgRVBMX1NET0FDX0NPTkZJR19EQVRBX0VNUFRZICAgICAgICAgICAgICAgICAgIDB4MDgwMDAwMjRMCisKKyNlbmRpZiAvLyBfRVBMU0RPQUNfSF8KKworLy8gRGllIGxldHp0ZSBaZWlsZSBtdd8gdW5iZWRpbmd0IGVpbmUgbGVlcmUgWmVpbGUgc2Vpbiwgd2VpbCBtYW5jaGUgQ29tcGlsZXIKKy8vIGRhbWl0IGVpbiBQcm9ibGVtIGhhYmVuLCB3ZW5uIGRhcyBuaWNodCBzbyBpc3QgKHouQi4gR05VIG9kZXIgQm9ybGFuZCBDKysgQnVpbGRlcikuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbFNkb0FzbmR1LmMgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbFNkb0FzbmR1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDVhMDBjOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsU2RvQXNuZHUuYwpAQCAtMCwwICsxLDQ4MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIHNvdXJjZSBmaWxlIGZvciBTRE8vQXNuZC1Qcm90b2NvbGFic3RyYWN0aW9ubGF5ZXIgbW9kdWxlCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRXBsU2RvQXNuZHUuYyx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuNyAkICAkRGF0ZTogMjAwOC8xMC8xNyAxNTozMjozMiAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICAgICAgR0NDIFYzLjQKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUmV2aXNpb24gSGlzdG9yeToKKworICAyMDA2LzA3LzA3IGsudC46ICAgc3RhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJ1c2VyL0VwbFNkb0FzbmR1LmgiCisjaW5jbHVkZSAidXNlci9FcGxEbGx1Q2FsLmgiCisKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfU0RPX0FTTkQpKSAhPSAwKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICBHIEwgTyBCIEEgTCAgIEQgRSBGIEkgTiBJIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmbmRlZiBFUExfU0RPX01BWF9DT05ORUNUSU9OX0FTTkQKKyNkZWZpbmUgRVBMX1NET19NQVhfQ09OTkVDVElPTl9BU05EIDUKKyNlbmRpZgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIGluc3RhbmNlIHRhYmxlCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgaW50IG1fYXVpU2RvQXNuZENvbm5lY3Rpb25bRVBMX1NET19NQVhfQ09OTkVDVElPTl9BU05EXTsKKwl0RXBsU2VxdUxheWVyUmVjZWl2ZUNiIG1fZnBTZG9Bc3lTZXFDYjsKKworfSB0RXBsU2RvQXNuZEluc3RhbmNlOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbW9kdWwgZ2xvYmFsZSB2YXJzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdEVwbFNkb0FzbmRJbnN0YW5jZSBTZG9Bc25kSW5zdGFuY2VfZzsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbFNkb0FzbmR1Q2IodEVwbEZyYW1lSW5mbyAqIHBGcmFtZUluZm9fcCk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIEMgTCBBIFMgUyAgPEVQTCBTRE8tQXNuZCBQcm90b2NvbGFic3RyYWN0aW9uIGxheWVyPiAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvLworLy8gRGVzY3JpcHRpb246IEVQTCBTRE8tQXNuZCBQcm90b2NvbGFic3RyYWN0aW9uIGxheWVyCisvLworLy8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgUCBVIEIgTCBJIEMgICBGIFUgTiBDIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxTZG9Bc25kdUluaXQKKy8vCisvLyBEZXNjcmlwdGlvbjogaW5pdCBmaXJzdCBpbnN0YW5jZSBvZiB0aGUgbW9kdWxlCisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOiAgcFJlY2VpdmVDYl9wICAgID0gICBmdW5jdGlvbnBvaW50ZXIgdG8gU2RvLVNlcXVlbmNlIGxheWVyCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay1mdW5jdGlvbgorLy8KKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgPSBFcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3RFcGxLZXJuZWwgUFVCTElDIEVwbFNkb0FzbmR1SW5pdCh0RXBsU2VxdUxheWVyUmVjZWl2ZUNiIGZwUmVjZWl2ZUNiX3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisKKwlSZXQgPSBFcGxTZG9Bc25kdUFkZEluc3RhbmNlKGZwUmVjZWl2ZUNiX3ApOworCisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsU2RvQXNuZHVBZGRJbnN0YW5jZQorLy8KKy8vIERlc2NyaXB0aW9uOiBpbml0IGFkZGl0aW9uYWwgaW5zdGFuY2Ugb2YgdGhlIG1vZHVsZQorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczogIHBSZWNlaXZlQ2JfcCAgICA9ICAgZnVuY3Rpb25wb2ludGVyIHRvIFNkby1TZXF1ZW5jZSBsYXllcgorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2stZnVuY3Rpb24KKy8vCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgID0gRXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0RXBsS2VybmVsIFBVQkxJQyBFcGxTZG9Bc25kdUFkZEluc3RhbmNlKHRFcGxTZXF1TGF5ZXJSZWNlaXZlQ2IgZnBSZWNlaXZlQ2JfcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKworCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJLy8gaW5pdCBjb250cm9sIHN0cnVjdHVyZQorCUVQTF9NRU1TRVQoJlNkb0FzbmRJbnN0YW5jZV9nLCAweDAwLCBzaXplb2YoU2RvQXNuZEluc3RhbmNlX2cpKTsKKworCS8vIHNhdmUgcG9pbnRlciB0byBjYWxsYmFjay1mdW5jdGlvbgorCWlmIChmcFJlY2VpdmVDYl9wICE9IE5VTEwpIHsKKwkJU2RvQXNuZEluc3RhbmNlX2cubV9mcFNkb0FzeVNlcUNiID0gZnBSZWNlaXZlQ2JfcDsKKwl9IGVsc2UgeworCQlSZXQgPSBrRXBsU2RvVWRwTWlzc0NiOworCX0KKworI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9ETExVKSkgIT0gMCkKKwlSZXQgPSBFcGxEbGx1Q2FsUmVnQXNuZFNlcnZpY2Uoa0VwbERsbEFzbmRTZG8sCisJCQkJICAgICAgIEVwbFNkb0FzbmR1Q2IsIGtFcGxEbGxBc25kRmlsdGVyTG9jYWwpOworI2VuZGlmCisKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxTZG9Bc25kdURlbEluc3RhbmNlCisvLworLy8gRGVzY3JpcHRpb246IGRlbCBpbnN0YW5jZSBvZiB0aGUgbW9kdWxlCisvLyAgICAgICAgICAgICAgZGVsIHNvY2tldCBhbmQgZGVsIExpc3Rlbi1UaHJlYWQKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6CisvLworLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICA9IEVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordEVwbEtlcm5lbCBQVUJMSUMgRXBsU2RvQXNuZHVEZWxJbnN0YW5jZSgpCit7CisJdEVwbEtlcm5lbCBSZXQ7CisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9ETExVKSkgIT0gMCkKKwkvLyBkZXJlZ2lzdGVyIGNhbGxiYWNrIGZ1bmN0aW9uIGZyb20gRExMCisJUmV0ID0gRXBsRGxsdUNhbFJlZ0FzbmRTZXJ2aWNlKGtFcGxEbGxBc25kU2RvLAorCQkJCSAgICAgICBOVUxMLCBrRXBsRGxsQXNuZEZpbHRlck5vbmUpOworI2VuZGlmCisKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxTZG9Bc25kdUluaXRDb24KKy8vCisvLyBEZXNjcmlwdGlvbjogaW5pdCBhIG5ldyBjb25uZWN0CisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOiAgcFNkb0NvbkhhbmRsZV9wID0gcG9pbnRlciBmb3IgdGhlIG5ldyBjb25uZWN0aW9uIGhhbmRsZQorLy8gICAgICAgICAgICAgIHVpVGFyZ2V0Tm9kZUlkX3AgPSBOb2RlSWQgb2YgdGhlIHRhcmdldCBub2RlCisvLworLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICA9IEVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordEVwbEtlcm5lbCBQVUJMSUMgRXBsU2RvQXNuZHVJbml0Q29uKHRFcGxTZG9Db25IZGwgKiBwU2RvQ29uSGFuZGxlX3AsCisJCQkJICAgICB1bnNpZ25lZCBpbnQgdWlUYXJnZXROb2RlSWRfcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKwl1bnNpZ25lZCBpbnQgdWlDb3VudDsKKwl1bnNpZ25lZCBpbnQgdWlGcmVlQ29uOworCXVuc2lnbmVkIGludCAqcHVpQ29ubmVjdGlvbjsKKworCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJaWYgKCh1aVRhcmdldE5vZGVJZF9wID09IEVQTF9DX0FEUl9JTlZBTElEKQorCSAgICB8fCAodWlUYXJnZXROb2RlSWRfcCA+PSBFUExfQ19BRFJfQlJPQURDQVNUKSkgeworCQlSZXQgPSBrRXBsU2RvQXNuZEludmFsaWROb2RlSWQ7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gZ2V0IGZyZWUgZW50cnkgaW4gY29udHJvbCBzdHJ1Y3R1cmUKKwl1aUNvdW50ID0gMDsKKwl1aUZyZWVDb24gPSBFUExfU0RPX01BWF9DT05ORUNUSU9OX0FTTkQ7CisJcHVpQ29ubmVjdGlvbiA9ICZTZG9Bc25kSW5zdGFuY2VfZy5tX2F1aVNkb0FzbmRDb25uZWN0aW9uWzBdOworCXdoaWxlICh1aUNvdW50IDwgRVBMX1NET19NQVhfQ09OTkVDVElPTl9BU05EKSB7CisJCWlmICgqcHVpQ29ubmVjdGlvbiA9PSB1aVRhcmdldE5vZGVJZF9wKSB7CS8vIGV4aXN0aW5nIGNvbm5lY3Rpb24gdG8gdGFyZ2V0IG5vZGUgZm91bmQKKwkJCS8vIHNhdmUgaGFuZGxlIGZvciBoaWdoZXIgbGF5ZXIKKwkJCSpwU2RvQ29uSGFuZGxlX3AgPSAodWlDb3VudCB8IEVQTF9TRE9fQVNORF9IQU5ETEUpOworCisJCQlnb3RvIEV4aXQ7CisJCX0gZWxzZSBpZiAoKnB1aUNvbm5lY3Rpb24gPT0gMCkgewkvLyBmcmVlIGVudHJ5LT4gc2F2ZSB0YXJnZXQgbm9kZUlkCisJCQl1aUZyZWVDb24gPSB1aUNvdW50OworCQl9CisJCXVpQ291bnQrKzsKKwkJcHVpQ29ubmVjdGlvbisrOworCX0KKworCWlmICh1aUZyZWVDb24gPT0gRVBMX1NET19NQVhfQ09OTkVDVElPTl9BU05EKSB7CisJCS8vIG5vIGZyZWUgY29ubmVjdGlvbgorCQlSZXQgPSBrRXBsU2RvQXNuZE5vRnJlZUhhbmRsZTsKKwl9IGVsc2UgeworCQlwdWlDb25uZWN0aW9uID0KKwkJICAgICZTZG9Bc25kSW5zdGFuY2VfZy5tX2F1aVNkb0FzbmRDb25uZWN0aW9uW3VpRnJlZUNvbl07CisJCSpwdWlDb25uZWN0aW9uID0gdWlUYXJnZXROb2RlSWRfcDsKKwkJLy8gc2F2ZSBoYW5kbGUgZm9yIGhpZ2hlciBsYXllcgorCQkqcFNkb0NvbkhhbmRsZV9wID0gKHVpRnJlZUNvbiB8IEVQTF9TRE9fQVNORF9IQU5ETEUpOworCisJCWdvdG8gRXhpdDsKKwl9CisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsU2RvQXNuZHVTZW5kRGF0YQorLy8KKy8vIERlc2NyaXB0aW9uOiBzZW5kIGRhdGEgdXNpbmcgZXhpc2l0aW5nIGNvbm5lY3Rpb24KKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6ICBTZG9Db25IYW5kbGVfcCAgPSBjb25uZWN0aW9uIGhhbmRsZQorLy8gICAgICAgICAgICAgIHBTcmNEYXRhX3AgICAgICA9IHBvaW50ZXIgdG8gZGF0YQorLy8gICAgICAgICAgICAgIGR3RGF0YVNpemVfcCAgICA9IG51bWJlciBvZiBkYXRhYnl0ZQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gd2l0aG91dCBhc25kLWhlYWRlciEhIQorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICA9IEVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordEVwbEtlcm5lbCBQVUJMSUMgRXBsU2RvQXNuZHVTZW5kRGF0YSh0RXBsU2RvQ29uSGRsIFNkb0NvbkhhbmRsZV9wLAorCQkJCSAgICAgIHRFcGxGcmFtZSAqIHBTcmNEYXRhX3AsCisJCQkJICAgICAgRFdPUkQgZHdEYXRhU2l6ZV9wKQoreworCXRFcGxLZXJuZWwgUmV0OworCXVuc2lnbmVkIGludCB1aUFycmF5OworCXRFcGxGcmFtZUluZm8gRnJhbWVJbmZvOworCisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwl1aUFycmF5ID0gKFNkb0NvbkhhbmRsZV9wICYgfkVQTF9TRE9fQVNZX0hBTkRMRV9NQVNLKTsKKworCWlmICh1aUFycmF5ID4gRVBMX1NET19NQVhfQ09OTkVDVElPTl9BU05EKSB7CisJCVJldCA9IGtFcGxTZG9Bc25kSW52YWxpZEhhbmRsZTsKKwkJZ290byBFeGl0OworCX0KKwkvLyBmaWxsb3V0IEFzbmQgaGVhZGVyCisJLy8gb3duIG5vZGUgaWQgbm90IG5lZWRlZCAtPiBmaWxsZWQgYnkgRExMCisKKwkvLyBzZXQgbWVzc2FnZSB0eXBlCisJQW1pU2V0Qnl0ZVRvTGUoJnBTcmNEYXRhX3AtPm1fbGVfYk1lc3NhZ2VUeXBlLCAoQllURSkga0VwbE1zZ1R5cGVBc25kKTsJLy8gQVNuZCA9PSAweDA2CisJLy8gdGFyZ2V0IG5vZGUgaWQKKwlBbWlTZXRCeXRlVG9MZSgmcFNyY0RhdGFfcC0+bV9sZV9iRHN0Tm9kZUlkLAorCQkgICAgICAgKEJZVEUpIFNkb0FzbmRJbnN0YW5jZV9nLgorCQkgICAgICAgbV9hdWlTZG9Bc25kQ29ubmVjdGlvblt1aUFycmF5XSk7CisJLy8gc2V0IHNvdXJjZS1ub2RlaWQgKGZpbGxlZCBieSBETEwgMCkKKwlBbWlTZXRCeXRlVG9MZSgmcFNyY0RhdGFfcC0+bV9sZV9iU3JjTm9kZUlkLCAweDAwKTsKKworCS8vIGNhbGMgc2l6ZQorCWR3RGF0YVNpemVfcCArPSBFUExfQVNORF9IRUFERVJfU0laRTsKKworCS8vIHNlbmQgZnVuY3Rpb24gb2YgRExMCisJRnJhbWVJbmZvLm1fdWlGcmFtZVNpemUgPSBkd0RhdGFTaXplX3A7CisJRnJhbWVJbmZvLm1fcEZyYW1lID0gcFNyY0RhdGFfcDsKKwlFUExfTUVNU0VUKCZGcmFtZUluZm8ubV9OZXRUaW1lLCAweDAwLCBzaXplb2YodEVwbE5ldFRpbWUpKTsKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfRExMVSkpICE9IDApCisJUmV0ID0gRXBsRGxsdUNhbEFzeW5jU2VuZCgmRnJhbWVJbmZvLCBrRXBsRGxsQXN5bmNSZXFQcmlvR2VuZXJpYyk7CisjZW5kaWYKKworICAgICAgRXhpdDoKKwlyZXR1cm4gUmV0OworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbFNkb0FzbmR1RGVsQ29uCisvLworLy8gRGVzY3JpcHRpb246IGRlbGV0ZSBjb25uZWN0aW9uIGZyb20gaW50ZXJuIHN0cnVjdHVyZQorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczogIFNkb0NvbkhhbmRsZV9wICA9IGNvbm5lY3Rpb24gaGFuZGxlCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgID0gRXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0RXBsS2VybmVsIFBVQkxJQyBFcGxTZG9Bc25kdURlbENvbih0RXBsU2RvQ29uSGRsIFNkb0NvbkhhbmRsZV9wKQoreworCXRFcGxLZXJuZWwgUmV0OworCXVuc2lnbmVkIGludCB1aUFycmF5OworCisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwl1aUFycmF5ID0gKFNkb0NvbkhhbmRsZV9wICYgfkVQTF9TRE9fQVNZX0hBTkRMRV9NQVNLKTsKKwkvLyBjaGVjayBwYXJhbWV0ZXIKKwlpZiAodWlBcnJheSA+IEVQTF9TRE9fTUFYX0NPTk5FQ1RJT05fQVNORCkgeworCQlSZXQgPSBrRXBsU2RvQXNuZEludmFsaWRIYW5kbGU7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gc2V0IHRhcmdldCBub2RlSWQgdG8gMAorCVNkb0FzbmRJbnN0YW5jZV9nLm1fYXVpU2RvQXNuZENvbm5lY3Rpb25bdWlBcnJheV0gPSAwOworCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7Cit9CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgUCBSIEkgViBBIFQgRSAgIEYgVSBOIEMgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxTZG9Bc25kdUNiCisvLworLy8gRGVzY3JpcHRpb246IGNhbGxiYWNrIGZ1bmN0aW9uIGZvciBTRE8gQVNuZCBmcmFtZXMKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6ICAgICAgcEZyYW1lSW5mb19wID0gRnJhbWUgd2l0aCBTRE8gcGF5bG9hZAorLy8KKy8vCisvLyBSZXR1cm5zOiAgICAgICAgIHRFcGxLZXJuZWwgPSBlcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3RFcGxLZXJuZWwgUFVCTElDIEVwbFNkb0FzbmR1Q2IodEVwbEZyYW1lSW5mbyAqIHBGcmFtZUluZm9fcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCXVuc2lnbmVkIGludCB1aUNvdW50OworCXVuc2lnbmVkIGludCAqcHVpQ29ubmVjdGlvbjsKKwl1bnNpZ25lZCBpbnQgdWlOb2RlSWQ7CisJdW5zaWduZWQgaW50IHVpRnJlZUVudHJ5ID0gMHhGRkZGOworCXRFcGxTZG9Db25IZGwgU2RvQ29uSGRsOworCXRFcGxGcmFtZSAqcEZyYW1lOworCisJcEZyYW1lID0gcEZyYW1lSW5mb19wLT5tX3BGcmFtZTsKKworCXVpTm9kZUlkID0gQW1pR2V0Qnl0ZUZyb21MZSgmcEZyYW1lLT5tX2xlX2JTcmNOb2RlSWQpOworCisJLy8gc2VhcmNoIGNvcnJlc3BvbmRpbmcgZW50cnkgaW4gY29udHJvbCBzdHJ1Y3R1cmUKKwl1aUNvdW50ID0gMDsKKwlwdWlDb25uZWN0aW9uID0gJlNkb0FzbmRJbnN0YW5jZV9nLm1fYXVpU2RvQXNuZENvbm5lY3Rpb25bMF07CisJd2hpbGUgKHVpQ291bnQgPCBFUExfU0RPX01BWF9DT05ORUNUSU9OX0FTTkQpIHsKKwkJaWYgKHVpTm9kZUlkID09ICpwdWlDb25uZWN0aW9uKSB7CisJCQlicmVhazsKKwkJfSBlbHNlIGlmICgoKnB1aUNvbm5lY3Rpb24gPT0gMCkKKwkJCSAgICYmICh1aUZyZWVFbnRyeSA9PSAweEZGRkYpKSB7CS8vIGZyZWUgZW50cnkKKwkJCXVpRnJlZUVudHJ5ID0gdWlDb3VudDsKKwkJfQorCQl1aUNvdW50Kys7CisJCXB1aUNvbm5lY3Rpb24rKzsKKwl9CisKKwlpZiAodWlDb3VudCA9PSBFUExfU0RPX01BWF9DT05ORUNUSU9OX0FTTkQpIHsKKwkJaWYgKHVpRnJlZUVudHJ5ICE9IDB4RkZGRikgeworCQkJcHVpQ29ubmVjdGlvbiA9CisJCQkgICAgJlNkb0FzbmRJbnN0YW5jZV9nLgorCQkJICAgIG1fYXVpU2RvQXNuZENvbm5lY3Rpb25bdWlGcmVlRW50cnldOworCQkJKnB1aUNvbm5lY3Rpb24gPSB1aU5vZGVJZDsKKwkJCXVpQ291bnQgPSB1aUZyZWVFbnRyeTsKKwkJfSBlbHNlIHsKKwkJCUVQTF9EQkdMVkxfU0RPX1RSQUNFMAorCQkJICAgICgiRXBsU2RvQXNuZHVDYigpOiBubyBmcmVlIGhhbmRsZVxuIik7CisJCQlnb3RvIEV4aXQ7CisJCX0KKwl9CisvLyAgICBpZiAodWlOb2RlSWQgPT0gKnB1aUNvbm5lY3Rpb24pCisJewkJCS8vIGVudHJ5IGZvdW5kIG9yIGNyZWF0ZWQKKwkJU2RvQ29uSGRsID0gKHVpQ291bnQgfCBFUExfU0RPX0FTTkRfSEFORExFKTsKKworCQlTZG9Bc25kSW5zdGFuY2VfZy5tX2ZwU2RvQXN5U2VxQ2IoU2RvQ29uSGRsLAorCQkJCQkJICAmcEZyYW1lLT5tX0RhdGEubV9Bc25kLgorCQkJCQkJICBtX1BheWxvYWQubV9TZG9TZXF1ZW5jZUZyYW1lLAorCQkJCQkJICAocEZyYW1lSW5mb19wLT5tX3VpRnJhbWVTaXplIC0KKwkJCQkJCSAgIDE4KSk7CisJfQorCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7CisKK30KKworI2VuZGlmIC8vIGVuZCBvZiAjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1NET19BU05EKSkgIT0gMCkKKy8vIEVPRgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxTZG9Bc3lTZXF1LmMgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbFNkb0FzeVNlcXUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjZhOTk3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxTZG9Bc3lTZXF1LmMKQEAgLTAsMCArMSwyNTIyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgb3BlblBPV0VSTElOSworCisgIERlc2NyaXB0aW9uOiAgc291cmNlIGZpbGUgZm9yIGFzeWNocm9ub3VzIFNETyBTZXF1ZW5jZSBMYXllciBtb2R1bGUKKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgICAgICAgICRSQ1NmaWxlOiBFcGxTZG9Bc3lTZXF1LmMsdiAkCisKKyAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAorCisgICAgICAgICAgICAgICAgJFJldmlzaW9uOiAxLjEwICQgICREYXRlOiAyMDA4LzExLzEzIDE3OjEzOjA5ICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorICAgICAgICAgICAgICAgICAgICBHQ0MgVjMuNAorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgIDIwMDYvMDYvMjYgay50LjogICBzdGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgInVzZXIvRXBsU2RvQXN5U2VxdS5oIgorCisjaWYgKCgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfU0RPX1VEUCkpID09IDApICYmXAorICAgICAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1NET19BU05EKSkgPT0gMCkgICApCisKKyNlcnJvciAnRVJST1I6IEF0IGxlYXN0IFVEUCBvciBBc25kIG1vZHVsZSBuZWVkZWQhJworCisjZW5kaWYKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIEcgTCBPIEIgQSBMICAgRCBFIEYgSSBOIEkgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZGVmaW5lIEVQTF9TRE9fSElTVE9SWV9TSVpFICAgICAgICA1CisKKyNpZm5kZWYgRVBMX01BWF9TRE9fU0VRX0NPTgorI2RlZmluZSBFUExfTUFYX1NET19TRVFfQ09OICAgICAgICAgMTAKKyNlbmRpZgorCisjZGVmaW5lIEVQTF9TRVFfREVGQVVMVF9USU1FT1VUICAgICA1MDAwCS8vIGluIFttc10gPT4gNSBzZWMKKworI2RlZmluZSBFUExfU0VRX1JFVFJZX0NPVU5UICAgICAgICAgNQkvLyA9PiBtYXguIFRpbWVvdXQgMzAgc2VjCisKKyNkZWZpbmUgRVBMX1NFUV9OVU1fVEhSRVNIT0xEICAgICAgIDEwMAkvLyB0aHJlc2hvbGQgd2hpY2ggZGlzdGluZ3Vpc2hlcyBiZXR3ZWVuIG9sZCBhbmQgbmV3IHNlcXVlbmNlIG51bWJlcnMKKworLy8gZGVmaW5lIGZyYW1lIHdpdGggc2l6ZSBvZiBBc25kLUhlYWRlci0sIFNETyBTZXF1ZW56ZSBIZWFkZXIgc2l6ZSwgU0RPIENvbW1hbmQgaGVhZGVyCisvLyBhbmQgRXRoZXJuZXQtSGVhZGVyIHNpemUKKyNkZWZpbmUgRVBMX1NFUV9GUkFNRV9TSVpFICAgICAgICAgIDI0CisvLyBzaXplIG9mIHRoZSBoZWFkZXIgb2YgdGhlIGFzeW5jaHJvbnVzIFNETyBTZXF1ZW5jZSBsYXllcgorI2RlZmluZSBFUExfU0VRX0hFQURFUl9TSVpFICAgICAgICAgNAorCisvLyBidWZmZXJzaXplIGZvciBvbmUgZnJhbWUgaW4gaGlzdG9yeQorI2RlZmluZSBFUExfU0VRX0hJU1RST1lfRlJBTUVfU0laRSAgRVBMX01BWF9TRE9fRlJBTUVfU0laRQorCisvLyBtYXNrIHRvIGdldCBzY29uIGFuZCByY29uCisjZGVmaW5lIEVQTF9BU1lfU0RPX0NPTl9NQVNLICAgICAgICAweDAzCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCB0eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gZXZlbnRzIGZvciBwcm9jZXNzZnVuY3Rpb24KK3R5cGVkZWYgZW51bSB7CisJa0FzeVNkb1NlcUV2ZW50Tm9FdmVudCA9IDB4MDAsCS8vIG5vIEV2ZW50CisJa0FzeVNkb1NlcUV2ZW50SW5pdENvbiA9IDB4MDEsCS8vIGluaXQgY29ubmVjdGlvbgorCWtBc3lTZG9TZXFFdmVudEZyYW1lUmVjID0gMHgwMiwJLy8gZnJhbWUgcmVjZWl2ZWQKKwlrQXN5U2RvU2VxRXZlbnRGcmFtZVNlbmQgPSAweDAzLAkvLyBmcmFtZSB0byBzZW5kCisJa0FzeVNkb1NlcUV2ZW50VGltZW91dCA9IDB4MDQsCS8vIFRpbWVvdXQgZm9yIGNvbm5lY3Rpb24KKwlrQXN5U2RvU2VxRXZlbnRDbG9zZUNvbiA9IDB4MDUJLy8gaGlnaGVyIGxheWVyIGNsb3NlIGNvbm5lY3Rpb24KK30gdEVwbEFzeVNkb1NlcUV2ZW50OworCisvLyBzdHJ1Y3R1cmUgZm9yIEhpc3RvcnktQnVmZmVyCit0eXBlZGVmIHN0cnVjdCB7CisJQllURSBtX2JGcmVlRW50cmllczsKKwlCWVRFIG1fYldyaXRlOwkJLy8gaW5kZXggb2YgdGhlIG5leHQgZnJlZSBidWZmZXIgZW50cnkKKwlCWVRFIG1fYkFjazsJCS8vIGluZGV4IG9mIHRoZSBuZXh0IG1lc3NhZ2Ugd2hpY2ggc2hvdWxkIGJlY29tZSBhY2tub3dsZWRnZWQKKwlCWVRFIG1fYlJlYWQ7CQkvLyBpbmRleCBiZXR3ZWVuIG1fYkFjayBhbmQgbV9iV3JpdGUgdG8gdGhlIG5leHQgbWVzc2FnZSBmb3IgcmV0cmFuc21pc3Npb24KKwlCWVRFIG1fYWFiSGlzdG9yeUZyYW1lW0VQTF9TRE9fSElTVE9SWV9TSVpFXQorCSAgICBbRVBMX1NFUV9ISVNUUk9ZX0ZSQU1FX1NJWkVdOworCXVuc2lnbmVkIGludCBtX2F1aUZyYW1lU2l6ZVtFUExfU0RPX0hJU1RPUllfU0laRV07CisKK30gdEVwbEFzeVNkb0Nvbkhpc3Rvcnk7CisKKy8vIHN0YXRlIG9mIHRoZSBzdGF0ZW1hc2NoaW5lCit0eXBlZGVmIGVudW0geworCWtFcGxBc3lTZG9TdGF0ZUlkbGUgPSAweDAwLAorCWtFcGxBc3lTZG9TdGF0ZUluaXQxID0gMHgwMSwKKwlrRXBsQXN5U2RvU3RhdGVJbml0MiA9IDB4MDIsCisJa0VwbEFzeVNkb1N0YXRlSW5pdDMgPSAweDAzLAorCWtFcGxBc3lTZG9TdGF0ZUNvbm5lY3RlZCA9IDB4MDQsCisJa0VwbEFzeVNkb1N0YXRlV2FpdEFjayA9IDB4MDUKK30gdEVwbEFzeVNkb1N0YXRlOworCisvLyBjb25uZWN0aW9uIGNvbnRyb2wgc3RydWN0dXJlCit0eXBlZGVmIHN0cnVjdCB7CisJdEVwbFNkb0NvbkhkbCBtX0NvbkhhbmRsZTsKKwl0RXBsQXN5U2RvU3RhdGUgbV9TZG9TdGF0ZTsKKwlCWVRFIG1fYlJlY1NlcU51bTsJLy8gbmFtZSBmcm9tIHZpZXcgb2YgdGhlIGNvbW11bmljYXRpb24gcGFydG5lcgorCUJZVEUgbV9iU2VuZFNlcU51bTsJLy8gbmFtZSBmcm9tIHZpZXcgb2YgdGhlIGNvbW11bmljYXRpb24gcGFydG5lcgorCXRFcGxBc3lTZG9Db25IaXN0b3J5IG1fU2RvQ29uSGlzdG9yeTsKKwl0RXBsVGltZXJIZGwgbV9FcGxUaW1lckhkbDsKKwl1bnNpZ25lZCBpbnQgbV91aVJldHJ5Q291bnQ7CS8vIHJldHJ5IGNvdW50ZXIKKwl1bnNpZ25lZCBpbnQgbV91aVVzZUNvdW50OwkvLyBvbmUgc2VxdWVuY2UgbGF5ZXIgY29ubmVjdGlvbiBtYXkgYmUgdXNlZCBieQorCS8vIG11bHRpcGxlIGNvbW1hbmQgbGF5ZXIgY29ubmVjdGlvbnMKKworfSB0RXBsQXN5U2RvU2VxQ29uOworCisvLyBpbnN0YW5jZSBzdHJ1Y3R1cmUKK3R5cGVkZWYgc3RydWN0IHsKKwl0RXBsQXN5U2RvU2VxQ29uIG1fQXN5U2RvQ29ubmVjdGlvbltFUExfTUFYX1NET19TRVFfQ09OXTsKKwl0RXBsU2RvQ29tUmVjZWl2ZUNiIG1fZnBTZG9Db21SZWNlaXZlQ2I7CisJdEVwbFNkb0NvbUNvbkNiIG1fZnBTZG9Db21Db25DYjsKKworI2lmIGRlZmluZWQoV0lOMzIpIHx8IGRlZmluZWQoX1dJTjMyKQorCUxQQ1JJVElDQUxfU0VDVElPTiBtX3BDcml0aWNhbFNlY3Rpb247CisJQ1JJVElDQUxfU0VDVElPTiBtX0NyaXRpY2FsU2VjdGlvbjsKKworCUxQQ1JJVElDQUxfU0VDVElPTiBtX3BDcml0aWNhbFNlY3Rpb25SZWNlaXZlOworCUNSSVRJQ0FMX1NFQ1RJT04gbV9Dcml0aWNhbFNlY3Rpb25SZWNlaXZlOworI2VuZGlmCisKK30gdEVwbEFzeVNkb1NlcXVJbnN0YW5jZTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIG1vZHVsIGdsb2JhbGUgdmFycworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHRFcGxBc3lTZG9TZXF1SW5zdGFuY2UgQXN5U2RvU2VxdUluc3RhbmNlX2c7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdEVwbEtlcm5lbCBFcGxTZG9Bc3lTZXFQcm9jZXNzKHVuc2lnbmVkIGludCB1aUhhbmRsZV9wLAorCQkJCSAgICAgIHVuc2lnbmVkIGludCB1aURhdGFTaXplX3AsCisJCQkJICAgICAgdEVwbEZyYW1lICogcERhdGFfcCwKKwkJCQkgICAgICB0RXBsQXN5U2RvU2VxICogcFJlY0ZyYW1lX3AsCisJCQkJICAgICAgdEVwbEFzeVNkb1NlcUV2ZW50IEV2ZW50X3ApOworCitzdGF0aWMgdEVwbEtlcm5lbCBFcGxTZG9Bc3lTZXFTZW5kSW50ZXJuKHRFcGxBc3lTZG9TZXFDb24gKiBwQXN5U2RvU2VxQ29uX3AsCisJCQkJCSB1bnNpZ25lZCBpbnQgdWlEYXRhU2l6ZV9wLAorCQkJCQkgdEVwbEZyYW1lICogcERhdGFfcCwKKwkJCQkJIEJPT0wgZkZyYW1lSW5IaXN0b3J5KTsKKworc3RhdGljIHRFcGxLZXJuZWwgRXBsU2RvQXN5U2VxU2VuZExvd2VyTGF5ZXIodEVwbEFzeVNkb1NlcUNvbiAqIHBBc3lTZG9TZXFDb25fcCwKKwkJCQkJICAgICB1bnNpZ25lZCBpbnQgdWlEYXRhU2l6ZV9wLAorCQkJCQkgICAgIHRFcGxGcmFtZSAqIHBFcGxGcmFtZV9wKTsKKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsU2RvQXN5UmVjZWl2ZUNiKHRFcGxTZG9Db25IZGwgQ29uSGRsX3AsCisJCQkJICAgICB0RXBsQXN5U2RvU2VxICogcFNkb1NlcURhdGFfcCwKKwkJCQkgICAgIHVuc2lnbmVkIGludCB1aURhdGFTaXplX3ApOworCitzdGF0aWMgdEVwbEtlcm5lbCBFcGxTZG9Bc3lJbml0SGlzdG9yeSh2b2lkKTsKKworc3RhdGljIHRFcGxLZXJuZWwgRXBsU2RvQXN5QWRkRnJhbWVUb0hpc3RvcnkodEVwbEFzeVNkb1NlcUNvbiAqIHBBc3lTZG9TZXFDb25fcCwKKwkJCQkJICAgICB0RXBsRnJhbWUgKiBwRnJhbWVfcCwKKwkJCQkJICAgICB1bnNpZ25lZCBpbnQgdWlTaXplX3ApOworCitzdGF0aWMgdEVwbEtlcm5lbCBFcGxTZG9Bc3lBY2tGcmFtZVRvSGlzdG9yeSh0RXBsQXN5U2RvU2VxQ29uICogcEFzeVNkb1NlcUNvbl9wLAorCQkJCQkgICAgIEJZVEUgYlJlY1NlcU51bWJlcl9wKTsKKworc3RhdGljIHRFcGxLZXJuZWwgRXBsU2RvQXN5UmVhZEZyb21IaXN0b3J5KHRFcGxBc3lTZG9TZXFDb24gKiBwQXN5U2RvU2VxQ29uX3AsCisJCQkJCSAgIHRFcGxGcmFtZSAqKiBwcEZyYW1lX3AsCisJCQkJCSAgIHVuc2lnbmVkIGludCAqcHVpU2l6ZV9wLAorCQkJCQkgICBCT09MIGZJbml0UmVhZCk7CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgRXBsU2RvQXN5R2V0RnJlZUVudHJpZXNGcm9tSGlzdG9yeSh0RXBsQXN5U2RvU2VxQ29uICoKKwkJCQkJCSAgICAgICBwQXN5U2RvU2VxQ29uX3ApOworCitzdGF0aWMgdEVwbEtlcm5lbCBFcGxTZG9Bc3lTZXFTZXRUaW1lcih0RXBsQXN5U2RvU2VxQ29uICogcEFzeVNkb1NlcUNvbl9wLAorCQkJCSAgICAgICB1bnNpZ25lZCBsb25nIHVsVGltZW91dCk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIEMgTCBBIFMgUyAgPEVQTCBhc3ljaHJvbnVzIFNETyBTZXF1ZW5jZSBsYXllcj4gICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvLworLy8gRGVzY3JpcHRpb246IHRoaXMgbW9kdWxlIGNvbnRhaW5zIHRoZSBhc3luY2hyb251cyBTRE8gU2VxdWVuY2UgTGF5ZXIgZm9yCisvLyAgICAgICAgICAgICAgdGhlIEVQTCBTRE8gc2VydmljZQorLy8KKy8vCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgIFAgVSBCIEwgSSBDICAgRiBVIE4gQyBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsU2RvQXN5U2VxSW5pdAorLy8KKy8vIERlc2NyaXB0aW9uOiBpbml0IGZpcnN0IGluc3RhbmNlCisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOiAgZnBTZG9Db21DYl9wICAgID0gY2FsbGJhY2sgZnVuY3Rpb24gdG8gaW5mb3JtIENvbW1hbmQgbGF5ZXIKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYm91dCBuZXcgZnJhbWVzCisvLyAgICAgICAgICAgICAgZnBTZG9Db21Db25DYl9wID0gY2FsbGJhY2sgZnVuY3Rpb24gdG8gaW5mb3JtIGNvbW1hbmQgbGF5ZXIKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYm91dCBjb25uZWN0aW9uIHN0YXRlCisvLworLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsID0gZXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0RXBsS2VybmVsIFBVQkxJQyBFcGxTZG9Bc3lTZXFJbml0KHRFcGxTZG9Db21SZWNlaXZlQ2IgZnBTZG9Db21DYl9wLAorCQkJCSAgIHRFcGxTZG9Db21Db25DYiBmcFNkb0NvbUNvbkNiX3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisKKwlSZXQgPSBFcGxTZG9Bc3lTZXFBZGRJbnN0YW5jZShmcFNkb0NvbUNiX3AsIGZwU2RvQ29tQ29uQ2JfcCk7CisKKwlyZXR1cm4gUmV0OworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbFNkb0FzeVNlcUFkZEluc3RhbmNlCisvLworLy8gRGVzY3JpcHRpb246IGluaXQgZm9sbG93aW5nIGluc3RhbmNlcworLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczogIGZwU2RvQ29tQ2JfcCAgICA9IGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGluZm9ybSBDb21tYW5kIGxheWVyCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJvdXQgbmV3IGZyYW1lcworLy8gICAgICAgICAgICAgIGZwU2RvQ29tQ29uQ2JfcCA9IGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGluZm9ybSBjb21tYW5kIGxheWVyCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJvdXQgY29ubmVjdGlvbiBzdGF0ZQorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsID0gZXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0RXBsS2VybmVsIFBVQkxJQyBFcGxTZG9Bc3lTZXFBZGRJbnN0YW5jZSh0RXBsU2RvQ29tUmVjZWl2ZUNiIGZwU2RvQ29tQ2JfcCwKKwkJCQkJICB0RXBsU2RvQ29tQ29uQ2IgZnBTZG9Db21Db25DYl9wKQoreworCXRFcGxLZXJuZWwgUmV0OworCisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwkvLyBjaGVjayBmdW5jdGlvbnBvaW50ZXIKKwlpZiAoZnBTZG9Db21DYl9wID09IE5VTEwpIHsKKwkJUmV0ID0ga0VwbFNkb1NlcU1pc3NDYjsKKwkJZ290byBFeGl0OworCX0gZWxzZSB7CisJCUFzeVNkb1NlcXVJbnN0YW5jZV9nLm1fZnBTZG9Db21SZWNlaXZlQ2IgPSBmcFNkb0NvbUNiX3A7CisJfQorCisJLy8gY2hlY2sgZnVuY3Rpb25wb2ludGVyCisJaWYgKGZwU2RvQ29tQ29uQ2JfcCA9PSBOVUxMKSB7CisJCVJldCA9IGtFcGxTZG9TZXFNaXNzQ2I7CisJCWdvdG8gRXhpdDsKKwl9IGVsc2UgeworCQlBc3lTZG9TZXF1SW5zdGFuY2VfZy5tX2ZwU2RvQ29tQ29uQ2IgPSBmcFNkb0NvbUNvbkNiX3A7CisJfQorCisJLy8gc2V0IGNvbnRyb2xsc3RydWN0dXJlIHRvIDAKKwlFUExfTUVNU0VUKCZBc3lTZG9TZXF1SW5zdGFuY2VfZy5tX0FzeVNkb0Nvbm5lY3Rpb25bMF0sIDB4MDAsCisJCSAgIHNpemVvZihBc3lTZG9TZXF1SW5zdGFuY2VfZy5tX0FzeVNkb0Nvbm5lY3Rpb24pKTsKKworCS8vIGluaXQgSGlzdG9yeQorCVJldCA9IEVwbFNkb0FzeUluaXRIaXN0b3J5KCk7CisJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQlnb3RvIEV4aXQ7CisJfQorI2lmIGRlZmluZWQoV0lOMzIpIHx8IGRlZmluZWQoX1dJTjMyKQorCS8vIGNyZWF0ZSBjcml0aWNhbCBzZWN0aW9uIGZvciBwcm9jZXNzIGZ1bmN0aW9uCisJQXN5U2RvU2VxdUluc3RhbmNlX2cubV9wQ3JpdGljYWxTZWN0aW9uID0KKwkgICAgJkFzeVNkb1NlcXVJbnN0YW5jZV9nLm1fQ3JpdGljYWxTZWN0aW9uOworCUluaXRpYWxpemVDcml0aWNhbFNlY3Rpb24oQXN5U2RvU2VxdUluc3RhbmNlX2cubV9wQ3JpdGljYWxTZWN0aW9uKTsKKworCS8vIGluaXQgY3JpdGljYWwgc2VjdGlvbiBmb3IgcmVjZWl2ZSBjYiBmdW5jdGlvbgorCUFzeVNkb1NlcXVJbnN0YW5jZV9nLm1fcENyaXRpY2FsU2VjdGlvblJlY2VpdmUgPQorCSAgICAmQXN5U2RvU2VxdUluc3RhbmNlX2cubV9Dcml0aWNhbFNlY3Rpb25SZWNlaXZlOworCUluaXRpYWxpemVDcml0aWNhbFNlY3Rpb24oQXN5U2RvU2VxdUluc3RhbmNlX2cuCisJCQkJICBtX3BDcml0aWNhbFNlY3Rpb25SZWNlaXZlKTsKKyNlbmRpZgorCisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1NET19VRFApKSAhPSAwKQorCS8vIGluaXQgbG93ZXIgbGF5ZXIKKwlSZXQgPSBFcGxTZG9VZHB1QWRkSW5zdGFuY2UoRXBsU2RvQXN5UmVjZWl2ZUNiKTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCWdvdG8gRXhpdDsKKwl9CisjZW5kaWYKKworI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9TRE9fQVNORCkpICE9IDApCisJLy8gaW5pdCBsb3dlciBsYXllcgorCVJldCA9IEVwbFNkb0FzbmR1QWRkSW5zdGFuY2UoRXBsU2RvQXN5UmVjZWl2ZUNiKTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCWdvdG8gRXhpdDsKKwl9CisjZW5kaWYKKworICAgICAgRXhpdDoKKwlyZXR1cm4gUmV0OworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbFNkb0FzeVNlcURlbEluc3RhbmNlCisvLworLy8gRGVzY3JpcHRpb246IGRlbGV0ZSBpbnN0YW5jZXMKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6CisvLworLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsID0gZXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0RXBsS2VybmVsIFBVQkxJQyBFcGxTZG9Bc3lTZXFEZWxJbnN0YW5jZSgpCit7CisJdEVwbEtlcm5lbCBSZXQ7CisJdW5zaWduZWQgaW50IHVpQ291bnQ7CisJdEVwbEFzeVNkb1NlcUNvbiAqcEFzeVNkb1NlcUNvbjsKKworCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJLy8gZGVsZXRlIHRpbWVyIG9mIG9wZW4gY29ubmVjdGlvbnMKKwl1aUNvdW50ID0gMDsKKwlwQXN5U2RvU2VxQ29uID0gJkFzeVNkb1NlcXVJbnN0YW5jZV9nLm1fQXN5U2RvQ29ubmVjdGlvblswXTsKKwl3aGlsZSAodWlDb3VudCA8IEVQTF9NQVhfU0RPX1NFUV9DT04pIHsKKwkJaWYgKHBBc3lTZG9TZXFDb24tPm1fQ29uSGFuZGxlICE9IDApIHsKKwkJCUVwbFRpbWVydURlbGV0ZVRpbWVyKCZwQXN5U2RvU2VxQ29uLT5tX0VwbFRpbWVySGRsKTsKKwkJfQorCQl1aUNvdW50Kys7CisJCXBBc3lTZG9TZXFDb24rKzsKKwl9CisKKyNpZiBkZWZpbmVkKFdJTjMyKSB8fCBkZWZpbmVkKF9XSU4zMikKKwkvLyBkZWxldGUgY3JpdGljYWwgc2VjdGlvbiBmb3IgcHJvY2VzcyBmdW5jdGlvbgorCURlbGV0ZUNyaXRpY2FsU2VjdGlvbihBc3lTZG9TZXF1SW5zdGFuY2VfZy5tX3BDcml0aWNhbFNlY3Rpb24pOworI2VuZGlmCisKKwkvLyBzZXQgaW5zdGFuY2UtdGFibGUgdG8gMAorCUVQTF9NRU1TRVQoJkFzeVNkb1NlcXVJbnN0YW5jZV9nLCAweDAwLCBzaXplb2YoQXN5U2RvU2VxdUluc3RhbmNlX2cpKTsKKworI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9TRE9fVURQKSkgIT0gMCkKKwkvLyBkZWxldGUgbG93ZXIgbGF5ZXIKKwlSZXQgPSBFcGxTZG9VZHB1RGVsSW5zdGFuY2UoKTsKKyNlbmRpZgorCisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1NET19BU05EKSkgIT0gMCkKKwkvLyBkZWxldGUgbG93ZXIgbGF5ZXIKKwlSZXQgPSBFcGxTZG9Bc25kdURlbEluc3RhbmNlKCk7CisjZW5kaWYKKworCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbFNkb0FzeVNlcUluaXRDb24KKy8vCisvLyBEZXNjcmlwdGlvbjogc3RhcnQgaW5pdGlhbGl6YXRpb24gb2YgYSBzZXF1ZW5jZSBsYXllciBjb25uZWN0aW9uLgorLy8gICAgICAgICAgICAgIEl0IHRyaWVzIHRvIHJldXNlIGFuIGV4aXN0aW5nIGNvbm5lY3Rpb24gdG8gdGhlIHNhbWUgbm9kZS4KKy8vCisvLworLy8gUGFyYW1ldGVyczogIHBTZG9TZXFDb25IZGxfcCA9IHBvaW50ZXIgdG8gdGhlIHZhcmlhYmxlIGZvciB0aGUgY29ubmVjdGlvbiBoYW5kbGUKKy8vICAgICAgICAgICAgICB1aU5vZGVJZF9wICAgICAgPSBOb2RlIElkIG9mIHRoZSB0YXJnZXQKKy8vICAgICAgICAgICAgICBTZG9UeXBlICAgICAgICAgID0gVHlwZSBvZiB0aGUgU0RPIGNvbm5lY3Rpb24KKy8vCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgPSBlcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3RFcGxLZXJuZWwgUFVCTElDIEVwbFNkb0FzeVNlcUluaXRDb24odEVwbFNkb1NlcUNvbkhkbCAqIHBTZG9TZXFDb25IZGxfcCwKKwkJCQkgICAgICB1bnNpZ25lZCBpbnQgdWlOb2RlSWRfcCwKKwkJCQkgICAgICB0RXBsU2RvVHlwZSBTZG9UeXBlKQoreworCXRFcGxLZXJuZWwgUmV0OworCXVuc2lnbmVkIGludCB1aUNvdW50OworCXVuc2lnbmVkIGludCB1aUZyZWVDb247CisJdEVwbFNkb0NvbkhkbCBDb25IYW5kbGU7CisJdEVwbEFzeVNkb1NlcUNvbiAqcEFzeVNkb1NlcUNvbjsKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCS8vIGNoZWNrIFNkb1R5cGUKKwkvLyBjYWxsIGluaXQgZnVuY3Rpb24gb2YgdGhlIHByb3Rjb2wgYWJzdHJhY3Rpb24gbGF5ZXIKKwkvLyB3aGljaCB0cmllcyB0byBmaW5kIGFuIGV4aXN0aW5nIGNvbm5lY3Rpb24gdG8gdGhlIHNhbWUgbm9kZQorCXN3aXRjaCAoU2RvVHlwZSkgeworCQkvLyBTRE8gb3ZlciBVRFAKKwljYXNlIGtFcGxTZG9UeXBlVWRwOgorCQl7CisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1NET19VRFApKSAhPSAwKQorCQkJUmV0ID0gRXBsU2RvVWRwdUluaXRDb24oJkNvbkhhbmRsZSwgdWlOb2RlSWRfcCk7CisJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQkJZ290byBFeGl0OworCQkJfQorI2Vsc2UKKwkJCVJldCA9IGtFcGxTZG9TZXFVbnN1cHBvcnRlZFByb3Q7CisjZW5kaWYKKwkJCWJyZWFrOworCQl9CisKKwkJLy8gU0RPIG92ZXIgQXNuZAorCWNhc2Uga0VwbFNkb1R5cGVBc25kOgorCQl7CisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1NET19BU05EKSkgIT0gMCkKKwkJCVJldCA9IEVwbFNkb0FzbmR1SW5pdENvbigmQ29uSGFuZGxlLCB1aU5vZGVJZF9wKTsKKwkJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCQlnb3RvIEV4aXQ7CisJCQl9CisjZWxzZQorCQkJUmV0ID0ga0VwbFNkb1NlcVVuc3VwcG9ydGVkUHJvdDsKKyNlbmRpZgorCQkJYnJlYWs7CisJCX0KKworCQkvLyB1bnN1cHBvcnRlZCBwcm90b2NvbHMKKwkJLy8gLT4gYXV0byBzaG91bGQgYmUgcmVwbGFjZWQgYnkgY29tbWFuZCBsYXllcgorCWNhc2Uga0VwbFNkb1R5cGVBdXRvOgorCWNhc2Uga0VwbFNkb1R5cGVQZG86CisJZGVmYXVsdDoKKwkJeworCQkJUmV0ID0ga0VwbFNkb1NlcVVuc3VwcG9ydGVkUHJvdDsKKwkJCWdvdG8gRXhpdDsKKwkJfQorCisJfQkJCS8vIGVuZCBvZiBzd2l0Y2goU2RvVHlwZSkKKworCS8vIGZpbmQgZXhpc3RpbmcgY29ubmVjdGlvbiB0byB0aGUgc2FtZSBub2RlIG9yIGZpbmQgZW1wdHkgZW50cnkgZm9yIGNvbm5lY3Rpb24KKwl1aUNvdW50ID0gMDsKKwl1aUZyZWVDb24gPSBFUExfTUFYX1NET19TRVFfQ09OOworCXBBc3lTZG9TZXFDb24gPSAmQXN5U2RvU2VxdUluc3RhbmNlX2cubV9Bc3lTZG9Db25uZWN0aW9uWzBdOworCisJd2hpbGUgKHVpQ291bnQgPCBFUExfTUFYX1NET19TRVFfQ09OKSB7CisJCWlmIChwQXN5U2RvU2VxQ29uLT5tX0NvbkhhbmRsZSA9PSBDb25IYW5kbGUpIHsJLy8gZXhpc3RpbmcgY29ubmVjdGlvbiBmb3VuZAorCQkJYnJlYWs7CisJCX0KKwkJaWYgKHBBc3lTZG9TZXFDb24tPm1fQ29uSGFuZGxlID09IDApIHsKKwkJCXVpRnJlZUNvbiA9IHVpQ291bnQ7CisJCX0KKwkJdWlDb3VudCsrOworCQlwQXN5U2RvU2VxQ29uKys7CisJfQorCisJaWYgKHVpQ291bnQgPT0gRVBMX01BWF9TRE9fU0VRX0NPTikgeworCQlpZiAodWlGcmVlQ29uID09IEVQTF9NQVhfU0RPX1NFUV9DT04pIHsJLy8gbm8gZnJlZSBlbnRyeSBmb3VuZAorCQkJc3dpdGNoIChTZG9UeXBlKSB7CisJCQkJLy8gU0RPIG92ZXIgVURQCisJCQljYXNlIGtFcGxTZG9UeXBlVWRwOgorCQkJCXsKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfU0RPX1VEUCkpICE9IDApCisJCQkJCVJldCA9IEVwbFNkb1VkcHVEZWxDb24oQ29uSGFuZGxlKTsKKwkJCQkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJCQkJZ290byBFeGl0OworCQkJCQl9CisjZW5kaWYKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gU0RPIG92ZXIgQXNuZAorCQkJY2FzZSBrRXBsU2RvVHlwZUFzbmQ6CisJCQkJeworI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9TRE9fQVNORCkpICE9IDApCisJCQkJCVJldCA9IEVwbFNkb0FzbmR1RGVsQ29uKENvbkhhbmRsZSk7CisJCQkJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCQkJCWdvdG8gRXhpdDsKKwkJCQkJfQorI2VuZGlmCisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIHVuc3VwcG9ydGVkIHByb3RvY29scworCQkJCS8vIC0+IGF1dG8gc2hvdWxkIGJlIHJlcGxhY2VkIGJ5IGNvbW1hbmQgbGF5ZXIKKwkJCWNhc2Uga0VwbFNkb1R5cGVBdXRvOgorCQkJY2FzZSBrRXBsU2RvVHlwZVBkbzoKKwkJCWRlZmF1bHQ6CisJCQkJeworCQkJCQlSZXQgPSBrRXBsU2RvU2VxVW5zdXBwb3J0ZWRQcm90OworCQkJCQlnb3RvIEV4aXQ7CisJCQkJfQorCisJCQl9CS8vIGVuZCBvZiBzd2l0Y2goU2RvVHlwZSkKKworCQkJUmV0ID0ga0VwbFNkb1NlcU5vRnJlZUhhbmRsZTsKKwkJCWdvdG8gRXhpdDsKKwkJfSBlbHNlIHsJLy8gZnJlZSBlbnRyeSBmb3VuZAorCQkJcEFzeVNkb1NlcUNvbiA9CisJCQkgICAgJkFzeVNkb1NlcXVJbnN0YW5jZV9nLm1fQXN5U2RvQ29ubmVjdGlvblt1aUZyZWVDb25dOworCQkJcEFzeVNkb1NlcUNvbi0+bV9Db25IYW5kbGUgPSBDb25IYW5kbGU7CisJCQl1aUNvdW50ID0gdWlGcmVlQ29uOworCQl9CisJfQorCS8vIHNldCBoYW5kbGUKKwkqcFNkb1NlcUNvbkhkbF9wID0gKHVpQ291bnQgfCBFUExfU0RPX0FTWV9IQU5ETEUpOworCisJLy8gaW5jcmVtZW50IHVzZSBjb3VudGVyCisJcEFzeVNkb1NlcUNvbi0+bV91aVVzZUNvdW50Kys7CisKKwkvLyBjYWxsIGludGVybiBwcm9jZXNzIGZ1bmN0aW9uCisJUmV0ID0gRXBsU2RvQXN5U2VxUHJvY2Vzcyh1aUNvdW50LAorCQkJCSAgMCwgTlVMTCwgTlVMTCwga0FzeVNkb1NlcUV2ZW50SW5pdENvbik7CisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsU2RvQXN5U2VxU2VuZERhdGEKKy8vCisvLyBEZXNjcmlwdGlvbjogc2VuZCBzYXRhIHVuc2luZyBhIGVzdGFibGlzaGVkIGNvbm5lY3Rpb24KKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6ICBwU2RvU2VxQ29uSGRsX3AgPSBjb25uZWN0aW9uIGhhbmRsZQorLy8gICAgICAgICAgICAgIHVpRGF0YVNpemVfcCAgICA9IFNpemUgb2YgRnJhbWUgdG8gc2VuZAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gd2lodG91dCBTRE8gc2VxdWVuY2UgbGF5ZXIgaGVhZGVyLCBBc25kIGhlYWRlcgorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGV0aGVybmV0bmV0CisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PT4gU0RPIFNlcXVlbmNlIGxheWVyIHBheWxvYWQKKy8vICAgICAgICAgICAgICBTZG9UeXBlICAgICAgICAgID0gVHlwZSBvZiB0aGUgU0RPIGNvbm5lY3Rpb24KKy8vCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgPSBlcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3RFcGxLZXJuZWwgUFVCTElDIEVwbFNkb0FzeVNlcVNlbmREYXRhKHRFcGxTZG9TZXFDb25IZGwgU2RvU2VxQ29uSGRsX3AsCisJCQkJICAgICAgIHVuc2lnbmVkIGludCB1aURhdGFTaXplX3AsCisJCQkJICAgICAgIHRFcGxGcmFtZSAqIHBhYkRhdGFfcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKwl1bnNpZ25lZCBpbnQgdWlIYW5kbGU7CisKKwl1aUhhbmRsZSA9IChTZG9TZXFDb25IZGxfcCAmIH5FUExfU0RPX1NFUV9IQU5ETEVfTUFTSyk7CisKKwkvLyBjaGVjayBpZiBjb25uZWN0aW9uIHJlYWR5CisJaWYgKEFzeVNkb1NlcXVJbnN0YW5jZV9nLm1fQXN5U2RvQ29ubmVjdGlvblt1aUhhbmRsZV0ubV9TZG9TdGF0ZSA9PQorCSAgICBrRXBsQXN5U2RvU3RhdGVJZGxlKSB7CisJCS8vIG5vIGNvbm5lY3Rpb24gd2l0aCB0aGlzIGhhbmRsZQorCQlSZXQgPSBrRXBsU2RvU2VxSW52YWxpZEhkbDsKKwkJZ290byBFeGl0OworCX0gZWxzZSBpZiAoQXN5U2RvU2VxdUluc3RhbmNlX2cubV9Bc3lTZG9Db25uZWN0aW9uW3VpSGFuZGxlXS4KKwkJICAgbV9TZG9TdGF0ZSAhPSBrRXBsQXN5U2RvU3RhdGVDb25uZWN0ZWQpIHsKKwkJUmV0ID0ga0VwbFNkb1NlcUNvbm5lY3Rpb25CdXN5OworCQlnb3RvIEV4aXQ7CisJfQorCisJUmV0ID0gRXBsU2RvQXN5U2VxUHJvY2Vzcyh1aUhhbmRsZSwKKwkJCQkgIHVpRGF0YVNpemVfcCwKKwkJCQkgIHBhYkRhdGFfcCwgTlVMTCwga0FzeVNkb1NlcUV2ZW50RnJhbWVTZW5kKTsKKyAgICAgIEV4aXQ6CisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsU2RvQXN5U2VxUHJvY2Vzc0V2ZW50CisvLworLy8gRGVzY3JpcHRpb246IGZ1bmN0aW9uIHByb2Nlc3NlcyBleHRlcm4gZXZlbnRzCisvLyAgICAgICAgICAgICAgLT4gbGF0ZXIgbmVlZGVkIGZvciB0aW1lb3V0IGNvbnRyb2xsIHdpdGggdGltZXItbW9kdWxlCisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOiAgcEV2ZW50X3AgPSBwb2ludGVyIHRvIGV2ZW50CisvLworLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsID0gZXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0RXBsS2VybmVsIFBVQkxJQyBFcGxTZG9Bc3lTZXFQcm9jZXNzRXZlbnQodEVwbEV2ZW50ICogcEV2ZW50X3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisJdEVwbFRpbWVyRXZlbnRBcmcgKnBUaW1lckV2ZW50QXJnOworCXRFcGxBc3lTZG9TZXFDb24gKnBBc3lTZG9TZXFDb247CisJdEVwbFRpbWVySGRsIEVwbFRpbWVySGRsOworCXVuc2lnbmVkIGludCB1aUNvdW50OworCisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJLy8gY2hlY2sgcGFyYW1ldGVyCisJaWYgKHBFdmVudF9wID09IE5VTEwpIHsKKwkJUmV0ID0ga0VwbFNkb1NlcUludmFsaWRFdmVudDsKKwkJZ290byBFeGl0OworCX0KKworCWlmIChwRXZlbnRfcC0+bV9FdmVudFR5cGUgIT0ga0VwbEV2ZW50VHlwZVRpbWVyKSB7CisJCVJldCA9IGtFcGxTZG9TZXFJbnZhbGlkRXZlbnQ7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gZ2V0IHRpbWVyaGRsCisJcFRpbWVyRXZlbnRBcmcgPSAodEVwbFRpbWVyRXZlbnRBcmcgKikgcEV2ZW50X3AtPm1fcEFyZzsKKwlFcGxUaW1lckhkbCA9IHBUaW1lckV2ZW50QXJnLT5tX1RpbWVySGRsOworCisJLy8gZ2V0IHBvaW50ZXIgdG8gaW50ZXJuIGNvbnRyb2wgc3RydWN0dXJlIG9mIGNvbm5lY3Rpb24KKwlpZiAocFRpbWVyRXZlbnRBcmctPm1fdWxBcmcgPT0gMCkgeworCQlnb3RvIEV4aXQ7CisJfQorCXBBc3lTZG9TZXFDb24gPSAodEVwbEFzeVNkb1NlcUNvbiAqKSBwVGltZXJFdmVudEFyZy0+bV91bEFyZzsKKworCS8vIGNoZWNrIGlmIHRpbWUgaXMgY3VycmVudAorCWlmIChFcGxUaW1lckhkbCAhPSBwQXN5U2RvU2VxQ29uLT5tX0VwbFRpbWVySGRsKSB7CisJCS8vIGRlbGV0ZSB0aW1lcgorCQlFcGxUaW1lcnVEZWxldGVUaW1lcigmRXBsVGltZXJIZGwpOworCQlnb3RvIEV4aXQ7CisJfQorCS8vIGRlbGV0ZSB0aW1lcgorCUVwbFRpbWVydURlbGV0ZVRpbWVyKCZwQXN5U2RvU2VxQ29uLT5tX0VwbFRpbWVySGRsKTsKKworCS8vIGdldCBpbmRleG51bWJlciBvZiBjb250cm9sIHN0cnVjdHVyZQorCXVpQ291bnQgPSAwOworCXdoaWxlICgoJkFzeVNkb1NlcXVJbnN0YW5jZV9nLm1fQXN5U2RvQ29ubmVjdGlvblt1aUNvdW50XSkgIT0KKwkgICAgICAgcEFzeVNkb1NlcUNvbikgeworCQl1aUNvdW50Kys7CisJCWlmICh1aUNvdW50ID4gRVBMX01BWF9TRE9fU0VRX0NPTikgeworCQkJZ290byBFeGl0OworCQl9CisJfQorCisJLy8gcHJvY2VzcyBldmVudCBhbmQgY2FsbCBwcm9jZXNzZnVuY3Rpb24gaWYgbmVlZGVkCisJUmV0ID0gRXBsU2RvQXN5U2VxUHJvY2Vzcyh1aUNvdW50LAorCQkJCSAgMCwgTlVMTCwgTlVMTCwga0FzeVNkb1NlcUV2ZW50VGltZW91dCk7CisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIFJldDsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxTZG9Bc3lTZXFEZWxDb24KKy8vCisvLyBEZXNjcmlwdGlvbjogZGVsIGFuZCBjbG9zZSBvbmUgY29ubmVjdGlvbgorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczogIFNkb1NlcUNvbkhkbF9wID0gaGFuZGxlIG9mIGNvbm5lY3Rpb24KKy8vCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgPSBlcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3RFcGxLZXJuZWwgUFVCTElDIEVwbFNkb0FzeVNlcURlbENvbih0RXBsU2RvU2VxQ29uSGRsIFNkb1NlcUNvbkhkbF9wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJdW5zaWduZWQgaW50IHVpSGFuZGxlOworCXRFcGxBc3lTZG9TZXFDb24gKnBBc3lTZG9TZXFDb247CisKKwl1aUhhbmRsZSA9IChTZG9TZXFDb25IZGxfcCAmIH5FUExfU0RPX1NFUV9IQU5ETEVfTUFTSyk7CisKKwkvLyBjaGVjayBpZiBoYW5kbGUgaW52YWxpZAorCWlmICh1aUhhbmRsZSA+PSBFUExfTUFYX1NET19TRVFfQ09OKSB7CisJCVJldCA9IGtFcGxTZG9TZXFJbnZhbGlkSGRsOworCQlnb3RvIEV4aXQ7CisJfQorCS8vIGdldCBwb2ludGVyIHRvIGNvbm5lY3Rpb24KKwlwQXN5U2RvU2VxQ29uID0gJkFzeVNkb1NlcXVJbnN0YW5jZV9nLm1fQXN5U2RvQ29ubmVjdGlvblt1aUhhbmRsZV07CisKKwkvLyBkZWNyZW1lbnQgdXNlIGNvdW50ZXIKKwlwQXN5U2RvU2VxQ29uLT5tX3VpVXNlQ291bnQtLTsKKworCWlmIChwQXN5U2RvU2VxQ29uLT5tX3VpVXNlQ291bnQgPT0gMCkgeworCQkvLyBwcm9jZXNzIGNsb3NlIGluIHByb2Nlc3NmdW5jdGlvbgorCQlSZXQgPSBFcGxTZG9Bc3lTZXFQcm9jZXNzKHVpSGFuZGxlLAorCQkJCQkgIDAsCisJCQkJCSAgTlVMTCwgTlVMTCwga0FzeVNkb1NlcUV2ZW50Q2xvc2VDb24pOworCisJCS8vY2hlY2sgcHJvdG9jb2wKKwkJaWYgKChwQXN5U2RvU2VxQ29uLT5tX0NvbkhhbmRsZSAmIEVQTF9TRE9fQVNZX0hBTkRMRV9NQVNLKSA9PQorCQkgICAgRVBMX1NET19VRFBfSEFORExFKSB7CisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1NET19VRFApKSAhPSAwKQorCQkJLy8gY2FsbCBjbG9zZSBmdW5jdGlvbiBvZiBsb3dlciBsYXllcgorCQkJRXBsU2RvVWRwdURlbENvbihwQXN5U2RvU2VxQ29uLT5tX0NvbkhhbmRsZSk7CisjZW5kaWYgLy8gZW5kIG9mICNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfU0RPX1VEUCkpICE9IDApCisJCX0gZWxzZSB7CisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1NET19BU05EKSkgIT0gMCkKKwkJCS8vIGNhbGwgY2xvc2UgZnVuY3Rpb24gb2YgbG93ZXIgbGF5ZXIKKwkJCUVwbFNkb0FzbmR1RGVsQ29uKHBBc3lTZG9TZXFDb24tPm1fQ29uSGFuZGxlKTsKKyNlbmRpZiAvLyBlbmQgb2YgI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9TRE9fQVNORCkpICE9IDApCisJCX0KKworCQkvLyBkZWxldGUgdGltZXIKKwkJRXBsVGltZXJ1RGVsZXRlVGltZXIoJnBBc3lTZG9TZXFDb24tPm1fRXBsVGltZXJIZGwpOworCisJCS8vIGNsZWFuIGNvbnRyb2xsc3RydWN0dXJlCisJCUVQTF9NRU1TRVQocEFzeVNkb1NlcUNvbiwgMHgwMCwgc2l6ZW9mKHRFcGxBc3lTZG9TZXFDb24pKTsKKwkJcEFzeVNkb1NlcUNvbi0+bV9TZG9Db25IaXN0b3J5Lm1fYkZyZWVFbnRyaWVzID0KKwkJICAgIEVQTF9TRE9fSElTVE9SWV9TSVpFOworCX0KKworICAgICAgRXhpdDoKKwlyZXR1cm4gUmV0OworCit9CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgUCBSIEkgViBBIFQgRSAgIEYgVSBOIEMgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxFcGxTZG9Bc3lTZXFQcm9jZXNzCisvLworLy8gRGVzY3JpcHRpb246IGludGVybiBmdW5jdGlvbiB0byBwcm9jZXNzIHRoZSBhc3luY2hyb251cyBTRE8gU2VxdWVuY2UgTGF5ZXIKKy8vICAgICAgICAgICAgICBzdGF0ZSBtYXNjaGluZQorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczogIHVpSGFuZGxlX3AgICAgICA9IGluZGV4IG9mIHRoZSBjb250cm9sIHN0cnVjdHVyZSBvZiB0aGUgY29ubmVjdGlvbgorLy8gICAgICAgICAgICAgIHVpRGF0YVNpemVfcCAgICA9IHNpemUgb2YgZGF0YSBmcmFtZSB0byBwcm9jZXNzIChjYW4gYmUgMCkKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+IHdpdGhvdXQgc2l6ZSBvZiBzZXF1ZW5jZSBoZWFkZXIgYW5kIEFzbmQgaGVhZGVyISEhCisvLworLy8gICAgICAgICAgICAgIHBEYXRhX3AgICAgICAgICA9IHBvaW50ZXIgdG8gZnJhbWUgdG8gc2VuZCAoY2FuIGJlIE5VTEwpCisvLyAgICAgICAgICAgICAgcFJlY0ZyYW1lX3AgICAgID0gcG9pbnRlciB0byByZWNlaXZlZCBmcmFtZSAoY2FuIGJlIE5VTEwpCisvLyAgICAgICAgICAgICAgRXZlbnRfcCAgICAgICAgID0gRXZlbnQgdG8gcHJvY2VzcworLy8KKy8vCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgPSBlcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N0YXRpYyB0RXBsS2VybmVsIEVwbFNkb0FzeVNlcVByb2Nlc3ModW5zaWduZWQgaW50IHVpSGFuZGxlX3AsCisJCQkJICAgICAgdW5zaWduZWQgaW50IHVpRGF0YVNpemVfcCwKKwkJCQkgICAgICB0RXBsRnJhbWUgKiBwRGF0YV9wLAorCQkJCSAgICAgIHRFcGxBc3lTZG9TZXEgKiBwUmVjRnJhbWVfcCwKKwkJCQkgICAgICB0RXBsQXN5U2RvU2VxRXZlbnQgRXZlbnRfcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKwl1bnNpZ25lZCBpbnQgdWlGcmFtZVNpemU7CisJdEVwbEZyYW1lICpwRXBsRnJhbWU7CisJdEVwbEFzeVNkb1NlcUNvbiAqcEFzeVNkb1NlcUNvbjsKKwl0RXBsU2RvU2VxQ29uSGRsIFNkb1NlcUNvbkhkbDsKKwl1bnNpZ25lZCBpbnQgdWlGcmVlRW50cmllczsKKworI2lmIGRlZmluZWQoV0lOMzIpIHx8IGRlZmluZWQoX1dJTjMyKQorCS8vIGVudGVyICBjcml0aWNhbCBzZWN0aW9uIGZvciBwcm9jZXNzIGZ1bmN0aW9uCisJRW50ZXJDcml0aWNhbFNlY3Rpb24oQXN5U2RvU2VxdUluc3RhbmNlX2cubV9wQ3JpdGljYWxTZWN0aW9uKTsKKyNlbmRpZgorCisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwkvLyBnZXQgaGFuZGxlIGZvciBoaW5nZXIgbGF5ZXIKKwlTZG9TZXFDb25IZGwgPSB1aUhhbmRsZV9wIHwgRVBMX1NET19BU1lfSEFORExFOworCisJLy8gY2hlY2sgaWYgaGFuZGxlIGludmFsaWQKKwlpZiAoKFNkb1NlcUNvbkhkbCAmIH5FUExfU0RPX1NFUV9IQU5ETEVfTUFTSykgPT0KKwkgICAgRVBMX1NET19TRVFfSU5WQUxJRF9IREwpIHsKKwkJUmV0ID0ga0VwbFNkb1NlcUludmFsaWRIZGw7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gZ2V0IHBvaW50ZXIgdG8gY29ubmVjdGlvbgorCXBBc3lTZG9TZXFDb24gPSAmQXN5U2RvU2VxdUluc3RhbmNlX2cubV9Bc3lTZG9Db25uZWN0aW9uW3VpSGFuZGxlX3BdOworCisJLy8gY2hlY2sgc2l6ZQorCWlmICgocERhdGFfcCA9PSBOVUxMKSAmJiAocFJlY0ZyYW1lX3AgPT0gTlVMTCkgJiYgKHVpRGF0YVNpemVfcCAhPSAwKSkgeworCQlSZXQgPSBrRXBsU2RvU2VxSW52YWxpZEZyYW1lOworCQlnb3RvIEV4aXQ7CisJfQorCS8vIGNoZWNrIHN0YXRlCisJc3dpdGNoIChwQXN5U2RvU2VxQ29uLT5tX1Nkb1N0YXRlKSB7CisJCS8vIGlkbGUgc3RhdGUKKwljYXNlIGtFcGxBc3lTZG9TdGF0ZUlkbGU6CisJCXsKKwkJCS8vIGNoZWNrIGV2ZW50CisJCQlzd2l0Y2ggKEV2ZW50X3ApIHsKKwkJCQkvLyBuZXcgY29ubmVjdGlvbgorCQkJCS8vIC0+IHNlbmQgaW5pdCBmcmFtZSBhbmQgY2hhbmdlIHRvCisJCQkJLy8ga0VwbEFzeVNkb1N0YXRlSW5pdDEKKwkJCWNhc2Uga0FzeVNkb1NlcUV2ZW50SW5pdENvbjoKKwkJCQl7CisJCQkJCS8vIHNldCBzZW5kaW5nIHNjb24gdG8gMQorCQkJCQlwQXN5U2RvU2VxQ29uLT5tX2JSZWNTZXFOdW0gPSAweDAxOworCQkJCQkvLyBzZXQgc2V0IHNlbmQgcmNvbiB0byAwCisJCQkJCXBBc3lTZG9TZXFDb24tPm1fYlNlbmRTZXFOdW0gPSAweDAwOworCQkJCQlSZXQgPQorCQkJCQkgICAgRXBsU2RvQXN5U2VxU2VuZEludGVybgorCQkJCQkgICAgKHBBc3lTZG9TZXFDb24sIDAsIE5VTEwsIEZBTFNFKTsKKwkJCQkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJCQkJZ290byBFeGl0OworCQkJCQl9CisJCQkJCS8vIGNoYW5nZSBzdGF0ZQorCQkJCQlwQXN5U2RvU2VxQ29uLT5tX1Nkb1N0YXRlID0KKwkJCQkJICAgIGtFcGxBc3lTZG9TdGF0ZUluaXQxOworCisJCQkJCS8vIHNldCB0aW1lcgorCQkJCQlSZXQgPQorCQkJCQkgICAgRXBsU2RvQXN5U2VxU2V0VGltZXIocEFzeVNkb1NlcUNvbiwKKwkJCQkJCQkJIEVQTF9TRVFfREVGQVVMVF9USU1FT1VUKTsKKworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBpbml0IGNvbiBmcm9tIGV4dGVybgorCQkJCS8vIGNoZWNrIHJjb24gYW5kIHNjb24KKwkJCQkvLyAtPiBzZW5kIGFuc3dlcgorCQkJY2FzZSBrQXN5U2RvU2VxRXZlbnRGcmFtZVJlYzoKKwkJCQl7CisvKgorICAgICAgICAgICAgICAgICAgICBQUklOVEYzKCIlcyBzY29uPSV1IHJjb249JXVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJlY0ZyYW1lX3AtPm1fbGVfYlNlbmRTZXFOdW1Db24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJlY0ZyYW1lX3AtPm1fbGVfYlJlY1NlcU51bUNvbik7CisqLworCQkJCQkvLyBjaGVjayBpZiBzY29uID09IDEgYW5kIHJjb24gPT0gMAorCQkJCQlpZiAoKChwUmVjRnJhbWVfcC0+CisJCQkJCSAgICAgIG1fbGVfYlJlY1NlcU51bUNvbiAmCisJCQkJCSAgICAgIEVQTF9BU1lfU0RPX0NPTl9NQVNLKSA9PSAweDAwKQorCQkJCQkgICAgJiYKKwkJCQkJICAgICgocFJlY0ZyYW1lX3AtPgorCQkJCQkgICAgICBtX2xlX2JTZW5kU2VxTnVtQ29uICYKKwkJCQkJICAgICAgRVBMX0FTWV9TRE9fQ09OX01BU0spID09IDB4MDEpKSB7CisJCQkJCQkvLyBzYXZlIHNlcXVlbmNlIG51bWJlcnMKKwkJCQkJCXBBc3lTZG9TZXFDb24tPm1fYlJlY1NlcU51bSA9CisJCQkJCQkgICAgQW1pR2V0Qnl0ZUZyb21MZQorCQkJCQkJICAgICgmcFJlY0ZyYW1lX3AtPgorCQkJCQkJICAgICBtX2xlX2JSZWNTZXFOdW1Db24pOworCQkJCQkJcEFzeVNkb1NlcUNvbi0+bV9iU2VuZFNlcU51bSA9CisJCQkJCQkgICAgQW1pR2V0Qnl0ZUZyb21MZQorCQkJCQkJICAgICgmcFJlY0ZyYW1lX3AtPgorCQkJCQkJICAgICBtX2xlX2JTZW5kU2VxTnVtQ29uKTsKKwkJCQkJCS8vIGNyZWF0ZSBhbnN3ZXIgYW5kIHNlbmQgYW5zd2VyCisJCQkJCQkvLyBzZXQgcmNvbiB0byAxIChpbiBzZW5kIGRpcmVjdGlvbiBvd24gc2NvbikKKwkJCQkJCXBBc3lTZG9TZXFDb24tPm1fYlJlY1NlcU51bSsrOworCQkJCQkJUmV0ID0KKwkJCQkJCSAgICBFcGxTZG9Bc3lTZXFTZW5kSW50ZXJuCisJCQkJCQkgICAgKHBBc3lTZG9TZXFDb24sIDAsIE5VTEwsCisJCQkJCQkgICAgIEZBTFNFKTsKKwkJCQkJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCQkJCQlnb3RvIEV4aXQ7CisJCQkJCQl9CisJCQkJCQkvLyBjaGFuZ2Ugc3RhdGUgdG8ga0VwbEFzeVNkb1N0YXRlSW5pdDIKKwkJCQkJCXBBc3lTZG9TZXFDb24tPm1fU2RvU3RhdGUgPQorCQkJCQkJICAgIGtFcGxBc3lTZG9TdGF0ZUluaXQyOworCisJCQkJCQkvLyBzZXQgdGltZXIKKwkJCQkJCVJldCA9CisJCQkJCQkgICAgRXBsU2RvQXN5U2VxU2V0VGltZXIKKwkJCQkJCSAgICAocEFzeVNkb1NlcUNvbiwKKwkJCQkJCSAgICAgRVBMX1NFUV9ERUZBVUxUX1RJTUVPVVQpOworCQkJCQl9IGVsc2UgewkvLyBlcnJvciAtPiBjbG9zZQorCQkJCQkJLy8gZGVsZXRlIHRpbWVyCisJCQkJCQlFcGxUaW1lcnVEZWxldGVUaW1lcgorCQkJCQkJICAgICgmcEFzeVNkb1NlcUNvbi0+CisJCQkJCQkgICAgIG1fRXBsVGltZXJIZGwpOworCQkJCQkJaWYgKCgocFJlY0ZyYW1lX3AtPgorCQkJCQkJICAgICAgbV9sZV9iUmVjU2VxTnVtQ29uICYKKwkJCQkJCSAgICAgIEVQTF9BU1lfU0RPX0NPTl9NQVNLKSAhPQorCQkJCQkJICAgICAweDAwKQorCQkJCQkJICAgIHx8ICgocFJlY0ZyYW1lX3AtPm1fbGVfYlNlbmRTZXFOdW1Db24gJiBFUExfQVNZX1NET19DT05fTUFTSykgIT0gMHgwMCkpIHsJLy8gZC5rLiBvbmx5IGFuc3dlciB3aXRoIGNsb3NlIG1lc3NhZ2UgaWYgdGhlIG1lc3NhZ2Ugc2VudCB3YXMgbm90IGEgY2xvc2UgbWVzc2FnZQorCQkJCQkJCS8vIHNhdmUgc2VxdWVuY2UgbnVtYmVycworCQkJCQkJCXBBc3lTZG9TZXFDb24tPgorCQkJCQkJCSAgICBtX2JSZWNTZXFOdW0gPQorCQkJCQkJCSAgICBBbWlHZXRCeXRlRnJvbUxlCisJCQkJCQkJICAgICgmcFJlY0ZyYW1lX3AtPgorCQkJCQkJCSAgICAgbV9sZV9iUmVjU2VxTnVtQ29uKTsKKwkJCQkJCQlwQXN5U2RvU2VxQ29uLT4KKwkJCQkJCQkgICAgbV9iU2VuZFNlcU51bSA9CisJCQkJCQkJICAgIEFtaUdldEJ5dGVGcm9tTGUKKwkJCQkJCQkgICAgKCZwUmVjRnJhbWVfcC0+CisJCQkJCQkJICAgICBtX2xlX2JTZW5kU2VxTnVtQ29uKTsKKwkJCQkJCQkvLyBzZXQgcmNvbiBhbmQgc2NvbiB0byAwCisJCQkJCQkJcEFzeVNkb1NlcUNvbi0+CisJCQkJCQkJICAgIG1fYlNlbmRTZXFOdW0gJj0KKwkJCQkJCQkgICAgRVBMX1NFUV9OVU1fTUFTSzsKKwkJCQkJCQlwQXN5U2RvU2VxQ29uLT4KKwkJCQkJCQkgICAgbV9iUmVjU2VxTnVtICY9CisJCQkJCQkJICAgIEVQTF9TRVFfTlVNX01BU0s7CisJCQkJCQkJLy8gc2VuZCBmcmFtZQorCQkJCQkJCUVwbFNkb0FzeVNlcVNlbmRJbnRlcm4KKwkJCQkJCQkgICAgKHBBc3lTZG9TZXFDb24sIDAsCisJCQkJCQkJICAgICBOVUxMLCBGQUxTRSk7CisJCQkJCQl9CisJCQkJCQkvLyBjYWxsIENvbW1hbmQgTGF5ZXIgQ2IKKwkJCQkJCUFzeVNkb1NlcXVJbnN0YW5jZV9nLgorCQkJCQkJICAgIG1fZnBTZG9Db21Db25DYgorCQkJCQkJICAgIChTZG9TZXFDb25IZGwsCisJCQkJCQkgICAgIGtBc3lTZG9Db25TdGF0ZUluaXRFcnJvcik7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQlkZWZhdWx0OgorCQkJCS8vIGQuay4gZG8gbm90aGluZworCQkJCWJyZWFrOworCisJCQl9CS8vIGVuZCBvZiBzd2l0Y2goRXZlbnRfcCkKKwkJCWJyZWFrOworCQl9CisKKwkJLy8gaW5pdCBjb25uZWN0aW9uIHN0ZXAgMQorCQkvLyB3YWl0IGZvciBmcmFtZSB3aXRoIHNjb24gPSAxCisJCS8vIGFuZCByY29uID0gMQorCWNhc2Uga0VwbEFzeVNkb1N0YXRlSW5pdDE6CisJCXsKKy8vICAgICAgICAgICAgUFJJTlRGMCgiRXBsU2RvQXN5U2VxdTogU3RhdGVJbml0MVxuIik7CisKKwkJCS8vIGNoZWNrIGV2ZW50CisJCQlzd2l0Y2ggKEV2ZW50X3ApIHsKKwkJCQkvLyBmcmFtZSByZWNlaXZlZAorCQkJY2FzZSBrQXN5U2RvU2VxRXZlbnRGcmFtZVJlYzoKKwkJCQl7CisJCQkJCS8vIGNoZWNrIHNjb24gPT0gMSBhbmQgcmNvbiA9PSAxCisJCQkJCWlmICgoKHBSZWNGcmFtZV9wLT4KKwkJCQkJICAgICAgbV9sZV9iUmVjU2VxTnVtQ29uICYKKwkJCQkJICAgICAgRVBMX0FTWV9TRE9fQ09OX01BU0spID09IDB4MDEpCisJCQkJCSAgICAmJiAoKHBSZWNGcmFtZV9wLT5tX2xlX2JTZW5kU2VxTnVtQ29uICYgRVBMX0FTWV9TRE9fQ09OX01BU0spID09IDB4MDEpKSB7CS8vIGNyZWF0ZSBhbnN3ZXIgb3duIHNjb24gPSAyCisJCQkJCQkvLyBzYXZlIHNlcXVlbmNlIG51bWJlcnMKKwkJCQkJCXBBc3lTZG9TZXFDb24tPm1fYlJlY1NlcU51bSA9CisJCQkJCQkgICAgQW1pR2V0Qnl0ZUZyb21MZQorCQkJCQkJICAgICgmcFJlY0ZyYW1lX3AtPgorCQkJCQkJICAgICBtX2xlX2JSZWNTZXFOdW1Db24pOworCQkJCQkJcEFzeVNkb1NlcUNvbi0+bV9iU2VuZFNlcU51bSA9CisJCQkJCQkgICAgQW1pR2V0Qnl0ZUZyb21MZQorCQkJCQkJICAgICgmcFJlY0ZyYW1lX3AtPgorCQkJCQkJICAgICBtX2xlX2JTZW5kU2VxTnVtQ29uKTsKKworCQkJCQkJcEFzeVNkb1NlcUNvbi0+bV9iUmVjU2VxTnVtKys7CisJCQkJCQlSZXQgPQorCQkJCQkJICAgIEVwbFNkb0FzeVNlcVNlbmRJbnRlcm4KKwkJCQkJCSAgICAocEFzeVNkb1NlcUNvbiwgMCwgTlVMTCwKKwkJCQkJCSAgICAgRkFMU0UpOworCQkJCQkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJCQkJCWdvdG8gRXhpdDsKKwkJCQkJCX0KKwkJCQkJCS8vIGNoYW5nZSBzdGF0ZSB0byBrRXBsQXN5U2RvU3RhdGVJbml0MworCQkJCQkJcEFzeVNkb1NlcUNvbi0+bV9TZG9TdGF0ZSA9CisJCQkJCQkgICAga0VwbEFzeVNkb1N0YXRlSW5pdDM7CisKKwkJCQkJCS8vIHNldCB0aW1lcgorCQkJCQkJUmV0ID0KKwkJCQkJCSAgICBFcGxTZG9Bc3lTZXFTZXRUaW1lcgorCQkJCQkJICAgIChwQXN5U2RvU2VxQ29uLAorCQkJCQkJICAgICBFUExfU0VRX0RFRkFVTFRfVElNRU9VVCk7CisKKwkJCQkJfQorCQkJCQkvLyBjaGVjayBpZiBzY29uID09IDEgYW5kIHJjb24gPT0gMCwgaS5lLiBvdGhlciBzaWRlIHdhbnRzIG1lIHRvIGJlIHNlcnZlcgorCQkJCQllbHNlIGlmICgoKHBSZWNGcmFtZV9wLT4KKwkJCQkJCSAgIG1fbGVfYlJlY1NlcU51bUNvbiAmCisJCQkJCQkgICBFUExfQVNZX1NET19DT05fTUFTSykgPT0KKwkJCQkJCSAgMHgwMCkKKwkJCQkJCSAmJgorCQkJCQkJICgocFJlY0ZyYW1lX3AtPgorCQkJCQkJICAgbV9sZV9iU2VuZFNlcU51bUNvbiAmCisJCQkJCQkgICBFUExfQVNZX1NET19DT05fTUFTSykgPT0KKwkJCQkJCSAgMHgwMSkpIHsKKwkJCQkJCS8vIHNhdmUgc2VxdWVuY2UgbnVtYmVycworCQkJCQkJcEFzeVNkb1NlcUNvbi0+bV9iUmVjU2VxTnVtID0KKwkJCQkJCSAgICBBbWlHZXRCeXRlRnJvbUxlCisJCQkJCQkgICAgKCZwUmVjRnJhbWVfcC0+CisJCQkJCQkgICAgIG1fbGVfYlJlY1NlcU51bUNvbik7CisJCQkJCQlwQXN5U2RvU2VxQ29uLT5tX2JTZW5kU2VxTnVtID0KKwkJCQkJCSAgICBBbWlHZXRCeXRlRnJvbUxlCisJCQkJCQkgICAgKCZwUmVjRnJhbWVfcC0+CisJCQkJCQkgICAgIG1fbGVfYlNlbmRTZXFOdW1Db24pOworCQkJCQkJLy8gY3JlYXRlIGFuc3dlciBhbmQgc2VuZCBhbnN3ZXIKKwkJCQkJCS8vIHNldCByY29uIHRvIDEgKGluIHNlbmQgZGlyZWN0aW9uIG93biBzY29uKQorCQkJCQkJcEFzeVNkb1NlcUNvbi0+bV9iUmVjU2VxTnVtKys7CisJCQkJCQlSZXQgPQorCQkJCQkJICAgIEVwbFNkb0FzeVNlcVNlbmRJbnRlcm4KKwkJCQkJCSAgICAocEFzeVNkb1NlcUNvbiwgMCwgTlVMTCwKKwkJCQkJCSAgICAgRkFMU0UpOworCQkJCQkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJCQkJCWdvdG8gRXhpdDsKKwkJCQkJCX0KKwkJCQkJCS8vIGNoYW5nZSBzdGF0ZSB0byBrRXBsQXN5U2RvU3RhdGVJbml0MgorCQkJCQkJcEFzeVNkb1NlcUNvbi0+bV9TZG9TdGF0ZSA9CisJCQkJCQkgICAga0VwbEFzeVNkb1N0YXRlSW5pdDI7CisKKwkJCQkJCS8vIHNldCB0aW1lcgorCQkJCQkJUmV0ID0KKwkJCQkJCSAgICBFcGxTZG9Bc3lTZXFTZXRUaW1lcgorCQkJCQkJICAgIChwQXN5U2RvU2VxQ29uLAorCQkJCQkJICAgICBFUExfU0VRX0RFRkFVTFRfVElNRU9VVCk7CisJCQkJCX0gZWxzZSB7CS8vIGVycm9yIC0+IENsb3NlCisJCQkJCQlwQXN5U2RvU2VxQ29uLT5tX1Nkb1N0YXRlID0KKwkJCQkJCSAgICBrRXBsQXN5U2RvU3RhdGVJZGxlOworCQkJCQkJLy8gZGVsZXRlIHRpbWVyCisJCQkJCQlFcGxUaW1lcnVEZWxldGVUaW1lcgorCQkJCQkJICAgICgmcEFzeVNkb1NlcUNvbi0+CisJCQkJCQkgICAgIG1fRXBsVGltZXJIZGwpOworCQkJCQkJaWYgKCgocFJlY0ZyYW1lX3AtPgorCQkJCQkJICAgICAgbV9sZV9iUmVjU2VxTnVtQ29uICYKKwkJCQkJCSAgICAgIEVQTF9BU1lfU0RPX0NPTl9NQVNLKSAhPQorCQkJCQkJICAgICAweDAwKQorCQkJCQkJICAgIHx8ICgocFJlY0ZyYW1lX3AtPm1fbGVfYlNlbmRTZXFOdW1Db24gJiBFUExfQVNZX1NET19DT05fTUFTSykgIT0gMHgwMCkpIHsJLy8gZC5rLiBvbmx5IGFuc3dlciB3aXRoIGNsb3NlIG1lc3NhZ2UgaWYgdGhlIG1lc3NhZ2Ugc2VudCB3YXMgbm90IGEgY2xvc2UgbWVzc2FnZQorCQkJCQkJCS8vIHNhdmUgc2VxdWVuY2UgbnVtYmVycworCQkJCQkJCXBBc3lTZG9TZXFDb24tPgorCQkJCQkJCSAgICBtX2JSZWNTZXFOdW0gPQorCQkJCQkJCSAgICBBbWlHZXRCeXRlRnJvbUxlCisJCQkJCQkJICAgICgmcFJlY0ZyYW1lX3AtPgorCQkJCQkJCSAgICAgbV9sZV9iUmVjU2VxTnVtQ29uKTsKKwkJCQkJCQlwQXN5U2RvU2VxQ29uLT4KKwkJCQkJCQkgICAgbV9iU2VuZFNlcU51bSA9CisJCQkJCQkJICAgIEFtaUdldEJ5dGVGcm9tTGUKKwkJCQkJCQkgICAgKCZwUmVjRnJhbWVfcC0+CisJCQkJCQkJICAgICBtX2xlX2JTZW5kU2VxTnVtQ29uKTsKKworCQkJCQkJCS8vIHNldCByY29uIGFuZCBzY29uIHRvIDAKKwkJCQkJCQlwQXN5U2RvU2VxQ29uLT4KKwkJCQkJCQkgICAgbV9iU2VuZFNlcU51bSAmPQorCQkJCQkJCSAgICBFUExfU0VRX05VTV9NQVNLOworCQkJCQkJCXBBc3lTZG9TZXFDb24tPgorCQkJCQkJCSAgICBtX2JSZWNTZXFOdW0gJj0KKwkJCQkJCQkgICAgRVBMX1NFUV9OVU1fTUFTSzsKKwkJCQkJCQkvLyBzZW5kIGZyYW1lCisJCQkJCQkJRXBsU2RvQXN5U2VxU2VuZEludGVybgorCQkJCQkJCSAgICAocEFzeVNkb1NlcUNvbiwgMCwKKwkJCQkJCQkgICAgIE5VTEwsIEZBTFNFKTsKKwkJCQkJCX0KKwkJCQkJCS8vIGNhbGwgQ29tbWFuZCBMYXllciBDYgorCQkJCQkJQXN5U2RvU2VxdUluc3RhbmNlX2cuCisJCQkJCQkgICAgbV9mcFNkb0NvbUNvbkNiCisJCQkJCQkgICAgKFNkb1NlcUNvbkhkbCwKKwkJCQkJCSAgICAga0FzeVNkb0NvblN0YXRlSW5pdEVycm9yKTsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyB0aW1lb3V0CisJCQljYXNlIGtBc3lTZG9TZXFFdmVudFRpbWVvdXQ6CisJCQkJewkvLyBlcnJvciAtPiBDbG9zZQorCQkJCQlwQXN5U2RvU2VxQ29uLT5tX1Nkb1N0YXRlID0KKwkJCQkJICAgIGtFcGxBc3lTZG9TdGF0ZUlkbGU7CisKKwkJCQkJLy8gc2V0IHJjb24gYW5kIHNjb24gdG8gMAorCQkJCQlwQXN5U2RvU2VxQ29uLT5tX2JTZW5kU2VxTnVtICY9CisJCQkJCSAgICBFUExfU0VRX05VTV9NQVNLOworCQkJCQlwQXN5U2RvU2VxQ29uLT5tX2JSZWNTZXFOdW0gJj0KKwkJCQkJICAgIEVQTF9TRVFfTlVNX01BU0s7CisJCQkJCS8vIHNlbmQgZnJhbWUKKwkJCQkJRXBsU2RvQXN5U2VxU2VuZEludGVybihwQXN5U2RvU2VxQ29uLAorCQkJCQkJCSAgICAgICAwLCBOVUxMLCBGQUxTRSk7CisJCQkJCS8vIGNhbGwgQ29tbWFuZCBMYXllciBDYgorCQkJCQlBc3lTZG9TZXF1SW5zdGFuY2VfZy4KKwkJCQkJICAgIG1fZnBTZG9Db21Db25DYihTZG9TZXFDb25IZGwsCisJCQkJCQkJICAgIGtBc3lTZG9Db25TdGF0ZUluaXRFcnJvcik7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJZGVmYXVsdDoKKwkJCQkvLyBkLmsuIGRvIG5vdGhpbmcKKwkJCQlicmVhazsKKworCQkJfQkvLyBlbmQgb2Ygc3dpdGNoKEV2ZW50X3ApCisJCQlicmVhazsKKwkJfQorCisJCS8vIGluaXQgY29ubmVjdGlvbiBzdGVwIDIKKwljYXNlIGtFcGxBc3lTZG9TdGF0ZUluaXQyOgorCQl7CisvLyAgICAgICAgICAgIFBSSU5URjAoIkVwbFNkb0FzeVNlcXU6IFN0YXRlSW5pdDJcbiIpOworCisJCQkvLyBjaGVjayBldmVudAorCQkJc3dpdGNoIChFdmVudF9wKSB7CisJCQkJLy8gZnJhbWUgcmVjZWl2ZWQKKwkJCWNhc2Uga0FzeVNkb1NlcUV2ZW50RnJhbWVSZWM6CisJCQkJeworCQkJCQkvLyBjaGVjayBzY29uID09IDIgYW5kIHJjb24gPT0gMQorCQkJCQlpZiAoKChwUmVjRnJhbWVfcC0+CisJCQkJCSAgICAgIG1fbGVfYlJlY1NlcU51bUNvbiAmCisJCQkJCSAgICAgIEVQTF9BU1lfU0RPX0NPTl9NQVNLKSA9PSAweDAxKQorCQkJCQkgICAgJiYgKChwUmVjRnJhbWVfcC0+bV9sZV9iU2VuZFNlcU51bUNvbiAmIEVQTF9BU1lfU0RPX0NPTl9NQVNLKSA9PSAweDAyKSkgewkvLyBjcmVhdGUgYW5zd2VyIG93biByY29uID0gMgorCQkJCQkJLy8gc2F2ZSBzZXF1ZW5jZSBudW1iZXJzCisJCQkJCQlwQXN5U2RvU2VxQ29uLT5tX2JSZWNTZXFOdW0gPQorCQkJCQkJICAgIEFtaUdldEJ5dGVGcm9tTGUKKwkJCQkJCSAgICAoJnBSZWNGcmFtZV9wLT4KKwkJCQkJCSAgICAgbV9sZV9iUmVjU2VxTnVtQ29uKTsKKwkJCQkJCXBBc3lTZG9TZXFDb24tPm1fYlNlbmRTZXFOdW0gPQorCQkJCQkJICAgIEFtaUdldEJ5dGVGcm9tTGUKKwkJCQkJCSAgICAoJnBSZWNGcmFtZV9wLT4KKwkJCQkJCSAgICAgbV9sZV9iU2VuZFNlcU51bUNvbik7CisKKwkJCQkJCXBBc3lTZG9TZXFDb24tPm1fYlJlY1NlcU51bSsrOworCQkJCQkJUmV0ID0KKwkJCQkJCSAgICBFcGxTZG9Bc3lTZXFTZW5kSW50ZXJuCisJCQkJCQkgICAgKHBBc3lTZG9TZXFDb24sIDAsIE5VTEwsCisJCQkJCQkgICAgIEZBTFNFKTsKKwkJCQkJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCQkJCQlnb3RvIEV4aXQ7CisJCQkJCQl9CisJCQkJCQkvLyBjaGFuZ2Ugc3RhdGUgdG8ga0VwbEFzeVNkb1N0YXRlQ29ubmVjdGVkCisJCQkJCQlwQXN5U2RvU2VxQ29uLT5tX1Nkb1N0YXRlID0KKwkJCQkJCSAgICBrRXBsQXN5U2RvU3RhdGVDb25uZWN0ZWQ7CisKKwkJCQkJCS8vIHNldCB0aW1lcgorCQkJCQkJUmV0ID0KKwkJCQkJCSAgICBFcGxTZG9Bc3lTZXFTZXRUaW1lcgorCQkJCQkJICAgIChwQXN5U2RvU2VxQ29uLAorCQkJCQkJICAgICBFUExfU0VRX0RFRkFVTFRfVElNRU9VVCk7CisKKwkJCQkJCS8vIGNhbGwgQ29tbWFuZCBMYXllciBDYgorCQkJCQkJQXN5U2RvU2VxdUluc3RhbmNlX2cuCisJCQkJCQkgICAgbV9mcFNkb0NvbUNvbkNiCisJCQkJCQkgICAgKFNkb1NlcUNvbkhkbCwKKwkJCQkJCSAgICAga0FzeVNkb0NvblN0YXRlQ29ubmVjdGVkKTsKKworCQkJCQl9CisJCQkJCS8vIGNoZWNrIHNjb24gPT0gMSBhbmQgcmNvbiA9PSAxLCBpLmUuIG90aGVyIHNpZGUgd2FudHMgbWUgdG8gaW5pdGlhdGUgdGhlIGNvbm5lY3Rpb24KKwkJCQkJZWxzZSBpZiAoKChwUmVjRnJhbWVfcC0+CisJCQkJCQkgICBtX2xlX2JSZWNTZXFOdW1Db24gJgorCQkJCQkJICAgRVBMX0FTWV9TRE9fQ09OX01BU0spID09CisJCQkJCQkgIDB4MDEpCisJCQkJCQkgJiYKKwkJCQkJCSAoKHBSZWNGcmFtZV9wLT4KKwkJCQkJCSAgIG1fbGVfYlNlbmRTZXFOdW1Db24gJgorCQkJCQkJICAgRVBMX0FTWV9TRE9fQ09OX01BU0spID09CisJCQkJCQkgIDB4MDEpKSB7CisJCQkJCQkvLyBzYXZlIHNlcXVlbmNlIG51bWJlcnMKKwkJCQkJCXBBc3lTZG9TZXFDb24tPm1fYlJlY1NlcU51bSA9CisJCQkJCQkgICAgQW1pR2V0Qnl0ZUZyb21MZQorCQkJCQkJICAgICgmcFJlY0ZyYW1lX3AtPgorCQkJCQkJICAgICBtX2xlX2JSZWNTZXFOdW1Db24pOworCQkJCQkJcEFzeVNkb1NlcUNvbi0+bV9iU2VuZFNlcU51bSA9CisJCQkJCQkgICAgQW1pR2V0Qnl0ZUZyb21MZQorCQkJCQkJICAgICgmcFJlY0ZyYW1lX3AtPgorCQkJCQkJICAgICBtX2xlX2JTZW5kU2VxTnVtQ29uKTsKKwkJCQkJCS8vIGNyZWF0ZSBhbnN3ZXIgYW5kIHNlbmQgYW5zd2VyCisJCQkJCQkvLyBzZXQgcmNvbiB0byAxIChpbiBzZW5kIGRpcmVjdGlvbiBvd24gc2NvbikKKwkJCQkJCXBBc3lTZG9TZXFDb24tPm1fYlJlY1NlcU51bSsrOworCQkJCQkJUmV0ID0KKwkJCQkJCSAgICBFcGxTZG9Bc3lTZXFTZW5kSW50ZXJuCisJCQkJCQkgICAgKHBBc3lTZG9TZXFDb24sIDAsIE5VTEwsCisJCQkJCQkgICAgIEZBTFNFKTsKKwkJCQkJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCQkJCQlnb3RvIEV4aXQ7CisJCQkJCQl9CisJCQkJCQkvLyBzZXQgdGltZXIKKwkJCQkJCVJldCA9CisJCQkJCQkgICAgRXBsU2RvQXN5U2VxU2V0VGltZXIKKwkJCQkJCSAgICAocEFzeVNkb1NlcUNvbiwKKwkJCQkJCSAgICAgRVBMX1NFUV9ERUZBVUxUX1RJTUVPVVQpOworCQkJCQkJLy8gY2hhbmdlIHN0YXRlIHRvIGtFcGxBc3lTZG9TdGF0ZUluaXQzCisJCQkJCQlwQXN5U2RvU2VxQ29uLT5tX1Nkb1N0YXRlID0KKwkJCQkJCSAgICBrRXBsQXN5U2RvU3RhdGVJbml0MzsKKworCQkJCQl9IGVsc2UgewkvLyBlcnJvciAtPiBDbG9zZQorCQkJCQkJcEFzeVNkb1NlcUNvbi0+bV9TZG9TdGF0ZSA9CisJCQkJCQkgICAga0VwbEFzeVNkb1N0YXRlSWRsZTsKKwkJCQkJCS8vIGRlbGV0ZSB0aW1lcgorCQkJCQkJRXBsVGltZXJ1RGVsZXRlVGltZXIKKwkJCQkJCSAgICAoJnBBc3lTZG9TZXFDb24tPgorCQkJCQkJICAgICBtX0VwbFRpbWVySGRsKTsKKwkJCQkJCWlmICgoKHBSZWNGcmFtZV9wLT4KKwkJCQkJCSAgICAgIG1fbGVfYlJlY1NlcU51bUNvbiAmCisJCQkJCQkgICAgICBFUExfQVNZX1NET19DT05fTUFTSykgIT0KKwkJCQkJCSAgICAgMHgwMCkKKwkJCQkJCSAgICB8fCAoKHBSZWNGcmFtZV9wLT5tX2xlX2JTZW5kU2VxTnVtQ29uICYgRVBMX0FTWV9TRE9fQ09OX01BU0spICE9IDB4MDApKSB7CS8vIGQuay4gb25seSBhbnN3ZXIgd2l0aCBjbG9zZSBtZXNzYWdlIGlmIHRoZSBtZXNzYWdlIHNlbnQgd2FzIG5vdCBhIGNsb3NlIG1lc3NhZ2UKKwkJCQkJCQkvLyBzYXZlIHNlcXVlbmNlIG51bWJlcnMKKwkJCQkJCQlwQXN5U2RvU2VxQ29uLT4KKwkJCQkJCQkgICAgbV9iUmVjU2VxTnVtID0KKwkJCQkJCQkgICAgQW1pR2V0Qnl0ZUZyb21MZQorCQkJCQkJCSAgICAoJnBSZWNGcmFtZV9wLT4KKwkJCQkJCQkgICAgIG1fbGVfYlJlY1NlcU51bUNvbik7CisJCQkJCQkJcEFzeVNkb1NlcUNvbi0+CisJCQkJCQkJICAgIG1fYlNlbmRTZXFOdW0gPQorCQkJCQkJCSAgICBBbWlHZXRCeXRlRnJvbUxlCisJCQkJCQkJICAgICgmcFJlY0ZyYW1lX3AtPgorCQkJCQkJCSAgICAgbV9sZV9iU2VuZFNlcU51bUNvbik7CisJCQkJCQkJLy8gc2V0IHJjb24gYW5kIHNjb24gdG8gMAorCQkJCQkJCXBBc3lTZG9TZXFDb24tPgorCQkJCQkJCSAgICBtX2JTZW5kU2VxTnVtICY9CisJCQkJCQkJICAgIEVQTF9TRVFfTlVNX01BU0s7CisJCQkJCQkJcEFzeVNkb1NlcUNvbi0+CisJCQkJCQkJICAgIG1fYlJlY1NlcU51bSAmPQorCQkJCQkJCSAgICBFUExfU0VRX05VTV9NQVNLOworCQkJCQkJCS8vIHNlbmQgZnJhbWUKKwkJCQkJCQlFcGxTZG9Bc3lTZXFTZW5kSW50ZXJuCisJCQkJCQkJICAgIChwQXN5U2RvU2VxQ29uLCAwLAorCQkJCQkJCSAgICAgTlVMTCwgRkFMU0UpOworCQkJCQkJfQorCQkJCQkJLy8gY2FsbCBDb21tYW5kIExheWVyIENiCisJCQkJCQlBc3lTZG9TZXF1SW5zdGFuY2VfZy4KKwkJCQkJCSAgICBtX2ZwU2RvQ29tQ29uQ2IKKwkJCQkJCSAgICAoU2RvU2VxQ29uSGRsLAorCQkJCQkJICAgICBrQXN5U2RvQ29uU3RhdGVJbml0RXJyb3IpOworCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIHRpbWVvdXQKKwkJCWNhc2Uga0FzeVNkb1NlcUV2ZW50VGltZW91dDoKKwkJCQl7CS8vIGVycm9yIC0+IENsb3NlCisJCQkJCXBBc3lTZG9TZXFDb24tPm1fU2RvU3RhdGUgPQorCQkJCQkgICAga0VwbEFzeVNkb1N0YXRlSWRsZTsKKwkJCQkJLy8gc2V0IHJjb24gYW5kIHNjb24gdG8gMAorCQkJCQlwQXN5U2RvU2VxQ29uLT5tX2JTZW5kU2VxTnVtICY9CisJCQkJCSAgICBFUExfU0VRX05VTV9NQVNLOworCQkJCQlwQXN5U2RvU2VxQ29uLT5tX2JSZWNTZXFOdW0gJj0KKwkJCQkJICAgIEVQTF9TRVFfTlVNX01BU0s7CisJCQkJCS8vIHNlbmQgZnJhbWUKKwkJCQkJRXBsU2RvQXN5U2VxU2VuZEludGVybihwQXN5U2RvU2VxQ29uLAorCQkJCQkJCSAgICAgICAwLCBOVUxMLCBGQUxTRSk7CisKKwkJCQkJLy8gY2FsbCBDb21tYW5kIExheWVyIENiCisJCQkJCUFzeVNkb1NlcXVJbnN0YW5jZV9nLgorCQkJCQkgICAgbV9mcFNkb0NvbUNvbkNiKFNkb1NlcUNvbkhkbCwKKwkJCQkJCQkgICAga0FzeVNkb0NvblN0YXRlSW5pdEVycm9yKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQlkZWZhdWx0OgorCQkJCS8vIGQuay4gZG8gbm90aGluZworCQkJCWJyZWFrOworCisJCQl9CS8vIGVuZCBvZiBzd2l0Y2goRXZlbnRfcCkKKwkJCWJyZWFrOworCQl9CisKKwkJLy8gaW5pdCBjb25uZWN0aW9uIHN0ZXAgMworCWNhc2Uga0VwbEFzeVNkb1N0YXRlSW5pdDM6CisJCXsKKwkJCS8vIGNoZWNrIGV2ZW50CisJCQlzd2l0Y2ggKEV2ZW50X3ApIHsKKwkJCQkvLyBmcmFtZSByZWNlaXZlZAorCQkJY2FzZSBrQXN5U2RvU2VxRXZlbnRGcmFtZVJlYzoKKwkJCQl7CisJCQkJCS8vIGNoZWNrIHNjb24gPT0gMiBhbmQgcmNvbiA9PSAyCisJCQkJCWlmICgoKHBSZWNGcmFtZV9wLT4KKwkJCQkJICAgICAgbV9sZV9iUmVjU2VxTnVtQ29uICYKKwkJCQkJICAgICAgRVBMX0FTWV9TRE9fQ09OX01BU0spID09IDB4MDIpCisJCQkJCSAgICAmJgorCQkJCQkgICAgKChwUmVjRnJhbWVfcC0+CisJCQkJCSAgICAgIG1fbGVfYlNlbmRTZXFOdW1Db24gJgorCQkJCQkgICAgICBFUExfQVNZX1NET19DT05fTUFTSykgPT0gMHgwMikpIHsKKwkJCQkJCS8vIHNhdmUgc2VxdWVuY2UgbnVtYmVycworCQkJCQkJcEFzeVNkb1NlcUNvbi0+bV9iUmVjU2VxTnVtID0KKwkJCQkJCSAgICBBbWlHZXRCeXRlRnJvbUxlCisJCQkJCQkgICAgKCZwUmVjRnJhbWVfcC0+CisJCQkJCQkgICAgIG1fbGVfYlJlY1NlcU51bUNvbik7CisJCQkJCQlwQXN5U2RvU2VxQ29uLT5tX2JTZW5kU2VxTnVtID0KKwkJCQkJCSAgICBBbWlHZXRCeXRlRnJvbUxlCisJCQkJCQkgICAgKCZwUmVjRnJhbWVfcC0+CisJCQkJCQkgICAgIG1fbGVfYlNlbmRTZXFOdW1Db24pOworCQkJCQkJLy8gY2hhbmdlIHN0YXRlIHRvIGtFcGxBc3lTZG9TdGF0ZUNvbm5lY3RlZAorCQkJCQkJcEFzeVNkb1NlcUNvbi0+bV9TZG9TdGF0ZSA9CisJCQkJCQkgICAga0VwbEFzeVNkb1N0YXRlQ29ubmVjdGVkOworCisJCQkJCQkvLyBzZXQgdGltZXIKKwkJCQkJCVJldCA9CisJCQkJCQkgICAgRXBsU2RvQXN5U2VxU2V0VGltZXIKKwkJCQkJCSAgICAocEFzeVNkb1NlcUNvbiwKKwkJCQkJCSAgICAgRVBMX1NFUV9ERUZBVUxUX1RJTUVPVVQpOworCQkJCQkJLy8gY2FsbCBDb21tYW5kIExheWVyIENiCisJCQkJCQlBc3lTZG9TZXF1SW5zdGFuY2VfZy4KKwkJCQkJCSAgICBtX2ZwU2RvQ29tQ29uQ2IKKwkJCQkJCSAgICAoU2RvU2VxQ29uSGRsLAorCQkJCQkJICAgICBrQXN5U2RvQ29uU3RhdGVDb25uZWN0ZWQpOworCisJCQkJCX0KKwkJCQkJLy8gY2hlY2sgc2NvbiA9PSAyIGFuZCByY29uID09IDEKKwkJCQkJZWxzZSBpZiAoKChwUmVjRnJhbWVfcC0+CisJCQkJCQkgICBtX2xlX2JSZWNTZXFOdW1Db24gJgorCQkJCQkJICAgRVBMX0FTWV9TRE9fQ09OX01BU0spID09CisJCQkJCQkgIDB4MDEpCisJCQkJCQkgJiYgKChwUmVjRnJhbWVfcC0+bV9sZV9iU2VuZFNlcU51bUNvbiAmIEVQTF9BU1lfU0RPX0NPTl9NQVNLKSA9PSAweDAyKSkgewkvLyBjcmVhdGUgYW5zd2VyIG93biByY29uID0gMgorCQkJCQkJLy8gc2F2ZSBzZXF1ZW5jZSBudW1iZXJzCisJCQkJCQlwQXN5U2RvU2VxQ29uLT5tX2JSZWNTZXFOdW0gPQorCQkJCQkJICAgIEFtaUdldEJ5dGVGcm9tTGUKKwkJCQkJCSAgICAoJnBSZWNGcmFtZV9wLT4KKwkJCQkJCSAgICAgbV9sZV9iUmVjU2VxTnVtQ29uKTsKKwkJCQkJCXBBc3lTZG9TZXFDb24tPm1fYlNlbmRTZXFOdW0gPQorCQkJCQkJICAgIEFtaUdldEJ5dGVGcm9tTGUKKwkJCQkJCSAgICAoJnBSZWNGcmFtZV9wLT4KKwkJCQkJCSAgICAgbV9sZV9iU2VuZFNlcU51bUNvbik7CisKKwkJCQkJCXBBc3lTZG9TZXFDb24tPm1fYlJlY1NlcU51bSsrOworCQkJCQkJUmV0ID0KKwkJCQkJCSAgICBFcGxTZG9Bc3lTZXFTZW5kSW50ZXJuCisJCQkJCQkgICAgKHBBc3lTZG9TZXFDb24sIDAsIE5VTEwsCisJCQkJCQkgICAgIEZBTFNFKTsKKwkJCQkJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCQkJCQlnb3RvIEV4aXQ7CisJCQkJCQl9CisJCQkJCQkvLyBjaGFuZ2Ugc3RhdGUgdG8ga0VwbEFzeVNkb1N0YXRlQ29ubmVjdGVkCisJCQkJCQlwQXN5U2RvU2VxQ29uLT5tX1Nkb1N0YXRlID0KKwkJCQkJCSAgICBrRXBsQXN5U2RvU3RhdGVDb25uZWN0ZWQ7CisKKwkJCQkJCS8vIHNldCB0aW1lcgorCQkJCQkJUmV0ID0KKwkJCQkJCSAgICBFcGxTZG9Bc3lTZXFTZXRUaW1lcgorCQkJCQkJICAgIChwQXN5U2RvU2VxQ29uLAorCQkJCQkJICAgICBFUExfU0VRX0RFRkFVTFRfVElNRU9VVCk7CisKKwkJCQkJCS8vIGNhbGwgQ29tbWFuZCBMYXllciBDYgorCQkJCQkJQXN5U2RvU2VxdUluc3RhbmNlX2cuCisJCQkJCQkgICAgbV9mcFNkb0NvbUNvbkNiCisJCQkJCQkgICAgKFNkb1NlcUNvbkhkbCwKKwkJCQkJCSAgICAga0FzeVNkb0NvblN0YXRlQ29ubmVjdGVkKTsKKworCQkJCQl9IGVsc2UgewkvLyBlcnJvciAtPiBDbG9zZQorCQkJCQkJcEFzeVNkb1NlcUNvbi0+bV9TZG9TdGF0ZSA9CisJCQkJCQkgICAga0VwbEFzeVNkb1N0YXRlSWRsZTsKKwkJCQkJCS8vIGRlbGV0ZSB0aW1lcgorCQkJCQkJRXBsVGltZXJ1RGVsZXRlVGltZXIKKwkJCQkJCSAgICAoJnBBc3lTZG9TZXFDb24tPgorCQkJCQkJICAgICBtX0VwbFRpbWVySGRsKTsKKwkJCQkJCWlmICgoKHBSZWNGcmFtZV9wLT4KKwkJCQkJCSAgICAgIG1fbGVfYlJlY1NlcU51bUNvbiAmCisJCQkJCQkgICAgICBFUExfQVNZX1NET19DT05fTUFTSykgIT0KKwkJCQkJCSAgICAgMHgwMCkKKwkJCQkJCSAgICB8fCAoKHBSZWNGcmFtZV9wLT5tX2xlX2JTZW5kU2VxTnVtQ29uICYgRVBMX0FTWV9TRE9fQ09OX01BU0spICE9IDB4MDApKSB7CS8vIGQuay4gb25seSBhbnN3ZXIgd2l0aCBjbG9zZSBtZXNzYWdlIGlmIHRoZSBtZXNzYWdlIHNlbnQgd2FzIG5vdCBhIGNsb3NlIG1lc3NhZ2UKKwkJCQkJCQkvLyBzYXZlIHNlcXVlbmNlIG51bWJlcnMKKwkJCQkJCQlwQXN5U2RvU2VxQ29uLT4KKwkJCQkJCQkgICAgbV9iUmVjU2VxTnVtID0KKwkJCQkJCQkgICAgQW1pR2V0Qnl0ZUZyb21MZQorCQkJCQkJCSAgICAoJnBSZWNGcmFtZV9wLT4KKwkJCQkJCQkgICAgIG1fbGVfYlJlY1NlcU51bUNvbik7CisJCQkJCQkJcEFzeVNkb1NlcUNvbi0+CisJCQkJCQkJICAgIG1fYlNlbmRTZXFOdW0gPQorCQkJCQkJCSAgICBBbWlHZXRCeXRlRnJvbUxlCisJCQkJCQkJICAgICgmcFJlY0ZyYW1lX3AtPgorCQkJCQkJCSAgICAgbV9sZV9iU2VuZFNlcU51bUNvbik7CisJCQkJCQkJLy8gc2V0IHJjb24gYW5kIHNjb24gdG8gMAorCQkJCQkJCXBBc3lTZG9TZXFDb24tPgorCQkJCQkJCSAgICBtX2JTZW5kU2VxTnVtICY9CisJCQkJCQkJICAgIEVQTF9TRVFfTlVNX01BU0s7CisJCQkJCQkJcEFzeVNkb1NlcUNvbi0+CisJCQkJCQkJICAgIG1fYlJlY1NlcU51bSAmPQorCQkJCQkJCSAgICBFUExfU0VRX05VTV9NQVNLOworCQkJCQkJCS8vIHNlbmQgZnJhbWUKKwkJCQkJCQlFcGxTZG9Bc3lTZXFTZW5kSW50ZXJuCisJCQkJCQkJICAgIChwQXN5U2RvU2VxQ29uLCAwLAorCQkJCQkJCSAgICAgTlVMTCwgRkFMU0UpOworCQkJCQkJfQorCQkJCQkJLy8gY2FsbCBDb21tYW5kIExheWVyIENiCisJCQkJCQlBc3lTZG9TZXF1SW5zdGFuY2VfZy4KKwkJCQkJCSAgICBtX2ZwU2RvQ29tQ29uQ2IKKwkJCQkJCSAgICAoU2RvU2VxQ29uSGRsLAorCQkJCQkJICAgICBrQXN5U2RvQ29uU3RhdGVJbml0RXJyb3IpOworCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIHRpbWVvdXQKKwkJCWNhc2Uga0FzeVNkb1NlcUV2ZW50VGltZW91dDoKKwkJCQl7CS8vIGVycm9yIC0+IENsb3NlCisJCQkJCXBBc3lTZG9TZXFDb24tPm1fU2RvU3RhdGUgPQorCQkJCQkgICAga0VwbEFzeVNkb1N0YXRlSWRsZTsKKwkJCQkJLy8gc2V0IHJjb24gYW5kIHNjb24gdG8gMAorCQkJCQlwQXN5U2RvU2VxQ29uLT5tX2JTZW5kU2VxTnVtICY9CisJCQkJCSAgICBFUExfU0VRX05VTV9NQVNLOworCQkJCQlwQXN5U2RvU2VxQ29uLT5tX2JSZWNTZXFOdW0gJj0KKwkJCQkJICAgIEVQTF9TRVFfTlVNX01BU0s7CisJCQkJCS8vIHNlbmQgZnJhbWUKKwkJCQkJRXBsU2RvQXN5U2VxU2VuZEludGVybihwQXN5U2RvU2VxQ29uLAorCQkJCQkJCSAgICAgICAwLCBOVUxMLCBGQUxTRSk7CisKKwkJCQkJLy8gY2FsbCBDb21tYW5kIExheWVyIENiCisJCQkJCUFzeVNkb1NlcXVJbnN0YW5jZV9nLgorCQkJCQkgICAgbV9mcFNkb0NvbUNvbkNiKFNkb1NlcUNvbkhkbCwKKwkJCQkJCQkgICAga0FzeVNkb0NvblN0YXRlSW5pdEVycm9yKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQlkZWZhdWx0OgorCQkJCS8vIGQuay4gZG8gbm90aGluZworCQkJCWJyZWFrOworCisJCQl9CS8vIGVuZCBvZiBzd2l0Y2goRXZlbnRfcCkKKwkJCWJyZWFrOworCQl9CisKKwkJLy8gY29ubmVjdGlvbiBlc3RhYmxpc2hlZAorCWNhc2Uga0VwbEFzeVNkb1N0YXRlQ29ubmVjdGVkOgorCQl7CisJCQkvLyBjaGVjayBldmVudAorCQkJc3dpdGNoIChFdmVudF9wKSB7CisKKwkJCQkvLyBmcmFtZSB0byBzZW5kCisJCQljYXNlIGtBc3lTZG9TZXFFdmVudEZyYW1lU2VuZDoKKwkJCQl7CisJCQkJCS8vIHNldCB0aW1lcgorCQkJCQlSZXQgPQorCQkJCQkgICAgRXBsU2RvQXN5U2VxU2V0VGltZXIocEFzeVNkb1NlcUNvbiwKKwkJCQkJCQkJIEVQTF9TRVFfREVGQVVMVF9USU1FT1VUKTsKKwkJCQkJLy8gY2hlY2sgaWYgZGF0YSBmcmFtZSBvciBhY2sKKwkJCQkJaWYgKHBEYXRhX3AgPT0gTlVMTCkgewkvLyBzZW5kIGFjaworCQkJCQkJLy8gaW5jIHNjb24KKwkJCQkJCS8vcEFzeVNkb1NlcUNvbi0+bV9iUmVjU2VxTnVtICs9IDQ7CisJCQkJCQlSZXQgPQorCQkJCQkJICAgIEVwbFNkb0FzeVNlcVNlbmRJbnRlcm4KKwkJCQkJCSAgICAocEFzeVNkb1NlcUNvbiwgMCwgTlVMTCwKKwkJCQkJCSAgICAgRkFMU0UpOworCQkJCQkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJCQkJCWdvdG8gRXhpdDsKKwkJCQkJCX0KKwkJCQkJfSBlbHNlIHsJLy8gc2VuZCBkYXRhZnJhbWUKKwkJCQkJCS8vIGluY3JlbWVudCBzZW5kIHNlcXVlbmNlIG51bWJlcgorCQkJCQkJcEFzeVNkb1NlcUNvbi0+bV9iUmVjU2VxTnVtICs9CisJCQkJCQkgICAgNDsKKwkJCQkJCVJldCA9CisJCQkJCQkgICAgRXBsU2RvQXN5U2VxU2VuZEludGVybgorCQkJCQkJICAgIChwQXN5U2RvU2VxQ29uLAorCQkJCQkJICAgICB1aURhdGFTaXplX3AsIHBEYXRhX3AsCisJCQkJCQkgICAgIFRSVUUpOworCQkJCQkJaWYgKFJldCA9PSBrRXBsU2RvU2VxUmVxdWVzdEFja05lZWRlZCkgewkvLyByZXF1ZXN0IGFjaworCQkJCQkJCS8vIGNoYW5nZSBzdGF0ZSB0byB3YWl0IGFjaworCQkJCQkJCXBBc3lTZG9TZXFDb24tPgorCQkJCQkJCSAgICBtX1Nkb1N0YXRlID0KKwkJCQkJCQkgICAga0VwbEFzeVNkb1N0YXRlV2FpdEFjazsKKwkJCQkJCQkvLyBzZXQgUmV0IHRvIGtFcGxTdWNjZXNzZnVsLCBiZWNhdXNlIG5vIGVycm9yCisJCQkJCQkJLy8gZm9yIGhpZ2hlciBsYXllcgorCQkJCQkJCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJCQkJCQl9IGVsc2UgaWYgKFJldCAhPQorCQkJCQkJCSAgIGtFcGxTdWNjZXNzZnVsKSB7CisJCQkJCQkJZ290byBFeGl0OworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkvLyBjYWxsIENvbW1hbmQgTGF5ZXIgQ2IKKwkJCQkJCQlBc3lTZG9TZXF1SW5zdGFuY2VfZy4KKwkJCQkJCQkgICAgbV9mcFNkb0NvbUNvbkNiCisJCQkJCQkJICAgIChTZG9TZXFDb25IZGwsCisJCQkJCQkJICAgICBrQXN5U2RvQ29uU3RhdGVGcmFtZVNlbmRlZCk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJfQkvLyBlbmQgb2YgY2FzZSBrQXN5U2RvU2VxRXZlbnRGcmFtZVNlbmQKKworCQkJCS8vIGZyYW1lIHJlY2VpdmVkCisJCQljYXNlIGtBc3lTZG9TZXFFdmVudEZyYW1lUmVjOgorCQkJCXsKKwkJCQkJQllURSBiU2VuZFNlcU51bUNvbiA9CisJCQkJCSAgICBBbWlHZXRCeXRlRnJvbUxlKCZwUmVjRnJhbWVfcC0+CisJCQkJCQkJICAgICBtX2xlX2JTZW5kU2VxTnVtQ29uKTsKKworCQkJCQkvLyBzZXQgdGltZXIKKwkJCQkJUmV0ID0KKwkJCQkJICAgIEVwbFNkb0FzeVNlcVNldFRpbWVyKHBBc3lTZG9TZXFDb24sCisJCQkJCQkJCSBFUExfU0VRX0RFRkFVTFRfVElNRU9VVCk7CisJCQkJCS8vIGNoZWNrIHNjb24KKwkJCQkJc3dpdGNoIChiU2VuZFNlcU51bUNvbiAmCisJCQkJCQlFUExfQVNZX1NET19DT05fTUFTSykgeworCQkJCQkJLy8gY2xvc2UgZnJvbSBvdGhlciBub2RlCisJCQkJCWNhc2UgMDoKKwkJCQkJY2FzZSAxOgorCQkJCQkJeworCQkJCQkJCS8vIHJldHVybiB0byBpZGxlCisJCQkJCQkJcEFzeVNkb1NlcUNvbi0+CisJCQkJCQkJICAgIG1fU2RvU3RhdGUgPQorCQkJCQkJCSAgICBrRXBsQXN5U2RvU3RhdGVJZGxlOworCQkJCQkJCS8vIGRlbGV0ZSB0aW1lcgorCQkJCQkJCUVwbFRpbWVydURlbGV0ZVRpbWVyCisJCQkJCQkJICAgICgmcEFzeVNkb1NlcUNvbi0+CisJCQkJCQkJICAgICBtX0VwbFRpbWVySGRsKTsKKwkJCQkJCQkvLyBjYWxsIENvbW1hbmQgTGF5ZXIgQ2IKKwkJCQkJCQlBc3lTZG9TZXF1SW5zdGFuY2VfZy4KKwkJCQkJCQkgICAgbV9mcFNkb0NvbUNvbkNiCisJCQkJCQkJICAgIChTZG9TZXFDb25IZGwsCisJCQkJCQkJICAgICBrQXN5U2RvQ29uU3RhdGVDb25DbG9zZWQpOworCisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisKKwkJCQkJCS8vIFJlcXVlc3QgQWNrIG9yIEVycm9yIEFjaworCQkJCQkJLy8gcG9zc2libGUgY29udGFpbiBkYXRhCisJCQkJCWNhc2UgMzoKKwkJCQkJCS8vIG5vcm1hbCBmcmFtZQorCQkJCQljYXNlIDI6CisJCQkJCQl7CisJCQkJCQkJaWYgKChBbWlHZXRCeXRlRnJvbUxlCisJCQkJCQkJICAgICAoJnBSZWNGcmFtZV9wLT4KKwkJCQkJCQkgICAgICBtX2xlX2JSZWNTZXFOdW1Db24pCisJCQkJCQkJICAgICAmCisJCQkJCQkJICAgICBFUExfQVNZX1NET19DT05fTUFTSykKKwkJCQkJCQkgICAgPT0gMykgeworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBSSU5URjAoIkVwbFNkb0FzeVNlcXU6IGVycm9yIHJlc3BvbnNlIHJlY2VpdmVkXG4iKTsKKworCQkJCQkJCQkvLyBlcnJvciByZXNwb25zZSAocmV0cmFuc21pc3Npb24gcmVxdWVzdCkKKwkJCQkJCQkJLy8gcmVzZW5kIGZyYW1lcyBmcm9tIGhpc3RvcnkKKworCQkJCQkJCQkvLyByZWFkIGZyYW1lIGZyb20gaGlzdG9yeQorCQkJCQkJCQlSZXQgPQorCQkJCQkJCQkgICAgRXBsU2RvQXN5UmVhZEZyb21IaXN0b3J5CisJCQkJCQkJCSAgICAocEFzeVNkb1NlcUNvbiwKKwkJCQkJCQkJICAgICAmcEVwbEZyYW1lLAorCQkJCQkJCQkgICAgICZ1aUZyYW1lU2l6ZSwKKwkJCQkJCQkJICAgICBUUlVFKTsKKwkJCQkJCQkJaWYgKFJldCAhPQorCQkJCQkJCQkgICAga0VwbFN1Y2Nlc3NmdWwpCisJCQkJCQkJCXsKKwkJCQkJCQkJCWdvdG8gRXhpdDsKKwkJCQkJCQkJfQorCisJCQkJCQkJCXdoaWxlICgocEVwbEZyYW1lICE9IE5VTEwpCisJCQkJCQkJCSAgICAgICAmJgorCQkJCQkJCQkgICAgICAgKHVpRnJhbWVTaXplCisJCQkJCQkJCQkhPSAwKSkgeworCQkJCQkJCQkJLy8gc2VuZCBmcmFtZQorCQkJCQkJCQkJUmV0ID0KKwkJCQkJCQkJCSAgICBFcGxTZG9Bc3lTZXFTZW5kTG93ZXJMYXllcgorCQkJCQkJCQkJICAgIChwQXN5U2RvU2VxQ29uLAorCQkJCQkJCQkJICAgICB1aUZyYW1lU2l6ZSwKKwkJCQkJCQkJCSAgICAgcEVwbEZyYW1lKTsKKwkJCQkJCQkJCWlmIChSZXQKKwkJCQkJCQkJCSAgICAhPQorCQkJCQkJCQkJICAgIGtFcGxTdWNjZXNzZnVsKQorCQkJCQkJCQkJeworCQkJCQkJCQkJCWdvdG8gRXhpdDsKKwkJCQkJCQkJCX0KKwkJCQkJCQkJCS8vIHJlYWQgbmV4dCBmcmFtZSBmcm9tIGhpc3RvcnkKKwkJCQkJCQkJCVJldCA9CisJCQkJCQkJCQkgICAgRXBsU2RvQXN5UmVhZEZyb21IaXN0b3J5CisJCQkJCQkJCQkgICAgKHBBc3lTZG9TZXFDb24sCisJCQkJCQkJCQkgICAgICZwRXBsRnJhbWUsCisJCQkJCQkJCQkgICAgICZ1aUZyYW1lU2l6ZSwKKwkJCQkJCQkJCSAgICAgRkFMU0UpOworCQkJCQkJCQkJaWYgKFJldAorCQkJCQkJCQkJICAgICE9CisJCQkJCQkJCQkgICAga0VwbFN1Y2Nlc3NmdWwpCisJCQkJCQkJCQl7CisJCQkJCQkJCQkJZ290byBFeGl0OworCQkJCQkJCQkJfQorCQkJCQkJCQl9CS8vIGVuZCBvZiB3aGlsZSgocGFiRnJhbWUgIT0gTlVMTCkKKwkJCQkJCQl9CS8vIGVuZCBvZiBpZiAoZXJyb3IgcmVzcG9uc2UpCisKKwkJCQkJCQlpZiAoKChwQXN5U2RvU2VxQ29uLT5tX2JTZW5kU2VxTnVtICsgNCkgJiBFUExfU0VRX05VTV9NQVNLKSA9PSAoYlNlbmRTZXFOdW1Db24gJiBFUExfU0VRX05VTV9NQVNLKSkgewkvLyBuZXh0IGZyYW1lIG9mIHNlcXVlbmNlIHJlY2VpdmVkCisJCQkJCQkJCS8vIHNhdmUgc2VuZCBzZXF1ZW5jZSBudW1iZXIgKHdpdGhvdXQgYWNrIHJlcXVlc3QpCisJCQkJCQkJCXBBc3lTZG9TZXFDb24tPgorCQkJCQkJCQkgICAgbV9iU2VuZFNlcU51bQorCQkJCQkJCQkgICAgPQorCQkJCQkJCQkgICAgYlNlbmRTZXFOdW1Db24KKwkJCQkJCQkJICAgICYgfjB4MDE7CisKKwkJCQkJCQkJLy8gY2hlY2sgaWYgYWNrIG9yIGRhdGEtZnJhbWUKKwkJCQkJCQkJLy9pZ25vcmUgYWNrIC0+IGFscmVhZHkgcHJvY2Vzc2VkCisJCQkJCQkJCWlmICh1aURhdGFTaXplX3AKKwkJCQkJCQkJICAgID4KKwkJCQkJCQkJICAgIEVQTF9TRVFfSEVBREVSX1NJWkUpCisJCQkJCQkJCXsKKwkJCQkJCQkJCUFzeVNkb1NlcXVJbnN0YW5jZV9nLgorCQkJCQkJCQkJICAgIG1fZnBTZG9Db21SZWNlaXZlQ2IKKwkJCQkJCQkJCSAgICAoU2RvU2VxQ29uSGRsLAorCQkJCQkJCQkJICAgICAoKHRFcGxBc3lTZG9Db20gKikgJiBwUmVjRnJhbWVfcC0+bV9sZV9hYlNkb1NlcVBheWxvYWQpLCAodWlEYXRhU2l6ZV9wIC0gRVBMX1NFUV9IRUFERVJfU0laRSkpOworCQkJCQkJCQkJLy8gY2FsbCBDb21tYW5kIExheWVyIENiCisJCQkJCQkJCQlBc3lTZG9TZXF1SW5zdGFuY2VfZy4KKwkJCQkJCQkJCSAgICBtX2ZwU2RvQ29tQ29uQ2IKKwkJCQkJCQkJCSAgICAoU2RvU2VxQ29uSGRsLAorCQkJCQkJCQkJICAgICBrQXN5U2RvQ29uU3RhdGVGcmFtZVNlbmRlZCk7CisKKwkJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJCS8vIGNhbGwgQ29tbWFuZCBMYXllciBDYgorCQkJCQkJCQkJQXN5U2RvU2VxdUluc3RhbmNlX2cuCisJCQkJCQkJCQkgICAgbV9mcFNkb0NvbUNvbkNiCisJCQkJCQkJCQkgICAgKFNkb1NlcUNvbkhkbCwKKwkJCQkJCQkJCSAgICAga0FzeVNkb0NvblN0YXRlQWNrUmVjZWl2ZWQpOworCQkJCQkJCQl9CisJCQkJCQkJfSBlbHNlIGlmICgoKGJTZW5kU2VxTnVtQ29uIC0gcEFzeVNkb1NlcUNvbi0+bV9iU2VuZFNlcU51bSAtIDQpICYgRVBMX1NFUV9OVU1fTUFTSykgPCBFUExfU0VRX05VTV9USFJFU0hPTEQpIHsJLy8gZnJhbWUgb2Ygc2VxdWVuY2Ugd2FzIGxvc3QsCisJCQkJCQkJCS8vIGJlY2F1c2UgZGlmZmVyZW5jZSBvZiByZWNlaXZlZCBhbmQgb2xkIHZhbHVlCisJCQkJCQkJCS8vIGlzIGxlc3MgdGhlbiBoYWx2ZSBvZiB0aGUgdmFsdWVzIHJhbmdlLgorCisJCQkJCQkJCS8vIHNlbmQgZXJyb3IgZnJhbWUgd2l0aCBvd24gcmNvbiA9IDMKKwkJCQkJCQkJcEFzeVNkb1NlcUNvbi0+CisJCQkJCQkJCSAgICBtX2JTZW5kU2VxTnVtCisJCQkJCQkJCSAgICB8PSAweDAzOworCQkJCQkJCQlSZXQgPQorCQkJCQkJCQkgICAgRXBsU2RvQXN5U2VxU2VuZEludGVybgorCQkJCQkJCQkgICAgKHBBc3lTZG9TZXFDb24sCisJCQkJCQkJCSAgICAgMCwgTlVMTCwKKwkJCQkJCQkJICAgICBGQUxTRSk7CisJCQkJCQkJCS8vIHJlc3RvcmUgc2VuZCBzZXF1ZW5jZSBudW1iZXIKKwkJCQkJCQkJcEFzeVNkb1NlcUNvbi0+CisJCQkJCQkJCSAgICBtX2JTZW5kU2VxTnVtCisJCQkJCQkJCSAgICA9CisJCQkJCQkJCSAgICAocEFzeVNkb1NlcUNvbi0+CisJCQkJCQkJCSAgICAgbV9iU2VuZFNlcU51bQorCQkJCQkJCQkgICAgICYKKwkJCQkJCQkJICAgICBFUExfU0VRX05VTV9NQVNLKQorCQkJCQkJCQkgICAgfCAweDAyOworCQkJCQkJCQlpZiAoUmV0ICE9CisJCQkJCQkJCSAgICBrRXBsU3VjY2Vzc2Z1bCkKKwkJCQkJCQkJeworCQkJCQkJCQkJZ290byBFeGl0OworCQkJCQkJCQl9CisJCQkJCQkJCS8vIGJyZWFrIGhlcmUsIGJlY2F1c2UgYSByZXF1ZXN0ZWQgYWNrbm93bGVkZ2UKKwkJCQkJCQkJLy8gd2FzIHNlbnQgaW1wbGljaXRseSBhYm92ZQorCQkJCQkJCQlicmVhazsKKwkJCQkJCQl9CisJCQkJCQkJLy8gZWxzZSwgaWdub3JlIHJlcGVhdGVkIGZyYW1lCisKKwkJCQkJCQlpZiAoKGJTZW5kU2VxTnVtQ29uICYgRVBMX0FTWV9TRE9fQ09OX01BU0spID09IDMpIHsJLy8gYWNrIHJlcXVlc3QgcmVjZWl2ZWQKKworCQkJCQkJCQkvLyBjcmVhdGUgYWNrIHdpdGggb3duIHNjb24gPSAyCisJCQkJCQkJCVJldCA9CisJCQkJCQkJCSAgICBFcGxTZG9Bc3lTZXFTZW5kSW50ZXJuCisJCQkJCQkJCSAgICAocEFzeVNkb1NlcUNvbiwKKwkJCQkJCQkJICAgICAwLCBOVUxMLAorCQkJCQkJCQkgICAgIEZBTFNFKTsKKwkJCQkJCQkJaWYgKFJldCAhPQorCQkJCQkJCQkgICAga0VwbFN1Y2Nlc3NmdWwpCisJCQkJCQkJCXsKKwkJCQkJCQkJCWdvdG8gRXhpdDsKKwkJCQkJCQkJfQorCQkJCQkJCX0KKworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCisJCQkJCX0JLy8gc3dpdGNoKHBBc3lTZG9TZXFDb24tPm1fYlNlbmRTZXFOdW0gJiBFUExfQVNZX1NET19DT05fTUFTSykKKwkJCQkJYnJlYWs7CisJCQkJfQkvLyBlbmQgb2YgY2FzZSBrQXN5U2RvU2VxRXZlbnRGcmFtZVJlYzoKKworCQkJCS8vY2xvc2UgZXZlbnQgZnJvbSBoaWdoZXIgbGF5ZXIKKwkJCWNhc2Uga0FzeVNkb1NlcUV2ZW50Q2xvc2VDb246CisJCQkJeworCQkJCQlwQXN5U2RvU2VxQ29uLT5tX1Nkb1N0YXRlID0KKwkJCQkJICAgIGtFcGxBc3lTZG9TdGF0ZUlkbGU7CisJCQkJCS8vIHNldCByY29uIGFuZCBzY29uIHRvIDAKKwkJCQkJcEFzeVNkb1NlcUNvbi0+bV9iU2VuZFNlcU51bSAmPQorCQkJCQkgICAgRVBMX1NFUV9OVU1fTUFTSzsKKwkJCQkJcEFzeVNkb1NlcUNvbi0+bV9iUmVjU2VxTnVtICY9CisJCQkJCSAgICBFUExfU0VRX05VTV9NQVNLOworCQkJCQkvLyBzZW5kIGZyYW1lCisJCQkJCUVwbFNkb0FzeVNlcVNlbmRJbnRlcm4ocEFzeVNkb1NlcUNvbiwKKwkJCQkJCQkgICAgICAgMCwgTlVMTCwgRkFMU0UpOworCisJCQkJCS8vIGRlbGV0ZSB0aW1lcgorCQkJCQlFcGxUaW1lcnVEZWxldGVUaW1lcigmcEFzeVNkb1NlcUNvbi0+CisJCQkJCQkJICAgICBtX0VwbFRpbWVySGRsKTsKKwkJCQkJLy8gY2FsbCBDb21tYW5kIExheWVyIENiIGlzIG5vdCBuZWNlc3NhcnksIGJlY2F1c2UgdGhlIGV2ZW50IGNhbWUgZnJvbSB0aGVyZQorLy8gICAgICAgICAgICAgICAgICAgIEFzeVNkb1NlcXVJbnN0YW5jZV9nLm1fZnBTZG9Db21Db25DYihTZG9TZXFDb25IZGwsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtBc3lTZG9Db25TdGF0ZUluaXRFcnJvcik7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIHRpbWVvdXQKKwkJCWNhc2Uga0FzeVNkb1NlcUV2ZW50VGltZW91dDoKKwkJCQl7CisKKwkJCQkJdWlGcmVlRW50cmllcyA9CisJCQkJCSAgICBFcGxTZG9Bc3lHZXRGcmVlRW50cmllc0Zyb21IaXN0b3J5CisJCQkJCSAgICAocEFzeVNkb1NlcUNvbik7CisJCQkJCWlmICgodWlGcmVlRW50cmllcyA8CisJCQkJCSAgICAgRVBMX1NET19ISVNUT1JZX1NJWkUpCisJCQkJCSAgICAmJiAocEFzeVNkb1NlcUNvbi0+bV91aVJldHJ5Q291bnQgPCBFUExfU0VRX1JFVFJZX0NPVU5UKSkgewkvLyB1bmFja25vd2xlZ2RlZCBmcmFtZXMgaW4gaGlzdG9yeQorCQkJCQkJLy8gYW5kIHJldHJ5IGNvdW50ZXIgbm90IGV4Y2VlZGVkCisKKwkJCQkJCS8vIHJlc2VuZCBkYXRhIHdpdGggYWNrbm93bGVkZ2UgcmVxdWVzdAorCisJCQkJCQkvLyBpbmNyZW1lbnQgcmV0cnkgY291bnRlcgorCQkJCQkJcEFzeVNkb1NlcUNvbi0+bV91aVJldHJ5Q291bnQrKzsKKworCQkJCQkJLy8gc2V0IHRpbWVyCisJCQkJCQlSZXQgPQorCQkJCQkJICAgIEVwbFNkb0FzeVNlcVNldFRpbWVyCisJCQkJCQkgICAgKHBBc3lTZG9TZXFDb24sCisJCQkJCQkgICAgIEVQTF9TRVFfREVGQVVMVF9USU1FT1VUKTsKKworCQkJCQkJLy8gcmVhZCBmaXJzdCBmcmFtZSBmcm9tIGhpc3RvcnkKKwkJCQkJCVJldCA9CisJCQkJCQkgICAgRXBsU2RvQXN5UmVhZEZyb21IaXN0b3J5CisJCQkJCQkgICAgKHBBc3lTZG9TZXFDb24sICZwRXBsRnJhbWUsCisJCQkJCQkgICAgICZ1aUZyYW1lU2l6ZSwgVFJVRSk7CisJCQkJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQkJCQkJZ290byBFeGl0OworCQkJCQkJfQorCisJCQkJCQlpZiAoKHBFcGxGcmFtZSAhPSBOVUxMKQorCQkJCQkJICAgICYmICh1aUZyYW1lU2l6ZSAhPSAwKSkgeworCisJCQkJCQkJLy8gc2V0IGFjayByZXF1ZXN0IGluIHNjb24KKwkJCQkJCQlBbWlTZXRCeXRlVG9MZQorCQkJCQkJCSAgICAoJnBFcGxGcmFtZS0+bV9EYXRhLgorCQkJCQkJCSAgICAgbV9Bc25kLm1fUGF5bG9hZC4KKwkJCQkJCQkgICAgIG1fU2RvU2VxdWVuY2VGcmFtZS4KKwkJCQkJCQkgICAgIG1fbGVfYlNlbmRTZXFOdW1Db24sCisJCQkJCQkJICAgICBBbWlHZXRCeXRlRnJvbUxlCisJCQkJCQkJICAgICAoJnBFcGxGcmFtZS0+CisJCQkJCQkJICAgICAgbV9EYXRhLm1fQXNuZC4KKwkJCQkJCQkgICAgICBtX1BheWxvYWQuCisJCQkJCQkJICAgICAgbV9TZG9TZXF1ZW5jZUZyYW1lLgorCQkJCQkJCSAgICAgIG1fbGVfYlNlbmRTZXFOdW1Db24pCisJCQkJCQkJICAgICB8IDB4MDMpOworCisJCQkJCQkJLy8gc2VuZCBmcmFtZQorCQkJCQkJCVJldCA9CisJCQkJCQkJICAgIEVwbFNkb0FzeVNlcVNlbmRMb3dlckxheWVyCisJCQkJCQkJICAgIChwQXN5U2RvU2VxQ29uLAorCQkJCQkJCSAgICAgdWlGcmFtZVNpemUsCisJCQkJCQkJICAgICBwRXBsRnJhbWUpOworCQkJCQkJCWlmIChSZXQgIT0KKwkJCQkJCQkgICAga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCQkJCQkJZ290byBFeGl0OworCQkJCQkJCX0KKworCQkJCQkJfQorCQkJCQl9IGVsc2UgeworCQkJCQkJLy8gdGltZW91dCwgYmVjYXVzZSBvZiBubyB0cmFmZmljIC0+IENsb3NlCisJCQkJCQlwQXN5U2RvU2VxQ29uLT5tX1Nkb1N0YXRlID0KKwkJCQkJCSAgICBrRXBsQXN5U2RvU3RhdGVJZGxlOworCQkJCQkJLy8gc2V0IHJjb24gYW5kIHNjb24gdG8gMAorCQkJCQkJcEFzeVNkb1NlcUNvbi0+bV9iU2VuZFNlcU51bSAmPQorCQkJCQkJICAgIEVQTF9TRVFfTlVNX01BU0s7CisJCQkJCQlwQXN5U2RvU2VxQ29uLT5tX2JSZWNTZXFOdW0gJj0KKwkJCQkJCSAgICBFUExfU0VRX05VTV9NQVNLOworCQkJCQkJLy8gc2VuZCBmcmFtZQorCQkJCQkJRXBsU2RvQXN5U2VxU2VuZEludGVybgorCQkJCQkJICAgIChwQXN5U2RvU2VxQ29uLCAwLCBOVUxMLAorCQkJCQkJICAgICBGQUxTRSk7CisKKwkJCQkJCS8vIGNhbGwgQ29tbWFuZCBMYXllciBDYgorCQkJCQkJQXN5U2RvU2VxdUluc3RhbmNlX2cuCisJCQkJCQkgICAgbV9mcFNkb0NvbUNvbkNiCisJCQkJCQkgICAgKFNkb1NlcUNvbkhkbCwKKwkJCQkJCSAgICAga0FzeVNkb0NvblN0YXRlVGltZW91dCk7CisJCQkJCX0KKworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCWRlZmF1bHQ6CisJCQkJLy8gZC5rLiBkbyBub3RoaW5nCisJCQkJYnJlYWs7CisKKwkJCX0JLy8gZW5kIG9mIHN3aXRjaChFdmVudF9wKQorCQkJYnJlYWs7CisJCX0KKworCQkvLyB3YWl0IGZvciBBY2tub3dsZWRnZSAoaGlzdG9yeSBidWZmZXIgZnVsbCkKKwljYXNlIGtFcGxBc3lTZG9TdGF0ZVdhaXRBY2s6CisJCXsKKwkJCVBSSU5URjAoIkVwbFNkb0FzeVNlcXU6IFN0YXRlV2FpdEFja1xuIik7CisKKwkJCS8vIHNldCB0aW1lcgorCQkJUmV0ID0gRXBsU2RvQXN5U2VxU2V0VGltZXIocEFzeVNkb1NlcUNvbiwKKwkJCQkJCSAgIEVQTF9TRVFfREVGQVVMVF9USU1FT1VUKTsKKworCQkJLy9UT0RPOiByZXRyeSBvZiBhY2tub3dsZWRnZQorCQkJaWYgKEV2ZW50X3AgPT0ga0FzeVNkb1NlcUV2ZW50RnJhbWVSZWMpIHsKKwkJCQkvLyBjaGVjayByY29uCisJCQkJc3dpdGNoIChwUmVjRnJhbWVfcC0+CisJCQkJCW1fbGVfYlJlY1NlcU51bUNvbiAmCisJCQkJCUVQTF9BU1lfU0RPX0NPTl9NQVNLKSB7CisJCQkJCS8vIGNsb3NlLWZyb21lIG90aGVyIG5vZGUKKwkJCQljYXNlIDA6CisJCQkJCXsKKwkJCQkJCS8vIHJldHVybiB0byBpZGxlCisJCQkJCQlwQXN5U2RvU2VxQ29uLT5tX1Nkb1N0YXRlID0KKwkJCQkJCSAgICBrRXBsQXN5U2RvU3RhdGVJZGxlOworCQkJCQkJLy8gZGVsZXRlIHRpbWVyCisJCQkJCQlFcGxUaW1lcnVEZWxldGVUaW1lcgorCQkJCQkJICAgICgmcEFzeVNkb1NlcUNvbi0+CisJCQkJCQkgICAgIG1fRXBsVGltZXJIZGwpOworCQkJCQkJLy8gY2FsbCBDb21tYW5kIExheWVyIENiCisJCQkJCQlBc3lTZG9TZXF1SW5zdGFuY2VfZy4KKwkJCQkJCSAgICBtX2ZwU2RvQ29tQ29uQ2IKKwkJCQkJCSAgICAoU2RvU2VxQ29uSGRsLAorCQkJCQkJICAgICBrQXN5U2RvQ29uU3RhdGVDb25DbG9zZWQpOworCisJCQkJCQlicmVhazsKKwkJCQkJfQorCisJCQkJCS8vIG5vcm1hbCBmcmFtZQorCQkJCWNhc2UgMjoKKwkJCQkJeworCQkJCQkJLy8gc2hvdWxkIGJlIGFjaworCQkJCQkJLy8gLT4gY2hhbmdlIHRvIHN0YXRlIGtFcGxBc3lTZG9TdGF0ZUNvbm5lY3RlZAorCQkJCQkJcEFzeVNkb1NlcUNvbi0+bV9TZG9TdGF0ZSA9CisJCQkJCQkgICAga0VwbEFzeVNkb1N0YXRlQ29ubmVjdGVkOworCQkJCQkJLy8gY2FsbCBDb21tYW5kIExheWVyIENiCisJCQkJCQlBc3lTZG9TZXF1SW5zdGFuY2VfZy4KKwkJCQkJCSAgICBtX2ZwU2RvQ29tQ29uQ2IKKwkJCQkJCSAgICAoU2RvU2VxQ29uSGRsLAorCQkJCQkJICAgICBrQXN5U2RvQ29uU3RhdGVBY2tSZWNlaXZlZCk7CisJCQkJCQkvLyBzZW5kIGRhdGEgdG8gaGlnaGVyIGxheWVyIGlmIG5lZWRlZAorCQkJCQkJaWYgKHVpRGF0YVNpemVfcCA+CisJCQkJCQkgICAgRVBMX1NFUV9IRUFERVJfU0laRSkgeworCQkJCQkJCUFzeVNkb1NlcXVJbnN0YW5jZV9nLgorCQkJCQkJCSAgICBtX2ZwU2RvQ29tUmVjZWl2ZUNiCisJCQkJCQkJICAgIChTZG9TZXFDb25IZGwsCisJCQkJCQkJICAgICAoKHRFcGxBc3lTZG9Db20gKikKKwkJCQkJCQkgICAgICAmIHBSZWNGcmFtZV9wLT4KKwkJCQkJCQkgICAgICBtX2xlX2FiU2RvU2VxUGF5bG9hZCksCisJCQkJCQkJICAgICAodWlEYXRhU2l6ZV9wIC0KKwkJCQkJCQkgICAgICBFUExfU0VRX0hFQURFUl9TSVpFKSk7CisJCQkJCQl9CisJCQkJCQlicmVhazsKKwkJCQkJfQorCisJCQkJCS8vIFJlcXVlc3QgQWNrIG9yIEVycm9yIEFjaworCQkJCWNhc2UgMzoKKwkJCQkJeworCQkJCQkJLy8gLT4gY2hhbmdlIHRvIHN0YXRlIGtFcGxBc3lTZG9TdGF0ZUNvbm5lY3RlZAorCQkJCQkJcEFzeVNkb1NlcUNvbi0+bV9TZG9TdGF0ZSA9CisJCQkJCQkgICAga0VwbEFzeVNkb1N0YXRlQ29ubmVjdGVkOworCisJCQkJCQlpZiAocFJlY0ZyYW1lX3AtPm1fbGVfYlJlY1NlcU51bUNvbiA9PSBwQXN5U2RvU2VxQ29uLT5tX2JSZWNTZXFOdW0pIHsJLy8gYWNrIHJlcXVlc3QKKwkJCQkJCQkvLyAtPiBzZW5kIGFjaworCQkJCQkJCS8vIHNhdmUgc2VxdWVuY2UgbnVtYmVycworCQkJCQkJCXBBc3lTZG9TZXFDb24tPgorCQkJCQkJCSAgICBtX2JSZWNTZXFOdW0gPQorCQkJCQkJCSAgICBBbWlHZXRCeXRlRnJvbUxlCisJCQkJCQkJICAgICgmcFJlY0ZyYW1lX3AtPgorCQkJCQkJCSAgICAgbV9sZV9iUmVjU2VxTnVtQ29uKTsKKwkJCQkJCQlwQXN5U2RvU2VxQ29uLT4KKwkJCQkJCQkgICAgbV9iU2VuZFNlcU51bSA9CisJCQkJCQkJICAgIEFtaUdldEJ5dGVGcm9tTGUKKwkJCQkJCQkgICAgKCZwUmVjRnJhbWVfcC0+CisJCQkJCQkJICAgICBtX2xlX2JTZW5kU2VxTnVtQ29uKTsKKworCQkJCQkJCS8vIGNyZWF0ZSBhbnN3ZXIgb3duIHJjb24gPSAyCisJCQkJCQkJcEFzeVNkb1NlcUNvbi0+CisJCQkJCQkJICAgIG1fYlJlY1NlcU51bS0tOworCisJCQkJCQkJLy8gY2hlY2sgaWYgYWNrIG9yIGRhdGEtZnJhbWUKKwkJCQkJCQlpZiAodWlEYXRhU2l6ZV9wID4KKwkJCQkJCQkgICAgRVBMX1NFUV9IRUFERVJfU0laRSkKKwkJCQkJCQl7CisJCQkJCQkJCUFzeVNkb1NlcXVJbnN0YW5jZV9nLgorCQkJCQkJCQkgICAgbV9mcFNkb0NvbVJlY2VpdmVDYgorCQkJCQkJCQkgICAgKFNkb1NlcUNvbkhkbCwKKwkJCQkJCQkJICAgICAoKHRFcGxBc3lTZG9Db20gKikgJiBwUmVjRnJhbWVfcC0+bV9sZV9hYlNkb1NlcVBheWxvYWQpLCAodWlEYXRhU2l6ZV9wIC0gRVBMX1NFUV9IRUFERVJfU0laRSkpOworCQkJCQkJCQkvLyBjYWxsIENvbW1hbmQgTGF5ZXIgQ2IKKwkJCQkJCQkJQXN5U2RvU2VxdUluc3RhbmNlX2cuCisJCQkJCQkJCSAgICBtX2ZwU2RvQ29tQ29uQ2IKKwkJCQkJCQkJICAgIChTZG9TZXFDb25IZGwsCisJCQkJCQkJCSAgICAga0FzeVNkb0NvblN0YXRlRnJhbWVTZW5kZWQpOworCisJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJUmV0ID0KKwkJCQkJCQkJICAgIEVwbFNkb0FzeVNlcVNlbmRJbnRlcm4KKwkJCQkJCQkJICAgIChwQXN5U2RvU2VxQ29uLAorCQkJCQkJCQkgICAgIDAsIE5VTEwsCisJCQkJCQkJCSAgICAgRkFMU0UpOworCQkJCQkJCQlpZiAoUmV0ICE9CisJCQkJCQkJCSAgICBrRXBsU3VjY2Vzc2Z1bCkKKwkJCQkJCQkJeworCQkJCQkJCQkJZ290byBFeGl0OworCQkJCQkJCQl9CisJCQkJCQkJfQorCisJCQkJCQl9IGVsc2UgeworCQkJCQkJCS8vIGVycm9yIGFjaworCQkJCQkJCS8vIHJlc2VuZCBmcmFtZXMgZnJvbSBoaXN0b3J5CisKKwkJCQkJCQkvLyByZWFkIGZyYW1lIGZyb20gaGlzdG9yeQorCQkJCQkJCVJldCA9CisJCQkJCQkJICAgIEVwbFNkb0FzeVJlYWRGcm9tSGlzdG9yeQorCQkJCQkJCSAgICAocEFzeVNkb1NlcUNvbiwKKwkJCQkJCQkgICAgICZwRXBsRnJhbWUsCisJCQkJCQkJICAgICAmdWlGcmFtZVNpemUsCisJCQkJCQkJICAgICBUUlVFKTsKKwkJCQkJCQl3aGlsZSAoKHBFcGxGcmFtZSAhPQorCQkJCQkJCQlOVUxMKQorCQkJCQkJCSAgICAgICAmJiAodWlGcmFtZVNpemUKKwkJCQkJCQkJICAgIT0gMCkpIHsKKwkJCQkJCQkJLy8gc2VuZCBmcmFtZQorCQkJCQkJCQlSZXQgPQorCQkJCQkJCQkgICAgRXBsU2RvQXN5U2VxU2VuZExvd2VyTGF5ZXIKKwkJCQkJCQkJICAgIChwQXN5U2RvU2VxQ29uLAorCQkJCQkJCQkgICAgIHVpRnJhbWVTaXplLAorCQkJCQkJCQkgICAgIHBFcGxGcmFtZSk7CisJCQkJCQkJCWlmIChSZXQgIT0KKwkJCQkJCQkJICAgIGtFcGxTdWNjZXNzZnVsKQorCQkJCQkJCQl7CisJCQkJCQkJCQlnb3RvIEV4aXQ7CisJCQkJCQkJCX0KKwkJCQkJCQkJLy8gcmVhZCBuZXh0IGZyYW1lCisKKwkJCQkJCQkJLy8gcmVhZCBmcmFtZSBmcm9tIGhpc3RvcnkKKwkJCQkJCQkJUmV0ID0KKwkJCQkJCQkJICAgIEVwbFNkb0FzeVJlYWRGcm9tSGlzdG9yeQorCQkJCQkJCQkgICAgKHBBc3lTZG9TZXFDb24sCisJCQkJCQkJCSAgICAgJnBFcGxGcmFtZSwKKwkJCQkJCQkJICAgICAmdWlGcmFtZVNpemUsCisJCQkJCQkJCSAgICAgRkFMU0UpOworCQkJCQkJCX0JLy8gZW5kIG9mIHdoaWxlKChwYWJGcmFtZSAhPSBOVUxMKQorCQkJCQkJfQorCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CS8vIGVuZCBvZiBzd2l0Y2gocFJlY0ZyYW1lX3AtPm1fbGVfYlJlY1NlcU51bUNvbiAmIEVQTF9BU1lfU0RPX0NPTl9NQVNLKQorCisJCQl9IGVsc2UgaWYgKEV2ZW50X3AgPT0ga0FzeVNkb1NlcUV2ZW50VGltZW91dCkgewkvLyBlcnJvciAtPiBDbG9zZQorCQkJCXBBc3lTZG9TZXFDb24tPm1fU2RvU3RhdGUgPSBrRXBsQXN5U2RvU3RhdGVJZGxlOworCQkJCS8vIHNldCByY29uIGFuZCBzY29uIHRvIDAKKwkJCQlwQXN5U2RvU2VxQ29uLT5tX2JTZW5kU2VxTnVtICY9CisJCQkJICAgIEVQTF9TRVFfTlVNX01BU0s7CisJCQkJcEFzeVNkb1NlcUNvbi0+bV9iUmVjU2VxTnVtICY9IEVQTF9TRVFfTlVNX01BU0s7CisJCQkJLy8gc2VuZCBmcmFtZQorCQkJCUVwbFNkb0FzeVNlcVNlbmRJbnRlcm4ocEFzeVNkb1NlcUNvbiwKKwkJCQkJCSAgICAgICAwLCBOVUxMLCBGQUxTRSk7CisKKwkJCQkvLyBjYWxsIENvbW1hbmQgTGF5ZXIgQ2IKKwkJCQlBc3lTZG9TZXF1SW5zdGFuY2VfZy4KKwkJCQkgICAgbV9mcFNkb0NvbUNvbkNiKFNkb1NlcUNvbkhkbCwKKwkJCQkJCSAgICBrQXN5U2RvQ29uU3RhdGVUaW1lb3V0KTsKKwkJCX0KKworCQkJYnJlYWs7CisJCX0KKworCQkvLyB1bmtub3duIHN0YXRlCisJZGVmYXVsdDoKKwkJeworCQkJRVBMX0RCR0xWTF9TRE9fVFJBQ0UwCisJCQkgICAgKCJFcnJvcjogVW5rbm93biBTdGF0ZSBpbiBFcGxTZG9Bc3lTZXFQcm9jZXNzXG4iKTsKKworCQl9CisJfQkJCS8vIGVuZCBvZiBzd2l0Y2gocEFzeVNkb1NlcUNvbi0+bV9TZG9TdGF0ZSkKKworICAgICAgRXhpdDoKKworI2lmIGRlZmluZWQoV0lOMzIpIHx8IGRlZmluZWQoX1dJTjMyKQorCS8vIGxlYXZlIGNyaXRpY2FsIHNlY3Rpb24gZm9yIHByb2Nlc3MgZnVuY3Rpb24KKwlMZWF2ZUNyaXRpY2FsU2VjdGlvbihBc3lTZG9TZXF1SW5zdGFuY2VfZy5tX3BDcml0aWNhbFNlY3Rpb24pOworI2VuZGlmCisJcmV0dXJuIFJldDsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxTZG9Bc3lTZXFTZW5kSW50ZXJuCisvLworLy8gRGVzY3JpcHRpb246IGludGVybiBmdW5jdGlvbiB0byBjcmVhdGUgYW5kIHNlbmQgYSBmcmFtZQorLy8gICAgICAgICAgICAgIC0+IGlmIHVpRGF0YVNpemVfcCA9PSAwIGNyZWF0ZSBhIGZyYW1lIHdpdGggaW5mb3MgZnJvbQorLy8gICAgICAgICAgICAgICAgIHBBc3lTZG9TZXFDb25fcAorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczogIHBBc3lTZG9TZXFDb25fcCA9IHBvaW50ZXIgdG8gY29udHJvbCBzdHJ1Y3R1cmUgb2YgdGhlIGNvbm5lY3Rpb24KKy8vICAgICAgICAgICAgICB1aURhdGFTaXplX3AgICAgPSBzaXplIG9mIGRhdGEgZnJhbWUgdG8gcHJvY2VzcyAoY2FuIGJlIDApCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPiB3aXRob3V0IHNpemUgb2Ygc2VxdWVuY2UgaGVhZGVyIGFuZCBBc25kIGhlYWRlciEhIQorLy8gICAgICAgICAgICAgIHBEYXRhX3AgICAgICAgICA9IHBvaW50ZXIgdG8gZnJhbWUgdG8gcHJvY2VzcyAoY2FuIGJlIE5VTEwpCisvLyAgICAgICAgICAgICAgZkZyYW1lSW5IaXN0b3J5ID0gaWYgVFJVRSBmcmFtZSBpcyBzYXZlZCB0byBoaXN0b3J5IGVsc2Ugbm90CisvLworLy8KKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCA9IGVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3RhdGljIHRFcGxLZXJuZWwgRXBsU2RvQXN5U2VxU2VuZEludGVybih0RXBsQXN5U2RvU2VxQ29uICogcEFzeVNkb1NlcUNvbl9wLAorCQkJCQkgdW5zaWduZWQgaW50IHVpRGF0YVNpemVfcCwKKwkJCQkJIHRFcGxGcmFtZSAqIHBEYXRhX3AsCisJCQkJCSBCT09MIGZGcmFtZUluSGlzdG9yeV9wKQoreworCXRFcGxLZXJuZWwgUmV0OworCUJZVEUgYWJGcmFtZVtFUExfU0VRX0ZSQU1FX1NJWkVdOworCXRFcGxGcmFtZSAqcEVwbEZyYW1lOworCXVuc2lnbmVkIGludCB1aUZyZWVFbnRyaWVzOworCisJaWYgKHBEYXRhX3AgPT0gTlVMTCkgewkvLyBzZXQgcG9pbnRlciB0byBvd24gZnJhbWUKKwkJRVBMX01FTVNFVCgmYWJGcmFtZVswXSwgMHgwMCwgc2l6ZW9mKGFiRnJhbWUpKTsKKwkJcEVwbEZyYW1lID0gKHRFcGxGcmFtZSAqKSAmIGFiRnJhbWVbMF07CisJfSBlbHNlIHsJCS8vIHNldCBwb2ludGVyIHRvIGZyYW1lIGZyb20gY2FsbGluZyBmdW5jdGlvbgorCQlwRXBsRnJhbWUgPSBwRGF0YV9wOworCX0KKworCWlmIChmRnJhbWVJbkhpc3RvcnlfcCAhPSBGQUxTRSkgeworCQkvLyBjaGVjayBpZiBvbmx5IG9uZSBmcmVlIGVudHJ5IGluIGhpc3RvcnkgYnVmZmVyCisJCXVpRnJlZUVudHJpZXMgPQorCQkgICAgRXBsU2RvQXN5R2V0RnJlZUVudHJpZXNGcm9tSGlzdG9yeShwQXN5U2RvU2VxQ29uX3ApOworCQlpZiAodWlGcmVlRW50cmllcyA9PSAxKSB7CS8vIHJlcXVlc3QgYW4gYWNrbm93bGVkZ2UgaW4gZGF0YWZyYW1lCisJCQkvLyBvd24gc2NvbiA9IDMKKwkJCXBBc3lTZG9TZXFDb25fcC0+bV9iUmVjU2VxTnVtIHw9IDB4MDM7CisJCX0KKwl9CisJLy8gZmlsbGluIGhlYWRlciBpbmZvcm1hdGlvbnMKKwkvLyBzZXQgc2VydmljZSBpZCBzZG8KKwlBbWlTZXRCeXRlVG9MZSgmcEVwbEZyYW1lLT5tX0RhdGEubV9Bc25kLm1fbGVfYlNlcnZpY2VJZCwgMHgwNSk7CisJQW1pU2V0Qnl0ZVRvTGUoJnBFcGxGcmFtZS0+bV9EYXRhLm1fQXNuZC5tX1BheWxvYWQubV9TZG9TZXF1ZW5jZUZyYW1lLgorCQkgICAgICAgbV9sZV9hYlJlc2VydmVkLCAweDAwKTsKKwkvLyBzZXQgcmVjZWl2ZSBzZXF1ZW5jZSBudW1iZXIgYW5kIHJjb24KKwlBbWlTZXRCeXRlVG9MZSgmcEVwbEZyYW1lLT5tX0RhdGEubV9Bc25kLm1fUGF5bG9hZC5tX1Nkb1NlcXVlbmNlRnJhbWUuCisJCSAgICAgICBtX2xlX2JSZWNTZXFOdW1Db24sIHBBc3lTZG9TZXFDb25fcC0+bV9iU2VuZFNlcU51bSk7CisJLy8gc2V0IHNlbmQgc2VxdWVuY2UgbnVtYmVyIGFuZCBzY29uCisJQW1pU2V0Qnl0ZVRvTGUoJnBFcGxGcmFtZS0+bV9EYXRhLm1fQXNuZC5tX1BheWxvYWQubV9TZG9TZXF1ZW5jZUZyYW1lLgorCQkgICAgICAgbV9sZV9iU2VuZFNlcU51bUNvbiwgcEFzeVNkb1NlcUNvbl9wLT5tX2JSZWNTZXFOdW0pOworCisJLy8gYWRkIHNpemUKKwl1aURhdGFTaXplX3AgKz0gRVBMX1NFUV9IRUFERVJfU0laRTsKKworCS8vIGZvcndhcmQgZnJhbWUgdG8gYXBwcm9wcmlhdGUgbG93ZXIgbGF5ZXIKKwlSZXQgPSBFcGxTZG9Bc3lTZXFTZW5kTG93ZXJMYXllcihwQXN5U2RvU2VxQ29uX3AsIHVpRGF0YVNpemVfcCwgcEVwbEZyYW1lKTsJLy8gcG9pbnRlciB0byBmcmFtZQorCisJLy8gY2hlY2sgaWYgYWxsIGFsbHJpZ2h0CisJaWYgKChSZXQgPT0ga0VwbFN1Y2Nlc3NmdWwpCisJICAgICYmIChmRnJhbWVJbkhpc3RvcnlfcCAhPSBGQUxTRSkpIHsKKwkJLy8gc2V0IG93biBzY29uIHRvIDIgaWYgbmVlZGVkCisJCWlmICgocEFzeVNkb1NlcUNvbl9wLT5tX2JSZWNTZXFOdW0gJiAweDAzKSA9PSAweDAzKSB7CisJCQlwQXN5U2RvU2VxQ29uX3AtPm1fYlJlY1NlcU51bS0tOworCQl9CisJCS8vIHNhdmUgZnJhbWUgdG8gaGlzdG9yeQorCQlSZXQgPSBFcGxTZG9Bc3lBZGRGcmFtZVRvSGlzdG9yeShwQXN5U2RvU2VxQ29uX3AsCisJCQkJCQkgcEVwbEZyYW1lLCB1aURhdGFTaXplX3ApOworCQlpZiAoUmV0ID09IGtFcGxTZG9TZXFOb0ZyZWVIaXN0b3J5KSB7CS8vIHJlcXVlc3QgQWNrIG5lZWRlZAorCQkJUmV0ID0ga0VwbFNkb1NlcVJlcXVlc3RBY2tOZWVkZWQ7CisJCX0KKworCX0KKworCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbFNkb0FzeVNlcVNlbmRMb3dlckxheWVyCisvLworLy8gRGVzY3JpcHRpb246IGludGVybiBmdW5jdGlvbiB0byBzZW5kIGEgcHJldmlvdXNseSBjcmVhdGVkIGZyYW1lIHRvIGxvd2VyIGxheWVyCisvLworLy8gUGFyYW1ldGVyczogIHBBc3lTZG9TZXFDb25fcCA9IHBvaW50ZXIgdG8gY29udHJvbCBzdHJ1Y3R1cmUgb2YgdGhlIGNvbm5lY3Rpb24KKy8vICAgICAgICAgICAgICB1aURhdGFTaXplX3AgICAgPSBzaXplIG9mIGRhdGEgZnJhbWUgdG8gcHJvY2VzcyAoY2FuIGJlIDApCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPiB3aXRob3V0IHNpemUgb2YgQXNuZCBoZWFkZXIhISEKKy8vICAgICAgICAgICAgICBwRGF0YV9wICAgICAgICAgPSBwb2ludGVyIHRvIGZyYW1lIHRvIHByb2Nlc3MgKGNhbiBiZSBOVUxMKQorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsID0gZXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdGF0aWMgdEVwbEtlcm5lbCBFcGxTZG9Bc3lTZXFTZW5kTG93ZXJMYXllcih0RXBsQXN5U2RvU2VxQ29uICogcEFzeVNkb1NlcUNvbl9wLAorCQkJCQkgICAgIHVuc2lnbmVkIGludCB1aURhdGFTaXplX3AsCisJCQkJCSAgICAgdEVwbEZyYW1lICogcEVwbEZyYW1lX3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisKKwkvLyBjYWxsIHNlbmQtZnVuY3Rpb24KKwkvLyBjaGVjayBoYW5kbGUgZm9yIFVEUCBvciBBc25kCisJaWYgKChwQXN5U2RvU2VxQ29uX3AtPm1fQ29uSGFuZGxlICYgRVBMX1NET19BU1lfSEFORExFX01BU0spID09IEVQTF9TRE9fVURQX0hBTkRMRSkgewkvLyBzZW5kIG92ZXIgVURQCisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1NET19VRFApKSAhPSAwKQorCQlSZXQgPSBFcGxTZG9VZHB1U2VuZERhdGEocEFzeVNkb1NlcUNvbl9wLT5tX0NvbkhhbmRsZSwgcEVwbEZyYW1lX3AsCS8vIHBvaW50ZXIgdG8gZnJhbWUKKwkJCQkJIHVpRGF0YVNpemVfcCk7CisjZWxzZQorCQlSZXQgPSBrRXBsU2RvU2VxVW5zdXBwb3J0ZWRQcm90OworI2VuZGlmCisKKwl9IGVsc2UgaWYgKChwQXN5U2RvU2VxQ29uX3AtPm1fQ29uSGFuZGxlICYgRVBMX1NET19BU1lfSEFORExFX01BU0spID09IEVQTF9TRE9fQVNORF9IQU5ETEUpIHsJLy8gQVNORAorI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9TRE9fQVNORCkpICE9IDApCisJCVJldCA9IEVwbFNkb0FzbmR1U2VuZERhdGEocEFzeVNkb1NlcUNvbl9wLT5tX0NvbkhhbmRsZSwgcEVwbEZyYW1lX3AsCS8vIHBvaW50ZXIgdG8gZnJhbWUKKwkJCQkJICB1aURhdGFTaXplX3ApOworI2Vsc2UKKwkJUmV0ID0ga0VwbFNkb1NlcVVuc3VwcG9ydGVkUHJvdDsKKyNlbmRpZgorCX0gZWxzZSB7CQkvLyBlcnJvcgorCQlSZXQgPSBrRXBsU2RvU2VxSW52YWxpZEhkbDsKKwl9CisKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICAgICAgRXBsU2RvQXN5UmVjZWl2ZUNiCisvLworLy8gRGVzY3JpcHRpb246ICAgICBjYWxsYmFjay1mdW5jdGlvbiBmb3IgcmVjZWl2ZWQgZnJhbWVzIGZyb20gbG93ZXIgbGF5ZXIKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6ICAgICAgQ29uSGRsX3AgICAgICAgID0gaGFuZGxlIG9mIHRoZSBjb25uZWN0aW9uCisvLyAgICAgICAgICAgICAgICAgIHBTZG9TZXFEYXRhX3AgICA9IHBvaW50ZXIgdG8gZnJhbWUKKy8vICAgICAgICAgICAgICAgICAgdWlEYXRhU2l6ZV9wICAgID0gc2l6ZSBvZiBmcmFtZQorLy8KKy8vCisvLyBSZXR1cm5zOiAgICAgICAgIHRFcGxLZXJuZWwgPSBlcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3RFcGxLZXJuZWwgUFVCTElDIEVwbFNkb0FzeVJlY2VpdmVDYih0RXBsU2RvQ29uSGRsIENvbkhkbF9wLAorCQkJCSAgICAgdEVwbEFzeVNkb1NlcSAqIHBTZG9TZXFEYXRhX3AsCisJCQkJICAgICB1bnNpZ25lZCBpbnQgdWlEYXRhU2l6ZV9wKQoreworCXRFcGxLZXJuZWwgUmV0OworCXVuc2lnbmVkIGludCB1aUNvdW50ID0gMDsKKwl1bnNpZ25lZCBpbnQgdWlGcmVlRW50cnkgPSBFUExfTUFYX1NET19TRVFfQ09OOworCXRFcGxBc3lTZG9TZXFDb24gKnBBc3lTZG9TZXFDb247CisKKyNpZiBkZWZpbmVkKFdJTjMyKSB8fCBkZWZpbmVkKF9XSU4zMikKKwkvLyBlbnRlciAgY3JpdGljYWwgc2VjdGlvbgorCUVudGVyQ3JpdGljYWxTZWN0aW9uKEFzeVNkb1NlcXVJbnN0YW5jZV9nLm1fcENyaXRpY2FsU2VjdGlvblJlY2VpdmUpOworI2VuZGlmCisKKwlFUExfREJHTFZMX1NET19UUkFDRTIoIkhhbmRsZTogMHgleCAsIEZpcnN0IERhdGFieXRlIDB4JXhcbiIsIENvbkhkbF9wLAorCQkJICAgICAgKChCWVRFICopIHBTZG9TZXFEYXRhX3ApWzBdKTsKKworCS8vIHNlYXJjaCBjb250cm9sbCBzdHJ1Y3R1cmUgZm9yIHRoaXMgY29ubmVjdGlvbgorCXBBc3lTZG9TZXFDb24gPSAmQXN5U2RvU2VxdUluc3RhbmNlX2cubV9Bc3lTZG9Db25uZWN0aW9uW3VpQ291bnRdOworCXdoaWxlICh1aUNvdW50IDwgRVBMX01BWF9TRE9fU0VRX0NPTikgeworCQlpZiAocEFzeVNkb1NlcUNvbi0+bV9Db25IYW5kbGUgPT0gQ29uSGRsX3ApIHsKKwkJCWJyZWFrOworCQl9IGVsc2UgaWYgKChwQXN5U2RvU2VxQ29uLT5tX0NvbkhhbmRsZSA9PSAwKQorCQkJICAgJiYgKHVpRnJlZUVudHJ5ID09IEVQTF9NQVhfU0RPX1NFUV9DT04pKSB7CisJCQkvLyBmcmVlIGVudHJ5CisJCQl1aUZyZWVFbnRyeSA9IHVpQ291bnQ7CisJCX0KKwkJdWlDb3VudCsrOworCQlwQXN5U2RvU2VxQ29uKys7CisJfQorCisJaWYgKHVpQ291bnQgPT0gRVBMX01BWF9TRE9fU0VRX0NPTikgewkvLyBuZXcgY29ubmVjdGlvbgorCQlpZiAodWlGcmVlRW50cnkgPT0gRVBMX01BWF9TRE9fU0VRX0NPTikgeworCQkJUmV0ID0ga0VwbFNkb1NlcU5vRnJlZUhhbmRsZTsKKwkJCWdvdG8gRXhpdDsKKwkJfSBlbHNlIHsKKwkJCXBBc3lTZG9TZXFDb24gPQorCQkJICAgICZBc3lTZG9TZXF1SW5zdGFuY2VfZy4KKwkJCSAgICBtX0FzeVNkb0Nvbm5lY3Rpb25bdWlGcmVlRW50cnldOworCQkJLy8gc2F2ZSBoYW5kbGUgZnJvbSBsb3dlciBsYXllcgorCQkJcEFzeVNkb1NlcUNvbi0+bV9Db25IYW5kbGUgPSBDb25IZGxfcDsKKwkJCS8vIGluY3JlbWVudCB1c2UgY291bnRlcgorCQkJcEFzeVNkb1NlcUNvbi0+bV91aVVzZUNvdW50Kys7CisJCQl1aUNvdW50ID0gdWlGcmVlRW50cnk7CisJCX0KKwl9CisJLy8gY2FsbCBoaXN0b3J5IGFjayBmdW5jdGlvbgorCVJldCA9IEVwbFNkb0FzeUFja0ZyYW1lVG9IaXN0b3J5KHBBc3lTZG9TZXFDb24sCisJCQkJCSAoQW1pR2V0Qnl0ZUZyb21MZQorCQkJCQkgICgmcFNkb1NlcURhdGFfcC0+CisJCQkJCSAgIG1fbGVfYlJlY1NlcU51bUNvbikgJgorCQkJCQkgIEVQTF9TRVFfTlVNX01BU0spKTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCWdvdG8gRXhpdDsKKwl9CisjaWYgZGVmaW5lZChXSU4zMikgfHwgZGVmaW5lZChfV0lOMzIpCisJLy8gbGVhdmUgY3JpdGljYWwgc2VjdGlvbgorCUxlYXZlQ3JpdGljYWxTZWN0aW9uKEFzeVNkb1NlcXVJbnN0YW5jZV9nLm1fcENyaXRpY2FsU2VjdGlvblJlY2VpdmUpOworI2VuZGlmCisKKwkvLyBjYWxsIHByb2Nlc3MgZnVuY3Rpb24gd2l0aCBwb2ludGVyIG9mIGZyYW1lIGFuZCBldmVudCBrQXN5U2RvU2VxRXZlbnRGcmFtZVJlYworCVJldCA9IEVwbFNkb0FzeVNlcVByb2Nlc3ModWlDb3VudCwKKwkJCQkgIHVpRGF0YVNpemVfcCwKKwkJCQkgIE5VTEwsIHBTZG9TZXFEYXRhX3AsIGtBc3lTZG9TZXFFdmVudEZyYW1lUmVjKTsKKworICAgICAgRXhpdDoKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICAgICAgRXBsU2RvQXN5SW5pdEhpc3RvcnkKKy8vCisvLyBEZXNjcmlwdGlvbjogICAgIGludGkgZnVuY3Rpb24gZm9yIGhpc3RvcnkgYnVmZmVyCisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOgorLy8KKy8vCisvLyBSZXR1cm5zOiAgICAgICAgIHRFcGxLZXJuZWwgPSBlcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N0YXRpYyB0RXBsS2VybmVsIEVwbFNkb0FzeUluaXRIaXN0b3J5KHZvaWQpCit7CisJdEVwbEtlcm5lbCBSZXQ7CisJdW5zaWduZWQgaW50IHVpQ291bnQ7CisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwkvLyBpbml0IG1fYkZyZWVFbnRyaWVzIGluIGhpc3RvcnktYnVmZmVyCisJZm9yICh1aUNvdW50ID0gMDsgdWlDb3VudCA8IEVQTF9NQVhfU0RPX1NFUV9DT047IHVpQ291bnQrKykgeworCQlBc3lTZG9TZXF1SW5zdGFuY2VfZy5tX0FzeVNkb0Nvbm5lY3Rpb25bdWlDb3VudF0uCisJCSAgICBtX1Nkb0Nvbkhpc3RvcnkubV9iRnJlZUVudHJpZXMgPSBFUExfU0RPX0hJU1RPUllfU0laRTsKKwl9CisKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICAgICAgRXBsU2RvQXN5QWRkRnJhbWVUb0hpc3RvcnkKKy8vCisvLyBEZXNjcmlwdGlvbjogICAgIGZ1bmN0aW9uIHRvIGFkZCBhIGZyYW1lIHRvIHRoZSBoaXN0b3J5IGJ1ZmZlcgorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczogICAgICBwQXN5U2RvU2VxQ29uX3AgPSBwb2ludGVyIHRvIGNvbnRyb2wgc3RydWN0dXJlIG9mIHRoaXMgY29ubmVjdGlvbgorLy8gICAgICAgICAgICAgICAgICBwRnJhbWVfcCAgICAgICAgPSBwb2ludGVyIHRvIGZyYW1lCisvLyAgICAgICAgICAgICAgICAgIHVpU2l6ZV9wICAgICAgICA9IHNpemUgb2YgdGhlIGZyYW1lCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPiB3aXRob3V0IHNpemUgb2YgdGhlIGV0aGVybmV0IGhlYWRlcgorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHRoZSBhc25kIGhlYWRlcgorLy8KKy8vIFJldHVybnM6ICAgICAgICAgdEVwbEtlcm5lbCA9IGVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3RhdGljIHRFcGxLZXJuZWwgRXBsU2RvQXN5QWRkRnJhbWVUb0hpc3RvcnkodEVwbEFzeVNkb1NlcUNvbiAqIHBBc3lTZG9TZXFDb25fcCwKKwkJCQkJICAgICB0RXBsRnJhbWUgKiBwRnJhbWVfcCwKKwkJCQkJICAgICB1bnNpZ25lZCBpbnQgdWlTaXplX3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisJdEVwbEFzeVNkb0Nvbkhpc3RvcnkgKnBIaXN0b3J5OworCisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwkvLyBhZGQgZnJhbWUgdG8gaGlzdG9yeSBidWZmZXIKKworCS8vIGNoZWNrIHNpemUKKwkvLyAkJCQgZC5rLiBFUExfU0VRX0hJU1RPUllfRlJBTUVfU0laRSBpbmNsdWRlcyB0aGUgaGVhZGVyIHNpemUsIGJ1dCB1aVNpemVfcCBkb2VzIG5vdCEhIQorCWlmICh1aVNpemVfcCA+IEVQTF9TRVFfSElTVFJPWV9GUkFNRV9TSVpFKSB7CisJCVJldCA9IGtFcGxTZG9TZXFGcmFtZVNpemVFcnJvcjsKKwkJZ290byBFeGl0OworCX0KKwkvLyBzYXZlIHBvaW50ZXIgdG8gaGlzdG9yeQorCXBIaXN0b3J5ID0gJnBBc3lTZG9TZXFDb25fcC0+bV9TZG9Db25IaXN0b3J5OworCisJLy8gY2hlY2sgaWYgYSBmcmVlIGVudHJ5IGlzIGF2YWlsYWJsZQorCWlmIChwSGlzdG9yeS0+bV9iRnJlZUVudHJpZXMgPiAwKSB7CS8vIHdyaXRlIG1lc3NhZ2UgaW4gZnJlZSBlbnRyeQorCQlFUExfTUVNQ1BZKCYKKwkJCSAgICgodEVwbEZyYW1lICopIHBIaXN0b3J5LT4KKwkJCSAgICBtX2FhYkhpc3RvcnlGcmFtZVtwSGlzdG9yeS0+bV9iV3JpdGVdKS0+CisJCQkgICBtX2xlX2JNZXNzYWdlVHlwZSwgJnBGcmFtZV9wLT5tX2xlX2JNZXNzYWdlVHlwZSwKKwkJCSAgIHVpU2l6ZV9wICsgRVBMX0FTTkRfSEVBREVSX1NJWkUpOworCQkvLyBzdG9yZSBzaXplCisJCXBIaXN0b3J5LT5tX2F1aUZyYW1lU2l6ZVtwSGlzdG9yeS0+bV9iV3JpdGVdID0gdWlTaXplX3A7CisKKwkJLy8gZGVjcmVtZW5kIG51bWJlciBvZiBmcmVlIGJ1ZmZlcmVudHJpZXMKKwkJcEhpc3RvcnktPm1fYkZyZWVFbnRyaWVzLS07CisKKwkJLy8gaW5jcmVtZW50IHdyaXRlaW5kZXgKKwkJcEhpc3RvcnktPm1fYldyaXRlKys7CisKKwkJLy8gY2hlY2sgaWYgd3JpdGUtaW5kZXggcnVuIG92ZXIgYXJyYXktYm9hcmRlcgorCQlpZiAocEhpc3RvcnktPm1fYldyaXRlID09IEVQTF9TRE9fSElTVE9SWV9TSVpFKSB7CisJCQlwSGlzdG9yeS0+bV9iV3JpdGUgPSAwOworCQl9CisKKwl9IGVsc2UgewkJLy8gbm8gZnJlZSBlbnRyeQorCQlSZXQgPSBrRXBsU2RvU2VxTm9GcmVlSGlzdG9yeTsKKwl9CisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgICAgIEVwbFNkb0FzeUFja0ZyYW1lVG9IaXN0b3J5CisvLworLy8gRGVzY3JpcHRpb246ICAgICBmdW5jdGlvbiB0byBkZWxldGUgYWNrbm93bGVkZ2VkIGZyYW1lcyBmcm9uIGhpc3RvcnkgYnVmZmVyCisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOiAgICAgIHBBc3lTZG9TZXFDb25fcCA9IHBvaW50ZXIgdG8gY29udHJvbCBzdHJ1Y3R1cmUgb2YgdGhpcyBjb25uZWN0aW9uCisvLyAgICAgICAgICAgICAgICAgIGJSZWNTZXFOdW1iZXJfcCA9IHJlY2VpdmUgc2VxdWVuY2UgbnVtYmVyIG9mIHRoZSByZWNlaXZlZCBmcmFtZQorLy8KKy8vCisvLyBSZXR1cm5zOiAgICAgICAgIHRFcGxLZXJuZWwgPSBlcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N0YXRpYyB0RXBsS2VybmVsIEVwbFNkb0FzeUFja0ZyYW1lVG9IaXN0b3J5KHRFcGxBc3lTZG9TZXFDb24gKiBwQXN5U2RvU2VxQ29uX3AsCisJCQkJCSAgICAgQllURSBiUmVjU2VxTnVtYmVyX3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisJdEVwbEFzeVNkb0Nvbkhpc3RvcnkgKnBIaXN0b3J5OworCUJZVEUgYkFja0luZGV4OworCUJZVEUgYkN1cnJlbnRTZXFOdW07CisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCS8vIGdldCBwb2ludGVyIHRvIGhpc3RvcnkgYnVmZmVyCisJcEhpc3RvcnkgPSAmcEFzeVNkb1NlcUNvbl9wLT5tX1Nkb0Nvbkhpc3Rvcnk7CisKKwkvLyByZWxlYXNlIGFsbCBhY2tub3dsZWRnZWQgZnJhbWVzIGZyb20gaGlzdG9yeSBidWZmZXIKKworCS8vIGNoZWNrIGlmIHRoZXJlIGFyZSBlbnRyaWVzIGluIGhpc3RvcnkKKwlpZiAocEhpc3RvcnktPm1fYkZyZWVFbnRyaWVzIDwgRVBMX1NET19ISVNUT1JZX1NJWkUpIHsKKwkJYkFja0luZGV4ID0gcEhpc3RvcnktPm1fYkFjazsKKwkJZG8geworCQkJYkN1cnJlbnRTZXFOdW0gPQorCQkJICAgICgoKHRFcGxGcmFtZSAqKSBwSGlzdG9yeS0+CisJCQkgICAgICBtX2FhYkhpc3RvcnlGcmFtZVtiQWNrSW5kZXhdKS0+bV9EYXRhLm1fQXNuZC4KKwkJCSAgICAgbV9QYXlsb2FkLm1fU2RvU2VxdWVuY2VGcmFtZS4KKwkJCSAgICAgbV9sZV9iU2VuZFNlcU51bUNvbiAmIEVQTF9TRVFfTlVNX01BU0spOworCQkJaWYgKCgoYlJlY1NlcU51bWJlcl9wIC0KKwkJCSAgICAgIGJDdXJyZW50U2VxTnVtKSAmIEVQTF9TRVFfTlVNX01BU0spCisJCQkgICAgPCBFUExfU0VRX05VTV9USFJFU0hPTEQpIHsKKwkJCQlwSGlzdG9yeS0+bV9hdWlGcmFtZVNpemVbYkFja0luZGV4XSA9IDA7CisJCQkJYkFja0luZGV4Kys7CisJCQkJcEhpc3RvcnktPm1fYkZyZWVFbnRyaWVzKys7CisJCQkJaWYgKGJBY2tJbmRleCA9PSBFUExfU0RPX0hJU1RPUllfU0laRSkgewkvLyByZWFkIGluZGV4IHJ1biBvdmVyIGFycmF5LWJvYXJkZXIKKwkJCQkJYkFja0luZGV4ID0gMDsKKwkJCQl9CisJCQl9IGVsc2UgewkvLyBub3RoaW5nIHRvIGRvIGFueW1vcmUsCisJCQkJLy8gYmVjYXVzZSBhbnkgZnVydGhlciBmcmFtZSBpbiBoaXN0b3J5IGhhcyBsYXJnZXIgc2VxdWVuY2UKKwkJCQkvLyBudW1iZXIgdGhhbiB0aGUgYWNrbm93bGVkZ2UKKwkJCQlnb3RvIEV4aXQ7CisJCQl9CisJCX0KKwkJd2hpbGUgKCgoKGJSZWNTZXFOdW1iZXJfcCAtIDEgLQorCQkJICBiQ3VycmVudFNlcU51bSkgJiBFUExfU0VRX05VTV9NQVNLKQorCQkJPCBFUExfU0VRX05VTV9USFJFU0hPTEQpCisJCSAgICAgICAmJiAocEhpc3RvcnktPm1fYldyaXRlICE9IGJBY2tJbmRleCkpOworCisJCS8vIHN0b3JlIGxvY2FsIHJlYWQtaW5kZXggdG8gZ2xvYmFsIHZhcgorCQlwSGlzdG9yeS0+bV9iQWNrID0gYkFja0luZGV4OworCX0KKworICAgICAgRXhpdDoKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICAgICAgRXBsU2RvQXN5UmVhZEZyb21IaXN0b3J5CisvLworLy8gRGVzY3JpcHRpb246ICAgICBmdW5jdGlvbiB0byBvbmUgZnJhbWUgZnJvbSBoaXN0b3J5CisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOiAgICAgIHBBc3lTZG9TZXFDb25fcCA9IHBvaW50ZXIgdG8gY29udHJvbCBzdHJ1Y3R1cmUgb2YgdGhpcyBjb25uZWN0aW9uCisvLyAgICAgICAgICAgICAgICAgIHBwRnJhbWVfcCAgICAgICA9IHBvaW50ZXIgdG8gcG9pbnRlciB0byB0aGUgYnVmZmVyIG9mIHRoZSBzdG9yZWQgZnJhbWUKKy8vICAgICAgICAgICAgICAgICAgcHVpU2l6ZV9wICAgICAgID0gT1VUOiBzaXplIG9mIHRoZSBmcmFtZQorLy8gICAgICAgICAgICAgICAgICBmSW5pdFJlYWQgICAgICAgPSBib29sIHdoaWNoIGluZGljYXRlIGEgc3RhcnQgb2YgcmV0cmFuc21pc3Npb24KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPiByZXR1cm4gbGFzdCBub3QgYWNrbm93bGVkZ2VkIG1lc3NhZ2UgaWYgVFJVRQorLy8KKy8vCisvLyBSZXR1cm5zOiAgICAgICAgIHRFcGxLZXJuZWwgPSBlcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N0YXRpYyB0RXBsS2VybmVsIEVwbFNkb0FzeVJlYWRGcm9tSGlzdG9yeSh0RXBsQXN5U2RvU2VxQ29uICogcEFzeVNkb1NlcUNvbl9wLAorCQkJCQkgICB0RXBsRnJhbWUgKiogcHBGcmFtZV9wLAorCQkJCQkgICB1bnNpZ25lZCBpbnQgKnB1aVNpemVfcCwKKwkJCQkJICAgQk9PTCBmSW5pdFJlYWRfcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKwl0RXBsQXN5U2RvQ29uSGlzdG9yeSAqcEhpc3Rvcnk7CisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCS8vIHJlYWQgb25lIG1lc3NhZ2UgZnJvbSBIaXN0b3J5CisKKwkvLyBnZXQgcG9pbnRlciB0byBoaXN0b3J5IGJ1ZmZlcgorCXBIaXN0b3J5ID0gJnBBc3lTZG9TZXFDb25fcC0+bV9TZG9Db25IaXN0b3J5OworCisJLy8gY2hlY2sgaWYgaW5pdAorCWlmIChmSW5pdFJlYWRfcCAhPSBGQUxTRSkgewkvLyBpbml0aWFsaXplIHJlYWQgaW5kZXggdG8gdGhlIGluZGV4IHdoaWNoIHNoYWxsIGJlIGFja25vd2xlZGdlZCBuZXh0CisJCXBIaXN0b3J5LT5tX2JSZWFkID0gcEhpc3RvcnktPm1fYkFjazsKKwl9CisJLy8gY2hlY2sgaWYgZW50cmllcyBhcmUgYXZhaWxhYmxlIGZvciByZWFkaW5nCisJaWYgKChwSGlzdG9yeS0+bV9iRnJlZUVudHJpZXMgPCBFUExfU0RPX0hJU1RPUllfU0laRSkKKwkgICAgJiYgKHBIaXN0b3J5LT5tX2JXcml0ZSAhPSBwSGlzdG9yeS0+bV9iUmVhZCkpIHsKKy8vICAgICAgICBQUklOVEY0KCJFcGxTZG9Bc3lSZWFkRnJvbUhpc3RvcnkoKTogaW5pdCA9ICVkLCByZWFkID0gJXUsIHdyaXRlID0gJXUsIGFjayA9ICV1IiwgKGludCkgZkluaXRSZWFkX3AsIChXT1JEKXBIaXN0b3J5LT5tX2JSZWFkLCAoV09SRClwSGlzdG9yeS0+bV9iV3JpdGUsIChXT1JEKXBIaXN0b3J5LT5tX2JBY2spOworLy8gICAgICAgIFBSSU5URjIoIiwgZnJlZSBlbnRyaWVzID0gJXUsIG5leHQgZnJhbWUgc2l6ZSA9ICV1XG4iLCAoV09SRClwSGlzdG9yeS0+bV9iRnJlZUVudHJpZXMsIHBIaXN0b3J5LT5tX2F1aUZyYW1lU2l6ZVtwSGlzdG9yeS0+bV9iUmVhZF0pOworCisJCS8vIHJldHVybiBwb2ludGVyIHRvIHN0b3JlZCBmcmFtZQorCQkqcHBGcmFtZV9wID0KKwkJICAgICh0RXBsRnJhbWUgKikgcEhpc3RvcnktPm1fYWFiSGlzdG9yeUZyYW1lW3BIaXN0b3J5LT4KKwkJCQkJCQkgICAgICBtX2JSZWFkXTsKKworCQkvLyBzYXZlIHNpemUKKwkJKnB1aVNpemVfcCA9IHBIaXN0b3J5LT5tX2F1aUZyYW1lU2l6ZVtwSGlzdG9yeS0+bV9iUmVhZF07CisKKwkJcEhpc3RvcnktPm1fYlJlYWQrKzsKKwkJaWYgKHBIaXN0b3J5LT5tX2JSZWFkID09IEVQTF9TRE9fSElTVE9SWV9TSVpFKSB7CisJCQlwSGlzdG9yeS0+bV9iUmVhZCA9IDA7CisJCX0KKworCX0gZWxzZSB7CisvLyAgICAgICAgUFJJTlRGMygiRXBsU2RvQXN5UmVhZEZyb21IaXN0b3J5KCk6IHJlYWQgPSAldSwgYWNrID0gJXUsIGZyZWUgZW50cmllcyA9ICV1LCBubyBmcmFtZVxuIiwgKFdPUkQpcEhpc3RvcnktPm1fYlJlYWQsIChXT1JEKXBIaXN0b3J5LT5tX2JBY2ssIChXT1JEKXBIaXN0b3J5LT5tX2JGcmVlRW50cmllcyk7CisKKwkJLy8gbm8gbW9yZSBmcmFtZXMgdG8gc2VuZAorCQkvLyByZXR1cm4gbnVsbCBwb2ludGVyCisJCSpwcEZyYW1lX3AgPSBOVUxMOworCisJCSpwdWlTaXplX3AgPSAwOworCX0KKworCXJldHVybiBSZXQ7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgICAgIEVwbFNkb0FzeUdldEZyZWVFbnRyaWVzRnJvbUhpc3RvcnkKKy8vCisvLyBEZXNjcmlwdGlvbjogICAgIGZ1bmN0aW9uIHJldHVybnMgdGhlIG51bWJlciBvZiBmcmVlIGhpc3Ryb3kgZW50cmllcworLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczogICAgICBwQXN5U2RvU2VxQ29uX3AgPSBwb2ludGVyIHRvIGNvbnRyb2wgc3RydWN0dXJlIG9mIHRoaXMgY29ubmVjdGlvbgorLy8KKy8vCisvLyBSZXR1cm5zOiAgICAgICAgIHVuc2lnbmVkIGludCAgICA9IG51bWJlciBvZiBmcmVlIGVudHJpZXMKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N0YXRpYyB1bnNpZ25lZCBpbnQgRXBsU2RvQXN5R2V0RnJlZUVudHJpZXNGcm9tSGlzdG9yeSh0RXBsQXN5U2RvU2VxQ29uICoKKwkJCQkJCSAgICAgICBwQXN5U2RvU2VxQ29uX3ApCit7CisJdW5zaWduZWQgaW50IHVpRnJlZUVudHJpZXM7CisKKwl1aUZyZWVFbnRyaWVzID0KKwkgICAgKHVuc2lnbmVkIGludClwQXN5U2RvU2VxQ29uX3AtPm1fU2RvQ29uSGlzdG9yeS5tX2JGcmVlRW50cmllczsKKworCXJldHVybiB1aUZyZWVFbnRyaWVzOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICAgICAgRXBsU2RvQXN5U2VxU2V0VGltZXIKKy8vCisvLyBEZXNjcmlwdGlvbjogICAgIGZ1bmN0aW9uIHNldHMgb3IgbW9kaWZ5IHRpbWVyIGluIHRpbWVybW9zdWxlCisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOiAgICAgIHBBc3lTZG9TZXFDb25fcCA9IHBvaW50ZXIgdG8gY29udHJvbCBzdHJ1Y3R1cmUgb2YgdGhpcyBjb25uZWN0aW9uCisvLyAgICAgICAgICAgICAgICAgIHVsVGltZW91dCAgICAgICA9IHRpbWVvdXQgaW4gbXMKKy8vCisvLworLy8gUmV0dXJuczogICAgICAgICB1bnNpZ25lZCBpbnQgICAgPSBudW1iZXIgb2YgZnJlZSBlbnRyaWVzCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdGF0aWMgdEVwbEtlcm5lbCBFcGxTZG9Bc3lTZXFTZXRUaW1lcih0RXBsQXN5U2RvU2VxQ29uICogcEFzeVNkb1NlcUNvbl9wLAorCQkJCSAgICAgICB1bnNpZ25lZCBsb25nIHVsVGltZW91dCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKwl0RXBsVGltZXJBcmcgVGltZXJBcmc7CisKKwlUaW1lckFyZy5tX0V2ZW50U2luayA9IGtFcGxFdmVudFNpbmtTZG9Bc3lTZXE7CisJVGltZXJBcmcubV91bEFyZyA9ICh1bnNpZ25lZCBsb25nKXBBc3lTZG9TZXFDb25fcDsKKworCWlmIChwQXN5U2RvU2VxQ29uX3AtPm1fRXBsVGltZXJIZGwgPT0gMCkgewkvLyBjcmVhdGUgbmV3IHRpbWVyCisJCVJldCA9IEVwbFRpbWVydVNldFRpbWVyTXMoJnBBc3lTZG9TZXFDb25fcC0+bV9FcGxUaW1lckhkbCwKKwkJCQkJICB1bFRpbWVvdXQsIFRpbWVyQXJnKTsKKwl9IGVsc2UgewkJLy8gbW9kaWZ5IGV4aXNpdGluZyB0aW1lcgorCQlSZXQgPSBFcGxUaW1lcnVNb2RpZnlUaW1lck1zKCZwQXN5U2RvU2VxQ29uX3AtPm1fRXBsVGltZXJIZGwsCisJCQkJCSAgICAgdWxUaW1lb3V0LCBUaW1lckFyZyk7CisKKwl9CisKKwlyZXR1cm4gUmV0OworfQorCisvLyBFT0YKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsU2RvQ29tdS5jIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxTZG9Db211LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2UwZWIzMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsU2RvQ29tdS5jCkBAIC0wLDAgKzEsMzM0NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIHNvdXJjZSBmaWxlIGZvciBTRE8gQ29tbWFuZCBMYXllciBtb2R1bGUKKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgICAgICAgICRSQ1NmaWxlOiBFcGxTZG9Db211LmMsdiAkCisKKyAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAorCisgICAgICAgICAgICAgICAgJFJldmlzaW9uOiAxLjE0ICQgICREYXRlOiAyMDA4LzEwLzE3IDE1OjMyOjMyICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorICAgICAgICAgICAgICAgICAgICBHQ0MgVjMuNAorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgIDIwMDYvMDYvMjYgay50LjogICBzdGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgInVzZXIvRXBsU2RvQ29tdS5oIgorCisjaWYgKCgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfU0RPUykpID09IDApICYmXAorICAgICAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1NET0MpKSA9PSAwKSAgICkKKworI2Vycm9yICdFUlJPUjogQXQgbGVhc3QgU0RPIFNlcnZlciBvciBTRE8gQ2xpZW50IHNob3VsZCBiZSBhY3RpdmF0ZSEnCisKKyNlbmRpZgorCisjaWYgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9TRE9TKSkgIT0gMCkKKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX09CRFUpKSA9PSAwKSAmJiAoRVBMX09CRF9VU0VfS0VSTkVMID09IEZBTFNFKQorCisjZXJyb3IgJ0VSUk9SOiBTRE8gU2VydmVyIG5lZWRzIE9CRHUgbW9kdWxlIScKKworI2VuZGlmCisKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICBHIEwgTyBCIEEgTCAgIEQgRSBGIEkgTiBJIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmbmRlZiBFUExfTUFYX1NET19DT01fQ09OCisjZGVmaW5lIEVQTF9NQVhfU0RPX0NPTV9DT04gICAgICAgICA1CisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvY2FsIHR5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBpbnRlcm4gZXZlbnRzCit0eXBlZGVmIGVudW0geworCWtFcGxTZG9Db21Db25FdmVudFNlbmRGaXJzdCA9IDB4MDAsCS8vIGZpcnN0IGZyYW1lIHRvIHNlbmQKKwlrRXBsU2RvQ29tQ29uRXZlbnRSZWMgPSAweDAxLAkvLyBmcmFtZSByZWNlaXZlZAorCWtFcGxTZG9Db21Db25FdmVudENvbkVzdGFibGlzaGVkID0gMHgwMiwJLy8gY29ubmVjdGlvbiBlc3RhYmxpc2hlZAorCWtFcGxTZG9Db21Db25FdmVudENvbkNsb3NlZCA9IDB4MDMsCS8vIGNvbm5lY3Rpb24gY2xvc2VkCisJa0VwbFNkb0NvbUNvbkV2ZW50QWNrUmVjZWl2ZWQgPSAweDA0LAkvLyBhY2tub3dsZWRnZSByZWNlaXZlZCBieSBsb3dlciBsYXllcgorCS8vIC0+IGNvbnRpbnVlIHNlbmRpbmcKKwlrRXBsU2RvQ29tQ29uRXZlbnRGcmFtZVNlbmRlZCA9IDB4MDUsCS8vIGxvd2VyIGhhcyBzZW5kIGEgZnJhbWUKKwlrRXBsU2RvQ29tQ29uRXZlbnRJbml0RXJyb3IgPSAweDA2LAkvLyBlcnJvciBkdXJpbmdpbml0aWFsaXNpYXRpb24KKwkvLyBvZiB0aGUgY29ubmVjdGlvbgorCWtFcGxTZG9Db21Db25FdmVudFRpbWVvdXQgPSAweDA3CS8vIHRpbWVvdXQgaW4gbG93ZXIgbGF5ZXIKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfU0RPQykpICE9IDApCisJICAgICwKKworCWtFcGxTZG9Db21Db25FdmVudEluaXRDb24gPSAweDA4LAkvLyBpbml0IGNvbm5lY3Rpb24gKG9ubHkgY2xpZW50KQorCWtFcGxTZG9Db21Db25FdmVudEFib3J0ID0gMHgwOQkvLyBhYm9ydCBzZG8gdHJhbnNmZXIgKG9ubHkgY2xpZW50KQorI2VuZGlmCit9IHRFcGxTZG9Db21Db25FdmVudDsKKwordHlwZWRlZiBlbnVtIHsKKwlrRXBsU2RvQ29tU2VuZFR5cGVSZXEgPSAweDAwLAkvLyBzZW5kIGEgcmVxdWVzdAorCWtFcGxTZG9Db21TZW5kVHlwZUFja1JlcyA9IDB4MDEsCS8vIHNlbmQgYSByZXNvbnNlIHdpdGhvdXQgZGF0YQorCWtFcGxTZG9Db21TZW5kVHlwZVJlcyA9IDB4MDIsCS8vIHNlbmQgcmVzcG9uc2Ugd2l0aCBkYXRhCisJa0VwbFNkb0NvbVNlbmRUeXBlQWJvcnQgPSAweDAzCS8vIHNlbmQgYWJvcnQKK30gdEVwbFNkb0NvbVNlbmRUeXBlOworCisvLyBzdGF0ZSBvZiB0aGUgc3RhdGUgbWFzY2hpbmUKK3R5cGVkZWYgZW51bSB7CisJLy8gR2VuZXJhbCBTdGF0ZQorCWtFcGxTZG9Db21TdGF0ZUlkbGUgPSAweDAwLAkvLyBpZGxlIHN0YXRlCisKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfU0RPUykpICE9IDApCisJLy8gU2VydmVyIFN0YXRlcworCWtFcGxTZG9Db21TdGF0ZVNlcnZlclNlZ21UcmFucyA9IDB4MDEsCS8vIHNlbmQgZm9sbG93aW5nIGZyYW1lcworI2VuZGlmCisKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfU0RPQykpICE9IDApCisJLy8gQ2xpZW50IFN0YXRlcworCWtFcGxTZG9Db21TdGF0ZUNsaWVudFdhaXRJbml0ID0gMHgxMCwJLy8gd2FpdCBmb3IgaW5pdCBjb25uZWN0aW9uCisJLy8gb24gbG93ZXIgbGF5ZXIKKwlrRXBsU2RvQ29tU3RhdGVDbGllbnRDb25uZWN0ZWQgPSAweDExLAkvLyBjb25uZWN0aW9uIGVzdGFibGlzaGVkCisJa0VwbFNkb0NvbVN0YXRlQ2xpZW50U2VnbVRyYW5zID0gMHgxMgkvLyBzZW5kIGZvbGxvd2luZyBmcmFtZXMKKyNlbmRpZgorfSB0RXBsU2RvQ29tU3RhdGU7CisKKy8vIGNvbnRyb2wgc3RydWN0dXJlIGZvciB0cmFuc2FjdGlvbgordHlwZWRlZiBzdHJ1Y3QgeworCXRFcGxTZG9TZXFDb25IZGwgbV9TZG9TZXFDb25IZGw7CS8vIGlmICE9IDAgLT4gZW50cnkgdXNlZAorCXRFcGxTZG9Db21TdGF0ZSBtX1Nkb0NvbVN0YXRlOworCUJZVEUgbV9iVHJhbnNhY3Rpb25JZDsKKwl1bnNpZ25lZCBpbnQgbV91aU5vZGVJZDsJLy8gTm9kZUlkIG9mIHRoZSB0YXJnZXQKKwkvLyAtPiBuZWVkZWQgdG8gcmVpbml0IGNvbm5lY3Rpb24KKwkvLyAgICBhZnRlciB0aW1lb3V0CisJdEVwbFNkb1RyYW5zVHlwZSBtX1Nkb1RyYW5zVHlwZTsJLy8gQXV0bywgRXhwZWRpdGVkLCBTZWdtZW50ZWQKKwl0RXBsU2RvU2VydmljZVR5cGUgbV9TZG9TZXJ2aWNlVHlwZTsJLy8gV3JpdGVCeUluZGV4LCBSZWFkQnlJbmRleAorCXRFcGxTZG9UeXBlIG1fU2RvUHJvdFR5cGU7CS8vIHByb3RvY29sIGxheWVyOiBBdXRvLCBVZHAsIEFzbmQsIFBkbworCUJZVEUgKm1fcERhdGE7CQkvLyBwb2ludGVyIHRvIGRhdGEKKwl1bnNpZ25lZCBpbnQgbV91aVRyYW5zU2l6ZTsJLy8gbnVtYmVyIG9mIGJ5dGVzCisJLy8gdG8gdHJhbnNmZXIKKwl1bnNpZ25lZCBpbnQgbV91aVRyYW5zZmVycmVkQnl0ZTsJLy8gbnVtYmVyIG9mIGJ5dGVzCisJLy8gYWxyZWFkeSB0cmFuc2ZlcnJlZAorCXRFcGxTZG9GaW5pc2hlZENiIG1fcGZuVHJhbnNmZXJGaW5pc2hlZDsJLy8gY2FsbGJhY2sgZnVuY3Rpb24gb2YgdGhlCisJLy8gYXBwbGljYXRpb24KKwkvLyAtPiBjYWxsZWQgaW4gdGhlIGVuZCBvZgorCS8vICAgIHRoZSBTRE8gdHJhbnNmZXIKKwl2b2lkICptX3BVc2VyQXJnOwkvLyB1c2VyIGRlZmluYWJsZSBhcmd1bWVudCBwb2ludGVyCisKKwlEV09SRCBtX2R3TGFzdEFib3J0Q29kZTsJLy8gc2F2ZSB0aGUgbGFzdCBhYm9ydCBjb2RlCisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1NET0MpKSAhPSAwKQorCS8vIG9ubHkgZm9yIGNsaWVudAorCXVuc2lnbmVkIGludCBtX3VpVGFyZ2V0SW5kZXg7CS8vIGluZGV4IHRvIGFjY2VzcworCXVuc2lnbmVkIGludCBtX3VpVGFyZ2V0U3ViSW5kZXg7CS8vIHN1YmlvbmRleCB0byBhY2Nlc3MKKworCS8vIGZvciBmdXR1cmUgdXNlCisJdW5zaWduZWQgaW50IG1fdWlUaW1lb3V0OwkvLyB0aW1lb3V0IGZvciB0aGlzIGNvbm5lY3Rpb24KKworI2VuZGlmCisKK30gdEVwbFNkb0NvbUNvbjsKKworLy8gaW5zdGFuY2UgdGFibGUKK3R5cGVkZWYgc3RydWN0IHsKKwl0RXBsU2RvQ29tQ29uIG1fU2RvQ29tQ29uW0VQTF9NQVhfU0RPX0NPTV9DT05dOworCisjaWYgZGVmaW5lZChXSU4zMikgfHwgZGVmaW5lZChfV0lOMzIpCisJTFBDUklUSUNBTF9TRUNUSU9OIG1fcENyaXRpY2FsU2VjdGlvbjsKKwlDUklUSUNBTF9TRUNUSU9OIG1fQ3JpdGljYWxTZWN0aW9uOworI2VuZGlmCisKK30gdEVwbFNkb0NvbUluc3RhbmNlOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbW9kdWwgZ2xvYmFsZSB2YXJzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3RhdGljIHRFcGxTZG9Db21JbnN0YW5jZSBTZG9Db21JbnN0YW5jZV9nOworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0RXBsS2VybmVsIFBVQkxJQyBFcGxTZG9Db21SZWNlaXZlQ2IodEVwbFNkb1NlcUNvbkhkbCBTZG9TZXFDb25IZGxfcCwKKwkJCQkgICAgIHRFcGxBc3lTZG9Db20gKiBwQXN5U2RvQ29tX3AsCisJCQkJICAgICB1bnNpZ25lZCBpbnQgdWlEYXRhU2l6ZV9wKTsKKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsU2RvQ29tQ29uQ2IodEVwbFNkb1NlcUNvbkhkbCBTZG9TZXFDb25IZGxfcCwKKwkJCQkgdEVwbEFzeVNkb0NvblN0YXRlIEFzeVNkb0NvblN0YXRlX3ApOworCitzdGF0aWMgdEVwbEtlcm5lbCBFcGxTZG9Db21TZWFyY2hDb25JbnRlcm4odEVwbFNkb1NlcUNvbkhkbCBTZG9TZXFDb25IZGxfcCwKKwkJCQkJICAgdEVwbFNkb0NvbUNvbkV2ZW50IFNkb0NvbUNvbkV2ZW50X3AsCisJCQkJCSAgIHRFcGxBc3lTZG9Db20gKiBwQXN5U2RvQ29tX3ApOworCitzdGF0aWMgdEVwbEtlcm5lbCBFcGxTZG9Db21Qcm9jZXNzSW50ZXJuKHRFcGxTZG9Db21Db25IZGwgU2RvQ29tQ29uX3AsCisJCQkJCSB0RXBsU2RvQ29tQ29uRXZlbnQgU2RvQ29tQ29uRXZlbnRfcCwKKwkJCQkJIHRFcGxBc3lTZG9Db20gKiBwQXN5U2RvQ29tX3ApOworCitzdGF0aWMgdEVwbEtlcm5lbCBFcGxTZG9Db21UcmFuc2ZlckZpbmlzaGVkKHRFcGxTZG9Db21Db25IZGwgU2RvQ29tQ29uX3AsCisJCQkJCSAgICB0RXBsU2RvQ29tQ29uICogcFNkb0NvbUNvbl9wLAorCQkJCQkgICAgdEVwbFNkb0NvbUNvblN0YXRlCisJCQkJCSAgICBTZG9Db21Db25TdGF0ZV9wKTsKKworI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9TRE9TKSkgIT0gMCkKK3N0YXRpYyB0RXBsS2VybmVsIEVwbFNkb0NvbVNlcnZlckluaXRSZWFkQnlJbmRleCh0RXBsU2RvQ29tQ29uICogcFNkb0NvbUNvbl9wLAorCQkJCQkJIHRFcGxBc3lTZG9Db20gKiBwQXN5U2RvQ29tX3ApOworCitzdGF0aWMgdEVwbEtlcm5lbCBFcGxTZG9Db21TZXJ2ZXJTZW5kRnJhbWVJbnRlcm4odEVwbFNkb0NvbUNvbiAqIHBTZG9Db21Db25fcCwKKwkJCQkJCSB1bnNpZ25lZCBpbnQgdWlJbmRleF9wLAorCQkJCQkJIHVuc2lnbmVkIGludCB1aVN1YkluZGV4X3AsCisJCQkJCQkgdEVwbFNkb0NvbVNlbmRUeXBlIFNlbmRUeXBlX3ApOworCitzdGF0aWMgdEVwbEtlcm5lbCBFcGxTZG9Db21TZXJ2ZXJJbml0V3JpdGVCeUluZGV4KHRFcGxTZG9Db21Db24gKiBwU2RvQ29tQ29uX3AsCisJCQkJCQkgIHRFcGxBc3lTZG9Db20gKiBwQXN5U2RvQ29tX3ApOworI2VuZGlmCisKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfU0RPQykpICE9IDApCisKK3N0YXRpYyB0RXBsS2VybmVsIEVwbFNkb0NvbUNsaWVudFNlbmQodEVwbFNkb0NvbUNvbiAqIHBTZG9Db21Db25fcCk7CisKK3N0YXRpYyB0RXBsS2VybmVsIEVwbFNkb0NvbUNsaWVudFByb2Nlc3NGcmFtZSh0RXBsU2RvQ29tQ29uSGRsIFNkb0NvbUNvbl9wLAorCQkJCQkgICAgICB0RXBsQXN5U2RvQ29tICogcEFzeVNkb0NvbV9wKTsKKworc3RhdGljIHRFcGxLZXJuZWwgRXBsU2RvQ29tQ2xpZW50U2VuZEFib3J0KHRFcGxTZG9Db21Db24gKiBwU2RvQ29tQ29uX3AsCisJCQkJCSAgIERXT1JEIGR3QWJvcnRDb2RlX3ApOworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIEMgTCBBIFMgUyAgPFNETyBDb21tYW5kIExheWVyPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvLworLy8gRGVzY3JpcHRpb246IFNETyBDb21tYW5kIGxheWVyIE1vZHVsCisvLworLy8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgUCBVIEIgTCBJIEMgICBGIFUgTiBDIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxTZG9Db21Jbml0CisvLworLy8gRGVzY3JpcHRpb246IEluaXQgZmlyc3QgaW5zdGFuY2Ugb2YgdGhlIG1vZHVsZQorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczoKKy8vCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgID0gZXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0RXBsS2VybmVsIFBVQkxJQyBFcGxTZG9Db21Jbml0KHZvaWQpCit7CisJdEVwbEtlcm5lbCBSZXQ7CisKKwlSZXQgPSBFcGxTZG9Db21BZGRJbnN0YW5jZSgpOworCisJcmV0dXJuIFJldDsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxTZG9Db21BZGRJbnN0YW5jZQorLy8KKy8vIERlc2NyaXB0aW9uOiBJbml0IGFkZGl0aW9uYWwgaW5zdGFuY2Ugb2YgdGhlIG1vZHVsZQorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczoKKy8vCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgID0gZXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0RXBsS2VybmVsIFBVQkxJQyBFcGxTZG9Db21BZGRJbnN0YW5jZSh2b2lkKQoreworCXRFcGxLZXJuZWwgUmV0OworCisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwkvLyBpbml0IGNvbnRyb2xsIHN0cnVjdHVyZQorCUVQTF9NRU1TRVQoJlNkb0NvbUluc3RhbmNlX2csIDB4MDAsIHNpemVvZihTZG9Db21JbnN0YW5jZV9nKSk7CisKKwkvLyBpbml0IGluc3RhbmNlIG9mIGxvd2VyIGxheWVyCisJUmV0ID0gRXBsU2RvQXN5U2VxQWRkSW5zdGFuY2UoRXBsU2RvQ29tUmVjZWl2ZUNiLCBFcGxTZG9Db21Db25DYik7CisJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQlnb3RvIEV4aXQ7CisJfQorI2lmIGRlZmluZWQoV0lOMzIpIHx8IGRlZmluZWQoX1dJTjMyKQorCS8vIGNyZWF0ZSBjcml0aWNhbCBzZWN0aW9uIGZvciBwcm9jZXNzIGZ1bmN0aW9uCisJU2RvQ29tSW5zdGFuY2VfZy5tX3BDcml0aWNhbFNlY3Rpb24gPQorCSAgICAmU2RvQ29tSW5zdGFuY2VfZy5tX0NyaXRpY2FsU2VjdGlvbjsKKwlJbml0aWFsaXplQ3JpdGljYWxTZWN0aW9uKFNkb0NvbUluc3RhbmNlX2cubV9wQ3JpdGljYWxTZWN0aW9uKTsKKyNlbmRpZgorCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbFNkb0NvbURlbEluc3RhbmNlCisvLworLy8gRGVzY3JpcHRpb246IGRlbGV0ZSBpbnN0YW5jZSBvZiB0aGUgbW9kdWxlCisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOgorLy8KKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgPSBlcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3RFcGxLZXJuZWwgUFVCTElDIEVwbFNkb0NvbURlbEluc3RhbmNlKHZvaWQpCit7CisJdEVwbEtlcm5lbCBSZXQ7CisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworI2lmIGRlZmluZWQoV0lOMzIpIHx8IGRlZmluZWQoX1dJTjMyKQorCS8vIGRlbGV0ZSBjcml0aWNhbCBzZWN0aW9uIGZvciBwcm9jZXNzIGZ1bmN0aW9uCisJRGVsZXRlQ3JpdGljYWxTZWN0aW9uKFNkb0NvbUluc3RhbmNlX2cubV9wQ3JpdGljYWxTZWN0aW9uKTsKKyNlbmRpZgorCisJUmV0ID0gRXBsU2RvQXN5U2VxRGVsSW5zdGFuY2UoKTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCWdvdG8gRXhpdDsKKwl9CisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsU2RvQ29tRGVmaW5lQ29uCisvLworLy8gRGVzY3JpcHRpb246IGZ1bmN0aW9uIGRlZmluZXMgYSBTRE8gY29ubmVjdGlvbiB0byBhbm90aGVyIG5vZGUKKy8vICAgICAgICAgICAgICAtPiBpbml0IGxvd2VyIGxheWVyIGFuZCByZXR1cm5zIGEgaGFuZGxlIGZvciB0aGUgY29ubmVjdGlvbi4KKy8vICAgICAgICAgICAgICBUd28gY2xpZW50IGNvbm5lY3Rpb25zIHRvIHRoZSBzYW1lIG5vZGUgdmlhIHRoZSBzYW1lIHByb3RvY29sCisvLyAgICAgICAgICAgICAgYXJlIG5vdCBhbGxvd2VkLiBJZiB0aGlzIGZ1bmN0aW9uIGRldGVjdHMgc3VjaCBhIHNpdHVhdGlvbgorLy8gICAgICAgICAgICAgIGl0IHdpbGwgcmV0dXJuIGtFcGxTZG9Db21IYW5kbGVFeGlzdHMgYW5kIHRoZSBoYW5kbGUgb2YKKy8vICAgICAgICAgICAgICB0aGUgZXhpc3RpbmcgY29ubmVjdGlvbiBpbiBwU2RvQ29tQ29uSGRsX3AuCisvLyAgICAgICAgICAgICAgVXNpbmcgb2YgZXhpc3Rpbmcgc2VydmVyIGNvbm5lY3Rpb25zIGlzIHBvc3NpYmxlLgorLy8KKy8vIFBhcmFtZXRlcnM6ICBwU2RvQ29tQ29uSGRsX3AgICAgID0gcG9pbnRlciB0byB0aGUgYnVmZmVyIG9mIHRoZSBoYW5kbGUKKy8vICAgICAgICAgICAgICB1aVRhcmdldE5vZGVJZF9wICAgID0gTm9kZUlkIG9mIHRoZSB0YXJnZXRub2RlCisvLyAgICAgICAgICAgICAgUHJvdFR5cGVfcCAgICAgICAgICA9IHR5cGUgb2YgcHJvdG9jb2wgdG8gdXNlIGZvciBjb25uZWN0aW9uCisvLworLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICA9IGVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9TRE9DKSkgIT0gMCkKK3RFcGxLZXJuZWwgUFVCTElDIEVwbFNkb0NvbURlZmluZUNvbih0RXBsU2RvQ29tQ29uSGRsICogcFNkb0NvbUNvbkhkbF9wLAorCQkJCSAgICAgdW5zaWduZWQgaW50IHVpVGFyZ2V0Tm9kZUlkX3AsCisJCQkJICAgICB0RXBsU2RvVHlwZSBQcm90VHlwZV9wKQoreworCXRFcGxLZXJuZWwgUmV0OworCXVuc2lnbmVkIGludCB1aUNvdW50OworCXVuc2lnbmVkIGludCB1aUZyZWVIZGw7CisJdEVwbFNkb0NvbUNvbiAqcFNkb0NvbUNvbjsKKworCS8vIGNoZWNrIFBhcmFtZXRlcgorCUFTU0VSVChwU2RvQ29tQ29uSGRsX3AgIT0gTlVMTCk7CisKKwkvLyBjaGVjayBOb2RlSWQKKwlpZiAoKHVpVGFyZ2V0Tm9kZUlkX3AgPT0gRVBMX0NfQURSX0lOVkFMSUQpCisJICAgIHx8ICh1aVRhcmdldE5vZGVJZF9wID49IEVQTF9DX0FEUl9CUk9BRENBU1QpKSB7CisJCVJldCA9IGtFcGxJbnZhbGlkTm9kZUlkOworCisJfQorCS8vIHNlYXJjaCBmcmVlIGNvbnRyb2wgc3RydWN0dXJlCisJcFNkb0NvbUNvbiA9ICZTZG9Db21JbnN0YW5jZV9nLm1fU2RvQ29tQ29uWzBdOworCXVpQ291bnQgPSAwOworCXVpRnJlZUhkbCA9IEVQTF9NQVhfU0RPX0NPTV9DT047CisJd2hpbGUgKHVpQ291bnQgPCBFUExfTUFYX1NET19DT01fQ09OKSB7CisJCWlmIChwU2RvQ29tQ29uLT5tX1Nkb1NlcUNvbkhkbCA9PSAwKSB7CS8vIGZyZWUgZW50cnkKKwkJCXVpRnJlZUhkbCA9IHVpQ291bnQ7CisJCX0gZWxzZSBpZiAoKHBTZG9Db21Db24tPm1fdWlOb2RlSWQgPT0gdWlUYXJnZXROb2RlSWRfcCkKKwkJCSAgICYmIChwU2RvQ29tQ29uLT5tX1Nkb1Byb3RUeXBlID09IFByb3RUeXBlX3ApKSB7CS8vIGV4aXN0aW5nIGNsaWVudCBjb25uZWN0aW9uIHdpdGggc2FtZSBub2RlIElEIGFuZCBzYW1lIHByb3RvY29sIHR5cGUKKwkJCSpwU2RvQ29tQ29uSGRsX3AgPSB1aUNvdW50OworCQkJUmV0ID0ga0VwbFNkb0NvbUhhbmRsZUV4aXN0czsKKwkJCWdvdG8gRXhpdDsKKwkJfQorCQl1aUNvdW50Kys7CisJCXBTZG9Db21Db24rKzsKKwl9CisKKwlpZiAodWlGcmVlSGRsID09IEVQTF9NQVhfU0RPX0NPTV9DT04pIHsKKwkJUmV0ID0ga0VwbFNkb0NvbU5vRnJlZUhhbmRsZTsKKwkJZ290byBFeGl0OworCX0KKworCXBTZG9Db21Db24gPSAmU2RvQ29tSW5zdGFuY2VfZy5tX1Nkb0NvbUNvblt1aUZyZWVIZGxdOworCS8vIHNhdmUgaGFuZGxlIGZvciBhcHBsaWNhdGlvbgorCSpwU2RvQ29tQ29uSGRsX3AgPSB1aUZyZWVIZGw7CisJLy8gc2F2ZSBwYXJhbWV0ZXJzCisJcFNkb0NvbUNvbi0+bV9TZG9Qcm90VHlwZSA9IFByb3RUeXBlX3A7CisJcFNkb0NvbUNvbi0+bV91aU5vZGVJZCA9IHVpVGFyZ2V0Tm9kZUlkX3A7CisKKwkvLyBzZXQgVHJhbnNhY3Rpb24gSWQKKwlwU2RvQ29tQ29uLT5tX2JUcmFuc2FjdGlvbklkID0gMDsKKworCS8vIGNoZWNrIHByb3RvY29sCisJc3dpdGNoIChQcm90VHlwZV9wKSB7CisJCS8vIHVkcAorCWNhc2Uga0VwbFNkb1R5cGVVZHA6CisJCXsKKwkJCS8vIGNhbGwgY29ubmVjdGlvbiBpbnQgZnVuY3Rpb24gb2YgbG93ZXIgbGF5ZXIKKwkJCVJldCA9IEVwbFNkb0FzeVNlcUluaXRDb24oJnBTZG9Db21Db24tPm1fU2RvU2VxQ29uSGRsLAorCQkJCQkJICBwU2RvQ29tQ29uLT5tX3VpTm9kZUlkLAorCQkJCQkJICBrRXBsU2RvVHlwZVVkcCk7CisJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQkJZ290byBFeGl0OworCQkJfQorCQkJYnJlYWs7CisJCX0KKworCQkvLyBBc2VuZAorCWNhc2Uga0VwbFNkb1R5cGVBc25kOgorCQl7CisJCQkvLyBjYWxsIGNvbm5lY3Rpb24gaW50IGZ1bmN0aW9uIG9mIGxvd2VyIGxheWVyCisJCQlSZXQgPSBFcGxTZG9Bc3lTZXFJbml0Q29uKCZwU2RvQ29tQ29uLT5tX1Nkb1NlcUNvbkhkbCwKKwkJCQkJCSAgcFNkb0NvbUNvbi0+bV91aU5vZGVJZCwKKwkJCQkJCSAga0VwbFNkb1R5cGVBc25kKTsKKwkJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCQlnb3RvIEV4aXQ7CisJCQl9CisJCQlicmVhazsKKwkJfQorCisJCS8vIFBkbyAtPiBub3Qgc3VwcG9ydGVkCisJY2FzZSBrRXBsU2RvVHlwZVBkbzoKKwlkZWZhdWx0OgorCQl7CisJCQlSZXQgPSBrRXBsU2RvQ29tVW5zdXBwb3J0ZWRQcm90OworCQkJZ290byBFeGl0OworCQl9CisJfQkJCS8vIGVuZCBvZiBzd2l0Y2gobV9Qcm90VHlwZV9wKQorCisJLy8gY2FsbCBwcm9jZXNzIGZ1bmN0aW9uCisJUmV0ID0gRXBsU2RvQ29tUHJvY2Vzc0ludGVybih1aUZyZWVIZGwsCisJCQkJICAgICBrRXBsU2RvQ29tQ29uRXZlbnRJbml0Q29uLCBOVUxMKTsKKworICAgICAgRXhpdDoKKwlyZXR1cm4gUmV0OworfQorI2VuZGlmCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxTZG9Db21Jbml0VHJhbnNmZXJCeUluZGV4CisvLworLy8gRGVzY3JpcHRpb246IGZ1bmN0aW9uIGluaXQgU0RPIFRyYW5zZmVyIGZvciBhIGRlZmluZWQgY29ubmVjdGlvbgorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczogIFNkb0NvbVRyYW5zUGFyYW1fcCAgICA9IFN0cnVjdHVyZSB3aXRoIHBhcmFtZXRlcnMgZm9yIGNvbm5lY3Rpb24KKy8vCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgID0gZXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1NET0MpKSAhPSAwKQordEVwbEtlcm5lbCBQVUJMSUMgRXBsU2RvQ29tSW5pdFRyYW5zZmVyQnlJbmRleCh0RXBsU2RvQ29tVHJhbnNQYXJhbUJ5SW5kZXggKgorCQkJCQkgICAgICAgcFNkb0NvbVRyYW5zUGFyYW1fcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKwl0RXBsU2RvQ29tQ29uICpwU2RvQ29tQ29uOworCisJLy8gY2hlY2sgcGFyYW1ldGVyCisJaWYgKChwU2RvQ29tVHJhbnNQYXJhbV9wLT5tX3VpU3ViaW5kZXggPj0gMHhGRikKKwkgICAgfHwgKHBTZG9Db21UcmFuc1BhcmFtX3AtPm1fdWlJbmRleCA9PSAwKQorCSAgICB8fCAocFNkb0NvbVRyYW5zUGFyYW1fcC0+bV91aUluZGV4ID4gMHhGRkZGKQorCSAgICB8fCAocFNkb0NvbVRyYW5zUGFyYW1fcC0+bV9wRGF0YSA9PSBOVUxMKQorCSAgICB8fCAocFNkb0NvbVRyYW5zUGFyYW1fcC0+bV91aURhdGFTaXplID09IDApKSB7CisJCVJldCA9IGtFcGxTZG9Db21JbnZhbGlkUGFyYW07CisJCWdvdG8gRXhpdDsKKwl9CisKKwlpZiAocFNkb0NvbVRyYW5zUGFyYW1fcC0+bV9TZG9Db21Db25IZGwgPj0gRVBMX01BWF9TRE9fQ09NX0NPTikgeworCQlSZXQgPSBrRXBsU2RvQ29tSW52YWxpZEhhbmRsZTsKKwkJZ290byBFeGl0OworCX0KKwkvLyBnZXQgcG9pbnRlciB0byBjb250cm9sIHN0cnVjdHVyZSBvZiBjb25uZWN0aW9uCisJcFNkb0NvbUNvbiA9CisJICAgICZTZG9Db21JbnN0YW5jZV9nLm1fU2RvQ29tQ29uW3BTZG9Db21UcmFuc1BhcmFtX3AtPm1fU2RvQ29tQ29uSGRsXTsKKworCS8vIGNoZWNrIGlmIGhhbmRsZSBvaworCWlmIChwU2RvQ29tQ29uLT5tX1Nkb1NlcUNvbkhkbCA9PSAwKSB7CisJCVJldCA9IGtFcGxTZG9Db21JbnZhbGlkSGFuZGxlOworCQlnb3RvIEV4aXQ7CisJfQorCS8vIGNoZWNrIGlmIGNvbW1hbmQgbGF5ZXIgaXMgaWRsZQorCWlmICgocFNkb0NvbUNvbi0+bV91aVRyYW5zZmVycmVkQnl0ZSArIHBTZG9Db21Db24tPm1fdWlUcmFuc1NpemUpID4gMCkgewkvLyBoYW5kbGUgaXMgbm90IGlkbGUKKwkJUmV0ID0ga0VwbFNkb0NvbUhhbmRsZUJ1c3k7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gc2F2ZSBwYXJhbWV0ZXIKKwkvLyBjYWxsYmFjayBmdW5jdGlvbiBmb3IgZW5kIG9mIHRyYW5zZmVyCisJcFNkb0NvbUNvbi0+bV9wZm5UcmFuc2ZlckZpbmlzaGVkID0KKwkgICAgcFNkb0NvbVRyYW5zUGFyYW1fcC0+bV9wZm5TZG9GaW5pc2hlZENiOworCXBTZG9Db21Db24tPm1fcFVzZXJBcmcgPSBwU2RvQ29tVHJhbnNQYXJhbV9wLT5tX3BVc2VyQXJnOworCisJLy8gc2V0IHR5cGUgb2YgU0RPIGNvbW1hbmQKKwlpZiAocFNkb0NvbVRyYW5zUGFyYW1fcC0+bV9TZG9BY2Nlc3NUeXBlID09IGtFcGxTZG9BY2Nlc3NUeXBlUmVhZCkgeworCQlwU2RvQ29tQ29uLT5tX1Nkb1NlcnZpY2VUeXBlID0ga0VwbFNkb1NlcnZpY2VSZWFkQnlJbmRleDsKKwl9IGVsc2UgeworCQlwU2RvQ29tQ29uLT5tX1Nkb1NlcnZpY2VUeXBlID0ga0VwbFNkb1NlcnZpY2VXcml0ZUJ5SW5kZXg7CisKKwl9CisJLy8gc2F2ZSBwb2ludGVyIHRvIGRhdGEKKwlwU2RvQ29tQ29uLT5tX3BEYXRhID0gcFNkb0NvbVRyYW5zUGFyYW1fcC0+bV9wRGF0YTsKKwkvLyBtYXhpbWFsIGJ5dGVzIHRvIHRyYW5zZmVyCisJcFNkb0NvbUNvbi0+bV91aVRyYW5zU2l6ZSA9IHBTZG9Db21UcmFuc1BhcmFtX3AtPm1fdWlEYXRhU2l6ZTsKKwkvLyBieXRlcyBhbHJlYWR5IHRyYW5zZmVyZWQKKwlwU2RvQ29tQ29uLT5tX3VpVHJhbnNmZXJyZWRCeXRlID0gMDsKKworCS8vIHJlc2V0IHBhcnRzIG9mIGNvbnRyb2wgc3RydWN0dXJlCisJcFNkb0NvbUNvbi0+bV9kd0xhc3RBYm9ydENvZGUgPSAwOworCXBTZG9Db21Db24tPm1fU2RvVHJhbnNUeXBlID0ga0VwbFNkb1RyYW5zQXV0bzsKKwkvLyBzYXZlIHRpbWVvdXQKKwkvL3BTZG9Db21Db24tPm1fdWlUaW1lb3V0ID0gU2RvQ29tVHJhbnNQYXJhbV9wLm1fdWlUaW1lb3V0OworCisJLy8gc2F2ZSBpbmRleCBhbmQgc3ViaW5kZXgKKwlwU2RvQ29tQ29uLT5tX3VpVGFyZ2V0SW5kZXggPSBwU2RvQ29tVHJhbnNQYXJhbV9wLT5tX3VpSW5kZXg7CisJcFNkb0NvbUNvbi0+bV91aVRhcmdldFN1YkluZGV4ID0gcFNkb0NvbVRyYW5zUGFyYW1fcC0+bV91aVN1YmluZGV4OworCisJLy8gY2FsbCBwcm9jZXNzIGZ1bmN0aW9uCisJUmV0ID0gRXBsU2RvQ29tUHJvY2Vzc0ludGVybihwU2RvQ29tVHJhbnNQYXJhbV9wLT5tX1Nkb0NvbUNvbkhkbCwga0VwbFNkb0NvbUNvbkV2ZW50U2VuZEZpcnN0LAkvLyBldmVudCB0byBzdGFydCB0cmFuc2ZlcgorCQkJCSAgICAgTlVMTCk7CisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIFJldDsKKworfQorI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbFNkb0NvbVVuZGVmaW5lQ29uCisvLworLy8gRGVzY3JpcHRpb246IGZ1bmN0aW9uIHVuZGVmaW5lIGEgU0RPIGNvbm5lY3Rpb24KKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6ICBTZG9Db21Db25IZGxfcCAgICA9IGhhbmRsZSBmb3IgdGhlIGNvbm5lY3Rpb24KKy8vCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgID0gZXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1NET0MpKSAhPSAwKQordEVwbEtlcm5lbCBQVUJMSUMgRXBsU2RvQ29tVW5kZWZpbmVDb24odEVwbFNkb0NvbUNvbkhkbCBTZG9Db21Db25IZGxfcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKwl0RXBsU2RvQ29tQ29uICpwU2RvQ29tQ29uOworCisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwlpZiAoU2RvQ29tQ29uSGRsX3AgPj0gRVBMX01BWF9TRE9fQ09NX0NPTikgeworCQlSZXQgPSBrRXBsU2RvQ29tSW52YWxpZEhhbmRsZTsKKwkJZ290byBFeGl0OworCX0KKwkvLyBnZXQgcG9pbnRlciB0byBjb250cm9sIHN0cnVjdHVyZQorCXBTZG9Db21Db24gPSAmU2RvQ29tSW5zdGFuY2VfZy5tX1Nkb0NvbUNvbltTZG9Db21Db25IZGxfcF07CisKKwkvLyAkJCQgZC5rLiBhYm9ydCBhIHJ1bm5pbmcgdHJhbnNmZXIgYmVmb3JlIGNsb3NpbmcgdGhlIHNlcXVlbmNlIGxheWVyCisKKwlpZiAoKChwU2RvQ29tQ29uLT5tX1Nkb1NlcUNvbkhkbCAmIH5FUExfU0RPX1NFUV9IQU5ETEVfTUFTSykgIT0KKwkgICAgIEVQTF9TRE9fU0VRX0lOVkFMSURfSERMKQorCSAgICAmJiAocFNkb0NvbUNvbi0+bV9TZG9TZXFDb25IZGwgIT0gMCkpIHsKKwkJLy8gY2xvc2UgY29ubmVjdGlvbiBpbiBsb3dlciBsYXllcgorCQlzd2l0Y2ggKHBTZG9Db21Db24tPm1fU2RvUHJvdFR5cGUpIHsKKwkJY2FzZSBrRXBsU2RvVHlwZUFzbmQ6CisJCWNhc2Uga0VwbFNkb1R5cGVVZHA6CisJCQl7CisJCQkJUmV0ID0KKwkJCQkgICAgRXBsU2RvQXN5U2VxRGVsQ29uKHBTZG9Db21Db24tPgorCQkJCQkJICAgICAgIG1fU2RvU2VxQ29uSGRsKTsKKwkJCQlicmVhazsKKwkJCX0KKworCQljYXNlIGtFcGxTZG9UeXBlUGRvOgorCQljYXNlIGtFcGxTZG9UeXBlQXV0bzoKKwkJZGVmYXVsdDoKKwkJCXsKKwkJCQlSZXQgPSBrRXBsU2RvQ29tVW5zdXBwb3J0ZWRQcm90OworCQkJCWdvdG8gRXhpdDsKKwkJCX0KKworCQl9CQkvLyBlbmQgb2Ygc3dpdGNoKHBTZG9Db21Db24tPm1fU2RvUHJvdFR5cGUpCisJfQorCisJLy8gY2xlYW4gY29udHJvbGwgc3RydWN0dXJlCisJRVBMX01FTVNFVChwU2RvQ29tQ29uLCAweDAwLCBzaXplb2YodEVwbFNkb0NvbUNvbikpOworICAgICAgRXhpdDoKKwlyZXR1cm4gUmV0OworfQorI2VuZGlmCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxTZG9Db21HZXRTdGF0ZQorLy8KKy8vIERlc2NyaXB0aW9uOiBmdW5jdGlvbiByZXR1cm5zIHRoZSBzdGF0ZSBmbyB0aGUgY29ubmVjdGlvbgorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczogIFNkb0NvbUNvbkhkbF9wICAgID0gaGFuZGxlIGZvciB0aGUgY29ubmVjdGlvbgorLy8gICAgICAgICAgICAgIHBTZG9Db21GaW5pc2hlZF9wID0gcG9pbnRlciB0byBzdHJ1Y3R1ciBmb3Igc2RvIHN0YXRlCisvLworLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICA9IGVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9TRE9DKSkgIT0gMCkKK3RFcGxLZXJuZWwgUFVCTElDIEVwbFNkb0NvbUdldFN0YXRlKHRFcGxTZG9Db21Db25IZGwgU2RvQ29tQ29uSGRsX3AsCisJCQkJICAgIHRFcGxTZG9Db21GaW5pc2hlZCAqIHBTZG9Db21GaW5pc2hlZF9wKQoreworCXRFcGxLZXJuZWwgUmV0OworCXRFcGxTZG9Db21Db24gKnBTZG9Db21Db247CisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCWlmIChTZG9Db21Db25IZGxfcCA+PSBFUExfTUFYX1NET19DT01fQ09OKSB7CisJCVJldCA9IGtFcGxTZG9Db21JbnZhbGlkSGFuZGxlOworCQlnb3RvIEV4aXQ7CisJfQorCS8vIGdldCBwb2ludGVyIHRvIGNvbnRyb2wgc3RydWN0dXJlCisJcFNkb0NvbUNvbiA9ICZTZG9Db21JbnN0YW5jZV9nLm1fU2RvQ29tQ29uW1Nkb0NvbUNvbkhkbF9wXTsKKworCS8vIGNoZWNrIGlmIGhhbmRsZSBvaworCWlmIChwU2RvQ29tQ29uLT5tX1Nkb1NlcUNvbkhkbCA9PSAwKSB7CisJCVJldCA9IGtFcGxTZG9Db21JbnZhbGlkSGFuZGxlOworCQlnb3RvIEV4aXQ7CisJfQorCisJcFNkb0NvbUZpbmlzaGVkX3AtPm1fcFVzZXJBcmcgPSBwU2RvQ29tQ29uLT5tX3BVc2VyQXJnOworCXBTZG9Db21GaW5pc2hlZF9wLT5tX3VpTm9kZUlkID0gcFNkb0NvbUNvbi0+bV91aU5vZGVJZDsKKwlwU2RvQ29tRmluaXNoZWRfcC0+bV91aVRhcmdldEluZGV4ID0gcFNkb0NvbUNvbi0+bV91aVRhcmdldEluZGV4OworCXBTZG9Db21GaW5pc2hlZF9wLT5tX3VpVGFyZ2V0U3ViSW5kZXggPSBwU2RvQ29tQ29uLT5tX3VpVGFyZ2V0U3ViSW5kZXg7CisJcFNkb0NvbUZpbmlzaGVkX3AtPm1fdWlUcmFuc2ZlcnJlZEJ5dGUgPQorCSAgICBwU2RvQ29tQ29uLT5tX3VpVHJhbnNmZXJyZWRCeXRlOworCXBTZG9Db21GaW5pc2hlZF9wLT5tX2R3QWJvcnRDb2RlID0gcFNkb0NvbUNvbi0+bV9kd0xhc3RBYm9ydENvZGU7CisJcFNkb0NvbUZpbmlzaGVkX3AtPm1fU2RvQ29tQ29uSGRsID0gU2RvQ29tQ29uSGRsX3A7CisJaWYgKHBTZG9Db21Db24tPm1fU2RvU2VydmljZVR5cGUgPT0ga0VwbFNkb1NlcnZpY2VXcml0ZUJ5SW5kZXgpIHsKKwkJcFNkb0NvbUZpbmlzaGVkX3AtPm1fU2RvQWNjZXNzVHlwZSA9IGtFcGxTZG9BY2Nlc3NUeXBlV3JpdGU7CisJfSBlbHNlIHsKKwkJcFNkb0NvbUZpbmlzaGVkX3AtPm1fU2RvQWNjZXNzVHlwZSA9IGtFcGxTZG9BY2Nlc3NUeXBlUmVhZDsKKwl9CisKKwlpZiAocFNkb0NvbUNvbi0+bV9kd0xhc3RBYm9ydENvZGUgIT0gMCkgewkvLyBzZG8gYWJvcnQKKwkJcFNkb0NvbUZpbmlzaGVkX3AtPm1fU2RvQ29tQ29uU3RhdGUgPQorCQkgICAga0VwbFNkb0NvbVRyYW5zZmVyUnhBYm9ydGVkOworCisJCS8vIGRlbGV0ZSBhYm9ydCBjb2RlCisJCXBTZG9Db21Db24tPm1fZHdMYXN0QWJvcnRDb2RlID0gMDsKKworCX0gZWxzZSBpZiAoKHBTZG9Db21Db24tPm1fU2RvU2VxQ29uSGRsICYgfkVQTF9TRE9fU0VRX0hBTkRMRV9NQVNLKSA9PSBFUExfU0RPX1NFUV9JTlZBTElEX0hETCkgewkvLyBjaGVjayBzdGF0ZQorCQlwU2RvQ29tRmluaXNoZWRfcC0+bV9TZG9Db21Db25TdGF0ZSA9CisJCSAgICBrRXBsU2RvQ29tVHJhbnNmZXJMb3dlckxheWVyQWJvcnQ7CisJfSBlbHNlIGlmIChwU2RvQ29tQ29uLT5tX1Nkb0NvbVN0YXRlID09IGtFcGxTZG9Db21TdGF0ZUNsaWVudFdhaXRJbml0KSB7CisJCS8vIGZpbmlzaGVkCisJCXBTZG9Db21GaW5pc2hlZF9wLT5tX1Nkb0NvbUNvblN0YXRlID0KKwkJICAgIGtFcGxTZG9Db21UcmFuc2Zlck5vdEFjdGl2ZTsKKwl9IGVsc2UgaWYgKHBTZG9Db21Db24tPm1fdWlUcmFuc1NpemUgPT0gMCkgewkvLyBmaW5pc2hlZAorCQlwU2RvQ29tRmluaXNoZWRfcC0+bV9TZG9Db21Db25TdGF0ZSA9CisJCSAgICBrRXBsU2RvQ29tVHJhbnNmZXJGaW5pc2hlZDsKKwl9CisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIFJldDsKKworfQorI2VuZGlmCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxTZG9Db21TZG9BYm9ydAorLy8KKy8vIERlc2NyaXB0aW9uOiBmdW5jdGlvbiBhYm9ydCBhIHNkbyB0cmFuc2ZlcgorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczogIFNkb0NvbUNvbkhkbF9wICAgID0gaGFuZGxlIGZvciB0aGUgY29ubmVjdGlvbgorLy8gICAgICAgICAgICAgIGR3QWJvcnRDb2RlX3AgICAgID0gYWJvcnQgY29kZQorLy8KKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgPSBlcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfU0RPQykpICE9IDApCit0RXBsS2VybmVsIFBVQkxJQyBFcGxTZG9Db21TZG9BYm9ydCh0RXBsU2RvQ29tQ29uSGRsIFNkb0NvbUNvbkhkbF9wLAorCQkJCSAgICBEV09SRCBkd0Fib3J0Q29kZV9wKQoreworCXRFcGxLZXJuZWwgUmV0OworCXRFcGxTZG9Db21Db24gKnBTZG9Db21Db247CisKKwlpZiAoU2RvQ29tQ29uSGRsX3AgPj0gRVBMX01BWF9TRE9fQ09NX0NPTikgeworCQlSZXQgPSBrRXBsU2RvQ29tSW52YWxpZEhhbmRsZTsKKwkJZ290byBFeGl0OworCX0KKwkvLyBnZXQgcG9pbnRlciB0byBjb250cm9sIHN0cnVjdHVyZSBvZiBjb25uZWN0aW9uCisJcFNkb0NvbUNvbiA9ICZTZG9Db21JbnN0YW5jZV9nLm1fU2RvQ29tQ29uW1Nkb0NvbUNvbkhkbF9wXTsKKworCS8vIGNoZWNrIGlmIGhhbmRsZSBvaworCWlmIChwU2RvQ29tQ29uLT5tX1Nkb1NlcUNvbkhkbCA9PSAwKSB7CisJCVJldCA9IGtFcGxTZG9Db21JbnZhbGlkSGFuZGxlOworCQlnb3RvIEV4aXQ7CisJfQorCS8vIHNhdmUgcG9pbnRlciB0byBhYm9ydCBjb2RlCisJcFNkb0NvbUNvbi0+bV9wRGF0YSA9IChCWVRFICopICYgZHdBYm9ydENvZGVfcDsKKworCVJldCA9IEVwbFNkb0NvbVByb2Nlc3NJbnRlcm4oU2RvQ29tQ29uSGRsX3AsCisJCQkJICAgICBrRXBsU2RvQ29tQ29uRXZlbnRBYm9ydCwKKwkJCQkgICAgICh0RXBsQXN5U2RvQ29tICopIE5VTEwpOworCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7Cit9CisjZW5kaWYKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICBQIFIgSSBWIEEgVCBFICAgRiBVIE4gQyBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgICAgICBFcGxTZG9Db21SZWNlaXZlQ2IKKy8vCisvLyBEZXNjcmlwdGlvbjogICAgIGNhbGxiYWNrIGZ1bmN0aW9uIGZvciBTRE8gU2VxdWVuY2UgTGF5ZXIKKy8vICAgICAgICAgICAgICAgICAgLT4gaW5kaWNhdGVzIG5ldyBkYXRhCisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOiAgICAgIFNkb1NlcUNvbkhkbF9wID0gSGFuZGxlIGZvciBjb25uZWN0aW9uCisvLyAgICAgICAgICAgICAgICAgIHBBc3lTZG9Db21fcCAgID0gcG9pbnRlciB0byBkYXRhCisvLyAgICAgICAgICAgICAgICAgIHVpRGF0YVNpemVfcCAgID0gc2l6ZSBvZiBkYXRhICgkJCQgbm90IHVzZWQgeWV0LCBidXQgaXQgc2hvdWxkKQorLy8KKy8vCisvLyBSZXR1cm5zOgorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordEVwbEtlcm5lbCBQVUJMSUMgRXBsU2RvQ29tUmVjZWl2ZUNiKHRFcGxTZG9TZXFDb25IZGwgU2RvU2VxQ29uSGRsX3AsCisJCQkJICAgICB0RXBsQXN5U2RvQ29tICogcEFzeVNkb0NvbV9wLAorCQkJCSAgICAgdW5zaWduZWQgaW50IHVpRGF0YVNpemVfcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKworCS8vIHNlYXJjaCBjb25uZWN0aW9uIGludGVybmFsbHkKKwlSZXQgPSBFcGxTZG9Db21TZWFyY2hDb25JbnRlcm4oU2RvU2VxQ29uSGRsX3AsCisJCQkJICAgICAgIGtFcGxTZG9Db21Db25FdmVudFJlYywgcEFzeVNkb0NvbV9wKTsKKworCUVQTF9EQkdMVkxfU0RPX1RSQUNFMworCSAgICAoIkVwbFNkb0NvbVJlY2VpdmVDYiBTZG9TZXFDb25IZGw6IDB4JVgsIEZpcnN0IEJ5dGUgb2YgcEFzeVNkb0NvbV9wOiAweCUwMlgsIHVpRGF0YVNpemVfcDogMHglMDRYXG4iLAorCSAgICAgU2RvU2VxQ29uSGRsX3AsIChXT1JEKSBwQXN5U2RvQ29tX3AtPm1fbGVfYWJDb21tYW5kRGF0YVswXSwKKwkgICAgIHVpRGF0YVNpemVfcCk7CisKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICAgICAgRXBsU2RvQ29tQ29uQ2IKKy8vCisvLyBEZXNjcmlwdGlvbjogICAgIGNhbGxiYWNrIGZ1bmN0aW9uIGNhbGxlZCBieSBTRE8gU2VxdWVuY2UgTGF5ZXIgdG8gaW5mb3JtCisvLyAgICAgICAgICAgICAgICAgIGNvbW1hbmQgbGF5ZXIgYWJvdXQgc3RhdGUgY2hhbmdlIG9mIGNvbm5lY3Rpb24KKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6ICAgICAgU2RvU2VxQ29uSGRsX3AgICAgICA9IEhhbmRsZSBvZiB0aGUgY29ubmVjdGlvbgorLy8gICAgICAgICAgICAgICAgICBBc3lTZG9Db25TdGF0ZV9wICAgID0gRXZlbnQgb2YgdGhlIGNvbm5lY3Rpb24KKy8vCisvLworLy8gUmV0dXJuczogICAgICAgICB0RXBsS2VybmVsICA9IEVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordEVwbEtlcm5lbCBQVUJMSUMgRXBsU2RvQ29tQ29uQ2IodEVwbFNkb1NlcUNvbkhkbCBTZG9TZXFDb25IZGxfcCwKKwkJCQkgdEVwbEFzeVNkb0NvblN0YXRlIEFzeVNkb0NvblN0YXRlX3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisJdEVwbFNkb0NvbUNvbkV2ZW50IFNkb0NvbUNvbkV2ZW50ID0ga0VwbFNkb0NvbUNvbkV2ZW50U2VuZEZpcnN0OworCisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwkvLyBjaGVjayBzdGF0ZQorCXN3aXRjaCAoQXN5U2RvQ29uU3RhdGVfcCkgeworCWNhc2Uga0FzeVNkb0NvblN0YXRlQ29ubmVjdGVkOgorCQl7CisJCQlFUExfREJHTFZMX1NET19UUkFDRTAoIkNvbm5lY3Rpb24gZXN0YWJsaXNoZWRcbiIpOworCQkJU2RvQ29tQ29uRXZlbnQgPSBrRXBsU2RvQ29tQ29uRXZlbnRDb25Fc3RhYmxpc2hlZDsKKwkJCS8vIHN0YXJ0IHRyYW5zbWlzc2lvbiBpZiBuZWVkZWQKKwkJCWJyZWFrOworCQl9CisKKwljYXNlIGtBc3lTZG9Db25TdGF0ZUluaXRFcnJvcjoKKwkJeworCQkJRVBMX0RCR0xWTF9TRE9fVFJBQ0UwKCJFcnJvciBkdXJpbmcgaW5pdGlhbGlzYXRpb25cbiIpOworCQkJU2RvQ29tQ29uRXZlbnQgPSBrRXBsU2RvQ29tQ29uRXZlbnRJbml0RXJyb3I7CisJCQkvLyBpbmZvcm0gYXBwIGFib3V0IGVycm9yIGFuZCBjbG9zZSBzZXF1ZW5jZSBsYXllciBoYW5kbGUKKwkJCWJyZWFrOworCQl9CisKKwljYXNlIGtBc3lTZG9Db25TdGF0ZUNvbkNsb3NlZDoKKwkJeworCQkJRVBMX0RCR0xWTF9TRE9fVFJBQ0UwKCJDb25uZWN0aW9uIGNsb3NlZFxuIik7CisJCQlTZG9Db21Db25FdmVudCA9IGtFcGxTZG9Db21Db25FdmVudENvbkNsb3NlZDsKKwkJCS8vIGNsb3NlIHNlcXVlbmNlIGxheWVyIGhhbmRsZQorCQkJYnJlYWs7CisJCX0KKworCWNhc2Uga0FzeVNkb0NvblN0YXRlQWNrUmVjZWl2ZWQ6CisJCXsKKwkJCUVQTF9EQkdMVkxfU0RPX1RSQUNFMCgiQWNrbm93bGFnZSByZWNlaXZlZFxuIik7CisJCQlTZG9Db21Db25FdmVudCA9IGtFcGxTZG9Db21Db25FdmVudEFja1JlY2VpdmVkOworCQkJLy8gY29udGludWUgdHJhbnNtaXNzaW9uCisJCQlicmVhazsKKwkJfQorCisJY2FzZSBrQXN5U2RvQ29uU3RhdGVGcmFtZVNlbmRlZDoKKwkJeworCQkJRVBMX0RCR0xWTF9TRE9fVFJBQ0UwKCJPbmUgRnJhbWUgc2VudFxuIik7CisJCQlTZG9Db21Db25FdmVudCA9IGtFcGxTZG9Db21Db25FdmVudEZyYW1lU2VuZGVkOworCQkJLy8gdG8gY29udGludWUgdHJhbnNtaXNzaW9uCisJCQlicmVhazsKKworCQl9CisKKwljYXNlIGtBc3lTZG9Db25TdGF0ZVRpbWVvdXQ6CisJCXsKKwkJCUVQTF9EQkdMVkxfU0RPX1RSQUNFMCgiVGltZW91dFxuIik7CisJCQlTZG9Db21Db25FdmVudCA9IGtFcGxTZG9Db21Db25FdmVudFRpbWVvdXQ7CisJCQkvLyBjbG9zZSBzZXF1ZW5jZSBsYXllciBoYW5kbGUKKwkJCWJyZWFrOworCisJCX0KKwl9CQkJLy8gZW5kIG9mIHN3aXRjaChBc3lTZG9Db25TdGF0ZV9wKQorCisJUmV0ID0gRXBsU2RvQ29tU2VhcmNoQ29uSW50ZXJuKFNkb1NlcUNvbkhkbF9wLAorCQkJCSAgICAgICBTZG9Db21Db25FdmVudCwgKHRFcGxBc3lTZG9Db20gKikgTlVMTCk7CisKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICAgICAgRXBsU2RvQ29tU2VhcmNoQ29uSW50ZXJuCisvLworLy8gRGVzY3JpcHRpb246ICAgICBzZWFyY2ggYSBTZG8gU2VxdWVuY2UgTGF5ZXIgY29ubmVjdGlvbiBoYW5kbGUgaW4gdGhlCisvLyAgICAgICAgICAgICAgICAgIGNvbnRyb2wgc3RydWN0dXJlIG9mIHRoZSBDb21tYW5kIExheWVyCisvLworLy8gUGFyYW1ldGVyczogICAgICBTZG9TZXFDb25IZGxfcCAgICAgPSBIYW5kbGUgdG8gc2VhcmNoCisvLyAgICAgICAgICAgICAgICAgIFNkb0NvbUNvbkV2ZW50X3AgPSBldmVudCB0byBwcm9jZXNzCisvLyAgICAgICAgICAgICAgICAgIHBBc3lTZG9Db21fcCAgICAgPSBwb2ludGVyIHRvIHJlY2VpdmVkIGZyYW1lCisvLworLy8gUmV0dXJuczogICAgICAgICB0RXBsS2VybmVsCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdGF0aWMgdEVwbEtlcm5lbCBFcGxTZG9Db21TZWFyY2hDb25JbnRlcm4odEVwbFNkb1NlcUNvbkhkbCBTZG9TZXFDb25IZGxfcCwKKwkJCQkJICAgdEVwbFNkb0NvbUNvbkV2ZW50IFNkb0NvbUNvbkV2ZW50X3AsCisJCQkJCSAgIHRFcGxBc3lTZG9Db20gKiBwQXN5U2RvQ29tX3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisJdEVwbFNkb0NvbUNvbiAqcFNkb0NvbUNvbjsKKwl0RXBsU2RvQ29tQ29uSGRsIEhkbENvdW50OworCXRFcGxTZG9Db21Db25IZGwgSGRsRnJlZTsKKworCVJldCA9IGtFcGxTZG9Db21Ob3RSZXNwb25zaWJsZTsKKworCS8vIGdldCBwb2ludGVyIHRvIGZpcnN0IGVsZW1lbnQgb2YgdGhlIGFycmF5CisJcFNkb0NvbUNvbiA9ICZTZG9Db21JbnN0YW5jZV9nLm1fU2RvQ29tQ29uWzBdOworCUhkbENvdW50ID0gMDsKKwlIZGxGcmVlID0gMHhGRkZGOworCXdoaWxlIChIZGxDb3VudCA8IEVQTF9NQVhfU0RPX0NPTV9DT04pIHsKKwkJaWYgKHBTZG9Db21Db24tPm1fU2RvU2VxQ29uSGRsID09IFNkb1NlcUNvbkhkbF9wKSB7CS8vIG1hdGNoaW5nIGNvbW1hbmQgbGF5ZXIgaGFuZGxlIGZvdW5kCisJCQlSZXQgPSBFcGxTZG9Db21Qcm9jZXNzSW50ZXJuKEhkbENvdW50LAorCQkJCQkJICAgICBTZG9Db21Db25FdmVudF9wLAorCQkJCQkJICAgICBwQXN5U2RvQ29tX3ApOworCQl9IGVsc2UgaWYgKChwU2RvQ29tQ29uLT5tX1Nkb1NlcUNvbkhkbCA9PSAwKQorCQkJICAgJiYgKEhkbEZyZWUgPT0gMHhGRkZGKSkgeworCQkJSGRsRnJlZSA9IEhkbENvdW50OworCQl9CisKKwkJcFNkb0NvbUNvbisrOworCQlIZGxDb3VudCsrOworCX0KKworCWlmIChSZXQgPT0ga0VwbFNkb0NvbU5vdFJlc3BvbnNpYmxlKSB7CS8vIG5vIHJlc3BvbnNpYmxlIGNvbW1hbmQgbGF5ZXIgaGFuZGxlIGZvdW5kCisJCWlmIChIZGxGcmVlID09IDB4RkZGRikgewkvLyBubyBmcmVlIGhhbmRsZQorCQkJLy8gZGVsZXRlIGNvbm5lY3Rpb24gaW1tZWRpYXRlbHkKKwkJCS8vIDIwMDgvMDQvMTQgbS51Li9kLmsuIFRoaXMgY29ubmVjdGlvbiBhY3R1YWxseSBkb2VzIG5vdCBleGlzdC4KKwkJCS8vICAgICAgICAgICAgICAgICAgICAgIHBTZG9Db21Db24gaXMgaW52YWxpZC4KKwkJCS8vIFJldCA9IEVwbFNkb0FzeVNlcURlbENvbihwU2RvQ29tQ29uLT5tX1Nkb1NlcUNvbkhkbCk7CisJCQlSZXQgPSBrRXBsU2RvQ29tTm9GcmVlSGFuZGxlOworCQl9IGVsc2UgewkvLyBjcmVhdGUgbmV3IGhhbmRsZQorCQkJSGRsQ291bnQgPSBIZGxGcmVlOworCQkJcFNkb0NvbUNvbiA9ICZTZG9Db21JbnN0YW5jZV9nLm1fU2RvQ29tQ29uW0hkbENvdW50XTsKKwkJCXBTZG9Db21Db24tPm1fU2RvU2VxQ29uSGRsID0gU2RvU2VxQ29uSGRsX3A7CisJCQlSZXQgPSBFcGxTZG9Db21Qcm9jZXNzSW50ZXJuKEhkbENvdW50LAorCQkJCQkJICAgICBTZG9Db21Db25FdmVudF9wLAorCQkJCQkJICAgICBwQXN5U2RvQ29tX3ApOworCQl9CisJfQorCisJcmV0dXJuIFJldDsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICAgICAgRXBsU2RvQ29tUHJvY2Vzc0ludGVybgorLy8KKy8vIERlc2NyaXB0aW9uOiAgICAgc2VhcmNoIGEgU2RvIFNlcXVlbmNlIExheWVyIGNvbm5lY3Rpb24gaGFuZGxlIGluIHRoZQorLy8gICAgICAgICAgICAgICAgICBjb250cm9sIHN0cnVjdGVyIG9mIHRoZSBDb21tYW5kIExheWVyCisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOiAgICAgIFNkb0NvbUNvbl9wICAgICA9IGluZGV4IG9mIGNvbnRyb2wgc3RydWN0dXJlIG9mIGNvbm5lY3Rpb24KKy8vICAgICAgICAgICAgICAgICAgU2RvQ29tQ29uRXZlbnRfcCA9IGV2ZW50IHRvIHByb2Nlc3MKKy8vICAgICAgICAgICAgICAgICAgcEFzeVNkb0NvbV9wICAgICA9IHBvaW50ZXIgdG8gcmVjZWl2ZWQgZnJhbWUKKy8vCisvLyBSZXR1cm5zOiAgICAgICAgIHRFcGxLZXJuZWwgID0gIGVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3RhdGljIHRFcGxLZXJuZWwgRXBsU2RvQ29tUHJvY2Vzc0ludGVybih0RXBsU2RvQ29tQ29uSGRsIFNkb0NvbUNvbl9wLAorCQkJCQkgdEVwbFNkb0NvbUNvbkV2ZW50IFNkb0NvbUNvbkV2ZW50X3AsCisJCQkJCSB0RXBsQXN5U2RvQ29tICogcEFzeVNkb0NvbV9wKQoreworCXRFcGxLZXJuZWwgUmV0OworCXRFcGxTZG9Db21Db24gKnBTZG9Db21Db247CisJQllURSBiRmxhZzsKKworI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9TRE9TKSkgIT0gMCkKKwlEV09SRCBkd0Fib3J0Q29kZTsKKwl1bnNpZ25lZCBpbnQgdWlTaXplOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKFdJTjMyKSB8fCBkZWZpbmVkKF9XSU4zMikKKwkvLyBlbnRlciAgY3JpdGljYWwgc2VjdGlvbiBmb3IgcHJvY2VzcyBmdW5jdGlvbgorCUVudGVyQ3JpdGljYWxTZWN0aW9uKFNkb0NvbUluc3RhbmNlX2cubV9wQ3JpdGljYWxTZWN0aW9uKTsKKwlFUExfREJHTFZMX1NET19UUkFDRTAKKwkgICAgKCJcblx0RW50ZXJDaXRpY2FsU2VjdGlvbiBFcGxTZG9Db21Qcm9jZXNzSW50ZXJuXG5cbiIpOworI2VuZGlmCisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCS8vIGdldCBwb2ludGVyIHRvIGNvbnRyb2wgc3RydWN0dXJlCisJcFNkb0NvbUNvbiA9ICZTZG9Db21JbnN0YW5jZV9nLm1fU2RvQ29tQ29uW1Nkb0NvbUNvbl9wXTsKKworCS8vIHByb2Nlc3Mgc3RhdGUgbWFzY2hpbmUKKwlzd2l0Y2ggKHBTZG9Db21Db24tPm1fU2RvQ29tU3RhdGUpIHsKKwkJLy8gaWRsZSBzdGF0ZQorCWNhc2Uga0VwbFNkb0NvbVN0YXRlSWRsZToKKwkJeworCQkJLy8gY2hlY2sgZXZlbnRzCisJCQlzd2l0Y2ggKFNkb0NvbUNvbkV2ZW50X3ApIHsKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfU0RPQykpICE9IDApCisJCQkJLy8gaW5pdCBjb24gZm9yIGNsaWVudAorCQkJY2FzZSBrRXBsU2RvQ29tQ29uRXZlbnRJbml0Q29uOgorCQkJCXsKKworCQkJCQkvLyBjYWxsIG9mIHRoZSBpbml0IGZ1bmN0aW9uIGFscmVhZHkKKwkJCQkJLy8gcHJvY2Vzc2VkIGluIEVwbFNkb0NvbURlZmluZUNvbigpCisJCQkJCS8vIG9ubHkgY2hhbmdlIHN0YXRlIHRvIGtFcGxTZG9Db21TdGF0ZUNsaWVudFdhaXRJbml0CisJCQkJCXBTZG9Db21Db24tPm1fU2RvQ29tU3RhdGUgPQorCQkJCQkgICAga0VwbFNkb0NvbVN0YXRlQ2xpZW50V2FpdEluaXQ7CisJCQkJCWJyZWFrOworCQkJCX0KKyNlbmRpZgorCisJCQkJLy8gaW50IGNvbiBmb3Igc2VydmVyCisJCQljYXNlIGtFcGxTZG9Db21Db25FdmVudFJlYzoKKwkJCQl7CisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1NET1MpKSAhPSAwKQorCQkJCQkvLyBjaGVjayBpZiBpbml0IG9mIGFuIHRyYW5zZmVyIGFuZCBubyBTRE8gYWJvcnQKKwkJCQkJaWYgKChwQXN5U2RvQ29tX3AtPm1fbGVfYkZsYWdzICYgMHg4MCkgPT0gMCkgewkvLyBTRE8gcmVxdWVzdAorCQkJCQkJaWYgKChwQXN5U2RvQ29tX3AtPm1fbGVfYkZsYWdzICYgMHg0MCkgPT0gMCkgewkvLyBubyBTRE8gYWJvcnQKKwkJCQkJCQkvLyBzYXZlIHRhbnNhY3Rpb24gaWQKKwkJCQkJCQlwU2RvQ29tQ29uLT4KKwkJCQkJCQkgICAgbV9iVHJhbnNhY3Rpb25JZCA9CisJCQkJCQkJICAgIEFtaUdldEJ5dGVGcm9tTGUKKwkJCQkJCQkgICAgKCZwQXN5U2RvQ29tX3AtPgorCQkJCQkJCSAgICAgbV9sZV9iVHJhbnNhY3Rpb25JZCk7CisJCQkJCQkJLy8gY2hlY2sgY29tbWFuZAorCQkJCQkJCXN3aXRjaCAocEFzeVNkb0NvbV9wLT4KKwkJCQkJCQkJbV9sZV9iQ29tbWFuZElkKQorCQkJCQkJCXsKKwkJCQkJCQljYXNlIGtFcGxTZG9TZXJ2aWNlTklMOgorCQkJCQkJCQl7CS8vIHNpbXBseSBhY2tub3dsZWdkZSBOSUwgY29tbWFuZCBvbiBzZXF1ZW5jZSBsYXllcgorCisJCQkJCQkJCQlSZXQgPQorCQkJCQkJCQkJICAgIEVwbFNkb0FzeVNlcVNlbmREYXRhCisJCQkJCQkJCQkgICAgKHBTZG9Db21Db24tPgorCQkJCQkJCQkJICAgICBtX1Nkb1NlcUNvbkhkbCwKKwkJCQkJCQkJCSAgICAgMCwKKwkJCQkJCQkJCSAgICAgKHRFcGxGcmFtZQorCQkJCQkJCQkJICAgICAgKikKKwkJCQkJCQkJCSAgICAgTlVMTCk7CisKKwkJCQkJCQkJCWJyZWFrOworCQkJCQkJCQl9CisKKwkJCQkJCQljYXNlIGtFcGxTZG9TZXJ2aWNlUmVhZEJ5SW5kZXg6CisJCQkJCQkJCXsJLy8gcmVhZCBieSBpbmRleAorCisJCQkJCQkJCQkvLyBzZWFyY2ggZW50cnkgYW4gc3RhcnQgdHJhbnNmZXIKKwkJCQkJCQkJCUVwbFNkb0NvbVNlcnZlckluaXRSZWFkQnlJbmRleAorCQkJCQkJCQkJICAgIChwU2RvQ29tQ29uLAorCQkJCQkJCQkJICAgICBwQXN5U2RvQ29tX3ApOworCQkJCQkJCQkJLy8gY2hlY2sgbmV4dCBzdGF0ZQorCQkJCQkJCQkJaWYgKHBTZG9Db21Db24tPm1fdWlUcmFuc1NpemUgPT0gMCkgewkvLyByZWFkeSAtPiBzdGF5IGlkbGUKKwkJCQkJCQkJCQlwU2RvQ29tQ29uLT4KKwkJCQkJCQkJCQkgICAgbV9TZG9Db21TdGF0ZQorCQkJCQkJCQkJCSAgICA9CisJCQkJCQkJCQkJICAgIGtFcGxTZG9Db21TdGF0ZUlkbGU7CisJCQkJCQkJCQkJLy8gcmVzZXQgYWJvcnQgY29kZQorCQkJCQkJCQkJCXBTZG9Db21Db24tPgorCQkJCQkJCQkJCSAgICBtX2R3TGFzdEFib3J0Q29kZQorCQkJCQkJCQkJCSAgICA9CisJCQkJCQkJCQkJICAgIDA7CisJCQkJCQkJCQl9IGVsc2UgewkvLyBzZWdtZW50ZWQgdHJhbnNmZXIKKwkJCQkJCQkJCQlwU2RvQ29tQ29uLT4KKwkJCQkJCQkJCQkgICAgbV9TZG9Db21TdGF0ZQorCQkJCQkJCQkJCSAgICA9CisJCQkJCQkJCQkJICAgIGtFcGxTZG9Db21TdGF0ZVNlcnZlclNlZ21UcmFuczsKKwkJCQkJCQkJCX0KKworCQkJCQkJCQkJYnJlYWs7CisJCQkJCQkJCX0KKworCQkJCQkJCWNhc2Uga0VwbFNkb1NlcnZpY2VXcml0ZUJ5SW5kZXg6CisJCQkJCQkJCXsKKworCQkJCQkJCQkJLy8gc2VhcmNoIGVudHJ5IGFuIHN0YXJ0IHdyaXRlCisJCQkJCQkJCQlFcGxTZG9Db21TZXJ2ZXJJbml0V3JpdGVCeUluZGV4CisJCQkJCQkJCQkgICAgKHBTZG9Db21Db24sCisJCQkJCQkJCQkgICAgIHBBc3lTZG9Db21fcCk7CisJCQkJCQkJCQkvLyBjaGVjayBuZXh0IHN0YXRlCisJCQkJCQkJCQlpZiAocFNkb0NvbUNvbi0+bV91aVRyYW5zU2l6ZSA9PSAwKSB7CS8vIGFscmVhZHkgLT4gc3RheSBpZGxlCisJCQkJCQkJCQkJcFNkb0NvbUNvbi0+CisJCQkJCQkJCQkJICAgIG1fU2RvQ29tU3RhdGUKKwkJCQkJCQkJCQkgICAgPQorCQkJCQkJCQkJCSAgICBrRXBsU2RvQ29tU3RhdGVJZGxlOworCQkJCQkJCQkJCS8vIHJlc2V0IGFib3J0IGNvZGUKKwkJCQkJCQkJCQlwU2RvQ29tQ29uLT4KKwkJCQkJCQkJCQkgICAgbV9kd0xhc3RBYm9ydENvZGUKKwkJCQkJCQkJCQkgICAgPQorCQkJCQkJCQkJCSAgICAwOworCQkJCQkJCQkJfSBlbHNlIHsJLy8gc2VnbWVudGVkIHRyYW5zZmVyCisJCQkJCQkJCQkJcFNkb0NvbUNvbi0+CisJCQkJCQkJCQkJICAgIG1fU2RvQ29tU3RhdGUKKwkJCQkJCQkJCQkgICAgPQorCQkJCQkJCQkJCSAgICBrRXBsU2RvQ29tU3RhdGVTZXJ2ZXJTZWdtVHJhbnM7CisJCQkJCQkJCQl9CisKKwkJCQkJCQkJCWJyZWFrOworCQkJCQkJCQl9CisKKwkJCQkJCQlkZWZhdWx0OgorCQkJCQkJCQl7CisJCQkJCQkJCQkvLyAgdW5zdXBwb3J0ZWQgY29tbWFuZAorCQkJCQkJCQkJLy8gICAgICAgLT4gYWJvcnQgc2VuZGVuCisJCQkJCQkJCQlkd0Fib3J0Q29kZQorCQkJCQkJCQkJICAgID0KKwkJCQkJCQkJCSAgICBFUExfU0RPQUNfVU5LTk9XTl9DT01NQU5EX1NQRUNJRklFUjsKKwkJCQkJCQkJCS8vIHNlbmQgYWJvcnQKKwkJCQkJCQkJCXBTZG9Db21Db24tPgorCQkJCQkJCQkJICAgIG1fcERhdGEKKwkJCQkJCQkJCSAgICA9CisJCQkJCQkJCQkgICAgKEJZVEUKKwkJCQkJCQkJCSAgICAgKikKKwkJCQkJCQkJCSAgICAmCisJCQkJCQkJCQkgICAgZHdBYm9ydENvZGU7CisJCQkJCQkJCQlSZXQgPQorCQkJCQkJCQkJICAgIEVwbFNkb0NvbVNlcnZlclNlbmRGcmFtZUludGVybgorCQkJCQkJCQkJICAgIChwU2RvQ29tQ29uLAorCQkJCQkJCQkJICAgICAwLAorCQkJCQkJCQkJICAgICAwLAorCQkJCQkJCQkJICAgICBrRXBsU2RvQ29tU2VuZFR5cGVBYm9ydCk7CisKKwkJCQkJCQkJfQorCisJCQkJCQkJfQkvLyBlbmQgb2Ygc3dpdGNoKHBBc3lTZG9Db21fcC0+bV9sZV9iQ29tbWFuZElkKQorCQkJCQkJfQorCQkJCQl9IGVsc2UgewkvLyB0aGlzIGNvbW1hbmQgbGF5ZXIgaGFuZGxlIGlzIG5vdCByZXNwb25zaWJsZQorCQkJCQkJLy8gKHdyb25nIGRpcmVjdGlvbiBvciB3cm9uZyB0cmFuc2FjdGlvbiBJRCkKKwkJCQkJCVJldCA9IGtFcGxTZG9Db21Ob3RSZXNwb25zaWJsZTsKKwkJCQkJCWdvdG8gRXhpdDsKKwkJCQkJfQorI2VuZGlmIC8vIGVuZCBvZiAjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1NET1MpKSAhPSAwKQorCisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIGNvbm5lY3Rpb24gY2xvc2VkCisJCQljYXNlIGtFcGxTZG9Db21Db25FdmVudEluaXRFcnJvcjoKKwkJCWNhc2Uga0VwbFNkb0NvbUNvbkV2ZW50VGltZW91dDoKKwkJCWNhc2Uga0VwbFNkb0NvbUNvbkV2ZW50Q29uQ2xvc2VkOgorCQkJCXsKKwkJCQkJUmV0ID0KKwkJCQkJICAgIEVwbFNkb0FzeVNlcURlbENvbihwU2RvQ29tQ29uLT4KKwkJCQkJCQkgICAgICAgbV9TZG9TZXFDb25IZGwpOworCQkJCQkvLyBjbGVhbiBjb250cm9sIHN0cnVjdHVyZQorCQkJCQlFUExfTUVNU0VUKHBTZG9Db21Db24sIDB4MDAsCisJCQkJCQkgICBzaXplb2YodEVwbFNkb0NvbUNvbikpOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCWRlZmF1bHQ6CisJCQkJLy8gZC5rLiBkbyBub3RoaW5nCisJCQkJYnJlYWs7CisJCQl9CS8vIGVuZCBvZiBzd2l0Y2goU2RvQ29tQ29uRXZlbnRfcCkKKwkJCWJyZWFrOworCQl9CisKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfU0RPUykpICE9IDApCisJCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkvLyBTRE8gU2VydmVyIHBhcnQKKwkJLy8gc2VnbWVudGVkIHRyYW5zZmVyCisJY2FzZSBrRXBsU2RvQ29tU3RhdGVTZXJ2ZXJTZWdtVHJhbnM6CisJCXsKKwkJCS8vIGNoZWNrIGV2ZW50cworCQkJc3dpdGNoIChTZG9Db21Db25FdmVudF9wKSB7CisJCQkJLy8gc2VuZCBuZXh0IGZyYW1lCisJCQljYXNlIGtFcGxTZG9Db21Db25FdmVudEFja1JlY2VpdmVkOgorCQkJY2FzZSBrRXBsU2RvQ29tQ29uRXZlbnRGcmFtZVNlbmRlZDoKKwkJCQl7CisJCQkJCS8vIGNoZWNrIGlmIGl0IGlzIGEgcmVhZAorCQkJCQlpZiAocFNkb0NvbUNvbi0+bV9TZG9TZXJ2aWNlVHlwZSA9PQorCQkJCQkgICAga0VwbFNkb1NlcnZpY2VSZWFkQnlJbmRleCkgeworCQkJCQkJLy8gc2VuZCBuZXh0IGZyYW1lCisJCQkJCQlFcGxTZG9Db21TZXJ2ZXJTZW5kRnJhbWVJbnRlcm4KKwkJCQkJCSAgICAocFNkb0NvbUNvbiwgMCwgMCwKKwkJCQkJCSAgICAga0VwbFNkb0NvbVNlbmRUeXBlUmVzKTsKKwkJCQkJCS8vIGlmIGFsbCBzZW5kIC0+IGJhY2sgdG8gaWRsZQorCQkJCQkJaWYgKHBTZG9Db21Db24tPm1fdWlUcmFuc1NpemUgPT0gMCkgewkvLyBiYWNrIHRvIGlkbGUKKwkJCQkJCQlwU2RvQ29tQ29uLT4KKwkJCQkJCQkgICAgbV9TZG9Db21TdGF0ZSA9CisJCQkJCQkJICAgIGtFcGxTZG9Db21TdGF0ZUlkbGU7CisJCQkJCQkJLy8gcmVzZXQgYWJvcnQgY29kZQorCQkJCQkJCXBTZG9Db21Db24tPgorCQkJCQkJCSAgICBtX2R3TGFzdEFib3J0Q29kZSA9CisJCQkJCQkJICAgIDA7CisJCQkJCQl9CisKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBwcm9jZXNzIG5leHQgZnJhbWUKKwkJCWNhc2Uga0VwbFNkb0NvbUNvbkV2ZW50UmVjOgorCQkJCXsKKwkJCQkJLy8gY2hlY2sgaWYgdGhlIGZyYW1lIGlzIGEgU0RPIHJlc3BvbnNlIGFuZCBoYXMgdGhlIHJpZ2h0IHRyYW5zYWN0aW9uIElECisJCQkJCWJGbGFnID0KKwkJCQkJICAgIEFtaUdldEJ5dGVGcm9tTGUoJnBBc3lTZG9Db21fcC0+CisJCQkJCQkJICAgICBtX2xlX2JGbGFncyk7CisJCQkJCWlmICgoKGJGbGFnICYgMHg4MCkgIT0gMCkKKwkJCQkJICAgICYmCisJCQkJCSAgICAoQW1pR2V0Qnl0ZUZyb21MZQorCQkJCQkgICAgICgmcEFzeVNkb0NvbV9wLT4KKwkJCQkJICAgICAgbV9sZV9iVHJhbnNhY3Rpb25JZCkgPT0KKwkJCQkJICAgICBwU2RvQ29tQ29uLT5tX2JUcmFuc2FjdGlvbklkKSkgeworCQkJCQkJLy8gY2hlY2sgaWYgaXQgaXMgYSBhYm9ydAorCQkJCQkJaWYgKChiRmxhZyAmIDB4NDApICE9IDApIHsJLy8gU0RPIGFib3J0CisJCQkJCQkJLy8gY2xlYXIgY29udHJvbCBzdHJ1Y3R1cmUKKwkJCQkJCQlwU2RvQ29tQ29uLT4KKwkJCQkJCQkgICAgbV91aVRyYW5zU2l6ZSA9IDA7CisJCQkJCQkJcFNkb0NvbUNvbi0+CisJCQkJCQkJICAgIG1fdWlUcmFuc2ZlcnJlZEJ5dGUKKwkJCQkJCQkgICAgPSAwOworCQkJCQkJCS8vIGNoYW5nZSBzdGF0ZQorCQkJCQkJCXBTZG9Db21Db24tPgorCQkJCQkJCSAgICBtX1Nkb0NvbVN0YXRlID0KKwkJCQkJCQkgICAga0VwbFNkb0NvbVN0YXRlSWRsZTsKKwkJCQkJCQkvLyByZXNldCBhYm9ydCBjb2RlCisJCQkJCQkJcFNkb0NvbUNvbi0+CisJCQkJCQkJICAgIG1fZHdMYXN0QWJvcnRDb2RlID0KKwkJCQkJCQkgICAgMDsKKwkJCQkJCQkvLyBkLmsuOiBkbyBub3QgZXhlY3V0ZSBhbnl0aGluZyBmdXJ0aGVyIG9uIHRoaXMgY29tbWFuZAorCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQkJLy8gY2hlY2sgaWYgaXQgaXMgYSB3cml0ZQorCQkJCQkJaWYgKHBTZG9Db21Db24tPgorCQkJCQkJICAgIG1fU2RvU2VydmljZVR5cGUgPT0KKwkJCQkJCSAgICBrRXBsU2RvU2VydmljZVdyaXRlQnlJbmRleCkKKwkJCQkJCXsKKwkJCQkJCQkvLyB3cml0ZSBkYXRhIHRvIE9ECisJCQkJCQkJdWlTaXplID0KKwkJCQkJCQkgICAgQW1pR2V0V29yZEZyb21MZQorCQkJCQkJCSAgICAoJnBBc3lTZG9Db21fcC0+CisJCQkJCQkJICAgICBtX2xlX3dTZWdtZW50U2l6ZSk7CisJCQkJCQkJaWYgKHBTZG9Db21Db24tPgorCQkJCQkJCSAgICBtX2R3TGFzdEFib3J0Q29kZSA9PQorCQkJCQkJCSAgICAwKSB7CisJCQkJCQkJCUVQTF9NRU1DUFkKKwkJCQkJCQkJICAgIChwU2RvQ29tQ29uLT4KKwkJCQkJCQkJICAgICBtX3BEYXRhLAorCQkJCQkJCQkgICAgICZwQXN5U2RvQ29tX3AtPgorCQkJCQkJCQkgICAgIG1fbGVfYWJDb21tYW5kRGF0YQorCQkJCQkJCQkgICAgIFswXSwKKwkJCQkJCQkJICAgICB1aVNpemUpOworCQkJCQkJCX0KKwkJCQkJCQkvLyB1cGRhdGUgY291bnRlcgorCQkJCQkJCXBTZG9Db21Db24tPgorCQkJCQkJCSAgICBtX3VpVHJhbnNmZXJyZWRCeXRlCisJCQkJCQkJICAgICs9IHVpU2l6ZTsKKwkJCQkJCQlwU2RvQ29tQ29uLT4KKwkJCQkJCQkgICAgbV91aVRyYW5zU2l6ZSAtPQorCQkJCQkJCSAgICB1aVNpemU7CisKKwkJCQkJCQkvLyB1cGRhdGUgcG9pbnRlcgorCQkJCQkJCWlmIChwU2RvQ29tQ29uLT4KKwkJCQkJCQkgICAgbV9kd0xhc3RBYm9ydENvZGUgPT0KKwkJCQkJCQkgICAgMCkgeworCQkJCQkJCQkoIC8qKEJZVEUqKSAqLworCQkJCQkJCQkgcFNkb0NvbUNvbi0+CisJCQkJCQkJCSBtX3BEYXRhKSArPQorCQkJCQkJICAgICAgdWlTaXplOworCQkJCQkJCX0KKwkJCQkJCQkvLyBjaGVjayBlbmQgb2YgdHJhbnNmZXIKKwkJCQkJCQlpZiAoKHBBc3lTZG9Db21fcC0+bV9sZV9iRmxhZ3MgJiAweDMwKSA9PSAweDMwKSB7CS8vIHRyYW5zZmVyIHJlYWR5CisJCQkJCQkJCXBTZG9Db21Db24tPgorCQkJCQkJCQkgICAgbV91aVRyYW5zU2l6ZQorCQkJCQkJCQkgICAgPSAwOworCisJCQkJCQkJCWlmIChwU2RvQ29tQ29uLT4KKwkJCQkJCQkJICAgIG1fZHdMYXN0QWJvcnRDb2RlCisJCQkJCQkJCSAgICA9PSAwKSB7CisJCQkJCQkJCQkvLyBzZW5kIHJlc3BvbnNlCisJCQkJCQkJCQkvLyBzZW5kIG5leHQgZnJhbWUKKwkJCQkJCQkJCUVwbFNkb0NvbVNlcnZlclNlbmRGcmFtZUludGVybgorCQkJCQkJCQkJICAgIChwU2RvQ29tQ29uLAorCQkJCQkJCQkJICAgICAwLAorCQkJCQkJCQkJICAgICAwLAorCQkJCQkJCQkJICAgICBrRXBsU2RvQ29tU2VuZFR5cGVSZXMpOworCQkJCQkJCQkJLy8gaWYgYWxsIHNlbmQgLT4gYmFjayB0byBpZGxlCisJCQkJCQkJCQlpZiAocFNkb0NvbUNvbi0+bV91aVRyYW5zU2l6ZSA9PSAwKSB7CS8vIGJhY2sgdG8gaWRsZQorCQkJCQkJCQkJCXBTZG9Db21Db24tPgorCQkJCQkJCQkJCSAgICBtX1Nkb0NvbVN0YXRlCisJCQkJCQkJCQkJICAgID0KKwkJCQkJCQkJCQkgICAga0VwbFNkb0NvbVN0YXRlSWRsZTsKKwkJCQkJCQkJCQkvLyByZXNldCBhYm9ydCBjb2RlCisJCQkJCQkJCQkJcFNkb0NvbUNvbi0+CisJCQkJCQkJCQkJICAgIG1fZHdMYXN0QWJvcnRDb2RlCisJCQkJCQkJCQkJICAgID0KKwkJCQkJCQkJCQkgICAgMDsKKwkJCQkJCQkJCX0KKwkJCQkJCQkJfSBlbHNlIHsJLy8gc2VuZCBkYWJvcnQgY29kZQorCQkJCQkJCQkJLy8gc2VuZCBhYm9ydAorCQkJCQkJCQkJcFNkb0NvbUNvbi0+CisJCQkJCQkJCQkgICAgbV9wRGF0YQorCQkJCQkJCQkJICAgID0KKwkJCQkJCQkJCSAgICAoQllURQorCQkJCQkJCQkJICAgICAqKQorCQkJCQkJCQkJICAgICYKKwkJCQkJCQkJCSAgICBwU2RvQ29tQ29uLT4KKwkJCQkJCQkJCSAgICBtX2R3TGFzdEFib3J0Q29kZTsKKwkJCQkJCQkJCVJldCA9CisJCQkJCQkJCQkgICAgRXBsU2RvQ29tU2VydmVyU2VuZEZyYW1lSW50ZXJuCisJCQkJCQkJCQkgICAgKHBTZG9Db21Db24sCisJCQkJCQkJCQkgICAgIDAsCisJCQkJCQkJCQkgICAgIDAsCisJCQkJCQkJCQkgICAgIGtFcGxTZG9Db21TZW5kVHlwZUFib3J0KTsKKworCQkJCQkJCQkJLy8gcmVzZXQgYWJvcnQgY29kZQorCQkJCQkJCQkJcFNkb0NvbUNvbi0+CisJCQkJCQkJCQkgICAgbV9kd0xhc3RBYm9ydENvZGUKKwkJCQkJCQkJCSAgICA9IDA7CisKKwkJCQkJCQkJfQorCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCS8vIHNlbmQgYWNrbm93bGVkZ2Ugd2l0aG91dCBhbnkgQ29tbWFuZCBsYXllciBkYXRhCisJCQkJCQkJCVJldCA9CisJCQkJCQkJCSAgICBFcGxTZG9Bc3lTZXFTZW5kRGF0YQorCQkJCQkJCQkgICAgKHBTZG9Db21Db24tPgorCQkJCQkJCQkgICAgIG1fU2RvU2VxQ29uSGRsLAorCQkJCQkJCQkgICAgIDAsCisJCQkJCQkJCSAgICAgKHRFcGxGcmFtZQorCQkJCQkJCQkgICAgICAqKSBOVUxMKTsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0gZWxzZSB7CS8vIHRoaXMgY29tbWFuZCBsYXllciBoYW5kbGUgaXMgbm90IHJlc3BvbnNpYmxlCisJCQkJCQkvLyAod3JvbmcgZGlyZWN0aW9uIG9yIHdyb25nIHRyYW5zYWN0aW9uIElEKQorCQkJCQkJUmV0ID0ga0VwbFNkb0NvbU5vdFJlc3BvbnNpYmxlOworCQkJCQkJZ290byBFeGl0OworCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIGNvbm5lY3Rpb24gY2xvc2VkCisJCQljYXNlIGtFcGxTZG9Db21Db25FdmVudEluaXRFcnJvcjoKKwkJCWNhc2Uga0VwbFNkb0NvbUNvbkV2ZW50VGltZW91dDoKKwkJCWNhc2Uga0VwbFNkb0NvbUNvbkV2ZW50Q29uQ2xvc2VkOgorCQkJCXsKKwkJCQkJUmV0ID0KKwkJCQkJICAgIEVwbFNkb0FzeVNlcURlbENvbihwU2RvQ29tQ29uLT4KKwkJCQkJCQkgICAgICAgbV9TZG9TZXFDb25IZGwpOworCQkJCQkvLyBjbGVhbiBjb250cm9sIHN0cnVjdHVyZQorCQkJCQlFUExfTUVNU0VUKHBTZG9Db21Db24sIDB4MDAsCisJCQkJCQkgICBzaXplb2YodEVwbFNkb0NvbUNvbikpOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCWRlZmF1bHQ6CisJCQkJLy8gZC5rLiBkbyBub3RoaW5nCisJCQkJYnJlYWs7CisJCQl9CS8vIGVuZCBvZiBzd2l0Y2goU2RvQ29tQ29uRXZlbnRfcCkKKworCQkJYnJlYWs7CisJCX0KKyNlbmRpZiAvLyBlbmRpZiBvZiAjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1NET1MpKSAhPSAwKQorCisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1NET0MpKSAhPSAwKQorCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJLy8gU0RPIENsaWVudCBwYXJ0CisJCS8vIHdhaXQgZm9yIGZpbmlzaCBvZiBlc3RhYmxpc2hpbmcgY29ubmVjdGlvbgorCWNhc2Uga0VwbFNkb0NvbVN0YXRlQ2xpZW50V2FpdEluaXQ6CisJCXsKKworCQkJLy8gaWYgY29ubmVjdGlvbiBoYW5kbGUgaXMgaW52YWxpZCByZWluaXQgY29ubmVjdGlvbgorCQkJLy8gZC5rLjogdGhpcyB3aWxsIGJlIGRvbmUgb25seSBvbiBuZXcgZXZlbnRzIChpLmUuIEluaXRUcmFuc2ZlcikKKwkJCWlmICgocFNkb0NvbUNvbi0+CisJCQkgICAgIG1fU2RvU2VxQ29uSGRsICYgfkVQTF9TRE9fU0VRX0hBTkRMRV9NQVNLKSA9PQorCQkJICAgIEVQTF9TRE9fU0VRX0lOVkFMSURfSERMKSB7CisJCQkJLy8gY2hlY2sga2luZCBvZiBjb25uZWN0aW9uIHRvIHJlaW5pdAorCQkJCS8vIGNoZWNrIHByb3RvY29sCisJCQkJc3dpdGNoIChwU2RvQ29tQ29uLT5tX1Nkb1Byb3RUeXBlKSB7CisJCQkJCS8vIHVkcAorCQkJCWNhc2Uga0VwbFNkb1R5cGVVZHA6CisJCQkJCXsKKwkJCQkJCS8vIGNhbGwgY29ubmVjdGlvbiBpbnQgZnVuY3Rpb24gb2YgbG93ZXIgbGF5ZXIKKwkJCQkJCVJldCA9CisJCQkJCQkgICAgRXBsU2RvQXN5U2VxSW5pdENvbgorCQkJCQkJICAgICgmcFNkb0NvbUNvbi0+CisJCQkJCQkgICAgIG1fU2RvU2VxQ29uSGRsLAorCQkJCQkJICAgICBwU2RvQ29tQ29uLT5tX3VpTm9kZUlkLAorCQkJCQkJICAgICBrRXBsU2RvVHlwZVVkcCk7CisJCQkJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQkJCQkJZ290byBFeGl0OworCQkJCQkJfQorCQkJCQkJYnJlYWs7CisJCQkJCX0KKworCQkJCQkvLyBBc2VuZCAtPiBub3Qgc3VwcG9ydGVkCisJCQkJY2FzZSBrRXBsU2RvVHlwZUFzbmQ6CisJCQkJCXsKKwkJCQkJCS8vIGNhbGwgY29ubmVjdGlvbiBpbnQgZnVuY3Rpb24gb2YgbG93ZXIgbGF5ZXIKKwkJCQkJCVJldCA9CisJCQkJCQkgICAgRXBsU2RvQXN5U2VxSW5pdENvbgorCQkJCQkJICAgICgmcFNkb0NvbUNvbi0+CisJCQkJCQkgICAgIG1fU2RvU2VxQ29uSGRsLAorCQkJCQkJICAgICBwU2RvQ29tQ29uLT5tX3VpTm9kZUlkLAorCQkJCQkJICAgICBrRXBsU2RvVHlwZUFzbmQpOworCQkJCQkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJCQkJCWdvdG8gRXhpdDsKKwkJCQkJCX0KKwkJCQkJCWJyZWFrOworCQkJCQl9CisKKwkJCQkJLy8gUGRvIC0+IG5vdCBzdXBwb3J0ZWQKKwkJCQljYXNlIGtFcGxTZG9UeXBlUGRvOgorCQkJCWRlZmF1bHQ6CisJCQkJCXsKKwkJCQkJCVJldCA9IGtFcGxTZG9Db21VbnN1cHBvcnRlZFByb3Q7CisJCQkJCQlnb3RvIEV4aXQ7CisJCQkJCX0KKwkJCQl9CS8vIGVuZCBvZiBzd2l0Y2gobV9Qcm90VHlwZV9wKQorCQkJCS8vIGQuay46IHJlc2V0IHRyYW5zYWN0aW9uIElELCBiZWNhdXNlIG5ldyBzZXF1ZW5jZSBsYXllciBjb25uZWN0aW9uIHdhcyBpbml0aWFsaXplZAorCQkJCS8vICQkJCBkLmsuIGlzIHRoaXMgcmVhbGx5IG5lY2Vzc2FyeT8KKwkJCQkvL3BTZG9Db21Db24tPm1fYlRyYW5zYWN0aW9uSWQgPSAwOworCQkJfQorCQkJLy8gY2hlY2sgZXZlbnRzCisJCQlzd2l0Y2ggKFNkb0NvbUNvbkV2ZW50X3ApIHsKKwkJCQkvLyBjb25uZWN0aW9uIGVzdGFibGlzaGVkCisJCQljYXNlIGtFcGxTZG9Db21Db25FdmVudENvbkVzdGFibGlzaGVkOgorCQkJCXsKKwkJCQkJLy9zZW5kIGZpcnN0IGZyYW1lIGlmIG5lZWRlZAorCQkJCQlpZiAoKHBTZG9Db21Db24tPm1fdWlUcmFuc1NpemUgPiAwKQorCQkJCQkgICAgJiYgKHBTZG9Db21Db24tPm1fdWlUYXJnZXRJbmRleCAhPSAwKSkgewkvLyBzdGFydCBTRE8gdHJhbnNmZXIKKwkJCQkJCVJldCA9CisJCQkJCQkgICAgRXBsU2RvQ29tQ2xpZW50U2VuZAorCQkJCQkJICAgIChwU2RvQ29tQ29uKTsKKwkJCQkJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCQkJCQlnb3RvIEV4aXQ7CisJCQkJCQl9CisJCQkJCQkvLyBjaGVjayBpZiBzZWdlbXRlZCB0cmFuc2ZlcgorCQkJCQkJaWYgKHBTZG9Db21Db24tPgorCQkJCQkJICAgIG1fU2RvVHJhbnNUeXBlID09CisJCQkJCQkgICAga0VwbFNkb1RyYW5zU2VnbWVudGVkKSB7CisJCQkJCQkJcFNkb0NvbUNvbi0+CisJCQkJCQkJICAgIG1fU2RvQ29tU3RhdGUgPQorCQkJCQkJCSAgICBrRXBsU2RvQ29tU3RhdGVDbGllbnRTZWdtVHJhbnM7CisJCQkJCQkJZ290byBFeGl0OworCQkJCQkJfQorCQkJCQl9CisJCQkJCS8vIGdvdG8gc3RhdGUga0VwbFNkb0NvbVN0YXRlQ2xpZW50Q29ubmVjdGVkCisJCQkJCXBTZG9Db21Db24tPm1fU2RvQ29tU3RhdGUgPQorCQkJCQkgICAga0VwbFNkb0NvbVN0YXRlQ2xpZW50Q29ubmVjdGVkOworCQkJCQlnb3RvIEV4aXQ7CisJCQkJfQorCisJCQljYXNlIGtFcGxTZG9Db21Db25FdmVudFNlbmRGaXJzdDoKKwkJCQl7CisJCQkJCS8vIGluZm9zIGZvciB0cmFuc2ZlciBhbHJlYWR5IHNhdmVkIGJ5IGZ1bmN0aW9uIEVwbFNkb0NvbUluaXRUcmFuc2ZlckJ5SW5kZXgKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQljYXNlIGtFcGxTZG9Db21Db25FdmVudENvbkNsb3NlZDoKKwkJCWNhc2Uga0VwbFNkb0NvbUNvbkV2ZW50SW5pdEVycm9yOgorCQkJY2FzZSBrRXBsU2RvQ29tQ29uRXZlbnRUaW1lb3V0OgorCQkJCXsKKwkJCQkJLy8gY2xvc2Ugc2VxdWVuY2UgbGF5ZXIgaGFuZGxlCisJCQkJCVJldCA9CisJCQkJCSAgICBFcGxTZG9Bc3lTZXFEZWxDb24ocFNkb0NvbUNvbi0+CisJCQkJCQkJICAgICAgIG1fU2RvU2VxQ29uSGRsKTsKKwkJCQkJcFNkb0NvbUNvbi0+bV9TZG9TZXFDb25IZGwgfD0KKwkJCQkJICAgIEVQTF9TRE9fU0VRX0lOVkFMSURfSERMOworCQkJCQkvLyBjYWxsIGNhbGxiYWNrIGZ1bmN0aW9uCisJCQkJCWlmIChTZG9Db21Db25FdmVudF9wID09CisJCQkJCSAgICBrRXBsU2RvQ29tQ29uRXZlbnRUaW1lb3V0KSB7CisJCQkJCQlwU2RvQ29tQ29uLT5tX2R3TGFzdEFib3J0Q29kZSA9CisJCQkJCQkgICAgRVBMX1NET0FDX1RJTUVfT1VUOworCQkJCQl9IGVsc2UgeworCQkJCQkJcFNkb0NvbUNvbi0+bV9kd0xhc3RBYm9ydENvZGUgPQorCQkJCQkJICAgIDA7CisJCQkJCX0KKwkJCQkJUmV0ID0KKwkJCQkJICAgIEVwbFNkb0NvbVRyYW5zZmVyRmluaXNoZWQKKwkJCQkJICAgIChTZG9Db21Db25fcCwgcFNkb0NvbUNvbiwKKwkJCQkJICAgICBrRXBsU2RvQ29tVHJhbnNmZXJMb3dlckxheWVyQWJvcnQpOworCQkJCQkvLyBkLmsuOiBkbyBub3QgY2xlYW4gY29udHJvbCBzdHJ1Y3R1cmUKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQlkZWZhdWx0OgorCQkJCS8vIGQuay4gZG8gbm90aGluZworCQkJCWJyZWFrOworCisJCQl9CS8vIGVuZCBvZiAgc3dpdGNoKFNkb0NvbUNvbkV2ZW50X3ApCisJCQlicmVhazsKKwkJfQorCisJCS8vIGNvbm5lY3RlZAorCWNhc2Uga0VwbFNkb0NvbVN0YXRlQ2xpZW50Q29ubmVjdGVkOgorCQl7CisJCQkvLyBjaGVjayBldmVudHMKKwkJCXN3aXRjaCAoU2RvQ29tQ29uRXZlbnRfcCkgeworCQkJCS8vIHNlbmQgYSBmcmFtZQorCQkJY2FzZSBrRXBsU2RvQ29tQ29uRXZlbnRTZW5kRmlyc3Q6CisJCQljYXNlIGtFcGxTZG9Db21Db25FdmVudEFja1JlY2VpdmVkOgorCQkJY2FzZSBrRXBsU2RvQ29tQ29uRXZlbnRGcmFtZVNlbmRlZDoKKwkJCQl7CisJCQkJCVJldCA9IEVwbFNkb0NvbUNsaWVudFNlbmQocFNkb0NvbUNvbik7CisJCQkJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCQkJCWdvdG8gRXhpdDsKKwkJCQkJfQorCQkJCQkvLyBjaGVjayBpZiByZWFkIHRyYW5zZmVyIGZpbmlzaGVkCisJCQkJCWlmICgocFNkb0NvbUNvbi0+bV91aVRyYW5zU2l6ZSA9PSAwKQorCQkJCQkgICAgJiYgKHBTZG9Db21Db24tPgorCQkJCQkJbV91aVRyYW5zZmVycmVkQnl0ZSAhPSAwKQorCQkJCQkgICAgJiYgKHBTZG9Db21Db24tPm1fU2RvU2VydmljZVR5cGUgPT0KKwkJCQkJCWtFcGxTZG9TZXJ2aWNlUmVhZEJ5SW5kZXgpKSB7CisJCQkJCQkvLyBpbmMgdHJhbnNhY3Rpb24gaWQKKwkJCQkJCXBTZG9Db21Db24tPm1fYlRyYW5zYWN0aW9uSWQrKzsKKwkJCQkJCS8vIGNhbGwgY2FsbGJhY2sgb2YgYXBwbGljYXRpb24KKwkJCQkJCXBTZG9Db21Db24tPm1fZHdMYXN0QWJvcnRDb2RlID0KKwkJCQkJCSAgICAwOworCQkJCQkJUmV0ID0KKwkJCQkJCSAgICBFcGxTZG9Db21UcmFuc2ZlckZpbmlzaGVkCisJCQkJCQkgICAgKFNkb0NvbUNvbl9wLCBwU2RvQ29tQ29uLAorCQkJCQkJICAgICBrRXBsU2RvQ29tVHJhbnNmZXJGaW5pc2hlZCk7CisKKwkJCQkJCWdvdG8gRXhpdDsKKwkJCQkJfQorCQkJCQkvLyBjaGVjayBpZiBzZWdlbXRlZCB0cmFuc2ZlcgorCQkJCQlpZiAocFNkb0NvbUNvbi0+bV9TZG9UcmFuc1R5cGUgPT0KKwkJCQkJICAgIGtFcGxTZG9UcmFuc1NlZ21lbnRlZCkgeworCQkJCQkJcFNkb0NvbUNvbi0+bV9TZG9Db21TdGF0ZSA9CisJCQkJCQkgICAga0VwbFNkb0NvbVN0YXRlQ2xpZW50U2VnbVRyYW5zOworCQkJCQkJZ290byBFeGl0OworCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIGZyYW1lIHJlY2VpdmVkCisJCQljYXNlIGtFcGxTZG9Db21Db25FdmVudFJlYzoKKwkJCQl7CisJCQkJCS8vIGNoZWNrIGlmIHRoZSBmcmFtZSBpcyBhIFNETyByZXNwb25zZSBhbmQgaGFzIHRoZSByaWdodCB0cmFuc2FjdGlvbiBJRAorCQkJCQliRmxhZyA9CisJCQkJCSAgICBBbWlHZXRCeXRlRnJvbUxlKCZwQXN5U2RvQ29tX3AtPgorCQkJCQkJCSAgICAgbV9sZV9iRmxhZ3MpOworCQkJCQlpZiAoKChiRmxhZyAmIDB4ODApICE9IDApCisJCQkJCSAgICAmJgorCQkJCQkgICAgKEFtaUdldEJ5dGVGcm9tTGUKKwkJCQkJICAgICAoJnBBc3lTZG9Db21fcC0+CisJCQkJCSAgICAgIG1fbGVfYlRyYW5zYWN0aW9uSWQpID09CisJCQkJCSAgICAgcFNkb0NvbUNvbi0+bV9iVHJhbnNhY3Rpb25JZCkpIHsKKwkJCQkJCS8vIGNoZWNrIGlmIGFib3J0IG9yIG5vdAorCQkJCQkJaWYgKChiRmxhZyAmIDB4NDApICE9IDApIHsKKwkJCQkJCQkvLyBzZW5kIGFja25vd2xlZGdlIHdpdGhvdXQgYW55IENvbW1hbmQgbGF5ZXIgZGF0YQorCQkJCQkJCVJldCA9CisJCQkJCQkJICAgIEVwbFNkb0FzeVNlcVNlbmREYXRhCisJCQkJCQkJICAgIChwU2RvQ29tQ29uLT4KKwkJCQkJCQkgICAgIG1fU2RvU2VxQ29uSGRsLCAwLAorCQkJCQkJCSAgICAgKHRFcGxGcmFtZSAqKQorCQkJCQkJCSAgICAgTlVMTCk7CisJCQkJCQkJLy8gaW5jIHRyYW5zYWN0aW9uIGlkCisJCQkJCQkJcFNkb0NvbUNvbi0+CisJCQkJCQkJICAgIG1fYlRyYW5zYWN0aW9uSWQrKzsKKwkJCQkJCQkvLyBzYXZlIGFib3J0IGNvZGUKKwkJCQkJCQlwU2RvQ29tQ29uLT4KKwkJCQkJCQkgICAgbV9kd0xhc3RBYm9ydENvZGUgPQorCQkJCQkJCSAgICBBbWlHZXREd29yZEZyb21MZQorCQkJCQkJCSAgICAoJnBBc3lTZG9Db21fcC0+CisJCQkJCQkJICAgICBtX2xlX2FiQ29tbWFuZERhdGEKKwkJCQkJCQkgICAgIFswXSk7CisJCQkJCQkJLy8gY2FsbCBjYWxsYmFjayBvZiBhcHBsaWNhdGlvbgorCQkJCQkJCVJldCA9CisJCQkJCQkJICAgIEVwbFNkb0NvbVRyYW5zZmVyRmluaXNoZWQKKwkJCQkJCQkgICAgKFNkb0NvbUNvbl9wLAorCQkJCQkJCSAgICAgcFNkb0NvbUNvbiwKKwkJCQkJCQkgICAgIGtFcGxTZG9Db21UcmFuc2ZlclJ4QWJvcnRlZCk7CisKKwkJCQkJCQlnb3RvIEV4aXQ7CisJCQkJCQl9IGVsc2UgewkvLyBub3JtYWwgZnJhbWUgcmVjZWl2ZWQKKwkJCQkJCQkvLyBjaGVjayBmcmFtZQorCQkJCQkJCVJldCA9CisJCQkJCQkJICAgIEVwbFNkb0NvbUNsaWVudFByb2Nlc3NGcmFtZQorCQkJCQkJCSAgICAoU2RvQ29tQ29uX3AsCisJCQkJCQkJICAgICBwQXN5U2RvQ29tX3ApOworCisJCQkJCQkJLy8gY2hlY2sgaWYgdHJhbnNmZXIgcmVhZHkKKwkJCQkJCQlpZiAocFNkb0NvbUNvbi0+CisJCQkJCQkJICAgIG1fdWlUcmFuc1NpemUgPT0KKwkJCQkJCQkgICAgMCkgeworCQkJCQkJCQkvLyBzZW5kIGFja25vd2xlZGdlIHdpdGhvdXQgYW55IENvbW1hbmQgbGF5ZXIgZGF0YQorCQkJCQkJCQlSZXQgPQorCQkJCQkJCQkgICAgRXBsU2RvQXN5U2VxU2VuZERhdGEKKwkJCQkJCQkJICAgIChwU2RvQ29tQ29uLT4KKwkJCQkJCQkJICAgICBtX1Nkb1NlcUNvbkhkbCwKKwkJCQkJCQkJICAgICAwLAorCQkJCQkJCQkgICAgICh0RXBsRnJhbWUKKwkJCQkJCQkJICAgICAgKikgTlVMTCk7CisJCQkJCQkJCS8vIGluYyB0cmFuc2FjdGlvbiBpZAorCQkJCQkJCQlwU2RvQ29tQ29uLT4KKwkJCQkJCQkJICAgIG1fYlRyYW5zYWN0aW9uSWQrKzsKKwkJCQkJCQkJLy8gY2FsbCBjYWxsYmFjayBvZiBhcHBsaWNhdGlvbgorCQkJCQkJCQlwU2RvQ29tQ29uLT4KKwkJCQkJCQkJICAgIG1fZHdMYXN0QWJvcnRDb2RlCisJCQkJCQkJCSAgICA9IDA7CisJCQkJCQkJCVJldCA9CisJCQkJCQkJCSAgICBFcGxTZG9Db21UcmFuc2ZlckZpbmlzaGVkCisJCQkJCQkJCSAgICAoU2RvQ29tQ29uX3AsCisJCQkJCQkJCSAgICAgcFNkb0NvbUNvbiwKKwkJCQkJCQkJICAgICBrRXBsU2RvQ29tVHJhbnNmZXJGaW5pc2hlZCk7CisKKwkJCQkJCQkJZ290byBFeGl0OworCQkJCQkJCX0KKworCQkJCQkJfQorCQkJCQl9IGVsc2UgewkvLyB0aGlzIGNvbW1hbmQgbGF5ZXIgaGFuZGxlIGlzIG5vdCByZXNwb25zaWJsZQorCQkJCQkJLy8gKHdyb25nIGRpcmVjdGlvbiBvciB3cm9uZyB0cmFuc2FjdGlvbiBJRCkKKwkJCQkJCVJldCA9IGtFcGxTZG9Db21Ob3RSZXNwb25zaWJsZTsKKwkJCQkJCWdvdG8gRXhpdDsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBjb25uZWN0aW9uIGNsb3NlZCBldmVudCBnbyBiYWNrIHRvIGtFcGxTZG9Db21TdGF0ZUNsaWVudFdhaXRJbml0CisJCQljYXNlIGtFcGxTZG9Db21Db25FdmVudENvbkNsb3NlZDoKKwkJCQl7CS8vIGNvbm5lY3Rpb24gY2xvc2VkIGJ5IGNvbW11bmljYXRpb24gcGFydG5lcgorCQkJCQkvLyBjbG9zZSBzZXF1ZW5jZSBsYXllciBoYW5kbGUKKwkJCQkJUmV0ID0KKwkJCQkJICAgIEVwbFNkb0FzeVNlcURlbENvbihwU2RvQ29tQ29uLT4KKwkJCQkJCQkgICAgICAgbV9TZG9TZXFDb25IZGwpOworCQkJCQkvLyBzZXQgaGFuZGxlIHRvIGludmFsaWQgYW5kIGVudGVyIGtFcGxTZG9Db21TdGF0ZUNsaWVudFdhaXRJbml0CisJCQkJCXBTZG9Db21Db24tPm1fU2RvU2VxQ29uSGRsIHw9CisJCQkJCSAgICBFUExfU0RPX1NFUV9JTlZBTElEX0hETDsKKwkJCQkJLy8gY2hhbmdlIHN0YXRlCisJCQkJCXBTZG9Db21Db24tPm1fU2RvQ29tU3RhdGUgPQorCQkJCQkgICAga0VwbFNkb0NvbVN0YXRlQ2xpZW50V2FpdEluaXQ7CisKKwkJCQkJLy8gY2FsbCBjYWxsYmFjayBvZiBhcHBsaWNhdGlvbgorCQkJCQlwU2RvQ29tQ29uLT5tX2R3TGFzdEFib3J0Q29kZSA9IDA7CisJCQkJCVJldCA9CisJCQkJCSAgICBFcGxTZG9Db21UcmFuc2ZlckZpbmlzaGVkCisJCQkJCSAgICAoU2RvQ29tQ29uX3AsIHBTZG9Db21Db24sCisJCQkJCSAgICAga0VwbFNkb0NvbVRyYW5zZmVyTG93ZXJMYXllckFib3J0KTsKKworCQkJCQlnb3RvIEV4aXQ7CisKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gYWJvcnQgdG8gc2VuZCBmcm9tIGhpZ2hlciBsYXllcgorCQkJY2FzZSBrRXBsU2RvQ29tQ29uRXZlbnRBYm9ydDoKKwkJCQl7CisJCQkJCUVwbFNkb0NvbUNsaWVudFNlbmRBYm9ydChwU2RvQ29tQ29uLAorCQkJCQkJCQkgKigoRFdPUkQgKikKKwkJCQkJCQkJICAgcFNkb0NvbUNvbi0+CisJCQkJCQkJCSAgIG1fcERhdGEpKTsKKworCQkJCQkvLyBpbmMgdHJhbnNhY3Rpb24gaWQKKwkJCQkJcFNkb0NvbUNvbi0+bV9iVHJhbnNhY3Rpb25JZCsrOworCQkJCQkvLyBjYWxsIGNhbGxiYWNrIG9mIGFwcGxpY2F0aW9uCisJCQkJCXBTZG9Db21Db24tPm1fZHdMYXN0QWJvcnRDb2RlID0KKwkJCQkJICAgICooKERXT1JEICopIHBTZG9Db21Db24tPm1fcERhdGEpOworCQkJCQlSZXQgPQorCQkJCQkgICAgRXBsU2RvQ29tVHJhbnNmZXJGaW5pc2hlZAorCQkJCQkgICAgKFNkb0NvbUNvbl9wLCBwU2RvQ29tQ29uLAorCQkJCQkgICAgIGtFcGxTZG9Db21UcmFuc2ZlclR4QWJvcnRlZCk7CisKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQljYXNlIGtFcGxTZG9Db21Db25FdmVudEluaXRFcnJvcjoKKwkJCWNhc2Uga0VwbFNkb0NvbUNvbkV2ZW50VGltZW91dDoKKwkJCQl7CisJCQkJCS8vIGNsb3NlIHNlcXVlbmNlIGxheWVyIGhhbmRsZQorCQkJCQlSZXQgPQorCQkJCQkgICAgRXBsU2RvQXN5U2VxRGVsQ29uKHBTZG9Db21Db24tPgorCQkJCQkJCSAgICAgICBtX1Nkb1NlcUNvbkhkbCk7CisJCQkJCXBTZG9Db21Db24tPm1fU2RvU2VxQ29uSGRsIHw9CisJCQkJCSAgICBFUExfU0RPX1NFUV9JTlZBTElEX0hETDsKKwkJCQkJLy8gY2hhbmdlIHN0YXRlCisJCQkJCXBTZG9Db21Db24tPm1fU2RvQ29tU3RhdGUgPQorCQkJCQkgICAga0VwbFNkb0NvbVN0YXRlQ2xpZW50V2FpdEluaXQ7CisJCQkJCS8vIGNhbGwgY2FsbGJhY2sgb2YgYXBwbGljYXRpb24KKwkJCQkJcFNkb0NvbUNvbi0+bV9kd0xhc3RBYm9ydENvZGUgPQorCQkJCQkgICAgRVBMX1NET0FDX1RJTUVfT1VUOworCQkJCQlSZXQgPQorCQkJCQkgICAgRXBsU2RvQ29tVHJhbnNmZXJGaW5pc2hlZAorCQkJCQkgICAgKFNkb0NvbUNvbl9wLCBwU2RvQ29tQ29uLAorCQkJCQkgICAgIGtFcGxTZG9Db21UcmFuc2Zlckxvd2VyTGF5ZXJBYm9ydCk7CisKKwkJCQl9CisKKwkJCWRlZmF1bHQ6CisJCQkJLy8gZC5rLiBkbyBub3RoaW5nCisJCQkJYnJlYWs7CisKKwkJCX0JLy8gZW5kIG9mIHN3aXRjaChTZG9Db21Db25FdmVudF9wKQorCisJCQlicmVhazsKKwkJfQorCisJCS8vIHByb2Nlc3Mgc2VnbWVudGVkIHRyYW5zZmVyCisJY2FzZSBrRXBsU2RvQ29tU3RhdGVDbGllbnRTZWdtVHJhbnM6CisJCXsKKwkJCS8vIGNoZWNrIGV2ZW50cworCQkJc3dpdGNoIChTZG9Db21Db25FdmVudF9wKSB7CisJCQkJLy8gc25lZCBhIGZyYW1lCisJCQljYXNlIGtFcGxTZG9Db21Db25FdmVudFNlbmRGaXJzdDoKKwkJCWNhc2Uga0VwbFNkb0NvbUNvbkV2ZW50QWNrUmVjZWl2ZWQ6CisJCQljYXNlIGtFcGxTZG9Db21Db25FdmVudEZyYW1lU2VuZGVkOgorCQkJCXsKKwkJCQkJUmV0ID0gRXBsU2RvQ29tQ2xpZW50U2VuZChwU2RvQ29tQ29uKTsKKwkJCQkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJCQkJZ290byBFeGl0OworCQkJCQl9CisJCQkJCS8vIGNoZWNrIGlmIHJlYWQgdHJhbnNmZXIgZmluaXNoZWQKKwkJCQkJaWYgKChwU2RvQ29tQ29uLT5tX3VpVHJhbnNTaXplID09IDApCisJCQkJCSAgICAmJiAocFNkb0NvbUNvbi0+bV9TZG9TZXJ2aWNlVHlwZSA9PQorCQkJCQkJa0VwbFNkb1NlcnZpY2VSZWFkQnlJbmRleCkpIHsKKwkJCQkJCS8vIGluYyB0cmFuc2FjdGlvbiBpZAorCQkJCQkJcFNkb0NvbUNvbi0+bV9iVHJhbnNhY3Rpb25JZCsrOworCQkJCQkJLy8gY2hhbmdlIHN0YXRlCisJCQkJCQlwU2RvQ29tQ29uLT5tX1Nkb0NvbVN0YXRlID0KKwkJCQkJCSAgICBrRXBsU2RvQ29tU3RhdGVDbGllbnRDb25uZWN0ZWQ7CisJCQkJCQkvLyBjYWxsIGNhbGxiYWNrIG9mIGFwcGxpY2F0aW9uCisJCQkJCQlwU2RvQ29tQ29uLT5tX2R3TGFzdEFib3J0Q29kZSA9CisJCQkJCQkgICAgMDsKKwkJCQkJCVJldCA9CisJCQkJCQkgICAgRXBsU2RvQ29tVHJhbnNmZXJGaW5pc2hlZAorCQkJCQkJICAgIChTZG9Db21Db25fcCwgcFNkb0NvbUNvbiwKKwkJCQkJCSAgICAga0VwbFNkb0NvbVRyYW5zZmVyRmluaXNoZWQpOworCisJCQkJCQlnb3RvIEV4aXQ7CisJCQkJCX0KKworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBmcmFtZSByZWNlaXZlZAorCQkJY2FzZSBrRXBsU2RvQ29tQ29uRXZlbnRSZWM6CisJCQkJeworCQkJCQkvLyBjaGVjayBpZiB0aGUgZnJhbWUgaXMgYSByZXNwb25zZQorCQkJCQliRmxhZyA9CisJCQkJCSAgICBBbWlHZXRCeXRlRnJvbUxlKCZwQXN5U2RvQ29tX3AtPgorCQkJCQkJCSAgICAgbV9sZV9iRmxhZ3MpOworCQkJCQlpZiAoKChiRmxhZyAmIDB4ODApICE9IDApCisJCQkJCSAgICAmJgorCQkJCQkgICAgKEFtaUdldEJ5dGVGcm9tTGUKKwkJCQkJICAgICAoJnBBc3lTZG9Db21fcC0+CisJCQkJCSAgICAgIG1fbGVfYlRyYW5zYWN0aW9uSWQpID09CisJCQkJCSAgICAgcFNkb0NvbUNvbi0+bV9iVHJhbnNhY3Rpb25JZCkpIHsKKwkJCQkJCS8vIGNoZWNrIGlmIGFib3J0IG9yIG5vdAorCQkJCQkJaWYgKChiRmxhZyAmIDB4NDApICE9IDApIHsKKwkJCQkJCQkvLyBzZW5kIGFja25vd2xlZGdlIHdpdGhvdXQgYW55IENvbW1hbmQgbGF5ZXIgZGF0YQorCQkJCQkJCVJldCA9CisJCQkJCQkJICAgIEVwbFNkb0FzeVNlcVNlbmREYXRhCisJCQkJCQkJICAgIChwU2RvQ29tQ29uLT4KKwkJCQkJCQkgICAgIG1fU2RvU2VxQ29uSGRsLCAwLAorCQkJCQkJCSAgICAgKHRFcGxGcmFtZSAqKQorCQkJCQkJCSAgICAgTlVMTCk7CisJCQkJCQkJLy8gaW5jIHRyYW5zYWN0aW9uIGlkCisJCQkJCQkJcFNkb0NvbUNvbi0+CisJCQkJCQkJICAgIG1fYlRyYW5zYWN0aW9uSWQrKzsKKwkJCQkJCQkvLyBjaGFuZ2Ugc3RhdGUKKwkJCQkJCQlwU2RvQ29tQ29uLT4KKwkJCQkJCQkgICAgbV9TZG9Db21TdGF0ZSA9CisJCQkJCQkJICAgIGtFcGxTZG9Db21TdGF0ZUNsaWVudENvbm5lY3RlZDsKKwkJCQkJCQkvLyBzYXZlIGFib3J0IGNvZGUKKwkJCQkJCQlwU2RvQ29tQ29uLT4KKwkJCQkJCQkgICAgbV9kd0xhc3RBYm9ydENvZGUgPQorCQkJCQkJCSAgICBBbWlHZXREd29yZEZyb21MZQorCQkJCQkJCSAgICAoJnBBc3lTZG9Db21fcC0+CisJCQkJCQkJICAgICBtX2xlX2FiQ29tbWFuZERhdGEKKwkJCQkJCQkgICAgIFswXSk7CisJCQkJCQkJLy8gY2FsbCBjYWxsYmFjayBvZiBhcHBsaWNhdGlvbgorCQkJCQkJCVJldCA9CisJCQkJCQkJICAgIEVwbFNkb0NvbVRyYW5zZmVyRmluaXNoZWQKKwkJCQkJCQkgICAgKFNkb0NvbUNvbl9wLAorCQkJCQkJCSAgICAgcFNkb0NvbUNvbiwKKwkJCQkJCQkgICAgIGtFcGxTZG9Db21UcmFuc2ZlclJ4QWJvcnRlZCk7CisKKwkJCQkJCQlnb3RvIEV4aXQ7CisJCQkJCQl9IGVsc2UgewkvLyBub3JtYWwgZnJhbWUgcmVjZWl2ZWQKKwkJCQkJCQkvLyBjaGVjayBmcmFtZQorCQkJCQkJCVJldCA9CisJCQkJCQkJICAgIEVwbFNkb0NvbUNsaWVudFByb2Nlc3NGcmFtZQorCQkJCQkJCSAgICAoU2RvQ29tQ29uX3AsCisJCQkJCQkJICAgICBwQXN5U2RvQ29tX3ApOworCisJCQkJCQkJLy8gY2hlY2sgaWYgdHJhbnNmZXIgcmVhZHkKKwkJCQkJCQlpZiAocFNkb0NvbUNvbi0+CisJCQkJCQkJICAgIG1fdWlUcmFuc1NpemUgPT0KKwkJCQkJCQkgICAgMCkgeworCQkJCQkJCQkvLyBzZW5kIGFja25vd2xlZGdlIHdpdGhvdXQgYW55IENvbW1hbmQgbGF5ZXIgZGF0YQorCQkJCQkJCQlSZXQgPQorCQkJCQkJCQkgICAgRXBsU2RvQXN5U2VxU2VuZERhdGEKKwkJCQkJCQkJICAgIChwU2RvQ29tQ29uLT4KKwkJCQkJCQkJICAgICBtX1Nkb1NlcUNvbkhkbCwKKwkJCQkJCQkJICAgICAwLAorCQkJCQkJCQkgICAgICh0RXBsRnJhbWUKKwkJCQkJCQkJICAgICAgKikgTlVMTCk7CisJCQkJCQkJCS8vIGluYyB0cmFuc2FjdGlvbiBpZAorCQkJCQkJCQlwU2RvQ29tQ29uLT4KKwkJCQkJCQkJICAgIG1fYlRyYW5zYWN0aW9uSWQrKzsKKwkJCQkJCQkJLy8gY2hhbmdlIHN0YXRlCisJCQkJCQkJCXBTZG9Db21Db24tPgorCQkJCQkJCQkgICAgbV9TZG9Db21TdGF0ZQorCQkJCQkJCQkgICAgPQorCQkJCQkJCQkgICAga0VwbFNkb0NvbVN0YXRlQ2xpZW50Q29ubmVjdGVkOworCQkJCQkJCQkvLyBjYWxsIGNhbGxiYWNrIG9mIGFwcGxpY2F0aW9uCisJCQkJCQkJCXBTZG9Db21Db24tPgorCQkJCQkJCQkgICAgbV9kd0xhc3RBYm9ydENvZGUKKwkJCQkJCQkJICAgID0gMDsKKwkJCQkJCQkJUmV0ID0KKwkJCQkJCQkJICAgIEVwbFNkb0NvbVRyYW5zZmVyRmluaXNoZWQKKwkJCQkJCQkJICAgIChTZG9Db21Db25fcCwKKwkJCQkJCQkJICAgICBwU2RvQ29tQ29uLAorCQkJCQkJCQkgICAgIGtFcGxTZG9Db21UcmFuc2ZlckZpbmlzaGVkKTsKKworCQkJCQkJCX0KKworCQkJCQkJfQorCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIGNvbm5lY3Rpb24gY2xvc2VkIGV2ZW50IGdvIGJhY2sgdG8ga0VwbFNkb0NvbVN0YXRlQ2xpZW50V2FpdEluaXQKKwkJCWNhc2Uga0VwbFNkb0NvbUNvbkV2ZW50Q29uQ2xvc2VkOgorCQkJCXsJLy8gY29ubmVjdGlvbiBjbG9zZWQgYnkgY29tbXVuaWNhdGlvbiBwYXJ0bmVyCisJCQkJCS8vIGNsb3NlIHNlcXVlbmNlIGxheWVyIGhhbmRsZQorCQkJCQlSZXQgPQorCQkJCQkgICAgRXBsU2RvQXN5U2VxRGVsQ29uKHBTZG9Db21Db24tPgorCQkJCQkJCSAgICAgICBtX1Nkb1NlcUNvbkhkbCk7CisJCQkJCS8vIHNldCBoYW5kbGUgdG8gaW52YWxpZCBhbmQgZW50ZXIga0VwbFNkb0NvbVN0YXRlQ2xpZW50V2FpdEluaXQKKwkJCQkJcFNkb0NvbUNvbi0+bV9TZG9TZXFDb25IZGwgfD0KKwkJCQkJICAgIEVQTF9TRE9fU0VRX0lOVkFMSURfSERMOworCQkJCQkvLyBjaGFuZ2Ugc3RhdGUKKwkJCQkJcFNkb0NvbUNvbi0+bV9TZG9Db21TdGF0ZSA9CisJCQkJCSAgICBrRXBsU2RvQ29tU3RhdGVDbGllbnRXYWl0SW5pdDsKKwkJCQkJLy8gaW5jIHRyYW5zYWN0aW9uIGlkCisJCQkJCXBTZG9Db21Db24tPm1fYlRyYW5zYWN0aW9uSWQrKzsKKwkJCQkJLy8gY2FsbCBjYWxsYmFjayBvZiBhcHBsaWNhdGlvbgorCQkJCQlwU2RvQ29tQ29uLT5tX2R3TGFzdEFib3J0Q29kZSA9IDA7CisJCQkJCVJldCA9CisJCQkJCSAgICBFcGxTZG9Db21UcmFuc2ZlckZpbmlzaGVkCisJCQkJCSAgICAoU2RvQ29tQ29uX3AsIHBTZG9Db21Db24sCisJCQkJCSAgICAga0VwbFNkb0NvbVRyYW5zZmVyRmluaXNoZWQpOworCisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIGFib3J0IHRvIHNlbmQgZnJvbSBoaWdoZXIgbGF5ZXIKKwkJCWNhc2Uga0VwbFNkb0NvbUNvbkV2ZW50QWJvcnQ6CisJCQkJeworCQkJCQlFcGxTZG9Db21DbGllbnRTZW5kQWJvcnQocFNkb0NvbUNvbiwKKwkJCQkJCQkJICooKERXT1JEICopCisJCQkJCQkJCSAgIHBTZG9Db21Db24tPgorCQkJCQkJCQkgICBtX3BEYXRhKSk7CisKKwkJCQkJLy8gaW5jIHRyYW5zYWN0aW9uIGlkCisJCQkJCXBTZG9Db21Db24tPm1fYlRyYW5zYWN0aW9uSWQrKzsKKwkJCQkJLy8gY2hhbmdlIHN0YXRlCisJCQkJCXBTZG9Db21Db24tPm1fU2RvQ29tU3RhdGUgPQorCQkJCQkgICAga0VwbFNkb0NvbVN0YXRlQ2xpZW50Q29ubmVjdGVkOworCQkJCQkvLyBjYWxsIGNhbGxiYWNrIG9mIGFwcGxpY2F0aW9uCisJCQkJCXBTZG9Db21Db24tPm1fZHdMYXN0QWJvcnRDb2RlID0KKwkJCQkJICAgICooKERXT1JEICopIHBTZG9Db21Db24tPm1fcERhdGEpOworCQkJCQlSZXQgPQorCQkJCQkgICAgRXBsU2RvQ29tVHJhbnNmZXJGaW5pc2hlZAorCQkJCQkgICAgKFNkb0NvbUNvbl9wLCBwU2RvQ29tQ29uLAorCQkJCQkgICAgIGtFcGxTZG9Db21UcmFuc2ZlclR4QWJvcnRlZCk7CisKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQljYXNlIGtFcGxTZG9Db21Db25FdmVudEluaXRFcnJvcjoKKwkJCWNhc2Uga0VwbFNkb0NvbUNvbkV2ZW50VGltZW91dDoKKwkJCQl7CisJCQkJCS8vIGNsb3NlIHNlcXVlbmNlIGxheWVyIGhhbmRsZQorCQkJCQlSZXQgPQorCQkJCQkgICAgRXBsU2RvQXN5U2VxRGVsQ29uKHBTZG9Db21Db24tPgorCQkJCQkJCSAgICAgICBtX1Nkb1NlcUNvbkhkbCk7CisJCQkJCXBTZG9Db21Db24tPm1fU2RvU2VxQ29uSGRsIHw9CisJCQkJCSAgICBFUExfU0RPX1NFUV9JTlZBTElEX0hETDsKKwkJCQkJLy8gY2hhbmdlIHN0YXRlCisJCQkJCXBTZG9Db21Db24tPm1fU2RvQ29tU3RhdGUgPQorCQkJCQkgICAga0VwbFNkb0NvbVN0YXRlQ2xpZW50V2FpdEluaXQ7CisJCQkJCS8vIGNhbGwgY2FsbGJhY2sgb2YgYXBwbGljYXRpb24KKwkJCQkJcFNkb0NvbUNvbi0+bV9kd0xhc3RBYm9ydENvZGUgPQorCQkJCQkgICAgRVBMX1NET0FDX1RJTUVfT1VUOworCQkJCQlSZXQgPQorCQkJCQkgICAgRXBsU2RvQ29tVHJhbnNmZXJGaW5pc2hlZAorCQkJCQkgICAgKFNkb0NvbUNvbl9wLCBwU2RvQ29tQ29uLAorCQkJCQkgICAgIGtFcGxTZG9Db21UcmFuc2Zlckxvd2VyTGF5ZXJBYm9ydCk7CisKKwkJCQl9CisKKwkJCWRlZmF1bHQ6CisJCQkJLy8gZC5rLiBkbyBub3RoaW5nCisJCQkJYnJlYWs7CisKKwkJCX0JLy8gZW5kIG9mIHN3aXRjaChTZG9Db21Db25FdmVudF9wKQorCisJCQlicmVhazsKKwkJfQorI2VuZGlmIC8vIGVuZG8gb2YgI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9TRE9DKSkgIT0gMCkKKworCX0JCQkvLyBlbmQgb2Ygc3dpdGNoKHBTZG9Db21Db24tPm1fU2RvQ29tU3RhdGUpCisKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfU0RPQykpICE9IDApCisgICAgICBFeGl0OgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKFdJTjMyKSB8fCBkZWZpbmVkKF9XSU4zMikKKwkvLyBsZWF2ZSBjcml0aWNhbCBzZWN0aW9uIGZvciBwcm9jZXNzIGZ1bmN0aW9uCisJRVBMX0RCR0xWTF9TRE9fVFJBQ0UwCisJICAgICgiXG5cdExlYXZlQ3JpdGljYWxTZWN0aW9uIEVwbFNkb0NvbVByb2Nlc3NJbnRlcm5cblxuIik7CisJTGVhdmVDcml0aWNhbFNlY3Rpb24oU2RvQ29tSW5zdGFuY2VfZy5tX3BDcml0aWNhbFNlY3Rpb24pOworCisjZW5kaWYKKworCXJldHVybiBSZXQ7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgICAgIEVwbFNkb0NvbVNlcnZlckluaXRSZWFkQnlJbmRleAorLy8KKy8vIERlc2NyaXB0aW9uOiAgICBmdW5jdGlvbiBzdGFydCB0aGUgcHJvY2Vzc2luZyBvZiBhbiByZWFkIGJ5IGluZGV4IGNvbW1hbmQKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6ICAgICAgcFNkb0NvbUNvbl9wICAgICA9IHBvaW50ZXIgdG8gY29udHJvbCBzdHJ1Y3R1cmUgb2YgY29ubmVjdGlvbgorLy8gICAgICAgICAgICAgICAgICBwQXN5U2RvQ29tX3AgICAgID0gcG9pbnRlciB0byByZWNlaXZlZCBmcmFtZQorLy8KKy8vIFJldHVybnM6ICAgICAgICAgdEVwbEtlcm5lbCAgPSAgZXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1NET1MpKSAhPSAwKQorc3RhdGljIHRFcGxLZXJuZWwgRXBsU2RvQ29tU2VydmVySW5pdFJlYWRCeUluZGV4KHRFcGxTZG9Db21Db24gKiBwU2RvQ29tQ29uX3AsCisJCQkJCQkgdEVwbEFzeVNkb0NvbSAqIHBBc3lTZG9Db21fcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKwl1bnNpZ25lZCBpbnQgdWlJbmRleDsKKwl1bnNpZ25lZCBpbnQgdWlTdWJpbmRleDsKKwl0RXBsT2JkU2l6ZSBFbnRyeVNpemU7CisJdEVwbE9iZEFjY2VzcyBBY2Nlc3NUeXBlOworCURXT1JEIGR3QWJvcnRDb2RlOworCisJZHdBYm9ydENvZGUgPSAwOworCisJLy8gYSBpbml0IG9mIGEgcmVhZCBjb3VsZCBub3QgYmUgYSBzZWdtZW50ZWQgdHJhbnNmZXIKKwkvLyAtPiBubyB2YXJpYWJsZSBwYXJ0IG9mIGhlYWRlcgorCisJLy8gZ2V0IGluZGV4IGFuZCBzdWJpbmRleAorCXVpSW5kZXggPSBBbWlHZXRXb3JkRnJvbUxlKCZwQXN5U2RvQ29tX3AtPm1fbGVfYWJDb21tYW5kRGF0YVswXSk7CisJdWlTdWJpbmRleCA9IEFtaUdldEJ5dGVGcm9tTGUoJnBBc3lTZG9Db21fcC0+bV9sZV9hYkNvbW1hbmREYXRhWzJdKTsKKworCS8vIGNoZWNrIGFjY2Vzc3R5cGUgb2YgZW50cnkKKwkvLyBleGlzdGVucyBvZiBlbnRyeQorLy8jaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX09CRFUpKSAhPSAwKQorCVJldCA9IEVwbE9iZHVHZXRBY2Nlc3NUeXBlKHVpSW5kZXgsIHVpU3ViaW5kZXgsICZBY2Nlc3NUeXBlKTsKKy8qI2Vsc2UKKyAgICBSZXQgPSBrRXBsT2JkU3ViaW5kZXhOb3RFeGlzdDsKKyAgICBBY2Nlc3NUeXBlID0gMDsKKyNlbmRpZiovCisJaWYgKFJldCA9PSBrRXBsT2JkU3ViaW5kZXhOb3RFeGlzdCkgewkvLyBzdWJlbnRyeSBkb2Vzbid0IGV4aXN0CisJCWR3QWJvcnRDb2RlID0gRVBMX1NET0FDX1NVQl9JTkRFWF9OT1RfRVhJU1Q7CisJCS8vIHNlbmQgYWJvcnQKKwkJcFNkb0NvbUNvbl9wLT5tX3BEYXRhID0gKEJZVEUgKikgJiBkd0Fib3J0Q29kZTsKKwkJUmV0ID0gRXBsU2RvQ29tU2VydmVyU2VuZEZyYW1lSW50ZXJuKHBTZG9Db21Db25fcCwKKwkJCQkJCSAgICAgdWlJbmRleCwKKwkJCQkJCSAgICAgdWlTdWJpbmRleCwKKwkJCQkJCSAgICAga0VwbFNkb0NvbVNlbmRUeXBlQWJvcnQpOworCQlnb3RvIEV4aXQ7CisJfSBlbHNlIGlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsJLy8gZW50cnkgZG9lc24ndCBleGlzdAorCQlkd0Fib3J0Q29kZSA9IEVQTF9TRE9BQ19PQkpFQ1RfTk9UX0VYSVNUOworCQkvLyBzZW5kIGFib3J0CisJCXBTZG9Db21Db25fcC0+bV9wRGF0YSA9IChCWVRFICopICYgZHdBYm9ydENvZGU7CisJCVJldCA9IEVwbFNkb0NvbVNlcnZlclNlbmRGcmFtZUludGVybihwU2RvQ29tQ29uX3AsCisJCQkJCQkgICAgIHVpSW5kZXgsCisJCQkJCQkgICAgIHVpU3ViaW5kZXgsCisJCQkJCQkgICAgIGtFcGxTZG9Db21TZW5kVHlwZUFib3J0KTsKKwkJZ290byBFeGl0OworCX0KKwkvLyBjb21wYXJlIGFjY2Vzc3R5cGUgbXVzdCBiZSByZWFkIG9yIGNvbnN0CisJaWYgKCgoQWNjZXNzVHlwZSAmIGtFcGxPYmRBY2NSZWFkKSA9PSAwKQorCSAgICAmJiAoKEFjY2Vzc1R5cGUgJiBrRXBsT2JkQWNjQ29uc3QpID09IDApKSB7CisKKwkJaWYgKChBY2Nlc3NUeXBlICYga0VwbE9iZEFjY1dyaXRlKSAhPSAwKSB7CisJCQkvLyBlbnRyeSByZWFkIGEgd3JpdGUgb25seSBvYmplY3QKKwkJCWR3QWJvcnRDb2RlID0gRVBMX1NET0FDX1JFQURfVE9fV1JJVEVfT05MWV9PQko7CisJCX0gZWxzZSB7CisJCQlkd0Fib3J0Q29kZSA9IEVQTF9TRE9BQ19VTlNVUFBPUlRFRF9BQ0NFU1M7CisJCX0KKwkJLy8gc2VuZCBhYm9ydAorCQlwU2RvQ29tQ29uX3AtPm1fcERhdGEgPSAoQllURSAqKSAmIGR3QWJvcnRDb2RlOworCQlSZXQgPSBFcGxTZG9Db21TZXJ2ZXJTZW5kRnJhbWVJbnRlcm4ocFNkb0NvbUNvbl9wLAorCQkJCQkJICAgICB1aUluZGV4LAorCQkJCQkJICAgICB1aVN1YmluZGV4LAorCQkJCQkJICAgICBrRXBsU2RvQ29tU2VuZFR5cGVBYm9ydCk7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gc2F2ZSBzZXJ2aWNlCisJcFNkb0NvbUNvbl9wLT5tX1Nkb1NlcnZpY2VUeXBlID0ga0VwbFNkb1NlcnZpY2VSZWFkQnlJbmRleDsKKworCS8vIGdldCBzaXplIG9mIG9iamVjdCB0byBzZWUgaW9mIHNlZ21lbnRlZCBvciBleHBlZGl0ZWQgdHJhbnNmZXIKKy8vI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9PQkRVKSkgIT0gMCkKKwlFbnRyeVNpemUgPSBFcGxPYmR1R2V0RGF0YVNpemUodWlJbmRleCwgdWlTdWJpbmRleCk7CisvKiNlbHNlCisgICAgRW50cnlTaXplID0gMDsKKyNlbmRpZiovCisJaWYgKEVudHJ5U2l6ZSA+IEVQTF9TRE9fTUFYX1BBWUxPQUQpIHsJLy8gc2VnbWVudGVkIHRyYW5zZmVyCisJCXBTZG9Db21Db25fcC0+bV9TZG9UcmFuc1R5cGUgPSBrRXBsU2RvVHJhbnNTZWdtZW50ZWQ7CisJCS8vIGdldCBwb2ludGVyIHRvIG9iamVjdC1lbnRyeSBkYXRhCisvLyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfT0JEVSkpICE9IDApCisJCXBTZG9Db21Db25fcC0+bV9wRGF0YSA9CisJCSAgICBFcGxPYmR1R2V0T2JqZWN0RGF0YVB0cih1aUluZGV4LCB1aVN1YmluZGV4KTsKKy8vI2VuZGlmCisJfSBlbHNlIHsJCS8vIGV4cGVkaXRlZCB0cmFuc2ZlcgorCQlwU2RvQ29tQ29uX3AtPm1fU2RvVHJhbnNUeXBlID0ga0VwbFNkb1RyYW5zRXhwZWRpdGVkOworCX0KKworCXBTZG9Db21Db25fcC0+bV91aVRyYW5zU2l6ZSA9IEVudHJ5U2l6ZTsKKwlwU2RvQ29tQ29uX3AtPm1fdWlUcmFuc2ZlcnJlZEJ5dGUgPSAwOworCisJUmV0ID0gRXBsU2RvQ29tU2VydmVyU2VuZEZyYW1lSW50ZXJuKHBTZG9Db21Db25fcCwKKwkJCQkJICAgICB1aUluZGV4LAorCQkJCQkgICAgIHVpU3ViaW5kZXgsIGtFcGxTZG9Db21TZW5kVHlwZVJlcyk7CisJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkvLyBlcnJvciAtPiBhYm9ydAorCQlkd0Fib3J0Q29kZSA9IEVQTF9TRE9BQ19HRU5FUkFMX0VSUk9SOworCQkvLyBzZW5kIGFib3J0CisJCXBTZG9Db21Db25fcC0+bV9wRGF0YSA9IChCWVRFICopICYgZHdBYm9ydENvZGU7CisJCVJldCA9IEVwbFNkb0NvbVNlcnZlclNlbmRGcmFtZUludGVybihwU2RvQ29tQ29uX3AsCisJCQkJCQkgICAgIHVpSW5kZXgsCisJCQkJCQkgICAgIHVpU3ViaW5kZXgsCisJCQkJCQkgICAgIGtFcGxTZG9Db21TZW5kVHlwZUFib3J0KTsKKwkJZ290byBFeGl0OworCX0KKworICAgICAgRXhpdDoKKwlyZXR1cm4gUmV0OworfQorI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgICAgICBFcGxTZG9Db21TZXJ2ZXJTZW5kRnJhbWVJbnRlcm4oKTsKKy8vCisvLyBEZXNjcmlwdGlvbjogICAgZnVuY3Rpb24gY3JlYXRzIGFuZCBzZW5kIGEgZnJhbWUgZm9yIHNlcnZlcgorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczogICAgICBwU2RvQ29tQ29uX3AgICAgID0gcG9pbnRlciB0byBjb250cm9sIHN0cnVjdHVyZSBvZiBjb25uZWN0aW9uCisvLyAgICAgICAgICAgICAgICAgIHVpSW5kZXhfcCAgICAgICAgPSBpbmRleCB0byBzZW5kIGlmIGV4cGVkaXRlZCB0cmFuc2ZlciBlbHNlIDAKKy8vICAgICAgICAgICAgICAgICAgdWlTdWJJbmRleF9wICAgICA9IHN1YmluZGV4IHRvIHNlbmQgaWYgZXhwZWRpdGVkIHRyYW5zZmVyIGVsc2UgMAorLy8gICAgICAgICAgICAgICAgICBTZW5kVHlwZV9wICAgICAgID0gdG8gb2YgZnJhbWUgdG8gc2VuZAorLy8KKy8vIFJldHVybnM6ICAgICAgICAgdEVwbEtlcm5lbCAgPSAgZXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1NET1MpKSAhPSAwKQorc3RhdGljIHRFcGxLZXJuZWwgRXBsU2RvQ29tU2VydmVyU2VuZEZyYW1lSW50ZXJuKHRFcGxTZG9Db21Db24gKiBwU2RvQ29tQ29uX3AsCisJCQkJCQkgdW5zaWduZWQgaW50IHVpSW5kZXhfcCwKKwkJCQkJCSB1bnNpZ25lZCBpbnQgdWlTdWJJbmRleF9wLAorCQkJCQkJIHRFcGxTZG9Db21TZW5kVHlwZSBTZW5kVHlwZV9wKQoreworCXRFcGxLZXJuZWwgUmV0OworCUJZVEUgYWJGcmFtZVtFUExfTUFYX1NET19GUkFNRV9TSVpFXTsKKwl0RXBsRnJhbWUgKnBGcmFtZTsKKwl0RXBsQXN5U2RvQ29tICpwQ29tbWFuZEZyYW1lOworCXVuc2lnbmVkIGludCB1aVNpemVPZkZyYW1lOworCUJZVEUgYkZsYWc7CisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCXBGcmFtZSA9ICh0RXBsRnJhbWUgKikgJiBhYkZyYW1lWzBdOworCisJRVBMX01FTVNFVCgmYWJGcmFtZVswXSwgMHgwMCwgc2l6ZW9mKGFiRnJhbWUpKTsKKworCS8vIGJ1aWxkIGdlbmVyaWMgcGFydCBvZiBmcmFtZQorCS8vIGdldCBwb2ludGVyIHRvIGNvbW1hbmQgbGF5ZXJwYXJ0IG9mIGZyYW1lCisJcENvbW1hbmRGcmFtZSA9CisJICAgICZwRnJhbWUtPm1fRGF0YS5tX0FzbmQubV9QYXlsb2FkLm1fU2RvU2VxdWVuY2VGcmFtZS4KKwkgICAgbV9sZV9hYlNkb1NlcVBheWxvYWQ7CisJQW1pU2V0Qnl0ZVRvTGUoJnBDb21tYW5kRnJhbWUtPm1fbGVfYkNvbW1hbmRJZCwKKwkJICAgICAgIHBTZG9Db21Db25fcC0+bV9TZG9TZXJ2aWNlVHlwZSk7CisJQW1pU2V0Qnl0ZVRvTGUoJnBDb21tYW5kRnJhbWUtPm1fbGVfYlRyYW5zYWN0aW9uSWQsCisJCSAgICAgICBwU2RvQ29tQ29uX3AtPm1fYlRyYW5zYWN0aW9uSWQpOworCisJLy8gc2V0IHNpemUgdG8gaGVhZGVyIHNpemUKKwl1aVNpemVPZkZyYW1lID0gODsKKworCS8vIGNoZWNrIFNlbmRUeXBlCisJc3dpdGNoIChTZW5kVHlwZV9wKSB7CisJCS8vIHJlcXVlc3RmcmFtZSB0byBzZW5kCisJY2FzZSBrRXBsU2RvQ29tU2VuZFR5cGVSZXE6CisJCXsKKwkJCS8vIG5vdGhpbmcgdG8gZG8gZm9yIHNlcnZlcgorCQkJLy8tPiBlcnJvcgorCQkJUmV0ID0ga0VwbFNkb0NvbUludmFsaWRTZW5kVHlwZTsKKwkJCWJyZWFrOworCQl9CisKKwkJLy8gcmVzcG9uc2Ugd2l0aG91dCBkYXRhIHRvIHNlbmQKKwljYXNlIGtFcGxTZG9Db21TZW5kVHlwZUFja1JlczoKKwkJeworCQkJLy8gc2V0IHJlc3BvbnNlIGZsYWcKKwkJCUFtaVNldEJ5dGVUb0xlKCZwQ29tbWFuZEZyYW1lLT5tX2xlX2JGbGFncywgMHg4MCk7CisKKwkJCS8vIHNlbmQgZnJhbWUKKwkJCVJldCA9IEVwbFNkb0FzeVNlcVNlbmREYXRhKHBTZG9Db21Db25fcC0+bV9TZG9TZXFDb25IZGwsCisJCQkJCQkgICB1aVNpemVPZkZyYW1lLCBwRnJhbWUpOworCisJCQlicmVhazsKKwkJfQorCisJCS8vIHJlc3BvbnNmcmFtZSB0byBzZW5kCisJY2FzZSBrRXBsU2RvQ29tU2VuZFR5cGVSZXM6CisJCXsKKwkJCS8vIHNldCByZXNwb25zZSBmbGFnCisJCQliRmxhZyA9IEFtaUdldEJ5dGVGcm9tTGUoJnBDb21tYW5kRnJhbWUtPm1fbGVfYkZsYWdzKTsKKwkJCWJGbGFnIHw9IDB4ODA7CisJCQlBbWlTZXRCeXRlVG9MZSgmcENvbW1hbmRGcmFtZS0+bV9sZV9iRmxhZ3MsIGJGbGFnKTsKKworCQkJLy8gY2hlY2sgdHlwZSBvZiByZXNvbnNlCisJCQlpZiAocFNkb0NvbUNvbl9wLT5tX1Nkb1RyYW5zVHlwZSA9PSBrRXBsU2RvVHJhbnNFeHBlZGl0ZWQpIHsJLy8gRXhwZWRpdGVkIHRyYW5zZmVyCisJCQkJLy8gY29weSBkYXRhIGluIGZyYW1lCisvLyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfT0JEVSkpICE9IDApCisJCQkJUmV0ID0gRXBsT2JkdVJlYWRFbnRyeVRvTGUodWlJbmRleF9wLAorCQkJCQkJCSAgIHVpU3ViSW5kZXhfcCwKKwkJCQkJCQkgICAmcENvbW1hbmRGcmFtZS0+CisJCQkJCQkJICAgbV9sZV9hYkNvbW1hbmREYXRhCisJCQkJCQkJICAgWzBdLAorCQkJCQkJCSAgICh0RXBsT2JkU2l6ZSAqKSAmCisJCQkJCQkJICAgcFNkb0NvbUNvbl9wLT4KKwkJCQkJCQkgICBtX3VpVHJhbnNTaXplKTsKKwkJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQkJCWdvdG8gRXhpdDsKKwkJCQl9CisvLyNlbmRpZgorCisJCQkJLy8gc2V0IHNpemUgb2YgZnJhbWUKKwkJCQlBbWlTZXRXb3JkVG9MZSgmcENvbW1hbmRGcmFtZS0+CisJCQkJCSAgICAgICBtX2xlX3dTZWdtZW50U2l6ZSwKKwkJCQkJICAgICAgIChXT1JEKSBwU2RvQ29tQ29uX3AtPgorCQkJCQkgICAgICAgbV91aVRyYW5zU2l6ZSk7CisKKwkJCQkvLyBjb3JyZWN0IGJ5dGUtY291bnRlcgorCQkJCXVpU2l6ZU9mRnJhbWUgKz0gcFNkb0NvbUNvbl9wLT5tX3VpVHJhbnNTaXplOworCQkJCXBTZG9Db21Db25fcC0+bV91aVRyYW5zZmVycmVkQnl0ZSArPQorCQkJCSAgICBwU2RvQ29tQ29uX3AtPm1fdWlUcmFuc1NpemU7CisJCQkJcFNkb0NvbUNvbl9wLT5tX3VpVHJhbnNTaXplID0gMDsKKworCQkJCS8vIHNlbmQgZnJhbWUKKwkJCQl1aVNpemVPZkZyYW1lICs9IHBTZG9Db21Db25fcC0+bV91aVRyYW5zU2l6ZTsKKwkJCQlSZXQgPQorCQkJCSAgICBFcGxTZG9Bc3lTZXFTZW5kRGF0YShwU2RvQ29tQ29uX3AtPgorCQkJCQkJCSBtX1Nkb1NlcUNvbkhkbCwKKwkJCQkJCQkgdWlTaXplT2ZGcmFtZSwgcEZyYW1lKTsKKwkJCX0gZWxzZSBpZiAocFNkb0NvbUNvbl9wLT5tX1Nkb1RyYW5zVHlwZSA9PSBrRXBsU2RvVHJhbnNTZWdtZW50ZWQpIHsJLy8gc2VnbWVudGVkIHRyYW5zZmVyCisJCQkJLy8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBpbml0LCBzZWdtZW50IGFuZCBjb21wbGV0ZQorCQkJCWlmIChwU2RvQ29tQ29uX3AtPm1fdWlUcmFuc2ZlcnJlZEJ5dGUgPT0gMCkgewkvLyBpbml0CisJCQkJCS8vIHNldCBpbml0IGZsYWcKKwkJCQkJYkZsYWcgPQorCQkJCQkgICAgQW1pR2V0Qnl0ZUZyb21MZSgmcENvbW1hbmRGcmFtZS0+CisJCQkJCQkJICAgICBtX2xlX2JGbGFncyk7CisJCQkJCWJGbGFnIHw9IDB4MTA7CisJCQkJCUFtaVNldEJ5dGVUb0xlKCZwQ29tbWFuZEZyYW1lLT4KKwkJCQkJCSAgICAgICBtX2xlX2JGbGFncywgYkZsYWcpOworCQkJCQkvLyBpbml0IHZhcmlhYmxlIGhlYWRlcgorCQkJCQlBbWlTZXREd29yZFRvTGUoJnBDb21tYW5kRnJhbWUtPgorCQkJCQkJCW1fbGVfYWJDb21tYW5kRGF0YVswXSwKKwkJCQkJCQlwU2RvQ29tQ29uX3AtPgorCQkJCQkJCW1fdWlUcmFuc1NpemUpOworCQkJCQkvLyBjb3B5IGRhdGEgaW4gZnJhbWUKKwkJCQkJRVBMX01FTUNQWSgmcENvbW1hbmRGcmFtZS0+CisJCQkJCQkgICBtX2xlX2FiQ29tbWFuZERhdGFbNF0sCisJCQkJCQkgICBwU2RvQ29tQ29uX3AtPm1fcERhdGEsCisJCQkJCQkgICAoRVBMX1NET19NQVhfUEFZTE9BRCAtIDQpKTsKKworCQkJCQkvLyBjb3JyZWN0IGJ5dGUtY291bnRlcgorCQkJCQlwU2RvQ29tQ29uX3AtPm1fdWlUcmFuc1NpemUgLT0KKwkJCQkJICAgIChFUExfU0RPX01BWF9QQVlMT0FEIC0gNCk7CisJCQkJCXBTZG9Db21Db25fcC0+bV91aVRyYW5zZmVycmVkQnl0ZSArPQorCQkJCQkgICAgKEVQTF9TRE9fTUFYX1BBWUxPQUQgLSA0KTsKKwkJCQkJLy8gbW92ZSBkYXRhIHBvaW50ZXIKKwkJCQkJcFNkb0NvbUNvbl9wLT5tX3BEYXRhICs9CisJCQkJCSAgICAoRVBMX1NET19NQVhfUEFZTE9BRCAtIDQpOworCisJCQkJCS8vIHNldCBzZWdtZW50IHNpemUKKwkJCQkJQW1pU2V0V29yZFRvTGUoJnBDb21tYW5kRnJhbWUtPgorCQkJCQkJICAgICAgIG1fbGVfd1NlZ21lbnRTaXplLAorCQkJCQkJICAgICAgIChFUExfU0RPX01BWF9QQVlMT0FEIC0KKwkJCQkJCQk0KSk7CisKKwkJCQkJLy8gc2VuZCBmcmFtZQorCQkJCQl1aVNpemVPZkZyYW1lICs9IEVQTF9TRE9fTUFYX1BBWUxPQUQ7CisJCQkJCVJldCA9CisJCQkJCSAgICBFcGxTZG9Bc3lTZXFTZW5kRGF0YShwU2RvQ29tQ29uX3AtPgorCQkJCQkJCQkgbV9TZG9TZXFDb25IZGwsCisJCQkJCQkJCSB1aVNpemVPZkZyYW1lLAorCQkJCQkJCQkgcEZyYW1lKTsKKworCQkJCX0gZWxzZQorCQkJCSAgICBpZiAoKHBTZG9Db21Db25fcC0+bV91aVRyYW5zZmVycmVkQnl0ZSA+IDApCisJCQkJCSYmIChwU2RvQ29tQ29uX3AtPm1fdWlUcmFuc1NpemUgPiBFUExfU0RPX01BWF9QQVlMT0FEKSkgewkvLyBzZWdtZW50CisJCQkJCS8vIHNldCBzZWdtZW50IGZsYWcKKwkJCQkJYkZsYWcgPQorCQkJCQkgICAgQW1pR2V0Qnl0ZUZyb21MZSgmcENvbW1hbmRGcmFtZS0+CisJCQkJCQkJICAgICBtX2xlX2JGbGFncyk7CisJCQkJCWJGbGFnIHw9IDB4MjA7CisJCQkJCUFtaVNldEJ5dGVUb0xlKCZwQ29tbWFuZEZyYW1lLT4KKwkJCQkJCSAgICAgICBtX2xlX2JGbGFncywgYkZsYWcpOworCisJCQkJCS8vIGNvcHkgZGF0YSBpbiBmcmFtZQorCQkJCQlFUExfTUVNQ1BZKCZwQ29tbWFuZEZyYW1lLT4KKwkJCQkJCSAgIG1fbGVfYWJDb21tYW5kRGF0YVswXSwKKwkJCQkJCSAgIHBTZG9Db21Db25fcC0+bV9wRGF0YSwKKwkJCQkJCSAgIEVQTF9TRE9fTUFYX1BBWUxPQUQpOworCisJCQkJCS8vIGNvcnJlY3QgYnl0ZS1jb3VudGVyCisJCQkJCXBTZG9Db21Db25fcC0+bV91aVRyYW5zU2l6ZSAtPQorCQkJCQkgICAgRVBMX1NET19NQVhfUEFZTE9BRDsKKwkJCQkJcFNkb0NvbUNvbl9wLT5tX3VpVHJhbnNmZXJyZWRCeXRlICs9CisJCQkJCSAgICBFUExfU0RPX01BWF9QQVlMT0FEOworCQkJCQkvLyBtb3ZlIGRhdGEgcG9pbnRlcgorCQkJCQlwU2RvQ29tQ29uX3AtPm1fcERhdGEgKz0KKwkJCQkJICAgIEVQTF9TRE9fTUFYX1BBWUxPQUQ7CisKKwkJCQkJLy8gc2V0IHNlZ21lbnQgc2l6ZQorCQkJCQlBbWlTZXRXb3JkVG9MZSgmcENvbW1hbmRGcmFtZS0+CisJCQkJCQkgICAgICAgbV9sZV93U2VnbWVudFNpemUsCisJCQkJCQkgICAgICAgRVBMX1NET19NQVhfUEFZTE9BRCk7CisKKwkJCQkJLy8gc2VuZCBmcmFtZQorCQkJCQl1aVNpemVPZkZyYW1lICs9IEVQTF9TRE9fTUFYX1BBWUxPQUQ7CisJCQkJCVJldCA9CisJCQkJCSAgICBFcGxTZG9Bc3lTZXFTZW5kRGF0YShwU2RvQ29tQ29uX3AtPgorCQkJCQkJCQkgbV9TZG9TZXFDb25IZGwsCisJCQkJCQkJCSB1aVNpemVPZkZyYW1lLAorCQkJCQkJCQkgcEZyYW1lKTsKKwkJCQl9IGVsc2UgeworCQkJCQlpZiAoKHBTZG9Db21Db25fcC0+bV91aVRyYW5zU2l6ZSA9PSAwKQorCQkJCQkgICAgJiYgKHBTZG9Db21Db25fcC0+CisJCQkJCQltX1Nkb1NlcnZpY2VUeXBlICE9CisJCQkJCQlrRXBsU2RvU2VydmljZVdyaXRlQnlJbmRleCkpIHsKKwkJCQkJCWdvdG8gRXhpdDsKKwkJCQkJfQorCQkJCQkvLyBjb21wbGV0ZQorCQkJCQkvLyBzZXQgc2VnbWVudCBjb21wbGV0ZSBmbGFnCisJCQkJCWJGbGFnID0KKwkJCQkJICAgIEFtaUdldEJ5dGVGcm9tTGUoJnBDb21tYW5kRnJhbWUtPgorCQkJCQkJCSAgICAgbV9sZV9iRmxhZ3MpOworCQkJCQliRmxhZyB8PSAweDMwOworCQkJCQlBbWlTZXRCeXRlVG9MZSgmcENvbW1hbmRGcmFtZS0+CisJCQkJCQkgICAgICAgbV9sZV9iRmxhZ3MsIGJGbGFnKTsKKworCQkJCQkvLyBjb3B5IGRhdGEgaW4gZnJhbWUKKwkJCQkJRVBMX01FTUNQWSgmcENvbW1hbmRGcmFtZS0+CisJCQkJCQkgICBtX2xlX2FiQ29tbWFuZERhdGFbMF0sCisJCQkJCQkgICBwU2RvQ29tQ29uX3AtPm1fcERhdGEsCisJCQkJCQkgICBwU2RvQ29tQ29uX3AtPm1fdWlUcmFuc1NpemUpOworCisJCQkJCS8vIGNvcnJlY3QgYnl0ZS1jb3VudGVyCisJCQkJCXBTZG9Db21Db25fcC0+bV91aVRyYW5zZmVycmVkQnl0ZSArPQorCQkJCQkgICAgcFNkb0NvbUNvbl9wLT5tX3VpVHJhbnNTaXplOworCisJCQkJCS8vIG1vdmUgZGF0YSBwb2ludGVyCisJCQkJCXBTZG9Db21Db25fcC0+bV9wRGF0YSArPQorCQkJCQkgICAgcFNkb0NvbUNvbl9wLT5tX3VpVHJhbnNTaXplOworCisJCQkJCS8vIHNldCBzZWdtZW50IHNpemUKKwkJCQkJQW1pU2V0V29yZFRvTGUoJnBDb21tYW5kRnJhbWUtPgorCQkJCQkJICAgICAgIG1fbGVfd1NlZ21lbnRTaXplLAorCQkJCQkJICAgICAgIChXT1JEKSBwU2RvQ29tQ29uX3AtPgorCQkJCQkJICAgICAgIG1fdWlUcmFuc1NpemUpOworCisJCQkJCS8vIHNlbmQgZnJhbWUKKwkJCQkJdWlTaXplT2ZGcmFtZSArPQorCQkJCQkgICAgcFNkb0NvbUNvbl9wLT5tX3VpVHJhbnNTaXplOworCQkJCQlwU2RvQ29tQ29uX3AtPm1fdWlUcmFuc1NpemUgPSAwOworCQkJCQlSZXQgPQorCQkJCQkgICAgRXBsU2RvQXN5U2VxU2VuZERhdGEocFNkb0NvbUNvbl9wLT4KKwkJCQkJCQkJIG1fU2RvU2VxQ29uSGRsLAorCQkJCQkJCQkgdWlTaXplT2ZGcmFtZSwKKwkJCQkJCQkJIHBGcmFtZSk7CisJCQkJfQorCisJCQl9CisJCQlicmVhazsKKwkJfQorCQkvLyBhYm9ydCB0byBzZW5kCisJY2FzZSBrRXBsU2RvQ29tU2VuZFR5cGVBYm9ydDoKKwkJeworCQkJLy8gc2V0IHJlc3BvbnNlIGFuZCBhYm9ydCBmbGFnCisJCQliRmxhZyA9IEFtaUdldEJ5dGVGcm9tTGUoJnBDb21tYW5kRnJhbWUtPm1fbGVfYkZsYWdzKTsKKwkJCWJGbGFnIHw9IDB4QzA7CisJCQlBbWlTZXRCeXRlVG9MZSgmcENvbW1hbmRGcmFtZS0+bV9sZV9iRmxhZ3MsIGJGbGFnKTsKKworCQkJLy8gY29weSBhYm9ydGNvZGUgdG8gZnJhbWUKKwkJCUFtaVNldER3b3JkVG9MZSgmcENvbW1hbmRGcmFtZS0+bV9sZV9hYkNvbW1hbmREYXRhWzBdLAorCQkJCQkqKChEV09SRCAqKSBwU2RvQ29tQ29uX3AtPm1fcERhdGEpKTsKKworCQkJLy8gc2V0IHNpemUgb2Ygc2VnbWVudAorCQkJQW1pU2V0V29yZFRvTGUoJnBDb21tYW5kRnJhbWUtPm1fbGVfd1NlZ21lbnRTaXplLAorCQkJCSAgICAgICBzaXplb2YoRFdPUkQpKTsKKworCQkJLy8gdXBkYXRlIGNvdW50ZXIKKwkJCXBTZG9Db21Db25fcC0+bV91aVRyYW5zZmVycmVkQnl0ZSA9IHNpemVvZihEV09SRCk7CisJCQlwU2RvQ29tQ29uX3AtPm1fdWlUcmFuc1NpemUgPSAwOworCisJCQkvLyBjYWxjIGZyYW1lc2l6ZQorCQkJdWlTaXplT2ZGcmFtZSArPSBzaXplb2YoRFdPUkQpOworCQkJUmV0ID0gRXBsU2RvQXN5U2VxU2VuZERhdGEocFNkb0NvbUNvbl9wLT5tX1Nkb1NlcUNvbkhkbCwKKwkJCQkJCSAgIHVpU2l6ZU9mRnJhbWUsIHBGcmFtZSk7CisJCQlicmVhazsKKwkJfQorCX0JCQkvLyBlbmQgb2Ygc3dpdGNoKFNlbmRUeXBlX3ApCisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIFJldDsKK30KKyNlbmRpZgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgICAgIEVwbFNkb0NvbVNlcnZlckluaXRXcml0ZUJ5SW5kZXgKKy8vCisvLyBEZXNjcmlwdGlvbjogICAgZnVuY3Rpb24gc3RhcnQgdGhlIHByb2Nlc3Npbmcgb2YgYW4gd3JpdGUgYnkgaW5kZXggY29tbWFuZAorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczogICAgICBwU2RvQ29tQ29uX3AgICAgID0gcG9pbnRlciB0byBjb250cm9sIHN0cnVjdHVyZSBvZiBjb25uZWN0aW9uCisvLyAgICAgICAgICAgICAgICAgIHBBc3lTZG9Db21fcCAgICAgPSBwb2ludGVyIHRvIHJlY2VpdmVkIGZyYW1lCisvLworLy8gUmV0dXJuczogICAgICAgICB0RXBsS2VybmVsICA9ICBlcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfU0RPUykpICE9IDApCitzdGF0aWMgdEVwbEtlcm5lbCBFcGxTZG9Db21TZXJ2ZXJJbml0V3JpdGVCeUluZGV4KHRFcGxTZG9Db21Db24gKiBwU2RvQ29tQ29uX3AsCisJCQkJCQkgIHRFcGxBc3lTZG9Db20gKiBwQXN5U2RvQ29tX3ApCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwl1bnNpZ25lZCBpbnQgdWlJbmRleDsKKwl1bnNpZ25lZCBpbnQgdWlTdWJpbmRleDsKKwl1bnNpZ25lZCBpbnQgdWlCeXRlc1RvVHJhbnNmZXI7CisJdEVwbE9iZFNpemUgRW50cnlTaXplOworCXRFcGxPYmRBY2Nlc3MgQWNjZXNzVHlwZTsKKwlEV09SRCBkd0Fib3J0Q29kZTsKKwlCWVRFICpwYlNyY0RhdGE7CisKKwlkd0Fib3J0Q29kZSA9IDA7CisKKwkvLyBhIGluaXQgb2YgYSB3cml0ZQorCS8vIC0+IHZhcmlhYmxlIHBhcnQgb2YgaGVhZGVyIHBvc3NpYmxlCisKKwkvLyBjaGVjayBpZiBleHBlZGl0ZWQgb3Igc2VnbWVudGVkIHRyYW5zZmVyCisJaWYgKChwQXN5U2RvQ29tX3AtPm1fbGVfYkZsYWdzICYgMHgzMCkgPT0gMHgxMCkgewkvLyBpbml0aWF0ZSBzZWdtZW50ZWQgdHJhbnNmZXIKKwkJcFNkb0NvbUNvbl9wLT5tX1Nkb1RyYW5zVHlwZSA9IGtFcGxTZG9UcmFuc1NlZ21lbnRlZDsKKwkJLy8gZ2V0IGluZGV4IGFuZCBzdWJpbmRleAorCQl1aUluZGV4ID0KKwkJICAgIEFtaUdldFdvcmRGcm9tTGUoJnBBc3lTZG9Db21fcC0+bV9sZV9hYkNvbW1hbmREYXRhWzRdKTsKKwkJdWlTdWJpbmRleCA9CisJCSAgICBBbWlHZXRCeXRlRnJvbUxlKCZwQXN5U2RvQ29tX3AtPm1fbGVfYWJDb21tYW5kRGF0YVs2XSk7CisJCS8vIGdldCBzb3VyY2UtcG9pbnRlciBmb3IgY29weQorCQlwYlNyY0RhdGEgPSAmcEFzeVNkb0NvbV9wLT5tX2xlX2FiQ29tbWFuZERhdGFbOF07CisJCS8vIHNhdmUgc2l6ZQorCQlwU2RvQ29tQ29uX3AtPm1fdWlUcmFuc1NpemUgPQorCQkgICAgQW1pR2V0RHdvcmRGcm9tTGUoJnBBc3lTZG9Db21fcC0+bV9sZV9hYkNvbW1hbmREYXRhWzBdKTsKKworCX0gZWxzZSBpZiAoKHBBc3lTZG9Db21fcC0+bV9sZV9iRmxhZ3MgJiAweDMwKSA9PSAweDAwKSB7CS8vIGV4cGVkaXRlZCB0cmFuc2ZlcgorCQlwU2RvQ29tQ29uX3AtPm1fU2RvVHJhbnNUeXBlID0ga0VwbFNkb1RyYW5zRXhwZWRpdGVkOworCQkvLyBnZXQgaW5kZXggYW5kIHN1YmluZGV4CisJCXVpSW5kZXggPQorCQkgICAgQW1pR2V0V29yZEZyb21MZSgmcEFzeVNkb0NvbV9wLT5tX2xlX2FiQ29tbWFuZERhdGFbMF0pOworCQl1aVN1YmluZGV4ID0KKwkJICAgIEFtaUdldEJ5dGVGcm9tTGUoJnBBc3lTZG9Db21fcC0+bV9sZV9hYkNvbW1hbmREYXRhWzJdKTsKKwkJLy8gZ2V0IHNvdXJjZS1wb2ludGVyIGZvciBjb3B5CisJCXBiU3JjRGF0YSA9ICZwQXN5U2RvQ29tX3AtPm1fbGVfYWJDb21tYW5kRGF0YVs0XTsKKwkJLy8gc2F2ZSBzaXplCisJCXBTZG9Db21Db25fcC0+bV91aVRyYW5zU2l6ZSA9CisJCSAgICBBbWlHZXRXb3JkRnJvbUxlKCZwQXN5U2RvQ29tX3AtPm1fbGVfd1NlZ21lbnRTaXplKTsKKwkJLy8gc3VidHJhY3QgaGVhZGVyCisJCXBTZG9Db21Db25fcC0+bV91aVRyYW5zU2l6ZSAtPSA0OworCisJfSBlbHNlIHsKKwkJLy8ganVzdCBpZ25vcmUgYW55IG90aGVyIHRyYW5zZmVyIHR5cGUKKwkJZ290byBFeGl0OworCX0KKworCS8vIGNoZWNrIGFjY2Vzc3R5cGUgb2YgZW50cnkKKwkvLyBleGlzdGVucyBvZiBlbnRyeQorLy8jaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX09CRFUpKSAhPSAwKQorCVJldCA9IEVwbE9iZHVHZXRBY2Nlc3NUeXBlKHVpSW5kZXgsIHVpU3ViaW5kZXgsICZBY2Nlc3NUeXBlKTsKKy8qI2Vsc2UKKyAgICBSZXQgPSBrRXBsT2JkU3ViaW5kZXhOb3RFeGlzdDsKKyAgICBBY2Nlc3NUeXBlID0gMDsKKyNlbmRpZiovCisJaWYgKFJldCA9PSBrRXBsT2JkU3ViaW5kZXhOb3RFeGlzdCkgewkvLyBzdWJlbnRyeSBkb2Vzbid0IGV4aXN0CisJCXBTZG9Db21Db25fcC0+bV9kd0xhc3RBYm9ydENvZGUgPSBFUExfU0RPQUNfU1VCX0lOREVYX05PVF9FWElTVDsKKwkJLy8gc2VuZCBhYm9ydAorCQkvLyBkLmsuIFRoaXMgaXMgd3Jvbmc6IGsudC4gbm90IG5lZWRlZCBzZW5kIGFib3J0IG9uIGVuZCBvZiB3cml0ZQorCQkvKnBTZG9Db21Db25fcC0+bV9wRGF0YSA9IChCWVRFKilwU2RvQ29tQ29uX3AtPm1fZHdMYXN0QWJvcnRDb2RlOworCQkgICBSZXQgPSBFcGxTZG9Db21TZXJ2ZXJTZW5kRnJhbWVJbnRlcm4ocFNkb0NvbUNvbl9wLAorCQkgICB1aUluZGV4LAorCQkgICB1aVN1YmluZGV4LAorCQkgICBrRXBsU2RvQ29tU2VuZFR5cGVBYm9ydCk7ICovCisJCWdvdG8gQWJvcnQ7CisJfSBlbHNlIGlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsJLy8gZW50cnkgZG9lc24ndCBleGlzdAorCQlwU2RvQ29tQ29uX3AtPm1fZHdMYXN0QWJvcnRDb2RlID0gRVBMX1NET0FDX09CSkVDVF9OT1RfRVhJU1Q7CisJCS8vIHNlbmQgYWJvcnQKKwkJLy8gZC5rLiBUaGlzIGlzIHdyb25nOiBrLnQuIG5vdCBuZWVkZWQgc2VuZCBhYm9ydCBvbiBlbmQgb2Ygd3JpdGUKKwkJLyoKKwkJICAgcFNkb0NvbUNvbl9wLT5tX3BEYXRhID0gKEJZVEUqKSZkd0Fib3J0Q29kZTsKKwkJICAgUmV0ID0gRXBsU2RvQ29tU2VydmVyU2VuZEZyYW1lSW50ZXJuKHBTZG9Db21Db25fcCwKKwkJICAgdWlJbmRleCwKKwkJICAgdWlTdWJpbmRleCwKKwkJICAga0VwbFNkb0NvbVNlbmRUeXBlQWJvcnQpOyAqLworCQlnb3RvIEFib3J0OworCX0KKwkvLyBjb21wYXJlIGFjY2Vzc3R5cGUgbXVzdCBiZSByZWFkCisJaWYgKChBY2Nlc3NUeXBlICYga0VwbE9iZEFjY1dyaXRlKSA9PSAwKSB7CisKKwkJaWYgKChBY2Nlc3NUeXBlICYga0VwbE9iZEFjY1JlYWQpICE9IDApIHsKKwkJCS8vIGVudHJ5IHdyaXRlIGEgcmVhZCBvbmx5IG9iamVjdAorCQkJcFNkb0NvbUNvbl9wLT5tX2R3TGFzdEFib3J0Q29kZSA9CisJCQkgICAgRVBMX1NET0FDX1dSSVRFX1RPX1JFQURfT05MWV9PQko7CisJCX0gZWxzZSB7CisJCQlwU2RvQ29tQ29uX3AtPm1fZHdMYXN0QWJvcnRDb2RlID0KKwkJCSAgICBFUExfU0RPQUNfVU5TVVBQT1JURURfQUNDRVNTOworCQl9CisJCS8vIHNlbmQgYWJvcnQKKwkJLy8gZC5rLiBUaGlzIGlzIHdyb25nOiBrLnQuIG5vdCBuZWVkZWQgc2VuZCBhYm9ydCBvbiBlbmQgb2Ygd3JpdGUKKwkJLypwU2RvQ29tQ29uX3AtPm1fcERhdGEgPSAoQllURSopJmR3QWJvcnRDb2RlOworCQkgICBSZXQgPSBFcGxTZG9Db21TZXJ2ZXJTZW5kRnJhbWVJbnRlcm4ocFNkb0NvbUNvbl9wLAorCQkgICB1aUluZGV4LAorCQkgICB1aVN1YmluZGV4LAorCQkgICBrRXBsU2RvQ29tU2VuZFR5cGVBYm9ydCk7ICovCisJCWdvdG8gQWJvcnQ7CisJfQorCS8vIHNhdmUgc2VydmljZQorCXBTZG9Db21Db25fcC0+bV9TZG9TZXJ2aWNlVHlwZSA9IGtFcGxTZG9TZXJ2aWNlV3JpdGVCeUluZGV4OworCisJcFNkb0NvbUNvbl9wLT5tX3VpVHJhbnNmZXJyZWRCeXRlID0gMDsKKworCS8vIHdyaXRlIGRhdGEgdG8gT0QKKwlpZiAocFNkb0NvbUNvbl9wLT5tX1Nkb1RyYW5zVHlwZSA9PSBrRXBsU2RvVHJhbnNFeHBlZGl0ZWQpIHsJLy8gZXhwZWRpdGVkIHRyYW5zZmVyCisJCS8vIHNpemUgY2hlY2tpbmcgaXMgZG9uZSBieSBFcGxPYmR1V3JpdGVFbnRyeUZyb21MZSgpCisKKy8vI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9PQkRVKSkgIT0gMCkKKwkJUmV0ID0gRXBsT2JkdVdyaXRlRW50cnlGcm9tTGUodWlJbmRleCwKKwkJCQkJICAgICAgdWlTdWJpbmRleCwKKwkJCQkJICAgICAgcGJTcmNEYXRhLAorCQkJCQkgICAgICBwU2RvQ29tQ29uX3AtPm1fdWlUcmFuc1NpemUpOworCQlzd2l0Y2ggKFJldCkgeworCQljYXNlIGtFcGxTdWNjZXNzZnVsOgorCQkJeworCQkJCWJyZWFrOworCQkJfQorCisJCWNhc2Uga0VwbE9iZEFjY2Vzc1Zpb2xhdGlvbjoKKwkJCXsKKwkJCQlwU2RvQ29tQ29uX3AtPm1fZHdMYXN0QWJvcnRDb2RlID0KKwkJCQkgICAgRVBMX1NET0FDX1VOU1VQUE9SVEVEX0FDQ0VTUzsKKwkJCQkvLyBzZW5kIGFib3J0CisJCQkJZ290byBBYm9ydDsKKwkJCX0KKworCQljYXNlIGtFcGxPYmRWYWx1ZUxlbmd0aEVycm9yOgorCQkJeworCQkJCXBTZG9Db21Db25fcC0+bV9kd0xhc3RBYm9ydENvZGUgPQorCQkJCSAgICBFUExfU0RPQUNfREFUQV9UWVBFX0xFTkdUSF9OT1RfTUFUQ0g7CisJCQkJLy8gc2VuZCBhYm9ydAorCQkJCWdvdG8gQWJvcnQ7CisJCQl9CisKKwkJY2FzZSBrRXBsT2JkVmFsdWVUb29IaWdoOgorCQkJeworCQkJCXBTZG9Db21Db25fcC0+bV9kd0xhc3RBYm9ydENvZGUgPQorCQkJCSAgICBFUExfU0RPQUNfVkFMVUVfUkFOR0VfVE9PX0hJR0g7CisJCQkJLy8gc2VuZCBhYm9ydAorCQkJCWdvdG8gQWJvcnQ7CisJCQl9CisKKwkJY2FzZSBrRXBsT2JkVmFsdWVUb29Mb3c6CisJCQl7CisJCQkJcFNkb0NvbUNvbl9wLT5tX2R3TGFzdEFib3J0Q29kZSA9CisJCQkJICAgIEVQTF9TRE9BQ19WQUxVRV9SQU5HRV9UT09fTE9XOworCQkJCS8vIHNlbmQgYWJvcnQKKwkJCQlnb3RvIEFib3J0OworCQkJfQorCisJCWRlZmF1bHQ6CisJCQl7CisJCQkJcFNkb0NvbUNvbl9wLT5tX2R3TGFzdEFib3J0Q29kZSA9CisJCQkJICAgIEVQTF9TRE9BQ19HRU5FUkFMX0VSUk9SOworCQkJCS8vIHNlbmQgYWJvcnQKKwkJCQlnb3RvIEFib3J0OworCQkJfQorCQl9CisvLyNlbmRpZgorCQkvLyBzZW5kIGNvbW1hbmQgYWNrbm93bGVkZ2UKKwkJUmV0ID0gRXBsU2RvQ29tU2VydmVyU2VuZEZyYW1lSW50ZXJuKHBTZG9Db21Db25fcCwKKwkJCQkJCSAgICAgMCwKKwkJCQkJCSAgICAgMCwKKwkJCQkJCSAgICAga0VwbFNkb0NvbVNlbmRUeXBlQWNrUmVzKTsKKworCQlwU2RvQ29tQ29uX3AtPm1fdWlUcmFuc1NpemUgPSAwOworCQlnb3RvIEV4aXQ7CisJfSBlbHNlIHsKKwkJLy8gZ2V0IHNpemUgb2YgdGhlIG9iamVjdCB0byBjaGVjayBpZiBpdCBmaXRzCisJCS8vIGJlY2F1c2Ugd2UgZGlyZWN0bHkgd3JpdGUgdG8gdGhlIGRlc3RpbmF0aW9uIG1lbW9yeQorCQkvLyBkLmsuIG5vIG9uZSBjYWxscyB0aGUgdXNlciBPRCBjYWxsYmFjayBmdW5jdGlvbgorCisJCS8vI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9PQkRVKSkgIT0gMCkKKwkJRW50cnlTaXplID0gRXBsT2JkdUdldERhdGFTaXplKHVpSW5kZXgsIHVpU3ViaW5kZXgpOworCQkvKiNlbHNlCisJCSAgIEVudHJ5U2l6ZSA9IDA7CisJCSAgICNlbmRpZiAqLworCQlpZiAoRW50cnlTaXplIDwgcFNkb0NvbUNvbl9wLT5tX3VpVHJhbnNTaXplKSB7CS8vIHBhcmFtZXRlciB0b28gYmlnCisJCQlwU2RvQ29tQ29uX3AtPm1fZHdMYXN0QWJvcnRDb2RlID0KKwkJCSAgICBFUExfU0RPQUNfREFUQV9UWVBFX0xFTkdUSF9UT09fSElHSDsKKwkJCS8vIHNlbmQgYWJvcnQKKwkJCS8vIGQuay4gVGhpcyBpcyB3cm9uZzogay50LiBub3QgbmVlZGVkIHNlbmQgYWJvcnQgb24gZW5kIG9mIHdyaXRlCisJCQkvKnBTZG9Db21Db25fcC0+bV9wRGF0YSA9IChCWVRFKikmZHdBYm9ydENvZGU7CisJCQkgICBSZXQgPSBFcGxTZG9Db21TZXJ2ZXJTZW5kRnJhbWVJbnRlcm4ocFNkb0NvbUNvbl9wLAorCQkJICAgdWlJbmRleCwKKwkJCSAgIHVpU3ViaW5kZXgsCisJCQkgICBrRXBsU2RvQ29tU2VuZFR5cGVBYm9ydCk7ICovCisJCQlnb3RvIEFib3J0OworCQl9CisKKwkJdWlCeXRlc1RvVHJhbnNmZXIgPQorCQkgICAgQW1pR2V0V29yZEZyb21MZSgmcEFzeVNkb0NvbV9wLT5tX2xlX3dTZWdtZW50U2l6ZSk7CisJCS8vIGVsZW1pbmF0ZSBoZWFkZXIgKENvbW1hbmQgaGVhZGVyICg4KSArIHZhcmlhYmxlIHBhcnQgKDQpICsgQ29tbWFuZCBoZWFkZXIgKDQpKQorCQl1aUJ5dGVzVG9UcmFuc2ZlciAtPSAxNjsKKwkJLy8gZ2V0IHBvaW50ZXIgdG8gb2JqZWN0IGVudHJ5CisvLyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfT0JEVSkpICE9IDApCisJCXBTZG9Db21Db25fcC0+bV9wRGF0YSA9IEVwbE9iZHVHZXRPYmplY3REYXRhUHRyKHVpSW5kZXgsCisJCQkJCQkJCXVpU3ViaW5kZXgpOworLy8jZW5kaWYKKwkJaWYgKHBTZG9Db21Db25fcC0+bV9wRGF0YSA9PSBOVUxMKSB7CisJCQlwU2RvQ29tQ29uX3AtPm1fZHdMYXN0QWJvcnRDb2RlID0KKwkJCSAgICBFUExfU0RPQUNfR0VORVJBTF9FUlJPUjsKKwkJCS8vIHNlbmQgYWJvcnQKKwkJCS8vIGQuay4gVGhpcyBpcyB3cm9uZzogay50LiBub3QgbmVlZGVkIHNlbmQgYWJvcnQgb24gZW5kIG9mIHdyaXRlCisvKiAgICAgICAgICAgIHBTZG9Db21Db25fcC0+bV9wRGF0YSA9IChCWVRFKikmcFNkb0NvbUNvbl9wLT5tX2R3TGFzdEFib3J0Q29kZTsKKyAgICAgICAgICAgIFJldCA9IEVwbFNkb0NvbVNlcnZlclNlbmRGcmFtZUludGVybihwU2RvQ29tQ29uX3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aVN1YmluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtFcGxTZG9Db21TZW5kVHlwZUFib3J0KTsqLworCQkJZ290byBBYm9ydDsKKwkJfQorCQkvLyBjb3B5IGRhdGEKKwkJRVBMX01FTUNQWShwU2RvQ29tQ29uX3AtPm1fcERhdGEsIHBiU3JjRGF0YSwgdWlCeXRlc1RvVHJhbnNmZXIpOworCisJCS8vIHVwZGF0ZSBpbnRlcm5hbCBjb3VudGVyCisJCXBTZG9Db21Db25fcC0+bV91aVRyYW5zZmVycmVkQnl0ZSA9IHVpQnl0ZXNUb1RyYW5zZmVyOworCQlwU2RvQ29tQ29uX3AtPm1fdWlUcmFuc1NpemUgLT0gdWlCeXRlc1RvVHJhbnNmZXI7CisKKwkJLy8gdXBkYXRlIHRhcmdldCBwb2ludGVyCisJCSggLyooQllURSopICovIHBTZG9Db21Db25fcC0+bV9wRGF0YSkgKz0gdWlCeXRlc1RvVHJhbnNmZXI7CisKKwkJLy8gc2VuZCBhY2tub3dsZWRnZSB3aXRob3V0IGFueSBDb21tYW5kIGxheWVyIGRhdGEKKwkJUmV0ID0gRXBsU2RvQXN5U2VxU2VuZERhdGEocFNkb0NvbUNvbl9wLT5tX1Nkb1NlcUNvbkhkbCwKKwkJCQkJICAgMCwgKHRFcGxGcmFtZSAqKSBOVUxMKTsKKwkJZ290byBFeGl0OworCX0KKworICAgICAgQWJvcnQ6CisJaWYgKHBTZG9Db21Db25fcC0+bV9kd0xhc3RBYm9ydENvZGUgIT0gMCkgeworCQkvLyBzZW5kIGFib3J0CisJCXBTZG9Db21Db25fcC0+bV9wRGF0YSA9CisJCSAgICAoQllURSAqKSAmIHBTZG9Db21Db25fcC0+bV9kd0xhc3RBYm9ydENvZGU7CisJCVJldCA9CisJCSAgICBFcGxTZG9Db21TZXJ2ZXJTZW5kRnJhbWVJbnRlcm4ocFNkb0NvbUNvbl9wLCB1aUluZGV4LAorCQkJCQkJICAgdWlTdWJpbmRleCwKKwkJCQkJCSAgIGtFcGxTZG9Db21TZW5kVHlwZUFib3J0KTsKKworCQkvLyByZXNldCBhYm9ydCBjb2RlCisJCXBTZG9Db21Db25fcC0+bV9kd0xhc3RBYm9ydENvZGUgPSAwOworCQlwU2RvQ29tQ29uX3AtPm1fdWlUcmFuc1NpemUgPSAwOworCQlnb3RvIEV4aXQ7CisJfQorCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7Cit9CisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgICAgIEVwbFNkb0NvbUNsaWVudFNlbmQKKy8vCisvLyBEZXNjcmlwdGlvbjogICAgZnVuY3Rpb24gc3RhcnRzIGFuIHNkbyB0cmFuc2ZlciBhbiBzZW5kIGFsbCBmdXJ0aGVyIGZyYW1lcworLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczogICAgICBwU2RvQ29tQ29uX3AgICAgID0gcG9pbnRlciB0byBjb250cm9sIHN0cnVjdHVyZSBvZiBjb25uZWN0aW9uCisvLworLy8gUmV0dXJuczogICAgICAgICB0RXBsS2VybmVsICA9ICBlcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfU0RPQykpICE9IDApCitzdGF0aWMgdEVwbEtlcm5lbCBFcGxTZG9Db21DbGllbnRTZW5kKHRFcGxTZG9Db21Db24gKiBwU2RvQ29tQ29uX3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisJQllURSBhYkZyYW1lW0VQTF9NQVhfU0RPX0ZSQU1FX1NJWkVdOworCXRFcGxGcmFtZSAqcEZyYW1lOworCXRFcGxBc3lTZG9Db20gKnBDb21tYW5kRnJhbWU7CisJdW5zaWduZWQgaW50IHVpU2l6ZU9mRnJhbWU7CisJQllURSBiRmxhZ3M7CisJQllURSAqcGJQYXlsb2FkOworCisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwlwRnJhbWUgPSAodEVwbEZyYW1lICopICYgYWJGcmFtZVswXTsKKworCUVQTF9NRU1TRVQoJmFiRnJhbWVbMF0sIDB4MDAsIHNpemVvZihhYkZyYW1lKSk7CisKKwkvLyBidWlsZCBnZW5lcmljIHBhcnQgb2YgZnJhbWUKKwkvLyBnZXQgcG9pbnRlciB0byBjb21tYW5kIGxheWVycGFydCBvZiBmcmFtZQorCXBDb21tYW5kRnJhbWUgPQorCSAgICAmcEZyYW1lLT5tX0RhdGEubV9Bc25kLm1fUGF5bG9hZC5tX1Nkb1NlcXVlbmNlRnJhbWUuCisJICAgIG1fbGVfYWJTZG9TZXFQYXlsb2FkOworCUFtaVNldEJ5dGVUb0xlKCZwQ29tbWFuZEZyYW1lLT5tX2xlX2JDb21tYW5kSWQsCisJCSAgICAgICBwU2RvQ29tQ29uX3AtPm1fU2RvU2VydmljZVR5cGUpOworCUFtaVNldEJ5dGVUb0xlKCZwQ29tbWFuZEZyYW1lLT5tX2xlX2JUcmFuc2FjdGlvbklkLAorCQkgICAgICAgcFNkb0NvbUNvbl9wLT5tX2JUcmFuc2FjdGlvbklkKTsKKworCS8vIHNldCBzaXplIGNvbnN0YW50IHBhcnQgb2YgaGVhZGVyCisJdWlTaXplT2ZGcmFtZSA9IDg7CisKKwkvLyBjaGVjayBpZiBmaXJzdCBmcmFtZSB0byBzZW5kIC0+IGNvbW1hbmQgaGVhZGVyIG5lZWRlZAorCWlmIChwU2RvQ29tQ29uX3AtPm1fdWlUcmFuc1NpemUgPiAwKSB7CisJCWlmIChwU2RvQ29tQ29uX3AtPm1fdWlUcmFuc2ZlcnJlZEJ5dGUgPT0gMCkgewkvLyBzdGFydCBTRE8gdHJhbnNmZXIKKwkJCS8vIGNoZWNrIGlmIHNlZ21lbnRlZCBvciBleHBlZGl0ZWQgdHJhbnNmZXIKKwkJCS8vIG9ubHkgZm9yIHdyaXRlIGNvbW1hbmRzCisJCQlzd2l0Y2ggKHBTZG9Db21Db25fcC0+bV9TZG9TZXJ2aWNlVHlwZSkgeworCQkJY2FzZSBrRXBsU2RvU2VydmljZVJlYWRCeUluZGV4OgorCQkJCXsJLy8gZmlyc3QgZnJhbWUgb2YgcmVhZCBhY2Nlc3MgYWx3YXlzIGV4cGVkaXRlZAorCQkJCQlwU2RvQ29tQ29uX3AtPm1fU2RvVHJhbnNUeXBlID0KKwkJCQkJICAgIGtFcGxTZG9UcmFuc0V4cGVkaXRlZDsKKwkJCQkJcGJQYXlsb2FkID0KKwkJCQkJICAgICZwQ29tbWFuZEZyYW1lLT4KKwkJCQkJICAgIG1fbGVfYWJDb21tYW5kRGF0YVswXTsKKwkJCQkJLy8gZmlsbCByZXN0IG9mIGhlYWRlcgorCQkJCQlBbWlTZXRXb3JkVG9MZSgmcENvbW1hbmRGcmFtZS0+CisJCQkJCQkgICAgICAgbV9sZV93U2VnbWVudFNpemUsIDQpOworCisJCQkJCS8vIGNyZWF0ZSBjb21tYW5kIGhlYWRlcgorCQkJCQlBbWlTZXRXb3JkVG9MZShwYlBheWxvYWQsCisJCQkJCQkgICAgICAgKFdPUkQpIHBTZG9Db21Db25fcC0+CisJCQkJCQkgICAgICAgbV91aVRhcmdldEluZGV4KTsKKwkJCQkJcGJQYXlsb2FkICs9IDI7CisJCQkJCUFtaVNldEJ5dGVUb0xlKHBiUGF5bG9hZCwKKwkJCQkJCSAgICAgICAoQllURSkgcFNkb0NvbUNvbl9wLT4KKwkJCQkJCSAgICAgICBtX3VpVGFyZ2V0U3ViSW5kZXgpOworCQkJCQkvLyBjYWxjIHNpemUKKwkJCQkJdWlTaXplT2ZGcmFtZSArPSA0OworCisJCQkJCS8vIHNldCBwU2RvQ29tQ29uX3AtPm1fdWlUcmFuc2ZlcnJlZEJ5dGUgdG8gb25lCisJCQkJCXBTZG9Db21Db25fcC0+bV91aVRyYW5zZmVycmVkQnl0ZSA9IDE7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJY2FzZSBrRXBsU2RvU2VydmljZVdyaXRlQnlJbmRleDoKKwkJCQl7CisJCQkJCWlmIChwU2RvQ29tQ29uX3AtPm1fdWlUcmFuc1NpemUgPiBFUExfU0RPX01BWF9QQVlMT0FEKSB7CS8vIHNlZ21lbnRlZCB0cmFuc2ZlcgorCQkJCQkJLy8gLT4gdmFyaWFibGUgcGFydCBvZiBoZWFkZXIgbmVlZGVkCisJCQkJCQkvLyBzYXZlIHRoYXQgdHJhbnNmZXIgaXMgc2VnbWVudGVkCisJCQkJCQlwU2RvQ29tQ29uX3AtPm1fU2RvVHJhbnNUeXBlID0KKwkJCQkJCSAgICBrRXBsU2RvVHJhbnNTZWdtZW50ZWQ7CisJCQkJCQkvLyBmaWxsIHZhcmlhYmxlIHBhcnQgb2YgaGVhZGVyCisJCQkJCQlBbWlTZXREd29yZFRvTGUoJnBDb21tYW5kRnJhbWUtPgorCQkJCQkJCQltX2xlX2FiQ29tbWFuZERhdGEKKwkJCQkJCQkJWzBdLAorCQkJCQkJCQlwU2RvQ29tQ29uX3AtPgorCQkJCQkJCQltX3VpVHJhbnNTaXplKTsKKwkJCQkJCS8vIHNldCBwb2ludGVyIHRvIHJlYWwgcGF5bG9hZAorCQkJCQkJcGJQYXlsb2FkID0KKwkJCQkJCSAgICAmcENvbW1hbmRGcmFtZS0+CisJCQkJCQkgICAgbV9sZV9hYkNvbW1hbmREYXRhWzRdOworCQkJCQkJLy8gZmlsbCByZXN0IG9mIGhlYWRlcgorCQkJCQkJQW1pU2V0V29yZFRvTGUoJnBDb21tYW5kRnJhbWUtPgorCQkJCQkJCSAgICAgICBtX2xlX3dTZWdtZW50U2l6ZSwKKwkJCQkJCQkgICAgICAgRVBMX1NET19NQVhfUEFZTE9BRCk7CisJCQkJCQliRmxhZ3MgPSAweDEwOworCQkJCQkJQW1pU2V0Qnl0ZVRvTGUoJnBDb21tYW5kRnJhbWUtPgorCQkJCQkJCSAgICAgICBtX2xlX2JGbGFncywKKwkJCQkJCQkgICAgICAgYkZsYWdzKTsKKwkJCQkJCS8vIGNyZWF0ZSBjb21tYW5kIGhlYWRlcgorCQkJCQkJQW1pU2V0V29yZFRvTGUocGJQYXlsb2FkLAorCQkJCQkJCSAgICAgICAoV09SRCkKKwkJCQkJCQkgICAgICAgcFNkb0NvbUNvbl9wLT4KKwkJCQkJCQkgICAgICAgbV91aVRhcmdldEluZGV4KTsKKwkJCQkJCXBiUGF5bG9hZCArPSAyOworCQkJCQkJQW1pU2V0Qnl0ZVRvTGUocGJQYXlsb2FkLAorCQkJCQkJCSAgICAgICAoQllURSkKKwkJCQkJCQkgICAgICAgcFNkb0NvbUNvbl9wLT4KKwkJCQkJCQkgICAgICAgbV91aVRhcmdldFN1YkluZGV4KTsKKwkJCQkJCS8vIG9uIGJ5dGUgZm9yIHJlc2VydmVkCisJCQkJCQlwYlBheWxvYWQgKz0gMjsKKwkJCQkJCS8vIGNhbGMgc2l6ZQorCQkJCQkJdWlTaXplT2ZGcmFtZSArPQorCQkJCQkJICAgIEVQTF9TRE9fTUFYX1BBWUxPQUQ7CisKKwkJCQkJCS8vIGNvcHkgcGF5bG9hZAorCQkJCQkJRVBMX01FTUNQWShwYlBheWxvYWQsCisJCQkJCQkJICAgcFNkb0NvbUNvbl9wLT4KKwkJCQkJCQkgICBtX3BEYXRhLAorCQkJCQkJCSAgIChFUExfU0RPX01BWF9QQVlMT0FECisJCQkJCQkJICAgIC0gOCkpOworCQkJCQkJcFNkb0NvbUNvbl9wLT5tX3BEYXRhICs9CisJCQkJCQkgICAgKEVQTF9TRE9fTUFYX1BBWUxPQUQgLSA4KTsKKwkJCQkJCS8vIGNvcnJlY3QgaW50ZXJuIGNvdW50ZXIKKwkJCQkJCXBTZG9Db21Db25fcC0+bV91aVRyYW5zU2l6ZSAtPQorCQkJCQkJICAgIChFUExfU0RPX01BWF9QQVlMT0FEIC0gOCk7CisJCQkJCQlwU2RvQ29tQ29uX3AtPgorCQkJCQkJICAgIG1fdWlUcmFuc2ZlcnJlZEJ5dGUgPQorCQkJCQkJICAgIChFUExfU0RPX01BWF9QQVlMT0FEIC0gOCk7CisKKwkJCQkJfSBlbHNlIHsJLy8gZXhwZWRpdGVkIHRyYW5kc2ZlcgorCQkJCQkJLy8gc2F2ZSB0aGF0IHRyYW5zZmVyIGlzIGV4cGVkaXRlZAorCQkJCQkJcFNkb0NvbUNvbl9wLT5tX1Nkb1RyYW5zVHlwZSA9CisJCQkJCQkgICAga0VwbFNkb1RyYW5zRXhwZWRpdGVkOworCQkJCQkJcGJQYXlsb2FkID0KKwkJCQkJCSAgICAmcENvbW1hbmRGcmFtZS0+CisJCQkJCQkgICAgbV9sZV9hYkNvbW1hbmREYXRhWzBdOworCisJCQkJCQkvLyBjcmVhdGUgY29tbWFuZCBoZWFkZXIKKwkJCQkJCUFtaVNldFdvcmRUb0xlKHBiUGF5bG9hZCwKKwkJCQkJCQkgICAgICAgKFdPUkQpCisJCQkJCQkJICAgICAgIHBTZG9Db21Db25fcC0+CisJCQkJCQkJICAgICAgIG1fdWlUYXJnZXRJbmRleCk7CisJCQkJCQlwYlBheWxvYWQgKz0gMjsKKwkJCQkJCUFtaVNldEJ5dGVUb0xlKHBiUGF5bG9hZCwKKwkJCQkJCQkgICAgICAgKEJZVEUpCisJCQkJCQkJICAgICAgIHBTZG9Db21Db25fcC0+CisJCQkJCQkJICAgICAgIG1fdWlUYXJnZXRTdWJJbmRleCk7CisJCQkJCQkvLyArIDIgLT4gb25lIGJ5dGUgZm9yIHN1YmluZGV4IGFuZCBvbmUgYnl0ZSByZXNlcnZlZAorCQkJCQkJcGJQYXlsb2FkICs9IDI7CisJCQkJCQkvLyBjb3B5IGRhdGEKKwkJCQkJCUVQTF9NRU1DUFkocGJQYXlsb2FkLAorCQkJCQkJCSAgIHBTZG9Db21Db25fcC0+CisJCQkJCQkJICAgbV9wRGF0YSwKKwkJCQkJCQkgICBwU2RvQ29tQ29uX3AtPgorCQkJCQkJCSAgIG1fdWlUcmFuc1NpemUpOworCQkJCQkJLy8gY2FsYyBzaXplCisJCQkJCQl1aVNpemVPZkZyYW1lICs9CisJCQkJCQkgICAgKDQgKworCQkJCQkJICAgICBwU2RvQ29tQ29uX3AtPgorCQkJCQkJICAgICBtX3VpVHJhbnNTaXplKTsKKwkJCQkJCS8vIGZpbGwgcmVzdCBvZiBoZWFkZXIKKwkJCQkJCUFtaVNldFdvcmRUb0xlKCZwQ29tbWFuZEZyYW1lLT4KKwkJCQkJCQkgICAgICAgbV9sZV93U2VnbWVudFNpemUsCisJCQkJCQkJICAgICAgIChXT1JEKSAoNCArCisJCQkJCQkJCSAgICAgICBwU2RvQ29tQ29uX3AtPgorCQkJCQkJCQkgICAgICAgbV91aVRyYW5zU2l6ZSkpOworCisJCQkJCQlwU2RvQ29tQ29uX3AtPgorCQkJCQkJICAgIG1fdWlUcmFuc2ZlcnJlZEJ5dGUgPQorCQkJCQkJICAgIHBTZG9Db21Db25fcC0+bV91aVRyYW5zU2l6ZTsKKwkJCQkJCXBTZG9Db21Db25fcC0+bV91aVRyYW5zU2l6ZSA9IDA7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQljYXNlIGtFcGxTZG9TZXJ2aWNlTklMOgorCQkJZGVmYXVsdDoKKwkJCQkvLyBpbnZhbGlkIHNlcnZpY2UgcmVxdWVzdGVkCisJCQkJUmV0ID0ga0VwbFNkb0NvbUludmFsaWRTZXJ2aWNlVHlwZTsKKwkJCQlnb3RvIEV4aXQ7CisJCQl9CS8vIGVuZCBvZiBzd2l0Y2gocFNkb0NvbUNvbl9wLT5tX1Nkb1NlcnZpY2VUeXBlKQorCQl9IGVsc2UJCS8vIChwU2RvQ29tQ29uX3AtPm1fdWlUcmFuc2ZlcnJlZEJ5dGUgPiAwKQorCQl7CQkvLyBjb250aW51ZSBTRE8gdHJhbnNmZXIKKwkJCXN3aXRjaCAocFNkb0NvbUNvbl9wLT5tX1Nkb1NlcnZpY2VUeXBlKSB7CisJCQkJLy8gZm9yIGV4cGVkaXRlZCByZWFkIGlzIG5vdGhpbmcgdG8gZG8KKwkJCQkvLyAtPiBzZXJ2ZXIgc2VuZHMgZGF0YQorCisJCQljYXNlIGtFcGxTZG9TZXJ2aWNlV3JpdGVCeUluZGV4OgorCQkJCXsJLy8gc2VuZCBuZXh0IGZyYW1lCisJCQkJCWlmIChwU2RvQ29tQ29uX3AtPm1fU2RvVHJhbnNUeXBlID09CisJCQkJCSAgICBrRXBsU2RvVHJhbnNTZWdtZW50ZWQpIHsKKwkJCQkJCWlmIChwU2RvQ29tQ29uX3AtPm1fdWlUcmFuc1NpemUgPiBFUExfU0RPX01BWF9QQVlMT0FEKSB7CS8vIG5leHQgc2VnbWVudAorCQkJCQkJCXBiUGF5bG9hZCA9CisJCQkJCQkJICAgICZwQ29tbWFuZEZyYW1lLT4KKwkJCQkJCQkgICAgbV9sZV9hYkNvbW1hbmREYXRhCisJCQkJCQkJICAgIFswXTsKKwkJCQkJCQkvLyBmaWxsIHJlc3Qgb2YgaGVhZGVyCisJCQkJCQkJQW1pU2V0V29yZFRvTGUKKwkJCQkJCQkgICAgKCZwQ29tbWFuZEZyYW1lLT4KKwkJCQkJCQkgICAgIG1fbGVfd1NlZ21lbnRTaXplLAorCQkJCQkJCSAgICAgRVBMX1NET19NQVhfUEFZTE9BRCk7CisJCQkJCQkJYkZsYWdzID0gMHgyMDsKKwkJCQkJCQlBbWlTZXRCeXRlVG9MZQorCQkJCQkJCSAgICAoJnBDb21tYW5kRnJhbWUtPgorCQkJCQkJCSAgICAgbV9sZV9iRmxhZ3MsCisJCQkJCQkJICAgICBiRmxhZ3MpOworCQkJCQkJCS8vIGNvcHkgZGF0YQorCQkJCQkJCUVQTF9NRU1DUFkocGJQYXlsb2FkLAorCQkJCQkJCQkgICBwU2RvQ29tQ29uX3AtPgorCQkJCQkJCQkgICBtX3BEYXRhLAorCQkJCQkJCQkgICBFUExfU0RPX01BWF9QQVlMT0FEKTsKKwkJCQkJCQlwU2RvQ29tQ29uX3AtPm1fcERhdGEgKz0KKwkJCQkJCQkgICAgRVBMX1NET19NQVhfUEFZTE9BRDsKKwkJCQkJCQkvLyBjb3JyZWN0IGludGVybiBjb3VudGVyCisJCQkJCQkJcFNkb0NvbUNvbl9wLT4KKwkJCQkJCQkgICAgbV91aVRyYW5zU2l6ZSAtPQorCQkJCQkJCSAgICBFUExfU0RPX01BWF9QQVlMT0FEOworCQkJCQkJCXBTZG9Db21Db25fcC0+CisJCQkJCQkJICAgIG1fdWlUcmFuc2ZlcnJlZEJ5dGUKKwkJCQkJCQkgICAgPQorCQkJCQkJCSAgICBFUExfU0RPX01BWF9QQVlMT0FEOworCQkJCQkJCS8vIGNhbGMgc2l6ZQorCQkJCQkJCXVpU2l6ZU9mRnJhbWUgKz0KKwkJCQkJCQkgICAgRVBMX1NET19NQVhfUEFZTE9BRDsKKworCQkJCQkJfSBlbHNlIHsJLy8gZW5kIG9mIHRyYW5zZmVyCisJCQkJCQkJcGJQYXlsb2FkID0KKwkJCQkJCQkgICAgJnBDb21tYW5kRnJhbWUtPgorCQkJCQkJCSAgICBtX2xlX2FiQ29tbWFuZERhdGEKKwkJCQkJCQkgICAgWzBdOworCQkJCQkJCS8vIGZpbGwgcmVzdCBvZiBoZWFkZXIKKwkJCQkJCQlBbWlTZXRXb3JkVG9MZQorCQkJCQkJCSAgICAoJnBDb21tYW5kRnJhbWUtPgorCQkJCQkJCSAgICAgbV9sZV93U2VnbWVudFNpemUsCisJCQkJCQkJICAgICAoV09SRCkKKwkJCQkJCQkgICAgIHBTZG9Db21Db25fcC0+CisJCQkJCQkJICAgICBtX3VpVHJhbnNTaXplKTsKKwkJCQkJCQliRmxhZ3MgPSAweDMwOworCQkJCQkJCUFtaVNldEJ5dGVUb0xlCisJCQkJCQkJICAgICgmcENvbW1hbmRGcmFtZS0+CisJCQkJCQkJICAgICBtX2xlX2JGbGFncywKKwkJCQkJCQkgICAgIGJGbGFncyk7CisJCQkJCQkJLy8gY29weSBkYXRhCisJCQkJCQkJRVBMX01FTUNQWShwYlBheWxvYWQsCisJCQkJCQkJCSAgIHBTZG9Db21Db25fcC0+CisJCQkJCQkJCSAgIG1fcERhdGEsCisJCQkJCQkJCSAgIHBTZG9Db21Db25fcC0+CisJCQkJCQkJCSAgIG1fdWlUcmFuc1NpemUpOworCQkJCQkJCXBTZG9Db21Db25fcC0+bV9wRGF0YSArPQorCQkJCQkJCSAgICBwU2RvQ29tQ29uX3AtPgorCQkJCQkJCSAgICBtX3VpVHJhbnNTaXplOworCQkJCQkJCS8vIGNhbGMgc2l6ZQorCQkJCQkJCXVpU2l6ZU9mRnJhbWUgKz0KKwkJCQkJCQkgICAgcFNkb0NvbUNvbl9wLT4KKwkJCQkJCQkgICAgbV91aVRyYW5zU2l6ZTsKKwkJCQkJCQkvLyBjb3JyZWN0IGludGVybiBjb3VudGVyCisJCQkJCQkJcFNkb0NvbUNvbl9wLT4KKwkJCQkJCQkgICAgbV91aVRyYW5zU2l6ZSA9IDA7CisJCQkJCQkJcFNkb0NvbUNvbl9wLT4KKwkJCQkJCQkgICAgbV91aVRyYW5zZmVycmVkQnl0ZQorCQkJCQkJCSAgICA9CisJCQkJCQkJICAgIHBTZG9Db21Db25fcC0+CisJCQkJCQkJICAgIG1fdWlUcmFuc1NpemU7CisKKwkJCQkJCX0KKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWdvdG8gRXhpdDsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQl9CisJCQlkZWZhdWx0OgorCQkJCXsKKwkJCQkJZ290byBFeGl0OworCQkJCX0KKwkJCX0JLy8gZW5kIG9mIHN3aXRjaChwU2RvQ29tQ29uX3AtPm1fU2RvU2VydmljZVR5cGUpCisJCX0KKwl9IGVsc2UgeworCQlnb3RvIEV4aXQ7CisJfQorCisJLy8gY2FsbCBzZW5kIGZ1bmN0aW9uIG9mIGxvd2VyIGxheWVyCisJc3dpdGNoIChwU2RvQ29tQ29uX3AtPm1fU2RvUHJvdFR5cGUpIHsKKwljYXNlIGtFcGxTZG9UeXBlQXNuZDoKKwljYXNlIGtFcGxTZG9UeXBlVWRwOgorCQl7CisJCQlSZXQgPSBFcGxTZG9Bc3lTZXFTZW5kRGF0YShwU2RvQ29tQ29uX3AtPm1fU2RvU2VxQ29uSGRsLAorCQkJCQkJICAgdWlTaXplT2ZGcmFtZSwgcEZyYW1lKTsKKwkJCWJyZWFrOworCQl9CisKKwlkZWZhdWx0OgorCQl7CisJCQlSZXQgPSBrRXBsU2RvQ29tVW5zdXBwb3J0ZWRQcm90OworCQl9CisJfQkJCS8vIGVuZCBvZiBzd2l0Y2gocFNkb0NvbUNvbl9wLT5tX1Nkb1Byb3RUeXBlKQorCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7CisKK30KKyNlbmRpZgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgICAgIEVwbFNkb0NvbUNsaWVudFByb2Nlc3NGcmFtZQorLy8KKy8vIERlc2NyaXB0aW9uOiAgICBmdW5jdGlvbiBwcm9jZXNzIGEgcmVjZWl2ZWQgZnJhbWUKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6ICAgICAgU2RvQ29tQ29uX3AgICAgICA9IGNvbm5lY3Rpb24gaGFuZGxlCisvLyAgICAgICAgICAgICAgICAgIHBBc3lTZG9Db21fcCAgICAgPSBwb2ludGVyIHRvIGZyYW1lIHRvIHByb2Nlc3MKKy8vCisvLyBSZXR1cm5zOiAgICAgICAgIHRFcGxLZXJuZWwgID0gIGVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9TRE9DKSkgIT0gMCkKK3N0YXRpYyB0RXBsS2VybmVsIEVwbFNkb0NvbUNsaWVudFByb2Nlc3NGcmFtZSh0RXBsU2RvQ29tQ29uSGRsIFNkb0NvbUNvbl9wLAorCQkJCQkgICAgICB0RXBsQXN5U2RvQ29tICogcEFzeVNkb0NvbV9wKQoreworCXRFcGxLZXJuZWwgUmV0OworCUJZVEUgYkJ1ZmZlcjsKKwl1bnNpZ25lZCBpbnQgdWlCdWZmZXI7CisJdW5zaWduZWQgaW50IHVpRGF0YVNpemU7CisJdW5zaWduZWQgbG9uZyB1bEJ1ZmZlcjsKKwl0RXBsU2RvQ29tQ29uICpwU2RvQ29tQ29uOworCisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwkvLyBnZXQgcG9pbnRlciB0byBjb250cm9sIHN0cnVjdHVyZQorCXBTZG9Db21Db24gPSAmU2RvQ29tSW5zdGFuY2VfZy5tX1Nkb0NvbUNvbltTZG9Db21Db25fcF07CisKKwkvLyBjaGVjayBpZiB0cmFuc2FjdGlvbiBJZCBmaXQKKwliQnVmZmVyID0gQW1pR2V0Qnl0ZUZyb21MZSgmcEFzeVNkb0NvbV9wLT5tX2xlX2JUcmFuc2FjdGlvbklkKTsKKwlpZiAocFNkb0NvbUNvbi0+bV9iVHJhbnNhY3Rpb25JZCAhPSBiQnVmZmVyKSB7CisJCS8vIGluY29ycmVjdCB0cmFuc2FjdGlvbiBpZAorCisJCS8vIGlmIHJ1bm5pbmcgdHJhbnNmZXIKKwkJaWYgKChwU2RvQ29tQ29uLT5tX3VpVHJhbnNmZXJyZWRCeXRlICE9IDApCisJCSAgICAmJiAocFNkb0NvbUNvbi0+bV91aVRyYW5zU2l6ZSAhPSAwKSkgeworCQkJcFNkb0NvbUNvbi0+bV9kd0xhc3RBYm9ydENvZGUgPSBFUExfU0RPQUNfR0VORVJBTF9FUlJPUjsKKwkJCS8vIC0+IHNlbmQgYWJvcnQKKwkJCUVwbFNkb0NvbUNsaWVudFNlbmRBYm9ydChwU2RvQ29tQ29uLAorCQkJCQkJIHBTZG9Db21Db24tPm1fZHdMYXN0QWJvcnRDb2RlKTsKKwkJCS8vIGNhbGwgY2FsbGJhY2sgb2YgYXBwbGljYXRpb24KKwkJCVJldCA9CisJCQkgICAgRXBsU2RvQ29tVHJhbnNmZXJGaW5pc2hlZChTZG9Db21Db25fcCwgcFNkb0NvbUNvbiwKKwkJCQkJCSAgICAgIGtFcGxTZG9Db21UcmFuc2ZlclR4QWJvcnRlZCk7CisJCX0KKworCX0gZWxzZSB7CQkvLyBjaGVjayBpZiBjb3JyZWN0IGNvbW1hbmQKKwkJYkJ1ZmZlciA9IEFtaUdldEJ5dGVGcm9tTGUoJnBBc3lTZG9Db21fcC0+bV9sZV9iQ29tbWFuZElkKTsKKwkJaWYgKHBTZG9Db21Db24tPm1fU2RvU2VydmljZVR5cGUgIT0gYkJ1ZmZlcikgeworCQkJLy8gaW5jb3JyZWN0IGNvbW1hbmQKKwkJCS8vIGlmIHJ1bm5pbmcgdHJhbnNmZXIKKwkJCWlmICgocFNkb0NvbUNvbi0+bV91aVRyYW5zZmVycmVkQnl0ZSAhPSAwKQorCQkJICAgICYmIChwU2RvQ29tQ29uLT5tX3VpVHJhbnNTaXplICE9IDApKSB7CisJCQkJcFNkb0NvbUNvbi0+bV9kd0xhc3RBYm9ydENvZGUgPQorCQkJCSAgICBFUExfU0RPQUNfR0VORVJBTF9FUlJPUjsKKwkJCQkvLyAtPiBzZW5kIGFib3J0CisJCQkJRXBsU2RvQ29tQ2xpZW50U2VuZEFib3J0KHBTZG9Db21Db24sCisJCQkJCQkJIHBTZG9Db21Db24tPgorCQkJCQkJCSBtX2R3TGFzdEFib3J0Q29kZSk7CisJCQkJLy8gY2FsbCBjYWxsYmFjayBvZiBhcHBsaWNhdGlvbgorCQkJCVJldCA9CisJCQkJICAgIEVwbFNkb0NvbVRyYW5zZmVyRmluaXNoZWQoU2RvQ29tQ29uX3AsCisJCQkJCQkJICAgICAgcFNkb0NvbUNvbiwKKwkJCQkJCQkgICAgICBrRXBsU2RvQ29tVHJhbnNmZXJUeEFib3J0ZWQpOworCQkJfQorCisJCX0gZWxzZSB7CS8vIHN3aXRjaCBvbiBjb21tYW5kCisJCQlzd2l0Y2ggKHBTZG9Db21Db24tPm1fU2RvU2VydmljZVR5cGUpIHsKKwkJCWNhc2Uga0VwbFNkb1NlcnZpY2VXcml0ZUJ5SW5kZXg6CisJCQkJewkvLyBjaGVjayBpZiBjb25maXJtYXRpb24gZnJvbSBzZXJ2ZXIKKwkJCQkJLy8gbm90aGluZyBtb3JlIHRvIGRvCisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJY2FzZSBrRXBsU2RvU2VydmljZVJlYWRCeUluZGV4OgorCQkJCXsJLy8gY2hlY2sgaWYgaXQgaXMgYW4gc2VnbWVudGVkIG9yIGFuIGV4cGVkaXRlZCB0cmFuc2ZlcgorCQkJCQliQnVmZmVyID0KKwkJCQkJICAgIEFtaUdldEJ5dGVGcm9tTGUoJnBBc3lTZG9Db21fcC0+CisJCQkJCQkJICAgICBtX2xlX2JGbGFncyk7CisJCQkJCS8vIG1hc2sgdW5pbnRlcmVzc3RpbmcgYml0cworCQkJCQliQnVmZmVyICY9IDB4MzA7CisJCQkJCXN3aXRjaCAoYkJ1ZmZlcikgeworCQkJCQkJLy8gZXhwZWRpdGVkIHRyYW5zZmVyCisJCQkJCWNhc2UgMHgwMDoKKwkJCQkJCXsKKwkJCQkJCQkvLyBjaGVjayBzaXplIG9mIGJ1ZmZlcgorCQkJCQkJCXVpQnVmZmVyID0KKwkJCQkJCQkgICAgQW1pR2V0V29yZEZyb21MZQorCQkJCQkJCSAgICAoJnBBc3lTZG9Db21fcC0+CisJCQkJCQkJICAgICBtX2xlX3dTZWdtZW50U2l6ZSk7CisJCQkJCQkJaWYgKHVpQnVmZmVyID4gcFNkb0NvbUNvbi0+bV91aVRyYW5zU2l6ZSkgewkvLyBidWZmZXIgcHJvdmlkZWQgYnkgdGhlIGFwcGxpY2F0aW9uIGlzIHRvIHNtYWxsCisJCQkJCQkJCS8vIGNvcHkgb25seSBhIHBhcnQKKwkJCQkJCQkJdWlEYXRhU2l6ZSA9CisJCQkJCQkJCSAgICBwU2RvQ29tQ29uLT4KKwkJCQkJCQkJICAgIG1fdWlUcmFuc1NpemU7CisJCQkJCQkJfSBlbHNlIHsJLy8gYnVmZmVyIGZpdHMKKwkJCQkJCQkJdWlEYXRhU2l6ZSA9CisJCQkJCQkJCSAgICB1aUJ1ZmZlcjsKKwkJCQkJCQl9CisKKwkJCQkJCQkvLyBjb3B5IGRhdGEKKwkJCQkJCQlFUExfTUVNQ1BZKHBTZG9Db21Db24tPgorCQkJCQkJCQkgICBtX3BEYXRhLAorCQkJCQkJCQkgICAmcEFzeVNkb0NvbV9wLT4KKwkJCQkJCQkJICAgbV9sZV9hYkNvbW1hbmREYXRhCisJCQkJCQkJCSAgIFswXSwKKwkJCQkJCQkJICAgdWlEYXRhU2l6ZSk7CisKKwkJCQkJCQkvLyBjb3JyZWN0IGNvdW50ZXIKKwkJCQkJCQlwU2RvQ29tQ29uLT4KKwkJCQkJCQkgICAgbV91aVRyYW5zU2l6ZSA9IDA7CisJCQkJCQkJcFNkb0NvbUNvbi0+CisJCQkJCQkJICAgIG1fdWlUcmFuc2ZlcnJlZEJ5dGUKKwkJCQkJCQkgICAgPSB1aURhdGFTaXplOworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCisJCQkJCQkvLyBzdGFydCBvZiBhIHNlZ21lbnRlZCB0cmFuc2ZlcgorCQkJCQljYXNlIDB4MTA6CisJCQkJCQl7CS8vIGdldCB0b3RhbCBzaXplIG9mIHRyYW5zZmVyCisJCQkJCQkJdWxCdWZmZXIgPQorCQkJCQkJCSAgICBBbWlHZXREd29yZEZyb21MZQorCQkJCQkJCSAgICAoJnBBc3lTZG9Db21fcC0+CisJCQkJCQkJICAgICBtX2xlX2FiQ29tbWFuZERhdGEKKwkJCQkJCQkgICAgIFswXSk7CisJCQkJCQkJaWYgKHVsQnVmZmVyIDw9IHBTZG9Db21Db24tPm1fdWlUcmFuc1NpemUpIHsJLy8gYnVmZmVyIGZpdAorCQkJCQkJCQlwU2RvQ29tQ29uLT4KKwkJCQkJCQkJICAgIG1fdWlUcmFuc1NpemUKKwkJCQkJCQkJICAgID0KKwkJCQkJCQkJICAgICh1bnNpZ25lZAorCQkJCQkJCQkgICAgIGludCkKKwkJCQkJCQkJICAgIHVsQnVmZmVyOworCQkJCQkJCX0gZWxzZSB7CS8vIGJ1ZmZlciB0byBzbWFsbAorCQkJCQkJCQkvLyBzZW5kIGFib3J0CisJCQkJCQkJCXBTZG9Db21Db24tPgorCQkJCQkJCQkgICAgbV9kd0xhc3RBYm9ydENvZGUKKwkJCQkJCQkJICAgID0KKwkJCQkJCQkJICAgIEVQTF9TRE9BQ19EQVRBX1RZUEVfTEVOR1RIX1RPT19ISUdIOworCQkJCQkJCQkvLyAtPiBzZW5kIGFib3J0CisJCQkJCQkJCUVwbFNkb0NvbUNsaWVudFNlbmRBYm9ydAorCQkJCQkJCQkgICAgKHBTZG9Db21Db24sCisJCQkJCQkJCSAgICAgcFNkb0NvbUNvbi0+CisJCQkJCQkJCSAgICAgbV9kd0xhc3RBYm9ydENvZGUpOworCQkJCQkJCQkvLyBjYWxsIGNhbGxiYWNrIG9mIGFwcGxpY2F0aW9uCisJCQkJCQkJCVJldCA9CisJCQkJCQkJCSAgICBFcGxTZG9Db21UcmFuc2ZlckZpbmlzaGVkCisJCQkJCQkJCSAgICAoU2RvQ29tQ29uX3AsCisJCQkJCQkJCSAgICAgcFNkb0NvbUNvbiwKKwkJCQkJCQkJICAgICBrRXBsU2RvQ29tVHJhbnNmZXJSeEFib3J0ZWQpOworCQkJCQkJCQlnb3RvIEV4aXQ7CisJCQkJCQkJfQorCisJCQkJCQkJLy8gZ2V0IHNlZ21lbnQgc2l6ZQorCQkJCQkJCS8vIGNoZWNrIHNpemUgb2YgYnVmZmVyCisJCQkJCQkJdWlCdWZmZXIgPQorCQkJCQkJCSAgICBBbWlHZXRXb3JkRnJvbUxlCisJCQkJCQkJICAgICgmcEFzeVNkb0NvbV9wLT4KKwkJCQkJCQkgICAgIG1fbGVfd1NlZ21lbnRTaXplKTsKKwkJCQkJCQkvLyBzdWJ0cmFjdCBzaXplIG9mIHZhaWFibGUgaGVhZGVyIGZyb20gZGF0YXNpemUKKwkJCQkJCQl1aUJ1ZmZlciAtPSA0OworCQkJCQkJCS8vIGNvcHkgZGF0YQorCQkJCQkJCUVQTF9NRU1DUFkocFNkb0NvbUNvbi0+CisJCQkJCQkJCSAgIG1fcERhdGEsCisJCQkJCQkJCSAgICZwQXN5U2RvQ29tX3AtPgorCQkJCQkJCQkgICBtX2xlX2FiQ29tbWFuZERhdGEKKwkJCQkJCQkJICAgWzRdLAorCQkJCQkJCQkgICB1aUJ1ZmZlcik7CisKKwkJCQkJCQkvLyBjb3JyZWN0IGNvdW50ZXIgYW4gcG9pbnRlcgorCQkJCQkJCXBTZG9Db21Db24tPm1fcERhdGEgKz0KKwkJCQkJCQkgICAgdWlCdWZmZXI7CisJCQkJCQkJcFNkb0NvbUNvbi0+CisJCQkJCQkJICAgIG1fdWlUcmFuc2ZlcnJlZEJ5dGUKKwkJCQkJCQkgICAgKz0gdWlCdWZmZXI7CisJCQkJCQkJcFNkb0NvbUNvbi0+CisJCQkJCQkJICAgIG1fdWlUcmFuc1NpemUgLT0KKwkJCQkJCQkgICAgdWlCdWZmZXI7CisKKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKworCQkJCQkJLy8gc2VnbWVudAorCQkJCQljYXNlIDB4MjA6CisJCQkJCQl7CisJCQkJCQkJLy8gZ2V0IHNlZ21lbnQgc2l6ZQorCQkJCQkJCS8vIGNoZWNrIHNpemUgb2YgYnVmZmVyCisJCQkJCQkJdWlCdWZmZXIgPQorCQkJCQkJCSAgICBBbWlHZXRXb3JkRnJvbUxlCisJCQkJCQkJICAgICgmcEFzeVNkb0NvbV9wLT4KKwkJCQkJCQkgICAgIG1fbGVfd1NlZ21lbnRTaXplKTsKKwkJCQkJCQkvLyBjaGVjayBpZiBkYXRhIHRvIGNvcHkgZml0IHRvIGJ1ZmZlcgorCQkJCQkJCWlmICh1aUJ1ZmZlciA+PSBwU2RvQ29tQ29uLT5tX3VpVHJhbnNTaXplKSB7CS8vIHRvIG11Y2ggZGF0YQorCQkJCQkJCQl1aUJ1ZmZlciA9CisJCQkJCQkJCSAgICAocFNkb0NvbUNvbi0+CisJCQkJCQkJCSAgICAgbV91aVRyYW5zU2l6ZQorCQkJCQkJCQkgICAgIC0gMSk7CisJCQkJCQkJfQorCQkJCQkJCS8vIGNvcHkgZGF0YQorCQkJCQkJCUVQTF9NRU1DUFkocFNkb0NvbUNvbi0+CisJCQkJCQkJCSAgIG1fcERhdGEsCisJCQkJCQkJCSAgICZwQXN5U2RvQ29tX3AtPgorCQkJCQkJCQkgICBtX2xlX2FiQ29tbWFuZERhdGEKKwkJCQkJCQkJICAgWzBdLAorCQkJCQkJCQkgICB1aUJ1ZmZlcik7CisKKwkJCQkJCQkvLyBjb3JyZWN0IGNvdW50ZXIgYW4gcG9pbnRlcgorCQkJCQkJCXBTZG9Db21Db24tPm1fcERhdGEgKz0KKwkJCQkJCQkgICAgdWlCdWZmZXI7CisJCQkJCQkJcFNkb0NvbUNvbi0+CisJCQkJCQkJICAgIG1fdWlUcmFuc2ZlcnJlZEJ5dGUKKwkJCQkJCQkgICAgKz0gdWlCdWZmZXI7CisJCQkJCQkJcFNkb0NvbUNvbi0+CisJCQkJCQkJICAgIG1fdWlUcmFuc1NpemUgLT0KKwkJCQkJCQkgICAgdWlCdWZmZXI7CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisKKwkJCQkJCS8vIGxhc3Qgc2VnbWVudAorCQkJCQljYXNlIDB4MzA6CisJCQkJCQl7CisJCQkJCQkJLy8gZ2V0IHNlZ21lbnQgc2l6ZQorCQkJCQkJCS8vIGNoZWNrIHNpemUgb2YgYnVmZmVyCisJCQkJCQkJdWlCdWZmZXIgPQorCQkJCQkJCSAgICBBbWlHZXRXb3JkRnJvbUxlCisJCQkJCQkJICAgICgmcEFzeVNkb0NvbV9wLT4KKwkJCQkJCQkgICAgIG1fbGVfd1NlZ21lbnRTaXplKTsKKwkJCQkJCQkvLyBjaGVjayBpZiBkYXRhIHRvIGNvcHkgZml0IHRvIGJ1ZmZlcgorCQkJCQkJCWlmICh1aUJ1ZmZlciA+IHBTZG9Db21Db24tPm1fdWlUcmFuc1NpemUpIHsJLy8gdG8gbXVjaCBkYXRhCisJCQkJCQkJCXVpQnVmZmVyID0KKwkJCQkJCQkJICAgIChwU2RvQ29tQ29uLT4KKwkJCQkJCQkJICAgICBtX3VpVHJhbnNTaXplCisJCQkJCQkJCSAgICAgLSAxKTsKKwkJCQkJCQl9CisJCQkJCQkJLy8gY29weSBkYXRhCisJCQkJCQkJRVBMX01FTUNQWShwU2RvQ29tQ29uLT4KKwkJCQkJCQkJICAgbV9wRGF0YSwKKwkJCQkJCQkJICAgJnBBc3lTZG9Db21fcC0+CisJCQkJCQkJCSAgIG1fbGVfYWJDb21tYW5kRGF0YQorCQkJCQkJCQkgICBbMF0sCisJCQkJCQkJCSAgIHVpQnVmZmVyKTsKKworCQkJCQkJCS8vIGNvcnJlY3QgY291bnRlciBhbiBwb2ludGVyCisJCQkJCQkJcFNkb0NvbUNvbi0+bV9wRGF0YSArPQorCQkJCQkJCSAgICB1aUJ1ZmZlcjsKKwkJCQkJCQlwU2RvQ29tQ29uLT4KKwkJCQkJCQkgICAgbV91aVRyYW5zZmVycmVkQnl0ZQorCQkJCQkJCSAgICArPSB1aUJ1ZmZlcjsKKwkJCQkJCQlwU2RvQ29tQ29uLT4KKwkJCQkJCQkgICAgbV91aVRyYW5zU2l6ZSA9IDA7CisKKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJfQkvLyBlbmQgb2Ygc3dpdGNoKGJCdWZmZXIgJiAweDMwKQorCisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJY2FzZSBrRXBsU2RvU2VydmljZU5JTDoKKwkJCWRlZmF1bHQ6CisJCQkJLy8gaW52YWxpZCBzZXJ2aWNlIHJlcXVlc3RlZAorCQkJCS8vICQkJCBkLmsuIFdoYXQgc2hvdWxkIHdlIGRvPworCQkJCWJyZWFrOworCQkJfQkvLyBlbmQgb2Ygc3dpdGNoKHBTZG9Db21Db24tPm1fU2RvU2VydmljZVR5cGUpCisJCX0KKwl9CisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIFJldDsKK30KKyNlbmRpZgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxTZG9Db21DbGllbnRTZW5kQWJvcnQKKy8vCisvLyBEZXNjcmlwdGlvbjogZnVuY3Rpb24gc2VuZCBhIGFib3J0IG1lc3NhZ2UKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6ICBwU2RvQ29tQ29uX3AgICAgID0gcG9pbnRlciB0byBjb250cm9sIHN0cnVjdHVyZSBvZiBjb25uZWN0aW9uCisvLyAgICAgICAgICAgICAgZHdBYm9ydENvZGVfcCAgICA9IFNkbyBhYm9ydCBjb2RlCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgID0gIGVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9TRE9DKSkgIT0gMCkKK3N0YXRpYyB0RXBsS2VybmVsIEVwbFNkb0NvbUNsaWVudFNlbmRBYm9ydCh0RXBsU2RvQ29tQ29uICogcFNkb0NvbUNvbl9wLAorCQkJCQkgICBEV09SRCBkd0Fib3J0Q29kZV9wKQoreworCXRFcGxLZXJuZWwgUmV0OworCUJZVEUgYWJGcmFtZVtFUExfTUFYX1NET19GUkFNRV9TSVpFXTsKKwl0RXBsRnJhbWUgKnBGcmFtZTsKKwl0RXBsQXN5U2RvQ29tICpwQ29tbWFuZEZyYW1lOworCXVuc2lnbmVkIGludCB1aVNpemVPZkZyYW1lOworCisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwlwRnJhbWUgPSAodEVwbEZyYW1lICopICYgYWJGcmFtZVswXTsKKworCUVQTF9NRU1TRVQoJmFiRnJhbWVbMF0sIDB4MDAsIHNpemVvZihhYkZyYW1lKSk7CisKKwkvLyBidWlsZCBnZW5lcmljIHBhcnQgb2YgZnJhbWUKKwkvLyBnZXQgcG9pbnRlciB0byBjb21tYW5kIGxheWVycGFydCBvZiBmcmFtZQorCXBDb21tYW5kRnJhbWUgPQorCSAgICAmcEZyYW1lLT5tX0RhdGEubV9Bc25kLm1fUGF5bG9hZC5tX1Nkb1NlcXVlbmNlRnJhbWUuCisJICAgIG1fbGVfYWJTZG9TZXFQYXlsb2FkOworCUFtaVNldEJ5dGVUb0xlKCZwQ29tbWFuZEZyYW1lLT5tX2xlX2JDb21tYW5kSWQsCisJCSAgICAgICBwU2RvQ29tQ29uX3AtPm1fU2RvU2VydmljZVR5cGUpOworCUFtaVNldEJ5dGVUb0xlKCZwQ29tbWFuZEZyYW1lLT5tX2xlX2JUcmFuc2FjdGlvbklkLAorCQkgICAgICAgcFNkb0NvbUNvbl9wLT5tX2JUcmFuc2FjdGlvbklkKTsKKworCXVpU2l6ZU9mRnJhbWUgPSA4OworCisJLy8gc2V0IHJlc3BvbnNlIGFuZCBhYm9ydCBmbGFnCisJcENvbW1hbmRGcmFtZS0+bV9sZV9iRmxhZ3MgfD0gMHg0MDsKKworCS8vIGNvcHkgYWJvcnRjb2RlIHRvIGZyYW1lCisJQW1pU2V0RHdvcmRUb0xlKCZwQ29tbWFuZEZyYW1lLT5tX2xlX2FiQ29tbWFuZERhdGFbMF0sIGR3QWJvcnRDb2RlX3ApOworCisJLy8gc2V0IHNpemUgb2Ygc2VnbWVudAorCUFtaVNldFdvcmRUb0xlKCZwQ29tbWFuZEZyYW1lLT5tX2xlX3dTZWdtZW50U2l6ZSwgc2l6ZW9mKERXT1JEKSk7CisKKwkvLyB1cGRhdGUgY291bnRlcgorCXBTZG9Db21Db25fcC0+bV91aVRyYW5zZmVycmVkQnl0ZSA9IHNpemVvZihEV09SRCk7CisJcFNkb0NvbUNvbl9wLT5tX3VpVHJhbnNTaXplID0gMDsKKworCS8vIGNhbGMgZnJhbWVzaXplCisJdWlTaXplT2ZGcmFtZSArPSBzaXplb2YoRFdPUkQpOworCisJLy8gc2F2ZSBhYm9ydCBjb2RlCisJcFNkb0NvbUNvbl9wLT5tX2R3TGFzdEFib3J0Q29kZSA9IGR3QWJvcnRDb2RlX3A7CisKKwkvLyBjYWxsIHNlbmQgZnVuY3Rpb24gb2YgbG93ZXIgbGF5ZXIKKwlzd2l0Y2ggKHBTZG9Db21Db25fcC0+bV9TZG9Qcm90VHlwZSkgeworCWNhc2Uga0VwbFNkb1R5cGVBc25kOgorCWNhc2Uga0VwbFNkb1R5cGVVZHA6CisJCXsKKwkJCVJldCA9IEVwbFNkb0FzeVNlcVNlbmREYXRhKHBTZG9Db21Db25fcC0+bV9TZG9TZXFDb25IZGwsCisJCQkJCQkgICB1aVNpemVPZkZyYW1lLCBwRnJhbWUpOworCQkJYnJlYWs7CisJCX0KKworCWRlZmF1bHQ6CisJCXsKKwkJCVJldCA9IGtFcGxTZG9Db21VbnN1cHBvcnRlZFByb3Q7CisJCX0KKwl9CQkJLy8gZW5kIG9mIHN3aXRjaChwU2RvQ29tQ29uX3AtPm1fU2RvUHJvdFR5cGUpCisKKwlyZXR1cm4gUmV0OworfQorI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbFNkb0NvbVRyYW5zZmVyRmluaXNoZWQKKy8vCisvLyBEZXNjcmlwdGlvbjogY2FsbHMgY2FsbGJhY2sgZnVuY3Rpb24gb2YgYXBwbGljYXRpb24gaWYgYXZhaWxhYmxlCisvLyAgICAgICAgICAgICAgYW5kIGNsZWFycyBlbnRyeSBpbiBjb250cm9sIHN0cnVjdHVyZQorLy8KKy8vIFBhcmFtZXRlcnM6ICBwU2RvQ29tQ29uX3AgICAgID0gcG9pbnRlciB0byBjb250cm9sIHN0cnVjdHVyZSBvZiBjb25uZWN0aW9uCisvLyAgICAgICAgICAgICAgU2RvQ29tQ29uU3RhdGVfcCA9IHN0YXRlIG9mIFNETyB0cmFuc2ZlcgorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICA9ICBlcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N0YXRpYyB0RXBsS2VybmVsIEVwbFNkb0NvbVRyYW5zZmVyRmluaXNoZWQodEVwbFNkb0NvbUNvbkhkbCBTZG9Db21Db25fcCwKKwkJCQkJICAgIHRFcGxTZG9Db21Db24gKiBwU2RvQ29tQ29uX3AsCisJCQkJCSAgICB0RXBsU2RvQ29tQ29uU3RhdGUgU2RvQ29tQ29uU3RhdGVfcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKworCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJaWYgKHBTZG9Db21Db25fcC0+bV9wZm5UcmFuc2ZlckZpbmlzaGVkICE9IE5VTEwpIHsKKwkJdEVwbFNkb0ZpbmlzaGVkQ2IgcGZuVHJhbnNmZXJGaW5pc2hlZDsKKwkJdEVwbFNkb0NvbUZpbmlzaGVkIFNkb0NvbUZpbmlzaGVkOworCisJCVNkb0NvbUZpbmlzaGVkLm1fcFVzZXJBcmcgPSBwU2RvQ29tQ29uX3AtPm1fcFVzZXJBcmc7CisJCVNkb0NvbUZpbmlzaGVkLm1fdWlOb2RlSWQgPSBwU2RvQ29tQ29uX3AtPm1fdWlOb2RlSWQ7CisJCVNkb0NvbUZpbmlzaGVkLm1fdWlUYXJnZXRJbmRleCA9IHBTZG9Db21Db25fcC0+bV91aVRhcmdldEluZGV4OworCQlTZG9Db21GaW5pc2hlZC5tX3VpVGFyZ2V0U3ViSW5kZXggPQorCQkgICAgcFNkb0NvbUNvbl9wLT5tX3VpVGFyZ2V0U3ViSW5kZXg7CisJCVNkb0NvbUZpbmlzaGVkLm1fdWlUcmFuc2ZlcnJlZEJ5dGUgPQorCQkgICAgcFNkb0NvbUNvbl9wLT5tX3VpVHJhbnNmZXJyZWRCeXRlOworCQlTZG9Db21GaW5pc2hlZC5tX2R3QWJvcnRDb2RlID0gcFNkb0NvbUNvbl9wLT5tX2R3TGFzdEFib3J0Q29kZTsKKwkJU2RvQ29tRmluaXNoZWQubV9TZG9Db21Db25IZGwgPSBTZG9Db21Db25fcDsKKwkJU2RvQ29tRmluaXNoZWQubV9TZG9Db21Db25TdGF0ZSA9IFNkb0NvbUNvblN0YXRlX3A7CisJCWlmIChwU2RvQ29tQ29uX3AtPm1fU2RvU2VydmljZVR5cGUgPT0KKwkJICAgIGtFcGxTZG9TZXJ2aWNlV3JpdGVCeUluZGV4KSB7CisJCQlTZG9Db21GaW5pc2hlZC5tX1Nkb0FjY2Vzc1R5cGUgPSBrRXBsU2RvQWNjZXNzVHlwZVdyaXRlOworCQl9IGVsc2UgeworCQkJU2RvQ29tRmluaXNoZWQubV9TZG9BY2Nlc3NUeXBlID0ga0VwbFNkb0FjY2Vzc1R5cGVSZWFkOworCQl9CisKKwkJLy8gcmVzZXQgdHJhbnNmZXIgc3RhdGUgc28gdGhpcyBoYW5kbGUgaXMgbm90IGJ1c3kgYW55bW9yZQorCQlwU2RvQ29tQ29uX3AtPm1fdWlUcmFuc2ZlcnJlZEJ5dGUgPSAwOworCQlwU2RvQ29tQ29uX3AtPm1fdWlUcmFuc1NpemUgPSAwOworCisJCXBmblRyYW5zZmVyRmluaXNoZWQgPSBwU2RvQ29tQ29uX3AtPm1fcGZuVHJhbnNmZXJGaW5pc2hlZDsKKwkJLy8gZGVsZXRlIGZ1bmN0aW9uIHBvaW50ZXIgdG8gaW5mb3JtIGFwcGxpY2F0aW9uIG9ubHkgb25jZSBmb3IgZWFjaCB0cmFuc2ZlcgorCQlwU2RvQ29tQ29uX3AtPm1fcGZuVHJhbnNmZXJGaW5pc2hlZCA9IE5VTEw7CisKKwkJLy8gY2FsbCBhcHBsaWNhdGlvbidzIGNhbGxiYWNrIGZ1bmN0aW9uCisJCXBmblRyYW5zZmVyRmluaXNoZWQoJlNkb0NvbUZpbmlzaGVkKTsKKworCX0KKworCXJldHVybiBSZXQ7Cit9CisKKy8vIEVPRgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxTZG9VZHB1LmMgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbFNkb1VkcHUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTUyMjMzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxTZG9VZHB1LmMKQEAgLTAsMCArMSw3OTAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBzb3VyY2UgZmlsZSBmb3IgU0RPL1VEUC1Qcm90b2NvbGFic3RyYWN0aW9ubGF5ZXIgbW9kdWxlCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRXBsU2RvVWRwdS5jLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS44ICQgICREYXRlOiAyMDA4LzEwLzE3IDE1OjMyOjMyICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorICAgICAgICAgICAgICAgICAgICBHQ0MgVjMuNAorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgIDIwMDYvMDYvMjYgay50LjogICBzdGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgInVzZXIvRXBsU2RvVWRwdS5oIgorCisjaWYgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9TRE9fVURQKSkgIT0gMCkKKworI2lmIChUQVJHRVRfU1lTVEVNID09IF9MSU5VWF8pICYmIGRlZmluZWQoX19LRVJORUxfXykKKyNpbmNsdWRlICJTb2NrZXRMaW51eEtlcm5lbC5oIgorI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIEcgTCBPIEIgQSBMICAgRCBFIEYgSSBOIEkgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWZuZGVmIEVQTF9TRE9fTUFYX0NPTk5FQ1RJT05fVURQCisjZGVmaW5lIEVQTF9TRE9fTUFYX0NPTk5FQ1RJT05fVURQICA1CisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvY2FsIHR5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgbG9uZyBtX3VsSXBBZGRyOwkvLyBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIKKwl1bnNpZ25lZCBpbnQgbV91aVBvcnQ7CS8vIGluIG5ldHdvcmsgYnl0ZSBvcmRlcgorCit9IHRFcGxTZG9VZHBDb247CisKKy8vIGluc3RhbmNlIHRhYmxlCit0eXBlZGVmIHN0cnVjdCB7CisJdEVwbFNkb1VkcENvbiBtX2FTZG9BYnNVZHBDb25uZWN0aW9uW0VQTF9TRE9fTUFYX0NPTk5FQ1RJT05fVURQXTsKKwl0RXBsU2VxdUxheWVyUmVjZWl2ZUNiIG1fZnBTZG9Bc3lTZXFDYjsKKwlTT0NLRVQgbV9VZHBTb2NrZXQ7CisKKyNpZiAoVEFSR0VUX1NZU1RFTSA9PSBfV0lOMzJfKQorCUhBTkRMRSBtX1RocmVhZEhhbmRsZTsKKwlMUENSSVRJQ0FMX1NFQ1RJT04gbV9wQ3JpdGljYWxTZWN0aW9uOworCUNSSVRJQ0FMX1NFQ1RJT04gbV9Dcml0aWNhbFNlY3Rpb247CisKKyNlbGlmIChUQVJHRVRfU1lTVEVNID09IF9MSU5VWF8pICYmIGRlZmluZWQoX19LRVJORUxfXykKKwlzdHJ1Y3QgY29tcGxldGlvbiBtX0NvbXBsZXRpb25VZHBUaHJlYWQ7CisJaW50IG1fVGhyZWFkSGFuZGxlOworCWludCBtX2lUZXJtaW5hdGVUaHJlYWQ7CisjZW5kaWYKKworfSB0RXBsU2RvVWRwSW5zdGFuY2U7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBtb2R1bCBnbG9iYWxlIHZhcnMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB0RXBsU2RvVWRwSW5zdGFuY2UgU2RvVWRwSW5zdGFuY2VfZzsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZiAoVEFSR0VUX1NZU1RFTSA9PSBfV0lOMzJfKQorc3RhdGljIERXT1JEIFBVQkxJQyBFcGxTZG9VZHBUaHJlYWQoTFBWT0lEIGxwUGFyYW1ldGVyKTsKKworI2VsaWYgKFRBUkdFVF9TWVNURU0gPT0gX0xJTlVYXykgJiYgZGVmaW5lZChfX0tFUk5FTF9fKQorc3RhdGljIGludCBFcGxTZG9VZHBUaHJlYWQodm9pZCAqcEFyZ19wKTsKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICBDIEwgQSBTIFMgIDxFUEwtU0RPLVVEUC1MYXllcj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLy8KKy8vIERlc2NyaXB0aW9uOiBQcm90b2NvbGFic3RyYWN0aW9uIGxheWVyIGZvciBVRFAKKy8vCisvLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICBQIFUgQiBMIEkgQyAgIEYgVSBOIEMgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbFNkb1VkcHVJbml0CisvLworLy8gRGVzY3JpcHRpb246IGluaXQgZmlyc3QgaW5zdGFuY2Ugb2YgdGhlIG1vZHVsZQorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczogIHBSZWNlaXZlQ2JfcCAgICA9ICAgZnVuY3Rpb25wb2ludGVyIHRvIFNkby1TZXF1ZW5jZSBsYXllcgorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2stZnVuY3Rpb24KKy8vCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgID0gRXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0RXBsS2VybmVsIFBVQkxJQyBFcGxTZG9VZHB1SW5pdCh0RXBsU2VxdUxheWVyUmVjZWl2ZUNiIGZwUmVjZWl2ZUNiX3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisKKwlSZXQgPSBFcGxTZG9VZHB1QWRkSW5zdGFuY2UoZnBSZWNlaXZlQ2JfcCk7CisKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxTZG9VZHB1QWRkSW5zdGFuY2UKKy8vCisvLyBEZXNjcmlwdGlvbjogaW5pdCBhZGRpdGlvbmFsIGluc3RhbmNlIG9mIHRoZSBtb2R1bGUKKy8vICAgICAgICAgICAgICDubml0IHNvY2tldCBhbmQgc3RhcnQgTGlzdGVuLVRocmVhZAorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczogIHBSZWNlaXZlQ2JfcCAgICA9ICAgZnVuY3Rpb25wb2ludGVyIHRvIFNkby1TZXF1ZW5jZSBsYXllcgorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2stZnVuY3Rpb24KKy8vCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgID0gRXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0RXBsS2VybmVsIFBVQkxJQyBFcGxTZG9VZHB1QWRkSW5zdGFuY2UodEVwbFNlcXVMYXllclJlY2VpdmVDYiBmcFJlY2VpdmVDYl9wKQoreworCXRFcGxLZXJuZWwgUmV0OworCisjaWYgKFRBUkdFVF9TWVNURU0gPT0gX1dJTjMyXykKKwlpbnQgaUVycm9yOworCVdTQURBVEEgV3NhOworCisjZW5kaWYKKworCS8vIHNldCBpbnN0YW5jZSB2YXJpYWJsZXMgdG8gMAorCUVQTF9NRU1TRVQoJlNkb1VkcEluc3RhbmNlX2csIDB4MDAsIHNpemVvZihTZG9VZHBJbnN0YW5jZV9nKSk7CisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCS8vIHNhdmUgcG9pbnRlciB0byBjYWxsYmFjay1mdW5jdGlvbgorCWlmIChmcFJlY2VpdmVDYl9wICE9IE5VTEwpIHsKKwkJU2RvVWRwSW5zdGFuY2VfZy5tX2ZwU2RvQXN5U2VxQ2IgPSBmcFJlY2VpdmVDYl9wOworCX0gZWxzZSB7CisJCVJldCA9IGtFcGxTZG9VZHBNaXNzQ2I7CisJCWdvdG8gRXhpdDsKKwl9CisKKyNpZiAoVEFSR0VUX1NZU1RFTSA9PSBfV0lOMzJfKQorCS8vIHN0YXJ0IHdpbnNvY2syIGZvciB3aW4zMgorCS8vIHdpbmRvd3Mgc3BlY2lmaWMgc3RhcnQgb2Ygc29ja2V0CisJaUVycm9yID0gV1NBU3RhcnR1cChNQUtFV09SRCgyLCAwKSwgJldzYSk7CisJaWYgKGlFcnJvciAhPSAwKSB7CisJCVJldCA9IGtFcGxTZG9VZHBOb1NvY2tldDsKKwkJZ290byBFeGl0OworCX0KKwkvLyBjcmVhdGUgY3JpdGljYWwgc2VjdGlvbiBmb3IgYWNjY2VzcyBvZiBpbnN0bmFjZSB2YXJpYWJsZXMKKwlTZG9VZHBJbnN0YW5jZV9nLm1fcENyaXRpY2FsU2VjdGlvbiA9CisJICAgICZTZG9VZHBJbnN0YW5jZV9nLm1fQ3JpdGljYWxTZWN0aW9uOworCUluaXRpYWxpemVDcml0aWNhbFNlY3Rpb24oU2RvVWRwSW5zdGFuY2VfZy5tX3BDcml0aWNhbFNlY3Rpb24pOworCisjZWxpZiAoVEFSR0VUX1NZU1RFTSA9PSBfTElOVVhfKSAmJiBkZWZpbmVkKF9fS0VSTkVMX18pCisJaW5pdF9jb21wbGV0aW9uKCZTZG9VZHBJbnN0YW5jZV9nLm1fQ29tcGxldGlvblVkcFRocmVhZCk7CisJU2RvVWRwSW5zdGFuY2VfZy5tX2lUZXJtaW5hdGVUaHJlYWQgPSAwOworI2VuZGlmCisKKwlTZG9VZHBJbnN0YW5jZV9nLm1fVGhyZWFkSGFuZGxlID0gMDsKKwlTZG9VZHBJbnN0YW5jZV9nLm1fVWRwU29ja2V0ID0gSU5WQUxJRF9TT0NLRVQ7CisKKwlSZXQgPSBFcGxTZG9VZHB1Q29uZmlnKElOQUREUl9BTlksIDApOworCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbFNkb1VkcHVEZWxJbnN0YW5jZQorLy8KKy8vIERlc2NyaXB0aW9uOiBkZWwgaW5zdGFuY2Ugb2YgdGhlIG1vZHVsZQorLy8gICAgICAgICAgICAgIGRlbCBzb2NrZXQgYW5kIGRlbCBMaXN0ZW4tVGhyZWFkCisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOgorLy8KKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgPSBFcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3RFcGxLZXJuZWwgUFVCTElDIEVwbFNkb1VkcHVEZWxJbnN0YW5jZSgpCit7CisJdEVwbEtlcm5lbCBSZXQ7CisKKyNpZiAoVEFSR0VUX1NZU1RFTSA9PSBfV0lOMzJfKQorCUJPT0wgZlRlcm1FcnJvcjsKKyNlbmRpZgorCisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwlpZiAoU2RvVWRwSW5zdGFuY2VfZy5tX1RocmVhZEhhbmRsZSAhPSAwKSB7CS8vIGxpc3RlbiB0aHJlYWQgd2FzIHN0YXJ0ZWQKKwkJLy8gY2xvc2UgdGhyZWFkCisjaWYgKFRBUkdFVF9TWVNURU0gPT0gX1dJTjMyXykKKwkJZlRlcm1FcnJvciA9CisJCSAgICBUZXJtaW5hdGVUaHJlYWQoU2RvVWRwSW5zdGFuY2VfZy5tX1RocmVhZEhhbmRsZSwgMCk7CisJCWlmIChmVGVybUVycm9yID09IEZBTFNFKSB7CisJCQlSZXQgPSBrRXBsU2RvVWRwVGhyZWFkRXJyb3I7CisJCQlnb3RvIEV4aXQ7CisJCX0KKyNlbGlmIChUQVJHRVRfU1lTVEVNID09IF9MSU5VWF8pICYmIGRlZmluZWQoX19LRVJORUxfXykKKwkJU2RvVWRwSW5zdGFuY2VfZy5tX2lUZXJtaW5hdGVUaHJlYWQgPSAxOworCQkvKiBraWxsX3Byb2MoU2RvVWRwSW5zdGFuY2VfZy5tX1RocmVhZEhhbmRsZSwgU0lHVEVSTSwgMSApOyAqLworCQlzZW5kX3NpZyhTSUdURVJNLCBTZG9VZHBJbnN0YW5jZV9nLm1fVGhyZWFkSGFuZGxlLCAxKTsKKwkJd2FpdF9mb3JfY29tcGxldGlvbigmU2RvVWRwSW5zdGFuY2VfZy5tX0NvbXBsZXRpb25VZHBUaHJlYWQpOworI2VuZGlmCisKKwkJU2RvVWRwSW5zdGFuY2VfZy5tX1RocmVhZEhhbmRsZSA9IDA7CisJfQorCisJaWYgKFNkb1VkcEluc3RhbmNlX2cubV9VZHBTb2NrZXQgIT0gSU5WQUxJRF9TT0NLRVQpIHsKKwkJLy8gY2xvc2Ugc29ja2V0CisJCWNsb3Nlc29ja2V0KFNkb1VkcEluc3RhbmNlX2cubV9VZHBTb2NrZXQpOworCQlTZG9VZHBJbnN0YW5jZV9nLm1fVWRwU29ja2V0ID0gSU5WQUxJRF9TT0NLRVQ7CisJfQorI2lmIChUQVJHRVRfU1lTVEVNID09IF9XSU4zMl8pCisJLy8gZGVsZXRlIGNyaXRpY2FsIHNlY3Rpb24KKwlEZWxldGVDcml0aWNhbFNlY3Rpb24oU2RvVWRwSW5zdGFuY2VfZy5tX3BDcml0aWNhbFNlY3Rpb24pOworI2VuZGlmCisKKyNpZiAoVEFSR0VUX1NZU1RFTSA9PSBfV0lOMzJfKQorCS8vIGZvciB3aW4gMzIKKwlXU0FDbGVhbnVwKCk7CisjZW5kaWYKKworI2lmIChUQVJHRVRfU1lTVEVNID09IF9XSU4zMl8pCisgICAgICBFeGl0OgorI2VuZGlmCisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsU2RvVWRwdUNvbmZpZworLy8KKy8vIERlc2NyaXB0aW9uOiByZWNvbmZpZ3VyYXRlIHNvY2tldCB3aXRoIG5ldyBJUC1BZGRyZXNzCisvLyAgICAgICAgICAgICAgLT4gbmVlZGVkIGZvciBOTVQgUmVzZXRDb25maWd1cmF0aW9uCisvLworLy8gUGFyYW1ldGVyczogIHVsSXBBZGRyX3AgICAgICA9IElwQWRkcmVzcyBpbiBwbGF0Zm9ybSBieXRlIG9yZGVyCisvLyAgICAgICAgICAgICAgdWlQb3J0X3AgICAgICAgID0gcG9ydCBudW1iZXIgaW4gcGxhdGZvcm0gYnl0ZSBvcmRlcgorLy8KKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgPSBFcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3RFcGxLZXJuZWwgUFVCTElDIEVwbFNkb1VkcHVDb25maWcodW5zaWduZWQgbG9uZyB1bElwQWRkcl9wLAorCQkJCSAgIHVuc2lnbmVkIGludCB1aVBvcnRfcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gQWRkcjsKKwlpbnQgaUVycm9yOworCisjaWYgKFRBUkdFVF9TWVNURU0gPT0gX1dJTjMyXykKKwlCT09MIGZUZXJtRXJyb3I7CisJdW5zaWduZWQgbG9uZyB1bFRocmVhZElkOworI2VuZGlmCisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCWlmICh1aVBvcnRfcCA9PSAwKSB7CS8vIHNldCBVRFAgcG9ydCB0byBkZWZhdWx0IHBvcnQgbnVtYmVyCisJCXVpUG9ydF9wID0gRVBMX0NfU0RPX0VQTF9QT1JUOworCX0gZWxzZSBpZiAodWlQb3J0X3AgPiA2NTUzNSkgeworCQlSZXQgPSBrRXBsU2RvVWRwU29ja2V0RXJyb3I7CisJCWdvdG8gRXhpdDsKKwl9CisKKwlpZiAoU2RvVWRwSW5zdGFuY2VfZy5tX1RocmVhZEhhbmRsZSAhPSAwKSB7CS8vIGxpc3RlbiB0aHJlYWQgd2FzIHN0YXJ0ZWQKKworCQkvLyBjbG9zZSBvbGQgdGhyZWFkCisjaWYgKFRBUkdFVF9TWVNURU0gPT0gX1dJTjMyXykKKwkJZlRlcm1FcnJvciA9CisJCSAgICBUZXJtaW5hdGVUaHJlYWQoU2RvVWRwSW5zdGFuY2VfZy5tX1RocmVhZEhhbmRsZSwgMCk7CisJCWlmIChmVGVybUVycm9yID09IEZBTFNFKSB7CisJCQlSZXQgPSBrRXBsU2RvVWRwVGhyZWFkRXJyb3I7CisJCQlnb3RvIEV4aXQ7CisJCX0KKyNlbGlmIChUQVJHRVRfU1lTVEVNID09IF9MSU5VWF8pICYmIGRlZmluZWQoX19LRVJORUxfXykKKwkJU2RvVWRwSW5zdGFuY2VfZy5tX2lUZXJtaW5hdGVUaHJlYWQgPSAxOworCQkvKiBraWxsX3Byb2MoU2RvVWRwSW5zdGFuY2VfZy5tX1RocmVhZEhhbmRsZSwgU0lHVEVSTSwgMSApOyAqLworCQlzZW5kX3NpZyhTSUdURVJNLCBTZG9VZHBJbnN0YW5jZV9nLm1fVGhyZWFkSGFuZGxlLCAxKTsKKwkJd2FpdF9mb3JfY29tcGxldGlvbigmU2RvVWRwSW5zdGFuY2VfZy5tX0NvbXBsZXRpb25VZHBUaHJlYWQpOworCQlTZG9VZHBJbnN0YW5jZV9nLm1faVRlcm1pbmF0ZVRocmVhZCA9IDA7CisjZW5kaWYKKworCQlTZG9VZHBJbnN0YW5jZV9nLm1fVGhyZWFkSGFuZGxlID0gMDsKKwl9CisKKwlpZiAoU2RvVWRwSW5zdGFuY2VfZy5tX1VkcFNvY2tldCAhPSBJTlZBTElEX1NPQ0tFVCkgeworCQkvLyBjbG9zZSBzb2NrZXQKKwkJaUVycm9yID0gY2xvc2Vzb2NrZXQoU2RvVWRwSW5zdGFuY2VfZy5tX1VkcFNvY2tldCk7CisJCVNkb1VkcEluc3RhbmNlX2cubV9VZHBTb2NrZXQgPSBJTlZBTElEX1NPQ0tFVDsKKwkJaWYgKGlFcnJvciAhPSAwKSB7CisJCQlSZXQgPSBrRXBsU2RvVWRwU29ja2V0RXJyb3I7CisJCQlnb3RvIEV4aXQ7CisJCX0KKwl9CisJLy8gY3JlYXRlIFNvY2tldAorCVNkb1VkcEluc3RhbmNlX2cubV9VZHBTb2NrZXQgPSBzb2NrZXQoUEZfSU5FVCwgU09DS19ER1JBTSwgSVBQUk9UT19VRFApOworCWlmIChTZG9VZHBJbnN0YW5jZV9nLm1fVWRwU29ja2V0ID09IElOVkFMSURfU09DS0VUKSB7CisJCVJldCA9IGtFcGxTZG9VZHBOb1NvY2tldDsKKwkJRVBMX0RCR0xWTF9TRE9fVFJBQ0UwKCJFcGxTZG9VZHB1Q29uZmlnOiBzb2NrZXQoKSBmYWlsZWRcbiIpOworCQlnb3RvIEV4aXQ7CisJfQorCS8vIGJpbmQgc29ja2V0CisJQWRkci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwlBZGRyLnNpbl9wb3J0ID0gaHRvbnMoKHVuc2lnbmVkIHNob3J0KXVpUG9ydF9wKTsKKwlBZGRyLnNpbl9hZGRyLnNfYWRkciA9IGh0b25sKHVsSXBBZGRyX3ApOworCWlFcnJvciA9CisJICAgIGJpbmQoU2RvVWRwSW5zdGFuY2VfZy5tX1VkcFNvY2tldCwgKHN0cnVjdCBzb2NrYWRkciAqKSZBZGRyLAorCQkgc2l6ZW9mKEFkZHIpKTsKKwlpZiAoaUVycm9yIDwgMCkgeworCQkvL2lFcnJvciA9IFdTQUdldExhc3RFcnJvcigpOworCQlFUExfREJHTFZMX1NET19UUkFDRTEKKwkJICAgICgiRXBsU2RvVWRwdUNvbmZpZzogYmluZCgpIGZpbmlzaGVkIHdpdGggJWlcbiIsIGlFcnJvcik7CisJCVJldCA9IGtFcGxTZG9VZHBOb1NvY2tldDsKKwkJZ290byBFeGl0OworCX0KKwkvLyBjcmVhdGUgTGlzdGVuLVRocmVhZAorI2lmIChUQVJHRVRfU1lTVEVNID09IF9XSU4zMl8pCisJLy8gZm9yIHdpbjMyCisKKwkvLyBjcmVhdGUgdGhyZWFkCisJU2RvVWRwSW5zdGFuY2VfZy5tX1RocmVhZEhhbmRsZSA9IENyZWF0ZVRocmVhZChOVUxMLAorCQkJCQkJICAgICAgIDAsCisJCQkJCQkgICAgICAgRXBsU2RvVWRwVGhyZWFkLAorCQkJCQkJICAgICAgICZTZG9VZHBJbnN0YW5jZV9nLAorCQkJCQkJICAgICAgIDAsICZ1bFRocmVhZElkKTsKKwlpZiAoU2RvVWRwSW5zdGFuY2VfZy5tX1RocmVhZEhhbmRsZSA9PSBOVUxMKSB7CisJCVJldCA9IGtFcGxTZG9VZHBUaHJlYWRFcnJvcjsKKwkJZ290byBFeGl0OworCX0KKyNlbGlmIChUQVJHRVRfU1lTVEVNID09IF9MSU5VWF8pICYmIGRlZmluZWQoX19LRVJORUxfXykKKworCVNkb1VkcEluc3RhbmNlX2cubV9UaHJlYWRIYW5kbGUgPQorCSAgICBrZXJuZWxfdGhyZWFkKEVwbFNkb1VkcFRocmVhZCwgJlNkb1VkcEluc3RhbmNlX2csIENMT05FX0tFUk5FTCk7CisJaWYgKFNkb1VkcEluc3RhbmNlX2cubV9UaHJlYWRIYW5kbGUgPT0gMCkgeworCQlSZXQgPSBrRXBsU2RvVWRwVGhyZWFkRXJyb3I7CisJCWdvdG8gRXhpdDsKKwl9CisjZW5kaWYKKworICAgICAgRXhpdDoKKwlyZXR1cm4gUmV0OworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbFNkb1VkcHVJbml0Q29uCisvLworLy8gRGVzY3JpcHRpb246IGluaXQgYSBuZXcgY29ubmVjdAorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczogIHBTZG9Db25IYW5kbGVfcCA9IHBvaW50ZXIgZm9yIHRoZSBuZXcgY29ubmVjdGlvbiBoYW5kbGUKKy8vICAgICAgICAgICAgICB1aVRhcmdldE5vZGVJZF9wID0gTm9kZUlkIG9mIHRoZSB0YXJnZXQgbm9kZQorLy8KKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgPSBFcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3RFcGxLZXJuZWwgUFVCTElDIEVwbFNkb1VkcHVJbml0Q29uKHRFcGxTZG9Db25IZGwgKiBwU2RvQ29uSGFuZGxlX3AsCisJCQkJICAgIHVuc2lnbmVkIGludCB1aVRhcmdldE5vZGVJZF9wKQoreworCXRFcGxLZXJuZWwgUmV0OworCXVuc2lnbmVkIGludCB1aUNvdW50OworCXVuc2lnbmVkIGludCB1aUZyZWVDb247CisJdEVwbFNkb1VkcENvbiAqcFNkb1VkcENvbjsKKworCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJLy8gZ2V0IGZyZWUgZW50cnkgaW4gY29udHJvbCBzdHJ1Y3R1cmUKKwl1aUNvdW50ID0gMDsKKwl1aUZyZWVDb24gPSBFUExfU0RPX01BWF9DT05ORUNUSU9OX1VEUDsKKwlwU2RvVWRwQ29uID0gJlNkb1VkcEluc3RhbmNlX2cubV9hU2RvQWJzVWRwQ29ubmVjdGlvblswXTsKKwl3aGlsZSAodWlDb3VudCA8IEVQTF9TRE9fTUFYX0NPTk5FQ1RJT05fVURQKSB7CisJCWlmICgocFNkb1VkcENvbi0+bV91bElwQWRkciAmIGh0b25sKDB4RkYpKSA9PSBodG9ubCh1aVRhcmdldE5vZGVJZF9wKSkgewkvLyBleGlzdGluZyBjb25uZWN0aW9uIHRvIHRhcmdldCBub2RlIGZvdW5kCisJCQkvLyBzZXQgaGFuZGxlCisJCQkqcFNkb0NvbkhhbmRsZV9wID0gKHVpQ291bnQgfCBFUExfU0RPX1VEUF9IQU5ETEUpOworCisJCQlnb3RvIEV4aXQ7CisJCX0gZWxzZSBpZiAoKHBTZG9VZHBDb24tPm1fdWxJcEFkZHIgPT0gMCkKKwkJCSAgICYmIChwU2RvVWRwQ29uLT5tX3VpUG9ydCA9PSAwKSkgeworCQkJdWlGcmVlQ29uID0gdWlDb3VudDsKKwkJfQorCQl1aUNvdW50Kys7CisJCXBTZG9VZHBDb24rKzsKKwl9CisKKwlpZiAodWlGcmVlQ29uID09IEVQTF9TRE9fTUFYX0NPTk5FQ1RJT05fVURQKSB7CisJCS8vIGVycm9yIG5vIGZyZWUgaGFuZGxlCisJCVJldCA9IGtFcGxTZG9VZHBOb0ZyZWVIYW5kbGU7CisJfSBlbHNlIHsKKwkJcFNkb1VkcENvbiA9CisJCSAgICAmU2RvVWRwSW5zdGFuY2VfZy5tX2FTZG9BYnNVZHBDb25uZWN0aW9uW3VpRnJlZUNvbl07CisJCS8vIHNhdmUgaW5mb3MgZm9yIGNvbm5lY3Rpb24KKwkJcFNkb1VkcENvbi0+bV91aVBvcnQgPSBodG9ucyhFUExfQ19TRE9fRVBMX1BPUlQpOworCQlwU2RvVWRwQ29uLT5tX3VsSXBBZGRyID0gaHRvbmwoMHhDMEE4NjQwMCB8IHVpVGFyZ2V0Tm9kZUlkX3ApOwkvLyAxOTIuMTY4LjEwMC51aVRhcmdldE5vZGVJZF9wCisKKwkJLy8gc2V0IGhhbmRsZQorCQkqcFNkb0NvbkhhbmRsZV9wID0gKHVpRnJlZUNvbiB8IEVQTF9TRE9fVURQX0hBTkRMRSk7CisKKwl9CisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIFJldDsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxTZG9VZHB1U2VuZERhdGEKKy8vCisvLyBEZXNjcmlwdGlvbjogc2VuZCBkYXRhIHVzaW5nIGV4aXNpdGluZyBjb25uZWN0aW9uCisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOiAgU2RvQ29uSGFuZGxlX3AgID0gY29ubmVjdGlvbiBoYW5kbGUKKy8vICAgICAgICAgICAgICBwU3JjRGF0YV9wICAgICAgPSBwb2ludGVyIHRvIGRhdGEKKy8vICAgICAgICAgICAgICBkd0RhdGFTaXplX3AgICAgPSBudW1iZXIgb2YgZGF0YWJ5dGUKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+IHdpdGhvdXQgYXNlbmQtaGVhZGVyISEhCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgID0gRXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0RXBsS2VybmVsIFBVQkxJQyBFcGxTZG9VZHB1U2VuZERhdGEodEVwbFNkb0NvbkhkbCBTZG9Db25IYW5kbGVfcCwKKwkJCQkgICAgIHRFcGxGcmFtZSAqIHBTcmNEYXRhX3AsIERXT1JEIGR3RGF0YVNpemVfcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKwlpbnQgaUVycm9yOworCXVuc2lnbmVkIGludCB1aUFycmF5OworCXN0cnVjdCBzb2NrYWRkcl9pbiBBZGRyOworCisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwl1aUFycmF5ID0gKFNkb0NvbkhhbmRsZV9wICYgfkVQTF9TRE9fQVNZX0hBTkRMRV9NQVNLKTsKKwlpZiAodWlBcnJheSA+PSBFUExfU0RPX01BWF9DT05ORUNUSU9OX1VEUCkgeworCQlSZXQgPSBrRXBsU2RvVWRwSW52YWxpZEhkbDsKKwkJZ290byBFeGl0OworCX0KKwkvL3NldCBtZXNzYWdlIHR5cGUKKwlBbWlTZXRCeXRlVG9MZSgmcFNyY0RhdGFfcC0+bV9sZV9iTWVzc2FnZVR5cGUsIDB4MDYpOwkvLyBTRE8KKwkvLyB0YXJnZXQgbm9kZSBpZCAoZm9yIFVkcCA9IDApCisJQW1pU2V0Qnl0ZVRvTGUoJnBTcmNEYXRhX3AtPm1fbGVfYkRzdE5vZGVJZCwgMHgwMCk7CisJLy8gc2V0IHNvdXJjZS1ub2RlaWQgKGZvciBVZHAgPSAwKQorCUFtaVNldEJ5dGVUb0xlKCZwU3JjRGF0YV9wLT5tX2xlX2JTcmNOb2RlSWQsIDB4MDApOworCisJLy8gY2FsYyBzaXplCisJZHdEYXRhU2l6ZV9wICs9IEVQTF9BU05EX0hFQURFUl9TSVpFOworCisJLy8gY2FsbCBzZW5kdG8KKwlBZGRyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworI2lmIChUQVJHRVRfU1lTVEVNID09IF9XSU4zMl8pCisJLy8gZW50ZXIgIGNyaXRpY2FsIHNlY3Rpb24gZm9yIHByb2Nlc3MgZnVuY3Rpb24KKwlFbnRlckNyaXRpY2FsU2VjdGlvbihTZG9VZHBJbnN0YW5jZV9nLm1fcENyaXRpY2FsU2VjdGlvbik7CisjZW5kaWYKKworCUFkZHIuc2luX3BvcnQgPQorCSAgICAodW5zaWduZWQgc2hvcnQpU2RvVWRwSW5zdGFuY2VfZy5tX2FTZG9BYnNVZHBDb25uZWN0aW9uW3VpQXJyYXldLgorCSAgICBtX3VpUG9ydDsKKwlBZGRyLnNpbl9hZGRyLnNfYWRkciA9CisJICAgIFNkb1VkcEluc3RhbmNlX2cubV9hU2RvQWJzVWRwQ29ubmVjdGlvblt1aUFycmF5XS5tX3VsSXBBZGRyOworCisjaWYgKFRBUkdFVF9TWVNURU0gPT0gX1dJTjMyXykKKwkvLyBsZWF2ZSBjcml0aWNhbCBzZWN0aW9uIGZvciBwcm9jZXNzIGZ1bmN0aW9uCisJTGVhdmVDcml0aWNhbFNlY3Rpb24oU2RvVWRwSW5zdGFuY2VfZy5tX3BDcml0aWNhbFNlY3Rpb24pOworI2VuZGlmCisKKwlpRXJyb3IgPSBzZW5kdG8oU2RvVWRwSW5zdGFuY2VfZy5tX1VkcFNvY2tldCwJLy8gc29ja2V0aGFuZGxlCisJCQkoY29uc3QgY2hhciAqKSZwU3JjRGF0YV9wLT5tX2xlX2JNZXNzYWdlVHlwZSwJLy8gZGF0YSB0byBzZW5kCisJCQlkd0RhdGFTaXplX3AsCS8vIG51bWJlciBvZiBieXRlcyB0byBzZW5kCisJCQkwLAkvLyBmbGFncworCQkJKHN0cnVjdCBzb2NrYWRkciAqKSZBZGRyLAkvLyB0YXJnZXQKKwkJCXNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pKTsJLy8gc2l6ZW9mIHRhcmdldGFkcmVzcworCWlmIChpRXJyb3IgPCAwKSB7CisJCUVQTF9EQkdMVkxfU0RPX1RSQUNFMQorCQkgICAgKCJFcGxTZG9VZHB1U2VuZERhdGE6IHNlbmR0bygpIGZpbmlzaGVkIHdpdGggJWlcbiIsIGlFcnJvcik7CisJCVJldCA9IGtFcGxTZG9VZHBTZW5kRXJyb3I7CisJCWdvdG8gRXhpdDsKKwl9CisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIFJldDsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxTZG9VZHB1RGVsQ29uCisvLworLy8gRGVzY3JpcHRpb246IGRlbGV0ZSBjb25uZWN0aW9uIGZyb20gaW50ZXJuIHN0cnVjdHVyZQorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczogIFNkb0NvbkhhbmRsZV9wICA9IGNvbm5lY3Rpb24gaGFuZGxlCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgID0gRXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0RXBsS2VybmVsIFBVQkxJQyBFcGxTZG9VZHB1RGVsQ29uKHRFcGxTZG9Db25IZGwgU2RvQ29uSGFuZGxlX3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisJdW5zaWduZWQgaW50IHVpQXJyYXk7CisKKwl1aUFycmF5ID0gKFNkb0NvbkhhbmRsZV9wICYgfkVQTF9TRE9fQVNZX0hBTkRMRV9NQVNLKTsKKworCWlmICh1aUFycmF5ID49IEVQTF9TRE9fTUFYX0NPTk5FQ1RJT05fVURQKSB7CisJCVJldCA9IGtFcGxTZG9VZHBJbnZhbGlkSGRsOworCQlnb3RvIEV4aXQ7CisJfSBlbHNlIHsKKwkJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJfQorCisJLy8gZGVsZXRlIGNvbm5lY3Rpb24KKwlTZG9VZHBJbnN0YW5jZV9nLm1fYVNkb0Fic1VkcENvbm5lY3Rpb25bdWlBcnJheV0ubV91bElwQWRkciA9IDA7CisJU2RvVWRwSW5zdGFuY2VfZy5tX2FTZG9BYnNVZHBDb25uZWN0aW9uW3VpQXJyYXldLm1fdWlQb3J0ID0gMDsKKworICAgICAgRXhpdDoKKwlyZXR1cm4gUmV0OworfQorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgIFAgUiBJIFYgQSBUIEUgICBGIFUgTiBDIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgICAgIEVwbFNkb1VkcFRocmVhZAorLy8KKy8vIERlc2NyaXB0aW9uOiAgICAgdGhyZWFkIGNoZWNrIHNvY2tldCBmb3IgbmV3IGRhdGEKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6ICAgICAgbHBQYXJhbWV0ZXIgPSBwb2ludGVyIHRvIHBhcmFtZXRlciB0eXBlIHRFcGxTZG9VZHBUaHJlYWRQYXJhCisvLworLy8KKy8vIFJldHVybnM6ICAgICAgICAgRFdPUkQgICA9ICAgZXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjaWYgKFRBUkdFVF9TWVNURU0gPT0gX1dJTjMyXykKK3N0YXRpYyBEV09SRCBQVUJMSUMgRXBsU2RvVWRwVGhyZWFkKExQVk9JRCBscFBhcmFtZXRlcikKKyNlbGlmIChUQVJHRVRfU1lTVEVNID09IF9MSU5VWF8pICYmIGRlZmluZWQoX19LRVJORUxfXykKK3N0YXRpYyBpbnQgRXBsU2RvVWRwVGhyZWFkKHZvaWQgKnBBcmdfcCkKKyNlbmRpZgoreworCisJdEVwbFNkb1VkcEluc3RhbmNlICpwSW5zdGFuY2U7CisJc3RydWN0IHNvY2thZGRyX2luIFJlbW90ZUFkZHI7CisJaW50IGlFcnJvcjsKKwlpbnQgaUNvdW50OworCWludCBpRnJlZUVudHJ5OworCUJZVEUgYWJCdWZmZXJbRVBMX01BWF9TRE9fUkVDX0ZSQU1FX1NJWkVdOworCXVuc2lnbmVkIGludCB1aVNpemU7CisJdEVwbFNkb0NvbkhkbCBTZG9Db25IZGw7CisKKyNpZiAoVEFSR0VUX1NZU1RFTSA9PSBfV0lOMzJfKQorCXBJbnN0YW5jZSA9ICh0RXBsU2RvVWRwSW5zdGFuY2UgKikgbHBQYXJhbWV0ZXI7CisKKwlmb3IgKDs7KQorI2VsaWYgKFRBUkdFVF9TWVNURU0gPT0gX0xJTlVYXykgJiYgZGVmaW5lZChfX0tFUk5FTF9fKQorCXBJbnN0YW5jZSA9ICh0RXBsU2RvVWRwSW5zdGFuY2UgKikgcEFyZ19wOworCWRhZW1vbml6ZSgiRXBsU2RvVWRwVGhyZWFkIik7CisJYWxsb3dfc2lnbmFsKFNJR1RFUk0pOworCisJZm9yICg7IHBJbnN0YW5jZS0+bV9pVGVybWluYXRlVGhyZWFkID09IDA7KQorI2VuZGlmCisKKwl7CisJCS8vIHdhaXQgZm9yIGRhdGEKKwkJdWlTaXplID0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcik7CisJCWlFcnJvciA9IHJlY3Zmcm9tKHBJbnN0YW5jZS0+bV9VZHBTb2NrZXQsCS8vIFNvY2tldAorCQkJCSAgKGNoYXIgKikmYWJCdWZmZXJbMF0sCS8vIGJ1ZmZlciBmb3IgZGF0YQorCQkJCSAgc2l6ZW9mKGFiQnVmZmVyKSwJLy8gc2l6ZSBvZiB0aGUgYnVmZmVyCisJCQkJICAwLAkvLyBmbGFncworCQkJCSAgKHN0cnVjdCBzb2NrYWRkciAqKSZSZW1vdGVBZGRyLAorCQkJCSAgKGludCAqKSZ1aVNpemUpOworI2lmIChUQVJHRVRfU1lTVEVNID09IF9MSU5VWF8pICYmIGRlZmluZWQoX19LRVJORUxfXykKKwkJaWYgKGlFcnJvciA9PSAtRVJFU1RBUlRTWVMpIHsKKwkJCWJyZWFrOworCQl9CisjZW5kaWYKKwkJaWYgKGlFcnJvciA+IDApIHsKKwkJCS8vIGdldCBoYW5kbGUgZm9yIGhpZ2hlciBsYXllcgorCQkJaUNvdW50ID0gMDsKKwkJCWlGcmVlRW50cnkgPSAweEZGRkY7CisjaWYgKFRBUkdFVF9TWVNURU0gPT0gX1dJTjMyXykKKwkJCS8vIGVudGVyICBjcml0aWNhbCBzZWN0aW9uIGZvciBwcm9jZXNzIGZ1bmN0aW9uCisJCQlFbnRlckNyaXRpY2FsU2VjdGlvbihTZG9VZHBJbnN0YW5jZV9nLgorCQkJCQkgICAgIG1fcENyaXRpY2FsU2VjdGlvbik7CisjZW5kaWYKKwkJCXdoaWxlIChpQ291bnQgPCBFUExfU0RPX01BWF9DT05ORUNUSU9OX1VEUCkgeworCQkJCS8vIGNoZWNrIGlmIHRoaXMgY29ubmVjdGlvbiBpcyBhbHJlYWR5IGtub3duCisJCQkJaWYgKChwSW5zdGFuY2UtPm1fYVNkb0Fic1VkcENvbm5lY3Rpb25baUNvdW50XS4KKwkJCQkgICAgIG1fdWxJcEFkZHIgPT0gUmVtb3RlQWRkci5zaW5fYWRkci5zX2FkZHIpCisJCQkJICAgICYmIChwSW5zdGFuY2UtPgorCQkJCQltX2FTZG9BYnNVZHBDb25uZWN0aW9uW2lDb3VudF0uCisJCQkJCW1fdWlQb3J0ID09IFJlbW90ZUFkZHIuc2luX3BvcnQpKSB7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCWlmICgocEluc3RhbmNlLT5tX2FTZG9BYnNVZHBDb25uZWN0aW9uW2lDb3VudF0uCisJCQkJICAgICBtX3VsSXBBZGRyID09IDApCisJCQkJICAgICYmIChwSW5zdGFuY2UtPgorCQkJCQltX2FTZG9BYnNVZHBDb25uZWN0aW9uW2lDb3VudF0uCisJCQkJCW1fdWlQb3J0ID09IDApCisJCQkJICAgICYmIChpRnJlZUVudHJ5ID09IDB4RkZGRikpCisJCQkJeworCQkJCQlpRnJlZUVudHJ5ID0gaUNvdW50OworCQkJCX0KKworCQkJCWlDb3VudCsrOworCQkJfQorCisJCQlpZiAoaUNvdW50ID09IEVQTF9TRE9fTUFYX0NPTk5FQ1RJT05fVURQKSB7CisJCQkJLy8gY29ubmVjdGlvbiB1bmtub3duCisJCQkJLy8gc2VlIGlmIHRoZXJlIGlzIGEgZnJlZSBoYW5kbGUKKwkJCQlpZiAoaUZyZWVFbnRyeSAhPSAweEZGRkYpIHsKKwkJCQkJLy8gc2F2ZSBhZHJlc3MgaW5mb3MKKwkJCQkJcEluc3RhbmNlLT4KKwkJCQkJICAgIG1fYVNkb0Fic1VkcENvbm5lY3Rpb25baUZyZWVFbnRyeV0uCisJCQkJCSAgICBtX3VsSXBBZGRyID0KKwkJCQkJICAgIFJlbW90ZUFkZHIuc2luX2FkZHIuc19hZGRyOworCQkJCQlwSW5zdGFuY2UtPgorCQkJCQkgICAgbV9hU2RvQWJzVWRwQ29ubmVjdGlvbltpRnJlZUVudHJ5XS4KKwkJCQkJICAgIG1fdWlQb3J0ID0gUmVtb3RlQWRkci5zaW5fcG9ydDsKKyNpZiAoVEFSR0VUX1NZU1RFTSA9PSBfV0lOMzJfKQorCQkJCQkvLyBsZWF2ZSBjcml0aWNhbCBzZWN0aW9uIGZvciBwcm9jZXNzIGZ1bmN0aW9uCisJCQkJCUxlYXZlQ3JpdGljYWxTZWN0aW9uKFNkb1VkcEluc3RhbmNlX2cuCisJCQkJCQkJICAgICBtX3BDcml0aWNhbFNlY3Rpb24pOworI2VuZGlmCisJCQkJCS8vIGNhbGwgY2FsbGJhY2sKKwkJCQkJU2RvQ29uSGRsID0gaUZyZWVFbnRyeTsKKwkJCQkJU2RvQ29uSGRsIHw9IEVQTF9TRE9fVURQX0hBTkRMRTsKKwkJCQkJLy8gb2Zmc2V0IDQgLT4gc3RhcnQgb2YgU0RPIFNlcXVlbmNlIGhlYWRlcgorCQkJCQlwSW5zdGFuY2UtPm1fZnBTZG9Bc3lTZXFDYihTZG9Db25IZGwsCisJCQkJCQkJCSAgICh0RXBsQXN5U2RvU2VxCisJCQkJCQkJCSAgICAqKSAmCisJCQkJCQkJCSAgIGFiQnVmZmVyWzRdLAorCQkJCQkJCQkgICAoaUVycm9yIC0KKwkJCQkJCQkJICAgIDQpKTsKKwkJCQl9IGVsc2UgeworCQkJCQlFUExfREJHTFZMX1NET19UUkFDRTAKKwkJCQkJICAgICgiRXJyb3IgaW4gRXBsU2RvVWRwVGhyZWFkKCkgbm8gZnJlZSBoYW5kbGVcbiIpOworI2lmIChUQVJHRVRfU1lTVEVNID09IF9XSU4zMl8pCisJCQkJCS8vIGxlYXZlIGNyaXRpY2FsIHNlY3Rpb24gZm9yIHByb2Nlc3MgZnVuY3Rpb24KKwkJCQkJTGVhdmVDcml0aWNhbFNlY3Rpb24oU2RvVWRwSW5zdGFuY2VfZy4KKwkJCQkJCQkgICAgIG1fcENyaXRpY2FsU2VjdGlvbik7CisjZW5kaWYKKwkJCQl9CisKKwkJCX0gZWxzZSB7CisJCQkJLy8ga25vd24gY29ubmVjdGlvbgorCQkJCS8vIGNhbGwgY2FsbGJhY2sgd2l0aCBjb3JyZWN0IGhhbmRsZQorCQkJCVNkb0NvbkhkbCA9IGlDb3VudDsKKwkJCQlTZG9Db25IZGwgfD0gRVBMX1NET19VRFBfSEFORExFOworI2lmIChUQVJHRVRfU1lTVEVNID09IF9XSU4zMl8pCisJCQkJLy8gbGVhdmUgY3JpdGljYWwgc2VjdGlvbiBmb3IgcHJvY2VzcyBmdW5jdGlvbgorCQkJCUxlYXZlQ3JpdGljYWxTZWN0aW9uKFNkb1VkcEluc3RhbmNlX2cuCisJCQkJCQkgICAgIG1fcENyaXRpY2FsU2VjdGlvbik7CisjZW5kaWYKKwkJCQkvLyBvZmZzZXQgNCAtPiBzdGFydCBvZiBTRE8gU2VxdWVuY2UgaGVhZGVyCisJCQkJcEluc3RhbmNlLT5tX2ZwU2RvQXN5U2VxQ2IoU2RvQ29uSGRsLAorCQkJCQkJCSAgICh0RXBsQXN5U2RvU2VxICopICYKKwkJCQkJCQkgICBhYkJ1ZmZlcls0XSwKKwkJCQkJCQkgICAoaUVycm9yIC0gNCkpOworCQkJfQorCQl9CQkvLyBlbmQgb2YgIGlmKGlFcnJvciE9U09DS0VUX0VSUk9SKQorCX0JCQkvLyBlbmQgb2YgZm9yKDs7KQorCisjaWYgKFRBUkdFVF9TWVNURU0gPT0gX0xJTlVYXykgJiYgZGVmaW5lZChfX0tFUk5FTF9fKQorCWNvbXBsZXRlX2FuZF9leGl0KCZTZG9VZHBJbnN0YW5jZV9nLm1fQ29tcGxldGlvblVkcFRocmVhZCwgMCk7CisjZW5kaWYKKworCXJldHVybiAwOworfQorCisjZW5kaWYgLy8gZW5kIG9mICNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfU0RPX1VEUCkpICE9IDApCisKKy8vIEVPRgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxTdGF0dXN1LmMgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbFN0YXR1c3UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODlmOTEyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxTdGF0dXN1LmMKQEAgLTAsMCArMSwzODAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBzb3VyY2UgZmlsZSBmb3IgU3RhdHVzdS1Nb2R1bGUKKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgICAgICAgICRSQ1NmaWxlOiBFcGxTdGF0dXN1LmMsdiAkCisKKyAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAorCisgICAgICAgICAgICAgICAgJFJldmlzaW9uOiAxLjUgJCAgJERhdGU6IDIwMDgvMTAvMTcgMTU6MzI6MzIgJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgICAgIEdDQyBWMy40CisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwNi8xMS8xNSBkLmsuOiAgIHN0YXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAidXNlci9FcGxTdGF0dXN1LmgiCisjaW5jbHVkZSAidXNlci9FcGxEbGx1Q2FsLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIEcgTCBPIEIgQSBMICAgRCBFIEYgSSBOIEkgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBtb2R1bCBnbG9iYWxlIHZhcnMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICBDIEwgQSBTIFMgIDx4eHh4eD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLy8KKy8vIERlc2NyaXB0aW9uOgorLy8KKy8vCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgIFAgUiBJIFYgQSBUIEUgICBEIEUgRiBJIE4gSSBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvbnN0IGRlZmluZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCB0eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordHlwZWRlZiBzdHJ1Y3QgeworCXRFcGxTdGF0dXN1Q2JSZXNwb25zZSBtX2FwZm5DYlJlc3BvbnNlWzI1NF07CisKK30gdEVwbFN0YXR1c3VJbnN0YW5jZTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvY2FsIHZhcnMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB0RXBsU3RhdHVzdUluc3RhbmNlIEVwbFN0YXR1c3VJbnN0YW5jZV9nOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHRFcGxLZXJuZWwgUFVCTElDIEVwbFN0YXR1c3VDYlN0YXR1c1Jlc3BvbnNlKHRFcGxGcmFtZUluZm8gKgorCQkJCQkJICAgIHBGcmFtZUluZm9fcCk7CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgUCBVIEIgTCBJIEMgICBGIFUgTiBDIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxTdGF0dXN1SW5pdAorLy8KKy8vIERlc2NyaXB0aW9uOiBpbml0IGZpcnN0IGluc3RhbmNlIG9mIHRoZSBtb2R1bGUKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6CisvLworLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICA9IGVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMgRXBsU3RhdHVzdUluaXQoKQoreworCXRFcGxLZXJuZWwgUmV0OworCisJUmV0ID0gRXBsU3RhdHVzdUFkZEluc3RhbmNlKCk7CisKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxTdGF0dXN1QWRkSW5zdGFuY2UKKy8vCisvLyBEZXNjcmlwdGlvbjogaW5pdCBvdGhlciBpbnN0YW5jZXMgb2YgdGhlIG1vZHVsZQorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczoKKy8vCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgID0gZXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxTdGF0dXN1QWRkSW5zdGFuY2UoKQoreworCXRFcGxLZXJuZWwgUmV0OworCisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwkvLyByZXNldCBpbnN0YW5jZSBzdHJ1Y3R1cmUKKwlFUExfTUVNU0VUKCZFcGxTdGF0dXN1SW5zdGFuY2VfZywgMCwgc2l6ZW9mKEVwbFN0YXR1c3VJbnN0YW5jZV9nKSk7CisKKwkvLyByZWdpc3RlciBTdGF0dXNSZXNwb25zZSBjYWxsYmFjayBmdW5jdGlvbgorCVJldCA9CisJICAgIEVwbERsbHVDYWxSZWdBc25kU2VydmljZShrRXBsRGxsQXNuZFN0YXR1c1Jlc3BvbnNlLAorCQkJCSAgICAgRXBsU3RhdHVzdUNiU3RhdHVzUmVzcG9uc2UsCisJCQkJICAgICBrRXBsRGxsQXNuZEZpbHRlckFueSk7CisKKwlyZXR1cm4gUmV0OworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbFN0YXR1c3VEZWxJbnN0YW5jZQorLy8KKy8vIERlc2NyaXB0aW9uOiBkZWxldGUgaW5zdGFuY2UKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6CisvLworLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICA9IGVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMgRXBsU3RhdHVzdURlbEluc3RhbmNlKCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKworCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJLy8gZGVyZWdpc3RlciBTdGF0dXNSZXNwb25zZSBjYWxsYmFjayBmdW5jdGlvbgorCVJldCA9CisJICAgIEVwbERsbHVDYWxSZWdBc25kU2VydmljZShrRXBsRGxsQXNuZFN0YXR1c1Jlc3BvbnNlLCBOVUxMLAorCQkJCSAgICAga0VwbERsbEFzbmRGaWx0ZXJOb25lKTsKKworCXJldHVybiBSZXQ7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsU3RhdHVzdVJlc2V0CisvLworLy8gRGVzY3JpcHRpb246IHJlc2V0cyB0aGlzIGluc3RhbmNlCisvLworLy8gUGFyYW1ldGVyczoKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgPSBlcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbFN0YXR1c3VSZXNldCgpCit7CisJdEVwbEtlcm5lbCBSZXQ7CisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCS8vIHJlc2V0IGluc3RhbmNlIHN0cnVjdHVyZQorCUVQTF9NRU1TRVQoJkVwbFN0YXR1c3VJbnN0YW5jZV9nLCAwLCBzaXplb2YoRXBsU3RhdHVzdUluc3RhbmNlX2cpKTsKKworCXJldHVybiBSZXQ7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsU3RhdHVzdVJlcXVlc3RTdGF0dXNSZXNwb25zZQorLy8KKy8vIERlc2NyaXB0aW9uOiByZXR1cm5zIHRoZSBTdGF0dXNSZXNwb25zZSBmb3IgdGhlIHNwZWNpZmllZCBub2RlLgorLy8KKy8vIFBhcmFtZXRlcnM6ICB1aU5vZGVJZF9wICAgICAgICAgICAgICAgICAgPSBJTjogbm9kZSBJRAorLy8gICAgICAgICAgICAgIHBmbkNiUmVzcG9uc2VfcCAgICAgICAgICAgICA9IElOOiBmdW5jdGlvbiBwb2ludGVyIHRvIGNhbGxiYWNrIGZ1bmN0aW9uCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2ggd2lsbCBiZSBjYWxsZWQgaWYgU3RhdHVzUmVzcG9uc2UgaXMgcmVjZWl2ZWQKKy8vCisvLyBSZXR1cm46ICAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vIFN0YXRlOiAgICAgICBub3QgdGVzdGVkCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsU3RhdHVzdVJlcXVlc3RTdGF0dXNSZXNwb25zZSh1bnNpZ25lZCBpbnQgdWlOb2RlSWRfcCwKKwkJCQkJCSAgdEVwbFN0YXR1c3VDYlJlc3BvbnNlCisJCQkJCQkgIHBmbkNiUmVzcG9uc2VfcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKworCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJLy8gZGVjcmVtZW50IG5vZGUgSUQsIGJlY2F1c2UgYXJyYXkgaXMgemVybyBiYXNlZAorCXVpTm9kZUlkX3AtLTsKKwlpZiAodWlOb2RlSWRfcCA8IHRhYmVudHJpZXMoRXBsU3RhdHVzdUluc3RhbmNlX2cubV9hcGZuQ2JSZXNwb25zZSkpIHsKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UX01OKSkgIT0gMCkKKwkJaWYgKEVwbFN0YXR1c3VJbnN0YW5jZV9nLm1fYXBmbkNiUmVzcG9uc2VbdWlOb2RlSWRfcF0gIT0gTlVMTCkgewkvLyByZXF1ZXN0IGFscmVhZHkgaXNzdWVkIChtYXliZSBieSBzb21lb25lIGVsc2UpCisJCQlSZXQgPSBrRXBsSW52YWxpZE9wZXJhdGlvbjsKKwkJfSBlbHNlIHsKKwkJCUVwbFN0YXR1c3VJbnN0YW5jZV9nLm1fYXBmbkNiUmVzcG9uc2VbdWlOb2RlSWRfcF0gPQorCQkJICAgIHBmbkNiUmVzcG9uc2VfcDsKKwkJCVJldCA9CisJCQkgICAgRXBsRGxsdUNhbElzc3VlUmVxdWVzdChrRXBsRGxsUmVxU2VydmljZVN0YXR1cywKKwkJCQkJCSAgICh1aU5vZGVJZF9wICsgMSksIDB4RkYpOworCQl9CisjZWxzZQorCQlSZXQgPSBrRXBsSW52YWxpZE9wZXJhdGlvbjsKKyNlbmRpZgorCX0gZWxzZSB7CQkvLyBpbnZhbGlkIG5vZGUgSUQgc3BlY2lmaWVkCisJCVJldCA9IGtFcGxJbnZhbGlkTm9kZUlkOworCX0KKworCXJldHVybiBSZXQ7CisKK30KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICBQIFIgSSBWIEEgVCBFICAgRiBVIE4gQyBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbFN0YXR1c3VDYlN0YXR1c1Jlc3BvbnNlCisvLworLy8gRGVzY3JpcHRpb246IGNhbGxiYWNrIGZ1bmt0aW9uIGZvciBTdGF0dXNSZXNwb25zZQorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczogIHBGcmFtZUluZm9fcCAgICAgICAgICAgID0gRnJhbWUgd2l0aCB0aGUgU3RhdHVzUmVzcG9uc2UKKy8vCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3RhdGljIHRFcGxLZXJuZWwgUFVCTElDIEVwbFN0YXR1c3VDYlN0YXR1c1Jlc3BvbnNlKHRFcGxGcmFtZUluZm8gKgorCQkJCQkJICAgIHBGcmFtZUluZm9fcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCXVuc2lnbmVkIGludCB1aU5vZGVJZDsKKwl1bnNpZ25lZCBpbnQgdWlJbmRleDsKKwl0RXBsU3RhdHVzdUNiUmVzcG9uc2UgcGZuQ2JSZXNwb25zZTsKKworCXVpTm9kZUlkID0gQW1pR2V0Qnl0ZUZyb21MZSgmcEZyYW1lSW5mb19wLT5tX3BGcmFtZS0+bV9sZV9iU3JjTm9kZUlkKTsKKworCXVpSW5kZXggPSB1aU5vZGVJZCAtIDE7CisKKwlpZiAodWlJbmRleCA8IHRhYmVudHJpZXMoRXBsU3RhdHVzdUluc3RhbmNlX2cubV9hcGZuQ2JSZXNwb25zZSkpIHsKKwkJLy8gbWVtb3JpemUgcG9pbnRlciB0byBjYWxsYmFjayBmdW5jdGlvbgorCQlwZm5DYlJlc3BvbnNlID0gRXBsU3RhdHVzdUluc3RhbmNlX2cubV9hcGZuQ2JSZXNwb25zZVt1aUluZGV4XTsKKwkJaWYgKHBmbkNiUmVzcG9uc2UgPT0gTlVMTCkgewkvLyByZXNwb25zZSB3YXMgbm90IHJlcXVlc3RlZAorCQkJZ290byBFeGl0OworCQl9CisJCS8vIHJlc2V0IGNhbGxiYWNrIGZ1bmN0aW9uIHBvaW50ZXIgc28gdGhhdCBjYWxsZXIgbWF5IGlzc3VlIG5leHQgcmVxdWVzdAorCQlFcGxTdGF0dXN1SW5zdGFuY2VfZy5tX2FwZm5DYlJlc3BvbnNlW3VpSW5kZXhdID0gTlVMTDsKKworCQlpZiAocEZyYW1lSW5mb19wLT5tX3VpRnJhbWVTaXplIDwgRVBMX0NfRExMX01JTlNJWkVfU1RBVFVTUkVTKSB7CS8vIFN0YXR1c1Jlc3BvbnNlIG5vdCByZWNlaXZlZCBvciBpdCBoYXMgaW52YWxpZCBzaXplCisJCQlSZXQgPSBwZm5DYlJlc3BvbnNlKHVpTm9kZUlkLCBOVUxMKTsKKwkJfSBlbHNlIHsJLy8gU3RhdHVzUmVzcG9uc2UgcmVjZWl2ZWQKKwkJCVJldCA9CisJCQkgICAgcGZuQ2JSZXNwb25zZSh1aU5vZGVJZCwKKwkJCQkJICAmcEZyYW1lSW5mb19wLT5tX3BGcmFtZS0+bV9EYXRhLgorCQkJCQkgIG1fQXNuZC5tX1BheWxvYWQubV9TdGF0dXNSZXNwb25zZSk7CisJCX0KKwl9CisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIFJldDsKK30KKworLy8gRU9GCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbFRhcmdldC5oIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxUYXJnZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMmI2NmY4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxUYXJnZXQuaApAQCAtMCwwICsxLDIzMyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIGluY2x1ZGUgZmlsZSBmb3IgdGFyZ2V0IGFwaSBmdW5jdGlvbgorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgJFJDU2ZpbGU6IEVwbFRhcmdldC5oLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS41ICQgICREYXRlOiAyMDA4LzA0LzE3IDIxOjM2OjMyICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorICAgICAgICAgICAgICAgICAgICBHQ0MgVjMuNAorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgIDIwMDUvMTIvMDUgLWFzOiAgIHN0YXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiwgdmVyc2lvbiAxLjAwCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX0VQTFRBUkdFVF9IXworI2RlZmluZSBfRVBMVEFSR0VUX0hfCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gbWFjcm9zIGZvciBtZW1vcnkgYWNjZXNzIChkZXBlbmRzIG9uIHRhcmdldCBzeXN0ZW0pCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKy8vIE5PVEU6CisvLyBUaGUgZm9sbG93aW5nIG1hY3JvcyBhcmUgdXNlZCB0byBjb21iaW5lIHN0YW5kYXJkIGxpYnJhcnkgZGVmaW5pdGlvbnMuIFNvbWUKKy8vIGFwcGxpY2F0aW9ucyBuZWVkcyB0byB1c2Ugb25lIGNvbW1vbiBsaWJyYXJ5IGZ1bmN0aW9uIChlLmcuIG1lbWNweSgpKS4gU28KKy8vIHlvdSBjYW4gc2V0IChvciBjaGFuZ2UpIGl0IGhlcmUuCisKKyNpZiAoVEFSR0VUX1NZU1RFTSA9PSBfV0lOMzJfKQorCisjZGVmaW5lIF9XSU4zMl9XSU5ET1dTIDB4MDQwMQorI2RlZmluZSBfV0lOMzJfV0lOTlQgICAweDA0MDAKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyAgICAvLzI5LjExLjIwMDQgZi5qLiBzb25zdCBpc3QgbWVtY3B5IHVuZCBtZW1zZXQgdW5iZWthbm50CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNkZWZpbmUgRVBMX01FTUNQWShkc3Qsc3JjLHNpeikgICAgIG1lbWNweSgodm9pZCopKGRzdCksKGNvbnN0IHZvaWQqKShzcmMpLChzaXplX3QpKHNpeikpOworI2RlZmluZSBFUExfTUVNU0VUKGRzdCx2YWwsc2l6KSAgICAgbWVtc2V0KCh2b2lkKikoZHN0KSwoaW50KSh2YWwpLChzaXplX3QpKHNpeikpOworCisgICAgLy8gZi5qLjogZGllIEZ1bmt0aW9uZW4gZvxyIDxNZW1BbGxvYz4gdW5kIDxNZW1GcmVlPiBzaW5kIGluIFdpbk1lbS5jIGRlZmluaWVydAorICAgIC8vZGVmaW5pdGlvbiBkZXIgUHJvdG90eXBlbgordm9pZCBGQVIgKk1lbUFsbG9jKERXT1JEIGR3TWVtU2l6ZV9wKTsKK3ZvaWQgTWVtRnJlZSh2b2lkIEZBUiAqIHBNZW1fcCk7CisKKyNkZWZpbmUgRVBMX01BTExPQyhzaXopICAgICAgICAgICAgIG1hbGxvYygoc2l6ZV90KShzaXopKQorI2RlZmluZSBFUExfRlJFRShwdHIpICAgICAgICAgICAgICAgZnJlZSgodm9pZCAqKXB0cikKKworI2lmbmRlZiBQUklOVEYwCit2b2lkIHRyYWNlKGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKKyNkZWZpbmUgUFJJTlRGICAgICAgICAgICAgICAgICAgICAgIFRSQUNFCisjZGVmaW5lIFBSSU5URjAoYXJnKSAgICAgICAgICAgICAgICBUUkFDRTAoYXJnKQorI2RlZmluZSBQUklOVEYxKGFyZyxwMSkgICAgICAgICAgICAgVFJBQ0UxKGFyZyxwMSkKKyNkZWZpbmUgUFJJTlRGMihhcmcscDEscDIpICAgICAgICAgIFRSQUNFMihhcmcscDEscDIpCisjZGVmaW5lIFBSSU5URjMoYXJnLHAxLHAyLHAzKSAgICAgICBUUkFDRTMoYXJnLHAxLHAyLHAzKQorI2RlZmluZSBQUklOVEY0KGFyZyxwMSxwMixwMyxwNCkgICAgVFJBQ0U0KGFyZyxwMSxwMixwMyxwNCkKKwkvLyNkZWZpbmUgUFJJTlRGICAgICAgICAgICAgICAgICAgICAgIHByaW50ZgorCS8vI2RlZmluZSBQUklOVEYwKGFyZykgICAgICAgICAgICAgICAgUFJJTlRGKGFyZykKKwkvLyNkZWZpbmUgUFJJTlRGMShhcmcscDEpICAgICAgICAgICAgIFBSSU5URihhcmcscDEpCisJLy8jZGVmaW5lIFBSSU5URjIoYXJnLHAxLHAyKSAgICAgICAgICBQUklOVEYoYXJnLHAxLHAyKQorCS8vI2RlZmluZSBQUklOVEYzKGFyZyxwMSxwMixwMykgICAgICAgUFJJTlRGKGFyZyxwMSxwMixwMykKKwkvLyNkZWZpbmUgUFJJTlRGNChhcmcscDEscDIscDMscDQpICAgIFBSSU5URihhcmcscDEscDIscDMscDQpCisjZW5kaWYKKworI2lmZGVmIEFTU0VSVE1TRworI3VuZGVmIEFTU0VSVE1TRworI2VuZGlmCisKKyNkZWZpbmUgQVNTRVJUTVNHKGV4cHIsc3RyaW5nKSAgaWYgKCEoZXhwcikpIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VCb3ggKE5VTEwsIHN0cmluZywgIkFzc2VydGlvbiBmYWlsZWQiLCBNQl9PSyB8IE1CX0lDT05FUlJPUik7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGl0ICgtMSk7fQorCisjZWxpZiAoVEFSR0VUX1NZU1RFTSA9PSBfTk9fT1NfKQorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworICAgIC8vMjkuMTEuMjAwNCBmLmouIHNvbnN0IGlzdCBtZW1jcHkgdW5kIG1lbXNldCB1bmJla2FubnQKKy8vICAgICNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2RlZmluZSBFUExfTUVNQ1BZKGRzdCxzcmMsc2l6KSAgICAgbWVtY3B5KCh2b2lkKikoZHN0KSwoY29uc3Qgdm9pZCopKHNyYyksKHNpemVfdCkoc2l6KSk7CisjZGVmaW5lIEVQTF9NRU1TRVQoZHN0LHZhbCxzaXopICAgICBtZW1zZXQoKHZvaWQqKShkc3QpLChpbnQpKHZhbCksKHNpemVfdCkoc2l6KSk7CisKKyNkZWZpbmUgRVBMX01BTExPQyhzaXopICAgICAgICAgICAgIG1hbGxvYygoc2l6ZV90KShzaXopKQorI2RlZmluZSBFUExfRlJFRShwdHIpICAgICAgICAgICAgICAgZnJlZSgodm9pZCAqKXB0cikKKworI2lmbmRlZiBQUklOVEYwCisjZGVmaW5lIFBSSU5URiAgICAgICAgICAgICAgICAgICAgICBUUkFDRQorI2RlZmluZSBQUklOVEYwKGFyZykgICAgICAgICAgICAgICAgVFJBQ0UwKGFyZykKKyNkZWZpbmUgUFJJTlRGMShhcmcscDEpICAgICAgICAgICAgIFRSQUNFMShhcmcscDEpCisjZGVmaW5lIFBSSU5URjIoYXJnLHAxLHAyKSAgICAgICAgICBUUkFDRTIoYXJnLHAxLHAyKQorI2RlZmluZSBQUklOVEYzKGFyZyxwMSxwMixwMykgICAgICAgVFJBQ0UzKGFyZyxwMSxwMixwMykKKyNkZWZpbmUgUFJJTlRGNChhcmcscDEscDIscDMscDQpICAgIFRSQUNFNChhcmcscDEscDIscDMscDQpCisJLy8jZGVmaW5lIFBSSU5URiAgICAgICAgICAgICAgICAgICAgICBwcmludGYKKwkvLyNkZWZpbmUgUFJJTlRGMChhcmcpICAgICAgICAgICAgICAgIFBSSU5URihhcmcpCisJLy8jZGVmaW5lIFBSSU5URjEoYXJnLHAxKSAgICAgICAgICAgICBQUklOVEYoYXJnLHAxKQorCS8vI2RlZmluZSBQUklOVEYyKGFyZyxwMSxwMikgICAgICAgICAgUFJJTlRGKGFyZyxwMSxwMikKKwkvLyNkZWZpbmUgUFJJTlRGMyhhcmcscDEscDIscDMpICAgICAgIFBSSU5URihhcmcscDEscDIscDMpCisJLy8jZGVmaW5lIFBSSU5URjQoYXJnLHAxLHAyLHAzLHA0KSAgICBQUklOVEYoYXJnLHAxLHAyLHAzLHA0KQorI2VuZGlmCisKKyNlbGlmIChUQVJHRVRfU1lTVEVNID09IF9MSU5VWF8pCisKKyNpZm5kZWYgX19LRVJORUxfXworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjZWxzZQorLy8gICAgICAgICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNlbmRpZgorCisgICAgLy8yOS4xMS4yMDA0IGYuai4gc29uc3QgaXN0IG1lbWNweSB1bmQgbWVtc2V0IHVuYmVrYW5udAorLy8gICAgI2luY2x1ZGUgPHN0cmluZy5oPgorCisjZGVmaW5lIEVQTF9NRU1DUFkoZHN0LHNyYyxzaXopICAgICBtZW1jcHkoKHZvaWQqKShkc3QpLChjb25zdCB2b2lkKikoc3JjKSwoc2l6ZV90KShzaXopKTsKKyNkZWZpbmUgRVBMX01FTVNFVChkc3QsdmFsLHNpeikgICAgIG1lbXNldCgodm9pZCopKGRzdCksKGludCkodmFsKSwoc2l6ZV90KShzaXopKTsKKworI2lmbmRlZiBfX0tFUk5FTF9fCisjZGVmaW5lIEVQTF9NQUxMT0Moc2l6KSAgICAgICAgICAgICBtYWxsb2MoKHNpemVfdCkoc2l6KSkKKyNkZWZpbmUgRVBMX0ZSRUUocHRyKSAgICAgICAgICAgICAgIGZyZWUoKHZvaWQgKilwdHIpCisjZWxzZQorI2RlZmluZSBFUExfTUFMTE9DKHNpeikgICAgICAgICAgICAga21hbGxvYygoc2l6ZV90KShzaXopLCBHRlBfS0VSTkVMKQorI2RlZmluZSBFUExfRlJFRShwdHIpICAgICAgICAgICAgICAga2ZyZWUoKHZvaWQgKilwdHIpCisjZW5kaWYKKworI2lmbmRlZiBQUklOVEYwCisjZGVmaW5lIFBSSU5URiAgICAgICAgICAgICAgICAgICAgICBUUkFDRQorI2RlZmluZSBQUklOVEYwKGFyZykgICAgICAgICAgICAgICAgVFJBQ0UwKGFyZykKKyNkZWZpbmUgUFJJTlRGMShhcmcscDEpICAgICAgICAgICAgIFRSQUNFMShhcmcscDEpCisjZGVmaW5lIFBSSU5URjIoYXJnLHAxLHAyKSAgICAgICAgICBUUkFDRTIoYXJnLHAxLHAyKQorI2RlZmluZSBQUklOVEYzKGFyZyxwMSxwMixwMykgICAgICAgVFJBQ0UzKGFyZyxwMSxwMixwMykKKyNkZWZpbmUgUFJJTlRGNChhcmcscDEscDIscDMscDQpICAgIFRSQUNFNChhcmcscDEscDIscDMscDQpCisJLy8jZGVmaW5lIFBSSU5URiAgICAgICAgICAgICAgICAgICAgICBwcmludGYKKwkvLyNkZWZpbmUgUFJJTlRGMChhcmcpICAgICAgICAgICAgICAgIFBSSU5URihhcmcpCisJLy8jZGVmaW5lIFBSSU5URjEoYXJnLHAxKSAgICAgICAgICAgICBQUklOVEYoYXJnLHAxKQorCS8vI2RlZmluZSBQUklOVEYyKGFyZyxwMSxwMikgICAgICAgICAgUFJJTlRGKGFyZyxwMSxwMikKKwkvLyNkZWZpbmUgUFJJTlRGMyhhcmcscDEscDIscDMpICAgICAgIFBSSU5URihhcmcscDEscDIscDMpCisJLy8jZGVmaW5lIFBSSU5URjQoYXJnLHAxLHAyLHAzLHA0KSAgICBQUklOVEYoYXJnLHAxLHAyLHAzLHA0KQorI2VuZGlmCisKKyNlbmRpZgorCisjZGVmaW5lIEVQTF9UR1RfSU5UTUFTS19FVEggICAgIDB4MDAwMQkvLyBldGhlcm5ldCBpbnRlcnJ1cHQKKyNkZWZpbmUgRVBMX1RHVF9JTlRNQVNLX0RNQSAgICAgMHgwMDAyCS8vIERNQSBpbnRlcnJ1cHQKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHR5cGVkZWYKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBjdXJyZW50bHkgbm8gVGltZXIgZnVuY3Rpb25zIGFyZSBuZWVkZWQgYnkgRVBMIHN0YWNrCisvLyBzbyB0aGV5IGFyZSBub3QgaW1wbGVtZW50ZWQgeWV0CisvL3ZvaWQgIFBVQkxJQyBUZ3RUaW1lckluaXQodm9pZCk7CisvL0RXT1JEIFBVQkxJQyBUZ3RHZXRUaWNrQ291bnQodm9pZCk7CisvL3ZvaWQgUFVCTElDIFRndEdldE5ldFRpbWUodEVwbE5ldFRpbWUgKiBwTmV0VGltZV9wKTsKKworLy8gZnVuY3Rpb25zIGZvciBldGhlcm5ldCBkcml2ZXIKK3RFcGxLZXJuZWwgUFVCTElDIFRndEluaXRFdGhJc3Iodm9pZCk7Cit2b2lkIFBVQkxJQyBUZ3RGcmVlRXRoSXNyKHZvaWQpOwordm9pZCBQVUJMSUMgVGd0RW5hYmxlR2xvYmFsSW50ZXJydXB0KEJZVEUgZkVuYWJsZV9wKTsKK3ZvaWQgUFVCTElDIFRndEVuYWJsZUV0aEludGVycnVwdDAoQllURSBmRW5hYmxlX3AsCisJCQkJICAgdW5zaWduZWQgaW50IHVpSW50ZXJydXB0TWFza19wKTsKK3ZvaWQgUFVCTElDIFRndEVuYWJsZUV0aEludGVycnVwdDEoQllURSBmRW5hYmxlX3AsCisJCQkJICAgdW5zaWduZWQgaW50IHVpSW50ZXJydXB0TWFza19wKTsKKworI2VuZGlmIC8vICNpZm5kZWYgX0VQTFRBUkdFVF9IXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxUaW1lci5oIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxUaW1lci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhY2JmZDgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbFRpbWVyLmgKQEAgLTAsMCArMSwxMTcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBpbmNsdWRlIGZpbGUgZm9yIEVwbCBUaW1lci1Nb2R1bGUKKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgICAgICAgICRSQ1NmaWxlOiBFcGxUaW1lci5oLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS40ICQgICREYXRlOiAyMDA4LzA0LzE3IDIxOjM2OjMyICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorICAgICAgICAgICAgICAgICAgICBHQ0MgVjMuNAorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgIDIwMDYvMDcvMDYgay50LjogICBzdGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkVwbEluYy5oIgorI2luY2x1ZGUgIkVwbEV2ZW50LmgiCisKKyNpZm5kZWYgX0VQTFRJTUVSX0hfCisjZGVmaW5lIF9FUExUSU1FUl9IXworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHR5cGVkZWYKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIHR5cGUgZm9yIHRpbWVyIGhhbmRsZQordHlwZWRlZiB1bnNpZ25lZCBsb25nIHRFcGxUaW1lckhkbDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXRFcGxFdmVudFNpbmsgbV9FdmVudFNpbms7CisJdW5zaWduZWQgbG9uZyBtX3VsQXJnOwkvLyBkLmsuOiBjb252ZXJ0ZWQgdG8gdW5zaWduZWQgbG9uZyBiZWNhdXNlCisJLy8gaXQgaXMgbmV2ZXIgYWNjZXNzZWQgYXMgYSBwb2ludGVyIGJ5IHRoZQorCS8vIHRpbWVyIG1vZHVsZSBhbmQgdGhlIGRhdGEgdGhlCisJLy8gcG9pbnRlciBwb2ludHMgdG8gaXMgbm90IHNhdmVkIGluIGFueSB3YXkuCisJLy8gSXQgaXMganVzdCBhIHZhbHVlLiBUaGUgdXNlciBpcyByZXNwb25zaWJsZQorCS8vIHRvIHN0b3JlIHRoZSBkYXRhIHN0YXRpY2FsbHkgYW5kIGNvbnZlcnQKKwkvLyB0aGUgcG9pbnRlciBiZXR3ZWVuIGFkZHJlc3Mgc3BhY2VzLgorCit9IHRFcGxUaW1lckFyZzsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXRFcGxUaW1lckhkbCBtX1RpbWVySGRsOworCXVuc2lnbmVkIGxvbmcgbV91bEFyZzsJLy8gZC5rLjogY29udmVydGVkIHRvIHVuc2lnbmVkIGxvbmcgYmVjYXVzZQorCS8vIGl0IGlzIG5ldmVyIGFjY2Vzc2VkIGFzIGEgcG9pbnRlciBieSB0aGUKKwkvLyB0aW1lciBtb2R1bGUgYW5kIHRoZSBkYXRhIHRoZQorCS8vIHBvaW50ZXIgcG9pbnRzIHRvIGlzIG5vdCBzYXZlZCBpbiBhbnkgd2F5LgorCS8vIEl0IGlzIGp1c3QgYSB2YWx1ZS4KKworfSB0RXBsVGltZXJFdmVudEFyZzsKKwordHlwZWRlZiB0RXBsS2VybmVsKFBVQkxJQyAqIHRFcGxUaW1lcmtDYWxsYmFjaykgKHRFcGxUaW1lckV2ZW50QXJnICoKKwkJCQkJCSBwRXZlbnRBcmdfcCk7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZW5kaWYgLy8gI2lmbmRlZiBfRVBMVElNRVJfSF8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsVGltZXJ1TGludXhLZXJuZWwuYyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsVGltZXJ1TGludXhLZXJuZWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODgyMGQxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxUaW1lcnVMaW51eEtlcm5lbC5jCkBAIC0wLDAgKzEsNDQ2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgb3BlblBPV0VSTElOSworCisgIERlc2NyaXB0aW9uOiAgc291cmNlIGZpbGUgZm9yIEVQTCBVc2VyIFRpbWVybW9kdWxlIGZvciBMaW51eCBrZXJuZWwgbW9kdWxlCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRXBsVGltZXJ1TGludXhLZXJuZWwuYyx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuNiAkICAkRGF0ZTogMjAwOC8wNC8xNyAyMTozNjozMiAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICBLRUlMIHVWaXNpb24gMgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgIDIwMDYvMDkvMTIgZC5rLjogICBzdGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgInVzZXIvRXBsVGltZXJ1LmgiCisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgRyBMIE8gQiBBIEwgICBEIEUgRiBJIE4gSSBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvbnN0IGRlZmluZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCB0eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3R5cGVkZWYgc3RydWN0IHsKKwlzdHJ1Y3QgdGltZXJfbGlzdCBtX1RpbWVyOworCXRFcGxUaW1lckFyZyBUaW1lckFyZ3VtZW50OworCit9IHRFcGxUaW1lcnVEYXRhOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbW9kdWwgZ2xvYmFsZSB2YXJzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N0YXRpYyB2b2lkIFBVQkxJQyBFcGxUaW1lcnVDYk1zKHVuc2lnbmVkIGxvbmcgdWxQYXJhbWV0ZXJfcCk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIEMgTCBBIFMgUyAgPEVwbCBVc2Vyc3BhY2UtVGltZXJtb2R1bGUgZm9yIExpbnV4IEtlcm5lbD4gICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvLworLy8gRGVzY3JpcHRpb246IEVwbCBVc2Vyc3BhY2UtVGltZXJtb2R1bGUgZm9yIExpbnV4IEtlcm5lbAorLy8KKy8vCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgIFAgVSBCIEwgSSBDICAgRiBVIE4gQyBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsVGltZXJ1SW5pdAorLy8KKy8vIERlc2NyaXB0aW9uOiBmdW5jdGlvbiBpbml0cyBmaXJzdCBpbnN0YW5jZQorLy8KKy8vIFBhcmFtZXRlcnM6ICB2b2lkCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgID0gZXJyb3Jjb2RlCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsVGltZXJ1SW5pdCgpCit7CisJdEVwbEtlcm5lbCBSZXQ7CisKKwlSZXQgPSBFcGxUaW1lcnVBZGRJbnN0YW5jZSgpOworCisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsVGltZXJ1QWRkSW5zdGFuY2UKKy8vCisvLyBEZXNjcmlwdGlvbjogZnVuY3Rpb24gaW5pdHMgYWRkaXRpb25hbCBpbnN0YW5jZQorLy8KKy8vIFBhcmFtZXRlcnM6ICB2b2lkCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgID0gZXJyb3Jjb2RlCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsVGltZXJ1QWRkSW5zdGFuY2UoKQoreworCXRFcGxLZXJuZWwgUmV0OworCisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxUaW1lcnVEZWxJbnN0YW5jZQorLy8KKy8vIERlc2NyaXB0aW9uOiBmdW5jdGlvbiBkZWxldGVzIGluc3RhbmNlCisvLyAgICAgICAgICAgICAgLT4gdW5kZXIgTGludXggbm90aGluZyB0byBkbworLy8gICAgICAgICAgICAgIC0+IG5vIGluc3RhbmNlIHRhYmxlIG5lZWRlZAorLy8KKy8vIFBhcmFtZXRlcnM6ICB2b2lkCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgID0gZXJyb3Jjb2RlCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsVGltZXJ1RGVsSW5zdGFuY2UoKQoreworCXRFcGxLZXJuZWwgUmV0OworCisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxUaW1lcnVTZXRUaW1lck1zCisvLworLy8gRGVzY3JpcHRpb246IGZ1bmN0aW9uIGNyZWF0ZXMgYSB0aW1lciBhbmQgcmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyBoYW5kbGUKKy8vCisvLyBQYXJhbWV0ZXJzOiAgcFRpbWVySGRsX3AgPSBwb2ludGVyIHRvIGEgYnVmZmVyIHRvIGZpbGwgaW4gdGhlIGhhbmRsZQorLy8gICAgICAgICAgICAgIHVsVGltZV9wICAgID0gdGltZSBmb3IgdGltZXIgaW4gbXMKKy8vICAgICAgICAgICAgICBBcmd1bWVudF9wICA9IGFyZ3VtZW50IGZvciB0aW1lcgorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICA9IGVycm9yY29kZQorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbFRpbWVydVNldFRpbWVyTXModEVwbFRpbWVySGRsICogcFRpbWVySGRsX3AsCisJCQkJICAgICAgdW5zaWduZWQgbG9uZyB1bFRpbWVfcCwKKwkJCQkgICAgICB0RXBsVGltZXJBcmcgQXJndW1lbnRfcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCXRFcGxUaW1lcnVEYXRhICpwRGF0YTsKKworCS8vIGNoZWNrIHBvaW50ZXIgdG8gaGFuZGxlCisJaWYgKHBUaW1lckhkbF9wID09IE5VTEwpIHsKKwkJUmV0ID0ga0VwbFRpbWVySW52YWxpZEhhbmRsZTsKKwkJZ290byBFeGl0OworCX0KKworCXBEYXRhID0gKHRFcGxUaW1lcnVEYXRhICopIEVQTF9NQUxMT0Moc2l6ZW9mKHRFcGxUaW1lcnVEYXRhKSk7CisJaWYgKHBEYXRhID09IE5VTEwpIHsKKwkJUmV0ID0ga0VwbE5vUmVzb3VyY2U7CisJCWdvdG8gRXhpdDsKKwl9CisKKwlpbml0X3RpbWVyKCZwRGF0YS0+bV9UaW1lcik7CisJcERhdGEtPm1fVGltZXIuZnVuY3Rpb24gPSBFcGxUaW1lcnVDYk1zOworCXBEYXRhLT5tX1RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZylwRGF0YTsKKwlwRGF0YS0+bV9UaW1lci5leHBpcmVzID0gamlmZmllcyArIHVsVGltZV9wICogSFogLyAxMDAwOworCisJRVBMX01FTUNQWSgmcERhdGEtPlRpbWVyQXJndW1lbnQsICZBcmd1bWVudF9wLCBzaXplb2YodEVwbFRpbWVyQXJnKSk7CisKKwlhZGRfdGltZXIoJnBEYXRhLT5tX1RpbWVyKTsKKworCSpwVGltZXJIZGxfcCA9ICh0RXBsVGltZXJIZGwpIHBEYXRhOworCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbFRpbWVydU1vZGlmeVRpbWVyTXMKKy8vCisvLyBEZXNjcmlwdGlvbjogZnVuY3Rpb24gY2hhbmdlcyBhIHRpbWVyIGFuZCByZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIGhhbmRsZQorLy8KKy8vIFBhcmFtZXRlcnM6ICBwVGltZXJIZGxfcCA9IHBvaW50ZXIgdG8gYSBidWZmZXIgdG8gZmlsbCBpbiB0aGUgaGFuZGxlCisvLyAgICAgICAgICAgICAgdWxUaW1lX3AgICAgPSB0aW1lIGZvciB0aW1lciBpbiBtcworLy8gICAgICAgICAgICAgIEFyZ3VtZW50X3AgID0gYXJndW1lbnQgZm9yIHRpbWVyCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgID0gZXJyb3Jjb2RlCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsVGltZXJ1TW9kaWZ5VGltZXJNcyh0RXBsVGltZXJIZGwgKiBwVGltZXJIZGxfcCwKKwkJCQkJIHVuc2lnbmVkIGxvbmcgdWxUaW1lX3AsCisJCQkJCSB0RXBsVGltZXJBcmcgQXJndW1lbnRfcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCXRFcGxUaW1lcnVEYXRhICpwRGF0YTsKKworCS8vIGNoZWNrIHBvaW50ZXIgdG8gaGFuZGxlCisJaWYgKHBUaW1lckhkbF9wID09IE5VTEwpIHsKKwkJUmV0ID0ga0VwbFRpbWVySW52YWxpZEhhbmRsZTsKKwkJZ290byBFeGl0OworCX0KKwkvLyBjaGVjayBoYW5kbGUgaXRzZWxmLCBpLmUuIHdhcyB0aGUgaGFuZGxlIGluaXRpYWxpemVkIGJlZm9yZQorCWlmICgqcFRpbWVySGRsX3AgPT0gMCkgeworCQlSZXQgPSBFcGxUaW1lcnVTZXRUaW1lck1zKHBUaW1lckhkbF9wLCB1bFRpbWVfcCwgQXJndW1lbnRfcCk7CisJCWdvdG8gRXhpdDsKKwl9CisJcERhdGEgPSAodEVwbFRpbWVydURhdGEgKikgKiBwVGltZXJIZGxfcDsKKwlpZiAoKHRFcGxUaW1lcnVEYXRhICopIHBEYXRhLT5tX1RpbWVyLmRhdGEgIT0gcERhdGEpIHsKKwkJUmV0ID0ga0VwbFRpbWVySW52YWxpZEhhbmRsZTsKKwkJZ290byBFeGl0OworCX0KKworCW1vZF90aW1lcigmcERhdGEtPm1fVGltZXIsIChqaWZmaWVzICsgdWxUaW1lX3AgKiBIWiAvIDEwMDApKTsKKworCS8vIGNvcHkgdGhlIFRpbWVyQXJnIGFmdGVyIHRoZSB0aW1lciBpcyByZXN0YXJ0ZWQsCisJLy8gc28gdGhhdCBhIHRpbWVyIG9jY3VyZWQgaW1tZWRpYXRlbHkgYmVmb3JlIG1vZF90aW1lcgorCS8vIHdvbid0IHVzZSB0aGUgbmV3IFRpbWVyQXJnIGFuZAorCS8vIHRoZXJlZm9yZSB0aGUgb2xkIHRpbWVyIGNhbm5vdCBiZSBkaXN0aW5ndWlzaGVkIGZyb20gdGhlIG5ldyBvbmUuCisJLy8gQnV0IGlmIHRoZSBuZXcgdGltZXIgaXMgdG9vIGZhc3QsIGl0IG1heSBnZXQgbG9zdC4KKwlFUExfTUVNQ1BZKCZwRGF0YS0+VGltZXJBcmd1bWVudCwgJkFyZ3VtZW50X3AsIHNpemVvZih0RXBsVGltZXJBcmcpKTsKKworCS8vIGNoZWNrIGlmIHRpbWVyIGlzIHJlYWxseSBydW5uaW5nCisJaWYgKHRpbWVyX3BlbmRpbmcoJnBEYXRhLT5tX1RpbWVyKSA9PSAwKSB7CS8vIHRpbWVyIGlzIG5vdCBydW5uaW5nCisJCS8vIHJldHJ5IHN0YXJ0aW5nIGl0CisJCWFkZF90aW1lcigmcERhdGEtPm1fVGltZXIpOworCX0KKwkvLyBzZXQgaGFuZGxlIHRvIHBvaW50ZXIgb2YgdEVwbFRpbWVydURhdGEKKy8vICAgICpwVGltZXJIZGxfcCA9ICh0RXBsVGltZXJIZGwpIHBEYXRhOworCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbFRpbWVydURlbGV0ZVRpbWVyCisvLworLy8gRGVzY3JpcHRpb246IGZ1bmN0aW9uIGRlbGV0ZXMgYSB0aW1lcgorLy8KKy8vIFBhcmFtZXRlcnM6ICBwVGltZXJIZGxfcCA9IHBvaW50ZXIgdG8gYSBidWZmZXIgdG8gZmlsbCBpbiB0aGUgaGFuZGxlCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgID0gZXJyb3Jjb2RlCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsVGltZXJ1RGVsZXRlVGltZXIodEVwbFRpbWVySGRsICogcFRpbWVySGRsX3ApCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwl0RXBsVGltZXJ1RGF0YSAqcERhdGE7CisKKwkvLyBjaGVjayBwb2ludGVyIHRvIGhhbmRsZQorCWlmIChwVGltZXJIZGxfcCA9PSBOVUxMKSB7CisJCVJldCA9IGtFcGxUaW1lckludmFsaWRIYW5kbGU7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gY2hlY2sgaGFuZGxlIGl0c2VsZiwgaS5lLiB3YXMgdGhlIGhhbmRsZSBpbml0aWFsaXplZCBiZWZvcmUKKwlpZiAoKnBUaW1lckhkbF9wID09IDApIHsKKwkJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJCWdvdG8gRXhpdDsKKwl9CisJcERhdGEgPSAodEVwbFRpbWVydURhdGEgKikgKiBwVGltZXJIZGxfcDsKKwlpZiAoKHRFcGxUaW1lcnVEYXRhICopIHBEYXRhLT5tX1RpbWVyLmRhdGEgIT0gcERhdGEpIHsKKwkJUmV0ID0ga0VwbFRpbWVySW52YWxpZEhhbmRsZTsKKwkJZ290byBFeGl0OworCX0KKworLyogICAgaWYgKGRlbF90aW1lcigmcERhdGEtPm1fVGltZXIpID09IDEpCisgICAgeworICAgICAgICBrZnJlZShwRGF0YSk7CisgICAgfQorKi8KKwkvLyB0cnkgdG8gZGVsZXRlIHRoZSB0aW1lcgorCWRlbF90aW1lcigmcERhdGEtPm1fVGltZXIpOworCS8vIGZyZWUgbWVtb3J5IGluIGFueSBjYXNlCisJa2ZyZWUocERhdGEpOworCisJLy8gdW5pbml0aWFsaXplIGhhbmRsZQorCSpwVGltZXJIZGxfcCA9IDA7CisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIFJldDsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxUaW1lcnVJc1RpbWVyQWN0aXZlCisvLworLy8gRGVzY3JpcHRpb246IGNoZWNrcyBpZiB0aGUgdGltZXIgcmVmZXJlbmNlZCBieSB0aGUgaGFuZGxlIGlzIGN1cnJlbnRseQorLy8gICAgICAgICAgICAgIGFjdGl2ZS4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgVGltZXJIZGxfcCAgPSBoYW5kbGUgb2YgdGhlIHRpbWVyIHRvIGNoZWNrCisvLworLy8gUmV0dXJuczogICAgIEJPT0wgICAgICAgID0gVFJVRSwgaWYgYWN0aXZlOworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0UsIG90aGVyd2lzZQorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0JPT0wgUFVCTElDIEVwbFRpbWVydUlzVGltZXJBY3RpdmUodEVwbFRpbWVySGRsIFRpbWVySGRsX3ApCit7CisJQk9PTCBmQWN0aXZlID0gRkFMU0U7CisJdEVwbFRpbWVydURhdGEgKnBEYXRhOworCisJLy8gY2hlY2sgaGFuZGxlIGl0c2VsZiwgaS5lLiB3YXMgdGhlIGhhbmRsZSBpbml0aWFsaXplZCBiZWZvcmUKKwlpZiAoVGltZXJIZGxfcCA9PSAwKSB7CS8vIHRpbWVyIHdhcyBub3QgY3JlYXRlZCB5ZXQsIHNvIGl0IGlzIG5vdCBhY3RpdmUKKwkJZ290byBFeGl0OworCX0KKwlwRGF0YSA9ICh0RXBsVGltZXJ1RGF0YSAqKSBUaW1lckhkbF9wOworCWlmICgodEVwbFRpbWVydURhdGEgKikgcERhdGEtPm1fVGltZXIuZGF0YSAhPSBwRGF0YSkgewkvLyBpbnZhbGlkIHRpbWVyCisJCWdvdG8gRXhpdDsKKwl9CisJLy8gY2hlY2sgaWYgdGltZXIgaXMgcnVubmluZworCWlmICh0aW1lcl9wZW5kaW5nKCZwRGF0YS0+bV9UaW1lcikgPT0gMCkgewkvLyB0aW1lciBpcyBub3QgcnVubmluZworCQlnb3RvIEV4aXQ7CisJfQorCisJZkFjdGl2ZSA9IFRSVUU7CisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIGZBY3RpdmU7Cit9CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgUCBSIEkgViBBIFQgRSAgIEYgVSBOIEMgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxUaW1lcnVDYk1zCisvLworLy8gRGVzY3JpcHRpb246IGZ1bmN0aW9uIHRvIHByb2Nlc3MgdGltZXIKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6ICBscFBhcmFtZXRlciA9IHBvaW50ZXIgdG8gc3RydWN0dXIgb2YgdHlwZSB0RXBsVGltZXJ1RGF0YQorLy8KKy8vCisvLyBSZXR1cm5zOiAgICAgKG5vbmUpCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdGF0aWMgdm9pZCBQVUJMSUMgRXBsVGltZXJ1Q2JNcyh1bnNpZ25lZCBsb25nIHVsUGFyYW1ldGVyX3ApCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwl0RXBsVGltZXJ1RGF0YSAqcERhdGE7CisJdEVwbEV2ZW50IEVwbEV2ZW50OworCXRFcGxUaW1lckV2ZW50QXJnIFRpbWVyRXZlbnRBcmc7CisKKwlwRGF0YSA9ICh0RXBsVGltZXJ1RGF0YSAqKSB1bFBhcmFtZXRlcl9wOworCisJLy8gY2FsbCBldmVudCBmdW5jdGlvbgorCVRpbWVyRXZlbnRBcmcubV9UaW1lckhkbCA9ICh0RXBsVGltZXJIZGwpIHBEYXRhOworCVRpbWVyRXZlbnRBcmcubV91bEFyZyA9IHBEYXRhLT5UaW1lckFyZ3VtZW50Lm1fdWxBcmc7CisKKwlFcGxFdmVudC5tX0V2ZW50U2luayA9IHBEYXRhLT5UaW1lckFyZ3VtZW50Lm1fRXZlbnRTaW5rOworCUVwbEV2ZW50Lm1fRXZlbnRUeXBlID0ga0VwbEV2ZW50VHlwZVRpbWVyOworCUVQTF9NRU1TRVQoJkVwbEV2ZW50Lm1fTmV0VGltZSwgMHgwMCwgc2l6ZW9mKHRFcGxOZXRUaW1lKSk7CisJRXBsRXZlbnQubV9wQXJnID0gJlRpbWVyRXZlbnRBcmc7CisJRXBsRXZlbnQubV91aVNpemUgPSBzaXplb2YoVGltZXJFdmVudEFyZyk7CisKKwlSZXQgPSBFcGxFdmVudHVQb3N0KCZFcGxFdmVudCk7CisKKwkvLyBkLmsuIGRvIG5vdCBmcmVlIG1lbW9yeSwgdXNlciBoYXMgdG8gY2FsbCBFcGxUaW1lcnVEZWxldGVUaW1lcigpCisJLy9rZnJlZShwRGF0YSk7CisKK30KKworLy8gRU9GCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbFRpbWVydU51bGwuYyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsVGltZXJ1TnVsbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwY2U0MDMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbFRpbWVydU51bGwuYwpAQCAtMCwwICsxLDMxMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIHNvdXJjZSBmaWxlIGZvciBFcGwgVXNlcnNwYWNlLVRpbWVybW9kdWxlIE5VTEwtSW1wbGVtZW50YXRpb24KKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgICAgICAgICRSQ1NmaWxlOiBFcGxUaW1lcnVOdWxsLmMsdiAkCisKKyAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAorCisgICAgICAgICAgICAgICAgJFJldmlzaW9uOiAxLjMgJCAgJERhdGU6IDIwMDgvMDQvMTcgMjE6MzY6MzIgJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgS0VJTCB1VmlzaW9uIDIKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUmV2aXNpb24gSGlzdG9yeToKKworICAyMDA2LzA3LzA2IGsudC46ICAgc3RhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJ1c2VyL0VwbFRpbWVydS5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICBHIEwgTyBCIEEgTCAgIEQgRSBGIEkgTiBJIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvY2FsIHR5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbW9kdWwgZ2xvYmFsZSB2YXJzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgQyBMIEEgUyBTICA8RXBsIFVzZXJzcGFjZS1UaW1lcm1vZHVsZSBOVUxMLUltcGxlbWVudGF0aW9uPiAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8vCisvLyBEZXNjcmlwdGlvbjogRXBsIFVzZXJzcGFjZS1UaW1lcm1vZHVsZSBOVUxMLUltcGxlbWVudGF0aW9uCisvLworLy8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgUCBVIEIgTCBJIEMgICBGIFUgTiBDIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxUaW1lcnVJbml0CisvLworLy8gRGVzY3JpcHRpb246IGZ1bmN0aW9uIGluaXQgZmlyc3QgaW5zdGFuY2UKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6CisvLworLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICA9IGVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordEVwbEtlcm5lbCBQVUJMSUMgRXBsVGltZXJ1SW5pdCgpCit7CisJdEVwbEtlcm5lbCBSZXQ7CisKKwlSZXQgPSBFcGxUaW1lcnVBZGRJbnN0YW5jZSgpOworCisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsVGltZXJ1QWRkSW5zdGFuY2UKKy8vCisvLyBEZXNjcmlwdGlvbjogZnVuY3Rpb24gaW5pdCBhZGRpdGlvbmFsIGluc3RhbmNlCisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOgorLy8KKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgPSBlcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3RFcGxLZXJuZWwgUFVCTElDIEVwbFRpbWVydUFkZEluc3RhbmNlKCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKworCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsVGltZXJ1RGVsSW5zdGFuY2UKKy8vCisvLyBEZXNjcmlwdGlvbjogZnVuY3Rpb24gZGVsdGUgaW5zdGFuY2UKKy8vICAgICAgICAgICAgICAtPiB1bmRlciBXaW4zMiBub3RoaW5nIHRvIGRvCisvLyAgICAgICAgICAgICAgLT4gbm8gaW5zdG5hY2UgdGFibGUgbmVlZGVkCisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOgorLy8KKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgPSBlcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3RFcGxLZXJuZWwgUFVCTElDIEVwbFRpbWVydURlbEluc3RhbmNlKCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKworCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsVGltZXJ1U2V0VGltZXJNcworLy8KKy8vIERlc2NyaXB0aW9uOiBmdW5jdGlvbiBjcmVhdGUgYSB0aW1lciBhbmQgcmV0dXJuIGEgaGFuZGxlIHRvIHRoZSBwb2ludGVyCisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOiAgcFRpbWVySGRsX3AgPSBwb2ludGVyIHRvIGEgYnVmZmVyIHRvIGZpbGwgaW4gdGhlIGhhbmRsZQorLy8gICAgICAgICAgICAgIHVsVGltZV9wICAgID0gdGltZSBmb3IgdGltZXIgaW4gbXMKKy8vICAgICAgICAgICAgICBBcmd1bWVudF9wICA9IGFyZ3VtZW50IGZvciB0aW1lcgorLy8KKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgPSBlcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3RFcGxLZXJuZWwgUFVCTElDIEVwbFRpbWVydVNldFRpbWVyTXModEVwbFRpbWVySGRsICogcFRpbWVySGRsX3AsCisJCQkJICAgICAgdW5zaWduZWQgbG9uZyB1bFRpbWVfcCwKKwkJCQkgICAgICB0RXBsVGltZXJBcmcgQXJndW1lbnRfcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKworCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJLy8gY2hlY2sgaGFuZGxlCisJaWYgKHBUaW1lckhkbF9wID09IE5VTEwpIHsKKwkJUmV0ID0ga0VwbFRpbWVySW52YWxpZEhhbmRsZTsKKwkJZ290byBFeGl0OworCX0KKworICAgICAgRXhpdDoKKwlyZXR1cm4gUmV0OworfQorCisgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsVGltZXJ1TW9kaWZ5VGltZXJNcworLy8KKy8vIERlc2NyaXB0aW9uOiBmdW5jdGlvbiBjaGFuZ2UgYSB0aW1lciBhbmQgcmV0dXJuIGEgaGFuZGxlIHRvIHRoZSBwb2ludGVyCisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOiAgcFRpbWVySGRsX3AgPSBwb2ludGVyIHRvIGEgYnVmZmVyIHRvIGZpbGwgaW4gdGhlIGhhbmRsZQorLy8gICAgICAgICAgICAgIHVsVGltZV9wICAgID0gdGltZSBmb3IgdGltZXIgaW4gbXMKKy8vICAgICAgICAgICAgICBBcmd1bWVudF9wICA9IGFyZ3VtZW50IGZvciB0aW1lcgorLy8KKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgPSBlcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3RFcGxLZXJuZWwgUFVCTElDIEVwbFRpbWVydU1vZGlmeVRpbWVyTXModEVwbFRpbWVySGRsICogcFRpbWVySGRsX3AsCisJCQkJCSB1bnNpZ25lZCBsb25nIHVsVGltZV9wLAorCQkJCQkgdEVwbFRpbWVyQXJnIEFyZ3VtZW50X3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCS8vIGNoZWNrIHBhcmFtZXRlcgorCWlmIChwVGltZXJIZGxfcCA9PSBOVUxMKSB7CisJCVJldCA9IGtFcGxUaW1lckludmFsaWRIYW5kbGU7CisJCWdvdG8gRXhpdDsKKwl9CisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIFJldDsKK30KKworIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbFRpbWVydURlbGV0ZVRpbWVyCisvLworLy8gRGVzY3JpcHRpb246IGZ1bmN0aW9uIGRlbHRlIGEgdGltZXIKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6ICBwVGltZXJIZGxfcCA9IHBvaW50ZXIgdG8gYSBidWZmZXIgdG8gZmlsbCBpbiB0aGUgaGFuZGxlCisvLworLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICA9IGVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordEVwbEtlcm5lbCBQVUJMSUMgRXBsVGltZXJ1RGVsZXRlVGltZXIodEVwbFRpbWVySGRsICogcFRpbWVySGRsX3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCS8vIGNoZWNrIHBhcmFtZXRlcgorCWlmIChwVGltZXJIZGxfcCA9PSBOVUxMKSB7CisJCVJldCA9IGtFcGxUaW1lckludmFsaWRIYW5kbGU7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gc2V0IGhhbmRsZSBpbnZhbGlkZQorCSpwVGltZXJIZGxfcCA9IDA7CisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIFJldDsKKworfQorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgIFAgUiBJIFYgQSBUIEUgICBGIFUgTiBDIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKworLy8gRU9GCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbFRpbWVydVdpbjMyLmMgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbFRpbWVydVdpbjMyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTk2N2I0ZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsVGltZXJ1V2luMzIuYwpAQCAtMCwwICsxLDUxMyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIHNvdXJjZSBmaWxlIGZvciBFcGwgVXNlcnNwYWNlLVRpbWVybW9kdWxlIGZvciBXaW4zMgorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgJFJDU2ZpbGU6IEVwbFRpbWVydVdpbjMyLmMsdiAkCisKKyAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAorCisgICAgICAgICAgICAgICAgJFJldmlzaW9uOiAxLjQgJCAgJERhdGU6IDIwMDgvMDQvMTcgMjE6MzY6MzIgJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgICAgIEdDQyBWMy40CisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwNi8wNy8wNiBrLnQuOiAgIHN0YXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAidXNlci9FcGxUaW1lcnUuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgRyBMIE8gQiBBIEwgICBEIEUgRiBJIE4gSSBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvbnN0IGRlZmluZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCB0eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3R5cGVkZWYgc3RydWN0IHsKKwl0RXBsVGltZXJBcmcgVGltZXJBcmd1bWVudDsKKwlIQU5ETEUgRGVsdGVIYW5kbGU7CisJdW5zaWduZWQgbG9uZyB1bFRpbWVvdXQ7CisKK30gdEVwbFRpbWVydVRocmVhZDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCUxQQ1JJVElDQUxfU0VDVElPTiBtX3BDcml0aWNhbFNlY3Rpb247CisJQ1JJVElDQUxfU0VDVElPTiBtX0NyaXRpY2FsU2VjdGlvbjsKK30gdEVwbFRpbWVydUluc3RhbmNlOworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIG1vZHVsIGdsb2JhbGUgdmFycworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N0YXRpYyB0RXBsVGltZXJ1SW5zdGFuY2UgRXBsVGltZXJ1SW5zdGFuY2VfZzsKK3N0YXRpYyB0RXBsVGltZXJ1VGhyZWFkIFRocmVhZERhdGFfbDsKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRFdPUkQgUFVCTElDIEVwbFNkb1RpbWVydVRocmVhZG1zKExQVk9JRCBscFBhcmFtZXRlcik7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIEMgTCBBIFMgUyAgPEVwbCBVc2Vyc3BhY2UtVGltZXJtb2R1bGUgZm9yIFdpbjMyPiAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvLworLy8gRGVzY3JpcHRpb246IEVwbCBVc2Vyc3BhY2UtVGltZXJtb2R1bGUgZm9yIFdpbjMyCisvLworLy8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgUCBVIEIgTCBJIEMgICBGIFUgTiBDIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxUaW1lcnVJbml0CisvLworLy8gRGVzY3JpcHRpb246IGZ1bmN0aW9uIGluaXQgZmlyc3QgaW5zdGFuY2UKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6CisvLworLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICA9IGVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordEVwbEtlcm5lbCBQVUJMSUMgRXBsVGltZXJ1SW5pdCgpCit7CisJdEVwbEtlcm5lbCBSZXQ7CisKKwlSZXQgPSBFcGxUaW1lcnVBZGRJbnN0YW5jZSgpOworCisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsVGltZXJ1QWRkSW5zdGFuY2UKKy8vCisvLyBEZXNjcmlwdGlvbjogZnVuY3Rpb24gaW5pdCBhZGRpdGlvbmFsIGluc3RhbmNlCisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOgorLy8KKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgPSBlcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3RFcGxLZXJuZWwgUFVCTElDIEVwbFRpbWVydUFkZEluc3RhbmNlKCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKworCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJLy8gY3JlYXRlIGNyaXRpY2FsIHNlY3Rpb24KKwlFcGxUaW1lcnVJbnN0YW5jZV9nLm1fcENyaXRpY2FsU2VjdGlvbiA9CisJICAgICZFcGxUaW1lcnVJbnN0YW5jZV9nLm1fQ3JpdGljYWxTZWN0aW9uOworCUluaXRpYWxpemVDcml0aWNhbFNlY3Rpb24oRXBsVGltZXJ1SW5zdGFuY2VfZy5tX3BDcml0aWNhbFNlY3Rpb24pOworCisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsVGltZXJ1RGVsSW5zdGFuY2UKKy8vCisvLyBEZXNjcmlwdGlvbjogZnVuY3Rpb24gZGVsdGUgaW5zdGFuY2UKKy8vICAgICAgICAgICAgICAtPiB1bmRlciBXaW4zMiBub3RoaW5nIHRvIGRvCisvLyAgICAgICAgICAgICAgLT4gbm8gaW5zdG5hY2UgdGFibGUgbmVlZGVkCisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOgorLy8KKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgPSBlcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3RFcGxLZXJuZWwgUFVCTElDIEVwbFRpbWVydURlbEluc3RhbmNlKCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKworCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsVGltZXJ1U2V0VGltZXJNcworLy8KKy8vIERlc2NyaXB0aW9uOiBmdW5jdGlvbiBjcmVhdGUgYSB0aW1lciBhbmQgcmV0dXJuIGEgaGFuZGxlIHRvIHRoZSBwb2ludGVyCisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOiAgcFRpbWVySGRsX3AgPSBwb2ludGVyIHRvIGEgYnVmZmVyIHRvIGZpbGwgaW4gdGhlIGhhbmRsZQorLy8gICAgICAgICAgICAgIHVsVGltZV9wICAgID0gdGltZSBmb3IgdGltZXIgaW4gbXMKKy8vICAgICAgICAgICAgICBBcmd1bWVudF9wICA9IGFyZ3VtZW50IGZvciB0aW1lcgorLy8KKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgPSBlcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3RFcGxLZXJuZWwgUFVCTElDIEVwbFRpbWVydVNldFRpbWVyTXModEVwbFRpbWVySGRsICogcFRpbWVySGRsX3AsCisJCQkJICAgICAgdW5zaWduZWQgbG9uZyB1bFRpbWVfcCwKKwkJCQkgICAgICB0RXBsVGltZXJBcmcgQXJndW1lbnRfcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKwlIQU5ETEUgRGVsZXRlSGFuZGxlOworCUhBTkRMRSBUaHJlYWRIYW5kbGU7CisJRFdPUkQgVGhyZWFkSWQ7CisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCS8vIGNoZWNrIGhhbmRsZQorCWlmIChwVGltZXJIZGxfcCA9PSBOVUxMKSB7CisJCVJldCA9IGtFcGxUaW1lckludmFsaWRIYW5kbGU7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gZW50ZXIgIGNyaXRpY2FsIHNlY3Rpb24KKwlFbnRlckNyaXRpY2FsU2VjdGlvbihFcGxUaW1lcnVJbnN0YW5jZV9nLm1fcENyaXRpY2FsU2VjdGlvbik7CisKKwkvLyBmaXJzdCBjcmVhdGUgZXZlbnQgdG8gZGVsZXRlIHRpbWVyCisJRGVsZXRlSGFuZGxlID0gQ3JlYXRlRXZlbnQoTlVMTCwgRkFMU0UsIEZBTFNFLCBOVUxMKTsKKwlpZiAoRGVsZXRlSGFuZGxlID09IE5VTEwpIHsKKwkJUmV0ID0ga0VwbFRpbWVyTm9UaW1lckNyZWF0ZWQ7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gc2V0IGhhbmRsZSBmb3IgY2FsbGVyCisJKnBUaW1lckhkbF9wID0gKHRFcGxUaW1lckhkbCkgRGVsZXRlSGFuZGxlOworCisJLy8gZmlsbCBkYXRhIGZvciB0aHJlYWQKKwlUaHJlYWREYXRhX2wuRGVsdGVIYW5kbGUgPSBEZWxldGVIYW5kbGU7CisJRVBMX01FTUNQWSgmVGhyZWFkRGF0YV9sLlRpbWVyQXJndW1lbnQsICZBcmd1bWVudF9wLAorCQkgICBzaXplb2YodEVwbFRpbWVyQXJnKSk7CisJVGhyZWFkRGF0YV9sLnVsVGltZW91dCA9IHVsVGltZV9wOworCisJLy8gY3JlYXRlIHRocmVhZCB0byBjcmVhdGUgd2FpdGFibGUgdGltZXIgYW5kIHdhaXQgZm9yIHRpbWVyCisJVGhyZWFkSGFuZGxlID0gQ3JlYXRlVGhyZWFkKE5VTEwsCisJCQkJICAgIDAsCisJCQkJICAgIEVwbFNkb1RpbWVydVRocmVhZG1zLAorCQkJCSAgICAmVGhyZWFkRGF0YV9sLCAwLCAmVGhyZWFkSWQpOworCWlmIChUaHJlYWRIYW5kbGUgPT0gTlVMTCkgeworCQkvLyBsZWF2ZSBjcml0aWNhbCBzZWN0aW9uCisJCUxlYXZlQ3JpdGljYWxTZWN0aW9uKEVwbFRpbWVydUluc3RhbmNlX2cubV9wQ3JpdGljYWxTZWN0aW9uKTsKKworCQkvLyBkZWx0ZSBoYW5kbGUKKwkJQ2xvc2VIYW5kbGUoRGVsZXRlSGFuZGxlKTsKKworCQlSZXQgPSBrRXBsVGltZXJOb1RpbWVyQ3JlYXRlZDsKKwkJZ290byBFeGl0OworCX0KKworICAgICAgRXhpdDoKKwlyZXR1cm4gUmV0OworfQorCisgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsVGltZXJ1TW9kaWZ5VGltZXJNcworLy8KKy8vIERlc2NyaXB0aW9uOiBmdW5jdGlvbiBjaGFuZ2UgYSB0aW1lciBhbmQgcmV0dXJuIGEgaGFuZGxlIHRvIHRoZSBwb2ludGVyCisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOiAgcFRpbWVySGRsX3AgPSBwb2ludGVyIHRvIGEgYnVmZmVyIHRvIGZpbGwgaW4gdGhlIGhhbmRsZQorLy8gICAgICAgICAgICAgIHVsVGltZV9wICAgID0gdGltZSBmb3IgdGltZXIgaW4gbXMKKy8vICAgICAgICAgICAgICBBcmd1bWVudF9wICA9IGFyZ3VtZW50IGZvciB0aW1lcgorLy8KKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgPSBlcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3RFcGxLZXJuZWwgUFVCTElDIEVwbFRpbWVydU1vZGlmeVRpbWVyTXModEVwbFRpbWVySGRsICogcFRpbWVySGRsX3AsCisJCQkJCSB1bnNpZ25lZCBsb25nIHVsVGltZV9wLAorCQkJCQkgdEVwbFRpbWVyQXJnIEFyZ3VtZW50X3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisJSEFORExFIERlbGV0ZUhhbmRsZTsKKwlIQU5ETEUgVGhyZWFkSGFuZGxlOworCURXT1JEIFRocmVhZElkOworCisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwkvLyBjaGVjayBwYXJhbWV0ZXIKKwlpZiAocFRpbWVySGRsX3AgPT0gTlVMTCkgeworCQlSZXQgPSBrRXBsVGltZXJJbnZhbGlkSGFuZGxlOworCQlnb3RvIEV4aXQ7CisJfQorCisJRGVsZXRlSGFuZGxlID0gKEhBTkRMRSkgKCpwVGltZXJIZGxfcCk7CisKKwkvLyBzZXQgZXZlbnQgdG8gZW5kIHRpbWVyIHRhc2sgZm9yIHRoaXMgdGltZXIKKwlTZXRFdmVudChEZWxldGVIYW5kbGUpOworCisJLy8gY3JlYXRlIG5ldyB0aW1lcgorCS8vIGZpcnN0IGNyZWF0ZSBldmVudCB0byBkZWxldGUgdGltZXIKKwlEZWxldGVIYW5kbGUgPSBDcmVhdGVFdmVudChOVUxMLCBGQUxTRSwgRkFMU0UsIE5VTEwpOworCWlmIChEZWxldGVIYW5kbGUgPT0gTlVMTCkgeworCQlSZXQgPSBrRXBsVGltZXJOb1RpbWVyQ3JlYXRlZDsKKwkJZ290byBFeGl0OworCX0KKwkvLyBzZXQgaGFuZGxlIGZvciBjYWxsZXIKKwkqcFRpbWVySGRsX3AgPSAodEVwbFRpbWVySGRsKSBEZWxldGVIYW5kbGU7CisKKwkvLyBlbnRlciAgY3JpdGljYWwgc2VjdGlvbgorCUVudGVyQ3JpdGljYWxTZWN0aW9uKEVwbFRpbWVydUluc3RhbmNlX2cubV9wQ3JpdGljYWxTZWN0aW9uKTsKKworCS8vIGZpbGwgZGF0YSBmb3IgdGhyZWFkCisJVGhyZWFkRGF0YV9sLkRlbHRlSGFuZGxlID0gRGVsZXRlSGFuZGxlOworCUVQTF9NRU1DUFkoJlRocmVhZERhdGFfbC5UaW1lckFyZ3VtZW50LCAmQXJndW1lbnRfcCwKKwkJICAgc2l6ZW9mKHRFcGxUaW1lckFyZykpOworCVRocmVhZERhdGFfbC51bFRpbWVvdXQgPSB1bFRpbWVfcDsKKworCS8vIGNyZWF0ZSB0aHJlYWQgdG8gY3JlYXRlIHdhaXRhYmxlIHRpbWVyIGFuZCB3YWl0IGZvciB0aW1lcgorCVRocmVhZEhhbmRsZSA9IENyZWF0ZVRocmVhZChOVUxMLAorCQkJCSAgICAwLAorCQkJCSAgICBFcGxTZG9UaW1lcnVUaHJlYWRtcywKKwkJCQkgICAgJlRocmVhZERhdGFfbCwgMCwgJlRocmVhZElkKTsKKwlpZiAoVGhyZWFkSGFuZGxlID09IE5VTEwpIHsKKwkJLy8gbGVhdmUgY3JpdGljYWwgc2VjdGlvbgorCQlMZWF2ZUNyaXRpY2FsU2VjdGlvbihFcGxUaW1lcnVJbnN0YW5jZV9nLm1fcENyaXRpY2FsU2VjdGlvbik7CisKKwkJLy8gZGVsdGUgaGFuZGxlCisKKwkJUmV0ID0ga0VwbFRpbWVyTm9UaW1lckNyZWF0ZWQ7CisJCWdvdG8gRXhpdDsKKwl9CisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIFJldDsKK30KKworIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbFRpbWVydURlbGV0ZVRpbWVyCisvLworLy8gRGVzY3JpcHRpb246IGZ1bmN0aW9uIGRlbHRlIGEgdGltZXIKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6ICBwVGltZXJIZGxfcCA9IHBvaW50ZXIgdG8gYSBidWZmZXIgdG8gZmlsbCBpbiB0aGUgaGFuZGxlCisvLworLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICA9IGVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordEVwbEtlcm5lbCBQVUJMSUMgRXBsVGltZXJ1RGVsZXRlVGltZXIodEVwbFRpbWVySGRsICogcFRpbWVySGRsX3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisJSEFORExFIERlbGV0ZUhhbmRsZTsKKworCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJLy8gY2hlY2sgcGFyYW1ldGVyCisJaWYgKHBUaW1lckhkbF9wID09IE5VTEwpIHsKKwkJUmV0ID0ga0VwbFRpbWVySW52YWxpZEhhbmRsZTsKKwkJZ290byBFeGl0OworCX0KKworCURlbGV0ZUhhbmRsZSA9IChIQU5ETEUpICgqcFRpbWVySGRsX3ApOworCisJLy8gc2V0IGV2ZW50IHRvIGVuZCB0aW1lciB0YXNrIGZvciB0aGlzIHRpbWVyCisJU2V0RXZlbnQoRGVsZXRlSGFuZGxlKTsKKworCS8vIHNldCBoYW5kbGUgaW52YWxpZGUKKwkqcFRpbWVySGRsX3AgPSAwOworCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7CisKK30KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICBQIFIgSSBWIEEgVCBFICAgRiBVIE4gQyBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbFNkb1RpbWVydVRocmVhZG1zCisvLworLy8gRGVzY3JpcHRpb246IGZ1bmN0aW9uIHRvIHByb2Nlc3MgdGltZXIgYXMgdGhyZWFkCisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOiAgbHBQYXJhbWV0ZXIgPSBwb2ludGVyIHRvIHN0cnVjdHVyIG9mIHR5cGUgdEVwbFRpbWVydVRocmVhZAorLy8KKy8vCisvLyBSZXR1cm5zOiAgICAgRFdPUkQgPSBFcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0RXT1JEIFBVQkxJQyBFcGxTZG9UaW1lcnVUaHJlYWRtcyhMUFZPSUQgbHBQYXJhbWV0ZXIpCit7CisJdEVwbEtlcm5lbCBSZXQ7CisJdEVwbFRpbWVydVRocmVhZCAqcFRocmVhZERhdGE7CisJSEFORExFIGFIYW5kbGVzWzJdOworCUJPT0wgZlJldHVybjsKKwlMQVJHRV9JTlRFR0VSIFRpbWVvdXRUaW1lOworCXVuc2lnbmVkIGxvbmcgdWxFdmVudDsKKwl0RXBsRXZlbnQgRXBsRXZlbnQ7CisJdEVwbFRpbWVydVRocmVhZCBUaHJlYWREYXRhOworCXRFcGxUaW1lckV2ZW50QXJnIFRpbWVyRXZlbnRBcmc7CisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCS8vIGdldCBwb2ludGVyIHRvIGRhdGEKKwlwVGhyZWFkRGF0YSA9ICh0RXBsVGltZXJ1VGhyZWFkICopIGxwUGFyYW1ldGVyOworCS8vIGNvcHkgdGhyZWFkIGRhdGEKKwlFUExfTUVNQ1BZKCZUaHJlYWREYXRhLCBwVGhyZWFkRGF0YSwgc2l6ZW9mKFRocmVhZERhdGEpKTsKKwlwVGhyZWFkRGF0YSA9ICZUaHJlYWREYXRhOworCisJLy8gbGVhdmUgY3JpdGljYWwgc2VjdGlvbgorCUxlYXZlQ3JpdGljYWxTZWN0aW9uKEVwbFRpbWVydUluc3RhbmNlX2cubV9wQ3JpdGljYWxTZWN0aW9uKTsKKworCS8vIGNyZWF0ZSB3YWl0YWJsZSB0aW1lcgorCWFIYW5kbGVzWzFdID0gQ3JlYXRlV2FpdGFibGVUaW1lcihOVUxMLCBGQUxTRSwgTlVMTCk7CisJaWYgKGFIYW5kbGVzWzFdID09IE5VTEwpIHsKKwkJUmV0ID0ga0VwbFRpbWVyTm9UaW1lckNyZWF0ZWQ7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gc2V0IHRpbWVyCisJLy8gc2V0IHRpbWVvdXQgaW50ZXJ2YWwgLT4gbmVlZGVkIHRvIGJlIG5lZ2F0aXYKKwkvLyAtPiBiZWNhdXNlIHJlbGF0aXZlIHRpbWVvdXQKKwkvLyAtPiBtdWx0aXBseSBieSAxMDAwMCBmb3IgMTAwIG5zIHRpbWViYXNlIG9mIGZ1bmN0aW9uCisJVGltZW91dFRpbWUuUXVhZFBhcnQgPSAoKChsb25nIGxvbmcpcFRocmVhZERhdGEtPnVsVGltZW91dCkgKiAtMTAwMDApOworCWZSZXR1cm4gPSBTZXRXYWl0YWJsZVRpbWVyKGFIYW5kbGVzWzFdLAorCQkJCSAgICZUaW1lb3V0VGltZSwgMCwgTlVMTCwgTlVMTCwgRkFMU0UpOworCWlmIChmUmV0dXJuID09IDApIHsKKwkJUmV0ID0ga0VwbFRpbWVyTm9UaW1lckNyZWF0ZWQ7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gc2F2ZSBkZWx0ZSBldmVudCBoYW5kbGUgaW4gaGFuZGxlIGFycmF5CisJYUhhbmRsZXNbMF0gPSBwVGhyZWFkRGF0YS0+RGVsdGVIYW5kbGU7CisKKwkvLyB3YWl0IGZvciBvbmUgb2YgdGhlIGV2ZW50cworCXVsRXZlbnQgPSBXYWl0Rm9yTXVsdGlwbGVPYmplY3RzKDIsICZhSGFuZGxlc1swXSwgRkFMU0UsIElORklOSVRFKTsKKwlpZiAodWxFdmVudCA9PSBXQUlUX09CSkVDVF8wKSB7CS8vIGRlbHRlIGV2ZW50CisKKwkJLy8gY2xvc2UgaGFuZGVscworCQlDbG9zZUhhbmRsZShhSGFuZGxlc1sxXSk7CisJCS8vIHRlcm1pbmF0ZSB0aHJlYWQKKwkJZ290byBFeGl0OworCX0gZWxzZSBpZiAodWxFdmVudCA9PSAoV0FJVF9PQkpFQ1RfMCArIDEpKSB7CS8vIHRpbWVyIGV2ZW50CisJCS8vIGNhbGwgZXZlbnQgZnVuY3Rpb24KKwkJVGltZXJFdmVudEFyZy5tX1RpbWVySGRsID0KKwkJICAgICh0RXBsVGltZXJIZGwpIHBUaHJlYWREYXRhLT5EZWx0ZUhhbmRsZTsKKwkJVGltZXJFdmVudEFyZy5tX3VsQXJnID0gcFRocmVhZERhdGEtPlRpbWVyQXJndW1lbnQubV91bEFyZzsKKworCQlFcGxFdmVudC5tX0V2ZW50U2luayA9IHBUaHJlYWREYXRhLT5UaW1lckFyZ3VtZW50Lm1fRXZlbnRTaW5rOworCQlFcGxFdmVudC5tX0V2ZW50VHlwZSA9IGtFcGxFdmVudFR5cGVUaW1lcjsKKwkJRVBMX01FTVNFVCgmRXBsRXZlbnQubV9OZXRUaW1lLCAweDAwLCBzaXplb2YodEVwbE5ldFRpbWUpKTsKKwkJRXBsRXZlbnQubV9wQXJnID0gJlRpbWVyRXZlbnRBcmc7CisJCUVwbEV2ZW50Lm1fdWlTaXplID0gc2l6ZW9mKFRpbWVyRXZlbnRBcmcpOworCisJCVJldCA9IEVwbEV2ZW50dVBvc3QoJkVwbEV2ZW50KTsKKworCQkvLyBjbG9zZSBoYW5kZWxzCisJCUNsb3NlSGFuZGxlKGFIYW5kbGVzWzFdKTsKKwkJLy8gdGVybWluYXRlIHRocmVhZAorCQlnb3RvIEV4aXQ7CisKKwl9IGVsc2UgewkJLy8gZXJyb3IKKwkJdWxFdmVudCA9IEdldExhc3RFcnJvcigpOworCQlUUkFDRTEoIkVycm9yIGluIFdhaXRGb3JNdWx0aXBsZU9iamVjdHMgRXJyb3Jjb2RlOiAweCV4XG4iLAorCQkgICAgICAgdWxFdmVudCk7CisJCS8vIHRlcm1pbmF0ZSB0aHJlYWQKKwkJZ290byBFeGl0OworCX0KKworICAgICAgRXhpdDoKKwlyZXR1cm4gUmV0OworfQorCisvLyBFT0YKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsVmVyc2lvbi5oIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxWZXJzaW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzU1NzBkNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsVmVyc2lvbi5oCkBAIC0wLDAgKzEsOTggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgRVBMIHZlcnNpb24gZm9yIHRoZSBzdGFjaywgYXMgc3RyaW5nCisgICAgICAgICAgICAgICAgYW5kIGZvciBvYmplY3QgMHgxMDE4IHdpdGhpbiBvYmplY3QgZGljdGlvbmFyeS4KKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgICAgICAgICRSQ1NmaWxlOiBFcGxWZXJzaW9uLmgsdiAkCisKKyAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAorCisgICAgICAgICAgICAgICAgJFJldmlzaW9uOiAxLjYgJCAgJERhdGU6IDIwMDgvMTAvMTcgMTU6MzI6MzIgJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgICAgIGFsbAorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9FUExfVkVSU0lPTl9IXworI2RlZmluZSBfRVBMX1ZFUlNJT05fSF8KKworLy8gTk9URToKKy8vIEFsbCB2ZXJzaW9uIG1hY3JvcyBzaG91bGQgY29udGFpbiB0aGUgc2FtZSB2ZXJzaW9uIG51bWJlci4gQnV0IGRvIG5vdCB1c2UKKy8vIGRlZmluZXMgaW5zdGVhZCBvZiB0aGUgbnVtYmVycy4gQmVjYXVzZSB0aGUgbWFjcm8gRVBMX1NUUklOR19WRVJTSU9OKCkgY2FuIG5vdAorLy8gY29udmVydCBhIGRlZmluZSB0byBhIHN0cmluZy4KKy8vCisvLyBGb3JtYXQ6IG1hai5taW4uYnVpbGQKKy8vICAgICAgICAgbWFqICAgICAgICAgICAgPSBtYWpvciB2ZXJzaW9uCisvLyAgICAgICAgICAgICBtaW4gICAgICAgID0gbWlub3IgdmVyc2lvbiAod2lsbCBiZSBzZXQgdG8gMCBpZiBtYWpvciB2ZXJzaW9uIHdpbGwgYmUgaW5jcmVtZW50ZWQpCisvLyAgICAgICAgICAgICAgICAgYnVpbGQgID0gY3VycmVudCBidWlsZCAod2lsbCBiZSBzZXQgdG8gMCBpZiBtaW5vciB2ZXJzaW9uIHdpbGwgYmUgaW5jcmVtZW50ZWQpCisvLworI2RlZmluZSBERUZJTkVEX1NUQUNLX1ZFUlNJT04gICAgICAgRVBMX1NUQUNLX1ZFUlNJT04gICAoMSwgMywgMCkKKyNkZWZpbmUgREVGSU5FRF9PQkoxMDE4X1ZFUlNJT04gICAgIEVQTF9PQkoxMDE4X1ZFUlNJT04gKDEsIDMsIDApCisjZGVmaW5lIERFRklORURfU1RSSU5HX1ZFUlNJT04gICAgICBFUExfU1RSSU5HX1ZFUlNJT04gICgxLCAzLCAwKQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2RlZmluZSBFUExfUFJPRFVDVF9OQU1FICAgICAgICAgICAgIkVQTCBWMiIKKyNkZWZpbmUgRVBMX1BST0RVQ1RfVkVSU0lPTiAgICAgICAgIERFRklORURfU1RSSU5HX1ZFUlNJT04KKyNkZWZpbmUgRVBMX1BST0RVQ1RfTUFOVUZBQ1RVUkVSICAgICJTWVMgVEVDIGVsZWN0cm9uaWMgR21iSCIKKworI2RlZmluZSBFUExfUFJPRFVDVF9LRVkgICAgICAgICAiU08tMTA4MyIKKyNkZWZpbmUgRVBMX1BST0RVQ1RfREVTQ1JJUFRJT04gIm9wZW5QT1dFUkxJTksgUHJvdG9jb2wgU3RhY2sgU291cmNlIgorCisjZW5kaWYgLy8gX0VQTF9WRVJTSU9OX0hfCisKKy8vIERpZSBsZXR6dGUgWmVpbGUgbXXfIHVuYmVkaW5ndCBlaW5lIGxlZXJlIFplaWxlIHNlaW4sIHdlaWwgbWFuY2hlIENvbXBpbGVyCisvLyBkYW1pdCBlaW4gUHJvYmxlbSBoYWJlbiwgd2VubiBkYXMgbmljaHQgc28gaXN0ICh6LkIuIEdOVSBvZGVyIEJvcmxhbmQgQysrIEJ1aWxkZXIpLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmOTM5ZDUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0tjb25maWcKQEAgLTAsMCArMSw2IEBACitjb25maWcgRVBMCisJdHJpc3RhdGUgIm9wZW5QT1dFUkxJTksgcHJvdG9jb2wgc3RhY2siCisJZGVwZW5kcyBvbiBORVQgJiYgSElHSF9SRVNfVElNRVJTICYmIFg4NgorCWRlZmF1bHQgTgorCS0tLWhlbHAtLS0KKwkgIEVuYWJsZSBzdXBwb3J0IGZvciB0aGUgb3BlblBPV0VSTElOSyBuZXR3b3JrIHByb3RvY29sIHN0YWNrLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTJjODI0MQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvTWFrZWZpbGUKQEAgLTAsMCArMSw0MSBAQAorb2JqLSQoQ09ORklHX0VQTCkJKz0gZXBsLm8KKworZXBsLW9ianMgOj0gCVwKKwlFcGxBcGlHZW5lcmljLm8JCVwKKwlFcGxBcGlMaW51eEtlcm5lbC5vCVwKKwlFcGxBcGlQcm9jZXNzSW1hZ2UubwlcCisJRXBsRGxsay5vCQlcCisJRXBsRGxsa0NhbC5vCQlcCisJRXBsRGxsdUNhbC5vCQlcCisJRXBsRXJyb3JIYW5kbGVyay5vCVwKKwlFcGxFdmVudGsubwkJXAorCUVwbEV2ZW50dS5vCQlcCisJRXBsSWRlbnR1Lm8JCVwKKwlFcGxObXRDbnUubwkJXAorCUVwbE5tdGsubwkJXAorCUVwbE5tdGtDYWwubwkJXAorCUVwbE5tdE1udS5vCQlcCisJRXBsTm10dS5vCQlcCisJRXBsTm10dUNhbC5vCQlcCisJRXBsT2JkLm8JCVwKKwlFcGxPYmRrQ2FsLm8JCVwKKwlFcGxPYmR1Lm8JCVwKKwlFcGxPYmR1Q2FsLm8JCVwKKwlFcGxQZG9rLm8JCVwKKwlFcGxQZG9rQ2FsLm8JCVwKKwlFcGxQZG91Lm8JCVwKKwlFcGxTZG9Bc25kdS5vCQlcCisJRXBsU2RvQXN5U2VxdS5vCQlcCisJRXBsU2RvQ29tdS5vCQlcCisJRXBsU2RvVWRwdS5vCQlcCisJRXBsU3RhdHVzdS5vCQlcCisJRXBsVGltZXJ1TGludXhLZXJuZWwubwlcCisJYW1peDg2Lm8JCVwKKwlTaGFyZWRCdWZmLm8JCVwKKwlTaGJJcGMtTGludXhLZXJuZWwubwlcCisJVGltZXJIaWdoUmVza1g4Ni5vCVwKKwlWaXJ0dWFsRXRoZXJuZXRMaW51eC5vCVwKKwlTb2NrZXRMaW51eEtlcm5lbC5vCVwKKwlwcm9jX2ZzLm8JCVwKKwlkZW1vX21haW4ubwkJXAorCUVkcnY4MTM5Lm8JCVwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwvU2hhcmVkQnVmZi5jIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9TaGFyZWRCdWZmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWZiMDlkNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvU2hhcmVkQnVmZi5jCkBAIC0wLDAgKzEsMTc5OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIFByb2plY3QgaW5kZXBlbmRlbmQgc2hhcmVkIGJ1ZmZlciAobGluZWFyICsgY2lyY3VsYXIpCisKKyAgRGVzY3JpcHRpb246ICBJbXBsZW1lbnRhdGlvbiBvZiBwbGF0Zm9ybSBpbmRlcGVuZGVuZCBwYXJ0IGZvciB0aGUKKyAgICAgICAgICAgICAgICBzaGFyZWQgYnVmZmVyCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgMjAwNi8wNi8yNyAtcnM6ICAgViAxLjAwIChpbml0aWFsIHZlcnNpb24pCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZiBkZWZpbmVkKFdJTjMyKSB8fCBkZWZpbmVkKF9XSU4zMikKKworI2lmZGVmIFVOREVSX1JUU1MKKwkvLyBSVFggaGVhZGVyCisjaW5jbHVkZSA8d2luZG93cy5oPgorI2luY2x1ZGUgPHByb2Nlc3MuaD4KKyNpbmNsdWRlIDxydGFwaS5oPgorCisjZWxpZiBfX0JPUkxBTkRDX18KKwkvLyBib3JsYW5kIEMgaGVhZGVyCisjaW5jbHVkZSA8d2luZG93cy5oPgorI2luY2x1ZGUgPHByb2Nlc3MuaD4KKworI2VsaWYgV0lOQ0UKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisKKyNlbHNlCisJLy8gTVNWQyBuZWVkcyB0byBpbmNsdWRlIHdpbmRvd3MuaCBhdCBmaXJzdAorCS8vIHRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhciBuZWNlc3NhcnkgZm9yIGZ1bmN0aW9uIHByb3RvdHlwZXMgZm9yIHdhaXRhYmxlIHRpbWVycworI2RlZmluZSBfV0lOMzJfV0lORE9XUyAweDA0MDEKKyNkZWZpbmUgX1dJTjMyX1dJTk5UICAgMHgwNDAwCisjaW5jbHVkZSA8d2luZG93cy5oPgorI2luY2x1ZGUgPHByb2Nlc3MuaD4KKyNlbmRpZgorCisjZW5kaWYKKworI2luY2x1ZGUgImdsb2JhbC5oIgorI2luY2x1ZGUgIlNoYXJlZEJ1ZmYuaCIKKyNpbmNsdWRlICJTaGJJcGMuaCIKKworLy8gZC5rLiBMaW51eCBrZXJuZWwgbW9kdWxlcyBuZWVkcyBvdGhlciBoZWFkZXIgZmlsZXMgZm9yIG1lbWNweSgpCisjaWYgKFRBUkdFVF9TWVNURU0gPT0gX0xJTlVYXykgJiYgZGVmaW5lZChfX0tFUk5FTF9fKQorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2Vsc2UKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIEcgTCBPIEIgQSBMICAgRCBFIEYgSSBOIEkgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZiAoIWRlZmluZWQoU0hBUkVEQlVGRl9JTkxJTkVEKSkgfHwgZGVmaW5lZChJTkxJTkVfRU5BQkxFRCkKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBDb25maWd1cmF0aW9uCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIENvbnN0YW50IGRlZmluaXRpb25zCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZGVmaW5lIFNCQ19NQUdJQ19JRCAgICAweDUzNDI0MzIzCS8vIG1hZ2ljIElEICgiU0JDIyIpCisjZGVmaW5lIFNCTF9NQUdJQ19JRCAgICAweDUzNDI0QzIzCS8vIG1hZ2ljIElEICgiU0JMIyIpCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgTG9jYWwgdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIHN0cnVjdHVyZSB0byBhZG1pbmlzdHJhdGUgY2lyY3VsYXIgc2hhcmVkIGJ1ZmZlciBoZWFkCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgbG9uZyBtX1NoYkNpck1hZ2ljSUQ7CS8vIG1hZ2ljIElEICgiU0JDIyIpCisJdW5zaWduZWQgbG9uZyBtX3VsQnVmZmVyVG90YWxTaXplOwkvLyBvdmVyLWFsbCBzaXplIG9mIGNvbXBsZXRlIGJ1ZmZlcgorCXVuc2lnbmVkIGxvbmcgbV91bEJ1ZmZlckRhdGFTaXplOwkvLyBzaXplIG9mIGNvbXBsZXRlIGRhdGEgYXJlYQorCXVuc2lnbmVkIGxvbmcgbV91bFdySW5kZXg7CS8vIGN1cnJlbnQgd3JpdGUgaW5kZXggKHNldCBiZXZvcmUgd3JpdGUpCisJdW5zaWduZWQgbG9uZyBtX3VsUmRJbmRleDsJLy8gY3VycmVudCByZWFkIGluZGV4IChzZXQgYWZ0ZXIgcmVhZCkKKwl1bnNpZ25lZCBsb25nIG1fdWxOdW1PZldyaXRlSm9iczsJLy8gbnVtYmVyIG9mIGN1cnJlbnRseSAocGFyYWxsZWwgcnVubmluZykgd3JpdGUgb3BlcmF0aW9ucworCXVuc2lnbmVkIGxvbmcgbV91bERhdGFJblVzZTsJLy8gY3VycmVudGx5IHVzZWQgYnVmZmVyIHNpemUgKGluY2wuIHVuY29tcGxldGVkIHdyaXRlIG9wZXJhdGlvbnMpCisJdW5zaWduZWQgbG9uZyBtX3VsRGF0YUFwZW5kZWQ7CS8vIGJ1ZmZlciBzaXplIG9mIGNvbXBsZXRlIG5ldyB3cml0dGVuIGJ1dCBub3QgeWV0IHJlYWRhYmxlIGRhdGEgKGluIGNhc2Ugb2YgbV91bE51bU9mV3JpdGVKb2JzPjEpCisJdW5zaWduZWQgbG9uZyBtX3VsQmxvY2tzQXBlbmRlZDsJLy8gbnVtYmVyIG9mIGNvbXBsZXRlIG5ldyB3cml0dGVuIGJ1dCBub3QgeWV0IHJlYWRhYmxlIGRhdGEgYmxvY2tzIChpbiBjYXNlIG9mIG1fdWxOdW1PZldyaXRlSm9icz4xKQorCXVuc2lnbmVkIGxvbmcgbV91bERhdGFSZWFkYWJsZTsJLy8gYnVmZmVyIHNpemUgd2l0aCByZWFkYWJsZSAoY29tcGxldGUgd3JpdHRlbikgZGF0YQorCXVuc2lnbmVkIGxvbmcgbV91bEJsb2Nrc1JlYWRhYmxlOwkvLyBudW1iZXIgb2YgcmVhZGFibGUgKGNvbXBsZXRlIHdyaXR0ZW4pIGRhdGEgYmxvY2tzCisJdFNoYkNpclNpZ0huZGxyTmV3RGF0YSBtX3BmblNpZ0huZGxyTmV3RGF0YTsJLy8gYXBwbGljYXRpb24gaGFuZGxlciB0byBzaWduYWwgbmV3IGRhdGEKKwl1bnNpZ25lZCBpbnQgbV9mQnVmZmVyTG9ja2VkOwkvLyBUUlVFIGlmIGJ1ZmZlciBpcyBsb2NrZWQgKGJlY2F1c2Ugb2YgcGVuZGluZyByZXNldCByZXF1ZXN0KQorCXRTaGJDaXJTaWdIbmRsclJlc2V0IG1fcGZuU2lnSG5kbHJSZXNldDsJLy8gYXBwbGljYXRpb24gaGFuZGxlciB0byBzaWduYWwgYnVmZmVyIHJlc2V0IGlzIGRvbmUKKwl1bnNpZ25lZCBjaGFyIG1fRGF0YTsJLy8gc3RhcnQgb2YgZGF0YSBhcmVhICh0aGUgcmVhbCBkYXRhIHNpemUgaXMgdW5rbm93biBhdCB0aGlzIHRpbWUpCisKK30gdFNoYkNpckJ1ZmY7CisKKy8vIHN0cnVjdHVyZSB0byBhZG1pbmlzdHJhdGUgbGluZWFyIHNoYXJlZCBidWZmZXIgaGVhZAordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGludCBtX1NoYkxpbk1hZ2ljSUQ7CS8vIG1hZ2ljIElEICgiU0JMIyIpCisJdW5zaWduZWQgbG9uZyBtX3VsQnVmZmVyVG90YWxTaXplOwkvLyBvdmVyLWFsbCBzaXplIG9mIGNvbXBsZXRlIGJ1ZmZlcgorCXVuc2lnbmVkIGxvbmcgbV91bEJ1ZmZlckRhdGFTaXplOwkvLyBzaXplIG9mIGNvbXBsZXRlIGRhdGEgYXJlYQorCXVuc2lnbmVkIGNoYXIgbV9EYXRhOwkvLyBzdGFydCBvZiBkYXRhIGFyZWEgKHRoZSByZWFsIGRhdGEgc2l6ZSBpcyB1bmtub3duIGF0IHRoaXMgdGltZSkKKworfSB0U2hiTGluQnVmZjsKKworLy8gdHlwZSB0byBzYXZlIHNpemUgb2YgYSBzaW5nbGUgZGF0YSBibG9jayBpbnNpZGUgdGhlIGNpcmN1bGFyIHNoYXJlZCBidWZmZXIKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBpbnQgbV91aUZ1bGxCbG9ja1NpemU6Mjg7CS8vIGEgc2luZ2xlIGJsb2NrIG11c3Qgbm90IGV4Y2VlZCBhIGxlbmd0aCBvZiAyNTZNQnl0ZSA6LSkKKwl1bnNpZ25lZCBpbnQgbV91aUFsaWduRmlsbEJ5dGVzOjQ7CisKK30gdFNoYkNpckJsb2NrU2l6ZTsKKworI2RlZmluZSBTQkNfQkxPQ0tfQUxJR05NRU5UICAgICAgICAgICAgICAgICAgNAkvLyBhbGlnbm1lbnQgbXVzdCAqbm90KiBiZSBsb3dlciB0aGFuIHNpemVvZih0U2hiQ2lyQmxvY2tTaXplKSEKKyNkZWZpbmUgU0JDX01BWF9CTE9DS19TSVpFICAgICAgICAgKCgxPDwyOCktMSkJLy8gPSAoMl4yOCAtIDEpID0gKDI1Nk1CeXRlIC0gMSkgLT4gc2hvdWxkIGJlIGVub3VnaHQgZm9yIHJlYWwgbGlmZSA6LSkKKworI2RlZmluZSBTQkxfQkxPQ0tfQUxJR05NRU5UICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBTQkxfTUFYX0JMT0NLX1NJWkUgICAgICAgICAoKDE8PDI4KS0xKQkvLyA9ICgyXjI4IC0gMSkgPSAoMjU2TUJ5dGUgLSAxKSAtPiBzaG91bGQgYmUgZW5vdWdodCBmb3IgcmVhbCBsaWZlIDotKQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIEdsb2JhbCB2YXJpYWJsZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgTG9jYWwgdmFyaWFibGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIFByb3RvdHlwZXMgb2YgaW50ZXJuYWwgZnVuY3Rpb25zCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIEdldCBwb2ludGVyIHRvIENpcmN1bGFyIFNoYXJlZCBCdWZmZXIKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lOTElORV9GVU5DVElPTiB0U2hiQ2lyQnVmZiAqU2hiQ2lyR2V0QnVmZmVyKHRTaGJJbnN0YW5jZSBwU2hiSW5zdGFuY2VfcCkKK3sKKworCXRTaGJDaXJCdWZmICpwU2hiQ2lyQnVmZjsKKworCXBTaGJDaXJCdWZmID0gKHRTaGJDaXJCdWZmICopIFNoYklwY0dldFNoTWVtUHRyKHBTaGJJbnN0YW5jZV9wKTsKKwlBU1NFUlQocFNoYkNpckJ1ZmYtPm1fU2hiQ2lyTWFnaWNJRCA9PSBTQkNfTUFHSUNfSUQpOworCisJcmV0dXJuIChwU2hiQ2lyQnVmZik7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBHZXQgcG9pbnRlciB0byBMaW5lYXIgU2hhcmVkIEJ1ZmZlcgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSU5MSU5FX0ZVTkNUSU9OIHRTaGJMaW5CdWZmICpTaGJMaW5HZXRCdWZmZXIodFNoYkluc3RhbmNlIHBTaGJJbnN0YW5jZV9wKQoreworCisJdFNoYkxpbkJ1ZmYgKnBTaGJMaW5CdWZmOworCisJcFNoYkxpbkJ1ZmYgPSAodFNoYkxpbkJ1ZmYgKikgU2hiSXBjR2V0U2hNZW1QdHIocFNoYkluc3RhbmNlX3ApOworCUFTU0VSVChwU2hiTGluQnVmZi0+bV9TaGJMaW5NYWdpY0lEID09IFNCTF9NQUdJQ19JRCk7CisKKwlyZXR1cm4gKHBTaGJMaW5CdWZmKTsKKworfQorCisvLyBub3QgaW5saW5lZCBpbnRlcm5hbCBmdW5jdGlvbnMKK2ludCBTaGJDaXJTaWduYWxIYW5kbGVyTmV3RGF0YSh0U2hiSW5zdGFuY2UgcFNoYkluc3RhbmNlX3ApOwordm9pZCBTaGJDaXJTaWduYWxIYW5kbGVyUmVzZXQodFNoYkluc3RhbmNlIHBTaGJJbnN0YW5jZV9wLAorCQkJICAgICAgdW5zaWduZWQgaW50IGZUaW1lT3V0X3ApOworCisjZW5kaWYKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICBQIFUgQiBMIEkgQyAgIEYgVSBOIEMgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisKKyNpZiAhZGVmaW5lZChJTkxJTkVfRU5BQkxFRCkKKy8vIG5vdCBpbmxpbmVkIGV4dGVybmFsIGZ1bmN0aW9ucworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIEluaXRpYWxpemUgU2hhcmVkIEJ1ZmZlciBNb2R1bGUKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RTaGJFcnJvciBTaGJJbml0KHZvaWQpCit7CisKKwl0U2hiRXJyb3IgU2hiRXJyb3I7CisKKwlTaGJFcnJvciA9IFNoYklwY0luaXQoKTsKKworCXJldHVybiAoU2hiRXJyb3IpOworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgRGVpbml0aWFsaXplIFNoYXJlZCBCdWZmZXIgTW9kdWxlCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0U2hiRXJyb3IgU2hiRXhpdCh2b2lkKQoreworCisJdFNoYkVycm9yIFNoYkVycm9yOworCisJU2hiRXJyb3IgPSBTaGJJcGNFeGl0KCk7CisKKwlyZXR1cm4gKFNoYkVycm9yKTsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgIEMgaSByIGMgdSBsIGEgciAgIFMgaCBhIHIgZSBkICAgQiB1IGYgZiBlIHIgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLy8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBBbGxvY2F0ZSBDaXJjdWxhciBTaGFyZWQgQnVmZmVyCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0U2hiRXJyb3IgU2hiQ2lyQWxsb2NCdWZmZXIodW5zaWduZWQgbG9uZyB1bEJ1ZmZlclNpemVfcCwKKwkJCSAgICBjb25zdCBjaGFyICpwc3pCdWZmZXJJRF9wLAorCQkJICAgIHRTaGJJbnN0YW5jZSAqIHBwU2hiSW5zdGFuY2VfcCwKKwkJCSAgICB1bnNpZ25lZCBpbnQgKnBmU2hiTmV3Q3JlYXRlZF9wKQoreworCisJdFNoYkluc3RhbmNlIHBTaGJJbnN0YW5jZTsKKwl0U2hiQ2lyQnVmZiAqcFNoYkNpckJ1ZmY7CisJdW5zaWduZWQgaW50IGZTaGJOZXdDcmVhdGVkOworCXVuc2lnbmVkIGxvbmcgdWxCdWZmZXJEYXRhU2l6ZTsKKwl1bnNpZ25lZCBsb25nIHVsQnVmZmVyVG90YWxTaXplOworCXRTaGJFcnJvciBTaGJFcnJvcjsKKworCS8vIGNoZWNrIGFyZ3VtZW50cworCWlmICgodWxCdWZmZXJTaXplX3AgPT0gMCkgfHwgKHBwU2hiSW5zdGFuY2VfcCA9PSBOVUxMKSkgeworCQlyZXR1cm4gKGtTaGJJbnZhbGlkQXJnKTsKKwl9CisKKwkvLyBjYWxjdWxhdGUgbGVuZ3RoIG9mIG1lbW9yeSB0byBhbGxvY2F0ZQorCXVsQnVmZmVyRGF0YVNpemUgPQorCSAgICAodWxCdWZmZXJTaXplX3AgKworCSAgICAgKFNCQ19CTE9DS19BTElHTk1FTlQgLSAxKSkgJiB+KFNCQ19CTE9DS19BTElHTk1FTlQgLSAxKTsKKwl1bEJ1ZmZlclRvdGFsU2l6ZSA9IHVsQnVmZmVyRGF0YVNpemUgKyBzaXplb2YodFNoYkNpckJ1ZmYpOworCisJLy8gYWxsb2NhdGUgYSBuZXcgb3Igb3BlbiBhbiBleGlzdGluZyBzaGFyZWQgYnVmZmVyCisJU2hiRXJyb3IgPSBTaGJJcGNBbGxvY0J1ZmZlcih1bEJ1ZmZlclRvdGFsU2l6ZSwgcHN6QnVmZmVySURfcCwKKwkJCQkgICAgICZwU2hiSW5zdGFuY2UsICZmU2hiTmV3Q3JlYXRlZCk7CisJaWYgKFNoYkVycm9yICE9IGtTaGJPaykgeworCQlnb3RvIEV4aXQ7CisJfQorCisJaWYgKHBTaGJJbnN0YW5jZSA9PSBOVUxMKSB7CisJCVNoYkVycm9yID0ga1NoYk91dE9mTWVtOworCQlnb3RvIEV4aXQ7CisJfQorCisJLy8gZ2V0IHBvaW50ZXIgdG8gc2hhcmVkIGJ1ZmZlcgorCXBTaGJDaXJCdWZmID0gKHRTaGJDaXJCdWZmICopIFNoYklwY0dldFNoTWVtUHRyKHBTaGJJbnN0YW5jZSk7CisKKwkvLyBpZiB0aGUgc2hhcmVkIGJ1ZmZlciB3YXMgbmV3IGNyZWF0ZWQsIHRoYW4gdGhpcyBwcm9jZXNzIGhhcworCS8vIHRvIGluaXRpYWxpemUgaXQsIG90aGVyd2lzZSB0aGUgYnVmZmVyIGlzIGFscmVhZHkgaW4gdXNlCisJLy8gYW5kICptdXN0IG5vdCogYmUgcmVzZXRlZAorCWlmIChmU2hiTmV3Q3JlYXRlZCkgeworI2lmbmRlZiBOREVCVUcKKwkJeworCQkJbWVtc2V0KHBTaGJDaXJCdWZmLCAweENDLCB1bEJ1ZmZlclRvdGFsU2l6ZSk7CisJCX0KKyNlbmRpZgorCisJCXBTaGJDaXJCdWZmLT5tX1NoYkNpck1hZ2ljSUQgPSBTQkNfTUFHSUNfSUQ7CisJCXBTaGJDaXJCdWZmLT5tX3VsQnVmZmVyVG90YWxTaXplID0gdWxCdWZmZXJUb3RhbFNpemU7CisJCXBTaGJDaXJCdWZmLT5tX3VsQnVmZmVyRGF0YVNpemUgPSB1bEJ1ZmZlckRhdGFTaXplOworCQlwU2hiQ2lyQnVmZi0+bV91bFdySW5kZXggPSAwOworCQlwU2hiQ2lyQnVmZi0+bV91bFJkSW5kZXggPSAwOworCQlwU2hiQ2lyQnVmZi0+bV91bE51bU9mV3JpdGVKb2JzID0gMDsKKwkJcFNoYkNpckJ1ZmYtPm1fdWxEYXRhSW5Vc2UgPSAwOworCQlwU2hiQ2lyQnVmZi0+bV91bERhdGFBcGVuZGVkID0gMDsKKwkJcFNoYkNpckJ1ZmYtPm1fdWxCbG9ja3NBcGVuZGVkID0gMDsKKwkJcFNoYkNpckJ1ZmYtPm1fdWxEYXRhUmVhZGFibGUgPSAwOworCQlwU2hiQ2lyQnVmZi0+bV91bEJsb2Nrc1JlYWRhYmxlID0gMDsKKwkJcFNoYkNpckJ1ZmYtPm1fcGZuU2lnSG5kbHJOZXdEYXRhID0gTlVMTDsKKwkJcFNoYkNpckJ1ZmYtPm1fZkJ1ZmZlckxvY2tlZCA9IEZBTFNFOworCQlwU2hiQ2lyQnVmZi0+bV9wZm5TaWdIbmRsclJlc2V0ID0gTlVMTDsKKwl9IGVsc2UgeworCQlpZiAocFNoYkNpckJ1ZmYtPm1fU2hiQ2lyTWFnaWNJRCAhPSBTQkNfTUFHSUNfSUQpIHsKKwkJCVNoYkVycm9yID0ga1NoYkludmFsaWRCdWZmZXJUeXBlOworCQkJZ290byBFeGl0OworCQl9CisJfQorCisgICAgICBFeGl0OgorCisJKnBwU2hiSW5zdGFuY2VfcCA9IHBTaGJJbnN0YW5jZTsKKwkqcGZTaGJOZXdDcmVhdGVkX3AgPSBmU2hiTmV3Q3JlYXRlZDsKKworCXJldHVybiAoU2hiRXJyb3IpOworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgUmVsZWFzZSBDaXJjdWxhciBTaGFyZWQgQnVmZmVyCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0U2hiRXJyb3IgU2hiQ2lyUmVsZWFzZUJ1ZmZlcih0U2hiSW5zdGFuY2UgcFNoYkluc3RhbmNlX3ApCit7CisKKwl0U2hiRXJyb3IgU2hiRXJyb3I7CisKKwkvLyBjaGVjayBhcmd1bWVudHMKKwlpZiAocFNoYkluc3RhbmNlX3AgPT0gTlVMTCkgeworCQlTaGJFcnJvciA9IGtTaGJPazsKKwkJZ290byBFeGl0OworCX0KKworCVNoYkVycm9yID0gU2hiSXBjUmVsZWFzZUJ1ZmZlcihwU2hiSW5zdGFuY2VfcCk7CisKKyAgICAgIEV4aXQ6CisKKwlyZXR1cm4gKFNoYkVycm9yKTsKKworfQorCisjZW5kaWYgLy8gIWRlZmluZWQoSU5MSU5FX0VOQUJMRUQpCisKKyNpZiAoIWRlZmluZWQoU0hBUkVEQlVGRl9JTkxJTkVEKSkgfHwgZGVmaW5lZChJTkxJTkVfRU5BQkxFRCkKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBSZXNldCBDaXJjdWxhciBTaGFyZWQgQnVmZmVyCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJTkxJTkVfRlVOQ1RJT04gdFNoYkVycm9yIFNoYkNpclJlc2V0QnVmZmVyKHRTaGJJbnN0YW5jZSBwU2hiSW5zdGFuY2VfcCwKKwkJCQkJICAgIHVuc2lnbmVkIGxvbmcgdWxUaW1lT3V0X3AsCisJCQkJCSAgICB0U2hiQ2lyU2lnSG5kbHJSZXNldAorCQkJCQkgICAgcGZuU2lnbmFsSGFuZGxlclJlc2V0X3ApCit7CisKKwl0U2hiQ2lyQnVmZiAqcFNoYkNpckJ1ZmY7CisJdW5zaWduZWQgbG9uZyB1bE51bU9mV3JpdGVKb2JzID0gMDsJLy8gZC5rLiBHQ0MgY29tcGxhaW5zIGFib3V0IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGUgb3RoZXJ3aXNlCisJdFNoYkVycm9yIFNoYkVycm9yOworCisJLy8gY2hlY2sgYXJndW1lbnRzCisJaWYgKHBTaGJJbnN0YW5jZV9wID09IE5VTEwpIHsKKwkJU2hiRXJyb3IgPSBrU2hiSW52YWxpZEFyZzsKKwkJZ290byBFeGl0OworCX0KKworCXBTaGJDaXJCdWZmID0gU2hiQ2lyR2V0QnVmZmVyKHBTaGJJbnN0YW5jZV9wKTsKKwlTaGJFcnJvciA9IGtTaGJPazsKKworCWlmIChwU2hiQ2lyQnVmZi0+bV9TaGJDaXJNYWdpY0lEICE9IFNCQ19NQUdJQ19JRCkgeworCQlTaGJFcnJvciA9IGtTaGJJbnZhbGlkQnVmZmVyVHlwZTsKKwkJZ290byBFeGl0OworCX0KKworCS8vIHN0YXJ0IHJlc2V0IGpvYiBieSBzZXR0aW5nIHJlcXVlc3QgcmVxdWVzdCBpbiBidWZmZXIgaGVhZGVyCisJU2hiSXBjRW50ZXJBdG9taWNTZWN0aW9uKHBTaGJJbnN0YW5jZV9wKTsKKwl7CisJCWlmICghcFNoYkNpckJ1ZmYtPm1fZkJ1ZmZlckxvY2tlZCkgeworCQkJdWxOdW1PZldyaXRlSm9icyA9IHBTaGJDaXJCdWZmLT5tX3VsTnVtT2ZXcml0ZUpvYnM7CisKKwkJCXBTaGJDaXJCdWZmLT5tX2ZCdWZmZXJMb2NrZWQgPSBUUlVFOworCQkJcFNoYkNpckJ1ZmYtPm1fcGZuU2lnSG5kbHJSZXNldCA9CisJCQkgICAgcGZuU2lnbmFsSGFuZGxlclJlc2V0X3A7CisJCX0gZWxzZSB7CisJCQlTaGJFcnJvciA9IGtTaGJBbHJlYWR5UmVzZXRpbmc7CisJCX0KKwl9CisJU2hiSXBjTGVhdmVBdG9taWNTZWN0aW9uKHBTaGJJbnN0YW5jZV9wKTsKKworCWlmIChTaGJFcnJvciAhPSBrU2hiT2spIHsKKwkJZ290byBFeGl0OworCX0KKworCS8vIGlmIHRoZXJlIGlzIGN1cnJlbnRseSBubyBydW5uaW5nIHdyaXRlIG9wZXJhdGlvbiB0aGVuIHJlc2V0IGJ1ZmZlcgorCS8vIGltbWVkaWF0ZWx5LCBvdGhlcndpc2Ugd2FpdCB1bnRpbCB0aGUgbGFzdCB3cml0ZSBqb2IgaXMgcmVhZHkgYnkKKwkvLyBzdGFydGluZyBhIHNpZ25hbCBwcm9jZXNzCisJaWYgKHVsTnVtT2ZXcml0ZUpvYnMgPT0gMCkgeworCQkvLyB0aGVyZSBpcyBjdXJyZW50bHkgbm8gcnVubmluZyB3cml0ZSBvcGVyYXRpb24KKwkJLy8gLT4gcmVzZXQgYnVmZmVyIGltbWVkaWF0ZWx5CisJCVNoYkNpclNpZ25hbEhhbmRsZXJSZXNldChwU2hiSW5zdGFuY2VfcCwgRkFMU0UpOworCQlTaGJFcnJvciA9IGtTaGJPazsKKwl9IGVsc2UgeworCQkvLyB0aGVyZSBpcyBjdXJyZW50bHkgYXQgbGVhc3Qgb25lIHJ1bm5pbmcgd3JpdGUgb3BlcmF0aW9uCisJCS8vIC0+IHN0YXJ0aW5nIHNpZ25hbCBwcm9jZXNzIHRvIHdhaXQgdW50aWwgdGhlIGxhc3Qgd3JpdGUgam9iIGlzIHJlYWR5CisJCVNoYkVycm9yID0KKwkJICAgIFNoYklwY1N0YXJ0U2lnbmFsaW5nSm9iUmVhZHkocFNoYkluc3RhbmNlX3AsIHVsVGltZU91dF9wLAorCQkJCQkJIFNoYkNpclNpZ25hbEhhbmRsZXJSZXNldCk7CisJfQorCisgICAgICBFeGl0OgorCisJcmV0dXJuIChTaGJFcnJvcik7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBXcml0ZSBkYXRhIGJsb2NrIHRvIENpcmN1bGFyIFNoYXJlZCBCdWZmZXIKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lOTElORV9GVU5DVElPTiB0U2hiRXJyb3IgU2hiQ2lyV3JpdGVEYXRhQmxvY2sodFNoYkluc3RhbmNlIHBTaGJJbnN0YW5jZV9wLAorCQkJCQkgICAgICAgY29uc3Qgdm9pZCAqcFNyY0RhdGFCbG9ja19wLAorCQkJCQkgICAgICAgdW5zaWduZWQgbG9uZyB1bERhdGFCbG9ja1NpemVfcCkKK3sKKworCXRTaGJDaXJCdWZmICpwU2hiQ2lyQnVmZjsKKwl0U2hiQ2lyQmxvY2tTaXplIFNoYkNpckJsb2NrU2l6ZTsKKwl1bnNpZ25lZCBpbnQgdWlGdWxsQmxvY2tTaXplOworCXVuc2lnbmVkIGludCB1aUFsaWduRmlsbEJ5dGVzOworCXVuc2lnbmVkIGNoYXIgKnBTaGJDaXJEYXRhUHRyOworCXVuc2lnbmVkIGNoYXIgKnBTY3JEYXRhUHRyOworCXVuc2lnbmVkIGxvbmcgdWxEYXRhU2l6ZTsKKwl1bnNpZ25lZCBsb25nIHVsQ2h1bmtTaXplOworCXVuc2lnbmVkIGxvbmcgdWxXckluZGV4ID0gMDsJLy8gZC5rLiBHQ0MgY29tcGxhaW5zIGFib3V0IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGUgb3RoZXJ3aXNlCisJdW5zaWduZWQgaW50IGZTaWduYWxOZXdEYXRhOworCXVuc2lnbmVkIGludCBmU2lnbmFsUmVzZXQ7CisJdFNoYkVycm9yIFNoYkVycm9yOworCXRTaGJFcnJvciBTaGJFcnJvcjI7CisJaW50IGZSZXM7CisKKwkvLyBjaGVjayBhcmd1bWVudHMKKwlpZiAocFNoYkluc3RhbmNlX3AgPT0gTlVMTCkgeworCQlTaGJFcnJvciA9IGtTaGJJbnZhbGlkQXJnOworCQlnb3RvIEV4aXQ7CisJfQorCisJaWYgKChwU3JjRGF0YUJsb2NrX3AgPT0gTlVMTCkgfHwgKHVsRGF0YUJsb2NrU2l6ZV9wID09IDApKSB7CisJCS8vIG5vdGhpbmcgdG8gZG8gaGVyZQorCQlTaGJFcnJvciA9IGtTaGJPazsKKwkJZ290byBFeGl0OworCX0KKworCWlmICh1bERhdGFCbG9ja1NpemVfcCA+IFNCQ19NQVhfQkxPQ0tfU0laRSkgeworCQlTaGJFcnJvciA9IGtTaGJFeGNlZWREYXRhU2l6ZUxpbWl0OworCQlnb3RvIEV4aXQ7CisJfQorCisJcFNoYkNpckJ1ZmYgPSBTaGJDaXJHZXRCdWZmZXIocFNoYkluc3RhbmNlX3ApOworCXBTY3JEYXRhUHRyID0gKHVuc2lnbmVkIGNoYXIgKilwU3JjRGF0YUJsb2NrX3A7CisJZlNpZ25hbE5ld0RhdGEgPSBGQUxTRTsKKwlmU2lnbmFsUmVzZXQgPSBGQUxTRTsKKwlTaGJFcnJvciA9IGtTaGJPazsKKworCWlmIChwU2hiQ2lyQnVmZi0+bV9TaGJDaXJNYWdpY0lEICE9IFNCQ19NQUdJQ19JRCkgeworCQlTaGJFcnJvciA9IGtTaGJJbnZhbGlkQnVmZmVyVHlwZTsKKwkJZ290byBFeGl0OworCX0KKworCS8vIGNhbGN1bGF0ZSBkYXRhIGJsb2NrIHNpemUgaW4gY2lyY3VsYXIgYnVmZmVyCisJdWxEYXRhU2l6ZSA9CisJICAgICh1bERhdGFCbG9ja1NpemVfcCArCisJICAgICAoU0JDX0JMT0NLX0FMSUdOTUVOVCAtIDEpKSAmIH4oU0JDX0JMT0NLX0FMSUdOTUVOVCAtIDEpOworCXVpRnVsbEJsb2NrU2l6ZSA9IHVsRGF0YVNpemUgKyBzaXplb2YodFNoYkNpckJsb2NrU2l6ZSk7CS8vIGRhdGEgc2l6ZSArIGhlYWRlcgorCXVpQWxpZ25GaWxsQnl0ZXMgPSB1bERhdGFTaXplIC0gdWxEYXRhQmxvY2tTaXplX3A7CisKKwlTaGJDaXJCbG9ja1NpemUubV91aUZ1bGxCbG9ja1NpemUgPSB1aUZ1bGxCbG9ja1NpemU7CisJU2hiQ2lyQmxvY2tTaXplLm1fdWlBbGlnbkZpbGxCeXRlcyA9IHVpQWxpZ25GaWxsQnl0ZXM7CisKKwkvLyByZXNlcnZlIHRoZSBuZWVkZWQgbWVtb3J5IGZvciB0aGUgd3JpdGUgb3BlcmF0aW9uIHRvIGRvIG5vdworCS8vIGFuZCBtYWtlIG5lY2Vzc2FyeSBhZGp1c3RtZW50cyBpbiB0aGUgY2lyY3VsYXIgYnVmZmVyIGhlYWRlcgorCVNoYklwY0VudGVyQXRvbWljU2VjdGlvbihwU2hiSW5zdGFuY2VfcCk7CisJeworCQkvLyBjaGVjayBpZiB0aGVyZSBpcyBzdWZmaWNpZW50IG1lbW9yeSBhdmFpbGFibGUgdG8gc3RvcmUKKwkJLy8gdGhlIG5ldyBkYXRhCisJCWZSZXMgPQorCQkgICAgdWlGdWxsQmxvY2tTaXplIDw9CisJCSAgICAocFNoYkNpckJ1ZmYtPm1fdWxCdWZmZXJEYXRhU2l6ZSAtCisJCSAgICAgcFNoYkNpckJ1ZmYtPm1fdWxEYXRhSW5Vc2UpOworCQlpZiAoZlJlcykgeworCQkJLy8gc2V0IHdyaXRlIHBvaW50ZXIgZm9yIHRoZSB3cml0ZSBvcGVyYXRpb24gdG8gZG8gbm93CisJCQkvLyB0byB0aGUgY3VycmVudCB3cml0ZSBwb2ludGVyIG9mIHRoZSBjaXJjdWxhciBidWZmZXIKKwkJCXVsV3JJbmRleCA9IHBTaGJDaXJCdWZmLT5tX3VsV3JJbmRleDsKKworCQkJLy8gcmVzZXJ2ZSB0aGUgbmVlZGVkIG1lbW9yeSBmb3IgdGhlIHdyaXRlIG9wZXJhdGlvbiB0byBkbyBub3cKKwkJCXBTaGJDaXJCdWZmLT5tX3VsRGF0YUluVXNlICs9IHVpRnVsbEJsb2NrU2l6ZTsKKworCQkJLy8gc2V0IG5ldyB3cml0ZSBwb2ludGVyIGJlaGluZCB0aGUgcmVzZXJ2ZWQgbWVtb3J5CisJCQkvLyBmb3IgdGhlIHdyaXRlIG9wZXJhdGlvbiB0byBkbyBub3cKKwkJCXBTaGJDaXJCdWZmLT5tX3VsV3JJbmRleCArPSB1aUZ1bGxCbG9ja1NpemU7CisJCQlwU2hiQ2lyQnVmZi0+bV91bFdySW5kZXggJT0KKwkJCSAgICBwU2hiQ2lyQnVmZi0+bV91bEJ1ZmZlckRhdGFTaXplOworCisJCQkvLyBpbmNyZW1lbnQgbnVtYmVyIG9mIGN1cnJlbnRseSAocGFyYWxsZWwgcnVubmluZykKKwkJCS8vIHdyaXRlIG9wZXJhdGlvbnMKKwkJCXBTaGJDaXJCdWZmLT5tX3VsTnVtT2ZXcml0ZUpvYnMrKzsKKwkJfQorCX0KKwlTaGJJcGNMZWF2ZUF0b21pY1NlY3Rpb24ocFNoYkluc3RhbmNlX3ApOworCisJaWYgKCFmUmVzKSB7CisJCVNoYkVycm9yID0ga1NoYkJ1ZmZlckZ1bGw7CisJCWdvdG8gRXhpdDsKKwl9CisKKwkvLyBjb3B5IHRoZSBkYXRhIHRvIHRoZSBjaXJjdWxhciBidWZmZXIKKwkvLyAodGhlIGNvcHkgcHJvY2VzcyBpdHNlbGYgd2lsbCBiZSBkb25lIG91dHNpZGUgb2YgYW55CisJLy8gY3JpdGljYWwvbG9ja2VkIHNlY3Rpb24pCisJcFNoYkNpckRhdGFQdHIgPSAmcFNoYkNpckJ1ZmYtPm1fRGF0YTsJLy8gcHRyIHRvIHN0YXJ0IG9mIGRhdGEgYXJlYQorCisJLy8gd3JpdGUgcmVhbCBzaXplIG9mIGN1cnJlbnQgYmxvY2sgKGluY2wuIGFsaWdubWVudCBmaWxsIGJ5dGVzKQorCSoodFNoYkNpckJsb2NrU2l6ZSAqKSAocFNoYkNpckRhdGFQdHIgKyB1bFdySW5kZXgpID0gU2hiQ2lyQmxvY2tTaXplOworCXVsV3JJbmRleCArPSBzaXplb2YodFNoYkNpckJsb2NrU2l6ZSk7CisJdWxXckluZGV4ICU9IHBTaGJDaXJCdWZmLT5tX3VsQnVmZmVyRGF0YVNpemU7CisKKwlpZiAodWxXckluZGV4ICsgdWxEYXRhQmxvY2tTaXplX3AgPD0gcFNoYkNpckJ1ZmYtPm1fdWxCdWZmZXJEYXRhU2l6ZSkgeworCQkvLyBsaW5lYXIgd3JpdGUgb3BlcmF0aW9uCisJCW1lbWNweShwU2hiQ2lyRGF0YVB0ciArIHVsV3JJbmRleCwgcFNjckRhdGFQdHIsCisJCSAgICAgICB1bERhdGFCbG9ja1NpemVfcCk7CisJfSBlbHNlIHsKKwkJLy8gd3JhcC1hcm91bmQgd3JpdGUgb3BlcmF0aW9uCisJCXVsQ2h1bmtTaXplID0gcFNoYkNpckJ1ZmYtPm1fdWxCdWZmZXJEYXRhU2l6ZSAtIHVsV3JJbmRleDsKKwkJbWVtY3B5KHBTaGJDaXJEYXRhUHRyICsgdWxXckluZGV4LCBwU2NyRGF0YVB0ciwgdWxDaHVua1NpemUpOworCQltZW1jcHkocFNoYkNpckRhdGFQdHIsIHBTY3JEYXRhUHRyICsgdWxDaHVua1NpemUsCisJCSAgICAgICB1bERhdGFCbG9ja1NpemVfcCAtIHVsQ2h1bmtTaXplKTsKKwl9CisKKwkvLyBhZGp1c3QgaGVhZGVyIGluZm9ybWF0aW9uIGZvciBjaXJjdWxhciBidWZmZXIgd2l0aCBwcm9wZXJ0aWVzCisJLy8gb2YgdGhlIHdpcml0dGVuIGRhdGEgYmxvY2sKKwlTaGJJcGNFbnRlckF0b21pY1NlY3Rpb24ocFNoYkluc3RhbmNlX3ApOworCXsKKwkJcFNoYkNpckJ1ZmYtPm1fdWxEYXRhQXBlbmRlZCArPSB1aUZ1bGxCbG9ja1NpemU7CisJCXBTaGJDaXJCdWZmLT5tX3VsQmxvY2tzQXBlbmRlZCsrOworCisJCS8vIGRlY3JlbWVudCBudW1iZXIgb2YgY3VycmVudGx5IChwYXJhbGxlbCBydW5uaW5nKSB3cml0ZSBvcGVyYXRpb25zCisJCWlmICghLS1wU2hiQ2lyQnVmZi0+bV91bE51bU9mV3JpdGVKb2JzKSB7CisJCQkvLyBpZiB0aGVyZSBpcyBubyBvdGhlciB3cml0ZSBwcm9jZXNzIHJ1bm5pbmcgdGhlbgorCQkJLy8gc2V0IG5ldyBzaXplIG9mIHJlYWRhYmxlIChjb21wbGV0ZSB3cml0dGVuKSBkYXRhIGFuZAorCQkJLy8gYWRqdXN0IG51bWJlciBvZiByZWFkYWJsZSBibG9ja3MKKwkJCXBTaGJDaXJCdWZmLT5tX3VsRGF0YVJlYWRhYmxlICs9CisJCQkgICAgcFNoYkNpckJ1ZmYtPm1fdWxEYXRhQXBlbmRlZDsKKwkJCXBTaGJDaXJCdWZmLT5tX3VsQmxvY2tzUmVhZGFibGUgKz0KKwkJCSAgICBwU2hiQ2lyQnVmZi0+bV91bEJsb2Nrc0FwZW5kZWQ7CisKKwkJCXBTaGJDaXJCdWZmLT5tX3VsRGF0YUFwZW5kZWQgPSAwOworCQkJcFNoYkNpckJ1ZmYtPm1fdWxCbG9ja3NBcGVuZGVkID0gMDsKKworCQkJZlNpZ25hbE5ld0RhdGEgPSBUUlVFOworCQkJZlNpZ25hbFJlc2V0ID0gcFNoYkNpckJ1ZmYtPm1fZkJ1ZmZlckxvY2tlZDsKKwkJfQorCX0KKwlTaGJJcGNMZWF2ZUF0b21pY1NlY3Rpb24ocFNoYkluc3RhbmNlX3ApOworCisJLy8gc2lnbmFsIG5ldyBkYXRhIGV2ZW50IHRvIGEgcG90ZW50aWFsbHkgcmVhZGluZyBhcHBsaWNhdGlvbgorCWlmIChmU2lnbmFsTmV3RGF0YSkgeworCQlTaGJFcnJvcjIgPSBTaGJJcGNTaWduYWxOZXdEYXRhKHBTaGJJbnN0YW5jZV9wKTsKKwkJaWYgKFNoYkVycm9yID09IGtTaGJPaykgeworCQkJU2hiRXJyb3IgPSBTaGJFcnJvcjI7CisJCX0KKwl9CisJLy8gc2lnbmFsIHRoYXQgdGhlIGxhc3Qgd3JpdGUgam9iIGhhcyBiZWVuIGZpbmlzaGVkIHRvIGFsbG93CisJLy8gYSB3YWl0aW5nIGFwcGxpY2F0aW9uIHRvIHJlc2V0IHRoZSBidWZmZXIgbm93CisJaWYgKGZTaWduYWxSZXNldCkgeworCQlTaGJFcnJvcjIgPSBTaGJJcGNTaWduYWxKb2JSZWFkeShwU2hiSW5zdGFuY2VfcCk7CisJCWlmIChTaGJFcnJvciA9PSBrU2hiT2spIHsKKwkJCVNoYkVycm9yID0gU2hiRXJyb3IyOworCQl9CisJfQorCisgICAgICBFeGl0OgorCisJcmV0dXJuIChTaGJFcnJvcik7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBBbGxvY2F0ZSBibG9jayB3aXRoaW4gdGhlIENpcmN1bGFyIFNoYXJlZCBCdWZmZXIgZm9yIGNodW5rIHdyaXRpbmcKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lOTElORV9GVU5DVElPTiB0U2hiRXJyb3IgU2hiQ2lyQWxsb2NEYXRhQmxvY2sodFNoYkluc3RhbmNlIHBTaGJJbnN0YW5jZV9wLAorCQkJCQkgICAgICAgdFNoYkNpckNodW5rICogcFNoYkNpckNodW5rX3AsCisJCQkJCSAgICAgICB1bnNpZ25lZCBsb25nIHVsRGF0YUJ1ZmZlclNpemVfcCkKK3sKKworCXRTaGJDaXJCdWZmICpwU2hiQ2lyQnVmZjsKKwl0U2hiQ2lyQmxvY2tTaXplIFNoYkNpckJsb2NrU2l6ZTsKKwl1bnNpZ25lZCBpbnQgdWlGdWxsQmxvY2tTaXplOworCXVuc2lnbmVkIGludCB1aUFsaWduRmlsbEJ5dGVzOworCXVuc2lnbmVkIGNoYXIgKnBTaGJDaXJEYXRhUHRyOworCXVuc2lnbmVkIGxvbmcgdWxEYXRhU2l6ZTsKKwl1bnNpZ25lZCBsb25nIHVsV3JJbmRleCA9IDA7CS8vIGQuay4gR0NDIGNvbXBsYWlucyBhYm91dCB1bmluaXRpYWxpemVkIHZhcmlhYmxlIG90aGVyd2lzZQorCXRTaGJFcnJvciBTaGJFcnJvcjsKKwlpbnQgZlJlczsKKworCS8vIGNoZWNrIGFyZ3VtZW50cworCWlmICgocFNoYkluc3RhbmNlX3AgPT0gTlVMTCkgfHwgKHBTaGJDaXJDaHVua19wID09IE5VTEwpKSB7CisJCVNoYkVycm9yID0ga1NoYkludmFsaWRBcmc7CisJCWdvdG8gRXhpdDsKKwl9CisKKwlpZiAodWxEYXRhQnVmZmVyU2l6ZV9wID09IDApIHsKKwkJU2hiRXJyb3IgPSBrU2hiSW52YWxpZEFyZzsKKwkJZ290byBFeGl0OworCX0KKworCWlmICh1bERhdGFCdWZmZXJTaXplX3AgPiBTQkNfTUFYX0JMT0NLX1NJWkUpIHsKKwkJU2hiRXJyb3IgPSBrU2hiRXhjZWVkRGF0YVNpemVMaW1pdDsKKwkJZ290byBFeGl0OworCX0KKworCXBTaGJDaXJCdWZmID0gU2hiQ2lyR2V0QnVmZmVyKHBTaGJJbnN0YW5jZV9wKTsKKwlTaGJFcnJvciA9IGtTaGJPazsKKworCWlmIChwU2hiQ2lyQnVmZi0+bV9TaGJDaXJNYWdpY0lEICE9IFNCQ19NQUdJQ19JRCkgeworCQlTaGJFcnJvciA9IGtTaGJJbnZhbGlkQnVmZmVyVHlwZTsKKwkJZ290byBFeGl0OworCX0KKworCS8vIGNhbGN1bGF0ZSBkYXRhIGJsb2NrIHNpemUgaW4gY2lyY3VsYXIgYnVmZmVyCisJdWxEYXRhU2l6ZSA9CisJICAgICh1bERhdGFCdWZmZXJTaXplX3AgKworCSAgICAgKFNCQ19CTE9DS19BTElHTk1FTlQgLSAxKSkgJiB+KFNCQ19CTE9DS19BTElHTk1FTlQgLSAxKTsKKwl1aUZ1bGxCbG9ja1NpemUgPSB1bERhdGFTaXplICsgc2l6ZW9mKHRTaGJDaXJCbG9ja1NpemUpOwkvLyBkYXRhIHNpemUgKyBoZWFkZXIKKwl1aUFsaWduRmlsbEJ5dGVzID0gdWxEYXRhU2l6ZSAtIHVsRGF0YUJ1ZmZlclNpemVfcDsKKworCVNoYkNpckJsb2NrU2l6ZS5tX3VpRnVsbEJsb2NrU2l6ZSA9IHVpRnVsbEJsb2NrU2l6ZTsKKwlTaGJDaXJCbG9ja1NpemUubV91aUFsaWduRmlsbEJ5dGVzID0gdWlBbGlnbkZpbGxCeXRlczsKKworCS8vIHJlc2VydmUgdGhlIG5lZWRlZCBtZW1vcnkgZm9yIHRoZSB3cml0ZSBvcGVyYXRpb24gdG8gZG8gbm93CisJLy8gYW5kIG1ha2UgbmVjZXNzYXJ5IGFkanVzdG1lbnRzIGluIHRoZSBjaXJjdWxhciBidWZmZXIgaGVhZGVyCisJU2hiSXBjRW50ZXJBdG9taWNTZWN0aW9uKHBTaGJJbnN0YW5jZV9wKTsKKwl7CisJCS8vIGNoZWNrIGlmIHRoZXJlIGlzIHN1ZmZpY2llbnQgbWVtb3J5IGF2YWlsYWJsZSB0byBzdG9yZQorCQkvLyB0aGUgbmV3IGRhdGEKKwkJZlJlcyA9CisJCSAgICAodWlGdWxsQmxvY2tTaXplIDw9CisJCSAgICAgKHBTaGJDaXJCdWZmLT5tX3VsQnVmZmVyRGF0YVNpemUgLQorCQkgICAgICBwU2hiQ2lyQnVmZi0+bV91bERhdGFJblVzZSkpOworCQlpZiAoZlJlcykgeworCQkJLy8gc2V0IHdyaXRlIHBvaW50ZXIgZm9yIHRoZSB3cml0ZSBvcGVyYXRpb24gdG8gZG8gbm93CisJCQkvLyB0byB0aGUgY3VycmVudCB3cml0ZSBwb2ludGVyIG9mIHRoZSBjaXJjdWxhciBidWZmZXIKKwkJCXVsV3JJbmRleCA9IHBTaGJDaXJCdWZmLT5tX3VsV3JJbmRleDsKKworCQkJLy8gcmVzZXJ2ZSB0aGUgbmVlZGVkIG1lbW9yeSBmb3IgdGhlIHdyaXRlIG9wZXJhdGlvbiB0byBkbyBub3cKKwkJCXBTaGJDaXJCdWZmLT5tX3VsRGF0YUluVXNlICs9IHVpRnVsbEJsb2NrU2l6ZTsKKworCQkJLy8gc2V0IG5ldyB3cml0ZSBwb2ludGVyIGJlaGluZCB0aGUgcmVzZXJ2ZWQgbWVtb3J5CisJCQkvLyBmb3IgdGhlIHdyaXRlIG9wZXJhdGlvbiB0byBkbyBub3cKKwkJCXBTaGJDaXJCdWZmLT5tX3VsV3JJbmRleCArPSB1aUZ1bGxCbG9ja1NpemU7CisJCQlwU2hiQ2lyQnVmZi0+bV91bFdySW5kZXggJT0KKwkJCSAgICBwU2hiQ2lyQnVmZi0+bV91bEJ1ZmZlckRhdGFTaXplOworCisJCQkvLyBpbmNyZW1lbnQgbnVtYmVyIG9mIGN1cnJlbnRseSAocGFyYWxsZWwgcnVubmluZykKKwkJCS8vIHdyaXRlIG9wZXJhdGlvbnMKKwkJCXBTaGJDaXJCdWZmLT5tX3VsTnVtT2ZXcml0ZUpvYnMrKzsKKwkJfQorCX0KKwlTaGJJcGNMZWF2ZUF0b21pY1NlY3Rpb24ocFNoYkluc3RhbmNlX3ApOworCisJaWYgKCFmUmVzKSB7CisJCVNoYkVycm9yID0ga1NoYkJ1ZmZlckZ1bGw7CisJCWdvdG8gRXhpdDsKKwl9CisKKwkvLyBzZXR1cCBoZWFkZXIgaW5mb3JtYXRpb24gZm9yIGFsbG9jYXRlZCBidWZmZXIKKwlwU2hiQ2lyRGF0YVB0ciA9ICZwU2hiQ2lyQnVmZi0+bV9EYXRhOwkvLyBwdHIgdG8gc3RhcnQgb2YgZGF0YSBhcmVhCisKKwkvLyB3cml0ZSByZWFsIHNpemUgb2YgY3VycmVudCBibG9jayAoaW5jbC4gYWxpZ25tZW50IGZpbGwgYnl0ZXMpCisJKih0U2hiQ2lyQmxvY2tTaXplICopIChwU2hiQ2lyRGF0YVB0ciArIHVsV3JJbmRleCkgPSBTaGJDaXJCbG9ja1NpemU7CisJdWxXckluZGV4ICs9IHNpemVvZih0U2hiQ2lyQmxvY2tTaXplKTsKKwl1bFdySW5kZXggJT0gcFNoYkNpckJ1ZmYtPm1fdWxCdWZmZXJEYXRhU2l6ZTsKKworCS8vIHNldHVwIGNodW5rIGRlc2NyaXB0b3IKKwlwU2hiQ2lyQ2h1bmtfcC0+bV91aUZ1bGxCbG9ja1NpemUgPSB1aUZ1bGxCbG9ja1NpemU7CisJcFNoYkNpckNodW5rX3AtPm1fdWxBdmFpbGFibGVTaXplID0gdWxEYXRhQnVmZmVyU2l6ZV9wOworCXBTaGJDaXJDaHVua19wLT5tX3VsV3JJbmRleCA9IHVsV3JJbmRleDsKKwlwU2hiQ2lyQ2h1bmtfcC0+bV9mQnVmZmVyQ29tcGxldGVkID0gRkFMU0U7CisKKyAgICAgIEV4aXQ6CisKKwlyZXR1cm4gKFNoYkVycm9yKTsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIFdyaXRlIGRhdGEgY2h1bmsgaW50byBhbiBhbGxvY2F0ZWQgYnVmZmVyIG9mIHRoZSBDaXJjdWxhciBTaGFyZWQgQnVmZmVyCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJTkxJTkVfRlVOQ1RJT04gdFNoYkVycm9yIFNoYkNpcldyaXRlRGF0YUNodW5rKHRTaGJJbnN0YW5jZSBwU2hiSW5zdGFuY2VfcCwKKwkJCQkJICAgICAgIHRTaGJDaXJDaHVuayAqIHBTaGJDaXJDaHVua19wLAorCQkJCQkgICAgICAgY29uc3Qgdm9pZCAqcFNyY0RhdGFDaHVua19wLAorCQkJCQkgICAgICAgdW5zaWduZWQgbG9uZyB1bERhdGFDaHVua1NpemVfcCwKKwkJCQkJICAgICAgIHVuc2lnbmVkIGludAorCQkJCQkgICAgICAgKnBmQnVmZmVyQ29tcGxldGVkX3ApCit7CisKKwl0U2hiQ2lyQnVmZiAqcFNoYkNpckJ1ZmY7CisJdW5zaWduZWQgY2hhciAqcFNoYkNpckRhdGFQdHI7CisJdW5zaWduZWQgY2hhciAqcFNjckRhdGFQdHI7CisJdW5zaWduZWQgbG9uZyB1bFN1YkNodW5rU2l6ZTsKKwl1bnNpZ25lZCBsb25nIHVsV3JJbmRleDsKKwl1bnNpZ25lZCBpbnQgZkJ1ZmZlckNvbXBsZXRlZDsKKwl1bnNpZ25lZCBpbnQgZlNpZ25hbE5ld0RhdGE7CisJdW5zaWduZWQgaW50IGZTaWduYWxSZXNldDsKKwl0U2hiRXJyb3IgU2hiRXJyb3I7CisJdFNoYkVycm9yIFNoYkVycm9yMjsKKworCS8vIGNoZWNrIGFyZ3VtZW50cworCWlmICgocFNoYkluc3RhbmNlX3AgPT0gTlVMTCkgfHwgKHBTaGJDaXJDaHVua19wID09IE5VTEwpCisJICAgIHx8IChwZkJ1ZmZlckNvbXBsZXRlZF9wID09IE5VTEwpKSB7CisJCVNoYkVycm9yID0ga1NoYkludmFsaWRBcmc7CisJCWdvdG8gRXhpdDsKKwl9CisKKwlpZiAoKHBTcmNEYXRhQ2h1bmtfcCA9PSBOVUxMKSB8fCAodWxEYXRhQ2h1bmtTaXplX3AgPT0gMCkpIHsKKwkJLy8gbm90aGluZyB0byBkbyBoZXJlCisJCVNoYkVycm9yID0ga1NoYk9rOworCQlnb3RvIEV4aXQ7CisJfQorCisJaWYgKHBTaGJDaXJDaHVua19wLT5tX2ZCdWZmZXJDb21wbGV0ZWQpIHsKKwkJU2hiRXJyb3IgPSBrU2hiQnVmZmVyQWxyZWFkeUNvbXBsZXRlZDsKKwkJZ290byBFeGl0OworCX0KKworCWlmICh1bERhdGFDaHVua1NpemVfcCA+IHBTaGJDaXJDaHVua19wLT5tX3VsQXZhaWxhYmxlU2l6ZSkgeworCQlTaGJFcnJvciA9IGtTaGJFeGNlZWREYXRhU2l6ZUxpbWl0OworCQlnb3RvIEV4aXQ7CisJfQorCisJcFNoYkNpckJ1ZmYgPSBTaGJDaXJHZXRCdWZmZXIocFNoYkluc3RhbmNlX3ApOworCXBTY3JEYXRhUHRyID0gKHVuc2lnbmVkIGNoYXIgKilwU3JjRGF0YUNodW5rX3A7CisJZlNpZ25hbE5ld0RhdGEgPSBGQUxTRTsKKwlmU2lnbmFsUmVzZXQgPSBGQUxTRTsKKwlTaGJFcnJvciA9IGtTaGJPazsKKworCWlmIChwU2hiQ2lyQnVmZi0+bV9TaGJDaXJNYWdpY0lEICE9IFNCQ19NQUdJQ19JRCkgeworCQlTaGJFcnJvciA9IGtTaGJJbnZhbGlkQnVmZmVyVHlwZTsKKwkJZ290byBFeGl0OworCX0KKworCXVsV3JJbmRleCA9IHBTaGJDaXJDaHVua19wLT5tX3VsV3JJbmRleDsKKworCS8vIGNvcHkgdGhlIGRhdGEgdG8gdGhlIGNpcmN1bGFyIGJ1ZmZlcgorCS8vICh0aGUgY29weSBwcm9jZXNzIGl0c2VsZiB3aWxsIGJlIGRvbmUgb3V0c2lkZSBvZiBhbnkKKwkvLyBjcml0aWNhbC9sb2NrZWQgc2VjdGlvbikKKwlwU2hiQ2lyRGF0YVB0ciA9ICZwU2hiQ2lyQnVmZi0+bV9EYXRhOwkvLyBwdHIgdG8gc3RhcnQgb2YgZGF0YSBhcmVhCisKKwlpZiAodWxXckluZGV4ICsgdWxEYXRhQ2h1bmtTaXplX3AgPD0gcFNoYkNpckJ1ZmYtPm1fdWxCdWZmZXJEYXRhU2l6ZSkgeworCQkvLyBsaW5lYXIgd3JpdGUgb3BlcmF0aW9uCisJCW1lbWNweShwU2hiQ2lyRGF0YVB0ciArIHVsV3JJbmRleCwgcFNjckRhdGFQdHIsCisJCSAgICAgICB1bERhdGFDaHVua1NpemVfcCk7CisJfSBlbHNlIHsKKwkJLy8gd3JhcC1hcm91bmQgd3JpdGUgb3BlcmF0aW9uCisJCXVsU3ViQ2h1bmtTaXplID0gcFNoYkNpckJ1ZmYtPm1fdWxCdWZmZXJEYXRhU2l6ZSAtIHVsV3JJbmRleDsKKwkJbWVtY3B5KHBTaGJDaXJEYXRhUHRyICsgdWxXckluZGV4LCBwU2NyRGF0YVB0ciwgdWxTdWJDaHVua1NpemUpOworCQltZW1jcHkocFNoYkNpckRhdGFQdHIsIHBTY3JEYXRhUHRyICsgdWxTdWJDaHVua1NpemUsCisJCSAgICAgICB1bERhdGFDaHVua1NpemVfcCAtIHVsU3ViQ2h1bmtTaXplKTsKKwl9CisKKwkvLyBhZGp1c3QgY2h1bmsgZGVzY3JpcHRvcgorCXVsV3JJbmRleCArPSB1bERhdGFDaHVua1NpemVfcDsKKwl1bFdySW5kZXggJT0gcFNoYkNpckJ1ZmYtPm1fdWxCdWZmZXJEYXRhU2l6ZTsKKworCXBTaGJDaXJDaHVua19wLT5tX3VsQXZhaWxhYmxlU2l6ZSAtPSB1bERhdGFDaHVua1NpemVfcDsKKwlwU2hiQ2lyQ2h1bmtfcC0+bV91bFdySW5kZXggPSB1bFdySW5kZXg7CisKKwlmQnVmZmVyQ29tcGxldGVkID0gKHBTaGJDaXJDaHVua19wLT5tX3VsQXZhaWxhYmxlU2l6ZSA9PSAwKTsKKwlwU2hiQ2lyQ2h1bmtfcC0+bV9mQnVmZmVyQ29tcGxldGVkID0gZkJ1ZmZlckNvbXBsZXRlZDsKKworCS8vIGlmIHRoZSBjb21wbGV0ZSBhbGxvY2F0ZWQgYnVmZmVyIGlzIGZpbGxlZCB3aXRoIGRhdGEgdGhlbgorCS8vIGFkanVzdCBoZWFkZXIgaW5mb3JtYXRpb24gZm9yIGNpcmN1bGFyIGJ1ZmZlciB3aXRoIHByb3BlcnRpZXMKKwkvLyBvZiB0aGUgd2lyaXR0ZW4gZGF0YSBibG9jaworCWlmIChmQnVmZmVyQ29tcGxldGVkKSB7CisJCVNoYklwY0VudGVyQXRvbWljU2VjdGlvbihwU2hiSW5zdGFuY2VfcCk7CisJCXsKKwkJCXBTaGJDaXJCdWZmLT5tX3VsRGF0YUFwZW5kZWQgKz0KKwkJCSAgICBwU2hiQ2lyQ2h1bmtfcC0+bV91aUZ1bGxCbG9ja1NpemU7CisJCQlwU2hiQ2lyQnVmZi0+bV91bEJsb2Nrc0FwZW5kZWQrKzsKKworCQkJLy8gZGVjcmVtZW50IG51bWJlciBvZiBjdXJyZW50bHkgKHBhcmFsbGVsIHJ1bm5pbmcpIHdyaXRlIG9wZXJhdGlvbnMKKwkJCWlmICghLS1wU2hiQ2lyQnVmZi0+bV91bE51bU9mV3JpdGVKb2JzKSB7CisJCQkJLy8gaWYgdGhlcmUgaXMgbm8gb3RoZXIgd3JpdGUgcHJvY2VzcyBydW5uaW5nIHRoZW4KKwkJCQkvLyBzZXQgbmV3IHNpemUgb2YgcmVhZGFibGUgKGNvbXBsZXRlIHdyaXR0ZW4pIGRhdGEgYW5kCisJCQkJLy8gYWRqdXN0IG51bWJlciBvZiByZWFkYWJsZSBibG9ja3MKKwkJCQlwU2hiQ2lyQnVmZi0+bV91bERhdGFSZWFkYWJsZSArPQorCQkJCSAgICBwU2hiQ2lyQnVmZi0+bV91bERhdGFBcGVuZGVkOworCQkJCXBTaGJDaXJCdWZmLT5tX3VsQmxvY2tzUmVhZGFibGUgKz0KKwkJCQkgICAgcFNoYkNpckJ1ZmYtPm1fdWxCbG9ja3NBcGVuZGVkOworCisJCQkJcFNoYkNpckJ1ZmYtPm1fdWxEYXRhQXBlbmRlZCA9IDA7CisJCQkJcFNoYkNpckJ1ZmYtPm1fdWxCbG9ja3NBcGVuZGVkID0gMDsKKworCQkJCWZTaWduYWxOZXdEYXRhID0gVFJVRTsKKwkJCQlmU2lnbmFsUmVzZXQgPSBwU2hiQ2lyQnVmZi0+bV9mQnVmZmVyTG9ja2VkOworCQkJfQorCQl9CisJCVNoYklwY0xlYXZlQXRvbWljU2VjdGlvbihwU2hiSW5zdGFuY2VfcCk7CisJfQorCisJLy8gc2lnbmFsIG5ldyBkYXRhIGV2ZW50IHRvIGEgcG90ZW50aWFsbHkgcmVhZGluZyBhcHBsaWNhdGlvbgorCWlmIChmU2lnbmFsTmV3RGF0YSkgeworCQlTaGJFcnJvcjIgPSBTaGJJcGNTaWduYWxOZXdEYXRhKHBTaGJJbnN0YW5jZV9wKTsKKwkJaWYgKFNoYkVycm9yID09IGtTaGJPaykgeworCQkJU2hiRXJyb3IgPSBTaGJFcnJvcjI7CisJCX0KKwl9CisJLy8gc2lnbmFsIHRoYXQgdGhlIGxhc3Qgd3JpdGUgam9iIGhhcyBiZWVuIGZpbmlzaGVkIHRvIGFsbG93CisJLy8gYSB3YWl0aW5nIGFwcGxpY2F0aW9uIHRvIHJlc2V0IHRoZSBidWZmZXIgbm93CisJaWYgKGZTaWduYWxSZXNldCkgeworCQlTaGJFcnJvcjIgPSBTaGJJcGNTaWduYWxKb2JSZWFkeShwU2hiSW5zdGFuY2VfcCk7CisJCWlmIChTaGJFcnJvciA9PSBrU2hiT2spIHsKKwkJCVNoYkVycm9yID0gU2hiRXJyb3IyOworCQl9CisJfQorCisJKnBmQnVmZmVyQ29tcGxldGVkX3AgPSBmQnVmZmVyQ29tcGxldGVkOworCisgICAgICBFeGl0OgorCisJcmV0dXJuIChTaGJFcnJvcik7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBSZWFkIGRhdGEgYmxvY2sgZnJvbSBDaXJjdWxhciBTaGFyZWQgQnVmZmVyCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJTkxJTkVfRlVOQ1RJT04gdFNoYkVycm9yIFNoYkNpclJlYWREYXRhQmxvY2sodFNoYkluc3RhbmNlIHBTaGJJbnN0YW5jZV9wLAorCQkJCQkgICAgICB2b2lkICpwRHN0RGF0YUJsb2NrX3AsCisJCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgdWxSZEJ1ZmZTaXplX3AsCisJCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgKnB1bERhdGFCbG9ja1NpemVfcCkKK3sKKworCXRTaGJDaXJCdWZmICpwU2hiQ2lyQnVmZjsKKwl0U2hiQ2lyQmxvY2tTaXplIFNoYkNpckJsb2NrU2l6ZTsKKwl1bnNpZ25lZCBsb25nIHVsRGF0YVJlYWRhYmxlOworCXVuc2lnbmVkIGNoYXIgKnBTaGJDaXJEYXRhUHRyOworCXVuc2lnbmVkIGNoYXIgKnBEc3REYXRhUHRyOworCXVuc2lnbmVkIGxvbmcgdWxEYXRhU2l6ZSA9IDA7CS8vIGQuay4gR0NDIGNvbXBsYWlucyBhYm91dCB1bmluaXRpYWxpemVkIHZhcmlhYmxlIG90aGVyd2lzZQorCXVuc2lnbmVkIGxvbmcgdWxDaHVua1NpemU7CisJdW5zaWduZWQgbG9uZyB1bFJkSW5kZXg7CisJdFNoYkVycm9yIFNoYkVycm9yOworCisJLy8gY2hlY2sgYXJndW1lbnRzCisJaWYgKChwU2hiSW5zdGFuY2VfcCA9PSBOVUxMKSB8fCAocHVsRGF0YUJsb2NrU2l6ZV9wID09IE5VTEwpKSB7CisJCXJldHVybiAoa1NoYkludmFsaWRBcmcpOworCX0KKworCWlmICgocERzdERhdGFCbG9ja19wID09IE5VTEwpIHx8ICh1bFJkQnVmZlNpemVfcCA9PSAwKSkgeworCQkvLyBub3RoaW5nIHRvIGRvIGhlcmUKKwkJU2hiRXJyb3IgPSBrU2hiT2s7CisJCWdvdG8gRXhpdDsKKwl9CisKKwlTaGJFcnJvciA9IGtTaGJPazsKKwlwU2hiQ2lyQnVmZiA9IFNoYkNpckdldEJ1ZmZlcihwU2hiSW5zdGFuY2VfcCk7CisJcERzdERhdGFQdHIgPSAodW5zaWduZWQgY2hhciAqKXBEc3REYXRhQmxvY2tfcDsKKwl1bERhdGFTaXplID0gMDsKKworCWlmIChwU2hiQ2lyQnVmZi0+bV9TaGJDaXJNYWdpY0lEICE9IFNCQ19NQUdJQ19JRCkgeworCQlTaGJFcnJvciA9IGtTaGJJbnZhbGlkQnVmZmVyVHlwZTsKKwkJZ290byBFeGl0OworCX0KKworCS8vIGdldCB0b3RhbCBudW1iZXIgb2YgcmVhZGFibGUgYnl0ZXMgZm9yIHRoZSB3aG9sZSBjaXJjdWxhciBidWZmZXIKKwlTaGJJcGNFbnRlckF0b21pY1NlY3Rpb24ocFNoYkluc3RhbmNlX3ApOworCXsKKwkJdWxEYXRhUmVhZGFibGUgPSBwU2hiQ2lyQnVmZi0+bV91bERhdGFSZWFkYWJsZTsKKwl9CisJU2hiSXBjTGVhdmVBdG9taWNTZWN0aW9uKHBTaGJJbnN0YW5jZV9wKTsKKworCS8vIGlmIHRoZXJlIGFyZSByZWFkYWJsZSBkYXRhIGF2YWlsYWJsZSwgdGhlbiB0aGVyZSBtdXN0IGJlIGF0IGxlYXN0CisJLy8gb25lIGNvbXBsZXRlIHJlYWRhYmxlIGRhdGEgYmxvY2sKKwlpZiAodWxEYXRhUmVhZGFibGUgPiAwKSB7CisJCS8vIGdldCBwb2ludGVyIHRvIHN0YXJ0IG9mIGRhdGEgYXJlYSBhbmQgY3VycmVudCByZWFkIGluZGV4CisJCXBTaGJDaXJEYXRhUHRyID0gJnBTaGJDaXJCdWZmLT5tX0RhdGE7CS8vIHB0ciB0byBzdGFydCBvZiBkYXRhIGFyZWEKKwkJdWxSZEluZGV4ID0gcFNoYkNpckJ1ZmYtPm1fdWxSZEluZGV4OworCisJCS8vIGdldCByZWFsIHNpemUgb2YgY3VycmVudCBibG9jayAoaW5jbC4gYWxpZ25tZW50IGZpbGwgYnl0ZXMpCisJCVNoYkNpckJsb2NrU2l6ZSA9CisJCSAgICAqKHRTaGJDaXJCbG9ja1NpemUgKikgKHBTaGJDaXJEYXRhUHRyICsgdWxSZEluZGV4KTsKKwkJdWxSZEluZGV4ICs9IHNpemVvZih0U2hiQ2lyQmxvY2tTaXplKTsKKwkJdWxSZEluZGV4ICU9IHBTaGJDaXJCdWZmLT5tX3VsQnVmZmVyRGF0YVNpemU7CisKKwkJLy8gZ2V0IHNpemUgb2YgdXNlciBkYXRhIGluc2lkZSB0aGUgY3VycmVudCBibG9jaworCQl1bERhdGFTaXplID0KKwkJICAgIFNoYkNpckJsb2NrU2l6ZS5tX3VpRnVsbEJsb2NrU2l6ZSAtCisJCSAgICBTaGJDaXJCbG9ja1NpemUubV91aUFsaWduRmlsbEJ5dGVzOworCQl1bERhdGFTaXplIC09IHNpemVvZih0U2hiQ2lyQmxvY2tTaXplKTsKKwl9CisKKwkvLyB1bERhdGFTaXplID0gTUlOKHVsRGF0YVNpemUsIHVsUmRCdWZmU2l6ZV9wKTsKKwlpZiAodWxEYXRhU2l6ZSA+IHVsUmRCdWZmU2l6ZV9wKSB7CisJCXVsRGF0YVNpemUgPSB1bFJkQnVmZlNpemVfcDsKKwkJU2hiRXJyb3IgPSBrU2hiRGF0YVRydW5jYXRlZDsKKwl9CisKKwlpZiAodWxEYXRhU2l6ZSA9PSAwKSB7CisJCS8vIG5vdGhpbmcgdG8gZG8gaGVyZQorCQlTaGJFcnJvciA9IGtTaGJOb1JlYWRhYmxlRGF0YTsKKwkJZ290byBFeGl0OworCX0KKworCS8vIGNvcHkgdGhlIGRhdGEgZnJvbSB0aGUgY2lyY3VsYXIgYnVmZmVyCisJLy8gKHRoZSBjb3B5IHByb2Nlc3MgaXRzZWxmIHdpbGwgYmUgZG9uZSBvdXRzaWRlIG9mIGFueQorCS8vIGNyaXRpY2FsL2xvY2tlZCBzZWN0aW9uKQorCWlmICh1bFJkSW5kZXggKyB1bERhdGFTaXplIDw9IHBTaGJDaXJCdWZmLT5tX3VsQnVmZmVyRGF0YVNpemUpIHsKKwkJLy8gbGluZWFyIHJlYWQgb3BlcmF0aW9uCisJCW1lbWNweShwRHN0RGF0YVB0ciwgcFNoYkNpckRhdGFQdHIgKyB1bFJkSW5kZXgsIHVsRGF0YVNpemUpOworCX0gZWxzZSB7CisJCS8vIHdyYXAtYXJvdW5kIHJlYWQgb3BlcmF0aW9uCisJCXVsQ2h1bmtTaXplID0gcFNoYkNpckJ1ZmYtPm1fdWxCdWZmZXJEYXRhU2l6ZSAtIHVsUmRJbmRleDsKKwkJbWVtY3B5KHBEc3REYXRhUHRyLCBwU2hiQ2lyRGF0YVB0ciArIHVsUmRJbmRleCwgdWxDaHVua1NpemUpOworCQltZW1jcHkocERzdERhdGFQdHIgKyB1bENodW5rU2l6ZSwgcFNoYkNpckRhdGFQdHIsCisJCSAgICAgICB1bERhdGFTaXplIC0gdWxDaHVua1NpemUpOworCX0KKworI2lmbmRlZiBOREVCVUcKKwl7CisJCXRTaGJDaXJCbG9ja1NpemUgQ2xyU2hiQ2lyQmxvY2tTaXplOworCisJCWlmICh1bFJkSW5kZXggKyB1bERhdGFTaXplIDw9IHBTaGJDaXJCdWZmLT5tX3VsQnVmZmVyRGF0YVNpemUpIHsKKwkJCS8vIGxpbmVhciBidWZmZXIKKwkJCW1lbXNldChwU2hiQ2lyRGF0YVB0ciArIHVsUmRJbmRleCwgMHhERCwgdWxEYXRhU2l6ZSk7CisJCX0gZWxzZSB7CisJCQkvLyB3cmFwLWFyb3VuZCByZWFkIG9wZXJhdGlvbgorCQkJdWxDaHVua1NpemUgPQorCQkJICAgIHBTaGJDaXJCdWZmLT5tX3VsQnVmZmVyRGF0YVNpemUgLSB1bFJkSW5kZXg7CisJCQltZW1zZXQocFNoYkNpckRhdGFQdHIgKyB1bFJkSW5kZXgsIDB4REQsIHVsQ2h1bmtTaXplKTsKKwkJCW1lbXNldChwU2hiQ2lyRGF0YVB0ciwgMHhERCwgdWxEYXRhU2l6ZSAtIHVsQ2h1bmtTaXplKTsKKwkJfQorCisJCUNsclNoYkNpckJsb2NrU2l6ZS5tX3VpRnVsbEJsb2NrU2l6ZSA9IC8qKHVuc2lnbmVkIGludCkgKi8gLTE7CS8vIC0xID0geEZGRkZGRkYKKwkJQ2xyU2hiQ2lyQmxvY2tTaXplLm1fdWlBbGlnbkZpbGxCeXRlcyA9IC8qKHVuc2lnbmVkIGludCkgKi8gLTE7CS8vIC0xID0gRnh4eHh4eHgKKwkJKih0U2hiQ2lyQmxvY2tTaXplICopIChwU2hiQ2lyRGF0YVB0ciArCisJCQkJICAgICAgIHBTaGJDaXJCdWZmLT5tX3VsUmRJbmRleCkgPQorCQkgICAgQ2xyU2hiQ2lyQmxvY2tTaXplOworCX0KKyNlbmRpZiAvLyAjaWZuZGVmIE5ERUJVRworCisJLy8gc2V0IG5ldyBzaXplIG9mIHJlYWRhYmxlIGRhdGEsIGRhdGEgaW4gdXNlLCBuZXcgcmVhZCBpbmRleAorCS8vIGFuZCBhZGp1c3QgbnVtYmVyIG9mIHJlYWRhYmxlIGJsb2NrcworCVNoYklwY0VudGVyQXRvbWljU2VjdGlvbihwU2hiSW5zdGFuY2VfcCk7CisJeworCQlwU2hiQ2lyQnVmZi0+bV91bERhdGFJblVzZSAtPSBTaGJDaXJCbG9ja1NpemUubV91aUZ1bGxCbG9ja1NpemU7CisJCXBTaGJDaXJCdWZmLT5tX3VsRGF0YVJlYWRhYmxlIC09CisJCSAgICBTaGJDaXJCbG9ja1NpemUubV91aUZ1bGxCbG9ja1NpemU7CisJCXBTaGJDaXJCdWZmLT5tX3VsQmxvY2tzUmVhZGFibGUtLTsKKworCQkvLyQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJAorCQlpZiAoKHBTaGJDaXJCdWZmLT5tX3VsRGF0YUluVXNlID09IDApCisJCSAgICAmJiAocFNoYkNpckJ1ZmYtPm1fdWxEYXRhUmVhZGFibGUgPT0gMCkpIHsKKwkJCUFTU0VSVChwU2hiQ2lyQnVmZi0+bV91bEJsb2Nrc1JlYWRhYmxlID09IDApOworCisJCQlwU2hiQ2lyQnVmZi0+bV91bFdySW5kZXggPSAwOworCQkJcFNoYkNpckJ1ZmYtPm1fdWxSZEluZGV4ID0gMDsKKwkJfSBlbHNlCisJCQkvLyQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJAorCQl7CisJCQlwU2hiQ2lyQnVmZi0+bV91bFJkSW5kZXggKz0KKwkJCSAgICBTaGJDaXJCbG9ja1NpemUubV91aUZ1bGxCbG9ja1NpemU7CisJCQlwU2hiQ2lyQnVmZi0+bV91bFJkSW5kZXggJT0KKwkJCSAgICBwU2hiQ2lyQnVmZi0+bV91bEJ1ZmZlckRhdGFTaXplOworCQl9CisJfQorCVNoYklwY0xlYXZlQXRvbWljU2VjdGlvbihwU2hiSW5zdGFuY2VfcCk7CisKKyAgICAgIEV4aXQ6CisKKwkqcHVsRGF0YUJsb2NrU2l6ZV9wID0gdWxEYXRhU2l6ZTsKKworCXJldHVybiAoU2hiRXJyb3IpOworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgR2V0IGRhdGEgc2l6ZSBvZiBuZXh0IHJlYWRhYmxlIGJsb2NrIGZyb20gQ2lyY3VsYXIgU2hhcmVkIEJ1ZmZlcgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSU5MSU5FX0ZVTkNUSU9OIHRTaGJFcnJvciBTaGJDaXJHZXRSZWFkRGF0YVNpemUodFNoYkluc3RhbmNlIHBTaGJJbnN0YW5jZV9wLAorCQkJCQkJdW5zaWduZWQgbG9uZworCQkJCQkJKnB1bERhdGFCbG9ja1NpemVfcCkKK3sKKworCXRTaGJDaXJCdWZmICpwU2hiQ2lyQnVmZjsKKwl1bnNpZ25lZCBsb25nIHVsRGF0YVJlYWRhYmxlOworCXVuc2lnbmVkIGNoYXIgKnBTaGJDaXJEYXRhUHRyOworCXRTaGJDaXJCbG9ja1NpemUgU2hiQ2lyQmxvY2tTaXplOworCXVuc2lnbmVkIGxvbmcgdWxEYXRhU2l6ZTsKKwl0U2hiRXJyb3IgU2hiRXJyb3I7CisKKwkvLyBjaGVjayBhcmd1bWVudHMKKwlpZiAoKHBTaGJJbnN0YW5jZV9wID09IE5VTEwpIHx8IChwdWxEYXRhQmxvY2tTaXplX3AgPT0gTlVMTCkpIHsKKwkJcmV0dXJuIChrU2hiSW52YWxpZEFyZyk7CisJfQorCisJcFNoYkNpckJ1ZmYgPSBTaGJDaXJHZXRCdWZmZXIocFNoYkluc3RhbmNlX3ApOworCXVsRGF0YVNpemUgPSAwOworCVNoYkVycm9yID0ga1NoYk9rOworCisJaWYgKHBTaGJDaXJCdWZmLT5tX1NoYkNpck1hZ2ljSUQgIT0gU0JDX01BR0lDX0lEKSB7CisJCVNoYkVycm9yID0ga1NoYkludmFsaWRCdWZmZXJUeXBlOworCQlnb3RvIEV4aXQ7CisJfQorCisJLy8gZ2V0IHRvdGFsIG51bWJlciBvZiByZWFkYWJsZSBieXRlcyBmb3IgdGhlIHdob2xlIGNpcmN1bGFyIGJ1ZmZlcgorCVNoYklwY0VudGVyQXRvbWljU2VjdGlvbihwU2hiSW5zdGFuY2VfcCk7CisJeworCQl1bERhdGFSZWFkYWJsZSA9IHBTaGJDaXJCdWZmLT5tX3VsRGF0YVJlYWRhYmxlOworCX0KKwlTaGJJcGNMZWF2ZUF0b21pY1NlY3Rpb24ocFNoYkluc3RhbmNlX3ApOworCisJLy8gaWYgdGhlcmUgYXJlIHJlYWRhYmxlIGRhdGEgYXZhaWxhYmxlLCB0aGVuIHRoZXJlIG11c3QgYmUgYXQgbGVhc3QKKwkvLyBvbmUgY29tcGxldGUgcmVhZGFibGUgZGF0YSBibG9jaworCWlmICh1bERhdGFSZWFkYWJsZSA+IDApIHsKKwkJcFNoYkNpckRhdGFQdHIgPQorCQkgICAgJnBTaGJDaXJCdWZmLT5tX0RhdGEgKyBwU2hiQ2lyQnVmZi0+bV91bFJkSW5kZXg7CisKKwkJLy8gZ2V0IHJlYWwgc2l6ZSBvZiBjdXJyZW50IGJsb2NrIChpbmNsLiBhbGlnbm1lbnQgZmlsbCBieXRlcykKKwkJU2hiQ2lyQmxvY2tTaXplID0gKih0U2hiQ2lyQmxvY2tTaXplICopIHBTaGJDaXJEYXRhUHRyOworCisJCS8vIGdldCBzaXplIG9mIHVzZXIgZGF0YSBpbnNpZGUgdGhlIGN1cnJlbnQgYmxvY2sKKwkJdWxEYXRhU2l6ZSA9CisJCSAgICBTaGJDaXJCbG9ja1NpemUubV91aUZ1bGxCbG9ja1NpemUgLQorCQkgICAgU2hiQ2lyQmxvY2tTaXplLm1fdWlBbGlnbkZpbGxCeXRlczsKKwkJdWxEYXRhU2l6ZSAtPSBzaXplb2YodFNoYkNpckJsb2NrU2l6ZSk7CisJfQorCisgICAgICBFeGl0OgorCisJKnB1bERhdGFCbG9ja1NpemVfcCA9IHVsRGF0YVNpemU7CisKKwlyZXR1cm4gKFNoYkVycm9yKTsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIEdldCBudW1iZXIgb2YgcmVhZGFibGUgYmxvY2tzIGZyb20gQ2lyY3VsYXIgU2hhcmVkIEJ1ZmZlcgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSU5MSU5FX0ZVTkNUSU9OIHRTaGJFcnJvciBTaGJDaXJHZXRSZWFkQmxvY2tDb3VudCh0U2hiSW5zdGFuY2UgcFNoYkluc3RhbmNlX3AsCisJCQkJCQkgIHVuc2lnbmVkIGxvbmcKKwkJCQkJCSAgKnB1bERhdGFCbG9ja0NvdW50X3ApCit7CisKKwl0U2hiQ2lyQnVmZiAqcFNoYkNpckJ1ZmY7CisJdW5zaWduZWQgbG9uZyB1bEJsb2NrQ291bnQ7CisJdFNoYkVycm9yIFNoYkVycm9yOworCisJLy8gY2hlY2sgYXJndW1lbnRzCisJaWYgKChwU2hiSW5zdGFuY2VfcCA9PSBOVUxMKSB8fCAocHVsRGF0YUJsb2NrQ291bnRfcCA9PSBOVUxMKSkgeworCQlTaGJFcnJvciA9IGtTaGJJbnZhbGlkQXJnOworCQlnb3RvIEV4aXQ7CisJfQorCisJcFNoYkNpckJ1ZmYgPSBTaGJDaXJHZXRCdWZmZXIocFNoYkluc3RhbmNlX3ApOworCXVsQmxvY2tDb3VudCA9IDA7CisJU2hiRXJyb3IgPSBrU2hiT2s7CisKKwlpZiAocFNoYkNpckJ1ZmYtPm1fU2hiQ2lyTWFnaWNJRCAhPSBTQkNfTUFHSUNfSUQpIHsKKwkJU2hiRXJyb3IgPSBrU2hiSW52YWxpZEJ1ZmZlclR5cGU7CisJCWdvdG8gRXhpdDsKKwl9CisKKwlTaGJJcGNFbnRlckF0b21pY1NlY3Rpb24ocFNoYkluc3RhbmNlX3ApOworCXsKKwkJdWxCbG9ja0NvdW50ID0gcFNoYkNpckJ1ZmYtPm1fdWxCbG9ja3NSZWFkYWJsZTsKKwl9CisJU2hiSXBjTGVhdmVBdG9taWNTZWN0aW9uKHBTaGJJbnN0YW5jZV9wKTsKKworCSpwdWxEYXRhQmxvY2tDb3VudF9wID0gdWxCbG9ja0NvdW50OworCisgICAgICBFeGl0OgorCisJcmV0dXJuIChTaGJFcnJvcik7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBTZXQgYXBwbGljYXRpb24gaGFuZGxlciB0byBzaWduYWwgbmV3IGRhdGEgZm9yIENpcmN1bGFyIFNoYXJlZCBCdWZmZXIKKy8vICBkLmsuOiBuZXcgcGFyYW1ldGVyIHByaW9yaXR5IGFzIGVudW0KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lOTElORV9GVU5DVElPTiB0U2hiRXJyb3IgU2hiQ2lyU2V0U2lnbmFsSGFuZGxlck5ld0RhdGEodFNoYkluc3RhbmNlCisJCQkJCQkJcFNoYkluc3RhbmNlX3AsCisJCQkJCQkJdFNoYkNpclNpZ0huZGxyTmV3RGF0YQorCQkJCQkJCXBmblNpZ25hbEhhbmRsZXJOZXdEYXRhX3AsCisJCQkJCQkJdFNoYlByaW9yaXR5CisJCQkJCQkJU2hiUHJpb3JpdHlfcCkKK3sKKworCXRTaGJDaXJCdWZmICpwU2hiQ2lyQnVmZjsKKwl0U2hiRXJyb3IgU2hiRXJyb3I7CisKKwkvLyBjaGVjayBhcmd1bWVudHMKKwlpZiAocFNoYkluc3RhbmNlX3AgPT0gTlVMTCkgeworCQlTaGJFcnJvciA9IGtTaGJJbnZhbGlkQXJnOworCQlnb3RvIEV4aXQ7CisJfQorCisJcFNoYkNpckJ1ZmYgPSBTaGJDaXJHZXRCdWZmZXIocFNoYkluc3RhbmNlX3ApOworCVNoYkVycm9yID0ga1NoYk9rOworCisJaWYgKHBTaGJDaXJCdWZmLT5tX1NoYkNpck1hZ2ljSUQgIT0gU0JDX01BR0lDX0lEKSB7CisJCVNoYkVycm9yID0ga1NoYkludmFsaWRCdWZmZXJUeXBlOworCQlnb3RvIEV4aXQ7CisJfQorCisJaWYgKHBmblNpZ25hbEhhbmRsZXJOZXdEYXRhX3AgIT0gTlVMTCkgeworCQkvLyBzZXQgYSBuZXcgc2lnbmFsIGhhbmRsZXIKKwkJaWYgKHBTaGJDaXJCdWZmLT5tX3BmblNpZ0huZGxyTmV3RGF0YSAhPSBOVUxMKSB7CisJCQlTaGJFcnJvciA9IGtTaGJBbHJlYWR5U2lnbmFsaW5nOworCQkJZ290byBFeGl0OworCQl9CisKKwkJcFNoYkNpckJ1ZmYtPm1fcGZuU2lnSG5kbHJOZXdEYXRhID0gcGZuU2lnbmFsSGFuZGxlck5ld0RhdGFfcDsKKwkJU2hiRXJyb3IgPQorCQkgICAgU2hiSXBjU3RhcnRTaWduYWxpbmdOZXdEYXRhKHBTaGJJbnN0YW5jZV9wLAorCQkJCQkJU2hiQ2lyU2lnbmFsSGFuZGxlck5ld0RhdGEsCisJCQkJCQlTaGJQcmlvcml0eV9wKTsKKwl9IGVsc2UgeworCQkvLyByZW1vdmUgZXhpc3Rpbmcgc2lnbmFsIGhhbmRsZXIKKwkJU2hiRXJyb3IgPSBTaGJJcGNTdG9wU2lnbmFsaW5nTmV3RGF0YShwU2hiSW5zdGFuY2VfcCk7CisJCWlmIChwU2hiQ2lyQnVmZi0+bV9wZm5TaWdIbmRsck5ld0RhdGEgIT0gTlVMTCkgeworCQkJcFNoYkNpckJ1ZmYtPm1fcGZuU2lnSG5kbHJOZXdEYXRhKHBTaGJJbnN0YW5jZV9wLCAwKTsKKwkJfQorCQlwU2hiQ2lyQnVmZi0+bV9wZm5TaWdIbmRsck5ld0RhdGEgPSBOVUxMOworCX0KKworICAgICAgRXhpdDoKKworCXJldHVybiAoU2hiRXJyb3IpOworCit9CisKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoSU5MSU5FX0VOQUJMRUQpCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgREVCVUc6IFRyYWNlIENpcmN1bGFyIFNoYXJlZCBCdWZmZXIKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZm5kZWYgTkRFQlVHCit0U2hiRXJyb3IgU2hiQ2lyVHJhY2VCdWZmZXIodFNoYkluc3RhbmNlIHBTaGJJbnN0YW5jZV9wKQoreworCisJdFNoYkNpckJ1ZmYgKnBTaGJDaXJCdWZmOworCWNoYXIgc3pNYWdpZ0lEW3NpemVvZihTQkNfTUFHSUNfSUQpICsgMV07CisJdFNoYkNpckJsb2NrU2l6ZSBTaGJDaXJCbG9ja1NpemU7CisJdW5zaWduZWQgbG9uZyB1bERhdGFSZWFkYWJsZTsKKwl1bnNpZ25lZCBjaGFyICpwU2hiQ2lyRGF0YVB0cjsKKwl1bnNpZ25lZCBsb25nIHVsQmxvY2tJbmRleDsKKwl1bnNpZ25lZCBpbnQgbkJsb2NrQ291bnQ7CisJdW5zaWduZWQgbG9uZyB1bERhdGFTaXplOworCXVuc2lnbmVkIGxvbmcgdWxDaHVua1NpemU7CisJdW5zaWduZWQgbG9uZyB1bFJkSW5kZXg7CisJdFNoYkVycm9yIFNoYkVycm9yOworCisJVFJBQ0UwKCJcblxuIyMjIyMgQ2lyY3VsYXIgU2hhcmVkIEJ1ZmZlciAjIyMjI1xuIik7CisKKwkvLyBjaGVjayBhcmd1bWVudHMKKwlpZiAocFNoYkluc3RhbmNlX3AgPT0gTlVMTCkgeworCQlUUkFDRTEoIlxuRVJST1I6IGludmFsaWQgYnVmZmVyIGFkZHJlc3MgKDB4JTA4bFgpXG4iLAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpcFNoYkluc3RhbmNlX3ApOworCQlTaGJFcnJvciA9IGtTaGJJbnZhbGlkQXJnOworCQlnb3RvIEV4aXQ7CisJfQorCisJcFNoYkNpckJ1ZmYgPSBTaGJDaXJHZXRCdWZmZXIocFNoYkluc3RhbmNlX3ApOworCVNoYkVycm9yID0ga1NoYk9rOworCisJaWYgKHBTaGJDaXJCdWZmLT5tX1NoYkNpck1hZ2ljSUQgIT0gU0JDX01BR0lDX0lEKSB7CisJCVNoYkVycm9yID0ga1NoYkludmFsaWRCdWZmZXJUeXBlOworCQlnb3RvIEV4aXQ7CisJfQorCisJKih1bnNpZ25lZCBsb25nICopJnN6TWFnaWdJRFswXSA9IHBTaGJDaXJCdWZmLT5tX1NoYkNpck1hZ2ljSUQ7CisJc3pNYWdpZ0lEW3NpemVvZihTQkNfTUFHSUNfSUQpXSA9ICdcMCc7CisKKwlTaGJJcGNFbnRlckF0b21pY1NlY3Rpb24ocFNoYkluc3RhbmNlX3ApOworCXsKKwkJVFJBQ0UxKCJcbkJ1ZmZlciBBZGRyZXNzOiAgIDB4JTA4bFhcbiIsCisJCSAgICAgICAodW5zaWduZWQgbG9uZylwU2hiQ2lyQnVmZik7CisKKwkJVFJBQ0UwKCJcbkhlYWRlciBJbmZvOiIpOworCQlUUkFDRTIoIlxuTWFnaWdJRDogICAgICAgICAgJyVzJyAoJTA4bFgpIiwgc3pNYWdpZ0lELAorCQkgICAgICAgcFNoYkNpckJ1ZmYtPm1fU2hiQ2lyTWFnaWNJRCk7CisJCVRSQUNFMSgiXG5CdWZmZXJUb3RhbFNpemU6ICAlNGx1IFtCeXRlc10iLAorCQkgICAgICAgcFNoYkNpckJ1ZmYtPm1fdWxCdWZmZXJUb3RhbFNpemUpOworCQlUUkFDRTEoIlxuQnVmZmVyRGF0YVNpemU6ICAgJTRsdSBbQnl0ZXNdIiwKKwkJICAgICAgIHBTaGJDaXJCdWZmLT5tX3VsQnVmZmVyRGF0YVNpemUpOworCQlUUkFDRTEoIlxuV3JJbmRleDogICAgICAgICAgJTRsdSIsIHBTaGJDaXJCdWZmLT5tX3VsV3JJbmRleCk7CisJCVRSQUNFMSgiXG5SZEluZGV4OiAgICAgICAgICAlNGx1IiwgcFNoYkNpckJ1ZmYtPm1fdWxSZEluZGV4KTsKKwkJVFJBQ0UxKCJcbk51bU9mV3JpdGVKb2JzOiAgICU0bHUiLAorCQkgICAgICAgcFNoYkNpckJ1ZmYtPm1fdWxOdW1PZldyaXRlSm9icyk7CisJCVRSQUNFMSgiXG5EYXRhSW5Vc2U6ICAgICAgICAlNGx1IFtCeXRlc10iLAorCQkgICAgICAgcFNoYkNpckJ1ZmYtPm1fdWxEYXRhSW5Vc2UpOworCQlUUkFDRTEoIlxuRGF0YUFwZW5kZWQ6ICAgICAgJTRsdSBbQnl0ZXNdIiwKKwkJICAgICAgIHBTaGJDaXJCdWZmLT5tX3VsRGF0YUFwZW5kZWQpOworCQlUUkFDRTEoIlxuQmxvY2tzQXBlbmRlZDogICAgJTRsdSIsCisJCSAgICAgICBwU2hiQ2lyQnVmZi0+bV91bEJsb2Nrc0FwZW5kZWQpOworCQlUUkFDRTEoIlxuRGF0YVJlYWRhYmxlOiAgICAgJTRsdSBbQnl0ZXNdIiwKKwkJICAgICAgIHBTaGJDaXJCdWZmLT5tX3VsRGF0YVJlYWRhYmxlKTsKKwkJVFJBQ0UxKCJcbkJsb2Nrc1JlYWRhYmxlOiAgICU0bHUiLAorCQkgICAgICAgcFNoYkNpckJ1ZmYtPm1fdWxCbG9ja3NSZWFkYWJsZSk7CisJCVRSQUNFMSgiXG5TaWdIbmRsck5ld0RhdGE6ICAlMDhsWCIsCisJCSAgICAgICAodW5zaWduZWQgbG9uZylwU2hiQ2lyQnVmZi0+bV9wZm5TaWdIbmRsck5ld0RhdGEpOworCQlUUkFDRTEoIlxuQnVmZmVyTG9ja2VkOiAgICAgJWQiLCBwU2hiQ2lyQnVmZi0+bV9mQnVmZmVyTG9ja2VkKTsKKwkJVFJBQ0UxKCJcblNpZ0huZGxyUmVzZXQ6ICAgICUwOGxYIiwKKwkJICAgICAgICh1bnNpZ25lZCBsb25nKXBTaGJDaXJCdWZmLT5tX3BmblNpZ0huZGxyUmVzZXQpOworCisJCVNoYlRyYWNlRHVtcCgmcFNoYkNpckJ1ZmYtPm1fRGF0YSwKKwkJCSAgICAgcFNoYkNpckJ1ZmYtPm1fdWxCdWZmZXJEYXRhU2l6ZSwgMHgwMDAwMDAwMEwsCisJCQkgICAgICJcbkRhdGEgQXJlYToiKTsKKworCQl1bERhdGFSZWFkYWJsZSA9IHBTaGJDaXJCdWZmLT5tX3VsRGF0YVJlYWRhYmxlOworCQluQmxvY2tDb3VudCA9IDE7CisJCXVsQmxvY2tJbmRleCA9IHBTaGJDaXJCdWZmLT5tX3VsUmRJbmRleDsKKworCQl3aGlsZSAodWxEYXRhUmVhZGFibGUgPiAwKSB7CisJCQlUUkFDRTEoIlxuXG4tLS0gQmxvY2sgIyV1IC0tLSIsIG5CbG9ja0NvdW50KTsKKworCQkJLy8gZ2V0IHBvaW50ZXIgdG8gc3RhcnQgb2YgZGF0YSBhcmVhIGFuZCBjdXJyZW50IHJlYWQgaW5kZXgKKwkJCXBTaGJDaXJEYXRhUHRyID0gJnBTaGJDaXJCdWZmLT5tX0RhdGE7CS8vIHB0ciB0byBzdGFydCBvZiBkYXRhIGFyZWEKKwkJCXVsUmRJbmRleCA9IHVsQmxvY2tJbmRleDsKKworCQkJLy8gZ2V0IHJlYWwgc2l6ZSBvZiBjdXJyZW50IGJsb2NrIChpbmNsLiBhbGlnbm1lbnQgZmlsbCBieXRlcykKKwkJCVNoYkNpckJsb2NrU2l6ZSA9CisJCQkgICAgKih0U2hiQ2lyQmxvY2tTaXplICopIChwU2hiQ2lyRGF0YVB0ciArIHVsUmRJbmRleCk7CisJCQl1bFJkSW5kZXggKz0gc2l6ZW9mKHRTaGJDaXJCbG9ja1NpemUpOworCQkJdWxSZEluZGV4ICU9IHBTaGJDaXJCdWZmLT5tX3VsQnVmZmVyRGF0YVNpemU7CisKKwkJCS8vIGdldCBzaXplIG9mIHVzZXIgZGF0YSBpbnNpZGUgdGhlIGN1cnJlbnQgYmxvY2sKKwkJCXVsRGF0YVNpemUgPQorCQkJICAgIFNoYkNpckJsb2NrU2l6ZS5tX3VpRnVsbEJsb2NrU2l6ZSAtCisJCQkgICAgU2hiQ2lyQmxvY2tTaXplLm1fdWlBbGlnbkZpbGxCeXRlczsKKwkJCXVsRGF0YVNpemUgLT0gc2l6ZW9mKHRTaGJDaXJCbG9ja1NpemUpOworCisJCQlUUkFDRTEKKwkJCSAgICAoIlxuRnVsbCBEYXRhIFNpemU6ICAgICAgICU0dSBbQnl0ZXNdIChpbmNsLiBoZWFkZXIgYW5kIGFsaWdubWVudCBmaWxsIGJ5dGVzKSIsCisJCQkgICAgIFNoYkNpckJsb2NrU2l6ZS5tX3VpRnVsbEJsb2NrU2l6ZSk7CisJCQlUUkFDRTEoIlxuVXNlciBEYXRhIFNpemU6ICAgICAgICU0bHUgW0J5dGVzXSIsCisJCQkgICAgICAgdWxEYXRhU2l6ZSk7CisJCQlUUkFDRTEoIlxuQWxpZ25tZW50IEZpbGwgQnl0ZXM6ICU0dSBbQnl0ZXNdIiwKKwkJCSAgICAgICBTaGJDaXJCbG9ja1NpemUubV91aUFsaWduRmlsbEJ5dGVzKTsKKworCQkJaWYgKHVsUmRJbmRleCArIHVsRGF0YVNpemUgPD0KKwkJCSAgICBwU2hiQ2lyQnVmZi0+bV91bEJ1ZmZlckRhdGFTaXplKSB7CisJCQkJLy8gbGluZWFyIGRhdGEgYnVmZmVyCisJCQkJU2hiVHJhY2VEdW1wKHBTaGJDaXJEYXRhUHRyICsgdWxSZEluZGV4LAorCQkJCQkgICAgIHVsRGF0YVNpemUsIDB4MDAwMDAwMDBMLCBOVUxMKTsKKwkJCX0gZWxzZSB7CisJCQkJLy8gd3JhcC1hcm91bmQgZGF0YSBidWZmZXIKKwkJCQl1bENodW5rU2l6ZSA9CisJCQkJICAgIHBTaGJDaXJCdWZmLT5tX3VsQnVmZmVyRGF0YVNpemUgLSB1bFJkSW5kZXg7CisJCQkJU2hiVHJhY2VEdW1wKHBTaGJDaXJEYXRhUHRyICsgdWxSZEluZGV4LAorCQkJCQkgICAgIHVsQ2h1bmtTaXplLCAweDAwMDAwMDAwTCwgTlVMTCk7CisJCQkJU2hiVHJhY2VEdW1wKHBTaGJDaXJEYXRhUHRyLAorCQkJCQkgICAgIHVsRGF0YVNpemUgLSB1bENodW5rU2l6ZSwKKwkJCQkJICAgICB1bENodW5rU2l6ZSwgTlVMTCk7CisJCQl9CisKKwkJCW5CbG9ja0NvdW50Kys7CisKKwkJCXVsQmxvY2tJbmRleCArPSBTaGJDaXJCbG9ja1NpemUubV91aUZ1bGxCbG9ja1NpemU7CisJCQl1bEJsb2NrSW5kZXggJT0gcFNoYkNpckJ1ZmYtPm1fdWxCdWZmZXJEYXRhU2l6ZTsKKworCQkJdWxEYXRhUmVhZGFibGUgLT0gU2hiQ2lyQmxvY2tTaXplLm1fdWlGdWxsQmxvY2tTaXplOworCQl9CisKKwkJQVNTRVJUKHBTaGJDaXJCdWZmLT5tX3VsQmxvY2tzUmVhZGFibGUgPT0gbkJsb2NrQ291bnQgLSAxKTsKKwl9CisJU2hiSXBjTGVhdmVBdG9taWNTZWN0aW9uKHBTaGJJbnN0YW5jZV9wKTsKKworICAgICAgRXhpdDoKKworCXJldHVybiAoU2hiRXJyb3IpOworCit9CisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICBMIGkgbiBlIGEgciAgIFMgaCBhIHIgZSBkICAgQiB1IGYgZiBlIHIgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS8vCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgQWxsb2NhdGUgTGluZWFyIFNoYXJlZCBCdWZmZXIKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RTaGJFcnJvciBTaGJMaW5BbGxvY0J1ZmZlcih1bnNpZ25lZCBsb25nIHVsQnVmZmVyU2l6ZV9wLAorCQkJICAgIGNvbnN0IGNoYXIgKnBzekJ1ZmZlcklEX3AsCisJCQkgICAgdFNoYkluc3RhbmNlICogcHBTaGJJbnN0YW5jZV9wLAorCQkJICAgIHVuc2lnbmVkIGludCAqcGZTaGJOZXdDcmVhdGVkX3ApCit7CisKKwl0U2hiSW5zdGFuY2UgcFNoYkluc3RhbmNlOworCXRTaGJMaW5CdWZmICpwU2hiTGluQnVmZjsKKwl1bnNpZ25lZCBpbnQgZlNoYk5ld0NyZWF0ZWQ7CisJdW5zaWduZWQgbG9uZyB1bEJ1ZmZlckRhdGFTaXplOworCXVuc2lnbmVkIGxvbmcgdWxCdWZmZXJUb3RhbFNpemU7CisJdFNoYkVycm9yIFNoYkVycm9yOworCisJLy8gY2hlY2sgYXJndW1lbnRzCisJaWYgKCh1bEJ1ZmZlclNpemVfcCA9PSAwKSB8fCAocHBTaGJJbnN0YW5jZV9wID09IE5VTEwpKSB7CisJCXJldHVybiAoa1NoYkludmFsaWRBcmcpOworCX0KKworCS8vIGNhbGN1bGF0ZSBsZW5ndGggb2YgbWVtb3J5IHRvIGFsbG9jYXRlCisJdWxCdWZmZXJEYXRhU2l6ZSA9CisJICAgICh1bEJ1ZmZlclNpemVfcCArCisJICAgICAoU0JMX0JMT0NLX0FMSUdOTUVOVCAtIDEpKSAmIH4oU0JMX0JMT0NLX0FMSUdOTUVOVCAtIDEpOworCXVsQnVmZmVyVG90YWxTaXplID0gdWxCdWZmZXJEYXRhU2l6ZSArIHNpemVvZih0U2hiTGluQnVmZik7CisKKwkvLyBhbGxvY2F0ZSBhIG5ldyBvciBvcGVuIGFuIGV4aXN0aW5nIHNoYXJlZCBidWZmZXIKKwlTaGJFcnJvciA9IFNoYklwY0FsbG9jQnVmZmVyKHVsQnVmZmVyVG90YWxTaXplLCBwc3pCdWZmZXJJRF9wLAorCQkJCSAgICAgJnBTaGJJbnN0YW5jZSwgJmZTaGJOZXdDcmVhdGVkKTsKKwlpZiAoU2hiRXJyb3IgIT0ga1NoYk9rKSB7CisJCWdvdG8gRXhpdDsKKwl9CisKKwlpZiAocFNoYkluc3RhbmNlID09IE5VTEwpIHsKKwkJU2hiRXJyb3IgPSBrU2hiT3V0T2ZNZW07CisJCWdvdG8gRXhpdDsKKwl9CisKKwkvLyBnZXQgcG9pbnRlciB0byBzaGFyZWQgYnVmZmVyCisJcFNoYkxpbkJ1ZmYgPSAodFNoYkxpbkJ1ZmYgKikgU2hiSXBjR2V0U2hNZW1QdHIocFNoYkluc3RhbmNlKTsKKworCS8vIGlmIHRoZSBzaGFyZWQgYnVmZmVyIHdhcyBuZXcgY3JlYXRlZCwgdGhhbiB0aGlzIHByb2Nlc3MgaGFzCisJLy8gdG8gaW5pdGlhbGl6ZSBpdCwgb3RoZXJ3aXNlIHRoZSBidWZmZXIgaXMgYWxyZWFkeSBpbiB1c2UKKwkvLyBhbmQgKm11c3Qgbm90KiBiZSByZXNldGVkCisJaWYgKGZTaGJOZXdDcmVhdGVkKSB7CisjaWZuZGVmIE5ERUJVRworCQl7CisJCQltZW1zZXQocFNoYkxpbkJ1ZmYsIDB4Q0MsIHVsQnVmZmVyVG90YWxTaXplKTsKKwkJfQorI2VuZGlmCisKKwkJcFNoYkxpbkJ1ZmYtPm1fU2hiTGluTWFnaWNJRCA9IFNCTF9NQUdJQ19JRDsKKwkJcFNoYkxpbkJ1ZmYtPm1fdWxCdWZmZXJUb3RhbFNpemUgPSB1bEJ1ZmZlclRvdGFsU2l6ZTsKKwkJcFNoYkxpbkJ1ZmYtPm1fdWxCdWZmZXJEYXRhU2l6ZSA9IHVsQnVmZmVyRGF0YVNpemU7CisJfSBlbHNlIHsKKwkJaWYgKHBTaGJMaW5CdWZmLT5tX1NoYkxpbk1hZ2ljSUQgIT0gU0JMX01BR0lDX0lEKSB7CisJCQlTaGJFcnJvciA9IGtTaGJJbnZhbGlkQnVmZmVyVHlwZTsKKwkJCWdvdG8gRXhpdDsKKwkJfQorCX0KKworICAgICAgRXhpdDoKKworCSpwcFNoYkluc3RhbmNlX3AgPSBwU2hiSW5zdGFuY2U7CisJKnBmU2hiTmV3Q3JlYXRlZF9wID0gZlNoYk5ld0NyZWF0ZWQ7CisKKwlyZXR1cm4gKFNoYkVycm9yKTsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIFJlbGVhc2UgTGluZWFyIFNoYXJlZCBCdWZmZXIKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RTaGJFcnJvciBTaGJMaW5SZWxlYXNlQnVmZmVyKHRTaGJJbnN0YW5jZSBwU2hiSW5zdGFuY2VfcCkKK3sKKworCXRTaGJFcnJvciBTaGJFcnJvcjsKKworCS8vIGNoZWNrIGFyZ3VtZW50cworCWlmIChwU2hiSW5zdGFuY2VfcCA9PSBOVUxMKSB7CisJCVNoYkVycm9yID0ga1NoYk9rOworCQlnb3RvIEV4aXQ7CisJfQorCisJU2hiRXJyb3IgPSBTaGJJcGNSZWxlYXNlQnVmZmVyKHBTaGJJbnN0YW5jZV9wKTsKKworICAgICAgRXhpdDoKKworCXJldHVybiAoU2hiRXJyb3IpOworCit9CisKKyNlbmRpZiAvLyAhZGVmaW5lZChJTkxJTkVfRU5BQkxFRCkKKworI2lmICghZGVmaW5lZChTSEFSRURCVUZGX0lOTElORUQpKSB8fCBkZWZpbmVkKElOTElORV9FTkFCTEVEKQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIFdyaXRlIGRhdGEgYmxvY2sgdG8gTGluZWFyIFNoYXJlZCBCdWZmZXIKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lOTElORV9GVU5DVElPTiB0U2hiRXJyb3IgU2hiTGluV3JpdGVEYXRhQmxvY2sodFNoYkluc3RhbmNlIHBTaGJJbnN0YW5jZV9wLAorCQkJCQkgICAgICAgdW5zaWduZWQgbG9uZyB1bERzdEJ1ZmZlck9mZnNfcCwKKwkJCQkJICAgICAgIGNvbnN0IHZvaWQgKnBTcmNEYXRhQmxvY2tfcCwKKwkJCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgdWxEYXRhQmxvY2tTaXplX3ApCit7CisKKwl0U2hiTGluQnVmZiAqcFNoYkxpbkJ1ZmY7CisJdW5zaWduZWQgY2hhciAqcFNoYkxpbkRhdGFQdHI7CisJdW5zaWduZWQgY2hhciAqcFNjckRhdGFQdHI7CisJdW5zaWduZWQgbG9uZyB1bEJ1ZmZlckRhdGFTaXplOworCXRTaGJFcnJvciBTaGJFcnJvcjsKKworCS8vIGNoZWNrIGFyZ3VtZW50cworCWlmIChwU2hiSW5zdGFuY2VfcCA9PSBOVUxMKSB7CisJCVNoYkVycm9yID0ga1NoYkludmFsaWRBcmc7CisJCWdvdG8gRXhpdDsKKwl9CisKKwlpZiAoKHBTcmNEYXRhQmxvY2tfcCA9PSBOVUxMKSB8fCAodWxEYXRhQmxvY2tTaXplX3AgPT0gMCkpIHsKKwkJLy8gbm90aGluZyB0byBkbyBoZXJlCisJCVNoYkVycm9yID0ga1NoYk9rOworCQlnb3RvIEV4aXQ7CisJfQorCisJaWYgKHVsRGF0YUJsb2NrU2l6ZV9wID4gU0JMX01BWF9CTE9DS19TSVpFKSB7CisJCVNoYkVycm9yID0ga1NoYkV4Y2VlZERhdGFTaXplTGltaXQ7CisJCWdvdG8gRXhpdDsKKwl9CisKKwlwU2hiTGluQnVmZiA9IFNoYkxpbkdldEJ1ZmZlcihwU2hiSW5zdGFuY2VfcCk7CisJcFNjckRhdGFQdHIgPSAodW5zaWduZWQgY2hhciAqKXBTcmNEYXRhQmxvY2tfcDsKKwlTaGJFcnJvciA9IGtTaGJPazsKKworCWlmIChwU2hiTGluQnVmZi0+bV9TaGJMaW5NYWdpY0lEICE9IFNCTF9NQUdJQ19JRCkgeworCQlTaGJFcnJvciA9IGtTaGJJbnZhbGlkQnVmZmVyVHlwZTsKKwkJZ290byBFeGl0OworCX0KKworCS8vIGNoZWNrIGlmIG9mZmVzZXQgYW5kIHNpemUgZm9yIHRoZSB3cml0ZSBvcGVyYXRpb24gbWF0Y2hlcyB3aXRoCisJLy8gdGhlIHNpemUgb2YgdGhlIHNoYXJlZCBidWZmZXIKKwl1bEJ1ZmZlckRhdGFTaXplID0gcFNoYkxpbkJ1ZmYtPm1fdWxCdWZmZXJEYXRhU2l6ZTsKKwlpZiAoKHVsRHN0QnVmZmVyT2Zmc19wID4gdWxCdWZmZXJEYXRhU2l6ZSkgfHwKKwkgICAgKHVsRGF0YUJsb2NrU2l6ZV9wID4gdWxCdWZmZXJEYXRhU2l6ZSkgfHwKKwkgICAgKCh1bERzdEJ1ZmZlck9mZnNfcCArIHVsRGF0YUJsb2NrU2l6ZV9wKSA+IHVsQnVmZmVyRGF0YVNpemUpKSB7CisJCVNoYkVycm9yID0ga1NoYkRhdGFPdXRzaWRlQnVmZmVyQXJlYTsKKwkJZ290byBFeGl0OworCX0KKworCS8vIGNvcHkgdGhlIGRhdGEgdG8gdGhlIGxpbmVhciBidWZmZXIKKwkvLyAodGhlIGNvcHkgcHJvY2VzcyB3aWxsIGJlIGRvbmUgaW5zaWRlIG9mIGFueSBjcml0aWNhbC9sb2NrZWQgc2VjdGlvbikKKwlwU2hiTGluRGF0YVB0ciA9ICZwU2hiTGluQnVmZi0+bV9EYXRhOwkvLyBwdHIgdG8gc3RhcnQgb2YgZGF0YSBhcmVhCisJcFNoYkxpbkRhdGFQdHIgKz0gdWxEc3RCdWZmZXJPZmZzX3A7CisKKwlTaGJJcGNFbnRlckF0b21pY1NlY3Rpb24ocFNoYkluc3RhbmNlX3ApOworCXsKKwkJbWVtY3B5KHBTaGJMaW5EYXRhUHRyLCBwU2NyRGF0YVB0ciwgdWxEYXRhQmxvY2tTaXplX3ApOworCX0KKwlTaGJJcGNMZWF2ZUF0b21pY1NlY3Rpb24ocFNoYkluc3RhbmNlX3ApOworCisgICAgICBFeGl0OgorCisJcmV0dXJuIChTaGJFcnJvcik7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBSZWFkIGRhdGEgYmxvY2sgZnJvbSBMaW5lYXIgU2hhcmVkIEJ1ZmZlcgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSU5MSU5FX0ZVTkNUSU9OIHRTaGJFcnJvciBTaGJMaW5SZWFkRGF0YUJsb2NrKHRTaGJJbnN0YW5jZSBwU2hiSW5zdGFuY2VfcCwKKwkJCQkJICAgICAgdm9pZCAqcERzdERhdGFCbG9ja19wLAorCQkJCQkgICAgICB1bnNpZ25lZCBsb25nIHVsU3JjQnVmZmVyT2Zmc19wLAorCQkJCQkgICAgICB1bnNpZ25lZCBsb25nIHVsRGF0YUJsb2NrU2l6ZV9wKQoreworCisJdFNoYkxpbkJ1ZmYgKnBTaGJMaW5CdWZmOworCXVuc2lnbmVkIGNoYXIgKnBTaGJMaW5EYXRhUHRyOworCXVuc2lnbmVkIGNoYXIgKnBEc3REYXRhUHRyOworCXVuc2lnbmVkIGxvbmcgdWxCdWZmZXJEYXRhU2l6ZTsKKwl0U2hiRXJyb3IgU2hiRXJyb3I7CisKKwkvLyBjaGVjayBhcmd1bWVudHMKKwlpZiAocFNoYkluc3RhbmNlX3AgPT0gTlVMTCkgeworCQlTaGJFcnJvciA9IGtTaGJJbnZhbGlkQXJnOworCQlnb3RvIEV4aXQ7CisJfQorCisJaWYgKChwRHN0RGF0YUJsb2NrX3AgPT0gTlVMTCkgfHwgKHVsRGF0YUJsb2NrU2l6ZV9wID09IDApKSB7CisJCS8vIG5vdGhpbmcgdG8gZG8gaGVyZQorCQlTaGJFcnJvciA9IGtTaGJPazsKKwkJZ290byBFeGl0OworCX0KKworCWlmICh1bERhdGFCbG9ja1NpemVfcCA+IFNCTF9NQVhfQkxPQ0tfU0laRSkgeworCQlTaGJFcnJvciA9IGtTaGJFeGNlZWREYXRhU2l6ZUxpbWl0OworCQlnb3RvIEV4aXQ7CisJfQorCisJcFNoYkxpbkJ1ZmYgPSBTaGJMaW5HZXRCdWZmZXIocFNoYkluc3RhbmNlX3ApOworCXBEc3REYXRhUHRyID0gKHVuc2lnbmVkIGNoYXIgKilwRHN0RGF0YUJsb2NrX3A7CisJU2hiRXJyb3IgPSBrU2hiT2s7CisKKwlpZiAocFNoYkxpbkJ1ZmYtPm1fU2hiTGluTWFnaWNJRCAhPSBTQkxfTUFHSUNfSUQpIHsKKwkJU2hiRXJyb3IgPSBrU2hiSW52YWxpZEJ1ZmZlclR5cGU7CisJCWdvdG8gRXhpdDsKKwl9CisKKwkvLyBjaGVjayBpZiBvZmZlc2V0IGFuZCBzaXplIGZvciB0aGUgcmVhZCBvcGVyYXRpb24gbWF0Y2hlcyB3aXRoCisJLy8gdGhlIHNpemUgb2YgdGhlIHNoYXJlZCBidWZmZXIKKwl1bEJ1ZmZlckRhdGFTaXplID0gcFNoYkxpbkJ1ZmYtPm1fdWxCdWZmZXJEYXRhU2l6ZTsKKwlpZiAoKHVsU3JjQnVmZmVyT2Zmc19wID4gdWxCdWZmZXJEYXRhU2l6ZSkgfHwKKwkgICAgKHVsRGF0YUJsb2NrU2l6ZV9wID4gdWxCdWZmZXJEYXRhU2l6ZSkgfHwKKwkgICAgKCh1bFNyY0J1ZmZlck9mZnNfcCArIHVsRGF0YUJsb2NrU2l6ZV9wKSA+IHVsQnVmZmVyRGF0YVNpemUpKSB7CisJCVNoYkVycm9yID0ga1NoYkRhdGFPdXRzaWRlQnVmZmVyQXJlYTsKKwkJZ290byBFeGl0OworCX0KKworCS8vIGNvcHkgdGhlIGRhdGEgdG8gdGhlIGxpbmVhciBidWZmZXIKKwkvLyAodGhlIGNvcHkgcHJvY2VzcyB3aWxsIGJlIGRvbmUgaW5zaWRlIG9mIGFueSBjcml0aWNhbC9sb2NrZWQgc2VjdGlvbikKKwlwU2hiTGluRGF0YVB0ciA9ICZwU2hiTGluQnVmZi0+bV9EYXRhOwkvLyBwdHIgdG8gc3RhcnQgb2YgZGF0YSBhcmVhCisJcFNoYkxpbkRhdGFQdHIgKz0gdWxTcmNCdWZmZXJPZmZzX3A7CisKKwlTaGJJcGNFbnRlckF0b21pY1NlY3Rpb24ocFNoYkluc3RhbmNlX3ApOworCXsKKwkJbWVtY3B5KHBEc3REYXRhUHRyLCBwU2hiTGluRGF0YVB0ciwgdWxEYXRhQmxvY2tTaXplX3ApOworCX0KKwlTaGJJcGNMZWF2ZUF0b21pY1NlY3Rpb24ocFNoYkluc3RhbmNlX3ApOworCisgICAgICBFeGl0OgorCisJcmV0dXJuIChTaGJFcnJvcik7CisKK30KKworI2VuZGlmCisKKyNpZiAhZGVmaW5lZChJTkxJTkVfRU5BQkxFRCkKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBERUJVRzogVHJhY2UgTGluZWFyIFNoYXJlZCBCdWZmZXIKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZm5kZWYgTkRFQlVHCit0U2hiRXJyb3IgU2hiTGluVHJhY2VCdWZmZXIodFNoYkluc3RhbmNlIHBTaGJJbnN0YW5jZV9wKQoreworCisJdFNoYkxpbkJ1ZmYgKnBTaGJMaW5CdWZmOworCWNoYXIgc3pNYWdpZ0lEW3NpemVvZihTQkxfTUFHSUNfSUQpICsgMV07CisJdFNoYkVycm9yIFNoYkVycm9yOworCisJVFJBQ0UwKCJcblxuIyMjIyMgTGluZWFyIFNoYXJlZCBCdWZmZXIgIyMjIyNcbiIpOworCisJLy8gY2hlY2sgYXJndW1lbnRzCisJaWYgKHBTaGJJbnN0YW5jZV9wID09IE5VTEwpIHsKKwkJVFJBQ0UxKCJcbkVSUk9SOiBpbnZhbGlkIGJ1ZmZlciBhZGRyZXNzICgweCUwOGxYKVxuIiwKKwkJICAgICAgICh1bnNpZ25lZCBsb25nKXBTaGJJbnN0YW5jZV9wKTsKKwkJU2hiRXJyb3IgPSBrU2hiSW52YWxpZEFyZzsKKwkJZ290byBFeGl0OworCX0KKworCXBTaGJMaW5CdWZmID0gU2hiTGluR2V0QnVmZmVyKHBTaGJJbnN0YW5jZV9wKTsKKwlTaGJFcnJvciA9IGtTaGJPazsKKworCWlmIChwU2hiTGluQnVmZi0+bV9TaGJMaW5NYWdpY0lEICE9IFNCTF9NQUdJQ19JRCkgeworCQlTaGJFcnJvciA9IGtTaGJJbnZhbGlkQnVmZmVyVHlwZTsKKwkJZ290byBFeGl0OworCX0KKworCSoodW5zaWduZWQgaW50ICopJnN6TWFnaWdJRFswXSA9IHBTaGJMaW5CdWZmLT5tX1NoYkxpbk1hZ2ljSUQ7CisJc3pNYWdpZ0lEW3NpemVvZihTQkxfTUFHSUNfSUQpXSA9ICdcMCc7CisKKwlTaGJJcGNFbnRlckF0b21pY1NlY3Rpb24ocFNoYkluc3RhbmNlX3ApOworCXsKKwkJVFJBQ0UxKCJcbkJ1ZmZlciBBZGRyZXNzOiAgIDB4JTA4bFhcbiIsCisJCSAgICAgICAodW5zaWduZWQgbG9uZylwU2hiTGluQnVmZik7CisKKwkJVFJBQ0UwKCJcbkhlYWRlciBJbmZvOiIpOworCQlUUkFDRTIoIlxuTWFnaWdJRDogICAgICAgICAgJyVzJyAoJTA4WCkiLCBzek1hZ2lnSUQsCisJCSAgICAgICBwU2hiTGluQnVmZi0+bV9TaGJMaW5NYWdpY0lEKTsKKwkJVFJBQ0UxKCJcbkJ1ZmZlclRvdGFsU2l6ZTogICU0bHUgW0J5dGVzXSIsCisJCSAgICAgICBwU2hiTGluQnVmZi0+bV91bEJ1ZmZlclRvdGFsU2l6ZSk7CisJCVRSQUNFMSgiXG5CdWZmZXJEYXRhU2l6ZTogICAlNGx1IFtCeXRlc10iLAorCQkgICAgICAgcFNoYkxpbkJ1ZmYtPm1fdWxCdWZmZXJEYXRhU2l6ZSk7CisKKwkJU2hiVHJhY2VEdW1wKCZwU2hiTGluQnVmZi0+bV9EYXRhLAorCQkJICAgICBwU2hiTGluQnVmZi0+bV91bEJ1ZmZlckRhdGFTaXplLCAweDAwMDAwMDAwTCwKKwkJCSAgICAgIlxuRGF0YSBBcmVhOiIpOworCX0KKwlTaGJJcGNMZWF2ZUF0b21pY1NlY3Rpb24ocFNoYkluc3RhbmNlX3ApOworCisgICAgICBFeGl0OgorCisJcmV0dXJuIChTaGJFcnJvcik7CisKK30KKyNlbmRpZgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIER1bXAgYnVmZmVyIGNvbnRlbnRzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWZuZGVmIE5ERUJVRwordFNoYkVycm9yIFNoYlRyYWNlRHVtcChjb25zdCB1bnNpZ25lZCBjaGFyICpwYWJTdGFydEFkZHJfcCwKKwkJICAgICAgIHVuc2lnbmVkIGxvbmcgdWxEYXRhU2l6ZV9wLAorCQkgICAgICAgdW5zaWduZWQgbG9uZyB1bEFkZHJPZmZzZXRfcCwgY29uc3QgY2hhciAqcHN6SW5mb1RleHRfcCkKK3sKKworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnBhYkJ1ZmZEYXRhOworCXVuc2lnbmVkIGxvbmcgdWxCdWZmU2l6ZTsKKwl1bnNpZ25lZCBjaGFyIGJEYXRhOworCWludCBuUm93OworCWludCBuQ29sOworCisJLy8gZ2V0IHBvaW50ZXIgdG8gYnVmZmVyIGFuZCBsZW5ndGggb2YgYnVmZmVyCisJcGFiQnVmZkRhdGEgPSBwYWJTdGFydEFkZHJfcDsKKwl1bEJ1ZmZTaXplID0gdWxEYXRhU2l6ZV9wOworCisJaWYgKHBzekluZm9UZXh0X3AgIT0gTlVMTCkgeworCQlUUkFDRTAocHN6SW5mb1RleHRfcCk7CisJfQorCS8vIGR1bXAgYnVmZmVyIGNvbnRlbnRzCisJZm9yIChuUm93ID0gMDs7IG5Sb3crKykgeworCQlUUkFDRTEoIlxuJTA4bFg6ICAgIiwKKwkJICAgICAgICh1bnNpZ25lZCBsb25nKShuUm93ICogMHgxMCkgKyB1bEFkZHJPZmZzZXRfcCk7CisKKwkJZm9yIChuQ29sID0gMDsgbkNvbCA8IDE2OyBuQ29sKyspIHsKKwkJCWlmICgodW5zaWduZWQgbG9uZyluQ29sIDwgdWxCdWZmU2l6ZSkgeworCQkJCVRSQUNFMSgiJTAyWCAiLAorCQkJCSAgICAgICAodW5zaWduZWQgaW50KSoocGFiQnVmZkRhdGEgKyBuQ29sKSk7CisJCQl9IGVsc2UgeworCQkJCVRSQUNFMCgiICAgIik7CisJCQl9CisJCX0KKworCQlUUkFDRTAoIiAiKTsKKworCQlmb3IgKG5Db2wgPSAwOyBuQ29sIDwgMTY7IG5Db2wrKykgeworCQkJYkRhdGEgPSAqcGFiQnVmZkRhdGErKzsKKwkJCWlmICgodW5zaWduZWQgbG9uZyluQ29sIDwgdWxCdWZmU2l6ZSkgeworCQkJCWlmICgoYkRhdGEgPj0gMHgyMCkgJiYgKGJEYXRhIDwgMHg3RikpIHsKKwkJCQkJVFJBQ0UxKCIlYyIsIGJEYXRhKTsKKwkJCQl9IGVsc2UgeworCQkJCQlUUkFDRTAoIi4iKTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCVRSQUNFMCgiICIpOworCQkJfQorCQl9CisKKwkJaWYgKHVsQnVmZlNpemUgPiAxNikgeworCQkJdWxCdWZmU2l6ZSAtPSAxNjsKKwkJfSBlbHNlIHsKKwkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuIChrU2hiT2spOworCit9CisjZW5kaWYgLy8gI2lmbmRlZiBOREVCVUcKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICBQIFIgSSBWIEEgVCBFICAgRiBVIE4gQyBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgSGFuZGxlciB0byBzaWduYWwgbmV3IGRhdGEgZXZlbnQgZm9yIENpcmN1bGFyIFNoYXJlZCBCdWZmZXIKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2ludCBTaGJDaXJTaWduYWxIYW5kbGVyTmV3RGF0YSh0U2hiSW5zdGFuY2UgcFNoYkluc3RhbmNlX3ApCit7CisKKwl0U2hiQ2lyQnVmZiAqcFNoYkNpckJ1ZmY7CisJdW5zaWduZWQgbG9uZyB1bERhdGFTaXplOworCXVuc2lnbmVkIGxvbmcgdWxCbG9ja0NvdW50OworCXRTaGJFcnJvciBTaGJFcnJvcjsKKworCS8vIGNoZWNrIGFyZ3VtZW50cworCWlmIChwU2hiSW5zdGFuY2VfcCA9PSBOVUxMKSB7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlwU2hiQ2lyQnVmZiA9IFNoYkNpckdldEJ1ZmZlcihwU2hiSW5zdGFuY2VfcCk7CisJU2hiRXJyb3IgPSBrU2hiT2s7CisKKwlpZiAocFNoYkNpckJ1ZmYtPm1fU2hiQ2lyTWFnaWNJRCAhPSBTQkNfTUFHSUNfSUQpIHsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCS8vIGNhbGwgYXBwbGljYXRpb24gaGFuZGxlcgorCWlmIChwU2hiQ2lyQnVmZi0+bV9wZm5TaWdIbmRsck5ld0RhdGEgIT0gTlVMTCkgeworLyogICAgICAgIGRvCisgICAgICAgIHsqLworCQlTaGJFcnJvciA9IFNoYkNpckdldFJlYWREYXRhU2l6ZShwU2hiSW5zdGFuY2VfcCwgJnVsRGF0YVNpemUpOworCQlpZiAoKHVsRGF0YVNpemUgPiAwKSAmJiAoU2hiRXJyb3IgPT0ga1NoYk9rKSkgeworCQkJcFNoYkNpckJ1ZmYtPm1fcGZuU2lnSG5kbHJOZXdEYXRhKHBTaGJJbnN0YW5jZV9wLAorCQkJCQkJCSAgdWxEYXRhU2l6ZSk7CisJCX0KKworCQlTaGJFcnJvciA9CisJCSAgICBTaGJDaXJHZXRSZWFkQmxvY2tDb3VudChwU2hiSW5zdGFuY2VfcCwgJnVsQmxvY2tDb3VudCk7CisvKiAgICAgICAgfQorICAgICAgICB3aGlsZSAoKHVsQmxvY2tDb3VudCA+IDApICYmIChTaGJFcnJvciA9PSBrU2hiT2spKTsqLworCX0KKwkvLyBSZXR1cm4gVFJVRSBpZiB0aGVyZSBhcmUgcGVuZGluZyBibG9ja3MuCisJLy8gSW4gdGhhdCBjYXNlIFNoYklwYyB0cmllcyB0byBjYWxsIHRoaXMgZnVuY3Rpb24gYWdhaW4gaW1tZWRpYXRlbHkgaWYgdGhlcmUKKwkvLyBpcyBubyBvdGhlciBmaWxsZWQgc2hhcmVkIGJ1ZmZlciB3aXRoIGhpZ2hlciBwcmlvcml0eS4KKwlyZXR1cm4gKCh1bEJsb2NrQ291bnQgPiAwKSAmJiAoU2hiRXJyb3IgPT0ga1NoYk9rKSk7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBIYW5kbGVyIHRvIHJlc2V0IENpcmN1bGFyIFNoYXJlZCBCdWZmZXIKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQgU2hiQ2lyU2lnbmFsSGFuZGxlclJlc2V0KHRTaGJJbnN0YW5jZSBwU2hiSW5zdGFuY2VfcCwKKwkJCSAgICAgIHVuc2lnbmVkIGludCBmVGltZU91dF9wKQoreworCisJdFNoYkNpckJ1ZmYgKnBTaGJDaXJCdWZmOworCisJLy8gY2hlY2sgYXJndW1lbnRzCisJaWYgKHBTaGJJbnN0YW5jZV9wID09IE5VTEwpIHsKKwkJcmV0dXJuOworCX0KKworCXBTaGJDaXJCdWZmID0gU2hiQ2lyR2V0QnVmZmVyKHBTaGJJbnN0YW5jZV9wKTsKKwlpZiAocFNoYkNpckJ1ZmYtPm1fU2hiQ2lyTWFnaWNJRCAhPSBTQkNfTUFHSUNfSUQpIHsKKwkJcmV0dXJuOworCX0KKworCS8vIHJlc2V0IGJ1ZmZlciBoZWFkZXIKKwlpZiAoIWZUaW1lT3V0X3ApIHsKKwkJU2hiSXBjRW50ZXJBdG9taWNTZWN0aW9uKHBTaGJJbnN0YW5jZV9wKTsKKwkJeworCQkJcFNoYkNpckJ1ZmYtPm1fdWxXckluZGV4ID0gMDsKKwkJCXBTaGJDaXJCdWZmLT5tX3VsUmRJbmRleCA9IDA7CisJCQlwU2hiQ2lyQnVmZi0+bV91bE51bU9mV3JpdGVKb2JzID0gMDsKKwkJCXBTaGJDaXJCdWZmLT5tX3VsRGF0YUluVXNlID0gMDsKKwkJCXBTaGJDaXJCdWZmLT5tX3VsRGF0YUFwZW5kZWQgPSAwOworCQkJcFNoYkNpckJ1ZmYtPm1fdWxCbG9ja3NBcGVuZGVkID0gMDsKKwkJCXBTaGJDaXJCdWZmLT5tX3VsRGF0YVJlYWRhYmxlID0gMDsKKwkJCXBTaGJDaXJCdWZmLT5tX3VsQmxvY2tzUmVhZGFibGUgPSAwOworCQl9CisJCVNoYklwY0xlYXZlQXRvbWljU2VjdGlvbihwU2hiSW5zdGFuY2VfcCk7CisKKyNpZm5kZWYgTkRFQlVHCisJCXsKKwkJCW1lbXNldCgmcFNoYkNpckJ1ZmYtPm1fRGF0YSwgMHhDQywKKwkJCSAgICAgICBwU2hiQ2lyQnVmZi0+bV91bEJ1ZmZlckRhdGFTaXplKTsKKwkJfQorI2VuZGlmCisJfQorCisJLy8gY2FsbCBhcHBsaWNhdGlvbiBoYW5kbGVyCisJaWYgKHBTaGJDaXJCdWZmLT5tX3BmblNpZ0huZGxyUmVzZXQgIT0gTlVMTCkgeworCQlwU2hiQ2lyQnVmZi0+bV9wZm5TaWdIbmRsclJlc2V0KHBTaGJJbnN0YW5jZV9wLCBmVGltZU91dF9wKTsKKwl9CisKKwkvLyB1bmxvY2sgYnVmZmVyCisJU2hiSXBjRW50ZXJBdG9taWNTZWN0aW9uKHBTaGJJbnN0YW5jZV9wKTsKKwl7CisJCXBTaGJDaXJCdWZmLT5tX2ZCdWZmZXJMb2NrZWQgPSBGQUxTRTsKKwkJcFNoYkNpckJ1ZmYtPm1fcGZuU2lnSG5kbHJSZXNldCA9IE5VTEw7CisJfQorCVNoYklwY0xlYXZlQXRvbWljU2VjdGlvbihwU2hiSW5zdGFuY2VfcCk7CisKKwlyZXR1cm47CisKK30KKworI2VuZGlmCisKKy8vIEVPRgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9TaGFyZWRCdWZmLmggYi9kcml2ZXJzL3N0YWdpbmcvZXBsL1NoYXJlZEJ1ZmYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZWMxYjRiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9TaGFyZWRCdWZmLmgKQEAgLTAsMCArMSwyMDQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBQcm9qZWN0IGluZGVwZW5kZW5kIHNoYXJlZCBidWZmZXIgKGxpbmVhciArIGNpcmN1bGFyKQorCisgIERlc2NyaXB0aW9uOiAgRGVjbGFyYXRpb24gb2YgcGxhdGZvcm0gaW5kZXBlbmRlbmQgcGFydCBmb3IgdGhlCisgICAgICAgICAgICAgICAgc2hhcmVkIGJ1ZmZlcgorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIDIwMDYvMDYvMjcgLXJzOiAgIFYgMS4wMCAoaW5pdGlhbCB2ZXJzaW9uKQorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9TSEFSRURCVUZGX0hfCisjZGVmaW5lIF9TSEFSRURCVUZGX0hfCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgVHlwZSBkZWZpbml0aW9ucworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordHlwZWRlZiBlbnVtIHsKKwlrU2hiT2sgPSAwLAorCWtTaGJOb1JlYWRhYmxlRGF0YSA9IDEsCisJa1NoYkRhdGFUcnVuY2F0ZWQgPSAyLAorCWtTaGJCdWZmZXJGdWxsID0gMywKKwlrU2hiRGF0YU91dHNpZGVCdWZmZXJBcmVhID0gNCwKKwlrU2hiQnVmZmVyQWxyZWFkeUNvbXBsZXRlZCA9IDUsCisJa1NoYk1lbVVzZWRCeU90aGVyUHJvY3MgPSA2LAorCWtTaGJPcGVuTWlzbWF0Y2ggPSA3LAorCWtTaGJJbnZhbGlkQnVmZmVyVHlwZSA9IDgsCisJa1NoYkludmFsaWRBcmcgPSA5LAorCWtTaGJCdWZmZXJJbnZhbGlkID0gMTAsCisJa1NoYk91dE9mTWVtID0gMTEsCisJa1NoYkFscmVhZHlSZXNldGluZyA9IDEyLAorCWtTaGJBbHJlYWR5U2lnbmFsaW5nID0gMTMsCisJa1NoYkV4Y2VlZERhdGFTaXplTGltaXQgPSAxNCwKKworfSB0U2hiRXJyb3I7CisKKy8vIDIwMDYvMDgvMjQgZC5rLjogUHJpb3JpdHkgZm9yIHRocmVhZHMgKG5ldyBkYXRhLCBqb2Igc2lnbmFsaW5nKQordHlwZWRlZiBlbnVtIHsKKwlrU2hiUHJpb3JpdHlMb3cgPSAwLAorCWtTaGJQcmlvcml0eU5vcm1hbCA9IDEsCisJa3NoYlByaW9yaXR5SGlnaCA9IDIKK30gdFNoYlByaW9yaXR5OworCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgaW50IG1fdWlGdWxsQmxvY2tTaXplOwkvLyByZWFsIHNpemUgb2YgYWxsb2NhdGVkIGJsb2NrIChpbmNsLiBhbGlnbm1lbnQgZmlsbCBieXRlcykKKwl1bnNpZ25lZCBsb25nIG1fdWxBdmFpbGFibGVTaXplOwkvLyBzdGlsbCBhdmFpbGFibGUgc2l6ZSBmb3IgZGF0YQorCXVuc2lnbmVkIGxvbmcgbV91bFdySW5kZXg7CS8vIGN1cnJlbnQgd3JpdGUgaW5kZXgKKwl1bnNpZ25lZCBpbnQgbV9mQnVmZmVyQ29tcGxldGVkOwkvLyBUUlVFIGlmIGFsbG9jYXRlZCBibG9jayBpcyBjb21wbGV0ZSBmaWxsZWQgd2l0aCBkYXRhCisKK30gdFNoYkNpckNodW5rOworCit0eXBlZGVmIHZvaWQgKnRTaGJJbnN0YW5jZTsKKwordHlwZWRlZiB2b2lkICgqdFNoYkNpclNpZ0huZGxyTmV3RGF0YSkgKHRTaGJJbnN0YW5jZSBwU2hiSW5zdGFuY2VfcCwKKwkJCQkJdW5zaWduZWQgbG9uZyB1bERhdGFCbG9ja1NpemVfcCk7Cit0eXBlZGVmIHZvaWQgKCp0U2hiQ2lyU2lnSG5kbHJSZXNldCkgKHRTaGJJbnN0YW5jZSBwU2hiSW5zdGFuY2VfcCwKKwkJCQkgICAgICB1bnNpZ25lZCBpbnQgZlRpbWVPdXRfcCk7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgUHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiNpZiBkZWZpbmVkKElOTElORV9GVU5DVElPTl9ERUYpCisgICAgI3VuZGVmICBJTkxJTkVfRlVOQ1RJT04KKyAgICAjZGVmaW5lIElOTElORV9GVU5DVElPTiAgICAgSU5MSU5FX0ZVTkNUSU9OX0RFRgorICAgICNkZWZpbmUgSU5MSU5FX0VOQUJMRUQgICAgICBUUlVFCisgICAgI2RlZmluZSBTSEFSRURCVUZGX0lOTElORUQKKyAgICAjaW5jbHVkZSAiU2hhcmVkQnVmZi5jIgorI2VuZGlmCisqLworCisJdFNoYkVycm9yIFNoYkluaXQodm9pZCk7CisJdFNoYkVycm9yIFNoYkV4aXQodm9pZCk7CisKKy8vIENpcmN1bGFyIFNoYXJlZCBCdWZmZXIKKwl0U2hiRXJyb3IgU2hiQ2lyQWxsb2NCdWZmZXIodW5zaWduZWQgbG9uZyB1bEJ1ZmZlclNpemVfcCwKKwkJCQkgICAgY29uc3QgY2hhciAqcHN6QnVmZmVySURfcCwKKwkJCQkgICAgdFNoYkluc3RhbmNlICogcHBTaGJJbnN0YW5jZV9wLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgKnBmU2hiTmV3Q3JlYXRlZF9wKTsKKwl0U2hiRXJyb3IgU2hiQ2lyUmVsZWFzZUJ1ZmZlcih0U2hiSW5zdGFuY2UgcFNoYkluc3RhbmNlX3ApOworCisjaWYgIWRlZmluZWQoSU5MSU5FX0VOQUJMRUQpCisKKwl0U2hiRXJyb3IgU2hiQ2lyUmVzZXRCdWZmZXIodFNoYkluc3RhbmNlIHBTaGJJbnN0YW5jZV9wLAorCQkJCSAgICB1bnNpZ25lZCBsb25nIHVsVGltZU91dF9wLAorCQkJCSAgICB0U2hiQ2lyU2lnSG5kbHJSZXNldAorCQkJCSAgICBwZm5TaWduYWxIYW5kbGVyUmVzZXRfcCk7CisJdFNoYkVycm9yIFNoYkNpcldyaXRlRGF0YUJsb2NrKHRTaGJJbnN0YW5jZSBwU2hiSW5zdGFuY2VfcCwKKwkJCQkgICAgICAgY29uc3Qgdm9pZCAqcFNyY0RhdGFCbG9ja19wLAorCQkJCSAgICAgICB1bnNpZ25lZCBsb25nIHVsRGF0YUJsb2NrU2l6ZV9wKTsKKwl0U2hiRXJyb3IgU2hiQ2lyQWxsb2NEYXRhQmxvY2sodFNoYkluc3RhbmNlIHBTaGJJbnN0YW5jZV9wLAorCQkJCSAgICAgICB0U2hiQ2lyQ2h1bmsgKiBwU2hiQ2lyQ2h1bmtfcCwKKwkJCQkgICAgICAgdW5zaWduZWQgbG9uZyB1bERhdGFCdWZmZXJTaXplX3ApOworCXRTaGJFcnJvciBTaGJDaXJXcml0ZURhdGFDaHVuayh0U2hiSW5zdGFuY2UgcFNoYkluc3RhbmNlX3AsCisJCQkJICAgICAgIHRTaGJDaXJDaHVuayAqIHBTaGJDaXJDaHVua19wLAorCQkJCSAgICAgICBjb25zdCB2b2lkICpwU3JjRGF0YUNodW5rX3AsCisJCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgdWxEYXRhQ2h1bmtTaXplX3AsCisJCQkJICAgICAgIHVuc2lnbmVkIGludCAqcGZCdWZmZXJDb21wbGV0ZWRfcCk7CisJdFNoYkVycm9yIFNoYkNpclJlYWREYXRhQmxvY2sodFNoYkluc3RhbmNlIHBTaGJJbnN0YW5jZV9wLAorCQkJCSAgICAgIHZvaWQgKnBEc3REYXRhQmxvY2tfcCwKKwkJCQkgICAgICB1bnNpZ25lZCBsb25nIHVsUmRCdWZmU2l6ZV9wLAorCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgKnB1bERhdGFCbG9ja1NpemVfcCk7CisJdFNoYkVycm9yIFNoYkNpckdldFJlYWREYXRhU2l6ZSh0U2hiSW5zdGFuY2UgcFNoYkluc3RhbmNlX3AsCisJCQkJCXVuc2lnbmVkIGxvbmcgKnB1bERhdGFCbG9ja1NpemVfcCk7CisJdFNoYkVycm9yIFNoYkNpckdldFJlYWRCbG9ja0NvdW50KHRTaGJJbnN0YW5jZSBwU2hiSW5zdGFuY2VfcCwKKwkJCQkJICB1bnNpZ25lZCBsb25nICpwdWxEYXRhQmxvY2tDb3VudF9wKTsKKwl0U2hiRXJyb3IgU2hiQ2lyU2V0U2lnbmFsSGFuZGxlck5ld0RhdGEodFNoYkluc3RhbmNlIHBTaGJJbnN0YW5jZV9wLAorCQkJCQkJdFNoYkNpclNpZ0huZGxyTmV3RGF0YQorCQkJCQkJcGZuU2hiU2lnbmFsSGFuZGxlck5ld0RhdGFfcCwKKwkJCQkJCXRTaGJQcmlvcml0eSBTaGJQcmlvcml0eV9wKTsKKworI2VuZGlmCisKKy8vIExpbmVhciBTaGFyZWQgQnVmZmVyCisJdFNoYkVycm9yIFNoYkxpbkFsbG9jQnVmZmVyKHVuc2lnbmVkIGxvbmcgdWxCdWZmZXJTaXplX3AsCisJCQkJICAgIGNvbnN0IGNoYXIgKnBzekJ1ZmZlcklEX3AsCisJCQkJICAgIHRTaGJJbnN0YW5jZSAqIHBwU2hiSW5zdGFuY2VfcCwKKwkJCQkgICAgdW5zaWduZWQgaW50ICpwZlNoYk5ld0NyZWF0ZWRfcCk7CisJdFNoYkVycm9yIFNoYkxpblJlbGVhc2VCdWZmZXIodFNoYkluc3RhbmNlIHBTaGJJbnN0YW5jZV9wKTsKKworI2lmICFkZWZpbmVkKElOTElORV9FTkFCTEVEKQorCisJdFNoYkVycm9yIFNoYkxpbldyaXRlRGF0YUJsb2NrKHRTaGJJbnN0YW5jZSBwU2hiSW5zdGFuY2VfcCwKKwkJCQkgICAgICAgdW5zaWduZWQgbG9uZyB1bERzdEJ1ZmZlck9mZnNfcCwKKwkJCQkgICAgICAgY29uc3Qgdm9pZCAqcFNyY0RhdGFCbG9ja19wLAorCQkJCSAgICAgICB1bnNpZ25lZCBsb25nIHVsRGF0YUJsb2NrU2l6ZV9wKTsKKwl0U2hiRXJyb3IgU2hiTGluUmVhZERhdGFCbG9jayh0U2hiSW5zdGFuY2UgcFNoYkluc3RhbmNlX3AsCisJCQkJICAgICAgdm9pZCAqcERzdERhdGFCbG9ja19wLAorCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgdWxTcmNCdWZmZXJPZmZzX3AsCisJCQkJICAgICAgdW5zaWduZWQgbG9uZyB1bERhdGFCbG9ja1NpemVfcCk7CisKKyNlbmRpZgorCisjaWZuZGVmIE5ERUJVRworCXRTaGJFcnJvciBTaGJDaXJUcmFjZUJ1ZmZlcih0U2hiSW5zdGFuY2UgcFNoYkluc3RhbmNlX3ApOworCXRTaGJFcnJvciBTaGJMaW5UcmFjZUJ1ZmZlcih0U2hiSW5zdGFuY2UgcFNoYkluc3RhbmNlX3ApOworCXRTaGJFcnJvciBTaGJUcmFjZUR1bXAoY29uc3QgdW5zaWduZWQgY2hhciAqcGFiU3RhcnRBZGRyX3AsCisJCQkgICAgICAgdW5zaWduZWQgbG9uZyB1bERhdGFTaXplX3AsCisJCQkgICAgICAgdW5zaWduZWQgbG9uZyB1bEFkZHJPZmZzZXRfcCwKKwkJCSAgICAgICBjb25zdCBjaGFyICpwc3pJbmZvVGV4dF9wKTsKKyNlbHNlCisjZGVmaW5lIFNoYkNpclRyYWNlQnVmZmVyKHAwKQorI2RlZmluZSBTaGJMaW5UcmFjZUJ1ZmZlcihwMCkKKyNkZWZpbmUgU2hiVHJhY2VEdW1wKHAwLCBwMSwgcDIsIHAzKQorI2VuZGlmCisKKyN1bmRlZiAgSU5MSU5FX0VOQUJMRUQJCS8vIGRpc2FibGUgYWN0dWFsIGlubGluaW5nIG9mIGZ1bmN0aW9ucworI3VuZGVmICBJTkxJTkVfRlVOQ1RJT04KKyNkZWZpbmUgSU5MSU5FX0ZVTkNUSU9OCQkvLyBkZWZpbmUgSU5MSU5FX0ZVTkNUSU9OIHRvIG5vdGhpbmcKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKyNlbmRpZgkJCQkvLyAjaWZuZGVmIF9TSEFSRURCVUZGX0hfCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL1NoYklwYy1MaW51eEtlcm5lbC5jIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9TaGJJcGMtTGludXhLZXJuZWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDNjYjNmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9TaGJJcGMtTGludXhLZXJuZWwuYwpAQCAtMCwwICsxLDk2NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIFByb2plY3QgaW5kZXBlbmRlbmQgc2hhcmVkIGJ1ZmZlciAobGluZWFyICsgY2lyY3VsYXIpCisKKyAgRGVzY3JpcHRpb246ICBJbXBsZW1lbnRhdGlvbiBvZiBwbGF0Zm9ybSBzcGVjaWZpYyBwYXJ0IGZvciB0aGUKKyAgICAgICAgICAgICAgICBzaGFyZWQgYnVmZmVyCisgICAgICAgICAgICAgICAgKEltcGxlbWVudGF0aW9uIGZvciBMaW51eCBLZXJuZWxTcGFjZSkKKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAyMDA2LzA2LzI4IC1yczogICBWIDEuMDAgKGluaXRpYWwgdmVyc2lvbikKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgImdsb2JhbC5oIgorI2luY2x1ZGUgIlNoYXJlZEJ1ZmYuaCIKKyNpbmNsdWRlICJTaGJJcGMuaCIKKyNpbmNsdWRlICJTaGJMaW51eEtlcm5lbC5oIgorI2luY2x1ZGUgIkRlYnVnLmgiCisKKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisvLyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9wYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgRyBMIE8gQiBBIEwgICBEIEUgRiBJIE4gSSBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmICghZGVmaW5lZChTSEJJUENfSU5MSU5FRCkpIHx8IGRlZmluZWQoU0hCSVBDX0lOTElORV9FTkFCTEVEKQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIENvbmZpZ3VyYXRpb24KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgQ29uc3RhbnQgZGVmaW5pdGlvbnMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNkZWZpbmUgTUFYX0xFTl9CVUZGRVJfSUQgICAgICAgMjU2CisKKyNkZWZpbmUgVElNRU9VVF9FTlRFUl9BVE9NSUMgICAgMTAwMAkvLyAobXMpIGZvciBkZWJnZ2luZzogSU5GSU5JVEUKKyNkZWZpbmUgVElNRU9VVF9URVJNX1RIUkVBRCAgICAgMTAwMAorI2RlZmluZSBJTkZJTklURSAgICAgICAgICAgICAgICAzNjAwCisKKyNkZWZpbmUgU0JJX01BR0lDX0lEICAgICAgICAgICAgMHg1MzQyNDkyQgkvLyBtYWdpYyBJRCAoIlNCSSsiKQorI2RlZmluZSBTQkhfTUFHSUNfSUQgICAgICAgICAgICAweDUzNDI0ODJBCS8vIG1hZ2ljIElEICgiU0JIKiIpCisKKyNkZWZpbmUgSU5WQUxJRF9JRCAgICAgICAgICAgICAgLTEKKworI2RlZmluZSBUQUJMRV9TSVpFICAgICAgICAgICAgICAxMAorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIExvY2FsIHR5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBUaGlzIHN0cnVjdHVyZSBpcyB0aGUgY29tbW9uIGhlYWRlciBmb3IgdGhlIHNoYXJlZCBtZW1vcnkgcmVnaW9uIHVzZWQKKy8vIGJ5IGFsbCBwcm9jZXNzZXMgYXR0YWNoZWQgdGhpcyBzaGFyZWQgbWVtb3J5LiBJdCBpbmNsdWRlcyBjb21tb24KKy8vIGluZm9ybWF0aW9uIHRvIGFkbWluaXN0cmF0ZS9tYW5hZ2UgdGhlIHNoYXJlZCBidWZmZXIgZnJvbSBhIGNvdXBsZSBvZgorLy8gc2VwYXJhdGVkIHByb2Nlc3NlcyAoZS5nLiB0aGUgcmVmZXJuY2UgY291bnRlcikuIFRoaXMgc3RydWN0dXJlIGlzCisvLyBsb2NhdGVkIGF0IHRoZSBzdGFydCBvZiB0aGUgc2hhcmVkIG1lbW9yeSByZWdpb24gaXRzZWxmIGFuZCBleGlzdHMKKy8vIGNvbnNlcXVlbnRseSBvbmx5IG9uZSB0aW1lcyBwZXIgc2hhcmVkIG1lbW9yeSBpbnN0YW5jZS4KK3R5cGVkZWYgc3RydWN0IHsKKworCXVuc2lnbmVkIGxvbmcgbV91bFNoTWVtU2l6ZTsKKwl1bnNpZ25lZCBsb25nIG1fdWxSZWZDb3VudDsKKwlpbnQgbV9pQnVmZmVySWQ7CisvLyAgICBpbnQgICAgICAgICAgICAgICAgIG1faVVzZXJTcGFjZU1lbTsgICAgICAgICAgIC8vMCBmb3IgdXNlcnNwYWNlIG1lbSAgICE9MCBrZXJuZWxzcGFjZSBtZW0KKwlzcGlubG9ja190IG1fU3BpbmxvY2tCdWZmQWNjZXNzOworCUJPT0wgbV9mTmV3RGF0YTsKKwlCT09MIG1fZkpvYlJlYWR5OworCXdhaXRfcXVldWVfaGVhZF90IG1fV2FpdFF1ZXVlTmV3RGF0YTsKKwl3YWl0X3F1ZXVlX2hlYWRfdCBtX1dhaXRRdWV1ZUpvYlJlYWR5OworCisjaWZuZGVmIE5ERUJVRworCXVuc2lnbmVkIGxvbmcgbV91bE93bmVyUHJvY0lEOworI2VuZGlmCisKK30gdFNoYk1lbUhlYWRlcjsKKworLy8gVGhpcyBzdHJ1Y3R1cmUgaXMgdGhlICJleHRlcm5hbCBlbnRyeSBwb2ludCIgZnJvbSBhIHNlcGFyYXRlIHByb2Nlc3MKKy8vIHRvIGdldCBhY2Nlc3MgdG8gYSBzaGFyZWQgYnVmZmVyLiBUaGlzIHN0cnVjdHVyZSBpbmNsdWRlcyBhbGwgcGxhdGZvcm0KKy8vIHJlc3AuIHRhcmdldCBzcGVjaWZpYyBpbmZvcm1hdGlvbiB0byBhZG1pbmlzdHJhdGUvbWFuYWdlIHRoZSBzaGFyZWQKKy8vIGJ1ZmZlciBmcm9tIGEgc2VwYXJhdGUgcHJvY2Vzcy4gRXZlcnkgcHJvY2VzcyBhdHRhY2hlZCB0byB0aGUgc2hhcmVkCisvLyBidWZmZXIgaGFzIGl0cyBvd24gcnVudGltZSBpbnN0YW5jZSBvZiB0aGlzIHN0cnVjdHVyZSB3aXRoIGl0cyBpbmRpdmlkdWFsCisvLyBydW50aW1lIGRhdGEgKGUuZy4gdGhlIHNjb3BlIG9mIGFuIGV2ZW50IGhhbmRsZSBpcyBsaW1pdHRlZCB0byB0aGUKKy8vIG93bmVyIHByb2Nlc3Mgb25seSkuIFRoZSBzdHJ1Y3R1cmUgbWVtYmVyIDxtX3BTaGJNZW1IZWFkZXI+IHBvaW50cworLy8gdG8gdGhlIChwcm9jZXNzIHNwZWNpZmljKSBzdGFydCBhZGRyZXNzIG9mIHRoZSBzaGFyZWQgbWVtb3J5IHJlZ2lvbgorLy8gaXRzZWxmLgordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGxvbmcgbV9TYmlNYWdpY0lEOwkvLyBtYWdpYyBJRCAoIlNCSSsiKQorLy8gICAgdm9pZCogICAgICAgICAgICAgICBtX3BTaGFyZWRNZW07CisJaW50IG1fdFRocmVhZE5ld0RhdGFJZDsKKwlsb25nIG1fbFRocmVhZE5ld0RhdGFOaWNlOwkvLyBuaWNlIHZhbHVlIG9mIHRoZSBuZXcgZGF0YSB0aHJlYWQKKwlpbnQgbV90VGhyZWFkSm9iUmVhZHlJZDsKKwl1bnNpZ25lZCBsb25nIG1fdWxGbGFnc0J1ZmZBY2Nlc3M7CS8vIGQuay4gbW92ZWQgZnJvbSB0U2hiTWVtSGVhZGVyLCBiZWNhdXNlIGVhY2gKKwkvLyBwcm9jZXNzIG5lZWRzIHRvIHN0b3JlIHRoZSBpbnRlcnJ1cHQgZmxhZ3Mgc2VwYXJhdGVseQorCXRTaWdIbmRsck5ld0RhdGEgbV9wZm5TaWdIbmRsck5ld0RhdGE7CisJdW5zaWduZWQgbG9uZyBtX3VsVGltZU91dEpvYlJlYWR5OworCXRTaWdIbmRsckpvYlJlYWR5IG1fcGZuU2lnSG5kbHJKb2JSZWFkeTsKKwl0U2hiTWVtSGVhZGVyICptX3BTaGJNZW1IZWFkZXI7CisJaW50IG1faVRocmVhZFRlcm1GbGFnOworCXN0cnVjdCBjb21wbGV0aW9uIG1fQ29tcGxldGlvbk5ld0RhdGE7CisvKgorICAgIHN0cnVjdCBzZW1hcGhvcmUgICAgKm1fcFNlbUJ1ZmZBY2Nlc3M7CisgICAgc3RydWN0IHNlbWFwaG9yZSAgICAqbV9wU2VtTmV3RGF0YTsKKyAgICBzdHJ1Y3Qgc2VtYXBob3JlICAgICptX3BTZW1TdG9wU2lnbmFsaW5nTmV3RGF0YTsKKyAgICBzdHJ1Y3Qgc2VtYXBob3JlICAgICptX3BTZW1Kb2JSZWFkeTsKKyovCisjaWZuZGVmIE5ERUJVRworCXVuc2lnbmVkIGxvbmcgbV91bFRocmVhZElETmV3RGF0YTsKKwl1bnNpZ25lZCBsb25nIG1fdWxUaHJlYWRJREpvYlJlYWR5OworI2VuZGlmCit9IHRTaGJNZW1JbnN0OworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIFByb3RvdHlwZXMgb2YgaW50ZXJuYWwgZnVuY3Rpb25zCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvL3RTaGJNZW1JbnN0KiAgICAgICAgICAgIFNoYklwY0dldFNoYk1lbUluc3QgICAgICAgICAodFNoYkluc3RhbmNlIHBTaGJJbnN0YW5jZV9wKTsKKy8vdFNoYk1lbUhlYWRlciogICAgICAgICAgU2hiSXBjR2V0U2hiTWVtSGVhZGVyICAgICAgICh0U2hiTWVtSW5zdCogcFNoYk1lbUluc3RfcCk7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgR2V0IHBvaW50ZXIgdG8gcHJvY2VzcyBsb2NhbCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBpbmxpbmUgdFNoYk1lbUluc3QgKlNoYklwY0dldFNoYk1lbUluc3QodFNoYkluc3RhbmNlIHBTaGJJbnN0YW5jZV9wKQoreworCisJdFNoYk1lbUluc3QgKnBTaGJNZW1JbnN0OworCisJcFNoYk1lbUluc3QgPSAodFNoYk1lbUluc3QgKikgcFNoYkluc3RhbmNlX3A7CisKKwlyZXR1cm4gKHBTaGJNZW1JbnN0KTsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIEdldCBwb2ludGVyIHRvIHNoYXJlZCBtZW1vcnkgaGVhZGVyCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgaW5saW5lIHRTaGJNZW1IZWFkZXIgKlNoYklwY0dldFNoYk1lbUhlYWRlcih0U2hiTWVtSW5zdCAqIHBTaGJNZW1JbnN0X3ApCit7CisKKwl0U2hiTWVtSGVhZGVyICpwU2hiTWVtSGVhZGVyOworCisJcFNoYk1lbUhlYWRlciA9IHBTaGJNZW1JbnN0X3AtPm1fcFNoYk1lbUhlYWRlcjsKKworCXJldHVybiAocFNoYk1lbUhlYWRlcik7CisKK30KKworLy8gIEdldCBwb2ludGVyIHRvIHByb2Nlc3MgbG9jYWwgaW5mb3JtYXRpb24gc3RydWN0dXJlCisvLyNkZWZpbmUgU2hiSXBjR2V0U2hiTWVtSW5zdChwU2hiSW5zdGFuY2VfcCkgKCh0U2hiTWVtSW5zdCopcFNoYkluc3RhbmNlX3ApCisKKy8vICBHZXQgcG9pbnRlciB0byBzaGFyZWQgbWVtb3J5IGhlYWRlcgorLy8jZGVmaW5lIFNoYklwY0dldFNoYk1lbUhlYWRlcihwU2hiTWVtSW5zdF9wKSAocFNoYk1lbUluc3RfcC0+bV9wU2hiTWVtSGVhZGVyKQorCisvLyBub3QgaW5saW5lZCBpbnRlcm5hbCBmdW5jdGlvbnMKK2ludCBTaGJJcGNUaHJlYWRTaWduYWxOZXdEYXRhKHZvaWQgKnB2VGhyZWFkUGFyYW1fcCk7CitpbnQgU2hiSXBjVGhyZWFkU2lnbmFsSm9iUmVhZHkodm9pZCAqcHZUaHJlYWRQYXJhbV9wKTsKKyNlbmRpZgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbW9kdWwgZ2xvYmFsZSB2YXJzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWYgIWRlZmluZWQoU0hCSVBDX0lOTElORV9FTkFCTEVEKQorc3RydWN0IHNTaGJNZW1UYWJsZSAqcHNNZW1UYWJsZUVsZW1lbnRGaXJzdF9nOworCitzdGF0aWMgdm9pZCAqU2hiSXBjQWxsb2NQcml2YXRlTWVtKHVuc2lnbmVkIGxvbmcgdWxNZW1TaXplX3ApOworc3RhdGljIGludCBTaGJJcGNGaW5kTGlzdEVsZW1lbnQoaW50IGlCdWZmZXJJZCwKKwkJCQkgc3RydWN0IHNTaGJNZW1UYWJsZQorCQkJCSAqKnBwc1JldHVybk1lbVRhYmxlRWxlbWVudCk7CitzdGF0aWMgdm9pZCBTaGJJcGNBcHBlbmRMaXN0RWxlbWVudChzdHJ1Y3Qgc1NoYk1lbVRhYmxlICpzTmV3TWVtVGFibGVFbGVtZW50KTsKK3N0YXRpYyB2b2lkIFNoYklwY0RlbGV0ZUxpc3RFbGVtZW50KGludCBpQnVmZmVySWQpOworc3RhdGljIHZvaWQgU2hiSXBjQ3JjMzJHZW5UYWJsZSh1bnNpZ25lZCBsb25nIGF1bENyY1RhYmxlWzI1Nl0pOworc3RhdGljIHVuc2lnbmVkIGxvbmcgU2hiSXBjQ3JjMzJHZXRDcmMoY29uc3QgY2hhciAqcGNTdHJpbmcsCisJCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgYXVsQ3JjVGFibGVbMjU2XSk7CisKKyNlbmRpZgorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgIFAgVSBCIEwgSSBDICAgRiBVIE4gQyBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKworI2lmICFkZWZpbmVkKFNIQklQQ19JTkxJTkVfRU5BQkxFRCkKKy8vIG5vdCBpbmxpbmVkIGV4dGVybmFsIGZ1bmN0aW9ucworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIEluaXRpYWxpemUgSVBDIGZvciBTaGFyZWQgQnVmZmVyIE1vZHVsZQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordFNoYkVycm9yIFNoYklwY0luaXQodm9pZCkKK3sKKwlwc01lbVRhYmxlRWxlbWVudEZpcnN0X2cgPSBOVUxMOworCXJldHVybiAoa1NoYk9rKTsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIERlaW5pdGlhbGl6ZSBJUEMgZm9yIFNoYXJlZCBCdWZmZXIgTW9kdWxlCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0U2hiRXJyb3IgU2hiSXBjRXhpdCh2b2lkKQoreworCisJcmV0dXJuIChrU2hiT2spOworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgQWxsb2NhdGUgU2hhcmVkIEJ1ZmZlcgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordFNoYkVycm9yIFNoYklwY0FsbG9jQnVmZmVyKHVuc2lnbmVkIGxvbmcgdWxCdWZmZXJTaXplX3AsCisJCQkgICAgY29uc3QgY2hhciAqcHN6QnVmZmVySURfcCwKKwkJCSAgICB0U2hiSW5zdGFuY2UgKiBwcFNoYkluc3RhbmNlX3AsCisJCQkgICAgdW5zaWduZWQgaW50ICpwZlNoYk5ld0NyZWF0ZWRfcCkKK3sKKwl0U2hiRXJyb3IgU2hiRXJyb3I7CisJaW50IGlCdWZmZXJJZCA9IDA7CisJdW5zaWduZWQgbG9uZyB1bENyYzMyID0gMDsKKwl1bnNpZ25lZCBpbnQgdWlGaXJzdFByb2Nlc3MgPSAwOworCXVuc2lnbmVkIGxvbmcgdWxTaE1lbVNpemU7CisJdFNoYk1lbUhlYWRlciAqcFNoYk1lbUhlYWRlcjsKKwl0U2hiTWVtSW5zdCAqcFNoYk1lbUluc3QgPSBOVUxMOworCXRTaGJJbnN0YW5jZSBwU2hiSW5zdGFuY2U7CisJdW5zaWduZWQgaW50IGZTaE1lbU5ld0NyZWF0ZWQgPSBGQUxTRTsKKwl2b2lkICpwU2hhcmVkTWVtID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIGF1bENyY1RhYmxlWzI1Nl07CisJc3RydWN0IHNTaGJNZW1UYWJsZSAqcHNNZW1UYWJsZUVsZW1lbnQ7CisKKwlERUJVR19MVkxfMjlfVFJBQ0UwKCJTaGJJcGNBbGxvY0J1ZmZlciBcbiIpOworCXVsU2hNZW1TaXplID0gdWxCdWZmZXJTaXplX3AgKyBzaXplb2YodFNoYk1lbUhlYWRlcik7CisKKwkvL2NyZWF0ZSBCdWZmZXIgSUQKKwlTaGJJcGNDcmMzMkdlblRhYmxlKGF1bENyY1RhYmxlKTsKKwl1bENyYzMyID0gU2hiSXBjQ3JjMzJHZXRDcmMocHN6QnVmZmVySURfcCwgYXVsQ3JjVGFibGUpOworCWlCdWZmZXJJZCA9IHVsQ3JjMzI7CisJREVCVUdfTFZMXzI5X1RSQUNFMgorCSAgICAoIlNoYklwY0FsbG9jQnVmZmVyIEJ1ZmZlclNpemU6JWQgc2l6ZW9mKHRTaGIuLik6JWRcbiIsCisJICAgICB1bEJ1ZmZlclNpemVfcCwgc2l6ZW9mKHRTaGJNZW1IZWFkZXIpKTsKKwlERUJVR19MVkxfMjlfVFJBQ0UyKCJTaGJJcGNBbGxvY0J1ZmZlciBCdWZmZXJJZDolZCBNZW1TaXplOiVkXG4iLAorCQkJICAgIGlCdWZmZXJJZCwgdWxTaE1lbVNpemUpOworCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJLy8gKDEpIG9wZW4gYW4gZXhpc3Rpbmcgb3IgY3JlYXRlIGEgbmV3IHNoYXJlZCBtZW1vcnkKKwkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCS8vdGVzdCBpZiBidWZmZXIgYWxyZWFkeSBleGlzdHMKKwlpZiAoU2hiSXBjRmluZExpc3RFbGVtZW50KGlCdWZmZXJJZCwgJnBzTWVtVGFibGVFbGVtZW50KSA9PSAwKSB7CisJCS8vQnVmZmVyIGFscmVhZHkgZXhpc3RzCisJCWZTaE1lbU5ld0NyZWF0ZWQgPSBGQUxTRTsKKwkJcFNoYXJlZE1lbSA9IHBzTWVtVGFibGVFbGVtZW50LT5tX3BCdWZmZXI7CisJCURFQlVHX0xWTF8yOV9UUkFDRTEKKwkJICAgICgiU2hiSXBjQWxsb2NCdWZmZXIgYXR0YWNoIEJ1ZmZlciBhdDolcCBJZDolZFxuIiwKKwkJICAgICBwU2hhcmVkTWVtKTsKKwkJdWlGaXJzdFByb2Nlc3MgPSAxOworCX0gZWxzZSB7CisJCS8vY3JlYXRlIG5ldyBCdWZmZXIKKwkJZlNoTWVtTmV3Q3JlYXRlZCA9IFRSVUU7CisJCXVpRmlyc3RQcm9jZXNzID0gMDsKKwkJcFNoYXJlZE1lbSA9IGttYWxsb2ModWxTaE1lbVNpemUsIEdGUF9LRVJORUwpOworCQlERUJVR19MVkxfMjlfVFJBQ0UyCisJCSAgICAoIlNoYklwY0FsbG9jQnVmZmVyIENyZWF0ZSBOZXcgQnVmZmVyIGF0OiVwIElkOiVkXG4iLAorCQkgICAgIHBTaGFyZWRNZW0sIGlCdWZmZXJJZCk7CisJCWlmIChwU2hhcmVkTWVtID09IE5VTEwpIHsKKwkJCS8vdW5hYmxlIHRvIGNyZWF0ZSBtZW0KKwkJCVNoYkVycm9yID0ga1NoYk91dE9mTWVtOworCQkJZ290byBFeGl0OworCQl9CisJCURFQlVHX0xWTF8yOV9UUkFDRTAoIlNoYklwY0FsbG9jQnVmZmVyIGNyZWF0ZSBzZW1hc1xuIik7CisJCS8vIGFwcGVuZCBFbGVtZW50IHRvIE1lbSBUYWJsZQorCQlwc01lbVRhYmxlRWxlbWVudCA9CisJCSAgICBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc1NoYk1lbVRhYmxlKSwgR0ZQX0tFUk5FTCk7CisJCXBzTWVtVGFibGVFbGVtZW50LT5tX2lCdWZmZXJJZCA9IGlCdWZmZXJJZDsKKwkJcHNNZW1UYWJsZUVsZW1lbnQtPm1fcEJ1ZmZlciA9IHBTaGFyZWRNZW07CisJCXBzTWVtVGFibGVFbGVtZW50LT5tX3BzTmV4dE1lbVRhYmxlRWxlbWVudCA9IE5VTEw7CisJCVNoYklwY0FwcGVuZExpc3RFbGVtZW50KHBzTWVtVGFibGVFbGVtZW50KTsKKwl9CisKKwlERUJVR19MVkxfMjlfVFJBQ0UwKCJTaGJJcGNBbGxvY0J1ZmZlciB1cGRhdGUgaGVhZGVyXG4iKTsKKwkvL3VwZGF0ZSBoZWFkZXIKKwlwU2hiTWVtSGVhZGVyID0gKHRTaGJNZW1IZWFkZXIgKikgcFNoYXJlZE1lbTsKKwlERUJVR19MVkxfMjlfVFJBQ0UxCisJICAgICgiU2hiSXBjQWxsb2NCdWZmZXIgMCBwU2hiTWVtSGVhZGVyLT5tX3VsU2hNZW1TaXplOiAlZFxuIiwKKwkgICAgIHBTaGJNZW1IZWFkZXItPm1fdWxTaE1lbVNpemUpOworCS8vIGFsbG9jYXRlIGEgbWVtb3J5IGJsb2NrIGZyb20gcHJvY2VzcyBzcGVjaWZpYyBtZW1wb29sIHRvIHNhdmUKKwkvLyBwcm9jZXNzIGxvY2FsIGluZm9ybWF0aW9uIHRvIGFkbWluaXN0cmF0ZS9tYW5hZ2UgdGhlIHNoYXJlZCBidWZmZXIKKwlERUJVR19MVkxfMjlfVFJBQ0UwKCJTaGJJcGNBbGxvY0J1ZmZlciBhbGxvYyBwcml2YXRlIG1lbVxuIik7CisJcFNoYk1lbUluc3QgPQorCSAgICAodFNoYk1lbUluc3QgKikgU2hiSXBjQWxsb2NQcml2YXRlTWVtKHNpemVvZih0U2hiTWVtSW5zdCkpOworCWlmIChwU2hiTWVtSW5zdCA9PSBOVUxMKSB7CisJCVNoYkVycm9yID0ga1NoYk91dE9mTWVtOworCQlnb3RvIEV4aXQ7CisJfQorCS8vIHJlc2V0IGNvbXBsZXRlIGhlYWRlciB0byBkZWZhdWx0IHZhbHVlcworCS8vcFNoYk1lbUluc3QtPm1fU2JpTWFnaWNJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBTQklfTUFHSUNfSUQ7CisvLyAgICBwU2hiTWVtSW5zdC0+bV9wU2hhcmVkTWVtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gcFNoYXJlZE1lbTsKKwlwU2hiTWVtSW5zdC0+bV90VGhyZWFkTmV3RGF0YUlkID0gSU5WQUxJRF9JRDsKKwlwU2hiTWVtSW5zdC0+bV90VGhyZWFkSm9iUmVhZHlJZCA9IElOVkFMSURfSUQ7CisJcFNoYk1lbUluc3QtPm1fcGZuU2lnSG5kbHJOZXdEYXRhID0gTlVMTDsKKwlwU2hiTWVtSW5zdC0+bV91bFRpbWVPdXRKb2JSZWFkeSA9IDA7CisJcFNoYk1lbUluc3QtPm1fcGZuU2lnSG5kbHJKb2JSZWFkeSA9IE5VTEw7CisJcFNoYk1lbUluc3QtPm1fcFNoYk1lbUhlYWRlciA9IHBTaGJNZW1IZWFkZXI7CisJcFNoYk1lbUluc3QtPm1faVRocmVhZFRlcm1GbGFnID0gMDsKKworCS8vIGluaXRpYWxpemUgY29tcGxldGlvbiBldGMuCisJaW5pdF9jb21wbGV0aW9uKCZwU2hiTWVtSW5zdC0+bV9Db21wbGV0aW9uTmV3RGF0YSk7CisKKwlTaGJFcnJvciA9IGtTaGJPazsKKwlpZiAoZlNoTWVtTmV3Q3JlYXRlZCkgeworCQkvLyB0aGlzIHByb2Nlc3Mgd2FzIHRoZSBmaXJzdCB3aG8gd2FudGVkIHRvIHVzZSB0aGUgc2hhcmVkIG1lbW9yeSwKKwkJLy8gc28gYSBuZXcgc2hhcmVkIG1lbW9yeSB3YXMgY3JlYXRlZAorCQkvLyAtPiBzZXR1cCBuZXcgaGVhZGVyIGluZm9ybWF0aW9uIGluc2lkZSB0aGUgc2hhcmVkIG1lbW9yeSByZWdpb24KKwkJLy8gICAgaXRzZWxmCisJCXBTaGJNZW1IZWFkZXItPm1fdWxTaE1lbVNpemUgPSB1bFNoTWVtU2l6ZTsKKwkJcFNoYk1lbUhlYWRlci0+bV91bFJlZkNvdW50ID0gMTsKKwkJcFNoYk1lbUhlYWRlci0+bV9pQnVmZmVySWQgPSBpQnVmZmVySWQ7CisJCS8vIGluaXRpYWxpemUgc3BpbmxvY2sKKwkJc3Bpbl9sb2NrX2luaXQoJnBTaGJNZW1IZWFkZXItPm1fU3BpbmxvY2tCdWZmQWNjZXNzKTsKKwkJLy8gaW5pdGlhbGl6ZSB3YWl0IHF1ZXVlcworCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZwU2hiTWVtSGVhZGVyLT5tX1dhaXRRdWV1ZU5ld0RhdGEpOworCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZwU2hiTWVtSGVhZGVyLT5tX1dhaXRRdWV1ZUpvYlJlYWR5KTsKKwl9IGVsc2UgeworCQkvLyBhbnkgb3RoZXIgcHJvY2VzcyBoYXMgY3JlYXRlZCB0aGUgc2hhcmVkIG1lbW9yeSBhbmQgdGhpcworCQkvLyBwcm9jZXNzIG9ubHkgaGFzIHRvIGF0dGFjaCB0byBpdAorCQkvLyAtPiBjaGVjayBhbmQgdXBkYXRlIGV4aXN0aW5nIGhlYWRlciBpbmZvcm1hdGlvbiBpbnNpZGUgdGhlCisJCS8vICAgIHNoYXJlZCBtZW1vcnkgcmVnaW9uIGl0c2VsZgorCQlpZiAocFNoYk1lbUhlYWRlci0+bV91bFNoTWVtU2l6ZSAhPSB1bFNoTWVtU2l6ZSkgeworCQkJU2hiRXJyb3IgPSBrU2hiT3Blbk1pc21hdGNoOworCQkJZ290byBFeGl0OworCQl9CisJCXBTaGJNZW1IZWFkZXItPm1fdWxSZWZDb3VudCsrOworCX0KKworICAgICAgRXhpdDoKKwlwU2hiSW5zdGFuY2UgPSAodFNoYkluc3RhbmNlICopIHBTaGJNZW1JbnN0OworCSpwZlNoYk5ld0NyZWF0ZWRfcCA9IGZTaE1lbU5ld0NyZWF0ZWQ7CisJKnBwU2hiSW5zdGFuY2VfcCA9IHBTaGJJbnN0YW5jZTsKKwlyZXR1cm4gKFNoYkVycm9yKTsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIFJlbGVhc2UgU2hhcmVkIEJ1ZmZlcgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordFNoYkVycm9yIFNoYklwY1JlbGVhc2VCdWZmZXIodFNoYkluc3RhbmNlIHBTaGJJbnN0YW5jZV9wKQoreworCXRTaGJNZW1JbnN0ICpwU2hiTWVtSW5zdDsKKwl0U2hiTWVtSGVhZGVyICpwU2hiTWVtSGVhZGVyOworCXRTaGJFcnJvciBTaGJFcnJvcjsKKwl0U2hiRXJyb3IgU2hiRXJyb3IyOworCisJREVCVUdfTFZMXzI2X1RSQUNFMSgiU2hiSXBjUmVsZWFzZUJ1ZmZlciglcClcbiIsIHBTaGJJbnN0YW5jZV9wKTsKKwlpZiAocFNoYkluc3RhbmNlX3AgPT0gTlVMTCkgeworCQlyZXR1cm4gKGtTaGJPayk7CisJfQorCXBTaGJNZW1JbnN0ID0gU2hiSXBjR2V0U2hiTWVtSW5zdChwU2hiSW5zdGFuY2VfcCk7CisJcFNoYk1lbUhlYWRlciA9IFNoYklwY0dldFNoYk1lbUhlYWRlcihwU2hiTWVtSW5zdCk7CisKKwkvLyBzdG9wIHRocmVhZHMgaW4gYW55IGNhc2UsIGJlY2F1c2UgdGhleSBhcmUgYm91bmQgdG8gdGhhdCBzcGVjaWZpYyBpbnN0YW5jZQorCVNoYkVycm9yMiA9IFNoYklwY1N0b3BTaWduYWxpbmdOZXdEYXRhKHBTaGJJbnN0YW5jZV9wKTsKKwkvLyBkLmsuOiBXaGF0cyB1cCB3aXRoIEpvYlJlYWR5IHRocmVhZD8KKwkvLyAgICAgICBKdXN0IHdha2UgaXQgdXAsIGJ1dCB3aXRob3V0IHNldHRpbmcgdGhlIHNlbWFwaG9yZSB2YXJpYWJsZQorCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcFNoYk1lbUhlYWRlci0+bV9XYWl0UXVldWVKb2JSZWFkeSk7CisKKwlpZiAoIS0tcFNoYk1lbUhlYWRlci0+bV91bFJlZkNvdW50KSB7CisJCVNoYkVycm9yID0ga1NoYk9rOworCQkvLyBkZWxldGUgbWVtIHRhYmxlIGVsZW1lbnQKKwkJU2hiSXBjRGVsZXRlTGlzdEVsZW1lbnQocFNoYk1lbUhlYWRlci0+bV9pQnVmZmVySWQpOworCQkvLyBkZWxldGUgc2hhcmVkIG1lbQorCQlrZnJlZShwU2hiTWVtSW5zdC0+bV9wU2hiTWVtSGVhZGVyKTsKKwl9IGVsc2UgeworCQlTaGJFcnJvciA9IGtTaGJNZW1Vc2VkQnlPdGhlclByb2NzOworCX0KKwkvL2RlbGV0ZSBwcml2YXQgbWVtCisJa2ZyZWUocFNoYk1lbUluc3QpOworCXJldHVybiAoU2hiRXJyb3IpOworfQorCisjZW5kaWYgLy8gIWRlZmluZWQoU0hCSVBDX0lOTElORV9FTkFCTEVEKQorCisjaWYgKCFkZWZpbmVkKFNIQklQQ19JTkxJTkVEKSkgfHwgZGVmaW5lZChTSEJJUENfSU5MSU5FX0VOQUJMRUQpCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgRW50ZXIgYXRvbWljIHNlY3Rpb24gZm9yIFNoYXJlZCBCdWZmZXIgYWNjZXNzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJTkxJTkVfRlVOQ1RJT04gdFNoYkVycm9yIFNoYklwY0VudGVyQXRvbWljU2VjdGlvbih0U2hiSW5zdGFuY2UgcFNoYkluc3RhbmNlX3ApCit7CisKKwl0U2hiTWVtSW5zdCAqcFNoYk1lbUluc3Q7CisJdFNoYk1lbUhlYWRlciAqcFNoYk1lbUhlYWRlcjsKKwl0U2hiRXJyb3IgU2hiRXJyb3IgPSBrU2hiT2s7CisKKwlpZiAocFNoYkluc3RhbmNlX3AgPT0gTlVMTCkgeworCQlTaGJFcnJvciA9IGtTaGJJbnZhbGlkQXJnOworCQlnb3RvIEV4aXQ7CisJfQorCURFQlVHX0xWTF8yOV9UUkFDRTAoImVudGVyIGF0b21pY1xuIik7CisJcFNoYk1lbUluc3QgPSBTaGJJcGNHZXRTaGJNZW1JbnN0KHBTaGJJbnN0YW5jZV9wKTsKKwlwU2hiTWVtSGVhZGVyID0gU2hiSXBjR2V0U2hiTWVtSGVhZGVyKHBTaGJNZW1JbnN0KTsKKworCS8vIGxvY2sgaW50ZXJydXB0cworCXNwaW5fbG9ja19pcnFzYXZlKCZwU2hiTWVtSGVhZGVyLT5tX1NwaW5sb2NrQnVmZkFjY2VzcywKKwkJCSAgcFNoYk1lbUluc3QtPm1fdWxGbGFnc0J1ZmZBY2Nlc3MpOworCisgICAgICBFeGl0OgorCXJldHVybiBTaGJFcnJvcjsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIExlYXZlIGF0b21pYyBzZWN0aW9uIGZvciBTaGFyZWQgQnVmZmVyIGFjY2VzcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSU5MSU5FX0ZVTkNUSU9OIHRTaGJFcnJvciBTaGJJcGNMZWF2ZUF0b21pY1NlY3Rpb24odFNoYkluc3RhbmNlIHBTaGJJbnN0YW5jZV9wKQoreworCisJdFNoYk1lbUluc3QgKnBTaGJNZW1JbnN0OworCXRTaGJNZW1IZWFkZXIgKnBTaGJNZW1IZWFkZXI7CisJdFNoYkVycm9yIFNoYkVycm9yID0ga1NoYk9rOworCisJaWYgKHBTaGJJbnN0YW5jZV9wID09IE5VTEwpIHsKKwkJU2hiRXJyb3IgPSBrU2hiSW52YWxpZEFyZzsKKwkJZ290byBFeGl0OworCX0KKwlwU2hiTWVtSW5zdCA9IFNoYklwY0dldFNoYk1lbUluc3QocFNoYkluc3RhbmNlX3ApOworCXBTaGJNZW1IZWFkZXIgPSBTaGJJcGNHZXRTaGJNZW1IZWFkZXIocFNoYk1lbUluc3QpOworCS8vIHVubG9jayBpbnRlcnJ1cHRzCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcFNoYk1lbUhlYWRlci0+bV9TcGlubG9ja0J1ZmZBY2Nlc3MsCisJCQkgICAgICAgcFNoYk1lbUluc3QtPm1fdWxGbGFnc0J1ZmZBY2Nlc3MpOworCisgICAgICBFeGl0OgorCURFQlVHX0xWTF8yOV9UUkFDRTAoIkxlYXZlIEF0b21pYyBcbiIpOworCXJldHVybiBTaGJFcnJvcjsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIFN0YXJ0IHNpZ25hbGluZyBvZiBuZXcgZGF0YSAoY2FsbGVkIGZyb20gcmVhZGluZyBwcm9jZXNzKQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSU5MSU5FX0ZVTkNUSU9OIHRTaGJFcnJvciBTaGJJcGNTdGFydFNpZ25hbGluZ05ld0RhdGEodFNoYkluc3RhbmNlCisJCQkJCQkgICAgICBwU2hiSW5zdGFuY2VfcCwKKwkJCQkJCSAgICAgIHRTaWdIbmRsck5ld0RhdGEKKwkJCQkJCSAgICAgIHBmblNpZ25hbEhhbmRsZXJOZXdEYXRhX3AsCisJCQkJCQkgICAgICB0U2hiUHJpb3JpdHkKKwkJCQkJCSAgICAgIFNoYlByaW9yaXR5X3ApCit7CisJdFNoYk1lbUluc3QgKnBTaGJNZW1JbnN0OworCXRTaGJNZW1IZWFkZXIgKnBTaGJNZW1IZWFkZXI7CisJdFNoYkVycm9yIFNoYkVycm9yOworCisJREVCVUdfTFZMXzI5X1RSQUNFMCgiLS0tLS0tLT5TaGJJcGNTdGFydFNpZ25hbGluZ05ld0RhdGFcbiIpOworCWlmICgocFNoYkluc3RhbmNlX3AgPT0gTlVMTCkgfHwgKHBmblNpZ25hbEhhbmRsZXJOZXdEYXRhX3AgPT0gTlVMTCkpIHsKKwkJcmV0dXJuIChrU2hiSW52YWxpZEFyZyk7CisJfQorCisJcFNoYk1lbUluc3QgPSBTaGJJcGNHZXRTaGJNZW1JbnN0KHBTaGJJbnN0YW5jZV9wKTsKKwlwU2hiTWVtSGVhZGVyID0gU2hiSXBjR2V0U2hiTWVtSGVhZGVyKHBTaGJNZW1JbnN0KTsKKwlTaGJFcnJvciA9IGtTaGJPazsKKworCWlmICgocFNoYk1lbUluc3QtPm1fdFRocmVhZE5ld0RhdGFJZCAhPSBJTlZBTElEX0lEKQorCSAgICB8fCAocFNoYk1lbUluc3QtPm1fcGZuU2lnSG5kbHJOZXdEYXRhICE9IE5VTEwpKSB7CisJCVNoYkVycm9yID0ga1NoYkFscmVhZHlTaWduYWxpbmc7CisJCWdvdG8gRXhpdDsKKwl9CisJREVCVUdfTFZMXzI2X1RSQUNFMgorCSAgICAoIlNoYklwY1N0YXJ0U2lnbmFsaW5nTmV3RGF0YSglcCkgbV9wZm5TaWdIbmRsck5ld0RhdGEgPSAlcFxuIiwKKwkgICAgIHBTaGJJbnN0YW5jZV9wLCBwZm5TaWduYWxIYW5kbGVyTmV3RGF0YV9wKTsKKwlwU2hiTWVtSW5zdC0+bV9wZm5TaWdIbmRsck5ld0RhdGEgPSBwZm5TaWduYWxIYW5kbGVyTmV3RGF0YV9wOworCXBTaGJNZW1IZWFkZXItPm1fZk5ld0RhdGEgPSBGQUxTRTsKKwlwU2hiTWVtSW5zdC0+bV9pVGhyZWFkVGVybUZsYWcgPSAwOworCisJc3dpdGNoIChTaGJQcmlvcml0eV9wKSB7CisJY2FzZSBrU2hiUHJpb3JpdHlMb3c6CisJCXBTaGJNZW1JbnN0LT5tX2xUaHJlYWROZXdEYXRhTmljZSA9IC0yOworCQlicmVhazsKKworCWNhc2Uga1NoYlByaW9yaXR5Tm9ybWFsOgorCQlwU2hiTWVtSW5zdC0+bV9sVGhyZWFkTmV3RGF0YU5pY2UgPSAtOTsKKwkJYnJlYWs7CisKKwljYXNlIGtzaGJQcmlvcml0eUhpZ2g6CisJCXBTaGJNZW1JbnN0LT5tX2xUaHJlYWROZXdEYXRhTmljZSA9IC0yMDsKKwkJYnJlYWs7CisKKwl9CisKKwkvL2NyZWF0ZSB0aHJlYWQgZm9yIHNpZ25hbGxpbmcgbmV3IGRhdGEKKwlwU2hiTWVtSW5zdC0+bV90VGhyZWFkTmV3RGF0YUlkID0KKwkgICAga2VybmVsX3RocmVhZChTaGJJcGNUaHJlYWRTaWduYWxOZXdEYXRhLCBwU2hiSW5zdGFuY2VfcCwKKwkJCSAgQ0xPTkVfS0VSTkVMKTsKKworICAgICAgRXhpdDoKKwlyZXR1cm4gU2hiRXJyb3I7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBTdG9wIHNpZ25hbGluZyBvZiBuZXcgZGF0YSAoY2FsbGVkIGZyb20gcmVhZGluZyBwcm9jZXNzKQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSU5MSU5FX0ZVTkNUSU9OIHRTaGJFcnJvciBTaGJJcGNTdG9wU2lnbmFsaW5nTmV3RGF0YSh0U2hiSW5zdGFuY2UKKwkJCQkJCSAgICAgcFNoYkluc3RhbmNlX3ApCit7CisJdFNoYk1lbUluc3QgKnBTaGJNZW1JbnN0OworCXRTaGJNZW1IZWFkZXIgKnBTaGJNZW1IZWFkZXI7CisJdFNoYkVycm9yIFNoYkVycm9yOworCisJREVCVUdfTFZMXzI5X1RSQUNFMCgiLS0tLS0tLT5TaGJJcGNTdG9wU2lnbmFsaW5nTmV3RGF0YVxuIik7CisJaWYgKHBTaGJJbnN0YW5jZV9wID09IE5VTEwpIHsKKwkJcmV0dXJuIChrU2hiSW52YWxpZEFyZyk7CisJfQorCVNoYkVycm9yID0ga1NoYk9rOworCXBTaGJNZW1JbnN0ID0gU2hiSXBjR2V0U2hiTWVtSW5zdChwU2hiSW5zdGFuY2VfcCk7CisJcFNoYk1lbUhlYWRlciA9IFNoYklwY0dldFNoYk1lbUhlYWRlcihwU2hiTWVtSW5zdCk7CisKKwlERUJVR19MVkxfMjZfVFJBQ0UyCisJICAgICgiU2hiSXBjU3RvcFNpZ25hbGluZ05ld0RhdGEoJXApIHBmblNpZ25IbmRsck5ld0RhdGE9JXBcbiIsCisJICAgICBwU2hiSW5zdGFuY2VfcCwgcFNoYk1lbUluc3QtPm1fcGZuU2lnSG5kbHJOZXdEYXRhKTsKKwlpZiAocFNoYk1lbUluc3QtPm1fcGZuU2lnSG5kbHJOZXdEYXRhICE9IE5VTEwpIHsJLy8gc2lnbmFsIGhhbmRsZXIgd2FzIHNldCBiZWZvcmUKKwkJaW50IGlFcnI7CisJCS8vc2V0IHRlcm1pbmF0aW9uIGZsYWcgaW4gbWVtIGhlYWRlcgorCQlwU2hiTWVtSW5zdC0+bV9pVGhyZWFkVGVybUZsYWcgPSAxOworCisJCS8vIGNoZWNrIGlmIHRocmVhZCBpcyBzdGlsbCBydW5uaW5nIGF0IGFsbCBieSBzZW5kaW5nIHRoZSBudWxsLXNpZ25hbCB0byB0aGlzIHRocmVhZAorCQkvKiBpRXJyID0ga2lsbF9wcm9jKHBTaGJNZW1JbnN0LT5tX3RUaHJlYWROZXdEYXRhSWQsIDAsIDEpOyAqLworCQlpRXJyID0gc2VuZF9zaWcoMCwgcFNoYk1lbUluc3QtPm1fdFRocmVhZE5ld0RhdGFJZCwgMSk7CisJCWlmIChpRXJyID09IDApIHsKKwkJCS8vIHdha2UgdXAgdGhyZWFkLCBiZWNhdXNlIGl0IGlzIHN0aWxsIHJ1bm5pbmcKKwkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcFNoYk1lbUhlYWRlci0+CisJCQkJCSAgICAgIG1fV2FpdFF1ZXVlTmV3RGF0YSk7CisKKwkJCS8vd2FpdCBmb3IgdGVybWluYXRpb24gb2YgdGhyZWFkCisJCQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZwU2hiTWVtSW5zdC0+bV9Db21wbGV0aW9uTmV3RGF0YSk7CisJCX0KKworCQlwU2hiTWVtSW5zdC0+bV9wZm5TaWdIbmRsck5ld0RhdGEgPSBOVUxMOworCQlwU2hiTWVtSW5zdC0+bV90VGhyZWFkTmV3RGF0YUlkID0gSU5WQUxJRF9JRDsKKwl9CisKKwlyZXR1cm4gU2hiRXJyb3I7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBTaWduYWwgbmV3IGRhdGEgKGNhbGxlZCBmcm9tIHdyaXRpbmcgcHJvY2VzcykKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lOTElORV9GVU5DVElPTiB0U2hiRXJyb3IgU2hiSXBjU2lnbmFsTmV3RGF0YSh0U2hiSW5zdGFuY2UgcFNoYkluc3RhbmNlX3ApCit7CisJdFNoYk1lbUhlYWRlciAqcFNoYk1lbUhlYWRlcjsKKworCWlmIChwU2hiSW5zdGFuY2VfcCA9PSBOVUxMKSB7CisJCXJldHVybiAoa1NoYkludmFsaWRBcmcpOworCX0KKwlwU2hiTWVtSGVhZGVyID0KKwkgICAgU2hiSXBjR2V0U2hiTWVtSGVhZGVyKFNoYklwY0dldFNoYk1lbUluc3QocFNoYkluc3RhbmNlX3ApKTsKKwkvL3NldCBzZW1hcGhvcmUKKwlwU2hiTWVtSGVhZGVyLT5tX2ZOZXdEYXRhID0gVFJVRTsKKwlERUJVR19MVkxfMjlfVFJBQ0UwKCJTaGJJcGNTaWduYWxOZXdEYXRhIHNldCBTZW0gLT4gTmV3IERhdGFcbiIpOworCisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwU2hiTWVtSGVhZGVyLT5tX1dhaXRRdWV1ZU5ld0RhdGEpOworCXJldHVybiAoa1NoYk9rKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBTdGFydCBzaWduYWxpbmcgZm9yIGpvYiByZWFkeSAoY2FsbGVkIGZyb20gd2FpdGluZyBwcm9jZXNzKQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSU5MSU5FX0ZVTkNUSU9OIHRTaGJFcnJvciBTaGJJcGNTdGFydFNpZ25hbGluZ0pvYlJlYWR5KHRTaGJJbnN0YW5jZQorCQkJCQkJICAgICAgIHBTaGJJbnN0YW5jZV9wLAorCQkJCQkJICAgICAgIHVuc2lnbmVkIGxvbmcKKwkJCQkJCSAgICAgICB1bFRpbWVPdXRfcCwKKwkJCQkJCSAgICAgICB0U2lnSG5kbHJKb2JSZWFkeQorCQkJCQkJICAgICAgIHBmblNpZ25hbEhhbmRsZXJKb2JSZWFkeV9wKQoreworCXRTaGJNZW1JbnN0ICpwU2hiTWVtSW5zdDsKKwl0U2hiTWVtSGVhZGVyICpwU2hiTWVtSGVhZGVyOworCXRTaGJFcnJvciBTaGJFcnJvcjsKKworCWlmICgocFNoYkluc3RhbmNlX3AgPT0gTlVMTCkgfHwgKHBmblNpZ25hbEhhbmRsZXJKb2JSZWFkeV9wID09IE5VTEwpKSB7CisJCXJldHVybiAoa1NoYkludmFsaWRBcmcpOworCX0KKwlwU2hiTWVtSW5zdCA9IFNoYklwY0dldFNoYk1lbUluc3QocFNoYkluc3RhbmNlX3ApOworCXBTaGJNZW1IZWFkZXIgPSBTaGJJcGNHZXRTaGJNZW1IZWFkZXIocFNoYk1lbUluc3QpOworCisJU2hiRXJyb3IgPSBrU2hiT2s7CisJaWYgKChwU2hiTWVtSW5zdC0+bV90VGhyZWFkSm9iUmVhZHlJZCAhPSBJTlZBTElEX0lEKQorCSAgICB8fCAocFNoYk1lbUluc3QtPm1fcGZuU2lnSG5kbHJKb2JSZWFkeSAhPSBOVUxMKSkgeworCQlTaGJFcnJvciA9IGtTaGJBbHJlYWR5U2lnbmFsaW5nOworCQlnb3RvIEV4aXQ7CisJfQorCXBTaGJNZW1JbnN0LT5tX3VsVGltZU91dEpvYlJlYWR5ID0gdWxUaW1lT3V0X3A7CisJcFNoYk1lbUluc3QtPm1fcGZuU2lnSG5kbHJKb2JSZWFkeSA9IHBmblNpZ25hbEhhbmRsZXJKb2JSZWFkeV9wOworCXBTaGJNZW1IZWFkZXItPm1fZkpvYlJlYWR5ID0gRkFMU0U7CisJLy9jcmVhdGUgdGhyZWFkIGZvciBzaWduYWxsaW5nIG5ldyBkYXRhCisJcFNoYk1lbUluc3QtPm1fdFRocmVhZEpvYlJlYWR5SWQgPQorCSAgICBrZXJuZWxfdGhyZWFkKFNoYklwY1RocmVhZFNpZ25hbEpvYlJlYWR5LCBwU2hiSW5zdGFuY2VfcCwKKwkJCSAgQ0xPTkVfS0VSTkVMKTsKKyAgICAgIEV4aXQ6CisJcmV0dXJuIFNoYkVycm9yOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIFNpZ25hbCBqb2IgcmVhZHkgKGNhbGxlZCBmcm9tIGV4ZWN1dGluZyBwcm9jZXNzKQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSU5MSU5FX0ZVTkNUSU9OIHRTaGJFcnJvciBTaGJJcGNTaWduYWxKb2JSZWFkeSh0U2hiSW5zdGFuY2UgcFNoYkluc3RhbmNlX3ApCit7CisJdFNoYk1lbUhlYWRlciAqcFNoYk1lbUhlYWRlcjsKKworCURFQlVHX0xWTF8yOV9UUkFDRTAoIlNoYklwY1NpZ25hbEpvYlJlYWR5XG4iKTsKKwlpZiAocFNoYkluc3RhbmNlX3AgPT0gTlVMTCkgeworCQlyZXR1cm4gKGtTaGJJbnZhbGlkQXJnKTsKKwl9CisJcFNoYk1lbUhlYWRlciA9CisJICAgIFNoYklwY0dldFNoYk1lbUhlYWRlcihTaGJJcGNHZXRTaGJNZW1JbnN0KHBTaGJJbnN0YW5jZV9wKSk7CisJLy9zZXQgc2VtYXBob3JlCisJcFNoYk1lbUhlYWRlci0+bV9mSm9iUmVhZHkgPSBUUlVFOworCURFQlVHX0xWTF8yOV9UUkFDRTAoIlNoYklwY1NpZ25hbEpvYlJlYWR5IHNldCBTZW0gLT4gSm9iIFJlYWR5IFxuIik7CisKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJnBTaGJNZW1IZWFkZXItPm1fV2FpdFF1ZXVlSm9iUmVhZHkpOworCXJldHVybiAoa1NoYk9rKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBHZXQgcG9pbnRlciB0byBjb21tb24gdXNlZCBzaGFyZSBtZW1vcnkgYXJlYQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSU5MSU5FX0ZVTkNUSU9OIHZvaWQgKlNoYklwY0dldFNoTWVtUHRyKHRTaGJJbnN0YW5jZSBwU2hiSW5zdGFuY2VfcCkKK3sKKworCXRTaGJNZW1IZWFkZXIgKnBTaGJNZW1IZWFkZXI7CisJdm9pZCAqcFNoYlNoTWVtUHRyOworCisJcFNoYk1lbUhlYWRlciA9CisJICAgIFNoYklwY0dldFNoYk1lbUhlYWRlcihTaGJJcGNHZXRTaGJNZW1JbnN0KHBTaGJJbnN0YW5jZV9wKSk7CisJaWYgKHBTaGJNZW1IZWFkZXIgIT0gTlVMTCkgeworCQlwU2hiU2hNZW1QdHIgPSAoQllURSAqKSBwU2hiTWVtSGVhZGVyICsgc2l6ZW9mKHRTaGJNZW1IZWFkZXIpOworCX0gZWxzZSB7CisJCXBTaGJTaE1lbVB0ciA9IE5VTEw7CisJfQorCisJcmV0dXJuIChwU2hiU2hNZW1QdHIpOworCit9CisKKyNlbmRpZgorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgIFAgUiBJIFYgQSBUIEUgICBGIFUgTiBDIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKworI2lmICFkZWZpbmVkKFNIQklQQ19JTkxJTkVfRU5BQkxFRCkKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBHZXQgcG9pbnRlciB0byBwcm9jZXNzIGxvY2FsIGluZm9ybWF0aW9uIHN0cnVjdHVyZQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLyp0U2hiTWVtSW5zdCogIFNoYklwY0dldFNoYk1lbUluc3QgKAorICAgIHRTaGJJbnN0YW5jZSBwU2hiSW5zdGFuY2VfcCkKK3sKKwordFNoYk1lbUluc3QqICBwU2hiTWVtSW5zdDsKKworICAgIHBTaGJNZW1JbnN0ID0gKHRTaGJNZW1JbnN0KilwU2hiSW5zdGFuY2VfcDsKKworICAgIHJldHVybiAocFNoYk1lbUluc3QpOworCit9CisqLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIEdldCBwb2ludGVyIHRvIHNoYXJlZCBtZW1vcnkgaGVhZGVyCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvKnRTaGJNZW1IZWFkZXIqICBTaGJJcGNHZXRTaGJNZW1IZWFkZXIgKAorICAgIHRTaGJNZW1JbnN0KiBwU2hiTWVtSW5zdF9wKQoreworCit0U2hiTWVtSGVhZGVyKiAgcFNoYk1lbUhlYWRlcjsKKworICAgIHBTaGJNZW1IZWFkZXIgPSBwU2hiTWVtSW5zdF9wLT5tX3BTaGJNZW1IZWFkZXI7CisKKyAgICByZXR1cm4gKHBTaGJNZW1IZWFkZXIpOworCit9CisqLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIEFsbG9jYXRlIGEgbWVtb3J5IGJsb2NrIGZyb20gcHJvY2VzcyBzcGVjaWZpYyBtZW1wb29sCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZCAqU2hiSXBjQWxsb2NQcml2YXRlTWVtKHVuc2lnbmVkIGxvbmcgdWxNZW1TaXplX3ApCit7CisJdFNoYkVycm9yIFNoYkVycm9yOworCXZvaWQgKnBNZW07CisKKwlERUJVR19MVkxfMjlfVFJBQ0UwKCJTaGJJcGNBbGxvY1ByaXZhdGVNZW0gXG4iKTsKKwkvL2dldCBwcml2YXRlIG1lbQorCXBNZW0gPSBrbWFsbG9jKHVsTWVtU2l6ZV9wLCBHRlBfS0VSTkVMKTsKKwlpZiAocE1lbSA9PSBOVUxMKSB7CisJCS8vdW5hYmxlIHRvIGNyZWF0ZSBtZW0KKwkJU2hiRXJyb3IgPSBrU2hiT3V0T2ZNZW07CisJCWdvdG8gRXhpdDsKKwl9CisgICAgICBFeGl0OgorCXJldHVybiAocE1lbSk7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBUaHJlYWQgZm9yIG5ldyBkYXRhIHNpZ25hbGluZworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworaW50IFNoYklwY1RocmVhZFNpZ25hbE5ld0RhdGEodm9pZCAqcHZUaHJlYWRQYXJhbV9wKQoreworCXRTaGJJbnN0YW5jZSBwU2hiSW5zdGFuY2U7CisJdFNoYk1lbUluc3QgKnBTaGJNZW1JbnN0OworCXRTaGJNZW1IZWFkZXIgKnBTaGJNZW1IZWFkZXI7CisJaW50IGlSZXRWYWwgPSAtMTsKKwlpbnQgZkNhbGxBZ2FpbjsKKworCWRhZW1vbml6ZSgiU2hiTkQlcCIsIHB2VGhyZWFkUGFyYW1fcCk7CisJYWxsb3dfc2lnbmFsKFNJR1RFUk0pOworCXBTaGJJbnN0YW5jZSA9ICh0U2hiTWVtSW5zdCAqKSBwdlRocmVhZFBhcmFtX3A7CisJcFNoYk1lbUluc3QgPSBTaGJJcGNHZXRTaGJNZW1JbnN0KHBTaGJJbnN0YW5jZSk7CisJcFNoYk1lbUhlYWRlciA9IFNoYklwY0dldFNoYk1lbUhlYWRlcihwU2hiTWVtSW5zdCk7CisKKwlERUJVR19MVkxfMjZfVFJBQ0UxKCJTaGJJcGNUaHJlYWRTaWduYWxOZXdEYXRhKCVwKVxuIiwgcHZUaHJlYWRQYXJhbV9wKTsKKworCXNldF91c2VyX25pY2UoY3VycmVudCwgcFNoYk1lbUluc3QtPm1fbFRocmVhZE5ld0RhdGFOaWNlKTsKKworLy8gICAgICAgICAgICBERUJVR19MVkxfMjlfVFJBQ0UxKCJTaGJJcGNUaHJlYWRTaWduYWxOZXdEYXRhIHdhaXQgZm9yIE5ldyBEYXRhIFNlbSAlcFxuIixwU2hiTWVtSW5zdC0+bV9wU2VtTmV3RGF0YSk7CisJZG8geworCQlpUmV0VmFsID0KKwkJICAgIHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShwU2hiTWVtSGVhZGVyLT5tX1dhaXRRdWV1ZU5ld0RhdGEsCisJCQkJCSAgICAgKHBTaGJNZW1JbnN0LT5tX2lUaHJlYWRUZXJtRmxhZyAhPQorCQkJCQkgICAgICAwKQorCQkJCQkgICAgIHx8IChwU2hiTWVtSGVhZGVyLT5tX2ZOZXdEYXRhICE9CisJCQkJCQkgRkFMU0UpKTsKKworCQlpZiAoaVJldFZhbCAhPSAwKSB7CS8vIHNpZ25hbCBwZW5kaW5nCisJCQlicmVhazsKKwkJfQorCisJCWlmIChwU2hiTWVtSGVhZGVyLT5tX2ZOZXdEYXRhICE9IEZBTFNFKSB7CisJCQlwU2hiTWVtSGVhZGVyLT5tX2ZOZXdEYXRhID0gRkFMU0U7CisJCQlkbyB7CisJCQkJZkNhbGxBZ2FpbiA9CisJCQkJICAgIHBTaGJNZW1JbnN0LT4KKwkJCQkgICAgbV9wZm5TaWdIbmRsck5ld0RhdGEocFNoYkluc3RhbmNlKTsKKwkJCQkvLyBjYWxsIHNjaGVkdWxlciwgd2hpY2ggd2lsbCBleGVjdXRlIGFueSB0YXNrIHdpdGggaGlnaGVyIHByaW9yaXR5CisJCQkJc2NoZWR1bGUoKTsKKwkJCX0gd2hpbGUgKGZDYWxsQWdhaW4gIT0gRkFMU0UpOworCQl9CisJfSB3aGlsZSAocFNoYk1lbUluc3QtPm1faVRocmVhZFRlcm1GbGFnID09IDApOworCURFQlVHX0xWTF8yOV9UUkFDRTAoIlNoYklwY1RocmVhZFNpZ25hbE5ld0RhdGEgdGVybWluYXRlZCBcbiIpOworCS8vc2V0IHRocmVhZCBjb21wbGV0ZWQKKwljb21wbGV0ZV9hbmRfZXhpdCgmcFNoYk1lbUluc3QtPm1fQ29tcGxldGlvbk5ld0RhdGEsIDApOworCXJldHVybiAwOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIFRocmVhZCBmb3IgbmV3IGRhdGEgSm9iIFJlYWR5IHNpZ25hbGluZworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworaW50IFNoYklwY1RocmVhZFNpZ25hbEpvYlJlYWR5KHZvaWQgKnB2VGhyZWFkUGFyYW1fcCkKK3sKKwl0U2hiSW5zdGFuY2UgcFNoYkluc3RhbmNlOworCXRTaGJNZW1JbnN0ICpwU2hiTWVtSW5zdDsKKwl0U2hiTWVtSGVhZGVyICpwU2hiTWVtSGVhZGVyOworCWxvbmcgbFRpbWVPdXQ7CisJaW50IGlSZXRWYWwgPSAtMTsKKworCWRhZW1vbml6ZSgiU2hiSlIlcCIsIHB2VGhyZWFkUGFyYW1fcCk7CisJYWxsb3dfc2lnbmFsKFNJR1RFUk0pOworCXBTaGJJbnN0YW5jZSA9ICh0U2hiTWVtSW5zdCAqKSBwdlRocmVhZFBhcmFtX3A7CisJcFNoYk1lbUluc3QgPSBTaGJJcGNHZXRTaGJNZW1JbnN0KHBTaGJJbnN0YW5jZSk7CisJcFNoYk1lbUhlYWRlciA9IFNoYklwY0dldFNoYk1lbUhlYWRlcihwU2hiTWVtSW5zdCk7CisKKwlERUJVR19MVkxfMjlfVFJBQ0UwCisJICAgICgiU2hiSXBjVGhyZWFkU2lnbmFsSm9iUmVhZHkgd2FpdCBmb3Igam9iIHJlYWR5IFNlbVxuIik7CisJaWYgKHBTaGJNZW1JbnN0LT5tX3VsVGltZU91dEpvYlJlYWR5ICE9IDApIHsKKwkJbFRpbWVPdXQgPSAobG9uZylwU2hiTWVtSW5zdC0+bV91bFRpbWVPdXRKb2JSZWFkeTsKKwkJLy93YWl0IGZvciBqb2IgcmVhZHkgc2VtYXBob3JlCisJCWlSZXRWYWwgPQorCQkgICAgd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQocFNoYk1lbUhlYWRlci0+CisJCQkJCQkgICAgIG1fV2FpdFF1ZXVlSm9iUmVhZHksCisJCQkJCQkgICAgIChwU2hiTWVtSGVhZGVyLT4KKwkJCQkJCSAgICAgIG1fZkpvYlJlYWR5ICE9IEZBTFNFKSwKKwkJCQkJCSAgICAgbFRpbWVPdXQpOworCX0gZWxzZSB7CisJCS8vd2FpdCBmb3Igam9iIHJlYWR5IHNlbWFwaG9yZQorCQlpUmV0VmFsID0KKwkJICAgIHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShwU2hiTWVtSGVhZGVyLT5tX1dhaXRRdWV1ZUpvYlJlYWR5LAorCQkJCQkgICAgIChwU2hiTWVtSGVhZGVyLT5tX2ZKb2JSZWFkeSAhPQorCQkJCQkgICAgICBGQUxTRSkpOworCX0KKworCWlmIChwU2hiTWVtSW5zdC0+bV9wZm5TaWdIbmRsckpvYlJlYWR5ICE9IE5VTEwpIHsKKwkJLy9jYWxsIEhhbmRsZXIKKwkJcFNoYk1lbUluc3QtPm1fcGZuU2lnSG5kbHJKb2JSZWFkeShwU2hiSW5zdGFuY2UsCisJCQkJCQkgICAhcFNoYk1lbUhlYWRlci0+bV9mSm9iUmVhZHkpOworCX0KKworCXBTaGJNZW1JbnN0LT5tX3BmblNpZ0huZGxySm9iUmVhZHkgPSBOVUxMOworCXJldHVybiAwOworfQorCisvL0J1aWxkIHRoZSBjcmMgdGFibGUKK3N0YXRpYyB2b2lkIFNoYklwY0NyYzMyR2VuVGFibGUodW5zaWduZWQgbG9uZyBhdWxDcmNUYWJsZVsyNTZdKQoreworCXVuc2lnbmVkIGxvbmcgdWxDcmMsIHVsUG9seTsKKwlpbnQgaUluZGV4SSwgaUluZGV4SjsKKworCXVsUG9seSA9IDB4RURCODgzMjBMOworCWZvciAoaUluZGV4SSA9IDA7IGlJbmRleEkgPCAyNTY7IGlJbmRleEkrKykgeworCQl1bENyYyA9IGlJbmRleEk7CisJCWZvciAoaUluZGV4SiA9IDg7IGlJbmRleEogPiAwOyBpSW5kZXhKLS0pIHsKKwkJCWlmICh1bENyYyAmIDEpIHsKKwkJCQl1bENyYyA9ICh1bENyYyA+PiAxKSBeIHVsUG9seTsKKwkJCX0gZWxzZSB7CisJCQkJdWxDcmMgPj49IDE7CisJCQl9CisJCX0KKwkJYXVsQ3JjVGFibGVbaUluZGV4SV0gPSB1bENyYzsKKwl9Cit9CisKKy8vQ2FsY3VsYXRlIHRoZSBjcmMgdmFsdWUKK3N0YXRpYyB1bnNpZ25lZCBsb25nIFNoYklwY0NyYzMyR2V0Q3JjKGNvbnN0IGNoYXIgKnBjU3RyaW5nLAorCQkJCSAgICAgICB1bnNpZ25lZCBsb25nIGF1bENyY1RhYmxlWzI1Nl0pCit7CisJdW5zaWduZWQgbG9uZyB1bENyYzsKKwlpbnQgaUluZGV4OworCisJdWxDcmMgPSAweEZGRkZGRkZGOworCWZvciAoaUluZGV4ID0gMDsgaUluZGV4IDwgc3RybGVuKHBjU3RyaW5nKTsgaUluZGV4KyspIHsKKwkJdWxDcmMgPQorCQkgICAgKCh1bENyYyA+PiA4KSAmIDB4MDBGRkZGRkYpIF4KKwkJICAgIGF1bENyY1RhYmxlWyh1bENyYyBeIHBjU3RyaW5nW2lJbmRleF0pICYgMHhGRl07CisJfQorCXJldHVybiAodWxDcmMgXiAweEZGRkZGRkZGKTsKKworfQorCitzdGF0aWMgdm9pZCBTaGJJcGNBcHBlbmRMaXN0RWxlbWVudChzdHJ1Y3Qgc1NoYk1lbVRhYmxlICpwc05ld01lbVRhYmxlRWxlbWVudCkKK3sKKwlzdHJ1Y3Qgc1NoYk1lbVRhYmxlICpwc01lbVRhYmxlRWxlbWVudCA9IHBzTWVtVGFibGVFbGVtZW50Rmlyc3RfZzsKKwlwc05ld01lbVRhYmxlRWxlbWVudC0+bV9wc05leHRNZW1UYWJsZUVsZW1lbnQgPSBOVUxMOworCisJaWYgKHBzTWVtVGFibGVFbGVtZW50Rmlyc3RfZyAhPSBOVUxMKSB7CS8qIHNpbmQgRWxlbWVudGUgdm9yaGFuZGVuICovCisJCXdoaWxlIChwc01lbVRhYmxlRWxlbWVudC0+bV9wc05leHRNZW1UYWJsZUVsZW1lbnQgIT0gTlVMTCkgewkvKiBzdWNoZSBkYXMgbGV0enRlIEVsZW1lbnQgKi8KKwkJCXBzTWVtVGFibGVFbGVtZW50ID0KKwkJCSAgICBwc01lbVRhYmxlRWxlbWVudC0+bV9wc05leHRNZW1UYWJsZUVsZW1lbnQ7CisJCX0KKwkJcHNNZW1UYWJsZUVsZW1lbnQtPm1fcHNOZXh0TWVtVGFibGVFbGVtZW50ID0gcHNOZXdNZW1UYWJsZUVsZW1lbnQ7CS8qICBIYWVuZ2UgZGFzIEVsZW1lbnQgaGludGVuIGFuICovCisJfSBlbHNlIHsJCS8qIHdlbm4gZGllIGxpc3RlIGxlZXIgaXN0LCBiaW4gaWNoIGRhcyBlcnN0ZSBFbGVtZW50ICovCisJCXBzTWVtVGFibGVFbGVtZW50Rmlyc3RfZyA9IHBzTmV3TWVtVGFibGVFbGVtZW50OworCX0KK30KKworc3RhdGljIGludCBTaGJJcGNGaW5kTGlzdEVsZW1lbnQoaW50IGlCdWZmZXJJZCwKKwkJCQkgc3RydWN0IHNTaGJNZW1UYWJsZSAqKnBwc1JldHVybk1lbVRhYmxlRWxlbWVudCkKK3sKKwlzdHJ1Y3Qgc1NoYk1lbVRhYmxlICpwc01lbVRhYmxlRWxlbWVudCA9IHBzTWVtVGFibGVFbGVtZW50Rmlyc3RfZzsKKwl3aGlsZSAocHNNZW1UYWJsZUVsZW1lbnQgIT0gTlVMTCkgeworCQlpZiAocHNNZW1UYWJsZUVsZW1lbnQtPm1faUJ1ZmZlcklkID09IGlCdWZmZXJJZCkgeworLy9wcmludGsoIlNoYklwY0ZpbmRMaXN0RWxlbWVudCBCdWZmZXIgYXQ6JXAgSWQ6JWRcbiIscHNNZW1UYWJsZUVsZW1lbnQtPm1fcEJ1ZmZlcixwc01lbVRhYmxlRWxlbWVudC0+bV9pQnVmZmVySWQpOworCQkJKnBwc1JldHVybk1lbVRhYmxlRWxlbWVudCA9IHBzTWVtVGFibGVFbGVtZW50OworLy9wcmludGsoIlNoYklwY0ZpbmRMaXN0RWxlbWVudCBCdWZmZXIgYXQ6JXAgSWQ6JWRcbiIsKCpwcHNSZXR1cm5NZW1UYWJsZUVsZW1lbnQpLT5tX3BCdWZmZXIsKCpwcHNSZXR1cm5NZW1UYWJsZUVsZW1lbnQpLT5tX2lCdWZmZXJJZCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlwc01lbVRhYmxlRWxlbWVudCA9IHBzTWVtVGFibGVFbGVtZW50LT5tX3BzTmV4dE1lbVRhYmxlRWxlbWVudDsKKwl9CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgdm9pZCBTaGJJcGNEZWxldGVMaXN0RWxlbWVudChpbnQgaUJ1ZmZlcklkKQoreworCXN0cnVjdCBzU2hiTWVtVGFibGUgKnBzTWVtVGFibGVFbGVtZW50ID0gcHNNZW1UYWJsZUVsZW1lbnRGaXJzdF9nOworCXN0cnVjdCBzU2hiTWVtVGFibGUgKnBzTWVtVGFibGVFbGVtZW50T2xkID0gcHNNZW1UYWJsZUVsZW1lbnRGaXJzdF9nOworCWlmIChwc01lbVRhYmxlRWxlbWVudCAhPSBOVUxMKSB7CisJCXdoaWxlICgocHNNZW1UYWJsZUVsZW1lbnQgIT0gTlVMTCkKKwkJICAgICAgICYmIChwc01lbVRhYmxlRWxlbWVudC0+bV9pQnVmZmVySWQgIT0gaUJ1ZmZlcklkKSkgeworCQkJcHNNZW1UYWJsZUVsZW1lbnRPbGQgPSBwc01lbVRhYmxlRWxlbWVudDsKKwkJCXBzTWVtVGFibGVFbGVtZW50ID0KKwkJCSAgICBwc01lbVRhYmxlRWxlbWVudC0+bV9wc05leHRNZW1UYWJsZUVsZW1lbnQ7CisJCX0KKwkJaWYgKHBzTWVtVGFibGVFbGVtZW50ICE9IE5VTEwpIHsKKwkJCWlmIChwc01lbVRhYmxlRWxlbWVudCAhPSBwc01lbVRhYmxlRWxlbWVudEZpcnN0X2cpIHsKKwkJCQlwc01lbVRhYmxlRWxlbWVudE9sZC0+bV9wc05leHRNZW1UYWJsZUVsZW1lbnQgPQorCQkJCSAgICBwc01lbVRhYmxlRWxlbWVudC0+bV9wc05leHRNZW1UYWJsZUVsZW1lbnQ7CisJCQkJa2ZyZWUocHNNZW1UYWJsZUVsZW1lbnQpOworCQkJfSBlbHNlIHsKKwkJCQlrZnJlZShwc01lbVRhYmxlRWxlbWVudCk7CisJCQkJcHNNZW1UYWJsZUVsZW1lbnRGaXJzdF9nID0gTlVMTDsKKwkJCX0KKworCQl9CisJfQorCit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9TaGJJcGMtV2luMzIuYyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvU2hiSXBjLVdpbjMyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjkxODE0NwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvU2hiSXBjLVdpbjMyLmMKQEAgLTAsMCArMSwxMjAyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgUHJvamVjdCBpbmRlcGVuZGVuZCBzaGFyZWQgYnVmZmVyIChsaW5lYXIgKyBjaXJjdWxhcikKKworICBEZXNjcmlwdGlvbjogIEltcGxlbWVudGF0aW9uIG9mIHBsYXRmb3JtIHNwZWNpZmljIHBhcnQgZm9yIHRoZQorICAgICAgICAgICAgICAgIHNoYXJlZCBidWZmZXIKKyAgICAgICAgICAgICAgICAoSW1wbGVtZW50YXRpb24gZm9yIFdpbjMyKQorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIDIwMDYvMDYvMjcgLXJzOiAgIFYgMS4wMCAoaW5pdGlhbCB2ZXJzaW9uKQorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIFdJTlZFUiAgICAgICAweDA0MDAJLy8gI2RlZmluZXMgbmVjZXNzYXJ5IGZvciB1c2FnZSBvZgorI2RlZmluZSBfV0lOMzJfV0lOTlQgMHgwNDAwCS8vIGZ1bmN0aW9uIDxTaWduYWxPYmplY3RBbmRXYWl0PgorCisjaW5jbHVkZSA8d2luZG93cy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAiZ2xvYmFsLmgiCisjaW5jbHVkZSAic2hhcmVkYnVmZi5oIgorI2luY2x1ZGUgInNoYmlwYy5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICBHIEwgTyBCIEEgTCAgIEQgRSBGIEkgTiBJIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWYgKCFkZWZpbmVkKFNIQklQQ19JTkxJTkVEKSkgfHwgZGVmaW5lZChTSEJJUENfSU5MSU5FX0VOQUJMRUQpCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgQ29uZmlndXJhdGlvbgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBDb25zdGFudCBkZWZpbml0aW9ucworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2RlZmluZSBNQVhfTEVOX0JVRkZFUl9JRCAgICAgICBNQVhfUEFUSAorCisjZGVmaW5lIElEWF9FVkVOVF9ORVdfREFUQSAgICAgIDAKKyNkZWZpbmUgSURYX0VWRU5UX1RFUk1fUkVRVSAgICAgMQorI2RlZmluZSBJRFhfRVZFTlRfVEVSTV9SRVNQICAgICAyCisKKyNkZWZpbmUgTkFNRV9NVVRFWF9CVUZGX0FDQ0VTUyAgIkJ1ZmZBY2Nlc3MiCisjZGVmaW5lIE5BTUVfRVZFTlRfTkVXX0RBVEEgICAgICJOZXdEYXRhIgorI2RlZmluZSBOQU1FX0VWRU5UX1RFUk1fUkVRVSAgICAiVGVybVJlcXUiCisjZGVmaW5lIE5BTUVfRVZFTlRfVEVSTV9SRVNQICAgICJUZXJtUmVzcCIKKyNkZWZpbmUgTkFNRV9FVkVOVF9KT0JfUkVBRFkgICAgIkpvYlJlYWR5IgorCisjZGVmaW5lIFRJTUVPVVRfRU5URVJfQVRPTUlDICAgIDEwMDAJLy8gZm9yIGRlYmdnaW5nOiBJTkZJTklURQorI2RlZmluZSBUSU1FT1VUX1RFUk1fVEhSRUFEICAgICAyMDAwCisKKyNkZWZpbmUgU0JJX01BR0lDX0lEICAgICAgICAgICAgMHg1MzQyNDkyQgkvLyBtYWdpYyBJRCAoIlNCSSsiKQorI2RlZmluZSBTQkhfTUFHSUNfSUQgICAgICAgICAgICAweDUzNDI0ODJBCS8vIG1hZ2ljIElEICgiU0JIKiIpCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgTG9jYWwgdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIFRoaXMgc3RydWN0dXJlIGlzIHRoZSBjb21tb24gaGVhZGVyIGZvciB0aGUgc2hhcmVkIG1lbW9yeSByZWdpb24gdXNlZAorLy8gYnkgYWxsIHByb2Nlc3NlcyBhdHRhY2hlZCB0aGlzIHNoYXJlZCBtZW1vcnkuIEl0IGluY2x1ZGVzIGNvbW1vbgorLy8gaW5mb3JtYXRpb24gdG8gYWRtaW5pc3RyYXRlL21hbmFnZSB0aGUgc2hhcmVkIGJ1ZmZlciBmcm9tIGEgY291cGxlIG9mCisvLyBzZXBhcmF0ZWQgcHJvY2Vzc2VzIChlLmcuIHRoZSByZWZlcm5jZSBjb3VudGVyKS4gVGhpcyBzdHJ1Y3R1cmUgaXMKKy8vIGxvY2F0ZWQgYXQgdGhlIHN0YXJ0IG9mIHRoZSBzaGFyZWQgbWVtb3J5IHJlZ2lvbiBpdHNlbGYgYW5kIGV4aXN0cworLy8gY29uc2VxdWVudGx5IG9ubHkgb25lIHRpbWVzIHBlciBzaGFyZWQgbWVtb3J5IGluc3RhbmNlLgordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGxvbmcgbV9TYmhNYWdpY0lEOwkvLyBtYWdpYyBJRCAoIlNCSCoiKQorCXVuc2lnbmVkIGxvbmcgbV91bFNoTWVtU2l6ZTsKKwl1bnNpZ25lZCBsb25nIG1fdWxSZWZDb3VudDsKKwljaGFyIG1fc3pCdWZmZXJJRFtNQVhfTEVOX0JVRkZFUl9JRF07CisKKyNpZm5kZWYgTkRFQlVHCisJdW5zaWduZWQgbG9uZyBtX3VsT3duZXJQcm9jSUQ7CisjZW5kaWYKKworfSB0U2hiTWVtSGVhZGVyOworCisvLyBUaGlzIHN0cnVjdHVyZSBpcyB0aGUgImV4dGVybmFsIGVudHJ5IHBvaW50IiBmcm9tIGEgc2VwYXJhdGUgcHJvY2VzcworLy8gdG8gZ2V0IGFjY2VzcyB0byBhIHNoYXJlZCBidWZmZXIuIFRoaXMgc3RydWN0dXJlIGluY2x1ZGVzIGFsbCBwbGF0Zm9ybQorLy8gcmVzcC4gdGFyZ2V0IHNwZWNpZmljIGluZm9ybWF0aW9uIHRvIGFkbWluaXN0cmF0ZS9tYW5hZ2UgdGhlIHNoYXJlZAorLy8gYnVmZmVyIGZyb20gYSBzZXBhcmF0ZSBwcm9jZXNzLiBFdmVyeSBwcm9jZXNzIGF0dGFjaGVkIHRvIHRoZSBzaGFyZWQKKy8vIGJ1ZmZlciBoYXMgaXRzIG93biBydW50aW1lIGluc3RhbmNlIG9mIHRoaXMgc3RydWN0dXJlIHdpdGggaXRzIGluZGl2aWR1YWwKKy8vIHJ1bnRpbWUgZGF0YSAoZS5nLiB0aGUgc2NvcGUgb2YgYW4gZXZlbnQgaGFuZGxlIGlzIGxpbWl0dGVkIHRvIHRoZQorLy8gb3duZXIgcHJvY2VzcyBvbmx5KS4gVGhlIHN0cnVjdHVyZSBtZW1iZXIgPG1fcFNoYk1lbUhlYWRlcj4gcG9pbnRzCisvLyB0byB0aGUgKHByb2Nlc3Mgc3BlY2lmaWMpIHN0YXJ0IGFkZHJlc3Mgb2YgdGhlIHNoYXJlZCBtZW1vcnkgcmVnaW9uCisvLyBpdHNlbGYuCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgbG9uZyBtX1NiaU1hZ2ljSUQ7CS8vIG1hZ2ljIElEICgiU0JJKyIpCisJSEFORExFIG1faFNoYXJlZE1lbTsKKwlIQU5ETEUgbV9oTXV0ZXhCdWZmQWNjZXNzOworCUhBTkRMRSBtX2hUaHJlYWROZXdEYXRhOwkvLyB0aHJhZWQgdG8gc2lnbmFsIHRoYXQgbmV3IGRhdGEgYXJlIGF2YWlsYWJsZQorCUhBTkRMRSBtX2FoRXZlbnROZXdEYXRhWzNdOwkvLyBJRFhfRVZFTlRfTkVXX0RBVEEgKyBJRFhfRVZFTlRfVEVSTV9SRVFVICsgSURfRVZFTlRfVEVSTV9SRVNQCisJdFNpZ0huZGxyTmV3RGF0YSBtX3BmblNpZ0huZGxyTmV3RGF0YTsKKwlIQU5ETEUgbV9oVGhyZWFkSm9iUmVhZHk7CS8vIHRocmVhZCB0byBzaWduYWwgdGhhdCBhIGpvYi9vcGVyYXRpb24gaXMgcmVhZHkgbm93IChlLmcuIHJlc2V0IGJ1ZmZlcikKKwlIQU5ETEUgbV9oRXZlbnRKb2JSZWFkeTsKKwl1bnNpZ25lZCBsb25nIG1fdWxUaW1lT3V0Sm9iUmVhZHk7CisJdFNpZ0huZGxySm9iUmVhZHkgbV9wZm5TaWdIbmRsckpvYlJlYWR5OworCXRTaGJNZW1IZWFkZXIgKm1fcFNoYk1lbUhlYWRlcjsKKworI2lmbmRlZiBOREVCVUcKKwl1bnNpZ25lZCBsb25nIG1fdWxUaHJlYWRJRE5ld0RhdGE7CisJdW5zaWduZWQgbG9uZyBtX3VsVGhyZWFkSURKb2JSZWFkeTsKKyNlbmRpZgorCit9IHRTaGJNZW1JbnN0OworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIEdsb2JhbCB2YXJpYWJsZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgTG9jYWwgdmFyaWFibGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIFByb3RvdHlwZXMgb2YgaW50ZXJuYWwgZnVuY3Rpb25zCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIEdldCBwb2ludGVyIHRvIHByb2Nlc3MgbG9jYWwgaW5mb3JtYXRpb24gc3RydWN0dXJlCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJTkxJTkVfRlVOQ1RJT04gdFNoYk1lbUluc3QgKlNoYklwY0dldFNoYk1lbUluc3QodFNoYkluc3RhbmNlIHBTaGJJbnN0YW5jZV9wKQoreworCisJdFNoYk1lbUluc3QgKnBTaGJNZW1JbnN0OworCisJcFNoYk1lbUluc3QgPSAodFNoYk1lbUluc3QgKikgcFNoYkluc3RhbmNlX3A7CisJQVNTRVJUKHBTaGJNZW1JbnN0LT5tX1NiaU1hZ2ljSUQgPT0gU0JJX01BR0lDX0lEKTsKKworCXJldHVybiAocFNoYk1lbUluc3QpOworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgR2V0IHBvaW50ZXIgdG8gc2hhcmVkIG1lbW9yeSBoZWFkZXIKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lOTElORV9GVU5DVElPTiB0U2hiTWVtSGVhZGVyICpTaGJJcGNHZXRTaGJNZW1IZWFkZXIodFNoYkluc3RhbmNlCisJCQkJCQkgICAgIHBTaGJJbnN0YW5jZV9wKQoreworCisJdFNoYk1lbUluc3QgKnBTaGJNZW1JbnN0OworCXRTaGJNZW1IZWFkZXIgKnBTaGJNZW1IZWFkZXI7CisKKwlwU2hiTWVtSW5zdCA9IFNoYklwY0dldFNoYk1lbUluc3QocFNoYkluc3RhbmNlX3ApOworCXBTaGJNZW1IZWFkZXIgPSBwU2hiTWVtSW5zdC0+bV9wU2hiTWVtSGVhZGVyOworCUFTU0VSVChwU2hiTWVtSGVhZGVyLT5tX1NiaE1hZ2ljSUQgPT0gU0JIX01BR0lDX0lEKTsKKworCXJldHVybiAocFNoYk1lbUhlYWRlcik7CisKK30KKworLy8gbm90IGlubGluZWQgaW50ZXJuYWwgZnVuY3Rpb25zCitEV09SRCBXSU5BUEkgU2hiSXBjVGhyZWFkU2lnbmFsTmV3RGF0YShMUFZPSUQgcHZUaHJlYWRQYXJhbV9wKTsKK0RXT1JEIFdJTkFQSSBTaGJJcGNUaHJlYWRTaWduYWxKb2JSZWFkeShMUFZPSUQgcHZUaHJlYWRQYXJhbV9wKTsKK2NvbnN0IGNoYXIgKlNoYklwY0dldFVuaWZvcm1PYmplY3ROYW1lKGNvbnN0IGNoYXIgKnBzekV2ZW50Sm9iTmFtZV9wLAorCQkJCSAgICAgICBjb25zdCBjaGFyICpwc3pCdWZmZXJJRF9wLAorCQkJCSAgICAgICBCT09MIGZHbG9iYWxPYmplY3RfcCk7CisKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoU0hCSVBDX0lOTElORV9FTkFCTEVEKQorLy8gdHJ1ZSBpbnRlcm5hbCBmdW5jdGlvbnMgKG5vdCBpbmxpbmVkKQorc3RhdGljIHZvaWQgKlNoYklwY0FsbG9jUHJpdmF0ZU1lbSh1bnNpZ25lZCBsb25nIHVsTWVtU2l6ZV9wKTsKK3N0YXRpYyB2b2lkIFNoYklwY1JlbGVhc2VQcml2YXRlTWVtKHZvaWQgKnBNZW1fcCk7CisjZW5kaWYKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICBQIFUgQiBMIEkgQyAgIEYgVSBOIEMgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisKKyNpZiAhZGVmaW5lZChTSEJJUENfSU5MSU5FX0VOQUJMRUQpCisvLyBub3QgaW5saW5lZCBleHRlcm5hbCBmdW5jdGlvbnMKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBJbml0aWFsaXplIElQQyBmb3IgU2hhcmVkIEJ1ZmZlciBNb2R1bGUKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RTaGJFcnJvciBTaGJJcGNJbml0KHZvaWQpCit7CisKKwlyZXR1cm4gKGtTaGJPayk7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBEZWluaXRpYWxpemUgSVBDIGZvciBTaGFyZWQgQnVmZmVyIE1vZHVsZQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordFNoYkVycm9yIFNoYklwY0V4aXQodm9pZCkKK3sKKworCXJldHVybiAoa1NoYk9rKTsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIEFsbG9jYXRlIFNoYXJlZCBCdWZmZXIKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RTaGJFcnJvciBTaGJJcGNBbGxvY0J1ZmZlcih1bnNpZ25lZCBsb25nIHVsQnVmZmVyU2l6ZV9wLAorCQkJICAgIGNvbnN0IGNoYXIgKnBzekJ1ZmZlcklEX3AsCisJCQkgICAgdFNoYkluc3RhbmNlICogcHBTaGJJbnN0YW5jZV9wLAorCQkJICAgIHVuc2lnbmVkIGludCAqcGZTaGJOZXdDcmVhdGVkX3ApCit7CisKKwlIQU5ETEUgaFNoYXJlZE1lbTsKKwlMUFZPSUQgcFNoYXJlZE1lbTsKKwl1bnNpZ25lZCBsb25nIHVsU2hNZW1TaXplOworCXRTaGJNZW1JbnN0ICpwU2hiTWVtSW5zdDsKKwl0U2hiTWVtSGVhZGVyICpwU2hiTWVtSGVhZGVyOworCXRTaGJJbnN0YW5jZSBwU2hiSW5zdGFuY2U7CisJdW5zaWduZWQgaW50IGZTaE1lbU5ld0NyZWF0ZWQ7CisJY29uc3QgY2hhciAqcHN6T2JqZWN0TmFtZTsKKwlIQU5ETEUgaE11dGV4QnVmZkFjY2VzczsKKwlIQU5ETEUgaEV2ZW50TmV3RGF0YTsKKwlIQU5ETEUgaEV2ZW50Sm9iUmVhZHk7CisJdFNoYkVycm9yIFNoYkVycm9yOworCisJdWxTaE1lbVNpemUgPSB1bEJ1ZmZlclNpemVfcCArIHNpemVvZih0U2hiTWVtSGVhZGVyKTsKKwlwU2hhcmVkTWVtID0gTlVMTDsKKwlwU2hiSW5zdGFuY2UgPSBOVUxMOworCWZTaE1lbU5ld0NyZWF0ZWQgPSBGQUxTRTsKKwlTaGJFcnJvciA9IGtTaGJPazsKKworCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJLy8gKDEpIG9wZW4gYW4gZXhpc3Rpbmcgb3IgY3JlYXRlIGEgbmV3IHNoYXJlZCBtZW1vcnkKKwkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCS8vIHRyeSB0byBvcGVuIGFuIGFscmVhZHkgZXhpc3Rpbmcgc2hhcmVkIG1lbW9yeQorCS8vIChjcmVhdGVkIGJ5IGFuIGFub3RoZXIgcHJvY2VzcykKKwloU2hhcmVkTWVtID0gT3BlbkZpbGVNYXBwaW5nKEZJTEVfTUFQX0FMTF9BQ0NFU1MsCS8vIERXT1JEIGR3RGVzaXJlZEFjY2VzcworCQkJCSAgICAgRkFMU0UsCS8vIEJPT0wgYkluaGVyaXRIYW5kbGUKKwkJCQkgICAgIHBzekJ1ZmZlcklEX3ApOwkvLyBMUENUU1RSIGxwTmFtZQorCWlmIChoU2hhcmVkTWVtICE9IE5VTEwpIHsKKwkJLy8gYSBzaGFyZWQgbWVtb3J5IGFscmVhZHkgZXhpc3RzCisJCWZTaE1lbU5ld0NyZWF0ZWQgPSBGQUxTRTsKKwl9IGVsc2UgeworCQkvLyBpdCBzZWFtcyB0aGF0IHRoaXMgcHJvY2VzcyBpcyB0aGUgZmlyc3Qgd2hvIHdhbnRzIHRvIHVzZSB0aGUKKwkJLy8gc2hhcmVkIG1lbW9yeSwgc28gaXQgaGFzIHRvIGNyZWF0ZSBhIG5ldyBzaGFyZWQgbWVtb3J5CisJCWhTaGFyZWRNZW0gPSBDcmVhdGVGaWxlTWFwcGluZyhJTlZBTElEX0hBTkRMRV9WQUxVRSwJLy8gSEFORExFIGhGaWxlCisJCQkJCSAgICAgICBOVUxMLAkvLyBMUFNFQ1VSSVRZX0FUVFJJQlVURVMgbHBBdHRyaWJ1dGVzCisJCQkJCSAgICAgICBQQUdFX1JFQURXUklURSwJLy8gRFdPUkQgZmxQcm90ZWN0CisJCQkJCSAgICAgICAwLAkvLyBEV09SRCBkd01heGltdW1TaXplSGlnaAorCQkJCQkgICAgICAgdWxTaE1lbVNpemUsCS8vIERXT1JEIGR3TWF4aW11bVNpemVMb3cKKwkJCQkJICAgICAgIHBzekJ1ZmZlcklEX3ApOwkvLyBMUENUU1RSIGxwTmFtZQorCisJCWZTaE1lbU5ld0NyZWF0ZWQgPSBUUlVFOworCX0KKworCWlmIChoU2hhcmVkTWVtID09IE5VTEwpIHsKKwkJU2hiRXJyb3IgPSBrU2hiT3V0T2ZNZW07CisJCWdvdG8gRXhpdDsKKwl9CisKKwkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCS8vICgyKSBnZXQgdGhlIHBvaW50ZXIgdG8gdGhlIHNoYXJlZCBtZW1vcnkKKwkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCXBTaGFyZWRNZW0gPSBNYXBWaWV3T2ZGaWxlKGhTaGFyZWRNZW0sCS8vIEhBTkRMRSBoRmlsZU1hcHBpbmdPYmplY3QKKwkJCQkgICBGSUxFX01BUF9BTExfQUNDRVNTLAkvLyBEV09SRCBkd0Rlc2lyZWRBY2Nlc3MsCisJCQkJICAgMCwJLy8gRFdPUkQgZHdGaWxlT2Zmc2V0SGlnaCwKKwkJCQkgICAwLAkvLyBEV09SRCBkd0ZpbGVPZmZzZXRMb3csCisJCQkJICAgdWxTaE1lbVNpemUpOwkvLyBTSVpFX1QgZHdOdW1iZXJPZkJ5dGVzVG9NYXAKKworCWlmIChwU2hhcmVkTWVtID09IE5VTEwpIHsKKwkJU2hiRXJyb3IgPSBrU2hiT3V0T2ZNZW07CisJCWdvdG8gRXhpdDsKKwl9CisKKwkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCS8vICgzKSBzZXR1cCBvciB1cGRhdGUgaGVhZGVyIGFuZCBtYW5hZ2VtZW50IGluZm9ybWF0aW9uCisJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlwU2hiTWVtSGVhZGVyID0gKHRTaGJNZW1IZWFkZXIgKikgcFNoYXJlZE1lbTsKKworCS8vIGFsbG9jYXRlIGEgbWVtb3J5IGJsb2NrIGZyb20gcHJvY2VzcyBzcGVjaWZpYyBtZW1wb29sIHRvIHNhdmUKKwkvLyBwcm9jZXNzIGxvY2FsIGluZm9ybWF0aW9uIHRvIGFkbWluaXN0cmF0ZS9tYW5hZ2UgdGhlIHNoYXJlZCBidWZmZXIKKwlwU2hiTWVtSW5zdCA9CisJICAgICh0U2hiTWVtSW5zdCAqKSBTaGJJcGNBbGxvY1ByaXZhdGVNZW0oc2l6ZW9mKHRTaGJNZW1JbnN0KSk7CisJaWYgKHBTaGJNZW1JbnN0ID09IE5VTEwpIHsKKwkJU2hiRXJyb3IgPSBrU2hiT3V0T2ZNZW07CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gcmVzZXQgY29tcGxldGUgaGVhZGVyIHRvIGRlZmF1bHQgdmFsdWVzCisJcFNoYk1lbUluc3QtPm1fU2JpTWFnaWNJRCA9IFNCSV9NQUdJQ19JRDsKKwlwU2hiTWVtSW5zdC0+bV9oU2hhcmVkTWVtID0gaFNoYXJlZE1lbTsKKwlwU2hiTWVtSW5zdC0+bV9oTXV0ZXhCdWZmQWNjZXNzID0gSU5WQUxJRF9IQU5ETEVfVkFMVUU7CisJcFNoYk1lbUluc3QtPm1faFRocmVhZE5ld0RhdGEgPSBJTlZBTElEX0hBTkRMRV9WQUxVRTsKKwlwU2hiTWVtSW5zdC0+bV9haEV2ZW50TmV3RGF0YVtJRFhfRVZFTlRfTkVXX0RBVEFdID0KKwkgICAgSU5WQUxJRF9IQU5ETEVfVkFMVUU7CisJcFNoYk1lbUluc3QtPm1fYWhFdmVudE5ld0RhdGFbSURYX0VWRU5UX1RFUk1fUkVRVV0gPQorCSAgICBJTlZBTElEX0hBTkRMRV9WQUxVRTsKKwlwU2hiTWVtSW5zdC0+bV9haEV2ZW50TmV3RGF0YVtJRFhfRVZFTlRfVEVSTV9SRVNQXSA9CisJICAgIElOVkFMSURfSEFORExFX1ZBTFVFOworCXBTaGJNZW1JbnN0LT5tX3BmblNpZ0huZGxyTmV3RGF0YSA9IE5VTEw7CisJcFNoYk1lbUluc3QtPm1faFRocmVhZEpvYlJlYWR5ID0gSU5WQUxJRF9IQU5ETEVfVkFMVUU7CisJcFNoYk1lbUluc3QtPm1faEV2ZW50Sm9iUmVhZHkgPSBJTlZBTElEX0hBTkRMRV9WQUxVRTsKKwlwU2hiTWVtSW5zdC0+bV91bFRpbWVPdXRKb2JSZWFkeSA9IDA7CisJcFNoYk1lbUluc3QtPm1fcGZuU2lnSG5kbHJKb2JSZWFkeSA9IE5VTEw7CisJcFNoYk1lbUluc3QtPm1fcFNoYk1lbUhlYWRlciA9IHBTaGJNZW1IZWFkZXI7CisKKyNpZm5kZWYgTkRFQlVHCisJeworCQlwU2hiTWVtSW5zdC0+bV91bFRocmVhZElETmV3RGF0YSA9IDA7CisJCXBTaGJNZW1JbnN0LT5tX3VsVGhyZWFkSURKb2JSZWFkeSA9IDA7CisJfQorI2VuZGlmCisKKwkvLyBjcmVhdGUgbXV0ZXggZm9yIGJ1ZmZlciBhY2Nlc3MKKwlwc3pPYmplY3ROYW1lID0KKwkgICAgU2hiSXBjR2V0VW5pZm9ybU9iamVjdE5hbWUoTkFNRV9NVVRFWF9CVUZGX0FDQ0VTUywgcHN6QnVmZmVySURfcCwKKwkJCQkgICAgICAgVFJVRSk7CisJaE11dGV4QnVmZkFjY2VzcyA9IENyZWF0ZU11dGV4KE5VTEwsCS8vIExQU0VDVVJJVFlfQVRUUklCVVRFUyBscE11dGV4QXR0cmlidXRlcworCQkJCSAgICAgICBGQUxTRSwJLy8gQk9PTCBiSW5pdGlhbE93bmVyCisJCQkJICAgICAgIHBzek9iamVjdE5hbWUpOwkvLyBMUENUU1RSIGxwTmFtZQorCXBTaGJNZW1JbnN0LT5tX2hNdXRleEJ1ZmZBY2Nlc3MgPSBoTXV0ZXhCdWZmQWNjZXNzOworCUFTU0VSVChwU2hiTWVtSW5zdC0+bV9oTXV0ZXhCdWZmQWNjZXNzICE9IE5VTEwpOworCisJLy8gVGhlIEV2ZW50TmV3RGF0YSBpcyB1c2VkIGZvciBzaWduYWxpbmcgb2YgbmV3IGRhdGEgYWZ0ZXIgYSB3cml0ZQorCS8vIG9wZXJhdGlvbiAoU2V0RXZlbnQpIGFzIHdlbGwgYXMgZm9yIHdhaXRpbmcgZm9yIG5ldyBkYXRhIG9uIHRoZQorCS8vIHJlYWRlciBzaWRlIChXYWl0Rm9yTXVsdGlwbGVPYmplY3RzKS4gQmVjYXVzZSBpdCdzIG5vdCBrbm93biBpZgorCS8vIHRoaXMgcHJvY2VzcyB3aWxsIGJlIHJlYWQgb3Igd3JpdGUgZGF0YSwgdGhlIGV2ZW50IHdpbGwgYmUKKwkvLyBhbHdheXMgY3JlYXRlZCBoZXJlLgorCXBzek9iamVjdE5hbWUgPQorCSAgICBTaGJJcGNHZXRVbmlmb3JtT2JqZWN0TmFtZShOQU1FX0VWRU5UX05FV19EQVRBLCBwc3pCdWZmZXJJRF9wLAorCQkJCSAgICAgICBUUlVFKTsKKwloRXZlbnROZXdEYXRhID0gQ3JlYXRlRXZlbnQoTlVMTCwJLy8gTFBTRUNVUklUWV9BVFRSSUJVVEVTIGxwRXZlbnRBdHRyaWJ1dGVzCisJCQkJICAgIEZBTFNFLAkvLyBCT09MIGJNYW51YWxSZXNldAorCQkJCSAgICBGQUxTRSwJLy8gQk9PTCBiSW5pdGlhbFN0YXRlCisJCQkJICAgIHBzek9iamVjdE5hbWUpOwkvLyBMUENUU1RSIGxwTmFtZQorCXBTaGJNZW1JbnN0LT5tX2FoRXZlbnROZXdEYXRhW0lEWF9FVkVOVF9ORVdfREFUQV0gPSBoRXZlbnROZXdEYXRhOworCUFTU0VSVChwU2hiTWVtSW5zdC0+bV9haEV2ZW50TmV3RGF0YVtJRFhfRVZFTlRfTkVXX0RBVEFdICE9IE5VTEwpOworCisJLy8gVGhlIEV2ZW50Sm9iUmVhZHkgaXMgdXNlZCBmb3Igc2lnbmFsaW5nIHRoYXQgYSBqb2IgaXMgZG9uZSAoU2V0RXZlbnQpCisJLy8gYXMgd2VsbCBhcyBmb3Igd2FpdGluZyBmb3IgZmluaXNoaW5nIG9mIGEgam9iIChXYWl0Rm9yTXVsdGlwbGVPYmplY3RzKS4KKwkvLyBCZWNhdXNlIGl0J3Mgbm90IGtub3duIGlmIHRoaXMgcHJvY2VzcyB3aWxsIHNpZ25hbCBvciB3YWl0LCB0aGUgZXZlbnQKKwkvLyB3aWxsIGJlIGFsd2F5cyBjcmVhdGVkIGhlcmUuCisJcHN6T2JqZWN0TmFtZSA9CisJICAgIFNoYklwY0dldFVuaWZvcm1PYmplY3ROYW1lKE5BTUVfRVZFTlRfSk9CX1JFQURZLCBwc3pCdWZmZXJJRF9wLAorCQkJCSAgICAgICBUUlVFKTsKKwloRXZlbnRKb2JSZWFkeSA9IENyZWF0ZUV2ZW50KE5VTEwsCS8vIExQU0VDVVJJVFlfQVRUUklCVVRFUyBscEV2ZW50QXR0cmlidXRlcworCQkJCSAgICAgRkFMU0UsCS8vIEJPT0wgYk1hbnVhbFJlc2V0CisJCQkJICAgICBGQUxTRSwJLy8gQk9PTCBiSW5pdGlhbFN0YXRlCisJCQkJICAgICBwc3pPYmplY3ROYW1lKTsJLy8gTFBDVFNUUiBscE5hbWUKKwlwU2hiTWVtSW5zdC0+bV9oRXZlbnRKb2JSZWFkeSA9IGhFdmVudEpvYlJlYWR5OworCUFTU0VSVChwU2hiTWVtSW5zdC0+bV9oRXZlbnRKb2JSZWFkeSAhPSBOVUxMKTsKKworCWlmIChmU2hNZW1OZXdDcmVhdGVkKSB7CisJCS8vIHRoaXMgcHJvY2VzcyB3YXMgdGhlIGZpcnN0IHdobyB3YW50ZWQgdG8gdXNlIHRoZSBzaGFyZWQgbWVtb3J5LAorCQkvLyBzbyBhIG5ldyBzaGFyZWQgbWVtb3J5IHdhcyBjcmVhdGVkCisJCS8vIC0+IHNldHVwIG5ldyBoZWFkZXIgaW5mb3JtYXRpb24gaW5zaWRlIHRoZSBzaGFyZWQgbWVtb3J5IHJlZ2lvbgorCQkvLyAgICBpdHNlbGYKKwkJcFNoYk1lbUhlYWRlci0+bV9TYmhNYWdpY0lEID0gU0JIX01BR0lDX0lEOworCQlwU2hiTWVtSGVhZGVyLT5tX3VsU2hNZW1TaXplID0gdWxTaE1lbVNpemU7CisJCXBTaGJNZW1IZWFkZXItPm1fdWxSZWZDb3VudCA9IDE7CisJCXN0cm5jcHkocFNoYk1lbUhlYWRlci0+bV9zekJ1ZmZlcklELCBwc3pCdWZmZXJJRF9wLAorCQkJc2l6ZW9mKHBTaGJNZW1IZWFkZXItPm1fc3pCdWZmZXJJRCkgLSAxKTsKKworI2lmbmRlZiBOREVCVUcKKwkJeworCQkJcFNoYk1lbUhlYWRlci0+bV91bE93bmVyUHJvY0lEID0gR2V0Q3VycmVudFByb2Nlc3NJZCgpOworCQl9CisjZW5kaWYKKwl9IGVsc2UgeworCQkvLyBhbnkgb3RoZXIgcHJvY2VzcyBoYXMgY3JlYXRlZCB0aGUgc2hhcmVkIG1lbW9yeSBhbmQgdGhpcworCQkvLyBwcm9jZXNzIGhhcyBvbmx5IGF0dGFjaGVkIHRvIGl0CisJCS8vIC0+IGNoZWNrIGFuZCB1cGRhdGUgZXhpc3RpbmcgaGVhZGVyIGluZm9ybWF0aW9uIGluc2lkZSB0aGUKKwkJLy8gICAgc2hhcmVkIG1lbW9yeSByZWdpb24gaXRzZWxmCisJCWlmIChwU2hiTWVtSGVhZGVyLT5tX3VsU2hNZW1TaXplICE9IHVsU2hNZW1TaXplKSB7CisJCQlTaGJFcnJvciA9IGtTaGJPcGVuTWlzbWF0Y2g7CisJCQlnb3RvIEV4aXQ7CisJCX0KKyNpZm5kZWYgTkRFQlVHCisJCXsKKwkJCWlmIChzdHJuY21wCisJCQkgICAgKHBTaGJNZW1IZWFkZXItPm1fc3pCdWZmZXJJRCwgcHN6QnVmZmVySURfcCwKKwkJCSAgICAgc2l6ZW9mKHBTaGJNZW1IZWFkZXItPm1fc3pCdWZmZXJJRCkgLSAxKSkgeworCQkJCVNoYkVycm9yID0ga1NoYk9wZW5NaXNtYXRjaDsKKwkJCQlnb3RvIEV4aXQ7CisJCQl9CisJCX0KKyNlbmRpZgorCisJCXBTaGJNZW1IZWFkZXItPm1fdWxSZWZDb3VudCsrOworCX0KKworCS8vIHNldCBhYnN0YXJjdCAiaGFuZGxlIiBmb3IgcmV0dXJuaW5nIHRvIGFwcGxpY2F0aW9uCisJcFNoYkluc3RhbmNlID0gKHRTaGJJbnN0YW5jZSAqKSBwU2hiTWVtSW5zdDsKKworICAgICAgRXhpdDoKKworCWlmIChTaGJFcnJvciAhPSBrU2hiT2spIHsKKwkJaWYgKHBTaGJNZW1JbnN0ICE9IE5VTEwpIHsKKwkJCVNoYklwY1JlbGVhc2VQcml2YXRlTWVtKHBTaGJNZW1JbnN0KTsKKwkJfQorCQlpZiAocFNoYXJlZE1lbSAhPSBOVUxMKSB7CisJCQlVbm1hcFZpZXdPZkZpbGUocFNoYXJlZE1lbSk7CisJCX0KKwkJaWYgKGhTaGFyZWRNZW0gIT0gTlVMTCkgeworCQkJQ2xvc2VIYW5kbGUoaFNoYXJlZE1lbSk7CisJCX0KKwl9CisKKwkqcGZTaGJOZXdDcmVhdGVkX3AgPSBmU2hNZW1OZXdDcmVhdGVkOworCSpwcFNoYkluc3RhbmNlX3AgPSBwU2hiSW5zdGFuY2U7CisKKwlyZXR1cm4gKFNoYkVycm9yKTsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIFJlbGVhc2UgU2hhcmVkIEJ1ZmZlcgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordFNoYkVycm9yIFNoYklwY1JlbGVhc2VCdWZmZXIodFNoYkluc3RhbmNlIHBTaGJJbnN0YW5jZV9wKQoreworCisJdFNoYk1lbUluc3QgKnBTaGJNZW1JbnN0OworCXRTaGJNZW1IZWFkZXIgKnBTaGJNZW1IZWFkZXI7CisJSEFORExFIGhFdmVudE5ld0RhdGE7CisJSEFORExFIGhNdXRleEJ1ZmZBY2Nlc3M7CisJdFNoYkVycm9yIFNoYkVycm9yOworCXRTaGJFcnJvciBTaGJFcnJvcjI7CisKKwlpZiAocFNoYkluc3RhbmNlX3AgPT0gTlVMTCkgeworCQlyZXR1cm4gKGtTaGJPayk7CisJfQorCisJcFNoYk1lbUluc3QgPSBTaGJJcGNHZXRTaGJNZW1JbnN0KHBTaGJJbnN0YW5jZV9wKTsKKwlwU2hiTWVtSGVhZGVyID0gU2hiSXBjR2V0U2hiTWVtSGVhZGVyKHBTaGJJbnN0YW5jZV9wKTsKKworCWlmICghLS1wU2hiTWVtSGVhZGVyLT5tX3VsUmVmQ291bnQpIHsKKwkJU2hiRXJyb3IgPSBrU2hiT2s7CisJfSBlbHNlIHsKKwkJU2hiRXJyb3IgPSBrU2hiTWVtVXNlZEJ5T3RoZXJQcm9jczsKKwl9CisKKwlTaGJFcnJvcjIgPSBTaGJJcGNTdG9wU2lnbmFsaW5nTmV3RGF0YShwU2hiSW5zdGFuY2VfcCk7CisJaEV2ZW50TmV3RGF0YSA9IHBTaGJNZW1JbnN0LT5tX2FoRXZlbnROZXdEYXRhW0lEWF9FVkVOVF9ORVdfREFUQV07CisJaWYgKGhFdmVudE5ld0RhdGEgIT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpIHsKKwkJQ2xvc2VIYW5kbGUoaEV2ZW50TmV3RGF0YSk7CisJCXBTaGJNZW1JbnN0LT5tX2FoRXZlbnROZXdEYXRhW0lEWF9FVkVOVF9ORVdfREFUQV0gPQorCQkgICAgSU5WQUxJRF9IQU5ETEVfVkFMVUU7CisJfQorCisJaE11dGV4QnVmZkFjY2VzcyA9IHBTaGJNZW1JbnN0LT5tX2hNdXRleEJ1ZmZBY2Nlc3M7CisJaWYgKGhNdXRleEJ1ZmZBY2Nlc3MgIT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpIHsKKwkJQ2xvc2VIYW5kbGUoaE11dGV4QnVmZkFjY2Vzcyk7CisJCXBTaGJNZW1JbnN0LT5tX2hNdXRleEJ1ZmZBY2Nlc3MgPSBJTlZBTElEX0hBTkRMRV9WQUxVRTsKKwl9CisKKwlVbm1hcFZpZXdPZkZpbGUocFNoYk1lbUhlYWRlcik7CisJaWYgKHBTaGJNZW1JbnN0LT5tX2hTaGFyZWRNZW0gIT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpIHsKKwkJQ2xvc2VIYW5kbGUocFNoYk1lbUluc3QtPm1faFNoYXJlZE1lbSk7CisJCXBTaGJNZW1JbnN0LT5tX2hTaGFyZWRNZW0gPSBJTlZBTElEX0hBTkRMRV9WQUxVRTsKKwl9CisKKwlTaGJJcGNSZWxlYXNlUHJpdmF0ZU1lbShwU2hiTWVtSW5zdCk7CisKKwlpZiAoU2hiRXJyb3IgPT0ga1NoYk9rKSB7CisJCVNoYkVycm9yID0gU2hiRXJyb3IyOworCX0KKworCXJldHVybiAoU2hiRXJyb3IpOworCit9CisKKyNlbmRpZiAvLyAhZGVmaW5lZChTSEJJUENfSU5MSU5FX0VOQUJMRUQpCisKKyNpZiAoIWRlZmluZWQoU0hCSVBDX0lOTElORUQpKSB8fCBkZWZpbmVkKFNIQklQQ19JTkxJTkVfRU5BQkxFRCkKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBFbnRlciBhdG9taWMgc2VjdGlvbiBmb3IgU2hhcmVkIEJ1ZmZlciBhY2Nlc3MKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lOTElORV9GVU5DVElPTiB0U2hiRXJyb3IgU2hiSXBjRW50ZXJBdG9taWNTZWN0aW9uKHRTaGJJbnN0YW5jZSBwU2hiSW5zdGFuY2VfcCkKK3sKKworCXRTaGJNZW1JbnN0ICpwU2hiTWVtSW5zdDsKKwlIQU5ETEUgaE11dGV4QnVmZkFjY2VzczsKKwlEV09SRCBkd1dhaXRSZXN1bHQ7CisJdFNoYkVycm9yIFNoYkVycm9yOworCisJaWYgKHBTaGJJbnN0YW5jZV9wID09IE5VTEwpIHsKKwkJcmV0dXJuIChrU2hiSW52YWxpZEFyZyk7CisJfQorCisJcFNoYk1lbUluc3QgPSBTaGJJcGNHZXRTaGJNZW1JbnN0KHBTaGJJbnN0YW5jZV9wKTsKKwlTaGJFcnJvciA9IGtTaGJPazsKKworCWhNdXRleEJ1ZmZBY2Nlc3MgPSBwU2hiTWVtSW5zdC0+bV9oTXV0ZXhCdWZmQWNjZXNzOworCWlmIChoTXV0ZXhCdWZmQWNjZXNzICE9IElOVkFMSURfSEFORExFX1ZBTFVFKSB7CisJCWR3V2FpdFJlc3VsdCA9CisJCSAgICBXYWl0Rm9yU2luZ2xlT2JqZWN0KGhNdXRleEJ1ZmZBY2Nlc3MsIFRJTUVPVVRfRU5URVJfQVRPTUlDKTsKKwkJc3dpdGNoIChkd1dhaXRSZXN1bHQpIHsKKwkJY2FzZSBXQUlUX09CSkVDVF8wICsgMDoKKwkJCXsKKwkJCQlicmVhazsKKwkJCX0KKworCQljYXNlIFdBSVRfVElNRU9VVDoKKwkJCXsKKwkJCQlUUkFDRTAKKwkJCQkgICAgKCJcblNoYklwY0VudGVyQXRvbWljU2VjdGlvbigpOiBXQUlUX1RJTUVPVVQiKTsKKwkJCQlBU1NFUlQoMCk7CisJCQkJU2hiRXJyb3IgPSBrU2hiQnVmZmVySW52YWxpZDsKKwkJCQlicmVhazsKKwkJCX0KKworCQljYXNlIFdBSVRfQUJBTkRPTkVEOgorCQkJeworCQkJCVRSQUNFMAorCQkJCSAgICAoIlxuU2hiSXBjRW50ZXJBdG9taWNTZWN0aW9uKCk6IFdBSVRfQUJBTkRPTkVEIik7CisJCQkJQVNTRVJUKDApOworCQkJCVNoYkVycm9yID0ga1NoYkJ1ZmZlckludmFsaWQ7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJY2FzZSBXQUlUX0ZBSUxFRDoKKwkJCXsKKwkJCQlUUkFDRTEKKwkJCQkgICAgKCJcblNoYklwY0VudGVyQXRvbWljU2VjdGlvbigpOiBXQUlUX0ZBSUxFRCAtPiBMYXN0RXJyb3I9JWxkIiwKKwkJCQkgICAgIEdldExhc3RFcnJvcigpKTsKKwkJCQlBU1NFUlQoMCk7CisJCQkJU2hiRXJyb3IgPSBrU2hiQnVmZmVySW52YWxpZDsKKwkJCQlicmVhazsKKwkJCX0KKworCQlkZWZhdWx0OgorCQkJeworCQkJCVRSQUNFMQorCQkJCSAgICAoIlxuU2hiSXBjRW50ZXJBdG9taWNTZWN0aW9uKCk6IHVua25vd24gZXJyb3IgLT4gTGFzdEVycm9yPSVsZCIsCisJCQkJICAgICBHZXRMYXN0RXJyb3IoKSk7CisJCQkJQVNTRVJUKDApOworCQkJCVNoYkVycm9yID0ga1NoYkJ1ZmZlckludmFsaWQ7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlTaGJFcnJvciA9IGtTaGJCdWZmZXJJbnZhbGlkOworCX0KKworCXJldHVybiAoU2hiRXJyb3IpOworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgTGVhdmUgYXRvbWljIHNlY3Rpb24gZm9yIFNoYXJlZCBCdWZmZXIgYWNjZXNzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJTkxJTkVfRlVOQ1RJT04gdFNoYkVycm9yIFNoYklwY0xlYXZlQXRvbWljU2VjdGlvbih0U2hiSW5zdGFuY2UgcFNoYkluc3RhbmNlX3ApCit7CisKKwl0U2hiTWVtSW5zdCAqcFNoYk1lbUluc3Q7CisJSEFORExFIGhNdXRleEJ1ZmZBY2Nlc3M7CisJQk9PTCBmUmVzOworCXRTaGJFcnJvciBTaGJFcnJvcjsKKworCWlmIChwU2hiSW5zdGFuY2VfcCA9PSBOVUxMKSB7CisJCXJldHVybiAoa1NoYkludmFsaWRBcmcpOworCX0KKworCXBTaGJNZW1JbnN0ID0gU2hiSXBjR2V0U2hiTWVtSW5zdChwU2hiSW5zdGFuY2VfcCk7CisJU2hiRXJyb3IgPSBrU2hiT2s7CisKKwloTXV0ZXhCdWZmQWNjZXNzID0gcFNoYk1lbUluc3QtPm1faE11dGV4QnVmZkFjY2VzczsKKwlpZiAoaE11dGV4QnVmZkFjY2VzcyAhPSBJTlZBTElEX0hBTkRMRV9WQUxVRSkgeworCQlmUmVzID0gUmVsZWFzZU11dGV4KGhNdXRleEJ1ZmZBY2Nlc3MpOworCQlBU1NFUlQoZlJlcyk7CisJfSBlbHNlIHsKKwkJU2hiRXJyb3IgPSBrU2hiQnVmZmVySW52YWxpZDsKKwl9CisKKwlyZXR1cm4gKFNoYkVycm9yKTsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIFN0YXJ0IHNpZ25hbGluZyBvZiBuZXcgZGF0YSAoY2FsbGVkIGZyb20gcmVhZGluZyBwcm9jZXNzKQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSU5MSU5FX0ZVTkNUSU9OIHRTaGJFcnJvciBTaGJJcGNTdGFydFNpZ25hbGluZ05ld0RhdGEodFNoYkluc3RhbmNlCisJCQkJCQkgICAgICBwU2hiSW5zdGFuY2VfcCwKKwkJCQkJCSAgICAgIHRTaWdIbmRsck5ld0RhdGEKKwkJCQkJCSAgICAgIHBmblNpZ25hbEhhbmRsZXJOZXdEYXRhX3AsCisJCQkJCQkgICAgICB0U2hiUHJpb3JpdHkKKwkJCQkJCSAgICAgIFNoYlByaW9yaXR5X3ApCit7CisKKwl0U2hiTWVtSW5zdCAqcFNoYk1lbUluc3Q7CisJdFNoYk1lbUhlYWRlciAqcFNoYk1lbUhlYWRlcjsKKwljb25zdCBjaGFyICpwc3pPYmplY3ROYW1lOworCUhBTkRMRSBoRXZlbnRUZXJtUmVxdTsKKwlIQU5ETEUgaEV2ZW50VGVybVJlc3A7CisJSEFORExFIGhUaHJlYWROZXdEYXRhOworCXVuc2lnbmVkIGxvbmcgdWxUaHJlYWRJRE5ld0RhdGE7CisJdFNoYkVycm9yIFNoYkVycm9yOworCWludCBpUHJpb3JpdHk7CisKKwlpZiAoKHBTaGJJbnN0YW5jZV9wID09IE5VTEwpIHx8IChwZm5TaWduYWxIYW5kbGVyTmV3RGF0YV9wID09IE5VTEwpKSB7CisJCXJldHVybiAoa1NoYkludmFsaWRBcmcpOworCX0KKworCXBTaGJNZW1JbnN0ID0gU2hiSXBjR2V0U2hiTWVtSW5zdChwU2hiSW5zdGFuY2VfcCk7CisJcFNoYk1lbUhlYWRlciA9IFNoYklwY0dldFNoYk1lbUhlYWRlcihwU2hiSW5zdGFuY2VfcCk7CisJU2hiRXJyb3IgPSBrU2hiT2s7CisKKwlpZiAoKHBTaGJNZW1JbnN0LT5tX2hUaHJlYWROZXdEYXRhICE9IElOVkFMSURfSEFORExFX1ZBTFVFKSB8fAorCSAgICAocFNoYk1lbUluc3QtPm1fYWhFdmVudE5ld0RhdGFbSURYX0VWRU5UX1RFUk1fUkVRVV0gIT0KKwkgICAgIElOVkFMSURfSEFORExFX1ZBTFVFKQorCSAgICB8fCAocFNoYk1lbUluc3QtPm1fYWhFdmVudE5ld0RhdGFbSURYX0VWRU5UX1RFUk1fUkVTUF0gIT0KKwkJSU5WQUxJRF9IQU5ETEVfVkFMVUUpCisJICAgIHx8IChwU2hiTWVtSW5zdC0+bV9wZm5TaWdIbmRsck5ld0RhdGEgIT0gTlVMTCkpIHsKKwkJU2hiRXJyb3IgPSBrU2hiQWxyZWFkeVNpZ25hbGluZzsKKwkJZ290byBFeGl0OworCX0KKworCXBTaGJNZW1JbnN0LT5tX3BmblNpZ0huZGxyTmV3RGF0YSA9IHBmblNpZ25hbEhhbmRsZXJOZXdEYXRhX3A7CisKKwkvLyBCZWNhdXNlIHRoZSBldmVudCA8cFNoYk1lbUluc3QtPm1fYWhFdmVudE5ld0RhdGFbSURYX0VWRU5UX05FV19EQVRBXT4KKwkvLyBpcyB1c2VkIGZvciBzaWduYWxpbmcgb2YgbmV3IGRhdGEgYWZ0ZXIgYSB3cml0ZSBvcGVyYXRpb24gdG9vICh1c2luZworCS8vIFNldEV2ZW50KSwgaXQgaXMgYWx3YXlzIGNyZWF0ZWQgaGVyZSAoc2VlIDxTaGJJcGNBbGxvY0J1ZmZlcj4pLgorCisJcHN6T2JqZWN0TmFtZSA9CisJICAgIFNoYklwY0dldFVuaWZvcm1PYmplY3ROYW1lKE5BTUVfRVZFTlRfVEVSTV9SRVFVLAorCQkJCSAgICAgICBwU2hiTWVtSGVhZGVyLT5tX3N6QnVmZmVySUQsIEZBTFNFKTsKKwloRXZlbnRUZXJtUmVxdSA9IENyZWF0ZUV2ZW50KE5VTEwsCS8vIExQU0VDVVJJVFlfQVRUUklCVVRFUyBscEV2ZW50QXR0cmlidXRlcworCQkJCSAgICAgRkFMU0UsCS8vIEJPT0wgYk1hbnVhbFJlc2V0CisJCQkJICAgICBGQUxTRSwJLy8gQk9PTCBiSW5pdGlhbFN0YXRlCisJCQkJICAgICBwc3pPYmplY3ROYW1lKTsJLy8gTFBDVFNUUiBscE5hbWUKKwlwU2hiTWVtSW5zdC0+bV9haEV2ZW50TmV3RGF0YVtJRFhfRVZFTlRfVEVSTV9SRVFVXSA9IGhFdmVudFRlcm1SZXF1OworCUFTU0VSVChwU2hiTWVtSW5zdC0+bV9haEV2ZW50TmV3RGF0YVtJRFhfRVZFTlRfVEVSTV9SRVFVXSAhPSBOVUxMKTsKKworCXBzek9iamVjdE5hbWUgPQorCSAgICBTaGJJcGNHZXRVbmlmb3JtT2JqZWN0TmFtZShOQU1FX0VWRU5UX1RFUk1fUkVTUCwKKwkJCQkgICAgICAgcFNoYk1lbUhlYWRlci0+bV9zekJ1ZmZlcklELCBGQUxTRSk7CisJaEV2ZW50VGVybVJlc3AgPSBDcmVhdGVFdmVudChOVUxMLAkvLyBMUFNFQ1VSSVRZX0FUVFJJQlVURVMgbHBFdmVudEF0dHJpYnV0ZXMKKwkJCQkgICAgIEZBTFNFLAkvLyBCT09MIGJNYW51YWxSZXNldAorCQkJCSAgICAgRkFMU0UsCS8vIEJPT0wgYkluaXRpYWxTdGF0ZQorCQkJCSAgICAgcHN6T2JqZWN0TmFtZSk7CS8vIExQQ1RTVFIgbHBOYW1lCisJcFNoYk1lbUluc3QtPm1fYWhFdmVudE5ld0RhdGFbSURYX0VWRU5UX1RFUk1fUkVTUF0gPSBoRXZlbnRUZXJtUmVzcDsKKwlBU1NFUlQocFNoYk1lbUluc3QtPm1fYWhFdmVudE5ld0RhdGFbSURYX0VWRU5UX1RFUk1fUkVTUF0gIT0gTlVMTCk7CisKKwloVGhyZWFkTmV3RGF0YSA9IENyZWF0ZVRocmVhZChOVUxMLAkvLyBMUFNFQ1VSSVRZX0FUVFJJQlVURVMgbHBUaHJlYWRBdHRyaWJ1dGVzCisJCQkJICAgICAgMCwJLy8gU0laRV9UIGR3U3RhY2tTaXplCisJCQkJICAgICAgU2hiSXBjVGhyZWFkU2lnbmFsTmV3RGF0YSwJLy8gTFBUSFJFQURfU1RBUlRfUk9VVElORSBscFN0YXJ0QWRkcmVzcworCQkJCSAgICAgIHBTaGJJbnN0YW5jZV9wLAkvLyBMUFZPSUQgbHBQYXJhbWV0ZXIKKwkJCQkgICAgICAwLAkvLyBEV09SRCBkd0NyZWF0aW9uRmxhZ3MKKwkJCQkgICAgICAmdWxUaHJlYWRJRE5ld0RhdGEpOwkvLyBMUERXT1JEIGxwVGhyZWFkSWQKKworCXN3aXRjaCAoU2hiUHJpb3JpdHlfcCkgeworCWNhc2Uga1NoYlByaW9yaXR5TG93OgorCQlpUHJpb3JpdHkgPSBUSFJFQURfUFJJT1JJVFlfQkVMT1dfTk9STUFMOworCQlicmVhazsKKworCWNhc2Uga1NoYlByaW9yaXR5Tm9ybWFsOgorCQlpUHJpb3JpdHkgPSBUSFJFQURfUFJJT1JJVFlfTk9STUFMOworCQlicmVhazsKKworCWNhc2Uga3NoYlByaW9yaXR5SGlnaDoKKwkJaVByaW9yaXR5ID0gVEhSRUFEX1BSSU9SSVRZX0FCT1ZFX05PUk1BTDsKKwkJYnJlYWs7CisKKwl9CisKKwlBU1NFUlQocFNoYk1lbUluc3QtPm1faFRocmVhZE5ld0RhdGEgIT0gTlVMTCk7CisKKwlTZXRUaHJlYWRQcmlvcml0eShoVGhyZWFkTmV3RGF0YSwgaVByaW9yaXR5KTsKKworCXBTaGJNZW1JbnN0LT5tX2hUaHJlYWROZXdEYXRhID0gaFRocmVhZE5ld0RhdGE7CisKKyNpZm5kZWYgTkRFQlVHCisJeworCQlwU2hiTWVtSW5zdC0+bV91bFRocmVhZElETmV3RGF0YSA9IHVsVGhyZWFkSUROZXdEYXRhOworCX0KKyNlbmRpZgorCisgICAgICBFeGl0OgorCisJcmV0dXJuIChTaGJFcnJvcik7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBTdG9wIHNpZ25hbGluZyBvZiBuZXcgZGF0YSAoY2FsbGVkIGZyb20gcmVhZGluZyBwcm9jZXNzKQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSU5MSU5FX0ZVTkNUSU9OIHRTaGJFcnJvciBTaGJJcGNTdG9wU2lnbmFsaW5nTmV3RGF0YSh0U2hiSW5zdGFuY2UKKwkJCQkJCSAgICAgcFNoYkluc3RhbmNlX3ApCit7CisKKwl0U2hiTWVtSW5zdCAqcFNoYk1lbUluc3Q7CisJSEFORExFIGhFdmVudFRlcm1SZXF1OworCUhBTkRMRSBoRXZlbnRUZXJtUmVzcDsKKwlEV09SRCBkd1dhaXRSZXN1bHQ7CisKKwlpZiAocFNoYkluc3RhbmNlX3AgPT0gTlVMTCkgeworCQlyZXR1cm4gKGtTaGJJbnZhbGlkQXJnKTsKKwl9CisKKwlwU2hiTWVtSW5zdCA9IFNoYklwY0dldFNoYk1lbUluc3QocFNoYkluc3RhbmNlX3ApOworCisJLy8gdGVybWluYXRlIG5ldyBkYXRhIHNpZ25hbGluZyB0aHJlYWQKKwkvLyAoc2V0IGV2ZW50IDxoRXZlbnRUZXJtUmVxdT4gdG8gd2FrZXVwIHRoZSB0aHJlYWQgYW5kIGRpc3Bvc2UgaXQKKwkvLyB0byBleGl0LCB0aGVuIHdhaXQgZm9yIGNvbmZpcm1hdGlvbiB1c2luZyBldmVudCA8aEV2ZW50VGVybVJlc3A+KQorCWhFdmVudFRlcm1SZXF1ID0gcFNoYk1lbUluc3QtPm1fYWhFdmVudE5ld0RhdGFbSURYX0VWRU5UX1RFUk1fUkVRVV07CisJaEV2ZW50VGVybVJlc3AgPSBwU2hiTWVtSW5zdC0+bV9haEV2ZW50TmV3RGF0YVtJRFhfRVZFTlRfVEVSTV9SRVNQXTsKKwlpZiAoKGhFdmVudFRlcm1SZXF1ICE9IElOVkFMSURfSEFORExFX1ZBTFVFKSAmJgorCSAgICAoaEV2ZW50VGVybVJlc3AgIT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpKSB7CisJCVRSQUNFMCgiXG5TaGJJcGNTdG9wU2lnbmFsaW5nTmV3RGF0YSgpOiBlbnRlciB3YWl0IHN0YXRlIik7CisJCWR3V2FpdFJlc3VsdCA9IFNpZ25hbE9iamVjdEFuZFdhaXQoaEV2ZW50VGVybVJlcXUsCS8vIEhBTkRMRSBoT2JqZWN0VG9TaWduYWwKKwkJCQkJCSAgIGhFdmVudFRlcm1SZXNwLAkvLyBIQU5ETEUgaE9iamVjdFRvV2FpdE9uCisJCQkJCQkgICBUSU1FT1VUX1RFUk1fVEhSRUFELAkvLyBEV09SRCBkd01pbGxpc2Vjb25kcworCQkJCQkJICAgRkFMU0UpOwkvLyBCT09MIGJBbGVydGFibGUKKwkJVFJBQ0UwCisJCSAgICAoIlxuU2hiSXBjU3RvcFNpZ25hbGluZ05ld0RhdGEoKTogd2FpdCBzdGF0ZSBsZWF2ZWQ6IC0tLT4gIik7CisJCXN3aXRjaCAoZHdXYWl0UmVzdWx0KSB7CisJCWNhc2UgV0FJVF9PQkpFQ1RfMCArIDA6CS8vIGV2ZW50ICJuZXcgZGF0YSBzaWduYWxpbmcgdGhyZWFkIHRlcm1pbmF0ZWQiCisJCQl7CisJCQkJVFJBQ0UwKCJFdmVudCA9IFdBSVRfT0JKRUNUXzArMCIpOworCQkJCWJyZWFrOworCQkJfQorCisJCWRlZmF1bHQ6CisJCQl7CisJCQkJVFJBQ0UwKCJVbmhhbmRsZWQgRXZlbnQiKTsKKwkJCQlBU1NFUlQoMCk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwlpZiAocFNoYk1lbUluc3QtPm1faFRocmVhZE5ld0RhdGEgIT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpIHsKKwkJQ2xvc2VIYW5kbGUocFNoYk1lbUluc3QtPm1faFRocmVhZE5ld0RhdGEpOworCQlwU2hiTWVtSW5zdC0+bV9oVGhyZWFkTmV3RGF0YSA9IElOVkFMSURfSEFORExFX1ZBTFVFOworCX0KKworCWlmIChwU2hiTWVtSW5zdC0+bV9haEV2ZW50TmV3RGF0YVtJRFhfRVZFTlRfVEVSTV9SRVFVXSAhPQorCSAgICBJTlZBTElEX0hBTkRMRV9WQUxVRSkgeworCQlDbG9zZUhhbmRsZShwU2hiTWVtSW5zdC0+bV9haEV2ZW50TmV3RGF0YVtJRFhfRVZFTlRfVEVSTV9SRVFVXSk7CisJCXBTaGJNZW1JbnN0LT5tX2FoRXZlbnROZXdEYXRhW0lEWF9FVkVOVF9URVJNX1JFUVVdID0KKwkJICAgIElOVkFMSURfSEFORExFX1ZBTFVFOworCX0KKworCWlmIChwU2hiTWVtSW5zdC0+bV9haEV2ZW50TmV3RGF0YVtJRFhfRVZFTlRfVEVSTV9SRVNQXSAhPQorCSAgICBJTlZBTElEX0hBTkRMRV9WQUxVRSkgeworCQlDbG9zZUhhbmRsZShwU2hiTWVtSW5zdC0+bV9haEV2ZW50TmV3RGF0YVtJRFhfRVZFTlRfVEVSTV9SRVNQXSk7CisJCXBTaGJNZW1JbnN0LT5tX2FoRXZlbnROZXdEYXRhW0lEWF9FVkVOVF9URVJNX1JFU1BdID0KKwkJICAgIElOVkFMSURfSEFORExFX1ZBTFVFOworCX0KKworCXBTaGJNZW1JbnN0LT5tX3BmblNpZ0huZGxyTmV3RGF0YSA9IE5VTEw7CisKKwlyZXR1cm4gKGtTaGJPayk7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBTaWduYWwgbmV3IGRhdGEgKGNhbGxlZCBmcm9tIHdyaXRpbmcgcHJvY2VzcykKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lOTElORV9GVU5DVElPTiB0U2hiRXJyb3IgU2hiSXBjU2lnbmFsTmV3RGF0YSh0U2hiSW5zdGFuY2UgcFNoYkluc3RhbmNlX3ApCit7CisKKwl0U2hiTWVtSW5zdCAqcFNoYk1lbUluc3Q7CisJSEFORExFIGhFdmVudE5ld0RhdGE7CisJQk9PTCBmUmVzOworCisJLy8gVFJBQ0UwKCJcblNoYklwY1NpZ25hbE5ld0RhdGEoKTogZW50ZXJcbiIpOworCisJaWYgKHBTaGJJbnN0YW5jZV9wID09IE5VTEwpIHsKKwkJcmV0dXJuIChrU2hiSW52YWxpZEFyZyk7CisJfQorCisJcFNoYk1lbUluc3QgPSBTaGJJcGNHZXRTaGJNZW1JbnN0KHBTaGJJbnN0YW5jZV9wKTsKKworCUFTU0VSVChwU2hiTWVtSW5zdC0+bV9haEV2ZW50TmV3RGF0YVtJRFhfRVZFTlRfTkVXX0RBVEFdICE9CisJICAgICAgIElOVkFMSURfSEFORExFX1ZBTFVFKTsKKwloRXZlbnROZXdEYXRhID0gcFNoYk1lbUluc3QtPm1fYWhFdmVudE5ld0RhdGFbSURYX0VWRU5UX05FV19EQVRBXTsKKwlpZiAoaEV2ZW50TmV3RGF0YSAhPSBJTlZBTElEX0hBTkRMRV9WQUxVRSkgeworCQlmUmVzID0gU2V0RXZlbnQoaEV2ZW50TmV3RGF0YSk7CisJCS8vIFRSQUNFMSgiXG5TaGJJcGNTaWduYWxOZXdEYXRhKCk6IEV2ZW50TmV3RGF0YSBzZXQgKFJlc3VsdD0lZClcbiIsIChpbnQpZlJlcyk7CisJCUFTU0VSVChmUmVzKTsKKwl9CisJLy8gVFJBQ0UwKCJcblNoYklwY1NpZ25hbE5ld0RhdGEoKTogbGVhdmVcbiIpOworCXJldHVybiAoa1NoYk9rKTsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIFN0YXJ0IHNpZ25hbGluZyBmb3Igam9iIHJlYWR5IChjYWxsZWQgZnJvbSB3YWl0aW5nIHByb2Nlc3MpCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJTkxJTkVfRlVOQ1RJT04gdFNoYkVycm9yIFNoYklwY1N0YXJ0U2lnbmFsaW5nSm9iUmVhZHkodFNoYkluc3RhbmNlCisJCQkJCQkgICAgICAgcFNoYkluc3RhbmNlX3AsCisJCQkJCQkgICAgICAgdW5zaWduZWQgbG9uZworCQkJCQkJICAgICAgIHVsVGltZU91dF9wLAorCQkJCQkJICAgICAgIHRTaWdIbmRsckpvYlJlYWR5CisJCQkJCQkgICAgICAgcGZuU2lnbmFsSGFuZGxlckpvYlJlYWR5X3ApCit7CisKKwl0U2hiTWVtSW5zdCAqcFNoYk1lbUluc3Q7CisJdFNoYk1lbUhlYWRlciAqcFNoYk1lbUhlYWRlcjsKKwlIQU5ETEUgaFRocmVhZEpvYlJlYWR5OworCXVuc2lnbmVkIGxvbmcgdWxUaHJlYWRJREpvYlJlYWR5OworCXRTaGJFcnJvciBTaGJFcnJvcjsKKworCWlmICgocFNoYkluc3RhbmNlX3AgPT0gTlVMTCkgfHwgKHBmblNpZ25hbEhhbmRsZXJKb2JSZWFkeV9wID09IE5VTEwpKSB7CisJCXJldHVybiAoa1NoYkludmFsaWRBcmcpOworCX0KKworCXBTaGJNZW1JbnN0ID0gU2hiSXBjR2V0U2hiTWVtSW5zdChwU2hiSW5zdGFuY2VfcCk7CisJcFNoYk1lbUhlYWRlciA9IFNoYklwY0dldFNoYk1lbUhlYWRlcihwU2hiSW5zdGFuY2VfcCk7CisJU2hiRXJyb3IgPSBrU2hiT2s7CisKKwlpZiAoKHBTaGJNZW1JbnN0LT5tX2hUaHJlYWRKb2JSZWFkeSAhPSBJTlZBTElEX0hBTkRMRV9WQUxVRSkgfHwKKwkgICAgKHBTaGJNZW1JbnN0LT5tX3BmblNpZ0huZGxySm9iUmVhZHkgIT0gTlVMTCkpIHsKKwkJU2hiRXJyb3IgPSBrU2hiQWxyZWFkeVNpZ25hbGluZzsKKwkJZ290byBFeGl0OworCX0KKworCXBTaGJNZW1JbnN0LT5tX3VsVGltZU91dEpvYlJlYWR5ID0gdWxUaW1lT3V0X3A7CisJcFNoYk1lbUluc3QtPm1fcGZuU2lnSG5kbHJKb2JSZWFkeSA9IHBmblNpZ25hbEhhbmRsZXJKb2JSZWFkeV9wOworCisJLy8gQmVjYXVzZSB0aGUgZXZlbnQgPHBTaGJNZW1JbnN0LT5tX2FoRXZlbnRKb2JSZWFkeT4gaXMgdXNlZCBmb3IKKwkvLyBzaWduYWxpbmcgb2YgYSBmaW5pc2hlZCBqb2IgdG9vICh1c2luZyBTZXRFdmVudCksIGl0IGlzIGFsd2F5cworCS8vIGNyZWF0ZWQgaGVyZSAoc2VlIDxTaGJJcGNBbGxvY0J1ZmZlcj4pLgorCisJaFRocmVhZEpvYlJlYWR5ID0gQ3JlYXRlVGhyZWFkKE5VTEwsCS8vIExQU0VDVVJJVFlfQVRUUklCVVRFUyBscFRocmVhZEF0dHJpYnV0ZXMKKwkJCQkgICAgICAgMCwJLy8gU0laRV9UIGR3U3RhY2tTaXplCisJCQkJICAgICAgIFNoYklwY1RocmVhZFNpZ25hbEpvYlJlYWR5LAkvLyBMUFRIUkVBRF9TVEFSVF9ST1VUSU5FIGxwU3RhcnRBZGRyZXNzCisJCQkJICAgICAgIHBTaGJJbnN0YW5jZV9wLAkvLyBMUFZPSUQgbHBQYXJhbWV0ZXIKKwkJCQkgICAgICAgMCwJLy8gRFdPUkQgZHdDcmVhdGlvbkZsYWdzCisJCQkJICAgICAgICZ1bFRocmVhZElESm9iUmVhZHkpOwkvLyBMUERXT1JEIGxwVGhyZWFkSWQKKworCXBTaGJNZW1JbnN0LT5tX2hUaHJlYWRKb2JSZWFkeSA9IGhUaHJlYWRKb2JSZWFkeTsKKwlBU1NFUlQocFNoYk1lbUluc3QtPm1faFRocmVhZEpvYlJlYWR5ICE9IE5VTEwpOworCisjaWZuZGVmIE5ERUJVRworCXsKKwkJcFNoYk1lbUluc3QtPm1fdWxUaHJlYWRJREpvYlJlYWR5ID0gdWxUaHJlYWRJREpvYlJlYWR5OworCX0KKyNlbmRpZgorCisgICAgICBFeGl0OgorCisJcmV0dXJuIChTaGJFcnJvcik7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBTaWduYWwgam9iIHJlYWR5IChjYWxsZWQgZnJvbSBleGVjdXRpbmcgcHJvY2VzcykKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lOTElORV9GVU5DVElPTiB0U2hiRXJyb3IgU2hiSXBjU2lnbmFsSm9iUmVhZHkodFNoYkluc3RhbmNlIHBTaGJJbnN0YW5jZV9wKQoreworCisJdFNoYk1lbUluc3QgKnBTaGJNZW1JbnN0OworCUhBTkRMRSBoRXZlbnRKb2JSZWFkeTsKKwlCT09MIGZSZXM7CisKKwkvLyBUUkFDRTAoIlxuU2hiSXBjU2lnbmFsSm9iUmVhZHkoKTogZW50ZXJcbiIpOworCisJaWYgKHBTaGJJbnN0YW5jZV9wID09IE5VTEwpIHsKKwkJcmV0dXJuIChrU2hiSW52YWxpZEFyZyk7CisJfQorCisJcFNoYk1lbUluc3QgPSBTaGJJcGNHZXRTaGJNZW1JbnN0KHBTaGJJbnN0YW5jZV9wKTsKKworCUFTU0VSVChwU2hiTWVtSW5zdC0+bV9oRXZlbnRKb2JSZWFkeSAhPSBJTlZBTElEX0hBTkRMRV9WQUxVRSk7CisJaEV2ZW50Sm9iUmVhZHkgPSBwU2hiTWVtSW5zdC0+bV9oRXZlbnRKb2JSZWFkeTsKKwlpZiAoaEV2ZW50Sm9iUmVhZHkgIT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpIHsKKwkJZlJlcyA9IFNldEV2ZW50KGhFdmVudEpvYlJlYWR5KTsKKwkJLy8gVFJBQ0UxKCJcblNoYklwY1NpZ25hbEpvYlJlYWR5KCk6IEV2ZW50Sm9iUmVhZHkgc2V0IChSZXN1bHQ9JWQpXG4iLCAoaW50KWZSZXMpOworCQlBU1NFUlQoZlJlcyk7CisJfQorCS8vIFRSQUNFMCgiXG5TaGJJcGNTaWduYWxKb2JSZWFkeSgpOiBsZWF2ZVxuIik7CisJcmV0dXJuIChrU2hiT2spOworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgR2V0IHBvaW50ZXIgdG8gY29tbW9uIHVzZWQgc2hhcmUgbWVtb3J5IGFyZWEKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lOTElORV9GVU5DVElPTiB2b2lkICpTaGJJcGNHZXRTaE1lbVB0cih0U2hiSW5zdGFuY2UgcFNoYkluc3RhbmNlX3ApCit7CisKKwl0U2hiTWVtSGVhZGVyICpwU2hiTWVtSGVhZGVyOworCXZvaWQgKnBTaGJTaE1lbVB0cjsKKworCXBTaGJNZW1IZWFkZXIgPSBTaGJJcGNHZXRTaGJNZW1IZWFkZXIocFNoYkluc3RhbmNlX3ApOworCWlmIChwU2hiTWVtSGVhZGVyICE9IE5VTEwpIHsKKwkJcFNoYlNoTWVtUHRyID0gKEJZVEUgKikgcFNoYk1lbUhlYWRlciArIHNpemVvZih0U2hiTWVtSGVhZGVyKTsKKwl9IGVsc2UgeworCQlwU2hiU2hNZW1QdHIgPSBOVUxMOworCX0KKworCXJldHVybiAocFNoYlNoTWVtUHRyKTsKKworfQorCisjZW5kaWYKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICBQIFIgSSBWIEEgVCBFICAgRiBVIE4gQyBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisKKyNpZiAhZGVmaW5lZChTSEJJUENfSU5MSU5FX0VOQUJMRUQpCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgQWxsb2NhdGUgYSBtZW1vcnkgYmxvY2sgZnJvbSBwcm9jZXNzIHNwZWNpZmljIG1lbXBvb2wKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkICpTaGJJcGNBbGxvY1ByaXZhdGVNZW0odW5zaWduZWQgbG9uZyB1bE1lbVNpemVfcCkKK3sKKworCUhHTE9CQUwgaE1lbTsKKwl2b2lkICpwTWVtOworCisJaE1lbSA9IEdsb2JhbEFsbG9jKEdNRU1fRklYRUQsIHVsTWVtU2l6ZV9wICsgc2l6ZW9mKEhHTE9CQUwpKTsKKwlwTWVtID0gR2xvYmFsTG9jayhoTWVtKTsKKwlpZiAocE1lbSAhPSBOVUxMKSB7CisJCSooSEdMT0JBTCAqKSBwTWVtID0gaE1lbTsKKwkJKEJZVEUgKikgcE1lbSArPSBzaXplb2YoSEdMT0JBTCk7CisJfQorCisjaWZuZGVmIE5ERUJVRworCXsKKwkJbWVtc2V0KHBNZW0sIDB4YWEsIHVsTWVtU2l6ZV9wKTsKKwl9CisjZW5kaWYKKworCXJldHVybiAocE1lbSk7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBSZWxlYXNlIGEgbWVtb3J5IGJsb2NrIGZyb20gcHJvY2VzcyBzcGVjaWZpYyBtZW1wb29sCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZCBTaGJJcGNSZWxlYXNlUHJpdmF0ZU1lbSh2b2lkICpwTWVtX3ApCit7CisKKwlIR0xPQkFMIGhNZW07CisKKwlpZiAocE1lbV9wID09IE5VTEwpIHsKKwkJcmV0dXJuOworCX0KKworCShCWVRFICopIHBNZW1fcCAtPSBzaXplb2YoSEdMT0JBTCk7CisJaE1lbSA9ICooSEdMT0JBTCAqKSBwTWVtX3A7CisKKwlHbG9iYWxVbmxvY2soaE1lbSk7CisJR2xvYmFsRnJlZShoTWVtKTsKKworCXJldHVybjsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIENyZWF0ZSB1bmlmb3JtIG9iamVjdCBuYW1lIChuZWVkZWQgZm9yIGludGVyLXByb2Nlc3MgY29tbXVuaWNhdGlvbikKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NvbnN0IGNoYXIgKlNoYklwY0dldFVuaWZvcm1PYmplY3ROYW1lKGNvbnN0IGNoYXIgKnBzek9iamVjdEpvYk5hbWVfcCwKKwkJCQkgICAgICAgY29uc3QgY2hhciAqcHN6QnVmZmVySURfcCwKKwkJCQkgICAgICAgQk9PTCBmR2xvYmFsT2JqZWN0X3ApCit7CisKKwlzdGF0aWMgY2hhciBzek9iamVjdE5hbWVbTUFYX1BBVEhdOworCWNoYXIgc3pPYmplY3RQcmVmaXhbTUFYX1BBVEhdOworCisJaWYgKGZHbG9iYWxPYmplY3RfcCkgeworCQlzdHJuY3B5KHN6T2JqZWN0UHJlZml4LCAiR2xvYmFsXFwiLCBzaXplb2Yoc3pPYmplY3RQcmVmaXgpKTsKKwl9IGVsc2UgeworCQlfc25wcmludGYoc3pPYmplY3RQcmVmaXgsIHNpemVvZihzek9iamVjdFByZWZpeCksICJQSUQlMDhsWF8iLAorCQkJICAodW5zaWduZWQgbG9uZylHZXRDdXJyZW50UHJvY2Vzc0lkKCkpOworCX0KKworCV9zbnByaW50Zihzek9iamVjdE5hbWUsIHNpemVvZihzek9iamVjdE5hbWUpLCAiJXMlcyMlcyIsCisJCSAgc3pPYmplY3RQcmVmaXgsIHBzekJ1ZmZlcklEX3AsIHBzek9iamVjdEpvYk5hbWVfcCk7CisKKwlyZXR1cm4gKHN6T2JqZWN0TmFtZSk7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBUaHJlYWQgZm9yIG5ldyBkYXRhIHNpZ25hbGluZworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworRFdPUkQgV0lOQVBJIFNoYklwY1RocmVhZFNpZ25hbE5ld0RhdGEoTFBWT0lEIHB2VGhyZWFkUGFyYW1fcCkKK3sKKworCXRTaGJJbnN0YW5jZSBwU2hiSW5zdGFuY2U7CisJdFNoYk1lbUluc3QgKnBTaGJNZW1JbnN0OworCURXT1JEIGR3V2FpdFJlc3VsdDsKKwlCT09MIGZUZXJtUmVxdTsKKwlpbnQgZkNhbGxBZ2FpbjsKKworCVRSQUNFMQorCSAgICAoIlxuU2hiSXBjVGhyZWFkU2lnbmFsTmV3RGF0YSgpOiBTaWduYWxUaHJlYWQgc3RhcnRlZCAocFNoYkluc3RhbmNlPTB4JTA4bFgpXG4iLAorCSAgICAgKERXT1JEKSBwdlRocmVhZFBhcmFtX3ApOworCisJcFNoYkluc3RhbmNlID0gKHRTaGJNZW1JbnN0ICopIHB2VGhyZWFkUGFyYW1fcDsKKwlwU2hiTWVtSW5zdCA9IFNoYklwY0dldFNoYk1lbUluc3QocFNoYkluc3RhbmNlKTsKKwlmVGVybVJlcXUgPSBGQUxTRTsKKworCWRvIHsKKwkJQVNTRVJUKChwU2hiTWVtSW5zdC0+bV9haEV2ZW50TmV3RGF0YVswXSAhPQorCQkJSU5WQUxJRF9IQU5ETEVfVkFMVUUpCisJCSAgICAgICAmJiAocFNoYk1lbUluc3QtPm1fYWhFdmVudE5ld0RhdGFbMF0gIT0gTlVMTCkpOworCQlBU1NFUlQoKHBTaGJNZW1JbnN0LT5tX2FoRXZlbnROZXdEYXRhWzFdICE9CisJCQlJTlZBTElEX0hBTkRMRV9WQUxVRSkKKwkJICAgICAgICYmIChwU2hiTWVtSW5zdC0+bV9haEV2ZW50TmV3RGF0YVsxXSAhPSBOVUxMKSk7CisKKwkJVFJBQ0UwKCJcblNoYklwY1RocmVhZFNpZ25hbE5ld0RhdGEoKTogZW50ZXIgd2FpdCBzdGF0ZSIpOworCQlkd1dhaXRSZXN1bHQgPSBXYWl0Rm9yTXVsdGlwbGVPYmplY3RzKDIsCS8vIERXT1JEIG5Db3VudAorCQkJCQkJICAgICAgcFNoYk1lbUluc3QtPm1fYWhFdmVudE5ld0RhdGEsCS8vIGNvbnN0IEhBTkRMRSogbHBIYW5kbGVzCisJCQkJCQkgICAgICBGQUxTRSwJLy8gQk9PTCBiV2FpdEFsbAorCQkJCQkJICAgICAgSU5GSU5JVEUpOwkvLyBEV09SRCBkd01pbGxpc2Vjb25kcworCQlUUkFDRTAKKwkJICAgICgiXG5TaGJJcGNUaHJlYWRTaWduYWxOZXdEYXRhKCk6IHdhaXQgc3RhdGUgbGVhdmVkOiAtLS0+ICIpOworCQlzd2l0Y2ggKGR3V2FpdFJlc3VsdCkgeworCQljYXNlIFdBSVRfT0JKRUNUXzAgKyAwOgkvLyBldmVudCAibmV3IGRhdGEiCisJCQl7CisJCQkJVFJBQ0UwKCJFdmVudCA9IFdBSVRfT0JKRUNUXzArMCIpOworCQkJCWlmIChwU2hiTWVtSW5zdC0+bV9wZm5TaWdIbmRsck5ld0RhdGEgIT0gTlVMTCkgeworCQkJCQlUUkFDRTAKKwkJCQkJICAgICgiXG5TaGJJcGNUaHJlYWRTaWduYWxOZXdEYXRhKCk6IGNhbGxpbmcgU2lnbmFsSGFuZGxlck5ld0RhdGEiKTsKKwkJCQkJZG8geworCQkJCQkJZkNhbGxBZ2FpbiA9CisJCQkJCQkgICAgcFNoYk1lbUluc3QtPgorCQkJCQkJICAgIG1fcGZuU2lnSG5kbHJOZXdEYXRhCisJCQkJCQkgICAgKHBTaGJJbnN0YW5jZSk7CisJCQkJCQkvLyBkLmsuOiB0cnkgdG8gcnVuIGFueSBzaGFyZWQgYnVmZmVyIHdoaWNoIGhhcyBoaWdoZXIgcHJpb3JpdHkuCisJCQkJCQkvLyAgICAgICAgICAgdW5kZXIgV2luZG93cyB0aGlzIGlzIG5vdCByZWFsbHkgbmVjZXNzYXJ5IGJlY2F1c2UgdGhlIFdpbmRvd3Mgc2NoZWR1bGVyCisJCQkJCQkvLyAgICAgICAgICAgYWxyZWFkeSBwcmVlbXB0cyB0YXNrcyB3aXRoIGxvd2VyIHByaW9yaXR5LgorCQkJCQl9IHdoaWxlIChmQ2FsbEFnYWluICE9IEZBTFNFKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9CisKKwkJY2FzZSBXQUlUX09CSkVDVF8wICsgMToJLy8gZXZlbnQgInRlcm1pbmF0ZSIKKwkJCXsKKwkJCQlUUkFDRTAoIkV2ZW50ID0gV0FJVF9PQkpFQ1RfMCsxIik7CisJCQkJZlRlcm1SZXF1ID0gVFJVRTsKKwkJCQlicmVhazsKKwkJCX0KKworCQlkZWZhdWx0OgorCQkJeworCQkJCVRSQUNFMCgiVW5oYW5kbGVkIEV2ZW50Iik7CisJCQkJQVNTRVJUKDApOworCQkJCWZUZXJtUmVxdSA9IFRSVUU7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisJd2hpbGUgKCFmVGVybVJlcXUpOworCisJaWYgKHBTaGJNZW1JbnN0LT5tX2FoRXZlbnROZXdEYXRhW0lEWF9FVkVOVF9URVJNX1JFU1BdICE9CisJICAgIElOVkFMSURfSEFORExFX1ZBTFVFKSB7CisJCVNldEV2ZW50KHBTaGJNZW1JbnN0LT5tX2FoRXZlbnROZXdEYXRhW0lEWF9FVkVOVF9URVJNX1JFU1BdKTsKKwl9CisKKwlUUkFDRTEKKwkgICAgKCJcblNoYklwY1RocmVhZFNpZ25hbE5ld0RhdGEoKTogU2lnbmFsVGhyZWFkIHRlcm1pbmF0ZWQgKHBTaGJJbnN0YW5jZT0weCUwOGxYKVxuIiwKKwkgICAgIChEV09SRCkgcFNoYkluc3RhbmNlKTsKKworCUV4aXRUaHJlYWQoMCk7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBUaHJlYWQgZm9yIG5ldyBkYXRhIHNpZ25hbGluZworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworRFdPUkQgV0lOQVBJIFNoYklwY1RocmVhZFNpZ25hbEpvYlJlYWR5KExQVk9JRCBwdlRocmVhZFBhcmFtX3ApCit7CisKKwl0U2hiSW5zdGFuY2UgKnBTaGJJbnN0YW5jZTsKKwl0U2hiTWVtSW5zdCAqcFNoYk1lbUluc3Q7CisJRFdPUkQgdWxUaW1lT3V0OworCURXT1JEIGR3V2FpdFJlc3VsdDsKKwl1bnNpZ25lZCBpbnQgZlRpbWVPdXQ7CisKKwlUUkFDRTEKKwkgICAgKCJcblNoYklwY1RocmVhZFNpZ25hbEpvYlJlYWR5KCk6IFNpZ25hbFRocmVhZCBzdGFydGVkIChwU2hiSW5zdGFuY2U9MHglMDhsWClcbiIsCisJICAgICAoRFdPUkQpIHB2VGhyZWFkUGFyYW1fcCk7CisKKwlwU2hiSW5zdGFuY2UgPSAodFNoYkluc3RhbmNlICopIHB2VGhyZWFkUGFyYW1fcDsKKwlwU2hiTWVtSW5zdCA9IFNoYklwY0dldFNoYk1lbUluc3QocFNoYkluc3RhbmNlKTsKKwlmVGltZU91dCA9IEZBTFNFOworCisJaWYgKHBTaGJNZW1JbnN0LT5tX3VsVGltZU91dEpvYlJlYWR5ICE9IDApIHsKKwkJdWxUaW1lT3V0ID0gcFNoYk1lbUluc3QtPm1fdWxUaW1lT3V0Sm9iUmVhZHk7CisJfSBlbHNlIHsKKwkJdWxUaW1lT3V0ID0gSU5GSU5JVEU7CisJfQorCisJQVNTRVJUKChwU2hiTWVtSW5zdC0+bV9oRXZlbnRKb2JSZWFkeSAhPSBJTlZBTElEX0hBTkRMRV9WQUxVRSkKKwkgICAgICAgJiYgKHBTaGJNZW1JbnN0LT5tX2hFdmVudEpvYlJlYWR5ICE9IE5VTEwpKTsKKworCVRSQUNFMCgiXG5TaGJJcGNUaHJlYWRTaWduYWxKb2JSZWFkeSgpOiBlbnRlciB3YWl0IHN0YXRlIik7CisJZHdXYWl0UmVzdWx0ID0gV2FpdEZvclNpbmdsZU9iamVjdChwU2hiTWVtSW5zdC0+bV9oRXZlbnRKb2JSZWFkeSwJLy8gSEFORExFIGhIYW5kbGUKKwkJCQkJICAgdWxUaW1lT3V0KTsJLy8gRFdPUkQgZHdNaWxsaXNlY29uZHMKKwlUUkFDRTAoIlxuU2hiSXBjVGhyZWFkU2lnbmFsSm9iUmVhZHkoKTogd2FpdCBzdGF0ZSBsZWF2ZWQ6IC0tLT4gIik7CisJc3dpdGNoIChkd1dhaXRSZXN1bHQpIHsKKwljYXNlIFdBSVRfT0JKRUNUXzAgKyAwOgkvLyBldmVudCAibmV3IGRhdGEiCisJCXsKKwkJCVRSQUNFMCgiRXZlbnQgPSBXQUlUX09CSkVDVF8wKzAiKTsKKwkJCWZUaW1lT3V0ID0gRkFMU0U7CisJCQlicmVhazsKKwkJfQorCisJY2FzZSBXQUlUX1RJTUVPVVQ6CisJCXsKKwkJCVRSQUNFMCgiXG5FdmVudCA9IFdBSVRfVElNRU9VVCIpOworCQkJZlRpbWVPdXQgPSBUUlVFOworCQkJLy8gQVNTRVJUKDApOworCQkJYnJlYWs7CisJCX0KKworCWRlZmF1bHQ6CisJCXsKKwkJCVRSQUNFMCgiVW5oYW5kbGVkIEV2ZW50Iik7CisJCQlmVGltZU91dCA9IFRSVUU7CisJCQlBU1NFUlQoMCk7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChwU2hiTWVtSW5zdC0+bV9wZm5TaWdIbmRsckpvYlJlYWR5ICE9IE5VTEwpIHsKKwkJVFJBQ0UwCisJCSAgICAoIlxuU2hiSXBjVGhyZWFkU2lnbmFsSm9iUmVhZHkoKTogY2FsbGluZyBTaWduYWxIYW5kbGVySm9iUmVhZHkiKTsKKwkJcFNoYk1lbUluc3QtPm1fcGZuU2lnSG5kbHJKb2JSZWFkeShwU2hiSW5zdGFuY2UsIGZUaW1lT3V0KTsKKwl9CisKKwlwU2hiTWVtSW5zdC0+bV9oVGhyZWFkSm9iUmVhZHkgPSBJTlZBTElEX0hBTkRMRV9WQUxVRTsKKwlwU2hiTWVtSW5zdC0+bV9wZm5TaWdIbmRsckpvYlJlYWR5ID0gTlVMTDsKKworCVRSQUNFMQorCSAgICAoIlxuU2hiSXBjVGhyZWFkU2lnbmFsSm9iUmVhZHkoKTogU2lnbmFsVGhyZWFkIHRlcm1pbmF0ZWQgKHBTaGJJbnN0YW5jZT0weCUwOGxYKVxuIiwKKwkgICAgIChEV09SRCkgcFNoYkluc3RhbmNlKTsKKworCUV4aXRUaHJlYWQoMCk7CisKK30KKworI2VuZGlmCisKKy8vIEVPRgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9TaGJJcGMuaCBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvU2hiSXBjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2FkODg0NgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvU2hiSXBjLmgKQEAgLTAsMCArMSwxMjUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBQcm9qZWN0IGluZGVwZW5kZW5kIHNoYXJlZCBidWZmZXIgKGxpbmVhciArIGNpcmN1bGFyKQorCisgIERlc2NyaXB0aW9uOiAgRGVjbGFyYXRpb24gb2YgcGxhdGZvcm0gc3BlY2lmaWMgcGFydCBmb3IgdGhlCisgICAgICAgICAgICAgICAgc2hhcmVkIGJ1ZmZlcgorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIDIwMDYvMDYvMjcgLXJzOiAgIFYgMS4wMCAoaW5pdGlhbCB2ZXJzaW9uKQorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9TSEJJUENfSF8KKyNkZWZpbmUgX1NIQklQQ19IXworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIFR5cGUgZGVmaW5pdGlvbnMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3R5cGVkZWYgaW50ICgqdFNpZ0huZGxyTmV3RGF0YSkgKHRTaGJJbnN0YW5jZSBwU2hiSW5zdGFuY2VfcCk7Cit0eXBlZGVmIHZvaWQgKCp0U2lnSG5kbHJKb2JSZWFkeSkgKHRTaGJJbnN0YW5jZSBwU2hiSW5zdGFuY2VfcCwKKwkJCQkgICB1bnNpZ25lZCBpbnQgZlRpbWVPdXRfcCk7CisKKyNpZiAoVEFSR0VUX1NZU1RFTSA9PSBfV0lOMzJfKQorI2lmIGRlZmluZWQoSU5MSU5FX0ZVTkNUSU9OX0RFRikKKyN1bmRlZiAgSU5MSU5FX0ZVTkNUSU9OCisjZGVmaW5lIElOTElORV9GVU5DVElPTiAgICAgSU5MSU5FX0ZVTkNUSU9OX0RFRgorI2RlZmluZSBTSEJJUENfSU5MSU5FX0VOQUJMRUQgICAgICBUUlVFCisjZGVmaW5lIFNIQklQQ19JTkxJTkVECisjaW5jbHVkZSAiU2hiSXBjLVdpbjMyLmMiCisjZW5kaWYKKworI2VsaWYgKFRBUkdFVF9TWVNURU0gPT0gX0xJTlVYXykKKyNpZiBkZWZpbmVkKElOTElORV9GVU5DVElPTl9ERUYpCisjdW5kZWYgIElOTElORV9GVU5DVElPTgorI2RlZmluZSBJTkxJTkVfRlVOQ1RJT04gICAgIElOTElORV9GVU5DVElPTl9ERUYKKyNkZWZpbmUgU0hCSVBDX0lOTElORV9FTkFCTEVEICAgICAgVFJVRQorI2RlZmluZSBTSEJJUENfSU5MSU5FRAorI2luY2x1ZGUgIlNoYklwYy1MaW51eEtlcm5lbC5jIgorI2VuZGlmCisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBQcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0U2hiRXJyb3IgU2hiSXBjSW5pdCh2b2lkKTsKK3RTaGJFcnJvciBTaGJJcGNFeGl0KHZvaWQpOworCit0U2hiRXJyb3IgU2hiSXBjQWxsb2NCdWZmZXIodW5zaWduZWQgbG9uZyB1bEJ1ZmZlclNpemVfcCwKKwkJCSAgICBjb25zdCBjaGFyICpwc3pCdWZmZXJJRF9wLAorCQkJICAgIHRTaGJJbnN0YW5jZSAqIHBwU2hiSW5zdGFuY2VfcCwKKwkJCSAgICB1bnNpZ25lZCBpbnQgKnBmU2hiTmV3Q3JlYXRlZF9wKTsKK3RTaGJFcnJvciBTaGJJcGNSZWxlYXNlQnVmZmVyKHRTaGJJbnN0YW5jZSBwU2hiSW5zdGFuY2VfcCk7CisKKyNpZiAhZGVmaW5lZChTSEJJUENfSU5MSU5FX0VOQUJMRUQpCisKK3RTaGJFcnJvciBTaGJJcGNFbnRlckF0b21pY1NlY3Rpb24odFNoYkluc3RhbmNlIHBTaGJJbnN0YW5jZV9wKTsKK3RTaGJFcnJvciBTaGJJcGNMZWF2ZUF0b21pY1NlY3Rpb24odFNoYkluc3RhbmNlIHBTaGJJbnN0YW5jZV9wKTsKKwordFNoYkVycm9yIFNoYklwY1N0YXJ0U2lnbmFsaW5nTmV3RGF0YSh0U2hiSW5zdGFuY2UgcFNoYkluc3RhbmNlX3AsCisJCQkJICAgICAgdFNpZ0huZGxyTmV3RGF0YQorCQkJCSAgICAgIHBmblNpZ25hbEhhbmRsZXJOZXdEYXRhX3AsCisJCQkJICAgICAgdFNoYlByaW9yaXR5IFNoYlByaW9yaXR5X3ApOwordFNoYkVycm9yIFNoYklwY1N0b3BTaWduYWxpbmdOZXdEYXRhKHRTaGJJbnN0YW5jZSBwU2hiSW5zdGFuY2VfcCk7Cit0U2hiRXJyb3IgU2hiSXBjU2lnbmFsTmV3RGF0YSh0U2hiSW5zdGFuY2UgcFNoYkluc3RhbmNlX3ApOworCit0U2hiRXJyb3IgU2hiSXBjU3RhcnRTaWduYWxpbmdKb2JSZWFkeSh0U2hiSW5zdGFuY2UgcFNoYkluc3RhbmNlX3AsCisJCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgdWxUaW1lT3V0X3AsCisJCQkJICAgICAgIHRTaWdIbmRsckpvYlJlYWR5CisJCQkJICAgICAgIHBmblNpZ25hbEhhbmRsZXJKb2JSZWFkeV9wKTsKK3RTaGJFcnJvciBTaGJJcGNTaWduYWxKb2JSZWFkeSh0U2hiSW5zdGFuY2UgcFNoYkluc3RhbmNlX3ApOworCit2b2lkICpTaGJJcGNHZXRTaE1lbVB0cih0U2hiSW5zdGFuY2UgcFNoYkluc3RhbmNlX3ApOworI2VuZGlmCisKKyN1bmRlZiAgU0hCSVBDX0lOTElORV9FTkFCTEVECS8vIGRpc2FibGUgYWN0dWFsIGlubGluaW5nIG9mIGZ1bmN0aW9ucworI3VuZGVmICBJTkxJTkVfRlVOQ1RJT04KKyNkZWZpbmUgSU5MSU5FX0ZVTkNUSU9OCQkvLyBkZWZpbmUgSU5MSU5FX0ZVTkNUSU9OIHRvIG5vdGhpbmcKKworI2VuZGlmIC8vICNpZm5kZWYgX1NIQklQQ19IXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9TaGJMaW51eEtlcm5lbC5oIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9TaGJMaW51eEtlcm5lbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxMjcwMmEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL1NoYkxpbnV4S2VybmVsLmgKQEAgLTAsMCArMSw2OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIFByb2plY3QgaW5kZXBlbmRlbmQgc2hhcmVkIGJ1ZmZlciAobGluZWFyICsgY2lyY3VsYXIpCisKKyAgRGVzY3JpcHRpb246ICBEZWNsYXJhdGlvbiBvZiBwbGF0Zm9ybSBzcGVjaWZpYyBwYXJ0IGZvciB0aGUKKyAgICAgICAgICAgICAgICBzaGFyZWQgYnVmZmVyCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgMjAwNi8wNy8yMCAtcnM6ICAgViAxLjAwIChpbml0aWFsIHZlcnNpb24pCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX1NIQkxJTlVYS0VSTkVMX0hfCisjZGVmaW5lIF9TSEJMSU5VWEtFUk5FTF9IXworCitzdHJ1Y3Qgc1NoYk1lbVRhYmxlIHsKKwlpbnQgbV9pQnVmZmVySWQ7CisJdm9pZCAqbV9wQnVmZmVyOworCXN0cnVjdCBzU2hiTWVtVGFibGUgKm1fcHNOZXh0TWVtVGFibGVFbGVtZW50OworfTsKKworZXh0ZXJuIHN0cnVjdCBzU2hiTWVtVGFibGUgKnBzTWVtVGFibGVFbGVtZW50Rmlyc3RfZzsKKworI2VuZGlmIC8vIF9TSEJMSU5VWEtFUk5FTF9IXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9Tb2NrZXRMaW51eEtlcm5lbC5jIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9Tb2NrZXRMaW51eEtlcm5lbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2MmJjNGEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL1NvY2tldExpbnV4S2VybmVsLmMKQEAgLTAsMCArMSwxOTcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBXcmFwcGVyIGZvciBCU0Qgc29ja2V0IEFQSSBmb3IgTGludXgga2VybmVsCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogU29ja2V0TGludXhLZXJuZWwuYyx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuMyAkICAkRGF0ZTogMjAwOC8wNC8xNyAyMTozNjozMiAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICBEZXYgQysrIGFuZCBHTlUtQ29tcGlsZXIgZm9yIG02OGsKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUmV2aXNpb24gSGlzdG9yeToKKworICAyMDA2LzA4LzI1IGQuay46ICAgc3RhcnQgb2YgaW1wbGVtZW50YXRpb24KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPGxpbnV4L25ldC5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSAiU29ja2V0TGludXhLZXJuZWwuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgRyBMIE8gQiBBIEwgICBEIEUgRiBJIE4gSSBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvbnN0IGRlZmluZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCB0eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIG1vZHVsIGdsb2JhbGUgdmFycworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgS2VybmVsIE1vZHVsZSBzcGVjaWZpYyBEYXRhIFN0cnVjdHVyZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgUCBVIEIgTCBJIEMgICBGIFUgTiBDIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOgorLy8KKy8vIERlc2NyaXB0aW9uOgorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczoKKy8vCisvLworLy8gUmV0dXJuczoKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworU09DS0VUIHNvY2tldChpbnQgYWYsIGludCB0eXBlLCBpbnQgcHJvdG9jb2wpCit7CisJaW50IHJjOworCVNPQ0tFVCBzb2NrZXQ7CisKKwlyYyA9IHNvY2tfY3JlYXRlX2tlcm4oYWYsIHR5cGUsIHByb3RvY29sLCAmc29ja2V0KTsKKwlpZiAocmMgPCAwKSB7CisJCXNvY2tldCA9IE5VTEw7CisJCWdvdG8gRXhpdDsKKwl9CisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIHNvY2tldDsKK30KKworaW50IGJpbmQoU09DS0VUIHNvY2tldF9wLCBjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIsIGludCBhZGRybGVuKQoreworCWludCByYzsKKworCXJjID0gc29ja2V0X3AtPm9wcy0+YmluZChzb2NrZXRfcCwgKHN0cnVjdCBzb2NrYWRkciAqKWFkZHIsIGFkZHJsZW4pOworCisJcmV0dXJuIHJjOworfQorCitpbnQgY2xvc2Vzb2NrZXQoU09DS0VUIHNvY2tldF9wKQoreworCXNvY2tfcmVsZWFzZShzb2NrZXRfcCk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IHJlY3Zmcm9tKFNPQ0tFVCBzb2NrZXRfcCwgY2hhciAqYnVmLCBpbnQgbGVuLCBpbnQgZmxhZ3MsCisJICAgICBzdHJ1Y3Qgc29ja2FkZHIgKmZyb20sIGludCAqZnJvbWxlbikKK3sKKwlpbnQgcmM7CisJc3RydWN0IG1zZ2hkciBtc2c7CisJc3RydWN0IGt2ZWMgaW92OworCisJbXNnLm1zZ19jb250cm9sID0gTlVMTDsKKwltc2cubXNnX2NvbnRyb2xsZW4gPSAwOworCW1zZy5tc2dfbmFtZSA9IGZyb207CS8vIHdpbGwgYmUgc3RydWN0IHNvY2tfYWRkcgorCW1zZy5tc2dfbmFtZWxlbiA9ICpmcm9tbGVuOworCWlvdi5pb3ZfbGVuID0gbGVuOworCWlvdi5pb3ZfYmFzZSA9IGJ1ZjsKKworCXJjID0ga2VybmVsX3JlY3Ztc2coc29ja2V0X3AsICZtc2csICZpb3YsIDEsIGlvdi5pb3ZfbGVuLCAwKTsKKworCXJldHVybiByYzsKK30KKworaW50IHNlbmR0byhTT0NLRVQgc29ja2V0X3AsIGNvbnN0IGNoYXIgKmJ1ZiwgaW50IGxlbiwgaW50IGZsYWdzLAorCSAgIGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqdG8sIGludCB0b2xlbikKK3sKKwlpbnQgcmM7CisJc3RydWN0IG1zZ2hkciBtc2c7CisJc3RydWN0IGt2ZWMgaW92OworCisJbXNnLm1zZ19jb250cm9sID0gTlVMTDsKKwltc2cubXNnX2NvbnRyb2xsZW4gPSAwOworCW1zZy5tc2dfbmFtZSA9IChzdHJ1Y3Qgc29ja2FkZHIgKil0bzsJLy8gd2lsbCBiZSBzdHJ1Y3Qgc29ja19hZGRyCisJbXNnLm1zZ19uYW1lbGVuID0gdG9sZW47CisJbXNnLm1zZ19mbGFncyA9IDA7CisJaW92Lmlvdl9sZW4gPSBsZW47CisJaW92Lmlvdl9iYXNlID0gKGNoYXIgKilidWY7CisKKwlyYyA9IGtlcm5lbF9zZW5kbXNnKHNvY2tldF9wLCAmbXNnLCAmaW92LCAxLCBsZW4pOworCisJcmV0dXJuIHJjOworfQorCisvLyBFT0YKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwvU29ja2V0TGludXhLZXJuZWwuaCBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvU29ja2V0TGludXhLZXJuZWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTFkNjE5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9Tb2NrZXRMaW51eEtlcm5lbC5oCkBAIC0wLDAgKzEsMTA1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgb3BlblBPV0VSTElOSworCisgIERlc2NyaXB0aW9uOiAgaW5jbHVkZSBmaWxlIGZvciBCU0Qgc29ja2V0IEFQSSBmb3IgTGludXgga2VybmVsCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogU29ja2V0TGludXhLZXJuZWwuaCx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuMyAkICAkRGF0ZTogMjAwOC8wNC8xNyAyMTozNjozMiAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICBLRUlMIHVWaXNpb24gMgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgIDIwMDYvMDgvMjUgZC5rLjogICBzdGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfU09DS0VUTElOVVhLRVJORUxfSF8KKyNkZWZpbmUgX1NPQ0tFVExJTlVYS0VSTkVMX0hfCisKKyNpbmNsdWRlIDxsaW51eC9uZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2RlZmluZSBJTlZBTElEX1NPQ0tFVCAgMAorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gdHlwZWRlZgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordHlwZWRlZiBzdHJ1Y3Qgc29ja2V0ICpTT0NLRVQ7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitpbnQgYmluZChTT0NLRVQgcywgY29uc3Qgc3RydWN0IHNvY2thZGRyICphZGRyLCBpbnQgYWRkcmxlbik7CisKK2ludCBjbG9zZXNvY2tldChTT0NLRVQgcyk7CisKK2ludCByZWN2ZnJvbShTT0NLRVQgcywgY2hhciAqYnVmLCBpbnQgbGVuLCBpbnQgZmxhZ3MsIHN0cnVjdCBzb2NrYWRkciAqZnJvbSwKKwkgICAgIGludCAqZnJvbWxlbik7CisKK2ludCBzZW5kdG8oU09DS0VUIHMsIGNvbnN0IGNoYXIgKmJ1ZiwgaW50IGxlbiwgaW50IGZsYWdzLAorCSAgIGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqdG8sIGludCB0b2xlbik7CisKK1NPQ0tFVCBzb2NrZXQoaW50IGFmLCBpbnQgdHlwZSwgaW50IHByb3RvY29sKTsKKworI2VuZGlmIC8vICNpZm5kZWYgX1NPQ0tFVExJTlVYS0VSTkVMX0hfCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL1RpbWVySGlnaFJlc2tYODYuYyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvVGltZXJIaWdoUmVza1g4Ni5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyZWVlNDcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL1RpbWVySGlnaFJlc2tYODYuYwpAQCAtMCwwICsxLDUyMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIHRhcmdldCBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiBvZgorICAgICAgICAgICAgICAgIGhpZ2ggcmVzb2x1dGlvbiB0aW1lciBtb2R1bGUgZm9yIFg4NiB1bmRlciBMaW51eAorICAgICAgICAgICAgICAgIFRoZSBMaW51eCBrZXJuZWwgaGFzIHRvIGJlIGNvbXBpbGVkIHdpdGggaGlnaCByZXNvbHV0aW9uCisgICAgICAgICAgICAgICAgdGltZXJzIGVuYWJsZWQuIFRoaXMgaXMgZG9uZSBieSBjb25maWd1cmluZyB0aGUga2VybmVsCisgICAgICAgICAgICAgICAgd2l0aCBDT05GSUdfSElHSF9SRVNfVElNRVJTIGVuYWJsZWQuCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogVGltZXJIaWdoUmVza1g4Ni5jLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS40ICQgICREYXRlOiAyMDA4LzA0LzE3IDIxOjM4OjAxICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorICAgICAgICAgICAgICAgICAgICBHTlUKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUmV2aXNpb24gSGlzdG9yeToKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkVwbEluYy5oIgorI2luY2x1ZGUgImtlcm5lbC9FcGxUaW1lckhpZ2hSZXNrLmgiCisjaW5jbHVkZSAiQmVuY2htYXJrLmgiCisKKy8vI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2hydGltZXIuaD4KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgRyBMIE8gQiBBIEwgICBEIEUgRiBJIE4gSSBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvbnN0IGRlZmluZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNkZWZpbmUgVElNRVJfQ09VTlQgICAgICAgICAgIDIJLyogbWF4IDE1IHRpbWVycyBzZWxlY3RhYmxlICovCisjZGVmaW5lIFRJTUVSX01JTl9WQUxfU0lOR0xFICA1MDAwCS8qIG1pbiA1dXMgKi8KKyNkZWZpbmUgVElNRVJfTUlOX1ZBTF9DWUNMRSAgIDEwMDAwMAkvKiBtaW4gMTAwdXMgKi8KKworI2RlZmluZSBQUk9WRV9PVkVSUlVOCisKKyNpZm5kZWYgQ09ORklHX0hJR0hfUkVTX1RJTUVSUworI2Vycm9yICJLZXJuZWwgc3ltYm9sIENPTkZJR19ISUdIX1JFU19USU1FUlMgaXMgcmVxdWlyZWQuIgorI2VuZGlmCisKKy8vIFRyYWNlUG9pbnQgc3VwcG9ydCBmb3IgcmVhbHRpbWUtZGVidWdnaW5nCisjaWZkZWYgX0RCR19UUkFDRV9QT0lOVFNfCit2b2lkIFBVQkxJQyBUZ3REYmdTaWduYWxUcmFjZVBvaW50KEJZVEUgYlRyYWNlUG9pbnROdW1iZXJfcCk7Cit2b2lkIFBVQkxJQyBUZ3REYmdQb3N0VHJhY2VWYWx1ZShEV09SRCBkd1RyYWNlVmFsdWVfcCk7CisjZGVmaW5lIFRHVF9EQkdfU0lHTkFMX1RSQUNFX1BPSU5UKHApICAgVGd0RGJnU2lnbmFsVHJhY2VQb2ludChwKQorI2RlZmluZSBUR1RfREJHX1BPU1RfVFJBQ0VfVkFMVUUodikgICAgIFRndERiZ1Bvc3RUcmFjZVZhbHVlKHYpCisjZWxzZQorI2RlZmluZSBUR1RfREJHX1NJR05BTF9UUkFDRV9QT0lOVChwKQorI2RlZmluZSBUR1RfREJHX1BPU1RfVFJBQ0VfVkFMVUUodikKKyNlbmRpZgorI2RlZmluZSBIUlRfREJHX1BPU1RfVFJBQ0VfVkFMVUUoRXZlbnRfcCwgdWlOb2RlSWRfcCwgd0Vycm9yQ29kZV9wKSBcCisgICAgVEdUX0RCR19QT1NUX1RSQUNFX1ZBTFVFKCgweEUgPDwgMjgpIHwgKEV2ZW50X3AgPDwgMjQpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAodWlOb2RlSWRfcCA8PCAxNikgfCB3RXJyb3JDb2RlX3ApCisKKyNkZWZpbmUgVElNRVJIRExfTUFTSyAgICAgICAgIDB4MEZGRkZGRkYKKyNkZWZpbmUgVElNRVJIRExfU0hJRlQgICAgICAgIDI4CisjZGVmaW5lIEhETF9UT19JRFgoSGRsKSAgICAgICAoKEhkbCA+PiBUSU1FUkhETF9TSElGVCkgLSAxKQorI2RlZmluZSBIRExfSU5JVChJZHgpICAgICAgICAgKChJZHggKyAxKSA8PCBUSU1FUkhETF9TSElGVCkKKyNkZWZpbmUgSERMX0lOQyhIZGwpICAgICAgICAgICgoKEhkbCArIDEpICYgVElNRVJIRExfTUFTSykgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKEhkbCAmIH5USU1FUkhETF9NQVNLKSkKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIG1vZHVsIGdsb2JhbCB0eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordHlwZWRlZiBzdHJ1Y3QgeworCXRFcGxUaW1lckV2ZW50QXJnIG1fRXZlbnRBcmc7CisJdEVwbFRpbWVya0NhbGxiYWNrIG1fcGZuQ2FsbGJhY2s7CisJc3RydWN0IGhydGltZXIgbV9UaW1lcjsKKwlCT09MIG1fZkNvbnRpbnVvdXNseTsKKwl1bnNpZ25lZCBsb25nIGxvbmcgbV91bGxQZXJpb2Q7CisKK30gdEVwbFRpbWVySGlnaFJlc2tUaW1lckluZm87CisKK3R5cGVkZWYgc3RydWN0IHsKKwl0RXBsVGltZXJIaWdoUmVza1RpbWVySW5mbyBtX2FUaW1lckluZm9bVElNRVJfQ09VTlRdOworCit9IHRFcGxUaW1lckhpZ2hSZXNrSW5zdGFuY2U7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCB2YXJzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdEVwbFRpbWVySGlnaFJlc2tJbnN0YW5jZSBFcGxUaW1lckhpZ2hSZXNrSW5zdGFuY2VfbDsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2VudW0gaHJ0aW1lcl9yZXN0YXJ0IEVwbFRpbWVySGlnaFJlc2tDYWxsYmFjayhzdHJ1Y3QgaHJ0aW1lciAqcFRpbWVyX3ApOworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgIFAgVSBCIEwgSSBDICAgRiBVIE4gQyBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsVGltZXJIaWdoUmVza0luaXQoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBpbml0aWFsaXplcyB0aGUgaGlnaCByZXNvbHV0aW9uIHRpbWVyIG1vZHVsZS4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgdm9pZAorLy8KKy8vIFJldHVybjogICAgICB0RXBsS2VybmVsICAgICAgPSBlcnJvciBjb2RlCisvLworLy8gU3RhdGU6ICAgICAgIG5vdCB0ZXN0ZWQKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIFBVQkxJQyBFcGxUaW1lckhpZ2hSZXNrSW5pdCh2b2lkKQoreworCXRFcGxLZXJuZWwgUmV0OworCisJUmV0ID0gRXBsVGltZXJIaWdoUmVza0FkZEluc3RhbmNlKCk7CisKKwlyZXR1cm4gUmV0OworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbFRpbWVySGlnaFJlc2tBZGRJbnN0YW5jZSgpCisvLworLy8gRGVzY3JpcHRpb246IGluaXRpYWxpemVzIHRoZSBoaWdoIHJlc29sdXRpb24gdGltZXIgbW9kdWxlLgorLy8KKy8vIFBhcmFtZXRlcnM6ICB2b2lkCisvLworLy8gUmV0dXJuOiAgICAgIHRFcGxLZXJuZWwgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLyBTdGF0ZTogICAgICAgbm90IHRlc3RlZAorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbFRpbWVySGlnaFJlc2tBZGRJbnN0YW5jZSh2b2lkKQoreworCXRFcGxLZXJuZWwgUmV0OworCXVuc2lnbmVkIGludCB1aUluZGV4OworCisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwlFUExfTUVNU0VUKCZFcGxUaW1lckhpZ2hSZXNrSW5zdGFuY2VfbCwgMCwKKwkJICAgc2l6ZW9mKEVwbFRpbWVySGlnaFJlc2tJbnN0YW5jZV9sKSk7CisKKyNpZm5kZWYgQ09ORklHX0hJR0hfUkVTX1RJTUVSUworCXByaW50aworCSAgICAoIkVwbFRpbWVySGlnaFJlc2s6IEtlcm5lbCBzeW1ib2wgQ09ORklHX0hJR0hfUkVTX1RJTUVSUyBpcyByZXF1aXJlZC5cbiIpOworCVJldCA9IGtFcGxOb1Jlc291cmNlOworCXJldHVybiBSZXQ7CisjZW5kaWYKKworCS8qCisJICogSW5pdGlhbGl6ZSBocnRpbWVyIHN0cnVjdHVyZXMgZm9yIGFsbCB1c2FibGUgdGltZXJzLgorCSAqLworCWZvciAodWlJbmRleCA9IDA7IHVpSW5kZXggPCBUSU1FUl9DT1VOVDsgdWlJbmRleCsrKSB7CisJCXRFcGxUaW1lckhpZ2hSZXNrVGltZXJJbmZvICpwVGltZXJJbmZvOworCQlzdHJ1Y3QgaHJ0aW1lciAqcFRpbWVyOworCisJCXBUaW1lckluZm8gPSAmRXBsVGltZXJIaWdoUmVza0luc3RhbmNlX2wubV9hVGltZXJJbmZvW3VpSW5kZXhdOworCQlwVGltZXIgPSAmcFRpbWVySW5mby0+bV9UaW1lcjsKKwkJaHJ0aW1lcl9pbml0KHBUaW1lciwgQ0xPQ0tfTU9OT1RPTklDLCBIUlRJTUVSX01PREVfQUJTKTsKKworCQlwVGltZXItPmZ1bmN0aW9uID0gRXBsVGltZXJIaWdoUmVza0NhbGxiYWNrOworCX0KKworCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbFRpbWVySGlnaFJlc2tEZWxJbnN0YW5jZSgpCisvLworLy8gRGVzY3JpcHRpb246IHNodXRzIGRvd24gdGhlIGhpZ2ggcmVzb2x1dGlvbiB0aW1lciBtb2R1bGUuCisvLworLy8gUGFyYW1ldGVyczogIHZvaWQKKy8vCisvLyBSZXR1cm46ICAgICAgdEVwbEtlcm5lbCAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vIFN0YXRlOiAgICAgICBub3QgdGVzdGVkCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsVGltZXJIaWdoUmVza0RlbEluc3RhbmNlKHZvaWQpCit7CisJdEVwbFRpbWVySGlnaFJlc2tUaW1lckluZm8gKnBUaW1lckluZm87CisJdEVwbEtlcm5lbCBSZXQ7CisJdW5zaWduZWQgaW50IHVpSW5kZXg7CisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCWZvciAodWlJbmRleCA9IDA7IHVpSW5kZXggPCBUSU1FUl9DT1VOVDsgdWlJbmRleCsrKSB7CisJCXBUaW1lckluZm8gPSAmRXBsVGltZXJIaWdoUmVza0luc3RhbmNlX2wubV9hVGltZXJJbmZvWzBdOworCQlwVGltZXJJbmZvLT5tX3BmbkNhbGxiYWNrID0gTlVMTDsKKwkJcFRpbWVySW5mby0+bV9FdmVudEFyZy5tX1RpbWVySGRsID0gMDsKKwkJLyoKKwkJICogSW4gdGhpcyBjYXNlIHdlIGNhbiBub3QganVzdCB0cnkgdG8gY2FuY2VsIHRoZSB0aW1lci4KKwkJICogV2UgYWN0dWFsbHkgaGF2ZSB0byB3YWl0IHVudGlsIGl0cyBjYWxsYmFjayBmdW5jdGlvbgorCQkgKiBoYXMgcmV0dXJuZWQuCisJCSAqLworCQlocnRpbWVyX2NhbmNlbCgmcFRpbWVySW5mby0+bV9UaW1lcik7CisJfQorCisJcmV0dXJuIFJldDsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxUaW1lckhpZ2hSZXNrTW9kaWZ5VGltZXJOcygpCisvLworLy8gRGVzY3JpcHRpb246IG1vZGlmaWVzIHRoZSB0aW1lb3V0IG9mIHRoZSB0aW1lciB3aXRoIHRoZSBzcGVjaWZpZWQgaGFuZGxlLgorLy8gICAgICAgICAgICAgIElmIHRoZSBoYW5kbGUgdGhlIHBvaW50ZXIgcG9pbnRzIHRvIGlzIHplcm8sIHRoZSB0aW1lciBtdXN0CisvLyAgICAgICAgICAgICAgYmUgY3JlYXRlZCBmaXJzdC4KKy8vICAgICAgICAgICAgICBJZiBpdCBpcyBub3QgcG9zc2libGUgdG8gc3RvcCB0aGUgb2xkIHRpbWVyLAorLy8gICAgICAgICAgICAgIHRoaXMgZnVuY3Rpb24gYWx3YXlzIGFzc3VyZXMgdGhhdCB0aGUgb2xkIHRpbWVyIGRvZXMgbm90CisvLyAgICAgICAgICAgICAgdHJpZ2dlciB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gd2l0aCB0aGUgc2FtZSBoYW5kbGUgYXMgdGhlIG5ldworLy8gICAgICAgICAgICAgIHRpbWVyLiBUaGF0IG1lYW5zIHRoZSBjYWxsYmFjayBmdW5jdGlvbiBtdXN0IGNoZWNrIHRoZSBwYXNzZWQKKy8vICAgICAgICAgICAgICBoYW5kbGUgd2l0aCB0aGUgb25lIHJldHVybmVkIGJ5IHRoaXMgZnVuY3Rpb24uIElmIHRoZXNlIGFyZQorLy8gICAgICAgICAgICAgIHVuZXF1YWwsIHRoZSBjYWxsIGNhbiBiZSBkaXNjYXJkZWQuCisvLworLy8gUGFyYW1ldGVyczogIHBUaW1lckhkbF9wICAgICA9IHBvaW50ZXIgdG8gdGltZXIgaGFuZGxlCisvLyAgICAgICAgICAgICAgdWxsVGltZU5zX3AgICAgID0gcmVsYXRpdmUgdGltZW91dCBpbiBbbnNdCisvLyAgICAgICAgICAgICAgcGZuQ2FsbGJhY2tfcCAgID0gY2FsbGJhY2sgZnVuY3Rpb24sIHdoaWNoIGlzIGNhbGxlZCBtdXR1YWwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNsdXNpdmUgd2l0aCB0aGUgRWRydiBjYWxsYmFjayBmdW5jdGlvbnMKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUnggYW5kIFR4KS4KKy8vICAgICAgICAgICAgICB1bEFyZ3VtZW50X3AgICAgPSB1c2VyLXNwZWNpZmljIGFyZ3VtZW50CisvLyAgICAgICAgICAgICAgZkNvbnRpbnVvdXNseV9wID0gaWYgVFJVRSwgY2FsbGJhY2sgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51b3VzbHk7CisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXJ3aXNlLCBpdCBpcyBhIG9uZXNob3QgdGltZXIuCisvLworLy8gUmV0dXJuOiAgICAgIHRFcGxLZXJuZWwgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLyBTdGF0ZTogICAgICAgbm90IHRlc3RlZAorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbFRpbWVySGlnaFJlc2tNb2RpZnlUaW1lck5zKHRFcGxUaW1lckhkbCAqIHBUaW1lckhkbF9wLAorCQkJCQkJdW5zaWduZWQgbG9uZyBsb25nIHVsbFRpbWVOc19wLAorCQkJCQkJdEVwbFRpbWVya0NhbGxiYWNrCisJCQkJCQlwZm5DYWxsYmFja19wLAorCQkJCQkJdW5zaWduZWQgbG9uZyB1bEFyZ3VtZW50X3AsCisJCQkJCQlCT09MIGZDb250aW51b3VzbHlfcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKwl1bnNpZ25lZCBpbnQgdWlJbmRleDsKKwl0RXBsVGltZXJIaWdoUmVza1RpbWVySW5mbyAqcFRpbWVySW5mbzsKKwlrdGltZV90IFJlbFRpbWU7CisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCS8vIGNoZWNrIHBvaW50ZXIgdG8gaGFuZGxlCisJaWYgKHBUaW1lckhkbF9wID09IE5VTEwpIHsKKwkJUmV0ID0ga0VwbFRpbWVySW52YWxpZEhhbmRsZTsKKwkJZ290byBFeGl0OworCX0KKworCWlmICgqcFRpbWVySGRsX3AgPT0gMCkgewkvLyBubyB0aW1lciBjcmVhdGVkIHlldAorCisJCS8vIHNlYXJjaCBmcmVlIHRpbWVyIGluZm8gc3RydWN0dXJlCisJCXBUaW1lckluZm8gPSAmRXBsVGltZXJIaWdoUmVza0luc3RhbmNlX2wubV9hVGltZXJJbmZvWzBdOworCQlmb3IgKHVpSW5kZXggPSAwOyB1aUluZGV4IDwgVElNRVJfQ09VTlQ7CisJCSAgICAgdWlJbmRleCsrLCBwVGltZXJJbmZvKyspIHsKKwkJCWlmIChwVGltZXJJbmZvLT5tX0V2ZW50QXJnLm1fVGltZXJIZGwgPT0gMCkgewkvLyBmcmVlIHN0cnVjdHVyZSBmb3VuZAorCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWlmICh1aUluZGV4ID49IFRJTUVSX0NPVU5UKSB7CS8vIG5vIGZyZWUgc3RydWN0dXJlIGZvdW5kCisJCQlSZXQgPSBrRXBsVGltZXJOb1RpbWVyQ3JlYXRlZDsKKwkJCWdvdG8gRXhpdDsKKwkJfQorCisJCXBUaW1lckluZm8tPm1fRXZlbnRBcmcubV9UaW1lckhkbCA9IEhETF9JTklUKHVpSW5kZXgpOworCX0gZWxzZSB7CisJCXVpSW5kZXggPSBIRExfVE9fSURYKCpwVGltZXJIZGxfcCk7CisJCWlmICh1aUluZGV4ID49IFRJTUVSX0NPVU5UKSB7CS8vIGludmFsaWQgaGFuZGxlCisJCQlSZXQgPSBrRXBsVGltZXJJbnZhbGlkSGFuZGxlOworCQkJZ290byBFeGl0OworCQl9CisKKwkJcFRpbWVySW5mbyA9ICZFcGxUaW1lckhpZ2hSZXNrSW5zdGFuY2VfbC5tX2FUaW1lckluZm9bdWlJbmRleF07CisJfQorCisJLyoKKwkgKiBpbmNyZW1lbnQgdGltZXIgaGFuZGxlCisJICogKGlmIHRpbWVyIGV4cGlyZXMgcmlnaHQgYWZ0ZXIgdGhpcyBzdGF0ZW1lbnQsIHRoZSB1c2VyCisJICogd291bGQgZGV0ZWN0IGFuIHVua25vd24gdGltZXIgaGFuZGxlIGFuZCBkaXNjYXJkIGl0KQorCSAqLworCXBUaW1lckluZm8tPm1fRXZlbnRBcmcubV9UaW1lckhkbCA9CisJICAgIEhETF9JTkMocFRpbWVySW5mby0+bV9FdmVudEFyZy5tX1RpbWVySGRsKTsKKwkqcFRpbWVySGRsX3AgPSBwVGltZXJJbmZvLT5tX0V2ZW50QXJnLm1fVGltZXJIZGw7CisKKwkvLyByZWplY3QgdG9vIHNtYWxsIHRpbWUgdmFsdWVzCisJaWYgKChmQ29udGludW91c2x5X3AgJiYgKHVsbFRpbWVOc19wIDwgVElNRVJfTUlOX1ZBTF9DWUNMRSkpCisJICAgIHx8ICghZkNvbnRpbnVvdXNseV9wICYmICh1bGxUaW1lTnNfcCA8IFRJTUVSX01JTl9WQUxfU0lOR0xFKSkpIHsKKwkJUmV0ID0ga0VwbFRpbWVyTm9UaW1lckNyZWF0ZWQ7CisJCWdvdG8gRXhpdDsKKwl9CisKKwlwVGltZXJJbmZvLT5tX0V2ZW50QXJnLm1fdWxBcmcgPSB1bEFyZ3VtZW50X3A7CisJcFRpbWVySW5mby0+bV9wZm5DYWxsYmFjayA9IHBmbkNhbGxiYWNrX3A7CisJcFRpbWVySW5mby0+bV9mQ29udGludW91c2x5ID0gZkNvbnRpbnVvdXNseV9wOworCXBUaW1lckluZm8tPm1fdWxsUGVyaW9kID0gdWxsVGltZU5zX3A7CisKKwkvKgorCSAqIEhSVElNRVJfTU9ERV9SRUwgZG9lcyBub3QgaW5mbHVlbmNlIGdlbmVyYWwgaGFuZGxpbmcgb2YgdGhpcyB0aW1lci4KKwkgKiBJdCBvbmx5IHNldHMgcmVsYXRpdmUgbW9kZSBmb3IgdGhpcyBzdGFydCBvcGVyYXRpb24uCisJICogLT4gRXhwaXJlIHRpbWUgaXMgY2FsY3VsYXRlZCBieTogTm93ICsgUmVsVGltZQorCSAqIGhydGltZXJfc3RhcnQgYWxzbyBza2lwcyBwZW5kaW5nIHRpbWVyIGV2ZW50cy4KKwkgKiBUaGUgc3RhdGUgSFJUSU1FUl9TVEFURV9DQUxMQkFDSyBpcyBpZ25vcmVkLgorCSAqIFdlIGhhdmUgdG8gY29wZSB3aXRoIHRoYXQgaW4gb3VyIGNhbGxiYWNrIGZ1bmN0aW9uLgorCSAqLworCVJlbFRpbWUgPSBrdGltZV9hZGRfbnMoa3RpbWVfc2V0KDAsIDApLCB1bGxUaW1lTnNfcCk7CisJaHJ0aW1lcl9zdGFydCgmcFRpbWVySW5mby0+bV9UaW1lciwgUmVsVGltZSwgSFJUSU1FUl9NT0RFX1JFTCk7CisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIFJldDsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxUaW1lckhpZ2hSZXNrRGVsZXRlVGltZXIoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBkZWxldGVzIHRoZSB0aW1lciB3aXRoIHRoZSBzcGVjaWZpZWQgaGFuZGxlLiBBZnRlcndhcmQgdGhlCisvLyAgICAgICAgICAgICAgaGFuZGxlIGlzIHNldCB0byB6ZXJvLgorLy8KKy8vIFBhcmFtZXRlcnM6ICBwVGltZXJIZGxfcCAgICAgPSBwb2ludGVyIHRvIHRpbWVyIGhhbmRsZQorLy8KKy8vIFJldHVybjogICAgICB0RXBsS2VybmVsICAgICAgPSBlcnJvciBjb2RlCisvLworLy8gU3RhdGU6ICAgICAgIG5vdCB0ZXN0ZWQKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIFBVQkxJQyBFcGxUaW1lckhpZ2hSZXNrRGVsZXRlVGltZXIodEVwbFRpbWVySGRsICogcFRpbWVySGRsX3ApCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwl1bnNpZ25lZCBpbnQgdWlJbmRleDsKKwl0RXBsVGltZXJIaWdoUmVza1RpbWVySW5mbyAqcFRpbWVySW5mbzsKKworCS8vIGNoZWNrIHBvaW50ZXIgdG8gaGFuZGxlCisJaWYgKHBUaW1lckhkbF9wID09IE5VTEwpIHsKKwkJUmV0ID0ga0VwbFRpbWVySW52YWxpZEhhbmRsZTsKKwkJZ290byBFeGl0OworCX0KKworCWlmICgqcFRpbWVySGRsX3AgPT0gMCkgewkvLyBubyB0aW1lciBjcmVhdGVkIHlldAorCQlnb3RvIEV4aXQ7CisJfSBlbHNlIHsKKwkJdWlJbmRleCA9IEhETF9UT19JRFgoKnBUaW1lckhkbF9wKTsKKwkJaWYgKHVpSW5kZXggPj0gVElNRVJfQ09VTlQpIHsJLy8gaW52YWxpZCBoYW5kbGUKKwkJCVJldCA9IGtFcGxUaW1lckludmFsaWRIYW5kbGU7CisJCQlnb3RvIEV4aXQ7CisJCX0KKwkJcFRpbWVySW5mbyA9ICZFcGxUaW1lckhpZ2hSZXNrSW5zdGFuY2VfbC5tX2FUaW1lckluZm9bdWlJbmRleF07CisJCWlmIChwVGltZXJJbmZvLT5tX0V2ZW50QXJnLm1fVGltZXJIZGwgIT0gKnBUaW1lckhkbF9wKSB7CS8vIGludmFsaWQgaGFuZGxlCisJCQlnb3RvIEV4aXQ7CisJCX0KKwl9CisKKwkqcFRpbWVySGRsX3AgPSAwOworCXBUaW1lckluZm8tPm1fRXZlbnRBcmcubV9UaW1lckhkbCA9IDA7CisJcFRpbWVySW5mby0+bV9wZm5DYWxsYmFjayA9IE5VTEw7CisKKwkvKgorCSAqIFRocmVlIHJldHVybiBjYXNlcyBvZiBocnRpbWVyX3RyeV90b19jYW5jZWwgaGF2ZSB0byBiZSB0cmFja2VkOgorCSAqICAxIC0gdGltZXIgaGFzIGJlZW4gcmVtb3ZlZAorCSAqICAwIC0gdGltZXIgd2FzIG5vdCBhY3RpdmUKKwkgKiAgICAgIFdlIG5lZWQgbm90IGRvIGFueXRoaW5nLiBocnRpbWVyIHRpbWVycyBqdXN0IGNvbnNpc3Qgb2YKKwkgKiAgICAgIGEgaHJ0aW1lciBzdHJ1Y3QsIHdoaWNoIHdlIG1pZ2h0IGVucXVldWUgaW4gdGhlIGhydGltZXJzCisJICogICAgICBldmVudCBsaXN0IGJ5IGNhbGxpbmcgaHJ0aW1lcl9zdGFydCgpLgorCSAqICAgICAgSWYgYSB0aW1lciBpcyBub3QgZW5xdWV1ZWQsIGl0IGlzIG5vdCBwcmVzZW50IGluIGhydGltZXJzLgorCSAqIC0xIC0gY2FsbGJhY2sgZnVuY3Rpb24gaXMgcnVubmluZworCSAqICAgICAgSW4gdGhpcyBjYXNlIHdlIGhhdmUgdG8gZW5zdXJlIHRoYXQgdGhlIHRpbWVyIGlzIG5vdAorCSAqICAgICAgY29udGludW91c2x5IHJlc3RhcnRlZC4gVGhpcyBoYXMgYmVlbiBkb25lIGJ5IGNsZWFyaW5nCisJICogICAgICBpdHMgaGFuZGxlLgorCSAqLworCWhydGltZXJfdHJ5X3RvX2NhbmNlbCgmcFRpbWVySW5mby0+bV9UaW1lcik7CisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIFJldDsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxUaW1lckhpZ2hSZXNrQ2FsbGJhY2soKQorLy8KKy8vIERlc2NyaXB0aW9uOiBDYWxsYmFjayBmdW5jdGlvbiBjb21tb25seSB1c2VkIGZvciBhbGwgdGltZXJzLgorLy8KKy8vIFBhcmFtZXRlcnM6ICBwVGltZXJfcCA9IHBvaW50ZXIgdG8gaHJ0aW1lcgorLy8KKy8vIFJldHVybjoKKy8vCisvLyBTdGF0ZTogICAgICAgbm90IHRlc3RlZAorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2VudW0gaHJ0aW1lcl9yZXN0YXJ0IEVwbFRpbWVySGlnaFJlc2tDYWxsYmFjayhzdHJ1Y3QgaHJ0aW1lciAqcFRpbWVyX3ApCit7CisJdW5zaWduZWQgaW50IHVpSW5kZXg7CisJdEVwbFRpbWVySGlnaFJlc2tUaW1lckluZm8gKnBUaW1lckluZm87CisJdEVwbFRpbWVySGRsIE9yZ1RpbWVySGRsOworCWVudW0gaHJ0aW1lcl9yZXN0YXJ0IFJldDsKKworCUJFTkNITUFSS19NT0RfMjRfU0VUKDQpOworCisJUmV0ID0gSFJUSU1FUl9OT1JFU1RBUlQ7CisJcFRpbWVySW5mbyA9CisJICAgIGNvbnRhaW5lcl9vZihwVGltZXJfcCwgdEVwbFRpbWVySGlnaFJlc2tUaW1lckluZm8sIG1fVGltZXIpOworCXVpSW5kZXggPSBIRExfVE9fSURYKHBUaW1lckluZm8tPm1fRXZlbnRBcmcubV9UaW1lckhkbCk7CisJaWYgKHVpSW5kZXggPj0gVElNRVJfQ09VTlQpIHsJLy8gaW52YWxpZCBoYW5kbGUKKwkJZ290byBFeGl0OworCX0KKworCS8qCisJICogV2Ugc3RvcmUgdGhlIHRpbWVyIGhhbmRsZSBiZWZvcmUgY2FsbGluZyB0aGUgY2FsbGJhY2sgZnVuY3Rpb24KKwkgKiBhcyB0aGUgdGltZXIgY2FuIGJlIG1vZGlmaWVkIGluc2lkZSBpdC4KKwkgKi8KKwlPcmdUaW1lckhkbCA9IHBUaW1lckluZm8tPm1fRXZlbnRBcmcubV9UaW1lckhkbDsKKworCWlmIChwVGltZXJJbmZvLT5tX3BmbkNhbGxiYWNrICE9IE5VTEwpIHsKKwkJcFRpbWVySW5mby0+bV9wZm5DYWxsYmFjaygmcFRpbWVySW5mby0+bV9FdmVudEFyZyk7CisJfQorCisJaWYgKHBUaW1lckluZm8tPm1fZkNvbnRpbnVvdXNseSkgeworCQlrdGltZV90IEludGVydmFsOworI2lmZGVmIFBST1ZFX09WRVJSVU4KKwkJa3RpbWVfdCBOb3c7CisJCXVuc2lnbmVkIGxvbmcgT3ZlcnJ1bnM7CisjZW5kaWYKKworCQlpZiAoT3JnVGltZXJIZGwgIT0gcFRpbWVySW5mby0+bV9FdmVudEFyZy5tX1RpbWVySGRsKSB7CisJCQkvKiBtb2RpZmllZCB0aW1lciBoYXMgYWxyZWFkeSBiZWVuIHJlc3RhcnRlZCAqLworCQkJZ290byBFeGl0OworCQl9CisjaWZkZWYgUFJPVkVfT1ZFUlJVTgorCQlOb3cgPSBrdGltZV9nZXQoKTsKKwkJSW50ZXJ2YWwgPQorCQkgICAga3RpbWVfYWRkX25zKGt0aW1lX3NldCgwLCAwKSwgcFRpbWVySW5mby0+bV91bGxQZXJpb2QpOworCQlPdmVycnVucyA9IGhydGltZXJfZm9yd2FyZChwVGltZXJfcCwgTm93LCBJbnRlcnZhbCk7CisJCWlmIChPdmVycnVucyA+IDEpIHsKKwkJCXByaW50aworCQkJICAgICgiRXBsVGltZXJIaWdoUmVzazogQ29udGludW91cyB0aW1lciAoaGFuZGxlIDB4JWxYKSBoYWQgdG8gc2tpcCAlbHUgaW50ZXJ2YWwocykhXG4iLAorCQkJICAgICBwVGltZXJJbmZvLT5tX0V2ZW50QXJnLm1fVGltZXJIZGwsIE92ZXJydW5zIC0gMSk7CisJCX0KKyNlbHNlCisJCXBUaW1lcl9wLT5leHBpcmVzID0ga3RpbWVfYWRkX25zKHBUaW1lcl9wLT5leHBpcmVzLAorCQkJCQkJIHBUaW1lckluZm8tPm1fdWxsUGVyaW9kKTsKKyNlbmRpZgorCisJCVJldCA9IEhSVElNRVJfUkVTVEFSVDsKKwl9CisKKyAgICAgIEV4aXQ6CisJQkVOQ0hNQVJLX01PRF8yNF9SRVNFVCg0KTsKKwlyZXR1cm4gUmV0OworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9WaXJ0dWFsRXRoZXJuZXRMaW51eC5jIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9WaXJ0dWFsRXRoZXJuZXRMaW51eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkODM4ZGIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL1ZpcnR1YWxFdGhlcm5ldExpbnV4LmMKQEAgLTAsMCArMSwzNDIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBWaXJ0dWFsIEV0aGVybmV0IERyaXZlciBmb3IgTGludXgKKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgICAgICAgICRSQ1NmaWxlOiBWaXJ0dWFsRXRoZXJuZXRMaW51eC5jLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS44ICQgICREYXRlOiAyMDA4LzExLzIwIDE3OjA2OjUxICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgIDIwMDYvMDYvMTIgLWFyOiAgIHN0YXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiwgdmVyc2lvbiAxLjAwCisKKyAgMjAwNi8wOS8xOCBkLmsuOiAgaW50ZWdyYXRpb24gaW50byBFUEwgRExMayBtb2R1bGUKKworICBUb0RvOgorCisgIHZvaWQgbmV0aWZfY2Fycmllcl9vZmYoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisgIHZvaWQgbmV0aWZfY2Fycmllcl9vbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxuZXQvYXJwLmg+CisKKyNpbmNsdWRlIDxuZXQvcHJvdG9jb2wuaD4KKyNpbmNsdWRlIDxuZXQvcGt0X3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvaWZfZXRoZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L2lwLmg+CisjaW5jbHVkZSA8bGludXgvdWRwLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgkvKiBmb3Igc3RydWN0IHNrX2J1ZmYgKi8KKworI2luY2x1ZGUgImtlcm5lbC9WaXJ0dWFsRXRoZXJuZXQuaCIKKyNpbmNsdWRlICJrZXJuZWwvRXBsRGxsa0NhbC5oIgorI2luY2x1ZGUgImtlcm5lbC9FcGxEbGxrLmgiCisKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfVkVUSCkpICE9IDApCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIEcgTCBPIEIgQSBMICAgRCBFIEYgSSBOIEkgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWZuZGVmIEVQTF9WRVRIX1RYX1RJTUVPVVQKKy8vI2RlZmluZSBFUExfVkVUSF9UWF9USU1FT1VUICgyKkhaKQorI2RlZmluZSBFUExfVkVUSF9UWF9USU1FT1VUIDAJLy8gZC5rLjogd2UgdXNlIG5vIHRpbWVvdXQKKyNlbmRpZgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBtb2R1bCBnbG9iYWxlIHZhcnMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqcFZFdGhOZXREZXZpY2VfZyA9IE5VTEw7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgaW50IFZFdGhPcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpwTmV0RGV2aWNlX3ApOworc3RhdGljIGludCBWRXRoQ2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKnBOZXREZXZpY2VfcCk7CitzdGF0aWMgaW50IFZFdGhYbWl0KHN0cnVjdCBza19idWZmICpwU2tiX3AsIHN0cnVjdCBuZXRfZGV2aWNlICpwTmV0RGV2aWNlX3ApOworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpWRXRoR2V0U3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKnBOZXREZXZpY2VfcCk7CitzdGF0aWMgdm9pZCBWRXRoVGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqcE5ldERldmljZV9wKTsKK3N0YXRpYyB0RXBsS2VybmVsIFZFdGhSZWN2RnJhbWUodEVwbEZyYW1lSW5mbyAqIHBGcmFtZUluZm9fcCk7CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgUCBVIEIgTCBJIEMgICBGIFUgTiBDIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOgorLy8KKy8vIERlc2NyaXB0aW9uOgorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczoKKy8vCisvLworLy8gUmV0dXJuczoKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIGludCBWRXRoT3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqcE5ldERldmljZV9wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwkvL29wZW4gdGhlIGRldmljZQorLy8Jc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMqIHBTdGF0cyA9IG5ldGRldl9wcml2KHBOZXREZXZpY2VfcCk7CisKKwkvL3N0YXJ0IHRoZSBpbnRlcmZhY2UgcXVldWUgZm9yIHRoZSBuZXR3b3JrIHN1YnN5c3RlbQorCW5ldGlmX3N0YXJ0X3F1ZXVlKHBOZXREZXZpY2VfcCk7CisKKwkvLyByZWdpc3RlciBjYWxsYmFjayBmdW5jdGlvbiBpbiBETEwKKwlSZXQgPSBFcGxEbGxrUmVnQXN5bmNIYW5kbGVyKFZFdGhSZWN2RnJhbWUpOworCisJRVBMX0RCR0xWTF9WRVRIX1RSQUNFMQorCSAgICAoIlZFdGhPcGVuOiBFcGxEbGxrUmVnQXN5bmNIYW5kbGVyIHJldHVybmVkIDB4JTAyWFxuIiwgUmV0KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IFZFdGhDbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqcE5ldERldmljZV9wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwlFUExfREJHTFZMX1ZFVEhfVFJBQ0UwKCJWRXRoQ2xvc2VcbiIpOworCisJUmV0ID0gRXBsRGxsa0RlcmVnQXN5bmNIYW5kbGVyKFZFdGhSZWN2RnJhbWUpOworCisJLy9zdG9wIHRoZSBpbnRlcmZhY2UgcXVldWUgZm9yIHRoZSBuZXR3b3JrIHN1YnN5c3RlbQorCW5ldGlmX3N0b3BfcXVldWUocE5ldERldmljZV9wKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBWRXRoWG1pdChzdHJ1Y3Qgc2tfYnVmZiAqcFNrYl9wLCBzdHJ1Y3QgbmV0X2RldmljZSAqcE5ldERldmljZV9wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJdEVwbEZyYW1lSW5mbyBGcmFtZUluZm87CisKKwkvL3RyYW5zbWl0IGZ1bmN0aW9uCisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnBTdGF0cyA9IG5ldGRldl9wcml2KHBOZXREZXZpY2VfcCk7CisKKwkvL3NhdmUgdGltZXN0ZW1wCisJcE5ldERldmljZV9wLT50cmFuc19zdGFydCA9IGppZmZpZXM7CisKKwlGcmFtZUluZm8ubV9wRnJhbWUgPSAodEVwbEZyYW1lICopIHBTa2JfcC0+ZGF0YTsKKwlGcmFtZUluZm8ubV91aUZyYW1lU2l6ZSA9IHBTa2JfcC0+bGVuOworCisJLy9jYWxsIHNlbmQgZmt0IG9uIERMTAorCVJldCA9IEVwbERsbGtDYWxBc3luY1NlbmQoJkZyYW1lSW5mbywga0VwbERsbEFzeW5jUmVxUHJpb0dlbmVyaWMpOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJRVBMX0RCR0xWTF9WRVRIX1RSQUNFMQorCQkgICAgKCJWRXRoWG1pdDogRXBsRGxsa0NhbEFzeW5jU2VuZCByZXR1cm5lZCAweCUwMlhcbiIsIFJldCk7CisJCW5ldGlmX3N0b3BfcXVldWUocE5ldERldmljZV9wKTsKKwkJZ290byBFeGl0OworCX0gZWxzZSB7CisJCUVQTF9EQkdMVkxfVkVUSF9UUkFDRTAoIlZFdGhYbWl0OiBmcmFtZSBwYXNzZWQgdG8gRExMXG4iKTsKKwkJZGV2X2tmcmVlX3NrYihwU2tiX3ApOworCisJCS8vc2V0IHN0YXRzIGZvciB0aGUgZGV2aWNlCisJCXBTdGF0cy0+dHhfcGFja2V0cysrOworCQlwU3RhdHMtPnR4X2J5dGVzICs9IEZyYW1lSW5mby5tX3VpRnJhbWVTaXplOworCX0KKworICAgICAgRXhpdDoKKwlyZXR1cm4gMDsKKworfQorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKlZFdGhHZXRTdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqcE5ldERldmljZV9wKQoreworCUVQTF9EQkdMVkxfVkVUSF9UUkFDRTAoIlZFdGhHZXRTdGF0c1xuIik7CisKKwlyZXR1cm4gbmV0ZGV2X3ByaXYocE5ldERldmljZV9wKTsKK30KKworc3RhdGljIHZvaWQgVkV0aFRpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKnBOZXREZXZpY2VfcCkKK3sKKwlFUExfREJHTFZMX1ZFVEhfVFJBQ0UwKCJWRXRoVGltZW91dChcbiIpOworCisJLy8gJCQkIGQuay46IG1vdmUgdG8gZXh0cmEgZnVuY3Rpb24sIHdoaWNoIGlzIGNhbGxlZCBieSBETEwgd2hlbiBuZXcgc3BhY2UgaXMgYXZhaWxhYmxlIGluIFR4RmlmbworCWlmIChuZXRpZl9xdWV1ZV9zdG9wcGVkKHBOZXREZXZpY2VfcCkpIHsKKwkJbmV0aWZfd2FrZV9xdWV1ZShwTmV0RGV2aWNlX3ApOworCX0KK30KKworc3RhdGljIHRFcGxLZXJuZWwgVkV0aFJlY3ZGcmFtZSh0RXBsRnJhbWVJbmZvICogcEZyYW1lSW5mb19wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJc3RydWN0IG5ldF9kZXZpY2UgKnBOZXREZXZpY2UgPSBwVkV0aE5ldERldmljZV9nOworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpwU3RhdHMgPSBuZXRkZXZfcHJpdihwTmV0RGV2aWNlKTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqcFNrYjsKKworCUVQTF9EQkdMVkxfVkVUSF9UUkFDRTEoIlZFdGhSZWN2RnJhbWU6IEZyYW1lU2l6ZT0ldVxuIiwKKwkJCSAgICAgICBwRnJhbWVJbmZvX3AtPm1fdWlGcmFtZVNpemUpOworCisJcFNrYiA9IGRldl9hbGxvY19za2IocEZyYW1lSW5mb19wLT5tX3VpRnJhbWVTaXplICsgMik7CisJaWYgKHBTa2IgPT0gTlVMTCkgeworCQlwU3RhdHMtPnJ4X2Ryb3BwZWQrKzsKKwkJZ290byBFeGl0OworCX0KKwlwU2tiLT5kZXYgPSBwTmV0RGV2aWNlOworCisJc2tiX3Jlc2VydmUocFNrYiwgMik7CisKKwltZW1jcHkoKHZvaWQgKilza2JfcHV0KHBTa2IsIHBGcmFtZUluZm9fcC0+bV91aUZyYW1lU2l6ZSksCisJICAgICAgIHBGcmFtZUluZm9fcC0+bV9wRnJhbWUsIHBGcmFtZUluZm9fcC0+bV91aUZyYW1lU2l6ZSk7CisKKwlwU2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHBTa2IsIHBOZXREZXZpY2UpOworCXBTa2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX1VOTkVDRVNTQVJZOworCisJLy8gY2FsbCBuZXRpZl9yeCB3aXRoIHNrYgorCW5ldGlmX3J4KHBTa2IpOworCisJRVBMX0RCR0xWTF9WRVRIX1RSQUNFMSgiVkV0aFJlY3ZGcmFtZTogU3JjTUFDPTB4JWxseFxuIiwKKwkJCSAgICAgICBBbWlHZXRRd29yZDQ4RnJvbUJlKHBGcmFtZUluZm9fcC0+bV9wRnJhbWUtPgorCQkJCQkJICAgbV9iZV9hYlNyY01hYykpOworCisJLy8gdXBkYXRlIHJlY2VpdmUgc3RhdGlzdGljcworCXBTdGF0cy0+cnhfcGFja2V0cysrOworCXBTdGF0cy0+cnhfYnl0ZXMgKz0gcEZyYW1lSW5mb19wLT5tX3VpRnJhbWVTaXplOworCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7Cit9CisKK3RFcGxLZXJuZWwgUFVCTElDIFZFdGhBZGRJbnN0YW5jZSh0RXBsRGxsa0luaXRQYXJhbSAqIHBJbml0UGFyYW1fcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJLy8gYWxsb2NhdGUgbmV0IGRldmljZSBzdHJ1Y3R1cmUgd2l0aCBwcml2IHBvaW50aW5nIHRvIHN0YXRzIHN0cnVjdHVyZQorCXBWRXRoTmV0RGV2aWNlX2cgPQorCSAgICBhbGxvY19uZXRkZXYoc2l6ZW9mKHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzKSwgRVBMX1ZFVEhfTkFNRSwKKwkJCSBldGhlcl9zZXR1cCk7CisvLyAgICBwVkV0aE5ldERldmljZV9nID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mIChzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cykpOworCisJaWYgKHBWRXRoTmV0RGV2aWNlX2cgPT0gTlVMTCkgeworCQlSZXQgPSBrRXBsTm9SZXNvdXJjZTsKKwkJZ290byBFeGl0OworCX0KKworCXBWRXRoTmV0RGV2aWNlX2ctPm9wZW4gPSBWRXRoT3BlbjsKKwlwVkV0aE5ldERldmljZV9nLT5zdG9wID0gVkV0aENsb3NlOworCXBWRXRoTmV0RGV2aWNlX2ctPmdldF9zdGF0cyA9IFZFdGhHZXRTdGF0czsKKwlwVkV0aE5ldERldmljZV9nLT5oYXJkX3N0YXJ0X3htaXQgPSBWRXRoWG1pdDsKKwlwVkV0aE5ldERldmljZV9nLT50eF90aW1lb3V0ID0gVkV0aFRpbWVvdXQ7CisJcFZFdGhOZXREZXZpY2VfZy0+d2F0Y2hkb2dfdGltZW8gPSBFUExfVkVUSF9UWF9USU1FT1VUOworCXBWRXRoTmV0RGV2aWNlX2ctPmRlc3RydWN0b3IgPSBmcmVlX25ldGRldjsKKworCS8vIGNvcHkgb3duIE1BQyBhZGRyZXNzIHRvIG5ldCBkZXZpY2Ugc3RydWN0dXJlCisJbWVtY3B5KHBWRXRoTmV0RGV2aWNlX2ctPmRldl9hZGRyLCBwSW5pdFBhcmFtX3AtPm1fYmVfYWJTcmNNYWMsIDYpOworCisJLy9yZWdpc3RlciBWRXRoIHRvIHRoZSBuZXR3b3JrIHN1YnN5c3RlbQorCWlmIChyZWdpc3Rlcl9uZXRkZXYocFZFdGhOZXREZXZpY2VfZykpIHsKKwkJRVBMX0RCR0xWTF9WRVRIX1RSQUNFMAorCQkgICAgKCJWRXRoQWRkSW5zdGFuY2U6IENvdWxkIG5vdCByZWdpc3RlciBWRXRoLi4uXG4iKTsKKwl9IGVsc2UgeworCQlFUExfREJHTFZMX1ZFVEhfVFJBQ0UwCisJCSAgICAoIlZFdGhBZGRJbnN0YW5jZTogUmVnaXN0ZXIgVkV0aCBzdWNjZXNzZnVsbC4uLlxuIik7CisJfQorCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7Cit9CisKK3RFcGxLZXJuZWwgUFVCTElDIFZFdGhEZWxJbnN0YW5jZSh2b2lkKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwlpZiAocFZFdGhOZXREZXZpY2VfZyAhPSBOVUxMKSB7CisJCS8vdW5yZWdpc3RlciBWRXRoIGZyb20gdGhlIG5ldHdvcmsgc3Vic3lzdGVtCisJCXVucmVnaXN0ZXJfbmV0ZGV2KHBWRXRoTmV0RGV2aWNlX2cpOworCQkvLyBkZXN0cnVjdG9yIHdhcyBzZXQgdG8gZnJlZV9uZXRkZXYsCisJCS8vIHNvIHdlIGRvIG5vdCBuZWVkIHRvIGNhbGwgZnJlZV9uZXRkZXYgaGVyZQorCQlwVkV0aE5ldERldmljZV9nID0gTlVMTDsKKwl9CisKKwlyZXR1cm4gUmV0OworfQorCisjZW5kaWYgLy8gKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9WRVRIKSkgIT0gMCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwvYW1peDg2LmMgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL2FtaXg4Ni5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmNzQyMzgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL2FtaXg4Ni5jCkBAIC0wLDAgKzEsOTA1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgb3BlblBPV0VSTElOSworCisgIERlc2NyaXB0aW9uOiAgQWJzdHJhY3QgTWVtb3J5IEludGVyZmFjZSBmb3IgeDg2IGNvbXBhdGlibGUKKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgICAgICAgICRSQ1NmaWxlOiBhbWl4ODYuYyx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuMyAkICAkRGF0ZTogMjAwOC8wNC8xNyAyMTozNjozMiAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICAgICAgLi4uCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgci5zLjogZmlyc3QgaW1wbGVtZXRhdGlvbgorCisgIDIwMDYtMDYtMTMgIGQuay46IGR1cGxpY2F0ZSBmdW5jdGlvbnMgZm9yIGxpdHRsZSBlbmRpYW4gYW5kIGJpZyBlbmRpYW4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy8jaW5jbHVkZSAiZ2xvYmFsLmgiCisvLyNpbmNsdWRlICJFcGxBbWkuaCIKKyNpbmNsdWRlICJFcGxJbmMuaCIKKworI2lmICghZGVmaW5lZChFUExfQU1JX0lOTElORUQpKSB8fCBkZWZpbmVkKElOTElORV9FTkFCTEVEKQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gdHlwZWRlZgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordHlwZWRlZiBzdHJ1Y3QgeworCVdPUkQgbV93V29yZDsKKworfSB0d1N0cnVjdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCURXT1JEIG1fZHdEd29yZDsKKworfSB0ZHdTdHJ1Y3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlRV09SRCBtX3F3UXdvcmQ7CisKK30gdHF3U3RydWN0OworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgIFAgVSBCIEwgSSBDICAgRiBVIE4gQyBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgQW1pU2V0WFhYVG9CZSgpCisvLworLy8gRGVzY3JpcHRpb246IHdyaXRlcyB0aGUgc3BlY2lmaWVkIHZhbHVlIHRvIHRoZSBhYnNvbHV0ZSBhZGRyZXNzIGluCisvLyAgICAgICAgICAgICAgYmlnIGVuZGlhbgorLy8KKy8vIFBhcmFtZXRlcnM6ICBwQWRkcl9wICAgICAgICAgICAgICAgICA9IGFic29sdXRlIGFkZHJlc3MKKy8vICAgICAgICAgICAgICB4WFhYVmFsX3AgICAgICAgICAgICAgICA9IHZhbHVlCisvLworLy8gUmV0dXJuczogICAgIChub25lKQorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tPCB3cml0ZSBCWVRFIGluIGJpZyBlbmRpYW4gPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKgordm9pZCAgUFVCTElDICBBbWlTZXRCeXRlVG9CZSAodm9pZCBGQVIqIHBBZGRyX3AsIEJZVEUgYkJ5dGVWYWxfcCkKK3sKKworICAgKihCWVRFIEZBUiopcEFkZHJfcCA9IGJCeXRlVmFsX3A7CisKK30KKyovCisKKy8vLS0tLS0tLS0tLS0tPCB3cml0ZSBXT1JEIGluIGJpZyBlbmRpYW4gPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lOTElORV9GVU5DVElPTiB2b2lkIFBVQkxJQyBBbWlTZXRXb3JkVG9CZSh2b2lkIEZBUiAqIHBBZGRyX3AsIFdPUkQgd1dvcmRWYWxfcCkKK3sKKwl0d1N0cnVjdCBGQVIgKnB3U3RydWN0OworCXR3U3RydWN0IHdWYWx1ZTsKKworCXdWYWx1ZS5tX3dXb3JkID0gKFdPUkQpICgod1dvcmRWYWxfcCAmIDB4MDBGRikgPDwgOCk7CS8vTFNCIHRvIE1TQgorCXdWYWx1ZS5tX3dXb3JkIHw9IChXT1JEKSAoKHdXb3JkVmFsX3AgJiAweEZGMDApID4+IDgpOwkvL01TQiB0byBMU0IKKworCXB3U3RydWN0ID0gKHR3U3RydWN0IEZBUiAqKSBwQWRkcl9wOworCXB3U3RydWN0LT5tX3dXb3JkID0gd1ZhbHVlLm1fd1dvcmQ7CisKK30KKworLy8tLS0tLS0tLS0tLS08IHdyaXRlIERXT1JEIGluIGJpZyBlbmRpYW4gPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSU5MSU5FX0ZVTkNUSU9OIHZvaWQgUFVCTElDIEFtaVNldER3b3JkVG9CZSh2b2lkIEZBUiAqIHBBZGRyX3AsCisJCQkJCSAgICBEV09SRCBkd0R3b3JkVmFsX3ApCit7CisJdGR3U3RydWN0IEZBUiAqcGR3U3RydWN0OworCXRkd1N0cnVjdCBkd1ZhbHVlOworCisJZHdWYWx1ZS5tX2R3RHdvcmQgPSAoKGR3RHdvcmRWYWxfcCAmIDB4MDAwMDAwRkYpIDw8IDI0KTsJLy9MU0IgdG8gTVNCCisJZHdWYWx1ZS5tX2R3RHdvcmQgfD0gKChkd0R3b3JkVmFsX3AgJiAweDAwMDBGRjAwKSA8PCA4KTsKKwlkd1ZhbHVlLm1fZHdEd29yZCB8PSAoKGR3RHdvcmRWYWxfcCAmIDB4MDBGRjAwMDApID4+IDgpOworCWR3VmFsdWUubV9kd0R3b3JkIHw9ICgoZHdEd29yZFZhbF9wICYgMHhGRjAwMDAwMCkgPj4gMjQpOwkvL01TQiB0byBMU0IKKworCXBkd1N0cnVjdCA9ICh0ZHdTdHJ1Y3QgRkFSICopIHBBZGRyX3A7CisJcGR3U3RydWN0LT5tX2R3RHdvcmQgPSBkd1ZhbHVlLm1fZHdEd29yZDsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBBbWlTZXRYWFhUb0xlKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogd3JpdGVzIHRoZSBzcGVjaWZpZWQgdmFsdWUgdG8gdGhlIGFic29sdXRlIGFkZHJlc3MgaW4KKy8vICAgICAgICAgICAgICBsaXR0bGUgZW5kaWFuCisvLworLy8gUGFyYW1ldGVyczogIHBBZGRyX3AgICAgICAgICAgICAgICAgID0gYWJzb2x1dGUgYWRkcmVzcworLy8gICAgICAgICAgICAgIHhYWFhWYWxfcCAgICAgICAgICAgICAgID0gdmFsdWUKKy8vCisvLyBSZXR1cm5zOiAgICAgKG5vbmUpCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS08IHdyaXRlIEJZVEUgaW4gbGl0dGxlIGVuZGlhbiA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qCit2b2lkICBQVUJMSUMgIEFtaVNldEJ5dGVUb0xlICh2b2lkIEZBUiogcEFkZHJfcCwgQllURSBiQnl0ZVZhbF9wKQoreworCisgICAqKEJZVEUgRkFSKilwQWRkcl9wID0gYkJ5dGVWYWxfcDsKKworfQorKi8KKworLy8tLS0tLS0tLS0tLS08IHdyaXRlIFdPUkQgaW4gbGl0dGxlIGVuZGlhbiA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSU5MSU5FX0ZVTkNUSU9OIHZvaWQgUFVCTElDIEFtaVNldFdvcmRUb0xlKHZvaWQgRkFSICogcEFkZHJfcCwgV09SRCB3V29yZFZhbF9wKQoreworCXR3U3RydWN0IEZBUiAqcHdTdHJ1Y3Q7CisKKwlwd1N0cnVjdCA9ICh0d1N0cnVjdCBGQVIgKikgcEFkZHJfcDsKKwlwd1N0cnVjdC0+bV93V29yZCA9IHdXb3JkVmFsX3A7CisKK30KKworLy8tLS0tLS0tLS0tLS08IHdyaXRlIERXT1JEIGluIGxpdHRsZSBlbmRpYW4gPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSU5MSU5FX0ZVTkNUSU9OIHZvaWQgUFVCTElDIEFtaVNldER3b3JkVG9MZSh2b2lkIEZBUiAqIHBBZGRyX3AsCisJCQkJCSAgICBEV09SRCBkd0R3b3JkVmFsX3ApCit7CisJdGR3U3RydWN0IEZBUiAqcGR3U3RydWN0OworCisJcGR3U3RydWN0ID0gKHRkd1N0cnVjdCBGQVIgKikgcEFkZHJfcDsKKwlwZHdTdHJ1Y3QtPm1fZHdEd29yZCA9IGR3RHdvcmRWYWxfcDsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBBbWlHZXRYWFhGcm9tQmUoKQorLy8KKy8vIERlc2NyaXB0aW9uOiByZWFkcyB0aGUgc3BlY2lmaWVkIHZhbHVlIGZyb20gdGhlIGFic29sdXRlIGFkZHJlc3MgaW4KKy8vICAgICAgICAgICAgICBiaWcgZW5kaWFuCisvLworLy8gUGFyYW1ldGVyczogIHBBZGRyX3AgICAgICAgICAgICAgICAgID0gYWJzb2x1dGUgYWRkcmVzcworLy8KKy8vIFJldHVybnM6ICAgICBYWFggICAgICAgICAgICAgICAgICAgICA9IHZhbHVlCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS08IHJlYWQgQllURSBpbiBiaWcgZW5kaWFuID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qCitCWVRFICBQVUJMSUMgIEFtaUdldEJ5dGVGcm9tQmUgKHZvaWQgRkFSKiBwQWRkcl9wKQoreworCisgICByZXR1cm4gKCAqKEJZVEUgRkFSKilwQWRkcl9wICk7CisKK30KKyovCisKKy8vLS0tLS0tLS0tLS0tPCByZWFkIFdPUkQgaW4gYmlnIGVuZGlhbiA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lOTElORV9GVU5DVElPTiBXT1JEIFBVQkxJQyBBbWlHZXRXb3JkRnJvbUJlKHZvaWQgRkFSICogcEFkZHJfcCkKK3sKKwl0d1N0cnVjdCBGQVIgKnB3U3RydWN0OworCXR3U3RydWN0IHdWYWx1ZTsKKworCXB3U3RydWN0ID0gKHR3U3RydWN0IEZBUiAqKSBwQWRkcl9wOworCisJd1ZhbHVlLm1fd1dvcmQgPSAoV09SRCkgKChwd1N0cnVjdC0+bV93V29yZCAmIDB4MDBGRikgPDwgOCk7CS8vTFNCIHRvIE1TQgorCXdWYWx1ZS5tX3dXb3JkIHw9IChXT1JEKSAoKHB3U3RydWN0LT5tX3dXb3JkICYgMHhGRjAwKSA+PiA4KTsJLy9NU0IgdG8gTFNCCisKKwlyZXR1cm4gKHdWYWx1ZS5tX3dXb3JkKTsKKworfQorCisvLy0tLS0tLS0tLS0tLTwgcmVhZCBEV09SRCBpbiBiaWcgZW5kaWFuID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJTkxJTkVfRlVOQ1RJT04gRFdPUkQgUFVCTElDIEFtaUdldER3b3JkRnJvbUJlKHZvaWQgRkFSICogcEFkZHJfcCkKK3sKKwl0ZHdTdHJ1Y3QgRkFSICpwZHdTdHJ1Y3Q7CisJdGR3U3RydWN0IGR3VmFsdWU7CisKKwlwZHdTdHJ1Y3QgPSAodGR3U3RydWN0IEZBUiAqKSBwQWRkcl9wOworCisJZHdWYWx1ZS5tX2R3RHdvcmQgPSAoKHBkd1N0cnVjdC0+bV9kd0R3b3JkICYgMHgwMDAwMDBGRikgPDwgMjQpOwkvL0xTQiB0byBNU0IKKwlkd1ZhbHVlLm1fZHdEd29yZCB8PSAoKHBkd1N0cnVjdC0+bV9kd0R3b3JkICYgMHgwMDAwRkYwMCkgPDwgOCk7CisJZHdWYWx1ZS5tX2R3RHdvcmQgfD0gKChwZHdTdHJ1Y3QtPm1fZHdEd29yZCAmIDB4MDBGRjAwMDApID4+IDgpOworCWR3VmFsdWUubV9kd0R3b3JkIHw9ICgocGR3U3RydWN0LT5tX2R3RHdvcmQgJiAweEZGMDAwMDAwKSA+PiAyNCk7CS8vTVNCIHRvIExTQgorCisJcmV0dXJuIChkd1ZhbHVlLm1fZHdEd29yZCk7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgQW1pR2V0WFhYRnJvbUxlKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogcmVhZHMgdGhlIHNwZWNpZmllZCB2YWx1ZSBmcm9tIHRoZSBhYnNvbHV0ZSBhZGRyZXNzIGluCisvLyAgICAgICAgICAgICAgbGl0dGxlIGVuZGlhbgorLy8KKy8vIFBhcmFtZXRlcnM6ICBwQWRkcl9wICAgICAgICAgICAgICAgICA9IGFic29sdXRlIGFkZHJlc3MKKy8vCisvLyBSZXR1cm5zOiAgICAgWFhYICAgICAgICAgICAgICAgICAgICAgPSB2YWx1ZQorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tPCByZWFkIEJZVEUgaW4gbGl0dGxlIGVuZGlhbiA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKgorQllURSAgUFVCTElDICBBbWlHZXRCeXRlRnJvbUxlICh2b2lkIEZBUiogcEFkZHJfcCkKK3sKKworICAgcmV0dXJuICggKihCWVRFIEZBUiopcEFkZHJfcCApOworCit9CisqLworCisvLy0tLS0tLS0tLS0tLTwgcmVhZCBXT1JEIGluIGxpdHRsZSBlbmRpYW4gPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJTkxJTkVfRlVOQ1RJT04gV09SRCBQVUJMSUMgQW1pR2V0V29yZEZyb21MZSh2b2lkIEZBUiAqIHBBZGRyX3ApCit7CisJdHdTdHJ1Y3QgRkFSICpwd1N0cnVjdDsKKworCXB3U3RydWN0ID0gKHR3U3RydWN0IEZBUiAqKSBwQWRkcl9wOworCXJldHVybiAocHdTdHJ1Y3QtPm1fd1dvcmQpOworCit9CisKKy8vLS0tLS0tLS0tLS0tPCByZWFkIERXT1JEIGluIGxpdHRsZSBlbmRpYW4gPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lOTElORV9GVU5DVElPTiBEV09SRCBQVUJMSUMgQW1pR2V0RHdvcmRGcm9tTGUodm9pZCBGQVIgKiBwQWRkcl9wKQoreworCXRkd1N0cnVjdCBGQVIgKnBkd1N0cnVjdDsKKworCXBkd1N0cnVjdCA9ICh0ZHdTdHJ1Y3QgRkFSICopIHBBZGRyX3A7CisJcmV0dXJuIChwZHdTdHJ1Y3QtPm1fZHdEd29yZCk7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgQW1pU2V0RHdvcmQyNFRvQmUoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBzZXRzIGEgMjQgYml0IHZhbHVlIHRvIGEgYnVmZmVyIGluIGJpZyBlbmRpYW4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgcEFkZHJfcCAgICAgICAgID0gcG9pbnRlciB0byBkZXN0aW5hdGlvbiBidWZmZXIKKy8vICAgICAgICAgICAgICBkd0R3b3JkVmFsX3AgICAgPSB2YWx1ZSB0byBzZXQKKy8vCisvLyBSZXR1cm46ICAgICAgdm9pZAorLy8KKy8vIFN0YXRlOiAgICAgICBub3QgdGVzdGVkCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSU5MSU5FX0ZVTkNUSU9OIHZvaWQgUFVCTElDIEFtaVNldER3b3JkMjRUb0JlKHZvaWQgRkFSICogcEFkZHJfcCwKKwkJCQkJICAgICAgRFdPUkQgZHdEd29yZFZhbF9wKQoreworCisJKChCWVRFIEZBUiAqKSBwQWRkcl9wKVswXSA9ICgoQllURSBGQVIgKikgJiBkd0R3b3JkVmFsX3ApWzJdOworCSgoQllURSBGQVIgKikgcEFkZHJfcClbMV0gPSAoKEJZVEUgRkFSICopICYgZHdEd29yZFZhbF9wKVsxXTsKKwkoKEJZVEUgRkFSICopIHBBZGRyX3ApWzJdID0gKChCWVRFIEZBUiAqKSAmIGR3RHdvcmRWYWxfcClbMF07CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgQW1pU2V0RHdvcmQyNFRvTGUoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBzZXRzIGEgMjQgYml0IHZhbHVlIHRvIGEgYnVmZmVyIGluIGxpdHRsZSBlbmRpYW4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgcEFkZHJfcCAgICAgICAgID0gcG9pbnRlciB0byBkZXN0aW5hdGlvbiBidWZmZXIKKy8vICAgICAgICAgICAgICBkd0R3b3JkVmFsX3AgICAgPSB2YWx1ZSB0byBzZXQKKy8vCisvLyBSZXR1cm46ICAgICAgdm9pZAorLy8KKy8vIFN0YXRlOiAgICAgICBub3QgdGVzdGVkCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSU5MSU5FX0ZVTkNUSU9OIHZvaWQgUFVCTElDIEFtaVNldER3b3JkMjRUb0xlKHZvaWQgRkFSICogcEFkZHJfcCwKKwkJCQkJICAgICAgRFdPUkQgZHdEd29yZFZhbF9wKQoreworCisJKChCWVRFIEZBUiAqKSBwQWRkcl9wKVswXSA9ICgoQllURSBGQVIgKikgJiBkd0R3b3JkVmFsX3ApWzBdOworCSgoQllURSBGQVIgKikgcEFkZHJfcClbMV0gPSAoKEJZVEUgRkFSICopICYgZHdEd29yZFZhbF9wKVsxXTsKKwkoKEJZVEUgRkFSICopIHBBZGRyX3ApWzJdID0gKChCWVRFIEZBUiAqKSAmIGR3RHdvcmRWYWxfcClbMl07CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgQW1pR2V0RHdvcmQyNEZyb21CZSgpCisvLworLy8gRGVzY3JpcHRpb246IHJlYWRzIGEgMjQgYml0IHZhbHVlIGZyb20gYSBidWZmZXIgaW4gYmlnIGVuZGlhbgorLy8KKy8vIFBhcmFtZXRlcnM6ICBwQWRkcl9wICAgICAgICAgPSBwb2ludGVyIHRvIHNvdXJjZSBidWZmZXIKKy8vCisvLyBSZXR1cm46ICAgICAgRFdPUkQgICAgICAgICAgID0gcmVhZCB2YWx1ZQorLy8KKy8vIFN0YXRlOiAgICAgICBub3QgdGVzdGVkCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSU5MSU5FX0ZVTkNUSU9OIERXT1JEIFBVQkxJQyBBbWlHZXREd29yZDI0RnJvbUJlKHZvaWQgRkFSICogcEFkZHJfcCkKK3sKKworCXRkd1N0cnVjdCBkd1N0cnVjdDsKKworCWR3U3RydWN0Lm1fZHdEd29yZCA9IEFtaUdldER3b3JkRnJvbUJlKHBBZGRyX3ApOworCWR3U3RydWN0Lm1fZHdEd29yZCA+Pj0gODsKKworCXJldHVybiAoZHdTdHJ1Y3QubV9kd0R3b3JkKTsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBBbWlHZXREd29yZDI0RnJvbUxlKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogcmVhZHMgYSAyNCBiaXQgdmFsdWUgZnJvbSBhIGJ1ZmZlciBpbiBsaXR0bGUgZW5kaWFuCisvLworLy8gUGFyYW1ldGVyczogIHBBZGRyX3AgICAgICAgICA9IHBvaW50ZXIgdG8gc291cmNlIGJ1ZmZlcgorLy8KKy8vIFJldHVybjogICAgICBEV09SRCAgICAgICAgICAgPSByZWFkIHZhbHVlCisvLworLy8gU3RhdGU6ICAgICAgIG5vdCB0ZXN0ZWQKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJTkxJTkVfRlVOQ1RJT04gRFdPUkQgUFVCTElDIEFtaUdldER3b3JkMjRGcm9tTGUodm9pZCBGQVIgKiBwQWRkcl9wKQoreworCisJdGR3U3RydWN0IGR3U3RydWN0OworCisJZHdTdHJ1Y3QubV9kd0R3b3JkID0gQW1pR2V0RHdvcmRGcm9tTGUocEFkZHJfcCk7CisJZHdTdHJ1Y3QubV9kd0R3b3JkICY9IDB4MDBGRkZGRkY7CisKKwlyZXR1cm4gKGR3U3RydWN0Lm1fZHdEd29yZCk7CisKK30KKworLy8jaWZkZWYgVVNFX1ZBUjY0CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEFtaVNldFF3b3JkNjRUb0JlKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogc2V0cyBhIDY0IGJpdCB2YWx1ZSB0byBhIGJ1ZmZlciBpbiBiaWcgZW5kaWFuCisvLworLy8gUGFyYW1ldGVyczogIHBBZGRyX3AgICAgICAgICA9IHBvaW50ZXIgdG8gZGVzdGluYXRpb24gYnVmZmVyCisvLyAgICAgICAgICAgICAgcXdRd29yZFZhbF9wICAgID0gcXVhZHJ1cGxlIHdvcmQgdmFsdWUKKy8vCisvLyBSZXR1cm46ICAgICAgdm9pZAorLy8KKy8vIFN0YXRlOiAgICAgICBub3QgdGVzdGVkCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSU5MSU5FX0ZVTkNUSU9OIHZvaWQgUFVCTElDIEFtaVNldFF3b3JkNjRUb0JlKHZvaWQgRkFSICogcEFkZHJfcCwKKwkJCQkJICAgICAgUVdPUkQgcXdRd29yZFZhbF9wKQoreworCisJKChCWVRFIEZBUiAqKSBwQWRkcl9wKVswXSA9ICgoQllURSBGQVIgKikgJiBxd1F3b3JkVmFsX3ApWzddOworCSgoQllURSBGQVIgKikgcEFkZHJfcClbMV0gPSAoKEJZVEUgRkFSICopICYgcXdRd29yZFZhbF9wKVs2XTsKKwkoKEJZVEUgRkFSICopIHBBZGRyX3ApWzJdID0gKChCWVRFIEZBUiAqKSAmIHF3UXdvcmRWYWxfcClbNV07CisJKChCWVRFIEZBUiAqKSBwQWRkcl9wKVszXSA9ICgoQllURSBGQVIgKikgJiBxd1F3b3JkVmFsX3ApWzRdOworCSgoQllURSBGQVIgKikgcEFkZHJfcClbNF0gPSAoKEJZVEUgRkFSICopICYgcXdRd29yZFZhbF9wKVszXTsKKwkoKEJZVEUgRkFSICopIHBBZGRyX3ApWzVdID0gKChCWVRFIEZBUiAqKSAmIHF3UXdvcmRWYWxfcClbMl07CisJKChCWVRFIEZBUiAqKSBwQWRkcl9wKVs2XSA9ICgoQllURSBGQVIgKikgJiBxd1F3b3JkVmFsX3ApWzFdOworCSgoQllURSBGQVIgKikgcEFkZHJfcClbN10gPSAoKEJZVEUgRkFSICopICYgcXdRd29yZFZhbF9wKVswXTsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBBbWlTZXRRd29yZDY0VG9MZSgpCisvLworLy8gRGVzY3JpcHRpb246IHNldHMgYSA2NCBiaXQgdmFsdWUgdG8gYSBidWZmZXIgaW4gbGl0dGxlIGVuZGlhbgorLy8KKy8vIFBhcmFtZXRlcnM6ICBwQWRkcl9wICAgICAgICAgPSBwb2ludGVyIHRvIGRlc3RpbmF0aW9uIGJ1ZmZlcgorLy8gICAgICAgICAgICAgIHF3UXdvcmRWYWxfcCAgICA9IHF1YWRydXBsZSB3b3JkIHZhbHVlCisvLworLy8gUmV0dXJuOiAgICAgIHZvaWQKKy8vCisvLyBTdGF0ZTogICAgICAgbm90IHRlc3RlZAorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lOTElORV9GVU5DVElPTiB2b2lkIFBVQkxJQyBBbWlTZXRRd29yZDY0VG9MZSh2b2lkIEZBUiAqIHBBZGRyX3AsCisJCQkJCSAgICAgIFFXT1JEIHF3UXdvcmRWYWxfcCkKK3sKKworCVFXT1JEIEZBUiAqcHF3RHN0OworCisJcHF3RHN0ID0gKFFXT1JEIEZBUiAqKSBwQWRkcl9wOworCSpwcXdEc3QgPSBxd1F3b3JkVmFsX3A7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgQW1pR2V0UXdvcmQ2NEZyb21CZSgpCisvLworLy8gRGVzY3JpcHRpb246IHJlYWRzIGEgNjQgYml0IHZhbHVlIGZyb20gYSBidWZmZXIgaW4gYmlnIGVuZGlhbgorLy8KKy8vIFBhcmFtZXRlcnM6ICBwQWRkcl9wICAgICAgICAgPSBwb2ludGVyIHRvIHNvdXJjZSBidWZmZXIKKy8vCisvLyBSZXR1cm46ICAgICAgdm9pZAorLy8KKy8vIFN0YXRlOiAgICAgICBub3QgdGVzdGVkCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSU5MSU5FX0ZVTkNUSU9OIFFXT1JEIFBVQkxJQyBBbWlHZXRRd29yZDY0RnJvbUJlKHZvaWQgRkFSICogcEFkZHJfcCkKK3sKKworCXRxd1N0cnVjdCBxd1N0cnVjdDsKKworCSgoQllURSBGQVIgKikgJiBxd1N0cnVjdC5tX3F3UXdvcmQpWzBdID0gKChCWVRFIEZBUiAqKSBwQWRkcl9wKVs3XTsKKwkoKEJZVEUgRkFSICopICYgcXdTdHJ1Y3QubV9xd1F3b3JkKVsxXSA9ICgoQllURSBGQVIgKikgcEFkZHJfcClbNl07CisJKChCWVRFIEZBUiAqKSAmIHF3U3RydWN0Lm1fcXdRd29yZClbMl0gPSAoKEJZVEUgRkFSICopIHBBZGRyX3ApWzVdOworCSgoQllURSBGQVIgKikgJiBxd1N0cnVjdC5tX3F3UXdvcmQpWzNdID0gKChCWVRFIEZBUiAqKSBwQWRkcl9wKVs0XTsKKwkoKEJZVEUgRkFSICopICYgcXdTdHJ1Y3QubV9xd1F3b3JkKVs0XSA9ICgoQllURSBGQVIgKikgcEFkZHJfcClbM107CisJKChCWVRFIEZBUiAqKSAmIHF3U3RydWN0Lm1fcXdRd29yZClbNV0gPSAoKEJZVEUgRkFSICopIHBBZGRyX3ApWzJdOworCSgoQllURSBGQVIgKikgJiBxd1N0cnVjdC5tX3F3UXdvcmQpWzZdID0gKChCWVRFIEZBUiAqKSBwQWRkcl9wKVsxXTsKKwkoKEJZVEUgRkFSICopICYgcXdTdHJ1Y3QubV9xd1F3b3JkKVs3XSA9ICgoQllURSBGQVIgKikgcEFkZHJfcClbMF07CisKKwlyZXR1cm4gKHF3U3RydWN0Lm1fcXdRd29yZCk7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgQW1pR2V0UXdvcmQ2NEZyb21MZSgpCisvLworLy8gRGVzY3JpcHRpb246IHJlYWRzIGEgNjQgYml0IHZhbHVlIGZyb20gYSBidWZmZXIgaW4gbGl0dGxlIGVuZGlhbgorLy8KKy8vIFBhcmFtZXRlcnM6ICBwQWRkcl9wICAgICAgICAgPSBwb2ludGVyIHRvIHNvdXJjZSBidWZmZXIKKy8vCisvLyBSZXR1cm46ICAgICAgdm9pZAorLy8KKy8vIFN0YXRlOiAgICAgICBub3QgdGVzdGVkCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSU5MSU5FX0ZVTkNUSU9OIFFXT1JEIFBVQkxJQyBBbWlHZXRRd29yZDY0RnJvbUxlKHZvaWQgRkFSICogcEFkZHJfcCkKK3sKKworCXRxd1N0cnVjdCBGQVIgKnBxd1N0cnVjdDsKKwl0cXdTdHJ1Y3QgcXdTdHJ1Y3Q7CisKKwlwcXdTdHJ1Y3QgPSAodHF3U3RydWN0IEZBUiAqKSBwQWRkcl9wOworCXF3U3RydWN0Lm1fcXdRd29yZCA9IHBxd1N0cnVjdC0+bV9xd1F3b3JkOworCisJcmV0dXJuIChxd1N0cnVjdC5tX3F3UXdvcmQpOworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEFtaVNldFF3b3JkNDBUb0JlKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogc2V0cyBhIDQwIGJpdCB2YWx1ZSB0byBhIGJ1ZmZlciBpbiBiaWcgZW5kaWFuCisvLworLy8gUGFyYW1ldGVyczogIHBBZGRyX3AgICAgICAgICA9IHBvaW50ZXIgdG8gZGVzdGluYXRpb24gYnVmZmVyCisvLyAgICAgICAgICAgICAgcXdRd29yZFZhbF9wICAgID0gcXVhZHJ1cGxlIHdvcmQgdmFsdWUKKy8vCisvLyBSZXR1cm46ICAgICAgdm9pZAorLy8KKy8vIFN0YXRlOiAgICAgICBub3QgdGVzdGVkCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSU5MSU5FX0ZVTkNUSU9OIHZvaWQgUFVCTElDIEFtaVNldFF3b3JkNDBUb0JlKHZvaWQgRkFSICogcEFkZHJfcCwKKwkJCQkJICAgICAgUVdPUkQgcXdRd29yZFZhbF9wKQoreworCisJKChCWVRFIEZBUiAqKSBwQWRkcl9wKVswXSA9ICgoQllURSBGQVIgKikgJiBxd1F3b3JkVmFsX3ApWzRdOworCSgoQllURSBGQVIgKikgcEFkZHJfcClbMV0gPSAoKEJZVEUgRkFSICopICYgcXdRd29yZFZhbF9wKVszXTsKKwkoKEJZVEUgRkFSICopIHBBZGRyX3ApWzJdID0gKChCWVRFIEZBUiAqKSAmIHF3UXdvcmRWYWxfcClbMl07CisJKChCWVRFIEZBUiAqKSBwQWRkcl9wKVszXSA9ICgoQllURSBGQVIgKikgJiBxd1F3b3JkVmFsX3ApWzFdOworCSgoQllURSBGQVIgKikgcEFkZHJfcClbNF0gPSAoKEJZVEUgRkFSICopICYgcXdRd29yZFZhbF9wKVswXTsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBBbWlTZXRRd29yZDQwVG9MZSgpCisvLworLy8gRGVzY3JpcHRpb246IHNldHMgYSA0MCBiaXQgdmFsdWUgdG8gYSBidWZmZXIgaW4gbGl0dGxlIGVuZGlhbgorLy8KKy8vIFBhcmFtZXRlcnM6ICBwQWRkcl9wICAgICAgICAgPSBwb2ludGVyIHRvIGRlc3RpbmF0aW9uIGJ1ZmZlcgorLy8gICAgICAgICAgICAgIHF3UXdvcmRWYWxfcCAgICA9IHF1YWRydXBsZSB3b3JkIHZhbHVlCisvLworLy8gUmV0dXJuOiAgICAgIHZvaWQKKy8vCisvLyBTdGF0ZTogICAgICAgbm90IHRlc3RlZAorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lOTElORV9GVU5DVElPTiB2b2lkIFBVQkxJQyBBbWlTZXRRd29yZDQwVG9MZSh2b2lkIEZBUiAqIHBBZGRyX3AsCisJCQkJCSAgICAgIFFXT1JEIHF3UXdvcmRWYWxfcCkKK3sKKworCSgoRFdPUkQgRkFSICopIHBBZGRyX3ApWzBdID0gKChEV09SRCBGQVIgKikgJiBxd1F3b3JkVmFsX3ApWzBdOworCSgoQllURSBGQVIgKikgcEFkZHJfcClbNF0gPSAoKEJZVEUgRkFSICopICYgcXdRd29yZFZhbF9wKVs0XTsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBBbWlHZXRRd29yZDQwRnJvbUJlKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogcmVhZHMgYSA0MCBiaXQgdmFsdWUgZnJvbSBhIGJ1ZmZlciBpbiBiaWcgZW5kaWFuCisvLworLy8gUGFyYW1ldGVyczogIHBBZGRyX3AgICAgICAgICA9IHBvaW50ZXIgdG8gc291cmNlIGJ1ZmZlcgorLy8KKy8vIFJldHVybjogICAgICBRV09SRAorLy8KKy8vIFN0YXRlOiAgICAgICBub3QgdGVzdGVkCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSU5MSU5FX0ZVTkNUSU9OIFFXT1JEIFBVQkxJQyBBbWlHZXRRd29yZDQwRnJvbUJlKHZvaWQgRkFSICogcEFkZHJfcCkKK3sKKworCXRxd1N0cnVjdCBxd1N0cnVjdDsKKworCXF3U3RydWN0Lm1fcXdRd29yZCA9IEFtaUdldFF3b3JkNjRGcm9tQmUocEFkZHJfcCk7CisJcXdTdHJ1Y3QubV9xd1F3b3JkID4+PSAyNDsKKworCXJldHVybiAocXdTdHJ1Y3QubV9xd1F3b3JkKTsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBBbWlHZXRRd29yZDQwRnJvbUxlKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogcmVhZHMgYSA0MCBiaXQgdmFsdWUgZnJvbSBhIGJ1ZmZlciBpbiBsaXR0bGUgZW5kaWFuCisvLworLy8gUGFyYW1ldGVyczogIHBBZGRyX3AgICAgICAgICA9IHBvaW50ZXIgdG8gc291cmNlIGJ1ZmZlcgorLy8KKy8vIFJldHVybjogICAgICBRV09SRAorLy8KKy8vIFN0YXRlOiAgICAgICBub3QgdGVzdGVkCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSU5MSU5FX0ZVTkNUSU9OIFFXT1JEIFBVQkxJQyBBbWlHZXRRd29yZDQwRnJvbUxlKHZvaWQgRkFSICogcEFkZHJfcCkKK3sKKworCXRxd1N0cnVjdCBxd1N0cnVjdDsKKworCXF3U3RydWN0Lm1fcXdRd29yZCA9IEFtaUdldFF3b3JkNjRGcm9tTGUocEFkZHJfcCk7CisJcXdTdHJ1Y3QubV9xd1F3b3JkICY9IDB4MDAwMDAwRkZGRkZGRkZGRkxMOworCisJcmV0dXJuIChxd1N0cnVjdC5tX3F3UXdvcmQpOworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEFtaVNldFF3b3JkNDhUb0JlKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogc2V0cyBhIDQ4IGJpdCB2YWx1ZSB0byBhIGJ1ZmZlciBpbiBiaWcgZW5kaWFuCisvLworLy8gUGFyYW1ldGVyczogIHBBZGRyX3AgICAgICAgICA9IHBvaW50ZXIgdG8gZGVzdGluYXRpb24gYnVmZmVyCisvLyAgICAgICAgICAgICAgcXdRd29yZFZhbF9wICAgID0gcXVhZHJ1cGxlIHdvcmQgdmFsdWUKKy8vCisvLyBSZXR1cm46ICAgICAgdm9pZAorLy8KKy8vIFN0YXRlOiAgICAgICBub3QgdGVzdGVkCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSU5MSU5FX0ZVTkNUSU9OIHZvaWQgUFVCTElDIEFtaVNldFF3b3JkNDhUb0JlKHZvaWQgRkFSICogcEFkZHJfcCwKKwkJCQkJICAgICAgUVdPUkQgcXdRd29yZFZhbF9wKQoreworCisJKChCWVRFIEZBUiAqKSBwQWRkcl9wKVswXSA9ICgoQllURSBGQVIgKikgJiBxd1F3b3JkVmFsX3ApWzVdOworCSgoQllURSBGQVIgKikgcEFkZHJfcClbMV0gPSAoKEJZVEUgRkFSICopICYgcXdRd29yZFZhbF9wKVs0XTsKKwkoKEJZVEUgRkFSICopIHBBZGRyX3ApWzJdID0gKChCWVRFIEZBUiAqKSAmIHF3UXdvcmRWYWxfcClbM107CisJKChCWVRFIEZBUiAqKSBwQWRkcl9wKVszXSA9ICgoQllURSBGQVIgKikgJiBxd1F3b3JkVmFsX3ApWzJdOworCSgoQllURSBGQVIgKikgcEFkZHJfcClbNF0gPSAoKEJZVEUgRkFSICopICYgcXdRd29yZFZhbF9wKVsxXTsKKwkoKEJZVEUgRkFSICopIHBBZGRyX3ApWzVdID0gKChCWVRFIEZBUiAqKSAmIHF3UXdvcmRWYWxfcClbMF07CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgQW1pU2V0UXdvcmQ0OFRvTGUoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBzZXRzIGEgNDggYml0IHZhbHVlIHRvIGEgYnVmZmVyIGluIGxpdHRsZSBlbmRpYW4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgcEFkZHJfcCAgICAgICAgID0gcG9pbnRlciB0byBkZXN0aW5hdGlvbiBidWZmZXIKKy8vICAgICAgICAgICAgICBxd1F3b3JkVmFsX3AgICAgPSBxdWFkcnVwbGUgd29yZCB2YWx1ZQorLy8KKy8vIFJldHVybjogICAgICB2b2lkCisvLworLy8gU3RhdGU6ICAgICAgIG5vdCB0ZXN0ZWQKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJTkxJTkVfRlVOQ1RJT04gdm9pZCBQVUJMSUMgQW1pU2V0UXdvcmQ0OFRvTGUodm9pZCBGQVIgKiBwQWRkcl9wLAorCQkJCQkgICAgICBRV09SRCBxd1F3b3JkVmFsX3ApCit7CisKKwkoKERXT1JEIEZBUiAqKSBwQWRkcl9wKVswXSA9ICgoRFdPUkQgRkFSICopICYgcXdRd29yZFZhbF9wKVswXTsKKwkoKFdPUkQgRkFSICopIHBBZGRyX3ApWzJdID0gKChXT1JEIEZBUiAqKSAmIHF3UXdvcmRWYWxfcClbMl07CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgQW1pR2V0UXdvcmQ0OEZyb21CZSgpCisvLworLy8gRGVzY3JpcHRpb246IHJlYWRzIGEgNDggYml0IHZhbHVlIGZyb20gYSBidWZmZXIgaW4gYmlnIGVuZGlhbgorLy8KKy8vIFBhcmFtZXRlcnM6ICBwQWRkcl9wICAgICAgICAgPSBwb2ludGVyIHRvIHNvdXJjZSBidWZmZXIKKy8vCisvLyBSZXR1cm46ICAgICAgUVdPUkQKKy8vCisvLyBTdGF0ZTogICAgICAgbm90IHRlc3RlZAorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lOTElORV9GVU5DVElPTiBRV09SRCBQVUJMSUMgQW1pR2V0UXdvcmQ0OEZyb21CZSh2b2lkIEZBUiAqIHBBZGRyX3ApCit7CisKKwl0cXdTdHJ1Y3QgcXdTdHJ1Y3Q7CisKKwlxd1N0cnVjdC5tX3F3UXdvcmQgPSBBbWlHZXRRd29yZDY0RnJvbUJlKHBBZGRyX3ApOworCXF3U3RydWN0Lm1fcXdRd29yZCA+Pj0gMTY7CisKKwlyZXR1cm4gKHF3U3RydWN0Lm1fcXdRd29yZCk7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgQW1pR2V0UXdvcmQ0OEZyb21MZSgpCisvLworLy8gRGVzY3JpcHRpb246IHJlYWRzIGEgNDggYml0IHZhbHVlIGZyb20gYSBidWZmZXIgaW4gbGl0dGxlIGVuZGlhbgorLy8KKy8vIFBhcmFtZXRlcnM6ICBwQWRkcl9wICAgICAgICAgPSBwb2ludGVyIHRvIHNvdXJjZSBidWZmZXIKKy8vCisvLyBSZXR1cm46ICAgICAgUVdPUkQKKy8vCisvLyBTdGF0ZTogICAgICAgbm90IHRlc3RlZAorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lOTElORV9GVU5DVElPTiBRV09SRCBQVUJMSUMgQW1pR2V0UXdvcmQ0OEZyb21MZSh2b2lkIEZBUiAqIHBBZGRyX3ApCit7CisKKwl0cXdTdHJ1Y3QgcXdTdHJ1Y3Q7CisKKwlxd1N0cnVjdC5tX3F3UXdvcmQgPSBBbWlHZXRRd29yZDY0RnJvbUxlKHBBZGRyX3ApOworCXF3U3RydWN0Lm1fcXdRd29yZCAmPSAweDAwMDBGRkZGRkZGRkZGRkZMTDsKKworCXJldHVybiAocXdTdHJ1Y3QubV9xd1F3b3JkKTsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBBbWlTZXRRd29yZDU2VG9CZSgpCisvLworLy8gRGVzY3JpcHRpb246IHNldHMgYSA1NiBiaXQgdmFsdWUgdG8gYSBidWZmZXIgaW4gYmlnIGVuZGlhbgorLy8KKy8vIFBhcmFtZXRlcnM6ICBwQWRkcl9wICAgICAgICAgPSBwb2ludGVyIHRvIGRlc3RpbmF0aW9uIGJ1ZmZlcgorLy8gICAgICAgICAgICAgIHF3UXdvcmRWYWxfcCAgICA9IHF1YWRydXBsZSB3b3JkIHZhbHVlCisvLworLy8gUmV0dXJuOiAgICAgIHZvaWQKKy8vCisvLyBTdGF0ZTogICAgICAgbm90IHRlc3RlZAorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lOTElORV9GVU5DVElPTiB2b2lkIFBVQkxJQyBBbWlTZXRRd29yZDU2VG9CZSh2b2lkIEZBUiAqIHBBZGRyX3AsCisJCQkJCSAgICAgIFFXT1JEIHF3UXdvcmRWYWxfcCkKK3sKKworCSgoQllURSBGQVIgKikgcEFkZHJfcClbMF0gPSAoKEJZVEUgRkFSICopICYgcXdRd29yZFZhbF9wKVs2XTsKKwkoKEJZVEUgRkFSICopIHBBZGRyX3ApWzFdID0gKChCWVRFIEZBUiAqKSAmIHF3UXdvcmRWYWxfcClbNV07CisJKChCWVRFIEZBUiAqKSBwQWRkcl9wKVsyXSA9ICgoQllURSBGQVIgKikgJiBxd1F3b3JkVmFsX3ApWzRdOworCSgoQllURSBGQVIgKikgcEFkZHJfcClbM10gPSAoKEJZVEUgRkFSICopICYgcXdRd29yZFZhbF9wKVszXTsKKwkoKEJZVEUgRkFSICopIHBBZGRyX3ApWzRdID0gKChCWVRFIEZBUiAqKSAmIHF3UXdvcmRWYWxfcClbMl07CisJKChCWVRFIEZBUiAqKSBwQWRkcl9wKVs1XSA9ICgoQllURSBGQVIgKikgJiBxd1F3b3JkVmFsX3ApWzFdOworCSgoQllURSBGQVIgKikgcEFkZHJfcClbNl0gPSAoKEJZVEUgRkFSICopICYgcXdRd29yZFZhbF9wKVswXTsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBBbWlTZXRRd29yZDU2VG9MZSgpCisvLworLy8gRGVzY3JpcHRpb246IHNldHMgYSA1NiBiaXQgdmFsdWUgdG8gYSBidWZmZXIgaW4gbGl0dGxlIGVuZGlhbgorLy8KKy8vIFBhcmFtZXRlcnM6ICBwQWRkcl9wICAgICAgICAgPSBwb2ludGVyIHRvIGRlc3RpbmF0aW9uIGJ1ZmZlcgorLy8gICAgICAgICAgICAgIHF3UXdvcmRWYWxfcCAgICA9IHF1YWRydXBsZSB3b3JkIHZhbHVlCisvLworLy8gUmV0dXJuOiAgICAgIHZvaWQKKy8vCisvLyBTdGF0ZTogICAgICAgbm90IHRlc3RlZAorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lOTElORV9GVU5DVElPTiB2b2lkIFBVQkxJQyBBbWlTZXRRd29yZDU2VG9MZSh2b2lkIEZBUiAqIHBBZGRyX3AsCisJCQkJCSAgICAgIFFXT1JEIHF3UXdvcmRWYWxfcCkKK3sKKworCSgoRFdPUkQgRkFSICopIHBBZGRyX3ApWzBdID0gKChEV09SRCBGQVIgKikgJiBxd1F3b3JkVmFsX3ApWzBdOworCSgoV09SRCBGQVIgKikgcEFkZHJfcClbMl0gPSAoKFdPUkQgRkFSICopICYgcXdRd29yZFZhbF9wKVsyXTsKKwkoKEJZVEUgRkFSICopIHBBZGRyX3ApWzZdID0gKChCWVRFIEZBUiAqKSAmIHF3UXdvcmRWYWxfcClbNl07CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgQW1pR2V0UXdvcmQ1NkZyb21CZSgpCisvLworLy8gRGVzY3JpcHRpb246IHJlYWRzIGEgNTYgYml0IHZhbHVlIGZyb20gYSBidWZmZXIgaW4gYmlnIGVuZGlhbgorLy8KKy8vIFBhcmFtZXRlcnM6ICBwQWRkcl9wICAgICAgICAgPSBwb2ludGVyIHRvIHNvdXJjZSBidWZmZXIKKy8vCisvLyBSZXR1cm46ICAgICAgUVdPUkQKKy8vCisvLyBTdGF0ZTogICAgICAgbm90IHRlc3RlZAorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lOTElORV9GVU5DVElPTiBRV09SRCBQVUJMSUMgQW1pR2V0UXdvcmQ1NkZyb21CZSh2b2lkIEZBUiAqIHBBZGRyX3ApCit7CisKKwl0cXdTdHJ1Y3QgcXdTdHJ1Y3Q7CisKKwlxd1N0cnVjdC5tX3F3UXdvcmQgPSBBbWlHZXRRd29yZDY0RnJvbUJlKHBBZGRyX3ApOworCXF3U3RydWN0Lm1fcXdRd29yZCA+Pj0gODsKKworCXJldHVybiAocXdTdHJ1Y3QubV9xd1F3b3JkKTsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBBbWlHZXRRd29yZDU2RnJvbUxlKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogcmVhZHMgYSA1NiBiaXQgdmFsdWUgZnJvbSBhIGJ1ZmZlciBpbiBsaXR0bGUgZW5kaWFuCisvLworLy8gUGFyYW1ldGVyczogIHBBZGRyX3AgICAgICAgICA9IHBvaW50ZXIgdG8gc291cmNlIGJ1ZmZlcgorLy8KKy8vIFJldHVybjogICAgICBRV09SRAorLy8KKy8vIFN0YXRlOiAgICAgICBub3QgdGVzdGVkCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSU5MSU5FX0ZVTkNUSU9OIFFXT1JEIFBVQkxJQyBBbWlHZXRRd29yZDU2RnJvbUxlKHZvaWQgRkFSICogcEFkZHJfcCkKK3sKKworCXRxd1N0cnVjdCBxd1N0cnVjdDsKKworCXF3U3RydWN0Lm1fcXdRd29yZCA9IEFtaUdldFF3b3JkNjRGcm9tTGUocEFkZHJfcCk7CisJcXdTdHJ1Y3QubV9xd1F3b3JkICY9IDB4MDBGRkZGRkZGRkZGRkZGRkxMOworCisJcmV0dXJuIChxd1N0cnVjdC5tX3F3UXdvcmQpOworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEFtaVNldFRpbWVPZkRheSgpCisvLworLy8gRGVzY3JpcHRpb246IHNldHMgYSBUSU1FX09GX0RBWSAoQ0FOb3BlbikgdmFsdWUgdG8gYSBidWZmZXIKKy8vCisvLyBQYXJhbWV0ZXJzOiAgcEFkZHJfcCAgICAgICAgID0gcG9pbnRlciB0byBkZXN0aW5hdGlvbiBidWZmZXIKKy8vICAgICAgICAgICAgICBwVGltZU9mRGF5X3AgICAgPSBwb2ludGVyIHRvIHN0cnVjdCBUSU1FX09GX0RBWQorLy8KKy8vIFJldHVybjogICAgICB2b2lkCisvLworLy8gU3RhdGU6ICAgICAgIG5vdCB0ZXN0ZWQKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJTkxJTkVfRlVOQ1RJT04gdm9pZCBQVUJMSUMgQW1pU2V0VGltZU9mRGF5KHZvaWQgRkFSICogcEFkZHJfcCwKKwkJCQkJICAgIHRUaW1lT2ZEYXkgRkFSICogcFRpbWVPZkRheV9wKQoreworCisJQW1pU2V0RHdvcmRUb0xlKCgoQllURSBGQVIgKikgcEFkZHJfcCksCisJCQlwVGltZU9mRGF5X3AtPm1fZHdNcyAmIDB4MEZGRkZGRkYpOworCUFtaVNldFdvcmRUb0xlKCgoQllURSBGQVIgKikgcEFkZHJfcCkgKyA0LCBwVGltZU9mRGF5X3AtPm1fd0RheXMpOworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEFtaUdldFRpbWVPZkRheSgpCisvLworLy8gRGVzY3JpcHRpb246IHJlYWRzIGEgVElNRV9PRl9EQVkgKENBTm9wZW4pIHZhbHVlIGZyb20gYSBidWZmZXIKKy8vCisvLyBQYXJhbWV0ZXJzOiAgcEFkZHJfcCAgICAgICAgID0gcG9pbnRlciB0byBzb3VyY2UgYnVmZmVyCisvLyAgICAgICAgICAgICAgcFRpbWVPZkRheV9wICAgID0gcG9pbnRlciB0byBzdHJ1Y3QgVElNRV9PRl9EQVkKKy8vCisvLyBSZXR1cm46ICAgICAgdm9pZAorLy8KKy8vIFN0YXRlOiAgICAgICBub3QgdGVzdGVkCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSU5MSU5FX0ZVTkNUSU9OIHZvaWQgUFVCTElDIEFtaUdldFRpbWVPZkRheSh2b2lkIEZBUiAqIHBBZGRyX3AsCisJCQkJCSAgICB0VGltZU9mRGF5IEZBUiAqIHBUaW1lT2ZEYXlfcCkKK3sKKworCXBUaW1lT2ZEYXlfcC0+bV9kd01zID0KKwkgICAgQW1pR2V0RHdvcmRGcm9tTGUoKChCWVRFIEZBUiAqKSBwQWRkcl9wKSkgJiAweDBGRkZGRkZGOworCXBUaW1lT2ZEYXlfcC0+bV93RGF5cyA9IEFtaUdldFdvcmRGcm9tTGUoKChCWVRFIEZBUiAqKSBwQWRkcl9wKSArIDQpOworCit9CisKKyNlbmRpZgorCisvLyBFT0YKKworLy8gRGllIGxldHp0ZSBaZWlsZSBtdd8gdW5iZWRpbmd0IGVpbmUgbGVlcmUgWmVpbGUgc2Vpbiwgd2VpbCBtYW5jaGUgQ29tcGlsZXIKKy8vIGRhbWl0IGVpbiBQcm9ibGVtIGhhYmVuLCB3ZW5uIGRhcyBuaWNodCBzbyBpc3QgKHouQi4gR05VIG9kZXIgQm9ybGFuZCBDKysgQnVpbGRlcikuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL2RlbW9fbWFpbi5jIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9kZW1vX21haW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjNmYTA0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9kZW1vX21haW4uYwpAQCAtMCwwICsxLDk2MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIGRlbW9hcHBsaWNhdGlvbiBmb3IgRVBMIE1OICh3aXRoIFNETyBvdmVyIFVEUCkKKyAgICAgICAgICAgICAgICB1bmRlciBMaW51eCBvbiBYODYgd2l0aCBSVEw4MTM5IEV0aGVybmV0IGNvbnRyb2xsZXIKKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgICAgICAgICRSQ1NmaWxlOiBkZW1vX21haW4uYyx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuMTAgJCAgJERhdGU6IDIwMDgvMTEvMTkgMTg6MTE6NDMgJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgR0NDCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwNi8wOS8wMSBkLmsuOiAgIHN0YXJ0IG9mIGltcGxlbWVudGF0aW9uCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2ttb2QuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorCisjaW5jbHVkZSAiRXBsLmgiCisjaW5jbHVkZSAicHJvY19mcy5oIgorCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwwKQorICAgIC8vIHJlbW92ZSAoIm1ha2UgaW52aXNpYmxlIikgb2Jzb2xldGUgc3ltYm9scyBmb3Iga2VybmVsIHZlcnNpb25zIDIuNgorICAgIC8vIGFuZCBoaWdoZXIKKyNkZWZpbmUgTU9EX0lOQ19VU0VfQ09VTlQKKyNkZWZpbmUgTU9EX0RFQ19VU0VfQ09VTlQKKyNkZWZpbmUgRVhQT1JUX05PX1NZTUJPTFMKKyNlbHNlCisjZXJyb3IgIlRoaXMgZHJpdmVyIG5lZWRzIGEgMi42Lngga2VybmVsIG9yIGhpZ2hlciIKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICBHIEwgTyBCIEEgTCAgIEQgRSBGIEkgTiBJIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLyBNZXRhaW5mb3JtYXRpb24KK01PRFVMRV9MSUNFTlNFKCJEdWFsIEJTRC9HUEwiKTsKKyNpZmRlZiBNT0RVTEVfQVVUSE9SCitNT0RVTEVfQVVUSE9SKCJEYW5pZWwuS3J1ZWdlckBTWVNURUMtZWxlY3Ryb25pYy5jb20iKTsKK01PRFVMRV9ERVNDUklQVElPTigiRVBMIE1OIGRlbW8iKTsKKyNlbmRpZgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gVHJhY2VQb2ludCBzdXBwb3J0IGZvciByZWFsdGltZS1kZWJ1Z2dpbmcKKyNpZmRlZiBfREJHX1RSQUNFX1BPSU5UU18KK3ZvaWQgUFVCTElDIFRndERiZ1NpZ25hbFRyYWNlUG9pbnQoQllURSBiVHJhY2VQb2ludE51bWJlcl9wKTsKKyNkZWZpbmUgVEdUX0RCR19TSUdOQUxfVFJBQ0VfUE9JTlQocCkgICBUZ3REYmdTaWduYWxUcmFjZVBvaW50KHApCisjZWxzZQorI2RlZmluZSBUR1RfREJHX1NJR05BTF9UUkFDRV9QT0lOVChwKQorI2VuZGlmCisKKyNkZWZpbmUgTk9ERUlEICAgICAgMHhGMAkvLz0+IE1OCisjZGVmaW5lIENZQ0xFX0xFTiAgIDUwMDAJLy8gW3VzXQorI2RlZmluZSBJUF9BRERSICAgICAweGMwYTg2NDAxCS8vIDE5Mi4xNjguMTAwLjEKKyNkZWZpbmUgU1VCTkVUX01BU0sgMHhGRkZGRkYwMAkvLyAyNTUuMjU1LjI1NS4wCisjZGVmaW5lIEhPU1ROQU1FICAgICJTWVMgVEVDIGVsZWN0cm9uaWMgRVBMIFN0YWNrICAgICIKKyNkZWZpbmUgSUZfRVRIICAgICAgRVBMX1ZFVEhfTkFNRQorCisvLyBMSUdIVCBFRkZFQ1QKKyNkZWZpbmUgREVGQVVMVF9NQVhfQ1lDTEVfQ09VTlQgMjAJLy8gNiBpcyB2ZXJ5IGZhc3QKKyNkZWZpbmUgQVBQX0RFRkFVTFRfTU9ERSAgICAgICAgMHgwMQorI2RlZmluZSBBUFBfTEVEX0NPVU5UICAgICAgICAgICA1CS8vIG51bWJlciBvZiBMRURzIGluIG9uZSByb3cKKyNkZWZpbmUgQVBQX0xFRF9NQVNLICAgICAgICAgICAgKCgxIDw8IEFQUF9MRURfQ09VTlQpIC0gMSkKKyNkZWZpbmUgQVBQX0RPVUJMRV9MRURfTUFTSyAgICAgKCgxIDw8IChBUFBfTEVEX0NPVU5UICogMikpIC0gMSkKKyNkZWZpbmUgQVBQX01PREVfQ09VTlQgICAgICAgICAgNQorI2RlZmluZSBBUFBfTU9ERV9NQVNLICAgICAgICAgICAoKDEgPDwgQVBQX01PREVfQ09VTlQpIC0gMSkKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvY2FsIHR5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbW9kdWwgZ2xvYmFsZSB2YXJzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitDT05TVCBCWVRFIGFiTWFjQWRkcltdID0geyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwIH07CisKK0JZVEUgYlZhckluMV9sOworQllURSBiVmFyT3V0MV9sOworQllURSBiVmFyT3V0MU9sZF9sOworQllURSBiTW9kZVNlbGVjdF9sOwkJLy8gc3RhdGUgb2YgdGhlIHB1c2hidXR0b25zIHRvIHNlbGVjdCB0aGUgbW9kZQorQllURSBiU3BlZWRTZWxlY3RfbDsJCS8vIHN0YXRlIG9mIHRoZSBwdXNoYnV0dG9ucyB0byBpbmNyZWFzZS9kZWNyZWFzZSB0aGUgc3BlZWQKK0JZVEUgYlNwZWVkU2VsZWN0T2xkX2w7CQkvLyBvbGQgc3RhdGUgb2YgdGhlIHB1c2hidXR0b25zCitEV09SRCBkd0xlZHNfbDsJCQkvLyBjdXJyZW50IHN0YXRlIG9mIGFsbCBMRURzCitCWVRFIGJMZWRzUm93MV9sOwkJLy8gY3VycmVudCBzdGF0ZSBvZiB0aGUgTEVEcyBpbiByb3cgMQorQllURSBiTGVkc1JvdzJfbDsJCS8vIGN1cnJlbnQgc3RhdGUgb2YgdGhlIExFRHMgaW4gcm93IDIKK0JZVEUgYWJTZWxlY3RfbFszXTsJCS8vIHB1c2hidXR0b25zIGZyb20gQ05zCisKK0RXT1JEIGR3TW9kZV9sOwkJCS8vIGN1cnJlbnQgbW9kZQoraW50IGlDdXJDeWNsZUNvdW50X2w7CQkvLyBjdXJyZW50IGN5Y2xlIGNvdW50CitpbnQgaU1heEN5Y2xlQ291bnRfbDsJCS8vIG1heGltdW0gY3ljbGUgY291bnQgKGkuZS4gbnVtYmVyIG9mIGN5Y2xlcyB1bnRpbCBuZXh0IGxpZ2h0IG1vdmVtZW50IHN0ZXApCitpbnQgaVRvZ2dsZTsJCQkvLyBpbmRpY2F0ZXMgdGhlIGxpZ2h0IG1vdmVtZW50IGRpcmVjdGlvbgorCitCWVRFIGFiRG9tYWluX2xbMzAwMF07CisKK3N0YXRpYyB3YWl0X3F1ZXVlX2hlYWRfdCBXYWl0UXVldWVTaHV0ZG93bl9nOwkvLyB3YWl0IHF1ZXVlIGZvciB0RXBsTm10RXZlbnRTd2l0Y2hPZmYKK3N0YXRpYyBhdG9taWNfdCBBdG9taWNTaHV0ZG93bl9nID0gQVRPTUlDX0lOSVQoRkFMU0UpOworCitzdGF0aWMgRFdPUkQgZHdfbGVfQ3ljbGVMZW5fZzsKKworc3RhdGljIHVpbnQgdWlOb2RlSWRfZyA9IEVQTF9DX0FEUl9JTlZBTElEOworbW9kdWxlX3BhcmFtX25hbWVkKG5vZGVpZCwgdWlOb2RlSWRfZywgdWludCwgMCk7CisKK3N0YXRpYyB1aW50IHVpQ3ljbGVMZW5fZyA9IENZQ0xFX0xFTjsKK21vZHVsZV9wYXJhbV9uYW1lZChjeWNsZWxlbiwgdWlDeWNsZUxlbl9nLCB1aW50LCAwKTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIFRoaXMgZnVuY3Rpb24gaXMgdGhlIGVudHJ5IHBvaW50IGZvciB5b3VyIG9iamVjdCBkaWN0aW9uYXJ5LiBJdCBpcyBkZWZpbmVkCisvLyBpbiBPQkpESUNULkMgYnkgZGVmaW5lIEVQTF9PQkRfSU5JVF9SQU1fTkFNRS4gVXNlIHRoaXMgZnVuY3Rpb24gbmFtZSB0byBkZWZpbmUKKy8vIHRoaXMgZnVuY3Rpb24gcHJvdG90eXBlIGhlcmUuIElmIHlvdSB3YW50IHRvIHVzZSBtb3JlIHRoYW4gb25lIEVwbAorLy8gaW5zdGFuY2VzIHRoZW4gdGhlIGZ1bmN0aW9uIG5hbWUgb2YgZWFjaCBvYmplY3QgZGljdGlvbmFyeSBoYXMgdG8gZGlmZmVyLgorCit0RXBsS2VybmVsIFBVQkxJQyBFcGxPYmRJbml0UmFtKHRFcGxPYmRJbml0UGFyYW0gTUVNICogcEluaXRQYXJhbV9wKTsKKwordEVwbEtlcm5lbCBQVUJMSUMgQXBwQ2JFdmVudCh0RXBsQXBpRXZlbnRUeXBlIEV2ZW50VHlwZV9wLAkvLyBJTjogZXZlbnQgdHlwZSAoZW51bSkKKwkJCSAgICAgdEVwbEFwaUV2ZW50QXJnICogcEV2ZW50QXJnX3AsCS8vIElOOiBldmVudCBhcmd1bWVudCAodW5pb24pCisJCQkgICAgIHZvaWQgR0VORVJJQyAqIHBVc2VyQXJnX3ApOworCit0RXBsS2VybmVsIFBVQkxJQyBBcHBDYlN5bmModm9pZCk7CisKK3N0YXRpYyBpbnQgX19pbml0IEVwbExpbkluaXQodm9pZCk7CitzdGF0aWMgdm9pZCBfX2V4aXQgRXBsTGluRXhpdCh2b2lkKTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBLZXJuZWwgTW9kdWxlIHNwZWNpZmljIERhdGEgU3RydWN0dXJlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworRVhQT1JUX05PX1NZTUJPTFM7CisKKy8vbW9kdWxlX2luaXQoRXBsTGluSW5pdCk7CisvL21vZHVsZV9leGl0KEVwbExpbkV4aXQpOworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgIFAgVSBCIEwgSSBDICAgRiBVIE4gQyBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjoKKy8vCisvLyBEZXNjcmlwdGlvbjoKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6CisvLworLy8KKy8vIFJldHVybnM6CisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdGF0aWMgaW50IF9faW5pdCBFcGxMaW5Jbml0KHZvaWQpCit7CisJdEVwbEtlcm5lbCBFcGxSZXQ7CisJaW50IGlSZXQ7CisJc3RhdGljIHRFcGxBcGlJbml0UGFyYW0gRXBsQXBpSW5pdFBhcmFtID0geyAwIH07CisJY2hhciAqc0hvc3RuYW1lID0gSE9TVE5BTUU7CisJY2hhciAqYXJndls0XSwgKmVudnBbM107CisJY2hhciBzQnVmZmVyWzE2XTsKKwl1bnNpZ25lZCBpbnQgdWlWYXJFbnRyaWVzOworCXRFcGxPYmRTaXplIE9iZFNpemU7CisKKwlhdG9taWNfc2V0KCZBdG9taWNTaHV0ZG93bl9nLCBUUlVFKTsKKworCS8vIGdldCBub2RlIElEIGZyb20gaW5zbW9kIGNvbW1hbmQgbGluZQorCUVwbEFwaUluaXRQYXJhbS5tX3VpTm9kZUlkID0gdWlOb2RlSWRfZzsKKworCWlmIChFcGxBcGlJbml0UGFyYW0ubV91aU5vZGVJZCA9PSBFUExfQ19BRFJfSU5WQUxJRCkgewkvLyBpbnZhbGlkIG5vZGUgSUQgc2V0CisJCS8vIHNldCBkZWZhdWx0IG5vZGUgSUQKKwkJRXBsQXBpSW5pdFBhcmFtLm1fdWlOb2RlSWQgPSBOT0RFSUQ7CisJfQorCisJdWlOb2RlSWRfZyA9IEVwbEFwaUluaXRQYXJhbS5tX3VpTm9kZUlkOworCisJLy8gY2FsY3VsYXRlIElQIGFkZHJlc3MKKwlFcGxBcGlJbml0UGFyYW0ubV9kd0lwQWRkcmVzcyA9CisJICAgICgweEZGRkZGRjAwICYgSVBfQUREUikgfCBFcGxBcGlJbml0UGFyYW0ubV91aU5vZGVJZDsKKworCUVwbEFwaUluaXRQYXJhbS5tX2ZBc3luY09ubHkgPSBGQUxTRTsKKworCUVwbEFwaUluaXRQYXJhbS5tX3VpU2l6ZU9mU3RydWN0ID0gc2l6ZW9mKEVwbEFwaUluaXRQYXJhbSk7CisJRVBMX01FTUNQWShFcGxBcGlJbml0UGFyYW0ubV9hYk1hY0FkZHJlc3MsIGFiTWFjQWRkciwKKwkJICAgc2l6ZW9mKEVwbEFwaUluaXRQYXJhbS5tX2FiTWFjQWRkcmVzcykpOworLy8gICAgRXBsQXBpSW5pdFBhcmFtLm1fYWJNYWNBZGRyZXNzWzVdID0gKEJZVEUpIEVwbEFwaUluaXRQYXJhbS5tX3VpTm9kZUlkOworCUVwbEFwaUluaXRQYXJhbS5tX2R3RmVhdHVyZUZsYWdzID0gLTE7CisJRXBsQXBpSW5pdFBhcmFtLm1fZHdDeWNsZUxlbiA9IHVpQ3ljbGVMZW5fZzsJLy8gcmVxdWlyZWQgZm9yIGVycm9yIGRldGVjdGlvbgorCUVwbEFwaUluaXRQYXJhbS5tX3VpSXNvY2hyVHhNYXhQYXlsb2FkID0gMTAwOwkvLyBjb25zdAorCUVwbEFwaUluaXRQYXJhbS5tX3VpSXNvY2hyUnhNYXhQYXlsb2FkID0gMTAwOwkvLyBjb25zdAorCUVwbEFwaUluaXRQYXJhbS5tX2R3UHJlc01heExhdGVuY3kgPSA1MDAwMDsJLy8gY29uc3Q7IG9ubHkgcmVxdWlyZWQgZm9yIElkZW50UmVzCisJRXBsQXBpSW5pdFBhcmFtLm1fdWlQcmVxQWN0UGF5bG9hZExpbWl0ID0gMzY7CS8vIHJlcXVpcmVkIGZvciBpbml0aWFsaXNhdGlvbiAoKzI4IGJ5dGVzKQorCUVwbEFwaUluaXRQYXJhbS5tX3VpUHJlc0FjdFBheWxvYWRMaW1pdCA9IDM2OwkvLyByZXF1aXJlZCBmb3IgaW5pdGlhbGlzYXRpb24gb2YgUHJlcyBmcmFtZSAoKzI4IGJ5dGVzKQorCUVwbEFwaUluaXRQYXJhbS5tX2R3QXNuZE1heExhdGVuY3kgPSAxNTAwMDA7CS8vIGNvbnN0OyBvbmx5IHJlcXVpcmVkIGZvciBJZGVudFJlcworCUVwbEFwaUluaXRQYXJhbS5tX3VpTXVsdGlwbEN5Y2xlQ250ID0gMDsJLy8gcmVxdWlyZWQgZm9yIGVycm9yIGRldGVjdGlvbgorCUVwbEFwaUluaXRQYXJhbS5tX3VpQXN5bmNNdHUgPSAxNTAwOwkvLyByZXF1aXJlZCB0byBzZXQgdXAgbWF4IGZyYW1lIHNpemUKKwlFcGxBcGlJbml0UGFyYW0ubV91aVByZXNjYWxlciA9IDI7CS8vIHJlcXVpcmVkIGZvciBzeW5jCisJRXBsQXBpSW5pdFBhcmFtLm1fZHdMb3NzT2ZGcmFtZVRvbGVyYW5jZSA9IDUwMDAwMDsKKwlFcGxBcGlJbml0UGFyYW0ubV9kd0FzeW5jU2xvdFRpbWVvdXQgPSAzMDAwMDAwOworCUVwbEFwaUluaXRQYXJhbS5tX2R3V2FpdFNvY1ByZXEgPSAxNTAwMDA7CisJRXBsQXBpSW5pdFBhcmFtLm1fZHdEZXZpY2VUeXBlID0gLTE7CS8vIE5NVF9EZXZpY2VUeXBlX1UzMgorCUVwbEFwaUluaXRQYXJhbS5tX2R3VmVuZG9ySWQgPSAtMTsJLy8gTk1UX0lkZW50aXR5T2JqZWN0X1JFQy5WZW5kb3JJZF9VMzIKKwlFcGxBcGlJbml0UGFyYW0ubV9kd1Byb2R1Y3RDb2RlID0gLTE7CS8vIE5NVF9JZGVudGl0eU9iamVjdF9SRUMuUHJvZHVjdENvZGVfVTMyCisJRXBsQXBpSW5pdFBhcmFtLm1fZHdSZXZpc2lvbk51bWJlciA9IC0xOwkvLyBOTVRfSWRlbnRpdHlPYmplY3RfUkVDLlJldmlzaW9uTm9fVTMyCisJRXBsQXBpSW5pdFBhcmFtLm1fZHdTZXJpYWxOdW1iZXIgPSAtMTsJLy8gTk1UX0lkZW50aXR5T2JqZWN0X1JFQy5TZXJpYWxOb19VMzIKKwlFcGxBcGlJbml0UGFyYW0ubV9kd1N1Ym5ldE1hc2sgPSBTVUJORVRfTUFTSzsKKwlFcGxBcGlJbml0UGFyYW0ubV9kd0RlZmF1bHRHYXRld2F5ID0gMDsKKwlFUExfTUVNQ1BZKEVwbEFwaUluaXRQYXJhbS5tX3NIb3N0bmFtZSwgc0hvc3RuYW1lLAorCQkgICBzaXplb2YoRXBsQXBpSW5pdFBhcmFtLm1fc0hvc3RuYW1lKSk7CisKKwkvLyBjdXJyZW50bHkgdW5zZXQgcGFyYW1ldGVycyBsZWZ0IGF0IGRlZmF1bHQgdmFsdWUgMAorCS8vRXBsQXBpSW5pdFBhcmFtLm1fcXdWZW5kb3JTcGVjaWZpY0V4dDE7CisJLy9FcGxBcGlJbml0UGFyYW0ubV9kd1ZlcmlmeUNvbmZpZ3VyYXRpb25EYXRlOyAvLyBDRk1fVmVyaWZ5Q29uZmlndXJhdGlvbl9SRUMuQ29uZkRhdGVfVTMyCisJLy9FcGxBcGlJbml0UGFyYW0ubV9kd1ZlcmlmeUNvbmZpZ3VyYXRpb25UaW1lOyAvLyBDRk1fVmVyaWZ5Q29uZmlndXJhdGlvbl9SRUMuQ29uZlRpbWVfVTMyCisJLy9FcGxBcGlJbml0UGFyYW0ubV9kd0FwcGxpY2F0aW9uU3dEYXRlOyAgICAgICAvLyBQRExfTG9jVmVyQXBwbFN3X1JFQy5BcHBsU3dEYXRlX1UzMiBvbiBwcm9ncmFtbWFibGUgZGV2aWNlIG9yIGRhdGUgcG9ydGlvbiBvZiBOTVRfTWFudWZhY3RTd1ZlcnNfVlMgb24gbm9uLXByb2dyYW1tYWJsZSBkZXZpY2UKKwkvL0VwbEFwaUluaXRQYXJhbS5tX2R3QXBwbGljYXRpb25Td1RpbWU7ICAgICAgIC8vIFBETF9Mb2NWZXJBcHBsU3dfUkVDLkFwcGxTd1RpbWVfVTMyIG9uIHByb2dyYW1tYWJsZSBkZXZpY2Ugb3IgdGltZSBwb3J0aW9uIG9mIE5NVF9NYW51ZmFjdFN3VmVyc19WUyBvbiBub24tcHJvZ3JhbW1hYmxlIGRldmljZQorCS8vRXBsQXBpSW5pdFBhcmFtLm1fYWJWZW5kb3JTcGVjaWZpY0V4dDJbNDhdOworCisJLy8gc2V0IGNhbGxiYWNrIGZ1bmN0aW9ucworCUVwbEFwaUluaXRQYXJhbS5tX3BmbkNiRXZlbnQgPSBBcHBDYkV2ZW50OworCUVwbEFwaUluaXRQYXJhbS5tX3BmbkNiU3luYyA9IEFwcENiU3luYzsKKworCXByaW50aworCSAgICAoIlxuXG4gSGVsbG8sIEknbSBhIHNpbXBsZSBQT1dFUkxJTksgbm9kZSBydW5uaW5nIGFzICVzIVxuICAoYnVpbGQ6ICVzIC8gJXMpXG5cbiIsCisJICAgICAodWlOb2RlSWRfZyA9PQorCSAgICAgIEVQTF9DX0FEUl9NTl9ERUZfTk9ERV9JRCA/ICJNYW5hZ2luZyBOb2RlIiA6ICJDb250cm9sbGVkIE5vZGUiKSwKKwkgICAgIF9fREFURV9fLCBfX1RJTUVfXyk7CisKKwkvLyBpbml0aWFsaXplIHRoZSBMaW51eCBhIHdhaXQgcXVldWUgZm9yIHNodXRkb3duIG9mIHRoaXMgbW9kdWxlCisJaW5pdF93YWl0cXVldWVfaGVhZCgmV2FpdFF1ZXVlU2h1dGRvd25fZyk7CisKKwkvLyBpbml0aWFsaXplIHRoZSBwcm9jZnMgZGV2aWNlCisJRXBsUmV0ID0gRXBsTGluUHJvY0luaXQoKTsKKwlpZiAoRXBsUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gaW5pdGlhbGl6ZSBQT1dFUkxJTksgc3RhY2sKKwlFcGxSZXQgPSBFcGxBcGlJbml0aWFsaXplKCZFcGxBcGlJbml0UGFyYW0pOworCWlmIChFcGxSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKwkvLyBsaW5rIHByb2Nlc3MgdmFyaWFibGVzIHVzZWQgYnkgQ04gdG8gb2JqZWN0IGRpY3Rpb25hcnkKKwlPYmRTaXplID0gc2l6ZW9mKGJWYXJJbjFfbCk7CisJdWlWYXJFbnRyaWVzID0gMTsKKwlFcGxSZXQgPQorCSAgICBFcGxBcGlMaW5rT2JqZWN0KDB4NjAwMCwgJmJWYXJJbjFfbCwgJnVpVmFyRW50cmllcywgJk9iZFNpemUsIDB4MDEpOworCWlmIChFcGxSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKworCU9iZFNpemUgPSBzaXplb2YoYlZhck91dDFfbCk7CisJdWlWYXJFbnRyaWVzID0gMTsKKwlFcGxSZXQgPQorCSAgICBFcGxBcGlMaW5rT2JqZWN0KDB4NjIwMCwgJmJWYXJPdXQxX2wsICZ1aVZhckVudHJpZXMsICZPYmRTaXplLAorCQkJICAgICAweDAxKTsKKwlpZiAoRXBsUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gbGluayBwcm9jZXNzIHZhcmlhYmxlcyB1c2VkIGJ5IE1OIHRvIG9iamVjdCBkaWN0aW9uYXJ5CisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVF9NTikpICE9IDApCisJT2JkU2l6ZSA9IHNpemVvZihiTGVkc1JvdzFfbCk7CisJdWlWYXJFbnRyaWVzID0gMTsKKwlFcGxSZXQgPQorCSAgICBFcGxBcGlMaW5rT2JqZWN0KDB4MjAwMCwgJmJMZWRzUm93MV9sLCAmdWlWYXJFbnRyaWVzLCAmT2JkU2l6ZSwKKwkJCSAgICAgMHgwMSk7CisJaWYgKEVwbFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQlnb3RvIEV4aXQ7CisJfQorCisJT2JkU2l6ZSA9IHNpemVvZihiTGVkc1JvdzJfbCk7CisJdWlWYXJFbnRyaWVzID0gMTsKKwlFcGxSZXQgPQorCSAgICBFcGxBcGlMaW5rT2JqZWN0KDB4MjAwMCwgJmJMZWRzUm93Ml9sLCAmdWlWYXJFbnRyaWVzLCAmT2JkU2l6ZSwKKwkJCSAgICAgMHgwMik7CisJaWYgKEVwbFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQlnb3RvIEV4aXQ7CisJfQorCisJT2JkU2l6ZSA9IHNpemVvZihiU3BlZWRTZWxlY3RfbCk7CisJdWlWYXJFbnRyaWVzID0gMTsKKwlFcGxSZXQgPQorCSAgICBFcGxBcGlMaW5rT2JqZWN0KDB4MjAwMCwgJmJTcGVlZFNlbGVjdF9sLCAmdWlWYXJFbnRyaWVzLCAmT2JkU2l6ZSwKKwkJCSAgICAgMHgwMyk7CisJaWYgKEVwbFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQlnb3RvIEV4aXQ7CisJfQorCisJT2JkU2l6ZSA9IHNpemVvZihiU3BlZWRTZWxlY3RPbGRfbCk7CisJdWlWYXJFbnRyaWVzID0gMTsKKwlFcGxSZXQgPQorCSAgICBFcGxBcGlMaW5rT2JqZWN0KDB4MjAwMCwgJmJTcGVlZFNlbGVjdE9sZF9sLCAmdWlWYXJFbnRyaWVzLAorCQkJICAgICAmT2JkU2l6ZSwgMHgwNCk7CisJaWYgKEVwbFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQlnb3RvIEV4aXQ7CisJfQorCisJT2JkU2l6ZSA9IHNpemVvZihhYlNlbGVjdF9sWzBdKTsKKwl1aVZhckVudHJpZXMgPSBzaXplb2YoYWJTZWxlY3RfbCk7CisJRXBsUmV0ID0KKwkgICAgRXBsQXBpTGlua09iamVjdCgweDIyMDAsICZhYlNlbGVjdF9sWzBdLCAmdWlWYXJFbnRyaWVzLCAmT2JkU2l6ZSwKKwkJCSAgICAgMHgwMSk7CisJaWYgKEVwbFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQlnb3RvIEV4aXQ7CisJfQorI2VuZGlmCisKKwkvLyBsaW5rIGEgRE9NQUlOIHRvIG9iamVjdCAweDYxMDAsIGJ1dCBkbyBub3QgZXhpdCwgaWYgaXQgaXMgbWlzc2luZworCU9iZFNpemUgPSBzaXplb2YoYWJEb21haW5fbCk7CisJdWlWYXJFbnRyaWVzID0gMTsKKwlFcGxSZXQgPQorCSAgICBFcGxBcGlMaW5rT2JqZWN0KDB4NjEwMCwgJmFiRG9tYWluX2wsICZ1aVZhckVudHJpZXMsICZPYmRTaXplLAorCQkJICAgICAweDAwKTsKKwlpZiAoRXBsUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCXByaW50aygiRXBsQXBpTGlua09iamVjdCgweDYxMDApOiByZXR1cm5zIDB4JVhcbiIsIEVwbFJldCk7CisJfQorCS8vIHJlc2V0IG9sZCBwcm9jZXNzIHZhcmlhYmxlcworCWJWYXJPdXQxT2xkX2wgPSAwOworCWJTcGVlZFNlbGVjdE9sZF9sID0gMDsKKwlkd01vZGVfbCA9IEFQUF9ERUZBVUxUX01PREU7CisJaU1heEN5Y2xlQ291bnRfbCA9IERFRkFVTFRfTUFYX0NZQ0xFX0NPVU5UOworCisJLy8gY29uZmlndXJlIElQIGFkZHJlc3Mgb2YgdmlydHVhbCBuZXR3b3JrIGludGVyZmFjZQorCS8vIGZvciBUQ1AvSVAgY29tbXVuaWNhdGlvbiBvdmVyIHRoZSBQT1dFUkxJTksgbmV0d29yaworCXNwcmludGYoc0J1ZmZlciwgIiVsdS4lbHUuJWx1LiVsdSIsCisJCShFcGxBcGlJbml0UGFyYW0ubV9kd0lwQWRkcmVzcyA+PiAyNCksCisJCSgoRXBsQXBpSW5pdFBhcmFtLm1fZHdJcEFkZHJlc3MgPj4gMTYpICYgMHhGRiksCisJCSgoRXBsQXBpSW5pdFBhcmFtLm1fZHdJcEFkZHJlc3MgPj4gOCkgJiAweEZGKSwKKwkJKEVwbEFwaUluaXRQYXJhbS5tX2R3SXBBZGRyZXNzICYgMHhGRikpOworCS8qIHNldCB1cCBhIG1pbmltYWwgZW52aXJvbm1lbnQgKi8KKwlpUmV0ID0gMDsKKwllbnZwW2lSZXQrK10gPSAiSE9NRT0vIjsKKwllbnZwW2lSZXQrK10gPSAiUEFUSD0vc2JpbjovYmluOi91c3Ivc2JpbjovdXNyL2JpbiI7CisJZW52cFtpUmV0XSA9IE5VTEw7CisKKwkvKiBzZXQgdXAgdGhlIGFyZ3VtZW50IGxpc3QgKi8KKwlpUmV0ID0gMDsKKwlhcmd2W2lSZXQrK10gPSAiL3NiaW4vaWZjb25maWciOworCWFyZ3ZbaVJldCsrXSA9IElGX0VUSDsKKwlhcmd2W2lSZXQrK10gPSBzQnVmZmVyOworCWFyZ3ZbaVJldF0gPSBOVUxMOworCisJLyogY2FsbCBpZmNvbmZpZyB0byBjb25maWd1cmUgdGhlIHZpcnR1YWwgbmV0d29yayBpbnRlcmZhY2UgKi8KKwlpUmV0ID0gY2FsbF91c2VybW9kZWhlbHBlcihhcmd2WzBdLCBhcmd2LCBlbnZwLCAxKTsKKwlwcmludGsoImlmY29uZmlnICVzICVzIHJldHVybmVkICVkXG4iLCBhcmd2WzFdLCBhcmd2WzJdLCBpUmV0KTsKKworCS8vIHN0YXJ0IHRoZSBOTVQgc3RhdGUgbWFjaGluZQorCUVwbFJldCA9IEVwbEFwaUV4ZWNObXRDb21tYW5kKGtFcGxObXRFdmVudFN3UmVzZXQpOworCWF0b21pY19zZXQoJkF0b21pY1NodXRkb3duX2csIEZBTFNFKTsKKworICAgICAgRXhpdDoKKwlwcmludGsoIkVwbExpbkluaXQoKTogcmV0dXJucyAweCVYXG4iLCBFcGxSZXQpOworCXJldHVybiBFcGxSZXQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBFcGxMaW5FeGl0KHZvaWQpCit7CisJdEVwbEtlcm5lbCBFcGxSZXQ7CisKKwkvLyBoYWx0IHRoZSBOTVQgc3RhdGUgbWFjaGluZQorCS8vIHNvIHRoZSBwcm9jZXNzaW5nIG9mIFBPV0VSTElOSyBmcmFtZXMgc3RvcHMKKwlFcGxSZXQgPSBFcGxBcGlFeGVjTm10Q29tbWFuZChrRXBsTm10RXZlbnRTd2l0Y2hPZmYpOworCisJLy8gd2FpdCB1bnRpbCBOTVQgc3RhdGUgbWFjaGluZSBpcyBzaHV0IGRvd24KKwl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoV2FpdFF1ZXVlU2h1dGRvd25fZywKKwkJCQkgKGF0b21pY19yZWFkKCZBdG9taWNTaHV0ZG93bl9nKSA9PSBUUlVFKSk7CisvKiAgICBpZiAoKGlFcnIgIT0gMCkgfHwgKGF0b21pY19yZWFkKCZBdG9taWNTaHV0ZG93bl9nKSA9PSBFVkVOVF9TVEFURV9JT0NUTCkpCisgICAgeyAgIC8vIHdhaXRpbmcgd2FzIGludGVycnVwdGVkIGJ5IHNpZ25hbCBvciBhcHBsaWNhdGlvbiBjYWxsZWQgd3JvbmcgZnVuY3Rpb24KKyAgICAgICAgRXBsUmV0ID0ga0VwbFNodXRkb3duOworICAgIH0qLworCS8vIGRlbGV0ZSBpbnN0YW5jZSBmb3IgYWxsIG1vZHVsZXMKKwlFcGxSZXQgPSBFcGxBcGlTaHV0ZG93bigpOworCXByaW50aygiRXBsQXBpU2h1dGRvd24oKTogIDB4JVhcbiIsIEVwbFJldCk7CisKKwkvLyBkZWluaXRpYWxpemUgcHJvYyBmcworCUVwbFJldCA9IEVwbExpblByb2NGcmVlKCk7CisJcHJpbnRrKCJFcGxMaW5Qcm9jRnJlZSgpOiAgICAgICAgMHglWFxuIiwgRXBsUmV0KTsKKworfQorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgIFAgUiBJIFYgQSBUIEUgICBGIFUgTiBDIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgQXBwQ2JFdmVudAorLy8KKy8vIERlc2NyaXB0aW9uOiBldmVudCBjYWxsYmFjayBmdW5jdGlvbiBjYWxsZWQgYnkgRVBMIEFQSSBsYXllciB3aXRoaW4KKy8vICAgICAgICAgICAgICB1c2VyIHBhcnQgKGxvdyBwcmlvcml0eSkuCisvLworLy8gUGFyYW1ldGVyczogIEV2ZW50VHlwZV9wICAgICA9IGV2ZW50IHR5cGUKKy8vICAgICAgICAgICAgICBwRXZlbnRBcmdfcCAgICAgPSBwb2ludGVyIHRvIHVuaW9uLCB3aGljaCBkZXNjcmliZXMKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgZXZlbnQgaW4gZGV0YWlsCisvLyAgICAgICAgICAgICAgcFVzZXJBcmdfcCAgICAgID0gdXNlciBzcGVjaWZpYyBhcmd1bWVudAorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgPSBlcnJvciBjb2RlLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtFcGxTdWNjZXNzZnVsID0gbm8gZXJyb3IKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrRXBsUmVqZWN0ID0gcmVqZWN0IGZ1cnRoZXIgcHJvY2Vzc2luZworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyd2lzZSA9IHBvc3QgZXJyb3IgZXZlbnQgdG8gQVBJIGxheWVyCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordEVwbEtlcm5lbCBQVUJMSUMgQXBwQ2JFdmVudCh0RXBsQXBpRXZlbnRUeXBlIEV2ZW50VHlwZV9wLAkvLyBJTjogZXZlbnQgdHlwZSAoZW51bSkKKwkJCSAgICAgdEVwbEFwaUV2ZW50QXJnICogcEV2ZW50QXJnX3AsCS8vIElOOiBldmVudCBhcmd1bWVudCAodW5pb24pCisJCQkgICAgIHZvaWQgR0VORVJJQyAqIHBVc2VyQXJnX3ApCit7CisJdEVwbEtlcm5lbCBFcGxSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCS8vIGNoZWNrIGlmIE5NVF9HU19PRkYgaXMgcmVhY2hlZAorCXN3aXRjaCAoRXZlbnRUeXBlX3ApIHsKKwljYXNlIGtFcGxBcGlFdmVudE5tdFN0YXRlQ2hhbmdlOgorCQl7CisJCQlzd2l0Y2ggKHBFdmVudEFyZ19wLT5tX05tdFN0YXRlQ2hhbmdlLm1fTmV3Tm10U3RhdGUpIHsKKwkJCWNhc2Uga0VwbE5tdEdzT2ZmOgorCQkJCXsJLy8gTk1UIHN0YXRlIG1hY2hpbmUgd2FzIHNodXQgZG93biwKKwkJCQkJLy8gYmVjYXVzZSBvZiB1c2VyIHNpZ25hbCAoQ1RSTC1DKSBvciBjcml0aWNhbCBFUEwgc3RhY2sgZXJyb3IKKwkJCQkJLy8gLT4gYWxzbyBzaHV0IGRvd24gRXBsQXBpUHJvY2VzcygpIGFuZCBtYWluKCkKKwkJCQkJRXBsUmV0ID0ga0VwbFNodXRkb3duOworCisJCQkJCXByaW50aworCQkJCQkgICAgKCJBcHBDYkV2ZW50KGtFcGxObXRHc09mZikgb3JpZ2luYXRpbmcgZXZlbnQgPSAweCVYXG4iLAorCQkJCQkgICAgIHBFdmVudEFyZ19wLT5tX05tdFN0YXRlQ2hhbmdlLgorCQkJCQkgICAgIG1fTm10RXZlbnQpOworCisJCQkJCS8vIHdha2UgdXAgRXBsTGluRXhpdCgpCisJCQkJCWF0b21pY19zZXQoJkF0b21pY1NodXRkb3duX2csIFRSVUUpOworCQkJCQl3YWtlX3VwX2ludGVycnVwdGlibGUKKwkJCQkJICAgICgmV2FpdFF1ZXVlU2h1dGRvd25fZyk7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJY2FzZSBrRXBsTm10R3NSZXNldENvbW11bmljYXRpb246CisJCQkJeworCQkJCQlEV09SRCBkd0J1ZmZlcjsKKworCQkJCQkvLyBjb25maWd1cmUgT0QgZm9yIE1OIGluIHN0YXRlIFJlc2V0Q29tbSBhZnRlciByZXNldGluZyB0aGUgT0QKKwkJCQkJLy8gVE9ETzogc2V0dXAgeW91ciBvd24gbmV0d29yayBjb25maWd1cmF0aW9uIGhlcmUKKwkJCQkJZHdCdWZmZXIgPSAoRVBMX05PREVBU1NJR05fTk9ERV9JU19DTiB8IEVQTF9OT0RFQVNTSUdOX05PREVfRVhJU1RTKTsJLy8gMHgwMDAwMDAwM0wKKwkJCQkJRXBsUmV0ID0KKwkJCQkJICAgIEVwbEFwaVdyaXRlTG9jYWxPYmplY3QoMHgxRjgxLCAweDAxLAorCQkJCQkJCQkgICAmZHdCdWZmZXIsCisJCQkJCQkJCSAgIDQpOworCQkJCQlFcGxSZXQgPQorCQkJCQkgICAgRXBsQXBpV3JpdGVMb2NhbE9iamVjdCgweDFGODEsIDB4MDIsCisJCQkJCQkJCSAgICZkd0J1ZmZlciwKKwkJCQkJCQkJICAgNCk7CisJCQkJCUVwbFJldCA9CisJCQkJCSAgICBFcGxBcGlXcml0ZUxvY2FsT2JqZWN0KDB4MUY4MSwgMHgwMywKKwkJCQkJCQkJICAgJmR3QnVmZmVyLAorCQkJCQkJCQkgICA0KTsKKwkJCQkJRXBsUmV0ID0KKwkJCQkJICAgIEVwbEFwaVdyaXRlTG9jYWxPYmplY3QoMHgxRjgxLCAweDA0LAorCQkJCQkJCQkgICAmZHdCdWZmZXIsCisJCQkJCQkJCSAgIDQpOworCQkJCQlFcGxSZXQgPQorCQkJCQkgICAgRXBsQXBpV3JpdGVMb2NhbE9iamVjdCgweDFGODEsIDB4MDUsCisJCQkJCQkJCSAgICZkd0J1ZmZlciwKKwkJCQkJCQkJICAgNCk7CisJCQkJCUVwbFJldCA9CisJCQkJCSAgICBFcGxBcGlXcml0ZUxvY2FsT2JqZWN0KDB4MUY4MSwgMHgwNiwKKwkJCQkJCQkJICAgJmR3QnVmZmVyLAorCQkJCQkJCQkgICA0KTsKKwkJCQkJRXBsUmV0ID0KKwkJCQkJICAgIEVwbEFwaVdyaXRlTG9jYWxPYmplY3QoMHgxRjgxLCAweDA3LAorCQkJCQkJCQkgICAmZHdCdWZmZXIsCisJCQkJCQkJCSAgIDQpOworCQkJCQlFcGxSZXQgPQorCQkJCQkgICAgRXBsQXBpV3JpdGVMb2NhbE9iamVjdCgweDFGODEsIDB4MDgsCisJCQkJCQkJCSAgICZkd0J1ZmZlciwKKwkJCQkJCQkJICAgNCk7CisJCQkJCUVwbFJldCA9CisJCQkJCSAgICBFcGxBcGlXcml0ZUxvY2FsT2JqZWN0KDB4MUY4MSwgMHgyMCwKKwkJCQkJCQkJICAgJmR3QnVmZmVyLAorCQkJCQkJCQkgICA0KTsKKwkJCQkJRXBsUmV0ID0KKwkJCQkJICAgIEVwbEFwaVdyaXRlTG9jYWxPYmplY3QoMHgxRjgxLCAweEZFLAorCQkJCQkJCQkgICAmZHdCdWZmZXIsCisJCQkJCQkJCSAgIDQpOworCQkJCQlFcGxSZXQgPQorCQkJCQkgICAgRXBsQXBpV3JpdGVMb2NhbE9iamVjdCgweDFGODEsIDB4NkUsCisJCQkJCQkJCSAgICZkd0J1ZmZlciwKKwkJCQkJCQkJICAgNCk7CisKKy8vICAgICAgICAgICAgICAgICAgICBkd0J1ZmZlciB8PSBFUExfTk9ERUFTU0lHTl9NQU5EQVRPUllfQ047ICAgIC8vIDB4MDAwMDAwMEJMCisvLyAgICAgICAgICAgICAgICAgICAgRXBsUmV0ID0gRXBsQXBpV3JpdGVMb2NhbE9iamVjdCgweDFGODEsIDB4NkUsICZkd0J1ZmZlciwgNCk7CisJCQkJCWR3QnVmZmVyID0gKEVQTF9OT0RFQVNTSUdOX01OX1BSRVMgfCBFUExfTk9ERUFTU0lHTl9OT0RFX0VYSVNUUyk7CS8vIDB4MDAwMTAwMDFMCisJCQkJCUVwbFJldCA9CisJCQkJCSAgICBFcGxBcGlXcml0ZUxvY2FsT2JqZWN0KDB4MUY4MSwgMHhGMCwKKwkJCQkJCQkJICAgJmR3QnVmZmVyLAorCQkJCQkJCQkgICA0KTsKKworCQkJCQkvLyBjb250aW51ZQorCQkJCX0KKworCQkJY2FzZSBrRXBsTm10R3NSZXNldENvbmZpZ3VyYXRpb246CisJCQkJeworCQkJCQl1bnNpZ25lZCBpbnQgdWlTaXplOworCisJCQkJCS8vIGZldGNoIG9iamVjdCAweDEwMDYgTk1UX0N5Y2xlTGVuX1UzMiBmcm9tIGxvY2FsIE9EIChpbiBsaXR0bGUgZW5kaWFuIGJ5dGUgb3JkZXIpCisJCQkJCS8vIGZvciBjb25maWd1cmF0aW9uIG9mIHJlbW90ZSBDTgorCQkJCQl1aVNpemUgPSA0OworCQkJCQlFcGxSZXQgPQorCQkJCQkgICAgRXBsQXBpUmVhZE9iamVjdChOVUxMLCAwLCAweDEwMDYsCisJCQkJCQkJICAgICAweDAwLAorCQkJCQkJCSAgICAgJmR3X2xlX0N5Y2xlTGVuX2csCisJCQkJCQkJICAgICAmdWlTaXplLAorCQkJCQkJCSAgICAga0VwbFNkb1R5cGVBc25kLAorCQkJCQkJCSAgICAgTlVMTCk7CisJCQkJCWlmIChFcGxSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsJLy8gbG9jYWwgT0QgYWNjZXNzIGZhaWxlZAorCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJLy8gY29udGludWUKKwkJCQl9CisKKwkJCWNhc2Uga0VwbE5tdE1zUHJlT3BlcmF0aW9uYWwxOgorCQkJCXsKKwkJCQkJcHJpbnRrCisJCQkJCSAgICAoIkFwcENiRXZlbnQoMHglWCkgb3JpZ2luYXRpbmcgZXZlbnQgPSAweCVYXG4iLAorCQkJCQkgICAgIHBFdmVudEFyZ19wLT5tX05tdFN0YXRlQ2hhbmdlLgorCQkJCQkgICAgIG1fTmV3Tm10U3RhdGUsCisJCQkJCSAgICAgcEV2ZW50QXJnX3AtPm1fTm10U3RhdGVDaGFuZ2UuCisJCQkJCSAgICAgbV9ObXRFdmVudCk7CisKKwkJCQkJLy8gY29udGludWUKKwkJCQl9CisKKwkJCWNhc2Uga0VwbE5tdEdzSW5pdGlhbGlzaW5nOgorCQkJY2FzZSBrRXBsTm10R3NSZXNldEFwcGxpY2F0aW9uOgorCQkJY2FzZSBrRXBsTm10TXNOb3RBY3RpdmU6CisJCQljYXNlIGtFcGxObXRDc05vdEFjdGl2ZToKKwkJCWNhc2Uga0VwbE5tdENzUHJlT3BlcmF0aW9uYWwxOgorCQkJCXsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQljYXNlIGtFcGxObXRDc09wZXJhdGlvbmFsOgorCQkJY2FzZSBrRXBsTm10TXNPcGVyYXRpb25hbDoKKwkJCQl7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJZGVmYXVsdDoKKwkJCQl7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKworLyoKKyAgICAgICAgICAgIHN3aXRjaCAocEV2ZW50QXJnX3AtPm1fTm10U3RhdGVDaGFuZ2UubV9ObXRFdmVudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIGtFcGxObXRFdmVudFN3UmVzZXQ6CisgICAgICAgICAgICAgICAgY2FzZSBrRXBsTm10RXZlbnRSZXNldE5vZGU6CisgICAgICAgICAgICAgICAgY2FzZSBrRXBsTm10RXZlbnRSZXNldENvbToKKyAgICAgICAgICAgICAgICBjYXNlIGtFcGxObXRFdmVudFJlc2V0Q29uZmlnOgorICAgICAgICAgICAgICAgIGNhc2Uga0VwbE5tdEV2ZW50SW50ZXJuQ29tRXJyb3I6CisgICAgICAgICAgICAgICAgY2FzZSBrRXBsTm10RXZlbnRObXRDeWNsZUVycm9yOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCJBcHBDYkV2ZW50KDB4JVgpIG9yaWdpbmF0aW5nIGV2ZW50ID0gMHglWFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBFdmVudEFyZ19wLT5tX05tdFN0YXRlQ2hhbmdlLm1fTmV3Tm10U3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwRXZlbnRBcmdfcC0+bV9ObXRTdGF0ZUNoYW5nZS5tX05tdEV2ZW50KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyovCisJCQlicmVhazsKKwkJfQorCisJY2FzZSBrRXBsQXBpRXZlbnRDcml0aWNhbEVycm9yOgorCWNhc2Uga0VwbEFwaUV2ZW50V2FybmluZzoKKwkJewkJLy8gZXJyb3Igb3Igd2FybmluZyBvY2N1cmVkIHdpdGhpbiB0aGUgc3RhY2sgb3IgdGhlIGFwcGxpY2F0aW9uCisJCQkvLyBvbiBlcnJvciB0aGUgQVBJIGxheWVyIHN0b3BzIHRoZSBOTVQgc3RhdGUgbWFjaGluZQorCisJCQlwcmludGsKKwkJCSAgICAoIkFwcENiRXZlbnQoRXJyL1dhcm4pOiBTb3VyY2U9JTAyWCBFcGxFcnJvcj0weCUwM1giLAorCQkJICAgICBwRXZlbnRBcmdfcC0+bV9JbnRlcm5hbEVycm9yLm1fRXZlbnRTb3VyY2UsCisJCQkgICAgIHBFdmVudEFyZ19wLT5tX0ludGVybmFsRXJyb3IubV9FcGxFcnJvcik7CisJCQkvLyBjaGVjayBhZGRpdGlvbmFsIGFyZ3VtZW50CisJCQlzd2l0Y2ggKHBFdmVudEFyZ19wLT5tX0ludGVybmFsRXJyb3IubV9FdmVudFNvdXJjZSkgeworCQkJY2FzZSBrRXBsRXZlbnRTb3VyY2VFdmVudGs6CisJCQljYXNlIGtFcGxFdmVudFNvdXJjZUV2ZW50dToKKwkJCQl7CS8vIGVycm9yIG9jY3VyZWQgd2l0aGluIGV2ZW50IHByb2Nlc3NpbmcKKwkJCQkJLy8gZWl0aGVyIGluIGtlcm5lbCBvciBpbiB1c2VyIHBhcnQKKwkJCQkJcHJpbnRrKCIgT3JnU291cmNlPSUwMlhcbiIsCisJCQkJCSAgICAgICBwRXZlbnRBcmdfcC0+bV9JbnRlcm5hbEVycm9yLgorCQkJCQkgICAgICAgbV9BcmcubV9FdmVudFNvdXJjZSk7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJY2FzZSBrRXBsRXZlbnRTb3VyY2VEbGxrOgorCQkJCXsJLy8gZXJyb3Igb2NjdXJlZCB3aXRoaW4gdGhlIGRhdGEgbGluayBsYXllciAoZS5nLiBpbnRlcnJ1cHQgcHJvY2Vzc2luZykKKwkJCQkJLy8gdGhlIERXT1JEIGFyZ3VtZW50IGNvbnRhaW5zIHRoZSBETEwgc3RhdGUgYW5kIHRoZSBOTVQgZXZlbnQKKwkJCQkJcHJpbnRrKCIgdmFsPSVsWFxuIiwKKwkJCQkJICAgICAgIHBFdmVudEFyZ19wLT5tX0ludGVybmFsRXJyb3IuCisJCQkJCSAgICAgICBtX0FyZy5tX2R3QXJnKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQlkZWZhdWx0OgorCQkJCXsKKwkJCQkJcHJpbnRrKCJcbiIpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJfQorCisJY2FzZSBrRXBsQXBpRXZlbnROb2RlOgorCQl7CisvLyAgICAgICAgICAgIHByaW50aygiQXBwQ2JFdmVudChOb2RlKTogU291cmNlPSUwMlggRXBsRXJyb3I9MHglMDNYIiwgcEV2ZW50QXJnX3AtPm1fSW50ZXJuYWxFcnJvci5tX0V2ZW50U291cmNlLCBwRXZlbnRBcmdfcC0+bV9JbnRlcm5hbEVycm9yLm1fRXBsRXJyb3IpOworCQkJLy8gY2hlY2sgYWRkaXRpb25hbCBhcmd1bWVudAorCQkJc3dpdGNoIChwRXZlbnRBcmdfcC0+bV9Ob2RlLm1fTm9kZUV2ZW50KSB7CisJCQljYXNlIGtFcGxObXROb2RlRXZlbnRDaGVja0NvbmY6CisJCQkJeworCQkJCQl0RXBsU2RvQ29tQ29uSGRsIFNkb0NvbUNvbkhkbDsKKwkJCQkJLy8gdXBkYXRlIG9iamVjdCAweDEwMDYgb24gQ04KKwkJCQkJRXBsUmV0ID0KKwkJCQkJICAgIEVwbEFwaVdyaXRlT2JqZWN0KCZTZG9Db21Db25IZGwsCisJCQkJCQkJICAgICAgcEV2ZW50QXJnX3AtPgorCQkJCQkJCSAgICAgIG1fTm9kZS5tX3VpTm9kZUlkLAorCQkJCQkJCSAgICAgIDB4MTAwNiwgMHgwMCwKKwkJCQkJCQkgICAgICAmZHdfbGVfQ3ljbGVMZW5fZywKKwkJCQkJCQkgICAgICA0LAorCQkJCQkJCSAgICAgIGtFcGxTZG9UeXBlQXNuZCwKKwkJCQkJCQkgICAgICBOVUxMKTsKKwkJCQkJaWYgKEVwbFJldCA9PSBrRXBsQXBpVGFza0RlZmVycmVkKSB7CS8vIFNETyB0cmFuc2ZlciBzdGFydGVkCisJCQkJCQlFcGxSZXQgPSBrRXBsUmVqZWN0OworCQkJCQl9IGVsc2UgaWYgKEVwbFJldCA9PSBrRXBsU3VjY2Vzc2Z1bCkgewkvLyBsb2NhbCBPRCBhY2Nlc3MgKHNob3VsZCBub3Qgb2NjdXIpCisJCQkJCQlwcmludGsKKwkJCQkJCSAgICAoIkFwcENiRXZlbnQoTm9kZSkgd3JpdGUgdG8gbG9jYWwgT0RcbiIpOworCQkJCQl9IGVsc2UgewkvLyBlcnJvciBvY2N1cmVkCisJCQkJCQlUR1RfREJHX1NJR05BTF9UUkFDRV9QT0lOVCgxKTsKKworCQkJCQkJRXBsUmV0ID0KKwkJCQkJCSAgICBFcGxBcGlGcmVlU2RvQ2hhbm5lbAorCQkJCQkJICAgIChTZG9Db21Db25IZGwpOworCQkJCQkJU2RvQ29tQ29uSGRsID0gMDsKKworCQkJCQkJRXBsUmV0ID0KKwkJCQkJCSAgICBFcGxBcGlXcml0ZU9iamVjdAorCQkJCQkJICAgICgmU2RvQ29tQ29uSGRsLAorCQkJCQkJICAgICBwRXZlbnRBcmdfcC0+bV9Ob2RlLgorCQkJCQkJICAgICBtX3VpTm9kZUlkLCAweDEwMDYsIDB4MDAsCisJCQkJCQkgICAgICZkd19sZV9DeWNsZUxlbl9nLCA0LAorCQkJCQkJICAgICBrRXBsU2RvVHlwZUFzbmQsIE5VTEwpOworCQkJCQkJaWYgKEVwbFJldCA9PSBrRXBsQXBpVGFza0RlZmVycmVkKSB7CS8vIFNETyB0cmFuc2ZlciBzdGFydGVkCisJCQkJCQkJRXBsUmV0ID0ga0VwbFJlamVjdDsKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJcHJpbnRrCisJCQkJCQkJICAgICgiQXBwQ2JFdmVudChOb2RlKTogRXBsQXBpV3JpdGVPYmplY3QoKSByZXR1cm5lZCAweCUwMlhcbiIsCisJCQkJCQkJICAgICBFcGxSZXQpOworCQkJCQkJfQorCQkJCQl9CisKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQlkZWZhdWx0OgorCQkJCXsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCX0KKworCWNhc2Uga0VwbEFwaUV2ZW50U2RvOgorCQl7CQkvLyBTRE8gdHJhbnNmZXIgZmluaXNoZWQKKwkJCUVwbFJldCA9CisJCQkgICAgRXBsQXBpRnJlZVNkb0NoYW5uZWwocEV2ZW50QXJnX3AtPm1fU2RvLgorCQkJCQkJIG1fU2RvQ29tQ29uSGRsKTsKKwkJCWlmIChFcGxSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCQlicmVhazsKKwkJCX0KKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UX01OKSkgIT0gMCkKKwkJCWlmIChwRXZlbnRBcmdfcC0+bV9TZG8ubV9TZG9Db21Db25TdGF0ZSA9PSBrRXBsU2RvQ29tVHJhbnNmZXJGaW5pc2hlZCkgewkvLyBjb250aW51ZSBib290LXVwIG9mIENOIHdpdGggTk1UIGNvbW1hbmQgUmVzZXQgQ29uZmlndXJhdGlvbgorCQkJCUVwbFJldCA9CisJCQkJICAgIEVwbEFwaU1uVHJpZ2dlclN0YXRlQ2hhbmdlKHBFdmVudEFyZ19wLT4KKwkJCQkJCQkgICAgICAgbV9TZG8ubV91aU5vZGVJZCwKKwkJCQkJCQkgICAgICAga0VwbE5tdE5vZGVDb21tYW5kQ29uZlJlc2V0KTsKKwkJCX0gZWxzZSB7CS8vIGluZGljYXRlIGNvbmZpZ3VyYXRpb24gZXJyb3IgQ04KKwkJCQlFcGxSZXQgPQorCQkJCSAgICBFcGxBcGlNblRyaWdnZXJTdGF0ZUNoYW5nZShwRXZlbnRBcmdfcC0+CisJCQkJCQkJICAgICAgIG1fU2RvLm1fdWlOb2RlSWQsCisJCQkJCQkJICAgICAgIGtFcGxObXROb2RlQ29tbWFuZENvbmZFcnIpOworCQkJfQorI2VuZGlmCisKKwkJCWJyZWFrOworCQl9CisKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gRXBsUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBBcHBDYlN5bmMKKy8vCisvLyBEZXNjcmlwdGlvbjogc3luYyBldmVudCBjYWxsYmFjayBmdW5jdGlvbiBjYWxsZWQgYnkgZXZlbnQgbW9kdWxlIHdpdGhpbgorLy8gICAgICAgICAgICAgIGtlcm5lbCBwYXJ0IChoaWdoIHByaW9yaXR5KS4KKy8vICAgICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIHNldHMgdGhlIG91dHB1dHMsIHJlYWRzIHRoZSBpbnB1dHMgYW5kIHJ1bnMKKy8vICAgICAgICAgICAgICB0aGUgY29udHJvbCBsb29wLgorLy8KKy8vIFBhcmFtZXRlcnM6ICB2b2lkCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICA9IGVycm9yIGNvZGUsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0VwbFN1Y2Nlc3NmdWwgPSBubyBlcnJvcgorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyd2lzZSA9IHBvc3QgZXJyb3IgZXZlbnQgdG8gQVBJIGxheWVyCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordEVwbEtlcm5lbCBQVUJMSUMgQXBwQ2JTeW5jKHZvaWQpCit7CisJdEVwbEtlcm5lbCBFcGxSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCWlmIChiVmFyT3V0MU9sZF9sICE9IGJWYXJPdXQxX2wpIHsJLy8gb3V0cHV0IHZhcmlhYmxlIGhhcyBjaGFuZ2VkCisJCWJWYXJPdXQxT2xkX2wgPSBiVmFyT3V0MV9sOworCQkvLyBzZXQgTEVEcworCisvLyAgICAgICAgcHJpbnRrKCJiVmFySW4gPSAweCUwMlggYlZhck91dCA9IDB4JTAyWFxuIiwgKFdPUkQpIGJWYXJJbl9sLCAoV09SRCkgYlZhck91dF9sKTsKKwl9CisJaWYgKHVpTm9kZUlkX2cgIT0gRVBMX0NfQURSX01OX0RFRl9OT0RFX0lEKSB7CisJCWJWYXJJbjFfbCsrOworCX0KKworCWlmICh1aU5vZGVJZF9nID09IEVQTF9DX0FEUl9NTl9ERUZfTk9ERV9JRCkgewkvLyB3ZSBhcmUgdGhlIG1hc3RlciBhbmQgbXVzdCBydW4gdGhlIGNvbnRyb2wgbG9vcAorCisJCS8vIGNvbGxlY3QgaW5wdXRzIGZyb20gQ05zIGFuZCBvd24gaW5wdXQKKwkJYlNwZWVkU2VsZWN0X2wgPSAoYlZhckluMV9sIHwgYWJTZWxlY3RfbFswXSkgJiAweDA3OworCisJCWJNb2RlU2VsZWN0X2wgPSBhYlNlbGVjdF9sWzFdIHwgYWJTZWxlY3RfbFsyXTsKKworCQlpZiAoKGJNb2RlU2VsZWN0X2wgJiBBUFBfTU9ERV9NQVNLKSAhPSAwKSB7CisJCQlkd01vZGVfbCA9IGJNb2RlU2VsZWN0X2wgJiBBUFBfTU9ERV9NQVNLOworCQl9CisKKwkJaUN1ckN5Y2xlQ291bnRfbC0tOworCisJCWlmIChpQ3VyQ3ljbGVDb3VudF9sIDw9IDApIHsKKwkJCWlmICgoZHdNb2RlX2wgJiAweDAxKSAhPSAwKSB7CS8vIGZpbGwtdXAKKwkJCQlpZiAoaVRvZ2dsZSkgeworCQkJCQlpZiAoKGR3TGVkc19sICYgQVBQX0RPVUJMRV9MRURfTUFTSykgPT0KKwkJCQkJICAgIDB4MDApIHsKKwkJCQkJCWR3TGVkc19sID0gMHgwMTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWR3TGVkc19sIDw8PSAxOworCQkJCQkJZHdMZWRzX2wrKzsKKwkJCQkJCWlmIChkd0xlZHNfbCA+PQorCQkJCQkJICAgIEFQUF9ET1VCTEVfTEVEX01BU0spIHsKKwkJCQkJCQlpVG9nZ2xlID0gMDsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCWR3TGVkc19sIDw8PSAxOworCQkJCQlpZiAoKGR3TGVkc19sICYgQVBQX0RPVUJMRV9MRURfTUFTSykgPT0KKwkJCQkJICAgIDB4MDApIHsKKwkJCQkJCWlUb2dnbGUgPSAxOworCQkJCQl9CisJCQkJfQorCQkJCWJMZWRzUm93MV9sID0KKwkJCQkgICAgKHVuc2lnbmVkIGNoYXIpKGR3TGVkc19sICYgQVBQX0xFRF9NQVNLKTsKKwkJCQliTGVkc1JvdzJfbCA9CisJCQkJICAgICh1bnNpZ25lZCBjaGFyKSgoZHdMZWRzX2wgPj4gQVBQX0xFRF9DT1VOVCkKKwkJCQkJCSAgICAmIEFQUF9MRURfTUFTSyk7CisJCQl9CisKKwkJCWVsc2UgaWYgKChkd01vZGVfbCAmIDB4MDIpICE9IDApIHsJLy8gcnVubmluZyBsaWdodCBmb3J3YXJkCisJCQkJZHdMZWRzX2wgPDw9IDE7CisJCQkJaWYgKChkd0xlZHNfbCA+IEFQUF9ET1VCTEVfTEVEX01BU0spCisJCQkJICAgIHx8IChkd0xlZHNfbCA9PSAweDAwMDAwMDAwTCkpIHsKKwkJCQkJZHdMZWRzX2wgPSAweDAxOworCQkJCX0KKwkJCQliTGVkc1JvdzFfbCA9CisJCQkJICAgICh1bnNpZ25lZCBjaGFyKShkd0xlZHNfbCAmIEFQUF9MRURfTUFTSyk7CisJCQkJYkxlZHNSb3cyX2wgPQorCQkJCSAgICAodW5zaWduZWQgY2hhcikoKGR3TGVkc19sID4+IEFQUF9MRURfQ09VTlQpCisJCQkJCQkgICAgJiBBUFBfTEVEX01BU0spOworCQkJfQorCisJCQllbHNlIGlmICgoZHdNb2RlX2wgJiAweDA0KSAhPSAwKSB7CS8vIHJ1bm5pbmcgbGlnaHQgYmFja3dhcmQKKwkJCQlkd0xlZHNfbCA+Pj0gMTsKKwkJCQlpZiAoKGR3TGVkc19sID4gQVBQX0RPVUJMRV9MRURfTUFTSykKKwkJCQkgICAgfHwgKGR3TGVkc19sID09IDB4MDAwMDAwMDBMKSkgeworCQkJCQlkd0xlZHNfbCA9IDEgPDwgKEFQUF9MRURfQ09VTlQgKiAyKTsKKwkJCQl9CisJCQkJYkxlZHNSb3cxX2wgPQorCQkJCSAgICAodW5zaWduZWQgY2hhcikoZHdMZWRzX2wgJiBBUFBfTEVEX01BU0spOworCQkJCWJMZWRzUm93Ml9sID0KKwkJCQkgICAgKHVuc2lnbmVkIGNoYXIpKChkd0xlZHNfbCA+PiBBUFBfTEVEX0NPVU5UKQorCQkJCQkJICAgICYgQVBQX0xFRF9NQVNLKTsKKwkJCX0KKworCQkJZWxzZSBpZiAoKGR3TW9kZV9sICYgMHgwOCkgIT0gMCkgewkvLyBLbmlnaHRyaWRlcgorCQkJCWlmIChiTGVkc1JvdzFfbCA9PSAweDAwKSB7CisJCQkJCWJMZWRzUm93MV9sID0gMHgwMTsKKwkJCQkJaVRvZ2dsZSA9IDE7CisJCQkJfSBlbHNlIGlmIChpVG9nZ2xlKSB7CisJCQkJCWJMZWRzUm93MV9sIDw8PSAxOworCQkJCQlpZiAoYkxlZHNSb3cxX2wgPj0KKwkJCQkJICAgICgxIDw8IChBUFBfTEVEX0NPVU5UIC0gMSkpKSB7CisJCQkJCQlpVG9nZ2xlID0gMDsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCWJMZWRzUm93MV9sID4+PSAxOworCQkJCQlpZiAoYkxlZHNSb3cxX2wgPD0gMHgwMSkgeworCQkJCQkJaVRvZ2dsZSA9IDE7CisJCQkJCX0KKwkJCQl9CisJCQkJYkxlZHNSb3cyX2wgPSBiTGVkc1JvdzFfbDsKKwkJCX0KKworCQkJZWxzZSBpZiAoKGR3TW9kZV9sICYgMHgxMCkgIT0gMCkgewkvLyBLbmlnaHRyaWRlcgorCQkJCWlmICgoYkxlZHNSb3cxX2wgPT0gMHgwMCkKKwkJCQkgICAgfHwgKGJMZWRzUm93Ml9sID09IDB4MDApCisJCQkJICAgIHx8ICgoYkxlZHNSb3cyX2wgJiB+QVBQX0xFRF9NQVNLKSAhPSAwKSkgeworCQkJCQliTGVkc1JvdzFfbCA9IDB4MDE7CisJCQkJCWJMZWRzUm93Ml9sID0KKwkJCQkJICAgICgxIDw8IChBUFBfTEVEX0NPVU5UIC0gMSkpOworCQkJCQlpVG9nZ2xlID0gMTsKKwkJCQl9IGVsc2UgaWYgKGlUb2dnbGUpIHsKKwkJCQkJYkxlZHNSb3cxX2wgPDw9IDE7CisJCQkJCWJMZWRzUm93Ml9sID4+PSAxOworCQkJCQlpZiAoYkxlZHNSb3cxX2wgPj0KKwkJCQkJICAgICgxIDw8IChBUFBfTEVEX0NPVU5UIC0gMSkpKSB7CisJCQkJCQlpVG9nZ2xlID0gMDsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCWJMZWRzUm93MV9sID4+PSAxOworCQkJCQliTGVkc1JvdzJfbCA8PD0gMTsKKwkJCQkJaWYgKGJMZWRzUm93MV9sIDw9IDB4MDEpIHsKKwkJCQkJCWlUb2dnbGUgPSAxOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJLy8gc2V0IG93biBvdXRwdXQKKwkJCWJWYXJPdXQxX2wgPSBiTGVkc1JvdzFfbDsKKy8vICAgICAgICAgICAgYlZhck91dDFfbCA9IChiTGVkc1JvdzFfbCAmIDB4MDMpIHwgKGJMZWRzUm93Ml9sIDw8IDIpOworCisJCQkvLyByZXN0YXJ0IGN5Y2xlIGNvdW50ZXIKKwkJCWlDdXJDeWNsZUNvdW50X2wgPSBpTWF4Q3ljbGVDb3VudF9sOworCQl9CisKKwkJaWYgKGJTcGVlZFNlbGVjdE9sZF9sID09IDApIHsKKwkJCWlmICgoYlNwZWVkU2VsZWN0X2wgJiAweDAxKSAhPSAwKSB7CisJCQkJaWYgKGlNYXhDeWNsZUNvdW50X2wgPCAyMDApIHsKKwkJCQkJaU1heEN5Y2xlQ291bnRfbCsrOworCQkJCX0KKwkJCQliU3BlZWRTZWxlY3RPbGRfbCA9IGJTcGVlZFNlbGVjdF9sOworCQkJfSBlbHNlIGlmICgoYlNwZWVkU2VsZWN0X2wgJiAweDAyKSAhPSAwKSB7CisJCQkJaWYgKGlNYXhDeWNsZUNvdW50X2wgPiAxKSB7CisJCQkJCWlNYXhDeWNsZUNvdW50X2wtLTsKKwkJCQl9CisJCQkJYlNwZWVkU2VsZWN0T2xkX2wgPSBiU3BlZWRTZWxlY3RfbDsKKwkJCX0gZWxzZSBpZiAoKGJTcGVlZFNlbGVjdF9sICYgMHgwNCkgIT0gMCkgeworCQkJCWlNYXhDeWNsZUNvdW50X2wgPSBERUZBVUxUX01BWF9DWUNMRV9DT1VOVDsKKwkJCQliU3BlZWRTZWxlY3RPbGRfbCA9IGJTcGVlZFNlbGVjdF9sOworCQkJfQorCQl9IGVsc2UgaWYgKGJTcGVlZFNlbGVjdF9sID09IDApIHsKKwkJCWJTcGVlZFNlbGVjdE9sZF9sID0gMDsKKwkJfQorCX0KKworCVRHVF9EQkdfU0lHTkFMX1RSQUNFX1BPSU5UKDEpOworCisJcmV0dXJuIEVwbFJldDsKK30KKworLy8gRU9GCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL2VkcnYuaCBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvZWRydi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0NTk4NGQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL2VkcnYuaApAQCAtMCwwICsxLDE2NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIGludGVyZmFjZSBmb3IgZXRoZXJuZXRkcml2ZXIKKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgICAgICAgICRSQ1NmaWxlOiBlZHJ2LmgsdiAkCisKKyAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAorCisgICAgICAgICAgICAgICAgJFJldmlzaW9uOiAxLjYgJCAgJERhdGU6IDIwMDgvMDQvMTcgMjE6MzY6MzIgJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgRGV2IEMrKyBhbmQgR05VLUNvbXBpbGVyIGZvciBtNjhrCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwNS8wOC8wMSBtLmIuOiAgIHN0YXJ0IG9mIGltcGxlbWVudGF0aW9uCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX0VEUlZfSF8KKyNkZWZpbmUgX0VEUlZfSF8KKworI2luY2x1ZGUgIkVwbEluYy5oIgorI2luY2x1ZGUgIkVwbEZyYW1lLmgiCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgTUFYX0VUSF9EQVRBX1NJWkUgICAgICAgMTUwMAorI2RlZmluZSBNSU5fRVRIX0RBVEFfU0laRSAgICAgICAgIDQ2CisKKyNkZWZpbmUgRVRIX0hEUl9PRkZTRVQgCSAwCS8vIEV0aGVybmV0IGhlYWRlciBhdCB0aGUgdG9wIG9mIHRoZSBmcmFtZQorI2RlZmluZSBFVEhfSERSX1NJWkUJMTQJLy8gc2l6ZSBvZiBFdGhlcm5ldCBoZWFkZXIKKyNkZWZpbmUgTUlOX0VUSF9TSVpFICAgICAoTUlOX0VUSF9EQVRBX1NJWkUgKyBFVEhfSERSX1NJWkUpCS8vIHdpdGhvdXQgQ1JDCisKKyNkZWZpbmUgRVRIX0NSQ19TSVpFCSA0CS8vIHNpemUgb2YgRXRoZXJuZXQgQ1JDLCBpLmUuIEZDUworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIHBvc2l0aW9uIG9mIGEgYnVmZmVyIGluIGFuIGV0aGVybmV0LWZyYW1lCit0eXBlZGVmIGVudW0geworCWtFZHJ2QnVmZmVyRmlyc3RJbkZyYW1lID0gMHgwMSwJLy8gZmlyc3QgZGF0YSBidWZmZXIgaW4gYW4gZXRoZXJuZXQgZnJhbWUKKwlrRWRydkJ1ZmZlck1pZGRsZUluRnJhbWUgPSAweDAyLAkvLyBhIG1pZGRsZSBkYXRhIGJ1ZmZlciBpbiBhbiBldGhlcm5ldCBmcmFtZQorCWtFZHJ2QnVmZmVyTGFzdEluRnJhbWUgPSAweDA0CS8vIGxhc3QgZGF0YSBidWZmZXIgaW4gYW4gZXRoZXJuZXQgZnJhbWUKK30gdEVkcnZCdWZmZXJJbkZyYW1lOworCisvLyBmb3JtYXQgb2YgYSB0eC1idWZmZXIKK3R5cGVkZWYgc3RydWN0IF90RWRydlR4QnVmZmVyIHsKKwl0RXBsTXNnVHlwZSBtX0VwbE1zZ1R5cGU7CS8vIElOOiB0eXBlIG9mIEVQTCBtZXNzYWdlLCBzZXQgYnkgY2FsbGluZyBmdW5jdGlvbgorCXVuc2lnbmVkIGludCBtX3VpVHhNc2dMZW47CS8vIElOOiBsZW5ndGggb2YgbWVzc2FnZSB0byBiZSBzZW5kIChzZXQgZm9yIGVhY2ggdHJhbnNtaXQgY2FsbCkKKwkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJdW5zaWduZWQgaW50IG1fdWlCdWZmZXJOdW1iZXI7CS8vIE9VVDogbnVtYmVyIG9mIHRoZSBidWZmZXIsIHNldCBieSBldGhlcm5ldGRyaXZlcgorCUJZVEUgKm1fcGJCdWZmZXI7CS8vIE9VVDogcG9pbnRlciB0byB0aGUgYnVmZmVyLCBzZXQgYnkgZXRoZXJuZXRkcml2ZXIKKwl0RXBsTmV0VGltZSBtX05ldFRpbWU7CS8vIE9VVDogVGltZXN0YW1wIG9mIGVuZCBvZiB0cmFuc21pc3Npb24sIHNldCBieSBldGhlcm5ldGRyaXZlcgorCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwl1bnNpZ25lZCBpbnQgbV91aU1heEJ1ZmZlckxlbjsJLy8gSU4vT1VUOiBtYXhpbXVtIGxlbmd0aCBvZiB0aGUgYnVmZmVyCit9IHRFZHJ2VHhCdWZmZXI7CisKKy8vIGZvcm1hdCBvZiBhIHJ4LWJ1ZmZlcgordHlwZWRlZiBzdHJ1Y3QgX3RFZHJ2UnhCdWZmZXIgeworCXRFZHJ2QnVmZmVySW5GcmFtZSBtX0J1ZmZlckluRnJhbWU7CS8vIE9VVCBwb3NpdGlvbiBvZiByZWNlaXZlZCBidWZmZXIgaW4gYW4gZXRoZXJuZXQtZnJhbWUKKwl1bnNpZ25lZCBpbnQgbV91aVJ4TXNnTGVuOwkvLyBPVVQ6IGxlbmd0aCBvZiByZWNlaXZlZCBidWZmZXIgKHdpdGhvdXQgQ1JDKQorCUJZVEUgKm1fcGJCdWZmZXI7CS8vIE9VVDogcG9pbnRlciB0byB0aGUgYnVmZmVyLCBzZXQgYnkgZXRoZXJuZXRkcml2ZXIKKwl0RXBsTmV0VGltZSBtX05ldFRpbWU7CS8vIE9VVDogVGltZXN0YW1wIG9mIGVuZCBvZiByZWNlaXB0aW9uCisKK30gdEVkcnZSeEJ1ZmZlcjsKKworLy90eXBlZGVmIHZvaWQgKCp0RWRydlJ4SGFuZGxlcikgKEJZVEUgYkJ1ZmZlckluRnJhbWVfcCwgdEJ1ZmZlckRlc2NyICogcGJCdWZmZXJfcCk7CisvL3R5cGVkZWYgdm9pZCAoKnRFZHJ2UnhIYW5kbGVyKSAoQllURSBiQnVmZmVySW5GcmFtZV9wLCBCWVRFICogcGJFdGhlcm5ldERhdGFfcCwgV09SRCB3RGF0YUxlbl9wKTsKK3R5cGVkZWYgdm9pZCAoKnRFZHJ2UnhIYW5kbGVyKSAodEVkcnZSeEJ1ZmZlciAqIHBSeEJ1ZmZlcl9wKTsKK3R5cGVkZWYgdm9pZCAoKnRFZHJ2VHhIYW5kbGVyKSAodEVkcnZUeEJ1ZmZlciAqIHBUeEJ1ZmZlcl9wKTsKKworLy8gZm9ybWF0IG9mIGluaXQgc3RydWN0dXJlCit0eXBlZGVmIHN0cnVjdCB7CisJQllURSBtX2FiTXlNYWNBZGRyWzZdOwkvLyB0aGUgb3duIE1BQyBhZGRyZXNzCisKKy8vICAgIEJZVEUgICAgICAgICAgICBtX2JOb09mUnhCdWZmRGVzY3I7ICAgICAvLyBudW1iZXIgb2YgZW50cmllcyBpbiByeCBidWZmZXJkZXNjcmlwdG9yIHRhYmxlCisvLyAgICB0QnVmZmVyRGVzY3IgKiAgbV9wUnhCdWZmRGVzY3JUYWJsZTsgICAgLy8gcnggYnVmZmVyZGVzY3JpcHRvciB0YWJsZQorLy8gICAgV09SRCAgICAgICAgICAgIG1fd1J4QnVmZmVyU2l6ZTsgICAgICAgIC8vIHNpemUgb2YgdGhlIHdob2xlIHJ4IGJ1ZmZlcgorCisJdEVkcnZSeEhhbmRsZXIgbV9wZm5SeEhhbmRsZXI7CisJdEVkcnZUeEhhbmRsZXIgbV9wZm5UeEhhbmRsZXI7CisKK30gdEVkcnZJbml0UGFyYW07CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIEVkcnZJbml0KHRFZHJ2SW5pdFBhcmFtICogcEVkcnZJbml0UGFyYW1fcCk7CisKK3RFcGxLZXJuZWwgRWRydlNodXRkb3duKHZvaWQpOworCit0RXBsS2VybmVsIEVkcnZEZWZpbmVSeE1hY0FkZHJFbnRyeShCWVRFICogcGJNYWNBZGRyX3ApOwordEVwbEtlcm5lbCBFZHJ2VW5kZWZpbmVSeE1hY0FkZHJFbnRyeShCWVRFICogcGJNYWNBZGRyX3ApOworCisvL3RFcGxLZXJuZWwgRWRydkRlZmluZVVuaWNhc3RFbnRyeSAgICAgKEJZVEUgKiBwYlVDRW50cnlfcCk7CisvL3RFcGxLZXJuZWwgRWRydlVuZGZpbmVVbmljYXN0RW50cnkgICAgKEJZVEUgKiBwYlVDRW50cnlfcCk7CisKK3RFcGxLZXJuZWwgRWRydkFsbG9jVHhNc2dCdWZmZXIodEVkcnZUeEJ1ZmZlciAqIHBCdWZmZXJfcCk7Cit0RXBsS2VybmVsIEVkcnZSZWxlYXNlVHhNc2dCdWZmZXIodEVkcnZUeEJ1ZmZlciAqIHBCdWZmZXJfcCk7CisKKy8vdEVwbEtlcm5lbCBFZHJ2V3JpdGVNc2cgICAgICAgICAgICAgICAodEJ1ZmZlckRlc2NyICogcGJCdWZmZXJfcCk7Cit0RXBsS2VybmVsIEVkcnZTZW5kVHhNc2codEVkcnZUeEJ1ZmZlciAqIHBCdWZmZXJfcCk7Cit0RXBsS2VybmVsIEVkcnZUeE1zZ1JlYWR5KHRFZHJ2VHhCdWZmZXIgKiBwQnVmZmVyX3ApOwordEVwbEtlcm5lbCBFZHJ2VHhNc2dTdGFydCh0RWRydlR4QnVmZmVyICogcEJ1ZmZlcl9wKTsKKworLy90RXBsS2VybmVsIEVkcnZSZWFkTXNnICAgICAgICAgICAgICAgICh2b2lkKTsKKworLy8gaW50ZXJydXB0IGhhbmRsZXIgY2FsbGVkIGJ5IHRhcmdldCBzcGVjaWZpYyBpbnRlcnJ1cHQgaGFuZGxlcgordm9pZCBFZHJ2SW50ZXJydXB0SGFuZGxlcih2b2lkKTsKKworI2VuZGlmIC8vICNpZm5kZWYgX0VEUlZfSF8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwvZ2xvYmFsLmggYi9kcml2ZXJzL3N0YWdpbmcvZXBsL2dsb2JhbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlMTY3MTYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL2dsb2JhbC5oCkBAIC0wLDAgKzEsMTM5MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgIGdsb2JhbCBwcm9qZWN0IGRlZmluaXRpb24gZmlsZQorCisgICAgMTIuMDYuMTk5OCAgIC1ycworICAgIDExLjAyLjIwMDIgICByLmQuIEVyd2VpdGVydW5nZW4sIEVyZ2Flbnp1bmdlbgorICAgIDIwLjA4LjIwMDIgICBTWVMgVEVDIGVsZWN0cm9uaWMgLWFzCisgICAgICAgICAgICAgICAgIERlZmluaXRpb24gU2NobHVlc3NlbHdvcnQgJ0dFTkVSSUMnCisgICAgICAgICAgICAgICAgIGZ1ZXIgZGFzIEVyemV1Z2VuIHZvbiBHZW5lcmljIFBvaW50ZXIKKyAgICAyOC4wOC4yMDAyICAgci5kLiBlcndlaXRlcnRlciBTWVMgVEVDIERlYnVnIENvZGUKKyAgICAxNi4wOS4yMDAyICAgci5kLiBrb21wbGV0dGUgVWViZXJzZXR6dW5nIGluIEVuZ2xpc2NoCisgICAgMTEuMDQuMjAwMyAgIGYuai4gRXJnYWVuenVuZyBmdWVyIE1pdHN1YmlzaGkgTkMzMCBDb21waWxlcgorICAgIDE3LjA2LjIwMDMgICAtcnMgIERlZmluaXRpb24gdm9uIEJhc2lzdHlwZW4gaW4gPCNpZm5kZWYgX1dJTkRFRl8+IGdlc2V0enQKKyAgICAxNi4wNC4yMDA0ICAgci5kLiBFcmdhZW56dW5nIGZ1ZXIgQm9ybGFuZCBDKysgQnVpbGRlcgorICAgIDMwLjA4LjIwMDQgICAtcnMgIFRSQUNFNSBlaW5nZWb8Z3QKKyAgICAyMy4xMi4yMDA1ICAgZC5rLiBEZWZpbml0aW9ucyBmb3IgSUFSIGNvbXBpbGVyCisKKyAgICAkSWQ6IGdsb2JhbC5oLHYgMS42IDIwMDgvMTEvMDcgMTM6NTU6NTYgRC5LcnVlZ2VyIEV4cCAkCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX0dMT0JBTF9IXworI2RlZmluZSBfR0xPQkFMX0hfCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgZWxlbWVudHMgb2YgZGVmaW5lcyBmb3IgZGV2ZWxvcG1lbnQgc3lzdGVtCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyB0aGVzZSBkZWZpbmVzIGFyZSBuZWNlc3NhcnkgdG8gY2hlY2sgc29tZSBvZiBjaGFyYWN0ZXJpc3RpY3Mgb2YgdGhlIGRldmVsb3BtZW50IHN5c3RlbQorI2RlZmluZSBfREVWX0JJR0VORF8gICAgICAgICAgICAweDgwMDAwMDAwTAkvLyBiaWcgZW5kaWFuIChtb3Rvcm9sbGEgZm9ybWF0KQorI2RlZmluZSBfREVWX0FMSUdOTUVOVF80XyAgICAgICAweDAwNDAwMDAwTAkvLyAgICAgICAgICAgICAgICAgIHRoZSBDUFUgbmVlZHMgYWxpZ25tZW50IG9mIDQgYnl0ZXMKKyNkZWZpbmUgX0RFVl9PTkxZX0lOVF9NQUlOXyAgICAgMHgwMDAwNDAwMEwJLy8gICAgICAgICAgICAgICAgICB0aGUgY29tcGlsZXIgbmVlZHMgImludCBtYWluKGludCkiIGluc3RlYWQgb2YgInZvaWQgbWFpbih2b2lkKSIKKyNkZWZpbmUgX0RFVl9DT01NQV9FWFRfICAgICAgICAgMHgwMDAwMjAwMEwJLy8gICAgICAgICAgICAgICAgICBzdXBwb3J0IG9mIGxhc3QgY29tbWEgaW4gc3RydWN0IHByZWRlZmluaXRpb24KKyNkZWZpbmUgX0RFVl82NEJJVF9TVVBQT1JUXyAgICAgMHgwMDAwMTAwMEwJLy8gICAgICAgICAgICAgICAgICBzdXBwb3J0IG9mIDY0IGJpdCBvcGVyYXRpb25zCisjZGVmaW5lIF9ERVZfQklUNjRfICAgICAgICAgICAgIDB4MDAwMDA0MDBMCS8vIGNvdW50IG9mIGJpdHM6ICAgNjQgYml0CisjZGVmaW5lIF9ERVZfQklUMzJfICAgICAgICAgICAgIDB4MDAwMDAzMDBMCS8vICAgICAgICAgICAgICAgICAgMzIgYml0CisjZGVmaW5lIF9ERVZfQklUMTZfICAgICAgICAgICAgIDB4MDAwMDAyMDBMCS8vICAgICAgICAgICAgICAgICAgMTYgYml0CisjZGVmaW5lIF9ERVZfQklUOF8gICAgICAgICAgICAgIDB4MDAwMDAxMDBMCS8vICAgICAgICAgICAgICAgICAgOCBiaXQKKyNkZWZpbmUgX0RFVl9SVkNUX0FSTV8gICAgICAgICAgMHgwMDAwMDAxQ0wJLy8gICAgICAgICAgICAgICAgICBSZWFsVmlldyBBUk0KKyNkZWZpbmUgX0RFVl9SRU5FU0FTTTMyQyAgICAgICAgMHgwMDAwMDAxQkwJLy8gY29tcGlsZXIgZnJvbTogICBSZW5lc2FzCisjZGVmaW5lIF9ERVZfR05VQ19NSVBTMl8gICAgICAgIDB4MDAwMDAwMUFMCS8vICAgICAgICAgICAgICAgICAgR05VIGZvciBNSVBTMgorI2RlZmluZSBfREVWX01QTEFCX0MzMF8gICAgICAgICAweDAwMDAwMDE5TAkvLyAgICAgICAgICAgICAgICAgIE1QTEFCIEMzMCBmb3IgTWljcm9jaGlwIGRzUElDMzNGIHNlcmllcworI2RlZmluZSBfREVWX0dOVUNfVENfICAgICAgICAgICAweDAwMDAwMDE4TAkvLyAgICAgICAgICAgICAgICAgIEdOVSBmb3IgSW5maW5lb24gVHJpQ29yZQorI2RlZmluZSBfREVWX0dOVUNfWDg2XyAgICAgICAgICAweDAwMDAwMDE3TAkvLyAgICAgICAgICAgICAgICAgIEdOVSBmb3IgSTM4NgorI2RlZmluZSBfREVWX0lBUl9BUk1fICAgICAgICAgICAweDAwMDAwMDE2TAkvLyAgICAgICAgICAgICAgICAgIEFSTSBJQVIgQy9DKysgQ29tcGlsZXIKKyNkZWZpbmUgX0RFVl9QQVJBREdNX1g4NiAgICAgICAgMHgwMDAwMDAxNUwJLy8gICAgICAgICAgICAgICAgICBQYXJhZGlnbSBDL0MrKyBmb3IgQmVjayAxeDMKKyNkZWZpbmUgX0RFVl9HTlVDX0NGXyAgICAgICAgICAgMHgwMDAwMDAxNEwJLy8gICAgICAgICAgICAgICAgICBHTlUgZm9yIENvbGRmaXJlCisjZGVmaW5lIF9ERVZfS0VJTF9BUk1fICAgICAgICAgIDB4MDAwMDAwMTNMCS8vICAgICAgICAgICAgICAgICAgS2VpbCBBUk0KKyNkZWZpbmUgX0RFVl9NU0VWQ18gICAgICAgICAgICAgMHgwMDAwMDAxMkwJLy8gICAgICAgICAgICAgICAgICBNaWNyb3NvZnQgZW1iZWRkZWQgVmlzdWFsIEMvQysrCisjZGVmaW5lIF9ERVZfSElHSFRFQ19HTlVDX1g4Nl8gIDB4MDAwMDAwMTFMCS8vICAgICAgICAgICAgICAgICAgSGlnaHRlYyBlbGYzODYgZ2NjCisjZGVmaW5lIF9ERVZfTVNWQ19SVFhfICAgICAgICAgIDB4MDAwMDAwMTBMCS8vICAgICAgICAgICAgICAgICAgVkM2MDAgKyBSVFgKKyNkZWZpbmUgX0RFVl9NU1ZDX1YxXzVfICAgICAgICAgMHgwMDAwMDAwRkwJLy8gICAgICAgICAgICAgICAgICBNaWNyb3NvZnQgVmlzdWFsIEMvQysrIFYxLjUKKyNkZWZpbmUgX0RFVl9HTlVDX0FSTTdfICAgICAgICAgMHgwMDAwMDAwRUwJLy8gICAgICAgICAgICAgICAgICBHTlUgQ29tcGlsZXIgZ2NjIGZvciBBUk03CisjZGVmaW5lIF9ERVZfTUVUUk9XRVJLU19DV18gICAgIDB4MDAwMDAwMERMCS8vICAgICAgICAgICAgICAgICAgTWV0cm93ZXJrcyBDb2RlIFdhcnJpb3IKKyNkZWZpbmUgX0RFVl9NSVRTVUJJU0hJTTE2Q18gICAgMHgwMDAwMDAwQ0wJLy9jb21waWxlciBmcm9tOiAgICBNaXRzdWJpc2hpCisjZGVmaW5lIF9ERVZfR05VQ19DMTZYXyAgICAgICAgIDB4MDAwMDAwMEJMCS8vICAgICAgICAgICAgICAgICAgR05VIENvbXBpbGVyIGdjYzE2NiBmb3IgSW5maW5lb24gQzE2eAorI2RlZmluZSBfREVWX0xJTlVYX0dDQ18gICAgICAgICAweDAwMDAwMDBBTAkvLyAgICAgICAgICAgICAgICAgIExpbnV4IEdOVSBDb21waWxlciBnY2MKKyNkZWZpbmUgX0RFVl9HTlVDX01QQzVYNSAgICAgICAgMHgwMDAwMDAwOUwJLy8gICAgICAgICAgICAgICAgICBHTlUgZm9yIE1vdG9yb2xhIFBQQzV4NQorI2RlZmluZSBfREVWX1RBU0tJTkdNMTZDXyAgICAgICAweDAwMDAwMDA4TAkvLyAgICAgICAgICAgICAgICAgIFRhc2tpbmcgZm9yIE1pdHN1YmlzaGkgTTE2QworI2RlZmluZSBfREVWX0ZVSklUU1VfICAgICAgICAgICAweDAwMDAwMDA3TAkvLyAgICAgICAgICAgICAgICAgIEZ1aml0c3UKKyNkZWZpbmUgX0RFVl9UQVNLSU5HOF8gICAgICAgICAgMHgwMDAwMDAwNkwJLy8gICAgICAgICAgICAgICAgICBUYXNraW5nIDgwNTEKKyNkZWZpbmUgX0RFVl9UQVNLSU5HMTZfICAgICAgICAgMHgwMDAwMDAwNUwJLy8gICAgICAgICAgICAgICAgICBUYXNraW5nIDE2NgorI2RlZmluZSBfREVWX0tFSUw4XyAgICAgICAgICAgICAweDAwMDAwMDA0TAkvLyAgICAgICAgICAgICAgICAgIEtlaWwgQzUxCisjZGVmaW5lIF9ERVZfS0VJTDE2XyAgICAgICAgICAgIDB4MDAwMDAwMDNMCS8vICAgICAgICAgICAgICAgICAgS2VpbCBDMTY2CisjZGVmaW5lIF9ERVZfQk9STEFORENfICAgICAgICAgIDB4MDAwMDAwMDJMCS8vICAgICAgICAgICAgICAgICAgQm9ybGFuZCBDL0MrKworI2RlZmluZSBfREVWX01TVkMxNl8gICAgICAgICAgICAweDAwMDAwMDAxTAkvLyAgICAgICAgICAgICAgICAgIE1pY3Jvc29mdCBWaXN1YWwgQy9DKysKKyNkZWZpbmUgX0RFVl9NU1ZDMzJfICAgICAgICAgICAgMHgwMDAwMDAwMEwJLy8gICAgICAgICAgICAgICAgICBNaWNyb3NvZnQgVmlzdWFsIEMvQysrCisKKy8vIHRoZXNlIGRlZmluZXMgY2FuIGJlIHVzZWQgdG8gbWFzayBwcmV2aW91cyBlbGVtZW50cworI2RlZmluZSBfREVWX01BU0tfQ09NUElMRVIgICAgICAweDAwMDAwMEZGTAorI2RlZmluZSBfREVWX01BU0tfQklUQ09VTlQgICAgICAweDAwMDAwRjAwTAorI2RlZmluZSBfREVWX01BU0tfQUREU1VQUE9SVCAgICAweDAwMDBGMDAwTAorI2RlZmluZSBfREVWX01BU0tfQUxJR05NRU5UICAgICAweDAwRjAwMDAwTAorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIGRlZmluZXMgZm9yIGRldmVsb3BtZW50IHN5c3RlbSAoREVWX1NZU1RFTSkgaW5jbHVkaW5nIHByZXZpb3VzIGVsZW1lbnRzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZGVmaW5lIF9ERVZfV0lOMTZfICAgICAgICAgICAgIChfREVWX0JJVDE2XyB8IF9ERVZfTVNWQzE2XyAgICAgICAgICAgICAgICAgICkKKyNkZWZpbmUgX0RFVl9XSU4zMl8gICAgICAgICAgICAgKF9ERVZfQklUMzJfIHwgX0RFVl9NU1ZDMzJfICAgICAgICAgICAgICAgICAgIHwgX0RFVl82NEJJVF9TVVBQT1JUXyB8IF9ERVZfQ09NTUFfRVhUXykKKyNkZWZpbmUgX0RFVl9NU1ZDX0RPU18gICAgICAgICAgKF9ERVZfQklUMzJfIHwgX0RFVl9NU1ZDX1YxXzVfICAgICAgICAgICAgICAgKQorI2RlZmluZSBfREVWX0JPUkxBTkRfRE9TXyAgICAgICAoX0RFVl9CSVQzMl8gfCBfREVWX0JPUkxBTkRDXyAgICAgICAgICAgICAgICApCS8vfCBfREVWXzY0QklUX1NVUFBPUlRfIHwgX0RFVl9DT01NQV9FWFRfKQorI2RlZmluZSBfREVWX0tFSUxfQzUxWF8gICAgICAgICAoX0RFVl9CSVQ4XyAgfCBfREVWX0tFSUw4XyAgICAgfCBfREVWX0JJR0VORF8gfCBfREVWX0NPTU1BX0VYVF8pCS8vIGF0IGxlYXN0IEM1MSB2ZXJzaW9uIDcuMDUgc3VwcG9ydHMgY29tbWEgZXh0ZW5zaW9uCisjZGVmaW5lIF9ERVZfS0VJTF9DMTZYXyAgICAgICAgIChfREVWX0JJVDE2XyB8IF9ERVZfS0VJTDE2XyAgICAgICAgICAgICAgICAgICB8IF9ERVZfQ09NTUFfRVhUXykJLy8gYXQgbGVhc3QgQzE2NiB2ZXJzaW9uIDUuMDMgc3VwcG9ydHMgY29tbWEgZXh0ZW5zaW9uCisjZGVmaW5lIF9ERVZfVEFTS0lOR19DNTFYXyAgICAgIChfREVWX0JJVDhfICB8IF9ERVZfVEFTS0lORzhfICB8IF9ERVZfQklHRU5EXykKKyNkZWZpbmUgX0RFVl9UQVNLSU5HX0MxNlhfICAgICAgKF9ERVZfQklUMTZfIHwgX0RFVl9UQVNLSU5HMTZfICAgICAgICAgICAgICAgKQorI2RlZmluZSBfREVWX0ZVSklUU1VfRjU5MF8gICAgICAoX0RFVl9CSVQ4XyAgfCBfREVWX0ZVSklUU1VfICAgICAgICAgICAgICAgICAgfCBfREVWX0NPTU1BX0VYVF8pCS8vIHNvZnR1bmUgaXMgbm90IGFibGUgdG8gc3VwcG9ydCA2NCBiaXQgdmFyaWFibGVzIFFXT1JEICEhIQorLy9mLmouMjkuMDQuMDMgTTE2QyBrYW5uIGVmZmVrdGl2IG1pdCBCeXRlcyB1bWdlaGVuCisvLyNkZWZpbmUgX0RFVl9UQVNLSU5HX00xNkNfICAgICAgKF9ERVZfQklUMTZfIHwgX0RFVl9UQVNLSU5HTTE2Q18gICAgICAgICAgICAgKQorI2RlZmluZSBfREVWX1RBU0tJTkdfTTE2Q18gICAgICAoX0RFVl9CSVQ4XyAgfCBfREVWX1RBU0tJTkdNMTZDXyAgICAgICAgICAgICApCisjZGVmaW5lIF9ERVZfTUlUU1VCSVNISV9NMTZDXyAgIChfREVWX0JJVDhfICB8IF9ERVZfTUlUU1VCSVNISU0xNkNfICAgICAgICAgICkKKyNkZWZpbmUgX0RFVl9HTlVfTVBDNVg1XyAgICAgICAgKF9ERVZfQklUMzJfIHwgX0RFVl9HTlVDX01QQzVYNXwgX0RFVl9CSUdFTkRfIHwgX0RFVl82NEJJVF9TVVBQT1JUXyB8IF9ERVZfQ09NTUFfRVhUXykKKyNkZWZpbmUgX0RFVl9MSU5VWF8gICAgICAgICAgICAgKF9ERVZfQklUMzJfIHwgX0RFVl9MSU5VWF9HQ0NfICAgICAgICAgICAgICAgIHwgX0RFVl82NEJJVF9TVVBQT1JUXyB8IF9ERVZfQ09NTUFfRVhUXykKKyNkZWZpbmUgX0RFVl9HTlVfQzE2WF8gICAgICAgICAgKF9ERVZfQklUMTZfIHwgX0RFVl9HTlVDX0MxNlhfICAgICAgICAgICAgICAgKQkvL3wgX0RFVl9DT01NQV9FWFRfKQorI2RlZmluZSBfREVWX01DV19NUEM1WDVfICAgICAgICAoX0RFVl9CSVQzMl8gfCBfREVWX01FVFJPV0VSS1NfQ1dfICAgICAgICAgICApCS8vfCBfREVWXzY0QklUX1NVUFBPUlRfIHwgX0RFVl9DT01NQV9FWFRfKQorI2RlZmluZSBfREVWX0dOVV9BUk03XyAgICAgICAgICAoX0RFVl9CSVQzMl8gfCBfREVWX0dOVUNfQVJNN18gICAgICAgICAgICAgICAgfCBfREVWXzY0QklUX1NVUFBPUlRfIHwgX0RFVl9DT01NQV9FWFRfIHwgX0RFVl9PTkxZX0lOVF9NQUlOXykKKyNkZWZpbmUgX0RFVl9XSU4zMl9SVFhfICAgICAgICAgKF9ERVZfQklUMzJfIHwgX0RFVl9NU1ZDX1JUWF8gICAgICAgICAgICAgICAgKQkvL3wgX0RFVl82NEJJVF9TVVBQT1JUXyB8IF9ERVZfQ09NTUFfRVhUXykKKyNkZWZpbmUgX0RFVl9ISUdIVEVDX1g4Nl8gICAgICAgKF9ERVZfQklUMzJfIHwgX0RFVl9ISUdIVEVDX0dOVUNfWDg2XyAgICAgICAgKQkvL3wgX0RFVl82NEJJVF9TVVBQT1JUXyB8IF9ERVZfQ09NTUFfRVhUXykKKyNkZWZpbmUgX0RFVl9XSU5fQ0VfICAgICAgICAgICAgKF9ERVZfQklUMzJfIHwgX0RFVl9NU0VWQ18gICAgICAgICAgICAgICAgICAgKQkvL3wgX0RFVl82NEJJVF9TVVBQT1JUXyB8IF9ERVZfQ09NTUFfRVhUXykKKyNkZWZpbmUgX0RFVl9LRUlMX0NBUk1fICAgICAgICAgKF9ERVZfQklUMzJfIHwgX0RFVl9LRUlMX0FSTV8gICAgICAgICAgICAgICAgIHwgX0RFVl82NEJJVF9TVVBQT1JUXyB8IF9ERVZfQ09NTUFfRVhUXykKKyNkZWZpbmUgX0RFVl9JQVJfQ0FSTV8gICAgICAgICAgKF9ERVZfQklUMzJfIHwgX0RFVl9JQVJfQVJNXyAgICAgICAgICAgICAgICAgIHwgX0RFVl82NEJJVF9TVVBQT1JUXyB8IF9ERVZfQ09NTUFfRVhUXykKKyNkZWZpbmUgX0RFVl9SVkNUX0NBUk1fICAgICAgICAgKF9ERVZfQklUMzJfIHwgX0RFVl9SVkNUX0FSTV8gICAgICAgICAgICAgICAgIHwgX0RFVl82NEJJVF9TVVBQT1JUXyB8IF9ERVZfQ09NTUFfRVhUXyB8IF9ERVZfT05MWV9JTlRfTUFJTl8pCisjZGVmaW5lIF9ERVZfTUNXX01DRjVYWFhfICAgICAgIChfREVWX0JJVDMyXyB8IF9ERVZfTUVUUk9XRVJLU19DV18gICAgICAgICAgICkJLy98IF9ERVZfNjRCSVRfU1VQUE9SVF8gfCBfREVWX0NPTU1BX0VYVF8pCisjZGVmaW5lIF9ERVZfR05VX0NGNTI4Ml8gICAgICAgIChfREVWX0JJVDMyXyB8IF9ERVZfR05VQ19DRl8gICB8IF9ERVZfQklHRU5EXykKKyNkZWZpbmUgX0RFVl9QQVJfQkVDSzFYM18gICAgICAgKF9ERVZfQklUMTZfIHwgX0RFVl9QQVJBREdNX1g4NikKKyNkZWZpbmUgX0RFVl9HTlVfQ0Y1NDhYXyAgICAgICAgKF9ERVZfQklUMzJfIHwgX0RFVl9HTlVDX0NGXyAgIHwgX0RFVl9CSUdFTkRfIHwgX0RFVl82NEJJVF9TVVBQT1JUXyB8IF9ERVZfQ09NTUFfRVhUXykKKyNkZWZpbmUgX0RFVl9HTlVfSTM4Nl8gICAgICAgICAgKF9ERVZfQklUMzJfIHwgX0RFVl9HTlVDX1g4Nl8gICAgICAgICAgICAgICAgIHwgX0RFVl82NEJJVF9TVVBQT1JUXyB8IF9ERVZfQ09NTUFfRVhUXyB8IF9ERVZfT05MWV9JTlRfTUFJTl8pCisjZGVmaW5lIF9ERVZfR05VX1RSSUNPUkVfICAgICAgIChfREVWX0JJVDMyXyB8IF9ERVZfR05VQ19UQ18gICAgICAgICAgICAgICAgICB8IF9ERVZfNjRCSVRfU1VQUE9SVF8gfCBfREVWX0NPTU1BX0VYVF8gfCBfREVWX09OTFlfSU5UX01BSU5fIHwgX0RFVl9BTElHTk1FTlRfNF8pCisjZGVmaW5lIF9ERVZfTVBMQUJfRFNQSUMzM0ZfICAgIChfREVWX0JJVDE2XyB8IF9ERVZfTVBMQUJfQzMwXyAgICAgICAgICAgICAgICkJLy98IF9ERVZfQ09NTUFfRVhUXykKKyNkZWZpbmUgX0RFVl9HTlVfTUlQU0VMXyAgICAgICAgKF9ERVZfQklUMzJfIHwgX0RFVl9HTlVDX01JUFMyXyAgICAgfCBfREVWX0JJR0VORF8gfCBfREVWXzY0QklUX1NVUFBPUlRfIHwgX0RFVl9DT01NQV9FWFRfIHwgX0RFVl9PTkxZX0lOVF9NQUlOXykKKworI2RlZmluZSBfREVWX1JFTkVTQVNfTTMyQ18gICAgICAoX0RFVl9CSVQzMl8gfCBfREVWX1JFTkVTQVNNMzJDKQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIHVzZWZ1bGwgbWFjcm9zCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZGVmaW5lIENIRUNLX0lGX09OTFlfSU5UX01BSU4oKSAgICAoREVWX1NZU1RFTSAmIF9ERVZfT05MWV9JTlRfTUFJTl8pCisjZGVmaW5lIENIRUNLX01FTU9SWV9BTElOTUVOVCgpICAgICAoREVWX1NZU1RFTSAmIF9ERVZfTUFTS19BTElHTk1FTlQpCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgZGVmaW5lcyBmb3IgdGFyZ2V0IHN5c3RlbSAoVEFSR0VUX1NZU1RFTSkKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNkZWZpbmUgX0RPU18gICAgICAgICAgICAgICgxNiArIDB4MTAwMDApCisjZGVmaW5lIF9XSU4xNl8gICAgICAgICAgICAgMTYKKyNkZWZpbmUgX1dJTjMyXyAgICAgICAgICAgICAzMgorI2RlZmluZSBfV0lOQ0VfICAgICAgICAgICAgKDMyICsgMHgyMDAwMCkKKyNkZWZpbmUgX05PX09TXyAgICAgICAgICAgICAgMAorI2RlZmluZSBfTElOVVhfICAgICAgICAgICAgICAxCisjZGVmaW5lIF9QWFJPU18gICAgICAgICAgICAgIDIKKyNkZWZpbmUgX0VDT1NQUk9fICAgICAgICAgICAgMworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIGRlZmluaXRpb25zIGZvciBmdW5jdGlvbiBpbmxpbmluZworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2RlZmluZSBJTkxJTkVfRlVOQ1RJT04JCS8vIGVtcHR5IGRlZmluZQorI3VuZGVmICBJTkxJTkVfRU5BQkxFRAkJLy8gZGlzYWJsZSBhY3R1YWwgaW5saW5pbmcgb2YgZnVuY3Rpb25zCisjdW5kZWYgIElOTElORV9GVU5DVElPTl9ERUYJLy8gZGlzYWJsZSBpbmxpbmluZyBmb3IgYWxsIGNvbXBpbGVycyBwZXIgZGVmYXVsdAorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIGRlZmluaXRpb25zIGZvciBLZWlsIEM1MQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmZGVmICBfX0M1MV9fCisKKyNkZWZpbmUgVEFSR0VUX1NZU1RFTSAgIF9OT19PU18KKyNkZWZpbmUgREVWX1NZU1RFTSAgICAgIF9ERVZfS0VJTF9DNTFYXworCisjcHJhZ21hIERFQlVHIE9CSkVDVEVYVEVORAorI3ByYWdtYSBXQVJOSU5HTEVWRUwoMikJCS8vIG1heGltdW0gd2FybmluZyBsZXZlbAorCisjZGVmaW5lIE5FQVIgICAgICAgICAgICBpZGF0YQkvLyB2YXJpYWJsZXMgbWFwcGVkIHRvIGludGVybmFsIGRhdGEgc3RvcmFnZSBsb2NhdGlvbgorI2RlZmluZSBGQVIgICAgICAgICAgICAgeGRhdGEJLy8gdmFyaWFibGVzIG1hcHBlZCB0byBleHRlcm5hbCBkYXRhIHN0b3JhZ2UgbG9jYXRpb24KKyNkZWZpbmUgQ09OU1QgICAgICAgICAgIGNvbnN0CS8vIHZhcmlhYmxlcyBtYXBwZWQgdG8gUk9NIChpLmUuIGZsYXNoKQorI2RlZmluZSBST00gICAgICAgICAgICAgY29kZQkvLyBjb2RlIG9yIHZhcmlhYmxlcyBtYXBwZWQgdG8gUk9NIChpLmUuIGZsYXNoKQorCQkJCQkvLyB1c2FnZTogQ09OU1QgQllURSBST00gZm9vID0gMHgwMDsKKyNkZWZpbmUgSFdBQ0MgICAgICAgICAgIHhkYXRhCS8vIGhhcmR3YXJlIGFjY2VzcyB0aHJvdWdoIGV4dGVybmFsIG1lbW9yeSAoaS5lLiBDQU4pCisjZGVmaW5lIExBUkdFICAgICAgICAgICBsYXJnZQkvLyBmdW5jdGlvbnMgc2V0IHBhcmFtZXRlcnMgdG8gZXh0ZXJuYWwgZGF0YSBzdG9yYWdlIGxvY2F0aW9uCisKKyAgICAvLyBUaGVzZSB0eXBlcyBjYW4gYmUgYWRqdXN0ZWQgYnkgdXNlcnMgdG8gbWF0Y2ggYXBwbGljYXRpb24gcmVxdWlyZW1lbnRzLiBUaGUgZ29hbCBpcyB0bworICAgIC8vIG1pbmltaXplIGNvZGUgbWVtb3J5IGFuZCBtYXhpbWl6ZSBzcGVlZC4KKyNkZWZpbmUgR0VORVJJQwkJCS8vIGdlbmVyaWMgcG9pbnRlciB0byBwb2ludCB0byBhcHBsaWNhdGlvbiBkYXRhCisJCQkJCS8vIFZhcmlhYmxlcyB3aXRoIHRoaXMgYXR0cmlidXRlIGNhbiBiZSBsb2NhdGVkIGluIGV4dGVybmFsCisJCQkJCS8vIG9yIGludGVybmFsIGRhdGEgbWVtb3J5LgorI2RlZmluZSBNRU0gICAgICAgICAgICAgeGRhdGEJLy8gTWVtb3J5IGF0dHJpYnV0ZSB0byBvcHRpbWl6ZSBzcGVlZCBhbmQgY29kZSBvZiBwb2ludGVyIGFjY2Vzcy4KKworI2RlZmluZSBSRUVOVFJBTlQgICAgICAgcmVlbnRyYW50CisjZGVmaW5lIFBVQkxJQworCisjaWZuZGVmIE5ERUJVRworI2luY2x1ZGUgPHN0ZGlvLmg+CQkvLyBwcm90b3R5cGUgcHJpbnRmKCkgKGZvciBUUkFDRSkKKyNkZWZpbmUgVFJBQ0UgIHByaW50ZgorI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgZGVmaW5pdGlvbnMgZm9yIEdOVSBDb21waWxlciBmb3IgSW5maW5lb24gQzE2eAorLy8gIC0gaXQgaGF2ZSB0byBiZSBiZWZvciBLZWlsIChpdCBoYXMgX19DMTY2X18gdG9vKQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNlbGlmICBkZWZpbmVkIChfX0dOVUNfXykgJiYgZGVmaW5lZCAoX19DMTY2X18pCisKKyNkZWZpbmUgVEFSR0VUX1NZU1RFTSAgIF9OT19PU18KKyNkZWZpbmUgREVWX1NZU1RFTSAgICAgIF9ERVZfR05VX0MxNlhfCisKKy8vICAgICNkZWZpbmUgTkVBUiAgICAgICAgICAgIGlkYXRhICAgICAgIC8vIHZhcmlhYmxlcyBtYXBwZWQgdG8gaW50ZXJuYWwgZGF0YSBzdG9yYWdlIGxvY2F0aW9uCisjZGVmaW5lIE5FQVIgICAgICAgICAgICBuZWFyCS8vIHZhcmlhYmxlcyBtYXBwZWQgdG8gaW50ZXJuYWwgZGF0YSBzdG9yYWdlIGxvY2F0aW9uCisvLyAgICAjZGVmaW5lIEZBUiAgICAgICAgICAgICB4aHVnZSAgICAgICAvLyB2YXJpYWJsZXMgbWFwcGVkIHRvIGV4dGVybmFsIGRhdGEgc3RvcmFnZSBsb2NhdGlvbgorI2RlZmluZSBGQVIgICAgICAgICAgICAgaHVnZQkvLyB2YXJpYWJsZXMgbWFwcGVkIHRvIGV4dGVybmFsIGRhdGEgc3RvcmFnZSBsb2NhdGlvbgorI2RlZmluZSBDT05TVCAgICAgICAgICAgY29uc3QJLy8gdmFyaWFibGVzIG1hcHBlZCB0byBST00gKGkuZS4gZmxhc2gpCisjZGVmaW5lIFJPTQkJCS8vIGNvZGUgb3IgdmFyaWFibGVzIG1hcHBlZCB0byBST00gKGkuZS4gZmxhc2gpCisJCQkJCS8vIHVzYWdlOiBDT05TVCBCWVRFIFJPTSBmb28gPSAweDAwOworLy8gICAgI2RlZmluZSBIV0FDQyAgICAgICAgICAgc2RhdGEgICAgICAgLy8gaGFyZHdhcmUgYWNjZXNzIHRocm91Z2ggZXh0ZXJuYWwgbWVtb3J5IChpLmUuIENBTikKKyNkZWZpbmUgSFdBQ0MgICAgICAgICAgIGh1Z2UJLy8gaGFyZHdhcmUgYWNjZXNzIHRocm91Z2ggZXh0ZXJuYWwgbWVtb3J5IChpLmUuIENBTikKKyNkZWZpbmUgTEFSR0UJCQkvLyBmdW5jdGlvbnMgc2V0IHBhcmFtZXRlcnMgdG8gZXh0ZXJuYWwgZGF0YSBzdG9yYWdlIGxvY2F0aW9uCisKKyAgICAvLyBUaGVzZSB0eXBlcyBjYW4gYmUgYWRqdXN0ZWQgYnkgdXNlcnMgdG8gbWF0Y2ggYXBwbGljYXRpb24gcmVxdWlyZW1lbnRzLiBUaGUgZ29hbCBpcyB0bworICAgIC8vIG1pbmltaXplIGNvZGUgbWVtb3J5IGFuZCBtYXhpbWl6ZSBzcGVlZC4KKy8vICAgICNkZWZpbmUgR0VORVJJQyAgICAgICAgIHhodWdlICAgICAgIC8vIGdlbmVyaWMgcG9pbnRlciB0byBwb2ludCB0byBhcHBsaWNhdGlvbiBkYXRhCisjZGVmaW5lIEdFTkVSSUMgICAgICAgICBodWdlCS8vIGdlbmVyaWMgcG9pbnRlciB0byBwb2ludCB0byBhcHBsaWNhdGlvbiBkYXRhCisJCQkJCS8vIFZhcmlhYmxlcyB3aXRoIHRoaXMgYXR0cmlidXRlIGNhbiBiZSBsb2NhdGVkIGluIGV4dGVybmFsCisJCQkJCS8vIG9yIGludGVybmFsIGRhdGEgbWVtb3J5LgorI2RlZmluZSBNRU0JCQkvLyBNZW1vcnkgYXR0cmlidXRlIHRvIG9wdGltaXplIHNwZWVkIGFuZCBjb2RlIG9mIHBvaW50ZXIgYWNjZXNzLgorCisjZGVmaW5lIFJFRU5UUkFOVAorI2RlZmluZSBQVUJMSUMKKworI2lmbmRlZiBOREVCVUcKKyNpbmNsdWRlIDxzdGRpby5oPgkJLy8gcHJvdG90eXBlIHByaW50ZigpIChmb3IgVFJBQ0UpCisjZGVmaW5lIFRSQUNFICBwcmludGYKKworI2RlZmluZSBBU1NFUlQocCkgIFwKKyAgICAgICAgICAgIGlmIChwKSAgICAgICAgIFwKKyAgICAgICAgICAgIHsgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICA7ICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGVsc2UgICAgICAgICAgIFwKKyAgICAgICAgICAgIHsgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBQUklOVEYwKCJBc3NlcnQgZmFpbGVkOiAiICNwICIgKGZpbGUgJXMgbGluZSAlZClcbiIsIF9fRklMRV9fLCAoaW50KSBfX0xJTkVfXyApOyBcCisgICAgICAgICAgICAgICAgd2hpbGUgKDEpOyBcCisgICAgICAgICAgICB9CisjZWxzZQorI2RlZmluZSBBU1NFUlQocCkKKyNlbmRpZgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIGRlZmluaXRpb25zIGZvciBLZWlsIEMxNjYKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZWxpZiAgZGVmaW5lZCAoX19DMTY2X18pCS8vIDI0LjAxLjIwMDUgci5kLjogS2VpbCBBUk03IG5lZWRzIGRpcmVjdGl2ZSAnZGVmaW5lZCcKKworI2RlZmluZSBUQVJHRVRfU1lTVEVNICAgX05PX09TXworI2RlZmluZSBERVZfU1lTVEVNICAgICAgX0RFVl9LRUlMX0MxNlhfCisKKyNwcmFnbWEgQ09ERQorI3ByYWdtYSBNT0QxNjcKKyNwcmFnbWEgTk9JTklUCisjcHJhZ21hIERFQlVHCisjcHJhZ21hIFdBUk5JTkdMRVZFTCgzKQkJLy8gbWF4aW11bSB3YXJuaW5nIGxldmVsCisjcHJhZ21hIFdBUk5JTkcgRElTQUJMRSA9IDQ3CS8vIHdhcm5pbmcgPHVucmVmZXJlbmNlZCBwYXJhbWV0ZXI+ID0gT0ZGCisjcHJhZ21hIFdBUk5JTkcgRElTQUJMRSA9IDM4CS8vIHdhcm5pbmcgPGVtcHR5IHRyYW5zbGF0aW9uIHVuaXQ+ID0gT0ZGCisvLyAgI3ByYWdtYSBXQVJOSU5HIERJU0FCTEUgPSAxMDIgICAgICAgLy8gd2FybmluZyA8ZGlmZmVyZW50IGNvbnN0L3ZvbGF0aWxlIHF1YWxpZmllcnM+ID0gT0ZGCisjcHJhZ21hIFdBUk5JTkcgRElTQUJMRSA9IDE3NAkvLyB3YXJuaW5nIDx1bnJlZmVyZW5jZWQgJ3N0YXRpYycgZnVuY3Rpb24+ID0gT0ZGCisjcHJhZ21hIFdBUk5JTkcgRElTQUJMRSA9IDE4MwkvLyB3YXJuaW5nIDxkZWFkIGFzc2lnbmVtZW50IGVsaW1pbmF0ZWQ+ID0gT0ZGCisKKyNkZWZpbmUgTkVBUiAgICAgICAgICAgIGlkYXRhCS8vIHZhcmlhYmxlcyBtYXBwZWQgdG8gaW50ZXJuYWwgZGF0YSBzdG9yYWdlIGxvY2F0aW9uCisjZGVmaW5lIEZBUiAgICAgICAgICAgICB4aHVnZQkvLyB2YXJpYWJsZXMgbWFwcGVkIHRvIGV4dGVybmFsIGRhdGEgc3RvcmFnZSBsb2NhdGlvbgorI2RlZmluZSBDT05TVCAgICAgICAgICAgY29uc3QJLy8gdmFyaWFibGVzIG1hcHBlZCB0byBST00gKGkuZS4gZmxhc2gpCisjZGVmaW5lIFJPTQkJCS8vIGNvZGUgb3IgdmFyaWFibGVzIG1hcHBlZCB0byBST00gKGkuZS4gZmxhc2gpCisJCQkJCS8vIHVzYWdlOiBDT05TVCBCWVRFIFJPTSBmb28gPSAweDAwOworLy8gICAgI2RlZmluZSBIV0FDQyAgICAgICAgICAgc2RhdGEgICAgICAgLy8gaGFyZHdhcmUgYWNjZXNzIHRocm91Z2ggZXh0ZXJuYWwgbWVtb3J5IChpLmUuIENBTikKKyNkZWZpbmUgSFdBQ0MgICAgICAgICAgIGh1Z2UJLy8gaGFyZHdhcmUgYWNjZXNzIHRocm91Z2ggZXh0ZXJuYWwgbWVtb3J5IChpLmUuIENBTikKKyNkZWZpbmUgTEFSR0UJCQkvLyBmdW5jdGlvbnMgc2V0IHBhcmFtZXRlcnMgdG8gZXh0ZXJuYWwgZGF0YSBzdG9yYWdlIGxvY2F0aW9uCisKKyAgICAvLyBUaGVzZSB0eXBlcyBjYW4gYmUgYWRqdXN0ZWQgYnkgdXNlcnMgdG8gbWF0Y2ggYXBwbGljYXRpb24gcmVxdWlyZW1lbnRzLiBUaGUgZ29hbCBpcyB0bworICAgIC8vIG1pbmltaXplIGNvZGUgbWVtb3J5IGFuZCBtYXhpbWl6ZSBzcGVlZC4KKyNkZWZpbmUgR0VORVJJQyAgICAgICAgIHhodWdlCS8vIGdlbmVyaWMgcG9pbnRlciB0byBwb2ludCB0byBhcHBsaWNhdGlvbiBkYXRhCisJCQkJCS8vIFZhcmlhYmxlcyB3aXRoIHRoaXMgYXR0cmlidXRlIGNhbiBiZSBsb2NhdGVkIGluIGV4dGVybmFsCisJCQkJCS8vIG9yIGludGVybmFsIGRhdGEgbWVtb3J5LgorI2RlZmluZSBNRU0JCQkvLyBNZW1vcnkgYXR0cmlidXRlIHRvIG9wdGltaXplIHNwZWVkIGFuZCBjb2RlIG9mIHBvaW50ZXIgYWNjZXNzLgorCisjZGVmaW5lIFJFRU5UUkFOVAorI2RlZmluZSBQVUJMSUMKKworI2lmbmRlZiBOREVCVUcKKyNpbmNsdWRlIDxzdGRpby5oPgkJLy8gcHJvdG90eXBlIHByaW50ZigpIChmb3IgVFJBQ0UpCisjZGVmaW5lIFRSQUNFICBwcmludGYKKyNlbmRpZgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIGRlZmluaXRpb25zIGZvciBNUExBQiBDMzAgZm9yIGRzUElDMzNGIHNlcmllcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNlbGlmICBkZWZpbmVkIChfX0MzMF9fKQorCisjZGVmaW5lIFRBUkdFVF9TWVNURU0gICBfTk9fT1NfCisjZGVmaW5lIERFVl9TWVNURU0gICAgICBfREVWX01QTEFCX0RTUElDMzNGXworCisjZGVmaW5lIE5FQVIJCQkvLyB2YXJpYWJsZXMgbWFwcGVkIHRvIGludGVybmFsIGRhdGEgc3RvcmFnZSBsb2NhdGlvbgorI2RlZmluZSBGQVIJCQkvLyB2YXJpYWJsZXMgbWFwcGVkIHRvIGV4dGVybmFsIGRhdGEgc3RvcmFnZSBsb2NhdGlvbgorI2RlZmluZSBDT05TVCAgICAgICAgY29uc3QJLy8gdmFyaWFibGVzIG1hcHBlZCB0byBST00gKGkuZS4gZmxhc2gpCisjZGVmaW5lIFJPTQkJCS8vIGNvZGUgb3IgdmFyaWFibGVzIG1hcHBlZCB0byBST00gKGkuZS4gZmxhc2gpCisJCQkJCS8vIHVzYWdlOiBDT05TVCBCWVRFIFJPTSBmb28gPSAweDAwOworI2RlZmluZSBIV0FDQwkJCS8vIGhhcmR3YXJlIGFjY2VzcyB0aHJvdWdoIGV4dGVybmFsIG1lbW9yeSAoaS5lLiBDQU4pCisjZGVmaW5lIExBUkdFCQkJLy8gZnVuY3Rpb25zIHNldCBwYXJhbWV0ZXJzIHRvIGV4dGVybmFsIGRhdGEgc3RvcmFnZSBsb2NhdGlvbgorCisgICAgLy8gVGhlc2UgdHlwZXMgY2FuIGJlIGFkanVzdGVkIGJ5IHVzZXJzIHRvIG1hdGNoIGFwcGxpY2F0aW9uIHJlcXVpcmVtZW50cy4gVGhlIGdvYWwgaXMgdG8KKyAgICAvLyBtaW5pbWl6ZSBjb2RlIG1lbW9yeSBhbmQgbWF4aW1pemUgc3BlZWQuCisjZGVmaW5lIEdFTkVSSUMJCQkvLyBnZW5lcmljIHBvaW50ZXIgdG8gcG9pbnQgdG8gYXBwbGljYXRpb24gZGF0YQorCQkJCQkvLyBWYXJpYWJsZXMgd2l0aCB0aGlzIGF0dHJpYnV0ZSBjYW4gYmUgbG9jYXRlZCBpbiBleHRlcm5hbAorCQkJCQkvLyBvciBpbnRlcm5hbCBkYXRhIG1lbW9yeS4KKyNkZWZpbmUgTUVNCQkJLy8gTWVtb3J5IGF0dHJpYnV0ZSB0byBvcHRpbWl6ZSBzcGVlZCBhbmQgY29kZSBvZiBwb2ludGVyIGFjY2Vzcy4KKworI2RlZmluZSBSRUVOVFJBTlQKKyNkZWZpbmUgUFVCTElDCisKKy8vICAgICNpZm5kZWYgUVdPUkQKKy8vICAgICAgICAjZGVmaW5lIFFXT1JEIGxvbmcgbG9uZworLy8gICAgI2VuZGlmCisKKyNpZm5kZWYgTkRFQlVHCisjaW5jbHVkZSA8c3RkaW8uaD4JCS8vIHByb3RvdHlwZSBwcmludGYoKSAoZm9yIFRSQUNFKQorI2RlZmluZSBUUkFDRSAgcHJpbnRmCisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBkZWZpbml0aW9ucyBmb3IgS2VpbCBBUk0KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZWxpZiAgZGVmaW5lZCAoX19DQV9fKQorCisjZGVmaW5lIFRBUkdFVF9TWVNURU0gICBfTk9fT1NfCisjZGVmaW5lIERFVl9TWVNURU0gICAgICBfREVWX0tFSUxfQ0FSTV8KKworI2RlZmluZSBORUFSCQkJLy8gdmFyaWFibGVzIG1hcHBlZCB0byBpbnRlcm5hbCBkYXRhIHN0b3JhZ2UgbG9jYXRpb24KKyNkZWZpbmUgRkFSCQkJLy8gdmFyaWFibGVzIG1hcHBlZCB0byBleHRlcm5hbCBkYXRhIHN0b3JhZ2UgbG9jYXRpb24KKyNkZWZpbmUgQ09OU1QgICAgICAgIGNvbnN0CS8vIHZhcmlhYmxlcyBtYXBwZWQgdG8gUk9NIChpLmUuIGZsYXNoKQorI2RlZmluZSBST00JCQkvLyBjb2RlIG9yIHZhcmlhYmxlcyBtYXBwZWQgdG8gUk9NIChpLmUuIGZsYXNoKQorCQkJCQkvLyB1c2FnZTogQ09OU1QgQllURSBST00gZm9vID0gMHgwMDsKKyNkZWZpbmUgSFdBQ0MJCQkvLyBoYXJkd2FyZSBhY2Nlc3MgdGhyb3VnaCBleHRlcm5hbCBtZW1vcnkgKGkuZS4gQ0FOKQorI2RlZmluZSBMQVJHRQkJCS8vIGZ1bmN0aW9ucyBzZXQgcGFyYW1ldGVycyB0byBleHRlcm5hbCBkYXRhIHN0b3JhZ2UgbG9jYXRpb24KKworICAgIC8vIFRoZXNlIHR5cGVzIGNhbiBiZSBhZGp1c3RlZCBieSB1c2VycyB0byBtYXRjaCBhcHBsaWNhdGlvbiByZXF1aXJlbWVudHMuIFRoZSBnb2FsIGlzIHRvCisgICAgLy8gbWluaW1pemUgY29kZSBtZW1vcnkgYW5kIG1heGltaXplIHNwZWVkLgorI2RlZmluZSBHRU5FUklDCQkJLy8gZ2VuZXJpYyBwb2ludGVyIHRvIHBvaW50IHRvIGFwcGxpY2F0aW9uIGRhdGEKKwkJCQkJLy8gVmFyaWFibGVzIHdpdGggdGhpcyBhdHRyaWJ1dGUgY2FuIGJlIGxvY2F0ZWQgaW4gZXh0ZXJuYWwKKwkJCQkJLy8gb3IgaW50ZXJuYWwgZGF0YSBtZW1vcnkuCisjZGVmaW5lIE1FTQkJCS8vIE1lbW9yeSBhdHRyaWJ1dGUgdG8gb3B0aW1pemUgc3BlZWQgYW5kIGNvZGUgb2YgcG9pbnRlciBhY2Nlc3MuCisKKyNkZWZpbmUgUkVFTlRSQU5UCisjZGVmaW5lIFBVQkxJQworCisjaWZuZGVmIFFXT1JECisjZGVmaW5lIFFXT1JEIGxvbmcgbG9uZworI2VuZGlmCisKKyNpZm5kZWYgTkRFQlVHCisjaW5jbHVkZSA8c3RkaW8uaD4JCS8vIHByb3RvdHlwZSBwcmludGYoKSAoZm9yIFRSQUNFKQorI2RlZmluZSBUUkFDRSAgcHJpbnRmCisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBkZWZpbml0aW9ucyBmb3IgUmVhbFZpZXcgQVJNIGNvbXBpbGF0aW9uIHRvb2xzIChwcm92aWRlZCBieSByZWNlbnQgS2VpbCBNaWNyb2NvbnRyb2xsZXIgRGV2ZWxvcG1lbnQgS2l0cykKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZWxpZiAgZGVmaW5lZCAoX19BUk1DQ19WRVJTSU9OKQorCisjZGVmaW5lIFRBUkdFVF9TWVNURU0gICBfTk9fT1NfCisjZGVmaW5lIERFVl9TWVNURU0gICAgICBfREVWX1JWQ1RfQ0FSTV8KKworI2RlZmluZSBORUFSCQkJLy8gdmFyaWFibGVzIG1hcHBlZCB0byBpbnRlcm5hbCBkYXRhIHN0b3JhZ2UgbG9jYXRpb24KKyNkZWZpbmUgRkFSCQkJLy8gdmFyaWFibGVzIG1hcHBlZCB0byBleHRlcm5hbCBkYXRhIHN0b3JhZ2UgbG9jYXRpb24KKyNkZWZpbmUgQ09OU1QgICAgICAgIGNvbnN0CS8vIHZhcmlhYmxlcyBtYXBwZWQgdG8gUk9NIChpLmUuIGZsYXNoKQorI2RlZmluZSBST00JCQkvLyBjb2RlIG9yIHZhcmlhYmxlcyBtYXBwZWQgdG8gUk9NIChpLmUuIGZsYXNoKQorCQkJCQkvLyB1c2FnZTogQ09OU1QgQllURSBST00gZm9vID0gMHgwMDsKKyNkZWZpbmUgSFdBQ0MJCQkvLyBoYXJkd2FyZSBhY2Nlc3MgdGhyb3VnaCBleHRlcm5hbCBtZW1vcnkgKGkuZS4gQ0FOKQorI2RlZmluZSBMQVJHRQkJCS8vIGZ1bmN0aW9ucyBzZXQgcGFyYW1ldGVycyB0byBleHRlcm5hbCBkYXRhIHN0b3JhZ2UgbG9jYXRpb24KKworICAgIC8vIFRoZXNlIHR5cGVzIGNhbiBiZSBhZGp1c3RlZCBieSB1c2VycyB0byBtYXRjaCBhcHBsaWNhdGlvbiByZXF1aXJlbWVudHMuIFRoZSBnb2FsIGlzIHRvCisgICAgLy8gbWluaW1pemUgY29kZSBtZW1vcnkgYW5kIG1heGltaXplIHNwZWVkLgorI2RlZmluZSBHRU5FUklDCQkJLy8gZ2VuZXJpYyBwb2ludGVyIHRvIHBvaW50IHRvIGFwcGxpY2F0aW9uIGRhdGEKKwkJCQkJLy8gVmFyaWFibGVzIHdpdGggdGhpcyBhdHRyaWJ1dGUgY2FuIGJlIGxvY2F0ZWQgaW4gZXh0ZXJuYWwKKwkJCQkJLy8gb3IgaW50ZXJuYWwgZGF0YSBtZW1vcnkuCisjZGVmaW5lIE1FTQkJCS8vIE1lbW9yeSBhdHRyaWJ1dGUgdG8gb3B0aW1pemUgc3BlZWQgYW5kIGNvZGUgb2YgcG9pbnRlciBhY2Nlc3MuCisKKyNkZWZpbmUgUkVFTlRSQU5UCisjZGVmaW5lIFBVQkxJQworCisjaWZuZGVmIFFXT1JECisjZGVmaW5lIFFXT1JEIGxvbmcgbG9uZworI2VuZGlmCisKKyNpZm5kZWYgTkRFQlVHCisjZGVmaW5lIEFTU0VSVChleHByKSAgICBpZiAoIShleHByKSkge1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBQ0UwICgiQXNzZXJ0aW9uIGZhaWxlZDogIiAjZXhwciApO1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKDEpO30KKyNlbHNlCisjZGVmaW5lIEFTU0VSVChleHByKQorI2VuZGlmCisKKyNpZm5kZWYgTkRFQlVHCisjaW5jbHVkZSA8c3RkaW8uaD4JCS8vIHByb3RvdHlwZSBwcmludGYoKSAoZm9yIFRSQUNFKQorI2RlZmluZSBUUkFDRSAgcHJpbnRmCisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBkZWZpbml0aW9ucyBmb3IgQVJNIElBUiBDIENvbXBpbGVyCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2VsaWYgIGRlZmluZWQgKF9fSUNDQVJNX18pCisKKyNkZWZpbmUgVEFSR0VUX1NZU1RFTSAgIF9OT19PU18KKyNkZWZpbmUgREVWX1NZU1RFTSAgICAgIF9ERVZfSUFSX0NBUk1fCisKKyNkZWZpbmUgTkVBUgkJCS8vIHZhcmlhYmxlcyBtYXBwZWQgdG8gaW50ZXJuYWwgZGF0YSBzdG9yYWdlIGxvY2F0aW9uCisjZGVmaW5lIEZBUgkJCS8vIHZhcmlhYmxlcyBtYXBwZWQgdG8gZXh0ZXJuYWwgZGF0YSBzdG9yYWdlIGxvY2F0aW9uCisjZGVmaW5lIENPTlNUICAgICAgICBjb25zdAkvLyB2YXJpYWJsZXMgbWFwcGVkIHRvIFJPTSAoaS5lLiBmbGFzaCkKKyNkZWZpbmUgUk9NCQkJLy8gY29kZSBvciB2YXJpYWJsZXMgbWFwcGVkIHRvIFJPTSAoaS5lLiBmbGFzaCkKKwkJCQkJLy8gdXNhZ2U6IENPTlNUIEJZVEUgUk9NIGZvbyA9IDB4MDA7CisjZGVmaW5lIEhXQUNDCQkJLy8gaGFyZHdhcmUgYWNjZXNzIHRocm91Z2ggZXh0ZXJuYWwgbWVtb3J5IChpLmUuIENBTikKKyNkZWZpbmUgTEFSR0UJCQkvLyBmdW5jdGlvbnMgc2V0IHBhcmFtZXRlcnMgdG8gZXh0ZXJuYWwgZGF0YSBzdG9yYWdlIGxvY2F0aW9uCisKKyAgICAvLyBUaGVzZSB0eXBlcyBjYW4gYmUgYWRqdXN0ZWQgYnkgdXNlcnMgdG8gbWF0Y2ggYXBwbGljYXRpb24gcmVxdWlyZW1lbnRzLiBUaGUgZ29hbCBpcyB0bworICAgIC8vIG1pbmltaXplIGNvZGUgbWVtb3J5IGFuZCBtYXhpbWl6ZSBzcGVlZC4KKyNkZWZpbmUgR0VORVJJQwkJCS8vIGdlbmVyaWMgcG9pbnRlciB0byBwb2ludCB0byBhcHBsaWNhdGlvbiBkYXRhCisJCQkJCS8vIFZhcmlhYmxlcyB3aXRoIHRoaXMgYXR0cmlidXRlIGNhbiBiZSBsb2NhdGVkIGluIGV4dGVybmFsCisJCQkJCS8vIG9yIGludGVybmFsIGRhdGEgbWVtb3J5LgorI2RlZmluZSBNRU0JCQkvLyBNZW1vcnkgYXR0cmlidXRlIHRvIG9wdGltaXplIHNwZWVkIGFuZCBjb2RlIG9mIHBvaW50ZXIgYWNjZXNzLgorCisjZGVmaW5lIFJFRU5UUkFOVAorI2RlZmluZSBQVUJMSUMKKworI2lmbmRlZiBRV09SRAorI2RlZmluZSBRV09SRCBsb25nIGxvbmcKKyNlbmRpZgorCisgICAgLy8gV29ya2Fyb3VuZDoKKyAgICAvLyBJZiB3ZSB1c2UgSUFSIGFuZCB3YW50IHRvIGRlYnVnIGJ1dCBkb24ndCB3YW50IHRvIHVzZSBDLVNweSBEZWJ1Z2dlcgorICAgIC8vIGFzc2VydCgpIGRvZXNuJ3Qgd29yayBpbiBkZWJ1ZyBtb2RlIGJlY2F1c2UgaXQgbmVlZHMgc3VwcG9ydCBmb3IgRklMRSBkZXNjcmlwdG9ycworICAgIC8vIChfRExJQl9GSUxFX0RFU0NSSVBUT1IgPT0gMSkuCisjaWZuZGVmIE5ERUJVRworI2RlZmluZSBBU1NFUlQoZXhwcikgICAgaWYgKCEoZXhwcikpIHtcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQUNFMCAoIkFzc2VydGlvbiBmYWlsZWQ6ICIgI2V4cHIgKTtcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICgxKTt9CisjZWxzZQorI2RlZmluZSBBU1NFUlQoZXhwcikKKyNlbmRpZgorCisjaWZuZGVmIE5ERUJVRworI2luY2x1ZGUgPHN0ZGlvLmg+CQkvLyBwcm90b3R5cGUgcHJpbnRmKCkgKGZvciBUUkFDRSkKKyNkZWZpbmUgVFJBQ0UgIHByaW50ZgorLy8gICAgICAgICNkZWZpbmUgVFJBQ0UgIFBSSU5URjQKKyNlbmRpZgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIGRlZmluaXRpb25zIGZvciBUYXNraW5nIDgwNTEKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNlbGlmIGRlZmluZWQgKF9DQzUxKQorCisjaW5jbHVkZSA8Y2M1MS5oPgorCisjZGVmaW5lIFRBUkdFVF9TWVNURU0gICBfTk9fT1NfCisjZGVmaW5lIERFVl9TWVNURU0gICAgICBfREVWX1RBU0tJTkdfQzUxWF8KKworI2RlZmluZSBORUFSICAgICAgICAgICAgX2RhdGEJLy8gdmFyaWFibGVzIG1hcHBlZCB0byBpbnRlcm5hbCBkYXRhIHN0b3JhZ2UgbG9jYXRpb24KKyNkZWZpbmUgRkFSICAgICAgICAgICAgIF94ZGF0CS8vIHZhcmlhYmxlcyBtYXBwZWQgdG8gZXh0ZXJuYWwgZGF0YSBzdG9yYWdlIGxvY2F0aW9uCisjZGVmaW5lIENPTlNUICAgICAgICAgICBjb25zdAkvLyB2YXJpYWJsZXMgbWFwcGVkIHRvIFJPTSAoaS5lLiBmbGFzaCkKKyNkZWZpbmUgUk9NCQkJLy8gY29kZSBvciB2YXJpYWJsZXMgbWFwcGVkIHRvIFJPTSAoaS5lLiBmbGFzaCkKKwkJCQkJLy8gdXNhZ2U6IENPTlNUIEJZVEUgUk9NIGZvbyA9IDB4MDA7CisjZGVmaW5lIEhXQUNDICAgICAgICAgICBfeGRhdAkvLyBoYXJkd2FyZSBhY2Nlc3MgdGhyb3VnaCBleHRlcm5hbCBtZW1vcnkgKGkuZS4gQ0FOKQorI2RlZmluZSBMQVJHRQkJCS8vIGZ1bmN0aW9ucyBzZXQgcGFyYW1ldGVycyB0byBleHRlcm5hbCBkYXRhIHN0b3JhZ2UgbG9jYXRpb24KKworICAgIC8vIFRoZXNlIHR5cGVzIGNhbiBiZSBhZGp1c3RlZCBieSB1c2VycyB0byBtYXRjaCBhcHBsaWNhdGlvbiByZXF1aXJlbWVudHMuIFRoZSBnb2FsIGlzIHRvCisgICAgLy8gbWluaW1pemUgY29kZSBtZW1vcnkgYW5kIG1heGltaXplIHNwZWVkLgorI2RlZmluZSBHRU5FUklDCQkJLy8gZ2VuZXJpYyBwb2ludGVyIHRvIHBvaW50IHRvIGFwcGxpY2F0aW9uIGRhdGEKKwkJCQkJLy8gVmFyaWFibGVzIHdpdGggdGhpcyBhdHRyaWJ1dGUgY2FuIGJlIGxvY2F0ZWQgaW4gZXh0ZXJuYWwKKwkJCQkJLy8gb3IgaW50ZXJuYWwgZGF0YSBtZW1vcnkuCisjZGVmaW5lIE1FTSAgICAgICAgICAgICBfeGRhdAkvLyBNZW1vcnkgYXR0cmlidXRlIHRvIG9wdGltaXplIHNwZWVkIGFuZCBjb2RlIG9mIHBvaW50ZXIgYWNjZXNzLgorCisjZGVmaW5lIFJFRU5UUkFOVCAgICAgICBfcmVlbnRyYW50CisjZGVmaW5lIFBVQkxJQworCisjaWZuZGVmIE5ERUJVRworI2luY2x1ZGUgPHN0ZGlvLmg+CQkvLyBwcm90b3R5cGUgcHJpbnRmKCkgKGZvciBUUkFDRSkKKyNkZWZpbmUgVFJBQ0UgIHByaW50ZgorI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgZGVmaW5pdGlvbnMgZm9yIFRhc2tpbmcgQzE2N0NSIGFuZCBDMTY0Q0kKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNlbGlmIGRlZmluZWQgKF9DMTY2KQorCisjZGVmaW5lIFRBUkdFVF9TWVNURU0gICBfTk9fT1NfCisjZGVmaW5lIERFVl9TWVNURU0gICAgICBfREVWX1RBU0tJTkdfQzE2WF8KKworI2RlZmluZSBORUFSICAgICAgICAgICAgbmVhcgkvLyB2YXJpYWJsZXMgbWFwcGVkIHRvIGludGVybmFsIGRhdGEgc3RvcmFnZSBsb2NhdGlvbgorI2RlZmluZSBGQVIgICAgICAgICAgICAgZmFyCS8vIHZhcmlhYmxlcyBtYXBwZWQgdG8gZXh0ZXJuYWwgZGF0YSBzdG9yYWdlIGxvY2F0aW9uCisjZGVmaW5lIENPTlNUICAgICAgICAgICBjb25zdAkvLyB2YXJpYWJsZXMgbWFwcGVkIHRvIFJPTSAoaS5lLiBmbGFzaCkKKyNkZWZpbmUgUk9NCQkJLy8gY29kZSBvciB2YXJpYWJsZXMgbWFwcGVkIHRvIFJPTSAoaS5lLiBmbGFzaCkKKwkJCQkJLy8gdXNhZ2U6IENPTlNUIEJZVEUgUk9NIGZvbyA9IDB4MDA7CisjZGVmaW5lIEhXQUNDICAgLyogdG8gYmUgZGVmaW5lZCAqLwkvLyBoYXJkd2FyZSBhY2Nlc3MgdGhyb3VnaCBleHRlcm5hbCBtZW1vcnkgKGkuZS4gQ0FOKQorI2RlZmluZSBMQVJHRQkJCS8vIGZ1bmN0aW9ucyBzZXQgcGFyYW1ldGVycyB0byBleHRlcm5hbCBkYXRhIHN0b3JhZ2UgbG9jYXRpb24KKworICAgIC8vIFRoZXNlIHR5cGVzIGNhbiBiZSBhZGp1c3RlZCBieSB1c2VycyB0byBtYXRjaCBhcHBsaWNhdGlvbiByZXF1aXJlbWVudHMuIFRoZSBnb2FsIGlzIHRvCisgICAgLy8gbWluaW1pemUgY29kZSBtZW1vcnkgYW5kIG1heGltaXplIHNwZWVkLgorI2RlZmluZSBHRU5FUklDCQkJLy8gZ2VuZXJpYyBwb2ludGVyIHRvIHBvaW50IHRvIGFwcGxpY2F0aW9uIGRhdGEKKwkJCQkJLy8gVmFyaWFibGVzIHdpdGggdGhpcyBhdHRyaWJ1dGUgY2FuIGJlIGxvY2F0ZWQgaW4gZXh0ZXJuYWwKKwkJCQkJLy8gb3IgaW50ZXJuYWwgZGF0YSBtZW1vcnkuCisjZGVmaW5lIE1FTQkJCS8vIE1lbW9yeSBhdHRyaWJ1dGUgdG8gb3B0aW1pemUgc3BlZWQgYW5kIGNvZGUgb2YgcG9pbnRlciBhY2Nlc3MuCisKKyNkZWZpbmUgUkVFTlRSQU5UCisjZGVmaW5lIFBVQkxJQworCisgICAgLy8gU3RkaW8uaCBoYXMgdG8gYmUgYWx3YXkgaW5jbHVkZWQgaGVyZS4gSWYgcHJpbnRmKCkgaXMgdXNlZCBzdGRpby5oIGRlZmluZXMgTlVMTAorICAgIC8vIHdpdGhvdXQgY2hlY2tpbmcgaWYgaXQgaXMgYWxyZWFkeSBpbmNsdWRlZC4gU28gYW4gZXJyb3Igb2NjdXJzIHdoaWxlIGNvbXBpbGluZy4KKyAgICAvLyAoci5kLikKKyNpbmNsdWRlIDxzdGRpby5oPgkJLy8gcHJvdG90eXBlIHByaW50ZigpIChmb3IgVFJBQ0UpCisjaWZuZGVmIE5ERUJVRworI2RlZmluZSBUUkFDRSAgcHJpbnRmCisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBkZWZpbml0aW9ucyBmb3IgRlVKSVRTVSBGRk1DLTE2TFggTUI5MDU5MAorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8jZWxpZiAoZGVmaW5lZCAoRjU5MCkgfHwgZGVmaW5lZCAoRjU0MykgfHwgZGVmaW5lZCAoRjU5OCkgfHwgZGVmaW5lZCAoRjQ5NSkgfHwgZGVmaW5lZCAoRjM1MCkpCisjZWxpZiBkZWZpbmVkKF9fQ09NUElMRVJfRkNDOTA3X18pCisKKyNkZWZpbmUgVEFSR0VUX1NZU1RFTSAgIF9OT19PU18KKyNkZWZpbmUgREVWX1NZU1RFTSAgICAgIF9ERVZfRlVKSVRTVV9GNTkwXworCisjZGVmaW5lIE5FQVIgICAgLyogdG8gYmUgZGVmaW5lZCAqLwkvLyB2YXJpYWJsZXMgbWFwcGVkIHRvIGludGVybmFsIGRhdGEgc3RvcmFnZSBsb2NhdGlvbgorI2RlZmluZSBGQVIgICAgIC8qIHRvIGJlIGRlZmluZWQgKi8JLy8gdmFyaWFibGVzIG1hcHBlZCB0byBleHRlcm5hbCBkYXRhIHN0b3JhZ2UgbG9jYXRpb24KKyNkZWZpbmUgQ09OU1QgICAgICAgICAgIGNvbnN0CS8vIHZhcmlhYmxlcyBtYXBwZWQgdG8gUk9NIChpLmUuIGZsYXNoKQorI2RlZmluZSBST00gICAgIC8qIHRvIGJlIGRlZmluZWQgKi8JLy8gY29kZSBvciB2YXJpYWJsZXMgbWFwcGVkIHRvIFJPTSAoaS5lLiBmbGFzaCkKKwkJCQkJLy8gdXNhZ2U6IENPTlNUIEJZVEUgUk9NIGZvbyA9IDB4MDA7CisjZGVmaW5lIEhXQUNDICAgLyogdG8gYmUgZGVmaW5lZCAqLwkvLyBoYXJkd2FyZSBhY2Nlc3MgdGhyb3VnaCBleHRlcm5hbCBtZW1vcnkgKGkuZS4gQ0FOKQorI2RlZmluZSBMQVJHRQkJCS8vIGZ1bmN0aW9ucyBzZXQgcGFyYW1ldGVycyB0byBleHRlcm5hbCBkYXRhIHN0b3JhZ2UgbG9jYXRpb24KKworICAgIC8vIFRoZXNlIHR5cGVzIGNhbiBiZSBhZGp1c3RlZCBieSB1c2VycyB0byBtYXRjaCBhcHBsaWNhdGlvbiByZXF1aXJlbWVudHMuIFRoZSBnb2FsIGlzIHRvCisgICAgLy8gbWluaW1pemUgY29kZSBtZW1vcnkgYW5kIG1heGltaXplIHNwZWVkLgorI2RlZmluZSBHRU5FUklDCQkJLy8gZ2VuZXJpYyBwb2ludGVyIHRvIHBvaW50IHRvIGFwcGxpY2F0aW9uIGRhdGEKKwkJCQkJLy8gVmFyaWFibGVzIHdpdGggdGhpcyBhdHRyaWJ1dGUgY2FuIGJlIGxvY2F0ZWQgaW4gZXh0ZXJuYWwKKwkJCQkJLy8gb3IgaW50ZXJuYWwgZGF0YSBtZW1vcnkuCisjZGVmaW5lIE1FTQkJCS8vIE1lbW9yeSBhdHRyaWJ1dGUgdG8gb3B0aW1pemUgc3BlZWQgYW5kIGNvZGUgb2YgcG9pbnRlciBhY2Nlc3MuCisKKyAgICAvLyBzb2Z0dW5lIGlzIG5vdCBhYmxlIHRvIHN1cHBvcnQgNjQgYml0IHZhcmlhYmxlcyBRV09SRCAhISEKKworI2RlZmluZSBSRUVOVFJBTlQKKyNkZWZpbmUgUFVCTElDCisKKyNpZm5kZWYgTkRFQlVHCisjaW5jbHVkZSA8c3RkaW8uaD4JCS8vIHByb3RvdHlwZSBwcmludGYoKSAoZm9yIFRSQUNFKQorI2RlZmluZSBUUkFDRSAgcHJpbnRmCisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBkZWZpbml0aW9ucyBmb3IgTWl0c3ViaXNoaSBNMTZDIGZhbWlseSBmb3IgVEFTS0lORyBDb21waWxlciBDTTE2CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZWxpZiBkZWZpbmVkIChfQ00xNkMpCisKKyNkZWZpbmUgVEFSR0VUX1NZU1RFTSAgIF9OT19PU18KKyNkZWZpbmUgREVWX1NZU1RFTSAgICAgIF9ERVZfVEFTS0lOR19NMTZDXworCisjZGVmaW5lIE5FQVIgICAgICAgICAgICBfbmVhcgkvLyB2YXJpYWJsZXMgbWFwcGVkIHRvIGludGVybmFsIGRhdGEgc3RvcmFnZSBsb2NhdGlvbgorI2RlZmluZSBGQVIgICAgICAgICAgICAgX2ZhcgkvLyB2YXJpYWJsZXMgbWFwcGVkIHRvIGV4dGVybmFsIGRhdGEgc3RvcmFnZSBsb2NhdGlvbgorI2RlZmluZSBDT05TVCAgICAgICAgICAgX2ZhcnJvbQkvLyB2YXJpYWJsZXMgbWFwcGVkIHRvIFJPTSAoaS5lLiBmbGFzaCkKKyNkZWZpbmUgUk9NCQkJLy8gY29kZSBvciB2YXJpYWJsZXMgbWFwcGVkIHRvIFJPTSAoaS5lLiBmbGFzaCkKKwkJCQkJLy8gdXNhZ2U6IENPTlNUIEJZVEUgUk9NIGZvbyA9IDB4MDA7CisjZGVmaW5lIEhXQUNDICAgICAgICAgICBfbmVhcgkvLyBoYXJkd2FyZSBhY2Nlc3MgdGhyb3VnaCBleHRlcm5hbCBtZW1vcnkgKGkuZS4gQ0FOKQorI2RlZmluZSBMQVJHRQkJCS8vIGZ1bmN0aW9ucyBzZXQgcGFyYW1ldGVycyB0byBleHRlcm5hbCBkYXRhIHN0b3JhZ2UgbG9jYXRpb24KKworICAgIC8vIFRoZXNlIHR5cGVzIGNhbiBiZSBhZGp1c3RlZCBieSB1c2VycyB0byBtYXRjaCBhcHBsaWNhdGlvbiByZXF1aXJlbWVudHMuIFRoZSBnb2FsIGlzIHRvCisgICAgLy8gbWluaW1pemUgY29kZSBtZW1vcnkgYW5kIG1heGltaXplIHNwZWVkLgorI2RlZmluZSBHRU5FUklDICAgICAgICAgX2ZhcgkvLyBnZW5lcmljIHBvaW50ZXIgdG8gcG9pbnQgdG8gYXBwbGljYXRpb24gZGF0YQorCQkJCQkvLyBWYXJpYWJsZXMgd2l0aCB0aGlzIGF0dHJpYnV0ZSBjYW4gYmUgbG9jYXRlZCBpbiBleHRlcm5hbAorCQkJCQkvLyBvciBpbnRlcm5hbCBkYXRhIG1lbW9yeS4KKwkJCQkJLy8gZG8geW91IHVzZSBtZW1vcnkgbW9kZWwgU01BTEwsIHRoYW4geW91IGhhdmUgdG8gc2V0IF9mYXIKKyNkZWZpbmUgTUVNCQkJLy8gTWVtb3J5IGF0dHJpYnV0ZSB0byBvcHRpbWl6ZSBzcGVlZCBhbmQgY29kZSBvZiBwb2ludGVyIGFjY2Vzcy4KKworI2RlZmluZSBSRUVOVFJBTlQKKyNkZWZpbmUgUFVCTElDCisKKyAgICAvLyBTdGRpby5oIGhhcyB0byBiZSBhbHdheSBpbmNsdWRlZCBoZXJlLiBJZiBwcmludGYoKSBpcyB1c2VkIHN0ZGlvLmggZGVmaW5lcyBOVUxMCisgICAgLy8gd2l0aG91dCBjaGVja2luZyBpZiBpdCBpcyBhbHJlYWR5IGluY2x1ZGVkLiBTbyBhbiBlcnJvciBvY2N1cnMgd2hpbGUgY29tcGlsaW5nLgorICAgIC8vIChyLmQuKQorI2luY2x1ZGUgPHN0ZGlvLmg+CQkvLyBwcm90b3R5cGUgcHJpbnRmKCkgKGZvciBUUkFDRSkKKyNpZm5kZWYgTkRFQlVHCisjZGVmaW5lIFRSQUNFICBwcmludGYKKyNlbmRpZgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIGRlZmluaXRpb25zIGZvciBNaXRzdWJpc2hpIE0xNkMgZmFtaWx5IGZvciBNaXRzdWJpc2hpIENvbXBpbGVyIE5DMzAKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBuYW1lIE5DMzAsIGFuZGVyZSBGb3JtIHdpbGwgZGVyIENvbXBpbGVyIG5pY2h0ICEhCisjZWxpZiBkZWZpbmVkIChOQzMwKQorCisjZGVmaW5lIFRBUkdFVF9TWVNURU0gICBfTk9fT1NfCisjZGVmaW5lIERFVl9TWVNURU0gICAgICBfREVWX01JVFNVQklTSElfTTE2Q18KKworI2RlZmluZSBORUFSICAgICAgICAgICAgbmVhcgkvLyB2YXJpYWJsZXMgbWFwcGVkIHRvIGludGVybmFsIGRhdGEgc3RvcmFnZSBsb2NhdGlvbgorI2RlZmluZSBGQVIgICAgICAgICAgICAgZmFyCS8vIHZhcmlhYmxlcyBtYXBwZWQgdG8gZXh0ZXJuYWwgZGF0YSBzdG9yYWdlIGxvY2F0aW9uCisjZGVmaW5lIENPTlNUICAgICAgICAgICBjb25zdAkvLyB2YXJpYWJsZXMgbWFwcGVkIHRvIFJPTSAoaS5lLiBmbGFzaCkKKyNkZWZpbmUgUk9NCQkJLy8gY29kZSBvciB2YXJpYWJsZXMgbWFwcGVkIHRvIFJPTSAoaS5lLiBmbGFzaCkKKwkJCQkJLy8gdXNhZ2U6IENPTlNUIEJZVEUgUk9NIGZvbyA9IDB4MDA7CisjZGVmaW5lIEhXQUNDICAgICAgICAgICBuZWFyCS8vIGhhcmR3YXJlIGFjY2VzcyB0aHJvdWdoIGV4dGVybmFsIG1lbW9yeSAoaS5lLiBDQU4pCisjZGVmaW5lIExBUkdFCQkJLy8gZnVuY3Rpb25zIHNldCBwYXJhbWV0ZXJzIHRvIGV4dGVybmFsIGRhdGEgc3RvcmFnZSBsb2NhdGlvbgorCisgICAgLy8gVGhlc2UgdHlwZXMgY2FuIGJlIGFkanVzdGVkIGJ5IHVzZXJzIHRvIG1hdGNoIGFwcGxpY2F0aW9uIHJlcXVpcmVtZW50cy4gVGhlIGdvYWwgaXMgdG8KKyAgICAvLyBtaW5pbWl6ZSBjb2RlIG1lbW9yeSBhbmQgbWF4aW1pemUgc3BlZWQuCisjZGVmaW5lIEdFTkVSSUMgICAgICAgICBmYXIJLy8gZ2VuZXJpYyBwb2ludGVyIHRvIHBvaW50IHRvIGFwcGxpY2F0aW9uIGRhdGEKKwkJCQkJLy8gVmFyaWFibGVzIHdpdGggdGhpcyBhdHRyaWJ1dGUgY2FuIGJlIGxvY2F0ZWQgaW4gZXh0ZXJuYWwKKwkJCQkJLy8gb3IgaW50ZXJuYWwgZGF0YSBtZW1vcnkuCisjZGVmaW5lIE1FTQkJCS8vIE1lbW9yeSBhdHRyaWJ1dGUgdG8gb3B0aW1pemUgc3BlZWQgYW5kIGNvZGUgb2YgcG9pbnRlciBhY2Nlc3MuCisKKyNkZWZpbmUgUkVFTlRSQU5UCisjZGVmaW5lIFBVQkxJQworCisjaWZuZGVmIE5ERUJVRworI2luY2x1ZGUgPHN0ZGlvLmg+CQkvLyBwcm90b3R5cGUgcHJpbnRmKCkgKGZvciBUUkFDRSkKKyNkZWZpbmUgVFJBQ0UgIHByaW50ZgorI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgZGVmaW5pdGlvbnMgZm9yIFJlbmVzYXMgTTMyQyBmYW1pbHkgZm9yIFJlbmVzYXMgQ29tcGlsZXIKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZWxpZiBkZWZpbmVkIChOQzMwOCkKKworI2RlZmluZSBUQVJHRVRfU1lTVEVNICAgX05PX09TXworI2RlZmluZSBERVZfU1lTVEVNICAgICAgX0RFVl9SRU5FU0FTX00zMkNfCisKKyNkZWZpbmUgTkVBUiAgICAgICAgICAgICBuZWFyCS8vIHZhcmlhYmxlcyBtYXBwZWQgdG8gaW50ZXJuYWwgZGF0YSBzdG9yYWdlIGxvY2F0aW9uCisjZGVmaW5lIEZBUiAgICAgICAgICAgICAgZmFyCS8vIHZhcmlhYmxlcyBtYXBwZWQgdG8gZXh0ZXJuYWwgZGF0YSBzdG9yYWdlIGxvY2F0aW9uCisjZGVmaW5lIENPTlNUICAgICAgICAgICAgY29uc3QJLy8gdmFyaWFibGVzIG1hcHBlZCB0byBST00gKGkuZS4gZmxhc2gpCisjZGVmaW5lIFJPTQkJCS8vIGNvZGUgb3IgdmFyaWFibGVzIG1hcHBlZCB0byBST00gKGkuZS4gZmxhc2gpCisjZGVmaW5lIEhXQUNDCQkJLy8gaGFyZHdhcmUgYWNjZXNzIHRocm91Z2ggZXh0ZXJuYWwgbWVtb3J5IChpLmUuIENBTikKKyNkZWZpbmUgTEFSR0UJCQkvLyBmdW5jdGlvbnMgc2V0IHBhcmFtZXRlcnMgdG8gZXh0ZXJuYWwgZGF0YSBzdG9yYWdlIGxvY2F0aW9uCisKKyAgICAvLyBUaGVzZSB0eXBlcyBjYW4gYmUgYWRqdXN0ZWQgYnkgdXNlcnMgdG8gbWF0Y2ggYXBwbGljYXRpb24gcmVxdWlyZW1lbnRzLiBUaGUgZ29hbCBpcyB0bworICAgIC8vIG1pbmltaXplIGNvZGUgbWVtb3J5IGFuZCBtYXhpbWl6ZSBzcGVlZC4KKyNkZWZpbmUgR0VORVJJQwkJCS8vIGdlbmVyaWMgcG9pbnRlciB0byBwb2ludCB0byBhcHBsaWNhdGlvbiBkYXRhCisJCQkJCS8vIFZhcmlhYmxlcyB3aXRoIHRoaXMgYXR0cmlidXRlIGNhbiBiZSBsb2NhdGVkIGluIGV4dGVybmFsCisJCQkJCS8vIG9yIGludGVybmFsIGRhdGEgbWVtb3J5LgorI2RlZmluZSBNRU0gICAgICAgICAgICAgIGZhcgkvLyBNZW1vcnkgYXR0cmlidXRlIHRvIG9wdGltaXplIHNwZWVkIGFuZCBjb2RlIG9mIHBvaW50ZXIgYWNjZXNzLgorCisjZGVmaW5lIFJFRU5UUkFOVAorI2RlZmluZSBQVUJMSUMKKworI2lmbmRlZiBOREVCVUcKKyNpbmNsdWRlIDxzdGRpby5oPgkJLy8gcHJvdG90eXBlIHByaW50ZigpIChmb3IgVFJBQ0UpCisjZGVmaW5lIFRSQUNFICBwcmludGYKKyNlbmRpZgorCisvLyAgICAjZXJyb3IgKCJSRU5FU0FTIG8uay4iKQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIGRlZmluaXRpb25zIGZvciBBUk03IGZhbWlseSB3aXRoIEdOVSBjb21waWxlcgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2VsaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgZGVmaW5lZChfX2FybV9fKSAmJiAhZGVmaW5lZChfX0xJTlVYX0FSTV9BUkNIX18pCisKKyNkZWZpbmUgVEFSR0VUX1NZU1RFTSAgIF9OT19PU18KKyNkZWZpbmUgREVWX1NZU1RFTSAgICAgIF9ERVZfR05VX0FSTTdfCisKKyNkZWZpbmUgTkVBUgkJCS8vIHZhcmlhYmxlcyBtYXBwZWQgdG8gaW50ZXJuYWwgZGF0YSBzdG9yYWdlIGxvY2F0aW9uCisjZGVmaW5lIEZBUgkJCS8vIHZhcmlhYmxlcyBtYXBwZWQgdG8gZXh0ZXJuYWwgZGF0YSBzdG9yYWdlIGxvY2F0aW9uCisjZGVmaW5lIENPTlNUICAgICAgICAgICBjb25zdAkvLyB2YXJpYWJsZXMgbWFwcGVkIHRvIFJPTSAoaS5lLiBmbGFzaCkKKyNkZWZpbmUgUk9NCQkJLy8gY29kZSBvciB2YXJpYWJsZXMgbWFwcGVkIHRvIFJPTSAoaS5lLiBmbGFzaCkKKwkJCQkJLy8gdXNhZ2U6IENPTlNUIEJZVEUgUk9NIGZvbyA9IDB4MDA7CisjZGVmaW5lIEhXQUNDCQkJLy8gaGFyZHdhcmUgYWNjZXNzIHRocm91Z2ggZXh0ZXJuYWwgbWVtb3J5IChpLmUuIENBTikKKyNkZWZpbmUgTEFSR0UJCQkvLyBmdW5jdGlvbnMgc2V0IHBhcmFtZXRlcnMgdG8gZXh0ZXJuYWwgZGF0YSBzdG9yYWdlIGxvY2F0aW9uCisKKyAgICAvLyBUaGVzZSB0eXBlcyBjYW4gYmUgYWRqdXN0ZWQgYnkgdXNlcnMgdG8gbWF0Y2ggYXBwbGljYXRpb24gcmVxdWlyZW1lbnRzLiBUaGUgZ29hbCBpcyB0bworICAgIC8vIG1pbmltaXplIGNvZGUgbWVtb3J5IGFuZCBtYXhpbWl6ZSBzcGVlZC4KKyNkZWZpbmUgR0VORVJJQwkJCS8vIGdlbmVyaWMgcG9pbnRlciB0byBwb2ludCB0byBhcHBsaWNhdGlvbiBkYXRhCisJCQkJCS8vIFZhcmlhYmxlcyB3aXRoIHRoaXMgYXR0cmlidXRlIGNhbiBiZSBsb2NhdGVkIGluIGV4dGVybmFsCisJCQkJCS8vIG9yIGludGVybmFsIGRhdGEgbWVtb3J5LgorI2RlZmluZSBNRU0JCQkvLyBNZW1vcnkgYXR0cmlidXRlIHRvIG9wdGltaXplIHNwZWVkIGFuZCBjb2RlIG9mIHBvaW50ZXIgYWNjZXNzLgorI2RlZmluZSBIV0FDQwkJCS8vIGhhcmR3YXJlIGFjY2VzcyB0aHJvdWdoIGV4dGVybmFsIG1lbW9yeSAoaS5lLiBDQU4pCisKKyNkZWZpbmUgUkVFTlRSQU5UCisjZGVmaW5lIFBVQkxJQworCisjaWZuZGVmIFFXT1JECisjZGVmaW5lIFFXT1JEIGxvbmcgbG9uZwkJLy8gaS5BLiBkdXJjaCBIZXJyIEt1c2NoZWwKKyNlbmRpZgorCisjaWZuZGVmIE5ERUJVRworI2luY2x1ZGUgPHN0ZGlvLmg+CQkvLyBwcm90b3R5cGUgcHJpbnRmKCkgKGZvciBUUkFDRSkKKyNkZWZpbmUgVFJBQ0UgIHByaW50ZgorI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgZGVmaW5pdGlvbnMgZm9yIE1vdG9yb2xhIFBvd2VyUEMgZmFtaWx5IDV4NSAoNTU1LzU2NSkKKy8vICBkZWZpbml0aW9ucyBMaW51eC1QQworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2VsaWYgZGVmaW5lZCAoX19HTlVDX18pCisKKyNpZiBkZWZpbmVkIChMSU5VWCkgfHwgZGVmaW5lZCAobGludXgpIHx8IGRlZmluZWQgKF9fbGludXhfXykKKyNkZWZpbmUgTElOVVhfU1lTVEVNCQkvLyBkZWZpbmUgJ0xJTlVYX1NZU1RFTScgdW5pZm9ybSBmb3IgYWxsIExpbnV4IGJhc2VkIHN5c3RlbXMKKwkvLyByLmQuOiBXZSB3aWxsIG5lZWQgYW4gb3RoZXIgc29sdXRpb24gaGVyZSEgVGhlcmUgYXJlIHR3byBzZWN0aW9ucyBoZXJlIHdoaWNoIGRvIGNoZWNrIHRoZSBwcmVwcm9jLWRlZmluaXRpb25zOgorCS8vICAgICBMSU5VWCBhbmQgX19saW51eF9fIC4gVGhlIGZpcnN0IG9uZSB3YXMgTGludXggZm9yIFBDLCB0aGUgc2Vjb25kIG9uZSBpcyB0aGlzIHNlY3Rpb24gZm9yIGVtYmVkZGVkIExpbnV4IChNQ0Y1eHh4KS4KKwkvLyAgICAgQnV0IExpbnV4IGZvciBQQyBkb2VzIG5vdCBuZWVkIHRoZSBkZWZpbml0aW9ucyBmb3IgZW1iZWRkZWQgTGludXguCisjZW5kaWYKKworICAgIC8vIEdOVSBDIGNvbXBpbGVyIHN1cHBvcnRzIGZ1bmN0aW9uIGlubGluaW5nCisjZGVmaW5lIElOTElORV9GVU5DVElPTl9ERUYgZXh0ZXJuIGlubGluZQorCisgICAgLy8gdG8gYWN0dWFsbHkgZW5hYmxlIGlubGluaW5nIGp1c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIHRocmVlIGxpbmVzCisgICAgLy8gI3VuZGVmIElOTElORV9GVU5DVElPTgorICAgIC8vICNkZWZpbmUgSU5MSU5FX0ZVTkNUSU9OICAgICBJTkxJTkVfRlVOQ1RJT05fREVGCisgICAgLy8gI2RlZmluZSBJTkxJTkVfRU5BQkxFRCAgICAgIFRSVUUKKworI2lmZGVmIFBYUk9TCisjZGVmaW5lIFRBUkdFVF9TWVNURU0gICAgICAgX1BYUk9TXworI2lmZGVmIF9faTM4Nl9fCisjdW5kZWYgTElOVVgJCQkvLyB0aGlzIGRlZmluZSBzZWVtcyB0byBiZSBzZXQgZnJvbSBjb21waWxlcgorI2RlZmluZSBERVZfU1lTVEVNICAgICAgX0RFVl9ISUdIVEVDX1g4Nl8KKyNlbGlmIGRlZmluZWQgKF9fdHJpY29yZV9fKQorI2RlZmluZSBERVZfU1lTVEVNICAgICAgX0RFVl9HTlVfVFJJQ09SRV8KKyNlbHNlIC8vIE1QQzV4NQorI2RlZmluZSBERVZfU1lTVEVNICAgICAgX0RFVl9HTlVfTVBDNVg1XworI2VuZGlmCisKKyNlbGlmIGRlZmluZWQgKExJTlVYKSB8fCBkZWZpbmVkIChfX2xpbnV4X18pCisjZGVmaW5lIFRBUkdFVF9TWVNURU0gICAgICAgX0xJTlVYXwkvLyBMaW51eCBkZWZpbml0aW9uCisjZGVmaW5lIERFVl9TWVNURU0gICAgICAgICAgX0RFVl9MSU5VWF8KKworI2VsaWYgZGVmaW5lZCAoR05VX0NGNTI4MikKKyNkZWZpbmUgVEFSR0VUX1NZU1RFTSAgICAgICBfTk9fT1NfCisjZGVmaW5lIERFVl9TWVNURU0gICAgICAgICAgX0RFVl9HTlVfQ0Y1MjgyXworCisjZWxpZiBkZWZpbmVkIChFQ09TUFJPX0kzODZfUEVBS19QQ0kpCisjZGVmaW5lIFRBUkdFVF9TWVNURU0gICAgICAgX0VDT1NQUk9fCisjZGVmaW5lIERFVl9TWVNURU0gICAgICAgICAgX0RFVl9HTlVfSTM4Nl8KKworI2VsaWYgZGVmaW5lZCAoR05VX0NGNTQ4WCkKKyNkZWZpbmUgVEFSR0VUX1NZU1RFTSAgICAgICBfTk9fT1NfCisjZGVmaW5lIERFVl9TWVNURU0gICAgICAgICAgX0RFVl9HTlVfQ0Y1NDhYXworI2Vsc2UKKyNlcnJvciAnRVJST1I6IERFVl9TWVNURU0gbm90IGZvdW5kIScKKyNlbmRpZgorCisjaWZuZGVmIFFXT1JECisjZGVmaW5lIFFXT1JEIGxvbmcgbG9uZyBpbnQKKyNlbmRpZgorCisjaWYgKFRBUkdFVF9TWVNURU0gPT0gX1BYUk9TXykKKworI2lmbmRlZiBfX0tFUk5FTF9fCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjZW5kaWYKKworI2RlZmluZSBORUFSCQkJLy8gdmFyaWFibGVzIG1hcHBlZCB0byBpbnRlcm5hbCBkYXRhIHN0b3JhZ2UgbG9jYXRpb24KKyNkZWZpbmUgRkFSCQkJLy8gdmFyaWFibGVzIG1hcHBlZCB0byBleHRlcm5hbCBkYXRhIHN0b3JhZ2UgbG9jYXRpb24KKyNkZWZpbmUgQ09OU1QgICAgICAgICAgIGNvbnN0CS8vIHZhcmlhYmxlcyBtYXBwZWQgdG8gUk9NIChpLmUuIGZsYXNoKQorI2RlZmluZSBST00gICAgIC8qIHRvIGJlIGRlZmluZWQgKi8JLy8gY29kZSBvciB2YXJpYWJsZXMgbWFwcGVkIHRvIFJPTSAoaS5lLiBmbGFzaCkKKwkJCQkJICAgIC8vIHVzYWdlOiBDT05TVCBCWVRFIFJPTSBmb28gPSAweDAwOworI2RlZmluZSBMQVJHRQkJCS8vIGZ1bmN0aW9ucyBzZXQgcGFyYW1ldGVycyB0byBleHRlcm5hbCBkYXRhIHN0b3JhZ2UgbG9jYXRpb24KKworCS8vIFRoZXNlIHR5cGVzIGNhbiBiZSBhZGp1c3RlZCBieSB1c2VycyB0byBtYXRjaCBhcHBsaWNhdGlvbiByZXF1aXJlbWVudHMuIFRoZSBnb2FsIGlzIHRvCisJLy8gbWluaW1pemUgY29kZSBtZW1vcnkgYW5kIG1heGltaXplIHNwZWVkLgorI2RlZmluZSBHRU5FUklDCQkJLy8gZ2VuZXJpYyBwb2ludGVyIHRvIHBvaW50IHRvIGFwcGxpY2F0aW9uIGRhdGEKKwkJCQkJICAgIC8vIFZhcmlhYmxlcyB3aXRoIHRoaXMgYXR0cmlidXRlIGNhbiBiZSBsb2NhdGVkIGluIGV4dGVybmFsCisJCQkJCSAgICAvLyBvciBpbnRlcm5hbCBkYXRhIG1lbW9yeS4KKyNkZWZpbmUgTUVNCQkJLy8gTWVtb3J5IGF0dHJpYnV0ZSB0byBvcHRpbWl6ZSBzcGVlZCBhbmQgY29kZSBvZiBwb2ludGVyIGFjY2Vzcy4KKworI2RlZmluZSBIV0FDQwkJCS8vIGhhcmR3YXJlIGFjY2VzcyB0aHJvdWdoIGV4dGVybmFsIG1lbW9yeSAoaS5lLiBDQU4pCisKKyNkZWZpbmUgUkVFTlRSQU5UCisjZGVmaW5lIFBVQkxJQworCisjaWZuZGVmIFFXT1JECisjZGVmaW5lIFFXT1JEIGxvbmcgbG9uZyBpbnQKKyNlbmRpZgorCisjaWZuZGVmIE5ERUJVRworI2luY2x1ZGUgPHN0ZGlvLmg+CQkvLyBwcm90b3R5cGUgcHJpbnRmKCkgKGZvciBUUkFDRSkKKyNkZWZpbmUgVFJBQ0UgIHByaW50ZgorI2VuZGlmCisKKyNlbmRpZgorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tIEdOVUMgZm9yIEkzODYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZiAoVEFSR0VUX1NZU1RFTSA9PSBfTElOVVhfKSB8fCAoVEFSR0VUX1NZU1RFTSA9PSBfRUNPU1BST18pCisKKyNpZm5kZWYgX19LRVJORUxfXworI2luY2x1ZGUgPHN0cmluZy5oPgorI2VuZGlmCisKKyNkZWZpbmUgUk9NCQkJLy8gY29kZSBvciB2YXJpYWJsZXMgbWFwcGVkIHRvIFJPTSAoaS5lLiBmbGFzaCkKKwkJCQkJLy8gdXNhZ2U6IENPTlNUIEJZVEUgUk9NIGZvbyA9IDB4MDA7CisjZGVmaW5lIEhXQUNDCQkJLy8gaGFyZHdhcmUgYWNjZXNzIHRocm91Z2ggZXh0ZXJuYWwgbWVtb3J5IChpLmUuIENBTikKKworCS8vIFRoZXNlIHR5cGVzIGNhbiBiZSBhZGp1c3RlZCBieSB1c2VycyB0byBtYXRjaCBhcHBsaWNhdGlvbiByZXF1aXJlbWVudHMuIFRoZSBnb2FsIGlzIHRvCisJLy8gbWluaW1pemUgY29kZSBtZW1vcnkgYW5kIG1heGltaXplIHNwZWVkLgorI2RlZmluZSBHRU5FUklDCQkJLy8gZ2VuZXJpYyBwb2ludGVyIHRvIHBvaW50IHRvIGFwcGxpY2F0aW9uIGRhdGEKKwkJCQkJLy8gVmFyaWFibGVzIHdpdGggdGhpcyBhdHRyaWJ1dGUgY2FuIGJlIGxvY2F0ZWQgaW4gZXh0ZXJuYWwKKwkJCQkJLy8gb3IgaW50ZXJuYWwgZGF0YSBtZW1vcnkuCisjZGVmaW5lIE1FTQkJCS8vIE1lbW9yeSBhdHRyaWJ1dGUgdG8gb3B0aW1pemUgc3BlZWQgYW5kIGNvZGUgb2YgcG9pbnRlciBhY2Nlc3MuCisKKyNpZm5kZWYgTkVBUgorI2RlZmluZSBORUFSCQkJLy8gdmFyaWFibGVzIG1hcHBlZCB0byBpbnRlcm5hbCBkYXRhIHN0b3JhZ2UgbG9jYXRpb24KKyNlbmRpZgorCisjaWZuZGVmIEZBUgorI2RlZmluZSBGQVIJCQkvLyB2YXJpYWJsZXMgbWFwcGVkIHRvIGV4dGVybmFsIGRhdGEgc3RvcmFnZSBsb2NhdGlvbgorI2VuZGlmCisKKyNpZm5kZWYgQ09OU1QKKyNkZWZpbmUgQ09OU1QgY29uc3QJCS8vIHZhcmlhYmxlcyBtYXBwZWQgdG8gUk9NIChpLmUuIGZsYXNoKQorI2VuZGlmCisKKyNkZWZpbmUgTEFSR0UKKworI2RlZmluZSBSRUVOVFJBTlQKKyNkZWZpbmUgUFVCTElDCisKKyNpZm5kZWYgTkRFQlVHCisjaWZuZGVmIF9fS0VSTkVMX18KKyNpbmNsdWRlIDxzdGRpby5oPgkJLy8gcHJvdG90eXBlIHByaW50ZigpIChmb3IgVFJBQ0UpCisjZGVmaW5lIFRSQUNFICBwcmludGYKKyNlbHNlCisjZGVmaW5lIFRSQUNFICBwcmludGsKKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLSBHTlUgd2l0aG91dCBPUyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmIChUQVJHRVRfU1lTVEVNID09IF9OT19PU18pCisKKyNkZWZpbmUgUk9NCQkJLy8gY29kZSBvciB2YXJpYWJsZXMgbWFwcGVkIHRvIFJPTSAoaS5lLiBmbGFzaCkKKwkJCQkJLy8gdXNhZ2U6IENPTlNUIEJZVEUgUk9NIGZvbyA9IDB4MDA7CisjZGVmaW5lIEhXQUNDCQkJLy8gaGFyZHdhcmUgYWNjZXNzIHRocm91Z2ggZXh0ZXJuYWwgbWVtb3J5IChpLmUuIENBTikKKworCS8vIFRoZXNlIHR5cGVzIGNhbiBiZSBhZGp1c3RlZCBieSB1c2VycyB0byBtYXRjaCBhcHBsaWNhdGlvbiByZXF1aXJlbWVudHMuIFRoZSBnb2FsIGlzIHRvCisJLy8gbWluaW1pemUgY29kZSBtZW1vcnkgYW5kIG1heGltaXplIHNwZWVkLgorI2RlZmluZSBHRU5FUklDCQkJLy8gZ2VuZXJpYyBwb2ludGVyIHRvIHBvaW50IHRvIGFwcGxpY2F0aW9uIGRhdGEKKwkJCQkJLy8gVmFyaWFibGVzIHdpdGggdGhpcyBhdHRyaWJ1dGUgY2FuIGJlIGxvY2F0ZWQgaW4gZXh0ZXJuYWwKKwkJCQkJLy8gb3IgaW50ZXJuYWwgZGF0YSBtZW1vcnkuCisjZGVmaW5lIE1FTQkJCS8vIE1lbW9yeSBhdHRyaWJ1dGUgdG8gb3B0aW1pemUgc3BlZWQgYW5kIGNvZGUgb2YgcG9pbnRlciBhY2Nlc3MuCisKKyNpZm5kZWYgTkVBUgorI2RlZmluZSBORUFSCQkJLy8gdmFyaWFibGVzIG1hcHBlZCB0byBpbnRlcm5hbCBkYXRhIHN0b3JhZ2UgbG9jYXRpb24KKyNlbmRpZgorCisjaWZuZGVmIEZBUgorI2RlZmluZSBGQVIJCQkvLyB2YXJpYWJsZXMgbWFwcGVkIHRvIGV4dGVybmFsIGRhdGEgc3RvcmFnZSBsb2NhdGlvbgorI2VuZGlmCisKKyNpZm5kZWYgQ09OU1QKKyNkZWZpbmUgQ09OU1QgY29uc3QJCS8vIHZhcmlhYmxlcyBtYXBwZWQgdG8gUk9NIChpLmUuIGZsYXNoKQorI2VuZGlmCisKKyNkZWZpbmUgTEFSR0UKKworI2RlZmluZSBSRUVOVFJBTlQKKyNkZWZpbmUgUFVCTElDCisKKyNpZm5kZWYgTkRFQlVHCisvLyAgICAgICAgICAgICNpbmNsdWRlICJ4dWFydGRydi5oIgorLy8gICAgICAgICAgICAjaW5jbHVkZSA8c3RkaW8uaD4gICAgICAgICAgICAgIC8vIHByb3RvdHlwZSBwcmludGYoKSAoZm9yIFRSQUNFKQorI2RlZmluZSBUUkFDRSAgcHJpbnRmCisvLyAgICAgICAgICAgICNkZWZpbmUgVFJBQ0UgIG1wcmludGYKKy8vICAgICAgICAgICAgI2lmbmRlZiBUUkFDRQorLy8gICAgICAgICAgICAgICAgI2RlZmluZSBUUkFDRSB0cmFjZQorLy8gICAgICAgICAgICAgICAgdm9pZCB0cmFjZSAoY2hhciAqZm10LCAuLi4pOworLy8gICAgICAgICAgICAjZW5kaWYKKyNlbmRpZgorCisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBkZWZpbml0aW9ucyBmb3IgTVBDNTY1CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2VsaWYgX19NV0VSS1NfXworCisjaWZkZWYgX19NQzY4S19fCisKKyNkZWZpbmUgVEFSR0VUX1NZU1RFTSA9IF9NQ0Y1NDhYXworI2RlZmluZSBERVZfU1lTVEVNICAgICAgX0RFVl9NQ1dfTUNGNVhYWF8KKworI2Vsc2UKKyNkZWZpbmUgVEFSR0VUX1NZU1RFTSA9IF9NUEM1NjVfCisjZGVmaW5lIERFVl9TWVNURU0gICAgICBfREVWX01DV19NUEM1WDVfCisjZW5kaWYKKworI2RlZmluZSBORUFSCQkJLy8gdmFyaWFibGVzIG1hcHBlZCB0byBpbnRlcm5hbCBkYXRhIHN0b3JhZ2UgbG9jYXRpb24KKyNkZWZpbmUgRkFSCQkJLy8gdmFyaWFibGVzIG1hcHBlZCB0byBleHRlcm5hbCBkYXRhIHN0b3JhZ2UgbG9jYXRpb24KKyNkZWZpbmUgQ09OU1QgICAgICAgICAgIGNvbnN0CS8vIHZhcmlhYmxlcyBtYXBwZWQgdG8gUk9NIChpLmUuIGZsYXNoKQorI2RlZmluZSBST00JCQkvLyBjb2RlIG9yIHZhcmlhYmxlcyBtYXBwZWQgdG8gUk9NIChpLmUuIGZsYXNoKQorCQkJCQkvLyB1c2FnZTogQ09OU1QgQllURSBST00gZm9vID0gMHgwMDsKKyNkZWZpbmUgTEFSR0UJCQkvLyBmdW5jdGlvbnMgc2V0IHBhcmFtZXRlcnMgdG8gZXh0ZXJuYWwgZGF0YSBzdG9yYWdlIGxvY2F0aW9uCisKKyAgICAvLyBUaGVzZSB0eXBlcyBjYW4gYmUgYWRqdXN0ZWQgYnkgdXNlcnMgdG8gbWF0Y2ggYXBwbGljYXRpb24gcmVxdWlyZW1lbnRzLiBUaGUgZ29hbCBpcyB0bworICAgIC8vIG1pbmltaXplIGNvZGUgbWVtb3J5IGFuZCBtYXhpbWl6ZSBzcGVlZC4KKyNkZWZpbmUgR0VORVJJQwkJCS8vIGdlbmVyaWMgcG9pbnRlciB0byBwb2ludCB0byBhcHBsaWNhdGlvbiBkYXRhCisJCQkJCS8vIFZhcmlhYmxlcyB3aXRoIHRoaXMgYXR0cmlidXRlIGNhbiBiZSBsb2NhdGVkIGluIGV4dGVybmFsCisJCQkJCS8vIG9yIGludGVybmFsIGRhdGEgbWVtb3J5LgorI2RlZmluZSBNRU0JCQkvLyBNZW1vcnkgYXR0cmlidXRlIHRvIG9wdGltaXplIHNwZWVkIGFuZCBjb2RlIG9mIHBvaW50ZXIgYWNjZXNzLgorCisjZGVmaW5lIEhXQUNDCQkJLy8gaGFyZHdhcmUgYWNjZXNzIHRocm91Z2ggZXh0ZXJuYWwgbWVtb3J5IChpLmUuIENBTikKKworI2RlZmluZSBSRUVOVFJBTlQKKyNkZWZpbmUgUFVCTElDCisKKyNpZm5kZWYgTkRFQlVHCisjaW5jbHVkZSA8c3RkaW8uaD4JCS8vIHByb3RvdHlwZSBwcmludGYoKSAoZm9yIFRSQUNFKQorI2RlZmluZSBUUkFDRSAgcHJpbnRmCisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBkZWZpbml0aW9ucyBmb3IgQkVDSyAxeDMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZWxpZiBkZWZpbmVkIChfX0JPUkxBTkRDX18pICYmIGRlZmluZWQgKF9fUEFSQURJR01fXykKKworI2RlZmluZSBUQVJHRVRfU1lTVEVNICAgICAgX05PX09TXworI2RlZmluZSBERVZfU1lTVEVNICAgICAgICAgX0RFVl9QQVJfQkVDSzFYM18KKworI2RlZmluZSBST00JCQkvLyBjb2RlIG9yIHZhcmlhYmxlcyBtYXBwZWQgdG8gUk9NIChpLmUuIGZsYXNoKQorCQkJCSAgICAgLy8gdXNhZ2U6IENPTlNUIEJZVEUgUk9NIGZvbyA9IDB4MDA7CisjZGVmaW5lIEhXQUNDCQkJLy8gaGFyZHdhcmUgYWNjZXNzIHRocm91Z2ggZXh0ZXJuYWwgbWVtb3J5IChpLmUuIENBTikKKworICAgICAvLyBUaGVzZSB0eXBlcyBjYW4gYmUgYWRqdXN0ZWQgYnkgdXNlcnMgdG8gbWF0Y2ggYXBwbGljYXRpb24gcmVxdWlyZW1lbnRzLiBUaGUgZ29hbCBpcyB0bworICAgICAvLyBtaW5pbWl6ZSBjb2RlIG1lbW9yeSBhbmQgbWF4aW1pemUgc3BlZWQuCisjZGVmaW5lIEdFTkVSSUMJCQkvLyBnZW5lcmljIHBvaW50ZXIgdG8gcG9pbnQgdG8gYXBwbGljYXRpb24gZGF0YQorCQkJCSAgICAgLy8gVmFyaWFibGVzIHdpdGggdGhpcyBhdHRyaWJ1dGUgY2FuIGJlIGxvY2F0ZWQgaW4gZXh0ZXJuYWwKKwkJCQkgICAgIC8vIG9yIGludGVybmFsIGRhdGEgbWVtb3J5LgorI2RlZmluZSBNRU0JCQkvLyBNZW1vcnkgYXR0cmlidXRlIHRvIG9wdGltaXplIHNwZWVkIGFuZCBjb2RlIG9mIHBvaW50ZXIgYWNjZXNzLgorI2RlZmluZSBORUFSIF9fbmVhcgkJLy8gdmFyaWFibGVzIG1hcHBlZCB0byBpbnRlcm5hbCBkYXRhIHN0b3JhZ2UgbG9jYXRpb24KKyNkZWZpbmUgRkFSICBfX2ZhcgkJLy8gdmFyaWFibGVzIG1hcHBlZCB0byBleHRlcm5hbCBkYXRhIHN0b3JhZ2UgbG9jYXRpb24KKyNkZWZpbmUgQ09OU1QgY29uc3QJCS8vIHZhcmlhYmxlcyBtYXBwZWQgdG8gUk9NIChpLmUuIGZsYXNoKQorI2RlZmluZSBMQVJHRQorCisjZGVmaW5lIFJFRU5UUkFOVAorI2RlZmluZSBQVUJMSUMKKworI2lmbmRlZiBOREVCVUcKKyNpZm5kZWYgVFJBQ0UKKyNpbmNsdWRlIDxzdGRpby5oPgorI2RlZmluZSBUUkFDRSBwcmludGYKKyNlbmRpZgorI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgZGVmaW5pdGlvbnMgZm9yIFBDCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZWxpZiBkZWZpbmVkIChfX0JPUkxBTkRDX18pCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0gZGVmaW5pdGlvbiB0YXJnZXQgc3lzdGVtIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZmRlZiBfV0lOMzIKKyNkZWZpbmUgVEFSR0VUX1NZU1RFTSAgIF9XSU4zMl8JLy8gV0lOMzIgZGVmaW5pdGlvbgorI2RlZmluZSBERVZfU1lTVEVNICAgICAgX0RFVl9XSU4zMl8KKyNlbHNlCisjZGVmaW5lIFRBUkdFVF9TWVNURU0gICBfRE9TXworI2RlZmluZSBERVZfU1lTVEVNICAgICAgX0RFVl9CT1JMQU5EX0RPU18KKyNlbmRpZgorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tIFdJTjMyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWYgKFRBUkdFVF9TWVNURU0gPT0gX1dJTjMyXykKKworI2RlZmluZSBST00JCQkvLyBjb2RlIG9yIHZhcmlhYmxlcyBtYXBwZWQgdG8gUk9NIChpLmUuIGZsYXNoKQorCQkJCQkvLyB1c2FnZTogQ09OU1QgQllURSBST00gZm9vID0gMHgwMDsKKyNkZWZpbmUgSFdBQ0MJCQkvLyBoYXJkd2FyZSBhY2Nlc3MgdGhyb3VnaCBleHRlcm5hbCBtZW1vcnkgKGkuZS4gQ0FOKQorCisJLy8gVGhlc2UgdHlwZXMgY2FuIGJlIGFkanVzdGVkIGJ5IHVzZXJzIHRvIG1hdGNoIGFwcGxpY2F0aW9uIHJlcXVpcmVtZW50cy4gVGhlIGdvYWwgaXMgdG8KKwkvLyBtaW5pbWl6ZSBjb2RlIG1lbW9yeSBhbmQgbWF4aW1pemUgc3BlZWQuCisjZGVmaW5lIEdFTkVSSUMJCQkvLyBnZW5lcmljIHBvaW50ZXIgdG8gcG9pbnQgdG8gYXBwbGljYXRpb24gZGF0YQorCQkJCQkvLyBWYXJpYWJsZXMgd2l0aCB0aGlzIGF0dHJpYnV0ZSBjYW4gYmUgbG9jYXRlZCBpbiBleHRlcm5hbAorCQkJCQkvLyBvciBpbnRlcm5hbCBkYXRhIG1lbW9yeS4KKyNkZWZpbmUgTUVNCQkJLy8gTWVtb3J5IGF0dHJpYnV0ZSB0byBvcHRpbWl6ZSBzcGVlZCBhbmQgY29kZSBvZiBwb2ludGVyIGFjY2Vzcy4KKworI2lmbmRlZiBORUFSCisjZGVmaW5lIE5FQVIJCQkvLyB2YXJpYWJsZXMgbWFwcGVkIHRvIGludGVybmFsIGRhdGEgc3RvcmFnZSBsb2NhdGlvbgorI2VuZGlmCisKKyNpZm5kZWYgRkFSCisjZGVmaW5lIEZBUgkJCS8vIHZhcmlhYmxlcyBtYXBwZWQgdG8gZXh0ZXJuYWwgZGF0YSBzdG9yYWdlIGxvY2F0aW9uCisjZW5kaWYKKworI2lmbmRlZiBDT05TVAorI2RlZmluZSBDT05TVCBjb25zdAkJLy8gdmFyaWFibGVzIG1hcHBlZCB0byBST00gKGkuZS4gZmxhc2gpCisjZW5kaWYKKworI2RlZmluZSBMQVJHRQorCisjZGVmaW5lIFJFRU5UUkFOVAorI2RlZmluZSBQVUJMSUMgX19zdGRjYWxsCisKKyNpZm5kZWYgTkRFQlVHCisjaWZuZGVmIFRSQUNFCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNkZWZpbmUgVFJBQ0UgcHJpbnRmCisjZW5kaWYKKyNlbmRpZgorCisjZWxpZiAoVEFSR0VUX1NZU1RFTSA9PSBfRE9TXykKKworI2RlZmluZSBST00JCQkvLyBjb2RlIG9yIHZhcmlhYmxlcyBtYXBwZWQgdG8gUk9NIChpLmUuIGZsYXNoKQorCQkJCQkvLyB1c2FnZTogQ09OU1QgQllURSBST00gZm9vID0gMHgwMDsKKyNkZWZpbmUgSFdBQ0MJCQkvLyBoYXJkd2FyZSBhY2Nlc3MgdGhyb3VnaCBleHRlcm5hbCBtZW1vcnkgKGkuZS4gQ0FOKQorCisJLy8gVGhlc2UgdHlwZXMgY2FuIGJlIGFkanVzdGVkIGJ5IHVzZXJzIHRvIG1hdGNoIGFwcGxpY2F0aW9uIHJlcXVpcmVtZW50cy4gVGhlIGdvYWwgaXMgdG8KKwkvLyBtaW5pbWl6ZSBjb2RlIG1lbW9yeSBhbmQgbWF4aW1pemUgc3BlZWQuCisjZGVmaW5lIEdFTkVSSUMJCQkvLyBnZW5lcmljIHBvaW50ZXIgdG8gcG9pbnQgdG8gYXBwbGljYXRpb24gZGF0YQorCQkJCQkvLyBWYXJpYWJsZXMgd2l0aCB0aGlzIGF0dHJpYnV0ZSBjYW4gYmUgbG9jYXRlZCBpbiBleHRlcm5hbAorCQkJCQkvLyBvciBpbnRlcm5hbCBkYXRhIG1lbW9yeS4KKyNkZWZpbmUgTUVNCQkJLy8gTWVtb3J5IGF0dHJpYnV0ZSB0byBvcHRpbWl6ZSBzcGVlZCBhbmQgY29kZSBvZiBwb2ludGVyIGFjY2Vzcy4KKyNkZWZpbmUgTkVBUiBuZWFyCQkvLyB2YXJpYWJsZXMgbWFwcGVkIHRvIGludGVybmFsIGRhdGEgc3RvcmFnZSBsb2NhdGlvbgorI2RlZmluZSBGQVIgIGZhcgkJLy8gdmFyaWFibGVzIG1hcHBlZCB0byBleHRlcm5hbCBkYXRhIHN0b3JhZ2UgbG9jYXRpb24KKyNkZWZpbmUgQ09OU1QgY29uc3QJCS8vIHZhcmlhYmxlcyBtYXBwZWQgdG8gUk9NIChpLmUuIGZsYXNoKQorI2RlZmluZSBMQVJHRQorCisjZGVmaW5lIFJFRU5UUkFOVAorI2RlZmluZSBQVUJMSUMKKworI2lmbmRlZiBOREVCVUcKKyNpZm5kZWYgVFJBQ0UKKyNpbmNsdWRlIDxzdGRpby5oPgorI2RlZmluZSBUUkFDRSBwcmludGYKKyNlbmRpZgorI2VuZGlmCisKKyNlbmRpZgorCisjZWxpZiAoX01TQ19WRVIgPT0gODAwKQkJLy8gUEMgTVMgVmlzdWFsIEMvQysrIGZvciBET1MgYXBwbGljYXRpb25zCisKKyNkZWZpbmUgVEFSR0VUX1NZU1RFTSAgIF9ET1NfCisjZGVmaW5lIERFVl9TWVNURU0gICAgICBfREVWX01TVkNfRE9TXworCisjZGVmaW5lIFJPTQkJCS8vIGNvZGUgb3IgdmFyaWFibGVzIG1hcHBlZCB0byBST00gKGkuZS4gZmxhc2gpCisJCQkJICAgIC8vIHVzYWdlOiBDT05TVCBCWVRFIFJPTSBmb28gPSAweDAwOworI2RlZmluZSBIV0FDQyBuZWFyCQkvLyBoYXJkd2FyZSBhY2Nlc3MgdGhyb3VnaCBleHRlcm5hbCBtZW1vcnkgKGkuZS4gQ0FOKQorCisgICAgLy8gVGhlc2UgdHlwZXMgY2FuIGJlIGFkanVzdGVkIGJ5IHVzZXJzIHRvIG1hdGNoIGFwcGxpY2F0aW9uIHJlcXVpcmVtZW50cy4gVGhlIGdvYWwgaXMgdG8KKyAgICAvLyBtaW5pbWl6ZSBjb2RlIG1lbW9yeSBhbmQgbWF4aW1pemUgc3BlZWQuCisjZGVmaW5lIEdFTkVSSUMJCQkvLyBnZW5lcmljIHBvaW50ZXIgdG8gcG9pbnQgdG8gYXBwbGljYXRpb24gZGF0YQorCQkJCSAgICAvLyBWYXJpYWJsZXMgd2l0aCB0aGlzIGF0dHJpYnV0ZSBjYW4gYmUgbG9jYXRlZCBpbiBleHRlcm5hbAorCQkJCSAgICAvLyBvciBpbnRlcm5hbCBkYXRhIG1lbW9yeS4KKyNkZWZpbmUgTUVNCQkJLy8gTWVtb3J5IGF0dHJpYnV0ZSB0byBvcHRpbWl6ZSBzcGVlZCBhbmQgY29kZSBvZiBwb2ludGVyIGFjY2Vzcy4KKyNkZWZpbmUgTkVBUiBuZWFyCQkvLyB2YXJpYWJsZXMgbWFwcGVkIHRvIGludGVybmFsIGRhdGEgc3RvcmFnZSBsb2NhdGlvbgorI2RlZmluZSBGQVIgIGZhcgkJLy8gdmFyaWFibGVzIG1hcHBlZCB0byBleHRlcm5hbCBkYXRhIHN0b3JhZ2UgbG9jYXRpb24KKyNkZWZpbmUgQ09OU1QgY29uc3QJCS8vIHZhcmlhYmxlcyBtYXBwZWQgdG8gUk9NIChpLmUuIGZsYXNoKQorI2RlZmluZSBMQVJHRQorCisjZGVmaW5lIFJFRU5UUkFOVAorI2RlZmluZSBQVUJMSUMKKworI2lmbmRlZiBOREVCVUcKKyNpZm5kZWYgVFJBQ0UKKyNpbmNsdWRlIDxzdGRpby5oPgorI2RlZmluZSBUUkFDRSBwcmludGYKKyNlbmRpZgorI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBkZWZpbml0aW9ucyBmb3IgUlRYIHVuZGVyIFdJTjMyCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2VsaWYgKGRlZmluZWQgKFVOREVSX1JUU1MpICYmIGRlZmluZWQgKFdJTjMyKSkKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLSBkZWZpbml0aW9uIHRhcmdldCBzeXN0ZW0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgVEFSR0VUX1NZU1RFTSAgIF9XSU4zMl9SVFhfCisjZGVmaW5lIERFVl9TWVNURU0gICAgICBfREVWX1dJTjMyX1JUWF8KKworI2RlZmluZSBST00JCQkvLyBjb2RlIG9yIHZhcmlhYmxlcyBtYXBwZWQgdG8gUk9NIChpLmUuIGZsYXNoKQorCQkJCSAgICAvLyB1c2FnZTogQ09OU1QgQllURSBST00gZm9vID0gMHgwMDsKKyNkZWZpbmUgSFdBQ0MJCQkvLyBoYXJkd2FyZSBhY2Nlc3MgdGhyb3VnaCBleHRlcm5hbCBtZW1vcnkgKGkuZS4gQ0FOKQorCisgICAgLy8gVGhlc2UgdHlwZXMgY2FuIGJlIGFkanVzdGVkIGJ5IHVzZXJzIHRvIG1hdGNoIGFwcGxpY2F0aW9uIHJlcXVpcmVtZW50cy4gVGhlIGdvYWwgaXMgdG8KKyAgICAvLyBtaW5pbWl6ZSBjb2RlIG1lbW9yeSBhbmQgbWF4aW1pemUgc3BlZWQuCisjZGVmaW5lIEdFTkVSSUMJCQkvLyBnZW5lcmljIHBvaW50ZXIgdG8gcG9pbnQgdG8gYXBwbGljYXRpb24gZGF0YQorCQkJCSAgICAvLyBWYXJpYWJsZXMgd2l0aCB0aGlzIGF0dHJpYnV0ZSBjYW4gYmUgbG9jYXRlZCBpbiBleHRlcm5hbAorCQkJCSAgICAvLyBvciBpbnRlcm5hbCBkYXRhIG1lbW9yeS4KKyNkZWZpbmUgTUVNCQkJLy8gTWVtb3J5IGF0dHJpYnV0ZSB0byBvcHRpbWl6ZSBzcGVlZCBhbmQgY29kZSBvZiBwb2ludGVyIGFjY2Vzcy4KKworI2lmbmRlZiBORUFSCisjZGVmaW5lIE5FQVIJCQkvLyB2YXJpYWJsZXMgbWFwcGVkIHRvIGludGVybmFsIGRhdGEgc3RvcmFnZSBsb2NhdGlvbgorI2VuZGlmCisKKyNpZm5kZWYgRkFSCisjZGVmaW5lIEZBUgkJCS8vIHZhcmlhYmxlcyBtYXBwZWQgdG8gZXh0ZXJuYWwgZGF0YSBzdG9yYWdlIGxvY2F0aW9uCisjZW5kaWYKKworI2lmbmRlZiBDT05TVAorI2RlZmluZSBDT05TVCBjb25zdAkJLy8gdmFyaWFibGVzIG1hcHBlZCB0byBST00gKGkuZS4gZmxhc2gpCisjZW5kaWYKKworI2RlZmluZSBMQVJHRQorCisjZGVmaW5lIFJFRU5UUkFOVAorI2RlZmluZSBQVUJMSUMgX19zdGRjYWxsCisKKyNpZm5kZWYgTkRFQlVHCisjaWZuZGVmIFRSQUNFCisjZGVmaW5lIFRSQUNFIFJ0UHJpbnRmCisjZW5kaWYKKyNlbmRpZgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gZGVmaW5pdGlvbnMgZm9yIFdpbkNFCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2VsaWYgZGVmaW5lZCAoX1dJTjMyX1dDRSkKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLSBkZWZpbml0aW9uIHRhcmdldCBzeXN0ZW0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgVEFSR0VUX1NZU1RFTSAgICAgICAgICAgX1dJTkNFXworI2RlZmluZSBERVZfU1lTVEVNICAgICAgICAgICAgICBfREVWX1dJTl9DRV8KKworI2RlZmluZSBST00JCQkvLyBjb2RlIG9yIHZhcmlhYmxlcyBtYXBwZWQgdG8gUk9NIChpLmUuIGZsYXNoKQorCQkJCSAgICAvLyB1c2FnZTogQ09OU1QgQllURSBST00gZm9vID0gMHgwMDsKKyNkZWZpbmUgSFdBQ0MJCQkvLyBoYXJkd2FyZSBhY2Nlc3MgdGhyb3VnaCBleHRlcm5hbCBtZW1vcnkgKGkuZS4gQ0FOKQorCisgICAgLy8gVGhlc2UgdHlwZXMgY2FuIGJlIGFkanVzdGVkIGJ5IHVzZXJzIHRvIG1hdGNoIGFwcGxpY2F0aW9uIHJlcXVpcmVtZW50cy4gVGhlIGdvYWwgaXMgdG8KKyAgICAvLyBtaW5pbWl6ZSBjb2RlIG1lbW9yeSBhbmQgbWF4aW1pemUgc3BlZWQuCisjZGVmaW5lIEdFTkVSSUMJCQkvLyBnZW5lcmljIHBvaW50ZXIgdG8gcG9pbnQgdG8gYXBwbGljYXRpb24gZGF0YQorCQkJCSAgICAvLyBWYXJpYWJsZXMgd2l0aCB0aGlzIGF0dHJpYnV0ZSBjYW4gYmUgbG9jYXRlZCBpbiBleHRlcm5hbAorCQkJCSAgICAvLyBvciBpbnRlcm5hbCBkYXRhIG1lbW9yeS4KKyNkZWZpbmUgTUVNCQkJLy8gTWVtb3J5IGF0dHJpYnV0ZSB0byBvcHRpbWl6ZSBzcGVlZCBhbmQgY29kZSBvZiBwb2ludGVyIGFjY2Vzcy4KKworI2lmbmRlZiBORUFSCisjZGVmaW5lIE5FQVIJCQkvLyB2YXJpYWJsZXMgbWFwcGVkIHRvIGludGVybmFsIGRhdGEgc3RvcmFnZSBsb2NhdGlvbgorI2VuZGlmCisKKyNpZm5kZWYgRkFSCisjZGVmaW5lIEZBUgkJCS8vIHZhcmlhYmxlcyBtYXBwZWQgdG8gZXh0ZXJuYWwgZGF0YSBzdG9yYWdlIGxvY2F0aW9uCisjZW5kaWYKKworI2lmbmRlZiBDT05TVAorI2RlZmluZSBDT05TVCBjb25zdAkJLy8gdmFyaWFibGVzIG1hcHBlZCB0byBST00gKGkuZS4gZmxhc2gpCisjZW5kaWYKKworI2RlZmluZSBMQVJHRQorCisjaWZuZGVmIFFXT1JECisgICAgICAvLyNkZWZpbmUgUVdPUkQgbG9uZyBsb25nIGludCAvLyBNU1ZDIC5ORVQgY2FuIHVzZSAibG9uZyBsb25nIGludCIgdG9vIChsaWtlIEdOVSkKKyNkZWZpbmUgUVdPUkQgX19pbnQ2NAorI2VuZGlmCisKKyNkZWZpbmUgUkVFTlRSQU5UCisjZGVmaW5lIFBVQkxJQyBfX2NkZWNsCisKKyNpZmRlZiBBU1NFUlRNU0cKKyN1bmRlZiBBU1NFUlRNU0cKKyNlbmRpZgorCisjaWZuZGVmIE5ERUJVRworI2lmbmRlZiBUUkFDRQorI2RlZmluZSBUUkFDRSBwcmludGYKKy8vICAgICAgICAgICAgdm9pZCB0cmFjZSAoY2hhciAqZm10LCAuLi4pOworI2VuZGlmCisjZW5kaWYKKworI2Vsc2UgLy8gPT09PiBQQyBNUyBWaXN1YWwgQy9DKysKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLSBkZWZpbml0aW9uIHRhcmdldCBzeXN0ZW0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmZGVmIF9XSU4zMgorI2RlZmluZSBUQVJHRVRfU1lTVEVNICAgX1dJTjMyXwkvLyBXSU4zMiBkZWZpbml0aW9uCisjZGVmaW5lIERFVl9TWVNURU0gICAgICBfREVWX1dJTjMyXworI2Vsc2UKKyNkZWZpbmUgVEFSR0VUX1NZU1RFTSAgIF9XSU4xNl8JLy8gV0lOMTYgZGVmaW5pdGlvbgorI2RlZmluZSBERVZfU1lTVEVNICAgICAgX0RFVl9XSU4xNl8KKyNlbmRpZgorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tIFdJTjE2IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWYgKFRBUkdFVF9TWVNURU0gPT0gX1dJTjE2XykKKworI2RlZmluZSBST00JCQkvLyBjb2RlIG9yIHZhcmlhYmxlcyBtYXBwZWQgdG8gUk9NIChpLmUuIGZsYXNoKQorCQkJCQkvLyB1c2FnZTogQ09OU1QgQllURSBST00gZm9vID0gMHgwMDsKKyNkZWZpbmUgSFdBQ0MJCQkvLyBoYXJkd2FyZSBhY2Nlc3MgdGhyb3VnaCBleHRlcm5hbCBtZW1vcnkgKGkuZS4gQ0FOKQorCisJLy8gVGhlc2UgdHlwZXMgY2FuIGJlIGFkanVzdGVkIGJ5IHVzZXJzIHRvIG1hdGNoIGFwcGxpY2F0aW9uIHJlcXVpcmVtZW50cy4gVGhlIGdvYWwgaXMgdG8KKwkvLyBtaW5pbWl6ZSBjb2RlIG1lbW9yeSBhbmQgbWF4aW1pemUgc3BlZWQuCisjZGVmaW5lIEdFTkVSSUMJCQkvLyBnZW5lcmljIHBvaW50ZXIgdG8gcG9pbnQgdG8gYXBwbGljYXRpb24gZGF0YQorCQkJCQkvLyBWYXJpYWJsZXMgd2l0aCB0aGlzIGF0dHJpYnV0ZSBjYW4gYmUgbG9jYXRlZCBpbiBleHRlcm5hbAorCQkJCQkvLyBvciBpbnRlcm5hbCBkYXRhIG1lbW9yeS4KKyNkZWZpbmUgTUVNCQkJLy8gTWVtb3J5IGF0dHJpYnV0ZSB0byBvcHRpbWl6ZSBzcGVlZCBhbmQgY29kZSBvZiBwb2ludGVyIGFjY2Vzcy4KKworI2lmbmRlZiBORUFSCisjZGVmaW5lIE5FQVIJCQkvLyB2YXJpYWJsZXMgbWFwcGVkIHRvIGludGVybmFsIGRhdGEgc3RvcmFnZSBsb2NhdGlvbgorI2VuZGlmCisKKyNpZm5kZWYgRkFSCisjZGVmaW5lIEZBUiBmYXIJCQkvLyB2YXJpYWJsZXMgbWFwcGVkIHRvIGV4dGVybmFsIGRhdGEgc3RvcmFnZSBsb2NhdGlvbgorI2VuZGlmCisKKyNpZm5kZWYgQ09OU1QKKyNkZWZpbmUgQ09OU1QgY29uc3QJCS8vIHZhcmlhYmxlcyBtYXBwZWQgdG8gUk9NIChpLmUuIGZsYXNoKQorI2VuZGlmCisKKyNkZWZpbmUgTEFSR0UKKworI2RlZmluZSBSRUVOVFJBTlQKKyNkZWZpbmUgUFVCTElDIF9mYXIgX3Bhc2NhbCBfZXhwb3J0CisKKyNpZm5kZWYgTkRFQlVHCisjaWZuZGVmIFRSQUNFCisjZGVmaW5lIFRSQUNFIHRyYWNlCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisJdm9pZCB0cmFjZShjb25zdCBjaGFyICpmbXQsIC4uLik7CisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKKyNlbmRpZgorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLSBXSU4zMiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNpZiAoVEFSR0VUX1NZU1RFTSA9PSBfV0lOMzJfKQorI2RlZmluZSBST00JCQkvLyBjb2RlIG9yIHZhcmlhYmxlcyBtYXBwZWQgdG8gUk9NIChpLmUuIGZsYXNoKQorCQkJCQkvLyB1c2FnZTogQ09OU1QgQllURSBST00gZm9vID0gMHgwMDsKKyNkZWZpbmUgSFdBQ0MJCQkvLyBoYXJkd2FyZSBhY2Nlc3MgdGhyb3VnaCBleHRlcm5hbCBtZW1vcnkgKGkuZS4gQ0FOKQorCS8vIFRoZXNlIHR5cGVzIGNhbiBiZSBhZGp1c3RlZCBieSB1c2VycyB0byBtYXRjaCBhcHBsaWNhdGlvbiByZXF1aXJlbWVudHMuIFRoZSBnb2FsIGlzIHRvLy8gbWluaW1pemUgY29kZSBtZW1vcnkgYW5kIG1heGltaXplIHNwZWVkLgorI2RlZmluZSBHRU5FUklDCQkJLy8gZ2VuZXJpYyBwb2ludGVyIHRvIHBvaW50IHRvIGFwcGxpY2F0aW9uIGRhdGEKKwkJCQkJLy8gVmFyaWFibGVzIHdpdGggdGhpcyBhdHRyaWJ1dGUgY2FuIGJlIGxvY2F0ZWQgaW4gZXh0ZXJuYWwvLyBvciBpbnRlcm5hbCBkYXRhIG1lbW9yeS4KKyNkZWZpbmUgTUVNCQkJLy8gTWVtb3J5IGF0dHJpYnV0ZSB0byBvcHRpbWl6ZSBzcGVlZCBhbmQgY29kZSBvZiBwb2ludGVyIGFjY2Vzcy4KKyNpZm5kZWYgTkVBUgorI2RlZmluZSBORUFSCQkJLy8gdmFyaWFibGVzIG1hcHBlZCB0byBpbnRlcm5hbCBkYXRhIHN0b3JhZ2UgbG9jYXRpb24KKyNlbmRpZgorI2lmbmRlZiBGQVIKKyNkZWZpbmUgRkFSCQkJLy8gdmFyaWFibGVzIG1hcHBlZCB0byBleHRlcm5hbCBkYXRhIHN0b3JhZ2UgbG9jYXRpb24KKyNlbmRpZgorI2lmbmRlZiBDT05TVAorI2RlZmluZSBDT05TVCBjb25zdAkJLy8gdmFyaWFibGVzIG1hcHBlZCB0byBST00gKGkuZS4gZmxhc2gpCisjZW5kaWYKKyNkZWZpbmUgTEFSR0UKKyNkZWZpbmUgUkVFTlRSQU5UCisjZGVmaW5lIFBVQkxJQyBfX3N0ZGNhbGwKKyNpZm5kZWYgUVdPUkQKKwkgIC8vI2RlZmluZSBRV09SRCBsb25nIGxvbmcgaW50IC8vIE1TVkMgLk5FVCBjYW4gdXNlICJsb25nIGxvbmcgaW50IiB0b28gKGxpa2UgR05VKQorI2RlZmluZSBRV09SRCBfX2ludDY0CisjZW5kaWYKKyNpZm5kZWYgTkRFQlVHCisjaWZuZGVmIFRSQUNFCisjZGVmaW5lIFRSQUNFIHRyYWNlCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisJdm9pZCB0cmFjZShjb25zdCBjaGFyICpmbXQsIC4uLik7CisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKKwkvLyBNUyBWaXN1YWwgQysrIGNvbXBpbGVyIHN1cHBvcnRzIGZ1bmN0aW9uIGlubGluaW5nCisjZGVmaW5lIElOTElORV9GVU5DVElPTl9ERUYgX19mb3JjZWlubGluZQorCS8vIHRvIGFjdHVhbGx5IGVuYWJsZSBpbmxpbmluZyBqdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyB0d28gbGluZXMvLyAjZGVmaW5lIElOTElORV9GVU5DVElPTiAgICAgSU5MSU5FX0ZVTkNUSU9OX0RFRi8vICNkZWZpbmUgSU5MSU5FX0VOQUJMRUQgICAgICBUUlVFCisjZW5kaWYKKyNlbmRpZgkJCQkvLyA9PT0+IFBDCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS8vICBkZWZpbml0aW9ucyBvZiBiYXNpYyB0eXBlcy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjaWZuZGVmIF9XSU5ERUZfCQkvLyBkZWZpbmVkIGluIFdJTkRFRi5ILCBpbmNsdWRlZCBieSA8d2luZG93cy5oPgorICAgIC8vIC0tLSBhcml0aG1ldGljIHR5cGVzIC0tLQorI2lmbmRlZiBTSE9SVAorI2RlZmluZSBTSE9SVCBzaG9ydCBpbnQKKyNlbmRpZgorI2lmbmRlZiBVU0hPUlQKKyNkZWZpbmUgVVNIT1JUIHVuc2lnbmVkIHNob3J0IGludAorI2VuZGlmCisjaWZuZGVmIElOVAorI2RlZmluZSBJTlQgaW50CisjZW5kaWYKKyNpZm5kZWYgVUlOVAorI2RlZmluZSBVSU5UIHVuc2lnbmVkIGludAorI2VuZGlmCisjaWZuZGVmIExPTkcKKyNkZWZpbmUgTE9ORyBsb25nIGludAorI2VuZGlmCisjaWZuZGVmIFVMT05HCisjZGVmaW5lIFVMT05HIHVuc2lnbmVkIGxvbmcgaW50CisjZW5kaWYKKyAgICAvLyAtLS0gbG9naWMgdHlwZXMgLS0tCisjaWZuZGVmIEJZVEUKKyNkZWZpbmUgQllURSB1bnNpZ25lZCBjaGFyCisjZW5kaWYKKyNpZm5kZWYgV09SRAorI2RlZmluZSBXT1JEIHVuc2lnbmVkIHNob3J0IGludAorI2VuZGlmCisjaWZuZGVmIERXT1JECisjZGVmaW5lIERXT1JEIHVuc2lnbmVkIGxvbmcgaW50CisjZW5kaWYKKyNpZm5kZWYgQk9PTAorI2RlZmluZSBCT09MIHVuc2lnbmVkIGNoYXIKKyNlbmRpZgorICAgIC8vIC0tLSBhbGlhcyB0eXBlcyAtLS0KKyNpZm5kZWYgVFJVRQorI2RlZmluZSBUUlVFICAweEZGCisjZW5kaWYKKyNpZm5kZWYgRkFMU0UKKyNkZWZpbmUgRkFMU0UgMHgwMAorI2VuZGlmCisjaWZuZGVmIE5VTEwKKyNkZWZpbmUgTlVMTCAoKHZvaWQgKikgMCkKKyNlbmRpZgorI2VuZGlmCisjaWZuZGVmIF9USU1FX09GX0RBWV9ERUZJTkVEXwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGxvbmcgaW50IG1fZHdNczsKKwl1bnNpZ25lZCBzaG9ydCBpbnQgbV93RGF5czsKKworfSB0VGltZU9mRGF5OworCisjZGVmaW5lIF9USU1FX09GX0RBWV9ERUZJTkVEXworCisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBEZWZpbml0aW9uIHZvbiBUUkFDRQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmbmRlZiBOREVCVUcKKworI2lmbmRlZiBUUkFDRTAKKyNkZWZpbmUgVFJBQ0UwKHAwKSAgICAgICAgICAgICAgICAgICAgICBUUkFDRShwMCkKKyNlbmRpZgorCisjaWZuZGVmIFRSQUNFMQorI2RlZmluZSBUUkFDRTEocDAsIHAxKSAgICAgICAgICAgICAgICAgIFRSQUNFKHAwLCBwMSkKKyNlbmRpZgorCisjaWZuZGVmIFRSQUNFMgorI2RlZmluZSBUUkFDRTIocDAsIHAxLCBwMikgICAgICAgICAgICAgIFRSQUNFKHAwLCBwMSwgcDIpCisjZW5kaWYKKworI2lmbmRlZiBUUkFDRTMKKyNkZWZpbmUgVFJBQ0UzKHAwLCBwMSwgcDIsIHAzKSAgICAgICAgICBUUkFDRShwMCwgcDEsIHAyLCBwMykKKyNlbmRpZgorCisjaWZuZGVmIFRSQUNFNAorI2RlZmluZSBUUkFDRTQocDAsIHAxLCBwMiwgcDMsIHA0KSAgICAgIFRSQUNFKHAwLCBwMSwgcDIsIHAzLCBwNCkKKyNlbmRpZgorCisjaWZuZGVmIFRSQUNFNQorI2RlZmluZSBUUkFDRTUocDAsIHAxLCBwMiwgcDMsIHA0LCBwNSkgIFRSQUNFKHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUpCisjZW5kaWYKKworI2lmbmRlZiBUUkFDRTYKKyNkZWZpbmUgVFJBQ0U2KHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIHA2KSAgVFJBQ0UocDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgcDYpCisjZW5kaWYKKworI2Vsc2UKKworI2lmbmRlZiBUUkFDRTAKKyNkZWZpbmUgVFJBQ0UwKHAwKQorI2VuZGlmCisKKyNpZm5kZWYgVFJBQ0UxCisjZGVmaW5lIFRSQUNFMShwMCwgcDEpCisjZW5kaWYKKworI2lmbmRlZiBUUkFDRTIKKyNkZWZpbmUgVFJBQ0UyKHAwLCBwMSwgcDIpCisjZW5kaWYKKworI2lmbmRlZiBUUkFDRTMKKyNkZWZpbmUgVFJBQ0UzKHAwLCBwMSwgcDIsIHAzKQorI2VuZGlmCisKKyNpZm5kZWYgVFJBQ0U0CisjZGVmaW5lIFRSQUNFNChwMCwgcDEsIHAyLCBwMywgcDQpCisjZW5kaWYKKworI2lmbmRlZiBUUkFDRTUKKyNkZWZpbmUgVFJBQ0U1KHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUpCisjZW5kaWYKKworI2lmbmRlZiBUUkFDRTYKKyNkZWZpbmUgVFJBQ0U2KHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIHA2KQorI2VuZGlmCisKKyNlbmRpZgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIGRlZmluaXRpb24gb2YgQVNTRVJUCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWZuZGVmIEFTU0VSVAorI2lmICFkZWZpbmVkIChfX2xpbnV4X18pICYmICFkZWZpbmVkIChfX0tFUk5FTF9fKQorI2luY2x1ZGUgPGFzc2VydC5oPgorI2lmbmRlZiBBU1NFUlQKKyNkZWZpbmUgQVNTRVJUKHApICAgIGFzc2VydChwKQorI2VuZGlmCisjZWxzZQorI2RlZmluZSBBU1NFUlQocCkKKyNlbmRpZgorI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgU1lTIFRFQyBleHRlbnNpb25zCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBUaGlzIG1hY3JvIGRvZXNuJ3QgcHJpbnQgb3V0IEMtZmlsZSBhbmQgbGluZSBudW1iZXIgb2YgdGhlIGZhaWxlZCBhc3NlcnRpb24KKy8vIGJ1dCBhIHN0cmluZywgd2hpY2ggZXhhY3RseSBuYW1lcyB0aGUgbWlzdGFrZS4KKyNpZm5kZWYgTkRFQlVHCisKKyNkZWZpbmUgQVNTRVJUTVNHKGV4cHIsc3RyaW5nKSAgaWYgKCEoZXhwcikpIHtcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJJTlRGMCAoIkFzc2VydGlvbiBmYWlsZWQ6ICIgc3RyaW5nICk7XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICgxKTt9CisjZWxzZQorI2RlZmluZSBBU1NFUlRNU0coZXhwcixzdHJpbmcpCisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2VuZGlmIC8vICNpZm5kZWYgX0dMT0JBTF9IXworCisvLyBQbGVhc2Uga2VlcCBhbiBlbXB0eSBsaW5lIGF0IHRoZSBlbmQgb2YgdGhpcyBmaWxlLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9rZXJuZWwvRXBsRGxsay5oIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9rZXJuZWwvRXBsRGxsay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4OGU4NzEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL2tlcm5lbC9FcGxEbGxrLmgKQEAgLTAsMCArMSwxNjUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBpbmNsdWRlIGZpbGUgZm9yIGtlcm5lbHNwYWNlIERMTCBtb2R1bGUKKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgICAgICAgICRSQ1NmaWxlOiBFcGxEbGxrLmgsdiAkCisKKyAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAorCisgICAgICAgICAgICAgICAgJFJldmlzaW9uOiAxLjYgJCAgJERhdGU6IDIwMDgvMTAvMTcgMTU6MzI6MzIgJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgICAgIEdDQyBWMy40CisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwNi8wNi8wOCBkLmsuOiAgIHN0YXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiwgdmVyc2lvbiAxLjAwCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX0VQTF9ETExLX0hfCisjZGVmaW5lIF9FUExfRExMS19IXworCisjaW5jbHVkZSAiLi4vRXBsRGxsLmgiCisjaW5jbHVkZSAiLi4vRXBsRXZlbnQuaCIKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvbnN0IGRlZmluZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyB0eXBlZGVmCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0eXBlZGVmIHRFcGxLZXJuZWwoKnRFcGxEbGxrQ2JBc3luYykgKHRFcGxGcmFtZUluZm8gKiBwRnJhbWVJbmZvX3ApOworCit0eXBlZGVmIHN0cnVjdCB7CisJQllURSBtX2JlX2FiU3JjTWFjWzZdOworCit9IHRFcGxEbGxrSW5pdFBhcmFtOworCisvLyBmb3J3YXJkIGRlY2xhcmF0aW9uCitzdHJ1Y3QgX3RFZHJ2VHhCdWZmZXI7CisKK3N0cnVjdCBfdEVwbERsbGtOb2RlSW5mbyB7CisJc3RydWN0IF90RXBsRGxsa05vZGVJbmZvICptX3BOZXh0Tm9kZUluZm87CisJc3RydWN0IF90RWRydlR4QnVmZmVyICptX3BQcmVxVHhCdWZmZXI7CisJdW5zaWduZWQgaW50IG1fdWlOb2RlSWQ7CisJRFdPUkQgbV9kd1ByZXNUaW1lb3V0OworCXVuc2lnbmVkIGxvbmcgbV91bERsbEVycm9yRXZlbnRzOworCXRFcGxObXRTdGF0ZSBtX05tdFN0YXRlOworCVdPUkQgbV93UHJlc1BheWxvYWRMaW1pdDsKKwlCWVRFIG1fYmVfYWJNYWNBZGRyWzZdOworCUJZVEUgbV9iU29hRmxhZzE7CisJQk9PTCBtX2ZTb2Z0RGVsZXRlOwkvLyBkZWxldGUgbm9kZSBhZnRlciBlcnJvciBhbmQgaWdub3JlIGVycm9yCisKK307CisKK3R5cGVkZWYgc3RydWN0IF90RXBsRGxsa05vZGVJbmZvIHRFcGxEbGxrTm9kZUluZm87CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX0RMTEspKSAhPSAwKQorCit0RXBsS2VybmVsIEVwbERsbGtBZGRJbnN0YW5jZSh0RXBsRGxsa0luaXRQYXJhbSAqIHBJbml0UGFyYW1fcCk7CisKK3RFcGxLZXJuZWwgRXBsRGxsa0RlbEluc3RhbmNlKHZvaWQpOworCisvLyBjYWxsZWQgYmVmb3JlIE5NVF9HU19DT01NVU5JQ0FUSU5HIHdpbGwgYmUgZW50ZXJlZCB0byBjb25maWd1cmUgZml4ZWQgcGFyYW1ldGVycwordEVwbEtlcm5lbCBFcGxEbGxrQ29uZmlnKHRFcGxEbGxDb25maWdQYXJhbSAqIHBEbGxDb25maWdQYXJhbV9wKTsKKworLy8gc2V0IGlkZW50aXR5IG9mIGxvY2FsIG5vZGUgKG1heSBiZSBhdCBhbnkgdGltZSwgZS5nLiBpbiBjYXNlIG9mIGhvc3RuYW1lIGNoYW5nZSkKK3RFcGxLZXJuZWwgRXBsRGxsa1NldElkZW50aXR5KHRFcGxEbGxJZGVudFBhcmFtICogcERsbElkZW50UGFyYW1fcCk7CisKKy8vIHByb2Nlc3MgaW50ZXJuYWwgZXZlbnRzIGFuZCBkbyB3b3JrIHRoYXQgY2Fubm90IGJlIGRvbmUgaW4gaW50ZXJydXB0LWNvbnRleHQKK3RFcGxLZXJuZWwgRXBsRGxsa1Byb2Nlc3ModEVwbEV2ZW50ICogcEV2ZW50X3ApOworCisvLyByZWdpc3RlcnMgaGFuZGxlciBmb3Igbm9uLUVQTCBmcmFtZXMKK3RFcGxLZXJuZWwgRXBsRGxsa1JlZ0FzeW5jSGFuZGxlcih0RXBsRGxsa0NiQXN5bmMgcGZuRGxsa0NiQXN5bmNfcCk7CisKKy8vIGRlcmVnaXN0ZXJzIGhhbmRsZXIgZm9yIG5vbi1FUEwgZnJhbWVzCit0RXBsS2VybmVsIEVwbERsbGtEZXJlZ0FzeW5jSGFuZGxlcih0RXBsRGxsa0NiQXN5bmMgcGZuRGxsa0NiQXN5bmNfcCk7CisKKy8vIHJlZ2lzdGVyIENfRExMX01VTFRJQ0FTVF9BU05EIGluIGV0aGVybmV0IGRyaXZlciBpZiBhbnkgQXNuZFNlcnZpY2VJZCBpcyByZWdpc3RlcmVkCit0RXBsS2VybmVsIEVwbERsbGtTZXRBc25kU2VydmljZUlkRmlsdGVyKHRFcGxEbGxBc25kU2VydmljZUlkIFNlcnZpY2VJZF9wLAorCQkJCQkgdEVwbERsbEFzbmRGaWx0ZXIgRmlsdGVyX3ApOworCisvLyBjcmVhdGVzIHRoZSBidWZmZXIgZm9yIGEgVHggZnJhbWUgYW5kIHJlZ2lzdGVycyBpdCB0byB0aGUgZXRoZXJuZXQgZHJpdmVyCit0RXBsS2VybmVsIEVwbERsbGtDcmVhdGVUeEZyYW1lKHVuc2lnbmVkIGludCAqcHVpSGFuZGxlX3AsCisJCQkJdEVwbEZyYW1lICoqIHBwRnJhbWVfcCwKKwkJCQl1bnNpZ25lZCBpbnQgKnB1aUZyYW1lU2l6ZV9wLAorCQkJCXRFcGxNc2dUeXBlIE1zZ1R5cGVfcCwKKwkJCQl0RXBsRGxsQXNuZFNlcnZpY2VJZCBTZXJ2aWNlSWRfcCk7CisKK3RFcGxLZXJuZWwgRXBsRGxsa0RlbGV0ZVR4RnJhbWUodW5zaWduZWQgaW50IHVpSGFuZGxlX3ApOworCisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVF9NTikpICE9IDApCisKK3RFcGxLZXJuZWwgRXBsRGxsa0FkZE5vZGUodEVwbERsbE5vZGVJbmZvICogcE5vZGVJbmZvX3ApOworCit0RXBsS2VybmVsIEVwbERsbGtEZWxldGVOb2RlKHVuc2lnbmVkIGludCB1aU5vZGVJZF9wKTsKKwordEVwbEtlcm5lbCBFcGxEbGxrU29mdERlbGV0ZU5vZGUodW5zaWduZWQgaW50IHVpTm9kZUlkX3ApOworCit0RXBsS2VybmVsIEVwbERsbGtTZXRGbGFnMU9mTm9kZSh1bnNpZ25lZCBpbnQgdWlOb2RlSWRfcCwgQllURSBiU29hRmxhZzFfcCk7CisKK3RFcGxLZXJuZWwgRXBsRGxsa0dldEZpcnN0Tm9kZUluZm8odEVwbERsbGtOb2RlSW5mbyAqKiBwcE5vZGVJbmZvX3ApOworCisjZW5kaWYgLy8oKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVF9NTikpICE9IDApCisKKyNlbmRpZiAvLyAjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX0RMTEspKSAhPSAwKQorCisjZW5kaWYgLy8gI2lmbmRlZiBfRVBMX0RMTEtfSF8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwva2VybmVsL0VwbERsbGtDYWwuaCBiL2RyaXZlcnMvc3RhZ2luZy9lcGwva2VybmVsL0VwbERsbGtDYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzRkYzdlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9rZXJuZWwvRXBsRGxsa0NhbC5oCkBAIC0wLDAgKzEsMTQxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgb3BlblBPV0VSTElOSworCisgIERlc2NyaXB0aW9uOiAgaW5jbHVkZSBmaWxlIGZvciBrZXJuZWxzcGFjZSBETEwgQ29tbXVuaWNhdGlvbiBBYnN0cmFjdGlvbiBMYXllciBtb2R1bGUKKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgICAgICAgICRSQ1NmaWxlOiBFcGxEbGxrQ2FsLmgsdiAkCisKKyAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAorCisgICAgICAgICAgICAgICAgJFJldmlzaW9uOiAxLjYgJCAgJERhdGU6IDIwMDgvMTEvMTMgMTc6MTM6MDkgJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgICAgIEdDQyBWMy40CisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwNi8wNi8xMyBkLmsuOiAgIHN0YXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiwgdmVyc2lvbiAxLjAwCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX0VQTF9ETExLQ0FMX0hfCisjZGVmaW5lIF9FUExfRExMS0NBTF9IXworCisjaW5jbHVkZSAiLi4vRXBsRGxsLmgiCisjaW5jbHVkZSAiLi4vRXBsRXZlbnQuaCIKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvbnN0IGRlZmluZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyB0eXBlZGVmCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgbG9uZyBtX3VsQ3VyVHhGcmFtZUNvdW50R2VuOworCXVuc2lnbmVkIGxvbmcgbV91bEN1clR4RnJhbWVDb3VudE5tdDsKKwl1bnNpZ25lZCBsb25nIG1fdWxDdXJSeEZyYW1lQ291bnQ7CisJdW5zaWduZWQgbG9uZyBtX3VsTWF4VHhGcmFtZUNvdW50R2VuOworCXVuc2lnbmVkIGxvbmcgbV91bE1heFR4RnJhbWVDb3VudE5tdDsKKwl1bnNpZ25lZCBsb25nIG1fdWxNYXhSeEZyYW1lQ291bnQ7CisKK30gdEVwbERsbGtDYWxTdGF0aXN0aWNzOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9ETExLKSkgIT0gMCkKKwordEVwbEtlcm5lbCBFcGxEbGxrQ2FsQWRkSW5zdGFuY2Uodm9pZCk7CisKK3RFcGxLZXJuZWwgRXBsRGxsa0NhbERlbEluc3RhbmNlKHZvaWQpOworCit0RXBsS2VybmVsIEVwbERsbGtDYWxBc3luY0dldFR4Q291bnQodEVwbERsbEFzeW5jUmVxUHJpb3JpdHkgKiBwUHJpb3JpdHlfcCwKKwkJCQkgICAgIHVuc2lnbmVkIGludCAqcHVpQ291bnRfcCk7Cit0RXBsS2VybmVsIEVwbERsbGtDYWxBc3luY0dldFR4RnJhbWUodm9pZCAqcEZyYW1lX3AsCisJCQkJICAgICB1bnNpZ25lZCBpbnQgKnB1aUZyYW1lU2l6ZV9wLAorCQkJCSAgICAgdEVwbERsbEFzeW5jUmVxUHJpb3JpdHkgUHJpb3JpdHlfcCk7CisvLyBvbmx5IGZyYW1lcyB3aXRoIHJlZ2lzdGVyZWQgQXNuZFNlcnZpY2VJZHMgYXJlIHBhc3NlZCB0byBDQUwKK3RFcGxLZXJuZWwgRXBsRGxsa0NhbEFzeW5jRnJhbWVSZWNlaXZlZCh0RXBsRnJhbWVJbmZvICogcEZyYW1lSW5mb19wKTsKKwordEVwbEtlcm5lbCBFcGxEbGxrQ2FsQXN5bmNTZW5kKHRFcGxGcmFtZUluZm8gKiBwRnJhbWVJbmZvX3AsCisJCQkgICAgICAgdEVwbERsbEFzeW5jUmVxUHJpb3JpdHkgUHJpb3JpdHlfcCk7CisKK3RFcGxLZXJuZWwgRXBsRGxsa0NhbEFzeW5jQ2xlYXJCdWZmZXIodm9pZCk7CisKK3RFcGxLZXJuZWwgRXBsRGxsa0NhbEdldFN0YXRpc3RpY3ModEVwbERsbGtDYWxTdGF0aXN0aWNzICoqIHBwU3RhdGlzdGljcyk7CisKK3RFcGxLZXJuZWwgRXBsRGxsa0NhbFByb2Nlc3ModEVwbEV2ZW50ICogcEV2ZW50X3ApOworCisjaWYgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRfTU4pKSAhPSAwKQorCit0RXBsS2VybmVsIEVwbERsbGtDYWxBc3luY0NsZWFyUXVldWVzKHZvaWQpOworCit0RXBsS2VybmVsIEVwbERsbGtDYWxJc3N1ZVJlcXVlc3QodEVwbERsbFJlcVNlcnZpY2VJZCBTZXJ2aWNlX3AsCisJCQkJICB1bnNpZ25lZCBpbnQgdWlOb2RlSWRfcCwgQllURSBiU29hRmxhZzFfcCk7CisKK3RFcGxLZXJuZWwgRXBsRGxsa0NhbEFzeW5jR2V0U29hUmVxdWVzdCh0RXBsRGxsUmVxU2VydmljZUlkICogcFJlcVNlcnZpY2VJZF9wLAorCQkJCQl1bnNpZ25lZCBpbnQgKnB1aU5vZGVJZF9wKTsKKwordEVwbEtlcm5lbCBFcGxEbGxrQ2FsQXN5bmNTZXRQZW5kaW5nUmVxdWVzdHModW5zaWduZWQgaW50IHVpTm9kZUlkX3AsCisJCQkJCSAgICAgdEVwbERsbEFzeW5jUmVxUHJpb3JpdHkKKwkJCQkJICAgICBBc3luY1JlcVByaW9fcCwKKwkJCQkJICAgICB1bnNpZ25lZCBpbnQgdWlDb3VudF9wKTsKKworI2VuZGlmIC8vKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRfTU4pKSAhPSAwKQorCisjZW5kaWYgLy8gI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9ETExLKSkgIT0gMCkKKworI2VuZGlmIC8vICNpZm5kZWYgX0VQTF9ETExLQ0FMX0hfCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL2tlcm5lbC9FcGxFcnJvckhhbmRsZXJrLmggYi9kcml2ZXJzL3N0YWdpbmcvZXBsL2tlcm5lbC9FcGxFcnJvckhhbmRsZXJrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGE2N2VmOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwva2VybmVsL0VwbEVycm9ySGFuZGxlcmsuaApAQCAtMCwwICsxLDEwMCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIGluY2x1ZGUgZmlsZSBmb3Iga2VybmVsIGVycm9yIGhhbmRsZXIgbW9kdWxlCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRXBsRXJyb3JIYW5kbGVyay5oLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS40ICQgICREYXRlOiAyMDA4LzA0LzE3IDIxOjM2OjMyICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorICAgICAgICAgICAgICAgICAgICBHQ0MgVjMuNAorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgIDIwMDYvMTAvMDIgZC5rLjogICBzdGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24sIHZlcnNpb24gMS4wMAorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9FUExfRVJST1JIQU5ETEVSS19IXworI2RlZmluZSBfRVBMX0VSUk9SSEFORExFUktfSF8KKworI2luY2x1ZGUgIi4uL0VwbEV2ZW50LmgiCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gdHlwZWRlZgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIGluaXQgZnVuY3Rpb24KK3RFcGxLZXJuZWwgUFVCTElDIEVwbEVycm9ySGFuZGxlcmtJbml0KHZvaWQpOworCisvLyBhZGQgaW5zdGFuY2UKK3RFcGxLZXJuZWwgUFVCTElDIEVwbEVycm9ySGFuZGxlcmtBZGRJbnN0YW5jZSh2b2lkKTsKKworLy8gZGVsZXRlIGluc3RhbmNlCit0RXBsS2VybmVsIFBVQkxJQyBFcGxFcnJvckhhbmRsZXJrRGVsSW5zdGFuY2Uodm9pZCk7CisKKy8vIHByb2Nlc3NlcyBlcnJvciBldmVudHMKK3RFcGxLZXJuZWwgUFVCTElDIEVwbEVycm9ySGFuZGxlcmtQcm9jZXNzKHRFcGxFdmVudCAqIHBFdmVudF9wKTsKKworI2VuZGlmIC8vICNpZm5kZWYgX0VQTF9FUlJPUkhBTkRMRVJLX0hfCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL2tlcm5lbC9FcGxFdmVudGsuaCBiL2RyaXZlcnMvc3RhZ2luZy9lcGwva2VybmVsL0VwbEV2ZW50ay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkMjVhYWEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL2tlcm5lbC9FcGxFdmVudGsuaApAQCAtMCwwICsxLDEwOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIGluY2x1ZGUgZmlsZSBmb3Iga2VybmVsIGV2ZW50IG1vZHVsZQorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgJFJDU2ZpbGU6IEVwbEV2ZW50ay5oLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS40ICQgICREYXRlOiAyMDA4LzA0LzE3IDIxOjM2OjMyICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorICAgICAgICAgICAgICAgICAgICBHQ0MgVjMuNAorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgIDIwMDYvMDYvMTIgZC5rLjogICBzdGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24sIHZlcnNpb24gMS4wMAorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9FUExfRVZFTlRLX0hfCisjZGVmaW5lIF9FUExfRVZFTlRLX0hfCisKKyNpbmNsdWRlICIuLi9FcGxFdmVudC5oIgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHR5cGVkZWYKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBpbml0IGZ1bmN0aW9uCit0RXBsS2VybmVsIFBVQkxJQyBFcGxFdmVudGtJbml0KHRFcGxTeW5jQ2IgZnBTeW5jQ2IpOworCisvLyBhZGQgaW5zdGFuY2UKK3RFcGxLZXJuZWwgUFVCTElDIEVwbEV2ZW50a0FkZEluc3RhbmNlKHRFcGxTeW5jQ2IgZnBTeW5jQ2IpOworCisvLyBkZWxldGUgaW5zdGFuY2UKK3RFcGxLZXJuZWwgUFVCTElDIEVwbEV2ZW50a0RlbEluc3RhbmNlKHZvaWQpOworCisvLyBLZXJuZWx0aHJlYWQgdGhhdCBkaXNwYXRjaGVzIGV2ZW50cyBpbiBrZXJuZWxzcGFjZQordEVwbEtlcm5lbCBQVUJMSUMgRXBsRXZlbnRrUHJvY2Vzcyh0RXBsRXZlbnQgKiBwRXZlbnRfcCk7CisKKy8vIHBvc3QgZXZlbnRzIGZyb20ga2VybmVsc3BhY2UKK3RFcGxLZXJuZWwgUFVCTElDIEVwbEV2ZW50a1Bvc3QodEVwbEV2ZW50ICogcEV2ZW50X3ApOworCisvLyBwb3N0IGVycm9yZXZlbnRzIGZyb20ga2VybmVsc3BhY2UKK3RFcGxLZXJuZWwgUFVCTElDIEVwbEV2ZW50a1Bvc3RFcnJvcih0RXBsRXZlbnRTb3VyY2UgRXZlbnRTb3VyY2VfcCwKKwkJCQkgICAgIHRFcGxLZXJuZWwgRXBsRXJyb3JfcCwKKwkJCQkgICAgIHVuc2lnbmVkIGludCB1aUFyZ1NpemVfcCwgdm9pZCAqcEFyZ19wKTsKKworI2VuZGlmIC8vICNpZm5kZWYgX0VQTF9FVkVOVEtfSF8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwva2VybmVsL0VwbE5tdGsuaCBiL2RyaXZlcnMvc3RhZ2luZy9lcGwva2VybmVsL0VwbE5tdGsuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzQwOWNjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9rZXJuZWwvRXBsTm10ay5oCkBAIC0wLDAgKzEsMTA1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgb3BlblBPV0VSTElOSworCisgIERlc2NyaXB0aW9uOiAgaW5jbHVkZSBmaWxlIGZvciBOTVQtS2VybmVsc3BhY2UtTW9kdWxlCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRXBsTm10ay5oLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS41ICQgICREYXRlOiAyMDA4LzEwLzE3IDE1OjMyOjMyICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorICAgICAgICAgICAgICAgICAgICBHQ0MgVjMuNAorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgIDIwMDYvMDYvMDkgay50LjogICBzdGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfRVBMTk1US19IXworI2RlZmluZSBfRVBMTk1US19IXworCisjaW5jbHVkZSAiLi4vRXBsTm10LmgiCisjaW5jbHVkZSAiRXBsRXZlbnRrLmgiCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gdHlwZWRlZgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVEspKSAhPSAwKQorRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbE5tdGtJbml0KEVQTF9NQ09fREVDTF9QVFJfSU5TVEFOQ0VfUFRSKTsKKworRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDCitFcGxObXRrQWRkSW5zdGFuY2UoRVBMX01DT19ERUNMX1BUUl9JTlNUQU5DRV9QVFIpOworCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMKK0VwbE5tdGtEZWxJbnN0YW5jZShFUExfTUNPX0RFQ0xfUFRSX0lOU1RBTkNFX1BUUik7CisKK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxObXRrUHJvY2VzcyhFUExfTUNPX0RFQ0xfUFRSX0lOU1RBTkNFX1BUUl8KKwkJCQkJICAgICAgdEVwbEV2ZW50ICogcEV2ZW50X3ApOworCitFUExETExFWFBPUlQgdEVwbE5tdFN0YXRlIFBVQkxJQworRXBsTm10a0dldE5tdFN0YXRlKEVQTF9NQ09fREVDTF9QVFJfSU5TVEFOQ0VfUFRSKTsKKworI2VuZGlmIC8vICNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1USykpICE9IDApCisKKyNlbmRpZiAvLyAjaWZuZGVmIF9FUExOTVRLX0hfCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL2tlcm5lbC9FcGxObXRrQ2FsLmggYi9kcml2ZXJzL3N0YWdpbmcvZXBsL2tlcm5lbC9FcGxObXRrQ2FsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWVkZWFmYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwva2VybmVsL0VwbE5tdGtDYWwuaApAQCAtMCwwICsxLDg5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgb3BlblBPV0VSTElOSworCisgIERlc2NyaXB0aW9uOiAgaW5jbHVkZSBmaWxlIGZvciBjb21tdW5pY2F0aW9uIGFic3RyYWN0aW9uIGxheWVyIG9mIHRoZQorICAgICAgICAgICAgICAgIE5NVC1LZXJuZWwtTW9kdWxlCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRXBsTm10a0NhbC5oLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS4zICQgICREYXRlOiAyMDA4LzA0LzE3IDIxOjM2OjMyICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorICAgICAgICAgICAgICAgIEtFSUwgdVZpc2lvbiAyCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwNi8wNi8xNiAtay50LjogICBzdGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkVwbE5tdGsuaCIKKworI2lmbmRlZiBfRVBMTk1US0NBTF9IXworI2RlZmluZSBfRVBMTk1US0NBTF9IXworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHR5cGVkZWYKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZW5kaWYgLy8gI2lmbmRlZiBfRVBMTk1US0NBTF9IXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9rZXJuZWwvRXBsT2Jkay5oIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9rZXJuZWwvRXBsT2Jkay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmOWY1ODMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL2tlcm5lbC9FcGxPYmRrLmgKQEAgLTAsMCArMSwxOTYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBpbmNsdWRlIGZpbGUgZm9yIEVwbC1PYmQtS2VybmVsLU1vZHVsCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRXBsT2Jkay5oLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS44ICQgICREYXRlOiAyMDA4LzEwLzE3IDE1OjMyOjMyICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorICAgICAgICAgICAgICAgICAgICBHQ0MgVjMuNAorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgIDIwMDYvMDYvMTkgay50LjogICBzdGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIi4uL0VwbE9iZC5oIgorCisjaWZuZGVmIF9FUExPQkRLX0hfCisjZGVmaW5lIF9FUExPQkRLX0hfCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gdHlwZWRlZgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGdsb2JhbCB2YXJpYWJsZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2V4dGVybiBCWVRFIE1FTSBhYkVwbE9iZFRyYXNoT2JqZWN0X2dbOF07CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9PQkRLKSkgIT0gMCkKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbE9iZEluaXQoRVBMX01DT19ERUNMX1BUUl9JTlNUQU5DRV9QVFJfCisJCQkJCSAgdEVwbE9iZEluaXRQYXJhbSBNRU0gKiBwSW5pdFBhcmFtX3ApOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxPYmRBZGRJbnN0YW5jZShFUExfTUNPX0RFQ0xfUFRSX0lOU1RBTkNFX1BUUl8KKwkJCQkJCSB0RXBsT2JkSW5pdFBhcmFtIE1FTSAqCisJCQkJCQkgcEluaXRQYXJhbV9wKTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMgRXBsT2JkRGVsZXRlSW5zdGFuY2UoRVBMX01DT19ERUNMX0lOU1RBTkNFX1BUUik7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbE9iZFdyaXRlRW50cnkoRVBMX01DT19ERUNMX0lOU1RBTkNFX1BUUl8KKwkJCQkJCXVuc2lnbmVkIGludCB1aUluZGV4X3AsCisJCQkJCQl1bnNpZ25lZCBpbnQgdWlTdWJJbmRleF9wLAorCQkJCQkJdm9pZCAqcFNyY0RhdGFfcCwKKwkJCQkJCXRFcGxPYmRTaXplIFNpemVfcCk7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbE9iZFJlYWRFbnRyeShFUExfTUNPX0RFQ0xfSU5TVEFOQ0VfUFRSXworCQkJCQkgICAgICAgdW5zaWduZWQgaW50IHVpSW5kZXhfcCwKKwkJCQkJICAgICAgIHVuc2lnbmVkIGludCB1aVN1YkluZGV4X3AsCisJCQkJCSAgICAgICB2b2lkICpwRHN0RGF0YV9wLAorCQkJCQkgICAgICAgdEVwbE9iZFNpemUgKiBwU2l6ZV9wKTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMKK0VwbE9iZFNldFN0b3JlTG9hZE9iakNhbGxiYWNrKEVQTF9NQ09fREVDTF9JTlNUQU5DRV9QVFJfCisJCQkgICAgICB0RXBsT2JkU3RvcmVMb2FkT2JqQ2FsbGJhY2sgZnBDYWxsYmFja19wKTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMgRXBsT2JkQWNjZXNzT2RQYXJ0KEVQTF9NQ09fREVDTF9JTlNUQU5DRV9QVFJfCisJCQkJCQkgIHRFcGxPYmRQYXJ0IE9iZFBhcnRfcCwKKwkJCQkJCSAgdEVwbE9iZERpciBEaXJlY3Rpb25fcCk7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbE9iZERlZmluZVZhcihFUExfTUNPX0RFQ0xfSU5TVEFOQ0VfUFRSXworCQkJCQkgICAgICAgdEVwbFZhclBhcmFtIE1FTSAqIHBWYXJQYXJhbV9wKTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdm9pZCAqUFVCTElDIEVwbE9iZEdldE9iamVjdERhdGFQdHIoRVBMX01DT19ERUNMX0lOU1RBTkNFX1BUUl8KKwkJCQkJCSB1bnNpZ25lZCBpbnQgdWlJbmRleF9wLAorCQkJCQkJIHVuc2lnbmVkIGludCB1aVN1YkluZGV4X3ApOworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMgRXBsT2JkUmVnaXN0ZXJVc2VyT2QoRVBMX01DT19ERUNMX0lOU1RBTkNFX1BUUl8KKwkJCQkJCSAgICB0RXBsT2JkRW50cnlQdHIgcFVzZXJPZF9wKTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdm9pZCBQVUJMSUMgRXBsT2JkSW5pdFZhckVudHJ5KEVQTF9NQ09fREVDTF9JTlNUQU5DRV9QVFJfCisJCQkJCSAgICB0RXBsT2JkVmFyRW50cnkgTUVNICogcFZhckVudHJ5X3AsCisJCQkJCSAgICB0RXBsT2JkVHlwZSBUeXBlX3AsCisJCQkJCSAgICB0RXBsT2JkU2l6ZSBPYmRTaXplX3ApOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VQTERMTEVYUE9SVCB0RXBsT2JkU2l6ZSBQVUJMSUMgRXBsT2JkR2V0RGF0YVNpemUoRVBMX01DT19ERUNMX0lOU1RBTkNFX1BUUl8KKwkJCQkJCSAgdW5zaWduZWQgaW50IHVpSW5kZXhfcCwKKwkJCQkJCSAgdW5zaWduZWQgaW50IHVpU3ViSW5kZXhfcCk7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHVuc2lnbmVkIGludCBQVUJMSUMgRXBsT2JkR2V0Tm9kZUlkKEVQTF9NQ09fREVDTF9JTlNUQU5DRV9QVFIpOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxPYmRTZXROb2RlSWQoRVBMX01DT19ERUNMX0lOU1RBTkNFX1BUUl8KKwkJCQkJICAgICAgIHVuc2lnbmVkIGludCB1aU5vZGVJZF9wLAorCQkJCQkgICAgICAgdEVwbE9iZE5vZGVJZFR5cGUgTm9kZUlkVHlwZV9wKTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMgRXBsT2JkSXNOdW1lcmljYWwoRVBMX01DT19ERUNMX0lOU1RBTkNFX1BUUl8KKwkJCQkJCSB1bnNpZ25lZCBpbnQgdWlJbmRleF9wLAorCQkJCQkJIHVuc2lnbmVkIGludCB1aVN1YkluZGV4X3AsCisJCQkJCQkgQk9PTCAqIHBmRW50cnlOdW1lcmljYWwpOworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMgRXBsT2JkV3JpdGVFbnRyeUZyb21MZShFUExfTUNPX0RFQ0xfSU5TVEFOQ0VfUFRSXworCQkJCQkJICAgICAgdW5zaWduZWQgaW50IHVpSW5kZXhfcCwKKwkJCQkJCSAgICAgIHVuc2lnbmVkIGludCB1aVN1YkluZGV4X3AsCisJCQkJCQkgICAgICB2b2lkICpwU3JjRGF0YV9wLAorCQkJCQkJICAgICAgdEVwbE9iZFNpemUgU2l6ZV9wKTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMgRXBsT2JkUmVhZEVudHJ5VG9MZShFUExfTUNPX0RFQ0xfSU5TVEFOQ0VfUFRSXworCQkJCQkJICAgdW5zaWduZWQgaW50IHVpSW5kZXhfcCwKKwkJCQkJCSAgIHVuc2lnbmVkIGludCB1aVN1YkluZGV4X3AsCisJCQkJCQkgICB2b2lkICpwRHN0RGF0YV9wLAorCQkJCQkJICAgdEVwbE9iZFNpemUgKiBwU2l6ZV9wKTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMgRXBsT2JkR2V0QWNjZXNzVHlwZShFUExfTUNPX0RFQ0xfSU5TVEFOQ0VfUFRSXworCQkJCQkJICAgdW5zaWduZWQgaW50IHVpSW5kZXhfcCwKKwkJCQkJCSAgIHVuc2lnbmVkIGludCB1aVN1YkluZGV4X3AsCisJCQkJCQkgICB0RXBsT2JkQWNjZXNzICoKKwkJCQkJCSAgIHBBY2Nlc3NUeXBfcCk7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbE9iZFNlYXJjaFZhckVudHJ5KEVQTF9NQ09fREVDTF9JTlNUQU5DRV9QVFJfCisJCQkJCQkgICAgdW5zaWduZWQgaW50IHVpSW5kZXhfcCwKKwkJCQkJCSAgICB1bnNpZ25lZCBpbnQgdWlTdWJpbmRleF9wLAorCQkJCQkJICAgIHRFcGxPYmRWYXJFbnRyeSBNRU0gKioKKwkJCQkJCSAgICBwcFZhckVudHJ5X3ApOworCisjZW5kaWYgLy8gZW5kIG9mICNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfT0JESykpICE9IDApCisKKyNlbmRpZiAvLyAjaWZuZGVmIF9FUExPQkRLX0hfCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL2tlcm5lbC9FcGxPYmRrQ2FsLmggYi9kcml2ZXJzL3N0YWdpbmcvZXBsL2tlcm5lbC9FcGxPYmRrQ2FsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzE3M2E5NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwva2VybmVsL0VwbE9iZGtDYWwuaApAQCAtMCwwICsxLDg5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgb3BlblBPV0VSTElOSworCisgIERlc2NyaXB0aW9uOiAgaW5jbHVkZSBmaWxlIGZvciBjb21tdW5pY2F0aW9uIGFic3RyYWN0aW9uIGxheWVyCisgICAgICAgICAgICAgICAgZm9yIHRoZSBFcGwtT2JkLUtlcm5lbHNwYWNlLU1vZHVsCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRXBsT2Jka0NhbC5oLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS40ICQgICREYXRlOiAyMDA4LzA0LzE3IDIxOjM2OjMyICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorICAgICAgICAgICAgICAgICAgICBHQ0MgVjMuNAorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgIDIwMDYvMDYvMTkgay50LjogICBzdGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIi4uL0VwbE9iZC5oIgorCisjaWZuZGVmIF9FUExPQkRLQ0FMX0hfCisjZGVmaW5lIF9FUExPQkRLQ0FMX0hfCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gdHlwZWRlZgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNlbmRpZiAvLyAjaWZuZGVmIF9FUExPQkRLQ0FMX0hfCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL2tlcm5lbC9FcGxQZG9rLmggYi9kcml2ZXJzL3N0YWdpbmcvZXBsL2tlcm5lbC9FcGxQZG9rLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjViMThmNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwva2VybmVsL0VwbFBkb2suaApAQCAtMCwwICsxLDExMCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIGluY2x1ZGUgZmlsZSBmb3Iga2VybmVsIFBETyBtb2R1bGUKKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgICAgICAgICRSQ1NmaWxlOiBFcGxQZG9rLmgsdiAkCisKKyAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAorCisgICAgICAgICAgICAgICAgJFJldmlzaW9uOiAxLjUgJCAgJERhdGU6IDIwMDgvMDYvMjMgMTQ6NTY6MzMgJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgICAgIEdDQyBWMy40CisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwNi8wNS8yMiBkLmsuOiAgIHN0YXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiwgdmVyc2lvbiAxLjAwCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX0VQTF9QRE9LX0hfCisjZGVmaW5lIF9FUExfUERPS19IXworCisjaW5jbHVkZSAiLi4vRXBsUGRvLmgiCisjaW5jbHVkZSAiLi4vRXBsRXZlbnQuaCIKKyNpbmNsdWRlICIuLi9FcGxEbGwuaCIKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvbnN0IGRlZmluZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyB0eXBlZGVmCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gcHJvY2VzcyBldmVudHMgZnJvbSBxdWV1ZSAoUERPcy9mcmFtZXMgYW5kIFNvQSBmb3Igc3luY2hyb25pemF0aW9uKQordEVwbEtlcm5lbCBFcGxQZG9rUHJvY2Vzcyh0RXBsRXZlbnQgKiBwRXZlbnRfcCk7CisKKy8vIGNvcGllcyBSUERPIHRvIGV2ZW50IHF1ZXVlIGZvciBwcm9jZXNzaW5nCisvLyBpcyBjYWxsZWQgYnkgRExMIGluIE5NVF9DU19SRUFEWV9UT19PUEVSQVRFIGFuZCBOTVRfQ1NfT1BFUkFUSU9OQUwKKy8vIFBETyBuZWVkcyBub3QgdG8gYmUgdmFsaWQKK3RFcGxLZXJuZWwgRXBsUGRva0NiUGRvUmVjZWl2ZWQodEVwbEZyYW1lSW5mbyAqIHBGcmFtZUluZm9fcCk7CisKKy8vIHBvc3RzIHBvaW50ZXIgYW5kIHNpemUgb2YgVFBETyB0byBldmVudCBxdWV1ZQorLy8gaXMgY2FsbGVkIGJ5IERMTCBpbiBOTVRfQ1NfUFJFX09QRVJBVElPTkFMXzIsCisvLyAgICAgTk1UX0NTX1JFQURZX1RPX09QRVJBVEUgYW5kIE5NVF9DU19PUEVSQVRJT05BTAordEVwbEtlcm5lbCBFcGxQZG9rQ2JQZG9UcmFuc21pdHRlZCh0RXBsRnJhbWVJbmZvICogcEZyYW1lSW5mb19wKTsKKworLy8gcG9zdHMgU29BIGV2ZW50IHRvIHF1ZXVlCit0RXBsS2VybmVsIEVwbFBkb2tDYlNvYSh0RXBsRnJhbWVJbmZvICogcEZyYW1lSW5mb19wKTsKKwordEVwbEtlcm5lbCBFcGxQZG9rQWRkSW5zdGFuY2Uodm9pZCk7CisKK3RFcGxLZXJuZWwgRXBsUGRva0RlbEluc3RhbmNlKHZvaWQpOworCisjZW5kaWYgLy8gI2lmbmRlZiBfRVBMX1BET0tfSF8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwva2VybmVsL0VwbFBkb2tDYWwuaCBiL2RyaXZlcnMvc3RhZ2luZy9lcGwva2VybmVsL0VwbFBkb2tDYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTE4M2ViCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9rZXJuZWwvRXBsUGRva0NhbC5oCkBAIC0wLDAgKzEsOTkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBpbmNsdWRlIGZpbGUgZm9yIGtlcm5lbCBQRE8gQ29tbXVuaWNhdGlvbiBBYnN0cmFjdGlvbiBMYXllciBtb2R1bGUKKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgICAgICAgICRSQ1NmaWxlOiBFcGxQZG9rQ2FsLmgsdiAkCisKKyAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAorCisgICAgICAgICAgICAgICAgJFJldmlzaW9uOiAxLjQgJCAgJERhdGU6IDIwMDgvMDQvMTcgMjE6MzY6MzIgJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgICAgIEdDQyBWMy40CisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwNi8wNi8yNiBkLmsuOiAgIHN0YXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiwgdmVyc2lvbiAxLjAwCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX0VQTF9QRE9LQ0FMX0hfCisjZGVmaW5lIF9FUExfUERPS0NBTF9IXworCisjaW5jbHVkZSAiLi4vRXBsSW5jLmgiCisvLyNpbmNsdWRlICJFcGxQZG8uaCIKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvbnN0IGRlZmluZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyB0eXBlZGVmCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordEVwbEtlcm5lbCBFcGxQZG9rQ2FsQWRkSW5zdGFuY2Uodm9pZCk7CisKK3RFcGxLZXJuZWwgRXBsUGRva0NhbERlbEluc3RhbmNlKHZvaWQpOworCisvLyBzZXRzIGZsYWcgZm9yIHZhbGlkaXR5IG9mIFRQRE9zIGluIHNoYXJlZCBtZW1vcnkKK3RFcGxLZXJuZWwgRXBsUGRva0NhbFNldFRwZG9zVmFsaWQoQk9PTCBmVmFsaWRfcCk7CisKKy8vIGdldHMgZmxhZyBmb3IgdmFsaWRpdHkgb2YgVFBET3MgZnJvbSBzaGFyZWQgbWVtb3J5Cit0RXBsS2VybmVsIEVwbFBkb2tDYWxBcmVUcGRvc1ZhbGlkKEJPT0wgKiBwZlZhbGlkX3ApOworCisjZW5kaWYgLy8gI2lmbmRlZiBfRVBMX1BET0tDQUxfSF8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwva2VybmVsL0VwbFRpbWVySGlnaFJlc2suaCBiL2RyaXZlcnMvc3RhZ2luZy9lcGwva2VybmVsL0VwbFRpbWVySGlnaFJlc2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNWQwNDZkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9rZXJuZWwvRXBsVGltZXJIaWdoUmVzay5oCkBAIC0wLDAgKzEsMTA5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgb3BlblBPV0VSTElOSworCisgIERlc2NyaXB0aW9uOiAgaW5jbHVkZSBmaWxlIGZvciBFUEwgaGlnaCByZXNvbHV0aW9uIFRpbWVybW9kdWxlCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRXBsVGltZXJIaWdoUmVzay5oLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS4zICQgICREYXRlOiAyMDA4LzA0LzE3IDIxOjM2OjMyICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorICAgICAgICAgICAgICAgICAgICBHQ0MgVjMuNAorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgIDIwMDYvMDkvMjkgZC5rLjogICBzdGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIi4uL0VwbFRpbWVyLmgiCisKKyNpZm5kZWYgX0VQTFRJTUVSSElHSFJFU0tfSF8KKyNkZWZpbmUgX0VQTFRJTUVSSElHSFJFU0tfSF8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvbnN0IGRlZmluZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyB0eXBlZGVmCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsVGltZXJIaWdoUmVza0luaXQodm9pZCk7CisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbFRpbWVySGlnaFJlc2tBZGRJbnN0YW5jZSh2b2lkKTsKKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsVGltZXJIaWdoUmVza0RlbEluc3RhbmNlKHZvaWQpOworCit0RXBsS2VybmVsIFBVQkxJQyBFcGxUaW1lckhpZ2hSZXNrU2V0VGltZXJOcyh0RXBsVGltZXJIZGwgKiBwVGltZXJIZGxfcCwKKwkJCQkJICAgICB1bnNpZ25lZCBsb25nIGxvbmcgdWxsVGltZU5zX3AsCisJCQkJCSAgICAgdEVwbFRpbWVya0NhbGxiYWNrIHBmbkNhbGxiYWNrX3AsCisJCQkJCSAgICAgdW5zaWduZWQgbG9uZyB1bEFyZ3VtZW50X3AsCisJCQkJCSAgICAgQk9PTCBmQ29udGludW91c2x5X3ApOworCit0RXBsS2VybmVsIFBVQkxJQyBFcGxUaW1lckhpZ2hSZXNrTW9kaWZ5VGltZXJOcyh0RXBsVGltZXJIZGwgKiBwVGltZXJIZGxfcCwKKwkJCQkJCXVuc2lnbmVkIGxvbmcgbG9uZyB1bGxUaW1lTnNfcCwKKwkJCQkJCXRFcGxUaW1lcmtDYWxsYmFjaworCQkJCQkJcGZuQ2FsbGJhY2tfcCwKKwkJCQkJCXVuc2lnbmVkIGxvbmcgdWxBcmd1bWVudF9wLAorCQkJCQkJQk9PTCBmQ29udGludW91c2x5X3ApOworCit0RXBsS2VybmVsIFBVQkxJQyBFcGxUaW1lckhpZ2hSZXNrRGVsZXRlVGltZXIodEVwbFRpbWVySGRsICogcFRpbWVySGRsX3ApOworCisjZW5kaWYgLy8gI2lmbmRlZiBfRVBMVElNRVJISUdIUkVTS19IXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9rZXJuZWwvRXBsVGltZXJrLmggYi9kcml2ZXJzL3N0YWdpbmcvZXBsL2tlcm5lbC9FcGxUaW1lcmsuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTYwZTcyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9rZXJuZWwvRXBsVGltZXJrLmgKQEAgLTAsMCArMSwxMTggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBpbmNsdWRlIGZpbGUgZm9yIEVQTCBLZXJuZWwtVGltZXJtb2R1bGUKKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgICAgICAgICRSQ1NmaWxlOiBFcGxUaW1lcmsuaCx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuNCAkICAkRGF0ZTogMjAwOC8wNC8xNyAyMTozNjozMiAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICAgICAgR0NDIFYzLjQKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUmV2aXNpb24gSGlzdG9yeToKKworICAyMDA2LzA3LzA2IGsudC46ICAgc3RhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICIuLi9FcGxUaW1lci5oIgorI2luY2x1ZGUgIi4uL3VzZXIvRXBsRXZlbnR1LmgiCisKKyNpZm5kZWYgX0VQTFRJTUVSS19IXworI2RlZmluZSBfRVBMVElNRVJLX0hfCisKKyNpZiBFUExfVElNRVJfVVNFX1VTRVIgIT0gRkFMU0UKKyNpbmNsdWRlICIuLi91c2VyL0VwbFRpbWVydS5oIgorI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWYgRVBMX1RJTUVSX1VTRV9VU0VSICE9IEZBTFNFCisjZGVmaW5lIEVwbFRpbWVya0luaXQgICAgICAgICAgIEVwbFRpbWVydUluaXQKKyNkZWZpbmUgRXBsVGltZXJrQWRkSW5zdGFuY2UgICAgRXBsVGltZXJ1QWRkSW5zdGFuY2UKKyNkZWZpbmUgRXBsVGltZXJrRGVsSW5zdGFuY2UgICAgRXBsVGltZXJ1RGVsSW5zdGFuY2UKKyNkZWZpbmUgRXBsVGltZXJrU2V0VGltZXJNcyAgICAgRXBsVGltZXJ1U2V0VGltZXJNcworI2RlZmluZSBFcGxUaW1lcmtNb2RpZnlUaW1lck1zICBFcGxUaW1lcnVNb2RpZnlUaW1lck1zCisjZGVmaW5lIEVwbFRpbWVya0RlbGV0ZVRpbWVyICAgIEVwbFRpbWVydURlbGV0ZVRpbWVyCisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHR5cGVkZWYKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2lmIEVQTF9USU1FUl9VU0VfVVNFUiA9PSBGQUxTRQordEVwbEtlcm5lbCBQVUJMSUMgRXBsVGltZXJrSW5pdCh2b2lkKTsKKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsVGltZXJrQWRkSW5zdGFuY2Uodm9pZCk7CisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbFRpbWVya0RlbEluc3RhbmNlKHZvaWQpOworCit0RXBsS2VybmVsIFBVQkxJQyBFcGxUaW1lcmtTZXRUaW1lck1zKHRFcGxUaW1lckhkbCAqIHBUaW1lckhkbF9wLAorCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgdWxUaW1lX3AsCisJCQkJICAgICAgdEVwbFRpbWVyQXJnIEFyZ3VtZW50X3ApOworCit0RXBsS2VybmVsIFBVQkxJQyBFcGxUaW1lcmtNb2RpZnlUaW1lck1zKHRFcGxUaW1lckhkbCAqIHBUaW1lckhkbF9wLAorCQkJCQkgdW5zaWduZWQgbG9uZyB1bFRpbWVfcCwKKwkJCQkJIHRFcGxUaW1lckFyZyBBcmd1bWVudF9wKTsKKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsVGltZXJrRGVsZXRlVGltZXIodEVwbFRpbWVySGRsICogcFRpbWVySGRsX3ApOworI2VuZGlmCisjZW5kaWYgLy8gI2lmbmRlZiBfRVBMVElNRVJLX0hfCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL2tlcm5lbC9WaXJ0dWFsRXRoZXJuZXQuaCBiL2RyaXZlcnMvc3RhZ2luZy9lcGwva2VybmVsL1ZpcnR1YWxFdGhlcm5ldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlZmY4NzIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL2tlcm5lbC9WaXJ0dWFsRXRoZXJuZXQuaApAQCAtMCwwICsxLDk2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgb3BlblBPV0VSTElOSworCisgIERlc2NyaXB0aW9uOiAgaW5jbHVkZSBmaWxlIGZvciB2aXJ0dWFsIGV0aGVybmV0IGRyaXZlciBtb2R1bGUKKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgICAgICAgICRSQ1NmaWxlOiBWaXJ0dWFsRXRoZXJuZXQuaCx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuNCAkICAkRGF0ZTogMjAwOC8xMC8xNyAxNTozMjozMiAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICBLRUlMIHVWaXNpb24gMgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgIDIwMDYvMDkvMTkgZC5rLjogICBzdGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24sIHZlcnNpb24gMS4wMAorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9FUExfVkVUSF9IXworI2RlZmluZSBfRVBMX1ZFVEhfSF8KKworI2luY2x1ZGUgIkVwbERsbGsuaCIKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvbnN0IGRlZmluZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyB0eXBlZGVmCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9WRVRIKSkgIT0gMCkKKwordEVwbEtlcm5lbCBQVUJMSUMgVkV0aEFkZEluc3RhbmNlKHRFcGxEbGxrSW5pdFBhcmFtICogcEluaXRQYXJhbV9wKTsKKwordEVwbEtlcm5lbCBQVUJMSUMgVkV0aERlbEluc3RhbmNlKHZvaWQpOworCisjZW5kaWYgLy8gI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9WRVRIKSkgIT0gMCkKKworI2VuZGlmIC8vICNpZm5kZWYgX0VQTF9WRVRIX0hfCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL3Byb2NfZnMuYyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvcHJvY19mcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0OTEwMzMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL3Byb2NfZnMuYwpAQCAtMCwwICsxLDQwOSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIHByb2MgZnMgZW50cnkgd2l0aCBkaWFnbm9zdGljIGluZm9ybWF0aW9uIHVuZGVyIExpbnV4CisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogcHJvY19mcy5jLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS4xMyAkICAkRGF0ZTogMjAwOC8xMS8wNyAxMzo1NTo1NiAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICAgICAgR05VCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwNi8wNy8zMSBkLmsuOiAgIHN0YXJ0IG9mIGltcGxlbWVudGF0aW9uCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJrZXJuZWwvRXBsTm10ay5oIgorI2luY2x1ZGUgInVzZXIvRXBsTm10dS5oIgorCisjaWYgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRfTU4pKSAhPSAwKQorI2luY2x1ZGUgInVzZXIvRXBsTm10TW51LmgiCisjZW5kaWYKKworI2luY2x1ZGUgImtlcm5lbC9FcGxEbGxrQ2FsLmgiCisKKy8vI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorCisjaWZkZWYgQ09ORklHX0NPTERGSVJFCisjaW5jbHVkZSA8YXNtL2NvbGRmaXJlLmg+CisjaW5jbHVkZSAiZmVjLmgiCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgRyBMIE8gQiBBIEwgICBEIEUgRiBJIE4gSSBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvbnN0IGRlZmluZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZm5kZWYgRVBMX1BST0NfREVWX05BTUUKKyNkZWZpbmUgRVBMX1BST0NfREVWX05BTUUgICAgImVwbCIKKyNlbmRpZgorCisjaWZuZGVmIERCR19UUkFDRV9QT0lOVFMKKyNkZWZpbmUgREJHX1RSQUNFX1BPSU5UUyAgICAyMwkvLyAjIG9mIHN1cHBvcnRlZCBkZWJ1ZyB0cmFjZSBwb2ludHMKKyNlbmRpZgorCisjaWZuZGVmIERCR19UUkFDRV9WQUxVRVMKKyNkZWZpbmUgREJHX1RSQUNFX1ZBTFVFUyAgICAyNAkvLyAjIG9mIHN1cHBvcnRlZCBkZWJ1ZyB0cmFjZSB2YWx1ZXMgKHNpemUgb2YgY2lyY3VsYXIgYnVmZmVyKQorI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBtb2R1bCBnbG9iYWwgdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCB2YXJzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWZkZWYgX0RCR19UUkFDRV9QT0lOVFNfCithdG9taWNfdCBhYXRtRGJnVHJhY2VQb2ludF9sW0RCR19UUkFDRV9QT0lOVFNdOworRFdPUkQgYWR3RGJnVHJhY2VWYWx1ZV9sW0RCR19UUkFDRV9WQUxVRVNdOworRFdPUkQgZHdEYmdUcmFjZVZhbHVlT2xkX2w7Cit1bnNpZ25lZCBpbnQgdWlEYmdUcmFjZVZhbHVlUG9zX2w7CitzcGlubG9ja190IHNwaW5sb2NrRGJnVHJhY2VWYWx1ZV9sOwordW5zaWduZWQgbG9uZyB1bERiVHJhY2VWYWx1ZUZsYWdzX2w7CisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBpbnQgRXBsTGluUHJvY1JlYWQoY2hhciAqcGNCdWZmZXJfcCwgY2hhciAqKnBwY1N0YXJ0X3AsIG9mZl90IE9mZnNldF9wLAorCQkJICBpbnQgbkJ1ZmZlclNpemVfcCwgaW50ICpwRW9mX3AsIHZvaWQgKnBEYXRhX3ApOworc3RhdGljIGludCBFcGxMaW5Qcm9jV3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICogYnVmZmVyLAorCQkJICAgdW5zaWduZWQgbG9uZyBjb3VudCwgdm9pZCAqZGF0YSk7CisKK3ZvaWQgUFVCTElDIFRndERiZ1NpZ25hbFRyYWNlUG9pbnQoQllURSBiVHJhY2VQb2ludE51bWJlcl9wKTsKK3ZvaWQgUFVCTElDIFRndERiZ1Bvc3RUcmFjZVZhbHVlKERXT1JEIGR3VHJhY2VWYWx1ZV9wKTsKKworRVBMRExMRVhQT1JUIERXT1JEIFBVQkxJQyBFcGxJZGVudHVHZXRSdW5uaW5nUmVxdWVzdHModm9pZCk7CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgUCBVIEIgTCBJIEMgICBGIFUgTiBDIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworCit0RXBsS2VybmVsIEVwbExpblByb2NJbml0KHZvaWQpCit7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwUHJvY0RpckVudHJ5OworCXBQcm9jRGlyRW50cnkgPSBjcmVhdGVfcHJvY19lbnRyeShFUExfUFJPQ19ERVZfTkFNRSwgU19JUlVHTywgTlVMTCk7CisJaWYgKHBQcm9jRGlyRW50cnkgIT0gTlVMTCkgeworCQlwUHJvY0RpckVudHJ5LT5yZWFkX3Byb2MgPSBFcGxMaW5Qcm9jUmVhZDsKKwkJcFByb2NEaXJFbnRyeS0+d3JpdGVfcHJvYyA9IEVwbExpblByb2NXcml0ZTsKKwkJcFByb2NEaXJFbnRyeS0+ZGF0YSA9IE5VTEw7CS8vIGRldmljZSBudW1iZXIgb3Igc29tZXRoaW5nIGVsc2UKKworCX0gZWxzZSB7CisJCXJldHVybiBrRXBsTm9SZXNvdXJjZTsKKwl9CisKKyNpZmRlZiBfREJHX1RSQUNFX1BPSU5UU18KKwkvLyBpbml0aWFsaXplIHNwaW5sb2NrIGFuZCBjaXJjdWxhciBidWZmZXIgcG9zaXRpb24KKwlzcGluX2xvY2tfaW5pdCgmc3BpbmxvY2tEYmdUcmFjZVZhbHVlX2wpOworCXVpRGJnVHJhY2VWYWx1ZVBvc19sID0gMDsKKwlkd0RiZ1RyYWNlVmFsdWVPbGRfbCA9IDA7CisjZW5kaWYKKworCXJldHVybiBrRXBsU3VjY2Vzc2Z1bDsKK30KKwordEVwbEtlcm5lbCBFcGxMaW5Qcm9jRnJlZSh2b2lkKQoreworCXJlbW92ZV9wcm9jX2VudHJ5KEVQTF9QUk9DX0RFVl9OQU1FLCBOVUxMKTsKKworCXJldHVybiBrRXBsU3VjY2Vzc2Z1bDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBUYXJnZXQgc3BlY2lmaWMgZXZlbnQgc2lnbmFsaW5nIChGRUMgVHgtL1J4LUludGVycnVwdCwgdXNlZCBieSBFZHJ2KQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmZGVmIF9EQkdfVFJBQ0VfUE9JTlRTXwordm9pZCBQVUJMSUMgVGd0RGJnU2lnbmFsVHJhY2VQb2ludChCWVRFIGJUcmFjZVBvaW50TnVtYmVyX3ApCit7CisKKwlpZiAoYlRyYWNlUG9pbnROdW1iZXJfcCA+PQorCSAgICAoc2l6ZW9mKGFhdG1EYmdUcmFjZVBvaW50X2wpIC8gc2l6ZW9mKGFhdG1EYmdUcmFjZVBvaW50X2xbMF0pKSkgeworCQlnb3RvIEV4aXQ7CisJfQorCisJYXRvbWljX2luYygmYWF0bURiZ1RyYWNlUG9pbnRfbFtiVHJhY2VQb2ludE51bWJlcl9wXSk7CisKKyAgICAgIEV4aXQ6CisKKwlyZXR1cm47CisKK30KKwordm9pZCBQVUJMSUMgVGd0RGJnUG9zdFRyYWNlVmFsdWUoRFdPUkQgZHdUcmFjZVZhbHVlX3ApCit7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc3BpbmxvY2tEYmdUcmFjZVZhbHVlX2wsIHVsRGJUcmFjZVZhbHVlRmxhZ3NfbCk7CisJaWYgKGR3RGJnVHJhY2VWYWx1ZU9sZF9sICE9IGR3VHJhY2VWYWx1ZV9wKSB7CisJCWFkd0RiZ1RyYWNlVmFsdWVfbFt1aURiZ1RyYWNlVmFsdWVQb3NfbF0gPSBkd1RyYWNlVmFsdWVfcDsKKwkJdWlEYmdUcmFjZVZhbHVlUG9zX2wgPQorCQkgICAgKHVpRGJnVHJhY2VWYWx1ZVBvc19sICsgMSkgJSBEQkdfVFJBQ0VfVkFMVUVTOworCQlkd0RiZ1RyYWNlVmFsdWVPbGRfbCA9IGR3VHJhY2VWYWx1ZV9wOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzcGlubG9ja0RiZ1RyYWNlVmFsdWVfbCwgdWxEYlRyYWNlVmFsdWVGbGFnc19sKTsKKworCXJldHVybjsKKworfQorI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgUmVhZCBmdW5jdGlvbiBmb3IgUFJPQy1GUyByZWFkIGFjY2VzcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIGludCBFcGxMaW5Qcm9jUmVhZChjaGFyICpwY0J1ZmZlcl9wLAorCQkJICBjaGFyICoqcHBjU3RhcnRfcCwKKwkJCSAgb2ZmX3QgT2Zmc2V0X3AsCisJCQkgIGludCBuQnVmZmVyU2l6ZV9wLCBpbnQgKnBFb2ZfcCwgdm9pZCAqcERhdGFfcCkKK3sKKworCWludCBuU2l6ZTsKKwlpbnQgRW9mOworCXRFcGxEbGxrQ2FsU3RhdGlzdGljcyAqcERsbGtDYWxTdGF0czsKKworCW5TaXplID0gMDsKKwlFb2YgPSAwOworCisJLy8gY291bnQgY2FsbHMgb2YgdGhpcyBmdW5jdGlvbgorI2lmZGVmIF9EQkdfVFJBQ0VfUE9JTlRTXworCVRndERiZ1NpZ25hbFRyYWNlUG9pbnQoMCk7CisjZW5kaWYKKworCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJLy8gZ2VuZXJhdGUgc3RhdGljIGluZm9ybWF0aW9uCisJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCS8vIC0tLS0gRHJpdmVyIGluZm9ybWF0aW9uIC0tLS0KKwluU2l6ZSArPSBzbnByaW50ZihwY0J1ZmZlcl9wICsgblNpemUsIG5CdWZmZXJTaXplX3AgLSBuU2l6ZSwKKwkJCSAgIiVzICAgICVzICAgIChjKSAyMDA2ICVzXG4iLAorCQkJICBFUExfUFJPRFVDVF9OQU1FLCBFUExfUFJPRFVDVF9WRVJTSU9OLAorCQkJICBFUExfUFJPRFVDVF9NQU5VRkFDVFVSRVIpOworCisJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkvLyBnZW5lcmF0ZSBwcm9jZXNzIGluZm9ybWF0aW9uCisJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCS8vIC0tLS0gRVBMIHN0YXRlIC0tLS0KKwluU2l6ZSArPSBzbnByaW50ZihwY0J1ZmZlcl9wICsgblNpemUsIG5CdWZmZXJTaXplX3AgLSBuU2l6ZSwKKwkJCSAgIk5NVCBzdGF0ZTogICAgICAgICAgICAgICAgICAweCUwNFhcbiIsCisJCQkgIChXT1JEKSBFcGxObXRrR2V0Tm10U3RhdGUoKSk7CisKKwlFcGxEbGxrQ2FsR2V0U3RhdGlzdGljcygmcERsbGtDYWxTdGF0cyk7CisKKwluU2l6ZSArPSBzbnByaW50ZihwY0J1ZmZlcl9wICsgblNpemUsIG5CdWZmZXJTaXplX3AgLSBuU2l6ZSwKKwkJCSAgIkN1ckFzeW5jVHhHZW49JWx1IEN1ckFzeW5jVHhObXQ9JWx1IEN1ckFzeW5jUng9JWx1XG5NYXhBc3luY1R4R2VuPSVsdSBNYXhBc3luY1R4Tm10PSVsdSBNYXhBc3luY1J4PSVsdVxuIiwKKwkJCSAgcERsbGtDYWxTdGF0cy0+bV91bEN1clR4RnJhbWVDb3VudEdlbiwKKwkJCSAgcERsbGtDYWxTdGF0cy0+bV91bEN1clR4RnJhbWVDb3VudE5tdCwKKwkJCSAgcERsbGtDYWxTdGF0cy0+bV91bEN1clJ4RnJhbWVDb3VudCwKKwkJCSAgcERsbGtDYWxTdGF0cy0+bV91bE1heFR4RnJhbWVDb3VudEdlbiwKKwkJCSAgcERsbGtDYWxTdGF0cy0+bV91bE1heFR4RnJhbWVDb3VudE5tdCwKKwkJCSAgcERsbGtDYWxTdGF0cy0+bV91bE1heFJ4RnJhbWVDb3VudCk7CisKKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVF9NTikpICE9IDApCisJLy8gZmV0Y2ggcnVubmluZyBJZGVudFJlcXVlc3RzCisJblNpemUgKz0gc25wcmludGYocGNCdWZmZXJfcCArIG5TaXplLCBuQnVmZmVyU2l6ZV9wIC0gblNpemUsCisJCQkgICJydW5uaW5nIElkZW50UmVxdWVzdHM6ICAgICAgMHglMDhsWFxuIiwKKwkJCSAgRXBsSWRlbnR1R2V0UnVubmluZ1JlcXVlc3RzKCkpOworCisJLy8gZmV0Y2ggc3RhdGUgb2YgTm10TW51IG1vZHVsZQorCXsKKwkJdW5zaWduZWQgaW50IHVpTWFuZGF0b3J5U2xhdmVDb3VudDsKKwkJdW5zaWduZWQgaW50IHVpU2lnbmFsU2xhdmVDb3VudDsKKwkJV09SRCB3RmxhZ3M7CisKKwkJRXBsTm10TW51R2V0RGlhZ25vc3RpY0luZm8oJnVpTWFuZGF0b3J5U2xhdmVDb3VudCwKKwkJCQkJICAgJnVpU2lnbmFsU2xhdmVDb3VudCwgJndGbGFncyk7CisKKwkJblNpemUgKz0gc25wcmludGYocGNCdWZmZXJfcCArIG5TaXplLCBuQnVmZmVyU2l6ZV9wIC0gblNpemUsCisJCQkJICAiTU4gIE1hbmRTbGF2ZUNvdW50OiAldSAgU2lnU2xhdmVDb3VudDogJXUgIEZsYWdzOiAweCVYXG4iLAorCQkJCSAgdWlNYW5kYXRvcnlTbGF2ZUNvdW50LCB1aVNpZ25hbFNsYXZlQ291bnQsCisJCQkJICB3RmxhZ3MpOworCisJfQorI2VuZGlmCisKKwkvLyAtLS0tIEZFQyBzdGF0ZSAtLS0tCisjaWZkZWYgQ09ORklHX0NPTERGSVJFCisJeworCQkvLyBSZWNlaXZlIHRoZSBiYXNlIGFkZHJlc3MKKwkJdW5zaWduZWQgbG9uZyBiYXNlX2FkZHI7CisjaWYgKEVEUlZfVVNFRF9FVEhfQ1RSTCA9PSAwKQorCQkvLyBTZXQgdGhlIGJhc2UgYWRkcmVzcyBvZiBGRUMwCisJCWJhc2VfYWRkciA9IEZFQ19CQVNFX0FERFJfRkVDMDsKKyNlbHNlCisJCS8vIFNldCB0aGUgYmFzZSBhZGRyZXNzIG9mIEZFQzEKKwkJYmFzZV9hZGRyID0gRkVDX0JBU0VfQUREUl9GRUMxOworI2VuZGlmCisKKwkJblNpemUgKz0gc25wcmludGYocGNCdWZmZXJfcCArIG5TaXplLCBuQnVmZmVyU2l6ZV9wIC0gblNpemUsCisJCQkJICAiRkVDX0VDUiA9IDB4JTA4WCBGRUNfRUlSID0gMHglMDhYIEZFQ19FSU1SID0gMHglMDhYXG5GRUNfVENSID0gMHglMDhYIEZFQ1RGU1IgPSAweCUwOFggRkVDUkZTUiA9IDB4JTA4WFxuIiwKKwkJCQkgIEZFQ19FQ1IoYmFzZV9hZGRyKSwgRkVDX0VJUihiYXNlX2FkZHIpLAorCQkJCSAgRkVDX0VJTVIoYmFzZV9hZGRyKSwgRkVDX1RDUihiYXNlX2FkZHIpLAorCQkJCSAgRkVDX0ZFQ1RGU1IoYmFzZV9hZGRyKSwKKwkJCQkgIEZFQ19GRUNSRlNSKGJhc2VfYWRkcikpOworCX0KKyNlbmRpZgorCisJLy8gLS0tLSBEQkc6IFRyYWNlUG9pbnRzIC0tLS0KKyNpZmRlZiBfREJHX1RSQUNFX1BPSU5UU18KKwl7CisJCWludCBuTnVtOworCisJCW5TaXplICs9IHNucHJpbnRmKHBjQnVmZmVyX3AgKyBuU2l6ZSwgbkJ1ZmZlclNpemVfcCAtIG5TaXplLAorCQkJCSAgIkRiZ1RyYWNlUG9pbnRzOlxuIik7CisJCWZvciAobk51bSA9IDA7CisJCSAgICAgbk51bSA8IChzaXplb2YoYWF0bURiZ1RyYWNlUG9pbnRfbCkgLyBzaXplb2YoYXRvbWljX3QpKTsKKwkJICAgICBuTnVtKyspIHsKKwkJCW5TaXplICs9CisJCQkgICAgc25wcmludGYocGNCdWZmZXJfcCArIG5TaXplLCBuQnVmZmVyU2l6ZV9wIC0gblNpemUsCisJCQkJICAgICAiIFRyYWNlUG9pbnRbJTJkXTogJWRcbiIsIChpbnQpbk51bSwKKwkJCQkgICAgIGF0b21pY19yZWFkKCZhYXRtRGJnVHJhY2VQb2ludF9sW25OdW1dKSk7CisJCX0KKworCQluU2l6ZSArPSBzbnByaW50ZihwY0J1ZmZlcl9wICsgblNpemUsIG5CdWZmZXJTaXplX3AgLSBuU2l6ZSwKKwkJCQkgICJEYmdUcmFjZVZhbHVlczpcbiIpOworCQlmb3IgKG5OdW0gPSAwOyBuTnVtIDwgREJHX1RSQUNFX1ZBTFVFUzsgbk51bSsrKSB7CisJCQlpZiAobk51bSA9PSB1aURiZ1RyYWNlVmFsdWVQb3NfbCkgewkvLyBuZXh0IHZhbHVlIHdpbGwgYmUgc3RvcmVkIGF0IHRoYXQgcG9zaXRpb24KKwkJCQluU2l6ZSArPQorCQkJCSAgICBzbnByaW50ZihwY0J1ZmZlcl9wICsgblNpemUsCisJCQkJCSAgICAgbkJ1ZmZlclNpemVfcCAtIG5TaXplLCAiKiUwOGxYIiwKKwkJCQkJICAgICBhZHdEYmdUcmFjZVZhbHVlX2xbbk51bV0pOworCQkJfSBlbHNlIHsKKwkJCQluU2l6ZSArPQorCQkJCSAgICBzbnByaW50ZihwY0J1ZmZlcl9wICsgblNpemUsCisJCQkJCSAgICAgbkJ1ZmZlclNpemVfcCAtIG5TaXplLCAiICUwOGxYIiwKKwkJCQkJICAgICBhZHdEYmdUcmFjZVZhbHVlX2xbbk51bV0pOworCQkJfQorCQkJaWYgKChuTnVtICYgMHgwMDAwMDAwNykgPT0gMHgwMDAwMDAwNykgewkvLyA4IHZhbHVlcyBwcmludGVkIC0+IGVuZCBvZiBsaW5lIHJlYWNoZWQKKwkJCQluU2l6ZSArPQorCQkJCSAgICBzbnByaW50ZihwY0J1ZmZlcl9wICsgblNpemUsCisJCQkJCSAgICAgbkJ1ZmZlclNpemVfcCAtIG5TaXplLCAiXG4iKTsKKwkJCX0KKwkJfQorCQlpZiAoKG5OdW0gJiAweDAwMDAwMDA3KSAhPSAweDAwMDAwMDA3KSB7CS8vIG51bWJlciBvZiB2YWx1ZXMgcHJpbnRlZCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4IC0+IHByaW50IG5ldyBsaW5lCisJCQluU2l6ZSArPQorCQkJICAgIHNucHJpbnRmKHBjQnVmZmVyX3AgKyBuU2l6ZSwgbkJ1ZmZlclNpemVfcCAtIG5TaXplLAorCQkJCSAgICAgIlxuIik7CisJCX0KKwl9CisjZW5kaWYKKworCUVvZiA9IDE7CisJZ290byBFeGl0OworCisgICAgICBFeGl0OgorCisJKnBFb2ZfcCA9IEVvZjsKKworCXJldHVybiAoblNpemUpOworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgV3JpdGUgZnVuY3Rpb24gZm9yIFBST0MtRlMgd3JpdGUgYWNjZXNzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgaW50IEVwbExpblByb2NXcml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKiBidWZmZXIsCisJCQkgICB1bnNpZ25lZCBsb25nIGNvdW50LCB2b2lkICpkYXRhKQoreworCWNoYXIgYWJCdWZmZXJbY291bnQgKyAxXTsKKwlpbnQgaUVycjsKKwlpbnQgaVZhbCA9IDA7CisJdEVwbE5tdEV2ZW50IE5tdEV2ZW50OworCisJaWYgKGNvdW50ID4gMCkgeworCQlpRXJyID0gY29weV9mcm9tX3VzZXIoYWJCdWZmZXIsIGJ1ZmZlciwgY291bnQpOworCQlpZiAoaUVyciAhPSAwKSB7CisJCQlyZXR1cm4gY291bnQ7CisJCX0KKwkJYWJCdWZmZXJbY291bnRdID0gJ1wwJzsKKworCQlpRXJyID0gc3NjYW5mKGFiQnVmZmVyLCAiJWkiLCAmaVZhbCk7CisJfQorCWlmICgoaVZhbCA8PSAwKSB8fCAoaVZhbCA+IDB4MkYpKSB7CisJCU5tdEV2ZW50ID0ga0VwbE5tdEV2ZW50U3dSZXNldDsKKwl9IGVsc2UgeworCQlObXRFdmVudCA9ICh0RXBsTm10RXZlbnQpIGlWYWw7CisJfQorCS8vIGV4ZWN1dGUgc3BlY2lmaWVkIE5NVCBjb21tYW5kIG9uIHdyaXRlIGFjY2VzcyBvZiAvcHJvYy9lcGwKKwlFcGxObXR1Tm10RXZlbnQoTm10RXZlbnQpOworCisJcmV0dXJuIGNvdW50OworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9wcm9jX2ZzLmggYi9kcml2ZXJzL3N0YWdpbmcvZXBsL3Byb2NfZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTg2ZjQ5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9wcm9jX2ZzLmgKQEAgLTAsMCArMSw4OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIGludGVyZmFjZSBmb3IgcHJvYyBmcyBlbnRyeSB1bmRlciBMaW51eAorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgJFJDU2ZpbGU6IHByb2NfZnMuaCx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuMyAkICAkRGF0ZTogMjAwOC8wNC8xNyAyMTozNjozMyAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICAgICAgR05VCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwNi8wNy8zMSBkLmsuOiAgIHN0YXJ0IG9mIGltcGxlbWVudGF0aW9uCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX0VQTFBST0NGU19IXworI2RlZmluZSBfRVBMUFJPQ0ZTX0hfCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIEVwbExpblByb2NJbml0KHZvaWQpOwordEVwbEtlcm5lbCBFcGxMaW5Qcm9jRnJlZSh2b2lkKTsKKworI2VuZGlmIC8vICNpZm5kZWYgX0VQTFBST0NGU19IXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC91c2VyL0VwbENmZ01hdS5oIGIvZHJpdmVycy9zdGFnaW5nL2VwbC91c2VyL0VwbENmZ01hdS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyNWExZTkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL3VzZXIvRXBsQ2ZnTWF1LmgKQEAgLTAsMCArMSwyODQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBpbmNsdWRlIGZpbGUgZm9yIEVwbCBDb25maWd1cmF0aW9uIE1hbmFnZXIgTW9kdWxlCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRXBsQ2ZnTWF1LmgsdiAkCisKKyAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAorCisgICAgICAgICAgICAgICAgJFJldmlzaW9uOiAxLjQgJCAgJERhdGU6IDIwMDgvMTAvMTcgMTU6MzI6MzIgJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgVkM3CisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwNi8wNy8xNCBrLnQuOiAgIHN0YXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbgorICAgICAgICAgICAgICAgICAgICAgLT4gYmFzZWQgb24gQ0FOb3BlbiBDZmdNYS1Nb2R1bCAoQ0FOb3BlbiB2ZXJzaW9uIDUuMzQpCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICIuLi9FcGxJbmMuaCIKKworI2lmbmRlZiBfRVBMQ0ZHTUFfSF8KKyNkZWZpbmUgX0VQTENGR01BX0hfCisKKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX0NGR01BKSkgIT0gMCkKKworI2luY2x1ZGUgIkVwbE9iZHUuaCIKKyNpbmNsdWRlICJFcGxTZG9Db211LmgiCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyB0eXBlZGVmCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy9kZWZpbmUgbWF4IG51bWJlciBvZiB0aW1lb3V0cyBmb3IgY29uZmlndXJhdGlvbiBvZiAxIGRldmljZQorI2RlZmluZSBFUExfQ0ZHTUFfTUFYX1RJTUVPVVQgICAzCisKKy8vY2FsbGJhY2tmdW5jdGlvbiwgY2FsbGVkIGlmIGNvbmZpZ3VyYXRpb24gaXMgZmluaXNoZWQKK3R5cGVkZWYgdm9pZCAoUFVCTElDICogdGZwRXBsQ2ZnTWFDYikgKHVuc2lnbmVkIGludCB1aU5vZGVJZF9wLAorCQkJCSAgICAgICB0RXBsS2VybmVsIEVycm9yc3RhdGVfcCk7CisKKy8vU3RhdGUgZm9yIGNvbmZpZ3VhcnRpb24gbWFuYWdlciBTdGF0ZW1hY2hpbmUKK3R5cGVkZWYgZW51bSB7CisJLy8gZ2VuZXJhbCBzdGF0ZXMKKwlrRXBsQ2ZnTWFJZGxlID0gMHgwMDAwLAkvLyBDb25maWd1cmF0aW9uc3Byb2Nlc3MKKwkvLyBpcyBpZGxlCisJa0VwbENmZ01hV2FpdEZvclNkb2NFdmVudCA9IDB4MDAwMSwJLy8gd2FpdCB1bnRpbCB0aGUgbGFzdAorCS8vIFNET0MgaXMgZmluaXNjaGVkCisJa0VwbENmZ01hU2tpcE1hcHBpbmdTdWIwID0gMHgwMDAyLAkvLyB3cml0ZSBTdWIwIG9mIG1hcHBpbmcKKwkvLyBwYXJhbWV0ZXIgd2l0aCAwCisKKwlrRXBsQ2ZnTWFGaW5pc2hlZCA9IDB4MDAwNAkvLyBjb25maWd1YXJ0aW9uIGlzIGZpbmlzaGVkCit9IHRFcGxDZmdTdGF0ZTsKKwordHlwZWRlZiBlbnVtIHsKKwlrRXBsQ2ZnTWFEY2ZUeXBTeXN0ZWNTZWcgPSAweDAwLAorCWtFcGxDZmdNYURjZlR5cENvbkRjZiA9IDB4MDEsCisJa0VwbENmZ01hRGNmVHlwRGNmID0gMHgwMiwJLy8gbm90IHN1cHBvcnRlZAorCWtFcGxDZmdNYURjZlR5cFhkYyA9IDB4MDMJLy8gbm90IHN1cHBvcnRlZAorfSB0RXBsQ2ZnTWFEY2ZUeXA7CisKK3R5cGVkZWYgZW51bSB7CisJa0VwbENmZ01hQ29tbW9uID0gMCwJLy8gYWxsIG90aGVyIGluZGV4CisJa0VwbENmZ01hUGRvQ29tbSA9IDEsCS8vIGNvbW11bmljYXRpb24gaW5kZXgKKwlrRXBsQ2ZnTWFQZG9NYXBwID0gMiwJLy8gbWFwcGluZyBpbmRleAorCWtFcGxDZmdNYVBkb0NvbW1BZnRlck1hcHAgPSAzLAkvLyB3cml0ZSBQRE8gQ29iLUlkIGFmdGVyIG1hcHBpbmcgc3ViaW5kZXggMChzZXQgUERPIHZhbGlkKQorCit9IHRFcGxDZmdNYUluZGV4VHlwZTsKKworLy9iaXRjb2RlZCBhbnN3ZXIgYWJvdXQgdGhlIGxhc3Qgc2RvIHRyYW5zZmVyIHNhdmVkIGluIG1fU2RvY1N0YXRlCisvLyBhbHNvIHVzZWQgdG8gc2luZ2FsIHN0YXJ0IG9mIHRoZSBTdGF0ZSBNYXNjaGluZQordHlwZWRlZiBlbnVtIHsKKwlrRXBsQ2ZnTWFTZG9jQnVzeSA9IDB4MDAsCS8vIFNET0MgYWN0aXYKKwlrRXBsQ2ZnTWFTZG9jUmVhZHkgPSAweDAxLAkvLyBTRE9DIGZpbmlzaGVkCisJa0VwbENmZ01hU2RvY1RpbWVvdXQgPSAweDAyLAkvLyBTRE9DIFRpbWVvdXQKKwlrRXBsQ2ZnTWFTZG9jQWJvcnRSZWNlaXZlZCA9IDB4MDQsCS8vIFNET0MgQWJvcnQsIHNlZSBBYm9ydGNvZGUKKwlrRXBsQ2ZnTWFTZG9jU3RhcnQgPSAweDA4CS8vIHN0YXJ0IFN0YXRlIE1zY2hpbmUKK30gdEVwbFNkb2NTdGF0ZTsKKworLy9pbnRlcm5hbCBzdHJ1Y3R1cmUgKGluc3RhbmNldGFibGUgZm9yIG1vZHVsIGNvbmZpZ3VyYXRpb24gbWFuYWdlcikKK3R5cGVkZWYgc3RydWN0IHsKKwl0RXBsQ2ZnU3RhdGUgbV9DZmdTdGF0ZTsJLy8gc3RhdGUgb2YgdGhlIGNvbmZpZ3VyYXRpb24gc3RhdGUgbWFzY2hpbmUKKwl0RXBsU2RvQ29tQ29uSGRsIG1fU2RvQ29tQ29uSGRsOwkvLyBoYW5kbGUgZm9yIHNkbyBjb25uZWN0aW9uCisJRFdPUkQgbV9kd0xhc3RBYm9ydENvZGU7CisJdW5zaWduZWQgaW50IG1fdWlMYXN0SW5kZXg7CS8vIGxhc3QgaW5kZXggb2YgY29uZmlndXJhdGlvbiwgdG8gY29tcGFpciB3aXRoIGFjdHVhbCBpbmRleAorCUJZVEUgKm1fcGJDb25jaXNlOwkvLyBQdHIgdG8gY29uY2lzZSBEQ0YKKwlCWVRFICptX3BiQWN0dWFsSW5kZXg7CS8vIFB0ciB0byBhY3R1YWwgaW5kZXggaW4gdGhlIERDRiBzZWdtZW50CisJdGZwRXBsQ2ZnTWFDYiBtX3BmbkNmZ01hQ2I7CS8vIFB0ciB0byBDZmdNYSBDYWxsYmFjaywgaXMgY2FsbCBpZiBjb25maWd1cmF0aW9uIGZpbmlzaGVkCisJdEVwbEtlcm5lbCBtX0VwbEtlcm5lbEVycm9yOwkvLyBlcnJvcmNvZGUKKwlEV09SRCBtX2R3TnVtVmFsdWVDb3B5OwkvLyBudW1lcmljIHZhbHVlcyBhcmUgY29waWVkIGluIHRoaXMgdmFyaWFibGUKKwl1bnNpZ25lZCBpbnQgbV91aVBkb05vZGVJZDsJLy8gYnVmZmVyIGZvciBQRE8gbm9kZSBpZAorCUJZVEUgbV9iTnJPZk1hcHBlZE9iamVjdDsJLy8gbnVtYmVyIG9mIG1hcHBlZCBvYmplY3RzCisJdW5zaWduZWQgaW50IG1fdWlOb2RlSWQ7CS8vIEVwbCBub2RlIGFkZHJlc3NlCisJdEVwbFNkb2NTdGF0ZSBtX1Nkb2NTdGF0ZTsJLy8gYml0Y29kZWQgc3RhdGUgb2YgdGhlIFNETyB0cmFuc2ZlcgorCXVuc2lnbmVkIGludCBtX3VpTGFzdFN1YkluZGV4OwkvLyBsYXN0IHN1YmluZGV4IG9mIGNvbmZpZ3VyYXRpb24KKwlCT09MIG1fZk9uZVRyYW5mZXJPazsJLy8gYXRsZWFzZWQgb25lIHRyYW5zZmVyIHdhcyBzdWNjZXNzZnVsCisJQllURSBtX2JFdmVudEZsYWc7CS8vIGZvciBFdmVudHNpZ25hbGluZyB0byB0aGUgU3RhdGUgTWFzY2hpbmUKKwlEV09SRCBtX2R3Q250T2JqZWN0SW5EY2Y7CS8vIG51bWJlciBvZiBPYmplY3RzIGluIERDRgorCXRFcGxDZmdNYUluZGV4VHlwZSBtX1NraXBDZmc7CS8vIFRSVUUgaWYgYSBhZHNpdGlvbmFsIENvbmZpZ3VyYXRpb25wcm9jZXNzCisJLy8gaGF2ZSB0byBpbnNlcnQgZS5nLiBQRE8tbWFwcGluZworCVdPUkQgbV93VGltZU91dENudDsJLy8gVGltZW91dCBDb3VudGVyLCBicmVhayBjb25maWd1cmF0aW9uIGlzCisJLy8gbV93VGltZU91dENudCA9PSBDRkdNQV9NQVhfVElNRU9VVAorCit9IHRFcGxDZmdNYU5vZGU7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRnVuY3Rpb246ICAgIEVwbENmZ01hSW5pdCgpCisvLworLy8gRGVzY3JpcHRpb246IEZ1bmN0aW9uIGNyZWF0ZXMgZmlyc3QgaW5zdGFuY2Ugb2YgQ29uZmlndXJhdGlvbiBNYW5hZ2VyCisvLworLy8gUGFyYW1ldGVyczoKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordEVwbEtlcm5lbCBQVUJMSUMgRXBsQ2ZnTWFJbml0KCk7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBGdW5jdGlvbjogICAgRXBsQ2ZnTWFBZGRJbnN0YW5jZSgpCisvLworLy8gRGVzY3JpcHRpb246IEZ1bmN0aW9uIGNyZWF0ZXMgYWRkaXRpb25hbCBpbnN0YW5jZSBvZiBDb25maWd1cmF0aW9uIE1hbmFnZXIKKy8vCisvLyBQYXJhbWV0ZXJzOgorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0RXBsS2VybmVsIFBVQkxJQyBFcGxDZmdNYUFkZEluc3RhbmNlKCk7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBGdW5jdGlvbjogICAgRXBsQ2ZnTWFEZWxJbnN0YW5jZSgpCisvLworLy8gRGVzY3JpcHRpb246IEZ1bmN0aW9uIGRlbGV0ZSBpbnN0YW5jZSBvZiBDb25maWd1cmF0aW9uIE1hbmFnZXIKKy8vCisvLyBQYXJhbWV0ZXJzOgorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0RXBsS2VybmVsIFBVQkxJQyBFcGxDZmdNYURlbEluc3RhbmNlKCk7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBGdW5jdGlvbjogICAgRXBsQ2ZnTWFTdGFydENvbmZpZygpCisvLworLy8gRGVzY3JpcHRpb246IEZ1bmN0aW9uIHN0YXJ0cyB0aGUgY29uZmlndXJhdGlvbiBwcm9jZXNzCisvLyAgICAgICAgICAgICAgaW5pdGlhbGl6YXRpb24gdGhlIHN0YXRlbWFjaGluZSBmb3IgQ2ZnTWEtIHByb2Nlc3MKKy8vCisvLyBQYXJhbWV0ZXJzOiAgdWlOb2RlSWRfcCAgICAgICAgICAgICAgPSBOb2RlSWQgb2YgdGhlIG5vZGUgdG8gY29uZmlndXJlCisvLyAgICAgICAgICAgICAgcGJDb25jaXNlX3AgICAgICAgICAgICAgPSBwb2ludGVyIHRvIERDRgorLy8gICAgICAgICAgICAgIGZwQ2ZnTWFDYl9wICAgICAgICAgICAgID0gcG9pbnRlciB0byBjYWxsYmFjayBmdW5jdGlvbiAoc2hvdWxkIG5vdCBiZSBOVUxMKQorLy8gICAgICAgICAgICAgIFNpemVPZkNvbmNpc2VfcCAgICAgICAgID0gc2l6ZSBvZiBEQ0YgaW4gQllURSAtPiBmb3IgZnV0dXJlIHVzZQorLy8gICAgICAgICAgICAgIERjZlR5cGVfcCAgICAgICAgICAgICAgID0gdHlwZSBvZiB0aGUgRENGCisvLworLy8gUmV0dXJuczogICAgIHRDb3BLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3RFcGxLZXJuZWwgUFVCTElDIEVwbENmZ01hU3RhcnRDb25maWcodW5zaWduZWQgaW50IHVpTm9kZUlkX3AsCisJCQkJICAgICAgQllURSAqIHBiQ29uY2lzZV9wLAorCQkJCSAgICAgIHRmcEVwbENmZ01hQ2IgZnBDZmdNYUNiX3AsCisJCQkJICAgICAgdEVwbE9iZFNpemUgU2l6ZU9mQ29uY2lzZV9wLAorCQkJCSAgICAgIHRFcGxDZmdNYURjZlR5cCBEY2ZUeXBlX3ApOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRnVuY3Rpb246ICAgIENmZ01hU3RhcnRDb25maWd1cmF0aW9uTm9kZSgpCisvLworLy8gRGVzY3JpcHRpb246IEZ1bmN0aW9uIHN0YXJ0ZWQgdGhlIGNvbmZpZ3VyYXRpb24gcHJvY2VzcworLy8gICAgICAgICAgICAgIHdpdGggdGhlIERDRiBmcm9tIGFjY29yZGluZyBPRC1lbnRyeSBTdWJpbmRleCA9PSBiTm9kZUlkX3AKKy8vCisvLyBQYXJhbWV0ZXJzOiAgdWlOb2RlSWRfcCAgICAgICAgICAgICAgPSBOb2RlSWQgb2YgdGhlIG5vZGUgdG8gY29uZmlndXJlCisvLyAgICAgICAgICAgICAgZnBDZmdNYUNiX3AgICAgICAgICAgICAgPSBwb2ludGVyIHRvIGNhbGxiYWNrIGZ1bmN0aW9uIChzaG91bGQgbm90IGJlIE5VTEwpCisvLyAgICAgICAgICAgICAgRGNmVHlwZV9wICAgICAgICAgICAgICAgPSB0eXBlIG9mIHRoZSBEQ0YKKy8vCisvLyBSZXR1cm5zOiAgICAgdENvcEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordEVwbEtlcm5lbCBQVUJMSUMgRXBsQ2ZnTWFTdGFydENvbmZpZ05vZGUodW5zaWduZWQgaW50IHVpTm9kZUlkX3AsCisJCQkJCSAgdGZwRXBsQ2ZnTWFDYiBmcENmZ01hQ2JfcCwKKwkJCQkJICB0RXBsQ2ZnTWFEY2ZUeXAgRGNmVHlwZV9wKTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEZ1bmN0aW9uOiAgICBFcGxDZmdNYVN0YXJ0Q29uZmlnTm9kZURjZigpCisvLworLy8gRGVzY3JpcHRpb246IEZ1bmN0aW9uIHN0YXJ0cyB0aGUgY29uZmlndXJhdGlvbiBwcm9jZXNzCisvLyAgICAgICAgICAgICAgYW5kIGxpbmtzIHRoZSBjb25maWd1cmF0aW9uIGRhdGEgdG8gdGhlIE9ECisvLworLy8gUGFyYW1ldGVyczogIHVpTm9kZUlkX3AgICAgICAgICAgICAgID0gTm9kZUlkIG9mIHRoZSBub2RlIHRvIGNvbmZpZ3VyZQorLy8gICAgICAgICAgICAgIHBiQ29uY2lzZV9wICAgICAgICAgICAgID0gcG9pbnRlciB0byBEQ0YKKy8vICAgICAgICAgICAgICBmcENmZ01hQ2JfcCAgICAgICAgICAgICA9IHBvaW50ZXIgdG8gY2FsbGJhY2sgZnVuY3Rpb24gKHNob3VsZCBub3QgYmUgTlVMTCkKKy8vICAgICAgICAgICAgICBTaXplT2ZDb25jaXNlX3AgICAgICAgICA9IHNpemUgb2YgRENGIGluIEJZVEUgLT4gZm9yIGZ1dHVyZSB1c2UKKy8vICAgICAgICAgICAgICBEY2ZUeXBlX3AgICAgICAgICAgICAgICA9IHR5cGUgb2YgdGhlIERDRgorLy8KKy8vIFJldHVybnM6ICAgICB0Q29wS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0RXBsS2VybmVsIFBVQkxJQyBFcGxDZmdNYVN0YXJ0Q29uZmlnTm9kZURjZih1bnNpZ25lZCBpbnQgdWlOb2RlSWRfcCwKKwkJCQkJICAgICBCWVRFICogcGJDb25jaXNlX3AsCisJCQkJCSAgICAgdGZwRXBsQ2ZnTWFDYiBmcENmZ01hQ2JfcCwKKwkJCQkJICAgICB0RXBsT2JkU2l6ZSBTaXplT2ZDb25jaXNlX3AsCisJCQkJCSAgICAgdEVwbENmZ01hRGNmVHlwIERjZlR5cGVfcCk7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBGdW5jdGlvbjogICAgRXBsQ2ZnTWFMaW5rRGNmKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogRnVuY3Rpb24gbGlua3MgdGhlIGNvbmZpZ3VyYXRpb24gZGF0YSB0byB0aGUgT0QKKy8vCisvLyBQYXJhbWV0ZXJzOiAgdWlOb2RlSWRfcCAgICAgICAgICAgICAgPSBOb2RlSWQgb2YgdGhlIG5vZGUgdG8gY29uZmlndXJlCisvLyAgICAgICAgICAgICAgcGJDb25jaXNlX3AgICAgICAgICAgICAgPSBwb2ludGVyIHRvIERDRgorLy8gICAgICAgICAgICAgIFNpemVPZkNvbmNpc2VfcCAgICAgICAgPSBzaXplIG9mIERDRiBpbiBCWVRFIC0+IGZvciBmdXR1cmUgdXNlCisvLyAgICAgICAgICAgICAgRGNmVHlwZV9wICAgICAgICAgICAgICAgPSB0eXBlIG9mIHRoZSBEQ0YKKy8vCisvLyBSZXR1cm5zOiAgICAgdENvcEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordEVwbEtlcm5lbCBQVUJMSUMgRXBsQ2ZnTWFMaW5rRGNmKHVuc2lnbmVkIGludCB1aU5vZGVJZF9wLAorCQkJCSAgQllURSAqIHBiQ29uY2lzZV9wLAorCQkJCSAgdEVwbE9iZFNpemUgU2l6ZU9mQ29uY2lzZV9wLAorCQkJCSAgdEVwbENmZ01hRGNmVHlwIERjZlR5cGVfcCk7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBGdW5jdGlvbjogICAgRXBsQ2ZnTWFDaGVja0RjZigpCisvLworLy8gRGVzY3JpcHRpb246IEZ1bmN0aW9uIGNoZWNrIGlmIHRoZXJlIGlzIGFsbHJlYWR5IGEgY29uZmlndXJhdGlvbiBmaWxlIGxpbmtlZAorLy8gICAgICAgICAgICAgIHRvIHRoZSBPRCAodHlwZSBpcyBnaXZlbiBieSBEY2ZUeXBlX3ApCisvLworLy8gUGFyYW1ldGVyczogIHVpTm9kZUlkX3AgICAgICAgICAgICAgID0gTm9kZUlkCisvLyAgICAgICAgICAgICAgRGNmVHlwZV9wICAgICAgICAgICAgICAgPSB0eXBlIG9mIHRoZSBEQ0YKKy8vCisvLyBSZXR1cm5zOiAgICAgdENvcEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordEVwbEtlcm5lbCBQVUJMSUMgRXBsQ2ZnTWFDaGVja0RjZih1bnNpZ25lZCBpbnQgdWlOb2RlSWRfcCwKKwkJCQkgICB0RXBsQ2ZnTWFEY2ZUeXAgRGNmVHlwZV9wKTsKKworI2VuZGlmIC8vICNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX0NGR01BKSkgIT0gMCkKKworI2VuZGlmIC8vIF9FUExDRkdNQV9IXworCisvLyBFT0YKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwvdXNlci9FcGxEbGx1LmggYi9kcml2ZXJzL3N0YWdpbmcvZXBsL3VzZXIvRXBsRGxsdS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2ZjhiYjcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL3VzZXIvRXBsRGxsdS5oCkBAIC0wLDAgKzEsMTA4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgb3BlblBPV0VSTElOSworCisgIERlc2NyaXB0aW9uOiAgaW5jbHVkZSBmaWxlIGZvciB1c2Vyc3BhY2UgRExMIG1vZHVsZSBmb3IgYXN5bmNocm9ub3VzIGNvbW11bmljYXRpb24KKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgICAgICAgICRSQ1NmaWxlOiBFcGxEbGx1LmgsdiAkCisKKyAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAorCisgICAgICAgICAgICAgICAgJFJldmlzaW9uOiAxLjUgJCAgJERhdGU6IDIwMDgvMTAvMTcgMTU6MzI6MzIgJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgICAgIEdDQyBWMy40CisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwNi8wNi8yMCBkLmsuOiAgIHN0YXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiwgdmVyc2lvbiAxLjAwCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX0VQTF9ETExVX0hfCisjZGVmaW5lIF9FUExfRExMVV9IXworCisjaW5jbHVkZSAiLi4vRXBsRGxsLmgiCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gdHlwZWRlZgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordHlwZWRlZiB0RXBsS2VybmVsKFBVQkxJQyAqIHRFcGxEbGx1Q2JBc25kKSAodEVwbEZyYW1lSW5mbyAqIHBGcmFtZUluZm9fcCk7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX0RMTFUpKSAhPSAwKQorCit0RXBsS2VybmVsIEVwbERsbHVBZGRJbnN0YW5jZSh2b2lkKTsKKwordEVwbEtlcm5lbCBFcGxEbGx1RGVsSW5zdGFuY2Uodm9pZCk7CisKK3RFcGxLZXJuZWwgRXBsRGxsdVJlZ0FzbmRTZXJ2aWNlKHRFcGxEbGxBc25kU2VydmljZUlkIFNlcnZpY2VJZF9wLAorCQkJCSB0RXBsRGxsdUNiQXNuZCBwZm5EbGx1Q2JBc25kX3AsCisJCQkJIHRFcGxEbGxBc25kRmlsdGVyIEZpbHRlcl9wKTsKKwordEVwbEtlcm5lbCBFcGxEbGx1QXN5bmNTZW5kKHRFcGxGcmFtZUluZm8gKiBwRnJhbWVJbmZvX3AsCisJCQkgICAgdEVwbERsbEFzeW5jUmVxUHJpb3JpdHkgUHJpb3JpdHlfcCk7CisKKy8vIHByb2Nlc3NlcyBhc3luY2ggZnJhbWVzCit0RXBsS2VybmVsIEVwbERsbHVQcm9jZXNzKHRFcGxGcmFtZUluZm8gKiBwRnJhbWVJbmZvX3ApOworCisjZW5kaWYgLy8gI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9ETExVKSkgIT0gMCkKKworI2VuZGlmIC8vICNpZm5kZWYgX0VQTF9ETExVX0hfCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL3VzZXIvRXBsRGxsdUNhbC5oIGIvZHJpdmVycy9zdGFnaW5nL2VwbC91c2VyL0VwbERsbHVDYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMWRjZDA2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC91c2VyL0VwbERsbHVDYWwuaApAQCAtMCwwICsxLDExNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIGluY2x1ZGUgZmlsZSBmb3IgRExMIENvbW11bmljYXRpb24gQWJzdHJhY3Rpb24gTGF5ZXIgbW9kdWxlIGluIEVQTCB1c2VyIHBhcnQKKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgICAgICAgICRSQ1NmaWxlOiBFcGxEbGx1Q2FsLmgsdiAkCisKKyAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAorCisgICAgICAgICAgICAgICAgJFJldmlzaW9uOiAxLjUgJCAgJERhdGU6IDIwMDgvMTAvMTcgMTU6MzI6MzIgJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgICAgIEdDQyBWMy40CisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwNi8wNi8yMCBkLmsuOiAgIHN0YXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiwgdmVyc2lvbiAxLjAwCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX0VQTF9ETExVQ0FMX0hfCisjZGVmaW5lIF9FUExfRExMVUNBTF9IXworCisjaW5jbHVkZSAiLi4vRXBsRGxsLmgiCisjaW5jbHVkZSAiLi4vRXBsRXZlbnQuaCIKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvbnN0IGRlZmluZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyB0eXBlZGVmCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0eXBlZGVmIHRFcGxLZXJuZWwoUFVCTElDICogdEVwbERsbHVDYkFzbmQpICh0RXBsRnJhbWVJbmZvICogcEZyYW1lSW5mb19wKTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgRXBsRGxsdUNhbEFkZEluc3RhbmNlKHZvaWQpOworCit0RXBsS2VybmVsIEVwbERsbHVDYWxEZWxJbnN0YW5jZSh2b2lkKTsKKwordEVwbEtlcm5lbCBFcGxEbGx1Q2FsUmVnQXNuZFNlcnZpY2UodEVwbERsbEFzbmRTZXJ2aWNlSWQgU2VydmljZUlkX3AsCisJCQkJICAgIHRFcGxEbGx1Q2JBc25kIHBmbkRsbHVDYkFzbmRfcCwKKwkJCQkgICAgdEVwbERsbEFzbmRGaWx0ZXIgRmlsdGVyX3ApOworCit0RXBsS2VybmVsIEVwbERsbHVDYWxBc3luY1NlbmQodEVwbEZyYW1lSW5mbyAqIHBGcmFtZUluZm8sCisJCQkgICAgICAgdEVwbERsbEFzeW5jUmVxUHJpb3JpdHkgUHJpb3JpdHlfcCk7CisKK3RFcGxLZXJuZWwgRXBsRGxsdUNhbFByb2Nlc3ModEVwbEV2ZW50ICogcEV2ZW50X3ApOworCisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVF9NTikpICE9IDApCisKK3RFcGxLZXJuZWwgRXBsRGxsdUNhbEFkZE5vZGUodEVwbERsbE5vZGVJbmZvICogcE5vZGVJbmZvX3ApOworCit0RXBsS2VybmVsIEVwbERsbHVDYWxEZWxldGVOb2RlKHVuc2lnbmVkIGludCB1aU5vZGVJZF9wKTsKKwordEVwbEtlcm5lbCBFcGxEbGx1Q2FsU29mdERlbGV0ZU5vZGUodW5zaWduZWQgaW50IHVpTm9kZUlkX3ApOworCit0RXBsS2VybmVsIEVwbERsbHVDYWxJc3N1ZVJlcXVlc3QodEVwbERsbFJlcVNlcnZpY2VJZCBTZXJ2aWNlX3AsCisJCQkJICB1bnNpZ25lZCBpbnQgdWlOb2RlSWRfcCwgQllURSBiU29hRmxhZzFfcCk7CisKKyNlbmRpZgorCisjZW5kaWYgLy8gI2lmbmRlZiBfRVBMX0RMTFVDQUxfSF8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwvdXNlci9FcGxFdmVudHUuaCBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvdXNlci9FcGxFdmVudHUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjJjZmZkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC91c2VyL0VwbEV2ZW50dS5oCkBAIC0wLDAgKzEsMTA4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgb3BlblBPV0VSTElOSworCisgIERlc2NyaXB0aW9uOiAgaW5jbHVkZSBmaWxlIGZvciBrZXJuZWwgZXZlbnQgbW9kdWxlCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRXBsRXZlbnR1LmgsdiAkCisKKyAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAorCisgICAgICAgICAgICAgICAgJFJldmlzaW9uOiAxLjQgJCAgJERhdGU6IDIwMDgvMDQvMTcgMjE6MzY6MzIgJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgICAgIEdDQyBWMy40CisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwNi8wNi8xMiBkLmsuOiAgIHN0YXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiwgdmVyc2lvbiAxLjAwCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX0VQTF9FVkVOVFVfSF8KKyNkZWZpbmUgX0VQTF9FVkVOVFVfSF8KKworI2luY2x1ZGUgIi4uL0VwbEV2ZW50LmgiCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gdHlwZWRlZgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBpbml0IGZ1bmN0aW9uCit0RXBsS2VybmVsIFBVQkxJQyBFcGxFdmVudHVJbml0KHRFcGxQcm9jZXNzRXZlbnRDYiBwZm5BcGlQcm9jZXNzRXZlbnRDYl9wKTsKKworLy8gYWRkIGluc3RhbmNlCit0RXBsS2VybmVsIFBVQkxJQyBFcGxFdmVudHVBZGRJbnN0YW5jZSh0RXBsUHJvY2Vzc0V2ZW50Q2IKKwkJCQkgICAgICAgcGZuQXBpUHJvY2Vzc0V2ZW50Q2JfcCk7CisKKy8vIGRlbGV0ZSBpbnN0YW5jZQordEVwbEtlcm5lbCBQVUJMSUMgRXBsRXZlbnR1RGVsSW5zdGFuY2Uodm9pZCk7CisKKy8vIFRhc2sgdGhhdCBkaXNwYXRjaGVzIGV2ZW50cyBpbiB1c2Vyc3BhY2UKK3RFcGxLZXJuZWwgUFVCTElDIEVwbEV2ZW50dVByb2Nlc3ModEVwbEV2ZW50ICogcEV2ZW50X3ApOworCisvLyBwb3N0IGV2ZW50cyBmcm9tIHVzZXJzcGFjZQordEVwbEtlcm5lbCBQVUJMSUMgRXBsRXZlbnR1UG9zdCh0RXBsRXZlbnQgKiBwRXZlbnRfcCk7CisKKy8vIHBvc3QgZXJyb3JldmVudHMgZnJvbSB1c2Vyc3BhY2UKK3RFcGxLZXJuZWwgUFVCTElDIEVwbEV2ZW50dVBvc3RFcnJvcih0RXBsRXZlbnRTb3VyY2UgRXZlbnRTb3VyY2VfcCwKKwkJCQkgICAgIHRFcGxLZXJuZWwgRXBsRXJyb3JfcCwKKwkJCQkgICAgIHVuc2lnbmVkIGludCB1aUFyZ1NpemVfcCwgdm9pZCAqcEFyZ19wKTsKKworI2VuZGlmIC8vICNpZm5kZWYgX0VQTF9FVkVOVFVfSF8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwvdXNlci9FcGxJZGVudHUuaCBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvdXNlci9FcGxJZGVudHUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzMwMjEwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC91c2VyL0VwbElkZW50dS5oCkBAIC0wLDAgKzEsMTA4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgb3BlblBPV0VSTElOSworCisgIERlc2NyaXB0aW9uOiAgaW5jbHVkZSBmaWxlIGZvciBJZGVudHUtTW9kdWxlCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRXBsSWRlbnR1LmgsdiAkCisKKyAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAorCisgICAgICAgICAgICAgICAgJFJldmlzaW9uOiAxLjMgJCAgJERhdGU6IDIwMDgvMDQvMTcgMjE6MzY6MzIgJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgICAgIEdDQyBWMy40CisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwNi8xMS8xNSBkLmsuOiAgIHN0YXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiLi4vRXBsRGxsLmgiCisKKyNpZm5kZWYgX0VQTElERU5UVV9IXworI2RlZmluZSBfRVBMSURFTlRVX0hfCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gdHlwZWRlZgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordHlwZWRlZiB0RXBsS2VybmVsKFBVQkxJQyAqIHRFcGxJZGVudHVDYlJlc3BvbnNlKSAodW5zaWduZWQgaW50IHVpTm9kZUlkX3AsCisJCQkJCQkgICB0RXBsSWRlbnRSZXNwb25zZSAqCisJCQkJCQkgICBwSWRlbnRSZXNwb25zZV9wKTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbElkZW50dUluaXQodm9pZCk7CisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbElkZW50dUFkZEluc3RhbmNlKHZvaWQpOworCit0RXBsS2VybmVsIFBVQkxJQyBFcGxJZGVudHVEZWxJbnN0YW5jZSh2b2lkKTsKKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsSWRlbnR1UmVzZXQodm9pZCk7CisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbElkZW50dUdldElkZW50UmVzcG9uc2UodW5zaWduZWQgaW50IHVpTm9kZUlkX3AsCisJCQkJCSAgICB0RXBsSWRlbnRSZXNwb25zZSAqKgorCQkJCQkgICAgcHBJZGVudFJlc3BvbnNlX3ApOworCit0RXBsS2VybmVsIFBVQkxJQyBFcGxJZGVudHVSZXF1ZXN0SWRlbnRSZXNwb25zZSh1bnNpZ25lZCBpbnQgdWlOb2RlSWRfcCwKKwkJCQkJCXRFcGxJZGVudHVDYlJlc3BvbnNlCisJCQkJCQlwZm5DYlJlc3BvbnNlX3ApOworCisjZW5kaWYgLy8gI2lmbmRlZiBfRVBMSURFTlRVX0hfCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL3VzZXIvRXBsTGVkdS5oIGIvZHJpdmVycy9zdGFnaW5nL2VwbC91c2VyL0VwbExlZHUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGU3MGQwNjQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL3VzZXIvRXBsTGVkdS5oCkBAIC0wLDAgKzEsMTA5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgb3BlblBPV0VSTElOSworCisgIERlc2NyaXB0aW9uOiAgaW5jbHVkZSBmaWxlIGZvciBzdGF0dXMgYW5kIGVycm9yIExFRCB1c2VyIHBhcnQgbW9kdWxlCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRXBsTGVkdS5oLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS4xICQgICREYXRlOiAyMDA4LzExLzE3IDE2OjQwOjM5ICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorICAgICAgICAgICAgICAgICAgICBHQ0MgVjMuNAorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgIDIwMDgvMTEvMTcgZC5rLjogICBzdGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIi4uL0VwbExlZC5oIgorI2luY2x1ZGUgIi4uL0VwbE5tdC5oIgorI2luY2x1ZGUgIkVwbEV2ZW50dS5oIgorCisjaWZuZGVmIF9FUExMRURVX0hfCisjZGVmaW5lIF9FUExMRURVX0hfCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gdHlwZWRlZgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordHlwZWRlZiB0RXBsS2VybmVsKFBVQkxJQyAqIHRFcGxMZWR1U3RhdGVDaGFuZ2VDYWxsYmFjaykgKHRFcGxMZWRUeXBlIExlZFR5cGVfcCwKKwkJCQkJCQkgIEJPT0wgZk9uX3ApOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTEVEVSkpICE9IDApCisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbExlZHVJbml0KHRFcGxMZWR1U3RhdGVDaGFuZ2VDYWxsYmFjayBwZm5DYlN0YXRlQ2hhbmdlX3ApOworCit0RXBsS2VybmVsIFBVQkxJQyBFcGxMZWR1QWRkSW5zdGFuY2UodEVwbExlZHVTdGF0ZUNoYW5nZUNhbGxiYWNrCisJCQkJICAgICBwZm5DYlN0YXRlQ2hhbmdlX3ApOworCit0RXBsS2VybmVsIFBVQkxJQyBFcGxMZWR1RGVsSW5zdGFuY2Uodm9pZCk7CisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbExlZHVDYk5tdFN0YXRlQ2hhbmdlKHRFcGxFdmVudE5tdFN0YXRlQ2hhbmdlCisJCQkJCSAgTm10U3RhdGVDaGFuZ2VfcCk7CisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbExlZHVQcm9jZXNzRXZlbnQodEVwbEV2ZW50ICogcEVwbEV2ZW50X3ApOworCisjZW5kaWYgLy8gI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTEVEVSkpICE9IDApCisKKyNlbmRpZiAvLyAjaWZuZGVmIF9FUExMRURVX0hfCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL3VzZXIvRXBsTm10Q251LmggYi9kcml2ZXJzL3N0YWdpbmcvZXBsL3VzZXIvRXBsTm10Q251LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTUwODA1NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvdXNlci9FcGxObXRDbnUuaApAQCAtMCwwICsxLDEwOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIGluY2x1ZGUgZmlsZSBmb3IgTk1ULUNOLVVzZXJzcGFjZS1Nb2R1bGUKKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgICAgICAgICRSQ1NmaWxlOiBFcGxObXRDbnUuaCx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuNSAkICAkRGF0ZTogMjAwOC8xMC8xNyAxNTozMjozMiAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICAgICAgR0NDIFYzLjQKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUmV2aXNpb24gSGlzdG9yeToKKworICAyMDA2LzA2LzA5IGsudC46ICAgc3RhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJFcGxObXR1LmgiCisjaW5jbHVkZSAiLi4vRXBsRGxsLmgiCisjaW5jbHVkZSAiLi4vRXBsRnJhbWUuaCIKKworI2lmbmRlZiBfRVBMTk1UQ05VX0hfCisjZGVmaW5lIF9FUExOTVRDTlVfSF8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvbnN0IGRlZmluZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyB0eXBlZGVmCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRfQ04pKSAhPSAwKQorCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMgRXBsTm10Q251SW5pdCh1bnNpZ25lZCBpbnQgdWlOb2RlSWRfcCk7CisKK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxObXRDbnVBZGRJbnN0YW5jZSh1bnNpZ25lZCBpbnQgdWlOb2RlSWRfcCk7CisKK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxObXRDbnVEZWxJbnN0YW5jZSh2b2lkKTsKKworRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbE5tdENudVNlbmRObXRSZXF1ZXN0KHVuc2lnbmVkIGludCB1aU5vZGVJZF9wLAorCQkJCQkJICAgICAgIHRFcGxObXRDb21tYW5kCisJCQkJCQkgICAgICAgTm10Q29tbWFuZF9wKTsKKworRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDCitFcGxObXRDbnVSZWdpc3RlckNoZWNrRXZlbnRDYih0RXBsTm10dUNoZWNrRXZlbnRDYWxsYmFjaworCQkJICAgICAgcGZuRXBsTm10Q2hlY2tFdmVudENiX3ApOworCisjZW5kaWYgLy8gI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRfQ04pKSAhPSAwKQorCisjZW5kaWYgLy8gI2lmbmRlZiBfRVBMTk1UQ05VX0hfCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL3VzZXIvRXBsTm10TW51LmggYi9kcml2ZXJzL3N0YWdpbmcvZXBsL3VzZXIvRXBsTm10TW51LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzU0ZWZlYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvdXNlci9FcGxObXRNbnUuaApAQCAtMCwwICsxLDEzMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIGluY2x1ZGUgZmlsZSBmb3IgTk1ULU1OLVVzZXJzcGFjZS1Nb2R1bGUKKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgICAgICAgICRSQ1NmaWxlOiBFcGxObXRNbnUuaCx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuNiAkICAkRGF0ZTogMjAwOC8xMC8xNyAxNTozMjozMiAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICAgICAgR0NDIFYzLjQKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUmV2aXNpb24gSGlzdG9yeToKKworICAyMDA2LzA2LzA5IGsudC46ICAgc3RhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJFcGxObXR1LmgiCisKKyNpZm5kZWYgX0VQTE5NVE1OVV9IXworI2RlZmluZSBfRVBMTk1UTU5VX0hfCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gdHlwZWRlZgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordHlwZWRlZiB0RXBsS2VybmVsKFBVQkxJQyAqIHRFcGxObXRNbnVDYk5vZGVFdmVudCkgKHVuc2lnbmVkIGludCB1aU5vZGVJZF9wLAorCQkJCQkJICAgIHRFcGxObXROb2RlRXZlbnQKKwkJCQkJCSAgICBOb2RlRXZlbnRfcCwKKwkJCQkJCSAgICB0RXBsTm10U3RhdGUgTm10U3RhdGVfcCwKKwkJCQkJCSAgICBXT1JEIHdFcnJvckNvZGVfcCwKKwkJCQkJCSAgICBCT09MIGZNYW5kYXRvcnlfcCk7CisKK3R5cGVkZWYgdEVwbEtlcm5lbChQVUJMSUMgKgorCQkgICB0RXBsTm10TW51Q2JCb290RXZlbnQpICh0RXBsTm10Qm9vdEV2ZW50IEJvb3RFdmVudF9wLAorCQkJCQkgICB0RXBsTm10U3RhdGUgTm10U3RhdGVfcCwKKwkJCQkJICAgV09SRCB3RXJyb3JDb2RlX3ApOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRfTU4pKSAhPSAwKQorCit0RXBsS2VybmVsIEVwbE5tdE1udUluaXQodEVwbE5tdE1udUNiTm9kZUV2ZW50IHBmbkNiTm9kZUV2ZW50X3AsCisJCQkgdEVwbE5tdE1udUNiQm9vdEV2ZW50IHBmbkNiQm9vdEV2ZW50X3ApOworCit0RXBsS2VybmVsIEVwbE5tdE1udUFkZEluc3RhbmNlKHRFcGxObXRNbnVDYk5vZGVFdmVudCBwZm5DYk5vZGVFdmVudF9wLAorCQkJCXRFcGxObXRNbnVDYkJvb3RFdmVudCBwZm5DYkJvb3RFdmVudF9wKTsKKwordEVwbEtlcm5lbCBFcGxObXRNbnVEZWxJbnN0YW5jZSh2b2lkKTsKKworRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbE5tdE1udVByb2Nlc3NFdmVudCh0RXBsRXZlbnQgKiBwRXZlbnRfcCk7CisKK3RFcGxLZXJuZWwgRXBsTm10TW51U2VuZE5tdENvbW1hbmQodW5zaWduZWQgaW50IHVpTm9kZUlkX3AsCisJCQkJICAgdEVwbE5tdENvbW1hbmQgTm10Q29tbWFuZF9wKTsKKwordEVwbEtlcm5lbCBFcGxObXRNbnVUcmlnZ2VyU3RhdGVDaGFuZ2UodW5zaWduZWQgaW50IHVpTm9kZUlkX3AsCisJCQkJICAgICAgIHRFcGxObXROb2RlQ29tbWFuZCBOb2RlQ29tbWFuZF9wKTsKKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsTm10TW51Q2JObXRTdGF0ZUNoYW5nZSh0RXBsRXZlbnRObXRTdGF0ZUNoYW5nZQorCQkJCQkgICAgTm10U3RhdGVDaGFuZ2VfcCk7CisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbE5tdE1udUNiQ2hlY2tFdmVudCh0RXBsTm10RXZlbnQgTm10RXZlbnRfcCk7CisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbE5tdE1udUdldERpYWdub3N0aWNJbmZvKHVuc2lnbmVkIGludAorCQkJCQkgICAgICpwdWlNYW5kYXRvcnlTbGF2ZUNvdW50X3AsCisJCQkJCSAgICAgdW5zaWduZWQgaW50CisJCQkJCSAgICAgKnB1aVNpZ25hbFNsYXZlQ291bnRfcCwKKwkJCQkJICAgICBXT1JEICogcHdGbGFnc19wKTsKKworI2VuZGlmCisKKyNlbmRpZiAvLyAjaWZuZGVmIF9FUExOTVRNTlVfSF8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwvdXNlci9FcGxObXR1LmggYi9kcml2ZXJzL3N0YWdpbmcvZXBsL3VzZXIvRXBsTm10dS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhNTZjNTgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL3VzZXIvRXBsTm10dS5oCkBAIC0wLDAgKzEsMTU1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgb3BlblBPV0VSTElOSworCisgIERlc2NyaXB0aW9uOiAgaW5jbHVkZSBmaWxlIGZvciBOTVQtVXNlcnNwYWNlLU1vZHVsZQorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgJFJDU2ZpbGU6IEVwbE5tdHUuaCx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuNSAkICAkRGF0ZTogMjAwOC8xMC8xNyAxNTozMjozMiAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICAgICAgR0NDIFYzLjQKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUmV2aXNpb24gSGlzdG9yeToKKworICAyMDA2LzA2LzA5IGsudC46ICAgc3RhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICIuLi9FcGxObXQuaCIKKyNpbmNsdWRlICJFcGxFdmVudHUuaCIKKworI2lmbmRlZiBfRVBMTk1UVV9IXworI2RlZmluZSBfRVBMTk1UVV9IXworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHR5cGVkZWYKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBubXQgY29tbWFuZHMKK3R5cGVkZWYgZW51bSB7CisJLy8gcmVxdWVzdGFibGUgQVNuZCBTZXJ2aWNlSWRzICAgIDB4MDEuLjB4MUYKKwlrRXBsTm10Q21kSWRlbnRSZXNwb25zZSA9IDB4MDEsCisJa0VwbE5tdENtZFN0YXR1c1Jlc3BvbnNlID0gMHgwMiwKKwkvLyBwbGFpbiBOTVQgc3RhdGUgY29tbWFuZHMgICAgICAgMHgyMC4uMHgzRgorCWtFcGxObXRDbWRTdGFydE5vZGUgPSAweDIxLAorCWtFcGxObXRDbWRTdG9wTm9kZSA9IDB4MjIsCisJa0VwbE5tdENtZEVudGVyUHJlT3BlcmF0aW9uYWwyID0gMHgyMywKKwlrRXBsTm10Q21kRW5hYmxlUmVhZHlUb09wZXJhdGUgPSAweDI0LAorCWtFcGxObXRDbWRSZXNldE5vZGUgPSAweDI4LAorCWtFcGxObXRDbWRSZXNldENvbW11bmljYXRpb24gPSAweDI5LAorCWtFcGxObXRDbWRSZXNldENvbmZpZ3VyYXRpb24gPSAweDJBLAorCWtFcGxObXRDbWRTd1Jlc2V0ID0gMHgyQiwKKwkvLyBleHRlbmRlZCBOTVQgc3RhdGUgY29tbWFuZHMgICAgMHg0MC4uMHg1RgorCWtFcGxObXRDbWRTdGFydE5vZGVFeCA9IDB4NDEsCisJa0VwbE5tdENtZFN0b3BOb2RlRXggPSAweDQyLAorCWtFcGxObXRDbWRFbnRlclByZU9wZXJhdGlvbmFsMkV4ID0gMHg0MywKKwlrRXBsTm10Q21kRW5hYmxlUmVhZHlUb09wZXJhdGVFeCA9IDB4NDQsCisJa0VwbE5tdENtZFJlc2V0Tm9kZUV4ID0gMHg0OCwKKwlrRXBsTm10Q21kUmVzZXRDb21tdW5pY2F0aW9uRXggPSAweDQ5LAorCWtFcGxObXRDbWRSZXNldENvbmZpZ3VyYXRpb25FeCA9IDB4NEEsCisJa0VwbE5tdENtZFN3UmVzZXRFeCA9IDB4NEIsCisJLy8gTk1UIG1hbmFnaW5nIGNvbW1hbmRzICAgICAgICAgIDB4NjAuLjB4N0YKKwlrRXBsTm10Q21kTmV0SG9zdE5hbWVTZXQgPSAweDYyLAorCWtFcGxObXRDbWRGbHVzaEFycEVudHJ5ID0gMHg2MywKKwkvLyBOTVQgaW5mbyBzZXJ2aWNlcyAgICAgICAgICAgICAgMHg4MC4uMHhCRgorCWtFcGxObXRDbWRQdWJsaXNoQ29uZmlndXJlZENOID0gMHg4MCwKKwlrRXBsTm10Q21kUHVibGlzaEFjdGl2ZUNOID0gMHg5MCwKKwlrRXBsTm10Q21kUHVibGlzaFByZU9wZXJhdGlvbmFsMSA9IDB4OTEsCisJa0VwbE5tdENtZFB1Ymxpc2hQcmVPcGVyYXRpb25hbDIgPSAweDkyLAorCWtFcGxObXRDbWRQdWJsaXNoUmVhZHlUb09wZXJhdGUgPSAweDkzLAorCWtFcGxObXRDbWRQdWJsaXNoT3BlcmF0aW9uYWwgPSAweDk0LAorCWtFcGxObXRDbWRQdWJsaXNoU3RvcHBlZCA9IDB4OTUsCisJa0VwbE5tdENtZFB1Ymxpc2hFbWVyZ2VuY3lOZXcgPSAweEEwLAorCWtFcGxObXRDbWRQdWJsaXNoVGltZSA9IDB4QjAsCisKKwlrRXBsTm10Q21kSW52YWxpZFNlcnZpY2UgPSAweEZGCit9IHRFcGxObXRDb21tYW5kOworCit0eXBlZGVmIHRFcGxLZXJuZWwoUFVCTElDICoKKwkJICAgdEVwbE5tdHVTdGF0ZUNoYW5nZUNhbGxiYWNrKSAodEVwbEV2ZW50Tm10U3RhdGVDaGFuZ2UKKwkJCQkJCSBObXRTdGF0ZUNoYW5nZV9wKTsKKwordHlwZWRlZiB0RXBsS2VybmVsKFBVQkxJQyAqCisJCSAgIHRFcGxObXR1Q2hlY2tFdmVudENhbGxiYWNrKSAodEVwbE5tdEV2ZW50IE5tdEV2ZW50X3ApOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRVKSkgIT0gMCkKKworRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbE5tdHVJbml0KHZvaWQpOworCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMgRXBsTm10dUFkZEluc3RhbmNlKHZvaWQpOworCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMgRXBsTm10dURlbEluc3RhbmNlKHZvaWQpOworCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMgRXBsTm10dU5tdEV2ZW50KHRFcGxObXRFdmVudCBObXRFdmVudF9wKTsKKworRVBMRExMRVhQT1JUIHRFcGxObXRTdGF0ZSBQVUJMSUMgRXBsTm10dUdldE5tdFN0YXRlKHZvaWQpOworCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMgRXBsTm10dVByb2Nlc3NFdmVudCh0RXBsRXZlbnQgKiBwRXBsRXZlbnRfcCk7CisKK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQworRXBsTm10dVJlZ2lzdGVyU3RhdGVDaGFuZ2VDYih0RXBsTm10dVN0YXRlQ2hhbmdlQ2FsbGJhY2sKKwkJCSAgICAgcGZuRXBsTm10U3RhdGVDaGFuZ2VDYl9wKTsKKworI2VuZGlmIC8vICNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UVSkpICE9IDApCisKKyNlbmRpZiAvLyAjaWZuZGVmIF9FUExOTVRVX0hfCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL3VzZXIvRXBsTm10dUNhbC5oIGIvZHJpdmVycy9zdGFnaW5nL2VwbC91c2VyL0VwbE5tdHVDYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODgxNTgyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC91c2VyL0VwbE5tdHVDYWwuaApAQCAtMCwwICsxLDkxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgb3BlblBPV0VSTElOSworCisgIERlc2NyaXB0aW9uOiAgaW5jbHVkZSBmaWxlIGZvciBjb21tdW5pY2F0aW9uIGFic3RyYWN0aW9uIGxheWVyIG9mIHRoZQorICAgICAgICAgICAgICAgIE5NVC1Vc2Vyc3BhY2UtTW9kdWxlCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRXBsTm10dUNhbC5oLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS40ICQgICREYXRlOiAyMDA4LzA0LzE3IDIxOjM2OjMyICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorICAgICAgICAgICAgICAgICAgICBHQ0MgVjMuNAorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgIDIwMDYvMDYvMTYgLWsudC46ICAgc3RhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJFcGxObXR1LmgiCisjaW5jbHVkZSAiLi4va2VybmVsL0VwbE5tdGsuaCIKKworI2lmbmRlZiBfRVBMTk1UVUNBTF9IXworI2RlZmluZSBfRVBMTk1UVUNBTF9IXworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHR5cGVkZWYKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHRFcGxObXRTdGF0ZSBQVUJMSUMgRXBsTm10a0NhbEdldE5tdFN0YXRlKHZvaWQpOworCisjZW5kaWYgLy8gI2lmbmRlZiBfRVBMTk1UVUNBTF9IXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC91c2VyL0VwbE9iZHUuaCBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvdXNlci9FcGxPYmR1LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmMxZTE3MwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvdXNlci9FcGxPYmR1LmgKQEAgLTAsMCArMSwxOTIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBpbmNsdWRlIGZpbGUgZm9yIEVwbC1PYmQtVXNlcnNwYWNlLW1vZHVsZQorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgJFJDU2ZpbGU6IEVwbE9iZHUuaCx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuNiAkICAkRGF0ZTogMjAwOC8xMC8xNyAxNTozMjozMiAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICAgICAgR0NDIFYzLjQKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUmV2aXNpb24gSGlzdG9yeToKKworICAyMDA2LzA2LzE5IGsudC46ICAgc3RhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICIuLi9FcGxPYmQuaCIKKworI2lmbmRlZiBfRVBMT0JEVV9IXworI2RlZmluZSBfRVBMT0JEVV9IXworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHR5cGVkZWYKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWYgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9PQkRVKSkgIT0gMCkKKworI2lmIEVQTF9PQkRfVVNFX0tFUk5FTCAhPSBGQUxTRQorI2Vycm9yICJFUEwgT0JEdSBtb2R1bGUgZW5hYmxlZCwgYnV0IE9CRF9VU0VfS0VSTkVMID09IFRSVUUiCisjZW5kaWYKKworRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbE9iZHVXcml0ZUVudHJ5KHVuc2lnbmVkIGludCB1aUluZGV4X3AsCisJCQkJCQkgdW5zaWduZWQgaW50IHVpU3ViSW5kZXhfcCwKKwkJCQkJCSB2b2lkICpwU3JjRGF0YV9wLAorCQkJCQkJIHRFcGxPYmRTaXplIFNpemVfcCk7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbE9iZHVSZWFkRW50cnkodW5zaWduZWQgaW50IHVpSW5kZXhfcCwKKwkJCQkJCXVuc2lnbmVkIGludCB1aVN1YkluZGV4X3AsCisJCQkJCQl2b2lkICpwRHN0RGF0YV9wLAorCQkJCQkJdEVwbE9iZFNpemUgKiBwU2l6ZV9wKTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMgRXBsT2JkdUFjY2Vzc09kUGFydCh0RXBsT2JkUGFydCBPYmRQYXJ0X3AsCisJCQkJCQkgICB0RXBsT2JkRGlyIERpcmVjdGlvbl9wKTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMgRXBsT2JkdURlZmluZVZhcih0RXBsVmFyUGFyYW0gTUVNICogcFZhclBhcmFtX3ApOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VQTERMTEVYUE9SVCB2b2lkICpQVUJMSUMgRXBsT2JkdUdldE9iamVjdERhdGFQdHIodW5zaWduZWQgaW50IHVpSW5kZXhfcCwKKwkJCQkJCSAgdW5zaWduZWQgaW50IHVpU3ViSW5kZXhfcCk7CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxPYmR1UmVnaXN0ZXJVc2VyT2QodEVwbE9iZEVudHJ5UHRyIHBVc2VyT2RfcCk7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHZvaWQgUFVCTElDIEVwbE9iZHVJbml0VmFyRW50cnkodEVwbE9iZFZhckVudHJ5IE1FTSAqIHBWYXJFbnRyeV9wLAorCQkJCQkgICAgIEJZVEUgYlR5cGVfcCwKKwkJCQkJICAgICB0RXBsT2JkU2l6ZSBPYmRTaXplX3ApOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VQTERMTEVYUE9SVCB0RXBsT2JkU2l6ZSBQVUJMSUMgRXBsT2JkdUdldERhdGFTaXplKHVuc2lnbmVkIGludCB1aUluZGV4X3AsCisJCQkJCQkgICB1bnNpZ25lZCBpbnQgdWlTdWJJbmRleF9wKTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdW5zaWduZWQgaW50IFBVQkxJQyBFcGxPYmR1R2V0Tm9kZUlkKHZvaWQpOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxPYmR1U2V0Tm9kZUlkKHVuc2lnbmVkIGludCB1aU5vZGVJZF9wLAorCQkJCQkJdEVwbE9iZE5vZGVJZFR5cGUgTm9kZUlkVHlwZV9wKTsKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbE9iZHVHZXRBY2Nlc3NUeXBlKHVuc2lnbmVkIGludCB1aUluZGV4X3AsCisJCQkJCQkgICAgdW5zaWduZWQgaW50IHVpU3ViSW5kZXhfcCwKKwkJCQkJCSAgICB0RXBsT2JkQWNjZXNzICoKKwkJCQkJCSAgICBwQWNjZXNzVHlwX3ApOworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMgRXBsT2JkdVJlYWRFbnRyeVRvTGUodW5zaWduZWQgaW50IHVpSW5kZXhfcCwKKwkJCQkJCSAgICB1bnNpZ25lZCBpbnQgdWlTdWJJbmRleF9wLAorCQkJCQkJICAgIHZvaWQgKnBEc3REYXRhX3AsCisJCQkJCQkgICAgdEVwbE9iZFNpemUgKiBwU2l6ZV9wKTsKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbE9iZHVXcml0ZUVudHJ5RnJvbUxlKHVuc2lnbmVkIGludCB1aUluZGV4X3AsCisJCQkJCQkgICAgICAgdW5zaWduZWQgaW50CisJCQkJCQkgICAgICAgdWlTdWJJbmRleF9wLAorCQkJCQkJICAgICAgIHZvaWQgKnBTcmNEYXRhX3AsCisJCQkJCQkgICAgICAgdEVwbE9iZFNpemUgU2l6ZV9wKTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMgRXBsT2JkdVNlYXJjaFZhckVudHJ5KEVQTF9NQ09fREVDTF9JTlNUQU5DRV9QVFJfCisJCQkJCQkgICAgIHVuc2lnbmVkIGludCB1aUluZGV4X3AsCisJCQkJCQkgICAgIHVuc2lnbmVkIGludCB1aVN1YmluZGV4X3AsCisJCQkJCQkgICAgIHRFcGxPYmRWYXJFbnRyeSBNRU0gKioKKwkJCQkJCSAgICAgcHBWYXJFbnRyeV9wKTsKKworI2VsaWYgRVBMX09CRF9VU0VfS0VSTkVMICE9IEZBTFNFCisjaW5jbHVkZSAiLi4va2VybmVsL0VwbE9iZGsuaCIKKworI2RlZmluZSBFcGxPYmR1V3JpdGVFbnRyeSAgICAgICBFcGxPYmRXcml0ZUVudHJ5CisKKyNkZWZpbmUgRXBsT2JkdVJlYWRFbnRyeSAgICAgICAgRXBsT2JkUmVhZEVudHJ5CisKKyNkZWZpbmUgRXBsT2JkdUFjY2Vzc09kUGFydCAgICAgRXBsT2JkQWNjZXNzT2RQYXJ0CisKKyNkZWZpbmUgRXBsT2JkdURlZmluZVZhciAgICAgICAgRXBsT2JkRGVmaW5lVmFyCisKKyNkZWZpbmUgRXBsT2JkdUdldE9iamVjdERhdGFQdHIgRXBsT2JkR2V0T2JqZWN0RGF0YVB0cgorCisjZGVmaW5lIEVwbE9iZHVSZWdpc3RlclVzZXJPZCAgIEVwbE9iZFJlZ2lzdGVyVXNlck9kCisKKyNkZWZpbmUgRXBsT2JkdUluaXRWYXJFbnRyeSAgICAgRXBsT2JkSW5pdFZhckVudHJ5CisKKyNkZWZpbmUgRXBsT2JkdUdldERhdGFTaXplICAgICAgRXBsT2JkR2V0RGF0YVNpemUKKworI2RlZmluZSBFcGxPYmR1R2V0Tm9kZUlkICAgICAgICBFcGxPYmRHZXROb2RlSWQKKworI2RlZmluZSBFcGxPYmR1U2V0Tm9kZUlkICAgICAgICBFcGxPYmRTZXROb2RlSWQKKworI2RlZmluZSBFcGxPYmR1R2V0QWNjZXNzVHlwZSAgICBFcGxPYmRHZXRBY2Nlc3NUeXBlCisKKyNkZWZpbmUgRXBsT2JkdVJlYWRFbnRyeVRvTGUgICAgRXBsT2JkUmVhZEVudHJ5VG9MZQorCisjZGVmaW5lIEVwbE9iZHVXcml0ZUVudHJ5RnJvbUxlIEVwbE9iZFdyaXRlRW50cnlGcm9tTGUKKworI2RlZmluZSBFcGxPYmR1U2VhcmNoVmFyRW50cnkgICBFcGxPYmRTZWFyY2hWYXJFbnRyeQorCisjZGVmaW5lIEVwbE9iZHVJc051bWVyaWNhbCAgICAgIEVwbE9iZElzTnVtZXJpY2FsCisKKyNlbmRpZiAvLyAjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX09CRFUpKSAhPSAwKQorCisjZW5kaWYgLy8gI2lmbmRlZiBfRVBMT0JEVV9IXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC91c2VyL0VwbE9iZHVDYWwuaCBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvdXNlci9FcGxPYmR1Q2FsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDk4ZTAxMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvdXNlci9FcGxPYmR1Q2FsLmgKQEAgLTAsMCArMSwxNDggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBpbmNsdWRlIGZpbGUgZm9yIGNvbW11bmljYXRpb24gYWJzdHJhY3Rpb24gbGF5ZXIKKyAgICAgICAgICAgICAgICBmb3IgdGhlIEVwbC1PYmQtVXNlcnNwYWNlLU1vZHVsCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRXBsT2JkdUNhbC5oLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS40ICQgICREYXRlOiAyMDA4LzA0LzE3IDIxOjM2OjMyICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorICAgICAgICAgICAgICAgICAgICBHQ0MgVjMuNAorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgIDIwMDYvMDYvMTkgay50LjogICBzdGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIi4uL0VwbE9iZC5oIgorCisjaWZuZGVmIF9FUExPQkRVQ0FMX0hfCisjZGVmaW5lIF9FUExPQkRVQ0FMX0hfCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gdHlwZWRlZgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMgRXBsT2JkdUNhbFdyaXRlRW50cnkodW5zaWduZWQgaW50IHVpSW5kZXhfcCwKKwkJCQkJCSAgICB1bnNpZ25lZCBpbnQgdWlTdWJJbmRleF9wLAorCQkJCQkJICAgIHZvaWQgKnBTcmNEYXRhX3AsCisJCQkJCQkgICAgdEVwbE9iZFNpemUgU2l6ZV9wKTsKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMgRXBsT2JkdUNhbFJlYWRFbnRyeSh1bnNpZ25lZCBpbnQgdWlJbmRleF9wLAorCQkJCQkJICAgdW5zaWduZWQgaW50IHVpU3ViSW5kZXhfcCwKKwkJCQkJCSAgIHZvaWQgKnBEc3REYXRhX3AsCisJCQkJCQkgICB0RXBsT2JkU2l6ZSAqIHBTaXplX3ApOworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxPYmR1Q2FsQWNjZXNzT2RQYXJ0KHRFcGxPYmRQYXJ0IE9iZFBhcnRfcCwKKwkJCQkJCSAgICAgIHRFcGxPYmREaXIgRGlyZWN0aW9uX3ApOworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxPYmR1Q2FsRGVmaW5lVmFyKHRFcGxWYXJQYXJhbSBNRU0gKgorCQkJCQkJICAgcFZhclBhcmFtX3ApOworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VQTERMTEVYUE9SVCB2b2lkICpQVUJMSUMgRXBsT2JkdUNhbEdldE9iamVjdERhdGFQdHIodW5zaWduZWQgaW50IHVpSW5kZXhfcCwKKwkJCQkJCSAgICAgdW5zaWduZWQgaW50IHVpU3ViSW5kZXhfcCk7CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbE9iZHVDYWxSZWdpc3RlclVzZXJPZCh0RXBsT2JkRW50cnlQdHIKKwkJCQkJCQlwVXNlck9kX3ApOworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VQTERMTEVYUE9SVCB2b2lkIFBVQkxJQyBFcGxPYmR1Q2FsSW5pdFZhckVudHJ5KHRFcGxPYmRWYXJFbnRyeSBNRU0gKgorCQkJCQkJcFZhckVudHJ5X3AsIEJZVEUgYlR5cGVfcCwKKwkJCQkJCXRFcGxPYmRTaXplIE9iZFNpemVfcCk7CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHRFcGxPYmRTaXplIFBVQkxJQyBFcGxPYmR1Q2FsR2V0RGF0YVNpemUodW5zaWduZWQgaW50IHVpSW5kZXhfcCwKKwkJCQkJCSAgICAgIHVuc2lnbmVkIGludAorCQkJCQkJICAgICAgdWlTdWJJbmRleF9wKTsKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdW5zaWduZWQgaW50IFBVQkxJQyBFcGxPYmR1Q2FsR2V0Tm9kZUlkKHZvaWQpOworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxPYmR1Q2FsU2V0Tm9kZUlkKHVuc2lnbmVkIGludCB1aU5vZGVJZF9wLAorCQkJCQkJICAgdEVwbE9iZE5vZGVJZFR5cGUKKwkJCQkJCSAgIE5vZGVJZFR5cGVfcCk7CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbE9iZHVDYWxHZXRBY2Nlc3NUeXBlKHVuc2lnbmVkIGludCB1aUluZGV4X3AsCisJCQkJCQkgICAgICAgdW5zaWduZWQgaW50CisJCQkJCQkgICAgICAgdWlTdWJJbmRleF9wLAorCQkJCQkJICAgICAgIHRFcGxPYmRBY2Nlc3MgKgorCQkJCQkJICAgICAgIHBBY2Nlc3NUeXBfcCk7CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbE9iZHVDYWxSZWFkRW50cnlUb0xlKHVuc2lnbmVkIGludCB1aUluZGV4X3AsCisJCQkJCQkgICAgICAgdW5zaWduZWQgaW50CisJCQkJCQkgICAgICAgdWlTdWJJbmRleF9wLAorCQkJCQkJICAgICAgIHZvaWQgKnBEc3REYXRhX3AsCisJCQkJCQkgICAgICAgdEVwbE9iZFNpemUgKiBwU2l6ZV9wKTsKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMgRXBsT2JkdUNhbFdyaXRlRW50cnlGcm9tTGUodW5zaWduZWQgaW50CisJCQkJCQkJICB1aUluZGV4X3AsCisJCQkJCQkJICB1bnNpZ25lZCBpbnQKKwkJCQkJCQkgIHVpU3ViSW5kZXhfcCwKKwkJCQkJCQkgIHZvaWQgKnBTcmNEYXRhX3AsCisJCQkJCQkJICB0RXBsT2JkU2l6ZSBTaXplX3ApOworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQworRXBsT2JkdUNhbFNlYXJjaFZhckVudHJ5KEVQTF9NQ09fREVDTF9JTlNUQU5DRV9QVFJfIHVuc2lnbmVkIGludCB1aUluZGV4X3AsCisJCQkgdW5zaWduZWQgaW50IHVpU3ViaW5kZXhfcCwKKwkJCSB0RXBsT2JkVmFyRW50cnkgTUVNICoqIHBwVmFyRW50cnlfcCk7CisKKyNlbmRpZiAvLyAjaWZuZGVmIF9FUExPQkRVQ0FMX0hfCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL3VzZXIvRXBsUGRvdS5oIGIvZHJpdmVycy9zdGFnaW5nL2VwbC91c2VyL0VwbFBkb3UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMWRlNDg2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC91c2VyL0VwbFBkb3UuaApAQCAtMCwwICsxLDEwOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIGluY2x1ZGUgZmlsZSBmb3IgdXNlcnNwYWNlIFBETyBtb2R1bGUKKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgICAgICAgICRSQ1NmaWxlOiBFcGxQZG91LmgsdiAkCisKKyAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAorCisgICAgICAgICAgICAgICAgJFJldmlzaW9uOiAxLjUgJCAgJERhdGU6IDIwMDgvMTEvMTkgMTc6MTQ6MzggJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwNi8wNS8yMiBkLmsuOiAgIHN0YXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiwgdmVyc2lvbiAxLjAwCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX0VQTF9QRE9VX0hfCisjZGVmaW5lIF9FUExfUERPVV9IXworCisjaW5jbHVkZSAiLi4vRXBsUGRvLmgiCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gdHlwZWRlZgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgRXBsUGRvdUFkZEluc3RhbmNlKHZvaWQpOworCit0RXBsS2VybmVsIEVwbFBkb3VEZWxJbnN0YW5jZSh2b2lkKTsKKworI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfUERPVSkpICE9IDApCit0RXBsS2VybmVsIFBVQkxJQyBFcGxQZG91Q2JPYmRBY2Nlc3ModEVwbE9iZENiUGFyYW0gTUVNICogcFBhcmFtX3ApOworI2Vsc2UKKyNkZWZpbmUgRXBsUGRvdUNiT2JkQWNjZXNzCQlOVUxMCisjZW5kaWYKKworLy8gcmV0dXJucyBlcnJvciBpZiBiUGRvSWRfcCBpcyBhbHJlYWR5IHZhbGlkCisvKgordEVwbEtlcm5lbCBFcGxQZG91U2V0TWFwcGluZygKKyAgICBCWVRFIGJQZG9JZF9wLCBCT09MIGZUeFJ4X3AsIEJZVEUgYk5vZGVJZCwgQllURSBiTWFwcGluZ1ZlcnNpb24sCisgICAgdEVwbFBkb01hcHBpbmcgKiBwTWFwcGluZ19wLCBCWVRFIGJNYXhFbnRyaWVzX3ApOworCit0RXBsS2VybmVsIEVwbFBkb3VHZXRNYXBwaW5nKAorICAgIEJZVEUgYlBkb0lkX3AsIEJPT0wgZlR4UnhfcCwgQllURSAqIHBiTm9kZUlkLCBCWVRFICogcGJNYXBwaW5nVmVyc2lvbiwKKyAgICB0RXBsUGRvTWFwcGluZyAqIHBNYXBwaW5nX3AsIEJZVEUgKiBwYk1heEVudHJpZXNfcCk7CisqLworCisjZW5kaWYgLy8gI2lmbmRlZiBfRVBMX1BET1VfSF8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwvdXNlci9FcGxTZG9Bc25kdS5oIGIvZHJpdmVycy9zdGFnaW5nL2VwbC91c2VyL0VwbFNkb0FzbmR1LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTM0OTU5ZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvdXNlci9FcGxTZG9Bc25kdS5oCkBAIC0wLDAgKzEsMTA3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgb3BlblBPV0VSTElOSworCisgIERlc2NyaXB0aW9uOiAgaW5jbHVkZSBmaWxlIGZvciBTRE8vQXNuZC1Qcm90b2NvbGFic3RyYWN0aW9ubGF5ZXIgbW9kdWxlCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRXBsU2RvQXNuZHUuaCx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuNiAkICAkRGF0ZTogMjAwOC8xMC8xNyAxNTozMjozMiAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICAgICAgR0NDIFYzLjQKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUmV2aXNpb24gSGlzdG9yeToKKworICAyMDA2LzA3LzA3IGsudC46ICAgc3RhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICIuLi9FcGxTZG8uaCIKKyNpbmNsdWRlICIuLi9FcGxEbGwuaCIKKworI2lmbmRlZiBfRVBMU0RPQVNORFVfSF8KKyNkZWZpbmUgX0VQTFNET0FTTkRVX0hfCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gdHlwZWRlZgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1NET19BU05EKSkgIT0gMCkKKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsU2RvQXNuZHVJbml0KHRFcGxTZXF1TGF5ZXJSZWNlaXZlQ2IgZnBSZWNlaXZlQ2JfcCk7CisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbFNkb0FzbmR1QWRkSW5zdGFuY2UodEVwbFNlcXVMYXllclJlY2VpdmVDYiBmcFJlY2VpdmVDYl9wKTsKKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsU2RvQXNuZHVEZWxJbnN0YW5jZSh2b2lkKTsKKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsU2RvQXNuZHVJbml0Q29uKHRFcGxTZG9Db25IZGwgKiBwU2RvQ29uSGFuZGxlX3AsCisJCQkJICAgICB1bnNpZ25lZCBpbnQgdWlUYXJnZXROb2RlSWRfcCk7CisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbFNkb0FzbmR1U2VuZERhdGEodEVwbFNkb0NvbkhkbCBTZG9Db25IYW5kbGVfcCwKKwkJCQkgICAgICB0RXBsRnJhbWUgKiBwU3JjRGF0YV9wLAorCQkJCSAgICAgIERXT1JEIGR3RGF0YVNpemVfcCk7CisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbFNkb0FzbmR1RGVsQ29uKHRFcGxTZG9Db25IZGwgU2RvQ29uSGFuZGxlX3ApOworCisjZW5kaWYgLy8gZW5kIG9mICNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfU0RPX0FTTkQpKSAhPSAwKQorCisjZW5kaWYgLy8gI2lmbmRlZiBfRVBMU0RPQVNORFVfSF8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwvdXNlci9FcGxTZG9Bc3lTZXF1LmggYi9kcml2ZXJzL3N0YWdpbmcvZXBsL3VzZXIvRXBsU2RvQXN5U2VxdS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2NThiNWYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL3VzZXIvRXBsU2RvQXN5U2VxdS5oCkBAIC0wLDAgKzEsMTExIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgb3BlblBPV0VSTElOSworCisgIERlc2NyaXB0aW9uOiAgaW5jbHVkZSBmaWxlIGZvciBhc3ljaHJpb251cyBTRE8gU2VxdWVuY2UgTGF5ZXIgbW9kdWxlCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRXBsU2RvQXN5U2VxdS5oLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS40ICQgICREYXRlOiAyMDA4LzA0LzE3IDIxOjM2OjMyICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorICAgICAgICAgICAgICAgICAgICBHQ0MgVjMuNAorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgIDIwMDYvMDYvMjYgay50LjogICBzdGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIi4uL0VwbFNkby5oIgorI2luY2x1ZGUgIkVwbFNkb1VkcHUuaCIKKyNpbmNsdWRlICJFcGxTZG9Bc25kdS5oIgorI2luY2x1ZGUgIi4uL0VwbEV2ZW50LmgiCisjaW5jbHVkZSAiRXBsVGltZXJ1LmgiCisKKyNpZm5kZWYgX0VQTFNET0FTWVNFUVVfSF8KKyNkZWZpbmUgX0VQTFNET0FTWVNFUVVfSF8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvbnN0IGRlZmluZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyB0eXBlZGVmCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3RFcGxLZXJuZWwgUFVCTElDIEVwbFNkb0FzeVNlcUluaXQodEVwbFNkb0NvbVJlY2VpdmVDYiBmcFNkb0NvbUNiX3AsCisJCQkJICAgdEVwbFNkb0NvbUNvbkNiIGZwU2RvQ29tQ29uQ2JfcCk7CisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbFNkb0FzeVNlcUFkZEluc3RhbmNlKHRFcGxTZG9Db21SZWNlaXZlQ2IgZnBTZG9Db21DYl9wLAorCQkJCQkgIHRFcGxTZG9Db21Db25DYiBmcFNkb0NvbUNvbkNiX3ApOworCit0RXBsS2VybmVsIFBVQkxJQyBFcGxTZG9Bc3lTZXFEZWxJbnN0YW5jZSh2b2lkKTsKKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsU2RvQXN5U2VxSW5pdENvbih0RXBsU2RvU2VxQ29uSGRsICogcFNkb1NlcUNvbkhkbF9wLAorCQkJCSAgICAgIHVuc2lnbmVkIGludCB1aU5vZGVJZF9wLAorCQkJCSAgICAgIHRFcGxTZG9UeXBlIFNkb1R5cGUpOworCit0RXBsS2VybmVsIFBVQkxJQyBFcGxTZG9Bc3lTZXFTZW5kRGF0YSh0RXBsU2RvU2VxQ29uSGRsIFNkb1NlcUNvbkhkbF9wLAorCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgdWlEYXRhU2l6ZV9wLAorCQkJCSAgICAgICB0RXBsRnJhbWUgKiBwRGF0YV9wKTsKKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsU2RvQXN5U2VxUHJvY2Vzc0V2ZW50KHRFcGxFdmVudCAqIHBFdmVudF9wKTsKKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsU2RvQXN5U2VxRGVsQ29uKHRFcGxTZG9TZXFDb25IZGwgU2RvU2VxQ29uSGRsX3ApOworCisjZW5kaWYgLy8gI2lmbmRlZiBfRVBMU0RPQVNZU0VRVV9IXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC91c2VyL0VwbFNkb0NvbXUuaCBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvdXNlci9FcGxTZG9Db211LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2U0NTRjNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvdXNlci9FcGxTZG9Db211LmgKQEAgLTAsMCArMSwxMjYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBpbmNsdWRlIGZpbGUgZm9yIFNETyBDb21tYW5kIExheWVyIG1vZHVsZQorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgJFJDU2ZpbGU6IEVwbFNkb0NvbXUuaCx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuNSAkICAkRGF0ZTogMjAwOC8xMC8xNyAxNTozMjozMiAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICAgICAgR0NDIFYzLjQKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUmV2aXNpb24gSGlzdG9yeToKKworICAyMDA2LzA2LzI2IGsudC46ICAgc3RhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICIuLi9FcGxTZG8uaCIKKyNpbmNsdWRlICIuLi9FcGxPYmQuaCIKKyNpbmNsdWRlICIuLi9FcGxTZG9BYy5oIgorI2luY2x1ZGUgIkVwbE9iZHUuaCIKKyNpbmNsdWRlICJFcGxTZG9Bc3lTZXF1LmgiCisKKyNpZm5kZWYgX0VQTFNET0NPTVVfSF8KKyNkZWZpbmUgX0VQTFNET0NPTVVfSF8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvbnN0IGRlZmluZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyB0eXBlZGVmCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3RFcGxLZXJuZWwgUFVCTElDIEVwbFNkb0NvbUluaXQodm9pZCk7CisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbFNkb0NvbUFkZEluc3RhbmNlKHZvaWQpOworCit0RXBsS2VybmVsIFBVQkxJQyBFcGxTZG9Db21EZWxJbnN0YW5jZSh2b2lkKTsKKworI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9TRE9DKSkgIT0gMCkKKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsU2RvQ29tRGVmaW5lQ29uKHRFcGxTZG9Db21Db25IZGwgKiBwU2RvQ29tQ29uSGRsX3AsCisJCQkJICAgICB1bnNpZ25lZCBpbnQgdWlUYXJnZXROb2RlSWRfcCwKKwkJCQkgICAgIHRFcGxTZG9UeXBlIFByb3RUeXBlX3ApOworCit0RXBsS2VybmVsIFBVQkxJQyBFcGxTZG9Db21Jbml0VHJhbnNmZXJCeUluZGV4KHRFcGxTZG9Db21UcmFuc1BhcmFtQnlJbmRleCAqCisJCQkJCSAgICAgICBwU2RvQ29tVHJhbnNQYXJhbV9wKTsKKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsU2RvQ29tVW5kZWZpbmVDb24odEVwbFNkb0NvbUNvbkhkbCBTZG9Db21Db25IZGxfcCk7CisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbFNkb0NvbUdldFN0YXRlKHRFcGxTZG9Db21Db25IZGwgU2RvQ29tQ29uSGRsX3AsCisJCQkJICAgIHRFcGxTZG9Db21GaW5pc2hlZCAqIHBTZG9Db21GaW5pc2hlZF9wKTsKKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsU2RvQ29tU2RvQWJvcnQodEVwbFNkb0NvbUNvbkhkbCBTZG9Db21Db25IZGxfcCwKKwkJCQkgICAgRFdPUkQgZHdBYm9ydENvZGVfcCk7CisKKyNlbmRpZgorCisvLyBmb3IgZnV0dXJlIGV4dGVudGlvbgorLyoKK3RFcGxLZXJuZWwgUFVCTElDIEVwbFNkb0NvbUluaXRUcmFuc2ZlckFsbEJ5SW5kZXgodEVwbFNkb0NvbVRyYW5zUGFyYW1BbGxCeUluZGV4KiBwU2RvQ29tVHJhbnNQYXJhbV9wKTsKKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsU2RvQ29tSW5pdFRyYW5zZmVyQnlOYW1lKHRFcGxTZG9Db21UcmFuc1BhcmFtQnlOYW1lKiBwU2RvQ29tVHJhbnNQYXJhbV9wKTsKKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsU2RvQ29tSW5pdFRyYW5zZmVyRmlsZSh0RXBsU2RvQ29tVHJhbnNQYXJhbUZpbGUqIHBTZG9Db21UcmFuc1BhcmFtX3ApOworCisqLworCisjZW5kaWYgLy8gI2lmbmRlZiBfRVBMU0RPQ09NVV9IXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC91c2VyL0VwbFNkb1VkcHUuaCBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvdXNlci9FcGxTZG9VZHB1LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQ3N2I2ZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvdXNlci9FcGxTZG9VZHB1LmgKQEAgLTAsMCArMSwxMDkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBpbmNsdWRlIGZpbGUgZm9yIFNETy9VRFAtUHJvdG9jb2xsYWJzdHJhY3Rpb25sYXllciBtb2R1bGUKKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgICAgICAgICRSQ1NmaWxlOiBFcGxTZG9VZHB1LmgsdiAkCisKKyAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAorCisgICAgICAgICAgICAgICAgJFJldmlzaW9uOiAxLjUgJCAgJERhdGU6IDIwMDgvMTAvMTcgMTU6MzI6MzIgJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgICAgIEdDQyBWMy40CisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwNi8wNi8yNiBrLnQuOiAgIHN0YXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiLi4vRXBsU2RvLmgiCisKKyNpZm5kZWYgX0VQTFNET1VEUFVfSF8KKyNkZWZpbmUgX0VQTFNET1VEUFVfSF8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvbnN0IGRlZmluZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyB0eXBlZGVmCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfU0RPX1VEUCkpICE9IDApCisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbFNkb1VkcHVJbml0KHRFcGxTZXF1TGF5ZXJSZWNlaXZlQ2IgZnBSZWNlaXZlQ2JfcCk7CisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbFNkb1VkcHVBZGRJbnN0YW5jZSh0RXBsU2VxdUxheWVyUmVjZWl2ZUNiIGZwUmVjZWl2ZUNiX3ApOworCit0RXBsS2VybmVsIFBVQkxJQyBFcGxTZG9VZHB1RGVsSW5zdGFuY2Uodm9pZCk7CisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbFNkb1VkcHVDb25maWcodW5zaWduZWQgbG9uZyB1bElwQWRkcl9wLAorCQkJCSAgIHVuc2lnbmVkIGludCB1aVBvcnRfcCk7CisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbFNkb1VkcHVJbml0Q29uKHRFcGxTZG9Db25IZGwgKiBwU2RvQ29uSGFuZGxlX3AsCisJCQkJICAgIHVuc2lnbmVkIGludCB1aVRhcmdldE5vZGVJZF9wKTsKKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsU2RvVWRwdVNlbmREYXRhKHRFcGxTZG9Db25IZGwgU2RvQ29uSGFuZGxlX3AsCisJCQkJICAgICB0RXBsRnJhbWUgKiBwU3JjRGF0YV9wLAorCQkJCSAgICAgRFdPUkQgZHdEYXRhU2l6ZV9wKTsKKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsU2RvVWRwdURlbENvbih0RXBsU2RvQ29uSGRsIFNkb0NvbkhhbmRsZV9wKTsKKworI2VuZGlmIC8vIGVuZCBvZiAjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1NET19VRFApKSAhPSAwKQorCisjZW5kaWYgLy8gI2lmbmRlZiBfRVBMU0RPVURQVV9IXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC91c2VyL0VwbFN0YXR1c3UuaCBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvdXNlci9FcGxTdGF0dXN1LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDIxMTkzNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvdXNlci9FcGxTdGF0dXN1LmgKQEAgLTAsMCArMSwxMDQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBpbmNsdWRlIGZpbGUgZm9yIFN0YXR1c3UtTW9kdWxlCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRXBsU3RhdHVzdS5oLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS4zICQgICREYXRlOiAyMDA4LzA0LzE3IDIxOjM2OjMyICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorICAgICAgICAgICAgICAgICAgICBHQ0MgVjMuNAorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgIDIwMDYvMTEvMTUgZC5rLjogICBzdGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIi4uL0VwbERsbC5oIgorCisjaWZuZGVmIF9FUExTVEFUVVNVX0hfCisjZGVmaW5lIF9FUExTVEFUVVNVX0hfCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gdHlwZWRlZgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordHlwZWRlZiB0RXBsS2VybmVsKFBVQkxJQyAqIHRFcGxTdGF0dXN1Q2JSZXNwb25zZSkgKHVuc2lnbmVkIGludCB1aU5vZGVJZF9wLAorCQkJCQkJICAgIHRFcGxTdGF0dXNSZXNwb25zZSAqCisJCQkJCQkgICAgcFN0YXR1c1Jlc3BvbnNlX3ApOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsU3RhdHVzdUluaXQodm9pZCk7CisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbFN0YXR1c3VBZGRJbnN0YW5jZSh2b2lkKTsKKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsU3RhdHVzdURlbEluc3RhbmNlKHZvaWQpOworCit0RXBsS2VybmVsIFBVQkxJQyBFcGxTdGF0dXN1UmVzZXQodm9pZCk7CisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbFN0YXR1c3VSZXF1ZXN0U3RhdHVzUmVzcG9uc2UodW5zaWduZWQgaW50IHVpTm9kZUlkX3AsCisJCQkJCQkgIHRFcGxTdGF0dXN1Q2JSZXNwb25zZQorCQkJCQkJICBwZm5DYlJlc3BvbnNlX3ApOworCisjZW5kaWYgLy8gI2lmbmRlZiBfRVBMU1RBVFVTVV9IXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC91c2VyL0VwbFRpbWVydS5oIGIvZHJpdmVycy9zdGFnaW5nL2VwbC91c2VyL0VwbFRpbWVydS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwNDQ5NTUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL3VzZXIvRXBsVGltZXJ1LmgKQEAgLTAsMCArMSwxMDcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBpbmNsdWRlIGZpbGUgZm9yIEVwbCBVc2Vyc3BhY2UtVGltZXJtb2R1bGUKKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgICAgICAgICRSQ1NmaWxlOiBFcGxUaW1lcnUuaCx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuNSAkICAkRGF0ZTogMjAwOC8wNC8xNyAyMTozNjozMiAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICAgICAgR0NDIFYzLjQKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUmV2aXNpb24gSGlzdG9yeToKKworICAyMDA2LzA3LzA2IGsudC46ICAgc3RhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICIuLi9FcGxUaW1lci5oIgorI2luY2x1ZGUgIkVwbEV2ZW50dS5oIgorCisjaWZuZGVmIF9FUExUSU1FUlVfSF8KKyNkZWZpbmUgX0VQTFRJTUVSVV9IXworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHR5cGVkZWYKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIFBVQkxJQyBFcGxUaW1lcnVJbml0KHZvaWQpOworCit0RXBsS2VybmVsIFBVQkxJQyBFcGxUaW1lcnVBZGRJbnN0YW5jZSh2b2lkKTsKKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsVGltZXJ1RGVsSW5zdGFuY2Uodm9pZCk7CisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbFRpbWVydVNldFRpbWVyTXModEVwbFRpbWVySGRsICogcFRpbWVySGRsX3AsCisJCQkJICAgICAgdW5zaWduZWQgbG9uZyB1bFRpbWVfcCwKKwkJCQkgICAgICB0RXBsVGltZXJBcmcgQXJndW1lbnRfcCk7CisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbFRpbWVydU1vZGlmeVRpbWVyTXModEVwbFRpbWVySGRsICogcFRpbWVySGRsX3AsCisJCQkJCSB1bnNpZ25lZCBsb25nIHVsVGltZV9wLAorCQkJCQkgdEVwbFRpbWVyQXJnIEFyZ3VtZW50X3ApOworCit0RXBsS2VybmVsIFBVQkxJQyBFcGxUaW1lcnVEZWxldGVUaW1lcih0RXBsVGltZXJIZGwgKiBwVGltZXJIZGxfcCk7CisKK0JPT0wgUFVCTElDIEVwbFRpbWVydUlzVGltZXJBY3RpdmUodEVwbFRpbWVySGRsIFRpbWVySGRsX3ApOworCisjZW5kaWYgLy8gI2lmbmRlZiBfRVBMVElNRVJVX0hfCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXQxMzF4L2V0MTMxMF90eC5jIGIvZHJpdmVycy9zdGFnaW5nL2V0MTMxeC9ldDEzMTBfdHguYwppbmRleCBhOTVjMjYwLi4zMGVhYWM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZXQxMzF4L2V0MTMxMF90eC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ldDEzMXgvZXQxMzEwX3R4LmMKQEAgLTEzNDUsNyArMTM0NSw2IEBACiB7CiAJUE1QX1RDQiBwTXBUY2I7CiAJc3RydWN0IGxpc3RfaGVhZCAqcEVudHJ5OwotCXN0cnVjdCBza19idWZmICpwUGFja2V0ID0gTlVMTDsKIAl1bnNpZ25lZCBsb25nIGxvY2tmbGFnczsKIAl1aW50MzJfdCBGcmVlQ291bnRlciA9IDA7CiAKQEAgLTEzNTgsOCArMTM1Nyw2IEBACiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBBZGFwdGVyLT5TZW5kV2FpdExvY2ssIGxvY2tmbGFncyk7CiAKIAkJcEVudHJ5ID0gcEFkYXB0ZXItPlR4UmluZy5TZW5kV2FpdFF1ZXVlLm5leHQ7Ci0KLQkJcFBhY2tldCA9IE5VTEw7CiAJfQogCiAJcEFkYXB0ZXItPlR4UmluZy5uV2FpdFNlbmQgPSAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2V0MTMxeC9ldDEzMXhfZGVidWcuaCBiL2RyaXZlcnMvc3RhZ2luZy9ldDEzMXgvZXQxMzF4X2RlYnVnLmgKaW5kZXggZGFiNjA4MC4uOTk0MTA4ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2V0MTMxeC9ldDEzMXhfZGVidWcuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXQxMzF4L2V0MTMxeF9kZWJ1Zy5oCkBAIC04MiwxMSArODIsMTEgQEAKICNkZWZpbmUgREJHX0xWTAkzCiAjZW5kaWYgLyogREJHX0xWTCAqLwogCi0jZGVmaW5lIERCR19ERUZBVUxUUwkJKERCR19FUlJPUl9PTiB8IERCR19XQVJOSU5HX09OIHwgREJHX0JSRUFLX09OICkKKyNkZWZpbmUgREJHX0RFRkFVTFRTCQkoREJHX0VSUk9SX09OIHwgREJHX1dBUk5JTkdfT04gfCBEQkdfQlJFQUtfT04pCiAKLSNkZWZpbmUgREJHX0ZMQUdTKEEpCQkoQSktPmRiZ0ZsYWdzCi0jZGVmaW5lIERCR19OQU1FKEEpCQkoQSktPmRiZ05hbWUKLSNkZWZpbmUgREJHX0xFVkVMKEEpCQkoQSktPmRiZ0xldmVsCisjZGVmaW5lIERCR19GTEFHUyhBKQkJKChBKS0+ZGJnRmxhZ3MpCisjZGVmaW5lIERCR19OQU1FKEEpCQkoKEEpLT5kYmdOYW1lKQorI2RlZmluZSBEQkdfTEVWRUwoQSkJCSgoQSktPmRiZ0xldmVsKQogCiAjaWZuZGVmIERCR19QUklOVAogI2RlZmluZSBEQkdfUFJJTlQoUy4uLikJCXByaW50ayhLRVJOX0RFQlVHIFMpCkBAIC0xMDgsNTYgKzEwOCwxMTAgQEAKICNkZWZpbmUgX0RCR19MRUFWRShBKQlwcmludGsoS0VSTl9ERUJVRyAiJXM6JS4qczolc1xuIiwgREJHX05BTUUoQSksCVwKIAkJCQlEQkdfTEVWRUwoQSktLSwgX0xFQVZFX1NUUiwgX19mdW5jX18pCiAKLSNkZWZpbmUgREJHX0VOVEVSKEEpICAgICAgICB7aWYgKERCR19GTEFHUyhBKSAmIERCR19UUkFDRV9PTikgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfREJHX0VOVEVSKEEpO30KKyNkZWZpbmUgREJHX0VOVEVSKEEpCQkJCQkJCVwKKwlkbyB7CQkJCQkJCQlcCisJCWlmIChEQkdfRkxBR1MoQSkgJiBEQkdfVFJBQ0VfT04pCQkJXAorCQkJX0RCR19FTlRFUihBKTsJCQkJCVwKKwl9IHdoaWxlICgwKQogCi0jZGVmaW5lIERCR19MRUFWRShBKSAgICAgICAge2lmIChEQkdfRkxBR1MoQSkgJiBEQkdfVFJBQ0VfT04pIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0RCR19MRUFWRShBKTt9CisjZGVmaW5lIERCR19MRUFWRShBKQkJCQkJCQlcCisJZG8gewkJCQkJCQkJXAorCQlpZiAoREJHX0ZMQUdTKEEpICYgREJHX1RSQUNFX09OKQkJCVwKKwkJCV9EQkdfTEVBVkUoQSk7CQkJCQlcCisJfSB3aGlsZSAoMCkKIAotI2RlZmluZSBEQkdfUEFSQU0oQSxOLEYsUy4uLikgICB7aWYgKERCR19GTEFHUyhBKSAmIERCR19QQVJBTV9PTikgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJHX1BSSU5UKCIgICVzIC0tICJGIlxuIixOLFMpO30KKyNkZWZpbmUgREJHX1BBUkFNKEEsIE4sIEYsIFMuLi4pCQkJCQlcCisJZG8gewkJCQkJCQkJXAorCQlpZiAoREJHX0ZMQUdTKEEpICYgREJHX1BBUkFNX09OKQkJCVwKKwkJCURCR19QUklOVCgiICAlcyAtLSAiRiIgIiwgTiwgUyk7CQlcCisJfSB3aGlsZSAoMCkKIAotI2RlZmluZSBEQkdfRVJST1IoQSxTLi4uKQlcCi0JaWYgKERCR19GTEFHUyhBKSAmIERCR19FUlJPUl9PTikgewkJCQlcCi0JCURCR19QUklOVCgiJXM6RVJST1I6JXMgIixEQkdfTkFNRShBKSwgX19mdW5jX18pOwlcCi0JCURCR19QUklOVEMoUyk7CQkJCQkJXAotCQlEQkdfVFJBUDsJCQkJCQlcCi0JfQorI2RlZmluZSBEQkdfRVJST1IoQSwgUy4uLikJCQkJCQkgXAorCWRvIHsJCQkJCQkJCSBcCisJCWlmIChEQkdfRkxBR1MoQSkgJiBEQkdfRVJST1JfT04pIHsJCQkgXAorCQkJREJHX1BSSU5UKCIlczpFUlJPUjolcyAiLCBEQkdfTkFNRShBKSwgX19mdW5jX18pO1wKKwkJCURCR19QUklOVEMoUyk7CQkJCQkgXAorCQkJREJHX1RSQVA7CQkJCQkgXAorCQl9CQkJCQkJCSBcCisJfSB3aGlsZSAoMCkKIAotI2RlZmluZSBEQkdfV0FSTklORyhBLFMuLi4pIHtpZiAoREJHX0ZMQUdTKEEpICYgREJHX1dBUk5JTkdfT04pIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge0RCR19QUklOVCgiJXM6V0FSTklORzolcyAiLERCR19OQU1FKEEpLF9fZnVuY19fKTtEQkdfUFJJTlRDKFMpO319CisjZGVmaW5lIERCR19XQVJOSU5HKEEsIFMuLi4pCQkJCQkJICAgIFwKKwlkbyB7CQkJCQkJCQkgICAgXAorCQlpZiAoREJHX0ZMQUdTKEEpICYgREJHX1dBUk5JTkdfT04pIHsJCQkgICAgXAorCQkJREJHX1BSSU5UKCIlczpXQVJOSU5HOiVzICIsIERCR19OQU1FKEEpLCBfX2Z1bmNfXyk7IFwKKwkJCURCR19QUklOVEMoUyk7CQkJCQkgICAgXAorCQl9CQkJCQkJCSAgICBcCisJfSB3aGlsZSAoMCkKIAotI2RlZmluZSBEQkdfTk9USUNFKEEsUy4uLikgIHtpZiAoREJHX0ZMQUdTKEEpICYgREJHX05PVElDRV9PTikgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7REJHX1BSSU5UKCIlczpOT1RJQ0U6JXMgIixEQkdfTkFNRShBKSxfX2Z1bmNfXyk7REJHX1BSSU5UQyhTKTt9fQorI2RlZmluZSBEQkdfTk9USUNFKEEsIFMuLi4pCQkJCQkJICAgXAorCWRvIHsJCQkJCQkJCSAgIFwKKwkJaWYgKERCR19GTEFHUyhBKSAmIERCR19OT1RJQ0VfT04pIHsJCQkgICBcCisJCQlEQkdfUFJJTlQoIiVzOk5PVElDRTolcyAiLCBEQkdfTkFNRShBKSwgX19mdW5jX18pOyBcCisJCQlEQkdfUFJJTlRDKFMpOwkJCQkJICAgXAorCQl9CQkJCQkJCSAgIFwKKwl9IHdoaWxlICgwKQogCi0jZGVmaW5lIERCR19UUkFDRShBLFMuLi4pICAge2lmIChEQkdfRkxBR1MoQSkgJiBEQkdfVFJBQ0VfT04pIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge0RCR19QUklOVCgiJXM6VFJBQ0U6JXMgIixEQkdfTkFNRShBKSwgX19mdW5jX18pO0RCR19QUklOVEMoUyk7fX0KKyNkZWZpbmUgREJHX1RSQUNFKEEsIFMuLi4pCQkJCQkJICBcCisJZG8gewkJCQkJCQkJICBcCisJCWlmIChEQkdfRkxBR1MoQSkgJiBEQkdfVFJBQ0VfT04pIHsJCQkgIFwKKwkJCURCR19QUklOVCgiJXM6VFJBQ0U6JXMgIiwgREJHX05BTUUoQSksIF9fZnVuY19fKTsgXAorCQkJREJHX1BSSU5UQyhTKTsJCQkJCSAgXAorCQl9CQkJCQkJCSAgXAorCX0gd2hpbGUgKDApCiAKLSNkZWZpbmUgREJHX1ZFUkJPU0UoQSxTLi4uKSB7aWYgKERCR19GTEFHUyhBKSAmIERCR19WRVJCT1NFX09OKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtEQkdfUFJJTlQoIiVzOlZFUkJPU0U6JXMgIixEQkdfTkFNRShBKSwgX19mdW5jX18pO0RCR19QUklOVEMoUyk7fX0KKyNkZWZpbmUgREJHX1ZFUkJPU0UoQSwgUy4uLikJCQkJCQkgICAgXAorCWRvIHsJCQkJCQkJCSAgICBcCisJCWlmIChEQkdfRkxBR1MoQSkgJiBEQkdfVkVSQk9TRV9PTikgewkJCSAgICBcCisJCQlEQkdfUFJJTlQoIiVzOlZFUkJPU0U6JXMgIiwgREJHX05BTUUoQSksIF9fZnVuY19fKTsgXAorCQkJREJHX1BSSU5UQyhTKTsJCQkJCSAgICBcCisJCX0JCQkJCQkJICAgIFwKKwl9IHdoaWxlICgwKQogCi0jZGVmaW5lIERCR19SWChBLFMuLi4pICAgICAge2lmIChEQkdfRkxBR1MoQSkgJiBEQkdfUlhfT04pIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge0RCR19QUklOVChTKTt9fQorI2RlZmluZSBEQkdfUlgoQSwgUy4uLikJCQkJXAorCWRvIHsJCQkJCVwKKwkJaWYgKERCR19GTEFHUyhBKSAmIERCR19SWF9PTikJXAorCQkJREJHX1BSSU5UKFMpOwkJXAorCX0gd2hpbGUgKDApCiAKLSNkZWZpbmUgREJHX1JYX0VOVEVSKEEpICAgICB7aWYgKERCR19GTEFHUyhBKSAmIERCR19SWF9PTikgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfREJHX0VOVEVSKEEpO30KKyNkZWZpbmUgREJHX1JYX0VOVEVSKEEpCQkJCVwKKwlkbyB7CQkJCQlcCisJCWlmIChEQkdfRkxBR1MoQSkgJiBEQkdfUlhfT04pCVwKKwkJCV9EQkdfRU5URVIoQSk7CQlcCisJfSB3aGlsZSAoMCkKIAotI2RlZmluZSBEQkdfUlhfTEVBVkUoQSkgICAgIHtpZiAoREJHX0ZMQUdTKEEpICYgREJHX1JYX09OKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9EQkdfTEVBVkUoQSk7fQorI2RlZmluZSBEQkdfUlhfTEVBVkUoQSkJCQkJXAorCWRvIHsJCQkJCVwKKwkJaWYgKERCR19GTEFHUyhBKSAmIERCR19SWF9PTikJXAorCQkJX0RCR19MRUFWRShBKTsJCVwKKwl9IHdoaWxlICgwKQogCi0jZGVmaW5lIERCR19UWChBLFMuLi4pICAgICAge2lmIChEQkdfRkxBR1MoQSkgJiBEQkdfVFhfT04pIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge0RCR19QUklOVChTKTt9fQorI2RlZmluZSBEQkdfVFgoQSwgUy4uLikJCQkJXAorCWRvIHsJCQkJCVwKKwkJaWYgKERCR19GTEFHUyhBKSAmIERCR19UWF9PTikJXAorCQkJREJHX1BSSU5UKFMpOwkJXAorCX0gd2hpbGUgKDApCiAKLSNkZWZpbmUgREJHX1RYX0VOVEVSKEEpICAgICB7aWYgKERCR19GTEFHUyhBKSAmIERCR19UWF9PTikgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfREJHX0VOVEVSKEEpO30KKyNkZWZpbmUgREJHX1RYX0VOVEVSKEEpCQkJCVwKKwlkbyB7CQkJCQlcCisJCWlmIChEQkdfRkxBR1MoQSkgJiBEQkdfVFhfT04pCVwKKwkJCV9EQkdfRU5URVIoQSk7CQlcCisJfSB3aGlsZSAoMCkKIAotI2RlZmluZSBEQkdfVFhfTEVBVkUoQSkgICAgIHtpZiAoREJHX0ZMQUdTKEEpICYgREJHX1RYX09OKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9EQkdfTEVBVkUoQSk7fQorI2RlZmluZSBEQkdfVFhfTEVBVkUoQSkJCQkJXAorCWRvIHsJCQkJCVwKKwkJaWYgKERCR19GTEFHUyhBKSAmIERCR19UWF9PTikJXAorCQkJX0RCR19MRUFWRShBKTsJCVwKKwl9IHdoaWxlICgwKQogCi0jZGVmaW5lIERCR19BU1NFUlQoQykgICAgICAge2lmICghKEMpKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtEQkdfUFJJTlQoIkFTU0VSVCglcykgLS0gJXMjJWQgKCVzKVxuIiwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI0MsX19GSUxFX18sX19MSU5FX18sX19mdW5jX18pOyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCR19UUkFQO319CisjZGVmaW5lIERCR19BU1NFUlQoQykJCQkJCQlcCisJZG8gewkJCQkJCQlcCisJCWlmICghKEMpKSB7CQkJCQlcCisJCQlEQkdfUFJJTlQoIkFTU0VSVCglcykgLS0gJXMjJWQgKCVzKSAiLCAgXAorCQkJICAgICAjQywgX19GSUxFX18sIF9fTElORV9fLCBfX2Z1bmNfXyk7IFwKKwkJCURCR19UUkFQOwkJCQlcCisJCX0JCQkJCQlcCisJfSB3aGlsZSAoMCkKKwogI2RlZmluZSBTVEFUSUMKIAogdHlwZWRlZiBzdHJ1Y3QgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2Zyb250aWVyL0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvZnJvbnRpZXIvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTIxODUzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2Zyb250aWVyL0tjb25maWcKQEAgLTAsMCArMSw2IEBACitjb25maWcgVFJBTlpQT1JUCisJdHJpc3RhdGUgIkZyb250aWVyIFRyYW56cG9ydCBhbmQgQWxwaGF0cmFjayBzdXBwb3J0IgorCWRlcGVuZHMgb24gVVNCCisJZGVmYXVsdCBOCisJLS0taGVscC0tLQorCSAgRW5hYmxlIHN1cHBvcnQgZm9yIHRoZSBGcm9udGllciBUcmFuenBvcnQgYW5kIEFscGhhdHJhY2sgZGV2aWNlcy4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9mcm9udGllci9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy9mcm9udGllci9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDJhYzk3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2Zyb250aWVyL01ha2VmaWxlCkBAIC0wLDAgKzEsMiBAQAorb2JqLSQoQ09ORklHX1RSQU5aUE9SVCkJCSs9IHRyYW56cG9ydC5vCitvYmotJChDT05GSUdfVFJBTlpQT1JUKQkJKz0gYWxwaGF0cmFjay5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZnJvbnRpZXIvUkVBRE1FIGIvZHJpdmVycy9zdGFnaW5nL2Zyb250aWVyL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2M5ZWY5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2Zyb250aWVyL1JFQURNRQpAQCAtMCwwICsxLDI4IEBACitUaGlzIGRpcmVjdG9yeSBjb250YWlucyB0aGUgVVNCIFRyYW56cG9ydCBhbmQgQWxwaGF0cmFjayBLZXJuZWwgZHJpdmVycyBmb3IgTGludXguCisKK0F0IHByZXNlbnQgdGhlIHRyYW56cG9ydCBkb2VzIHJlYWRzL3dyaXRlcyBvZiA4IGJ5dGUgY21kcyB0byAvZGV2L3RyYW56cG9ydDAgdG8gY29udHJvbAordGhlIGxpZ2h0cyBhbmQgc2NyZWVuIGFuZCB3aGVlbAorCitBdCBwcmVzZW50IHRoZSBhbHBoYXRyYWNrIGFjY2VwdHMgcmVhZHMvd3JpdGVzIG9mIDEyIGJ5dGUgY21kcyB0byAvZGV2L3RyYW56cG9ydDAgdG8gY29udHJvbAordGhlIGxpZ2h0cyBhbmQgc2NyZWVuIGFuZCBmYWRlci4KKworQm90aCBkcml2ZXJzIGFsc28gaGF2ZSBzb21lIHN5c2ZzIGhvb2tzIHRoYXQgYXJlIG5vbi1mdW5jdGlvbmFsIGF0IHRoZSBtb21lbnQuCisKK1RoZSBBUEkgaXMgY3VycmVudGx5IGNsb3NlbHkgdGllZCB0byB0aGUgYXJkb3VyIHJldmlzaW9uIGFuZCBXSUxMIGNoYW5nZS4KKworQSBzeXNmcyBpbnRlcmZhY2UgaXMgUEVSRkVDVCBmb3Igc2ltcGxlIHVzZXJzcGFjZSBhcHBzIHRvIGRvIGZ1biB0aGluZ3Mgd2l0aCB0aGUKK2xpZ2h0cyBhbmQgc2NyZWVuLiBJdCdzIGZhaXJseSBsb3VzeSBmb3IgaGFuZGxpbmcgaW5wdXQgZXZlbnRzIGFuZCB2ZXJ5IGxvdXN5Citmb3Igd2F0Y2hpbmcgdGhlIHN0YXRlIG9mIHRoZSBzaHV0dGxlIHdoZWVsLgorCitBIGxpbnV4IGlucHV0IGV2ZW50cyBpbnRlcmZhY2UgaXMgZ3JlYXQgZm9yIHRoZSBpbnB1dCBldmVudHMgYW5kIHNodXR0bGUgd2hlZWwuIEl0J3MKK3RoZW9yZXRpY2FsbHkgT0sgb24gTEVEcy4gQSBGYWRlciBjYW4gYmUgbWFwcGVkIHRvIGFuIGFic29sdXRlIG1vdXNlIGRldmljZS4KK0J1dCB0aGVyZSBpcyBubyBMQ0Qgc3VwcG9ydCBhdCBhbGwuCisKK0luIHRoZSBlbmQgdGhpcyBpcyBnb2luZyB0byBiZSBkcml2ZW4gYnkgYSBtaWRpIGxheWVyLCB3aGljaCBoYW5kbGVzIGFsbCB0aG9zZQorY2FzZXMgdmlhIGEgZGVmaW5lZCBBUEksIGJ1dCAtIGFtb25nIG90aGVyIHRoaW5ncyAtIGlzIHNsb3csIGRvZXNuJ3QgZG8KK2Zsb3cgY29udHJvbCwgYW5kIGlzIGEgTE9UIG9mIGV4dHJhIHdvcmsuIEZyYW5rbHksIEknZCBsaWtlIHRvIGtlZXAgdGhlCitjb3JlIGRyaXZlciBzaW1wbGUgYmVjYXVzZSB0aGUgb25seSByZWFsdGltZSB3b3JrIHJlYWxseSByZXF1aXJlZCBpcwordGhlIGJvdHRvbSBoYWxmIGludGVycnVwdCBoYW5kbGVyIGFuZCB0aGUgb3V0cHV0IG92ZXJsYXBwaW5nLgorCitFeHBvc2luZyBzb21lIHNvcnQgb2YgY2xlYW4gYWlvIGFwaSB0byB1c2Vyc3BhY2Ugd291bGQgYmUgcGVyZmVjdC4gV2hhdCB0aGF0CitBUEkgbG9va3MgbGlrZT8gR2FoLiBiZWF0cyBtZS4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9mcm9udGllci9UT0RPIGIvZHJpdmVycy9zdGFnaW5nL2Zyb250aWVyL1RPRE8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzYyMGFkMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9mcm9udGllci9UT0RPCkBAIC0wLDAgKzEsOSBAQAorVE9ETzoKKwktIGNoZWNrcGF0Y2gucGwgY2xlYW4KKwktIHNwYXJzZSBjbGVhbgorCS0gZml4IHVzZXJzcGFjZSBpbnRlcmZhY2UgdG8gYmUgc2FuZQorCS0gcG9zc2libHkganVzdCBwb3J0IHRvIHVzZXJzcGFjZSB3aXRoIGxpYnVzYgorCS0gcmV2aWV3IGJ5IHRoZSBVU0IgZGV2ZWxvcGVyIGNvbW11bml0eQorCitQbGVhc2Ugc2VuZCBhbnkgcGF0Y2hlcyBmb3IgdGhpcyBkcml2ZXIgdG8gR3JlZyBLcm9haC1IYXJ0bWFuIDxncmVnQGtyb2FoLmNvbT4KK2FuZCBEYXZpZCBUYWh0IDxkQHRla2xpYnJlLmNvbT4uCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZnJvbnRpZXIvYWxwaGF0cmFjay5jIGIvZHJpdmVycy9zdGFnaW5nL2Zyb250aWVyL2FscGhhdHJhY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTM2ZTNmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2Zyb250aWVyL2FscGhhdHJhY2suYwpAQCAtMCwwICsxLDg1MyBAQAorLyoKKyAqIEZyb250aWVyIERlc2lnbnMgQWxwaGF0cmFjayBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWljaGFlbCBUYWh0IChtQHRhaHQubmV0KQorICoKKyAqIEJhc2VkIG9uIHRoZSB1c2JsZWQgZHJpdmVyIGFuZCBsZHVzYiBkcml2ZXJzIGJ5CisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0IEdyZWcgS3JvYWgtSGFydG1hbiAoZ3JlZ0Brcm9haC5jb20pCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgTWljaGFlbCBIdW5kIDxtaHVuZEBsZC1kaWRhY3RpYy5kZT4KKyAqCisgKiBUaGUgbGR1c2IgZHJpdmVyIHdhcywgaW4gdHVybiwgZGVyaXZlZCBmcm9tIExlZ28gVVNCIFRvd2VyIGRyaXZlcgorICogQ29weXJpZ2h0IChDKSAyMDAzIERhdmlkIEdsYW5jZSA8YWR2aWRnc2ZAc291cmNlZm9yZ2UubmV0PgorICoJCSAyMDAxLTIwMDQgSnVlcmdlbiBTdHViZXIgPHN0YXJibHVlQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICoJcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHZlcnNpb24gMi4KKyAqCisgKi8KKworLyoqCisgKiBUaGlzIGRyaXZlciB1c2VzIGEgcmluZyBidWZmZXIgZm9yIHRpbWUgY3JpdGljYWwgcmVhZGluZyBvZgorICogaW50ZXJydXB0IGluIHJlcG9ydHMgYW5kIHByb3ZpZGVzIHJlYWQgYW5kIHdyaXRlIG1ldGhvZHMgZm9yCisgKiByYXcgaW50ZXJydXB0IHJlcG9ydHMuCisgKi8KKworLyogTm90ZTogdGhpcyBjdXJyZW50bHkgdXNlcyBhIGR1bWIgcmluZ2J1ZmZlciBmb3IgcmVhZHMgYW5kIHdyaXRlcy4KKyAqIEEgbW9yZSBvcHRpbWFsIGRyaXZlciB3b3VsZCBjYWNoZSBhbmQga2lsbCBvZmYgb3V0c3RhbmRpbmcgdXJicyB0aGF0IGFyZQorICogbm93IGludmFsaWQsIGFuZCBpZ25vcmUgb25lcyB0aGF0IGFscmVhZHkgd2VyZSBpbiB0aGUgcXVldWUgYnV0IHZhbGlkCisgKiBhcyB3ZSBvbmx5IGhhdmUgMzAgY29tbWFuZHMgZm9yIHRoZSBhbHBoYXRyYWNrLiBJbiBwYXJ0aWN1bGFyIHRoaXMgaXMKKyAqIGtleSBmb3IgZ2V0dGluZyBsaWdodHMgdG8gZmxhc2ggaW4gdGltZSBhcyBvdGhlcndpc2UgbWFueSBjb21tYW5kcworICogY2FuIGJlIGJ1ZmZlcmVkIHVwIGJlZm9yZSB0aGUgbGlnaHQgY2hhbmdlIG1ha2VzIGl0IHRvIHRoZSBpbnRlcmZhY2UuCisqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tvYmplY3QuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KKyNpbmNsdWRlIDxsaW51eC91c2IuaD4KKyNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CisKKyNpbmNsdWRlICJzdXJmYWNlX3N5c2ZzLmgiCisKKy8qIG1ha2UgdGhpcyB3b3JrIG9uIG9sZGVyIGtlcm5lbCB2ZXJzaW9ucyAqLworCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiwgNiwgMTkpCisjaW5jbHVkZSAiZnJvbnRpZXJfY29tcGF0LmgiCisjZW5kaWYgLyogb2xkZXIga2VybmVsIHZlcnNpb25zICovCisKKyNpbmNsdWRlICJhbHBoYXRyYWNrLmgiCisKKyNkZWZpbmUgVkVORE9SX0lECTB4MTY1YgorI2RlZmluZSBQUk9EVUNUX0lECTB4ZmFkMQorCisjaWZkZWYgQ09ORklHX1VTQl9EWU5BTUlDX01JTk9SUworI2RlZmluZSBVU0JfQUxQSEFUUkFDS19NSU5PUl9CQVNFCTAKKyNlbHNlCisvLyBGSVhNRSAxNzYgLSBpcyBhbm90aGVyIGRyaXZlcidzIG1pbm9yIC0gYXBwbHkgZm9yIHRoYXQKKy8vICNkZWZpbmUgVVNCX0FMUEhBVFJBQ0tfTUlOT1JfQkFTRQkxNzcKKyNkZWZpbmUgVVNCX0FMUEhBVFJBQ0tfTUlOT1JfQkFTRQkxNzYKKyNlbmRpZgorCisvKiB0YWJsZSBvZiBkZXZpY2VzIHRoYXQgd29yayB3aXRoIHRoaXMgZHJpdmVyICovCitzdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgdXNiX2FscGhhdHJhY2tfdGFibGUgW10gPSB7CisJeyBVU0JfREVWSUNFKFZFTkRPUl9JRCwgUFJPRFVDVF9JRCkgfSwKKwl7IH0JCQkJCS8qIFRlcm1pbmF0aW5nIGVudHJ5ICovCit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHVzYiwgdXNiX2FscGhhdHJhY2tfdGFibGUpOworTU9EVUxFX1ZFUlNJT04oIjAuNDAiKTsKK01PRFVMRV9BVVRIT1IoIk1pa2UgVGFodCA8bUB0YWh0Lm5ldD4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQWxwaGF0cmFjayBVU0IgRHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfU1VQUE9SVEVEX0RFVklDRSgiRnJvbnRpZXIgRGVzaWducyBBbHBoYXRyYWNrIENvbnRyb2wgU3VyZmFjZSIpOworCisvKiBUaGVzZSBhcmVuJ3QgZG9uZSB5ZXQgKi8KKworI2RlZmluZSBTVVBQUkVTU19FWFRSQV9PTkxJTkVfRVZFTlRTIDAKKyNkZWZpbmUgQlVGRkVSRURfV1JJVEVTIDAKKyNkZWZpbmUgU1VQUFJFU1NfRVhUUkFfT0ZGTElORV9FVkVOVFMgMAorI2RlZmluZSBDT01QUkVTU19GQURFUl9FVkVOVFMgMAorCisjZGVmaW5lIEJVRkZFUkVEX1JFQURTIDEKKyNkZWZpbmUgUklOR19CVUZGRVJfU0laRSA1MTIKKyNkZWZpbmUgV1JJVEVfQlVGRkVSX1NJWkUgMzQKKyNkZWZpbmUgQUxQSEFUUkFDS19VU0JfVElNRU9VVCAxMAorI2RlZmluZSBPVVRQVVRfQ01EX1NJWkUgOAorI2RlZmluZSBJTlBVVF9DTURfU0laRSAxMgorCisKK3N0YXRpYyBpbnQgZGVidWcgPSAwOworCisvKiBVc2Ugb3VyIG93biBkYmcgbWFjcm8gKi8KKyNkZWZpbmUgZGJnX2luZm8oZGV2LCBmb3JtYXQsIGFyZy4uLikgZG8geyBpZiAoZGVidWcpIGRldl9pbmZvKGRldiAsIGZvcm1hdCAsICMjIGFyZyk7IH0gd2hpbGUgKDApCisKKyNkZWZpbmUgYWxwaGF0cmFja19vY21kX2luZm8oZGV2LCBjbWQsIGZvcm1hdCwgYXJnLi4uKQorCisjZGVmaW5lIGFscGhhdHJhY2tfaWNtZF9pbmZvKGRldiwgY21kLCBmb3JtYXQsIGFyZy4uLikKKworCisvKiBNb2R1bGUgcGFyYW1ldGVycyAqLworCittb2R1bGVfcGFyYW0oZGVidWcsIGludCwgU19JUlVHTyB8IFNfSVdVU1IpOworTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgIkRlYnVnIGVuYWJsZWQgb3Igbm90Iik7CisKKy8qIEFsbCBpbnRlcnJ1cHQgaW4gdHJhbnNmZXJzIGFyZSBjb2xsZWN0ZWQgaW4gYSByaW5nIGJ1ZmZlciB0bworICogYXZvaWQgcmFjaW5nIGNvbmRpdGlvbnMgYW5kIGdldCBiZXR0ZXIgcGVyZm9ybWFuY2Ugb2YgdGhlIGRyaXZlci4KKyAqLworCitzdGF0aWMgaW50IHJpbmdfYnVmZmVyX3NpemUgPSBSSU5HX0JVRkZFUl9TSVpFOworCittb2R1bGVfcGFyYW0ocmluZ19idWZmZXJfc2l6ZSwgaW50LCAgU19JUlVHTyk7CitNT0RVTEVfUEFSTV9ERVNDKHJpbmdfYnVmZmVyX3NpemUsICJSZWFkIHJpbmcgYnVmZmVyIHNpemUiKTsKKworLyogVGhlIHdyaXRlX2J1ZmZlciBjYW4gb25lIGRheSBjb250YWluIG1vcmUgdGhhbiBvbmUgaW50ZXJydXB0IG91dCB0cmFuc2Zlci4KKyAqLworCitzdGF0aWMgaW50IHdyaXRlX2J1ZmZlcl9zaXplID0gV1JJVEVfQlVGRkVSX1NJWkU7Cittb2R1bGVfcGFyYW0od3JpdGVfYnVmZmVyX3NpemUsIGludCwgIFNfSVJVR08pOworTU9EVUxFX1BBUk1fREVTQyh3cml0ZV9idWZmZXJfc2l6ZSwgIldyaXRlIGJ1ZmZlciBzaXplIik7CisKKy8qCisgKiBJbmNyZWFzZSB0aGUgaW50ZXJ2YWwgZm9yIGRlYnVnZ2luZyBwdXJwb3Nlcy4KKyAqIG9yIHNldCB0byAxIHRvIHVzZSB0aGUgc3RhbmRhcmQgaW50ZXJ2YWwgZnJvbSB0aGUgZW5kcG9pbnQgZGVzY3JpcHRvcnMuCisgKi8KKworc3RhdGljIGludCBtaW5faW50ZXJydXB0X2luX2ludGVydmFsID0gQUxQSEFUUkFDS19VU0JfVElNRU9VVDsKK21vZHVsZV9wYXJhbShtaW5faW50ZXJydXB0X2luX2ludGVydmFsLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhtaW5faW50ZXJydXB0X2luX2ludGVydmFsLCAiTWluaW11bSBpbnRlcnJ1cHQgaW4gaW50ZXJ2YWwgaW4gbXMiKTsKKworc3RhdGljIGludCBtaW5faW50ZXJydXB0X291dF9pbnRlcnZhbCA9IEFMUEhBVFJBQ0tfVVNCX1RJTUVPVVQ7Cittb2R1bGVfcGFyYW0obWluX2ludGVycnVwdF9vdXRfaW50ZXJ2YWwsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKG1pbl9pbnRlcnJ1cHRfb3V0X2ludGVydmFsLCAiTWluaW11bSBpbnRlcnJ1cHQgb3V0IGludGVydmFsIGluIG1zIik7CisKKworCisvKiBTdHJ1Y3R1cmUgdG8gaG9sZCBhbGwgb2Ygb3VyIGRldmljZSBzcGVjaWZpYyBzdHVmZiAqLworCitzdHJ1Y3QgdXNiX2FscGhhdHJhY2sgeworCXN0cnVjdCBzZW1hcGhvcmUJc2VtOwkJLyogbG9ja3MgdGhpcyBzdHJ1Y3R1cmUgKi8KKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZSoJaW50ZjsJCS8qIHNhdmUgb2ZmIHRoZSB1c2IgaW50ZXJmYWNlIHBvaW50ZXIgKi8KKwlpbnQJCQlvcGVuX2NvdW50OwkvKiBudW1iZXIgb2YgdGltZXMgdGhpcyBwb3J0IGhhcyBiZWVuIG9wZW5lZCAqLworCisJc3RydWN0IGFscGhhdHJhY2tfaWNtZAkoKnJpbmdfYnVmZmVyKVtSSU5HX0JVRkZFUl9TSVpFXTsgLyoganVzdCBtYWtlIGMgaGFwcHkgKi8KKwlzdHJ1Y3QgYWxwaGF0cmFja19vY21kCSgqd3JpdGVfYnVmZmVyKVtXUklURV9CVUZGRVJfU0laRV07IC8qIGp1c3QgbWFrZSBjIGhhcHB5ICovCisJdW5zaWduZWQgaW50CQlyaW5nX2hlYWQ7CisJdW5zaWduZWQgaW50CQlyaW5nX3RhaWw7CisKKwl3YWl0X3F1ZXVlX2hlYWRfdAlyZWFkX3dhaXQ7CisJd2FpdF9xdWV1ZV9oZWFkX3QJd3JpdGVfd2FpdDsKKworCXVuc2lnbmVkIGNoYXIqCQlpbnRlcnJ1cHRfaW5fYnVmZmVyOworCXVuc2lnbmVkIGNoYXIqCQlvbGRpX2J1ZmZlcjsKKwlzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IqIGludGVycnVwdF9pbl9lbmRwb2ludDsKKwlzdHJ1Y3QgdXJiKgkJaW50ZXJydXB0X2luX3VyYjsKKwlpbnQJCQlpbnRlcnJ1cHRfaW5faW50ZXJ2YWw7CisJc2l6ZV90CQkJaW50ZXJydXB0X2luX2VuZHBvaW50X3NpemU7CisJaW50CQkJaW50ZXJydXB0X2luX3J1bm5pbmc7CisJaW50CQkJaW50ZXJydXB0X2luX2RvbmU7CisKKwljaGFyKgkJCWludGVycnVwdF9vdXRfYnVmZmVyOworCXN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciogaW50ZXJydXB0X291dF9lbmRwb2ludDsKKwlzdHJ1Y3QgdXJiKgkJaW50ZXJydXB0X291dF91cmI7CisJaW50CQkJaW50ZXJydXB0X291dF9pbnRlcnZhbDsKKwlzaXplX3QJCQlpbnRlcnJ1cHRfb3V0X2VuZHBvaW50X3NpemU7CisJaW50CQkJaW50ZXJydXB0X291dF9idXN5OworCisJYXRvbWljX3Qgd3JpdGVzX3BlbmRpbmc7CisJaW50IGV2ZW50OyAvKiBhbHRlcm5hdGUgaW50ZXJmYWNlIHRvIGV2ZW50cyAqLworCWludCBmYWRlcjsgLyogMTAgYml0cyAqLworCWludCBsaWdodHM7IC8qIDIzIGJpdHMgKi8KKwl1bnNpZ25lZCBjaGFyIGR1bXBfc3RhdGU7IC8qIDAgaWYgZGlzYWJsZWQgMSBpZiBlbmFibGVkICovCisJdW5zaWduZWQgY2hhciBlbmFibGU7IC8qIDAgaWYgZGlzYWJsZWQgMSBpZiBlbmFibGVkICovCisJdW5zaWduZWQgY2hhciBvZmZsaW5lOyAvKiBpZiB0aGUgZGV2aWNlIGlzIG91dCBvZiByYW5nZSBvciBhc2xlZXAgKi8KKwl1bnNpZ25lZCBjaGFyIHZlcmJvc2U7IC8qIGJlIHZlcmJvc2UgaW4gZXJyb3IgcmVwb3J0aW5nICovCisJdW5zaWduZWQgY2hhciAgbGFzdF9jbWRbT1VUUFVUX0NNRF9TSVpFXTsKKwl1bnNpZ25lZCBjaGFyICBzY3JlZW5bMzJdOworfTsKKworLyogcHJldmVudCByYWNlcyBiZXR3ZWVuIG9wZW4oKSBhbmQgZGlzY29ubmVjdCgpICovCitzdGF0aWMgREVGSU5FX01VVEVYKGRpc2Nvbm5lY3RfbXV0ZXgpOworCisvKiBmb3J3YXJkIGRlY2xhcmF0aW9uICovCisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciB1c2JfYWxwaGF0cmFja19kcml2ZXI7CisKKy8qKgorICoJdXNiX2FscGhhdHJhY2tfYWJvcnRfdHJhbnNmZXJzCisgKiAgICAgIGFib3J0cyB0cmFuc2ZlcnMgYW5kIGZyZWVzIGFzc29jaWF0ZWQgZGF0YSBzdHJ1Y3R1cmVzCisgKi8KK3N0YXRpYyB2b2lkIHVzYl9hbHBoYXRyYWNrX2Fib3J0X3RyYW5zZmVycyhzdHJ1Y3QgdXNiX2FscGhhdHJhY2sgKmRldikKK3sKKwkvKiBzaHV0ZG93biB0cmFuc2ZlciAqLworCWlmIChkZXYtPmludGVycnVwdF9pbl9ydW5uaW5nKSB7CisJCWRldi0+aW50ZXJydXB0X2luX3J1bm5pbmcgPSAwOworCQlpZiAoZGV2LT5pbnRmKQorCQkJdXNiX2tpbGxfdXJiKGRldi0+aW50ZXJydXB0X2luX3VyYik7CisJfQorCWlmIChkZXYtPmludGVycnVwdF9vdXRfYnVzeSkKKwkJaWYgKGRldi0+aW50ZikKKwkJCXVzYl9raWxsX3VyYihkZXYtPmludGVycnVwdF9vdXRfdXJiKTsKK30KKworLyoqCisgKgl1c2JfYWxwaGF0cmFja19kZWxldGUKKyAqLworc3RhdGljIHZvaWQgdXNiX2FscGhhdHJhY2tfZGVsZXRlKHN0cnVjdCB1c2JfYWxwaGF0cmFjayAqZGV2KQoreworCXVzYl9hbHBoYXRyYWNrX2Fib3J0X3RyYW5zZmVycyhkZXYpOworCXVzYl9mcmVlX3VyYihkZXYtPmludGVycnVwdF9pbl91cmIpOworCXVzYl9mcmVlX3VyYihkZXYtPmludGVycnVwdF9vdXRfdXJiKTsKKwlrZnJlZShkZXYtPnJpbmdfYnVmZmVyKTsKKwlrZnJlZShkZXYtPmludGVycnVwdF9pbl9idWZmZXIpOworCWtmcmVlKGRldi0+aW50ZXJydXB0X291dF9idWZmZXIpOworCWtmcmVlKGRldik7IC8vIGZpeG1lIG9sZGlfYnVmZmVyCit9CisKKy8qKgorICoJdXNiX2FscGhhdHJhY2tfaW50ZXJydXB0X2luX2NhbGxiYWNrCisgKi8KKworc3RhdGljIHZvaWQgdXNiX2FscGhhdHJhY2tfaW50ZXJydXB0X2luX2NhbGxiYWNrKHN0cnVjdCB1cmIgKnVyYikKK3sKKwlzdHJ1Y3QgdXNiX2FscGhhdHJhY2sgKmRldiA9IHVyYi0+Y29udGV4dDsKKwl1bnNpZ25lZCBpbnQgbmV4dF9yaW5nX2hlYWQ7CisJaW50IHJldHZhbCA9IC0xOworCisJaWYgKHVyYi0+c3RhdHVzKSB7CisJCWlmICh1cmItPnN0YXR1cyA9PSAtRU5PRU5UIHx8CisJCSAgICB1cmItPnN0YXR1cyA9PSAtRUNPTk5SRVNFVCB8fAorCQkgICAgdXJiLT5zdGF0dXMgPT0gLUVTSFVURE9XTikgeworCQkJZ290byBleGl0OworCQl9IGVsc2UgeworCQkJZGJnX2luZm8oJmRldi0+aW50Zi0+ZGV2LCAiJXM6IG5vbnplcm8gc3RhdHVzIHJlY2VpdmVkOiAlZFxuIiwKKwkJCQkgX19mdW5jX18sIHVyYi0+c3RhdHVzKTsKKwkJCWdvdG8gcmVzdWJtaXQ7IC8qIG1heWJlIHdlIGNhbiByZWNvdmVyICovCisJCX0KKwl9CisKKwlpZiAodXJiLT5hY3R1YWxfbGVuZ3RoICE9IElOUFVUX0NNRF9TSVpFKSB7CisJCWRldl93YXJuKCZkZXYtPmludGYtPmRldiwKKwkJCSAiVXJiIGxlbmd0aCB3YXMgJWQgYnl0ZXMhISBEbyBzb21ldGhpbmcgaW50ZWxsaWdlbnQgXG4iLCB1cmItPmFjdHVhbF9sZW5ndGgpOworCX0gZWxzZSB7CisJCSBhbHBoYXRyYWNrX29jbWRfaW5mbygmZGV2LT5pbnRmLT5kZXYsJigqZGV2LT5yaW5nX2J1ZmZlcilbZGV2LT5yaW5nX3RhaWxdLmNtZCwiJXMiLCAiYmxhIik7CisJCSBpZihtZW1jbXAoZGV2LT5pbnRlcnJ1cHRfaW5fYnVmZmVyLGRldi0+b2xkaV9idWZmZXIsSU5QVVRfQ01EX1NJWkUpPT0wKSB7CisJCQkJCQlnb3RvIHJlc3VibWl0OworCQl9CisJCW1lbWNweShkZXYtPm9sZGlfYnVmZmVyLGRldi0+aW50ZXJydXB0X2luX2J1ZmZlcixJTlBVVF9DTURfU0laRSk7CisKKyNpZiBTVVBQUkVTU19FWFRSQV9PRkZMSU5FX0VWRU5UUworCWlmKGRldi0+b2ZmbGluZSA9PSAyICYmIGRldi0+aW50ZXJydXB0X2luX2J1ZmZlclsxXSA9PSAweGZmKSB7IGdvdG8gcmVzdWJtaXQ7IH0KKwkJaWYoZGV2LT5vZmZsaW5lID09IDEgJiYgZGV2LT5pbnRlcnJ1cHRfaW5fYnVmZmVyWzFdID09IDB4ZmYpIHsgZGV2LT5vZmZsaW5lID0gMjsgZ290byByZXN1Ym1pdDsgfQorLyogQWx3YXlzIHBhc3Mgb25lIG9mZmxpbmUgZXZlbnQgdXAgdGhlIHN0YWNrICovCisJCWlmKGRldi0+b2ZmbGluZSA+IDAgJiYgZGV2LT5pbnRlcnJ1cHRfaW5fYnVmZmVyWzFdICE9IDB4ZmYpIHsgZGV2LT5vZmZsaW5lID0gMDsgfQorCQlpZihkZXYtPm9mZmxpbmUgPT0gMCAmJiBkZXYtPmludGVycnVwdF9pbl9idWZmZXJbMV0gPT0gMHhmZikgeyBkZXYtPm9mZmxpbmUgPSAxOyB9CisjZW5kaWYKKwkJZGJnX2luZm8oJmRldi0+aW50Zi0+ZGV2LCAiJXM6IGhlYWQsIHRhaWwgYXJlICV4LCAleFxuIiwgX19mdW5jX18sZGV2LT5yaW5nX2hlYWQsZGV2LT5yaW5nX3RhaWwpOworCQluZXh0X3JpbmdfaGVhZCA9IChkZXYtPnJpbmdfaGVhZCsxKSAlIHJpbmdfYnVmZmVyX3NpemU7CisKKwkJaWYgKG5leHRfcmluZ19oZWFkICE9IGRldi0+cmluZ190YWlsKSB7CisJCQltZW1jcHkoJigoKmRldi0+cmluZ19idWZmZXIpW2Rldi0+cmluZ19oZWFkXSksCisJCQkJCQkgZGV2LT5pbnRlcnJ1cHRfaW5fYnVmZmVyLCB1cmItPmFjdHVhbF9sZW5ndGgpOworCQkJZGV2LT5yaW5nX2hlYWQgPSBuZXh0X3JpbmdfaGVhZDsKKwkJCXJldHZhbCA9IDA7CisJCQltZW1zZXQoZGV2LT5pbnRlcnJ1cHRfaW5fYnVmZmVyLCAwLCB1cmItPmFjdHVhbF9sZW5ndGgpOworCQl9IGVsc2UgeworCQkJZGV2X3dhcm4oJmRldi0+aW50Zi0+ZGV2LAorCQkJCSAiUmluZyBidWZmZXIgb3ZlcmZsb3csICVkIGJ5dGVzIGRyb3BwZWRcbiIsCisJCQkJIHVyYi0+YWN0dWFsX2xlbmd0aCk7CisJCQltZW1zZXQoZGV2LT5pbnRlcnJ1cHRfaW5fYnVmZmVyLCAwLCB1cmItPmFjdHVhbF9sZW5ndGgpOworCQl9CisJfQorCityZXN1Ym1pdDoKKwkvKiByZXN1Ym1pdCBpZiB3ZSdyZSBzdGlsbCBydW5uaW5nICovCisJaWYgKGRldi0+aW50ZXJydXB0X2luX3J1bm5pbmcgJiYgZGV2LT5pbnRmKSB7CisJCXJldHZhbCA9IHVzYl9zdWJtaXRfdXJiKGRldi0+aW50ZXJydXB0X2luX3VyYiwgR0ZQX0FUT01JQyk7CisJCWlmIChyZXR2YWwpCisJCQlkZXZfZXJyKCZkZXYtPmludGYtPmRldiwKKwkJCQkidXNiX3N1Ym1pdF91cmIgZmFpbGVkICglZClcbiIsIHJldHZhbCk7CisJfQorCitleGl0OgorCWRldi0+aW50ZXJydXB0X2luX2RvbmUgPSAxOworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmZGV2LT5yZWFkX3dhaXQpOworfQorCisvKioKKyAqCXVzYl9hbHBoYXRyYWNrX2ludGVycnVwdF9vdXRfY2FsbGJhY2sKKyAqLworc3RhdGljIHZvaWQgdXNiX2FscGhhdHJhY2tfaW50ZXJydXB0X291dF9jYWxsYmFjayhzdHJ1Y3QgdXJiICp1cmIpCit7CisJc3RydWN0IHVzYl9hbHBoYXRyYWNrICpkZXYgPSB1cmItPmNvbnRleHQ7CisKKwkvKiBzeW5jL2FzeW5jIHVubGluayBmYXVsdHMgYXJlbid0IGVycm9ycyAqLworCWlmICh1cmItPnN0YXR1cyAmJiAhKHVyYi0+c3RhdHVzID09IC1FTk9FTlQgfHwKKwkJCSAgICAgdXJiLT5zdGF0dXMgPT0gLUVDT05OUkVTRVQgfHwKKwkJCSAgICAgdXJiLT5zdGF0dXMgPT0gLUVTSFVURE9XTikpCisJCWRiZ19pbmZvKCZkZXYtPmludGYtPmRldiwKKwkJCSAiJXMgLSBub256ZXJvIHdyaXRlIGludGVycnVwdCBzdGF0dXMgcmVjZWl2ZWQ6ICVkXG4iLAorCQkJIF9fZnVuY19fLCB1cmItPnN0YXR1cyk7CisJYXRvbWljX2RlYygmZGV2LT53cml0ZXNfcGVuZGluZyk7CisJZGV2LT5pbnRlcnJ1cHRfb3V0X2J1c3kgPSAwOworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmZGV2LT53cml0ZV93YWl0KTsKK30KKworLyoqCisgKgl1c2JfYWxwaGF0cmFja19vcGVuCisgKi8KK3N0YXRpYyBpbnQgdXNiX2FscGhhdHJhY2tfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgdXNiX2FscGhhdHJhY2sgKmRldjsKKwlpbnQgc3VibWlub3I7CisJaW50IHJldHZhbCA9IDA7CisJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGVyZmFjZTsKKworCW5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbGUpOworCXN1Ym1pbm9yID0gaW1pbm9yKGlub2RlKTsKKworCW11dGV4X2xvY2soJmRpc2Nvbm5lY3RfbXV0ZXgpOworCisJaW50ZXJmYWNlID0gdXNiX2ZpbmRfaW50ZXJmYWNlKCZ1c2JfYWxwaGF0cmFja19kcml2ZXIsIHN1Ym1pbm9yKTsKKworCWlmICghaW50ZXJmYWNlKSB7CisJCWVycigiJXMgLSBlcnJvciwgY2FuJ3QgZmluZCBkZXZpY2UgZm9yIG1pbm9yICVkXG4iLAorCQkgICAgIF9fZnVuY19fLCBzdWJtaW5vcik7CisJCXJldHZhbCA9IC1FTk9ERVY7CisJCWdvdG8gdW5sb2NrX2Rpc2Nvbm5lY3RfZXhpdDsKKwl9CisKKwlkZXYgPSB1c2JfZ2V0X2ludGZkYXRhKGludGVyZmFjZSk7CisKKwlpZiAoIWRldikgeworCQlyZXR2YWwgPSAtRU5PREVWOworCQlnb3RvIHVubG9ja19kaXNjb25uZWN0X2V4aXQ7CisJfQorCisJLyogbG9jayB0aGlzIGRldmljZSAqLworCWlmIChkb3duX2ludGVycnVwdGlibGUoJmRldi0+c2VtKSkgeworCQlyZXR2YWwgPSAtRVJFU1RBUlRTWVM7CisJCWdvdG8gdW5sb2NrX2Rpc2Nvbm5lY3RfZXhpdDsKKwl9CisKKwkvKiBhbGxvdyBvcGVuaW5nIG9ubHkgb25jZSAqLworCWlmIChkZXYtPm9wZW5fY291bnQpIHsKKwkJcmV0dmFsID0gLUVCVVNZOworCQlnb3RvIHVubG9ja19leGl0OworCX0KKwlkZXYtPm9wZW5fY291bnQgPSAxOworCisJLyogaW5pdGlhbGl6ZSBpbiBkaXJlY3Rpb24gKi8KKwlkZXYtPnJpbmdfaGVhZCA9IDA7CisJZGV2LT5yaW5nX3RhaWwgPSAwOworCXVzYl9maWxsX2ludF91cmIoZGV2LT5pbnRlcnJ1cHRfaW5fdXJiLAorCQkJIGludGVyZmFjZV90b191c2JkZXYoaW50ZXJmYWNlKSwKKwkJCSB1c2JfcmN2aW50cGlwZShpbnRlcmZhY2VfdG9fdXNiZGV2KGludGVyZmFjZSksCisJCQkJCWRldi0+aW50ZXJydXB0X2luX2VuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzKSwKKwkJCSBkZXYtPmludGVycnVwdF9pbl9idWZmZXIsCisJCQkgZGV2LT5pbnRlcnJ1cHRfaW5fZW5kcG9pbnRfc2l6ZSwKKwkJCSB1c2JfYWxwaGF0cmFja19pbnRlcnJ1cHRfaW5fY2FsbGJhY2ssCisJCQkgZGV2LAorCQkJIGRldi0+aW50ZXJydXB0X2luX2ludGVydmFsKTsKKworCWRldi0+aW50ZXJydXB0X2luX3J1bm5pbmcgPSAxOworCWRldi0+aW50ZXJydXB0X2luX2RvbmUgPSAwOworCWRldi0+ZW5hYmxlID0gMTsKKwlkZXYtPm9mZmxpbmUgPSAwOworCisJcmV0dmFsID0gdXNiX3N1Ym1pdF91cmIoZGV2LT5pbnRlcnJ1cHRfaW5fdXJiLCBHRlBfS0VSTkVMKTsKKwlpZiAocmV0dmFsKSB7CisJCWRldl9lcnIoJmludGVyZmFjZS0+ZGV2LCAiQ291bGRuJ3Qgc3VibWl0IGludGVycnVwdF9pbl91cmIgJWRcbiIsIHJldHZhbCk7CisJCWRldi0+aW50ZXJydXB0X2luX3J1bm5pbmcgPSAwOworCQlkZXYtPm9wZW5fY291bnQgPSAwOworCQlnb3RvIHVubG9ja19leGl0OworCX0KKworCS8qIHNhdmUgZGV2aWNlIGluIHRoZSBmaWxlJ3MgcHJpdmF0ZSBzdHJ1Y3R1cmUgKi8KKwlmaWxlLT5wcml2YXRlX2RhdGEgPSBkZXY7CisKKwordW5sb2NrX2V4aXQ6CisJdXAoJmRldi0+c2VtKTsKKwordW5sb2NrX2Rpc2Nvbm5lY3RfZXhpdDoKKwltdXRleF91bmxvY2soJmRpc2Nvbm5lY3RfbXV0ZXgpOworCisJcmV0dXJuIHJldHZhbDsKK30KKworLyoqCisgKgl1c2JfYWxwaGF0cmFja19yZWxlYXNlCisgKi8KK3N0YXRpYyBpbnQgdXNiX2FscGhhdHJhY2tfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgdXNiX2FscGhhdHJhY2sgKmRldjsKKwlpbnQgcmV0dmFsID0gMDsKKworCWRldiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKworCWlmIChkZXYgPT0gTlVMTCkgeworCQlyZXR2YWwgPSAtRU5PREVWOworCQlnb3RvIGV4aXQ7CisJfQorCisJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmZGV2LT5zZW0pKSB7CisJCXJldHZhbCA9IC1FUkVTVEFSVFNZUzsKKwkJZ290byBleGl0OworCX0KKworCWlmIChkZXYtPm9wZW5fY291bnQgIT0gMSkgeworCQlyZXR2YWwgPSAtRU5PREVWOworCQlnb3RvIHVubG9ja19leGl0OworCX0KKworCWlmIChkZXYtPmludGYgPT0gTlVMTCkgeworCQkvKiB0aGUgZGV2aWNlIHdhcyB1bnBsdWdnZWQgYmVmb3JlIHRoZSBmaWxlIHdhcyByZWxlYXNlZCAqLworCQl1cCgmZGV2LT5zZW0pOworCQkvKiB1bmxvY2sgaGVyZSBhcyB1c2JfYWxwaGF0cmFja19kZWxldGUgZnJlZXMgZGV2ICovCisJCXVzYl9hbHBoYXRyYWNrX2RlbGV0ZShkZXYpOworCQlyZXR2YWwgPSAtRU5PREVWOworCQlnb3RvIGV4aXQ7CisJfQorCisJLyogd2FpdCB1bnRpbCB3cml0ZSB0cmFuc2ZlciBpcyBmaW5pc2hlZCAqLworCWlmIChkZXYtPmludGVycnVwdF9vdXRfYnVzeSkKKwkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoZGV2LT53cml0ZV93YWl0LCAhZGV2LT5pbnRlcnJ1cHRfb3V0X2J1c3ksIDIgKiBIWik7CisJdXNiX2FscGhhdHJhY2tfYWJvcnRfdHJhbnNmZXJzKGRldik7CisJZGV2LT5vcGVuX2NvdW50ID0gMDsKKwordW5sb2NrX2V4aXQ6CisJdXAoJmRldi0+c2VtKTsKKworZXhpdDoKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKioKKyAqCXVzYl9hbHBoYXRyYWNrX3BvbGwKKyAqLworc3RhdGljIHVuc2lnbmVkIGludCB1c2JfYWxwaGF0cmFja19wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBwb2xsX3RhYmxlICp3YWl0KQoreworCXN0cnVjdCB1c2JfYWxwaGF0cmFjayAqZGV2OworCXVuc2lnbmVkIGludCBtYXNrID0gMDsKKworCWRldiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKworCXBvbGxfd2FpdChmaWxlLCAmZGV2LT5yZWFkX3dhaXQsIHdhaXQpOworCXBvbGxfd2FpdChmaWxlLCAmZGV2LT53cml0ZV93YWl0LCB3YWl0KTsKKworCWlmIChkZXYtPnJpbmdfaGVhZCAhPSBkZXYtPnJpbmdfdGFpbCkKKwkJbWFzayB8PSBQT0xMSU4gfCBQT0xMUkROT1JNOworCWlmICghZGV2LT5pbnRlcnJ1cHRfb3V0X2J1c3kpCisJCW1hc2sgfD0gUE9MTE9VVCB8IFBPTExXUk5PUk07CisKKwlyZXR1cm4gbWFzazsKK30KKworLyoqCisgKgl1c2JfYWxwaGF0cmFja19yZWFkCisgKi8KK3N0YXRpYyBzc2l6ZV90IHVzYl9hbHBoYXRyYWNrX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWZmZXIsIHNpemVfdCBjb3VudCwKKwkJCSAgIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgdXNiX2FscGhhdHJhY2sgKmRldjsKKwlpbnQgcmV0dmFsID0gMDsKKworCWludCBjID0gMDsKKworCWRldiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKworCS8qIHZlcmlmeSB0aGF0IHdlIGFjdHVhbGx5IGhhdmUgc29tZSBkYXRhIHRvIHJlYWQgKi8KKwlpZiAoY291bnQgPT0gMCkKKwkJZ290byBleGl0OworCisJLyogbG9jayB0aGlzIG9iamVjdCAqLworCWlmIChkb3duX2ludGVycnVwdGlibGUoJmRldi0+c2VtKSkgeworCQlyZXR2YWwgPSAtRVJFU1RBUlRTWVM7CisJCWdvdG8gZXhpdDsKKwl9CisKKwkvKiB2ZXJpZnkgdGhhdCB0aGUgZGV2aWNlIHdhc24ndCB1bnBsdWdnZWQgKi8KKwlpZiAoZGV2LT5pbnRmID09IE5VTEwpIHsKKwkJcmV0dmFsID0gLUVOT0RFVjsKKwkJZXJyKCJObyBkZXZpY2Ugb3IgZGV2aWNlIHVucGx1Z2dlZCAlZFxuIiwgcmV0dmFsKTsKKwkJZ290byB1bmxvY2tfZXhpdDsKKwl9CisKKwl3aGlsZSAoZGV2LT5yaW5nX2hlYWQgPT0gZGV2LT5yaW5nX3RhaWwpIHsKKwkJCQkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB7CisJCQkJCQkJCQlyZXR2YWwgPSAtRUFHQUlOOworCQkJCQkJCQkJZ290byB1bmxvY2tfZXhpdDsKKwkJCQkJfQorCQkJCQlkZXYtPmludGVycnVwdF9pbl9kb25lID0gMCA7CisJCQkJCXJldHZhbCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShkZXYtPnJlYWRfd2FpdCwgZGV2LT5pbnRlcnJ1cHRfaW5fZG9uZSk7CisJCQkJCWlmIChyZXR2YWwgPCAwKSB7CisJCQkJCQkJCQlnb3RvIHVubG9ja19leGl0OworCQkJCQl9CisJfQorCisJYWxwaGF0cmFja19vY21kX2luZm8oJmRldi0+aW50Zi0+ZGV2LCAmKCpkZXYtPnJpbmdfYnVmZmVyKVtkZXYtPnJpbmdfdGFpbF0uY21kLCAiJXMiLCAiOiBjb3B5aW5nIHRvIHVzZXJzcGFjZSIpOworCisJICAgYyA9IDA7CisJICAgd2hpbGUoKGMgPCBjb3VudCkgJiYgKGRldi0+cmluZ190YWlsICE9IGRldi0+cmluZ19oZWFkKSkgeworCQkJCQkJIGlmIChjb3B5X3RvX3VzZXIoJmJ1ZmZlcltjXSwgJigqZGV2LT5yaW5nX2J1ZmZlcilbZGV2LT5yaW5nX3RhaWxdLCBJTlBVVF9DTURfU0laRSkpIHsKKwkJCQkJCQkJCQkgcmV0dmFsID0gLUVGQVVMVDsKKwkJCQkJCQkJCQkgZ290byB1bmxvY2tfZXhpdDsKKwkJCQkJCSB9CisJCQkJCQkgZGV2LT5yaW5nX3RhaWwgPSAoZGV2LT5yaW5nX3RhaWwrMSkgJSByaW5nX2J1ZmZlcl9zaXplOworCQkJCQkJIGMrPUlOUFVUX0NNRF9TSVpFOworCQkJCQkJIGRiZ19pbmZvKCZkZXYtPmludGYtPmRldiwgIiVzOiBoZWFkLCB0YWlsIGFyZSAleCwgJXhcbiIsIF9fZnVuY19fLGRldi0+cmluZ19oZWFkLGRldi0+cmluZ190YWlsKTsKKwkgICB9CisJICAgcmV0dmFsID0gYzsKKwordW5sb2NrX2V4aXQ6CisJLyogdW5sb2NrIHRoZSBkZXZpY2UgKi8KKwl1cCgmZGV2LT5zZW0pOworCitleGl0OgorCXJldHVybiByZXR2YWw7Cit9CisKKy8qKgorICoJdXNiX2FscGhhdHJhY2tfd3JpdGUKKyAqLworc3RhdGljIHNzaXplX3QgdXNiX2FscGhhdHJhY2tfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsCisJCQkgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IHVzYl9hbHBoYXRyYWNrICpkZXY7CisJc2l6ZV90IGJ5dGVzX3RvX3dyaXRlOworCWludCByZXR2YWwgPSAwOworCisJZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCisJLyogdmVyaWZ5IHRoYXQgd2UgYWN0dWFsbHkgaGF2ZSBzb21lIGRhdGEgdG8gd3JpdGUgKi8KKwlpZiAoY291bnQgPT0gMCkKKwkJZ290byBleGl0OworCisJLyogbG9jayB0aGlzIG9iamVjdCAqLworCWlmIChkb3duX2ludGVycnVwdGlibGUoJmRldi0+c2VtKSkgeworCQlyZXR2YWwgPSAtRVJFU1RBUlRTWVM7CisJCWdvdG8gZXhpdDsKKwl9CisKKwkvKiB2ZXJpZnkgdGhhdCB0aGUgZGV2aWNlIHdhc24ndCB1bnBsdWdnZWQgKi8KKwlpZiAoZGV2LT5pbnRmID09IE5VTEwpIHsKKwkJcmV0dmFsID0gLUVOT0RFVjsKKwkJZXJyKCJObyBkZXZpY2Ugb3IgZGV2aWNlIHVucGx1Z2dlZCAlZFxuIiwgcmV0dmFsKTsKKwkJZ290byB1bmxvY2tfZXhpdDsKKwl9CisKKwkvKiB3YWl0IHVudGlsIHByZXZpb3VzIHRyYW5zZmVyIGlzIGZpbmlzaGVkICovCisJaWYgKGRldi0+aW50ZXJydXB0X291dF9idXN5KSB7CisJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgeworCQkJcmV0dmFsID0gLUVBR0FJTjsKKwkJCWdvdG8gdW5sb2NrX2V4aXQ7CisJCX0KKwkJcmV0dmFsID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGRldi0+d3JpdGVfd2FpdCwgIWRldi0+aW50ZXJydXB0X291dF9idXN5KTsKKwkJaWYgKHJldHZhbCA8IDApIHsKKwkJCWdvdG8gdW5sb2NrX2V4aXQ7CisJCX0KKwl9CisKKwkvKiB3cml0ZSB0aGUgZGF0YSBpbnRvIGludGVycnVwdF9vdXRfYnVmZmVyIGZyb20gdXNlcnNwYWNlICovCisgIC8qIEZJWE1FIC0gaWYgeW91IHdyaXRlIG1vcmUgdGhhbiAxMiBieXRlcyB0aGlzIGJyZWFrcyAqLworCWJ5dGVzX3RvX3dyaXRlID0gbWluKGNvdW50LCB3cml0ZV9idWZmZXJfc2l6ZSpkZXYtPmludGVycnVwdF9vdXRfZW5kcG9pbnRfc2l6ZSk7CisJaWYgKGJ5dGVzX3RvX3dyaXRlIDwgY291bnQpCisJCWRldl93YXJuKCZkZXYtPmludGYtPmRldiwgIldyaXRlIGJ1ZmZlciBvdmVyZmxvdywgJXpkIGJ5dGVzIGRyb3BwZWRcbiIsY291bnQtYnl0ZXNfdG9fd3JpdGUpOworCisJZGJnX2luZm8oJmRldi0+aW50Zi0+ZGV2LCAiJXM6IGNvdW50ID0gJXpkLCBieXRlc190b193cml0ZSA9ICV6ZFxuIiwgX19mdW5jX18sIGNvdW50LCBieXRlc190b193cml0ZSk7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoZGV2LT5pbnRlcnJ1cHRfb3V0X2J1ZmZlciwgYnVmZmVyLCBieXRlc190b193cml0ZSkpIHsKKwkJcmV0dmFsID0gLUVGQVVMVDsKKwkJZ290byB1bmxvY2tfZXhpdDsKKwl9CisKKwlpZiAoZGV2LT5pbnRlcnJ1cHRfb3V0X2VuZHBvaW50ID09IE5VTEwpIHsKKwkJZXJyKCJFbmRwb2ludCBzaG91bGQgbm90IGJlIGJlIG51bGwhIFxuIik7CisJCWdvdG8gdW5sb2NrX2V4aXQ7CisJfQorCisJLyogc2VuZCBvZmYgdGhlIHVyYiAqLworCXVzYl9maWxsX2ludF91cmIoZGV2LT5pbnRlcnJ1cHRfb3V0X3VyYiwKKwkJCSBpbnRlcmZhY2VfdG9fdXNiZGV2KGRldi0+aW50ZiksCisJCQkgdXNiX3NuZGludHBpcGUoaW50ZXJmYWNlX3RvX3VzYmRldihkZXYtPmludGYpLAorCQkJCQlkZXYtPmludGVycnVwdF9vdXRfZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3MpLAorCQkJIGRldi0+aW50ZXJydXB0X291dF9idWZmZXIsCisJCQkgYnl0ZXNfdG9fd3JpdGUsCisJCQkgdXNiX2FscGhhdHJhY2tfaW50ZXJydXB0X291dF9jYWxsYmFjaywKKwkJCSBkZXYsCisJCQkgZGV2LT5pbnRlcnJ1cHRfb3V0X2ludGVydmFsKTsKKwlkZXYtPmludGVycnVwdF9vdXRfYnVzeSA9IDE7CisJYXRvbWljX2luYygmZGV2LT53cml0ZXNfcGVuZGluZyk7CisJd21iKCk7CisKKwlyZXR2YWwgPSB1c2Jfc3VibWl0X3VyYihkZXYtPmludGVycnVwdF9vdXRfdXJiLCBHRlBfS0VSTkVMKTsKKwlpZiAocmV0dmFsKSB7CisJCWRldi0+aW50ZXJydXB0X291dF9idXN5ID0gMDsKKwkJZXJyKCJDb3VsZG4ndCBzdWJtaXQgaW50ZXJydXB0X291dF91cmIgJWRcbiIsIHJldHZhbCk7CisJCWF0b21pY19kZWMoJmRldi0+d3JpdGVzX3BlbmRpbmcpOworCQlnb3RvIHVubG9ja19leGl0OworCX0KKwlyZXR2YWwgPSBieXRlc190b193cml0ZTsKKwordW5sb2NrX2V4aXQ6CisJLyogdW5sb2NrIHRoZSBkZXZpY2UgKi8KKwl1cCgmZGV2LT5zZW0pOworCitleGl0OgorCXJldHVybiByZXR2YWw7Cit9CisKKy8qIGZpbGUgb3BlcmF0aW9ucyBuZWVkZWQgd2hlbiB3ZSByZWdpc3RlciB0aGlzIGRyaXZlciAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgdXNiX2FscGhhdHJhY2tfZm9wcyA9IHsKKwkub3duZXIgPQlUSElTX01PRFVMRSwKKwkucmVhZCAgPQl1c2JfYWxwaGF0cmFja19yZWFkLAorCS53cml0ZSA9CXVzYl9hbHBoYXRyYWNrX3dyaXRlLAorCS5vcGVuID0JCXVzYl9hbHBoYXRyYWNrX29wZW4sCisJLnJlbGVhc2UgPQl1c2JfYWxwaGF0cmFja19yZWxlYXNlLAorCS5wb2xsID0JCXVzYl9hbHBoYXRyYWNrX3BvbGwsCit9OworCisvKgorICogdXNiIGNsYXNzIGRyaXZlciBpbmZvIGluIG9yZGVyIHRvIGdldCBhIG1pbm9yIG51bWJlciBmcm9tIHRoZSB1c2IgY29yZSwKKyAqIGFuZCB0byBoYXZlIHRoZSBkZXZpY2UgcmVnaXN0ZXJlZCB3aXRoIHRoZSBkcml2ZXIgY29yZQorICovCisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2NsYXNzX2RyaXZlciB1c2JfYWxwaGF0cmFja19jbGFzcyA9IHsKKwkubmFtZSA9CQkiYWxwaGF0cmFjayVkIiwKKwkuZm9wcyA9CQkmdXNiX2FscGhhdHJhY2tfZm9wcywKKwkubWlub3JfYmFzZSA9CVVTQl9BTFBIQVRSQUNLX01JTk9SX0JBU0UsCit9OworCisKKy8qKgorICoJdXNiX2FscGhhdHJhY2tfcHJvYmUKKyAqCisgKglDYWxsZWQgYnkgdGhlIHVzYiBjb3JlIHdoZW4gYSBuZXcgZGV2aWNlIGlzIGNvbm5lY3RlZCB0aGF0IGl0IHRoaW5rcworICoJdGhpcyBkcml2ZXIgbWlnaHQgYmUgaW50ZXJlc3RlZCBpbi4KKyAqLworc3RhdGljIGludCB1c2JfYWxwaGF0cmFja19wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKQoreworCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldihpbnRmKTsKKwlzdHJ1Y3QgdXNiX2FscGhhdHJhY2sgKmRldiA9IE5VTEw7CisJc3RydWN0IHVzYl9ob3N0X2ludGVyZmFjZSAqaWZhY2VfZGVzYzsKKwlzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVuZHBvaW50OworCWludCBpOworCWludCB0cnVlX3NpemU7CisJaW50IHJldHZhbCA9IC1FTk9NRU07CisKKwkvKiBhbGxvY2F0ZSBtZW1vcnkgZm9yIG91ciBkZXZpY2Ugc3RhdGUgYW5kIGludGlhbGl6ZSBpdCAqLworCisJZGV2ID0ga3phbGxvYyhzaXplb2YoKmRldiksIEdGUF9LRVJORUwpOworCWlmIChkZXYgPT0gTlVMTCkgeworCQlkZXZfZXJyKCZpbnRmLT5kZXYsICJPdXQgb2YgbWVtb3J5XG4iKTsKKwkJZ290byBleGl0OworCX0KKwlpbml0X01VVEVYKCZkZXYtPnNlbSk7CisJZGV2LT5pbnRmID0gaW50ZjsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZkZXYtPnJlYWRfd2FpdCk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmZGV2LT53cml0ZV93YWl0KTsKKworCWlmYWNlX2Rlc2MgPSBpbnRmLT5jdXJfYWx0c2V0dGluZzsKKworCS8qIHNldCB1cCB0aGUgZW5kcG9pbnQgaW5mb3JtYXRpb24gKi8KKwlmb3IgKGkgPSAwOyBpIDwgaWZhY2VfZGVzYy0+ZGVzYy5iTnVtRW5kcG9pbnRzOyArK2kpIHsKKwkJZW5kcG9pbnQgPSAmaWZhY2VfZGVzYy0+ZW5kcG9pbnRbaV0uZGVzYzsKKworCQlpZiAodXNiX2VuZHBvaW50X2lzX2ludF9pbihlbmRwb2ludCkpCisJCQlkZXYtPmludGVycnVwdF9pbl9lbmRwb2ludCA9IGVuZHBvaW50OworCisJCWlmICh1c2JfZW5kcG9pbnRfaXNfaW50X291dChlbmRwb2ludCkpCisJCQlkZXYtPmludGVycnVwdF9vdXRfZW5kcG9pbnQgPSBlbmRwb2ludDsKKwl9CisJaWYgKGRldi0+aW50ZXJydXB0X2luX2VuZHBvaW50ID09IE5VTEwpIHsKKwkJZGV2X2VycigmaW50Zi0+ZGV2LCAiSW50ZXJydXB0IGluIGVuZHBvaW50IG5vdCBmb3VuZFxuIik7CisJCWdvdG8gZXJyb3I7CisJfQorCWlmIChkZXYtPmludGVycnVwdF9vdXRfZW5kcG9pbnQgPT0gTlVMTCkKKwkJZGV2X3dhcm4oJmludGYtPmRldiwgIkludGVycnVwdCBvdXQgZW5kcG9pbnQgbm90IGZvdW5kICh1c2luZyBjb250cm9sIGVuZHBvaW50IGluc3RlYWQpXG4iKTsKKworCWRldi0+aW50ZXJydXB0X2luX2VuZHBvaW50X3NpemUgPSBsZTE2X3RvX2NwdShkZXYtPmludGVycnVwdF9pbl9lbmRwb2ludC0+d01heFBhY2tldFNpemUpOworCisJaWYgKGRldi0+aW50ZXJydXB0X2luX2VuZHBvaW50X3NpemUgIT0gNjQpCisJICAgIGRldl93YXJuKCZpbnRmLT5kZXYsICJJbnRlcnJ1cHQgaW4gZW5kcG9pbnQgc2l6ZSBpcyBub3QgNjQhXG4iKTsKKworCWlmKHJpbmdfYnVmZmVyX3NpemUgPT0gMCkgeyByaW5nX2J1ZmZlcl9zaXplID0gUklOR19CVUZGRVJfU0laRTsgfQorCisJdHJ1ZV9zaXplID0gbWluKHJpbmdfYnVmZmVyX3NpemUsUklOR19CVUZGRVJfU0laRSk7CisKKwkvKiBGSVhNRSAtIHRoZXJlIGFyZSBtb3JlIHVzYl9hbGxvYyByb3V0aW5lcyBmb3IgZG1hIGNvcnJlY3RuZXNzLiBOZWVkZWQ/ICovCisKKy8vCWRldi0+cmluZ19idWZmZXIgPSBrbWFsbG9jKCh0cnVlX3NpemUqc2l6ZW9mKHN0cnVjdCBhbHBoYXRyYWNrX2ljbWQpKSsxMiwgR0ZQX0tFUk5FTCk7CisJZGV2LT5yaW5nX2J1ZmZlciA9IGttYWxsb2MoKHRydWVfc2l6ZSpzaXplb2Yoc3RydWN0IGFscGhhdHJhY2tfaWNtZCkpLCBHRlBfS0VSTkVMKTsKKworCWlmICghZGV2LT5yaW5nX2J1ZmZlcikgeworCQlkZXZfZXJyKCZpbnRmLT5kZXYsICJDb3VsZG4ndCBhbGxvY2F0ZSBpbnB1dCByaW5nX2J1ZmZlciBvZiBzaXplICVkXG4iLHRydWVfc2l6ZSk7CisJCWdvdG8gZXJyb3I7CisJfQorCisJZGV2LT5pbnRlcnJ1cHRfaW5fYnVmZmVyID0ga21hbGxvYyhkZXYtPmludGVycnVwdF9pbl9lbmRwb2ludF9zaXplLCBHRlBfS0VSTkVMKTsKKworCWlmICghZGV2LT5pbnRlcnJ1cHRfaW5fYnVmZmVyKSB7CisJCWRldl9lcnIoJmludGYtPmRldiwgIkNvdWxkbid0IGFsbG9jYXRlIGludGVycnVwdF9pbl9idWZmZXJcbiIpOworCQlnb3RvIGVycm9yOworCX0KKwlkZXYtPm9sZGlfYnVmZmVyID0ga21hbGxvYyhkZXYtPmludGVycnVwdF9pbl9lbmRwb2ludF9zaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRldi0+b2xkaV9idWZmZXIpIHsKKwkJZGV2X2VycigmaW50Zi0+ZGV2LCAiQ291bGRuJ3QgYWxsb2NhdGUgb2xkIGJ1ZmZlclxuIik7CisJCWdvdG8gZXJyb3I7CisJfQorCWRldi0+aW50ZXJydXB0X2luX3VyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkZXYtPmludGVycnVwdF9pbl91cmIpIHsKKwkJZGV2X2VycigmaW50Zi0+ZGV2LCAiQ291bGRuJ3QgYWxsb2NhdGUgaW50ZXJydXB0X2luX3VyYlxuIik7CisJCWdvdG8gZXJyb3I7CisJfQorCisJZGV2LT5pbnRlcnJ1cHRfb3V0X2VuZHBvaW50X3NpemUgPSBkZXYtPmludGVycnVwdF9vdXRfZW5kcG9pbnQgPyBsZTE2X3RvX2NwdShkZXYtPmludGVycnVwdF9vdXRfZW5kcG9pbnQtPndNYXhQYWNrZXRTaXplKSA6CisJCQkJCQkJCQkgdWRldi0+ZGVzY3JpcHRvci5iTWF4UGFja2V0U2l6ZTA7CisKKwlpZiAoZGV2LT5pbnRlcnJ1cHRfb3V0X2VuZHBvaW50X3NpemUgIT02NCkKKwkJZGV2X3dhcm4oJmludGYtPmRldiwgIkludGVycnVwdCBvdXQgZW5kcG9pbnQgc2l6ZSBpcyBub3QgNjQhKVxuIik7CisKKwlpZih3cml0ZV9idWZmZXJfc2l6ZSA9PSAwKSB7IHdyaXRlX2J1ZmZlcl9zaXplID0gV1JJVEVfQlVGRkVSX1NJWkU7IH0KKwl0cnVlX3NpemUgPSBtaW4od3JpdGVfYnVmZmVyX3NpemUsV1JJVEVfQlVGRkVSX1NJWkUpOworCisJZGV2LT5pbnRlcnJ1cHRfb3V0X2J1ZmZlciA9IGttYWxsb2ModHJ1ZV9zaXplKmRldi0+aW50ZXJydXB0X291dF9lbmRwb2ludF9zaXplLCBHRlBfS0VSTkVMKTsKKworCWlmICghZGV2LT5pbnRlcnJ1cHRfb3V0X2J1ZmZlcikgeworCQlkZXZfZXJyKCZpbnRmLT5kZXYsICJDb3VsZG4ndCBhbGxvY2F0ZSBpbnRlcnJ1cHRfb3V0X2J1ZmZlclxuIik7CisJCWdvdG8gZXJyb3I7CisJfQorCisJZGV2LT53cml0ZV9idWZmZXIgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgYWxwaGF0cmFja19vY21kKSp0cnVlX3NpemUsIEdGUF9LRVJORUwpOworCisJaWYgKCFkZXYtPndyaXRlX2J1ZmZlcikgeworCQlkZXZfZXJyKCZpbnRmLT5kZXYsICJDb3VsZG4ndCBhbGxvY2F0ZSB3cml0ZV9idWZmZXIgXG4iKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlkZXYtPmludGVycnVwdF9vdXRfdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRldi0+aW50ZXJydXB0X291dF91cmIpIHsKKwkJZGV2X2VycigmaW50Zi0+ZGV2LCAiQ291bGRuJ3QgYWxsb2NhdGUgaW50ZXJydXB0X291dF91cmJcbiIpOworCQlnb3RvIGVycm9yOworCX0KKwlkZXYtPmludGVycnVwdF9pbl9pbnRlcnZhbCA9IG1pbl9pbnRlcnJ1cHRfaW5faW50ZXJ2YWwgPiBkZXYtPmludGVycnVwdF9pbl9lbmRwb2ludC0+YkludGVydmFsID8gbWluX2ludGVycnVwdF9pbl9pbnRlcnZhbCA6IGRldi0+aW50ZXJydXB0X2luX2VuZHBvaW50LT5iSW50ZXJ2YWw7CisJaWYgKGRldi0+aW50ZXJydXB0X291dF9lbmRwb2ludCkKKwkJZGV2LT5pbnRlcnJ1cHRfb3V0X2ludGVydmFsID0gbWluX2ludGVycnVwdF9vdXRfaW50ZXJ2YWwgPiBkZXYtPmludGVycnVwdF9vdXRfZW5kcG9pbnQtPmJJbnRlcnZhbCA/IG1pbl9pbnRlcnJ1cHRfb3V0X2ludGVydmFsIDogZGV2LT5pbnRlcnJ1cHRfb3V0X2VuZHBvaW50LT5iSW50ZXJ2YWw7CisKKwkvKiB3ZSBjYW4gcmVnaXN0ZXIgdGhlIGRldmljZSBub3csIGFzIGl0IGlzIHJlYWR5ICovCisJdXNiX3NldF9pbnRmZGF0YShpbnRmLCBkZXYpOworCisJYXRvbWljX3NldCgmZGV2LT53cml0ZXNfcGVuZGluZywwKTsKKwlyZXR2YWwgPSB1c2JfcmVnaXN0ZXJfZGV2KGludGYsICZ1c2JfYWxwaGF0cmFja19jbGFzcyk7CisJaWYgKHJldHZhbCkgeworCQkvKiBzb21ldGhpbmcgcHJldmVudGVkIHVzIGZyb20gcmVnaXN0ZXJpbmcgdGhpcyBkcml2ZXIgKi8KKwkJZGV2X2VycigmaW50Zi0+ZGV2LCAiTm90IGFibGUgdG8gZ2V0IGEgbWlub3IgZm9yIHRoaXMgZGV2aWNlLlxuIik7CisJCXVzYl9zZXRfaW50ZmRhdGEoaW50ZiwgTlVMTCk7CisJCWdvdG8gZXJyb3I7CisJfQorCisJLyogbGV0IHRoZSB1c2VyIGtub3cgd2hhdCBub2RlIHRoaXMgZGV2aWNlIGlzIG5vdyBhdHRhY2hlZCB0byAqLworCWRldl9pbmZvKCZpbnRmLT5kZXYsICJBbHBoYXRyYWNrIERldmljZSAjJWQgbm93IGF0dGFjaGVkIHRvIG1ham9yICVkIG1pbm9yICVkXG4iLAorCQkoaW50Zi0+bWlub3IgLSBVU0JfQUxQSEFUUkFDS19NSU5PUl9CQVNFKSwgVVNCX01BSk9SLCBpbnRmLT5taW5vcik7CisKK2V4aXQ6CisJcmV0dXJuIHJldHZhbDsKKworZXJyb3I6CisJdXNiX2FscGhhdHJhY2tfZGVsZXRlKGRldik7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKioKKyAqCXVzYl9hbHBoYXRyYWNrX2Rpc2Nvbm5lY3QKKyAqCisgKglDYWxsZWQgYnkgdGhlIHVzYiBjb3JlIHdoZW4gdGhlIGRldmljZSBpcyByZW1vdmVkIGZyb20gdGhlIHN5c3RlbS4KKyAqLworc3RhdGljIHZvaWQgdXNiX2FscGhhdHJhY2tfZGlzY29ubmVjdChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKK3sKKwlzdHJ1Y3QgdXNiX2FscGhhdHJhY2sgKmRldjsKKwlpbnQgbWlub3I7CisKKwltdXRleF9sb2NrKCZkaXNjb25uZWN0X211dGV4KTsKKworCWRldiA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CisJdXNiX3NldF9pbnRmZGF0YShpbnRmLCBOVUxMKTsKKworCWRvd24oJmRldi0+c2VtKTsKKworCW1pbm9yID0gaW50Zi0+bWlub3I7CisKKwkvKiBnaXZlIGJhY2sgb3VyIG1pbm9yICovCisJdXNiX2RlcmVnaXN0ZXJfZGV2KGludGYsICZ1c2JfYWxwaGF0cmFja19jbGFzcyk7CisKKwkvKiBpZiB0aGUgZGV2aWNlIGlzIG5vdCBvcGVuZWQsIHRoZW4gd2UgY2xlYW4gdXAgcmlnaHQgbm93ICovCisJaWYgKCFkZXYtPm9wZW5fY291bnQpIHsKKwkJdXAoJmRldi0+c2VtKTsKKwkJdXNiX2FscGhhdHJhY2tfZGVsZXRlKGRldik7CisJfSBlbHNlIHsKKwkJZGV2LT5pbnRmID0gTlVMTDsKKwkJdXAoJmRldi0+c2VtKTsKKwl9CisKKwlhdG9taWNfc2V0KCZkZXYtPndyaXRlc19wZW5kaW5nLDApOworCW11dGV4X3VubG9jaygmZGlzY29ubmVjdF9tdXRleCk7CisKKwlkZXZfaW5mbygmaW50Zi0+ZGV2LCAiQWxwaGF0cmFjayBTdXJmYWNlICMlZCBub3cgZGlzY29ubmVjdGVkXG4iLAorCQkgKG1pbm9yIC0gVVNCX0FMUEhBVFJBQ0tfTUlOT1JfQkFTRSkpOworfQorCisvKiB1c2Igc3BlY2lmaWMgb2JqZWN0IG5lZWRlZCB0byByZWdpc3RlciB0aGlzIGRyaXZlciB3aXRoIHRoZSB1c2Igc3Vic3lzdGVtICovCitzdGF0aWMgc3RydWN0IHVzYl9kcml2ZXIgdXNiX2FscGhhdHJhY2tfZHJpdmVyID0geworCS5uYW1lID0JCSJhbHBoYXRyYWNrIiwKKwkucHJvYmUgPQl1c2JfYWxwaGF0cmFja19wcm9iZSwKKwkuZGlzY29ubmVjdCA9CXVzYl9hbHBoYXRyYWNrX2Rpc2Nvbm5lY3QsCisJLmlkX3RhYmxlID0JdXNiX2FscGhhdHJhY2tfdGFibGUsCit9OworCisvKioKKyAqCXVzYl9hbHBoYXRyYWNrX2luaXQKKyAqLworc3RhdGljIGludCBfX2luaXQgdXNiX2FscGhhdHJhY2tfaW5pdCh2b2lkKQoreworCWludCByZXR2YWw7CisKKwkvKiByZWdpc3RlciB0aGlzIGRyaXZlciB3aXRoIHRoZSBVU0Igc3Vic3lzdGVtICovCisJcmV0dmFsID0gdXNiX3JlZ2lzdGVyKCZ1c2JfYWxwaGF0cmFja19kcml2ZXIpOworCWlmIChyZXR2YWwpCisJCWVycigidXNiX3JlZ2lzdGVyIGZhaWxlZCBmb3IgdGhlICJfX0ZJTEVfXyIgZHJpdmVyLiBFcnJvciBudW1iZXIgJWRcbiIsIHJldHZhbCk7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKioKKyAqCXVzYl9hbHBoYXRyYWNrX2V4aXQKKyAqLworc3RhdGljIHZvaWQgX19leGl0IHVzYl9hbHBoYXRyYWNrX2V4aXQodm9pZCkKK3sKKwkvKiBkZXJlZ2lzdGVyIHRoaXMgZHJpdmVyIHdpdGggdGhlIFVTQiBzdWJzeXN0ZW0gKi8KKwl1c2JfZGVyZWdpc3RlcigmdXNiX2FscGhhdHJhY2tfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQodXNiX2FscGhhdHJhY2tfaW5pdCk7Cittb2R1bGVfZXhpdCh1c2JfYWxwaGF0cmFja19leGl0KTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2Zyb250aWVyL2FscGhhdHJhY2suaCBiL2RyaXZlcnMvc3RhZ2luZy9mcm9udGllci9hbHBoYXRyYWNrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzVjOTBhOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9mcm9udGllci9hbHBoYXRyYWNrLmgKQEAgLTAsMCArMSw5MiBAQAorI2RlZmluZSBzaG93X3NldF9iaXQoYSkgc2hvd19zZXRfbWJpdChhbHBoYXRyYWNrLGEpCisjZGVmaW5lIHNob3dfc2V0X2NtZChhKSBzaG93X3NldF9tY21kKGFscGhhdHJhY2ssYSkKKyNkZWZpbmUgc2hvd19zZXRfaW50KGEpIHNob3dfc2V0X21pbnQoYWxwaGF0cmFjayxhKQorI2RlZmluZSBzaG93X3NldF9jaGFyKGEpIHNob3dfc2V0X21jaGFyKGFscGhhdHJhY2ssYSkKKyNkZWZpbmUgc2hvd19zZXRfbGlnaHQoYSkgc2hvd19zZXRfZWJpdChhbHBoYXRyYWNrLExpZ2h0SUQsbGlnaHRzLGEpCisjZGVmaW5lIHNob3dfc2V0X2J1dHRvbihhKSBzaG93X3NldF9lYml0KGFscGhhdHJhY2ssQnV0dG9uSUQsYnV0dG9uLGEpCisKK3N0cnVjdCBhbHBoYXRyYWNrX2ljbWQgeworICAgIHVuc2lnbmVkIGNoYXIgY21kWzEyXTsKK307CisKK3N0cnVjdCBhbHBoYXRyYWNrX29jbWQgeworICAgIHVuc2lnbmVkIGNoYXIgY21kWzhdOworfTsKKworZW51bSBMaWdodElEIHsKKyAgICAgICAgTElHSFRfRVEgPSAwLAorICAgICAgICBMSUdIVF9PVVQsCisgICAgICAgIExJR0hUX0YyLAorICAgICAgICBMSUdIVF9TRU5ELAorICAgICAgICBMSUdIVF9JTiwKKyAgICAgICAgTElHSFRfRjEsCisgICAgICAgIExJR0hUX1BBTiwKKyAgICAgICAgTElHSFRfVU5ERUYxLAorICAgICAgICBMSUdIVF9VTkRFRjIsCisgICAgICAgIExJR0hUX1NISUZULAorICAgICAgICBMSUdIVF9UUkFDS01VVEUsCisgICAgICAgIExJR0hUX1RSQUNLU09MTywKKyAgICAgICAgTElHSFRfVFJBQ0tSRUMsCisgICAgICAgIExJR0hUX1JFQUQsCisgICAgICAgIExJR0hUX1dSSVRFLAorICAgICAgICBMSUdIVF9BTllTT0xPLAorICAgICAgICBMSUdIVF9BVVRPLAorICAgICAgICBMSUdIVF9GNCwKKyAgICAgICAgTElHSFRfUkVDT1JELAorICAgICAgICBMSUdIVF9XSU5ET1csCisgICAgICAgIExJR0hUX1BMVUdJTiwKKyAgICAgICAgTElHSFRfRjMsCisgICAgICAgIExJR0hUX0xPT1AKK307CisKKyNkZWZpbmUgQlVUVE9OTUFTS19CQVRURVJZICAgICAweDAwMDA0MDAwCisjZGVmaW5lIEJVVFRPTk1BU0tfQkFDS0xJR0hUICAgMHgwMDAwODAwMAorI2RlZmluZSBCVVRUT05NQVNLX0ZBU1RGT1JXQVJEIDB4MDQwMDAwMDAKKyNkZWZpbmUgQlVUVE9OTUFTS19UUkFDS01VVEUgICAweDAwMDQwMDAwCisjZGVmaW5lIEJVVFRPTk1BU0tfVFJBQ0tTT0xPICAgMHgwMDgwMDAwMAorI2RlZmluZSBCVVRUT05NQVNLX1RSQUNLTEVGVCAgIDB4ODAwMDAwMDAKKyNkZWZpbmUgQlVUVE9OTUFTS19SRUNPUkQgICAgICAweDAyMDAwMDAwCisjZGVmaW5lIEJVVFRPTk1BU0tfU0hJRlQgICAgICAgMHgyMDAwMDAwMAorI2RlZmluZSBCVVRUT05NQVNLX1BVTkNIICAgICAgIDB4MDA4MDAwMDAKKyNkZWZpbmUgQlVUVE9OTUFTS19UUkFDS1JJR0hUICAweDAwMDIwMDAwCisjZGVmaW5lIEJVVFRPTk1BU0tfUkVXSU5EICAgICAgMHgwMTAwMDAwMAorI2RlZmluZSBCVVRUT05NQVNLX1NUT1AgICAgICAgIDB4MTAwMDAwMDAKKyNkZWZpbmUgQlVUVE9OTUFTS19MT09QICAgICAgICAweDAwMDEwMDAwCisjZGVmaW5lIEJVVFRPTk1BU0tfVFJBQ0tSRUMgICAgMHgwMDAwMTAwMAorI2RlZmluZSBCVVRUT05NQVNLX1BMQVkgICAgICAgIDB4MDgwMDAwMDAKKyNkZWZpbmUgQlVUVE9OTUFTS19UT1VDSDEgICAgICAweDAwMDAwMDA4CisjZGVmaW5lIEJVVFRPTk1BU0tfVE9VQ0gyICAgICAgMHgwMDAwMDAxMAorI2RlZmluZSBCVVRUT05NQVNLX1RPVUNIMyAgICAgIDB4MDAwMDAwMjAKKworI2RlZmluZSBCVVRUT05NQVNLX1BSRVNTMSAgICAgIDB4MDAwMDAwMDkKKyNkZWZpbmUgQlVUVE9OTUFTS19QUkVTUzIgICAgICAweDAwMDA4MDEwCisjZGVmaW5lIEJVVFRPTk1BU0tfUFJFU1MzICAgICAgMHgwMDAwMjAyMAorCisvLyBsYXN0IDMgYnl0ZXMgYXJlIHRoZSBzbGlkZXIgcG9zaXRpb24KKy8vIDQwIGlzIHRoZSBhY3R1YWwgc2xpZGVyIG1vdmluZywgdGhlIG1vc3Qgc2lnIGJpdHMsIGFuZCAzIGxzYgorCisjZGVmaW5lIEJVVFRPTk1BU0tfRkxJUCAgICAgICAgIDB4NDAwMDAwMDAKKyNkZWZpbmUgQlVUVE9OTUFTS19GMSAgICAgICAgICAgMHgwMDEwMDAwMAorI2RlZmluZSBCVVRUT05NQVNLX0YyICAgICAgICAgICAweDAwNDAwMDAwCisjZGVmaW5lIEJVVFRPTk1BU0tfRjMgICAgICAgICAgIDB4MDAyMDAwMDAKKyNkZWZpbmUgQlVUVE9OTUFTS19GNCAgICAgICAgICAgMHgwMDA4MDAwMAorI2RlZmluZSBCVVRUT05NQVNLX1BBTiAgICAgICAgICAweDAwMDAwMjAwCisjZGVmaW5lIEJVVFRPTk1BU0tfU0VORCAgICAgICAgIDB4MDAwMDA4MDAKKyNkZWZpbmUgQlVUVE9OTUFTS19FUSAgICAgICAgICAgMHgwMDAwNDAwMAorI2RlZmluZSBCVVRUT05NQVNLX1BMVUdJTiAgICAgICAweDAwMDAwNDAwCisjZGVmaW5lIEJVVFRPTk1BU0tfQVVUTyAgICAgICAgIDB4MDAwMDAxMDAKKworCisvLyAjZGVmaW5lIEJVVFRPTk1BU0tfRk9PVFNXSVRDSCBGSVhNRQorCisvLyBMb29rdXAuIG5hbWUuIG1pZGkgb3V0LiBtaWRpIGluLgorCitzdHJ1Y3QgYnV0dG9ubWFwX3QgeworCXUzMiBtYXNrOworCXNob3J0IG1pZGlfaW47CisJc2hvcnQgbWlkaV9vdXQ7CisJY2hhciAqbmFtZTsKKy8vICAJdm9pZCAoKmZ1bmN0aW9uKSAoYnV0dG9ubWFwX3QgKik7CisgIAl2b2lkICgqZnVuY3Rpb24pICh2b2lkKTsKK307CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9mcm9udGllci9mcm9udGllcl9jb21wYXQuaCBiL2RyaXZlcnMvc3RhZ2luZy9mcm9udGllci9mcm9udGllcl9jb21wYXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDQ1MGU2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2Zyb250aWVyL2Zyb250aWVyX2NvbXBhdC5oCkBAIC0wLDAgKzEsNjMgQEAKKy8qIFVTQiBkZWZpbmVzIGZvciBvbGRlciBrZXJuZWxzICovCisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLCA2LCAxOSkKKworLyoqCisgKiB1c2JfZW5kcG9pbnRfZGlyX291dCAtIGNoZWNrIGlmIHRoZSBlbmRwb2ludCBoYXMgT1VUIGRpcmVjdGlvbgorICogQGVwZDogZW5kcG9pbnQgdG8gYmUgY2hlY2tlZAorICoKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZW5kcG9pbnQgaXMgb2YgdHlwZSBPVVQsIG90aGVyd2lzZSBpdCByZXR1cm5zIGZhbHNlLgorICovCisKK3N0YXRpYyBpbmxpbmUgaW50IHVzYl9lbmRwb2ludF9kaXJfb3V0KGNvbnN0IHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZXBkKQoreworICAgICAgIHJldHVybiAoKGVwZC0+YkVuZHBvaW50QWRkcmVzcyAmIFVTQl9FTkRQT0lOVF9ESVJfTUFTSykgPT0gVVNCX0RJUl9PVVQpOworfQorCitzdGF0aWMgaW5saW5lIGludCB1c2JfZW5kcG9pbnRfZGlyX2luKGNvbnN0IHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZXBkKQoreworICAgICAgIHJldHVybiAoKGVwZC0+YkVuZHBvaW50QWRkcmVzcyAmIFVTQl9FTkRQT0lOVF9ESVJfTUFTSykgPT0gVVNCX0RJUl9JTik7Cit9CisKKworLyoqCisgKiB1c2JfZW5kcG9pbnRfeGZlcl9pbnQgLSBjaGVjayBpZiB0aGUgZW5kcG9pbnQgaGFzIGludGVycnVwdCB0cmFuc2ZlciB0eXBlCisgKiBAZXBkOiBlbmRwb2ludCB0byBiZSBjaGVja2VkCisgKgorICogUmV0dXJucyB0cnVlIGlmIHRoZSBlbmRwb2ludCBpcyBvZiB0eXBlIGludGVycnVwdCwgb3RoZXJ3aXNlIGl0IHJldHVybnMKKyAqIGZhbHNlLgorICovCitzdGF0aWMgaW5saW5lIGludCB1c2JfZW5kcG9pbnRfeGZlcl9pbnQoY29uc3Qgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplcGQpCit7CisgICAgICAgcmV0dXJuICgoZXBkLT5ibUF0dHJpYnV0ZXMgJiBVU0JfRU5EUE9JTlRfWEZFUlRZUEVfTUFTSykgPT0KKyAgICAgICAgICAgICAgIFVTQl9FTkRQT0lOVF9YRkVSX0lOVCk7Cit9CisKKworLyoqCisgKiB1c2JfZW5kcG9pbnRfaXNfaW50X2luIC0gY2hlY2sgaWYgdGhlIGVuZHBvaW50IGlzIGludGVycnVwdCBJTgorICogQGVwZDogZW5kcG9pbnQgdG8gYmUgY2hlY2tlZAorICoKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZW5kcG9pbnQgaGFzIGludGVycnVwdCB0cmFuc2ZlciB0eXBlIGFuZCBJTiBkaXJlY3Rpb24sCisgKiBvdGhlcndpc2UgaXQgcmV0dXJucyBmYWxzZS4KKyAqLworCitzdGF0aWMgaW5saW5lIGludCB1c2JfZW5kcG9pbnRfaXNfaW50X2luKGNvbnN0IHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZXBkKQoreworICAgICAgIHJldHVybiAodXNiX2VuZHBvaW50X3hmZXJfaW50KGVwZCkgJiYgdXNiX2VuZHBvaW50X2Rpcl9pbihlcGQpKTsKK30KKworLyoqCisgKiB1c2JfZW5kcG9pbnRfaXNfaW50X291dCAtIGNoZWNrIGlmIHRoZSBlbmRwb2ludCBpcyBpbnRlcnJ1cHQgT1VUCisgKiBAZXBkOiBlbmRwb2ludCB0byBiZSBjaGVja2VkCisgKgorICogUmV0dXJucyB0cnVlIGlmIHRoZSBlbmRwb2ludCBoYXMgaW50ZXJydXB0IHRyYW5zZmVyIHR5cGUgYW5kIE9VVCBkaXJlY3Rpb24sCisgKiBvdGhlcndpc2UgaXQgcmV0dXJucyBmYWxzZS4KKyAqLworCitzdGF0aWMgaW5saW5lIGludCB1c2JfZW5kcG9pbnRfaXNfaW50X291dChjb25zdCBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVwZCkKK3sKKyAgICAgICByZXR1cm4gKHVzYl9lbmRwb2ludF94ZmVyX2ludChlcGQpICYmIHVzYl9lbmRwb2ludF9kaXJfb3V0KGVwZCkpOworfQorCisjZW5kaWYgLyogb2xkZXIga2VybmVsIHZlcnNpb25zICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZnJvbnRpZXIvc3VyZmFjZV9zeXNmcy5oIGIvZHJpdmVycy9zdGFnaW5nL2Zyb250aWVyL3N1cmZhY2Vfc3lzZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTBhNTYyZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9mcm9udGllci9zdXJmYWNlX3N5c2ZzLmgKQEAgLTAsMCArMSwxMDAgQEAKKy8qIElmIHlvdSBhcmUgZ29pbmcgdG8gYWJ1c2UgdGhlIHByZXByb2Nlc3Nvciwgd2h5IG5vdCBBQlVTRSB0aGUgcHJlcHJvY2Vzc29yPworICAgSSBzdHVjayB0aGlzIGhlYWRlciBpbiBhIHNlcGFyYXRlIGZpbGUgc28gSSBkb24ndCBoYXZlIHRvIGxvb2sgYXQgaXQgKi8KKworLy8gRklYTUUgTmVlZCBsb2NraW5nIG9yIGF0b21pYyBvcHMKKworI2RlZmluZSBzaG93X3NldF9tYml0KGRuYW1lLHZhbHVlLGJpdCkJCQkJCQkJCQkJCQkJCQkJCQkJXAorc3RhdGljIHNzaXplX3Qgc2hvd18jI3ZhbHVlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikJCVwKK3sJCQkJCQkJCQlcCisJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYgPSB0b191c2JfaW50ZXJmYWNlKGRldik7CQlcCisJc3RydWN0IHVzYl8jI2RuYW1lICp0ID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsJCQlcCisJaW50IHRlbXAgPSAoMSAmJiAodC0+dmFsdWUgJiAoMSA8PCBiaXQpKSk7CQkJCQlcCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHRlbXApOwkJCVwKK30JCQkJCQkJCQlcCitzdGF0aWMgc3NpemVfdCBzZXRfIyN2YWx1ZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkJXAorewkJCQkJCQkJCVwKKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiA9IHRvX3VzYl9pbnRlcmZhY2UoZGV2KTsJCVwKKwlzdHJ1Y3QgdXNiXyMjZG5hbWUgKnQgPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOwkJCVwKKwlpbnQgdGVtcCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOwkJCVwKKwlpZih0ZW1wID4gMCkgeyBsb25nIGIgPSAxIDw8IGJpdDsgdC0+dmFsdWUgfD0gYjsgfSBcCisJZWxzZSB7IGxvbmcgYiA9IH4oMSA8PCBiaXQpOyB0LT52YWx1ZSAmPSBiIDsJCQkJIFwKKwlyZXR1cm4gY291bnQ7CQkJCQkJCVwKK30JCQkJCQkJCQlcCitzdGF0aWMgREVWSUNFX0FUVFIodmFsdWUsIFNfSVdVR08gfCBTX0lSVUdPLCBzaG93XyMjdmFsdWUsIHNldF8jI3ZhbHVlKTsKKworI2RlZmluZSBzaG93X3NldF9lYml0KGRuYW1lLGVudW1uYW1lLHZhbHVlLGJpdCkJCQkJCQkJCQkJCQkJCQkJCQkJXAorc3RhdGljIHNzaXplX3Qgc2hvd18jI2JpdChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCQlcCit7CQkJCQkJCQkJXAorCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmID0gdG9fdXNiX2ludGVyZmFjZShkZXYpOwkJXAorCXN0cnVjdCB1c2JfIyNkbmFtZSAqdCA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CQkJXAorICBlbnVtIGVudW1uYW1lIGwgPSBiaXQ7IFwKKyAgaW50IHRlbXAgPSB0LT52YWx1ZSAmICgxIDw8IGwpOwkJCQkJCVwKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgdGVtcCk7CQkJXAorfQkJCQkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90IHNldF8jI2JpdChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkJXAorewkJCQkJCQkJCVwKKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiA9IHRvX3VzYl9pbnRlcmZhY2UoZGV2KTsJCVwKKwlzdHJ1Y3QgdXNiXyMjZG5hbWUgKnQgPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOwkJCVwKKwlpbnQgdGVtcCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOwkJCVwKKyAgZW51bSBlbnVtbmFtZSBsID0gYml0O1wKKwlsb25nIGIgID0gMSA8PCBsOyBcCisJaWYodGVtcCA+IDApIHsgdC0+dmFsdWUgfD0gYjsgfQlcCisJZWxzZSB7IHQtPnZhbHVlICY9IH5iIDsJCQkJXAorCXJldHVybiBjb3VudDsJCQkJCQkJXAorfQkJCQkJCQkJCVwKK3N0YXRpYyBERVZJQ0VfQVRUUih2YWx1ZSwgU19JV1VHTyB8IFNfSVJVR08sIHNob3dfIyN2YWx1ZSwgc2V0XyMjdmFsdWUpOworCisvLyBGSVhNRSBGT1IgQ09SUkVDVExZIFNFVFRJTkcgSEVYIGZyb20gYSBzdHJpbmcKKyNkZWZpbmUgc2hvd19zZXRfbWNtZChkbmFtZSx2YWx1ZSkJCQkJCQkJCQkJCQkJCQkJCQkJXAorc3RhdGljIHNzaXplX3Qgc2hvd18jI3ZhbHVlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikJCVwKK3sJCQkJCQkJCQlcCisJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYgPSB0b191c2JfaW50ZXJmYWNlKGRldik7CQlcCisJc3RydWN0IHVzYl8jI2RuYW1lICp0ID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsJCQlcCisgIGludCBjb3VudCA9IDA7XAorCWludCBpOyBcCisJZm9yIChpID0gMCxpPHNpemVvZihkbmFtZSk7IGkrKykgY291bnQgKz0gc25wcmludGYoYnVmLCAiJTAyeCIsdC0+ZG5hbWVbaV0pOyBcCisgIHJldHVybihjb3VudCk7XAorfQkJCQkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90IHNldF8jI3ZhbHVlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQlcCit7CQkJCQkJCQkJXAorCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmID0gdG9fdXNiX2ludGVyZmFjZShkZXYpOwkJXAorCXN0cnVjdCB1c2JfIyNkbmFtZSAqdCA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CQkJXAorCWludCB0ZW1wID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7CQkJXAorCXQtPnZhbHVlID0gdGVtcDsJCQkJCQlcCisJcmV0dXJuIGNvdW50OwkJCQkJCQlcCit9CQkJCQkJCQkJXAorc3RhdGljIERFVklDRV9BVFRSKHZhbHVlLCBTX0lXVUdPIHwgU19JUlVHTywgc2hvd18jI3ZhbHVlLCBzZXRfIyN2YWx1ZSk7CisKKyNkZWZpbmUgc2hvd19zZXRfbWludChkbmFtZSx2YWx1ZSkJCQkJXAorc3RhdGljIHNzaXplX3Qgc2hvd18jI3ZhbHVlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikJCVwKK3sJCQkJCQkJCQlcCisJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYgPSB0b191c2JfaW50ZXJmYWNlKGRldik7CQlcCisJc3RydWN0IHVzYl8jI2RuYW1lICp0ID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsJCQlcCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHQtPnZhbHVlKTsJCQlcCit9CQkJCQkJCQkJXAorc3RhdGljIHNzaXplX3Qgc2V0XyMjdmFsdWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCVwKK3sJCQkJCQkJCQlcCisJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYgPSB0b191c2JfaW50ZXJmYWNlKGRldik7CQlcCisJc3RydWN0IHVzYl8jI2RuYW1lICp0ID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsJCQlcCisJaW50IHRlbXAgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsJCQlcCisJdC0+dmFsdWUgPSB0ZW1wOwkJCQkJCVwKKwlyZXR1cm4gY291bnQ7CQkJCQkJCVwKK30JCQkJCQkJCQlcCitzdGF0aWMgREVWSUNFX0FUVFIodmFsdWUsIFNfSVdVR08gfCBTX0lSVUdPLCBzaG93XyMjdmFsdWUsIHNldF8jI3ZhbHVlKTsKKworI2RlZmluZSBzaG93X3NldF9tY2hhcihkbmFtZSx2YWx1ZSkJCQkJCQkJCQkJCQkJCQkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90IHNob3dfIyN2YWx1ZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCQlcCit7CQkJCQkJCQkJXAorCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmID0gdG9fdXNiX2ludGVyZmFjZShkZXYpOwkJXAorCXN0cnVjdCB1c2JfIyNkbmFtZSAqdCA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CQkJXAorCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVjXG4iLCB0LT52YWx1ZSk7CQkJXAorfQkJCQkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90IHNldF8jI3ZhbHVlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQlcCit7CQkJCQkJCQkJXAorCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmID0gdG9fdXNiX2ludGVyZmFjZShkZXYpOwkJXAorCXN0cnVjdCB1c2JfIyNkbmFtZSAqdCA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CQkJXAorCWludCB0ZW1wID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7CQkJXAorCXQtPnZhbHVlID0gdGVtcDsJCQkJCQlcCisJcmV0dXJuIGNvdW50OwkJCQkJCQlcCit9CQkJCQkJCQkJXAorc3RhdGljIERFVklDRV9BVFRSKHZhbHVlLCBTX0lXVUdPIHwgU19JUlVHTywgc2hvd18jI3ZhbHVlLCBzZXRfIyN2YWx1ZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZnJvbnRpZXIvdHJhbnpwb3J0LmMgYi9kcml2ZXJzL3N0YWdpbmcvZnJvbnRpZXIvdHJhbnpwb3J0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzlhYmI2YgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9mcm9udGllci90cmFuenBvcnQuYwpAQCAtMCwwICsxLDEwMDYgQEAKKy8qCisgKiBGcm9udGllciBEZXNpZ25zIFRyYW56cG9ydCBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWljaGFlbCBUYWh0IChtQHRhaHQubmV0KQorICoKKyAqIEJhc2VkIG9uIHRoZSB1c2JsZWQgZHJpdmVyIGFuZCBsZHVzYiBkcml2ZXJzIGJ5CisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0IEdyZWcgS3JvYWgtSGFydG1hbiAoZ3JlZ0Brcm9haC5jb20pCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgTWljaGFlbCBIdW5kIDxtaHVuZEBsZC1kaWRhY3RpYy5kZT4KKyAqCisgKiBUaGUgbGR1c2IgZHJpdmVyIHdhcywgaW4gdHVybiwgZGVyaXZlZCBmcm9tIExlZ28gVVNCIFRvd2VyIGRyaXZlcgorICogQ29weXJpZ2h0IChDKSAyMDAzIERhdmlkIEdsYW5jZSA8YWR2aWRnc2ZAc291cmNlZm9yZ2UubmV0PgorICoJCSAyMDAxLTIwMDQgSnVlcmdlbiBTdHViZXIgPHN0YXJibHVlQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICoJcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHZlcnNpb24gMi4KKyAqCisgKi8KKworLyoqCisgKiBUaGlzIGRyaXZlciB1c2VzIGEgcmluZyBidWZmZXIgZm9yIHRpbWUgY3JpdGljYWwgcmVhZGluZyBvZgorICogaW50ZXJydXB0IGluIHJlcG9ydHMgYW5kIHByb3ZpZGVzIHJlYWQgYW5kIHdyaXRlIG1ldGhvZHMgZm9yCisgKiByYXcgaW50ZXJydXB0IHJlcG9ydHMuCisgKi8KKworLyogTm90ZTogdGhpcyBjdXJyZW50bHkgdXNlcyBhIGR1bWIgcmluZ2J1ZmZlciBmb3IgcmVhZHMgYW5kIHdyaXRlcy4KKyAqIEEgbW9yZSBvcHRpbWFsIGRyaXZlciB3b3VsZCBjYWNoZSBhbmQga2lsbCBvZmYgb3V0c3RhbmRpbmcgdXJicyB0aGF0IGFyZQorICogbm93IGludmFsaWQsIGFuZCBpZ25vcmUgb25lcyB0aGF0IGFscmVhZHkgd2VyZSBpbiB0aGUgcXVldWUgYnV0IHZhbGlkCisgKiBhcyB3ZSBvbmx5IGhhdmUgMTcgY29tbWFuZHMgZm9yIHRoZSB0cmFuenBvcnQuIEluIHBhcnRpY3VsYXIgdGhpcyBpcworICoga2V5IGZvciBnZXR0aW5nIGxpZ2h0cyB0byBmbGFzaCBpbiB0aW1lIGFzIG90aGVyd2lzZSBtYW55IGNvbW1hbmRzCisgKiBjYW4gYmUgYnVmZmVyZWQgdXAgYmVmb3JlIHRoZSBsaWdodCBjaGFuZ2UgbWFrZXMgaXQgdG8gdGhlIGludGVyZmFjZS4KKyovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CisjaW5jbHVkZSA8bGludXgvdXNiLmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiwgNiwgMTkpCisjaW5jbHVkZSBmcm9udGllcl9jb21wYXQuaAorI2VuZGlmCisKKy8qIERlZmluZSB0aGVzZSB2YWx1ZXMgdG8gbWF0Y2ggeW91ciBkZXZpY2VzICovCisjZGVmaW5lIFZFTkRPUl9JRCAgIDB4MTY1YgorI2RlZmluZSBQUk9EVUNUX0lECTB4ODEwMQorCisjaWZkZWYgQ09ORklHX1VTQl9EWU5BTUlDX01JTk9SUworI2RlZmluZSBVU0JfVFJBTlpQT1JUX01JTk9SX0JBU0UJMAorI2Vsc2UKKy8vIEZJWE1FIDE3NiAtIGlzIHRoZSBsZHVzYiBkcml2ZXIncyBtaW5vciAtIGFwcGx5IGZvciBhIG1pbm9yIHNvb24KKyNkZWZpbmUgVVNCX1RSQU5aUE9SVF9NSU5PUl9CQVNFCTE3NworI2VuZGlmCisKKy8qIHRhYmxlIG9mIGRldmljZXMgdGhhdCB3b3JrIHdpdGggdGhpcyBkcml2ZXIgKi8KK3N0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9pZCB1c2JfdHJhbnpwb3J0X3RhYmxlIFtdID0geworCXsgVVNCX0RFVklDRShWRU5ET1JfSUQsIFBST0RVQ1RfSUQpIH0sCisJeyB9CQkJCQkvKiBUZXJtaW5hdGluZyBlbnRyeSAqLworfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRSh1c2IsIHVzYl90cmFuenBvcnRfdGFibGUpOworTU9EVUxFX1ZFUlNJT04oIjAuMzMiKTsKK01PRFVMRV9BVVRIT1IoIk1pa2UgVGFodCA8bUB0YWh0Lm5ldD4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiVHJhbnpwb3J0IFVTQiBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9TVVBQT1JURURfREVWSUNFKCJGcm9udGllciBEZXNpZ25zIFRyYW56cG9ydCBDb250cm9sIFN1cmZhY2UiKTsKKworLyogVGhlc2UgdHdvIGFyZW4ndCBkb25lIHlldCAqLworCisjZGVmaW5lIFNVUFBSRVNTX0VYVFJBX09OTElORV9FVkVOVFMgMAorI2RlZmluZSBCVUZGRVJFRF9XUklURVMgMAorCisjZGVmaW5lIFNVUFBSRVNTX0VYVFJBX09GRkxJTkVfRVZFTlRTIDEKKyNkZWZpbmUgQ09NUFJFU1NfV0hFRUxfRVZFTlRTIDEKKyNkZWZpbmUgQlVGRkVSRURfUkVBRFMgMQorI2RlZmluZSBSSU5HX0JVRkZFUl9TSVpFIDEwMDAKKyNkZWZpbmUgV1JJVEVfQlVGRkVSX1NJWkUgMzQKKyNkZWZpbmUgVFJBTlpQT1JUX1VTQl9USU1FT1VUIDEwCisKKworc3RhdGljIGludCBkZWJ1ZyA9IDA7CisKKy8qIFVzZSBvdXIgb3duIGRiZyBtYWNybyAqLworI2RlZmluZSBkYmdfaW5mbyhkZXYsIGZvcm1hdCwgYXJnLi4uKSBkbyB7IGlmIChkZWJ1ZykgZGV2X2luZm8oZGV2ICwgZm9ybWF0ICwgIyMgYXJnKTsgfSB3aGlsZSAoMCkKKworLyogTW9kdWxlIHBhcmFtZXRlcnMgKi8KKworbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIFNfSVJVR08gfCBTX0lXVVNSKTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJEZWJ1ZyBlbmFibGVkIG9yIG5vdCIpOworCisvKiBBbGwgaW50ZXJydXB0IGluIHRyYW5zZmVycyBhcmUgY29sbGVjdGVkIGluIGEgcmluZyBidWZmZXIgdG8KKyAqIGF2b2lkIHJhY2luZyBjb25kaXRpb25zIGFuZCBnZXQgYmV0dGVyIHBlcmZvcm1hbmNlIG9mIHRoZSBkcml2ZXIuCisgKi8KKworc3RhdGljIGludCByaW5nX2J1ZmZlcl9zaXplID0gUklOR19CVUZGRVJfU0laRTsKKworbW9kdWxlX3BhcmFtKHJpbmdfYnVmZmVyX3NpemUsIGludCwgIFNfSVJVR08pOworTU9EVUxFX1BBUk1fREVTQyhyaW5nX2J1ZmZlcl9zaXplLCAiUmVhZCByaW5nIGJ1ZmZlciBzaXplIGluIHJlcG9ydHMiKTsKKworLyogVGhlIHdyaXRlX2J1ZmZlciBjYW4gb25lIGRheSBjb250YWluIG1vcmUgdGhhbiBvbmUgaW50ZXJydXB0IG91dCB0cmFuc2Zlci4KKyAqLworc3RhdGljIGludCB3cml0ZV9idWZmZXJfc2l6ZSA9IFdSSVRFX0JVRkZFUl9TSVpFOworbW9kdWxlX3BhcmFtKHdyaXRlX2J1ZmZlcl9zaXplLCBpbnQsICBTX0lSVUdPKTsKK01PRFVMRV9QQVJNX0RFU0Mod3JpdGVfYnVmZmVyX3NpemUsICJXcml0ZSBidWZmZXIgc2l6ZSIpOworCisvKgorICogSW5jcmVhc2UgdGhlIGludGVydmFsIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMuCisgKiBvciBzZXQgdG8gMSB0byB1c2UgdGhlIHN0YW5kYXJkIGludGVydmFsIGZyb20gdGhlIGVuZHBvaW50IGRlc2NyaXB0b3JzLgorICovCisKK3N0YXRpYyBpbnQgbWluX2ludGVycnVwdF9pbl9pbnRlcnZhbCA9IFRSQU5aUE9SVF9VU0JfVElNRU9VVDsKK21vZHVsZV9wYXJhbShtaW5faW50ZXJydXB0X2luX2ludGVydmFsLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhtaW5faW50ZXJydXB0X2luX2ludGVydmFsLCAiTWluaW11bSBpbnRlcnJ1cHQgaW4gaW50ZXJ2YWwgaW4gbXMiKTsKKworc3RhdGljIGludCBtaW5faW50ZXJydXB0X291dF9pbnRlcnZhbCA9IFRSQU5aUE9SVF9VU0JfVElNRU9VVDsKK21vZHVsZV9wYXJhbShtaW5faW50ZXJydXB0X291dF9pbnRlcnZhbCwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MobWluX2ludGVycnVwdF9vdXRfaW50ZXJ2YWwsICJNaW5pbXVtIGludGVycnVwdCBvdXQgaW50ZXJ2YWwgaW4gbXMiKTsKKworc3RydWN0IHRyYW56cG9ydF9jbWQgeworICAgIHVuc2lnbmVkIGNoYXIgY21kWzhdOworfTsKKworZW51bSBMaWdodElEIHsKKwlMaWdodFJlY29yZCA9IDAsCisJTGlnaHRUcmFja3JlYywKKwlMaWdodFRyYWNrbXV0ZSwKKwlMaWdodFRyYWNrc29sbywKKwlMaWdodEFueXNvbG8sCisJTGlnaHRMb29wLAorCUxpZ2h0UHVuY2gKKwl9OworCisvKiBTdHJ1Y3R1cmUgdG8gaG9sZCBhbGwgb2Ygb3VyIGRldmljZSBzcGVjaWZpYyBzdHVmZiAqLworCitzdHJ1Y3QgdXNiX3RyYW56cG9ydCB7CisJc3RydWN0IHNlbWFwaG9yZQlzZW07CQkvKiBsb2NrcyB0aGlzIHN0cnVjdHVyZSAqLworCXN0cnVjdCB1c2JfaW50ZXJmYWNlKglpbnRmOwkJLyogc2F2ZSBvZmYgdGhlIHVzYiBpbnRlcmZhY2UgcG9pbnRlciAqLworCisJaW50CQkJb3Blbl9jb3VudDsJLyogbnVtYmVyIG9mIHRpbWVzIHRoaXMgcG9ydCBoYXMgYmVlbiBvcGVuZWQgKi8KKworCXN0cnVjdCB0cmFuenBvcnRfY21kCSgqcmluZ19idWZmZXIpW1JJTkdfQlVGRkVSX1NJWkVdOyAvKiBqdXN0IG1ha2UgYyBoYXBweSAqLworCXVuc2lnbmVkIGludAkJcmluZ19oZWFkOworCXVuc2lnbmVkIGludAkJcmluZ190YWlsOworCisJd2FpdF9xdWV1ZV9oZWFkX3QJcmVhZF93YWl0OworCXdhaXRfcXVldWVfaGVhZF90CXdyaXRlX3dhaXQ7CisKKwl1bnNpZ25lZCBjaGFyKgkJaW50ZXJydXB0X2luX2J1ZmZlcjsKKwlzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IqIGludGVycnVwdF9pbl9lbmRwb2ludDsKKwlzdHJ1Y3QgdXJiKgkJaW50ZXJydXB0X2luX3VyYjsKKwlpbnQJCQlpbnRlcnJ1cHRfaW5faW50ZXJ2YWw7CisJc2l6ZV90CWludGVycnVwdF9pbl9lbmRwb2ludF9zaXplOworCWludAkJCWludGVycnVwdF9pbl9ydW5uaW5nOworCWludAkJCWludGVycnVwdF9pbl9kb25lOworCisJY2hhcioJCQlpbnRlcnJ1cHRfb3V0X2J1ZmZlcjsKKwlzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IqIGludGVycnVwdF9vdXRfZW5kcG9pbnQ7CisJc3RydWN0IHVyYioJCWludGVycnVwdF9vdXRfdXJiOworCWludAkJCWludGVycnVwdF9vdXRfaW50ZXJ2YWw7CisJc2l6ZV90CWludGVycnVwdF9vdXRfZW5kcG9pbnRfc2l6ZTsKKwlpbnQJCQlpbnRlcnJ1cHRfb3V0X2J1c3k7CisKKwkvKiBTeXNmcyBhbmQgdHJhbnNsYXRpb24gc3VwcG9ydCAqLworCisJaW50IGV2ZW50OyAvKiBhbHRlcm5hdGUgaW50ZXJmYWNlIHRvIGV2ZW50cyAqLworCWludCB3aGVlbDsgLyogLSBmb3IgbmVnYXRpdmUsIDAgZm9yIG5vbmUsICsgZm9yIHBvc2l0aXZlICovCisJdW5zaWduZWQgY2hhciBkdW1wX3N0YXRlOyAvKiAwIGlmIGRpc2FibGVkIDEgaWYgZW5hYmxlZCAqLworCXVuc2lnbmVkIGNoYXIgZW5hYmxlOyAvKiAwIGlmIGRpc2FibGVkIDEgaWYgZW5hYmxlZCAqLworCXVuc2lnbmVkIGNoYXIgb2ZmbGluZTsgLyogaWYgdGhlIGRldmljZSBpcyBvdXQgb2YgcmFuZ2Ugb3IgYXNsZWVwICovCisJdW5zaWduZWQgY2hhciBjb21wcmVzc193aGVlbDsgLyogZmxhZyB0byBjb21wcmVzcyB3aGVlbCBldmVudHMgKi8KKwl1bnNpZ25lZCBjaGFyIGxpZ2h0OyAvKiA3IGJpdHMgdXNlZCAqLworCXVuc2lnbmVkIGNoYXIgbGFzdF9jbWRbOF07CisJdW5zaWduZWQgY2hhciBsYXN0X2lucHV0WzhdOworCXVuc2lnbmVkIGNoYXIgc2NyZWVuWzQwXTsgLy8gV2UnbGwgYWxzbyBoYXZlIGNlbGxzCisKK307CisKKy8qIHByZXZlbnQgcmFjZXMgYmV0d2VlbiBvcGVuKCkgYW5kIGRpc2Nvbm5lY3QoKSAqLworc3RhdGljIERFRklORV9NVVRFWChkaXNjb25uZWN0X211dGV4KTsKKworc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIHVzYl90cmFuenBvcnRfZHJpdmVyOworCisvKioKKyAqCXVzYl90cmFuenBvcnRfYWJvcnRfdHJhbnNmZXJzCisgKiAgICAgIGFib3J0cyB0cmFuc2ZlcnMgYW5kIGZyZWVzIGFzc29jaWF0ZWQgZGF0YSBzdHJ1Y3R1cmVzCisgKi8KK3N0YXRpYyB2b2lkIHVzYl90cmFuenBvcnRfYWJvcnRfdHJhbnNmZXJzKHN0cnVjdCB1c2JfdHJhbnpwb3J0ICpkZXYpCit7CisJLyogc2h1dGRvd24gdHJhbnNmZXIgKi8KKwlpZiAoZGV2LT5pbnRlcnJ1cHRfaW5fcnVubmluZykgeworCQlkZXYtPmludGVycnVwdF9pbl9ydW5uaW5nID0gMDsKKwkJaWYgKGRldi0+aW50ZikKKwkJCXVzYl9raWxsX3VyYihkZXYtPmludGVycnVwdF9pbl91cmIpOworCX0KKwlpZiAoZGV2LT5pbnRlcnJ1cHRfb3V0X2J1c3kpCisJCWlmIChkZXYtPmludGYpCisJCQl1c2Jfa2lsbF91cmIoZGV2LT5pbnRlcnJ1cHRfb3V0X3VyYik7Cit9CisKKy8vIEZJWE1FIH5saWdodCBub3QgZ29vZCBlbm91Z2ggb3IgY29ycmVjdCAtIG5lZWQgYXRvbWljIHNldF9iaXQKKworI2RlZmluZSBzaG93X3NldF9saWdodCh2YWx1ZSkJXAorc3RhdGljIHNzaXplX3Qgc2hvd18jI3ZhbHVlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikJCVwKK3sJCQkJCQkJCQlcCisJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYgPSB0b191c2JfaW50ZXJmYWNlKGRldik7CQlcCisJc3RydWN0IHVzYl90cmFuenBvcnQgKnQgPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOwkJXAorCWVudW0gTGlnaHRJRCBsaWdodCA9IHZhbHVlOwkJCQkJXAorCWludCB0ZW1wID0gKDEgJiYgKHQtPmxpZ2h0ICYgKDEgPDwgbGlnaHQpKSk7CQkJXAorCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCB0ZW1wICk7CQkJCVwKK30JCQkJCQkJCQlcCitzdGF0aWMgc3NpemVfdCBzZXRfIyN2YWx1ZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkJXAorewkJCQkJCQkJCVwKKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiA9IHRvX3VzYl9pbnRlcmZhY2UoZGV2KTsJCVwKKwlzdHJ1Y3QgdXNiX3RyYW56cG9ydCAqdCA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CQlcCisJaW50IHRlbXAgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsJCQlcCisJZW51bSBMaWdodElEIGxpZ2h0ID0gKHRlbXAgPDwgdmFsdWUpICYgKHQtPmxpZ2h0IDw8IHZhbHVlKTsJXAorCXQtPmxpZ2h0ID0gKHQtPmxpZ2h0ICYgfmxpZ2h0KSA7CQkJCVwKKwlyZXR1cm4gY291bnQ7CQkJCQkJCVwKK30JCQkJCQkJCQlcCitzdGF0aWMgREVWSUNFX0FUVFIodmFsdWUsIFNfSVdVR08gfCBTX0lSVUdPLCBzaG93XyMjdmFsdWUsIHNldF8jI3ZhbHVlKTsKKworc2hvd19zZXRfbGlnaHQoTGlnaHRSZWNvcmQpOworc2hvd19zZXRfbGlnaHQoTGlnaHRUcmFja3JlYyk7CitzaG93X3NldF9saWdodChMaWdodFRyYWNrbXV0ZSk7CitzaG93X3NldF9saWdodChMaWdodFRyYWNrc29sbyk7CitzaG93X3NldF9saWdodChMaWdodEFueXNvbG8pOworc2hvd19zZXRfbGlnaHQoTGlnaHRMb29wKTsKK3Nob3dfc2V0X2xpZ2h0KExpZ2h0UHVuY2gpOworCisKKyNkZWZpbmUgc2hvd19zZXRfaW50KHZhbHVlKQlcCitzdGF0aWMgc3NpemVfdCBzaG93XyMjdmFsdWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQkJXAorewkJCQkJCQkJCVwKKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiA9IHRvX3VzYl9pbnRlcmZhY2UoZGV2KTsJCVwKKwlzdHJ1Y3QgdXNiX3RyYW56cG9ydCAqdCA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CQkJXAorCQkJCQkJCQkJXAorCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCB0LT52YWx1ZSk7CQkJXAorfQkJCQkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90IHNldF8jI3ZhbHVlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQlcCit7CQkJCQkJCQkJXAorCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmID0gdG9fdXNiX2ludGVyZmFjZShkZXYpOwkJXAorCXN0cnVjdCB1c2JfdHJhbnpwb3J0ICp0ID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsJCQlcCisJaW50IHRlbXAgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsJCQlcCisJCQkJCQkJCQlcCisJdC0+dmFsdWUgPSB0ZW1wOwkJCQkJCVwKKwlyZXR1cm4gY291bnQ7CQkJCQkJCVwKK30JCQkJCQkJCQlcCitzdGF0aWMgREVWSUNFX0FUVFIodmFsdWUsIFNfSVdVR08gfCBTX0lSVUdPLCBzaG93XyMjdmFsdWUsIHNldF8jI3ZhbHVlKTsKKworc2hvd19zZXRfaW50KGVuYWJsZSk7CitzaG93X3NldF9pbnQob2ZmbGluZSk7CitzaG93X3NldF9pbnQoY29tcHJlc3Nfd2hlZWwpOworc2hvd19zZXRfaW50KGR1bXBfc3RhdGUpOworc2hvd19zZXRfaW50KHdoZWVsKTsKK3Nob3dfc2V0X2ludChldmVudCk7CisKKyNkZWZpbmUgc2hvd19zZXRfY21kKHZhbHVlKQlcCitzdGF0aWMgc3NpemVfdCBzaG93XyMjdmFsdWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQkJXAorewkJCQkJCQkJCVwKKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiA9IHRvX3VzYl9pbnRlcmZhY2UoZGV2KTsJCVwKKwlzdHJ1Y3QgdXNiX3RyYW56cG9ydCAqdCA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CQkJXAorCQkJCQkJCQkJXAorCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCB0LT52YWx1ZSk7CQkJXAorfQkJCQkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90IHNldF8jI3ZhbHVlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQlcCit7CQkJCQkJCQkJXAorCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmID0gdG9fdXNiX2ludGVyZmFjZShkZXYpOwkJXAorCXN0cnVjdCB1c2JfdHJhbnpwb3J0ICp0ID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsJCQlcCisJaW50IHRlbXAgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsJCQlcCisJCQkJCQkJCQlcCisJdC0+dmFsdWUgPSB0ZW1wOwkJCQkJCVwKKwlyZXR1cm4gY291bnQ7CQkJCQkJCVwKK30JCQkJCQkJCQlcCitzdGF0aWMgREVWSUNFX0FUVFIodmFsdWUsIFNfSVdVR08gfCBTX0lSVUdPLCBzaG93XyMjdmFsdWUsIHNldF8jI3ZhbHVlKTsKKworCisKKworLyoqCisgKgl1c2JfdHJhbnpwb3J0X2RlbGV0ZQorICovCitzdGF0aWMgdm9pZCB1c2JfdHJhbnpwb3J0X2RlbGV0ZShzdHJ1Y3QgdXNiX3RyYW56cG9ydCAqZGV2KQoreworCXVzYl90cmFuenBvcnRfYWJvcnRfdHJhbnNmZXJzKGRldik7CisJLyogIFRoaXMgaXMganVzdCB0b28gdHdpc3RlZCB0byBiZSBjb3JyZWN0ICovCisJaWYoZGV2LT5pbnRmICE9IE5VTEwpIHsKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmRldi0+aW50Zi0+ZGV2LCAmZGV2X2F0dHJfTGlnaHRSZWNvcmQpOworCWRldmljZV9yZW1vdmVfZmlsZSgmZGV2LT5pbnRmLT5kZXYsICZkZXZfYXR0cl9MaWdodFRyYWNrcmVjKTsKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmRldi0+aW50Zi0+ZGV2LCAmZGV2X2F0dHJfTGlnaHRUcmFja211dGUpOworCWRldmljZV9yZW1vdmVfZmlsZSgmZGV2LT5pbnRmLT5kZXYsICZkZXZfYXR0cl9MaWdodFRyYWNrc29sbyk7CisJZGV2aWNlX3JlbW92ZV9maWxlKCZkZXYtPmludGYtPmRldiwgJmRldl9hdHRyX0xpZ2h0VHJhY2ttdXRlKTsKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmRldi0+aW50Zi0+ZGV2LCAmZGV2X2F0dHJfTGlnaHRBbnlzb2xvKTsKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmRldi0+aW50Zi0+ZGV2LCAmZGV2X2F0dHJfTGlnaHRMb29wKTsKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmRldi0+aW50Zi0+ZGV2LCAmZGV2X2F0dHJfTGlnaHRQdW5jaCk7CisJZGV2aWNlX3JlbW92ZV9maWxlKCZkZXYtPmludGYtPmRldiwgJmRldl9hdHRyX3doZWVsKTsKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmRldi0+aW50Zi0+ZGV2LCAmZGV2X2F0dHJfZW5hYmxlKTsKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmRldi0+aW50Zi0+ZGV2LCAmZGV2X2F0dHJfZXZlbnQpOworCWRldmljZV9yZW1vdmVfZmlsZSgmZGV2LT5pbnRmLT5kZXYsICZkZXZfYXR0cl9vZmZsaW5lKTsKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmRldi0+aW50Zi0+ZGV2LCAmZGV2X2F0dHJfY29tcHJlc3Nfd2hlZWwpOworCisJZGV2aWNlX3JlbW92ZV9maWxlKCZkZXYtPmludGYtPmRldiwgJmRldl9hdHRyX2R1bXBfc3RhdGUpOworCX0KKworCS8qIGZyZWUgZGF0YSBzdHJ1Y3R1cmVzICovCisJdXNiX2ZyZWVfdXJiKGRldi0+aW50ZXJydXB0X2luX3VyYik7CisJdXNiX2ZyZWVfdXJiKGRldi0+aW50ZXJydXB0X291dF91cmIpOworCWtmcmVlKGRldi0+cmluZ19idWZmZXIpOworCWtmcmVlKGRldi0+aW50ZXJydXB0X2luX2J1ZmZlcik7CisJa2ZyZWUoZGV2LT5pbnRlcnJ1cHRfb3V0X2J1ZmZlcik7CisJa2ZyZWUoZGV2KTsKK30KKworLyoqCisgKgl1c2JfdHJhbnpwb3J0X2ludGVycnVwdF9pbl9jYWxsYmFjaworICovCisKK3N0YXRpYyB2b2lkIHVzYl90cmFuenBvcnRfaW50ZXJydXB0X2luX2NhbGxiYWNrKHN0cnVjdCB1cmIgKnVyYikKK3sKKwlzdHJ1Y3QgdXNiX3RyYW56cG9ydCAqZGV2ID0gdXJiLT5jb250ZXh0OworCXVuc2lnbmVkIGludCBuZXh0X3JpbmdfaGVhZDsKKwlpbnQgcmV0dmFsID0gLTE7CisKKwlpZiAodXJiLT5zdGF0dXMpIHsKKwkJaWYgKHVyYi0+c3RhdHVzID09IC1FTk9FTlQgfHwKKwkJICAgIHVyYi0+c3RhdHVzID09IC1FQ09OTlJFU0VUIHx8CisJCSAgICB1cmItPnN0YXR1cyA9PSAtRVNIVVRET1dOKSB7CisJCQlnb3RvIGV4aXQ7CisJCX0gZWxzZSB7CisJCQlkYmdfaW5mbygmZGV2LT5pbnRmLT5kZXYsICIlczogbm9uemVybyBzdGF0dXMgcmVjZWl2ZWQ6ICVkXG4iLAorCQkJCSBfX2Z1bmNfXywgdXJiLT5zdGF0dXMpOworCQkJZ290byByZXN1Ym1pdDsgLyogbWF5YmUgd2UgY2FuIHJlY292ZXIgKi8KKwkJfQorCX0KKworCWlmICh1cmItPmFjdHVhbF9sZW5ndGggIT0gOCkgeworCQlkZXZfd2FybigmZGV2LT5pbnRmLT5kZXYsCisJCQkgIlVyYiBsZW5ndGggd2FzICVkIGJ5dGVzISEgRG8gc29tZXRoaW5nIGludGVsbGlnZW50IFxuIiwgdXJiLT5hY3R1YWxfbGVuZ3RoKTsKKwl9IGVsc2UgeworCQlkYmdfaW5mbygmZGV2LT5pbnRmLT5kZXYsICIlczogcmVjZWl2ZWQ6ICUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4XG4iLAorCQkJIF9fZnVuY19fLCBkZXYtPmludGVycnVwdF9pbl9idWZmZXJbMF0sZGV2LT5pbnRlcnJ1cHRfaW5fYnVmZmVyWzFdLGRldi0+aW50ZXJydXB0X2luX2J1ZmZlclsyXSxkZXYtPmludGVycnVwdF9pbl9idWZmZXJbM10sZGV2LT5pbnRlcnJ1cHRfaW5fYnVmZmVyWzRdLGRldi0+aW50ZXJydXB0X2luX2J1ZmZlcls1XSxkZXYtPmludGVycnVwdF9pbl9idWZmZXJbNl0sZGV2LT5pbnRlcnJ1cHRfaW5fYnVmZmVyWzddKTsKKyNpZiBTVVBQUkVTU19FWFRSQV9PRkZMSU5FX0VWRU5UUworCQlpZihkZXYtPm9mZmxpbmUgPT0gMiAmJiBkZXYtPmludGVycnVwdF9pbl9idWZmZXJbMV0gPT0gMHhmZikgeyBnb3RvIHJlc3VibWl0OyB9CisJCWlmKGRldi0+b2ZmbGluZSA9PSAxICYmIGRldi0+aW50ZXJydXB0X2luX2J1ZmZlclsxXSA9PSAweGZmKSB7IGRldi0+b2ZmbGluZSA9IDI7IGdvdG8gcmVzdWJtaXQ7IH0KKworLyogQWx3YXlzIHBhc3Mgb25lIG9mZmxpbmUgZXZlbnQgdXAgdGhlIHN0YWNrICovCisJCWlmKGRldi0+b2ZmbGluZSA+IDAgJiYgZGV2LT5pbnRlcnJ1cHRfaW5fYnVmZmVyWzFdICE9IDB4ZmYpIHsgZGV2LT5vZmZsaW5lID0gMDsgfQorCQlpZihkZXYtPm9mZmxpbmUgPT0gMCAmJiBkZXYtPmludGVycnVwdF9pbl9idWZmZXJbMV0gPT0gMHhmZikgeyBkZXYtPm9mZmxpbmUgPSAxOyB9CisKKyNlbmRpZgorCQlkYmdfaW5mbygmZGV2LT5pbnRmLT5kZXYsICIlczogaGVhZCwgdGFpbCBhcmUgJXgsICV4XG4iLCBfX2Z1bmNfXyxkZXYtPnJpbmdfaGVhZCxkZXYtPnJpbmdfdGFpbCk7CisKKwkJbmV4dF9yaW5nX2hlYWQgPSAoZGV2LT5yaW5nX2hlYWQrMSkgJSByaW5nX2J1ZmZlcl9zaXplOworCisJCWlmIChuZXh0X3JpbmdfaGVhZCAhPSBkZXYtPnJpbmdfdGFpbCkgeworCQkJbWVtY3B5KCYoKCpkZXYtPnJpbmdfYnVmZmVyKVtkZXYtPnJpbmdfaGVhZF0pLCBkZXYtPmludGVycnVwdF9pbl9idWZmZXIsIHVyYi0+YWN0dWFsX2xlbmd0aCk7CisJCQlkZXYtPnJpbmdfaGVhZCA9IG5leHRfcmluZ19oZWFkOworCQkJcmV0dmFsID0gMDsKKwkJCW1lbXNldChkZXYtPmludGVycnVwdF9pbl9idWZmZXIsIDAsIHVyYi0+YWN0dWFsX2xlbmd0aCk7CisJCX0gZWxzZSB7CisJCQlkZXZfd2FybigmZGV2LT5pbnRmLT5kZXYsCisJCQkJICJSaW5nIGJ1ZmZlciBvdmVyZmxvdywgJWQgYnl0ZXMgZHJvcHBlZFxuIiwKKwkJCQkgdXJiLT5hY3R1YWxfbGVuZ3RoKTsKKwkJCW1lbXNldChkZXYtPmludGVycnVwdF9pbl9idWZmZXIsIDAsIHVyYi0+YWN0dWFsX2xlbmd0aCk7CisJCX0KKwl9CisKK3Jlc3VibWl0OgorCS8qIHJlc3VibWl0IGlmIHdlJ3JlIHN0aWxsIHJ1bm5pbmcgKi8KKwlpZiAoZGV2LT5pbnRlcnJ1cHRfaW5fcnVubmluZyAmJiBkZXYtPmludGYpIHsKKwkJcmV0dmFsID0gdXNiX3N1Ym1pdF91cmIoZGV2LT5pbnRlcnJ1cHRfaW5fdXJiLCBHRlBfQVRPTUlDKTsKKwkJaWYgKHJldHZhbCkKKwkJCWRldl9lcnIoJmRldi0+aW50Zi0+ZGV2LAorCQkJCSJ1c2Jfc3VibWl0X3VyYiBmYWlsZWQgKCVkKVxuIiwgcmV0dmFsKTsKKwl9CisKK2V4aXQ6CisJZGV2LT5pbnRlcnJ1cHRfaW5fZG9uZSA9IDE7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZkZXYtPnJlYWRfd2FpdCk7Cit9CisKKy8qKgorICoJdXNiX3RyYW56cG9ydF9pbnRlcnJ1cHRfb3V0X2NhbGxiYWNrCisgKi8KK3N0YXRpYyB2b2lkIHVzYl90cmFuenBvcnRfaW50ZXJydXB0X291dF9jYWxsYmFjayhzdHJ1Y3QgdXJiICp1cmIpCit7CisJc3RydWN0IHVzYl90cmFuenBvcnQgKmRldiA9IHVyYi0+Y29udGV4dDsKKworCS8qIHN5bmMvYXN5bmMgdW5saW5rIGZhdWx0cyBhcmVuJ3QgZXJyb3JzICovCisJaWYgKHVyYi0+c3RhdHVzICYmICEodXJiLT5zdGF0dXMgPT0gLUVOT0VOVCB8fAorCQkJICAgICB1cmItPnN0YXR1cyA9PSAtRUNPTk5SRVNFVCB8fAorCQkJICAgICB1cmItPnN0YXR1cyA9PSAtRVNIVVRET1dOKSkKKwkJZGJnX2luZm8oJmRldi0+aW50Zi0+ZGV2LAorCQkJICIlcyAtIG5vbnplcm8gd3JpdGUgaW50ZXJydXB0IHN0YXR1cyByZWNlaXZlZDogJWRcbiIsCisJCQkgX19mdW5jX18sIHVyYi0+c3RhdHVzKTsKKworCWRldi0+aW50ZXJydXB0X291dF9idXN5ID0gMDsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJmRldi0+d3JpdGVfd2FpdCk7Cit9CisKKy8qKgorICoJdXNiX3RyYW56cG9ydF9vcGVuCisgKi8KK3N0YXRpYyBpbnQgdXNiX3RyYW56cG9ydF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCB1c2JfdHJhbnpwb3J0ICpkZXY7CisJaW50IHN1Ym1pbm9yOworCWludCByZXR2YWwgPSAwOworCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2U7CisKKwlub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxlKTsKKwlzdWJtaW5vciA9IGltaW5vcihpbm9kZSk7CisKKwltdXRleF9sb2NrKCZkaXNjb25uZWN0X211dGV4KTsKKworCWludGVyZmFjZSA9IHVzYl9maW5kX2ludGVyZmFjZSgmdXNiX3RyYW56cG9ydF9kcml2ZXIsIHN1Ym1pbm9yKTsKKworCWlmICghaW50ZXJmYWNlKSB7CisJCWVycigiJXMgLSBlcnJvciwgY2FuJ3QgZmluZCBkZXZpY2UgZm9yIG1pbm9yICVkXG4iLAorCQkgICAgIF9fZnVuY19fLCBzdWJtaW5vcik7CisJCXJldHZhbCA9IC1FTk9ERVY7CisJCWdvdG8gdW5sb2NrX2Rpc2Nvbm5lY3RfZXhpdDsKKwl9CisKKwlkZXYgPSB1c2JfZ2V0X2ludGZkYXRhKGludGVyZmFjZSk7CisKKwlpZiAoIWRldikgeworCQlyZXR2YWwgPSAtRU5PREVWOworCQlnb3RvIHVubG9ja19kaXNjb25uZWN0X2V4aXQ7CisJfQorCisJLyogbG9jayB0aGlzIGRldmljZSAqLworCWlmIChkb3duX2ludGVycnVwdGlibGUoJmRldi0+c2VtKSkgeworCQlyZXR2YWwgPSAtRVJFU1RBUlRTWVM7CisJCWdvdG8gdW5sb2NrX2Rpc2Nvbm5lY3RfZXhpdDsKKwl9CisKKwkvKiBhbGxvdyBvcGVuaW5nIG9ubHkgb25jZSAqLworCWlmIChkZXYtPm9wZW5fY291bnQpIHsKKwkJcmV0dmFsID0gLUVCVVNZOworCQlnb3RvIHVubG9ja19leGl0OworCX0KKwlkZXYtPm9wZW5fY291bnQgPSAxOworCisJLyogaW5pdGlhbGl6ZSBpbiBkaXJlY3Rpb24gKi8KKwlkZXYtPnJpbmdfaGVhZCA9IDA7CisJZGV2LT5yaW5nX3RhaWwgPSAwOworCXVzYl9maWxsX2ludF91cmIoZGV2LT5pbnRlcnJ1cHRfaW5fdXJiLAorCQkJIGludGVyZmFjZV90b191c2JkZXYoaW50ZXJmYWNlKSwKKwkJCSB1c2JfcmN2aW50cGlwZShpbnRlcmZhY2VfdG9fdXNiZGV2KGludGVyZmFjZSksCisJCQkJCWRldi0+aW50ZXJydXB0X2luX2VuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzKSwKKwkJCSBkZXYtPmludGVycnVwdF9pbl9idWZmZXIsCisJCQkgZGV2LT5pbnRlcnJ1cHRfaW5fZW5kcG9pbnRfc2l6ZSwKKwkJCSB1c2JfdHJhbnpwb3J0X2ludGVycnVwdF9pbl9jYWxsYmFjaywKKwkJCSBkZXYsCisJCQkgZGV2LT5pbnRlcnJ1cHRfaW5faW50ZXJ2YWwpOworCisJZGV2LT5pbnRlcnJ1cHRfaW5fcnVubmluZyA9IDE7CisJZGV2LT5pbnRlcnJ1cHRfaW5fZG9uZSA9IDA7CisJZGV2LT5lbmFibGUgPSAxOworCWRldi0+b2ZmbGluZSA9IDA7CisJZGV2LT5jb21wcmVzc193aGVlbCA9IDE7CisKKwlyZXR2YWwgPSB1c2Jfc3VibWl0X3VyYihkZXYtPmludGVycnVwdF9pbl91cmIsIEdGUF9LRVJORUwpOworCWlmIChyZXR2YWwpIHsKKwkJZGV2X2VycigmaW50ZXJmYWNlLT5kZXYsICJDb3VsZG4ndCBzdWJtaXQgaW50ZXJydXB0X2luX3VyYiAlZFxuIiwgcmV0dmFsKTsKKwkJZGV2LT5pbnRlcnJ1cHRfaW5fcnVubmluZyA9IDA7CisJCWRldi0+b3Blbl9jb3VudCA9IDA7CisJCWdvdG8gdW5sb2NrX2V4aXQ7CisJfQorCisJLyogc2F2ZSBkZXZpY2UgaW4gdGhlIGZpbGUncyBwcml2YXRlIHN0cnVjdHVyZSAqLworCWZpbGUtPnByaXZhdGVfZGF0YSA9IGRldjsKKworCit1bmxvY2tfZXhpdDoKKwl1cCgmZGV2LT5zZW0pOworCit1bmxvY2tfZGlzY29ubmVjdF9leGl0OgorCW11dGV4X3VubG9jaygmZGlzY29ubmVjdF9tdXRleCk7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKioKKyAqCXVzYl90cmFuenBvcnRfcmVsZWFzZQorICovCitzdGF0aWMgaW50IHVzYl90cmFuenBvcnRfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgdXNiX3RyYW56cG9ydCAqZGV2OworCWludCByZXR2YWwgPSAwOworCisJZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCisJaWYgKGRldiA9PSBOVUxMKSB7CisJCXJldHZhbCA9IC1FTk9ERVY7CisJCWdvdG8gZXhpdDsKKwl9CisKKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZkZXYtPnNlbSkpIHsKKwkJcmV0dmFsID0gLUVSRVNUQVJUU1lTOworCQlnb3RvIGV4aXQ7CisJfQorCisJaWYgKGRldi0+b3Blbl9jb3VudCAhPSAxKSB7CisJCXJldHZhbCA9IC1FTk9ERVY7CisJCWdvdG8gdW5sb2NrX2V4aXQ7CisJfQorCisJaWYgKGRldi0+aW50ZiA9PSBOVUxMKSB7CisJCS8qIHRoZSBkZXZpY2Ugd2FzIHVucGx1Z2dlZCBiZWZvcmUgdGhlIGZpbGUgd2FzIHJlbGVhc2VkICovCisJCXVwKCZkZXYtPnNlbSk7CisJCS8qIHVubG9jayBoZXJlIGFzIHVzYl90cmFuenBvcnRfZGVsZXRlIGZyZWVzIGRldiAqLworCQl1c2JfdHJhbnpwb3J0X2RlbGV0ZShkZXYpOworCQlyZXR2YWwgPSAtRU5PREVWOworCQlnb3RvIGV4aXQ7CisJfQorCisJLyogd2FpdCB1bnRpbCB3cml0ZSB0cmFuc2ZlciBpcyBmaW5pc2hlZCAqLworCWlmIChkZXYtPmludGVycnVwdF9vdXRfYnVzeSkKKwkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoZGV2LT53cml0ZV93YWl0LCAhZGV2LT5pbnRlcnJ1cHRfb3V0X2J1c3ksIDIgKiBIWik7CisJdXNiX3RyYW56cG9ydF9hYm9ydF90cmFuc2ZlcnMoZGV2KTsKKwlkZXYtPm9wZW5fY291bnQgPSAwOworCit1bmxvY2tfZXhpdDoKKwl1cCgmZGV2LT5zZW0pOworCitleGl0OgorCXJldHVybiByZXR2YWw7Cit9CisKKy8qKgorICoJdXNiX3RyYW56cG9ydF9wb2xsCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgdXNiX3RyYW56cG9ydF9wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBwb2xsX3RhYmxlICp3YWl0KQoreworCXN0cnVjdCB1c2JfdHJhbnpwb3J0ICpkZXY7CisJdW5zaWduZWQgaW50IG1hc2sgPSAwOworCisJZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCisJcG9sbF93YWl0KGZpbGUsICZkZXYtPnJlYWRfd2FpdCwgd2FpdCk7CisJcG9sbF93YWl0KGZpbGUsICZkZXYtPndyaXRlX3dhaXQsIHdhaXQpOworCisJaWYgKGRldi0+cmluZ19oZWFkICE9IGRldi0+cmluZ190YWlsKQorCQltYXNrIHw9IFBPTExJTiB8IFBPTExSRE5PUk07CisJaWYgKCFkZXYtPmludGVycnVwdF9vdXRfYnVzeSkKKwkJbWFzayB8PSBQT0xMT1VUIHwgUE9MTFdSTk9STTsKKworCXJldHVybiBtYXNrOworfQorCisvKioKKyAqCXVzYl90cmFuenBvcnRfcmVhZAorICovCitzdGF0aWMgc3NpemVfdCB1c2JfdHJhbnpwb3J0X3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWZmZXIsIHNpemVfdCBjb3VudCwKKwkJCSAgIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgdXNiX3RyYW56cG9ydCAqZGV2OworCWludCByZXR2YWwgPSAwOworCisjaWYgQlVGRkVSRURfUkVBRFMKKwlpbnQgYyA9IDA7CisjZW5kaWYKKworI2lmIENPTVBSRVNTX1dIRUVMX0VWRU5UUworCXNpZ25lZCBjaGFyIG9sZHdoZWVsOworCXNpZ25lZCBjaGFyIG5ld3doZWVsOworCWludCBjYW5jb21wcmVzcyA9IDE7CisJaW50IG5leHRfdGFpbDsKKyNlbmRpZgorCisvKiBkbyBJIGhhdmUgc3VjaCBhIHRoaW5nIGFzIGEgbnVsbCBldmVudD8gKi8KKworCWRldiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKworCS8qIHZlcmlmeSB0aGF0IHdlIGFjdHVhbGx5IGhhdmUgc29tZSBkYXRhIHRvIHJlYWQgKi8KKwlpZiAoY291bnQgPT0gMCkKKwkJZ290byBleGl0OworCisJLyogbG9jayB0aGlzIG9iamVjdCAqLworCWlmIChkb3duX2ludGVycnVwdGlibGUoJmRldi0+c2VtKSkgeworCQlyZXR2YWwgPSAtRVJFU1RBUlRTWVM7CisJCWdvdG8gZXhpdDsKKwl9CisKKwkvKiB2ZXJpZnkgdGhhdCB0aGUgZGV2aWNlIHdhc24ndCB1bnBsdWdnZWQgKi8KKwlpZiAoZGV2LT5pbnRmID09IE5VTEwpIHsKKwkJcmV0dmFsID0gLUVOT0RFVjsKKwkJZXJyKCJObyBkZXZpY2Ugb3IgZGV2aWNlIHVucGx1Z2dlZCAlZFxuIiwgcmV0dmFsKTsKKwkJZ290byB1bmxvY2tfZXhpdDsKKwl9CisKKwl3aGlsZSAoZGV2LT5yaW5nX2hlYWQgPT0gZGV2LT5yaW5nX3RhaWwpIHsKKworCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKKwkJCXJldHZhbCA9IC1FQUdBSU47CisJCQlnb3RvIHVubG9ja19leGl0OworCQl9CisJCS8vIGF0b21pY19jbXBfZXhjaGFuZ2UoJmRldi0+aW50ZXJydXB0X2luX2RvbmUsMCwwKTsKKwkJZGV2LT5pbnRlcnJ1cHRfaW5fZG9uZSA9IDAgOyAvKiB0aW55IHJhY2UgLSBGSVhNRTogbWFrZSBhdG9taWM/ICovCisJCXJldHZhbCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShkZXYtPnJlYWRfd2FpdCwgZGV2LT5pbnRlcnJ1cHRfaW5fZG9uZSk7CisJCWlmIChyZXR2YWwgPCAwKSB7CisJCQlnb3RvIHVubG9ja19leGl0OworCQl9CisJfQorCisJZGJnX2luZm8oJmRldi0+aW50Zi0+ZGV2LCAiJXM6IGNvcHlpbmcgdG8gdXNlcnNwYWNlOiAlMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeFxuIiwKKwkJCSBfX2Z1bmNfXywgKCpkZXYtPnJpbmdfYnVmZmVyKVtkZXYtPnJpbmdfdGFpbF0uY21kWzBdLCgqZGV2LT5yaW5nX2J1ZmZlcilbZGV2LT5yaW5nX3RhaWxdLmNtZFsxXSwoKmRldi0+cmluZ19idWZmZXIpW2Rldi0+cmluZ190YWlsXS5jbWRbMl0sKCpkZXYtPnJpbmdfYnVmZmVyKVtkZXYtPnJpbmdfdGFpbF0uY21kWzNdLCgqZGV2LT5yaW5nX2J1ZmZlcilbZGV2LT5yaW5nX3RhaWxdLmNtZFs0XSwoKmRldi0+cmluZ19idWZmZXIpW2Rldi0+cmluZ190YWlsXS5jbWRbNV0sKCpkZXYtPnJpbmdfYnVmZmVyKVtkZXYtPnJpbmdfdGFpbF0uY21kWzZdLCgqZGV2LT5yaW5nX2J1ZmZlcilbZGV2LT5yaW5nX3RhaWxdLmNtZFs3XSk7CisKKyNpZiBCVUZGRVJFRF9SRUFEUworCSAgIGMgPSAwOworCSAgIHdoaWxlKChjIDwgY291bnQpICYmIChkZXYtPnJpbmdfdGFpbCAhPSBkZXYtPnJpbmdfaGVhZCkpIHsKKworLyogVGhpcyBzdGFydGVkIG9mZiBpbiB0aGUgbG93ZXIgbGV2ZWwgc2VydmljZSByb3V0aW5lLCBhbmQgSSBtb3ZlZCBpdCBoZXJlLiBUaGVuIG15IGJyYWluIGRpZWQuIE5vdCBkb25lIHlldC4gKi8KKyNpZiBDT01QUkVTU19XSEVFTF9FVkVOVFMKKwkJbmV4dF90YWlsID0gKGRldi0+cmluZ190YWlsKzEpICUgcmluZ19idWZmZXJfc2l6ZTsKKwkJaWYoZGV2LT5jb21wcmVzc193aGVlbCkgY2FuY29tcHJlc3MgPSAxOworCQl3aGlsZShkZXYtPnJpbmdfaGVhZCAhPSBuZXh0X3RhaWwgJiYgY2FuY29tcHJlc3MgPT0gMSApIHsKKwkJCW5ld3doZWVsID0gKCpkZXYtPnJpbmdfYnVmZmVyKVtuZXh0X3RhaWxdLmNtZFs2XTsKKwkJCW9sZHdoZWVsID0gKCpkZXYtPnJpbmdfYnVmZmVyKVtkZXYtPnJpbmdfdGFpbF0uY21kWzZdOworCQkJLy8gaWYgYm90aCBhcmUgd2hlZWwgZXZlbnRzLCBhbmQgbm8gYnV0dG9ucyBoYXZlIGNoYW5nZXMgKEZJWE1FLCBkbyBJIGhhdmUgdG8gY2hlY2s/KSwKKwkJCS8vIGFuZCB3ZSBhcmUgdGhlIHNhbWUgc2lnbiwgd2UgY2FuIGNvbXByZXNzICstIDdGCisJCQkvLyBGSVhNRTogc2FuZXIgY2hlY2sgZm9yIG92ZXJmbG93ISAtIG1heCBvZiArLSA3RgorCQkJLy8gRklYTUUgdGhlIG1hdGggaXMgd3JvbmcgZm9yIGdvaW5nIGluIHJldmVyc2UsIGFjdHVhbGx5LCBhcyB0aGUgbWlkaSBzcGVjIGRvZXNuJ3QgYWxsb3cgc2lnbmVkIGNoYXJzCisKKwlkYmdfaW5mbygmZGV2LT5pbnRmLT5kZXYsICIlczogdHJ5aW5nIHRvIGNvbXByZXNzOiAlMDJ4JTAyeCUwMnglMDJ4JTAyeCAlMDJ4ICUwMnggJTAyeFxuIiwKKwkJCSBfX2Z1bmNfXywgKCpkZXYtPnJpbmdfYnVmZmVyKVtkZXYtPnJpbmdfdGFpbF0uY21kWzBdLCgqZGV2LT5yaW5nX2J1ZmZlcilbZGV2LT5yaW5nX3RhaWxdLmNtZFsxXSwoKmRldi0+cmluZ19idWZmZXIpW2Rldi0+cmluZ190YWlsXS5jbWRbMl0sKCpkZXYtPnJpbmdfYnVmZmVyKVtkZXYtPnJpbmdfdGFpbF0uY21kWzNdLCgqZGV2LT5yaW5nX2J1ZmZlcilbZGV2LT5yaW5nX3RhaWxdLmNtZFs0XSwoKmRldi0+cmluZ19idWZmZXIpW2Rldi0+cmluZ190YWlsXS5jbWRbNV0sKCpkZXYtPnJpbmdfYnVmZmVyKVtkZXYtPnJpbmdfdGFpbF0uY21kWzZdLCgqZGV2LT5yaW5nX2J1ZmZlcilbZGV2LT5yaW5nX3RhaWxdLmNtZFs3XSk7CisKKworCQkJaWYoKCgqZGV2LT5yaW5nX2J1ZmZlcilbZGV2LT5yaW5nX3RhaWxdLmNtZFs2XSAhPSAwICYmCisJCQkgICAgKCpkZXYtPnJpbmdfYnVmZmVyKVtuZXh0X3RhaWxdLmNtZFs2XSAhPSAwICkgJiYKKwkJCQkoKG5ld3doZWVsID4gMCAmJiBvbGR3aGVlbCA+IDApIHx8CisJCQkJKG5ld3doZWVsIDwgMCAmJiBvbGR3aGVlbCA8IDApKSAmJgorCQkJCSgoKmRldi0+cmluZ19idWZmZXIpW2Rldi0+cmluZ190YWlsXS5jbWRbMl0gPT0gKCpkZXYtPnJpbmdfYnVmZmVyKVtuZXh0X3RhaWxdLmNtZFsyXSkgJiYKKwkJCQkoKCpkZXYtPnJpbmdfYnVmZmVyKVtkZXYtPnJpbmdfdGFpbF0uY21kWzNdID09ICgqZGV2LT5yaW5nX2J1ZmZlcilbbmV4dF90YWlsXS5jbWRbM10pICYmCisJCQkJKCgqZGV2LT5yaW5nX2J1ZmZlcilbZGV2LT5yaW5nX3RhaWxdLmNtZFs0XSA9PSAoKmRldi0+cmluZ19idWZmZXIpW25leHRfdGFpbF0uY21kWzRdKSAmJgorCQkJCSgoKmRldi0+cmluZ19idWZmZXIpW2Rldi0+cmluZ190YWlsXS5jbWRbNV0gPT0gKCpkZXYtPnJpbmdfYnVmZmVyKVtuZXh0X3RhaWxdLmNtZFs1XSkpCisgeworCWRiZ19pbmZvKCZkZXYtPmludGYtPmRldiwgIiVzOiBzaG91bGQgY29tcHJlc3M6ICUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4XG4iLAorCQkJIF9fZnVuY19fLCAoKmRldi0+cmluZ19idWZmZXIpW2Rldi0+cmluZ190YWlsXS5jbWRbMF0sKCpkZXYtPnJpbmdfYnVmZmVyKVtkZXYtPnJpbmdfdGFpbF0uY21kWzFdLCgqZGV2LT5yaW5nX2J1ZmZlcilbZGV2LT5yaW5nX3RhaWxdLmNtZFsyXSwoKmRldi0+cmluZ19idWZmZXIpW2Rldi0+cmluZ190YWlsXS5jbWRbM10sKCpkZXYtPnJpbmdfYnVmZmVyKVtkZXYtPnJpbmdfdGFpbF0uY21kWzRdLCgqZGV2LT5yaW5nX2J1ZmZlcilbZGV2LT5yaW5nX3RhaWxdLmNtZFs1XSwoKmRldi0+cmluZ19idWZmZXIpW2Rldi0+cmluZ190YWlsXS5jbWRbNl0sKCpkZXYtPnJpbmdfYnVmZmVyKVtkZXYtPnJpbmdfdGFpbF0uY21kWzddKTsKKworCQkJCW5ld3doZWVsICs9IG9sZHdoZWVsOworCQkJCWlmKG9sZHdoZWVsID4gMCAmJiAhKG5ld3doZWVsID4gMCkpIHsKKwkJCQkJbmV3d2hlZWwgPSAweDdmOworCQkJCQljYW5jb21wcmVzcyA9IDA7CisJCQkJfQorCQkJCWlmKG9sZHdoZWVsIDwgMCAmJiAhKG5ld3doZWVsIDwgMCkpIHsKKwkJCQkJbmV3d2hlZWwgPSAweDgwOworCQkJCQljYW5jb21wcmVzcyA9IDA7CisJCQkJfQorCisJCQkJKCpkZXYtPnJpbmdfYnVmZmVyKVtuZXh0X3RhaWxdLmNtZFs2XSA9IG5ld3doZWVsOworCQkJCWRldi0+cmluZ190YWlsID0gbmV4dF90YWlsOworCQkJCW5leHRfdGFpbCA9IChkZXYtPnJpbmdfdGFpbCsxKSAlIHJpbmdfYnVmZmVyX3NpemU7CisJCQl9IGVsc2UgeworCQkJCWNhbmNvbXByZXNzID0gMDsKKwkJCX0KKwkJfQorI2VuZGlmIC8qIENPTVBSRVNTX1dIRUVMX0VWRU5UUyAqLworCisJCWlmIChjb3B5X3RvX3VzZXIoJmJ1ZmZlcltjXSwgJigqZGV2LT5yaW5nX2J1ZmZlcilbZGV2LT5yaW5nX3RhaWxdLCA4KSkgeworCQkJcmV0dmFsID0gLUVGQVVMVDsKKwkJCWdvdG8gdW5sb2NrX2V4aXQ7CisJCX0KKworCQlkZXYtPnJpbmdfdGFpbCA9IChkZXYtPnJpbmdfdGFpbCsxKSAlIHJpbmdfYnVmZmVyX3NpemU7CisJCWMrPTg7CisJCWRiZ19pbmZvKCZkZXYtPmludGYtPmRldiwgIiVzOiBoZWFkLCB0YWlsIGFyZSAleCwgJXhcbiIsIF9fZnVuY19fLGRldi0+cmluZ19oZWFkLGRldi0+cmluZ190YWlsKTsKKwkgICB9CisJICAgcmV0dmFsID0gYzsKKworI2Vsc2UKKwlpZiAoY29weV90b191c2VyKGJ1ZmZlciwgJigqZGV2LT5yaW5nX2J1ZmZlcilbZGV2LT5yaW5nX3RhaWxdLCA4KSkgeworCQlyZXR2YWwgPSAtRUZBVUxUOworCQlnb3RvIHVubG9ja19leGl0OworCX0KKworCWRldi0+cmluZ190YWlsID0gKGRldi0+cmluZ190YWlsKzEpICUgcmluZ19idWZmZXJfc2l6ZTsKKwlkYmdfaW5mbygmZGV2LT5pbnRmLT5kZXYsICIlczogaGVhZCwgdGFpbCBhcmUgJXgsICV4XG4iLCBfX2Z1bmNfXyxkZXYtPnJpbmdfaGVhZCxkZXYtPnJpbmdfdGFpbCk7CisKKwlyZXR2YWwgPSA4OworI2VuZGlmIC8qIEJVRkZFUkVEX1JFQURTICovCisKK3VubG9ja19leGl0OgorCS8qIHVubG9jayB0aGUgZGV2aWNlICovCisJdXAoJmRldi0+c2VtKTsKKworZXhpdDoKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKioKKyAqCXVzYl90cmFuenBvcnRfd3JpdGUKKyAqLworc3RhdGljIHNzaXplX3QgdXNiX3RyYW56cG9ydF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwKKwkJCSAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgdXNiX3RyYW56cG9ydCAqZGV2OworCXNpemVfdCBieXRlc190b193cml0ZTsKKwlpbnQgcmV0dmFsID0gMDsKKworCWRldiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKworCS8qIHZlcmlmeSB0aGF0IHdlIGFjdHVhbGx5IGhhdmUgc29tZSBkYXRhIHRvIHdyaXRlICovCisJaWYgKGNvdW50ID09IDApCisJCWdvdG8gZXhpdDsKKworCS8qIGxvY2sgdGhpcyBvYmplY3QgKi8KKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZkZXYtPnNlbSkpIHsKKwkJcmV0dmFsID0gLUVSRVNUQVJUU1lTOworCQlnb3RvIGV4aXQ7CisJfQorCisJLyogdmVyaWZ5IHRoYXQgdGhlIGRldmljZSB3YXNuJ3QgdW5wbHVnZ2VkICovCisJaWYgKGRldi0+aW50ZiA9PSBOVUxMKSB7CisJCXJldHZhbCA9IC1FTk9ERVY7CisJCWVycigiTm8gZGV2aWNlIG9yIGRldmljZSB1bnBsdWdnZWQgJWRcbiIsIHJldHZhbCk7CisJCWdvdG8gdW5sb2NrX2V4aXQ7CisJfQorCisJLyogd2FpdCB1bnRpbCBwcmV2aW91cyB0cmFuc2ZlciBpcyBmaW5pc2hlZCAqLworCWlmIChkZXYtPmludGVycnVwdF9vdXRfYnVzeSkgeworCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKKwkJCXJldHZhbCA9IC1FQUdBSU47CisJCQlnb3RvIHVubG9ja19leGl0OworCQl9CisJCXJldHZhbCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShkZXYtPndyaXRlX3dhaXQsICFkZXYtPmludGVycnVwdF9vdXRfYnVzeSk7CisJCWlmIChyZXR2YWwgPCAwKSB7CisJCQlnb3RvIHVubG9ja19leGl0OworCQl9CisJfQorCisJLyogd3JpdGUgdGhlIGRhdGEgaW50byBpbnRlcnJ1cHRfb3V0X2J1ZmZlciBmcm9tIHVzZXJzcGFjZSAqLworCWJ5dGVzX3RvX3dyaXRlID0gbWluKGNvdW50LCB3cml0ZV9idWZmZXJfc2l6ZSpkZXYtPmludGVycnVwdF9vdXRfZW5kcG9pbnRfc2l6ZSk7CisJaWYgKGJ5dGVzX3RvX3dyaXRlIDwgY291bnQpCisJCWRldl93YXJuKCZkZXYtPmludGYtPmRldiwgIldyaXRlIGJ1ZmZlciBvdmVyZmxvdywgJXpkIGJ5dGVzIGRyb3BwZWRcbiIsY291bnQtYnl0ZXNfdG9fd3JpdGUpOworCisJZGJnX2luZm8oJmRldi0+aW50Zi0+ZGV2LCAiJXM6IGNvdW50ID0gJXpkLCBieXRlc190b193cml0ZSA9ICV6ZFxuIiwgX19mdW5jX18sIGNvdW50LCBieXRlc190b193cml0ZSk7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoZGV2LT5pbnRlcnJ1cHRfb3V0X2J1ZmZlciwgYnVmZmVyLCBieXRlc190b193cml0ZSkpIHsKKwkJcmV0dmFsID0gLUVGQVVMVDsKKwkJZ290byB1bmxvY2tfZXhpdDsKKwl9CisKKwlpZiAoZGV2LT5pbnRlcnJ1cHRfb3V0X2VuZHBvaW50ID09IE5VTEwpIHsKKwkJZXJyKCJFbmRwb2ludCBzaG91bGQgbm90IGJlIGJlIG51bGwhIFxuIik7CisJCWdvdG8gdW5sb2NrX2V4aXQ7CisJfQorCisJLyogc2VuZCBvZmYgdGhlIHVyYiAqLworCXVzYl9maWxsX2ludF91cmIoZGV2LT5pbnRlcnJ1cHRfb3V0X3VyYiwKKwkJCSBpbnRlcmZhY2VfdG9fdXNiZGV2KGRldi0+aW50ZiksCisJCQkgdXNiX3NuZGludHBpcGUoaW50ZXJmYWNlX3RvX3VzYmRldihkZXYtPmludGYpLAorCQkJCQlkZXYtPmludGVycnVwdF9vdXRfZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3MpLAorCQkJIGRldi0+aW50ZXJydXB0X291dF9idWZmZXIsCisJCQkgYnl0ZXNfdG9fd3JpdGUsCisJCQkgdXNiX3RyYW56cG9ydF9pbnRlcnJ1cHRfb3V0X2NhbGxiYWNrLAorCQkJIGRldiwKKwkJCSBkZXYtPmludGVycnVwdF9vdXRfaW50ZXJ2YWwpOworCisJZGV2LT5pbnRlcnJ1cHRfb3V0X2J1c3kgPSAxOworCXdtYigpOworCisJcmV0dmFsID0gdXNiX3N1Ym1pdF91cmIoZGV2LT5pbnRlcnJ1cHRfb3V0X3VyYiwgR0ZQX0tFUk5FTCk7CisJaWYgKHJldHZhbCkgeworCQlkZXYtPmludGVycnVwdF9vdXRfYnVzeSA9IDA7CisJCWVycigiQ291bGRuJ3Qgc3VibWl0IGludGVycnVwdF9vdXRfdXJiICVkXG4iLCByZXR2YWwpOworCQlnb3RvIHVubG9ja19leGl0OworCX0KKwlyZXR2YWwgPSBieXRlc190b193cml0ZTsKKwordW5sb2NrX2V4aXQ6CisJLyogdW5sb2NrIHRoZSBkZXZpY2UgKi8KKwl1cCgmZGV2LT5zZW0pOworCitleGl0OgorCXJldHVybiByZXR2YWw7Cit9CisKKy8qIGZpbGUgb3BlcmF0aW9ucyBuZWVkZWQgd2hlbiB3ZSByZWdpc3RlciB0aGlzIGRyaXZlciAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgdXNiX3RyYW56cG9ydF9mb3BzID0geworCS5vd25lciA9CVRISVNfTU9EVUxFLAorCS5yZWFkICA9CXVzYl90cmFuenBvcnRfcmVhZCwKKwkud3JpdGUgPQl1c2JfdHJhbnpwb3J0X3dyaXRlLAorCS5vcGVuID0JCXVzYl90cmFuenBvcnRfb3BlbiwKKwkucmVsZWFzZSA9CXVzYl90cmFuenBvcnRfcmVsZWFzZSwKKwkucG9sbCA9CQl1c2JfdHJhbnpwb3J0X3BvbGwsCit9OworCisvKgorICogdXNiIGNsYXNzIGRyaXZlciBpbmZvIGluIG9yZGVyIHRvIGdldCBhIG1pbm9yIG51bWJlciBmcm9tIHRoZSB1c2IgY29yZSwKKyAqIGFuZCB0byBoYXZlIHRoZSBkZXZpY2UgcmVnaXN0ZXJlZCB3aXRoIHRoZSBkcml2ZXIgY29yZQorICovCitzdGF0aWMgc3RydWN0IHVzYl9jbGFzc19kcml2ZXIgdXNiX3RyYW56cG9ydF9jbGFzcyA9IHsKKwkubmFtZSA9CQkidHJhbnpwb3J0JWQiLAorCS5mb3BzID0JCSZ1c2JfdHJhbnpwb3J0X2ZvcHMsCisJLm1pbm9yX2Jhc2UgPQlVU0JfVFJBTlpQT1JUX01JTk9SX0JBU0UsCit9OworCisKKy8qKgorICoJdXNiX3RyYW56cG9ydF9wcm9iZQorICoKKyAqCUNhbGxlZCBieSB0aGUgdXNiIGNvcmUgd2hlbiBhIG5ldyBkZXZpY2UgaXMgY29ubmVjdGVkIHRoYXQgaXQgdGhpbmtzCisgKgl0aGlzIGRyaXZlciBtaWdodCBiZSBpbnRlcmVzdGVkIGluLgorICovCitzdGF0aWMgaW50IHVzYl90cmFuenBvcnRfcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IGludGVyZmFjZV90b191c2JkZXYoaW50Zik7CisJc3RydWN0IHVzYl90cmFuenBvcnQgKmRldiA9IE5VTEw7CisJc3RydWN0IHVzYl9ob3N0X2ludGVyZmFjZSAqaWZhY2VfZGVzYzsKKwlzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVuZHBvaW50OworCWludCBpOworCWludCB0cnVlX3NpemU7CisJaW50IHJldHZhbCA9IC1FTk9NRU07CisKKwkvKiBhbGxvY2F0ZSBtZW1vcnkgZm9yIG91ciBkZXZpY2Ugc3RhdGUgYW5kIGludGlhbGl6ZSBpdCAqLworCisJZGV2ID0ga3phbGxvYyhzaXplb2YoKmRldiksIEdGUF9LRVJORUwpOworCWlmIChkZXYgPT0gTlVMTCkgeworCQlkZXZfZXJyKCZpbnRmLT5kZXYsICJPdXQgb2YgbWVtb3J5XG4iKTsKKwkJZ290byBleGl0OworCX0KKwlpbml0X01VVEVYKCZkZXYtPnNlbSk7CisJZGV2LT5pbnRmID0gaW50ZjsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZkZXYtPnJlYWRfd2FpdCk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmZGV2LT53cml0ZV93YWl0KTsKKworCWlmYWNlX2Rlc2MgPSBpbnRmLT5jdXJfYWx0c2V0dGluZzsKKworCS8qIHNldCB1cCB0aGUgZW5kcG9pbnQgaW5mb3JtYXRpb24gKi8KKwlmb3IgKGkgPSAwOyBpIDwgaWZhY2VfZGVzYy0+ZGVzYy5iTnVtRW5kcG9pbnRzOyArK2kpIHsKKwkJZW5kcG9pbnQgPSAmaWZhY2VfZGVzYy0+ZW5kcG9pbnRbaV0uZGVzYzsKKworCQlpZiAodXNiX2VuZHBvaW50X2lzX2ludF9pbihlbmRwb2ludCkpCisJCQlkZXYtPmludGVycnVwdF9pbl9lbmRwb2ludCA9IGVuZHBvaW50OworCisJCWlmICh1c2JfZW5kcG9pbnRfaXNfaW50X291dChlbmRwb2ludCkpCisJCQlkZXYtPmludGVycnVwdF9vdXRfZW5kcG9pbnQgPSBlbmRwb2ludDsKKwl9CisJaWYgKGRldi0+aW50ZXJydXB0X2luX2VuZHBvaW50ID09IE5VTEwpIHsKKwkJZGV2X2VycigmaW50Zi0+ZGV2LCAiSW50ZXJydXB0IGluIGVuZHBvaW50IG5vdCBmb3VuZFxuIik7CisJCWdvdG8gZXJyb3I7CisJfQorCWlmIChkZXYtPmludGVycnVwdF9vdXRfZW5kcG9pbnQgPT0gTlVMTCkKKwkJZGV2X3dhcm4oJmludGYtPmRldiwgIkludGVycnVwdCBvdXQgZW5kcG9pbnQgbm90IGZvdW5kICh1c2luZyBjb250cm9sIGVuZHBvaW50IGluc3RlYWQpXG4iKTsKKworCisJZGV2LT5pbnRlcnJ1cHRfaW5fZW5kcG9pbnRfc2l6ZSA9IGxlMTZfdG9fY3B1KGRldi0+aW50ZXJydXB0X2luX2VuZHBvaW50LT53TWF4UGFja2V0U2l6ZSk7CisKKwlpZiAoZGV2LT5pbnRlcnJ1cHRfaW5fZW5kcG9pbnRfc2l6ZSAhPSA4KQorCSAgICBkZXZfd2FybigmaW50Zi0+ZGV2LCAiSW50ZXJydXB0IGluIGVuZHBvaW50IHNpemUgaXMgbm90IDghXG4iKTsKKworCWlmKHJpbmdfYnVmZmVyX3NpemUgPT0gMCkgeyByaW5nX2J1ZmZlcl9zaXplID0gUklOR19CVUZGRVJfU0laRTsgfQorCXRydWVfc2l6ZSA9IG1pbihyaW5nX2J1ZmZlcl9zaXplLFJJTkdfQlVGRkVSX1NJWkUpOworCS8qIEZJWE1FIC0gdGhlcmUgYXJlIG1vcmUgdXNiX2FsbG9jIHJvdXRpbmVzIGZvciBkbWEgY29ycmVjdG5lc3MuIE5lZWRlZD8gKi8KKworCWRldi0+cmluZ19idWZmZXIgPSBrbWFsbG9jKCh0cnVlX3NpemUqc2l6ZW9mKHN0cnVjdCB0cmFuenBvcnRfY21kKSkrOCwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIWRldi0+cmluZ19idWZmZXIpIHsKKwkJZGV2X2VycigmaW50Zi0+ZGV2LCAiQ291bGRuJ3QgYWxsb2NhdGUgcmluZ19idWZmZXIgb2Ygc2l6ZSAlZFxuIix0cnVlX3NpemUpOworCQlnb3RvIGVycm9yOworCX0KKwlkZXYtPmludGVycnVwdF9pbl9idWZmZXIgPSBrbWFsbG9jKGRldi0+aW50ZXJydXB0X2luX2VuZHBvaW50X3NpemUsIEdGUF9LRVJORUwpOworCWlmICghZGV2LT5pbnRlcnJ1cHRfaW5fYnVmZmVyKSB7CisJCWRldl9lcnIoJmludGYtPmRldiwgIkNvdWxkbid0IGFsbG9jYXRlIGludGVycnVwdF9pbl9idWZmZXJcbiIpOworCQlnb3RvIGVycm9yOworCX0KKwlkZXYtPmludGVycnVwdF9pbl91cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOworCWlmICghZGV2LT5pbnRlcnJ1cHRfaW5fdXJiKSB7CisJCWRldl9lcnIoJmludGYtPmRldiwgIkNvdWxkbid0IGFsbG9jYXRlIGludGVycnVwdF9pbl91cmJcbiIpOworCQlnb3RvIGVycm9yOworCX0KKwlkZXYtPmludGVycnVwdF9vdXRfZW5kcG9pbnRfc2l6ZSA9IGRldi0+aW50ZXJydXB0X291dF9lbmRwb2ludCA/IGxlMTZfdG9fY3B1KGRldi0+aW50ZXJydXB0X291dF9lbmRwb2ludC0+d01heFBhY2tldFNpemUpIDoKKwkJCQkJCQkJCSB1ZGV2LT5kZXNjcmlwdG9yLmJNYXhQYWNrZXRTaXplMDsKKworCWlmIChkZXYtPmludGVycnVwdF9vdXRfZW5kcG9pbnRfc2l6ZSAhPTgpCisJCWRldl93YXJuKCZpbnRmLT5kZXYsICJJbnRlcnJ1cHQgb3V0IGVuZHBvaW50IHNpemUgaXMgbm90IDghKVxuIik7CisKKwlkZXYtPmludGVycnVwdF9vdXRfYnVmZmVyID0ga21hbGxvYyh3cml0ZV9idWZmZXJfc2l6ZSpkZXYtPmludGVycnVwdF9vdXRfZW5kcG9pbnRfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkZXYtPmludGVycnVwdF9vdXRfYnVmZmVyKSB7CisJCWRldl9lcnIoJmludGYtPmRldiwgIkNvdWxkbid0IGFsbG9jYXRlIGludGVycnVwdF9vdXRfYnVmZmVyXG4iKTsKKwkJZ290byBlcnJvcjsKKwl9CisJZGV2LT5pbnRlcnJ1cHRfb3V0X3VyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkZXYtPmludGVycnVwdF9vdXRfdXJiKSB7CisJCWRldl9lcnIoJmludGYtPmRldiwgIkNvdWxkbid0IGFsbG9jYXRlIGludGVycnVwdF9vdXRfdXJiXG4iKTsKKwkJZ290byBlcnJvcjsKKwl9CisJZGV2LT5pbnRlcnJ1cHRfaW5faW50ZXJ2YWwgPSBtaW5faW50ZXJydXB0X2luX2ludGVydmFsID4gZGV2LT5pbnRlcnJ1cHRfaW5fZW5kcG9pbnQtPmJJbnRlcnZhbCA/IG1pbl9pbnRlcnJ1cHRfaW5faW50ZXJ2YWwgOiBkZXYtPmludGVycnVwdF9pbl9lbmRwb2ludC0+YkludGVydmFsOworCWlmIChkZXYtPmludGVycnVwdF9vdXRfZW5kcG9pbnQpCisJCWRldi0+aW50ZXJydXB0X291dF9pbnRlcnZhbCA9IG1pbl9pbnRlcnJ1cHRfb3V0X2ludGVydmFsID4gZGV2LT5pbnRlcnJ1cHRfb3V0X2VuZHBvaW50LT5iSW50ZXJ2YWwgPyBtaW5faW50ZXJydXB0X291dF9pbnRlcnZhbCA6IGRldi0+aW50ZXJydXB0X291dF9lbmRwb2ludC0+YkludGVydmFsOworCisJLyogd2UgY2FuIHJlZ2lzdGVyIHRoZSBkZXZpY2Ugbm93LCBhcyBpdCBpcyByZWFkeSAqLworCXVzYl9zZXRfaW50ZmRhdGEoaW50ZiwgZGV2KTsKKworCXJldHZhbCA9IHVzYl9yZWdpc3Rlcl9kZXYoaW50ZiwgJnVzYl90cmFuenBvcnRfY2xhc3MpOworCWlmIChyZXR2YWwpIHsKKwkJLyogc29tZXRoaW5nIHByZXZlbnRlZCB1cyBmcm9tIHJlZ2lzdGVyaW5nIHRoaXMgZHJpdmVyICovCisJCWRldl9lcnIoJmludGYtPmRldiwgIk5vdCBhYmxlIHRvIGdldCBhIG1pbm9yIGZvciB0aGlzIGRldmljZS5cbiIpOworCQl1c2Jfc2V0X2ludGZkYXRhKGludGYsIE5VTEwpOworCQlnb3RvIGVycm9yOworCX0KKworCWlmKChyZXR2YWwgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJmludGYtPmRldiwgJmRldl9hdHRyX0xpZ2h0UmVjb3JkKSkpIGdvdG8gZXJyb3I7CisJaWYoKHJldHZhbCA9IGRldmljZV9jcmVhdGVfZmlsZSgmaW50Zi0+ZGV2LCAmZGV2X2F0dHJfTGlnaHRUcmFja3JlYykpKSBnb3RvIGVycm9yOworCWlmKChyZXR2YWwgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJmludGYtPmRldiwgJmRldl9hdHRyX0xpZ2h0VHJhY2ttdXRlKSkpIGdvdG8gZXJyb3I7CisJaWYoKHJldHZhbCA9IGRldmljZV9jcmVhdGVfZmlsZSgmaW50Zi0+ZGV2LCAmZGV2X2F0dHJfTGlnaHRUcmFja3NvbG8pKSkgZ290byBlcnJvcjsKKwlpZigocmV0dmFsID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZpbnRmLT5kZXYsICZkZXZfYXR0cl9MaWdodEFueXNvbG8pKSkgZ290byBlcnJvcjsKKwlpZigocmV0dmFsID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZpbnRmLT5kZXYsICZkZXZfYXR0cl9MaWdodExvb3ApKSkgZ290byBlcnJvcjsKKwlpZigocmV0dmFsID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZpbnRmLT5kZXYsICZkZXZfYXR0cl9MaWdodFB1bmNoKSkpIGdvdG8gZXJyb3I7CisJaWYoKHJldHZhbCA9IGRldmljZV9jcmVhdGVfZmlsZSgmaW50Zi0+ZGV2LCAmZGV2X2F0dHJfd2hlZWwpKSkgZ290byBlcnJvcjsKKwlpZigocmV0dmFsID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZpbnRmLT5kZXYsICZkZXZfYXR0cl9ldmVudCkpKSBnb3RvIGVycm9yOworCWlmKChyZXR2YWwgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJmludGYtPmRldiwgJmRldl9hdHRyX2R1bXBfc3RhdGUpKSkgZ290byBlcnJvcjsKKwlpZigocmV0dmFsID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZpbnRmLT5kZXYsICZkZXZfYXR0cl9jb21wcmVzc193aGVlbCkpKSBnb3RvIGVycm9yOworCWlmKChyZXR2YWwgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJmludGYtPmRldiwgJmRldl9hdHRyX2VuYWJsZSkpKSBnb3RvIGVycm9yOworCWlmKChyZXR2YWwgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJmludGYtPmRldiwgJmRldl9hdHRyX29mZmxpbmUpKSkgZ290byBlcnJvcjsKKworCS8qIGxldCB0aGUgdXNlciBrbm93IHdoYXQgbm9kZSB0aGlzIGRldmljZSBpcyBub3cgYXR0YWNoZWQgdG8gKi8KKwlkZXZfaW5mbygmaW50Zi0+ZGV2LCAiVHJhbnpwb3J0IERldmljZSAjJWQgbm93IGF0dGFjaGVkIHRvIG1ham9yICVkIG1pbm9yICVkXG4iLAorCQkoaW50Zi0+bWlub3IgLSBVU0JfVFJBTlpQT1JUX01JTk9SX0JBU0UpLCBVU0JfTUFKT1IsIGludGYtPm1pbm9yKTsKKworZXhpdDoKKwlyZXR1cm4gcmV0dmFsOworCitlcnJvcjoKKwl1c2JfdHJhbnpwb3J0X2RlbGV0ZShkZXYpOworCisJcmV0dXJuIHJldHZhbDsKK30KKworLyoqCisgKgl1c2JfdHJhbnpwb3J0X2Rpc2Nvbm5lY3QKKyAqCisgKglDYWxsZWQgYnkgdGhlIHVzYiBjb3JlIHdoZW4gdGhlIGRldmljZSBpcyByZW1vdmVkIGZyb20gdGhlIHN5c3RlbS4KKyAqLworc3RhdGljIHZvaWQgdXNiX3RyYW56cG9ydF9kaXNjb25uZWN0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQoreworCXN0cnVjdCB1c2JfdHJhbnpwb3J0ICpkZXY7CisJaW50IG1pbm9yOworCW11dGV4X2xvY2soJmRpc2Nvbm5lY3RfbXV0ZXgpOworCWRldiA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CisJdXNiX3NldF9pbnRmZGF0YShpbnRmLCBOVUxMKTsKKwlkb3duKCZkZXYtPnNlbSk7CisJbWlub3IgPSBpbnRmLT5taW5vcjsKKwkvKiBnaXZlIGJhY2sgb3VyIG1pbm9yICovCisJdXNiX2RlcmVnaXN0ZXJfZGV2KGludGYsICZ1c2JfdHJhbnpwb3J0X2NsYXNzKTsKKworCS8qIGlmIHRoZSBkZXZpY2UgaXMgbm90IG9wZW5lZCwgdGhlbiB3ZSBjbGVhbiB1cCByaWdodCBub3cgKi8KKwlpZiAoIWRldi0+b3Blbl9jb3VudCkgeworCQl1cCgmZGV2LT5zZW0pOworCQl1c2JfdHJhbnpwb3J0X2RlbGV0ZShkZXYpOworCX0gZWxzZSB7CisJCWRldi0+aW50ZiA9IE5VTEw7CisJCXVwKCZkZXYtPnNlbSk7CisJfQorCisJbXV0ZXhfdW5sb2NrKCZkaXNjb25uZWN0X211dGV4KTsKKworCWRldl9pbmZvKCZpbnRmLT5kZXYsICJUcmFuenBvcnQgU3VyZmFjZSAjJWQgbm93IGRpc2Nvbm5lY3RlZFxuIiwKKwkJIChtaW5vciAtIFVTQl9UUkFOWlBPUlRfTUlOT1JfQkFTRSkpOworfQorCisvKiB1c2Igc3BlY2lmaWMgb2JqZWN0IG5lZWRlZCB0byByZWdpc3RlciB0aGlzIGRyaXZlciB3aXRoIHRoZSB1c2Igc3Vic3lzdGVtICovCitzdGF0aWMgc3RydWN0IHVzYl9kcml2ZXIgdXNiX3RyYW56cG9ydF9kcml2ZXIgPSB7CisJLm5hbWUgPQkJInRyYW56cG9ydCIsCisJLnByb2JlID0JdXNiX3RyYW56cG9ydF9wcm9iZSwKKwkuZGlzY29ubmVjdCA9CXVzYl90cmFuenBvcnRfZGlzY29ubmVjdCwKKwkuaWRfdGFibGUgPQl1c2JfdHJhbnpwb3J0X3RhYmxlLAorfTsKKworLyoqCisgKgl1c2JfdHJhbnpwb3J0X2luaXQKKyAqLworc3RhdGljIGludCBfX2luaXQgdXNiX3RyYW56cG9ydF9pbml0KHZvaWQpCit7CisJaW50IHJldHZhbDsKKworCS8qIHJlZ2lzdGVyIHRoaXMgZHJpdmVyIHdpdGggdGhlIFVTQiBzdWJzeXN0ZW0gKi8KKwlyZXR2YWwgPSB1c2JfcmVnaXN0ZXIoJnVzYl90cmFuenBvcnRfZHJpdmVyKTsKKwlpZiAocmV0dmFsKQorCQllcnIoInVzYl9yZWdpc3RlciBmYWlsZWQgZm9yIHRoZSAiX19GSUxFX18iIGRyaXZlci4gRXJyb3IgbnVtYmVyICVkXG4iLCByZXR2YWwpOworCisJcmV0dXJuIHJldHZhbDsKK30KKworLyoqCisgKgl1c2JfdHJhbnpwb3J0X2V4aXQKKyAqLworc3RhdGljIHZvaWQgX19leGl0IHVzYl90cmFuenBvcnRfZXhpdCh2b2lkKQoreworCS8qIGRlcmVnaXN0ZXIgdGhpcyBkcml2ZXIgd2l0aCB0aGUgVVNCIHN1YnN5c3RlbSAqLworCXVzYl9kZXJlZ2lzdGVyKCZ1c2JfdHJhbnpwb3J0X2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHVzYl90cmFuenBvcnRfaW5pdCk7Cittb2R1bGVfZXhpdCh1c2JfdHJhbnpwb3J0X2V4aXQpOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ283MDA3L0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvZ283MDA3L0tjb25maWcKaW5kZXggNTkzZmRiNy4uZjJjZjdmNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2dvNzAwNy9LY29uZmlnCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9nbzcwMDcvS2NvbmZpZwpAQCAtMjUsMyArMjUsMTMgQEAKIAkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQogCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGdvNzAwNy11c2IKIAorY29uZmlnIFZJREVPX0dPNzAwN19VU0JfUzIyNTBfQk9BUkQKKwl0cmlzdGF0ZSAiU2Vuc29yYXkgMjI1MC8yMjUxIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBWSURFT19HTzcwMDdfVVNCICYmIERWQl9VU0IKKwlkZWZhdWx0IE4KKwktLS1oZWxwLS0tCisJICBUaGlzIGlzIGEgdmlkZW80bGludXggZHJpdmVyIGZvciB0aGUgU2Vuc29yYXkgMjI1MC8yMjUxIGRldmljZQorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBzMjI1MC1ib2FyZAorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ283MDA3L01ha2VmaWxlIGIvZHJpdmVycy9zdGFnaW5nL2dvNzAwNy9NYWtlZmlsZQppbmRleCA5YjkzMTBjLi5lNTE0YjRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZ283MDA3L01ha2VmaWxlCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9nbzcwMDcvTWFrZWZpbGUKQEAgLTUsMTQgKzUsMjMgQEAKIAogb2JqLSQoQ09ORklHX1ZJREVPX0dPNzAwNykgKz0gZ283MDA3Lm8KIG9iai0kKENPTkZJR19WSURFT19HTzcwMDdfVVNCKSArPSBnbzcwMDctdXNiLm8KK29iai0kKENPTkZJR19WSURFT19HTzcwMDdfVVNCX1MyMjUwX0JPQVJEKSArPSBzMjI1MC5vCiAKLWdvNzAwNy1vYmpzICs9IGdvNzAwNy12NGwyLm8gZ283MDA3LWRyaXZlci5vIGdvNzAwNy1pMmMubyBnbzcwMDctZncubyBzbmQtZ283MDA3Lm8KK2dvNzAwNy1vYmpzICs9IGdvNzAwNy12NGwyLm8gZ283MDA3LWRyaXZlci5vIGdvNzAwNy1pMmMubyBnbzcwMDctZncubyBcCisJCXNuZC1nbzcwMDcubyB3aXMtc2FhNzExMy5vCiAKK3MyMjUwLW9ianMgKz0gczIyNTAtYm9hcmQubyBzMjI1MC1sb2FkZXIubwogCi0jaWZuZXEgKCQoU0FBNzEzNF9CVUlMRCksKQotI29iai1tICs9IHNhYTcxMzQtZ283MDA3Lm8KKyMgVW5jb21waWxlIHdoZW4gdGhlIHNhYTcxMzQgcGF0Y2hlcyBnZXQgaW50byB1cHN0cmVhbQorI2lmbmVxICgkKENPTkZJR19WSURFT19TQUE3MTM0KSwpCisjb2JqLSQoQ09ORklHX1ZJREVPX1NBQTcxMzQpICs9IHNhYTcxMzQtZ283MDA3Lm8KKyNFWFRSQV9DRkxBR1MgKz0gLUlkcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQKICNlbmRpZgogCitpZm5lcSAoJChDT05GSUdfVklERU9fR083MDA3X1VTQl9TMjI1MF9CT0FSRCksKQorRVhUUkFfQ0ZMQUdTICs9IC1JZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYgorZW5kaWYKKwogRVhUUkFfQ0ZMQUdTICs9IC1JZHJpdmVycy9zdGFnaW5nL3NhYTcxMzQKIEVYVFJBX0NGTEFHUyArPSAtSWRyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcwogRVhUUkFfQ0ZMQUdTICs9IC1JZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9nbzcwMDcvZ283MDA3LWRyaXZlci5jIGIvZHJpdmVycy9zdGFnaW5nL2dvNzAwNy9nbzcwMDctZHJpdmVyLmMKaW5kZXggZTRlYWQ5Ni4uNThiZmM4ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2dvNzAwNy9nbzcwMDctZHJpdmVyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2dvNzAwNy9nbzcwMDctZHJpdmVyLmMKQEAgLTIxNyw2ICsyMTcsOSBAQAogCWNhc2UgSTJDX0RSSVZFUklEX1dJU19PVjc2NDA6CiAJCW1vZG5hbWUgPSAid2lzLW92NzY0MCI7CiAJCWJyZWFrOworCWNhc2UgSTJDX0RSSVZFUklEX1MyMjUwOgorCQltb2RuYW1lID0gInMyMjUwLWJvYXJkIjsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJbW9kbmFtZSA9IE5VTEw7CiAJCWJyZWFrOwpAQCAtMjI3LDcgKzIzMCw3IEBACiAJCXJldHVybiAwOwogCWlmIChtb2RuYW1lICE9IE5VTEwpCiAJCXByaW50ayhLRVJOX0lORk8KLQkJCSJnbzcwMDc6IHByb2JpbmcgZm9yIG1vZHVsZSAlcyBmYWlsZWQiLCBtb2RuYW1lKTsKKwkJCSJnbzcwMDc6IHByb2JpbmcgZm9yIG1vZHVsZSAlcyBmYWlsZWRcbiIsIG1vZG5hbWUpOwogCWVsc2UKIAkJcHJpbnRrKEtFUk5fSU5GTwogCQkJImdvNzAwNzogc2Vuc29yICV1IHNlZW1zIHRvIGJlIHVuc3VwcG9ydGVkIVxuIiwgaWQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dvNzAwNy9nbzcwMDctZncuYyBiL2RyaXZlcnMvc3RhZ2luZy9nbzcwMDcvZ283MDA3LWZ3LmMKaW5kZXggYTBlMTdiMC4uODcxZWQ0MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2dvNzAwNy9nbzcwMDctZncuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZ283MDA3L2dvNzAwNy1mdy5jCkBAIC0yODQsNyArMjg0LDcgQEAKIAk1OCwgNTksIDUyLCA0NSwgMzgsIDMxLCAzOSwgNDYsIDUzLCA2MCwgNjEsIDU0LCA0NywgNTUsIDYyLCA2MwogfTsKIAotc3RhdGljIGludCBjb3B5X3BhY2thZ2VzKHUxNiAqZGVzdCwgdTE2ICpzcmMsIGludCBwa2dfY250LCBpbnQgc3BhY2UpCitzdGF0aWMgaW50IGNvcHlfcGFja2FnZXMoX19sZTE2ICpkZXN0LCB1MTYgKnNyYywgaW50IHBrZ19jbnQsIGludCBzcGFjZSkKIHsKIAlpbnQgaSwgY250ID0gcGtnX2NudCAqIDMyOwogCkBAIC0yOTIsNyArMjkyLDcgQEAKIAkJcmV0dXJuIC0xOwogCiAJZm9yIChpID0gMDsgaSA8IGNudDsgKytpKQotCQlkZXN0W2ldID0gX19jcHVfdG9fbGUxNihzcmNbaV0pOworCQlkZXN0W2ldID0gY3B1X3RvX2xlMTZwKHNyYyArIGkpOwogCiAJcmV0dXJuIGNudDsKIH0KQEAgLTM3Miw3ICszNzIsNyBAQAogCXJldHVybiBwOwogfQogCi1zdGF0aWMgaW50IGdlbl9tanBlZ2hkcl90b19wYWNrYWdlKHN0cnVjdCBnbzcwMDcgKmdvLCB1MTYgKmNvZGUsIGludCBzcGFjZSkKK3N0YXRpYyBpbnQgZ2VuX21qcGVnaGRyX3RvX3BhY2thZ2Uoc3RydWN0IGdvNzAwNyAqZ28sIF9fbGUxNiAqY29kZSwgaW50IHNwYWNlKQogewogCXU4ICpidWY7CiAJdTE2IG1lbSA9IDB4M2UwMDsKQEAgLTY0Myw3ICs2NDMsNyBAQAogfQogCiBzdGF0aWMgaW50IGdlbl9tcGVnMWhkcl90b19wYWNrYWdlKHN0cnVjdCBnbzcwMDcgKmdvLAotCQkJCQl1MTYgKmNvZGUsIGludCBzcGFjZSwgaW50ICpmcmFtZWxlbikKKwkJCQkJX19sZTE2ICpjb2RlLCBpbnQgc3BhY2UsIGludCAqZnJhbWVsZW4pCiB7CiAJdTggKmJ1ZjsKIAl1MTYgbWVtID0gMHgzZTAwOwpAQCAtODMxLDcgKzgzMSw3IEBACiB9CiAKIHN0YXRpYyBpbnQgZ2VuX21wZWc0aGRyX3RvX3BhY2thZ2Uoc3RydWN0IGdvNzAwNyAqZ28sCi0JCQkJCXUxNiAqY29kZSwgaW50IHNwYWNlLCBpbnQgKmZyYW1lbGVuKQorCQkJCQlfX2xlMTYgKmNvZGUsIGludCBzcGFjZSwgaW50ICpmcmFtZWxlbikKIHsKIAl1OCAqYnVmOwogCXUxNiBtZW0gPSAweDNlMDA7CkBAIC05MzYsNyArOTM2LDcgQEAKIH0KIAogc3RhdGljIGludCBicmN0cmxfdG9fcGFja2FnZShzdHJ1Y3QgZ283MDA3ICpnbywKLQkJCQkJdTE2ICpjb2RlLCBpbnQgc3BhY2UsIGludCAqZnJhbWVsZW4pCisJCQkJCV9fbGUxNiAqY29kZSwgaW50IHNwYWNlLCBpbnQgKmZyYW1lbGVuKQogewogCWludCBjb252ZXJnZV9zcGVlZCA9IDA7CiAJaW50IGxhbWJkYSA9IChnby0+Zm9ybWF0ID09IEdPNzAwN19GT1JNQVRfTUpQRUcgfHwgZ28tPmR2ZF9tb2RlKSA/CkBAIC0xMDkxLDcgKzEwOTEsNyBAQAogCXJldHVybiBjb3B5X3BhY2thZ2VzKGNvZGUsIHBhY2ssIDYsIHNwYWNlKTsKIH0KIAotc3RhdGljIGludCBjb25maWdfcGFja2FnZShzdHJ1Y3QgZ283MDA3ICpnbywgdTE2ICpjb2RlLCBpbnQgc3BhY2UpCitzdGF0aWMgaW50IGNvbmZpZ19wYWNrYWdlKHN0cnVjdCBnbzcwMDcgKmdvLCBfX2xlMTYgKmNvZGUsIGludCBzcGFjZSkKIHsKIAlpbnQgZnBzID0gZ28tPnNlbnNvcl9mcmFtZXJhdGUgLyBnby0+ZnBzX3NjYWxlIC8gMTAwMDsKIAlpbnQgcm93cyA9IGdvLT5pbnRlcmxhY2VfY29kaW5nID8gZ28tPmhlaWdodCAvIDMyIDogZ28tPmhlaWdodCAvIDE2OwpAQCAtMTIxMyw3ICsxMjEzLDcgQEAKIAlyZXR1cm4gY29weV9wYWNrYWdlcyhjb2RlLCBwYWNrLCA1LCBzcGFjZSk7CiB9CiAKLXN0YXRpYyBpbnQgc2VxaGVhZF90b19wYWNrYWdlKHN0cnVjdCBnbzcwMDcgKmdvLCB1MTYgKmNvZGUsIGludCBzcGFjZSwKK3N0YXRpYyBpbnQgc2VxaGVhZF90b19wYWNrYWdlKHN0cnVjdCBnbzcwMDcgKmdvLCBfX2xlMTYgKmNvZGUsIGludCBzcGFjZSwKIAlpbnQgKCpzZXF1ZW5jZV9oZWFkZXJfZnVuYykoc3RydWN0IGdvNzAwNyAqZ28sCiAJCXVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGV4dCkpCiB7CkBAIC0xMjkyLDcgKzEyOTIsNyBAQAogCXJldHVybiBiaWc7CiB9CiAKLXN0YXRpYyBpbnQgYXZzeW5jX3RvX3BhY2thZ2Uoc3RydWN0IGdvNzAwNyAqZ28sIHUxNiAqY29kZSwgaW50IHNwYWNlKQorc3RhdGljIGludCBhdnN5bmNfdG9fcGFja2FnZShzdHJ1Y3QgZ283MDA3ICpnbywgX19sZTE2ICpjb2RlLCBpbnQgc3BhY2UpCiB7CiAJaW50IGFyYXRlID0gZ28tPmJvYXJkX2luZm8tPmF1ZGlvX3JhdGUgKiAxMDAxICogZ28tPmZwc19zY2FsZTsKIAlpbnQgcmF0aW8gPSBhcmF0ZSAvIGdvLT5zZW5zb3JfZnJhbWVyYXRlOwpAQCAtMTMyMyw3ICsxMzIzLDcgQEAKIAlyZXR1cm4gY29weV9wYWNrYWdlcyhjb2RlLCBwYWNrLCAxLCBzcGFjZSk7CiB9CiAKLXN0YXRpYyBpbnQgZmluYWxfcGFja2FnZShzdHJ1Y3QgZ283MDA3ICpnbywgdTE2ICpjb2RlLCBpbnQgc3BhY2UpCitzdGF0aWMgaW50IGZpbmFsX3BhY2thZ2Uoc3RydWN0IGdvNzAwNyAqZ28sIF9fbGUxNiAqY29kZSwgaW50IHNwYWNlKQogewogCWludCByb3dzID0gZ28tPmludGVybGFjZV9jb2RpbmcgPyBnby0+aGVpZ2h0IC8gMzIgOiBnby0+aGVpZ2h0IC8gMTY7CiAJdTE2IHBhY2tbXSA9IHsKQEAgLTEzODYsNyArMTM4Niw3IEBACiAJcmV0dXJuIGNvcHlfcGFja2FnZXMoY29kZSwgcGFjaywgMSwgc3BhY2UpOwogfQogCi1zdGF0aWMgaW50IGF1ZGlvX3RvX3BhY2thZ2Uoc3RydWN0IGdvNzAwNyAqZ28sIHUxNiAqY29kZSwgaW50IHNwYWNlKQorc3RhdGljIGludCBhdWRpb190b19wYWNrYWdlKHN0cnVjdCBnbzcwMDcgKmdvLCBfX2xlMTYgKmNvZGUsIGludCBzcGFjZSkKIHsKIAlpbnQgY2xvY2tfY29uZmlnID0gKChnby0+Ym9hcmRfaW5mby0+YXVkaW9fZmxhZ3MgJgogCQkJCUdPNzAwN19BVURJT19JMlNfTUFTVEVSID8gMSA6IDApIDw8IDExKSB8CkBAIC0xNDM2LDcgKzE0MzYsNyBAQAogCXJldHVybiBjb3B5X3BhY2thZ2VzKGNvZGUsIHBhY2ssIDIsIHNwYWNlKTsKIH0KIAotc3RhdGljIGludCBtb2RldF90b19wYWNrYWdlKHN0cnVjdCBnbzcwMDcgKmdvLCB1MTYgKmNvZGUsIGludCBzcGFjZSkKK3N0YXRpYyBpbnQgbW9kZXRfdG9fcGFja2FnZShzdHJ1Y3QgZ283MDA3ICpnbywgX19sZTE2ICpjb2RlLCBpbnQgc3BhY2UpCiB7CiAJaW50IHJldCwgbWIsIGksIGFkZHIsIGNudCA9IDA7CiAJdTE2IHBhY2tbMzJdOwpAQCAtMTUwNSw3ICsxNTA1LDcgQEAKIAlyZXR1cm4gY250OwogfQogCi1zdGF0aWMgaW50IGRvX3NwZWNpYWwoc3RydWN0IGdvNzAwNyAqZ28sIHUxNiB0eXBlLCB1MTYgKmNvZGUsIGludCBzcGFjZSwKK3N0YXRpYyBpbnQgZG9fc3BlY2lhbChzdHJ1Y3QgZ283MDA3ICpnbywgdTE2IHR5cGUsIF9fbGUxNiAqY29kZSwgaW50IHNwYWNlLAogCQkJaW50ICpmcmFtZWxlbikKIHsKIAlzd2l0Y2ggKHR5cGUpIHsKQEAgLTE1NTUsNyArMTU1NSw3IEBACiBpbnQgZ283MDA3X2NvbnN0cnVjdF9md19pbWFnZShzdHJ1Y3QgZ283MDA3ICpnbywgdTggKipmdywgaW50ICpmd2xlbikKIHsKIAljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3X2VudHJ5OwotCXUxNiAqY29kZSwgKnNyYzsKKwlfX2xlMTYgKmNvZGUsICpzcmM7CiAJaW50IGZyYW1lbGVuWzhdID0geyB9OyAvKiBob2xkcyB0aGUgbGVuZ3RocyBvZiBlbXB0eSBmcmFtZSB0ZW1wbGF0ZXMgKi8KIAlpbnQgY29kZXNwYWNlID0gNjQgKiAxMDI0LCBpID0gMCwgc3JjbGVuLCBjaHVua19sZW4sIGNodW5rX2ZsYWdzOwogCWludCBtb2RlX2ZsYWc7CkBAIC0xNTkwLDcgKzE1OTAsNyBAQAogCQlnb3RvIGZ3X2ZhaWxlZDsKIAl9CiAJbWVtc2V0KGNvZGUsIDAsIGNvZGVzcGFjZSAqIDIpOwotCXNyYyA9ICh1MTYgKilmd19lbnRyeS0+ZGF0YTsKKwlzcmMgPSAoX19sZTE2ICopZndfZW50cnktPmRhdGE7CiAJc3JjbGVuID0gZndfZW50cnktPnNpemUgLyAyOwogCXdoaWxlIChzcmNsZW4gPj0gMikgewogCQljaHVua19mbGFncyA9IF9fbGUxNl90b19jcHUoc3JjWzBdKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9nbzcwMDcvZ283MDA3LXByaXYuaCBiL2RyaXZlcnMvc3RhZ2luZy9nbzcwMDcvZ283MDA3LXByaXYuaAppbmRleCAwMDU1NDJkLi4zNzJmMWYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZ283MDA3L2dvNzAwNy1wcml2LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2dvNzAwNy9nbzcwMDctcHJpdi5oCkBAIC00MCw2ICs0MCw3IEBACiAjZGVmaW5lIEdPNzAwN19CT0FSRElEX0xJRkVWSUVXX0xSMTkyCTIxIC8qIFRWIFdhbGtlciBVbHRyYSAqLwogI2RlZmluZSBHTzcwMDdfQk9BUkRJRF9FTkRVUkEJCTIyCiAjZGVmaW5lIEdPNzAwN19CT0FSRElEX0FETElOS19NUEcyNAkyMworI2RlZmluZSBHTzcwMDdfQk9BUkRJRF9TRU5TT1JBWV8yMjUwCTI0IC8qIFNlbnNvcmF5IDIyNTAvMjI1MSAqLwogCiAvKiBWYXJpb3VzIGNoYXJhY3RlcmlzdGljcyBvZiBlYWNoIGJvYXJkICovCiAjZGVmaW5lIEdPNzAwN19CT0FSRF9IQVNfQVVESU8JCSgxPDwwKQpAQCAtMTA0LDYgKzEwNSw3IEBACiAJaW50ICgqc3RyZWFtX3N0YXJ0KShzdHJ1Y3QgZ283MDA3ICpnbyk7CiAJaW50ICgqc3RyZWFtX3N0b3ApKHN0cnVjdCBnbzcwMDcgKmdvKTsKIAlpbnQgKCpzZW5kX2Zpcm13YXJlKShzdHJ1Y3QgZ283MDA3ICpnbywgdTggKmRhdGEsIGludCBsZW4pOworCWludCAoKnNlbmRfY29tbWFuZCkoc3RydWN0IGdvNzAwNyAqZ28sIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZyk7CiB9OwogCiAvKiBUaGUgdmlkZW8gYnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIFBBR0VfU0laRSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dvNzAwNy9nbzcwMDctdXNiLmMgYi9kcml2ZXJzL3N0YWdpbmcvZ283MDA3L2dvNzAwNy11c2IuYwppbmRleCAzZjVlZTM0Li44M2VlYzkyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZ283MDA3L2dvNzAwNy11c2IuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZ283MDA3L2dvNzAwNy11c2IuYwpAQCAtMjI1LDcgKzIyNSw3IEBACiAJCS5pbnB1dHMgCSA9IHsKIAkJCXsKIAkJCQkudmlkZW9faW5wdXQJPSAxLAotCQkuYXVkaW9faW5wdXQJID0gVFZBVURJT19JTlBVVF9FWFRFUk4sCisJCQkJLmF1ZGlvX2lucHV0CT0gVFZBVURJT19JTlBVVF9FWFRFUk4sCiAJCQkJLm5hbWUJCT0gIkNvbXBvc2l0ZSIsCiAJCQl9LAogCQkJewpAQCAtMzk4LDYgKzM5OCw0MSBAQAogCX0sCiB9OwogCitzdGF0aWMgc3RydWN0IGdvNzAwN191c2JfYm9hcmQgYm9hcmRfc2Vuc29yYXlfMjI1MCA9IHsKKwkuZmxhZ3MJCT0gR083MDA3X1VTQl9FWlVTQiB8IEdPNzAwN19VU0JfRVpVU0JfSTJDLAorCS5tYWluX2luZm8JPSB7CisJCS5maXJtd2FyZQkgPSAiZ283MDA3dHYuYmluIiwKKwkJLmF1ZGlvX2ZsYWdzCSA9IEdPNzAwN19BVURJT19JMlNfTU9ERV8xIHwKKwkJCQkJR083MDA3X0FVRElPX0kyU19NQVNURVIgfAorCQkJCQlHTzcwMDdfQVVESU9fV09SRF8xNiwKKwkJLmZsYWdzCQkgPSBHTzcwMDdfQk9BUkRfSEFTX0FVRElPLAorCQkuYXVkaW9fcmF0ZQkgPSA0ODAwMCwKKwkJLmF1ZGlvX2JjbGtfZGl2CSA9IDgsCisJCS5hdWRpb19tYWluX2RpdgkgPSAyLAorCQkuaHBpX2J1ZmZlcl9jYXAgID0gNywKKwkJLnNlbnNvcl9mbGFncwkgPSBHTzcwMDdfU0VOU09SXzY1NiB8CisJCQkJCUdPNzAwN19TRU5TT1JfVFYsCisJCS5udW1faTJjX2RldnMJID0gMSwKKwkJLmkyY19kZXZzCSA9IHsKKwkJCXsKKwkJCQkuaWQJPSBJMkNfRFJJVkVSSURfUzIyNTAsCisJCQkJLmFkZHIJPSAweDM0LAorCQkJfSwKKwkJfSwKKwkJLm51bV9pbnB1dHMJID0gMiwKKwkJLmlucHV0cyAJID0geworCQkJeworCQkJCS52aWRlb19pbnB1dAk9IDAsCisJCQkJLm5hbWUJCT0gIkNvbXBvc2l0ZSIsCisJCQl9LAorCQkJeworCQkJCS52aWRlb19pbnB1dAk9IDEsCisJCQkJLm5hbWUJCT0gIlMtVmlkZW8iLAorCQkJfSwKKwkJfSwKKwl9LAorfTsKKwogc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2lkIGdvNzAwN191c2JfaWRfdGFibGVbXSA9IHsKIAl7CiAJCS5tYXRjaF9mbGFncwk9IFVTQl9ERVZJQ0VfSURfTUFUQ0hfREVWSUNFX0FORF9WRVJTSU9OIHwKQEAgLTQ5MSw2ICs1MjYsMTQgQEAKIAkJLmJjZERldmljZV9oaQk9IDB4MSwKIAkJLmRyaXZlcl9pbmZvCT0gKGtlcm5lbF91bG9uZ190KUdPNzAwN19CT0FSRElEX0xJRkVWSUVXX0xSMTkyLAogCX0sCisJeworCQkubWF0Y2hfZmxhZ3MJPSBVU0JfREVWSUNFX0lEX01BVENIX0RFVklDRV9BTkRfVkVSU0lPTiwKKwkJLmlkVmVuZG9yCT0gMHgxOTQzLCAgLyogVmVuZG9yIElEIFNlbnNvcmF5ICovCisJCS5pZFByb2R1Y3QJPSAweDIyNTAsICAvKiBQcm9kdWN0IElEIG9mIDIyNTAvMjI1MSAqLworCQkuYmNkRGV2aWNlX2xvCT0gMHgxLAorCQkuYmNkRGV2aWNlX2hpCT0gMHgxLAorCQkuZHJpdmVyX2luZm8JPSAoa2VybmVsX3Vsb25nX3QpR083MDA3X0JPQVJESURfU0VOU09SQVlfMjI1MCwKKwl9LAogCXsgfQkJCQkJLyogVGVybWluYXRpbmcgZW50cnkgKi8KIH07CiAKQEAgLTYzNyw5ICs2ODAsMTAgQEAKIHsKIAlzdHJ1Y3QgZ283MDA3ICpnbyA9IChzdHJ1Y3QgZ283MDA3ICopdXJiLT5jb250ZXh0OwogCXUxNiAqcmVncyA9ICh1MTYgKil1cmItPnRyYW5zZmVyX2J1ZmZlcjsKKwlpbnQgc3RhdHVzID0gdXJiLT5zdGF0dXM7CiAKLQlpZiAodXJiLT5zdGF0dXMgIT0gMCkgewotCQlpZiAodXJiLT5zdGF0dXMgIT0gLUVTSFVURE9XTiAmJgorCWlmIChzdGF0dXMpIHsKKwkJaWYgKHN0YXR1cyAhPSAtRVNIVVRET1dOICYmCiAJCQkJZ28tPnN0YXR1cyAhPSBTVEFUVVNfU0hVVERPV04pIHsKIAkJCXByaW50ayhLRVJOX0VSUgogCQkJCSJnbzcwMDctdXNiOiBlcnJvciBpbiByZWFkIGludGVycnVwdDogJWRcbiIsCkBAIC02ODAsMTUgKzcyNCwxNCBAQAogc3RhdGljIHZvaWQgZ283MDA3X3VzYl9yZWFkX3ZpZGVvX3BpcGVfY29tcGxldGUoc3RydWN0IHVyYiAqdXJiKQogewogCXN0cnVjdCBnbzcwMDcgKmdvID0gKHN0cnVjdCBnbzcwMDcgKil1cmItPmNvbnRleHQ7Ci0JaW50IHI7CisJaW50IHIsIHN0YXR1cyA9IHVyYi0+IHN0YXR1czsKIAogCWlmICghZ28tPnN0cmVhbWluZykgewogCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmdvLT5mcmFtZV93YWl0cSk7CiAJCXJldHVybjsKIAl9Ci0JaWYgKHVyYi0+c3RhdHVzICE9IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJnbzcwMDctdXNiOiBlcnJvciBpbiB2aWRlbyBwaXBlOiAlZFxuIiwKLQkJCQl1cmItPnN0YXR1cyk7CisJaWYgKHN0YXR1cykgeworCQlwcmludGsoS0VSTl9FUlIgImdvNzAwNy11c2I6IGVycm9yIGluIHZpZGVvIHBpcGU6ICVkXG4iLCBzdGF0dXMpOwogCQlyZXR1cm47CiAJfQogCWlmICh1cmItPmFjdHVhbF9sZW5ndGggIT0gdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoKSB7CkBAIC03MDQsMTMgKzc0NywxMiBAQAogc3RhdGljIHZvaWQgZ283MDA3X3VzYl9yZWFkX2F1ZGlvX3BpcGVfY29tcGxldGUoc3RydWN0IHVyYiAqdXJiKQogewogCXN0cnVjdCBnbzcwMDcgKmdvID0gKHN0cnVjdCBnbzcwMDcgKil1cmItPmNvbnRleHQ7Ci0JaW50IHI7CisJaW50IHIsIHN0YXR1cyA9IHVyYi0+c3RhdHVzOwogCiAJaWYgKCFnby0+c3RyZWFtaW5nKQogCQlyZXR1cm47Ci0JaWYgKHVyYi0+c3RhdHVzICE9IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJnbzcwMDctdXNiOiBlcnJvciBpbiBhdWRpbyBwaXBlOiAlZFxuIiwKLQkJCQl1cmItPnN0YXR1cyk7CisJaWYgKHN0YXR1cykgeworCQlwcmludGsoS0VSTl9FUlIgImdvNzAwNy11c2I6IGVycm9yIGluIGF1ZGlvIHBpcGU6ICVkXG4iLCBzdGF0dXMpOwogCQlyZXR1cm47CiAJfQogCWlmICh1cmItPmFjdHVhbF9sZW5ndGggIT0gdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoKSB7CkBAIC03NTEsNyArNzkzLDcgQEAKIAlyZXR1cm4gMDsKIAogYXVkaW9fc3VibWl0X2ZhaWxlZDoKLQlmb3IgKGkgPSAwOyBpIDwgODsgKytpKQorCWZvciAoaSA9IDA7IGkgPCA3OyArK2kpCiAJCXVzYl9raWxsX3VyYih1c2ItPmF1ZGlvX3VyYnNbaV0pOwogdmlkZW9fc3VibWl0X2ZhaWxlZDoKIAlmb3IgKGkgPSAwOyBpIDwgODsgKytpKQpAQCAtOTY1LDE2ICsxMDA3LDIwIEBACiAJCW5hbWUgPSAiTGlmZXZpZXcgVFYgV2Fsa2VyIFVsdHJhIjsKIAkJYm9hcmQgPSAmYm9hcmRfbGlmZXZpZXdfbHIxOTI7CiAJCWJyZWFrOworCWNhc2UgR083MDA3X0JPQVJESURfU0VOU09SQVlfMjI1MDoKKwkJcHJpbnRrKEtFUk5fSU5GTyAiU2Vuc29yYXkgMjI1MCBmb3VuZFxuIik7CisJCW5hbWUgPSAiU2Vuc29yYXkgMjI1MC8yMjUxXG4iOworCQlib2FyZCA9ICZib2FyZF9zZW5zb3JheV8yMjUwOworCQlicmVhazsKIAlkZWZhdWx0OgogCQlwcmludGsoS0VSTl9FUlIgImdvNzAwNy11c2I6IHVua25vd24gYm9hcmQgSUQgJWQhXG4iLAogCQkJCSh1bnNpZ25lZCBpbnQpaWQtPmRyaXZlcl9pbmZvKTsKIAkJcmV0dXJuIDA7CiAJfQogCi0JdXNiID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGdvNzAwN191c2IpLCBHRlBfS0VSTkVMKTsKKwl1c2IgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZ283MDA3X3VzYiksIEdGUF9LRVJORUwpOwogCWlmICh1c2IgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07Ci0JbWVtc2V0KHVzYiwgMCwgc2l6ZW9mKHN0cnVjdCBnbzcwMDdfdXNiKSk7CiAKIAkvKiBBbGxvY2F0ZSB0aGUgVVJCIGFuZCBidWZmZXIgZm9yIHJlY2VpdmluZyBpbmNvbWluZyBpbnRlcnJ1cHRzICovCiAJdXNiLT5pbnRyX3VyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7CkBAIC0xMTc5LDYgKzEyMjUsNyBAQAogewogCXN0cnVjdCBnbzcwMDcgKmdvID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsKIAlzdHJ1Y3QgZ283MDA3X3VzYiAqdXNiID0gZ28tPmhwaV9jb250ZXh0OworCXN0cnVjdCB1cmIgKnZ1cmIsICphdXJiOwogCWludCBpOwogCiAJZ28tPnN0YXR1cyA9IFNUQVRVU19TSFVURE9XTjsKQEAgLTExODYsMTUgKzEyMzMsMTkgQEAKIAogCS8qIEZyZWUgVVNCLXJlbGF0ZWQgc3RydWN0cyAqLwogCWZvciAoaSA9IDA7IGkgPCA4OyArK2kpIHsKLQkJaWYgKHVzYi0+dmlkZW9fdXJic1tpXSAhPSBOVUxMKSB7Ci0JCQlpZiAodXNiLT52aWRlb191cmJzW2ldLT50cmFuc2Zlcl9idWZmZXIgIT0gTlVMTCkKLQkJCQlrZnJlZSh1c2ItPnZpZGVvX3VyYnNbaV0tPnRyYW5zZmVyX2J1ZmZlcik7Ci0JCQl1c2JfZnJlZV91cmIodXNiLT52aWRlb191cmJzW2ldKTsKKwkJdnVyYiA9IHVzYi0+dmlkZW9fdXJic1tpXTsKKwkJaWYgKHZ1cmIpIHsKKwkJCXVzYl9raWxsX3VyYih2dXJiKTsKKwkJCWlmICh2dXJiLT50cmFuc2Zlcl9idWZmZXIpCisJCQkJa2ZyZWUodnVyYi0+dHJhbnNmZXJfYnVmZmVyKTsKKwkJCXVzYl9mcmVlX3VyYih2dXJiKTsKIAkJfQotCQlpZiAodXNiLT5hdWRpb191cmJzW2ldICE9IE5VTEwpIHsKLQkJCWlmICh1c2ItPmF1ZGlvX3VyYnNbaV0tPnRyYW5zZmVyX2J1ZmZlciAhPSBOVUxMKQotCQkJCWtmcmVlKHVzYi0+YXVkaW9fdXJic1tpXS0+dHJhbnNmZXJfYnVmZmVyKTsKLQkJCXVzYl9mcmVlX3VyYih1c2ItPmF1ZGlvX3VyYnNbaV0pOworCQlhdXJiID0gdXNiLT5hdWRpb191cmJzW2ldOworCQlpZiAoYXVyYikgeworCQkJdXNiX2tpbGxfdXJiKGF1cmIpOworCQkJaWYgKGF1cmItPnRyYW5zZmVyX2J1ZmZlcikKKwkJCQlrZnJlZShhdXJiLT50cmFuc2Zlcl9idWZmZXIpOworCQkJdXNiX2ZyZWVfdXJiKGF1cmIpOwogCQl9CiAJfQogCWtmcmVlKHVzYi0+aW50cl91cmItPnRyYW5zZmVyX2J1ZmZlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ283MDA3L2dvNzAwNy12NGwyLmMgYi9kcml2ZXJzL3N0YWdpbmcvZ283MDA3L2dvNzAwNy12NGwyLmMKaW5kZXggOTRlMTE0MS4uODY4ZWRiNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2dvNzAwNy9nbzcwMDctdjRsMi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9nbzcwMDcvZ283MDA3LXY0bDIuYwpAQCAtMzgsNiArMzgsMTQgQEAKICNpbmNsdWRlICJnbzcwMDctcHJpdi5oIgogI2luY2x1ZGUgIndpcy1pMmMuaCIKIAorLyogVGVtcG9yYXJ5IGRlZmluZXMgdW50aWwgYWNjZXB0ZWQgaW4gdjRsLWR2YiAqLworI2lmbmRlZiBWNEwyX01QRUdfU1RSRUFNX1RZUEVfTVBFR19FTEVNCisjZGVmaW5lCVY0TDJfTVBFR19TVFJFQU1fVFlQRV9NUEVHX0VMRU0gICA2IC8qIE1QRUcgZWxlbWVudGFyeSBzdHJlYW0gKi8KKyNlbmRpZgorI2lmbmRlZiBWNEwyX01QRUdfVklERU9fRU5DT0RJTkdfTVBFR180CisjZGVmaW5lCVY0TDJfTVBFR19WSURFT19FTkNPRElOR19NUEVHXzQgICAzCisjZW5kaWYKKwogc3RhdGljIHZvaWQgZGVhY3RpdmF0ZV9idWZmZXIoc3RydWN0IGdvNzAwN19idWZmZXIgKmdvYnVmKQogewogCWludCBpOwpAQCAtODEsNyArODksNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGdvNzAwN19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQorc3RhdGljIGludCBnbzcwMDdfb3BlbihzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKIAlzdHJ1Y3QgZ283MDA3ICpnbyA9IHZpZGVvX2dldF9kcnZkYXRhKHZpZGVvX2RldmRhdGEoZmlsZSkpOwogCXN0cnVjdCBnbzcwMDdfZmlsZSAqZ29maDsKQEAgLTk5LDcgKzEwNyw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZ283MDA3X3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCitzdGF0aWMgaW50IGdvNzAwN19yZWxlYXNlKHN0cnVjdCBmaWxlICpmaWxlKQogewogCXN0cnVjdCBnbzcwMDdfZmlsZSAqZ29maCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAlzdHJ1Y3QgZ283MDA3ICpnbyA9IGdvZmgtPmdvOwpAQCAtMzE5LDYgKzMyNyw3IEBACiAJcmV0dXJuIDA7CiB9CiAKKyNpZiAwCiBzdGF0aWMgaW50IGNsaXBfdG9fbW9kZXRfbWFwKHN0cnVjdCBnbzcwMDcgKmdvLCBpbnQgcmVnaW9uLAogCQlzdHJ1Y3QgdjRsMl9jbGlwICpjbGlwX2xpc3QpCiB7CkBAIC0zNzUsNDk5ICszODQsODAxIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZ283MDA3X2RvX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAotCQl1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpCitzdGF0aWMgaW50IG1wZWdfcXVlcnljdHJsKHUzMiBpZCwgc3RydWN0IHY0bDJfcXVlcnljdHJsICpjdHJsKQogewotCXN0cnVjdCBnbzcwMDdfZmlsZSAqZ29maCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgZ283MDA3ICpnbyA9IGdvZmgtPmdvOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IHJldHZhbCA9IDA7CisJc3RhdGljIGNvbnN0IHUzMiB1c2VyX2N0cmxzW10gPSB7CisJCVY0TDJfQ0lEX1VTRVJfQ0xBU1MsCisJCTAKKwl9OworCXN0YXRpYyBjb25zdCB1MzIgbXBlZ19jdHJsc1tdID0geworCQlWNEwyX0NJRF9NUEVHX0NMQVNTLAorCQlWNEwyX0NJRF9NUEVHX1NUUkVBTV9UWVBFLAorCQlWNEwyX0NJRF9NUEVHX1ZJREVPX0VOQ09ESU5HLAorCQlWNEwyX0NJRF9NUEVHX1ZJREVPX0FTUEVDVCwKKwkJVjRMMl9DSURfTVBFR19WSURFT19HT1BfU0laRSwKKwkJVjRMMl9DSURfTVBFR19WSURFT19HT1BfQ0xPU1VSRSwKKwkJVjRMMl9DSURfTVBFR19WSURFT19CSVRSQVRFLAorCQkwCisJfTsKKwlzdGF0aWMgY29uc3QgdTMyICpjdHJsX2NsYXNzZXNbXSA9IHsKKwkJdXNlcl9jdHJscywKKwkJbXBlZ19jdHJscywKKwkJTlVMTAorCX07CiAKLQlzd2l0Y2ggKGNtZCkgewotCWNhc2UgVklESU9DX1FVRVJZQ0FQOgotCXsKLQkJc3RydWN0IHY0bDJfY2FwYWJpbGl0eSAqY2FwID0gYXJnOwotCi0JCW1lbXNldChjYXAsIDAsIHNpemVvZigqY2FwKSk7Ci0JCXN0cmNweShjYXAtPmRyaXZlciwgImdvNzAwNyIpOwotCQlzdHJuY3B5KGNhcC0+Y2FyZCwgZ28tPm5hbWUsIHNpemVvZihjYXAtPmNhcmQpKTsKLQkJY2FwLT52ZXJzaW9uID0gS0VSTkVMX1ZFUlNJT04oMCwgOSwgOCk7Ci0JCWNhcC0+Y2FwYWJpbGl0aWVzID0gVjRMMl9DQVBfVklERU9fQ0FQVFVSRSB8Ci0JCQkJVjRMMl9DQVBfU1RSRUFNSU5HOyAvKiB8IFY0TDJfQ0FQX0FVRElPOyAqLwotCQlpZiAoZ28tPmJvYXJkX2luZm8tPmZsYWdzICYgR083MDA3X0JPQVJEX0hBU19UVU5FUikKLQkJCWNhcC0+Y2FwYWJpbGl0aWVzIHw9IFY0TDJfQ0FQX1RVTkVSOworCS8qIFRoZSBjdHJsIG1heSBhbHJlYWR5IGNvbnRhaW4gdGhlIHF1ZXJpZWQgaTJjIGNvbnRyb2xzLAorCSAqIHF1ZXJ5IHRoZSBtcGVnIGNvbnRyb2xzIGlmIHRoZSBleGlzdGluZyBjdHJsIGlkIGlzCisJICogZ3JlYXRlciB0aGFuIHRoZSBuZXh0IG1wZWcgY3RybCBpZC4KKwkgKi8KKwlpZCA9IHY0bDJfY3RybF9uZXh0KGN0cmxfY2xhc3NlcywgaWQpOworCWlmIChpZCA+PSBjdHJsLT5pZCAmJiBjdHJsLT5uYW1lWzBdKQogCQlyZXR1cm4gMDsKLQl9Ci0JY2FzZSBWSURJT0NfRU5VTV9GTVQ6Ci0JewotCQlzdHJ1Y3QgdjRsMl9mbXRkZXNjICpmbXQgPSBhcmc7Ci0JCXVuc2lnbmVkIGludCBpbmRleDsKLQkJY2hhciAqZGVzYzsKLQkJdTMyIHBpeGVsZm9ybWF0OwogCi0JCWlmIChmbXQtPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCXN3aXRjaCAoZm10LT5pbmRleCkgewotCQljYXNlIDA6Ci0JCQlwaXhlbGZvcm1hdCA9IFY0TDJfUElYX0ZNVF9NSlBFRzsKLQkJCWRlc2MgPSAiTW90aW9uLUpQRUciOworCW1lbXNldChjdHJsLCAwLCBzaXplb2YoKmN0cmwpKTsKKwljdHJsLT5pZCA9IGlkOworCisJc3dpdGNoIChjdHJsLT5pZCkgeworCWNhc2UgVjRMMl9DSURfVVNFUl9DTEFTUzoKKwljYXNlIFY0TDJfQ0lEX01QRUdfQ0xBU1M6CisJCXJldHVybiB2NGwyX2N0cmxfcXVlcnlfZmlsbF9zdGQoY3RybCk7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1NUUkVBTV9UWVBFOgorCQlyZXR1cm4gdjRsMl9jdHJsX3F1ZXJ5X2ZpbGwoY3RybCwKKwkJCQlWNEwyX01QRUdfU1RSRUFNX1RZUEVfTVBFRzJfRFZELAorCQkJCVY0TDJfTVBFR19TVFJFQU1fVFlQRV9NUEVHX0VMRU0sIDEsCisJCQkJVjRMMl9NUEVHX1NUUkVBTV9UWVBFX01QRUdfRUxFTSk7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0VOQ09ESU5HOgorCQlyZXR1cm4gdjRsMl9jdHJsX3F1ZXJ5X2ZpbGwoY3RybCwKKwkJCQlWNEwyX01QRUdfVklERU9fRU5DT0RJTkdfTVBFR18xLAorCQkJCVY0TDJfTVBFR19WSURFT19FTkNPRElOR19NUEVHXzQsIDEsCisJCQkJVjRMMl9NUEVHX1ZJREVPX0VOQ09ESU5HX01QRUdfMik7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0FTUEVDVDoKKwkJcmV0dXJuIHY0bDJfY3RybF9xdWVyeV9maWxsKGN0cmwsCisJCQkJVjRMMl9NUEVHX1ZJREVPX0FTUEVDVF8xeDEsCisJCQkJVjRMMl9NUEVHX1ZJREVPX0FTUEVDVF8xNng5LCAxLAorCQkJCVY0TDJfTVBFR19WSURFT19BU1BFQ1RfMXgxKTsKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fR09QX1NJWkU6CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0dPUF9DTE9TVVJFOgorCQlyZXR1cm4gdjRsMl9jdHJsX3F1ZXJ5X2ZpbGxfc3RkKGN0cmwpOworCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19CSVRSQVRFOgorCQlyZXR1cm4gdjRsMl9jdHJsX3F1ZXJ5X2ZpbGwoY3RybCwKKwkJCQk2NDAwMCwKKwkJCQkxMDAwMDAwMCwgMSwKKwkJCQk5ODAwMDAwKTsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgbXBlZ19zX2NvbnRyb2woc3RydWN0IHY0bDJfY29udHJvbCAqY3RybCwgc3RydWN0IGdvNzAwNyAqZ28pCit7CisJLyogcHJldHR5IHN1cmUgd2UgY2FuJ3QgY2hhbmdlIGFueSBvZiB0aGVzZSB3aGlsZSBzdHJlYW1pbmcgKi8KKwlpZiAoZ28tPnN0cmVhbWluZykKKwkJcmV0dXJuIC1FQlVTWTsKKworCXN3aXRjaCAoY3RybC0+aWQpIHsKKwljYXNlIFY0TDJfQ0lEX01QRUdfU1RSRUFNX1RZUEU6CisJCXN3aXRjaCAoY3RybC0+dmFsdWUpIHsKKwkJY2FzZSBWNEwyX01QRUdfU1RSRUFNX1RZUEVfTVBFRzJfRFZEOgorCQkJZ28tPmZvcm1hdCA9IEdPNzAwN19GT1JNQVRfTVBFRzI7CisJCQlnby0+Yml0cmF0ZSA9IDk4MDAwMDA7CisJCQlnby0+Z29wX3NpemUgPSAxNTsKKwkJCWdvLT5wYWxpID0gMHg0ODsKKwkJCWdvLT5jbG9zZWRfZ29wID0gMTsKKwkJCWdvLT5yZXBlYXRfc2VxaGVhZCA9IDA7CisJCQlnby0+c2VxX2hlYWRlcl9lbmFibGUgPSAxOworCQkJZ28tPmdvcF9oZWFkZXJfZW5hYmxlID0gMTsKKwkJCWdvLT5kdmRfbW9kZSA9IDE7CiAJCQlicmVhazsKLQkJY2FzZSAxOgotCQkJcGl4ZWxmb3JtYXQgPSBWNEwyX1BJWF9GTVRfTVBFRzsKLQkJCWRlc2MgPSAiTVBFRzEvTVBFRzIvTVBFRzQiOworCQljYXNlIFY0TDJfTVBFR19TVFJFQU1fVFlQRV9NUEVHX0VMRU06CisJCQkvKiB0b2RvOiAqLwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQotCQlpbmRleCA9IGZtdC0+aW5kZXg7Ci0JCW1lbXNldChmbXQsIDAsIHNpemVvZigqZm10KSk7Ci0JCWZtdC0+aW5kZXggPSBpbmRleDsKLQkJZm10LT50eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOwotCQlmbXQtPmZsYWdzID0gVjRMMl9GTVRfRkxBR19DT01QUkVTU0VEOwotCQlzdHJuY3B5KGZtdC0+ZGVzY3JpcHRpb24sIGRlc2MsIHNpemVvZihmbXQtPmRlc2NyaXB0aW9uKSk7Ci0JCWZtdC0+cGl4ZWxmb3JtYXQgPSBwaXhlbGZvcm1hdDsKLQotCQlyZXR1cm4gMDsKLQl9Ci0JY2FzZSBWSURJT0NfVFJZX0ZNVDoKLQl7Ci0JCXN0cnVjdCB2NGwyX2Zvcm1hdCAqZm10ID0gYXJnOwotCi0JCWlmIChmbXQtPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKQorCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fRU5DT0RJTkc6CisJCXN3aXRjaCAoY3RybC0+dmFsdWUpIHsKKwkJY2FzZSBWNEwyX01QRUdfVklERU9fRU5DT0RJTkdfTVBFR18xOgorCQkJZ28tPmZvcm1hdCA9IEdPNzAwN19GT1JNQVRfTVBFRzE7CisJCQlnby0+cGFsaSA9IDA7CisJCQlicmVhazsKKwkJY2FzZSBWNEwyX01QRUdfVklERU9fRU5DT0RJTkdfTVBFR18yOgorCQkJZ28tPmZvcm1hdCA9IEdPNzAwN19GT1JNQVRfTVBFRzI7CisJCQkvKmlmIChtcGVnLT5wYWxpID4+IDI0ID09IDIpCisJCQkJZ28tPnBhbGkgPSBtcGVnLT5wYWxpICYgMHhmZjsKKwkJCWVsc2UqLworCQkJCWdvLT5wYWxpID0gMHg0ODsKKwkJCWJyZWFrOworCQljYXNlIFY0TDJfTVBFR19WSURFT19FTkNPRElOR19NUEVHXzQ6CisJCQlnby0+Zm9ybWF0ID0gR083MDA3X0ZPUk1BVF9NUEVHNDsKKwkJCS8qaWYgKG1wZWctPnBhbGkgPj4gMjQgPT0gNCkKKwkJCQlnby0+cGFsaSA9IG1wZWctPnBhbGkgJiAweGZmOworCQkJZWxzZSovCisJCQkJZ28tPnBhbGkgPSAweGY1OworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CiAJCQlyZXR1cm4gLUVJTlZBTDsKLQkJcmV0dXJuIHNldF9jYXB0dXJlX3NpemUoZ28sIGZtdCwgMSk7Ci0JfQotCWNhc2UgVklESU9DX0dfRk1UOgotCXsKLQkJc3RydWN0IHY0bDJfZm9ybWF0ICpmbXQgPSBhcmc7Ci0KLQkJaWYgKGZtdC0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpCisJCX0KKwkJZ28tPmdvcF9oZWFkZXJfZW5hYmxlID0KKwkJCS8qbXBlZy0+ZmxhZ3MgJiBHTzcwMDdfTVBFR19PTUlUX0dPUF9IRUFERVIKKwkJCT8gMCA6Ki8gMTsKKwkJLyppZiAobXBlZy0+ZmxhZ3MgJiBHTzcwMDdfTVBFR19SRVBFQVRfU0VRSEVBREVSKQorCQkJZ28tPnJlcGVhdF9zZXFoZWFkID0gMTsKKwkJZWxzZSovCisJCQlnby0+cmVwZWF0X3NlcWhlYWQgPSAwOworCQlnby0+ZHZkX21vZGUgPSAwOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fQVNQRUNUOgorCQlpZiAoZ28tPmZvcm1hdCA9PSBHTzcwMDdfRk9STUFUX01KUEVHKQogCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCW1lbXNldChmbXQsIDAsIHNpemVvZigqZm10KSk7Ci0JCWZtdC0+dHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRTsKLQkJZm10LT5mbXQucGl4LndpZHRoID0gZ28tPndpZHRoOwotCQlmbXQtPmZtdC5waXguaGVpZ2h0ID0gZ28tPmhlaWdodDsKLQkJZm10LT5mbXQucGl4LnBpeGVsZm9ybWF0ID0gZ28tPmZvcm1hdCA9PSBHTzcwMDdfRk9STUFUX01KUEVHID8KLQkJCVY0TDJfUElYX0ZNVF9NSlBFRyA6IFY0TDJfUElYX0ZNVF9NUEVHOwotCQlmbXQtPmZtdC5waXguZmllbGQgPSBWNEwyX0ZJRUxEX05PTkU7Ci0JCWZtdC0+Zm10LnBpeC5ieXRlc3BlcmxpbmUgPSAwOwotCQlmbXQtPmZtdC5waXguc2l6ZWltYWdlID0gR083MDA3X0JVRl9TSVpFOwotCQlmbXQtPmZtdC5waXguY29sb3JzcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV9TTVBURTE3ME07IC8qID8/ICovCi0JCXJldHVybiAwOwotCX0KLQljYXNlIFZJRElPQ19TX0ZNVDoKLQl7Ci0JCXN0cnVjdCB2NGwyX2Zvcm1hdCAqZm10ID0gYXJnOwotCi0JCWlmIChmbXQtPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKQorCQlzd2l0Y2ggKGN0cmwtPnZhbHVlKSB7CisJCWNhc2UgVjRMMl9NUEVHX1ZJREVPX0FTUEVDVF8xeDE6CisJCQlnby0+YXNwZWN0X3JhdGlvID0gR083MDA3X1JBVElPXzFfMTsKKwkJCWJyZWFrOworCQljYXNlIFY0TDJfTVBFR19WSURFT19BU1BFQ1RfNHgzOgorCQkJZ28tPmFzcGVjdF9yYXRpbyA9IEdPNzAwN19SQVRJT180XzM7CisJCQlicmVhazsKKwkJY2FzZSBWNEwyX01QRUdfVklERU9fQVNQRUNUXzE2eDk6CisJCQlnby0+YXNwZWN0X3JhdGlvID0gR083MDA3X1JBVElPXzE2Xzk7CisJCQlicmVhazsKKwkJY2FzZSBWNEwyX01QRUdfVklERU9fQVNQRUNUXzIyMXgxMDA6CisJCWRlZmF1bHQ6CiAJCQlyZXR1cm4gLUVJTlZBTDsKLQkJaWYgKGdvLT5zdHJlYW1pbmcpCi0JCQlyZXR1cm4gLUVCVVNZOwotCQlyZXR1cm4gc2V0X2NhcHR1cmVfc2l6ZShnbywgZm10LCAwKTsKLQl9Ci0JY2FzZSBWSURJT0NfR19GQlVGOgotCWNhc2UgVklESU9DX1NfRkJVRjoKKwkJfQorCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fR09QX1NJWkU6CisJCWdvLT5nb3Bfc2l6ZSA9IGN0cmwtPnZhbHVlOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fR09QX0NMT1NVUkU6CisJCWlmIChjdHJsLT52YWx1ZSAhPSAwICYmIGN0cmwtPnZhbHVlICE9IDEpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJZ28tPmNsb3NlZF9nb3AgPSBjdHJsLT52YWx1ZTsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0JJVFJBVEU6CisJCS8qIFVwcGVyIGJvdW5kIGlzIGtpbmQgb2YgYXJiaXRyYXJ5IGhlcmUgKi8KKwkJaWYgKGN0cmwtPnZhbHVlIDwgNjQwMDAgfHwgY3RybC0+dmFsdWUgPiAxMDAwMDAwMCkKKwkJCXJldHVybiAtRUlOVkFMOworCQlnby0+Yml0cmF0ZSA9IGN0cmwtPnZhbHVlOworCQlicmVhazsKKwlkZWZhdWx0OgogCQlyZXR1cm4gLUVJTlZBTDsKLQljYXNlIFZJRElPQ19SRVFCVUZTOgotCXsKLQkJc3RydWN0IHY0bDJfcmVxdWVzdGJ1ZmZlcnMgKnJlcSA9IGFyZzsKLQkJdW5zaWduZWQgaW50IGNvdW50LCBpOworCX0KKwlyZXR1cm4gMDsKK30KIAotCQlpZiAoZ28tPnN0cmVhbWluZykKLQkJCXJldHVybiAtRUJVU1k7Ci0JCWlmIChyZXEtPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFIHx8Ci0JCQkJcmVxLT5tZW1vcnkgIT0gVjRMMl9NRU1PUllfTU1BUCkKK3N0YXRpYyBpbnQgbXBlZ19nX2NvbnRyb2woc3RydWN0IHY0bDJfY29udHJvbCAqY3RybCwgc3RydWN0IGdvNzAwNyAqZ28pCit7CisJc3dpdGNoIChjdHJsLT5pZCkgeworCWNhc2UgVjRMMl9DSURfTVBFR19TVFJFQU1fVFlQRToKKwkJaWYgKGdvLT5kdmRfbW9kZSkKKwkJCWN0cmwtPnZhbHVlID0gVjRMMl9NUEVHX1NUUkVBTV9UWVBFX01QRUcyX0RWRDsKKwkJZWxzZQorCQkJY3RybC0+dmFsdWUgPSBWNEwyX01QRUdfU1RSRUFNX1RZUEVfTVBFR19FTEVNOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fRU5DT0RJTkc6CisJCXN3aXRjaCAoZ28tPmZvcm1hdCkgeworCQljYXNlIEdPNzAwN19GT1JNQVRfTVBFRzE6CisJCQljdHJsLT52YWx1ZSA9IFY0TDJfTVBFR19WSURFT19FTkNPRElOR19NUEVHXzE7CisJCQlicmVhazsKKwkJY2FzZSBHTzcwMDdfRk9STUFUX01QRUcyOgorCQkJY3RybC0+dmFsdWUgPSBWNEwyX01QRUdfVklERU9fRU5DT0RJTkdfTVBFR18yOworCQkJYnJlYWs7CisJCWNhc2UgR083MDA3X0ZPUk1BVF9NUEVHNDoKKwkJCWN0cmwtPnZhbHVlID0gVjRMMl9NUEVHX1ZJREVPX0VOQ09ESU5HX01QRUdfNDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgogCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0FTUEVDVDoKKwkJc3dpdGNoIChnby0+YXNwZWN0X3JhdGlvKSB7CisJCWNhc2UgR083MDA3X1JBVElPXzFfMToKKwkJCWN0cmwtPnZhbHVlID0gVjRMMl9NUEVHX1ZJREVPX0FTUEVDVF8xeDE7CisJCQlicmVhazsKKwkJY2FzZSBHTzcwMDdfUkFUSU9fNF8zOgorCQkJY3RybC0+dmFsdWUgPSBWNEwyX01QRUdfVklERU9fQVNQRUNUXzR4MzsKKwkJCWJyZWFrOworCQljYXNlIEdPNzAwN19SQVRJT18xNl85OgorCQkJY3RybC0+dmFsdWUgPSBWNEwyX01QRUdfVklERU9fQVNQRUNUXzE2eDk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19HT1BfU0laRToKKwkJY3RybC0+dmFsdWUgPSBnby0+Z29wX3NpemU7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19HT1BfQ0xPU1VSRToKKwkJY3RybC0+dmFsdWUgPSBnby0+Y2xvc2VkX2dvcDsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0JJVFJBVEU6CisJCWN0cmwtPnZhbHVlID0gZ28tPmJpdHJhdGU7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gMDsKK30KKyNlbmRpZgogCi0JCWRvd24oJmdvZmgtPmxvY2spOwotCQlyZXR2YWwgPSAtRUJVU1k7Ci0JCWZvciAoaSA9IDA7IGkgPCBnb2ZoLT5idWZfY291bnQ7ICsraSkKLQkJCWlmIChnb2ZoLT5idWZzW2ldLm1hcHBlZCA+IDApCi0JCQkJZ290byB1bmxvY2tfYW5kX3JldHVybjsKLQkJZG93bigmZ28tPmh3X2xvY2spOwotCQlpZiAoZ28tPmluX3VzZSA+IDAgJiYgZ29maC0+YnVmX2NvdW50ID09IDApIHsKK3N0YXRpYyBpbnQgdmlkaW9jX3F1ZXJ5Y2FwKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICAqcHJpdiwKKwkJCQkJc3RydWN0IHY0bDJfY2FwYWJpbGl0eSAqY2FwKQoreworCXN0cnVjdCBnbzcwMDdfZmlsZSAqZ29maCA9IHByaXY7CisJc3RydWN0IGdvNzAwNyAqZ28gPSBnb2ZoLT5nbzsKKworCXN0cmxjcHkoY2FwLT5kcml2ZXIsICJnbzcwMDciLCBzaXplb2YoY2FwLT5kcml2ZXIpKTsKKwlzdHJsY3B5KGNhcC0+Y2FyZCwgZ28tPm5hbWUsIHNpemVvZihjYXAtPmNhcmQpKTsKKyNpZiAwCisJc3RybGNweShjYXAtPmJ1c19pbmZvLCBkZXZfbmFtZSgmZGV2LT51ZGV2LT5kZXYpLCBzaXplb2YoY2FwLT5idXNfaW5mbykpOworI2VuZGlmCisKKwljYXAtPnZlcnNpb24gPSBLRVJORUxfVkVSU0lPTigwLCA5LCA4KTsKKworCWNhcC0+Y2FwYWJpbGl0aWVzID0gVjRMMl9DQVBfVklERU9fQ0FQVFVSRSB8CisJCQkgICAgVjRMMl9DQVBfU1RSRUFNSU5HOyAvKiB8IFY0TDJfQ0FQX0FVRElPOyAqLworCisJaWYgKGdvLT5ib2FyZF9pbmZvLT5mbGFncyAmIEdPNzAwN19CT0FSRF9IQVNfVFVORVIpCisJCWNhcC0+Y2FwYWJpbGl0aWVzIHw9IFY0TDJfQ0FQX1RVTkVSOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX2VudW1fZm10X3ZpZF9jYXAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgICpwcml2LAorCQkJCQlzdHJ1Y3QgdjRsMl9mbXRkZXNjICpmbXQpCit7CisJY2hhciAqZGVzYyA9IE5VTEw7CisKKwlzd2l0Y2ggKGZtdC0+aW5kZXgpIHsKKwljYXNlIDA6CisJCWZtdC0+cGl4ZWxmb3JtYXQgPSBWNEwyX1BJWF9GTVRfTUpQRUc7CisJCWRlc2MgPSAiTW90aW9uLUpQRUciOworCQlicmVhazsKKwljYXNlIDE6CisJCWZtdC0+cGl4ZWxmb3JtYXQgPSBWNEwyX1BJWF9GTVRfTVBFRzsKKwkJZGVzYyA9ICJNUEVHMS9NUEVHMi9NUEVHNCI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlmbXQtPnR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU7CisJZm10LT5mbGFncyA9IFY0TDJfRk1UX0ZMQUdfQ09NUFJFU1NFRDsKKworCXN0cm5jcHkoZm10LT5kZXNjcmlwdGlvbiwgZGVzYywgc2l6ZW9mKGZtdC0+ZGVzY3JpcHRpb24pKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZpZGlvY19nX2ZtdF92aWRfY2FwKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJCQlzdHJ1Y3QgdjRsMl9mb3JtYXQgKmZtdCkKK3sKKwlzdHJ1Y3QgZ283MDA3X2ZpbGUgKmdvZmggPSBwcml2OworCXN0cnVjdCBnbzcwMDcgKmdvID0gZ29maC0+Z287CisKKwlmbXQtPnR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU7CisJZm10LT5mbXQucGl4LndpZHRoID0gZ28tPndpZHRoOworCWZtdC0+Zm10LnBpeC5oZWlnaHQgPSBnby0+aGVpZ2h0OworCWZtdC0+Zm10LnBpeC5waXhlbGZvcm1hdCA9IChnby0+Zm9ybWF0ID09IEdPNzAwN19GT1JNQVRfTUpQRUcpID8KKwkJCQkgICBWNEwyX1BJWF9GTVRfTUpQRUcgOiBWNEwyX1BJWF9GTVRfTVBFRzsKKwlmbXQtPmZtdC5waXguZmllbGQgPSBWNEwyX0ZJRUxEX05PTkU7CisJZm10LT5mbXQucGl4LmJ5dGVzcGVybGluZSA9IDA7CisJZm10LT5mbXQucGl4LnNpemVpbWFnZSA9IEdPNzAwN19CVUZfU0laRTsKKwlmbXQtPmZtdC5waXguY29sb3JzcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV9TTVBURTE3ME07CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2aWRpb2NfdHJ5X2ZtdF92aWRfY2FwKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJc3RydWN0IHY0bDJfZm9ybWF0ICpmbXQpCit7CisJc3RydWN0IGdvNzAwN19maWxlICpnb2ZoID0gcHJpdjsKKwlzdHJ1Y3QgZ283MDA3ICpnbyA9IGdvZmgtPmdvOworCisJcmV0dXJuIHNldF9jYXB0dXJlX3NpemUoZ28sIGZtdCwgMSk7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX3NfZm10X3ZpZF9jYXAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQlzdHJ1Y3QgdjRsMl9mb3JtYXQgKmZtdCkKK3sKKwlzdHJ1Y3QgZ283MDA3X2ZpbGUgKmdvZmggPSBwcml2OworCXN0cnVjdCBnbzcwMDcgKmdvID0gZ29maC0+Z287CisKKwlpZiAoZ28tPnN0cmVhbWluZykKKwkJcmV0dXJuIC1FQlVTWTsKKworCXJldHVybiBzZXRfY2FwdHVyZV9zaXplKGdvLCBmbXQsIDApOworfQorCitzdGF0aWMgaW50IHZpZGlvY19yZXFidWZzKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJICBzdHJ1Y3QgdjRsMl9yZXF1ZXN0YnVmZmVycyAqcmVxKQoreworCXN0cnVjdCBnbzcwMDdfZmlsZSAqZ29maCA9IHByaXY7CisJc3RydWN0IGdvNzAwNyAqZ28gPSBnb2ZoLT5nbzsKKwlpbnQgcmV0dmFsID0gLUVCVVNZOworCXVuc2lnbmVkIGludCBjb3VudCwgaTsKKworCWlmIChnby0+c3RyZWFtaW5nKQorCQlyZXR1cm4gcmV0dmFsOworCisJaWYgKHJlcS0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUgfHwKKwkJCXJlcS0+bWVtb3J5ICE9IFY0TDJfTUVNT1JZX01NQVApCisJCXJldHVybiAtRUlOVkFMOworCisJZG93bigmZ29maC0+bG9jayk7CisJZm9yIChpID0gMDsgaSA8IGdvZmgtPmJ1Zl9jb3VudDsgKytpKQorCQlpZiAoZ29maC0+YnVmc1tpXS5tYXBwZWQgPiAwKQorCQkJZ290byB1bmxvY2tfYW5kX3JldHVybjsKKworCWRvd24oJmdvLT5od19sb2NrKTsKKwlpZiAoZ28tPmluX3VzZSA+IDAgJiYgZ29maC0+YnVmX2NvdW50ID09IDApIHsKKwkJdXAoJmdvLT5od19sb2NrKTsKKwkJZ290byB1bmxvY2tfYW5kX3JldHVybjsKKwl9CisKKwlpZiAoZ29maC0+YnVmX2NvdW50ID4gMCkKKwkJa2ZyZWUoZ29maC0+YnVmcyk7CisKKwlyZXR2YWwgPSAtRU5PTUVNOworCWNvdW50ID0gcmVxLT5jb3VudDsKKwlpZiAoY291bnQgPiAwKSB7CisJCWlmIChjb3VudCA8IDIpCisJCQljb3VudCA9IDI7CisJCWlmIChjb3VudCA+IDMyKQorCQkJY291bnQgPSAzMjsKKworCQlnb2ZoLT5idWZzID0ga21hbGxvYyhjb3VudCAqIHNpemVvZihzdHJ1Y3QgZ283MDA3X2J1ZmZlciksCisJCQkJICAgICBHRlBfS0VSTkVMKTsKKworCQlpZiAoIWdvZmgtPmJ1ZnMpIHsKIAkJCXVwKCZnby0+aHdfbG9jayk7CiAJCQlnb3RvIHVubG9ja19hbmRfcmV0dXJuOwogCQl9Ci0JCWlmIChnb2ZoLT5idWZfY291bnQgPiAwKQotCQkJa2ZyZWUoZ29maC0+YnVmcyk7Ci0JCXJldHZhbCA9IC1FTk9NRU07Ci0JCWNvdW50ID0gcmVxLT5jb3VudDsKLQkJaWYgKGNvdW50ID4gMCkgewotCQkJaWYgKGNvdW50IDwgMikKLQkJCQljb3VudCA9IDI7Ci0JCQlpZiAoY291bnQgPiAzMikKLQkJCQljb3VudCA9IDMyOwotCQkJZ29maC0+YnVmcyA9IGttYWxsb2MoY291bnQgKgotCQkJCQkJc2l6ZW9mKHN0cnVjdCBnbzcwMDdfYnVmZmVyKSwKLQkJCQkJR0ZQX0tFUk5FTCk7Ci0JCQlpZiAoZ29maC0+YnVmcyA9PSBOVUxMKSB7Ci0JCQkJdXAoJmdvLT5od19sb2NrKTsKLQkJCQlnb3RvIHVubG9ja19hbmRfcmV0dXJuOwotCQkJfQotCQkJbWVtc2V0KGdvZmgtPmJ1ZnMsIDAsCi0JCQkJCWNvdW50ICogc2l6ZW9mKHN0cnVjdCBnbzcwMDdfYnVmZmVyKSk7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7ICsraSkgewotCQkJCWdvZmgtPmJ1ZnNbaV0uZ28gPSBnbzsKLQkJCQlnb2ZoLT5idWZzW2ldLmluZGV4ID0gaTsKLQkJCQlnb2ZoLT5idWZzW2ldLnN0YXRlID0gQlVGX1NUQVRFX0lETEU7Ci0JCQkJZ29maC0+YnVmc1tpXS5tYXBwZWQgPSAwOwotCQkJfQotCQkJZ28tPmluX3VzZSA9IDE7Ci0JCX0gZWxzZSB7Ci0JCQlnby0+aW5fdXNlID0gMDsKKworCQltZW1zZXQoZ29maC0+YnVmcywgMCwgY291bnQgKiBzaXplb2Yoc3RydWN0IGdvNzAwN19idWZmZXIpKTsKKworCQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7ICsraSkgeworCQkJZ29maC0+YnVmc1tpXS5nbyA9IGdvOworCQkJZ29maC0+YnVmc1tpXS5pbmRleCA9IGk7CisJCQlnb2ZoLT5idWZzW2ldLnN0YXRlID0gQlVGX1NUQVRFX0lETEU7CisJCQlnb2ZoLT5idWZzW2ldLm1hcHBlZCA9IDA7CiAJCX0KLQkJZ29maC0+YnVmX2NvdW50ID0gY291bnQ7Ci0JCXVwKCZnby0+aHdfbG9jayk7Ci0JCXVwKCZnb2ZoLT5sb2NrKTsKLQkJbWVtc2V0KHJlcSwgMCwgc2l6ZW9mKCpyZXEpKTsKLQkJcmVxLT5jb3VudCA9IGNvdW50OwotCQlyZXEtPnR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU7Ci0JCXJlcS0+bWVtb3J5ID0gVjRMMl9NRU1PUllfTU1BUDsKLQkJcmV0dXJuIDA7CisKKwkJZ28tPmluX3VzZSA9IDE7CisJfSBlbHNlIHsKKwkJZ28tPmluX3VzZSA9IDA7CiAJfQotCWNhc2UgVklESU9DX1FVRVJZQlVGOgotCXsKLQkJc3RydWN0IHY0bDJfYnVmZmVyICpidWYgPSBhcmc7Ci0JCXVuc2lnbmVkIGludCBpbmRleDsKIAotCQlyZXR2YWwgPSAtRUlOVkFMOwotCQlpZiAoYnVmLT50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkKLQkJCXJldHVybiAtRUlOVkFMOwotCQlpbmRleCA9IGJ1Zi0+aW5kZXg7Ci0JCWRvd24oJmdvZmgtPmxvY2spOwotCQlpZiAoaW5kZXggPj0gZ29maC0+YnVmX2NvdW50KQotCQkJZ290byB1bmxvY2tfYW5kX3JldHVybjsKLQkJbWVtc2V0KGJ1ZiwgMCwgc2l6ZW9mKCpidWYpKTsKLQkJYnVmLT5pbmRleCA9IGluZGV4OwotCQlidWYtPnR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU7Ci0JCXN3aXRjaCAoZ29maC0+YnVmc1tpbmRleF0uc3RhdGUpIHsKLQkJY2FzZSBCVUZfU1RBVEVfUVVFVUVEOgotCQkJYnVmLT5mbGFncyA9IFY0TDJfQlVGX0ZMQUdfUVVFVUVEOwotCQkJYnJlYWs7Ci0JCWNhc2UgQlVGX1NUQVRFX0RPTkU6Ci0JCQlidWYtPmZsYWdzID0gVjRMMl9CVUZfRkxBR19ET05FOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlidWYtPmZsYWdzID0gMDsKLQkJfQotCQlpZiAoZ29maC0+YnVmc1tpbmRleF0ubWFwcGVkKQotCQkJYnVmLT5mbGFncyB8PSBWNEwyX0JVRl9GTEFHX01BUFBFRDsKLQkJYnVmLT5tZW1vcnkgPSBWNEwyX01FTU9SWV9NTUFQOwotCQlidWYtPm0ub2Zmc2V0ID0gaW5kZXggKiBHTzcwMDdfQlVGX1NJWkU7Ci0JCWJ1Zi0+bGVuZ3RoID0gR083MDA3X0JVRl9TSVpFOwotCQl1cCgmZ29maC0+bG9jayk7CisJZ29maC0+YnVmX2NvdW50ID0gY291bnQ7CisJdXAoJmdvLT5od19sb2NrKTsKKwl1cCgmZ29maC0+bG9jayk7CiAKLQkJcmV0dXJuIDA7Ci0JfQotCWNhc2UgVklESU9DX1FCVUY6Ci0JewotCQlzdHJ1Y3QgdjRsMl9idWZmZXIgKmJ1ZiA9IGFyZzsKLQkJc3RydWN0IGdvNzAwN19idWZmZXIgKmdvYnVmOwotCQlpbnQgcmV0OworCW1lbXNldChyZXEsIDAsIHNpemVvZigqcmVxKSk7CiAKLQkJcmV0dmFsID0gLUVJTlZBTDsKLQkJaWYgKGJ1Zi0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUgfHwKLQkJCQlidWYtPm1lbW9yeSAhPSBWNEwyX01FTU9SWV9NTUFQKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWRvd24oJmdvZmgtPmxvY2spOwotCQlpZiAoYnVmLT5pbmRleCA8IDAgfHwgYnVmLT5pbmRleCA+PSBnb2ZoLT5idWZfY291bnQpCi0JCQlnb3RvIHVubG9ja19hbmRfcmV0dXJuOwotCQlnb2J1ZiA9ICZnb2ZoLT5idWZzW2J1Zi0+aW5kZXhdOwotCQlpZiAoZ29idWYtPm1hcHBlZCA9PSAwKQotCQkJZ290byB1bmxvY2tfYW5kX3JldHVybjsKLQkJcmV0dmFsID0gLUVCVVNZOwotCQlpZiAoZ29idWYtPnN0YXRlICE9IEJVRl9TVEFURV9JRExFKQotCQkJZ290byB1bmxvY2tfYW5kX3JldHVybjsKLQkJLyogb2Zmc2V0IHdpbGwgYmUgMCB1bnRpbCB3ZSByZWFsbHkgc3VwcG9ydCBVU0VSUFRSIHN0cmVhbWluZyAqLwotCQlnb2J1Zi0+b2Zmc2V0ID0gZ29idWYtPnVzZXJfYWRkciAmIH5QQUdFX01BU0s7Ci0JCWdvYnVmLT5ieXRlc3VzZWQgPSAwOwotCQlnb2J1Zi0+ZnJhbWVfb2Zmc2V0ID0gMDsKLQkJZ29idWYtPm1vZGV0X2FjdGl2ZSA9IDA7Ci0JCWlmIChnb2J1Zi0+b2Zmc2V0ID4gMCkKLQkJCWdvYnVmLT5wYWdlX2NvdW50ID0gR083MDA3X0JVRl9QQUdFUyArIDE7Ci0JCWVsc2UKLQkJCWdvYnVmLT5wYWdlX2NvdW50ID0gR083MDA3X0JVRl9QQUdFUzsKLQkJcmV0dmFsID0gLUVOT01FTTsKLQkJZG93bl9yZWFkKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOwotCQlyZXQgPSBnZXRfdXNlcl9wYWdlcyhjdXJyZW50LCBjdXJyZW50LT5tbSwKLQkJCQlnb2J1Zi0+dXNlcl9hZGRyICYgUEFHRV9NQVNLLCBnb2J1Zi0+cGFnZV9jb3VudCwKLQkJCQkxLCAxLCBnb2J1Zi0+cGFnZXMsIE5VTEwpOwotCQl1cF9yZWFkKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOwotCQlpZiAocmV0ICE9IGdvYnVmLT5wYWdlX2NvdW50KSB7Ci0JCQlpbnQgaTsKLQkJCWZvciAoaSA9IDA7IGkgPCByZXQ7ICsraSkKLQkJCQlwYWdlX2NhY2hlX3JlbGVhc2UoZ29idWYtPnBhZ2VzW2ldKTsKLQkJCWdvYnVmLT5wYWdlX2NvdW50ID0gMDsKLQkJCWdvdG8gdW5sb2NrX2FuZF9yZXR1cm47Ci0JCX0KLQkJZ29idWYtPnN0YXRlID0gQlVGX1NUQVRFX1FVRVVFRDsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmdvLT5zcGlubG9jaywgZmxhZ3MpOwotCQlsaXN0X2FkZF90YWlsKCZnb2J1Zi0+c3RyZWFtLCAmZ28tPnN0cmVhbSk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdvLT5zcGlubG9jaywgZmxhZ3MpOwotCQl1cCgmZ29maC0+bG9jayk7Ci0JCXJldHVybiAwOwotCX0KLQljYXNlIFZJRElPQ19EUUJVRjoKLQl7Ci0JCXN0cnVjdCB2NGwyX2J1ZmZlciAqYnVmID0gYXJnOwotCQlzdHJ1Y3QgZ283MDA3X2J1ZmZlciAqZ29idWY7Ci0JCXUzMiBmcmFtZV90eXBlX2ZsYWc7Ci0JCURFRklORV9XQUlUKHdhaXQpOworCXJlcS0+Y291bnQgPSBjb3VudDsKKwlyZXEtPnR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU7CisJcmVxLT5tZW1vcnkgPSBWNEwyX01FTU9SWV9NTUFQOwogCi0JCWlmIChidWYtPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWlmIChidWYtPm1lbW9yeSAhPSBWNEwyX01FTU9SWV9NTUFQKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWRvd24oJmdvZmgtPmxvY2spOwotCQlyZXR2YWwgPSAtRUlOVkFMOwotCQlpZiAobGlzdF9lbXB0eSgmZ28tPnN0cmVhbSkpCi0JCQlnb3RvIHVubG9ja19hbmRfcmV0dXJuOwotCQlnb2J1ZiA9IGxpc3RfZW50cnkoZ28tPnN0cmVhbS5uZXh0LAotCQkJCXN0cnVjdCBnbzcwMDdfYnVmZmVyLCBzdHJlYW0pOwotCQlyZXR2YWwgPSAtRUFHQUlOOwotCQlpZiAoZ29idWYtPnN0YXRlICE9IEJVRl9TVEFURV9ET05FICYmCi0JCQkJIShmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykpIHsKLQkJCWZvciAoOzspIHsKLQkJCQlwcmVwYXJlX3RvX3dhaXQoJmdvLT5mcmFtZV93YWl0cSwgJndhaXQsCi0JCQkJCQlUQVNLX0lOVEVSUlVQVElCTEUpOwotCQkJCWlmIChnb2J1Zi0+c3RhdGUgPT0gQlVGX1NUQVRFX0RPTkUpCi0JCQkJCWJyZWFrOwotCQkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgewotCQkJCQlyZXR2YWwgPSAtRVJFU1RBUlRTWVM7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlzY2hlZHVsZSgpOwotCQkJfQotCQkJZmluaXNoX3dhaXQoJmdvLT5mcmFtZV93YWl0cSwgJndhaXQpOwotCQl9Ci0JCWlmIChnb2J1Zi0+c3RhdGUgIT0gQlVGX1NUQVRFX0RPTkUpCi0JCQlnb3RvIHVubG9ja19hbmRfcmV0dXJuOwotCQlzcGluX2xvY2tfaXJxc2F2ZSgmZ28tPnNwaW5sb2NrLCBmbGFncyk7Ci0JCWRlYWN0aXZhdGVfYnVmZmVyKGdvYnVmKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ28tPnNwaW5sb2NrLCBmbGFncyk7Ci0JCWZyYW1lX3R5cGVfZmxhZyA9IGdldF9mcmFtZV90eXBlX2ZsYWcoZ29idWYsIGdvLT5mb3JtYXQpOwotCQlnb2J1Zi0+c3RhdGUgPSBCVUZfU1RBVEVfSURMRTsKLQkJbWVtc2V0KGJ1ZiwgMCwgc2l6ZW9mKCpidWYpKTsKLQkJYnVmLT5pbmRleCA9IGdvYnVmLT5pbmRleDsKLQkJYnVmLT50eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOwotCQlidWYtPmJ5dGVzdXNlZCA9IGdvYnVmLT5ieXRlc3VzZWQ7Ci0JCWJ1Zi0+ZmxhZ3MgPSBWNEwyX0JVRl9GTEFHX01BUFBFRCB8IGZyYW1lX3R5cGVfZmxhZzsKLQkJYnVmLT5maWVsZCA9IFY0TDJfRklFTERfTk9ORTsKLQkJYnVmLT50aW1lc3RhbXAgPSBnb2J1Zi0+dGltZXN0YW1wOwotCQlidWYtPnNlcXVlbmNlID0gZ29idWYtPnNlcTsKLQkJYnVmLT5tZW1vcnkgPSBWNEwyX01FTU9SWV9NTUFQOwotCQlidWYtPm0ub2Zmc2V0ID0gZ29idWYtPmluZGV4ICogR083MDA3X0JVRl9TSVpFOwotCQlidWYtPmxlbmd0aCA9IEdPNzAwN19CVUZfU0laRTsKLQkJYnVmLT5yZXNlcnZlZCA9IGdvYnVmLT5tb2RldF9hY3RpdmU7Ci0JCXVwKCZnb2ZoLT5sb2NrKTsKLQkJcmV0dXJuIDA7Ci0JfQotCWNhc2UgVklESU9DX1NUUkVBTU9OOgotCXsKLQkJdW5zaWduZWQgaW50ICp0eXBlID0gYXJnOworCXJldHVybiAwOwogCi0JCWlmICgqdHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJZG93bigmZ29maC0+bG9jayk7Ci0JCWRvd24oJmdvLT5od19sb2NrKTsKLQkJaWYgKCFnby0+c3RyZWFtaW5nKSB7Ci0JCQlnby0+c3RyZWFtaW5nID0gMTsKLQkJCWdvLT5uZXh0X3NlcSA9IDA7Ci0JCQlnby0+YWN0aXZlX2J1ZiA9IE5VTEw7Ci0JCQlpZiAoZ283MDA3X3N0YXJ0X2VuY29kZXIoZ28pIDwgMCkKLQkJCQlyZXR2YWwgPSAtRUlPOwotCQkJZWxzZQotCQkJCXJldHZhbCA9IDA7Ci0JCX0KLQkJdXAoJmdvLT5od19sb2NrKTsKLQkJdXAoJmdvZmgtPmxvY2spOwordW5sb2NrX2FuZF9yZXR1cm46CisJdXAoJmdvZmgtPmxvY2spOworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX3F1ZXJ5YnVmKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJICAgc3RydWN0IHY0bDJfYnVmZmVyICpidWYpCit7CisJc3RydWN0IGdvNzAwN19maWxlICpnb2ZoID0gcHJpdjsKKwlpbnQgcmV0dmFsID0gLUVJTlZBTDsKKwl1bnNpZ25lZCBpbnQgaW5kZXg7CisKKwlpZiAoYnVmLT50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkKIAkJcmV0dXJuIHJldHZhbDsKLQl9Ci0JY2FzZSBWSURJT0NfU1RSRUFNT0ZGOgotCXsKLQkJdW5zaWduZWQgaW50ICp0eXBlID0gYXJnOwogCi0JCWlmICgqdHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJZG93bigmZ29maC0+bG9jayk7Ci0JCWdvNzAwN19zdHJlYW1vZmYoZ28pOwotCQl1cCgmZ29maC0+bG9jayk7Ci0JCXJldHVybiAwOwotCX0KLQljYXNlIFZJRElPQ19RVUVSWUNUUkw6Ci0JewotCQlzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgKmN0cmwgPSBhcmc7Ci0JCXUzMiBpZDsKKwlpbmRleCA9IGJ1Zi0+aW5kZXg7CiAKLQkJaWYgKCFnby0+aTJjX2FkYXB0ZXJfb25saW5lKQotCQkJcmV0dXJuIC1FSU87Ci0JCWlkID0gY3RybC0+aWQ7Ci0JCW1lbXNldChjdHJsLCAwLCBzaXplb2YoKmN0cmwpKTsKLQkJY3RybC0+aWQgPSBpZDsKLQkJaTJjX2NsaWVudHNfY29tbWFuZCgmZ28tPmkyY19hZGFwdGVyLCBWSURJT0NfUVVFUllDVFJMLCBhcmcpOwotCQlyZXR1cm4gY3RybC0+bmFtZVswXSA9PSAwID8gLUVJTlZBTCA6IDA7Ci0JfQotCWNhc2UgVklESU9DX0dfQ1RSTDoKLQl7Ci0JCXN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmwgPSBhcmc7Ci0JCXN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCBxdWVyeTsKKwlkb3duKCZnb2ZoLT5sb2NrKTsKKwlpZiAoaW5kZXggPj0gZ29maC0+YnVmX2NvdW50KQorCQlnb3RvIHVubG9ja19hbmRfcmV0dXJuOwogCi0JCWlmICghZ28tPmkyY19hZGFwdGVyX29ubGluZSkKLQkJCXJldHVybiAtRUlPOwotCQltZW1zZXQoJnF1ZXJ5LCAwLCBzaXplb2YocXVlcnkpKTsKLQkJcXVlcnkuaWQgPSBjdHJsLT5pZDsKLQkJaTJjX2NsaWVudHNfY29tbWFuZCgmZ28tPmkyY19hZGFwdGVyLCBWSURJT0NfUVVFUllDVFJMLCAmcXVlcnkpOwotCQlpZiAocXVlcnkubmFtZVswXSA9PSAwKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWkyY19jbGllbnRzX2NvbW1hbmQoJmdvLT5pMmNfYWRhcHRlciwgVklESU9DX0dfQ1RSTCwgYXJnKTsKLQkJcmV0dXJuIDA7Ci0JfQotCWNhc2UgVklESU9DX1NfQ1RSTDoKLQl7Ci0JCXN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmwgPSBhcmc7Ci0JCXN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCBxdWVyeTsKKwltZW1zZXQoYnVmLCAwLCBzaXplb2YoKmJ1ZikpOworCWJ1Zi0+aW5kZXggPSBpbmRleDsKKwlidWYtPnR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU7CiAKLQkJaWYgKCFnby0+aTJjX2FkYXB0ZXJfb25saW5lKQotCQkJcmV0dXJuIC1FSU87Ci0JCW1lbXNldCgmcXVlcnksIDAsIHNpemVvZihxdWVyeSkpOwotCQlxdWVyeS5pZCA9IGN0cmwtPmlkOwotCQlpMmNfY2xpZW50c19jb21tYW5kKCZnby0+aTJjX2FkYXB0ZXIsIFZJRElPQ19RVUVSWUNUUkwsICZxdWVyeSk7Ci0JCWlmIChxdWVyeS5uYW1lWzBdID09IDApCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJaTJjX2NsaWVudHNfY29tbWFuZCgmZ28tPmkyY19hZGFwdGVyLCBWSURJT0NfU19DVFJMLCBhcmcpOwotCQlyZXR1cm4gMDsKKwlzd2l0Y2ggKGdvZmgtPmJ1ZnNbaW5kZXhdLnN0YXRlKSB7CisJY2FzZSBCVUZfU1RBVEVfUVVFVUVEOgorCQlidWYtPmZsYWdzID0gVjRMMl9CVUZfRkxBR19RVUVVRUQ7CisJCWJyZWFrOworCWNhc2UgQlVGX1NUQVRFX0RPTkU6CisJCWJ1Zi0+ZmxhZ3MgPSBWNEwyX0JVRl9GTEFHX0RPTkU7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJ1Zi0+ZmxhZ3MgPSAwOwogCX0KLQljYXNlIFZJRElPQ19HX1BBUk06Ci0JewotCQlzdHJ1Y3QgdjRsMl9zdHJlYW1wYXJtICpwYXJtID0gYXJnOwotCQlzdHJ1Y3QgdjRsMl9mcmFjdCB0aW1lcGVyZnJhbWUgPSB7Ci0JCQkubnVtZXJhdG9yID0gMTAwMSAqICBnby0+ZnBzX3NjYWxlLAotCQkJLmRlbm9taW5hdG9yID0gZ28tPnNlbnNvcl9mcmFtZXJhdGUsCi0JCX07CiAKLQkJaWYgKHBhcm0tPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCW1lbXNldChwYXJtLCAwLCBzaXplb2YoKnBhcm0pKTsKLQkJcGFybS0+dHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRTsKLQkJcGFybS0+cGFybS5jYXB0dXJlLmNhcGFiaWxpdHkgfD0gVjRMMl9DQVBfVElNRVBFUkZSQU1FOwotCQlwYXJtLT5wYXJtLmNhcHR1cmUudGltZXBlcmZyYW1lID0gdGltZXBlcmZyYW1lOwotCQlyZXR1cm4gMDsKKwlpZiAoZ29maC0+YnVmc1tpbmRleF0ubWFwcGVkKQorCQlidWYtPmZsYWdzIHw9IFY0TDJfQlVGX0ZMQUdfTUFQUEVEOworCWJ1Zi0+bWVtb3J5ID0gVjRMMl9NRU1PUllfTU1BUDsKKwlidWYtPm0ub2Zmc2V0ID0gaW5kZXggKiBHTzcwMDdfQlVGX1NJWkU7CisJYnVmLT5sZW5ndGggPSBHTzcwMDdfQlVGX1NJWkU7CisJdXAoJmdvZmgtPmxvY2spOworCisJcmV0dXJuIDA7CisKK3VubG9ja19hbmRfcmV0dXJuOgorCXVwKCZnb2ZoLT5sb2NrKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW50IHZpZGlvY19xYnVmKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LCBzdHJ1Y3QgdjRsMl9idWZmZXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgZ283MDA3X2ZpbGUgKmdvZmggPSBwcml2OworCXN0cnVjdCBnbzcwMDcgKmdvID0gZ29maC0+Z287CisJc3RydWN0IGdvNzAwN19idWZmZXIgKmdvYnVmOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldHZhbCA9IC1FSU5WQUw7CisJaW50IHJldDsKKworCWlmIChidWYtPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFIHx8CisJCQlidWYtPm1lbW9yeSAhPSBWNEwyX01FTU9SWV9NTUFQKQorCQlyZXR1cm4gcmV0dmFsOworCisJZG93bigmZ29maC0+bG9jayk7CisJaWYgKGJ1Zi0+aW5kZXggPCAwIHx8IGJ1Zi0+aW5kZXggPj0gZ29maC0+YnVmX2NvdW50KQorCQlnb3RvIHVubG9ja19hbmRfcmV0dXJuOworCisJZ29idWYgPSAmZ29maC0+YnVmc1tidWYtPmluZGV4XTsKKwlpZiAoIWdvYnVmLT5tYXBwZWQpCisJCWdvdG8gdW5sb2NrX2FuZF9yZXR1cm47CisKKwlyZXR2YWwgPSAtRUJVU1k7CisJaWYgKGdvYnVmLT5zdGF0ZSAhPSBCVUZfU1RBVEVfSURMRSkKKwkJZ290byB1bmxvY2tfYW5kX3JldHVybjsKKworCS8qIG9mZnNldCB3aWxsIGJlIDAgdW50aWwgd2UgcmVhbGx5IHN1cHBvcnQgVVNFUlBUUiBzdHJlYW1pbmcgKi8KKwlnb2J1Zi0+b2Zmc2V0ID0gZ29idWYtPnVzZXJfYWRkciAmIH5QQUdFX01BU0s7CisJZ29idWYtPmJ5dGVzdXNlZCA9IDA7CisJZ29idWYtPmZyYW1lX29mZnNldCA9IDA7CisJZ29idWYtPm1vZGV0X2FjdGl2ZSA9IDA7CisJaWYgKGdvYnVmLT5vZmZzZXQgPiAwKQorCQlnb2J1Zi0+cGFnZV9jb3VudCA9IEdPNzAwN19CVUZfUEFHRVMgKyAxOworCWVsc2UKKwkJZ29idWYtPnBhZ2VfY291bnQgPSBHTzcwMDdfQlVGX1BBR0VTOworCisJcmV0dmFsID0gLUVOT01FTTsKKwlkb3duX3JlYWQoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7CisJcmV0ID0gZ2V0X3VzZXJfcGFnZXMoY3VycmVudCwgY3VycmVudC0+bW0sCisJCQlnb2J1Zi0+dXNlcl9hZGRyICYgUEFHRV9NQVNLLCBnb2J1Zi0+cGFnZV9jb3VudCwKKwkJCTEsIDEsIGdvYnVmLT5wYWdlcywgTlVMTCk7CisJdXBfcmVhZCgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKKworCWlmIChyZXQgIT0gZ29idWYtPnBhZ2VfY291bnQpIHsKKwkJaW50IGk7CisJCWZvciAoaSA9IDA7IGkgPCByZXQ7ICsraSkKKwkJCXBhZ2VfY2FjaGVfcmVsZWFzZShnb2J1Zi0+cGFnZXNbaV0pOworCQlnb2J1Zi0+cGFnZV9jb3VudCA9IDA7CisJCWdvdG8gdW5sb2NrX2FuZF9yZXR1cm47CiAJfQotCWNhc2UgVklESU9DX1NfUEFSTToKLQl7Ci0JCXN0cnVjdCB2NGwyX3N0cmVhbXBhcm0gKnBhcm0gPSBhcmc7Ci0JCXVuc2lnbmVkIGludCBuLCBkOwogCi0JCWlmIChwYXJtLT50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkKLQkJCXJldHVybiAtRUlOVkFMOwotCQlpZiAocGFybS0+cGFybS5jYXB0dXJlLmNhcHR1cmVtb2RlICE9IDApCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJbiA9IGdvLT5zZW5zb3JfZnJhbWVyYXRlICoKLQkJCXBhcm0tPnBhcm0uY2FwdHVyZS50aW1lcGVyZnJhbWUubnVtZXJhdG9yOwotCQlkID0gMTAwMSAqIHBhcm0tPnBhcm0uY2FwdHVyZS50aW1lcGVyZnJhbWUuZGVub21pbmF0b3I7Ci0JCWlmIChuICE9IDAgJiYgZCAhPSAwICYmIG4gPiBkKQotCQkJZ28tPmZwc19zY2FsZSA9IChuICsgZC8yKSAvIGQ7Ci0JCWVsc2UKLQkJCWdvLT5mcHNfc2NhbGUgPSAxOwotCQlyZXR1cm4gMDsKLQl9Ci0JY2FzZSBWSURJT0NfRU5VTVNURDoKLQl7Ci0JCXN0cnVjdCB2NGwyX3N0YW5kYXJkICpzdGQgPSBhcmc7CisJZ29idWYtPnN0YXRlID0gQlVGX1NUQVRFX1FVRVVFRDsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZ28tPnNwaW5sb2NrLCBmbGFncyk7CisJbGlzdF9hZGRfdGFpbCgmZ29idWYtPnN0cmVhbSwgJmdvLT5zdHJlYW0pOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdvLT5zcGlubG9jaywgZmxhZ3MpOworCXVwKCZnb2ZoLT5sb2NrKTsKIAotCQlpZiAoKGdvLT5ib2FyZF9pbmZvLT5mbGFncyAmIEdPNzAwN19CT0FSRF9IQVNfVFVORVIpICYmCi0JCQkJZ28tPmlucHV0ID09IGdvLT5ib2FyZF9pbmZvLT5udW1faW5wdXRzIC0gMSkgewotCQkJaWYgKCFnby0+aTJjX2FkYXB0ZXJfb25saW5lKQotCQkJCXJldHVybiAtRUlPOwotCQkJaTJjX2NsaWVudHNfY29tbWFuZCgmZ28tPmkyY19hZGFwdGVyLAotCQkJCQkJVklESU9DX0VOVU1TVEQsIGFyZyk7Ci0JCQlpZiAoIXN0ZC0+aWQpIC8qIGhhY2sgdG8gaW5kaWNhdGUgRUlOVkFMIGZyb20gdHVuZXIgKi8KLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJfSBlbHNlIGlmIChnby0+Ym9hcmRfaW5mby0+c2Vuc29yX2ZsYWdzICYgR083MDA3X1NFTlNPUl9UVikgewotCQkJc3dpdGNoIChzdGQtPmluZGV4KSB7Ci0JCQljYXNlIDA6Ci0JCQkJdjRsMl92aWRlb19zdGRfY29uc3RydWN0KHN0ZCwKLQkJCQkJCVY0TDJfU1REX05UU0MsICJOVFNDIik7CisJcmV0dXJuIDA7CisKK3VubG9ja19hbmRfcmV0dXJuOgorCXVwKCZnb2ZoLT5sb2NrKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCisKK3N0YXRpYyBpbnQgdmlkaW9jX2RxYnVmKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LCBzdHJ1Y3QgdjRsMl9idWZmZXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgZ283MDA3X2ZpbGUgKmdvZmggPSBwcml2OworCXN0cnVjdCBnbzcwMDcgKmdvID0gZ29maC0+Z287CisJc3RydWN0IGdvNzAwN19idWZmZXIgKmdvYnVmOworCWludCByZXR2YWwgPSAtRUlOVkFMOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTMyIGZyYW1lX3R5cGVfZmxhZzsKKwlERUZJTkVfV0FJVCh3YWl0KTsKKworCWlmIChidWYtPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKQorCQlyZXR1cm4gcmV0dmFsOworCWlmIChidWYtPm1lbW9yeSAhPSBWNEwyX01FTU9SWV9NTUFQKQorCQlyZXR1cm4gcmV0dmFsOworCisJZG93bigmZ29maC0+bG9jayk7CisJaWYgKGxpc3RfZW1wdHkoJmdvLT5zdHJlYW0pKQorCQlnb3RvIHVubG9ja19hbmRfcmV0dXJuOworCWdvYnVmID0gbGlzdF9lbnRyeShnby0+c3RyZWFtLm5leHQsCisJCQlzdHJ1Y3QgZ283MDA3X2J1ZmZlciwgc3RyZWFtKTsKKworCXJldHZhbCA9IC1FQUdBSU47CisJaWYgKGdvYnVmLT5zdGF0ZSAhPSBCVUZfU1RBVEVfRE9ORSAmJgorCQkJIShmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykpIHsKKwkJZm9yICg7OykgeworCQkJcHJlcGFyZV90b193YWl0KCZnby0+ZnJhbWVfd2FpdHEsICZ3YWl0LAorCQkJCQlUQVNLX0lOVEVSUlVQVElCTEUpOworCQkJaWYgKGdvYnVmLT5zdGF0ZSA9PSBCVUZfU1RBVEVfRE9ORSkKIAkJCQlicmVhazsKLQkJCWNhc2UgMToKLQkJCQl2NGwyX3ZpZGVvX3N0ZF9jb25zdHJ1Y3Qoc3RkLAotCQkJCQkJVjRMMl9TVERfUEFMIHwgVjRMMl9TVERfU0VDQU0sCi0JCQkJCQkiUEFML1NFQ0FNIik7CisJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCQlyZXR2YWwgPSAtRVJFU1RBUlRTWVM7CiAJCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCXJldHVybiAtRUlOVkFMOwogCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKHN0ZC0+aW5kZXggIT0gMCkKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCW1lbXNldChzdGQsIDAsIHNpemVvZigqc3RkKSk7Ci0JCQlzbnByaW50ZihzdGQtPm5hbWUsIHNpemVvZihzdGQtPm5hbWUpLCAiJWR4JWQsICVkZnBzIiwKLQkJCQlnby0+Ym9hcmRfaW5mby0+c2Vuc29yX3dpZHRoLAotCQkJCWdvLT5ib2FyZF9pbmZvLT5zZW5zb3JfaGVpZ2h0LAotCQkJCWdvLT5ib2FyZF9pbmZvLT5zZW5zb3JfZnJhbWVyYXRlIC8gMTAwMCk7Ci0JCQlzdGQtPmZyYW1lcGVyaW9kLm51bWVyYXRvciA9IDEwMDE7Ci0JCQlzdGQtPmZyYW1lcGVyaW9kLmRlbm9taW5hdG9yID0KLQkJCQkJZ28tPmJvYXJkX2luZm8tPnNlbnNvcl9mcmFtZXJhdGU7CisJCQlzY2hlZHVsZSgpOwogCQl9Ci0JCXJldHVybiAwOworCQlmaW5pc2hfd2FpdCgmZ28tPmZyYW1lX3dhaXRxLCAmd2FpdCk7CiAJfQotCWNhc2UgVklESU9DX0dfU1REOgotCXsKLQkJdjRsMl9zdGRfaWQgKnN0ZCA9IGFyZzsKKwlpZiAoZ29idWYtPnN0YXRlICE9IEJVRl9TVEFURV9ET05FKQorCQlnb3RvIHVubG9ja19hbmRfcmV0dXJuOwogCi0JCWlmICgoZ28tPmJvYXJkX2luZm8tPmZsYWdzICYgR083MDA3X0JPQVJEX0hBU19UVU5FUikgJiYKLQkJCQlnby0+aW5wdXQgPT0gZ28tPmJvYXJkX2luZm8tPm51bV9pbnB1dHMgLSAxKSB7Ci0JCQlpZiAoIWdvLT5pMmNfYWRhcHRlcl9vbmxpbmUpCi0JCQkJcmV0dXJuIC1FSU87Ci0JCQlpMmNfY2xpZW50c19jb21tYW5kKCZnby0+aTJjX2FkYXB0ZXIsCi0JCQkJCQlWSURJT0NfR19TVEQsIGFyZyk7Ci0JCX0gZWxzZSBpZiAoZ28tPmJvYXJkX2luZm8tPnNlbnNvcl9mbGFncyAmIEdPNzAwN19TRU5TT1JfVFYpIHsKLQkJCWlmIChnby0+c3RhbmRhcmQgPT0gR083MDA3X1NURF9OVFNDKQotCQkJCSpzdGQgPSBWNEwyX1NURF9OVFNDOwotCQkJZWxzZQotCQkJCSpzdGQgPSBWNEwyX1NURF9QQUwgfCBWNEwyX1NURF9TRUNBTTsKLQkJfSBlbHNlCi0JCQkqc3RkID0gMDsKLQkJcmV0dXJuIDA7Ci0JfQotCWNhc2UgVklESU9DX1NfU1REOgotCXsKLQkJdjRsMl9zdGRfaWQgKnN0ZCA9IGFyZzsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZ28tPnNwaW5sb2NrLCBmbGFncyk7CisJZGVhY3RpdmF0ZV9idWZmZXIoZ29idWYpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdvLT5zcGlubG9jaywgZmxhZ3MpOworCWZyYW1lX3R5cGVfZmxhZyA9IGdldF9mcmFtZV90eXBlX2ZsYWcoZ29idWYsIGdvLT5mb3JtYXQpOworCWdvYnVmLT5zdGF0ZSA9IEJVRl9TVEFURV9JRExFOwogCi0JCWlmIChnby0+c3RyZWFtaW5nKQotCQkJcmV0dXJuIC1FQlVTWTsKLQkJaWYgKCEoZ28tPmJvYXJkX2luZm8tPnNlbnNvcl9mbGFncyAmIEdPNzAwN19TRU5TT1JfVFYpICYmCi0JCQkJKnN0ZCAhPSAwKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWlmICgqc3RkID09IDApCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJaWYgKChnby0+Ym9hcmRfaW5mby0+ZmxhZ3MgJiBHTzcwMDdfQk9BUkRfSEFTX1RVTkVSKSAmJgotCQkJCWdvLT5pbnB1dCA9PSBnby0+Ym9hcmRfaW5mby0+bnVtX2lucHV0cyAtIDEpIHsKLQkJCWlmICghZ28tPmkyY19hZGFwdGVyX29ubGluZSkKLQkJCQlyZXR1cm4gLUVJTzsKLQkJCWkyY19jbGllbnRzX2NvbW1hbmQoJmdvLT5pMmNfYWRhcHRlciwKLQkJCQkJCVZJRElPQ19TX1NURCwgYXJnKTsKLQkJCWlmICghKnN0ZCkgLyogaGFjayB0byBpbmRpY2F0ZSBFSU5WQUwgZnJvbSB0dW5lciAqLwotCQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JCWlmICgqc3RkICYgVjRMMl9TVERfTlRTQykgewotCQkJZ28tPnN0YW5kYXJkID0gR083MDA3X1NURF9OVFNDOwotCQkJZ28tPnNlbnNvcl9mcmFtZXJhdGUgPSAzMDAwMDsKLQkJfSBlbHNlIGlmICgqc3RkICYgVjRMMl9TVERfUEFMKSB7Ci0JCQlnby0+c3RhbmRhcmQgPSBHTzcwMDdfU1REX1BBTDsKLQkJCWdvLT5zZW5zb3JfZnJhbWVyYXRlID0gMjUwMjU7Ci0JCX0gZWxzZSBpZiAoKnN0ZCAmIFY0TDJfU1REX1NFQ0FNKSB7Ci0JCQlnby0+c3RhbmRhcmQgPSBHTzcwMDdfU1REX1BBTDsKLQkJCWdvLT5zZW5zb3JfZnJhbWVyYXRlID0gMjUwMjU7Ci0JCX0gZWxzZQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWlmIChnby0+aTJjX2FkYXB0ZXJfb25saW5lKQotCQkJaTJjX2NsaWVudHNfY29tbWFuZCgmZ28tPmkyY19hZGFwdGVyLAotCQkJCQkgICAgVklESU9DX1NfU1RELCBzdGQpOwotCQlzZXRfY2FwdHVyZV9zaXplKGdvLCBOVUxMLCAwKTsKLQkJcmV0dXJuIDA7CisJbWVtc2V0KGJ1ZiwgMCwgc2l6ZW9mKCpidWYpKTsKKwlidWYtPmluZGV4ID0gZ29idWYtPmluZGV4OworCWJ1Zi0+dHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRTsKKwlidWYtPmJ5dGVzdXNlZCA9IGdvYnVmLT5ieXRlc3VzZWQ7CisJYnVmLT5mbGFncyA9IFY0TDJfQlVGX0ZMQUdfTUFQUEVEIHwgZnJhbWVfdHlwZV9mbGFnOworCWJ1Zi0+ZmllbGQgPSBWNEwyX0ZJRUxEX05PTkU7CisJYnVmLT50aW1lc3RhbXAgPSBnb2J1Zi0+dGltZXN0YW1wOworCWJ1Zi0+c2VxdWVuY2UgPSBnb2J1Zi0+c2VxOworCWJ1Zi0+bWVtb3J5ID0gVjRMMl9NRU1PUllfTU1BUDsKKwlidWYtPm0ub2Zmc2V0ID0gZ29idWYtPmluZGV4ICogR083MDA3X0JVRl9TSVpFOworCWJ1Zi0+bGVuZ3RoID0gR083MDA3X0JVRl9TSVpFOworCWJ1Zi0+cmVzZXJ2ZWQgPSBnb2J1Zi0+bW9kZXRfYWN0aXZlOworCisJdXAoJmdvZmgtPmxvY2spOworCXJldHVybiAwOworCit1bmxvY2tfYW5kX3JldHVybjoKKwl1cCgmZ29maC0+bG9jayk7CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGludCB2aWRpb2Nfc3RyZWFtb24oc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkJCWVudW0gdjRsMl9idWZfdHlwZSB0eXBlKQoreworCXN0cnVjdCBnbzcwMDdfZmlsZSAqZ29maCA9IHByaXY7CisJc3RydWN0IGdvNzAwNyAqZ28gPSBnb2ZoLT5nbzsKKwlpbnQgcmV0dmFsID0gMDsKKworCWlmICh0eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkb3duKCZnb2ZoLT5sb2NrKTsKKwlkb3duKCZnby0+aHdfbG9jayk7CisKKwlpZiAoIWdvLT5zdHJlYW1pbmcpIHsKKwkJZ28tPnN0cmVhbWluZyA9IDE7CisJCWdvLT5uZXh0X3NlcSA9IDA7CisJCWdvLT5hY3RpdmVfYnVmID0gTlVMTDsKKwkJaWYgKGdvNzAwN19zdGFydF9lbmNvZGVyKGdvKSA8IDApCisJCQlyZXR2YWwgPSAtRUlPOworCQllbHNlCisJCQlyZXR2YWwgPSAwOwogCX0KKwl1cCgmZ28tPmh3X2xvY2spOworCXVwKCZnb2ZoLT5sb2NrKTsKKworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX3N0cmVhbW9mZihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCQkJZW51bSB2NGwyX2J1Zl90eXBlIHR5cGUpCit7CisJc3RydWN0IGdvNzAwN19maWxlICpnb2ZoID0gcHJpdjsKKwlzdHJ1Y3QgZ283MDA3ICpnbyA9IGdvZmgtPmdvOworCisJaWYgKHR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlkb3duKCZnb2ZoLT5sb2NrKTsKKwlnbzcwMDdfc3RyZWFtb2ZmKGdvKTsKKwl1cCgmZ29maC0+bG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2aWRpb2NfcXVlcnljdHJsKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJICAgc3RydWN0IHY0bDJfcXVlcnljdHJsICpxdWVyeSkKK3sKKwlzdHJ1Y3QgZ283MDA3X2ZpbGUgKmdvZmggPSBwcml2OworCXN0cnVjdCBnbzcwMDcgKmdvID0gZ29maC0+Z287CisKKwlpZiAoIWdvLT5pMmNfYWRhcHRlcl9vbmxpbmUpCisJCXJldHVybiAtRUlPOworCisJaTJjX2NsaWVudHNfY29tbWFuZCgmZ28tPmkyY19hZGFwdGVyLCBWSURJT0NfUVVFUllDVFJMLCBxdWVyeSk7CisKKwlyZXR1cm4gKCFxdWVyeS0+bmFtZVswXSkgPyAtRUlOVkFMIDogMDsKK30KKworc3RhdGljIGludCB2aWRpb2NfZ19jdHJsKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJCXN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmwpCit7CisJc3RydWN0IGdvNzAwN19maWxlICpnb2ZoID0gcHJpdjsKKwlzdHJ1Y3QgZ283MDA3ICpnbyA9IGdvZmgtPmdvOworCXN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCBxdWVyeTsKKworCWlmICghZ28tPmkyY19hZGFwdGVyX29ubGluZSkKKwkJcmV0dXJuIC1FSU87CisKKwltZW1zZXQoJnF1ZXJ5LCAwLCBzaXplb2YocXVlcnkpKTsKKwlxdWVyeS5pZCA9IGN0cmwtPmlkOworCWkyY19jbGllbnRzX2NvbW1hbmQoJmdvLT5pMmNfYWRhcHRlciwgVklESU9DX1FVRVJZQ1RSTCwgJnF1ZXJ5KTsKKwlpZiAocXVlcnkubmFtZVswXSA9PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpMmNfY2xpZW50c19jb21tYW5kKCZnby0+aTJjX2FkYXB0ZXIsIFZJRElPQ19HX0NUUkwsIGN0cmwpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX3NfY3RybChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCQlzdHJ1Y3QgdjRsMl9jb250cm9sICpjdHJsKQoreworCXN0cnVjdCBnbzcwMDdfZmlsZSAqZ29maCA9IHByaXY7CisJc3RydWN0IGdvNzAwNyAqZ28gPSBnb2ZoLT5nbzsKKwlzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgcXVlcnk7CisKKwlpZiAoIWdvLT5pMmNfYWRhcHRlcl9vbmxpbmUpCisJCXJldHVybiAtRUlPOworCisJbWVtc2V0KCZxdWVyeSwgMCwgc2l6ZW9mKHF1ZXJ5KSk7CisJcXVlcnkuaWQgPSBjdHJsLT5pZDsKKwlpMmNfY2xpZW50c19jb21tYW5kKCZnby0+aTJjX2FkYXB0ZXIsIFZJRElPQ19RVUVSWUNUUkwsICZxdWVyeSk7CisJaWYgKHF1ZXJ5Lm5hbWVbMF0gPT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaTJjX2NsaWVudHNfY29tbWFuZCgmZ28tPmkyY19hZGFwdGVyLCBWSURJT0NfU19DVFJMLCBjdHJsKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZpZGlvY19nX3Bhcm0oc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKnByaXYsCisJCXN0cnVjdCB2NGwyX3N0cmVhbXBhcm0gKnBhcm0pCit7CisJc3RydWN0IGdvNzAwN19maWxlICpnb2ZoID0gcHJpdjsKKwlzdHJ1Y3QgZ283MDA3ICpnbyA9IGdvZmgtPmdvOworCXN0cnVjdCB2NGwyX2ZyYWN0IHRpbWVwZXJmcmFtZSA9IHsKKwkJLm51bWVyYXRvciA9IDEwMDEgKiAgZ28tPmZwc19zY2FsZSwKKwkJLmRlbm9taW5hdG9yID0gZ28tPnNlbnNvcl9mcmFtZXJhdGUsCisJfTsKKworCWlmIChwYXJtLT50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlwYXJtLT5wYXJtLmNhcHR1cmUuY2FwYWJpbGl0eSB8PSBWNEwyX0NBUF9USU1FUEVSRlJBTUU7CisJcGFybS0+cGFybS5jYXB0dXJlLnRpbWVwZXJmcmFtZSA9IHRpbWVwZXJmcmFtZTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZpZGlvY19zX3Bhcm0oc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKnByaXYsCisJCXN0cnVjdCB2NGwyX3N0cmVhbXBhcm0gKnBhcm0pCit7CisJc3RydWN0IGdvNzAwN19maWxlICpnb2ZoID0gcHJpdjsKKwlzdHJ1Y3QgZ283MDA3ICpnbyA9IGdvZmgtPmdvOworCXVuc2lnbmVkIGludCBuLCBkOworCisJaWYgKHBhcm0tPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAocGFybS0+cGFybS5jYXB0dXJlLmNhcHR1cmVtb2RlICE9IDApCisJCXJldHVybiAtRUlOVkFMOworCisJbiA9IGdvLT5zZW5zb3JfZnJhbWVyYXRlICoKKwkJcGFybS0+cGFybS5jYXB0dXJlLnRpbWVwZXJmcmFtZS5udW1lcmF0b3I7CisJZCA9IDEwMDEgKiBwYXJtLT5wYXJtLmNhcHR1cmUudGltZXBlcmZyYW1lLmRlbm9taW5hdG9yOworCWlmIChuICE9IDAgJiYgZCAhPSAwICYmIG4gPiBkKQorCQlnby0+ZnBzX3NjYWxlID0gKG4gKyBkLzIpIC8gZDsKKwllbHNlCisJCWdvLT5mcHNfc2NhbGUgPSAxOworCisJcmV0dXJuIDA7Cit9CisKKy8qIFZJRElPQ19FTlVNU1REIG9uIGdvNzAwNyB3ZXJlIHVzZWQgZm9yIGVudW1iZXJhdGluZyB0aGUgc3VwcG9ydGVkIGZwcyBhbmQKKyAgIGl0cyByZXNvbHV0aW9uLCB3aGVuIHRoZSBkZXZpY2UgaXMgbm90IGNvbm5lY3RlZCB0byBUVi4KKyAgIFRoaXMgd2VyZSBhbiBBUEkgYWJ1c2UsIHByb2JhYmx5IHVzZWQgYnkgdGhlIGxhY2sgb2Ygc3BlY2lmaWMgSU9DVEwncyB0bworICAgZW51bWJlcmF0ZSBpdCwgYnkgdGhlIHRpbWUgdGhlIGRyaXZlciB3ZXJlIHdyaXR0ZW4uCisKKyAgIEhvd2V2ZXIsIHNpbmNlIGtlcm5lbCAyLjYuMTksIHR3byBuZXcgaW9jdGxzIChWSURJT0NfRU5VTV9GUkFNRUlOVEVSVkFMUworICAgYW5kIFZJRElPQ19FTlVNX0ZSQU1FU0laRVMpIHdlcmUgYWRkZWQgZm9yIHRoaXMgcHVycG9zZS4KKworICAgVGhlIHR3byBmdW5jdGlvbnMgYmVsbG93IGltcGxlbWVudHMgdGhlIG5ld2VyIGlvY3RscworKi8KK3N0YXRpYyBpbnQgdmlkaW9jX2VudW1fZnJhbWVzaXplcyhzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqcHJpdiwKKwkJCQkgIHN0cnVjdCB2NGwyX2ZybXNpemVlbnVtICpmc2l6ZSkKK3sKKwlzdHJ1Y3QgZ283MDA3X2ZpbGUgKmdvZmggPSBwcml2OworCXN0cnVjdCBnbzcwMDcgKmdvID0gZ29maC0+Z287CisKKwkvKiBSZXR1cm4gLUVJTlZBTCwgaWYgaXQgaXMgYSBUViBib2FyZCAqLworCWlmICgoZ28tPmJvYXJkX2luZm8tPmZsYWdzICYgR083MDA3X0JPQVJEX0hBU19UVU5FUikgfHwKKwkgICAgKGdvLT5ib2FyZF9pbmZvLT5zZW5zb3JfZmxhZ3MgJiBHTzcwMDdfU0VOU09SX1RWKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoZnNpemUtPmluZGV4ID4gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlmc2l6ZS0+dHlwZSA9IFY0TDJfRlJNU0laRV9UWVBFX0RJU0NSRVRFOworCWZzaXplLT5kaXNjcmV0ZS53aWR0aCA9IGdvLT5ib2FyZF9pbmZvLT5zZW5zb3Jfd2lkdGg7CisJZnNpemUtPmRpc2NyZXRlLmhlaWdodCA9IGdvLT5ib2FyZF9pbmZvLT5zZW5zb3JfaGVpZ2h0OworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX2VudW1fZnJhbWVpbnRlcnZhbHMoc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKnByaXYsCisJCQkJICAgICAgc3RydWN0IHY0bDJfZnJtaXZhbGVudW0gKmZpdmFsKQoreworCXN0cnVjdCBnbzcwMDdfZmlsZSAqZ29maCA9IHByaXY7CisJc3RydWN0IGdvNzAwNyAqZ28gPSBnb2ZoLT5nbzsKKworCS8qIFJldHVybiAtRUlOVkFMLCBpZiBpdCBpcyBhIFRWIGJvYXJkICovCisJaWYgKChnby0+Ym9hcmRfaW5mby0+ZmxhZ3MgJiBHTzcwMDdfQk9BUkRfSEFTX1RVTkVSKSB8fAorCSAgICAoZ28tPmJvYXJkX2luZm8tPnNlbnNvcl9mbGFncyAmIEdPNzAwN19TRU5TT1JfVFYpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChmaXZhbC0+aW5kZXggPiAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWZpdmFsLT50eXBlID0gVjRMMl9GUk1JVkFMX1RZUEVfRElTQ1JFVEU7CisJZml2YWwtPmRpc2NyZXRlLm51bWVyYXRvciA9IDEwMDE7CisJZml2YWwtPmRpc2NyZXRlLmRlbm9taW5hdG9yID0gZ28tPmJvYXJkX2luZm8tPnNlbnNvcl9mcmFtZXJhdGU7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2aWRpb2Nfc19zdGQoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsIHY0bDJfc3RkX2lkICpzdGQpCit7CisJc3RydWN0IGdvNzAwN19maWxlICpnb2ZoID0gcHJpdjsKKwlzdHJ1Y3QgZ283MDA3ICpnbyA9IGdvZmgtPmdvOworCisJaWYgKGdvLT5zdHJlYW1pbmcpCisJCXJldHVybiAtRUJVU1k7CisKKwlpZiAoIShnby0+Ym9hcmRfaW5mby0+c2Vuc29yX2ZsYWdzICYgR083MDA3X1NFTlNPUl9UVikgJiYKKwkJCSpzdGQgIT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoKnN0ZCA9PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICgoZ28tPmJvYXJkX2luZm8tPmZsYWdzICYgR083MDA3X0JPQVJEX0hBU19UVU5FUikgJiYKKwkJCWdvLT5pbnB1dCA9PSBnby0+Ym9hcmRfaW5mby0+bnVtX2lucHV0cyAtIDEpIHsKKwkJaWYgKCFnby0+aTJjX2FkYXB0ZXJfb25saW5lKQorCQkJcmV0dXJuIC1FSU87CisJCWkyY19jbGllbnRzX2NvbW1hbmQoJmdvLT5pMmNfYWRhcHRlciwKKwkJCQkJVklESU9DX1NfU1RELCBzdGQpOworCQlpZiAoISpzdGQpIC8qIGhhY2sgdG8gaW5kaWNhdGUgRUlOVkFMIGZyb20gdHVuZXIgKi8KKwkJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICgqc3RkICYgVjRMMl9TVERfTlRTQykgeworCQlnby0+c3RhbmRhcmQgPSBHTzcwMDdfU1REX05UU0M7CisJCWdvLT5zZW5zb3JfZnJhbWVyYXRlID0gMzAwMDA7CisJfSBlbHNlIGlmICgqc3RkICYgVjRMMl9TVERfUEFMKSB7CisJCWdvLT5zdGFuZGFyZCA9IEdPNzAwN19TVERfUEFMOworCQlnby0+c2Vuc29yX2ZyYW1lcmF0ZSA9IDI1MDI1OworCX0gZWxzZSBpZiAoKnN0ZCAmIFY0TDJfU1REX1NFQ0FNKSB7CisJCWdvLT5zdGFuZGFyZCA9IEdPNzAwN19TVERfUEFMOworCQlnby0+c2Vuc29yX2ZyYW1lcmF0ZSA9IDI1MDI1OworCX0gZWxzZQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChnby0+aTJjX2FkYXB0ZXJfb25saW5lKQorCQlpMmNfY2xpZW50c19jb21tYW5kKCZnby0+aTJjX2FkYXB0ZXIsCisJCQkJCVZJRElPQ19TX1NURCwgc3RkKTsKKwlzZXRfY2FwdHVyZV9zaXplKGdvLCBOVUxMLCAwKTsKKworCXJldHVybiAwOworfQorCisjaWYgMAogCWNhc2UgVklESU9DX1FVRVJZU1REOgogCXsKIAkJdjRsMl9zdGRfaWQgKnN0ZCA9IGFyZzsKQEAgLTg4NCwyMTkgKzExOTUsMjY5IEBACiAJCQkqc3RkID0gMDsKIAkJcmV0dXJuIDA7CiAJfQotCWNhc2UgVklESU9DX0VOVU1JTlBVVDoKLQl7Ci0JCXN0cnVjdCB2NGwyX2lucHV0ICppbnAgPSBhcmc7Ci0JCWludCBpbmRleDsKKyNlbmRpZgogCi0JCWlmIChpbnAtPmluZGV4ID49IGdvLT5ib2FyZF9pbmZvLT5udW1faW5wdXRzKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWluZGV4ID0gaW5wLT5pbmRleDsKLQkJbWVtc2V0KGlucCwgMCwgc2l6ZW9mKCppbnApKTsKLQkJaW5wLT5pbmRleCA9IGluZGV4OwotCQlzdHJuY3B5KGlucC0+bmFtZSwgZ28tPmJvYXJkX2luZm8tPmlucHV0c1tpbmRleF0ubmFtZSwKLQkJCQlzaXplb2YoaW5wLT5uYW1lKSk7Ci0JCS8qIElmIHRoaXMgYm9hcmQgaGFzIGEgdHVuZXIsIGl0IHdpbGwgYmUgdGhlIGxhc3QgaW5wdXQgKi8KLQkJaWYgKChnby0+Ym9hcmRfaW5mby0+ZmxhZ3MgJiBHTzcwMDdfQk9BUkRfSEFTX1RVTkVSKSAmJgotCQkJCWluZGV4ID09IGdvLT5ib2FyZF9pbmZvLT5udW1faW5wdXRzIC0gMSkKLQkJCWlucC0+dHlwZSA9IFY0TDJfSU5QVVRfVFlQRV9UVU5FUjsKLQkJZWxzZQotCQkJaW5wLT50eXBlID0gVjRMMl9JTlBVVF9UWVBFX0NBTUVSQTsKLQkJaW5wLT5hdWRpb3NldCA9IDA7Ci0JCWlucC0+dHVuZXIgPSAwOwotCQlpZiAoZ28tPmJvYXJkX2luZm8tPnNlbnNvcl9mbGFncyAmIEdPNzAwN19TRU5TT1JfVFYpCi0JCQlpbnAtPnN0ZCA9IFY0TDJfU1REX05UU0MgfCBWNEwyX1NURF9QQUwgfAotCQkJCQkJCVY0TDJfU1REX1NFQ0FNOwotCQllbHNlCi0JCQlpbnAtPnN0ZCA9IDA7Ci0JCXJldHVybiAwOworc3RhdGljIGludCB2aWRpb2NfZW51bV9pbnB1dChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCQlzdHJ1Y3QgdjRsMl9pbnB1dCAqaW5wKQoreworCXN0cnVjdCBnbzcwMDdfZmlsZSAqZ29maCA9IHByaXY7CisJc3RydWN0IGdvNzAwNyAqZ28gPSBnb2ZoLT5nbzsKKworCWlmIChpbnAtPmluZGV4ID49IGdvLT5ib2FyZF9pbmZvLT5udW1faW5wdXRzKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXN0cm5jcHkoaW5wLT5uYW1lLCBnby0+Ym9hcmRfaW5mby0+aW5wdXRzW2lucC0+aW5kZXhdLm5hbWUsCisJCQlzaXplb2YoaW5wLT5uYW1lKSk7CisKKwkvKiBJZiB0aGlzIGJvYXJkIGhhcyBhIHR1bmVyLCBpdCB3aWxsIGJlIHRoZSBsYXN0IGlucHV0ICovCisJaWYgKChnby0+Ym9hcmRfaW5mby0+ZmxhZ3MgJiBHTzcwMDdfQk9BUkRfSEFTX1RVTkVSKSAmJgorCQkJaW5wLT5pbmRleCA9PSBnby0+Ym9hcmRfaW5mby0+bnVtX2lucHV0cyAtIDEpCisJCWlucC0+dHlwZSA9IFY0TDJfSU5QVVRfVFlQRV9UVU5FUjsKKwllbHNlCisJCWlucC0+dHlwZSA9IFY0TDJfSU5QVVRfVFlQRV9DQU1FUkE7CisKKwlpbnAtPmF1ZGlvc2V0ID0gMDsKKwlpbnAtPnR1bmVyID0gMDsKKwlpZiAoZ28tPmJvYXJkX2luZm8tPnNlbnNvcl9mbGFncyAmIEdPNzAwN19TRU5TT1JfVFYpCisJCWlucC0+c3RkID0gVjRMMl9TVERfTlRTQyB8IFY0TDJfU1REX1BBTCB8CisJCQkJCQlWNEwyX1NURF9TRUNBTTsKKwllbHNlCisJCWlucC0+c3RkID0gMDsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgdmlkaW9jX2dfaW5wdXQoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsIHVuc2lnbmVkIGludCAqaW5wdXQpCit7CisJc3RydWN0IGdvNzAwN19maWxlICpnb2ZoID0gcHJpdjsKKwlzdHJ1Y3QgZ283MDA3ICpnbyA9IGdvZmgtPmdvOworCisJKmlucHV0ID0gZ28tPmlucHV0OworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX3NfaW5wdXQoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsIHVuc2lnbmVkIGludCBpbnB1dCkKK3sKKwlzdHJ1Y3QgZ283MDA3X2ZpbGUgKmdvZmggPSBwcml2OworCXN0cnVjdCBnbzcwMDcgKmdvID0gZ29maC0+Z287CisKKwlpZiAoaW5wdXQgPj0gZ28tPmJvYXJkX2luZm8tPm51bV9pbnB1dHMpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChnby0+c3RyZWFtaW5nKQorCQlyZXR1cm4gLUVCVVNZOworCisJZ28tPmlucHV0ID0gaW5wdXQ7CisJaWYgKGdvLT5pMmNfYWRhcHRlcl9vbmxpbmUpIHsKKwkJaTJjX2NsaWVudHNfY29tbWFuZCgmZ28tPmkyY19hZGFwdGVyLCBWSURJT0NfU19JTlBVVCwKKwkJCSZnby0+Ym9hcmRfaW5mby0+aW5wdXRzW2lucHV0XS52aWRlb19pbnB1dCk7CisJCWkyY19jbGllbnRzX2NvbW1hbmQoJmdvLT5pMmNfYWRhcHRlciwgVklESU9DX1NfQVVESU8sCisJCQkmZ28tPmJvYXJkX2luZm8tPmlucHV0c1tpbnB1dF0uYXVkaW9faW5wdXQpOwogCX0KLQljYXNlIFZJRElPQ19HX0lOUFVUOgotCXsKLQkJaW50ICppbnB1dCA9IGFyZzsKIAotCQkqaW5wdXQgPSBnby0+aW5wdXQ7Ci0JCXJldHVybiAwOwotCX0KLQljYXNlIFZJRElPQ19TX0lOUFVUOgotCXsKLQkJaW50ICppbnB1dCA9IGFyZzsKKwlyZXR1cm4gMDsKK30KIAotCQlpZiAoKmlucHV0ID49IGdvLT5ib2FyZF9pbmZvLT5udW1faW5wdXRzKQorc3RhdGljIGludCB2aWRpb2NfZ190dW5lcihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCQlzdHJ1Y3QgdjRsMl90dW5lciAqdCkKK3sKKwlzdHJ1Y3QgZ283MDA3X2ZpbGUgKmdvZmggPSBwcml2OworCXN0cnVjdCBnbzcwMDcgKmdvID0gZ29maC0+Z287CisKKwlpZiAoIShnby0+Ym9hcmRfaW5mby0+ZmxhZ3MgJiBHTzcwMDdfQk9BUkRfSEFTX1RVTkVSKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHQtPmluZGV4ICE9IDApCisJCXJldHVybiAtRUlOVkFMOworCWlmICghZ28tPmkyY19hZGFwdGVyX29ubGluZSkKKwkJcmV0dXJuIC1FSU87CisKKwlpMmNfY2xpZW50c19jb21tYW5kKCZnby0+aTJjX2FkYXB0ZXIsIFZJRElPQ19HX1RVTkVSLCB0KTsKKworCXQtPmluZGV4ID0gMDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2aWRpb2Nfc190dW5lcihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCQlzdHJ1Y3QgdjRsMl90dW5lciAqdCkKK3sKKwlzdHJ1Y3QgZ283MDA3X2ZpbGUgKmdvZmggPSBwcml2OworCXN0cnVjdCBnbzcwMDcgKmdvID0gZ29maC0+Z287CisKKwlpZiAoIShnby0+Ym9hcmRfaW5mby0+ZmxhZ3MgJiBHTzcwMDdfQk9BUkRfSEFTX1RVTkVSKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHQtPmluZGV4ICE9IDApCisJCXJldHVybiAtRUlOVkFMOworCWlmICghZ28tPmkyY19hZGFwdGVyX29ubGluZSkKKwkJcmV0dXJuIC1FSU87CisKKwlzd2l0Y2ggKGdvLT5ib2FyZF9pZCkgeworCWNhc2UgR083MDA3X0JPQVJESURfUFhfVFY0MDJVX05BOgorCWNhc2UgR083MDA3X0JPQVJESURfUFhfVFY0MDJVX0pQOgorCQkvKiBObyBzZWxlY3RhYmxlIG9wdGlvbnMgY3VycmVudGx5ICovCisJCWlmICh0LT5hdWRtb2RlICE9IFY0TDJfVFVORVJfTU9ERV9TVEVSRU8pCiAJCQlyZXR1cm4gLUVJTlZBTDsKLQkJaWYgKGdvLT5zdHJlYW1pbmcpCi0JCQlyZXR1cm4gLUVCVVNZOwotCQlnby0+aW5wdXQgPSAqaW5wdXQ7Ci0JCWlmIChnby0+aTJjX2FkYXB0ZXJfb25saW5lKSB7Ci0JCQlpMmNfY2xpZW50c19jb21tYW5kKCZnby0+aTJjX2FkYXB0ZXIsIFZJRElPQ19TX0lOUFVULAotCQkJCSZnby0+Ym9hcmRfaW5mby0+aW5wdXRzWyppbnB1dF0udmlkZW9faW5wdXQpOwotCQkJaTJjX2NsaWVudHNfY29tbWFuZCgmZ28tPmkyY19hZGFwdGVyLCBWSURJT0NfU19BVURJTywKLQkJCQkmZ28tPmJvYXJkX2luZm8tPmlucHV0c1sqaW5wdXRdLmF1ZGlvX2lucHV0KTsKLQkJfQotCQlyZXR1cm4gMDsKKwkJYnJlYWs7CiAJfQotCWNhc2UgVklESU9DX0dfVFVORVI6Ci0JewotCQlzdHJ1Y3QgdjRsMl90dW5lciAqdCA9IGFyZzsKIAotCQlpZiAoIShnby0+Ym9hcmRfaW5mby0+ZmxhZ3MgJiBHTzcwMDdfQk9BUkRfSEFTX1RVTkVSKSkKLQkJCXJldHVybiAtRUlOVkFMOwotCQlpZiAodC0+aW5kZXggIT0gMCkKLQkJCXJldHVybiAtRUlOVkFMOwotCQlpZiAoIWdvLT5pMmNfYWRhcHRlcl9vbmxpbmUpCi0JCQlyZXR1cm4gLUVJTzsKLQkJaTJjX2NsaWVudHNfY29tbWFuZCgmZ28tPmkyY19hZGFwdGVyLCBWSURJT0NfR19UVU5FUiwgYXJnKTsKLQkJdC0+aW5kZXggPSAwOwotCQlyZXR1cm4gMDsKKwlpMmNfY2xpZW50c19jb21tYW5kKCZnby0+aTJjX2FkYXB0ZXIsIFZJRElPQ19TX1RVTkVSLCB0KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZpZGlvY19nX2ZyZXF1ZW5jeShzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCQlzdHJ1Y3QgdjRsMl9mcmVxdWVuY3kgKmYpCit7CisJc3RydWN0IGdvNzAwN19maWxlICpnb2ZoID0gcHJpdjsKKwlzdHJ1Y3QgZ283MDA3ICpnbyA9IGdvZmgtPmdvOworCisJaWYgKCEoZ28tPmJvYXJkX2luZm8tPmZsYWdzICYgR083MDA3X0JPQVJEX0hBU19UVU5FUikpCisJCXJldHVybiAtRUlOVkFMOworCWlmICghZ28tPmkyY19hZGFwdGVyX29ubGluZSkKKwkJcmV0dXJuIC1FSU87CisKKwlmLT50eXBlID0gVjRMMl9UVU5FUl9BTkFMT0dfVFY7CisJaTJjX2NsaWVudHNfY29tbWFuZCgmZ28tPmkyY19hZGFwdGVyLCBWSURJT0NfR19GUkVRVUVOQ1ksIGYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZpZGlvY19zX2ZyZXF1ZW5jeShzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCQlzdHJ1Y3QgdjRsMl9mcmVxdWVuY3kgKmYpCit7CisJc3RydWN0IGdvNzAwN19maWxlICpnb2ZoID0gcHJpdjsKKwlzdHJ1Y3QgZ283MDA3ICpnbyA9IGdvZmgtPmdvOworCisJaWYgKCEoZ28tPmJvYXJkX2luZm8tPmZsYWdzICYgR083MDA3X0JPQVJEX0hBU19UVU5FUikpCisJCXJldHVybiAtRUlOVkFMOworCWlmICghZ28tPmkyY19hZGFwdGVyX29ubGluZSkKKwkJcmV0dXJuIC1FSU87CisKKwlpMmNfY2xpZW50c19jb21tYW5kKCZnby0+aTJjX2FkYXB0ZXIsIFZJRElPQ19TX0ZSRVFVRU5DWSwgZik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2aWRpb2NfY3JvcGNhcChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCQkJc3RydWN0IHY0bDJfY3JvcGNhcCAqY3JvcGNhcCkKK3sKKwlzdHJ1Y3QgZ283MDA3X2ZpbGUgKmdvZmggPSBwcml2OworCXN0cnVjdCBnbzcwMDcgKmdvID0gZ29maC0+Z287CisKKwlpZiAoY3JvcGNhcC0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogVGhlc2Ugc3BlY2lmeSB0aGUgcmF3IGlucHV0IG9mIHRoZSBzZW5zb3IgKi8KKwlzd2l0Y2ggKGdvLT5zdGFuZGFyZCkgeworCWNhc2UgR083MDA3X1NURF9OVFNDOgorCQljcm9wY2FwLT5ib3VuZHMudG9wID0gMDsKKwkJY3JvcGNhcC0+Ym91bmRzLmxlZnQgPSAwOworCQljcm9wY2FwLT5ib3VuZHMud2lkdGggPSA3MjA7CisJCWNyb3BjYXAtPmJvdW5kcy5oZWlnaHQgPSA0ODA7CisJCWNyb3BjYXAtPmRlZnJlY3QudG9wID0gMDsKKwkJY3JvcGNhcC0+ZGVmcmVjdC5sZWZ0ID0gMDsKKwkJY3JvcGNhcC0+ZGVmcmVjdC53aWR0aCA9IDcyMDsKKwkJY3JvcGNhcC0+ZGVmcmVjdC5oZWlnaHQgPSA0ODA7CisJCWJyZWFrOworCWNhc2UgR083MDA3X1NURF9QQUw6CisJCWNyb3BjYXAtPmJvdW5kcy50b3AgPSAwOworCQljcm9wY2FwLT5ib3VuZHMubGVmdCA9IDA7CisJCWNyb3BjYXAtPmJvdW5kcy53aWR0aCA9IDcyMDsKKwkJY3JvcGNhcC0+Ym91bmRzLmhlaWdodCA9IDU3NjsKKwkJY3JvcGNhcC0+ZGVmcmVjdC50b3AgPSAwOworCQljcm9wY2FwLT5kZWZyZWN0LmxlZnQgPSAwOworCQljcm9wY2FwLT5kZWZyZWN0LndpZHRoID0gNzIwOworCQljcm9wY2FwLT5kZWZyZWN0LmhlaWdodCA9IDU3NjsKKwkJYnJlYWs7CisJY2FzZSBHTzcwMDdfU1REX09USEVSOgorCQljcm9wY2FwLT5ib3VuZHMudG9wID0gMDsKKwkJY3JvcGNhcC0+Ym91bmRzLmxlZnQgPSAwOworCQljcm9wY2FwLT5ib3VuZHMud2lkdGggPSBnby0+Ym9hcmRfaW5mby0+c2Vuc29yX3dpZHRoOworCQljcm9wY2FwLT5ib3VuZHMuaGVpZ2h0ID0gZ28tPmJvYXJkX2luZm8tPnNlbnNvcl9oZWlnaHQ7CisJCWNyb3BjYXAtPmRlZnJlY3QudG9wID0gMDsKKwkJY3JvcGNhcC0+ZGVmcmVjdC5sZWZ0ID0gMDsKKwkJY3JvcGNhcC0+ZGVmcmVjdC53aWR0aCA9IGdvLT5ib2FyZF9pbmZvLT5zZW5zb3Jfd2lkdGg7CisJCWNyb3BjYXAtPmRlZnJlY3QuaGVpZ2h0ID0gZ28tPmJvYXJkX2luZm8tPnNlbnNvcl9oZWlnaHQ7CisJCWJyZWFrOwogCX0KLQljYXNlIFZJRElPQ19TX1RVTkVSOgotCXsKLQkJc3RydWN0IHY0bDJfdHVuZXIgKnQgPSBhcmc7CiAKLQkJaWYgKCEoZ28tPmJvYXJkX2luZm8tPmZsYWdzICYgR083MDA3X0JPQVJEX0hBU19UVU5FUikpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJaWYgKHQtPmluZGV4ICE9IDApCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJaWYgKCFnby0+aTJjX2FkYXB0ZXJfb25saW5lKQotCQkJcmV0dXJuIC1FSU87Ci0JCXN3aXRjaCAoZ28tPmJvYXJkX2lkKSB7Ci0JCWNhc2UgR083MDA3X0JPQVJESURfUFhfVFY0MDJVX05BOgotCQljYXNlIEdPNzAwN19CT0FSRElEX1BYX1RWNDAyVV9KUDoKLQkJCS8qIE5vIHNlbGVjdGFibGUgb3B0aW9ucyBjdXJyZW50bHkgKi8KLQkJCWlmICh0LT5hdWRtb2RlICE9IFY0TDJfVFVORVJfTU9ERV9TVEVSRU8pCi0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQlicmVhazsKLQkJfQotCQlpMmNfY2xpZW50c19jb21tYW5kKCZnby0+aTJjX2FkYXB0ZXIsIFZJRElPQ19TX1RVTkVSLCBhcmcpOwotCQlyZXR1cm4gMDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2aWRpb2NfZ19jcm9wKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LCBzdHJ1Y3QgdjRsMl9jcm9wICpjcm9wKQoreworCXN0cnVjdCBnbzcwMDdfZmlsZSAqZ29maCA9IHByaXY7CisJc3RydWN0IGdvNzAwNyAqZ28gPSBnb2ZoLT5nbzsKKworCWlmIChjcm9wLT50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwljcm9wLT50eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOworCisJLyogVGhlc2Ugc3BlY2lmeSB0aGUgcmF3IGlucHV0IG9mIHRoZSBzZW5zb3IgKi8KKwlzd2l0Y2ggKGdvLT5zdGFuZGFyZCkgeworCWNhc2UgR083MDA3X1NURF9OVFNDOgorCQljcm9wLT5jLnRvcCA9IDA7CisJCWNyb3AtPmMubGVmdCA9IDA7CisJCWNyb3AtPmMud2lkdGggPSA3MjA7CisJCWNyb3AtPmMuaGVpZ2h0ID0gNDgwOworCQlicmVhazsKKwljYXNlIEdPNzAwN19TVERfUEFMOgorCQljcm9wLT5jLnRvcCA9IDA7CisJCWNyb3AtPmMubGVmdCA9IDA7CisJCWNyb3AtPmMud2lkdGggPSA3MjA7CisJCWNyb3AtPmMuaGVpZ2h0ID0gNTc2OworCQlicmVhazsKKwljYXNlIEdPNzAwN19TVERfT1RIRVI6CisJCWNyb3AtPmMudG9wID0gMDsKKwkJY3JvcC0+Yy5sZWZ0ID0gMDsKKwkJY3JvcC0+Yy53aWR0aCA9IGdvLT5ib2FyZF9pbmZvLT5zZW5zb3Jfd2lkdGg7CisJCWNyb3AtPmMuaGVpZ2h0ID0gZ28tPmJvYXJkX2luZm8tPnNlbnNvcl9oZWlnaHQ7CisJCWJyZWFrOwogCX0KLQljYXNlIFZJRElPQ19HX0ZSRVFVRU5DWToKLQl7Ci0JCXN0cnVjdCB2NGwyX2ZyZXF1ZW5jeSAqZiA9IGFyZzsKIAotCQlpZiAoIShnby0+Ym9hcmRfaW5mby0+ZmxhZ3MgJiBHTzcwMDdfQk9BUkRfSEFTX1RVTkVSKSkKLQkJCXJldHVybiAtRUlOVkFMOwotCQlpZiAoIWdvLT5pMmNfYWRhcHRlcl9vbmxpbmUpCi0JCQlyZXR1cm4gLUVJTzsKLQkJbWVtc2V0KGYsIDAsIHNpemVvZigqZikpOwotCQlmLT50eXBlID0gVjRMMl9UVU5FUl9BTkFMT0dfVFY7Ci0JCWkyY19jbGllbnRzX2NvbW1hbmQoJmdvLT5pMmNfYWRhcHRlciwgVklESU9DX0dfRlJFUVVFTkNZLCBhcmcpOwotCQlyZXR1cm4gMDsKLQl9Ci0JY2FzZSBWSURJT0NfU19GUkVRVUVOQ1k6Ci0JewotCQlpZiAoIShnby0+Ym9hcmRfaW5mby0+ZmxhZ3MgJiBHTzcwMDdfQk9BUkRfSEFTX1RVTkVSKSkKLQkJCXJldHVybiAtRUlOVkFMOwotCQlpZiAoIWdvLT5pMmNfYWRhcHRlcl9vbmxpbmUpCi0JCQlyZXR1cm4gLUVJTzsKLQkJaTJjX2NsaWVudHNfY29tbWFuZCgmZ28tPmkyY19hZGFwdGVyLCBWSURJT0NfU19GUkVRVUVOQ1ksIGFyZyk7Ci0JCXJldHVybiAwOwotCX0KLQljYXNlIFZJRElPQ19DUk9QQ0FQOgotCXsKLQkJc3RydWN0IHY0bDJfY3JvcGNhcCAqY3JvcGNhcCA9IGFyZzsKKwlyZXR1cm4gMDsKK30KIAotCQlpZiAoY3JvcGNhcC0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJbWVtc2V0KGNyb3BjYXAsIDAsIHNpemVvZigqY3JvcGNhcCkpOwotCQljcm9wY2FwLT50eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOwotCQkvKiBUaGVzZSBzcGVjaWZ5IHRoZSByYXcgaW5wdXQgb2YgdGhlIHNlbnNvciAqLwotCQlzd2l0Y2ggKGdvLT5zdGFuZGFyZCkgewotCQljYXNlIEdPNzAwN19TVERfTlRTQzoKLQkJCWNyb3BjYXAtPmJvdW5kcy50b3AgPSAwOwotCQkJY3JvcGNhcC0+Ym91bmRzLmxlZnQgPSAwOwotCQkJY3JvcGNhcC0+Ym91bmRzLndpZHRoID0gNzIwOwotCQkJY3JvcGNhcC0+Ym91bmRzLmhlaWdodCA9IDQ4MDsKLQkJCWNyb3BjYXAtPmRlZnJlY3QudG9wID0gMDsKLQkJCWNyb3BjYXAtPmRlZnJlY3QubGVmdCA9IDA7Ci0JCQljcm9wY2FwLT5kZWZyZWN0LndpZHRoID0gNzIwOwotCQkJY3JvcGNhcC0+ZGVmcmVjdC5oZWlnaHQgPSA0ODA7Ci0JCQlicmVhazsKLQkJY2FzZSBHTzcwMDdfU1REX1BBTDoKLQkJCWNyb3BjYXAtPmJvdW5kcy50b3AgPSAwOwotCQkJY3JvcGNhcC0+Ym91bmRzLmxlZnQgPSAwOwotCQkJY3JvcGNhcC0+Ym91bmRzLndpZHRoID0gNzIwOwotCQkJY3JvcGNhcC0+Ym91bmRzLmhlaWdodCA9IDU3NjsKLQkJCWNyb3BjYXAtPmRlZnJlY3QudG9wID0gMDsKLQkJCWNyb3BjYXAtPmRlZnJlY3QubGVmdCA9IDA7Ci0JCQljcm9wY2FwLT5kZWZyZWN0LndpZHRoID0gNzIwOwotCQkJY3JvcGNhcC0+ZGVmcmVjdC5oZWlnaHQgPSA1NzY7Ci0JCQlicmVhazsKLQkJY2FzZSBHTzcwMDdfU1REX09USEVSOgotCQkJY3JvcGNhcC0+Ym91bmRzLnRvcCA9IDA7Ci0JCQljcm9wY2FwLT5ib3VuZHMubGVmdCA9IDA7Ci0JCQljcm9wY2FwLT5ib3VuZHMud2lkdGggPSBnby0+Ym9hcmRfaW5mby0+c2Vuc29yX3dpZHRoOwotCQkJY3JvcGNhcC0+Ym91bmRzLmhlaWdodCA9IGdvLT5ib2FyZF9pbmZvLT5zZW5zb3JfaGVpZ2h0OwotCQkJY3JvcGNhcC0+ZGVmcmVjdC50b3AgPSAwOwotCQkJY3JvcGNhcC0+ZGVmcmVjdC5sZWZ0ID0gMDsKLQkJCWNyb3BjYXAtPmRlZnJlY3Qud2lkdGggPSBnby0+Ym9hcmRfaW5mby0+c2Vuc29yX3dpZHRoOwotCQkJY3JvcGNhcC0+ZGVmcmVjdC5oZWlnaHQgPSBnby0+Ym9hcmRfaW5mby0+c2Vuc29yX2hlaWdodDsKLQkJCWJyZWFrOwotCQl9CisvKiBGSVhNRTogdmlkaW9jX3NfY3JvcCBpcyBub3QgcmVhbGx5IGltcGxlbWVudGVkISEhCisgKi8KK3N0YXRpYyBpbnQgdmlkaW9jX3NfY3JvcChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwgc3RydWN0IHY0bDJfY3JvcCAqY3JvcCkKK3sKKwlpZiAoY3JvcC0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpCisJCXJldHVybiAtRUlOVkFMOwogCi0JCXJldHVybiAwOwotCX0KLQljYXNlIFZJRElPQ19HX0NST1A6Ci0JewotCQlzdHJ1Y3QgdjRsMl9jcm9wICpjcm9wID0gYXJnOworCXJldHVybiAwOworfQogCi0JCWlmIChjcm9wLT50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkKLQkJCXJldHVybiAtRUlOVkFMOwotCQltZW1zZXQoY3JvcCwgMCwgc2l6ZW9mKCpjcm9wKSk7Ci0JCWNyb3AtPnR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU7Ci0JCS8qIFRoZXNlIHNwZWNpZnkgdGhlIHJhdyBpbnB1dCBvZiB0aGUgc2Vuc29yICovCi0JCXN3aXRjaCAoZ28tPnN0YW5kYXJkKSB7Ci0JCWNhc2UgR083MDA3X1NURF9OVFNDOgotCQkJY3JvcC0+Yy50b3AgPSAwOwotCQkJY3JvcC0+Yy5sZWZ0ID0gMDsKLQkJCWNyb3AtPmMud2lkdGggPSA3MjA7Ci0JCQljcm9wLT5jLmhlaWdodCA9IDQ4MDsKLQkJCWJyZWFrOwotCQljYXNlIEdPNzAwN19TVERfUEFMOgotCQkJY3JvcC0+Yy50b3AgPSAwOwotCQkJY3JvcC0+Yy5sZWZ0ID0gMDsKLQkJCWNyb3AtPmMud2lkdGggPSA3MjA7Ci0JCQljcm9wLT5jLmhlaWdodCA9IDU3NjsKLQkJCWJyZWFrOwotCQljYXNlIEdPNzAwN19TVERfT1RIRVI6Ci0JCQljcm9wLT5jLnRvcCA9IDA7Ci0JCQljcm9wLT5jLmxlZnQgPSAwOwotCQkJY3JvcC0+Yy53aWR0aCA9IGdvLT5ib2FyZF9pbmZvLT5zZW5zb3Jfd2lkdGg7Ci0JCQljcm9wLT5jLmhlaWdodCA9IGdvLT5ib2FyZF9pbmZvLT5zZW5zb3JfaGVpZ2h0OwotCQkJYnJlYWs7Ci0JCX0KK3N0YXRpYyBpbnQgdmlkaW9jX2dfanBlZ2NvbXAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkgc3RydWN0IHY0bDJfanBlZ2NvbXByZXNzaW9uICpwYXJhbXMpCit7CisJbWVtc2V0KHBhcmFtcywgMCwgc2l6ZW9mKCpwYXJhbXMpKTsKKwlwYXJhbXMtPnF1YWxpdHkgPSA1MDsgLyogPz8gKi8KKwlwYXJhbXMtPmpwZWdfbWFya2VycyA9IFY0TDJfSlBFR19NQVJLRVJfREhUIHwKKwkJCQlWNEwyX0pQRUdfTUFSS0VSX0RRVDsKIAotCQlyZXR1cm4gMDsKLQl9Ci0JY2FzZSBWSURJT0NfU19DUk9QOgotCXsKLQkJc3RydWN0IHY0bDJfY3JvcCAqY3JvcCA9IGFyZzsKKwlyZXR1cm4gMDsKK30KIAotCQlpZiAoY3JvcC0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJcmV0dXJuIDA7Ci0JfQotCWNhc2UgVklESU9DX0dfSlBFR0NPTVA6Ci0JewotCQlzdHJ1Y3QgdjRsMl9qcGVnY29tcHJlc3Npb24gKnBhcmFtcyA9IGFyZzsKK3N0YXRpYyBpbnQgdmlkaW9jX3NfanBlZ2NvbXAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkgc3RydWN0IHY0bDJfanBlZ2NvbXByZXNzaW9uICpwYXJhbXMpCit7CisJaWYgKHBhcmFtcy0+cXVhbGl0eSAhPSA1MCB8fAorCQkJcGFyYW1zLT5qcGVnX21hcmtlcnMgIT0gKFY0TDJfSlBFR19NQVJLRVJfREhUIHwKKwkJCQkJCVY0TDJfSlBFR19NQVJLRVJfRFFUKSkKKwkJcmV0dXJuIC1FSU5WQUw7CiAKLQkJbWVtc2V0KHBhcmFtcywgMCwgc2l6ZW9mKCpwYXJhbXMpKTsKLQkJcGFyYW1zLT5xdWFsaXR5ID0gNTA7IC8qID8/ICovCi0JCXBhcmFtcy0+anBlZ19tYXJrZXJzID0gVjRMMl9KUEVHX01BUktFUl9ESFQgfAotCQkJCQlWNEwyX0pQRUdfTUFSS0VSX0RRVDsKKwlyZXR1cm4gMDsKK30KIAotCQlyZXR1cm4gMDsKLQl9Ci0JY2FzZSBWSURJT0NfU19KUEVHQ09NUDoKLQl7Ci0JCXN0cnVjdCB2NGwyX2pwZWdjb21wcmVzc2lvbiAqcGFyYW1zID0gYXJnOworLyogRklYTUU6CisJVGhvc2UgaW9jdGxzIGFyZSBwcml2YXRlLCBhbmQgbm90IG5lZWRlZCwgc2luY2Ugc2V2ZXJhbCBzdGFuZGFyZAorCWV4dGVuZGVkIGNvbnRyb2xzIGFscmVhZHkgcHJvdmlkZSBzdHJlYW1pbmcgY29udHJvbC4KKwlTbywgdGhvc2UgaW9jdGxzIHNob3VsZCBiZSBjb252ZXJ0ZWQgaW50byB2aWRpb2NfZ19leHRfY3RybHMoKQorCWFuZCB2aWRpb2Nfc19leHRfY3RybHMoKQorICovCiAKLQkJaWYgKHBhcmFtcy0+cXVhbGl0eSAhPSA1MCB8fAotCQkJCXBhcmFtcy0+anBlZ19tYXJrZXJzICE9IChWNEwyX0pQRUdfTUFSS0VSX0RIVCB8Ci0JCQkJCQkJVjRMMl9KUEVHX01BUktFUl9EUVQpKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCXJldHVybiAwOwotCX0KKyNpZiAwCiAJLyogVGVtcG9yYXJ5IGlvY3RscyBmb3IgY29udHJvbGxpbmcgY29tcHJlc3Npb24gY2hhcmFjdGVyaXN0aWNzICovCiAJY2FzZSBHTzcwMDdJT0NfU19CSVRSQVRFOgogCXsKQEAgLTEzMTYsMjcgKzE2NzcsNyBAQAogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCXJldHVybiBjbGlwX3RvX21vZGV0X21hcChnbywgcmVnaW9uLT5yZWdpb24sIHJlZ2lvbi0+Y2xpcHMpOwogCX0KLQlkZWZhdWx0OgotCQlwcmludGsoS0VSTl9ERUJVRyAiZ283MDA3OiB1bnN1cHBvcnRlZCBpb2N0bCAlZFxuIiwgY21kKTsKLQkJcmV0dXJuIC1FTk9JT0NUTENNRDsKLQl9Ci0JcmV0dXJuIDA7Ci0KLXVubG9ja19hbmRfcmV0dXJuOgotCXVwKCZnb2ZoLT5sb2NrKTsKLQlyZXR1cm4gcmV0dmFsOwotfQotCi1zdGF0aWMgaW50IGdvNzAwN19pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCi17Ci0Jc3RydWN0IGdvNzAwN19maWxlICpnb2ZoID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCi0JaWYgKGdvZmgtPmdvLT5zdGF0dXMgIT0gU1RBVFVTX09OTElORSkKLQkJcmV0dXJuIC1FSU87Ci0KLQlyZXR1cm4gdmlkZW9fdXNlcmNvcHkoaW5vZGUsIGZpbGUsIGNtZCwgYXJnLCBnbzcwMDdfZG9faW9jdGwpOwotfQorI2VuZGlmCiAKIHN0YXRpYyBzc2l6ZV90IGdvNzAwN19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqZGF0YSwKIAkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCkBAIC0xMzcxLDggKzE3MTIsNyBAQAogCXBhZ2UgPSBhbGxvY19wYWdlKEdGUF9VU0VSIHwgX19HRlBfRE1BMzIpOwogCWlmICghcGFnZSkKIAkJcmV0dXJuIFZNX0ZBVUxUX09PTTsKLQljbGVhcl91c2VyX3BhZ2UocGFnZV9hZGRyZXNzKHBhZ2UpLCAodW5zaWduZWQgbG9uZyl2bWYtPnZpcnR1YWxfYWRkcmVzcywKLQkJCXBhZ2UpOworCWNsZWFyX3VzZXJfaGlnaHBhZ2UocGFnZSwgKHVuc2lnbmVkIGxvbmcpdm1mLT52aXJ0dWFsX2FkZHJlc3MpOwogCXZtZi0+cGFnZSA9IHBhZ2U7CiAJcmV0dXJuIDA7CiB9CkBAIC0xNDQxLDIzICsxNzgxLDU5IEBACiAJCWtmcmVlKGdvKTsKIH0KIAotc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZ283MDA3X2ZvcHMgPSB7CitzdGF0aWMgc3RydWN0IHY0bDJfZmlsZV9vcGVyYXRpb25zIGdvNzAwN19mb3BzID0gewogCS5vd25lcgkJPSBUSElTX01PRFVMRSwKIAkub3BlbgkJPSBnbzcwMDdfb3BlbiwKIAkucmVsZWFzZQk9IGdvNzAwN19yZWxlYXNlLAotCS5pb2N0bAkJPSBnbzcwMDdfaW9jdGwsCi0JLmxsc2VlawkJPSBub19sbHNlZWssCisJLmlvY3RsCQk9IHZpZGVvX2lvY3RsMiwKIAkucmVhZAkJPSBnbzcwMDdfcmVhZCwKIAkubW1hcAkJPSBnbzcwMDdfbW1hcCwKIAkucG9sbAkJPSBnbzcwMDdfcG9sbCwKIH07CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9pb2N0bF9vcHMgdmlkZW9faW9jdGxfb3BzID0geworCS52aWRpb2NfcXVlcnljYXAgICAgICAgICAgPSB2aWRpb2NfcXVlcnljYXAsCisJLnZpZGlvY19lbnVtX2ZtdF92aWRfY2FwICA9IHZpZGlvY19lbnVtX2ZtdF92aWRfY2FwLAorCS52aWRpb2NfZ19mbXRfdmlkX2NhcCAgICAgPSB2aWRpb2NfZ19mbXRfdmlkX2NhcCwKKwkudmlkaW9jX3RyeV9mbXRfdmlkX2NhcCAgID0gdmlkaW9jX3RyeV9mbXRfdmlkX2NhcCwKKwkudmlkaW9jX3NfZm10X3ZpZF9jYXAgICAgID0gdmlkaW9jX3NfZm10X3ZpZF9jYXAsCisJLnZpZGlvY19yZXFidWZzICAgICAgICAgICA9IHZpZGlvY19yZXFidWZzLAorCS52aWRpb2NfcXVlcnlidWYgICAgICAgICAgPSB2aWRpb2NfcXVlcnlidWYsCisJLnZpZGlvY19xYnVmICAgICAgICAgICAgICA9IHZpZGlvY19xYnVmLAorCS52aWRpb2NfZHFidWYgICAgICAgICAgICAgPSB2aWRpb2NfZHFidWYsCisJLnZpZGlvY19zX3N0ZCAgICAgICAgICAgICA9IHZpZGlvY19zX3N0ZCwKKwkudmlkaW9jX2VudW1faW5wdXQgICAgICAgID0gdmlkaW9jX2VudW1faW5wdXQsCisJLnZpZGlvY19nX2lucHV0ICAgICAgICAgICA9IHZpZGlvY19nX2lucHV0LAorCS52aWRpb2Nfc19pbnB1dCAgICAgICAgICAgPSB2aWRpb2Nfc19pbnB1dCwKKwkudmlkaW9jX3F1ZXJ5Y3RybCAgICAgICAgID0gdmlkaW9jX3F1ZXJ5Y3RybCwKKwkudmlkaW9jX2dfY3RybCAgICAgICAgICAgID0gdmlkaW9jX2dfY3RybCwKKwkudmlkaW9jX3NfY3RybCAgICAgICAgICAgID0gdmlkaW9jX3NfY3RybCwKKwkudmlkaW9jX3N0cmVhbW9uICAgICAgICAgID0gdmlkaW9jX3N0cmVhbW9uLAorCS52aWRpb2Nfc3RyZWFtb2ZmICAgICAgICAgPSB2aWRpb2Nfc3RyZWFtb2ZmLAorCS52aWRpb2NfZ190dW5lciAgICAgICAgICAgPSB2aWRpb2NfZ190dW5lciwKKwkudmlkaW9jX3NfdHVuZXIgICAgICAgICAgID0gdmlkaW9jX3NfdHVuZXIsCisJLnZpZGlvY19nX2ZyZXF1ZW5jeSAgICAgICA9IHZpZGlvY19nX2ZyZXF1ZW5jeSwKKwkudmlkaW9jX3NfZnJlcXVlbmN5ICAgICAgID0gdmlkaW9jX3NfZnJlcXVlbmN5LAorCS52aWRpb2NfZ19wYXJtICAgICAgICAgICAgPSB2aWRpb2NfZ19wYXJtLAorCS52aWRpb2Nfc19wYXJtICAgICAgICAgICAgPSB2aWRpb2Nfc19wYXJtLAorCS52aWRpb2NfZW51bV9mcmFtZXNpemVzICAgPSB2aWRpb2NfZW51bV9mcmFtZXNpemVzLAorCS52aWRpb2NfZW51bV9mcmFtZWludGVydmFscyA9IHZpZGlvY19lbnVtX2ZyYW1laW50ZXJ2YWxzLAorCS52aWRpb2NfY3JvcGNhcCAgICAgICAgICAgPSB2aWRpb2NfY3JvcGNhcCwKKwkudmlkaW9jX2dfY3JvcCAgICAgICAgICAgID0gdmlkaW9jX2dfY3JvcCwKKwkudmlkaW9jX3NfY3JvcCAgICAgICAgICAgID0gdmlkaW9jX3NfY3JvcCwKKwkudmlkaW9jX2dfanBlZ2NvbXAgICAgICAgID0gdmlkaW9jX2dfanBlZ2NvbXAsCisJLnZpZGlvY19zX2pwZWdjb21wICAgICAgICA9IHZpZGlvY19zX2pwZWdjb21wLAorfTsKKwogc3RhdGljIHN0cnVjdCB2aWRlb19kZXZpY2UgZ283MDA3X3RlbXBsYXRlID0gewogCS5uYW1lCQk9ICJnbzcwMDciLAogCS52ZmxfdHlwZQk9IFZJRF9UWVBFX0NBUFRVUkUsCiAJLmZvcHMJCT0gJmdvNzAwN19mb3BzLAogCS5taW5vcgkJPSAtMSwKIAkucmVsZWFzZQk9IGdvNzAwN192ZmxfcmVsZWFzZSwKKwkuaW9jdGxfb3BzCT0gJnZpZGVvX2lvY3RsX29wcywKKwkudHZub3Jtcwk9IFY0TDJfU1REX0FMTCwKKwkuY3VycmVudF9ub3JtCT0gVjRMMl9TVERfTlRTQywKIH07CiAKIGludCBnbzcwMDdfdjRsMl9pbml0KHN0cnVjdCBnbzcwMDcgKmdvKQpAQCAtMTQ3Nyw2ICsxODUzLDggQEAKIAl9CiAJdmlkZW9fc2V0X2RydmRhdGEoZ28tPnZpZGVvX2RldiwgZ28pOwogCSsrZ28tPnJlZl9jb3VudDsKKwlwcmludGsoS0VSTl9JTkZPICIlczogcmVnaXN0ZXJlZCBkZXZpY2UgdmlkZW8lZCBbdjRsMl1cbiIsCisJICAgICAgIGdvLT52aWRlb19kZXYtPm5hbWUsIGdvLT52aWRlb19kZXYtPm51bSk7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9nbzcwMDcvZ283MDA3LnR4dCBiL2RyaXZlcnMvc3RhZ2luZy9nbzcwMDcvZ283MDA3LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjY3NzJiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2dvNzAwNy9nbzcwMDcudHh0CkBAIC0wLDAgKzEsNDgxIEBACitUaGlzIGlzIGEgZHJpdmVyIGZvciB0aGUgV0lTIEdPNzAwN1NCIG11bHRpLWZvcm1hdCB2aWRlbyBlbmNvZGVyLgorCitQZXRlIEViZXJsZWluIDxwZXRlQHNlbnNvcmF5LmNvbT4KKworVGhlIGRyaXZlciB3YXMgb3JpZ25hbGx5IHJlbGVhc2VkIHVuZGVyIHRoZSBHUEwgYW5kIGlzIGN1cnJlbnRseSBob3N0ZWQgYXQ6CitodHRwOi8vbmlrb3NhcGkub3JnL3dpa2kvaW5kZXgucGhwL1dJU19HbzcwMDdfTGludXhfZHJpdmVyCitUaGUgZ283MDA3IGZpcm13YXJlIGNhbiBiZSBhY3F1aXJlZCBmcm9tIHRoZSBwYWNrYWdlIG9uIHRoZSBzaXRlIGFib3ZlLgorCitJJ3ZlIG1vZGlmaWVkIHRoZSBkcml2ZXIgdG8gc3VwcG9ydCB0aGUgZm9sbG93aW5nIFZpZGVvNExpbnV4MiBNUEVHCitjb250cm9scywgd2l0aCBhY2NlcHRhYmxlIHZhbHVlczoKKworVjRMMl9DSURfTVBFR19TVFJFQU1fVFlQRQlWNEwyX01QRUdfU1RSRUFNX1RZUEVfTVBFRzJfRFZECisJCQkJVjRMMl9NUEVHX1NUUkVBTV9UWVBFX01QRUdfRUxFTQorVjRMMl9DSURfTVBFR19WSURFT19FTkNPRElORwlWNEwyX01QRUdfVklERU9fRU5DT0RJTkdfTVBFR18xCisJCQkJVjRMMl9NUEVHX1ZJREVPX0VOQ09ESU5HX01QRUdfMgorCQkJCVY0TDJfTVBFR19WSURFT19FTkNPRElOR19NUEVHXzQKK1Y0TDJfQ0lEX01QRUdfVklERU9fQVNQRUNUCVY0TDJfTVBFR19WSURFT19BU1BFQ1RfMXgxCisJCQkJVjRMMl9NUEVHX1ZJREVPX0FTUEVDVF80eDMKKwkJCQlWNEwyX01QRUdfVklERU9fQVNQRUNUXzE2eDkKK1Y0TDJfQ0lEX01QRUdfVklERU9fR09QX1NJWkUJaW50ZWdlcgorVjRMMl9DSURfTVBFR19WSURFT19CSVRSQVRFCTY0MDAwIC4uIDEwMDAwMDAwCisKK1RoZXNlIHNob3VsZCBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIG5vbi1zdGFuZGFyZCBHTzcwMDcgaW9jdGxzIGRlc2NyaWJlZAorYmVsb3cuCisKKworVGhlIFJFQURNRSBmaWxlcyBmcm9tIHRoZSBvcmlnbmFsIHBhY2thZ2UgYXBwZWFyIGJlbG93OgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgICAgICAgICAgIFdJUyBHTzcwMDdTQiBQdWJsaWMgTGludXggRHJpdmVyCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCisqKiogUGxlYXNlIHNlZSB0aGUgZmlsZSBSRUxFQVNFLU5PVEVTIGZvciBpbXBvcnRhbnQgbGFzdC1taW51dGUgdXBkYXRlcyAqKioKKworCisgIDAuIE9WRVJWSUVXIEFORCBMSUNFTlNJTkcvRElTQ0xBSU1FUgorCisKK1RoaXMgZHJpdmVyIGtpdCBjb250YWlucyBMaW51eCBkcml2ZXJzIGZvciB0aGUgV0lTIEdPNzAwN1NCIG11bHRpLWZvcm1hdAordmlkZW8gZW5jb2Rlci4gIE9ubHkga2VybmVsIHZlcnNpb24gMi42LnggaXMgc3VwcG9ydGVkLiAgVGhlIHZpZGVvIHN0cmVhbQoraXMgYXZhaWxhYmxlIHRocm91Z2ggdGhlIFZpZGVvNExpbnV4MiBBUEkgYW5kIHRoZSBhdWRpbyBzdHJlYW0gaXMgYXZhaWxhYmxlCit0aHJvdWdoIHRoZSBBTFNBIEFQSSAob3IgdGhlIE9TUyBlbXVsYXRpb24gbGF5ZXIgb2YgdGhlIEFMU0Egc3lzdGVtKS4KKworVGhlIGZpbGVzIGluIGtlcm5lbC8gYW5kIGhvdHBsdWcvIGFyZSBsaWNlbnNlZCB1bmRlciB0aGUgR05VIEdlbmVyYWwgUHVibGljCitMaWNlbnNlIFZlcnNpb24gMiBmcm9tIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBIGNvcHkgb2YgdGhlIGxpY2Vuc2UKK2lzIGluY2x1ZGVkIGluIHRoZSBmaWxlIENPUFlJTkcuCisKK1RoZSBleGFtcGxlIGFwcGxpY2F0aW9ucyBpbiBhcHBzLyBhbmQgQyBoZWFkZXIgZmlsZXMgaW4gaW5jbHVkZS8gYXJlCitsaWNlbnNlZCB1bmRlciBhIHBlcm1pc3NpdmUgbGljZW5zZSBpbmNsdWRlZCBpbiB0aGUgc291cmNlIGZpbGVzIHdoaWNoCithbGxvd3MgY29weWluZywgbW9kaWZpY2F0aW9uIGFuZCByZWRpc3RyaWJ1dGlvbiBmb3IgYW55IHB1cnBvc2Ugd2l0aG91dAorYXR0cmlidXRpb24uCisKK1RoZSBmaXJtd2FyZSBmaWxlcyBpbmNsdWRlZCBpbiB0aGUgZmlybXdhcmUvIGRpcmVjdG9yeSBtYXkgYmUgZnJlZWx5CityZWRpc3RyaWJ1dGVkIG9ubHkgaW4gY29uanVuY3Rpb24gd2l0aCB0aGlzIGRvY3VtZW50OyBidXQgbW9kaWZpY2F0aW9uLAordGFtcGVyaW5nIGFuZCByZXZlcnNlIGVuZ2luZWVyaW5nIGFyZSBwcm9oaWJpdGVkLgorCitNSUNST05BUyBVU0EsIElOQy4sIE1BS0VTIE5PIFdBUlJBTlRJRVMgVE8gQU5ZIFBFUlNPTiBPUiBFTlRJVFkgV0lUSAorUkVTUEVDVCBUTyBUSEUgU09GVFdBUkUgT1IgQU5ZIERFUklWQVRJVkVTIFRIRVJFT0YgT1IgQU5ZIFNFUlZJQ0VTIE9SCitMSUNFTlNFUyBBTkQgRElTQ0xBSU1TIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04KK1dBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBTVVBQT1JULCBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCitQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5ULgorCisKKyAgMS4gU1lTVEVNIFJFUVVJUkVNRU5UUworCisKK1RoaXMgZHJpdmVyIHJlcXVpcmVzIExpbnV4IGtlcm5lbCAyLjYuICBLZXJuZWwgMi40IGlzIG5vdCBzdXBwb3J0ZWQuICBVc2luZwora2VybmVsIDIuNi4xMCBvciBsYXRlciBpcyByZWNvbW1lbmRlZCwgYXMgZWFybGllciBrZXJuZWxzIGFyZSBrbm93biB0byBoYXZlCit1bnN0YWJsZSBVU0IgMi4wIHN1cHBvcnQuCisKK0EgZnVsbHkgYnVpbHQga2VybmVsIHNvdXJjZSB0cmVlIG11c3QgYmUgYXZhaWxhYmxlLiAgVHlwaWNhbGx5IHRoaXMgd2lsbCBiZQorbGlua2VkIGZyb20gIi9saWIvbW9kdWxlcy88S0VSTkVMIFZFUlNJT04+L2J1aWxkIiBmb3IgY29udmVuaWVuY2UuICBJZiB0aGlzCitsaW5rIGRvZXMgbm90IGV4aXN0LCBhbiBleHRyYSBwYXJhbWV0ZXIgd2lsbCBuZWVkIHRvIGJlIHBhc3NlZCB0byB0aGUKK2BtYWtlYCBjb21tYW5kLgorCitBbGwgdmVuZG9yLWJ1aWx0IGtlcm5lbHMgc2hvdWxkIGFscmVhZHkgYmUgY29uZmlndXJlZCBwcm9wZXJseS4gIEhvd2V2ZXIsCitmb3IgY3VzdG9tLWJ1aWx0IGtlcm5lbHMsIHRoZSBmb2xsb3dpbmcgb3B0aW9ucyBuZWVkIHRvIGJlIGVuYWJsZWQgaW4gdGhlCitrZXJuZWwgYXMgYnVpbHQtaW4gb3IgbW9kdWxlczoKKworICAgICAgICBDT05GSUdfSE9UUExVRyAgICAgICAgICAgLSBTdXBwb3J0IGZvciBob3QtcGx1Z2dhYmxlIGRldmljZXMKKyAgICAgICAgQ09ORklHX01PRFVMRVMgICAgICAgICAgIC0gRW5hYmxlIGxvYWRhYmxlIG1vZHVsZSBzdXBwb3J0CisgICAgICAgIENPTkZJR19LTU9EICAgICAgICAgICAgICAtIEF1dG9tYXRpYyBrZXJuZWwgbW9kdWxlIGxvYWRpbmcKKyAgICAgICAgQ09ORklHX0ZXX0xPQURFUiAgICAgICAgIC0gSG90cGx1ZyBmaXJtd2FyZSBsb2FkaW5nIHN1cHBvcnQKKyAgICAgICAgQ09ORklHX0kyQyAgICAgICAgICAgICAgIC0gSTJDIHN1cHBvcnQKKyAgICAgICAgQ09ORklHX1ZJREVPX0RFViAgICAgICAgIC0gVmlkZW8gRm9yIExpbnV4CisgICAgICAgIENPTkZJR19TT1VORCAgICAgICAgICAgICAtIFNvdW5kIGNhcmQgc3VwcG9ydAorICAgICAgICBDT05GSUdfU05EICAgICAgICAgICAgICAgLSBBZHZhbmNlZCBMaW51eCBTb3VuZCBBcmNoaXRlY3R1cmUKKyAgICAgICAgQ09ORklHX1VTQiAgICAgICAgICAgICAgIC0gU3VwcG9ydCBmb3IgSG9zdC1zaWRlIFVTQgorICAgICAgICBDT05GSUdfVVNCX0RFVklDRUZTICAgICAgLSBVU0IgZGV2aWNlIGZpbGVzeXN0ZW0KKyAgICAgICAgQ09ORklHX1VTQl9FSENJX0hDRCAgICAgIC0gRUhDSSBIQ0QgKFVTQiAyLjApIHN1cHBvcnQKKworQWRkaXRpb25hbGx5LCB0byB1c2UgdGhlIGV4YW1wbGUgYXBwbGljYXRpb24sIHRoZSBmb2xsb3dpbmcgb3B0aW9ucyBuZWVkIHRvCitiZSBlbmFibGVkIGluIHRoZSBBTFNBIHNlY3Rpb246CisKKyAgICAgICAgQ09ORklHX1NORF9NSVhFUl9PU1MgICAgIC0gT1NTIE1peGVyIEFQSQorICAgICAgICBDT05GSUdfU05EX1BDTV9PU1MgICAgICAgLSBPU1MgUENNIChkaWdpdGFsIGF1ZGlvKSBBUEkKKworVGhlIGhvdHBsdWcgc2NyaXB0cywgYWxvbmcgd2l0aCB0aGUgZnhsb2FkIHV0aWxpdHksIG11c3QgYWxzbyBiZSBpbnN0YWxsZWQuCitUaGVzZSBzY3JpcHRzIGNhbiBiZSBvYnRhaW5lZCBmcm9tIDxodHRwOi8vbGludXgtaG90cGx1Zy5zb3VyY2Vmb3JnZS5uZXQvPi4KK0hvdHBsdWdnaW5nIGlzIHVzZWQgZm9yIGxvYWRpbmcgZmlybXdhcmUgaW50byB0aGUgQ3lwcnVzcyBFWi1VU0IgY2hpcCB1c2luZworZnhsb2FkIGFuZCBmb3IgbG9hZGluZyBmaXJtd2FyZSBpbnRvIHRoZSBkcml2ZXIgdXNpbmcgdGhlIGZpcm13YXJlIGFnZW50LgorCisKKyAgMi4gQ09NUElMSU5HIEFORCBJTlNUQUxMSU5HIFRIRSBEUklWRVIKKworCitNb3N0IHVzZXJzIHNob3VsZCBiZSBhYmxlIHRvIGNvbXBpbGUgdGhlIGRyaXZlciBieSBzaW1wbHkgcnVubmluZzoKKworICAgICAgICAkIG1ha2UKKworaW4gdGhlIHRvcC1sZXZlbCBkaXJlY3Rvcnkgb2YgdGhlIGRyaXZlciBraXQuICBGaXJzdCB0aGUga2VybmVsIG1vZHVsZXMKK3dpbGwgYmUgYnVpbHQsIGZvbGxvd2VkIGJ5IHRoZSBleGFtcGxlIGFwcGxpY2F0aW9ucy4KKworSWYgdGhlIGJ1aWxkIHN5c3RlbSBpcyB1bmFibGUgdG8gbG9jYXRlIHRoZSBrZXJuZWwgc291cmNlIHRyZWUgZm9yIHRoZQorY3VycmVudGx5LXJ1bm5pbmcga2VybmVsLCBvciBpZiB0aGUgbW9kdWxlIHNob3VsZCBiZSBidWlsdCBmb3IgYSBrZXJuZWwKK290aGVyIHRoYW4gdGhlIGN1cnJlbnRseS1ydW5uaW5nIGtlcm5lbCwgYW4gYWRkaXRpb25hbCBwYXJhbWV0ZXIgd2lsbCBuZWVkCit0byBiZSBwYXNzZWQgdG8gbWFrZSB0byBzcGVjaWZ5IHRoZSBhcHByb3ByaWF0ZSBrZXJuZWwgc291cmNlIGRpcmVjdG9yeToKKworICAgICAgICAkIG1ha2UgS0VSTkVMU1JDPS91c3Ivc3JjL2xpbnV4LTIuNi4xMC1jdXN0b20zCisKK09uY2UgdGhlIGNvbXBpbGUgY29tcGxldGVzLCB0aGUgZHJpdmVyIGFuZCBmaXJtd2FyZSBmaWxlcyBzaG91bGQgYmUKK2luc3RhbGxlZCBieSBydW5uaW5nOgorCisgICAgICAgICQgbWFrZSBpbnN0YWxsCisKK1RoZSBrZXJuZWwgbW9kdWxlcyB3aWxsIGJlIHBsYWNlZCBpbiAiL2xpYi9tb2R1bGVzLzxLRVJORUwgVkVSU0lPTj4vZXh0cmEiCithbmQgdGhlIGZpcm13YXJlIGZpbGVzIHdpbGwgYmUgcGxhY2VkIGluIHRoZSBhcHByb3ByaWF0ZSBob3RwbHVnIGZpcm13YXJlCitkaXJlY3RvcnksIHVzdWFsbHkgL2xpYi9maXJtd2FyZS4gIEluIGFkZGl0aW9uLCBVU0IgbWFwcyBhbmQgc2NyaXB0cyB3aWxsCitiZSBwbGFjZWQgaW4gL2V0Yy9ob3RwbHVnL3VzYiB0byBlbmFibGUgZnhsb2FkIHRvIGluaXRpYWxpemUgdGhlIEVaLVVTQgorY29udHJvbCBjaGlwIHdoZW4gdGhlIGRldmljZSBpcyBjb25uZWN0ZWQuCisKKworICAzLiBQQUwvU0VDQU0gVFVORVIgQ09ORklHVVJBVElPTiAoVFY0MDJVLUVVIG9ubHkpCisKKworVGhlIFBBTCBtb2RlbCBvZiB0aGUgUGxleHRvciBDb252ZXJ0WCBUVjQwMlUgbWF5IHJlcXVpcmUgYWRkaXRpb25hbAorY29uZmlndXJhdGlvbiB0byBjb3JyZWN0bHkgc2VsZWN0IHRoZSBhcHByb3ByaWF0ZSBUViBmcmVxdWVuY3kgYmFuZCBhbmQKK2F1ZGlvIHN1YmNoYW5uZWwuCisKK1VzZXJzIHdpdGggYSBkZXZpY2Ugb3RoZXIgdGhhbiB0aGUgUGxleHRvciBDb252ZXJ0WCBUVjQwMlUtRVUgc2hvdWxkIHNraXAKK3RoaXMgc2VjdGlvbi4KKworVGhlIHdpZGUgdmFyaWV0eSBvZiBQQUwgVFYgc3lzdGVtcyB1c2VkIGluIEV1cm9wZSByZXF1aXJlcyB0aGF0IGFkZGl0aW9uYWwKK2luZm9ybWF0aW9uIGFib3V0IHRoZSBsb2NhbCBUViBzdGFuZGFyZHMgYmUgcGFzc2VkIHRvIHRoZSBkcml2ZXIgaW4gb3JkZXIKK3RvIHByb3Blcmx5IHR1bmUgVFYgY2hhbm5lbHMuICBUaGUgdHdvIG5lY2Vzc2FyeSBwYXJhbWV0ZXJzIGFyZSAoYSkgdGhlIFBBTAorVFYgYmFuZCwgYW5kIChiKSB0aGUgYXVkaW8gc3ViY2hhbm5lbCBmb3JtYXQgaW4gdXNlLgorCitJbiBtYW55IGNhc2VzLCB0aGUgYXBwcm9wcmlhdGUgVFYgYmFuZCBzZWxlY3Rpb24gaXMgcGFzc2VkIHRvIHRoZSBkcml2ZXIKK2Zyb20gYXBwbGljYXRpb25zLiAgSG93ZXZlciwgaW4gc29tZSBjYXNlcywgdGhlIGFwcGxpY2F0aW9uIG9ubHkgc3BlY2lmaWVzCit0aGF0IHRoZSBkcml2ZXIgc2hvdWxkIHVzZSBQQUwgYnV0IG5vdCB0aGUgc3BlY2lmaWMgaW5mb3JtYXRpb24gYWJvdXQgdGhlCithcHByb3ByaWF0ZSBUViBiYW5kLiAgVG8gd29yayBhcm91bmQgdGhpcyBpc3N1ZSwgdGhlIGNvcnJlY3QgVFYgYmFuZCBtYXkgYmUKK3NwZWNpZmllZCBpbiB0aGUgImZvcmNlX2JhbmQiIHBhcmFtZXRlciB0byB0aGUgd2lzLXNvbnktdHVuZXIgbW9kdWxlOgorCisgICAgIFRWIGJhbmQgICAgICAgICAgIGZvcmNlX2JhbmQKKyAgICAgLS0tLS0tLSAgICAgICAgICAgLS0tLS0tLS0tLQorICAgICBQQUwgQi9HICAgICAgICAgICAgICAgIEIKKyAgICAgUEFMIEkgICAgICAgICAgICAgICAgICBJCisgICAgIFBBTCBEL0sgICAgICAgICAgICAgICAgRAorICAgICBTRUNBTSBMICAgICAgICAgICAgICAgIEwKKworSWYgdGhlICJmb3JjZV9iYW5kIiBwYXJhbWV0ZXIgaXMgc3BlY2lmaWVkLCB0aGUgZHJpdmVyIHdpbGwgaWdub3JlIGFueSBUVgorYmFuZCBzcGVjaWZpZWQgYnkgYXBwbGljYXRpb25zIGFuZCB3aWxsIGFsd2F5cyB1c2UgdGhlIGJhbmQgcHJvdmlkZWQgaW4gdGhlCittb2R1bGUgcGFyYW1ldGVyLgorCitUaGUgb3RoZXIgcGFyYW1ldGVyIHRoYXQgY2FuIGJlIHNwZWNpZmllZCBpcyB0aGUgYXVkaW8gc3ViY2hhbm5lbCBmb3JtYXQuCitUaGVyZSBhcmUgc2V2ZXJhbCBzdGVyZW8gYXVkaW8gY2FycmllciBzeXN0ZW1zIGluIHVzZSwgaW5jbHVkaW5nIE5JQ0FNIGFuZAordGhyZWUgdmFyaWV0aWVzIG9mIEEyLiAgVG8gcmVjZWl2ZSBhdWRpbyBicm9hZGNhc3Qgb24gb25lIG9mIHRoZXNlIHN0ZXJlbworY2FycmllcnMsIHRoZSAiZm9yY2VfbXB4X21vZGUiIHBhcmFtZXRlciBtdXN0IGJlIHNwZWNpZmllZCB0byB0aGUKK3dpcy1zb255LXR1bmVyIG1vZHVsZS4KKworICAgICBUViBiYW5kICAgICAgICAgICBBdWRpbyBzdWJjYXJyaWVyICAgICAgIGZvcmNlX21weF9tb2RlCisgICAgIC0tLS0tLS0gICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0gICAgICAgLS0tLS0tLS0tLS0tLS0KKyAgICAgUEFMIEIvRyAgICAgICAgICAgIE1vbm8gKGRlZmF1bHQpICAgICAgICAgICAgICAgMQorICAgICBQQUwgQi9HICAgICAgICAgICAgICAgICAgQTIgICAgICAgICAgICAgICAgICAgICAyCisgICAgIFBBTCBCL0cgICAgICAgICAgICAgICAgIE5JQ0FNICAgICAgICAgICAgICAgICAgIDMKKyAgICAgUEFMIEkgICAgICAgICAgICAgIE1vbm8gKGRlZmF1bHQpICAgICAgICAgICAgICAgNAorICAgICBQQUwgSSAgICAgICAgICAgICAgICAgICBOSUNBTSAgICAgICAgICAgICAgICAgICA1CisgICAgIFBBTCBEL0sgICAgICAgICAgICBNb25vIChkZWZhdWx0KSAgICAgICAgICAgICAgIDYKKyAgICAgUEFMIEQvSyAgICAgICAgICAgICAgICAgQTIgKDEpICAgICAgICAgICAgICAgICAgNworICAgICBQQUwgRC9LICAgICAgICAgICAgICAgICBBMiAoMikgICAgICAgICAgICAgICAgICA4CisgICAgIFBBTCBEL0sgICAgICAgICAgICAgICAgIEEyICgzKSAgICAgICAgICAgICAgICAgIDkKKyAgICAgUEFMIEQvSyAgICAgICAgICAgICAgICAgTklDQU0gICAgICAgICAgICAgICAgICAxMAorICAgICBTRUNBTSBMICAgICAgICAgICAgTW9ubyAoZGVmYXVsdCkgICAgICAgICAgICAgIDExCisgICAgIFNFQ0FNIEwgICAgICAgICAgICAgICAgIE5JQ0FNICAgICAgICAgICAgICAgICAgMTIKKworSWYgdGhlICJmb3JjZV9tcHhfbW9kZSIgcGFyYW1ldGVyIGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBjb3JyZWN0IG1vbm8tb25seQorbW9kZSB3aWxsIGJlIGNob3NlbiBiYXNlZCBvbiB0aGUgVFYgYmFuZC4gIEhvd2V2ZXIsIHRoZSB0dW5lciB3aWxsIG5vdAorcmVjZWl2ZSBzdGVyZW8gYXVkaW8gb3IgYmlsaW5ndWFsIGJyb2FkY2FzdHMgY29ycmVjdGx5LgorCitUbyBwYXNzIHRoZSAiZm9yY2VfYmFuZCIgb3IgImZvcmNlX21weF9tb2RlIiBwYXJhbWV0ZXJzIHRvIHRoZQord2lzLXNvbnktdHVuZXIgbW9kdWxlLCB0aGUgZm9sbG93aW5nIGxpbmUgbXVzdCBiZSBhZGRlZCB0byB0aGUgbW9kcHJvYmUKK2NvbmZpZ3VyYXRpb24gZmlsZSwgd2hpY2ggdmFyaWVzIGZyb20gb25lIExpbnV4IGRpc3RyaWJ1dGlvbiB0byBhbm90aGVyLgorCisgICAgIG9wdGlvbnMgd2lzLXNvbnktdHVuZXIgZm9yY2VfYmFuZD1CIGZvcmNlX21weF9tb2RlPTIKKworVGhlIGFib3ZlIGV4YW1wbGUgd291bGQgZm9yY2UgdGhlIHR1bmVyIHRvIHRoZSBQQUwgQi9HIFRWIGJhbmQgYW5kIHJlY2VpdmUKK3N0ZXJlbyBhdWRpbyBicm9hZGNhc3RzIG9uIHRoZSBBMiBjYXJyaWVyLgorCitUbyB2ZXJpZnkgdGhhdCB0aGUgY29uZmlndXJhdGlvbiBoYXMgYmVlbiBwbGFjZWQgaW4gdGhlIGNvcnJlY3QgbG9jYXRpb24sCitleGVjdXRlOgorCisgICAgICAgICQgbW9kcHJvYmUgLWMgfCBncmVwIHdpcy1zb255LXR1bmVyCisKK0lmIHRoZSBjb25maWd1cmF0aW9uIGxpbmUgYXBwZWFycywgdGhlbiBtb2Rwcm9iZSB3aWxsIHBhc3MgdGhlIHBhcmFtZXRlcnMKK2NvcnJlY3RseSB0aGUgbmV4dCB0aW1lIHRoZSB3aXMtc29ueS10dW5lciBtb2R1bGUgaXMgbG9hZGVkIGludG8gdGhlCitrZXJuZWwuCisKKworICA0LiBURVNUSU5HIFRIRSBEUklWRVIKKworCitCZWNhdXNlIGZldyBMaW51eCBhcHBsaWNhdGlvbnMgYXJlIGFibGUgdG8gY29ycmVjdGx5IGNhcHR1cmUgZnJvbQorVmlkZW80TGludXgyIGRldmljZXMgd2l0aCBvbmx5IGNvbXByZXNzZWQgZm9ybWF0cyBzdXBwb3J0ZWQsIHRoZSBuZXcgZHJpdmVyCitzaG91bGQgYmUgdGVzdGVkIHdpdGggdGhlICJnb3JlY29yZCIgYXBwbGljYXRpb24gaW4gdGhlIGFwcHMvIGRpcmVjdG9yeS4KKworRmlyc3QgY29ubmVjdCBhIHZpZGVvIHNvdXJjZSB0byB0aGUgZGV2aWNlLCBzdWNoIGFzIGEgRFZEIHBsYXllciBvciBWQ1IuCitUaGlzIHdpbGwgYmUgY2FwdHVyZWQgdG8gYSBmaWxlIGZvciB0ZXN0aW5nIHRoZSBkcml2ZXIuICBJZiBhbiBpbnB1dCBzb3VyY2UKK2lzIHVuYXZhaWxhYmxlLCBhIHRlc3QgZmlsZSBjYW4gc3RpbGwgYmUgY2FwdHVyZWQsIGJ1dCB0aGUgdmlkZW8gd2lsbCBiZQorYmxhY2sgYW5kIHRoZSBhdWRpbyB3aWxsIGJlIHNpbGVudC4KKworVGhpcyBhcHBsaWNhdGlvbiB3aWxsIGF1dG8tZGV0ZWN0IHRoZSBWNEwyIGFuZCBBTFNBL09TUyBkZXZpY2UgbmFtZXMgb2YgdGhlCitoYXJkd2FyZSBhbmQgd2lsbCByZWNvcmQgdmlkZW8gYW5kIGF1ZGlvIHRvIGFuIEFWSSBmaWxlIGZvciBhIHNwZWNpZmllZAorbnVtYmVyIG9mIHNlY29uZHMuICBGb3IgZXhhbXBsZToKKworICAgICAgICAkIGFwcHMvZ29yZWNvcmQgLWR1cmF0aW9uIDYwIGNhcHR1cmUuYXZpCisKK0lmIHRoaXMgYXBwbGljYXRpb24gZG9lcyBub3Qgc3VjY2Vzc2Z1bGx5IHJlY29yZCBhbiBBVkkgZmlsZSwgdGhlIGVycm9yCittZXNzYWdlcyBwcm9kdWNlZCBieSBnb3JlY29yZCBhbmQgcmVjb3JkZWQgaW4gdGhlIHN5c3RlbSBsb2cgKHVzdWFsbHkgaW4KKy92YXIvbG9nL21lc3NhZ2VzKSBzaG91bGQgcHJvdmlkZSBpbmZvcm1hdGlvbiB0byBoZWxwIHJlc29sdmUgdGhlIHByb2JsZW0uCisKK1N1cHBseWluZyBubyBwYXJhbWV0ZXJzIHRvIGdvcmVjb3JkIHdpbGwgY2F1c2UgaXQgdG8gcHJvYmUgdGhlIGF2YWlsYWJsZQorZGV2aWNlcyBhbmQgZXhpdC4gIFVzZSB0aGUgLWhlbHAgZmxhZyBmb3IgdXNhZ2UgaW5mb3JtYXRpb24uCisKKworICA1LiBVU0lORyBUSEUgRFJJVkVSCisKKworVGhlIFY0TDIgZGV2aWNlIGltcGxlbWVudGVkIGJ5IHRoZSBkcml2ZXIgcHJvdmlkZXMgYSBzdGFuZGFyZCBjb21wcmVzc2VkCitmb3JtYXQgQVBJLCB3aXRoaW4gdGhlIGZvbGxvd2luZyBjcml0ZXJpYToKKworICAqIEFwcGxpY2F0aW9ucyB0aGF0IG9ubHkgc3VwcG9ydCB0aGUgb3JpZ2luYWwgVmlkZW80TGludXgxIEFQSSB3aWxsIG5vdAorICAgIGJlIGFibGUgdG8gY29tbXVuaWNhdGUgd2l0aCB0aGlzIGRyaXZlciBhdCBhbGwuCisKKyAgKiBObyByYXcgdmlkZW8gbW9kZXMgYXJlIHN1cHBvcnRlZCwgc28gYXBwbGljYXRpb25zIGxpa2UgeGF3dHYgdGhhdAorICAgIGV4cGVjdCBvbmx5IHVuY29tcHJlc3NlZCB2aWRlbyB3aWxsIG5vdCBmdW5jdGlvbi4KKworICAqIFN1cHBvcnRlZCBjb21wcmVzc2lvbiBmb3JtYXRzIGFyZTogTW90aW9uLUpQRUcsIE1QRUcxLCBNUEVHMiBhbmQgTVBFRzQuCisKKyAgKiBNUEVHIHZpZGVvIGZvcm1hdHMgYXJlIGRlbGl2ZXJlZCBhcyBWaWRlbyBFbGVtZW50YXJ5IFN0cmVhbXMgb25seS4KKyAgICBQcm9ncmFtIFN0cmVhbSAoUFMpLCBUcmFuc3BvcnQgU3RyZWFtIChUUykgYW5kIFBhY2tldGl6ZWQgRWxlbWVudGFyeQorICAgIFN0cmVhbSAoUEVTKSBmb3JtYXRzIGFyZSBub3Qgc3VwcG9ydGVkLgorCisgICogVmlkZW8gcGFyYW1ldGVycyBzdWNoIGFzIGZvcm1hdCBhbmQgaW5wdXQgcG9ydCBtYXkgbm90IGJlIGNoYW5nZWQgd2hpbGUKKyAgICB0aGUgZW5jb2RlciBpcyBhY3RpdmUuCisKKyAgKiBUaGUgYXVkaW8gY2FwdHVyZSBkZXZpY2Ugb25seSBmdW5jdGlvbnMgd2hlbiB0aGUgdmlkZW8gZW5jb2RlciBpcworICAgIGFjdGl2ZWx5IGNhcHR1cmluZyB2aWRlby4gIEF0dGVtcHRzIHRvIHJlYWQgZnJvbSB0aGUgYXVkaW8gZGV2aWNlIHdoZW4KKyAgICB0aGUgZW5jb2RlciBpcyBpbmFjdGl2ZSB3aWxsIHJlc3VsdCBpbiBhbiBJL08gZXJyb3IuCisKKyAgKiBUaGUgbmF0aXZlIGZvcm1hdCBvZiB0aGUgYXVkaW8gZGV2aWNlIGlzIDQ4S2h6IDItY2hhbm5lbCAxNi1iaXQKKyAgICBsaXR0bGUtZW5kaWFuIFBDTSwgZGVsaXZlcmVkIHRocm91Z2ggdGhlIEFMU0Egc3lzdGVtLiAgTm8gYXVkaW8KKyAgICBjb21wcmVzc2lvbiBpcyBpbXBsZW1lbnRlZCBpbiB0aGUgaGFyZHdhcmUuICBBTFNBIG1heSBjb252ZXJ0IHRvIG90aGVyCisgICAgdW5jb21wcmVzc2VkIGZvcm1hdHMgb24gdGhlIGZseS4KKworVGhlIGluY2x1ZGUvIGRpcmVjdG9yeSBjb250YWlucyBhIEMgaGVhZGVyIGZpbGUgZGVzY3JpYmluZyBub24tc3RhbmRhcmQKK2ZlYXR1cmVzIG9mIHRoZSBHTzcwMDdTQiBlbmNvZGVyLCB3aGljaCBhcmUgZGVzY3JpYmVkIGJlbG93OgorCisKKyAgR083MDA3SU9DX1NfQ09NUF9QQVJBTVMsIEdPNzAwN0lPQ19HX0NPTVBfUEFSQU1TCisKKyAgICBUaGVzZSBpb2N0bHMgYXJlIHVzZWQgdG8gbmVnb3RpYXRlIGdlbmVyYWwgY29tcHJlc3Npb24gcGFyYW1ldGVycy4KKworICAgIFRvIHF1ZXJ5IHRoZSBjdXJyZW50IHBhcmFtZXRlcnMsIGNhbGwgdGhlIEdPNzAwN0lPQ19HX0NPTVBfUEFSQU1TIGlvY3RsCisgICAgd2l0aCBhIHBvaW50ZXIgdG8gYSBzdHJ1Y3QgZ283MDA3X2NvbXBfcGFyYW1zLiAgSWYgdGhlIGRyaXZlciBpcyBub3QKKyAgICBzZXQgdG8gTVBFRyBmb3JtYXQsIHRoZSBFSU5WQUwgZXJyb3IgY29kZSB3aWxsIGJlIHJldHVybmVkLgorCisgICAgVG8gY2hhbmdlIHRoZSBjdXJyZW50IHBhcmFtZXRlcnMsIGluaXRpYWxpemUgYWxsIGZpZWxkcyBvZiBhIHN0cnVjdAorICAgIGdvNzAwN19jb21wX3BhcmFtcyBhbmQgY2FsbCB0aGUgR083MDA3X0lPQ19TX0NPTVBfUEFSQU1TIGlvY3RsIHdpdGggYQorICAgIHBvaW50ZXIgdG8gdGhpcyBzdHJ1Y3R1cmUuICBUaGUgZHJpdmVyIHdpbGwgcmV0dXJuIHRoZSBjdXJyZW50CisgICAgcGFyYW1ldGVycyB3aXRoIGFueSBuZWNlc3NhcnkgY2hhbmdlcyB0byBjb25mb3JtIHRvIHRoZSBsaW1pdGF0aW9ucyBvZgorICAgIHRoZSBoYXJkd2FyZSBvciBjdXJyZW50IGNvbXByZXNzaW9uIG1vZGUuICBBbnkgb3IgYWxsIGZpZWxkcyBjYW4gYmUgc2V0CisgICAgdG8gemVybyB0byByZXF1ZXN0IGEgcmVhc29uYWJsZSBkZWZhdWx0IHZhbHVlLiAgSWYgdGhlIGRyaXZlciBpcyBub3QKKyAgICBzZXQgdG8gTVBFRyBmb3JtYXQsIHRoZSBFSU5WQUwgZXJyb3IgY29kZSB3aWxsIGJlIHJldHVybmVkLiAgV2hlbiBJL08KKyAgICBpcyBpbiBwcm9ncmVzcywgdGhlIEVCVVNZIGVycm9yIGNvZGUgd2lsbCBiZSByZXR1cm5lZC4KKworICAgIEZpZWxkcyBpbiBzdHJ1Y3QgZ283MDA3X2NvbXBfcGFyYW1zOgorCisgICAgICAgIF9fdTMyICAgICAgICAgICAgICAgICAgICAgICAgVGhlIG1heGltdW0gbnVtYmVyIG9mIGZyYW1lcyBpbiBlYWNoCisgICAgICAgICAgZ29wX3NpemUgICAgICAgICAgICAgICAgICAgR3JvdXAgT2YgUGljdHVyZXM7IGkuZS4gdGhlIG1heGltdW0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1iZXIgb2YgZnJhbWVzIG1pbnVzIG9uZSBiZXR3ZWVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWFjaCBrZXkgZnJhbWUuCisKKyAgICAgICAgX191MzIgICAgICAgICAgICAgICAgICAgICAgICBUaGUgbWF4aW11bSBudW1iZXIgb2Ygc2VxdWVudGlhbAorICAgICAgICAgIG1heF9iX2ZyYW1lcyAgICAgICAgICAgICAgIGJpZGlyZWN0aW9uYWxseS1wcmVkaWN0ZWQgZnJhbWVzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCLWZyYW1lcyBhcmUgbm90IHlldCBzdXBwb3J0ZWQuKQorCisgICAgICAgIGVudW0gZ283MDA3X2FzcGVjdF9yYXRpbyAgICAgVGhlIGFzcGVjdCByYXRpbyB0byBiZSBlbmNvZGVkIGluIHRoZQorICAgICAgICAgIGFzcGVjdF9yYXRpbyAgICAgICAgICAgICAgIG1ldGEtZGF0YSBvZiB0aGUgY29tcHJlc3NlZCBmb3JtYXQuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaG9pY2VzIGFyZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTzcwMDdfQVNQRUNUX1JBVElPXzFfMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdPNzAwN19BU1BFQ1RfUkFUSU9fNF8zX05UU0MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTzcwMDdfQVNQRUNUX1JBVElPXzRfM19QQUwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTzcwMDdfQVNQRUNUX1JBVElPXzE2XzlfTlRTQworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdPNzAwN19BU1BFQ1RfUkFUSU9fMTZfOV9QQUwKKworICAgICAgICBfX3UzMiAgICAgICAgICAgICAgICAgICAgICAgIEJpdC13aXNlIE9SIG9mIGNvbnRyb2wgZmxhZ3MgKGJlbG93KQorICAgICAgICAgIGZsYWdzCisKKyAgICBGbGFncyBpbiBzdHJ1Y3QgZ283MDA3X2NvbXBfcGFyYW1zOgorCisgICAgICAgIEdPNzAwN19DT01QX0NMT1NFRF9HT1AgICAgICAgT25seSBwcm9kdWNlIHNlbGYtY29udGFpbmVkIEdPUHMsIHVzZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBwcm9kdWNlIHN0cmVhbXMgYXBwcm9wcmlhdGUgZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZG9tIHNlZWtpbmcuCisKKyAgICAgICAgR083MDA3X0NPTVBfT01JVF9TRVFfSEVBREVSICBPbWl0IHRoZSBzdHJlYW0gc2VxdWVuY2UgaGVhZGVyLgorCisKKyAgR083MDA3SU9DX1NfTVBFR19QQVJBTVMsIEdPNzAwN0lPQ19HX01QRUdfUEFSQU1TCisKKyAgICBUaGVzZSBpb2N0bHMgYXJlIHVzZWQgdG8gbmVnb3RpYXRlIE1QRUctc3BlY2lmaWMgc3RyZWFtIHBhcmFtZXRlcnMgd2hlbgorICAgIHRoZSBwaXhlbGZvcm1hdCBoYXMgYmVlbiBzZXQgdG8gVjRMMl9QSVhfRk1UX01QRUcuCisKKyAgICBUbyBxdWVyeSB0aGUgY3VycmVudCBwYXJhbWV0ZXJzLCBjYWxsIHRoZSBHTzcwMDdJT0NfR19NUEVHX1BBUkFNUyBpb2N0bAorICAgIHdpdGggYSBwb2ludGVyIHRvIGEgc3RydWN0IGdvNzAwN19tcGVnX3BhcmFtcy4gIElmIHRoZSBkcml2ZXIgaXMgbm90CisgICAgc2V0IHRvIE1QRUcgZm9ybWF0LCB0aGUgRUlOVkFMIGVycm9yIGNvZGUgd2lsbCBiZSByZXR1cm5lZC4KKworICAgIFRvIGNoYW5nZSB0aGUgY3VycmVudCBwYXJhbWV0ZXJzLCBpbml0aWFsaXplIGFsbCBmaWVsZHMgb2YgYSBzdHJ1Y3QKKyAgICBnbzcwMDdfbXBlZ19wYXJhbXMgYW5kIGNhbGwgdGhlIEdPNzAwN19JT0NfU19NUEVHX1BBUkFNUyBpb2N0bCB3aXRoIGEKKyAgICBwb2ludGVyIHRvIHRoaXMgc3RydWN0dXJlLiAgVGhlIGRyaXZlciB3aWxsIHJldHVybiB0aGUgY3VycmVudAorICAgIHBhcmFtZXRlcnMgd2l0aCBhbnkgbmVjZXNzYXJ5IGNoYW5nZXMgdG8gY29uZm9ybSB0byB0aGUgbGltaXRhdGlvbnMgb2YKKyAgICB0aGUgaGFyZHdhcmUgb3Igc2VsZWN0ZWQgTVBFRyBtb2RlLiAgQW55IG9yIGFsbCBmaWVsZHMgY2FuIGJlIHNldCB0bworICAgIHplcm8gdG8gcmVxdWVzdCBhIHJlYXNvbmFibGUgZGVmYXVsdCB2YWx1ZS4gIElmIHRoZSBkcml2ZXIgaXMgbm90IHNldAorICAgIHRvIE1QRUcgZm9ybWF0LCB0aGUgRUlOVkFMIGVycm9yIGNvZGUgd2lsbCBiZSByZXR1cm5lZC4gIFdoZW4gSS9PIGlzIGluCisgICAgcHJvZ3Jlc3MsIHRoZSBFQlVTWSBlcnJvciBjb2RlIHdpbGwgYmUgcmV0dXJuZWQuCisKKyAgICBGaWVsZHMgaW4gc3RydWN0IGdvNzAwN19tcGVnX3BhcmFtczoKKworICAgICAgICBlbnVtIGdvNzAwN19tcGVnX3ZpZGVvX3N0YW5kYXJkCisgICAgICAgICAgbXBlZ192aWRlb19zdGFuZGFyZCAgICAgICAgVGhlIE1QRUcgdmlkZW8gc3RhbmRhcmQgaW4gd2hpY2ggdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wcmVzcyB0aGUgdmlkZW8uCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaG9pY2VzIGFyZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTzcwMDdfTVBFR19WSURFT19NUEVHMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdPNzAwN19NUEVHX1ZJREVPX01QRUcyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR083MDA3X01QRUdfVklERU9fTVBFRzQKKworICAgICAgICBfX3UzMiAgICAgICAgICAgICAgICAgICAgICAgIEJpdC13aXNlIE9SIG9mIGNvbnRyb2wgZmxhZ3MgKGJlbG93KQorICAgICAgICAgIGZsYWdzCisKKyAgICAgICAgX191MzIgICAgICAgICAgICAgICAgICAgICAgICBUaGUgcHJvZmlsZSBhbmQgbGV2ZWwgaW5kaWNhdGlvbiB0byBiZQorICAgICAgICAgIHBhbGkgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlZCBpbiB0aGUgc2VxdWVuY2UgaGVhZGVyLiAgVGhpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIG9ubHkgdXNlZCBhcyBhbiBpbmRpY2F0b3IgdG8gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlciwgYW5kIGRvZXMgbm90IGFmZmVjdCB0aGUgTVBFRworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmVzIHVzZWQgaW4gdGhlIHZpZGVvIHN0cmVhbS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3QgdmFsaWQgZm9yIE1QRUcxLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hvaWNlcyBmb3IgTVBFRzIgYXJlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdPNzAwN19NUEVHMl9QUk9GSUxFX01BSU5fTUFJTgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hvaWNlcyBmb3IgTVBFRzQgYXJlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdPNzAwN19NUEVHNF9QUk9GSUxFX1NfTDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTzcwMDdfTVBFRzRfUFJPRklMRV9TX0wxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR083MDA3X01QRUc0X1BST0ZJTEVfU19MMgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdPNzAwN19NUEVHNF9QUk9GSUxFX1NfTDMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTzcwMDdfTVBFRzRfUFJPRklMRV9BUlRTX0wxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR083MDA3X01QRUc0X1BST0ZJTEVfQVJUU19MMgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdPNzAwN19NUEVHNF9QUk9GSUxFX0FSVFNfTDMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTzcwMDdfTVBFRzRfUFJPRklMRV9BUlRTX0w0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR083MDA3X01QRUc0X1BST0ZJTEVfQVNfTDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTzcwMDdfTVBFRzRfUFJPRklMRV9BU19MMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdPNzAwN19NUEVHNF9QUk9GSUxFX0FTX0wyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR083MDA3X01QRUc0X1BST0ZJTEVfQVNfTDMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTzcwMDdfTVBFRzRfUFJPRklMRV9BU19MNAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdPNzAwN19NUEVHNF9QUk9GSUxFX0FTX0w1CisKKyAgICBGbGFncyBpbiBzdHJ1Y3QgZ283MDA3X21wZWdfcGFyYW1zOgorCisgICAgICAgIEdPNzAwN19NUEVHX0ZPUkNFX0RWRF9NT0RFICAgRm9yY2UgYWxsIGNvbXByZXNzaW9uIHBhcmFtZXRlcnMgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0cmF0ZSBjb250cm9sIHNldHRpbmdzIHRvIGNvbXBseQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggRFZEIE1QRUcyIHN0cmVhbSByZXF1aXJlbWVudHMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBvdmVycmlkZXMgbW9zdCBjb21wcmVzc2lvbiBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRyYXRlIHNldHRpbmdzIQorCisgICAgICAgIEdPNzAwN19NUEVHX09NSVRfR09QX0hFQURFUiAgT21pdCB0aGUgR09QIGhlYWRlci4KKworICAgICAgICBHTzcwMDdfTVBFR19SRVBFQVRfU0VRSEVBREVSIFJlcGVhdCB0aGUgTVBFRyBzZXF1ZW5jZSBoZWFkZXIgYXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgc3RhcnQgb2YgZWFjaCBHT1AuCisKKworICBHTzcwMDdJT0NfU19CSVRSQVRFLCBHTzcwMDdJT0NfR19CSVRSQVRFCisKKyAgICBUaGVzZSBpb2N0bHMgYXJlIHVzZWQgdG8gc2V0IGFuZCBxdWVyeSB0aGUgdGFyZ2V0IGJpdHJhdGUgdmFsdWUgZm9yIHRoZQorICAgIGNvbXByZXNzZWQgdmlkZW8gc3RyZWFtLiAgVGhlIGJpdHJhdGUgbWF5IGJlIHNlbGVjdGVkIGJ5IHN0b3JpbmcgdGhlCisgICAgdGFyZ2V0IGJpdHMgcGVyIHNlY29uZCBpbiBhbiBpbnQgYW5kIGNhbGxpbmcgR083MDA3SU9DX1NfQklUUkFURSB3aXRoIGEKKyAgICBwb2ludGVyIHRvIHRoZSBpbnQuICBUaGUgYml0cmF0ZSBtYXkgYmUgcXVlcmllZCBieSBjYWxsaW5nCisgICAgR083MDA3SU9DX0dfQklUUkFURSB3aXRoIGEgcG9pbnRlciB0byBhbiBpbnQgd2hlcmUgdGhlIGN1cnJlbnQgYml0cmF0ZQorICAgIHdpbGwgYmUgc3RvcmVkLgorCisgICAgTm90ZSB0aGF0IHRoaXMgaXMgdGhlIHByaW1hcnkgbWVhbnMgb2YgY29udHJvbGxpbmcgdGhlIHZpZGVvIHF1YWxpdHkKKyAgICBmb3IgYWxsIGNvbXByZXNzaW9uIG1vZGVzLCBpbmNsdWRpbmcgVjRMMl9QSVhfRk1UX01KUEVHLiAgVGhlCisgICAgVklESU9DX1NfSlBFR0NPTVAgaW9jdGwgaXMgbm90IHN1cHBvcnRlZC4KKworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgICAgICAgICAgSW5zdGFsbGluZyB0aGUgV0lTIFBDSSBWb3lhZ2VyIERyaXZlcgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBXSVMgUENJIFZveWFnZXIgZHJpdmVyIHJlcXVpcmVzIHNldmVyYWwgcGF0Y2hlcyB0byB0aGUgTGludXggMi42LjExLngKK2tlcm5lbCBzb3VyY2UgdHJlZSBiZWZvcmUgY29tcGlsaW5nIHRoZSBkcml2ZXIuICBUaGVzZSBwYXRjaGVzIHVwZGF0ZSB0aGUKK2luLWtlcm5lbCBTQUE3MTM0IGRyaXZlciB0byB0aGUgbmV3ZXN0IGRldmVsb3BtZW50IHZlcnNpb24gYW5kIHBhdGNoIGJ1Z3MKK2luIHRoZSBUREE4MjkwL1REQTgyNzUgdHVuZXIgZHJpdmVyLgorCitUaGUgZm9sbG93aW5nIHBhdGNoZXMgbXVzdCBiZSBkb3dubG9hZGVkIGZyb20gR2VyZCBLbm9ycidzIHdlYnNpdGUgYW5kCithcHBsaWVkIGluIHRoZSBvcmRlciBsaXN0ZWQ6CisKKwlodHRwOi8vZGwuYnl0ZXNleC5vcmcvcGF0Y2hlcy8yLjYuMTEtMi9pMmMtdHVuZXIKKwlodHRwOi8vZGwuYnl0ZXNleC5vcmcvcGF0Y2hlcy8yLjYuMTEtMi9pMmMtdHVuZXIyCisJaHR0cDovL2RsLmJ5dGVzZXgub3JnL3BhdGNoZXMvMi42LjExLTIvdjRsMi1hcGktbXBlZworCWh0dHA6Ly9kbC5ieXRlc2V4Lm9yZy9wYXRjaGVzLzIuNi4xMS0yL3NhYTcxMzQtdXBkYXRlCisKK1RoZSBmb2xsb3dpbmcgcGF0Y2hlcyBhcmUgaW5jbHVkZWQgd2l0aCB0aGlzIFNESyBhbmQgY2FuIGJlIGFwcGxpZWQgaW4gYW55CitvcmRlcjoKKworCXBhdGNoZXMvMi42LjExL3NhYTcxMzQtdm95YWdlci5kaWZmCisJcGF0Y2hlcy8yLjYuMTEvdGRhODI3NS1uZXdhZGRyLmRpZmYKKwlwYXRjaGVzLzIuNi4xMS90ZGE4MjkwLW50c2MuZGlmZgorCitDaGVjayB0byBtYWtlIHN1cmUgdGhlIENPTkZJR19WSURFT19TQUE3MTM0IG9wdGlvbiBpcyBlbmFibGVkIGluIHRoZSBrZXJuZWwKK2NvbmZpZ3VyYXRpb24sIGFuZCBidWlsZCBhbmQgaW5zdGFsbCB0aGUga2VybmVsLgorCitBZnRlciByZWJvb3RpbmcgaW50byB0aGUgbmV3IGtlcm5lbCwgdGhlIEdPNzAwNyBkcml2ZXIgY2FuIGJlIGNvbXBpbGVkIGFuZAoraW5zdGFsbGVkOgorCisJJCBtYWtlIFNBQTcxMzRfQlVJTEQ9eQorCSQgbWFrZSBpbnN0YWxsCisJJCBtb2Rwcm9iZSBzYWE3MTM0LWdvNzAwNworCitUaGVyZSB3aWxsIGJlIHR3byBWNEwgdmlkZW8gZGV2aWNlcyBhc3NvY2lhdGVkIHdpdGggdGhlIFBDSSBWb3lhZ2VyLiAgVGhlCitmaXJzdCBkZXZpY2UgKG1vc3QgbGlrZWx5IC9kZXYvdmlkZW8wKSBwcm92aWRlcyBhY2Nlc3MgdG8gdGhlIHJhdyB2aWRlbworY2FwdHVyZSBtb2RlIG9mIHRoZSBTQUE3MTMzIGRldmljZSBhbmQgaXMgdXNlZCB0byBjb25maWd1cmUgdGhlIHNvdXJjZQordmlkZW8gcGFyYW1ldGVycyBhbmQgdHVuZSB0aGUgVFYgdHVuZXIuICBUaGlzIGRldmljZSBjYW4gYmUgdXNlZCB3aXRoIHhhd3R2CitvciBvdGhlciBWNEwoMikgdmlkZW8gc29mdHdhcmUgYXMgYSBzdGFuZGFyZCB1bmNvbXByZXNzZWQgZGV2aWNlLgorCitUaGUgc2Vjb25kIGRldmljZSAobW9zdCBsaWtlbHkgL2Rldi92aWRlbzEpIHByb3ZpZGVzIGFjY2VzcyB0byB0aGUKK2NvbXByZXNzaW9uIGZ1bmN0aW9ucyBvZiB0aGUgR083MDA3LiAgSXQgY2FuIGJlIHRlc3RlZCB1c2luZyB0aGUgZ29yZWNvcmQKK2FwcGxpY2F0aW9uIGluIHRoZSBhcHBzLyBkaXJlY3Rvcnkgb2YgdGhpcyBTREs6CisKKwkkIGFwcHMvZ29yZWNvcmQgLXZkZXZpY2UgL2Rldi92aWRlbzEgLW5vYXVkaW8gdGVzdC5hdmkKKworQ3VycmVudGx5IHRoZSBmcmFtZSByZXNvbHV0aW9uIGlzIGZpeGVkIGF0IDcyMHg0ODAgKE5UU0MpIG9yIDcyMHg1NzYgKFBBTCksCithbmQgdGhlIHZpZGVvIHN0YW5kYXJkIG11c3QgYmUgc3BlY2lmaWVkIHRvIGJvdGggdGhlIHJhdyBhbmQgdGhlIGNvbXByZXNzZWQKK3ZpZGVvIGRldmljZXMgKHhhd3R2IGFuZCBnb3JlY29yZCwgZm9yIGV4YW1wbGUpLgorCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitSRUxFQVNFIE5PVEVTIEZPUiBXSVMgR083MDA3U0IgTElOVVggRFJJVkVSCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTGFzdCB1cGRhdGVkOiA1IE5vdmVtYmVyIDIwMDUKKworIC0gUmVsZWFzZSAwLjkuNyBpbmNsdWRlcyBuZXcgc3VwcG9ydCBmb3IgdXNpbmcgdWRldiB0byBydW4gZnhsb2FkLiAgVGhlCisgICBpbnN0YWxsIHNjcmlwdCBzaG91bGQgYXV0b21hdGljYWxseSBkZXRlY3Qgd2hldGhlciB0aGUgb2xkIGhvdHBsdWcKKyAgIHNjcmlwdHMgb3IgdGhlIG5ldyB1ZGV2IHJ1bGVzIHNob3VsZCBiZSB1c2VkLiAgVG8gZm9yY2UgdGhlIHVzZSBvZgorICAgaG90cGx1ZywgcnVuICJtYWtlIGluc3RhbGwgVVNFX1VERVY9biIuICBUbyBmb3JjZSB0aGUgdXNlIG9mIHVkZXYsIHJ1bgorICAgIm1ha2UgaW5zdGFsbCBVU0VfVURFVj15Ii4KKworIC0gTW90aW9uIGRldGVjdGlvbiBpcyBzdXBwb3J0ZWQgYnV0IHVuZG9jdW1lbnRlZC4gIFRyeSB0aGUgYG1vZGV0YCBhcHAKKyAgIGZvciBhIGRlbW9uc3RyYXRpb24gb2YgaG93IHRvIHVzZSB0aGUgZmFjaWxpdHkuCisKKyAtIFVzaW5nIFVTQjIuMCBkZXZpY2VzIHN1Y2ggYXMgdGhlIFRWNDAyVSB3aXRoIFVTQjEuMSBIQ0RzIG9yIGh1YnMgY2FuCisgICBjYXVzZSBidWZmZXIgb3ZlcnJ1bnMgYW5kIGZyYW1lIGRyb3BzLCBldmVuIGF0IGxvdyBmcmFtZXJhdGVzLCBkdWUgdG8KKyAgIGluY29uc2lzdGVuY3kgaW4gdGhlIGJpdHJhdGUgY29udHJvbCBtZWNoYW5pc20uCisKKyAtIE9uIGRldmljZXMgd2l0aCBhbiBTQUE3MTE1LCBpbmNsdWRpbmcgdGhlIFBsZXh0b3IgQ29udmVydFgsIHZpZGVvIGhlaWdodAorICAgdmFsdWVzIG9mIDk2LCAxMjgsIDE2MCwgMTkyLCAyNTYsIDMyMCwgYW5kIDM4NCBkbyBub3Qgd29yayBpbiBOVFNDIG1vZGUuCisgICBBbGwgdmFsaWQgaGVpZ2h0cyB1cCB0byA1MTIgd29yayBjb3JyZWN0bHkgaW4gUEFMIG1vZGUuCisKKyAtIFRoZSBXSVMgU3RhciBUcmVrIGFuZCBQQ0kgVm95YWdlciBib2FyZHMgaGF2ZSBubyBzdXBwb3J0IHlldCBmb3IgYXVkaW8KKyAgIG9yIHRoZSBUViB0dW5lci4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9nbzcwMDcvczIyNTAtYm9hcmQuYyBiL2RyaXZlcnMvc3RhZ2luZy9nbzcwMDcvczIyNTAtYm9hcmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjY4NDVlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2dvNzAwNy9zMjI1MC1ib2FyZC5jCkBAIC0wLDAgKzEsNjMwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFNlbnNvcmF5IENvbXBhbnkgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChWZXJzaW9uIDIpIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvdXNiLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KKyNpbmNsdWRlICJnbzcwMDctcHJpdi5oIgorI2luY2x1ZGUgIndpcy1pMmMuaCIKKworZXh0ZXJuIGludCBzMjI1MGxvYWRlcl9pbml0KHZvaWQpOworZXh0ZXJuIHZvaWQgczIyNTBsb2FkZXJfY2xlYW51cCh2b2lkKTsKKworI2RlZmluZSBUTFYzMjBfQUREUkVTUyAgICAgIDB4MzQKKyNkZWZpbmUgUzIyNTBfVklEREVDICAgICAgICAweDg2CisjZGVmaW5lIFZQWDMyMl9BRERSX0FOQUxPR0NPTlRST0wxCTB4MDIKKyNkZWZpbmUgVlBYMzIyX0FERFJfQlJJR0hUTkVTUzAJCTB4MDEyNworI2RlZmluZSBWUFgzMjJfQUREUl9CUklHSFRORVNTMQkJMHgwMTMxCisjZGVmaW5lIFZQWDMyMl9BRERSX0NPTlRSQVNUMAkJMHgwMTI4CisjZGVmaW5lIFZQWDMyMl9BRERSX0NPTlRSQVNUMQkJMHgwMTMyCisjZGVmaW5lIFZQWDMyMl9BRERSX0hVRQkJCTB4MDBkYworI2RlZmluZSBWUFgzMjJfQUREUl9TQVQJIAkgICAgICAgIDB4MDAzMAorCitzdHJ1Y3QgZ283MDA3X3VzYl9ib2FyZCB7CisJdW5zaWduZWQgaW50IGZsYWdzOworCXN0cnVjdCBnbzcwMDdfYm9hcmRfaW5mbyBtYWluX2luZm87Cit9OworCitzdHJ1Y3QgZ283MDA3X3VzYiB7CisJc3RydWN0IGdvNzAwN191c2JfYm9hcmQgKmJvYXJkOworCXN0cnVjdCBzZW1hcGhvcmUgaTJjX2xvY2s7CisJc3RydWN0IHVzYl9kZXZpY2UgKnVzYmRldjsKKwlzdHJ1Y3QgdXJiICp2aWRlb191cmJzWzhdOworCXN0cnVjdCB1cmIgKmF1ZGlvX3VyYnNbOF07CisJc3RydWN0IHVyYiAqaW50cl91cmI7Cit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBhdWRfcmVnc1tdID0geworCTB4MWUsIDB4MDAsCisJMHgwMCwgMHgxNywKKwkweDAyLCAweDE3LAorCTB4MDQsIDB4ZjksCisJMHgwNiwgMHhmOSwKKwkweDA4LCAweDAyLAorCTB4MGEsIDB4MDAsCisJMHgwYywgMHgwMCwKKwkweDBhLCAweDAwLAorCTB4MGMsIDB4MDAsCisJMHgwZSwgMHgwMiwKKwkweDEwLCAweDAwLAorCTB4MTIsIDB4MDEsCisJMHgwMCwgMHgwMCwKK307CisKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdmlkX3JlZ3NbXSA9IHsKKwkweEYyLCAweDBmLAorCTB4QUEsIDB4MDAsCisJMHhGOCwgMHhmZiwKKwkweDAwLCAweDAwLAorfTsKKworc3RhdGljIHUxNiB2aWRfcmVnc19mcFtdID0geworCTB4MDI4LCAweDA2NywKKwkweDEyMCwgMHgwMTYsCisJMHgxMjEsIDB4Y0YyLAorCTB4MTIyLCAweDBGMiwKKwkweDEyMywgMHgwMGMsCisJMHgxMjQsIDB4MmQwLAorCTB4MTI1LCAweDJlMCwKKwkweDEyNiwgMHgwMDQsCisJMHgxMjgsIDB4MUUwLAorCTB4MTJBLCAweDAxNiwKKwkweDEyQiwgMHgwRjIsCisJMHgxMkMsIDB4MEYyLAorCTB4MTJELCAweDAwYywKKwkweDEyRSwgMHgyZDAsCisJMHgxMkYsIDB4MmUwLAorCTB4MTMwLCAweDAwNCwKKwkweDEzMiwgMHgxRTAsCisJMHgxNDAsIDB4MDYwLAorCTB4MTUzLCAweDAwQywKKwkweDE1NCwgMHgyMDAsCisJMHgxNTAsIDB4ODAxLAorCTB4MDAwLCAweDAwMAorfTsKKworLyogUEFMIHNwZWNpZmljIHZhbHVlcyAqLworc3RhdGljIHUxNiB2aWRfcmVnc19mcF9wYWxbXSA9Cit7CisJMHgxMjAsIDB4MDE3LAorCTB4MTIxLCAweGQyMiwKKwkweDEyMiwgMHgxMjIsCisJMHgxMkEsIDB4MDE3LAorCTB4MTJCLCAweDEyMiwKKwkweDEyQywgMHgxMjIsCisJMHgxNDAsIDB4MDYwLAorCTB4MDAwLCAweDAwMCwKK307CisKK3N0cnVjdCBzMjI1MCB7CisJaW50IHN0ZDsKKwlpbnQgaW5wdXQ7CisJaW50IGJyaWdodG5lc3M7CisJaW50IGNvbnRyYXN0OworCWludCBzYXR1cmF0aW9uOworCWludCBodWU7CisJaW50IHJlZzEyYl92YWw7CisJaW50IGF1ZGlvX2lucHV0OworfTsKKworLyogZnJvbSBnbzcwMDctdXNiLmMgd2hpY2ggaXMgQ29weXJpZ2h0IChDKSAyMDA1LTIwMDYgTWljcm9uYXMgVVNBIEluYy4qLworc3RhdGljIGludCBnbzcwMDdfdXNiX3ZlbmRvcl9yZXF1ZXN0KHN0cnVjdCBnbzcwMDcgKmdvLCB1MTYgcmVxdWVzdCwKKwl1MTYgdmFsdWUsIHUxNiBpbmRleCwgdm9pZCAqdHJhbnNmZXJfYnVmZmVyLCBpbnQgbGVuZ3RoLCBpbnQgaW4pCit7CisJc3RydWN0IGdvNzAwN191c2IgKnVzYiA9IGdvLT5ocGlfY29udGV4dDsKKwlpbnQgdGltZW91dCA9IDUwMDA7CisKKwlpZiAoaW4pIHsKKwkJcmV0dXJuIHVzYl9jb250cm9sX21zZyh1c2ItPnVzYmRldiwKKwkJCQl1c2JfcmN2Y3RybHBpcGUodXNiLT51c2JkZXYsIDApLCByZXF1ZXN0LAorCQkJCVVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9SRUNJUF9ERVZJQ0UgfCBVU0JfRElSX0lOLAorCQkJCXZhbHVlLCBpbmRleCwgdHJhbnNmZXJfYnVmZmVyLCBsZW5ndGgsIHRpbWVvdXQpOworCX0gZWxzZSB7CisJCXJldHVybiB1c2JfY29udHJvbF9tc2codXNiLT51c2JkZXYsCisJCQkJdXNiX3NuZGN0cmxwaXBlKHVzYi0+dXNiZGV2LCAwKSwgcmVxdWVzdCwKKwkJCQlVU0JfVFlQRV9WRU5ET1IgfCBVU0JfUkVDSVBfREVWSUNFLAorCQkJCXZhbHVlLCBpbmRleCwgdHJhbnNmZXJfYnVmZmVyLCBsZW5ndGgsIHRpbWVvdXQpOworCX0KK30KKy8qIGVuZCBmcm9tIGdvNzAwNy11c2IuYyB3aGljaCBpcyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwNiBNaWNyb25hcyBVU0EgSW5jLiovCisKK3N0YXRpYyBpbnQgd3JpdGVfcmVnKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHJlZywgdTggdmFsdWUpCit7CisJc3RydWN0IGdvNzAwNyAqZ28gPSBpMmNfZ2V0X2FkYXBkYXRhKGNsaWVudC0+YWRhcHRlcik7CisJc3RydWN0IGdvNzAwN191c2IgKnVzYiA9IGdvLT5ocGlfY29udGV4dDsKKwlpbnQgcmM7CisJaW50IGRldl9hZGRyID0gY2xpZW50LT5hZGRyOworCXU4ICpidWY7CisKKwlpZiAoZ28gPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAoZ28tPnN0YXR1cyA9PSBTVEFUVVNfU0hVVERPV04pCisJCXJldHVybiAtRUJVU1k7CisKKwlidWYgPSBremFsbG9jKDE2LCBHRlBfS0VSTkVMKTsKKwlpZiAoYnVmID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmdXNiLT5pMmNfbG9jaykgIT0gMCkgeworCQlwcmludGsoS0VSTl9JTkZPICJpMmMgbG9jayBmYWlsZWRcbiIpOworCQlyZXR1cm4gLUVJTlRSOworCX0KKwlyYyA9IGdvNzAwN191c2JfdmVuZG9yX3JlcXVlc3QoZ28sIDB4NTUsIGRldl9hZGRyLAorCQkJCSAgICAgICAocmVnPDw4IHwgdmFsdWUpLAorCQkJCSAgICAgICBidWYsCisJCQkJICAgICAgIDE2LCAxKTsKKworCXVwKCZ1c2ItPmkyY19sb2NrKTsKKwlrZnJlZShidWYpOworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCB3cml0ZV9yZWdfZnAoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTE2IGFkZHIsIHUxNiB2YWwpCit7CisJc3RydWN0IGdvNzAwNyAqZ28gPSBpMmNfZ2V0X2FkYXBkYXRhKGNsaWVudC0+YWRhcHRlcik7CisJc3RydWN0IGdvNzAwN191c2IgKnVzYiA9IGdvLT5ocGlfY29udGV4dDsKKwl1OCAqYnVmOworCXN0cnVjdCBzMjI1MCAqZGVjID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisKKwlpZiAoZ28gPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAoZ28tPnN0YXR1cyA9PSBTVEFUVVNfU0hVVERPV04pCisJCXJldHVybiAtRUJVU1k7CisKKwlidWYgPSBremFsbG9jKDE2LCBHRlBfS0VSTkVMKTsKKworCWlmIChidWYgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKworCisJbWVtc2V0KGJ1ZiwgMHhjZCwgNik7CisKKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZ1c2ItPmkyY19sb2NrKSAhPSAwKSB7CisJCXByaW50ayhLRVJOX0lORk8gImkyYyBsb2NrIGZhaWxlZFxuIik7CisJCXJldHVybiAtRUlOVFI7CisJfQorCWlmIChnbzcwMDdfdXNiX3ZlbmRvcl9yZXF1ZXN0KGdvLCAweDU3LCBhZGRyLCB2YWwsIGJ1ZiwgMTYsIDEpIDwgMCkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwl1cCgmdXNiLT5pMmNfbG9jayk7CisJaWYgKGJ1ZlswXSA9PSAwKSB7CisJCXVuc2lnbmVkIGludCBzdWJhZGRyLCB2YWxfcmVhZDsKKworCQlzdWJhZGRyID0gKGJ1Zls0XSA8PCA4KSArIGJ1Zls1XTsKKwkJdmFsX3JlYWQgPSAoYnVmWzJdIDw8IDgpICsgYnVmWzNdOworCQlpZiAodmFsX3JlYWQgIT0gdmFsKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICJpbnZhbGlkIGZwIHdyaXRlICV4ICV4XG4iLAorCQkJICAgICAgIHZhbF9yZWFkLCB2YWwpOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJaWYgKHN1YmFkZHIgIT0gYWRkcikgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiaW52YWxpZCBmcCB3cml0ZSBhZGRyICV4ICV4XG4iLAorCQkJICAgICAgIHN1YmFkZHIsIGFkZHIpOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwl9IGVsc2UKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwkvKiBzYXZlIGxhc3QgMTJiIHZhbHVlICovCisJaWYgKGFkZHIgPT0gMHgxMmIpCisJCWRlYy0+cmVnMTJiX3ZhbCA9IHZhbDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdyaXRlX3JlZ3Moc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggKnJlZ3MpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyAhKChyZWdzW2ldID09IDB4MDApICYmIChyZWdzW2krMV0gPT0gMHgwMCkpOyBpICs9IDIpIHsKKwkJaWYgKHdyaXRlX3JlZyhjbGllbnQsIHJlZ3NbaV0sIHJlZ3NbaSsxXSkgPCAwKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICJzMjI1MDogZmFpbGVkXG4iKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3cml0ZV9yZWdzX2ZwKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHUxNiAqcmVncykKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7ICEoKHJlZ3NbaV0gPT0gMHgwMCkgJiYgKHJlZ3NbaSsxXSA9PSAweDAwKSk7IGkgKz0gMikgeworCQlpZiAod3JpdGVfcmVnX2ZwKGNsaWVudCwgcmVnc1tpXSwgcmVnc1tpKzFdKSA8IDApIHsKKwkJCXByaW50ayhLRVJOX0lORk8gInMyMjUwOiBmYWlsZWQgZnBcbiIpOworCQkJcmV0dXJuIC0xOworCQl9CisJfQorCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgczIyNTBfY29tbWFuZChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCQkJIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgczIyNTAgKmRlYyA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFZJRElPQ19TX0lOUFVUOgorCXsKKwkJaW50IHZpZHN5czsKKwkJaW50ICppbnB1dCA9IGFyZzsKKworCQl2aWRzeXMgPSAoZGVjLT5zdGQgPT0gVjRMMl9TVERfTlRTQykgPyAweDAxIDogMHgwMDsKKwkJaWYgKCppbnB1dCA9PSAwKSB7CisJCQkvKiBjb21wb3NpdGUgKi8KKwkJCXdyaXRlX3JlZ19mcChjbGllbnQsIDB4MjAsIDB4MDIwIHwgdmlkc3lzKTsKKwkJCXdyaXRlX3JlZ19mcChjbGllbnQsIDB4MjEsIDB4NjYyKTsKKwkJCXdyaXRlX3JlZ19mcChjbGllbnQsIDB4MTQwLCAweDA2MCk7CisJCX0gZWxzZSB7CisJCQkvKiBTLVZpZGVvICovCisJCQl3cml0ZV9yZWdfZnAoY2xpZW50LCAweDIwLCAweDA0MCB8IHZpZHN5cyk7CisJCQl3cml0ZV9yZWdfZnAoY2xpZW50LCAweDIxLCAweDY2Nik7CisJCQl3cml0ZV9yZWdfZnAoY2xpZW50LCAweDE0MCwgMHgwNjApOworCQl9CisJCWRlYy0+aW5wdXQgPSAqaW5wdXQ7CisJCWJyZWFrOworCX0KKwljYXNlIFZJRElPQ19TX1NURDoKKwl7CisJCXY0bDJfc3RkX2lkICpzdGQgPSBhcmc7CisJCXUxNiB2aWRzb3VyY2U7CisKKwkJdmlkc291cmNlID0gKGRlYy0+aW5wdXQgPT0gMSkgPyAweDA0MCA6IDB4MDIwOworCQlkZWMtPnN0ZCA9ICpzdGQ7CisJCXN3aXRjaCAoZGVjLT5zdGQpIHsKKwkJY2FzZSBWNEwyX1NURF9OVFNDOgorCQkJd3JpdGVfcmVnc19mcChjbGllbnQsIHZpZF9yZWdzX2ZwKTsKKwkJCXdyaXRlX3JlZ19mcChjbGllbnQsIDB4MjAsIHZpZHNvdXJjZSB8IDEpOworCQkJYnJlYWs7CisJCWNhc2UgVjRMMl9TVERfUEFMOgorCQkJd3JpdGVfcmVnc19mcChjbGllbnQsIHZpZF9yZWdzX2ZwKTsKKwkJCXdyaXRlX3JlZ3NfZnAoY2xpZW50LCB2aWRfcmVnc19mcF9wYWwpOworCQkJd3JpdGVfcmVnX2ZwKGNsaWVudCwgMHgyMCwgdmlkc291cmNlKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJYnJlYWs7CisJfQorCWNhc2UgVklESU9DX1FVRVJZQ1RSTDoKKwl7CisJCXN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCAqY3RybCA9IGFyZzsKKwkJc3RhdGljIGNvbnN0IHUzMiB1c2VyX2N0cmxzW10gPSB7CisJCQlWNEwyX0NJRF9CUklHSFRORVNTLAorCQkJVjRMMl9DSURfQ09OVFJBU1QsCisJCQlWNEwyX0NJRF9TQVRVUkFUSU9OLAorCQkJVjRMMl9DSURfSFVFLAorCQkJMAorCQl9OworCQlzdGF0aWMgY29uc3QgdTMyICpjdHJsX2NsYXNzZXNbXSA9IHsKKwkJCXVzZXJfY3RybHMsCisJCQlOVUxMCisJCX07CisKKwkJY3RybC0+aWQgPSB2NGwyX2N0cmxfbmV4dChjdHJsX2NsYXNzZXMsIGN0cmwtPmlkKTsKKwkJc3dpdGNoIChjdHJsLT5pZCkgeworCQljYXNlIFY0TDJfQ0lEX0JSSUdIVE5FU1M6CisJCQl2NGwyX2N0cmxfcXVlcnlfZmlsbChjdHJsLCAwLCAxMDAsIDEsIDUwKTsKKwkJCWJyZWFrOworCQljYXNlIFY0TDJfQ0lEX0NPTlRSQVNUOgorCQkJdjRsMl9jdHJsX3F1ZXJ5X2ZpbGwoY3RybCwgMCwgMTAwLCAxLCA1MCk7CisJCQlicmVhazsKKwkJY2FzZSBWNEwyX0NJRF9TQVRVUkFUSU9OOgorCQkJdjRsMl9jdHJsX3F1ZXJ5X2ZpbGwoY3RybCwgMCwgMTAwLCAxLCA1MCk7CisJCQlicmVhazsKKwkJY2FzZSBWNEwyX0NJRF9IVUU6CisJCQl2NGwyX2N0cmxfcXVlcnlfZmlsbChjdHJsLCAtNTAsIDUwLCAxLCAwKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJY3RybC0+bmFtZVswXSA9ICdcMCc7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlicmVhazsKKwl9CisJY2FzZSBWSURJT0NfU19DVFJMOgorCXsKKwkJc3RydWN0IHY0bDJfY29udHJvbCAqY3RybCA9IGFyZzsKKwkJaW50IHZhbHVlMTsKKworCQlzd2l0Y2ggKGN0cmwtPmlkKSB7CisJCWNhc2UgVjRMMl9DSURfQlJJR0hUTkVTUzoKKwkJCXByaW50ayhLRVJOX0lORk8gInMyMjUwOiBmdXR1cmUgc2V0dGluZ1xuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJY2FzZSBWNEwyX0NJRF9DT05UUkFTVDoKKwkJCXByaW50ayhLRVJOX0lORk8gInMyMjUwOiBmdXR1cmUgc2V0dGluZ1xuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWJyZWFrOworCQljYXNlIFY0TDJfQ0lEX1NBVFVSQVRJT046CisJCQlpZiAoY3RybC0+dmFsdWUgPiAxMjcpCisJCQkJZGVjLT5zYXR1cmF0aW9uID0gMTI3OworCQkJZWxzZSBpZiAoY3RybC0+dmFsdWUgPCAwKQorCQkJCWRlYy0+c2F0dXJhdGlvbiA9IDA7CisJCQllbHNlCisJCQkJZGVjLT5zYXR1cmF0aW9uID0gY3RybC0+dmFsdWU7CisKKwkJCXZhbHVlMSA9IGRlYy0+c2F0dXJhdGlvbiAqIDQxNDAgLyAxMDA7CisJCQlpZiAodmFsdWUxID4gNDA5NCkKKwkJCQl2YWx1ZTEgPSA0MDk0OworCQkJd3JpdGVfcmVnX2ZwKGNsaWVudCwgVlBYMzIyX0FERFJfU0FULCB2YWx1ZTEpOworCQkJYnJlYWs7CisJCWNhc2UgVjRMMl9DSURfSFVFOgorCQkJaWYgKGN0cmwtPnZhbHVlID4gNTApCisJCQkJZGVjLT5odWUgPSA1MDsKKwkJCWVsc2UgaWYgKGN0cmwtPnZhbHVlIDwgLTUwKQorCQkJCWRlYy0+aHVlID0gLTUwOworCQkJZWxzZQorCQkJCWRlYy0+aHVlID0gY3RybC0+dmFsdWU7CisJCQkvKiBjbGFtcCB0aGUgaHVlIHJhbmdlICovCisJCQl2YWx1ZTEgPSBkZWMtPmh1ZSAqIDI4MCAvIDUwOworCQkJd3JpdGVfcmVnX2ZwKGNsaWVudCwgVlBYMzIyX0FERFJfSFVFLCB2YWx1ZTEpOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJfQorCWNhc2UgVklESU9DX0dfQ1RSTDoKKwl7CisJCXN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmwgPSBhcmc7CisKKwkJc3dpdGNoIChjdHJsLT5pZCkgeworCQljYXNlIFY0TDJfQ0lEX0JSSUdIVE5FU1M6CisJCQljdHJsLT52YWx1ZSA9IGRlYy0+YnJpZ2h0bmVzczsKKwkJCWJyZWFrOworCQljYXNlIFY0TDJfQ0lEX0NPTlRSQVNUOgorCQkJY3RybC0+dmFsdWUgPSBkZWMtPmNvbnRyYXN0OworCQkJYnJlYWs7CisJCWNhc2UgVjRMMl9DSURfU0FUVVJBVElPTjoKKwkJCWN0cmwtPnZhbHVlID0gZGVjLT5zYXR1cmF0aW9uOworCQkJYnJlYWs7CisJCWNhc2UgVjRMMl9DSURfSFVFOgorCQkJY3RybC0+dmFsdWUgPSBkZWMtPmh1ZTsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCX0KKwljYXNlIFZJRElPQ19TX0ZNVDoKKwl7CisJCXN0cnVjdCB2NGwyX2Zvcm1hdCAqZm10ID0gYXJnOworCQlpZiAoZm10LT5mbXQucGl4LmhlaWdodCA8IDY0MCkgeworCQkJd3JpdGVfcmVnX2ZwKGNsaWVudCwgMHgxMmIsIGRlYy0+cmVnMTJiX3ZhbCB8IDB4NDAwKTsKKwkJCXdyaXRlX3JlZ19mcChjbGllbnQsIDB4MTQwLCAweDA2MCk7CisJCX0gZWxzZSB7CisJCQl3cml0ZV9yZWdfZnAoY2xpZW50LCAweDEyYiwgZGVjLT5yZWcxMmJfdmFsICYgfjB4NDAwKTsKKwkJCXdyaXRlX3JlZ19mcChjbGllbnQsIDB4MTQwLCAweDA2MCk7CisJCX0KKwkJcmV0dXJuIDA7CisJfQorCWNhc2UgVklESU9DX0dfQVVESU86CisJeworCQlzdHJ1Y3QgdjRsMl9hdWRpbyAqYXVkaW8gPSBhcmc7CisKKwkJbWVtc2V0KGF1ZGlvLCAwLCBzaXplb2YoKmF1ZGlvKSk7CisJCWF1ZGlvLT5pbmRleCA9IGRlYy0+YXVkaW9faW5wdXQ7CisJCS8qIGZhbGwgdGhyb3VnaCAqLworCX0KKwljYXNlIFZJRElPQ19FTlVNQVVESU86CisJeworCQlzdHJ1Y3QgdjRsMl9hdWRpbyAqYXVkaW8gPSBhcmc7CisKKwkJc3dpdGNoIChhdWRpby0+aW5kZXgpIHsKKwkJY2FzZSAwOgorCQkJc3RyY3B5KGF1ZGlvLT5uYW1lLCAiTGluZSBJbiIpOworCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCXN0cmNweShhdWRpby0+bmFtZSwgIk1pYyIpOworCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCXN0cmNweShhdWRpby0+bmFtZSwgIk1pYyBCb29zdCIpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlhdWRpby0+bmFtZVswXSA9ICdcMCc7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlhdWRpby0+Y2FwYWJpbGl0eSA9IFY0TDJfQVVEQ0FQX1NURVJFTzsKKwkJYXVkaW8tPm1vZGUgPSAwOworCQlyZXR1cm4gMDsKKwl9CisJY2FzZSBWSURJT0NfU19BVURJTzoKKwl7CisJCXN0cnVjdCB2NGwyX2F1ZGlvICphdWRpbyA9IGFyZzsKKworCQljbGllbnQtPmFkZHIgPSBUTFYzMjBfQUREUkVTUzsKKwkJc3dpdGNoIChhdWRpby0+aW5kZXgpIHsKKwkJY2FzZSAwOgorCQkJd3JpdGVfcmVnKGNsaWVudCwgMHgwOCwgMHgwMik7IC8qIExpbmUgSW4gKi8KKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQl3cml0ZV9yZWcoY2xpZW50LCAweDA4LCAweDA0KTsgLyogTWljICovCisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJd3JpdGVfcmVnKGNsaWVudCwgMHgwOCwgMHgwNSk7IC8qIE1pYyBCb29zdCAqLworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlkZWMtPmF1ZGlvX2lucHV0ID0gYXVkaW8tPmluZGV4OworCQlyZXR1cm4gMDsKKwl9CisKKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9JTkZPICJzMjI1MDogdW5rbm93biBjb21tYW5kIDB4JXhcbiIsIGNtZCk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIHMyMjUwX2RyaXZlcjsKKworc3RhdGljIHN0cnVjdCBpMmNfY2xpZW50IHMyMjUwX2NsaWVudF90ZW1wbCA9IHsKKwkubmFtZQkJPSAiU2Vuc29yYXkgMjI1MCIsCisJLmRyaXZlcgkJPSAmczIyNTBfZHJpdmVyLAorfTsKKworc3RhdGljIGludCBzMjI1MF9kZXRlY3Qoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLCBpbnQgYWRkciwgaW50IGtpbmQpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudDsKKwlzdHJ1Y3QgczIyNTAgKmRlYzsKKwl1OCAqZGF0YTsKKwlzdHJ1Y3QgZ283MDA3ICpnbyA9IGkyY19nZXRfYWRhcGRhdGEoYWRhcHRlcik7CisJc3RydWN0IGdvNzAwN191c2IgKnVzYiA9IGdvLT5ocGlfY29udGV4dDsKKworCWNsaWVudCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpMmNfY2xpZW50KSwgR0ZQX0tFUk5FTCk7CisJaWYgKGNsaWVudCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwltZW1jcHkoY2xpZW50LCAmczIyNTBfY2xpZW50X3RlbXBsLAorCSAgICAgICBzaXplb2YoczIyNTBfY2xpZW50X3RlbXBsKSk7CisJY2xpZW50LT5hZGFwdGVyID0gYWRhcHRlcjsKKworCWRlYyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzMjI1MCksIEdGUF9LRVJORUwpOworCWlmIChkZWMgPT0gTlVMTCkgeworCQlrZnJlZShjbGllbnQpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlkZWMtPnN0ZCA9IFY0TDJfU1REX05UU0M7CisJZGVjLT5icmlnaHRuZXNzID0gNTA7CisJZGVjLT5jb250cmFzdCA9IDUwOworCWRlYy0+c2F0dXJhdGlvbiA9IDUwOworCWRlYy0+aHVlID0gMDsKKwljbGllbnQtPmFkZHIgPSBUTFYzMjBfQUREUkVTUzsKKwlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBkZWMpOworCisJcHJpbnRrKEtFUk5fREVCVUcKKwkgICAgICAgInMyMjUwOiBpbml0aWFsaXppbmcgdmlkZW8gZGVjb2RlciBvbiAlc1xuIiwKKwkgICAgICAgYWRhcHRlci0+bmFtZSk7CisKKwkvKiBpbml0aWFsaXplIHRoZSBhdWRpbyAqLworCWNsaWVudC0+YWRkciA9IFRMVjMyMF9BRERSRVNTOworCWlmICh3cml0ZV9yZWdzKGNsaWVudCwgYXVkX3JlZ3MpIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIKKwkJICAgICAgICJzMjI1MDogZXJyb3IgaW5pdGlhbGl6aW5nIGF1ZGlvXG4iKTsKKwkJa2ZyZWUoY2xpZW50KTsKKwkJa2ZyZWUoZGVjKTsKKwkJcmV0dXJuIDA7CisJfQorCWNsaWVudC0+YWRkciA9IFMyMjUwX1ZJRERFQzsKKwlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBkZWMpOworCisJaWYgKHdyaXRlX3JlZ3MoY2xpZW50LCB2aWRfcmVncykgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkgICAgICAgInMyMjUwOiBlcnJvciBpbml0aWFsaXppbmcgZGVjb2RlclxuIik7CisJCWtmcmVlKGNsaWVudCk7CisJCWtmcmVlKGRlYyk7CisJCXJldHVybiAwOworCX0KKwlpZiAod3JpdGVfcmVnc19mcChjbGllbnQsIHZpZF9yZWdzX2ZwKSA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCSAgICAgICAiczIyNTA6IGVycm9yIGluaXRpYWxpemluZyBkZWNvZGVyXG4iKTsKKwkJa2ZyZWUoY2xpZW50KTsKKwkJa2ZyZWUoZGVjKTsKKwkJcmV0dXJuIDA7CisJfQorCS8qIHNldCBkZWZhdWx0IGNoYW5uZWwgKi8KKwkvKiBjb21wb3NpdGUgKi8KKwl3cml0ZV9yZWdfZnAoY2xpZW50LCAweDIwLCAweDAyMCB8IDEpOworCXdyaXRlX3JlZ19mcChjbGllbnQsIDB4MjEsIDB4NjYyKTsKKwl3cml0ZV9yZWdfZnAoY2xpZW50LCAweDE0MCwgMHgwNjApOworCisJLyogc2V0IGRlZmF1bHQgYXVkaW8gaW5wdXQgKi8KKwlkZWMtPmF1ZGlvX2lucHV0ID0gMDsKKwl3cml0ZV9yZWcoY2xpZW50LCAweDA4LCAweDAyKTsgLyogTGluZSBJbiAqLworCisJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmdXNiLT5pMmNfbG9jaykgPT0gMCkgeworCQlkYXRhID0ga3phbGxvYygxNiwgR0ZQX0tFUk5FTCk7CisJCWlmIChkYXRhICE9IE5VTEwpIHsKKwkJCWludCByYzsKKwkJCXJjID0gZ283MDA3X3VzYl92ZW5kb3JfcmVxdWVzdChnbywgMHg0MSwgMCwgMCwKKwkJCQkJCSAgICAgICBkYXRhLCAxNiwgMSk7CisJCQlpZiAocmMgPiAwKSB7CisJCQkJdTggbWFzazsKKwkJCQlkYXRhWzBdID0gMDsKKwkJCQltYXNrID0gMTw8NTsKKwkJCQlkYXRhWzBdICY9IH5tYXNrOworCQkJCWRhdGFbMV0gfD0gbWFzazsKKwkJCQlnbzcwMDdfdXNiX3ZlbmRvcl9yZXF1ZXN0KGdvLCAweDQwLCAwLAorCQkJCQkJCSAgKGRhdGFbMV08PDgpCisJCQkJCQkJICArIGRhdGFbMV0sCisJCQkJCQkJICBkYXRhLCAxNiwgMCk7CisJCQl9CisJCQlrZnJlZShkYXRhKTsKKwkJfQorCQl1cCgmdXNiLT5pMmNfbG9jayk7CisJfQorCisJaTJjX2F0dGFjaF9jbGllbnQoY2xpZW50KTsKKwlwcmludGsoInMyMjUwOiBpbml0aWFsaXplZCBzdWNjZXNzZnVsbHlcbiIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHMyMjUwX2RldGFjaChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXN0cnVjdCBzMjI1MCAqZGVjID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJaW50IHI7CisKKwlyID0gaTJjX2RldGFjaF9jbGllbnQoY2xpZW50KTsKKwlpZiAociA8IDApCisJCXJldHVybiByOworCisJa2ZyZWUoY2xpZW50KTsKKwlrZnJlZShkZWMpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgczIyNTBfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lCT0gIlNlbnNvcmF5IDIyNTAgYm9hcmQgZHJpdmVyIiwKKwl9LAorCS5pZAkJPSBJMkNfRFJJVkVSSURfUzIyNTAsCisJLmRldGFjaF9jbGllbnQJPSBzMjI1MF9kZXRhY2gsCisJLmNvbW1hbmQJPSBzMjI1MF9jb21tYW5kLAorfTsKKworc3RhdGljIGludCBfX2luaXQgczIyNTBfaW5pdCh2b2lkKQoreworCWludCByOworCisJciA9IHMyMjUwbG9hZGVyX2luaXQoKTsKKwlpZiAociA8IDApCisJCXJldHVybiByOworCisJciA9IGkyY19hZGRfZHJpdmVyKCZzMjI1MF9kcml2ZXIpOworCWlmIChyIDwgMCkKKwkJcmV0dXJuIHI7CisJcmV0dXJuIHdpc19pMmNfYWRkX2RyaXZlcihzMjI1MF9kcml2ZXIuaWQsIHMyMjUwX2RldGVjdCk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBzMjI1MF9jbGVhbnVwKHZvaWQpCit7CisJd2lzX2kyY19kZWxfZHJpdmVyKHMyMjUwX2RldGVjdCk7CisJaTJjX2RlbF9kcml2ZXIoJnMyMjUwX2RyaXZlcik7CisKKwlzMjI1MGxvYWRlcl9jbGVhbnVwKCk7Cit9CisKK21vZHVsZV9pbml0KHMyMjUwX2luaXQpOworbW9kdWxlX2V4aXQoczIyNTBfY2xlYW51cCk7CisKK01PRFVMRV9BVVRIT1IoIiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJCb2FyZCBkcml2ZXIgZm9yIFNlbnNvcnlyYXkgMjI1MCIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dvNzAwNy9zMjI1MC1sb2FkZXIuYyBiL2RyaXZlcnMvc3RhZ2luZy9nbzcwMDcvczIyNTAtbG9hZGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTVlNGFjYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9nbzcwMDcvczIyNTAtbG9hZGVyLmMKQEAgLTAsMCArMSwxODggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggU2Vuc29yYXkgQ29tcGFueSBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKFZlcnNpb24gMikgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC91c2IuaD4KKyNpbmNsdWRlIDxkdmItdXNiLmg+CisKKyNkZWZpbmUgUzIyNTBfTE9BREVSX0ZJUk1XQVJFCSJzMjI1MF9sb2FkZXIuZnciCisjZGVmaW5lIFMyMjUwX0ZJUk1XQVJFCQkiczIyNTAuZnciCisKK3R5cGVkZWYgc3RydWN0IGRldmljZV9leHRlbnNpb25fcyB7CisgICAgc3RydWN0IGtyZWYgICAgIGtyZWY7CisgICAgaW50IG1pbm9yOworICAgIHN0cnVjdCB1c2JfZGV2aWNlICp1c2JkZXY7Cit9IGRldmljZV9leHRlbnNpb25fdCwgKnBkZXZpY2VfZXh0ZW5zaW9uX3Q7CisKKyNkZWZpbmUgVVNCX3MyMjUwbG9hZGVyX01BSk9SIDI0MAorI2RlZmluZSBVU0JfczIyNTBsb2FkZXJfTUlOT1JfQkFTRSAwCisjZGVmaW5lIE1BWF9ERVZJQ0VTIDI1NgorCitzdGF0aWMgcGRldmljZV9leHRlbnNpb25fdCBzMjI1MF9kZXZfdGFibGVbTUFYX0RFVklDRVNdOworc3RhdGljIERFQ0xBUkVfTVVURVgoczIyNTBfZGV2X3RhYmxlX211dGV4KTsKKworI2RlZmluZSB0b19zMjI1MGxvYWRlcl9kZXZfY29tbW9uKGQpIGNvbnRhaW5lcl9vZihkLCBkZXZpY2VfZXh0ZW5zaW9uX3QsIGtyZWYpCitzdGF0aWMgdm9pZCBzMjI1MGxvYWRlcl9kZWxldGUoc3RydWN0IGtyZWYgKmtyZWYpCit7CisJcGRldmljZV9leHRlbnNpb25fdCBzID0gdG9fczIyNTBsb2FkZXJfZGV2X2NvbW1vbihrcmVmKTsKKwlzMjI1MF9kZXZfdGFibGVbcy0+bWlub3JdID0gTlVMTDsKKwlrZnJlZShzKTsKK30KKworc3RhdGljIGludCBzMjI1MGxvYWRlcl9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZXJmYWNlLAorCQkJCWNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdXNiZGV2OworCWludCBtaW5vciwgcmV0OworCXBkZXZpY2VfZXh0ZW5zaW9uX3QgcyA9IE5VTEw7CisJY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdzsKKworCXVzYmRldiA9IHVzYl9nZXRfZGV2KGludGVyZmFjZV90b191c2JkZXYoaW50ZXJmYWNlKSk7CisJaWYgKCF1c2JkZXYpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJFbnRlciBzMjI1MGxvYWRlcl9wcm9iZSBmYWlsZWRcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCXByaW50ayhLRVJOX0lORk8gIkVudGVyIHMyMjUwbG9hZGVyX3Byb2JlIDIuNiBrZXJuZWxcbiIpOworCXByaW50ayhLRVJOX0lORk8gInZlbmRvciBpZCAweCV4LCBkZXZpY2UgaWQgMHgleCBkZXZudW06JWRcbiIsCisJICAgdXNiZGV2LT5kZXNjcmlwdG9yLmlkVmVuZG9yLCB1c2JkZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0LAorCSAgIHVzYmRldi0+ZGV2bnVtKTsKKworCWlmICh1c2JkZXYtPmRlc2NyaXB0b3IuYk51bUNvbmZpZ3VyYXRpb25zICE9IDEpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJjYW4ndCBoYW5kbGUgbXVsdGlwbGUgY29uZmlnXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKwlkb3duKCZzMjI1MF9kZXZfdGFibGVfbXV0ZXgpOworCisJZm9yIChtaW5vciA9IDA7IG1pbm9yIDwgTUFYX0RFVklDRVM7IG1pbm9yKyspIHsKKwkJaWYgKHMyMjUwX2Rldl90YWJsZVttaW5vcl0gPT0gTlVMTCkKKwkJCWJyZWFrOworCX0KKworCWlmIChtaW5vciA8IDAgfHwgbWlub3IgPj0gTUFYX0RFVklDRVMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJJbnZhbGlkIG1pbm9yOiAlZFxuIiwgbWlub3IpOworCQlnb3RvIGZhaWxlZDsKKwl9CisKKwkvKiBBbGxvY2F0ZSBkZXYgZGF0YSBzdHJ1Y3R1cmUgKi8KKwlzID0ga21hbGxvYyhzaXplb2YoZGV2aWNlX2V4dGVuc2lvbl90KSwgR0ZQX0tFUk5FTCk7CisJaWYgKHMgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgIk91dCBvZiBtZW1vcnlcbiIpOworCQlnb3RvIGZhaWxlZDsKKwl9CisJczIyNTBfZGV2X3RhYmxlW21pbm9yXSA9IHM7CisKKwlwcmludGsoS0VSTl9JTkZPICJzMjI1MGxvYWRlcl9wcm9iZTogRGV2aWNlICVkIG9uIEJ1cyAlZCBNaW5vciAlZFxuIiwKKwkJdXNiZGV2LT5kZXZudW0sIHVzYmRldi0+YnVzLT5idXNudW0sIG1pbm9yKTsKKworCW1lbXNldChzLCAwLCBzaXplb2YoZGV2aWNlX2V4dGVuc2lvbl90KSk7CisJcy0+dXNiZGV2ID0gdXNiZGV2OworCXByaW50ayhLRVJOX0lORk8gImxvYWRpbmcgMjI1MCBsb2FkZXJcbiIpOworCisJa3JlZl9pbml0KCYocy0+a3JlZikpOworCisJdXAoJnMyMjUwX2Rldl90YWJsZV9tdXRleCk7CisKKwlpZiAocmVxdWVzdF9maXJtd2FyZSgmZncsIFMyMjUwX0xPQURFUl9GSVJNV0FSRSwgJnVzYmRldi0+ZGV2KSkgeworCQlwcmludGsoS0VSTl9FUlIKKwkJCSJzMjI1MDogdW5hYmxlIHRvIGxvYWQgZmlybXdhcmUgZnJvbSBmaWxlIFwiJXNcIlxuIiwKKwkJCVMyMjUwX0xPQURFUl9GSVJNV0FSRSk7CisJCWdvdG8gZmFpbGVkMjsKKwl9CisJcmV0ID0gdXNiX2N5cHJlc3NfbG9hZF9maXJtd2FyZSh1c2JkZXYsIGZ3LCBDWVBSRVNTX0ZYMik7CisJcmVsZWFzZV9maXJtd2FyZShmdyk7CisJaWYgKDAgIT0gcmV0KSB7CisJCXByaW50ayhLRVJOX0VSUiAibG9hZGVyIGRvd25sb2FkIGZhaWxlZFxuIik7CisJCWdvdG8gZmFpbGVkMjsKKwl9CisKKwlpZiAocmVxdWVzdF9maXJtd2FyZSgmZncsIFMyMjUwX0ZJUk1XQVJFLCAmdXNiZGV2LT5kZXYpKSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkJInMyMjUwOiB1bmFibGUgdG8gbG9hZCBmaXJtd2FyZSBmcm9tIGZpbGUgXCIlc1wiXG4iLAorCQkJUzIyNTBfRklSTVdBUkUpOworCQlnb3RvIGZhaWxlZDI7CisJfQorCXJldCA9IHVzYl9jeXByZXNzX2xvYWRfZmlybXdhcmUodXNiZGV2LCBmdywgQ1lQUkVTU19GWDIpOworCXJlbGVhc2VfZmlybXdhcmUoZncpOworCWlmICgwICE9IHJldCkgeworCQlwcmludGsoS0VSTl9FUlIgImZpcm13YXJlX3MyMjUwIGRvd25sb2FkIGZhaWxlZFxuIik7CisJCWdvdG8gZmFpbGVkMjsKKwl9CisKKwl1c2Jfc2V0X2ludGZkYXRhKGludGVyZmFjZSwgcyk7CisJcmV0dXJuIDA7CisKK2ZhaWxlZDoKKwl1cCgmczIyNTBfZGV2X3RhYmxlX211dGV4KTsKK2ZhaWxlZDI6CisJaWYgKHMpCisJCWtyZWZfcHV0KCYocy0+a3JlZiksIHMyMjUwbG9hZGVyX2RlbGV0ZSk7CisKKwlwcmludGsoS0VSTl9FUlIgInByb2JlIGZhaWxlZFxuIik7CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgdm9pZCBzMjI1MGxvYWRlcl9kaXNjb25uZWN0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2UpCit7CisJcGRldmljZV9leHRlbnNpb25fdCBzID0gdXNiX2dldF9pbnRmZGF0YShpbnRlcmZhY2UpOworCXByaW50ayhLRVJOX0lORk8gInMyMjUwOiBkaXNjb25uZWN0XG4iKTsKKwlsb2NrX2tlcm5lbCgpOworCXMgPSB1c2JfZ2V0X2ludGZkYXRhKGludGVyZmFjZSk7CisJdXNiX3NldF9pbnRmZGF0YShpbnRlcmZhY2UsIE5VTEwpOworCWtyZWZfcHV0KCYocy0+a3JlZiksIHMyMjUwbG9hZGVyX2RlbGV0ZSk7CisJdW5sb2NrX2tlcm5lbCgpOworfQorCitzdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgczIyNTBsb2FkZXJfaWRzW10gPSB7CisJe1VTQl9ERVZJQ0UoMHgxOTQzLCAweGEyNTApfSwKKwl7fSAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVGVybWluYXRpbmcgZW50cnkgKi8KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUodXNiLCBzMjI1MGxvYWRlcl9pZHMpOworCitzdGF0aWMgc3RydWN0IHVzYl9kcml2ZXIgczIyNTBsb2FkZXJfZHJpdmVyID0geworCS5uYW1lCQk9ICJzMjI1MC1sb2FkZXIiLAorCS5wcm9iZQkJPSBzMjI1MGxvYWRlcl9wcm9iZSwKKwkuZGlzY29ubmVjdAk9IHMyMjUwbG9hZGVyX2Rpc2Nvbm5lY3QsCisJLmlkX3RhYmxlCT0gczIyNTBsb2FkZXJfaWRzLAorfTsKKworaW50IHMyMjUwbG9hZGVyX2luaXQodm9pZCkKK3sKKwlpbnQgcjsKKwl1bnNpZ25lZCBpID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhfREVWSUNFUzsgaSsrKQorCQlzMjI1MF9kZXZfdGFibGVbaV0gPSBOVUxMOworCisJciA9IHVzYl9yZWdpc3RlcigmczIyNTBsb2FkZXJfZHJpdmVyKTsKKwlpZiAocikgeworCQlwcmludGsoS0VSTl9FUlIgInVzYl9yZWdpc3RlciBmYWlsZWQuIEVycm9yIG51bWJlciAlZFxuIiwgcik7CisJCXJldHVybiAtMTsKKwl9CisKKwlwcmludGsoS0VSTl9JTkZPICJzMjI1MGxvYWRlcl9pbml0OiBkcml2ZXIgcmVnaXN0ZXJlZFxuIik7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKHMyMjUwbG9hZGVyX2luaXQpOworCit2b2lkIHMyMjUwbG9hZGVyX2NsZWFudXAodm9pZCkKK3sKKwlwcmludGsoS0VSTl9JTkZPICJzMjI1MGxvYWRlcl9jbGVhbnVwXG4iKTsKKwl1c2JfZGVyZWdpc3RlcigmczIyNTBsb2FkZXJfZHJpdmVyKTsKK30KK0VYUE9SVF9TWU1CT0woczIyNTBsb2FkZXJfY2xlYW51cCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ283MDA3L3NhYTcxMzQtZ283MDA3LmMgYi9kcml2ZXJzL3N0YWdpbmcvZ283MDA3L3NhYTcxMzQtZ283MDA3LmMKaW5kZXggYzRhNmQ4ZS4uNjY1YmJmNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2dvNzAwNy9zYWE3MTM0LWdvNzAwNy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9nbzcwMDcvc2FhNzEzNC1nbzcwMDcuYwpAQCAtMjcsNyArMjcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgogI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9hdWRpb2NoaXAuaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWNvbW1vbi5oPgogCiAjaW5jbHVkZSAic2FhNzEzNC1yZWcuaCIKICNpbmNsdWRlICJzYWE3MTM0LmgiCkBAIC0zMTQsNyArMzE0LDEzIEBACiBzdGF0aWMgaW50IHNhYTcxMzRfZ283MDA3X3N0cmVhbV9zdG9wKHN0cnVjdCBnbzcwMDcgKmdvKQogewogCXN0cnVjdCBzYWE3MTM0X2dvNzAwNyAqc2FhID0gZ28tPmhwaV9jb250ZXh0OwotCXN0cnVjdCBzYWE3MTM0X2RldiAqZGV2ID0gc2FhLT5kZXY7CisJc3RydWN0IHNhYTcxMzRfZGV2ICpkZXY7CisKKwlpZiAoIXNhYSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJZGV2ID0gc2FhLT5kZXY7CisJaWYgKCFkZXYpCisJCXJldHVybiAtRUlOVkFMOwogCiAJLyogU2h1dCBkb3duIFRTIEZJRk8gKi8KIAlzYWFfY2xlYXJsKFNBQTcxMzRfTUFJTl9DVFJMLCBTQUE3MTM0X01BSU5fQ1RSTF9URTUpOwpAQCAtMzczLDYgKzM3OSw0NyBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IHNhYTcxMzRfZ283MDA3X3NlbmRfY29tbWFuZChzdHJ1Y3QgZ283MDA3ICpnbywgdW5zaWduZWQgaW50IGNtZCwKKwkJCQkJdm9pZCAqYXJnKQoreworCXN0cnVjdCBzYWE3MTM0X2dvNzAwNyAqc2FhID0gZ28tPmhwaV9jb250ZXh0OworCXN0cnVjdCBzYWE3MTM0X2RldiAqZGV2ID0gc2FhLT5kZXY7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgVklESU9DX1NfU1REOgorCXsKKwkJdjRsMl9zdGRfaWQgKnN0ZCA9IGFyZzsKKwkJcmV0dXJuIHNhYTcxMzRfc19zdGRfaW50ZXJuYWwoZGV2LCBOVUxMLCBzdGQpOworCX0KKwljYXNlIFZJRElPQ19HX1NURDoKKwl7CisJCXY0bDJfc3RkX2lkICpzdGQgPSBhcmc7CisJCSpzdGQgPSBkZXYtPnR2bm9ybS0+aWQ7CisJCXJldHVybiAwOworCX0KKwljYXNlIFZJRElPQ19RVUVSWUNUUkw6CisJeworCQlzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgKmN0cmwgPSBhcmc7CisJCWlmIChWNEwyX0NUUkxfSUQyQ0xBU1MoY3RybC0+aWQpID09IFY0TDJfQ1RSTF9DTEFTU19VU0VSKQorCQkJcmV0dXJuIHNhYTcxMzRfcXVlcnljdHJsKE5VTEwsIE5VTEwsIGN0cmwpOworCX0KKwljYXNlIFZJRElPQ19HX0NUUkw6CisJeworCQlzdHJ1Y3QgdjRsMl9jb250cm9sICpjdHJsID0gYXJnOworCQlpZiAoVjRMMl9DVFJMX0lEMkNMQVNTKGN0cmwtPmlkKSA9PSBWNEwyX0NUUkxfQ0xBU1NfVVNFUikKKwkJCXJldHVybiBzYWE3MTM0X2dfY3RybF9pbnRlcm5hbChkZXYsIE5VTEwsIGN0cmwpOworCX0KKwljYXNlIFZJRElPQ19TX0NUUkw6CisJeworCQlzdHJ1Y3QgdjRsMl9jb250cm9sICpjdHJsID0gYXJnOworCQlpZiAoVjRMMl9DVFJMX0lEMkNMQVNTKGN0cmwtPmlkKSA9PSBWNEwyX0NUUkxfQ0xBU1NfVVNFUikKKwkJCXJldHVybiBzYWE3MTM0X3NfY3RybF9pbnRlcm5hbChkZXYsIE5VTEwsIGN0cmwpOworCX0KKwl9CisJcmV0dXJuIC1FSU5WQUw7CisKK30KKwogc3RhdGljIHN0cnVjdCBnbzcwMDdfaHBpX29wcyBzYWE3MTM0X2dvNzAwN19ocGlfb3BzID0gewogCS5pbnRlcmZhY2VfcmVzZXQJPSBzYWE3MTM0X2dvNzAwN19pbnRlcmZhY2VfcmVzZXQsCiAJLndyaXRlX2ludGVycnVwdAk9IHNhYTcxMzRfZ283MDA3X3dyaXRlX2ludGVycnVwdCwKQEAgLTM4MCw2ICs0MjcsNyBAQAogCS5zdHJlYW1fc3RhcnQJCT0gc2FhNzEzNF9nbzcwMDdfc3RyZWFtX3N0YXJ0LAogCS5zdHJlYW1fc3RvcAkJPSBzYWE3MTM0X2dvNzAwN19zdHJlYW1fc3RvcCwKIAkuc2VuZF9maXJtd2FyZQkJPSBzYWE3MTM0X2dvNzAwN19zZW5kX2Zpcm13YXJlLAorCS5zZW5kX2NvbW1hbmQJCT0gc2FhNzEzNF9nbzcwMDdfc2VuZF9jb21tYW5kLAogfTsKIAogLyoqKioqKioqKioqKioqKioqKioqKiBBZGQvcmVtb3ZlIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ283MDA3L3dpcy1pMmMuaCBiL2RyaXZlcnMvc3RhZ2luZy9nbzcwMDcvd2lzLWkyYy5oCmluZGV4IDk5M2Y2NTguLjQzMWY0MWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9nbzcwMDcvd2lzLWkyYy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9nbzcwMDcvd2lzLWkyYy5oCkBAIC0yMyw2ICsyMyw3IEBACiAjZGVmaW5lCUkyQ19EUklWRVJJRF9XSVNfU0FBNzExMwkweGYwZjQKICNkZWZpbmUJSTJDX0RSSVZFUklEX1dJU19PVjc2NDAJCTB4ZjBmNQogI2RlZmluZQlJMkNfRFJJVkVSSURfV0lTX1RXMjgwNAkJMHhmMGY2CisjZGVmaW5lCUkyQ19EUklWRVJJRF9TMjI1MAkJMHhmMGY3CiAjZGVmaW5lCUkyQ19BTEdPX0dPNzAwNwkJCTB4ZjAwMDAwCiAjZGVmaW5lCUkyQ19BTEdPX0dPNzAwN19VU0IJCTB4ZjEwMDAwCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9nbzcwMDcvd2lzLXNvbnktdHVuZXIuYyBiL2RyaXZlcnMvc3RhZ2luZy9nbzcwMDcvd2lzLXNvbnktdHVuZXIuYwppbmRleCA1YTkxZWU0Li41OGZkZGIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZ283MDA3L3dpcy1zb255LXR1bmVyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2dvNzAwNy93aXMtc29ueS10dW5lci5jCkBAIC02MDQsNyArNjA0LDcgQEAKIAl7CiAJCXN0cnVjdCB2NGwyX3R1bmVyICp0dW4gPSBhcmc7CiAKLQkJbWVtc2V0KHQsIDAsIHNpemVvZigqdHVuKSk7CisJCW1lbXNldCh0dW4sIDAsIHNpemVvZigqdHVuKSk7CiAJCXN0cmNweSh0dW4tPm5hbWUsICJUZWxldmlzaW9uIik7CiAJCXR1bi0+dHlwZSA9IFY0TDJfVFVORVJfQU5BTE9HX1RWOwogCQl0dW4tPnJhbmdlbG93ID0gMFVMOyAvKiBkb2VzIGFueXRoaW5nIHVzZSB0aGVzZT8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZTQwMDAvbWU0MDAwLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWU0MDAwL21lNDAwMC5jCmluZGV4IDAzOTRlMjcuLmUxYzRhODAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9tZTQwMDAvbWU0MDAwLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL21lNDAwMC9tZTQwMDAuYwpAQCAtNTM2LDI1ICs1MzYsMTkgQEAKIAogc3RhdGljIHZvaWQgY2xlYXJfYm9hcmRfaW5mb19saXN0KHZvaWQpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqYm9hcmRfcDsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpkYWNfcDsKLQlzdHJ1Y3QgbWU0MDAwX2luZm8gKmJvYXJkX2luZm87Ci0Jc3RydWN0IG1lNDAwMF9hb19jb250ZXh0ICphb19jb250ZXh0OworCXN0cnVjdCBtZTQwMDBfaW5mbyAqYm9hcmRfaW5mbywgKmJvYXJkX2luZm9fc2FmZTsKKwlzdHJ1Y3QgbWU0MDAwX2FvX2NvbnRleHQgKmFvX2NvbnRleHQsICphb19jb250ZXh0X3NhZmU7CiAKIAkvKiBDbGVhciBjb250ZXh0IGxpc3RzICovCi0JZm9yIChib2FyZF9wID0gbWU0MDAwX2JvYXJkX2luZm9fbGlzdC5uZXh0OwotCSAgICAgYm9hcmRfcCAhPSAmbWU0MDAwX2JvYXJkX2luZm9fbGlzdDsgYm9hcmRfcCA9IGJvYXJkX3AtPm5leHQpIHsKLQkJYm9hcmRfaW5mbyA9IGxpc3RfZW50cnkoYm9hcmRfcCwgc3RydWN0IG1lNDAwMF9pbmZvLCBsaXN0KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGJvYXJkX2luZm8sICZtZTQwMDBfYm9hcmRfaW5mb19saXN0LCBsaXN0KSB7CiAJCS8qIENsZWFyIGFuYWxvZyBvdXRwdXQgY29udGV4dCBsaXN0ICovCi0JCXdoaWxlICghbGlzdF9lbXB0eSgmYm9hcmRfaW5mby0+YW9fY29udGV4dF9saXN0KSkgewotCQkJZGFjX3AgPSBib2FyZF9pbmZvLT5hb19jb250ZXh0X2xpc3QubmV4dDsKLQkJCWFvX2NvbnRleHQgPQotCQkJICAgIGxpc3RfZW50cnkoZGFjX3AsIHN0cnVjdCBtZTQwMDBfYW9fY29udGV4dCwgbGlzdCk7CisJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShhb19jb250ZXh0LCBhb19jb250ZXh0X3NhZmUsCisJCQkJJmJvYXJkX2luZm8tPmFvX2NvbnRleHRfbGlzdCwgbGlzdCkgewogCQkJbWU0MDAwX2FvX3Jlc2V0KGFvX2NvbnRleHQpOwogCQkJZnJlZV9pcnEoYW9fY29udGV4dC0+aXJxLCBhb19jb250ZXh0KTsKIAkJCWlmIChhb19jb250ZXh0LT5jaXJjX2J1Zi5idWYpCiAJCQkJa2ZyZWUoYW9fY29udGV4dC0+Y2lyY19idWYuYnVmKTsKLQkJCWxpc3RfZGVsKGRhY19wKTsKKwkJCWxpc3RfZGVsKCZhb19jb250ZXh0LT5saXN0KTsKIAkJCWtmcmVlKGFvX2NvbnRleHQpOwogCQl9CiAKQEAgLTU3NCwxMSArNTY4LDEwIEBACiAJfQogCiAJLyogQ2xlYXIgdGhlIGJvYXJkIGluZm8gbGlzdCAqLwotCXdoaWxlICghbGlzdF9lbXB0eSgmbWU0MDAwX2JvYXJkX2luZm9fbGlzdCkpIHsKLQkJYm9hcmRfcCA9IG1lNDAwMF9ib2FyZF9pbmZvX2xpc3QubmV4dDsKLQkJYm9hcmRfaW5mbyA9IGxpc3RfZW50cnkoYm9hcmRfcCwgc3RydWN0IG1lNDAwMF9pbmZvLCBsaXN0KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoYm9hcmRfaW5mbywgYm9hcmRfaW5mb19zYWZlLAorCQkJJm1lNDAwMF9ib2FyZF9pbmZvX2xpc3QsIGxpc3QpIHsKIAkJcGNpX3JlbGVhc2VfcmVnaW9ucyhib2FyZF9pbmZvLT5wY2lfZGV2X3ApOwotCQlsaXN0X2RlbChib2FyZF9wKTsKKwkJbGlzdF9kZWwoJmJvYXJkX2luZm8tPmxpc3QpOwogCQlrZnJlZShib2FyZF9pbmZvKTsKIAl9CiB9CkBAIC02NjMsMTYgKzY1NiwxNyBAQAogCX0KIAogCS8qIEdldCB0aGUgaW5kZXggb2YgdGhlIGJvYXJkIGluIHRoZSBnbG9iYWwgbGlzdCAqLwotCWZvciAoYm9hcmRfcCA9IG1lNDAwMF9ib2FyZF9pbmZvX2xpc3QubmV4dCwgaSA9IDA7Ci0JICAgICBib2FyZF9wICE9ICZtZTQwMDBfYm9hcmRfaW5mb19saXN0OyBib2FyZF9wID0gYm9hcmRfcC0+bmV4dCwgaSsrKSB7CisJaSA9IDA7CisJbGlzdF9mb3JfZWFjaChib2FyZF9wLCAmbWU0MDAwX2JvYXJkX2luZm9fbGlzdCkgewogCQlpZiAoYm9hcmRfcCA9PSAmYm9hcmRfaW5mby0+bGlzdCkgewogCQkJYm9hcmRfaW5mby0+Ym9hcmRfY291bnQgPSBpOwogCQkJYnJlYWs7CiAJCX0KKwkJaSsrOwogCX0KIAlpZiAoYm9hcmRfcCA9PSAmbWU0MDAwX2JvYXJkX2luZm9fbGlzdCkgewogCQlwcmludGsoS0VSTl9FUlIKLQkJICAgICAgICJNRTQwMDA6aW5pdF9ib2FyZF9pbmZvKCk6Q2Fubm90IGdldCBpbmRleCBvZiBiYW9yZFxuIik7CisJCSAgICAgICAiTUU0MDAwOmluaXRfYm9hcmRfaW5mbygpOkNhbm5vdCBnZXQgaW5kZXggb2YgYm9hcmRcbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKQEAgLTg2MywxNiArODU3LDE0IEBACiAKIHN0YXRpYyB2b2lkIHJlbGVhc2VfYW9fY29udGV4dHMoc3RydWN0IG1lNDAwMF9pbmZvICpib2FyZF9pbmZvKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKmRhY19wOwotCXN0cnVjdCBtZTQwMDBfYW9fY29udGV4dCAqYW9fY29udGV4dDsKKwlzdHJ1Y3QgbWU0MDAwX2FvX2NvbnRleHQgKmFvX2NvbnRleHQsICphb19jb250ZXh0X3NhZmU7CiAKIAkvKiBDbGVhciBhbmFsb2cgb3V0cHV0IGNvbnRleHQgbGlzdCAqLwotCXdoaWxlICghbGlzdF9lbXB0eSgmYm9hcmRfaW5mby0+YW9fY29udGV4dF9saXN0KSkgewotCQlkYWNfcCA9IGJvYXJkX2luZm8tPmFvX2NvbnRleHRfbGlzdC5uZXh0OwotCQlhb19jb250ZXh0ID0gbGlzdF9lbnRyeShkYWNfcCwgc3RydWN0IG1lNDAwMF9hb19jb250ZXh0LCBsaXN0KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoYW9fY29udGV4dCwgYW9fY29udGV4dF9zYWZlLAorCQkJJmJvYXJkX2luZm8tPmFvX2NvbnRleHRfbGlzdCwgbGlzdCkgewogCQlmcmVlX2lycShhb19jb250ZXh0LT5pcnEsIGFvX2NvbnRleHQpOwogCQlrZnJlZShhb19jb250ZXh0LT5jaXJjX2J1Zi5idWYpOwotCQlsaXN0X2RlbChkYWNfcCk7CisJCWxpc3RfZGVsKCZhb19jb250ZXh0LT5saXN0KTsKIAkJa2ZyZWUoYW9fY29udGV4dCk7CiAJfQogfQpAQCAtMTE4MCw3ICsxMTcyLDcgQEAKIAogCS8qIFdhaXQgdW50aWwgL0lOSVQgcGluIGlzIHNldCAqLwogCXVkZWxheSgyMCk7Ci0JaWYgKCFpbmwoaW5mby0+cGx4X3JlZ2Jhc2UgKyBQTFhfSU5UQ1NSKSAmIDB4MjApIHsKKwlpZiAoIShpbmwoaW5mby0+cGx4X3JlZ2Jhc2UgKyBQTFhfSU5UQ1NSKSAmIDB4MjApKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiJXM6Q2FuJ3QgaW5pdCBYaWxpbnhcbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIC1FSU87CiAJfQpAQCAtMTMwMywxMiArMTI5NSwxMyBAQAogCQkgICAgICAgZGV2LCBtb2RlKTsKIAogCQkvKiBTZWFyY2ggZm9yIHRoZSBib2FyZCBjb250ZXh0ICovCi0JCWZvciAocHRyID0gbWU0MDAwX2JvYXJkX2luZm9fbGlzdC5uZXh0LCBpID0gMDsKLQkJICAgICBwdHIgIT0gJm1lNDAwMF9ib2FyZF9pbmZvX2xpc3Q7IHB0ciA9IHB0ci0+bmV4dCwgaSsrKSB7Ci0JCQlib2FyZF9pbmZvID0gbGlzdF9lbnRyeShwdHIsIHN0cnVjdCBtZTQwMDBfaW5mbywgbGlzdCk7CisJCWkgPSAwOworCQlsaXN0X2Zvcl9lYWNoKHB0ciwgJm1lNDAwMF9ib2FyZF9pbmZvX2xpc3QpIHsKIAkJCWlmIChpID09IGJvYXJkKQogCQkJCWJyZWFrOworCQkJaSsrOwogCQl9CisJCWJvYXJkX2luZm8gPSBsaXN0X2VudHJ5KHB0ciwgc3RydWN0IG1lNDAwMF9pbmZvLCBsaXN0KTsKIAogCQlpZiAocHRyID09ICZtZTQwMDBfYm9hcmRfaW5mb19saXN0KSB7CiAJCQlwcmludGsoS0VSTl9FUlIKQEAgLTEzMTgsMTQgKzEzMTEsMTMgQEAKIAkJfQogCiAJCS8qIFNlYXJjaCBmb3IgdGhlIGRhYyBjb250ZXh0ICovCi0JCWZvciAocHRyID0gYm9hcmRfaW5mby0+YW9fY29udGV4dF9saXN0Lm5leHQsIGkgPSAwOwotCQkgICAgIHB0ciAhPSAmYm9hcmRfaW5mby0+YW9fY29udGV4dF9saXN0OwotCQkgICAgIHB0ciA9IHB0ci0+bmV4dCwgaSsrKSB7Ci0JCQlhb19jb250ZXh0ID0gbGlzdF9lbnRyeShwdHIsIHN0cnVjdCBtZTQwMDBfYW9fY29udGV4dCwKLQkJCQkJCQkJCWxpc3QpOworCQlpID0gMDsKKwkJbGlzdF9mb3JfZWFjaChwdHIsICZib2FyZF9pbmZvLT5hb19jb250ZXh0X2xpc3QpIHsKIAkJCWlmIChpID09IGRldikKIAkJCQlicmVhazsKKwkJCWkrKzsKIAkJfQorCQlhb19jb250ZXh0ID0gbGlzdF9lbnRyeShwdHIsIHN0cnVjdCBtZTQwMDBfYW9fY29udGV4dCwgbGlzdCk7CiAKIAkJaWYgKHB0ciA9PSAmYm9hcmRfaW5mby0+YW9fY29udGV4dF9saXN0KSB7CiAJCQlwcmludGsoS0VSTl9FUlIKQEAgLTEzODQsMTIgKzEzNzYsMTMgQEAKIAkJUERFQlVHKCJtZTQwMDBfb3BlbigpOmFpIGJvYXJkID0gJWQgbW9kZSA9ICVkXG4iLCBib2FyZCwgbW9kZSk7CiAKIAkJLyogU2VhcmNoIGZvciB0aGUgYm9hcmQgY29udGV4dCAqLwotCQlmb3IgKHB0ciA9IG1lNDAwMF9ib2FyZF9pbmZvX2xpc3QubmV4dCwgaSA9IDA7Ci0JCSAgICAgcHRyICE9ICZtZTQwMDBfYm9hcmRfaW5mb19saXN0OyBwdHIgPSBwdHItPm5leHQsIGkrKykgewotCQkJYm9hcmRfaW5mbyA9IGxpc3RfZW50cnkocHRyLCBzdHJ1Y3QgbWU0MDAwX2luZm8sIGxpc3QpOworCQlpID0gMDsKKwkJbGlzdF9mb3JfZWFjaChwdHIsICZtZTQwMDBfYm9hcmRfaW5mb19saXN0KSB7CiAJCQlpZiAoaSA9PSBib2FyZCkKIAkJCQlicmVhazsKKwkJCWkrKzsKIAkJfQorCQlib2FyZF9pbmZvID0gbGlzdF9lbnRyeShwdHIsIHN0cnVjdCBtZTQwMDBfaW5mbywgbGlzdCk7CiAKIAkJaWYgKHB0ciA9PSAmbWU0MDAwX2JvYXJkX2luZm9fbGlzdCkgewogCQkJcHJpbnRrKEtFUk5fRVJSCkBAIC0xNDM4LDE0ICsxNDMxLDEyIEBACiAJCVBERUJVRygibWU0MDAwX29wZW4oKTpib2FyZCA9ICVkXG4iLCBib2FyZCk7CiAKIAkJLyogU2VhcmNoIGZvciB0aGUgYm9hcmQgY29udGV4dCAqLwotCQlmb3IgKHB0ciA9IG1lNDAwMF9ib2FyZF9pbmZvX2xpc3QubmV4dDsKLQkJICAgICBwdHIgIT0gJm1lNDAwMF9ib2FyZF9pbmZvX2xpc3Q7IHB0ciA9IHB0ci0+bmV4dCkgewotCQkJYm9hcmRfaW5mbyA9IGxpc3RfZW50cnkocHRyLCBzdHJ1Y3QgbWU0MDAwX2luZm8sIGxpc3QpOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGJvYXJkX2luZm8sICZtZTQwMDBfYm9hcmRfaW5mb19saXN0LCBsaXN0KSB7CiAJCQlpZiAoYm9hcmRfaW5mby0+Ym9hcmRfY291bnQgPT0gYm9hcmQpCiAJCQkJYnJlYWs7CiAJCX0KIAotCQlpZiAocHRyID09ICZtZTQwMDBfYm9hcmRfaW5mb19saXN0KSB7CisJCWlmICgmYm9hcmRfaW5mby0+bGlzdCA9PSAmbWU0MDAwX2JvYXJkX2luZm9fbGlzdCkgewogCQkJcHJpbnRrKEtFUk5fRVJSCiAJCQkgICAgICAgIk1FNDAwMDptZTQwMDBfb3BlbigpOkJvYXJkICVkIG5vdCBpbiBkZXZpY2UgbGlzdFxuIiwKIAkJCSAgICAgICBib2FyZCk7CkBAIC0xNDgzLDE0ICsxNDc0LDEyIEBACiAJCVBERUJVRygibWU0MDAwX29wZW4oKTpib2FyZCA9ICVkXG4iLCBib2FyZCk7CiAKIAkJLyogU2VhcmNoIGZvciB0aGUgYm9hcmQgY29udGV4dCAqLwotCQlmb3IgKHB0ciA9IG1lNDAwMF9ib2FyZF9pbmZvX2xpc3QubmV4dDsKLQkJICAgICBwdHIgIT0gJm1lNDAwMF9ib2FyZF9pbmZvX2xpc3Q7IHB0ciA9IHB0ci0+bmV4dCkgewotCQkJYm9hcmRfaW5mbyA9IGxpc3RfZW50cnkocHRyLCBzdHJ1Y3QgbWU0MDAwX2luZm8sIGxpc3QpOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGJvYXJkX2luZm8sICZtZTQwMDBfYm9hcmRfaW5mb19saXN0LCBsaXN0KSB7CiAJCQlpZiAoYm9hcmRfaW5mby0+Ym9hcmRfY291bnQgPT0gYm9hcmQpCiAJCQkJYnJlYWs7CiAJCX0KIAotCQlpZiAocHRyID09ICZtZTQwMDBfYm9hcmRfaW5mb19saXN0KSB7CisJCWlmICgmYm9hcmRfaW5mby0+bGlzdCA9PSAmbWU0MDAwX2JvYXJkX2luZm9fbGlzdCkgewogCQkJcHJpbnRrKEtFUk5fRVJSCiAJCQkgICAgICAgIk1FNDAwMDptZTQwMDBfb3BlbigpOkJvYXJkICVkIG5vdCBpbiBkZXZpY2UgbGlzdFxuIiwKIAkJCSAgICAgICBib2FyZCk7CkBAIC0xNTI2LDE0ICsxNTE1LDEyIEBACiAJCVBERUJVRygibWU0MDAwX29wZW4oKTpib2FyZCA9ICVkXG4iLCBib2FyZCk7CiAKIAkJLyogU2VhcmNoIGZvciB0aGUgYm9hcmQgY29udGV4dCAqLwotCQlmb3IgKHB0ciA9IG1lNDAwMF9ib2FyZF9pbmZvX2xpc3QubmV4dDsKLQkJICAgICBwdHIgIT0gJm1lNDAwMF9ib2FyZF9pbmZvX2xpc3Q7IHB0ciA9IHB0ci0+bmV4dCkgewotCQkJYm9hcmRfaW5mbyA9IGxpc3RfZW50cnkocHRyLCBzdHJ1Y3QgbWU0MDAwX2luZm8sIGxpc3QpOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGJvYXJkX2luZm8sICZtZTQwMDBfYm9hcmRfaW5mb19saXN0LCBsaXN0KSB7CiAJCQlpZiAoYm9hcmRfaW5mby0+Ym9hcmRfY291bnQgPT0gYm9hcmQpCiAJCQkJYnJlYWs7CiAJCX0KIAotCQlpZiAocHRyID09ICZtZTQwMDBfYm9hcmRfaW5mb19saXN0KSB7CisJCWlmICgmYm9hcmRfaW5mby0+bGlzdCA9PSAmbWU0MDAwX2JvYXJkX2luZm9fbGlzdCkgewogCQkJcHJpbnRrKEtFUk5fRVJSCiAJCQkgICAgICAgIk1FNDAwMDptZTQwMDBfb3BlbigpOkJvYXJkICVkIG5vdCBpbiBkZXZpY2UgbGlzdFxuIiwKIAkJCSAgICAgICBib2FyZCk7CkBAIC01OTU1LDcgKzU5NDIsNiBAQAogCiBzdGF0aWMgdm9pZCBfX2V4aXQgbWU0MDAwX21vZHVsZV9leGl0KHZvaWQpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqYm9hcmRfcDsKIAlzdHJ1Y3QgbWU0MDAwX2luZm8gKmJvYXJkX2luZm87CiAKIAlDQUxMX1BERUJVRygiY2xlYW51cF9tb2R1bGUoKSBpcyBleGVjdXRlZFxuIik7CkBAIC01OTc1LDkgKzU5NjEsNyBAQAogCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmbWU0MDAwX2RyaXZlcik7CiAKIAkvKiBSZXNldCB0aGUgYm9hcmRzICovCi0JZm9yIChib2FyZF9wID0gbWU0MDAwX2JvYXJkX2luZm9fbGlzdC5uZXh0OwotCSAgICAgYm9hcmRfcCAhPSAmbWU0MDAwX2JvYXJkX2luZm9fbGlzdDsgYm9hcmRfcCA9IGJvYXJkX3AtPm5leHQpIHsKLQkJYm9hcmRfaW5mbyA9IGxpc3RfZW50cnkoYm9hcmRfcCwgc3RydWN0IG1lNDAwMF9pbmZvLCBsaXN0KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGJvYXJkX2luZm8sICZtZTQwMDBfYm9hcmRfaW5mb19saXN0LCBsaXN0KSB7CiAJCW1lNDAwMF9yZXNldF9ib2FyZChib2FyZF9pbmZvKTsKIAl9CiAKQEAgLTU5OTIsNyArNTk3Niw2IEBACiAJaW50IGxlbiA9IDA7CiAJaW50IGxpbWl0ID0gY291bnQgLSAxMDAwOwogCXN0cnVjdCBtZTQwMDBfaW5mbyAqYm9hcmRfaW5mbzsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwdHI7CiAKIAlsZW4gKz0gc3ByaW50ZihidWYgKyBsZW4sICJcbk1FNDAwMCBEUklWRVIgVkVSU0lPTiAlWC4lWC4lWFxuXG4iLAogCQkgICAgICAgKE1FNDAwMF9EUklWRVJfVkVSU0lPTiAmIDB4RkYwMDAwKSA+PiAxNiwKQEAgLTYwMDAsMTEgKzU5ODMsNyBAQAogCQkgICAgICAgKE1FNDAwMF9EUklWRVJfVkVSU0lPTiAmIDB4RkYpKTsKIAogCS8qIFNlYXJjaCBmb3IgdGhlIGJvYXJkIGNvbnRleHQgKi8KLQlmb3IgKHB0ciA9IG1lNDAwMF9ib2FyZF9pbmZvX2xpc3QubmV4dDsKLQkgICAgIChwdHIgIT0gJm1lNDAwMF9ib2FyZF9pbmZvX2xpc3QpICYmIChsZW4gPCBsaW1pdCk7Ci0JICAgICBwdHIgPSBwdHItPm5leHQpIHsKLQkJYm9hcmRfaW5mbyA9IGxpc3RfZW50cnkocHRyLCBzdHJ1Y3QgbWU0MDAwX2luZm8sIGxpc3QpOwotCisJbGlzdF9mb3JfZWFjaF9lbnRyeShib2FyZF9pbmZvLCAmbWU0MDAwX2JvYXJkX2luZm9fbGlzdCwgbGlzdCkgewogCQlsZW4gKz0KIAkJICAgIHNwcmludGYoYnVmICsgbGVuLCAiQm9hcmQgbnVtYmVyICVkOlxuIiwKIAkJCSAgICBib2FyZF9pbmZvLT5ib2FyZF9jb3VudCk7CkBAIC02MTEwLDYgKzYwODksOCBAQAogCQkgICAgc3ByaW50ZihidWYgKyBsZW4sICJBTyAzIHN0YXR1cyByZWdpc3RlciA9IDB4JTA4WFxuIiwKIAkJCSAgICBpbmwoYm9hcmRfaW5mby0+bWU0MDAwX3JlZ2Jhc2UgKwogCQkJCU1FNDAwMF9BT18wM19TVEFUVVNfUkVHKSk7CisJCWlmIChsZW4gPj0gbGltaXQpCisJCQlicmVhazsKIAl9CiAKIAkqZW9mID0gMTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmRlZjgzZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9LY29uZmlnCkBAIC0wLDAgKzEsMTI3IEBACisjCisjIE1laWxoYXVzIGNvbmZpZ3VyYXRpb24KKyMKKworbWVudWNvbmZpZyBNRUlMSEFVUworCXRyaXN0YXRlICJNZWlsaGF1cyBzdXBwb3J0IgorCS0tLWhlbHAtLS0KKwkgIElmIHlvdSBoYXZlIGEgTWVpbGhhdXMgY2FyZCwgc2F5IFkgKG9yIE0pIGhlcmUuCisKKwkgIFlvdSBuZWVkIGJvdGggdGhpcyBkcml2ZXIsIGFuZCB0aGUgZHJpdmVyIGZvciB0aGUgcGFydGljdWxhcgorCSAgZGF0YSBjb2xsZWN0aW9uIGNhcmQuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuIFRoZSBtb2R1bGUgd2lsbAorCSAgYmUgY2FsbGVkIG1lbWFpbi4KKworaWYgTUVJTEhBVVMKKworY29uZmlnIE1FMDYwMAorCXRyaXN0YXRlICJNZWlsaGF1cyBNRS02MDAgc3VwcG9ydCIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIFBDSQorCWhlbHAKKwkgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIHRoZSBNZWlsaGF1cyBNRS02MDAgZmFtaWx5IG9mIGJvYXJkcworCSAgdGhhdCBkbyBkYXRhIGNvbGxlY3Rpb24gYW5kIG11bHRpcHVycG9zZSBJL08uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIG1lMDYwMC4KKworY29uZmlnIE1FMDkwMAorCXRyaXN0YXRlICJNZWlsaGF1cyBNRS05MDAgc3VwcG9ydCIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIFBDSQorCWhlbHAKKwkgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIHRoZSBNZWlsaGF1cyBNRS05MDAgZmFtaWx5IG9mIGJvYXJkcworCSAgdGhhdCBkbyBkYXRhIGNvbGxlY3Rpb24gYW5kIG11bHRpcHVycG9zZSBJL08uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIG1lMDkwMC4KKworY29uZmlnIE1FMTAwMAorCXRyaXN0YXRlICJNZWlsaGF1cyBNRS0xMDAwIHN1cHBvcnQiCisJZGVmYXVsdCBuCisJZGVwZW5kcyBvbiBQQ0kKKwloZWxwCisJICBUaGlzIGRyaXZlciBzdXBwb3J0cyB0aGUgTWVpbGhhdXMgTUUtMTAwMCBmYW1pbHkgb2YgYm9hcmRzCisJICB0aGF0IGRvIGRhdGEgY29sbGVjdGlvbiBhbmQgbXVsdGlwdXJwb3NlIEkvTy4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgbWUxMDAwLgorCitjb25maWcgTUUxNDAwCisJdHJpc3RhdGUgIk1laWxoYXVzIE1FLTE0MDAgc3VwcG9ydCIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIFBDSQorCWhlbHAKKwkgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIHRoZSBNZWlsaGF1cyBNRS0xNDAwIGZhbWlseSBvZiBib2FyZHMKKwkgIHRoYXQgZG8gZGF0YSBjb2xsZWN0aW9uIGFuZCBtdWx0aXB1cnBvc2UgSS9PLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBtZTE0MDAuCisKK2NvbmZpZyBNRTE2MDAKKwl0cmlzdGF0ZSAiTWVpbGhhdXMgTUUtMTYwMCBzdXBwb3J0IgorCWRlZmF1bHQgbgorCWRlcGVuZHMgb24gUENJCisJaGVscAorCSAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgdGhlIE1laWxoYXVzIE1FLTE2MDAgZmFtaWx5IG9mIGJvYXJkcworCSAgdGhhdCBkbyBkYXRhIGNvbGxlY3Rpb24gYW5kIG11bHRpcHVycG9zZSBJL08uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIG1lMTYwMC4KKworY29uZmlnIE1FNDYwMAorCXRyaXN0YXRlICJNZWlsaGF1cyBNRS00NjAwIHN1cHBvcnQiCisJZGVmYXVsdCBuCisJZGVwZW5kcyBvbiBQQ0kKKwloZWxwCisJICBUaGlzIGRyaXZlciBzdXBwb3J0cyB0aGUgTWVpbGhhdXMgTUUtNDYwMCBmYW1pbHkgb2YgYm9hcmRzCisJICB0aGF0IGRvIGRhdGEgY29sbGVjdGlvbiBhbmQgbXVsdGlwdXJwb3NlIEkvTy4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgbWU0NjAwLgorCitjb25maWcgTUU2MDAwCisJdHJpc3RhdGUgIk1laWxoYXVzIE1FLTYwMDAgc3VwcG9ydCIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIFBDSQorCWhlbHAKKwkgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIHRoZSBNZWlsaGF1cyBNRS02MDAwIGZhbWlseSBvZiBib2FyZHMKKwkgIHRoYXQgZG8gZGF0YSBjb2xsZWN0aW9uIGFuZCBtdWx0aXB1cnBvc2UgSS9PLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBtZTYwMDAuCisKK2NvbmZpZyBNRTgxMDAKKwl0cmlzdGF0ZSAiTWVpbGhhdXMgTUUtODEwMCBzdXBwb3J0IgorCWRlZmF1bHQgbgorCWRlcGVuZHMgb24gUENJCisJaGVscAorCSAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgdGhlIE1laWxoYXVzIE1FLTgxMDAgZmFtaWx5IG9mIGJvYXJkcworCSAgdGhhdCBkbyBkYXRhIGNvbGxlY3Rpb24gYW5kIG11bHRpcHVycG9zZSBJL08uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIG1lODEwMC4KKworY29uZmlnIE1FODIwMAorCXRyaXN0YXRlICJNZWlsaGF1cyBNRS04MjAwIHN1cHBvcnQiCisJZGVmYXVsdCBuCisJZGVwZW5kcyBvbiBQQ0kKKwloZWxwCisJICBUaGlzIGRyaXZlciBzdXBwb3J0cyB0aGUgTWVpbGhhdXMgTUUtODIwMCBmYW1pbHkgb2YgYm9hcmRzCisJICB0aGF0IGRvIGRhdGEgY29sbGVjdGlvbiBhbmQgbXVsdGlwdXJwb3NlIEkvTy4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgbWU4MjAwLgorCitjb25maWcgTUVEVU1NWQorCXRyaXN0YXRlICJNZWlsaGF1cyBkdW1teSBkcml2ZXIiCisJZGVmYXVsdCBuCisJZGVwZW5kcyBvbiBQQ0kKKwloZWxwCisJICBUaGlzIHByb3ZpZGVzIGEgZHVtbXkgZHJpdmVyIGZvciB0aGUgTWVpbGhhdXMgZHJpdmVyIHBhY2thZ2UKKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgbWVkdW1teS4KKworZW5kaWYgIyBNRUlMSEFVUwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL01ha2VmaWxlIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhYjJjMWMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvTWFrZWZpbGUKQEAgLTAsMCArMSw0MyBAQAorIworIyBNYWtlZmlsZSBmb3IgTWVpbGhhdXMgbGludXggZHJpdmVyIHN5c3RlbQorIworCitvYmotJChDT05GSUdfTUVJTEhBVVMpICs9IG1lbWFpbi5vCitvYmotJChDT05GSUdfTUUxNjAwKSArPSBtZTE2MDAubworb2JqLSQoQ09ORklHX01FMTAwMCkgKz0gbWUxMDAwLm8KK29iai0kKENPTkZJR19NRTE0MDApICs9IG1lMTQwMC5vCitvYmotJChDT05GSUdfTUU0NjAwKSArPSBtZTQ2MDAubworb2JqLSQoQ09ORklHX01FNjAwMCkgKz0gbWU2MDAwLm8KK29iai0kKENPTkZJR19NRTA2MDApICs9IG1lMDYwMC5vCitvYmotJChDT05GSUdfTUU4MTAwKSArPSBtZTgxMDAubworb2JqLSQoQ09ORklHX01FODIwMCkgKz0gbWU4MjAwLm8KK29iai0kKENPTkZJR19NRTA5MDApICs9IG1lMDkwMC5vCitvYmotJChDT05GSUdfTUVEVU1NWSkgKz0gbWVkdW1teS5vCisKKworbWUxNjAwLW9ianMgOj0gbWVkZXZpY2UubyBtZWRsaXN0Lm8gbWVkbG9jay5vIG1lMTYwMF9kZXZpY2UubworbWUxNjAwLW9ianMgKz0gbWVzdWJkZXZpY2UubyBtZXNsaXN0Lm8gbWVzbG9jay5vIG1lMTYwMF9hby5vCisKK21lMTAwMC1vYmpzIDo9IG1lZGV2aWNlLm8gbWVkbGlzdC5vIG1lZGxvY2subyBtZTEwMDBfZGV2aWNlLm8KK21lMTAwMC1vYmpzICs9IG1lc3ViZGV2aWNlLm8gbWVzbGlzdC5vIG1lc2xvY2subyBtZTEwMDBfZGlvLm8KKworbWUxNDAwLW9ianMgOj0gbWVkZXZpY2UubyBtZWRsaXN0Lm8gbWVkbG9jay5vIG1lMTQwMF9kZXZpY2UubworbWUxNDAwLW9ianMgKz0gbWVzdWJkZXZpY2UubyBtZXNsaXN0Lm8gbWVzbG9jay5vIG1lODI1NC5vIG1lODI1NS5vIG1lMTQwMF9leHRfaXJxLm8KKworbWU0NjAwLW9ianMgOj0gbWVkZXZpY2UubyBtZWRsaXN0Lm8gbWVkbG9jay5vIG1lZmlybXdhcmUubyBtZTQ2MDBfZGV2aWNlLm8KK21lNDYwMC1vYmpzICs9IG1lc3ViZGV2aWNlLm8gbWVzbGlzdC5vIG1lc2xvY2subyBtZTQ2MDBfZG8ubyBtZTQ2MDBfZGkubyBtZTQ2MDBfZGlvLm8gbWU4MjU0Lm8gbWU0NjAwX2FpLm8gbWU0NjAwX2FvLm8gbWU0NjAwX2V4dF9pcnEubworCittZTYwMDAtb2JqcyA6PSBtZWRldmljZS5vIG1lZGxpc3QubyBtZWRsb2NrLm8gbWVmaXJtd2FyZS5vIG1lNjAwMF9kZXZpY2UubworbWU2MDAwLW9ianMgKz0gbWVzdWJkZXZpY2UubyBtZXNsaXN0Lm8gbWVzbG9jay5vIG1lNjAwMF9kaW8ubyBtZTYwMDBfYW8ubworCittZTA2MDAtb2JqcyA6PSBtZWRldmljZS5vIG1lZGxpc3QubyBtZWRsb2NrLm8gbWUwNjAwX2RldmljZS5vCittZTA2MDAtb2JqcyArPSBtZXN1YmRldmljZS5vIG1lc2xpc3QubyBtZXNsb2NrLm8gbWUwNjAwX3JlbGF5Lm8gbWUwNjAwX3R0bGkubyBtZTA2MDBfb3B0b2kubyBtZTA2MDBfZGlvLm8gbWUwNjAwX2V4dF9pcnEubworCittZTgxMDAtb2JqcyA6PSBtZWRldmljZS5vIG1lZGxpc3QubyBtZWRsb2NrLm8gbWU4MTAwX2RldmljZS5vCittZTgxMDAtb2JqcyArPSBtZXN1YmRldmljZS5vIG1lc2xpc3QubyBtZXNsb2NrLm8gbWU4MTAwX2RpLm8gbWU4MTAwX2RvLm8gbWU4MjU0Lm8KKworbWU4MjAwLW9ianMgOj0gbWVkZXZpY2UubyBtZWRsaXN0Lm8gbWVkbG9jay5vIG1lODIwMF9kZXZpY2UubworbWU4MjAwLW9ianMgKz0gbWVzdWJkZXZpY2UubyBtZXNsaXN0Lm8gbWVzbG9jay5vIG1lODIwMF9kaS5vIG1lODIwMF9kby5vIG1lODIwMF9kaW8ubworCittZTA5MDAtb2JqcyA6PSBtZWRldmljZS5vIG1lZGxpc3QubyBtZWRsb2NrLm8gbWUwOTAwX2RldmljZS5vCittZTA5MDAtb2JqcyArPSBtZXN1YmRldmljZS5vIG1lc2xpc3QubyBtZXNsb2NrLm8gbWUwOTAwX2RvLm8gbWUwOTAwX2RpLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9UT0RPIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL1RPRE8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmVjMjUyMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9UT0RPCkBAIC0wLDAgKzEsMTAgQEAKK1RPRE86CisJLSBjaGVja3BhdGNoLnBsIGNsZWFudXBzCisJLSBzcGFyc2UgaXNzdWVzCisJLSBMaW5kZW50CisJLSBhdWRpdCB1c2Vyc3BhY2UgaW50ZXJmYWNlCisJLSBoYW5kbGUgZmlybXdhcmUgcHJvcGVybHkKKwktIHBvc3NpYmxlIGNvbWVkaSBtZXJnZQorCitQbGVhc2Ugc2VuZCBjbGVhbnVwIHBhdGNoZXMgdG8gR3JlZyBLcm9haC1IYXJ0bWFuIDxncmVnQGtyb2FoLmNvbT4KK2FuZCBDQzogRGF2aWQgS2lsaWFuaSA8bWFpbEBkYXZpZGtpbGlhbmkuZGU+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUwNjAwX2RldmljZS5jIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMDYwMF9kZXZpY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTUwZTQ3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMDYwMF9kZXZpY2UuYwpAQCAtMCwwICsxLDIxNSBAQAorLyoqCisgKiBAZmlsZSBtZTA2MDBfZGV2aWNlLmMKKyAqCisgKiBAYnJpZWYgTUUtNjMwIGRldmljZSBjbGFzcyBpbXBsZW1lbnRhdGlvbi4KKyAqIEBub3RlIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKiBAYXV0aG9yIEd1ZW50ZXIgR2ViaGFyZHQKKyAqIEBhdXRob3IgS3J6eXN6dG9mIEdhbnR6a2UJKGsuZ2FudHprZUBtZWlsaGF1cy5kZSkKKyAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9fS0VSTkVMX18KKyMgIGRlZmluZSBfX0tFUk5FTF9fCisjZW5kaWYKKworI2lmbmRlZiBNT0RVTEUKKyMgIGRlZmluZSBNT0RVTEUKKyNlbmRpZgorCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKKyNpbmNsdWRlICJtZWlkcy5oIgorI2luY2x1ZGUgIm1lZXJyb3IuaCIKKyNpbmNsdWRlICJtZWNvbW1vbi5oIgorI2luY2x1ZGUgIm1laW50ZXJuYWwuaCIKKworI2luY2x1ZGUgIm1lZGVidWcuaCIKKyNpbmNsdWRlICJtZWRldmljZS5oIgorI2luY2x1ZGUgIm1lMDYwMF9kZXZpY2UuaCIKKyNpbmNsdWRlICJtZXN1YmRldmljZS5oIgorI2luY2x1ZGUgIm1lMDYwMF9yZWxheS5oIgorI2luY2x1ZGUgIm1lMDYwMF90dGxpLmgiCisjaW5jbHVkZSAibWUwNjAwX29wdG9pLmgiCisjaW5jbHVkZSAibWUwNjAwX2Rpby5oIgorI2luY2x1ZGUgIm1lMDYwMF9leHRfaXJxLmgiCisKK21lX2RldmljZV90ICptZTA2MDBfcGNpX2NvbnN0cnVjdG9yKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2aWNlKQoreworCW1lMDYwMF9kZXZpY2VfdCAqbWUwNjAwX2RldmljZTsKKwltZV9zdWJkZXZpY2VfdCAqc3ViZGV2aWNlOworCXVuc2lnbmVkIGludCB2ZXJzaW9uX2lkeDsKKwlpbnQgZXJyOworCWludCBpOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJLy8gQWxsb2NhdGUgc3RydWN0dXJlIGZvciBkZXZpY2UgaW5zdGFuY2UuCisJbWUwNjAwX2RldmljZSA9IGttYWxsb2Moc2l6ZW9mKG1lMDYwMF9kZXZpY2VfdCksIEdGUF9LRVJORUwpOworCisJaWYgKCFtZTA2MDBfZGV2aWNlKSB7CisJCVBFUlJPUigiQ2Fubm90IGdldCBtZW1vcnkgZm9yIGRldmljZSBpbnN0YW5jZS5cbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwltZW1zZXQobWUwNjAwX2RldmljZSwgMCwgc2l6ZW9mKG1lMDYwMF9kZXZpY2VfdCkpOworCisJLy8gSW5pdGlhbGl6ZSBiYXNlIGNsYXNzIHN0cnVjdHVyZS4KKwllcnIgPSBtZV9kZXZpY2VfcGNpX2luaXQoKG1lX2RldmljZV90ICopIG1lMDYwMF9kZXZpY2UsIHBjaV9kZXZpY2UpOworCisJaWYgKGVycikgeworCQlrZnJlZShtZTA2MDBfZGV2aWNlKTsKKwkJUEVSUk9SKCJDYW5ub3QgaW5pdGlhbGl6ZSBkZXZpY2UgYmFzZSBjbGFzcy5cbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKiBHZXQgdGhlIGluZGV4IGluIHRoZSBkZXZpY2UgdmVyc2lvbiBpbmZvcm1hdGlvbiB0YWJsZS4gKi8KKwl2ZXJzaW9uX2lkeCA9CisJICAgIG1lMDYwMF92ZXJzaW9uc19nZXRfZGV2aWNlX2luZGV4KG1lMDYwMF9kZXZpY2UtPmJhc2UuaW5mby5wY2kuCisJCQkJCSAgICAgZGV2aWNlX2lkKTsKKworCS8vIEluaXRpYWxpemUgc3BpbiBsb2NrIC4KKwlzcGluX2xvY2tfaW5pdCgmbWUwNjAwX2RldmljZS0+ZGlvX2N0cmxfcmVnX2xvY2spOworCXNwaW5fbG9ja19pbml0KCZtZTA2MDBfZGV2aWNlLT5pbnRjc3JfbG9jayk7CisKKwkvLyBDcmVhdGUgc3ViZGV2aWNlIGluc3RhbmNlcy4KKworCWZvciAoaSA9IDA7IGkgPCBtZTA2MDBfdmVyc2lvbnNbdmVyc2lvbl9pZHhdLm9wdG9pX3N1YmRldmljZXM7IGkrKykgeworCQlzdWJkZXZpY2UgPQorCQkgICAgKG1lX3N1YmRldmljZV90ICopIG1lMDYwMF9vcHRvaV9jb25zdHJ1Y3RvcihtZTA2MDBfZGV2aWNlLT4KKwkJCQkJCQkJYmFzZS5pbmZvLnBjaS4KKwkJCQkJCQkJcmVnX2Jhc2VzWzJdKTsKKworCQlpZiAoIXN1YmRldmljZSkgeworCQkJbWVfZGV2aWNlX2RlaW5pdCgobWVfZGV2aWNlX3QgKikgbWUwNjAwX2RldmljZSk7CisJCQlrZnJlZShtZTA2MDBfZGV2aWNlKTsKKwkJCVBFUlJPUigiQ2Fubm90IGdldCBtZW1vcnkgZm9yIHN1YmRldmljZS5cbiIpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKworCQltZV9zbGlzdF9hZGRfc3ViZGV2aWNlX3RhaWwoJm1lMDYwMF9kZXZpY2UtPmJhc2Uuc2xpc3QsCisJCQkJCSAgICBzdWJkZXZpY2UpOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBtZTA2MDBfdmVyc2lvbnNbdmVyc2lvbl9pZHhdLnJlbGF5X3N1YmRldmljZXM7IGkrKykgeworCQlzdWJkZXZpY2UgPQorCQkgICAgKG1lX3N1YmRldmljZV90ICopIG1lMDYwMF9yZWxheV9jb25zdHJ1Y3RvcihtZTA2MDBfZGV2aWNlLT4KKwkJCQkJCQkJYmFzZS5pbmZvLnBjaS4KKwkJCQkJCQkJcmVnX2Jhc2VzWzJdKTsKKworCQlpZiAoIXN1YmRldmljZSkgeworCQkJbWVfZGV2aWNlX2RlaW5pdCgobWVfZGV2aWNlX3QgKikgbWUwNjAwX2RldmljZSk7CisJCQlrZnJlZShtZTA2MDBfZGV2aWNlKTsKKwkJCVBFUlJPUigiQ2Fubm90IGdldCBtZW1vcnkgZm9yIHN1YmRldmljZS5cbiIpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKworCQltZV9zbGlzdF9hZGRfc3ViZGV2aWNlX3RhaWwoJm1lMDYwMF9kZXZpY2UtPmJhc2Uuc2xpc3QsCisJCQkJCSAgICBzdWJkZXZpY2UpOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBtZTA2MDBfdmVyc2lvbnNbdmVyc2lvbl9pZHhdLnR0bGlfc3ViZGV2aWNlczsgaSsrKSB7CisJCXN1YmRldmljZSA9CisJCSAgICAobWVfc3ViZGV2aWNlX3QgKikgbWUwNjAwX3R0bGlfY29uc3RydWN0b3IobWUwNjAwX2RldmljZS0+CisJCQkJCQkJICAgICAgIGJhc2UuaW5mby5wY2kuCisJCQkJCQkJICAgICAgIHJlZ19iYXNlc1syXSk7CisKKwkJaWYgKCFzdWJkZXZpY2UpIHsKKwkJCW1lX2RldmljZV9kZWluaXQoKG1lX2RldmljZV90ICopIG1lMDYwMF9kZXZpY2UpOworCQkJa2ZyZWUobWUwNjAwX2RldmljZSk7CisJCQlQRVJST1IoIkNhbm5vdCBnZXQgbWVtb3J5IGZvciBzdWJkZXZpY2UuXG4iKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisKKwkJbWVfc2xpc3RfYWRkX3N1YmRldmljZV90YWlsKCZtZTA2MDBfZGV2aWNlLT5iYXNlLnNsaXN0LAorCQkJCQkgICAgc3ViZGV2aWNlKTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgbWUwNjAwX3ZlcnNpb25zW3ZlcnNpb25faWR4XS5kaW9fc3ViZGV2aWNlczsgaSsrKSB7CisJCXN1YmRldmljZSA9CisJCSAgICAobWVfc3ViZGV2aWNlX3QgKikgbWUwNjAwX2Rpb19jb25zdHJ1Y3RvcihtZTA2MDBfZGV2aWNlLT4KKwkJCQkJCQkgICAgICBiYXNlLmluZm8ucGNpLgorCQkJCQkJCSAgICAgIHJlZ19iYXNlc1syXSwgaSwKKwkJCQkJCQkgICAgICAmbWUwNjAwX2RldmljZS0+CisJCQkJCQkJICAgICAgZGlvX2N0cmxfcmVnX2xvY2spOworCisJCWlmICghc3ViZGV2aWNlKSB7CisJCQltZV9kZXZpY2VfZGVpbml0KChtZV9kZXZpY2VfdCAqKSBtZTA2MDBfZGV2aWNlKTsKKwkJCWtmcmVlKG1lMDYwMF9kZXZpY2UpOworCQkJUEVSUk9SKCJDYW5ub3QgZ2V0IG1lbW9yeSBmb3Igc3ViZGV2aWNlLlxuIik7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJCW1lX3NsaXN0X2FkZF9zdWJkZXZpY2VfdGFpbCgmbWUwNjAwX2RldmljZS0+YmFzZS5zbGlzdCwKKwkJCQkJICAgIHN1YmRldmljZSk7CisJfQorCisJZm9yIChpID0gMDsgaSA8IG1lMDYwMF92ZXJzaW9uc1t2ZXJzaW9uX2lkeF0uZXh0X2lycV9zdWJkZXZpY2VzOyBpKyspIHsKKwkJc3ViZGV2aWNlID0KKwkJICAgIChtZV9zdWJkZXZpY2VfdCAqKQorCQkgICAgbWUwNjAwX2V4dF9pcnFfY29uc3RydWN0b3IobWUwNjAwX2RldmljZS0+YmFzZS5pbmZvLnBjaS4KKwkJCQkJICAgICAgIHJlZ19iYXNlc1sxXSwKKwkJCQkJICAgICAgIG1lMDYwMF9kZXZpY2UtPmJhc2UuaW5mby5wY2kuCisJCQkJCSAgICAgICByZWdfYmFzZXNbMl0sCisJCQkJCSAgICAgICAmbWUwNjAwX2RldmljZS0+aW50Y3NyX2xvY2ssIGksCisJCQkJCSAgICAgICBtZTA2MDBfZGV2aWNlLT5iYXNlLmlycSk7CisKKwkJaWYgKCFzdWJkZXZpY2UpIHsKKwkJCW1lX2RldmljZV9kZWluaXQoKG1lX2RldmljZV90ICopIG1lMDYwMF9kZXZpY2UpOworCQkJa2ZyZWUobWUwNjAwX2RldmljZSk7CisJCQlQRVJST1IoIkNhbm5vdCBnZXQgbWVtb3J5IGZvciBzdWJkZXZpY2UuXG4iKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisKKwkJbWVfc2xpc3RfYWRkX3N1YmRldmljZV90YWlsKCZtZTA2MDBfZGV2aWNlLT5iYXNlLnNsaXN0LAorCQkJCQkgICAgc3ViZGV2aWNlKTsKKwl9CisKKwlyZXR1cm4gKG1lX2RldmljZV90ICopIG1lMDYwMF9kZXZpY2U7Cit9CisKKy8vIEluaXQgYW5kIGV4aXQgb2YgbW9kdWxlLgorCitzdGF0aWMgaW50IF9faW5pdCBtZTA2MDBfaW5pdCh2b2lkKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IG1lMDYwMF9leGl0KHZvaWQpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworfQorCittb2R1bGVfaW5pdChtZTA2MDBfaW5pdCk7CisKK21vZHVsZV9leGl0KG1lMDYwMF9leGl0KTsKKworLy8gQWRtaW5pc3RyYXRpdmUgc3R1ZmYgZm9yIG1vZGluZm8uCitNT0RVTEVfQVVUSE9SCisgICAgKCJHdWVudGVyIEdlYmhhcmR0IDxnLmdlYmhhcmR0QG1laWxoYXVzLmRlPiAmIEtyenlzenRvZiBHYW50emtlIDxrLmdhbnR6a2VAbWVpbGhhdXMuZGU+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkRldmljZSBEcml2ZXIgTW9kdWxlIGZvciBNRS02eHggRGV2aWNlIik7CitNT0RVTEVfU1VQUE9SVEVEX0RFVklDRSgiTWVpbGhhdXMgTUUtNnh4IERldmljZXMiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworLy8gRXhwb3J0IHRoZSBjb25zdHJ1Y3Rvci4KK0VYUE9SVF9TWU1CT0wobWUwNjAwX3BjaV9jb25zdHJ1Y3Rvcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUwNjAwX2RldmljZS5oIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMDYwMF9kZXZpY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTNhOGFlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMDYwMF9kZXZpY2UuaApAQCAtMCwwICsxLDk3IEBACisvKioKKyAqIEBmaWxlIG1lMDYwMF9kZXZpY2UuaAorICoKKyAqIEBicmllZiBNRS02MzAgZGV2aWNlIGNsYXNzLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX01FMDYwMF9ERVZJQ0VfSAorI2RlZmluZSBfTUUwNjAwX0RFVklDRV9ICisKKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorCisjaW5jbHVkZSAibWVkZXZpY2UuaCIKKworI2lmZGVmIF9fS0VSTkVMX18KKworLyoqCisgKiBAYnJpZWYgU3RydWN0dXJlIGhvbGRpbmcgTUUtNjMwIGRldmljZSBjYXBhYmlsaXRpZXMuCisgKi8KK3R5cGVkZWYgc3RydWN0IG1lMDYwMF92ZXJzaW9uIHsKKwl1aW50MTZfdCBkZXZpY2VfaWQ7CisJdW5zaWduZWQgaW50IHJlbGF5X3N1YmRldmljZXM7CisJdW5zaWduZWQgaW50IHR0bGlfc3ViZGV2aWNlczsKKwl1bnNpZ25lZCBpbnQgb3B0b2lfc3ViZGV2aWNlczsKKwl1bnNpZ25lZCBpbnQgZGlvX3N1YmRldmljZXM7CisJdW5zaWduZWQgaW50IGV4dF9pcnFfc3ViZGV2aWNlczsKK30gbWUwNjAwX3ZlcnNpb25fdDsKKworLyoqCisgKiBAYnJpZWYgRGV2aWNlIGNhcGFiaWxpdGllcy4KKyAqLworc3RhdGljIG1lMDYwMF92ZXJzaW9uX3QgbWUwNjAwX3ZlcnNpb25zW10gPSB7CisJe1BDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUwNjMwLCAxLCAxLCAxLCAyLCAyfSwKKwl7MH0sCit9OworCisjZGVmaW5lIE1FMDYwMF9ERVZJQ0VfVkVSU0lPTlMgKHNpemVvZihtZTA2MDBfdmVyc2lvbnMpIC8gc2l6ZW9mKG1lMDYwMF92ZXJzaW9uX3QpIC0gMSkJLyoqPCBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZW50cmllcyBpbiAjbWUwNjAwX3ZlcnNpb25zLiAqLworCisvKioKKyAqIEBicmllZiBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgZGV2aWNlIGVudHJ5IGluICNtZTA2MDBfdmVyc2lvbnMuCisgKgorICogQHBhcmFtIGRldmljZV9pZCBUaGUgUENJIGRldmljZSBpZCBvZiB0aGUgZGV2aWNlIHRvIHF1ZXJ5LgorICogQHJldHVybiBUaGUgaW5kZXggb2YgdGhlIGRldmljZSBpbiAjbWUwNjAwX3ZlcnNpb25zLgorICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBtZTA2MDBfdmVyc2lvbnNfZ2V0X2RldmljZV9pbmRleCh1aW50MTZfdCBkZXZpY2VfaWQpCit7CisJdW5zaWduZWQgaW50IGk7CisJZm9yIChpID0gMDsgaSA8IE1FMDYwMF9ERVZJQ0VfVkVSU0lPTlM7IGkrKykKKwkJaWYgKG1lMDYwMF92ZXJzaW9uc1tpXS5kZXZpY2VfaWQgPT0gZGV2aWNlX2lkKQorCQkJYnJlYWs7CisJcmV0dXJuIGk7Cit9CisKKy8qKgorICogQGJyaWVmIFRoZSBNRS02MzAgZGV2aWNlIGNsYXNzIHN0cnVjdHVyZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgbWUwNjAwX2RldmljZSB7CisJbWVfZGV2aWNlX3QgYmFzZTsJCQkvKio8IFRoZSBNZWlsaGF1cyBkZXZpY2UgYmFzZSBjbGFzcy4gKi8KKworCS8qIENoaWxkIGNsYXNzIGF0dHJpYnV0ZXMuICovCisJc3BpbmxvY2tfdCBkaW9fY3RybF9yZWdfbG9jazsKKwlzcGlubG9ja190IGludGNzcl9sb2NrOworfSBtZTA2MDBfZGV2aWNlX3Q7CisKKy8qKgorICogQGJyaWVmIFRoZSBNRS02MzAgZGV2aWNlIGNsYXNzIGNvbnN0cnVjdG9yLgorICoKKyAqIEBwYXJhbSBwY2lfZGV2aWNlIFRoZSBwY2kgZGV2aWNlIHN0cnVjdHVyZSBnaXZlbiBieSB0aGUgUENJIHN1YnN5c3RlbS4KKyAqCisgKiBAcmV0dXJuIE9uIHN1Y2NlcyBhIG5ldyBNRS02MzAgZGV2aWNlIGluc3RhbmNlLiBcbgorICogICAgICAgICBOVUxMIG9uIGVycm9yLgorICovCittZV9kZXZpY2VfdCAqbWUwNjAwX3BjaV9jb25zdHJ1Y3RvcihzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldmljZSkKKyAgICBfX2F0dHJpYnV0ZV9fICgod2VhaykpOworCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMDYwMF9kaW8uYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTA2MDBfZGlvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2EyNzc1NwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTA2MDBfZGlvLmMKQEAgLTAsMCArMSw0MTUgQEAKKy8qKgorICogQGZpbGUgbWUwNjAwX2Rpby5jCisgKgorICogQGJyaWVmIE1FLTYzMCBkaWdpdGFsIGlucHV0L291dHB1dCBzdWJkZXZpY2UgaW5zdGFuY2UuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKiBAYXV0aG9yIEtyenlzenRvZiBHYW50emtlCShrLmdhbnR6a2VAbWVpbGhhdXMuZGUpCisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0tFUk5FTF9fCisjICBkZWZpbmUgX19LRVJORUxfXworI2VuZGlmCisKKy8qCisgKiBJbmNsdWRlcworICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjaW5jbHVkZSAibWVkZWZpbmVzLmgiCisjaW5jbHVkZSAibWVpbnRlcm5hbC5oIgorI2luY2x1ZGUgIm1lZXJyb3IuaCIKKworI2luY2x1ZGUgIm1lZGVidWcuaCIKKyNpbmNsdWRlICJtZTA2MDBfZGlvX3JlZy5oIgorI2luY2x1ZGUgIm1lMDYwMF9kaW8uaCIKKworLyoKKyAqIERlZmluZXMKKyAqLworCisvKgorICogRnVuY3Rpb25zCisgKi8KKworc3RhdGljIGludCBtZTA2MDBfZGlvX2lvX3Jlc2V0X3N1YmRldmljZShzdHJ1Y3QgbWVfc3ViZGV2aWNlICpzdWJkZXZpY2UsCisJCQkJCSBzdHJ1Y3QgZmlsZSAqZmlsZXAsIGludCBmbGFncykKK3sKKwltZTA2MDBfZGlvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwl1aW50OF90IG1vZGU7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbnN0YW5jZSA9IChtZTA2MDBfZGlvX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCWlmIChmbGFncykgeworCQlQRVJST1IoIkludmFsaWQgZmxhZyBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJfQorCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJc3Bpbl9sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCXNwaW5fbG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisJbW9kZSA9IGluYihpbnN0YW5jZS0+Y3RybF9yZWcpOworCW1vZGUgJj0gfigweDMgPDwgKGluc3RhbmNlLT5kaW9faWR4ICogMikpOworCW91dGIobW9kZSwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgbW9kZSk7CisJc3Bpbl91bmxvY2soaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2spOworCisJb3V0YigweDAwLCBpbnN0YW5jZS0+cG9ydF9yZWcpOworCVBERUJVR19SRUcoInBvcnRfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPnBvcnRfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCAweDAwKTsKKwlzcGluX3VubG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWUwNjAwX2Rpb19pb19zaW5nbGVfY29uZmlnKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgICAgIGludCBjaGFubmVsLAorCQkJCSAgICAgICBpbnQgc2luZ2xlX2NvbmZpZywKKwkJCQkgICAgICAgaW50IHJlZiwKKwkJCQkgICAgICAgaW50IHRyaWdfY2hhbiwKKwkJCQkgICAgICAgaW50IHRyaWdfdHlwZSwgaW50IHRyaWdfZWRnZSwgaW50IGZsYWdzKQoreworCW1lMDYwMF9kaW9fc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCXVpbnQ4X3QgbW9kZTsKKwlpbnQgc2l6ZSA9CisJICAgIGZsYWdzICYgKE1FX0lPX1NJTkdMRV9DT05GSUdfRElPX0JJVCB8IE1FX0lPX1NJTkdMRV9DT05GSUdfRElPX0JZVEUKKwkJICAgICB8IE1FX0lPX1NJTkdMRV9DT05GSUdfRElPX1dPUkQgfAorCQkgICAgIE1FX0lPX1NJTkdMRV9DT05GSUdfRElPX0RXT1JEKTsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lMDYwMF9kaW9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJc3Bpbl9sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCXNwaW5fbG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisJbW9kZSA9IGluYihpbnN0YW5jZS0+Y3RybF9yZWcpOworCXN3aXRjaCAoc2l6ZSkgeworCWNhc2UgTUVfSU9fU0lOR0xFX0NPTkZJR19OT19GTEFHUzoKKwljYXNlIE1FX0lPX1NJTkdMRV9DT05GSUdfRElPX0JZVEU6CisJCWlmIChjaGFubmVsID09IDApIHsKKwkJCWlmIChzaW5nbGVfY29uZmlnID09IE1FX1NJTkdMRV9DT05GSUdfRElPX0lOUFVUKSB7CisJCQkJbW9kZSAmPQorCQkJCSAgICB+KChNRTA2MDBfRElPX0NPTkZJR19CSVRfT1VUXzApIDw8CisJCQkJICAgICAgKGluc3RhbmNlLT5kaW9faWR4ICogMikpOworCQkJfSBlbHNlIGlmIChzaW5nbGVfY29uZmlnID09IE1FX1NJTkdMRV9DT05GSUdfRElPX09VVFBVVCkgeworCQkJCW1vZGUgJj0KKwkJCQkgICAgfigoTUUwNjAwX0RJT19DT05GSUdfQklUX09VVF8wKSA8PAorCQkJCSAgICAgIChpbnN0YW5jZS0+ZGlvX2lkeCAqIDIpKTsKKwkJCQltb2RlIHw9CisJCQkJICAgIE1FMDYwMF9ESU9fQ09ORklHX0JJVF9PVVRfMCA8PCAoaW5zdGFuY2UtPgorCQkJCQkJCQkgICAgZGlvX2lkeCAqCisJCQkJCQkJCSAgICAyKTsKKwkJCX0gZWxzZSB7CisJCQkJUEVSUk9SCisJCQkJICAgICgiSW52YWxpZCBwb3J0IGNvbmZpZ3VyYXRpb24gc3BlY2lmaWVkLlxuIik7CisJCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9TSU5HTEVfQ09ORklHOworCQkJfQorCQl9IGVsc2UgeworCQkJUEVSUk9SKCJJbnZhbGlkIGNoYW5uZWwgbnVtYmVyLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlQRVJST1IoIkludmFsaWQgZmxhZ3MuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlpZiAoIWVycikgeworCQlvdXRiKG1vZGUsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIG1vZGUpOworCX0KKwlzcGluX3VubG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisJc3Bpbl91bmxvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWUwNjAwX2Rpb19pb19zaW5nbGVfcmVhZChtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgIGludCBjaGFubmVsLAorCQkJCSAgICAgaW50ICp2YWx1ZSwgaW50IHRpbWVfb3V0LCBpbnQgZmxhZ3MpCit7CisJbWUwNjAwX2Rpb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJdWludDhfdCBtb2RlOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJaW5zdGFuY2UgPSAobWUwNjAwX2Rpb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlzcGluX2xvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisJc3Bpbl9sb2NrKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrKTsKKwlzd2l0Y2ggKGZsYWdzKSB7CisJY2FzZSBNRV9JT19TSU5HTEVfVFlQRV9ESU9fQklUOgorCQlpZiAoKGNoYW5uZWwgPj0gMCkgJiYgKGNoYW5uZWwgPCA4KSkgeworCQkJbW9kZSA9CisJCQkgICAgaW5iKGluc3RhbmNlLT4KKwkJCQljdHJsX3JlZykgJiAoKE1FMDYwMF9ESU9fQ09ORklHX0JJVF9PVVRfMCkgPDwKKwkJCQkJICAgICAoaW5zdGFuY2UtPmRpb19pZHggKiAyKSk7CisKKwkJCWlmICgobW9kZSA9PQorCQkJICAgICAoTUUwNjAwX0RJT19DT05GSUdfQklUX09VVF8wIDw8CisJCQkgICAgICAoaW5zdGFuY2UtPmRpb19pZHggKiAyKSkpIHx8ICFtb2RlKSB7CisJCQkJKnZhbHVlID0KKwkJCQkgICAgaW5iKGluc3RhbmNlLT4KKwkJCQkJcG9ydF9yZWcpICYgKDB4MDAwMSA8PCBjaGFubmVsKTsKKwkJCX0gZWxzZSB7CisJCQkJUEVSUk9SKCJQb3J0IG5vdCBpbiBvdXRwdXQgb3IgaW5wdXQgbW9kZS5cbiIpOworCQkJCWVyciA9IE1FX0VSUk5PX1BSRVZJT1VTX0NPTkZJRzsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCVBFUlJPUigiSW52YWxpZCBiaXQgbnVtYmVyIHNwZWNpZmllZC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCQl9CisKKwkJYnJlYWs7CisKKwljYXNlIE1FX0lPX1NJTkdMRV9OT19GTEFHUzoKKwljYXNlIE1FX0lPX1NJTkdMRV9UWVBFX0RJT19CWVRFOgorCQlpZiAoY2hhbm5lbCA9PSAwKSB7CisJCQltb2RlID0KKwkJCSAgICBpbmIoaW5zdGFuY2UtPgorCQkJCWN0cmxfcmVnKSAmICgoTUUwNjAwX0RJT19DT05GSUdfQklUX09VVF8wKSA8PAorCQkJCQkgICAgIChpbnN0YW5jZS0+ZGlvX2lkeCAqIDIpKTsKKworCQkJaWYgKChtb2RlID09CisJCQkgICAgIChNRTA2MDBfRElPX0NPTkZJR19CSVRfT1VUXzAgPDwKKwkJCSAgICAgIChpbnN0YW5jZS0+ZGlvX2lkeCAqIDIpKSkgfHwgIW1vZGUpIHsKKwkJCQkqdmFsdWUgPSBpbmIoaW5zdGFuY2UtPnBvcnRfcmVnKSAmIDB4MDBGRjsKKwkJCX0gZWxzZSB7CisJCQkJUEVSUk9SKCJQb3J0IG5vdCBpbiBvdXRwdXQgb3IgaW5wdXQgbW9kZS5cbiIpOworCQkJCWVyciA9IE1FX0VSUk5PX1BSRVZJT1VTX0NPTkZJRzsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCVBFUlJPUigiSW52YWxpZCBieXRlIG51bWJlciBzcGVjaWZpZWQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwkJfQorCisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWdzIHNwZWNpZmllZC5cbiIpOworCisJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisKKwkJYnJlYWs7CisJfQorCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrKTsKKwlzcGluX3VubG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZTA2MDBfZGlvX2lvX3NpbmdsZV93cml0ZShtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgICAgaW50IGNoYW5uZWwsCisJCQkJICAgICAgaW50IHZhbHVlLCBpbnQgdGltZV9vdXQsIGludCBmbGFncykKK3sKKwltZTA2MDBfZGlvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwl1aW50OF90IG1vZGU7CisJdWludDhfdCBieXRlOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJaW5zdGFuY2UgPSAobWUwNjAwX2Rpb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlzcGluX2xvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisJc3Bpbl9sb2NrKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrKTsKKwlzd2l0Y2ggKGZsYWdzKSB7CisKKwljYXNlIE1FX0lPX1NJTkdMRV9UWVBFX0RJT19CSVQ6CisJCWlmICgoY2hhbm5lbCA+PSAwKSAmJiAoY2hhbm5lbCA8IDgpKSB7CisJCQltb2RlID0KKwkJCSAgICBpbmIoaW5zdGFuY2UtPgorCQkJCWN0cmxfcmVnKSAmICgoTUUwNjAwX0RJT19DT05GSUdfQklUX09VVF8wKSA8PAorCQkJCQkgICAgIChpbnN0YW5jZS0+ZGlvX2lkeCAqIDIpKTsKKworCQkJaWYgKG1vZGUgPT0KKwkJCSAgICAoTUUwNjAwX0RJT19DT05GSUdfQklUX09VVF8wIDw8CisJCQkgICAgIChpbnN0YW5jZS0+ZGlvX2lkeCAqIDIpKSkgeworCQkJCWJ5dGUgPSBpbmIoaW5zdGFuY2UtPnBvcnRfcmVnKTsKKworCQkJCWlmICh2YWx1ZSkKKwkJCQkJYnl0ZSB8PSAweDEgPDwgY2hhbm5lbDsKKwkJCQllbHNlCisJCQkJCWJ5dGUgJj0gfigweDEgPDwgY2hhbm5lbCk7CisKKwkJCQlvdXRiKGJ5dGUsIGluc3RhbmNlLT5wb3J0X3JlZyk7CisJCQl9IGVsc2UgeworCQkJCVBFUlJPUigiUG9ydCBub3QgaW4gb3V0cHV0IG9yIGlucHV0IG1vZGUuXG4iKTsKKwkJCQllcnIgPSBNRV9FUlJOT19QUkVWSU9VU19DT05GSUc7CisJCQl9CisJCX0gZWxzZSB7CisJCQlQRVJST1IoIkludmFsaWQgYml0IG51bWJlciBzcGVjaWZpZWQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwkJfQorCisJCWJyZWFrOworCisJY2FzZSBNRV9JT19TSU5HTEVfTk9fRkxBR1M6CisJY2FzZSBNRV9JT19TSU5HTEVfVFlQRV9ESU9fQllURToKKwkJaWYgKGNoYW5uZWwgPT0gMCkgeworCQkJbW9kZSA9CisJCQkgICAgaW5iKGluc3RhbmNlLT4KKwkJCQljdHJsX3JlZykgJiAoKE1FMDYwMF9ESU9fQ09ORklHX0JJVF9PVVRfMCkgPDwKKwkJCQkJICAgICAoaW5zdGFuY2UtPmRpb19pZHggKiAyKSk7CisKKwkJCWlmIChtb2RlID09CisJCQkgICAgKE1FMDYwMF9ESU9fQ09ORklHX0JJVF9PVVRfMCA8PAorCQkJICAgICAoaW5zdGFuY2UtPmRpb19pZHggKiAyKSkpIHsKKwkJCQlvdXRiKHZhbHVlLCBpbnN0YW5jZS0+cG9ydF9yZWcpOworCQkJfSBlbHNlIHsKKwkJCQlQRVJST1IoIlBvcnQgbm90IGluIG91dHB1dCBvciBpbnB1dCBtb2RlLlxuIik7CisJCQkJZXJyID0gTUVfRVJSTk9fUFJFVklPVVNfQ09ORklHOworCQkJfQorCQl9IGVsc2UgeworCQkJUEVSUk9SKCJJbnZhbGlkIGJ5dGUgbnVtYmVyIHNwZWNpZmllZC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCQl9CisKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlQRVJST1IoIkludmFsaWQgZmxhZ3Mgc3BlY2lmaWVkLlxuIik7CisKKwkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKworCQlicmVhazsKKwl9CisJc3Bpbl91bmxvY2soaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2spOworCXNwaW5fdW5sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lMDYwMF9kaW9fcXVlcnlfbnVtYmVyX2NoYW5uZWxzKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQkgICAgaW50ICpudW1iZXIpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCSpudW1iZXIgPSA4OworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lMDYwMF9kaW9fcXVlcnlfc3ViZGV2aWNlX3R5cGUobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJCSAgIGludCAqdHlwZSwgaW50ICpzdWJ0eXBlKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwkqdHlwZSA9IE1FX1RZUEVfRElPOworCSpzdWJ0eXBlID0gTUVfU1VCVFlQRV9TSU5HTEU7CisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWUwNjAwX2Rpb19xdWVyeV9zdWJkZXZpY2VfY2FwcyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJICAgaW50ICpjYXBzKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwkqY2FwcyA9IE1FX0NBUFNfRElPX0RJUl9CWVRFOworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCittZTA2MDBfZGlvX3N1YmRldmljZV90ICptZTA2MDBfZGlvX2NvbnN0cnVjdG9yKHVpbnQzMl90IHJlZ19iYXNlLAorCQkJCQkgICAgICAgdW5zaWduZWQgaW50IGRpb19pZHgsCisJCQkJCSAgICAgICBzcGlubG9ja190ICogY3RybF9yZWdfbG9jaykKK3sKKwltZTA2MDBfZGlvX3N1YmRldmljZV90ICpzdWJkZXZpY2U7CisJaW50IGVycjsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCS8qIEFsbG9jYXRlIG1lbW9yeSBmb3Igc3ViZGV2aWNlIGluc3RhbmNlICovCisJc3ViZGV2aWNlID0ga21hbGxvYyhzaXplb2YobWUwNjAwX2Rpb19zdWJkZXZpY2VfdCksIEdGUF9LRVJORUwpOworCisJaWYgKCFzdWJkZXZpY2UpIHsKKwkJUEVSUk9SKCJDYW5ub3QgZ2V0IG1lbW9yeSBmb3Igc3ViZGV2aWNlIGluc3RhbmNlLlxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCW1lbXNldChzdWJkZXZpY2UsIDAsIHNpemVvZihtZTA2MDBfZGlvX3N1YmRldmljZV90KSk7CisKKwkvKiBJbml0aWFsaXplIHN1YmRldmljZSBiYXNlIGNsYXNzICovCisJZXJyID0gbWVfc3ViZGV2aWNlX2luaXQoJnN1YmRldmljZS0+YmFzZSk7CisKKwlpZiAoZXJyKSB7CisJCVBFUlJPUigiQ2Fubm90IGluaXRpYWxpemUgc3ViZGV2aWNlIGJhc2UgY2xhc3MgaW5zdGFuY2UuXG4iKTsKKwkJa2ZyZWUoc3ViZGV2aWNlKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCS8vIEluaXRpYWxpemUgc3BpbiBsb2Nrcy4KKwlzcGluX2xvY2tfaW5pdCgmc3ViZGV2aWNlLT5zdWJkZXZpY2VfbG9jayk7CisKKwlzdWJkZXZpY2UtPmN0cmxfcmVnX2xvY2sgPSBjdHJsX3JlZ19sb2NrOworCisJLyogU2F2ZSBkaWdpdGFsIGkvbyBpbmRleCAqLworCXN1YmRldmljZS0+ZGlvX2lkeCA9IGRpb19pZHg7CisKKwkvKiBTYXZlIHRoZSBzdWJkZXZpY2UgaW5kZXggKi8KKwlzdWJkZXZpY2UtPmN0cmxfcmVnID0gcmVnX2Jhc2UgKyBNRTA2MDBfRElPX0NPTkZJR19SRUc7CisJc3ViZGV2aWNlLT5wb3J0X3JlZyA9IHJlZ19iYXNlICsgTUUwNjAwX0RJT19QT1JUX1JFRyArIGRpb19pZHg7CisjaWZkZWYgTUVERUJVR19ERUJVR19SRUcKKwlzdWJkZXZpY2UtPnJlZ19iYXNlID0gcmVnX2Jhc2U7CisjZW5kaWYKKworCS8qIE92ZXJsb2FkIGJhc2UgY2xhc3MgbWV0aG9kcy4gKi8KKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3Jlc2V0X3N1YmRldmljZSA9CisJICAgIG1lMDYwMF9kaW9faW9fcmVzZXRfc3ViZGV2aWNlOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fc2luZ2xlX2NvbmZpZyA9CisJICAgIG1lMDYwMF9kaW9faW9fc2luZ2xlX2NvbmZpZzsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3NpbmdsZV9yZWFkID0gbWUwNjAwX2Rpb19pb19zaW5nbGVfcmVhZDsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3NpbmdsZV93cml0ZSA9CisJICAgIG1lMDYwMF9kaW9faW9fc2luZ2xlX3dyaXRlOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfcXVlcnlfbnVtYmVyX2NoYW5uZWxzID0KKwkgICAgbWUwNjAwX2Rpb19xdWVyeV9udW1iZXJfY2hhbm5lbHM7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9zdWJkZXZpY2VfdHlwZSA9CisJICAgIG1lMDYwMF9kaW9fcXVlcnlfc3ViZGV2aWNlX3R5cGU7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9zdWJkZXZpY2VfY2FwcyA9CisJICAgIG1lMDYwMF9kaW9fcXVlcnlfc3ViZGV2aWNlX2NhcHM7CisKKwlyZXR1cm4gc3ViZGV2aWNlOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMDYwMF9kaW8uaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTA2MDBfZGlvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQwNzVjNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTA2MDBfZGlvLmgKQEAgLTAsMCArMSw2OCBAQAorLyoqCisgKiBAZmlsZSBtZTA2MDBfZGlvLmgKKyAqCisgKiBAYnJpZWYgTUUtNjMwIGRpZ2l0YWwgaW5wdXQvb3V0cHV0IHN1YmRldmljZSBjbGFzcy4KKyAqIEBub3RlIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKiBAYXV0aG9yIEd1ZW50ZXIgR2ViaGFyZHQKKyAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9NRTA2MDBfRElPX0hfCisjZGVmaW5lIF9NRTA2MDBfRElPX0hfCisKKyNpbmNsdWRlICJtZXN1YmRldmljZS5oIgorCisjaWZkZWYgX19LRVJORUxfXworCisvKioKKyAqIEBicmllZiBUaGUgdGVtcGxhdGUgc3ViZGV2aWNlIGNsYXNzLgorICovCit0eXBlZGVmIHN0cnVjdCBtZTA2MDBfZGlvX3N1YmRldmljZSB7CisJLyogSW5oZXJpdGFuY2UgKi8KKwltZV9zdWJkZXZpY2VfdCBiYXNlOwkJCS8qKjwgVGhlIHN1YmRldmljZSBiYXNlIGNsYXNzLiAqLworCisJLyogQXR0cmlidXRlcyAqLworCXNwaW5sb2NrX3Qgc3ViZGV2aWNlX2xvY2s7CQkvKio8IFNwaW4gbG9jayB0byBwcm90ZWN0IHRoZSBzdWJkZXZpY2UgZnJvbSBjb25jdXJyZW50IGFjY2Vzcy4gKi8KKwlzcGlubG9ja190ICpjdHJsX3JlZ19sb2NrOwkJLyoqPCBTcGluIGxvY2sgdG8gcHJvdGVjdCAjY3RybF9yZWcgZnJvbSBjb25jdXJyZW50IGFjY2Vzcy4gKi8KKwl1bnNpZ25lZCBpbnQgZGlvX2lkeDsJCQkvKio8IFRoZSBpbmRleCBvZiB0aGUgZGlnaXRhbCBpL28gb24gdGhlIGRldmljZS4gKi8KKworCXVuc2lnbmVkIGxvbmcgcG9ydF9yZWc7CQkJLyoqPCBSZWdpc3RlciBob2xkaW5nIHRoZSBwb3J0IHN0YXR1cy4gKi8KKwl1bnNpZ25lZCBsb25nIGN0cmxfcmVnOwkJCS8qKjwgUmVnaXN0ZXIgdG8gY29uZmlndXJlIHRoZSBwb3J0IGRpcmVjdGlvbi4gKi8KKyNpZmRlZiBNRURFQlVHX0RFQlVHX1JFRworCXVuc2lnbmVkIGxvbmcgcmVnX2Jhc2U7CisjZW5kaWYKK30gbWUwNjAwX2Rpb19zdWJkZXZpY2VfdDsKKworLyoqCisgKiBAYnJpZWYgVGhlIGNvbnN0cnVjdG9yIHRvIGdlbmVyYXRlIGEgTUUtNjMwIGRpZ2l0YWwgaW5wdXQvb3VwdXQgc3ViZGV2aWNlIGluc3RhbmNlLgorICoKKyAqIEBwYXJhbSByZWdfYmFzZSBUaGUgcmVnaXN0ZXIgYmFzZSBhZGRyZXNzIG9mIHRoZSBkZXZpY2UgYXMgcmV0dXJuZWQgYnkgdGhlIFBDSSBCSU9TLgorICogQHBhcmFtIGRpb19pZHggVGhlIGluZGV4IG9mIHRoZSBkaWdpdGFsIGkvbyBwb3J0IG9uIHRoZSBkZXZpY2UuCisgKiBAcGFyYW0gY3RybF9yZWdfbG9jayBTcGluIGxvY2sgcHJvdGVjdGluZyB0aGUgY29udHJvbCByZWdpc3Rlci4KKyAqCisgKiBAcmV0dXJuIFBvaW50ZXIgdG8gbmV3IGluc3RhbmNlIG9uIHN1Y2Nlc3MuXG4KKyAqIE5VTEwgb24gZXJyb3IuCisgKi8KK21lMDYwMF9kaW9fc3ViZGV2aWNlX3QgKm1lMDYwMF9kaW9fY29uc3RydWN0b3IodWludDMyX3QgcmVnX2Jhc2UsCisJCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgZGlvX2lkeCwKKwkJCQkJICAgICAgIHNwaW5sb2NrX3QgKiBjdHJsX3JlZ19sb2NrKTsKKworI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTA2MDBfZGlvX3JlZy5oIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMDYwMF9kaW9fcmVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjExNmVhMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTA2MDBfZGlvX3JlZy5oCkBAIC0wLDAgKzEsNDEgQEAKKy8qKgorICogQGZpbGUgbWUwNjAwX2Rpb19yZWcuaAorICoKKyAqIEBicmllZiBNRS02MzAgZGlnaXRhbCBpbnB1dC9vdXRwdXQgc3ViZGV2aWNlIHJlZ2lzdGVyIGRlZmluaXRpb25zLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX01FMDYwMF9ESU9fUkVHX0hfCisjZGVmaW5lIF9NRTA2MDBfRElPX1JFR19IXworCisjaWZkZWYgX19LRVJORUxfXworCisjZGVmaW5lIE1FMDYwMF9ESU9fQ09ORklHX1JFRwkJMHgwMDA3CisjZGVmaW5lIE1FMDYwMF9ESU9fUE9SVF8wX1JFRwkJMHgwMDA4CisjZGVmaW5lIE1FMDYwMF9ESU9fUE9SVF8xX1JFRwkJMHgwMDA5CisjZGVmaW5lIE1FMDYwMF9ESU9fUE9SVF9SRUcJCQlNRTA2MDBfRElPX1BPUlRfMF9SRUcKKworI2RlZmluZSBNRTA2MDBfRElPX0NPTkZJR19CSVRfT1VUXzAJMHgwMDAxCisjZGVmaW5lIE1FMDYwMF9ESU9fQ09ORklHX0JJVF9PVVRfMQkweDAwMDQKKworI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTA2MDBfZXh0X2lycS5jIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMDYwMF9leHRfaXJxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWJhMThhZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTA2MDBfZXh0X2lycS5jCkBAIC0wLDAgKzEsNDc4IEBACisvKioKKyAqIEBmaWxlIG1lMDYwMF9leHRfaXJxLmMKKyAqCisgKiBAYnJpZWYgTUUtNjMwIGV4dGVybmFsIGludGVycnVwdCBzdWJkZXZpY2UgaW5zdGFuY2UuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKiBAYXV0aG9yIEtyenlzenRvZiBHYW50emtlCShrLmdhbnR6a2VAbWVpbGhhdXMuZGUpCisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0tFUk5FTF9fCisjICBkZWZpbmUgX19LRVJORUxfXworI2VuZGlmCisKKy8qCisgKiBJbmNsdWRlcworICovCisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKworI2luY2x1ZGUgIm1lZGVmaW5lcy5oIgorI2luY2x1ZGUgIm1laW50ZXJuYWwuaCIKKyNpbmNsdWRlICJtZWVycm9yLmgiCisjaW5jbHVkZSAibWVpZHMuaCIKKyNpbmNsdWRlICJtZWRlYnVnLmgiCisKKyNpbmNsdWRlICJtZXBseF9yZWcuaCIKKyNpbmNsdWRlICJtZTA2MDBfZXh0X2lycV9yZWcuaCIKKyNpbmNsdWRlICJtZTA2MDBfZXh0X2lycS5oIgorCisvKgorICogRnVuY3Rpb25zCisgKi8KKworc3RhdGljIGludCBtZTA2MDBfZXh0X2lycV9pb19pcnFfc3RhcnQoc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlLAorCQkJCSAgICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgICAgIGludCBjaGFubmVsLAorCQkJCSAgICAgICBpbnQgaXJxX3NvdXJjZSwKKwkJCQkgICAgICAgaW50IGlycV9lZGdlLCBpbnQgaXJxX2FyZywgaW50IGZsYWdzKQoreworCW1lMDYwMF9leHRfaXJxX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwl1aW50MzJfdCB0bXA7CisJdW5zaWduZWQgbG9uZyBjcHVfZmxhZ3M7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbnN0YW5jZSA9IChtZTA2MDBfZXh0X2lycV9zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlpZiAoZmxhZ3MgJiB+TUVfSU9fSVJRX1NUQVJUX0RJT19CSVQpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWcgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCWlmIChpbnN0YW5jZS0+bGludG5vID4gMSkgeworCQlQRVJST1IoIldyb25nIGlkeD0lZC5cbiIsIGluc3RhbmNlLT5saW50bm8pOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9TVUJERVZJQ0U7CisJfQorCisJaWYgKGNoYW5uZWwpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGNoYW5uZWwgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJfQorCisJaWYgKGlycV9zb3VyY2UgIT0gTUVfSVJRX1NPVVJDRV9ESU9fTElORSkgeworCQlQRVJST1IoIkludmFsaWQgaXJxIHNvdXJjZSBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfSVJRX1NPVVJDRTsKKwl9CisKKwlpZiAoaXJxX2VkZ2UgIT0gTUVfSVJRX0VER0VfUklTSU5HKSB7CisJCVBFUlJPUigiSW52YWxpZCBpcnEgZWRnZSBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfSVJRX0VER0U7CisJfQorCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKwlzcGluX2xvY2soaW5zdGFuY2UtPmludGNzcl9sb2NrKTsKKwl0bXAgPSBpbmwoaW5zdGFuY2UtPmludGNzcik7CisJc3dpdGNoIChpbnN0YW5jZS0+bGludG5vKSB7CisJY2FzZSAwOgorCQl0bXAgfD0KKwkJICAgIFBMWF9JTlRDU1JfTE9DQUxfSU5UMV9FTiB8IFBMWF9JTlRDU1JfTE9DQUxfSU5UMV9QT0wgfAorCQkgICAgUExYX0lOVENTUl9QQ0lfSU5UX0VOOworCQlicmVhazsKKwljYXNlIDE6CisJCXRtcCB8PQorCQkgICAgUExYX0lOVENTUl9MT0NBTF9JTlQyX0VOIHwgUExYX0lOVENTUl9MT0NBTF9JTlQyX1BPTCB8CisJCSAgICBQTFhfSU5UQ1NSX1BDSV9JTlRfRU47CisJCWJyZWFrOworCX0KKwlvdXRsKHRtcCwgaW5zdGFuY2UtPmludGNzcik7CisJUERFQlVHX1JFRygiaW50Y3NyIG91dGwocGx4OjB4JVgpPTB4JXhcbiIsIGluc3RhbmNlLT5pbnRjc3IsIHRtcCk7CisJc3Bpbl91bmxvY2soaW5zdGFuY2UtPmludGNzcl9sb2NrKTsKKwlpbnN0YW5jZS0+cmlzZWQgPSAwOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWUwNjAwX2V4dF9pcnFfaW9faXJxX3dhaXQoc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlLAorCQkJCSAgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgICBpbnQgY2hhbm5lbCwKKwkJCQkgICAgICBpbnQgKmlycV9jb3VudCwKKwkJCQkgICAgICBpbnQgKnZhbHVlLCBpbnQgdGltZV9vdXQsIGludCBmbGFncykKK3sKKwltZTA2MDBfZXh0X2lycV9zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJbG9uZyB0ID0gMDsKKwl1bnNpZ25lZCBsb25nIGNwdV9mbGFnczsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lMDYwMF9leHRfaXJxX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCWlmIChmbGFncykgeworCQlQRVJST1IoIkludmFsaWQgZmxhZyBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJfQorCisJaWYgKGNoYW5uZWwpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGNoYW5uZWwgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJfQorCisJaWYgKHRpbWVfb3V0IDwgMCkgeworCQlQRVJST1IoIkludmFsaWQgdGltZV9vdXQgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1RJTUVPVVQ7CisJfQorCisJaWYgKHRpbWVfb3V0KSB7CisJCXQgPSAodGltZV9vdXQgKiBIWikgLyAxMDAwOworCisJCWlmICh0ID09IDApCisJCQl0ID0gMTsKKwl9CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlpZiAoaW5zdGFuY2UtPnJpc2VkIDw9IDApIHsKKwkJaW5zdGFuY2UtPnJpc2VkID0gMDsKKworCQlpZiAodGltZV9vdXQpIHsKKwkJCXQgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChpbnN0YW5jZS0+CisJCQkJCQkJICAgICB3YWl0X3F1ZXVlLAorCQkJCQkJCSAgICAgKGluc3RhbmNlLT5yaXNlZCAhPQorCQkJCQkJCSAgICAgIDApLCB0KTsKKworCQkJaWYgKHQgPT0gMCkgeworCQkJCVBFUlJPUigiV2FpdCBvbiBpbnRlcnJ1cHQgdGltZWQgb3V0LlxuIik7CisJCQkJZXJyID0gTUVfRVJSTk9fVElNRU9VVDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShpbnN0YW5jZS0+d2FpdF9xdWV1ZSwKKwkJCQkJCSAoaW5zdGFuY2UtPnJpc2VkICE9IDApKTsKKwkJfQorCisJCWlmIChpbnN0YW5jZS0+cmlzZWQgPCAwKSB7CisJCQlQRVJST1IoIldhaXQgb24gaW50ZXJydXB0IGFib3J0ZWQgYnkgdXNlci5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fQ0FOQ0VMTEVEOworCQl9CisJfQorCisJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCVBFUlJPUigiV2FpdCBvbiBpbnRlcnJ1cHQgYWJvcnRlZCBieSBzaWduYWwuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fU0lHTkFMOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisJaW5zdGFuY2UtPnJpc2VkID0gMDsKKwkqaXJxX2NvdW50ID0gaW5zdGFuY2UtPm47CisJKnZhbHVlID0gMTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWUwNjAwX2V4dF9pcnFfaW9faXJxX3N0b3Aoc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlLAorCQkJCSAgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgICBpbnQgY2hhbm5lbCwgaW50IGZsYWdzKQoreworCW1lMDYwMF9leHRfaXJxX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwl1aW50MzJfdCB0bXA7CisJdW5zaWduZWQgbG9uZyBjcHVfZmxhZ3M7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbnN0YW5jZSA9IChtZTA2MDBfZXh0X2lycV9zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlpZiAoZmxhZ3MpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWcgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCWlmIChpbnN0YW5jZS0+bGludG5vID4gMSkgeworCQlQRVJST1IoIldyb25nIGlkeD0lZC5cbiIsIGluc3RhbmNlLT5saW50bm8pOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9TVUJERVZJQ0U7CisJfQorCisJaWYgKGNoYW5uZWwpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGNoYW5uZWwgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJfQorCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKwlzcGluX2xvY2soaW5zdGFuY2UtPmludGNzcl9sb2NrKTsKKwl0bXAgPSBpbmwoaW5zdGFuY2UtPmludGNzcik7CisJc3dpdGNoIChpbnN0YW5jZS0+bGludG5vKSB7CisJY2FzZSAwOgorCQl0bXAgJj0gflBMWF9JTlRDU1JfTE9DQUxfSU5UMV9FTjsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQl0bXAgJj0gflBMWF9JTlRDU1JfTE9DQUxfSU5UMl9FTjsKKwkJYnJlYWs7CisJfQorCW91dGwodG1wLCBpbnN0YW5jZS0+aW50Y3NyKTsKKwlQREVCVUdfUkVHKCJpbnRjc3Igb3V0bChwbHg6MHglWCk9MHgleFxuIiwgaW5zdGFuY2UtPmludGNzciwgdG1wKTsKKwlzcGluX3VubG9jayhpbnN0YW5jZS0+aW50Y3NyX2xvY2spOworCWluc3RhbmNlLT5yaXNlZCA9IC0xOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGVfYWxsKCZpbnN0YW5jZS0+d2FpdF9xdWV1ZSk7CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWUwNjAwX2V4dF9pcnFfaW9fcmVzZXRfc3ViZGV2aWNlKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSwKKwkJCQkJICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsIGludCBmbGFncykKK3sKKwltZTA2MDBfZXh0X2lycV9zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJdWludDMyX3QgdG1wOworCXVuc2lnbmVkIGxvbmcgY3B1X2ZsYWdzOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJaW5zdGFuY2UgPSAobWUwNjAwX2V4dF9pcnFfc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJaWYgKGZsYWdzKSB7CisJCVBFUlJPUigiSW52YWxpZCBmbGFnIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCXNwaW5fbG9jayhpbnN0YW5jZS0+aW50Y3NyX2xvY2spOworCXRtcCA9IGlubChpbnN0YW5jZS0+aW50Y3NyKTsKKwlzd2l0Y2ggKGluc3RhbmNlLT5saW50bm8pIHsKKwljYXNlIDA6CisJCXRtcCB8PSBQTFhfSU5UQ1NSX0xPQ0FMX0lOVDFfUE9MIHwgUExYX0lOVENTUl9QQ0lfSU5UX0VOOworCQl0bXAgJj0gflBMWF9JTlRDU1JfTE9DQUxfSU5UMV9FTjsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQl0bXAgfD0gUExYX0lOVENTUl9MT0NBTF9JTlQyX1BPTCB8IFBMWF9JTlRDU1JfUENJX0lOVF9FTjsKKwkJdG1wICY9IH5QTFhfSU5UQ1NSX0xPQ0FMX0lOVDJfRU47CisJCWJyZWFrOworCX0KKwlvdXRsKHRtcCwgaW5zdGFuY2UtPmludGNzcik7CisJUERFQlVHX1JFRygiaW50Y3NyIG91dGwocGx4OjB4JVgpPTB4JXhcbiIsIGluc3RhbmNlLT5pbnRjc3IsIHRtcCk7CisJc3Bpbl91bmxvY2soaW5zdGFuY2UtPmludGNzcl9sb2NrKTsKKworCWluc3RhbmNlLT5yaXNlZCA9IC0xOworCWluc3RhbmNlLT5uID0gMDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlX2FsbCgmaW5zdGFuY2UtPndhaXRfcXVldWUpOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZTA2MDBfZXh0X2lycV9xdWVyeV9udW1iZXJfY2hhbm5lbHMoc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlLAorCQkJCQkJaW50ICpudW1iZXIpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCSpudW1iZXIgPSAxOworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lMDYwMF9leHRfaXJxX3F1ZXJ5X3N1YmRldmljZV90eXBlKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSwKKwkJCQkJICAgICAgIGludCAqdHlwZSwgaW50ICpzdWJ0eXBlKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwkqdHlwZSA9IE1FX1RZUEVfRVhUX0lSUTsKKwkqc3VidHlwZSA9IE1FX1NVQlRZUEVfU0lOR0xFOworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lMDYwMF9leHRfaXJxX3F1ZXJ5X3N1YmRldmljZV9jYXBzKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSwKKwkJCQkJICAgICAgIGludCAqY2FwcykKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJKmNhcHMgPSBNRV9DQVBTX0VYVF9JUlFfRURHRV9SSVNJTkc7CisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyB2b2lkIG1lMDYwMF9leHRfaXJxX2Rlc3RydWN0b3Ioc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlKQoreworCW1lMDYwMF9leHRfaXJxX3N1YmRldmljZV90ICppbnN0YW5jZTsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lMDYwMF9leHRfaXJxX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCWZyZWVfaXJxKGluc3RhbmNlLT5pcnEsICh2b2lkICopaW5zdGFuY2UpOworCW1lX3N1YmRldmljZV9kZWluaXQoJmluc3RhbmNlLT5iYXNlKTsKKwlrZnJlZShpbnN0YW5jZSk7Cit9CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiwgNiwgMTkpCitzdGF0aWMgaXJxcmV0dXJuX3QgbWUwNjAwX2lzcihpbnQgaXJxLCB2b2lkICpkZXZfaWQpCisjZWxzZQorc3RhdGljIGlycXJldHVybl90IG1lMDYwMF9pc3IoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKKyNlbmRpZgoreworCW1lMDYwMF9leHRfaXJxX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwl1aW50MzJfdCBzdGF0dXM7CisJdWludDMyX3QgbWFzayA9IFBMWF9JTlRDU1JfUENJX0lOVF9FTjsKKwlpcnFyZXR1cm5fdCByZXQgPSBJUlFfSEFORExFRDsKKworCWluc3RhbmNlID0gKG1lMDYwMF9leHRfaXJxX3N1YmRldmljZV90ICopIGRldl9pZDsKKworCWlmIChpcnEgIT0gaW5zdGFuY2UtPmlycSkgeworCQlQRVJST1IoIkluY29ycmVjdCBpbnRlcnJ1cHQgbnVtOiAlZC5cbiIsIGlycSk7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpZiAoaW5zdGFuY2UtPmxpbnRubyA+IDEpIHsKKwkJUEVSUk9SX0NSSVRJQ0FMCisJCSAgICAoIiVzKCk6V3Jvbmcgc3ViZGV2aWNlIGluZGV4PSVkIHBseDppcnFfc3RhdHVzX3JlZz0weCUwNFguXG4iLAorCQkgICAgIF9fZnVuY19fLCBpbnN0YW5jZS0+bGludG5vLCBpbmwoaW5zdGFuY2UtPmludGNzcikpOworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCisJc3Bpbl9sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCXNwaW5fbG9jayhpbnN0YW5jZS0+aW50Y3NyX2xvY2spOworCXN0YXR1cyA9IGlubChpbnN0YW5jZS0+aW50Y3NyKTsKKwlzd2l0Y2ggKGluc3RhbmNlLT5saW50bm8pIHsKKwljYXNlIDA6CisJCW1hc2sgfD0gUExYX0lOVENTUl9MT0NBTF9JTlQxX1NUQVRFIHwgUExYX0lOVENTUl9MT0NBTF9JTlQxX0VOOworCQlicmVhazsKKwljYXNlIDE6CisJCW1hc2sgfD0gUExYX0lOVENTUl9MT0NBTF9JTlQyX1NUQVRFIHwgUExYX0lOVENTUl9MT0NBTF9JTlQyX0VOOworCQlicmVhazsKKwl9CisKKwlpZiAoKHN0YXR1cyAmIG1hc2spID09IG1hc2spIHsKKwkJaW5zdGFuY2UtPnJpc2VkID0gMTsKKwkJaW5zdGFuY2UtPm4rKzsKKwkJaW5iKGluc3RhbmNlLT5yZXNldF9yZWcpOworCQlQREVCVUcoIkludGVycnVwdCBkZXRlY3RlZC5cbiIpOworCX0gZWxzZSB7CisJCVBJTkZPCisJCSAgICAoIiVsZCBTaGFyZWQgaW50ZXJydXB0LiAlcygpOiBpZHg9MCBwbHg6aXJxX3N0YXR1c19yZWc9MHglMDRYXG4iLAorCQkgICAgIGppZmZpZXMsIF9fZnVuY19fLCBzdGF0dXMpOworCQlyZXQgPSBJUlFfTk9ORTsKKwl9CisJc3Bpbl91bmxvY2soaW5zdGFuY2UtPmludGNzcl9sb2NrKTsKKwlzcGluX3VubG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKworCXdha2VfdXBfaW50ZXJydXB0aWJsZV9hbGwoJmluc3RhbmNlLT53YWl0X3F1ZXVlKTsKKworCXJldHVybiByZXQ7Cit9CisKK21lMDYwMF9leHRfaXJxX3N1YmRldmljZV90ICptZTA2MDBfZXh0X2lycV9jb25zdHJ1Y3Rvcih1aW50MzJfdCBwbHhfcmVnX2Jhc2UsCisJCQkJCQkgICAgICAgdWludDMyX3QgbWUwNjAwX3JlZ19iYXNlLAorCQkJCQkJICAgICAgIHNwaW5sb2NrX3QgKiBpbnRjc3JfbG9jaywKKwkJCQkJCSAgICAgICB1bnNpZ25lZCBleHRfaXJxX2lkeCwKKwkJCQkJCSAgICAgICBpbnQgaXJxKQoreworCW1lMDYwMF9leHRfaXJxX3N1YmRldmljZV90ICpzdWJkZXZpY2U7CisJaW50IGVycjsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCS8qIEFsbG9jYXRlIG1lbW9yeSBmb3Igc3ViZGV2aWNlIGluc3RhbmNlICovCisJc3ViZGV2aWNlID0ga21hbGxvYyhzaXplb2YobWUwNjAwX2V4dF9pcnFfc3ViZGV2aWNlX3QpLCBHRlBfS0VSTkVMKTsKKworCWlmICghc3ViZGV2aWNlKSB7CisJCVBFUlJPUigiQ2Fubm90IGdldCBtZW1vcnkgZm9yIDYzMF9leHRfaXJxIGluc3RhbmNlLlxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCW1lbXNldChzdWJkZXZpY2UsIDAsIHNpemVvZihtZTA2MDBfZXh0X2lycV9zdWJkZXZpY2VfdCkpOworCisJLyogSW5pdGlhbGl6ZSBzdWJkZXZpY2UgYmFzZSBjbGFzcyAqLworCWVyciA9IG1lX3N1YmRldmljZV9pbml0KCZzdWJkZXZpY2UtPmJhc2UpOworCisJaWYgKGVycikgeworCQlQRVJST1IoIkNhbm5vdCBpbml0aWFsaXplIHN1YmRldmljZSBiYXNlIGNsYXNzIGluc3RhbmNlLlxuIik7CisJCWtmcmVlKHN1YmRldmljZSk7CisJCXJldHVybiBOVUxMOworCX0KKwkvLyBJbml0aWFsaXplIHNwaW4gbG9ja3MuCisJc3Bpbl9sb2NrX2luaXQoJnN1YmRldmljZS0+c3ViZGV2aWNlX2xvY2spOworCisJc3ViZGV2aWNlLT5pbnRjc3JfbG9jayA9IGludGNzcl9sb2NrOworCisJLyogSW5pdGlhbGl6ZSB3YWl0IHF1ZXVlICovCisJaW5pdF93YWl0cXVldWVfaGVhZCgmc3ViZGV2aWNlLT53YWl0X3F1ZXVlKTsKKworCXN1YmRldmljZS0+bGludG5vID0gZXh0X2lycV9pZHg7CisKKwkvKiBSZXF1ZXN0IGludGVycnVwdCBsaW5lICovCisJc3ViZGV2aWNlLT5pcnEgPSBpcnE7CisKKwllcnIgPSByZXF1ZXN0X2lycShzdWJkZXZpY2UtPmlycSwgbWUwNjAwX2lzciwKKyNpZmRlZiBJUlFGX0RJU0FCTEVECisJCQkgIElSUUZfRElTQUJMRUQgfCBJUlFGX1NIQVJFRCwKKyNlbHNlCisJCQkgIFNBX0lOVEVSUlVQVCB8IFNBX1NISVJRLAorI2VuZGlmCisJCQkgIE1FMDYwMF9OQU1FLCAodm9pZCAqKXN1YmRldmljZSk7CisKKwlpZiAoZXJyKSB7CisJCVBFUlJPUigiQ2Fubm90IGdldCBpbnRlcnJ1cHQgbGluZS5cbiIpOworCQlrZnJlZShzdWJkZXZpY2UpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJUElORk8oIlJlZ2lzdGVyZWQgaXJxPSVkLlxuIiwgc3ViZGV2aWNlLT5pcnEpOworCisJLyogSW5pdGlhbGl6ZSByZWdpc3RlcnMgKi8KKwlzdWJkZXZpY2UtPmludGNzciA9IHBseF9yZWdfYmFzZSArIFBMWF9JTlRDU1I7CisJc3ViZGV2aWNlLT5yZXNldF9yZWcgPQorCSAgICBtZTA2MDBfcmVnX2Jhc2UgKyBNRTA2MDBfSU5UXzBfUkVTRVRfUkVHICsgZXh0X2lycV9pZHg7CisKKwkvKiBJbml0aWFsaXplIHRoZSBzdWJkZXZpY2UgbWV0aG9kcyAqLworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9faXJxX3N0YXJ0ID0gbWUwNjAwX2V4dF9pcnFfaW9faXJxX3N0YXJ0OworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9faXJxX3dhaXQgPSBtZTA2MDBfZXh0X2lycV9pb19pcnFfd2FpdDsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX2lycV9zdG9wID0gbWUwNjAwX2V4dF9pcnFfaW9faXJxX3N0b3A7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19yZXNldF9zdWJkZXZpY2UgPQorCSAgICBtZTA2MDBfZXh0X2lycV9pb19yZXNldF9zdWJkZXZpY2U7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9udW1iZXJfY2hhbm5lbHMgPQorCSAgICBtZTA2MDBfZXh0X2lycV9xdWVyeV9udW1iZXJfY2hhbm5lbHM7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9zdWJkZXZpY2VfdHlwZSA9CisJICAgIG1lMDYwMF9leHRfaXJxX3F1ZXJ5X3N1YmRldmljZV90eXBlOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfcXVlcnlfc3ViZGV2aWNlX2NhcHMgPQorCSAgICBtZTA2MDBfZXh0X2lycV9xdWVyeV9zdWJkZXZpY2VfY2FwczsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2Rlc3RydWN0b3IgPSBtZTA2MDBfZXh0X2lycV9kZXN0cnVjdG9yOworCisJc3ViZGV2aWNlLT5yaXNlZCA9IDA7CisJc3ViZGV2aWNlLT5uID0gMDsKKworCXJldHVybiBzdWJkZXZpY2U7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUwNjAwX2V4dF9pcnEuaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTA2MDBfZXh0X2lycS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1ZjIyMDQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUwNjAwX2V4dF9pcnEuaApAQCAtMCwwICsxLDU4IEBACisvKioKKyAqIEBmaWxlIG1lMDYwMF9leHRfaXJxLmgKKyAqCisgKiBAYnJpZWYgTUUtNjMwIGV4dGVybmFsIGludGVycnVwdCBpbXBsZW1lbnRhdGlvbi4KKyAqIEBub3RlIENvcHlyaWdodCAoQykgMjAwNiBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKiBAYXV0aG9yIEd1ZW50ZXIgR2ViaGFyZHQKKyAqLworCisjaWZuZGVmIF9NRTA2MDBfRVhUX0lSUV9IXworI2RlZmluZSBfTUUwNjAwX0VYVF9JUlFfSF8KKworI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisKKyNpbmNsdWRlICJtZXN1YmRldmljZS5oIgorI2luY2x1ZGUgIm1lc2xvY2suaCIKKworI2lmZGVmIF9fS0VSTkVMX18KKworLyoqCisgKiBAYnJpZWYgVGhlIE1FLTYzMCBleHRlcm5hbCBpbnRlcnJ1cHQgc3ViZGV2aWNlIGNsYXNzLgorICovCit0eXBlZGVmIHN0cnVjdCBtZTA2MDBfZXh0X2lycV9zdWJkZXZpY2UgeworCS8qIEluaGVyaXRhbmNlICovCisJbWVfc3ViZGV2aWNlX3QgYmFzZTsJCQkvKio8IFRoZSBzdWJkZXZpY2UgYmFzZSBjbGFzcy4gKi8KKworCS8qIEF0dHJpYnV0ZXMgKi8KKwlzcGlubG9ja190IHN1YmRldmljZV9sb2NrOwkJLyoqPCBTcGluIGxvY2sgdG8gcHJvdGVjdCB0aGUgc3ViZGV2aWNlIGZyb20gY29uY3VycmVudCBhY2Nlc3MuICovCisJc3BpbmxvY2tfdCAqaW50Y3NyX2xvY2s7CQkvKio8IFNwaW4gbG9jayB0byBwcm90ZWN0ICNpbnRjc3IuICovCisKKwl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0X3F1ZXVlOwkJLyoqPCBRdWV1ZSB0byBwdXQgb24gdGhyZWFkcyB3YWl0aW5nIGZvciBhbiBpbnRlcnJ1cHQuICovCisKKwlpbnQgaXJxOwkJCQkvKio8IFRoZSBpcnEgbnVtYmVyIGFzc2lnbmVkIGJ5IFBDSSBCSU9TLiAqLworCWludCByaXNlZDsJCQkJLyoqPCBJZiB0cnVlIGFuIGludGVycnVwdCBoYXMgb2NjdXJlZC4gKi8KKwl1bnNpZ25lZCBpbnQgbjsJCQkJLyoqPCBUaGUgbnVtYmVyIG9mIGludGVycnVwdCBzaW5jZSB0aGUgZHJpdmVyIHdhcyBsb2FkZWQuICovCisJdW5zaWduZWQgaW50IGxpbnRubzsJCQkvKio8IFRoZSBudW1iZXIgb2YgdGhlIGxvY2FsIFBDSSBpbnRlcnJ1cHQuICovCisKKwl1aW50MzJfdCBpbnRjc3I7CQkJLyoqPCBUaGUgUExYIGludGVycnVwdCBjb250cm9sIGFuZCBzdGF0dXMgcmVnaXN0ZXIuICovCisJdWludDMyX3QgcmVzZXRfcmVnOwkJCS8qKjwgVGhlIGNvbnRyb2wgcmVnaXN0ZXIuICovCit9IG1lMDYwMF9leHRfaXJxX3N1YmRldmljZV90OworCisvKioKKyAqIEBicmllZiBUaGUgY29uc3RydWN0b3IgdG8gZ2VuZXJhdGUgYSBNRS02MzAgZXh0ZXJuYWwgaW50ZXJydXB0IGluc3RhbmNlLgorICoKKyAqIEBwYXJhbSBwbHhfcmVnX2Jhc2UgVGhlIHJlZ2lzdGVyIGJhc2UgYWRkcmVzcyBvZiB0aGUgUExYIGNoaXAgYXMgcmV0dXJuZWQgYnkgdGhlIFBDSSBCSU9TLgorICogQHBhcmFtIG1lMDYwMF9yZWdfYmFzZSBUaGUgcmVnaXN0ZXIgYmFzZSBhZGRyZXNzIG9mIHRoZSBNRS02MzAgZGV2aWNlIGFzIHJldHVybmVkIGJ5IHRoZSBQQ0kgQklPUy4KKyAqIEBwYXJhbSBpcnEgVGhlIGlycSBhc3NpZ25lZCBieSB0aGUgUENJIEJJT1MuCisgKgorICogQHJldHVybiBQb2ludGVyIHRvIG5ldyBpbnN0YW5jZSBvbiBzdWNjZXNzLlxuCisgKiBOVUxMIG9uIGVycm9yLgorICovCittZTA2MDBfZXh0X2lycV9zdWJkZXZpY2VfdCAqbWUwNjAwX2V4dF9pcnFfY29uc3RydWN0b3IodWludDMyX3QgcGx4X3JlZ19iYXNlLAorCQkJCQkJICAgICAgIHVpbnQzMl90IG1lMDYwMF9yZWdfYmFzZSwKKwkJCQkJCSAgICAgICBzcGlubG9ja190ICogaW50Y3NyX2xvY2ssCisJCQkJCQkgICAgICAgdW5zaWduZWQgaW50IGV4dF9pcnFfaWR4LAorCQkJCQkJICAgICAgIGludCBpcnEpOworCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMDYwMF9leHRfaXJxX3JlZy5oIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMDYwMF9leHRfaXJxX3JlZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2MTk4ZmEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUwNjAwX2V4dF9pcnFfcmVnLmgKQEAgLTAsMCArMSwxOCBAQAorLyoqCisgKiBAZmlsZSBtZTA2MDBfZXh0X2lycV9yZWcuaAorICoKKyAqIEBicmllZiBNRS02MzAgZXh0ZXJuYWwgaW50ZXJydXB0IHJlZ2lzdGVyIGRlZmluaXRpb25zLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICovCisKKyNpZm5kZWYgX01FMDYwMF9FWFRfSVJRX1JFR19IXworI2RlZmluZSBfTUUwNjAwX0VYVF9JUlFfUkVHX0hfCisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKyNkZWZpbmUgTUUwNjAwX0lOVF8wX1JFU0VUX1JFRyAgICAgMHgwMDA1CisjZGVmaW5lIE1FMDYwMF9JTlRfMV9SRVNFVF9SRUcgICAgIDB4MDAwNgorCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMDYwMF9vcHRvaS5jIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMDYwMF9vcHRvaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2ZDk3N2YKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUwNjAwX29wdG9pLmMKQEAgLTAsMCArMSwyNDMgQEAKKy8qKgorICogQGZpbGUgbWUwNjAwX29wdG9pLmMKKyAqCisgKiBAYnJpZWYgTUUtNjMwIE9wdG9pc29sYXRlZCBpbnB1dCBzdWJkZXZpY2UgaW5zdGFuY2UuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKiBAYXV0aG9yIEtyenlzenRvZiBHYW50emtlCShrLmdhbnR6a2VAbWVpbGhhdXMuZGUpCisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0tFUk5FTF9fCisjICBkZWZpbmUgX19LRVJORUxfXworI2VuZGlmCisKKy8qCisgKiBJbmNsdWRlcworICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjaW5jbHVkZSAibWVkZWZpbmVzLmgiCisjaW5jbHVkZSAibWVpbnRlcm5hbC5oIgorI2luY2x1ZGUgIm1lZXJyb3IuaCIKKworI2luY2x1ZGUgIm1lZGVidWcuaCIKKyNpbmNsdWRlICJtZTA2MDBfb3B0b2lfcmVnLmgiCisjaW5jbHVkZSAibWUwNjAwX29wdG9pLmgiCisKKy8qCisgKiBEZWZpbmVzCisgKi8KKworLyoKKyAqIEZ1bmN0aW9ucworICovCisKK3N0YXRpYyBpbnQgbWUwNjAwX29wdG9pX2lvX3Jlc2V0X3N1YmRldmljZShzdHJ1Y3QgbWVfc3ViZGV2aWNlICpzdWJkZXZpY2UsCisJCQkJCSAgIHN0cnVjdCBmaWxlICpmaWxlcCwgaW50IGZsYWdzKQoreworCisJaWYgKGZsYWdzKSB7CisJCVBFUlJPUigiSW52YWxpZCBmbGFnIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWUwNjAwX29wdG9pX2lvX3NpbmdsZV9jb25maWcobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJCSBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJCSBpbnQgY2hhbm5lbCwKKwkJCQkJIGludCBzaW5nbGVfY29uZmlnLAorCQkJCQkgaW50IHJlZiwKKwkJCQkJIGludCB0cmlnX2NoYW4sCisJCQkJCSBpbnQgdHJpZ190eXBlLAorCQkJCQkgaW50IHRyaWdfZWRnZSwgaW50IGZsYWdzKQoreworCW1lMDYwMF9vcHRvaV9zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbnN0YW5jZSA9IChtZTA2MDBfb3B0b2lfc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJc3Bpbl9sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCisJc3dpdGNoIChmbGFncykgeworCWNhc2UgTUVfSU9fU0lOR0xFX0NPTkZJR19OT19GTEFHUzoKKwljYXNlIE1FX0lPX1NJTkdMRV9DT05GSUdfRElPX0JZVEU6CisJCWlmIChjaGFubmVsID09IDApIHsKKwkJCWlmIChzaW5nbGVfY29uZmlnICE9IE1FX1NJTkdMRV9DT05GSUdfRElPX0lOUFVUKSB7CisJCQkJUEVSUk9SKCJJbnZhbGlkIHBvcnQgZGlyZWN0aW9uIHNwZWNpZmllZC5cbiIpOworCQkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfU0lOR0xFX0NPTkZJRzsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCVBFUlJPUigiSW52YWxpZCBjaGFubmVsIHNwZWNpZmllZC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCQl9CisKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlQRVJST1IoIkludmFsaWQgZmxhZ3Mgc3BlY2lmaWVkLlxuIik7CisKKwkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKworCQlicmVhazsKKwl9CisKKwlzcGluX3VubG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZTA2MDBfb3B0b2lfaW9fc2luZ2xlX3JlYWQobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgICAgaW50IGNoYW5uZWwsCisJCQkJICAgICAgIGludCAqdmFsdWUsIGludCB0aW1lX291dCwgaW50IGZsYWdzKQoreworCW1lMDYwMF9vcHRvaV9zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbnN0YW5jZSA9IChtZTA2MDBfb3B0b2lfc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJc3Bpbl9sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCisJc3dpdGNoIChmbGFncykgeworCWNhc2UgTUVfSU9fU0lOR0xFX1RZUEVfRElPX0JJVDoKKwkJaWYgKChjaGFubmVsID49IDApICYmIChjaGFubmVsIDwgOCkpIHsKKwkJCSp2YWx1ZSA9IGluYihpbnN0YW5jZS0+cG9ydF9yZWcpICYgKDB4MSA8PCBjaGFubmVsKTsKKwkJfSBlbHNlIHsKKwkJCVBFUlJPUigiSW52YWxpZCBiaXQgbnVtYmVyIHNwZWNpZmllZC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCQl9CisKKwkJYnJlYWs7CisKKwljYXNlIE1FX0lPX1NJTkdMRV9OT19GTEFHUzoKKwljYXNlIE1FX0lPX1NJTkdMRV9UWVBFX0RJT19CWVRFOgorCQlpZiAoY2hhbm5lbCA9PSAwKSB7CisJCQkqdmFsdWUgPSBpbmIoaW5zdGFuY2UtPnBvcnRfcmVnKTsKKwkJfSBlbHNlIHsKKwkJCVBFUlJPUigiSW52YWxpZCBieXRlIG51bWJlciBzcGVjaWZpZWQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwkJfQorCisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWdzIHNwZWNpZmllZC5cbiIpOworCisJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJfQorCisJc3Bpbl91bmxvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWUwNjAwX29wdG9pX3F1ZXJ5X251bWJlcl9jaGFubmVscyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJICAgICAgaW50ICpudW1iZXIpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCSpudW1iZXIgPSA4OworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lMDYwMF9vcHRvaV9xdWVyeV9zdWJkZXZpY2VfdHlwZShtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJICAgICBpbnQgKnR5cGUsIGludCAqc3VidHlwZSkKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJKnR5cGUgPSBNRV9UWVBFX0RJOworCSpzdWJ0eXBlID0gTUVfU1VCVFlQRV9TSU5HTEU7CisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWUwNjAwX29wdG9pX3F1ZXJ5X3N1YmRldmljZV9jYXBzKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQkgICAgIGludCAqY2FwcykKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJKmNhcHMgPSAwOworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCittZTA2MDBfb3B0b2lfc3ViZGV2aWNlX3QgKm1lMDYwMF9vcHRvaV9jb25zdHJ1Y3Rvcih1aW50MzJfdCByZWdfYmFzZSkKK3sKKwltZTA2MDBfb3B0b2lfc3ViZGV2aWNlX3QgKnN1YmRldmljZTsKKwlpbnQgZXJyOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJLyogQWxsb2NhdGUgbWVtb3J5IGZvciBzdWJkZXZpY2UgaW5zdGFuY2UgKi8KKwlzdWJkZXZpY2UgPSBrbWFsbG9jKHNpemVvZihtZTA2MDBfb3B0b2lfc3ViZGV2aWNlX3QpLCBHRlBfS0VSTkVMKTsKKworCWlmICghc3ViZGV2aWNlKSB7CisJCVBFUlJPUigiQ2Fubm90IGdldCBtZW1vcnkgZm9yIHN1YmRldmljZSBpbnN0YW5jZS5cbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwltZW1zZXQoc3ViZGV2aWNlLCAwLCBzaXplb2YobWUwNjAwX29wdG9pX3N1YmRldmljZV90KSk7CisKKwkvKiBJbml0aWFsaXplIHN1YmRldmljZSBiYXNlIGNsYXNzICovCisJZXJyID0gbWVfc3ViZGV2aWNlX2luaXQoJnN1YmRldmljZS0+YmFzZSk7CisKKwlpZiAoZXJyKSB7CisJCVBFUlJPUigiQ2Fubm90IGluaXRpYWxpemUgc3ViZGV2aWNlIGJhc2UgY2xhc3MgaW5zdGFuY2UuXG4iKTsKKwkJa2ZyZWUoc3ViZGV2aWNlKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCS8vIEluaXRpYWxpemUgc3BpbiBsb2Nrcy4KKwlzcGluX2xvY2tfaW5pdCgmc3ViZGV2aWNlLT5zdWJkZXZpY2VfbG9jayk7CisKKwkvKiBTYXZlIHRoZSBzdWJkZXZpY2UgaW5kZXggKi8KKwlzdWJkZXZpY2UtPnBvcnRfcmVnID0gcmVnX2Jhc2UgKyBNRTA2MDBfT1BUT19JTlBVVF9SRUc7CisKKwkvKiBPdmVybG9hZCBiYXNlIGNsYXNzIG1ldGhvZHMuICovCisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19yZXNldF9zdWJkZXZpY2UgPQorCSAgICBtZTA2MDBfb3B0b2lfaW9fcmVzZXRfc3ViZGV2aWNlOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fc2luZ2xlX2NvbmZpZyA9CisJICAgIG1lMDYwMF9vcHRvaV9pb19zaW5nbGVfY29uZmlnOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fc2luZ2xlX3JlYWQgPQorCSAgICBtZTA2MDBfb3B0b2lfaW9fc2luZ2xlX3JlYWQ7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9udW1iZXJfY2hhbm5lbHMgPQorCSAgICBtZTA2MDBfb3B0b2lfcXVlcnlfbnVtYmVyX2NoYW5uZWxzOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfcXVlcnlfc3ViZGV2aWNlX3R5cGUgPQorCSAgICBtZTA2MDBfb3B0b2lfcXVlcnlfc3ViZGV2aWNlX3R5cGU7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9zdWJkZXZpY2VfY2FwcyA9CisJICAgIG1lMDYwMF9vcHRvaV9xdWVyeV9zdWJkZXZpY2VfY2FwczsKKworCXJldHVybiBzdWJkZXZpY2U7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUwNjAwX29wdG9pLmggYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUwNjAwX29wdG9pLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTdlNjliYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTA2MDBfb3B0b2kuaApAQCAtMCwwICsxLDU4IEBACisvKioKKyAqIEBmaWxlIG1lMDYwMF9vcHRvaS5oCisgKgorICogQGJyaWVmIE1FLTYzMCBPcHRvaXNvbGF0ZWQgaW5wdXQgc3ViZGV2aWNlIGNsYXNzLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX01FMDYwMF9PUFRPSV9IXworI2RlZmluZSBfTUUwNjAwX09QVE9JX0hfCisKKyNpbmNsdWRlICJtZXN1YmRldmljZS5oIgorCisjaWZkZWYgX19LRVJORUxfXworCisvKioKKyAqIEBicmllZiBUaGUgdGVtcGxhdGUgc3ViZGV2aWNlIGNsYXNzLgorICovCit0eXBlZGVmIHN0cnVjdCBtZTA2MDBfb3B0b2lfc3ViZGV2aWNlIHsKKwkvKiBJbmhlcml0YW5jZSAqLworCW1lX3N1YmRldmljZV90IGJhc2U7CQkJLyoqPCBUaGUgc3ViZGV2aWNlIGJhc2UgY2xhc3MuICovCisKKwkvKiBBdHRyaWJ1dGVzICovCisJc3BpbmxvY2tfdCBzdWJkZXZpY2VfbG9jazsJCS8qKjwgU3BpbiBsb2NrIHRvIHByb3RlY3QgdGhlIHN1YmRldmljZSBmcm9tIGNvbmN1cnJlbnQgYWNjZXNzLiAqLworCisJdWludDMyX3QgcG9ydF9yZWc7CQkJLyoqPCBSZWdpc3RlciBob2xkaW5nIHRoZSBwb3J0IHN0YXR1cy4gKi8KK30gbWUwNjAwX29wdG9pX3N1YmRldmljZV90OworCisvKioKKyAqIEBicmllZiBUaGUgY29uc3RydWN0b3IgdG8gZ2VuZXJhdGUgYSBNRS02MzAgT3B0b2lzb2xhdGVkIGlucHV0IHN1YmRldmljZSBpbnN0YW5jZS4KKyAqCisgKiBAcGFyYW0gcmVnX2Jhc2UgVGhlIHJlZ2lzdGVyIGJhc2UgYWRkcmVzcyBvZiB0aGUgZGV2aWNlIGFzIHJldHVybmVkIGJ5IHRoZSBQQ0kgQklPUy4KKyAqCisgKiBAcmV0dXJuIFBvaW50ZXIgdG8gbmV3IGluc3RhbmNlIG9uIHN1Y2Nlc3MuXG4KKyAqIE5VTEwgb24gZXJyb3IuCisgKi8KK21lMDYwMF9vcHRvaV9zdWJkZXZpY2VfdCAqbWUwNjAwX29wdG9pX2NvbnN0cnVjdG9yKHVpbnQzMl90IHJlZ19iYXNlKTsKKworI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTA2MDBfb3B0b2lfcmVnLmggYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUwNjAwX29wdG9pX3JlZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwYmM0NTAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUwNjAwX29wdG9pX3JlZy5oCkBAIC0wLDAgKzEsMzUgQEAKKy8qKgorICogQGZpbGUgbWUwNjAwX29wdG9pX3JlZy5oCisgKgorICogQGJyaWVmIE1FLTYzMCBPcHRvaXNvbGF0ZWQgaW5wdXQgc3ViZGV2aWNlIHJlZ2lzdGVyIGRlZmluaXRpb25zLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX01FMDYwMF9PUFRPSV9SRUdfSF8KKyNkZWZpbmUgX01FMDYwMF9PUFRPSV9SRUdfSF8KKworI2lmZGVmIF9fS0VSTkVMX18KKworI2RlZmluZSBNRTA2MDBfT1BUT19JTlBVVF9SRUcgICAgICAweDAwMDQKKworI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTA2MDBfcmVsYXkuYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTA2MDBfcmVsYXkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjY1YzY5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMDYwMF9yZWxheS5jCkBAIC0wLDAgKzEsMzU5IEBACisvKioKKyAqIEBmaWxlIG1lMDYwMF9yZWxheS5jCisgKgorICogQGJyaWVmIE1FLTYzMCByZWxheSBzdWJkZXZpY2UgaW5zdGFuY2UuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKiBAYXV0aG9yIEtyenlzenRvZiBHYW50emtlCShrLmdhbnR6a2VAbWVpbGhhdXMuZGUpCisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0tFUk5FTF9fCisjICBkZWZpbmUgX19LRVJORUxfXworI2VuZGlmCisKKy8qCisgKiBJbmNsdWRlcworICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjaW5jbHVkZSAibWVkZWZpbmVzLmgiCisjaW5jbHVkZSAibWVpbnRlcm5hbC5oIgorI2luY2x1ZGUgIm1lZXJyb3IuaCIKKworI2luY2x1ZGUgIm1lZGVidWcuaCIKKyNpbmNsdWRlICJtZTA2MDBfcmVsYXlfcmVnLmgiCisjaW5jbHVkZSAibWUwNjAwX3JlbGF5LmgiCisKKy8qCisgKiBEZWZpbmVzCisgKi8KKworLyoKKyAqIEZ1bmN0aW9ucworICovCisKK3N0YXRpYyBpbnQgbWUwNjAwX3JlbGF5X2lvX3Jlc2V0X3N1YmRldmljZShzdHJ1Y3QgbWVfc3ViZGV2aWNlICpzdWJkZXZpY2UsCisJCQkJCSAgIHN0cnVjdCBmaWxlICpmaWxlcCwgaW50IGZsYWdzKQoreworCW1lMDYwMF9yZWxheV9zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbnN0YW5jZSA9IChtZTA2MDBfcmVsYXlfc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJaWYgKGZsYWdzKSB7CisJCVBFUlJPUigiSW52YWxpZCBmbGFnIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlzcGluX2xvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisJb3V0YigweDAsIGluc3RhbmNlLT5wb3J0XzBfcmVnKTsKKwlQREVCVUdfUkVHKCJwb3J0XzBfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPnBvcnRfMF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIDApOworCW91dGIoMHgwLCBpbnN0YW5jZS0+cG9ydF8xX3JlZyk7CisJUERFQlVHX1JFRygicG9ydF8xX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5wb3J0XzFfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCAwKTsKKwlzcGluX3VubG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWUwNjAwX3JlbGF5X2lvX3NpbmdsZV9jb25maWcobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJCSBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJCSBpbnQgY2hhbm5lbCwKKwkJCQkJIGludCBzaW5nbGVfY29uZmlnLAorCQkJCQkgaW50IHJlZiwKKwkJCQkJIGludCB0cmlnX2NoYW4sCisJCQkJCSBpbnQgdHJpZ190eXBlLAorCQkJCQkgaW50IHRyaWdfZWRnZSwgaW50IGZsYWdzKQoreworCW1lMDYwMF9yZWxheV9zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbnN0YW5jZSA9IChtZTA2MDBfcmVsYXlfc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJc3Bpbl9sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCisJc3dpdGNoIChmbGFncykgeworCWNhc2UgTUVfSU9fU0lOR0xFX0NPTkZJR19OT19GTEFHUzoKKwljYXNlIE1FX0lPX1NJTkdMRV9DT05GSUdfRElPX1dPUkQ6CisJCWlmIChjaGFubmVsID09IDApIHsKKwkJCWlmIChzaW5nbGVfY29uZmlnICE9IE1FX1NJTkdMRV9DT05GSUdfRElPX09VVFBVVCkgeworCQkJCVBFUlJPUigiSW52YWxpZCB3b3JkIGRpcmVjdGlvbiBzcGVjaWZpZWQuXG4iKTsKKwkJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX1NJTkdMRV9DT05GSUc7CisJCQl9CisJCX0gZWxzZSB7CisJCQlQRVJST1IoIkludmFsaWQgY2hhbm5lbCBzcGVjaWZpZWQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwkJfQorCisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWdzIHNwZWNpZmllZC5cbiIpOworCisJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisKKwkJYnJlYWs7CisJfQorCisJc3Bpbl91bmxvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWUwNjAwX3JlbGF5X2lvX3NpbmdsZV9yZWFkKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgICAgIGludCBjaGFubmVsLAorCQkJCSAgICAgICBpbnQgKnZhbHVlLCBpbnQgdGltZV9vdXQsIGludCBmbGFncykKK3sKKwltZTA2MDBfcmVsYXlfc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJaW5zdGFuY2UgPSAobWUwNjAwX3JlbGF5X3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCXNwaW5fbG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKworCXN3aXRjaCAoZmxhZ3MpIHsKKworCWNhc2UgTUVfSU9fU0lOR0xFX1RZUEVfRElPX0JJVDoKKwkJaWYgKChjaGFubmVsID49IDApICYmIChjaGFubmVsIDwgOCkpIHsKKwkJCSp2YWx1ZSA9IGluYihpbnN0YW5jZS0+cG9ydF8wX3JlZykgJiAoMHgxIDw8IGNoYW5uZWwpOworCQl9IGVsc2UgaWYgKChjaGFubmVsID49IDgpICYmIChjaGFubmVsIDwgMTYpKSB7CisJCQkqdmFsdWUgPQorCQkJICAgIGluYihpbnN0YW5jZS0+cG9ydF8xX3JlZykgJiAoMHgxIDw8IChjaGFubmVsIC0gOCkpOworCQl9IGVsc2UgeworCQkJUEVSUk9SKCJJbnZhbGlkIGJpdCBudW1iZXIgc3BlY2lmaWVkLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJCX0KKworCQlicmVhazsKKworCWNhc2UgTUVfSU9fU0lOR0xFX1RZUEVfRElPX0JZVEU6CisJCWlmIChjaGFubmVsID09IDApIHsKKwkJCSp2YWx1ZSA9IGluYihpbnN0YW5jZS0+cG9ydF8wX3JlZyk7CisJCX0gZWxzZSBpZiAoY2hhbm5lbCA9PSAxKSB7CisJCQkqdmFsdWUgPSBpbmIoaW5zdGFuY2UtPnBvcnRfMV9yZWcpOworCQl9IGVsc2UgeworCQkJUEVSUk9SKCJJbnZhbGlkIGJ5dGUgbnVtYmVyIHNwZWNpZmllZC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCQl9CisKKwkJYnJlYWs7CisKKwljYXNlIE1FX0lPX1NJTkdMRV9OT19GTEFHUzoKKwljYXNlIE1FX0lPX1NJTkdMRV9UWVBFX0RJT19XT1JEOgorCQlpZiAoY2hhbm5lbCA9PSAwKSB7CisJCQkqdmFsdWUgPSAodWludDMyX3QpIGluYihpbnN0YW5jZS0+cG9ydF8xX3JlZykgPDwgODsKKwkJCSp2YWx1ZSB8PSBpbmIoaW5zdGFuY2UtPnBvcnRfMF9yZWcpOworCQl9IGVsc2UgeworCQkJUEVSUk9SKCJJbnZhbGlkIHdvcmQgbnVtYmVyIHNwZWNpZmllZC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCQl9CisKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlQRVJST1IoIkludmFsaWQgZmxhZ3Mgc3BlY2lmaWVkLlxuIik7CisKKwkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlzcGluX3VubG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZTA2MDBfcmVsYXlfaW9fc2luZ2xlX3dyaXRlKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQlzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJCWludCBjaGFubmVsLAorCQkJCQlpbnQgdmFsdWUsIGludCB0aW1lX291dCwgaW50IGZsYWdzKQoreworCW1lMDYwMF9yZWxheV9zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJdWludDhfdCBzdGF0ZTsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lMDYwMF9yZWxheV9zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlzcGluX2xvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisKKwlzd2l0Y2ggKGZsYWdzKSB7CisJY2FzZSBNRV9JT19TSU5HTEVfVFlQRV9ESU9fQklUOgorCQlpZiAoKGNoYW5uZWwgPj0gMCkgJiYgKGNoYW5uZWwgPCA4KSkgeworCQkJc3RhdGUgPSBpbmIoaW5zdGFuY2UtPnBvcnRfMF9yZWcpOworCQkJc3RhdGUgPQorCQkJICAgIHZhbHVlID8gKHN0YXRlIHwgKDB4MSA8PCBjaGFubmVsKSkgOiAoc3RhdGUgJgorCQkJCQkJCQkgIH4oMHgxIDw8CisJCQkJCQkJCSAgICBjaGFubmVsKSk7CisJCQlvdXRiKHN0YXRlLCBpbnN0YW5jZS0+cG9ydF8wX3JlZyk7CisJCX0gZWxzZSBpZiAoKGNoYW5uZWwgPj0gOCkgJiYgKGNoYW5uZWwgPCAxNikpIHsKKwkJCXN0YXRlID0gaW5iKGluc3RhbmNlLT5wb3J0XzFfcmVnKTsKKwkJCXN0YXRlID0KKwkJCSAgICB2YWx1ZSA/IChzdGF0ZSB8ICgweDEgPDwgKGNoYW5uZWwgLSA4KSkpIDogKHN0YXRlICYKKwkJCQkJCQkJCX4oMHgxIDw8CisJCQkJCQkJCQkgIChjaGFubmVsCisJCQkJCQkJCQkgICAtCisJCQkJCQkJCQkgICA4KSkpOworCQkJb3V0YihzdGF0ZSwgaW5zdGFuY2UtPnBvcnRfMV9yZWcpOworCQl9IGVsc2UgeworCQkJUEVSUk9SKCJJbnZhbGlkIGJpdCBudW1iZXIgc3BlY2lmaWVkLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIE1FX0lPX1NJTkdMRV9UWVBFX0RJT19CWVRFOgorCQlpZiAoY2hhbm5lbCA9PSAwKSB7CisJCQlvdXRiKHZhbHVlLCBpbnN0YW5jZS0+cG9ydF8wX3JlZyk7CisJCX0gZWxzZSBpZiAoY2hhbm5lbCA9PSAxKSB7CisJCQlvdXRiKHZhbHVlLCBpbnN0YW5jZS0+cG9ydF8xX3JlZyk7CisJCX0gZWxzZSB7CisJCQlQRVJST1IoIkludmFsaWQgYnl0ZSBudW1iZXIgc3BlY2lmaWVkLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIE1FX0lPX1NJTkdMRV9OT19GTEFHUzoKKwljYXNlIE1FX0lPX1NJTkdMRV9UWVBFX0RJT19XT1JEOgorCQlpZiAoY2hhbm5lbCA9PSAwKSB7CisJCQlvdXRiKHZhbHVlLCBpbnN0YW5jZS0+cG9ydF8wX3JlZyk7CisJCQlvdXRiKHZhbHVlID4+IDgsIGluc3RhbmNlLT5wb3J0XzFfcmVnKTsKKwkJfSBlbHNlIHsKKwkJCVBFUlJPUigiSW52YWxpZCB3b3JkIG51bWJlciBzcGVjaWZpZWQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCVBFUlJPUigiSW52YWxpZCBmbGFncyBzcGVjaWZpZWQuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwkJYnJlYWs7CisJfQorCisJc3Bpbl91bmxvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWUwNjAwX3JlbGF5X3F1ZXJ5X251bWJlcl9jaGFubmVscyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJICAgICAgaW50ICpudW1iZXIpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCSpudW1iZXIgPSAxNjsKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZTA2MDBfcmVsYXlfcXVlcnlfc3ViZGV2aWNlX3R5cGUobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJCSAgICAgaW50ICp0eXBlLCBpbnQgKnN1YnR5cGUpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCSp0eXBlID0gTUVfVFlQRV9ETzsKKwkqc3VidHlwZSA9IE1FX1NVQlRZUEVfU0lOR0xFOworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lMDYwMF9yZWxheV9xdWVyeV9zdWJkZXZpY2VfY2FwcyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJICAgICBpbnQgKmNhcHMpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCSpjYXBzID0gMDsKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworbWUwNjAwX3JlbGF5X3N1YmRldmljZV90ICptZTA2MDBfcmVsYXlfY29uc3RydWN0b3IodWludDMyX3QgcmVnX2Jhc2UpCit7CisJbWUwNjAwX3JlbGF5X3N1YmRldmljZV90ICpzdWJkZXZpY2U7CisJaW50IGVycjsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCS8qIEFsbG9jYXRlIG1lbW9yeSBmb3Igc3ViZGV2aWNlIGluc3RhbmNlICovCisJc3ViZGV2aWNlID0ga21hbGxvYyhzaXplb2YobWUwNjAwX3JlbGF5X3N1YmRldmljZV90KSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIXN1YmRldmljZSkgeworCQlQRVJST1IoIkNhbm5vdCBnZXQgbWVtb3J5IGZvciBzdWJkZXZpY2UgaW5zdGFuY2UuXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJbWVtc2V0KHN1YmRldmljZSwgMCwgc2l6ZW9mKG1lMDYwMF9yZWxheV9zdWJkZXZpY2VfdCkpOworCisJLyogSW5pdGlhbGl6ZSBzdWJkZXZpY2UgYmFzZSBjbGFzcyAqLworCWVyciA9IG1lX3N1YmRldmljZV9pbml0KCZzdWJkZXZpY2UtPmJhc2UpOworCisJaWYgKGVycikgeworCQlQRVJST1IoIkNhbm5vdCBpbml0aWFsaXplIHN1YmRldmljZSBiYXNlIGNsYXNzIGluc3RhbmNlLlxuIik7CisJCWtmcmVlKHN1YmRldmljZSk7CisJCXJldHVybiBOVUxMOworCX0KKwkvLyBJbml0aWFsaXplIHNwaW4gbG9ja3MuCisJc3Bpbl9sb2NrX2luaXQoJnN1YmRldmljZS0+c3ViZGV2aWNlX2xvY2spOworCisJLyogU2F2ZSB0aGUgc3ViZGV2aWNlIGluZGV4ICovCisJc3ViZGV2aWNlLT5wb3J0XzBfcmVnID0gcmVnX2Jhc2UgKyBNRTA2MDBfUkVMQUlTXzBfUkVHOworCXN1YmRldmljZS0+cG9ydF8xX3JlZyA9IHJlZ19iYXNlICsgTUUwNjAwX1JFTEFJU18xX1JFRzsKKyNpZmRlZiBNRURFQlVHX0RFQlVHX1JFRworCXN1YmRldmljZS0+cmVnX2Jhc2UgPSByZWdfYmFzZTsKKyNlbmRpZgorCisJLyogT3ZlcmxvYWQgYmFzZSBjbGFzcyBtZXRob2RzLiAqLworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fcmVzZXRfc3ViZGV2aWNlID0KKwkgICAgbWUwNjAwX3JlbGF5X2lvX3Jlc2V0X3N1YmRldmljZTsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3NpbmdsZV9jb25maWcgPQorCSAgICBtZTA2MDBfcmVsYXlfaW9fc2luZ2xlX2NvbmZpZzsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3NpbmdsZV9yZWFkID0KKwkgICAgbWUwNjAwX3JlbGF5X2lvX3NpbmdsZV9yZWFkOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fc2luZ2xlX3dyaXRlID0KKwkgICAgbWUwNjAwX3JlbGF5X2lvX3NpbmdsZV93cml0ZTsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X251bWJlcl9jaGFubmVscyA9CisJICAgIG1lMDYwMF9yZWxheV9xdWVyeV9udW1iZXJfY2hhbm5lbHM7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9zdWJkZXZpY2VfdHlwZSA9CisJICAgIG1lMDYwMF9yZWxheV9xdWVyeV9zdWJkZXZpY2VfdHlwZTsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV9jYXBzID0KKwkgICAgbWUwNjAwX3JlbGF5X3F1ZXJ5X3N1YmRldmljZV9jYXBzOworCisJcmV0dXJuIHN1YmRldmljZTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTA2MDBfcmVsYXkuaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTA2MDBfcmVsYXkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yY2U3ZGNhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMDYwMF9yZWxheS5oCkBAIC0wLDAgKzEsNjMgQEAKKy8qKgorICogQGZpbGUgbWUwNjAwX3JlbGF5LmgKKyAqCisgKiBAYnJpZWYgTUUtNjMwIHJlbGF5IHN1YmRldmljZSBjbGFzcy4KKyAqIEBub3RlIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKiBAYXV0aG9yIEd1ZW50ZXIgR2ViaGFyZHQKKyAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9NRTA2MDBfUkVMQVlfSF8KKyNkZWZpbmUgX01FMDYwMF9SRUxBWV9IXworCisjaW5jbHVkZSAibWVzdWJkZXZpY2UuaCIKKworI2lmZGVmIF9fS0VSTkVMX18KKworLyoqCisgKiBAYnJpZWYgVGhlIHRlbXBsYXRlIHN1YmRldmljZSBjbGFzcy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgbWUwNjAwX3JlbGF5X3N1YmRldmljZSB7CisJLyogSW5oZXJpdGFuY2UgKi8KKwltZV9zdWJkZXZpY2VfdCBiYXNlOwkJCS8qKjwgVGhlIHN1YmRldmljZSBiYXNlIGNsYXNzLiAqLworCisJLyogQXR0cmlidXRlcyAqLworCXNwaW5sb2NrX3Qgc3ViZGV2aWNlX2xvY2s7CQkvKio8IFNwaW4gbG9jayB0byBwcm90ZWN0IHRoZSBzdWJkZXZpY2UgZnJvbSBjb25jdXJyZW50IGFjY2Vzcy4gKi8KKworCXVuc2lnbmVkIGxvbmcgcG9ydF8wX3JlZzsJCQkvKio8IFJlZ2lzdGVyIGhvbGRpbmcgdGhlIHBvcnQgc3RhdHVzLiAqLworCXVuc2lnbmVkIGxvbmcgcG9ydF8xX3JlZzsJCQkvKio8IFJlZ2lzdGVyIGhvbGRpbmcgdGhlIHBvcnQgc3RhdHVzLiAqLworI2lmZGVmIE1FREVCVUdfREVCVUdfUkVHCisJdW5zaWduZWQgbG9uZyByZWdfYmFzZTsKKyNlbmRpZgorfSBtZTA2MDBfcmVsYXlfc3ViZGV2aWNlX3Q7CisKKy8qKgorICogQGJyaWVmIFRoZSBjb25zdHJ1Y3RvciB0byBnZW5lcmF0ZSBhIE1FLTYzMCByZWxheSBzdWJkZXZpY2UgaW5zdGFuY2UuCisgKgorICogQHBhcmFtIHJlZ19iYXNlIFRoZSByZWdpc3RlciBiYXNlIGFkZHJlc3Mgb2YgdGhlIGRldmljZSBhcyByZXR1cm5lZCBieSB0aGUgUENJIEJJT1MuCisgKiBAcGFyYW0gY3RybF9yZWdfbG9jayBTcGluIGxvY2sgcHJvdGVjdGluZyB0aGUgY29udHJvbCByZWdpc3Rlci4KKyAqCisgKiBAcmV0dXJuIFBvaW50ZXIgdG8gbmV3IGluc3RhbmNlIG9uIHN1Y2Nlc3MuXG4KKyAqIE5VTEwgb24gZXJyb3IuCisgKi8KK21lMDYwMF9yZWxheV9zdWJkZXZpY2VfdCAqbWUwNjAwX3JlbGF5X2NvbnN0cnVjdG9yKHVpbnQzMl90IHJlZ19iYXNlKTsKKworI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTA2MDBfcmVsYXlfcmVnLmggYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUwNjAwX3JlbGF5X3JlZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhNGRiMmUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUwNjAwX3JlbGF5X3JlZy5oCkBAIC0wLDAgKzEsMzYgQEAKKy8qKgorICogQGZpbGUgbWUwNjAwX3JlbGF5X3JlZy5oCisgKgorICogQGJyaWVmIE1FLTYzMCByZWxheSBzdWJkZXZpY2UgcmVnaXN0ZXIgZGVmaW5pdGlvbnMuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfTUUwNjAwX1JFTEFZX1JFR19IXworI2RlZmluZSBfTUUwNjAwX1JFTEFZX1JFR19IXworCisjaWZkZWYgX19LRVJORUxfXworCisjZGVmaW5lIE1FMDYwMF9SRUxBSVNfMF9SRUcgICAgICAgIDB4MDAwMQorI2RlZmluZSBNRTA2MDBfUkVMQUlTXzFfUkVHICAgICAgICAweDAwMDIKKworI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTA2MDBfdHRsaS5jIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMDYwMF90dGxpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWI4ZTEzYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTA2MDBfdHRsaS5jCkBAIC0wLDAgKzEsMjM4IEBACisvKioKKyAqIEBmaWxlIG1lMDYwMF90dGxpLmMKKyAqCisgKiBAYnJpZWYgTUUtNjMwIFRUTCBpbnB1dCBzdWJkZXZpY2UgaW5zdGFuY2UuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKiBAYXV0aG9yIEtyenlzenRvZiBHYW50emtlCShrLmdhbnR6a2VAbWVpbGhhdXMuZGUpCisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0tFUk5FTF9fCisjICBkZWZpbmUgX19LRVJORUxfXworI2VuZGlmCisKKy8qCisgKiBJbmNsdWRlcworICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjaW5jbHVkZSAibWVkZWZpbmVzLmgiCisjaW5jbHVkZSAibWVpbnRlcm5hbC5oIgorI2luY2x1ZGUgIm1lZXJyb3IuaCIKKworI2luY2x1ZGUgIm1lZGVidWcuaCIKKyNpbmNsdWRlICJtZTA2MDBfdHRsaV9yZWcuaCIKKyNpbmNsdWRlICJtZTA2MDBfdHRsaS5oIgorCisvKgorICogRGVmaW5lcworICovCisKKy8qCisgKiBGdW5jdGlvbnMKKyAqLworCitzdGF0aWMgaW50IG1lMDYwMF90dGxpX2lvX3Jlc2V0X3N1YmRldmljZShzdHJ1Y3QgbWVfc3ViZGV2aWNlICpzdWJkZXZpY2UsCisJCQkJCSAgc3RydWN0IGZpbGUgKmZpbGVwLCBpbnQgZmxhZ3MpCit7CisJaWYgKGZsYWdzKSB7CisJCVBFUlJPUigiSW52YWxpZCBmbGFnIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWUwNjAwX3R0bGlfaW9fc2luZ2xlX2NvbmZpZyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCQlpbnQgY2hhbm5lbCwKKwkJCQkJaW50IHNpbmdsZV9jb25maWcsCisJCQkJCWludCByZWYsCisJCQkJCWludCB0cmlnX2NoYW4sCisJCQkJCWludCB0cmlnX3R5cGUsIGludCB0cmlnX2VkZ2UsIGludCBmbGFncykKK3sKKwltZTA2MDBfdHRsaV9zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbnN0YW5jZSA9IChtZTA2MDBfdHRsaV9zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlzcGluX2xvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisKKwlzd2l0Y2ggKGZsYWdzKSB7CisJY2FzZSBNRV9JT19TSU5HTEVfQ09ORklHX05PX0ZMQUdTOgorCWNhc2UgTUVfSU9fU0lOR0xFX0NPTkZJR19ESU9fQllURToKKwkJaWYgKGNoYW5uZWwgPT0gMCkgeworCQkJaWYgKHNpbmdsZV9jb25maWcgIT0gTUVfU0lOR0xFX0NPTkZJR19ESU9fSU5QVVQpIHsKKwkJCQlQRVJST1IoIkludmFsaWQgcG9ydCBkaXJlY3Rpb24gc3BlY2lmaWVkLlxuIik7CisJCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9TSU5HTEVfQ09ORklHOworCQkJfQorCQl9IGVsc2UgeworCQkJUEVSUk9SKCJJbnZhbGlkIGNoYW5uZWwgc3BlY2lmaWVkLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJCX0KKworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCVBFUlJPUigiSW52YWxpZCBmbGFncyBzcGVjaWZpZWQuXG4iKTsKKworCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCisJCWJyZWFrOworCX0KKworCXNwaW5fdW5sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lMDYwMF90dGxpX2lvX3NpbmdsZV9yZWFkKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgICBpbnQgY2hhbm5lbCwKKwkJCQkgICAgICBpbnQgKnZhbHVlLCBpbnQgdGltZV9vdXQsIGludCBmbGFncykKK3sKKwltZTA2MDBfdHRsaV9zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbnN0YW5jZSA9IChtZTA2MDBfdHRsaV9zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlzcGluX2xvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisKKwlzd2l0Y2ggKGZsYWdzKSB7CisJY2FzZSBNRV9JT19TSU5HTEVfVFlQRV9ESU9fQklUOgorCQlpZiAoKGNoYW5uZWwgPj0gMCkgJiYgKGNoYW5uZWwgPCA4KSkgeworCQkJKnZhbHVlID0gaW5iKGluc3RhbmNlLT5wb3J0X3JlZykgJiAoMHgxIDw8IGNoYW5uZWwpOworCQl9IGVsc2UgeworCQkJUEVSUk9SKCJJbnZhbGlkIGJpdCBudW1iZXIgc3BlY2lmaWVkLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIE1FX0lPX1NJTkdMRV9OT19GTEFHUzoKKwljYXNlIE1FX0lPX1NJTkdMRV9UWVBFX0RJT19CWVRFOgorCQlpZiAoY2hhbm5lbCA9PSAwKSB7CisJCQkqdmFsdWUgPSBpbmIoaW5zdGFuY2UtPnBvcnRfcmVnKTsKKwkJfSBlbHNlIHsKKwkJCVBFUlJPUigiSW52YWxpZCBieXRlIG51bWJlciBzcGVjaWZpZWQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCVBFUlJPUigiSW52YWxpZCBmbGFncyBzcGVjaWZpZWQuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlzcGluX3VubG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZTA2MDBfdHRsaV9xdWVyeV9udW1iZXJfY2hhbm5lbHMobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJCSAgICAgaW50ICpudW1iZXIpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCSpudW1iZXIgPSA4OworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lMDYwMF90dGxpX3F1ZXJ5X3N1YmRldmljZV90eXBlKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQkgICAgaW50ICp0eXBlLCBpbnQgKnN1YnR5cGUpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCSp0eXBlID0gTUVfVFlQRV9ESTsKKwkqc3VidHlwZSA9IE1FX1NVQlRZUEVfU0lOR0xFOworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lMDYwMF90dGxpX3F1ZXJ5X3N1YmRldmljZV9jYXBzKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQkgICAgaW50ICpjYXBzKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwkqY2FwcyA9IDA7CisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK21lMDYwMF90dGxpX3N1YmRldmljZV90ICptZTA2MDBfdHRsaV9jb25zdHJ1Y3Rvcih1aW50MzJfdCByZWdfYmFzZSkKK3sKKwltZTA2MDBfdHRsaV9zdWJkZXZpY2VfdCAqc3ViZGV2aWNlOworCWludCBlcnI7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwkvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHN1YmRldmljZSBpbnN0YW5jZSAqLworCXN1YmRldmljZSA9IGttYWxsb2Moc2l6ZW9mKG1lMDYwMF90dGxpX3N1YmRldmljZV90KSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIXN1YmRldmljZSkgeworCQlQRVJST1IoIkNhbm5vdCBnZXQgbWVtb3J5IGZvciBzdWJkZXZpY2UgaW5zdGFuY2UuXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJbWVtc2V0KHN1YmRldmljZSwgMCwgc2l6ZW9mKG1lMDYwMF90dGxpX3N1YmRldmljZV90KSk7CisKKwkvKiBJbml0aWFsaXplIHN1YmRldmljZSBiYXNlIGNsYXNzICovCisJZXJyID0gbWVfc3ViZGV2aWNlX2luaXQoJnN1YmRldmljZS0+YmFzZSk7CisKKwlpZiAoZXJyKSB7CisJCVBFUlJPUigiQ2Fubm90IGluaXRpYWxpemUgc3ViZGV2aWNlIGJhc2UgY2xhc3MgaW5zdGFuY2UuXG4iKTsKKwkJa2ZyZWUoc3ViZGV2aWNlKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCS8vIEluaXRpYWxpemUgc3BpbiBsb2Nrcy4KKwlzcGluX2xvY2tfaW5pdCgmc3ViZGV2aWNlLT5zdWJkZXZpY2VfbG9jayk7CisKKwkvKiBTYXZlIHRoZSBzdWJkZXZpY2UgaW5kZXggKi8KKwlzdWJkZXZpY2UtPnBvcnRfcmVnID0gcmVnX2Jhc2UgKyBNRTA2MDBfVFRMX0lOUFVUX1JFRzsKKworCS8qIE92ZXJsb2FkIGJhc2UgY2xhc3MgbWV0aG9kcy4gKi8KKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3Jlc2V0X3N1YmRldmljZSA9CisJICAgIG1lMDYwMF90dGxpX2lvX3Jlc2V0X3N1YmRldmljZTsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3NpbmdsZV9jb25maWcgPQorCSAgICBtZTA2MDBfdHRsaV9pb19zaW5nbGVfY29uZmlnOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fc2luZ2xlX3JlYWQgPQorCSAgICBtZTA2MDBfdHRsaV9pb19zaW5nbGVfcmVhZDsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X251bWJlcl9jaGFubmVscyA9CisJICAgIG1lMDYwMF90dGxpX3F1ZXJ5X251bWJlcl9jaGFubmVsczsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV90eXBlID0KKwkgICAgbWUwNjAwX3R0bGlfcXVlcnlfc3ViZGV2aWNlX3R5cGU7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9zdWJkZXZpY2VfY2FwcyA9CisJICAgIG1lMDYwMF90dGxpX3F1ZXJ5X3N1YmRldmljZV9jYXBzOworCisJcmV0dXJuIHN1YmRldmljZTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTA2MDBfdHRsaS5oIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMDYwMF90dGxpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM5MDM5NgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTA2MDBfdHRsaS5oCkBAIC0wLDAgKzEsNTggQEAKKy8qKgorICogQGZpbGUgbWUwNjAwX3R0bGkuaAorICoKKyAqIEBicmllZiBNRS02MzAgVFRMIGlucHV0IHN1YmRldmljZSBjbGFzcy4KKyAqIEBub3RlIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKiBAYXV0aG9yIEd1ZW50ZXIgR2ViaGFyZHQKKyAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9NRTA2MDBfVFRMSV9IXworI2RlZmluZSBfTUUwNjAwX1RUTElfSF8KKworI2luY2x1ZGUgIm1lc3ViZGV2aWNlLmgiCisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKy8qKgorICogQGJyaWVmIFRoZSB0ZW1wbGF0ZSBzdWJkZXZpY2UgY2xhc3MuCisgKi8KK3R5cGVkZWYgc3RydWN0IG1lMDYwMF90dGxpX3N1YmRldmljZSB7CisJLyogSW5oZXJpdGFuY2UgKi8KKwltZV9zdWJkZXZpY2VfdCBiYXNlOwkJCS8qKjwgVGhlIHN1YmRldmljZSBiYXNlIGNsYXNzLiAqLworCisJLyogQXR0cmlidXRlcyAqLworCXNwaW5sb2NrX3Qgc3ViZGV2aWNlX2xvY2s7CQkvKio8IFNwaW4gbG9jayB0byBwcm90ZWN0IHRoZSBzdWJkZXZpY2UgZnJvbSBjb25jdXJyZW50IGFjY2Vzcy4gKi8KKworCXVpbnQzMl90IHBvcnRfcmVnOwkJCS8qKjwgUmVnaXN0ZXIgaG9sZGluZyB0aGUgcG9ydCBzdGF0dXMuICovCit9IG1lMDYwMF90dGxpX3N1YmRldmljZV90OworCisvKioKKyAqIEBicmllZiBUaGUgY29uc3RydWN0b3IgdG8gZ2VuZXJhdGUgYSBNRS02MzAgVFRMIGlucHV0IHN1YmRldmljZSBpbnN0YW5jZS4KKyAqCisgKiBAcGFyYW0gcmVnX2Jhc2UgVGhlIHJlZ2lzdGVyIGJhc2UgYWRkcmVzcyBvZiB0aGUgZGV2aWNlIGFzIHJldHVybmVkIGJ5IHRoZSBQQ0kgQklPUy4KKyAqCisgKiBAcmV0dXJuIFBvaW50ZXIgdG8gbmV3IGluc3RhbmNlIG9uIHN1Y2Nlc3MuXG4KKyAqIE5VTEwgb24gZXJyb3IuCisgKi8KK21lMDYwMF90dGxpX3N1YmRldmljZV90ICptZTA2MDBfdHRsaV9jb25zdHJ1Y3Rvcih1aW50MzJfdCByZWdfYmFzZSk7CisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUwNjAwX3R0bGlfcmVnLmggYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUwNjAwX3R0bGlfcmVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGY5ODZkMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTA2MDBfdHRsaV9yZWcuaApAQCAtMCwwICsxLDM1IEBACisvKioKKyAqIEBmaWxlIG1lMDYwMF90dGxpX3JlZy5oCisgKgorICogQGJyaWVmIE1FLTYzMCBUVEwgaW5wdXQgc3ViZGV2aWNlIHJlZ2lzdGVyIGRlZmluaXRpb25zLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX01FMDYwMF9UVExJX1JFR19IXworI2RlZmluZSBfTUUwNjAwX1RUTElfUkVHX0hfCisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKyNkZWZpbmUgTUUwNjAwX1RUTF9JTlBVVF9SRUcgICAgICAgMHgwMDAzCisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUwOTAwX2RldmljZS5jIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMDkwMF9kZXZpY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjRkNWQzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMDkwMF9kZXZpY2UuYwpAQCAtMCwwICsxLDE4MCBAQAorLyoqCisgKiBAZmlsZSBtZTA5MDBfZGV2aWNlLmMKKyAqCisgKiBAYnJpZWYgTUUtOXggZGV2aWNlIGNsYXNzIGltcGxlbWVudGF0aW9uLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICogQGF1dGhvciBLcnp5c3p0b2YgR2FudHprZQkoay5nYW50emtlQG1laWxoYXVzLmRlKQorKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0tFUk5FTF9fCisjICBkZWZpbmUgX19LRVJORUxfXworI2VuZGlmCisKKyNpZm5kZWYgTU9EVUxFCisjICBkZWZpbmUgTU9EVUxFCisjZW5kaWYKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCisjaW5jbHVkZSAibWVpZHMuaCIKKyNpbmNsdWRlICJtZWVycm9yLmgiCisjaW5jbHVkZSAibWVjb21tb24uaCIKKyNpbmNsdWRlICJtZWludGVybmFsLmgiCisKKyNpbmNsdWRlICJtZWRlYnVnLmgiCisjaW5jbHVkZSAibWVkZXZpY2UuaCIKKyNpbmNsdWRlICJtZTA5MDBfZGV2aWNlLmgiCisjaW5jbHVkZSAibWUwOTAwX3JlZy5oIgorI2luY2x1ZGUgIm1lc3ViZGV2aWNlLmgiCisjaW5jbHVkZSAibWUwOTAwX2RvLmgiCisjaW5jbHVkZSAibWUwOTAwX2RpLmgiCisKK21lX2RldmljZV90ICptZTA5MDBfcGNpX2NvbnN0cnVjdG9yKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2aWNlKQoreworCW1lMDkwMF9kZXZpY2VfdCAqbWUwOTAwX2RldmljZTsKKwltZV9zdWJkZXZpY2VfdCAqc3ViZGV2aWNlOworCXVuc2lnbmVkIGludCB2ZXJzaW9uX2lkeDsKKwlpbnQgZXJyOworCWludCBpOworCWludCBwb3J0X3NoaWZ0OworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJLy8gQWxsb2NhdGUgc3RydWN0dXJlIGZvciBkZXZpY2UgaW5zdGFuY2UuCisJbWUwOTAwX2RldmljZSA9IGttYWxsb2Moc2l6ZW9mKG1lMDkwMF9kZXZpY2VfdCksIEdGUF9LRVJORUwpOworCisJaWYgKCFtZTA5MDBfZGV2aWNlKSB7CisJCVBFUlJPUigiQ2Fubm90IGdldCBtZW1vcnkgZm9yIGRldmljZSBpbnN0YW5jZS5cbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwltZW1zZXQobWUwOTAwX2RldmljZSwgMCwgc2l6ZW9mKG1lMDkwMF9kZXZpY2VfdCkpOworCisJLy8gSW5pdGlhbGl6ZSBiYXNlIGNsYXNzIHN0cnVjdHVyZS4KKwllcnIgPSBtZV9kZXZpY2VfcGNpX2luaXQoKG1lX2RldmljZV90ICopIG1lMDkwMF9kZXZpY2UsIHBjaV9kZXZpY2UpOworCisJaWYgKGVycikgeworCQlrZnJlZShtZTA5MDBfZGV2aWNlKTsKKwkJUEVSUk9SKCJDYW5ub3QgaW5pdGlhbGl6ZSBkZXZpY2UgYmFzZSBjbGFzcy5cbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKiBHZXQgdGhlIGluZGV4IGluIHRoZSBkZXZpY2UgdmVyc2lvbiBpbmZvcm1hdGlvbiB0YWJsZS4gKi8KKwl2ZXJzaW9uX2lkeCA9CisJICAgIG1lMDkwMF92ZXJzaW9uc19nZXRfZGV2aWNlX2luZGV4KG1lMDkwMF9kZXZpY2UtPmJhc2UuaW5mby5wY2kuCisJCQkJCSAgICAgZGV2aWNlX2lkKTsKKworCS8qIEluaXRpYWxpemUgODI1NSBjaGlwIHRvIGRlc2lyZWQgbW9kZSAqLworCWlmIChtZTA5MDBfZGV2aWNlLT5iYXNlLmluZm8ucGNpLmRldmljZV9pZCA9PQorCSAgICBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMDk0MCkgeworCQlvdXRiKDB4OUIsCisJCSAgICAgbWUwOTAwX2RldmljZS0+YmFzZS5pbmZvLnBjaS5yZWdfYmFzZXNbMl0gKworCQkgICAgIE1FMDkwMF9DVFJMX1JFRyk7CisJfSBlbHNlIGlmIChtZTA5MDBfZGV2aWNlLT5iYXNlLmluZm8ucGNpLmRldmljZV9pZCA9PQorCQkgICBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMDk1MCkgeworCQlvdXRiKDB4ODksCisJCSAgICAgbWUwOTAwX2RldmljZS0+YmFzZS5pbmZvLnBjaS5yZWdfYmFzZXNbMl0gKworCQkgICAgIE1FMDkwMF9DVFJMX1JFRyk7CisJCW91dGIoMHgwMCwKKwkJICAgICBtZTA5MDBfZGV2aWNlLT5iYXNlLmluZm8ucGNpLnJlZ19iYXNlc1syXSArCisJCSAgICAgTUUwOTAwX1dSSVRFX0VOQUJMRV9SRUcpOworCX0gZWxzZSBpZiAobWUwOTAwX2RldmljZS0+YmFzZS5pbmZvLnBjaS5kZXZpY2VfaWQgPT0KKwkJICAgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTA5NjApIHsKKwkJb3V0YigweDhCLAorCQkgICAgIG1lMDkwMF9kZXZpY2UtPmJhc2UuaW5mby5wY2kucmVnX2Jhc2VzWzJdICsKKwkJICAgICBNRTA5MDBfQ1RSTF9SRUcpOworCQlvdXRiKDB4MDAsCisJCSAgICAgbWUwOTAwX2RldmljZS0+YmFzZS5pbmZvLnBjaS5yZWdfYmFzZXNbMl0gKworCQkgICAgIE1FMDkwMF9XUklURV9FTkFCTEVfUkVHKTsKKwl9CisKKwlwb3J0X3NoaWZ0ID0KKwkgICAgKG1lMDkwMF9kZXZpY2UtPmJhc2UuaW5mby5wY2kuZGV2aWNlX2lkID09CisJICAgICBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMDk2MCkgPyAxIDogMDsKKwkvLyBDcmVhdGUgc3ViZGV2aWNlIGluc3RhbmNlcy4KKworCWZvciAoaSA9IDA7IGkgPCBtZTA5MDBfdmVyc2lvbnNbdmVyc2lvbl9pZHhdLmRpX3N1YmRldmljZXM7IGkrKykgeworCQlzdWJkZXZpY2UgPQorCQkgICAgKG1lX3N1YmRldmljZV90ICopIG1lMDkwMF9kaV9jb25zdHJ1Y3RvcihtZTA5MDBfZGV2aWNlLT4KKwkJCQkJCQkgICAgIGJhc2UuaW5mby5wY2kuCisJCQkJCQkJICAgICByZWdfYmFzZXNbMl0sCisJCQkJCQkJICAgICBpICsgcG9ydF9zaGlmdCk7CisKKwkJaWYgKCFzdWJkZXZpY2UpIHsKKwkJCW1lX2RldmljZV9kZWluaXQoKG1lX2RldmljZV90ICopIG1lMDkwMF9kZXZpY2UpOworCQkJa2ZyZWUobWUwOTAwX2RldmljZSk7CisJCQlQRVJST1IoIkNhbm5vdCBnZXQgbWVtb3J5IGZvciBzdWJkZXZpY2UuXG4iKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisKKwkJbWVfc2xpc3RfYWRkX3N1YmRldmljZV90YWlsKCZtZTA5MDBfZGV2aWNlLT5iYXNlLnNsaXN0LAorCQkJCQkgICAgc3ViZGV2aWNlKTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgbWUwOTAwX3ZlcnNpb25zW3ZlcnNpb25faWR4XS5kb19zdWJkZXZpY2VzOyBpKyspIHsKKwkJc3ViZGV2aWNlID0KKwkJICAgIChtZV9zdWJkZXZpY2VfdCAqKSBtZTA5MDBfZG9fY29uc3RydWN0b3IobWUwOTAwX2RldmljZS0+CisJCQkJCQkJICAgICBiYXNlLmluZm8ucGNpLgorCQkJCQkJCSAgICAgcmVnX2Jhc2VzWzJdLCBpKTsKKworCQlpZiAoIXN1YmRldmljZSkgeworCQkJbWVfZGV2aWNlX2RlaW5pdCgobWVfZGV2aWNlX3QgKikgbWUwOTAwX2RldmljZSk7CisJCQlrZnJlZShtZTA5MDBfZGV2aWNlKTsKKwkJCVBFUlJPUigiQ2Fubm90IGdldCBtZW1vcnkgZm9yIHN1YmRldmljZS5cbiIpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKworCQltZV9zbGlzdF9hZGRfc3ViZGV2aWNlX3RhaWwoJm1lMDkwMF9kZXZpY2UtPmJhc2Uuc2xpc3QsCisJCQkJCSAgICBzdWJkZXZpY2UpOworCX0KKworCXJldHVybiAobWVfZGV2aWNlX3QgKikgbWUwOTAwX2RldmljZTsKK30KKworLy8gSW5pdCBhbmQgZXhpdCBvZiBtb2R1bGUuCisKK3N0YXRpYyBpbnQgX19pbml0IG1lMDkwMF9pbml0KHZvaWQpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbi4iKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IG1lMDkwMF9leGl0KHZvaWQpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbi4iKTsKK30KKworbW9kdWxlX2luaXQobWUwOTAwX2luaXQpOworbW9kdWxlX2V4aXQobWUwOTAwX2V4aXQpOworCisvLyBBZG1pbmlzdHJhdGl2ZSBzdHVmZiBmb3IgbW9kaW5mby4KK01PRFVMRV9BVVRIT1IKKyAgICAoIkd1ZW50ZXIgR2ViaGFyZHQgPGcuZ2ViaGFyZHRAbWVpbGhhdXMuZGU+ICYgS3J6eXN6dG9mIEdhbnR6a2UgPGsuZ2FudHprZUBtZWlsaGF1cy5kZT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiRGV2aWNlIERyaXZlciBNb2R1bGUgZm9yIE1FLTl4IERldmljZSIpOworTU9EVUxFX1NVUFBPUlRFRF9ERVZJQ0UoIk1laWxoYXVzIE1FLTl4IERldmljZXMiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworLy8gRXhwb3J0IHRoZSBjb25zdHJ1Y3Rvci4KK0VYUE9SVF9TWU1CT0wobWUwOTAwX3BjaV9jb25zdHJ1Y3Rvcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUwOTAwX2RldmljZS5oIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMDkwMF9kZXZpY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDE3ZjI1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMDkwMF9kZXZpY2UuaApAQCAtMCwwICsxLDkyIEBACisvKioKKyAqIEBmaWxlIG1lMDkwMF9kZXZpY2UuaAorICoKKyAqIEBicmllZiBNRS0wOTAwIChNRS05eCkgZGV2aWNlIGNsYXNzLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX01FMDkwMF9ERVZJQ0VfSAorI2RlZmluZSBfTUUwOTAwX0RFVklDRV9ICisKKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorCisjaW5jbHVkZSAibWVkZXZpY2UuaCIKKworI2lmZGVmIF9fS0VSTkVMX18KKworLyoqCisgKiBAYnJpZWYgU3RydWN0dXJlIGhvbGRpbmcgTUUtMDkwMCAoTUUtOXgpIGRldmljZSBjYXBhYmlsaXRpZXMuCisgKi8KK3R5cGVkZWYgc3RydWN0IG1lMDkwMF92ZXJzaW9uIHsKKwl1aW50MTZfdCBkZXZpY2VfaWQ7CisJdW5zaWduZWQgaW50IGRpX3N1YmRldmljZXM7CisJdW5zaWduZWQgaW50IGRvX3N1YmRldmljZXM7Cit9IG1lMDkwMF92ZXJzaW9uX3Q7CisKKy8qKgorICogQGJyaWVmIERldmljZSBjYXBhYmlsaXRpZXMuCisgKi8KK3N0YXRpYyBtZTA5MDBfdmVyc2lvbl90IG1lMDkwMF92ZXJzaW9uc1tdID0geworCXtQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMDk0MCwgMiwgMH0sCisJe1BDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUwOTUwLCAwLCAyfSwKKwl7UENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTA5NjAsIDEsIDF9LAorCXswfSwKK307CisKKyNkZWZpbmUgTUUwOTAwX0RFVklDRV9WRVJTSU9OUyAoc2l6ZW9mKG1lMDkwMF92ZXJzaW9ucykgLyBzaXplb2YobWUwOTAwX3ZlcnNpb25fdCkgLSAxKQkvKio8IFJldHVybnMgdGhlIG51bWJlciBvZiBlbnRyaWVzIGluICNtZTA5MDBfdmVyc2lvbnMuICovCisKKy8qKgorICogQGJyaWVmIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBkZXZpY2UgZW50cnkgaW4gI21lMDkwMF92ZXJzaW9ucy4KKyAqCisgKiBAcGFyYW0gZGV2aWNlX2lkIFRoZSBQQ0kgZGV2aWNlIGlkIG9mIHRoZSBkZXZpY2UgdG8gcXVlcnkuCisgKiBAcmV0dXJuIFRoZSBpbmRleCBvZiB0aGUgZGV2aWNlIGluICNtZTA5MDBfdmVyc2lvbnMuCisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IG1lMDkwMF92ZXJzaW9uc19nZXRfZGV2aWNlX2luZGV4KHVpbnQxNl90IGRldmljZV9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgTUUwOTAwX0RFVklDRV9WRVJTSU9OUzsgaSsrKQorCQlpZiAobWUwOTAwX3ZlcnNpb25zW2ldLmRldmljZV9pZCA9PSBkZXZpY2VfaWQpCisJCQlicmVhazsKKwlyZXR1cm4gaTsKK30KKworLyoqCisgKiBAYnJpZWYgVGhlIE1FLTA5MDAgKE1FLTl4KSBkZXZpY2UgY2xhc3Mgc3RydWN0dXJlLgorICovCit0eXBlZGVmIHN0cnVjdCBtZTA5MDBfZGV2aWNlIHsKKwltZV9kZXZpY2VfdCBiYXNlOwkJCS8qKjwgVGhlIE1laWxoYXVzIGRldmljZSBiYXNlIGNsYXNzLiAqLworfSBtZTA5MDBfZGV2aWNlX3Q7CisKKy8qKgorICogQGJyaWVmIFRoZSBNRS05eCBkZXZpY2UgY2xhc3MgY29uc3RydWN0b3IuCisgKgorICogQHBhcmFtIHBjaV9kZXZpY2UgVGhlIHBjaSBkZXZpY2Ugc3RydWN0dXJlIGdpdmVuIGJ5IHRoZSBQQ0kgc3Vic3lzdGVtLgorICoKKyAqIEByZXR1cm4gT24gc3VjY2VzIGEgbmV3IE1FLTA5MDAgKE1FLTl4KSBkZXZpY2UgaW5zdGFuY2UuIFxuCisgKiAgICAgICAgIE5VTEwgb24gZXJyb3IuCisgKi8KK21lX2RldmljZV90ICptZTA5MDBfcGNpX2NvbnN0cnVjdG9yKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2aWNlKQorICAgIF9fYXR0cmlidXRlX18gKCh3ZWFrKSk7CisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUwOTAwX2RpLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUwOTAwX2RpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDdkNzM5NAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTA5MDBfZGkuYwpAQCAtMCwwICsxLDI0NiBAQAorLyoqCisgKiBAZmlsZSBtZTA5MDBfZGkuYworICoKKyAqIEBicmllZiBNRS05eCBkaWdpdGFsIGlucHV0IHN1YmRldmljZSBpbnN0YW5jZS4KKyAqIEBub3RlIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKiBAYXV0aG9yIEd1ZW50ZXIgR2ViaGFyZHQKKyAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9fS0VSTkVMX18KKyMgIGRlZmluZSBfX0tFUk5FTF9fCisjZW5kaWYKKworLyoKKyAqIEluY2x1ZGVzCisgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorCisjaW5jbHVkZSAibWVkZWZpbmVzLmgiCisjaW5jbHVkZSAibWVpbnRlcm5hbC5oIgorI2luY2x1ZGUgIm1lZXJyb3IuaCIKKworI2luY2x1ZGUgIm1laWRzLmgiCisjaW5jbHVkZSAibWVkZWJ1Zy5oIgorI2luY2x1ZGUgIm1lcGx4X3JlZy5oIgorI2luY2x1ZGUgIm1lMDkwMF9yZWcuaCIKKyNpbmNsdWRlICJtZTA5MDBfZGkuaCIKKworLyoKKyAqIERlZmluZXMKKyAqLworCisvKgorICogRnVuY3Rpb25zCisgKi8KKworc3RhdGljIGludCBtZTA5MDBfZGlfaW9fcmVzZXRfc3ViZGV2aWNlKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSwKKwkJCQkJc3RydWN0IGZpbGUgKmZpbGVwLCBpbnQgZmxhZ3MpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJaWYgKGZsYWdzKSB7CisJCVBFUlJPUigiSW52YWxpZCBmbGFnIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZTA5MDBfZGlfaW9fc2luZ2xlX2NvbmZpZyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgICAgaW50IGNoYW5uZWwsCisJCQkJICAgICAgaW50IHNpbmdsZV9jb25maWcsCisJCQkJICAgICAgaW50IHJlZiwKKwkJCQkgICAgICBpbnQgdHJpZ19jaGFuLAorCQkJCSAgICAgIGludCB0cmlnX3R5cGUsIGludCB0cmlnX2VkZ2UsIGludCBmbGFncykKK3sKKwltZTA5MDBfZGlfc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJaW5zdGFuY2UgPSAobWUwOTAwX2RpX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCXNwaW5fbG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKwlzd2l0Y2ggKGZsYWdzKSB7CisJY2FzZSBNRV9JT19TSU5HTEVfQ09ORklHX05PX0ZMQUdTOgorCWNhc2UgTUVfSU9fU0lOR0xFX1RZUEVfRElPX0JZVEU6CisJCWlmIChjaGFubmVsID09IDApIHsKKwkJCWlmIChzaW5nbGVfY29uZmlnID09IE1FX1NJTkdMRV9DT05GSUdfRElPX0lOUFVUKSB7CisJCQl9IGVsc2UgeworCQkJCVBFUlJPUigiSW52YWxpZCBieXRlIGRpcmVjdGlvbiBzcGVjaWZpZWQuXG4iKTsKKwkJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX1NJTkdMRV9DT05GSUc7CisJCQl9CisJCX0gZWxzZSB7CisJCQlQRVJST1IoIkludmFsaWQgYnl0ZSBudW1iZXIgc3BlY2lmaWVkLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlQRVJST1IoIkludmFsaWQgZmxhZ3Mgc3BlY2lmaWVkLlxuIik7CisJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJfQorCXNwaW5fdW5sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lMDkwMF9kaV9pb19zaW5nbGVfcmVhZChtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICBpbnQgY2hhbm5lbCwKKwkJCQkgICAgaW50ICp2YWx1ZSwgaW50IHRpbWVfb3V0LCBpbnQgZmxhZ3MpCit7CisJbWUwOTAwX2RpX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lMDkwMF9kaV9zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlzcGluX2xvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisJc3dpdGNoIChmbGFncykgeworCWNhc2UgTUVfSU9fU0lOR0xFX1RZUEVfRElPX0JJVDoKKwkJaWYgKChjaGFubmVsID49IDApICYmIChjaGFubmVsIDwgOCkpIHsKKwkJCSp2YWx1ZSA9ICh+aW5iKGluc3RhbmNlLT5wb3J0X3JlZykpICYgKDB4MSA8PCBjaGFubmVsKTsKKwkJfSBlbHNlIHsKKwkJCVBFUlJPUigiSW52YWxpZCBiaXQgbnVtYmVyIHNwZWNpZmllZC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCQl9CisJCWJyZWFrOworCisJY2FzZSBNRV9JT19TSU5HTEVfTk9fRkxBR1M6CisJY2FzZSBNRV9JT19TSU5HTEVfVFlQRV9ESU9fQllURToKKwkJaWYgKGNoYW5uZWwgPT0gMCkgeworCQkJKnZhbHVlID0gfmluYihpbnN0YW5jZS0+cG9ydF9yZWcpOworCQl9IGVsc2UgeworCQkJUEVSUk9SKCJJbnZhbGlkIGJ5dGUgbnVtYmVyIHNwZWNpZmllZC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWdzIHNwZWNpZmllZC5cbiIpOworCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKwlzcGluX3VubG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZTA5MDBfZGlfcXVlcnlfbnVtYmVyX2NoYW5uZWxzKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQkgICBpbnQgKm51bWJlcikKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJKm51bWJlciA9IDg7CisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWUwOTAwX2RpX3F1ZXJ5X3N1YmRldmljZV90eXBlKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQkgIGludCAqdHlwZSwgaW50ICpzdWJ0eXBlKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwkqdHlwZSA9IE1FX1RZUEVfREk7CisJKnN1YnR5cGUgPSBNRV9TVUJUWVBFX1NJTkdMRTsKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZTA5MDBfZGlfcXVlcnlfc3ViZGV2aWNlX2NhcHMobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsIGludCAqY2FwcykKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJKmNhcHMgPSAwOworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCittZTA5MDBfZGlfc3ViZGV2aWNlX3QgKm1lMDkwMF9kaV9jb25zdHJ1Y3Rvcih1aW50MzJfdCByZWdfYmFzZSwKKwkJCQkJICAgICB1bnNpZ25lZCBpbnQgZGlfaWR4KQoreworCW1lMDkwMF9kaV9zdWJkZXZpY2VfdCAqc3ViZGV2aWNlOworCWludCBlcnI7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwkvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHN1YmRldmljZSBpbnN0YW5jZSAqLworCXN1YmRldmljZSA9IGttYWxsb2Moc2l6ZW9mKG1lMDkwMF9kaV9zdWJkZXZpY2VfdCksIEdGUF9LRVJORUwpOworCisJaWYgKCFzdWJkZXZpY2UpIHsKKwkJUEVSUk9SKCJDYW5ub3QgZ2V0IG1lbW9yeSBmb3Igc3ViZGV2aWNlIGluc3RhbmNlLlxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCW1lbXNldChzdWJkZXZpY2UsIDAsIHNpemVvZihtZTA5MDBfZGlfc3ViZGV2aWNlX3QpKTsKKworCS8qIEluaXRpYWxpemUgc3ViZGV2aWNlIGJhc2UgY2xhc3MgKi8KKwllcnIgPSBtZV9zdWJkZXZpY2VfaW5pdCgmc3ViZGV2aWNlLT5iYXNlKTsKKworCWlmIChlcnIpIHsKKwkJUEVSUk9SKCJDYW5ub3QgaW5pdGlhbGl6ZSBzdWJkZXZpY2UgYmFzZSBjbGFzcyBpbnN0YW5jZS5cbiIpOworCQlrZnJlZShzdWJkZXZpY2UpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJLy8gSW5pdGlhbGl6ZSBzcGluIGxvY2tzLgorCXNwaW5fbG9ja19pbml0KCZzdWJkZXZpY2UtPnN1YmRldmljZV9sb2NrKTsKKworCS8qIFNhdmUgdGhlIHN1YmRldmljZSBpbmRleC4gKi8KKwlzdWJkZXZpY2UtPmRpX2lkeCA9IGRpX2lkeDsKKworCS8qIEluaXRpYWxpemUgcmVnaXN0ZXJzICovCisJaWYgKGRpX2lkeCA9PSAwKSB7CisJCXN1YmRldmljZS0+Y3RybF9yZWcgPSByZWdfYmFzZSArIE1FMDkwMF9DVFJMX1JFRzsKKwkJc3ViZGV2aWNlLT5wb3J0X3JlZyA9IHJlZ19iYXNlICsgTUUwOTAwX1BPUlRfQV9SRUc7CisJfSBlbHNlIHsKKwkJc3ViZGV2aWNlLT5jdHJsX3JlZyA9IHJlZ19iYXNlICsgTUUwOTAwX0NUUkxfUkVHOworCQlzdWJkZXZpY2UtPnBvcnRfcmVnID0gcmVnX2Jhc2UgKyBNRTA5MDBfUE9SVF9CX1JFRzsKKwl9CisjaWZkZWYgTUVERUJVR19ERUJVR19SRUcKKwlzdWJkZXZpY2UtPnJlZ19iYXNlID0gcmVnX2Jhc2U7CisjZW5kaWYKKworCS8qIE92ZXJsb2FkIGJhc2UgY2xhc3MgbWV0aG9kcy4gKi8KKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3Jlc2V0X3N1YmRldmljZSA9CisJICAgIG1lMDkwMF9kaV9pb19yZXNldF9zdWJkZXZpY2U7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19zaW5nbGVfY29uZmlnID0KKwkgICAgbWUwOTAwX2RpX2lvX3NpbmdsZV9jb25maWc7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19zaW5nbGVfcmVhZCA9IG1lMDkwMF9kaV9pb19zaW5nbGVfcmVhZDsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X251bWJlcl9jaGFubmVscyA9CisJICAgIG1lMDkwMF9kaV9xdWVyeV9udW1iZXJfY2hhbm5lbHM7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9zdWJkZXZpY2VfdHlwZSA9CisJICAgIG1lMDkwMF9kaV9xdWVyeV9zdWJkZXZpY2VfdHlwZTsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV9jYXBzID0KKwkgICAgbWUwOTAwX2RpX3F1ZXJ5X3N1YmRldmljZV9jYXBzOworCisJcmV0dXJuIHN1YmRldmljZTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTA5MDBfZGkuaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTA5MDBfZGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTRmMTM0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMDkwMF9kaS5oCkBAIC0wLDAgKzEsNjUgQEAKKy8qKgorICogQGZpbGUgbWUwOTAwX2RpLmgKKyAqCisgKiBAYnJpZWYgTUUtOXggZGlnaXRhbCBpbnB1dCBzdWJkZXZpY2UgY2xhc3MuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfTUUwOTAwX0RJX0hfCisjZGVmaW5lIF9NRTA5MDBfRElfSF8KKworI2luY2x1ZGUgIm1lc3ViZGV2aWNlLmgiCisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKy8qKgorICogQGJyaWVmIFRoZSB0ZW1wbGF0ZSBzdWJkZXZpY2UgY2xhc3MuCisgKi8KK3R5cGVkZWYgc3RydWN0IG1lMDkwMF9kaV9zdWJkZXZpY2UgeworCS8qIEluaGVyaXRhbmNlICovCisJbWVfc3ViZGV2aWNlX3QgYmFzZTsJCQkvKio8IFRoZSBzdWJkZXZpY2UgYmFzZSBjbGFzcy4gKi8KKworCS8qIEF0dHJpYnV0ZXMgKi8KKwlzcGlubG9ja190IHN1YmRldmljZV9sb2NrOwkJLyoqPCBTcGluIGxvY2sgdG8gcHJvdGVjdCB0aGUgc3ViZGV2aWNlIGZyb20gY29uY3VycmVudCBhY2Nlc3MuICovCisKKwl1bnNpZ25lZCBpbnQgZGlfaWR4OworCisJdW5zaWduZWQgbG9uZyBjdHJsX3JlZzsKKwl1bnNpZ25lZCBsb25nIHBvcnRfcmVnOworI2lmZGVmIE1FREVCVUdfREVCVUdfUkVHCisJdW5zaWduZWQgbG9uZyByZWdfYmFzZTsKKyNlbmRpZgorfSBtZTA5MDBfZGlfc3ViZGV2aWNlX3Q7CisKKy8qKgorICogQGJyaWVmIFRoZSBjb25zdHJ1Y3RvciB0byBnZW5lcmF0ZSBhIE1FLTl4IGRpZ2l0YWwgaW5wdXQgc3ViZGV2aWNlIGluc3RhbmNlLgorICoKKyAqIEBwYXJhbSByZWdfYmFzZSBUaGUgcmVnaXN0ZXIgYmFzZSBhZGRyZXNzIG9mIHRoZSBkZXZpY2UgYXMgcmV0dXJuZWQgYnkgdGhlIFBDSSBCSU9TLgorICoKKyAqIEByZXR1cm4gUG9pbnRlciB0byBuZXcgaW5zdGFuY2Ugb24gc3VjY2Vzcy5cbgorICogTlVMTCBvbiBlcnJvci4KKyAqLworbWUwOTAwX2RpX3N1YmRldmljZV90ICptZTA5MDBfZGlfY29uc3RydWN0b3IodWludDMyX3QgbWUwOTAwX3JlZ19iYXNlLAorCQkJCQkgICAgIHVuc2lnbmVkIGludCBkaV9pZHgpOworCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMDkwMF9kby5jIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMDkwMF9kby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1YjljM2EKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUwOTAwX2RvLmMKQEAgLTAsMCArMSwzMTQgQEAKKy8qKgorICogQGZpbGUgbWUwOTAwX2RvLmMKKyAqCisgKiBAYnJpZWYgTUUtOXggZGlnaXRhbCBvdXRwdXQgc3ViZGV2aWNlIGluc3RhbmNlLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX19LRVJORUxfXworIyAgZGVmaW5lIF9fS0VSTkVMX18KKyNlbmRpZgorCisvKgorICogSW5jbHVkZXMKKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2luY2x1ZGUgIm1lZGVmaW5lcy5oIgorI2luY2x1ZGUgIm1laW50ZXJuYWwuaCIKKyNpbmNsdWRlICJtZWVycm9yLmgiCisKKyNpbmNsdWRlICJtZWRlYnVnLmgiCisjaW5jbHVkZSAibWUwOTAwX3JlZy5oIgorI2luY2x1ZGUgIm1lMDkwMF9kby5oIgorCisvKgorICogRGVmaW5lcworICovCisKKy8qCisgKiBGdW5jdGlvbnMKKyAqLworCitzdGF0aWMgaW50IG1lMDkwMF9kb19pb19yZXNldF9zdWJkZXZpY2Uoc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlLAorCQkJCQlzdHJ1Y3QgZmlsZSAqZmlsZXAsIGludCBmbGFncykKK3sKKwltZTA5MDBfZG9fc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJaW5zdGFuY2UgPSAobWUwOTAwX2RvX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCWlmIChmbGFncykgeworCQlQRVJST1IoIkludmFsaWQgZmxhZyBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJfQorCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJc3Bpbl9sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCW91dGIoMHhGRiwgaW5zdGFuY2UtPnBvcnRfcmVnKTsKKwlQREVCVUdfUkVHKCJwb3J0X3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5wb3J0X3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgMHhmZik7CisJc3Bpbl91bmxvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lMDkwMF9kb19pb19zaW5nbGVfY29uZmlnKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgICBpbnQgY2hhbm5lbCwKKwkJCQkgICAgICBpbnQgc2luZ2xlX2NvbmZpZywKKwkJCQkgICAgICBpbnQgcmVmLAorCQkJCSAgICAgIGludCB0cmlnX2NoYW4sCisJCQkJICAgICAgaW50IHRyaWdfdHlwZSwgaW50IHRyaWdfZWRnZSwgaW50IGZsYWdzKQoreworCW1lMDkwMF9kb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbnN0YW5jZSA9IChtZTA5MDBfZG9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJc3Bpbl9sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCXN3aXRjaCAoZmxhZ3MpIHsKKwljYXNlIE1FX0lPX1NJTkdMRV9DT05GSUdfTk9fRkxBR1M6CisJY2FzZSBNRV9JT19TSU5HTEVfVFlQRV9ESU9fQllURToKKwkJaWYgKGNoYW5uZWwgPT0gMCkgeworCQkJaWYgKHNpbmdsZV9jb25maWcgPT0gTUVfU0lOR0xFX0NPTkZJR19ESU9fT1VUUFVUKSB7CisJCQl9IGVsc2UgeworCQkJCVBFUlJPUigiSW52YWxpZCBieXRlIGRpcmVjdGlvbiBzcGVjaWZpZWQuXG4iKTsKKwkJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX1NJTkdMRV9DT05GSUc7CisJCQl9CisJCX0gZWxzZSB7CisJCQlQRVJST1IoIkludmFsaWQgYnl0ZSBudW1iZXIgc3BlY2lmaWVkLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlQRVJST1IoIkludmFsaWQgZmxhZ3Mgc3BlY2lmaWVkLlxuIik7CisJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJfQorCXNwaW5fdW5sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lMDkwMF9kb19pb19zaW5nbGVfcmVhZChtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICBpbnQgY2hhbm5lbCwKKwkJCQkgICAgaW50ICp2YWx1ZSwgaW50IHRpbWVfb3V0LCBpbnQgZmxhZ3MpCit7CisJbWUwOTAwX2RvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lMDkwMF9kb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlzcGluX2xvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisJc3dpdGNoIChmbGFncykgeworCWNhc2UgTUVfSU9fU0lOR0xFX1RZUEVfRElPX0JJVDoKKwkJaWYgKChjaGFubmVsID49IDApICYmIChjaGFubmVsIDwgOCkpIHsKKwkJCSp2YWx1ZSA9ICh+aW5iKGluc3RhbmNlLT5wb3J0X3JlZykpICYgKDB4MSA8PCBjaGFubmVsKTsKKwkJfSBlbHNlIHsKKwkJCVBFUlJPUigiSW52YWxpZCBiaXQgbnVtYmVyIHNwZWNpZmllZC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCQl9CisJCWJyZWFrOworCisJY2FzZSBNRV9JT19TSU5HTEVfTk9fRkxBR1M6CisJY2FzZSBNRV9JT19TSU5HTEVfVFlQRV9ESU9fQllURToKKwkJaWYgKGNoYW5uZWwgPT0gMCkgeworCQkJKnZhbHVlID0gfmluYihpbnN0YW5jZS0+cG9ydF9yZWcpOworCQl9IGVsc2UgeworCQkJUEVSUk9SKCJJbnZhbGlkIGJ5dGUgbnVtYmVyIHNwZWNpZmllZC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWdzIHNwZWNpZmllZC5cbiIpOworCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKwlzcGluX3VubG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZTA5MDBfZG9faW9fc2luZ2xlX3dyaXRlKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICAgaW50IGNoYW5uZWwsCisJCQkJICAgICBpbnQgdmFsdWUsIGludCB0aW1lX291dCwgaW50IGZsYWdzKQoreworCW1lMDkwMF9kb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJdW5zaWduZWQgbG9uZyBzdGF0ZTsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lMDkwMF9kb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlzcGluX2xvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisJc3dpdGNoIChmbGFncykgeworCWNhc2UgTUVfSU9fU0lOR0xFX1RZUEVfRElPX0JJVDoKKwkJaWYgKChjaGFubmVsID49IDApICYmIChjaGFubmVsIDwgOCkpIHsKKwkJCXN0YXRlID0gaW5iKGluc3RhbmNlLT5wb3J0X3JlZyk7CisJCQlzdGF0ZSA9CisJCQkgICAgKCF2YWx1ZSkgPyAoc3RhdGUgfCAoMHgxIDw8IGNoYW5uZWwpKSA6IChzdGF0ZSAmCisJCQkJCQkJCSAgICAgfigweDEgPDwKKwkJCQkJCQkJICAgICAgIGNoYW5uZWwpKTsKKwkJCW91dGIoc3RhdGUsIGluc3RhbmNlLT5wb3J0X3JlZyk7CisJCX0gZWxzZSB7CisJCQlQRVJST1IoIkludmFsaWQgYml0IG51bWJlciBzcGVjaWZpZWQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwkJfQorCQlicmVhazsKKworCWNhc2UgTUVfSU9fU0lOR0xFX05PX0ZMQUdTOgorCWNhc2UgTUVfSU9fU0lOR0xFX1RZUEVfRElPX0JZVEU6CisJCWlmIChjaGFubmVsID09IDApIHsKKwkJCW91dGIofih2YWx1ZSksIGluc3RhbmNlLT5wb3J0X3JlZyk7CisJCX0gZWxzZSB7CisJCQlQRVJST1IoIkludmFsaWQgYnl0ZSBudW1iZXIgc3BlY2lmaWVkLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlQRVJST1IoIkludmFsaWQgZmxhZ3Mgc3BlY2lmaWVkLlxuIik7CisJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJfQorCXNwaW5fdW5sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lMDkwMF9kb19xdWVyeV9udW1iZXJfY2hhbm5lbHMobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJCSAgIGludCAqbnVtYmVyKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwkqbnVtYmVyID0gODsKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZTA5MDBfZG9fcXVlcnlfc3ViZGV2aWNlX3R5cGUobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJCSAgaW50ICp0eXBlLCBpbnQgKnN1YnR5cGUpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCSp0eXBlID0gTUVfVFlQRV9ETzsKKwkqc3VidHlwZSA9IE1FX1NVQlRZUEVfU0lOR0xFOworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lMDkwMF9kb19xdWVyeV9zdWJkZXZpY2VfY2FwcyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwgaW50ICpjYXBzKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwkqY2FwcyA9IDA7CisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK21lMDkwMF9kb19zdWJkZXZpY2VfdCAqbWUwOTAwX2RvX2NvbnN0cnVjdG9yKHVpbnQzMl90IHJlZ19iYXNlLAorCQkJCQkgICAgIHVuc2lnbmVkIGludCBkb19pZHgpCit7CisJbWUwOTAwX2RvX3N1YmRldmljZV90ICpzdWJkZXZpY2U7CisJaW50IGVycjsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCS8qIEFsbG9jYXRlIG1lbW9yeSBmb3Igc3ViZGV2aWNlIGluc3RhbmNlICovCisJc3ViZGV2aWNlID0ga21hbGxvYyhzaXplb2YobWUwOTAwX2RvX3N1YmRldmljZV90KSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIXN1YmRldmljZSkgeworCQlQRVJST1IoIkNhbm5vdCBnZXQgbWVtb3J5IGZvciBzdWJkZXZpY2UgaW5zdGFuY2UuXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJbWVtc2V0KHN1YmRldmljZSwgMCwgc2l6ZW9mKG1lMDkwMF9kb19zdWJkZXZpY2VfdCkpOworCisJLyogSW5pdGlhbGl6ZSBzdWJkZXZpY2UgYmFzZSBjbGFzcyAqLworCWVyciA9IG1lX3N1YmRldmljZV9pbml0KCZzdWJkZXZpY2UtPmJhc2UpOworCisJaWYgKGVycikgeworCQlQRVJST1IoIkNhbm5vdCBpbml0aWFsaXplIHN1YmRldmljZSBiYXNlIGNsYXNzIGluc3RhbmNlLlxuIik7CisJCWtmcmVlKHN1YmRldmljZSk7CisJCXJldHVybiBOVUxMOworCX0KKwkvLyBJbml0aWFsaXplIHNwaW4gbG9ja3MuCisJc3Bpbl9sb2NrX2luaXQoJnN1YmRldmljZS0+c3ViZGV2aWNlX2xvY2spOworCisJLyogU2F2ZSB0aGUgc3ViZGV2aWNlIGluZGV4ICovCisJc3ViZGV2aWNlLT5kb19pZHggPSBkb19pZHg7CisKKwkvKiBJbml0aWFsaXplIHJlZ2lzdGVycyAqLworCWlmIChkb19pZHggPT0gMCkgeworCQlzdWJkZXZpY2UtPmN0cmxfcmVnID0gcmVnX2Jhc2UgKyBNRTA5MDBfQ1RSTF9SRUc7CisJCXN1YmRldmljZS0+cG9ydF9yZWcgPSByZWdfYmFzZSArIE1FMDkwMF9QT1JUX0FfUkVHOworCQlzdWJkZXZpY2UtPmVuYWJsZV9yZWcgPSByZWdfYmFzZSArIE1FMDkwMF9XUklURV9FTkFCTEVfUkVHOworCQlzdWJkZXZpY2UtPmRpc2FibGVfcmVnID0gcmVnX2Jhc2UgKyBNRTA5MDBfV1JJVEVfRElTQUJMRV9SRUc7CisJfSBlbHNlIHsKKwkJc3ViZGV2aWNlLT5jdHJsX3JlZyA9IHJlZ19iYXNlICsgTUUwOTAwX0NUUkxfUkVHOworCQlzdWJkZXZpY2UtPnBvcnRfcmVnID0gcmVnX2Jhc2UgKyBNRTA5MDBfUE9SVF9CX1JFRzsKKwkJc3ViZGV2aWNlLT5lbmFibGVfcmVnID0gcmVnX2Jhc2UgKyBNRTA5MDBfV1JJVEVfRU5BQkxFX1JFRzsKKwkJc3ViZGV2aWNlLT5kaXNhYmxlX3JlZyA9IHJlZ19iYXNlICsgTUUwOTAwX1dSSVRFX0RJU0FCTEVfUkVHOworCX0KKyNpZmRlZiBNRURFQlVHX0RFQlVHX1JFRworCXN1YmRldmljZS0+cmVnX2Jhc2UgPSByZWdfYmFzZTsKKyNlbmRpZgorCisJLyogT3ZlcmxvYWQgYmFzZSBjbGFzcyBtZXRob2RzLiAqLworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fcmVzZXRfc3ViZGV2aWNlID0KKwkgICAgbWUwOTAwX2RvX2lvX3Jlc2V0X3N1YmRldmljZTsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3NpbmdsZV9jb25maWcgPQorCSAgICBtZTA5MDBfZG9faW9fc2luZ2xlX2NvbmZpZzsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3NpbmdsZV9yZWFkID0gbWUwOTAwX2RvX2lvX3NpbmdsZV9yZWFkOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fc2luZ2xlX3dyaXRlID0KKwkgICAgbWUwOTAwX2RvX2lvX3NpbmdsZV93cml0ZTsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X251bWJlcl9jaGFubmVscyA9CisJICAgIG1lMDkwMF9kb19xdWVyeV9udW1iZXJfY2hhbm5lbHM7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9zdWJkZXZpY2VfdHlwZSA9CisJICAgIG1lMDkwMF9kb19xdWVyeV9zdWJkZXZpY2VfdHlwZTsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV9jYXBzID0KKwkgICAgbWUwOTAwX2RvX3F1ZXJ5X3N1YmRldmljZV9jYXBzOworCisJcmV0dXJuIHN1YmRldmljZTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTA5MDBfZG8uaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTA5MDBfZG8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2U4YThiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMDkwMF9kby5oCkBAIC0wLDAgKzEsNjggQEAKKy8qKgorICogQGZpbGUgbWUwOTAwX2RvLmgKKyAqCisgKiBAYnJpZWYgTUUtOXggZGlnaXRhbCBvdXRwdXQgc3ViZGV2aWNlIGNsYXNzLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX01FMDkwMF9ET19IXworI2RlZmluZSBfTUUwOTAwX0RPX0hfCisKKyNpbmNsdWRlICJtZXN1YmRldmljZS5oIgorCisjaWZkZWYgX19LRVJORUxfXworCisvKioKKyAqIEBicmllZiBUaGUgdGVtcGxhdGUgc3ViZGV2aWNlIGNsYXNzLgorICovCit0eXBlZGVmIHN0cnVjdCBtZTA5MDBfZG9fc3ViZGV2aWNlIHsKKwkvKiBJbmhlcml0YW5jZSAqLworCW1lX3N1YmRldmljZV90IGJhc2U7CQkJLyoqPCBUaGUgc3ViZGV2aWNlIGJhc2UgY2xhc3MuICovCisKKwkvKiBBdHRyaWJ1dGVzICovCisJc3BpbmxvY2tfdCBzdWJkZXZpY2VfbG9jazsJCS8qKjwgU3BpbiBsb2NrIHRvIHByb3RlY3QgdGhlIHN1YmRldmljZSBmcm9tIGNvbmN1cnJlbnQgYWNjZXNzLiAqLworCisJdW5zaWduZWQgaW50IGRvX2lkeDsKKworCXVuc2lnbmVkIGxvbmcgY3RybF9yZWc7CisJdW5zaWduZWQgbG9uZyBwb3J0X3JlZzsKKwl1bnNpZ25lZCBsb25nIGVuYWJsZV9yZWc7CisJdW5zaWduZWQgbG9uZyBkaXNhYmxlX3JlZzsKKyNpZmRlZiBNRURFQlVHX0RFQlVHX1JFRworCXVuc2lnbmVkIGxvbmcgcmVnX2Jhc2U7CisjZW5kaWYKK30gbWUwOTAwX2RvX3N1YmRldmljZV90OworCisvKioKKyAqIEBicmllZiBUaGUgY29uc3RydWN0b3IgdG8gZ2VuZXJhdGUgYSBNRS05eCBkaWdpdGFsIG91dHB1dCBzdWJkZXZpY2UgaW5zdGFuY2UuCisgKgorICogQHBhcmFtIHJlZ19iYXNlIFRoZSByZWdpc3RlciBiYXNlIGFkZHJlc3Mgb2YgdGhlIGRldmljZSBhcyByZXR1cm5lZCBieSB0aGUgUENJIEJJT1MuCisgKiBAcGFyYW0gZG9faWR4IFRoZSBpbmRleCBvZiB0aGUgZGlnaXRhbCBvdXRwdXQgc3ViZGV2aWNlIG9uIHRoaXMgZGV2aWNlLgorICoKKyAqIEByZXR1cm4gUG9pbnRlciB0byBuZXcgaW5zdGFuY2Ugb24gc3VjY2Vzcy5cbgorICogTlVMTCBvbiBlcnJvci4KKyAqLworbWUwOTAwX2RvX3N1YmRldmljZV90ICptZTA5MDBfZG9fY29uc3RydWN0b3IodWludDMyX3QgcmVnX2Jhc2UsCisJCQkJCSAgICAgdW5zaWduZWQgaW50IGRvX2lkeCk7CisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUwOTAwX3JlZy5oIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMDkwMF9yZWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYmYxNjNiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMDkwMF9yZWcuaApAQCAtMCwwICsxLDQwIEBACisvKioKKyAqIEBmaWxlIG1lMDkwMF9yZWcuaAorICoKKyAqIEBicmllZiBNRS05eCByZWdpc3RlciBkZWZpbml0aW9ucy4KKyAqIEBub3RlIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKiBAYXV0aG9yIEd1ZW50ZXIgR2ViaGFyZHQKKyAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9NRTA5MDBfUkVHX0hfCisjZGVmaW5lIF9NRTA5MDBfUkVHX0hfCisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKyNkZWZpbmUgTUUwOTAwX1BPUlRfQV9SRUcgICAgICAgICAgMHgwMAorI2RlZmluZSBNRTA5MDBfUE9SVF9CX1JFRyAgICAgICAgICAweDAxCisjZGVmaW5lIE1FMDkwMF9QT1JUX0NfUkVHICAgICAgICAgIDB4MDIKKyNkZWZpbmUgTUUwOTAwX0NUUkxfUkVHICAgICAgICAgICAgMHgwMwkvLyAoICx3KQorI2RlZmluZSBNRTA5MDBfV1JJVEVfRU5BQkxFX1JFRyAgICAweDA0CS8vIChyLHcpCisjZGVmaW5lIE1FMDkwMF9XUklURV9ESVNBQkxFX1JFRyAgIDB4MDgJLy8gKHIsdykKKworI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTEwMDBfZGV2aWNlLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUxMDAwX2RldmljZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0NGUyMTQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUxMDAwX2RldmljZS5jCkBAIC0wLDAgKzEsMjA4IEBACisvKioKKyAqIEBmaWxlIG1lMTAwMF9kZXZpY2UuYworICoKKyAqIEBicmllZiBNRS0xMDAwIGRldmljZSBjbGFzcyBpbXBsZW1lbnRhdGlvbi4KKyAqIEBub3RlIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKiBAYXV0aG9yIEd1ZW50ZXIgR2ViaGFyZHQKKyAqIEBhdXRob3IgS3J6eXN6dG9mIEdhbnR6a2UJKGsuZ2FudHprZUBtZWlsaGF1cy5kZSkKKyAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9fS0VSTkVMX18KKyMgIGRlZmluZSBfX0tFUk5FTF9fCisjZW5kaWYKKworI2lmbmRlZiBNT0RVTEUKKyMgIGRlZmluZSBNT0RVTEUKKyNlbmRpZgorCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKKyNpbmNsdWRlICJtZWlkcy5oIgorI2luY2x1ZGUgIm1lZXJyb3IuaCIKKyNpbmNsdWRlICJtZWNvbW1vbi5oIgorI2luY2x1ZGUgIm1laW50ZXJuYWwuaCIKKworI2luY2x1ZGUgIm1lZGVidWcuaCIKKyNpbmNsdWRlICJtZWRldmljZS5oIgorI2luY2x1ZGUgIm1lMTAwMF9kZXZpY2UuaCIKKyNpbmNsdWRlICJtZXN1YmRldmljZS5oIgorI2luY2x1ZGUgIm1lMTAwMF9kaW8uaCIKKworc3RhdGljIGludCBtZTEwMDBfY29uZmlnX2xvYWQobWVfZGV2aWNlX3QgKiBtZV9kZXZpY2UsIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCSAgICAgIG1lX2NmZ19kZXZpY2VfZW50cnlfdCAqIGNvbmZpZykKK3sKKwltZTEwMDBfZGV2aWNlX3QgKm1lMTAwMF9kZXZpY2U7CisJbWUxMDAwX2Rpb19zdWJkZXZpY2VfdCAqZGlvOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJbWUxMDAwX2RldmljZSA9IChtZTEwMDBfZGV2aWNlX3QgKikgbWVfZGV2aWNlOworCisJaWYgKGNvbmZpZy0+Y291bnQgPT0gMikgeworCQlpZiAobWVfc2xpc3RfZ2V0X251bWJlcl9zdWJkZXZpY2VzKCZtZTEwMDBfZGV2aWNlLT5iYXNlLnNsaXN0KQorCQkgICAgPT0gMikgeworCQkJLy8gTm90aGluZyB0byBkby4KKwkJfSBlbHNlIHsKKwkJCS8vIFJlbW92ZSAyIGV4dHJhIHN1YmRldmljZXMKKwkJCWRpbyA9CisJCQkgICAgKG1lMTAwMF9kaW9fc3ViZGV2aWNlX3QgKikKKwkJCSAgICBtZV9zbGlzdF9kZWxfc3ViZGV2aWNlX3RhaWwoJm1lMTAwMF9kZXZpY2UtPmJhc2UuCisJCQkJCQkJc2xpc3QpOworCQkJaWYgKGRpbykKKwkJCQlkaW8tPmJhc2UuCisJCQkJICAgIG1lX3N1YmRldmljZV9kZXN0cnVjdG9yKChtZV9zdWJkZXZpY2VfdCAqKQorCQkJCQkJCSAgICBkaW8pOworCisJCQlkaW8gPQorCQkJICAgIChtZTEwMDBfZGlvX3N1YmRldmljZV90ICopCisJCQkgICAgbWVfc2xpc3RfZGVsX3N1YmRldmljZV90YWlsKCZtZTEwMDBfZGV2aWNlLT5iYXNlLgorCQkJCQkJCXNsaXN0KTsKKwkJCWlmIChkaW8pCisJCQkJZGlvLT5iYXNlLgorCQkJCSAgICBtZV9zdWJkZXZpY2VfZGVzdHJ1Y3RvcigobWVfc3ViZGV2aWNlX3QgKikKKwkJCQkJCQkgICAgZGlvKTsKKwkJfQorCX0gZWxzZSBpZiAoY29uZmlnLT5jb3VudCA9PSA0KSB7CisJCS8vQWRkIDIgc3ViZGV2aWNlcworCQlpZiAobWVfc2xpc3RfZ2V0X251bWJlcl9zdWJkZXZpY2VzKCZtZTEwMDBfZGV2aWNlLT5iYXNlLnNsaXN0KQorCQkgICAgPT0gMikgeworCQkJZGlvID0KKwkJCSAgICBtZTEwMDBfZGlvX2NvbnN0cnVjdG9yKG1lMTAwMF9kZXZpY2UtPmJhc2UuaW5mby5wY2kuCisJCQkJCQkgICByZWdfYmFzZXNbMl0sIDIsCisJCQkJCQkgICAmbWUxMDAwX2RldmljZS0+Y3RybF9sb2NrKTsKKwkJCWlmICghZGlvKSB7CisJCQkJUEVSUk9SKCJDYW5ub3QgY3JlYXRlIGRpbyBzdWJkZXZpY2UuXG4iKTsKKwkJCQlyZXR1cm4gTUVfRVJSTk9fSU5URVJOQUw7CisJCQl9CisJCQltZV9zbGlzdF9hZGRfc3ViZGV2aWNlX3RhaWwoJm1lMTAwMF9kZXZpY2UtPmJhc2Uuc2xpc3QsCisJCQkJCQkgICAgKG1lX3N1YmRldmljZV90ICopIGRpbyk7CisKKwkJCWRpbyA9CisJCQkgICAgbWUxMDAwX2Rpb19jb25zdHJ1Y3RvcihtZTEwMDBfZGV2aWNlLT5iYXNlLmluZm8ucGNpLgorCQkJCQkJICAgcmVnX2Jhc2VzWzJdLCAzLAorCQkJCQkJICAgJm1lMTAwMF9kZXZpY2UtPmN0cmxfbG9jayk7CisJCQlpZiAoIWRpbykgeworCQkJCWRpbyA9CisJCQkJICAgIChtZTEwMDBfZGlvX3N1YmRldmljZV90ICopCisJCQkJICAgIG1lX3NsaXN0X2RlbF9zdWJkZXZpY2VfdGFpbCgmbWUxMDAwX2RldmljZS0+CisJCQkJCQkJCWJhc2Uuc2xpc3QpOworCQkJCWlmIChkaW8pCisJCQkJCWRpby0+YmFzZS4KKwkJCQkJICAgIG1lX3N1YmRldmljZV9kZXN0cnVjdG9yKChtZV9zdWJkZXZpY2VfdCAqKSBkaW8pOworCisJCQkJUEVSUk9SKCJDYW5ub3QgY3JlYXRlIGRpbyBzdWJkZXZpY2UuXG4iKTsKKwkJCQlyZXR1cm4gTUVfRVJSTk9fSU5URVJOQUw7CisJCQl9CisJCQltZV9zbGlzdF9hZGRfc3ViZGV2aWNlX3RhaWwoJm1lMTAwMF9kZXZpY2UtPmJhc2Uuc2xpc3QsCisJCQkJCQkgICAgKG1lX3N1YmRldmljZV90ICopIGRpbyk7CisJCX0gZWxzZSB7CisJCQkvLyBOb3RoaW5nIHRvIGRvLgorCQl9CisJfSBlbHNlIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGNvbmZpZ3VyYXRpb24uXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVEVSTkFMOworCX0KKworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCittZV9kZXZpY2VfdCAqbWUxMDAwX3BjaV9jb25zdHJ1Y3RvcihzdHJ1Y3QgcGNpX2RldiAqIHBjaV9kZXZpY2UpCit7CisJbWUxMDAwX2RldmljZV90ICptZTEwMDBfZGV2aWNlOworCW1lX3N1YmRldmljZV90ICpzdWJkZXZpY2U7CisJaW50IGVycjsKKwlpbnQgaTsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCS8vIEFsbG9jYXRlIHN0cnVjdHVyZSBmb3IgZGV2aWNlIGluc3RhbmNlLgorCW1lMTAwMF9kZXZpY2UgPSBrbWFsbG9jKHNpemVvZihtZTEwMDBfZGV2aWNlX3QpLCBHRlBfS0VSTkVMKTsKKworCWlmICghbWUxMDAwX2RldmljZSkgeworCQlQRVJST1IoIkNhbm5vdCBnZXQgbWVtb3J5IGZvciBNRS0xMDAwIGRldmljZSBpbnN0YW5jZS5cbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwltZW1zZXQobWUxMDAwX2RldmljZSwgMCwgc2l6ZW9mKG1lMTAwMF9kZXZpY2VfdCkpOworCisJLy8gSW5pdGlhbGl6ZSBiYXNlIGNsYXNzIHN0cnVjdHVyZS4KKwllcnIgPSBtZV9kZXZpY2VfcGNpX2luaXQoKG1lX2RldmljZV90ICopIG1lMTAwMF9kZXZpY2UsIHBjaV9kZXZpY2UpOworCisJaWYgKGVycikgeworCQlrZnJlZShtZTEwMDBfZGV2aWNlKTsKKwkJUEVSUk9SKCJDYW5ub3QgaW5pdGlhbGl6ZSBkZXZpY2UgYmFzZSBjbGFzcy5cbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJLy8gSW5pdGlhbGl6ZSBzcGluIGxvY2sgLgorCXNwaW5fbG9ja19pbml0KCZtZTEwMDBfZGV2aWNlLT5jdHJsX2xvY2spOworCisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQlzdWJkZXZpY2UgPQorCQkgICAgKG1lX3N1YmRldmljZV90ICopIG1lMTAwMF9kaW9fY29uc3RydWN0b3IobWUxMDAwX2RldmljZS0+CisJCQkJCQkJICAgICAgYmFzZS5pbmZvLnBjaS4KKwkJCQkJCQkgICAgICByZWdfYmFzZXNbMl0sIGksCisJCQkJCQkJICAgICAgJm1lMTAwMF9kZXZpY2UtPgorCQkJCQkJCSAgICAgIGN0cmxfbG9jayk7CisKKwkJaWYgKCFzdWJkZXZpY2UpIHsKKwkJCW1lX2RldmljZV9kZWluaXQoKG1lX2RldmljZV90ICopIG1lMTAwMF9kZXZpY2UpOworCQkJa2ZyZWUobWUxMDAwX2RldmljZSk7CisJCQlQRVJST1IoIkNhbm5vdCBnZXQgbWVtb3J5IGZvciBzdWJkZXZpY2UuXG4iKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisKKwkJbWVfc2xpc3RfYWRkX3N1YmRldmljZV90YWlsKCZtZTEwMDBfZGV2aWNlLT5iYXNlLnNsaXN0LAorCQkJCQkgICAgc3ViZGV2aWNlKTsKKwl9CisKKwkvLyBPdmVyd3JpdGUgYmFzZSBjbGFzcyBtZXRob2RzLgorCW1lMTAwMF9kZXZpY2UtPmJhc2UubWVfZGV2aWNlX2NvbmZpZ19sb2FkID0gbWUxMDAwX2NvbmZpZ19sb2FkOworCisJcmV0dXJuIChtZV9kZXZpY2VfdCAqKSBtZTEwMDBfZGV2aWNlOworfQorCisvLyBJbml0IGFuZCBleGl0IG9mIG1vZHVsZS4KK3N0YXRpYyBpbnQgX19pbml0IG1lMTAwMF9pbml0KHZvaWQpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgbWUxMDAwX2V4aXQodm9pZCkKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7Cit9CisKK21vZHVsZV9pbml0KG1lMTAwMF9pbml0KTsKK21vZHVsZV9leGl0KG1lMTAwMF9leGl0KTsKKworLy8gQWRtaW5pc3RyYXRpdmUgc3R1ZmYgZm9yIG1vZGluZm8uCitNT0RVTEVfQVVUSE9SCisgICAgKCJHdWVudGVyIEdlYmhhcmR0IDxnLmdlYmhhcmR0QG1laWxoYXVzLmRlPiAmIEtyenlzenRvZiBHYW50emtlIDxrLmdhbnR6a2VAbWVpbGhhdXMuZGU+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkRldmljZSBEcml2ZXIgTW9kdWxlIGZvciBNZWlsaGF1cyBNRS0xMDAwIERldmljZXMiKTsKK01PRFVMRV9TVVBQT1JURURfREVWSUNFKCJNZWlsaGF1cyBNRS0xMDAwIERpZ2l0YWwgSS9PIERldmljZXMiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworLy8gRXhwb3J0IHRoZSBjb25zdHJ1Y3Rvci4KK0VYUE9SVF9TWU1CT0wobWUxMDAwX3BjaV9jb25zdHJ1Y3Rvcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUxMDAwX2RldmljZS5oIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMTAwMF9kZXZpY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYmJlMTI2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMTAwMF9kZXZpY2UuaApAQCAtMCwwICsxLDU5IEBACisvKioKKyAqIEBmaWxlIG1lMTAwMF9kZXZpY2UuaAorICoKKyAqIEBicmllZiBNRS0xMDAwIGRldmljZSBjbGFzcyBpbnN0YW5jZS4KKyAqIEBub3RlIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKiBAYXV0aG9yIEd1ZW50ZXIgR2ViaGFyZHQKKyAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9NRTEwMDBfSF8KKyNkZWZpbmUgX01FMTAwMF9IXworCisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKworI2luY2x1ZGUgIm1lZGV2aWNlLmgiCisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKyNkZWZpbmUgTUUxMDAwX01BR0lDX05VTUJFUgkxMDAwCisKKy8qKgorICogQGJyaWVmIFRoZSBNRS0xMDAwIGRldmljZSBjbGFzcyBzdHJ1Y3R1cmUuCisgKi8KK3R5cGVkZWYgc3RydWN0IG1lMTAwMF9kZXZpY2UgeworCW1lX2RldmljZV90IGJhc2U7CQkvKio8IFRoZSBNZWlsaGF1cyBkZXZpY2UgYmFzZSBjbGFzcy4gKi8KKwlzcGlubG9ja190IGN0cmxfbG9jazsJCS8qKjwgR3VhcmRzIHRoZSBESU8gbW9kZSByZWdpc3Rlci4gKi8KK30gbWUxMDAwX2RldmljZV90OworCisvKioKKyAqIEBicmllZiBUaGUgTUUtMTAwMCBkZXZpY2UgY2xhc3MgY29uc3RydWN0b3IuCisgKgorICogQHBhcmFtIHBjaV9kZXZpY2UgVGhlIHBjaSBkZXZpY2Ugc3RydWN0dXJlIGdpdmVuIGJ5IHRoZSBQQ0kgc3Vic3lzdGVtLgorICoKKyAqIEByZXR1cm4gT24gc3VjY2VzIGEgbmV3IE1FLTEwMDAgZGV2aWNlIGluc3RhbmNlLiBcbgorICogICAgICAgICBOVUxMIG9uIGVycm9yLgorICovCittZV9kZXZpY2VfdCAqbWUxMDAwX3BjaV9jb25zdHJ1Y3RvcihzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldmljZSkKKyAgICBfX2F0dHJpYnV0ZV9fICgod2VhaykpOworCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMTAwMF9kaW8uYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTEwMDBfZGlvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODc2MDVhOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTEwMDBfZGlvLmMKQEAgLTAsMCArMSw0MzggQEAKKy8qKgorICogQGZpbGUgbWUxMDAwX2Rpby5jCisgKgorICogQGJyaWVmIE1FLTEwMDAgRElPIHN1YmRldmljZSBpbnN0YW5jZS4KKyAqIEBub3RlIENvcHlyaWdodCAoQykgMjAwNiBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKiBAYXV0aG9yIEd1ZW50ZXIgR2ViaGFyZHQKKyAqIEBhdXRob3IgS3J6eXN6dG9mIEdhbnR6a2UJKGsuZ2FudHprZUBtZWlsaGF1cy5kZSkKKyAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA2IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9fS0VSTkVMX18KKyMgIGRlZmluZSBfX0tFUk5FTF9fCisjZW5kaWYKKworLyoKKyAqIEluY2x1ZGVzCisgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNpbmNsdWRlICJtZWRlZmluZXMuaCIKKyNpbmNsdWRlICJtZWludGVybmFsLmgiCisjaW5jbHVkZSAibWVlcnJvci5oIgorI2luY2x1ZGUgIm1lZGVidWcuaCIKKworI2luY2x1ZGUgIm1lMTAwMF9kaW9fcmVnLmgiCisjaW5jbHVkZSAibWUxMDAwX2Rpby5oIgorCisvKgorICogRGVmaW5lcworICovCisjZGVmaW5lIE1FMTAwMF9ESU9fTUFHSUNfTlVNQkVSCTB4MTAwMAkvKio8IFRoZSBtYWdpYyBudW1iZXIgb2YgdGhlIGNsYXNzIHN0cnVjdHVyZS4gKi8KKworLyoKKyAqIEZ1bmN0aW9ucworICovCisKK3N0YXRpYyBpbnQgbWUxMDAwX2Rpb19pb19yZXNldF9zdWJkZXZpY2Uoc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlLAorCQkJCQkgc3RydWN0IGZpbGUgKmZpbGVwLCBpbnQgZmxhZ3MpCit7CisJbWUxMDAwX2Rpb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJdWludDMyX3QgdG1wOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJaW5zdGFuY2UgPSAobWUxMDAwX2Rpb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlpZiAoZmxhZ3MpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWcgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCXNwaW5fbG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKwlzcGluX2xvY2soaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2spOworCXRtcCA9IGlubChpbnN0YW5jZS0+Y3RybF9yZWcpOworCXRtcCAmPSB+KDB4MSA8PCBpbnN0YW5jZS0+ZGlvX2lkeCk7CisJb3V0bCh0bXAsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIHRtcCk7CisJc3Bpbl91bmxvY2soaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2spOworCisJb3V0bCgweDAwMDAwMDAwLCBpbnN0YW5jZS0+cG9ydF9yZWcpOworCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCAwKTsKKwlzcGluX3VubG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWUxMDAwX2Rpb19pb19zaW5nbGVfY29uZmlnKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSwKKwkJCQkgICAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICAgICBpbnQgY2hhbm5lbCwKKwkJCQkgICAgICAgaW50IHNpbmdsZV9jb25maWcsCisJCQkJICAgICAgIGludCByZWYsCisJCQkJICAgICAgIGludCB0cmlnX2NoYW4sCisJCQkJICAgICAgIGludCB0cmlnX3R5cGUsIGludCB0cmlnX2VkZ2UsIGludCBmbGFncykKK3sKKwltZTEwMDBfZGlvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwlpbnQgY3RybDsKKwlpbnQgc2l6ZSA9CisJICAgIGZsYWdzICYgKE1FX0lPX1NJTkdMRV9DT05GSUdfRElPX0JJVCB8IE1FX0lPX1NJTkdMRV9DT05GSUdfRElPX0JZVEUKKwkJICAgICB8IE1FX0lPX1NJTkdMRV9DT05GSUdfRElPX1dPUkQgfAorCQkgICAgIE1FX0lPX1NJTkdMRV9DT05GSUdfRElPX0RXT1JEKTsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lMTAwMF9kaW9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJc3Bpbl9sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCXNwaW5fbG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisJY3RybCA9IGlubChpbnN0YW5jZS0+Y3RybF9yZWcpOworCisJc3dpdGNoIChzaXplKSB7CisJY2FzZSBNRV9JT19TSU5HTEVfQ09ORklHX05PX0ZMQUdTOgorCWNhc2UgTUVfSU9fU0lOR0xFX0NPTkZJR19ESU9fRFdPUkQ6CisJCWlmIChjaGFubmVsID09IDApIHsKKwkJCWlmIChzaW5nbGVfY29uZmlnID09IE1FX1NJTkdMRV9DT05GSUdfRElPX0lOUFVUKSB7CisJCQkJY3RybCAmPSB+KDB4MSA8PCBpbnN0YW5jZS0+ZGlvX2lkeCk7CisJCQl9IGVsc2UgaWYgKHNpbmdsZV9jb25maWcgPT0gTUVfU0lOR0xFX0NPTkZJR19ESU9fT1VUUFVUKSB7CisJCQkJY3RybCB8PSAweDEgPDwgaW5zdGFuY2UtPmRpb19pZHg7CisJCQl9IGVsc2UgeworCQkJCVBFUlJPUigiSW52YWxpZCBwb3J0IGRpcmVjdGlvbi5cbiIpOworCQkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfU0lOR0xFX0NPTkZJRzsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCVBFUlJPUigiSW52YWxpZCBjaGFubmVsIG51bWJlci5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWdzLlxuIik7CisJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJfQorCisJaWYgKCFlcnIpIHsKKwkJb3V0bChjdHJsLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCBjdHJsKTsKKwl9CisJc3Bpbl91bmxvY2soaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2spOworCXNwaW5fdW5sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lMTAwMF9kaW9faW9fc2luZ2xlX3JlYWQoc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlLAorCQkJCSAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICAgaW50IGNoYW5uZWwsCisJCQkJICAgICBpbnQgKnZhbHVlLCBpbnQgdGltZV9vdXQsIGludCBmbGFncykKK3sKKwltZTEwMDBfZGlvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lMTAwMF9kaW9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJc3Bpbl9sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCXN3aXRjaCAoZmxhZ3MpIHsKKwljYXNlIE1FX0lPX1NJTkdMRV9UWVBFX0RJT19CSVQ6CisJCWlmICgoY2hhbm5lbCA+PSAwKSAmJiAoY2hhbm5lbCA8IDMyKSkgeworCQkJKnZhbHVlID0gaW5sKGluc3RhbmNlLT5wb3J0X3JlZykgJiAoMHgxIDw8IGNoYW5uZWwpOworCQl9IGVsc2UgeworCQkJUEVSUk9SKCJJbnZhbGlkIGJpdCBudW1iZXIuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwkJfQorCQlicmVhazsKKworCWNhc2UgTUVfSU9fU0lOR0xFX1RZUEVfRElPX0JZVEU6CisJCWlmICgoY2hhbm5lbCA+PSAwKSAmJiAoY2hhbm5lbCA8IDQpKSB7CisJCQkqdmFsdWUgPQorCQkJICAgIChpbmwoaW5zdGFuY2UtPnBvcnRfcmVnKSA+PiAoY2hhbm5lbCAqIDgpKSAmIDB4RkY7CisJCX0gZWxzZSB7CisJCQlQRVJST1IoIkludmFsaWQgYnl0ZSBudW1iZXIuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwkJfQorCQlicmVhazsKKworCWNhc2UgTUVfSU9fU0lOR0xFX1RZUEVfRElPX1dPUkQ6CisJCWlmICgoY2hhbm5lbCA+PSAwKSAmJiAoY2hhbm5lbCA8IDIpKSB7CisJCQkqdmFsdWUgPQorCQkJICAgIChpbmwoaW5zdGFuY2UtPnBvcnRfcmVnKSA+PiAoY2hhbm5lbCAqIDE2KSkgJgorCQkJICAgIDB4RkZGRjsKKwkJfSBlbHNlIHsKKwkJCVBFUlJPUigiSW52YWxpZCB3b3JkIG51bWJlci5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCQl9CisJCWJyZWFrOworCisJY2FzZSBNRV9JT19TSU5HTEVfTk9fRkxBR1M6CisJY2FzZSBNRV9JT19TSU5HTEVfVFlQRV9ESU9fRFdPUkQ6CisJCWlmIChjaGFubmVsID09IDApIHsKKwkJCSp2YWx1ZSA9IGlubChpbnN0YW5jZS0+cG9ydF9yZWcpOworCQl9IGVsc2UgeworCQkJUEVSUk9SKCJJbnZhbGlkIGR3b3JkIG51bWJlci5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWdzIHNwZWNpZmllZC5cbiIpOworCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKwlzcGluX3VubG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZTEwMDBfZGlvX2lvX3NpbmdsZV93cml0ZShzdHJ1Y3QgbWVfc3ViZGV2aWNlICpzdWJkZXZpY2UsCisJCQkJICAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICAgIGludCBjaGFubmVsLAorCQkJCSAgICAgIGludCB2YWx1ZSwgaW50IHRpbWVfb3V0LCBpbnQgZmxhZ3MpCit7CisJbWUxMDAwX2Rpb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJdWludDMyX3QgY29uZmlnOworCXVpbnQzMl90IHN0YXRlOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJaW5zdGFuY2UgPSAobWUxMDAwX2Rpb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlNRV9TVUJERVZJQ0VfRU5URVIgc3Bpbl9sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCXNwaW5fbG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisJY29uZmlnID0gaW5sKGluc3RhbmNlLT5jdHJsX3JlZykgJiAoMHgxIDw8IGluc3RhbmNlLT5kaW9faWR4KTsKKwlzd2l0Y2ggKGZsYWdzKSB7CisJY2FzZSBNRV9JT19TSU5HTEVfVFlQRV9ESU9fQklUOgorCQlpZiAoKGNoYW5uZWwgPj0gMCkgJiYgKGNoYW5uZWwgPCAzMikpIHsKKwkJCWlmIChjb25maWcpIHsKKwkJCQlzdGF0ZSA9IGlubChpbnN0YW5jZS0+cG9ydF9yZWcpOworCQkJCXN0YXRlID0KKwkJCQkgICAgdmFsdWUgPyAoc3RhdGUgfCAoMHgxIDw8IGNoYW5uZWwpKSA6IChzdGF0ZQorCQkJCQkJCQkJICAmCisJCQkJCQkJCQkgIH4oMHgxCisJCQkJCQkJCQkgICAgPDwKKwkJCQkJCQkJCSAgICBjaGFubmVsKSk7CisJCQkJb3V0bChzdGF0ZSwgaW5zdGFuY2UtPnBvcnRfcmVnKTsKKwkJCQlQREVCVUdfUkVHKCJwb3J0X3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJCSAgIGluc3RhbmNlLT5wb3J0X3JlZyAtCisJCQkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwgc3RhdGUpOworCQkJfSBlbHNlIHsKKwkJCQlQRVJST1IoIlBvcnQgaXMgbm90IGluIG91dHB1dCBtb2RlLlxuIik7CisJCQkJZXJyID0gTUVfRVJSTk9fUFJFVklPVVNfQ09ORklHOworCQkJfQorCQl9IGVsc2UgeworCQkJUEVSUk9SKCJJbnZhbGlkIGJpdCBudW1iZXIuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwkJfQorCQlicmVhazsKKworCWNhc2UgTUVfSU9fU0lOR0xFX1RZUEVfRElPX0JZVEU6CisJCWlmICgoY2hhbm5lbCA+PSAwKSAmJiAoY2hhbm5lbCA8IDQpKSB7CisJCQlpZiAoY29uZmlnKSB7CisJCQkJc3RhdGUgPSBpbmwoaW5zdGFuY2UtPnBvcnRfcmVnKTsKKwkJCQlzdGF0ZSAmPSB+KDB4RkYgPDwgKGNoYW5uZWwgKiA4KSk7CisJCQkJc3RhdGUgfD0gKHZhbHVlICYgMHhGRikgPDwgKGNoYW5uZWwgKiA4KTsKKwkJCQlvdXRsKHN0YXRlLCBpbnN0YW5jZS0+cG9ydF9yZWcpOworCQkJCVBERUJVR19SRUcoInBvcnRfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkJICAgaW5zdGFuY2UtPnBvcnRfcmVnIC0KKwkJCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLCBzdGF0ZSk7CisJCQl9IGVsc2UgeworCQkJCVBFUlJPUigiUG9ydCBpcyBub3QgaW4gb3V0cHV0IG1vZGUuXG4iKTsKKwkJCQllcnIgPSBNRV9FUlJOT19QUkVWSU9VU19DT05GSUc7CisJCQl9CisJCX0gZWxzZSB7CisJCQlQRVJST1IoIkludmFsaWQgYnl0ZSBudW1iZXIuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwkJfQorCQlicmVhazsKKworCWNhc2UgTUVfSU9fU0lOR0xFX1RZUEVfRElPX1dPUkQ6CisJCWlmICgoY2hhbm5lbCA+PSAwKSAmJiAoY2hhbm5lbCA8IDIpKSB7CisJCQlpZiAoY29uZmlnKSB7CisJCQkJc3RhdGUgPSBpbmwoaW5zdGFuY2UtPnBvcnRfcmVnKTsKKwkJCQlzdGF0ZSAmPSB+KDB4RkZGRiA8PCAoY2hhbm5lbCAqIDE2KSk7CisJCQkJc3RhdGUgfD0gKHZhbHVlICYgMHhGRkZGKSA8PCAoY2hhbm5lbCAqIDE2KTsKKwkJCQlvdXRsKHN0YXRlLCBpbnN0YW5jZS0+cG9ydF9yZWcpOworCQkJCVBERUJVR19SRUcoInBvcnRfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkJICAgaW5zdGFuY2UtPnBvcnRfcmVnIC0KKwkJCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLCBzdGF0ZSk7CisJCQl9IGVsc2UgeworCQkJCVBFUlJPUigiUG9ydCBpcyBub3QgaW4gb3V0cHV0IG1vZGUuXG4iKTsKKwkJCQllcnIgPSBNRV9FUlJOT19QUkVWSU9VU19DT05GSUc7CisJCQl9CisJCX0gZWxzZSB7CisJCQlQRVJST1IoIkludmFsaWQgd29yZCBudW1iZXIuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwkJfQorCQlicmVhazsKKworCWNhc2UgTUVfSU9fU0lOR0xFX05PX0ZMQUdTOgorCWNhc2UgTUVfSU9fU0lOR0xFX1RZUEVfRElPX0RXT1JEOgorCQlpZiAoY2hhbm5lbCA9PSAwKSB7CisJCQlpZiAoY29uZmlnKSB7CisJCQkJb3V0bCh2YWx1ZSwgaW5zdGFuY2UtPnBvcnRfcmVnKTsKKwkJCQlQREVCVUdfUkVHKCJwb3J0X3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJCSAgIGluc3RhbmNlLT5wb3J0X3JlZyAtCisJCQkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwgdmFsdWUpOworCQkJfSBlbHNlIHsKKwkJCQlQRVJST1IoIlBvcnQgaXMgbm90IGluIG91dHB1dCBtb2RlLlxuIik7CisJCQkJZXJyID0gTUVfRVJSTk9fUFJFVklPVVNfQ09ORklHOworCQkJfQorCQl9IGVsc2UgeworCQkJUEVSUk9SKCJJbnZhbGlkIGR3b3JkIG51bWJlci5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWdzIHNwZWNpZmllZC5cbiIpOworCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKwlzcGluX3VubG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisJc3Bpbl91bmxvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWUxMDAwX2Rpb19xdWVyeV9udW1iZXJfY2hhbm5lbHMoc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlLAorCQkJCQkgICAgaW50ICpudW1iZXIpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCSpudW1iZXIgPSBNRTEwMDBfRElPX05VTUJFUl9DSEFOTkVMUzsKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZTEwMDBfZGlvX3F1ZXJ5X3N1YmRldmljZV90eXBlKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSwKKwkJCQkJICAgaW50ICp0eXBlLCBpbnQgKnN1YnR5cGUpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCSp0eXBlID0gTUVfVFlQRV9ESU87CisJKnN1YnR5cGUgPSBNRV9TVUJUWVBFX1NJTkdMRTsKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZTEwMDBfZGlvX3F1ZXJ5X3N1YmRldmljZV9jYXBzKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSwKKwkJCQkJICAgaW50ICpjYXBzKQoreworCW1lMTAwMF9kaW9fc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJaW5zdGFuY2UgPSAobWUxMDAwX2Rpb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwkqY2FwcyA9IE1FX0NBUFNfRElPX0RJUl9EV09SRDsKKworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCittZTEwMDBfZGlvX3N1YmRldmljZV90ICptZTEwMDBfZGlvX2NvbnN0cnVjdG9yKHVpbnQzMl90IHJlZ19iYXNlLAorCQkJCQkgICAgICAgdW5zaWduZWQgaW50IGRpb19pZHgsCisJCQkJCSAgICAgICBzcGlubG9ja190ICogY3RybF9yZWdfbG9jaykKK3sKKwltZTEwMDBfZGlvX3N1YmRldmljZV90ICpzdWJkZXZpY2U7CisJaW50IGVycjsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCS8qIEFsbG9jYXRlIG1lbW9yeSBmb3Igc3ViZGV2aWNlIGluc3RhbmNlICovCisJc3ViZGV2aWNlID0ga21hbGxvYyhzaXplb2YobWUxMDAwX2Rpb19zdWJkZXZpY2VfdCksIEdGUF9LRVJORUwpOworCisJaWYgKCFzdWJkZXZpY2UpIHsKKwkJUEVSUk9SKCJDYW5ub3QgZ2V0IG1lbW9yeSBmb3IgTUUtMTAwMCBESU8gaW5zdGFuY2UuXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJbWVtc2V0KHN1YmRldmljZSwgMCwgc2l6ZW9mKG1lMTAwMF9kaW9fc3ViZGV2aWNlX3QpKTsKKworCS8qIENoZWNrIGlmIGNvdW50ZXIgaW5kZXggaXMgb3V0IG9mIHJhbmdlICovCisKKwlpZiAoZGlvX2lkeCA+PSBNRTEwMDBfRElPX05VTUJFUl9QT1JUUykgeworCQlQRVJST1IoIkRJTyBpbmRleCBpcyBvdXQgb2YgcmFuZ2UuXG4iKTsKKwkJa2ZyZWUoc3ViZGV2aWNlKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJLyogSW5pdGlhbGl6ZSBzdWJkZXZpY2UgYmFzZSBjbGFzcyAqLworCWVyciA9IG1lX3N1YmRldmljZV9pbml0KCZzdWJkZXZpY2UtPmJhc2UpOworCisJaWYgKGVycikgeworCQlQRVJST1IoIkNhbm5vdCBpbml0aWFsaXplIHN1YmRldmljZSBiYXNlIGNsYXNzIGluc3RhbmNlLlxuIik7CisJCWtmcmVlKHN1YmRldmljZSk7CisJCXJldHVybiBOVUxMOworCX0KKwkvLyBJbml0aWFsaXplIHNwaW4gbG9ja3MuCisJc3Bpbl9sb2NrX2luaXQoJnN1YmRldmljZS0+c3ViZGV2aWNlX2xvY2spOworCXN1YmRldmljZS0+Y3RybF9yZWdfbG9jayA9IGN0cmxfcmVnX2xvY2s7CisKKwkvKiBTYXZlIHRoZSBESU8gaW5kZXggKi8KKwlzdWJkZXZpY2UtPmRpb19pZHggPSBkaW9faWR4OworCisJLyogSW5pdGlhbGl6ZSByZWdpc3RlcnMuICovCisjaWZkZWYgTUVERUJVR19ERUJVR19SRUcKKwlzdWJkZXZpY2UtPnJlZ19iYXNlID0gcmVnX2Jhc2U7CisjZW5kaWYKKwlzdWJkZXZpY2UtPmN0cmxfcmVnID0gcmVnX2Jhc2UgKyBNRTEwMDBfUE9SVF9NT0RFOworCXN1YmRldmljZS0+cG9ydF9yZWcgPQorCSAgICByZWdfYmFzZSArIE1FMTAwMF9QT1JUICsgKGRpb19pZHggKiBNRTEwMDBfUE9SVF9TVEVQKTsKKworCS8qIE92ZXJyaWRlIGJhc2UgY2xhc3MgbWV0aG9kcy4gKi8KKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3Jlc2V0X3N1YmRldmljZSA9CisJICAgIG1lMTAwMF9kaW9faW9fcmVzZXRfc3ViZGV2aWNlOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fc2luZ2xlX2NvbmZpZyA9CisJICAgIG1lMTAwMF9kaW9faW9fc2luZ2xlX2NvbmZpZzsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3NpbmdsZV9yZWFkID0gbWUxMDAwX2Rpb19pb19zaW5nbGVfcmVhZDsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3NpbmdsZV93cml0ZSA9CisJICAgIG1lMTAwMF9kaW9faW9fc2luZ2xlX3dyaXRlOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfcXVlcnlfbnVtYmVyX2NoYW5uZWxzID0KKwkgICAgbWUxMDAwX2Rpb19xdWVyeV9udW1iZXJfY2hhbm5lbHM7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9zdWJkZXZpY2VfdHlwZSA9CisJICAgIG1lMTAwMF9kaW9fcXVlcnlfc3ViZGV2aWNlX3R5cGU7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9zdWJkZXZpY2VfY2FwcyA9CisJICAgIG1lMTAwMF9kaW9fcXVlcnlfc3ViZGV2aWNlX2NhcHM7CisKKwlyZXR1cm4gc3ViZGV2aWNlOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMTAwMF9kaW8uaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTEwMDBfZGlvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDI2ZTkzZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTEwMDBfZGlvLmgKQEAgLTAsMCArMSw3MSBAQAorLyoqCisgKiBAZmlsZSBtZTEwMDBfZGlvLmgKKyAqCisgKiBAYnJpZWYgTWVpbGhhdXMgTUUtMTAwMCBkaWdpdGFsIGkvbyBpbXBsZW1lbnRhdGlvbi4KKyAqIEBub3RlIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKiBAYXV0aG9yIEd1ZW50ZXIgR2ViaGFyZHQKKyAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9NRTEwMDBfRElPX0hfCisjZGVmaW5lIF9NRTEwMDBfRElPX0hfCisKKyNpbmNsdWRlICJtZXN1YmRldmljZS5oIgorI2luY2x1ZGUgIm1lc2xvY2suaCIKKworI2lmZGVmIF9fS0VSTkVMX18KKworLyoqCisgKiBAYnJpZWYgVGhlIE1FLTEwMDAgRElPIHN1YmRldmljZSBjbGFzcy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgbWUxMDAwX2Rpb19zdWJkZXZpY2UgeworCS8qIEluaGVyaXRhbmNlICovCisJbWVfc3ViZGV2aWNlX3QgYmFzZTsJCQkvKio8IFRoZSBzdWJkZXZpY2UgYmFzZSBjbGFzcy4gKi8KKworCS8qIEF0dHJpYnV0ZXMgKi8KKy8vICAgICAgdWludDMyX3QgbWFnaWM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBUaGUgbWFnaWMgbnVtYmVyIHVuaXF1ZSBmb3IgdGhpcyBzdHJ1Y3R1cmUuICovCisKKwlzcGlubG9ja190IHN1YmRldmljZV9sb2NrOwkJLyoqPCBTcGluIGxvY2sgdG8gcHJvdGVjdCB0aGUgc3ViZGV2aWNlIGZyb20gY29uY3VycmVudCBhY2Nlc3MuICovCisJc3BpbmxvY2tfdCAqY3RybF9yZWdfbG9jazsJCS8qKjwgU3BpbiBsb2NrIHRvIHByb3RlY3QgI2N0cmxfcmVnIGFuZCAjY3RybF9yZWdfbWlycm9yIGZyb20gY29uY3VycmVudCBhY2Nlc3MuICovCisJaW50IGRpb19pZHg7CQkJCQkvKio8IFRoZSBpbmRleCBvZiB0aGUgRElPIHBvcnQgb24gdGhlIGRldmljZS4gKi8KKworCXVuc2lnbmVkIGxvbmcgcG9ydF9yZWc7CQkJLyoqPCBSZWdpc3RlciB0byByZWFkIG9yIHdyaXRlIGEgdmFsdWUgZnJvbSBvciB0byB0aGUgcG9ydCByZXNwZWN0aXZlbHkuICovCisJdW5zaWduZWQgbG9uZyBjdHJsX3JlZzsJCQkvKio8IFJlZ2lzdGVyIHRvIGNvbmZpZ3VyZSB0aGUgRElPIG1vZGVzLiAqLworI2lmZGVmIE1FREVCVUdfREVCVUdfUkVHCisJdW5zaWduZWQgbG9uZyByZWdfYmFzZTsKKyNlbmRpZgorfSBtZTEwMDBfZGlvX3N1YmRldmljZV90OworCisvKioKKyAqIEBicmllZiBUaGUgY29uc3RydWN0b3IgdG8gZ2VuZXJhdGUgYSBNRS0xMDAwIERJTyBpbnN0YW5jZS4KKyAqCisgKiBAcGFyYW0gcmVnX2Jhc2UgVGhlIHJlZ2lzdGVyIGJhc2UgYWRkcmVzcyBvZiB0aGUgZGV2aWNlIGFzIHJldHVybmVkIGJ5IHRoZSBQQ0kgQklPUy4KKyAqIEBwYXJhbSBkaW9faWR4IFRoZSBpbmRleCBvZiB0aGUgRElPIG9uIHRoZSBkZXZpY2UuCisgKiBAcGFyYW0gY3RybF9yZWdfbG9jayBQb2ludGVyIHRvIHNwaW4gbG9jayBwcm90ZWN0aW5nIHRoZSBjb250cm9sIHJlZ2lzdGVyIGFuZCBmcm9tIGNvbmN1cnJlbnQgYWNjZXNzLgorICoKKyAqIEByZXR1cm4gUG9pbnRlciB0byBuZXcgaW5zdGFuY2Ugb24gc3VjY2Vzcy5cbgorICogTlVMTCBvbiBlcnJvci4KKyAqLworbWUxMDAwX2Rpb19zdWJkZXZpY2VfdCAqbWUxMDAwX2Rpb19jb25zdHJ1Y3Rvcih1aW50MzJfdCByZWdfYmFzZSwKKwkJCQkJICAgICAgIHVuc2lnbmVkIGludCBkaW9faWR4LAorCQkJCQkgICAgICAgc3BpbmxvY2tfdCAqIGN0cmxfcmVnX2xvY2spOworCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMTAwMF9kaW9fcmVnLmggYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUxMDAwX2Rpb19yZWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDViMzhkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMTAwMF9kaW9fcmVnLmgKQEAgLTAsMCArMSw1MCBAQAorLyoqCisgKiBAZmlsZSBtZTEwMDBfZGlvX3JlZy5oCisgKgorICogQGJyaWVmIE1FLTEwMDAgZGlnaXRhbCBpL28gcmVnaXN0ZXIgZGVmaW5pdGlvbnMuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKiBAYXV0aG9yIEtyenlzenRvZiBHYW50emtlCShrLmdhbnR6a2VAbWVpbGhhdXMuZGUpCisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfTUUxMDAwX0RJT19SRUdfSF8KKyMgZGVmaW5lIF9NRTEwMDBfRElPX1JFR19IXworCisjIGlmZGVmIF9fS0VSTkVMX18KKworIyBkZWZpbmUgTUUxMDAwX0RJT19OVU1CRVJfQ0hBTk5FTFMJMzIJCQkJLyoqPCBUaGUgbnVtYmVyIG9mIGNoYW5uZWxzIHBlciBESU8gcG9ydC4gKi8KKyMgZGVmaW5lIE1FMTAwMF9ESU9fTlVNQkVSX1BPUlRTCTQJCQkJLyoqPCBUaGUgbnVtYmVyIG9mIHBvcnRzIHBlciBNRS0xMDAwLiAqLworCisvLyAjIGRlZmluZSBNRTEwMDBfUE9SVF9BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMCAgICAgICAgICAgICAgICAgIC8qKjwgUG9ydCBBIGJhc2UgcmVnaXN0ZXIgb2Zmc2V0LiAqLworLy8gIyBkZWZpbmUgTUUxMDAwX1BPUlRfQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDQgICAgICAgICAgICAgICAgICAvKio8IFBvcnQgQiBiYXNlIHJlZ2lzdGVyIG9mZnNldC4gKi8KKy8vICMgZGVmaW5lIE1FMTAwMF9QT1JUX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA4ICAgICAgICAgICAgICAgICAgLyoqPCBQb3J0IEMgYmFzZSByZWdpc3RlciBvZmZzZXQuICovCisvLyAjIGRlZmluZSBNRTEwMDBfUE9SVF9EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwQyAgICAgICAgICAgICAgICAgIC8qKjwgUG9ydCBEIGJhc2UgcmVnaXN0ZXIgb2Zmc2V0LiAqLworIyBkZWZpbmUgTUUxMDAwX1BPUlQJCQkJMHgwMDAwCQkJLyoqPCBCYXNlIGZvciBwb3J0J3MgcmVnaXN0ZXIuICovCisjIGRlZmluZSBNRTEwMDBfUE9SVF9TVEVQCQkJNAkJCQkvKio8IERpc3RhbmNlIGJldHdlZW4gcG9ydCdzIHJlZ2lzdGVyLiAqLworCisjIGRlZmluZSBNRTEwMDBfUE9SVF9NT0RFCQkJMHgwMDEwCQkJLyoqPCBDb25maWd1cmF0aW9uIHJlZ2lzdGVyIHRvIHN3aXRjaCB0aGUgcG9ydCBkaXJlY3Rpb24uICovCisvLyAjIGRlZmluZSBNRTEwMDBfUE9SVF9NT0RFX09VVFBVVF9BICAgKDEgPDwgMCkgICAgICAgICAgICAgICAgLyoqPCBJZiBzZXQsIHBvcnQgQSBpcyBpbiBvdXRwdXQsIG90aGVyd2lzZSBpbiBpbnB1dCBtb2RlLiAqLworLy8gIyBkZWZpbmUgTUUxMDAwX1BPUlRfTU9ERV9PVVRQVVRfQiAgICgxIDw8IDEpICAgICAgICAgICAgICAgIC8qKjwgSWYgc2V0LCBwb3J0IEIgaXMgaW4gb3V0cHV0LCBvdGhlcndpc2UgaW4gaW5wdXQgbW9kZS4gKi8KKy8vICMgZGVmaW5lIE1FMTAwMF9QT1JUX01PREVfT1VUUFVUX0MgICAoMSA8PCAyKSAgICAgICAgICAgICAgICAvKio8IElmIHNldCwgcG9ydCBDIGlzIGluIG91dHB1dCwgb3RoZXJ3aXNlIGluIGlucHV0IG1vZGUuICovCisvLyAjIGRlZmluZSBNRTEwMDBfUE9SVF9NT0RFX09VVFBVVF9EICAgKDEgPDwgMykgICAgICAgICAgICAgICAgLyoqPCBJZiBzZXQsIHBvcnQgRCBpcyBpbiBvdXRwdXQsIG90aGVyd2lzZSBpbiBpbnB1dCBtb2RlLiAqLworCisjIGVuZGlmCS8vX19LRVJORUxfXworI2VuZGlmIC8vX01FMTAwMF9ESU9fUkVHX0hfCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUxNDAwX2RldmljZS5jIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMTQwMF9kZXZpY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTViYjRmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMTQwMF9kZXZpY2UuYwpAQCAtMCwwICsxLDI1NiBAQAorLyoqCisgKiBAZmlsZSBtZTE0MDBfZGV2aWNlLmMKKyAqCisgKiBAYnJpZWYgTUUtMTQwMCBkZXZpY2UgaW5zdGFuY2UuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKiBAYXV0aG9yIEtyenlzenRvZiBHYW50emtlCShrLmdhbnR6a2VAbWVpbGhhdXMuZGUpCisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworLyoKKyAqIFVzZXIgYXBwbGljYXRpb24gY291bGQgYWxzbyBpbmNsdWRlIHRoZSBrZXJuZWwgaGVhZGVyIGZpbGVzLiBCdXQgdGhlCisgKiByZWFsIGtlcm5lbCBmdW5jdGlvbnMgYXJlIHByb3RlY3RlZCBieSAjaWZkZWYgX19LRVJORUxfXy4KKyAqLworI2lmbmRlZiBfX0tFUk5FTF9fCisjICBkZWZpbmUgX19LRVJORUxfXworI2VuZGlmCisKKy8qCisgKiBUaGlzIG11c3QgYmUgZGVmaW5lZCBiZWZvcmUgbW9kdWxlLmggaXMgaW5jbHVkZWQuIE5vdCBuZWVkZWQsIHdoZW4KKyAqIGl0IGlzIGEgYnVpbHQgaW4gZHJpdmVyLgorICovCisjaWZuZGVmIE1PRFVMRQorIyAgZGVmaW5lIE1PRFVMRQorI2VuZGlmCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKworI2luY2x1ZGUgIm1laWRzLmgiCisjaW5jbHVkZSAibWVlcnJvci5oIgorI2luY2x1ZGUgIm1lY29tbW9uLmgiCisjaW5jbHVkZSAibWVpbnRlcm5hbC5oIgorCisjaW5jbHVkZSAibWVkZWJ1Zy5oIgorCisjaW5jbHVkZSAibWUxNDAwX2RldmljZS5oIgorI2luY2x1ZGUgIm1lODI1NC5oIgorI2luY2x1ZGUgIm1lODI1NF9yZWcuaCIKKyNpbmNsdWRlICJtZTgyNTUuaCIKKyNpbmNsdWRlICJtZTE0MDBfZXh0X2lycS5oIgorCittZV9kZXZpY2VfdCAqbWUxNDAwX3BjaV9jb25zdHJ1Y3RvcihzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldmljZSkKK3sKKwlpbnQgZXJyOworCW1lMTQwMF9kZXZpY2VfdCAqbWUxNDAwX2RldmljZTsKKwltZV9zdWJkZXZpY2VfdCAqc3ViZGV2aWNlOworCXVuc2lnbmVkIGludCB2ZXJzaW9uX2lkeDsKKwl1bnNpZ25lZCBpbnQgbWU4MjU1X2lkeDsKKwl1bnNpZ25lZCBpbnQgZGlvX2lkeDsKKwl1bnNpZ25lZCBpbnQgbWU4MjU0X2lkeDsKKwl1bnNpZ25lZCBpbnQgY3RyX2lkeDsKKwl1bnNpZ25lZCBpbnQgZXh0X2lycV9pZHg7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwkvLyBBbGxvY2F0ZSBzdHJ1Y3R1cmUgZm9yIGRldmljZSBpbnN0YW5jZS4KKwltZTE0MDBfZGV2aWNlID0ga21hbGxvYyhzaXplb2YobWUxNDAwX2RldmljZV90KSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIW1lMTQwMF9kZXZpY2UpIHsKKwkJUEVSUk9SKCJDYW5ub3QgZ2V0IG1lbW9yeSBmb3IgMTQwMGF0ZSBkZXZpY2UgaW5zdGFuY2UuXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJbWVtc2V0KG1lMTQwMF9kZXZpY2UsIDAsIHNpemVvZihtZTE0MDBfZGV2aWNlX3QpKTsKKworCS8vIEluaXRpYWxpemUgYmFzZSBjbGFzcyBzdHJ1Y3R1cmUuCisJZXJyID0gbWVfZGV2aWNlX3BjaV9pbml0KChtZV9kZXZpY2VfdCAqKSBtZTE0MDBfZGV2aWNlLCBwY2lfZGV2aWNlKTsKKworCWlmIChlcnIpIHsKKwkJa2ZyZWUobWUxNDAwX2RldmljZSk7CisJCVBFUlJPUigiQ2Fubm90IGluaXRpYWxpemUgZGV2aWNlIGJhc2UgY2xhc3MuXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJLyogQ2hlY2sgZm9yIE1FMTQwMCBleHRlbnNpb24gZGV2aWNlLiBJZiBkZXRlY3RlZCB3ZSBmYWtlIGEgTUUtMTQwMCBEIGRldmljZSBpZC4gKi8KKwlpZiAobWUxNDAwX2RldmljZS0+YmFzZS5pbmZvLnBjaS5kZXZpY2VfaWQgPT0KKwkgICAgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE0MEMpIHsKKwkJdWludDhfdCBjdHJsOworCQljdHJsID0KKwkJICAgIGluYihtZTE0MDBfZGV2aWNlLT5iYXNlLmluZm8ucGNpLnJlZ19iYXNlc1syXSArCisJCQlNRTE0MDBEX0NMS19TUkNfMl9SRUcpOworCQlQREVCVUdfUkVHKCJ4eHhfcmVnIGluYigweCVYKzB4JVgpPTB4JXhcbiIsCisJCQkgICBtZTE0MDBfZGV2aWNlLT5iYXNlLmluZm8ucGNpLnJlZ19iYXNlc1syXSwKKwkJCSAgIE1FMTQwMERfQ0xLX1NSQ18yX1JFRywgY3RybCk7CisJCW91dGIoY3RybCB8IDB4RjAsCisJCSAgICAgbWUxNDAwX2RldmljZS0+YmFzZS5pbmZvLnBjaS5yZWdfYmFzZXNbMl0gKworCQkgICAgIE1FMTQwMERfQ0xLX1NSQ18yX1JFRyk7CisJCVBERUJVR19SRUcoInh4eF9yZWcgb3V0YigweCVYKzB4JVgpPTB4JXhcbiIsCisJCQkgICBtZTE0MDBfZGV2aWNlLT5iYXNlLmluZm8ucGNpLnJlZ19iYXNlc1syXSwKKwkJCSAgIE1FMTQwMERfQ0xLX1NSQ18yX1JFRywgY3RybCB8IDB4RjApOworCQljdHJsID0KKwkJICAgIGluYihtZTE0MDBfZGV2aWNlLT5iYXNlLmluZm8ucGNpLnJlZ19iYXNlc1syXSArCisJCQlNRTE0MDBEX0NMS19TUkNfMl9SRUcpOworCQlQREVCVUdfUkVHKCJ4eHhfcmVnIGluYigweCVYKzB4JVgpPTB4JXhcbiIsCisJCQkgICBtZTE0MDBfZGV2aWNlLT5iYXNlLmluZm8ucGNpLnJlZ19iYXNlc1syXSwKKwkJCSAgIE1FMTQwMERfQ0xLX1NSQ18yX1JFRywgY3RybCk7CisKKwkJaWYgKChjdHJsICYgMHhGMCkgPT0gMHhGMCkgeworCQkJUElORk8oIk1FMTQwMCBEIGRldGVjdGVkLlxuIik7CisJCQltZTE0MDBfZGV2aWNlLT5iYXNlLmluZm8ucGNpLmRldmljZV9pZCA9CisJCQkgICAgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE0MEQ7CisJCX0KKwl9CisKKwkvKiBJbml0aWFsaXplIGdsb2JhbCBzdHVmZiBvZiBkaWdpdGFsIGkvbyBzdWJkZXZpY2VzLiAqLworCWZvciAobWU4MjU1X2lkeCA9IDA7IG1lODI1NV9pZHggPCBNRTE0MDBfTUFYXzgyNTU7IG1lODI1NV9pZHgrKykgeworCQltZTE0MDBfZGV2aWNlLT5kaW9fY3VycmVudF9tb2RlW21lODI1NV9pZHhdID0gMDsKKwkJc3Bpbl9sb2NrX2luaXQoJm1lMTQwMF9kZXZpY2UtPmRpb19jdHJsX3JlZ19sb2NrW21lODI1NV9pZHhdKTsKKwl9CisKKwkvKiBJbml0aWFsaXplIGdsb2JhbCBzdHVmZiBvZiBjb3VudGVyIHN1YmRldmljZXMuICovCisJc3Bpbl9sb2NrX2luaXQoJm1lMTQwMF9kZXZpY2UtPmNsa19zcmNfcmVnX2xvY2spOworCisJZm9yIChtZTgyNTRfaWR4ID0gMDsgbWU4MjU0X2lkeCA8IE1FMTQwMF9NQVhfODI1NDsgbWU4MjU0X2lkeCsrKQorCQlzcGluX2xvY2tfaW5pdCgmbWUxNDAwX2RldmljZS0+Y3RyX2N0cmxfcmVnX2xvY2tbbWU4MjU0X2lkeF0pOworCisJLyogR2V0IHRoZSBpbmRleCBpbiB0aGUgZGV2aWNlIHZlcnNpb24gaW5mb3JtYXRpb24gdGFibGUuICovCisJdmVyc2lvbl9pZHggPQorCSAgICBtZTE0MDBfdmVyc2lvbnNfZ2V0X2RldmljZV9pbmRleChtZTE0MDBfZGV2aWNlLT5iYXNlLmluZm8ucGNpLgorCQkJCQkgICAgIGRldmljZV9pZCk7CisKKwkvKiBHZW5lcmF0ZSBESU8gc3ViZGV2aWNlIGluc3RhbmNlcy4gKi8KKwlmb3IgKG1lODI1NV9pZHggPSAwOworCSAgICAgbWU4MjU1X2lkeCA8IG1lMTQwMF92ZXJzaW9uc1t2ZXJzaW9uX2lkeF0uZGlvX2NoaXBzOworCSAgICAgbWU4MjU1X2lkeCsrKSB7CisJCWZvciAoZGlvX2lkeCA9IDA7IGRpb19pZHggPCAzOyBkaW9faWR4KyspIHsKKwkJCXN1YmRldmljZSA9CisJCQkgICAgKG1lX3N1YmRldmljZV90ICopCisJCQkgICAgbWU4MjU1X2NvbnN0cnVjdG9yKG1lMTQwMF92ZXJzaW9uc1t2ZXJzaW9uX2lkeF0uCisJCQkJCSAgICAgICBkZXZpY2VfaWQsCisJCQkJCSAgICAgICBtZTE0MDBfZGV2aWNlLT5iYXNlLmluZm8ucGNpLgorCQkJCQkgICAgICAgcmVnX2Jhc2VzWzJdLCBtZTgyNTVfaWR4LAorCQkJCQkgICAgICAgZGlvX2lkeCwKKwkJCQkJICAgICAgICZtZTE0MDBfZGV2aWNlLT4KKwkJCQkJICAgICAgIGRpb19jdXJyZW50X21vZGVbbWU4MjU1X2lkeF0sCisJCQkJCSAgICAgICAmbWUxNDAwX2RldmljZS0+CisJCQkJCSAgICAgICBkaW9fY3RybF9yZWdfbG9ja1ttZTgyNTVfaWR4XSk7CisKKwkJCWlmICghc3ViZGV2aWNlKSB7CisJCQkJbWVfZGV2aWNlX2RlaW5pdCgobWVfZGV2aWNlX3QgKikgbWUxNDAwX2RldmljZSk7CisJCQkJa2ZyZWUobWUxNDAwX2RldmljZSk7CisJCQkJUEVSUk9SKCJDYW5ub3QgZ2V0IG1lbW9yeSBmb3Igc3ViZGV2aWNlLlxuIik7CisJCQkJcmV0dXJuIE5VTEw7CisJCQl9CisKKwkJCW1lX3NsaXN0X2FkZF9zdWJkZXZpY2VfdGFpbCgmbWUxNDAwX2RldmljZS0+YmFzZS5zbGlzdCwKKwkJCQkJCSAgICBzdWJkZXZpY2UpOworCQl9CisJfQorCisJLyogR2VuZXJhdGUgY291bnRlciBzdWJkZXZpY2UgaW5zdGFuY2VzLiAqLworCWZvciAobWU4MjU0X2lkeCA9IDA7CisJICAgICBtZTgyNTRfaWR4IDwgbWUxNDAwX3ZlcnNpb25zW3ZlcnNpb25faWR4XS5jdHJfY2hpcHM7CisJICAgICBtZTgyNTRfaWR4KyspIHsKKwkJZm9yIChjdHJfaWR4ID0gMDsgY3RyX2lkeCA8IDM7IGN0cl9pZHgrKykgeworCQkJc3ViZGV2aWNlID0KKwkJCSAgICAobWVfc3ViZGV2aWNlX3QgKikKKwkJCSAgICBtZTgyNTRfY29uc3RydWN0b3IobWUxNDAwX2RldmljZS0+YmFzZS5pbmZvLnBjaS4KKwkJCQkJICAgICAgIGRldmljZV9pZCwKKwkJCQkJICAgICAgIG1lMTQwMF9kZXZpY2UtPmJhc2UuaW5mby5wY2kuCisJCQkJCSAgICAgICByZWdfYmFzZXNbMl0sIG1lODI1NF9pZHgsCisJCQkJCSAgICAgICBjdHJfaWR4LAorCQkJCQkgICAgICAgJm1lMTQwMF9kZXZpY2UtPgorCQkJCQkgICAgICAgY3RyX2N0cmxfcmVnX2xvY2tbbWU4MjU0X2lkeF0sCisJCQkJCSAgICAgICAmbWUxNDAwX2RldmljZS0+CisJCQkJCSAgICAgICBjbGtfc3JjX3JlZ19sb2NrKTsKKworCQkJaWYgKCFzdWJkZXZpY2UpIHsKKwkJCQltZV9kZXZpY2VfZGVpbml0KChtZV9kZXZpY2VfdCAqKSBtZTE0MDBfZGV2aWNlKTsKKwkJCQlrZnJlZShtZTE0MDBfZGV2aWNlKTsKKwkJCQlQRVJST1IoIkNhbm5vdCBnZXQgbWVtb3J5IGZvciBzdWJkZXZpY2UuXG4iKTsKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCX0KKworCQkJbWVfc2xpc3RfYWRkX3N1YmRldmljZV90YWlsKCZtZTE0MDBfZGV2aWNlLT5iYXNlLnNsaXN0LAorCQkJCQkJICAgIHN1YmRldmljZSk7CisJCX0KKwl9CisKKwkvKiBHZW5lcmF0ZSBleHRlcm5hbCBpbnRlcnJ1cHQgc3ViZGV2aWNlIGluc3RhbmNlcy4gKi8KKwlmb3IgKGV4dF9pcnFfaWR4ID0gMDsKKwkgICAgIGV4dF9pcnFfaWR4IDwgbWUxNDAwX3ZlcnNpb25zW3ZlcnNpb25faWR4XS5leHRfaXJxX3N1YmRldmljZXM7CisJICAgICBleHRfaXJxX2lkeCsrKSB7CisJCXN1YmRldmljZSA9CisJCSAgICAobWVfc3ViZGV2aWNlX3QgKikKKwkJICAgIG1lMTQwMF9leHRfaXJxX2NvbnN0cnVjdG9yKG1lMTQwMF9kZXZpY2UtPmJhc2UuaW5mby5wY2kuCisJCQkJCSAgICAgICBkZXZpY2VfaWQsCisJCQkJCSAgICAgICBtZTE0MDBfZGV2aWNlLT5iYXNlLmluZm8ucGNpLgorCQkJCQkgICAgICAgcmVnX2Jhc2VzWzFdLAorCQkJCQkgICAgICAgbWUxNDAwX2RldmljZS0+YmFzZS5pbmZvLnBjaS4KKwkJCQkJICAgICAgIHJlZ19iYXNlc1syXSwKKwkJCQkJICAgICAgICZtZTE0MDBfZGV2aWNlLT5jbGtfc3JjX3JlZ19sb2NrLAorCQkJCQkgICAgICAgbWUxNDAwX2RldmljZS0+YmFzZS5pcnEpOworCisJCWlmICghc3ViZGV2aWNlKSB7CisJCQltZV9kZXZpY2VfZGVpbml0KChtZV9kZXZpY2VfdCAqKSBtZTE0MDBfZGV2aWNlKTsKKwkJCWtmcmVlKG1lMTQwMF9kZXZpY2UpOworCQkJUEVSUk9SKCJDYW5ub3QgZ2V0IG1lbW9yeSBmb3Igc3ViZGV2aWNlLlxuIik7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJCW1lX3NsaXN0X2FkZF9zdWJkZXZpY2VfdGFpbCgmbWUxNDAwX2RldmljZS0+YmFzZS5zbGlzdCwKKwkJCQkJICAgIHN1YmRldmljZSk7CisJfQorCisJcmV0dXJuIChtZV9kZXZpY2VfdCAqKSBtZTE0MDBfZGV2aWNlOworfQorCisvLyBJbml0IGFuZCBleGl0IG9mIG1vZHVsZS4KKworc3RhdGljIGludCBfX2luaXQgbWUxNDAwX2luaXQodm9pZCkKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBtZTE0MDBfZXhpdCh2b2lkKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKK30KKworbW9kdWxlX2luaXQobWUxNDAwX2luaXQpOworbW9kdWxlX2V4aXQobWUxNDAwX2V4aXQpOworCisvLyBBZG1pbmlzdHJhdGl2ZSBzdHVmZiBmb3IgbW9kaW5mby4KK01PRFVMRV9BVVRIT1IKKyAgICAoIkd1ZW50ZXIgR2ViaGFyZHQgPGcuZ2ViaGFyZHRAbWVpbGhhdXMuZGU+ICYgS3J6eXN6dG9mIEdhbnR6a2UgPGsuZ2FudHprZUBtZWlsaGF1cy5kZT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiRGV2aWNlIERyaXZlciBNb2R1bGUgZm9yIE1laWxoYXVzIE1FLTE0eHggZGV2aWNlcyIpOworTU9EVUxFX1NVUFBPUlRFRF9ERVZJQ0UoIk1laWxoYXVzIE1FLTE0eHggTUlPIGRldmljZXMiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworLy8gRXhwb3J0IHRoZSBjb25zdHJ1Y3Rvci4KK0VYUE9SVF9TWU1CT0wobWUxNDAwX3BjaV9jb25zdHJ1Y3Rvcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUxNDAwX2RldmljZS5oIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMTQwMF9kZXZpY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjE1YjI1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMTQwMF9kZXZpY2UuaApAQCAtMCwwICsxLDEwOCBAQAorLyoqCisgKiBAZmlsZSBtZTE0MDBfZGV2aWNlLmMKKyAqCisgKiBAYnJpZWYgTUUtMTQwMCBkZXZpY2UgZmFtaWx5IGluc3RhbmNlLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX01FMTQwMF9ERVZJQ0VfSF8KKyNkZWZpbmUgX01FMTQwMF9ERVZJQ0VfSF8KKworI2luY2x1ZGUgIm1ldHlwZXMuaCIKKyNpbmNsdWRlICJtZWRlZmluZXMuaCIKKyNpbmNsdWRlICJtZWludGVybmFsLmgiCisKKyNpbmNsdWRlICJtZWRldmljZS5oIgorCisjaWZkZWYgX19LRVJORUxfXworCisvKioKKyAqIEBicmllZiBTdHJ1Y3R1cmUgdG8gc3RvcmUgZGV2aWNlIGNhcGFiaWxpdGllcy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgbWUxNDAwX3ZlcnNpb24geworCXVpbnQxNl90IGRldmljZV9pZDsJCQkJCS8qKjwgVGhlIFBDSSBkZXZpY2UgaWQgb2YgdGhlIGRldmljZS4gKi8KKwl1bnNpZ25lZCBpbnQgZGlvX2NoaXBzOwkJCQkvKio8IFRoZSBudW1iZXIgb2YgODI1NSBjaGlwcyBvbiB0aGUgZGV2aWNlLiAqLworCXVuc2lnbmVkIGludCBjdHJfY2hpcHM7CQkJCS8qKjwgVGhlIG51bWJlciBvZiA4MjU0IGNoaXBzIG9uIHRoZSBkZXZpY2UuICovCisJdW5zaWduZWQgaW50IGV4dF9pcnFfc3ViZGV2aWNlczsJLyoqPCBUaGUgbnVtYmVyIG9mIGV4dGVybmFsIGludGVycnVwdCBpbnB1dHMgb24gdGhlIGRldmljZS4gKi8KK30gbWUxNDAwX3ZlcnNpb25fdDsKKworLyoqCisgICogQGJyaWVmIERlZmluZXMgZm9yIGVhY2ggTUUtMTQwMCBkZXZpY2UgdmVyc2lvbiBpdHMgY2FwYWJpbGl0aWVzLgorICovCitzdGF0aWMgbWUxNDAwX3ZlcnNpb25fdCBtZTE0MDBfdmVyc2lvbnNbXSA9IHsKKwl7UENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE0MDAsIDEsIDAsIDB9LAorCXtQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTQwQSwgMSwgMSwgMX0sCisJe1BDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNDBCLCAyLCAyLCAxfSwKKwl7UENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE0RTAsIDEsIDAsIDB9LAorCXtQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTRFQSwgMSwgMSwgMX0sCisJe1BDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNEVCLCAyLCAyLCAxfSwKKwl7UENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE0MEMsIDEsIDUsIDF9LAorCXtQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTQwRCwgMiwgMTAsIDF9LAorCXswfQorfTsKKworI2RlZmluZSBNRTE0MDBfREVWSUNFX1ZFUlNJT05TIChzaXplb2YobWUxNDAwX3ZlcnNpb25zKSAvIHNpemVvZihtZTE0MDBfdmVyc2lvbl90KSAtIDEpCS8qKjwgUmV0dXJucyB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaW4gI21lMTQwMF92ZXJzaW9ucy4gKi8KKworLyoqCisgKiBAYnJpZWYgUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGRldmljZSBlbnRyeSBpbiAjbWUxNDAwX3ZlcnNpb25zLgorICoKKyAqIEBwYXJhbSBkZXZpY2VfaWQgVGhlIFBDSSBkZXZpY2UgaWQgb2YgdGhlIGRldmljZSB0byBxdWVyeS4KKyAqIEByZXR1cm4gVGhlIGluZGV4IG9mIHRoZSBkZXZpY2UgaW4gI21lMTQwMF92ZXJzaW9ucy4KKyAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgbWUxNDAwX3ZlcnNpb25zX2dldF9kZXZpY2VfaW5kZXgodWludDE2X3QgZGV2aWNlX2lkKQoreworCXVuc2lnbmVkIGludCBpOworCWZvciAoaSA9IDA7IGkgPCBNRTE0MDBfREVWSUNFX1ZFUlNJT05TOyBpKyspCisJCWlmIChtZTE0MDBfdmVyc2lvbnNbaV0uZGV2aWNlX2lkID09IGRldmljZV9pZCkKKwkJCWJyZWFrOworCXJldHVybiBpOworfQorCisjZGVmaW5lIE1FMTQwMF9NQVhfODI1NAkJMTAJLyoqPCBUaGUgbWF4aW11bSBudW1iZXIgb2YgODI1NCBjb3VudGVyIHN1YmRldmljZXMgYXZhaWxhYmxlIG9uIGFueSBNRS0xNDAwIGRldmljZS4gKi8KKyNkZWZpbmUgTUUxNDAwX01BWF84MjU1CQkyCS8qKjwgVGhlIG1heGltdW0gbnVtYmVyIG9mIDgyNTUgZGlnaXRhbCBpL28gc3ViZGV2aWNlcyBhdmFpbGFibGUgb24gYW55IE1FLTE0MDAgZGV2aWNlLiAqLworCisvKioKKyAqIEBicmllZiBUaGUgTUUtMTQwMCBkZXZpY2UgY2xhc3MuCisgKi8KK3R5cGVkZWYgc3RydWN0IG1lMTQwMF9kZXZpY2UgeworCW1lX2RldmljZV90IGJhc2U7CQkJCQkJCQkJLyoqPCBUaGUgTWVpbGhhdXMgZGV2aWNlIGJhc2UgY2xhc3MuICovCisKKwlzcGlubG9ja190IGNsa19zcmNfcmVnX2xvY2s7CQkJCQkJLyoqPCBHdWFyZHMgdGhlIDgyNTQgY2xvY2sgc291cmNlIHJlZ2lzdGVycy4gKi8KKwlzcGlubG9ja190IGN0cl9jdHJsX3JlZ19sb2NrW01FMTQwMF9NQVhfODI1NF07CQkvKio8IEd1YXJkcyB0aGUgODI1NCBjdHJsIHJlZ2lzdGVycy4gKi8KKworCWludCBkaW9fY3VycmVudF9tb2RlW01FMTQwMF9NQVhfODI1NV07CQkJCS8qKjwgU2F2ZXMgdGhlIGN1cnJlbnQgbW9kZSBzZXR0aW5nIG9mIGEgc2luZ2xlIDgyNTUgRElPIGNoaXAuICovCisJc3BpbmxvY2tfdCBkaW9fY3RybF9yZWdfbG9ja1tNRTE0MDBfTUFYXzgyNTVdOwkJLyoqPCBHdWFyZHMgdGhlIDgyNTUgY3RybCByZWdpc3RlciBhbmQgI2Rpb19jdXJyZW50X21vZGUuICovCit9IG1lMTQwMF9kZXZpY2VfdDsKKworLyoqCisgKiBAYnJpZWYgVGhlIE1FLTE0MDAgZGV2aWNlIGNsYXNzIGNvbnN0cnVjdG9yLgorICoKKyAqIEBwYXJhbSBwY2lfZGV2aWNlIFRoZSBwY2kgZGV2aWNlIHN0cnVjdHVyZSBnaXZlbiBieSB0aGUgUENJIHN1YnN5c3RlbS4KKyAqCisgKiBAcmV0dXJuIE9uIHN1Y2NlcyBhIG5ldyBNRS0xNDAwIGRldmljZSBpbnN0YW5jZS4gXG4KKyAqICAgICAgICAgTlVMTCBvbiBlcnJvci4KKyAqLworbWVfZGV2aWNlX3QgKm1lMTQwMF9wY2lfY29uc3RydWN0b3Ioc3RydWN0IHBjaV9kZXYgKnBjaV9kZXZpY2UpCisgICAgX19hdHRyaWJ1dGVfXyAoKHdlYWspKTsKKworI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTE0MDBfZXh0X2lycS5jIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMTQwMF9leHRfaXJxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRkZjdjYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTE0MDBfZXh0X2lycS5jCkBAIC0wLDAgKzEsNTE3IEBACisvKioKKyAqIEBmaWxlIG1lMTQwMF9leHRfaXJxLmMKKyAqCisgKiBAYnJpZWYgTUUtMTQwMCBleHRlcm5hbCBpbnRlcnJ1cHQgc3ViZGV2aWNlIGluc3RhbmNlLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICogQGF1dGhvciBLcnp5c3p0b2YgR2FudHprZQkoay5nYW50emtlQG1laWxoYXVzLmRlKQorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX19LRVJORUxfXworIyAgZGVmaW5lIF9fS0VSTkVMX18KKyNlbmRpZgorCisvKgorICogSW5jbHVkZXMKKyAqLworI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisKKyNpbmNsdWRlICJtZWRlZmluZXMuaCIKKyNpbmNsdWRlICJtZWludGVybmFsLmgiCisjaW5jbHVkZSAibWVlcnJvci5oIgorI2luY2x1ZGUgIm1lZGVidWcuaCIKKyNpbmNsdWRlICJtZWlkcy5oIgorCisjaW5jbHVkZSAibWUxNDAwX2V4dF9pcnEuaCIKKyNpbmNsdWRlICJtZTE0MDBfZXh0X2lycV9yZWcuaCIKKworLyoKKyAqIERlZmluZXMKKyAqLworI2RlZmluZSBNRTE0MDBfRVhUX0lSUV9NQUdJQ19OVU1CRVIJMHgxNDAxCS8qKjwgVGhlIG1hZ2ljIG51bWJlciBvZiB0aGUgY2xhc3Mgc3RydWN0dXJlLiAqLworI2RlZmluZSBNRTE0MDBfRVhUX0lSUV9OVU1CRVJfQ0hBTk5FTFMgMQkvKio8IE9uZSBjaGFubmVsIHBlciBjb3VudGVyLiAqLworCisvKgorICogRnVuY3Rpb25zCisgKi8KKworc3RhdGljIGludCBtZTE0MDBfZXh0X2lycV9pb19pcnFfc3RhcnQoc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlLAorCQkJCSAgICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgICAgIGludCBjaGFubmVsLAorCQkJCSAgICAgICBpbnQgaXJxX3NvdXJjZSwKKwkJCQkgICAgICAgaW50IGlycV9lZGdlLCBpbnQgaXJxX2FyZywgaW50IGZsYWdzKQoreworCW1lMTQwMF9leHRfaXJxX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwl1bnNpZ25lZCBsb25nIGNwdV9mbGFnczsKKwl1aW50OF90IHRtcDsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lMTQwMF9leHRfaXJxX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCWlmIChmbGFncyAmIH5NRV9JT19JUlFfU1RBUlRfRElPX0JJVCkgeworCQlQRVJST1IoIkludmFsaWQgZmxhZyBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJfQorCisJaWYgKGNoYW5uZWwpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGNoYW5uZWwuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwl9CisKKwlpZiAoaXJxX3NvdXJjZSAhPSBNRV9JUlFfU09VUkNFX0RJT19MSU5FKSB7CisJCVBFUlJPUigiSW52YWxpZCBpcnEgc291cmNlLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0lSUV9TT1VSQ0U7CisJfQorCisJaWYgKGlycV9lZGdlICE9IE1FX0lSUV9FREdFX1JJU0lORykgeworCQlQRVJST1IoIkludmFsaWQgaXJxIGVkZ2UuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfSVJRX0VER0U7CisJfQorCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKworCXNwaW5fbG9jayhpbnN0YW5jZS0+Y2xrX3NyY19yZWdfbG9jayk7CisvLyAgICAgICAgICAgICAgICAgICAgICAvLyBFbmFibGUgSVJRIG9uIFBMWAorLy8gICAgICAgICAgICAgICAgICAgICAgdG1wID0gaW5iKGluc3RhbmNlLT5wbHhfaW50Y3NfcmVnKSB8IChQTFhfTE9DQUxfSU5UMV9FTiB8IFBMWF9MT0NBTF9JTlQxX1BPTCB8IFBMWF9QQ0lfSU5UX0VOKTsKKy8vICAgICAgICAgICAgICAgICAgICAgIG91dGIodG1wLCBpbnN0YW5jZS0+cGx4X2ludGNzX3JlZyk7CisvLyAgICAgICAgICAgICAgICAgICAgICBQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRiKFBMWDoweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnBseF9pbnRjc19yZWcsIHRtcCk7CisKKwkvLyBFbmFibGUgSVJRCisJc3dpdGNoIChpbnN0YW5jZS0+ZGV2aWNlX2lkKSB7CisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTQwQzoKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNDBEOgorCQl0bXAgPSBpbmIoaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJdG1wIHw9IE1FMTQwMENEX0VYVF9JUlFfQ0xLX0VOOworCQlvdXRiKHRtcCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgdG1wKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlvdXRiKE1FMTQwMEFCX0VYVF9JUlFfSVJRX0VOLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgTUUxNDAwQUJfRVhUX0lSUV9JUlFfRU4pOworCQlicmVhazsKKwl9CisJc3Bpbl91bmxvY2soaW5zdGFuY2UtPmNsa19zcmNfcmVnX2xvY2spOworCWluc3RhbmNlLT5yaXNlZCA9IDA7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZTE0MDBfZXh0X2lycV9pb19pcnFfd2FpdChzdHJ1Y3QgbWVfc3ViZGV2aWNlICpzdWJkZXZpY2UsCisJCQkJICAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICAgIGludCBjaGFubmVsLAorCQkJCSAgICAgIGludCAqaXJxX2NvdW50LAorCQkJCSAgICAgIGludCAqdmFsdWUsIGludCB0aW1lX291dCwgaW50IGZsYWdzKQoreworCW1lMTQwMF9leHRfaXJxX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwl1bnNpZ25lZCBsb25nIGNwdV9mbGFnczsKKwlsb25nIHQgPSAwOworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJaW5zdGFuY2UgPSAobWUxNDAwX2V4dF9pcnFfc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJaWYgKGZsYWdzKSB7CisJCVBFUlJPUigiSW52YWxpZCBmbGFnIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlpZiAoY2hhbm5lbCkgeworCQlQRVJST1IoIkludmFsaWQgY2hhbm5lbC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCX0KKworCWlmICh0aW1lX291dCA8IDApIHsKKwkJUEVSUk9SKCJJbnZhbGlkIHRpbWUgb3V0LlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1RJTUVPVVQ7CisJfQorCisJaWYgKHRpbWVfb3V0KSB7CisJCS8qIENvbnZlcnQgdG8gdGlja3MgKi8KKwkJdCA9ICh0aW1lX291dCAqIEhaKSAvIDEwMDA7CisKKwkJaWYgKHQgPT0gMCkKKwkJCXQgPSAxOworCX0KKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCWlmIChpbnN0YW5jZS0+cmlzZWQgPD0gMCkgeworCQlpbnN0YW5jZS0+cmlzZWQgPSAwOworCQlpZiAodGltZV9vdXQpIHsKKwkJCXQgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChpbnN0YW5jZS0+CisJCQkJCQkJICAgICB3YWl0X3F1ZXVlLAorCQkJCQkJCSAgICAgKGluc3RhbmNlLT5yaXNlZCAhPQorCQkJCQkJCSAgICAgIDApLCB0KTsKKworCQkJaWYgKHQgPT0gMCkgeworCQkJCVBFUlJPUigiV2FpdCBvbiBpbnRlcnJ1cHQgdGltZWQgb3V0LlxuIik7CisJCQkJZXJyID0gTUVfRVJSTk9fVElNRU9VVDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShpbnN0YW5jZS0+d2FpdF9xdWV1ZSwKKwkJCQkJCSAoaW5zdGFuY2UtPnJpc2VkICE9IDApKTsKKwkJfQorCisJCWlmIChpbnN0YW5jZS0+cmlzZWQgPCAwKSB7CisJCQlQRVJST1IoIldhaXQgb24gaW50ZXJydXB0IGFib3J0ZWQgYnkgdXNlci5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fQ0FOQ0VMTEVEOworCQl9CisJfQorCisJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCVBFUlJPUigiV2FpdCBvbiBpbnRlcnJ1cHQgYWJvcnRlZCBieSBzaWduYWwuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fU0lHTkFMOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisJaW5zdGFuY2UtPnJpc2VkID0gMDsKKwkqaXJxX2NvdW50ID0gaW5zdGFuY2UtPm47CisJKnZhbHVlID0gMTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWUxNDAwX2V4dF9pcnFfaW9faXJxX3N0b3Aoc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlLAorCQkJCSAgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgICBpbnQgY2hhbm5lbCwgaW50IGZsYWdzKQoreworCW1lMTQwMF9leHRfaXJxX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwl1bnNpZ25lZCBsb25nIGNwdV9mbGFnczsKKwl1aW50OF90IHRtcDsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lMTQwMF9leHRfaXJxX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCWlmIChmbGFncykgeworCQlQRVJST1IoIkludmFsaWQgZmxhZyBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJfQorCisJaWYgKGNoYW5uZWwpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGNoYW5uZWwuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwl9CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCXNwaW5fbG9jayhpbnN0YW5jZS0+Y2xrX3NyY19yZWdfbG9jayk7CisvLyAgICAgICAgICAgICAgICAgICAgICAvLyBEaXNhYmxlIElSUSBvbiBQTFgKKy8vICAgICAgICAgICAgICAgICAgICAgIHRtcCA9IGluYihpbnN0YW5jZS0+cGx4X2ludGNzX3JlZykgJiAoIH4oUExYX0xPQ0FMX0lOVDFfRU4gfCBQTFhfTE9DQUxfSU5UMV9QT0wgfCBQTFhfUENJX0lOVF9FTikpOworLy8gICAgICAgICAgICAgICAgICAgICAgb3V0Yih0bXAsIGluc3RhbmNlLT5wbHhfaW50Y3NfcmVnKTsKKy8vICAgICAgICAgICAgICAgICAgICAgIFBERUJVR19SRUcoImN0cmxfcmVnIG91dGIoUExYOjB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cGx4X2ludGNzX3JlZywgdG1wKTsKKworCXN3aXRjaCAoaW5zdGFuY2UtPmRldmljZV9pZCkgeworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE0MEM6CisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTQwRDoKKwkJdG1wID0gaW5iKGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCXRtcCAmPSB+TUUxNDAwQ0RfRVhUX0lSUV9DTEtfRU47CisJCW91dGIodG1wLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCB0bXApOworCisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJb3V0YigweDAwLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCAweDAwKTsKKwkJYnJlYWs7CisJfQorCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5jbGtfc3JjX3JlZ19sb2NrKTsKKwlpbnN0YW5jZS0+cmlzZWQgPSAtMTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlX2FsbCgmaW5zdGFuY2UtPndhaXRfcXVldWUpOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lMTQwMF9leHRfaXJxX2lvX3Jlc2V0X3N1YmRldmljZShzdHJ1Y3QgbWVfc3ViZGV2aWNlICpzdWJkZXZpY2UsCisJCQkJCSAgICAgc3RydWN0IGZpbGUgKmZpbGVwLCBpbnQgZmxhZ3MpCit7CisJbWUxNDAwX2V4dF9pcnFfc3ViZGV2aWNlX3QgKmluc3RhbmNlID0KKwkgICAgKG1lMTQwMF9leHRfaXJxX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWlmIChmbGFncykgeworCQlQRVJST1IoIkludmFsaWQgZmxhZyBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJfQorCisJaW5zdGFuY2UtPm4gPSAwOworCXJldHVybiBtZTE0MDBfZXh0X2lycV9pb19pcnFfc3RvcChzdWJkZXZpY2UsIGZpbGVwLCAwLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgbWUxNDAwX2V4dF9pcnFfcXVlcnlfbnVtYmVyX2NoYW5uZWxzKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSwKKwkJCQkJCWludCAqbnVtYmVyKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwkqbnVtYmVyID0gTUUxNDAwX0VYVF9JUlFfTlVNQkVSX0NIQU5ORUxTOworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lMTQwMF9leHRfaXJxX3F1ZXJ5X3N1YmRldmljZV90eXBlKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSwKKwkJCQkJICAgICAgIGludCAqdHlwZSwgaW50ICpzdWJ0eXBlKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwkqdHlwZSA9IE1FX1RZUEVfRVhUX0lSUTsKKwkqc3VidHlwZSA9IE1FX1NVQlRZUEVfU0lOR0xFOworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lMTQwMF9leHRfaXJxX3F1ZXJ5X3N1YmRldmljZV9jYXBzKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSwKKwkJCQkJICAgICAgIGludCAqY2FwcykKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJKmNhcHMgPSBNRV9DQVBTX0VYVF9JUlFfRURHRV9SSVNJTkc7CisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWUxNDAwX2V4dF9pcnFfcXVlcnlfc3ViZGV2aWNlX2NhcHNfYXJncyhzdHJ1Y3QgbWVfc3ViZGV2aWNlCisJCQkJCQkgICAgKnN1YmRldmljZSwgaW50IGNhcCwKKwkJCQkJCSAgICBpbnQgKmFyZ3MsIGludCBjb3VudCkKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJcmV0dXJuIE1FX0VSUk5PX05PVF9TVVBQT1JURUQ7Cit9CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiwgNiwgMTkpCitzdGF0aWMgaXJxcmV0dXJuX3QgbWUxNDAwX2V4dF9pcnFfaXNyKGludCBpcnEsIHZvaWQgKmRldl9pZCkKKyNlbHNlCitzdGF0aWMgaXJxcmV0dXJuX3QgbWUxNDAwX2V4dF9pcnFfaXNyKGludCBpcnEsIHZvaWQgKmRldl9pZCwKKwkJCQkgICAgICBzdHJ1Y3QgcHRfcmVncyAqcmVncykKKyNlbmRpZgoreworCW1lMTQwMF9leHRfaXJxX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwl1aW50MzJfdCBzdGF0dXM7CisJdWludDhfdCB0bXA7CisKKwlpbnN0YW5jZSA9IChtZTE0MDBfZXh0X2lycV9zdWJkZXZpY2VfdCAqKSBkZXZfaWQ7CisKKwlpZiAoaXJxICE9IGluc3RhbmNlLT5pcnEpIHsKKwkJUEVSUk9SKCJJbmNvcnJlY3QgaW50ZXJydXB0IG51bTogJWQuXG4iLCBpcnEpOworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCisJc3Bpbl9sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCXN0YXR1cyA9IGlubChpbnN0YW5jZS0+cGx4X2ludGNzX3JlZyk7CisvLyAgICAgICAgICAgICAgaWYgKCEoKHN0YXR1cyAmIFBMWF9MT0NBTF9JTlQxX1NUQVRFKSAmJiAoc3RhdHVzICYgUExYX0xPQ0FMX0lOVDFfRU4pICYmIChzdGF0dXMgJiBQTFhfUENJX0lOVF9FTikpKQorCWlmICgoc3RhdHVzICYKKwkgICAgIChQTFhfTE9DQUxfSU5UMV9TVEFURSB8IFBMWF9MT0NBTF9JTlQxX0VOIHwgUExYX1BDSV9JTlRfRU4pKSAhPQorCSAgICAoUExYX0xPQ0FMX0lOVDFfU1RBVEUgfCBQTFhfTE9DQUxfSU5UMV9FTiB8IFBMWF9QQ0lfSU5UX0VOKSkgeworCQlzcGluX3VubG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKwkJUElORk8oIiVsZCBTaGFyZWQgaW50ZXJydXB0LiAlcygpOiBpcnFfc3RhdHVzX3JlZz0weCUwNFhcbiIsCisJCSAgICAgIGppZmZpZXMsIF9fZnVuY19fLCBzdGF0dXMpOworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCisJaW5sKGluc3RhbmNlLT5jdHJsX3JlZyk7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbnN0YW5jZS0+bisrOworCWluc3RhbmNlLT5yaXNlZCA9IDE7CisKKwlzd2l0Y2ggKGluc3RhbmNlLT5kZXZpY2VfaWQpIHsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE0MEM6CisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTQwRDoKKwkJc3Bpbl9sb2NrKGluc3RhbmNlLT5jbGtfc3JjX3JlZ19sb2NrKTsKKwkJdG1wID0gaW5iKGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCXRtcCAmPSB+TUUxNDAwQ0RfRVhUX0lSUV9DTEtfRU47CisJCW91dGIodG1wLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRiKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCB0bXApOworCQl0bXAgfD0gTUUxNDAwQ0RfRVhUX0lSUV9DTEtfRU47CisJCW91dGIodG1wLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRiKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCB0bXApOworCQlzcGluX3VubG9jayhpbnN0YW5jZS0+Y2xrX3NyY19yZWdfbG9jayk7CisKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlvdXRiKDAsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGIoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIDApOworCQlvdXRiKE1FMTQwMEFCX0VYVF9JUlFfSVJRX0VOLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRiKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgTUUxNDAwQUJfRVhUX0lSUV9JUlFfRU4pOworCQlicmVhazsKKwl9CisKKwlzcGluX3VubG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGVfYWxsKCZpbnN0YW5jZS0+d2FpdF9xdWV1ZSk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyB2b2lkIG1lMTQwMF9leHRfaXJxX2Rlc3RydWN0b3Ioc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlKQoreworCW1lMTQwMF9leHRfaXJxX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwl1aW50OF90IHRtcDsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lMTQwMF9leHRfaXJxX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCS8vIERpc2FibGUgSVJRIG9uIFBMWAorCXRtcCA9CisJICAgIGluYihpbnN0YW5jZS0+CisJCXBseF9pbnRjc19yZWcpICYgKH4oUExYX0xPQ0FMX0lOVDFfRU4gfCBQTFhfTE9DQUxfSU5UMV9QT0wgfAorCQkJCSAgICBQTFhfUENJX0lOVF9FTikpOworCW91dGIodG1wLCBpbnN0YW5jZS0+cGx4X2ludGNzX3JlZyk7CisJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0YihwbHg6MHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5wbHhfaW50Y3NfcmVnLAorCQkgICB0bXApOworCisJZnJlZV9pcnEoaW5zdGFuY2UtPmlycSwgKHZvaWQgKilpbnN0YW5jZSk7CisJbWVfc3ViZGV2aWNlX2RlaW5pdCgmaW5zdGFuY2UtPmJhc2UpOworCWtmcmVlKGluc3RhbmNlKTsKK30KKworbWUxNDAwX2V4dF9pcnFfc3ViZGV2aWNlX3QgKm1lMTQwMF9leHRfaXJxX2NvbnN0cnVjdG9yKHVpbnQzMl90IGRldmljZV9pZCwKKwkJCQkJCSAgICAgICB1aW50MzJfdCBwbHhfcmVnX2Jhc2UsCisJCQkJCQkgICAgICAgdWludDMyX3QgbWUxNDAwX3JlZ19iYXNlLAorCQkJCQkJICAgICAgIHNwaW5sb2NrX3QgKgorCQkJCQkJICAgICAgIGNsa19zcmNfcmVnX2xvY2ssCisJCQkJCQkgICAgICAgaW50IGlycSkKK3sKKwltZTE0MDBfZXh0X2lycV9zdWJkZXZpY2VfdCAqc3ViZGV2aWNlOworCWludCBlcnI7CisJdWludDhfdCB0bXA7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwkvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHN1YmRldmljZSBpbnN0YW5jZSAqLworCXN1YmRldmljZSA9IGttYWxsb2Moc2l6ZW9mKG1lMTQwMF9leHRfaXJxX3N1YmRldmljZV90KSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIXN1YmRldmljZSkgeworCQlQRVJST1IoIkNhbm5vdCBnZXQgbWVtb3J5IGZvciAxNDAwX2V4dF9pcnEgaW5zdGFuY2UuXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJbWVtc2V0KHN1YmRldmljZSwgMCwgc2l6ZW9mKG1lMTQwMF9leHRfaXJxX3N1YmRldmljZV90KSk7CisKKwkvKiBJbml0aWFsaXplIHN1YmRldmljZSBiYXNlIGNsYXNzICovCisJZXJyID0gbWVfc3ViZGV2aWNlX2luaXQoJnN1YmRldmljZS0+YmFzZSk7CisKKwlpZiAoZXJyKSB7CisJCVBFUlJPUigiQ2Fubm90IGluaXRpYWxpemUgc3ViZGV2aWNlIGJhc2UgY2xhc3MgaW5zdGFuY2UuXG4iKTsKKwkJa2ZyZWUoc3ViZGV2aWNlKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCS8vIEluaXRpYWxpemUgc3BpbiBsb2Nrcy4KKwlzcGluX2xvY2tfaW5pdCgmc3ViZGV2aWNlLT5zdWJkZXZpY2VfbG9jayk7CisJc3ViZGV2aWNlLT5jbGtfc3JjX3JlZ19sb2NrID0gY2xrX3NyY19yZWdfbG9jazsKKworCS8qIEluaXRpYWxpemUgd2FpdCBxdWV1ZSAqLworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnN1YmRldmljZS0+d2FpdF9xdWV1ZSk7CisKKwlzdWJkZXZpY2UtPmlycSA9IGlycTsKKworCWVyciA9IHJlcXVlc3RfaXJxKGlycSwgbWUxNDAwX2V4dF9pcnFfaXNyLAorI2lmZGVmIElSUUZfRElTQUJMRUQKKwkJCSAgSVJRRl9ESVNBQkxFRCB8IElSUUZfU0hBUkVELAorI2Vsc2UKKwkJCSAgU0FfSU5URVJSVVBUIHwgU0FfU0hJUlEsCisjZW5kaWYKKwkJCSAgTUUxNDAwX05BTUUsICh2b2lkICopc3ViZGV2aWNlKTsKKworCWlmIChlcnIpIHsKKwkJUEVSUk9SKCJDYW4ndCBnZXQgaXJxLlxuIik7CisJCW1lX3N1YmRldmljZV9kZWluaXQoJnN1YmRldmljZS0+YmFzZSk7CisJCWtmcmVlKHN1YmRldmljZSk7CisJCXJldHVybiBOVUxMOworCX0KKwlQSU5GTygiUmVnaXN0ZXJlZCBpcnE9JWQuXG4iLCBzdWJkZXZpY2UtPmlycSk7CisKKwkvKiBJbml0aWFsaXplIHJlZ2lzdGVycyAqLworCXN1YmRldmljZS0+cGx4X2ludGNzX3JlZyA9IHBseF9yZWdfYmFzZSArIFBMWF9JTlRDU1JfUkVHOworCXN1YmRldmljZS0+Y3RybF9yZWcgPSBtZTE0MDBfcmVnX2Jhc2UgKyBNRTE0MDBBQl9FWFRfSVJRX0NUUkxfUkVHOworI2lmZGVmIE1FREVCVUdfREVCVUdfUkVHCisJc3ViZGV2aWNlLT5yZWdfYmFzZSA9IG1lMTQwMF9yZWdfYmFzZTsKKyNlbmRpZgorCisJLy8gRW5hYmxlIElSUSBvbiBQTFgKKwl0bXAgPQorCSAgICBpbmIoc3ViZGV2aWNlLT4KKwkJcGx4X2ludGNzX3JlZykgfCAoUExYX0xPQ0FMX0lOVDFfRU4gfCBQTFhfTE9DQUxfSU5UMV9QT0wgfAorCQkJCSAgUExYX1BDSV9JTlRfRU4pOworCW91dGIodG1wLCBzdWJkZXZpY2UtPnBseF9pbnRjc19yZWcpOworCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGIoUHBseDoweCVsWCk9MHgleFxuIiwgc3ViZGV2aWNlLT5wbHhfaW50Y3NfcmVnLAorCQkgICB0bXApOworCisJLyogSW5pdGlhbGl6ZSB0aGUgc3ViZGV2aWNlIG1ldGhvZHMgKi8KKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX2lycV9zdGFydCA9IG1lMTQwMF9leHRfaXJxX2lvX2lycV9zdGFydDsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX2lycV93YWl0ID0gbWUxNDAwX2V4dF9pcnFfaW9faXJxX3dhaXQ7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19pcnFfc3RvcCA9IG1lMTQwMF9leHRfaXJxX2lvX2lycV9zdG9wOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fcmVzZXRfc3ViZGV2aWNlID0KKwkgICAgbWUxNDAwX2V4dF9pcnFfaW9fcmVzZXRfc3ViZGV2aWNlOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfcXVlcnlfbnVtYmVyX2NoYW5uZWxzID0KKwkgICAgbWUxNDAwX2V4dF9pcnFfcXVlcnlfbnVtYmVyX2NoYW5uZWxzOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfcXVlcnlfc3ViZGV2aWNlX3R5cGUgPQorCSAgICBtZTE0MDBfZXh0X2lycV9xdWVyeV9zdWJkZXZpY2VfdHlwZTsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV9jYXBzID0KKwkgICAgbWUxNDAwX2V4dF9pcnFfcXVlcnlfc3ViZGV2aWNlX2NhcHM7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9zdWJkZXZpY2VfY2Fwc19hcmdzID0KKwkgICAgbWUxNDAwX2V4dF9pcnFfcXVlcnlfc3ViZGV2aWNlX2NhcHNfYXJnczsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2Rlc3RydWN0b3IgPSBtZTE0MDBfZXh0X2lycV9kZXN0cnVjdG9yOworCisJc3ViZGV2aWNlLT5yaXNlZCA9IDA7CisJc3ViZGV2aWNlLT5uID0gMDsKKworCXJldHVybiBzdWJkZXZpY2U7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUxNDAwX2V4dF9pcnEuaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTE0MDBfZXh0X2lycS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliNzJhMDQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUxNDAwX2V4dF9pcnEuaApAQCAtMCwwICsxLDYyIEBACisvKioKKyAqIEBmaWxlIG1lMTQwMF9leHRfaXJxLmgKKyAqCisgKiBAYnJpZWYgTUUtMTQwMCBleHRlcm5hbCBpbnRlcnJ1cHQgaW1wbGVtZW50YXRpb24uCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDYgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKi8KKworI2lmbmRlZiBfTUUxNDAwX0VYVF9JUlFfSF8KKyNkZWZpbmUgX01FMTQwMF9FWFRfSVJRX0hfCisKKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorCisjaW5jbHVkZSAibWVzdWJkZXZpY2UuaCIKKyNpbmNsdWRlICJtZXNsb2NrLmgiCisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKy8qKgorICogQGJyaWVmIFRoZSBNRS0xNDAwIGV4dGVybmFsIGludGVycnVwdCBzdWJkZXZpY2UgY2xhc3MuCisgKi8KK3R5cGVkZWYgc3RydWN0IG1lMTQwMF9leHRfaXJxX3N1YmRldmljZSB7CisJLyogSW5oZXJpdGFuY2UgKi8KKwltZV9zdWJkZXZpY2VfdCBiYXNlOwkJCS8qKjwgVGhlIHN1YmRldmljZSBiYXNlIGNsYXNzLiAqLworCisJLyogQXR0cmlidXRlcyAqLworCXNwaW5sb2NrX3Qgc3ViZGV2aWNlX2xvY2s7CQkvKio8IFNwaW4gbG9jayB0byBwcm90ZWN0IHRoZSBzdWJkZXZpY2UgZnJvbSBjb25jdXJyZW50IGFjY2Vzcy4gKi8KKwlzcGlubG9ja190ICpjbGtfc3JjX3JlZ19sb2NrOwkvKio8IExvY2sgcHJvdGVjdGluZyB0aGUgY2xvY2sgY29udHJvbCByZWdpc3Rlci4gKi8KKworCXdhaXRfcXVldWVfaGVhZF90IHdhaXRfcXVldWU7CS8qKjwgUXVldWUgdG8gcHV0IG9uIHRocmVhZHMgd2FpdGluZyBmb3IgYW4gaW50ZXJydXB0LiAqLworCisJdWludDMyX3QgZGV2aWNlX2lkOwkJCQkvKio8IFRoZSBkZXZpY2UgaWQgb2YgdGhlIGRldmljZSBob2xkaW5nIHRoZSBzdWJkZXZpY2UuICovCisJaW50IGlycTsJCQkJCQkvKio8IFRoZSBpcnEgbnVtYmVyIGFzc2lnbmVkIGJ5IFBDSSBCSU9TLiAqLworCWludCByaXNlZDsJCQkJCQkvKio8IElmIHRydWUgYW4gaW50ZXJydXB0IGhhcyBvY2N1cmVkLiAqLworCXVuc2lnbmVkIGludCBuOwkJCQkJLyoqPCBUaGUgbnVtYmVyIG9mIGludGVycnVwdCBzaW5jZSB0aGUgZHJpdmVyIHdhcyBsb2FkZWQuICovCisKKwl1bnNpZ25lZCBsb25nIHBseF9pbnRjc19yZWc7CS8qKjwgVGhlIFBMWCBpbnRlcnJ1cHQgY29udHJvbCBhbmQgc3RhdHVzIHJlZ2lzdGVyLiAqLworCXVuc2lnbmVkIGxvbmcgY3RybF9yZWc7CQkJLyoqPCBUaGUgY29udHJvbCByZWdpc3Rlci4gKi8KKyNpZmRlZiBNRURFQlVHX0RFQlVHX1JFRworCXVuc2lnbmVkIGxvbmcgcmVnX2Jhc2U7CisjZW5kaWYKK30gbWUxNDAwX2V4dF9pcnFfc3ViZGV2aWNlX3Q7CisKKy8qKgorICogQGJyaWVmIFRoZSBjb25zdHJ1Y3RvciB0byBnZW5lcmF0ZSBhIE1FLTE0MDAgZXh0ZXJuYWwgaW50ZXJydXB0IGluc3RhbmNlLgorICoKKyAqIEBwYXJhbSBwbHhfcmVnX2Jhc2UgVGhlIHJlZ2lzdGVyIGJhc2UgYWRkcmVzcyBvZiB0aGUgUExYIGNoaXAgYXMgcmV0dXJuZWQgYnkgdGhlIFBDSSBCSU9TLgorICogQHBhcmFtIG1lMTQwMF9yZWdfYmFzZSBUaGUgcmVnaXN0ZXIgYmFzZSBhZGRyZXNzIG9mIHRoZSBNRS0xNDAwIGRldmljZSBhcyByZXR1cm5lZCBieSB0aGUgUENJIEJJT1MuCisgKiBAcGFyYW0gaXJxIFRoZSBpcnEgYXNzaWduZWQgYnkgdGhlIFBDSSBCSU9TLgorICoKKyAqIEByZXR1cm4gUG9pbnRlciB0byBuZXcgaW5zdGFuY2Ugb24gc3VjY2Vzcy5cbgorICogTlVMTCBvbiBlcnJvci4KKyAqLworbWUxNDAwX2V4dF9pcnFfc3ViZGV2aWNlX3QgKm1lMTQwMF9leHRfaXJxX2NvbnN0cnVjdG9yKHVpbnQzMl90IGRldmljZV9pZCwKKwkJCQkJCSAgICAgICB1aW50MzJfdCBwbHhfcmVnX2Jhc2UsCisJCQkJCQkgICAgICAgdWludDMyX3QgbWUxNDAwX3JlZ19iYXNlLAorCQkJCQkJICAgICAgIHNwaW5sb2NrX3QgKgorCQkJCQkJICAgICAgIGNsa19zcmNfcmVnX2xvY2ssCisJCQkJCQkgICAgICAgaW50IGlycSk7CisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUxNDAwX2V4dF9pcnFfcmVnLmggYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUxNDAwX2V4dF9pcnFfcmVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzk3NDBmMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTE0MDBfZXh0X2lycV9yZWcuaApAQCAtMCwwICsxLDU2IEBACisvKioKKyAqIEBmaWxlIG1lMTQwMF9leHRfaXJxX3JlZy5oCisgKgorICogQGJyaWVmIE1FLTE0MDAgZXh0ZXJuYWwgaW50ZXJydXB0IHJlZ2lzdGVyIGRlZmluaXRpb25zLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICogQGF1dGhvciBLcnp5c3p0b2YgR2FudHprZQkoay5nYW50emtlQG1laWxoYXVzLmRlKQorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX01FMTQwMF9FWFRfSVJRX1JFR19IXworIyBkZWZpbmUgX01FMTQwMF9FWFRfSVJRX1JFR19IXworCisjIGlmZGVmIF9fS0VSTkVMX18KKworIyAgZGVmaW5lIFBMWF9JTlRDU1JfUkVHCQkJCTB4NEMJLyoqPCBUaGUgUExYIGludGVycnVwdCBjb250cm9sIGFuZCBzdGF0dXMgcmVnaXN0ZXIgb2Zmc2V0LiAqLworIyAgZGVmaW5lIFBMWF9JQ1JfUkVHCQkJCQkweDUwCS8qKjwgVGhlIFBMWCBpbml0aWFsaXphdGlvbiBjb250cm9sIHJlZ2lzdGVyIG9mZnNldC4gKi8KKworIyAgZGVmaW5lIFBMWF9MT0NBTF9JTlQxX0VOCQkJCTB4MDEJLyoqPCBJZiBzZXQgdGhlIGxvY2FsIGludGVycnVwdCAxIGlzIGVuYWJsZWQuICovCisjICBkZWZpbmUgUExYX0xPQ0FMX0lOVDFfUE9MCQkJMHgwMgkvKio8IElmIHNldCB0aGUgbG9jYWwgaW50ZXJydXB0IDEgcG9sYXJpdHkgaXMgaGlnaCBhY3RpdmUuICovCisjICBkZWZpbmUgUExYX0xPQ0FMX0lOVDFfU1RBVEUJCQkweDA0CS8qKjwgSWYgc2V0IHRoZSBsb2NhbCBpbnRlcnJ1cHQgMSBpcyBhY3Rpdi4gKi8KKyMgIGRlZmluZSBQTFhfTE9DQUxfSU5UMl9FTgkJCQkweDA4CS8qKjwgSWYgc2V0IHRoZSBsb2NhbCBpbnRlcnJ1cHQgMiBpcyBlbmFibGVkLiAqLworIyAgZGVmaW5lIFBMWF9MT0NBTF9JTlQyX1BPTAkJCTB4MTAJLyoqPCBJZiBzZXQgdGhlIGxvY2FsIGludGVycnVwdCAyIHBvbGFyaXR5IGlzIGhpZ2ggYWN0aXZlLiAqLworIyAgZGVmaW5lIFBMWF9MT0NBTF9JTlQyX1NUQVRFCQkJMHgyMAkvKio8IElmIHNldCB0aGUgbG9jYWwgaW50ZXJydXB0IDIgaXMgYWN0aXYuICovCisjICBkZWZpbmUgUExYX1BDSV9JTlRfRU4JCQkJMHg0MAkvKio8IElmIHNldCB0aGUgUENJIGludGVycnVwdCBpcyBlbmFibGVkLiAqLworIyAgZGVmaW5lIFBMWF9TT0ZUX0lOVAkJCQkJMHg4MAkvKio8IElmIHNldCBhbiBpbnRlcnJ1cHQgaXMgZ2VuZXJhdGVkLiAqLworCisjICBkZWZpbmUgTUUxNDAwQUJfRVhUX0lSUV9DVFJMX1JFRwkJMHgxMQkvKio8IFRoZSBleHRlcm5hbCBpbnRlcnJ1cHQgY29udHJvbCByZWdpc3RlciBvZmZzZXQuICovCisKKyMgIGRlZmluZSBNRTE0MDBBQl9FWFRfSVJRX0NMS19FTgkJMHgwMQkvKio8IElmIHRoaXMgYml0IGlzIHNldCwgdGhlIGNsb2NrIG91dHB1dCBpcyBlbmFibGVkLiAqLworIyAgZGVmaW5lIE1FMTQwMEFCX0VYVF9JUlFfSVJRX0VOCQkweDAyCS8qKjwgSWYgc2V0IHRoZSBleHRlcm5hbCBpbnRlcnJ1cHQgaXMgZW5hYmxlZC4gQ2xlYXJpbmcgdGhpcyBiaXQgY2xlYXJzIGEgcGVuZGluZyBpbnRlcnJ1cHQuICovCisKKyMgIGRlZmluZSBNRTE0MDBDRF9FWFRfSVJRX0NUUkxfUkVHCQkweDExCS8qKjwgVGhlIGV4dGVybmFsIGludGVycnVwdCBjb250cm9sIHJlZ2lzdGVyIG9mZnNldC4gKi8KKworIyAgZGVmaW5lIE1FMTQwMENEX0VYVF9JUlFfQ0xLX0VOCQkweDEwCS8qKjwgSWYgc2V0IHRoZSBleHRlcm5hbCBpbnRlcnJ1cHQgaXMgZW5hYmxlZC4gQ2xlYXJpbmcgdGhpcyBiaXQgY2xlYXJzIGEgcGVuZGluZyBpbnRlcnJ1cHQuKi8KKworIyBlbmRpZgkvL19fS0VSTkVMX18KKworI2VuZGlmIC8vX01FMTQwMF9FWFRfSVJRX1JFR19IXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMTYwMF9hby5jIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMTYwMF9hby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxMjdjNmIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUxNjAwX2FvLmMKQEAgLTAsMCArMSwxMDMzIEBACisvKioKKyAqIEBmaWxlIG1lMTYwMF9hby5jCisgKgorICogQGJyaWVmIE1FLTE2MDAgYW5hbG9nIG91dHB1dCBzdWJkZXZpY2UgaW5zdGFuY2UuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKiBAYXV0aG9yIEtyenlzenRvZiBHYW50emtlCShrLmdhbnR6a2VAbWVpbGhhdXMuZGUpCisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0tFUk5FTF9fCisjICBkZWZpbmUgX19LRVJORUxfXworI2VuZGlmCisKKy8qIEluY2x1ZGVzCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorCisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisKKyNpbmNsdWRlICJtZWRlZmluZXMuaCIKKyNpbmNsdWRlICJtZWludGVybmFsLmgiCisjaW5jbHVkZSAibWVlcnJvci5oIgorI2luY2x1ZGUgIm1lZGVidWcuaCIKKworI2luY2x1ZGUgIm1lMTYwMF9hb19yZWcuaCIKKyNpbmNsdWRlICJtZTE2MDBfYW8uaCIKKworLyogRGVmaW5lcworICovCisKK3N0YXRpYyB2b2lkIG1lMTYwMF9hb19kZXN0cnVjdG9yKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSk7CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMjApCitzdGF0aWMgdm9pZCBtZTE2MDBfYW9fd29ya19jb250cm9sX3Rhc2sodm9pZCAqc3ViZGV2aWNlKTsKKyNlbHNlCitzdGF0aWMgdm9pZCBtZTE2MDBfYW9fd29ya19jb250cm9sX3Rhc2soc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKKyNlbmRpZgorCitzdGF0aWMgaW50IG1lMTYwMF9hb19pb19yZXNldF9zdWJkZXZpY2UobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJCXN0cnVjdCBmaWxlICpmaWxlcCwgaW50IGZsYWdzKTsKK3N0YXRpYyBpbnQgbWUxNjAwX2FvX2lvX3NpbmdsZV9jb25maWcobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgICAgc3RydWN0IGZpbGUgKmZpbGVwLCBpbnQgY2hhbm5lbCwKKwkJCQkgICAgICBpbnQgc2luZ2xlX2NvbmZpZywgaW50IHJlZiwgaW50IHRyaWdfY2hhbiwKKwkJCQkgICAgICBpbnQgdHJpZ190eXBlLCBpbnQgdHJpZ19lZGdlLCBpbnQgZmxhZ3MpOworc3RhdGljIGludCBtZTE2MDBfYW9faW9fc2luZ2xlX3JlYWQobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgIHN0cnVjdCBmaWxlICpmaWxlcCwgaW50IGNoYW5uZWwsIGludCAqdmFsdWUsCisJCQkJICAgIGludCB0aW1lX291dCwgaW50IGZsYWdzKTsKK3N0YXRpYyBpbnQgbWUxNjAwX2FvX2lvX3NpbmdsZV93cml0ZShtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwgaW50IGNoYW5uZWwsIGludCB2YWx1ZSwKKwkJCQkgICAgIGludCB0aW1lX291dCwgaW50IGZsYWdzKTsKK3N0YXRpYyBpbnQgbWUxNjAwX2FvX3F1ZXJ5X251bWJlcl9jaGFubmVscyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJICAgaW50ICpudW1iZXIpOworc3RhdGljIGludCBtZTE2MDBfYW9fcXVlcnlfc3ViZGV2aWNlX3R5cGUobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsIGludCAqdHlwZSwKKwkJCQkJICBpbnQgKnN1YnR5cGUpOworc3RhdGljIGludCBtZTE2MDBfYW9fcXVlcnlfc3ViZGV2aWNlX2NhcHMobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJCSAgaW50ICpjYXBzKTsKK3N0YXRpYyBpbnQgbWUxNjAwX2FvX3F1ZXJ5X3JhbmdlX2J5X21pbl9tYXgobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJCSAgICBpbnQgdW5pdCwgaW50ICptaW4sIGludCAqbWF4LAorCQkJCQkgICAgaW50ICptYXhkYXRhLCBpbnQgKnJhbmdlKTsKK3N0YXRpYyBpbnQgbWUxNjAwX2FvX3F1ZXJ5X251bWJlcl9yYW5nZXMobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsIGludCB1bml0LAorCQkJCQkgaW50ICpjb3VudCk7CitzdGF0aWMgaW50IG1lMTYwMF9hb19xdWVyeV9yYW5nZV9pbmZvKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLCBpbnQgcmFuZ2UsCisJCQkJICAgICAgaW50ICp1bml0LCBpbnQgKm1pbiwgaW50ICptYXgsCisJCQkJICAgICAgaW50ICptYXhkYXRhKTsKKworLyogRnVuY3Rpb25zCisgKi8KKworbWUxNjAwX2FvX3N1YmRldmljZV90ICptZTE2MDBfYW9fY29uc3RydWN0b3IodWludDMyX3QgcmVnX2Jhc2UsCisJCQkJCSAgICAgdW5zaWduZWQgaW50IGFvX2lkeCwKKwkJCQkJICAgICBpbnQgY3VyciwKKwkJCQkJICAgICBzcGlubG9ja190ICogY29uZmlnX3JlZ3NfbG9jaywKKwkJCQkJICAgICBzcGlubG9ja190ICogYW9fc2hhZG93c19sb2NrLAorCQkJCQkgICAgIG1lMTYwMF9hb19zaGFkb3dfdCAqCisJCQkJCSAgICAgYW9fcmVnc19zaGFkb3dzLAorCQkJCQkgICAgIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICptZTE2MDBfd3EpCit7CisJbWUxNjAwX2FvX3N1YmRldmljZV90ICpzdWJkZXZpY2U7CisJaW50IGVycjsKKworCVBERUJVRygiZXhlY3V0ZWQuIGlkeD0lZFxuIiwgYW9faWR4KTsKKworCS8vIEFsbG9jYXRlIG1lbW9yeSBmb3Igc3ViZGV2aWNlIGluc3RhbmNlLgorCXN1YmRldmljZSA9IGttYWxsb2Moc2l6ZW9mKG1lMTYwMF9hb19zdWJkZXZpY2VfdCksIEdGUF9LRVJORUwpOworCisJaWYgKCFzdWJkZXZpY2UpIHsKKwkJUEVSUk9SCisJCSAgICAoIkNhbm5vdCBnZXQgbWVtb3J5IGZvciBhbmFsb2cgb3V0cHV0IHN1YmRldmljZSBpbnN0YW5jZS5cbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwltZW1zZXQoc3ViZGV2aWNlLCAwLCBzaXplb2YobWUxNjAwX2FvX3N1YmRldmljZV90KSk7CisKKwkvLyBJbml0aWFsaXplIHN1YmRldmljZSBiYXNlIGNsYXNzLgorCWVyciA9IG1lX3N1YmRldmljZV9pbml0KCZzdWJkZXZpY2UtPmJhc2UpOworCisJaWYgKGVycikgeworCQlQRVJST1IoIkNhbm5vdCBpbml0aWFsaXplIHN1YmRldmljZSBiYXNlIGNsYXNzIGluc3RhbmNlLlxuIik7CisJCWtmcmVlKHN1YmRldmljZSk7CisJCXJldHVybiBOVUxMOworCX0KKwkvLyBJbml0aWFsaXplIHNwaW4gbG9ja3MuCisJc3Bpbl9sb2NrX2luaXQoJnN1YmRldmljZS0+c3ViZGV2aWNlX2xvY2spOworCXN1YmRldmljZS0+Y29uZmlnX3JlZ3NfbG9jayA9IGNvbmZpZ19yZWdzX2xvY2s7CisJc3ViZGV2aWNlLT5hb19zaGFkb3dzX2xvY2sgPSBhb19zaGFkb3dzX2xvY2s7CisKKwkvLyBTYXZlIHRoZSBzdWJkZXZpY2UgaW5kZXguCisJc3ViZGV2aWNlLT5hb19pZHggPSBhb19pZHg7CisKKwkvLyBJbml0aWFsaXplIHJhbmdlIGxpc3RzLgorCXN1YmRldmljZS0+dV9yYW5nZXNfY291bnQgPSAyOworCisJc3ViZGV2aWNlLT51X3Jhbmdlc1swXS5taW4gPSAwOwkvLzBWCisJc3ViZGV2aWNlLT51X3Jhbmdlc1swXS5tYXggPSA5OTk3NTU4OwkvLzEwVgorCisJc3ViZGV2aWNlLT51X3Jhbmdlc1sxXS5taW4gPSAtMTBFNjsJLy8tMTBWCisJc3ViZGV2aWNlLT51X3Jhbmdlc1sxXS5tYXggPSA5OTk1MTE3OwkvLzEwVgorCisJaWYgKGN1cnIpIHsJCS8vIFRoaXMgaXMgdmVyc2lvbiB3aXRoIGN1cnJlbnQgb3V0cHV0cy4KKwkJc3ViZGV2aWNlLT5pX3Jhbmdlc19jb3VudCA9IDI7CisKKwkJc3ViZGV2aWNlLT5pX3Jhbmdlc1swXS5taW4gPSAwOwkvLzBtQQorCQlzdWJkZXZpY2UtPmlfcmFuZ2VzWzBdLm1heCA9IDE5OTk1MTE3OwkvLzIwbUEKKworCQlzdWJkZXZpY2UtPmlfcmFuZ2VzWzFdLm1pbiA9IDRFMzsJLy80bUEKKwkJc3ViZGV2aWNlLT5pX3Jhbmdlc1sxXS5tYXggPSAxOTk5NTExODsJLy8yMG1BCisJfSBlbHNlIHsJCS8vIFRoaXMgaXMgdmVyc2lvbiB3aXRob3V0IGN1cnJlbnQgb3V0cHV0cy4KKwkJc3ViZGV2aWNlLT5pX3Jhbmdlc19jb3VudCA9IDA7CisKKwkJc3ViZGV2aWNlLT5pX3Jhbmdlc1swXS5taW4gPSAwOwkvLzBtQQorCQlzdWJkZXZpY2UtPmlfcmFuZ2VzWzBdLm1heCA9IDA7CS8vMG1BCisKKwkJc3ViZGV2aWNlLT5pX3Jhbmdlc1sxXS5taW4gPSAwOwkvLzBtQQorCQlzdWJkZXZpY2UtPmlfcmFuZ2VzWzFdLm1heCA9IDA7CS8vMG1BCisJfQorCisJLy8gSW5pdGlhbGl6ZSByZWdpc3RlcnMuCisJc3ViZGV2aWNlLT51bmlfYmlfcmVnID0gcmVnX2Jhc2UgKyBNRTE2MDBfVU5JX0JJX1JFRzsKKwlzdWJkZXZpY2UtPmlfcmFuZ2VfcmVnID0gcmVnX2Jhc2UgKyBNRTE2MDBfMDIwXzQyMF9SRUc7CisJc3ViZGV2aWNlLT5zaW1fb3V0cHV0X3JlZyA9IHJlZ19iYXNlICsgTUUxNjAwX1NJTV9PVVRQVVRfUkVHOworCXN1YmRldmljZS0+Y3VycmVudF9vbl9yZWcgPSByZWdfYmFzZSArIE1FMTYwMF9DVVJSRU5UX09OX1JFRzsKKyNpZmRlZiBNRURFQlVHX0RFQlVHX1JFRworCXN1YmRldmljZS0+cmVnX2Jhc2UgPSByZWdfYmFzZTsKKyNlbmRpZgorCisJLy8gSW5pdGlhbGl6ZSBzaGFkb3cgc3RydWN0dXJlLgorCXN1YmRldmljZS0+YW9fcmVnc19zaGFkb3dzID0gYW9fcmVnc19zaGFkb3dzOworCisJLy8gT3ZlcnJpZGUgYmFzZSBjbGFzcyBtZXRob2RzLgorCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfZGVzdHJ1Y3RvciA9IG1lMTYwMF9hb19kZXN0cnVjdG9yOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fcmVzZXRfc3ViZGV2aWNlID0KKwkgICAgbWUxNjAwX2FvX2lvX3Jlc2V0X3N1YmRldmljZTsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3NpbmdsZV9jb25maWcgPQorCSAgICBtZTE2MDBfYW9faW9fc2luZ2xlX2NvbmZpZzsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3NpbmdsZV9yZWFkID0gbWUxNjAwX2FvX2lvX3NpbmdsZV9yZWFkOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fc2luZ2xlX3dyaXRlID0KKwkgICAgbWUxNjAwX2FvX2lvX3NpbmdsZV93cml0ZTsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X251bWJlcl9jaGFubmVscyA9CisJICAgIG1lMTYwMF9hb19xdWVyeV9udW1iZXJfY2hhbm5lbHM7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9zdWJkZXZpY2VfdHlwZSA9CisJICAgIG1lMTYwMF9hb19xdWVyeV9zdWJkZXZpY2VfdHlwZTsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV9jYXBzID0KKwkgICAgbWUxNjAwX2FvX3F1ZXJ5X3N1YmRldmljZV9jYXBzOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfcXVlcnlfcmFuZ2VfYnlfbWluX21heCA9CisJICAgIG1lMTYwMF9hb19xdWVyeV9yYW5nZV9ieV9taW5fbWF4OworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfcXVlcnlfbnVtYmVyX3JhbmdlcyA9CisJICAgIG1lMTYwMF9hb19xdWVyeV9udW1iZXJfcmFuZ2VzOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfcXVlcnlfcmFuZ2VfaW5mbyA9CisJICAgIG1lMTYwMF9hb19xdWVyeV9yYW5nZV9pbmZvOworCisJLy8gSW5pdGlhbGl6ZSB3YWl0IHF1ZXVlLgorCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnN1YmRldmljZS0+d2FpdF9xdWV1ZSk7CisKKwkvLyBQcmVwYXJlIHdvcmsgcXVldWUuCisJc3ViZGV2aWNlLT5tZTE2MDBfd29ya3F1ZXVlID0gbWUxNjAwX3dxOworCisvKiB3b3JrcXVldWUgQVBJIGNoYW5nZWQgaW4ga2VybmVsIDIuNi4yMCAqLworI2lmICggTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDIwKSApCisJSU5JVF9XT1JLKCZzdWJkZXZpY2UtPmFvX2NvbnRyb2xfdGFzaywgbWUxNjAwX2FvX3dvcmtfY29udHJvbF90YXNrLAorCQkgICh2b2lkICopc3ViZGV2aWNlKTsKKyNlbHNlCisJSU5JVF9ERUxBWUVEX1dPUksoJnN1YmRldmljZS0+YW9fY29udHJvbF90YXNrLAorCQkJICBtZTE2MDBfYW9fd29ya19jb250cm9sX3Rhc2spOworI2VuZGlmCisJcmV0dXJuIHN1YmRldmljZTsKK30KKworc3RhdGljIHZvaWQgbWUxNjAwX2FvX2Rlc3RydWN0b3Ioc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlKQoreworCW1lMTYwMF9hb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisKKwlpbnN0YW5jZSA9IChtZTE2MDBfYW9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJUERFQlVHKCJleGVjdXRlZC4gaWR4PSVkXG4iLCBpbnN0YW5jZS0+YW9faWR4KTsKKworCWluc3RhbmNlLT5hb19jb250cm9sX3Rhc2tfZmxhZyA9IDA7CisKKwkvLyBSZXNldCBzdWJkZXZpY2UgdG8gYXN1cmUgY2xlYW4gZXhpdC4KKwltZTE2MDBfYW9faW9fcmVzZXRfc3ViZGV2aWNlKHN1YmRldmljZSwgTlVMTCwKKwkJCQkgICAgIE1FX0lPX1JFU0VUX1NVQkRFVklDRV9OT19GTEFHUyk7CisKKwkvLyBSZW1vdmUgYW55IHRhc2tzIGZyb20gd29yayBxdWV1ZS4gVGhpcyBpcyBwYXJhbm9pYyBiZWNhdXNlIGl0IHdhcyBkb25lIGFsbHJlYWR5IGluIHJlc2V0KCkuCisJaWYgKCFjYW5jZWxfZGVsYXllZF93b3JrKCZpbnN0YW5jZS0+YW9fY29udHJvbF90YXNrKSkgewkvL1dhaXQgMiB0aWNrcyB0byBiZSBzdXJlIHRoYXQgY29udHJvbCB0YXNrIGlzIHJlbW92ZWQgZnJvbSBxdWV1ZS4KKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJc2NoZWR1bGVfdGltZW91dCgyKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgbWUxNjAwX2FvX2lvX3Jlc2V0X3N1YmRldmljZShtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJc3RydWN0IGZpbGUgKmZpbGVwLCBpbnQgZmxhZ3MpCit7CisJbWUxNjAwX2FvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwl1aW50MTZfdCB0bXA7CisKKwlpbnN0YW5jZSA9IChtZTE2MDBfYW9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJUERFQlVHKCJleGVjdXRlZC4gaWR4PSVkXG4iLCBpbnN0YW5jZS0+YW9faWR4KTsKKworCWlmIChmbGFncykgeworCQlQRVJST1IoIkludmFsaWQgZmxhZyBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJfQorCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJLy9DYW5jZWwgY29udHJvbCB0YXNrCisJUERFQlVHKCJDYW5jZWwgY29udHJvbCB0YXNrLiBpZHg9JWRcbiIsIGluc3RhbmNlLT5hb19pZHgpOworCWluc3RhbmNlLT5hb19jb250cm9sX3Rhc2tfZmxhZyA9IDA7CisJY2FuY2VsX2RlbGF5ZWRfd29yaygmaW5zdGFuY2UtPmFvX2NvbnRyb2xfdGFzayk7CisJKGluc3RhbmNlLT5hb19yZWdzX3NoYWRvd3MpLT50cmlnZ2VyICY9IH4oMHgxIDw8IGluc3RhbmNlLT5hb19pZHgpOwkvL0NhbmNlbGwgd2FpdGluZyBmb3IgdHJpZ2dlci4KKworCS8vIFJlc2V0IGFsbCBzZXR0aW5ncy4KKwlzcGluX2xvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisJc3Bpbl9sb2NrKGluc3RhbmNlLT5hb19zaGFkb3dzX2xvY2spOworCShpbnN0YW5jZS0+YW9fcmVnc19zaGFkb3dzKS0+c2hhZG93W2luc3RhbmNlLT5hb19pZHhdID0gMDsKKwkoaW5zdGFuY2UtPmFvX3JlZ3Nfc2hhZG93cyktPm1pcnJvcltpbnN0YW5jZS0+YW9faWR4XSA9IDA7CisJKGluc3RhbmNlLT5hb19yZWdzX3NoYWRvd3MpLT50cmlnZ2VyICY9IH4oMHgxIDw8IGluc3RhbmNlLT5hb19pZHgpOwkvL05vdCB3YWl0aW5nIGZvciB0cmlnZ2VyaW5nLgorCShpbnN0YW5jZS0+YW9fcmVnc19zaGFkb3dzKS0+c3luY2hyb25vdXMgJj0gfigweDEgPDwgaW5zdGFuY2UtPmFvX2lkeCk7CS8vSW5kaXZpZHVhbCB0cmlnZ2VyaW5nLgorCisJLy8gU2V0IG91dHB1dCB0byBkZWZhdWx0IChzYWZlKSBzdGF0ZS4KKwlzcGluX2xvY2soaW5zdGFuY2UtPmNvbmZpZ19yZWdzX2xvY2spOworCXRtcCA9IGludyhpbnN0YW5jZS0+dW5pX2JpX3JlZyk7CS8vIHVuaXBvbGFyCisJdG1wIHw9ICgweDEgPDwgaW5zdGFuY2UtPmFvX2lkeCk7CisJb3V0dyh0bXAsIGluc3RhbmNlLT51bmlfYmlfcmVnKTsKKwlQREVCVUdfUkVHKCJ1bmlfYmlfcmVnIG91dHcoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPnVuaV9iaV9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIHRtcCk7CisKKwl0bXAgPSBpbncoaW5zdGFuY2UtPmN1cnJlbnRfb25fcmVnKTsJLy8gVm9sdHMgb25seSEKKwl0bXAgJj0gfigweDEgPDwgaW5zdGFuY2UtPmFvX2lkeCk7CisJdG1wICY9IDB4MDBGRjsKKwlvdXR3KHRtcCwgaW5zdGFuY2UtPmN1cnJlbnRfb25fcmVnKTsKKwlQREVCVUdfUkVHKCJjdXJyZW50X29uX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5jdXJyZW50X29uX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgdG1wKTsKKworCXRtcCA9IGludyhpbnN0YW5jZS0+aV9yYW5nZV9yZWcpOwkvLyAwLi4yMG1BIDw9IElmIGV4aXN0cy4KKwl0bXAgJj0gfigweDEgPDwgaW5zdGFuY2UtPmFvX2lkeCk7CisJb3V0dyh0bXAsIGluc3RhbmNlLT5pX3JhbmdlX3JlZyk7CisJUERFQlVHX1JFRygiaV9yYW5nZV9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+aV9yYW5nZV9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIHRtcCk7CisKKwlvdXR3KDAsIChpbnN0YW5jZS0+YW9fcmVnc19zaGFkb3dzKS0+cmVnaXN0cnlbaW5zdGFuY2UtPmFvX2lkeF0pOworCVBERUJVR19SRUcoImNoYW5uZWxfcmVnIG91dHcoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgKGluc3RhbmNlLT5hb19yZWdzX3NoYWRvd3MpLT5yZWdpc3RyeVtpbnN0YW5jZS0+YW9faWR4XSAtCisJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwgMCk7CisKKwkvLyBUcmlnZ2VyIG91dHB1dC4KKwlvdXR3KDB4MDAwMCwgaW5zdGFuY2UtPnNpbV9vdXRwdXRfcmVnKTsKKwlQREVCVUdfUkVHKCJzaW1fb3V0cHV0X3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5zaW1fb3V0cHV0X3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgMHgwMDAwKTsKKwlvdXR3KDB4RkZGRiwgaW5zdGFuY2UtPnNpbV9vdXRwdXRfcmVnKTsKKwlQREVCVUdfUkVHKCJzaW1fb3V0cHV0X3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5zaW1fb3V0cHV0X3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgMHhGRkZGKTsKKwlzcGluX3VubG9jayhpbnN0YW5jZS0+Y29uZmlnX3JlZ3NfbG9jayk7CisJc3Bpbl91bmxvY2soaW5zdGFuY2UtPmFvX3NoYWRvd3NfbG9jayk7CisKKwkvLyBTZXQgc3RhdHVzIHRvICdub25lJworCWluc3RhbmNlLT5zdGF0dXMgPSBhb19zdGF0dXNfbm9uZTsKKwlzcGluX3VubG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKworCS8vU2lnbmFsIHJlc2V0IGlmIHVzZXIgaXMgb24gd2FpdC4KKwl3YWtlX3VwX2ludGVycnVwdGlibGVfYWxsKCZpbnN0YW5jZS0+d2FpdF9xdWV1ZSk7CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lMTYwMF9hb19pb19zaW5nbGVfY29uZmlnKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgICBpbnQgY2hhbm5lbCwKKwkJCQkgICAgICBpbnQgc2luZ2xlX2NvbmZpZywKKwkJCQkgICAgICBpbnQgcmVmLAorCQkJCSAgICAgIGludCB0cmlnX2NoYW4sCisJCQkJICAgICAgaW50IHRyaWdfdHlwZSwgaW50IHRyaWdfZWRnZSwgaW50IGZsYWdzKQoreworCW1lMTYwMF9hb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJdWludDE2X3QgdG1wOworCisJaW5zdGFuY2UgPSAobWUxNjAwX2FvX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCVBERUJVRygiZXhlY3V0ZWQuIGlkeD0lZFxuIiwgaW5zdGFuY2UtPmFvX2lkeCk7CisKKwkvLyBDaGVja2luZyBwYXJhbWV0ZXJzLgorCWlmIChmbGFncykgeworCQlQRVJST1IKKwkJICAgICgiSW52YWxpZCBmbGFnIHNwZWNpZmllZC4gTXVzdCBiZSBNRV9JT19TSU5HTEVfQ09ORklHX05PX0ZMQUdTLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCWlmICh0cmlnX2VkZ2UgIT0gTUVfVFJJR19FREdFX05PTkUpIHsKKwkJUEVSUk9SCisJCSAgICAoIkludmFsaWQgdHJpZ2dlciBlZGdlLiBTb2Z0d2FyZSB0cmlnZ2VyIGhhcyBub3QgZWRnZS4gTXVzdCBiZSBNRV9UUklHX0VER0VfTk9ORVxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1RSSUdfRURHRTsKKwl9CisKKwlpZiAodHJpZ190eXBlICE9IE1FX1RSSUdfVFlQRV9TVykgeworCQlQRVJST1IoIkludmFsaWQgdHJpZ2dlciBlZGdlLiBNdXN0IGJlIE1FX1RSSUdfVFlQRV9TVy5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9UUklHX1RZUEU7CisJfQorCisJaWYgKCh0cmlnX2NoYW4gIT0gTUVfVFJJR19DSEFOX0RFRkFVTFQpCisJICAgICYmICh0cmlnX2NoYW4gIT0gTUVfVFJJR19DSEFOX1NZTkNIUk9OT1VTKSkgeworCQlQRVJST1IoIkludmFsaWQgdHJpZ2dlciBjaGFubmVsIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9UUklHX0NIQU47CisJfQorCisJaWYgKHJlZiAhPSBNRV9SRUZfQU9fR1JPVU5EKSB7CisJCVBFUlJPUgorCQkgICAgKCJJbnZhbGlkIHJlZmVyZW5jZS4gQW5hbG9nIG91dHB1dHMgaGF2ZSB0byBoYXZlIGdvdCBSRUZfQU9fR1JPVU5ELlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1JFRjsKKwl9CisKKwlpZiAoKChzaW5nbGVfY29uZmlnICsgMSkgPgorCSAgICAgKGluc3RhbmNlLT51X3Jhbmdlc19jb3VudCArIGluc3RhbmNlLT5pX3Jhbmdlc19jb3VudCkpCisJICAgIHx8IChzaW5nbGVfY29uZmlnIDwgMCkpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIHJhbmdlIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9TSU5HTEVfQ09ORklHOworCX0KKworCWlmIChjaGFubmVsKSB7CisJCVBFUlJPUigiSW52YWxpZCBjaGFubmVsIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCX0KKwkvLyBDaGVja2luZyBwYXJhbWV0ZXJzIC0gZG9uZS4gQWxsIGlzIGZpbmUuIERvIGNvbmZpZy4KKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCS8vQ2FuY2VsIGNvbnRyb2wgdGFzaworCVBERUJVRygiQ2FuY2VsIGNvbnRyb2wgdGFzay4gaWR4PSVkXG4iLCBpbnN0YW5jZS0+YW9faWR4KTsKKwlpbnN0YW5jZS0+YW9fY29udHJvbF90YXNrX2ZsYWcgPSAwOworCWNhbmNlbF9kZWxheWVkX3dvcmsoJmluc3RhbmNlLT5hb19jb250cm9sX3Rhc2spOworCisJc3Bpbl9sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCXNwaW5fbG9jayhpbnN0YW5jZS0+YW9fc2hhZG93c19sb2NrKTsKKwkoaW5zdGFuY2UtPmFvX3JlZ3Nfc2hhZG93cyktPnRyaWdnZXIgJj0gfigweDEgPDwgaW5zdGFuY2UtPmFvX2lkeCk7CS8vQ2FuY2VsbCB3YWl0aW5nIGZvciB0cmlnZ2VyLgorCShpbnN0YW5jZS0+YW9fcmVnc19zaGFkb3dzKS0+c2hhZG93W2luc3RhbmNlLT5hb19pZHhdID0gMDsKKwkoaW5zdGFuY2UtPmFvX3JlZ3Nfc2hhZG93cyktPm1pcnJvcltpbnN0YW5jZS0+YW9faWR4XSA9IDA7CisKKwlzcGluX2xvY2soaW5zdGFuY2UtPmNvbmZpZ19yZWdzX2xvY2spOworCXN3aXRjaCAoc2luZ2xlX2NvbmZpZykgeworCWNhc2UgMDoJCS8vIDBWIDEwVgorCQl0bXAgPSBpbncoaW5zdGFuY2UtPmN1cnJlbnRfb25fcmVnKTsJLy8gVm9sdHMKKwkJdG1wICY9IH4oMHgxIDw8IGluc3RhbmNlLT5hb19pZHgpOworCQlvdXR3KHRtcCwgaW5zdGFuY2UtPmN1cnJlbnRfb25fcmVnKTsKKwkJUERFQlVHX1JFRygiY3VycmVudF9vbl9yZWcgb3V0dygweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgIGluc3RhbmNlLT5jdXJyZW50X29uX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgdG1wKTsKKworCQkvLyAwVgorCQlvdXR3KDAsCisJCSAgICAgKGluc3RhbmNlLT5hb19yZWdzX3NoYWRvd3MpLT5yZWdpc3RyeVtpbnN0YW5jZS0+YW9faWR4XSk7CisJCVBERUJVR19SRUcoImNoYW5uZWxfcmVnIG91dHcoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkgICAoaW5zdGFuY2UtPmFvX3JlZ3Nfc2hhZG93cyktPnJlZ2lzdHJ5W2luc3RhbmNlLT4KKwkJCQkJCQkJIGFvX2lkeF0gLQorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLCAwKTsKKworCQl0bXAgPSBpbncoaW5zdGFuY2UtPnVuaV9iaV9yZWcpOwkvLyB1bmlwb2xhcgorCQl0bXAgfD0gKDB4MSA8PCBpbnN0YW5jZS0+YW9faWR4KTsKKwkJb3V0dyh0bXAsIGluc3RhbmNlLT51bmlfYmlfcmVnKTsKKwkJUERFQlVHX1JFRygidW5pX2JpX3JlZyBvdXR3KDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPnVuaV9iaV9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIHRtcCk7CisKKwkJdG1wID0gaW53KGluc3RhbmNlLT5pX3JhbmdlX3JlZyk7CS8vIDAuLjIwbUEgPD0gSWYgZXhpc3RzLgorCQl0bXAgJj0gfigweDEgPDwgaW5zdGFuY2UtPmFvX2lkeCk7CisJCW91dHcodG1wLCBpbnN0YW5jZS0+aV9yYW5nZV9yZWcpOworCQlQREVCVUdfUkVHKCJpX3JhbmdlX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPmlfcmFuZ2VfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCB0bXApOworCQlicmVhazsKKworCWNhc2UgMToJCS8vIC0xMFYgMTBWCisJCXRtcCA9IGludyhpbnN0YW5jZS0+Y3VycmVudF9vbl9yZWcpOwkvLyBWb2x0cworCQl0bXAgJj0gfigweDEgPDwgaW5zdGFuY2UtPmFvX2lkeCk7CisJCW91dHcodG1wLCBpbnN0YW5jZS0+Y3VycmVudF9vbl9yZWcpOworCQlQREVCVUdfUkVHKCJjdXJyZW50X29uX3JlZyBvdXR3KDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPmN1cnJlbnRfb25fcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCB0bXApOworCisJCS8vIDBWCisJCW91dHcoMHgwODAwLAorCQkgICAgIChpbnN0YW5jZS0+YW9fcmVnc19zaGFkb3dzKS0+cmVnaXN0cnlbaW5zdGFuY2UtPmFvX2lkeF0pOworCQlQREVCVUdfUkVHKCJjaGFubmVsX3JlZyBvdXR3KDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgKGluc3RhbmNlLT5hb19yZWdzX3NoYWRvd3MpLT5yZWdpc3RyeVtpbnN0YW5jZS0+CisJCQkJCQkJCSBhb19pZHhdIC0KKwkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwgMHgwODAwKTsKKworCQl0bXAgPSBpbncoaW5zdGFuY2UtPnVuaV9iaV9yZWcpOwkvLyBiaXBvbGFyCisJCXRtcCAmPSB+KDB4MSA8PCBpbnN0YW5jZS0+YW9faWR4KTsKKwkJb3V0dyh0bXAsIGluc3RhbmNlLT51bmlfYmlfcmVnKTsKKwkJUERFQlVHX1JFRygidW5pX2JpX3JlZyBvdXR3KDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPnVuaV9iaV9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIHRtcCk7CisKKwkJdG1wID0gaW53KGluc3RhbmNlLT5pX3JhbmdlX3JlZyk7CS8vIDAuLjIwbUEgPD0gSWYgZXhpc3RzLgorCQl0bXAgJj0gfigweDEgPDwgaW5zdGFuY2UtPmFvX2lkeCk7CisJCW91dHcodG1wLCBpbnN0YW5jZS0+aV9yYW5nZV9yZWcpOworCQlQREVCVUdfUkVHKCJpX3JhbmdlX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPmlfcmFuZ2VfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCB0bXApOworCQlicmVhazsKKworCWNhc2UgMjoJCS8vIDBtQSAyMG1BCisJCXRtcCA9IGludyhpbnN0YW5jZS0+Y3VycmVudF9vbl9yZWcpOwkvLyBtQW1wZXJzCisJCXRtcCB8PSAoMHgxIDw8IGluc3RhbmNlLT5hb19pZHgpOworCQlvdXR3KHRtcCwgaW5zdGFuY2UtPmN1cnJlbnRfb25fcmVnKTsKKwkJUERFQlVHX1JFRygiY3VycmVudF9vbl9yZWcgb3V0dygweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgIGluc3RhbmNlLT5jdXJyZW50X29uX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgdG1wKTsKKworCQl0bXAgPSBpbncoaW5zdGFuY2UtPmlfcmFuZ2VfcmVnKTsJLy8gMC4uMjBtQQorCQl0bXAgJj0gfigweDEgPDwgaW5zdGFuY2UtPmFvX2lkeCk7CisJCW91dHcodG1wLCBpbnN0YW5jZS0+aV9yYW5nZV9yZWcpOworCQlQREVCVUdfUkVHKCJpX3JhbmdlX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPmlfcmFuZ2VfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCB0bXApOworCisJCS8vIDBtQQorCQlvdXR3KDAsCisJCSAgICAgKGluc3RhbmNlLT5hb19yZWdzX3NoYWRvd3MpLT5yZWdpc3RyeVtpbnN0YW5jZS0+YW9faWR4XSk7CisJCVBERUJVR19SRUcoImNoYW5uZWxfcmVnIG91dHcoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkgICAoaW5zdGFuY2UtPmFvX3JlZ3Nfc2hhZG93cyktPnJlZ2lzdHJ5W2luc3RhbmNlLT4KKwkJCQkJCQkJIGFvX2lkeF0gLQorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLCAwKTsKKworCQl0bXAgPSBpbncoaW5zdGFuY2UtPnVuaV9iaV9yZWcpOwkvLyB1bmlwb2xhcgorCQl0bXAgfD0gKDB4MSA8PCBpbnN0YW5jZS0+YW9faWR4KTsKKwkJb3V0dyh0bXAsIGluc3RhbmNlLT51bmlfYmlfcmVnKTsKKwkJUERFQlVHX1JFRygidW5pX2JpX3JlZyBvdXR3KDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPnVuaV9iaV9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIHRtcCk7CisJCWJyZWFrOworCisJY2FzZSAzOgkJLy8gNG1BIDIwbUEKKwkJdG1wID0gaW53KGluc3RhbmNlLT5jdXJyZW50X29uX3JlZyk7CS8vIG1BbXBlcnMKKwkJdG1wIHw9ICgweDEgPDwgaW5zdGFuY2UtPmFvX2lkeCk7CisJCW91dHcodG1wLCBpbnN0YW5jZS0+Y3VycmVudF9vbl9yZWcpOworCQlQREVCVUdfUkVHKCJjdXJyZW50X29uX3JlZyBvdXR3KDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPmN1cnJlbnRfb25fcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCB0bXApOworCisJCXRtcCA9IGludyhpbnN0YW5jZS0+aV9yYW5nZV9yZWcpOwkvLyA0Li4yMG1BCisJCXRtcCB8PSAoMHgxIDw8IGluc3RhbmNlLT5hb19pZHgpOworCQlvdXR3KHRtcCwgaW5zdGFuY2UtPmlfcmFuZ2VfcmVnKTsKKwkJUERFQlVHX1JFRygiaV9yYW5nZV9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgIGluc3RhbmNlLT5pX3JhbmdlX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgdG1wKTsKKworCQkvLyA0bUEKKwkJb3V0dygwLAorCQkgICAgIChpbnN0YW5jZS0+YW9fcmVnc19zaGFkb3dzKS0+cmVnaXN0cnlbaW5zdGFuY2UtPmFvX2lkeF0pOworCQlQREVCVUdfUkVHKCJjaGFubmVsX3JlZyBvdXR3KDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgKGluc3RhbmNlLT5hb19yZWdzX3NoYWRvd3MpLT5yZWdpc3RyeVtpbnN0YW5jZS0+CisJCQkJCQkJCSBhb19pZHhdIC0KKwkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwgMCk7CisKKwkJdG1wID0gaW53KGluc3RhbmNlLT51bmlfYmlfcmVnKTsJLy8gdW5pcG9sYXIKKwkJdG1wIHw9ICgweDEgPDwgaW5zdGFuY2UtPmFvX2lkeCk7CisJCW91dHcodG1wLCBpbnN0YW5jZS0+dW5pX2JpX3JlZyk7CisJCVBERUJVR19SRUcoInVuaV9iaV9yZWcgb3V0dygweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgIGluc3RhbmNlLT51bmlfYmlfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCB0bXApOworCQlicmVhazsKKwl9CisKKwkvLyBUcmlnZ2VyIG91dHB1dC4KKwlvdXR3KDB4MDAwMCwgaW5zdGFuY2UtPnNpbV9vdXRwdXRfcmVnKTsKKwlQREVCVUdfUkVHKCJzaW1fb3V0cHV0X3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5zaW1fb3V0cHV0X3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgMHgwMDAwKTsKKwlvdXR3KDB4RkZGRiwgaW5zdGFuY2UtPnNpbV9vdXRwdXRfcmVnKTsKKwlQREVCVUdfUkVHKCJzaW1fb3V0cHV0X3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5zaW1fb3V0cHV0X3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgMHhGRkZGKTsKKworCWlmICh0cmlnX2NoYW4gPT0gTUVfVFJJR19DSEFOX0RFRkFVTFQpIHsJLy8gSW5kaXZpZHVhbCB0cmlnZ2VyaW5nLgorCQkoaW5zdGFuY2UtPmFvX3JlZ3Nfc2hhZG93cyktPnN5bmNocm9ub3VzICY9CisJCSAgICB+KDB4MSA8PCBpbnN0YW5jZS0+YW9faWR4KTsKKwkJUERFQlVHKCJJbmRpdmlkdWFsIHRyaWdnZXJpbmcuXG4iKTsKKwl9IGVsc2UgaWYgKHRyaWdfY2hhbiA9PSBNRV9UUklHX0NIQU5fU1lOQ0hST05PVVMpIHsJLy8gU3luY2hyb25vdXMgdHJpZ2dlcmluZy4KKwkJKGluc3RhbmNlLT5hb19yZWdzX3NoYWRvd3MpLT5zeW5jaHJvbm91cyB8PQorCQkgICAgKDB4MSA8PCBpbnN0YW5jZS0+YW9faWR4KTsKKwkJUERFQlVHKCJTeW5jaHJvbm91cyB0cmlnZ2VyaW5nLlxuIik7CisJfQorCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5jb25maWdfcmVnc19sb2NrKTsKKwlzcGluX3VubG9jayhpbnN0YW5jZS0+YW9fc2hhZG93c19sb2NrKTsKKworCWluc3RhbmNlLT5zdGF0dXMgPSBhb19zdGF0dXNfc2luZ2xlX2NvbmZpZ3VyZWQ7CisJc3Bpbl91bmxvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lMTYwMF9hb19pb19zaW5nbGVfcmVhZChtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICBpbnQgY2hhbm5lbCwKKwkJCQkgICAgaW50ICp2YWx1ZSwgaW50IHRpbWVfb3V0LCBpbnQgZmxhZ3MpCit7CisJbWUxNjAwX2FvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwl1bnNpZ25lZCBsb25nIGRlbGF5ID0gMDsKKwl1bnNpZ25lZCBsb25nIGogPSAwOworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCisJaW5zdGFuY2UgPSAobWUxNjAwX2FvX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCVBERUJVRygiZXhlY3V0ZWQuIGlkeD0lZFxuIiwgaW5zdGFuY2UtPmFvX2lkeCk7CisKKwlpZiAoZmxhZ3MgJiB+TUVfSU9fU0lOR0xFX05PTkJMT0NLSU5HKSB7CisJCVBFUlJPUigiSW52YWxpZCBmbGFnIHNwZWNpZmllZC4gJWRcbiIsIGZsYWdzKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJfQorCisJaWYgKHRpbWVfb3V0IDwgMCkgeworCQlQRVJST1IoIkludmFsaWQgdGltZW91dCBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfVElNRU9VVDsKKwl9CisKKwlpZiAoY2hhbm5lbCkgeworCQlQRVJST1IoIkludmFsaWQgY2hhbm5lbCBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwl9CisKKwlpZiAoKCFmbGFncykgJiYgKChpbnN0YW5jZS0+YW9fcmVnc19zaGFkb3dzKS0+dHJpZ2dlciAmIGluc3RhbmNlLT5hb19pZHgpKSB7CS8vQmxvY2tpbmcgbW9kZS4gV2FpdCBmb3Igc29mdHdhcmUgdHJpZ2dlci4KKwkJaWYgKHRpbWVfb3V0KSB7CisJCQlkZWxheSA9ICh0aW1lX291dCAqIEhaKSAvIDEwMDA7CisJCQlpZiAoZGVsYXkgPT0gMCkKKwkJCQlkZWxheSA9IDE7CisJCX0KKworCQlqID0gamlmZmllczsKKworCQkvL09ubHkgcnVuaW5nIHByb2Nlc3Mgd2lsbCBpbnRlcnJ1cHQgdGhpcyBjYWxsLiBFdmVudHMgYXJlIHNpZ25hbGVkIHdoZW4gc3RhdHVzIGNoYW5nZS4gVGhpcyBwcm9jZWR1cmUgaGFzIG93biB0aW1lb3V0LgorCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChpbnN0YW5jZS0+d2FpdF9xdWV1ZSwKKwkJCQkJCSAoISgoaW5zdGFuY2UtPgorCQkJCQkJICAgICBhb19yZWdzX3NoYWRvd3MpLT4KKwkJCQkJCSAgICB0cmlnZ2VyICYgaW5zdGFuY2UtPgorCQkJCQkJICAgIGFvX2lkeCkpLAorCQkJCQkJIChkZWxheSkgPyBkZWxheSA6IExPTkdfTUFYKTsKKworCQlpZiAoaW5zdGFuY2UgPT0gYW9fc3RhdHVzX25vbmUpIHsJLy8gUmVzZXQgd2FzIGNhbGxlZC4KKwkJCVBERUJVRygiU2luZ2xlIGNhbmNlbGVkLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19DQU5DRUxMRUQ7CisJCX0KKworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCVBFUlJPUigiV2FpdCBvbiBzdGFydCBvZiBzdGF0ZSBtYWNoaW5lIGludGVycnVwdGVkLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19TSUdOQUw7CisJCX0KKworCQlpZiAoKGRlbGF5KSAmJiAoKGppZmZpZXMgLSBqKSA+PSBkZWxheSkpIHsKKwkJCVBERUJVRygiVGltZW91dCByZWFjaGVkLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19USU1FT1VUOworCQl9CisJfQorCisJKnZhbHVlID0gKGluc3RhbmNlLT5hb19yZWdzX3NoYWRvd3MpLT5taXJyb3JbaW5zdGFuY2UtPmFvX2lkeF07CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lMTYwMF9hb19pb19zaW5nbGVfd3JpdGUobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgICBpbnQgY2hhbm5lbCwKKwkJCQkgICAgIGludCB2YWx1ZSwgaW50IHRpbWVfb3V0LCBpbnQgZmxhZ3MpCit7CisJbWUxNjAwX2FvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwl1bnNpZ25lZCBsb25nIGRlbGF5ID0gMDsKKwlpbnQgaTsKKwl1bnNpZ25lZCBsb25nIGogPSAwOworCisJaW5zdGFuY2UgPSAobWUxNjAwX2FvX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCVBERUJVRygiZXhlY3V0ZWQuIGlkeD0lZFxuIiwgaW5zdGFuY2UtPmFvX2lkeCk7CisKKwlpZiAoZmxhZ3MgJgorCSAgICB+KE1FX0lPX1NJTkdMRV9UWVBFX1RSSUdfU1lOQ0hST05PVVMgfAorCSAgICAgIE1FX0lPX1NJTkdMRV9UWVBFX1dSSVRFX05PTkJMT0NLSU5HKSkgeworCQlQRVJST1IoIkludmFsaWQgZmxhZyBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJfQorCisJaWYgKHRpbWVfb3V0IDwgMCkgeworCQlQRVJST1IoIkludmFsaWQgdGltZW91dCBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfVElNRU9VVDsKKwl9CisKKwlpZiAodmFsdWUgJiB+TUUxNjAwX0FPX01BWF9EQVRBKSB7CisJCVBFUlJPUigiSW52YWxpZCB2YWx1ZSBwcm92aWRlZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fVkFMVUVfT1VUX09GX1JBTkdFOworCX0KKworCWlmIChjaGFubmVsKSB7CisJCVBFUlJPUigiSW52YWxpZCBjaGFubmVsIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCX0KKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCS8vQ2FuY2VsIGNvbnRyb2wgdGFzaworCVBERUJVRygiQ2FuY2VsIGNvbnRyb2wgdGFzay4gaWR4PSVkXG4iLCBpbnN0YW5jZS0+YW9faWR4KTsKKwlpbnN0YW5jZS0+YW9fY29udHJvbF90YXNrX2ZsYWcgPSAwOworCWNhbmNlbF9kZWxheWVkX3dvcmsoJmluc3RhbmNlLT5hb19jb250cm9sX3Rhc2spOworCShpbnN0YW5jZS0+YW9fcmVnc19zaGFkb3dzKS0+dHJpZ2dlciAmPSB+KDB4MSA8PCBpbnN0YW5jZS0+YW9faWR4KTsJLy9DYW5jZWxsIHdhaXRpbmcgZm9yIHRyaWdnZXIuCisKKwlpZiAodGltZV9vdXQpIHsKKwkJZGVsYXkgPSAodGltZV9vdXQgKiBIWikgLyAxMDAwOworCisJCWlmIChkZWxheSA9PSAwKQorCQkJZGVsYXkgPSAxOworCX0KKwkvL1dyaXRlIHZhbHVlLgorCXNwaW5fbG9jayhpbnN0YW5jZS0+YW9fc2hhZG93c19sb2NrKTsKKwkoaW5zdGFuY2UtPmFvX3JlZ3Nfc2hhZG93cyktPnNoYWRvd1tpbnN0YW5jZS0+YW9faWR4XSA9CisJICAgICh1aW50MTZfdCkgdmFsdWU7CisKKwlpZiAoZmxhZ3MgJiBNRV9JT19TSU5HTEVfVFlQRV9UUklHX1NZTkNIUk9OT1VTKSB7CS8vIFRyaWdnZXIgYWxsIG91dHB1dHMgZnJvbSBzeW5jaHJvbm91cyBsaXN0LgorCQlmb3IgKGkgPSAwOyBpIDwgKGluc3RhbmNlLT5hb19yZWdzX3NoYWRvd3MpLT5jb3VudDsgaSsrKSB7CisJCQlpZiAoKChpbnN0YW5jZS0+YW9fcmVnc19zaGFkb3dzKS0+c3luY2hyb25vdXMgJiAoMHgxIDw8IGkpKSB8fCAoaSA9PSBpbnN0YW5jZS0+YW9faWR4KSkgewkvLyBTZXQgYWxsIGZyb20gc3luY2hyb25vdXMgbGlzdCB0byBjb3JyZWN0IHN0YXRlLgorCQkJCVBERUJVRworCQkJCSAgICAoIlN5bmNocm9ub3VzIHRyaWdnZXJpbmc6IG91dHB1dCAlZC4gaWR4PSVkXG4iLAorCQkJCSAgICAgaSwgaW5zdGFuY2UtPmFvX2lkeCk7CisJCQkJKGluc3RhbmNlLT5hb19yZWdzX3NoYWRvd3MpLT5taXJyb3JbaV0gPQorCQkJCSAgICAoaW5zdGFuY2UtPmFvX3JlZ3Nfc2hhZG93cyktPnNoYWRvd1tpXTsKKworCQkJCW91dHcoKGluc3RhbmNlLT5hb19yZWdzX3NoYWRvd3MpLT5zaGFkb3dbaV0sCisJCQkJICAgICAoaW5zdGFuY2UtPmFvX3JlZ3Nfc2hhZG93cyktPnJlZ2lzdHJ5W2ldKTsKKwkJCQlQREVCVUdfUkVHCisJCQkJICAgICgiY2hhbm5lbF9yZWcgb3V0dygweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCQkgICAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICAgIChpbnN0YW5jZS0+YW9fcmVnc19zaGFkb3dzKS0+cmVnaXN0cnlbaV0gLQorCQkJCSAgICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgICAgKGluc3RhbmNlLT5hb19yZWdzX3NoYWRvd3MpLT5zaGFkb3dbaV0pOworCisJCQkJKGluc3RhbmNlLT5hb19yZWdzX3NoYWRvd3MpLT50cmlnZ2VyICY9CisJCQkJICAgIH4oMHgxIDw8IGkpOworCQkJfQorCQl9CisKKwkJLy8gVHJpZ2dlciBvdXRwdXQuCisJCW91dHcoMHgwMDAwLCBpbnN0YW5jZS0+c2ltX291dHB1dF9yZWcpOworCQlQREVCVUdfUkVHKCJzaW1fb3V0cHV0X3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPnNpbV9vdXRwdXRfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCAwKTsKKwkJb3V0dygweEZGRkYsIGluc3RhbmNlLT5zaW1fb3V0cHV0X3JlZyk7CisJCVBERUJVR19SRUcoInNpbV9vdXRwdXRfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkgICBpbnN0YW5jZS0+c2ltX291dHB1dF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkgICAweEZGRkYpOworCQlpbnN0YW5jZS0+c3RhdHVzID0gYW9fc3RhdHVzX3NpbmdsZV9lbmQ7CisJfSBlbHNlIHsJCS8vIEluZGl2aWR1YWwgbW9kZS4KKwkJaWYgKChpbnN0YW5jZS0+YW9fcmVnc19zaGFkb3dzKS0+c3luY2hyb25vdXMgJiAoMHgxIDw8IGluc3RhbmNlLT5hb19pZHgpKSB7CS8vIFB1dCBvbiBzeW5jaHJvbm91cyBzdGFydCBsaXN0LiBTZXQgb3V0cHV0IGFzIHdhaXRpbmcgZm9yIHRyaWdnZXIuCisJCQlQREVCVUcoIkFkZCB0byBzeW5jaHJvbm91cyBsaXN0LiBpZHg9JWRcbiIsCisJCQkgICAgICAgaW5zdGFuY2UtPmFvX2lkeCk7CisJCQkoaW5zdGFuY2UtPmFvX3JlZ3Nfc2hhZG93cyktPnRyaWdnZXIgfD0KKwkJCSAgICAoMHgxIDw8IGluc3RhbmNlLT5hb19pZHgpOworCQkJaW5zdGFuY2UtPnN0YXR1cyA9IGFvX3N0YXR1c19zaW5nbGVfcnVuOworCQkJUERFQlVHKCJTeW5jaHJvbm91cyBsaXN0OiAweCV4LlxuIiwKKwkJCSAgICAgICAoaW5zdGFuY2UtPmFvX3JlZ3Nfc2hhZG93cyktPnN5bmNocm9ub3VzKTsKKwkJfSBlbHNlIHsJLy8gRmlyZWQgdGhpcyBvbmUuCisJCQlQREVCVUcoIlRyaWdnZXJpbmcuIGlkeD0lZFxuIiwgaW5zdGFuY2UtPmFvX2lkeCk7CisJCQkoaW5zdGFuY2UtPmFvX3JlZ3Nfc2hhZG93cyktPm1pcnJvcltpbnN0YW5jZS0+YW9faWR4XSA9CisJCQkgICAgKGluc3RhbmNlLT5hb19yZWdzX3NoYWRvd3MpLT5zaGFkb3dbaW5zdGFuY2UtPgorCQkJCQkJCQlhb19pZHhdOworCisJCQlvdXR3KChpbnN0YW5jZS0+YW9fcmVnc19zaGFkb3dzKS0+CisJCQkgICAgIHNoYWRvd1tpbnN0YW5jZS0+YW9faWR4XSwKKwkJCSAgICAgKGluc3RhbmNlLT5hb19yZWdzX3NoYWRvd3MpLT5yZWdpc3RyeVtpbnN0YW5jZS0+CisJCQkJCQkJCSAgIGFvX2lkeF0pOworCQkJUERFQlVHX1JFRygiY2hhbm5lbF9yZWcgb3V0dygweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgKGluc3RhbmNlLT5hb19yZWdzX3NoYWRvd3MpLT4KKwkJCQkgICByZWdpc3RyeVtpbnN0YW5jZS0+YW9faWR4XSAtCisJCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIChpbnN0YW5jZS0+YW9fcmVnc19zaGFkb3dzKS0+CisJCQkJICAgc2hhZG93W2luc3RhbmNlLT5hb19pZHhdKTsKKworCQkJLy8gU2V0IG91dHB1dCBhcyB0cmlnZ2VyZWQuCisJCQkoaW5zdGFuY2UtPmFvX3JlZ3Nfc2hhZG93cyktPnRyaWdnZXIgJj0KKwkJCSAgICB+KDB4MSA8PCBpbnN0YW5jZS0+YW9faWR4KTsKKworCQkJLy8gVHJpZ2dlciBvdXRwdXQuCisJCQlvdXR3KDB4MDAwMCwgaW5zdGFuY2UtPnNpbV9vdXRwdXRfcmVnKTsKKwkJCVBERUJVR19SRUcoInNpbV9vdXRwdXRfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIGluc3RhbmNlLT5zaW1fb3V0cHV0X3JlZyAtCisJCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLCAwKTsKKwkJCW91dHcoMHhGRkZGLCBpbnN0YW5jZS0+c2ltX291dHB1dF9yZWcpOworCQkJUERFQlVHX1JFRygic2ltX291dHB1dF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgaW5zdGFuY2UtPnNpbV9vdXRwdXRfcmVnIC0KKwkJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsIDB4RkZGRik7CisJCQlpbnN0YW5jZS0+c3RhdHVzID0gYW9fc3RhdHVzX3NpbmdsZV9lbmQ7CisJCX0KKwl9CisJc3Bpbl91bmxvY2soaW5zdGFuY2UtPmFvX3NoYWRvd3NfbG9jayk7CisKKwkvL0luaXQgY29udHJvbCB0YXNrCisJaW5zdGFuY2UtPnRpbWVvdXQuZGVsYXkgPSBkZWxheTsKKwlpbnN0YW5jZS0+dGltZW91dC5zdGFydF90aW1lID0gamlmZmllczsKKwlpbnN0YW5jZS0+YW9fY29udHJvbF90YXNrX2ZsYWcgPSAxOworCXF1ZXVlX2RlbGF5ZWRfd29yayhpbnN0YW5jZS0+bWUxNjAwX3dvcmtxdWV1ZSwKKwkJCSAgICZpbnN0YW5jZS0+YW9fY29udHJvbF90YXNrLCAxKTsKKworCWlmICgoIWZsYWdzICYgTUVfSU9fU0lOR0xFX1RZUEVfV1JJVEVfTk9OQkxPQ0tJTkcpICYmICgoaW5zdGFuY2UtPmFvX3JlZ3Nfc2hhZG93cyktPnRyaWdnZXIgJiBpbnN0YW5jZS0+YW9faWR4KSkgewkvL0Jsb2NraW5nIG1vZGUuIFdhaXQgZm9yIHNvZnR3YXJlIHRyaWdnZXIuCisJCWlmICh0aW1lX291dCkgeworCQkJZGVsYXkgPSAodGltZV9vdXQgKiBIWikgLyAxMDAwOworCQkJaWYgKGRlbGF5ID09IDApCisJCQkJZGVsYXkgPSAxOworCQl9CisKKwkJaiA9IGppZmZpZXM7CisKKwkJLy9Pbmx5IHJ1bmluZyBwcm9jZXNzIHdpbGwgaW50ZXJydXB0IHRoaXMgY2FsbC4gRXZlbnRzIGFyZSBzaWduYWxlZCB3aGVuIHN0YXR1cyBjaGFuZ2UuIFRoaXMgcHJvY2VkdXJlIGhhcyBvd24gdGltZW91dC4KKwkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoaW5zdGFuY2UtPndhaXRfcXVldWUsCisJCQkJCQkgKCEoKGluc3RhbmNlLT4KKwkJCQkJCSAgICAgYW9fcmVnc19zaGFkb3dzKS0+CisJCQkJCQkgICAgdHJpZ2dlciAmIGluc3RhbmNlLT4KKwkJCQkJCSAgICBhb19pZHgpKSwKKwkJCQkJCSAoZGVsYXkpID8gZGVsYXkgOiBMT05HX01BWCk7CisKKwkJaWYgKGluc3RhbmNlID09IGFvX3N0YXR1c19ub25lKSB7CisJCQlQREVCVUcoIlNpbmdsZSBjYW5jZWxlZC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fQ0FOQ0VMTEVEOworCQl9CisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJUEVSUk9SKCJXYWl0IG9uIHN0YXJ0IG9mIHN0YXRlIG1hY2hpbmUgaW50ZXJydXB0ZWQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX1NJR05BTDsKKwkJfQorCisJCWlmICgoZGVsYXkpICYmICgoamlmZmllcyAtIGopID49IGRlbGF5KSkgeworCQkJUERFQlVHKCJUaW1lb3V0IHJlYWNoZWQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX1RJTUVPVVQ7CisJCX0KKwl9CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWUxNjAwX2FvX3F1ZXJ5X251bWJlcl9jaGFubmVscyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJICAgaW50ICpudW1iZXIpCit7CisJbWUxNjAwX2FvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnN0YW5jZSA9IChtZTE2MDBfYW9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJUERFQlVHKCJleGVjdXRlZC4gaWR4PSVkXG4iLCBpbnN0YW5jZS0+YW9faWR4KTsKKworCSpudW1iZXIgPSAxOwkJLy9FdmVyeSBzdWJkZXZpY2UgaGFzIG9ubHkgMSBjaGFubmVsLgorCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lMTYwMF9hb19xdWVyeV9zdWJkZXZpY2VfdHlwZShtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwgaW50ICp0eXBlLAorCQkJCQkgIGludCAqc3VidHlwZSkKK3sKKwltZTE2MDBfYW9fc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCWluc3RhbmNlID0gKG1lMTYwMF9hb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlQREVCVUcoImV4ZWN1dGVkLiBpZHg9JWRcbiIsIGluc3RhbmNlLT5hb19pZHgpOworCisJKnR5cGUgPSBNRV9UWVBFX0FPOworCSpzdWJ0eXBlID0gTUVfU1VCVFlQRV9TSU5HTEU7CisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWUxNjAwX2FvX3F1ZXJ5X3N1YmRldmljZV9jYXBzKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLCBpbnQgKmNhcHMpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCSpjYXBzID0gTUVfQ0FQU19BT19UUklHX1NZTkNIUk9OT1VTOworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lMTYwMF9hb19xdWVyeV9yYW5nZV9ieV9taW5fbWF4KG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQkgICAgaW50IHVuaXQsCisJCQkJCSAgICBpbnQgKm1pbiwKKwkJCQkJICAgIGludCAqbWF4LCBpbnQgKm1heGRhdGEsIGludCAqcmFuZ2UpCit7CisJbWUxNjAwX2FvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgaTsKKwlpbnQgciA9IC0xOworCWludCBkaWZmID0gMjFFNjsKKworCWluc3RhbmNlID0gKG1lMTYwMF9hb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlQREVCVUcoImV4ZWN1dGVkLiBpZHg9JWRcbiIsIGluc3RhbmNlLT5hb19pZHgpOworCisJaWYgKCgqbWF4IC0gKm1pbikgPCAwKSB7CisJCVBFUlJPUigiSW52YWxpZCBtaW5pbXVtIGFuZCBtYXhpbXVtIHZhbHVlcyBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfTUlOX01BWDsKKwl9CisJLy8gTWF4aW11bSByYW5nZXMgYXJlIHNsaWdodGx5IGxlc3MgdGhlbiAxMFYgb3IgMjBtQS4gRm9yIGNvbnZlbmllbnQgd2UgYWNjZXB0ZWQgdGhpcyB2YWx1ZSBhcyB2YWxpZCBvbmUuCisJaWYgKHVuaXQgPT0gTUVfVU5JVF9WT0xUKSB7CisJCWZvciAoaSA9IDA7IGkgPCBpbnN0YW5jZS0+dV9yYW5nZXNfY291bnQ7IGkrKykgeworCQkJaWYgKChpbnN0YW5jZS0+dV9yYW5nZXNbaV0ubWluIDw9ICptaW4pCisJCQkgICAgJiYgKChpbnN0YW5jZS0+dV9yYW5nZXNbaV0ubWF4ICsgNTAwMCkgPj0gKm1heCkpIHsKKwkJCQlpZiAoKGluc3RhbmNlLT51X3Jhbmdlc1tpXS5tYXggLQorCQkJCSAgICAgaW5zdGFuY2UtPnVfcmFuZ2VzW2ldLm1pbikgLSAoKm1heCAtCisJCQkJCQkJCSAgICptaW4pIDwKKwkJCQkgICAgZGlmZikgeworCQkJCQlyID0gaTsKKwkJCQkJZGlmZiA9CisJCQkJCSAgICAoaW5zdGFuY2UtPnVfcmFuZ2VzW2ldLm1heCAtCisJCQkJCSAgICAgaW5zdGFuY2UtPnVfcmFuZ2VzW2ldLm1pbikgLQorCQkJCQkgICAgKCptYXggLSAqbWluKTsKKwkJCQl9CisJCQl9CisJCX0KKworCQlpZiAociA8IDApIHsKKwkJCVBFUlJPUigiTm8gbWF0Y2hpbmcgcmFuZ2UgZm91bmQuXG4iKTsKKwkJCXJldHVybiBNRV9FUlJOT19OT19SQU5HRTsKKwkJfSBlbHNlIHsKKwkJCSptaW4gPSBpbnN0YW5jZS0+dV9yYW5nZXNbcl0ubWluOworCQkJKm1heCA9IGluc3RhbmNlLT51X3Jhbmdlc1tyXS5tYXg7CisJCQkqcmFuZ2UgPSByOworCQl9CisJfSBlbHNlIGlmICh1bml0ID09IE1FX1VOSVRfQU1QRVJFKSB7CisJCWZvciAoaSA9IDA7IGkgPCBpbnN0YW5jZS0+aV9yYW5nZXNfY291bnQ7IGkrKykgeworCQkJaWYgKChpbnN0YW5jZS0+aV9yYW5nZXNbaV0ubWluIDw9ICptaW4pCisJCQkgICAgJiYgKGluc3RhbmNlLT5pX3Jhbmdlc1tpXS5tYXggKyA1MDAwID49ICptYXgpKSB7CisJCQkJaWYgKChpbnN0YW5jZS0+aV9yYW5nZXNbaV0ubWF4IC0KKwkJCQkgICAgIGluc3RhbmNlLT5pX3Jhbmdlc1tpXS5taW4pIC0gKCptYXggLQorCQkJCQkJCQkgICAqbWluKSA8CisJCQkJICAgIGRpZmYpIHsKKwkJCQkJciA9IGk7CisJCQkJCWRpZmYgPQorCQkJCQkgICAgKGluc3RhbmNlLT5pX3Jhbmdlc1tpXS5tYXggLQorCQkJCQkgICAgIGluc3RhbmNlLT5pX3Jhbmdlc1tpXS5taW4pIC0KKwkJCQkJICAgICgqbWF4IC0gKm1pbik7CisJCQkJfQorCQkJfQorCQl9CisKKwkJaWYgKHIgPCAwKSB7CisJCQlQRVJST1IoIk5vIG1hdGNoaW5nIHJhbmdlIGZvdW5kLlxuIik7CisJCQlyZXR1cm4gTUVfRVJSTk9fTk9fUkFOR0U7CisJCX0gZWxzZSB7CisJCQkqbWluID0gaW5zdGFuY2UtPmlfcmFuZ2VzW3JdLm1pbjsKKwkJCSptYXggPSBpbnN0YW5jZS0+aV9yYW5nZXNbcl0ubWF4OworCQkJKnJhbmdlID0gciArIGluc3RhbmNlLT51X3Jhbmdlc19jb3VudDsKKwkJfQorCX0gZWxzZSB7CisJCVBFUlJPUigiSW52YWxpZCBwaHlzaWNhbCB1bml0IHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9VTklUOworCX0KKwkqbWF4ZGF0YSA9IE1FMTYwMF9BT19NQVhfREFUQTsKKworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lMTYwMF9hb19xdWVyeV9udW1iZXJfcmFuZ2VzKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQkgaW50IHVuaXQsIGludCAqY291bnQpCit7CisJbWUxNjAwX2FvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lMTYwMF9hb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisJc3dpdGNoICh1bml0KSB7CisJY2FzZSBNRV9VTklUX1ZPTFQ6CisJCSpjb3VudCA9IGluc3RhbmNlLT51X3Jhbmdlc19jb3VudDsKKwkJYnJlYWs7CisJY2FzZSBNRV9VTklUX0FNUEVSRToKKwkJKmNvdW50ID0gaW5zdGFuY2UtPmlfcmFuZ2VzX2NvdW50OworCQlicmVhazsKKwljYXNlIE1FX1VOSVRfQU5ZOgorCQkqY291bnQgPSBpbnN0YW5jZS0+dV9yYW5nZXNfY291bnQgKyBpbnN0YW5jZS0+aV9yYW5nZXNfY291bnQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCSpjb3VudCA9IDA7CisJfQorCisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWUxNjAwX2FvX3F1ZXJ5X3JhbmdlX2luZm8obWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgICAgaW50IHJhbmdlLAorCQkJCSAgICAgIGludCAqdW5pdCwKKwkJCQkgICAgICBpbnQgKm1pbiwgaW50ICptYXgsIGludCAqbWF4ZGF0YSkKK3sKKwltZTE2MDBfYW9fc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJaW5zdGFuY2UgPSAobWUxNjAwX2FvX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCWlmICgoKHJhbmdlICsgMSkgPgorCSAgICAgKGluc3RhbmNlLT51X3Jhbmdlc19jb3VudCArIGluc3RhbmNlLT5pX3Jhbmdlc19jb3VudCkpCisJICAgIHx8IChyYW5nZSA8IDApKSB7CisJCVBFUlJPUigiSW52YWxpZCByYW5nZSBudW1iZXIgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1JBTkdFOworCX0KKworCWlmIChyYW5nZSA8IGluc3RhbmNlLT51X3Jhbmdlc19jb3VudCkgeworCQkqdW5pdCA9IE1FX1VOSVRfVk9MVDsKKwkJKm1pbiA9IGluc3RhbmNlLT51X3Jhbmdlc1tyYW5nZV0ubWluOworCQkqbWF4ID0gaW5zdGFuY2UtPnVfcmFuZ2VzW3JhbmdlXS5tYXg7CisJfSBlbHNlIGlmIChyYW5nZSA8IGluc3RhbmNlLT51X3Jhbmdlc19jb3VudCArIGluc3RhbmNlLT5pX3Jhbmdlc19jb3VudCkgeworCQkqdW5pdCA9IE1FX1VOSVRfQU1QRVJFOworCQkqbWluID0gaW5zdGFuY2UtPmlfcmFuZ2VzW3JhbmdlIC0gaW5zdGFuY2UtPnVfcmFuZ2VzX2NvdW50XS5taW47CisJCSptYXggPSBpbnN0YW5jZS0+aV9yYW5nZXNbcmFuZ2UgLSBpbnN0YW5jZS0+dV9yYW5nZXNfY291bnRdLm1heDsKKwl9CisJKm1heGRhdGEgPSBNRTE2MDBfQU9fTUFYX0RBVEE7CisKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwyMCkKK3N0YXRpYyB2b2lkIG1lMTYwMF9hb193b3JrX2NvbnRyb2xfdGFzayh2b2lkICpzdWJkZXZpY2UpCisjZWxzZQorc3RhdGljIHZvaWQgbWUxNjAwX2FvX3dvcmtfY29udHJvbF90YXNrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKKyNlbmRpZgoreworCW1lMTYwMF9hb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJaW50IHJlc2NoZWR1bGUgPSAxOworCWludCBzaWduYWxpbmcgPSAwOworCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDIwKQorCWluc3RhbmNlID0gKG1lMTYwMF9hb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisjZWxzZQorCWluc3RhbmNlID0KKwkgICAgY29udGFpbmVyX29mKCh2b2lkICopd29yaywgbWUxNjAwX2FvX3N1YmRldmljZV90LCBhb19jb250cm9sX3Rhc2spOworI2VuZGlmCisKKwlQSU5GTygiPCVzOiAlbGQ+IGV4ZWN1dGVkLiBpZHg9JWRcbiIsIF9fZnVuY19fLCBqaWZmaWVzLAorCSAgICAgIGluc3RhbmNlLT5hb19pZHgpOworCisJaWYgKCEoKGluc3RhbmNlLT5hb19yZWdzX3NoYWRvd3MpLT50cmlnZ2VyICYgaW5zdGFuY2UtPmFvX2lkeCkpIHsJLy8gT3V0cHV0IHdhcyB0cmlnZ2VyZC4KKwkJLy8gU2lnbmFsIHRoZSBlbmQuCisJCXNpZ25hbGluZyA9IDE7CisJCXJlc2NoZWR1bGUgPSAwOworCQlpZiAoaW5zdGFuY2UtPnN0YXR1cyA9PSBhb19zdGF0dXNfc2luZ2xlX3J1bikgeworCQkJaW5zdGFuY2UtPnN0YXR1cyA9IGFvX3N0YXR1c19zaW5nbGVfZW5kOworCQl9CisKKwl9IGVsc2UgaWYgKChpbnN0YW5jZS0+dGltZW91dC5kZWxheSkgJiYgKChqaWZmaWVzIC0gaW5zdGFuY2UtPnRpbWVvdXQuc3RhcnRfdGltZSkgPj0gaW5zdGFuY2UtPnRpbWVvdXQuZGVsYXkpKSB7CS8vIFRpbWVvdXQKKwkJUERFQlVHKCJUaW1lb3V0IHJlYWNoZWQuXG4iKTsKKwkJc3Bpbl9sb2NrKGluc3RhbmNlLT5hb19zaGFkb3dzX2xvY2spOworCQkvLyBSZXN0b3JlIG9sZCBzZXR0aW5ncy4KKwkJUERFQlVHKCJXcml0ZSBvbGQgdmFsdWUgYmFjayB0byByZWdpc3Rlci5cbiIpOworCQkoaW5zdGFuY2UtPmFvX3JlZ3Nfc2hhZG93cyktPnNoYWRvd1tpbnN0YW5jZS0+YW9faWR4XSA9CisJCSAgICAoaW5zdGFuY2UtPmFvX3JlZ3Nfc2hhZG93cyktPm1pcnJvcltpbnN0YW5jZS0+YW9faWR4XTsKKworCQlvdXR3KChpbnN0YW5jZS0+YW9fcmVnc19zaGFkb3dzKS0+bWlycm9yW2luc3RhbmNlLT5hb19pZHhdLAorCQkgICAgIChpbnN0YW5jZS0+YW9fcmVnc19zaGFkb3dzKS0+cmVnaXN0cnlbaW5zdGFuY2UtPmFvX2lkeF0pOworCQlQREVCVUdfUkVHKCJjaGFubmVsX3JlZyBvdXR3KDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgKGluc3RhbmNlLT5hb19yZWdzX3NoYWRvd3MpLT5yZWdpc3RyeVtpbnN0YW5jZS0+CisJCQkJCQkJCSBhb19pZHhdIC0KKwkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgIChpbnN0YW5jZS0+YW9fcmVnc19zaGFkb3dzKS0+bWlycm9yW2luc3RhbmNlLT4KKwkJCQkJCQkgICAgICAgYW9faWR4XSk7CisKKwkJLy9SZW1vdmUgZnJvbSBzeW5jaHJvbm91cyBzdHJ0IGxpc3QuCisJCShpbnN0YW5jZS0+YW9fcmVnc19zaGFkb3dzKS0+dHJpZ2dlciAmPQorCQkgICAgfigweDEgPDwgaW5zdGFuY2UtPmFvX2lkeCk7CisJCWlmIChpbnN0YW5jZS0+c3RhdHVzID09IGFvX3N0YXR1c19ub25lKSB7CisJCQlpbnN0YW5jZS0+c3RhdHVzID0gYW9fc3RhdHVzX3NpbmdsZV9lbmQ7CisJCX0KKwkJc3Bpbl91bmxvY2soaW5zdGFuY2UtPmFvX3NoYWRvd3NfbG9jayk7CisKKwkJLy8gU2lnbmFsIHRoZSBlbmQuCisJCXNpZ25hbGluZyA9IDE7CisJCXJlc2NoZWR1bGUgPSAwOworCX0KKworCWlmIChzaWduYWxpbmcpIHsJLy9TaWduYWwgaXQuCisJCXdha2VfdXBfaW50ZXJydXB0aWJsZV9hbGwoJmluc3RhbmNlLT53YWl0X3F1ZXVlKTsKKwl9CisKKwlpZiAoaW5zdGFuY2UtPmFvX2NvbnRyb2xfdGFza19mbGFnICYmIHJlc2NoZWR1bGUpIHsJLy8gUmVzY2hlZHVsZSB0YXNrCisJCXF1ZXVlX2RlbGF5ZWRfd29yayhpbnN0YW5jZS0+bWUxNjAwX3dvcmtxdWV1ZSwKKwkJCQkgICAmaW5zdGFuY2UtPmFvX2NvbnRyb2xfdGFzaywgMSk7CisJfSBlbHNlIHsKKwkJUElORk8oIjwlcz4gRW5kaW5nIGNvbnRyb2wgdGFzay5cbiIsIF9fZnVuY19fKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTE2MDBfYW8uaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTE2MDBfYW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODJiZjVhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMTYwMF9hby5oCkBAIC0wLDAgKzEsMTMyIEBACisvKioKKyAqIEBmaWxlIG1lMTYwMF9hby5oCisgKgorICogQGJyaWVmIE1laWxoYXVzIE1FLTE2MDAgYW5hbG9nIG91dHB1dCBzdWJkZXZpY2UgY2xhc3MuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfTUUxNjAwX0FPX0hfCisjZGVmaW5lIF9NRTE2MDBfQU9fSF8KKworIyBpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjIGluY2x1ZGUgIm1lc3ViZGV2aWNlLmgiCisKKyMgaWZkZWYgX19LRVJORUxfXworCisjICBkZWZpbmUgTUUxNjAwX01BWF9SQU5HRVMJMgkvKio8IFNwZWNpZmllcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgcmFuZ2VzIGluIG1lMTYwMF9hb19zdWJkZXZpY2VfdDo6dV9yYW5nZXMgdW5kIG1lMTYwMF9hb19zdWJkZXZpY2VfdDo6aV9yYW5nZXMuICovCisKKy8qKgorICogQGJyaWVmIERlZmluZXMgYSBlbnRyeSBpbiB0aGUgcmFuZ2UgdGFibGUuCisgKi8KK3R5cGVkZWYgc3RydWN0IG1lMTYwMF9hb19yYW5nZV9lbnRyeSB7CisJaW50MzJfdCBtaW47CisJaW50MzJfdCBtYXg7Cit9IG1lMTYwMF9hb19yYW5nZV9lbnRyeV90OworCit0eXBlZGVmIHN0cnVjdCBtZTE2MDBfYW9fdGltZW91dCB7CisJdW5zaWduZWQgbG9uZyBzdGFydF90aW1lOworCXVuc2lnbmVkIGxvbmcgZGVsYXk7Cit9IG1lMTYwMF9hb190aW1lb3V0X3Q7CisKK3R5cGVkZWYgc3RydWN0IG1lMTYwMF9hb19zaGFkb3cgeworCWludCBjb3VudDsKKwl1bnNpZ25lZCBsb25nICpyZWdpc3RyeTsKKwl1aW50MTZfdCAqc2hhZG93OworCXVpbnQxNl90ICptaXJyb3I7CisJdWludDE2X3Qgc3luY2hyb25vdXM7CQkJCQkJCQkJLyoqPCBTeW5jaHJvbml6YXRpb24gbGlzdC4gKi8KKwl1aW50MTZfdCB0cmlnZ2VyOwkJCQkJCQkJCQkvKio8IFN5bmNocm9uaXphdGlvbiBmbGFnLiAqLworfSBtZTE2MDBfYW9fc2hhZG93X3Q7CisKK3R5cGVkZWYgZW51bSBNRTE2MDBfQU9fU1RBVFVTIHsKKwlhb19zdGF0dXNfbm9uZSA9IDAsCisJYW9fc3RhdHVzX3NpbmdsZV9jb25maWd1cmVkLAorCWFvX3N0YXR1c19zaW5nbGVfcnVuLAorCWFvX3N0YXR1c19zaW5nbGVfZW5kLAorCWFvX3N0YXR1c19sYXN0Cit9IE1FMTYwMF9BT19TVEFUVVM7CisKKy8qKgorICogQGJyaWVmIFRoZSBNRS0xNjAwIGFuYWxvZyBvdXRwdXQgc3ViZGV2aWNlIGNsYXNzLgorICovCit0eXBlZGVmIHN0cnVjdCBtZTE2MDBfYW9fc3ViZGV2aWNlIHsKKwkvKiBJbmhlcml0YW5jZSAqLworCW1lX3N1YmRldmljZV90IGJhc2U7CQkJCQkJCQkJLyoqPCBUaGUgc3ViZGV2aWNlIGJhc2UgY2xhc3MuICovCisKKwkvKiBBdHRyaWJ1dGVzICovCisJaW50IGFvX2lkeDsJCQkJCQkJCQkJCQkvKio8IFRoZSBpbmRleCBvZiB0aGUgYW5hbG9nIG91dHB1dCBzdWJkZXZpY2Ugb24gdGhlIGRldmljZS4gKi8KKworCXNwaW5sb2NrX3Qgc3ViZGV2aWNlX2xvY2s7CQkJCQkJCQkvKio8IFNwaW4gbG9jayB0byBwcm90ZWN0IHRoZSBzdWJkZXZpY2UgZnJvbSBjb25jdXJyZW50IGFjY2Vzcy4gKi8KKwlzcGlubG9ja190ICpjb25maWdfcmVnc19sb2NrOwkJCQkJCQkvKio8IFNwaW4gbG9jayB0byBwcm90ZWN0IGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzIGZyb20gY29uY3VycmVudCBhY2Nlc3MuICovCisKKwlpbnQgdV9yYW5nZXNfY291bnQ7CQkJCQkJCQkJCS8qKjwgVGhlIG51bWJlciBvZiB2b2x0YWdlIHJhbmdlcyBhdmFpbGFibGUgb24gdGhpcyBzdWJkZXZpY2UuICovCisJbWUxNjAwX2FvX3JhbmdlX2VudHJ5X3QgdV9yYW5nZXNbTUUxNjAwX01BWF9SQU5HRVNdOwkvKio8IEFycmF5IGhvbGRpbmcgdGhlIHZvbHRhZ2UgcmFuZ2VzIG9uIHRoaXMgc3ViZGV2aWNlLiAqLworCWludCBpX3Jhbmdlc19jb3VudDsJCQkJCQkJCQkJLyoqPCBUaGUgbnVtYmVyIG9mIGN1cnJlbnQgcmFuZ2VzIGF2YWlsYWJsZSBvbiB0aGlzIHN1YmRldmljZS4gKi8KKwltZTE2MDBfYW9fcmFuZ2VfZW50cnlfdCBpX3Jhbmdlc1tNRTE2MDBfTUFYX1JBTkdFU107CS8qKjwgQXJyYXkgaG9sZGluZyB0aGUgY3VycmVudCByYW5nZXMgb24gdGhpcyBzdWJkZXZpY2UuICovCisKKwkvKiBSZWdpc3RlcnMgKi8KKwl1bnNpZ25lZCBsb25nIHVuaV9iaV9yZWc7CQkJCQkJCQkvKio8IFJlZ2lzdGVyIGZvciBzd2l0Y2hpbmcgYmV0d2VlbiB1bmlwb2FyIGFuZCBiaXBvbGFyIG91dHB1dCBtb2RlLiAqLworCXVuc2lnbmVkIGxvbmcgaV9yYW5nZV9yZWc7CQkJCQkJCQkvKio8IFJlZ2lzdGVyIGZvciBzd2l0Y2hpbmcgYmV0d2VlbiByYW5nZXMuICovCisJdW5zaWduZWQgbG9uZyBzaW1fb3V0cHV0X3JlZzsJCQkJCQkJLyoqPCBSZWdpc3RlciB1c2VkIGluIG9yZGVyIHRvIHVwZGF0ZSBhbGwgY2hhbm5lbHMgc2ltdWx0YW5lb3VzbHkuICovCisJdW5zaWduZWQgbG9uZyBjdXJyZW50X29uX3JlZzsJCQkJCQkJLyoqPCBSZWdpc3RlciBlbmFibGluZyBjdXJyZW50IG91dHB1dCBvbiB0aGUgZm91cnRoIHN1YmRldmljZS4gKi8KKyMgICBpZmRlZiBQREVCVUdfUkVHCisJdW5zaWduZWQgbG9uZyByZWdfYmFzZTsKKyMgICBlbmRpZgorCisJTUUxNjAwX0FPX1NUQVRVUyBzdGF0dXM7CisJbWUxNjAwX2FvX3NoYWRvd190ICphb19yZWdzX3NoYWRvd3M7CQkJCQkvKio8IEFkZHJlc3NlcyBhbmQgc2hhZG93cyBvZiBvdXRwdXQncyByZWdpc3RlcnMuICovCisJc3BpbmxvY2tfdCAqYW9fc2hhZG93c19sb2NrOwkJCQkJCQkvKio8IFByb3RlY3RzIHRoZSBzaGFkb3cncyBzdHJ1Y3QuICovCisJaW50IG1vZGU7CQkJCQkJCQkJCQkJLyoqPCBNb2RlIGluIHdpdGNoIG91dHB1dCBzaG91bGQgd29ya3MuICovCisJd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdF9xdWV1ZTsJCQkJCQkJLyoqPCBXYWl0IHF1ZXVlIHRvIHB1dCBvbiB0YXNrcyB3YWl0aW5nIGZvciBkYXRhIHRvIGFycml2ZS4gKi8KKwltZTE2MDBfYW9fdGltZW91dF90IHRpbWVvdXQ7CQkJCQkJCS8qKjwgVGhlIHRpbWVvdXQgZm9yIHN0YXJ0IGluIGJsb2NraW5nIGFuZCBub24tYmxvY2tpbmcgbW9kZS4gKi8KKwlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqbWUxNjAwX3dvcmtxdWV1ZTsKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMjApCisJc3RydWN0IHdvcmtfc3RydWN0IGFvX2NvbnRyb2xfdGFzazsKKyNlbHNlCisJc3RydWN0IGRlbGF5ZWRfd29yayBhb19jb250cm9sX3Rhc2s7CisjZW5kaWYKKworCXZvbGF0aWxlIGludCBhb19jb250cm9sX3Rhc2tfZmxhZzsJCQkJCQkvKio8IEZsYWcgY29udHJvbGluZyByZWV4ZWN1dGluZyBvZiBjb250cm9sIHRhc2sgKi8KK30gbWUxNjAwX2FvX3N1YmRldmljZV90OworCisvKioKKyAqIEBicmllZiBUaGUgY29uc3RydWN0b3IgdG8gZ2VuZXJhdGUgYSBzdWJkZXZpY2UgdGVtcGxhdGUgaW5zdGFuY2UuCisgKgorICogQHBhcmFtIHJlZ19iYXNlIFRoZSByZWdpc3RlciBiYXNlIGFkZHJlc3Mgb2YgdGhlIGRldmljZSBhcyByZXR1cm5lZCBieSB0aGUgUENJIEJJT1MuCisgKiBAcGFyYW0gYW9faWR4IFRoZSBpbmRleCBvZiB0aGUgYW5hbG9nIG91dHB1dCBzdWJkZXZpY2Ugb24gdGhlIGRldmljZS4KKyAqIEBwYXJhbSBjdXJyZW50IEZsYWcgaW5kaWNhdGluZyB0aGF0IGFuYWxvZyBvdXRwdXQgd2l0aCAjYW9faWR4IG9mIDMgaXMgY2FwYWJsZSBvZiBjdXJyZW50IG91dHB1dC4KKyAqIEBwYXJhbSBjb25maWdfcmVnc19sb2NrIFBvaW50ZXIgdG8gc3BpbiBsb2NrIHByb3RlY3RpbmcgdGhlIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzIGFuZCBmcm9tIGNvbmN1cnJlbnQgYWNjZXNzLgorICoKKyAqIEByZXR1cm4gUG9pbnRlciB0byBuZXcgaW5zdGFuY2Ugb24gc3VjY2Vzcy5cbgorICogTlVMTCBvbiBlcnJvci4KKyAqLworbWUxNjAwX2FvX3N1YmRldmljZV90ICptZTE2MDBfYW9fY29uc3RydWN0b3IodWludDMyX3QgcmVnX2Jhc2UsCisJCQkJCSAgICAgdW5zaWduZWQgaW50IGFvX2lkeCwKKwkJCQkJICAgICBpbnQgY3VyciwKKwkJCQkJICAgICBzcGlubG9ja190ICogY29uZmlnX3JlZ3NfbG9jaywKKwkJCQkJICAgICBzcGlubG9ja190ICogYW9fc2hhZG93c19sb2NrLAorCQkJCQkgICAgIG1lMTYwMF9hb19zaGFkb3dfdCAqCisJCQkJCSAgICAgYW9fcmVnc19zaGFkb3dzLAorCQkJCQkgICAgIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0CisJCQkJCSAgICAgKm1lMTYwMF93cSk7CisKKyMgZW5kaWYJLy9fX0tFUk5FTF9fCisjZW5kaWYgLy9fTUUxNjAwX0FPX0hfCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUxNjAwX2FvX3JlZy5oIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMTYwMF9hb19yZWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMWU3ODAwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMTYwMF9hb19yZWcuaApAQCAtMCwwICsxLDY2IEBACisvKioKKyAqIEBmaWxlIG1lMTYwMF9hb19yZWcuaAorICoKKyAqIEBicmllZiBNRS0xNjAwIGFuYWxvZyBvdXRwdXQgc3ViZGV2aWNlIHJlZ2lzdGVyIGRlZmluaXRpb25zLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX01FMTYwMF9BT19SRUdfSF8KKyNkZWZpbmUgX01FMTYwMF9BT19SRUdfSF8KKworI2lmZGVmIF9fS0VSTkVMX18KKworI2RlZmluZSBNRTE2MDBfQ0hBTk5FTF8wX1JFRyAgICAweDAwCS8qKjwgUmVnaXN0ZXIgdG8gc2V0IGEgZGlnaXRhbCB2YWx1ZSBvbiBjaGFubmVsIDAuICovCisjZGVmaW5lIE1FMTYwMF9DSEFOTkVMXzFfUkVHICAgIDB4MDIJLyoqPCBSZWdpc3RlciB0byBzZXQgYSBkaWdpdGFsIHZhbHVlIG9uIGNoYW5uZWwgMS4gKi8KKyNkZWZpbmUgTUUxNjAwX0NIQU5ORUxfMl9SRUcgICAgMHgwNAkvKio8IFJlZ2lzdGVyIHRvIHNldCBhIGRpZ2l0YWwgdmFsdWUgb24gY2hhbm5lbCAyLiAqLworI2RlZmluZSBNRTE2MDBfQ0hBTk5FTF8zX1JFRyAgICAweDA2CS8qKjwgUmVnaXN0ZXIgdG8gc2V0IGEgZGlnaXRhbCB2YWx1ZSBvbiBjaGFubmVsIDMuICovCisjZGVmaW5lIE1FMTYwMF9DSEFOTkVMXzRfUkVHICAgIDB4MDgJLyoqPCBSZWdpc3RlciB0byBzZXQgYSBkaWdpdGFsIHZhbHVlIG9uIGNoYW5uZWwgNC4gKi8KKyNkZWZpbmUgTUUxNjAwX0NIQU5ORUxfNV9SRUcgICAgMHgwQQkvKio8IFJlZ2lzdGVyIHRvIHNldCBhIGRpZ2l0YWwgdmFsdWUgb24gY2hhbm5lbCA1LiAqLworI2RlZmluZSBNRTE2MDBfQ0hBTk5FTF82X1JFRyAgICAweDBDCS8qKjwgUmVnaXN0ZXIgdG8gc2V0IGEgZGlnaXRhbCB2YWx1ZSBvbiBjaGFubmVsIDYuICovCisjZGVmaW5lIE1FMTYwMF9DSEFOTkVMXzdfUkVHICAgIDB4MEUJLyoqPCBSZWdpc3RlciB0byBzZXQgYSBkaWdpdGFsIHZhbHVlIG9uIGNoYW5uZWwgNy4gKi8KKyNkZWZpbmUgTUUxNjAwX0NIQU5ORUxfOF9SRUcgICAgMHgxMAkvKio8IFJlZ2lzdGVyIHRvIHNldCBhIGRpZ2l0YWwgdmFsdWUgb24gY2hhbm5lbCA4LiAqLworI2RlZmluZSBNRTE2MDBfQ0hBTk5FTF85X1JFRyAgICAweDEyCS8qKjwgUmVnaXN0ZXIgdG8gc2V0IGEgZGlnaXRhbCB2YWx1ZSBvbiBjaGFubmVsIDkuICovCisjZGVmaW5lIE1FMTYwMF9DSEFOTkVMXzEwX1JFRyAgIDB4MTQJLyoqPCBSZWdpc3RlciB0byBzZXQgYSBkaWdpdGFsIHZhbHVlIG9uIGNoYW5uZWwgMTAuICovCisjZGVmaW5lIE1FMTYwMF9DSEFOTkVMXzExX1JFRyAgIDB4MTYJLyoqPCBSZWdpc3RlciB0byBzZXQgYSBkaWdpdGFsIHZhbHVlIG9uIGNoYW5uZWwgMTEuICovCisjZGVmaW5lIE1FMTYwMF9DSEFOTkVMXzEyX1JFRyAgIDB4MTgJLyoqPCBSZWdpc3RlciB0byBzZXQgYSBkaWdpdGFsIHZhbHVlIG9uIGNoYW5uZWwgMTIuICovCisjZGVmaW5lIE1FMTYwMF9DSEFOTkVMXzEzX1JFRyAgIDB4MUEJLyoqPCBSZWdpc3RlciB0byBzZXQgYSBkaWdpdGFsIHZhbHVlIG9uIGNoYW5uZWwgMTMuICovCisjZGVmaW5lIE1FMTYwMF9DSEFOTkVMXzE0X1JFRyAgIDB4MUMJLyoqPCBSZWdpc3RlciB0byBzZXQgYSBkaWdpdGFsIHZhbHVlIG9uIGNoYW5uZWwgMTQuICovCisjZGVmaW5lIE1FMTYwMF9DSEFOTkVMXzE1X1JFRyAgIDB4MUUJLyoqPCBSZWdpc3RlciB0byBzZXQgYSBkaWdpdGFsIHZhbHVlIG9uIGNoYW5uZWwgMTUuICovCisKKy8qIEV2ZXJ5IGNoYW5uZWwgb25lIGJpdDogYmlwb2xhciA9IDAsIHVuaXBvbGFyID0gMSAqLworI2RlZmluZSBNRTE2MDBfVU5JX0JJX1JFRwkJMHgyMAkvKio8IFJlZ2lzdGVyIHRvIHN3aXRjaCBiZXR3ZWVuIHVuaXBvbGFyIGFuZCBiaXBvbGFyLiAqLworCisvKiBFdmVyeSBjaGFubmVsIG9uZSBiaXQgKG9ubHkgbG93ZXIgOCBCaXRzKTogMC4uMjBtQSA9IDAsIDQuLjIwbUEgPSAxICovCisjZGVmaW5lIE1FMTYwMF8wMjBfNDIwX1JFRwkJMHgyMgkvKio8IFJlZ2lzdGVyIHRvIHN3aXRjaCBiZXR3ZWVuIHRoZSB0d28gY3VycmVudCByYW5nZXMuICovCisKKy8qIElmIGEgYml0IGlzIHNldCwgdGhlIGNvcnJlc3BvbmRpbmcgREFDICg0IHBvcnRzIGVhY2gpIGlzCisgICBub3Qgc2V0IGF0IHRoZSBtb21lbnQgeW91IHdyaXRlIHRvIGFuIG91dHB1dCBvZiBpdC4KKyAgIENsZWFyaW5nIHRoZSBiaXQgdXBkYXRlcyB0aGUgcG9ydC4gKi8KKyNkZWZpbmUgTUUxNjAwX1NJTV9PVVRQVVRfUkVHCTB4MjQJLyoqPCBSZWdpc3RlciB0byB1cGRhdGUgYWxsIGNoYW5uZWxzIG9mIGEgc3ViZGV2aWNlIHNpbXVsdGFuZW91c2x5LiAqLworCisvKiBDdXJyZW50IG9uL29mZiAob25seSBsb3dlciA4IGJpdHMpOiBvZmYgPSAwLCBvbiAgPSAxICovCisjZGVmaW5lIE1FMTYwMF9DVVJSRU5UX09OX1JFRwkweDI2CS8qKjwgUmVnaXN0ZXIgdG8gc3dpY2h0IGJldHdlZW4gdm9sdGFnZSBhbmQgY3VycmVudCBvdXRwdXQuICovCisKKyNkZWZpbmUgTUUxNjAwX0FPX01BWF9EQVRBCQkweDBGRkYJLyoqPCBUaGUgbWF4aW11bSBkaWdpdGFsIGRhdGEgYWNjZXB0ZWQgYnkgYW4gYW5hbG9nIG91dHB1dCBjaGFubmVsLiAqLworCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMTYwMF9kZXZpY2UuYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTE2MDBfZGV2aWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JjMmNiMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTE2MDBfZGV2aWNlLmMKQEAgLTAsMCArMSwyNjEgQEAKKy8qKgorICogQGZpbGUgbWUxNjAwX2RldmljZS5jCisgKgorICogQGJyaWVmIE1FLTE2MDAgZGV2aWNlIGNsYXNzIGltcGxlbWVudGF0aW9uLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICogQGF1dGhvciBLcnp5c3p0b2YgR2FudHprZQkoay5nYW50emtlQG1laWxoYXVzLmRlKQorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX19LRVJORUxfXworIyAgZGVmaW5lIF9fS0VSTkVMX18KKyNlbmRpZgorCisjaWZuZGVmIE1PRFVMRQorIyAgZGVmaW5lIE1PRFVMRQorI2VuZGlmCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKworI2luY2x1ZGUgIm1laWRzLmgiCisjaW5jbHVkZSAibWVlcnJvci5oIgorI2luY2x1ZGUgIm1lY29tbW9uLmgiCisjaW5jbHVkZSAibWVpbnRlcm5hbC5oIgorCisjaW5jbHVkZSAibWVkZWJ1Zy5oIgorI2luY2x1ZGUgIm1lZGV2aWNlLmgiCisjaW5jbHVkZSAibWVzdWJkZXZpY2UuaCIKKyNpbmNsdWRlICJtZTE2MDBfZGV2aWNlLmgiCisKK3N0YXRpYyB2b2lkIG1lMTYwMF9zZXRfcmVnaXN0cnkobWUxNjAwX2RldmljZV90ICogc3ViZGV2aWNlLCB1aW50MzJfdCByZWdfYmFzZSk7CitzdGF0aWMgdm9pZCBtZTE2MDBfZGVzdHJ1Y3RvcihzdHJ1Y3QgbWVfZGV2aWNlICpkZXZpY2UpOworCisvKioKKyAqIEBicmllZiBHbG9iYWwgdmFyaWFibGUuCisgKiBUaGlzIGlzIHdvcmtpbmcgcXVldWUgZm9yIHJ1bmluZyBhIHNlcGFyYXRlIGF0YXNrIHRoYXQgd2lsbCBiZSByZXNwb25zaWJsZSBmb3Igd29yayBzdGF0dXMgKHN0YXJ0LCBzdG9wLCB0aW1lb3V0cykuCisgKi8KK3N0YXRpYyBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqbWUxNjAwX3dvcmtxdWV1ZTsKKworbWVfZGV2aWNlX3QgKm1lMTYwMF9wY2lfY29uc3RydWN0b3Ioc3RydWN0IHBjaV9kZXYgKnBjaV9kZXZpY2UpCit7CisJaW50IGVycjsKKwltZTE2MDBfZGV2aWNlX3QgKm1lMTYwMF9kZXZpY2U7CisJbWVfc3ViZGV2aWNlX3QgKnN1YmRldmljZTsKKwl1bnNpZ25lZCBpbnQgY2hpcF9pZHg7CisJaW50IGk7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwkvLyBBbGxvY2F0ZSBzdHJ1Y3R1cmUgZm9yIGRldmljZSBpbnN0YW5jZS4KKwltZTE2MDBfZGV2aWNlID0ga21hbGxvYyhzaXplb2YobWUxNjAwX2RldmljZV90KSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIW1lMTYwMF9kZXZpY2UpIHsKKwkJUEVSUk9SKCJDYW5ub3QgZ2V0IG1lbW9yeSBmb3IgZGV2aWNlIGluc3RhbmNlLlxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCW1lbXNldChtZTE2MDBfZGV2aWNlLCAwLCBzaXplb2YobWUxNjAwX2RldmljZV90KSk7CisKKwkvLyBJbml0aWFsaXplIGJhc2UgY2xhc3Mgc3RydWN0dXJlLgorCWVyciA9IG1lX2RldmljZV9wY2lfaW5pdCgobWVfZGV2aWNlX3QgKikgbWUxNjAwX2RldmljZSwgcGNpX2RldmljZSk7CisKKwlpZiAoZXJyKSB7CisJCWtmcmVlKG1lMTYwMF9kZXZpY2UpOworCQlQRVJST1IoIkNhbm5vdCBpbml0aWFsaXplIGRldmljZSBiYXNlIGNsYXNzLlxuIik7CisJCXJldHVybiBOVUxMOworCX0KKwkvLyBJbml0aWFsaXplIHNwaW4gbG9jayAuCisJc3Bpbl9sb2NrX2luaXQoJm1lMTYwMF9kZXZpY2UtPmNvbmZpZ19yZWdzX2xvY2spOworCXNwaW5fbG9ja19pbml0KCZtZTE2MDBfZGV2aWNlLT5hb19zaGFkb3dzX2xvY2spOworCisJLy8gR2V0IHRoZSBudW1iZXIgb2YgYW5hbG9nIG91dHB1dCBzdWJkZXZpY2VzLgorCWNoaXBfaWR4ID0KKwkgICAgbWUxNjAwX3ZlcnNpb25zX2dldF9kZXZpY2VfaW5kZXgobWUxNjAwX2RldmljZS0+YmFzZS5pbmZvLnBjaS4KKwkJCQkJICAgICBkZXZpY2VfaWQpOworCisJLy8gQ3JlYXRlIHNoYWRvdyBpbnN0YW5jZS4KKwltZTE2MDBfZGV2aWNlLT5hb19yZWdzX3NoYWRvd3MuY291bnQgPQorCSAgICBtZTE2MDBfdmVyc2lvbnNbY2hpcF9pZHhdLmFvX2NoaXBzOworCW1lMTYwMF9kZXZpY2UtPmFvX3JlZ3Nfc2hhZG93cy5yZWdpc3RyeSA9CisJICAgIGttYWxsb2MobWUxNjAwX3ZlcnNpb25zW2NoaXBfaWR4XS5hb19jaGlwcyAqIHNpemVvZih1bnNpZ25lZCBsb25nKSwKKwkJICAgIEdGUF9LRVJORUwpOworCW1lMTYwMF9zZXRfcmVnaXN0cnkobWUxNjAwX2RldmljZSwKKwkJCSAgICBtZTE2MDBfZGV2aWNlLT5iYXNlLmluZm8ucGNpLnJlZ19iYXNlc1syXSk7CisJbWUxNjAwX2RldmljZS0+YW9fcmVnc19zaGFkb3dzLnNoYWRvdyA9CisJICAgIGttYWxsb2MobWUxNjAwX3ZlcnNpb25zW2NoaXBfaWR4XS5hb19jaGlwcyAqIHNpemVvZih1aW50MTZfdCksCisJCSAgICBHRlBfS0VSTkVMKTsKKwltZTE2MDBfZGV2aWNlLT5hb19yZWdzX3NoYWRvd3MubWlycm9yID0KKwkgICAga21hbGxvYyhtZTE2MDBfdmVyc2lvbnNbY2hpcF9pZHhdLmFvX2NoaXBzICogc2l6ZW9mKHVpbnQxNl90KSwKKwkJICAgIEdGUF9LRVJORUwpOworCisJLy8gQ3JlYXRlIHN1YmRldmljZSBpbnN0YW5jZXMuCisJZm9yIChpID0gMDsgaSA8IG1lMTYwMF92ZXJzaW9uc1tjaGlwX2lkeF0uYW9fY2hpcHM7IGkrKykgeworCQlzdWJkZXZpY2UgPQorCQkgICAgKG1lX3N1YmRldmljZV90ICopIG1lMTYwMF9hb19jb25zdHJ1Y3RvcihtZTE2MDBfZGV2aWNlLT4KKwkJCQkJCQkgICAgIGJhc2UuaW5mby5wY2kuCisJCQkJCQkJICAgICByZWdfYmFzZXNbMl0sIGksCisJCQkJCQkJICAgICAoKG1lMTYwMF92ZXJzaW9ucworCQkJCQkJCSAgICAgICBbY2hpcF9pZHhdLmN1cnIgPgorCQkJCQkJCSAgICAgICBpKSA/IDEgOiAwKSwKKwkJCQkJCQkgICAgICZtZTE2MDBfZGV2aWNlLT4KKwkJCQkJCQkgICAgIGNvbmZpZ19yZWdzX2xvY2ssCisJCQkJCQkJICAgICAmbWUxNjAwX2RldmljZS0+CisJCQkJCQkJICAgICBhb19zaGFkb3dzX2xvY2ssCisJCQkJCQkJICAgICAmbWUxNjAwX2RldmljZS0+CisJCQkJCQkJICAgICBhb19yZWdzX3NoYWRvd3MsCisJCQkJCQkJICAgICBtZTE2MDBfd29ya3F1ZXVlKTsKKworCQlpZiAoIXN1YmRldmljZSkgeworCQkJbWVfZGV2aWNlX2RlaW5pdCgobWVfZGV2aWNlX3QgKikgbWUxNjAwX2RldmljZSk7CisJCQlrZnJlZShtZTE2MDBfZGV2aWNlKTsKKwkJCVBFUlJPUigiQ2Fubm90IGdldCBtZW1vcnkgZm9yIHN1YmRldmljZS5cbiIpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKworCQltZV9zbGlzdF9hZGRfc3ViZGV2aWNlX3RhaWwoJm1lMTYwMF9kZXZpY2UtPmJhc2Uuc2xpc3QsCisJCQkJCSAgICBzdWJkZXZpY2UpOworCX0KKworCS8vIE92ZXJ3cml0ZSBiYXNlIGNsYXNzIG1ldGhvZHMuCisJbWUxNjAwX2RldmljZS0+YmFzZS5tZV9kZXZpY2VfZGVzdHJ1Y3RvciA9IG1lMTYwMF9kZXN0cnVjdG9yOworCisJcmV0dXJuIChtZV9kZXZpY2VfdCAqKSBtZTE2MDBfZGV2aWNlOworfQorCitzdGF0aWMgdm9pZCBtZTE2MDBfZGVzdHJ1Y3RvcihzdHJ1Y3QgbWVfZGV2aWNlICpkZXZpY2UpCit7CisJbWUxNjAwX2RldmljZV90ICptZTE2MDBfZGV2aWNlID0gKG1lMTYwMF9kZXZpY2VfdCAqKSBkZXZpY2U7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJLy8gRGVzdHJveSBzaGFkb3cgaW5zdGFuY2UuCisJa2ZyZWUobWUxNjAwX2RldmljZS0+YW9fcmVnc19zaGFkb3dzLnJlZ2lzdHJ5KTsKKwlrZnJlZShtZTE2MDBfZGV2aWNlLT5hb19yZWdzX3NoYWRvd3Muc2hhZG93KTsKKwlrZnJlZShtZTE2MDBfZGV2aWNlLT5hb19yZWdzX3NoYWRvd3MubWlycm9yKTsKKworCW1lX2RldmljZV9kZWluaXQoKG1lX2RldmljZV90ICopIG1lMTYwMF9kZXZpY2UpOworCWtmcmVlKG1lMTYwMF9kZXZpY2UpOworfQorCitzdGF0aWMgdm9pZCBtZTE2MDBfc2V0X3JlZ2lzdHJ5KG1lMTYwMF9kZXZpY2VfdCAqIHN1YmRldmljZSwgdWludDMyX3QgcmVnX2Jhc2UpCit7CQkJCS8vIENyZWF0ZSBzaGFkb3cgc3RydWN0dXJlLgorCWlmIChzdWJkZXZpY2UtPmFvX3JlZ3Nfc2hhZG93cy5jb3VudCA+PSAxKSB7CisJCXN1YmRldmljZS0+YW9fcmVnc19zaGFkb3dzLnJlZ2lzdHJ5WzBdID0KKwkJICAgICh1bnNpZ25lZCBsb25nKShyZWdfYmFzZSArIE1FMTYwMF9DSEFOTkVMXzBfUkVHKTsKKwl9CisJaWYgKHN1YmRldmljZS0+YW9fcmVnc19zaGFkb3dzLmNvdW50ID49IDIpIHsKKwkJc3ViZGV2aWNlLT5hb19yZWdzX3NoYWRvd3MucmVnaXN0cnlbMV0gPQorCQkgICAgKHVuc2lnbmVkIGxvbmcpKHJlZ19iYXNlICsgTUUxNjAwX0NIQU5ORUxfMV9SRUcpOworCX0KKwlpZiAoc3ViZGV2aWNlLT5hb19yZWdzX3NoYWRvd3MuY291bnQgPj0gMykgeworCQlzdWJkZXZpY2UtPmFvX3JlZ3Nfc2hhZG93cy5yZWdpc3RyeVsyXSA9CisJCSAgICAodW5zaWduZWQgbG9uZykocmVnX2Jhc2UgKyBNRTE2MDBfQ0hBTk5FTF8yX1JFRyk7CisJfQorCWlmIChzdWJkZXZpY2UtPmFvX3JlZ3Nfc2hhZG93cy5jb3VudCA+PSA0KSB7CisJCXN1YmRldmljZS0+YW9fcmVnc19zaGFkb3dzLnJlZ2lzdHJ5WzNdID0KKwkJICAgICh1bnNpZ25lZCBsb25nKShyZWdfYmFzZSArIE1FMTYwMF9DSEFOTkVMXzNfUkVHKTsKKwl9CisJaWYgKHN1YmRldmljZS0+YW9fcmVnc19zaGFkb3dzLmNvdW50ID49IDUpIHsKKwkJc3ViZGV2aWNlLT5hb19yZWdzX3NoYWRvd3MucmVnaXN0cnlbNF0gPQorCQkgICAgKHVuc2lnbmVkIGxvbmcpKHJlZ19iYXNlICsgTUUxNjAwX0NIQU5ORUxfNF9SRUcpOworCX0KKwlpZiAoc3ViZGV2aWNlLT5hb19yZWdzX3NoYWRvd3MuY291bnQgPj0gNikgeworCQlzdWJkZXZpY2UtPmFvX3JlZ3Nfc2hhZG93cy5yZWdpc3RyeVs1XSA9CisJCSAgICAodW5zaWduZWQgbG9uZykocmVnX2Jhc2UgKyBNRTE2MDBfQ0hBTk5FTF81X1JFRyk7CisJfQorCWlmIChzdWJkZXZpY2UtPmFvX3JlZ3Nfc2hhZG93cy5jb3VudCA+PSA3KSB7CisJCXN1YmRldmljZS0+YW9fcmVnc19zaGFkb3dzLnJlZ2lzdHJ5WzZdID0KKwkJICAgICh1bnNpZ25lZCBsb25nKShyZWdfYmFzZSArIE1FMTYwMF9DSEFOTkVMXzZfUkVHKTsKKwl9CisJaWYgKHN1YmRldmljZS0+YW9fcmVnc19zaGFkb3dzLmNvdW50ID49IDgpIHsKKwkJc3ViZGV2aWNlLT5hb19yZWdzX3NoYWRvd3MucmVnaXN0cnlbN10gPQorCQkgICAgKHVuc2lnbmVkIGxvbmcpKHJlZ19iYXNlICsgTUUxNjAwX0NIQU5ORUxfN19SRUcpOworCX0KKwlpZiAoc3ViZGV2aWNlLT5hb19yZWdzX3NoYWRvd3MuY291bnQgPj0gOSkgeworCQlzdWJkZXZpY2UtPmFvX3JlZ3Nfc2hhZG93cy5yZWdpc3RyeVs4XSA9CisJCSAgICAodW5zaWduZWQgbG9uZykocmVnX2Jhc2UgKyBNRTE2MDBfQ0hBTk5FTF84X1JFRyk7CisJfQorCWlmIChzdWJkZXZpY2UtPmFvX3JlZ3Nfc2hhZG93cy5jb3VudCA+PSAxMCkgeworCQlzdWJkZXZpY2UtPmFvX3JlZ3Nfc2hhZG93cy5yZWdpc3RyeVs5XSA9CisJCSAgICAodW5zaWduZWQgbG9uZykocmVnX2Jhc2UgKyBNRTE2MDBfQ0hBTk5FTF85X1JFRyk7CisJfQorCWlmIChzdWJkZXZpY2UtPmFvX3JlZ3Nfc2hhZG93cy5jb3VudCA+PSAxMSkgeworCQlzdWJkZXZpY2UtPmFvX3JlZ3Nfc2hhZG93cy5yZWdpc3RyeVsxMF0gPQorCQkgICAgKHVuc2lnbmVkIGxvbmcpKHJlZ19iYXNlICsgTUUxNjAwX0NIQU5ORUxfMTBfUkVHKTsKKwl9CisJaWYgKHN1YmRldmljZS0+YW9fcmVnc19zaGFkb3dzLmNvdW50ID49IDEyKSB7CisJCXN1YmRldmljZS0+YW9fcmVnc19zaGFkb3dzLnJlZ2lzdHJ5WzExXSA9CisJCSAgICAodW5zaWduZWQgbG9uZykocmVnX2Jhc2UgKyBNRTE2MDBfQ0hBTk5FTF8xMV9SRUcpOworCX0KKwlpZiAoc3ViZGV2aWNlLT5hb19yZWdzX3NoYWRvd3MuY291bnQgPj0gMTMpIHsKKwkJc3ViZGV2aWNlLT5hb19yZWdzX3NoYWRvd3MucmVnaXN0cnlbMTJdID0KKwkJICAgICh1bnNpZ25lZCBsb25nKShyZWdfYmFzZSArIE1FMTYwMF9DSEFOTkVMXzEyX1JFRyk7CisJfQorCWlmIChzdWJkZXZpY2UtPmFvX3JlZ3Nfc2hhZG93cy5jb3VudCA+PSAxNCkgeworCQlzdWJkZXZpY2UtPmFvX3JlZ3Nfc2hhZG93cy5yZWdpc3RyeVsxM10gPQorCQkgICAgKHVuc2lnbmVkIGxvbmcpKHJlZ19iYXNlICsgTUUxNjAwX0NIQU5ORUxfMTNfUkVHKTsKKwl9CisJaWYgKHN1YmRldmljZS0+YW9fcmVnc19zaGFkb3dzLmNvdW50ID49IDE1KSB7CisJCXN1YmRldmljZS0+YW9fcmVnc19zaGFkb3dzLnJlZ2lzdHJ5WzE0XSA9CisJCSAgICAodW5zaWduZWQgbG9uZykocmVnX2Jhc2UgKyBNRTE2MDBfQ0hBTk5FTF8xNF9SRUcpOworCX0KKwlpZiAoc3ViZGV2aWNlLT5hb19yZWdzX3NoYWRvd3MuY291bnQgPj0gMTYpIHsKKwkJc3ViZGV2aWNlLT5hb19yZWdzX3NoYWRvd3MucmVnaXN0cnlbMTVdID0KKwkJICAgICh1bnNpZ25lZCBsb25nKShyZWdfYmFzZSArIE1FMTYwMF9DSEFOTkVMXzE1X1JFRyk7CisJfQorCWlmIChzdWJkZXZpY2UtPmFvX3JlZ3Nfc2hhZG93cy5jb3VudCA+IDE2KSB7CisJCVBFUlJPUigiTW9yZSB0aGFuIDE2IG91dHB1dHMhICglZClcbiIsCisJCSAgICAgICBzdWJkZXZpY2UtPmFvX3JlZ3Nfc2hhZG93cy5jb3VudCk7CisJfQorfQorCisvLyBJbml0IGFuZCBleGl0IG9mIG1vZHVsZS4KKworc3RhdGljIGludCBfX2luaXQgbWUxNjAwX2luaXQodm9pZCkKK3sKKwlQREVCVUcoImV4ZWN1dGVkXG4uIik7CisKKwltZTE2MDBfd29ya3F1ZXVlID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoIm1lMTYwMCIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgbWUxNjAwX2V4aXQodm9pZCkKK3sKKwlQREVCVUcoImV4ZWN1dGVkXG4uIik7CisKKwlmbHVzaF93b3JrcXVldWUobWUxNjAwX3dvcmtxdWV1ZSk7CisJZGVzdHJveV93b3JrcXVldWUobWUxNjAwX3dvcmtxdWV1ZSk7Cit9CisKK21vZHVsZV9pbml0KG1lMTYwMF9pbml0KTsKK21vZHVsZV9leGl0KG1lMTYwMF9leGl0KTsKKworLy8gQWRtaW5pc3RyYXRpdmUgc3R1ZmYgZm9yIG1vZGluZm8uCitNT0RVTEVfQVVUSE9SCisgICAgKCJHdWVudGVyIEdlYmhhcmR0IDxnLmdlYmhhcmR0QG1laWxoYXVzLmRlPiAmIEtyenlzenRvZiBHYW50emtlIDxrLmdhbnR6a2VAbWVpbGhhdXMuZGU+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkRldmljZSBEcml2ZXIgTW9kdWxlIGZvciBNRS0xNjAwIERldmljZSIpOworTU9EVUxFX1NVUFBPUlRFRF9ERVZJQ0UoIk1laWxoYXVzIE1FLTE2MDAgRGV2aWNlcyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisvLyBFeHBvcnQgdGhlIGNvbnN0cnVjdG9yLgorRVhQT1JUX1NZTUJPTChtZTE2MDBfcGNpX2NvbnN0cnVjdG9yKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTE2MDBfZGV2aWNlLmggYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUxNjAwX2RldmljZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3YjIzMWYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUxNjAwX2RldmljZS5oCkBAIC0wLDAgKzEsMTAxIEBACisvKioKKyAqIEBmaWxlIG1lMTYwMF9kZXZpY2UuaAorICoKKyAqIEBicmllZiBNRS0xNjAwIGRldmljZSBjbGFzcy4KKyAqIEBub3RlIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKiBAYXV0aG9yIEd1ZW50ZXIgR2ViaGFyZHQKKyAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9NRTE2MDBfSAorI2RlZmluZSBfTUUxNjAwX0gKKworI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisKKyNpbmNsdWRlICJtZWRldmljZS5oIgorI2luY2x1ZGUgIm1lMTYwMF9hby5oIgorI2luY2x1ZGUgIm1lMTYwMF9hb19yZWcuaCIKKworI2lmZGVmIF9fS0VSTkVMX18KKworLyoqCisgKiBAYnJpZWYgU3RydWN0dXJlIHRvIHN0b3JlIGRldmljZSBjYXBhYmlsaXRpZXMuCisgKi8KK3R5cGVkZWYgc3RydWN0IG1lMTYwMF92ZXJzaW9uIHsKKwl1aW50MTZfdCBkZXZpY2VfaWQ7CQkJCS8qKjwgVGhlIFBDSSBkZXZpY2UgaWQgb2YgdGhlIGRldmljZS4gKi8KKwl1bnNpZ25lZCBpbnQgYW9fY2hpcHM7CQkJLyoqPCBUaGUgbnVtYmVyIG9mIGFuYWxvZyBvdXRwdXRzIG9uIHRoZSBkZXZpY2UuICovCisJaW50IGN1cnI7CQkJCQkJLyoqPCBGbGFnIHRvIGlkZW50aWZ5IGFtb3VudHMgb2YgY3VycmVudCBvdXRwdXQuICovCit9IG1lMTYwMF92ZXJzaW9uX3Q7CisKKy8qKgorICAqIEBicmllZiBEZWZpbmVzIGZvciBlYWNoIE1FLTE2MDAgZGV2aWNlIHZlcnNpb24gaXRzIGNhcGFiaWxpdGllcy4KKyAqLworc3RhdGljIG1lMTYwMF92ZXJzaW9uX3QgbWUxNjAwX3ZlcnNpb25zW10gPSB7CisJe1BDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNjAwXzRVLCA0LCAwfSwKKwl7UENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE2MDBfOFUsIDgsIDB9LAorCXtQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTYwMF8xMlUsIDEyLCAwfSwKKwl7UENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE2MDBfMTZVLCAxNiwgMH0sCisJe1BDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNjAwXzE2VV84SSwgMTYsIDh9LAorCXswfQorfTsKKworLyoqPCBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZW50cmllcyBpbiAjbWUxNjAwX3ZlcnNpb25zLiAqLworI2RlZmluZSBNRTE2MDBfREVWSUNFX1ZFUlNJT05TIChzaXplb2YobWUxNjAwX3ZlcnNpb25zKSAvIHNpemVvZihtZTE2MDBfdmVyc2lvbl90KSAtIDEpCisKKy8qKgorICogQGJyaWVmIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBkZXZpY2UgZW50cnkgaW4gI21lMTYwMF92ZXJzaW9ucy4KKyAqCisgKiBAcGFyYW0gZGV2aWNlX2lkIFRoZSBQQ0kgZGV2aWNlIGlkIG9mIHRoZSBkZXZpY2UgdG8gcXVlcnkuCisgKiBAcmV0dXJuIFRoZSBpbmRleCBvZiB0aGUgZGV2aWNlIGluICNtZTE2MDBfdmVyc2lvbnMuCisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IG1lMTYwMF92ZXJzaW9uc19nZXRfZGV2aWNlX2luZGV4KHVpbnQxNl90IGRldmljZV9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgTUUxNjAwX0RFVklDRV9WRVJTSU9OUzsgaSsrKQorCQlpZiAobWUxNjAwX3ZlcnNpb25zW2ldLmRldmljZV9pZCA9PSBkZXZpY2VfaWQpCisJCQlicmVhazsKKwlyZXR1cm4gaTsKK30KKworLyoqCisgKiBAYnJpZWYgVGhlIE1FLTE2MDAgZGV2aWNlIGNsYXNzIHN0cnVjdHVyZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgbWUxNjAwX2RldmljZSB7CisJbWVfZGV2aWNlX3QgYmFzZTsJCQkJCQkvKio8IFRoZSBNZWlsaGF1cyBkZXZpY2UgYmFzZSBjbGFzcy4gKi8KKwlzcGlubG9ja190IGNvbmZpZ19yZWdzX2xvY2s7CQkJLyoqPCBQcm90ZWN0cyB0aGUgY29uZmlndXJhdGlvbiByZWdpc3RlcnMuICovCisKKwltZTE2MDBfYW9fc2hhZG93X3QgYW9fcmVnc19zaGFkb3dzOwkJLyoqPCBBZGRyZXNzZXMgYW5kIHNoYWRvd3Mgb2Ygb3V0cHV0J3MgcmVnaXN0ZXJzLiAqLworCXNwaW5sb2NrX3QgYW9fc2hhZG93c19sb2NrOwkJCQkvKio8IFByb3RlY3RzIHRoZSBzaGFkb3cncyBzdHJ1Y3QuICovCit9IG1lMTYwMF9kZXZpY2VfdDsKKworLyoqCisgKiBAYnJpZWYgVGhlIE1FLTE2MDAgZGV2aWNlIGNsYXNzIGNvbnN0cnVjdG9yLgorICoKKyAqIEBwYXJhbSBwY2lfZGV2aWNlIFRoZSBwY2kgZGV2aWNlIHN0cnVjdHVyZSBnaXZlbiBieSB0aGUgUENJIHN1YnN5c3RlbS4KKyAqCisgKiBAcmV0dXJuIE9uIHN1Y2NlcyBhIG5ldyBNRS0xNjAwIGRldmljZSBpbnN0YW5jZS4gXG4KKyAqICAgICAgICAgTlVMTCBvbiBlcnJvci4KKyAqLworbWVfZGV2aWNlX3QgKm1lMTYwMF9wY2lfY29uc3RydWN0b3Ioc3RydWN0IHBjaV9kZXYgKnBjaV9kZXZpY2UpCisgICAgX19hdHRyaWJ1dGVfXyAoKHdlYWspKTsKKworI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTQ2MDBfYWkuYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTQ2MDBfYWkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYThjOWQ3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lNDYwMF9haS5jCkBAIC0wLDAgKzEsMzQzNCBAQAorLyoqCisgKiBAZmlsZSBtZTQ2MDBfYWkuYworICoKKyAqIEBicmllZiBNRS00MDAwIGFuYWxvZyBpbnB1dCBzdWJkZXZpY2UgaW5zdGFuY2UuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKiBAYXV0aG9yIEtyenlzenRvZiBHYW50emtlCShrLmdhbnR6a2VAbWVpbGhhdXMuZGUpCisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0tFUk5FTF9fCisjIGRlZmluZSBfX0tFUk5FTF9fCisjZW5kaWYKKworLyoKKyAqIEluY2x1ZGVzCisgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorCisjaW5jbHVkZSAibWVkZWZpbmVzLmgiCisjaW5jbHVkZSAibWVpbnRlcm5hbC5oIgorI2luY2x1ZGUgIm1lZXJyb3IuaCIKKyNpbmNsdWRlICJtZWRlYnVnLmgiCisjaW5jbHVkZSAibWVpZHMuaCIKKworI2luY2x1ZGUgIm1lNDYwMF9yZWcuaCIKKyNpbmNsdWRlICJtZTQ2MDBfYWlfcmVnLmgiCisjaW5jbHVkZSAibWU0NjAwX2FpLmgiCisKKy8qCisgKiBEZWNsYXJhdGlvbnMgKGxvY2FsKQorICovCisKK3N0YXRpYyB2b2lkIG1lNDYwMF9haV9kZXN0cnVjdG9yKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSk7CitzdGF0aWMgaW50IG1lNDYwMF9haV9pb19yZXNldF9zdWJkZXZpY2UobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJCXN0cnVjdCBmaWxlICpmaWxlcCwgaW50IGZsYWdzKTsKKworc3RhdGljIGludCBtZTQ2MDBfYWlfaW9fc2luZ2xlX2NvbmZpZyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgICAgaW50IGNoYW5uZWwsCisJCQkJICAgICAgaW50IHNpbmdsZV9jb25maWcsCisJCQkJICAgICAgaW50IHJlZiwKKwkJCQkgICAgICBpbnQgdHJpZ19jaGFuLAorCQkJCSAgICAgIGludCB0cmlnX3R5cGUsIGludCB0cmlnX2VkZ2UsIGludCBmbGFncyk7CisKK3N0YXRpYyBpbnQgbWU0NjAwX2FpX2lvX3NpbmdsZV9yZWFkKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgIGludCBjaGFubmVsLAorCQkJCSAgICBpbnQgKnZhbHVlLCBpbnQgdGltZV9vdXQsIGludCBmbGFncyk7CisKK3N0YXRpYyBpbnQgbWU0NjAwX2FpX2lvX3N0cmVhbV9jb25maWcobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICAgIG1lSU9TdHJlYW1Db25maWdfdCAqIGNvbmZpZ19saXN0LAorCQkJCSAgICAgIGludCBjb3VudCwKKwkJCQkgICAgICBtZUlPU3RyZWFtVHJpZ2dlcl90ICogdHJpZ2dlciwKKwkJCQkgICAgICBpbnQgZmlmb19pcnFfdGhyZXNob2xkLCBpbnQgZmxhZ3MpOworc3RhdGljIGludCBtZTQ2MDBfYWlfaW9fc3RyZWFtX3JlYWQobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgaW50IHJlYWRfbW9kZSwKKwkJCQkgICAgaW50ICp2YWx1ZXMsIGludCAqY291bnQsIGludCBmbGFncyk7CitzdGF0aWMgaW50IG1lNDYwMF9haV9pb19zdHJlYW1fbmV3X3ZhbHVlcyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJCSAgaW50IHRpbWVfb3V0LCBpbnQgKmNvdW50LCBpbnQgZmxhZ3MpOworc3RhdGljIGludCBpbmxpbmUgbWU0NjAwX2FpX2lvX3N0cmVhbV9yZWFkX2dldF92YWx1ZShtZTQ2MDBfYWlfc3ViZGV2aWNlX3QgKgorCQkJCQkJICAgICBpbnN0YW5jZSwgaW50ICp2YWx1ZXMsCisJCQkJCQkgICAgIGNvbnN0IGludCBjb3VudCwKKwkJCQkJCSAgICAgY29uc3QgaW50IGZsYWdzKTsKKworc3RhdGljIGludCBtZTQ2MDBfYWlfaW9fc3RyZWFtX3N0YXJ0KG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICAgaW50IHN0YXJ0X21vZGUsIGludCB0aW1lX291dCwgaW50IGZsYWdzKTsKK3N0YXRpYyBpbnQgbWU0NjAwX2FpX2lvX3N0cmVhbV9zdG9wKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgIGludCBzdG9wX21vZGUsIGludCBmbGFncyk7CitzdGF0aWMgaW50IG1lNDYwMF9haV9pb19zdHJlYW1fc3RhdHVzKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgICBpbnQgd2FpdCwKKwkJCQkgICAgICBpbnQgKnN0YXR1cywgaW50ICp2YWx1ZXMsIGludCBmbGFncyk7CisKK3N0YXRpYyBpbnQgbWU0NjAwX2FpX3F1ZXJ5X3JhbmdlX2J5X21pbl9tYXgobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJCSAgICBpbnQgdW5pdCwKKwkJCQkJICAgIGludCAqbWluLAorCQkJCQkgICAgaW50ICptYXgsIGludCAqbWF4ZGF0YSwgaW50ICpyYW5nZSk7CitzdGF0aWMgaW50IG1lNDYwMF9haV9xdWVyeV9udW1iZXJfcmFuZ2VzKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQkgaW50IHVuaXQsIGludCAqY291bnQpOworc3RhdGljIGludCBtZTQ2MDBfYWlfcXVlcnlfcmFuZ2VfaW5mbyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgICBpbnQgcmFuZ2UsCisJCQkJICAgICAgaW50ICp1bml0LAorCQkJCSAgICAgIGludCAqbWluLCBpbnQgKm1heCwgaW50ICptYXhkYXRhKTsKK3N0YXRpYyBpbnQgbWU0NjAwX2FpX3F1ZXJ5X3RpbWVyKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSBpbnQgdGltZXIsCisJCQkJIGludCAqYmFzZV9mcmVxdWVuY3ksCisJCQkJIGxvbmcgbG9uZyAqbWluX3RpY2tzLCBsb25nIGxvbmcgKm1heF90aWNrcyk7CitzdGF0aWMgaW50IG1lNDYwMF9haV9xdWVyeV9udW1iZXJfY2hhbm5lbHMobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJCSAgIGludCAqbnVtYmVyKTsKK3N0YXRpYyBpbnQgbWU0NjAwX2FpX3F1ZXJ5X3N1YmRldmljZV90eXBlKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQkgIGludCAqdHlwZSwgaW50ICpzdWJ0eXBlKTsKK3N0YXRpYyBpbnQgbWU0NjAwX2FpX3F1ZXJ5X3N1YmRldmljZV9jYXBzKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQkgIGludCAqY2Fwcyk7CitzdGF0aWMgaW50IG1lNDYwMF9haV9xdWVyeV9zdWJkZXZpY2VfY2Fwc19hcmdzKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSwKKwkJCQkJICAgICAgIGludCBjYXAsIGludCAqYXJncywgaW50IGNvdW50KTsKKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLCA2LCAxOSkKK3N0YXRpYyBpcnFyZXR1cm5fdCBtZTQ2MDBfYWlfaXNyKGludCBpcnEsIHZvaWQgKmRldl9pZCk7CisjZWxzZQorc3RhdGljIGlycXJldHVybl90IG1lNDYwMF9haV9pc3IoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CisjZW5kaWYKKworc3RhdGljIGludCBhaV9tdXhfdG9nZ2xlcihtZTQ2MDBfYWlfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UpOworCisvKiogSW1taWRpYXRlIHN0b3AuCisqIFJlc2V0IGFsbCBJUlEncyBzb3VyY2VzLiAoYmxvY2sgbGFjaGVzKQorKiBQcmVzZXJ2ZSBGSUZPCisqLworc3RhdGljIGludCBhaV9zdG9wX2ltbWVkaWF0ZWx5KG1lNDYwMF9haV9zdWJkZXZpY2VfdCAqIGluc3RhbmNlKTsKKworLyoqIEltbWlkaWF0ZSBzdG9wLgorKiBSZXNldCBhbGwgSVJRJ3Mgc291cmNlcy4gKGJsb2NrIGxhY2hlcykKKyogUmVzZXQgZGF0YSBGSUZPCisqLwordm9pZCBpbmxpbmUgYWlfc3RvcF9pc3IobWU0NjAwX2FpX3N1YmRldmljZV90ICogaW5zdGFuY2UpOworCisvKiogSW50ZXJydXB0IGxvZ2ljcy4KKyogUmVhZCBkYXRhcworKiBSZXNldCBsYXRjaGVzCisqLwordm9pZCBhaV9saW1pdGVkX2lzcihtZTQ2MDBfYWlfc3ViZGV2aWNlX3QgKiBpbnN0YW5jZSwgY29uc3QgdWludDMyX3QgaXJxX3N0YXR1cywKKwkJICAgIGNvbnN0IHVpbnQzMl90IGN0cmxfc3RhdHVzKTsKK3ZvaWQgYWlfaW5maW5pdGVfaXNyKG1lNDYwMF9haV9zdWJkZXZpY2VfdCAqIGluc3RhbmNlLAorCQkgICAgIGNvbnN0IHVpbnQzMl90IGlycV9zdGF0dXMsIGNvbnN0IHVpbnQzMl90IGN0cmxfc3RhdHVzKTsKKworLyoqIExhc3QgY2h1bmNrIG9mIGRhdGFzLiBXZSBtdXN0IHJlc2NoZWR1bGUgc2FtcGxlIGNvdW50ZXIuCisqIExlYXZpbmcgU0NfUkVMT0FEIGRvZXNuJ3QgZG8gYW55IGhhcm0sIGJ1dCBpbiBzb21lIGJhZCBjYXNlIGNhbiBtYWtlIGV4dHJhIGludGVycnVwdHMuCisqIFdoZW4gdGhyZXNob2xkIGlzIHdyb25nbHkgc2V0IHNvbWUgSVJRIGFyZSBsb3N0LighISEpCisqLwordm9pZCBpbmxpbmUgYWlfcmVzY2hlZHVsZV9TQyhtZTQ2MDBfYWlfc3ViZGV2aWNlX3QgKiBpbnN0YW5jZSk7CisKKy8qKiBSZWFkIGRhdGFzIGZyb20gRklGTyBhbmQgY29weSB0aGVtIHRvIGJ1ZmZlciAqLworc3RhdGljIGludCBpbmxpbmUgYWlfcmVhZF9kYXRhKG1lNDYwMF9haV9zdWJkZXZpY2VfdCAqIGluc3RhbmNlLAorCQkJICAgICAgIGNvbnN0IGludCBjb3VudCk7CisKKy8qKiBDb3B5IHJlc3Qgb2YgZGF0YSBmcm9tIGZpZm8gdG8gY2lyY3VsYXIgYnVmZmVyLiovCitzdGF0aWMgaW50IGlubGluZSBhaV9yZWFkX2RhdGFfcG9vbGluZyhtZTQ2MDBfYWlfc3ViZGV2aWNlX3QgKiBpbnN0YW5jZSk7CisKKy8qKiBTZXQgSVNNIHRvIG5leHQgc3RhdGUgZm9yIGluZmluaXRlIGRhdGEgYXF1c2F0aW9uIG1vZGUqLwordm9pZCBpbmxpbmUgYWlfaW5maW5pdGVfSVNNKG1lNDYwMF9haV9zdWJkZXZpY2VfdCAqIGluc3RhbmNlKTsKKworLyoqIFNldCBJU00gdG8gbmV4dCBzdGF0ZSBmb3IgZGVmaW5lIGFtb3VudCBvZiBkYXRhIGFxdXNhdGlvbiBtb2RlKi8KK3ZvaWQgaW5saW5lIGFpX2xpbWl0ZWRfSVNNKG1lNDYwMF9haV9zdWJkZXZpY2VfdCAqIGluc3RhbmNlLAorCQkJICAgdWludDMyX3QgaXJxX3N0YXR1cyk7CisKKy8qKiBTZXQgSVNNIHRvIG5leHQgc3RhZ2UgZm9yIGxpbWl0ZWQgbW9kZSAqLwordm9pZCBpbmxpbmUgYWlfZGF0YV9hY3F1aXNpdGlvbl9sb2dpYyhtZTQ2MDBfYWlfc3ViZGV2aWNlX3QgKiBpbnN0YW5jZSk7CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMjApCitzdGF0aWMgdm9pZCBtZTQ2MDBfYWlfd29ya19jb250cm9sX3Rhc2sodm9pZCAqc3ViZGV2aWNlKTsKKyNlbHNlCitzdGF0aWMgdm9pZCBtZTQ2MDBfYWlfd29ya19jb250cm9sX3Rhc2soc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKKyNlbmRpZgorCisvKiBEZWZpbml0aW9ucworICovCisKK21lNDYwMF9haV9zdWJkZXZpY2VfdCAqbWU0NjAwX2FpX2NvbnN0cnVjdG9yKHVpbnQzMl90IHJlZ19iYXNlLAorCQkJCQkgICAgIHVuc2lnbmVkIGludCBjaGFubmVscywKKwkJCQkJICAgICB1bnNpZ25lZCBpbnQgcmFuZ2VzLAorCQkJCQkgICAgIGludCBpc29sYXRlZCwKKwkJCQkJICAgICBpbnQgc2gsCisJCQkJCSAgICAgaW50IGlycSwKKwkJCQkJICAgICBzcGlubG9ja190ICogY3RybF9yZWdfbG9jaywKKwkJCQkJICAgICBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqbWU0NjAwX3dxKQoreworCW1lNDYwMF9haV9zdWJkZXZpY2VfdCAqc3ViZGV2aWNlOworCWludCBlcnI7CisJdW5zaWduZWQgaW50IGk7CisKKwlQREVCVUcoImV4ZWN1dGVkLiBpZHg9MFxuIik7CisKKwkvLyBBbGxvY2F0ZSBtZW1vcnkgZm9yIHN1YmRldmljZSBpbnN0YW5jZS4KKwlzdWJkZXZpY2UgPSBrbWFsbG9jKHNpemVvZihtZTQ2MDBfYWlfc3ViZGV2aWNlX3QpLCBHRlBfS0VSTkVMKTsKKworCWlmICghc3ViZGV2aWNlKSB7CisJCVBFUlJPUigiQ2Fubm90IGdldCBtZW1vcnkgZm9yIHN1YmRldmljZSBpbnN0YW5jZS5cbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwltZW1zZXQoc3ViZGV2aWNlLCAwLCBzaXplb2YobWU0NjAwX2FpX3N1YmRldmljZV90KSk7CisKKwkvLyBJbml0aWFsaXplIHN1YmRldmljZSBiYXNlIGNsYXNzLgorCWVyciA9IG1lX3N1YmRldmljZV9pbml0KCZzdWJkZXZpY2UtPmJhc2UpOworCisJaWYgKGVycikgeworCQlQRVJST1IoIkNhbm5vdCBpbml0aWFsaXplIHN1YmRldmljZSBiYXNlIGNsYXNzIGluc3RhbmNlLlxuIik7CisJCWtmcmVlKHN1YmRldmljZSk7CisJCXJldHVybiBOVUxMOworCX0KKwkvLyBJbml0aWFsaXplIHNwaW4gbG9ja3MuCisJc3Bpbl9sb2NrX2luaXQoJnN1YmRldmljZS0+c3ViZGV2aWNlX2xvY2spOworCisJc3ViZGV2aWNlLT5jdHJsX3JlZ19sb2NrID0gY3RybF9yZWdfbG9jazsKKworCS8vIEluaXRpYWxpemUgY2lyY3VsYXIgYnVmZmVyLgorCXN1YmRldmljZS0+Y2lyY19idWYubWFzayA9IE1FNDYwMF9BSV9DSVJDX0JVRl9DT1VOVCAtIDE7CisKKwlzdWJkZXZpY2UtPmNpcmNfYnVmLmJ1ZiA9CisJICAgICh2b2lkICopX19nZXRfZnJlZV9wYWdlcyhHRlBfS0VSTkVMLCBNRTQ2MDBfQUlfQ0lSQ19CVUZfU0laRV9PUkRFUik7CisJUERFQlVHKCJjaXJjX2J1ZiA9ICVwIHNpemU9JWxkXG4iLCBzdWJkZXZpY2UtPmNpcmNfYnVmLmJ1ZiwKKwkgICAgICAgTUU0NjAwX0FJX0NJUkNfQlVGX1NJWkUpOworCisJaWYgKCFzdWJkZXZpY2UtPmNpcmNfYnVmLmJ1ZikgeworCQlQRVJST1IoIkNhbm5vdCBnZXQgY2lyY3VsYXIgYnVmZmVyLlxuIik7CisJCW1lX3N1YmRldmljZV9kZWluaXQoKG1lX3N1YmRldmljZV90ICopIHN1YmRldmljZSk7CisJCWtmcmVlKHN1YmRldmljZSk7CisJCXJldHVybiBOVUxMOworCX0KKworCW1lbXNldChzdWJkZXZpY2UtPmNpcmNfYnVmLmJ1ZiwgMCwgTUU0NjAwX0FJX0NJUkNfQlVGX1NJWkUpOworCXN1YmRldmljZS0+Y2lyY19idWYuaGVhZCA9IDA7CisJc3ViZGV2aWNlLT5jaXJjX2J1Zi50YWlsID0gMDsKKwlzdWJkZXZpY2UtPnN0YXR1cyA9IGFpX3N0YXR1c19ub25lOworCisJLy8gSW5pdGlhbGl6ZSB3YWl0IHF1ZXVlLgorCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnN1YmRldmljZS0+d2FpdF9xdWV1ZSk7CisKKwkvLyBTYXZlIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMuCisJc3ViZGV2aWNlLT5jaGFubmVscyA9IGNoYW5uZWxzOworCisJLyogSW5pdGlhbGl6ZSB0aGUgc2luZ2xlIGNvbmZpZyBlbnRyaWVzIHRvIHJlc2V0IHZhbHVlcyAqLworCWZvciAoaSA9IDA7IGkgPCBjaGFubmVsczsgaSsrKSB7CisJCXN1YmRldmljZS0+c2luZ2xlX2NvbmZpZ1tpXS5zdGF0dXMgPSBNRV9TSU5HTEVfQ0hBTk5FTF9OT1RfQ09ORklHVVJFRDsJLy9ub3QgY29uZmlndXJlZAorCX0KKworCS8vIFNhdmUgaWYgaXNvbGF0ZWQgZGV2aWNlLgorCXN1YmRldmljZS0+aXNvbGF0ZWQgPSBpc29sYXRlZDsKKworCS8vIFNhdmUgaWYgc2FtcGxlIGFuZCBob2xkIGlzIGF2YWlsYWJsZS4KKwlzdWJkZXZpY2UtPnNoID0gc2g7CisKKwkvLyBTZXQgc3RyZWFtIGNvbmZpZyB0byBub3QgY29uZmlndXJlZCBzdGF0ZS4KKwlzdWJkZXZpY2UtPmZpZm9faXJxX3RocmVzaG9sZCA9IDA7CisJc3ViZGV2aWNlLT5kYXRhX3JlcXVpcmVkID0gMDsKKwlzdWJkZXZpY2UtPmNoYW5fbGlzdF9sZW4gPSAwOworCisJLy8gSW5pdGlhbGl6ZSByZWdpc3RlcnMgYWRkcmVzc2VzLgorCXN1YmRldmljZS0+Y3RybF9yZWcgPSByZWdfYmFzZSArIE1FNDYwMF9BSV9DVFJMX1JFRzsKKwlzdWJkZXZpY2UtPnN0YXR1c19yZWcgPSByZWdfYmFzZSArIE1FNDYwMF9BSV9TVEFUVVNfUkVHOworCXN1YmRldmljZS0+Y2hhbm5lbF9saXN0X3JlZyA9IHJlZ19iYXNlICsgTUU0NjAwX0FJX0NIQU5ORUxfTElTVF9SRUc7CisJc3ViZGV2aWNlLT5kYXRhX3JlZyA9IHJlZ19iYXNlICsgTUU0NjAwX0FJX0RBVEFfUkVHOworCXN1YmRldmljZS0+Y2hhbl90aW1lcl9yZWcgPSByZWdfYmFzZSArIE1FNDYwMF9BSV9DSEFOX1RJTUVSX1JFRzsKKwlzdWJkZXZpY2UtPmNoYW5fcHJlX3RpbWVyX3JlZyA9IHJlZ19iYXNlICsgTUU0NjAwX0FJX0NIQU5fUFJFX1RJTUVSX1JFRzsKKwlzdWJkZXZpY2UtPnNjYW5fdGltZXJfbG93X3JlZyA9IHJlZ19iYXNlICsgTUU0NjAwX0FJX1NDQU5fVElNRVJfTE9XX1JFRzsKKwlzdWJkZXZpY2UtPnNjYW5fdGltZXJfaGlnaF9yZWcgPQorCSAgICByZWdfYmFzZSArIE1FNDYwMF9BSV9TQ0FOX1RJTUVSX0hJR0hfUkVHOworCXN1YmRldmljZS0+c2Nhbl9wcmVfdGltZXJfbG93X3JlZyA9CisJICAgIHJlZ19iYXNlICsgTUU0NjAwX0FJX1NDQU5fUFJFX1RJTUVSX0xPV19SRUc7CisJc3ViZGV2aWNlLT5zY2FuX3ByZV90aW1lcl9oaWdoX3JlZyA9CisJICAgIHJlZ19iYXNlICsgTUU0NjAwX0FJX1NDQU5fUFJFX1RJTUVSX0hJR0hfUkVHOworCXN1YmRldmljZS0+c3RhcnRfcmVnID0gcmVnX2Jhc2UgKyBNRTQ2MDBfQUlfU1RBUlRfUkVHOworCXN1YmRldmljZS0+aXJxX3N0YXR1c19yZWcgPSByZWdfYmFzZSArIE1FNDYwMF9JUlFfU1RBVFVTX1JFRzsKKwlzdWJkZXZpY2UtPnNhbXBsZV9jb3VudGVyX3JlZyA9IHJlZ19iYXNlICsgTUU0NjAwX0FJX1NBTVBMRV9DT1VOVEVSX1JFRzsKKyNpZmRlZiBNRURFQlVHX0RFQlVHX1JFRworCXN1YmRldmljZS0+cmVnX2Jhc2UgPSByZWdfYmFzZTsKKyNlbmRpZgorCisJLy8gSW5pdGlhbGl6ZSByYW5nZXMuCisJc3ViZGV2aWNlLT5yYW5nZXNfbGVuID0gcmFuZ2VzOworCXN1YmRldmljZS0+cmFuZ2VzWzBdLm1pbiA9IC0xMEU2OworCXN1YmRldmljZS0+cmFuZ2VzWzBdLm1heCA9IDk5OTk2OTQ7CisKKwlzdWJkZXZpY2UtPnJhbmdlc1sxXS5taW4gPSAwOworCXN1YmRldmljZS0+cmFuZ2VzWzFdLm1heCA9IDk5OTk4NDc7CisKKwlzdWJkZXZpY2UtPnJhbmdlc1syXS5taW4gPSAtMjVFNTsKKwlzdWJkZXZpY2UtPnJhbmdlc1syXS5tYXggPSAyNDk5OTIzOworCisJc3ViZGV2aWNlLT5yYW5nZXNbM10ubWluID0gMDsKKwlzdWJkZXZpY2UtPnJhbmdlc1szXS5tYXggPSAyNDk5OTYxOworCisJLy8gV2UgaGF2ZSB0byBzd2l0Y2ggdGhlIG11eCBpbiBvcmRlciB0byBnZXQgaXQgd29yayBjb3JyZWN0bHkuCisJYWlfbXV4X3RvZ2dsZXIoc3ViZGV2aWNlKTsKKworCS8vIFJlZ2lzdGVyIGludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmUuCisJc3ViZGV2aWNlLT5pcnEgPSBpcnE7CisJaWYgKHJlcXVlc3RfaXJxKHN1YmRldmljZS0+aXJxLCBtZTQ2MDBfYWlfaXNyLAorI2lmZGVmIElSUUZfRElTQUJMRUQKKwkJCUlSUUZfRElTQUJMRUQgfCBJUlFGX1NIQVJFRCwKKyNlbHNlCisJCQlTQV9JTlRFUlJVUFQgfCBTQV9TSElSUSwKKyNlbmRpZgorCQkJTUU0NjAwX05BTUUsIHN1YmRldmljZSkpIHsKKwkJUEVSUk9SKCJDYW5ub3QgcmVnaXN0ZXIgaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZS5cbiIpOworCQltZV9zdWJkZXZpY2VfZGVpbml0KChtZV9zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2UpOworCQlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKXN1YmRldmljZS0+Y2lyY19idWYuYnVmLAorCQkJICAgTUU0NjAwX0FJX0NJUkNfQlVGX1NJWkVfT1JERVIpOworCQlzdWJkZXZpY2UtPmNpcmNfYnVmLmJ1ZiA9IE5VTEw7CisJCWtmcmVlKHN1YmRldmljZSk7CisJCXJldHVybiBOVUxMOworCX0KKwlQSU5GTygiUmVnaXN0ZXJlZCBpcnE9JWQuXG4iLCBzdWJkZXZpY2UtPmlycSk7CisKKwkvLyBPdmVycmlkZSBiYXNlIGNsYXNzIG1ldGhvZHMuCisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9kZXN0cnVjdG9yID0gbWU0NjAwX2FpX2Rlc3RydWN0b3I7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19yZXNldF9zdWJkZXZpY2UgPQorCSAgICBtZTQ2MDBfYWlfaW9fcmVzZXRfc3ViZGV2aWNlOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fc2luZ2xlX2NvbmZpZyA9CisJICAgIG1lNDYwMF9haV9pb19zaW5nbGVfY29uZmlnOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fc2luZ2xlX3JlYWQgPSBtZTQ2MDBfYWlfaW9fc2luZ2xlX3JlYWQ7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19zdHJlYW1fY29uZmlnID0KKwkgICAgbWU0NjAwX2FpX2lvX3N0cmVhbV9jb25maWc7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19zdHJlYW1fbmV3X3ZhbHVlcyA9CisJICAgIG1lNDYwMF9haV9pb19zdHJlYW1fbmV3X3ZhbHVlczsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3N0cmVhbV9yZWFkID0gbWU0NjAwX2FpX2lvX3N0cmVhbV9yZWFkOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fc3RyZWFtX3N0YXJ0ID0KKwkgICAgbWU0NjAwX2FpX2lvX3N0cmVhbV9zdGFydDsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3N0cmVhbV9zdGF0dXMgPQorCSAgICBtZTQ2MDBfYWlfaW9fc3RyZWFtX3N0YXR1czsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3N0cmVhbV9zdG9wID0gbWU0NjAwX2FpX2lvX3N0cmVhbV9zdG9wOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfcXVlcnlfbnVtYmVyX2NoYW5uZWxzID0KKwkgICAgbWU0NjAwX2FpX3F1ZXJ5X251bWJlcl9jaGFubmVsczsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV90eXBlID0KKwkgICAgbWU0NjAwX2FpX3F1ZXJ5X3N1YmRldmljZV90eXBlOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfcXVlcnlfc3ViZGV2aWNlX2NhcHMgPQorCSAgICBtZTQ2MDBfYWlfcXVlcnlfc3ViZGV2aWNlX2NhcHM7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9zdWJkZXZpY2VfY2Fwc19hcmdzID0KKwkgICAgbWU0NjAwX2FpX3F1ZXJ5X3N1YmRldmljZV9jYXBzX2FyZ3M7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9yYW5nZV9ieV9taW5fbWF4ID0KKwkgICAgbWU0NjAwX2FpX3F1ZXJ5X3JhbmdlX2J5X21pbl9tYXg7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9udW1iZXJfcmFuZ2VzID0KKwkgICAgbWU0NjAwX2FpX3F1ZXJ5X251bWJlcl9yYW5nZXM7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9yYW5nZV9pbmZvID0KKwkgICAgbWU0NjAwX2FpX3F1ZXJ5X3JhbmdlX2luZm87CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV90aW1lciA9IG1lNDYwMF9haV9xdWVyeV90aW1lcjsKKworCS8vIFByZXBhcmUgd29yayBxdWV1ZS4KKwlzdWJkZXZpY2UtPm1lNDYwMF93b3JrcXVldWUgPSBtZTQ2MDBfd3E7CisKKy8qIHdvcmtxdWV1ZSBBUEkgY2hhbmdlZCBpbiBrZXJuZWwgMi42LjIwICovCisjaWYgKCBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMjApICkKKwlJTklUX1dPUksoJnN1YmRldmljZS0+YWlfY29udHJvbF90YXNrLCBtZTQ2MDBfYWlfd29ya19jb250cm9sX3Rhc2ssCisJCSAgKHZvaWQgKilzdWJkZXZpY2UpOworI2Vsc2UKKwlJTklUX0RFTEFZRURfV09SSygmc3ViZGV2aWNlLT5haV9jb250cm9sX3Rhc2ssCisJCQkgIG1lNDYwMF9haV93b3JrX2NvbnRyb2xfdGFzayk7CisjZW5kaWYKKworCXJldHVybiBzdWJkZXZpY2U7Cit9CisKK3N0YXRpYyB2b2lkIG1lNDYwMF9haV9kZXN0cnVjdG9yKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSkKK3sKKwltZTQ2MDBfYWlfc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCisJaW5zdGFuY2UgPSAobWU0NjAwX2FpX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCVBERUJVRygiZXhlY3V0ZWQuIGlkeD0wXG4iKTsKKworCWluc3RhbmNlLT5haV9jb250cm9sX3Rhc2tfZmxhZyA9IDA7CisJLy8gUmVzZXQgc3ViZGV2aWNlIHRvIGFzdXJlIGNsZWFuIGV4aXQuCisJbWU0NjAwX2FpX2lvX3Jlc2V0X3N1YmRldmljZShzdWJkZXZpY2UsIE5VTEwsCisJCQkJICAgICBNRV9JT19SRVNFVF9TVUJERVZJQ0VfTk9fRkxBR1MpOworCisJLy8gUmVtb3ZlIGFueSB0YXNrcyBmcm9tIHdvcmsgcXVldWUuIFRoaXMgaXMgcGFyYW5vaWMgYmVjYXVzZSBpdCB3YXMgZG9uZSBhbGxyZWFkeSBpbiByZXNldCgpLgorCWlmICghY2FuY2VsX2RlbGF5ZWRfd29yaygmaW5zdGFuY2UtPmFpX2NvbnRyb2xfdGFzaykpIHsJLy9XYWl0IDIgdGlja3MgdG8gYmUgc3VyZSB0aGF0IGNvbnRyb2wgdGFzayBpcyByZW1vdmVkIGZyb20gcXVldWUuCisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCXNjaGVkdWxlX3RpbWVvdXQoMik7CisJfQorCisJZnJlZV9pcnEoaW5zdGFuY2UtPmlycSwgaW5zdGFuY2UpOworCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpaW5zdGFuY2UtPmNpcmNfYnVmLmJ1ZiwKKwkJICAgTUU0NjAwX0FJX0NJUkNfQlVGX1NJWkVfT1JERVIpOworCW1lX3N1YmRldmljZV9kZWluaXQoJmluc3RhbmNlLT5iYXNlKTsKKwlrZnJlZShpbnN0YW5jZSk7Cit9CisKK3N0YXRpYyBpbnQgbWU0NjAwX2FpX2lvX3Jlc2V0X3N1YmRldmljZShtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJc3RydWN0IGZpbGUgKmZpbGVwLCBpbnQgZmxhZ3MpCit7CisJbWU0NjAwX2FpX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwl2b2xhdGlsZSB1aW50MzJfdCBjdHJsOworCXVuc2lnbmVkIGxvbmcgc3RhdHVzOworCWNvbnN0IGludCB0aW1lb3V0ID0gSFogLyAxMDsJLy8xMDBtcworCWludCBpOworCisJUERFQlVHKCJleGVjdXRlZC4gaWR4PTBcbiIpOworCisJaWYgKGZsYWdzKSB7CisJCVBFUlJPUigiSW52YWxpZCBmbGFnIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlpbnN0YW5jZSA9IChtZTQ2MDBfYWlfc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJaW5zdGFuY2UtPmFpX2NvbnRyb2xfdGFza19mbGFnID0gMDsKKwlpbnN0YW5jZS0+c3RhdHVzID0gYWlfc3RhdHVzX25vbmU7CisKKwlmb3IgKGkgPSAwOyBpIDw9IHRpbWVvdXQ7IGkrKykgeworCQlzcGluX2xvY2tfaXJxc2F2ZShpbnN0YW5jZS0+Y3RybF9yZWdfbG9jaywgc3RhdHVzKTsKKwkJY3RybCA9IGlubChpbnN0YW5jZS0+Y3RybF9yZWcpOworCQkvL1N0b3AgRE1BCisJCWN0cmwgJj0gfk1FNDYwMF9BSV9DVFJMX1JQQ0lfRklGTzsKKwkJLy8gU3RvcCBhbGwgYWN0aW9ucy4gTm8gY29uZGl0aW9ucyEKKwkJY3RybCAmPSB+TUU0NjAwX0FJX0NUUkxfQklUX1NUT1A7CisJCWN0cmwgfD0gTUU0NjAwX0FJX0NUUkxfQklUX0lNTUVESUFURV9TVE9QOworCisJCW91dGwoY3RybCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgY3RybCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2ssIHN0YXR1cyk7CisKKwkJaWYgKCEoaW5sKGluc3RhbmNlLT5zdGF0dXNfcmVnKSAmIE1FNDYwMF9BSV9TVEFUVVNfQklUX0ZTTSkpCisJCQlicmVhazsKKworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQlzY2hlZHVsZV90aW1lb3V0KDEpOworCX0KKworCWlmIChpID4gdGltZW91dCkgeworCQlQRVJST1IoIkZTTSBpcyBzdGlsbCBidXN5LlxuIik7CisJCU1FX1NVQkRFVklDRV9FWElUOworCQlyZXR1cm4gTUVfRVJSTk9fSU5URVJOQUw7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2ssIHN0YXR1cyk7CisJY3RybCA9IGlubChpbnN0YW5jZS0+Y3RybF9yZWcpOworCS8vIENsZWFyIGFsbCBmZWF0dXJlcy4gRGlzc2FibGUgaW50ZXJydXB0cy4KKwljdHJsICY9IH4oTUU0NjAwX0FJX0NUUkxfQklUX1NUT1AKKwkJICB8IE1FNDYwMF9BSV9DVFJMX0JJVF9MRV9JUlEKKwkJICB8IE1FNDYwMF9BSV9DVFJMX0JJVF9IRl9JUlEgfCBNRTQ2MDBfQUlfQ1RSTF9CSVRfU0NfSVJRKTsKKwljdHJsIHw9IChNRTQ2MDBfQUlfQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1AKKwkJIHwgTUU0NjAwX0FJX0NUUkxfQklUX0xFX0lSUV9SRVNFVAorCQkgfCBNRTQ2MDBfQUlfQ1RSTF9CSVRfSEZfSVJRX1JFU0VUCisJCSB8IE1FNDYwMF9BSV9DVFJMX0JJVF9TQ19JUlFfUkVTRVQpOworCisJb3V0bChjdHJsLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCBjdHJsKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrLCBzdGF0dXMpOworCisJb3V0bChNRTQ2MDBfQUlfTUlOX0NIQU5fVElDS1MgLSAxLCBpbnN0YW5jZS0+Y2hhbl90aW1lcl9yZWcpOworCVBERUJVR19SRUcoImNoYW5fdGltZXJfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JWxseFxuIiwKKwkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+Y2hhbl90aW1lcl9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIE1FNDYwMF9BSV9NSU5fQ0hBTl9USUNLUyk7CisJb3V0bChNRTQ2MDBfQUlfTUlOX0FDUV9USUNLUyAtIDEsIGluc3RhbmNlLT5jaGFuX3ByZV90aW1lcl9yZWcpOworCVBERUJVR19SRUcoImNoYW5fcHJlX3RpbWVyX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCVsbHhcbiIsCisJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPmNoYW5fcHJlX3RpbWVyX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgTUU0NjAwX0FJX01JTl9BQ1FfVElDS1MpOworCW91dGwoMCwgaW5zdGFuY2UtPnNjYW5fdGltZXJfbG93X3JlZyk7CisJUERFQlVHX1JFRygic2Nhbl90aW1lcl9sb3dfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPnNjYW5fdGltZXJfbG93X3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgMCk7CisJb3V0bCgwLCBpbnN0YW5jZS0+c2Nhbl90aW1lcl9oaWdoX3JlZyk7CisJUERFQlVHX1JFRygic2Nhbl90aW1lcl9oaWdoX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5zY2FuX3RpbWVyX2hpZ2hfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCAwKTsKKwlvdXRsKDAsIGluc3RhbmNlLT5zY2FuX3ByZV90aW1lcl9sb3dfcmVnKTsKKwlQREVCVUdfUkVHKCJzY2FuX3ByZV90aW1lcl9sb3dfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPnNjYW5fcHJlX3RpbWVyX2xvd19yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIDApOworCW91dGwoMCwgaW5zdGFuY2UtPnNjYW5fcHJlX3RpbWVyX2hpZ2hfcmVnKTsKKwlQREVCVUdfUkVHKCJzY2FuX3ByZV90aW1lcl9oaWdoX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5zY2FuX3ByZV90aW1lcl9oaWdoX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgMCk7CisJb3V0bCgweEVGRkZGRkZGLCBpbnN0YW5jZS0+c2FtcGxlX2NvdW50ZXJfcmVnKTsKKwlQREVCVUdfUkVHKCJzYW1wbGVfY291bnRlcl9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+c2FtcGxlX2NvdW50ZXJfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICAweEVGRkZGRkZGKTsKKworCWluc3RhbmNlLT5jaXJjX2J1Zi5oZWFkID0gMDsKKwlpbnN0YW5jZS0+Y2lyY19idWYudGFpbCA9IDA7CisKKwlpbnN0YW5jZS0+Zmlmb19pcnFfdGhyZXNob2xkID0gMDsKKwlpbnN0YW5jZS0+ZGF0YV9yZXF1aXJlZCA9IDA7CisJaW5zdGFuY2UtPmNoYW5fbGlzdF9sZW4gPSAwOworCisJLy8gSW5pdGlhbGl6ZSB0aGUgc2luZ2xlIGNvbmZpZyBlbnRyaWVzIHRvIHJlc2V0IHZhbHVlcy4KKwlmb3IgKGkgPSAwOyBpIDwgaW5zdGFuY2UtPmNoYW5uZWxzOyBpKyspIHsKKwkJaW5zdGFuY2UtPnNpbmdsZV9jb25maWdbaV0uc3RhdHVzID0KKwkJICAgIE1FX1NJTkdMRV9DSEFOTkVMX05PVF9DT05GSUdVUkVEOworCX0KKwlpbnN0YW5jZS0+c3RhdHVzID0gYWlfc3RhdHVzX25vbmU7CisKKwkvL1NpZ25hbCByZXNldCBpZiB1c2VyIGlzIG9uIHdhaXQuCisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlX2FsbCgmaW5zdGFuY2UtPndhaXRfcXVldWUpOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lNDYwMF9haV9pb19zaW5nbGVfY29uZmlnKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgICBpbnQgY2hhbm5lbCwKKwkJCQkgICAgICBpbnQgc2luZ2xlX2NvbmZpZywKKwkJCQkgICAgICBpbnQgcmVmLAorCQkJCSAgICAgIGludCB0cmlnX2NoYW4sCisJCQkJICAgICAgaW50IHRyaWdfdHlwZSwgaW50IHRyaWdfZWRnZSwgaW50IGZsYWdzKQoreworCW1lNDYwMF9haV9zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJdW5zaWduZWQgbG9uZyBjcHVfZmxhZ3M7CisJaW50IGk7CisKKwlpbnN0YW5jZSA9IChtZTQ2MDBfYWlfc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJUERFQlVHKCJleGVjdXRlZC4gaWR4PTBcbiIpOworCisJaWYgKGZsYWdzICYgfk1FX0lPX1NJTkdMRV9DT05GSUdfQ09OVElOVUUpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWcgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCXN3aXRjaCAodHJpZ190eXBlKSB7CisJY2FzZSBNRV9UUklHX1RZUEVfU1c6CisJCWlmICh0cmlnX2VkZ2UgIT0gTUVfVFJJR19FREdFX05PTkUpIHsKKwkJCVBFUlJPUgorCQkJICAgICgiSW52YWxpZCB0cmlnZ2VyIGVkZ2UuIFNvZnR3YXJlIHRyaWdnZXIgaGFzIG5vdCBlZGdlLlxuIik7CisJCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9UUklHX0VER0U7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIE1FX1RSSUdfVFlQRV9FWFRfQU5BTE9HOgorCQlpZiAoaW5zdGFuY2UtPmNoYW5uZWxzIDw9IDE2KQkvL09ubHkgdmVyc2lvbnMgd2l0aCAzMiBjaGFubmVscyBoYXZlIGFuYWxvZyB0cmlnZ2VyICg0NjcwIGFuZCA0NjgwKQorCQl7CisJCQlQRVJST1IoIkludmFsaWQgdHJpZ2dlciB0eXBlIHNwZWNpZmllZC5cbiIpOworCQkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfVFJJR19UWVBFOworCQl9CisKKwljYXNlIE1FX1RSSUdfVFlQRV9FWFRfRElHSVRBTDoKKwkJaWYgKCh0cmlnX2VkZ2UgIT0gTUVfVFJJR19FREdFX0FOWSkKKwkJICAgICYmICh0cmlnX2VkZ2UgIT0gTUVfVFJJR19FREdFX1JJU0lORykKKwkJICAgICYmICh0cmlnX2VkZ2UgIT0gTUVfVFJJR19FREdFX0ZBTExJTkcpKSB7CisJCQlQRVJST1IoIkludmFsaWQgdHJpZ2dlciBlZGdlIHNwZWNpZmllZC5cbiIpOworCQkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfVFJJR19FREdFOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJUEVSUk9SKCJJbnZhbGlkIHRyaWdnZXIgdHlwZSBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfVFJJR19UWVBFOworCX0KKworCWlmICh0cmlnX2NoYW4gIT0gTUVfVFJJR19DSEFOX0RFRkFVTFQpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIHRyaWdnZXIgY2hhbm5lbCBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfVFJJR19DSEFOOworCX0KKworCWlmICgoc2luZ2xlX2NvbmZpZyA8IDApIHx8IChzaW5nbGVfY29uZmlnID49IGluc3RhbmNlLT5yYW5nZXNfbGVuKSkgeworCQlQRVJST1IoIkludmFsaWQgc2luZ2xlIGNvbmZpZyBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfU0lOR0xFX0NPTkZJRzsKKwl9CisKKwlpZiAoKHJlZiAhPSBNRV9SRUZfQUlfR1JPVU5EKSAmJiAocmVmICE9IE1FX1JFRl9BSV9ESUZGRVJFTlRJQUwpKSB7CisJCVBFUlJPUigiSW52YWxpZCBhbmFsb2cgcmVmZXJlbmNlIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9SRUY7CisJfQorCisJaWYgKChzaW5nbGVfY29uZmlnICUgMikgJiYgKHJlZiAhPSBNRV9SRUZfQUlfR1JPVU5EKSkgeworCQlQRVJST1IoIkludmFsaWQgYW5hbG9nIHJlZmVyZW5jZSBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfUkVGOworCX0KKworCWlmICgocmVmID09IE1FX1JFRl9BSV9ESUZGRVJFTlRJQUwpCisJICAgICYmICgoaW5zdGFuY2UtPmNoYW5uZWxzID09IDE2KSB8fCAoY2hhbm5lbCA+PSAxNikpKSB7CisJCVBFUlJPUigiSW52YWxpZCBhbmFsb2cgcmVmZXJlbmNlIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9SRUY7CisJfQorCisJaWYgKGNoYW5uZWwgPCAwKSB7CisJCVBFUlJPUigiSW52YWxpZCBjaGFubmVsIG51bWJlciBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwl9CisKKwlpZiAoY2hhbm5lbCA+PSBpbnN0YW5jZS0+Y2hhbm5lbHMpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGNoYW5uZWwgbnVtYmVyIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCX0KKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisJLy9QcmVwYXJlIGRhdGEgZW50cnkuCisJLy8gQ29tbW9uIGZvciBhbGwgbW9kZXMuCisJaW5zdGFuY2UtPnNpbmdsZV9jb25maWdbY2hhbm5lbF0uZW50cnkgPQorCSAgICBjaGFubmVsIHwgTUU0NjAwX0FJX0xJU1RfTEFTVF9FTlRSWTsKKworCWlmIChyZWYgPT0gTUVfUkVGX0FJX0RJRkZFUkVOVElBTCkgewkvLyBNRV9SRUZfQUlfRElGRkVSRU5USUFMCisJCWluc3RhbmNlLT5zaW5nbGVfY29uZmlnW2NoYW5uZWxdLmVudHJ5IHw9CisJCSAgICBNRTQ2MDBfQUlfTElTVF9JTlBVVF9ESUZGRVJFTlRJQUw7CisJfQorLyoKKwkJLy8gTUU0NjAwX0FJX0xJU1RfSU5QVVRfU0lOR0xFX0VOREVEID0gMHgwMDAwCisJCS8vICdlbnRyeSB8PSBNRTQ2MDBfQUlfTElTVF9JTlBVVF9TSU5HTEVfRU5ERUQnIDw9PSBEbyBub3RoaW5nLiBSZW1vdmVkLgorCQllbHNlCisJCXsvLyBNRV9SRUZfQUlfR1JPVU5ECisJCQlpbnN0YW5jZS0+c2luZ2xlX2NvbmZpZ1tjaGFubmVsXS5lbnRyeSB8PSBNRTQ2MDBfQUlfTElTVF9JTlBVVF9TSU5HTEVfRU5ERUQ7CisJCX0KKyovCisJc3dpdGNoIChzaW5nbGVfY29uZmlnKSB7CisJY2FzZSAwOgkJLy8tMTBWLi4xMFYKKy8qCisJCQkJCS8vIE1FNDYwMF9BSV9MSVNUX1JBTkdFX0JJUE9MQVJfMTAgPSAweDAwMDAKKwkJCQkJLy8gJ2VudHJ5IHw9IE1FNDYwMF9BSV9MSVNUX1JBTkdFX0JJUE9MQVJfMTAnIDw9PSBEbyBub3RoaW5nLiBSZW1vdmVkLgorCQkJCQlpbnN0YW5jZS0+c2luZ2xlX2NvbmZpZ1tjaGFubmVsXS5lbnRyeSB8PSBNRTQ2MDBfQUlfTElTVF9SQU5HRV9CSVBPTEFSXzEwOworKi8gYnJlYWs7CisKKwljYXNlIDE6CQkvLzBWLi4xMFYKKwkJaW5zdGFuY2UtPnNpbmdsZV9jb25maWdbY2hhbm5lbF0uZW50cnkgfD0KKwkJICAgIE1FNDYwMF9BSV9MSVNUX1JBTkdFX1VOSVBPTEFSXzEwOworCQlicmVhazsKKworCWNhc2UgMjoJCS8vLTIuNVYuLjIuNVYKKwkJaW5zdGFuY2UtPnNpbmdsZV9jb25maWdbY2hhbm5lbF0uZW50cnkgfD0KKwkJICAgIE1FNDYwMF9BSV9MSVNUX1JBTkdFX0JJUE9MQVJfMl81OworCQlicmVhazsKKworCWNhc2UgMzoJCS8vMFYuLjIuNVYKKwkJaW5zdGFuY2UtPnNpbmdsZV9jb25maWdbY2hhbm5lbF0uZW50cnkgfD0KKwkJICAgIE1FNDYwMF9BSV9MSVNUX1JBTkdFX1VOSVBPTEFSXzJfNTsKKwkJYnJlYWs7CisJfQorCisJLy8gUHJlcGFyZSBjb250cm9sIHJlZ2lzdGVyLgorCS8vIENvbW1vbiBmb3IgYWxsIG1vZGVzLgorCWluc3RhbmNlLT5zaW5nbGVfY29uZmlnW2NoYW5uZWxdLmN0cmwgPQorCSAgICBNRTQ2MDBfQUlfQ1RSTF9CSVRfQ0hBTk5FTF9GSUZPIHwgTUU0NjAwX0FJX0NUUkxfQklUX0RBVEFfRklGTzsKKworCXN3aXRjaCAodHJpZ190eXBlKSB7CisJY2FzZSBNRV9UUklHX1RZUEVfU1c6CisJCS8vIE5vdGhpbmcgdG8gc2V0LgorCQlicmVhazsKKworCWNhc2UgTUVfVFJJR19UWVBFX0VYVF9BTkFMT0c6CisJCWluc3RhbmNlLT5zaW5nbGVfY29uZmlnW2NoYW5uZWxdLmN0cmwgfD0KKwkJICAgIE1FNDYwMF9BSV9DVFJMX0JJVF9FWF9UUklHX0FOQUxPRzsKKworCWNhc2UgTUVfVFJJR19UWVBFX0VYVF9ESUdJVEFMOgorCQlpbnN0YW5jZS0+c2luZ2xlX2NvbmZpZ1tjaGFubmVsXS5jdHJsIHw9CisJCSAgICBNRTQ2MDBfQUlfQ1RSTF9CSVRfRVhfVFJJRzsKKwkJYnJlYWs7CisJfQorCisJc3dpdGNoICh0cmlnX2VkZ2UpIHsKKwljYXNlIE1FX1RSSUdfRURHRV9SSVNJTkc6CisJCS8vIE5vdGhpbmcgdG8gc2V0LgorCQlicmVhazsKKworCWNhc2UgTUVfVFJJR19FREdFX0FOWToKKwkJaW5zdGFuY2UtPnNpbmdsZV9jb25maWdbY2hhbm5lbF0uY3RybCB8PQorCQkgICAgTUU0NjAwX0FJX0NUUkxfQklUX0VYX1RSSUdfQk9USDsKKworCWNhc2UgTUVfVFJJR19FREdFX0ZBTExJTkc6CisJCWluc3RhbmNlLT5zaW5nbGVfY29uZmlnW2NoYW5uZWxdLmN0cmwgfD0KKwkJICAgIE1FNDYwMF9BSV9DVFJMX0JJVF9FWF9UUklHX0ZBTExJTkc7CisJCWJyZWFrOworCX0KKworCS8vIEVuYWJsZSB0aGlzIGNoYW5uZWwKKwlpbnN0YW5jZS0+c2luZ2xlX2NvbmZpZ1tjaGFubmVsXS5zdGF0dXMgPSBNRV9TSU5HTEVfQ0hBTk5FTF9DT05GSUdVUkVEOworCisJLy8gQ29weSB0aGlzIHNldHRpbmdzIHRvIG90aGVyIG91dHB1dHMuCisJaWYgKGZsYWdzID09IE1FX0lPX1NJTkdMRV9DT05GSUdfQ09OVElOVUUpIHsKKwkJZm9yIChpID0gY2hhbm5lbCArIDE7IGkgPCBpbnN0YW5jZS0+Y2hhbm5lbHM7IGkrKykgeworCQkJaW5zdGFuY2UtPnNpbmdsZV9jb25maWdbaV0uY3RybCA9CisJCQkgICAgaW5zdGFuY2UtPnNpbmdsZV9jb25maWdbY2hhbm5lbF0uY3RybDsKKwkJCWluc3RhbmNlLT5zaW5nbGVfY29uZmlnW2ldLmVudHJ5ID0KKwkJCSAgICBpbnN0YW5jZS0+c2luZ2xlX2NvbmZpZ1tjaGFubmVsXS5lbnRyeTsKKwkJCWluc3RhbmNlLT5zaW5nbGVfY29uZmlnW2ldLnN0YXR1cyA9CisJCQkgICAgTUVfU0lOR0xFX0NIQU5ORUxfQ09ORklHVVJFRDsKKwkJfQorCX0KKworCWluc3RhbmNlLT5zdGF0dXMgPSBhaV9zdGF0dXNfc2luZ2xlX2NvbmZpZ3VyZWQ7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lNDYwMF9haV9pb19zaW5nbGVfcmVhZChtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICBpbnQgY2hhbm5lbCwKKwkJCQkgICAgaW50ICp2YWx1ZSwgaW50IHRpbWVfb3V0LCBpbnQgZmxhZ3MpCit7CisJbWU0NjAwX2FpX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwl2b2xhdGlsZSB1aW50MzJfdCB0bXA7CisJdm9sYXRpbGUgdWludDMyX3QgdmFsOworCXVuc2lnbmVkIGxvbmcgY3B1X2ZsYWdzOworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCisJdW5zaWduZWQgbG9uZyBqOworCXVuc2lnbmVkIGxvbmcgZGVsYXkgPSAwOworCisJUERFQlVHKCJleGVjdXRlZC4gaWR4PTBcbiIpOworCisJaW5zdGFuY2UgPSAobWU0NjAwX2FpX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCWlmIChmbGFncykgeworCQlQRVJST1IoIkludmFsaWQgZmxhZyBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJfQorCisJaWYgKGluc3RhbmNlLT5zdGF0dXMgIT0gYWlfc3RhdHVzX3NpbmdsZV9jb25maWd1cmVkKSB7CisJCVBFUlJPUigiU3ViZGV2aWNlIG5vdCBjb25maWd1cmVkIHRvIHdvcmsgaW4gc2luZ2xlIG1vZGUhXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX1BSRVZJT1VTX0NPTkZJRzsKKwl9CisKKwlpZiAoKGNoYW5uZWwgPiBpbnN0YW5jZS0+Y2hhbm5lbHMpIHx8IChjaGFubmVsIDwgMCkpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGNoYW5uZWwgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJfQorCisJaWYgKHRpbWVfb3V0IDwgMCkgeworCQlQRVJST1IoIkludmFsaWQgdGltZW91dCBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfVElNRU9VVDsKKwl9CisKKwlpZiAoaW5zdGFuY2UtPnNpbmdsZV9jb25maWdbY2hhbm5lbF0uc3RhdHVzICE9CisJICAgIE1FX1NJTkdMRV9DSEFOTkVMX0NPTkZJR1VSRUQpIHsKKwkJUEVSUk9SKCJDaGFubmVsIGlzIG5vdCBjb25maWd1cmVkIHRvIHdvcmsgaW4gc2luZ2xlIG1vZGUhXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX1BSRVZJT1VTX0NPTkZJRzsKKwl9CisKKwlpZiAoaW5sKGluc3RhbmNlLT5zdGF0dXNfcmVnKSAmIE1FNDYwMF9BSV9TVEFUVVNfQklUX0ZTTSkgeworCQlQRVJST1IoIlN1YmRldmljZSBpcyBidXN5LlxuIik7CisJCXJldHVybiBNRV9FUlJOT19TVUJERVZJQ0VfQlVTWTsKKwl9CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwkvLyBDYW5jZWwgY29udHJvbCB0YXNrCisJUERFQlVHKCJDYW5jZWwgY29udHJvbCB0YXNrLlxuIik7CisJaW5zdGFuY2UtPmFpX2NvbnRyb2xfdGFza19mbGFnID0gMDsKKwljYW5jZWxfZGVsYXllZF93b3JrKCZpbnN0YW5jZS0+YWlfY29udHJvbF90YXNrKTsKKworCWlmICh0aW1lX291dCkgeworCQlkZWxheSA9ICh0aW1lX291dCAqIEhaKSAvIDEwMDA7CisKKwkJaWYgKGRlbGF5ID09IDApCisJCQlkZWxheSA9IDE7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKworCS8vIE1hcmsgdGhhdCBTdHJlYW1Db25maWcgaXMgcmVtb3ZlZC4KKwlpbnN0YW5jZS0+Y2hhbl9saXN0X2xlbiA9IDA7CisKKwlzcGluX2xvY2tfaXJxc2F2ZShpbnN0YW5jZS0+Y3RybF9yZWdfbG9jaywgY3B1X2ZsYWdzKTsKKwkvLy8gQG5vdGUgSW1wcnRhbnQ6IFByZXNlcnZlIEVYVCBJUlEgc2V0dGluZ3MuCisJdG1wID0gaW5sKGluc3RhbmNlLT5jdHJsX3JlZyk7CisJLy8gQ2xlYXIgRklGT3MgYW5kIGRpc3NhYmxlIGludGVycnVwdHMKKwl0bXAgJj0KKwkgICAgfihNRTQ2MDBfQUlfQ1RSTF9CSVRfQ0hBTk5FTF9GSUZPIHwgTUU0NjAwX0FJX0NUUkxfQklUX0RBVEFfRklGTyk7CisKKwl0bXAgJj0KKwkgICAgfihNRTQ2MDBfQUlfQ1RSTF9CSVRfU0NfSVJRIHwgTUU0NjAwX0FJX0NUUkxfQklUX0hGX0lSUSB8CisJICAgICAgTUU0NjAwX0FJX0NUUkxfQklUX0xFX0lSUSk7CisJdG1wIHw9CisJICAgIE1FNDYwMF9BSV9DVFJMX0JJVF9TQ19JUlFfUkVTRVQgfCBNRTQ2MDBfQUlfQ1RSTF9CSVRfSEZfSVJRX1JFU0VUIHwKKwkgICAgTUU0NjAwX0FJX0NUUkxfQklUX0xFX0lSUV9SRVNFVDsKKworCXRtcCB8PSBNRTQ2MDBfQUlfQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1A7CisJb3V0bCh0bXAsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIHRtcCk7CisKKwlvdXRsKDAsIGluc3RhbmNlLT5zY2FuX3ByZV90aW1lcl9sb3dfcmVnKTsKKwlQREVCVUdfUkVHKCJzY2FuX3ByZV90aW1lcl9sb3dfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPnNjYW5fcHJlX3RpbWVyX2xvd19yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIDApOworCW91dGwoMCwgaW5zdGFuY2UtPnNjYW5fcHJlX3RpbWVyX2hpZ2hfcmVnKTsKKwlQREVCVUdfUkVHKCJzY2FuX3ByZV90aW1lcl9oaWdoX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5zY2FuX3ByZV90aW1lcl9oaWdoX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgMCk7CisJb3V0bCgwLCBpbnN0YW5jZS0+c2Nhbl90aW1lcl9sb3dfcmVnKTsKKwlQREVCVUdfUkVHKCJzY2FuX3RpbWVyX2xvd19yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+c2Nhbl90aW1lcl9sb3dfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCAwKTsKKwlvdXRsKDAsIGluc3RhbmNlLT5zY2FuX3RpbWVyX2hpZ2hfcmVnKTsKKwlQREVCVUdfUkVHKCJzY2FuX3RpbWVyX2hpZ2hfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPnNjYW5fdGltZXJfaGlnaF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIDApOworCW91dGwoNjUsIGluc3RhbmNlLT5jaGFuX3RpbWVyX3JlZyk7CisJUERFQlVHX1JFRygiY2hhbl90aW1lcl9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+Y2hhbl90aW1lcl9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIDY1KTsKKwlvdXRsKDY1LCBpbnN0YW5jZS0+Y2hhbl9wcmVfdGltZXJfcmVnKTsKKwlQREVCVUdfUkVHKCJjaGFuX3ByZV90aW1lcl9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+Y2hhbl9wcmVfdGltZXJfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCA2NSk7CisKKwkvL1JlYWN0aXZlIEZJRk9zLiBFbmFibGUgd29yay4KKwl0bXAgfD0gTUU0NjAwX0FJX0NUUkxfQklUX0NIQU5ORUxfRklGTyB8IE1FNDYwMF9BSV9DVFJMX0JJVF9EQVRBX0ZJRk87CisJb3V0bCh0bXAsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIHRtcCk7CisKKwlvdXRsKGluc3RhbmNlLT5zaW5nbGVfY29uZmlnW2NoYW5uZWxdLmVudHJ5LAorCSAgICAgaW5zdGFuY2UtPmNoYW5uZWxfbGlzdF9yZWcpOworCVBERUJVR19SRUcoImNoYW5uZWxfbGlzdF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+Y2hhbm5lbF9saXN0X3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPnNpbmdsZV9jb25maWdbY2hhbm5lbF0uZW50cnkpOworCisJLy8gUHJlc2VydmUgRVhUIElSUSBzZXR0aW5ncy4KKwl0bXAgJj0gKE1FNDYwMF9BSV9DVFJMX0JJVF9FWF9JUlEgfCBNRTQ2MDBfQUlfQ1RSTF9CSVRfRVhfSVJRX1JFU0VUKTsKKwlvdXRsKGluc3RhbmNlLT5zaW5nbGVfY29uZmlnW2NoYW5uZWxdLmN0cmwgfCB0bXAsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5zaW5nbGVfY29uZmlnW2NoYW5uZWxdLmN0cmwgfCB0bXApOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShpbnN0YW5jZS0+Y3RybF9yZWdfbG9jaywgY3B1X2ZsYWdzKTsKKworCWlmICghKGluc3RhbmNlLT5zaW5nbGVfY29uZmlnW2NoYW5uZWxdLmN0cmwgJiBNRTQ2MDBfQUlfQ1RSTF9CSVRfRVhfVFJJRykpIHsJLy8gU29mdHdhcmUgc3RhcnQKKwkJaW5sKGluc3RhbmNlLT5zdGFydF9yZWcpOworCQlQREVCVUdfUkVHKCJzdGFydF9yZWcgaW5sKDB4JWxYKzB4JWxYKVxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPnN0YXJ0X3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSk7CisKKwkJZGVsYXkgPSAyOworCX0KKworCWogPSBqaWZmaWVzOworCisJd2hpbGUgKCEoaW5sKGluc3RhbmNlLT5zdGF0dXNfcmVnKSAmIE1FNDYwMF9BSV9TVEFUVVNfQklUX0VGX0RBVEEpKSB7CisJCWlmIChkZWxheSAmJiAoKGppZmZpZXMgLSBqKSA+PSBkZWxheSkpIHsKKwkJCWlmICghKGluc3RhbmNlLT5zaW5nbGVfY29uZmlnW2NoYW5uZWxdLmN0cmwgJiBNRTQ2MDBfQUlfQ1RSTF9CSVRfRVhfVFJJRykpIHsJLy8gU29mdHdhcmUgc3RhcnQuCisJCQkJUEVSUk9SKCJWYWx1ZSBub3QgYXZhaWxhYmxlIGFmdGVyIHdhaXQuXG4iKTsKKwkJCQllcnIgPSBNRV9FUlJOT19JTlRFUk5BTDsKKwkJCX0gZWxzZSB7CS8vIEV4dGVybmFsIHN0YXJ0LgorCQkJCVBFUlJPUigiVGltZW91dCByZWFjaGVkLlxuIik7CisJCQkJZXJyID0gTUVfRVJSTk9fVElNRU9VVDsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJCS8vIFdhaXQKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJc2NoZWR1bGVfdGltZW91dCgxKTsKKworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCVBFUlJPUgorCQkJICAgICgiV2FpdCBvbiBleHRlcm5hbCB0cmlnZ2VyIGludGVycnVwdGVkIGJ5IHNpZ25hbC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fU0lHTkFMOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoaW5zdGFuY2UtPnN0YXR1cyAhPSBhaV9zdGF0dXNfc2luZ2xlX2NvbmZpZ3VyZWQpIHsKKwkJCVBFUlJPUigiV2FpdCBpbnRlcnJ1cHRlZCBieSByZXNldC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fQ0FOQ0VMTEVEOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvLyBSZWFkIHZhbHVlLgorCWlmICghZXJyKSB7CisJCXZhbCA9IGlubChpbnN0YW5jZS0+ZGF0YV9yZWcpIF4gMHg4MDAwOworCQlQREVCVUdfUkVHKCJkYXRhX3JlZyBpbmwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkgICBpbnN0YW5jZS0+ZGF0YV9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIHZhbCk7CisJCSp2YWx1ZSA9IHZhbCAmIE1FNDYwMF9BSV9NQVhfREFUQTsKKwl9IGVsc2UgeworCQkqdmFsdWUgPSAweEZGRkZGRkZGOworCX0KKworCS8vIFJlc3RvcmUgc2V0dGluZ3MuCisJc3Bpbl9sb2NrX2lycXNhdmUoaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2ssIGNwdV9mbGFncyk7CisJdG1wID0gaW5sKGluc3RhbmNlLT5jdHJsX3JlZyk7CisJLy8gQ2xlYXIgRklGT3MgYW5kIGRpc3NhYmxlIGludGVycnVwdHMuCisJdG1wICY9CisJICAgIH4oTUU0NjAwX0FJX0NUUkxfQklUX0NIQU5ORUxfRklGTyB8IE1FNDYwMF9BSV9DVFJMX0JJVF9EQVRBX0ZJRk8pOworCXRtcCB8PSBNRTQ2MDBfQUlfQ1RSTF9CSVRfU0NfSVJRIHwgTUU0NjAwX0FJX0NUUkxfQklUX0hGX0lSUTsKKwl0bXAgfD0KKwkgICAgTUU0NjAwX0FJX0NUUkxfQklUX1NDX0lSUV9SRVNFVCB8IE1FNDYwMF9BSV9DVFJMX0JJVF9IRl9JUlFfUkVTRVQgfAorCSAgICBNRTQ2MDBfQUlfQ1RSTF9CSVRfTEVfSVJRX1JFU0VUIHwgTUU0NjAwX0FJX0NUUkxfQklUX0lNTUVESUFURV9TVE9QOworCW91dGwodG1wLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCB0bXApOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2ssIGNwdV9mbGFncyk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWU0NjAwX2FpX2lvX3N0cmVhbV9jb25maWcobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICAgIG1lSU9TdHJlYW1Db25maWdfdCAqIGNvbmZpZ19saXN0LAorCQkJCSAgICAgIGludCBjb3VudCwKKwkJCQkgICAgICBtZUlPU3RyZWFtVHJpZ2dlcl90ICogdHJpZ2dlciwKKwkJCQkgICAgICBpbnQgZmlmb19pcnFfdGhyZXNob2xkLCBpbnQgZmxhZ3MpCit7CisJbWU0NjAwX2FpX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwlpbnQgaTsJCQkvLyBpbnRlcm5hbCBtdWx0aXB1cnBvc2UgdmFyaWFibGUKKwl1bnNpZ25lZCBsb25nIGxvbmcgZGF0YV9yZXF1aXJlZDsKKworCXZvbGF0aWxlIHVpbnQzMl90IGVudHJ5OworCXZvbGF0aWxlIHVpbnQzMl90IGN0cmwgPSBNRTQ2MDBfQUlfQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1A7CisJdm9sYXRpbGUgdWludDMyX3QgdG1wOwkvLyB1c2Ugd2hlbiBjdXJyZW50IGNvcHkgb2YgcmVnaXN0ZXIncyB2YWx1ZSBuZWVkZWQKKwl1bnNpZ25lZCBsb25nIGNwdV9mbGFnczsKKworCXVpbnQ2NF90IGFjcV90aWNrczsKKwl1aW50NjRfdCBzY2FuX3RpY2tzOworCXVpbnQ2NF90IGNvbnZfdGlja3M7CisJdW5zaWduZWQgaW50IGFjcV9zdGFydF90aWNrc19sb3cgPSB0cmlnZ2VyLT5pQWNxU3RhcnRUaWNrc0xvdzsKKwl1bnNpZ25lZCBpbnQgYWNxX3N0YXJ0X3RpY2tzX2hpZ2ggPSB0cmlnZ2VyLT5pQWNxU3RhcnRUaWNrc0hpZ2g7CisJdW5zaWduZWQgaW50IHNjYW5fc3RhcnRfdGlja3NfbG93ID0gdHJpZ2dlci0+aVNjYW5TdGFydFRpY2tzTG93OworCXVuc2lnbmVkIGludCBzY2FuX3N0YXJ0X3RpY2tzX2hpZ2ggPSB0cmlnZ2VyLT5pU2NhblN0YXJ0VGlja3NIaWdoOworCXVuc2lnbmVkIGludCBjb252X3N0YXJ0X3RpY2tzX2xvdyA9IHRyaWdnZXItPmlDb252U3RhcnRUaWNrc0xvdzsKKwl1bnNpZ25lZCBpbnQgY29udl9zdGFydF90aWNrc19oaWdoID0gdHJpZ2dlci0+aUNvbnZTdGFydFRpY2tzSGlnaDsKKworCVBERUJVRygiZXhlY3V0ZWQuIGlkeD0wXG4iKTsKKworCWluc3RhbmNlID0gKG1lNDYwMF9haV9zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlpZiAoZmxhZ3MpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWcgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCU1FX1NVQkRFVklDRV9FTlRFUgorCSAgICAvLyBDb252ZXJ0IHRpY2tzIHRvIDY0IGJpdCBsb25nIHZhbHVlcworCSAgICBhY3FfdGlja3MgPQorCSAgICAodWludDY0X3QpIGFjcV9zdGFydF90aWNrc19sb3cgKworCSAgICAoKHVpbnQ2NF90KSBhY3Ffc3RhcnRfdGlja3NfaGlnaCA8PCAzMik7CisJc2Nhbl90aWNrcyA9CisJICAgICh1aW50NjRfdCkgc2Nhbl9zdGFydF90aWNrc19sb3cgKworCSAgICAoKHVpbnQ2NF90KSBzY2FuX3N0YXJ0X3RpY2tzX2hpZ2ggPDwgMzIpOworCWNvbnZfdGlja3MgPQorCSAgICAodWludDY0X3QpIGNvbnZfc3RhcnRfdGlja3NfbG93ICsKKwkgICAgKCh1aW50NjRfdCkgY29udl9zdGFydF90aWNrc19oaWdoIDw8IDMyKTsKKworCS8vIENoZWNrIHNldHRpbmdzIC0gYmVnaW4KKwlzd2l0Y2ggKHRyaWdnZXItPmlBY3FTdGFydFRyaWdUeXBlKSB7CisJY2FzZSBNRV9UUklHX1RZUEVfU1c6CisJY2FzZSBNRV9UUklHX1RZUEVfRVhUX0RJR0lUQUw6CisJY2FzZSBNRV9UUklHX1RZUEVfRVhUX0FOQUxPRzoKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlQRVJST1IoIkludmFsaWQgYWNxdWlzaXRpb24gc3RhcnQgdHJpZ2dlciB0eXBlIHNwZWNpZmllZC5cbiIpOworCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0FDUV9TVEFSVF9UUklHX1RZUEU7CisJCWdvdG8gRVJST1I7CisJCWJyZWFrOworCX0KKworCWlmICgodHJpZ2dlci0+aUFjcVN0YXJ0VHJpZ1R5cGUgPT0gTUVfVFJJR19UWVBFX1NXKQorCSAgICAmJiAodHJpZ2dlci0+aUFjcVN0YXJ0VHJpZ0VkZ2UgIT0gTUVfVFJJR19FREdFX05PTkUpKSB7CisJCVBFUlJPUigiSW52YWxpZCBhY3F1aXNpdGlvbiBzdGFydCB0cmlnZ2VyIGVkZ2Ugc3BlY2lmaWVkLlxuIik7CisJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQUNRX1NUQVJUX1RSSUdfRURHRTsKKwkJZ290byBFUlJPUjsKKwl9CisKKwlpZiAodHJpZ2dlci0+aUFjcVN0YXJ0VHJpZ1R5cGUgIT0gTUVfVFJJR19UWVBFX1NXKSB7CisJCXN3aXRjaCAodHJpZ2dlci0+aUFjcVN0YXJ0VHJpZ0VkZ2UpIHsKKwkJY2FzZSBNRV9UUklHX0VER0VfUklTSU5HOgorCQljYXNlIE1FX1RSSUdfRURHRV9GQUxMSU5HOgorCQljYXNlIE1FX1RSSUdfRURHRV9BTlk6CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJUEVSUk9SCisJCQkgICAgKCJJbnZhbGlkIGFjcXVpc2l0aW9uIHN0YXJ0IHRyaWdnZXIgZWRnZSBzcGVjaWZpZWQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQUNRX1NUQVJUX1RSSUdfRURHRTsKKwkJCWdvdG8gRVJST1I7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmICh0cmlnZ2VyLT5pQWNxU3RhcnRUcmlnQ2hhbiAhPSBNRV9UUklHX0NIQU5fREVGQVVMVCkgeworCQlQRVJST1IKKwkJICAgICgiSW52YWxpZCBhY3F1aXNpdGlvbiBzdGFydCB0cmlnZ2VyIGNoYW5uZWwgc3BlY2lmaWVkLlxuIik7CisJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQUNRX1NUQVJUX1RSSUdfQ0hBTjsKKwkJZ290byBFUlJPUjsKKwl9CisKKwlpZiAoKGFjcV90aWNrcyA8IE1FNDYwMF9BSV9NSU5fQUNRX1RJQ0tTKQorCSAgICB8fCAoYWNxX3RpY2tzID4gTUU0NjAwX0FJX01BWF9BQ1FfVElDS1MpKSB7CisJCVBFUlJPUgorCQkgICAgKCJJbnZhbGlkIGFjcXVpc2l0aW9uIHN0YXJ0IHRyaWdnZXIgYXJndW1lbnQgc3BlY2lmaWVkLlxuIik7CisJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQUNRX1NUQVJUX0FSRzsKKwkJZ290byBFUlJPUjsKKwl9CisKKwlzd2l0Y2ggKHRyaWdnZXItPmlTY2FuU3RhcnRUcmlnVHlwZSkgeworCisJY2FzZSBNRV9UUklHX1RZUEVfVElNRVI6CisJCWlmICgoc2Nhbl90aWNrcyA8IE1FNDYwMF9BSV9NSU5fU0NBTl9USUNLUykKKwkJICAgIHx8IChzY2FuX3RpY2tzID4gTUU0NjAwX0FJX01BWF9TQ0FOX1RJQ0tTKQorCQkgICAgfHwgKHNjYW5fdGlja3MgPCBjb3VudCAqIGNvbnZfdGlja3MpCisJCSAgICApIHsKKwkJCVBFUlJPUigiSW52YWxpZCBzY2FuIHN0YXJ0IGFyZ3VtZW50IHNwZWNpZmllZC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9TQ0FOX1NUQVJUX0FSRzsKKwkJCWdvdG8gRVJST1I7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIE1FX1RSSUdfVFlQRV9FWFRfRElHSVRBTDoKKwkJaWYgKHRyaWdnZXItPmlBY3FTdGFydFRyaWdUeXBlICE9IE1FX1RSSUdfVFlQRV9FWFRfRElHSVRBTCkgeworCQkJUEVSUk9SCisJCQkgICAgKCJJbnZhbGlkIHNjYW4gc3RhcnQgdHJpZ2dlciB0eXBlIHNwZWNpZmllZCAoQWNxIGlzIEhXIGRpZ2l0YWwpXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfU0NBTl9TVEFSVF9UUklHX1RZUEU7CisJCQlnb3RvIEVSUk9SOworCQl9CisJCWJyZWFrOworCisJY2FzZSBNRV9UUklHX1RZUEVfRVhUX0FOQUxPRzoKKwkJaWYgKHRyaWdnZXItPmlBY3FTdGFydFRyaWdUeXBlICE9IE1FX1RSSUdfVFlQRV9FWFRfQU5BTE9HKSB7CisJCQlQRVJST1IKKwkJCSAgICAoIkludmFsaWQgc2NhbiBzdGFydCB0cmlnZ2VyIHR5cGUgc3BlY2lmaWVkIChBY3EgaXMgSFcgYW5hbG9nKVxuIik7CisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX1NDQU5fU1RBUlRfVFJJR19UWVBFOworCQkJZ290byBFUlJPUjsKKwkJfQorCQlicmVhazsKKworCWNhc2UgTUVfVFJJR19UWVBFX0ZPTExPVzoKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlQRVJST1IoIkludmFsaWQgc2NhbiBzdGFydCB0cmlnZ2VyIHR5cGUgc3BlY2lmaWVkLlxuIik7CisJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfU0NBTl9TVEFSVF9UUklHX1RZUEU7CisJCWdvdG8gRVJST1I7CisJCWJyZWFrOworCX0KKworCXN3aXRjaCAodHJpZ2dlci0+aUNvbnZTdGFydFRyaWdUeXBlKSB7CisKKwljYXNlIE1FX1RSSUdfVFlQRV9USU1FUjoKKwkJaWYgKChjb252X3RpY2tzIDwgTUU0NjAwX0FJX01JTl9DSEFOX1RJQ0tTKQorCQkgICAgfHwgKGNvbnZfdGlja3MgPiBNRTQ2MDBfQUlfTUFYX0NIQU5fVElDS1MpKSB7CisJCQlQRVJST1IKKwkJCSAgICAoIkludmFsaWQgY29udiBzdGFydCB0cmlnZ2VyIGFyZ3VtZW50IHNwZWNpZmllZC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DT05WX1NUQVJUX0FSRzsKKwkJCWdvdG8gRVJST1I7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIE1FX1RSSUdfVFlQRV9FWFRfRElHSVRBTDoKKwkJaWYgKCh0cmlnZ2VyLT5pU2NhblN0YXJ0VHJpZ1R5cGUgIT0gTUVfVFJJR19UWVBFX0ZPTExPVykKKwkJICAgIHx8ICh0cmlnZ2VyLT5pQWNxU3RhcnRUcmlnVHlwZSAhPQorCQkJTUVfVFJJR19UWVBFX0VYVF9ESUdJVEFMKSkgeworCQkJUEVSUk9SKCJJbnZhbGlkIGNvbnYgc3RhcnQgdHJpZ2dlciB0eXBlIHNwZWNpZmllZC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DT05WX1NUQVJUX1RSSUdfVFlQRTsKKwkJCWdvdG8gRVJST1I7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIE1FX1RSSUdfVFlQRV9FWFRfQU5BTE9HOgorCQlpZiAoKHRyaWdnZXItPmlTY2FuU3RhcnRUcmlnVHlwZSAhPSBNRV9UUklHX1RZUEVfRk9MTE9XKQorCQkgICAgfHwgKHRyaWdnZXItPmlBY3FTdGFydFRyaWdUeXBlICE9CisJCQlNRV9UUklHX1RZUEVfRVhUX0FOQUxPRykpIHsKKwkJCVBFUlJPUigiSW52YWxpZCBjb252IHN0YXJ0IHRyaWdnZXIgdHlwZSBzcGVjaWZpZWQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQ09OVl9TVEFSVF9UUklHX1RZUEU7CisJCQlnb3RvIEVSUk9SOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJUEVSUk9SKCJJbnZhbGlkIGNvbnYgc3RhcnQgdHJpZ2dlciB0eXBlIHNwZWNpZmllZC5cbiIpOworCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0NPTlZfU1RBUlRfVFJJR19UWVBFOworCQlnb3RvIEVSUk9SOworCisJCWJyZWFrOworCX0KKy8qKgorKiBBY2VwdGFibGUgc2V0dGluZ3M6CisqIGlTY2FuU3RvcFRyaWdUeXBlCQk6CWlBY3FTdG9wVHJpZ1R5cGUKKyoKKyogTUVfVFJJR19UWVBFX05PTkUJCToJTUVfVFJJR19UWVBFX05PTkUJLT4gaW5maW5pdGUgY291bnQgd2l0aCBtYW51YWwgc3RvcAorKiBNRV9UUklHX1RZUEVfTk9ORQkJOglNRV9UUklHX1RZUEVfQ09VTlQJLT4gc3RvcCBhZnRlciBnZXR0aW5nIGlTY2FuU3RvcENvdW50IGxpc3Qgb2YgdmFsdWVzIChpU2NhblN0b3BDb3VudCAqIGNvdW50KQorKiBNRV9UUklHX1RZUEVfQ09VTlQJOglNRV9UUklHX1RZUEVfRk9MTE9XCS0+IHN0b3AgYWZ0ZXIgZ2V0dGluZyBpQWNxU3RvcENvdW50IHZhbHVlcyAoaXQgY2FuIHN0b3BzIGluIG1pZGxlIG9mIHRoZSBsaXN0KQorKi8KKwlzd2l0Y2ggKHRyaWdnZXItPmlTY2FuU3RvcFRyaWdUeXBlKSB7CisKKwljYXNlIE1FX1RSSUdfVFlQRV9OT05FOgorCQlicmVhazsKKworCWNhc2UgTUVfVFJJR19UWVBFX0NPVU5UOgorCQlpZiAodHJpZ2dlci0+aVNjYW5TdG9wQ291bnQgPD0gMCkgeworCQkJUEVSUk9SKCJJbnZhbGlkIHNjYW4gc3RvcCBhcmd1bWVudCBzcGVjaWZpZWQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfU0NBTl9TVE9QX0FSRzsKKwkJCWdvdG8gRVJST1I7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlQRVJST1IoIkludmFsaWQgc2NhbiBzdG9wIHRyaWdnZXIgdHlwZSBzcGVjaWZpZWQuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9TQ0FOX1NUT1BfVFJJR19UWVBFOworCQlnb3RvIEVSUk9SOworCQlicmVhazsKKwl9CisKKwlzd2l0Y2ggKHRyaWdnZXItPmlBY3FTdG9wVHJpZ1R5cGUpIHsKKworCWNhc2UgTUVfVFJJR19UWVBFX05PTkU6CisJCWlmICh0cmlnZ2VyLT5pU2NhblN0b3BUcmlnVHlwZSAhPSBNRV9UUklHX1RZUEVfTk9ORSkgeworCQkJUEVSUk9SKCJJbnZhbGlkIGFjcSBzdG9wIHRyaWdnZXIgdHlwZSBzcGVjaWZpZWQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQUNRX1NUT1BfVFJJR19UWVBFOworCQkJZ290byBFUlJPUjsKKwkJfQorCQlicmVhazsKKworCWNhc2UgTUVfVFJJR19UWVBFX0ZPTExPVzoKKwkJaWYgKHRyaWdnZXItPmlTY2FuU3RvcFRyaWdUeXBlICE9IE1FX1RSSUdfVFlQRV9DT1VOVCkgeworCQkJUEVSUk9SKCJJbnZhbGlkIGFjcSBzdG9wIHRyaWdnZXIgdHlwZSBzcGVjaWZpZWQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQUNRX1NUT1BfVFJJR19UWVBFOworCQkJZ290byBFUlJPUjsKKwkJfQorCQlicmVhazsKKworCWNhc2UgTUVfVFJJR19UWVBFX0NPVU5UOgorCQlpZiAodHJpZ2dlci0+aVNjYW5TdG9wVHJpZ1R5cGUgIT0gTUVfVFJJR19UWVBFX05PTkUpIHsKKwkJCVBFUlJPUigiSW52YWxpZCBhY3Egc3RvcCB0cmlnZ2VyIHR5cGUgc3BlY2lmaWVkLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0FDUV9TVE9QX1RSSUdfVFlQRTsKKwkJCWdvdG8gRVJST1I7CisJCX0KKworCQlpZiAodHJpZ2dlci0+aUFjcVN0b3BDb3VudCA8PSAwKSB7CisJCQlQRVJST1IKKwkJCSAgICAoIkludmFsaWQgYWNxdWlzaXRpb24gb3Igc2NhbiBzdG9wIGFyZ3VtZW50IHNwZWNpZmllZC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9BQ1FfU1RPUF9BUkc7CisJCQlnb3RvIEVSUk9SOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJUEVSUk9SKCJJbnZhbGlkIGFjcSBzdG9wIHRyaWdnZXIgdHlwZSBzcGVjaWZpZWQuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9BQ1FfU1RPUF9UUklHX1RZUEU7CisJCWdvdG8gRVJST1I7CisJCWJyZWFrOworCX0KKworCWlmICgoY291bnQgPD0gMCkgfHwgKGNvdW50ID4gTUU0NjAwX0FJX0xJU1RfQ09VTlQpKSB7CisJCVBFUlJPUigiSW52YWxpZCBjaGFubmVsIGxpc3QgY291bnQgc3BlY2lmaWVkLlxuIik7CisJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQ09ORklHX0xJU1RfQ09VTlQ7CisJCWdvdG8gRVJST1I7CisJfQorLy8vVGhpcyBpcyBnZW5lcmFsIGxpbWl0YXRpb24KKy8vICAgICAgaWYgKGZpZm9faXJxX3RocmVzaG9sZCA8IDAgfHwgZmlmb19pcnFfdGhyZXNob2xkID49IE1FNDYwMF9BSV9DSVJDX0JVRl9DT1VOVCkKKy8vL1RoaXMgaXMgbGltaXRhdGlvbiBmcm9tIFdpbmRvd3MuIEkgdXNlIGl0IGZvciBjb21wYXRpYmlsaXR5LgorCWlmIChmaWZvX2lycV90aHJlc2hvbGQgPCAwCisJICAgIHx8IGZpZm9faXJxX3RocmVzaG9sZCA+PSBNRTQ2MDBfQUlfRklGT19DT1VOVCkgeworCQlQRVJST1IoIkludmFsaWQgZmlmbyBpcnEgdGhyZXNob2xkIHNwZWNpZmllZC5cbiIpOworCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0ZJRk9fSVJRX1RIUkVTSE9MRDsKKwkJZ290byBFUlJPUjsKKwl9CisKKwlpZiAoKGNvbmZpZ19saXN0WzBdLmlSZWYgPT0gTUVfUkVGX0FJX0RJRkZFUkVOVElBTCkKKwkgICAgJiYgKGluc3RhbmNlLT5jaGFubmVscyA9PSAxNikpIHsKKwkJUEVSUk9SCisJCSAgICAoIkRpZmZlcmVudGlhbCByZWZlcmVuY2UgaXMgbm90IGF2YWlsYWJsZSBvbiB0aGlzIHN1YmRldmljZS5cbiIpOworCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX1JFRjsKKwkJZ290byBFUlJPUjsKKwl9CisKKwlpZiAoZmxhZ3MgJiBNRV9JT19TVFJFQU1fQ09ORklHX1NBTVBMRV9BTkRfSE9MRCkgeworCQlpZiAoIWluc3RhbmNlLT5zaCkgeworCQkJUEVSUk9SCisJCQkgICAgKCJTYW1wbGUgYW5kIGhvbGQgaXMgbm90IGF2YWlsYWJsZSBmb3IgdGhpcyBib2FyZC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwkJCWdvdG8gRVJST1I7CisJCX0KKwkJaWYgKGNvbmZpZ19saXN0WzBdLmlSZWYgPT0gTUVfUkVGX0FJX0RJRkZFUkVOVElBTCkgeworCQkJUEVSUk9SCisJCQkgICAgKCJTYW1wbGUgYW5kIGhvbGQgaXMgbm90IGF2YWlsYWJsZSBpbiBkaWZmZXJlbnRpYWwgbW9kZS5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwkJCWdvdG8gRVJST1I7CisJCX0KKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCQlpZiAoKGNvbmZpZ19saXN0W2ldLmlTdHJlYW1Db25maWcgPCAwKQorCQkgICAgfHwgKGNvbmZpZ19saXN0W2ldLmlTdHJlYW1Db25maWcgPj0gaW5zdGFuY2UtPnJhbmdlc19sZW4pKSB7CisJCQlQRVJST1IoIkludmFsaWQgc3RyZWFtIGNvbmZpZyBzcGVjaWZpZWQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfU1RSRUFNX0NPTkZJRzsKKwkJCWdvdG8gRVJST1I7CisJCX0KKworCQlpZiAoKGNvbmZpZ19saXN0W2ldLmlSZWYgIT0gTUVfUkVGX0FJX0dST1VORCkKKwkJICAgICYmIChjb25maWdfbGlzdFtpXS5pUmVmICE9IE1FX1JFRl9BSV9ESUZGRVJFTlRJQUwpKSB7CisJCQlQRVJST1IoIkludmFsaWQgcmVmZXJlbmNlcyBpbiB0aGUgbGlzdC4gUmVmPTB4JXhcbiIsCisJCQkgICAgICAgY29uZmlnX2xpc3RbaV0uaVJlZik7CisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX1JFRjsKKwkJCWdvdG8gRVJST1I7CisJCX0KKworCQlpZiAoY29uZmlnX2xpc3RbaV0uaVN0cmVhbUNvbmZpZyAlIDIpIHsJLy8gU3RyZWFtQ29uZmlnOiAxIG9yIDMKKwkJCWlmIChjb25maWdfbGlzdFtpXS5pUmVmID09IE1FX1JFRl9BSV9ESUZGRVJFTlRJQUwpIHsKKwkJCQlQRVJST1IKKwkJCQkgICAgKCJPbmx5IGJpcG9sYXIgbW9kZXMgc3VwcG9ydCBkaWZmZXJlbnRpYWwgbWVhc3VyZW1lbnQuXG4iKTsKKwkJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX1JFRjsKKwkJCQlnb3RvIEVSUk9SOworCQkJfQorCQl9CisKKwkJaWYgKGNvbmZpZ19saXN0W2ldLmlSZWYgIT0gY29uZmlnX2xpc3RbMF0uaVJlZikgeworCQkJUEVSUk9SCisJCQkgICAgKCJOb3QgYWxsIHJlZmVyZW5jZXMgaW4gdGhlIGNvbmZpZ3VyYXRpb24gbGlzdCBhcmUgZXF1YWwuIFJlZlswXT0weCV4IFJlZlslZF09MHgleFxuIiwKKwkJCSAgICAgY29uZmlnX2xpc3RbMF0uaVJlZiwgaSwgY29uZmlnX2xpc3RbaV0uaVJlZik7CisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX1JFRjsKKwkJCWdvdG8gRVJST1I7CisJCX0KKworCQlpZiAoKGNvbmZpZ19saXN0W2ldLmlSZWYgPT0gTUVfUkVGX0FJX0RJRkZFUkVOVElBTCkKKwkJICAgICYmIChjb25maWdfbGlzdFtpXS5pQ2hhbm5lbCA+PSAxNikpIHsKKwkJCVBFUlJPUigiQ2hhbm5lbCBub3QgYXZhaWxhYmxlIGluIGRpZmZlcmVudGlhbCBtb2RlLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJCQlnb3RvIEVSUk9SOworCQl9CisKKwkJaWYgKChjb25maWdfbGlzdFtpXS5pQ2hhbm5lbCA8IDApCisJCSAgICB8fCAoY29uZmlnX2xpc3RbaV0uaUNoYW5uZWwgPj0gaW5zdGFuY2UtPmNoYW5uZWxzKSkgeworCQkJUEVSUk9SKCJJbnZhbGlkIGNoYW5uZWwgbnVtYmVyIHNwZWNpZmllZC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCQkJZ290byBFUlJPUjsKKwkJfQorCX0KKworCS8vIENoZWNrIHNldHRpbmdzIC0gZW5kCisKKwkvL0NhbmNlbCBjb250cm9sIHRhc2sKKwlQREVCVUcoIkNhbmNlbCBjb250cm9sIHRhc2suXG4iKTsKKwlpbnN0YW5jZS0+YWlfY29udHJvbF90YXNrX2ZsYWcgPSAwOworCWNhbmNlbF9kZWxheWVkX3dvcmsoJmluc3RhbmNlLT5haV9jb250cm9sX3Rhc2spOworCisJLy8gV29yayBhcm91bmQgZnJvbSBLZWl0aCBIYXJ0bGV5IC0gYmVnaW4KKwlpZiAodHJpZ2dlci0+aVNjYW5TdGFydFRyaWdUeXBlID09IE1FX1RSSUdfVFlQRV9USU1FUikgeworCQlpZiAoY291bnQgPT0gMSkgeworCQkJLy8gVGhlIGhhcmR3YXJlIGRvZXMgbm90IHdvcmsgcHJvcGVybHkgd2l0aCBhIG5vbi16ZXJvIHNjYW4gdGltZQorCQkJLy8gaWYgdGhlcmUgaXMgb25seSBPTkUgY2hhbm5lbCBpbiB0aGUgY2hhbm5lbCBsaXN0LiBJbiB0aGlzIGNhc2UKKwkJCS8vIHdlIG11c3Qgc2V0IHRoZSBzY2FuIHRpbWUgdG8gemVybyBhbmQgdXNlIHRoZSBjaGFubmVsIHRpbWUuCisKKwkJCWNvbnZfdGlja3MgPSBzY2FuX3RpY2tzOworCQkJdHJpZ2dlci0+aVNjYW5TdGFydFRyaWdUeXBlID0gTUVfVFJJR19UWVBFX0ZPTExPVzsKKwkJfSBlbHNlIGlmIChzY2FuX3RpY2tzID09IGNvdW50ICogY29udl90aWNrcykgeworCQkJLy8gQW5vdGhlciBoYXJkd2FyZSBwcm9ibGVtLiBJZiB0aGUgbnVtYmVyIG9mIHNjYW4gdGlja3MgaXMKKwkJCS8vIGV4YWN0bHkgZXF1YWwgdG8gdGhlIG51bWJlciBvZiBjaGFubmVsIHRpY2tzIG11bHRpcGxpZWQgYnkKKwkJCS8vIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMgdGhlbiB0aGUgc2FtcGxpbmcgcmF0ZSBpcyByZWR1Y2VkCisJCQkvLyBieSBoYWxmLgorCQkJdHJpZ2dlci0+aVNjYW5TdGFydFRyaWdUeXBlID0gTUVfVFJJR19UWVBFX0ZPTExPVzsKKwkJfQorCX0KKwkvLyBXb3JrIGFyb3VuZCBmcm9tIEtlaXRoIEhhcnRsZXkgLSBlbmQKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisKKwlpZiAoaW5sKGluc3RhbmNlLT5zdGF0dXNfcmVnKSAmIE1FNDYwMF9BSV9TVEFUVVNfQklUX0ZTTSkgeworCQlQRVJST1IoIlN1YmRldmljZSBpcyBidXN5LlxuIik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKwkJTUVfU1VCREVWSUNFX0VYSVQ7CisJCXJldHVybiBNRV9FUlJOT19TVUJERVZJQ0VfQlVTWTsKKwl9CisKKwlpbnN0YW5jZS0+c3RhdHVzID0gYWlfc3RhdHVzX25vbmU7CisJc3Bpbl9sb2NrX2lycXNhdmUoaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2ssIGNwdV9mbGFncyk7CisJLy8gU3RvcCBhbGwgYWN0aW9ucy4gQmxvY2sgYWxsIGludGVycnVwdHMuIENsZWFyIChkaXNhYmxlKSBGSUZPcy4KKwljdHJsID0KKwkgICAgTUU0NjAwX0FJX0NUUkxfQklUX0xFX0lSUV9SRVNFVCB8IE1FNDYwMF9BSV9DVFJMX0JJVF9IRl9JUlFfUkVTRVQgfAorCSAgICBNRTQ2MDBfQUlfQ1RSTF9CSVRfU0NfSVJRX1JFU0VUOworCisJdG1wID0gaW5sKGluc3RhbmNlLT5jdHJsX3JlZyk7CisJLy8gUHJlc2VydmUgRVhUIElSUSBhbmQgT0ZGU0VUIHNldHRpbmdzLiBDbGVhbiBvdGhlciBiaXRzLgorCXRtcCAmPQorCSAgICAoTUU0NjAwX0FJX0NUUkxfQklUX0VYX0lSUSB8IE1FNDYwMF9BSV9DVFJMX0JJVF9FWF9JUlFfUkVTRVQgfAorCSAgICAgTUU0NjAwX0FJX0NUUkxfQklUX0ZVTExTQ0FMRSB8IE1FNDYwMF9BSV9DVFJMX0JJVF9PRkZTRVQpOworCisJLy8gU2VuZCBpdCB0byByZWdpc3Rlci4KKwlvdXRsKHRtcCB8IGN0cmwsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIHRtcCB8IGN0cmwpOworCisJLy8gRW5hYmxlIGNoYW5uZWwgZmlmbyAtPiBkYXRhIGZpZm8gaW4gc3RyZWFtX3N0YXJ0KCkuCisJY3RybCB8PSBNRTQ2MDBfQUlfQ1RSTF9CSVRfQ0hBTk5FTF9GSUZPOworCW91dGwodG1wIHwgY3RybCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgdG1wIHwgY3RybCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShpbnN0YW5jZS0+Y3RybF9yZWdfbG9jaywgY3B1X2ZsYWdzKTsKKworCS8vIFdyaXRlIHRoZSBjaGFubmVsIGxpc3QKKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCQllbnRyeSA9IGNvbmZpZ19saXN0W2ldLmlDaGFubmVsOworCisJCXN3aXRjaCAoY29uZmlnX2xpc3RbaV0uaVN0cmVhbUNvbmZpZykgeworCQljYXNlIDA6CS8vQklQT0xBUiAxMFYKKy8qCisJCQkJLy8gTUU0NjAwX0FJX0xJU1RfUkFOR0VfQklQT0xBUl8xMCA9IDB4MDAwMAorCQkJCS8vICdlbnRyeSB8PSBNRTQ2MDBfQUlfTElTVF9SQU5HRV9CSVBPTEFSXzEwJyA8PT0gRG8gbm90aGluZy4gUmVtb3ZlZC4KKwkJCQllbnRyeSB8PSBNRTQ2MDBfQUlfTElTVF9SQU5HRV9CSVBPTEFSXzEwOworKi8KKwkJCWJyZWFrOworCQljYXNlIDE6CS8vVU5JUE9MQVIgMTBWCisJCQllbnRyeSB8PSBNRTQ2MDBfQUlfTElTVF9SQU5HRV9VTklQT0xBUl8xMDsKKwkJCWJyZWFrOworCQljYXNlIDI6CS8vQklQT0xBUiAyLjVWCisJCQllbnRyeSB8PSBNRTQ2MDBfQUlfTElTVF9SQU5HRV9CSVBPTEFSXzJfNTsKKwkJCWJyZWFrOworCQljYXNlIDM6CS8vVU5JUE9MQVIgMi41VgorCQkJZW50cnkgfD0gTUU0NjAwX0FJX0xJU1RfUkFOR0VfVU5JUE9MQVJfMl81OworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlQRVJST1JfQ1JJVElDQUwoIlVOQ0hFQ0sgRVJST1IgaW4gY29uZmlnX2xpc3QhXG4iKTsKKwkJCVBFUlJPUl9DUklUSUNBTAorCQkJICAgICgiV1JPTkcgcmFuZ2VcblBvc2l0aW9uOiVkIFJhbmdlOjB4JTA0WFxuIiwgaSwKKwkJCSAgICAgY29uZmlnX2xpc3RbaV0uaVN0cmVhbUNvbmZpZyk7CisJCQlnb3RvIFZFUklGWV9FUlJPUjsKKwkJCWJyZWFrOworCQl9CisKKwkJc3dpdGNoIChjb25maWdfbGlzdFtpXS5pUmVmKSB7CisJCWNhc2UgTUVfUkVGX0FJX0dST1VORDoJLy9TSU5HTEUgRU5ERUQKKy8qCisJCQkJLy8gTUU0NjAwX0FJX0xJU1RfSU5QVVRfU0lOR0xFX0VOREVEID0gMHgwMDAwCisJCQkJLy8gJ2VudHJ5IHw9IE1FNDYwMF9BSV9MSVNUX0lOUFVUX1NJTkdMRV9FTkRFRCcgPT0+IERvIG5vdGhpbmcuIFJlbW92ZWQuCisJCQkJZW50cnkgfD0gTUU0NjAwX0FJX0xJU1RfSU5QVVRfU0lOR0xFX0VOREVEOworKi8gYnJlYWs7CisJCWNhc2UgTUVfUkVGX0FJX0RJRkZFUkVOVElBTDoJLy9ESUZGRVJFTlRJQUwKKwkJCWVudHJ5IHw9IE1FNDYwMF9BSV9MSVNUX0lOUFVUX0RJRkZFUkVOVElBTDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJUEVSUk9SX0NSSVRJQ0FMKCJVTkNIRUNLIEVSUk9SIGluIGNvbmZpZ19saXN0IVxuIik7CisJCQlQRVJST1JfQ1JJVElDQUwKKwkJCSAgICAoIldST05HIHJlZmVyZW5jZVxuUG9zaXRpb246JWQgUmVmZXJlbmNlOjB4JTA0WFxuIiwKKwkJCSAgICAgaSwgY29uZmlnX2xpc3RbaV0uaVJlZik7CisJCQlnb3RvIFZFUklGWV9FUlJPUjsKKwkJCWJyZWFrOworCQl9CisKKwkJLy9BZGQgbGFzdCBlbnRyeSBmbGFnCisJCWlmIChpID09IChjb3VudCAtIDEpKSB7CisJCQllbnRyeSB8PSBNRTQ2MDBfQUlfTElTVF9MQVNUX0VOVFJZOworCQl9CisKKwkJb3V0bChlbnRyeSwgaW5zdGFuY2UtPmNoYW5uZWxfbGlzdF9yZWcpOworCQlQREVCVUdfUkVHKCJjaGFubmVsX2xpc3RfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkgICBpbnN0YW5jZS0+Y2hhbm5lbF9saXN0X3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgIGVudHJ5KTsKKwl9CisKKwkvLyBTZXQgdHJpZ2dlcmluZyByZWdpc3RlcnMKKwktLWFjcV90aWNrczsKKwlvdXRsKGFjcV90aWNrcywgaW5zdGFuY2UtPmNoYW5fcHJlX3RpbWVyX3JlZyk7CisJUERFQlVHX1JFRygiY2hhbl9wcmVfdGltZXJfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JWxsWFxuIiwKKwkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+Y2hhbl9wcmVfdGltZXJfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBhY3FfdGlja3MpOworCW91dGwoYWNxX3RpY2tzLCBpbnN0YW5jZS0+c2Nhbl9wcmVfdGltZXJfbG93X3JlZyk7CisJUERFQlVHX1JFRygic2Nhbl9wcmVfdGltZXJfbG93X3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCVsbFhcbiIsCisJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPnNjYW5fcHJlX3RpbWVyX2xvd19yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGFjcV90aWNrcyAmIDB4RkZGRkZGRkYpOworCW91dGwoKGFjcV90aWNrcyA+PiAzMiksIGluc3RhbmNlLT5zY2FuX3ByZV90aW1lcl9oaWdoX3JlZyk7CisJUERFQlVHX1JFRygic2Nhbl9wcmVfdGltZXJfaGlnaF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHglbGxYXG4iLAorCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5zY2FuX3ByZV90aW1lcl9oaWdoX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgKGFjcV90aWNrcyA+PiAzMikgJiAweEZGRkZGRkZGKTsKKworCS8vIFNldCB0cmlnZ2VycworCXN3aXRjaCAodHJpZ2dlci0+aUFjcVN0YXJ0VHJpZ1R5cGUpIHsKKwkJLy8gSW50ZXJuYWwKKwljYXNlIE1FX1RSSUdfVFlQRV9TVzoKKwkJLy8gTm90aGluZyB0byBzZXQuCisJCWJyZWFrOworCisJCS8vIEV4dGVybmFsCisJY2FzZSBNRV9UUklHX1RZUEVfRVhUX0FOQUxPRzoKKwkJY3RybCB8PSBNRTQ2MDBfQUlfQ1RSTF9CSVRfRVhfVFJJR19BTkFMT0c7CisJY2FzZSBNRV9UUklHX1RZUEVfRVhUX0RJR0lUQUw6CisJCWN0cmwgfD0gTUU0NjAwX0FJX0NUUkxfQklUX0VYX1RSSUc7CisKKwkJLy8gRXh0ZXJuYWwgdHJpZ2dlciBuZWVkcyBlZGdlJ3MgZGVmaW5pdGlvbgorCQlzd2l0Y2ggKHRyaWdnZXItPmlBY3FTdGFydFRyaWdFZGdlKSB7CisJCWNhc2UgTUVfVFJJR19FREdFX1JJU0lORzoKKwkJCS8vIE5vdGhpbmcgdG8gc2V0LgorCQkJYnJlYWs7CisKKwkJY2FzZSBNRV9UUklHX0VER0VfRkFMTElORzoKKwkJCWN0cmwgfD0gTUU0NjAwX0FJX0NUUkxfQklUX0VYX1RSSUdfRkFMTElORzsKKwkJCWJyZWFrOworCisJCWNhc2UgTUVfVFJJR19FREdFX0FOWToKKwkJCWN0cmwgfD0KKwkJCSAgICBNRTQ2MDBfQUlfQ1RSTF9CSVRfRVhfVFJJR19GQUxMSU5HIHwKKwkJCSAgICBNRTQ2MDBfQUlfQ1RSTF9CSVRfRVhfVFJJR19CT1RIOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCVBFUlJPUl9DUklUSUNBTAorCQkJICAgICgiVU5DSEVDSyBUUklHR0VSIEVER0UgaW4gdHJpZ2dlcnMgc3RydWN0dXJlIVxuIik7CisJCQlQRVJST1JfQ1JJVElDQUwKKwkJCSAgICAoIldST05HIGFjcXVpc2l0aW9uIHN0YXJ0IHRyaWdnZXI6MHglMDRYLlxuIiwKKwkJCSAgICAgdHJpZ2dlci0+aUFjcVN0YXJ0VHJpZ0VkZ2UpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9BQ1FfU1RBUlRfVFJJR19FREdFOworCQkJZ290byBWRVJJRllfRVJST1I7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCVBFUlJPUl9DUklUSUNBTCgiVU5DSEVDSyBUUklHR0VSIGluIHRyaWdnZXJzIHN0cnVjdHVyZSFcbiIpOworCQlQRVJST1JfQ1JJVElDQUwoIldST05HIGFjcXVpc2l0aW9uIHN0YXJ0IHRyaWdnZXI6MHglMDRYLlxuIiwKKwkJCQl0cmlnZ2VyLT5pQWNxU3RhcnRUcmlnVHlwZSk7CisJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQUNRX1NUQVJUX1RSSUdfVFlQRTsKKwkJZ290byBWRVJJRllfRVJST1I7CisJCWJyZWFrOworCX0KKworCXN3aXRjaCAodHJpZ2dlci0+aVNjYW5TdGFydFRyaWdUeXBlKSB7CisJY2FzZSBNRV9UUklHX1RZUEVfVElNRVI6CisJCS0tc2Nhbl90aWNrczsKKwkJb3V0bChzY2FuX3RpY2tzLCBpbnN0YW5jZS0+c2Nhbl90aW1lcl9sb3dfcmVnKTsKKwkJUERFQlVHX1JFRygic2Nhbl90aW1lcl9sb3dfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JWxsWFxuIiwKKwkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgIGluc3RhbmNlLT5zY2FuX3RpbWVyX2xvd19yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkgICBzY2FuX3RpY2tzICYgMHhGRkZGRkZGRik7CisJCW91dGwoKHNjYW5fdGlja3MgPj4gMzIpLCBpbnN0YW5jZS0+c2Nhbl90aW1lcl9oaWdoX3JlZyk7CisJCVBERUJVR19SRUcoInNjYW5fdGltZXJfaGlnaF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHglbGxYXG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPnNjYW5fdGltZXJfaGlnaF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkgICAoc2Nhbl90aWNrcyA+PiAzMikgJiAweEZGRkZGRkZGKTsKKworCQlpZiAodHJpZ2dlci0+aUFjcVN0YXJ0VHJpZ1R5cGUgPT0gTUVfVFJJR19UWVBFX1NXKSB7CisJCQljdHJsIHw9IE1FNDYwMF9BSV9DVFJMX0JJVF9NT0RFXzA7CisJCX0gZWxzZSB7CisJCQljdHJsIHw9IE1FNDYwMF9BSV9DVFJMX0JJVF9NT0RFXzE7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIE1FX1RSSUdfVFlQRV9FWFRfRElHSVRBTDoKKwljYXNlIE1FX1RSSUdfVFlQRV9FWFRfQU5BTE9HOgorCQlvdXRsKDAsIGluc3RhbmNlLT5zY2FuX3RpbWVyX2xvd19yZWcpOworCQlQREVCVUdfUkVHKCJzY2FuX3RpbWVyX2xvd19yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgIGluc3RhbmNlLT5zY2FuX3RpbWVyX2xvd19yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkgICAwKTsKKwkJb3V0bCgwLCBpbnN0YW5jZS0+c2Nhbl90aW1lcl9oaWdoX3JlZyk7CisJCVBERUJVR19SRUcoInNjYW5fdGltZXJfaGlnaF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgIGluc3RhbmNlLT5zY2FuX3RpbWVyX2hpZ2hfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgMCk7CisJCWN0cmwgfD0gTUU0NjAwX0FJX0NUUkxfQklUX01PREVfMjsKKwkJYnJlYWs7CisKKwljYXNlIE1FX1RSSUdfVFlQRV9GT0xMT1c6CisJCW91dGwoMCwgaW5zdGFuY2UtPnNjYW5fdGltZXJfbG93X3JlZyk7CisJCVBERUJVR19SRUcoInNjYW5fdGltZXJfbG93X3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPnNjYW5fdGltZXJfbG93X3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgIDApOworCQlvdXRsKDAsIGluc3RhbmNlLT5zY2FuX3RpbWVyX2hpZ2hfcmVnKTsKKwkJUERFQlVHX1JFRygic2Nhbl90aW1lcl9oaWdoX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPnNjYW5fdGltZXJfaGlnaF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkgICAwKTsKKworCQlpZiAodHJpZ2dlci0+aUFjcVN0YXJ0VHJpZ1R5cGUgPT0gTUVfVFJJR19UWVBFX1NXKSB7CisJCQljdHJsIHw9IE1FNDYwMF9BSV9DVFJMX0JJVF9NT0RFXzA7CisJCX0gZWxzZSB7CisJCQljdHJsIHw9IE1FNDYwMF9BSV9DVFJMX0JJVF9NT0RFXzE7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlQRVJST1JfQ1JJVElDQUwoIlVOQ0hFQ0sgVFJJR0dFUiBpbiB0cmlnZ2VycyBzdHJ1Y3R1cmUhXG4iKTsKKwkJUEVSUk9SX0NSSVRJQ0FMKCJXUk9ORyBzY2FuIHN0YXJ0IHRyaWdnZXI6MHglMDRYLlxuIiwKKwkJCQl0cmlnZ2VyLT5pU2NhblN0YXJ0VHJpZ1R5cGUpOworCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX1NDQU5fU1RBUlRfVFJJR19UWVBFOworCQlnb3RvIFZFUklGWV9FUlJPUjsKKwkJYnJlYWs7CisJfQorCisJc3dpdGNoICh0cmlnZ2VyLT5pQ29udlN0YXJ0VHJpZ1R5cGUpIHsKKworCWNhc2UgTUVfVFJJR19UWVBFX1RJTUVSOgorCQktLWNvbnZfdGlja3M7CisJCW91dGwoY29udl90aWNrcywgaW5zdGFuY2UtPmNoYW5fdGltZXJfcmVnKTsKKwkJUERFQlVHX1JFRygiY2hhbl90aW1lcl9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHglbGxYXG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPmNoYW5fdGltZXJfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgY29udl90aWNrcyk7CisJCWJyZWFrOworCisJY2FzZSBNRV9UUklHX1RZUEVfRVhUX0RJR0lUQUw6CisJY2FzZSBNRV9UUklHX1RZUEVfRVhUX0FOQUxPRzoKKwkJb3V0bCgwLCBpbnN0YW5jZS0+Y2hhbl90aW1lcl9yZWcpOworCQlQREVCVUdfUkVHKCJjaGFuX3RpbWVyX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPmNoYW5fdGltZXJfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCAwKTsKKwkJY3RybCB8PSBNRTQ2MDBfQUlfQ1RSTF9CSVRfTU9ERV8wIHwgTUU0NjAwX0FJX0NUUkxfQklUX01PREVfMTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlQRVJST1JfQ1JJVElDQUwoIlVOQ0hFQ0sgVFJJR0dFUiBpbiB0cmlnZ2VycyBzdHJ1Y3R1cmUhXG4iKTsKKwkJUEVSUk9SX0NSSVRJQ0FMKCJXUk9ORyBjb252IHN0YXJ0IHRyaWdnZXI6MHglMDRYLlxuIiwKKwkJCQl0cmlnZ2VyLT5pQ29udlN0YXJ0VHJpZ1R5cGUpOworCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0NPTlZfU1RBUlRfVFJJR19UWVBFOworCQlnb3RvIFZFUklGWV9FUlJPUjsKKworCQlicmVhazsKKwl9CisKKwkvL1NhbXBsZSAmIEhvbGQgZmVhdHVyZQorCWlmIChmbGFncyAmIE1FX0lPX1NUUkVBTV9DT05GSUdfU0FNUExFX0FORF9IT0xEKSB7CisJCWlmIChpbnN0YW5jZS0+c2gpIHsKKwkJCWN0cmwgfD0gTUU0NjAwX0FJX0NUUkxfQklUX1NBTVBMRV9IT0xEOworCQl9IGVsc2UgeworCQkJUEVSUk9SX0NSSVRJQ0FMKCJVTkNIRUNLIFMmSCBmZWF0dXJlIVxuIik7CisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCQkJZ290byBWRVJJRllfRVJST1I7CisJCX0KKwl9CisJLy9FbmFibGUgSVJRcyBzb3VyY2VzIGJ1dCBsZWF2ZSBsYXRjaGVzIGJsb2NrZWQuCisJY3RybCB8PSAoTUU0NjAwX0FJX0NUUkxfQklUX0hGX0lSUSB8IE1FNDYwMF9BSV9DVFJMX0JJVF9TQ19JUlEgfCBNRTQ2MDBfQUlfQ1RSTF9CSVRfTEVfSVJRKTsJLy9UaGUgbGFzdCBJUlEgc291cmNlIChNRTQ2MDBfQUlfQ1RSTF9CSVRfTEVfSVJRKSBpcyB1bnVzZWQhCisKKwkvL0V2ZXJ5dGhpbmcgaXMgZ29vZC4gRmluYWxpemUKKwlzcGluX2xvY2tfaXJxc2F2ZShpbnN0YW5jZS0+Y3RybF9yZWdfbG9jaywgY3B1X2ZsYWdzKTsKKwl0bXAgPSBpbmwoaW5zdGFuY2UtPmN0cmxfcmVnKTsKKworCS8vUHJlc2VydmUgRVhUIElSUSBhbmQgT0ZGU0VUIHNldHRpbmdzLiBDbGVhbiBvdGhlciBiaXRzLgorCXRtcCAmPQorCSAgICAoTUU0NjAwX0FJX0NUUkxfQklUX0VYX0lSUSB8IE1FNDYwMF9BSV9DVFJMX0JJVF9FWF9JUlFfUkVTRVQgfAorCSAgICAgTUU0NjAwX0FJX0NUUkxfQklUX0ZVTExTQ0FMRSB8IE1FNDYwMF9BSV9DVFJMX0JJVF9PRkZTRVQpOworCisJLy8gd3JpdGUgdGhlIGNvbnRyb2wgd29yZAorCW91dGwoY3RybCB8IHRtcCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgY3RybCB8IHRtcCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShpbnN0YW5jZS0+Y3RybF9yZWdfbG9jaywgY3B1X2ZsYWdzKTsKKworCS8vU2V0IHRoZSBnbG9iYWwgcGFyYW1ldGVycyBlbmQgZXhpdC4KKwlpbnN0YW5jZS0+Y2hhbl9saXN0X2xlbiA9IGNvdW50OworCWluc3RhbmNlLT5maWZvX2lycV90aHJlc2hvbGQgPSBmaWZvX2lycV90aHJlc2hvbGQ7CisKKwlpZiAodHJpZ2dlci0+aUFjcVN0b3BUcmlnVHlwZSA9PSBNRV9UUklHX1RZUEVfQ09VTlQpIHsKKwkJZGF0YV9yZXF1aXJlZCA9CisJCSAgICAodW5zaWduZWQgbG9uZyBsb25nKXRyaWdnZXItPmlBY3FTdG9wQ291bnQgKgorCQkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyljb3VudDsKKwkJaWYgKGRhdGFfcmVxdWlyZWQgPiBVSU5UX01BWCkKKwkJCWRhdGFfcmVxdWlyZWQgPSBVSU5UX01BWDsKKwkJaW5zdGFuY2UtPmRhdGFfcmVxdWlyZWQgPSAodW5zaWduZWQgaW50KWRhdGFfcmVxdWlyZWQ7CisJfSBlbHNlIGlmICh0cmlnZ2VyLT5pU2NhblN0b3BUcmlnVHlwZSA9PSBNRV9UUklHX1RZUEVfQ09VTlQpCisJCWluc3RhbmNlLT5kYXRhX3JlcXVpcmVkID0KKwkJICAgICh1bnNpZ25lZCBsb25nIGxvbmcpdHJpZ2dlci0+aVNjYW5TdG9wQ291bnQ7CisJZWxzZQorCQlpbnN0YW5jZS0+ZGF0YV9yZXF1aXJlZCA9IDA7CisKKwkvLyBNYXJrIHN1YmRldmljZSBhcyBjb25maWd1cmVkIHRvIHdvcmsgaW4gc3RyZWFtIG1vZGUuCisJaW5zdGFuY2UtPnN0YXR1cyA9IGFpX3N0YXR1c19zdHJlYW1fY29uZmlndXJlZDsKKworCS8vIERlaW5pdCBzaW5nbGUgY29uZmlnLiBTZXQgYWxsIGVudHJpZXMgdG8gTk9UX0NPTkZJR1VSRUQuCisJZm9yIChpID0gMDsgaSA8IGluc3RhbmNlLT5jaGFubmVsczsgaSsrKSB7CisJCWluc3RhbmNlLT5zaW5nbGVfY29uZmlnW2ldLnN0YXR1cyA9CisJCSAgICBNRV9TSU5HTEVfQ0hBTk5FTF9OT1RfQ09ORklHVVJFRDsKKwl9CisKKyAgICAgIFZFUklGWV9FUlJPUjoJCS8vIEVycm9yIGluIGNvZGUuIFdyb25nIHNldHRpbmcgY2hlY2suIFRoaXMgc2hvdWxkIG5ldmVyIGV2ZXIgaGFwcGVuZCEKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisgICAgICBFUlJPUjoJCQkvLyBFcnJvciBpbiBzZXR0aW5ncy4KKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWU0NjAwX2FpX2lvX3N0cmVhbV9uZXdfdmFsdWVzKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQkgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkJICBpbnQgdGltZV9vdXQsIGludCAqY291bnQsIGludCBmbGFncykKK3sKKwltZTQ2MDBfYWlfc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCXVuc2lnbmVkIGxvbmcgdDsKKwl1bnNpZ25lZCBsb25nIGo7CisJaW50IHZvbGF0aWxlIGhlYWQ7CisKKwlQREVCVUcoImV4ZWN1dGVkLiBpZHg9MFxuIik7CisKKwlpZiAoZmxhZ3MpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWcgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCWlmICh0aW1lX291dCA8IDApIHsKKwkJUEVSUk9SKCJJbnZhbGlkIHRpbWVfb3V0IHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9USU1FT1VUOworCX0KKworCWlmICh0aW1lX291dCkgeworCQl0ID0gKHRpbWVfb3V0ICogSFopIC8gMTAwMDsKKworCQlpZiAodCA9PSAwKQorCQkJdCA9IDE7CisJfSBlbHNlIHsJCS8vIE1heCB0aW1lLgorCQl0ID0gTE9OR19NQVg7CisJfQorCisJaW5zdGFuY2UgPSAobWU0NjAwX2FpX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCWogPSBqaWZmaWVzOworCisJd2hpbGUgKDEpIHsKKwkJLy8gT25seSBydW5pbmcgZGV2aWNlIGNhbiBnZW5lcmF0ZSBicmVhay4KKwkJaGVhZCA9IGluc3RhbmNlLT5jaXJjX2J1Zi5oZWFkOworCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChpbnN0YW5jZS0+d2FpdF9xdWV1ZSwKKwkJCQkJCSAoKGhlYWQgIT0KKwkJCQkJCSAgIGluc3RhbmNlLT5jaXJjX2J1Zi5oZWFkKQorCQkJCQkJICB8fAorCQkJCQkJICAoKGluc3RhbmNlLT5zdGF0dXMgPD0KKwkJCQkJCSAgICBhaV9zdGF0dXNfc3RyZWFtX3J1bl93YWl0KQorCQkJCQkJICAgJiYgKGluc3RhbmNlLT5zdGF0dXMgPj0KKwkJCQkJCSAgICAgICBhaV9zdGF0dXNfc3RyZWFtX2VuZF93YWl0KSkpLAorCQkJCQkJIHQpOworCisJCWlmIChoZWFkICE9IGluc3RhbmNlLT5jaXJjX2J1Zi5oZWFkKSB7CS8vIE5ldyBkYXRhIGluIGJ1ZmZlci4KKwkJCWJyZWFrOworCQl9IGVsc2UgaWYgKGluc3RhbmNlLT5zdGF0dXMgPT0gYWlfc3RhdHVzX3N0cmVhbV9lbmQpIHsJLy8gRW5kIG9mIHdvcmsuCisJCQlicmVhazsKKwkJfSBlbHNlIGlmIChpbnN0YW5jZS0+c3RhdHVzID09IGFpX3N0YXR1c19zdHJlYW1fZmlmb19lcnJvcikgeworCQkJZXJyID0gTUVfRVJSTk9fRklGT19CVUZGRVJfT1ZFUkZMT1c7CisJCQlicmVhazsKKwkJfSBlbHNlIGlmIChpbnN0YW5jZS0+c3RhdHVzID09IGFpX3N0YXR1c19zdHJlYW1fYnVmZmVyX2Vycm9yKSB7CisJCQllcnIgPSBNRV9FUlJOT19SSU5HX0JVRkZFUl9PVkVSRkxPVzsKKwkJCWJyZWFrOworCQl9IGVsc2UgaWYgKGluc3RhbmNlLT5zdGF0dXMgPT0gYWlfc3RhdHVzX3N0cmVhbV9lcnJvcikgeworCQkJZXJyID0gTUVfRVJSTk9fSU5URVJOQUw7CisJCQlicmVhazsKKwkJfSBlbHNlIGlmICgoamlmZmllcyAtIGopID49IHQpIHsKKwkJCVBFUlJPUigiV2FpdCBvbiB2YWx1ZXMgdGltZWQgb3V0LlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19USU1FT1VUOworCQkJYnJlYWs7CisJCX0gZWxzZSBpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCVBFUlJPUigiV2FpdCBvbiB2YWx1ZXMgaW50ZXJydXB0ZWQgZnJvbSBzaWduYWwuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX1NJR05BTDsKKwkJCWJyZWFrOworCQl9CisJCS8vIENvcnJlY3QgdGltZW91dC4KKwkJdCAtPSBqaWZmaWVzIC0gajsKKwl9CisKKwkqY291bnQgPSBtZV9jaXJjX2J1Zl92YWx1ZXMoJmluc3RhbmNlLT5jaXJjX2J1Zik7CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgaW5saW5lIG1lNDYwMF9haV9pb19zdHJlYW1fcmVhZF9nZXRfdmFsdWUobWU0NjAwX2FpX3N1YmRldmljZV90ICoKKwkJCQkJCSAgICAgaW5zdGFuY2UsIGludCAqdmFsdWVzLAorCQkJCQkJICAgICBjb25zdCBpbnQgY291bnQsCisJCQkJCQkgICAgIGNvbnN0IGludCBmbGFncykKK3sKKwlpbnQgbjsKKwlpbnQgaTsKKwl1aW50MzJfdCB2YWx1ZTsKKworCS8vL0NoZWNraW5nIGhvdyBtYW55IGRhdGFzIGNhbiBiZSBjb3BpZWQuCisJbiA9IG1lX2NpcmNfYnVmX3ZhbHVlcygmaW5zdGFuY2UtPmNpcmNfYnVmKTsKKwlpZiAobiA8PSAwKQorCQlyZXR1cm4gMDsKKworCWlmIChuID4gY291bnQpCisJCW4gPSBjb3VudDsKKworCWlmIChmbGFncyAmIE1FX0lPX1NUUkVBTV9SRUFEX0ZSQU1FUykgeworCQlpZiAobiA8IGluc3RhbmNlLT5jaGFuX2xpc3RfbGVuKQkvL05vdCBlbm91Z2ggZGF0YSEKKwkJCXJldHVybiAwOworCQluIC09IG4gJSBpbnN0YW5jZS0+Y2hhbl9saXN0X2xlbjsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisJCXZhbHVlID0gKihpbnN0YW5jZS0+Y2lyY19idWYuYnVmICsgaW5zdGFuY2UtPmNpcmNfYnVmLnRhaWwpOworCQlpZiAocHV0X3VzZXIodmFsdWUsIHZhbHVlcyArIGkpKSB7CisJCQlQRVJST1IoIkNhbm5vdCBjb3B5IG5ldyB2YWx1ZXMgdG8gdXNlci5cbiIpOworCQkJcmV0dXJuIC1NRV9FUlJOT19JTlRFUk5BTDsKKwkJfQorCQlpbnN0YW5jZS0+Y2lyY19idWYudGFpbCsrOworCQlpbnN0YW5jZS0+Y2lyY19idWYudGFpbCAmPSBpbnN0YW5jZS0+Y2lyY19idWYubWFzazsKKwl9CisJcmV0dXJuIG47Cit9CisKK3N0YXRpYyBpbnQgbWU0NjAwX2FpX2lvX3N0cmVhbV9yZWFkKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgIGludCByZWFkX21vZGUsCisJCQkJICAgIGludCAqdmFsdWVzLCBpbnQgKmNvdW50LCBpbnQgZmxhZ3MpCit7CisJbWU0NjAwX2FpX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwlpbnQgcmV0OworCisJaW50IGMgPSAqY291bnQ7CisJaW50IG1pbiA9IGM7CisKKwlQREVCVUcoImV4ZWN1dGVkLiBpZHg9MFxuIik7CisKKwlpZiAoZmxhZ3MgJiB+TUVfSU9fU1RSRUFNX1JFQURfRlJBTUVTKSB7CisJCVBFUlJPUigiSW52YWxpZCBmbGFnIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlpZiAoIXZhbHVlcyB8fCAhY291bnQpIHsKKwkJUEVSUk9SKCJSZXF1ZXN0IGhhcyBpbnZhbGlkIHBvaW50ZXIuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfUE9JTlRFUjsKKwl9CisKKwlpZiAoYyA8IDApIHsKKwkJUEVSUk9SKCJSZXF1ZXN0IGhhcyBpbnZhbGlkIHZhbHVlJ3MgY291bnRlci5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9WQUxVRV9DT1VOVDsKKwl9CisKKwlpZiAoKHJlYWRfbW9kZSAhPSBNRV9SRUFEX01PREVfQkxPQ0tJTkcpCisJICAgICYmIChyZWFkX21vZGUgIT0gTUVfUkVBRF9NT0RFX05PTkJMT0NLSU5HKSkgeworCQlQRVJST1IoIkludmFsaWQgcmVhZCBtb2RlIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9SRUFEX01PREU7CisJfQorCisJaWYgKGMgPT0gMCkgewkJLy9Zb3UgZ2V0IHdoYXQgeW91IHdhbnQhIE5vdGhpbmcgbW9yZSBvciBsZXNzLgorCQlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKKwl9CisKKwlpbnN0YW5jZSA9IChtZTQ2MDBfYWlfc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCS8vQ2hlY2sgaWYgc3ViZGV2aWNlIGlzIGNvbmZpZ3VyZWQuCisJaWYgKGluc3RhbmNlLT5jaGFuX2xpc3RfbGVuIDw9IDApIHsKKwkJUEVSUk9SKCJTdWJkZXZpY2Ugd2Fzbid0IGNvbmZpZ3VyZWQuXG4iKTsKKwkJTUVfU1VCREVWSUNFX0VYSVQ7CisJCXJldHVybiBNRV9FUlJOT19QUkVWSU9VU19DT05GSUc7CisJfQorCisJaWYgKGZsYWdzICYgTUVfSU9fU1RSRUFNX1JFQURfRlJBTUVTKSB7CisJCWlmIChjIDwgaW5zdGFuY2UtPmNoYW5fbGlzdF9sZW4pIHsJLy9Ob3QgZW5vdWdoIGRhdGEgcmVxdWVzdGVkLgorCQkJUEVSUk9SCisJCQkgICAgKCJXaGVuIHVzaW5nIEZSQU1FX1JFQUQgbW9kZSBtaW5pbWFsIHNpemUgaXMgZGVmaW5lZCBieSBjaGFubmVsIGxpc3QuXG4iKTsKKwkJCU1FX1NVQkRFVklDRV9FWElUOworCQkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfVkFMVUVfQ09VTlQ7CisJCX0KKwl9CisKKwlpZiAoYyA+IChNRTQ2MDBfQUlfQ0lSQ19CVUZfQ09VTlQgLSBpbnN0YW5jZS0+Y2hhbl9saXN0X2xlbikpIHsJLy8gVG8gcmV0dXJuIGFjY2VwdGFibGUgYW1vdW50IG9mIGRhdGEgd2hlbiB1c2VyIHBhc3MgdG9vIGJpZyB2YWx1ZS4KKwkJbWluID0gTUU0NjAwX0FJX0NJUkNfQlVGX0NPVU5UIC0gaW5zdGFuY2UtPmNoYW5fbGlzdF9sZW47CisJfQorCisJaWYgKGZsYWdzICYgTUVfSU9fU1RSRUFNX1JFQURfRlJBTUVTKSB7CisJCS8vV2FpdCBmb3Igd2hvbGUgbGlzdC4KKwkJaWYgKHJlYWRfbW9kZSA9PSBNRV9SRUFEX01PREVfQkxPQ0tJTkcpIHsKKwkJCW1pbiA9IGMgLSAoYyAlIGluc3RhbmNlLT5jaGFuX2xpc3RfbGVuKTsKKwkJfQorCisJCWlmIChyZWFkX21vZGUgPT0gTUVfUkVBRF9NT0RFX05PTkJMT0NLSU5HKSB7CisJCQltaW4gPSBpbnN0YW5jZS0+Y2hhbl9saXN0X2xlbjsKKwkJfQorCX0KKworCWlmICgoaW5sKGluc3RhbmNlLT5zdGF0dXNfcmVnKSAmIE1FNDYwMF9BSV9TVEFUVVNfQklUX0ZTTSkpIHsJLy9Xb3JraW5nCisJCS8vSWYgYmxvY2tpbmcgbW9kZSAtPiB3YWl0IGZvciBkYXRhLgorCQlpZiAoKG1lX2NpcmNfYnVmX3ZhbHVlcygmaW5zdGFuY2UtPmNpcmNfYnVmKSA8IG1pbikKKwkJICAgICYmIChyZWFkX21vZGUgPT0gTUVfUkVBRF9NT0RFX0JMT0NLSU5HKSkgeworCQkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGluc3RhbmNlLT53YWl0X3F1ZXVlLAorCQkJCQkJICgobWVfY2lyY19idWZfdmFsdWVzCisJCQkJCQkgICAoJmluc3RhbmNlLT5jaXJjX2J1ZikgPj0gbWluKQorCQkJCQkJICB8fCAhKGlubChpbnN0YW5jZS0+c3RhdHVzX3JlZykKKwkJCQkJCSAgICAgICAmCisJCQkJCQkgICAgICAgTUU0NjAwX0FJX1NUQVRVU19CSVRfRlNNKSkpOworCisJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCQlQRVJST1IKKwkJCQkgICAgKCJXYWl0IG9uIHZhbHVlcyBpbnRlcnJ1cHRlZCBmcm9tIHNpZ25hbC5cbiIpOworCQkJCWVyciA9IE1FX0VSUk5PX1NJR05BTDsKKwkJCX0KKwkJfQorCX0KKworCXJldCA9IG1lNDYwMF9haV9pb19zdHJlYW1fcmVhZF9nZXRfdmFsdWUoaW5zdGFuY2UsIHZhbHVlcywgYywgZmxhZ3MpOworCWlmIChyZXQgPCAwKSB7CisJCWVyciA9IC1yZXQ7CisJCSpjb3VudCA9IDA7CisJfSBlbHNlIGlmIChyZXQgPT0gMCkgeworCQkqY291bnQgPSAwOworCQlpZiAoaW5zdGFuY2UtPnN0YXR1cyA9PSBhaV9zdGF0dXNfc3RyZWFtX2ZpZm9fZXJyb3IpIHsKKwkJCWVyciA9IE1FX0VSUk5PX0ZJRk9fQlVGRkVSX09WRVJGTE9XOworCQkJaW5zdGFuY2UtPnN0YXR1cyA9IGFpX3N0YXR1c19zdHJlYW1fZW5kOworCQl9IGVsc2UgaWYgKGluc3RhbmNlLT5zdGF0dXMgPT0gYWlfc3RhdHVzX3N0cmVhbV9idWZmZXJfZXJyb3IpIHsKKwkJCWVyciA9IE1FX0VSUk5PX1JJTkdfQlVGRkVSX09WRVJGTE9XOworCQkJaW5zdGFuY2UtPnN0YXR1cyA9IGFpX3N0YXR1c19zdHJlYW1fZW5kOworCQl9IGVsc2UgaWYgKGluc3RhbmNlLT5zdGF0dXMgPT0gYWlfc3RhdHVzX3N0cmVhbV9lbmQpIHsKKwkJCWVyciA9IE1FX0VSUk5PX1NVQkRFVklDRV9OT1RfUlVOTklORzsKKwkJfSBlbHNlIGlmIChpbnN0YW5jZS0+c3RhdHVzID09IGFpX3N0YXR1c19zdHJlYW1fZXJyb3IpIHsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVEVSTkFMOworCQl9IGVsc2UgaWYgKGluc3RhbmNlLT5zdGF0dXMgPT0gYWlfc3RhdHVzX25vbmUpIHsKKwkJCVBERUJVRygiU3RyZWFtIGNhbmNlbGVkLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19JTlRFUk5BTDsKKwkJfQorCX0gZWxzZSB7CisJCSpjb3VudCA9IHJldDsKKwl9CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKKy8qKiBAYnJpZWYgU3RvcCBhcXVzYXRpb24uIFByZXNlcnZlIEZJRk9zLgorKgorKiBAcGFyYW0gaW5zdGFuY2UgVGhlIHN1YmRldmljZSBpbnN0YW5jZSAocG9pbnRlcikuCisqLworCitzdGF0aWMgaW50IGFpX3N0b3BfaW1tZWRpYXRlbHkobWU0NjAwX2FpX3N1YmRldmljZV90ICogaW5zdGFuY2UpCit7CisJdW5zaWduZWQgbG9uZyBjcHVfZmxhZ3MgPSAwOworCXZvbGF0aWxlIHVpbnQzMl90IGN0cmw7CisJY29uc3QgaW50IHRpbWVvdXQgPSBIWiAvIDEwOwkvLzEwMG1zCisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDw9IHRpbWVvdXQ7IGkrKykgeworCQlzcGluX2xvY2tfaXJxc2F2ZShpbnN0YW5jZS0+Y3RybF9yZWdfbG9jaywgY3B1X2ZsYWdzKTsKKwkJY3RybCA9IGlubChpbnN0YW5jZS0+Y3RybF9yZWcpOworCQljdHJsICY9IH5NRTQ2MDBfQUlfQ1RSTF9CSVRfU1RPUDsKKwkJY3RybCB8PQorCQkgICAgKE1FNDYwMF9BSV9DVFJMX0JJVF9JTU1FRElBVEVfU1RPUCB8CisJCSAgICAgTUU0NjAwX0FJX0NUUkxfQklUX0hGX0lSUV9SRVNFVCB8CisJCSAgICAgTUU0NjAwX0FJX0NUUkxfQklUX1NDX0lSUV9SRVNFVCk7CisJCW91dGwoY3RybCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgY3RybCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2ssIGNwdV9mbGFncyk7CisKKwkJaWYgKCEoaW5sKGluc3RhbmNlLT5zdGF0dXNfcmVnKSAmIE1FNDYwMF9BSV9TVEFUVVNfQklUX0ZTTSkpIHsJLy8gRXhpdC4KKwkJCWJyZWFrOworCQl9CisKKwkJUElORk8oIldhaXQgZm9yIHN0b3A6ICVkXG4iLCBpICsgMSk7CisJCS8vU3RpbGwgd29ya2luZyEKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJc2NoZWR1bGVfdGltZW91dCgxKTsKKwl9CisKKwlpZiAoaSA+IHRpbWVvdXQpIHsKKwkJUEVSUk9SX0NSSVRJQ0FMKCJGU00gSVMgQlVTWSFcbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5URVJOQUw7CisJfQorCisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWU0NjAwX2FpX2lvX3N0cmVhbV9zdGFydChtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgIGludCBzdGFydF9tb2RlLCBpbnQgdGltZV9vdXQsIGludCBmbGFncykKK3sKKwltZTQ2MDBfYWlfc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCXVuc2lnbmVkIGxvbmcgY3B1X2ZsYWdzID0gMDsKKwl1bnNpZ25lZCBsb25nIHJlZjsKKwl1bnNpZ25lZCBsb25nIGRlbGF5ID0gMDsKKworCXZvbGF0aWxlIHVpbnQzMl90IHRtcDsKKworCVBERUJVRygiZXhlY3V0ZWQuIGlkeD0wXG4iKTsKKworCWluc3RhbmNlID0gKG1lNDYwMF9haV9zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlpZiAoZmxhZ3MpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWcgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCWlmICgoc3RhcnRfbW9kZSAhPSBNRV9TVEFSVF9NT0RFX0JMT0NLSU5HKQorCSAgICAmJiAoc3RhcnRfbW9kZSAhPSBNRV9TVEFSVF9NT0RFX05PTkJMT0NLSU5HKSkgeworCQlQRVJST1IoIkludmFsaWQgc3RhcnQgbW9kZSBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfU1RBUlRfTU9ERTsKKwl9CisKKwlpZiAodGltZV9vdXQgPCAwKSB7CisJCVBFUlJPUigiSW52YWxpZCB0aW1lb3V0IHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9USU1FT1VUOworCX0KKworCWlmICh0aW1lX291dCkgeworCQlkZWxheSA9ICh0aW1lX291dCAqIEhaKSAvIDEwMDA7CisKKwkJaWYgKGRlbGF5ID09IDApCisJCQlkZWxheSA9IDE7CisJfQorCisJTUVfU1VCREVWSUNFX0VOVEVSCisJICAgIHNwaW5fbG9ja19pcnFzYXZlKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrLCBjcHVfZmxhZ3MpOworCisJdG1wID0gaW5sKGluc3RhbmNlLT5jdHJsX3JlZyk7CisKKwlpZiAoKHRtcCAmIE1FNDYwMF9BSV9TVEFUVVNfQklUX0ZTTSkpIHsKKwkJUEVSUk9SKCJDb252ZXJzaW9uIGlzIGFscmVhZHkgcnVubmluZy5cbiIpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrLCBjcHVfZmxhZ3MpOworCQllcnIgPSBNRV9FUlJOT19TVUJERVZJQ0VfQlVTWTsKKwkJZ290byBFUlJPUjsKKwl9CisKKwlpZiAoaW5zdGFuY2UtPmNoYW5fbGlzdF9sZW4gPT0gMCkgewkvL05vdCBjb25maWd1cmVkIQorCQlQRVJST1IoIlN1YmRldmljZSBpcyBub3QgY29uZmlndXJlZCB0byB3b3JrIGluIHN0cmVhbSBtb2RlIVxuIik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2ssIGNwdV9mbGFncyk7CisJCWVyciA9IE1FX0VSUk5PX1BSRVZJT1VTX0NPTkZJRzsKKwkJZ290byBFUlJPUjsKKwl9CisKKwlpZiAoISh0bXAgJiAoTUU0NjAwX0FJX0NUUkxfQklUX01PREVfMCB8IE1FNDYwMF9BSV9DVFJMX0JJVF9NT0RFXzEgfCBNRTQ2MDBfQUlfQ1RSTF9CSVRfTU9ERV8yKSkpIHsJLy9Nb2RlIDAgPSBzaW5nbGUgd29yayA9PiBubyBzdHJlYW0gY29uZmlnCisJCVBFUlJPUigiU3ViZGV2aWNlIGlzIGNvbmZpZ3VyZWQgdG8gd29yayBpbiBzaW5nbGUgbW9kZS5cbiIpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrLCBjcHVfZmxhZ3MpOworCQllcnIgPSBNRV9FUlJOT19QUkVWSU9VU19DT05GSUc7CisJCWdvdG8gRVJST1I7CisJfQorCS8vUmVzZXQgc3RvcCBiaXRzLgorCXRtcCB8PSBNRTQ2MDBfQUlfQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1AgfCBNRTQ2MDBfQUlfQ1RSTF9CSVRfU1RPUDsKKwlvdXRsKHRtcCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgdG1wKTsKKworCS8vU3RhcnQgZGF0YXMnIEZJRk8uCisJdG1wIHw9IE1FNDYwMF9BSV9DVFJMX0JJVF9EQVRBX0ZJRk87CisJLy9GcmVlIHN0b3AgYml0cy4KKwl0bXAgJj0gfihNRTQ2MDBfQUlfQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1AgfCBNRTQ2MDBfQUlfQ1RSTF9CSVRfU1RPUCk7CisJb3V0bCh0bXAsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIHRtcCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShpbnN0YW5jZS0+Y3RybF9yZWdfbG9jaywgY3B1X2ZsYWdzKTsKKworCS8vQ2FuY2VsIGNvbnRyb2wgdGFzaworCVBERUJVRygiQ2FuY2VsIGNvbnRyb2wgdGFzay5cbiIpOworCWluc3RhbmNlLT5haV9jb250cm9sX3Rhc2tfZmxhZyA9IDA7CisJY2FuY2VsX2RlbGF5ZWRfd29yaygmaW5zdGFuY2UtPmFpX2NvbnRyb2xfdGFzayk7CisKKwkvL1NldCB0aGUgc3RhcnRpbmcgdmFsdWVzLgorCWluc3RhbmNlLT5JU00uZ2xvYmFsX3JlYWQgPSAwOworCWluc3RhbmNlLT5JU00ucmVhZCA9IDA7CisJLy9DbGVhciBjaXJjdWxhciBidWZmZXIKKwlpbnN0YW5jZS0+Y2lyY19idWYuaGVhZCA9IDA7CisJaW5zdGFuY2UtPmNpcmNfYnVmLnRhaWwgPSAwOworCisJLy9TZXQgZXZlcnl0aGluZy4KKwlhaV9kYXRhX2FjcXVpc2l0aW9uX2xvZ2ljKGluc3RhbmNlKTsKKworCS8vU2V0IHN0YXR1cyB0byAnd2FpdCBmb3Igc3RhcnQnCisJaW5zdGFuY2UtPnN0YXR1cyA9IGFpX3N0YXR1c19zdHJlYW1fcnVuX3dhaXQ7CisKKwkvLyBTZXQgY29udHJvbCB0YXNrJ3MgdGltZW91dAorCWluc3RhbmNlLT50aW1lb3V0LmRlbGF5ID0gZGVsYXk7CisJaW5zdGFuY2UtPnRpbWVvdXQuc3RhcnRfdGltZSA9IGppZmZpZXM7CisKKwkvL0xldHMgZ28hIFN0YXJ0IHdvcmsKKwlpbmwoaW5zdGFuY2UtPnN0YXJ0X3JlZyk7CisJUERFQlVHX1JFRygic3RhcnRfcmVnIGlubCgweCVsWCsweCVsWClcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPnN0YXJ0X3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSk7CisKKwkvLyBTY2hlZHVsZSBjb250cm9sIHRhc2sKKwlpbnN0YW5jZS0+YWlfY29udHJvbF90YXNrX2ZsYWcgPSAxOworCXF1ZXVlX2RlbGF5ZWRfd29yayhpbnN0YW5jZS0+bWU0NjAwX3dvcmtxdWV1ZSwKKwkJCSAgICZpbnN0YW5jZS0+YWlfY29udHJvbF90YXNrLCAxKTsKKworCVBERVZFTE9QKCJEZWxheTolbGRcbiIsIGRlbGF5KTsKKworCWlmIChzdGFydF9tb2RlID09IE1FX1NUQVJUX01PREVfQkxPQ0tJTkcpIHsJLy9XYWl0IGZvciBzdGFydC4KKwkJcmVmID0gamlmZmllczsKKwkJLy9Pbmx5IHJ1bmluZyBwcm9jZXNzIHdpbGwgaW50ZXJydXB0IHRoaXMgY2FsbC4gRXZlbnRzIGFyZSBzaWduYWxlZCB3aGVuIHN0YXR1cyBjaGFuZ2UuIEV4dHJhIHRpbWVvdXQgYWRkIGZvciBzYWZlIHJlYXNvbi4KKwkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoaW5zdGFuY2UtPndhaXRfcXVldWUsCisJCQkJCQkgKGluc3RhbmNlLT5zdGF0dXMgIT0KKwkJCQkJCSAgYWlfc3RhdHVzX3N0cmVhbV9ydW5fd2FpdCksCisJCQkJCQkgKGRlbGF5KSA/IGRlbGF5ICsKKwkJCQkJCSAxIDogTE9OR19NQVgpOworCisJCWlmICgoaW5zdGFuY2UtPnN0YXR1cyAhPSBhaV9zdGF0dXNfc3RyZWFtX3J1bikKKwkJICAgICYmIChpbnN0YW5jZS0+c3RhdHVzICE9IGFpX3N0YXR1c19zdHJlYW1fZW5kKSkgeworCQkJUERFQlVHKCJTdGFydGluZyBzdHJlYW0gY2FuY2VsZWQuICVkXG4iLAorCQkJICAgICAgIGluc3RhbmNlLT5zdGF0dXMpOworCQkJZXJyID0gTUVfRVJSTk9fQ0FOQ0VMTEVEOworCQl9CisKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQlQRVJST1IoIldhaXQgb24gc3RhcnQgb2Ygc3RhdGUgbWFjaGluZSBpbnRlcnJ1cHRlZC5cbiIpOworCQkJaW5zdGFuY2UtPnN0YXR1cyA9IGFpX3N0YXR1c19ub25lOworCQkJYWlfc3RvcF9pc3IoaW5zdGFuY2UpOworCQkJZXJyID0gTUVfRVJSTk9fU0lHTkFMOworCQl9IGVsc2UgaWYgKChkZWxheSkgJiYgKChqaWZmaWVzIC0gcmVmKSA+IGRlbGF5KSkgeworCQkJaWYgKGluc3RhbmNlLT5zdGF0dXMgIT0gYWlfc3RhdHVzX3N0cmVhbV9ydW4pIHsKKwkJCQlpZiAoaW5zdGFuY2UtPnN0YXR1cyA9PSBhaV9zdGF0dXNfc3RyZWFtX2VuZCkgeworCQkJCQlQREVCVUcoIlRpbWVvdXQgcmVhY2hlZC5cbiIpOworCQkJCX0gZWxzZSBpZiAoKGppZmZpZXMgLSByZWYpID4gZGVsYXkgKyAxKSB7CisJCQkJCVBFUlJPUgorCQkJCQkgICAgKCJUaW1lb3V0IHJlYWNoZWQuIE5vdCBoYW5kbGVkIGJ5IGNvbnRyb2wgdGFzayFcbiIpOworCQkJCQlhaV9zdG9wX2lzcihpbnN0YW5jZSk7CisJCQkJCWluc3RhbmNlLT5zdGF0dXMgPQorCQkJCQkgICAgYWlfc3RhdHVzX3N0cmVhbV9lcnJvcjsKKwkJCQl9IGVsc2UgeworCQkJCQlQRVJST1IKKwkJCQkJICAgICgiVGltZW91dCByZWFjaGVkLiBTaWduYWwgY29tZSBidXQgc3RhdHVzIGlzIHN0cmFuZ2U6ICVkXG4iLAorCQkJCQkgICAgIGluc3RhbmNlLT5zdGF0dXMpOworCQkJCQlhaV9zdG9wX2lzcihpbnN0YW5jZSk7CisJCQkJCWluc3RhbmNlLT5zdGF0dXMgPQorCQkJCQkgICAgYWlfc3RhdHVzX3N0cmVhbV9lcnJvcjsKKwkJCQl9CisKKwkJCQlpbnN0YW5jZS0+YWlfY29udHJvbF90YXNrX2ZsYWcgPSAwOworCQkJCWNhbmNlbF9kZWxheWVkX3dvcmsoJmluc3RhbmNlLT5haV9jb250cm9sX3Rhc2spOworCQkJCWVyciA9IE1FX0VSUk5PX1RJTUVPVVQ7CisJCQl9CisJCX0KKwl9CisjaWZkZWYgTUVERUJVR19JTkZPCisJdG1wID0gaW5sKGluc3RhbmNlLT5jdHJsX3JlZyk7CisJUERFQlVHX1JFRygiY3RybF9yZWcgaW5sKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgdG1wKTsKKworCVBJTkZPKCJTVEFUVVNfQklUX0ZTTT0lcy5cbiIsCisJICAgICAgKHRtcCAmIE1FNDYwMF9BSV9TVEFUVVNfQklUX0ZTTSkgPyAib24iIDogIm9mZiIpOworCVBJTkZPKCJDVFJMX0JJVF9IRl9JUlE9JXMuXG4iLAorCSAgICAgICh0bXAgJiBNRTQ2MDBfQUlfQ1RSTF9CSVRfSEZfSVJRKSA/ICJlbmFibGUiIDogImRpc2FibGUiKTsKKwlQSU5GTygiQ1RSTF9CSVRfSEZfSVJRX1JFU0VUPSVzLlxuIiwKKwkgICAgICAodG1wICYgTUU0NjAwX0FJX0NUUkxfQklUX0hGX0lSUV9SRVNFVCkgPyAicmVzZXQiIDogIndvcmsiKTsKKwlQSU5GTygiQ1RSTF9CSVRfU0NfSVJRPSVzLlxuIiwKKwkgICAgICAodG1wICYgTUU0NjAwX0FJX0NUUkxfQklUX1NDX0lSUSkgPyAiZW5hYmxlIiA6ICJkaXNhYmxlIik7CisJUElORk8oIkNUUkxfQklUX1NDX1JFTE9BRD0lcy5cbiIsCisJICAgICAgKHRtcCAmIE1FNDYwMF9BSV9DVFJMX0JJVF9TQ19SRUxPQUQpID8gIm9uIiA6ICJvZmYiKTsKKwlQSU5GTygiQ1RSTF9CSVRfU0NfSVJRX1JFU0VUPSVzLlxuIiwKKwkgICAgICAodG1wICYgTUU0NjAwX0FJX0NUUkxfQklUX1NDX0lSUV9SRVNFVCkgPyAicmVzZXQiIDogIndvcmsiKTsKKyNlbmRpZgorCisgICAgICBFUlJPUjoKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWU0NjAwX2FpX2lvX3N0cmVhbV9zdGF0dXMobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICAgIGludCB3YWl0LAorCQkJCSAgICAgIGludCAqc3RhdHVzLCBpbnQgKnZhbHVlcywgaW50IGZsYWdzKQoreworCW1lNDYwMF9haV9zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisKKwlQREVCVUcoImV4ZWN1dGVkLiBpZHg9MFxuIik7CisKKwlpbnN0YW5jZSA9IChtZTQ2MDBfYWlfc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJaWYgKGZsYWdzKSB7CisJCVBFUlJPUigiSW52YWxpZCBmbGFnIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlzd2l0Y2ggKGluc3RhbmNlLT5zdGF0dXMpIHsKKwljYXNlIGFpX3N0YXR1c19zaW5nbGVfY29uZmlndXJlZDoKKwljYXNlIGFpX3N0YXR1c19zdHJlYW1fY29uZmlndXJlZDoKKwljYXNlIGFpX3N0YXR1c19zdHJlYW1fZW5kOgorCWNhc2UgYWlfc3RhdHVzX3N0cmVhbV9maWZvX2Vycm9yOgorCWNhc2UgYWlfc3RhdHVzX3N0cmVhbV9idWZmZXJfZXJyb3I6CisJY2FzZSBhaV9zdGF0dXNfc3RyZWFtX2Vycm9yOgorCQkqc3RhdHVzID0gTUVfU1RBVFVTX0lETEU7CisJCWJyZWFrOworCisJY2FzZSBhaV9zdGF0dXNfc3RyZWFtX3J1bl93YWl0OgorCWNhc2UgYWlfc3RhdHVzX3N0cmVhbV9ydW46CisJY2FzZSBhaV9zdGF0dXNfc3RyZWFtX2VuZF93YWl0OgorCQkqc3RhdHVzID0gTUVfU1RBVFVTX0JVU1k7CisJCWJyZWFrOworCisJY2FzZSBhaV9zdGF0dXNfbm9uZToKKwlkZWZhdWx0OgorCQkqc3RhdHVzID0KKwkJICAgIChpbmwoaW5zdGFuY2UtPnN0YXR1c19yZWcpICYgTUU0NjAwX0FJX1NUQVRVU19CSVRfRlNNKSA/CisJCSAgICBNRV9TVEFUVVNfQlVTWSA6IE1FX1NUQVRVU19JRExFOworCQlicmVhazsKKwl9CisKKwlpZiAoKHdhaXQgPT0gTUVfV0FJVF9JRExFKSAmJiAoKnN0YXR1cyA9PSBNRV9TVEFUVVNfQlVTWSkpIHsKKwkJLy8gT25seSBydW5pbmcgcHJvY2VzcyB3aWxsIGludGVycnVwdCB0aGlzIGNhbGwuIEV2ZW50cyBhcmUgc2lnbmFsZWQgd2hlbiBzdGF0dXMgY2hhbmdlLiBFeHRyYSB0aW1lb3V0IGFkZCBmb3Igc2FmZSByZWFzb24uCisJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KGluc3RhbmNlLT53YWl0X3F1ZXVlLAorCQkJCQkJICgoaW5zdGFuY2UtPnN0YXR1cyAhPQorCQkJCQkJICAgYWlfc3RhdHVzX3N0cmVhbV9ydW5fd2FpdCkKKwkJCQkJCSAgJiYgKGluc3RhbmNlLT5zdGF0dXMgIT0KKwkJCQkJCSAgICAgIGFpX3N0YXR1c19zdHJlYW1fcnVuKQorCQkJCQkJICAmJiAoaW5zdGFuY2UtPnN0YXR1cyAhPQorCQkJCQkJICAgICAgYWlfc3RhdHVzX3N0cmVhbV9lbmRfd2FpdCkpLAorCQkJCQkJIExPTkdfTUFYKTsKKworCQlpZiAoaW5zdGFuY2UtPnN0YXR1cyAhPSBhaV9zdGF0dXNfc3RyZWFtX2VuZCkgeworCQkJUERFQlVHKCJXYWl0IGZvciBJRExFIGNhbmNlbGVkLiAlZFxuIiwKKwkJCSAgICAgICBpbnN0YW5jZS0+c3RhdHVzKTsKKwkJCWVyciA9IE1FX0VSUk5PX0NBTkNFTExFRDsKKwkJfQorCisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJUEVSUk9SKCJXYWl0IGZvciBJRExFIGludGVycnVwdGVkLlxuIik7CisJCQlpbnN0YW5jZS0+c3RhdHVzID0gYWlfc3RhdHVzX25vbmU7CisJCQlhaV9zdG9wX2lzcihpbnN0YW5jZSk7CisJCQllcnIgPSBNRV9FUlJOT19TSUdOQUw7CisJCX0KKworCQkqc3RhdHVzID0gTUVfU1RBVFVTX0lETEU7CisJfQorCisJKnZhbHVlcyA9IG1lX2NpcmNfYnVmX3ZhbHVlcygmaW5zdGFuY2UtPmNpcmNfYnVmKTsKKwlQREVCVUcoIm1lX2NpcmNfYnVmX3ZhbHVlcygmaW5zdGFuY2UtPmNpcmNfYnVmKT0lZC5cbiIsICp2YWx1ZXMpOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lNDYwMF9haV9pb19zdHJlYW1fc3RvcChtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICBpbnQgc3RvcF9tb2RlLCBpbnQgZmxhZ3MpCit7CisvKioKKyBAbm90ZSBTdG9wIGlzIGltcGxlbWVudGVkIG9ubHkgaW4gYmxvY2tpbmcgbW9kZS4KKyBAbm90ZSBGdW5jdGlvbiByZXR1cm4gd2hlbiBzdGF0ZSBtYWNoaW5lIGlzIHN0b3BlZC4KKyovCisJbWU0NjAwX2FpX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwl1bnNpZ25lZCBsb25nIGNwdV9mbGFnczsKKwl1aW50MzJfdCBjdHJsOworCWludCByZXQ7CisKKwlQREVCVUcoImV4ZWN1dGVkLiBpZHg9MFxuIik7CisKKwlpZiAoZmxhZ3MpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWcgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCWlmICgoc3RvcF9tb2RlICE9IE1FX1NUT1BfTU9ERV9JTU1FRElBVEUpCisJICAgICYmIChzdG9wX21vZGUgIT0gTUVfU1RPUF9NT0RFX0xBU1RfVkFMVUUpKSB7CisJCVBFUlJPUigiSW52YWxpZCBzdG9wIG1vZGUgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1NUT1BfTU9ERTsKKwl9CisKKwlpbnN0YW5jZSA9IChtZTQ2MDBfYWlfc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJLy8gTWFyayBhcyBzdG9wcGluZy4gPT4gU29mdHdhcmUgc3RvcC4KKwlpbnN0YW5jZS0+c3RhdHVzID0gYWlfc3RhdHVzX3N0cmVhbV9lbmRfd2FpdDsKKworCWlmIChzdG9wX21vZGUgPT0gTUVfU1RPUF9NT0RFX0lNTUVESUFURSkgeworCQlyZXQgPSBhaV9zdG9wX2ltbWVkaWF0ZWx5KGluc3RhbmNlKTsKKworCQlpZiAocmV0KSB7CisJCQlQRVJST1IoIkZTTSBpcyBzdGlsbCBidXN5LlxuIik7CisJCQlNRV9TVUJERVZJQ0VfRVhJVDsKKwkJCXJldHVybiBNRV9FUlJOT19TVUJERVZJQ0VfQlVTWTsKKwkJfQorCQlpbnN0YW5jZS0+YWlfY29udHJvbF90YXNrX2ZsYWcgPSAwOworCisJfSBlbHNlIGlmIChzdG9wX21vZGUgPT0gTUVfU1RPUF9NT0RFX0xBU1RfVkFMVUUpIHsKKwkJLy8gU2V0IHN0b3AgYml0IGluIHJlZ2lzdHJ5LgorCQlzcGluX2xvY2tfaXJxc2F2ZShpbnN0YW5jZS0+Y3RybF9yZWdfbG9jaywgY3B1X2ZsYWdzKTsKKwkJY3RybCA9IGlubChpbnN0YW5jZS0+Y3RybF9yZWcpOworCQljdHJsIHw9IE1FNDYwMF9BSV9DVFJMX0JJVF9TVE9QOworCQlvdXRsKGN0cmwsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIGN0cmwpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrLCBjcHVfZmxhZ3MpOworCisJCS8vIE9ubHkgcnVuaW5nIHByb2Nlc3Mgd2lsbCBpbnRlcnJ1cHQgdGhpcyBjYWxsLiBFdmVudHMgYXJlIHNpZ25hbGVkIHdoZW4gc3RhdHVzIGNoYW5nZS4KKwkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoaW5zdGFuY2UtPndhaXRfcXVldWUsCisJCQkJCQkgKGluc3RhbmNlLT5zdGF0dXMgIT0KKwkJCQkJCSAgYWlfc3RhdHVzX3N0cmVhbV9lbmRfd2FpdCksCisJCQkJCQkgTE9OR19NQVgpOworCisJCWlmIChpbnN0YW5jZS0+c3RhdHVzICE9IGFpX3N0YXR1c19zdHJlYW1fZW5kKSB7CisJCQlQREVCVUcoIlN0b3BwaW5nIHN0cmVhbSBjYW5jZWxlZC5cbiIpOworCQkJcmV0ID0gTUVfRVJSTk9fQ0FOQ0VMTEVEOworCQl9CisKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQlQRVJST1IoIlN0b3BwaW5nIHN0cmVhbSBpbnRlcnJ1cHRlZC5cbiIpOworCQkJaW5zdGFuY2UtPnN0YXR1cyA9IGFpX3N0YXR1c19ub25lOworCQkJcmV0ID0gTUVfRVJSTk9fU0lHTkFMOworCQl9CisJCS8vIEVuZCBvZiB3b3JrLgorCQlhaV9zdG9wX2ltbWVkaWF0ZWx5KGluc3RhbmNlKTsKKworCX0KKworCXJldCA9IGFpX3JlYWRfZGF0YV9wb29saW5nKGluc3RhbmNlKTsKKwlpZiAocmV0ID4gMCkgewkJLy8gRXZlcnl0aGluZyBmaW5lLiBNb3JlIGRhdGFzIHB1dCB0byBzb2Z0d2FyZSBidWZmZXIuCisJCWluc3RhbmNlLT5zdGF0dXMgPSBhaV9zdGF0dXNfc3RyZWFtX2VuZDsKKwkJcmV0ID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwkJLy8gU2lnbmFsIHRoYXQgd2UgcHV0IGxhc3QgZGF0YSB0byBzb2Z0d2FyZSBidWZmZXIuCisJCXdha2VfdXBfaW50ZXJydXB0aWJsZV9hbGwoJmluc3RhbmNlLT53YWl0X3F1ZXVlKTsKKwl9IGVsc2UgaWYgKHJldCA9PSAwKSB7CS8vIEV2ZXJ5dGhpbmcgZmluZS4gTm8gbW9yZSBkYXRhcyBpbiBGSUZPLgorCQlpbnN0YW5jZS0+c3RhdHVzID0gYWlfc3RhdHVzX3N0cmVhbV9lbmQ7CisJCXJldCA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJfSBlbHNlIGlmIChyZXQgPT0gLU1FX0VSUk5PX1JJTkdfQlVGRkVSX09WRVJGTE9XKSB7CS8vIFN0b3AgaXMgdW5zdWNjZXNzZnVsLCBidWZmZXIgaXMgb3ZlcmZsb3cuCisJCWluc3RhbmNlLT5zdGF0dXMgPSBhaV9zdGF0dXNfc3RyZWFtX2J1ZmZlcl9lcnJvcjsKKwkJcmV0ID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwl9IGVsc2UgewkJLy8gU3RvcCBpcyB1bnN1Y2Nlc3NmdWwKKwkJaW5zdGFuY2UtPnN0YXR1cyA9IGFpX3N0YXR1c19zdHJlYW1fZW5kOworCQlyZXQgPSAtcmV0OworCX0KKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBtZTQ2MDBfYWlfcXVlcnlfcmFuZ2VfYnlfbWluX21heChtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJICAgIGludCB1bml0LAorCQkJCQkgICAgaW50ICptaW4sCisJCQkJCSAgICBpbnQgKm1heCwgaW50ICptYXhkYXRhLCBpbnQgKnJhbmdlKQoreworCW1lNDYwMF9haV9zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJaW50IGk7CisJaW50IHIgPSAtMTsKKwlpbnQgZGlmZiA9IDIxRTY7CisKKwlQREVCVUcoImV4ZWN1dGVkLiBpZHg9MFxuIik7CisKKwlpbnN0YW5jZSA9IChtZTQ2MDBfYWlfc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJaWYgKCgqbWF4IC0gKm1pbikgPCAwKSB7CisJCVBFUlJPUigiSW52YWxpZCBtaW5pbXVtIGFuZCBtYXhpbXVtIHZhbHVlcyBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfTUlOX01BWDsKKwl9CisKKwlpZiAoKHVuaXQgPT0gTUVfVU5JVF9WT0xUKSB8fCAodW5pdCA9PSBNRV9VTklUX0FOWSkpIHsKKwkJZm9yIChpID0gMDsgaSA8IGluc3RhbmNlLT5yYW5nZXNfbGVuOyBpKyspIHsKKwkJCWlmICgoaW5zdGFuY2UtPnJhbmdlc1tpXS5taW4gPD0gKm1pbikKKwkJCSAgICAmJiAoKGluc3RhbmNlLT5yYW5nZXNbaV0ubWF4ICsgMTAwMCkgPj0gKm1heCkpIHsKKwkJCQlpZiAoKGluc3RhbmNlLT5yYW5nZXNbaV0ubWF4IC0KKwkJCQkgICAgIGluc3RhbmNlLT5yYW5nZXNbaV0ubWluKSAtICgqbWF4IC0gKm1pbikgPAorCQkJCSAgICBkaWZmKSB7CisJCQkJCXIgPSBpOworCQkJCQlkaWZmID0KKwkJCQkJICAgIChpbnN0YW5jZS0+cmFuZ2VzW2ldLm1heCAtCisJCQkJCSAgICAgaW5zdGFuY2UtPnJhbmdlc1tpXS5taW4pIC0gKCptYXggLQorCQkJCQkJCQkJICptaW4pOworCQkJCX0KKwkJCX0KKwkJfQorCisJCWlmIChyIDwgMCkgeworCQkJUEVSUk9SKCJObyBtYXRjaGluZyByYW5nZSBmb3VuZC5cbiIpOworCQkJcmV0dXJuIE1FX0VSUk5PX05PX1JBTkdFOworCQl9IGVsc2UgeworCQkJKm1pbiA9IGluc3RhbmNlLT5yYW5nZXNbcl0ubWluOworCQkJKm1heCA9IGluc3RhbmNlLT5yYW5nZXNbcl0ubWF4OworCQkJKm1heGRhdGEgPSBNRTQ2MDBfQUlfTUFYX0RBVEE7CisJCQkqcmFuZ2UgPSByOworCQl9CisJfSBlbHNlIHsKKwkJUEVSUk9SKCJJbnZhbGlkIHBoeXNpY2FsIHVuaXQgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1VOSVQ7CisJfQorCisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWU0NjAwX2FpX3F1ZXJ5X251bWJlcl9yYW5nZXMobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJCSBpbnQgdW5pdCwgaW50ICpjb3VudCkKK3sKKwltZTQ2MDBfYWlfc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCisJUERFQlVHKCJleGVjdXRlZC4gaWR4PTBcbiIpOworCisJaW5zdGFuY2UgPSAobWU0NjAwX2FpX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCWlmICgodW5pdCA9PSBNRV9VTklUX1ZPTFQpIHx8ICh1bml0ID09IE1FX1VOSVRfQU5ZKSkgeworCQkqY291bnQgPSBpbnN0YW5jZS0+cmFuZ2VzX2xlbjsKKwl9IGVsc2UgeworCQkqY291bnQgPSAwOworCX0KKworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lNDYwMF9haV9xdWVyeV9yYW5nZV9pbmZvKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICAgIGludCByYW5nZSwKKwkJCQkgICAgICBpbnQgKnVuaXQsCisJCQkJICAgICAgaW50ICptaW4sIGludCAqbWF4LCBpbnQgKm1heGRhdGEpCit7CisJbWU0NjAwX2FpX3N1YmRldmljZV90ICppbnN0YW5jZTsKKworCVBERUJVRygiZXhlY3V0ZWQuIGlkeD0wXG4iKTsKKworCWluc3RhbmNlID0gKG1lNDYwMF9haV9zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlpZiAoKHJhbmdlIDwgaW5zdGFuY2UtPnJhbmdlc19sZW4pICYmIChyYW5nZSA+PSAwKSkgeworCQkqdW5pdCA9IE1FX1VOSVRfVk9MVDsKKwkJKm1pbiA9IGluc3RhbmNlLT5yYW5nZXNbcmFuZ2VdLm1pbjsKKwkJKm1heCA9IGluc3RhbmNlLT5yYW5nZXNbcmFuZ2VdLm1heDsKKwkJKm1heGRhdGEgPSBNRTQ2MDBfQUlfTUFYX0RBVEE7CisJfSBlbHNlIHsKKwkJUEVSUk9SKCJJbnZhbGlkIHJhbmdlIG51bWJlciBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfUkFOR0U7CisJfQorCisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWU0NjAwX2FpX3F1ZXJ5X3RpbWVyKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSBpbnQgdGltZXIsCisJCQkJIGludCAqYmFzZV9mcmVxdWVuY3ksCisJCQkJIGxvbmcgbG9uZyAqbWluX3RpY2tzLCBsb25nIGxvbmcgKm1heF90aWNrcykKK3sKKwltZTQ2MDBfYWlfc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCisJUERFQlVHKCJleGVjdXRlZC4gaWR4PTBcbiIpOworCisJaW5zdGFuY2UgPSAobWU0NjAwX2FpX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCXN3aXRjaCAodGltZXIpIHsKKworCWNhc2UgTUVfVElNRVJfQUNRX1NUQVJUOgorCQkqYmFzZV9mcmVxdWVuY3kgPSBNRTQ2MDBfQUlfQkFTRV9GUkVRVUVOQ1k7CisJCSptaW5fdGlja3MgPSBNRTQ2MDBfQUlfTUlOX0FDUV9USUNLUzsKKwkJKm1heF90aWNrcyA9IE1FNDYwMF9BSV9NQVhfQUNRX1RJQ0tTOworCQlicmVhazsKKworCWNhc2UgTUVfVElNRVJfU0NBTl9TVEFSVDoKKwkJKmJhc2VfZnJlcXVlbmN5ID0gTUU0NjAwX0FJX0JBU0VfRlJFUVVFTkNZOworCQkqbWluX3RpY2tzID0gTUU0NjAwX0FJX01JTl9TQ0FOX1RJQ0tTOworCQkqbWF4X3RpY2tzID0gTUU0NjAwX0FJX01BWF9TQ0FOX1RJQ0tTOworCQlicmVhazsKKworCWNhc2UgTUVfVElNRVJfQ09OVl9TVEFSVDoKKwkJKmJhc2VfZnJlcXVlbmN5ID0gTUU0NjAwX0FJX0JBU0VfRlJFUVVFTkNZOworCQkqbWluX3RpY2tzID0gTUU0NjAwX0FJX01JTl9DSEFOX1RJQ0tTOworCQkqbWF4X3RpY2tzID0gTUU0NjAwX0FJX01BWF9DSEFOX1RJQ0tTOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCVBFUlJPUigiSW52YWxpZCB0aW1lciBzcGVjaWZpZWQuKDB4JTA0eClcbiIsIHRpbWVyKTsKKworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9USU1FUjsKKwl9CisKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZTQ2MDBfYWlfcXVlcnlfbnVtYmVyX2NoYW5uZWxzKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQkgICBpbnQgKm51bWJlcikKK3sKKwltZTQ2MDBfYWlfc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCisJUERFQlVHKCJleGVjdXRlZC4gaWR4PTBcbiIpOworCisJaW5zdGFuY2UgPSAobWU0NjAwX2FpX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKwkqbnVtYmVyID0gaW5zdGFuY2UtPmNoYW5uZWxzOworCisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWU0NjAwX2FpX3F1ZXJ5X3N1YmRldmljZV90eXBlKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQkgIGludCAqdHlwZSwgaW50ICpzdWJ0eXBlKQoreworCVBERUJVRygiZXhlY3V0ZWQuIGlkeD0wXG4iKTsKKworCSp0eXBlID0gTUVfVFlQRV9BSTsKKwkqc3VidHlwZSA9IE1FX1NVQlRZUEVfU1RSRUFNSU5HOworCisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWU0NjAwX2FpX3F1ZXJ5X3N1YmRldmljZV9jYXBzKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLCBpbnQgKmNhcHMpCit7CisJUERFQlVHKCJleGVjdXRlZC4gaWR4PTBcbiIpOworCisJKmNhcHMgPQorCSAgICBNRV9DQVBTX0FJX1RSSUdfU1lOQ0hST05PVVMgfCBNRV9DQVBTX0FJX0ZJRk8gfAorCSAgICBNRV9DQVBTX0FJX0ZJRk9fVEhSRVNIT0xEOworCisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWU0NjAwX2FpX3F1ZXJ5X3N1YmRldmljZV9jYXBzX2FyZ3Moc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlLAorCQkJCQkgICAgICAgaW50IGNhcCwgaW50ICphcmdzLCBpbnQgY291bnQpCit7CisJbWU0NjAwX2FpX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKworCWluc3RhbmNlID0gKG1lNDYwMF9haV9zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlQREVCVUcoImV4ZWN1dGVkLiBpZHg9MFxuIik7CisKKwlpZiAoY291bnQgIT0gMSkgeworCQlQRVJST1IoIkludmFsaWQgY2FwYWJpbGl0eSBhcmd1bWVudCBjb3VudC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9DQVBfQVJHX0NPVU5UOworCX0KKworCXN3aXRjaCAoY2FwKSB7CisJY2FzZSBNRV9DQVBfQUlfRklGT19TSVpFOgorCQlhcmdzWzBdID0gTUU0NjAwX0FJX0ZJRk9fQ09VTlQ7CisJCWJyZWFrOworCisJY2FzZSBNRV9DQVBfQUlfQlVGRkVSX1NJWkU6CisJCWFyZ3NbMF0gPQorCQkgICAgKGluc3RhbmNlLT5jaXJjX2J1Zi5idWYpID8gTUU0NjAwX0FJX0NJUkNfQlVGX0NPVU5UIDogMDsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlQRVJST1IoIkludmFsaWQgY2FwYWJpbGl0eS5cbiIpOworCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0NBUDsKKwkJYXJnc1swXSA9IDA7CisJfQorCisJcmV0dXJuIGVycjsKK30KKwordm9pZCBhaV9saW1pdGVkX2lzcihtZTQ2MDBfYWlfc3ViZGV2aWNlX3QgKiBpbnN0YW5jZSwgY29uc3QgdWludDMyX3QgaXJxX3N0YXR1cywKKwkJICAgIGNvbnN0IHVpbnQzMl90IGN0cmxfc3RhdHVzKQoreworCWludCB0b19yZWFkOworCisJaWYgKCFpbnN0YW5jZS0+Zmlmb19pcnFfdGhyZXNob2xkKSB7CS8vTm8gdGhyZXNob2xkIHByb3ZpZGVkLiBTQyBlbmRzIHdvcmsuIEhGIG5lZWQgcmVzZXRpbmcuCisJCWlmIChpcnFfc3RhdHVzICYgTUU0NjAwX0lSUV9TVEFUVVNfQklUX1NDKSB7CisJCQlpZiAoYWlfcmVhZF9kYXRhKGluc3RhbmNlLCBpbnN0YW5jZS0+SVNNLm5leHQpICE9IGluc3RhbmNlLT5JU00ubmV4dCkgewkvL0VSUk9SIQorCQkJCVBFUlJPUgorCQkJCSAgICAoIkxpbWl0ZWQgYW1vdW50cyBhcXVzaXRpb24gd2l0aCBUSD0wOiBDaXJjdWxhciBidWZmZXIgZnVsbCFcbiIpOworCQkJCWluc3RhbmNlLT5zdGF0dXMgPQorCQkJCSAgICBhaV9zdGF0dXNfc3RyZWFtX2J1ZmZlcl9lcnJvcjsKKwkJCX0gZWxzZSB7CisJCQkJaW5zdGFuY2UtPnN0YXR1cyA9IGFpX3N0YXR1c19zdHJlYW1fZW5kOworCQkJfQorCQkJLy9FbmQgb2Ygd29yay4KKwkJCWFpX3N0b3BfaXNyKGluc3RhbmNlKTsKKwkJfSBlbHNlIGlmIChpcnFfc3RhdHVzICYgTUU0NjAwX0lSUV9TVEFUVVNfQklUX0FJX0hGKSB7CisJCQlpbnN0YW5jZS0+SVNNLmdsb2JhbF9yZWFkICs9IE1FNDYwMF9BSV9GSUZPX0hBTEY7CisKKwkJCWlmIChhaV9yZWFkX2RhdGEoaW5zdGFuY2UsIE1FNDYwMF9BSV9GSUZPX0hBTEYpICE9IE1FNDYwMF9BSV9GSUZPX0hBTEYpIHsJLy9FUlJPUiEKKwkJCQlQRVJST1IKKwkJCQkgICAgKCJMaW1pdGVkIGFtb3VudHMgYXF1c2l0aW9uIHdpdGggVEggPSAwOiBDaXJjdWxhciBidWZmZXIgZnVsbCFcbiIpOworCQkJCS8vRW5kIG9mIHdvcmsuCisJCQkJYWlfc3RvcF9pc3IoaW5zdGFuY2UpOworCQkJCWluc3RhbmNlLT5zdGF0dXMgPQorCQkJCSAgICBhaV9zdGF0dXNfc3RyZWFtX2J1ZmZlcl9lcnJvcjsKKwkJCX0gZWxzZSB7CisJCQkJLy9Db250aW51ZS4KKwkJCQlhaV9saW1pdGVkX0lTTShpbnN0YW5jZSwgaXJxX3N0YXR1cyk7CisJCQl9CisJCX0KKwkJLy9TaWduYWwgdXNlci4KKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlX2FsbCgmaW5zdGFuY2UtPndhaXRfcXVldWUpOworCX0gZWxzZQkJCS8vaWYoaW5zdGFuY2UtPmZpZm9faXJxX3RocmVzaG9sZCkKKwl7CisJCWlmIChpcnFfc3RhdHVzICYgTUU0NjAwX0lSUV9TVEFUVVNfQklUX1NDKSB7CisJCQlpbnN0YW5jZS0+SVNNLnJlYWQgPSAwOworCQkJaWYgKChpbnN0YW5jZS0+Zmlmb19pcnFfdGhyZXNob2xkIDwgTUU0NjAwX0FJX0ZJRk9fSEFMRikKKwkJCSAgICAmJiAoIShjdHJsX3N0YXR1cyAmIE1FNDYwMF9BSV9TVEFUVVNfQklUX0hGX0RBVEEpKSkKKwkJCXsKKwkJCQl0b19yZWFkID0KKwkJCQkgICAgTUU0NjAwX0FJX0ZJRk9fSEFMRiAtCisJCQkJICAgIChNRTQ2MDBfQUlfRklGT19IQUxGICUKKwkJCQkgICAgIGluc3RhbmNlLT5maWZvX2lycV90aHJlc2hvbGQpOworCQkJCVBERUJVRworCQkJCSAgICAoIkxpbWl0ZWQgYW1vdW50cyBhcXVzaXRpb24gd2l0aCBUSCAhPSAwOiBOb3QgZmFzdCBlbm91Z2ggZGF0YSBhcXVzaXRpb24hIGNvcnJlY3Rpb249JWRcbiIsCisJCQkJICAgICB0b19yZWFkKTsKKwkJCX0gZWxzZSB7CisJCQkJdG9fcmVhZCA9IGluc3RhbmNlLT5JU00ubmV4dDsKKwkJCX0KKwkJCWluc3RhbmNlLT5JU00uZ2xvYmFsX3JlYWQgKz0gdG9fcmVhZDsKKworCQkJYWlfcmVzY2hlZHVsZV9TQyhpbnN0YW5jZSk7CisKKwkJCWlmIChhaV9yZWFkX2RhdGEoaW5zdGFuY2UsIHRvX3JlYWQpICE9IHRvX3JlYWQpIHsJLy9FUlJPUiEKKwkJCQlQRVJST1IKKwkJCQkgICAgKCJMaW1pdGVkIGFtb3VudHMgYXF1c2l0aW9uIHdpdGggVEggIT0gMDogQ2lyY3VsYXIgYnVmZmVyIGZ1bGwhXG4iKTsKKwkJCQkvL0VuZCBvZiB3b3JrLgorCQkJCWFpX3N0b3BfaXNyKGluc3RhbmNlKTsKKwkJCQlpbnN0YW5jZS0+c3RhdHVzID0KKwkJCQkgICAgYWlfc3RhdHVzX3N0cmVhbV9idWZmZXJfZXJyb3I7CisJCQl9IGVsc2UgeworCQkJCS8vQ29udGludWUuCisJCQkJYWlfbGltaXRlZF9JU00oaW5zdGFuY2UsIGlycV9zdGF0dXMpOworCQkJfQorCisJCQkvL1NpZ25hbCB1c2VyLgorCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlX2FsbCgmaW5zdGFuY2UtPndhaXRfcXVldWUpOworCQl9IGVsc2UgaWYgKGlycV9zdGF0dXMgJiBNRTQ2MDBfSVJRX1NUQVRVU19CSVRfQUlfSEYpIHsKKwkJCWluc3RhbmNlLT5JU00ucmVhZCArPSBNRTQ2MDBfQUlfRklGT19IQUxGOworCQkJaW5zdGFuY2UtPklTTS5nbG9iYWxfcmVhZCArPSBNRTQ2MDBfQUlfRklGT19IQUxGOworCisJCQlpZiAoYWlfcmVhZF9kYXRhKGluc3RhbmNlLCBNRTQ2MDBfQUlfRklGT19IQUxGKSAhPSBNRTQ2MDBfQUlfRklGT19IQUxGKSB7CS8vRVJST1IhCisJCQkJUEVSUk9SCisJCQkJICAgICgiTGltaXRlZCBhbW91bnRzIGFxdXNpdGlvbiB3aXRoIFRIICE9IDA6IENpcmN1bGFyIGJ1ZmZlciBmdWxsIVxuIik7CisJCQkJYWlfc3RvcF9pc3IoaW5zdGFuY2UpOworCisJCQkJaW5zdGFuY2UtPnN0YXR1cyA9CisJCQkJICAgIGFpX3N0YXR1c19zdHJlYW1fYnVmZmVyX2Vycm9yOworCQkJCS8vU2lnbmFsIHVzZXIuCisJCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlX2FsbCgmaW5zdGFuY2UtPgorCQkJCQkJCSAgd2FpdF9xdWV1ZSk7CisJCQl9IGVsc2UgeworCQkJCS8vQ291bnRpbnVlLgorCQkJCWFpX2xpbWl0ZWRfSVNNKGluc3RhbmNlLCBpcnFfc3RhdHVzKTsKKwkJCX0KKwkJfQorCisJCWlmIChpbnN0YW5jZS0+SVNNLmdsb2JhbF9yZWFkID49IGluc3RhbmNlLT5kYXRhX3JlcXVpcmVkKSB7CS8vRW5kIG9mIHdvcmsuIE5leHQgcGFyYW5vaWQgcGljZSBvZiBjb2RlOiAnPj0nIGluc3RlYWQgb2QgJz09JyBvbmx5IHRvIGJlIHN1cmUuCisJCQlhaV9zdG9wX2lzcihpbnN0YW5jZSk7CisJCQlpZiAoaW5zdGFuY2UtPnN0YXR1cyA8IGFpX3N0YXR1c19zdHJlYW1fZW5kKSB7CisJCQkJaW5zdGFuY2UtPnN0YXR1cyA9IGFpX3N0YXR1c19zdHJlYW1fZW5kOworCQkJfQorI2lmZGVmIE1FREVCVUdfRVJST1IKKwkJCWlmIChpbnN0YW5jZS0+SVNNLmdsb2JhbF9yZWFkID4gaW5zdGFuY2UtPmRhdGFfcmVxdWlyZWQpIHsJLy9UaGlzIGlzIHNlY3VyaXR5IGNoZWNrIGNhc2UuIFRoaXMgc2hvdWxkIG5ldmVyIGV2ZXIgaGFwcGVuZCEKKwkJCQlQRVJST1IKKwkJCQkgICAgKCJMaW1pdGVkIGFtb3VudHMgYXF1c2l0aW9uOiBSZWFkIG1vcmUgZGF0YSB0aGFuIG5lY2Vzc2FyeSEgZGF0YV9yZXF1aXJlZD0lZCA8IHJlYWQ9JWRcbiIsCisJCQkJICAgICBpbnN0YW5jZS0+ZGF0YV9yZXF1aXJlZCwKKwkJCQkgICAgIGluc3RhbmNlLT5JU00uZ2xvYmFsX3JlYWQpOworCQkJCS8vU2lnbmFsIGVycm9yICh3YXJuaW5nPz8pLgorCQkJCWluc3RhbmNlLT5zdGF0dXMgPSBhaV9zdGF0dXNfc3RyZWFtX2Vycm9yOworCQkJfQorI2VuZGlmCisJCX0KKwl9Cit9CisKK3ZvaWQgYWlfaW5maW5pdGVfaXNyKG1lNDYwMF9haV9zdWJkZXZpY2VfdCAqIGluc3RhbmNlLAorCQkgICAgIGNvbnN0IHVpbnQzMl90IGlycV9zdGF0dXMsIGNvbnN0IHVpbnQzMl90IGN0cmxfc3RhdHVzKQoreworCWludCB0b19yZWFkOworCisJaWYgKGlycV9zdGF0dXMgJiBNRTQ2MDBfSVJRX1NUQVRVU19CSVRfU0MpIHsJLy9uZXh0IGNodW5jayBvZiBkYXRhIC0+IHJlYWQgZmlmbworCQkvL1NldCBuZXcgc3RhdGUgaW4gSVNNLgorCQlpZiAoKGluc3RhbmNlLT5maWZvX2lycV90aHJlc2hvbGQgPCBNRTQ2MDBfQUlfRklGT19IQUxGKSAmJiAoIShjdHJsX3N0YXR1cyAmIE1FNDYwMF9BSV9TVEFUVVNfQklUX0hGX0RBVEEpKSkgewkvL1RoZXJlIGlzIG1vcmUgZGF0YSB0aGFuIHdlIGVjcGVjdGVkLiBQcm9wYWJseSB3ZSBhcmVuJ3QgZmFzdCBlbm91Z2guIFJlYWQgYXMgbWFueSBhcyBwb3NzaWJsZS4KKwkJCWlmIChpbnN0YW5jZS0+Zmlmb19pcnFfdGhyZXNob2xkKSB7CisJCQkJdG9fcmVhZCA9CisJCQkJICAgIE1FNDYwMF9BSV9GSUZPX0hBTEYgLQorCQkJCSAgICAoTUU0NjAwX0FJX0ZJRk9fSEFMRiAlCisJCQkJICAgICBpbnN0YW5jZS0+Zmlmb19pcnFfdGhyZXNob2xkKTsKKwkJCQlpZiAodG9fcmVhZCA+IGluc3RhbmNlLT5maWZvX2lycV90aHJlc2hvbGQpIHsKKwkJCQkJUERFQlVHCisJCQkJCSAgICAoIkluZmluaXRlIGFxdXNpdGlvbjogTm90IGZhc3QgZW5vdWdoIGRhdGEgYXF1c2l0aW9uISBUSCAhPSAwOiBjb3JyZWN0aW9uPSVkXG4iLAorCQkJCQkgICAgIHRvX3JlYWQpOworCQkJCX0KKwkJCX0gZWxzZSB7CS8vTm8gdGhyZXNob2xkIHNwZWNpZmllZC4KKwkJCQl0b19yZWFkID0gTUU0NjAwX0FJX0ZJRk9fSEFMRjsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXRvX3JlYWQgPSBpbnN0YW5jZS0+SVNNLm5leHQ7CisJCX0KKworCQlpbnN0YW5jZS0+SVNNLnJlYWQgKz0gdG9fcmVhZDsKKworCQkvL0dldCBkYXRhCisJCWlmIChhaV9yZWFkX2RhdGEoaW5zdGFuY2UsIHRvX3JlYWQpICE9IHRvX3JlYWQpIHsJLy9FUlJPUiEKKwkJCVBFUlJPUigiSW5maW5pdGUgYXF1c2l0aW9uOiBDaXJjdWxhciBidWZmZXIgZnVsbCFcbiIpOworCQkJYWlfc3RvcF9pc3IoaW5zdGFuY2UpOworCQkJaW5zdGFuY2UtPnN0YXR1cyA9IGFpX3N0YXR1c19zdHJlYW1fYnVmZmVyX2Vycm9yOworCQl9IGVsc2UgeworCQkJYWlfaW5maW5pdGVfSVNNKGluc3RhbmNlKTsKKwkJCWluc3RhbmNlLT5JU00uZ2xvYmFsX3JlYWQgKz0gaW5zdGFuY2UtPklTTS5yZWFkOworCQkJaW5zdGFuY2UtPklTTS5yZWFkID0gMDsKKwkJfQorCisJCS8vU2lnbmFsIGRhdGEgdG8gdXNlcgorCQl3YWtlX3VwX2ludGVycnVwdGlibGVfYWxsKCZpbnN0YW5jZS0+d2FpdF9xdWV1ZSk7CisJfSBlbHNlIGlmIChpcnFfc3RhdHVzICYgTUU0NjAwX0lSUV9TVEFUVVNfQklUX0FJX0hGKSB7CS8vZmlmbyBpcyBoYWxmIGZ1bGwgLT4gcmVhZCBmaWZvICAgICAgIExhcmdlIGJsb2NrcyBvbmx5IQorCQlpbnN0YW5jZS0+SVNNLnJlYWQgKz0gTUU0NjAwX0FJX0ZJRk9fSEFMRjsKKworCQlpZiAoYWlfcmVhZF9kYXRhKGluc3RhbmNlLCBNRTQ2MDBfQUlfRklGT19IQUxGKSAhPSBNRTQ2MDBfQUlfRklGT19IQUxGKSB7CS8vRVJST1IhCisJCQlQRVJST1IoIkluZmluaXRlIGFxdXNpdGlvbjogQ2lyY3VsYXIgYnVmZmVyIGZ1bGwhXG4iKTsKKwkJCWFpX3N0b3BfaXNyKGluc3RhbmNlKTsKKwkJCWluc3RhbmNlLT5zdGF0dXMgPSBhaV9zdGF0dXNfc3RyZWFtX2J1ZmZlcl9lcnJvcjsKKworCQkJLy9TaWduYWwgaXQuCisJCQl3YWtlX3VwX2ludGVycnVwdGlibGVfYWxsKCZpbnN0YW5jZS0+d2FpdF9xdWV1ZSk7CisJCX0gZWxzZSB7CisJCQlhaV9pbmZpbml0ZV9JU00oaW5zdGFuY2UpOworCQl9CisJfQorfQorCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsIDYsIDE5KQorc3RhdGljIGlycXJldHVybl90IG1lNDYwMF9haV9pc3IoaW50IGlycSwgdm9pZCAqZGV2X2lkKQorI2Vsc2UKK3N0YXRpYyBpcnFyZXR1cm5fdCBtZTQ2MDBfYWlfaXNyKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCisjZW5kaWYKK3sJCQkJLy8vIEBub3RlIFRoaXMgaXMgdGltZSBjcml0aWNhbCBmdW5jdGlvbiEKKwl1aW50MzJfdCBpcnFfc3RhdHVzOworCXVpbnQzMl90IGN0cmxfc3RhdHVzOworCW1lNDYwMF9haV9zdWJkZXZpY2VfdCAqaW5zdGFuY2UgPSBkZXZfaWQ7CisJLy9pbnQgdG9fcmVhZDsKKworCVBERUJVRygiZXhlY3V0ZWQuIGlkeD0wXG4iKTsKKworCWlmIChpcnEgIT0gaW5zdGFuY2UtPmlycSkgeworCQlQRVJST1IoIkluY29ycmVjdCBpbnRlcnJ1cHQgbnVtOiAlZC5cbiIsIGlycSk7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisKKwlpcnFfc3RhdHVzID0gaW5sKGluc3RhbmNlLT5pcnFfc3RhdHVzX3JlZyk7CisJaWYgKCEKKwkgICAgKGlycV9zdGF0dXMgJgorCSAgICAgKE1FNDYwMF9JUlFfU1RBVFVTX0JJVF9BSV9IRiB8IE1FNDYwMF9JUlFfU1RBVFVTX0JJVF9TQykpKSB7CisjaWZkZWYgTUVERUJVR19JTkZPCisJCWlmICgoaXJxX3N0YXR1cyAmIChNRTQ2MDBfSVJRX1NUQVRVU19CSVRfQUlfSEYgfCBNRTQ2MDBfSVJRX1NUQVRVU19CSVRfU0MgfCBNRTQ2MDBfSVJRX1NUQVRVU19CSVRfTEUpKSA9PSBNRTQ2MDBfSVJRX1NUQVRVU19CSVRfTEUpIHsJLy9UaGlzIGlzIHNlY3VyaXR5IGNoZWNrIGNhc2UuIExFIGlzIHVudXNlZC4gVGhpcyBzaG91bGQgbmV2ZXIgZXZlciBoYXBwZW5kLgorCQkJUElORk8KKwkJCSAgICAoIiVsZCBTaGFyZWQgaW50ZXJydXB0LiAlcygpOiBpcnFfc3RhdHVzX3JlZz1MRV9JUlFcbiIsCisJCQkgICAgIGppZmZpZXMsIF9fZnVuY19fKTsKKwkJfSBlbHNlIHsKKwkJCVBJTkZPCisJCQkgICAgKCIlbGQgU2hhcmVkIGludGVycnVwdC4gJXMoKTogaXJxX3N0YXR1c19yZWc9MHglMDRYXG4iLAorCQkJICAgICBqaWZmaWVzLCBfX2Z1bmNfXywgaXJxX3N0YXR1cyk7CisJCX0KKyNlbmRpZgorCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCisJaWYgKCFpbnN0YW5jZS0+Y2lyY19idWYuYnVmKSB7CS8vU2VjdXJpdHkgY2hlY2suCisJCVBFUlJPUl9DUklUSUNBTCgiQ0lSQ1VMQVIgQlVGRkVSIE5PVCBFWElTVFMhXG4iKTsKKwkJYWlfc3RvcF9pc3IoaW5zdGFuY2UpOworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQorCS8vR2V0IHRoZSBzdGF0dXMgcmVnaXN0ZXIuCisJY3RybF9zdGF0dXMgPSBpbmwoaW5zdGFuY2UtPnN0YXR1c19yZWcpOworCisjaWZkZWYgTUVERUJVR19JTkZPCisJaWYgKGlycV9zdGF0dXMgJiBNRTQ2MDBfSVJRX1NUQVRVU19CSVRfQUlfSEYpCisJCVBJTkZPKCJIRiBpbnRlcnJ1cHQgYWN0aXZlXG4iKTsKKwlpZiAoaXJxX3N0YXR1cyAmIE1FNDYwMF9JUlFfU1RBVFVTX0JJVF9TQykKKwkJUElORk8oIlNDIGludGVycnVwdCBhY3RpdmVcbiIpOworCWlmIChpcnFfc3RhdHVzICYgTUU0NjAwX0lSUV9TVEFUVVNfQklUX0xFKQorCQlQSU5GTygiTEUgaW50ZXJydXB0IGFjdGl2ZVxuIik7CisjZW5kaWYKKworCS8vVGhpcyBpcyBzYWZldHkgY2hlY2shCisJaWYgKChpcnFfc3RhdHVzICYgTUU0NjAwX0lSUV9TVEFUVVNfQklUX0FJX0hGKQorCSAgICAmJiAoY3RybF9zdGF0dXMgJiBNRTQ2MDBfQUlfU1RBVFVTX0JJVF9IRl9EQVRBKSkgeworCQlQREVCVUcoIkhGIGludGVycnVwdCBhY3RpdmUgYnV0IEZJRk8gdW5kZXIgaGFsZlxuIik7CisJCS8vUmVzZXQgSEYgaW50ZXJydXB0IGxhdGNoLgorCQlzcGluX2xvY2soaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2spOworCQlvdXRsKGN0cmxfc3RhdHVzIHwgTUU0NjAwX0FJX0NUUkxfQklUX0hGX0lSUV9SRVNFVCwKKwkJICAgICBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgY3RybF9zdGF0dXMpOworCQlvdXRsKGN0cmxfc3RhdHVzLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgY3RybF9zdGF0dXMpOworCQlzcGluX3VubG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9CisjaWZkZWYgTUVERUJVR19JTkZPCisJUElORk8oIlNUQVRVU19CSVRfRlNNPSVzLlxuIiwKKwkgICAgICAoY3RybF9zdGF0dXMgJiBNRTQ2MDBfQUlfU1RBVFVTX0JJVF9GU00pID8gIm9uIiA6ICJvZmYiKTsKKworCVBJTkZPKCJTVEFUVVNfQklUX0VGX0NIQU5ORUw9JXMuXG4iLAorCSAgICAgIChjdHJsX3N0YXR1cyAmIE1FNDYwMF9BSV9TVEFUVVNfQklUX0VGX0NIQU5ORUwpID8gIm5vdCBlbXB0eSIgOgorCSAgICAgICJlbXB0eSIpOworCVBJTkZPKCJTVEFUVVNfQklUX0hGX0NIQU5ORUw9JXMuXG4iLAorCSAgICAgIChjdHJsX3N0YXR1cyAmIE1FNDYwMF9BSV9TVEFUVVNfQklUX0hGX0NIQU5ORUwpID8gIiA8IEhGIiA6CisJICAgICAgIiA+IEhGIik7CisJUElORk8oIlNUQVRVU19CSVRfRkZfQ0hBTk5FTD0lcy5cbiIsCisJICAgICAgKGN0cmxfc3RhdHVzICYgTUU0NjAwX0FJX1NUQVRVU19CSVRfRkZfQ0hBTk5FTCkgPyAibm90IGZ1bGwiIDoKKwkgICAgICAiZnVsbCIpOworCisJUElORk8oIlNUQVRVU19CSVRfRUZfREFUQT0lcy5cbiIsCisJICAgICAgKGN0cmxfc3RhdHVzICYgTUU0NjAwX0FJX1NUQVRVU19CSVRfRUZfREFUQSkgPyAibm90IGVtcHR5IiA6CisJICAgICAgImVtcHR5Iik7CisJUElORk8oIlNUQVRVU19CSVRfSEZfREFUQT0lcy5cbiIsCisJICAgICAgKGN0cmxfc3RhdHVzICYgTUU0NjAwX0FJX1NUQVRVU19CSVRfSEZfREFUQSkgPyAiIDwgSEYiIDogIiA+IEhGIik7CisJUElORk8oIlNUQVRVU19CSVRfRkZfREFUQT0lcy5cbiIsCisJICAgICAgKGN0cmxfc3RhdHVzICYgTUU0NjAwX0FJX1NUQVRVU19CSVRfRkZfREFUQSkgPyAibm90IGZ1bGwiIDoKKwkgICAgICAiZnVsbCIpOworCisJUElORk8oIkNUUkxfQklUX0hGX0lSUT0lcy5cbiIsCisJICAgICAgKGN0cmxfc3RhdHVzICYgTUU0NjAwX0FJX0NUUkxfQklUX0hGX0lSUSkgPyAiZW5hYmxlIiA6ICJkaXNhYmxlIik7CisJUElORk8oIkNUUkxfQklUX0hGX0lSUV9SRVNFVD0lcy5cbiIsCisJICAgICAgKGN0cmxfc3RhdHVzICYgTUU0NjAwX0FJX0NUUkxfQklUX0hGX0lSUV9SRVNFVCkgPyAicmVzZXQiIDoKKwkgICAgICAid29yayIpOworCVBJTkZPKCJDVFJMX0JJVF9TQ19JUlE9JXMuXG4iLAorCSAgICAgIChjdHJsX3N0YXR1cyAmIE1FNDYwMF9BSV9DVFJMX0JJVF9TQ19JUlEpID8gImVuYWJsZSIgOiAiZGlzYWJsZSIpOworCVBJTkZPKCJDVFJMX0JJVF9TQ19SRUxPQUQ9JXMuXG4iLAorCSAgICAgIChjdHJsX3N0YXR1cyAmIE1FNDYwMF9BSV9DVFJMX0JJVF9TQ19SRUxPQUQpID8gIm9uIiA6ICJvZmYiKTsKKwlQSU5GTygiQ1RSTF9CSVRfU0NfSVJRX1JFU0VUPSVzLlxuIiwKKwkgICAgICAoY3RybF9zdGF0dXMgJiBNRTQ2MDBfQUlfQ1RSTF9CSVRfU0NfSVJRX1JFU0VUKSA/ICJyZXNldCIgOgorCSAgICAgICJ3b3JrIik7CisjZW5kaWYKKworCS8vTG9vayBmb3Igb3ZlcmZsb3cgZXJyb3IuCisJaWYgKCEoY3RybF9zdGF0dXMgJiBNRTQ2MDBfQUlfU1RBVFVTX0JJVF9GRl9EQVRBKSkgeworCQkvL0ZJRk8gaXMgZnVsbC4gUmVhZCBkYXRhcyBhbmQgcmVzZXQgYWxsIHNldHRpbmdzLgorCQlQRVJST1IoIkZJRk8gb3ZlcmZsb3cuXG4iKTsKKwkJYWlfcmVhZF9kYXRhKGluc3RhbmNlLCBNRTQ2MDBfQUlfRklGT19DT1VOVCk7CisJCWFpX3N0b3BfaXNyKGluc3RhbmNlKTsKKworCQlpbnN0YW5jZS0+c3RhdHVzID0gYWlfc3RhdHVzX3N0cmVhbV9maWZvX2Vycm9yOworCQkvL1NpZ25hbCBpdC4KKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlX2FsbCgmaW5zdGFuY2UtPndhaXRfcXVldWUpOworCisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9CisKKwlpZiAoIWluc3RhbmNlLT5kYXRhX3JlcXVpcmVkKSB7CS8vVGhpcyBpcyBpbmZpbml0ZSBhcXVzaXRpb24uCisjaWZkZWYgTUVERUJVR19FUlJPUgorCQlpZiAoKGlycV9zdGF0dXMgJgorCQkgICAgIChNRTQ2MDBfSVJRX1NUQVRVU19CSVRfQUlfSEYgfCBNRTQ2MDBfSVJRX1NUQVRVU19CSVRfU0MpKQorCQkgICAgPT0KKwkJICAgIChNRTQ2MDBfSVJRX1NUQVRVU19CSVRfQUlfSEYgfCBNRTQ2MDBfSVJRX1NUQVRVU19CSVRfU0MpKSB7CisJCQkvLy9JbiBpbmZpbml0ZSBtb2RlIG9ubHkgb25lIGludGVycnVwdCBzb3VyY2Ugc2hvdWxkIGJlIHJlcG9ydGVkIQorCQkJUEVSUk9SCisJCQkgICAgKCJFcnJvciBpbiBJU00hIEluZmluaXRlIGFxdXNpdGlvbjogSEYgYW5kIFNDIGludGVycnVwdHMgYWN0aXZlISB0aHJlc2hvbGQ9JWQgbmV4dD0lZCBjdHJsPTB4JTA0WCBpcnFfc3RhdHVzX3JlZz0weCUwNFgiLAorCQkJICAgICBpbnN0YW5jZS0+Zmlmb19pcnFfdGhyZXNob2xkLCBpbnN0YW5jZS0+SVNNLm5leHQsCisJCQkgICAgIGN0cmxfc3RhdHVzLCBpcnFfc3RhdHVzKTsKKwkJfQorI2VuZGlmCisKKwkJYWlfaW5maW5pdGVfaXNyKGluc3RhbmNlLCBpcnFfc3RhdHVzLCBjdHJsX3N0YXR1cyk7CisKKyNpZmRlZiBNRURFQlVHX0lORk8KKwkJY3RybF9zdGF0dXMgPSBpbmwoaW5zdGFuY2UtPmN0cmxfcmVnKTsKKyNlbmRpZgorCX0gZWxzZSB7CisKKwkJYWlfbGltaXRlZF9pc3IoaW5zdGFuY2UsIGlycV9zdGF0dXMsIGN0cmxfc3RhdHVzKTsKKwkJY3RybF9zdGF0dXMgPSBpbmwoaW5zdGFuY2UtPnN0YXR1c19yZWcpOworCQlpZiAoIShjdHJsX3N0YXR1cyAmIChNRTQ2MDBfQUlfU1RBVFVTX0JJVF9IRl9EQVRBIHwgTUU0NjAwX0FJX0NUUkxfQklUX0hGX0lSUV9SRVNFVCkpKSB7CS8vSEYgYWN0aXZlLCBidXQgd2UgaGF2ZSBtb3JlIHRoYW4gaGFsZiBhbHJlYWR5ID0+IEhGIHdpbGwgbmV2ZXIgY29tZQorCQkJUERFQlVHCisJCQkgICAgKCJNSVNTRUQgSEYuIGRhdGFfcmVxdWlyZWQ9JWQgSVNNLnJlYWQ9JWQgSVNNLmdsb2JhbD0lZCBJU00ubmV4dD0lZFxuIiwKKwkJCSAgICAgaW5zdGFuY2UtPmRhdGFfcmVxdWlyZWQsIGluc3RhbmNlLT5JU00ucmVhZCwKKwkJCSAgICAgaW5zdGFuY2UtPklTTS5nbG9iYWxfcmVhZCwgaW5zdGFuY2UtPklTTS5uZXh0KTsKKwkJCWFpX2xpbWl0ZWRfaXNyKGluc3RhbmNlLCBNRTQ2MDBfSVJRX1NUQVRVU19CSVRfQUlfSEYsCisJCQkJICAgICAgIGN0cmxfc3RhdHVzKTsKKwkJfQorCX0KKworI2lmZGVmIE1FREVCVUdfSU5GTworCVBJTkZPKCJTVEFUVVNfQklUX0ZTTT0lcy5cbiIsCisJICAgICAgKGN0cmxfc3RhdHVzICYgTUU0NjAwX0FJX1NUQVRVU19CSVRfRlNNKSA/ICJvbiIgOiAib2ZmIik7CisKKwlQSU5GTygiU1RBVFVTX0JJVF9FRl9DSEFOTkVMPSVzLlxuIiwKKwkgICAgICAoY3RybF9zdGF0dXMgJiBNRTQ2MDBfQUlfU1RBVFVTX0JJVF9FRl9DSEFOTkVMKSA/ICJub3QgZW1wdHkiIDoKKwkgICAgICAiZW1wdHkiKTsKKwlQSU5GTygiU1RBVFVTX0JJVF9IRl9DSEFOTkVMPSVzLlxuIiwKKwkgICAgICAoY3RybF9zdGF0dXMgJiBNRTQ2MDBfQUlfU1RBVFVTX0JJVF9IRl9DSEFOTkVMKSA/ICIgPCBIRiIgOgorCSAgICAgICIgPiBIRiIpOworCVBJTkZPKCJTVEFUVVNfQklUX0ZGX0NIQU5ORUw9JXMuXG4iLAorCSAgICAgIChjdHJsX3N0YXR1cyAmIE1FNDYwMF9BSV9TVEFUVVNfQklUX0ZGX0NIQU5ORUwpID8gIm5vdCBmdWxsIiA6CisJICAgICAgImZ1bGwiKTsKKworCVBJTkZPKCJTVEFUVVNfQklUX0VGX0RBVEE9JXMuXG4iLAorCSAgICAgIChjdHJsX3N0YXR1cyAmIE1FNDYwMF9BSV9TVEFUVVNfQklUX0VGX0RBVEEpID8gIm5vdCBlbXB0eSIgOgorCSAgICAgICJlbXB0eSIpOworCVBJTkZPKCJTVEFUVVNfQklUX0hGX0RBVEE9JXMuXG4iLAorCSAgICAgIChjdHJsX3N0YXR1cyAmIE1FNDYwMF9BSV9TVEFUVVNfQklUX0hGX0RBVEEpID8gIiA8IEhGIiA6ICIgPiBIRiIpOworCVBJTkZPKCJTVEFUVVNfQklUX0ZGX0RBVEE9JXMuXG4iLAorCSAgICAgIChjdHJsX3N0YXR1cyAmIE1FNDYwMF9BSV9TVEFUVVNfQklUX0ZGX0RBVEEpID8gIm5vdCBmdWxsIiA6CisJICAgICAgImZ1bGwiKTsKKworCVBJTkZPKCJDVFJMX0JJVF9IRl9JUlFfUkVTRVQ9JXMuXG4iLAorCSAgICAgIChjdHJsX3N0YXR1cyAmIE1FNDYwMF9BSV9DVFJMX0JJVF9IRl9JUlFfUkVTRVQpID8gInJlc2V0IiA6CisJICAgICAgIndvcmsiKTsKKwlQSU5GTygiQ1RSTF9CSVRfU0NfSVJRPSVzLlxuIiwKKwkgICAgICAoY3RybF9zdGF0dXMgJiBNRTQ2MDBfQUlfQ1RSTF9CSVRfU0NfSVJRKSA/ICJlbmFibGUiIDogImRpc2FibGUiKTsKKwlQSU5GTygiQ1RSTF9CSVRfU0NfUkVMT0FEPSVzLlxuIiwKKwkgICAgICAoY3RybF9zdGF0dXMgJiBNRTQ2MDBfQUlfQ1RSTF9CSVRfU0NfUkVMT0FEKSA/ICJvbiIgOiAib2ZmIik7CisJUElORk8oIkNUUkxfQklUX1NDX0lSUV9SRVNFVD0lcy5cbiIsCisJICAgICAgKGN0cmxfc3RhdHVzICYgTUU0NjAwX0FJX0NUUkxfQklUX1NDX0lSUV9SRVNFVCkgPyAicmVzZXQiIDoKKwkgICAgICAid29yayIpOworCVBJTkZPKCIlbGQgRU5EXG4iLCBqaWZmaWVzKTsKKyNlbmRpZgorCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKiogQGJyaWVmIFN0b3AgYXF1c2F0aW9uIG9mIGRhdGEuIFJlc2V0IGludGVycnVwdHMnIGxhY2hlcy4gQ2xlYXIgZGF0YSdzIEZJRk8uCisqCisqIEBwYXJhbSBpbnN0YW5jZSBUaGUgc3ViZGV2aWNlIGluc3RhbmNlIChwb2ludGVyKS4KKyovCit2b2lkIGlubGluZSBhaV9zdG9wX2lzcihtZTQ2MDBfYWlfc3ViZGV2aWNlX3QgKiBpbnN0YW5jZSkKK3sJCQkJLy8vIEBub3RlIFRoaXMgaXMgc29mdCB0aW1lIGNyaXRpY2FsIGZ1bmN0aW9uIQorCXJlZ2lzdGVyIHVpbnQzMl90IHRtcDsKKworCXNwaW5fbG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisJLy9TdG9wIGFsbC4gUmVzZXQgaW50ZXJydXB0IGxhY2hlcy4gUmVzZXQgZGF0YSBGSUZPLgorCXRtcCA9IGlubChpbnN0YW5jZS0+Y3RybF9yZWcpOworCXRtcCB8PQorCSAgICAoTUU0NjAwX0FJX0NUUkxfQklUX0lNTUVESUFURV9TVE9QIHwgTUU0NjAwX0FJX0NUUkxfQklUX0hGX0lSUV9SRVNFVAorCSAgICAgfCBNRTQ2MDBfQUlfQ1RSTF9CSVRfTEVfSVJRX1JFU0VUIHwKKwkgICAgIE1FNDYwMF9BSV9DVFJMX0JJVF9TQ19JUlFfUkVTRVQpOworCXRtcCAmPSB+TUU0NjAwX0FJX0NUUkxfQklUX0RBVEFfRklGTzsKKwlvdXRsKHRtcCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgdG1wKTsKKwlzcGluX3VubG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7Cit9CisKKy8qKiBAYnJpZWYgQ29weSBkYXRhIGZyb20gZmlmbyB0byBjaXJjdWxhciBidWZmZXIuCisqCisqIEBwYXJhbSBpbnN0YW5jZSBUaGUgc3ViZGV2aWNlIGluc3RhbmNlIChwb2ludGVyKS4KKyogQHBhcmFtIGNvdW50IFRoZSBudW1iZXIgb2YgcmVxdWVzdGVkIGRhdGEuCisqCisqIEByZXR1cm4gT24gc3VjY2VzczogTnVtYmVyIG9mIGNvcGllZCB2YWx1ZXMuCisqIEByZXR1cm4gT24gZXJyb3I6IC1NRV9FUlJOT19SSU5HX0JVRkZFUl9PVkVSRkxPVy4KKyovCitzdGF0aWMgaW50IGlubGluZSBhaV9yZWFkX2RhdGEobWU0NjAwX2FpX3N1YmRldmljZV90ICogaW5zdGFuY2UsCisJCQkgICAgICAgY29uc3QgaW50IGNvdW50KQorewkJCQkvLy8gQG5vdGUgVGhpcyBpcyB0aW1lIGNyaXRpY2FsIGZ1bmN0aW9uIQorCWludCBjID0gY291bnQ7CisJaW50IGVtcHR5X3NwYWNlOworCWludCBjb3BpZWQgPSAwOworCWludCBpLCBqOworCisJZW1wdHlfc3BhY2UgPSBtZV9jaXJjX2J1Zl9zcGFjZV90b19lbmQoJmluc3RhbmNlLT5jaXJjX2J1Zik7CisJaWYgKGVtcHR5X3NwYWNlIDw9IDApIHsKKwkJUERFQlVHKCJDaXJjdWxhciBidWZmZXIgZnVsbC5cbiIpOworCQlyZXR1cm4gLU1FX0VSUk5PX1JJTkdfQlVGRkVSX09WRVJGTE9XOworCX0KKworCWlmIChlbXB0eV9zcGFjZSA8IGMpIHsJLy9Db3B5IGZpcnN0IHBhcnQuIE1heCB0byBlbmQgb2YgYnVmZmVyLgorCQlQREVCVUcKKwkJICAgICgiVHJ5IHRvIGNvcHkgJWQgdmFsdWVzIGZyb20gRklGTyB0byBjaXJjdWxhciBidWZmZXIgKHBhc3MgMSkuXG4iLAorCQkgICAgIGVtcHR5X3NwYWNlKTsKKwkJZm9yIChpID0gMDsgaSA8IGVtcHR5X3NwYWNlOyBpKyspIHsKKwkJCSooaW5zdGFuY2UtPmNpcmNfYnVmLmJ1ZiArIGluc3RhbmNlLT5jaXJjX2J1Zi5oZWFkKSA9CisJCQkgICAgKGludyhpbnN0YW5jZS0+ZGF0YV9yZWcpIF4gMHg4MDAwKTsKKwkJCWluc3RhbmNlLT5jaXJjX2J1Zi5oZWFkKys7CisJCX0KKwkJaW5zdGFuY2UtPmNpcmNfYnVmLmhlYWQgJj0gaW5zdGFuY2UtPmNpcmNfYnVmLm1hc2s7CisJCWMgLT0gZW1wdHlfc3BhY2U7CisJCWNvcGllZCA9IGVtcHR5X3NwYWNlOworCisJCWVtcHR5X3NwYWNlID0gbWVfY2lyY19idWZfc3BhY2VfdG9fZW5kKCZpbnN0YW5jZS0+Y2lyY19idWYpOworCX0KKworCWlmIChlbXB0eV9zcGFjZSA+IDApIHsKKwkJaiA9IChlbXB0eV9zcGFjZSA8IGMpID8gZW1wdHlfc3BhY2UgOiBjOworCQlQREVCVUcKKwkJICAgICgiVHJ5IHRvIGNvcHkgJWQgdmFsdWVzIGZyb20gRklGTyB0byBjaXJjdWxhciBidWZmZXIgKHBhc3MgMikuXG4iLAorCQkgICAgIGMpOworCQlmb3IgKGkgPSAwOyBpIDwgajsgaSsrKSB7CisJCQkqKGluc3RhbmNlLT5jaXJjX2J1Zi5idWYgKyBpbnN0YW5jZS0+Y2lyY19idWYuaGVhZCkgPQorCQkJICAgIChpbncoaW5zdGFuY2UtPmRhdGFfcmVnKSBeIDB4ODAwMCk7CisJCQlpbnN0YW5jZS0+Y2lyY19idWYuaGVhZCsrOworCQl9CisJCWluc3RhbmNlLT5jaXJjX2J1Zi5oZWFkICY9IGluc3RhbmNlLT5jaXJjX2J1Zi5tYXNrOworCQljb3BpZWQgKz0gajsKKwl9CisJcmV0dXJuIGNvcGllZDsKK30KKwordm9pZCBpbmxpbmUgYWlfaW5maW5pdGVfSVNNKG1lNDYwMF9haV9zdWJkZXZpY2VfdCAqIGluc3RhbmNlKQorewkJCQkvLy8gQG5vdGUgVGhpcyBpcyB0aW1lIGNyaXRpY2FsIGZ1bmN0aW9uIQorCXJlZ2lzdGVyIHZvbGF0aWxlIHVpbnQzMl90IGN0cmxfc2V0LCBjdHJsX3Jlc2V0LCB0bXA7CisKKwlpZiAoaW5zdGFuY2UtPmZpZm9faXJxX3RocmVzaG9sZCA8IE1FNDYwMF9BSV9GSUZPX01BWF9TQykgewkvLyBPbmx5IHNhbXBsZSBjb3VudGVyIHdpdGggcmVsb2FkbmlnIGlzIHdvcmtpbmcuIFJlc2V0IGl0LgorCQlQSU5GTworCQkgICAgKCJPbmx5IHNhbXBsZSBjb3VudGVyIHdpdGggcmVsb2FkbmlnIGlzIHdvcmtpbmcuIFJlc2V0IGl0LlxuIik7CisJCWN0cmxfc2V0ID0gTUU0NjAwX0FJX0NUUkxfQklUX1NDX0lSUV9SRVNFVDsKKwkJY3RybF9yZXNldCA9IH5NRTQ2MDBfQUlfQ1RSTF9CSVRfU0NfSVJRX1JFU0VUOworCX0gZWxzZSBpZiAoaW5zdGFuY2UtPmZpZm9faXJxX3RocmVzaG9sZCA9PSBpbnN0YW5jZS0+SVNNLnJlYWQpIHsJLy9UaGlzIGlzIFNDIGludGVycnVwdCBmb3IgbGFyZ2UgYmxvY2suIFRoZSB3aG9sZSBzZWN0aW9uIGlzIGRvbmUuIFJlc2V0IFNDX0lSUSBhbiBIRl9JUlEgYW5kIHN0YXJ0IGV2ZXJ5dGhpbmcgYWdhaW4gZnJvbSBiZWdpbm5pbmcuCisJCVBJTkZPCisJCSAgICAoIlRoaXMgaXMgU0MgaW50ZXJydXB0IGZvciBsYXJnZSBibG9jay4gVGhlIHdob2xlIHNlY3Rpb24gaXMgZG9uZS4gUmVzZXQgU0NfSVJRIGFuIEhGX0lSUSBhbmQgc3RhcnQgZXZlcnl0aGluZyBhZ2FpbiBmcm9tIGJlZ2lubmluZy5cbiIpOworCQljdHJsX3NldCA9CisJCSAgICBNRTQ2MDBfQUlfQ1RSTF9CSVRfU0NfSVJRX1JFU0VUIHwKKwkJICAgIE1FNDYwMF9BSV9DVFJMX0JJVF9IRl9JUlFfUkVTRVQ7CisJCWN0cmxfcmVzZXQgPQorCQkgICAgfihNRTQ2MDBfQUlfQ1RSTF9CSVRfU0NfSVJRX1JFU0VUIHwKKwkJICAgICAgTUU0NjAwX0FJX0NUUkxfQklUX0hGX0lSUV9SRVNFVCk7CisJfSBlbHNlIGlmIChpbnN0YW5jZS0+Zmlmb19pcnFfdGhyZXNob2xkID49IChNRTQ2MDBfQUlfRklGT19NQVhfU0MgKyBpbnN0YW5jZS0+SVNNLnJlYWQpKSB7CS8vVGhpcyBpcyBIRiBpbnRlcnJ1cHQgZm9yIGxhcmdlIGJsb2NrLlRoZSBuZXh0IGludGVycnVwdCBzaG91bGQgYmUgZnJvbSBIRiwgYWxzby4gUmVzZXQgSEYuCisJCVBJTkZPCisJCSAgICAoIlRoaXMgaXMgSEYgaW50ZXJydXB0IGZvciBsYXJnZSBibG9jay5UaGUgbmV4dCBpbnRlcnJ1cHQgc2hvdWxkIGJlIGZyb20gSEYsIGFsc28uIFJlc2V0IEhGLlxuIik7CisJCWN0cmxfc2V0ID0gTUU0NjAwX0FJX0NUUkxfQklUX0hGX0lSUV9SRVNFVDsKKwkJY3RybF9yZXNldCA9IH5NRTQ2MDBfQUlfQ1RSTF9CSVRfSEZfSVJRX1JFU0VUOworCX0gZWxzZSB7CQkvL1RoaXMgaXMgSEYgaW50ZXJydXB0IGZvciBsYXJnZSBibG9jay5UaGUgbmV4dCBpbnRlcnJ1cHQgc2hvdWxkIGJlIGZyb20gU0MuIERvbid0IHJlc2V0IEhGIQorCQlQSU5GTworCQkgICAgKCJUaGlzIGlzIEhGIGludGVycnVwdCBmb3IgbGFyZ2UgYmxvY2suVGhlIG5leHQgaW50ZXJydXB0IHNob3VsZCBiZSBmcm9tIFNDLiBEb24ndCByZXNldCBIRiFcbiIpOworCQljdHJsX3NldCA9IE1FNDYwMF9BSV9DVFJMX0JJVF9IRl9JUlFfUkVTRVQ7CisJCWN0cmxfcmVzZXQgPSAweEZGRkZGRkZGOworCX0KKworCS8vUmVzZXQgaW50ZXJydXB0IGxhdGNoLgorCXNwaW5fbG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisJdG1wID0gaW5sKGluc3RhbmNlLT5jdHJsX3JlZyk7CisJUElORk8oImN0cmw9MHgleCBjdHJsX3NldD0weCV4IGN0cmxfcmVzZXQ9MHgleFxuIiwgdG1wLCBjdHJsX3NldCwKKwkgICAgICBjdHJsX3Jlc2V0KTsKKwl0bXAgfD0gY3RybF9zZXQ7CisJb3V0bCh0bXAsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIHRtcCk7CisJaWYgKGN0cmxfcmVzZXQgIT0gMHhGRkZGRkZGRikgeworCQlvdXRsKHRtcCAmIGN0cmxfcmVzZXQsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCVBERUJVR19SRUcoImN0cmxfcmVzZXQgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgIHRtcCAmIGN0cmxfcmVzZXQpOworCX0KKwlzcGluX3VubG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisKK30KKwordm9pZCBpbmxpbmUgYWlfbGltaXRlZF9JU00obWU0NjAwX2FpX3N1YmRldmljZV90ICogaW5zdGFuY2UsCisJCQkgICB1aW50MzJfdCBpcnFfc3RhdHVzKQorewkJCQkvLy8gQG5vdGUgVGhpcyBpcyB0aW1lIGNyaXRpY2FsIGZ1bmN0aW9uIQorCXJlZ2lzdGVyIHZvbGF0aWxlIHVpbnQzMl90IGN0cmxfc2V0LCBjdHJsX3Jlc2V0ID0gMHhGRkZGRkZGRiwgdG1wOworCisJaWYgKCFpbnN0YW5jZS0+Zmlmb19pcnFfdGhyZXNob2xkKSB7CS8vTm8gdGhyZXNob2xkIHByb3ZpZGVkLiBTQyBlbmRzIHdvcmsuCisJCVBJTkZPKCJObyB0aHJlc2hvbGQgcHJvdmlkZWQuIFNDIGVuZHMgd29yay5cbiIpOworCQljdHJsX3NldCA9IE1FNDYwMF9BSV9DVFJMX0JJVF9IRl9JUlFfUkVTRVQ7CisJCWlmIChpbnN0YW5jZS0+ZGF0YV9yZXF1aXJlZCA+IChNRTQ2MDBfQUlfRklGT19DT1VOVCAtIDEgKyBpbnN0YW5jZS0+SVNNLmdsb2JhbF9yZWFkKSkgewkvL0hGIG5lZWQgcmVzZXRpbmcuCisJCQljdHJsX3Jlc2V0ICY9IH5NRTQ2MDBfQUlfQ1RSTF9CSVRfSEZfSVJRX1JFU0VUOworCQl9CisJfSBlbHNlCQkJLy9pZihpbnN0YW5jZS0+Zmlmb19pcnFfdGhyZXNob2xkKQorCXsKKwkJaWYgKGlycV9zdGF0dXMgJiBNRTQ2MDBfSVJRX1NUQVRVU19CSVRfQUlfSEYpIHsKKwkJCVBJTkZPKCJUaHJlc2hvbGQgcHJvdmlkZWQuIENsZWFyIEhGIGxhdGNoLlxuIik7CisJCQljdHJsX3NldCA9IE1FNDYwMF9BSV9DVFJMX0JJVF9IRl9JUlFfUkVTRVQ7CisKKwkJCWlmIChpbnN0YW5jZS0+Zmlmb19pcnFfdGhyZXNob2xkID49IChNRTQ2MDBfQUlfRklGT19NQVhfU0MgKyBpbnN0YW5jZS0+SVNNLnJlYWQpKSB7CS8vVGhpcyBpcyBub3QgdGhlIGxhc3Qgb25lLiBIRiBuZWVkIHJlc2V0aW5nLgorCQkJCVBJTkZPCisJCQkJICAgICgiVGhlIG5leHQgaW50ZXJydXB0IGlzIEhGLiBIRiBuZWVkIGJlIGFjdGl2YXRpbmcuXG4iKTsKKwkJCQljdHJsX3Jlc2V0ID0gfk1FNDYwMF9BSV9DVFJMX0JJVF9IRl9JUlFfUkVTRVQ7CisJCQl9CisJCX0KKworCQlpZiAoaXJxX3N0YXR1cyAmIE1FNDYwMF9JUlFfU1RBVFVTX0JJVF9TQykgeworCQkJUElORk8oIlRocmVzaG9sZCBwcm92aWRlZC4gUmVzdGFydCBTQy5cbiIpOworCQkJY3RybF9zZXQgPSBNRTQ2MDBfQUlfQ1RSTF9CSVRfU0NfSVJRX1JFU0VUOworCQkJY3RybF9yZXNldCAmPSB+TUU0NjAwX0FJX0NUUkxfQklUX1NDX0lSUV9SRVNFVDsKKworCQkJaWYgKGluc3RhbmNlLT5maWZvX2lycV90aHJlc2hvbGQgPj0gTUU0NjAwX0FJX0ZJRk9fTUFYX1NDKSB7CS8vVGhpcyBpcyBub3QgdGhlIGxhc3Qgb25lLiBIRiBuZWVkIHRvIGJlIGFjdGl2YXRpbmcuCisJCQkJUElORk8KKwkJCQkgICAgKCJUaGUgbmV4dCBpbnRlcnJ1cHQgaXMgSEYuIEhGIG5lZWQgdG8gYmUgYWN0aXZhdGluZy5cbiIpOworCQkJCWN0cmxfcmVzZXQgJj0gfk1FNDYwMF9BSV9DVFJMX0JJVF9IRl9JUlFfUkVTRVQ7CisJCQl9CisJCX0KKwl9CisKKwkvL1Jlc2V0IGludGVycnVwdCBsYXRjaC4KKwlzcGluX2xvY2soaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2spOworCXRtcCA9IGlubChpbnN0YW5jZS0+Y3RybF9yZWcpOworCXRtcCB8PSBjdHJsX3NldDsKKwlvdXRsKHRtcCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgdG1wKTsKKworCWlmIChjdHJsX3Jlc2V0ICE9IDB4RkZGRkZGRkYpIHsKKwkJb3V0bCh0bXAgJiBjdHJsX3Jlc2V0LCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgdG1wICYgY3RybF9yZXNldCk7CisJfQorCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrKTsKKworfQorCisvKiogQGJyaWVmIExhc3QgY2h1bmNrIG9mIGRhdGFzLiBXZSBtdXN0IHJlc2NoZWR1bGUgc2FtcGxlIGNvdW50ZXIuCisqCUBub3RlIExhc3QgY2h1bmNrLgorKglMZWF2aW5nIFNDX1JFTE9BRCBkb2Vzbid0IGRvIGFueSBoYXJtLCBidXQgaW4gc29tZSBiYWQgY2FzZSBjYW4gbWFrZSBleHRyYSBpbnRlcnJ1cHRzLgorKglAd2FybmluZyBXaGVuIHRocmVzaG9sZCBpcyB3cm9uZ2x5IHNldCBzb21lIElSUSBhcmUgbG9zdC4oISEhKQorKi8KK3ZvaWQgaW5saW5lIGFpX3Jlc2NoZWR1bGVfU0MobWU0NjAwX2FpX3N1YmRldmljZV90ICogaW5zdGFuY2UpCit7CisJcmVnaXN0ZXIgdWludDMyX3QgcmVzdDsKKworCWlmIChpbnN0YW5jZS0+ZGF0YV9yZXF1aXJlZCA8PSBpbnN0YW5jZS0+SVNNLmdsb2JhbF9yZWFkKQorCQlyZXR1cm47CisKKwlyZXN0ID0gaW5zdGFuY2UtPmRhdGFfcmVxdWlyZWQgLSBpbnN0YW5jZS0+SVNNLmdsb2JhbF9yZWFkOworCWlmIChyZXN0IDwgaW5zdGFuY2UtPmZpZm9faXJxX3RocmVzaG9sZCkgewkvL0VuZCBvZiB3b3JrIHNvb24gLi4uLgorCQlQREVCVUcoIlJlc2NoZWR1bGluZyBTQyBmcm9tICVkIHRvICVkLlxuIiwKKwkJICAgICAgIGluc3RhbmNlLT5maWZvX2lycV90aHJlc2hvbGQsIHJlc3QpOworCQkvLy8gQG5vdGUgV3JpdGUgbmV3IHZhbHVlIHRvIFNDIDw9PSAgREFOR0VSISBUaGlzIGlzIG5vdCBzYWZlIHNvbHV0aW9uISBXZSBjYW4gbWlzcyBzb21lIGlucHV0cy4KKwkJb3V0bChyZXN0LCBpbnN0YW5jZS0+c2FtcGxlX2NvdW50ZXJfcmVnKTsKKwkJUERFQlVHX1JFRygic2FtcGxlX2NvdW50ZXJfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkgICBpbnN0YW5jZS0+c2FtcGxlX2NvdW50ZXJfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgcmVzdCk7CisJCWluc3RhbmNlLT5maWZvX2lycV90aHJlc2hvbGQgPSByZXN0OworCisJCWlmIChyZXN0IDwgTUU0NjAwX0FJX0ZJRk9fTUFYX1NDKSB7CisJCQlpbnN0YW5jZS0+SVNNLm5leHQgPSByZXN0OworCQl9IGVsc2UgeworCQkJaW5zdGFuY2UtPklTTS5uZXh0ID0gcmVzdCAlIE1FNDYwMF9BSV9GSUZPX0hBTEY7CisJCQlpZiAoaW5zdGFuY2UtPklTTS5uZXh0ICsgTUU0NjAwX0FJX0ZJRk9fSEFMRiA8CisJCQkgICAgTUU0NjAwX0FJX0ZJRk9fTUFYX1NDKSB7CisJCQkJaW5zdGFuY2UtPklTTS5uZXh0ICs9IE1FNDYwMF9BSV9GSUZPX0hBTEY7CisJCQl9CisJCX0KKwl9Cit9CisKKy8qKiBTdGFydCB0aGUgSVNNLiBBbGwgbXVzdCBiZSByZXNldGVkIGJlZm9yZSBlbnRlciB0byB0aGlzIGZ1bmN0aW9uLiAqLwordm9pZCBpbmxpbmUgYWlfZGF0YV9hY3F1aXNpdGlvbl9sb2dpYyhtZTQ2MDBfYWlfc3ViZGV2aWNlX3QgKiBpbnN0YW5jZSkKK3sKKwlyZWdpc3RlciB1aW50MzJfdCB0bXA7CisKKwlpZiAoIWluc3RhbmNlLT5kYXRhX3JlcXVpcmVkKSB7CS8vVGhpcyBpcyBpbmZpbml0ZSBhcXVzaXRpb24uCisJCWlmICghaW5zdGFuY2UtPmZpZm9faXJxX3RocmVzaG9sZCkgewkvL05vIHRocmVzaG9sZCBwcm92aWRlZC4gU2V0IFNDIHRvIDAuNSpGSUZPLiBDbGVhciB0aGUgU0MncyBsYXRjaC4KKwkJCS8vU2V0IHRoZSBzYW1wbGUgY291bnRlcgorCQkJb3V0bChNRTQ2MDBfQUlfRklGT19IQUxGLCBpbnN0YW5jZS0+c2FtcGxlX2NvdW50ZXJfcmVnKTsKKwkJCVBERUJVR19SRUcKKwkJCSAgICAoInNhbXBsZV9jb3VudGVyX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkgICAgIGluc3RhbmNlLT5zYW1wbGVfY291bnRlcl9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkgICAgIE1FNDYwMF9BSV9GSUZPX0hBTEYpOworCQl9IGVsc2UgewkvL1RocmVzaG9sZCBwcm92aWRlZC4gU2V0IFNDIHRvIHRyZXNob2xkLiBDbGVhciB0aGUgU0MncyBsYXRjaC4KKwkJCS8vU2V0IHRoZSBzYW1wbGUgY291bnRlcgorCQkJb3V0bChpbnN0YW5jZS0+Zmlmb19pcnFfdGhyZXNob2xkLAorCQkJICAgICBpbnN0YW5jZS0+c2FtcGxlX2NvdW50ZXJfcmVnKTsKKwkJCVBERUJVR19SRUcKKwkJCSAgICAoInNhbXBsZV9jb3VudGVyX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkgICAgIGluc3RhbmNlLT5zYW1wbGVfY291bnRlcl9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkgICAgIGluc3RhbmNlLT5maWZvX2lycV90aHJlc2hvbGQpOworCQl9CisKKwkJaWYgKGluc3RhbmNlLT5maWZvX2lycV90aHJlc2hvbGQgPCBNRTQ2MDBfQUlfRklGT19NQVhfU0MpIHsJLy9FbmFibGUgb25seSBzYW1wbGUgY291bnRlcidzIGludGVycnVwdC4gU2V0IHJlbG9hZCBiaXQuIENsZWFyIHRoZSBTQydzIGxhdGNoLgorCQkJc3Bpbl9sb2NrKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrKTsKKwkJCXRtcCA9IGlubChpbnN0YW5jZS0+Y3RybF9yZWcpOworCQkJdG1wIHw9IE1FNDYwMF9BSV9DVFJMX0JJVF9TQ19SRUxPQUQ7CisJCQl0bXAgJj0gfk1FNDYwMF9BSV9DVFJMX0JJVF9TQ19JUlFfUkVTRVQ7CisJCQlvdXRsKHRtcCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICB0bXApOworCQkJc3Bpbl91bmxvY2soaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2spOworCQkJaWYgKCFpbnN0YW5jZS0+Zmlmb19pcnFfdGhyZXNob2xkKSB7CS8vTm8gdGhyZXNob2xkIHByb3ZpZGVkLiBTZXQgSVNNLm5leHQgdG8gMC41KkZJRk8uCisJCQkJaW5zdGFuY2UtPklTTS5uZXh0ID0gTUU0NjAwX0FJX0ZJRk9fSEFMRjsKKwkJCX0gZWxzZSB7CS8vVGhyZXNob2xkIHByb3ZpZGVkLiBTZXQgSVNNLm5leHQgdG8gdHJlc2hvbGQuCisJCQkJaW5zdGFuY2UtPklTTS5uZXh0ID0KKwkJCQkgICAgaW5zdGFuY2UtPmZpZm9faXJxX3RocmVzaG9sZDsKKwkJCX0KKwkJfSBlbHNlIHsJLy9FbmFibGUgc2FtcGxlIGNvdW50ZXIncyBhbmQgSEYncyBpbnRlcnJ1cHRzLgorCQkJc3Bpbl9sb2NrKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrKTsKKwkJCXRtcCA9IGlubChpbnN0YW5jZS0+Y3RybF9yZWcpOworCQkJdG1wIHw9IE1FNDYwMF9BSV9DVFJMX0JJVF9TQ19SRUxPQUQ7CisJCQl0bXAgJj0KKwkJCSAgICB+KE1FNDYwMF9BSV9DVFJMX0JJVF9TQ19JUlFfUkVTRVQgfAorCQkJICAgICAgTUU0NjAwX0FJX0NUUkxfQklUX0hGX0lSUV9SRVNFVCk7CisJCQlvdXRsKHRtcCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICB0bXApOworCQkJc3Bpbl91bmxvY2soaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2spOworCisJCQlpbnN0YW5jZS0+SVNNLm5leHQgPQorCQkJICAgIGluc3RhbmNlLT5maWZvX2lycV90aHJlc2hvbGQgJSBNRTQ2MDBfQUlfRklGT19IQUxGOworCQkJaWYgKGluc3RhbmNlLT5JU00ubmV4dCArIE1FNDYwMF9BSV9GSUZPX0hBTEYgPAorCQkJICAgIE1FNDYwMF9BSV9GSUZPX01BWF9TQykgeworCQkJCWluc3RhbmNlLT5JU00ubmV4dCArPSBNRTQ2MDBfQUlfRklGT19IQUxGOworCQkJfQorCQl9CisJfSBlbHNlIHsJCS8vVGhpcyBhcXVzaXRpb24gaXMgbGltaXRlZCB0byBzZXQgbnVtYmVyIG9mIGRhdGEuCisJCWlmIChpbnN0YW5jZS0+Zmlmb19pcnFfdGhyZXNob2xkID49IGluc3RhbmNlLT5kYXRhX3JlcXVpcmVkKSB7CS8vU3R1cGlkIHNpdHVhdGlvbi4KKwkJCWluc3RhbmNlLT5maWZvX2lycV90aHJlc2hvbGQgPSAwOworCQkJUERFQlVHCisJCQkgICAgKCJTdHVwaWQgc2l0dWF0aW9uOiBkYXRhX3JlcXVpcmVkKCVkKSA8IHRocmVzaG9sZCglZCkuXG4iLAorCQkJICAgICBpbnN0YW5jZS0+Zmlmb19pcnFfdGhyZXNob2xkLAorCQkJICAgICBpbnN0YW5jZS0+ZGF0YV9yZXF1aXJlZCk7CisJCX0KKworCQlpZiAoIWluc3RhbmNlLT5maWZvX2lycV90aHJlc2hvbGQpIHsJLy9ObyB0aHJlc2hvbGQgcHJvdmlkZWQuIEVhc3kgY2FzZTogSEY9cmVhZCBhbmQgU0M9ZW5kLgorCQkJLy9TZXQgdGhlIHNhbXBsZSBjb3VudGVyIHRvIGRhdGFfcmVxdWlyZWQuCisJCQlvdXRsKGluc3RhbmNlLT5kYXRhX3JlcXVpcmVkLAorCQkJICAgICBpbnN0YW5jZS0+c2FtcGxlX2NvdW50ZXJfcmVnKTsKKwkJCVBERUJVR19SRUcKKwkJCSAgICAoInNhbXBsZV9jb3VudGVyX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkgICAgIGluc3RhbmNlLT5zYW1wbGVfY291bnRlcl9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkgICAgIGluc3RhbmNlLT5kYXRhX3JlcXVpcmVkKTsKKworCQkJLy9SZXNldCB0aGUgbGF0Y2hlcyBvZiBzYW1wbGUgY291bnRlciBhbmQgSEYgKGlmIFNDPkZJRk8pLgorCQkJLy9ObyBTQyByZWxvYWQhCisJCQlzcGluX2xvY2soaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2spOworCQkJdG1wID0gaW5sKGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCQl0bXAgJj0KKwkJCSAgICB+KE1FNDYwMF9BSV9DVFJMX0JJVF9TQ19JUlFfUkVTRVQgfAorCQkJICAgICAgTUU0NjAwX0FJX0NUUkxfQklUX1NDX1JFTE9BRCk7CisJCQlpZiAoaW5zdGFuY2UtPmRhdGFfcmVxdWlyZWQgPgorCQkJICAgIChNRTQ2MDBfQUlfRklGT19DT1VOVCAtIDEpKSB7CisJCQkJdG1wICY9IH5NRTQ2MDBfQUlfQ1RSTF9CSVRfSEZfSVJRX1JFU0VUOworCQkJCWluc3RhbmNlLT5JU00ubmV4dCA9CisJCQkJICAgIGluc3RhbmNlLT5kYXRhX3JlcXVpcmVkICUKKwkJCQkgICAgTUU0NjAwX0FJX0ZJRk9fSEFMRjsKKwkJCQlpbnN0YW5jZS0+SVNNLm5leHQgKz0gTUU0NjAwX0FJX0ZJRk9fSEFMRjsKKworCQkJfSBlbHNlIHsKKwkJCQlpbnN0YW5jZS0+SVNNLm5leHQgPSBpbnN0YW5jZS0+ZGF0YV9yZXF1aXJlZDsKKwkJCX0KKwkJCW91dGwodG1wLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQkJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIHRtcCk7CisJCQlzcGluX3VubG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisKKwkJfSBlbHNlIHsJLy9UaGUgbW9zdCBnZW5lcmFsIGNhc2UuIFdlIGhhdmUgY29uY3JldCBudW1iZSBvZiByZXF1aXJlZCBkYXRhIGFuZCB0aHJlc2hvbGQuIFNDPVRICisJCQkvL1NldCB0aGUgc2FtcGxlIGNvdW50ZXIgdG8gdGhyZXNob2xkLgorCQkJb3V0bChpbnN0YW5jZS0+Zmlmb19pcnFfdGhyZXNob2xkLAorCQkJICAgICBpbnN0YW5jZS0+c2FtcGxlX2NvdW50ZXJfcmVnKTsKKwkJCVBERUJVR19SRUcKKwkJCSAgICAoInNhbXBsZV9jb3VudGVyX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkgICAgIGluc3RhbmNlLT5zYW1wbGVfY291bnRlcl9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkgICAgIGluc3RhbmNlLT5maWZvX2lycV90aHJlc2hvbGQpOworCisJCQlzcGluX2xvY2soaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2spOworCQkJdG1wID0gaW5sKGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCQkvL0luIHRoaXMgbW9tZW50IHdlIGFyZSBzdXJlIHRoYXQgU0Mgd2lsbCBjb21lIG1vcmUgdGhhbiBvbmNlLgorCQkJdG1wIHw9IE1FNDYwMF9BSV9DVFJMX0JJVF9TQ19SRUxPQUQ7CisKKwkJCWlmIChpbnN0YW5jZS0+Zmlmb19pcnFfdGhyZXNob2xkIDwgTUU0NjAwX0FJX0ZJRk9fTUFYX1NDKSB7CS8vVGhlIHRocmVzaG9sZCBpcyBzbyBzbWFsbCB0aGF0IHdlIGRvIG5lZWQgSEYuCisJCQkJdG1wICY9IH5NRTQ2MDBfQUlfQ1RSTF9CSVRfU0NfSVJRX1JFU0VUOworCQkJCWluc3RhbmNlLT5JU00ubmV4dCA9CisJCQkJICAgIGluc3RhbmNlLT5maWZvX2lycV90aHJlc2hvbGQ7CisJCQl9IGVsc2UgewkvL1RoZSB0aHJlc2hvbGQgaXMgbGFyZ2UuIFRoZSBIRiBtdXN0IGJlIHVzZS4KKwkJCQl0bXAgJj0KKwkJCQkgICAgfihNRTQ2MDBfQUlfQ1RSTF9CSVRfU0NfSVJRX1JFU0VUIHwKKwkJCQkgICAgICBNRTQ2MDBfQUlfQ1RSTF9CSVRfSEZfSVJRX1JFU0VUKTsKKwkJCQlpbnN0YW5jZS0+SVNNLm5leHQgPQorCQkJCSAgICBpbnN0YW5jZS0+Zmlmb19pcnFfdGhyZXNob2xkICUKKwkJCQkgICAgTUU0NjAwX0FJX0ZJRk9fSEFMRjsKKwkJCQlpZiAoaW5zdGFuY2UtPklTTS5uZXh0ICsgTUU0NjAwX0FJX0ZJRk9fSEFMRiA8CisJCQkJICAgIE1FNDYwMF9BSV9GSUZPX01BWF9TQykgeworCQkJCQlpbnN0YW5jZS0+SVNNLm5leHQgKz0KKwkJCQkJICAgIE1FNDYwMF9BSV9GSUZPX0hBTEY7CisJCQkJfQorCQkJfQorCQkJb3V0bCh0bXAsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCQlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgdG1wKTsKKwkJCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrKTsKKwkJfQorCX0KK30KKworc3RhdGljIGludCBhaV9tdXhfdG9nZ2xlcihtZTQ2MDBfYWlfc3ViZGV2aWNlX3QgKiBpbnN0YW5jZSkKK3sKKwl1aW50MzJfdCB0bXA7CisKKwlQREVCVUcoImV4ZWN1dGVkLiBpZHg9MFxuIik7CisKKwlvdXRsKDAsIGluc3RhbmNlLT5zY2FuX3ByZV90aW1lcl9sb3dfcmVnKTsKKwlQREVCVUdfUkVHKCJzY2FuX3ByZV90aW1lcl9sb3dfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPnNjYW5fcHJlX3RpbWVyX2xvd19yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIDApOworCW91dGwoMCwgaW5zdGFuY2UtPnNjYW5fcHJlX3RpbWVyX2hpZ2hfcmVnKTsKKwlQREVCVUdfUkVHKCJzY2FuX3ByZV90aW1lcl9oaWdoX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5zY2FuX3ByZV90aW1lcl9oaWdoX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgMCk7CisJb3V0bCgwLCBpbnN0YW5jZS0+c2Nhbl90aW1lcl9sb3dfcmVnKTsKKwlQREVCVUdfUkVHKCJzY2FuX3RpbWVyX2xvd19yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+c2Nhbl90aW1lcl9sb3dfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCAwKTsKKwlvdXRsKDAsIGluc3RhbmNlLT5zY2FuX3RpbWVyX2hpZ2hfcmVnKTsKKwlQREVCVUdfUkVHKCJzY2FuX3RpbWVyX2hpZ2hfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPnNjYW5fdGltZXJfaGlnaF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIDApOworCW91dGwoNjUsIGluc3RhbmNlLT5jaGFuX3RpbWVyX3JlZyk7CisJUERFQlVHX1JFRygiY2hhbl90aW1lcl9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+Y2hhbl90aW1lcl9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIDY1KTsKKwlvdXRsKDY1LCBpbnN0YW5jZS0+Y2hhbl9wcmVfdGltZXJfcmVnKTsKKwlQREVCVUdfUkVHKCJjaGFuX3ByZV90aW1lcl9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+Y2hhbl9wcmVfdGltZXJfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCA2NSk7CisKKwkvLyBUdXJuIG9uIGludGVybmFsIHJlZmVyZW5jZS4KKwl0bXAgPSBpbmwoaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwl0bXAgfD0gTUU0NjAwX0FJX0NUUkxfQklUX0ZVTExTQ0FMRTsKKwlvdXRsKHRtcCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgdG1wKTsKKworCS8vIENsZWFyIGRhdGEgYW5kIGNoYW5uZWwgZmlmby4KKwl0bXAgJj0KKwkgICAgfihNRTQ2MDBfQUlfQ1RSTF9CSVRfQ0hBTk5FTF9GSUZPIHwgTUU0NjAwX0FJX0NUUkxfQklUX0RBVEFfRklGTyk7CisJb3V0bCh0bXAsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIHRtcCk7CisJdG1wIHw9IE1FNDYwMF9BSV9DVFJMX0JJVF9DSEFOTkVMX0ZJRk8gfCBNRTQ2MDBfQUlfQ1RSTF9CSVRfREFUQV9GSUZPOworCW91dGwodG1wLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCB0bXApOworCisJLy8gV3JpdGUgY2hhbm5lbCBlbnRyeS4KKwlvdXRsKE1FNDYwMF9BSV9MSVNUX0lOUFVUX0RJRkZFUkVOVElBTCB8CisJICAgICBNRTQ2MDBfQUlfTElTVF9SQU5HRV9VTklQT0xBUl8yXzUgfCAzMSwKKwkgICAgIGluc3RhbmNlLT5jaGFubmVsX2xpc3RfcmVnKTsKKwlQREVCVUdfUkVHKCJjaGFubmVsX2xpc3RfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPmNoYW5uZWxfbGlzdF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIE1FNDYwMF9BSV9MSVNUX0lOUFVUX0RJRkZFUkVOVElBTCB8CisJCSAgIE1FNDYwMF9BSV9MSVNUX1JBTkdFX1VOSVBPTEFSXzJfNSB8IDMxKTsKKworCS8vIFN0YXJ0IGNvbnZlcnNpb24uCisJaW5sKGluc3RhbmNlLT5zdGFydF9yZWcpOworCVBERUJVR19SRUcoInN0YXJ0X3JlZyBpbmwoMHglbFgrMHglbFgpXG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5zdGFydF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UpOworCXVkZWxheSgxMCk7CisKKwkvLyBDbGVhciBkYXRhIGFuZCBjaGFubmVsIGZpZm8uCisJdG1wICY9CisJICAgIH4oTUU0NjAwX0FJX0NUUkxfQklUX0NIQU5ORUxfRklGTyB8IE1FNDYwMF9BSV9DVFJMX0JJVF9EQVRBX0ZJRk8pOworCW91dGwodG1wLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCB0bXApOworCXRtcCB8PSBNRTQ2MDBfQUlfQ1RSTF9CSVRfQ0hBTk5FTF9GSUZPIHwgTUU0NjAwX0FJX0NUUkxfQklUX0RBVEFfRklGTzsKKwlvdXRsKHRtcCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgdG1wKTsKKworCS8vIFdyaXRlIGNoYW5uZWwgZW50cnkuCisJLy8gTUU0NjAwX0FJX0xJU1RfSU5QVVRfU0lOR0xFX0VOREVEIHwgTUU0NjAwX0FJX0xJU1RfUkFOR0VfQklQT0xBUl8xMCA8PSAweDAwMDAKKwlvdXRsKE1FNDYwMF9BSV9MSVNUX0lOUFVUX1NJTkdMRV9FTkRFRCB8CisJICAgICBNRTQ2MDBfQUlfTElTVF9SQU5HRV9CSVBPTEFSXzEwLCBpbnN0YW5jZS0+Y2hhbm5lbF9saXN0X3JlZyk7CisJUERFQlVHX1JFRygiY2hhbm5lbF9saXN0X3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5jaGFubmVsX2xpc3RfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBNRTQ2MDBfQUlfTElTVF9JTlBVVF9TSU5HTEVfRU5ERUQgfAorCQkgICBNRTQ2MDBfQUlfTElTVF9SQU5HRV9CSVBPTEFSXzEwKTsKKworCS8vIFN0YXJ0IGNvbnZlcnNpb24uCisJaW5sKGluc3RhbmNlLT5zdGFydF9yZWcpOworCVBERUJVR19SRUcoInN0YXJ0X3JlZyBpbmwoMHglbFgrMHglbFgpXG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5zdGFydF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UpOworCXVkZWxheSgxMCk7CisKKwkvLyBDbGVhciBjb250cm9sIHJlZ2lzdGVyLgorCXRtcCAmPSAoTUU0NjAwX0FJX0NUUkxfQklUX0VYX0lSUSB8IE1FNDYwMF9BSV9DVFJMX0JJVF9FWF9JUlFfUkVTRVQpOworCW91dGwodG1wLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCB0bXApOworCisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKKy8qKiBAYnJpZWYgQ29weSByZXN0IG9mIGRhdGEgZnJvbSBmaWZvIHRvIGNpcmN1bGFyIGJ1ZmZlci4KKyogQG5vdGUgSGVscGVyIGZvciBTVE9QIGNvbW1hbmQuIEFmdGVyIEZTTSBpcyBzdG9wcGVkLgorKiBAbm90ZSBUaGlzIGlzIHNsb3cgZnVuY3Rpb24gdGhhdCBjb3B5IGFsbCByZW1haW5pZyBkYXRhIGZyb20gRklGTyB0byBidWZmZXIuCisqCisqIEBwYXJhbSBpbnN0YW5jZSBUaGUgc3ViZGV2aWNlIGluc3RhbmNlIChwb2ludGVyKS4KKyoKKyogQHJldHVybiBPbiBzdWNjZXNzOiBOdW1iZXIgb2YgY29waWVkIHZhbHVlcy4KKyogQHJldHVybiBPbiBlcnJvcjogTmVnYXRpdmUgZXJyb3IgY29kZSAtTUVfRVJSTk9fUklOR19CVUZGRVJfT1ZFUkZMT1cuCisqLworc3RhdGljIGludCBpbmxpbmUgYWlfcmVhZF9kYXRhX3Bvb2xpbmcobWU0NjAwX2FpX3N1YmRldmljZV90ICogaW5zdGFuY2UpCit7CQkJCS8vLyBAbm90ZSBUaGlzIGlzIHRpbWUgY3JpdGljYWwgZnVuY3Rpb24hCisJaW50IGVtcHR5X3NwYWNlOworCWludCBjb3BpZWQgPSAwOworCWludCBzdGF0dXMgPSBNRV9FUlJOT19TVUNDRVNTOworCisJUERFQlVHKCJTcGFjZSBsZWZ0IGluIGNpcmN1bGFyIGJ1ZmZlciA9ICVkLlxuIiwKKwkgICAgICAgbWVfY2lyY19idWZfc3BhY2UoJmluc3RhbmNlLT5jaXJjX2J1ZikpOworCisJd2hpbGUgKChlbXB0eV9zcGFjZSA9IG1lX2NpcmNfYnVmX3NwYWNlKCZpbnN0YW5jZS0+Y2lyY19idWYpKSkgeworCQlpZiAoIShzdGF0dXMgPSBpbmwoaW5zdGFuY2UtPnN0YXR1c19yZWcpICYgTUU0NjAwX0FJX1NUQVRVU19CSVRfRUZfREFUQSkpIHsJLy9ObyBtb3JlIGRhdGEuIHN0YXR1cyA9IE1FX0VSUk5PX1NVQ0NFU1MgPSAwCisJCQlicmVhazsKKwkJfQorCQkqKGluc3RhbmNlLT5jaXJjX2J1Zi5idWYgKyBpbnN0YW5jZS0+Y2lyY19idWYuaGVhZCkgPQorCQkgICAgKGludyhpbnN0YW5jZS0+ZGF0YV9yZWcpIF4gMHg4MDAwKTsKKwkJaW5zdGFuY2UtPmNpcmNfYnVmLmhlYWQrKzsKKwkJaW5zdGFuY2UtPmNpcmNfYnVmLmhlYWQgJj0gaW5zdGFuY2UtPmNpcmNfYnVmLm1hc2s7CisJfQorCisjaWZkZWYgTUVERUJVR19FUlJPUgorCWlmICghc3RhdHVzKQorCQlQREVCVUcKKwkJICAgICgiQ29waWVkIGFsbCByZW1haW5pbmcgZGF0YXMgKCVkKSBmcm9tIEZJRk8gdG8gY2lyY3VsYXIgYnVmZmVyLlxuIiwKKwkJICAgICBjb3BpZWQpOworCWVsc2UgeworCQlQREVCVUcoIk5vIG1vcmUgZW1wdHkgc3BhY2UgaW4gYnVmZmVyLlxuIik7CisJCVBERUJVRygiQ29waWVkICVkIGRhdGFzIGZyb20gRklGTyB0byBjaXJjdWxhciBidWZmZXIuXG4iLAorCQkgICAgICAgY29waWVkKTsKKwkJUERFQlVHKCJGSUZPIHN0aWxsIG5vdCBlbXB0eS5cbiIpOworCX0KKyNlbmRpZgorCXJldHVybiAoIXN0YXR1cykgPyBjb3BpZWQgOiAtTUVfRVJSTk9fUklOR19CVUZGRVJfT1ZFUkZMT1c7Cit9CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMjApCitzdGF0aWMgdm9pZCBtZTQ2MDBfYWlfd29ya19jb250cm9sX3Rhc2sodm9pZCAqc3ViZGV2aWNlKQorI2Vsc2UKK3N0YXRpYyB2b2lkIG1lNDYwMF9haV93b3JrX2NvbnRyb2xfdGFzayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCisjZW5kaWYKK3sKKwltZTQ2MDBfYWlfc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCXVpbnQzMl90IHN0YXR1czsKKwl1aW50MzJfdCBjdHJsOworCXVuc2lnbmVkIGxvbmcgY3B1X2ZsYWdzID0gMDsKKwlpbnQgcmVzY2hlZHVsZSA9IDA7CisJaW50IHNpZ25hbGluZyA9IDA7CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMjApCisJaW5zdGFuY2UgPSAobWU0NjAwX2FpX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKyNlbHNlCisJaW5zdGFuY2UgPQorCSAgICBjb250YWluZXJfb2YoKHZvaWQgKil3b3JrLCBtZTQ2MDBfYWlfc3ViZGV2aWNlX3QsIGFpX2NvbnRyb2xfdGFzayk7CisjZW5kaWYKKwlQSU5GTygiPCVzOiAlbGQ+IGV4ZWN1dGVkLlxuIiwgX19mdW5jX18sIGppZmZpZXMpOworCisJc3RhdHVzID0gaW5sKGluc3RhbmNlLT5zdGF0dXNfcmVnKTsKKwlQREVCVUdfUkVHKCJzdGF0dXNfcmVnIGlubCgweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+c3RhdHVzX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgc3RhdHVzKTsKKworCXN3aXRjaCAoaW5zdGFuY2UtPnN0YXR1cykgewkvLyBDaGVja2luZyBhY3R1YWwgbW9kZS4KKwkJLy8gTm90IGNvbmZpZ3VyZWQgZm9yIHdvcmsuCisJY2FzZSBhaV9zdGF0dXNfbm9uZToKKwkJYnJlYWs7CisKKwkJLy9UaGlzIGFyZSBzdGFibGUgbW9kZXMuIE5vIG5lZWQgdG8gZG8gYW55dGhpbmcuICg/KQorCWNhc2UgYWlfc3RhdHVzX3NpbmdsZV9jb25maWd1cmVkOgorCWNhc2UgYWlfc3RhdHVzX3N0cmVhbV9jb25maWd1cmVkOgorCWNhc2UgYWlfc3RhdHVzX3N0cmVhbV9maWZvX2Vycm9yOgorCWNhc2UgYWlfc3RhdHVzX3N0cmVhbV9idWZmZXJfZXJyb3I6CisJY2FzZSBhaV9zdGF0dXNfc3RyZWFtX2Vycm9yOgorCQlQRVJST1IoIlNob3VsZG4ndCBiZSBydW5uaW5nIS5cbiIpOworCQlicmVhazsKKworCQkvLyBTdHJlYW0gbW9kZXMKKwljYXNlIGFpX3N0YXR1c19zdHJlYW1fcnVuX3dhaXQ6CisJCWlmIChzdGF0dXMgJiBNRTQ2MDBfQUlfU1RBVFVTX0JJVF9GU00pIHsJLy8gSVNNIHN0YXJ0ZWQuLgorCQkJaW5zdGFuY2UtPnN0YXR1cyA9IGFpX3N0YXR1c19zdHJlYW1fcnVuOworCQkJLy8gU2lnbmFsIHRoZSBlbmQgb2Ygd2FpdCBmb3Igc3RhcnQuCisJCQlzaWduYWxpbmcgPSAxOworCQkJLy8gV2FpdCBub3cgZm9yIHN0b3AuCisJCQlyZXNjaGVkdWxlID0gMTsKKwkJCWJyZWFrOworCisJCQkvLyBDaGVjayB0aW1lb3V0LgorCQkJaWYgKChpbnN0YW5jZS0+dGltZW91dC5kZWxheSkgJiYgKChqaWZmaWVzIC0gaW5zdGFuY2UtPnRpbWVvdXQuc3RhcnRfdGltZSkgPj0gaW5zdGFuY2UtPnRpbWVvdXQuZGVsYXkpKSB7CS8vIFRpbWVvdXQKKwkJCQlQREVCVUcoIlRpbWVvdXQgcmVhY2hlZC5cbiIpOworCQkJCS8vIFN0b3AgYWxsIGFjdGlvbnMuIE5vIGNvbmRpdGlvbnMhIEJsb2NrIGludGVycnVwdHMuIFJlc2V0IEZJRk8gPT4gVG9vIGxhdGUhCisJCQkJYWlfc3RvcF9pc3IoaW5zdGFuY2UpOworCisJCQkJaW5zdGFuY2UtPnN0YXR1cyA9IGFpX3N0YXR1c19zdHJlYW1fZW5kOworCisJCQkJLy8gU2lnbmFsIHRoZSBlbmQuCisJCQkJc2lnbmFsaW5nID0gMTsKKwkJCX0KKwkJfQorCQlicmVhazsKKworCWNhc2UgYWlfc3RhdHVzX3N0cmVhbV9ydW46CisJCS8vIFdhaXQgZm9yIHN0b3AgSVNNLgorCQlyZXNjaGVkdWxlID0gMTsKKwkJYnJlYWs7CisKKwljYXNlIGFpX3N0YXR1c19zdHJlYW1fZW5kX3dhaXQ6CisJCWlmICghKHN0YXR1cyAmIE1FNDYwMF9BSV9TVEFUVVNfQklUX0ZTTSkpIHsJLy8gSVNNIHN0b3BlZC4gT3ZlcndyaXRlIElTUi4KKwkJCWluc3RhbmNlLT5zdGF0dXMgPSBhaV9zdGF0dXNfc3RyZWFtX2VuZDsKKwkJCS8vIFNpZ25hbCB0aGUgZW5kIG9mIHdhaXQgZm9yIHN0b3AuCisJCQlzaWduYWxpbmcgPSAxOworCQl9IGVsc2UgeworCQkJLy8gV2FpdCBmb3Igc3RvcCBJU00uCisJCQlyZXNjaGVkdWxlID0gMTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgYWlfc3RhdHVzX3N0cmVhbV9lbmQ6CisJCS8vRW5kIHdvcmsuCisJCWlmIChzdGF0dXMgJiBNRTQ2MDBfQUlfU1RBVFVTX0JJVF9GU00pIHsJLy8gU3RpbGwgd29ya2luZz8gU3RvcCBpdCEKKwkJCVBFUlJPUgorCQkJICAgICgiU3RhdHVzIGlzICdhaV9zdGF0dXNfc3RyZWFtX2VuZCcgYnV0IGhhcmR3YXJlIGlzIHN0aWxsIHdvcmtpbmchXG4iKTsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrLCBjcHVfZmxhZ3MpOworCQkJY3RybCA9IGlubChpbnN0YW5jZS0+Y3RybF9yZWcpOworCQkJY3RybCB8PQorCQkJICAgIChNRTQ2MDBfQUlfQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1AgfAorCQkJICAgICBNRTQ2MDBfQUlfQ1RSTF9CSVRfSEZfSVJRX1JFU0VUIHwKKwkJCSAgICAgTUU0NjAwX0FJX0NUUkxfQklUX1NDX0lSUV9SRVNFVCk7CisJCQlvdXRsKGN0cmwsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCQlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgY3RybCk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrLAorCQkJCQkgICAgICAgY3B1X2ZsYWdzKTsKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCVBFUlJPUl9DUklUSUNBTCgiU3RhdHVzIGlzIGluIHdyb25nIHN0YXRlICglZCkhXG4iLAorCQkJCWluc3RhbmNlLT5zdGF0dXMpOworCQlpbnN0YW5jZS0+c3RhdHVzID0gYWlfc3RhdHVzX3N0cmVhbV9lcnJvcjsKKwkJLy8gU2lnbmFsIHRoZSBlbmQuCisJCXNpZ25hbGluZyA9IDE7CisJCWJyZWFrOworCisJfQorCisJaWYgKHNpZ25hbGluZykgewkvL1NpZ25hbCBpdC4KKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlX2FsbCgmaW5zdGFuY2UtPndhaXRfcXVldWUpOworCX0KKworCWlmIChpbnN0YW5jZS0+YWlfY29udHJvbF90YXNrX2ZsYWcgJiYgcmVzY2hlZHVsZSkgewkvLyBSZXNjaGVkdWxlIHRhc2sKKwkJcXVldWVfZGVsYXllZF93b3JrKGluc3RhbmNlLT5tZTQ2MDBfd29ya3F1ZXVlLAorCQkJCSAgICZpbnN0YW5jZS0+YWlfY29udHJvbF90YXNrLCAxKTsKKwl9IGVsc2UgeworCQlQSU5GTygiPCVzPiBFbmRpbmcgY29udHJvbCB0YXNrLlxuIiwgX19mdW5jX18pOworCX0KKworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lNDYwMF9haS5oIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lNDYwMF9haS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkNWExYjkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU0NjAwX2FpLmgKQEAgLTAsMCArMSwxODAgQEAKKy8qKgorICogQGZpbGUgbWU0NjAwX2FpLmgKKyAqCisgKiBAYnJpZWYgTWVpbGhhdXMgTUUtNDAwMCBhbmFsb2cgaW5wdXQgc3ViZGV2aWNlIGNsYXNzLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICogQGF1dGhvciBLcnp5c3p0b2YgR2FudHprZSAgKGsuZ2FudHprZUBtZWlsaGF1cy5kZSkKKyAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9NRTQ2MDBfQUlfSF8KKyNkZWZpbmUgX01FNDYwMF9BSV9IXworCisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgIm1lc3ViZGV2aWNlLmgiCisjaW5jbHVkZSAibWVpb2N0bC5oIgorI2luY2x1ZGUgIm1lY2lyY19idWYuaCIKKworI2lmZGVmIF9fS0VSTkVMX18KKworI2RlZmluZSBNRTQ2MDBfQUlfTUFYX0RBVEEJCQkJMHhGRkZGCisKKyNpZmRlZiBNRV9TWU5BUFNFCisjIGRlZmluZSBNRTQ2MDBfQUlfQ0lSQ19CVUZfU0laRV9PUkRFUgk4CS8vIDJebiBQQUdFUyA9Pj4gTWF4aW11bSB2YWx1ZSBvZiAxTUIgZm9yIFN5bmFwc2UKKyNlbHNlCisjIGRlZmluZSBNRTQ2MDBfQUlfQ0lSQ19CVUZfU0laRV9PUkRFUgk1CS8vIDJebiBQQUdFUyA9Pj4gMTI4S0IKKyNlbmRpZgorI2RlZmluZSBNRTQ2MDBfQUlfQ0lSQ19CVUZfU0laRSAJCVBBR0VfU0laRTw8TUU0NjAwX0FJX0NJUkNfQlVGX1NJWkVfT1JERVIJLy8gQnVmZmVyIHNpemUgaW4gYnl0ZXMuCisKKyNpZmRlZiBfQ0JVRkZfMzJiX3QKKyMgZGVmaW5lIE1FNDYwMF9BSV9DSVJDX0JVRl9DT1VOVAkJKChNRTQ2MDBfQUlfQ0lSQ19CVUZfU0laRSkgLyBzaXplb2YodWludDMyX3QpKQkvLyBTaXplIGluIHZhbHVlcworI2Vsc2UKKyMgZGVmaW5lIE1FNDYwMF9BSV9DSVJDX0JVRl9DT1VOVAkJKChNRTQ2MDBfQUlfQ0lSQ19CVUZfU0laRSkgLyBzaXplb2YodWludDE2X3QpKQkvLyBTaXplIGluIHZhbHVlcworI2VuZGlmCisKKyNkZWZpbmUgTUU0NjAwX0FJX0ZJRk9fSEFMRgkJCQkxMDI0CS8vTUU0NjAwX0FJX0ZJRk9fQ09VTlQvMiAgICAgICAgICAgICAgICAvLzEwMjQKKyNkZWZpbmUgTUU0NjAwX0FJX0ZJRk9fTUFYX1NDCQkJMTM1MgkvLzAuNjYqTUU0NjAwX0FJX0ZJRk9fQ09VTlQgICAgICAgICAgICAgLy8xMzUyCisKK3R5cGVkZWYgZW51bSBNRTQ2MDBfQUlfU1RBVFVTIHsKKwlhaV9zdGF0dXNfbm9uZSA9IDAsCisJYWlfc3RhdHVzX3NpbmdsZV9jb25maWd1cmVkLAorCWFpX3N0YXR1c19zdHJlYW1fY29uZmlndXJlZCwKKwlhaV9zdGF0dXNfc3RyZWFtX3J1bl93YWl0LAorCWFpX3N0YXR1c19zdHJlYW1fcnVuLAorCWFpX3N0YXR1c19zdHJlYW1fZW5kX3dhaXQsCisJYWlfc3RhdHVzX3N0cmVhbV9lbmQsCisJYWlfc3RhdHVzX3N0cmVhbV9maWZvX2Vycm9yLAorCWFpX3N0YXR1c19zdHJlYW1fYnVmZmVyX2Vycm9yLAorCWFpX3N0YXR1c19zdHJlYW1fZXJyb3IsCisJYWlfc3RhdHVzX2xhc3QKK30gTUU0NjAwX0FJX1NUQVRVUzsKKwordHlwZWRlZiBzdHJ1Y3QgbWU0NjAwX3NpbmdsZV9jb25maWdfZW50cnkgeworCXVuc2lnbmVkIHNob3J0IHN0YXR1czsKKwl1aW50MzJfdCBlbnRyeTsKKwl1aW50MzJfdCBjdHJsOworfSBtZTQ2MDBfc2luZ2xlX2NvbmZpZ19lbnRyeV90OworCit0eXBlZGVmIHN0cnVjdCBtZTQ2MDBfcmFuZ2VfZW50cnkgeworCWludCBtaW47CisJaW50IG1heDsKK30gbWU0NjAwX3JhbmdlX2VudHJ5X3Q7CisKK3R5cGVkZWYgc3RydWN0IG1lNDYwMF9haV9JU00geworCXZvbGF0aWxlIHVuc2lnbmVkIGludCBnbG9iYWxfcmVhZDsJCQkJLyoqPCBUaGUgbnVtYmVyIG9mIGRhdGEgcmVhZCBpbiB0b3RhbC4gKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgcmVhZDsJCQkJCQkvKio8IFRoZSBudW1iZXIgb2YgZGF0YSByZWFkIGZvciB0aGlzIGNodW5jay4gKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgbmV4dDsJCQkJCQkvKio8IFRoZSBudW1iZXIgb2YgZGF0YSByZXF1ZXN0IGJ5IHVzZXIuICovCit9IG1lNDYwMF9haV9JU01fdDsKKwordHlwZWRlZiBzdHJ1Y3QgbWU0NjAwX2FpX3RpbWVvdXQgeworCXVuc2lnbmVkIGxvbmcgc3RhcnRfdGltZTsKKwl1bnNpZ25lZCBsb25nIGRlbGF5OworfSBtZTQ2MDBfYWlfdGltZW91dF90OworCisvKioKKyAqIEBicmllZiBUaGUgTUUtNDAwMCBhbmFsb2cgaW5wdXQgc3ViZGV2aWNlIGNsYXNzLgorICovCit0eXBlZGVmIHN0cnVjdCBtZTQ2MDBfYWlfc3ViZGV2aWNlIHsKKwkvKiBJbmhlcml0YW5jZSAqLworCW1lX3N1YmRldmljZV90IGJhc2U7CQkJCQkJCS8qKjwgVGhlIHN1YmRldmljZSBiYXNlIGNsYXNzLiAqLworCisJLyogQXR0cmlidXRlcyAqLworCXNwaW5sb2NrX3Qgc3ViZGV2aWNlX2xvY2s7CQkJCQkJLyoqPCBTcGluIGxvY2sgdG8gcHJvdGVjdCB0aGUgc3ViZGV2aWNlIGZyb20gY29uY3VycmVudCBhY2Nlc3MuICovCisJc3BpbmxvY2tfdCAqY3RybF9yZWdfbG9jazsJCQkJCQkvKio8IFNwaW4gbG9jayB0byBwcm90ZWN0ICNjdHJsX3JlZyBmcm9tIGNvbmN1cnJlbnQgYWNjZXNzLiAqLworCisJLyogSGFyZHdhcmUgZmVhdXRyZXMgKi8KKwl1bnNpZ25lZCBpbnQgaXJxOwkJCQkJCQkJLyoqPCBUaGUgaW50ZXJydXB0IHJlcXVlc3QgbnVtYmVyIGFzc2lnbmVkIGJ5IHRoZSBQQ0kgQklPUy4gKi8KKwlpbnQgaXNvbGF0ZWQ7CQkJCQkJCQkJLyoqPCBNYXJrcyBpZiB0aGlzIHN1YmRldmljZSBpcyBvbiBhbiBvcHRvaXNvbGF0ZWQgZGV2aWNlLiAqLworCWludCBzaDsJCQkJCQkJCQkJCS8qKjwgTWFya3MgaWYgdGhpcyBzdWJkZXZpY2UgaGFzIHNhbXBsZSBhbmQgaG9sZCBkZXZpY2VzLiAqLworCisJdW5zaWduZWQgaW50IGNoYW5uZWxzOwkJCQkJCQkvKio8IFRoZSBudW1iZXIgb2YgY2hhbm5lbHMgYXZhaWxhYmxlIG9uIHRoaXMgc3ViZGV2aWNlLiAqLworCW1lNDYwMF9zaW5nbGVfY29uZmlnX2VudHJ5X3Qgc2luZ2xlX2NvbmZpZ1szMl07CS8qKjwgVGhlIGNvbmZpZ3VyYXRpb24gc2V0IGZvciBzaW5nbGUgYWNxdWlzaXRpb24uICovCisKKwl1bnNpZ25lZCBpbnQgZGF0YV9yZXF1aXJlZDsJCQkJCQkvKio8IFRoZSBudW1iZXIgb2YgZGF0YSByZXF1ZXN0IGJ5IHVzZXIuICovCisJdW5zaWduZWQgaW50IGZpZm9faXJxX3RocmVzaG9sZDsJCQkJLyoqPCBUaGUgdXNlciBhZGp1c3RlZCBGSUZPIGhpZ2ggd2F0ZXIgaW50ZXJydXB0IGxldmVsLiAqLworCXVuc2lnbmVkIGludCBjaGFuX2xpc3RfbGVuOwkJCQkJCS8qKjwgVGhlIGxlbmd0aCBvZiB0aGUgdXNlciBkZWZpbmVkIGNoYW5uZWwgbGlzdC4gKi8KKworCW1lNDYwMF9haV9JU01fdCBJU007CQkJCQkJCS8qKjwgVGhlIGluZm9ybWF0aW9uIHJlcXVlc3QgYnkgSW50ZXJydXB0LVN0YXRlLU1hY2hpbmUuICovCisJdm9sYXRpbGUgZW51bSBNRTQ2MDBfQUlfU1RBVFVTIHN0YXR1czsJCQkvKio8IFRoZSBjdXJyZW50IHN0cmVhbSBzdGF0dXMgZmxhZy4gKi8KKwltZTQ2MDBfYWlfdGltZW91dF90IHRpbWVvdXQ7CQkJCQkvKio8IFRoZSB0aW1lb3V0IGZvciBzdGFydCBpbiBibG9ja2luZyBhbmQgbm9uLWJsb2NraW5nIG1vZGUuICovCisKKwkJCQkJCQkJCQkJLyogUmVnaXN0ZXJzICovLyoqPCBBbGwgcmVnaXN0ZXJzIGFyZSAzMiBiaXRzIGxvbmcuICovCisJdW5zaWduZWQgbG9uZyBjdHJsX3JlZzsKKwl1bnNpZ25lZCBsb25nIHN0YXR1c19yZWc7CisJdW5zaWduZWQgbG9uZyBjaGFubmVsX2xpc3RfcmVnOworCXVuc2lnbmVkIGxvbmcgZGF0YV9yZWc7CisJdW5zaWduZWQgbG9uZyBjaGFuX3RpbWVyX3JlZzsKKwl1bnNpZ25lZCBsb25nIGNoYW5fcHJlX3RpbWVyX3JlZzsKKwl1bnNpZ25lZCBsb25nIHNjYW5fdGltZXJfbG93X3JlZzsKKwl1bnNpZ25lZCBsb25nIHNjYW5fdGltZXJfaGlnaF9yZWc7CisJdW5zaWduZWQgbG9uZyBzY2FuX3ByZV90aW1lcl9sb3dfcmVnOworCXVuc2lnbmVkIGxvbmcgc2Nhbl9wcmVfdGltZXJfaGlnaF9yZWc7CisJdW5zaWduZWQgbG9uZyBzdGFydF9yZWc7CisJdW5zaWduZWQgbG9uZyBpcnFfc3RhdHVzX3JlZzsKKwl1bnNpZ25lZCBsb25nIHNhbXBsZV9jb3VudGVyX3JlZzsKKworCXVuc2lnbmVkIGludCByYW5nZXNfbGVuOworCW1lNDYwMF9yYW5nZV9lbnRyeV90IHJhbmdlc1s0XTsJCQkJCS8qKjwgVGhlIHJhbmdlcyBhdmFpbGFibGUgb24gdGhpcyBzdWJkZXZpY2UuICovCisKKwkvKiBTb2Z0d2FyZSBidWZmZXIgKi8KKwltZV9jaXJjX2J1Zl90IGNpcmNfYnVmOwkJCQkJCQkvKio8IENpcmN1bGFyIGJ1ZmZlciBob2xkaW5nIG1lYXN1cm1lbnQgZGF0YS4gKi8KKwl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0X3F1ZXVlOwkJCQkJLyoqPCBXYWl0IHF1ZXVlIHRvIHB1dCBvbiB0YXNrcyB3YWl0aW5nIGZvciBkYXRhIHRvIGFycml2ZS4gKi8KKworCXN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICptZTQ2MDBfd29ya3F1ZXVlOworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwyMCkKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgYWlfY29udHJvbF90YXNrOworI2Vsc2UKKwlzdHJ1Y3QgZGVsYXllZF93b3JrIGFpX2NvbnRyb2xfdGFzazsKKyNlbmRpZgorCisJdm9sYXRpbGUgaW50IGFpX2NvbnRyb2xfdGFza19mbGFnOwkJCQkvKio8IEZsYWcgY29udHJvbGluZyByZWV4ZWN1dGluZyBvZiBjb250cm9sIHRhc2sgKi8KKworI2lmZGVmIE1FREVCVUdfREVCVUdfUkVHCisJdW5zaWduZWQgbG9uZyByZWdfYmFzZTsKKyNlbmRpZgorfSBtZTQ2MDBfYWlfc3ViZGV2aWNlX3Q7CisKKy8qKgorICogQGJyaWVmIFRoZSBjb25zdHJ1Y3RvciB0byBnZW5lcmF0ZSBhIE1FLTQwMDAgYW5hbG9nIGlucHV0IHN1YmRldmljZSBpbnN0YW5jZS4KKyAqCisgKiBAcGFyYW0gcmVnX2Jhc2UgVGhlIHJlZ2lzdGVyIGJhc2UgYWRkcmVzcyBvZiB0aGUgZGV2aWNlIGFzIHJldHVybmVkIGJ5IHRoZSBQQ0kgQklPUy4KKyAqIEBwYXJhbSBjaGFubmVscyBUaGUgbnVtYmVyIG9mIGFuYWxvZyBpbnB1dCBjaGFubmVscyBhdmFpbGFibGUgb24gdGhpcyBzdWJkZXZpY2UuCisgKiBAcGFyYW0gY2hhbm5lbHMgVGhlIG51bWJlciBvZiBhbmFsb2cgaW5wdXQgcmFuZ2VzIGF2YWlsYWJsZSBvbiB0aGlzIHN1YmRldmljZS4KKyAqIEBwYXJhbSBpc29sYXRlZCBGbGFnIGluZGljYXRpbmcgaWYgdGhpcyBkZXZpY2UgaXMgb3B0byBpc29sYXRlZC4KKyAqIEBwYXJhbSBzaCBGbGFnIGluZGljYXRpbmcgaWYgc2FtcGxlIGFuZCBob2xkIGRldmljZXMgYXJlIGF2YWlsYWJsZS4KKyAqIEBwYXJhbSBpcnEgVGhlIGlycSBudW1iZXIgYXNzaWduZWQgYnkgUENJIEJJT1MuCisgKiBAcGFyYW0gY3RybF9yZWdfbG9jayBQb2ludGVyIHRvIHNwaW4gbG9jayBwcm90ZWN0aW5nIHRoZSBjb250cm9sIHJlZ2lzdGVyIGZyb20gY29uY3VycmVudCBhY2Nlc3MuCisgKgorICogQHJldHVybiBQb2ludGVyIHRvIG5ldyBpbnN0YW5jZSBvbiBzdWNjZXNzLlxuCisgKiBOVUxMIG9uIGVycm9yLgorICovCittZTQ2MDBfYWlfc3ViZGV2aWNlX3QgKm1lNDYwMF9haV9jb25zdHJ1Y3Rvcih1aW50MzJfdCByZWdfYmFzZSwKKwkJCQkJICAgICB1bnNpZ25lZCBpbnQgY2hhbm5lbHMsCisJCQkJCSAgICAgdW5zaWduZWQgaW50IHJhbmdlcywKKwkJCQkJICAgICBpbnQgaXNvbGF0ZWQsCisJCQkJCSAgICAgaW50IHNoLAorCQkJCQkgICAgIGludCBpcnEsCisJCQkJCSAgICAgc3BpbmxvY2tfdCAqIGN0cmxfcmVnX2xvY2ssCisJCQkJCSAgICAgc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QKKwkJCQkJICAgICAqbWU0NjAwX3dxKTsKKworI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTQ2MDBfYWlfcmVnLmggYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU0NjAwX2FpX3JlZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4M2ZhYzcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU0NjAwX2FpX3JlZy5oCkBAIC0wLDAgKzEsMTA3IEBACisvKioKKyAqIEBmaWxlIG1lNDYwMF9haV9yZWcuaAorICoKKyAqIEBicmllZiBNRS00MDAwIGFuYWxvZyBpbnB1dCBzdWJkZXZpY2UgcmVnaXN0ZXIgZGVmaW5pdGlvbnMuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfTUU0NjAwX0FJX1JFR19IXworI2RlZmluZSBfTUU0NjAwX0FJX1JFR19IXworCisjaWZkZWYgX19LRVJORUxfXworCisjZGVmaW5lIE1FNDYwMF9BSV9DVFJMX1JFRwkJCQkJMHg3NAkvLyBfL1cKKyNkZWZpbmUgTUU0NjAwX0FJX1NUQVRVU19SRUcJCQkJMHg3NAkvLyBSL18KKyNkZWZpbmUgTUU0NjAwX0FJX0NIQU5ORUxfTElTVF9SRUcJCQkweDc4CS8vIF8vVworI2RlZmluZSBNRTQ2MDBfQUlfREFUQV9SRUcJCQkJCTB4N0MJLy8gUi9fCisjZGVmaW5lIE1FNDYwMF9BSV9DSEFOX1RJTUVSX1JFRwkJCTB4ODAJLy8gXy9XCisjZGVmaW5lIE1FNDYwMF9BSV9DSEFOX1BSRV9USU1FUl9SRUcJCTB4ODQJLy8gXy9XCisjZGVmaW5lIE1FNDYwMF9BSV9TQ0FOX1RJTUVSX0xPV19SRUcJCTB4ODgJLy8gXy9XCisjZGVmaW5lIE1FNDYwMF9BSV9TQ0FOX1RJTUVSX0hJR0hfUkVHCQkweDhDCS8vIF8vVworI2RlZmluZSBNRTQ2MDBfQUlfU0NBTl9QUkVfVElNRVJfTE9XX1JFRwkweDkwCS8vIF8vVworI2RlZmluZSBNRTQ2MDBfQUlfU0NBTl9QUkVfVElNRVJfSElHSF9SRUcJMHg5NAkvLyBfL1cKKyNkZWZpbmUgTUU0NjAwX0FJX1NUQVJUX1JFRwkJCQkJMHg5OAkvLyBSL18KKworI2RlZmluZSBNRTQ2MDBfQUlfU0FNUExFX0NPVU5URVJfUkVHCQkweEMwCS8vIF8vVworCisjZGVmaW5lIE1FNDYwMF9BSV9DVFJMX0JJVF9NT0RFXzAJCQkweDAwMDAwMDAxCisjZGVmaW5lIE1FNDYwMF9BSV9DVFJMX0JJVF9NT0RFXzEJCQkweDAwMDAwMDAyCisjZGVmaW5lIE1FNDYwMF9BSV9DVFJMX0JJVF9NT0RFXzIJCQkweDAwMDAwMDA0CisjZGVmaW5lIE1FNDYwMF9BSV9DVFJMX0JJVF9TQU1QTEVfSE9MRAkJMHgwMDAwMDAwOAorI2RlZmluZSBNRTQ2MDBfQUlfQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1AJMHgwMDAwMDAxMAorI2RlZmluZSBNRTQ2MDBfQUlfQ1RSTF9CSVRfU1RPUAkJCQkweDAwMDAwMDIwCisjZGVmaW5lIE1FNDYwMF9BSV9DVFJMX0JJVF9DSEFOTkVMX0ZJRk8JCTB4MDAwMDAwNDAKKyNkZWZpbmUgTUU0NjAwX0FJX0NUUkxfQklUX0RBVEFfRklGTwkJMHgwMDAwMDA4MAorI2RlZmluZSBNRTQ2MDBfQUlfQ1RSTF9CSVRfRlVMTFNDQUxFCQkweDAwMDAwMTAwCisjZGVmaW5lIE1FNDYwMF9BSV9DVFJMX0JJVF9PRkZTRVQJCQkweDAwMDAwMjAwCisjZGVmaW5lIE1FNDYwMF9BSV9DVFJMX0JJVF9FWF9UUklHX0FOQUxPRwkweDAwMDAwNDAwCisjZGVmaW5lIE1FNDYwMF9BSV9DVFJMX0JJVF9FWF9UUklHCQkJMHgwMDAwMDgwMAorI2RlZmluZSBNRTQ2MDBfQUlfQ1RSTF9CSVRfRVhfVFJJR19GQUxMSU5HCTB4MDAwMDEwMDAKKyNkZWZpbmUgTUU0NjAwX0FJX0NUUkxfQklUX0VYX0lSUQkJCTB4MDAwMDIwMDAKKyNkZWZpbmUgTUU0NjAwX0FJX0NUUkxfQklUX0VYX0lSUV9SRVNFVAkJMHgwMDAwNDAwMAorI2RlZmluZSBNRTQ2MDBfQUlfQ1RSTF9CSVRfTEVfSVJRCQkJMHgwMDAwODAwMAorI2RlZmluZSBNRTQ2MDBfQUlfQ1RSTF9CSVRfTEVfSVJRX1JFU0VUCQkweDAwMDEwMDAwCisjZGVmaW5lIE1FNDYwMF9BSV9DVFJMX0JJVF9IRl9JUlEJCQkweDAwMDIwMDAwCisjZGVmaW5lIE1FNDYwMF9BSV9DVFJMX0JJVF9IRl9JUlFfUkVTRVQJCTB4MDAwNDAwMDAKKyNkZWZpbmUgTUU0NjAwX0FJX0NUUkxfQklUX1NDX0lSUQkJCTB4MDAwODAwMDAKKyNkZWZpbmUgTUU0NjAwX0FJX0NUUkxfQklUX1NDX0lSUV9SRVNFVAkJMHgwMDEwMDAwMAorI2RlZmluZSBNRTQ2MDBfQUlfQ1RSTF9CSVRfU0NfUkVMT0FECQkweDAwMjAwMDAwCisjZGVmaW5lIE1FNDYwMF9BSV9DVFJMX0JJVF9FWF9UUklHX0JPVEgJCTB4ODAwMDAwMDAKKworI2RlZmluZSBNRTQ2MDBfQUlfU1RBVFVTX0JJVF9FRl9DSEFOTkVMCQkweDAwNDAwMDAwCisjZGVmaW5lIE1FNDYwMF9BSV9TVEFUVVNfQklUX0hGX0NIQU5ORUwJCTB4MDA4MDAwMDAKKyNkZWZpbmUgTUU0NjAwX0FJX1NUQVRVU19CSVRfRkZfQ0hBTk5FTAkJMHgwMTAwMDAwMAorI2RlZmluZSBNRTQ2MDBfQUlfU1RBVFVTX0JJVF9FRl9EQVRBCQkweDAyMDAwMDAwCisjZGVmaW5lIE1FNDYwMF9BSV9TVEFUVVNfQklUX0hGX0RBVEEJCTB4MDQwMDAwMDAKKyNkZWZpbmUgTUU0NjAwX0FJX1NUQVRVU19CSVRfRkZfREFUQQkJMHgwODAwMDAwMAorI2RlZmluZSBNRTQ2MDBfQUlfU1RBVFVTX0JJVF9MRQkJCQkweDEwMDAwMDAwCisjZGVmaW5lIE1FNDYwMF9BSV9TVEFUVVNfQklUX0ZTTQkJCTB4MjAwMDAwMDAKKworI2RlZmluZSBNRTQ2MDBfQUlfQ1RSTF9SUENJX0ZJRk8JCQkweDQwMDAwMDAwCS8vQWx3YXlzIHNldCB0byB6ZXJvIQorCisjZGVmaW5lIE1FNDYwMF9BSV9CQVNFX0ZSRVFVRU5DWQkJCTMzRTYKKworI2RlZmluZSBNRTQ2MDBfQUlfTUlOX0FDUV9USUNLUwkJCQk2NkxMCisjZGVmaW5lIE1FNDYwMF9BSV9NQVhfQUNRX1RJQ0tTCQkJCTB4RkZGRkZGRkZMTAorCisjZGVmaW5lIE1FNDYwMF9BSV9NSU5fU0NBTl9USUNLUwkJCTY2TEwKKyNkZWZpbmUgTUU0NjAwX0FJX01BWF9TQ0FOX1RJQ0tTCQkJMHhGRkZGRkZGRkZMTAorCisjZGVmaW5lIE1FNDYwMF9BSV9NSU5fQ0hBTl9USUNLUwkJCTY2TEwKKyNkZWZpbmUgTUU0NjAwX0FJX01BWF9DSEFOX1RJQ0tTCQkJMHhGRkZGRkZGRkxMCisKKyNkZWZpbmUgTUU0NjAwX0FJX0ZJRk9fQ09VTlQJCQkJMjA0OAorCisjZGVmaW5lIE1FNDYwMF9BSV9MSVNUX0NPVU5UCQkJCTEwMjQKKworI2RlZmluZSBNRTQ2MDBfQUlfTElTVF9JTlBVVF9TSU5HTEVfRU5ERUQJMHgwMDAKKyNkZWZpbmUgTUU0NjAwX0FJX0xJU1RfSU5QVVRfRElGRkVSRU5USUFMCTB4MDIwCisKKyNkZWZpbmUgTUU0NjAwX0FJX0xJU1RfUkFOR0VfQklQT0xBUl8xMAkJMHgwMDAKKyNkZWZpbmUgTUU0NjAwX0FJX0xJU1RfUkFOR0VfQklQT0xBUl8yXzUJMHgwNDAKKyNkZWZpbmUgTUU0NjAwX0FJX0xJU1RfUkFOR0VfVU5JUE9MQVJfMTAJMHgwODAKKyNkZWZpbmUgTUU0NjAwX0FJX0xJU1RfUkFOR0VfVU5JUE9MQVJfMl81CTB4MEMwCisKKyNkZWZpbmUgTUU0NjAwX0FJX0xJU1RfTEFTVF9FTlRSWQkJMHgxMDAKKworI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTQ2MDBfYW8uYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTQ2MDBfYW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMmJlYzgyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lNDYwMF9hby5jCkBAIC0wLDAgKzEsNjAxMSBAQAorLyoqCisgKiBAZmlsZSBtZTQ2MDBfYW8uYworICoKKyAqIEBicmllZiBNRS00MDAwIGFuYWxvZyBvdXRwdXQgc3ViZGV2aWNlIGluc3RhbmNlLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICogQGF1dGhvciBLcnp5c3p0b2YgR2FudHprZQkoay5nYW50emtlQG1laWxoYXVzLmRlKQorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX19LRVJORUxfXworIyAgZGVmaW5lIF9fS0VSTkVMX18KKyNlbmRpZgorCisvLy9Db21tb24gcGFydC4gKEZvciBub3JtYWwgYW5kIEJvc2NoIGJ1aWxkcy4pCisKKy8qIEluY2x1ZGVzCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorCisjaW5jbHVkZSAibWVkZWZpbmVzLmgiCisjaW5jbHVkZSAibWVpbnRlcm5hbC5oIgorI2luY2x1ZGUgIm1lZXJyb3IuaCIKKworI2luY2x1ZGUgIm1lZGVidWcuaCIKKyNpbmNsdWRlICJtZWlkcy5oIgorI2luY2x1ZGUgIm1lNDYwMF9yZWcuaCIKKyNpbmNsdWRlICJtZTQ2MDBfYW9fcmVnLmgiCisjaW5jbHVkZSAibWU0NjAwX2FvLmgiCisKKy8qIERlZmluZXMKKyAqLworCitzdGF0aWMgaW50IG1lNDYwMF9hb19xdWVyeV9yYW5nZV9ieV9taW5fbWF4KG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQkgICAgaW50IHVuaXQsCisJCQkJCSAgICBpbnQgKm1pbiwKKwkJCQkJICAgIGludCAqbWF4LCBpbnQgKm1heGRhdGEsIGludCAqcmFuZ2UpOworCitzdGF0aWMgaW50IG1lNDYwMF9hb19xdWVyeV9udW1iZXJfcmFuZ2VzKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQkgaW50IHVuaXQsIGludCAqY291bnQpOworCitzdGF0aWMgaW50IG1lNDYwMF9hb19xdWVyeV9yYW5nZV9pbmZvKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICAgIGludCByYW5nZSwKKwkJCQkgICAgICBpbnQgKnVuaXQsCisJCQkJICAgICAgaW50ICptaW4sIGludCAqbWF4LCBpbnQgKm1heGRhdGEpOworCitzdGF0aWMgaW50IG1lNDYwMF9hb19xdWVyeV90aW1lcihtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgaW50IHRpbWVyLAorCQkJCSBpbnQgKmJhc2VfZnJlcXVlbmN5LAorCQkJCSBsb25nIGxvbmcgKm1pbl90aWNrcywgbG9uZyBsb25nICptYXhfdGlja3MpOworCitzdGF0aWMgaW50IG1lNDYwMF9hb19xdWVyeV9udW1iZXJfY2hhbm5lbHMobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJCSAgIGludCAqbnVtYmVyKTsKKworc3RhdGljIGludCBtZTQ2MDBfYW9fcXVlcnlfc3ViZGV2aWNlX3R5cGUobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJCSAgaW50ICp0eXBlLCBpbnQgKnN1YnR5cGUpOworCitzdGF0aWMgaW50IG1lNDYwMF9hb19xdWVyeV9zdWJkZXZpY2VfY2FwcyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJICBpbnQgKmNhcHMpOworCitzdGF0aWMgaW50IG1lNDYwMF9hb19xdWVyeV9zdWJkZXZpY2VfY2Fwc19hcmdzKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSwKKwkJCQkJICAgICAgIGludCBjYXAsIGludCAqYXJncywgaW50IGNvdW50KTsKKworI2lmbmRlZiBCT1NDSAorLy8vIEBub3RlIE5PUk1BTCBCVUlMRAorLy8vIEBhdXRob3IgS3J6eXN6dG9mIEdhbnR6a2UgICAoay5nYW50emtlQG1laWxoYXVzLmRlKQorLyogSW5jbHVkZXMKKyAqLworCisjIGluY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorCisvKiBEZWZpbmVzCisgKi8KKworLyoqIFJlbW92ZSBzdWJkZXZpY2UuCisqLworc3RhdGljIHZvaWQgbWU0NjAwX2FvX2Rlc3RydWN0b3Ioc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlKTsKKworLyoqIFJlc2V0IHN1YmRldmljZS4gU3RvcCBhbGwgYWN0aW9ucy4gUmVzZXQgcmVnaXN0cnkuIERpc2FibGUgRklGTy4gU2V0IG91dHB1dCB0byAwViBhbmQgc3RhdHVzIHRvICdub25lJy4KKyovCitzdGF0aWMgaW50IG1lNDYwMF9hb19pb19yZXNldF9zdWJkZXZpY2UobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJCXN0cnVjdCBmaWxlICpmaWxlcCwgaW50IGZsYWdzKTsKKworLyoqIFNldCBvdXRwdXQgYXMgc2luZ2xlCisqLworc3RhdGljIGludCBtZTQ2MDBfYW9faW9fc2luZ2xlX2NvbmZpZyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgICAgaW50IGNoYW5uZWwsCisJCQkJICAgICAgaW50IHNpbmdsZV9jb25maWcsCisJCQkJICAgICAgaW50IHJlZiwKKwkJCQkgICAgICBpbnQgdHJpZ19jaGFuLAorCQkJCSAgICAgIGludCB0cmlnX3R5cGUsIGludCB0cmlnX2VkZ2UsIGludCBmbGFncyk7CisKKy8qKiBQYXNzIHRvIHVzZXIgYWN0dWFsIHZhbHVlIG9mIG91dHB1dC4KKyovCitzdGF0aWMgaW50IG1lNDYwMF9hb19pb19zaW5nbGVfcmVhZChtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICBpbnQgY2hhbm5lbCwKKwkJCQkgICAgaW50ICp2YWx1ZSwgaW50IHRpbWVfb3V0LCBpbnQgZmxhZ3MpOworCisvKiogV3JpdGUgdG8gb3V0cHV0IHJlcXVlZCB2YWx1ZS4KKyovCitzdGF0aWMgaW50IG1lNDYwMF9hb19pb19zaW5nbGVfd3JpdGUobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgICBpbnQgY2hhbm5lbCwKKwkJCQkgICAgIGludCB2YWx1ZSwgaW50IHRpbWVfb3V0LCBpbnQgZmxhZ3MpOworCisvKiogU2V0IG91dHB1dCBhcyBzdHJlYW1lZCBkZXZpY2UuCisqLworc3RhdGljIGludCBtZTQ2MDBfYW9faW9fc3RyZWFtX2NvbmZpZyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgICAgbWVJT1N0cmVhbUNvbmZpZ190ICogY29uZmlnX2xpc3QsCisJCQkJICAgICAgaW50IGNvdW50LAorCQkJCSAgICAgIG1lSU9TdHJlYW1UcmlnZ2VyX3QgKiB0cmlnZ2VyLAorCQkJCSAgICAgIGludCBmaWZvX2lycV90aHJlc2hvbGQsIGludCBmbGFncyk7CisKKy8qKiBXYWl0IGZvciAvIENoZWNrIGVtcHR5IHNwYWNlIGluIGJ1ZmZlci4KKyovCitzdGF0aWMgaW50IG1lNDYwMF9hb19pb19zdHJlYW1fbmV3X3ZhbHVlcyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJCSAgaW50IHRpbWVfb3V0LCBpbnQgKmNvdW50LCBpbnQgZmxhZ3MpOworCisvKiogU3RhcnQgc3RyZWFtaW5nLgorKi8KK3N0YXRpYyBpbnQgbWU0NjAwX2FvX2lvX3N0cmVhbV9zdGFydChtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgIGludCBzdGFydF9tb2RlLCBpbnQgdGltZV9vdXQsIGludCBmbGFncyk7CisKKy8qKiBDaGVjayBhY3R1YWwgc3RhdGUuIC8gV2FpdCBmb3IgZW5kLgorKi8KK3N0YXRpYyBpbnQgbWU0NjAwX2FvX2lvX3N0cmVhbV9zdGF0dXMobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICAgIGludCB3YWl0LAorCQkJCSAgICAgIGludCAqc3RhdHVzLCBpbnQgKnZhbHVlcywgaW50IGZsYWdzKTsKKworLyoqIFN0b3Agc3RyZWFtaW5nLgorKi8KK3N0YXRpYyBpbnQgbWU0NjAwX2FvX2lvX3N0cmVhbV9zdG9wKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgIGludCBzdG9wX21vZGUsIGludCBmbGFncyk7CisKKy8qKiBXcml0ZSBkYXRhcyB0byBidWZmb3IuCisqLworc3RhdGljIGludCBtZTQ2MDBfYW9faW9fc3RyZWFtX3dyaXRlKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICAgaW50IHdyaXRlX21vZGUsCisJCQkJICAgICBpbnQgKnZhbHVlcywgaW50ICpjb3VudCwgaW50IGZsYWdzKTsKKworLyoqIEludGVycnVwdCBoYW5kbGVyLiBDb3B5IGZyb20gYnVmZmVyIHRvIEZJRk8uCisqLworc3RhdGljIGlycXJldHVybl90IG1lNDYwMF9hb19pc3IoaW50IGlycSwgdm9pZCAqZGV2X2lkCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiwgNiwgMTkpCisJCQkJICwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MKKyNlbmRpZgorICAgICk7CisvKiogQ29weSBkYXRhIGZyb20gY2lyY3VsYXIgYnVmZmVyIHRvIGZpZm8gKGZhc3QpIGluIHdyYXBhcm91bmQgbW9kZS4KKyovCitpbnQgaW5saW5lIGFvX3dyaXRlX2RhdGFfd3JhcGFyb3VuZChtZTQ2MDBfYW9fc3ViZGV2aWNlX3QgKiBpbnN0YW5jZSwgaW50IGNvdW50LAorCQkJCSAgICBpbnQgc3RhcnRfcG9zKTsKKworLyoqIENvcHkgZGF0YSBmcm9tIGNpcmN1bGFyIGJ1ZmZlciB0byBmaWZvIChmYXN0KS4KKyovCitpbnQgaW5saW5lIGFvX3dyaXRlX2RhdGEobWU0NjAwX2FvX3N1YmRldmljZV90ICogaW5zdGFuY2UsIGludCBjb3VudCwKKwkJCSBpbnQgc3RhcnRfcG9zKTsKKworLyoqIENvcHkgZGF0YSBmcm9tIGNpcmN1bGFyIGJ1ZmZlciB0byBmaWZvIChzbG93KS4KKyovCitpbnQgaW5saW5lIGFvX3dyaXRlX2RhdGFfcG9vbGluZyhtZTQ2MDBfYW9fc3ViZGV2aWNlX3QgKiBpbnN0YW5jZSwgaW50IGNvdW50LAorCQkJCSBpbnQgc3RhcnRfcG9zKTsKKworLyoqIENvcHkgZGF0YSBmcm9tIHVzZXIgc3BhY2UgdG8gY2lyY3VsYXIgYnVmZmVyLgorKi8KK2ludCBpbmxpbmUgYW9fZ2V0X2RhdGFfZnJvbV91c2VyKG1lNDYwMF9hb19zdWJkZXZpY2VfdCAqIGluc3RhbmNlLCBpbnQgY291bnQsCisJCQkJIGludCAqdXNlcl92YWx1ZXMpOworCisvKiogU3RvcCBwcmVzZW50YXRpb24uIFByZXNlcnZlIEZJRk9zLgorKi8KK2ludCBpbmxpbmUgYW9fc3RvcF9pbW1lZGlhdGVseShtZTQ2MDBfYW9fc3ViZGV2aWNlX3QgKiBpbnN0YW5jZSk7CisKKy8qKiBUYXNrIGZvciBhc3luY2hyb25pY2FsIHN0YXRlIHZlcmlmeWluZy4KKyovCitzdGF0aWMgdm9pZCBtZTQ2MDBfYW9fd29ya19jb250cm9sX3Rhc2soCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDIwKQorCQkJCQkgICAgICAgdm9pZCAqc3ViZGV2aWNlCisjZWxzZQorCQkJCQkgICAgICAgc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrCisjZW5kaWYKKyAgICApOworLyogRnVuY3Rpb25zCisgKi8KKworc3RhdGljIGludCBtZTQ2MDBfYW9faW9fcmVzZXRfc3ViZGV2aWNlKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQlzdHJ1Y3QgZmlsZSAqZmlsZXAsIGludCBmbGFncykKK3sKKwltZTQ2MDBfYW9fc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCXVpbnQzMl90IHRtcDsKKworCWluc3RhbmNlID0gKG1lNDYwMF9hb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlQREVCVUcoImV4ZWN1dGVkLiBpZHg9JWRcbiIsIGluc3RhbmNlLT5hb19pZHgpOworCisJaWYgKGZsYWdzKSB7CisJCVBFUlJPUigiSW52YWxpZCBmbGFnIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlpbnN0YW5jZS0+c3RhdHVzID0gYW9fc3RhdHVzX25vbmU7CisJaW5zdGFuY2UtPmFvX2NvbnRyb2xfdGFza19mbGFnID0gMDsKKwljYW5jZWxfZGVsYXllZF93b3JrKCZpbnN0YW5jZS0+YW9fY29udHJvbF90YXNrKTsKKwlpbnN0YW5jZS0+dGltZW91dC5kZWxheSA9IDA7CisJaW5zdGFuY2UtPnRpbWVvdXQuc3RhcnRfdGltZSA9IGppZmZpZXM7CisKKwkvL1N0b3Agc3RhdGUgbWFjaGluZS4KKwllcnIgPSBhb19zdG9wX2ltbWVkaWF0ZWx5KGluc3RhbmNlKTsKKworCS8vUmVtb3ZlIGZyb20gc3luY2hyb25vdXMgc3RhcnQuCisJc3Bpbl9sb2NrKGluc3RhbmNlLT5wcmVsb2FkX3JlZ19sb2NrKTsKKwl0bXAgPSBpbmwoaW5zdGFuY2UtPnByZWxvYWRfcmVnKTsKKwl0bXAgJj0KKwkgICAgfigoTUU0NjAwX0FPX1NZTkNfSE9MRCB8IE1FNDYwMF9BT19TWU5DX0VYVF9UUklHKSA8PCBpbnN0YW5jZS0+CisJICAgICAgYW9faWR4KTsKKwlvdXRsKHRtcCwgaW5zdGFuY2UtPnByZWxvYWRfcmVnKTsKKwlQREVCVUdfUkVHKCJwcmVsb2FkX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5wcmVsb2FkX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgdG1wKTsKKwkqaW5zdGFuY2UtPnByZWxvYWRfZmxhZ3MgJj0KKwkgICAgfigoTUU0NjAwX0FPX1NZTkNfSE9MRCB8IE1FNDYwMF9BT19TWU5DX0VYVF9UUklHKSA8PCBpbnN0YW5jZS0+CisJICAgICAgYW9faWR4KTsKKwlzcGluX3VubG9jayhpbnN0YW5jZS0+cHJlbG9hZF9yZWdfbG9jayk7CisKKwkvL1NldCBzaW5nbGUgbW9kZSwgZGlzc2FibGUgRklGTywgZGlzc2FibGUgZXh0ZXJuYWwgdHJpZ2dlciwgc2V0IG91dHB1dCB0byBhbmFsb2csIGJsb2NrIGludGVycnVwdC4KKwlvdXRsKE1FNDYwMF9BT19NT0RFX1NJTkdMRSB8IE1FNDYwMF9BT19DVFJMX0JJVF9TVE9QIHwKKwkgICAgIE1FNDYwMF9BT19DVFJMX0JJVF9JTU1FRElBVEVfU1RPUCB8IE1FNDYwMF9BT19DVFJMX0JJVF9SRVNFVF9JUlEsCisJICAgICBpbnN0YW5jZS0+Y3RybF9yZWcpOworCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBNRTQ2MDBfQU9fTU9ERV9TSU5HTEUgfCBNRTQ2MDBfQU9fQ1RSTF9CSVRfU1RPUCB8CisJCSAgIE1FNDYwMF9BT19DVFJMX0JJVF9JTU1FRElBVEVfU1RPUCB8CisJCSAgIE1FNDYwMF9BT19DVFJMX0JJVF9SRVNFVF9JUlEpOworCisJLy9TZXQgb3V0cHV0IHRvIDBWCisJb3V0bCgweDgwMDAsIGluc3RhbmNlLT5zaW5nbGVfcmVnKTsKKwlQREVCVUdfUkVHKCJzaW5nbGVfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPnNpbmdsZV9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIDB4ODAwMCk7CisKKwlpbnN0YW5jZS0+Y2lyY19idWYuaGVhZCA9IDA7CisJaW5zdGFuY2UtPmNpcmNfYnVmLnRhaWwgPSAwOworCWluc3RhbmNlLT5wcmVsb2FkZWRfY291bnQgPSAwOworCWluc3RhbmNlLT5kYXRhX2NvdW50ID0gMDsKKwlpbnN0YW5jZS0+c2luZ2xlX3ZhbHVlID0gMHg4MDAwOworCWluc3RhbmNlLT5zaW5nbGVfdmFsdWVfaW5fZmlmbyA9IDB4ODAwMDsKKworCS8vU2V0IHN0YXR1cyB0byBzaWduYWwgdGhhdCBkZXZpY2UgaXMgdW5jb25maWd1cmVkLgorCWluc3RhbmNlLT5zdGF0dXMgPSBhb19zdGF0dXNfbm9uZTsKKworCS8vU2lnbmFsIHJlc2V0IGlmIHVzZXIgaXMgb24gd2FpdC4KKwl3YWtlX3VwX2ludGVycnVwdGlibGVfYWxsKCZpbnN0YW5jZS0+d2FpdF9xdWV1ZSk7CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWU0NjAwX2FvX2lvX3NpbmdsZV9jb25maWcobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICAgIGludCBjaGFubmVsLAorCQkJCSAgICAgIGludCBzaW5nbGVfY29uZmlnLAorCQkJCSAgICAgIGludCByZWYsCisJCQkJICAgICAgaW50IHRyaWdfY2hhbiwKKwkJCQkgICAgICBpbnQgdHJpZ190eXBlLCBpbnQgdHJpZ19lZGdlLCBpbnQgZmxhZ3MpCit7CisJbWU0NjAwX2FvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwl1aW50MzJfdCBjdHJsOworCXVpbnQzMl90IHN5bmM7CisJdW5zaWduZWQgbG9uZyBjcHVfZmxhZ3M7CisKKwlpbnN0YW5jZSA9IChtZTQ2MDBfYW9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJUERFQlVHKCJleGVjdXRlZC4gaWR4PSVkXG4iLCBpbnN0YW5jZS0+YW9faWR4KTsKKworCS8vIENoZWNraW5nIHBhcmFtZXRlcnMKKwlpZiAoZmxhZ3MpIHsKKwkJUEVSUk9SCisJCSAgICAoIkludmFsaWQgZmxhZyBzcGVjaWZpZWQuIE11c3QgYmUgTUVfSU9fU0lOR0xFX0NPTkZJR19OT19GTEFHUy5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlzd2l0Y2ggKHRyaWdfdHlwZSkgeworCWNhc2UgTUVfVFJJR19UWVBFX1NXOgorCQlpZiAodHJpZ19lZGdlICE9IE1FX1RSSUdfRURHRV9OT05FKSB7CisJCQlQRVJST1IKKwkJCSAgICAoIkludmFsaWQgdHJpZ2dlciBlZGdlLiBTb2Z0d2FyZSB0cmlnZ2VyIGhhcyBub3QgZWRnZS5cbiIpOworCQkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfVFJJR19FREdFOworCQl9CisJCWJyZWFrOworCisJY2FzZSBNRV9UUklHX1RZUEVfRVhUX0RJR0lUQUw6CisJCXN3aXRjaCAodHJpZ19lZGdlKSB7CisJCWNhc2UgTUVfVFJJR19FREdFX0FOWToKKwkJY2FzZSBNRV9UUklHX0VER0VfUklTSU5HOgorCQljYXNlIE1FX1RSSUdfRURHRV9GQUxMSU5HOgorCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCVBFUlJPUigiSW52YWxpZCB0cmlnZ2VyIGVkZ2UuXG4iKTsKKwkJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1RSSUdfRURHRTsKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCVBFUlJPUgorCQkgICAgKCJJbnZhbGlkIHRyaWdnZXIgdHlwZS4gVHJpZ2dlciBtdXN0IGJlIHNvZnR3YXJlIG9yIGRpZ2l0YWwuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfVFJJR19UWVBFOworCX0KKworCWlmICgodHJpZ19jaGFuICE9IE1FX1RSSUdfQ0hBTl9ERUZBVUxUKQorCSAgICAmJiAodHJpZ19jaGFuICE9IE1FX1RSSUdfQ0hBTl9TWU5DSFJPTk9VUykpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIHRyaWdnZXIgY2hhbm5lbCBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfVFJJR19DSEFOOworCX0KKworCWlmIChyZWYgIT0gTUVfUkVGX0FPX0dST1VORCkgeworCQlQRVJST1IKKwkJICAgICgiSW52YWxpZCByZWZlcmVuY2UuIEFuYWxvZyBvdXRwdXRzIGhhdmUgdG8gaGF2ZSBnb3QgUkVGX0FPX0dST1VORC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9SRUY7CisJfQorCisJaWYgKHNpbmdsZV9jb25maWcgIT0gMCkgeworCQlQRVJST1IKKwkJICAgICgiSW52YWxpZCBzaW5nbGUgY29uZmlnIHNwZWNpZmllZC4gT25seSBvbmUgcmFuZ2UgZm9yIGFubG9nIG91dHB1dHMgaXMgYXZhaWxhYmxlLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1NJTkdMRV9DT05GSUc7CisJfQorCisJaWYgKGNoYW5uZWwgIT0gMCkgeworCQlQRVJST1IKKwkJICAgICgiSW52YWxpZCBjaGFubmVsIG51bWJlciBzcGVjaWZpZWQuIEFuYWxvZyBvdXRwdXQgaGF2ZSBvbmx5IG9uZSBjaGFubmVsLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJfQorCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJLy9TdWJkZXZpY2UgcnVubmluZyBpbiBzdHJlYW0gbW9kZSEKKwlpZiAoKGluc3RhbmNlLT5zdGF0dXMgPj0gYW9fc3RhdHVzX3N0cmVhbV9ydW5fd2FpdCkKKwkgICAgJiYgKGluc3RhbmNlLT5zdGF0dXMgPCBhb19zdGF0dXNfc3RyZWFtX2VuZCkpIHsKKwkJUEVSUk9SKCJTdWJkZXZpY2UgaXMgYnVzeS5cbiIpOworCQlNRV9TVUJERVZJQ0VfRVhJVDsKKworCQlyZXR1cm4gTUVfRVJSTk9fU1VCREVWSUNFX0JVU1k7CisJfQorLy8vIEBub3RlIEZvciBzaW5nbGUgYWxsIGNhbGxzIChjb25maWcgYW5kIHdyaXRlKSBhcmUgZXJhc2luZyBwcmV2aW91cyBzdGF0ZSEKKworCWluc3RhbmNlLT5zdGF0dXMgPSBhb19zdGF0dXNfbm9uZTsKKworCS8vIENvcnJlY3Qgc2luZ2xlIG1pcnJvcnMKKwlpbnN0YW5jZS0+c2luZ2xlX3ZhbHVlX2luX2ZpZm8gPSBpbnN0YW5jZS0+c2luZ2xlX3ZhbHVlOworCisJLy9TdG9wIGRldmljZQorCWVyciA9IGFvX3N0b3BfaW1tZWRpYXRlbHkoaW5zdGFuY2UpOworCWlmIChlcnIpIHsKKwkJUEVSUk9SX0NSSVRJQ0FMKCJGU00gSVMgQlVTWSFcbiIpOworCQlNRV9TVUJERVZJQ0VfRVhJVDsKKworCQlyZXR1cm4gTUVfRVJSTk9fU1VCREVWSUNFX0JVU1k7CisJfQorCS8vIFNldCBjb250cm9sIHJlZ2lzdGVyLgorCXNwaW5fbG9ja19pcnFzYXZlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisJLy8gU2V0IHN0b3AgYml0LiBTdG9wIHN0cmVhbWluZyBtb2RlLgorCWN0cmwgPSBpbmwoaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkvL1Jlc2V0IGFsbCBiaXRzLgorCWN0cmwgPSBNRTQ2MDBfQU9fQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1AgfCBNRTQ2MDBfQU9fQ1RSTF9CSVRfU1RPUDsKKworCWlmICh0cmlnX3R5cGUgPT0gTUVfVFJJR19UWVBFX0VYVF9ESUdJVEFMKSB7CisJCVBJTkZPKCJFeHRlcm5hbCBkaWdpdGFsIHRyaWdnZXIuXG4iKTsKKworCQlpZiAodHJpZ19lZGdlID09IE1FX1RSSUdfRURHRV9BTlkpIHsKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3RybCB8PSBNRTQ2MDBfQU9fQ1RSTF9CSVRfRVhfVFJJR19FREdFIHwgTUU0NjAwX0FPX0NUUkxfQklUX0VYX1RSSUdfRURHRV9CT1RIOworCQkJaW5zdGFuY2UtPmN0cmxfdHJnID0KKwkJCSAgICBNRTQ2MDBfQU9fQ1RSTF9CSVRfRVhfVFJJR19FREdFIHwKKwkJCSAgICBNRTQ2MDBfQU9fQ1RSTF9CSVRfRVhfVFJJR19FREdFX0JPVEg7CisJCX0gZWxzZSBpZiAodHJpZ19lZGdlID09IE1FX1RSSUdfRURHRV9GQUxMSU5HKSB7CisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0cmwgfD0gTUU0NjAwX0FPX0NUUkxfQklUX0VYX1RSSUdfRURHRTsKKwkJCWluc3RhbmNlLT5jdHJsX3RyZyA9IE1FNDYwMF9BT19DVFJMX0JJVF9FWF9UUklHX0VER0U7CisJCX0gZWxzZSBpZiAodHJpZ19lZGdlID09IE1FX1RSSUdfRURHRV9SSVNJTkcpIHsKKwkJCWluc3RhbmNlLT5jdHJsX3RyZyA9IDB4MDsKKwkJfQorCX0gZWxzZSBpZiAodHJpZ190eXBlID09IE1FX1RSSUdfVFlQRV9TVykgeworCQlQREVCVUcoIlNvZnR3YXJlIHRyaWdnZXJcbiIpOworCQlpbnN0YW5jZS0+Y3RybF90cmcgPSAweDA7CisJfQorCisJb3V0bChjdHJsLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCBjdHJsKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisKKwkvLyBTZXQgcHJlbG9hZC9zeW5jaHJvbml6YXRpb24gcmVnaXN0ZXIuCisJc3Bpbl9sb2NrKGluc3RhbmNlLT5wcmVsb2FkX3JlZ19sb2NrKTsKKwlpZiAodHJpZ190eXBlID09IE1FX1RSSUdfVFlQRV9TVykgeworCQkqaW5zdGFuY2UtPnByZWxvYWRfZmxhZ3MgJj0KKwkJICAgIH4oTUU0NjAwX0FPX1NZTkNfRVhUX1RSSUcgPDwgaW5zdGFuY2UtPmFvX2lkeCk7CisJfSBlbHNlCQkJLy9pZiAodHJpZ190eXBlID09IE1FX1RSSUdfVFlQRV9FWFRfRElHSVRBTCkKKwl7CisJCSppbnN0YW5jZS0+cHJlbG9hZF9mbGFncyB8PQorCQkgICAgTUU0NjAwX0FPX1NZTkNfRVhUX1RSSUcgPDwgaW5zdGFuY2UtPmFvX2lkeDsKKwl9CisKKwlpZiAodHJpZ19jaGFuID09IE1FX1RSSUdfQ0hBTl9ERUZBVUxUKSB7CisJCSppbnN0YW5jZS0+cHJlbG9hZF9mbGFncyAmPQorCQkgICAgfihNRTQ2MDBfQU9fU1lOQ19IT0xEIDw8IGluc3RhbmNlLT5hb19pZHgpOworCX0gZWxzZQkJCS8vaWYgKHRyaWdfY2hhbiA9PSBNRV9UUklHX0NIQU5fU1lOQ0hST05PVVMpCisJeworCQkqaW5zdGFuY2UtPnByZWxvYWRfZmxhZ3MgfD0KKwkJICAgIE1FNDYwMF9BT19TWU5DX0hPTEQgPDwgaW5zdGFuY2UtPmFvX2lkeDsKKwl9CisKKwkvL1Jlc2V0IGhhcmR3YXJlIHJlZ2lzdGVyCisJc3luYyA9IGlubChpbnN0YW5jZS0+cHJlbG9hZF9yZWcpOworCVBERUJVR19SRUcoInByZWxvYWRfcmVnIGlubCgweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+cHJlbG9hZF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIHN5bmMpOworCXN5bmMgJj0gfihNRTQ2MDBfQU9fU1lOQ19FWFRfVFJJRyA8PCBpbnN0YW5jZS0+YW9faWR4KTsKKwlzeW5jIHw9IE1FNDYwMF9BT19TWU5DX0hPTEQgPDwgaW5zdGFuY2UtPmFvX2lkeDsKKworCS8vT3V0cHV0IGNvbmZpZ3VyZWQgaW4gZGVmYXVsdCAoc2FmZSkgbW9kZS4KKwlvdXRsKHN5bmMsIGluc3RhbmNlLT5wcmVsb2FkX3JlZyk7CisJUERFQlVHX1JFRygicHJlbG9hZF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+cHJlbG9hZF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIHN5bmMpOworCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5wcmVsb2FkX3JlZ19sb2NrKTsKKworCWluc3RhbmNlLT5zdGF0dXMgPSBhb19zdGF0dXNfc2luZ2xlX2NvbmZpZ3VyZWQ7CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWU0NjAwX2FvX2lvX3NpbmdsZV9yZWFkKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgIGludCBjaGFubmVsLAorCQkJCSAgICBpbnQgKnZhbHVlLCBpbnQgdGltZV9vdXQsIGludCBmbGFncykKK3sKKwltZTQ2MDBfYW9fc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCisJdW5zaWduZWQgbG9uZyBqOworCXVuc2lnbmVkIGxvbmcgZGVsYXkgPSAwOworCisJaW5zdGFuY2UgPSAobWU0NjAwX2FvX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCVBERUJVRygiZXhlY3V0ZWQuIGlkeD0lZFxuIiwgaW5zdGFuY2UtPmFvX2lkeCk7CisKKwlpZiAoZmxhZ3MgJiB+TUVfSU9fU0lOR0xFX05PTkJMT0NLSU5HKSB7CisJCVBFUlJPUigiSW52YWxpZCBmbGFnIHNwZWNpZmllZC4gJWRcbiIsIGZsYWdzKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJfQorCisJaWYgKHRpbWVfb3V0IDwgMCkgeworCQlQRVJST1IoIkludmFsaWQgdGltZW91dCBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfVElNRU9VVDsKKwl9CisKKwlpZiAoY2hhbm5lbCAhPSAwKSB7CisJCVBFUlJPUigiSW52YWxpZCBjaGFubmVsIG51bWJlciBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwl9CisKKwlpZiAoKGluc3RhbmNlLT5zdGF0dXMgPj0gYW9fc3RhdHVzX3N0cmVhbV9jb25maWd1cmVkKQorCSAgICAmJiAoaW5zdGFuY2UtPnN0YXR1cyA8PSBhb19zdGF0dXNfc3RyZWFtX2VuZCkpIHsKKwkJUEVSUk9SKCJTdWJkZXZpY2Ugbm90IGNvbmZpZ3VyZWQgdG8gd29yayBpbiBzaW5nbGUgbW9kZSFcbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fUFJFVklPVVNfQ09ORklHOworCX0KKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKwlpZiAoKCFmbGFncykgJiYgKGluc3RhbmNlLT5zdGF0dXMgPT0gYW9fc3RhdHVzX3NpbmdsZV9ydW5fd2FpdCkpIHsJLy9CbG9ja2luZyBtb2RlLiBXYWl0IGZvciB0cmlnZ2VyLgorCQlpZiAodGltZV9vdXQpIHsKKwkJCWRlbGF5ID0gKHRpbWVfb3V0ICogSFopIC8gMTAwMDsKKwkJCWlmIChkZWxheSA9PSAwKQorCQkJCWRlbGF5ID0gMTsKKwkJfQorCisJCWogPSBqaWZmaWVzOworCisJCS8vT25seSBydW5pbmcgcHJvY2VzcyB3aWxsIGludGVycnVwdCB0aGlzIGNhbGwuIEV2ZW50cyBhcmUgc2lnbmFsZWQgd2hlbiBzdGF0dXMgY2hhbmdlLiBUaGlzIHByb2NlZHVyZSBoYXMgb3duIHRpbWVvdXQuCisJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KGluc3RhbmNlLT53YWl0X3F1ZXVlLAorCQkJCQkJIChpbnN0YW5jZS0+c3RhdHVzICE9CisJCQkJCQkgIGFvX3N0YXR1c19zaW5nbGVfcnVuX3dhaXQpLAorCQkJCQkJIChkZWxheSkgPyBkZWxheSArCisJCQkJCQkgMSA6IExPTkdfTUFYKTsKKworCQlpZiAoaW5zdGFuY2UtPnN0YXR1cyA9PSBhb19zdGF0dXNfbm9uZSkgeworCQkJUERFQlVHKCJTaW5nbGUgY2FuY2VsZWQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0NBTkNFTExFRDsKKwkJfQorCisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJUEVSUk9SKCJXYWl0IG9uIHN0YXJ0IG9mIHN0YXRlIG1hY2hpbmUgaW50ZXJydXB0ZWQuXG4iKTsKKwkJCWluc3RhbmNlLT5zdGF0dXMgPSBhb19zdGF0dXNfbm9uZTsKKwkJCWFvX3N0b3BfaW1tZWRpYXRlbHkoaW5zdGFuY2UpOworCQkJZXJyID0gTUVfRVJSTk9fU0lHTkFMOworCQl9CisKKwkJaWYgKChkZWxheSkgJiYgKChqaWZmaWVzIC0gaikgPj0gZGVsYXkpKSB7CisKKwkJCVBERUJVRygiVGltZW91dCByZWFjaGVkLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19USU1FT1VUOworCQl9CisKKwkJKnZhbHVlID0KKwkJICAgICghZXJyKSA/IGluc3RhbmNlLT5zaW5nbGVfdmFsdWVfaW5fZmlmbyA6IGluc3RhbmNlLT4KKwkJICAgIHNpbmdsZV92YWx1ZTsKKwl9IGVsc2UgewkJLy9Ob24tYmxvY2tpbmcgbW9kZQorCQkvL1JlYWQgdmFsdWUKKwkJKnZhbHVlID0gaW5zdGFuY2UtPnNpbmdsZV92YWx1ZTsKKwl9CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWU0NjAwX2FvX2lvX3NpbmdsZV93cml0ZShtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgIGludCBjaGFubmVsLAorCQkJCSAgICAgaW50IHZhbHVlLCBpbnQgdGltZV9vdXQsIGludCBmbGFncykKK3sKKwltZTQ2MDBfYW9fc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCXVuc2lnbmVkIGxvbmcgY3B1X2ZsYWdzOworCXVuc2lnbmVkIGxvbmcgajsKKwl1bnNpZ25lZCBsb25nIGRlbGF5ID0gMHgwOworCisJLy9SZWdpc3RyeSBoYW5kbGluZyB2YXJpYWJsZXMuCisJdWludDMyX3Qgc3luY19tYXNrOworCXVpbnQzMl90IG1vZGU7CisJdWludDMyX3QgdG1wOworCXVpbnQzMl90IGN0cmw7CisJdWludDMyX3Qgc3RhdHVzOworCisJaW5zdGFuY2UgPSAobWU0NjAwX2FvX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCVBERUJVRygiZXhlY3V0ZWQuIGlkeD0lZFxuIiwgaW5zdGFuY2UtPmFvX2lkeCk7CisKKwlpZiAoZmxhZ3MgJgorCSAgICB+KE1FX0lPX1NJTkdMRV9UWVBFX1RSSUdfU1lOQ0hST05PVVMgfAorCSAgICAgIE1FX0lPX1NJTkdMRV9UWVBFX1dSSVRFX05PTkJMT0NLSU5HKSkgeworCQlQRVJST1IoIkludmFsaWQgZmxhZyBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJfQorCisJaWYgKHRpbWVfb3V0IDwgMCkgeworCQlQRVJST1IoIkludmFsaWQgdGltZW91dCBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfVElNRU9VVDsKKwl9CisKKwlpZiAodmFsdWUgJiB+TUU0NjAwX0FPX01BWF9EQVRBKSB7CisJCVBFUlJPUigiSW52YWxpZCB2YWx1ZSBwcm92aWRlZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fVkFMVUVfT1VUX09GX1JBTkdFOworCX0KKworCWlmIChjaGFubmVsICE9IDApIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGNoYW5uZWwgbnVtYmVyIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCX0KKworCWlmICgoaW5zdGFuY2UtPnN0YXR1cyA9PSBhb19zdGF0dXNfbm9uZSkKKwkgICAgfHwgKGluc3RhbmNlLT5zdGF0dXMgPiBhb19zdGF0dXNfc2luZ2xlX2VuZCkpIHsKKwkJUEVSUk9SKCJTdWJkZXZpY2Ugbm90IGNvbmZpZ3VyZWQgdG8gd29yayBpbiBzaW5nbGUgbW9kZSFcbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fUFJFVklPVVNfQ09ORklHOworCX0KKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworLy8vIEBub3RlIEZvciBzaW5nbGUgYWxsIGNhbGxzIChjb25maWcgYW5kIHdyaXRlKSBhcmUgZXJhc2luZyBwcmV2aW91cyBzdGF0ZSEKKworCS8vQ2FuY2VsIGNvbnRyb2wgdGFzaworCVBERUJVRygiQ2FuY2VsIGNvbnRyb2wgdGFzay4gaWR4PSVkXG4iLCBpbnN0YW5jZS0+YW9faWR4KTsKKwlpbnN0YW5jZS0+YW9fY29udHJvbF90YXNrX2ZsYWcgPSAwOworCWNhbmNlbF9kZWxheWVkX3dvcmsoJmluc3RhbmNlLT5hb19jb250cm9sX3Rhc2spOworCisJLy8gQ29ycmVjdCBzaW5nbGUgbWlycm9ycworCWluc3RhbmNlLT5zaW5nbGVfdmFsdWVfaW5fZmlmbyA9IGluc3RhbmNlLT5zaW5nbGVfdmFsdWU7CisKKwkvL1N0b3AgZGV2aWNlCisJZXJyID0gYW9fc3RvcF9pbW1lZGlhdGVseShpbnN0YW5jZSk7CisJaWYgKGVycikgeworCQlQRVJST1JfQ1JJVElDQUwoIkZTTSBJUyBCVVNZIVxuIik7CisJCU1FX1NVQkRFVklDRV9FWElUOworCisJCXJldHVybiBNRV9FUlJOT19TVUJERVZJQ0VfQlVTWTsKKwl9CisKKwlpZiAodGltZV9vdXQpIHsKKwkJZGVsYXkgPSAodGltZV9vdXQgKiBIWikgLyAxMDAwOworCisJCWlmIChkZWxheSA9PSAwKQorCQkJZGVsYXkgPSAxOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisKKwlpbnN0YW5jZS0+c2luZ2xlX3ZhbHVlX2luX2ZpZm8gPSB2YWx1ZTsKKworCWN0cmwgPSBpbmwoaW5zdGFuY2UtPmN0cmxfcmVnKTsKKworCWlmICghaW5zdGFuY2UtPmZpZm8pIHsJLy9ObyBGSUZPCisJCS8vU2V0IHRoZSBzaW5nbGUgbW9kZS4KKwkJY3RybCAmPSB+TUU0NjAwX0FPX0NUUkxfTU9ERV9NQVNLOworCisJCS8vV3JpdGUgdmFsdWUKKwkJUERFQlVHKCJXcml0ZSB2YWx1ZVxuIik7CisJCW91dGwodmFsdWUsIGluc3RhbmNlLT5zaW5nbGVfcmVnKTsKKwkJUERFQlVHX1JFRygic2luZ2xlX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPnNpbmdsZV9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIHZhbHVlKTsKKwl9IGVsc2UgewkJLy8gbWl4LW1vZGUKKwkJLy9TZXQgc3BlZWQKKwkJb3V0bChNRTQ2MDBfQU9fTUlOX0NIQU5fVElDS1MgLSAxLCBpbnN0YW5jZS0+dGltZXJfcmVnKTsKKwkJUERFQlVHX1JFRygidGltZXJfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkgICBpbnN0YW5jZS0+dGltZXJfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgKGludClNRTQ2MDBfQU9fTUlOX0NIQU5fVElDS1MpOworCQlpbnN0YW5jZS0+aGFyZHdhcmVfc3RvcF9kZWxheSA9IEhaIC8gMTA7CS8vMTAwbXMKKworCQlzdGF0dXMgPSBpbmwoaW5zdGFuY2UtPnN0YXR1c19yZWcpOworCisJCS8vU2V0IHRoZSBjb250aW5vdXMgbW9kZS4KKwkJY3RybCAmPSB+TUU0NjAwX0FPX0NUUkxfTU9ERV9NQVNLOworCQljdHJsIHw9IE1FNDYwMF9BT19NT0RFX0NPTlRJTlVPVVM7CisKKwkJLy9QcmVwYXJlIEZJRk8KKwkJaWYgKCEoY3RybCAmIE1FNDYwMF9BT19DVFJMX0JJVF9FTkFCTEVfRklGTykpIHsJLy9GSUZPIHdhc24ndCBlbmFiZWxlZC4gRG8gaXQuCisJCQlQSU5GTygiRW5hYmxlaW5nIEZJRk8uXG4iKTsKKwkJCWN0cmwgJj0gfk1FNDYwMF9BT19DVFJMX0JJVF9FTkFCTEVfSVJROworCQkJY3RybCB8PQorCQkJICAgIE1FNDYwMF9BT19DVFJMX0JJVF9FTkFCTEVfRklGTyB8CisJCQkgICAgTUU0NjAwX0FPX0NUUkxfQklUX1JFU0VUX0lSUTsKKwkJfSBlbHNlIHsJLy9DaGVjayBpZiBGSUZPIGlzIGVtcHR5CisJCQlpZiAoc3RhdHVzICYgTUU0NjAwX0FPX1NUQVRVU19CSVRfRUYpIHsJLy9GSUZPIG5vdCBlbXB0eQorCQkJCVBJTkZPKCJSZXNldGluZyBGSUZPLlxuIik7CisJCQkJY3RybCAmPQorCQkJCSAgICB+KE1FNDYwMF9BT19DVFJMX0JJVF9FTkFCTEVfRklGTyB8CisJCQkJICAgICAgTUU0NjAwX0FPX0NUUkxfQklUX0VOQUJMRV9JUlEpOworCQkJCWN0cmwgfD0gTUU0NjAwX0FPX0NUUkxfQklUX1JFU0VUX0lSUTsKKwkJCQlvdXRsKGN0cmwsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCQkJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLQorCQkJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsIGN0cmwpOworCisJCQkJY3RybCB8PQorCQkJCSAgICBNRTQ2MDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0ZJRk8gfAorCQkJCSAgICBNRTQ2MDBfQU9fQ1RSTF9CSVRfUkVTRVRfSVJROworCQkJfSBlbHNlIHsJLy9GSUZPIGVtcHR5LCBvbmx5IGludGVycnVwdCBuZWVkcyB0byBiZSBkaXNhYmxlZCEKKwkJCQljdHJsICY9IH5NRTQ2MDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0lSUTsKKwkJCQljdHJsIHw9IE1FNDYwMF9BT19DVFJMX0JJVF9SRVNFVF9JUlE7CisJCQl9CisJCX0KKworCQlvdXRsKGN0cmwsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIGN0cmwpOworCisJCS8vV3JpdGUgb3V0cHV0IC0gMSB2YWx1ZSB0byBGSUZPCisJCWlmIChpbnN0YW5jZS0+YW9faWR4ICYgMHgxKSB7CisJCQlvdXRsKHZhbHVlIDw8PSAxNiwgaW5zdGFuY2UtPmZpZm9fcmVnKTsKKwkJCVBERUJVR19SRUcoImZpZm9fcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIGluc3RhbmNlLT5maWZvX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICB2YWx1ZSA8PD0gMTYpOworCQl9IGVsc2UgeworCQkJb3V0bCh2YWx1ZSwgaW5zdGFuY2UtPmZpZm9fcmVnKTsKKwkJCVBERUJVR19SRUcoImZpZm9fcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIGluc3RhbmNlLT5maWZvX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICB2YWx1ZSk7CisJCX0KKwl9CisKKwltb2RlID0gKmluc3RhbmNlLT5wcmVsb2FkX2ZsYWdzID4+IGluc3RhbmNlLT5hb19pZHg7CisJbW9kZSAmPSAoTUU0NjAwX0FPX1NZTkNfSE9MRCB8IE1FNDYwMF9BT19TWU5DX0VYVF9UUklHKTsKKworCVBJTkZPKCJUcmlnZ2VyaW5nIG1vZGU6IDB4JXhcbiIsIG1vZGUpOworCisJc3Bpbl9sb2NrKGluc3RhbmNlLT5wcmVsb2FkX3JlZ19sb2NrKTsKKwlzeW5jX21hc2sgPSBpbmwoaW5zdGFuY2UtPnByZWxvYWRfcmVnKTsKKwlQREVCVUdfUkVHKCJwcmVsb2FkX3JlZyBpbmwoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPnByZWxvYWRfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCBzeW5jX21hc2spOworCXN3aXRjaCAobW9kZSkgeworCWNhc2UgMDoJCS8vSW5kaXZpZHVhbCBzb2Z0d2FyZQorCQljdHJsICY9IH5NRTQ2MDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0VYX1RSSUc7CisKKwkJaWYgKCFpbnN0YW5jZS0+ZmlmbykgewkvLyBObyBGSUZPIC0gSW4gdGhpcyBjYXNlIHJlc2V0dGluZyAnTUU0NjAwX0FPX1NZTkNfSE9MRCcgd2lsbCB0cmlnZ2VyIG91dHB1dC4KKwkJCWlmICgoc3luY19tYXNrICYgKChNRTQ2MDBfQU9fU1lOQ19IT0xEIHwgTUU0NjAwX0FPX1NZTkNfRVhUX1RSSUcpIDw8IGluc3RhbmNlLT5hb19pZHgpKSAhPSBNRTQ2MDBfQU9fU1lOQ19IT0xEKSB7CS8vTm93IHdlIGNhbiBzZXQgY29ycmVjdCBtb2RlLiBUaGlzIGlzIGV4Y2VwdGlvbi4gSXQgaXMgc2V0IHRvIHN5bmNocm9ub3VzIGFuZCB0cmlnZ2VyZWQgbGF0ZXIuCisJCQkJc3luY19tYXNrICY9CisJCQkJICAgIH4oTUU0NjAwX0FPX1NZTkNfRVhUX1RSSUcgPDwgaW5zdGFuY2UtPgorCQkJCSAgICAgIGFvX2lkeCk7CisJCQkJc3luY19tYXNrIHw9CisJCQkJICAgIE1FNDYwMF9BT19TWU5DX0hPTEQgPDwgaW5zdGFuY2UtPmFvX2lkeDsKKworCQkJCW91dGwoc3luY19tYXNrLCBpbnN0YW5jZS0+cHJlbG9hZF9yZWcpOworCQkJCVBERUJVR19SRUcKKwkJCQkgICAgKCJwcmVsb2FkX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJCSAgICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgICAgaW5zdGFuY2UtPnByZWxvYWRfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgICAgc3luY19tYXNrKTsKKwkJCX0KKwkJfSBlbHNlIHsJLy8gRklGTworCQkJaWYgKChzeW5jX21hc2sgJiAoKE1FNDYwMF9BT19TWU5DX0hPTEQgfCBNRTQ2MDBfQU9fU1lOQ19FWFRfVFJJRykgPDwgaW5zdGFuY2UtPmFvX2lkeCkpICE9IDB4MCkgewkvL05vdyB3ZSBjYW4gc2V0IGNvcnJlY3QgbW9kZS4KKwkJCQlzeW5jX21hc2sgJj0KKwkJCQkgICAgfigoTUU0NjAwX0FPX1NZTkNfRVhUX1RSSUcgfAorCQkJCSAgICAgICBNRTQ2MDBfQU9fU1lOQ19IT0xEKSA8PCBpbnN0YW5jZS0+CisJCQkJICAgICAgYW9faWR4KTsKKworCQkJCW91dGwoc3luY19tYXNrLCBpbnN0YW5jZS0+cHJlbG9hZF9yZWcpOworCQkJCVBERUJVR19SRUcKKwkJCQkgICAgKCJwcmVsb2FkX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJCSAgICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgICAgaW5zdGFuY2UtPnByZWxvYWRfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgICAgc3luY19tYXNrKTsKKwkJCX0KKwkJfQorCQlpbnN0YW5jZS0+c2luZ2xlX3ZhbHVlID0gdmFsdWU7CisJCWJyZWFrOworCisJY2FzZSBNRTQ2MDBfQU9fU1lOQ19FWFRfVFJJRzoJLy9JbmRpdmlkdWFsIGhhcmR3YXJlCisJCWN0cmwgfD0gTUU0NjAwX0FPX0NUUkxfQklUX0VOQUJMRV9FWF9UUklHOworCisJCWlmICghaW5zdGFuY2UtPmZpZm8pIHsJLy8gTm8gRklGTyAtIEluIHRoaXMgY2FzZSByZXNldHRpbmcgJ01FNDYwMF9BT19TWU5DX0hPTEQnIHdpbGwgdHJpZ2dlciBvdXRwdXQuCisJCQlpZiAoKHN5bmNfbWFzayAmICgoTUU0NjAwX0FPX1NZTkNfSE9MRCB8IE1FNDYwMF9BT19TWU5DX0VYVF9UUklHKSA8PCBpbnN0YW5jZS0+YW9faWR4KSkgIT0gTUU0NjAwX0FPX1NZTkNfSE9MRCkgewkvL05vdyB3ZSBjYW4gc2V0IGNvcnJlY3QgbW9kZQorCQkJCXN5bmNfbWFzayAmPQorCQkJCSAgICB+KE1FNDYwMF9BT19TWU5DX0VYVF9UUklHIDw8IGluc3RhbmNlLT4KKwkJCQkgICAgICBhb19pZHgpOworCQkJCXN5bmNfbWFzayB8PQorCQkJCSAgICBNRTQ2MDBfQU9fU1lOQ19IT0xEIDw8IGluc3RhbmNlLT5hb19pZHg7CisKKwkJCQlvdXRsKHN5bmNfbWFzaywgaW5zdGFuY2UtPnByZWxvYWRfcmVnKTsKKwkJCQlQREVCVUdfUkVHCisJCQkJICAgICgicHJlbG9hZF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCQkgICAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICAgIGluc3RhbmNlLT5wcmVsb2FkX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICAgIHN5bmNfbWFzayk7CisJCQl9CisJCX0gZWxzZSB7CS8vIEZJRk8KKwkJCWlmICgoc3luY19tYXNrICYgKChNRTQ2MDBfQU9fU1lOQ19IT0xEIHwgTUU0NjAwX0FPX1NZTkNfRVhUX1RSSUcpIDw8IGluc3RhbmNlLT5hb19pZHgpKSAhPSAweDApIHsJLy9Ob3cgd2UgY2FuIHNldCBjb3JyZWN0IG1vZGUuCisJCQkJc3luY19tYXNrICY9CisJCQkJICAgIH4oKE1FNDYwMF9BT19TWU5DX0VYVF9UUklHIHwKKwkJCQkgICAgICAgTUU0NjAwX0FPX1NZTkNfSE9MRCkgPDwgaW5zdGFuY2UtPgorCQkJCSAgICAgIGFvX2lkeCk7CisKKwkJCQlvdXRsKHN5bmNfbWFzaywgaW5zdGFuY2UtPnByZWxvYWRfcmVnKTsKKwkJCQlQREVCVUdfUkVHCisJCQkJICAgICgicHJlbG9hZF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCQkgICAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICAgIGluc3RhbmNlLT5wcmVsb2FkX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICAgIHN5bmNfbWFzayk7CisJCQl9CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIE1FNDYwMF9BT19TWU5DX0hPTEQ6CS8vU3luY2hyb25vdXMgc29mdHdhcmUKKwkJY3RybCAmPSB+TUU0NjAwX0FPX0NUUkxfQklUX0VOQUJMRV9FWF9UUklHOworCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoKHN5bmNfbWFzayAmICgoTUU0NjAwX0FPX1NZTkNfSE9MRCB8IE1FNDYwMF9BT19TWU5DX0VYVF9UUklHKSA8PCBpbnN0YW5jZS0+YW9faWR4KSkgIT0gTUU0NjAwX0FPX1NZTkNfSE9MRCkKKwkJaWYgKChzeW5jX21hc2sgJiAoKE1FNDYwMF9BT19TWU5DX0hPTEQgfCBNRTQ2MDBfQU9fU1lOQ19FWFRfVFJJRykgPDwgaW5zdGFuY2UtPmFvX2lkeCkpICE9IChNRTQ2MDBfQU9fU1lOQ19IT0xEIHwgTUU0NjAwX0FPX1NZTkNfRVhUX1RSSUcpKSB7CS8vTm93IHdlIGNhbiBzZXQgY29ycmVjdCBtb2RlCisJCQlzeW5jX21hc2sgfD0KKwkJCSAgICBNRTQ2MDBfQU9fU1lOQ19FWFRfVFJJRyA8PCBpbnN0YW5jZS0+YW9faWR4OworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3luY19tYXNrICY9IH4oTUU0NjAwX0FPX1NZTkNfRVhUX1RSSUcgPDwgaW5zdGFuY2UtPmFvX2lkeCk7CisJCQlzeW5jX21hc2sgfD0gTUU0NjAwX0FPX1NZTkNfSE9MRCA8PCBpbnN0YW5jZS0+YW9faWR4OworCisJCQlvdXRsKHN5bmNfbWFzaywgaW5zdGFuY2UtPnByZWxvYWRfcmVnKTsKKwkJCVBERUJVR19SRUcoInByZWxvYWRfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIGluc3RhbmNlLT5wcmVsb2FkX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICBzeW5jX21hc2spOworCQl9CisJCWJyZWFrOworCisJY2FzZSAoTUU0NjAwX0FPX1NZTkNfSE9MRCB8IE1FNDYwMF9BT19TWU5DX0VYVF9UUklHKToJLy9TeW5jaHJvbm91cyBoYXJkd2FyZQorCQljdHJsIHw9IE1FNDYwMF9BT19DVFJMX0JJVF9FTkFCTEVfRVhfVFJJRzsKKwkJaWYgKChzeW5jX21hc2sgJiAoKE1FNDYwMF9BT19TWU5DX0hPTEQgfCBNRTQ2MDBfQU9fU1lOQ19FWFRfVFJJRykgPDwgaW5zdGFuY2UtPmFvX2lkeCkpICE9IChNRTQ2MDBfQU9fU1lOQ19IT0xEIHwgTUU0NjAwX0FPX1NZTkNfRVhUX1RSSUcpKSB7CS8vTm93IHdlIGNhbiBzZXQgY29ycmVjdCBtb2RlCisJCQlzeW5jX21hc2sgfD0KKwkJCSAgICAoTUU0NjAwX0FPX1NZTkNfSE9MRCB8IE1FNDYwMF9BT19TWU5DX0VYVF9UUklHKSA8PAorCQkJICAgIGluc3RhbmNlLT5hb19pZHg7CisKKwkJCW91dGwoc3luY19tYXNrLCBpbnN0YW5jZS0+cHJlbG9hZF9yZWcpOworCQkJUERFQlVHX1JFRygicHJlbG9hZF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgaW5zdGFuY2UtPnByZWxvYWRfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIHN5bmNfbWFzayk7CisJCX0KKwkJYnJlYWs7CisJfQorLy8gICAgICAgICAgICAgIHNwaW5fdW5sb2NrKGluc3RhbmNlLT5wcmVsb2FkX3JlZ19sb2NrKTsgICAgICAgIC8vIE1vdmVkIGRvd24uCisKKwkvL0FjdGl2YXRlIElTTSAocmVtb3ZlICdzdG9wJyBiaXRzKQorCWN0cmwgJj0KKwkgICAgfihNRTQ2MDBfQU9fQ1RSTF9CSVRfRVhfVFJJR19FREdFIHwKKwkgICAgICBNRTQ2MDBfQU9fQ1RSTF9CSVRfRVhfVFJJR19FREdFX0JPVEgpOworCWN0cmwgfD0gaW5zdGFuY2UtPmN0cmxfdHJnOworCWN0cmwgJj0gfihNRTQ2MDBfQU9fQ1RSTF9CSVRfU1RPUCB8IE1FNDYwMF9BT19DVFJMX0JJVF9JTU1FRElBVEVfU1RPUCk7CisJb3V0bChjdHJsLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCBjdHJsKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisKKy8vLyBAbm90ZSBXaGVuIGZsYWcgJ01FX0lPX1NJTkdMRV9UWVBFX1RSSUdfU1lOQ0hST05PVVMnIGlzIHNldCB0aGFuIG91dHB1dCBpcyB0cmlnZ2VyZWQuIEFMV0FZUyEKKworCWlmICghaW5zdGFuY2UtPmZpZm8pIHsJLy9ObyBGSUZPCisJCWlmIChmbGFncyAmIE1FX0lPX1NJTkdMRV9UWVBFX1RSSUdfU1lOQ0hST05PVVMpIHsJLy9GaXJlZCBhbGwgc29mdHdhcmUgc3luY2hyb25vdXMgb3V0cHV0cy4KKwkJCXRtcCA9IH4oKmluc3RhbmNlLT5wcmVsb2FkX2ZsYWdzIHwgMHhGRkZGMDAwMCk7CisJCQlQSU5GTworCQkJICAgICgiRmlyZWQgYWxsIHNvZnR3YXJlIHN5bmNocm9ub3VzIG91dHB1dHMuIG1hc2s6MHglMDh4XG4iLAorCQkJICAgICB0bXApOworCQkJdG1wIHw9IHN5bmNfbWFzayAmIDB4RkZGRjAwMDA7CisJCQkvLyBBZGQgdGhpcyBjaGFubmVsIHRvIGxpc3QKKwkJCXRtcCAmPSB+KE1FNDYwMF9BT19TWU5DX0hPTEQgPDwgaW5zdGFuY2UtPmFvX2lkeCk7CisKKwkJCS8vRmlyZQorCQkJUElORk8oIlNvZnR3YXJlIHRyaWdnZXIuXG4iKTsKKwkJCW91dGwodG1wLCBpbnN0YW5jZS0+cHJlbG9hZF9yZWcpOworCQkJUERFQlVHX1JFRygicHJlbG9hZF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgaW5zdGFuY2UtPnByZWxvYWRfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIHRtcCk7CisKKwkJCS8vUmVzdG9yZSBzYXZlIHNldHRpbmdzCisJCQlvdXRsKHN5bmNfbWFzaywgaW5zdGFuY2UtPnByZWxvYWRfcmVnKTsKKwkJCVBERUJVR19SRUcoInByZWxvYWRfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIGluc3RhbmNlLT5wcmVsb2FkX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICBzeW5jX21hc2spOworCQl9IGVsc2UgaWYgKCFtb2RlKSB7CS8vIEFkZCB0aGlzIGNoYW5uZWwgdG8gbGlzdAorCQkJb3V0bChzeW5jX21hc2sgJgorCQkJICAgICB+KE1FNDYwMF9BT19TWU5DX0hPTEQgPDwgaW5zdGFuY2UtPmFvX2lkeCksCisJCQkgICAgIGluc3RhbmNlLT5wcmVsb2FkX3JlZyk7CisJCQlQREVCVUdfUkVHKCJwcmVsb2FkX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICBpbnN0YW5jZS0+cHJlbG9hZF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgc3luY19tYXNrICYgfihNRTQ2MDBfQU9fU1lOQ19IT0xEIDw8CisJCQkJCQkgaW5zdGFuY2UtPmFvX2lkeCkpOworCisJCQkvL0ZpcmUKKwkJCVBJTkZPKCJTb2Z0d2FyZSB0cmlnZ2VyLlxuIik7CisKKwkJCS8vUmVzdG9yZSBzYXZlIHNldHRpbmdzCisJCQlvdXRsKHN5bmNfbWFzaywgaW5zdGFuY2UtPnByZWxvYWRfcmVnKTsKKwkJCVBERUJVR19SRUcoInByZWxvYWRfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIGluc3RhbmNlLT5wcmVsb2FkX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICBzeW5jX21hc2spOworCQl9CisKKwl9IGVsc2UgewkJLy8gbWl4LW1vZGUgLSBiZWdpbgorCQlpZiAoZmxhZ3MgJiBNRV9JT19TSU5HTEVfVFlQRV9UUklHX1NZTkNIUk9OT1VTKSB7CS8vVHJpZ2dlciBvdXRwdXRzCisJCQkvL0FkZCBjaGFubmVsIHRvIHN0YXJ0IGxpc3QKKwkJCW91dGwoc3luY19tYXNrIHwKKwkJCSAgICAgKE1FNDYwMF9BT19TWU5DX0hPTEQgPDwgaW5zdGFuY2UtPmFvX2lkeCksCisJCQkgICAgIGluc3RhbmNlLT5wcmVsb2FkX3JlZyk7CisJCQlQREVCVUdfUkVHKCJwcmVsb2FkX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICBpbnN0YW5jZS0+cHJlbG9hZF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgc3luY19tYXNrIHwgKE1FNDYwMF9BT19TWU5DX0hPTEQgPDwKKwkJCQkJCWluc3RhbmNlLT5hb19pZHgpKTsKKworCQkJLy9GaXJlCisJCQlQSU5GTworCQkJICAgICgiRmlyZWQgYWxsIHNvZnR3YXJlIHN5bmNocm9ub3VzIG91dHB1dHMgYnkgc29mdHdhcmUgdHJpZ2dlci5cbiIpOworCQkJb3V0bCgweDgwMDAsIGluc3RhbmNlLT5zaW5nbGVfcmVnKTsKKwkJCVBERUJVR19SRUcoInNpbmdsZV9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgaW5zdGFuY2UtPnNpbmdsZV9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgMHg4MDAwKTsKKworCQkJLy9SZXN0b3JlIHNhdmUgc2V0dGluZ3MKKwkJCW91dGwoc3luY19tYXNrLCBpbnN0YW5jZS0+cHJlbG9hZF9yZWcpOworCQkJUERFQlVHX1JFRygicHJlbG9hZF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgaW5zdGFuY2UtPnByZWxvYWRfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIHN5bmNfbWFzayk7CisJCX0gZWxzZSBpZiAoIW1vZGUpIHsJLy9UcmlnZ2VyIG91dHB1dHMKKy8qCQkJLy9SZW1vdmUgY2hhbm5lbCBmcm9tIHN0YXJ0IGxpc3QgLy88PT0gVW5uZWNlc3NhcnkuIFJlbW92ZWQuCisJCQlvdXRsKHN5bmNfbWFzayAmIH4oTUU0NjAwX0FPX1NZTkNfSE9MRCA8PCBpbnN0YW5jZS0+YW9faWR4KSwgaW5zdGFuY2UtPnByZWxvYWRfcmVnKTsKKwkJCVBERUJVR19SRUcoInByZWxvYWRfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwgaW5zdGFuY2UtPnByZWxvYWRfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCB0bXApOworKi8KKwkJCS8vRmlyZQorCQkJUElORk8oIlNvZnR3YXJlIHRyaWdnZXIuXG4iKTsKKwkJCW91dGwoMHg4MDAwLCBpbnN0YW5jZS0+c2luZ2xlX3JlZyk7CisJCQlQREVCVUdfUkVHKCJzaW5nbGVfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIGluc3RhbmNlLT5zaW5nbGVfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIDB4ODAwMCk7CisKKy8qCQkJLy9SZXN0b3JlIHNhdmUgc2V0dGluZ3MgLy88PT0gVW5uZWNlc3NhcnkuIFJlbW92ZWQuCisJCQlvdXRsKHN5bmNfbWFzaywgaW5zdGFuY2UtPnByZWxvYWRfcmVnKTsKKwkJCVBERUJVR19SRUcoInByZWxvYWRfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwgaW5zdGFuY2UtPnByZWxvYWRfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCBzeW5jX21hc2spOworKi8KKwkJfQorCX0KKwlzcGluX3VubG9jayhpbnN0YW5jZS0+cHJlbG9hZF9yZWdfbG9jayk7CisKKwlqID0gamlmZmllczsKKwlpbnN0YW5jZS0+c3RhdHVzID0gYW9fc3RhdHVzX3NpbmdsZV9ydW5fd2FpdDsKKworCWluc3RhbmNlLT50aW1lb3V0LmRlbGF5ID0gZGVsYXk7CisJaW5zdGFuY2UtPnRpbWVvdXQuc3RhcnRfdGltZSA9IGo7CisJaW5zdGFuY2UtPmFvX2NvbnRyb2xfdGFza19mbGFnID0gMTsKKwlxdWV1ZV9kZWxheWVkX3dvcmsoaW5zdGFuY2UtPm1lNDYwMF93b3JrcXVldWUsCisJCQkgICAmaW5zdGFuY2UtPmFvX2NvbnRyb2xfdGFzaywgMSk7CisKKwlpZiAoIShmbGFncyAmIE1FX0lPX1NJTkdMRV9UWVBFX1dSSVRFX05PTkJMT0NLSU5HKSkgeworCisJCS8vT25seSBydW5pbmcgcHJvY2VzcyB3aWxsIGludGVycnVwdCB0aGlzIGNhbGwuIEV2ZW50cyBhcmUgc2lnbmFsZWQgd2hlbiBzdGF0dXMgY2hhbmdlLiBFeHRyYSB0aW1lb3V0IGFkZCBmb3Igc2FmZSByZWFzb24uCisJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KGluc3RhbmNlLT53YWl0X3F1ZXVlLAorCQkJCQkJIChpbnN0YW5jZS0+c3RhdHVzICE9CisJCQkJCQkgIGFvX3N0YXR1c19zaW5nbGVfcnVuX3dhaXQpLAorCQkJCQkJIChkZWxheSkgPyBkZWxheSArCisJCQkJCQkgMSA6IExPTkdfTUFYKTsKKworCQlpZiAoKCghZGVsYXkpIHx8ICgoamlmZmllcyAtIGopIDw9IGRlbGF5KSkKKwkJICAgICYmIChpbnN0YW5jZS0+c3RhdHVzICE9IGFvX3N0YXR1c19zaW5nbGVfZW5kKSkgeworCQkJUERFQlVHKCJTaW5nbGUgY2FuY2VsZWQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0NBTkNFTExFRDsKKwkJfQorCisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJUEVSUk9SKCJXYWl0IG9uIHN0YXJ0IG9mIHN0YXRlIG1hY2hpbmUgaW50ZXJydXB0ZWQuXG4iKTsKKwkJCWluc3RhbmNlLT5hb19jb250cm9sX3Rhc2tfZmxhZyA9IDA7CisJCQljYW5jZWxfZGVsYXllZF93b3JrKCZpbnN0YW5jZS0+YW9fY29udHJvbF90YXNrKTsKKwkJCWFvX3N0b3BfaW1tZWRpYXRlbHkoaW5zdGFuY2UpOworCQkJaW5zdGFuY2UtPnN0YXR1cyA9IGFvX3N0YXR1c19ub25lOworCQkJZXJyID0gTUVfRVJSTk9fU0lHTkFMOworCQl9CisKKwkJaWYgKChkZWxheSkgJiYgKChqaWZmaWVzIC0gaikgPj0gZGVsYXkpKSB7CisJCQlpZiAoaW5zdGFuY2UtPnN0YXR1cyA9PSBhb19zdGF0dXNfc2luZ2xlX2VuZCkgeworCQkJCVBERUJVRygiVGltZW91dCByZWFjaGVkLlxuIik7CisJCQl9IGVsc2UgeworCQkJCWlmICgoamlmZmllcyAtIGopID4gZGVsYXkpIHsKKwkJCQkJUEVSUk9SCisJCQkJCSAgICAoIlRpbWVvdXQgcmVhY2hlZC4gTm90IGhhbmRsZWQgYnkgY29udHJvbCB0YXNrIVxuIik7CisJCQkJfSBlbHNlIHsKKwkJCQkJUEVSUk9SCisJCQkJCSAgICAoIlRpbWVvdXQgcmVhY2hlZC4gU2lnbmFsIGNvbWUgYnV0IHN0YXR1cyBpcyBzdHJhbmdlOiAlZFxuIiwKKwkJCQkJICAgICBpbnN0YW5jZS0+c3RhdHVzKTsKKwkJCQl9CisKKwkJCQlhb19zdG9wX2ltbWVkaWF0ZWx5KGluc3RhbmNlKTsKKwkJCX0KKworCQkJaW5zdGFuY2UtPmFvX2NvbnRyb2xfdGFza19mbGFnID0gMDsKKwkJCWNhbmNlbF9kZWxheWVkX3dvcmsoJmluc3RhbmNlLT5hb19jb250cm9sX3Rhc2spOworCQkJaW5zdGFuY2UtPnN0YXR1cyA9IGFvX3N0YXR1c19zaW5nbGVfZW5kOworCQkJZXJyID0gTUVfRVJSTk9fVElNRU9VVDsKKwkJfQorCX0KKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZTQ2MDBfYW9faW9fc3RyZWFtX2NvbmZpZyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgICAgbWVJT1N0cmVhbUNvbmZpZ190ICogY29uZmlnX2xpc3QsCisJCQkJICAgICAgaW50IGNvdW50LAorCQkJCSAgICAgIG1lSU9TdHJlYW1UcmlnZ2VyX3QgKiB0cmlnZ2VyLAorCQkJCSAgICAgIGludCBmaWZvX2lycV90aHJlc2hvbGQsIGludCBmbGFncykKK3sKKwltZTQ2MDBfYW9fc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCXVpbnQzMl90IGN0cmw7CisJdW5zaWduZWQgbG9uZyBjcHVfZmxhZ3M7CisJdWludDY0X3QgY29udl90aWNrczsKKwl1bnNpZ25lZCBpbnQgY29udl9zdGFydF90aWNrc19sb3cgPSB0cmlnZ2VyLT5pQ29udlN0YXJ0VGlja3NMb3c7CisJdW5zaWduZWQgaW50IGNvbnZfc3RhcnRfdGlja3NfaGlnaCA9IHRyaWdnZXItPmlDb252U3RhcnRUaWNrc0hpZ2g7CisKKwlpbnN0YW5jZSA9IChtZTQ2MDBfYW9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJUERFQlVHKCJleGVjdXRlZC4gaWR4PSVkXG4iLCBpbnN0YW5jZS0+YW9faWR4KTsKKworCWlmICghaW5zdGFuY2UtPmZpZm8pIHsKKwkJUEVSUk9SKCJOb3QgYSBzdHJlYW1pbmcgYW8uXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX05PVF9TVVBQT1JURUQ7CisJfQorCisJY29udl90aWNrcyA9CisJICAgICh1aW50NjRfdCkgY29udl9zdGFydF90aWNrc19sb3cgKworCSAgICAoKHVpbnQ2NF90KSBjb252X3N0YXJ0X3RpY2tzX2hpZ2ggPDwgMzIpOworCisJaWYgKGZsYWdzICYKKwkgICAgfihNRV9JT19TVFJFQU1fQ09ORklHX0hBUkRXQVJFX09OTFkgfCBNRV9JT19TVFJFQU1fQ09ORklHX1dSQVBBUk9VTkQKKwkgICAgICB8IE1FX0lPX1NUUkVBTV9DT05GSUdfQklUX1BBVFRFUk4pKSB7CisJCVBFUlJPUigiSW52YWxpZCBmbGFncy5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlpZiAoZmxhZ3MgJiBNRV9JT19TVFJFQU1fQ09ORklHX0hBUkRXQVJFX09OTFkpIHsKKwkJaWYgKCFmbGFncyAmIE1FX0lPX1NUUkVBTV9DT05GSUdfV1JBUEFST1VORCkgeworCQkJUEVSUk9SCisJCQkgICAgKCJIYXJkd2FyZSBNRV9JT19TVFJFQU1fQ09ORklHX0hBUkRXQVJFX09OTFkgaGFzIHRvIGJlIHdpdGggTUVfSU9fU1RSRUFNX0NPTkZJR19XUkFQQVJPVU5ELlxuIik7CisJCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwkJfQorCisJCWlmICgodHJpZ2dlci0+aUFjcVN0b3BUcmlnVHlwZSAhPSBNRV9UUklHX1RZUEVfTk9ORSkKKwkJICAgIHx8ICh0cmlnZ2VyLT5pU2NhblN0b3BUcmlnVHlwZSAhPSBNRV9UUklHX1RZUEVfTk9ORSkpIHsKKwkJCVBFUlJPUgorCQkJICAgICgiSGFyZHdhcmUgd3JhcGFyb3VuZCBtb2RlIG11c3QgYmUgaW4gaW5maW5pdGUgbW9kZS5cbiIpOworCQkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJCX0KKwl9CisKKwlpZiAoY291bnQgIT0gMSkgeworCQlQRVJST1IoIk9ubHkgMSBlbnRyeSBpbiBjb25maWcgbGlzdCBhY2NlcHRhYmxlLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0NPTkZJR19MSVNUX0NPVU5UOworCX0KKworCWlmIChjb25maWdfbGlzdFswXS5pQ2hhbm5lbCAhPSAwKSB7CisJCVBFUlJPUigiSW52YWxpZCBjaGFubmVsIG51bWJlciBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwl9CisKKwlpZiAoY29uZmlnX2xpc3RbMF0uaVN0cmVhbUNvbmZpZyAhPSAwKSB7CisJCVBFUlJPUigiT25seSBvbmUgcmFuZ2UgYXZhaWxhYmxlLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1NUUkVBTV9DT05GSUc7CisJfQorCisJaWYgKGNvbmZpZ19saXN0WzBdLmlSZWYgIT0gTUVfUkVGX0FPX0dST1VORCkgeworCQlQRVJST1IoIk91dHB1dCBpcyByZWZlcmVuY2VkIHRvIGdyb3VuZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9SRUY7CisJfQorCisJaWYgKCh0cmlnZ2VyLT5pQWNxU3RhcnRUaWNrc0xvdyAhPSAwKQorCSAgICB8fCAodHJpZ2dlci0+aUFjcVN0YXJ0VGlja3NIaWdoICE9IDApKSB7CisJCVBFUlJPUgorCQkgICAgKCJJbnZhbGlkIGFjcXVpc2l0aW9uIHN0YXJ0IHRyaWdnZXIgYXJndW1lbnQgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0FDUV9TVEFSVF9BUkc7CisJfQorCisJaWYgKGNvbmZpZ19saXN0WzBdLmlGbGFncykgeworCQlQRVJST1IoIkludmFsaWQgY29uZmlnIGxpc3QgZmxhZy5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlzd2l0Y2ggKHRyaWdnZXItPmlBY3FTdGFydFRyaWdUeXBlKSB7CisJY2FzZSBNRV9UUklHX1RZUEVfU1c6CisJCWlmICh0cmlnZ2VyLT5pQWNxU3RhcnRUcmlnRWRnZSAhPSBNRV9UUklHX0VER0VfTk9ORSkgeworCQkJUEVSUk9SCisJCQkgICAgKCJJbnZhbGlkIGFjcXVpc2l0aW9uIHN0YXJ0IHRyaWdnZXIgZWRnZSBzcGVjaWZpZWQuXG4iKTsKKwkJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0FDUV9TVEFSVF9UUklHX0VER0U7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIE1FX1RSSUdfVFlQRV9FWFRfRElHSVRBTDoKKwkJc3dpdGNoICh0cmlnZ2VyLT5pQWNxU3RhcnRUcmlnRWRnZSkgeworCQljYXNlIE1FX1RSSUdfRURHRV9BTlk6CisJCWNhc2UgTUVfVFJJR19FREdFX1JJU0lORzoKKwkJY2FzZSBNRV9UUklHX0VER0VfRkFMTElORzoKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlQRVJST1IKKwkJCSAgICAoIkludmFsaWQgYWNxdWlzaXRpb24gc3RhcnQgdHJpZ2dlciBlZGdlIHNwZWNpZmllZC5cbiIpOworCQkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfQUNRX1NUQVJUX1RSSUdfRURHRTsKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCVBFUlJPUigiSW52YWxpZCBhY3F1aXNpdGlvbiBzdGFydCB0cmlnZ2VyIHR5cGUgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0FDUV9TVEFSVF9UUklHX1RZUEU7CisJfQorCisJaWYgKHRyaWdnZXItPmlTY2FuU3RhcnRUcmlnVHlwZSAhPSBNRV9UUklHX1RZUEVfRk9MTE9XKSB7CisJCVBFUlJPUigiSW52YWxpZCBzY2FuIHN0YXJ0IHRyaWdnZXIgdHlwZSBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfU0NBTl9TVEFSVF9UUklHX1RZUEU7CisJfQorCisJaWYgKHRyaWdnZXItPmlDb252U3RhcnRUcmlnVHlwZSAhPSBNRV9UUklHX1RZUEVfVElNRVIpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGNvbnYgc3RhcnQgdHJpZ2dlciB0eXBlIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9DT05WX1NUQVJUX1RSSUdfVFlQRTsKKwl9CisKKwlpZiAoKGNvbnZfdGlja3MgPCBNRTQ2MDBfQU9fTUlOX0NIQU5fVElDS1MpCisJICAgIHx8IChjb252X3RpY2tzID4gTUU0NjAwX0FPX01BWF9DSEFOX1RJQ0tTKSkgeworCQlQRVJST1IoIkludmFsaWQgY29udiBzdGFydCB0cmlnZ2VyIGFyZ3VtZW50IHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9DT05WX1NUQVJUX0FSRzsKKwl9CisKKwlpZiAodHJpZ2dlci0+aUFjcVN0YXJ0VGlja3NMb3cgfHwgdHJpZ2dlci0+aUFjcVN0YXJ0VGlja3NIaWdoKSB7CisJCVBFUlJPUigiSW52YWxpZCBhY3Egc3RhcnQgdHJpZ2dlciBhcmd1bWVudCBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfQUNRX1NUQVJUX0FSRzsKKwl9CisKKwlpZiAodHJpZ2dlci0+aVNjYW5TdGFydFRpY2tzTG93IHx8IHRyaWdnZXItPmlTY2FuU3RhcnRUaWNrc0hpZ2gpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIHNjYW4gc3RhcnQgdHJpZ2dlciBhcmd1bWVudCBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfU0NBTl9TVEFSVF9BUkc7CisJfQorCisJc3dpdGNoICh0cmlnZ2VyLT5pU2NhblN0b3BUcmlnVHlwZSkgeworCWNhc2UgTUVfVFJJR19UWVBFX05PTkU6CisJCWlmICh0cmlnZ2VyLT5pU2NhblN0b3BDb3VudCAhPSAwKSB7CisJCQlQRVJST1IoIkludmFsaWQgc2NhbiBzdG9wIGNvdW50IHNwZWNpZmllZC5cbiIpOworCQkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfU0NBTl9TVE9QX0FSRzsKKwkJfQorCQlicmVhazsKKworCWNhc2UgTUVfVFJJR19UWVBFX0NPVU5UOgorCQlpZiAoZmxhZ3MgJiBNRV9JT19TVFJFQU1fQ09ORklHX1dSQVBBUk9VTkQpIHsKKwkJCWlmICh0cmlnZ2VyLT5pU2NhblN0b3BDb3VudCA8PSAwKSB7CisJCQkJUEVSUk9SKCJJbnZhbGlkIHNjYW4gc3RvcCBjb3VudCBzcGVjaWZpZWQuXG4iKTsKKwkJCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9TQ0FOX1NUT1BfQVJHOworCQkJfQorCQl9IGVsc2UgeworCQkJUEVSUk9SKCJUaGUgY29udGlub3VzIG1vZGUgaGFzIG5vdCAnc2NhbicgY29udGVjdHMuXG4iKTsKKwkJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0FDUV9TVE9QX1RSSUdfVFlQRTsKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCVBFUlJPUigiSW52YWxpZCBzY2FuIHN0b3AgdHJpZ2dlciB0eXBlIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9TQ0FOX1NUT1BfVFJJR19UWVBFOworCX0KKworCXN3aXRjaCAodHJpZ2dlci0+aUFjcVN0b3BUcmlnVHlwZSkgeworCWNhc2UgTUVfVFJJR19UWVBFX05PTkU6CisJCWlmICh0cmlnZ2VyLT5pQWNxU3RvcENvdW50ICE9IDApIHsKKwkJCVBFUlJPUigiSW52YWxpZCBhY3Egc3RvcCBjb3VudCBzcGVjaWZpZWQuXG4iKTsKKwkJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0FDUV9TVE9QX0FSRzsKKwkJfQorCQlicmVhazsKKworCWNhc2UgTUVfVFJJR19UWVBFX0NPVU5UOgorCQlpZiAodHJpZ2dlci0+aVNjYW5TdG9wVHJpZ1R5cGUgIT0gTUVfVFJJR19UWVBFX05PTkUpIHsKKwkJCVBFUlJPUigiSW52YWxpZCBhY3Egc3RvcCB0cmlnZ2VyIHR5cGUgc3BlY2lmaWVkLlxuIik7CisJCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9BQ1FfU1RPUF9UUklHX1RZUEU7CisJCX0KKworCQlpZiAoZmxhZ3MgJiBNRV9JT19TVFJFQU1fQ09ORklHX1dSQVBBUk9VTkQpIHsKKwkJCWlmICh0cmlnZ2VyLT5pQWNxU3RvcENvdW50IDw9IDApIHsKKwkJCQlQRVJST1IKKwkJCQkgICAgKCJUaGUgY29udGlub3VzIG1vZGUgaGFzIG5vdCAnc2NhbicgY29udGVjdHMuXG4iKTsKKwkJCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9BQ1FfU1RPUF9BUkc7CisJCQl9CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlQRVJST1IoIkludmFsaWQgYWNxIHN0b3AgdHJpZ2dlciB0eXBlIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9BQ1FfU1RPUF9UUklHX1RZUEU7CisJfQorCisJc3dpdGNoICh0cmlnZ2VyLT5pQWNxU3RhcnRUcmlnQ2hhbikgeworCWNhc2UgTUVfVFJJR19DSEFOX0RFRkFVTFQ6CisJY2FzZSBNRV9UUklHX0NIQU5fU1lOQ0hST05PVVM6CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJUEVSUk9SKCJJbnZhbGlkIGFjcSBzdGFydCB0cmlnZ2VyIGNoYW5uZWwgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0FDUV9TVEFSVF9UUklHX0NIQU47CisJfQorCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJaWYgKChmbGFncyAmIE1FX0lPX1NUUkVBTV9DT05GSUdfQklUX1BBVFRFUk4pICYmICFpbnN0YW5jZS0+Yml0cGF0dGVybikgeworCQlQRVJST1IoIlRoaXMgc3ViZGV2aWNlIG5vdCBzdXBwb3J0IG91dHB1dCByZWRpcmVjdGlvbi5cbiIpOworCQlNRV9TVUJERVZJQ0VfRVhJVDsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJfQorCS8vU3RvcCBkZXZpY2UKKworCS8vQ2FuY2VsIGNvbnRyb2wgdGFzaworCVBERUJVRygiQ2FuY2VsIGNvbnRyb2wgdGFzay4gaWR4PSVkXG4iLCBpbnN0YW5jZS0+YW9faWR4KTsKKwlpbnN0YW5jZS0+YW9fY29udHJvbF90YXNrX2ZsYWcgPSAwOworCWNhbmNlbF9kZWxheWVkX3dvcmsoJmluc3RhbmNlLT5hb19jb250cm9sX3Rhc2spOworCisJLy9DaGVjayBpZiBzdGF0ZSBtYWNoaW5lIGlzIHN0b3BwZWQuCisJZXJyID0gYW9fc3RvcF9pbW1lZGlhdGVseShpbnN0YW5jZSk7CisJaWYgKGVycikgeworCQlQRVJST1JfQ1JJVElDQUwoIkZTTSBJUyBCVVNZIVxuIik7CisJCU1FX1NVQkRFVklDRV9FWElUOworCisJCXJldHVybiBNRV9FUlJOT19TVUJERVZJQ0VfQlVTWTsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCS8vUmVzZXQgY29udHJvbCByZWdpc3Rlci4gQmxvY2sgYWxsIGFjdGlvbnMuIERpc2FibGUgSVJRLiBEaXNhYmxlIEZJRk8uCisJY3RybCA9CisJICAgIE1FNDYwMF9BT19DVFJMX0JJVF9JTU1FRElBVEVfU1RPUCB8IE1FNDYwMF9BT19DVFJMX0JJVF9TVE9QIHwKKwkgICAgTUU0NjAwX0FPX0NUUkxfQklUX1JFU0VUX0lSUTsKKwlvdXRsKGN0cmwsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIGN0cmwpOworCisJLy9UaGlzIGlzIHBhcmFub2ljLCBidXQgdG8gYmUgc3VyZS4KKwlpbnN0YW5jZS0+cHJlbG9hZGVkX2NvdW50ID0gMDsKKwlpbnN0YW5jZS0+ZGF0YV9jb3VudCA9IDA7CisJaW5zdGFuY2UtPmNpcmNfYnVmLmhlYWQgPSAwOworCWluc3RhbmNlLT5jaXJjX2J1Zi50YWlsID0gMDsKKworCS8qIFNldCBtb2RlLiAqLworCWlmIChmbGFncyAmIE1FX0lPX1NUUkVBTV9DT05GSUdfV1JBUEFST1VORCkgewkvL1dyYXBhcm91bmQKKwkJaWYgKGZsYWdzICYgTUVfSU9fU1RSRUFNX0NPTkZJR19IQVJEV0FSRV9PTkxZKSB7CS8vSGFyZHdhcmUgd3JhcGFyb3VuZAorCQkJUElORk8oIkhhcmR3YXJlIHdyYXBhcm91bmQuXG4iKTsKKwkJCWN0cmwgfD0gTUU0NjAwX0FPX01PREVfV1JBUEFST1VORDsKKwkJCWluc3RhbmNlLT5tb2RlID0gTUU0NjAwX0FPX0hXX1dSQVBfTU9ERTsKKwkJfSBlbHNlIHsJLy9Tb2Z0d2FyZSB3cmFwYXJvdW5kCisJCQlQSU5GTygiU29mdHdhcmUgd3JhcGFyb3VuZC5cbiIpOworCQkJY3RybCB8PSBNRTQ2MDBfQU9fTU9ERV9DT05USU5VT1VTOworCQkJaW5zdGFuY2UtPm1vZGUgPSBNRTQ2MDBfQU9fU1dfV1JBUF9NT0RFOworCQl9CisJfSBlbHNlIHsJCS8vQ29udGlub3VzCisJCVBJTkZPKCJDb250aW5vdXMuXG4iKTsKKwkJY3RybCB8PSBNRTQ2MDBfQU9fTU9ERV9DT05USU5VT1VTOworCQlpbnN0YW5jZS0+bW9kZSA9IE1FNDYwMF9BT19DT05USU5PVVM7CisJfQorCisJLy9TZXQgdGhlIHRyaWdnZXIgZWRnZS4KKwlpZiAodHJpZ2dlci0+aUFjcVN0YXJ0VHJpZ1R5cGUgPT0gTUVfVFJJR19UWVBFX0VYVF9ESUdJVEFMKSB7CS8vU2V0IHRoZSB0cmlnZ2VyIHR5cGUgYW5kIGVkZ2UgZm9yIGV4dGVybmFsIHRyaWdnZXIuCisJCVBJTkZPKCJFeHRlcm5hbCBkaWdpdGFsIHRyaWdnZXIuXG4iKTsKKwkJaW5zdGFuY2UtPnN0YXJ0X21vZGUgPSBNRTQ2MDBfQU9fRVhUX1RSSUc7CisvKgorCQkJY3RybCB8PSBNRTQ2MDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0VYX1RSSUc7CisqLworCQlzd2l0Y2ggKHRyaWdnZXItPmlBY3FTdGFydFRyaWdFZGdlKSB7CisJCWNhc2UgTUVfVFJJR19FREdFX1JJU0lORzoKKwkJCVBJTkZPKCJTZXQgdGhlIHRyaWdnZXIgZWRnZTogcmlzaW5nLlxuIik7CisJCQlpbnN0YW5jZS0+Y3RybF90cmcgPSAweDA7CisJCQlicmVhazsKKworCQljYXNlIE1FX1RSSUdfRURHRV9GQUxMSU5HOgorCQkJUElORk8oIlNldCB0aGUgdHJpZ2dlciBlZGdlOiBmYWxsaW5nLlxuIik7CisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3RybCB8PSBNRTQ2MDBfQU9fQ1RSTF9CSVRfRVhfVFJJR19FREdFOworCQkJaW5zdGFuY2UtPmN0cmxfdHJnID0gTUU0NjAwX0FPX0NUUkxfQklUX0VYX1RSSUdfRURHRTsKKwkJCWJyZWFrOworCisJCWNhc2UgTUVfVFJJR19FREdFX0FOWToKKwkJCVBJTkZPKCJTZXQgdGhlIHRyaWdnZXIgZWRnZTogYm90aCBlZGdlcy5cbiIpOworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0cmwgfD0gTUU0NjAwX0FPX0NUUkxfQklUX0VYX1RSSUdfRURHRSB8IE1FNDYwMF9BT19DVFJMX0JJVF9FWF9UUklHX0VER0VfQk9USDsKKwkJCWluc3RhbmNlLT5jdHJsX3RyZyA9CisJCQkgICAgTUU0NjAwX0FPX0NUUkxfQklUX0VYX1RSSUdfRURHRSB8CisJCQkgICAgTUU0NjAwX0FPX0NUUkxfQklUX0VYX1RSSUdfRURHRV9CT1RIOworCQkJYnJlYWs7CisJCX0KKwl9IGVsc2UgeworCQlQSU5GTygiSW50ZXJuYWwgc29mdHdhcmUgdHJpZ2dlci5cbiIpOworCQlpbnN0YW5jZS0+c3RhcnRfbW9kZSA9IDA7CisJfQorCisJLy9TZXQgdGhlIHN0b3AgbW9kZSBhbmQgdmFsdWUuCisJaWYgKHRyaWdnZXItPmlBY3FTdG9wVHJpZ1R5cGUgPT0gTUVfVFJJR19UWVBFX0NPVU5UKSB7CS8vQW1vdW50IG9mIGRhdGEKKwkJaW5zdGFuY2UtPnN0b3BfbW9kZSA9IE1FNDYwMF9BT19BQ1FfU1RPUF9NT0RFOworCQlpbnN0YW5jZS0+c3RvcF9jb3VudCA9IHRyaWdnZXItPmlBY3FTdG9wQ291bnQ7CisJfSBlbHNlIGlmICh0cmlnZ2VyLT5pU2NhblN0b3BUcmlnVHlwZSA9PSBNRV9UUklHX1RZUEVfQ09VTlQpIHsJLy9BbW91bnQgb2YgJ3NjYW5zJworCQlpbnN0YW5jZS0+c3RvcF9tb2RlID0gTUU0NjAwX0FPX1NDQU5fU1RPUF9NT0RFOworCQlpbnN0YW5jZS0+c3RvcF9jb3VudCA9IHRyaWdnZXItPmlTY2FuU3RvcENvdW50OworCX0gZWxzZSB7CQkvL0luZmluaXRlCisJCWluc3RhbmNlLT5zdG9wX21vZGUgPSBNRTQ2MDBfQU9fSU5GX1NUT1BfTU9ERTsKKwkJaW5zdGFuY2UtPnN0b3BfY291bnQgPSAwOworCX0KKworCVBJTkZPKCJTdG9wIGNvdW50OiAlZC5cbiIsIGluc3RhbmNlLT5zdG9wX2NvdW50KTsKKworCWlmICh0cmlnZ2VyLT5pQWNxU3RhcnRUcmlnQ2hhbiA9PSBNRV9UUklHX0NIQU5fU1lOQ0hST05PVVMpIHsJLy9TeW5jaHJvbm91cyBzdGFydAorCQlpbnN0YW5jZS0+c3RhcnRfbW9kZSB8PSBNRTQ2MDBfQU9fU1lOQ19IT0xEOworCQlpZiAodHJpZ2dlci0+aUFjcVN0YXJ0VHJpZ1R5cGUgPT0gTUVfVFJJR19UWVBFX0VYVF9ESUdJVEFMKSB7CS8vRXh0ZXJuYWx5IHRyaWdnZXJlZAorCQkJUElORk8oIlN5bmNocm9ub3VzIHN0YXJ0LiBFeHRlcm5hbHkgdHJpZ2dlciBhY3RpdmUuXG4iKTsKKwkJCWluc3RhbmNlLT5zdGFydF9tb2RlIHw9IE1FNDYwMF9BT19TWU5DX0VYVF9UUklHOworCQl9CisjaWZkZWYgTUVERUJVR19JTkZPCisJCWVsc2UgeworCQkJUElORk8KKwkJCSAgICAoIlN5bmNocm9ub3VzIHN0YXJ0LiBFeHRlcm5hbHkgdHJpZ2dlciBkaXNzYWJsZWQuXG4iKTsKKwkJfQorI2VuZGlmCisKKwl9CisJLy9TZXQgc3BlZWQKKwlvdXRsKGNvbnZfdGlja3MgLSAyLCBpbnN0YW5jZS0+dGltZXJfcmVnKTsKKwlQREVCVUdfUkVHKCJ0aW1lcl9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHglbGx4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT50aW1lcl9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIGNvbnZfdGlja3MgLSAyKTsKKwlpbnN0YW5jZS0+aGFyZHdhcmVfc3RvcF9kZWxheSA9IChpbnQpKGNvbnZfdGlja3MgKiBIWikgLyBNRTQ2MDBfQU9fQkFTRV9GUkVRVUVOQ1k7CS8vPD09IE1VU1QgYmUgd2l0aCBjYXN0IQorCisJLy9Db25lY3Qgb3V0cHV0cyB0byBhbmFsb2cgb3IgZGlnaXRhbCBwb3J0LgorCWlmIChmbGFncyAmIE1FX0lPX1NUUkVBTV9DT05GSUdfQklUX1BBVFRFUk4pIHsKKwkJY3RybCB8PSBNRTQ2MDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0RPOworCX0KKwkvLyBXcml0ZSB0aGUgY29udHJvbCB3b3JkCisJb3V0bChjdHJsLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCBjdHJsKTsKKworCS8vU2V0IHN0YXR1cy4KKwlpbnN0YW5jZS0+c3RhdHVzID0gYW9fc3RhdHVzX3N0cmVhbV9jb25maWd1cmVkOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZTQ2MDBfYW9faW9fc3RyZWFtX25ld192YWx1ZXMobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJCSAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCQkgIGludCB0aW1lX291dCwgaW50ICpjb3VudCwgaW50IGZsYWdzKQoreworCW1lNDYwMF9hb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJbG9uZyB0ID0gMDsKKwlsb25nIGo7CisKKwlpbnN0YW5jZSA9IChtZTQ2MDBfYW9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJUERFQlVHKCJleGVjdXRlZC4gaWR4PSVkXG4iLCBpbnN0YW5jZS0+YW9faWR4KTsKKworCWlmICghaW5zdGFuY2UtPmZpZm8pIHsKKwkJUEVSUk9SKCJOb3QgYSBzdHJlYW1pbmcgYW8uXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX05PVF9TVVBQT1JURUQ7CisJfQorCisJaWYgKGZsYWdzKSB7CisJCVBFUlJPUigiSW52YWxpZCBmbGFnIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlpZiAoIWluc3RhbmNlLT5jaXJjX2J1Zi5idWYpIHsKKwkJUEVSUk9SKCJDaXJjdWxhciBidWZmZXIgbm90IGV4aXN0cy5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5URVJOQUw7CisJfQorCisJaWYgKHRpbWVfb3V0IDwgMCkgeworCQlQRVJST1IoIkludmFsaWQgdGltZV9vdXQgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1RJTUVPVVQ7CisJfQorCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJaWYgKG1lX2NpcmNfYnVmX3NwYWNlKCZpbnN0YW5jZS0+Y2lyY19idWYpKSB7CS8vVGhlIGJ1ZmZlciBpcyBOT1QgZnVsbC4KKwkJKmNvdW50ID0gbWVfY2lyY19idWZfc3BhY2UoJmluc3RhbmNlLT5jaXJjX2J1Zik7CisJfSBlbHNlIHsJCS8vVGhlIGJ1ZmZlciBpcyBmdWxsLgorCQlpZiAodGltZV9vdXQpIHsKKwkJCXQgPSAodGltZV9vdXQgKiBIWikgLyAxMDAwOworCisJCQlpZiAodCA9PSAwKQorCQkJCXQgPSAxOworCQl9IGVsc2UgewkvL01heCB0aW1lLgorCQkJdCA9IExPTkdfTUFYOworCQl9CisKKwkJKmNvdW50ID0gMDsKKworCQlqID0gamlmZmllczsKKworCQkvL09ubHkgcnVuaW5nIHByb2Nlc3Mgd2lsbCBpbnRlcnJ1cHQgdGhpcyBjYWxsLiBJbnRlcnJ1cHRzIGFyZSB3aGVuIEZJRk8gSEYgaXMgc2lnbmFsZWQuCisJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KGluc3RhbmNlLT53YWl0X3F1ZXVlLAorCQkJCQkJICgobWVfY2lyY19idWZfc3BhY2UKKwkJCQkJCSAgICgmaW5zdGFuY2UtPmNpcmNfYnVmKSkKKwkJCQkJCSAgfHwgIShpbmwoaW5zdGFuY2UtPnN0YXR1c19yZWcpCisJCQkJCQkgICAgICAgJgorCQkJCQkJICAgICAgIE1FNDYwMF9BT19TVEFUVVNfQklUX0ZTTSkpLAorCQkJCQkJIHQpOworCisJCWlmICghKGlubChpbnN0YW5jZS0+c3RhdHVzX3JlZykgJiBNRTQ2MDBfQU9fU1RBVFVTX0JJVF9GU00pKSB7CisJCQlQRVJST1IoIkFPIHN1YmRldmljZSBpcyBub3QgcnVubmluZy5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fU1VCREVWSUNFX05PVF9SVU5OSU5HOworCQl9IGVsc2UgaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQlQRVJST1IoIldhaXQgb24gdmFsdWVzIGludGVycnVwdGVkIGZyb20gc2lnbmFsLlxuIik7CisJCQlpbnN0YW5jZS0+c3RhdHVzID0gYW9fc3RhdHVzX25vbmU7CisJCQlhb19zdG9wX2ltbWVkaWF0ZWx5KGluc3RhbmNlKTsKKwkJCWVyciA9IE1FX0VSUk5PX1NJR05BTDsKKwkJfSBlbHNlIGlmICgoamlmZmllcyAtIGopID49IHQpIHsKKwkJCVBFUlJPUigiV2FpdCBvbiB2YWx1ZXMgdGltZWQgb3V0LlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19USU1FT1VUOworCQl9IGVsc2UgewkvL1VmZi4uLiBhbGwgaXMgZ29vZC4gSW5mb3JtIHVzZXIgYWJvdXQgZW1wdHkgc3BhY2UuCisJCQkqY291bnQgPSBtZV9jaXJjX2J1Zl9zcGFjZSgmaW5zdGFuY2UtPmNpcmNfYnVmKTsKKwkJfQorCX0KKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZTQ2MDBfYW9faW9fc3RyZWFtX3N0YXJ0KG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICAgaW50IHN0YXJ0X21vZGUsIGludCB0aW1lX291dCwgaW50IGZsYWdzKQoreworCW1lNDYwMF9hb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJdW5zaWduZWQgbG9uZyBjcHVfZmxhZ3MgPSAwOworCXVpbnQzMl90IHN0YXR1czsKKwl1aW50MzJfdCBjdHJsOworCXVpbnQzMl90IHN5bmNoOworCWludCBjb3VudCA9IDA7CisJaW50IGNpcmNfYnVmZmVyX2NvdW50OworCisJdW5zaWduZWQgbG9uZyByZWY7CisJdW5zaWduZWQgbG9uZyBkZWxheSA9IDA7CisKKwlpbnN0YW5jZSA9IChtZTQ2MDBfYW9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJUERFQlVHKCJleGVjdXRlZC4gaWR4PSVkXG4iLCBpbnN0YW5jZS0+YW9faWR4KTsKKworCWlmICghaW5zdGFuY2UtPmZpZm8pIHsKKwkJUEVSUk9SKCJOb3QgYSBzdHJlYW1pbmcgYW8uXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX05PVF9TVVBQT1JURUQ7CisJfQorCisJaWYgKGZsYWdzICYgfk1FX0lPX1NUUkVBTV9TVEFSVF9UWVBFX1RSSUdfU1lOQ0hST05PVVMpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWdzLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCWlmICh0aW1lX291dCA8IDApIHsKKwkJUEVSUk9SKCJJbnZhbGlkIHRpbWVvdXQgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1RJTUVPVVQ7CisJfQorCisJaWYgKChzdGFydF9tb2RlICE9IE1FX1NUQVJUX01PREVfQkxPQ0tJTkcpCisJICAgICYmIChzdGFydF9tb2RlICE9IE1FX1NUQVJUX01PREVfTk9OQkxPQ0tJTkcpKSB7CisJCVBFUlJPUigiSW52YWxpZCBzdGFydCBtb2RlIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9TVEFSVF9NT0RFOworCX0KKworCWlmICh0aW1lX291dCkgeworCQlkZWxheSA9ICh0aW1lX291dCAqIEhaKSAvIDEwMDA7CisJCWlmIChkZWxheSA9PSAwKQorCQkJZGVsYXkgPSAxOworCX0KKworCXN3aXRjaCAoaW5zdGFuY2UtPnN0YXR1cykgewkvL0NoZWNraW5nIGFjdHVhbCBtb2RlLgorCWNhc2UgYW9fc3RhdHVzX3N0cmVhbV9jb25maWd1cmVkOgorCWNhc2UgYW9fc3RhdHVzX3N0cmVhbV9lbmQ6CisJCS8vQ29ycmVjdCBtb2RlcyEKKwkJYnJlYWs7CisKKwkJLy9UaGUgZGV2aWNlIGlzIGluIHdyb25nIG1vZGUuCisJY2FzZSBhb19zdGF0dXNfbm9uZToKKwljYXNlIGFvX3N0YXR1c19zaW5nbGVfY29uZmlndXJlZDoKKwljYXNlIGFvX3N0YXR1c19zaW5nbGVfcnVuX3dhaXQ6CisJY2FzZSBhb19zdGF0dXNfc2luZ2xlX3J1bjoKKwljYXNlIGFvX3N0YXR1c19zaW5nbGVfZW5kX3dhaXQ6CisJCVBFUlJPUgorCQkgICAgKCJTdWJkZXZpY2UgbXVzdCBiZSBwcmVpbml0aWFsaXplIGNvcnJlY3RseSBmb3Igc3RyZWFtaW5nLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19QUkVWSU9VU19DT05GSUc7CisKKwljYXNlIGFvX3N0YXR1c19zdHJlYW1fZmlmb19lcnJvcjoKKwljYXNlIGFvX3N0YXR1c19zdHJlYW1fYnVmZmVyX2Vycm9yOgorCWNhc2UgYW9fc3RhdHVzX3N0cmVhbV9lcnJvcjoKKwkJUERFQlVHKCJCZWZvcmUgcmVzdGFydCBicm9rZSBzdHJlYW0gJ1NUT1AnIG11c3QgYmUgY2FsZWQuXG4iKTsKKwkJcmV0dXJuIE1FX1NUQVRVU19FUlJPUjsKKworCWNhc2UgYW9fc3RhdHVzX3N0cmVhbV9ydW5fd2FpdDoKKwljYXNlIGFvX3N0YXR1c19zdHJlYW1fcnVuOgorCWNhc2UgYW9fc3RhdHVzX3N0cmVhbV9lbmRfd2FpdDoKKwkJUERFQlVHKCJTdHJlYW0gaXMgYWxyZWFkeSB3b3JraW5nLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19TVUJERVZJQ0VfQlVTWTsKKworCWRlZmF1bHQ6CisJCWluc3RhbmNlLT5zdGF0dXMgPSBhb19zdGF0dXNfc3RyZWFtX2Vycm9yOworCQlQRVJST1JfQ1JJVElDQUwoIlN0YXR1cyBpcyBpbiB3cm9uZyBzdGF0ZSFcbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5URVJOQUw7CisKKwl9CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlpZiAoaW5zdGFuY2UtPm1vZGUgPT0gTUU0NjAwX0FPX0NPTlRJTk9VUykgewkvL0NvbnRpbm91cworCQlpbnN0YW5jZS0+Y2lyY19idWYudGFpbCArPSBpbnN0YW5jZS0+cHJlbG9hZGVkX2NvdW50OworCQlpbnN0YW5jZS0+Y2lyY19idWYudGFpbCAmPSBpbnN0YW5jZS0+Y2lyY19idWYubWFzazsKKwl9CisJY2lyY19idWZmZXJfY291bnQgPSBtZV9jaXJjX2J1Zl92YWx1ZXMoJmluc3RhbmNlLT5jaXJjX2J1Zik7CisKKwlpZiAoIWNpcmNfYnVmZmVyX2NvdW50ICYmICFpbnN0YW5jZS0+cHJlbG9hZGVkX2NvdW50KSB7CS8vTm8gdmFsdWVzIGluIGJ1ZmZlcgorCQlNRV9TVUJERVZJQ0VfRVhJVDsKKwkJUEVSUk9SKCJObyB2YWx1ZXMgaW4gYnVmZmVyIVxuIik7CisJCXJldHVybiBNRV9FUlJOT19MQUNLX09GX1JFU09VUkNFUzsKKwl9CisKKwkvL0NhbmNlbCBjb250cm9sIHRhc2sKKwlQREVCVUcoIkNhbmNlbCBjb250cm9sIHRhc2suIGlkeD0lZFxuIiwgaW5zdGFuY2UtPmFvX2lkeCk7CisJaW5zdGFuY2UtPmFvX2NvbnRyb2xfdGFza19mbGFnID0gMDsKKwljYW5jZWxfZGVsYXllZF93b3JrKCZpbnN0YW5jZS0+YW9fY29udHJvbF90YXNrKTsKKworCS8vU3RvcCBkZXZpY2UKKwllcnIgPSBhb19zdG9wX2ltbWVkaWF0ZWx5KGluc3RhbmNlKTsKKwlpZiAoZXJyKSB7CisJCVBFUlJPUl9DUklUSUNBTCgiRlNNIElTIEJVU1khXG4iKTsKKwkJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwkJcmV0dXJuIE1FX0VSUk5PX1NVQkRFVklDRV9CVVNZOworCX0KKwkvL1NldCB2YWx1ZXMgZm9yIHNpbmdsZV9yZWFkKCkKKwlpbnN0YW5jZS0+c2luZ2xlX3ZhbHVlID0gTUU0NjAwX0FPX01BWF9EQVRBICsgMTsKKwlpbnN0YW5jZS0+c2luZ2xlX3ZhbHVlX2luX2ZpZm8gPSBNRTQ2MDBfQU9fTUFYX0RBVEEgKyAxOworCisJLy9TZXR0aW5nIHN0b3AgcG9pbnRzCisJaWYgKGluc3RhbmNlLT5zdG9wX21vZGUgPT0gTUU0NjAwX0FPX1NDQU5fU1RPUF9NT0RFKSB7CisJCWluc3RhbmNlLT5zdG9wX2RhdGFfY291bnQgPQorCQkgICAgaW5zdGFuY2UtPnN0b3BfY291bnQgKiBjaXJjX2J1ZmZlcl9jb3VudDsKKwl9IGVsc2UgeworCQlpbnN0YW5jZS0+c3RvcF9kYXRhX2NvdW50ID0gaW5zdGFuY2UtPnN0b3BfY291bnQ7CisJfQorCisJaWYgKChpbnN0YW5jZS0+c3RvcF9kYXRhX2NvdW50ICE9IDApCisJICAgICYmIChpbnN0YW5jZS0+c3RvcF9kYXRhX2NvdW50IDwgY2lyY19idWZmZXJfY291bnQpKSB7CisJCVBFUlJPUigiTW9yZSBkYXRhIGluIGJ1ZmZlciB0aGFuIHByZXZpb3VzbHkgc2V0IGxpbWl0IVxuIik7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKwljdHJsID0gaW5sKGluc3RhbmNlLT5jdHJsX3JlZyk7CisJLy9DaGVjayBGSUZPCisJaWYgKCEoY3RybCAmIE1FNDYwMF9BT19DVFJMX0JJVF9FTkFCTEVfRklGTykpIHsJLy9GSUZPIHdhc24ndCBlbmFiZWxlZC4gRG8gaXQuIDw9IFRoaXMgc2hvdWxkIGJlIGRvbmUgYnkgdXNlciBjYWxsIHdpdGggTUVfV1JJVEVfTU9ERV9QUkVMT0FECisJCVBJTkZPKCJFbmFibGVpbmcgRklGTy5cbiIpOworCQljdHJsIHw9CisJCSAgICBNRTQ2MDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0ZJRk8gfAorCQkgICAgTUU0NjAwX0FPX0NUUkxfQklUX1JFU0VUX0lSUTsKKworCQlpbnN0YW5jZS0+cHJlbG9hZGVkX2NvdW50ID0gMDsKKwkJaW5zdGFuY2UtPmRhdGFfY291bnQgPSAwOworCX0gZWxzZSB7CQkvL0Jsb2NrIElSUQorCQljdHJsIHw9IE1FNDYwMF9BT19DVFJMX0JJVF9SRVNFVF9JUlE7CisJfQorCW91dGwoY3RybCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgY3RybCB8IE1FNDYwMF9BT19DVFJMX0JJVF9SRVNFVF9JUlEpOworCisJLy9GaWxsIEZJRk8gPD0gR2VuZXJhbHkgdGhpcyBzaG91bGQgYmUgZG9uZSBieSB1c2VyIHByZS1sb2FkIGNhbGwgYnV0IHRoaXMgaXMgc2Vjb25kIHBsYWNlIHRvIGRvIGl0LgorCXN0YXR1cyA9IGlubChpbnN0YW5jZS0+c3RhdHVzX3JlZyk7CisJaWYgKCEoc3RhdHVzICYgTUU0NjAwX0FPX1NUQVRVU19CSVRfRUYpKSB7CS8vRklGTyBlbXB0eQorCQlpZiAoaW5zdGFuY2UtPnN0b3BfZGF0YV9jb3VudCA9PSAwKSB7CisJCQljb3VudCA9IE1FNDYwMF9BT19GSUZPX0NPVU5UOworCQl9IGVsc2UgeworCQkJY291bnQgPQorCQkJICAgIChNRTQ2MDBfQU9fRklGT19DT1VOVCA8CisJCQkgICAgIGluc3RhbmNlLT4KKwkJCSAgICAgc3RvcF9kYXRhX2NvdW50KSA/IE1FNDYwMF9BT19GSUZPX0NPVU5UIDoKKwkJCSAgICBpbnN0YW5jZS0+c3RvcF9kYXRhX2NvdW50OworCQl9CisKKwkJLy9Db3B5IGRhdGEKKwkJY291bnQgPQorCQkgICAgYW9fd3JpdGVfZGF0YShpbnN0YW5jZSwgY291bnQsIGluc3RhbmNlLT5wcmVsb2FkZWRfY291bnQpOworCisJCWlmIChjb3VudCA8IDApIHsJLy9UaGlzIHNob3VsZCBuZXZlciBoYXBwZW5kIQorCQkJUEVSUk9SX0NSSVRJQ0FMKCJDT1BZIEZJTklTSCBXSVRIIEVSUk9SIVxuIik7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssCisJCQkJCSAgICAgICBjcHVfZmxhZ3MpOworCQkJTUVfU1VCREVWSUNFX0VYSVQ7CisJCQlyZXR1cm4gTUVfRVJSTk9fSU5URVJOQUw7CisJCX0KKwl9CisJLy9TZXQgcHJlLWxvYWQgZmVhdHVyZXMuCisJc3Bpbl9sb2NrKGluc3RhbmNlLT5wcmVsb2FkX3JlZ19sb2NrKTsKKwlzeW5jaCA9IGlubChpbnN0YW5jZS0+cHJlbG9hZF9yZWcpOworCXN5bmNoICY9CisJICAgIH4oKE1FNDYwMF9BT19TWU5DX0hPTEQgfCBNRTQ2MDBfQU9fU1lOQ19FWFRfVFJJRykgPDwgaW5zdGFuY2UtPgorCSAgICAgIGFvX2lkeCk7CisJc3luY2ggfD0KKwkgICAgKGluc3RhbmNlLT5zdGFydF9tb2RlICYgfk1FNDYwMF9BT19FWFRfVFJJRykgPDwgaW5zdGFuY2UtPmFvX2lkeDsKKwlvdXRsKHN5bmNoLCBpbnN0YW5jZS0+cHJlbG9hZF9yZWcpOworCVBERUJVR19SRUcoInByZWxvYWRfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPnByZWxvYWRfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCBzeW5jaCk7CisJc3Bpbl91bmxvY2soaW5zdGFuY2UtPnByZWxvYWRfcmVnX2xvY2spOworCisJLy9EZWZhdWx0IGNvdW50IGlzICcwJworCWlmIChpbnN0YW5jZS0+bW9kZSA9PSBNRTQ2MDBfQU9fQ09OVElOT1VTKSB7CS8vQ29udGlub3VzCisJCWluc3RhbmNlLT5wcmVsb2FkZWRfY291bnQgPSAwOworCQlpbnN0YW5jZS0+Y2lyY19idWYudGFpbCArPSBjb3VudDsKKwkJaW5zdGFuY2UtPmNpcmNfYnVmLnRhaWwgJj0gaW5zdGFuY2UtPmNpcmNfYnVmLm1hc2s7CisJfSBlbHNlIHsJCS8vV3JhcGFyb3VuZAorCQlpbnN0YW5jZS0+cHJlbG9hZGVkX2NvdW50ICs9IGNvdW50OworCQlpbnN0YW5jZS0+ZGF0YV9jb3VudCArPSBjb3VudDsKKworCQkvL1NwZWNpYWwgY2FzZTogSW5maW5pdGUgd3JhcGFyb3VuZCB3aXRoIGxlc3MgdGhhbiBGSUZPIGRhdGFzIGFsd2F5cyBzaG91bGQgcnVucyBpbiBoYXJkd2FyZSBtb2RlLgorCQlpZiAoKGluc3RhbmNlLT5zdG9wX21vZGUgPT0gTUU0NjAwX0FPX0lORl9TVE9QX01PREUpCisJCSAgICAmJiAoY2lyY19idWZmZXJfY291bnQgPD0gTUU0NjAwX0FPX0ZJRk9fQ09VTlQpKSB7CS8vQ2hhbmdlIHRvIGhhcmR3YXJlIHdyYXBhcm91bmQKKwkJCVBERUJVRworCQkJICAgICgiQ2hhbmdlaW5nIG1vZGUgZnJvbSBzb2Z0d2FyZSB3cmFwYXJvdW5kIHRvIGhhcmR3YXJlIHdyYXBhcm91bmQuXG4iKTsKKwkJCS8vQ29weSBhbGwgZGF0YQorCQkJY291bnQgPQorCQkJICAgIGFvX3dyaXRlX2RhdGEoaW5zdGFuY2UsIGNpcmNfYnVmZmVyX2NvdW50LAorCQkJCQkgIGluc3RhbmNlLT5wcmVsb2FkZWRfY291bnQpOworCQkJY3RybCAmPSB+TUU0NjAwX0FPX0NUUkxfTU9ERV9NQVNLOworCQkJY3RybCB8PSBNRTQ2MDBfQU9fTU9ERV9XUkFQQVJPVU5EOworCQl9CisKKwkJaWYgKGluc3RhbmNlLT5wcmVsb2FkZWRfY291bnQgPT0gbWVfY2lyY19idWZfdmFsdWVzKCZpbnN0YW5jZS0+Y2lyY19idWYpKSB7CS8vUmVzZXQgcG9zaXRpb24gaW5kaWNhdG9yLgorCQkJaW5zdGFuY2UtPnByZWxvYWRlZF9jb3VudCA9IDA7CisJCX0gZWxzZSBpZiAoaW5zdGFuY2UtPnByZWxvYWRlZF9jb3VudCA+IG1lX2NpcmNfYnVmX3ZhbHVlcygmaW5zdGFuY2UtPmNpcmNfYnVmKSkgewkvL1RoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbmQhCisJCQlQRVJST1JfQ1JJVElDQUwKKwkJCSAgICAoIlBSRUxPQURFRCBNT1JFIFZBTFVFUyBUSEFOIEFSRSBJTiBCVUZGRVIhXG4iKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywKKwkJCQkJICAgICAgIGNwdV9mbGFncyk7CisJCQlNRV9TVUJERVZJQ0VfRVhJVDsKKwkJCXJldHVybiBNRV9FUlJOT19JTlRFUk5BTDsKKwkJfQorCX0KKworCS8vU2V0IHN0YXR1cyB0byAnd2FpdCBmb3Igc3RhcnQnCisJaW5zdGFuY2UtPnN0YXR1cyA9IGFvX3N0YXR1c19zdHJlYW1fcnVuX3dhaXQ7CisKKwlzdGF0dXMgPSBpbmwoaW5zdGFuY2UtPnN0YXR1c19yZWcpOworCS8vU3RhcnQgc3RhdGUgbWFjaGluZSBhbmQgaW50ZXJydXB0cworCWN0cmwgJj0gfihNRTQ2MDBfQU9fQ1RSTF9CSVRfU1RPUCB8IE1FNDYwMF9BT19DVFJMX0JJVF9JTU1FRElBVEVfU1RPUCk7CisJaWYgKGluc3RhbmNlLT5zdGFydF9tb2RlID09IE1FNDYwMF9BT19FWFRfVFJJRykgewkvLyBFeHRlcm5hbCB0cmlnZ2VyLgorCQlQSU5GTygiRXh0ZXJuYWwgdHJpZ2dlci5cbiIpOworCQljdHJsIHw9IE1FNDYwMF9BT19DVFJMX0JJVF9FTkFCTEVfRVhfVFJJRzsKKwl9CisJaWYgKCEoc3RhdHVzICYgTUU0NjAwX0FPX1NUQVRVU19CSVRfSEYpKSB7CS8vTW9yZSB0aGFuIGhhbGYhCisJCWlmICgoY3RybCAmIE1FNDYwMF9BT19DVFJMX01PREVfTUFTSykgPT0gTUU0NjAwX0FPX01PREVfQ09OVElOVU9VUykgewkvL0VuYWJsZSBJUlEgb25seSB3aGVuIGhhcmR3YXJlX2NvbnRpbm91cyBpcyBzZXQgYW5kIEZJRk8gaXMgbW9yZSB0aGFuIGhhbGYKKwkJCWN0cmwgJj0gfk1FNDYwMF9BT19DVFJMX0JJVF9SRVNFVF9JUlE7CisJCQljdHJsIHw9IE1FNDYwMF9BT19DVFJMX0JJVF9FTkFCTEVfSVJROworCQl9CisJfQorCW91dGwoY3RybCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgY3RybCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCisJLy9UcmlnZ2VyIG91dHB1dAorCWlmIChmbGFncyAmIE1FX0lPX1NJTkdMRV9UWVBFX1RSSUdfU1lOQ0hST05PVVMpIHsJLy9UcmlnZ2VyIG91dHB1dHMKKwkJc3Bpbl9sb2NrKGluc3RhbmNlLT5wcmVsb2FkX3JlZ19sb2NrKTsKKwkJc3luY2ggPSBpbmwoaW5zdGFuY2UtPnByZWxvYWRfcmVnKTsKKwkJLy9BZGQgY2hhbm5lbCB0byBzdGFydCBsaXN0CisJCW91dGwoc3luY2ggfCAoTUU0NjAwX0FPX1NZTkNfSE9MRCA8PCBpbnN0YW5jZS0+YW9faWR4KSwKKwkJICAgICBpbnN0YW5jZS0+cHJlbG9hZF9yZWcpOworCQlQREVCVUdfUkVHKCJwcmVsb2FkX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPnByZWxvYWRfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgc3luY2ggfCAoTUU0NjAwX0FPX1NZTkNfSE9MRCA8PCBpbnN0YW5jZS0+YW9faWR4KSk7CisKKwkJLy9GaXJlCisJCVBJTkZPCisJCSAgICAoIkZpcmVkIGFsbCBzb2Z0d2FyZSBzeW5jaHJvbm91cyBvdXRwdXRzIGJ5IHNvZnR3YXJlIHRyaWdnZXIuXG4iKTsKKwkJb3V0bCgweDgwMDAsIGluc3RhbmNlLT5zaW5nbGVfcmVnKTsKKwkJUERFQlVHX1JFRygic2luZ2xlX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPnNpbmdsZV9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIDB4ODAwMCk7CisKKwkJLy9SZXN0b3JlIHNhdmUgc2V0dGluZ3MKKwkJb3V0bChzeW5jaCwgaW5zdGFuY2UtPnByZWxvYWRfcmVnKTsKKwkJUERFQlVHX1JFRygicHJlbG9hZF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgIGluc3RhbmNlLT5wcmVsb2FkX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgc3luY2gpOworCQlzcGluX3VubG9jayhpbnN0YW5jZS0+cHJlbG9hZF9yZWdfbG9jayk7CisJfSBlbHNlIGlmICghaW5zdGFuY2UtPnN0YXJ0X21vZGUpIHsJLy9UcmlnZ2VyIG91dHB1dHMKKy8qCisJCS8vUmVtb3ZlIGNoYW5uZWwgZnJvbSBzdGFydCBsaXN0LgkvLyA8PT0gVW5uZWNlc3NhcnkuIFJlbW92ZWQuCisJCXNwaW5fbG9jayhpbnN0YW5jZS0+cHJlbG9hZF9yZWdfbG9jayk7CisJCQlzeW5jaCA9IGlubChpbnN0YW5jZS0+cHJlbG9hZF9yZWcpOworCQkJb3V0bChzeW5jaCAmIH4oTUU0NjAwX0FPX1NZTkNfSE9MRCA8PCBpbnN0YW5jZS0+YW9faWR4KSwgaW5zdGFuY2UtPnByZWxvYWRfcmVnKTsKKwkJCVBERUJVR19SRUcoInByZWxvYWRfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwgaW5zdGFuY2UtPnByZWxvYWRfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCBzeW5jaCAmIH4oTUU0NjAwX0FPX1NZTkNfSE9MRCA8PCBpbnN0YW5jZS0+YW9faWR4KSk7CisqLworCQkvL0ZpcmUKKwkJUElORk8oIlNvZnR3YXJlIHRyaWdnZXIuXG4iKTsKKwkJb3V0bCgweDgwMDAsIGluc3RhbmNlLT5zaW5nbGVfcmVnKTsKKwkJUERFQlVHX1JFRygic2luZ2xlX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPnNpbmdsZV9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIDB4ODAwMCk7CisKKy8qCisJCQkvL1Jlc3RvcmUgc2F2ZSBzZXR0aW5ncy4JLy8gPD09IFVubmVjZXNzYXJ5LiBSZW1vdmVkLgorCQkJb3V0bChzeW5jaCwgaW5zdGFuY2UtPnByZWxvYWRfcmVnKTsKKwkJCVBERUJVR19SRUcoInByZWxvYWRfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwgaW5zdGFuY2UtPnByZWxvYWRfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCBzeW5jaCk7CisJCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5wcmVsb2FkX3JlZ19sb2NrKTsKKyovCisJfQorCS8vIFNldCBjb250cm9sIHRhc2sncyB0aW1lb3V0CisJcmVmID0gamlmZmllczsKKwlpbnN0YW5jZS0+dGltZW91dC5kZWxheSA9IGRlbGF5OworCWluc3RhbmNlLT50aW1lb3V0LnN0YXJ0X3RpbWUgPSByZWY7CisKKwlpZiAoc3RhdHVzICYgTUU0NjAwX0FPX1NUQVRVU19CSVRfSEYpIHsJLy9MZXNzIHRoYW4gaGFsZiBidXQgbm90IGVtcHR5IQorCQlQSU5GTygiTGVzcyB0aGFuIGhhbGYuXG4iKTsKKwkJaWYgKGluc3RhbmNlLT5zdG9wX2RhdGFfY291bnQgIT0gMCkgeworCQkJY291bnQgPSBNRTQ2MDBfQU9fRklGT19DT1VOVCAvIDI7CisJCX0gZWxzZSB7CisJCQljb3VudCA9CisJCQkgICAgKChNRTQ2MDBfQU9fRklGT19DT1VOVCAvIDIpIDwKKwkJCSAgICAgaW5zdGFuY2UtPnN0b3BfZGF0YV9jb3VudCkgPyBNRTQ2MDBfQU9fRklGT19DT1VOVCAvCisJCQkgICAgMiA6IGluc3RhbmNlLT5zdG9wX2RhdGFfY291bnQ7CisJCX0KKworCQkvL0NvcHkgZGF0YQorCQljb3VudCA9CisJCSAgICBhb193cml0ZV9kYXRhKGluc3RhbmNlLCBjb3VudCwgaW5zdGFuY2UtPnByZWxvYWRlZF9jb3VudCk7CisKKwkJaWYgKGNvdW50IDwgMCkgewkvL1RoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbmQhCisJCQlQRVJST1JfQ1JJVElDQUwoIkNPUFkgRklOSVNIIFdJVEggRVJST1IhXG4iKTsKKwkJCU1FX1NVQkRFVklDRV9FWElUOworCQkJcmV0dXJuIE1FX0VSUk5PX0lOVEVSTkFMOworCQl9CisKKwkJaWYgKGluc3RhbmNlLT5tb2RlID09IE1FNDYwMF9BT19DT05USU5PVVMpIHsJLy9Db250aW5vdXMKKwkJCWluc3RhbmNlLT5jaXJjX2J1Zi50YWlsICs9IGNvdW50OworCQkJaW5zdGFuY2UtPmNpcmNfYnVmLnRhaWwgJj0gaW5zdGFuY2UtPmNpcmNfYnVmLm1hc2s7CisJCX0gZWxzZSB7CS8vV3JhcGFyb3VuZAorCQkJaW5zdGFuY2UtPmRhdGFfY291bnQgKz0gY291bnQ7CisJCQlpbnN0YW5jZS0+cHJlbG9hZGVkX2NvdW50ICs9IGNvdW50OworCisJCQlpZiAoaW5zdGFuY2UtPnByZWxvYWRlZF9jb3VudCA9PSBtZV9jaXJjX2J1Zl92YWx1ZXMoJmluc3RhbmNlLT5jaXJjX2J1ZikpIHsJLy9SZXNldCBwb3NpdGlvbiBpbmRpY2F0b3IuCisJCQkJaW5zdGFuY2UtPnByZWxvYWRlZF9jb3VudCA9IDA7CisJCQl9IGVsc2UgaWYgKGluc3RhbmNlLT5wcmVsb2FkZWRfY291bnQgPiBtZV9jaXJjX2J1Zl92YWx1ZXMoJmluc3RhbmNlLT5jaXJjX2J1ZikpIHsJLy9UaGlzIHNob3VsZCBuZXZlciBoYXBwZW5kIQorCQkJCVBFUlJPUl9DUklUSUNBTAorCQkJCSAgICAoIlBSRUxPQURFRCBNT1JFIFZBTFVFUyBUSEFOIEFSRSBJTiBCVUZGRVIhXG4iKTsKKwkJCQlNRV9TVUJERVZJQ0VfRVhJVDsKKwkJCQlyZXR1cm4gTUVfRVJSTk9fSU5URVJOQUw7CisJCQl9CisJCX0KKworCQlzdGF0dXMgPSBpbmwoaW5zdGFuY2UtPnN0YXR1c19yZWcpOworCQlpZiAoIShzdGF0dXMgJiBNRTQ2MDBfQU9fU1RBVFVTX0JJVF9IRikpIHsJLy9Nb3JlIHRoYW4gaGFsZiEKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisJCQljdHJsID0gaW5sKGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCQljdHJsICY9IH5NRTQ2MDBfQU9fQ1RSTF9CSVRfUkVTRVRfSVJROworCQkJY3RybCB8PSBNRTQ2MDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0lSUTsKKwkJCW91dGwoY3RybCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICBjdHJsKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywKKwkJCQkJICAgICAgIGNwdV9mbGFncyk7CisJCX0KKwl9CisJLy9TcGVjaWFsIGNhc2U6IExpbWl0ZWQgd3JhcGFyb3VuZCB3aXRoIGxlc3MgdGhhbiBIQUxGIEZJRk8gZGF0YXMgbmVlZCB3b3JrIGFyb3VuZCB0byBnZW5lcmF0ZSBmaXJzdCBpbnRlcnJ1cHQuCisJaWYgKChpbnN0YW5jZS0+c3RvcF9tb2RlICE9IE1FNDYwMF9BT19JTkZfU1RPUF9NT0RFKQorCSAgICAmJiAoaW5zdGFuY2UtPm1vZGUgPT0gTUU0NjAwX0FPX1NXX1dSQVBfTU9ERSkKKwkgICAgJiYgKGNpcmNfYnVmZmVyX2NvdW50IDw9IChNRTQ2MDBfQU9fRklGT19DT1VOVCAvIDIpKSkgewkvL1B1dCBtb3JlIGRhdGEgdG8gRklGTworCQlQSU5GTygiTGltaXRlZCB3cmFwYXJvdW5kIHdpdGggbGVzcyB0aGFuIEhBTEYgRklGTyBkYXRhcy5cbiIpOworCQlpZiAoaW5zdGFuY2UtPnByZWxvYWRlZF9jb3VudCkgewkvL1RoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbmQhCisJCQlQRVJST1JfQ1JJVElDQUwKKwkJCSAgICAoIkVSUk9SIFdIRU4gTE9BRElORyBWQUxVRVMgRk9SIFdSQVBBUk9VTkQhXG4iKTsKKwkJCU1FX1NVQkRFVklDRV9FWElUOworCQkJcmV0dXJuIE1FX0VSUk5PX0lOVEVSTkFMOworCQl9CisKKwkJd2hpbGUgKGluc3RhbmNlLT5zdG9wX2RhdGFfY291bnQgPiBpbnN0YW5jZS0+ZGF0YV9jb3VudCkgewkvL01heGltdW0gZGF0YSBub3Qgc2V0IGpldC4KKwkJCS8vQ29weSB0byBidWZmZXIKKwkJCWlmIChjaXJjX2J1ZmZlcl9jb3VudCAhPSBhb193cml0ZV9kYXRhKGluc3RhbmNlLCBjaXJjX2J1ZmZlcl9jb3VudCwgMCkpIHsJLy9UaGlzIHNob3VsZCBuZXZlciBoYXBwZW5kIQorCQkJCVBFUlJPUl9DUklUSUNBTAorCQkJCSAgICAoIkVSUk9SIFdIRU4gTE9BRElORyBWQUxVRVMgRk9SIFdSQVBBUk9VTkQhXG4iKTsKKwkJCQlNRV9TVUJERVZJQ0VfRVhJVDsKKwkJCQlyZXR1cm4gTUVfRVJSTk9fSU5URVJOQUw7CisJCQl9CisJCQlpbnN0YW5jZS0+ZGF0YV9jb3VudCArPSBjaXJjX2J1ZmZlcl9jb3VudDsKKworCQkJaWYgKCEoKHN0YXR1cyA9IGlubChpbnN0YW5jZS0+c3RhdHVzX3JlZykpICYgTUU0NjAwX0FPX1NUQVRVU19CSVRfSEYpKSB7CS8vRklGTyBpcyBtb3JlIHRoYW4gaGFsZi4gRW5hYmxlIElSUSBhbmQgZW5kIGNvcHkuCisJCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywKKwkJCQkJCSAgY3B1X2ZsYWdzKTsKKwkJCQljdHJsID0gaW5sKGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCQkJY3RybCAmPSB+TUU0NjAwX0FPX0NUUkxfQklUX1JFU0VUX0lSUTsKKwkJCQljdHJsIHw9IE1FNDYwMF9BT19DVFJMX0JJVF9FTkFCTEVfSVJROworCQkJCW91dGwoY3RybCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJCQlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtCisJCQkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwgY3RybCk7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPgorCQkJCQkJICAgICAgIHN1YmRldmljZV9sb2NrLAorCQkJCQkJICAgICAgIGNwdV9mbGFncyk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisJLy8gU2NoZWR1bGUgY29udHJvbCB0YXNrLgorCWluc3RhbmNlLT5hb19jb250cm9sX3Rhc2tfZmxhZyA9IDE7CisJcXVldWVfZGVsYXllZF93b3JrKGluc3RhbmNlLT5tZTQ2MDBfd29ya3F1ZXVlLAorCQkJICAgJmluc3RhbmNlLT5hb19jb250cm9sX3Rhc2ssIDEpOworCisJaWYgKHN0YXJ0X21vZGUgPT0gTUVfU1RBUlRfTU9ERV9CTE9DS0lORykgewkvL1dhaXQgZm9yIHN0YXJ0LgorCQkvL09ubHkgcnVuaW5nIHByb2Nlc3Mgd2lsbCBpbnRlcnJ1cHQgdGhpcyBjYWxsLiBFdmVudHMgYXJlIHNpZ25hbGVkIHdoZW4gc3RhdHVzIGNoYW5nZS4gRXh0cmEgdGltZW91dCBhZGQgZm9yIHNhZmUgcmVhc29uLgorCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChpbnN0YW5jZS0+d2FpdF9xdWV1ZSwKKwkJCQkJCSAoaW5zdGFuY2UtPnN0YXR1cyAhPQorCQkJCQkJICBhb19zdGF0dXNfc3RyZWFtX3J1bl93YWl0KSwKKwkJCQkJCSAoZGVsYXkpID8gZGVsYXkgKworCQkJCQkJIDEgOiBMT05HX01BWCk7CisKKwkJaWYgKChpbnN0YW5jZS0+c3RhdHVzICE9IGFvX3N0YXR1c19zdHJlYW1fcnVuKQorCQkgICAgJiYgKGluc3RhbmNlLT5zdGF0dXMgIT0gYW9fc3RhdHVzX3N0cmVhbV9lbmQpKSB7CisJCQlQREVCVUcoIlN0YXJ0aW5nIHN0cmVhbSBjYW5jZWxlZC4gJWRcbiIsCisJCQkgICAgICAgaW5zdGFuY2UtPnN0YXR1cyk7CisJCQllcnIgPSBNRV9FUlJOT19DQU5DRUxMRUQ7CisJCX0KKworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCVBFUlJPUigiV2FpdCBvbiBzdGFydCBvZiBzdGF0ZSBtYWNoaW5lIGludGVycnVwdGVkLlxuIik7CisJCQlpbnN0YW5jZS0+c3RhdHVzID0gYW9fc3RhdHVzX25vbmU7CisJCQlhb19zdG9wX2ltbWVkaWF0ZWx5KGluc3RhbmNlKTsKKwkJCWVyciA9IE1FX0VSUk5PX1NJR05BTDsKKwkJfSBlbHNlIGlmICgoZGVsYXkpICYmICgoamlmZmllcyAtIHJlZikgPj0gZGVsYXkpKSB7CisJCQlpZiAoaW5zdGFuY2UtPnN0YXR1cyAhPSBhb19zdGF0dXNfc3RyZWFtX3J1bikgeworCQkJCWlmIChpbnN0YW5jZS0+c3RhdHVzID09IGFvX3N0YXR1c19zdHJlYW1fZW5kKSB7CisJCQkJCVBERUJVRygiVGltZW91dCByZWFjaGVkLlxuIik7CisJCQkJfSBlbHNlIHsKKwkJCQkJaWYgKChqaWZmaWVzIC0gcmVmKSA+IGRlbGF5KSB7CisJCQkJCQlQRVJST1IKKwkJCQkJCSAgICAoIlRpbWVvdXQgcmVhY2hlZC4gTm90IGhhbmRsZWQgYnkgY29udHJvbCB0YXNrIVxuIik7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlQRVJST1IKKwkJCQkJCSAgICAoIlRpbWVvdXQgcmVhY2hlZC4gU2lnbmFsIGNvbWUgYnV0IHN0YXR1cyBpcyBzdHJhbmdlOiAlZFxuIiwKKwkJCQkJCSAgICAgaW5zdGFuY2UtPnN0YXR1cyk7CisJCQkJCX0KKwkJCQkJYW9fc3RvcF9pbW1lZGlhdGVseShpbnN0YW5jZSk7CisJCQkJfQorCisJCQkJaW5zdGFuY2UtPmFvX2NvbnRyb2xfdGFza19mbGFnID0gMDsKKwkJCQljYW5jZWxfZGVsYXllZF93b3JrKCZpbnN0YW5jZS0+YW9fY29udHJvbF90YXNrKTsKKwkJCQlpbnN0YW5jZS0+c3RhdHVzID0gYW9fc3RhdHVzX3N0cmVhbV9lbmQ7CisJCQkJZXJyID0gTUVfRVJSTk9fVElNRU9VVDsKKwkJCX0KKwkJfQorCX0KKworCU1FX1NVQkRFVklDRV9FWElUOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWU0NjAwX2FvX2lvX3N0cmVhbV9zdGF0dXMobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICAgIGludCB3YWl0LAorCQkJCSAgICAgIGludCAqc3RhdHVzLCBpbnQgKnZhbHVlcywgaW50IGZsYWdzKQoreworCW1lNDYwMF9hb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisKKwlpbnN0YW5jZSA9IChtZTQ2MDBfYW9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJUERFQlVHKCJleGVjdXRlZC4gaWR4PSVkXG4iLCBpbnN0YW5jZS0+YW9faWR4KTsKKworCWlmICghaW5zdGFuY2UtPmZpZm8pIHsKKwkJUEVSUk9SKCJOb3QgYSBzdHJlYW1pbmcgYW8uXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX05PVF9TVVBQT1JURUQ7CisJfQorCisJaWYgKGZsYWdzKSB7CisJCVBFUlJPUigiSW52YWxpZCBmbGFnIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlpZiAoKHdhaXQgIT0gTUVfV0FJVF9OT05FKSAmJiAod2FpdCAhPSBNRV9XQUlUX0lETEUpKSB7CisJCVBFUlJPUigiSW52YWxpZCB3YWl0IGFyZ3VtZW50IHNwZWNpZmllZC5cbiIpOworCQkqc3RhdHVzID0gTUVfU1RBVFVTX0lOVkFMSUQ7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1dBSVQ7CisJfQorCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJc3dpdGNoIChpbnN0YW5jZS0+c3RhdHVzKSB7CisJY2FzZSBhb19zdGF0dXNfc2luZ2xlX2NvbmZpZ3VyZWQ6CisJY2FzZSBhb19zdGF0dXNfc2luZ2xlX2VuZDoKKwljYXNlIGFvX3N0YXR1c19zdHJlYW1fY29uZmlndXJlZDoKKwljYXNlIGFvX3N0YXR1c19zdHJlYW1fZW5kOgorCWNhc2UgYW9fc3RhdHVzX3N0cmVhbV9maWZvX2Vycm9yOgorCWNhc2UgYW9fc3RhdHVzX3N0cmVhbV9idWZmZXJfZXJyb3I6CisJY2FzZSBhb19zdGF0dXNfc3RyZWFtX2Vycm9yOgorCQkqc3RhdHVzID0gTUVfU1RBVFVTX0lETEU7CisJCWJyZWFrOworCisJY2FzZSBhb19zdGF0dXNfc2luZ2xlX3J1bl93YWl0OgorCWNhc2UgYW9fc3RhdHVzX3NpbmdsZV9ydW46CisJY2FzZSBhb19zdGF0dXNfc2luZ2xlX2VuZF93YWl0OgorCWNhc2UgYW9fc3RhdHVzX3N0cmVhbV9ydW5fd2FpdDoKKwljYXNlIGFvX3N0YXR1c19zdHJlYW1fcnVuOgorCWNhc2UgYW9fc3RhdHVzX3N0cmVhbV9lbmRfd2FpdDoKKwkJKnN0YXR1cyA9IE1FX1NUQVRVU19CVVNZOworCQlicmVhazsKKworCWNhc2UgYW9fc3RhdHVzX25vbmU6CisJZGVmYXVsdDoKKwkJKnN0YXR1cyA9CisJCSAgICAoaW5sKGluc3RhbmNlLT5zdGF0dXNfcmVnKSAmIE1FNDYwMF9BT19TVEFUVVNfQklUX0ZTTSkgPworCQkgICAgTUVfU1RBVFVTX0JVU1kgOiBNRV9TVEFUVVNfSURMRTsKKwkJYnJlYWs7CisJfQorCisJaWYgKCh3YWl0ID09IE1FX1dBSVRfSURMRSkgJiYgKCpzdGF0dXMgPT0gTUVfU1RBVFVTX0JVU1kpKSB7CisJCS8vT25seSBydW5pbmcgcHJvY2VzcyB3aWxsIGludGVycnVwdCB0aGlzIGNhbGwuIEV2ZW50cyBhcmUgc2lnbmFsZWQgd2hlbiBzdGF0dXMgY2hhbmdlLiBFeHRyYSB0aW1lb3V0IGFkZCBmb3Igc2FmZSByZWFzb24uCisJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KGluc3RhbmNlLT53YWl0X3F1ZXVlLAorCQkJCQkJICgoaW5zdGFuY2UtPnN0YXR1cyAhPQorCQkJCQkJICAgYW9fc3RhdHVzX3NpbmdsZV9ydW5fd2FpdCkKKwkJCQkJCSAgJiYgKGluc3RhbmNlLT5zdGF0dXMgIT0KKwkJCQkJCSAgICAgIGFvX3N0YXR1c19zaW5nbGVfcnVuKQorCQkJCQkJICAmJiAoaW5zdGFuY2UtPnN0YXR1cyAhPQorCQkJCQkJICAgICAgYW9fc3RhdHVzX3NpbmdsZV9lbmRfd2FpdCkKKwkJCQkJCSAgJiYgKGluc3RhbmNlLT5zdGF0dXMgIT0KKwkJCQkJCSAgICAgIGFvX3N0YXR1c19zdHJlYW1fcnVuX3dhaXQpCisJCQkJCQkgICYmIChpbnN0YW5jZS0+c3RhdHVzICE9CisJCQkJCQkgICAgICBhb19zdGF0dXNfc3RyZWFtX3J1bikKKwkJCQkJCSAgJiYgKGluc3RhbmNlLT5zdGF0dXMgIT0KKwkJCQkJCSAgICAgIGFvX3N0YXR1c19zdHJlYW1fZW5kX3dhaXQpKSwKKwkJCQkJCSBMT05HX01BWCk7CisKKwkJaWYgKGluc3RhbmNlLT5zdGF0dXMgIT0gYW9fc3RhdHVzX3N0cmVhbV9lbmQpIHsKKwkJCVBERUJVRygiV2FpdCBmb3IgSURMRSBjYW5jZWxlZC4gJWRcbiIsCisJCQkgICAgICAgaW5zdGFuY2UtPnN0YXR1cyk7CisJCQllcnIgPSBNRV9FUlJOT19DQU5DRUxMRUQ7CisJCX0KKworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCVBFUlJPUigiV2FpdCBmb3IgSURMRSBpbnRlcnJ1cHRlZC5cbiIpOworCQkJaW5zdGFuY2UtPnN0YXR1cyA9IGFvX3N0YXR1c19ub25lOworCQkJYW9fc3RvcF9pbW1lZGlhdGVseShpbnN0YW5jZSk7CisJCQllcnIgPSBNRV9FUlJOT19TSUdOQUw7CisJCX0KKworCQkqc3RhdHVzID0gTUVfU1RBVFVTX0lETEU7CisJfQorCisJKnZhbHVlcyA9IG1lX2NpcmNfYnVmX3NwYWNlKCZpbnN0YW5jZS0+Y2lyY19idWYpOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lNDYwMF9hb19pb19zdHJlYW1fc3RvcChtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICBpbnQgc3RvcF9tb2RlLCBpbnQgZmxhZ3MpCit7CQkJCS8vIFN0b3Agd29yayBhbmQgZW1wdHkgYnVmZmVyIGFuZCBGSUZPCisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJbWU0NjAwX2FvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwl1bnNpZ25lZCBsb25nIGNwdV9mbGFnczsKKwl2b2xhdGlsZSB1aW50MzJfdCBjdHJsOworCisJaW5zdGFuY2UgPSAobWU0NjAwX2FvX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCVBERUJVRygiZXhlY3V0ZWQuIGlkeD0lZFxuIiwgaW5zdGFuY2UtPmFvX2lkeCk7CisKKwlpZiAoZmxhZ3MgJiB+TUVfSU9fU1RSRUFNX1NUT1BfUFJFU0VSVkVfQlVGRkVSUykgeworCQlQRVJST1IoIkludmFsaWQgZmxhZyBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJfQorCisJaWYgKChzdG9wX21vZGUgIT0gTUVfU1RPUF9NT0RFX0lNTUVESUFURSkKKwkgICAgJiYgKHN0b3BfbW9kZSAhPSBNRV9TVE9QX01PREVfTEFTVF9WQUxVRSkpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIHN0b3AgbW9kZSBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfU1RPUF9NT0RFOworCX0KKworCWlmICghaW5zdGFuY2UtPmZpZm8pIHsKKwkJUEVSUk9SKCJOb3QgYSBzdHJlYW1pbmcgYW8uXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX05PVF9TVVBQT1JURUQ7CisJfQorCisJaWYgKGluc3RhbmNlLT5zdGF0dXMgPCBhb19zdGF0dXNfc3RyZWFtX2NvbmZpZ3VyZWQpIHsKKwkJLy9UaGVyZSBpcyBub3RoaW5nIHRvIHN0b3AhCisJCVBFUlJPUigiU3ViZGV2aWNlIG5vdCBpbiBzdHJlYW1pbmcgbW9kZS4gJWRcbiIsCisJCSAgICAgICBpbnN0YW5jZS0+c3RhdHVzKTsKKwkJcmV0dXJuIE1FX0VSUk5PX1BSRVZJT1VTX0NPTkZJRzsKKwl9CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwkvL01hcmsgYXMgc3RvcHBpbmcuID0+IFNvZnR3YXJlIHN0b3AuCisJaW5zdGFuY2UtPnN0YXR1cyA9IGFvX3N0YXR1c19zdHJlYW1fZW5kX3dhaXQ7CisKKwlpZiAoc3RvcF9tb2RlID09IE1FX1NUT1BfTU9ERV9JTU1FRElBVEUpIHsJLy9TdG9wcGVkIG5vdyEKKwkJZXJyID0gYW9fc3RvcF9pbW1lZGlhdGVseShpbnN0YW5jZSk7CisJfSBlbHNlIGlmIChzdG9wX21vZGUgPT0gTUVfU1RPUF9NT0RFX0xBU1RfVkFMVUUpIHsKKwkJY3RybCA9IGlubChpbnN0YW5jZS0+Y3RybF9yZWcpICYgTUU0NjAwX0FPX0NUUkxfTU9ERV9NQVNLOworCQlpZiAoY3RybCA9PSBNRTQ2MDBfQU9fTU9ERV9XUkFQQVJPVU5EKSB7CS8vSGFyZHdhcmUgd3JhcGFyb3VuZCA9PiBIYXJkd2FyZSBzdG9wLgorCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKwkJCWN0cmwgPSBpbmwoaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJCWN0cmwgfD0KKwkJCSAgICBNRTQ2MDBfQU9fQ1RSTF9CSVRfU1RPUCB8CisJCQkgICAgTUU0NjAwX0FPX0NUUkxfQklUX1JFU0VUX0lSUTsKKwkJCWN0cmwgJj0gfk1FNDYwMF9BT19DVFJMX0JJVF9FTkFCTEVfSVJROworCQkJb3V0bChjdHJsLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQkJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIGN0cmwpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLAorCQkJCQkgICAgICAgY3B1X2ZsYWdzKTsKKwkJfQorCQkvL09ubHkgcnVuaW5nIHByb2Nlc3Mgd2lsbCBpbnRlcnJ1cHQgdGhpcyBjYWxsLiBFdmVudHMgYXJlIHNpZ25hbGVkIHdoZW4gc3RhdHVzIGNoYW5nZS4KKwkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoaW5zdGFuY2UtPndhaXRfcXVldWUsCisJCQkJCQkgKGluc3RhbmNlLT5zdGF0dXMgIT0KKwkJCQkJCSAgYW9fc3RhdHVzX3N0cmVhbV9lbmRfd2FpdCksCisJCQkJCQkgTE9OR19NQVgpOworCisJCWlmIChpbnN0YW5jZS0+c3RhdHVzICE9IGFvX3N0YXR1c19zdHJlYW1fZW5kKSB7CisJCQlQREVCVUcoIlN0b3BwaW5nIHN0cmVhbSBjYW5jZWxlZC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fQ0FOQ0VMTEVEOworCQl9CisKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQlQRVJST1IoIlN0b3BwaW5nIHN0cmVhbSBpbnRlcnJ1cHRlZC5cbiIpOworCQkJaW5zdGFuY2UtPnN0YXR1cyA9IGFvX3N0YXR1c19ub25lOworCQkJYW9fc3RvcF9pbW1lZGlhdGVseShpbnN0YW5jZSk7CisJCQllcnIgPSBNRV9FUlJOT19TSUdOQUw7CisJCX0KKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCWN0cmwgPSBpbmwoaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwljdHJsIHw9CisJICAgIE1FNDYwMF9BT19DVFJMX0JJVF9TVE9QIHwgTUU0NjAwX0FPX0NUUkxfQklUX0lNTUVESUFURV9TVE9QIHwKKwkgICAgTUU0NjAwX0FPX0NUUkxfQklUX1JFU0VUX0lSUTsKKwljdHJsICY9IH5NRTQ2MDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0lSUTsKKwlpZiAoIWZsYWdzKSB7CQkvL1Jlc2V0IEZJRk8KKwkJY3RybCAmPSB+TUU0NjAwX0FPX0NUUkxfQklUX0VOQUJMRV9GSUZPOworCX0KKwlvdXRsKGN0cmwsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIGN0cmwpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKworCWlmICghZmxhZ3MpIHsJCS8vUmVzZXQgc29mdHdhcmUgYnVmZmVyCisJCWluc3RhbmNlLT5jaXJjX2J1Zi5oZWFkID0gMDsKKwkJaW5zdGFuY2UtPmNpcmNfYnVmLnRhaWwgPSAwOworCQlpbnN0YW5jZS0+cHJlbG9hZGVkX2NvdW50ID0gMDsKKwkJaW5zdGFuY2UtPmRhdGFfY291bnQgPSAwOworCX0KKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZTQ2MDBfYW9faW9fc3RyZWFtX3dyaXRlKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICAgaW50IHdyaXRlX21vZGUsCisJCQkJICAgICBpbnQgKnZhbHVlcywgaW50ICpjb3VudCwgaW50IGZsYWdzKQoreworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCW1lNDYwMF9hb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJdW5zaWduZWQgbG9uZyBjcHVfZmxhZ3MgPSAwOworCXVpbnQzMl90IHJlZ19jb3B5OworCisJaW50IGNvcGllZF9mcm9tX3VzZXIgPSAwOworCWludCBsZWZ0X3RvX2NvcHlfZnJvbV91c2VyID0gKmNvdW50OworCisJaW50IGNvcGllZF92YWx1ZXM7CisKKwlpbnN0YW5jZSA9IChtZTQ2MDBfYW9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJUERFQlVHKCJleGVjdXRlZC4gaWR4PSVkXG4iLCBpbnN0YW5jZS0+YW9faWR4KTsKKworCS8vQ2hlY2tpbmcgYXJndW1lbnRzCisJaWYgKCFpbnN0YW5jZS0+ZmlmbykgeworCQlQRVJST1IoIk5vdCBhIHN0cmVhbWluZyBhby5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fTk9UX1NVUFBPUlRFRDsKKwl9CisKKwlpZiAoZmxhZ3MpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWcgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCWlmICgqY291bnQgPD0gMCkgeworCQlQRVJST1IoIkludmFsaWQgY291bnQgb2YgdmFsdWVzIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9WQUxVRV9DT1VOVDsKKwl9CisKKwlpZiAodmFsdWVzID09IE5VTEwpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGFkZHJlc3Mgb2YgdmFsdWVzIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9QT0lOVEVSOworCX0KKworCWlmICgoaW5zdGFuY2UtPnN0YXR1cyA9PSBhb19zdGF0dXNfbm9uZSkgfHwgKGluc3RhbmNlLT5zdGF0dXMgPT0gYW9fc3RhdHVzX3NpbmdsZV9jb25maWd1cmVkKSkgewkvL1RoZSBkZXZpY2UgaXMgaW4gc2luZ2xlIG1vZGUuCisJCVBFUlJPUgorCQkgICAgKCJTdWJkZXZpY2UgbXVzdCBiZSBwcmVpbml0aWFsaXplIGNvcnJlY3RseSBmb3Igc3RyZWFtaW5nLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19QUkVWSU9VU19DT05GSUc7CisJfQorLy8vIEBub3RlIElmIG5vICdwcmUtbG9hZCcgaXMgdXNlZC4gc3RyZWFtX3N0YXJ0KCkgd2lsbCBtb3ZlIGRhdGEgdG8gRklGTy4KKwlzd2l0Y2ggKHdyaXRlX21vZGUpIHsKKwljYXNlIE1FX1dSSVRFX01PREVfUFJFTE9BRDoKKworCQkvL0RldmljZSBtdXN0IGJlIHN0b3BwZWQuCisJCWlmICgoaW5zdGFuY2UtPnN0YXR1cyAhPSBhb19zdGF0dXNfc3RyZWFtX2NvbmZpZ3VyZWQpCisJCSAgICAmJiAoaW5zdGFuY2UtPnN0YXR1cyAhPSBhb19zdGF0dXNfc3RyZWFtX2VuZCkpIHsKKwkJCVBFUlJPUgorCQkJICAgICgiU3ViZGV2aWNlIG11c3RuJ3QgYmUgcnVuaW5nIHdoZW4gJ3ByZS1sb2FkJyBtb2RlIGlzIHVzZWQuXG4iKTsKKwkJCXJldHVybiBNRV9FUlJOT19QUkVWSU9VU19DT05GSUc7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBNRV9XUklURV9NT0RFX05PTkJMT0NLSU5HOgorCWNhc2UgTUVfV1JJVEVfTU9ERV9CTE9DS0lORzoKKwkJLy8vIEBub3RlIEluIGJsb2NraW5nIG1vZGU6IFdoZW4gZGV2aWNlIGlzIG5vdCBydW5pbmcgYW5kIHRoZXJlIGlzIG5vdCBlbm91Z2h0IHNwYWNlIGNhbGwgd2lsbCBibG9ja2VkIHVwIQorCQkvLy8gQG5vdGUgU29tZSBvdGhlciB0aHJlYWQgbXVzdCBlbXB0eSBidWZmZXIgYnkgc3RhcnRpbmcgZW5naW5lLgorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCVBFUlJPUigiSW52YWxpZCB3cml0ZSBtb2RlIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9XUklURV9NT0RFOworCX0KKworCWlmIChpbnN0YW5jZS0+bW9kZSAmIE1FNDYwMF9BT19XUkFQX01PREUpIHsJLy9XcmFwYXJvdW5kIG1vZGUuIERldmljZSBtdXN0IGJlIHN0b3BwZWQuCisJCWlmICgoaW5zdGFuY2UtPnN0YXR1cyAhPSBhb19zdGF0dXNfc3RyZWFtX2NvbmZpZ3VyZWQpCisJCSAgICAmJiAoaW5zdGFuY2UtPnN0YXR1cyAhPSBhb19zdGF0dXNfc3RyZWFtX2VuZCkpIHsKKwkJCVBFUlJPUgorCQkJICAgICgiU3ViZGV2aWNlIG11c3RuJ3QgYmUgcnVuaW5nIHdoZW4gJ3ByZS1sb2FkJyBtb2RlIGlzIHVzZWQuXG4iKTsKKwkJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1dSSVRFX01PREU7CisJCX0KKwl9CisKKwlpZiAoKGluc3RhbmNlLT5tb2RlID09IE1FNDYwMF9BT19IV19XUkFQX01PREUpICYmICh3cml0ZV9tb2RlICE9IE1FX1dSSVRFX01PREVfUFJFTE9BRCkpIHsJLy8gaGFyZHdhcmUgd3JhcF9hcm91bmQgbW9kZS4KKwkJLy9UaGlzIGlzIHRyYW5zcGFyZW50IGZvciB1c2VyLgorCQlQREVCVUcoIkNoYW5naW5nIHdyaXRlX21vZGUgdG8gTUVfV1JJVEVfTU9ERV9QUkVMT0FELlxuIik7CisJCXdyaXRlX21vZGUgPSBNRV9XUklURV9NT0RFX1BSRUxPQUQ7CisJfQorCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJaWYgKHdyaXRlX21vZGUgPT0gTUVfV1JJVEVfTU9ERV9QUkVMT0FEKSB7CS8vSW5pdCBlbnZpcm9tZW50IC0gcHJlbG9hZAorCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCQlyZWdfY29weSA9IGlubChpbnN0YW5jZS0+Y3RybF9yZWcpOworCQkvL0NoZWNrIEZJRk8KKwkJaWYgKCEocmVnX2NvcHkgJiBNRTQ2MDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0ZJRk8pKSB7CS8vRklGTyBub3QgYWN0aXZlLiBFbmFibGUgaXQuCisJCQlyZWdfY29weSB8PSBNRTQ2MDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0ZJRk87CisJCQlvdXRsKHJlZ19jb3B5LCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQkJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIHJlZ19jb3B5KTsKKwkJCWluc3RhbmNlLT5wcmVsb2FkZWRfY291bnQgPSAwOworCQl9CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKwl9CisKKwl3aGlsZSAoMSkgeworCQkvL0NvcHkgdG8gYnVmZmVyLiBUaGlzIHN0ZXAgaXMgY29tbW9uIGZvciBhbGwgbW9kZXMuCisJCWNvcGllZF9mcm9tX3VzZXIgPQorCQkgICAgYW9fZ2V0X2RhdGFfZnJvbV91c2VyKGluc3RhbmNlLCBsZWZ0X3RvX2NvcHlfZnJvbV91c2VyLAorCQkJCQkgIHZhbHVlcyArICgqY291bnQgLQorCQkJCQkJICAgIGxlZnRfdG9fY29weV9mcm9tX3VzZXIpKTsKKwkJbGVmdF90b19jb3B5X2Zyb21fdXNlciAtPSBjb3BpZWRfZnJvbV91c2VyOworCisJCXJlZ19jb3B5ID0gaW5sKGluc3RhbmNlLT5zdGF0dXNfcmVnKTsKKwkJaWYgKChpbnN0YW5jZS0+c3RhdHVzID09IGFvX3N0YXR1c19zdHJlYW1fcnVuKSAmJiAhKHJlZ19jb3B5ICYgTUU0NjAwX0FPX1NUQVRVU19CSVRfRlNNKSkgewkvL0JST0tFTiBQSVBFISBUaGUgc3RhdGUgbWFjaGluZSBpcyBzdG9wZWQgYnV0IGxvZ2ljYWwgc3RhdHVzIHNob3cgdGhhdCBzaG91bGQgYmUgd29ya2luZy4KKwkJCVBFUlJPUigiQnJva2VuIHBpcGUgaW4gd3JpdGUuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX1NVQkRFVklDRV9OT1RfUlVOTklORzsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKChpbnN0YW5jZS0+c3RhdHVzID09IGFvX3N0YXR1c19zdHJlYW1fcnVuKSAmJiAoaW5zdGFuY2UtPm1vZGUgPT0gTUU0NjAwX0FPX0NPTlRJTk9VUykgJiYgKHJlZ19jb3B5ICYgTUU0NjAwX0FPX1NUQVRVU19CSVRfSEYpKSB7CS8vQ29udGlub3VzIG1vZGUgcnVuaW5nIGFuZCBkYXRhIGFyZSBiZWxvdyBoYWxmIQorCisJCQkvLyBCbG9jayBpbnRlcnJ1cHRzLgorCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKwkJCXJlZ19jb3B5ID0gaW5sKGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCQkvL3JlZ19jb3B5ICY9IH5NRTQ2MDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0lSUTsKKwkJCXJlZ19jb3B5IHw9IE1FNDYwMF9BT19DVFJMX0JJVF9SRVNFVF9JUlE7CisJCQlvdXRsKHJlZ19jb3B5LCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQkJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIHJlZ19jb3B5KTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywKKwkJCQkJICAgICAgIGNwdV9mbGFncyk7CisKKwkJCS8vRmFzdCBjb3B5CisJCQljb3BpZWRfdmFsdWVzID0KKwkJCSAgICBhb193cml0ZV9kYXRhKGluc3RhbmNlLCBNRTQ2MDBfQU9fRklGT19DT1VOVCAvIDIsCisJCQkJCSAgMCk7CisJCQlpZiAoY29waWVkX3ZhbHVlcyA+IDApIHsKKwkJCQlpbnN0YW5jZS0+Y2lyY19idWYudGFpbCArPSBjb3BpZWRfdmFsdWVzOworCQkJCWluc3RhbmNlLT5jaXJjX2J1Zi50YWlsICY9CisJCQkJICAgIGluc3RhbmNlLT5jaXJjX2J1Zi5tYXNrOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJLy8gQWN0aXZhdGUgaW50ZXJydXB0cy4KKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisJCQlyZWdfY29weSA9IGlubChpbnN0YW5jZS0+Y3RybF9yZWcpOworCQkJLy9yZWdfY29weSB8PSBNRTQ2MDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0lSUTsKKwkJCXJlZ19jb3B5ICY9IH5NRTQ2MDBfQU9fQ1RSTF9CSVRfUkVTRVRfSVJROworCQkJb3V0bChyZWdfY29weSwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICByZWdfY29weSk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssCisJCQkJCSAgICAgICBjcHVfZmxhZ3MpOworCisJCQlpZiAoY29waWVkX3ZhbHVlcyA9PSAwKSB7CS8vVGhpcyB3YXMgY2hlY2tlZCBhbmQgbmV2ZXIgc2hvdWxkIGhhcHBlbmQhCisJCQkJUEVSUk9SX0NSSVRJQ0FMKCJDT1BJTkcgRklOSVNIIFdJVEggMCFcbiIpOworCQkJfQorCisJCQlpZiAoY29waWVkX3ZhbHVlcyA8IDApIHsJLy9UaGlzIHdhcyBjaGVja2VkIGFuZCBuZXZlciBzaG91bGQgaGFwcGVuZCEKKwkJCQlQRVJST1JfQ1JJVElDQUwKKwkJCQkgICAgKCJDT1BJTkcgRklOSVNIIFdJVEggQU4gRVJST1IhXG4iKTsKKwkJCQlpbnN0YW5jZS0+c3RhdHVzID0gYW9fc3RhdHVzX3N0cmVhbV9maWZvX2Vycm9yOworCQkJCWVyciA9IE1FX0VSUk5PX0ZJRk9fQlVGRkVSX09WRVJGTE9XOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJaWYgKCFsZWZ0X3RvX2NvcHlfZnJvbV91c2VyKSB7CS8vQWxsIGRhdGFzIHdlcmUgY29waWVkLgorCQkJYnJlYWs7CisJCX0gZWxzZSB7CS8vTm90IGFsbCBkYXRhcyB3ZXJlIGNvcGllZC4KKwkJCWlmIChpbnN0YW5jZS0+bW9kZSAmIE1FNDYwMF9BT19XUkFQX01PREUpIHsJLy9FcnJvciB0b28gbXVjaCBkYXRhcyEgV3JhcGFyb3VuZCBpcyBsaW1pdGVkIGluIHNpemUhCisJCQkJUEVSUk9SCisJCQkJICAgICgiVG9vIG11Y2ggZGF0YSBmb3Igd3JhcGFyb3VuZCBtb2RlISAgRXhjZWVkZWQgc2l6ZSBvZiAlbGQuXG4iLAorCQkJCSAgICAgTUU0NjAwX0FPX0NJUkNfQlVGX0NPVU5UIC0gMSk7CisJCQkJZXJyID0gTUVfRVJSTk9fUklOR19CVUZGRVJfT1ZFUkZMT1c7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWlmICh3cml0ZV9tb2RlICE9IE1FX1dSSVRFX01PREVfQkxPQ0tJTkcpIHsJLy9Ob24gYmxvY2tpbmcgY2FsbHMKKwkJCQlicmVhazsKKwkJCX0KKworCQkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGluc3RhbmNlLT53YWl0X3F1ZXVlLAorCQkJCQkJIG1lX2NpcmNfYnVmX3NwYWNlKCZpbnN0YW5jZS0+CisJCQkJCQkJCSAgIGNpcmNfYnVmKSk7CisKKwkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJCVBFUlJPUigiV3JpdGluZyBpbnRlcnJ1cHRlZCBieSBzaWduYWwuXG4iKTsKKwkJCQlpbnN0YW5jZS0+c3RhdHVzID0gYW9fc3RhdHVzX25vbmU7CisJCQkJYW9fc3RvcF9pbW1lZGlhdGVseShpbnN0YW5jZSk7CisJCQkJZXJyID0gTUVfRVJSTk9fU0lHTkFMOworCQkJCWJyZWFrOworCQkJfQorCisJCQlpZiAoaW5zdGFuY2UtPnN0YXR1cyA9PSBhb19zdGF0dXNfbm9uZSkgewkvL1Jlc2V0CisJCQkJUEVSUk9SKCJXcml0aW5nIGludGVycnVwdGVkIGJ5IHJlc2V0LlxuIik7CisJCQkJZXJyID0gTUVfRVJSTk9fQ0FOQ0VMTEVEOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJaWYgKHdyaXRlX21vZGUgPT0gTUVfV1JJVEVfTU9ERV9QUkVMT0FEKSB7CS8vQ29weSBkYXRhIHRvIEZJRk8gLSBwcmVsb2FkCisJCWNvcGllZF92YWx1ZXMgPQorCQkgICAgYW9fd3JpdGVfZGF0YV9wb29saW5nKGluc3RhbmNlLCBNRTQ2MDBfQU9fRklGT19DT1VOVCwKKwkJCQkJICBpbnN0YW5jZS0+cHJlbG9hZGVkX2NvdW50KTsKKwkJaW5zdGFuY2UtPnByZWxvYWRlZF9jb3VudCArPSBjb3BpZWRfdmFsdWVzOworCQlpbnN0YW5jZS0+ZGF0YV9jb3VudCArPSBjb3BpZWRfdmFsdWVzOworCisJCWlmICgoaW5zdGFuY2UtPm1vZGUgPT0gTUU0NjAwX0FPX0hXX1dSQVBfTU9ERSkKKwkJICAgICYmIChtZV9jaXJjX2J1Zl92YWx1ZXMoJmluc3RhbmNlLT5jaXJjX2J1ZikgPgorCQkJTUU0NjAwX0FPX0ZJRk9fQ09VTlQpKSB7CisJCQlQRVJST1IKKwkJCSAgICAoIlRvbyBtdWNoIGRhdGEgZm9yIGhhcmR3YXJlIHdyYXBhcm91bmQgbW9kZSEgRXhjZWVkZWQgc2l6ZSBvZiAlZC5cbiIsCisJCQkgICAgIE1FNDYwMF9BT19GSUZPX0NPVU5UKTsKKwkJCWVyciA9IE1FX0VSUk5PX0ZJRk9fQlVGRkVSX09WRVJGTE9XOworCQl9CisJfQorCisJKmNvdW50ID0gKmNvdW50IC0gbGVmdF90b19jb3B5X2Zyb21fdXNlcjsKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CitzdGF0aWMgaXJxcmV0dXJuX3QgbWU0NjAwX2FvX2lzcihpbnQgaXJxLCB2b2lkICpkZXZfaWQKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLCA2LCAxOSkKKwkJCQkgLCBzdHJ1Y3QgcHRfcmVncyAqcmVncworI2VuZGlmCisgICAgKQoreworCW1lNDYwMF9hb19zdWJkZXZpY2VfdCAqaW5zdGFuY2UgPSBkZXZfaWQ7CisJdWludDMyX3QgaXJxX3N0YXR1czsKKwl1aW50MzJfdCBjdHJsOworCXVpbnQzMl90IHN0YXR1czsKKwlpbnQgY291bnQgPSAwOworCisJUERFQlVHKCJleGVjdXRlZC4gaWR4PSVkXG4iLCBpbnN0YW5jZS0+YW9faWR4KTsKKworCWlmIChpcnEgIT0gaW5zdGFuY2UtPmlycSkgeworCQlQRVJST1IoIkluY29ycmVjdCBpbnRlcnJ1cHQgbnVtOiAlZC5cbiIsIGlycSk7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisKKwlpcnFfc3RhdHVzID0gaW5sKGluc3RhbmNlLT5pcnFfc3RhdHVzX3JlZyk7CisJaWYgKCEoaXJxX3N0YXR1cyAmIChNRTQ2MDBfSVJRX1NUQVRVU19CSVRfQU9fSEYgPDwgaW5zdGFuY2UtPmFvX2lkeCkpKSB7CisJCVBJTkZPKCIlbGQgU2hhcmVkIGludGVycnVwdC4gJXMoKTogSUQ9JWQ6IHN0YXR1c19yZWc9MHglMDRYXG4iLAorCQkgICAgICBqaWZmaWVzLCBfX2Z1bmNfXywgaW5zdGFuY2UtPmFvX2lkeCwgaXJxX3N0YXR1cyk7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisKKwlpZiAoIWluc3RhbmNlLT5jaXJjX2J1Zi5idWYpIHsKKwkJaW5zdGFuY2UtPnN0YXR1cyA9IGFvX3N0YXR1c19zdHJlYW1fZXJyb3I7CisJCVBFUlJPUl9DUklUSUNBTCgiQ0lSQ1VMQVIgQlVGRkVSIE5PVCBFWElTVFMhXG4iKTsKKwkJLy9CbG9jayBpbnRlcnJ1cHRzLiBTdG9wIG1hY2hpbmUuCisJCWN0cmwgPSBpbmwoaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJY3RybCAmPSB+TUU0NjAwX0FPX0NUUkxfQklUX0VOQUJMRV9JUlE7CisJCWN0cmwgfD0KKwkJICAgIE1FNDYwMF9BT19DVFJMX0JJVF9SRVNFVF9JUlEgfAorCQkgICAgTUU0NjAwX0FPX0NUUkxfQklUX0lNTUVESUFURV9TVE9QIHwgTUU0NjAwX0FPX0NUUkxfQklUX1NUT1A7CisJCW91dGwoY3RybCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgY3RybCk7CisKKwkJLy9JbmZvcm0gdXNlcgorCQl3YWtlX3VwX2ludGVycnVwdGlibGVfYWxsKCZpbnN0YW5jZS0+d2FpdF9xdWV1ZSk7CisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9CisKKwlzdGF0dXMgPSBpbmwoaW5zdGFuY2UtPnN0YXR1c19yZWcpOworCWlmICghKHN0YXR1cyAmIE1FNDYwMF9BT19TVEFUVVNfQklUX0ZTTSkpIHsJLy9Ub28gbGF0ZS4gTm90IHdvcmtpbmchIEVORD8gQlJPS0VOIFBJUEU/CisJCVBERUJVRygiSW50ZXJydXB0IGNvbWUgYnV0IElTTSBpcyBub3Qgd29ya2luZyFcbiIpOworCQkvL0Jsb2NrIGludGVycnVwdHMuIFN0b3AgbWFjaGluZS4KKwkJY3RybCA9IGlubChpbnN0YW5jZS0+Y3RybF9yZWcpOworCQljdHJsICY9IH5NRTQ2MDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0lSUTsKKwkJY3RybCB8PQorCQkgICAgTUU0NjAwX0FPX0NUUkxfQklUX1JFU0VUX0lSUSB8IE1FNDYwMF9BT19DVFJMX0JJVF9TVE9QIHwKKwkJICAgIE1FNDYwMF9BT19DVFJMX0JJVF9JTU1FRElBVEVfU1RPUDsKKwkJb3V0bChjdHJsLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCBjdHJsKTsKKworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQorCS8vR2VuZXJhbCBwcm9jZWR1cmUuIFByb2Nlc3MgbW9yZSBkYXRhcy4KKworI2lmZGVmIE1FREVCVUdfREVCVUcKKwlpZiAoIW1lX2NpcmNfYnVmX3ZhbHVlcygmaW5zdGFuY2UtPmNpcmNfYnVmKSkgewkvL0J1ZmZlciBpcyBlbXB0eSEKKwkJUERFQlVHKCJDaXJjdWxhciBidWZmZXIgZW1wdHkhXG4iKTsKKwl9CisjZW5kaWYKKworCS8vQ2hlY2sgRklGTworCWlmIChzdGF0dXMgJiBNRTQ2MDBfQU9fU1RBVFVTX0JJVF9IRikgewkvL09LIGxlc3MgdGhhbiBoYWxmCisKKwkJLy9CbG9jayBpbnRlcnJ1cHRzCisJCWN0cmwgPSBpbmwoaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJY3RybCAmPSB+TUU0NjAwX0FPX0NUUkxfQklUX0VOQUJMRV9JUlE7CisJCWN0cmwgfD0gTUU0NjAwX0FPX0NUUkxfQklUX1JFU0VUX0lSUTsKKwkJb3V0bChjdHJsLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCBjdHJsKTsKKworCQlkbyB7CisJCQkvL0NhbGN1bGF0ZSBob3cgbWFueSBzaG91bGQgYmUgY29waWVkLgorCQkJY291bnQgPQorCQkJICAgIChpbnN0YW5jZS0+c3RvcF9kYXRhX2NvdW50KSA/IGluc3RhbmNlLT4KKwkJCSAgICBzdG9wX2RhdGFfY291bnQgLQorCQkJICAgIGluc3RhbmNlLT5kYXRhX2NvdW50IDogTUU0NjAwX0FPX0ZJRk9fQ09VTlQgLyAyOworCQkJaWYgKE1FNDYwMF9BT19GSUZPX0NPVU5UIC8gMiA8IGNvdW50KSB7CisJCQkJY291bnQgPSBNRTQ2MDBfQU9fRklGT19DT1VOVCAvIDI7CisJCQl9CisJCQkvL0NvcHkgZGF0YQorCQkJaWYgKGluc3RhbmNlLT5tb2RlID09IE1FNDYwMF9BT19DT05USU5PVVMpIHsJLy9Db250aW5vdXMKKwkJCQljb3VudCA9IGFvX3dyaXRlX2RhdGEoaW5zdGFuY2UsIGNvdW50LCAwKTsKKwkJCQlpZiAoY291bnQgPiAwKSB7CisJCQkJCWluc3RhbmNlLT5jaXJjX2J1Zi50YWlsICs9IGNvdW50OworCQkJCQlpbnN0YW5jZS0+Y2lyY19idWYudGFpbCAmPQorCQkJCQkgICAgaW5zdGFuY2UtPmNpcmNfYnVmLm1hc2s7CisJCQkJCWluc3RhbmNlLT5kYXRhX2NvdW50ICs9IGNvdW50OworCisJCQkJCWlmICgoaW5zdGFuY2UtPnN0YXR1cyA9PSBhb19zdGF0dXNfc3RyZWFtX2VuZF93YWl0KSAmJiAhbWVfY2lyY19idWZfdmFsdWVzKCZpbnN0YW5jZS0+Y2lyY19idWYpKSB7CS8vU3RvcGluZy4gV2hvbGUgYnVmZmVyIHdhcyBjb3BpZWQuCisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCX0gZWxzZSBpZiAoKGluc3RhbmNlLT5tb2RlID09IE1FNDYwMF9BT19TV19XUkFQX01PREUpICYmICgoY3RybCAmIE1FNDYwMF9BT19DVFJMX01PREVfTUFTSykgPT0gTUU0NjAwX0FPX01PREVfQ09OVElOVU9VUykpIHsJLy9XcmFwYXJvdW5kIChzb2Z0d2FyZSkKKwkJCQlpZiAoaW5zdGFuY2UtPnN0YXR1cyA9PSBhb19zdGF0dXNfc3RyZWFtX2VuZF93YWl0KSB7CS8vV2Ugc3RvcGluZyA9PiBDb3B5IHRvIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlci4KKwkJCQkJY291bnQgPQorCQkJCQkgICAgYW9fd3JpdGVfZGF0YShpbnN0YW5jZSwgY291bnQsIDApOworCQkJCX0gZWxzZSB7CS8vQ29weSBpbiB3cmFwYXJvdW5kIG1vZGUuCisJCQkJCWNvdW50ID0KKwkJCQkJICAgIGFvX3dyaXRlX2RhdGFfd3JhcGFyb3VuZChpbnN0YW5jZSwKKwkJCQkJCQkJICAgICBjb3VudCwKKwkJCQkJCQkJICAgICBpbnN0YW5jZS0+CisJCQkJCQkJCSAgICAgcHJlbG9hZGVkX2NvdW50KTsKKwkJCQl9CisKKwkJCQlpZiAoY291bnQgPiAwKSB7CisJCQkJCWluc3RhbmNlLT5kYXRhX2NvdW50ICs9IGNvdW50OworCQkJCQlpbnN0YW5jZS0+cHJlbG9hZGVkX2NvdW50ICs9IGNvdW50OworCQkJCQlpbnN0YW5jZS0+cHJlbG9hZGVkX2NvdW50ICU9CisJCQkJCSAgICBtZV9jaXJjX2J1Zl92YWx1ZXMoJmluc3RhbmNlLT4KKwkJCQkJCQkgICAgICAgY2lyY19idWYpOworCisJCQkJCWlmICgoaW5zdGFuY2UtPnN0YXR1cyA9PSBhb19zdGF0dXNfc3RyZWFtX2VuZF93YWl0KSAmJiAhaW5zdGFuY2UtPnByZWxvYWRlZF9jb3VudCkgewkvL1N0b3BpbmcuIFdob2xlIGJ1ZmZlciB3YXMgY29waWVkLgorCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisJCQl9CisKKwkJCWlmICgoY291bnQgPD0gMCkgfHwgKGluc3RhbmNlLT5zdG9wX2RhdGFfY291bnQgJiYgKGluc3RhbmNlLT5zdG9wX2RhdGFfY291bnQgPD0gaW5zdGFuY2UtPmRhdGFfY291bnQpKSkgewkvL0VuZCBvZiB3b3JrLgorCQkJCWJyZWFrOworCQkJfQorCQl9CQkvL1JlcGVhdCBpZiBzdGlsbCBpcyB1bmRlciBoYWxmIGZpZm8KKwkJd2hpbGUgKChzdGF0dXMgPQorCQkJaW5sKGluc3RhbmNlLT5zdGF0dXNfcmVnKSkgJiBNRTQ2MDBfQU9fU1RBVFVTX0JJVF9IRik7CisKKwkJLy9VbmJsb2NrIGludGVycnVwdHMKKwkJY3RybCA9IGlubChpbnN0YW5jZS0+Y3RybF9yZWcpOworCQlpZiAoY291bnQgPj0gMCkgewkvL0NvcHkgd2FzIHN1Y2Nlc3NmdWwuCisJCQlpZiAoaW5zdGFuY2UtPnN0b3BfZGF0YV9jb3VudCAmJiAoaW5zdGFuY2UtPnN0b3BfZGF0YV9jb3VudCA8PSBpbnN0YW5jZS0+ZGF0YV9jb3VudCkpIHsJLy9GaW5pc2hpbmcgd29yay4gTm8gbW9yZSBpbnRlcnJ1cHRzLgorCQkJCVBERUJVRygiRmluaXNoaW5nIHdvcmsuIEludGVycnVwdCBkaXNhYmxlZC5cbiIpOworCQkJCWluc3RhbmNlLT5zdGF0dXMgPSBhb19zdGF0dXNfc3RyZWFtX2VuZF93YWl0OworCQkJfSBlbHNlIGlmIChjb3VudCA+IDApIHsJLy9Ob3JtYWwgd29yay4gRW5hYmxlIGludGVycnVwdC4KKwkJCQlQREVCVUcoIk5vcm1hbCB3b3JrLiBFbmFibGUgaW50ZXJydXB0LlxuIik7CisJCQkJY3RybCAmPSB+TUU0NjAwX0FPX0NUUkxfQklUX1JFU0VUX0lSUTsKKwkJCQljdHJsIHw9IE1FNDYwMF9BT19DVFJMX0JJVF9FTkFCTEVfSVJROworCQkJfSBlbHNlIHsJLy9Ob3JtYWwgd29yayBidXQgdGhlcmUgYXJlIG5vIG1vcmUgZGF0YSBpbiBidWZmZXIuIEludGVycnVwdCBhY3RpdmUgYnV0IGJsb2NrZWQuIHN0cmVhbV93cml0ZSgpIHdpbGwgdW5ibG9jayBpdC4KKwkJCQlQREVCVUcKKwkJCQkgICAgKCJObyBkYXRhIGluIHNvZnR3YXJlIGJ1ZmZlci4gSW50ZXJydXB0IGJsb2NrZWQuXG4iKTsKKwkJCQljdHJsIHw9IE1FNDYwMF9BT19DVFJMX0JJVF9FTkFCTEVfSVJROworCQkJfQorCQl9IGVsc2UgewkvL0Vycm9yIGR1cmluZyBjb3B5LgorCQkJaW5zdGFuY2UtPnN0YXR1cyA9IGFvX3N0YXR1c19zdHJlYW1fZmlmb19lcnJvcjsKKwkJfQorCisJCW91dGwoY3RybCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgY3RybCk7CisJfSBlbHNlIHsJCS8vPz8gbW9yZSB0aGFuIGhhbGYKKwkJUERFQlVHCisJCSAgICAoIkludGVycnVwdCBjb21lIGJ1dCBGSUZPIG1vcmUgdGhhbiBoYWxmIGZ1bGwhIFJlc2V0IGludGVycnVwdC5cbiIpOworCQkvL1Jlc2V0IHBlbmRpbmcgaW50ZXJydXB0CisJCWN0cmwgPSBpbmwoaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJY3RybCB8PSBNRTQ2MDBfQU9fQ1RSTF9CSVRfUkVTRVRfSVJROworCQlvdXRsKGN0cmwsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIGN0cmwpOworCQljdHJsICY9IH5NRTQ2MDBfQU9fQ1RSTF9CSVRfUkVTRVRfSVJROworCQlvdXRsKGN0cmwsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIGN0cmwpOworCX0KKworCVBJTkZPKCJJU1I6IEJ1ZmZlciBjb3VudDogJWQuKFQ6JWQgSDolZClcbiIsCisJICAgICAgbWVfY2lyY19idWZfdmFsdWVzKCZpbnN0YW5jZS0+Y2lyY19idWYpLCBpbnN0YW5jZS0+Y2lyY19idWYudGFpbCwKKwkgICAgICBpbnN0YW5jZS0+Y2lyY19idWYuaGVhZCk7CisJUElORk8oIklTUjogU3RvcCBjb3VudDogJWQuXG4iLCBpbnN0YW5jZS0+c3RvcF9jb3VudCk7CisJUElORk8oIklTUjogU3RvcCBkYXRhIGNvdW50OiAlZC5cbiIsIGluc3RhbmNlLT5zdG9wX2RhdGFfY291bnQpOworCVBJTkZPKCJJU1I6IERhdGEgY291bnQ6ICVkLlxuIiwgaW5zdGFuY2UtPmRhdGFfY291bnQpOworCisJLy9JbmZvcm0gdXNlcgorCXdha2VfdXBfaW50ZXJydXB0aWJsZV9hbGwoJmluc3RhbmNlLT53YWl0X3F1ZXVlKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIHZvaWQgbWU0NjAwX2FvX2Rlc3RydWN0b3Ioc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlKQoreworCW1lNDYwMF9hb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisKKwlpbnN0YW5jZSA9IChtZTQ2MDBfYW9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJUERFQlVHKCJleGVjdXRlZC4gaWR4PSVkXG4iLCBpbnN0YW5jZS0+YW9faWR4KTsKKworCWluc3RhbmNlLT5hb19jb250cm9sX3Rhc2tfZmxhZyA9IDA7CisKKwkvLyBSZXNldCBzdWJkZXZpY2UgdG8gYXN1cmUgY2xlYW4gZXhpdC4KKwltZTQ2MDBfYW9faW9fcmVzZXRfc3ViZGV2aWNlKHN1YmRldmljZSwgTlVMTCwKKwkJCQkgICAgIE1FX0lPX1JFU0VUX1NVQkRFVklDRV9OT19GTEFHUyk7CisKKwkvLyBSZW1vdmUgYW55IHRhc2tzIGZyb20gd29yayBxdWV1ZS4gVGhpcyBpcyBwYXJhbm9pYyBiZWNhdXNlIGl0IHdhcyBkb25lIGFsbHJlYWR5IGluIHJlc2V0KCkuCisJaWYgKCFjYW5jZWxfZGVsYXllZF93b3JrKCZpbnN0YW5jZS0+YW9fY29udHJvbF90YXNrKSkgewkvL1dhaXQgMiB0aWNrcyB0byBiZSBzdXJlIHRoYXQgY29udHJvbCB0YXNrIGlzIHJlbW92ZWQgZnJvbSBxdWV1ZS4KKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJc2NoZWR1bGVfdGltZW91dCgyKTsKKwl9CisKKwlpZiAoaW5zdGFuY2UtPmZpZm8pIHsKKwkJaWYgKGluc3RhbmNlLT5pcnEpIHsKKwkJCWZyZWVfaXJxKGluc3RhbmNlLT5pcnEsIGluc3RhbmNlKTsKKwkJCWluc3RhbmNlLT5pcnEgPSAwOworCQl9CisKKwkJaWYgKGluc3RhbmNlLT5jaXJjX2J1Zi5idWYpIHsKKwkJCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpaW5zdGFuY2UtPmNpcmNfYnVmLmJ1ZiwKKwkJCQkgICBNRTQ2MDBfQU9fQ0lSQ19CVUZfU0laRV9PUkRFUik7CisJCX0KKwkJaW5zdGFuY2UtPmNpcmNfYnVmLmJ1ZiA9IE5VTEw7CisJfQorCisJbWVfc3ViZGV2aWNlX2RlaW5pdCgmaW5zdGFuY2UtPmJhc2UpOworCWtmcmVlKGluc3RhbmNlKTsKK30KKworbWU0NjAwX2FvX3N1YmRldmljZV90ICptZTQ2MDBfYW9fY29uc3RydWN0b3IodWludDMyX3QgcmVnX2Jhc2UsCisJCQkJCSAgICAgc3BpbmxvY2tfdCAqIHByZWxvYWRfcmVnX2xvY2ssCisJCQkJCSAgICAgdWludDMyX3QgKiBwcmVsb2FkX2ZsYWdzLAorCQkJCQkgICAgIGludCBhb19pZHgsCisJCQkJCSAgICAgaW50IGZpZm8sCisJCQkJCSAgICAgaW50IGlycSwKKwkJCQkJICAgICBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqbWU0NjAwX3dxKQoreworCW1lNDYwMF9hb19zdWJkZXZpY2VfdCAqc3ViZGV2aWNlOworCWludCBlcnI7CisKKwlQREVCVUcoImV4ZWN1dGVkLiBpZHg9JWRcbiIsIGFvX2lkeCk7CisKKwkvLyBBbGxvY2F0ZSBtZW1vcnkgZm9yIHN1YmRldmljZSBpbnN0YW5jZS4KKwlzdWJkZXZpY2UgPSBrbWFsbG9jKHNpemVvZihtZTQ2MDBfYW9fc3ViZGV2aWNlX3QpLCBHRlBfS0VSTkVMKTsKKworCWlmICghc3ViZGV2aWNlKSB7CisJCVBFUlJPUigiQ2Fubm90IGdldCBtZW1vcnkgZm9yIHN1YmRldmljZSBpbnN0YW5jZS5cbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwltZW1zZXQoc3ViZGV2aWNlLCAwLCBzaXplb2YobWU0NjAwX2FvX3N1YmRldmljZV90KSk7CisKKwkvLyBJbml0aWFsaXplIHN1YmRldmljZSBiYXNlIGNsYXNzLgorCWVyciA9IG1lX3N1YmRldmljZV9pbml0KCZzdWJkZXZpY2UtPmJhc2UpOworCisJaWYgKGVycikgeworCQlQRVJST1IoIkNhbm5vdCBpbml0aWFsaXplIHN1YmRldmljZSBiYXNlIGNsYXNzIGluc3RhbmNlLlxuIik7CisJCWtmcmVlKHN1YmRldmljZSk7CisJCXJldHVybiBOVUxMOworCX0KKwkvLyBJbml0aWFsaXplIHNwaW4gbG9ja3MuCisJc3Bpbl9sb2NrX2luaXQoJnN1YmRldmljZS0+c3ViZGV2aWNlX2xvY2spOworCisJc3ViZGV2aWNlLT5wcmVsb2FkX3JlZ19sb2NrID0gcHJlbG9hZF9yZWdfbG9jazsKKwlzdWJkZXZpY2UtPnByZWxvYWRfZmxhZ3MgPSBwcmVsb2FkX2ZsYWdzOworCisJLy8gU3RvcmUgYW5hbG9nIG91dHB1dCBpbmRleC4KKwlzdWJkZXZpY2UtPmFvX2lkeCA9IGFvX2lkeDsKKworCS8vIFN0b3JlIGlmIGFuYWxvZyBvdXRwdXQgaGFzIGZpZm8uCisJc3ViZGV2aWNlLT5maWZvID0gKGFvX2lkeCA8IGZpZm8pID8gMSA6IDA7CisKKwlpZiAoc3ViZGV2aWNlLT5maWZvKSB7CS8vIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIGNpcmN1bGFyIGJ1ZmZlci4KKwkJc3ViZGV2aWNlLT5jaXJjX2J1Zi5tYXNrID0gTUU0NjAwX0FPX0NJUkNfQlVGX0NPVU5UIC0gMTsKKworCQlzdWJkZXZpY2UtPmNpcmNfYnVmLmJ1ZiA9CisJCSAgICAodm9pZCAqKV9fZ2V0X2ZyZWVfcGFnZXMoR0ZQX0tFUk5FTCwKKwkJCQkJICAgICBNRTQ2MDBfQU9fQ0lSQ19CVUZfU0laRV9PUkRFUik7CisJCVBERUJVRygiY2lyY19idWYgPSAlcCBzaXplPSVsZFxuIiwgc3ViZGV2aWNlLT5jaXJjX2J1Zi5idWYsCisJCSAgICAgICBNRTQ2MDBfQU9fQ0lSQ19CVUZfU0laRSk7CisKKwkJaWYgKCFzdWJkZXZpY2UtPmNpcmNfYnVmLmJ1ZikgeworCQkJUEVSUk9SCisJCQkgICAgKCJDYW5ub3QgaW5pdGlhbGl6ZSBzdWJkZXZpY2UgYmFzZSBjbGFzcyBpbnN0YW5jZS5cbiIpOworCQkJa2ZyZWUoc3ViZGV2aWNlKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisKKwkJbWVtc2V0KHN1YmRldmljZS0+Y2lyY19idWYuYnVmLCAwLCBNRTQ2MDBfQU9fQ0lSQ19CVUZfU0laRSk7CisJfSBlbHNlIHsJCS8vIE5vIEZJRk8uCisJCXN1YmRldmljZS0+Y2lyY19idWYubWFzayA9IDA7CisJCXN1YmRldmljZS0+Y2lyY19idWYuYnVmID0gTlVMTDsKKwl9CisKKwlzdWJkZXZpY2UtPmNpcmNfYnVmLmhlYWQgPSAwOworCXN1YmRldmljZS0+Y2lyY19idWYudGFpbCA9IDA7CisKKwlzdWJkZXZpY2UtPnN0YXR1cyA9IGFvX3N0YXR1c19ub25lOworCXN1YmRldmljZS0+YW9fY29udHJvbF90YXNrX2ZsYWcgPSAwOworCXN1YmRldmljZS0+dGltZW91dC5kZWxheSA9IDA7CisJc3ViZGV2aWNlLT50aW1lb3V0LnN0YXJ0X3RpbWUgPSBqaWZmaWVzOworCisJLy8gSW5pdGlhbGl6ZSB3YWl0IHF1ZXVlLgorCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnN1YmRldmljZS0+d2FpdF9xdWV1ZSk7CisKKwkvLyBJbml0aWFsaXplIHNpbmdsZSB2YWx1ZSB0byAwVi4KKwlzdWJkZXZpY2UtPnNpbmdsZV92YWx1ZSA9IDB4ODAwMDsKKwlzdWJkZXZpY2UtPnNpbmdsZV92YWx1ZV9pbl9maWZvID0gMHg4MDAwOworCisJLy8gUmVnaXN0ZXIgaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZS4KKwlpZiAoc3ViZGV2aWNlLT5maWZvKSB7CisJCXN1YmRldmljZS0+aXJxID0gaXJxOworCQlpZiAocmVxdWVzdF9pcnEoc3ViZGV2aWNlLT5pcnEsIG1lNDYwMF9hb19pc3IsCisjaWZkZWYgSVJRRl9ESVNBQkxFRAorCQkJCUlSUUZfRElTQUJMRUQgfCBJUlFGX1NIQVJFRCwKKyNlbHNlCisJCQkJU0FfSU5URVJSVVBUIHwgU0FfU0hJUlEsCisjZW5kaWYKKwkJCQlNRTQ2MDBfTkFNRSwgc3ViZGV2aWNlKSkgeworCQkJUEVSUk9SKCJDYW5ub3QgZ2V0IGludGVycnVwdCBsaW5lLlxuIik7CisJCQlQREVCVUcoImZyZWUgY2lyY19idWYgPSAlcCBzaXplPSVkIiwKKwkJCSAgICAgICBzdWJkZXZpY2UtPmNpcmNfYnVmLmJ1ZiwKKwkJCSAgICAgICBQQUdFX1NISUZUIDw8IE1FNDYwMF9BT19DSVJDX0JVRl9TSVpFX09SREVSKTsKKwkJCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpc3ViZGV2aWNlLT5jaXJjX2J1Zi5idWYsCisJCQkJICAgTUU0NjAwX0FPX0NJUkNfQlVGX1NJWkVfT1JERVIpOworCQkJbWVfc3ViZGV2aWNlX2RlaW5pdCgobWVfc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlKTsKKwkJCWtmcmVlKHN1YmRldmljZSk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQlQSU5GTygiUmVnaXN0ZXJlZCBpcnE9JWQuXG4iLCBzdWJkZXZpY2UtPmlycSk7CisJfSBlbHNlIHsKKwkJc3ViZGV2aWNlLT5pcnEgPSAwOworCX0KKworCS8vIEluaXRpYWxpemUgcmVnaXN0ZXJzLgorCXN1YmRldmljZS0+aXJxX3N0YXR1c19yZWcgPSByZWdfYmFzZSArIE1FNDYwMF9JUlFfU1RBVFVTX1JFRzsKKwlzdWJkZXZpY2UtPnByZWxvYWRfcmVnID0gcmVnX2Jhc2UgKyBNRTQ2MDBfQU9fU1lOQ19SRUc7CisJaWYgKGFvX2lkeCA9PSAwKSB7CisJCXN1YmRldmljZS0+Y3RybF9yZWcgPSByZWdfYmFzZSArIE1FNDYwMF9BT18wMF9DVFJMX1JFRzsKKwkJc3ViZGV2aWNlLT5zdGF0dXNfcmVnID0gcmVnX2Jhc2UgKyBNRTQ2MDBfQU9fMDBfU1RBVFVTX1JFRzsKKwkJc3ViZGV2aWNlLT5maWZvX3JlZyA9IHJlZ19iYXNlICsgTUU0NjAwX0FPXzAwX0ZJRk9fUkVHOworCQlzdWJkZXZpY2UtPnNpbmdsZV9yZWcgPSByZWdfYmFzZSArIE1FNDYwMF9BT18wMF9TSU5HTEVfUkVHOworCQlzdWJkZXZpY2UtPnRpbWVyX3JlZyA9IHJlZ19iYXNlICsgTUU0NjAwX0FPXzAwX1RJTUVSX1JFRzsKKwkJc3ViZGV2aWNlLT5yZWdfYmFzZSA9IHJlZ19iYXNlOworCQlzdWJkZXZpY2UtPmJpdHBhdHRlcm4gPSAwOworCX0gZWxzZSBpZiAoYW9faWR4ID09IDEpIHsKKwkJc3ViZGV2aWNlLT5jdHJsX3JlZyA9IHJlZ19iYXNlICsgTUU0NjAwX0FPXzAxX0NUUkxfUkVHOworCQlzdWJkZXZpY2UtPnN0YXR1c19yZWcgPSByZWdfYmFzZSArIE1FNDYwMF9BT18wMV9TVEFUVVNfUkVHOworCQlzdWJkZXZpY2UtPmZpZm9fcmVnID0gcmVnX2Jhc2UgKyBNRTQ2MDBfQU9fMDFfRklGT19SRUc7CisJCXN1YmRldmljZS0+c2luZ2xlX3JlZyA9IHJlZ19iYXNlICsgTUU0NjAwX0FPXzAxX1NJTkdMRV9SRUc7CisJCXN1YmRldmljZS0+dGltZXJfcmVnID0gcmVnX2Jhc2UgKyBNRTQ2MDBfQU9fMDFfVElNRVJfUkVHOworCQlzdWJkZXZpY2UtPnJlZ19iYXNlID0gcmVnX2Jhc2U7CisJCXN1YmRldmljZS0+Yml0cGF0dGVybiA9IDA7CisJfSBlbHNlIGlmIChhb19pZHggPT0gMikgeworCQlzdWJkZXZpY2UtPmN0cmxfcmVnID0gcmVnX2Jhc2UgKyBNRTQ2MDBfQU9fMDJfQ1RSTF9SRUc7CisJCXN1YmRldmljZS0+c3RhdHVzX3JlZyA9IHJlZ19iYXNlICsgTUU0NjAwX0FPXzAyX1NUQVRVU19SRUc7CisJCXN1YmRldmljZS0+Zmlmb19yZWcgPSByZWdfYmFzZSArIE1FNDYwMF9BT18wMl9GSUZPX1JFRzsKKwkJc3ViZGV2aWNlLT5zaW5nbGVfcmVnID0gcmVnX2Jhc2UgKyBNRTQ2MDBfQU9fMDJfU0lOR0xFX1JFRzsKKwkJc3ViZGV2aWNlLT50aW1lcl9yZWcgPSByZWdfYmFzZSArIE1FNDYwMF9BT18wMl9USU1FUl9SRUc7CisJCXN1YmRldmljZS0+cmVnX2Jhc2UgPSByZWdfYmFzZTsKKwkJc3ViZGV2aWNlLT5iaXRwYXR0ZXJuID0gMDsKKwl9IGVsc2UgaWYgKGFvX2lkeCA9PSAzKSB7CisJCXN1YmRldmljZS0+Y3RybF9yZWcgPSByZWdfYmFzZSArIE1FNDYwMF9BT18wM19DVFJMX1JFRzsKKwkJc3ViZGV2aWNlLT5zdGF0dXNfcmVnID0gcmVnX2Jhc2UgKyBNRTQ2MDBfQU9fMDNfU1RBVFVTX1JFRzsKKwkJc3ViZGV2aWNlLT5maWZvX3JlZyA9IHJlZ19iYXNlICsgTUU0NjAwX0FPXzAzX0ZJRk9fUkVHOworCQlzdWJkZXZpY2UtPnNpbmdsZV9yZWcgPSByZWdfYmFzZSArIE1FNDYwMF9BT18wM19TSU5HTEVfUkVHOworCQlzdWJkZXZpY2UtPnRpbWVyX3JlZyA9IHJlZ19iYXNlICsgTUU0NjAwX0FPXzAzX1RJTUVSX1JFRzsKKwkJc3ViZGV2aWNlLT5yZWdfYmFzZSA9IHJlZ19iYXNlOworCQlzdWJkZXZpY2UtPmJpdHBhdHRlcm4gPSAxOworCX0gZWxzZSB7CisJCVBFUlJPUl9DUklUSUNBTCgiV1JPTkcgU1VCREVWSUNFIGlkeD0lZCEiLCBhb19pZHgpOworCQltZV9zdWJkZXZpY2VfZGVpbml0KChtZV9zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2UpOworCQlpZiAoc3ViZGV2aWNlLT5maWZvKSB7CisJCQlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKXN1YmRldmljZS0+Y2lyY19idWYuYnVmLAorCQkJCSAgIE1FNDYwMF9BT19DSVJDX0JVRl9TSVpFX09SREVSKTsKKwkJfQorCQlzdWJkZXZpY2UtPmNpcmNfYnVmLmJ1ZiA9IE5VTEw7CisJCWtmcmVlKHN1YmRldmljZSk7CisJCXJldHVybiBOVUxMOworCX0KKworCS8vIE92ZXJyaWRlIGJhc2UgY2xhc3MgbWV0aG9kcy4KKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2Rlc3RydWN0b3IgPSBtZTQ2MDBfYW9fZGVzdHJ1Y3RvcjsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3Jlc2V0X3N1YmRldmljZSA9CisJICAgIG1lNDYwMF9hb19pb19yZXNldF9zdWJkZXZpY2U7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19zaW5nbGVfY29uZmlnID0KKwkgICAgbWU0NjAwX2FvX2lvX3NpbmdsZV9jb25maWc7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19zaW5nbGVfcmVhZCA9IG1lNDYwMF9hb19pb19zaW5nbGVfcmVhZDsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3NpbmdsZV93cml0ZSA9CisJICAgIG1lNDYwMF9hb19pb19zaW5nbGVfd3JpdGU7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19zdHJlYW1fY29uZmlnID0KKwkgICAgbWU0NjAwX2FvX2lvX3N0cmVhbV9jb25maWc7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19zdHJlYW1fbmV3X3ZhbHVlcyA9CisJICAgIG1lNDYwMF9hb19pb19zdHJlYW1fbmV3X3ZhbHVlczsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3N0cmVhbV93cml0ZSA9CisJICAgIG1lNDYwMF9hb19pb19zdHJlYW1fd3JpdGU7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19zdHJlYW1fc3RhcnQgPQorCSAgICBtZTQ2MDBfYW9faW9fc3RyZWFtX3N0YXJ0OworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fc3RyZWFtX3N0YXR1cyA9CisJICAgIG1lNDYwMF9hb19pb19zdHJlYW1fc3RhdHVzOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fc3RyZWFtX3N0b3AgPSBtZTQ2MDBfYW9faW9fc3RyZWFtX3N0b3A7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9udW1iZXJfY2hhbm5lbHMgPQorCSAgICBtZTQ2MDBfYW9fcXVlcnlfbnVtYmVyX2NoYW5uZWxzOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfcXVlcnlfc3ViZGV2aWNlX3R5cGUgPQorCSAgICBtZTQ2MDBfYW9fcXVlcnlfc3ViZGV2aWNlX3R5cGU7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9zdWJkZXZpY2VfY2FwcyA9CisJICAgIG1lNDYwMF9hb19xdWVyeV9zdWJkZXZpY2VfY2FwczsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV9jYXBzX2FyZ3MgPQorCSAgICBtZTQ2MDBfYW9fcXVlcnlfc3ViZGV2aWNlX2NhcHNfYXJnczsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X3JhbmdlX2J5X21pbl9tYXggPQorCSAgICBtZTQ2MDBfYW9fcXVlcnlfcmFuZ2VfYnlfbWluX21heDsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X251bWJlcl9yYW5nZXMgPQorCSAgICBtZTQ2MDBfYW9fcXVlcnlfbnVtYmVyX3JhbmdlczsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X3JhbmdlX2luZm8gPQorCSAgICBtZTQ2MDBfYW9fcXVlcnlfcmFuZ2VfaW5mbzsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X3RpbWVyID0gbWU0NjAwX2FvX3F1ZXJ5X3RpbWVyOworCisJLy8gUHJlcGFyZSB3b3JrIHF1ZXVlCisJc3ViZGV2aWNlLT5tZTQ2MDBfd29ya3F1ZXVlID0gbWU0NjAwX3dxOworCisvKiB3b3JrcXVldWUgQVBJIGNoYW5nZWQgaW4ga2VybmVsIDIuNi4yMCAqLworI2lmICggTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDIwKSApCisJSU5JVF9XT1JLKCZzdWJkZXZpY2UtPmFvX2NvbnRyb2xfdGFzaywgbWU0NjAwX2FvX3dvcmtfY29udHJvbF90YXNrLAorCQkgICh2b2lkICopc3ViZGV2aWNlKTsKKyNlbHNlCisJSU5JVF9ERUxBWUVEX1dPUksoJnN1YmRldmljZS0+YW9fY29udHJvbF90YXNrLAorCQkJICBtZTQ2MDBfYW9fd29ya19jb250cm9sX3Rhc2spOworI2VuZGlmCisKKwlpZiAoc3ViZGV2aWNlLT5maWZvKSB7CS8vIFNldCBzcGVlZCBmb3Igc2luZ2xlIG9wZXJhdGlvbnMuCisJCW91dGwoTUU0NjAwX0FPX01JTl9DSEFOX1RJQ0tTIC0gMSwgc3ViZGV2aWNlLT50aW1lcl9yZWcpOworCQlzdWJkZXZpY2UtPmhhcmR3YXJlX3N0b3BfZGVsYXkgPSBIWiAvIDEwOwkvLzEwMG1zCisJfQorCisJcmV0dXJuIHN1YmRldmljZTsKK30KKworLyoqIEBicmllZiBTdG9wIHByZXNlbnRhdGlvbi4gUHJlc2VydmUgRklGT3MuCisqCisqIEBwYXJhbSBpbnN0YW5jZSBUaGUgc3ViZGV2aWNlIGluc3RhbmNlIChwb2ludGVyKS4KKyovCitpbnQgaW5saW5lIGFvX3N0b3BfaW1tZWRpYXRlbHkobWU0NjAwX2FvX3N1YmRldmljZV90ICogaW5zdGFuY2UpCit7CisJdW5zaWduZWQgbG9uZyBjcHVfZmxhZ3M7CisJdWludDMyX3QgY3RybDsKKwlpbnQgdGltZW91dDsKKwlpbnQgaTsKKworCXRpbWVvdXQgPQorCSAgICAoaW5zdGFuY2UtPmhhcmR3YXJlX3N0b3BfZGVsYXkgPgorCSAgICAgKEhaIC8gMTApKSA/IGluc3RhbmNlLT5oYXJkd2FyZV9zdG9wX2RlbGF5IDogSFogLyAxMDsKKwlmb3IgKGkgPSAwOyBpIDw9IHRpbWVvdXQ7IGkrKykgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCQkvLyBTdG9wIGFsbCBhY3Rpb25zLiBObyBjb25kaXRpb25zISBCbG9jayBpbnRlcnJ1cHRzLiBMZWF2ZSBGSUZPIHVudG91Y2hlZCEKKwkJY3RybCA9IGlubChpbnN0YW5jZS0+Y3RybF9yZWcpOworCQljdHJsIHw9CisJCSAgICBNRTQ2MDBfQU9fQ1RSTF9CSVRfU1RPUCB8IE1FNDYwMF9BT19DVFJMX0JJVF9JTU1FRElBVEVfU1RPUAorCQkgICAgfCBNRTQ2MDBfQU9fQ1RSTF9CSVRfUkVTRVRfSVJROworCQljdHJsICY9CisJCSAgICB+KE1FNDYwMF9BT19DVFJMX0JJVF9FTkFCTEVfSVJRIHwKKwkJICAgICAgTUU0NjAwX0FPX0NUUkxfQklUX0VOQUJMRV9FWF9UUklHKTsKKwkJb3V0bChjdHJsLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCBjdHJsKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCisJCWlmICghKGlubChpbnN0YW5jZS0+c3RhdHVzX3JlZykgJiBNRTQ2MDBfQU9fU1RBVFVTX0JJVF9GU00pKSB7CS8vIEV4aXQuCisJCQlicmVhazsKKwkJfQorCQkvL1N0aWxsIHdvcmtpbmchCisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCXNjaGVkdWxlX3RpbWVvdXQoMSk7CisJfQorCisJaWYgKGkgPiB0aW1lb3V0KSB7CisJCVBFUlJPUl9DUklUSUNBTCgiRlNNIElTIEJVU1khXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVEVSTkFMOworCX0KKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworLyoqIEBicmllZiBDb3B5IGRhdGEgZnJvbSBjaXJjdWxhciBidWZmZXIgdG8gZmlmbyAoZmFzdCkgaW4gd3JhcGFyb3VuZC4KKyogQG5vdGUgVGhpcyBpcyB0aW1lIGNyaXRpY2FsIGZ1bmN0aW9uLiBDaGVja2luZyBpcyBkb25lIGF0IGJlZ2luaW5nIGFuZCBlbmQgb25seS4KKyogQG5vdGUgVGhlIGlzIG5vdCByZWFzb25hYmxlIHdheSB0byBjaGVjayBob3cgbWFueSB3YWx1ZXMgd2FzIGluIEZJRk8gYXQgYmVnaW5pbmcuIFRoZSBjb3VudCBtdXN0IGJlIG1hbmFnZWQgZXh0ZXJuYWx5LgorKgorKiBAcGFyYW0gaW5zdGFuY2UgVGhlIHN1YmRldmljZSBpbnN0YW5jZSAocG9pbnRlcikuCisqIEBwYXJhbSBjb3VudCBNYXhpbXVtIG51bWJlciBvZiBjb3BpZWQgZGF0YS4KKyogQHBhcmFtIHN0YXJ0X3BvcyBQb3NpdGlvbiBvZiB0aGUgZmlycyB2YWx1ZSBpbiBidWZmZXIuCisqCisqIEByZXR1cm4gT24gc3VjY2VzczogTnVtYmVyIG9mIGNvcGllZCBkYXRhLgorKiBAcmV0dXJuIE9uIGVycm9yL3N1Y2Nlc3M6IDAuCU5vIGRhdGFzIHdlcmUgY29waWVkID0+IG5vIGRhdGEgaW4gYnVmZmVyLgorKiBAcmV0dXJuIE9uIGVycm9yOiAtTUVfRVJSTk9fRklGT19CVUZGRVJfT1ZFUkZMT1cuCisqLworaW50IGlubGluZSBhb193cml0ZV9kYXRhX3dyYXBhcm91bmQobWU0NjAwX2FvX3N1YmRldmljZV90ICogaW5zdGFuY2UsIGludCBjb3VudCwKKwkJCQkgICAgaW50IHN0YXJ0X3BvcykKK3sJCQkJLy8vIEBub3RlIFRoaXMgaXMgdGltZSBjcml0aWNhbCBmdW5jdGlvbiEKKwl1aW50MzJfdCBzdGF0dXM7CisJdWludDMyX3QgdmFsdWU7CisJaW50IHBvcyA9CisJICAgIChpbnN0YW5jZS0+Y2lyY19idWYudGFpbCArIHN0YXJ0X3BvcykgJiBpbnN0YW5jZS0+Y2lyY19idWYubWFzazsKKwlpbnQgbG9jYWxfY291bnQgPSBjb3VudDsKKwlpbnQgaSA9IDE7CisKKwlpZiAoY291bnQgPD0gMCkgewkvL1dyb25nIGNvdW50IQorCQlyZXR1cm4gMDsKKwl9CisKKwl3aGlsZSAoaSA8IGxvY2FsX2NvdW50KSB7CisJCS8vR2V0IHZhbHVlIGZyb20gYnVmZmVyCisJCXZhbHVlID0gKihpbnN0YW5jZS0+Y2lyY19idWYuYnVmICsgcG9zKTsKKwkJLy9QcmVwYXJlIGl0CisJCWlmIChpbnN0YW5jZS0+YW9faWR4ICYgMHgxKSB7CisJCQl2YWx1ZSA8PD0gMTY7CisJCX0KKwkJLy9QdXQgdmFsdWUgdG8gRklGTworCQlvdXRsKHZhbHVlLCBpbnN0YW5jZS0+Zmlmb19yZWcpOworCQkvL1BERUJVR19SRUcoImlkeD0lZCBmaWZvX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+YW9faWR4LCBpbnN0YW5jZS0+cmVnX2Jhc2UsIGluc3RhbmNlLT5maWZvX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgdmFsdWUpOworCisJCXBvcysrOworCQlwb3MgJj0gaW5zdGFuY2UtPmNpcmNfYnVmLm1hc2s7CisJCWlmIChwb3MgPT0gaW5zdGFuY2UtPmNpcmNfYnVmLmhlYWQpIHsKKwkJCXBvcyA9IGluc3RhbmNlLT5jaXJjX2J1Zi50YWlsOworCQl9CisJCWkrKzsKKwl9CisKKwlzdGF0dXMgPSBpbmwoaW5zdGFuY2UtPnN0YXR1c19yZWcpOworCWlmICghKHN0YXR1cyAmIE1FNDYwMF9BT19TVEFUVVNfQklUX0ZGKSkgewkvL0ZJRk8gaXMgZnVsbCBiZWZvcmUgYWxsIGRhdGFzIHdlcmUgY29waWVkIQorCQlQRVJST1IoIkZJRk8gd2FzIGZ1bGwgYmVmb3JlIGFsbCBkYXRhcyB3ZXJlIGNvcGllZCEgaWR4PSVkXG4iLAorCQkgICAgICAgaW5zdGFuY2UtPmFvX2lkeCk7CisJCXJldHVybiAtTUVfRVJSTk9fRklGT19CVUZGRVJfT1ZFUkZMT1c7CisJfSBlbHNlIHsJCS8vQWRkIGxhc3QgdmFsdWUKKwkJdmFsdWUgPSAqKGluc3RhbmNlLT5jaXJjX2J1Zi5idWYgKyBwb3MpOworCQlpZiAoaW5zdGFuY2UtPmFvX2lkeCAmIDB4MSkgeworCQkJdmFsdWUgPDw9IDE2OworCQl9CisJCS8vUHV0IHZhbHVlIHRvIEZJRk8KKwkJb3V0bCh2YWx1ZSwgaW5zdGFuY2UtPmZpZm9fcmVnKTsKKwkJLy9QREVCVUdfUkVHKCJpZHg9JWQgZmlmb19yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPmFvX2lkeCwgaW5zdGFuY2UtPnJlZ19iYXNlLCBpbnN0YW5jZS0+Zmlmb19yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIHZhbHVlKTsKKwl9CisKKwlQSU5GTygiV1JBUEFST1VORCBMT0FERUQgJWQgdmFsdWVzLiBpZHg9JWRcbiIsIGxvY2FsX2NvdW50LAorCSAgICAgIGluc3RhbmNlLT5hb19pZHgpOworCXJldHVybiBsb2NhbF9jb3VudDsKK30KKworLyoqIEBicmllZiBDb3B5IGRhdGEgZnJvbSBzb2Z0d2FyZSBidWZmZXIgdG8gZmlmbyAoZmFzdCkuCisqIEBub3RlIFRoaXMgaXMgdGltZSBjcml0aWNhbCBmdW5jdGlvbi4gQ2hlY2tpbmcgaXMgZG9uZSBhdCBiZWdpbmluZyBhbmQgZW5kIG9ubHkuCisqIEBub3RlIFRoZSBpcyBub3QgcmVhc29uYWJsZSB3YXkgdG8gY2hlY2sgaG93IG1hbnkgd2FsdWVzIHdhcyBpbiBGSUZPIGF0IGJlZ2luaW5nLiBUaGUgY291bnQgbXVzdCBiZSBtYW5hZ2VkIGV4dGVybmFseS4KKyoKKyogQHBhcmFtIGluc3RhbmNlIFRoZSBzdWJkZXZpY2UgaW5zdGFuY2UgKHBvaW50ZXIpLgorKiBAcGFyYW0gY291bnQgTWF4aW11bSBudW1iZXIgb2YgY29waWVkIGRhdGEuCisqIEBwYXJhbSBzdGFydF9wb3MgUG9zaXRpb24gb2YgdGhlIGZpcnMgdmFsdWUgaW4gYnVmZmVyLgorKgorKiBAcmV0dXJuIE9uIHN1Y2Nlc3M6IE51bWJlciBvZiBjb3BpZWQgZGF0YS4KKyogQHJldHVybiBPbiBlcnJvci9zdWNjZXNzOiAwLglObyBkYXRhcyB3ZXJlIGNvcGllZCA9PiBubyBkYXRhIGluIGJ1ZmZlci4KKyogQHJldHVybiBPbiBlcnJvcjogLU1FX0VSUk5PX0ZJRk9fQlVGRkVSX09WRVJGTE9XLgorKi8KK2ludCBpbmxpbmUgYW9fd3JpdGVfZGF0YShtZTQ2MDBfYW9fc3ViZGV2aWNlX3QgKiBpbnN0YW5jZSwgaW50IGNvdW50LAorCQkJIGludCBzdGFydF9wb3MpCit7CQkJCS8vLyBAbm90ZSBUaGlzIGlzIHRpbWUgY3JpdGljYWwgZnVuY3Rpb24hCisJdWludDMyX3Qgc3RhdHVzOworCXVpbnQzMl90IHZhbHVlOworCWludCBwb3MgPQorCSAgICAoaW5zdGFuY2UtPmNpcmNfYnVmLnRhaWwgKyBzdGFydF9wb3MpICYgaW5zdGFuY2UtPmNpcmNfYnVmLm1hc2s7CisJaW50IGxvY2FsX2NvdW50ID0gY291bnQ7CisJaW50IG1heF9jb3VudDsKKwlpbnQgaSA9IDE7CisKKwlpZiAoY291bnQgPD0gMCkgewkvL1dyb25nIGNvdW50IQorCQlyZXR1cm4gMDsKKwl9CisKKwltYXhfY291bnQgPSBtZV9jaXJjX2J1Zl92YWx1ZXMoJmluc3RhbmNlLT5jaXJjX2J1ZikgLSBzdGFydF9wb3M7CisJaWYgKG1heF9jb3VudCA8PSAwKSB7CS8vTm8gZGF0YSB0byBjb3B5IQorCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAobWF4X2NvdW50IDwgY291bnQpIHsKKwkJbG9jYWxfY291bnQgPSBtYXhfY291bnQ7CisJfQorCisJd2hpbGUgKGkgPCBsb2NhbF9jb3VudCkgeworCQkvL0dldCB2YWx1ZSBmcm9tIGJ1ZmZlcgorCQl2YWx1ZSA9ICooaW5zdGFuY2UtPmNpcmNfYnVmLmJ1ZiArIHBvcyk7CisJCS8vUHJlcGFyZSBpdAorCQlpZiAoaW5zdGFuY2UtPmFvX2lkeCAmIDB4MSkgeworCQkJdmFsdWUgPDw9IDE2OworCQl9CisJCS8vUHV0IHZhbHVlIHRvIEZJRk8KKwkJb3V0bCh2YWx1ZSwgaW5zdGFuY2UtPmZpZm9fcmVnKTsKKwkJLy9QREVCVUdfUkVHKCJpZHg9JWQgZmlmb19yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPmFvX2lkeCwgaW5zdGFuY2UtPnJlZ19iYXNlLCBpbnN0YW5jZS0+Zmlmb19yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIHZhbHVlKTsKKworCQlwb3MrKzsKKwkJcG9zICY9IGluc3RhbmNlLT5jaXJjX2J1Zi5tYXNrOworCQlpKys7CisJfQorCisJc3RhdHVzID0gaW5sKGluc3RhbmNlLT5zdGF0dXNfcmVnKTsKKwlpZiAoIShzdGF0dXMgJiBNRTQ2MDBfQU9fU1RBVFVTX0JJVF9GRikpIHsJLy9GSUZPIGlzIGZ1bGwgYmVmb3JlIGFsbCBkYXRhcyB3ZXJlIGNvcGllZCEKKwkJUEVSUk9SKCJGSUZPIHdhcyBmdWxsIGJlZm9yZSBhbGwgZGF0YXMgd2VyZSBjb3BpZWQhIGlkeD0lZFxuIiwKKwkJICAgICAgIGluc3RhbmNlLT5hb19pZHgpOworCQlyZXR1cm4gLU1FX0VSUk5PX0ZJRk9fQlVGRkVSX09WRVJGTE9XOworCX0gZWxzZSB7CQkvL0FkZCBsYXN0IHZhbHVlCisJCXZhbHVlID0gKihpbnN0YW5jZS0+Y2lyY19idWYuYnVmICsgcG9zKTsKKwkJaWYgKGluc3RhbmNlLT5hb19pZHggJiAweDEpIHsKKwkJCXZhbHVlIDw8PSAxNjsKKwkJfQorCQkvL1B1dCB2YWx1ZSB0byBGSUZPCisJCW91dGwodmFsdWUsIGluc3RhbmNlLT5maWZvX3JlZyk7CisJCS8vUERFQlVHX1JFRygiaWR4PSVkIGZpZm9fcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5hb19pZHgsIGluc3RhbmNlLT5yZWdfYmFzZSwgaW5zdGFuY2UtPmZpZm9fcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCB2YWx1ZSk7CisJfQorCisJUElORk8oIkZBU1QgTE9BREVEICVkIHZhbHVlcy4gaWR4PSVkXG4iLCBsb2NhbF9jb3VudCwgaW5zdGFuY2UtPmFvX2lkeCk7CisJcmV0dXJuIGxvY2FsX2NvdW50OworfQorCisvKiogQGJyaWVmIENvcHkgZGF0YSBmcm9tIHNvZnR3YXJlIGJ1ZmZlciB0byBmaWZvIChzbG93KS4KKyogQG5vdGUgVGhpcyBpcyBzbG93IGZ1bmN0aW9uIHRoYXQgY29weSBhbGwgZGF0YSBmcm9tIGJ1ZmZlciB0byBGSUZPIHdpdGggZnVsbCBjb250cm9sLgorKgorKiBAcGFyYW0gaW5zdGFuY2UgVGhlIHN1YmRldmljZSBpbnN0YW5jZSAocG9pbnRlcikuCisqIEBwYXJhbSBjb3VudCBNYXhpbXVtIG51bWJlciBvZiBjb3BpZWQgZGF0YS4KKyogQHBhcmFtIHN0YXJ0X3BvcyBQb3NpdGlvbiBvZiB0aGUgZmlycyB2YWx1ZSBpbiBidWZmZXIuCisqCisqIEByZXR1cm4gT24gc3VjY2VzczogTnVtYmVyIG9mIGNvcGllZCB2YWx1ZXMuCisqIEByZXR1cm4gT24gZXJyb3Ivc3VjY2VzczogMC4JRklGTyB3YXMgZnVsbCBhdCBiZWdpbmluZy4KKyogQHJldHVybiBPbiBlcnJvcjogLU1FX0VSUk5PX1JJTkdfQlVGRkVSX1VOREVGRkxPVy4KKyovCitpbnQgaW5saW5lIGFvX3dyaXRlX2RhdGFfcG9vbGluZyhtZTQ2MDBfYW9fc3ViZGV2aWNlX3QgKiBpbnN0YW5jZSwgaW50IGNvdW50LAorCQkJCSBpbnQgc3RhcnRfcG9zKQorewkJCQkvLy8gQG5vdGUgVGhpcyBpcyBzbG93IGZ1bmN0aW9uIQorCXVpbnQzMl90IHN0YXR1czsKKwl1aW50MzJfdCB2YWx1ZTsKKwlpbnQgcG9zID0KKwkgICAgKGluc3RhbmNlLT5jaXJjX2J1Zi50YWlsICsgc3RhcnRfcG9zKSAmIGluc3RhbmNlLT5jaXJjX2J1Zi5tYXNrOworCWludCBsb2NhbF9jb3VudCA9IGNvdW50OworCWludCBpOworCWludCBtYXhfY291bnQ7CisKKwlpZiAoY291bnQgPD0gMCkgewkvL1dyb25nIGNvdW50IQorCQlQRVJST1IoIlNMT1cgTE9BREVEOiBXcm9uZyBjb3VudCEgaWR4PSVkXG4iLCBpbnN0YW5jZS0+YW9faWR4KTsKKwkJcmV0dXJuIDA7CisJfQorCisJbWF4X2NvdW50ID0gbWVfY2lyY19idWZfdmFsdWVzKCZpbnN0YW5jZS0+Y2lyY19idWYpIC0gc3RhcnRfcG9zOworCWlmIChtYXhfY291bnQgPD0gMCkgewkvL05vIGRhdGEgdG8gY29weSEKKwkJUEVSUk9SKCJTTE9XIExPQURFRDogTm8gZGF0YSB0byBjb3B5ISBpZHg9JWRcbiIsCisJCSAgICAgICBpbnN0YW5jZS0+YW9faWR4KTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKG1heF9jb3VudCA8IGNvdW50KSB7CisJCWxvY2FsX2NvdW50ID0gbWF4X2NvdW50OworCX0KKworCWZvciAoaSA9IDA7IGkgPCBsb2NhbF9jb3VudDsgaSsrKSB7CisJCXN0YXR1cyA9IGlubChpbnN0YW5jZS0+c3RhdHVzX3JlZyk7CisJCWlmICghKHN0YXR1cyAmIE1FNDYwMF9BT19TVEFUVVNfQklUX0ZGKSkgewkvL0ZJRk8gaXMgZnVsbCEKKwkJCXJldHVybiBpOworCQl9CisJCS8vR2V0IHZhbHVlIGZyb20gYnVmZmVyCisJCXZhbHVlID0gKihpbnN0YW5jZS0+Y2lyY19idWYuYnVmICsgcG9zKTsKKwkJLy9QcmVwYXJlIGl0CisJCWlmIChpbnN0YW5jZS0+YW9faWR4ICYgMHgxKSB7CisJCQl2YWx1ZSA8PD0gMTY7CisJCX0KKwkJLy9QdXQgdmFsdWUgdG8gRklGTworCQlvdXRsKHZhbHVlLCBpbnN0YW5jZS0+Zmlmb19yZWcpOworCQkvL1BERUJVR19SRUcoImlkeD0lZCBmaWZvX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+YW9faWR4LCBpbnN0YW5jZS0+cmVnX2Jhc2UsIGluc3RhbmNlLT5maWZvX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgdmFsdWUpOworCisJCXBvcysrOworCQlwb3MgJj0gaW5zdGFuY2UtPmNpcmNfYnVmLm1hc2s7CisJfQorCisJUElORk8oIlNMT1cgTE9BREVEICVkIHZhbHVlcy4gaWR4PSVkXG4iLCBsb2NhbF9jb3VudCwgaW5zdGFuY2UtPmFvX2lkeCk7CisJcmV0dXJuIGxvY2FsX2NvdW50OworfQorCisvKiogQGJyaWVmIENvcHkgZGF0YSBmcm9tIHVzZXIgc3BhY2UgdG8gY2lyY3VsYXIgYnVmZmVyLgorKiBAcGFyYW0gaW5zdGFuY2UgVGhlIHN1YmRldmljZSBpbnN0YW5jZSAocG9pbnRlcikuCisqIEBwYXJhbSBjb3VudCBOdW1iZXIgb2YgZGF0YXMgaW4gdXNlciBzcGFjZS4KKyogQHBhcmFtIHVzZXJfdmFsdWVzIEJ1ZmZlcidzIHBvaW50ZXIuCisqCisqIEByZXR1cm4gT24gc3VjY2VzczogTnVtYmVyIG9mIGNvcGllZCB2YWx1ZXMuCisqIEByZXR1cm4gT24gZXJyb3I6IC1NRV9FUlJOT19JTlRFUk5BTC4KKyovCitpbnQgaW5saW5lIGFvX2dldF9kYXRhX2Zyb21fdXNlcihtZTQ2MDBfYW9fc3ViZGV2aWNlX3QgKiBpbnN0YW5jZSwgaW50IGNvdW50LAorCQkJCSBpbnQgKnVzZXJfdmFsdWVzKQoreworCWludCBpLCBlcnI7CisJaW50IGVtcHR5X3NwYWNlOworCWludCBjb3BpZWQ7CisJaW50IHZhbHVlOworCisJZW1wdHlfc3BhY2UgPSBtZV9jaXJjX2J1Zl9zcGFjZSgmaW5zdGFuY2UtPmNpcmNfYnVmKTsKKwkvL1dlIGhhdmUgb25seSB0aGlzIHNwYWNlIGZyZWUuCisJY29waWVkID0gKGNvdW50IDwgZW1wdHlfc3BhY2UpID8gY291bnQgOiBlbXB0eV9zcGFjZTsKKwlmb3IgKGkgPSAwOyBpIDwgY29waWVkOyBpKyspIHsJLy9Db3B5IGZyb20gdXNlciB0byBidWZmZXIKKwkJaWYgKChlcnIgPSBnZXRfdXNlcih2YWx1ZSwgKGludCAqKSh1c2VyX3ZhbHVlcyArIGkpKSkpIHsKKwkJCVBFUlJPUgorCQkJICAgICgiQlVGRkVSIExPQURFRDogZ2V0X3VzZXIoMHglcCkgcmV0dXJuIGFuIGVycm9yOiAlZC4gaWR4PSVkXG4iLAorCQkJICAgICB1c2VyX3ZhbHVlcyArIGksIGVyciwgaW5zdGFuY2UtPmFvX2lkeCk7CisJCQlyZXR1cm4gLU1FX0VSUk5PX0lOVEVSTkFMOworCQl9CisJCS8vLyBAbm90ZSBUaGUgYW5hbG9nIG91dHB1dCBpbiBtZTQ2MDAgc2VyaWVzIGhhcyBzaXplIG9mIDE2IGJpdHMuCisJCSooaW5zdGFuY2UtPmNpcmNfYnVmLmJ1ZiArIGluc3RhbmNlLT5jaXJjX2J1Zi5oZWFkKSA9CisJCSAgICAodWludDE2X3QpIHZhbHVlOworCQlpbnN0YW5jZS0+Y2lyY19idWYuaGVhZCsrOworCQlpbnN0YW5jZS0+Y2lyY19idWYuaGVhZCAmPSBpbnN0YW5jZS0+Y2lyY19idWYubWFzazsKKwl9CisKKwlQSU5GTygiQlVGRkVSIExPQURFRCAlZCB2YWx1ZXMuIGlkeD0lZFxuIiwgY29waWVkLCBpbnN0YW5jZS0+YW9faWR4KTsKKwlyZXR1cm4gY29waWVkOworfQorCisvKiogQGJyaWVmIENoZWNraW5nIGFjdHVhbCBoYXJkd2FyZSBhbmQgbG9naWNhbCBzdGF0ZS4KKyogQHBhcmFtIGluc3RhbmNlIFRoZSBzdWJkZXZpY2UgaW5zdGFuY2UgKHBvaW50ZXIpLgorKi8KK3N0YXRpYyB2b2lkIG1lNDYwMF9hb193b3JrX2NvbnRyb2xfdGFzaygKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMjApCisJCQkJCSAgICAgICB2b2lkICpzdWJkZXZpY2UKKyNlbHNlCisJCQkJCSAgICAgICBzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmsKKyNlbmRpZgorICAgICkKK3sKKwltZTQ2MDBfYW9fc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCXVuc2lnbmVkIGxvbmcgY3B1X2ZsYWdzID0gMDsKKwl1aW50MzJfdCBzdGF0dXM7CisJdWludDMyX3QgY3RybDsKKwl1aW50MzJfdCBzeW5jaDsKKwlpbnQgcmVzY2hlZHVsZSA9IDA7CisJaW50IHNpZ25hbGluZyA9IDA7CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMjApCisJaW5zdGFuY2UgPSAobWU0NjAwX2FvX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKyNlbHNlCisJaW5zdGFuY2UgPQorCSAgICBjb250YWluZXJfb2YoKHZvaWQgKil3b3JrLCBtZTQ2MDBfYW9fc3ViZGV2aWNlX3QsIGFvX2NvbnRyb2xfdGFzayk7CisjZW5kaWYKKwlQSU5GTygiPCVzOiAlbGQ+IGV4ZWN1dGVkLiBpZHg9JWRcbiIsIF9fZnVuY19fLCBqaWZmaWVzLAorCSAgICAgIGluc3RhbmNlLT5hb19pZHgpOworCisJc3RhdHVzID0gaW5sKGluc3RhbmNlLT5zdGF0dXNfcmVnKTsKKwlQREVCVUdfUkVHKCJzdGF0dXNfcmVnIGlubCgweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+c3RhdHVzX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgc3RhdHVzKTsKKworCXN3aXRjaCAoaW5zdGFuY2UtPnN0YXR1cykgewkvLyBDaGVja2luZyBhY3R1YWwgbW9kZS4KKworCQkvLyBOb3QgY29uZmlndXJlZCBmb3Igd29yay4KKwljYXNlIGFvX3N0YXR1c19ub25lOgorCQlicmVhazsKKworCQkvL1RoaXMgYXJlIHN0YWJsZSBtb2Rlcy4gTm8gbmVlZCB0byBkbyBhbnl0aGluZy4gKD8pCisJY2FzZSBhb19zdGF0dXNfc2luZ2xlX2NvbmZpZ3VyZWQ6CisJY2FzZSBhb19zdGF0dXNfc3RyZWFtX2NvbmZpZ3VyZWQ6CisJY2FzZSBhb19zdGF0dXNfc3RyZWFtX2ZpZm9fZXJyb3I6CisJY2FzZSBhb19zdGF0dXNfc3RyZWFtX2J1ZmZlcl9lcnJvcjoKKwljYXNlIGFvX3N0YXR1c19zdHJlYW1fZXJyb3I6CisJCVBFUlJPUigiU2hvdWxkbid0IGJlIHJ1bm5pbmchLlxuIik7CisJCWJyZWFrOworCisJY2FzZSBhb19zdGF0dXNfc3RyZWFtX2VuZDoKKwkJaWYgKCFpbnN0YW5jZS0+ZmlmbykgeworCQkJUEVSUk9SX0NSSVRJQ0FMCisJCQkgICAgKCJTdHJlYW1pbmcgb24gc2luZ2xlIGRldmljZSEgVGhpcyBmZWF0dXJlIGlzIG5vdCBpbXBsZW1lbnRlZCBpbiB0aGlzIHZlcnNpb24hXG4iKTsKKwkJCWluc3RhbmNlLT5zdGF0dXMgPSBhb19zdGF0dXNfc3RyZWFtX2Vycm9yOworCQkJLy8gU2lnbmFsIHRoZSBlbmQuCisJCQlzaWduYWxpbmcgPSAxOworCQkJYnJlYWs7CisJCX0KKwljYXNlIGFvX3N0YXR1c19zaW5nbGVfZW5kOgorCQlpZiAoc3RhdHVzICYgTUU0NjAwX0FPX1NUQVRVU19CSVRfRlNNKSB7CS8vIFN0YXRlIG1hY2hpbmUgaXMgd29ya2luZyBidXQgdGhlIHN0YXR1cyBpcyBzZXQgdG8gZW5kLiBGb3JjZSBzdG9wLgorCisJCQkvLyBXYWl0IGZvciBzdG9wLgorCQkJcmVzY2hlZHVsZSA9IDE7CisJCX0KKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCQkvLyBTdG9wIGFsbCBhY3Rpb25zLiBObyBjb25kaXRpb25zISBCbG9jayBpbnRlcnJ1cHRzIGFuZCB0cmlnZ2VyLiBMZWF2ZSBGSUZPIHVudG91Y2hlZCEKKwkJY3RybCA9IGlubChpbnN0YW5jZS0+Y3RybF9yZWcpOworCQljdHJsIHw9CisJCSAgICBNRTQ2MDBfQU9fQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1AgfCBNRTQ2MDBfQU9fQ1RSTF9CSVRfU1RPUAorCQkgICAgfCBNRTQ2MDBfQU9fQ1RSTF9CSVRfUkVTRVRfSVJROworCQljdHJsICY9CisJCSAgICB+KE1FNDYwMF9BT19DVFJMX0JJVF9FTkFCTEVfSVJRIHwKKwkJICAgICAgTUU0NjAwX0FPX0NUUkxfQklUX0VOQUJMRV9FWF9UUklHKTsKKwkJY3RybCAmPQorCQkgICAgfihNRTQ2MDBfQU9fQ1RSTF9CSVRfRVhfVFJJR19FREdFIHwKKwkJICAgICAgTUU0NjAwX0FPX0NUUkxfQklUX0VYX1RSSUdfRURHRV9CT1RIKTsKKwkJb3V0bChjdHJsLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCBjdHJsKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCQlicmVhazsKKworCQkvLyBTaW5nbGUgbW9kZXMKKwljYXNlIGFvX3N0YXR1c19zaW5nbGVfcnVuX3dhaXQ6CisJY2FzZSBhb19zdGF0dXNfc2luZ2xlX3J1bjoKKwljYXNlIGFvX3N0YXR1c19zaW5nbGVfZW5kX3dhaXQ6CisKKwkJaWYgKCEoc3RhdHVzICYgTUU0NjAwX0FPX1NUQVRVU19CSVRfRlNNKSkgewkvLyBTdGF0ZSBtYWNoaW5lIGlzIG5vdCB3b3JraW5nLgorCQkJaWYgKCgoaW5zdGFuY2UtPmZpZm8pCisJCQkgICAgICYmICghKHN0YXR1cyAmIE1FNDYwMF9BT19TVEFUVVNfQklUX0VGKSkpCisJCQkgICAgfHwgKCEoaW5zdGFuY2UtPmZpZm8pKSkgewkvLyBTaW5nbGUgaXMgaW4gZW5kIHN0YXRlLgorCQkJCVBERUJVRygiU2luZ2xlIGNhbGwgaGFzIGJlZW4gY29tcGxpdGVkLlxuIik7CisKKwkJCQkvLyBTZXQgY29ycmVjdCB2YWx1ZSBmb3Igc2luZ2xlX3JlYWQoKTsKKwkJCQlpbnN0YW5jZS0+c2luZ2xlX3ZhbHVlID0KKwkJCQkgICAgaW5zdGFuY2UtPnNpbmdsZV92YWx1ZV9pbl9maWZvOworCisJCQkJLy8gU2V0IHN0YXR1cyBhcyAnYW9fc3RhdHVzX3NpbmdsZV9lbmQnCisJCQkJaW5zdGFuY2UtPnN0YXR1cyA9IGFvX3N0YXR1c19zaW5nbGVfZW5kOworCisJCQkJLy8gU2lnbmFsIHRoZSBlbmQuCisJCQkJc2lnbmFsaW5nID0gMTsKKwkJCQkvLyBXYWl0IGZvciBzdG9wIElTTS4KKwkJCQlyZXNjaGVkdWxlID0gMTsKKworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCS8vIENoZWNrIHRpbWVvdXQuCisJCWlmICgoaW5zdGFuY2UtPnRpbWVvdXQuZGVsYXkpICYmICgoamlmZmllcyAtIGluc3RhbmNlLT50aW1lb3V0LnN0YXJ0X3RpbWUpID49IGluc3RhbmNlLT50aW1lb3V0LmRlbGF5KSkgewkvLyBUaW1lb3V0CisJCQlQREVCVUcoIlRpbWVvdXQgcmVhY2hlZC5cbiIpOworCQkJLy8gU3RvcCBhbGwgYWN0aW9ucy4gTm8gY29uZGl0aW9ucyEgQmxvY2sgaW50ZXJydXB0cyBhbmQgdHJpZ2dlci4gTGVhdmUgRklGTyB1bnRvdWNoZWQhCisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCQkJY3RybCA9IGlubChpbnN0YW5jZS0+Y3RybF9yZWcpOworCQkJY3RybCB8PQorCQkJICAgIE1FNDYwMF9BT19DVFJMX0JJVF9TVE9QIHwKKwkJCSAgICBNRTQ2MDBfQU9fQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1AgfAorCQkJICAgIE1FNDYwMF9BT19DVFJMX0JJVF9SRVNFVF9JUlE7CisJCQljdHJsICY9CisJCQkgICAgfihNRTQ2MDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0lSUSB8CisJCQkgICAgICBNRTQ2MDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0VYX1RSSUcpOworCQkJLy8vIEZpeCBmb3IgdGltZW91dCBlcnJvci4KKwkJCWN0cmwgJj0KKwkJCSAgICB+KE1FNDYwMF9BT19DVFJMX0JJVF9FWF9UUklHX0VER0UgfAorCQkJICAgICAgTUU0NjAwX0FPX0NUUkxfQklUX0VYX1RSSUdfRURHRV9CT1RIKTsKKwkJCWlmIChpbnN0YW5jZS0+ZmlmbykgewkvL0Rpc2FibGluZyBGSUZPCisJCQkJY3RybCAmPSB+TUU0NjAwX0FPX0NUUkxfQklUX0VOQUJMRV9GSUZPOworCQkJfQorCQkJb3V0bChjdHJsLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQkJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIGN0cmwpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLAorCQkJCQkgICAgICAgY3B1X2ZsYWdzKTsKKworCQkJc3Bpbl9sb2NrKGluc3RhbmNlLT5wcmVsb2FkX3JlZ19sb2NrKTsKKwkJCS8vUmVtb3ZlIGZyb20gc3luY2hyb25vdXMgc3RhcnQuIEJsb2NrIHRyaWdnZXJpbmcgZnJvbSB0aGlzIG91dHB1dC4KKwkJCXN5bmNoID0gaW5sKGluc3RhbmNlLT5wcmVsb2FkX3JlZyk7CisJCQlzeW5jaCAmPQorCQkJICAgIH4oKE1FNDYwMF9BT19TWU5DX0hPTEQgfCBNRTQ2MDBfQU9fU1lOQ19FWFRfVFJJRykgPDwKKwkJCSAgICAgIGluc3RhbmNlLT5hb19pZHgpOworCQkJaWYgKCEoaW5zdGFuY2UtPmZpZm8pKSB7CS8vIE5vIEZJRk8gLSBzZXQgdG8gc2luZ2xlIHNhZmUgbW9kZQorCQkJCXN5bmNoIHw9CisJCQkJICAgIE1FNDYwMF9BT19TWU5DX0hPTEQgPDwgaW5zdGFuY2UtPmFvX2lkeDsKKwkJCX0KKwkJCW91dGwoc3luY2gsIGluc3RhbmNlLT5wcmVsb2FkX3JlZyk7CisJCQlQREVCVUdfUkVHKCJwcmVsb2FkX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICBpbnN0YW5jZS0+cHJlbG9hZF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgc3luY2gpOworCQkJc3Bpbl91bmxvY2soaW5zdGFuY2UtPnByZWxvYWRfcmVnX2xvY2spOworCisJCQlpZiAoIShpbnN0YW5jZS0+ZmlmbykpIHsJLy8gTm8gRklGTworCQkJCS8vIFJlc3RvcmUgb2xkIHNldHRpbmdzLgorCQkJCVBERUJVRygiV3JpdGUgb2xkIHZhbHVlIGJhY2sgdG8gcmVnaXN0ZXIuXG4iKTsKKwkJCQlvdXRsKGluc3RhbmNlLT5zaW5nbGVfdmFsdWUsCisJCQkJICAgICBpbnN0YW5jZS0+c2luZ2xlX3JlZyk7CisJCQkJUERFQlVHX1JFRworCQkJCSAgICAoInNpbmdsZV9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCQkgICAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICAgIGluc3RhbmNlLT5zaW5nbGVfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgICAgaW5zdGFuY2UtPnNpbmdsZV92YWx1ZSk7CisJCQl9CisJCQkvLyBTZXQgY29ycmVjdCB2YWx1ZSBmb3Igc2luZ2xlX3JlYWQoKTsKKwkJCWluc3RhbmNlLT5zaW5nbGVfdmFsdWVfaW5fZmlmbyA9IGluc3RhbmNlLT5zaW5nbGVfdmFsdWU7CisKKwkJCWluc3RhbmNlLT5zdGF0dXMgPSBhb19zdGF0dXNfc2luZ2xlX2VuZDsKKworCQkJLy8gU2lnbmFsIHRoZSBlbmQuCisJCQlzaWduYWxpbmcgPSAxOworCQl9CisJCS8vIFdhaXQgZm9yIHN0b3AuCisJCXJlc2NoZWR1bGUgPSAxOworCQlicmVhazsKKworCQkvLyBTdHJlYW0gbW9kZXMKKwljYXNlIGFvX3N0YXR1c19zdHJlYW1fcnVuX3dhaXQ6CisJCWlmICghaW5zdGFuY2UtPmZpZm8pIHsKKwkJCVBFUlJPUl9DUklUSUNBTAorCQkJICAgICgiU3RyZWFtaW5nIG9uIHNpbmdsZSBkZXZpY2UhIFRoaXMgZmVhdHVyZSBpcyBub3QgaW1wbGVtZW50ZWQgaW4gdGhpcyB2ZXJzaW9uIVxuIik7CisJCQlpbnN0YW5jZS0+c3RhdHVzID0gYW9fc3RhdHVzX3N0cmVhbV9lcnJvcjsKKwkJCS8vIFNpZ25hbCB0aGUgZW5kLgorCQkJc2lnbmFsaW5nID0gMTsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKHN0YXR1cyAmIE1FNDYwMF9BT19TVEFUVVNfQklUX0ZTTSkgewkvLyBTdGF0ZSBtYWNoaW5lIGlzIHdvcmtpbmcuIFdhaXRpbmcgZm9yIHN0YXJ0IGZpbmlzaC4KKwkJCWluc3RhbmNlLT5zdGF0dXMgPSBhb19zdGF0dXNfc3RyZWFtX3J1bjsKKworCQkJLy8gU2lnbmFsIGVuZCBvZiB0aGlzIHN0ZXAKKwkJCXNpZ25hbGluZyA9IDE7CisJCX0gZWxzZSB7CS8vIFN0YXRlIG1hY2hpbmUgaXMgbm90IHdvcmtpbmcuCisJCQlpZiAoIShzdGF0dXMgJiBNRTQ2MDBfQU9fU1RBVFVTX0JJVF9FRikpIHsJLy8gRklGTyBpcyBlbXB0eS4gUHJvY2VkdXJlIGhhcyBzdGFydGVkIGFuZCBmaW5pc2ggYWxyZWFkeSEKKwkJCQlpbnN0YW5jZS0+c3RhdHVzID0gYW9fc3RhdHVzX3N0cmVhbV9lbmQ7CisKKwkJCQkvLyBTaWduYWwgdGhlIGVuZC4KKwkJCQlzaWduYWxpbmcgPSAxOworCQkJCS8vIFdhaXQgZm9yIHN0b3AuCisJCQkJcmVzY2hlZHVsZSA9IDE7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQkvLyBDaGVjayB0aW1lb3V0LgorCQlpZiAoKGluc3RhbmNlLT50aW1lb3V0LmRlbGF5KSAmJiAoKGppZmZpZXMgLSBpbnN0YW5jZS0+dGltZW91dC5zdGFydF90aW1lKSA+PSBpbnN0YW5jZS0+dGltZW91dC5kZWxheSkpIHsJLy8gVGltZW91dAorCQkJUERFQlVHKCJUaW1lb3V0IHJlYWNoZWQuXG4iKTsKKwkJCS8vIFN0b3AgYWxsIGFjdGlvbnMuIE5vIGNvbmRpdGlvbnMhIEJsb2NrIGludGVycnVwdHMuIExlYXZlIEZJRk8gdW50b3VjaGVkIQorCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKwkJCWN0cmwgPSBpbmwoaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJCWN0cmwgfD0KKwkJCSAgICBNRTQ2MDBfQU9fQ1RSTF9CSVRfU1RPUCB8CisJCQkgICAgTUU0NjAwX0FPX0NUUkxfQklUX0lNTUVESUFURV9TVE9QIHwKKwkJCSAgICBNRTQ2MDBfQU9fQ1RSTF9CSVRfUkVTRVRfSVJROworCQkJY3RybCAmPQorCQkJICAgIH4oTUU0NjAwX0FPX0NUUkxfQklUX0VOQUJMRV9JUlEgfAorCQkJICAgICAgTUU0NjAwX0FPX0NUUkxfQklUX0VOQUJMRV9FWF9UUklHKTsKKwkJCW91dGwoY3RybCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICBjdHJsKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywKKwkJCQkJICAgICAgIGNwdV9mbGFncyk7CisJCQlzcGluX2xvY2soaW5zdGFuY2UtPnByZWxvYWRfcmVnX2xvY2spOworCQkJLy9SZW1vdmUgZnJvbSBzeW5jaHJvbm91cyBzdGFydC4gQmxvY2sgdHJpZ2dlcmluZyBmcm9tIHRoaXMgb3V0cHV0LgorCQkJc3luY2ggPSBpbmwoaW5zdGFuY2UtPnByZWxvYWRfcmVnKTsKKwkJCXN5bmNoICY9CisJCQkgICAgfigoTUU0NjAwX0FPX1NZTkNfSE9MRCB8IE1FNDYwMF9BT19TWU5DX0VYVF9UUklHKSA8PAorCQkJICAgICAgaW5zdGFuY2UtPmFvX2lkeCk7CisJCQlvdXRsKHN5bmNoLCBpbnN0YW5jZS0+cHJlbG9hZF9yZWcpOworCQkJUERFQlVHX1JFRygicHJlbG9hZF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgaW5zdGFuY2UtPnByZWxvYWRfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIHN5bmNoKTsKKwkJCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5wcmVsb2FkX3JlZ19sb2NrKTsKKworCQkJaW5zdGFuY2UtPnN0YXR1cyA9IGFvX3N0YXR1c19zdHJlYW1fZW5kOworCisJCQkvLyBTaWduYWwgdGhlIGVuZC4KKwkJCXNpZ25hbGluZyA9IDE7CisJCX0KKwkJLy8gV2FpdCBmb3Igc3RvcC4KKwkJcmVzY2hlZHVsZSA9IDE7CisJCWJyZWFrOworCisJY2FzZSBhb19zdGF0dXNfc3RyZWFtX3J1bjoKKwkJaWYgKCFpbnN0YW5jZS0+ZmlmbykgeworCQkJUEVSUk9SX0NSSVRJQ0FMCisJCQkgICAgKCJTdHJlYW1pbmcgb24gc2luZ2xlIGRldmljZSEgVGhpcyBmZWF0dXJlIGlzIG5vdCBpbXBsZW1lbnRlZCBpbiB0aGlzIHZlcnNpb24hXG4iKTsKKwkJCWluc3RhbmNlLT5zdGF0dXMgPSBhb19zdGF0dXNfc3RyZWFtX2Vycm9yOworCQkJLy8gU2lnbmFsIHRoZSBlbmQuCisJCQlzaWduYWxpbmcgPSAxOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoIShzdGF0dXMgJiBNRTQ2MDBfQU9fU1RBVFVTX0JJVF9GU00pKSB7CS8vIFN0YXRlIG1hY2hpbmUgaXMgbm90IHdvcmtpbmcuIFRoaXMgaXMgYW4gZXJyb3IuCisJCQkvLyBCUk9LRU4gUElQRSEKKwkJCWlmICghKHN0YXR1cyAmIE1FNDYwMF9BT19TVEFUVVNfQklUX0VGKSkgewkvLyBGSUZPIGlzIGVtcHR5LgorCQkJCWlmIChtZV9jaXJjX2J1Zl92YWx1ZXMoJmluc3RhbmNlLT5jaXJjX2J1ZikpIHsJLy8gU29mdHdhcmUgYnVmZmVyIGlzIG5vdCBlbXB0eS4KKwkJCQkJaWYgKGluc3RhbmNlLT5zdG9wX2RhdGFfY291bnQgJiYgKGluc3RhbmNlLT5zdG9wX2RhdGFfY291bnQgPD0gaW5zdGFuY2UtPmRhdGFfY291bnQpKSB7CS8vRmluaXNoaW5nIHdvcmsuIFJlcXVlZCBkYXRhIHNob3duLgorCQkJCQkJUERFQlVHCisJCQkJCQkgICAgKCJJU00gc3RvcGVkLiBObyBkYXRhIGluIEZJRk8uIEJ1ZmZlciBpcyBub3QgZW1wdHkuXG4iKTsKKwkJCQkJCWluc3RhbmNlLT5zdGF0dXMgPQorCQkJCQkJICAgIGFvX3N0YXR1c19zdHJlYW1fZW5kOworCQkJCQl9IGVsc2UgeworCQkJCQkJUEVSUk9SCisJCQkJCQkgICAgKCJPdXRwdXQgc3RyZWFtIGhhcyBiZWVuIGJyb2tlbi4gSVNNIHN0b3BlZC4gTm8gZGF0YSBpbiBGSUZPLiBCdWZmZXIgaXMgbm90IGVtcHR5LlxuIik7CisJCQkJCQlpbnN0YW5jZS0+c3RhdHVzID0KKwkJCQkJCSAgICBhb19zdGF0dXNfc3RyZWFtX2J1ZmZlcl9lcnJvcjsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CS8vIFNvZnR3YXJlIGJ1ZmZlciBpcyBlbXB0eS4KKwkJCQkJUERFQlVHCisJCQkJCSAgICAoIklTTSBzdG9wZWQuIE5vIGRhdGEgaW4gRklGTy4gQnVmZmVyIGlzIGVtcHR5LlxuIik7CisJCQkJCWluc3RhbmNlLT5zdGF0dXMgPSBhb19zdGF0dXNfc3RyZWFtX2VuZDsKKwkJCQl9CisJCQl9IGVsc2UgewkvLyBUaGVyZSBhcmUgc3RpbGwgZGF0YXMgaW4gRklGTy4KKwkJCQlpZiAobWVfY2lyY19idWZfdmFsdWVzKCZpbnN0YW5jZS0+Y2lyY19idWYpKSB7CS8vIFNvZnR3YXJlIGJ1ZmZlciBpcyBub3QgZW1wdHkuCisJCQkJCVBFUlJPUgorCQkJCQkgICAgKCJPdXRwdXQgc3RyZWFtIGhhcyBiZWVuIGJyb2tlbi4gSVNNIHN0b3BlZCBidXQgc29tZSBkYXRhIGluIEZJRk8gYW5kIGJ1ZmZlci5cbiIpOworCQkJCX0gZWxzZSB7CS8vIFNvZnR3YXJlIGJ1ZmZlciBpcyBlbXB0eS4KKwkJCQkJUEVSUk9SCisJCQkJCSAgICAoIk91dHB1dCBzdHJlYW0gaGFzIGJlZW4gYnJva2VuLiBJU00gc3RvcGVkIGJ1dCBzb21lIGRhdGEgaW4gRklGTy4gQnVmZmVyIGlzIGVtcHR5LlxuIik7CisJCQkJfQorCQkJCWluc3RhbmNlLT5zdGF0dXMgPSBhb19zdGF0dXNfc3RyZWFtX2ZpZm9fZXJyb3I7CisKKwkJCX0KKworCQkJLy8gU2lnbmFsIHRoZSBmYWlsdXJlLgorCQkJc2lnbmFsaW5nID0gMTsKKwkJCWJyZWFrOworCQl9CisJCS8vIFdhaXQgZm9yIHN0b3AuCisJCXJlc2NoZWR1bGUgPSAxOworCQlicmVhazsKKworCWNhc2UgYW9fc3RhdHVzX3N0cmVhbV9lbmRfd2FpdDoKKwkJaWYgKCFpbnN0YW5jZS0+ZmlmbykgeworCQkJUEVSUk9SX0NSSVRJQ0FMCisJCQkgICAgKCJTdHJlYW1pbmcgb24gc2luZ2xlIGRldmljZSEgVGhpcyBmZWF0dXJlIGlzIG5vdCBpbXBsZW1lbnRlZCBpbiB0aGlzIHZlcnNpb24hXG4iKTsKKwkJCWluc3RhbmNlLT5zdGF0dXMgPSBhb19zdGF0dXNfc3RyZWFtX2Vycm9yOworCQkJLy8gU2lnbmFsIHRoZSBlbmQuCisJCQlzaWduYWxpbmcgPSAxOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoIShzdGF0dXMgJiBNRTQ2MDBfQU9fU1RBVFVTX0JJVF9GU00pKSB7CS8vIFN0YXRlIG1hY2hpbmUgaXMgbm90IHdvcmtpbmcuIFdhaXRpbmcgZm9yIHN0b3AgZmluaXNoLgorCQkJaW5zdGFuY2UtPnN0YXR1cyA9IGFvX3N0YXR1c19zdHJlYW1fZW5kOworCQkJc2lnbmFsaW5nID0gMTsKKwkJfQorCQkvLyBTdGF0ZSBtYWNoaW5lIGlzIHdvcmtpbmcuCisJCXJlc2NoZWR1bGUgPSAxOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCVBFUlJPUl9DUklUSUNBTCgiU3RhdHVzIGlzIGluIHdyb25nIHN0YXRlICglZCkhXG4iLAorCQkJCWluc3RhbmNlLT5zdGF0dXMpOworCQlpbnN0YW5jZS0+c3RhdHVzID0gYW9fc3RhdHVzX3N0cmVhbV9lcnJvcjsKKwkJLy8gU2lnbmFsIHRoZSBlbmQuCisJCXNpZ25hbGluZyA9IDE7CisJCWJyZWFrOworCisJfQorCisJaWYgKHNpZ25hbGluZykgewkvL1NpZ25hbCBpdC4KKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlX2FsbCgmaW5zdGFuY2UtPndhaXRfcXVldWUpOworCX0KKworCWlmIChpbnN0YW5jZS0+YW9fY29udHJvbF90YXNrX2ZsYWcgJiYgcmVzY2hlZHVsZSkgewkvLyBSZXNjaGVkdWxlIHRhc2sKKwkJcXVldWVfZGVsYXllZF93b3JrKGluc3RhbmNlLT5tZTQ2MDBfd29ya3F1ZXVlLAorCQkJCSAgICZpbnN0YW5jZS0+YW9fY29udHJvbF90YXNrLCAxKTsKKwl9IGVsc2UgeworCQlQSU5GTygiPCVzPiBFbmRpbmcgY29udHJvbCB0YXNrLlxuIiwgX19mdW5jX18pOworCX0KKworfQorI2Vsc2UKKy8vLyBAbm90ZSBTUEVDSUFMIEJVSUxEIEZPUiBCT1NDSAorLy8vIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorc3RhdGljIGludCBtZTQ2MDBfYW9faW9fcmVzZXRfc3ViZGV2aWNlKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQlzdHJ1Y3QgZmlsZSAqZmlsZXAsIGludCBmbGFncykKK3sKKwltZTQ2MDBfYW9fc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCXVpbnQzMl90IHRtcDsKKwl1bnNpZ25lZCBsb25nIHN0YXR1czsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lNDYwMF9hb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlNRV9TVUJERVZJQ0VfRU5URVIgc3Bpbl9sb2NrX2lycXNhdmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgc3RhdHVzKTsKKwlzcGluX2xvY2soaW5zdGFuY2UtPnByZWxvYWRfcmVnX2xvY2spOworCXRtcCA9IGlubChpbnN0YW5jZS0+cHJlbG9hZF9yZWcpOworCXRtcCAmPSB+KDB4MTAwMDEgPDwgaW5zdGFuY2UtPmFvX2lkeCk7CisJb3V0bCh0bXAsIGluc3RhbmNlLT5wcmVsb2FkX3JlZyk7CisJKmluc3RhbmNlLT5wcmVsb2FkX2ZsYWdzICY9IH4oMHgxIDw8IGluc3RhbmNlLT5hb19pZHgpOworCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5wcmVsb2FkX3JlZ19sb2NrKTsKKworCXRtcCA9IGlubChpbnN0YW5jZS0+Y3RybF9yZWcpOworCXRtcCB8PSBNRTQ2MDBfQU9fQ1RSTF9CSVRfU1RPUCB8IE1FNDYwMF9BT19DVFJMX0JJVF9JTU1FRElBVEVfU1RPUDsKKwlvdXRsKHRtcCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKworCXdoaWxlIChpbmwoaW5zdGFuY2UtPnN0YXR1c19yZWcpICYgTUU0NjAwX0FPX1NUQVRVU19CSVRfRlNNKSA7CisKKwlvdXRsKE1FNDYwMF9BT19DVFJMX0JJVF9TVE9QIHwgTUU0NjAwX0FPX0NUUkxfQklUX0lNTUVESUFURV9TVE9QLAorCSAgICAgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKworCW91dGwoMHg4MDAwLCBpbnN0YW5jZS0+c2luZ2xlX3JlZyk7CisKKwlpbnN0YW5jZS0+c2luZ2xlX3ZhbHVlID0gMHg4MDAwOworCWluc3RhbmNlLT5jaXJjX2J1Zi5oZWFkID0gMDsKKwlpbnN0YW5jZS0+Y2lyY19idWYudGFpbCA9IDA7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIHN0YXR1cyk7CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWU0NjAwX2FvX2lvX3NpbmdsZV9jb25maWcobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICAgIGludCBjaGFubmVsLAorCQkJCSAgICAgIGludCBzaW5nbGVfY29uZmlnLAorCQkJCSAgICAgIGludCByZWYsCisJCQkJICAgICAgaW50IHRyaWdfY2hhbiwKKwkJCQkgICAgICBpbnQgdHJpZ190eXBlLCBpbnQgdHJpZ19lZGdlLCBpbnQgZmxhZ3MpCit7CisJbWU0NjAwX2FvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwl1aW50MzJfdCB0bXA7CisJdW5zaWduZWQgbG9uZyBjcHVfZmxhZ3M7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbnN0YW5jZSA9IChtZTQ2MDBfYW9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJTUVfU1VCREVWSUNFX0VOVEVSCisJICAgIHNwaW5fbG9ja19pcnFzYXZlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisKKwlpZiAoaW5sKGluc3RhbmNlLT5zdGF0dXNfcmVnKSAmIE1FNDYwMF9BT19TVEFUVVNfQklUX0ZTTSkgeworCQlQRVJST1IoIlN1YmRldmljZSBpcyBidXN5LlxuIik7CisJCWVyciA9IE1FX0VSUk5PX1NVQkRFVklDRV9CVVNZOworCQlnb3RvIEVSUk9SOworCX0KKworCWlmIChjaGFubmVsID09IDApIHsKKwkJaWYgKHNpbmdsZV9jb25maWcgPT0gMCkgeworCQkJaWYgKHJlZiA9PSBNRV9SRUZfQU9fR1JPVU5EKSB7CisJCQkJaWYgKHRyaWdfY2hhbiA9PSBNRV9UUklHX0NIQU5fREVGQVVMVCkgeworCQkJCQlpZiAodHJpZ190eXBlID09IE1FX1RSSUdfVFlQRV9TVykgeworCQkJCQkJdG1wID0gaW5sKGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCQkJCQl0bXAgfD0KKwkJCQkJCSAgICBNRTQ2MDBfQU9fQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1A7CisJCQkJCQlvdXRsKHRtcCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJCQkJCXRtcCA9CisJCQkJCQkgICAgTUU0NjAwX0FPX0NUUkxfQklUX0lNTUVESUFURV9TVE9QOworCQkJCQkJb3V0bCh0bXAsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisKKwkJCQkJCXNwaW5fbG9jayhpbnN0YW5jZS0+CisJCQkJCQkJICBwcmVsb2FkX3JlZ19sb2NrKTsKKwkJCQkJCXRtcCA9CisJCQkJCQkgICAgaW5sKGluc3RhbmNlLT5wcmVsb2FkX3JlZyk7CisJCQkJCQl0bXAgJj0KKwkJCQkJCSAgICB+KDB4MTAwMDEgPDwgaW5zdGFuY2UtPgorCQkJCQkJICAgICAgYW9faWR4KTsKKwkJCQkJCW91dGwodG1wLAorCQkJCQkJICAgICBpbnN0YW5jZS0+cHJlbG9hZF9yZWcpOworCQkJCQkJKmluc3RhbmNlLT5wcmVsb2FkX2ZsYWdzICY9CisJCQkJCQkgICAgfigweDEgPDwgaW5zdGFuY2UtPmFvX2lkeCk7CisJCQkJCQlzcGluX3VubG9jayhpbnN0YW5jZS0+CisJCQkJCQkJICAgIHByZWxvYWRfcmVnX2xvY2spOworCQkJCQl9IGVsc2UgaWYgKHRyaWdfdHlwZSA9PQorCQkJCQkJICAgTUVfVFJJR19UWVBFX0VYVF9ESUdJVEFMKSB7CisJCQkJCQlpZiAodHJpZ19lZGdlID09CisJCQkJCQkgICAgTUVfVFJJR19FREdFX1JJU0lORykgeworCQkJCQkJCXRtcCA9CisJCQkJCQkJICAgIGlubChpbnN0YW5jZS0+CisJCQkJCQkJCWN0cmxfcmVnKTsKKwkJCQkJCQl0bXAgfD0KKwkJCQkJCQkgICAgTUU0NjAwX0FPX0NUUkxfQklUX0lNTUVESUFURV9TVE9QOworCQkJCQkJCW91dGwodG1wLAorCQkJCQkJCSAgICAgaW5zdGFuY2UtPgorCQkJCQkJCSAgICAgY3RybF9yZWcpOworCQkJCQkJCXRtcCA9CisJCQkJCQkJICAgIE1FNDYwMF9BT19DVFJMX0JJVF9JTU1FRElBVEVfU1RPUAorCQkJCQkJCSAgICB8CisJCQkJCQkJICAgIE1FNDYwMF9BT19DVFJMX0JJVF9FTkFCTEVfRVhfVFJJRzsKKwkJCQkJCQlvdXRsKHRtcCwKKwkJCQkJCQkgICAgIGluc3RhbmNlLT4KKwkJCQkJCQkgICAgIGN0cmxfcmVnKTsKKwkJCQkJCX0gZWxzZSBpZiAodHJpZ19lZGdlID09CisJCQkJCQkJICAgTUVfVFJJR19FREdFX0ZBTExJTkcpCisJCQkJCQl7CisJCQkJCQkJdG1wID0KKwkJCQkJCQkgICAgaW5sKGluc3RhbmNlLT4KKwkJCQkJCQkJY3RybF9yZWcpOworCQkJCQkJCXRtcCB8PQorCQkJCQkJCSAgICBNRTQ2MDBfQU9fQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1A7CisJCQkJCQkJb3V0bCh0bXAsCisJCQkJCQkJICAgICBpbnN0YW5jZS0+CisJCQkJCQkJICAgICBjdHJsX3JlZyk7CisJCQkJCQkJdG1wID0KKwkJCQkJCQkgICAgTUU0NjAwX0FPX0NUUkxfQklUX0lNTUVESUFURV9TVE9QCisJCQkJCQkJICAgIHwKKwkJCQkJCQkgICAgTUU0NjAwX0FPX0NUUkxfQklUX0VOQUJMRV9FWF9UUklHCisJCQkJCQkJICAgIHwKKwkJCQkJCQkgICAgTUU0NjAwX0FPX0NUUkxfQklUX0VYX1RSSUdfRURHRTsKKwkJCQkJCQlvdXRsKHRtcCwKKwkJCQkJCQkgICAgIGluc3RhbmNlLT4KKwkJCQkJCQkgICAgIGN0cmxfcmVnKTsKKwkJCQkJCX0gZWxzZSBpZiAodHJpZ19lZGdlID09CisJCQkJCQkJICAgTUVfVFJJR19FREdFX0FOWSkgeworCQkJCQkJCXRtcCA9CisJCQkJCQkJICAgIGlubChpbnN0YW5jZS0+CisJCQkJCQkJCWN0cmxfcmVnKTsKKwkJCQkJCQl0bXAgfD0KKwkJCQkJCQkgICAgTUU0NjAwX0FPX0NUUkxfQklUX0lNTUVESUFURV9TVE9QOworCQkJCQkJCW91dGwodG1wLAorCQkJCQkJCSAgICAgaW5zdGFuY2UtPgorCQkJCQkJCSAgICAgY3RybF9yZWcpOworCQkJCQkJCXRtcCA9CisJCQkJCQkJICAgIE1FNDYwMF9BT19DVFJMX0JJVF9JTU1FRElBVEVfU1RPUAorCQkJCQkJCSAgICB8CisJCQkJCQkJICAgIE1FNDYwMF9BT19DVFJMX0JJVF9FTkFCTEVfRVhfVFJJRworCQkJCQkJCSAgICB8CisJCQkJCQkJICAgIE1FNDYwMF9BT19DVFJMX0JJVF9FWF9UUklHX0VER0UKKwkJCQkJCQkgICAgfAorCQkJCQkJCSAgICBNRTQ2MDBfQU9fQ1RSTF9CSVRfRVhfVFJJR19FREdFX0JPVEg7CisJCQkJCQkJb3V0bCh0bXAsCisJCQkJCQkJICAgICBpbnN0YW5jZS0+CisJCQkJCQkJICAgICBjdHJsX3JlZyk7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCVBFUlJPUgorCQkJCQkJCSAgICAoIkludmFsaWQgdHJpZ2dlciBlZGdlLlxuIik7CisJCQkJCQkJZXJyID0KKwkJCQkJCQkgICAgTUVfRVJSTk9fSU5WQUxJRF9UUklHX0VER0U7CisJCQkJCQkJZ290byBFUlJPUjsKKwkJCQkJCX0KKworCQkJCQkJc3Bpbl9sb2NrKGluc3RhbmNlLT4KKwkJCQkJCQkgIHByZWxvYWRfcmVnX2xvY2spOworCisJCQkJCQl0bXAgPQorCQkJCQkJICAgIGlubChpbnN0YW5jZS0+cHJlbG9hZF9yZWcpOworCQkJCQkJdG1wICY9CisJCQkJCQkgICAgfigweDEwMDAxIDw8IGluc3RhbmNlLT4KKwkJCQkJCSAgICAgIGFvX2lkeCk7CisJCQkJCQl0bXAgfD0gMHgxIDw8IGluc3RhbmNlLT5hb19pZHg7CisJCQkJCQlvdXRsKHRtcCwKKwkJCQkJCSAgICAgaW5zdGFuY2UtPnByZWxvYWRfcmVnKTsKKwkJCQkJCSppbnN0YW5jZS0+cHJlbG9hZF9mbGFncyAmPQorCQkJCQkJICAgIH4oMHgxIDw8IGluc3RhbmNlLT5hb19pZHgpOworCQkJCQkJc3Bpbl91bmxvY2soaW5zdGFuY2UtPgorCQkJCQkJCSAgICBwcmVsb2FkX3JlZ19sb2NrKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCVBFUlJPUgorCQkJCQkJICAgICgiSW52YWxpZCB0cmlnZ2VyIHR5cGUuXG4iKTsKKwkJCQkJCWVyciA9CisJCQkJCQkgICAgTUVfRVJSTk9fSU5WQUxJRF9UUklHX1RZUEU7CisJCQkJCQlnb3RvIEVSUk9SOworCQkJCQl9CisJCQkJfSBlbHNlIGlmICh0cmlnX2NoYW4gPT0KKwkJCQkJICAgTUVfVFJJR19DSEFOX1NZTkNIUk9OT1VTKSB7CisJCQkJCWlmICh0cmlnX3R5cGUgPT0gTUVfVFJJR19UWVBFX1NXKSB7CisJCQkJCQl0bXAgPSBpbmwoaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJCQkJCXRtcCB8PQorCQkJCQkJICAgIE1FNDYwMF9BT19DVFJMX0JJVF9JTU1FRElBVEVfU1RPUDsKKwkJCQkJCW91dGwodG1wLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQkJCQkJdG1wID0KKwkJCQkJCSAgICBNRTQ2MDBfQU9fQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1A7CisJCQkJCQlvdXRsKHRtcCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKworCQkJCQkJc3Bpbl9sb2NrKGluc3RhbmNlLT4KKwkJCQkJCQkgIHByZWxvYWRfcmVnX2xvY2spOworCQkJCQkJdG1wID0KKwkJCQkJCSAgICBpbmwoaW5zdGFuY2UtPnByZWxvYWRfcmVnKTsKKwkJCQkJCXRtcCAmPQorCQkJCQkJICAgIH4oMHgxMDAwMSA8PCBpbnN0YW5jZS0+CisJCQkJCQkgICAgICBhb19pZHgpOworCQkJCQkJdG1wIHw9IDB4MSA8PCBpbnN0YW5jZS0+YW9faWR4OworCQkJCQkJb3V0bCh0bXAsCisJCQkJCQkgICAgIGluc3RhbmNlLT5wcmVsb2FkX3JlZyk7CisJCQkJCQkqaW5zdGFuY2UtPnByZWxvYWRfZmxhZ3MgfD0KKwkJCQkJCSAgICAweDEgPDwgaW5zdGFuY2UtPmFvX2lkeDsKKwkJCQkJCXNwaW5fdW5sb2NrKGluc3RhbmNlLT4KKwkJCQkJCQkgICAgcHJlbG9hZF9yZWdfbG9jayk7CisJCQkJCX0gZWxzZSBpZiAodHJpZ190eXBlID09CisJCQkJCQkgICBNRV9UUklHX1RZUEVfRVhUX0RJR0lUQUwpIHsKKwkJCQkJCWlmICh0cmlnX2VkZ2UgPT0KKwkJCQkJCSAgICBNRV9UUklHX0VER0VfUklTSU5HKSB7CisJCQkJCQkJdG1wID0KKwkJCQkJCQkgICAgaW5sKGluc3RhbmNlLT4KKwkJCQkJCQkJY3RybF9yZWcpOworCQkJCQkJCXRtcCB8PQorCQkJCQkJCSAgICBNRTQ2MDBfQU9fQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1A7CisJCQkJCQkJb3V0bCh0bXAsCisJCQkJCQkJICAgICBpbnN0YW5jZS0+CisJCQkJCQkJICAgICBjdHJsX3JlZyk7CisJCQkJCQkJdG1wID0KKwkJCQkJCQkgICAgTUU0NjAwX0FPX0NUUkxfQklUX0lNTUVESUFURV9TVE9QOworCQkJCQkJCW91dGwodG1wLAorCQkJCQkJCSAgICAgaW5zdGFuY2UtPgorCQkJCQkJCSAgICAgY3RybF9yZWcpOworCQkJCQkJfSBlbHNlIGlmICh0cmlnX2VkZ2UgPT0KKwkJCQkJCQkgICBNRV9UUklHX0VER0VfRkFMTElORykKKwkJCQkJCXsKKwkJCQkJCQl0bXAgPQorCQkJCQkJCSAgICBpbmwoaW5zdGFuY2UtPgorCQkJCQkJCQljdHJsX3JlZyk7CisJCQkJCQkJdG1wIHw9CisJCQkJCQkJICAgIE1FNDYwMF9BT19DVFJMX0JJVF9JTU1FRElBVEVfU1RPUDsKKwkJCQkJCQlvdXRsKHRtcCwKKwkJCQkJCQkgICAgIGluc3RhbmNlLT4KKwkJCQkJCQkgICAgIGN0cmxfcmVnKTsKKwkJCQkJCQl0bXAgPQorCQkJCQkJCSAgICBNRTQ2MDBfQU9fQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1AKKwkJCQkJCQkgICAgfAorCQkJCQkJCSAgICBNRTQ2MDBfQU9fQ1RSTF9CSVRfRVhfVFJJR19FREdFOworCQkJCQkJCW91dGwodG1wLAorCQkJCQkJCSAgICAgaW5zdGFuY2UtPgorCQkJCQkJCSAgICAgY3RybF9yZWcpOworCQkJCQkJfSBlbHNlIGlmICh0cmlnX2VkZ2UgPT0KKwkJCQkJCQkgICBNRV9UUklHX0VER0VfQU5ZKSB7CisJCQkJCQkJdG1wID0KKwkJCQkJCQkgICAgaW5sKGluc3RhbmNlLT4KKwkJCQkJCQkJY3RybF9yZWcpOworCQkJCQkJCXRtcCB8PQorCQkJCQkJCSAgICBNRTQ2MDBfQU9fQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1A7CisJCQkJCQkJb3V0bCh0bXAsCisJCQkJCQkJICAgICBpbnN0YW5jZS0+CisJCQkJCQkJICAgICBjdHJsX3JlZyk7CisJCQkJCQkJdG1wID0KKwkJCQkJCQkgICAgTUU0NjAwX0FPX0NUUkxfQklUX0lNTUVESUFURV9TVE9QCisJCQkJCQkJICAgIHwKKwkJCQkJCQkgICAgTUU0NjAwX0FPX0NUUkxfQklUX0VYX1RSSUdfRURHRQorCQkJCQkJCSAgICB8CisJCQkJCQkJICAgIE1FNDYwMF9BT19DVFJMX0JJVF9FWF9UUklHX0VER0VfQk9USDsKKwkJCQkJCQlvdXRsKHRtcCwKKwkJCQkJCQkgICAgIGluc3RhbmNlLT4KKwkJCQkJCQkgICAgIGN0cmxfcmVnKTsKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJUEVSUk9SCisJCQkJCQkJICAgICgiSW52YWxpZCB0cmlnZ2VyIGVkZ2UuXG4iKTsKKwkJCQkJCQllcnIgPQorCQkJCQkJCSAgICBNRV9FUlJOT19JTlZBTElEX1RSSUdfRURHRTsKKwkJCQkJCQlnb3RvIEVSUk9SOworCQkJCQkJfQorCisJCQkJCQlzcGluX2xvY2soaW5zdGFuY2UtPgorCQkJCQkJCSAgcHJlbG9hZF9yZWdfbG9jayk7CisKKwkJCQkJCXRtcCA9CisJCQkJCQkgICAgaW5sKGluc3RhbmNlLT5wcmVsb2FkX3JlZyk7CisJCQkJCQl0bXAgfD0KKwkJCQkJCSAgICAweDEwMDAxIDw8IGluc3RhbmNlLT5hb19pZHg7CisJCQkJCQlvdXRsKHRtcCwKKwkJCQkJCSAgICAgaW5zdGFuY2UtPnByZWxvYWRfcmVnKTsKKwkJCQkJCSppbnN0YW5jZS0+cHJlbG9hZF9mbGFncyAmPQorCQkJCQkJICAgIH4oMHgxIDw8IGluc3RhbmNlLT5hb19pZHgpOworCQkJCQkJc3Bpbl91bmxvY2soaW5zdGFuY2UtPgorCQkJCQkJCSAgICBwcmVsb2FkX3JlZ19sb2NrKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCVBFUlJPUgorCQkJCQkJICAgICgiSW52YWxpZCB0cmlnZ2VyIHR5cGUuXG4iKTsKKwkJCQkJCWVyciA9CisJCQkJCQkgICAgTUVfRVJSTk9fSU5WQUxJRF9UUklHX1RZUEU7CisJCQkJCQlnb3RvIEVSUk9SOworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJUEVSUk9SCisJCQkJCSAgICAoIkludmFsaWQgdHJpZ2dlciBjaGFubmVsIHNwZWNpZmllZC5cbiIpOworCQkJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX1JFRjsKKwkJCQkJZ290byBFUlJPUjsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCVBFUlJPUigiSW52YWxpZCBhbmFsb2cgcmVmZXJlbmNlIHNwZWNpZmllZC5cbiIpOworCQkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfUkVGOworCQkJCWdvdG8gRVJST1I7CisJCQl9CisJCX0gZWxzZSB7CisJCQlQRVJST1IoIkludmFsaWQgc2luZ2xlIGNvbmZpZyBzcGVjaWZpZWQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfU0lOR0xFX0NPTkZJRzsKKwkJCWdvdG8gRVJST1I7CisJCX0KKwl9IGVsc2UgeworCQlQRVJST1IoIkludmFsaWQgY2hhbm5lbCBudW1iZXIgc3BlY2lmaWVkLlxuIik7CisJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwkJZ290byBFUlJPUjsKKwl9CisKKyAgICAgIEVSUk9SOgorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lNDYwMF9hb19pb19zaW5nbGVfcmVhZChtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICBpbnQgY2hhbm5lbCwKKwkJCQkgICAgaW50ICp2YWx1ZSwgaW50IHRpbWVfb3V0LCBpbnQgZmxhZ3MpCit7CisJbWU0NjAwX2FvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwl1bnNpZ25lZCBsb25nIHRtcDsKKwl1bnNpZ25lZCBsb25nIGNwdV9mbGFnczsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lNDYwMF9hb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlpZiAoY2hhbm5lbCAhPSAwKSB7CisJCVBFUlJPUigiSW52YWxpZCBjaGFubmVsIG51bWJlciBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwl9CisKKwlNRV9TVUJERVZJQ0VfRU5URVIKKwkgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKwl0bXAgPSBpbmwoaW5zdGFuY2UtPmN0cmxfcmVnKTsKKworCWlmICh0bXAgJiAweDMpIHsKKwkJUEVSUk9SKCJOb3QgaW4gc2luZ2xlIG1vZGUuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fUFJFVklPVVNfQ09ORklHOworCX0gZWxzZSB7CisJCSp2YWx1ZSA9IGluc3RhbmNlLT5zaW5nbGVfdmFsdWU7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lNDYwMF9hb19pb19zaW5nbGVfd3JpdGUobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgICBpbnQgY2hhbm5lbCwKKwkJCQkgICAgIGludCB2YWx1ZSwgaW50IHRpbWVfb3V0LCBpbnQgZmxhZ3MpCit7CisJbWU0NjAwX2FvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwl1bnNpZ25lZCBsb25nIG1hc2sgPSAwOworCXVuc2lnbmVkIGxvbmcgdG1wOworCXVuc2lnbmVkIGxvbmcgY3B1X2ZsYWdzOworCWludCBpOworCXdhaXRfcXVldWVfaGVhZF90IHF1ZXVlOworCXVuc2lnbmVkIGxvbmcgajsKKwl1bnNpZ25lZCBsb25nIGRlbGF5ID0gMDsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnF1ZXVlKTsKKworCWluc3RhbmNlID0gKG1lNDYwMF9hb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlpZiAoY2hhbm5lbCAhPSAwKSB7CisJCVBFUlJPUigiSW52YWxpZCBjaGFubmVsIG51bWJlciBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwl9CisKKwlpZiAodGltZV9vdXQgPCAwKSB7CisJCVBFUlJPUigiSW52YWxpZCB0aW1lb3V0IHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9USU1FT1VUOworCX0KKworCWlmICh0aW1lX291dCkgeworCQlkZWxheSA9ICh0aW1lX291dCAqIEhaKSAvIDEwMDA7CisKKwkJaWYgKGRlbGF5ID09IDApCisJCQlkZWxheSA9IDE7CisJfQorCisJTUVfU1VCREVWSUNFX0VOVEVSCisJICAgIHNwaW5fbG9ja19pcnFzYXZlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisKKwl0bXAgPSBpbmwoaW5zdGFuY2UtPmN0cmxfcmVnKTsKKworCWlmICh0bXAgJiAweDMpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCQlQRVJST1IoIk5vdCBpbiBzaW5nbGUgbW9kZS5cbiIpOworCQllcnIgPSBNRV9FUlJOT19QUkVWSU9VU19DT05GSUc7CisJCWdvdG8gRVJST1I7CisJfQorCisJaWYgKHRtcCAmIE1FNDYwMF9BT19DVFJMX0JJVF9FTkFCTEVfRVhfVFJJRykgeworCQlvdXRsKHZhbHVlLCBpbnN0YW5jZS0+c2luZ2xlX3JlZyk7CisJCWluc3RhbmNlLT5zaW5nbGVfdmFsdWUgPSB2YWx1ZTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCisJCWlmICghKGZsYWdzICYgTUVfSU9fU0lOR0xFX1RZUEVfV1JJVEVfTk9OQkxPQ0tJTkcpKSB7CisJCQlqID0gamlmZmllczsKKworCQkJd2hpbGUgKGlubChpbnN0YW5jZS0+c3RhdHVzX3JlZykgJgorCQkJICAgICAgIE1FNDYwMF9BT19TVEFUVVNfQklUX0ZTTSkgeworCQkJCWludGVycnVwdGlibGVfc2xlZXBfb25fdGltZW91dCgmcXVldWUsIDEpOworCisJCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQkJCVBFUlJPUgorCQkJCQkgICAgKCJXYWl0IG9uIGV4dGVybmFsIHRyaWdnZXIgaW50ZXJydXB0ZWQgYnkgc2lnbmFsLlxuIik7CisJCQkJCWVyciA9IE1FX0VSUk5PX1NJR05BTDsKKwkJCQkJZ290byBFUlJPUjsKKwkJCQl9CisKKwkJCQlpZiAoZGVsYXkgJiYgKChqaWZmaWVzIC0gaikgPiBkZWxheSkpIHsKKwkJCQkJUEVSUk9SKCJUaW1lb3V0IHJlYWNoZWQuXG4iKTsKKwkJCQkJZXJyID0gTUVfRVJSTk9fVElNRU9VVDsKKwkJCQkJZ290byBFUlJPUjsKKwkJCQl9CisJCQl9CisJCX0KKwl9IGVsc2UgaWYgKChpbmwoaW5zdGFuY2UtPnByZWxvYWRfcmVnKSAmICgweDEwMDAxIDw8IGluc3RhbmNlLT5hb19pZHgpKQorCQkgICA9PSAoMHgxMDAwMSA8PCBpbnN0YW5jZS0+YW9faWR4KSkgeworCQlpZiAoZmxhZ3MgJiBNRV9JT19TSU5HTEVfVFlQRV9UUklHX1NZTkNIUk9OT1VTKSB7CisJCQl0bXAgfD0gTUU0NjAwX0FPX0NUUkxfQklUX0VOQUJMRV9FWF9UUklHOworCQkJb3V0bCh0bXAsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCQlvdXRsKHZhbHVlLCBpbnN0YW5jZS0+c2luZ2xlX3JlZyk7CisJCQlpbnN0YW5jZS0+c2luZ2xlX3ZhbHVlID0gdmFsdWU7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssCisJCQkJCSAgICAgICBjcHVfZmxhZ3MpOworCisJCQlpZiAoIShmbGFncyAmIE1FX0lPX1NJTkdMRV9UWVBFX1dSSVRFX05PTkJMT0NLSU5HKSkgeworCQkJCWogPSBqaWZmaWVzOworCisJCQkJd2hpbGUgKGlubChpbnN0YW5jZS0+c3RhdHVzX3JlZykgJgorCQkJCSAgICAgICBNRTQ2MDBfQU9fU1RBVFVTX0JJVF9GU00pIHsKKwkJCQkJaW50ZXJydXB0aWJsZV9zbGVlcF9vbl90aW1lb3V0KCZxdWV1ZSwKKwkJCQkJCQkJICAgICAgIDEpOworCisJCQkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJCQkJUEVSUk9SCisJCQkJCQkgICAgKCJXYWl0IG9uIGV4dGVybmFsIHRyaWdnZXIgaW50ZXJydXB0ZWQgYnkgc2lnbmFsLlxuIik7CisJCQkJCQllcnIgPSBNRV9FUlJOT19TSUdOQUw7CisJCQkJCQlnb3RvIEVSUk9SOworCQkJCQl9CisKKwkJCQkJaWYgKGRlbGF5ICYmICgoamlmZmllcyAtIGopID4gZGVsYXkpKSB7CisJCQkJCQlQRVJST1IoIlRpbWVvdXQgcmVhY2hlZC5cbiIpOworCQkJCQkJZXJyID0gTUVfRVJSTk9fVElNRU9VVDsKKwkJCQkJCWdvdG8gRVJST1I7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0gZWxzZSB7CisJCQlvdXRsKHZhbHVlLCBpbnN0YW5jZS0+c2luZ2xlX3JlZyk7CisJCQlpbnN0YW5jZS0+c2luZ2xlX3ZhbHVlID0gdmFsdWU7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssCisJCQkJCSAgICAgICBjcHVfZmxhZ3MpOworCQl9CisJfSBlbHNlIGlmICgoaW5sKGluc3RhbmNlLT5wcmVsb2FkX3JlZykgJiAoMHgxMDAwMSA8PCBpbnN0YW5jZS0+YW9faWR4KSkKKwkJICAgPT0gKDB4MSA8PCBpbnN0YW5jZS0+YW9faWR4KSkgeworCQlvdXRsKHZhbHVlLCBpbnN0YW5jZS0+c2luZ2xlX3JlZyk7CisJCWluc3RhbmNlLT5zaW5nbGVfdmFsdWUgPSB2YWx1ZTsKKworCQlQREVCVUcoIlN5bmNocm9ub3VzIFNXLCBmbGFncyA9IDB4JVguXG4iLCBmbGFncyk7CisKKwkJaWYgKGZsYWdzICYgTUVfSU9fU0lOR0xFX1RZUEVfVFJJR19TWU5DSFJPTk9VUykgeworCQkJUERFQlVHKCJUcmlnZ2VyIHN5bmNocm9ub3VzIFNXLlxuIik7CisJCQlzcGluX2xvY2soaW5zdGFuY2UtPnByZWxvYWRfcmVnX2xvY2spOworCQkJdG1wID0gaW5sKGluc3RhbmNlLT5wcmVsb2FkX3JlZyk7CisKKwkJCWZvciAoaSA9IDA7IGkgPCBNRTQ2MDBfQU9fTUFYX1NVQkRFVklDRVM7IGkrKykgeworCQkJCWlmICgoKmluc3RhbmNlLT5wcmVsb2FkX2ZsYWdzICYgKDB4MSA8PCBpKSkpIHsKKwkJCQkJaWYgKCh0bXAgJiAoMHgxMDAwMSA8PCBpKSkgPT0KKwkJCQkJICAgICgweDEgPDwgaSkpIHsKKwkJCQkJCW1hc2sgfD0gMHgxIDw8IGk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisKKwkJCXRtcCAmPSB+KG1hc2spOworCisJCQlvdXRsKHRtcCwgaW5zdGFuY2UtPnByZWxvYWRfcmVnKTsKKwkJCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5wcmVsb2FkX3JlZ19sb2NrKTsKKwkJfQorCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKwl9IGVsc2UgeworCQlvdXRsKHZhbHVlLCBpbnN0YW5jZS0+c2luZ2xlX3JlZyk7CisJCWluc3RhbmNlLT5zaW5nbGVfdmFsdWUgPSB2YWx1ZTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCX0KKworICAgICAgRVJST1I6CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWU0NjAwX2FvX2lvX3N0cmVhbV9jb25maWcobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICAgIG1lSU9TdHJlYW1Db25maWdfdCAqIGNvbmZpZ19saXN0LAorCQkJCSAgICAgIGludCBjb3VudCwKKwkJCQkgICAgICBtZUlPU3RyZWFtVHJpZ2dlcl90ICogdHJpZ2dlciwKKwkJCQkgICAgICBpbnQgZmlmb19pcnFfdGhyZXNob2xkLCBpbnQgZmxhZ3MpCit7CisJbWU0NjAwX2FvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwl1bnNpZ25lZCBsb25nIGN0cmw7CisJdW5zaWduZWQgbG9uZyB0bXA7CisJdW5zaWduZWQgbG9uZyBjcHVfZmxhZ3M7CisJdWludDY0X3QgY29udl90aWNrczsKKwl1bnNpZ25lZCBpbnQgY29udl9zdGFydF90aWNrc19sb3cgPSB0cmlnZ2VyLT5pQ29udlN0YXJ0VGlja3NMb3c7CisJdW5zaWduZWQgaW50IGNvbnZfc3RhcnRfdGlja3NfaGlnaCA9IHRyaWdnZXItPmlDb252U3RhcnRUaWNrc0hpZ2g7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbnN0YW5jZSA9IChtZTQ2MDBfYW9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJY29udl90aWNrcyA9CisJICAgICh1aW50NjRfdCkgY29udl9zdGFydF90aWNrc19sb3cgKworCSAgICAoKHVpbnQ2NF90KSBjb252X3N0YXJ0X3RpY2tzX2hpZ2ggPDwgMzIpOworCisJaWYgKCFpbnN0YW5jZS0+ZmlmbykgeworCQlQRVJST1IoIk5vdCBhIHN0cmVhbWluZyBhby5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fTk9UX1NVUFBPUlRFRDsKKwl9CisKKwlNRV9TVUJERVZJQ0VfRU5URVIKKwkgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKworCWlmICgoaW5sKGluc3RhbmNlLT5zdGF0dXNfcmVnKSkgJiBNRTQ2MDBfQU9fU1RBVFVTX0JJVF9GU00pIHsKKwkJUEVSUk9SKCJTdWJkZXZpY2UgaXMgYnVzeS5cbiIpOworCQllcnIgPSBNRV9FUlJOT19TVUJERVZJQ0VfQlVTWTsKKwkJZ290byBFUlJPUjsKKwl9CisKKwljdHJsID0gaW5sKGluc3RhbmNlLT5jdHJsX3JlZyk7CisJY3RybCB8PSBNRTQ2MDBfQU9fQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1A7CisJb3V0bChjdHJsLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCWN0cmwgPSBNRTQ2MDBfQU9fQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1A7CisJb3V0bChjdHJsLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCisJaWYgKGNvdW50ICE9IDEpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIHN0cmVhbSBjb25maWd1cmF0aW9uIGxpc3QgY291bnQgc3BlY2lmaWVkLlxuIik7CisJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQ09ORklHX0xJU1RfQ09VTlQ7CisJCWdvdG8gRVJST1I7CisJfQorCisJaWYgKGNvbmZpZ19saXN0WzBdLmlDaGFubmVsICE9IDApIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGNoYW5uZWwgbnVtYmVyIHNwZWNpZmllZC5cbiIpOworCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJCWdvdG8gRVJST1I7CisJfQorCisJaWYgKGNvbmZpZ19saXN0WzBdLmlTdHJlYW1Db25maWcgIT0gMCkgeworCQlQRVJST1IoIkludmFsaWQgc3RyZWFtIGNvbmZpZyBzcGVjaWZpZWQuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9TVFJFQU1fQ09ORklHOworCQlnb3RvIEVSUk9SOworCX0KKworCWlmIChjb25maWdfbGlzdFswXS5pUmVmICE9IE1FX1JFRl9BT19HUk9VTkQpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGFuYWxvZyByZWZlcmVuY2UuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9SRUY7CisJCWdvdG8gRVJST1I7CisJfQorCisJaWYgKCh0cmlnZ2VyLT5pQWNxU3RhcnRUaWNrc0xvdyAhPSAwKQorCSAgICB8fCAodHJpZ2dlci0+aUFjcVN0YXJ0VGlja3NIaWdoICE9IDApKSB7CisJCVBFUlJPUgorCQkgICAgKCJJbnZhbGlkIGFjcXVpc2l0aW9uIHN0YXJ0IHRyaWdnZXIgYXJndW1lbnQgc3BlY2lmaWVkLlxuIik7CisJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQUNRX1NUQVJUX0FSRzsKKwkJZ290byBFUlJPUjsKKwl9CisKKwlzd2l0Y2ggKHRyaWdnZXItPmlBY3FTdGFydFRyaWdUeXBlKSB7CisKKwljYXNlIE1FX1RSSUdfVFlQRV9TVzoKKwkJYnJlYWs7CisKKwljYXNlIE1FX1RSSUdfVFlQRV9FWFRfRElHSVRBTDoKKwkJY3RybCB8PSBNRTQ2MDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0VYX1RSSUc7CisKKwkJc3dpdGNoICh0cmlnZ2VyLT5pQWNxU3RhcnRUcmlnRWRnZSkgeworCisJCWNhc2UgTUVfVFJJR19FREdFX1JJU0lORzoKKwkJCWJyZWFrOworCisJCWNhc2UgTUVfVFJJR19FREdFX0ZBTExJTkc6CisJCQljdHJsIHw9IE1FNDYwMF9BT19DVFJMX0JJVF9FWF9UUklHX0VER0U7CisKKwkJCWJyZWFrOworCisJCWNhc2UgTUVfVFJJR19FREdFX0FOWToKKwkJCWN0cmwgfD0KKwkJCSAgICBNRTQ2MDBfQU9fQ1RSTF9CSVRfRVhfVFJJR19FREdFIHwKKwkJCSAgICBNRTQ2MDBfQU9fQ1RSTF9CSVRfRVhfVFJJR19FREdFX0JPVEg7CisKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlQRVJST1IKKwkJCSAgICAoIkludmFsaWQgYWNxdWlzaXRpb24gc3RhcnQgdHJpZ2dlciBlZGdlIHNwZWNpZmllZC5cbiIpOworCisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0FDUV9TVEFSVF9UUklHX0VER0U7CisKKwkJCWdvdG8gRVJST1I7CisKKwkJCWJyZWFrOworCQl9CisKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlQRVJST1IoIkludmFsaWQgYWNxdWlzaXRpb24gc3RhcnQgdHJpZ2dlciB0eXBlIHNwZWNpZmllZC5cbiIpOworCisJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQUNRX1NUQVJUX1RSSUdfVFlQRTsKKworCQlnb3RvIEVSUk9SOworCisJCWJyZWFrOworCX0KKworCXN3aXRjaCAodHJpZ2dlci0+aVNjYW5TdGFydFRyaWdUeXBlKSB7CisKKwljYXNlIE1FX1RSSUdfVFlQRV9GT0xMT1c6CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJUEVSUk9SKCJJbnZhbGlkIHNjYW4gc3RhcnQgdHJpZ2dlciB0eXBlIHNwZWNpZmllZC5cbiIpOworCisJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfU0NBTl9TVEFSVF9UUklHX1RZUEU7CisKKwkJZ290byBFUlJPUjsKKworCQlicmVhazsKKwl9CisKKwlzd2l0Y2ggKHRyaWdnZXItPmlDb252U3RhcnRUcmlnVHlwZSkgeworCisJY2FzZSBNRV9UUklHX1RZUEVfVElNRVI6CisJCWlmICgoY29udl90aWNrcyA8IE1FNDYwMF9BT19NSU5fQ0hBTl9USUNLUykKKwkJICAgIHx8IChjb252X3RpY2tzID4gTUU0NjAwX0FPX01BWF9DSEFOX1RJQ0tTKSkgeworCQkJUEVSUk9SCisJCQkgICAgKCJJbnZhbGlkIGNvbnYgc3RhcnQgdHJpZ2dlciBhcmd1bWVudCBzcGVjaWZpZWQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQ09OVl9TVEFSVF9BUkc7CisJCQlnb3RvIEVSUk9SOworCQl9CisKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlQRVJST1IoIkludmFsaWQgY29udiBzdGFydCB0cmlnZ2VyIHR5cGUgc3BlY2lmaWVkLlxuIik7CisKKwkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DT05WX1NUQVJUX1RSSUdfVFlQRTsKKworCQlnb3RvIEVSUk9SOworCisJCWJyZWFrOworCX0KKworCS8qIFByZXNldCB0byBoYXJkd2FyZSB3cmFwYXJvdW5kIG1vZGUgKi8KKwlpbnN0YW5jZS0+ZmxhZ3MgJj0gfihNRTQ2MDBfQU9fRkxBR1NfU1dfV1JBUF9NT0RFX01BU0spOworCisJc3dpdGNoICh0cmlnZ2VyLT5pU2NhblN0b3BUcmlnVHlwZSkgeworCisJY2FzZSBNRV9UUklHX1RZUEVfTk9ORToKKwkJaWYgKGZsYWdzICYgTUVfSU9fU1RSRUFNX0NPTkZJR19XUkFQQVJPVU5EKSB7CisJCQkvKiBTZXQgZmxhZ3MgdG8gaW5kaWNhdGUgdXNhZ2Ugb2Ygc29mdHdhcmUgbW9kZS4gKi8KKwkJCWluc3RhbmNlLT5mbGFncyB8PSBNRTQ2MDBfQU9fRkxBR1NfU1dfV1JBUF9NT0RFX0lORjsKKwkJCWluc3RhbmNlLT53cmFwX2NvdW50ID0gMDsKKwkJCWluc3RhbmNlLT53cmFwX3JlbWFpbmluZyA9IDA7CisJCX0KKworCQlicmVhazsKKworCWNhc2UgTUVfVFJJR19UWVBFX0NPVU5UOgorCQlpZiAoZmxhZ3MgJiBNRV9JT19TVFJFQU1fQ09ORklHX1dSQVBBUk9VTkQpIHsKKwkJCWlmICh0cmlnZ2VyLT5pU2NhblN0b3BDb3VudCA8PSAwKSB7CisJCQkJUEVSUk9SKCJJbnZhbGlkIHNjYW4gc3RvcCBjb3VudCBzcGVjaWZpZWQuXG4iKTsKKwkJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX1NDQU5fU1RPUF9BUkc7CisJCQkJZ290byBFUlJPUjsKKwkJCX0KKworCQkJLyogU2V0IGZsYWdzIHRvIGluZGljYXRlIHVzYWdlIG9mIHNvZnR3YXJlIG1vZGUuICovCisJCQlpbnN0YW5jZS0+ZmxhZ3MgfD0gTUU0NjAwX0FPX0ZMQUdTX1NXX1dSQVBfTU9ERV9GSU47CisJCQlpbnN0YW5jZS0+d3JhcF9jb3VudCA9IHRyaWdnZXItPmlTY2FuU3RvcENvdW50OworCQkJaW5zdGFuY2UtPndyYXBfcmVtYWluaW5nID0gdHJpZ2dlci0+aVNjYW5TdG9wQ291bnQ7CisJCX0gZWxzZSB7CisJCQlQRVJST1IoIkludmFsaWQgc2NhbiBzdG9wIHRyaWdnZXIgdHlwZSBzcGVjaWZpZWQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQUNRX1NUT1BfVFJJR19UWVBFOworCQkJZ290byBFUlJPUjsKKwkJfQorCisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJUEVSUk9SKCJJbnZhbGlkIHNjYW4gc3RvcCB0cmlnZ2VyIHR5cGUgc3BlY2lmaWVkLlxuIik7CisKKwkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9TQ0FOX1NUT1BfVFJJR19UWVBFOworCisJCWdvdG8gRVJST1I7CisKKwkJYnJlYWs7CisJfQorCisJc3dpdGNoICh0cmlnZ2VyLT5pQWNxU3RvcFRyaWdUeXBlKSB7CisKKwljYXNlIE1FX1RSSUdfVFlQRV9OT05FOgorCQlicmVhazsKKworCWNhc2UgTUVfVFJJR19UWVBFX0NPVU5UOgorCQlpZiAodHJpZ2dlci0+aVNjYW5TdG9wVHJpZ1R5cGUgIT0gTUVfVFJJR19UWVBFX05PTkUpIHsKKwkJCVBFUlJPUigiSW52YWxpZCBhY3Egc3RvcCB0cmlnZ2VyIHR5cGUgc3BlY2lmaWVkLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0FDUV9TVE9QX1RSSUdfVFlQRTsKKwkJCWdvdG8gRVJST1I7CisJCX0KKworCQlpZiAoZmxhZ3MgJiBNRV9JT19TVFJFQU1fQ09ORklHX1dSQVBBUk9VTkQpIHsKKwkJCWlmICh0cmlnZ2VyLT5pQWNxU3RvcENvdW50IDw9IDApIHsKKwkJCQlQRVJST1IoIkludmFsaWQgYWNxIHN0b3AgY291bnQgc3BlY2lmaWVkLlxuIik7CisJCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9BQ1FfU1RPUF9BUkc7CisJCQkJZ290byBFUlJPUjsKKwkJCX0KKworCQkJLyogU2V0IGZsYWdzIHRvIGluZGljYXRlIHVzYWdlIG9mIHNvZnR3YXJlIG1vZGUuICovCisJCQlpbnN0YW5jZS0+ZmxhZ3MgfD0gTUU0NjAwX0FPX0ZMQUdTX1NXX1dSQVBfTU9ERV9GSU47CisJCQlpbnN0YW5jZS0+d3JhcF9jb3VudCA9IHRyaWdnZXItPmlBY3FTdG9wQ291bnQ7CisJCQlpbnN0YW5jZS0+d3JhcF9yZW1haW5pbmcgPSB0cmlnZ2VyLT5pQWNxU3RvcENvdW50OworCQl9IGVsc2UgeworCQkJUEVSUk9SKCJJbnZhbGlkIGFjcCBzdG9wIHRyaWdnZXIgdHlwZSBzcGVjaWZpZWQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQUNRX1NUT1BfVFJJR19UWVBFOworCQkJZ290byBFUlJPUjsKKwkJfQorCisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJUEVSUk9SKCJJbnZhbGlkIGFjcSBzdG9wIHRyaWdnZXIgdHlwZSBzcGVjaWZpZWQuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9BQ1FfU1RPUF9UUklHX1RZUEU7CisJCWdvdG8gRVJST1I7CisJCWJyZWFrOworCX0KKworCXN3aXRjaCAodHJpZ2dlci0+aUFjcVN0YXJ0VHJpZ0NoYW4pIHsKKworCWNhc2UgTUVfVFJJR19DSEFOX0RFRkFVTFQ6CisJCXNwaW5fbG9jayhpbnN0YW5jZS0+cHJlbG9hZF9yZWdfbG9jayk7CisJCXRtcCA9IGlubChpbnN0YW5jZS0+cHJlbG9hZF9yZWcpOworCQl0bXAgJj0gfigweDEwMDAxIDw8IGluc3RhbmNlLT5hb19pZHgpOworCQlvdXRsKHRtcCwgaW5zdGFuY2UtPnByZWxvYWRfcmVnKTsKKwkJc3Bpbl91bmxvY2soaW5zdGFuY2UtPnByZWxvYWRfcmVnX2xvY2spOworCisJCWJyZWFrOworCisJY2FzZSBNRV9UUklHX0NIQU5fU1lOQ0hST05PVVM6CisJCWlmICh0cmlnZ2VyLT5pQWNxU3RhcnRUcmlnVHlwZSA9PSBNRV9UUklHX1RZUEVfU1cpIHsKKwkJCXNwaW5fbG9jayhpbnN0YW5jZS0+cHJlbG9hZF9yZWdfbG9jayk7CisJCQl0bXAgPSBpbmwoaW5zdGFuY2UtPnByZWxvYWRfcmVnKTsKKwkJCXRtcCAmPSB+KDB4MTAwMDEgPDwgaW5zdGFuY2UtPmFvX2lkeCk7CisJCQlvdXRsKHRtcCwgaW5zdGFuY2UtPnByZWxvYWRfcmVnKTsKKwkJCXRtcCB8PSAweDEgPDwgaW5zdGFuY2UtPmFvX2lkeDsKKwkJCW91dGwodG1wLCBpbnN0YW5jZS0+cHJlbG9hZF9yZWcpOworCQkJc3Bpbl91bmxvY2soaW5zdGFuY2UtPnByZWxvYWRfcmVnX2xvY2spOworCQl9IGVsc2UgeworCQkJY3RybCAmPSB+KE1FNDYwMF9BT19DVFJMX0JJVF9FTkFCTEVfRVhfVFJJRyk7CisJCQlzcGluX2xvY2soaW5zdGFuY2UtPnByZWxvYWRfcmVnX2xvY2spOworCQkJdG1wID0gaW5sKGluc3RhbmNlLT5wcmVsb2FkX3JlZyk7CisJCQl0bXAgJj0gfigweDEwMDAxIDw8IGluc3RhbmNlLT5hb19pZHgpOworCQkJb3V0bCh0bXAsIGluc3RhbmNlLT5wcmVsb2FkX3JlZyk7CisJCQl0bXAgfD0gMHgxMDAwMCA8PCBpbnN0YW5jZS0+YW9faWR4OworCQkJb3V0bCh0bXAsIGluc3RhbmNlLT5wcmVsb2FkX3JlZyk7CisJCQlzcGluX3VubG9jayhpbnN0YW5jZS0+cHJlbG9hZF9yZWdfbG9jayk7CisJCX0KKworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCVBFUlJPUigiSW52YWxpZCBhY3Egc3RhcnQgdHJpZ2dlciBjaGFubmVsIHNwZWNpZmllZC5cbiIpOworCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0FDUV9TVEFSVF9UUklHX0NIQU47CisJCWdvdG8gRVJST1I7CisKKwkJYnJlYWs7CisJfQorCisJb3V0bChjb252X3RpY2tzIC0gMiwgaW5zdGFuY2UtPnRpbWVyX3JlZyk7CisKKwlpZiAoZmxhZ3MgJiBNRV9JT19TVFJFQU1fQ09ORklHX0JJVF9QQVRURVJOKSB7CisJCWlmIChpbnN0YW5jZS0+YW9faWR4ID09IDMpIHsKKwkJCWN0cmwgfD0gTUU0NjAwX0FPX0NUUkxfQklUX0VOQUJMRV9ETzsKKwkJfSBlbHNlIHsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJCQlnb3RvIEVSUk9SOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKGluc3RhbmNlLT5hb19pZHggPT0gMykgeworCQkJY3RybCAmPSB+TUU0NjAwX0FPX0NUUkxfQklUX0VOQUJMRV9ETzsKKwkJfQorCX0KKworCS8qIFNldCBoYXJkd2FyZSBtb2RlLiAqLworCWlmIChmbGFncyAmIE1FX0lPX1NUUkVBTV9DT05GSUdfV1JBUEFST1VORCkgeworCQljdHJsIHw9IE1FNDYwMF9BT19DVFJMX0JJVF9NT0RFXzA7CisJfSBlbHNlIHsKKwkJY3RybCB8PSBNRTQ2MDBfQU9fQ1RSTF9CSVRfTU9ERV8xOworCX0KKworCVBERUJVRygiUHJlbG9hZCB3b3JkID0gMHglWC5cbiIsIGlubChpbnN0YW5jZS0+cHJlbG9hZF9yZWcpKTsKKworCVBERUJVRygiQ3RybCB3b3JkID0gMHglbFguXG4iLCBjdHJsKTsKKwlvdXRsKGN0cmwsIGluc3RhbmNlLT5jdHJsX3JlZyk7CS8vIFdyaXRlIHRoZSBjb250cm9sIHdvcmQKKworICAgICAgRVJST1I6CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWU0NjAwX2FvX2lvX3N0cmVhbV9uZXdfdmFsdWVzKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQkgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkJICBpbnQgdGltZV9vdXQsIGludCAqY291bnQsIGludCBmbGFncykKK3sKKwltZTQ2MDBfYW9fc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCWxvbmcgdCA9IDA7CisJbG9uZyBqOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJaW5zdGFuY2UgPSAobWU0NjAwX2FvX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCWlmICghaW5zdGFuY2UtPmZpZm8pIHsKKwkJUEVSUk9SKCJOb3QgYSBzdHJlYW1pbmcgYW8uXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX05PVF9TVVBQT1JURUQ7CisJfQorCisJaWYgKHRpbWVfb3V0IDwgMCkgeworCQlQRVJST1IoIkludmFsaWQgdGltZV9vdXQgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1RJTUVPVVQ7CisJfQorCisJaWYgKHRpbWVfb3V0KSB7CisJCXQgPSAodGltZV9vdXQgKiBIWikgLyAxMDAwOworCisJCWlmICh0ID09IDApCisJCQl0ID0gMTsKKwl9CisKKwkqY291bnQgPSAwOworCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJaWYgKHQpIHsKKwkJaiA9IGppZmZpZXM7CisJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KGluc3RhbmNlLT53YWl0X3F1ZXVlLAorCQkJCQkJICgobWVfY2lyY19idWZfc3BhY2UKKwkJCQkJCSAgICgmaW5zdGFuY2UtPmNpcmNfYnVmKSkKKwkJCQkJCSAgfHwgIShpbmwoaW5zdGFuY2UtPnN0YXR1c19yZWcpCisJCQkJCQkgICAgICAgJgorCQkJCQkJICAgICAgIE1FNDYwMF9BT19TVEFUVVNfQklUX0ZTTSkpLAorCQkJCQkJIHQpOworCisJCWlmICghKGlubChpbnN0YW5jZS0+c3RhdHVzX3JlZykgJiBNRTQ2MDBfQU9fU1RBVFVTX0JJVF9GU00pKSB7CisJCQlQRVJST1IoIkFPIHN1YmRldmljZSBpcyBub3QgcnVubmluZy5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fU1VCREVWSUNFX05PVF9SVU5OSU5HOworCQl9IGVsc2UgaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQlQRVJST1IoIldhaXQgb24gdmFsdWVzIGludGVycnVwdGVkIGZyb20gc2lnbmFsLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19TSUdOQUw7CisJCX0gZWxzZSBpZiAoKGppZmZpZXMgLSBqKSA+PSB0KSB7CisJCQlQRVJST1IoIldhaXQgb24gdmFsdWVzIHRpbWVkIG91dC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fVElNRU9VVDsKKwkJfSBlbHNlIHsKKwkJCSpjb3VudCA9IG1lX2NpcmNfYnVmX3NwYWNlKCZpbnN0YW5jZS0+Y2lyY19idWYpOworCQl9CisJfSBlbHNlIHsKKwkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGluc3RhbmNlLT53YWl0X3F1ZXVlLAorCQkJCQkgKChtZV9jaXJjX2J1Zl9zcGFjZQorCQkJCQkgICAoJmluc3RhbmNlLT5jaXJjX2J1ZikpCisJCQkJCSAgfHwgIShpbmwoaW5zdGFuY2UtPnN0YXR1c19yZWcpICYKKwkJCQkJICAgICAgIE1FNDYwMF9BT19TVEFUVVNfQklUX0ZTTSkpKTsKKworCQlpZiAoIShpbmwoaW5zdGFuY2UtPnN0YXR1c19yZWcpICYgTUU0NjAwX0FPX1NUQVRVU19CSVRfRlNNKSkgeworCQkJUEVSUk9SKCJBTyBzdWJkZXZpY2UgaXMgbm90IHJ1bm5pbmcuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX1NVQkRFVklDRV9OT1RfUlVOTklORzsKKwkJfSBlbHNlIGlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJUEVSUk9SKCJXYWl0IG9uIHZhbHVlcyBpbnRlcnJ1cHRlZCBmcm9tIHNpZ25hbC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fU0lHTkFMOworCQl9IGVsc2UgeworCQkJKmNvdW50ID0gbWVfY2lyY19idWZfc3BhY2UoJmluc3RhbmNlLT5jaXJjX2J1Zik7CisJCX0KKwl9CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIHN0b3BfaW1tZWRpYXRlbHkobWU0NjAwX2FvX3N1YmRldmljZV90ICogaW5zdGFuY2UpCit7CisJdW5zaWduZWQgbG9uZyBjcHVfZmxhZ3M7CisJdWludDMyX3QgdG1wOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKwl0bXAgPSBpbmwoaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwl0bXAgfD0gTUU0NjAwX0FPX0NUUkxfQklUX1NUT1AgfCBNRTQ2MDBfQU9fQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1A7CisJb3V0bCh0bXAsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisKKwl3aGlsZSAoaW5sKGluc3RhbmNlLT5zdGF0dXNfcmVnKSAmIE1FNDYwMF9BT19TVEFUVVNfQklUX0ZTTSkgOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworfQorCitzdGF0aWMgaW50IG1lNDYwMF9hb19pb19zdHJlYW1fc3RhcnQobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgICBpbnQgc3RhcnRfbW9kZSwgaW50IHRpbWVfb3V0LCBpbnQgZmxhZ3MpCit7CisJbWU0NjAwX2FvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwl1bnNpZ25lZCBsb25nIGNwdV9mbGFncyA9IDA7CisJdW5zaWduZWQgbG9uZyByZWY7CisJdW5zaWduZWQgbG9uZyB0bXA7CisJdW5zaWduZWQgbG9uZyBkZWxheSA9IDA7CisJd2FpdF9xdWV1ZV9oZWFkX3QgcXVldWU7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbnN0YW5jZSA9IChtZTQ2MDBfYW9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJaW5pdF93YWl0cXVldWVfaGVhZCgmcXVldWUpOworCisJaWYgKHRpbWVfb3V0IDwgMCkgeworCQlQRVJST1IoIkludmFsaWQgdGltZW91dCBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfVElNRU9VVDsKKwl9CisKKwlpZiAodGltZV9vdXQpIHsKKwkJZGVsYXkgPSAodGltZV9vdXQgKiBIWikgLyAxMDAwOworCisJCWlmIChkZWxheSA9PSAwKQorCQkJZGVsYXkgPSAxOworCX0KKworCWlmICghaW5zdGFuY2UtPmZpZm8pIHsKKwkJUEVSUk9SKCJOb3QgYSBzdHJlYW1pbmcgYW8uXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX05PVF9TVVBQT1JURUQ7CisJfQorCisJTUVfU1VCREVWSUNFX0VOVEVSCisJICAgIHNwaW5fbG9ja19pcnFzYXZlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisKKwl0bXAgPSBpbmwoaW5zdGFuY2UtPmN0cmxfcmVnKTsKKworCXN3aXRjaCAodG1wICYgKE1FNDYwMF9BT19DVFJMX01BU0tfTU9ERSkpIHsKKworCWNhc2UgMDoJCS8vIFNpbmdsZSBtb2RlCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKwkJUEVSUk9SKCJTdWJkZXZpY2UgaXMgY29uZmlndXJlZCBpbiBzaW5nbGUgbW9kZS5cbiIpOworCQllcnIgPSBNRV9FUlJOT19QUkVWSU9VU19DT05GSUc7CisJCWdvdG8gRVJST1I7CisKKwljYXNlIDE6CQkvLyBXcmFwYXJvdW5kIG1vZGUKKwkJaWYgKHRtcCAmIE1FNDYwMF9BT19DVFJMX0JJVF9FTkFCTEVfRVhfVFJJRykgewkvLyBOb3JtYWwgd3JhcGFyb3VuZCB3aXRoIGV4dGVybmFsIHRyaWdnZXIKKworCQkJaWYgKChpbmwoaW5zdGFuY2UtPnN0YXR1c19yZWcpICYKKwkJCSAgICAgTUU0NjAwX0FPX1NUQVRVU19CSVRfRlNNKSkgeworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT4KKwkJCQkJCSAgICAgICBzdWJkZXZpY2VfbG9jaywKKwkJCQkJCSAgICAgICBjcHVfZmxhZ3MpOworCQkJCVBFUlJPUigiQ29udmVyc2lvbiBpcyBhbHJlYWR5IHJ1bm5pbmcuXG4iKTsKKwkJCQllcnIgPSBNRV9FUlJOT19TVUJERVZJQ0VfQlVTWTsKKwkJCQlnb3RvIEVSUk9SOworCQkJfQorCisJCQl0bXAgJj0KKwkJCSAgICB+KE1FNDYwMF9BT19DVFJMX0JJVF9FTkFCTEVfSVJRIHwKKwkJCSAgICAgIE1FNDYwMF9BT19DVFJMX0JJVF9TVE9QIHwKKwkJCSAgICAgIE1FNDYwMF9BT19DVFJMX0JJVF9JTU1FRElBVEVfU1RPUCk7CisKKwkJCW91dGwodG1wLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLAorCQkJCQkgICAgICAgY3B1X2ZsYWdzKTsKKworCQkJaWYgKHN0YXJ0X21vZGUgPT0gTUVfU1RBUlRfTU9ERV9CTE9DS0lORykgeworCQkJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnF1ZXVlKTsKKworCQkJCWlmIChkZWxheSkgeworCQkJCQlyZWYgPSBqaWZmaWVzOworCisJCQkJCXdoaWxlICghCisJCQkJCSAgICAgICAoaW5sKGluc3RhbmNlLT5zdGF0dXNfcmVnKSAmCisJCQkJCQlNRTQ2MDBfQU9fU1RBVFVTX0JJVF9GU00pKSB7CisJCQkJCQlpbnRlcnJ1cHRpYmxlX3NsZWVwX29uX3RpbWVvdXQKKwkJCQkJCSAgICAoJnF1ZXVlLCAxKTsKKworCQkJCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQkJCQkJUEVSUk9SCisJCQkJCQkJICAgICgiV2FpdCBvbiBzdGFydCBvZiBzdGF0ZSBtYWNoaW5lIGludGVycnVwdGVkLlxuIik7CisJCQkJCQkJc3RvcF9pbW1lZGlhdGVseQorCQkJCQkJCSAgICAoaW5zdGFuY2UpOworCQkJCQkJCWVyciA9IE1FX0VSUk5PX1NJR05BTDsKKwkJCQkJCQlnb3RvIEVSUk9SOworCQkJCQkJfQorCisJCQkJCQlpZiAoKChqaWZmaWVzIC0gcmVmKSA+PSBkZWxheSkpIHsKKwkJCQkJCQlQRVJST1IKKwkJCQkJCQkgICAgKCJUaW1lb3V0IHJlYWNoZWQuXG4iKTsKKwkJCQkJCQlzdG9wX2ltbWVkaWF0ZWx5CisJCQkJCQkJICAgIChpbnN0YW5jZSk7CisJCQkJCQkJZXJyID0gTUVfRVJSTk9fVElNRU9VVDsKKwkJCQkJCQlnb3RvIEVSUk9SOworCQkJCQkJfQorCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJd2hpbGUgKCEKKwkJCQkJICAgICAgIChpbmwoaW5zdGFuY2UtPnN0YXR1c19yZWcpICYKKwkJCQkJCU1FNDYwMF9BT19TVEFUVVNfQklUX0ZTTSkpIHsKKwkJCQkJCWludGVycnVwdGlibGVfc2xlZXBfb25fdGltZW91dAorCQkJCQkJICAgICgmcXVldWUsIDEpOworCisJCQkJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCQkJCQlQRVJST1IKKwkJCQkJCQkgICAgKCJXYWl0IG9uIHN0YXJ0IG9mIHN0YXRlIG1hY2hpbmUgaW50ZXJydXB0ZWQuXG4iKTsKKwkJCQkJCQlzdG9wX2ltbWVkaWF0ZWx5CisJCQkJCQkJICAgIChpbnN0YW5jZSk7CisJCQkJCQkJZXJyID0gTUVfRVJSTk9fU0lHTkFMOworCQkJCQkJCWdvdG8gRVJST1I7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9IGVsc2UgaWYgKHN0YXJ0X21vZGUgPT0gTUVfU1RBUlRfTU9ERV9OT05CTE9DS0lORykgeworCQkJfSBlbHNlIHsKKwkJCQlQRVJST1IoIkludmFsaWQgc3RhcnQgbW9kZSBzcGVjaWZpZWQuXG4iKTsKKwkJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX1NUQVJUX01PREU7CisJCQkJZ290byBFUlJPUjsKKwkJCX0KKwkJfSBlbHNlIGlmICgoaW5sKGluc3RhbmNlLT5wcmVsb2FkX3JlZykgJiAoMHgxMDAwMSA8PCBpbnN0YW5jZS0+YW9faWR4KSkgPT0gKDB4MTAwMDAgPDwgaW5zdGFuY2UtPmFvX2lkeCkpIHsJLy8gU3luY2hyb25vdXMgd2l0aCBleHRlcm5hbCB0cmlnZ2VyCisKKwkJCWlmICgoaW5sKGluc3RhbmNlLT5zdGF0dXNfcmVnKSAmCisJCQkgICAgIE1FNDYwMF9BT19TVEFUVVNfQklUX0ZTTSkpIHsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+CisJCQkJCQkgICAgICAgc3ViZGV2aWNlX2xvY2ssCisJCQkJCQkgICAgICAgY3B1X2ZsYWdzKTsKKwkJCQlQRVJST1IoIkNvbnZlcnNpb24gaXMgYWxyZWFkeSBydW5uaW5nLlxuIik7CisJCQkJZXJyID0gTUVfRVJSTk9fU1VCREVWSUNFX0JVU1k7CisJCQkJZ290byBFUlJPUjsKKwkJCX0KKworCQkJaWYgKGZsYWdzICYgTUVfSU9fU1RSRUFNX1NUQVJUX1RZUEVfVFJJR19TWU5DSFJPTk9VUykgeworCQkJCXRtcCB8PSBNRTQ2MDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0VYX1RSSUc7CisJCQkJdG1wICY9CisJCQkJICAgIH4oTUU0NjAwX0FPX0NUUkxfQklUX0VOQUJMRV9JUlEgfAorCQkJCSAgICAgIE1FNDYwMF9BT19DVFJMX0JJVF9TVE9QIHwKKwkJCQkgICAgICBNRTQ2MDBfQU9fQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1ApOworCQkJCW91dGwodG1wLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT4KKwkJCQkJCSAgICAgICBzdWJkZXZpY2VfbG9jaywKKwkJCQkJCSAgICAgICBjcHVfZmxhZ3MpOworCisJCQkJaWYgKHN0YXJ0X21vZGUgPT0gTUVfU1RBUlRfTU9ERV9CTE9DS0lORykgeworCQkJCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZxdWV1ZSk7CisKKwkJCQkJaWYgKGRlbGF5KSB7CisJCQkJCQlyZWYgPSBqaWZmaWVzOworCisJCQkJCQl3aGlsZSAoIQorCQkJCQkJICAgICAgIChpbmwKKwkJCQkJCQkoaW5zdGFuY2UtPgorCQkJCQkJCSBzdGF0dXNfcmVnKSAmCisJCQkJCQkJTUU0NjAwX0FPX1NUQVRVU19CSVRfRlNNKSkKKwkJCQkJCXsKKwkJCQkJCQlpbnRlcnJ1cHRpYmxlX3NsZWVwX29uX3RpbWVvdXQKKwkJCQkJCQkgICAgKCZxdWV1ZSwgMSk7CisKKwkJCQkJCQlpZiAoc2lnbmFsX3BlbmRpbmcKKwkJCQkJCQkgICAgKGN1cnJlbnQpKSB7CisJCQkJCQkJCVBFUlJPUgorCQkJCQkJCQkgICAgKCJXYWl0IG9uIHN0YXJ0IG9mIHN0YXRlIG1hY2hpbmUgaW50ZXJydXB0ZWQuXG4iKTsKKwkJCQkJCQkJc3RvcF9pbW1lZGlhdGVseQorCQkJCQkJCQkgICAgKGluc3RhbmNlKTsKKwkJCQkJCQkJZXJyID0KKwkJCQkJCQkJICAgIE1FX0VSUk5PX1NJR05BTDsKKwkJCQkJCQkJZ290byBFUlJPUjsKKwkJCQkJCQl9CisKKwkJCQkJCQlpZiAoKChqaWZmaWVzIC0gcmVmKSA+PQorCQkJCQkJCSAgICAgZGVsYXkpKSB7CisJCQkJCQkJCVBFUlJPUgorCQkJCQkJCQkgICAgKCJUaW1lb3V0IHJlYWNoZWQuXG4iKTsKKwkJCQkJCQkJc3RvcF9pbW1lZGlhdGVseQorCQkJCQkJCQkgICAgKGluc3RhbmNlKTsKKwkJCQkJCQkJZXJyID0KKwkJCQkJCQkJICAgIE1FX0VSUk5PX1RJTUVPVVQ7CisJCQkJCQkJCWdvdG8gRVJST1I7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9IGVsc2UgeworCQkJCQkJd2hpbGUgKCEKKwkJCQkJCSAgICAgICAoaW5sCisJCQkJCQkJKGluc3RhbmNlLT4KKwkJCQkJCQkgc3RhdHVzX3JlZykgJgorCQkJCQkJCU1FNDYwMF9BT19TVEFUVVNfQklUX0ZTTSkpCisJCQkJCQl7CisJCQkJCQkJaW50ZXJydXB0aWJsZV9zbGVlcF9vbl90aW1lb3V0CisJCQkJCQkJICAgICgmcXVldWUsIDEpOworCisJCQkJCQkJaWYgKHNpZ25hbF9wZW5kaW5nCisJCQkJCQkJICAgIChjdXJyZW50KSkgeworCQkJCQkJCQlQRVJST1IKKwkJCQkJCQkJICAgICgiV2FpdCBvbiBzdGFydCBvZiBzdGF0ZSBtYWNoaW5lIGludGVycnVwdGVkLlxuIik7CisJCQkJCQkJCXN0b3BfaW1tZWRpYXRlbHkKKwkJCQkJCQkJICAgIChpbnN0YW5jZSk7CisJCQkJCQkJCWVyciA9CisJCQkJCQkJCSAgICBNRV9FUlJOT19TSUdOQUw7CisJCQkJCQkJCWdvdG8gRVJST1I7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisJCQkJfSBlbHNlIGlmIChzdGFydF9tb2RlID09CisJCQkJCSAgIE1FX1NUQVJUX01PREVfTk9OQkxPQ0tJTkcpIHsKKwkJCQl9IGVsc2UgeworCQkJCQlQRVJST1IKKwkJCQkJICAgICgiSW52YWxpZCBzdGFydCBtb2RlIHNwZWNpZmllZC5cbiIpOworCQkJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX1NUQVJUX01PREU7CisJCQkJCWdvdG8gRVJST1I7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQl0bXAgJj0KKwkJCQkgICAgfihNRTQ2MDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0lSUSB8CisJCQkJICAgICAgTUU0NjAwX0FPX0NUUkxfQklUX1NUT1AgfAorCQkJCSAgICAgIE1FNDYwMF9BT19DVFJMX0JJVF9JTU1FRElBVEVfU1RPUCk7CisJCQkJb3V0bCh0bXAsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPgorCQkJCQkJICAgICAgIHN1YmRldmljZV9sb2NrLAorCQkJCQkJICAgICAgIGNwdV9mbGFncyk7CisJCQl9CisJCX0gZWxzZSBpZiAoKGlubChpbnN0YW5jZS0+cHJlbG9hZF9yZWcpICYgKDB4MTAwMDEgPDwgaW5zdGFuY2UtPmFvX2lkeCkpID09ICgweDEgPDwgaW5zdGFuY2UtPmFvX2lkeCkpIHsJLy8gU3luY2hyb25vdXMgd3JhcGFyb3VuZCB3aXRoIHN3IHRyaWdnZXIKKworCQkJaWYgKChpbmwoaW5zdGFuY2UtPnN0YXR1c19yZWcpICYKKwkJCSAgICAgTUU0NjAwX0FPX1NUQVRVU19CSVRfRlNNKSkgeworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT4KKwkJCQkJCSAgICAgICBzdWJkZXZpY2VfbG9jaywKKwkJCQkJCSAgICAgICBjcHVfZmxhZ3MpOworCQkJCVBFUlJPUigiQ29udmVyc2lvbiBpcyBhbHJlYWR5IHJ1bm5pbmcuXG4iKTsKKwkJCQllcnIgPSBNRV9FUlJOT19TVUJERVZJQ0VfQlVTWTsKKwkJCQlnb3RvIEVSUk9SOworCQkJfQorCisJCQl0bXAgJj0KKwkJCSAgICB+KE1FNDYwMF9BT19DVFJMX0JJVF9FTkFCTEVfSVJRIHwKKwkJCSAgICAgIE1FNDYwMF9BT19DVFJMX0JJVF9TVE9QIHwKKwkJCSAgICAgIE1FNDYwMF9BT19DVFJMX0JJVF9JTU1FRElBVEVfU1RPUCk7CisKKwkJCW91dGwodG1wLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCisJCQlpZiAoZmxhZ3MgJiBNRV9JT19TVFJFQU1fU1RBUlRfVFlQRV9UUklHX1NZTkNIUk9OT1VTKSB7CisJCQkJb3V0bCgweDgwMDAsIGluc3RhbmNlLT5zaW5nbGVfcmVnKTsKKwkJCQlpbnN0YW5jZS0+c2luZ2xlX3ZhbHVlID0gMHg4MDAwOworCQkJfQorCisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssCisJCQkJCSAgICAgICBjcHVfZmxhZ3MpOworCQl9IGVsc2UgewkvLyBTb2Z0d2FyZSBzdGFydAorCisJCQlpZiAoKGlubChpbnN0YW5jZS0+c3RhdHVzX3JlZykgJgorCQkJICAgICBNRTQ2MDBfQU9fU1RBVFVTX0JJVF9GU00pKSB7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPgorCQkJCQkJICAgICAgIHN1YmRldmljZV9sb2NrLAorCQkJCQkJICAgICAgIGNwdV9mbGFncyk7CisJCQkJUEVSUk9SKCJDb252ZXJzaW9uIGlzIGFscmVhZHkgcnVubmluZy5cbiIpOworCQkJCWVyciA9IE1FX0VSUk5PX1NVQkRFVklDRV9CVVNZOworCQkJCWdvdG8gRVJST1I7CisJCQl9CisKKwkJCXRtcCAmPQorCQkJICAgIH4oTUU0NjAwX0FPX0NUUkxfQklUX0VOQUJMRV9JUlEgfAorCQkJICAgICAgTUU0NjAwX0FPX0NUUkxfQklUX1NUT1AgfAorCQkJICAgICAgTUU0NjAwX0FPX0NUUkxfQklUX0lNTUVESUFURV9TVE9QKTsKKworCQkJb3V0bCh0bXAsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisKKwkJCW91dGwoMHg4MDAwLCBpbnN0YW5jZS0+c2luZ2xlX3JlZyk7CisJCQlpbnN0YW5jZS0+c2luZ2xlX3ZhbHVlID0gMHg4MDAwOworCisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssCisJCQkJCSAgICAgICBjcHVfZmxhZ3MpOworCQl9CisKKwkJYnJlYWs7CisKKwljYXNlIDI6CQkvLyBDb250aW51b3VzIG1vZGUKKwkJaWYgKHRtcCAmIE1FNDYwMF9BT19DVFJMX0JJVF9FTkFCTEVfRVhfVFJJRykgewkvLyBFeHRlcm5hbGx5IHRyaWdnZXJlZAorCisJCQlpZiAoKGlubChpbnN0YW5jZS0+c3RhdHVzX3JlZykgJgorCQkJICAgICBNRTQ2MDBfQU9fU1RBVFVTX0JJVF9GU00pKSB7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPgorCQkJCQkJICAgICAgIHN1YmRldmljZV9sb2NrLAorCQkJCQkJICAgICAgIGNwdV9mbGFncyk7CisJCQkJUEVSUk9SKCJDb252ZXJzaW9uIGlzIGFscmVhZHkgcnVubmluZy5cbiIpOworCQkJCWVyciA9IE1FX0VSUk5PX1NVQkRFVklDRV9CVVNZOworCQkJCWdvdG8gRVJST1I7CisJCQl9CisKKwkJCXRtcCAmPQorCQkJICAgIH4oTUU0NjAwX0FPX0NUUkxfQklUX1NUT1AgfAorCQkJICAgICAgTUU0NjAwX0FPX0NUUkxfQklUX0lNTUVESUFURV9TVE9QKTsKKwkJCXRtcCB8PSBNRTQ2MDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0lSUTsKKwkJCW91dGwodG1wLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQkJaW5zdGFuY2UtPndyYXBfcmVtYWluaW5nID0gaW5zdGFuY2UtPndyYXBfY291bnQ7CisJCQlpbnN0YW5jZS0+Y2lyY19idWYudGFpbCA9IDA7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssCisJCQkJCSAgICAgICBjcHVfZmxhZ3MpOworCisJCQlpZiAoc3RhcnRfbW9kZSA9PSBNRV9TVEFSVF9NT0RFX0JMT0NLSU5HKSB7CisJCQkJaW5pdF93YWl0cXVldWVfaGVhZCgmcXVldWUpOworCisJCQkJaWYgKGRlbGF5KSB7CisJCQkJCXJlZiA9IGppZmZpZXM7CisKKwkJCQkJd2hpbGUgKCEKKwkJCQkJICAgICAgIChpbmwoaW5zdGFuY2UtPnN0YXR1c19yZWcpICYKKwkJCQkJCU1FNDYwMF9BT19TVEFUVVNfQklUX0ZTTSkpIHsKKwkJCQkJCWludGVycnVwdGlibGVfc2xlZXBfb25fdGltZW91dAorCQkJCQkJICAgICgmcXVldWUsIDEpOworCisJCQkJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCQkJCQlQRVJST1IKKwkJCQkJCQkgICAgKCJXYWl0IG9uIHN0YXJ0IG9mIHN0YXRlIG1hY2hpbmUgaW50ZXJydXB0ZWQuXG4iKTsKKwkJCQkJCQlzdG9wX2ltbWVkaWF0ZWx5CisJCQkJCQkJICAgIChpbnN0YW5jZSk7CisJCQkJCQkJZXJyID0gTUVfRVJSTk9fU0lHTkFMOworCQkJCQkJCWdvdG8gRVJST1I7CisJCQkJCQl9CisKKwkJCQkJCWlmICgoKGppZmZpZXMgLSByZWYpID49IGRlbGF5KSkgeworCQkJCQkJCVBFUlJPUgorCQkJCQkJCSAgICAoIlRpbWVvdXQgcmVhY2hlZC5cbiIpOworCQkJCQkJCXN0b3BfaW1tZWRpYXRlbHkKKwkJCQkJCQkgICAgKGluc3RhbmNlKTsKKwkJCQkJCQllcnIgPSBNRV9FUlJOT19USU1FT1VUOworCQkJCQkJCWdvdG8gRVJST1I7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQl3aGlsZSAoIQorCQkJCQkgICAgICAgKGlubChpbnN0YW5jZS0+c3RhdHVzX3JlZykgJgorCQkJCQkJTUU0NjAwX0FPX1NUQVRVU19CSVRfRlNNKSkgeworCQkJCQkJaW50ZXJydXB0aWJsZV9zbGVlcF9vbl90aW1lb3V0CisJCQkJCQkgICAgKCZxdWV1ZSwgMSk7CisKKwkJCQkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJCQkJCVBFUlJPUgorCQkJCQkJCSAgICAoIldhaXQgb24gc3RhcnQgb2Ygc3RhdGUgbWFjaGluZSBpbnRlcnJ1cHRlZC5cbiIpOworCQkJCQkJCXN0b3BfaW1tZWRpYXRlbHkKKwkJCQkJCQkgICAgKGluc3RhbmNlKTsKKwkJCQkJCQllcnIgPSBNRV9FUlJOT19TSUdOQUw7CisJCQkJCQkJZ290byBFUlJPUjsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0gZWxzZSBpZiAoc3RhcnRfbW9kZSA9PSBNRV9TVEFSVF9NT0RFX05PTkJMT0NLSU5HKSB7CisJCQkJLyogRG8gbm90aGluZyAqLworCQkJfSBlbHNlIHsKKwkJCQlQRVJST1IoIkludmFsaWQgc3RhcnQgbW9kZSBzcGVjaWZpZWQuXG4iKTsKKwkJCQlzdG9wX2ltbWVkaWF0ZWx5KGluc3RhbmNlKTsKKwkJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX1NUQVJUX01PREU7CisJCQkJZ290byBFUlJPUjsKKwkJCX0KKwkJfSBlbHNlIGlmICgoaW5sKGluc3RhbmNlLT5wcmVsb2FkX3JlZykgJiAoMHgxMDAwMSA8PCBpbnN0YW5jZS0+YW9faWR4KSkgPT0gKDB4MTAwMDAgPDwgaW5zdGFuY2UtPmFvX2lkeCkpIHsJLy8gU3luY2hyb25vdXMgd2l0aCBleHRlcm5hbCB0cmlnZ2VyCisKKwkJCWlmICgoaW5sKGluc3RhbmNlLT5zdGF0dXNfcmVnKSAmCisJCQkgICAgIE1FNDYwMF9BT19TVEFUVVNfQklUX0ZTTSkpIHsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+CisJCQkJCQkgICAgICAgc3ViZGV2aWNlX2xvY2ssCisJCQkJCQkgICAgICAgY3B1X2ZsYWdzKTsKKwkJCQlQRVJST1IoIkNvbnZlcnNpb24gaXMgYWxyZWFkeSBydW5uaW5nLlxuIik7CisJCQkJZXJyID0gTUVfRVJSTk9fU1VCREVWSUNFX0JVU1k7CisJCQkJZ290byBFUlJPUjsKKwkJCX0KKworCQkJaWYgKGZsYWdzICYgTUVfSU9fU1RSRUFNX1NUQVJUX1RZUEVfVFJJR19TWU5DSFJPTk9VUykgeworCQkJCXRtcCB8PQorCQkJCSAgICBNRTQ2MDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0VYX1RSSUcgfAorCQkJCSAgICBNRTQ2MDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0lSUTsKKwkJCQl0bXAgJj0KKwkJCQkgICAgfihNRTQ2MDBfQU9fQ1RSTF9CSVRfU1RPUCB8CisJCQkJICAgICAgTUU0NjAwX0FPX0NUUkxfQklUX0lNTUVESUFURV9TVE9QKTsKKwkJCQlvdXRsKHRtcCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJCQlpbnN0YW5jZS0+d3JhcF9yZW1haW5pbmcgPSBpbnN0YW5jZS0+d3JhcF9jb3VudDsKKwkJCQlpbnN0YW5jZS0+Y2lyY19idWYudGFpbCA9IDA7CisKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+CisJCQkJCQkgICAgICAgc3ViZGV2aWNlX2xvY2ssCisJCQkJCQkgICAgICAgY3B1X2ZsYWdzKTsKKworCQkJCWlmIChzdGFydF9tb2RlID09IE1FX1NUQVJUX01PREVfQkxPQ0tJTkcpIHsKKwkJCQkJaW5pdF93YWl0cXVldWVfaGVhZCgmcXVldWUpOworCisJCQkJCWlmIChkZWxheSkgeworCQkJCQkJcmVmID0gamlmZmllczsKKworCQkJCQkJd2hpbGUgKCEKKwkJCQkJCSAgICAgICAoaW5sCisJCQkJCQkJKGluc3RhbmNlLT4KKwkJCQkJCQkgc3RhdHVzX3JlZykgJgorCQkJCQkJCU1FNDYwMF9BT19TVEFUVVNfQklUX0ZTTSkpCisJCQkJCQl7CisJCQkJCQkJaW50ZXJydXB0aWJsZV9zbGVlcF9vbl90aW1lb3V0CisJCQkJCQkJICAgICgmcXVldWUsIDEpOworCisJCQkJCQkJaWYgKHNpZ25hbF9wZW5kaW5nCisJCQkJCQkJICAgIChjdXJyZW50KSkgeworCQkJCQkJCQlQRVJST1IKKwkJCQkJCQkJICAgICgiV2FpdCBvbiBzdGFydCBvZiBzdGF0ZSBtYWNoaW5lIGludGVycnVwdGVkLlxuIik7CisJCQkJCQkJCXN0b3BfaW1tZWRpYXRlbHkKKwkJCQkJCQkJICAgIChpbnN0YW5jZSk7CisJCQkJCQkJCWVyciA9CisJCQkJCQkJCSAgICBNRV9FUlJOT19TSUdOQUw7CisJCQkJCQkJCWdvdG8gRVJST1I7CisJCQkJCQkJfQorCisJCQkJCQkJaWYgKCgoamlmZmllcyAtIHJlZikgPj0KKwkJCQkJCQkgICAgIGRlbGF5KSkgeworCQkJCQkJCQlQRVJST1IKKwkJCQkJCQkJICAgICgiVGltZW91dCByZWFjaGVkLlxuIik7CisJCQkJCQkJCXN0b3BfaW1tZWRpYXRlbHkKKwkJCQkJCQkJICAgIChpbnN0YW5jZSk7CisJCQkJCQkJCWVyciA9CisJCQkJCQkJCSAgICBNRV9FUlJOT19USU1FT1VUOworCQkJCQkJCQlnb3RvIEVSUk9SOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXdoaWxlICghCisJCQkJCQkgICAgICAgKGlubAorCQkJCQkJCShpbnN0YW5jZS0+CisJCQkJCQkJIHN0YXR1c19yZWcpICYKKwkJCQkJCQlNRTQ2MDBfQU9fU1RBVFVTX0JJVF9GU00pKQorCQkJCQkJeworCQkJCQkJCWludGVycnVwdGlibGVfc2xlZXBfb25fdGltZW91dAorCQkJCQkJCSAgICAoJnF1ZXVlLCAxKTsKKworCQkJCQkJCWlmIChzaWduYWxfcGVuZGluZworCQkJCQkJCSAgICAoY3VycmVudCkpIHsKKwkJCQkJCQkJUEVSUk9SCisJCQkJCQkJCSAgICAoIldhaXQgb24gc3RhcnQgb2Ygc3RhdGUgbWFjaGluZSBpbnRlcnJ1cHRlZC5cbiIpOworCQkJCQkJCQlzdG9wX2ltbWVkaWF0ZWx5CisJCQkJCQkJCSAgICAoaW5zdGFuY2UpOworCQkJCQkJCQllcnIgPQorCQkJCQkJCQkgICAgTUVfRVJSTk9fU0lHTkFMOworCQkJCQkJCQlnb3RvIEVSUk9SOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0gZWxzZSBpZiAoc3RhcnRfbW9kZSA9PQorCQkJCQkgICBNRV9TVEFSVF9NT0RFX05PTkJMT0NLSU5HKSB7CisJCQkJfSBlbHNlIHsKKwkJCQkJUEVSUk9SCisJCQkJCSAgICAoIkludmFsaWQgc3RhcnQgbW9kZSBzcGVjaWZpZWQuXG4iKTsKKwkJCQkJc3RvcF9pbW1lZGlhdGVseShpbnN0YW5jZSk7CisJCQkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfU1RBUlRfTU9ERTsKKwkJCQkJZ290byBFUlJPUjsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCXRtcCB8PSBNRTQ2MDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0lSUTsKKwkJCQl0bXAgJj0KKwkJCQkgICAgfihNRTQ2MDBfQU9fQ1RSTF9CSVRfU1RPUCB8CisJCQkJICAgICAgTUU0NjAwX0FPX0NUUkxfQklUX0lNTUVESUFURV9TVE9QKTsKKwkJCQlvdXRsKHRtcCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJCQlpbnN0YW5jZS0+d3JhcF9yZW1haW5pbmcgPSBpbnN0YW5jZS0+d3JhcF9jb3VudDsKKwkJCQlpbnN0YW5jZS0+Y2lyY19idWYudGFpbCA9IDA7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPgorCQkJCQkJICAgICAgIHN1YmRldmljZV9sb2NrLAorCQkJCQkJICAgICAgIGNwdV9mbGFncyk7CisJCQl9CisJCX0gZWxzZSBpZiAoKGlubChpbnN0YW5jZS0+cHJlbG9hZF9yZWcpICYgKDB4MTAwMDEgPDwgaW5zdGFuY2UtPmFvX2lkeCkpID09ICgweDEgPDwgaW5zdGFuY2UtPmFvX2lkeCkpIHsJLy8gU3luY2hyb25vdXMgd3JhcGFyb3VuZCB3aXRoIHN3IHRyaWdnZXIKKworCQkJaWYgKChpbmwoaW5zdGFuY2UtPnN0YXR1c19yZWcpICYKKwkJCSAgICAgTUU0NjAwX0FPX1NUQVRVU19CSVRfRlNNKSkgeworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT4KKwkJCQkJCSAgICAgICBzdWJkZXZpY2VfbG9jaywKKwkJCQkJCSAgICAgICBjcHVfZmxhZ3MpOworCQkJCVBFUlJPUigiQ29udmVyc2lvbiBpcyBhbHJlYWR5IHJ1bm5pbmcuXG4iKTsKKwkJCQllcnIgPSBNRV9FUlJOT19TVUJERVZJQ0VfQlVTWTsKKwkJCQlnb3RvIEVSUk9SOworCQkJfQorCisJCQl0bXAgJj0KKwkJCSAgICB+KE1FNDYwMF9BT19DVFJMX0JJVF9TVE9QIHwKKwkJCSAgICAgIE1FNDYwMF9BT19DVFJMX0JJVF9JTU1FRElBVEVfU1RPUCk7CisJCQl0bXAgfD0gTUU0NjAwX0FPX0NUUkxfQklUX0VOQUJMRV9JUlE7CisJCQlpbnN0YW5jZS0+d3JhcF9yZW1haW5pbmcgPSBpbnN0YW5jZS0+d3JhcF9jb3VudDsKKwkJCWluc3RhbmNlLT5jaXJjX2J1Zi50YWlsID0gMDsKKwkJCVBERUJVRygiQ1RSTCBSZWcgPSAweCVYLlxuIiwgaW5sKGluc3RhbmNlLT5jdHJsX3JlZykpOworCQkJb3V0bCh0bXAsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisKKwkJCWlmIChmbGFncyAmIE1FX0lPX1NUUkVBTV9TVEFSVF9UWVBFX1RSSUdfU1lOQ0hST05PVVMpIHsKKwkJCQlvdXRsKDB4ODAwMCwgaW5zdGFuY2UtPnNpbmdsZV9yZWcpOworCQkJCWluc3RhbmNlLT5zaW5nbGVfdmFsdWUgPSAweDgwMDA7CisJCQl9CisKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywKKwkJCQkJICAgICAgIGNwdV9mbGFncyk7CisJCX0gZWxzZSB7CS8vIFNvZnR3YXJlIHN0YXJ0CisKKwkJCWlmICgoaW5sKGluc3RhbmNlLT5zdGF0dXNfcmVnKSAmCisJCQkgICAgIE1FNDYwMF9BT19TVEFUVVNfQklUX0ZTTSkpIHsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+CisJCQkJCQkgICAgICAgc3ViZGV2aWNlX2xvY2ssCisJCQkJCQkgICAgICAgY3B1X2ZsYWdzKTsKKwkJCQlQRVJST1IoIkNvbnZlcnNpb24gaXMgYWxyZWFkeSBydW5uaW5nLlxuIik7CisJCQkJZXJyID0gTUVfRVJSTk9fU1VCREVWSUNFX0JVU1k7CisJCQkJZ290byBFUlJPUjsKKwkJCX0KKworCQkJdG1wICY9CisJCQkgICAgfihNRTQ2MDBfQU9fQ1RSTF9CSVRfU1RPUCB8CisJCQkgICAgICBNRTQ2MDBfQU9fQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1ApOworCisJCQl0bXAgfD0gTUU0NjAwX0FPX0NUUkxfQklUX0VOQUJMRV9JUlE7CisJCQlvdXRsKHRtcCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJCW91dGwoMHg4MDAwLCBpbnN0YW5jZS0+c2luZ2xlX3JlZyk7CisJCQlpbnN0YW5jZS0+c2luZ2xlX3ZhbHVlID0gMHg4MDAwOworCQkJaW5zdGFuY2UtPndyYXBfcmVtYWluaW5nID0gaW5zdGFuY2UtPndyYXBfY291bnQ7CisJCQlpbnN0YW5jZS0+Y2lyY19idWYudGFpbCA9IDA7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssCisJCQkJCSAgICAgICBjcHVfZmxhZ3MpOworCQl9CisKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisJCVBFUlJPUigiSW52YWxpZCBtb2RlIGNvbmZpZ3VyZWQuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fSU5URVJOQUw7CisJCWdvdG8gRVJST1I7CisJfQorCisgICAgICBFUlJPUjoKKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZTQ2MDBfYW9faW9fc3RyZWFtX3N0YXR1cyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgICAgaW50IHdhaXQsCisJCQkJICAgICAgaW50ICpzdGF0dXMsIGludCAqdmFsdWVzLCBpbnQgZmxhZ3MpCit7CisJbWU0NjAwX2FvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwl3YWl0X3F1ZXVlX2hlYWRfdCBxdWV1ZTsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lNDYwMF9hb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZxdWV1ZSk7CisKKwlpZiAoIWluc3RhbmNlLT5maWZvKSB7CisJCVBFUlJPUigiTm90IGEgc3RyZWFtaW5nIGFvLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19OT1RfU1VQUE9SVEVEOworCX0KKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCWlmICh3YWl0ID09IE1FX1dBSVRfTk9ORSkgeworCQkqc3RhdHVzID0KKwkJICAgIChpbmwoaW5zdGFuY2UtPnN0YXR1c19yZWcpICYgTUU0NjAwX0FPX1NUQVRVU19CSVRfRlNNKSA/CisJCSAgICBNRV9TVEFUVVNfQlVTWSA6IE1FX1NUQVRVU19JRExFOworCQkqdmFsdWVzID0gbWVfY2lyY19idWZfc3BhY2UoJmluc3RhbmNlLT5jaXJjX2J1Zik7CisJfSBlbHNlIGlmICh3YWl0ID09IE1FX1dBSVRfSURMRSkgeworCQl3aGlsZSAoaW5sKGluc3RhbmNlLT5zdGF0dXNfcmVnKSAmIE1FNDYwMF9BT19TVEFUVVNfQklUX0ZTTSkgeworCQkJaW50ZXJydXB0aWJsZV9zbGVlcF9vbl90aW1lb3V0KCZxdWV1ZSwgMSk7CisKKwkJCWlmIChpbnN0YW5jZS0+ZmxhZ3MgJiBNRTQ2MDBfQU9fRkxBR1NfQlJPS0VOX1BJUEUpIHsKKwkJCQlQRVJST1IoIk91dHB1dCBzdHJlYW0gd2FzIGludGVycnVwdGVkLlxuIik7CisJCQkJKnN0YXR1cyA9IE1FX1NUQVRVU19FUlJPUjsKKwkJCQllcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCQkJCWdvdG8gRVJST1I7CisJCQl9CisKKwkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJCVBFUlJPUgorCQkJCSAgICAoIldhaXQgb24gc3RhdGUgbWFjaGluZSBpbnRlcnJ1cHRlZCBieSBzaWduYWwuXG4iKTsKKwkJCQkqc3RhdHVzID0gTUVfU1RBVFVTX0lOVkFMSUQ7CisJCQkJZXJyID0gTUVfRVJSTk9fU0lHTkFMOworCQkJCWdvdG8gRVJST1I7CisJCQl9CisJCX0KKworCQkqc3RhdHVzID0gTUVfU1RBVFVTX0lETEU7CisKKwkJKnZhbHVlcyA9IG1lX2NpcmNfYnVmX3NwYWNlKCZpbnN0YW5jZS0+Y2lyY19idWYpOworCX0gZWxzZSB7CisJCVBFUlJPUigiSW52YWxpZCB3YWl0IGFyZ3VtZW50IHNwZWNpZmllZC5cbiIpOworCQkqc3RhdHVzID0gTUVfU1RBVFVTX0lOVkFMSUQ7CisJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfV0FJVDsKKwkJZ290byBFUlJPUjsKKwl9CisKKyAgICAgIEVSUk9SOgorCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lNDYwMF9hb19pb19zdHJlYW1fc3RvcChtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICBpbnQgc3RvcF9tb2RlLCBpbnQgZmxhZ3MpCit7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJbWU0NjAwX2FvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwl1bnNpZ25lZCBsb25nIGNwdV9mbGFnczsKKwl1bnNpZ25lZCBsb25nIHRtcDsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lNDYwMF9hb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlpZiAoIWluc3RhbmNlLT5maWZvKSB7CisJCVBFUlJPUigiTm90IGEgc3RyZWFtaW5nIGFvLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19OT1RfU1VQUE9SVEVEOworCX0KKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCWlmIChzdG9wX21vZGUgPT0gTUVfU1RPUF9NT0RFX0lNTUVESUFURSkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCQl0bXAgPSBpbmwoaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJdG1wIHw9CisJCSAgICBNRTQ2MDBfQU9fQ1RSTF9CSVRfU1RPUCB8IE1FNDYwMF9BT19DVFJMX0JJVF9JTU1FRElBVEVfU1RPUDsKKwkJb3V0bCh0bXAsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisKKwkJd2hpbGUgKGlubChpbnN0YW5jZS0+c3RhdHVzX3JlZykgJiBNRTQ2MDBfQU9fU1RBVFVTX0JJVF9GU00pIDsKKworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisJfSBlbHNlIGlmIChzdG9wX21vZGUgPT0gTUVfU1RPUF9NT0RFX0xBU1RfVkFMVUUpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKwkJdG1wID0gaW5sKGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCXRtcCB8PSBNRTQ2MDBfQU9fQ1RSTF9CSVRfU1RPUDsKKwkJb3V0bCh0bXAsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKwl9IGVsc2UgeworCQlQRVJST1IoIkludmFsaWQgc3RvcCBtb2RlIHNwZWNpZmllZC5cbiIpOworCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX1NUT1BfTU9ERTsKKwkJZ290byBFUlJPUjsKKwl9CisKKyAgICAgIEVSUk9SOgorCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lNDYwMF9hb19pb19zdHJlYW1fd3JpdGUobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgICBpbnQgd3JpdGVfbW9kZSwKKwkJCQkgICAgIGludCAqdmFsdWVzLCBpbnQgKmNvdW50LCBpbnQgZmxhZ3MpCit7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJbWU0NjAwX2FvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwl1bnNpZ25lZCBsb25nIHRtcDsKKwlpbnQgaTsKKwlpbnQgdmFsdWU7CisJaW50IGNudCA9ICpjb3VudDsKKwlpbnQgYzsKKwlpbnQgazsKKwlpbnQgcmV0ID0gMDsKKwl1bnNpZ25lZCBsb25nIGNwdV9mbGFncyA9IDA7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbnN0YW5jZSA9IChtZTQ2MDBfYW9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJaWYgKCFpbnN0YW5jZS0+ZmlmbykgeworCQlQRVJST1IoIk5vdCBhIHN0cmVhbWluZyBhby5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fTk9UX1NVUFBPUlRFRDsKKwl9CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlpZiAoKmNvdW50IDw9IDApIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGNvdW50IG9mIHZhbHVlcyBzcGVjaWZpZWQuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9WQUxVRV9DT1VOVDsKKwkJZ290byBFUlJPUjsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCisJdG1wID0gaW5sKGluc3RhbmNlLT5jdHJsX3JlZyk7CisKKwlzd2l0Y2ggKHRtcCAmIDB4MykgeworCisJY2FzZSAxOgkJLy8gV3JhcGFyb3VuZCBtb2RlCisJCWlmIChpbnN0YW5jZS0+Ym9zY2hfZncpIHsJLy8gQm9zY2ggZmlybXdhcmUKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywKKwkJCQkJICAgICAgIGNwdV9mbGFncyk7CisKKwkJCWlmIChjbnQgIT0gNykgeworCQkJCVBFUlJPUgorCQkJCSAgICAoIkludmFsaWQgY291bnQgb2YgdmFsdWVzIHNwZWNpZmllZC4gNyBleHBlY3RlZC5cbiIpOworCQkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfVkFMVUVfQ09VTlQ7CisJCQkJZ290byBFUlJPUjsKKwkJCX0KKworCQkJZm9yIChpID0gMDsgaSA8IDc7IGkrKykgeworCQkJCWlmIChnZXRfdXNlcih2YWx1ZSwgdmFsdWVzKSkgeworCQkJCQlQRVJST1IKKwkJCQkJICAgICgiQ2FuJ3QgY29weSB2YWx1ZSBmcm9tIHVzZXIgc3BhY2UuXG4iKTsKKwkJCQkJZXJyID0gTUVfRVJSTk9fSU5URVJOQUw7CisJCQkJCWdvdG8gRVJST1I7CisJCQkJfQorCisJCQkJaWYgKGkgPT0gMCkgeworCQkJCQkvKiBNYXhpbXVtIHZvbHRhZ2UgKi8KKwkJCQkJdmFsdWUgPDw9IDE2OworCQkJCQl2YWx1ZSB8PQorCQkJCQkgICAgaW5sKGluc3RhbmNlLT5yZWdfYmFzZSArCisJCQkJCQkweEQ0KSAmIDB4RkZGRjsKKwkJCQkJb3V0bCh2YWx1ZSwgaW5zdGFuY2UtPnJlZ19iYXNlICsgMHhENCk7CisJCQkJfSBlbHNlIGlmIChpID09IDEpIHsKKwkJCQkJLyogTWluaW11bSB2b2x0YWdlICovCisJCQkJCXZhbHVlICY9IDB4RkZGRjsKKwkJCQkJdmFsdWUgfD0KKwkJCQkJICAgIGlubChpbnN0YW5jZS0+cmVnX2Jhc2UgKworCQkJCQkJMHhENCkgJiAweEZGRkYwMDAwOworCQkJCQlvdXRsKHZhbHVlLCBpbnN0YW5jZS0+cmVnX2Jhc2UgKyAweEQ0KTsKKwkJCQl9IGVsc2UgaWYgKGkgPT0gMikgeworCQkJCQkvKiBEZWx0YSB1cCAqLworCQkJCQl2YWx1ZSA8PD0gMTY7CisJCQkJCXZhbHVlIHw9CisJCQkJCSAgICBpbmwoaW5zdGFuY2UtPnJlZ19iYXNlICsKKwkJCQkJCTB4RDgpICYgMHhGRkZGOworCQkJCQlvdXRsKHZhbHVlLCBpbnN0YW5jZS0+cmVnX2Jhc2UgKyAweEQ4KTsKKwkJCQl9IGVsc2UgaWYgKGkgPT0gMykgeworCQkJCQkvKiBEZWx0YSBkb3duICovCisJCQkJCXZhbHVlICY9IDB4RkZGRjsKKwkJCQkJdmFsdWUgfD0KKwkJCQkJICAgIGlubChpbnN0YW5jZS0+cmVnX2Jhc2UgKworCQkJCQkJMHhEOCkgJiAweEZGRkYwMDAwOworCQkJCQlvdXRsKHZhbHVlLCBpbnN0YW5jZS0+cmVnX2Jhc2UgKyAweEQ4KTsKKwkJCQl9IGVsc2UgaWYgKGkgPT0gNCkgeworCQkJCQkvKiBTdGFydCB2YWx1ZSAqLworCQkJCQlvdXRsKHZhbHVlLCBpbnN0YW5jZS0+cmVnX2Jhc2UgKyAweERDKTsKKwkJCQl9IGVsc2UgaWYgKGkgPT0gNSkgeworCQkJCQkvKiBJbnZlcnQgKi8KKwkJCQkJaWYgKHZhbHVlKSB7CisJCQkJCQl2YWx1ZSA9IGlubChpbnN0YW5jZS0+Y3RybF9yZWcpOworCQkJCQkJdmFsdWUgfD0gMHgxMDA7CisJCQkJCQlvdXRsKHZhbHVlLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQkJCQl9IGVsc2UgeworCQkJCQkJdmFsdWUgPSBpbmwoaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJCQkJCXZhbHVlICY9IH4weDEwMDsKKwkJCQkJCW91dGwodmFsdWUsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCQkJCX0KKwkJCQl9IGVsc2UgaWYgKGkgPT0gNikgeworCQkJCQkvKiBUaW1lciBmb3IgcG9zaXRpdmUgcmFtcCAqLworCQkJCQlvdXRsKHZhbHVlLCBpbnN0YW5jZS0+cmVnX2Jhc2UgKyAweEUwKTsKKwkJCQl9CisKKwkJCQl2YWx1ZXMrKzsKKwkJCX0KKwkJfSBlbHNlIHsJLy8gTm9ybWFsIGZpcm13YXJlCisJCQlQREVCVUcoIldyaXRlIGZvciB3cmFwYXJvdW5kIG1vZGUuXG4iKTsKKworCQkJaWYgKGlubChpbnN0YW5jZS0+c3RhdHVzX3JlZykgJgorCQkJICAgIE1FNDYwMF9BT19TVEFUVVNfQklUX0ZTTSkgeworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT4KKwkJCQkJCSAgICAgICBzdWJkZXZpY2VfbG9jaywKKwkJCQkJCSAgICAgICBjcHVfZmxhZ3MpOworCQkJCVBFUlJPUgorCQkJCSAgICAoIlRoZXJlIGlzIGFscmVhZHkgYSBjb252ZXJzaW9uIHJ1bm5pbmcuXG4iKTsKKwkJCQllcnIgPSBNRV9FUlJOT19TVUJERVZJQ0VfQlVTWTsKKwkJCQlnb3RvIEVSUk9SOworCQkJfQorCisJCQl0bXAgfD0gTUU0NjAwX0FPX0NUUkxfQklUX0lNTUVESUFURV9TVE9QOworCQkJdG1wICY9IH5NRTQ2MDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0ZJRk87CisJCQlvdXRsKHRtcCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJCXRtcCB8PSBNRTQ2MDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0ZJRk87CisKKwkJCWlmICgoKmNvdW50ID4gTUU0NjAwX0FPX0ZJRk9fQ09VTlQpIHx8CisJCQkgICAgKChpbnN0YW5jZS0+CisJCQkgICAgICBmbGFncyAmIE1FNDYwMF9BT19GTEFHU19TV19XUkFQX01PREVfTUFTSykgPT0KKwkJCSAgICAgTUU0NjAwX0FPX0ZMQUdTX1NXX1dSQVBfTU9ERV9GSU4pKSB7CisJCQkJdG1wICY9CisJCQkJICAgIH4oTUU0NjAwX0FPX0NUUkxfQklUX01PREVfMCB8CisJCQkJICAgICAgTUU0NjAwX0FPX0NUUkxfQklUX01PREVfMSk7CisJCQkJdG1wIHw9IE1FNDYwMF9BT19DVFJMX0JJVF9NT0RFXzE7CisJCQl9CisKKwkJCW91dGwodG1wLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLAorCQkJCQkgICAgICAgY3B1X2ZsYWdzKTsKKworCQkJaWYgKCgqY291bnQgPD0gTUU0NjAwX0FPX0ZJRk9fQ09VTlQpICYmCisJCQkgICAgKChpbnN0YW5jZS0+CisJCQkgICAgICBmbGFncyAmIE1FNDYwMF9BT19GTEFHU19TV19XUkFQX01PREVfTUFTSykgPT0KKwkJCSAgICAgTUU0NjAwX0FPX0ZMQUdTX1NXX1dSQVBfTU9ERV9JTkYpKSB7CisJCQkJZm9yIChpID0gMDsgaSA8ICpjb3VudDsgaSsrKSB7CisJCQkJCWlmIChnZXRfdXNlcih2YWx1ZSwgdmFsdWVzICsgaSkpIHsKKwkJCQkJCVBFUlJPUgorCQkJCQkJICAgICgiQ2Fubm90IGNvcHkgdmFsdWUgZnJvbSB1c2VyIHNwYWNlLlxuIik7CisJCQkJCQllcnIgPSBNRV9FUlJOT19JTlRFUk5BTDsKKwkJCQkJCWdvdG8gRVJST1I7CisJCQkJCX0KKworCQkJCQlpZiAoaW5zdGFuY2UtPmFvX2lkeCAmIDB4MSkKKwkJCQkJCXZhbHVlIDw8PSAxNjsKKworCQkJCQlvdXRsKHZhbHVlLCBpbnN0YW5jZS0+Zmlmb19yZWcpOworCQkJCX0KKwkJCX0gZWxzZSBpZiAoKCpjb3VudCA8PSBNRTQ2MDBfQU9fQ0lSQ19CVUZfQ09VTlQpICYmCisJCQkJICAgKChpbnN0YW5jZS0+CisJCQkJICAgICBmbGFncyAmIE1FNDYwMF9BT19GTEFHU19TV19XUkFQX01PREVfTUFTSykKKwkJCQkgICAgPT0gTUU0NjAwX0FPX0ZMQUdTX1NXX1dSQVBfTU9ERV9JTkYpKSB7CisJCQkJZm9yIChpID0gMDsgaSA8ICpjb3VudDsgaSsrKSB7CisJCQkJCWlmIChnZXRfdXNlcih2YWx1ZSwgdmFsdWVzICsgaSkpIHsKKwkJCQkJCVBFUlJPUgorCQkJCQkJICAgICgiQ2Fubm90IGNvcHkgdmFsdWUgZnJvbSB1c2VyIHNwYWNlLlxuIik7CisJCQkJCQllcnIgPSBNRV9FUlJOT19JTlRFUk5BTDsKKwkJCQkJCWdvdG8gRVJST1I7CisJCQkJCX0KKworCQkJCQlpbnN0YW5jZS0+Y2lyY19idWYuYnVmW2ldID0gdmFsdWU7CS8qIFVzZWQgdG8gaG9sZCB0aGUgdmFsdWVzLiAqLworCQkJCX0KKworCQkJCWluc3RhbmNlLT5jaXJjX2J1Zi50YWlsID0gMDsJLyogVXNlZCBhcyB0aGUgY3VycmVudCByZWFkIHBvc2l0aW9uLiAqLworCQkJCWluc3RhbmNlLT5jaXJjX2J1Zi5oZWFkID0gKmNvdW50OwkvKiBVc2VkIGFzIHRoZSBidWZmZXIgc2l6ZS4gKi8KKworCQkJCS8qIFByZWxvYWQgdGhlIEZJRk8uICovCisKKwkJCQlmb3IgKGkgPSAwOyBpIDwgTUU0NjAwX0FPX0ZJRk9fQ09VTlQ7CisJCQkJICAgICBpKyssIGluc3RhbmNlLT5jaXJjX2J1Zi50YWlsKyspIHsKKwkJCQkJaWYgKGluc3RhbmNlLT5jaXJjX2J1Zi50YWlsID49CisJCQkJCSAgICBpbnN0YW5jZS0+Y2lyY19idWYuaGVhZCkKKwkJCQkJCWluc3RhbmNlLT5jaXJjX2J1Zi50YWlsID0gMDsKKworCQkJCQlpZiAoaW5zdGFuY2UtPmFvX2lkeCAmIDB4MSkKKwkJCQkJCW91dGwoaW5zdGFuY2UtPmNpcmNfYnVmLgorCQkJCQkJICAgICBidWZbaW5zdGFuY2UtPmNpcmNfYnVmLgorCQkJCQkJCSB0YWlsXSA8PCAxNiwKKwkJCQkJCSAgICAgaW5zdGFuY2UtPmZpZm9fcmVnKTsKKwkJCQkJZWxzZQorCQkJCQkJb3V0bChpbnN0YW5jZS0+Y2lyY19idWYuCisJCQkJCQkgICAgIGJ1ZltpbnN0YW5jZS0+Y2lyY19idWYuCisJCQkJCQkJIHRhaWxdLAorCQkJCQkJICAgICBpbnN0YW5jZS0+Zmlmb19yZWcpOworCQkJCX0KKwkJCX0gZWxzZSBpZiAoKCpjb3VudCA8PSBNRTQ2MDBfQU9fQ0lSQ19CVUZfQ09VTlQpICYmCisJCQkJICAgKChpbnN0YW5jZS0+CisJCQkJICAgICBmbGFncyAmIE1FNDYwMF9BT19GTEFHU19TV19XUkFQX01PREVfTUFTSykKKwkJCQkgICAgPT0gTUU0NjAwX0FPX0ZMQUdTX1NXX1dSQVBfTU9ERV9GSU4pKSB7CisJCQkJdW5zaWduZWQgaW50IHByZWxvYWRfY291bnQ7CisKKwkJCQlmb3IgKGkgPSAwOyBpIDwgKmNvdW50OyBpKyspIHsKKwkJCQkJaWYgKGdldF91c2VyKHZhbHVlLCB2YWx1ZXMgKyBpKSkgeworCQkJCQkJUEVSUk9SCisJCQkJCQkgICAgKCJDYW5ub3QgY29weSB2YWx1ZSBmcm9tIHVzZXIgc3BhY2UuXG4iKTsKKwkJCQkJCWVyciA9IE1FX0VSUk5PX0lOVEVSTkFMOworCQkJCQkJZ290byBFUlJPUjsKKwkJCQkJfQorCisJCQkJCWluc3RhbmNlLT5jaXJjX2J1Zi5idWZbaV0gPSB2YWx1ZTsJLyogVXNlZCB0byBob2xkIHRoZSB2YWx1ZXMuICovCisJCQkJfQorCisJCQkJaW5zdGFuY2UtPmNpcmNfYnVmLnRhaWwgPSAwOwkvKiBVc2VkIGFzIHRoZSBjdXJyZW50IHJlYWQgcG9zaXRpb24uICovCisJCQkJaW5zdGFuY2UtPmNpcmNfYnVmLmhlYWQgPSAqY291bnQ7CS8qIFVzZWQgYXMgdGhlIGJ1ZmZlciBzaXplLiAqLworCisJCQkJLyogVHJ5IHRvIHByZWxvYWQgdGhlIHdob2xlIEZJRk8uICovCisJCQkJcHJlbG9hZF9jb3VudCA9IE1FNDYwMF9BT19GSUZPX0NPVU5UOworCisJCQkJaWYgKHByZWxvYWRfY291bnQgPiBpbnN0YW5jZS0+d3JhcF9jb3VudCkKKwkJCQkJcHJlbG9hZF9jb3VudCA9IGluc3RhbmNlLT53cmFwX2NvdW50OworCisJCQkJLyogUHJlbG9hZCB0aGUgRklGTy4gKi8KKwkJCQlmb3IgKGkgPSAwOyBpIDwgcHJlbG9hZF9jb3VudDsKKwkJCQkgICAgIGkrKywgaW5zdGFuY2UtPmNpcmNfYnVmLnRhaWwrKykgeworCQkJCQlpZiAoaW5zdGFuY2UtPmNpcmNfYnVmLnRhaWwgPj0KKwkJCQkJICAgIGluc3RhbmNlLT5jaXJjX2J1Zi5oZWFkKQorCQkJCQkJaW5zdGFuY2UtPmNpcmNfYnVmLnRhaWwgPSAwOworCisJCQkJCWlmIChpbnN0YW5jZS0+YW9faWR4ICYgMHgxKQorCQkJCQkJb3V0bChpbnN0YW5jZS0+Y2lyY19idWYuCisJCQkJCQkgICAgIGJ1ZltpbnN0YW5jZS0+Y2lyY19idWYuCisJCQkJCQkJIHRhaWxdIDw8IDE2LAorCQkJCQkJICAgICBpbnN0YW5jZS0+Zmlmb19yZWcpOworCQkJCQllbHNlCisJCQkJCQlvdXRsKGluc3RhbmNlLT5jaXJjX2J1Zi4KKwkJCQkJCSAgICAgYnVmW2luc3RhbmNlLT5jaXJjX2J1Zi4KKwkJCQkJCQkgdGFpbF0sCisJCQkJCQkgICAgIGluc3RhbmNlLT5maWZvX3JlZyk7CisJCQkJfQorCisJCQkJaW5zdGFuY2UtPndyYXBfcmVtYWluaW5nID0KKwkJCQkgICAgaW5zdGFuY2UtPndyYXBfY291bnQgLSBwcmVsb2FkX2NvdW50OworCQkJfSBlbHNlIHsKKwkJCQlQRVJST1IoIlRvIG1hbnkgdmFsdWVzIHdyaXR0ZW4uXG4iKTsKKwkJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX1ZBTFVFX0NPVU5UOworCQkJCWdvdG8gRVJST1I7CisJCQl9CisJCX0KKworCQlicmVhazsKKworCWNhc2UgMjoJCS8vIENvbnRpbnVvdXMgbW9kZQorCQkvKiBDaGVjayBpZiBpbiBTVyB3cmFwcm91bmQgbW9kZSAqLworCQlpZiAoaW5zdGFuY2UtPmZsYWdzICYgTUU0NjAwX0FPX0ZMQUdTX1NXX1dSQVBfTU9ERV9NQVNLKSB7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssCisJCQkJCSAgICAgICBjcHVfZmxhZ3MpOworCQkJUEVSUk9SKCJTdWJkZXZpY2UgaXMgY29uZmlndXJlZCBTVyB3cmFwcm91bmQgbW9kZS5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fUFJFVklPVVNfQ09ORklHOworCQkJZ290byBFUlJPUjsKKwkJfQorCisJCXN3aXRjaCAod3JpdGVfbW9kZSkgeworCisJCWNhc2UgTUVfV1JJVEVfTU9ERV9CTE9DS0lORzoKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywKKwkJCQkJICAgICAgIGNwdV9mbGFncyk7CisKKwkJCVBERUJVRygiV3JpdGUgZm9yIGJsb2NraW5nIGNvbnRpbnVvdXMgbW9kZS5cbiIpOworCisJCQl3aGlsZSAoY250ID4gMCkgeworCQkJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShpbnN0YW5jZS0+d2FpdF9xdWV1ZSwKKwkJCQkJCQkgKGMgPQorCQkJCQkJCSAgbWVfY2lyY19idWZfc3BhY2VfdG9fZW5kCisJCQkJCQkJICAoJmluc3RhbmNlLT4KKwkJCQkJCQkgICBjaXJjX2J1ZikpKTsKKworCQkJCWlmIChpbnN0YW5jZS0+CisJCQkJICAgIGZsYWdzICYgTUU0NjAwX0FPX0ZMQUdTX0JST0tFTl9QSVBFKSB7CisJCQkJCVBFUlJPUgorCQkJCQkgICAgKCJCcm9rZW4gcGlwZSBpbiBibG9ja2luZyB3cml0ZS5cbiIpOworCQkJCQllcnIgPSBNRV9FUlJOT19TVUJERVZJQ0VfTk9UX1JVTk5JTkc7CisJCQkJCWdvdG8gRVJST1I7CisJCQkJfSBlbHNlIGlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJCQlQRVJST1IKKwkJCQkJICAgICgiV2FpdCBmb3IgZnJlZSBidWZmZXIgaW50ZXJydXB0ZWQgZnJvbSBzaWduYWwuXG4iKTsKKwkJCQkJZXJyID0gTUVfRVJSTk9fU0lHTkFMOworCQkJCQlnb3RvIEVSUk9SOworCQkJCX0KKworCQkJCVBERUJVRygiU3BhY2UgdG8gZW5kID0gJWQuXG4iLCBjKTsKKworCQkJCS8qIE9ubHkgYWJsZSB0byB3cml0ZSBzaXplIG9mIGZyZWUgYnVmZmVyIG9yIHNpemUgb2YgY291bnQgKi8KKworCQkJCWlmIChjbnQgPCBjKQorCQkJCQljID0gY250OworCQkJCWsgPSBzaXplb2YoaW50KSAqIGM7CisJCQkJayAtPSBjb3B5X2Zyb21fdXNlcihpbnN0YW5jZS0+Y2lyY19idWYuYnVmICsKKwkJCQkJCSAgICBpbnN0YW5jZS0+Y2lyY19idWYuaGVhZCwKKwkJCQkJCSAgICB2YWx1ZXMsIGspOworCQkJCWMgPSBrIC8gc2l6ZW9mKGludCk7CisKKwkJCQlQREVCVUcoIkNvcHkgJWQgdmFsdWVzIGZyb20gdXNlciBzcGFjZS5cbiIsIGMpOworCisJCQkJaWYgKCFjKSB7CisJCQkJCVBFUlJPUgorCQkJCQkgICAgKCJDYW5ub3QgY29weSB2YWx1ZXMgZnJvbSB1c2VyIHNwYWNlLlxuIik7CisJCQkJCWVyciA9IE1FX0VSUk5PX0lOVEVSTkFMOworCQkJCQlnb3RvIEVSUk9SOworCQkJCX0KKworCQkJCWluc3RhbmNlLT5jaXJjX2J1Zi5oZWFkID0KKwkJCQkgICAgKGluc3RhbmNlLT5jaXJjX2J1Zi5oZWFkICsKKwkJCQkgICAgIGMpICYgKGluc3RhbmNlLT5jaXJjX2J1Zi5tYXNrKTsKKworCQkJCXZhbHVlcyArPSBjOworCQkJCWNudCAtPSBjOworCQkJCXJldCArPSBjOworCisJCQkJLyogVmFsdWVzIGFyZSBub3cgYXZhaWxhYmxlIHNvIGVuYWJsZSBpbnRlcnJ1cHRzICovCisJCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywKKwkJCQkJCSAgY3B1X2ZsYWdzKTsKKworCQkJCWlmIChtZV9jaXJjX2J1Zl9zcGFjZSgmaW5zdGFuY2UtPmNpcmNfYnVmKSkgeworCQkJCQl0bXAgPSBpbmwoaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJCQkJdG1wIHw9IE1FNDYwMF9BT19DVFJMX0JJVF9FTkFCTEVfSVJROworCQkJCQlvdXRsKHRtcCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJCQl9CisKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+CisJCQkJCQkgICAgICAgc3ViZGV2aWNlX2xvY2ssCisJCQkJCQkgICAgICAgY3B1X2ZsYWdzKTsKKwkJCX0KKworCQkJKmNvdW50ID0gcmV0OworCisJCQlicmVhazsKKworCQljYXNlIE1FX1dSSVRFX01PREVfTk9OQkxPQ0tJTkc6CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssCisJCQkJCSAgICAgICBjcHVfZmxhZ3MpOworCisJCQlQREVCVUcoIldyaXRlIGZvciBub24gYmxvY2tpbmcgY29udGludW91cyBtb2RlLlxuIik7CisKKwkJCXdoaWxlIChjbnQgPiAwKSB7CisJCQkJaWYgKGluc3RhbmNlLT4KKwkJCQkgICAgZmxhZ3MgJiBNRTQ2MDBfQU9fRkxBR1NfQlJPS0VOX1BJUEUpIHsKKwkJCQkJUEVSUk9SCisJCQkJCSAgICAoIk1FNDYwMDpCcm9rZW4gcGlwZSBpbiBub25ibG9ja2luZyB3cml0ZS5cbiIpOworCQkJCQllcnIgPSBNRV9FUlJOT19TVUJERVZJQ0VfTk9UX1JVTk5JTkc7CisJCQkJCWdvdG8gRVJST1I7CisJCQkJfQorCisJCQkJYyA9IG1lX2NpcmNfYnVmX3NwYWNlX3RvX2VuZCgmaW5zdGFuY2UtPgorCQkJCQkJCSAgICAgY2lyY19idWYpOworCisJCQkJaWYgKCFjKSB7CisJCQkJCVBERUJVRworCQkJCQkgICAgKCJSZXR1cm5pbmcgZnJvbSBub25ibG9ja2luZyB3cml0ZS5cbiIpOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQlQREVCVUcoIlNwYWNlIHRvIGVuZCA9ICVkLlxuIiwgYyk7CisKKwkJCQkvKiBPbmx5IGFibGUgdG8gd3JpdGUgc2l6ZSBvZiBmcmVlIGJ1ZmZlciBvciBzaXplIG9mIGNvdW50ICovCisKKwkJCQlpZiAoY250IDwgYykKKwkJCQkJYyA9IGNudDsKKwkJCQlrID0gc2l6ZW9mKGludCkgKiBjOworCQkJCWsgLT0gY29weV9mcm9tX3VzZXIoaW5zdGFuY2UtPmNpcmNfYnVmLmJ1ZiArCisJCQkJCQkgICAgaW5zdGFuY2UtPmNpcmNfYnVmLmhlYWQsCisJCQkJCQkgICAgdmFsdWVzLCBrKTsKKwkJCQljID0gayAvIHNpemVvZihpbnQpOworCisJCQkJUERFQlVHKCJDb3B5ICVkIHZhbHVlcyBmcm9tIHVzZXIgc3BhY2UuXG4iLCBjKTsKKworCQkJCWlmICghYykgeworCQkJCQlQRVJST1IKKwkJCQkJICAgICgiQ2Fubm90IGNvcHkgdmFsdWVzIGZyb20gdXNlciBzcGFjZS5cbiIpOworCQkJCQllcnIgPSBNRV9FUlJOT19JTlRFUk5BTDsKKwkJCQkJZ290byBFUlJPUjsKKwkJCQl9CisKKwkJCQlpbnN0YW5jZS0+Y2lyY19idWYuaGVhZCA9CisJCQkJICAgIChpbnN0YW5jZS0+Y2lyY19idWYuaGVhZCArCisJCQkJICAgICBjKSAmIChpbnN0YW5jZS0+Y2lyY19idWYubWFzayk7CisKKwkJCQl2YWx1ZXMgKz0gYzsKKwkJCQljbnQgLT0gYzsKKwkJCQlyZXQgKz0gYzsKKworCQkJCS8qIFZhbHVlcyBhcmUgbm93IGF2YWlsYWJsZSBzbyBlbmFibGUgaW50ZXJydXB0cyAqLworCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssCisJCQkJCQkgIGNwdV9mbGFncyk7CisKKwkJCQlpZiAobWVfY2lyY19idWZfc3BhY2UoJmluc3RhbmNlLT5jaXJjX2J1ZikpIHsKKwkJCQkJdG1wID0gaW5sKGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCQkJCXRtcCB8PSBNRTQ2MDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0lSUTsKKwkJCQkJb3V0bCh0bXAsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCQkJfQorCisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPgorCQkJCQkJICAgICAgIHN1YmRldmljZV9sb2NrLAorCQkJCQkJICAgICAgIGNwdV9mbGFncyk7CisJCQl9CisKKwkJCSpjb3VudCA9IHJldDsKKworCQkJYnJlYWs7CisKKwkJY2FzZSBNRV9XUklURV9NT0RFX1BSRUxPQUQ6CisJCQlQREVCVUcoIldyaXRlIGZvciBwcmVsb2FkIGNvbnRpbnVvdXMgbW9kZS5cbiIpOworCisJCQlpZiAoKGlubChpbnN0YW5jZS0+c3RhdHVzX3JlZykgJgorCQkJICAgICBNRTQ2MDBfQU9fU1RBVFVTX0JJVF9GU00pKSB7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPgorCQkJCQkJICAgICAgIHN1YmRldmljZV9sb2NrLAorCQkJCQkJICAgICAgIGNwdV9mbGFncyk7CisJCQkJUEVSUk9SCisJCQkJICAgICgiQ2FuJ3QgUHJlbG9hZCBEQUMgRklGTyB3aGlsZSBjb252ZXJzaW9uIGlzIHJ1bm5pbmcuXG4iKTsKKwkJCQllcnIgPSBNRV9FUlJOT19TVUJERVZJQ0VfQlVTWTsKKwkJCQlnb3RvIEVSUk9SOworCQkJfQorCisJCQl0bXAgPSBpbmwoaW5zdGFuY2UtPmN0cmxfcmVnKTsKKworCQkJdG1wIHw9CisJCQkgICAgTUU0NjAwX0FPX0NUUkxfQklUX1NUT1AgfAorCQkJICAgIE1FNDYwMF9BT19DVFJMX0JJVF9JTU1FRElBVEVfU1RPUDsKKwkJCW91dGwodG1wLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQkJdG1wICY9CisJCQkgICAgfihNRTQ2MDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0ZJRk8gfAorCQkJICAgICAgTUU0NjAwX0FPX0NUUkxfQklUX0VOQUJMRV9JUlEpOworCQkJb3V0bCh0bXAsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCQl0bXAgfD0gTUU0NjAwX0FPX0NUUkxfQklUX0VOQUJMRV9GSUZPOworCQkJb3V0bCh0bXAsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisKKwkJCWluc3RhbmNlLT5jaXJjX2J1Zi5oZWFkID0gMDsKKwkJCWluc3RhbmNlLT5jaXJjX2J1Zi50YWlsID0gMDsKKwkJCWluc3RhbmNlLT5mbGFncyAmPSB+TUU0NjAwX0FPX0ZMQUdTX0JST0tFTl9QSVBFOworCisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssCisJCQkJCSAgICAgICBjcHVfZmxhZ3MpOworCisJCQljID0gTUU0NjAwX0FPX0ZJRk9fQ09VTlQ7CisKKwkJCWlmIChjbnQgPCBjKQorCQkJCWMgPSBjbnQ7CisKKwkJCWZvciAoaSA9IDA7IGkgPCBjOyBpKyspIHsKKwkJCQlpZiAoZ2V0X3VzZXIodmFsdWUsIHZhbHVlcykpIHsKKwkJCQkJUEVSUk9SCisJCQkJCSAgICAoIkNhbid0IGNvcHkgdmFsdWUgZnJvbSB1c2VyIHNwYWNlLlxuIik7CisJCQkJCWVyciA9IE1FX0VSUk5PX0lOVEVSTkFMOworCQkJCQlnb3RvIEVSUk9SOworCQkJCX0KKworCQkJCWlmIChpbnN0YW5jZS0+YW9faWR4ICYgMHgxKQorCQkJCQl2YWx1ZSA8PD0gMTY7CisKKwkJCQlvdXRsKHZhbHVlLCBpbnN0YW5jZS0+Zmlmb19yZWcpOworCisJCQkJdmFsdWVzKys7CisJCQl9CisKKwkJCWNudCAtPSBjOworCisJCQlyZXQgKz0gYzsKKworCQkJUERFQlVHKCJXcm90ZSAlZCB2YWx1ZXMgdG8gZmlmby5cbiIsIGMpOworCisJCQl3aGlsZSAoMSkgeworCQkJCWMgPSBtZV9jaXJjX2J1Zl9zcGFjZV90b19lbmQoJmluc3RhbmNlLT4KKwkJCQkJCQkgICAgIGNpcmNfYnVmKTsKKworCQkJCWlmIChjID09IDApCisJCQkJCWJyZWFrOworCisJCQkJaWYgKGNudCA8IGMpCisJCQkJCWMgPSBjbnQ7CisKKwkJCQlpZiAoYyA8PSAwKQorCQkJCQlicmVhazsKKworCQkJCWsgPSBzaXplb2YoaW50KSAqIGM7CisKKwkJCQlrIC09IGNvcHlfZnJvbV91c2VyKGluc3RhbmNlLT5jaXJjX2J1Zi5idWYgKworCQkJCQkJICAgIGluc3RhbmNlLT5jaXJjX2J1Zi5oZWFkLAorCQkJCQkJICAgIHZhbHVlcywgayk7CisKKwkJCQljID0gayAvIHNpemVvZihpbnQpOworCisJCQkJUERFQlVHKCJXcm90ZSAlZCB2YWx1ZXMgdG8gY2lyY3VsYXIgYnVmZmVyLlxuIiwKKwkJCQkgICAgICAgYyk7CisKKwkJCQlpZiAoIWMpIHsKKwkJCQkJUEVSUk9SCisJCQkJCSAgICAoIkNhbid0IGNvcHkgdmFsdWVzIGZyb20gdXNlciBzcGFjZS5cbiIpOworCQkJCQllcnIgPSBNRV9FUlJOT19JTlRFUk5BTDsKKwkJCQkJZ290byBFUlJPUjsKKwkJCQl9CisKKwkJCQlpbnN0YW5jZS0+Y2lyY19idWYuaGVhZCA9CisJCQkJICAgIChpbnN0YW5jZS0+Y2lyY19idWYuaGVhZCArCisJCQkJICAgICBjKSAmIChpbnN0YW5jZS0+Y2lyY19idWYubWFzayk7CisKKwkJCQl2YWx1ZXMgKz0gYzsKKwkJCQljbnQgLT0gYzsKKwkJCQlyZXQgKz0gYzsKKwkJCX0KKworCQkJKmNvdW50ID0gcmV0OworCisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLAorCQkJCQkgICAgICAgY3B1X2ZsYWdzKTsKKworCQkJUEVSUk9SKCJJbnZhbGlkIHdyaXRlIG1vZGUgc3BlY2lmaWVkLlxuIik7CisKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfV1JJVEVfTU9ERTsKKworCQkJZ290byBFUlJPUjsKKwkJfQorCisJCWJyZWFrOworCisJZGVmYXVsdDoJCS8vIFNpbmdsZSBtb2RlIG9mIGludmFsaWQKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCQlQRVJST1IoIlN1YmRldmljZSBpcyBjb25maWd1cmVkIGluIHNpbmdsZSBtb2RlLlxuIik7CisJCWVyciA9IE1FX0VSUk5PX1BSRVZJT1VTX0NPTkZJRzsKKwkJZ290byBFUlJPUjsKKwl9CisKKyAgICAgIEVSUk9SOgorCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gZXJyOworfQorCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsIDYsIDE5KQorc3RhdGljIGlycXJldHVybl90IG1lNDYwMF9hb19pc3IoaW50IGlycSwgdm9pZCAqZGV2X2lkKQorI2Vsc2UKK3N0YXRpYyBpcnFyZXR1cm5fdCBtZTQ2MDBfYW9faXNyKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCisjZW5kaWYKK3sKKwl1bnNpZ25lZCBsb25nIHRtcDsKKwlpbnQgdmFsdWU7CisJbWU0NjAwX2FvX3N1YmRldmljZV90ICppbnN0YW5jZSA9IGRldl9pZDsKKwlpbnQgaTsKKwlpbnQgYyA9IDA7CisJaW50IGMxID0gMDsKKworCWlmIChpcnEgIT0gaW5zdGFuY2UtPmlycSkgeworCQlQREVCVUcoIkluY29ycmVjdCBpbnRlcnJ1cHQgbnVtOiAlZC5cbiIsIGlycSk7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisKKwlpZiAoISgoMHgxIDw8IChpbnN0YW5jZS0+YW9faWR4ICsgMykpICYgaW5sKGluc3RhbmNlLT5pcnFfc3RhdHVzX3JlZykpKSB7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwl0bXAgPSBpbmwoaW5zdGFuY2UtPnN0YXR1c19yZWcpOworCisJaWYgKCEodG1wICYgTUU0NjAwX0FPX1NUQVRVU19CSVRfRUYpICYmCisJICAgICh0bXAgJiBNRTQ2MDBfQU9fU1RBVFVTX0JJVF9IRikgJiYKKwkgICAgKHRtcCAmIE1FNDYwMF9BT19TVEFUVVNfQklUX0hGKSkgeworCQljID0gTUU0NjAwX0FPX0ZJRk9fQ09VTlQ7CisJCVBERUJVRygiRmlmbyBlbXB0eS5cbiIpOworCX0gZWxzZSBpZiAoKHRtcCAmIE1FNDYwMF9BT19TVEFUVVNfQklUX0VGKSAmJgorCQkgICAodG1wICYgTUU0NjAwX0FPX1NUQVRVU19CSVRfSEYpICYmCisJCSAgICh0bXAgJiBNRTQ2MDBfQU9fU1RBVFVTX0JJVF9IRikpIHsKKwkJYyA9IE1FNDYwMF9BT19GSUZPX0NPVU5UIC8gMjsKKwkJUERFQlVHKCJGaWZvIHVuZGVyIGhhbGYgZnVsbC5cbiIpOworCX0gZWxzZSB7CisJCWMgPSAwOworCQlQREVCVUcoIkZpZm8gZnVsbC5cbiIpOworCX0KKworCVBERUJVRygiVHJ5IHRvIHdyaXRlIDB4JTA0WCB2YWx1ZXMuXG4iLCBjKTsKKworCWlmICgoaW5zdGFuY2UtPmZsYWdzICYgTUU0NjAwX0FPX0ZMQUdTX1NXX1dSQVBfTU9ERV9NQVNLKSA9PQorCSAgICBNRTQ2MDBfQU9fRkxBR1NfU1dfV1JBUF9NT0RFX0lORikgeworCQl3aGlsZSAoYykgeworCQkJYzEgPSBjOworCisJCQlpZiAoYzEgPiAoaW5zdGFuY2UtPmNpcmNfYnVmLmhlYWQgLSBpbnN0YW5jZS0+Y2lyY19idWYudGFpbCkpCS8qIE9ubHkgdXAgdG8gdGhlIGVuZCBvZiB0aGUgYnVmZmVyICovCisJCQkJYzEgPSAoaW5zdGFuY2UtPmNpcmNfYnVmLmhlYWQgLQorCQkJCSAgICAgIGluc3RhbmNlLT5jaXJjX2J1Zi50YWlsKTsKKworCQkJLyogV3JpdGUgdGhlIHZhbHVlcyB0byB0aGUgRklGTyAqLworCQkJZm9yIChpID0gMDsgaSA8IGMxOyBpKyssIGluc3RhbmNlLT5jaXJjX2J1Zi50YWlsKyssIGMtLSkgeworCQkJCWlmIChpbnN0YW5jZS0+YW9faWR4ICYgMHgxKQorCQkJCQlvdXRsKGluc3RhbmNlLT5jaXJjX2J1Zi4KKwkJCQkJICAgICBidWZbaW5zdGFuY2UtPmNpcmNfYnVmLnRhaWxdIDw8IDE2LAorCQkJCQkgICAgIGluc3RhbmNlLT5maWZvX3JlZyk7CisJCQkJZWxzZQorCQkJCQlvdXRsKGluc3RhbmNlLT5jaXJjX2J1Zi4KKwkJCQkJICAgICBidWZbaW5zdGFuY2UtPmNpcmNfYnVmLnRhaWxdLAorCQkJCQkgICAgIGluc3RhbmNlLT5maWZvX3JlZyk7CisJCQl9CisKKwkJCWlmIChpbnN0YW5jZS0+Y2lyY19idWYudGFpbCA+PSBpbnN0YW5jZS0+Y2lyY19idWYuaGVhZCkJLyogU3RhcnQgZnJvbSBiZWdpbm5pbmcgKi8KKwkJCQlpbnN0YW5jZS0+Y2lyY19idWYudGFpbCA9IDA7CisJCX0KKworCQlzcGluX2xvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisKKwkJdG1wID0gaW5sKGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCXRtcCB8PSBNRTQ2MDBfQU9fQ1RSTF9CSVRfUkVTRVRfSVJROworCQlvdXRsKHRtcCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJdG1wICY9IH5NRTQ2MDBfQU9fQ1RSTF9CSVRfUkVTRVRfSVJROworCQlvdXRsKHRtcCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKworCQlpZiAoIShpbmwoaW5zdGFuY2UtPnN0YXR1c19yZWcpICYgTUU0NjAwX0FPX1NUQVRVU19CSVRfRlNNKSkgeworCQkJUEVSUk9SKCJCcm9rZW4gcGlwZS5cbiIpOworCQkJaW5zdGFuY2UtPmZsYWdzIHw9IE1FNDYwMF9BT19GTEFHU19CUk9LRU5fUElQRTsKKwkJCXRtcCAmPSB+TUU0NjAwX0FPX0NUUkxfQklUX0VOQUJMRV9JUlE7CisJCQlvdXRsKHRtcCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJfQorCisJCXNwaW5fdW5sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCX0gZWxzZSBpZiAoKGluc3RhbmNlLT5mbGFncyAmIE1FNDYwMF9BT19GTEFHU19TV19XUkFQX01PREVfTUFTSykgPT0KKwkJICAgTUU0NjAwX0FPX0ZMQUdTX1NXX1dSQVBfTU9ERV9GSU4pIHsKKwkJd2hpbGUgKGMgJiYgaW5zdGFuY2UtPndyYXBfcmVtYWluaW5nKSB7CisJCQljMSA9IGM7CisKKwkJCWlmIChjMSA+IChpbnN0YW5jZS0+Y2lyY19idWYuaGVhZCAtIGluc3RhbmNlLT5jaXJjX2J1Zi50YWlsKSkJLyogT25seSB1cCB0byB0aGUgZW5kIG9mIHRoZSBidWZmZXIgKi8KKwkJCQljMSA9IChpbnN0YW5jZS0+Y2lyY19idWYuaGVhZCAtCisJCQkJICAgICAgaW5zdGFuY2UtPmNpcmNfYnVmLnRhaWwpOworCisJCQlpZiAoYzEgPiBpbnN0YW5jZS0+d3JhcF9yZW1haW5pbmcpCS8qIE9ubHkgdXAgdG8gY291bnQgb2YgdXNlciBkZWZpbmVkIG51bWJlciBvZiB2YWx1ZXMgKi8KKwkJCQljMSA9IGluc3RhbmNlLT53cmFwX3JlbWFpbmluZzsKKworCQkJLyogV3JpdGUgdGhlIHZhbHVlcyB0byB0aGUgRklGTyAqLworCQkJZm9yIChpID0gMDsgaSA8IGMxOworCQkJICAgICBpKyssIGluc3RhbmNlLT5jaXJjX2J1Zi50YWlsKyssIGMtLSwKKwkJCSAgICAgaW5zdGFuY2UtPndyYXBfcmVtYWluaW5nLS0pIHsKKwkJCQlpZiAoaW5zdGFuY2UtPmFvX2lkeCAmIDB4MSkKKwkJCQkJb3V0bChpbnN0YW5jZS0+Y2lyY19idWYuCisJCQkJCSAgICAgYnVmW2luc3RhbmNlLT5jaXJjX2J1Zi50YWlsXSA8PCAxNiwKKwkJCQkJICAgICBpbnN0YW5jZS0+Zmlmb19yZWcpOworCQkJCWVsc2UKKwkJCQkJb3V0bChpbnN0YW5jZS0+Y2lyY19idWYuCisJCQkJCSAgICAgYnVmW2luc3RhbmNlLT5jaXJjX2J1Zi50YWlsXSwKKwkJCQkJICAgICBpbnN0YW5jZS0+Zmlmb19yZWcpOworCQkJfQorCisJCQlpZiAoaW5zdGFuY2UtPmNpcmNfYnVmLnRhaWwgPj0gaW5zdGFuY2UtPmNpcmNfYnVmLmhlYWQpCS8qIFN0YXJ0IGZyb20gYmVnaW5uaW5nICovCisJCQkJaW5zdGFuY2UtPmNpcmNfYnVmLnRhaWwgPSAwOworCQl9CisKKwkJc3Bpbl9sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCisJCXRtcCA9IGlubChpbnN0YW5jZS0+Y3RybF9yZWcpOworCisJCWlmICghaW5zdGFuY2UtPndyYXBfcmVtYWluaW5nKSB7CisJCQlQREVCVUcoIkZpbml0ZSBTVyB3cmFwYXJvdW5kIGRvbmUuXG4iKTsKKwkJCXRtcCAmPSB+TUU0NjAwX0FPX0NUUkxfQklUX0VOQUJMRV9JUlE7CisJCX0KKworCQl0bXAgfD0gTUU0NjAwX0FPX0NUUkxfQklUX1JFU0VUX0lSUTsKKworCQlvdXRsKHRtcCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJdG1wICY9IH5NRTQ2MDBfQU9fQ1RSTF9CSVRfUkVTRVRfSVJROworCQlvdXRsKHRtcCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKworCQlpZiAoIShpbmwoaW5zdGFuY2UtPnN0YXR1c19yZWcpICYgTUU0NjAwX0FPX1NUQVRVU19CSVRfRlNNKSkgeworCQkJUEVSUk9SKCJCcm9rZW4gcGlwZS5cbiIpOworCQkJaW5zdGFuY2UtPmZsYWdzIHw9IE1FNDYwMF9BT19GTEFHU19CUk9LRU5fUElQRTsKKwkJCXRtcCAmPSB+TUU0NjAwX0FPX0NUUkxfQklUX0VOQUJMRV9JUlE7CisJCQlvdXRsKHRtcCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJfQorCisJCXNwaW5fdW5sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCisJfSBlbHNlIHsJCS8qIFJlZ3VsYXIgY29udGludW91cyBtb2RlICovCisKKwkJd2hpbGUgKDEpIHsKKwkJCWMxID0gbWVfY2lyY19idWZfdmFsdWVzX3RvX2VuZCgmaW5zdGFuY2UtPmNpcmNfYnVmKTsKKwkJCVBERUJVRygiVmFsdWVzIHRvIGVuZCA9ICVkLlxuIiwgYzEpOworCisJCQlpZiAoYzEgPiBjKQorCQkJCWMxID0gYzsKKworCQkJaWYgKGMxIDw9IDApIHsKKwkJCQlQREVCVUcoIldvcmsgZG9uZSBvciBidWZmZXIgZW1wdHkuXG4iKTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJaWYgKGluc3RhbmNlLT5hb19pZHggJiAweDEpIHsKKwkJCQlmb3IgKGkgPSAwOyBpIDwgYzE7IGkrKykgeworCQkJCQl2YWx1ZSA9CisJCQkJCSAgICAqKGluc3RhbmNlLT5jaXJjX2J1Zi5idWYgKworCQkJCQkgICAgICBpbnN0YW5jZS0+Y2lyY19idWYudGFpbCArCisJCQkJCSAgICAgIGkpIDw8IDE2OworCQkJCQlvdXRsKHZhbHVlLCBpbnN0YW5jZS0+Zmlmb19yZWcpOworCQkJCX0KKwkJCX0gZWxzZQorCQkJCW91dHNsKGluc3RhbmNlLT5maWZvX3JlZywKKwkJCQkgICAgICBpbnN0YW5jZS0+Y2lyY19idWYuYnVmICsKKwkJCQkgICAgICBpbnN0YW5jZS0+Y2lyY19idWYudGFpbCwgYzEpOworCisJCQlpbnN0YW5jZS0+Y2lyY19idWYudGFpbCA9CisJCQkgICAgKGluc3RhbmNlLT5jaXJjX2J1Zi50YWlsICsKKwkJCSAgICAgYzEpICYgKGluc3RhbmNlLT5jaXJjX2J1Zi5tYXNrKTsKKworCQkJUERFQlVHKCIlZCB2YWx1ZXMgd3JvdGUgdG8gcG9ydCAweCUwNFguXG4iLCBjMSwKKwkJCSAgICAgICBpbnN0YW5jZS0+Zmlmb19yZWcpOworCisJCQljIC09IGMxOworCQl9CisKKwkJc3Bpbl9sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCisJCXRtcCA9IGlubChpbnN0YW5jZS0+Y3RybF9yZWcpOworCisJCWlmICghbWVfY2lyY19idWZfdmFsdWVzKCZpbnN0YW5jZS0+Y2lyY19idWYpKSB7CisJCQlQREVCVUcKKwkJCSAgICAoIkRpc2FibGUgSW50ZXJydXB0IGJlY2F1c2Ugbm8gdmFsdWVzIGxlZnQgaW4gYnVmZmVyLlxuIik7CisJCQl0bXAgJj0gfk1FNDYwMF9BT19DVFJMX0JJVF9FTkFCTEVfSVJROworCQl9CisKKwkJdG1wIHw9IE1FNDYwMF9BT19DVFJMX0JJVF9SRVNFVF9JUlE7CisKKwkJb3V0bCh0bXAsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCXRtcCAmPSB+TUU0NjAwX0FPX0NUUkxfQklUX1JFU0VUX0lSUTsKKwkJb3V0bCh0bXAsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisKKwkJaWYgKCEoaW5sKGluc3RhbmNlLT5zdGF0dXNfcmVnKSAmIE1FNDYwMF9BT19TVEFUVVNfQklUX0ZTTSkpIHsKKwkJCVBERUJVRygiQnJva2VuIHBpcGUgaW4gbWU0NjAwX2FvX2lzci5cbiIpOworCQkJaW5zdGFuY2UtPmZsYWdzIHw9IE1FNDYwMF9BT19GTEFHU19CUk9LRU5fUElQRTsKKwkJCXRtcCAmPSB+TUU0NjAwX0FPX0NUUkxfQklUX0VOQUJMRV9JUlE7CisJCQlvdXRsKHRtcCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJfQorCisJCXNwaW5fdW5sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmaW5zdGFuY2UtPndhaXRfcXVldWUpOworCX0KKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIHZvaWQgbWU0NjAwX2FvX2Rlc3RydWN0b3Ioc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlKQoreworCW1lNDYwMF9hb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbnN0YW5jZSA9IChtZTQ2MDBfYW9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJZnJlZV9pcnEoaW5zdGFuY2UtPmlycSwgaW5zdGFuY2UpOworCWtmcmVlKGluc3RhbmNlLT5jaXJjX2J1Zi5idWYpOworCW1lX3N1YmRldmljZV9kZWluaXQoJmluc3RhbmNlLT5iYXNlKTsKKwlrZnJlZShpbnN0YW5jZSk7Cit9CisKK21lNDYwMF9hb19zdWJkZXZpY2VfdCAqbWU0NjAwX2FvX2NvbnN0cnVjdG9yKHVpbnQzMl90IHJlZ19iYXNlLAorCQkJCQkgICAgIHNwaW5sb2NrX3QgKiBwcmVsb2FkX3JlZ19sb2NrLAorCQkJCQkgICAgIHVpbnQzMl90ICogcHJlbG9hZF9mbGFncywKKwkJCQkJICAgICBpbnQgYW9faWR4LCBpbnQgZmlmbywgaW50IGlycSkKK3sKKwltZTQ2MDBfYW9fc3ViZGV2aWNlX3QgKnN1YmRldmljZTsKKwlpbnQgZXJyOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJLyogQWxsb2NhdGUgbWVtb3J5IGZvciBzdWJkZXZpY2UgaW5zdGFuY2UgKi8KKwlzdWJkZXZpY2UgPSBrbWFsbG9jKHNpemVvZihtZTQ2MDBfYW9fc3ViZGV2aWNlX3QpLCBHRlBfS0VSTkVMKTsKKworCWlmICghc3ViZGV2aWNlKSB7CisJCVBFUlJPUigiQ2Fubm90IGdldCBtZW1vcnkgZm9yIHN1YmRldmljZSBpbnN0YW5jZS5cbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwltZW1zZXQoc3ViZGV2aWNlLCAwLCBzaXplb2YobWU0NjAwX2FvX3N1YmRldmljZV90KSk7CisKKwkvKiBJbml0aWFsaXplIHN1YmRldmljZSBiYXNlIGNsYXNzICovCisJZXJyID0gbWVfc3ViZGV2aWNlX2luaXQoJnN1YmRldmljZS0+YmFzZSk7CisKKwlpZiAoZXJyKSB7CisJCVBFUlJPUigiQ2Fubm90IGluaXRpYWxpemUgc3ViZGV2aWNlIGJhc2UgY2xhc3MgaW5zdGFuY2UuXG4iKTsKKwkJa2ZyZWUoc3ViZGV2aWNlKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCS8vIEluaXRpYWxpemUgc3BpbiBsb2Nrcy4KKwlzcGluX2xvY2tfaW5pdCgmc3ViZGV2aWNlLT5zdWJkZXZpY2VfbG9jayk7CisKKwlzdWJkZXZpY2UtPnByZWxvYWRfcmVnX2xvY2sgPSBwcmVsb2FkX3JlZ19sb2NrOworCXN1YmRldmljZS0+cHJlbG9hZF9mbGFncyA9IHByZWxvYWRfZmxhZ3M7CisKKwkvKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBjaXJjdWxhciBidWZmZXIgKi8KKwlzdWJkZXZpY2UtPmNpcmNfYnVmLm1hc2sgPSBNRTQ2MDBfQU9fQ0lSQ19CVUZfQ09VTlQgLSAxOworCXN1YmRldmljZS0+Y2lyY19idWYuYnVmID0ga21hbGxvYyhNRTQ2MDBfQU9fQ0lSQ19CVUZfU0laRSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIXN1YmRldmljZS0+Y2lyY19idWYuYnVmKSB7CisJCVBFUlJPUigiQ2Fubm90IGluaXRpYWxpemUgc3ViZGV2aWNlIGJhc2UgY2xhc3MgaW5zdGFuY2UuXG4iKTsKKwkJbWVfc3ViZGV2aWNlX2RlaW5pdCgobWVfc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlKTsKKwkJa2ZyZWUoc3ViZGV2aWNlKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJbWVtc2V0KHN1YmRldmljZS0+Y2lyY19idWYuYnVmLCAwLCBNRTQ2MDBfQU9fQ0lSQ19CVUZfU0laRSk7CisKKwlzdWJkZXZpY2UtPmNpcmNfYnVmLmhlYWQgPSAwOworCXN1YmRldmljZS0+Y2lyY19idWYudGFpbCA9IDA7CisKKwkvKiBJbml0aWFsaXplIHdhaXQgcXVldWUgKi8KKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzdWJkZXZpY2UtPndhaXRfcXVldWUpOworCisJLyogSW5pdGlhbGl6ZSBzaW5nbGUgdmFsdWUgdG8gMFYgKi8KKwlzdWJkZXZpY2UtPnNpbmdsZV92YWx1ZSA9IDB4ODAwMDsKKworCS8qIFN0b3JlIGFuYWxvZyBvdXRwdXQgaW5kZXggKi8KKwlzdWJkZXZpY2UtPmFvX2lkeCA9IGFvX2lkeDsKKworCS8qIFN0b3JlIGlmIGFuYWxvZyBvdXRwdXQgaGFzIGZpZm8gKi8KKwlzdWJkZXZpY2UtPmZpZm8gPSBmaWZvOworCisJLyogSW5pdGlhbGl6ZSByZWdpc3RlcnMgKi8KKworCWlmIChhb19pZHggPT0gMCkgeworCQlzdWJkZXZpY2UtPmN0cmxfcmVnID0gcmVnX2Jhc2UgKyBNRTQ2MDBfQU9fMDBfQ1RSTF9SRUc7CisJCXN1YmRldmljZS0+c3RhdHVzX3JlZyA9IHJlZ19iYXNlICsgTUU0NjAwX0FPXzAwX1NUQVRVU19SRUc7CisJCXN1YmRldmljZS0+Zmlmb19yZWcgPSByZWdfYmFzZSArIE1FNDYwMF9BT18wMF9GSUZPX1JFRzsKKwkJc3ViZGV2aWNlLT5zaW5nbGVfcmVnID0gcmVnX2Jhc2UgKyBNRTQ2MDBfQU9fMDBfU0lOR0xFX1JFRzsKKwkJc3ViZGV2aWNlLT50aW1lcl9yZWcgPSByZWdfYmFzZSArIE1FNDYwMF9BT18wMF9USU1FUl9SRUc7CisJCXN1YmRldmljZS0+cmVnX2Jhc2UgPSByZWdfYmFzZTsKKworCQlpZiAoaW5sKHN1YmRldmljZS0+cmVnX2Jhc2UgKyBNRTQ2MDBfQU9fQk9TQ0hfUkVHKSA9PSAweDIwMDAwKSB7CisJCQlQSU5GTygiQm9zY2ggZmlybXdhcmUgaW4gdXNlIGZvciBjaGFubmVsIDAuXG4iKTsKKwkJCXN1YmRldmljZS0+Ym9zY2hfZncgPSAxOworCQl9IGVsc2UgeworCQkJc3ViZGV2aWNlLT5ib3NjaF9mdyA9IDA7CisJCX0KKwl9IGVsc2UgaWYgKGFvX2lkeCA9PSAxKSB7CisJCXN1YmRldmljZS0+Y3RybF9yZWcgPSByZWdfYmFzZSArIE1FNDYwMF9BT18wMV9DVFJMX1JFRzsKKwkJc3ViZGV2aWNlLT5zdGF0dXNfcmVnID0gcmVnX2Jhc2UgKyBNRTQ2MDBfQU9fMDFfU1RBVFVTX1JFRzsKKwkJc3ViZGV2aWNlLT5maWZvX3JlZyA9IHJlZ19iYXNlICsgTUU0NjAwX0FPXzAxX0ZJRk9fUkVHOworCQlzdWJkZXZpY2UtPnNpbmdsZV9yZWcgPSByZWdfYmFzZSArIE1FNDYwMF9BT18wMV9TSU5HTEVfUkVHOworCQlzdWJkZXZpY2UtPnRpbWVyX3JlZyA9IHJlZ19iYXNlICsgTUU0NjAwX0FPXzAxX1RJTUVSX1JFRzsKKwkJc3ViZGV2aWNlLT5yZWdfYmFzZSA9IHJlZ19iYXNlOworCQlzdWJkZXZpY2UtPmJvc2NoX2Z3ID0gMDsKKwl9IGVsc2UgaWYgKGFvX2lkeCA9PSAyKSB7CisJCXN1YmRldmljZS0+Y3RybF9yZWcgPSByZWdfYmFzZSArIE1FNDYwMF9BT18wMl9DVFJMX1JFRzsKKwkJc3ViZGV2aWNlLT5zdGF0dXNfcmVnID0gcmVnX2Jhc2UgKyBNRTQ2MDBfQU9fMDJfU1RBVFVTX1JFRzsKKwkJc3ViZGV2aWNlLT5maWZvX3JlZyA9IHJlZ19iYXNlICsgTUU0NjAwX0FPXzAyX0ZJRk9fUkVHOworCQlzdWJkZXZpY2UtPnNpbmdsZV9yZWcgPSByZWdfYmFzZSArIE1FNDYwMF9BT18wMl9TSU5HTEVfUkVHOworCQlzdWJkZXZpY2UtPnRpbWVyX3JlZyA9IHJlZ19iYXNlICsgTUU0NjAwX0FPXzAyX1RJTUVSX1JFRzsKKwkJc3ViZGV2aWNlLT5yZWdfYmFzZSA9IHJlZ19iYXNlOworCQlzdWJkZXZpY2UtPmJvc2NoX2Z3ID0gMDsKKwl9IGVsc2UgeworCQlzdWJkZXZpY2UtPmN0cmxfcmVnID0gcmVnX2Jhc2UgKyBNRTQ2MDBfQU9fMDNfQ1RSTF9SRUc7CisJCXN1YmRldmljZS0+c3RhdHVzX3JlZyA9IHJlZ19iYXNlICsgTUU0NjAwX0FPXzAzX1NUQVRVU19SRUc7CisJCXN1YmRldmljZS0+Zmlmb19yZWcgPSByZWdfYmFzZSArIE1FNDYwMF9BT18wM19GSUZPX1JFRzsKKwkJc3ViZGV2aWNlLT5zaW5nbGVfcmVnID0gcmVnX2Jhc2UgKyBNRTQ2MDBfQU9fMDNfU0lOR0xFX1JFRzsKKwkJc3ViZGV2aWNlLT50aW1lcl9yZWcgPSByZWdfYmFzZSArIE1FNDYwMF9BT18wM19USU1FUl9SRUc7CisJCXN1YmRldmljZS0+cmVnX2Jhc2UgPSByZWdfYmFzZTsKKwkJc3ViZGV2aWNlLT5ib3NjaF9mdyA9IDA7CisJfQorCisJc3ViZGV2aWNlLT5pcnFfc3RhdHVzX3JlZyA9IHJlZ19iYXNlICsgTUU0NjAwX0lSUV9TVEFUVVNfUkVHOworCXN1YmRldmljZS0+cHJlbG9hZF9yZWcgPSByZWdfYmFzZSArIE1FNDYwMF9BT19MT0FEU0VUUkVHX1hYOworCisJLyogUmVnaXN0ZXIgaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZSAqLworCXN1YmRldmljZS0+aXJxID0gaXJxOworCisJaWYgKHJlcXVlc3RfaXJxCisJICAgIChzdWJkZXZpY2UtPmlycSwgbWU0NjAwX2FvX2lzciwgU0FfSU5URVJSVVBUIHwgU0FfU0hJUlEsCisJICAgICBNRTQ2MDBfTkFNRSwgc3ViZGV2aWNlKSkgeworCQlQRVJST1IoIkNhbm5vdCBnZXQgaW50ZXJydXB0IGxpbmUuXG4iKTsKKwkJbWVfc3ViZGV2aWNlX2RlaW5pdCgobWVfc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlKTsKKwkJa2ZyZWUoc3ViZGV2aWNlLT5jaXJjX2J1Zi5idWYpOworCQlrZnJlZShzdWJkZXZpY2UpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKiBPdmVycmlkZSBiYXNlIGNsYXNzIG1ldGhvZHMuICovCisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9kZXN0cnVjdG9yID0gbWU0NjAwX2FvX2Rlc3RydWN0b3I7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19yZXNldF9zdWJkZXZpY2UgPQorCSAgICBtZTQ2MDBfYW9faW9fcmVzZXRfc3ViZGV2aWNlOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fc2luZ2xlX2NvbmZpZyA9CisJICAgIG1lNDYwMF9hb19pb19zaW5nbGVfY29uZmlnOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fc2luZ2xlX3JlYWQgPSBtZTQ2MDBfYW9faW9fc2luZ2xlX3JlYWQ7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19zaW5nbGVfd3JpdGUgPQorCSAgICBtZTQ2MDBfYW9faW9fc2luZ2xlX3dyaXRlOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fc3RyZWFtX2NvbmZpZyA9CisJICAgIG1lNDYwMF9hb19pb19zdHJlYW1fY29uZmlnOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fc3RyZWFtX25ld192YWx1ZXMgPQorCSAgICBtZTQ2MDBfYW9faW9fc3RyZWFtX25ld192YWx1ZXM7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19zdHJlYW1fd3JpdGUgPQorCSAgICBtZTQ2MDBfYW9faW9fc3RyZWFtX3dyaXRlOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fc3RyZWFtX3N0YXJ0ID0KKwkgICAgbWU0NjAwX2FvX2lvX3N0cmVhbV9zdGFydDsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3N0cmVhbV9zdGF0dXMgPQorCSAgICBtZTQ2MDBfYW9faW9fc3RyZWFtX3N0YXR1czsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3N0cmVhbV9zdG9wID0gbWU0NjAwX2FvX2lvX3N0cmVhbV9zdG9wOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfcXVlcnlfbnVtYmVyX2NoYW5uZWxzID0KKwkgICAgbWU0NjAwX2FvX3F1ZXJ5X251bWJlcl9jaGFubmVsczsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV90eXBlID0KKwkgICAgbWU0NjAwX2FvX3F1ZXJ5X3N1YmRldmljZV90eXBlOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfcXVlcnlfc3ViZGV2aWNlX2NhcHMgPQorCSAgICBtZTQ2MDBfYW9fcXVlcnlfc3ViZGV2aWNlX2NhcHM7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9zdWJkZXZpY2VfY2Fwc19hcmdzID0KKwkgICAgbWU0NjAwX2FvX3F1ZXJ5X3N1YmRldmljZV9jYXBzX2FyZ3M7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9yYW5nZV9ieV9taW5fbWF4ID0KKwkgICAgbWU0NjAwX2FvX3F1ZXJ5X3JhbmdlX2J5X21pbl9tYXg7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9udW1iZXJfcmFuZ2VzID0KKwkgICAgbWU0NjAwX2FvX3F1ZXJ5X251bWJlcl9yYW5nZXM7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9yYW5nZV9pbmZvID0KKwkgICAgbWU0NjAwX2FvX3F1ZXJ5X3JhbmdlX2luZm87CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV90aW1lciA9IG1lNDYwMF9hb19xdWVyeV90aW1lcjsKKworCXJldHVybiBzdWJkZXZpY2U7Cit9CisKKyNlbmRpZiAvLyBCT1NDSAorCisvKiBDb21tb24gZnVuY3Rpb25zCisqLworCitzdGF0aWMgaW50IG1lNDYwMF9hb19xdWVyeV9yYW5nZV9ieV9taW5fbWF4KG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQkgICAgaW50IHVuaXQsCisJCQkJCSAgICBpbnQgKm1pbiwKKwkJCQkJICAgIGludCAqbWF4LCBpbnQgKm1heGRhdGEsIGludCAqcmFuZ2UpCit7CisJbWU0NjAwX2FvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKworCWluc3RhbmNlID0gKG1lNDYwMF9hb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlQREVCVUcoImV4ZWN1dGVkLiBpZHg9JWRcbiIsIGluc3RhbmNlLT5hb19pZHgpOworCisJaWYgKCgqbWF4IC0gKm1pbikgPCAwKSB7CisJCVBFUlJPUigiSW52YWxpZCBtaW5pbXVtIGFuZCBtYXhpbXVtIHZhbHVlcyBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfTUlOX01BWDsKKwl9CisKKwlpZiAoKHVuaXQgPT0gTUVfVU5JVF9WT0xUKSB8fCAodW5pdCA9PSBNRV9VTklUX0FOWSkpIHsKKwkJaWYgKCgqbWF4IDw9IChNRTQ2MDBfQU9fTUFYX1JBTkdFICsgMTAwMCkpCisJCSAgICAmJiAoKm1pbiA+PSBNRTQ2MDBfQU9fTUlOX1JBTkdFKSkgeworCQkJKm1pbiA9IE1FNDYwMF9BT19NSU5fUkFOR0U7CisJCQkqbWF4ID0gTUU0NjAwX0FPX01BWF9SQU5HRTsKKwkJCSptYXhkYXRhID0gTUU0NjAwX0FPX01BWF9EQVRBOworCQkJKnJhbmdlID0gMDsKKwkJfSBlbHNlIHsKKwkJCVBFUlJPUigiTm8gbWF0Y2hpbmcgcmFuZ2UgYXZhaWxhYmxlLlxuIik7CisJCQlyZXR1cm4gTUVfRVJSTk9fTk9fUkFOR0U7CisJCX0KKwl9IGVsc2UgeworCQlQRVJST1IoIkludmFsaWQgcGh5c2ljYWwgdW5pdCBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfVU5JVDsKKwl9CisKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZTQ2MDBfYW9fcXVlcnlfbnVtYmVyX3JhbmdlcyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJIGludCB1bml0LCBpbnQgKmNvdW50KQoreworCW1lNDYwMF9hb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisKKwlpbnN0YW5jZSA9IChtZTQ2MDBfYW9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJUERFQlVHKCJleGVjdXRlZC4gaWR4PSVkXG4iLCBpbnN0YW5jZS0+YW9faWR4KTsKKworCWlmICgodW5pdCA9PSBNRV9VTklUX1ZPTFQpIHx8ICh1bml0ID09IE1FX1VOSVRfQU5ZKSkgeworCQkqY291bnQgPSAxOworCX0gZWxzZSB7CisJCSpjb3VudCA9IDA7CisJfQorCisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWU0NjAwX2FvX3F1ZXJ5X3JhbmdlX2luZm8obWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgICAgaW50IHJhbmdlLAorCQkJCSAgICAgIGludCAqdW5pdCwKKwkJCQkgICAgICBpbnQgKm1pbiwgaW50ICptYXgsIGludCAqbWF4ZGF0YSkKK3sKKwltZTQ2MDBfYW9fc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCisJaW5zdGFuY2UgPSAobWU0NjAwX2FvX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCVBERUJVRygiZXhlY3V0ZWQuIGlkeD0lZFxuIiwgaW5zdGFuY2UtPmFvX2lkeCk7CisKKwlpZiAocmFuZ2UgPT0gMCkgeworCQkqdW5pdCA9IE1FX1VOSVRfVk9MVDsKKwkJKm1pbiA9IE1FNDYwMF9BT19NSU5fUkFOR0U7CisJCSptYXggPSBNRTQ2MDBfQU9fTUFYX1JBTkdFOworCQkqbWF4ZGF0YSA9IE1FNDYwMF9BT19NQVhfREFUQTsKKwl9IGVsc2UgeworCQlQRVJST1IoIkludmFsaWQgcmFuZ2UgbnVtYmVyIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9SQU5HRTsKKwl9CisKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZTQ2MDBfYW9fcXVlcnlfdGltZXIobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJIGludCB0aW1lciwKKwkJCQkgaW50ICpiYXNlX2ZyZXF1ZW5jeSwKKwkJCQkgbG9uZyBsb25nICptaW5fdGlja3MsIGxvbmcgbG9uZyAqbWF4X3RpY2tzKQoreworCW1lNDYwMF9hb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisKKwlpbnN0YW5jZSA9IChtZTQ2MDBfYW9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJUERFQlVHKCJleGVjdXRlZC4gaWR4PSVkXG4iLCBpbnN0YW5jZS0+YW9faWR4KTsKKworCWlmICgodGltZXIgIT0gTUVfVElNRVJfQUNRX1NUQVJUKSAmJiAodGltZXIgIT0gTUVfVElNRVJfQ09OVl9TVEFSVCkpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIHRpbWVyIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9USU1FUjsKKwl9CisKKwlpZiAoaW5zdGFuY2UtPmZpZm8pIHsJLy9TdHJlYW1pbmcgZGV2aWNlLgorCQkqYmFzZV9mcmVxdWVuY3kgPSBNRTQ2MDBfQU9fQkFTRV9GUkVRVUVOQ1k7CisJCWlmICh0aW1lciA9PSBNRV9USU1FUl9BQ1FfU1RBUlQpIHsKKwkJCSptaW5fdGlja3MgPSBNRTQ2MDBfQU9fTUlOX0FDUV9USUNLUzsKKwkJCSptYXhfdGlja3MgPSBNRTQ2MDBfQU9fTUFYX0FDUV9USUNLUzsKKwkJfSBlbHNlIGlmICh0aW1lciA9PSBNRV9USU1FUl9DT05WX1NUQVJUKSB7CisJCQkqbWluX3RpY2tzID0gTUU0NjAwX0FPX01JTl9DSEFOX1RJQ0tTOworCQkJKm1heF90aWNrcyA9IE1FNDYwMF9BT19NQVhfQ0hBTl9USUNLUzsKKwkJfQorCX0gZWxzZSB7CQkvL05vdCBzdHJlYW1pbmcgZGV2aWNlIQorCQkqYmFzZV9mcmVxdWVuY3kgPSAwOworCQkqbWluX3RpY2tzID0gMDsKKwkJKm1heF90aWNrcyA9IDA7CisJfQorCisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWU0NjAwX2FvX3F1ZXJ5X251bWJlcl9jaGFubmVscyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJICAgaW50ICpudW1iZXIpCit7CisJbWU0NjAwX2FvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnN0YW5jZSA9IChtZTQ2MDBfYW9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJUERFQlVHKCJleGVjdXRlZC4gaWR4PSVkXG4iLCBpbnN0YW5jZS0+YW9faWR4KTsKKworCSpudW1iZXIgPSAxOworCisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWU0NjAwX2FvX3F1ZXJ5X3N1YmRldmljZV90eXBlKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQkgIGludCAqdHlwZSwgaW50ICpzdWJ0eXBlKQoreworCW1lNDYwMF9hb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisKKwlpbnN0YW5jZSA9IChtZTQ2MDBfYW9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJUERFQlVHKCJleGVjdXRlZC4gaWR4PSVkXG4iLCBpbnN0YW5jZS0+YW9faWR4KTsKKworCSp0eXBlID0gTUVfVFlQRV9BTzsKKwkqc3VidHlwZSA9IChpbnN0YW5jZS0+ZmlmbykgPyBNRV9TVUJUWVBFX1NUUkVBTUlORyA6IE1FX1NVQlRZUEVfU0lOR0xFOworCisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWU0NjAwX2FvX3F1ZXJ5X3N1YmRldmljZV9jYXBzKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLCBpbnQgKmNhcHMpCit7CisJbWU0NjAwX2FvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnN0YW5jZSA9IChtZTQ2MDBfYW9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJUERFQlVHKCJleGVjdXRlZC4gaWR4PSVkXG4iLCBpbnN0YW5jZS0+YW9faWR4KTsKKworCSpjYXBzID0KKwkgICAgTUVfQ0FQU19BT19UUklHX1NZTkNIUk9OT1VTIHwgKChpbnN0YW5jZS0+ZmlmbykgPyBNRV9DQVBTX0FPX0ZJRk8gOgorCQkJCQkgICBNRV9DQVBTX05PTkUpOworCisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWU0NjAwX2FvX3F1ZXJ5X3N1YmRldmljZV9jYXBzX2FyZ3Moc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlLAorCQkJCQkgICAgICAgaW50IGNhcCwgaW50ICphcmdzLCBpbnQgY291bnQpCit7CisJbWU0NjAwX2FvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKworCWluc3RhbmNlID0gKG1lNDYwMF9hb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlQREVCVUcoImV4ZWN1dGVkLiBpZHg9JWRcbiIsIGluc3RhbmNlLT5hb19pZHgpOworCisJaWYgKGNvdW50ICE9IDEpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGNhcGFiaWxpdHkgYXJndW1lbnQgY291bnQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfQ0FQX0FSR19DT1VOVDsKKwl9CisKKwlzd2l0Y2ggKGNhcCkgeworCWNhc2UgTUVfQ0FQX0FJX0ZJRk9fU0laRToKKwkJYXJnc1swXSA9IChpbnN0YW5jZS0+ZmlmbykgPyBNRTQ2MDBfQU9fRklGT19DT1VOVCA6IDA7CisJCWJyZWFrOworCisJY2FzZSBNRV9DQVBfQUlfQlVGRkVSX1NJWkU6CisJCWFyZ3NbMF0gPQorCQkgICAgKGluc3RhbmNlLT5jaXJjX2J1Zi5idWYpID8gTUU0NjAwX0FPX0NJUkNfQlVGX0NPVU5UIDogMDsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlQRVJST1IoIkludmFsaWQgY2FwYWJpbGl0eS5cbiIpOworCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0NBUDsKKwkJYXJnc1swXSA9IDA7CisJfQorCisJcmV0dXJuIGVycjsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTQ2MDBfYW8uaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTQ2MDBfYW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZmJjNGEyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lNDYwMF9hby5oCkBAIC0wLDAgKzEsMjYzIEBACisvKioKKyAqIEBmaWxlIG1lNDYwMF9hby5oCisgKgorICogQGJyaWVmIE1laWxoYXVzIE1FLTQwMDAgYW5hbG9nIG91dHB1dCBzdWJkZXZpY2UgY2xhc3MuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfTUU0NjAwX0FPX0hfCisjIGRlZmluZSBfTUU0NjAwX0FPX0hfCisKKyMgaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorIyBpbmNsdWRlICJtZXN1YmRldmljZS5oIgorIyBpbmNsdWRlICJtZWNpcmNfYnVmLmgiCisjIGluY2x1ZGUgIm1laW9jdGwuaCIKKworIyBpZmRlZiBfX0tFUk5FTF9fCisKKyMgIGlmZGVmIEJPU0NICisjICAgdW5kZWYgTUVfU1lOQVBTRQorIyAgIGlmbmRlZiBfQ0JVRkZfMzJiX3QKKyMgCSBkZWZpbmUgX0NCVUZGXzMyYl90CisjICAgZW5kaWYgLy9fQ0JVRkZfMzJiX3QKKyMgIGVuZGlmIC8vQk9TQ0gKKworIyAgZGVmaW5lIE1FNDYwMF9BT19NQVhfU1VCREVWSUNFUwkJNAorIyAgZGVmaW5lIE1FNDYwMF9BT19GSUZPX0NPVU5UCQkJNDA5NgorCisjICBkZWZpbmUgTUU0NjAwX0FPX0JBU0VfRlJFUVVFTkNZCQkzMzAwMDAwMExMCisKKyMgIGRlZmluZSBNRTQ2MDBfQU9fTUlOX0FDUV9USUNLUwkJMExMCisjICBkZWZpbmUgTUU0NjAwX0FPX01BWF9BQ1FfVElDS1MJCTBMTAorCisjICBkZWZpbmUgTUU0NjAwX0FPX01JTl9DSEFOX1RJQ0tTCQk2NkxMCisjICBkZWZpbmUgTUU0NjAwX0FPX01BWF9DSEFOX1RJQ0tTCQkweEZGRkZGRkZGTEwKKworIyAgZGVmaW5lIE1FNDYwMF9BT19NSU5fUkFOR0UJCQktMTAwMDAwMDAKKyMgIGRlZmluZSBNRTQ2MDBfQU9fTUFYX1JBTkdFCQkJOTk5OTY5NAorCisjICBkZWZpbmUgTUU0NjAwX0FPX01BWF9EQVRBCQkJMHhGRkZGCisKKyMgIGlmZGVmIE1FX1NZTkFQU0UKKyMgICBkZWZpbmUgTUU0NjAwX0FPX0NJUkNfQlVGX1NJWkVfT1JERVIgCQk4CS8vIDJebiBQQUdFUyA9Pj4gTWF4aW11bSB2YWx1ZSBvZiAxTUIgZm9yIFN5bmFwc2UKKyMgIGVsc2UKKyMgICBkZWZpbmUgTUU0NjAwX0FPX0NJUkNfQlVGX1NJWkVfT1JERVIgCQk1CS8vIDJebiBQQUdFUyA9Pj4gMTI4S0IKKyMgIGVuZGlmCisjICBkZWZpbmUgTUU0NjAwX0FPX0NJUkNfQlVGX1NJWkUgCQlQQUdFX1NJWkU8PE1FNDYwMF9BT19DSVJDX0JVRl9TSVpFX09SREVSCS8vIEJ1ZmZlciBzaXplIGluIGJ5dGVzLgorCisjICBpZmRlZiBfQ0JVRkZfMzJiX3QKKyMgICBkZWZpbmUgTUU0NjAwX0FPX0NJUkNfQlVGX0NPVU5UCSgoTUU0NjAwX0FPX0NJUkNfQlVGX1NJWkUpIC8gc2l6ZW9mKHVpbnQzMl90KSkJLy8gU2l6ZSBpbiB2YWx1ZXMKKyMgIGVsc2UKKyMgICBkZWZpbmUgTUU0NjAwX0FPX0NJUkNfQlVGX0NPVU5UCSgoTUU0NjAwX0FPX0NJUkNfQlVGX1NJWkUpIC8gc2l6ZW9mKHVpbnQxNl90KSkJLy8gU2l6ZSBpbiB2YWx1ZXMKKyMgIGVuZGlmCisKKyMgIGRlZmluZSBNRTQ2MDBfQU9fQ09OVElOT1VTCQkJCQkweDAKKyMgIGRlZmluZSBNRTQ2MDBfQU9fV1JBUF9NT0RFCQkJCQkweDEKKyMgIGRlZmluZSBNRTQ2MDBfQU9fSFdfTU9ERQkJCQkJCTB4MgorCisjICBkZWZpbmUgTUU0NjAwX0FPX0hXX1dSQVBfTU9ERQkJCQkoTUU0NjAwX0FPX1dSQVBfTU9ERSB8IE1FNDYwMF9BT19IV19NT0RFKQorIyAgZGVmaW5lIE1FNDYwMF9BT19TV19XUkFQX01PREUJCQkJTUU0NjAwX0FPX1dSQVBfTU9ERQorCisjICBkZWZpbmUgTUU0NjAwX0FPX0lORl9TVE9QX01PREUJCQkJMHgwCisjICBkZWZpbmUgTUU0NjAwX0FPX0FDUV9TVE9QX01PREUJCQkJMHgxCisjICBkZWZpbmUgTUU0NjAwX0FPX1NDQU5fU1RPUF9NT0RFCQkJCTB4MgorCisjICBpZmRlZiBCT1NDSAkJCS8vU1BFQ0lBTCBCVUlMRCBGT1IgQk9TQ0gKKworLyogQml0cyBmb3IgZmxhZ3MgYXR0cmlidXRlLiAqLworIyAgIGRlZmluZSBNRTQ2MDBfQU9fRkxBR1NfQlJPS0VOX1BJUEUJCQkweDEKKyMgICBkZWZpbmUgTUU0NjAwX0FPX0ZMQUdTX1NXX1dSQVBfTU9ERV8wCQkweDIKKyMgICBkZWZpbmUgTUU0NjAwX0FPX0ZMQUdTX1NXX1dSQVBfTU9ERV8xCQkweDQKKyMgICBkZWZpbmUgTUU0NjAwX0FPX0ZMQUdTX1NXX1dSQVBfTU9ERV9NQVNLCShNRTQ2MDBfQU9fRkxBR1NfU1dfV1JBUF9NT0RFXzAgfCBNRTQ2MDBfQU9fRkxBR1NfU1dfV1JBUF9NT0RFXzEpCisKKyMgICBkZWZpbmUgTUU0NjAwX0FPX0ZMQUdTX1NXX1dSQVBfTU9ERV9OT05FCTB4MAorIyAgIGRlZmluZSBNRTQ2MDBfQU9fRkxBR1NfU1dfV1JBUF9NT0RFX0lORgkJMHgyCisjICAgZGVmaW5lIE1FNDYwMF9BT19GTEFHU19TV19XUkFQX01PREVfRklOCQkweDQKKworCS8qKgorCSogQGJyaWVmIFRoZSBNRS00MDAwIGFuYWxvZyBvdXRwdXQgc3ViZGV2aWNlIGNsYXNzLgorCSovCit0eXBlZGVmIHN0cnVjdCBtZTQ2MDBfYW9fc3ViZGV2aWNlIHsKKwkvKiBJbmhlcml0YW5jZSAqLworCW1lX3N1YmRldmljZV90IGJhc2U7CQkJCS8qKjwgVGhlIHN1YmRldmljZSBiYXNlIGNsYXNzLiAqLworCisJLyogQXR0cmlidXRlcyAqLworCXNwaW5sb2NrX3Qgc3ViZGV2aWNlX2xvY2s7CQkJLyoqPCBTcGluIGxvY2sgdG8gcHJvdGVjdCB0aGUgc3ViZGV2aWNlIGZyb20gY29uY3VycmVudCBhY2Nlc3MuICovCisJc3BpbmxvY2tfdCAqcHJlbG9hZF9yZWdfbG9jazsJCS8qKjwgU3BpbiBsb2NrIHRvIHByb3RlY3QgI3ByZWxvYWRfcmVnIGZyb20gY29uY3VycmVudCBhY2Nlc3MuICovCisJdWludDMyX3QgKnByZWxvYWRfZmxhZ3M7CisKKwl1bnNpZ25lZCBpbnQgaXJxOwkJCQkJLyoqPCBUaGUgaW50ZXJydXB0IHJlcXVlc3QgbnVtYmVyIGFzc2lnbmVkIGJ5IHRoZSBQQ0kgQklPUy4gKi8KKwltZV9jaXJjX2J1Zl90IGNpcmNfYnVmOwkJCQkvKio8IENpcmN1bGFyIGJ1ZmZlciBob2xkaW5nIG1lYXN1cm1lbnQgZGF0YS4gKi8KKwl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0X3F1ZXVlOwkJLyoqPCBXYWl0IHF1ZXVlIHRvIHB1dCBvbiB0YXNrcyB3YWl0aW5nIGZvciBkYXRhIHRvIGFycml2ZS4gKi8KKworCWludCBzaW5nbGVfdmFsdWU7CQkJCQkvKio8IE1pcnJvciBvZiB0aGUgdmFsdWUgd3JpdHRlbiBpbiBzaW5nbGUgbW9kZS4gKi8KKworCWludCB2b2xhdGlsZSBmbGFnczsJCQkJCS8qKjwgRmxhZ3MgdXNlZCBmb3Igc3RvcmluZyBTVyB3cmFwYXJvdW5kIHNldHVwIGFuZCBlcnJvciBzaWduYWxsaW5nIGZyb20gSVNSLiAqLworCXVuc2lnbmVkIGludCB3cmFwX2NvdW50OwkJCS8qKjwgVGhlIHVzZXIgZGVmaW5lZCB3cmFwYXJvdW5kIGN5Y2xlIGNvdW50LiAqLworCXVuc2lnbmVkIGludCB3cmFwX3JlbWFpbmluZzsJCS8qKjwgVGhlIHdyYXBhcm91bmQgY3ljbGUgZG93biBjb3VudGVyIHVzZWQgYnkgYSBydW5uaW5nIGNvbnZlcnNpb24uICovCisJdW5zaWduZWQgaW50IGFvX2lkeDsJCQkJLyoqPCBUaGUgaW5kZXggb2YgdGhpcyBhbmFsb2cgb3V0cHV0IG9uIHRoaXMgZGV2aWNlLiAqLworCWludCBmaWZvOwkJCQkJCQkvKio8IElmIHNldCB0aGlzIGRldmljZSBoYXMgYSBGSUZPLiAqLworCisJaW50IGJvc2NoX2Z3OwkJCQkJCS8qKjwgSWYgc2V0IHRoZSBib3NjaCBmaXJtd2FyZSBpcyBpbiBQUk9NLiAqLworCisJLyogUmVnaXN0ZXJzICovCisJdWludDMyX3QgY3RybF9yZWc7CisJdWludDMyX3Qgc3RhdHVzX3JlZzsKKwl1aW50MzJfdCBmaWZvX3JlZzsKKwl1aW50MzJfdCBzaW5nbGVfcmVnOworCXVpbnQzMl90IHRpbWVyX3JlZzsKKwl1aW50MzJfdCBpcnFfc3RhdHVzX3JlZzsKKwl1aW50MzJfdCBwcmVsb2FkX3JlZzsKKwl1aW50MzJfdCByZWdfYmFzZTsKK30gbWU0NjAwX2FvX3N1YmRldmljZV90OworCisJLyoqCisJKiBAYnJpZWYgVGhlIGNvbnN0cnVjdG9yIHRvIGdlbmVyYXRlIGEgTUUtNDAwMCBhbmFsb2cgb3V0cHV0IHN1YmRldmljZSBpbnN0YW5jZSBmb3IgQk9TQ0ggcHJvamVjdC4KKwkqCisJKiBAcGFyYW0gcmVnX2Jhc2UgVGhlIHJlZ2lzdGVyIGJhc2UgYWRkcmVzcyBvZiB0aGUgZGV2aWNlIGFzIHJldHVybmVkIGJ5IHRoZSBQQ0kgQklPUy4KKwkqIEBwYXJhbSBjdHJsX3JlZ19sb2NrIFBvaW50ZXIgdG8gc3BpbiBsb2NrIHByb3RlY3RpbmcgdGhlIGNvbnRyb2wgcmVnaXN0ZXIgZnJvbSBjb25jdXJyZW50IGFjY2Vzcy4KKwkqIEBwYXJhbSBwcmVsb2FkX2ZsYWdzIFBvaW50ZXIgdG8gc3BpbiBsb2NrIHByb3RlY3RpbmcgdGhlIGhvbGQmdHJpZ2dlciByZWdpc3RlciBmcm9tIGNvbmN1cnJlbnQgYWNjZXNzLgorCSogQHBhcmFtIGFvX2lkeCBTdWJkZXZpY2UgbnVtYmVyLgorCSogQHBhcmFtIGZpZm8gRmxhZyBzZXQgaWYgc3ViZGV2aWNlIGhhcyBoYXJkd2FyZSBGSUZPLgorCSogQHBhcmFtIGlycSBJUlEgbnVtYmVyLgorCSoKKwkqIEByZXR1cm4gUG9pbnRlciB0byBuZXcgaW5zdGFuY2Ugb24gc3VjY2Vzcy5cbgorCSogTlVMTCBvbiBlcnJvci4KKwkqLworbWU0NjAwX2FvX3N1YmRldmljZV90ICptZTQ2MDBfYW9fY29uc3RydWN0b3IodWludDMyX3QgcmVnX2Jhc2UsCisJCQkJCSAgICAgc3BpbmxvY2tfdCAqIHByZWxvYWRfcmVnX2xvY2ssCisJCQkJCSAgICAgdWludDMyX3QgKiBwcmVsb2FkX2ZsYWdzLAorCQkJCQkgICAgIGludCBhb19pZHgsIGludCBmaWZvLCBpbnQgaXJxKTsKKworIyAgZWxzZQkvL35CT1NDSAorCisvL01FNDYwMF9BT19GTEFHU19CUk9LRU5fUElQRSBpcyBPQlNPTEVURSA9PiBOb3cgcHJvYmxlbXMgYXJlIHJlcG9ydGVkIGluIHN0YXR1cy4KKwordHlwZWRlZiBlbnVtIE1FNDYwMF9BT19TVEFUVVMgeworCWFvX3N0YXR1c19ub25lID0gMCwKKwlhb19zdGF0dXNfc2luZ2xlX2NvbmZpZ3VyZWQsCisJYW9fc3RhdHVzX3NpbmdsZV9ydW5fd2FpdCwKKwlhb19zdGF0dXNfc2luZ2xlX3J1biwKKwlhb19zdGF0dXNfc2luZ2xlX2VuZF93YWl0LAorCWFvX3N0YXR1c19zaW5nbGVfZW5kLAorCWFvX3N0YXR1c19zdHJlYW1fY29uZmlndXJlZCwKKwlhb19zdGF0dXNfc3RyZWFtX3J1bl93YWl0LAorCWFvX3N0YXR1c19zdHJlYW1fcnVuLAorCWFvX3N0YXR1c19zdHJlYW1fZW5kX3dhaXQsCisJYW9fc3RhdHVzX3N0cmVhbV9lbmQsCisJYW9fc3RhdHVzX3N0cmVhbV9maWZvX2Vycm9yLAorCWFvX3N0YXR1c19zdHJlYW1fYnVmZmVyX2Vycm9yLAorCWFvX3N0YXR1c19zdHJlYW1fZXJyb3IsCisJYW9fc3RhdHVzX2xhc3QKK30gTUU0NjAwX0FPX1NUQVRVUzsKKwordHlwZWRlZiBzdHJ1Y3QgbWU0NjAwX2FvX3RpbWVvdXQgeworCXVuc2lnbmVkIGxvbmcgc3RhcnRfdGltZTsKKwl1bnNpZ25lZCBsb25nIGRlbGF5OworfSBtZTQ2MDBfYW9fdGltZW91dF90OworCisJLyoqCisJKiBAYnJpZWYgVGhlIE1FLTQ2MDAgYW5hbG9nIG91dHB1dCBzdWJkZXZpY2UgY2xhc3MuCisJKi8KK3R5cGVkZWYgc3RydWN0IG1lNDYwMF9hb19zdWJkZXZpY2UgeworCS8qIEluaGVyaXRhbmNlICovCisJbWVfc3ViZGV2aWNlX3QgYmFzZTsJCQkJCQkvKio8IFRoZSBzdWJkZXZpY2UgYmFzZSBjbGFzcy4gKi8KKwl1bnNpZ25lZCBpbnQgYW9faWR4OwkJCQkJCS8qKjwgVGhlIGluZGV4IG9mIHRoaXMgYW5hbG9nIG91dHB1dCBvbiB0aGlzIGRldmljZS4gKi8KKworCS8qIEF0dHJpYnV0ZXMgKi8KKwlzcGlubG9ja190IHN1YmRldmljZV9sb2NrOwkJCQkJLyoqPCBTcGluIGxvY2sgdG8gcHJvdGVjdCB0aGUgc3ViZGV2aWNlIGZyb20gY29uY3VycmVudCBhY2Nlc3MuICovCisJc3BpbmxvY2tfdCAqcHJlbG9hZF9yZWdfbG9jazsJCQkJLyoqPCBTcGluIGxvY2sgdG8gcHJvdGVjdCBwcmVsb2FkX3JlZyBmcm9tIGNvbmN1cnJlbnQgYWNjZXNzLiAqLworCisJdWludDMyX3QgKnByZWxvYWRfZmxhZ3M7CisKKwkvKiBIYXJkd2FyZSBmZWF1dHJlcyAqLworCXVuc2lnbmVkIGludCBpcnE7CQkJCQkJCS8qKjwgVGhlIGludGVycnVwdCByZXF1ZXN0IG51bWJlciBhc3NpZ25lZCBieSB0aGUgUENJIEJJT1MuICovCisJaW50IGZpZm87CQkJCQkJCQkJLyoqPCBJZiBzZXQgdGhpcyBkZXZpY2UgaGFzIGEgRklGTy4gKi8KKwlpbnQgYml0cGF0dGVybjsJCQkJCQkJCS8qKjwgSWYgc2V0IHRoaXMgZGV2aWNlIHVzZSBiaXRwYXR0ZXJuLiAqLworCisJaW50IHNpbmdsZV92YWx1ZTsJCQkJCQkJLyoqPCBNaXJyb3Igb2YgdGhlIG91dHB1dCB2YWx1ZSBpbiBzaW5nbGUgbW9kZS4gKi8KKwlpbnQgc2luZ2xlX3ZhbHVlX2luX2ZpZm87CQkJCQkvKio8IE1pcnJvciBvZiB0aGUgdmFsdWUgd3JpdHRlbiBpbiBzaW5nbGUgbW9kZS4gKi8KKwl1aW50MzJfdCBjdHJsX3RyZzsJCQkJCQkJLyoqPCBNaXJyb3Igb2YgdGhlIHRyaWdnZXIgc2V0dGluZ3MuICovCisKKwl2b2xhdGlsZSBpbnQgbW9kZTsJCQkJCQkJLyoqPCBGbGFncyB1c2VkIGZvciBzdG9yaW5nIFNXIHdyYXBhcm91bmQgc2V0dXAqLworCWludCBzdG9wX21vZGU7CQkJCQkJCQkvKio8IFRoZSB1c2VyIGRlZmluZWQgc3RvcCBjb25kaXRpb24gZmxhZy4gKi8KKwl1bnNpZ25lZCBpbnQgc3RhcnRfbW9kZTsKKwl1bnNpZ25lZCBpbnQgc3RvcF9jb3VudDsJCQkJCS8qKjwgVGhlIHVzZXIgZGVmaW5lZCBkYXRlcyBwcmVzZW50YXRpb24gZW5kIGNvdW50LiAqLworCXVuc2lnbmVkIGludCBzdG9wX2RhdGFfY291bnQ7CQkJCS8qKjwgVGhlIHN0b3AgcHJlc2VudGF0aW9uIGNvdW50LiAqLworCXVuc2lnbmVkIGludCBkYXRhX2NvdW50OwkJCQkJLyoqPCBUaGUgcmVhbCBwcmVzZW50YXRpb24gY291bnQuICovCisJdW5zaWduZWQgaW50IHByZWxvYWRlZF9jb3VudDsJCQkJLyoqPCBUaGUgbmV4dCBkYXRhIGFkZHJlcyBpbiBidWZmZXIuIDw9IGZvciB3cmFwYXJvdW5kIG1vZGUuICovCisJaW50IGhhcmR3YXJlX3N0b3BfZGVsYXk7CQkJCQkvKio8IFRoZSB0aW1lIHRoYXQgc3RvcCBjYW4gdGFrZS4gVGhpcyBpcyBvbmx5IHRvIG5vdCBzaG93IGhhcmR3YXJlIGJ1ZyB0byB1c2VyLiAqLworCisJdm9sYXRpbGUgZW51bSBNRTQ2MDBfQU9fU1RBVFVTIHN0YXR1czsJCS8qKjwgVGhlIGN1cnJlbnQgc3RyZWFtIHN0YXR1cyBmbGFnLiAqLworCW1lNDYwMF9hb190aW1lb3V0X3QgdGltZW91dDsJCQkJLyoqPCBUaGUgdGltZW91dCBmb3Igc3RhcnQgaW4gYmxvY2tpbmcgYW5kIG5vbi1ibG9ja2luZyBtb2RlLiAqLworCisJCQkJCQkJCQkJLyogUmVnaXN0ZXJzICovLyoqPCBBbGwgcmVnaXN0ZXJzIGFyZSAzMiBiaXRzIGxvbmcuICovCisJdW5zaWduZWQgbG9uZyBjdHJsX3JlZzsKKwl1bnNpZ25lZCBsb25nIHN0YXR1c19yZWc7CisJdW5zaWduZWQgbG9uZyBmaWZvX3JlZzsKKwl1bnNpZ25lZCBsb25nIHNpbmdsZV9yZWc7CisJdW5zaWduZWQgbG9uZyB0aW1lcl9yZWc7CisJdW5zaWduZWQgbG9uZyBpcnFfc3RhdHVzX3JlZzsKKwl1bnNpZ25lZCBsb25nIHByZWxvYWRfcmVnOworCXVuc2lnbmVkIGxvbmcgcmVnX2Jhc2U7CisKKwkvKiBTb2Z0d2FyZSBidWZmZXIgKi8KKwltZV9jaXJjX2J1Zl90IGNpcmNfYnVmOwkJCQkJCS8qKjwgQ2lyY3VsYXIgYnVmZmVyIGhvbGRpbmcgbWVhc3VybWVudCBkYXRhLiAzMiBiaXQgbG9uZyAqLworCXdhaXRfcXVldWVfaGVhZF90IHdhaXRfcXVldWU7CQkJCS8qKjwgV2FpdCBxdWV1ZSB0byBwdXQgb24gdGFza3Mgd2FpdGluZyBmb3IgZGF0YSB0byBhcnJpdmUuICovCisKKwlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqbWU0NjAwX3dvcmtxdWV1ZTsKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMjApCisJc3RydWN0IHdvcmtfc3RydWN0IGFvX2NvbnRyb2xfdGFzazsKKyNlbHNlCisJc3RydWN0IGRlbGF5ZWRfd29yayBhb19jb250cm9sX3Rhc2s7CisjZW5kaWYKKworCXZvbGF0aWxlIGludCBhb19jb250cm9sX3Rhc2tfZmxhZzsJCQkvKio8IEZsYWcgY29udHJvbGluZyByZWV4ZWN1dGluZyBvZiBjb250cm9sIHRhc2sgKi8KKworfSBtZTQ2MDBfYW9fc3ViZGV2aWNlX3Q7CisKKwkvKioKKwkqIEBicmllZiBUaGUgY29uc3RydWN0b3IgdG8gZ2VuZXJhdGUgYSBNRS00NjAwIGFuYWxvZyBvdXRwdXQgc3ViZGV2aWNlIGluc3RhbmNlLgorCSoKKwkqIEBwYXJhbSByZWdfYmFzZSBUaGUgcmVnaXN0ZXIgYmFzZSBhZGRyZXNzIG9mIHRoZSBkZXZpY2UgYXMgcmV0dXJuZWQgYnkgdGhlIFBDSSBCSU9TLgorCSogQHBhcmFtIGN0cmxfcmVnX2xvY2sgUG9pbnRlciB0byBzcGluIGxvY2sgcHJvdGVjdGluZyB0aGUgY29udHJvbCByZWdpc3RlciBmcm9tIGNvbmN1cnJlbnQgYWNjZXNzLgorCSogQHBhcmFtIHByZWxvYWRfZmxhZ3MgUG9pbnRlciB0byBzcGluIGxvY2sgcHJvdGVjdGluZyB0aGUgaG9sZCZ0cmlnZ2VyIHJlZ2lzdGVyIGZyb20gY29uY3VycmVudCBhY2Nlc3MuCisJKiBAcGFyYW0gYW9faWR4IFN1YmRldmljZSBudW1iZXIuCisJKiBAcGFyYW0gZmlmbyBGbGFnIHNldCBpZiBzdWJkZXZpY2UgaGFzIGhhcmR3YXJlIEZJRk8uCisJKiBAcGFyYW0gaXJxIElSUSBudW1iZXIuCisJKiBAcGFyYW0gbWU0NjAwX3dxIFF1ZXVlIGZvciBhc3luY2hyb25vdXMgdGFzayAoMSBxdWV1ZSBmb3IgYWxsIHN1YmRldmljZSBvbiAxIGJvYXJkKS4KKwkqCisJKiBAcmV0dXJuIFBvaW50ZXIgdG8gbmV3IGluc3RhbmNlIG9uIHN1Y2Nlc3MuXG4KKwkqIE5VTEwgb24gZXJyb3IuCisJKi8KK21lNDYwMF9hb19zdWJkZXZpY2VfdCAqbWU0NjAwX2FvX2NvbnN0cnVjdG9yKHVpbnQzMl90IHJlZ19iYXNlLAorCQkJCQkgICAgIHNwaW5sb2NrX3QgKiBwcmVsb2FkX3JlZ19sb2NrLAorCQkJCQkgICAgIHVpbnQzMl90ICogcHJlbG9hZF9mbGFncywKKwkJCQkJICAgICBpbnQgYW9faWR4LAorCQkJCQkgICAgIGludCBmaWZvLAorCQkJCQkgICAgIGludCBpcnEsCisJCQkJCSAgICAgc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QKKwkJCQkJICAgICAqbWU0NjAwX3dxKTsKKworIyAgZW5kaWYgLy9CT1NDSAorIyBlbmRpZgkvL19fS0VSTkVMX18KKyNlbmRpZiAvLyB+X01FNDYwMF9BT19IXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lNDYwMF9hb19yZWcuaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTQ2MDBfYW9fcmVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjgzZDgyZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTQ2MDBfYW9fcmVnLmgKQEAgLTAsMCArMSwxMTMgQEAKKy8qKgorICogQGZpbGUgbWU0NjAwX2FvX3JlZy5oCisgKgorICogQGJyaWVmIE1FLTQwMDAgYW5hbG9nIG91dHB1dCBzdWJkZXZpY2UgcmVnaXN0ZXIgZGVmaW5pdGlvbnMuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfTUU0NjAwX0FPX1JFR19IXworI2RlZmluZSBfTUU0NjAwX0FPX1JFR19IXworCisjaWZkZWYgX19LRVJORUxfXworCisjZGVmaW5lIE1FNDYwMF9BT18wMF9DVFJMX1JFRwkJCQkJMHgwMAkvLyBSL1cKKyNkZWZpbmUgTUU0NjAwX0FPXzAwX1NUQVRVU19SRUcJCQkJCTB4MDQJLy8gUi9fCisjZGVmaW5lIE1FNDYwMF9BT18wMF9GSUZPX1JFRwkJCQkJMHgwOAkvLyBfL1cKKyNkZWZpbmUgTUU0NjAwX0FPXzAwX1NJTkdMRV9SRUcJCQkJCTB4MEMJLy8gUi9XCisjZGVmaW5lIE1FNDYwMF9BT18wMF9USU1FUl9SRUcJCQkJCTB4MTAJLy8gXy9XCisKKyNkZWZpbmUgTUU0NjAwX0FPXzAxX0NUUkxfUkVHCQkJCQkweDE4CS8vIFIvVworI2RlZmluZSBNRTQ2MDBfQU9fMDFfU1RBVFVTX1JFRwkJCQkJMHgxQwkvLyBSL18KKyNkZWZpbmUgTUU0NjAwX0FPXzAxX0ZJRk9fUkVHCQkJCQkweDIwCS8vIF8vVworI2RlZmluZSBNRTQ2MDBfQU9fMDFfU0lOR0xFX1JFRwkJCQkJMHgyNAkvLyBSL1cKKyNkZWZpbmUgTUU0NjAwX0FPXzAxX1RJTUVSX1JFRwkJCQkJMHgyOAkvLyBfL1cKKworI2RlZmluZSBNRTQ2MDBfQU9fMDJfQ1RSTF9SRUcJCQkJCTB4MzAJLy8gUi9XCisjZGVmaW5lIE1FNDYwMF9BT18wMl9TVEFUVVNfUkVHCQkJCQkweDM0CS8vIFIvXworI2RlZmluZSBNRTQ2MDBfQU9fMDJfRklGT19SRUcJCQkJCTB4MzgJLy8gXy9XCisjZGVmaW5lIE1FNDYwMF9BT18wMl9TSU5HTEVfUkVHCQkJCQkweDNDCS8vIFIvVworI2RlZmluZSBNRTQ2MDBfQU9fMDJfVElNRVJfUkVHCQkJCQkweDQwCS8vIF8vVworCisjZGVmaW5lIE1FNDYwMF9BT18wM19DVFJMX1JFRwkJCQkJMHg0OAkvLyBSL1cKKyNkZWZpbmUgTUU0NjAwX0FPXzAzX1NUQVRVU19SRUcJCQkJCTB4NEMJLy8gUi9fCisjZGVmaW5lIE1FNDYwMF9BT18wM19GSUZPX1JFRwkJCQkJMHg1MAkvLyBfL1cKKyNkZWZpbmUgTUU0NjAwX0FPXzAzX1NJTkdMRV9SRUcJCQkJCTB4NTQJLy8gUi9XCisjZGVmaW5lIE1FNDYwMF9BT18wM19USU1FUl9SRUcJCQkJCTB4NTgJLy8gXy9XCisKKyNkZWZpbmUgTUU0NjAwX0FPX0RFTVVYX0FESlVTVF9SRUcJCQkJMHhCQwkvLyAtL1cKKyNkZWZpbmUgTUU0NjAwX0FPX0RFTVVYX0FESlVTVF9WQUxVRQkJCTB4NEMKKworI2lmZGVmIEJPU0NICisjIGRlZmluZSBNRTQ2MDBfQU9fQk9TQ0hfUkVHCQkJCQkweEM0CisKKyMgZGVmaW5lIE1FNDYwMF9BT19MT0FEU0VUUkVHX1hYCQkJCTB4QjQJLy8gUi9XCisKKyMgZGVmaW5lIE1FNDYwMF9BT19DVFJMX0JJVF9NT0RFXzAJCQkJMHgwMDEKKyMgZGVmaW5lIE1FNDYwMF9BT19DVFJMX0JJVF9NT0RFXzEJCQkJMHgwMDIKKyMgZGVmaW5lIE1FNDYwMF9BT19DVFJMX01BU0tfTU9ERQkJCQkweDAwMworCisjZWxzZSAvL35CT1NDSAorCisjZGVmaW5lIE1FNDYwMF9BT19TWU5DX1JFRwkJCQkJCTB4QjQJLy8gUi9XICAgIC8vL01FNDYwMF9BT19TWU5DX1JFRyA8PT0+IE1FNDYwMF9BT19QUkVMT0FEX1JFRyA8PT0+IE1FNDYwMF9BT19MT0FEU0VUUkVHX1hYCisKKyMgZGVmaW5lIE1FNDYwMF9BT19NT0RFX1NJTkdMRQkJCQkJMHgwMDAwMDAwMAorIyBkZWZpbmUgTUU0NjAwX0FPX01PREVfV1JBUEFST1VORAkJCQkweDAwMDAwMDAxCisjIGRlZmluZSBNRTQ2MDBfQU9fTU9ERV9DT05USU5VT1VTCQkJCTB4MDAwMDAwMDIKKyMgZGVmaW5lIE1FNDYwMF9BT19DVFJMX01PREVfTUFTSwkJCQkoTUU0NjAwX0FPX01PREVfV1JBUEFST1VORCB8IE1FNDYwMF9BT19NT0RFX0NPTlRJTlVPVVMpCisjZW5kaWYgLy9CT1NDSAorCisjZGVmaW5lIE1FNDYwMF9BT19DVFJMX0JJVF9NT0RFX1dSQVBBUk9VTkQJCU1FNDYwMF9BT19NT0RFX1dSQVBBUk9VTkQKKyNkZWZpbmUgTUU0NjAwX0FPX0NUUkxfQklUX01PREVfQ09OVElOT1VTCQlNRTQ2MDBfQU9fTU9ERV9DT05USU5VT1VTCisjZGVmaW5lIE1FNDYwMF9BT19DVFJMX0JJVF9TVE9QCQkJCQkweDAwMDAwMDA0CisjZGVmaW5lIE1FNDYwMF9BT19DVFJMX0JJVF9FTkFCTEVfRklGTwkJCTB4MDAwMDAwMDgKKyNkZWZpbmUgTUU0NjAwX0FPX0NUUkxfQklUX0VOQUJMRV9FWF9UUklHCQkweDAwMDAwMDEwCisjZGVmaW5lIE1FNDYwMF9BT19DVFJMX0JJVF9FWF9UUklHX0VER0UJCQkweDAwMDAwMDIwCisjZGVmaW5lIE1FNDYwMF9BT19DVFJMX0JJVF9JTU1FRElBVEVfU1RPUAkJMHgwMDAwMDA4MAorI2RlZmluZSBNRTQ2MDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0RPCQkJMHgwMDAwMDEwMAorI2RlZmluZSBNRTQ2MDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0lSUQkJCTB4MDAwMDAyMDAKKyNkZWZpbmUgTUU0NjAwX0FPX0NUUkxfQklUX1JFU0VUX0lSUQkJCTB4MDAwMDA0MDAKKyNkZWZpbmUgTUU0NjAwX0FPX0NUUkxfQklUX0VYX1RSSUdfRURHRV9CT1RICTB4MDAwMDA4MDAKKy8qCisjZGVmaW5lIE1FNDYwMF9BT19TWU5DX0hPTERfMAkJCQkJMHgwMDAwMDAwMQorI2RlZmluZSBNRTQ2MDBfQU9fU1lOQ19IT0xEXzEJCQkJCTB4MDAwMDAwMDIKKyNkZWZpbmUgTUU0NjAwX0FPX1NZTkNfSE9MRF8yCQkJCQkweDAwMDAwMDA0CisjZGVmaW5lIE1FNDYwMF9BT19TWU5DX0hPTERfMwkJCQkJMHgwMDAwMDAwOAorKi8KKyNkZWZpbmUgTUU0NjAwX0FPX1NZTkNfSE9MRAkJCQkJCTB4MDAwMDAwMDEKKworLyoKKyNkZWZpbmUgTUU0NjAwX0FPX1NZTkNfRVhUX1RSSUdfMAkJCQkweDAwMDEwMDAwCisjZGVmaW5lIE1FNDYwMF9BT19TWU5DX0VYVF9UUklHXzEJCQkJMHgwMDAyMDAwMAorI2RlZmluZSBNRTQ2MDBfQU9fU1lOQ19FWFRfVFJJR18yCQkJCTB4MDAwNDAwMDAKKyNkZWZpbmUgTUU0NjAwX0FPX1NZTkNfRVhUX1RSSUdfMwkJCQkweDAwMDgwMDAwCisqLworI2RlZmluZSBNRTQ2MDBfQU9fU1lOQ19FWFRfVFJJRwkJCQkJMHgwMDAxMDAwMAorCisjZGVmaW5lIE1FNDYwMF9BT19FWFRfVFJJRwkJCQkJCTB4ODAwMDAwMDAKKworI2RlZmluZSBNRTQ2MDBfQU9fU1RBVFVTX0JJVF9GU00JCQkJMHgwMDAwMDAwMQorI2RlZmluZSBNRTQ2MDBfQU9fU1RBVFVTX0JJVF9GRgkJCQkJMHgwMDAwMDAwMgorI2RlZmluZSBNRTQ2MDBfQU9fU1RBVFVTX0JJVF9IRgkJCQkJMHgwMDAwMDAwNAorI2RlZmluZSBNRTQ2MDBfQU9fU1RBVFVTX0JJVF9FRgkJCQkJMHgwMDAwMDAwOAorCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lNDYwMF9kZXZpY2UuYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTQ2MDBfZGV2aWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE0NTU4NAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTQ2MDBfZGV2aWNlLmMKQEAgLTAsMCArMSwzNzMgQEAKKy8qKgorICogQGZpbGUgbWU0NjAwX2RldmljZS5jCisgKgorICogQGJyaWVmIE1FLTQ2MDAgZGV2aWNlIGNsYXNzIGltcGxlbWVudGF0aW9uLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICogQGF1dGhvciBLcnp5c3p0b2YgR2FudHprZQkoay5nYW50emtlQG1laWxoYXVzLmRlKQorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX19LRVJORUxfXworIyAgZGVmaW5lIF9fS0VSTkVMX18KKyNlbmRpZgorCisjaWZuZGVmIE1PRFVMRQorIyAgZGVmaW5lIE1PRFVMRQorI2VuZGlmCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKworI2luY2x1ZGUgIm1laWRzLmgiCisjaW5jbHVkZSAibWVlcnJvci5oIgorI2luY2x1ZGUgIm1lY29tbW9uLmgiCisjaW5jbHVkZSAibWVpbnRlcm5hbC5oIgorCisjaW5jbHVkZSAibWVkZWJ1Zy5oIgorI2luY2x1ZGUgIm1lZGV2aWNlLmgiCisjaW5jbHVkZSAibWU0NjAwX2RldmljZS5oIgorI2luY2x1ZGUgIm1lcGx4X3JlZy5oIgorCisjaW5jbHVkZSAibWVmaXJtd2FyZS5oIgorCisjaW5jbHVkZSAibWVzdWJkZXZpY2UuaCIKKyNpbmNsdWRlICJtZTQ2MDBfZG8uaCIKKyNpbmNsdWRlICJtZTQ2MDBfZGkuaCIKKyNpbmNsdWRlICJtZTQ2MDBfZGlvLmgiCisjaW5jbHVkZSAibWU4MjU0LmgiCisjaW5jbHVkZSAibWU0NjAwX2FpLmgiCisjaW5jbHVkZSAibWU0NjAwX2FvLmgiCisjaW5jbHVkZSAibWU0NjAwX2V4dF9pcnEuaCIKKworLyoqCisgKiBAYnJpZWYgR2xvYmFsIHZhcmlhYmxlLgorICogVGhpcyBpcyB3b3JraW5nIHF1ZXVlIGZvciBydW5pbmcgYSBzZXBhcmF0ZSBhdGFzayB0aGF0IHdpbGwgYmUgcmVzcG9uc2libGUgZm9yIHdvcmsgc3RhdHVzIChzdGFydCwgc3RvcCwgdGltZW91dHMpLgorICovCitzdGF0aWMgc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKm1lNDYwMF93b3JrcXVldWU7CisKKyNpZmRlZiBCT1NDSAorbWVfZGV2aWNlX3QgKm1lNDYwMF9wY2lfY29uc3RydWN0b3Ioc3RydWN0IHBjaV9kZXYgKnBjaV9kZXZpY2UsIGludCBtZV9ib3NjaF9mdykKKyNlbHNlIC8vfkJPU0NICittZV9kZXZpY2VfdCAqbWU0NjAwX3BjaV9jb25zdHJ1Y3RvcihzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldmljZSkKKyNlbmRpZgkJCQkvL0JPU0NICit7CisJbWU0NjAwX2RldmljZV90ICptZTQ2MDBfZGV2aWNlOworCW1lX3N1YmRldmljZV90ICpzdWJkZXZpY2U7CisJdW5zaWduZWQgaW50IHZlcnNpb25faWR4OworCWludCBlcnI7CisJaW50IGk7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwkvLyBBbGxvY2F0ZSBzdHJ1Y3R1cmUgZm9yIGRldmljZSBpbnN0YW5jZS4KKwltZTQ2MDBfZGV2aWNlID0ga21hbGxvYyhzaXplb2YobWU0NjAwX2RldmljZV90KSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIW1lNDYwMF9kZXZpY2UpIHsKKwkJUEVSUk9SKCJDYW5ub3QgZ2V0IG1lbW9yeSBmb3IgTUUtNDYwMCBkZXZpY2UgaW5zdGFuY2UuXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJbWVtc2V0KG1lNDYwMF9kZXZpY2UsIDAsIHNpemVvZihtZTQ2MDBfZGV2aWNlX3QpKTsKKworCS8vIEluaXRpYWxpemUgYmFzZSBjbGFzcyBzdHJ1Y3R1cmUuCisJZXJyID0gbWVfZGV2aWNlX3BjaV9pbml0KChtZV9kZXZpY2VfdCAqKSBtZTQ2MDBfZGV2aWNlLCBwY2lfZGV2aWNlKTsKKworCWlmIChlcnIpIHsKKwkJa2ZyZWUobWU0NjAwX2RldmljZSk7CisJCVBFUlJPUigiQ2Fubm90IGluaXRpYWxpemUgZGV2aWNlIGJhc2UgY2xhc3MuXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCS8vIERvd25sb2FkIHRoZSB4aWxpbnggZmlybXdhcmUuCisJaWYgKG1lNDYwMF9kZXZpY2UtPmJhc2UuaW5mby5wY2kuZGV2aWNlX2lkID09IFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjEwKSB7CS8vSmVreWxsIDw9PiBtZTQ2MTAKKwkJZXJyID0KKwkJICAgIG1lX3hpbGlueF9kb3dubG9hZChtZTQ2MDBfZGV2aWNlLT5iYXNlLmluZm8ucGNpLgorCQkJCSAgICAgICByZWdfYmFzZXNbMV0sCisJCQkJICAgICAgIG1lNDYwMF9kZXZpY2UtPmJhc2UuaW5mby5wY2kuCisJCQkJICAgICAgIHJlZ19iYXNlc1s1XSwgJnBjaV9kZXZpY2UtPmRldiwKKwkJCQkgICAgICAgIm1lNDYxMC5iaW4iKTsKKwl9IGVsc2UgewkJLy8gR2VuZXJhbCBtZTQ2MDAgZmlybXdhcmUKKyNpZmRlZiBCT1NDSAorCQllcnIgPQorCQkgICAgbWVfeGlsaW54X2Rvd25sb2FkKG1lNDYwMF9kZXZpY2UtPmJhc2UuaW5mby5wY2kuCisJCQkJICAgICAgIHJlZ19iYXNlc1sxXSwKKwkJCQkgICAgICAgbWU0NjAwX2RldmljZS0+YmFzZS5pbmZvLnBjaS4KKwkJCQkgICAgICAgcmVnX2Jhc2VzWzVdLCAmcGNpX2RldmljZS0+ZGV2LAorCQkJCSAgICAgICAobWVfYm9zY2hfZncpID8gIm1lNDYwMF9ib3NjaC5iaW4iIDoKKwkJCQkgICAgICAgIm1lNDYwMC5iaW4iKTsKKyNlbHNlIC8vfkJPU0NICisJCWVyciA9CisJCSAgICBtZV94aWxpbnhfZG93bmxvYWQobWU0NjAwX2RldmljZS0+YmFzZS5pbmZvLnBjaS4KKwkJCQkgICAgICAgcmVnX2Jhc2VzWzFdLAorCQkJCSAgICAgICBtZTQ2MDBfZGV2aWNlLT5iYXNlLmluZm8ucGNpLgorCQkJCSAgICAgICByZWdfYmFzZXNbNV0sICZwY2lfZGV2aWNlLT5kZXYsCisJCQkJICAgICAgICJtZTQ2MDAuYmluIik7CisjZW5kaWYKKwl9CisKKwlpZiAoZXJyKSB7CisJCW1lX2RldmljZV9kZWluaXQoKG1lX2RldmljZV90ICopIG1lNDYwMF9kZXZpY2UpOworCQlrZnJlZShtZTQ2MDBfZGV2aWNlKTsKKwkJUEVSUk9SKCJDYW5ub3QgZG93bmxvYWQgZmlybXdhcmUuXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCS8vIEdldCB0aGUgaW5kZXggaW4gdGhlIGRldmljZSB2ZXJzaW9uIGluZm9ybWF0aW9uIHRhYmxlLgorCXZlcnNpb25faWR4ID0KKwkgICAgbWU0NjAwX3ZlcnNpb25zX2dldF9kZXZpY2VfaW5kZXgobWU0NjAwX2RldmljZS0+YmFzZS5pbmZvLnBjaS4KKwkJCQkJICAgICBkZXZpY2VfaWQpOworCisJLy8gSW5pdGlhbGl6ZSBzcGluIGxvY2tzLgorCXNwaW5fbG9ja19pbml0KCZtZTQ2MDBfZGV2aWNlLT5wcmVsb2FkX3JlZ19sb2NrKTsKKworCW1lNDYwMF9kZXZpY2UtPnByZWxvYWRfZmxhZ3MgPSAwOworCisJc3Bpbl9sb2NrX2luaXQoJm1lNDYwMF9kZXZpY2UtPmRpb19sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmbWU0NjAwX2RldmljZS0+YWlfY3RybF9sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmbWU0NjAwX2RldmljZS0+Y3RyX2N0cmxfcmVnX2xvY2spOworCXNwaW5fbG9ja19pbml0KCZtZTQ2MDBfZGV2aWNlLT5jdHJfY2xrX3NyY19yZWdfbG9jayk7CisKKwkvLyBDcmVhdGUgZGlnaXRhbCBpbnB1dCBpbnN0YW5jZXMuCisJZm9yIChpID0gMDsgaSA8IG1lNDYwMF92ZXJzaW9uc1t2ZXJzaW9uX2lkeF0uZGlfc3ViZGV2aWNlczsgaSsrKSB7CisJCXN1YmRldmljZSA9CisJCSAgICAobWVfc3ViZGV2aWNlX3QgKikgbWU0NjAwX2RpX2NvbnN0cnVjdG9yKG1lNDYwMF9kZXZpY2UtPgorCQkJCQkJCSAgICAgYmFzZS5pbmZvLnBjaS4KKwkJCQkJCQkgICAgIHJlZ19iYXNlc1syXSwKKwkJCQkJCQkgICAgICZtZTQ2MDBfZGV2aWNlLT4KKwkJCQkJCQkgICAgIGRpb19sb2NrKTsKKworCQlpZiAoIXN1YmRldmljZSkgeworCQkJbWVfZGV2aWNlX2RlaW5pdCgobWVfZGV2aWNlX3QgKikgbWU0NjAwX2RldmljZSk7CisJCQlrZnJlZShtZTQ2MDBfZGV2aWNlKTsKKwkJCVBFUlJPUigiQ2Fubm90IGdldCBtZW1vcnkgZm9yIHN1YmRldmljZS5cbiIpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKworCQltZV9zbGlzdF9hZGRfc3ViZGV2aWNlX3RhaWwoJm1lNDYwMF9kZXZpY2UtPmJhc2Uuc2xpc3QsCisJCQkJCSAgICBzdWJkZXZpY2UpOworCX0KKworCS8vIENyZWF0ZSBkaWdpdGFsIG91dHB1dCBpbnN0YW5jZXMuCisJZm9yIChpID0gMDsgaSA8IG1lNDYwMF92ZXJzaW9uc1t2ZXJzaW9uX2lkeF0uZG9fc3ViZGV2aWNlczsgaSsrKSB7CisJCXN1YmRldmljZSA9CisJCSAgICAobWVfc3ViZGV2aWNlX3QgKikgbWU0NjAwX2RvX2NvbnN0cnVjdG9yKG1lNDYwMF9kZXZpY2UtPgorCQkJCQkJCSAgICAgYmFzZS5pbmZvLnBjaS4KKwkJCQkJCQkgICAgIHJlZ19iYXNlc1syXSwKKwkJCQkJCQkgICAgICZtZTQ2MDBfZGV2aWNlLT4KKwkJCQkJCQkgICAgIGRpb19sb2NrKTsKKworCQlpZiAoIXN1YmRldmljZSkgeworCQkJbWVfZGV2aWNlX2RlaW5pdCgobWVfZGV2aWNlX3QgKikgbWU0NjAwX2RldmljZSk7CisJCQlrZnJlZShtZTQ2MDBfZGV2aWNlKTsKKwkJCVBFUlJPUigiQ2Fubm90IGdldCBtZW1vcnkgZm9yIHN1YmRldmljZS5cbiIpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKworCQltZV9zbGlzdF9hZGRfc3ViZGV2aWNlX3RhaWwoJm1lNDYwMF9kZXZpY2UtPmJhc2Uuc2xpc3QsCisJCQkJCSAgICBzdWJkZXZpY2UpOworCX0KKworCS8vIENyZWF0ZSBkaWdpdGFsIGlucHV0L291dHB1dCBpbnN0YW5jZXMuCisJZm9yIChpID0gMDsgaSA8IG1lNDYwMF92ZXJzaW9uc1t2ZXJzaW9uX2lkeF0uZGlvX3N1YmRldmljZXM7IGkrKykgeworCQlzdWJkZXZpY2UgPQorCQkgICAgKG1lX3N1YmRldmljZV90ICopIG1lNDYwMF9kaW9fY29uc3RydWN0b3IobWU0NjAwX2RldmljZS0+CisJCQkJCQkJICAgICAgYmFzZS5pbmZvLnBjaS4KKwkJCQkJCQkgICAgICByZWdfYmFzZXNbMl0sCisJCQkJCQkJICAgICAgbWU0NjAwX3ZlcnNpb25zCisJCQkJCQkJICAgICAgW3ZlcnNpb25faWR4XS4KKwkJCQkJCQkgICAgICBkb19zdWJkZXZpY2VzICsKKwkJCQkJCQkgICAgICBtZTQ2MDBfdmVyc2lvbnMKKwkJCQkJCQkgICAgICBbdmVyc2lvbl9pZHhdLgorCQkJCQkJCSAgICAgIGRpX3N1YmRldmljZXMgKyBpLAorCQkJCQkJCSAgICAgICZtZTQ2MDBfZGV2aWNlLT4KKwkJCQkJCQkgICAgICBkaW9fbG9jayk7CisKKwkJaWYgKCFzdWJkZXZpY2UpIHsKKwkJCW1lX2RldmljZV9kZWluaXQoKG1lX2RldmljZV90ICopIG1lNDYwMF9kZXZpY2UpOworCQkJa2ZyZWUobWU0NjAwX2RldmljZSk7CisJCQlQRVJST1IoIkNhbm5vdCBnZXQgbWVtb3J5IGZvciBzdWJkZXZpY2UuXG4iKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisKKwkJbWVfc2xpc3RfYWRkX3N1YmRldmljZV90YWlsKCZtZTQ2MDBfZGV2aWNlLT5iYXNlLnNsaXN0LAorCQkJCQkgICAgc3ViZGV2aWNlKTsKKwl9CisKKwkvLyBDcmVhdGUgYW5hbG9nIGlucHV0IGluc3RhbmNlcy4KKwlmb3IgKGkgPSAwOyBpIDwgbWU0NjAwX3ZlcnNpb25zW3ZlcnNpb25faWR4XS5haV9zdWJkZXZpY2VzOyBpKyspIHsKKwkJc3ViZGV2aWNlID0KKwkJICAgIChtZV9zdWJkZXZpY2VfdCAqKSBtZTQ2MDBfYWlfY29uc3RydWN0b3IobWU0NjAwX2RldmljZS0+CisJCQkJCQkJICAgICBiYXNlLmluZm8ucGNpLgorCQkJCQkJCSAgICAgcmVnX2Jhc2VzWzJdLAorCQkJCQkJCSAgICAgbWU0NjAwX3ZlcnNpb25zCisJCQkJCQkJICAgICBbdmVyc2lvbl9pZHhdLgorCQkJCQkJCSAgICAgYWlfY2hhbm5lbHMsCisJCQkJCQkJICAgICBtZTQ2MDBfdmVyc2lvbnMKKwkJCQkJCQkgICAgIFt2ZXJzaW9uX2lkeF0uCisJCQkJCQkJICAgICBhaV9yYW5nZXMsCisJCQkJCQkJICAgICBtZTQ2MDBfdmVyc2lvbnMKKwkJCQkJCQkgICAgIFt2ZXJzaW9uX2lkeF0uCisJCQkJCQkJICAgICBhaV9pc29sYXRlZCwKKwkJCQkJCQkgICAgIG1lNDYwMF92ZXJzaW9ucworCQkJCQkJCSAgICAgW3ZlcnNpb25faWR4XS4KKwkJCQkJCQkgICAgIGFpX3NoLAorCQkJCQkJCSAgICAgbWU0NjAwX2RldmljZS0+CisJCQkJCQkJICAgICBiYXNlLmlycSwKKwkJCQkJCQkgICAgICZtZTQ2MDBfZGV2aWNlLT4KKwkJCQkJCQkgICAgIGFpX2N0cmxfbG9jaywKKwkJCQkJCQkgICAgIG1lNDYwMF93b3JrcXVldWUpOworCisJCWlmICghc3ViZGV2aWNlKSB7CisJCQltZV9kZXZpY2VfZGVpbml0KChtZV9kZXZpY2VfdCAqKSBtZTQ2MDBfZGV2aWNlKTsKKwkJCWtmcmVlKG1lNDYwMF9kZXZpY2UpOworCQkJUEVSUk9SKCJDYW5ub3QgZ2V0IG1lbW9yeSBmb3Igc3ViZGV2aWNlLlxuIik7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJCW1lX3NsaXN0X2FkZF9zdWJkZXZpY2VfdGFpbCgmbWU0NjAwX2RldmljZS0+YmFzZS5zbGlzdCwKKwkJCQkJICAgIHN1YmRldmljZSk7CisJfQorCisJLy8gQ3JlYXRlIGFuYWxvZyBvdXRwdXQgaW5zdGFuY2VzLgorCWZvciAoaSA9IDA7IGkgPCBtZTQ2MDBfdmVyc2lvbnNbdmVyc2lvbl9pZHhdLmFvX3N1YmRldmljZXM7IGkrKykgeworI2lmZGVmIEJPU0NICisJCXN1YmRldmljZSA9CisJCSAgICAobWVfc3ViZGV2aWNlX3QgKikgbWU0NjAwX2FvX2NvbnN0cnVjdG9yKG1lNDYwMF9kZXZpY2UtPgorCQkJCQkJCSAgICAgYmFzZS5pbmZvLnBjaS4KKwkJCQkJCQkgICAgIHJlZ19iYXNlc1syXSwKKwkJCQkJCQkgICAgICZtZTQ2MDBfZGV2aWNlLT4KKwkJCQkJCQkgICAgIHByZWxvYWRfcmVnX2xvY2ssCisJCQkJCQkJICAgICAmbWU0NjAwX2RldmljZS0+CisJCQkJCQkJICAgICBwcmVsb2FkX2ZsYWdzLCBpLAorCQkJCQkJCSAgICAgbWU0NjAwX3ZlcnNpb25zCisJCQkJCQkJICAgICBbdmVyc2lvbl9pZHhdLgorCQkJCQkJCSAgICAgYW9fZmlmbywKKwkJCQkJCQkgICAgIG1lNDYwMF9kZXZpY2UtPgorCQkJCQkJCSAgICAgYmFzZS5pcnEpOworI2Vsc2UgLy9+Qk9TQ0gKKwkJc3ViZGV2aWNlID0KKwkJICAgIChtZV9zdWJkZXZpY2VfdCAqKSBtZTQ2MDBfYW9fY29uc3RydWN0b3IobWU0NjAwX2RldmljZS0+CisJCQkJCQkJICAgICBiYXNlLmluZm8ucGNpLgorCQkJCQkJCSAgICAgcmVnX2Jhc2VzWzJdLAorCQkJCQkJCSAgICAgJm1lNDYwMF9kZXZpY2UtPgorCQkJCQkJCSAgICAgcHJlbG9hZF9yZWdfbG9jaywKKwkJCQkJCQkgICAgICZtZTQ2MDBfZGV2aWNlLT4KKwkJCQkJCQkgICAgIHByZWxvYWRfZmxhZ3MsIGksCisJCQkJCQkJICAgICBtZTQ2MDBfdmVyc2lvbnMKKwkJCQkJCQkgICAgIFt2ZXJzaW9uX2lkeF0uCisJCQkJCQkJICAgICBhb19maWZvLAorCQkJCQkJCSAgICAgbWU0NjAwX2RldmljZS0+CisJCQkJCQkJICAgICBiYXNlLmlycSwKKwkJCQkJCQkgICAgIG1lNDYwMF93b3JrcXVldWUpOworI2VuZGlmCisKKwkJaWYgKCFzdWJkZXZpY2UpIHsKKwkJCW1lX2RldmljZV9kZWluaXQoKG1lX2RldmljZV90ICopIG1lNDYwMF9kZXZpY2UpOworCQkJa2ZyZWUobWU0NjAwX2RldmljZSk7CisJCQlQRVJST1IoIkNhbm5vdCBnZXQgbWVtb3J5IGZvciBzdWJkZXZpY2UuXG4iKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisKKwkJbWVfc2xpc3RfYWRkX3N1YmRldmljZV90YWlsKCZtZTQ2MDBfZGV2aWNlLT5iYXNlLnNsaXN0LAorCQkJCQkgICAgc3ViZGV2aWNlKTsKKwl9CisKKwkvLyBDcmVhdGUgY291bnRlciBpbnN0YW5jZXMuCisJZm9yIChpID0gMDsgaSA8IG1lNDYwMF92ZXJzaW9uc1t2ZXJzaW9uX2lkeF0uY3RyX3N1YmRldmljZXM7IGkrKykgeworCQlzdWJkZXZpY2UgPQorCQkgICAgKG1lX3N1YmRldmljZV90ICopIG1lODI1NF9jb25zdHJ1Y3RvcihtZTQ2MDBfZGV2aWNlLT5iYXNlLgorCQkJCQkJCSAgaW5mby5wY2kuZGV2aWNlX2lkLAorCQkJCQkJCSAgbWU0NjAwX2RldmljZS0+YmFzZS4KKwkJCQkJCQkgIGluZm8ucGNpLnJlZ19iYXNlc1szXSwKKwkJCQkJCQkgIDAsIGksCisJCQkJCQkJICAmbWU0NjAwX2RldmljZS0+CisJCQkJCQkJICBjdHJfY3RybF9yZWdfbG9jaywKKwkJCQkJCQkgICZtZTQ2MDBfZGV2aWNlLT4KKwkJCQkJCQkgIGN0cl9jbGtfc3JjX3JlZ19sb2NrKTsKKworCQlpZiAoIXN1YmRldmljZSkgeworCQkJbWVfZGV2aWNlX2RlaW5pdCgobWVfZGV2aWNlX3QgKikgbWU0NjAwX2RldmljZSk7CisJCQlrZnJlZShtZTQ2MDBfZGV2aWNlKTsKKwkJCVBFUlJPUigiQ2Fubm90IGdldCBtZW1vcnkgZm9yIHN1YmRldmljZS5cbiIpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKworCQltZV9zbGlzdF9hZGRfc3ViZGV2aWNlX3RhaWwoJm1lNDYwMF9kZXZpY2UtPmJhc2Uuc2xpc3QsCisJCQkJCSAgICBzdWJkZXZpY2UpOworCX0KKworCS8vIENyZWF0ZSBleHRlcm5hbCBpbnRlcnJ1cHQgaW5zdGFuY2VzLgorCWZvciAoaSA9IDA7IGkgPCBtZTQ2MDBfdmVyc2lvbnNbdmVyc2lvbl9pZHhdLmV4dF9pcnFfc3ViZGV2aWNlczsgaSsrKSB7CisJCXN1YmRldmljZSA9CisJCSAgICAobWVfc3ViZGV2aWNlX3QgKikKKwkJICAgIG1lNDYwMF9leHRfaXJxX2NvbnN0cnVjdG9yKG1lNDYwMF9kZXZpY2UtPmJhc2UuaW5mby5wY2kuCisJCQkJCSAgICAgICByZWdfYmFzZXNbMl0sCisJCQkJCSAgICAgICBtZTQ2MDBfZGV2aWNlLT5iYXNlLmlycSwKKwkJCQkJICAgICAgICZtZTQ2MDBfZGV2aWNlLT5haV9jdHJsX2xvY2spOworCisJCWlmICghc3ViZGV2aWNlKSB7CisJCQltZV9kZXZpY2VfZGVpbml0KChtZV9kZXZpY2VfdCAqKSBtZTQ2MDBfZGV2aWNlKTsKKwkJCWtmcmVlKG1lNDYwMF9kZXZpY2UpOworCQkJUEVSUk9SKCJDYW5ub3QgZ2V0IG1lbW9yeSBmb3Igc3ViZGV2aWNlLlxuIik7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJCW1lX3NsaXN0X2FkZF9zdWJkZXZpY2VfdGFpbCgmbWU0NjAwX2RldmljZS0+YmFzZS5zbGlzdCwKKwkJCQkJICAgIHN1YmRldmljZSk7CisJfQorCisJcmV0dXJuIChtZV9kZXZpY2VfdCAqKSBtZTQ2MDBfZGV2aWNlOworfQorCisvLyBJbml0IGFuZCBleGl0IG9mIG1vZHVsZS4KKworc3RhdGljIGludCBfX2luaXQgbWU0NjAwX2luaXQodm9pZCkKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKyNpZm5kZWYgQk9TQ0gKKwltZTQ2MDBfd29ya3F1ZXVlID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoIm1lNDYwMCIpOworI2VuZGlmCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBtZTQ2MDBfZXhpdCh2b2lkKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworI2lmbmRlZiBCT1NDSAorCWZsdXNoX3dvcmtxdWV1ZShtZTQ2MDBfd29ya3F1ZXVlKTsKKwlkZXN0cm95X3dvcmtxdWV1ZShtZTQ2MDBfd29ya3F1ZXVlKTsKKyNlbmRpZgorfQorCittb2R1bGVfaW5pdChtZTQ2MDBfaW5pdCk7Cittb2R1bGVfZXhpdChtZTQ2MDBfZXhpdCk7CisKKy8vIEFkbWluaXN0cmF0aXZlIHN0dWZmIGZvciBtb2RpbmZvLgorTU9EVUxFX0FVVEhPUgorICAgICgiR3VlbnRlciBHZWJoYXJkdCA8Zy5nZWJoYXJkdEBtZWlsaGF1cy5kZT4gJiBLcnp5c3p0b2YgR2FudHprZSA8ay5nYW50emtlQG1laWxoYXVzLmRlPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJEZXZpY2UgRHJpdmVyIE1vZHVsZSBmb3IgTUUtNDZ4eCBEZXZpY2VzIik7CitNT0RVTEVfU1VQUE9SVEVEX0RFVklDRSgiTWVpbGhhdXMgTUUtNDZ4eCBEZXZpY2VzIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKy8vIEV4cG9ydCB0aGUgY29uc3RydWN0b3IuCitFWFBPUlRfU1lNQk9MKG1lNDYwMF9wY2lfY29uc3RydWN0b3IpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lNDYwMF9kZXZpY2UuaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTQ2MDBfZGV2aWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE4MTJkNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTQ2MDBfZGV2aWNlLmgKQEAgLTAsMCArMSwxNTEgQEAKKy8qKgorICogQGZpbGUgbWU0NjAwX2RldmljZS5oCisgKgorICogQGJyaWVmIE1FLTQ2MDAgZGV2aWNlIGNsYXNzLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICogQGF1dGhvciBLcnp5c3p0b2YgR2FudHprZQkoay5nYW50emtlQG1laWxoYXVzLmRlKQorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX01FNDYwMF9ERVZJQ0VfSAorI2RlZmluZSBfTUU0NjAwX0RFVklDRV9ICisKKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorCisjaW5jbHVkZSAibWVkZXZpY2UuaCIKKworI2lmZGVmIF9fS0VSTkVMX18KKworLyoqCisgKiBAYnJpZWYgU3RydWN0dXJlIGhvbGRpbmcgTUUtNDYwMCBkZXZpY2UgY2FwYWJpbGl0aWVzLgorICovCit0eXBlZGVmIHN0cnVjdCBtZTQ2MDBfdmVyc2lvbiB7CisJdWludDE2X3QgZGV2aWNlX2lkOworCXVuc2lnbmVkIGludCBkb19zdWJkZXZpY2VzOworCXVuc2lnbmVkIGludCBkaV9zdWJkZXZpY2VzOworCXVuc2lnbmVkIGludCBkaW9fc3ViZGV2aWNlczsKKwl1bnNpZ25lZCBpbnQgY3RyX3N1YmRldmljZXM7CisJdW5zaWduZWQgaW50IGFpX3N1YmRldmljZXM7CisJdW5zaWduZWQgaW50IGFpX2NoYW5uZWxzOworCXVuc2lnbmVkIGludCBhaV9yYW5nZXM7CisJdW5zaWduZWQgaW50IGFpX2lzb2xhdGVkOworCXVuc2lnbmVkIGludCBhaV9zaDsKKwl1bnNpZ25lZCBpbnQgYW9fc3ViZGV2aWNlczsKKwl1bnNpZ25lZCBpbnQgYW9fZmlmbzsJLy9Ib3cgbWFueSBkZXZpY2VzIGhhdmUgRklGTworCXVuc2lnbmVkIGludCBleHRfaXJxX3N1YmRldmljZXM7Cit9IG1lNDYwMF92ZXJzaW9uX3Q7CisKKy8qKgorICogQGJyaWVmIE1FLTQ2MDAgZGV2aWNlIGNhcGFiaWxpdGllcy4KKyAqLworc3RhdGljIG1lNDYwMF92ZXJzaW9uX3QgbWU0NjAwX3ZlcnNpb25zW10gPSB7CisJe1BDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjEwLCAwLCAwLCA0LCAzLCAxLCAxNiwgMSwgMCwgMCwgMCwgMCwgMX0sCisKKwl7UENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2NTAsIDAsIDAsIDQsIDAsIDEsIDE2LCA0LCAwLCAwLCAwLCAwLCAxfSwKKworCXtQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDY2MCwgMCwgMCwgNCwgMywgMSwgMTYsIDQsIDAsIDAsIDIsIDAsIDF9LAorCXtQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDY2MEksIDEsIDEsIDIsIDMsIDEsIDE2LCA0LCAxLCAwLCAyLCAwLCAxfSwKKwl7UENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2NjBTLCAwLCAwLCA0LCAzLCAxLCAxNiwgNCwgMCwgMSwgMiwgMCwgMX0sCisJe1BDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjYwSVMsIDEsIDEsIDIsIDMsIDEsIDE2LCA0LCAxLCAxLCAyLCAwLCAxfSwKKworCXtQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDY3MCwgMCwgMCwgNCwgMywgMSwgMzIsIDQsIDAsIDAsIDQsIDAsIDF9LAorCXtQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDY3MEksIDEsIDEsIDIsIDMsIDEsIDMyLCA0LCAxLCAwLCA0LCAwLCAxfSwKKwl7UENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2NzBTLCAwLCAwLCA0LCAzLCAxLCAzMiwgNCwgMCwgMSwgNCwgMCwgMX0sCisJe1BDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjcwSVMsIDEsIDEsIDIsIDMsIDEsIDMyLCA0LCAxLCAxLCA0LCAwLCAxfSwKKworCXtQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDY4MCwgMCwgMCwgNCwgMywgMSwgMzIsIDQsIDAsIDAsIDQsIDQsIDF9LAorCXtQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDY4MEksIDEsIDEsIDIsIDMsIDEsIDMyLCA0LCAxLCAwLCA0LCA0LCAxfSwKKwl7UENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2ODBTLCAwLCAwLCA0LCAzLCAxLCAzMiwgNCwgMCwgMSwgNCwgNCwgMX0sCisJe1BDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjgwSVMsIDEsIDEsIDIsIDMsIDEsIDMyLCA0LCAxLCAxLCA0LCA0LCAxfSwKKworCXswfSwKK307CisKKyNkZWZpbmUgTUU0NjAwX0RFVklDRV9WRVJTSU9OUyAoc2l6ZW9mKG1lNDYwMF92ZXJzaW9ucykgLyBzaXplb2YobWU0NjAwX3ZlcnNpb25fdCkgLSAxKQkvKio8IFJldHVybnMgdGhlIG51bWJlciBvZiBlbnRyaWVzIGluICNtZTQ2MDBfdmVyc2lvbnMuICovCisKKy8qKgorICogQGJyaWVmIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBkZXZpY2UgZW50cnkgaW4gI21lNDYwMF92ZXJzaW9ucy4KKyAqCisgKiBAcGFyYW0gZGV2aWNlX2lkIFRoZSBQQ0kgZGV2aWNlIGlkIG9mIHRoZSBkZXZpY2UgdG8gcXVlcnkuCisgKiBAcmV0dXJuIFRoZSBpbmRleCBvZiB0aGUgZGV2aWNlIGluICNtZTQ2MDBfdmVyc2lvbnMuCisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IG1lNDYwMF92ZXJzaW9uc19nZXRfZGV2aWNlX2luZGV4KHVpbnQxNl90IGRldmljZV9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgTUU0NjAwX0RFVklDRV9WRVJTSU9OUzsgaSsrKQorCQlpZiAobWU0NjAwX3ZlcnNpb25zW2ldLmRldmljZV9pZCA9PSBkZXZpY2VfaWQpCisJCQlicmVhazsKKwlyZXR1cm4gaTsKK30KKworLyoqCisgKiBAYnJpZWYgVGhlIE1FLTQ2MDAgZGV2aWNlIGNsYXNzIHN0cnVjdHVyZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgbWU0NjAwX2RldmljZSB7CisJbWVfZGV2aWNlX3QgYmFzZTsJCQkJCS8qKjwgVGhlIE1laWxoYXVzIGRldmljZSBiYXNlIGNsYXNzLiAqLworCisJLyogQ2hpbGQgY2xhc3MgYXR0cmlidXRlcy4gKi8KKwlzcGlubG9ja190IHByZWxvYWRfcmVnX2xvY2s7CQkvKio8IEd1YXJkcyB0aGUgcHJlbG9hZCByZWdpc3RlciBvZiB0aGUgYW5hb2xvZyBvdXRwdXQgZGV2aWNlcy4gKi8KKwl1bnNpZ25lZCBpbnQgcHJlbG9hZF9mbGFnczsJCQkvKio8IFVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCAjcHJlbG9hZF9yZWdfbG9jay4gKi8KKwlzcGlubG9ja190IGRpb19sb2NrOwkJCQkvKio8IExvY2tzIHRoZSBjb250cm9sIHJlZ2lzdGVyIG9mIHRoZSBkaWdpdGFsIGlucHV0L291dHB1dCBzdWJkZXZpY2VzLiAqLworCXNwaW5sb2NrX3QgYWlfY3RybF9sb2NrOwkJCS8qKjwgTG9ja3MgdGhlIGNvbnRyb2wgcmVnaXN0ZXIgb2YgdGhlIGFuYWxvZyBpbnB1dCBzdWJkZXZpY2UuICovCisJc3BpbmxvY2tfdCBjdHJfY3RybF9yZWdfbG9jazsJCS8qKjwgTG9ja3MgdGhlIGNvdW50ZXIgY29udHJvbCByZWdpc3Rlci4gKi8KKwlzcGlubG9ja190IGN0cl9jbGtfc3JjX3JlZ19sb2NrOwkvKio8IE5vdCB1c2VkIG9uIHRoaXMgZGV2aWNlIGJ1dCBuZWVkZWQgZm9yIHRoZSBtZTgyNTQgc3ViZGV2aWNlIGNvbnN0cnVjdG9yIGNhbGwuICovCit9IG1lNDYwMF9kZXZpY2VfdDsKKworLyoqCisgKiBAYnJpZWYgVGhlIE1FLTQ2MDAgZGV2aWNlIGNsYXNzIGNvbnN0cnVjdG9yLgorICoKKyAqIEBwYXJhbSBwY2lfZGV2aWNlIFRoZSBwY2kgZGV2aWNlIHN0cnVjdHVyZSBnaXZlbiBieSB0aGUgUENJIHN1YnN5c3RlbS4KKyAqIEBwYXJhbSBtZV9ib3NjaF9mdyBJZiBzZXQgdGhlIGRldmljZSBzaGFsbCB1c2UgdGhlIGJvc2NoIGZpcm13YXJlLiAoT25seSBmb3Igc3BlY2lhbCBCT1NDSCBidWlsZCkKKyAqCisgKiBAcmV0dXJuIE9uIHN1Y2NlcyBhIG5ldyBNRS00NjAwIGRldmljZSBpbnN0YW5jZS4gXG4KKyAqICAgICAgICAgTlVMTCBvbiBlcnJvci4KKyAqLworCisjaWZkZWYgQk9TQ0gKKy8qKgorICogQGJyaWVmIFRoZSBNRS00NjAwIGRldmljZSBjbGFzcyBjb25zdHJ1Y3Rvci4KKyAqCisgKiBAcGFyYW0gcGNpX2RldmljZSBUaGUgcGNpIGRldmljZSBzdHJ1Y3R1cmUgZ2l2ZW4gYnkgdGhlIFBDSSBzdWJzeXN0ZW0uCisgKiBAcGFyYW0gbWVfYm9zY2hfZncgSWYgc2V0IHRoZSBkZXZpY2Ugc2hhbGwgdXNlIHRoZSBib3NjaCBmaXJtd2FyZS4KKyAqCisgKiBAcmV0dXJuIE9uIHN1Y2NlcyBhIG5ldyBNRS00NjAwIGRldmljZSBpbnN0YW5jZS4gXG4KKyAqICAgICAgICAgTlVMTCBvbiBlcnJvci4KKyAqLworbWVfZGV2aWNlX3QgKm1lNDYwMF9wY2lfY29uc3RydWN0b3Ioc3RydWN0IHBjaV9kZXYgKnBjaV9kZXZpY2UsIGludCBtZV9ib3NjaF9mdykKKyAgICBfX2F0dHJpYnV0ZV9fICgod2VhaykpOworI2Vsc2UgLy9+Qk9TQ0gKKy8qKgorICogQGJyaWVmIFRoZSBNRS00NjAwIGRldmljZSBjbGFzcyBjb25zdHJ1Y3Rvci4KKyAqCisgKiBAcGFyYW0gcGNpX2RldmljZSBUaGUgcGNpIGRldmljZSBzdHJ1Y3R1cmUgZ2l2ZW4gYnkgdGhlIFBDSSBzdWJzeXN0ZW0uCisgKgorICogQHJldHVybiBPbiBzdWNjZXMgYSBuZXcgTUUtNDYwMCBkZXZpY2UgaW5zdGFuY2UuIFxuCisgKiAgICAgICAgIE5VTEwgb24gZXJyb3IuCisgKi8KK21lX2RldmljZV90ICptZTQ2MDBfcGNpX2NvbnN0cnVjdG9yKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2aWNlKQorICAgIF9fYXR0cmlidXRlX18gKCh3ZWFrKSk7CisjZW5kaWYKKworI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTQ2MDBfZGkuYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTQ2MDBfZGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTNjOWY0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lNDYwMF9kaS5jCkBAIC0wLDAgKzEsMjU2IEBACisvKioKKyAqIEBmaWxlIG1lNDYwMF9kaS5jCisgKgorICogQGJyaWVmIE1FLTQwMDAgZGlnaXRhbCBpbnB1dCBzdWJkZXZpY2UgaW5zdGFuY2UuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKiBAYXV0aG9yIEtyenlzenRvZiBHYW50emtlCShrLmdhbnR6a2VAbWVpbGhhdXMuZGUpCisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0tFUk5FTF9fCisjICBkZWZpbmUgX19LRVJORUxfXworI2VuZGlmCisKKy8qCisgKiBJbmNsdWRlcworICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjaW5jbHVkZSAibWVkZWZpbmVzLmgiCisjaW5jbHVkZSAibWVpbnRlcm5hbC5oIgorI2luY2x1ZGUgIm1lZXJyb3IuaCIKKworI2luY2x1ZGUgIm1lZGVidWcuaCIKKyNpbmNsdWRlICJtZTQ2MDBfZGlvX3JlZy5oIgorI2luY2x1ZGUgIm1lNDYwMF9kaS5oIgorCisvKgorICogRGVmaW5lcworICovCisKKy8qCisgKiBGdW5jdGlvbnMKKyAqLworCitzdGF0aWMgaW50IG1lNDYwMF9kaV9pb19yZXNldF9zdWJkZXZpY2Uoc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlLAorCQkJCQlzdHJ1Y3QgZmlsZSAqZmlsZXAsIGludCBmbGFncykKK3sKKwltZTQ2MDBfZGlfc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCXVpbnQzMl90IG1vZGU7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbnN0YW5jZSA9IChtZTQ2MDBfZGlfc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJaWYgKGZsYWdzKSB7CisJCVBFUlJPUigiSW52YWxpZCBmbGFnIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlzcGluX2xvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisJc3Bpbl9sb2NrKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrKTsKKwltb2RlID0gaW5sKGluc3RhbmNlLT5jdHJsX3JlZyk7CisJbW9kZSAmPSB+KE1FNDYwMF9ESU9fQ1RSTF9CSVRfTU9ERV8yIHwgTUU0NjAwX0RJT19DVFJMX0JJVF9NT0RFXzMpOwkvLzB4RkZGMworCW91dGwobW9kZSwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgbW9kZSk7CisJc3Bpbl91bmxvY2soaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2spOworCisJb3V0bCgwLCBpbnN0YW5jZS0+cG9ydF9yZWcpOworCVBERUJVR19SRUcoInBvcnRfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPnBvcnRfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCAwKTsKKwlzcGluX3VubG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWU0NjAwX2RpX2lvX3NpbmdsZV9jb25maWcobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICAgIGludCBjaGFubmVsLAorCQkJCSAgICAgIGludCBzaW5nbGVfY29uZmlnLAorCQkJCSAgICAgIGludCByZWYsCisJCQkJICAgICAgaW50IHRyaWdfY2hhbiwKKwkJCQkgICAgICBpbnQgdHJpZ190eXBlLCBpbnQgdHJpZ19lZGdlLCBpbnQgZmxhZ3MpCit7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJbWU0NjAwX2RpX3N1YmRldmljZV90ICppbnN0YW5jZTsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lNDYwMF9kaV9zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlzd2l0Y2ggKGZsYWdzKSB7CisJY2FzZSBNRV9JT19TSU5HTEVfQ09ORklHX05PX0ZMQUdTOgorCWNhc2UgTUVfSU9fU0lOR0xFX0NPTkZJR19ESU9fQllURToKKwkJaWYgKGNoYW5uZWwgPT0gMCkgeworCQkJaWYgKHNpbmdsZV9jb25maWcgPT0gTUVfU0lOR0xFX0NPTkZJR19ESU9fSU5QVVQpIHsKKwkJCX0gZWxzZSB7CisJCQkJUEVSUk9SKCJJbnZhbGlkIHBvcnQgZGlyZWN0aW9uIHNwZWNpZmllZC5cbiIpOworCQkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfU0lOR0xFX0NPTkZJRzsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCVBFUlJPUigiSW52YWxpZCBjaGFubmVsIG51bWJlci5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWdzIHNwZWNpZmllZC5cbiIpOworCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZTQ2MDBfZGlfaW9fc2luZ2xlX3JlYWQobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgaW50IGNoYW5uZWwsCisJCQkJICAgIGludCAqdmFsdWUsIGludCB0aW1lX291dCwgaW50IGZsYWdzKQoreworCW1lNDYwMF9kaV9zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbnN0YW5jZSA9IChtZTQ2MDBfZGlfc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJc3dpdGNoIChmbGFncykgeworCWNhc2UgTUVfSU9fU0lOR0xFX1RZUEVfRElPX0JJVDoKKwkJaWYgKChjaGFubmVsID49IDApICYmIChjaGFubmVsIDwgOCkpIHsKKwkJCSp2YWx1ZSA9IGlubChpbnN0YW5jZS0+cG9ydF9yZWcpICYgKDB4MSA8PCBjaGFubmVsKTsKKwkJfSBlbHNlIHsKKwkJCVBFUlJPUigiSW52YWxpZCBiaXQgbnVtYmVyIHNwZWNpZmllZC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCQl9CisJCWJyZWFrOworCisJY2FzZSBNRV9JT19TSU5HTEVfTk9fRkxBR1M6CisJY2FzZSBNRV9JT19TSU5HTEVfVFlQRV9ESU9fQllURToKKwkJaWYgKGNoYW5uZWwgPT0gMCkgeworCQkJKnZhbHVlID0gaW5sKGluc3RhbmNlLT5wb3J0X3JlZykgJiAweEZGOworCQl9IGVsc2UgeworCQkJUEVSUk9SKCJJbnZhbGlkIGJ5dGUgbnVtYmVyIHNwZWNpZmllZC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWdzIHNwZWNpZmllZC5cbiIpOworCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZTQ2MDBfZGlfcXVlcnlfbnVtYmVyX2NoYW5uZWxzKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQkgICBpbnQgKm51bWJlcikKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJKm51bWJlciA9IDg7CisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWU0NjAwX2RpX3F1ZXJ5X3N1YmRldmljZV90eXBlKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQkgIGludCAqdHlwZSwgaW50ICpzdWJ0eXBlKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwkqdHlwZSA9IE1FX1RZUEVfREk7CisJKnN1YnR5cGUgPSBNRV9TVUJUWVBFX1NJTkdMRTsKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZTQ2MDBfZGlfcXVlcnlfc3ViZGV2aWNlX2NhcHMobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsIGludCAqY2FwcykKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJKmNhcHMgPSAwOworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCittZTQ2MDBfZGlfc3ViZGV2aWNlX3QgKm1lNDYwMF9kaV9jb25zdHJ1Y3Rvcih1aW50MzJfdCByZWdfYmFzZSwKKwkJCQkJICAgICBzcGlubG9ja190ICogY3RybF9yZWdfbG9jaykKK3sKKwltZTQ2MDBfZGlfc3ViZGV2aWNlX3QgKnN1YmRldmljZTsKKwlpbnQgZXJyOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJLyogQWxsb2NhdGUgbWVtb3J5IGZvciBzdWJkZXZpY2UgaW5zdGFuY2UgKi8KKwlzdWJkZXZpY2UgPSBrbWFsbG9jKHNpemVvZihtZTQ2MDBfZGlfc3ViZGV2aWNlX3QpLCBHRlBfS0VSTkVMKTsKKworCWlmICghc3ViZGV2aWNlKSB7CisJCVBFUlJPUigiQ2Fubm90IGdldCBtZW1vcnkgZm9yIHN1YmRldmljZSBpbnN0YW5jZS5cbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwltZW1zZXQoc3ViZGV2aWNlLCAwLCBzaXplb2YobWU0NjAwX2RpX3N1YmRldmljZV90KSk7CisKKwkvKiBJbml0aWFsaXplIHN1YmRldmljZSBiYXNlIGNsYXNzICovCisJZXJyID0gbWVfc3ViZGV2aWNlX2luaXQoJnN1YmRldmljZS0+YmFzZSk7CisKKwlpZiAoZXJyKSB7CisJCVBFUlJPUigiQ2Fubm90IGluaXRpYWxpemUgc3ViZGV2aWNlIGJhc2UgY2xhc3MgaW5zdGFuY2UuXG4iKTsKKwkJa2ZyZWUoc3ViZGV2aWNlKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCS8vIEluaXRpYWxpemUgc3BpbiBsb2Nrcy4KKwlzcGluX2xvY2tfaW5pdCgmc3ViZGV2aWNlLT5zdWJkZXZpY2VfbG9jayk7CisKKwlzdWJkZXZpY2UtPmN0cmxfcmVnX2xvY2sgPSBjdHJsX3JlZ19sb2NrOworCisJLyogU2F2ZSB0aGUgc3ViZGV2aWNlIGluZGV4ICovCisJc3ViZGV2aWNlLT5wb3J0X3JlZyA9IHJlZ19iYXNlICsgTUU0NjAwX0RJT19QT1JUXzFfUkVHOworCXN1YmRldmljZS0+Y3RybF9yZWcgPSByZWdfYmFzZSArIE1FNDYwMF9ESU9fQ1RSTF9SRUc7CisjaWZkZWYgTUVERUJVR19ERUJVR19SRUcKKwlzdWJkZXZpY2UtPnJlZ19iYXNlID0gcmVnX2Jhc2U7CisjZW5kaWYKKworCS8qIE92ZXJsb2FkIGJhc2UgY2xhc3MgbWV0aG9kcy4gKi8KKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3Jlc2V0X3N1YmRldmljZSA9CisJICAgIG1lNDYwMF9kaV9pb19yZXNldF9zdWJkZXZpY2U7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19zaW5nbGVfY29uZmlnID0KKwkgICAgbWU0NjAwX2RpX2lvX3NpbmdsZV9jb25maWc7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19zaW5nbGVfcmVhZCA9IG1lNDYwMF9kaV9pb19zaW5nbGVfcmVhZDsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X251bWJlcl9jaGFubmVscyA9CisJICAgIG1lNDYwMF9kaV9xdWVyeV9udW1iZXJfY2hhbm5lbHM7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9zdWJkZXZpY2VfdHlwZSA9CisJICAgIG1lNDYwMF9kaV9xdWVyeV9zdWJkZXZpY2VfdHlwZTsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV9jYXBzID0KKwkgICAgbWU0NjAwX2RpX3F1ZXJ5X3N1YmRldmljZV9jYXBzOworCisJcmV0dXJuIHN1YmRldmljZTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTQ2MDBfZGkuaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTQ2MDBfZGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzhiMTc1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lNDYwMF9kaS5oCkBAIC0wLDAgKzEsNjQgQEAKKy8qKgorICogQGZpbGUgbWU0NjAwX2RpLmgKKyAqCisgKiBAYnJpZWYgTUUtNDAwMCBkaWdpdGFsIGlucHV0IHN1YmRldmljZSBjbGFzcy4KKyAqIEBub3RlIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKiBAYXV0aG9yIEd1ZW50ZXIgR2ViaGFyZHQKKyAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9NRTQ2MDBfRElfSF8KKyNkZWZpbmUgX01FNDYwMF9ESV9IXworCisjaW5jbHVkZSAibWVzdWJkZXZpY2UuaCIKKworI2lmZGVmIF9fS0VSTkVMX18KKworLyoqCisgKiBAYnJpZWYgVGhlIHRlbXBsYXRlIHN1YmRldmljZSBjbGFzcy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgbWU0NjAwX2RpX3N1YmRldmljZSB7CisJLyogSW5oZXJpdGFuY2UgKi8KKwltZV9zdWJkZXZpY2VfdCBiYXNlOwkJCS8qKjwgVGhlIHN1YmRldmljZSBiYXNlIGNsYXNzLiAqLworCisJLyogQXR0cmlidXRlcyAqLworCXNwaW5sb2NrX3Qgc3ViZGV2aWNlX2xvY2s7CQkvKio8IFNwaW4gbG9jayB0byBwcm90ZWN0IHRoZSBzdWJkZXZpY2UgZnJvbSBjb25jdXJyZW50IGFjY2Vzcy4gKi8KKwlzcGlubG9ja190ICpjdHJsX3JlZ19sb2NrOwkJLyoqPCBTcGluIGxvY2sgdG8gcHJvdGVjdCAjY3RybF9yZWcgZnJvbSBjb25jdXJyZW50IGFjY2Vzcy4gKi8KKworCXVuc2lnbmVkIGxvbmcgcG9ydF9yZWc7CQkJLyoqPCBSZWdpc3RlciBob2xkaW5nIHRoZSBwb3J0IHN0YXR1cy4gKi8KKwl1bnNpZ25lZCBsb25nIGN0cmxfcmVnOwkJCS8qKjwgUmVnaXN0ZXIgdG8gY29uZmlndXJlIHRoZSBwb3J0IGRpcmVjdGlvbi4gKi8KKyNpZmRlZiBNRURFQlVHX0RFQlVHX1JFRworCXVuc2lnbmVkIGxvbmcgcmVnX2Jhc2U7CisjZW5kaWYKK30gbWU0NjAwX2RpX3N1YmRldmljZV90OworCisvKioKKyAqIEBicmllZiBUaGUgY29uc3RydWN0b3IgdG8gZ2VuZXJhdGUgYSBNRS00MDAwIGRpZ2l0YWwgaW5wdXQgc3ViZGV2aWNlIGluc3RhbmNlLgorICoKKyAqIEBwYXJhbSByZWdfYmFzZSBUaGUgcmVnaXN0ZXIgYmFzZSBhZGRyZXNzIG9mIHRoZSBkZXZpY2UgYXMgcmV0dXJuZWQgYnkgdGhlIFBDSSBCSU9TLgorICoKKyAqIEByZXR1cm4gUG9pbnRlciB0byBuZXcgaW5zdGFuY2Ugb24gc3VjY2Vzcy5cbgorICogTlVMTCBvbiBlcnJvci4KKyAqLworbWU0NjAwX2RpX3N1YmRldmljZV90ICptZTQ2MDBfZGlfY29uc3RydWN0b3IodWludDMyX3QgcmVnX2Jhc2UsCisJCQkJCSAgICAgc3BpbmxvY2tfdCAqIGN0cmxfcmVnX2xvY2spOworCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lNDYwMF9kaW8uYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTQ2MDBfZGlvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGFmOTVkMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTQ2MDBfZGlvLmMKQEAgLTAsMCArMSw1MTAgQEAKKy8qKgorICogQGZpbGUgbWU0NjAwX2Rpby5jCisgKgorICogQGJyaWVmIE1FLTQwMDAgZGlnaXRhbCBpbnB1dC9vdXRwdXQgc3ViZGV2aWNlIGluc3RhbmNlLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICogQGF1dGhvciBLcnp5c3p0b2YgR2FudHprZQkoay5nYW50emtlQG1laWxoYXVzLmRlKQorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX19LRVJORUxfXworIyAgZGVmaW5lIF9fS0VSTkVMX18KKyNlbmRpZgorCisvKgorICogSW5jbHVkZXMKKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2luY2x1ZGUgIm1lZGVmaW5lcy5oIgorI2luY2x1ZGUgIm1laW50ZXJuYWwuaCIKKyNpbmNsdWRlICJtZWVycm9yLmgiCisKKyNpbmNsdWRlICJtZWRlYnVnLmgiCisjaW5jbHVkZSAibWU0NjAwX2Rpb19yZWcuaCIKKyNpbmNsdWRlICJtZTQ2MDBfZGlvLmgiCisKKy8qCisgKiBEZWZpbmVzCisgKi8KKworLyoKKyAqIEZ1bmN0aW9ucworICovCisKK3N0YXRpYyBpbnQgbWU0NjAwX2Rpb19pb19yZXNldF9zdWJkZXZpY2Uoc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlLAorCQkJCQkgc3RydWN0IGZpbGUgKmZpbGVwLCBpbnQgZmxhZ3MpCit7CisJbWU0NjAwX2Rpb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJdWludDMyX3QgbW9kZTsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lNDYwMF9kaW9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJaWYgKGZsYWdzKSB7CisJCVBFUlJPUigiSW52YWxpZCBmbGFnIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwkvKiBTZXQgcG9ydCB0byBpbnB1dCBtb2RlICovCisJc3Bpbl9sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCXNwaW5fbG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisJbW9kZSA9IGlubChpbnN0YW5jZS0+Y3RybF9yZWcpOworCW1vZGUgJj0KKwkgICAgfigoTUU0NjAwX0RJT19DVFJMX0JJVF9NT0RFXzAgfCBNRTQ2MDBfRElPX0NUUkxfQklUX01PREVfMSkgPDwKKwkgICAgICAoaW5zdGFuY2UtPmRpb19pZHggKiAyKSk7CisJb3V0bChtb2RlLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCBtb2RlKTsKKwlzcGluX3VubG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisKKwlvdXRsKDAsIGluc3RhbmNlLT5wb3J0X3JlZyk7CisJUERFQlVHX1JFRygicG9ydF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+cG9ydF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIDApOworCXNwaW5fdW5sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZTQ2MDBfZGlvX2lvX3NpbmdsZV9jb25maWcobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgICAgaW50IGNoYW5uZWwsCisJCQkJICAgICAgIGludCBzaW5nbGVfY29uZmlnLAorCQkJCSAgICAgICBpbnQgcmVmLAorCQkJCSAgICAgICBpbnQgdHJpZ19jaGFuLAorCQkJCSAgICAgICBpbnQgdHJpZ190eXBlLCBpbnQgdHJpZ19lZGdlLCBpbnQgZmxhZ3MpCit7CisJbWU0NjAwX2Rpb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJdWludDMyX3QgbW9kZTsKKwl1aW50MzJfdCBzaXplID0KKwkgICAgZmxhZ3MgJiAoTUVfSU9fU0lOR0xFX0NPTkZJR19ESU9fQklUIHwgTUVfSU9fU0lOR0xFX0NPTkZJR19ESU9fQllURQorCQkgICAgIHwgTUVfSU9fU0lOR0xFX0NPTkZJR19ESU9fV09SRCB8CisJCSAgICAgTUVfSU9fU0lOR0xFX0NPTkZJR19ESU9fRFdPUkQpOworCXVpbnQzMl90IG1hc2s7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbnN0YW5jZSA9IChtZTQ2MDBfZGlvX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCU1FX1NVQkRFVklDRV9FTlRFUiBzcGluX2xvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisJc3Bpbl9sb2NrKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrKTsKKwltb2RlID0gaW5sKGluc3RhbmNlLT5jdHJsX3JlZyk7CisJc3dpdGNoIChzaXplKSB7CisJY2FzZSBNRV9JT19TSU5HTEVfQ09ORklHX05PX0ZMQUdTOgorCWNhc2UgTUVfSU9fU0lOR0xFX0NPTkZJR19ESU9fQllURToKKwkJaWYgKGNoYW5uZWwgPT0gMCkgeworCQkJaWYgKHNpbmdsZV9jb25maWcgPT0gTUVfU0lOR0xFX0NPTkZJR19ESU9fSU5QVVQpIHsKKwkJCQltb2RlICY9CisJCQkJICAgIH4oKE1FNDYwMF9ESU9fQ1RSTF9CSVRfTU9ERV8wIHwKKwkJCQkgICAgICAgTUU0NjAwX0RJT19DVFJMX0JJVF9NT0RFXzEpIDw8CisJCQkJICAgICAgKGluc3RhbmNlLT5kaW9faWR4ICogMikpOworCQkJfSBlbHNlIGlmIChzaW5nbGVfY29uZmlnID09IE1FX1NJTkdMRV9DT05GSUdfRElPX09VVFBVVCkgeworCQkJCW1vZGUgJj0KKwkJCQkgICAgfigoTUU0NjAwX0RJT19DVFJMX0JJVF9NT0RFXzAgfAorCQkJCSAgICAgICBNRTQ2MDBfRElPX0NUUkxfQklUX01PREVfMSkgPDwKKwkJCQkgICAgICAoaW5zdGFuY2UtPmRpb19pZHggKiAyKSk7CisJCQkJbW9kZSB8PQorCQkJCSAgICBNRTQ2MDBfRElPX0NUUkxfQklUX01PREVfMCA8PCAoaW5zdGFuY2UtPgorCQkJCQkJCQkgICBkaW9faWR4ICogMik7CisJCQl9IGVsc2UgaWYgKHNpbmdsZV9jb25maWcgPT0gTUVfU0lOR0xFX0NPTkZJR19ESU9fTVVYMzJNKSB7CisJCQkJbWFzayA9CisJCQkJICAgIChNRTQ2MDBfRElPX0NUUkxfQklUX01PREVfMCB8CisJCQkJICAgICBNRTQ2MDBfRElPX0NUUkxfQklUX01PREVfMSkgPDwgKGluc3RhbmNlLT4KKwkJCQkJCQkJICAgICBkaW9faWR4ICoKKwkJCQkJCQkJICAgICAyKTsKKwkJCQltYXNrIHw9CisJCQkJICAgIE1FNDYwMF9ESU9fQ1RSTF9CSVRfRlVOQ1RJT05fMCB8CisJCQkJICAgIE1FNDYwMF9ESU9fQ1RSTF9CSVRfRlVOQ1RJT05fMTsKKwkJCQltYXNrIHw9CisJCQkJICAgIE1FNDYwMF9ESU9fQ1RSTF9CSVRfRklGT19ISUdIXzAgPDwKKwkJCQkgICAgaW5zdGFuY2UtPmRpb19pZHg7CisJCQkJbW9kZSAmPSB+bWFzazsKKworCQkJCWlmIChyZWYgPT0gTUVfUkVGX0RJT19GSUZPX0xPVykgeworCQkJCQltb2RlIHw9CisJCQkJCSAgICAoTUU0NjAwX0RJT19DVFJMX0JJVF9NT0RFXzAgfAorCQkJCQkgICAgIE1FNDYwMF9ESU9fQ1RSTF9CSVRfTU9ERV8xKSA8PAorCQkJCQkgICAgKGluc3RhbmNlLT5kaW9faWR4ICogMik7CisJCQkJCW1vZGUgfD0gTUU0NjAwX0RJT19DVFJMX0JJVF9GVU5DVElPTl8xOworCQkJCX0gZWxzZSBpZiAocmVmID09IE1FX1JFRl9ESU9fRklGT19ISUdIKSB7CisJCQkJCW1vZGUgfD0KKwkJCQkJICAgIChNRTQ2MDBfRElPX0NUUkxfQklUX01PREVfMCB8CisJCQkJCSAgICAgTUU0NjAwX0RJT19DVFJMX0JJVF9NT0RFXzEpIDw8CisJCQkJCSAgICAoaW5zdGFuY2UtPmRpb19pZHggKiAyKTsKKwkJCQkJbW9kZSB8PSBNRTQ2MDBfRElPX0NUUkxfQklUX0ZVTkNUSU9OXzE7CisJCQkJCW1vZGUgfD0KKwkJCQkJICAgIE1FNDYwMF9ESU9fQ1RSTF9CSVRfRklGT19ISUdIXzAgPDwKKwkJCQkJICAgIGluc3RhbmNlLT5kaW9faWR4OworCQkJCX0gZWxzZSB7CisJCQkJCVBFUlJPUgorCQkJCQkgICAgKCJJbnZhbGlkIHBvcnQgcmVmZXJlbmNlIHNwZWNpZmllZC5cbiIpOworCQkJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX1NJTkdMRV9DT05GSUc7CisJCQkJfQorCQkJfSBlbHNlIGlmIChzaW5nbGVfY29uZmlnID09CisJCQkJICAgTUVfU0lOR0xFX0NPTkZJR19ESU9fREVNVVgzMikgeworCQkJCW1hc2sgPQorCQkJCSAgICAoTUU0NjAwX0RJT19DVFJMX0JJVF9NT0RFXzAgfAorCQkJCSAgICAgTUU0NjAwX0RJT19DVFJMX0JJVF9NT0RFXzEpIDw8IChpbnN0YW5jZS0+CisJCQkJCQkJCSAgICAgZGlvX2lkeCAqCisJCQkJCQkJCSAgICAgMik7CisJCQkJbWFzayB8PQorCQkJCSAgICBNRTQ2MDBfRElPX0NUUkxfQklUX0ZVTkNUSU9OXzAgfAorCQkJCSAgICBNRTQ2MDBfRElPX0NUUkxfQklUX0ZVTkNUSU9OXzE7CisJCQkJbWFzayB8PQorCQkJCSAgICBNRTQ2MDBfRElPX0NUUkxfQklUX0ZJRk9fSElHSF8wIDw8CisJCQkJICAgIGluc3RhbmNlLT5kaW9faWR4OworCQkJCW1vZGUgJj0gfm1hc2s7CisKKwkJCQlpZiAocmVmID09IE1FX1JFRl9ESU9fRklGT19MT1cpIHsKKwkJCQkJbW9kZSB8PQorCQkJCQkgICAgKE1FNDYwMF9ESU9fQ1RSTF9CSVRfTU9ERV8wIHwKKwkJCQkJICAgICBNRTQ2MDBfRElPX0NUUkxfQklUX01PREVfMSkgPDwKKwkJCQkJICAgIChpbnN0YW5jZS0+ZGlvX2lkeCAqIDIpOworCQkJCQltb2RlIHw9IE1FNDYwMF9ESU9fQ1RSTF9CSVRfRlVOQ1RJT05fMDsKKwkJCQl9IGVsc2UgaWYgKHJlZiA9PSBNRV9SRUZfRElPX0ZJRk9fSElHSCkgeworCQkJCQltb2RlIHw9CisJCQkJCSAgICAoTUU0NjAwX0RJT19DVFJMX0JJVF9NT0RFXzAgfAorCQkJCQkgICAgIE1FNDYwMF9ESU9fQ1RSTF9CSVRfTU9ERV8xKSA8PAorCQkJCQkgICAgKGluc3RhbmNlLT5kaW9faWR4ICogMik7CisJCQkJCW1vZGUgfD0gTUU0NjAwX0RJT19DVFJMX0JJVF9GVU5DVElPTl8wOworCQkJCQltb2RlIHw9CisJCQkJCSAgICBNRTQ2MDBfRElPX0NUUkxfQklUX0ZJRk9fSElHSF8wIDw8CisJCQkJCSAgICBpbnN0YW5jZS0+ZGlvX2lkeDsKKwkJCQl9IGVsc2UgeworCQkJCQlQRVJST1IKKwkJCQkJICAgICgiSW52YWxpZCBwb3J0IHJlZmVyZW5jZSBzcGVjaWZpZWQuXG4iKTsKKwkJCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9TSU5HTEVfQ09ORklHOworCQkJCX0KKwkJCX0gZWxzZSBpZiAoc2luZ2xlX2NvbmZpZyA9PQorCQkJCSAgIE1FX1NJTkdMRV9DT05GSUdfRElPX0JJVF9QQVRURVJOKSB7CisJCQkJbWFzayA9CisJCQkJICAgIChNRTQ2MDBfRElPX0NUUkxfQklUX01PREVfMCB8CisJCQkJICAgICBNRTQ2MDBfRElPX0NUUkxfQklUX01PREVfMSkgPDwgKGluc3RhbmNlLT4KKwkJCQkJCQkJICAgICBkaW9faWR4ICoKKwkJCQkJCQkJICAgICAyKTsKKwkJCQltYXNrIHw9CisJCQkJICAgIE1FNDYwMF9ESU9fQ1RSTF9CSVRfRlVOQ1RJT05fMCB8CisJCQkJICAgIE1FNDYwMF9ESU9fQ1RSTF9CSVRfRlVOQ1RJT05fMTsKKwkJCQltYXNrIHw9CisJCQkJICAgIE1FNDYwMF9ESU9fQ1RSTF9CSVRfRklGT19ISUdIXzAgPDwKKwkJCQkgICAgaW5zdGFuY2UtPmRpb19pZHg7CisJCQkJbW9kZSAmPSB+bWFzazsKKworCQkJCWlmIChyZWYgPT0gTUVfUkVGX0RJT19GSUZPX0xPVykgeworCQkJCQltb2RlIHw9CisJCQkJCSAgICAoTUU0NjAwX0RJT19DVFJMX0JJVF9NT0RFXzAgfAorCQkJCQkgICAgIE1FNDYwMF9ESU9fQ1RSTF9CSVRfTU9ERV8xKSA8PAorCQkJCQkgICAgKGluc3RhbmNlLT5kaW9faWR4ICogMik7CisJCQkJfSBlbHNlIGlmIChyZWYgPT0gTUVfUkVGX0RJT19GSUZPX0hJR0gpIHsKKwkJCQkJbW9kZSB8PQorCQkJCQkgICAgKE1FNDYwMF9ESU9fQ1RSTF9CSVRfTU9ERV8wIHwKKwkJCQkJICAgICBNRTQ2MDBfRElPX0NUUkxfQklUX01PREVfMSkgPDwKKwkJCQkJICAgIChpbnN0YW5jZS0+ZGlvX2lkeCAqIDIpOworCQkJCQltb2RlIHw9CisJCQkJCSAgICBNRTQ2MDBfRElPX0NUUkxfQklUX0ZJRk9fSElHSF8wIDw8CisJCQkJCSAgICBpbnN0YW5jZS0+ZGlvX2lkeDsKKwkJCQl9IGVsc2UgeworCQkJCQlQRVJST1IKKwkJCQkJICAgICgiSW52YWxpZCBwb3J0IHJlZmVyZW5jZSBzcGVjaWZpZWQuXG4iKTsKKwkJCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9TSU5HTEVfQ09ORklHOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJUEVSUk9SCisJCQkJICAgICgiSW52YWxpZCBwb3J0IGNvbmZpZ3VyYXRpb24gc3BlY2lmaWVkLlxuIik7CisJCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9TSU5HTEVfQ09ORklHOworCQkJfQorCQl9IGVsc2UgeworCQkJUEVSUk9SKCJJbnZhbGlkIGNoYW5uZWwgbnVtYmVyLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJCX0KKworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCVBFUlJPUigiSW52YWxpZCBmbGFncy5cbiIpOworCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCWlmICghZXJyKSB7CisJCW91dGwobW9kZSwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgbW9kZSk7CisJfQorCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrKTsKKwlzcGluX3VubG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZTQ2MDBfZGlvX2lvX3NpbmdsZV9yZWFkKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICAgaW50IGNoYW5uZWwsCisJCQkJICAgICBpbnQgKnZhbHVlLCBpbnQgdGltZV9vdXQsIGludCBmbGFncykKK3sKKwltZTQ2MDBfZGlvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwl1aW50MzJfdCBtb2RlOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJaW5zdGFuY2UgPSAobWU0NjAwX2Rpb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlzcGluX2xvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisJc3Bpbl9sb2NrKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrKTsKKwlzd2l0Y2ggKGZsYWdzKSB7CisJY2FzZSBNRV9JT19TSU5HTEVfVFlQRV9ESU9fQklUOgorCQlpZiAoKGNoYW5uZWwgPj0gMCkgJiYgKGNoYW5uZWwgPCA4KSkgeworCQkJbW9kZSA9CisJCQkgICAgaW5sKGluc3RhbmNlLT4KKwkJCQljdHJsX3JlZykgJiAoKE1FNDYwMF9ESU9fQ1RSTF9CSVRfTU9ERV8wIHwKKwkJCQkJICAgICAgTUU0NjAwX0RJT19DVFJMX0JJVF9NT0RFXzEpIDw8CisJCQkJCSAgICAgKGluc3RhbmNlLT5kaW9faWR4ICogMikpOworCQkJaWYgKChtb2RlID09CisJCQkgICAgIChNRTQ2MDBfRElPX0NUUkxfQklUX01PREVfMCA8PAorCQkJICAgICAgKGluc3RhbmNlLT5kaW9faWR4ICogMikpKSB8fCAhbW9kZSkgeworCQkJCSp2YWx1ZSA9CisJCQkJICAgIGlubChpbnN0YW5jZS0+cG9ydF9yZWcpICYgKDB4MSA8PCBjaGFubmVsKTsKKwkJCX0gZWxzZSB7CisJCQkJUEVSUk9SKCJQb3J0IG5vdCBpbiBvdXRwdXQgb3IgaW5wdXQgbW9kZS5cbiIpOworCQkJCWVyciA9IE1FX0VSUk5PX1BSRVZJT1VTX0NPTkZJRzsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCVBFUlJPUigiSW52YWxpZCBiaXQgbnVtYmVyIHNwZWNpZmllZC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCQl9CisJCWJyZWFrOworCisJY2FzZSBNRV9JT19TSU5HTEVfTk9fRkxBR1M6CisJY2FzZSBNRV9JT19TSU5HTEVfVFlQRV9ESU9fQllURToKKwkJaWYgKGNoYW5uZWwgPT0gMCkgeworCQkJbW9kZSA9CisJCQkgICAgaW5sKGluc3RhbmNlLT4KKwkJCQljdHJsX3JlZykgJiAoKE1FNDYwMF9ESU9fQ1RSTF9CSVRfTU9ERV8wIHwKKwkJCQkJICAgICAgTUU0NjAwX0RJT19DVFJMX0JJVF9NT0RFXzEpIDw8CisJCQkJCSAgICAgKGluc3RhbmNlLT5kaW9faWR4ICogMikpOworCQkJaWYgKChtb2RlID09CisJCQkgICAgIChNRTQ2MDBfRElPX0NUUkxfQklUX01PREVfMCA8PAorCQkJICAgICAgKGluc3RhbmNlLT5kaW9faWR4ICogMikpKSB8fCAhbW9kZSkgeworCQkJCSp2YWx1ZSA9IGlubChpbnN0YW5jZS0+cG9ydF9yZWcpICYgMHhGRjsKKwkJCX0gZWxzZSB7CisJCQkJUEVSUk9SKCJQb3J0IG5vdCBpbiBvdXRwdXQgb3IgaW5wdXQgbW9kZS5cbiIpOworCQkJCWVyciA9IE1FX0VSUk5PX1BSRVZJT1VTX0NPTkZJRzsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCVBFUlJPUigiSW52YWxpZCBieXRlIG51bWJlciBzcGVjaWZpZWQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCVBFUlJPUigiSW52YWxpZCBmbGFncyBzcGVjaWZpZWQuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisJc3Bpbl91bmxvY2soaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2spOworCXNwaW5fdW5sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lNDYwMF9kaW9faW9fc2luZ2xlX3dyaXRlKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgICBpbnQgY2hhbm5lbCwKKwkJCQkgICAgICBpbnQgdmFsdWUsIGludCB0aW1lX291dCwgaW50IGZsYWdzKQoreworCW1lNDYwMF9kaW9fc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCXVpbnQzMl90IG1vZGU7CisJdWludDMyX3QgYnl0ZTsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lNDYwMF9kaW9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJc3Bpbl9sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCXNwaW5fbG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisJc3dpdGNoIChmbGFncykgeworCWNhc2UgTUVfSU9fU0lOR0xFX1RZUEVfRElPX0JJVDoKKwkJaWYgKChjaGFubmVsID49IDApICYmIChjaGFubmVsIDwgOCkpIHsKKwkJCW1vZGUgPQorCQkJICAgIGlubChpbnN0YW5jZS0+CisJCQkJY3RybF9yZWcpICYgKChNRTQ2MDBfRElPX0NUUkxfQklUX01PREVfMCB8CisJCQkJCSAgICAgIE1FNDYwMF9ESU9fQ1RSTF9CSVRfTU9ERV8xKSA8PAorCQkJCQkgICAgIChpbnN0YW5jZS0+ZGlvX2lkeCAqIDIpKTsKKworCQkJaWYgKG1vZGUgPT0KKwkJCSAgICAoTUU0NjAwX0RJT19DVFJMX0JJVF9NT0RFXzAgPDwKKwkJCSAgICAgKGluc3RhbmNlLT5kaW9faWR4ICogMikpKSB7CisJCQkJYnl0ZSA9IGlubChpbnN0YW5jZS0+cG9ydF9yZWcpICYgMHhGRjsKKworCQkJCWlmICh2YWx1ZSkKKwkJCQkJYnl0ZSB8PSAweDEgPDwgY2hhbm5lbDsKKwkJCQllbHNlCisJCQkJCWJ5dGUgJj0gfigweDEgPDwgY2hhbm5lbCk7CisKKwkJCQlvdXRsKGJ5dGUsIGluc3RhbmNlLT5wb3J0X3JlZyk7CisJCQl9IGVsc2UgeworCQkJCVBFUlJPUigiUG9ydCBub3QgaW4gb3V0cHV0IG9yIGlucHV0IG1vZGUuXG4iKTsKKwkJCQllcnIgPSBNRV9FUlJOT19QUkVWSU9VU19DT05GSUc7CisJCQl9CisJCX0gZWxzZSB7CisJCQlQRVJST1IoIkludmFsaWQgYml0IG51bWJlciBzcGVjaWZpZWQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwkJfQorCQlicmVhazsKKworCWNhc2UgTUVfSU9fU0lOR0xFX05PX0ZMQUdTOgorCWNhc2UgTUVfSU9fU0lOR0xFX1RZUEVfRElPX0JZVEU6CisJCWlmIChjaGFubmVsID09IDApIHsKKwkJCW1vZGUgPQorCQkJICAgIGlubChpbnN0YW5jZS0+CisJCQkJY3RybF9yZWcpICYgKChNRTQ2MDBfRElPX0NUUkxfQklUX01PREVfMCB8CisJCQkJCSAgICAgIE1FNDYwMF9ESU9fQ1RSTF9CSVRfTU9ERV8xKSA8PAorCQkJCQkgICAgIChpbnN0YW5jZS0+ZGlvX2lkeCAqIDIpKTsKKworCQkJaWYgKG1vZGUgPT0KKwkJCSAgICAoTUU0NjAwX0RJT19DVFJMX0JJVF9NT0RFXzAgPDwKKwkJCSAgICAgKGluc3RhbmNlLT5kaW9faWR4ICogMikpKSB7CisJCQkJb3V0bCh2YWx1ZSwgaW5zdGFuY2UtPnBvcnRfcmVnKTsKKwkJCX0gZWxzZSB7CisJCQkJUEVSUk9SKCJQb3J0IG5vdCBpbiBvdXRwdXQgb3IgaW5wdXQgbW9kZS5cbiIpOworCQkJCWVyciA9IE1FX0VSUk5PX1BSRVZJT1VTX0NPTkZJRzsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCVBFUlJPUigiSW52YWxpZCBieXRlIG51bWJlciBzcGVjaWZpZWQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCVBFUlJPUigiSW52YWxpZCBmbGFncyBzcGVjaWZpZWQuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisJc3Bpbl91bmxvY2soaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2spOworCXNwaW5fdW5sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lNDYwMF9kaW9fcXVlcnlfbnVtYmVyX2NoYW5uZWxzKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQkgICAgaW50ICpudW1iZXIpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCSpudW1iZXIgPSA4OworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lNDYwMF9kaW9fcXVlcnlfc3ViZGV2aWNlX3R5cGUobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJCSAgIGludCAqdHlwZSwgaW50ICpzdWJ0eXBlKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwkqdHlwZSA9IE1FX1RZUEVfRElPOworCSpzdWJ0eXBlID0gTUVfU1VCVFlQRV9TSU5HTEU7CisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWU0NjAwX2Rpb19xdWVyeV9zdWJkZXZpY2VfY2FwcyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJICAgaW50ICpjYXBzKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwkqY2FwcyA9IE1FX0NBUFNfRElPX0RJUl9CWVRFOworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCittZTQ2MDBfZGlvX3N1YmRldmljZV90ICptZTQ2MDBfZGlvX2NvbnN0cnVjdG9yKHVpbnQzMl90IHJlZ19iYXNlLAorCQkJCQkgICAgICAgdW5zaWduZWQgaW50IGRpb19pZHgsCisJCQkJCSAgICAgICBzcGlubG9ja190ICogY3RybF9yZWdfbG9jaykKK3sKKwltZTQ2MDBfZGlvX3N1YmRldmljZV90ICpzdWJkZXZpY2U7CisJaW50IGVycjsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCS8qIEFsbG9jYXRlIG1lbW9yeSBmb3Igc3ViZGV2aWNlIGluc3RhbmNlICovCisJc3ViZGV2aWNlID0ga21hbGxvYyhzaXplb2YobWU0NjAwX2Rpb19zdWJkZXZpY2VfdCksIEdGUF9LRVJORUwpOworCisJaWYgKCFzdWJkZXZpY2UpIHsKKwkJUEVSUk9SKCJDYW5ub3QgZ2V0IG1lbW9yeSBmb3Igc3ViZGV2aWNlIGluc3RhbmNlLlxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCW1lbXNldChzdWJkZXZpY2UsIDAsIHNpemVvZihtZTQ2MDBfZGlvX3N1YmRldmljZV90KSk7CisKKwkvKiBJbml0aWFsaXplIHN1YmRldmljZSBiYXNlIGNsYXNzICovCisJZXJyID0gbWVfc3ViZGV2aWNlX2luaXQoJnN1YmRldmljZS0+YmFzZSk7CisKKwlpZiAoZXJyKSB7CisJCVBFUlJPUigiQ2Fubm90IGluaXRpYWxpemUgc3ViZGV2aWNlIGJhc2UgY2xhc3MgaW5zdGFuY2UuXG4iKTsKKwkJa2ZyZWUoc3ViZGV2aWNlKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCS8vIEluaXRpYWxpemUgc3BpbiBsb2Nrcy4KKwlzcGluX2xvY2tfaW5pdCgmc3ViZGV2aWNlLT5zdWJkZXZpY2VfbG9jayk7CisJc3ViZGV2aWNlLT5jdHJsX3JlZ19sb2NrID0gY3RybF9yZWdfbG9jazsKKworCS8qIFNhdmUgZGlnaXRhbCBpL28gaW5kZXggKi8KKwlzdWJkZXZpY2UtPmRpb19pZHggPSBkaW9faWR4OworCisJLyogU2F2ZSB0aGUgc3ViZGV2aWNlIGluZGV4ICovCisJc3ViZGV2aWNlLT5jdHJsX3JlZyA9IHJlZ19iYXNlICsgTUU0NjAwX0RJT19DVFJMX1JFRzsKKwlzdWJkZXZpY2UtPnBvcnRfcmVnID0gcmVnX2Jhc2UgKyBNRTQ2MDBfRElPX1BPUlRfUkVHICsgKGRpb19pZHggKiA0KTsKKyNpZmRlZiBNRURFQlVHX0RFQlVHX1JFRworCXN1YmRldmljZS0+cmVnX2Jhc2UgPSByZWdfYmFzZTsKKyNlbmRpZgorCisJLyogT3ZlcmxvYWQgYmFzZSBjbGFzcyBtZXRob2RzLiAqLworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fcmVzZXRfc3ViZGV2aWNlID0KKwkgICAgbWU0NjAwX2Rpb19pb19yZXNldF9zdWJkZXZpY2U7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19zaW5nbGVfY29uZmlnID0KKwkgICAgbWU0NjAwX2Rpb19pb19zaW5nbGVfY29uZmlnOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fc2luZ2xlX3JlYWQgPSBtZTQ2MDBfZGlvX2lvX3NpbmdsZV9yZWFkOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fc2luZ2xlX3dyaXRlID0KKwkgICAgbWU0NjAwX2Rpb19pb19zaW5nbGVfd3JpdGU7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9udW1iZXJfY2hhbm5lbHMgPQorCSAgICBtZTQ2MDBfZGlvX3F1ZXJ5X251bWJlcl9jaGFubmVsczsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV90eXBlID0KKwkgICAgbWU0NjAwX2Rpb19xdWVyeV9zdWJkZXZpY2VfdHlwZTsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV9jYXBzID0KKwkgICAgbWU0NjAwX2Rpb19xdWVyeV9zdWJkZXZpY2VfY2FwczsKKworCXJldHVybiBzdWJkZXZpY2U7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU0NjAwX2Rpby5oIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lNDYwMF9kaW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjI1YmE5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lNDYwMF9kaW8uaApAQCAtMCwwICsxLDY5IEBACisvKioKKyAqIEBmaWxlIG1lNDYwMF9kaW8uaAorICoKKyAqIEBicmllZiBNRS00MDAwIGRpZ2l0YWwgaW5wdXQvb3V0cHV0IHN1YmRldmljZSBjbGFzcy4KKyAqIEBub3RlIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKiBAYXV0aG9yIEd1ZW50ZXIgR2ViaGFyZHQKKyAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9NRTQ2MDBfRElPX0hfCisjZGVmaW5lIF9NRTQ2MDBfRElPX0hfCisKKyNpbmNsdWRlICJtZXN1YmRldmljZS5oIgorCisjaWZkZWYgX19LRVJORUxfXworCisvKioKKyAqIEBicmllZiBUaGUgdGVtcGxhdGUgc3ViZGV2aWNlIGNsYXNzLgorICovCit0eXBlZGVmIHN0cnVjdCBtZTQ2MDBfZGlvX3N1YmRldmljZSB7CisJLyogSW5oZXJpdGFuY2UgKi8KKwltZV9zdWJkZXZpY2VfdCBiYXNlOwkJCS8qKjwgVGhlIHN1YmRldmljZSBiYXNlIGNsYXNzLiAqLworCisJLyogQXR0cmlidXRlcyAqLworCXNwaW5sb2NrX3Qgc3ViZGV2aWNlX2xvY2s7CQkvKio8IFNwaW4gbG9jayB0byBwcm90ZWN0IHRoZSBzdWJkZXZpY2UgZnJvbSBjb25jdXJyZW50IGFjY2Vzcy4gKi8KKwlzcGlubG9ja190ICpjdHJsX3JlZ19sb2NrOwkJLyoqPCBTcGluIGxvY2sgdG8gcHJvdGVjdCAjY3RybF9yZWcgZnJvbSBjb25jdXJyZW50IGFjY2Vzcy4gKi8KKwl1bnNpZ25lZCBpbnQgZGlvX2lkeDsJCQkvKio8IFRoZSBpbmRleCBvZiB0aGUgZGlnaXRhbCBpL28gb24gdGhlIGRldmljZS4gKi8KKworCS8qIFJlZ2lzdGVycyAqLworCXVuc2lnbmVkIGxvbmcgcG9ydF9yZWc7CQkJLyoqPCBSZWdpc3RlciBob2xkaW5nIHRoZSBwb3J0IHN0YXR1cy4gKi8KKwl1bnNpZ25lZCBsb25nIGN0cmxfcmVnOwkJCS8qKjwgUmVnaXN0ZXIgdG8gY29uZmlndXJlIHRoZSBwb3J0IGRpcmVjdGlvbi4gKi8KKyNpZmRlZiBNRURFQlVHX0RFQlVHX1JFRworCXVuc2lnbmVkIGxvbmcgcmVnX2Jhc2U7CisjZW5kaWYKK30gbWU0NjAwX2Rpb19zdWJkZXZpY2VfdDsKKworLyoqCisgKiBAYnJpZWYgVGhlIGNvbnN0cnVjdG9yIHRvIGdlbmVyYXRlIGEgTUUtNDAwMCBkaWdpdGFsIGlucHV0L291cHV0IHN1YmRldmljZSBpbnN0YW5jZS4KKyAqCisgKiBAcGFyYW0gcmVnX2Jhc2UgVGhlIHJlZ2lzdGVyIGJhc2UgYWRkcmVzcyBvZiB0aGUgZGV2aWNlIGFzIHJldHVybmVkIGJ5IHRoZSBQQ0kgQklPUy4KKyAqIEBwYXJhbSBkaW9faWR4IFRoZSBpbmRleCBvZiB0aGUgZGlnaXRhbCBpL28gcG9ydCBvbiB0aGUgZGV2aWNlLgorICogQHBhcmFtIGN0cmxfcmVnX2xvY2sgU3BpbiBsb2NrIHByb3RlY3RpbmcgdGhlIGNvbnRyb2wgcmVnaXN0ZXIuCisgKgorICogQHJldHVybiBQb2ludGVyIHRvIG5ldyBpbnN0YW5jZSBvbiBzdWNjZXNzLlxuCisgKiBOVUxMIG9uIGVycm9yLgorICovCittZTQ2MDBfZGlvX3N1YmRldmljZV90ICptZTQ2MDBfZGlvX2NvbnN0cnVjdG9yKHVpbnQzMl90IHJlZ19iYXNlLAorCQkJCQkgICAgICAgdW5zaWduZWQgaW50IGRpb19pZHgsCisJCQkJCSAgICAgICBzcGlubG9ja190ICogY3RybF9yZWdfbG9jayk7CisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU0NjAwX2Rpb19yZWcuaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTQ2MDBfZGlvX3JlZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhNDAxNmEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU0NjAwX2Rpb19yZWcuaApAQCAtMCwwICsxLDYzIEBACisvKioKKyAqIEBmaWxlIG1lNDYwMF9kaW9fcmVnLmgKKyAqCisgKiBAYnJpZWYgTUUtNDAwMCBkaWdpdGFsIGlucHV0L291dHB1dCBzdWJkZXZpY2UgcmVnaXN0ZXIgZGVmaW5pdGlvbnMuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfTUU0NjAwX0RJT19SRUdfSF8KKyNkZWZpbmUgX01FNDYwMF9ESU9fUkVHX0hfCisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKyNkZWZpbmUgTUU0NjAwX0RJT19QT1JUXzBfUkVHCQkJCTB4QTAJCQkJCS8qKjwgUG9ydCAwIHJlZ2lzdGVyLiAqLworI2RlZmluZSBNRTQ2MDBfRElPX1BPUlRfMV9SRUcJCQkJMHhBNAkJCQkJLyoqPCBQb3J0IDEgcmVnaXN0ZXIuICovCisjZGVmaW5lIE1FNDYwMF9ESU9fUE9SVF8yX1JFRwkJCQkweEE4CQkJCQkvKio8IFBvcnQgMiByZWdpc3Rlci4gKi8KKyNkZWZpbmUgTUU0NjAwX0RJT19QT1JUXzNfUkVHCQkJCTB4QUMJCQkJCS8qKjwgUG9ydCAzIHJlZ2lzdGVyLiAqLworCisjZGVmaW5lIE1FNDYwMF9ESU9fRElSX1JFRwkJCQkJMHhCMAkJCQkJLyoqPCBEaXJlY3Rpb24gcmVnaXN0ZXIuICovCisjZGVmaW5lIE1FNDYwMF9ESU9fUE9SVF9SRUcJCQkJCU1FNDYwMF9ESU9fUE9SVF8wX1JFRwkvKio8IEJhc2UgZm9yIHBvcnQncyByZWdpc3Rlci4gKi8KKworI2RlZmluZSBNRTQ2MDBfRElPX0NUUkxfUkVHCQkJCQkweEI4CQkJCQkvKio8IENvbnRyb2wgcmVnaXN0ZXIuICovCisvKiogUG9ydCBBIC0gRE8gKi8KKyNkZWZpbmUgTUU0NjAwX0RJT19DVFJMX0JJVF9NT0RFXzAJCQkweDAwMDEKKyNkZWZpbmUgTUU0NjAwX0RJT19DVFJMX0JJVF9NT0RFXzEJCQkweDAwMDIKKy8qKiBQb3J0IEIgLSBESSAqLworI2RlZmluZSBNRTQ2MDBfRElPX0NUUkxfQklUX01PREVfMgkJCTB4MDAwNAorI2RlZmluZSBNRTQ2MDBfRElPX0NUUkxfQklUX01PREVfMwkJCTB4MDAwOAorLyoqIFBvcnQgQyAtIERJTyAqLworI2RlZmluZSBNRTQ2MDBfRElPX0NUUkxfQklUX01PREVfNAkJCTB4MDAxMAorI2RlZmluZSBNRTQ2MDBfRElPX0NUUkxfQklUX01PREVfNQkJCTB4MDAyMAorLyoqIFBvcnQgRCAtIERJTyAqLworI2RlZmluZSBNRTQ2MDBfRElPX0NUUkxfQklUX01PREVfNgkJCTB4MDA0MAorI2RlZmluZSBNRTQ2MDBfRElPX0NUUkxfQklUX01PREVfNwkJCTB4MDA4MAorCisjZGVmaW5lIE1FNDYwMF9ESU9fQ1RSTF9CSVRfRlVOQ1RJT05fMAkJMHgwMTAwCisjZGVmaW5lIE1FNDYwMF9ESU9fQ1RSTF9CSVRfRlVOQ1RJT05fMQkJMHgwMjAwCisKKyNkZWZpbmUgTUU0NjAwX0RJT19DVFJMX0JJVF9GSUZPX0hJR0hfMAkJMHgwNDAwCisjZGVmaW5lIE1FNDYwMF9ESU9fQ1RSTF9CSVRfRklGT19ISUdIXzEJCTB4MDgwMAorI2RlZmluZSBNRTQ2MDBfRElPX0NUUkxfQklUX0ZJRk9fSElHSF8yCQkweDEwMDAKKyNkZWZpbmUgTUU0NjAwX0RJT19DVFJMX0JJVF9GSUZPX0hJR0hfMwkJMHgyMDAwCisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU0NjAwX2RvLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU0NjAwX2RvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU1OTFiYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTQ2MDBfZG8uYwpAQCAtMCwwICsxLDQzMyBAQAorLyoqCisgKiBAZmlsZSBtZTQ2MDBfZG8uYworICoKKyAqIEBicmllZiBNRS00MDAwIGRpZ2l0YWwgb3V0cHV0IHN1YmRldmljZSBpbnN0YW5jZS4KKyAqIEBub3RlIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKiBAYXV0aG9yIEd1ZW50ZXIgR2ViaGFyZHQKKyAqIEBhdXRob3IgS3J6eXN6dG9mIEdhbnR6a2UJKGsuZ2FudHprZUBtZWlsaGF1cy5kZSkKKyAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9fS0VSTkVMX18KKyMgIGRlZmluZSBfX0tFUk5FTF9fCisjZW5kaWYKKworLyoKKyAqIEluY2x1ZGVzCisgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNpbmNsdWRlICJtZWRlZmluZXMuaCIKKyNpbmNsdWRlICJtZWludGVybmFsLmgiCisjaW5jbHVkZSAibWVlcnJvci5oIgorCisjaW5jbHVkZSAibWVkZWJ1Zy5oIgorI2luY2x1ZGUgIm1lNDYwMF9kaW9fcmVnLmgiCisjaW5jbHVkZSAibWU0NjAwX2RvLmgiCisKKy8qCisgKiBEZWZpbmVzCisgKi8KKworLyoKKyAqIEZ1bmN0aW9ucworICovCisKK3N0YXRpYyBpbnQgbWU0NjAwX2RvX2lvX3Jlc2V0X3N1YmRldmljZShzdHJ1Y3QgbWVfc3ViZGV2aWNlICpzdWJkZXZpY2UsCisJCQkJCXN0cnVjdCBmaWxlICpmaWxlcCwgaW50IGZsYWdzKQoreworCW1lNDYwMF9kb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJdWludDMyX3QgbW9kZTsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lNDYwMF9kb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlpZiAoZmxhZ3MpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWcgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCS8qIFNldCBwb3J0IHRvIG91dHB1dCBtb2RlICovCisJc3Bpbl9sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCXNwaW5fbG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisJbW9kZSA9IGlubChpbnN0YW5jZS0+Y3RybF9yZWcpOworCW1vZGUgJj0gfk1FNDYwMF9ESU9fQ1RSTF9CSVRfTU9ERV8xOwkvLzB4RkZGRAorCW1vZGUgfD0gTUU0NjAwX0RJT19DVFJMX0JJVF9NT0RFXzA7CS8vMHgxCisJb3V0bChtb2RlLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCBtb2RlKTsKKwlzcGluX3VubG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisKKwlvdXRsKDAsIGluc3RhbmNlLT5wb3J0X3JlZyk7CisJUERFQlVHX1JFRygicG9ydF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+cG9ydF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIDApOworCXNwaW5fdW5sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZTQ2MDBfZG9faW9fc2luZ2xlX2NvbmZpZyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgICAgaW50IGNoYW5uZWwsCisJCQkJICAgICAgaW50IHNpbmdsZV9jb25maWcsCisJCQkJICAgICAgaW50IHJlZiwKKwkJCQkgICAgICBpbnQgdHJpZ19jaGFuLAorCQkJCSAgICAgIGludCB0cmlnX3R5cGUsIGludCB0cmlnX2VkZ2UsIGludCBmbGFncykKK3sKKwltZTQ2MDBfZG9fc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCXVpbnQzMl90IG1vZGU7CisJaW50IHNpemUgPQorCSAgICBmbGFncyAmIChNRV9JT19TSU5HTEVfQ09ORklHX0RJT19CSVQgfCBNRV9JT19TSU5HTEVfQ09ORklHX0RJT19CWVRFCisJCSAgICAgfCBNRV9JT19TSU5HTEVfQ09ORklHX0RJT19XT1JEIHwKKwkJICAgICBNRV9JT19TSU5HTEVfQ09ORklHX0RJT19EV09SRCk7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbnN0YW5jZSA9IChtZTQ2MDBfZG9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJc3Bpbl9sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCXNwaW5fbG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisJbW9kZSA9IGlubChpbnN0YW5jZS0+Y3RybF9yZWcpOworCisJc3dpdGNoIChzaXplKSB7CisJY2FzZSBNRV9JT19TSU5HTEVfQ09ORklHX05PX0ZMQUdTOgorCWNhc2UgTUVfSU9fU0lOR0xFX0NPTkZJR19ESU9fQllURToKKwkJaWYgKGNoYW5uZWwgPT0gMCkgeworCQkJaWYgKHNpbmdsZV9jb25maWcgPT0gTUVfU0lOR0xFX0NPTkZJR19ESU9fT1VUUFVUKSB7CisJCQkJbW9kZSAmPSB+KE1FNDYwMF9ESU9fQ1RSTF9CSVRfTU9ERV8wIHwKKwkJCQkJICBNRTQ2MDBfRElPX0NUUkxfQklUX01PREVfMSk7CisJCQkJbW9kZSB8PSAoTUU0NjAwX0RJT19DVFJMX0JJVF9NT0RFXzApOworCQkJfSBlbHNlIGlmIChzaW5nbGVfY29uZmlnID09IE1FX1NJTkdMRV9DT05GSUdfRElPX01VWDMyTSkgeworCQkJCW1vZGUgJj0gfihNRTQ2MDBfRElPX0NUUkxfQklUX01PREVfMCB8CisJCQkJCSAgTUU0NjAwX0RJT19DVFJMX0JJVF9NT0RFXzEgfAorCQkJCQkgIE1FNDYwMF9ESU9fQ1RSTF9CSVRfRlVOQ1RJT05fMCB8CisJCQkJCSAgTUU0NjAwX0RJT19DVFJMX0JJVF9GVU5DVElPTl8xIHwKKwkJCQkJICBNRTQ2MDBfRElPX0NUUkxfQklUX0ZJRk9fSElHSF8wKTsKKworCQkJCWlmIChyZWYgPT0gTUVfUkVGX0RJT19GSUZPX0xPVykgeworCQkJCQltb2RlIHw9IChNRTQ2MDBfRElPX0NUUkxfQklUX01PREVfMCB8CisJCQkJCQkgTUU0NjAwX0RJT19DVFJMX0JJVF9NT0RFXzEgfAorCQkJCQkJIE1FNDYwMF9ESU9fQ1RSTF9CSVRfRlVOQ1RJT05fMSk7CisJCQkJfSBlbHNlIGlmIChyZWYgPT0gTUVfUkVGX0RJT19GSUZPX0hJR0gpIHsKKwkJCQkJbW9kZSB8PSAoTUU0NjAwX0RJT19DVFJMX0JJVF9NT0RFXzAgfAorCQkJCQkJIE1FNDYwMF9ESU9fQ1RSTF9CSVRfTU9ERV8xIHwKKwkJCQkJCSBNRTQ2MDBfRElPX0NUUkxfQklUX0ZVTkNUSU9OXzEKKwkJCQkJCSB8CisJCQkJCQkgTUU0NjAwX0RJT19DVFJMX0JJVF9GSUZPX0hJR0hfMCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJUEVSUk9SCisJCQkJCSAgICAoIkludmFsaWQgcG9ydCByZWZlcmVuY2Ugc3BlY2lmaWVkLlxuIik7CisJCQkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfU0lOR0xFX0NPTkZJRzsKKwkJCQl9CisJCQl9IGVsc2UgaWYgKHNpbmdsZV9jb25maWcgPT0KKwkJCQkgICBNRV9TSU5HTEVfQ09ORklHX0RJT19ERU1VWDMyKSB7CisJCQkJbW9kZSAmPQorCQkJCSAgICB+KE1FNDYwMF9ESU9fQ1RSTF9CSVRfTU9ERV8wIHwKKwkJCQkgICAgICBNRTQ2MDBfRElPX0NUUkxfQklUX01PREVfMSB8CisJCQkJICAgICAgTUU0NjAwX0RJT19DVFJMX0JJVF9GVU5DVElPTl8wIHwKKwkJCQkgICAgICBNRTQ2MDBfRElPX0NUUkxfQklUX0ZVTkNUSU9OXzEgfAorCQkJCSAgICAgIE1FNDYwMF9ESU9fQ1RSTF9CSVRfRklGT19ISUdIXzApOworCisJCQkJaWYgKHJlZiA9PSBNRV9SRUZfRElPX0ZJRk9fTE9XKSB7CisJCQkJCW1vZGUgfD0gKE1FNDYwMF9ESU9fQ1RSTF9CSVRfTU9ERV8wIHwKKwkJCQkJCSBNRTQ2MDBfRElPX0NUUkxfQklUX01PREVfMSB8CisJCQkJCQkgTUU0NjAwX0RJT19DVFJMX0JJVF9GVU5DVElPTl8wKTsKKwkJCQl9IGVsc2UgaWYgKHJlZiA9PSBNRV9SRUZfRElPX0ZJRk9fSElHSCkgeworCQkJCQltb2RlIHw9IChNRTQ2MDBfRElPX0NUUkxfQklUX01PREVfMCB8CisJCQkJCQkgTUU0NjAwX0RJT19DVFJMX0JJVF9NT0RFXzEgfAorCQkJCQkJIE1FNDYwMF9ESU9fQ1RSTF9CSVRfRlVOQ1RJT05fMAorCQkJCQkJIHwKKwkJCQkJCSBNRTQ2MDBfRElPX0NUUkxfQklUX0ZJRk9fSElHSF8wKTsKKwkJCQl9IGVsc2UgeworCQkJCQlQRVJST1IKKwkJCQkJICAgICgiSW52YWxpZCBwb3J0IHJlZmVyZW5jZSBzcGVjaWZpZWQuXG4iKTsKKwkJCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9TSU5HTEVfQ09ORklHOworCQkJCX0KKwkJCX0gZWxzZSBpZiAoc2luZ2xlX2NvbmZpZyA9PQorCQkJCSAgIE1FX1NJTkdMRV9DT05GSUdfRElPX0JJVF9QQVRURVJOKSB7CisJCQkJbW9kZSAmPQorCQkJCSAgICB+KE1FNDYwMF9ESU9fQ1RSTF9CSVRfTU9ERV8wIHwKKwkJCQkgICAgICBNRTQ2MDBfRElPX0NUUkxfQklUX01PREVfMSB8CisJCQkJICAgICAgTUU0NjAwX0RJT19DVFJMX0JJVF9GVU5DVElPTl8wIHwKKwkJCQkgICAgICBNRTQ2MDBfRElPX0NUUkxfQklUX0ZVTkNUSU9OXzEgfAorCQkJCSAgICAgIE1FNDYwMF9ESU9fQ1RSTF9CSVRfRklGT19ISUdIXzApOworCisJCQkJaWYgKHJlZiA9PSBNRV9SRUZfRElPX0ZJRk9fTE9XKSB7CisJCQkJCW1vZGUgfD0gKE1FNDYwMF9ESU9fQ1RSTF9CSVRfTU9ERV8wIHwKKwkJCQkJCSBNRTQ2MDBfRElPX0NUUkxfQklUX01PREVfMSk7CisJCQkJfSBlbHNlIGlmIChyZWYgPT0gTUVfUkVGX0RJT19GSUZPX0hJR0gpIHsKKwkJCQkJbW9kZSB8PSAoTUU0NjAwX0RJT19DVFJMX0JJVF9NT0RFXzAgfAorCQkJCQkJIE1FNDYwMF9ESU9fQ1RSTF9CSVRfTU9ERV8xIHwKKwkJCQkJCSBNRTQ2MDBfRElPX0NUUkxfQklUX0ZJRk9fSElHSF8wKTsKKwkJCQl9IGVsc2UgeworCQkJCQlQRVJST1IKKwkJCQkJICAgICgiSW52YWxpZCBwb3J0IHJlZmVyZW5jZSBzcGVjaWZpZWQuXG4iKTsKKwkJCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9TSU5HTEVfQ09ORklHOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJUEVSUk9SKCJJbnZhbGlkIHBvcnQgZGlyZWN0aW9uIHNwZWNpZmllZC5cbiIpOworCQkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfU0lOR0xFX0NPTkZJRzsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCVBFUlJPUigiSW52YWxpZCBjaGFubmVsIG51bWJlci5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCQl9CisKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlQRVJST1IoIkludmFsaWQgZmxhZ3Mgc3BlY2lmaWVkLlxuIik7CisJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJfQorCisJaWYgKCFlcnIpIHsKKwkJb3V0bChtb2RlLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCBtb2RlKTsKKwl9CisJc3Bpbl91bmxvY2soaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2spOworCXNwaW5fdW5sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lNDYwMF9kb19pb19zaW5nbGVfcmVhZChtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICBpbnQgY2hhbm5lbCwKKwkJCQkgICAgaW50ICp2YWx1ZSwgaW50IHRpbWVfb3V0LCBpbnQgZmxhZ3MpCit7CisJbWU0NjAwX2RvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwl1aW50MzJfdCBtb2RlOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJaW5zdGFuY2UgPSAobWU0NjAwX2RvX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCXNwaW5fbG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKwlzcGluX2xvY2soaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2spOworCW1vZGUgPQorCSAgICBpbmwoaW5zdGFuY2UtPgorCQljdHJsX3JlZykgJiAoTUU0NjAwX0RJT19DVFJMX0JJVF9NT0RFXzAgfAorCQkJICAgICBNRTQ2MDBfRElPX0NUUkxfQklUX01PREVfMSk7CisKKwlpZiAobW9kZSA9PSBNRTQ2MDBfRElPX0NUUkxfQklUX01PREVfMCkgeworCQlzd2l0Y2ggKGZsYWdzKSB7CisJCWNhc2UgTUVfSU9fU0lOR0xFX1RZUEVfRElPX0JJVDoKKwkJCWlmICgoY2hhbm5lbCA+PSAwKSAmJiAoY2hhbm5lbCA8IDgpKSB7CisJCQkJKnZhbHVlID0KKwkJCQkgICAgaW5sKGluc3RhbmNlLT5wb3J0X3JlZykgJiAoMHgxIDw8IGNoYW5uZWwpOworCQkJfSBlbHNlIHsKKwkJCQlQRVJST1IoIkludmFsaWQgYml0IG51bWJlciBzcGVjaWZpZWQuXG4iKTsKKwkJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIE1FX0lPX1NJTkdMRV9OT19GTEFHUzoKKwkJY2FzZSBNRV9JT19TSU5HTEVfVFlQRV9ESU9fQllURToKKwkJCWlmIChjaGFubmVsID09IDApIHsKKwkJCQkqdmFsdWUgPSBpbmwoaW5zdGFuY2UtPnBvcnRfcmVnKSAmIDB4RkY7CisJCQl9IGVsc2UgeworCQkJCVBFUlJPUigiSW52YWxpZCBieXRlIG51bWJlciBzcGVjaWZpZWQuXG4iKTsKKwkJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJCQl9CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJUEVSUk9SKCJJbnZhbGlkIGZsYWdzIHNwZWNpZmllZC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwkJfQorCX0gZWxzZSB7CisJCVBFUlJPUigiUG9ydCBub3QgaW4gb3V0cHV0IG1vZGUuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fUFJFVklPVVNfQ09ORklHOworCX0KKwlzcGluX3VubG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisJc3Bpbl91bmxvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWU0NjAwX2RvX2lvX3NpbmdsZV93cml0ZShtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgIGludCBjaGFubmVsLAorCQkJCSAgICAgaW50IHZhbHVlLCBpbnQgdGltZV9vdXQsIGludCBmbGFncykKK3sKKwltZTQ2MDBfZG9fc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCXVpbnQzMl90IGJ5dGU7CisJdWludDMyX3QgbW9kZTsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lNDYwMF9kb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlzcGluX2xvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisJc3Bpbl9sb2NrKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrKTsKKwltb2RlID0KKwkgICAgaW5sKGluc3RhbmNlLT4KKwkJY3RybF9yZWcpICYgKE1FNDYwMF9ESU9fQ1RSTF9CSVRfTU9ERV8wIHwKKwkJCSAgICAgTUU0NjAwX0RJT19DVFJMX0JJVF9NT0RFXzEpOworCisJaWYgKG1vZGUgPT0gTUU0NjAwX0RJT19DVFJMX0JJVF9NT0RFXzApIHsKKwkJc3dpdGNoIChmbGFncykgeworCisJCWNhc2UgTUVfSU9fU0lOR0xFX1RZUEVfRElPX0JJVDoKKwkJCWlmICgoY2hhbm5lbCA+PSAwKSAmJiAoY2hhbm5lbCA8IDgpKSB7CisJCQkJYnl0ZSA9IGlubChpbnN0YW5jZS0+cG9ydF9yZWcpICYgMHhGRjsKKworCQkJCWlmICh2YWx1ZSkKKwkJCQkJYnl0ZSB8PSAweDEgPDwgY2hhbm5lbDsKKwkJCQllbHNlCisJCQkJCWJ5dGUgJj0gfigweDEgPDwgY2hhbm5lbCk7CisKKwkJCQlvdXRsKGJ5dGUsIGluc3RhbmNlLT5wb3J0X3JlZyk7CisJCQl9IGVsc2UgeworCQkJCVBFUlJPUigiSW52YWxpZCBiaXQgbnVtYmVyIHNwZWNpZmllZC5cbiIpOworCQkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgTUVfSU9fU0lOR0xFX05PX0ZMQUdTOgorCQljYXNlIE1FX0lPX1NJTkdMRV9UWVBFX0RJT19CWVRFOgorCQkJaWYgKGNoYW5uZWwgPT0gMCkgeworCQkJCW91dGwodmFsdWUsIGluc3RhbmNlLT5wb3J0X3JlZyk7CisJCQl9IGVsc2UgeworCQkJCVBFUlJPUigiSW52YWxpZCBieXRlIG51bWJlciBzcGVjaWZpZWQuXG4iKTsKKwkJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJCQl9CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJUEVSUk9SKCJJbnZhbGlkIGZsYWdzIHNwZWNpZmllZC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwkJfQorCX0gZWxzZSB7CisJCVBFUlJPUigiUG9ydCBub3QgaW4gb3V0cHV0IG1vZGUuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fUFJFVklPVVNfQ09ORklHOworCX0KKwlzcGluX3VubG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisJc3Bpbl91bmxvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWU0NjAwX2RvX3F1ZXJ5X251bWJlcl9jaGFubmVscyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJICAgaW50ICpudW1iZXIpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCSpudW1iZXIgPSA4OworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lNDYwMF9kb19xdWVyeV9zdWJkZXZpY2VfdHlwZShtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJICBpbnQgKnR5cGUsIGludCAqc3VidHlwZSkKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJKnR5cGUgPSBNRV9UWVBFX0RPOworCSpzdWJ0eXBlID0gTUVfU1VCVFlQRV9TSU5HTEU7CisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWU0NjAwX2RvX3F1ZXJ5X3N1YmRldmljZV9jYXBzKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLCBpbnQgKmNhcHMpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCSpjYXBzID0gMDsKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworbWU0NjAwX2RvX3N1YmRldmljZV90ICptZTQ2MDBfZG9fY29uc3RydWN0b3IodWludDMyX3QgcmVnX2Jhc2UsCisJCQkJCSAgICAgc3BpbmxvY2tfdCAqIGN0cmxfcmVnX2xvY2spCit7CisJbWU0NjAwX2RvX3N1YmRldmljZV90ICpzdWJkZXZpY2U7CisJaW50IGVycjsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCS8qIEFsbG9jYXRlIG1lbW9yeSBmb3Igc3ViZGV2aWNlIGluc3RhbmNlICovCisJc3ViZGV2aWNlID0ga21hbGxvYyhzaXplb2YobWU0NjAwX2RvX3N1YmRldmljZV90KSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIXN1YmRldmljZSkgeworCQlQRVJST1IoIkNhbm5vdCBnZXQgbWVtb3J5IGZvciBzdWJkZXZpY2UgaW5zdGFuY2UuXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJbWVtc2V0KHN1YmRldmljZSwgMCwgc2l6ZW9mKG1lNDYwMF9kb19zdWJkZXZpY2VfdCkpOworCisJLyogSW5pdGlhbGl6ZSBzdWJkZXZpY2UgYmFzZSBjbGFzcyAqLworCWVyciA9IG1lX3N1YmRldmljZV9pbml0KCZzdWJkZXZpY2UtPmJhc2UpOworCisJaWYgKGVycikgeworCQlQRVJST1IoIkNhbm5vdCBpbml0aWFsaXplIHN1YmRldmljZSBiYXNlIGNsYXNzIGluc3RhbmNlLlxuIik7CisJCWtmcmVlKHN1YmRldmljZSk7CisJCXJldHVybiBOVUxMOworCX0KKwkvLyBJbml0aWFsaXplIHNwaW4gbG9ja3MuCisJc3Bpbl9sb2NrX2luaXQoJnN1YmRldmljZS0+c3ViZGV2aWNlX2xvY2spOworCisJc3ViZGV2aWNlLT5jdHJsX3JlZ19sb2NrID0gY3RybF9yZWdfbG9jazsKKworCS8qIFNhdmUgdGhlIHN1YmRldmljZSBpbmRleCAqLworCXN1YmRldmljZS0+Y3RybF9yZWcgPSByZWdfYmFzZSArIE1FNDYwMF9ESU9fQ1RSTF9SRUc7CisJc3ViZGV2aWNlLT5wb3J0X3JlZyA9IHJlZ19iYXNlICsgTUU0NjAwX0RJT19QT1JUXzBfUkVHOworI2lmZGVmIE1FREVCVUdfREVCVUdfUkVHCisJc3ViZGV2aWNlLT5yZWdfYmFzZSA9IHJlZ19iYXNlOworI2VuZGlmCisKKwkvKiBPdmVybG9hZCBiYXNlIGNsYXNzIG1ldGhvZHMuICovCisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19yZXNldF9zdWJkZXZpY2UgPQorCSAgICBtZTQ2MDBfZG9faW9fcmVzZXRfc3ViZGV2aWNlOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fc2luZ2xlX2NvbmZpZyA9CisJICAgIG1lNDYwMF9kb19pb19zaW5nbGVfY29uZmlnOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fc2luZ2xlX3JlYWQgPSBtZTQ2MDBfZG9faW9fc2luZ2xlX3JlYWQ7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19zaW5nbGVfd3JpdGUgPQorCSAgICBtZTQ2MDBfZG9faW9fc2luZ2xlX3dyaXRlOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfcXVlcnlfbnVtYmVyX2NoYW5uZWxzID0KKwkgICAgbWU0NjAwX2RvX3F1ZXJ5X251bWJlcl9jaGFubmVsczsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV90eXBlID0KKwkgICAgbWU0NjAwX2RvX3F1ZXJ5X3N1YmRldmljZV90eXBlOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfcXVlcnlfc3ViZGV2aWNlX2NhcHMgPQorCSAgICBtZTQ2MDBfZG9fcXVlcnlfc3ViZGV2aWNlX2NhcHM7CisKKwlyZXR1cm4gc3ViZGV2aWNlOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lNDYwMF9kby5oIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lNDYwMF9kby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4Mzg1NjQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU0NjAwX2RvLmgKQEAgLTAsMCArMSw2NSBAQAorLyoqCisgKiBAZmlsZSBtZTQ2MDBfZG8uaAorICoKKyAqIEBicmllZiBNRS00MDAwIGRpZ2l0YWwgb3V0cHV0IHN1YmRldmljZSBjbGFzcy4KKyAqIEBub3RlIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKiBAYXV0aG9yIEd1ZW50ZXIgR2ViaGFyZHQKKyAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9NRTQ2MDBfRE9fSF8KKyNkZWZpbmUgX01FNDYwMF9ET19IXworCisjaW5jbHVkZSAibWVzdWJkZXZpY2UuaCIKKworI2lmZGVmIF9fS0VSTkVMX18KKworLyoqCisgKiBAYnJpZWYgVGhlIHRlbXBsYXRlIHN1YmRldmljZSBjbGFzcy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgbWU0NjAwX2RvX3N1YmRldmljZSB7CisJLyogSW5oZXJpdGFuY2UgKi8KKwltZV9zdWJkZXZpY2VfdCBiYXNlOwkJCS8qKjwgVGhlIHN1YmRldmljZSBiYXNlIGNsYXNzLiAqLworCisJLyogQXR0cmlidXRlcyAqLworCXNwaW5sb2NrX3Qgc3ViZGV2aWNlX2xvY2s7CQkvKio8IFNwaW4gbG9jayB0byBwcm90ZWN0IHRoZSBzdWJkZXZpY2UgZnJvbSBjb25jdXJyZW50IGFjY2Vzcy4gKi8KKwlzcGlubG9ja190ICpjdHJsX3JlZ19sb2NrOwkJLyoqPCBTcGluIGxvY2sgdG8gcHJvdGVjdCAjY3RybF9yZWcgZnJvbSBjb25jdXJyZW50IGFjY2Vzcy4gKi8KKworCXVuc2lnbmVkIGxvbmcgcG9ydF9yZWc7CQkJLyoqPCBSZWdpc3RlciBob2xkaW5nIHRoZSBwb3J0IHN0YXR1cy4gKi8KKwl1bnNpZ25lZCBsb25nIGN0cmxfcmVnOwkJCS8qKjwgUmVnaXN0ZXIgdG8gY29uZmlndXJlIHRoZSBwb3J0IGRpcmVjdGlvbi4gKi8KKyNpZmRlZiBNRURFQlVHX0RFQlVHX1JFRworCXVuc2lnbmVkIGxvbmcgcmVnX2Jhc2U7CisjZW5kaWYKK30gbWU0NjAwX2RvX3N1YmRldmljZV90OworCisvKioKKyAqIEBicmllZiBUaGUgY29uc3RydWN0b3IgdG8gZ2VuZXJhdGUgYSBNRS00MDAwIGRpZ2l0YWwgb3V0cHV0IHN1YmRldmljZSBpbnN0YW5jZS4KKyAqCisgKiBAcGFyYW0gcmVnX2Jhc2UgVGhlIHJlZ2lzdGVyIGJhc2UgYWRkcmVzcyBvZiB0aGUgZGV2aWNlIGFzIHJldHVybmVkIGJ5IHRoZSBQQ0kgQklPUy4KKyAqIEBwYXJhbSBjdHJsX3JlZ19sb2NrIFNwaW4gbG9jayBwcm90ZWN0aW5nIHRoZSBjb250cm9sIHJlZ2lzdGVyLgorICoKKyAqIEByZXR1cm4gUG9pbnRlciB0byBuZXcgaW5zdGFuY2Ugb24gc3VjY2Vzcy5cbgorICogTlVMTCBvbiBlcnJvci4KKyAqLworbWU0NjAwX2RvX3N1YmRldmljZV90ICptZTQ2MDBfZG9fY29uc3RydWN0b3IodWludDMyX3QgcmVnX2Jhc2UsCisJCQkJCSAgICAgc3BpbmxvY2tfdCAqIGN0cmxfcmVnX2xvY2spOworCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lNDYwMF9leHRfaXJxLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU0NjAwX2V4dF9pcnEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZGMxZTFiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lNDYwMF9leHRfaXJxLmMKQEAgLTAsMCArMSw0NjcgQEAKKy8qKgorICogQGZpbGUgbWU0NjAwX2V4dF9pcnEuYworICoKKyAqIEBicmllZiBNRS00MDAwIGV4dGVybmFsIGludGVycnVwdCBzdWJkZXZpY2UgaW5zdGFuY2UuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKiBAYXV0aG9yIEtyenlzenRvZiBHYW50emtlCShrLmdhbnR6a2VAbWVpbGhhdXMuZGUpCisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0tFUk5FTF9fCisjICBkZWZpbmUgX19LRVJORUxfXworI2VuZGlmCisKKy8qCisgKiBJbmNsdWRlcworICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKworI2luY2x1ZGUgIm1lZGVmaW5lcy5oIgorI2luY2x1ZGUgIm1laW50ZXJuYWwuaCIKKyNpbmNsdWRlICJtZWVycm9yLmgiCisKKyNpbmNsdWRlICJtZWRlYnVnLmgiCisjaW5jbHVkZSAibWVpZHMuaCIKKyNpbmNsdWRlICJtZTQ2MDBfcmVnLmgiCisjaW5jbHVkZSAibWU0NjAwX2FpX3JlZy5oIgorI2luY2x1ZGUgIm1lNDYwMF9leHRfaXJxX3JlZy5oIgorI2luY2x1ZGUgIm1lNDYwMF9leHRfaXJxLmgiCisKKy8qCisgKiBEZWZpbmVzCisgKi8KKworLyoKKyAqIEZ1bmN0aW9ucworICovCisKK3N0YXRpYyBpbnQgbWU0NjAwX2V4dF9pcnFfaW9faXJxX3N0YXJ0KG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgICAgIGludCBjaGFubmVsLAorCQkJCSAgICAgICBpbnQgaXJxX3NvdXJjZSwKKwkJCQkgICAgICAgaW50IGlycV9lZGdlLCBpbnQgaXJxX2FyZywgaW50IGZsYWdzKQoreworCW1lNDYwMF9leHRfaXJxX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwl1bnNpZ25lZCBsb25nIGNwdV9mbGFnczsKKwl1aW50MzJfdCB0bXA7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbnN0YW5jZSA9IChtZTQ2MDBfZXh0X2lycV9zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlpZiAoZmxhZ3MgJiB+TUVfSU9fSVJRX1NUQVJUX0RJT19CSVQpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWcgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCWlmICgoaXJxX2VkZ2UgIT0gTUVfSVJRX0VER0VfUklTSU5HKQorCSAgICAmJiAoaXJxX2VkZ2UgIT0gTUVfSVJRX0VER0VfRkFMTElORykKKwkgICAgJiYgKGlycV9lZGdlICE9IE1FX0lSUV9FREdFX0FOWSkKKwkgICAgKSB7CisJCVBFUlJPUigiSW52YWxpZCBpcnEgZWRnZSBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfSVJRX0VER0U7CisJfQorCisJaWYgKGlycV9zb3VyY2UgIT0gTUVfSVJRX1NPVVJDRV9ESU9fTElORSkgeworCQlQRVJST1IoIkludmFsaWQgaXJxIHNvdXJjZSBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfSVJRX1NPVVJDRTsKKwl9CisKKwlpZiAoY2hhbm5lbCkgeworCQlQRVJST1IoIkludmFsaWQgY2hhbm5lbCBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwl9CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlzcGluX2xvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisJdG1wID0gMHgwOwkJLy9pbmwoaW5zdGFuY2UtPmV4dF9pcnFfY29uZmlnX3JlZyk7CisKKwlpZiAoaXJxX2VkZ2UgPT0gTUVfSVJRX0VER0VfUklTSU5HKSB7CisJCS8vdG1wICY9IH5NRTQ2MDBfRVhUX0lSUV9DT05GSUdfTUFTSzsKKwkJLy90bXAgfD0gTUU0NjAwX0VYVF9JUlFfQ09ORklHX01BU0tfUklTSU5HOworCX0gZWxzZSBpZiAoaXJxX2VkZ2UgPT0gTUVfSVJRX0VER0VfRkFMTElORykgeworCQkvL3RtcCAmPSB+TUU0NjAwX0VYVF9JUlFfQ09ORklHX01BU0s7CisJCS8vdG1wIHw9IE1FNDYwMF9FWFRfSVJRX0NPTkZJR19NQVNLX0ZBTExJTkc7CisJCXRtcCA9IE1FNDYwMF9FWFRfSVJRX0NPTkZJR19NQVNLX0ZBTExJTkc7CisJfSBlbHNlIGlmIChpcnFfZWRnZSA9PSBNRV9JUlFfRURHRV9BTlkpIHsKKwkJLy90bXAgJj0gfk1FNDYwMF9FWFRfSVJRX0NPTkZJR19NQVNLOworCQkvL3RtcCB8PSBNRTQ2MDBfRVhUX0lSUV9DT05GSUdfTUFTS19BTlk7CisJCXRtcCA9IE1FNDYwMF9FWFRfSVJRX0NPTkZJR19NQVNLX0FOWTsKKwl9CisKKwlvdXRsKHRtcCwgaW5zdGFuY2UtPmV4dF9pcnFfY29uZmlnX3JlZyk7CisJUERFQlVHX1JFRygiZXh0X2lycV9jb25maWdfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPmV4dF9pcnFfY29uZmlnX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgdG1wKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrLCBjcHVfZmxhZ3MpOworCXRtcCA9IGlubChpbnN0YW5jZS0+Y3RybF9yZWcpOworCXRtcCAmPSB+KE1FNDYwMF9BSV9DVFJMX0JJVF9FWF9JUlEgfCBNRTQ2MDBfQUlfQ1RSTF9CSVRfRVhfSVJRX1JFU0VUKTsKKwl0bXAgfD0gTUU0NjAwX0FJX0NUUkxfQklUX0VYX0lSUTsKKwlvdXRsKHRtcCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrLCBjcHVfZmxhZ3MpOworCWluc3RhbmNlLT5yaXNlZCA9IDA7CisJc3Bpbl91bmxvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWU0NjAwX2V4dF9pcnFfaW9faXJxX3dhaXQobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICAgIGludCBjaGFubmVsLAorCQkJCSAgICAgIGludCAqaXJxX2NvdW50LAorCQkJCSAgICAgIGludCAqdmFsdWUsIGludCB0aW1lX291dCwgaW50IGZsYWdzKQoreworCW1lNDYwMF9leHRfaXJxX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwlsb25nIHQgPSAwOworCXVuc2lnbmVkIGxvbmcgY3B1X2ZsYWdzOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJaW5zdGFuY2UgPSAobWU0NjAwX2V4dF9pcnFfc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJaWYgKGZsYWdzKSB7CisJCVBFUlJPUigiSW52YWxpZCBmbGFnIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlpZiAoY2hhbm5lbCkgeworCQlQRVJST1IoIkludmFsaWQgY2hhbm5lbCBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwl9CisKKwlpZiAodGltZV9vdXQgPCAwKSB7CisJCVBFUlJPUigiSW52YWxpZCB0aW1lX291dCBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfVElNRU9VVDsKKwl9CisKKwlpZiAodGltZV9vdXQpIHsKKwkJdCA9ICh0aW1lX291dCAqIEhaKSAvIDEwMDA7CisKKwkJaWYgKHQgPT0gMCkKKwkJCXQgPSAxOworCX0KKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCWlmIChpbnN0YW5jZS0+cmlzZWQgPD0gMCkgeworCQlpbnN0YW5jZS0+cmlzZWQgPSAwOworCQlpZiAodGltZV9vdXQpIHsKKwkJCXQgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChpbnN0YW5jZS0+CisJCQkJCQkJICAgICB3YWl0X3F1ZXVlLAorCQkJCQkJCSAgICAgKGluc3RhbmNlLT5yaXNlZCAhPQorCQkJCQkJCSAgICAgIDApLCB0KTsKKworCQkJaWYgKHQgPT0gMCkgeworCQkJCVBFUlJPUgorCQkJCSAgICAoIldhaXQgb24gZXh0ZXJuYWwgaW50ZXJydXB0IHRpbWVkIG91dC5cbiIpOworCQkJCWVyciA9IE1FX0VSUk5PX1RJTUVPVVQ7CisJCQl9CisJCX0gZWxzZSB7CisJCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoaW5zdGFuY2UtPndhaXRfcXVldWUsCisJCQkJCQkgKGluc3RhbmNlLT5yaXNlZCAhPSAwKSk7CisJCX0KKworCQlpZiAoaW5zdGFuY2UtPnJpc2VkIDwgMCkgeworCQkJUEVSUk9SKCJXYWl0IG9uIGludGVycnVwdCBhYm9ydGVkIGJ5IHVzZXIuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0NBTkNFTExFRDsKKwkJfQorCX0KKworCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQlQRVJST1IoIldhaXQgb24gZXh0ZXJuYWwgaW50ZXJydXB0IGFib3J0ZWQgYnkgc2lnbmFsLlxuIik7CisJCWVyciA9IE1FX0VSUk5PX1NJR05BTDsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCWluc3RhbmNlLT5yaXNlZCA9IDA7CisJKmlycV9jb3VudCA9IGluc3RhbmNlLT5jb3VudDsKKwkqdmFsdWUgPSBpbnN0YW5jZS0+dmFsdWU7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lNDYwMF9leHRfaXJxX2lvX2lycV9zdG9wKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgICBpbnQgY2hhbm5lbCwgaW50IGZsYWdzKQoreworCW1lNDYwMF9leHRfaXJxX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwl1bnNpZ25lZCBsb25nIGNwdV9mbGFnczsKKwl1aW50MzJfdCB0bXA7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbnN0YW5jZSA9IChtZTQ2MDBfZXh0X2lycV9zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlpZiAoZmxhZ3MpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWcgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCWlmIChjaGFubmVsKSB7CisJCVBFUlJPUigiSW52YWxpZCBjaGFubmVsIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCX0KKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisJc3Bpbl9sb2NrKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrKTsKKwl0bXAgPSBpbmwoaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwl0bXAgJj0gfihNRTQ2MDBfQUlfQ1RSTF9CSVRfRVhfSVJRIHwgTUU0NjAwX0FJX0NUUkxfQklUX0VYX0lSUV9SRVNFVCk7CisJb3V0bCh0bXAsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJUERFQlVHX1JFRygiY3RybF9yZWd2IG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCB0bXApOworCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrKTsKKwlpbnN0YW5jZS0+cmlzZWQgPSAtMTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlX2FsbCgmaW5zdGFuY2UtPndhaXRfcXVldWUpOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lNDYwMF9leHRfaXJxX2lvX3Jlc2V0X3N1YmRldmljZShtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsIGludCBmbGFncykKK3sKKwltZTQ2MDBfZXh0X2lycV9zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJdW5zaWduZWQgbG9uZyBjcHVfZmxhZ3M7CisJdWludDMyX3QgdG1wOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJaW5zdGFuY2UgPSAobWU0NjAwX2V4dF9pcnFfc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJaWYgKGZsYWdzKSB7CisJCVBFUlJPUigiSW52YWxpZCBmbGFnIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCXNwaW5fbG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisJdG1wID0gaW5sKGluc3RhbmNlLT5jdHJsX3JlZyk7CisJdG1wICY9IH4oTUU0NjAwX0FJX0NUUkxfQklUX0VYX0lSUSB8IE1FNDYwMF9BSV9DVFJMX0JJVF9FWF9JUlFfUkVTRVQpOworCW91dGwodG1wLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCVBERUJVR19SRUcoImN0cmxfcmVndiBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgdG1wKTsKKwlzcGluX3VubG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisJaW5zdGFuY2UtPnJpc2VkID0gLTE7CisJaW5zdGFuY2UtPmNvdW50ID0gMDsKKwlvdXRsKE1FNDYwMF9FWFRfSVJRX0NPTkZJR19NQVNLX0FOWSwgaW5zdGFuY2UtPmV4dF9pcnFfY29uZmlnX3JlZyk7CisJUERFQlVHX1JFRygiZXh0X2lycV9jb25maWdfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPmV4dF9pcnFfY29uZmlnX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgTUU0NjAwX0VYVF9JUlFfQ09ORklHX01BU0tfQU5ZKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlX2FsbCgmaW5zdGFuY2UtPndhaXRfcXVldWUpOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIHZvaWQgbWU0NjAwX2V4dF9pcnFfZGVzdHJ1Y3RvcihzdHJ1Y3QgbWVfc3ViZGV2aWNlICpzdWJkZXZpY2UpCit7CisJbWU0NjAwX2V4dF9pcnFfc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCWluc3RhbmNlID0gKG1lNDYwMF9leHRfaXJxX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKwltZV9zdWJkZXZpY2VfZGVpbml0KCZpbnN0YW5jZS0+YmFzZSk7CisJZnJlZV9pcnEoaW5zdGFuY2UtPmlycSwgaW5zdGFuY2UpOworCWtmcmVlKGluc3RhbmNlKTsKK30KKworc3RhdGljIGludCBtZTQ2MDBfZXh0X2lycV9xdWVyeV9udW1iZXJfY2hhbm5lbHMobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJCQlpbnQgKm51bWJlcikKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJKm51bWJlciA9IDE7CisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWU0NjAwX2V4dF9pcnFfcXVlcnlfc3ViZGV2aWNlX3R5cGUobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJCSAgICAgICBpbnQgKnR5cGUsIGludCAqc3VidHlwZSkKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJKnR5cGUgPSBNRV9UWVBFX0VYVF9JUlE7CisJKnN1YnR5cGUgPSBNRV9TVUJUWVBFX1NJTkdMRTsKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZTQ2MDBfZXh0X2lycV9xdWVyeV9zdWJkZXZpY2VfY2FwcyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJICAgICAgIGludCAqY2FwcykKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJKmNhcHMgPQorCSAgICBNRV9DQVBTX0VYVF9JUlFfRURHRV9SSVNJTkcgfCBNRV9DQVBTX0VYVF9JUlFfRURHRV9GQUxMSU5HIHwKKwkgICAgTUVfQ0FQU19FWFRfSVJRX0VER0VfQU5ZOworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsIDYsIDE5KQorc3RhdGljIGlycXJldHVybl90IG1lNDYwMF9leHRfaXJxX2lzcihpbnQgaXJxLCB2b2lkICpkZXZfaWQpCisjZWxzZQorc3RhdGljIGlycXJldHVybl90IG1lNDYwMF9leHRfaXJxX2lzcihpbnQgaXJxLCB2b2lkICpkZXZfaWQsCisJCQkJICAgICAgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCisjZW5kaWYKK3sKKwltZTQ2MDBfZXh0X2lycV9zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJdWludDMyX3QgY3RybDsKKwl1aW50MzJfdCBpcnFfc3RhdHVzOworCisJaW5zdGFuY2UgPSAobWU0NjAwX2V4dF9pcnFfc3ViZGV2aWNlX3QgKikgZGV2X2lkOworCisJaWYgKGlycSAhPSBpbnN0YW5jZS0+aXJxKSB7CisJCVBFUlJPUigiSW5jb3JyZWN0IGludGVycnVwdCBudW06ICVkLlxuIiwgaXJxKTsKKwkJcmV0dXJuIElSUV9OT05FOworCX0KKworCWlycV9zdGF0dXMgPSBpbmwoaW5zdGFuY2UtPmlycV9zdGF0dXNfcmVnKTsKKwlpZiAoIShpcnFfc3RhdHVzICYgTUU0NjAwX0lSUV9TVEFUVVNfQklUX0VYKSkgeworCQlQSU5GTygiJWxkIFNoYXJlZCBpbnRlcnJ1cHQuICVzKCk6IGlycV9zdGF0dXNfcmVnPTB4JTA0WFxuIiwKKwkJICAgICAgamlmZmllcywgX19mdW5jX18sIGlycV9zdGF0dXMpOworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJc3Bpbl9sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCWluc3RhbmNlLT5yaXNlZCA9IDE7CisJaW5zdGFuY2UtPnZhbHVlID0gaW5sKGluc3RhbmNlLT5leHRfaXJxX3ZhbHVlX3JlZyk7CisJaW5zdGFuY2UtPmNvdW50Kys7CisKKwlzcGluX2xvY2soaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2spOworCWN0cmwgPSBpbmwoaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwljdHJsIHw9IE1FNDYwMF9BSV9DVFJMX0JJVF9FWF9JUlFfUkVTRVQ7CisJb3V0bChjdHJsLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCBjdHJsKTsKKwljdHJsICY9IH5NRTQ2MDBfQUlfQ1RSTF9CSVRfRVhfSVJRX1JFU0VUOworCW91dGwoY3RybCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgY3RybCk7CisJc3Bpbl91bmxvY2soaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2spOworCisJc3Bpbl91bmxvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlX2FsbCgmaW5zdGFuY2UtPndhaXRfcXVldWUpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCittZTQ2MDBfZXh0X2lycV9zdWJkZXZpY2VfdCAqbWU0NjAwX2V4dF9pcnFfY29uc3RydWN0b3IodWludDMyX3QgcmVnX2Jhc2UsCisJCQkJCQkgICAgICAgaW50IGlycSwKKwkJCQkJCSAgICAgICBzcGlubG9ja190ICoKKwkJCQkJCSAgICAgICBjdHJsX3JlZ19sb2NrKQoreworCW1lNDYwMF9leHRfaXJxX3N1YmRldmljZV90ICpzdWJkZXZpY2U7CisJaW50IGVycjsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCS8qIEFsbG9jYXRlIG1lbW9yeSBmb3Igc3ViZGV2aWNlIGluc3RhbmNlICovCisJc3ViZGV2aWNlID0ga21hbGxvYyhzaXplb2YobWU0NjAwX2V4dF9pcnFfc3ViZGV2aWNlX3QpLCBHRlBfS0VSTkVMKTsKKworCWlmICghc3ViZGV2aWNlKSB7CisJCVBFUlJPUigiQ2Fubm90IGdldCBtZW1vcnkgZm9yIHN1YmRldmljZSBpbnN0YW5jZS5cbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwltZW1zZXQoc3ViZGV2aWNlLCAwLCBzaXplb2YobWU0NjAwX2V4dF9pcnFfc3ViZGV2aWNlX3QpKTsKKworCS8qIEluaXRpYWxpemUgc3ViZGV2aWNlIGJhc2UgY2xhc3MgKi8KKwllcnIgPSBtZV9zdWJkZXZpY2VfaW5pdCgmc3ViZGV2aWNlLT5iYXNlKTsKKworCWlmIChlcnIpIHsKKwkJUEVSUk9SKCJDYW5ub3QgaW5pdGlhbGl6ZSBzdWJkZXZpY2UgYmFzZSBjbGFzcyBpbnN0YW5jZS5cbiIpOworCQlrZnJlZShzdWJkZXZpY2UpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJLy8gSW5pdGlhbGl6ZSBzcGluIGxvY2tzLgorCXNwaW5fbG9ja19pbml0KCZzdWJkZXZpY2UtPnN1YmRldmljZV9sb2NrKTsKKworCXN1YmRldmljZS0+Y3RybF9yZWdfbG9jayA9IGN0cmxfcmVnX2xvY2s7CisKKwkvKiBJbml0aWFsaXplIHdhaXQgcXVldWUgKi8KKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzdWJkZXZpY2UtPndhaXRfcXVldWUpOworCisJLyogUmVnaXN0ZXIgaW50ZXJydXB0ICovCisJc3ViZGV2aWNlLT5pcnEgPSBpcnE7CisKKwlpZiAocmVxdWVzdF9pcnEoc3ViZGV2aWNlLT5pcnEsIG1lNDYwMF9leHRfaXJxX2lzciwKKyNpZmRlZiBJUlFGX0RJU0FCTEVECisJCQlJUlFGX0RJU0FCTEVEIHwgSVJRRl9TSEFSRUQsCisjZWxzZQorCQkJU0FfSU5URVJSVVBUIHwgU0FfU0hJUlEsCisjZW5kaWYKKwkJCU1FNDYwMF9OQU1FLCBzdWJkZXZpY2UpKSB7CisJCVBFUlJPUigiQ2Fubm90IHJlZ2lzdGVyIGludGVycnVwdC5cbiIpOworCQlrZnJlZShzdWJkZXZpY2UpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJUElORk8oIlJlZ2lzdGVyZWQgaXJxPSVkLlxuIiwgc3ViZGV2aWNlLT5pcnEpOworCisJLyogSW5pdGlhbGl6ZSByZWdpc3RlcnMgKi8KKwlzdWJkZXZpY2UtPmlycV9zdGF0dXNfcmVnID0gcmVnX2Jhc2UgKyBNRTQ2MDBfSVJRX1NUQVRVU19SRUc7CisJc3ViZGV2aWNlLT5jdHJsX3JlZyA9IHJlZ19iYXNlICsgTUU0NjAwX0FJX0NUUkxfUkVHOworCXN1YmRldmljZS0+ZXh0X2lycV9jb25maWdfcmVnID0gcmVnX2Jhc2UgKyBNRTQ2MDBfRVhUX0lSUV9DT05GSUdfUkVHOworCXN1YmRldmljZS0+ZXh0X2lycV92YWx1ZV9yZWcgPSByZWdfYmFzZSArIE1FNDYwMF9FWFRfSVJRX1ZBTFVFX1JFRzsKKyNpZmRlZiBNRURFQlVHX0RFQlVHX1JFRworCXN1YmRldmljZS0+cmVnX2Jhc2UgPSByZWdfYmFzZTsKKyNlbmRpZgorCisJLyogT3ZlcnJpZGUgYmFzZSBjbGFzcyBtZXRob2RzLiAqLworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfZGVzdHJ1Y3RvciA9IG1lNDYwMF9leHRfaXJxX2Rlc3RydWN0b3I7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19yZXNldF9zdWJkZXZpY2UgPQorCSAgICBtZTQ2MDBfZXh0X2lycV9pb19yZXNldF9zdWJkZXZpY2U7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19pcnFfc3RhcnQgPSBtZTQ2MDBfZXh0X2lycV9pb19pcnFfc3RhcnQ7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19pcnFfd2FpdCA9IG1lNDYwMF9leHRfaXJxX2lvX2lycV93YWl0OworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9faXJxX3N0b3AgPSBtZTQ2MDBfZXh0X2lycV9pb19pcnFfc3RvcDsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X251bWJlcl9jaGFubmVscyA9CisJICAgIG1lNDYwMF9leHRfaXJxX3F1ZXJ5X251bWJlcl9jaGFubmVsczsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV90eXBlID0KKwkgICAgbWU0NjAwX2V4dF9pcnFfcXVlcnlfc3ViZGV2aWNlX3R5cGU7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9zdWJkZXZpY2VfY2FwcyA9CisJICAgIG1lNDYwMF9leHRfaXJxX3F1ZXJ5X3N1YmRldmljZV9jYXBzOworCisJc3ViZGV2aWNlLT5yaXNlZCA9IDA7CisJc3ViZGV2aWNlLT5jb3VudCA9IDA7CisKKwlyZXR1cm4gc3ViZGV2aWNlOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lNDYwMF9leHRfaXJxLmggYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU0NjAwX2V4dF9pcnEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzdiMjdmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lNDYwMF9leHRfaXJxLmgKQEAgLTAsMCArMSw3OCBAQAorLyoqCisgKiBAZmlsZSBtZTQ2MDBfZXh0X2lycS5oCisgKgorICogQGJyaWVmIE1laWxoYXVzIE1FLTQwMDAgZXh0ZXJuYWwgaW50ZXJydXB0IHN1YmRldmljZSBjbGFzcy4KKyAqIEBub3RlIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKiBAYXV0aG9yIEd1ZW50ZXIgR2ViaGFyZHQKKyAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9NRTQ2MDBfRVhUX0lSUV9IXworI2RlZmluZSBfTUU0NjAwX0VYVF9JUlFfSF8KKworI2luY2x1ZGUgIm1lc3ViZGV2aWNlLmgiCisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKy8qKgorICogQGJyaWVmIFRoZSBzdWJkZXZpY2UgY2xhc3MuCisgKi8KK3R5cGVkZWYgc3RydWN0IG1lNDYwMF9leHRfaXJxX3N1YmRldmljZSB7CisJLyogSW5oZXJpdGFuY2UgKi8KKwltZV9zdWJkZXZpY2VfdCBiYXNlOwkJCS8qKjwgVGhlIHN1YmRldmljZSBiYXNlIGNsYXNzLiAqLworCisJLyogQXR0cmlidXRlcyAqLworCXNwaW5sb2NrX3Qgc3ViZGV2aWNlX2xvY2s7CQkvKio8IFNwaW4gbG9jayB0byBwcm90ZWN0IHRoZSBzdWJkZXZpY2UgZnJvbSBjb25jdXJyZW50IGFjY2Vzcy4gKi8KKwlzcGlubG9ja190ICpjdHJsX3JlZ19sb2NrOwkJLyoqPCBTcGluIGxvY2sgdG8gcHJvdGVjdCAjY3RybF9yZWcgZnJvbSBjb25jdXJyZW50IGFjY2Vzcy4gKi8KKworCXdhaXRfcXVldWVfaGVhZF90IHdhaXRfcXVldWU7CisKKwlpbnQgaXJxOworCisJaW50IHJpc2VkOworCWludCB2YWx1ZTsKKwlpbnQgY291bnQ7CisKKwl1bnNpZ25lZCBsb25nIGN0cmxfcmVnOworCXVuc2lnbmVkIGxvbmcgaXJxX3N0YXR1c19yZWc7CisJdW5zaWduZWQgbG9uZyBleHRfaXJxX2NvbmZpZ19yZWc7CisJdW5zaWduZWQgbG9uZyBleHRfaXJxX3ZhbHVlX3JlZzsKKyNpZmRlZiBNRURFQlVHX0RFQlVHX1JFRworCXVuc2lnbmVkIGxvbmcgcmVnX2Jhc2U7CisjZW5kaWYKK30gbWU0NjAwX2V4dF9pcnFfc3ViZGV2aWNlX3Q7CisKKy8qKgorICogQGJyaWVmIFRoZSBjb25zdHJ1Y3RvciB0byBnZW5lcmF0ZSBhIGV4dGVybmFsIGludGVycnVwdCBzdWJkZXZpY2UgaW5zdGFuY2UuCisgKgorICogQHBhcmFtIHJlZ19iYXNlIFRoZSByZWdpc3RlciBiYXNlIGFkZHJlc3Mgb2YgdGhlIGRldmljZSBhcyByZXR1cm5lZCBieSB0aGUgUENJIEJJT1MuCisgKiBAcGFyYW0gaXJxIFRoZSBpbnRlcnJ1cHQgbnVtYmVyIGFzc2lnbmVkIGJ5IHRoZSBQQ0kgQklPUy4KKyAqIEBwYXJhbSBjdHJsX3JlZ19sb2NrIFBvaW50ZXIgdG8gc3BpbiBsb2NrIHByb3RlY3RpbmcgdGhlIGNvbnRyb2wgcmVnaXN0ZXIgZnJvbSBjb25jdXJyZW50IGFjY2Vzcy4KKyAqCisgKiBAcmV0dXJuIFBvaW50ZXIgdG8gbmV3IGluc3RhbmNlIG9uIHN1Y2Nlc3MuXG4KKyAqIE5VTEwgb24gZXJyb3IuCisgKi8KK21lNDYwMF9leHRfaXJxX3N1YmRldmljZV90ICptZTQ2MDBfZXh0X2lycV9jb25zdHJ1Y3Rvcih1aW50MzJfdCByZWdfYmFzZSwKKwkJCQkJCSAgICAgICBpbnQgaXJxLAorCQkJCQkJICAgICAgIHNwaW5sb2NrX3QgKgorCQkJCQkJICAgICAgIGN0cmxfcmVnX2xvY2spOworCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lNDYwMF9leHRfaXJxX3JlZy5oIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lNDYwMF9leHRfaXJxX3JlZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5OGUxZTcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU0NjAwX2V4dF9pcnFfcmVnLmgKQEAgLTAsMCArMSw0MSBAQAorLyoqCisgKiBAZmlsZSBtZTQ2MDBfZXh0X2lycV9yZWcuaAorICoKKyAqIEBicmllZiBNRS00MDAwIGV4dGVybmFsIGludGVycnVwdCBzdWJkZXZpY2UgcmVnaXN0ZXIgZGVmaW5pdGlvbnMuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfTUU0NjAwX0VYVF9JUlFfUkVHX0hfCisjZGVmaW5lIF9NRTQ2MDBfRVhUX0lSUV9SRUdfSF8KKworI2lmZGVmIF9fS0VSTkVMX18KKworI2RlZmluZSBNRTQ2MDBfRVhUX0lSUV9DT05GSUdfUkVHCQkweENDCS8vIFIvXworI2RlZmluZSBNRTQ2MDBfRVhUX0lSUV9WQUxVRV9SRUcJCTB4RDAJLy8gUi9fCisKKyNkZWZpbmUgTUU0NjAwX0VYVF9JUlFfQ09ORklHX01BU0tfUklTSU5HCTB4MAorI2RlZmluZSBNRTQ2MDBfRVhUX0lSUV9DT05GSUdfTUFTS19GQUxMSU5HCTB4MQorI2RlZmluZSBNRTQ2MDBfRVhUX0lSUV9DT05GSUdfTUFTS19BTlkJCTB4MworI2RlZmluZSBNRTQ2MDBfRVhUX0lSUV9DT05GSUdfTUFTSwkJMHgzCisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU0NjAwX3JlZy5oIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lNDYwMF9yZWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTE1MmJiYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTQ2MDBfcmVnLmgKQEAgLTAsMCArMSw0NiBAQAorLyoqCisgKiBAZmlsZSBtZTQ2MDBfcmVnLmgKKyAqCisgKiBAYnJpZWYgTUUtNDAwMCByZWdpc3RlciBkZWZpbml0aW9ucy4KKyAqIEBub3RlIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKiBAYXV0aG9yIEd1ZW50ZXIgR2ViaGFyZHQKKyAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9NRTQ2MDBfUkVHX0hfCisjZGVmaW5lIF9NRTQ2MDBfUkVHX0hfCisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKyNkZWZpbmUgTUU0NjAwX0lSUV9TVEFUVVNfUkVHCQkJMHg5QwkvLyBSL18KKworI2RlZmluZSBNRTQ2MDBfSVJRX1NUQVRVU19CSVRfRVgJCTB4MDEKKyNkZWZpbmUgTUU0NjAwX0lSUV9TVEFUVVNfQklUX0xFCQkweDAyCisjZGVmaW5lIE1FNDYwMF9JUlFfU1RBVFVTX0JJVF9BSV9IRgkJMHgwNAorI2RlZmluZSBNRTQ2MDBfSVJRX1NUQVRVU19CSVRfQU9fMF9IRgkweDA4CisjZGVmaW5lIE1FNDYwMF9JUlFfU1RBVFVTX0JJVF9BT18xX0hGCTB4MTAKKyNkZWZpbmUgTUU0NjAwX0lSUV9TVEFUVVNfQklUX0FPXzJfSEYJMHgyMAorI2RlZmluZSBNRTQ2MDBfSVJRX1NUQVRVU19CSVRfQU9fM19IRgkweDQwCisjZGVmaW5lIE1FNDYwMF9JUlFfU1RBVFVTX0JJVF9TQwkJMHg4MAorCisjZGVmaW5lIE1FNDYwMF9JUlFfU1RBVFVTX0JJVF9BT19IRgkJTUU0NjAwX0lSUV9TVEFUVVNfQklUX0FPXzBfSEYKKworI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTYwMDBfYW8uYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTYwMDBfYW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NGYwMTIzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lNjAwMF9hby5jCkBAIC0wLDAgKzEsMzczOSBAQAorLyoqCisgKiBAZmlsZSBtZTYwMDBfYW8uYworICoKKyAqIEBicmllZiBNRS02MDAwIGFuYWxvZyBvdXRwdXQgc3ViZGV2aWNlIGluc3RhbmNlLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICogQGF1dGhvciBLcnp5c3p0b2YgR2FudHprZQkoay5nYW50emtlQG1laWxoYXVzLmRlKQorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX19LRVJORUxfXworIyAgZGVmaW5lIF9fS0VSTkVMX18KKyNlbmRpZgorCisvKiBJbmNsdWRlcworICovCisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisKKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKworI2luY2x1ZGUgIm1lZGVmaW5lcy5oIgorI2luY2x1ZGUgIm1laW50ZXJuYWwuaCIKKyNpbmNsdWRlICJtZWVycm9yLmgiCisKKyNpbmNsdWRlICJtZWRlYnVnLmgiCisjaW5jbHVkZSAibWVpZHMuaCIKKyNpbmNsdWRlICJtZTYwMDBfcmVnLmgiCisjaW5jbHVkZSAibWU2MDAwX2FvX3JlZy5oIgorI2luY2x1ZGUgIm1lNjAwMF9hby5oIgorCisvKiBEZWZpbmVzCisgKi8KKworc3RhdGljIGludCBtZTYwMDBfYW9fcXVlcnlfcmFuZ2VfYnlfbWluX21heChtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJICAgIGludCB1bml0LAorCQkJCQkgICAgaW50ICptaW4sCisJCQkJCSAgICBpbnQgKm1heCwgaW50ICptYXhkYXRhLCBpbnQgKnJhbmdlKTsKKworc3RhdGljIGludCBtZTYwMDBfYW9fcXVlcnlfbnVtYmVyX3JhbmdlcyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJIGludCB1bml0LCBpbnQgKmNvdW50KTsKKworc3RhdGljIGludCBtZTYwMDBfYW9fcXVlcnlfcmFuZ2VfaW5mbyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgICBpbnQgcmFuZ2UsCisJCQkJICAgICAgaW50ICp1bml0LAorCQkJCSAgICAgIGludCAqbWluLCBpbnQgKm1heCwgaW50ICptYXhkYXRhKTsKKworc3RhdGljIGludCBtZTYwMDBfYW9fcXVlcnlfdGltZXIobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJIGludCB0aW1lciwKKwkJCQkgaW50ICpiYXNlX2ZyZXF1ZW5jeSwKKwkJCQkgbG9uZyBsb25nICptaW5fdGlja3MsIGxvbmcgbG9uZyAqbWF4X3RpY2tzKTsKKworc3RhdGljIGludCBtZTYwMDBfYW9fcXVlcnlfbnVtYmVyX2NoYW5uZWxzKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQkgICBpbnQgKm51bWJlcik7CisKK3N0YXRpYyBpbnQgbWU2MDAwX2FvX3F1ZXJ5X3N1YmRldmljZV90eXBlKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQkgIGludCAqdHlwZSwgaW50ICpzdWJ0eXBlKTsKKworc3RhdGljIGludCBtZTYwMDBfYW9fcXVlcnlfc3ViZGV2aWNlX2NhcHMobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJCSAgaW50ICpjYXBzKTsKKworc3RhdGljIGludCBtZTYwMDBfYW9fcXVlcnlfc3ViZGV2aWNlX2NhcHNfYXJncyhzdHJ1Y3QgbWVfc3ViZGV2aWNlICpzdWJkZXZpY2UsCisJCQkJCSAgICAgICBpbnQgY2FwLCBpbnQgKmFyZ3MsIGludCBjb3VudCk7CisKKy8qKiBSZW1vdmUgc3ViZGV2aWNlLiAqLworc3RhdGljIHZvaWQgbWU2MDAwX2FvX2Rlc3RydWN0b3Ioc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlKTsKKworLyoqIFJlc2V0IHN1YmRldmljZS4gU3RvcCBhbGwgYWN0aW9ucy4gUmVzZXQgcmVnaXN0cnkuIERpc2FibGUgRklGTy4gU2V0IG91dHB1dCB0byAwViBhbmQgc3RhdHVzIHRvICdub25lJy4gKi8KK3N0YXRpYyBpbnQgbWU2MDAwX2FvX2lvX3Jlc2V0X3N1YmRldmljZShtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJc3RydWN0IGZpbGUgKmZpbGVwLCBpbnQgZmxhZ3MpOworCisvKiogU2V0IG91dHB1dCBhcyBzaW5nbGUgKi8KK3N0YXRpYyBpbnQgbWU2MDAwX2FvX2lvX3NpbmdsZV9jb25maWcobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICAgIGludCBjaGFubmVsLAorCQkJCSAgICAgIGludCBzaW5nbGVfY29uZmlnLAorCQkJCSAgICAgIGludCByZWYsCisJCQkJICAgICAgaW50IHRyaWdfY2hhbiwKKwkJCQkgICAgICBpbnQgdHJpZ190eXBlLCBpbnQgdHJpZ19lZGdlLCBpbnQgZmxhZ3MpOworCisvKiogUGFzcyB0byB1c2VyIGFjdHVhbCB2YWx1ZSBvZiBvdXRwdXQuICovCitzdGF0aWMgaW50IG1lNjAwMF9hb19pb19zaW5nbGVfcmVhZChtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICBpbnQgY2hhbm5lbCwKKwkJCQkgICAgaW50ICp2YWx1ZSwgaW50IHRpbWVfb3V0LCBpbnQgZmxhZ3MpOworCisvKiogV3JpdGUgdG8gb3V0cHV0IHJlcXVlZCB2YWx1ZS4gKi8KK3N0YXRpYyBpbnQgbWU2MDAwX2FvX2lvX3NpbmdsZV93cml0ZShtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgIGludCBjaGFubmVsLAorCQkJCSAgICAgaW50IHZhbHVlLCBpbnQgdGltZV9vdXQsIGludCBmbGFncyk7CisKKy8qKiBTZXQgb3V0cHV0IGFzIHN0cmVhbWVkIGRldmljZS4gKi8KK3N0YXRpYyBpbnQgbWU2MDAwX2FvX2lvX3N0cmVhbV9jb25maWcobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICAgIG1lSU9TdHJlYW1Db25maWdfdCAqIGNvbmZpZ19saXN0LAorCQkJCSAgICAgIGludCBjb3VudCwKKwkJCQkgICAgICBtZUlPU3RyZWFtVHJpZ2dlcl90ICogdHJpZ2dlciwKKwkJCQkgICAgICBpbnQgZmlmb19pcnFfdGhyZXNob2xkLCBpbnQgZmxhZ3MpOworCisvKiogV2FpdCBmb3IgLyBDaGVjayBlbXB0eSBzcGFjZSBpbiBidWZmZXIuICovCitzdGF0aWMgaW50IG1lNjAwMF9hb19pb19zdHJlYW1fbmV3X3ZhbHVlcyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJCSAgaW50IHRpbWVfb3V0LCBpbnQgKmNvdW50LCBpbnQgZmxhZ3MpOworCisvKiogU3RhcnQgc3RyZWFtaW5nLiAqLworc3RhdGljIGludCBtZTYwMDBfYW9faW9fc3RyZWFtX3N0YXJ0KG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICAgaW50IHN0YXJ0X21vZGUsIGludCB0aW1lX291dCwgaW50IGZsYWdzKTsKKworLyoqIENoZWNrIGFjdHVhbCBzdGF0ZS4gLyBXYWl0IGZvciBlbmQuICovCitzdGF0aWMgaW50IG1lNjAwMF9hb19pb19zdHJlYW1fc3RhdHVzKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgICBpbnQgd2FpdCwKKwkJCQkgICAgICBpbnQgKnN0YXR1cywgaW50ICp2YWx1ZXMsIGludCBmbGFncyk7CisKKy8qKiBTdG9wIHN0cmVhbWluZy4gKi8KK3N0YXRpYyBpbnQgbWU2MDAwX2FvX2lvX3N0cmVhbV9zdG9wKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgIGludCBzdG9wX21vZGUsIGludCBmbGFncyk7CisKKy8qKiBXcml0ZSBkYXRhcyB0byBidWZmb3IuICovCitzdGF0aWMgaW50IG1lNjAwMF9hb19pb19zdHJlYW1fd3JpdGUobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgICBpbnQgd3JpdGVfbW9kZSwKKwkJCQkgICAgIGludCAqdmFsdWVzLCBpbnQgKmNvdW50LCBpbnQgZmxhZ3MpOworCisvKiogSW50ZXJydXB0IGhhbmRsZXIuIENvcHkgZnJvbSBidWZmZXIgdG8gRklGTy4gKi8KKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiwgNiwgMTkpCitzdGF0aWMgaXJxcmV0dXJuX3QgbWU2MDAwX2FvX2lzcihpbnQgaXJxLCB2b2lkICpkZXZfaWQpOworI2Vsc2UKK3N0YXRpYyBpcnFyZXR1cm5fdCBtZTYwMDBfYW9faXNyKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworI2VuZGlmCisKKy8qKiBDb3B5IGRhdGEgZnJvbSBjaXJjdWxhciBidWZmZXIgdG8gZmlmbyAoZmFzdCkgaW4gd3JhcGFyb3VuZCBtb2RlLiAqLworaW50IGlubGluZSBhb193cml0ZV9kYXRhX3dyYXBhcm91bmQobWU2MDAwX2FvX3N1YmRldmljZV90ICogaW5zdGFuY2UsIGludCBjb3VudCwKKwkJCQkgICAgaW50IHN0YXJ0X3Bvcyk7CisKKy8qKiBDb3B5IGRhdGEgZnJvbSBjaXJjdWxhciBidWZmZXIgdG8gZmlmbyAoZmFzdCkuKi8KK2ludCBpbmxpbmUgYW9fd3JpdGVfZGF0YShtZTYwMDBfYW9fc3ViZGV2aWNlX3QgKiBpbnN0YW5jZSwgaW50IGNvdW50LAorCQkJIGludCBzdGFydF9wb3MpOworCisvKiogQ29weSBkYXRhIGZyb20gY2lyY3VsYXIgYnVmZmVyIHRvIGZpZm8gKHNsb3cpLiovCitpbnQgaW5saW5lIGFvX3dyaXRlX2RhdGFfcG9vbGluZyhtZTYwMDBfYW9fc3ViZGV2aWNlX3QgKiBpbnN0YW5jZSwgaW50IGNvdW50LAorCQkJCSBpbnQgc3RhcnRfcG9zKTsKKworLyoqIENvcHkgZGF0YSBmcm9tIHVzZXIgc3BhY2UgdG8gY2lyY3VsYXIgYnVmZmVyLiAqLworaW50IGlubGluZSBhb19nZXRfZGF0YV9mcm9tX3VzZXIobWU2MDAwX2FvX3N1YmRldmljZV90ICogaW5zdGFuY2UsIGludCBjb3VudCwKKwkJCQkgaW50ICp1c2VyX3ZhbHVlcyk7CisKKy8qKiBTdG9wIHByZXNlbnRhdGlvbi4gUHJlc2VydmUgRklGT3MuICovCitpbnQgaW5saW5lIGFvX3N0b3BfaW1tZWRpYXRlbHkobWU2MDAwX2FvX3N1YmRldmljZV90ICogaW5zdGFuY2UpOworCisvKiogRnVuY3Rpb24gZm9yIGNoZWNraW5nIHRpbWVvdXQgaW4gbm9uLWJsb2NraW5nIG1vZGUuICovCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDIwKQorc3RhdGljIHZvaWQgbWU2MDAwX2FvX3dvcmtfY29udHJvbF90YXNrKHZvaWQgKnN1YmRldmljZSk7CisjZWxzZQorc3RhdGljIHZvaWQgbWU2MDAwX2FvX3dvcmtfY29udHJvbF90YXNrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CisjZW5kaWYKKworLyogRnVuY3Rpb25zCisgKi8KKworc3RhdGljIGludCBtZTYwMDBfYW9faW9fcmVzZXRfc3ViZGV2aWNlKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQlzdHJ1Y3QgZmlsZSAqZmlsZXAsIGludCBmbGFncykKK3sKKwltZTYwMDBfYW9fc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCXVpbnQzMl90IHRtcDsKKwl1aW50MzJfdCBjdHJsOworCisJaW5zdGFuY2UgPSAobWU2MDAwX2FvX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCVBERUJVRygiZXhlY3V0ZWQuIGlkeD0lZFxuIiwgaW5zdGFuY2UtPmFvX2lkeCk7CisKKwlpZiAoZmxhZ3MpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWcgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCWluc3RhbmNlLT5zdGF0dXMgPSBhb19zdGF0dXNfbm9uZTsKKwlpbnN0YW5jZS0+YW9fY29udHJvbF90YXNrX2ZsYWcgPSAwOworCWNhbmNlbF9kZWxheWVkX3dvcmsoJmluc3RhbmNlLT5hb19jb250cm9sX3Rhc2spOworCWluc3RhbmNlLT50aW1lb3V0LmRlbGF5ID0gMDsKKwlpbnN0YW5jZS0+dGltZW91dC5zdGFydF90aW1lID0gamlmZmllczsKKworCS8vU3RvcCBzdGF0ZSBtYWNoaW5lLgorCWVyciA9IGFvX3N0b3BfaW1tZWRpYXRlbHkoaW5zdGFuY2UpOworCisJLy9SZW1vdmUgZnJvbSBzeW5jaHJvbm91cyBzdGFydC4KKwlzcGluX2xvY2soaW5zdGFuY2UtPnByZWxvYWRfcmVnX2xvY2spOworCXRtcCA9IGlubChpbnN0YW5jZS0+cHJlbG9hZF9yZWcpOworCXRtcCAmPQorCSAgICB+KChNRTYwMDBfQU9fU1lOQ19IT0xEIHwgTUU2MDAwX0FPX1NZTkNfRVhUX1RSSUcpIDw8IGluc3RhbmNlLT4KKwkgICAgICBhb19pZHgpOworCW91dGwodG1wLCBpbnN0YW5jZS0+cHJlbG9hZF9yZWcpOworCVBERUJVR19SRUcoInByZWxvYWRfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPnByZWxvYWRfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCB0bXApOworCSppbnN0YW5jZS0+cHJlbG9hZF9mbGFncyAmPQorCSAgICB+KChNRTYwMDBfQU9fU1lOQ19IT0xEIHwgTUU2MDAwX0FPX1NZTkNfRVhUX1RSSUcpIDw8IGluc3RhbmNlLT4KKwkgICAgICBhb19pZHgpOworCisJLy9SZXNldCB0cmlnZ2VyaW5nIGZsYWcKKwkqaW5zdGFuY2UtPnRyaWdnZXJpbmdfZmxhZ3MgJj0gfigweDEgPDwgaW5zdGFuY2UtPmFvX2lkeCk7CisJc3Bpbl91bmxvY2soaW5zdGFuY2UtPnByZWxvYWRfcmVnX2xvY2spOworCisJaWYgKGluc3RhbmNlLT5maWZvKSB7CisJCS8vU2V0IHNpbmdsZSBtb2RlLCBkaXNzYWJsZSBGSUZPLCBkaXNzYWJsZSBleHRlcm5hbCB0cmlnZ2VyLCBibG9jayBpbnRlcnJ1cHQuCisJCWN0cmwgPSBNRTYwMDBfQU9fTU9ERV9TSU5HTEU7CisKKwkJLy9CbG9jayBJU00uCisJCWN0cmwgfD0KKwkJICAgIChNRTYwMDBfQU9fQ1RSTF9CSVRfU1RPUCB8CisJCSAgICAgTUU2MDAwX0FPX0NUUkxfQklUX0lNTUVESUFURV9TVE9QKTsKKworCQlvdXRsKGN0cmwsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIGN0cmwpOworCQkvL1NldCBzcGVlZAorCQlvdXRsKE1FNjAwMF9BT19NSU5fQ0hBTl9USUNLUyAtIDEsIGluc3RhbmNlLT50aW1lcl9yZWcpOworCQkvL1Jlc2V0IGludGVycnVwdCBsYXRjaAorCQlpbmwoaW5zdGFuY2UtPmlycV9yZXNldF9yZWcpOworCX0KKworCWluc3RhbmNlLT5oYXJkd2FyZV9zdG9wX2RlbGF5ID0gSFogLyAxMDsJLy8xMDBtcworCisJLy9TZXQgb3V0cHV0IHRvIDBWCisJb3V0bCgweDgwMDAsIGluc3RhbmNlLT5zaW5nbGVfcmVnKTsKKwlQREVCVUdfUkVHKCJzaW5nbGVfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPnNpbmdsZV9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIDB4ODAwMCk7CisKKwlpbnN0YW5jZS0+Y2lyY19idWYuaGVhZCA9IDA7CisJaW5zdGFuY2UtPmNpcmNfYnVmLnRhaWwgPSAwOworCWluc3RhbmNlLT5wcmVsb2FkZWRfY291bnQgPSAwOworCWluc3RhbmNlLT5kYXRhX2NvdW50ID0gMDsKKwlpbnN0YW5jZS0+c2luZ2xlX3ZhbHVlID0gMHg4MDAwOworCWluc3RhbmNlLT5zaW5nbGVfdmFsdWVfaW5fZmlmbyA9IDB4ODAwMDsKKworCS8vU2V0IHN0YXR1cyB0byBzaWduYWwgdGhhdCBkZXZpY2UgaXMgdW5jb25maWd1cmVkLgorCWluc3RhbmNlLT5zdGF0dXMgPSBhb19zdGF0dXNfbm9uZTsKKwkvL1NpZ25hbCByZXNldCBpZiB1c2VyIGlzIG9uIHdhaXQuCisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlX2FsbCgmaW5zdGFuY2UtPndhaXRfcXVldWUpOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lNjAwMF9hb19pb19zaW5nbGVfY29uZmlnKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgICBpbnQgY2hhbm5lbCwKKwkJCQkgICAgICBpbnQgc2luZ2xlX2NvbmZpZywKKwkJCQkgICAgICBpbnQgcmVmLAorCQkJCSAgICAgIGludCB0cmlnX2NoYW4sCisJCQkJICAgICAgaW50IHRyaWdfdHlwZSwgaW50IHRyaWdfZWRnZSwgaW50IGZsYWdzKQoreworCW1lNjAwMF9hb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJdWludDMyX3QgY3RybDsKKwl1aW50MzJfdCBzeW5jOworCXVuc2lnbmVkIGxvbmcgY3B1X2ZsYWdzOworCisJaW5zdGFuY2UgPSAobWU2MDAwX2FvX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCVBERUJVRygiZXhlY3V0ZWQuIElEPSVkXG4iLCBpbnN0YW5jZS0+YW9faWR4KTsKKworCS8vIENoZWNraW5nIHBhcmFtZXRlcnMKKwlpZiAoZmxhZ3MpIHsKKwkJUEVSUk9SCisJCSAgICAoIkludmFsaWQgZmxhZyBzcGVjaWZpZWQuIE11c3QgYmUgTUVfSU9fU0lOR0xFX0NPTkZJR19OT19GTEFHUy5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlpZiAoaW5zdGFuY2UtPmZpZm8pIHsJLy9TdHJlYW0gaGFyZHdhcmUgKHdpdGggb3Igd2l0aG91dCBmaWZvKQorCQlpZiAoKHRyaWdfZWRnZSA9PSBNRV9UUklHX1RZUEVfU1cpCisJCSAgICAmJiAodHJpZ19lZGdlICE9IE1FX1RSSUdfRURHRV9OT05FKSkgeworCQkJUEVSUk9SCisJCQkgICAgKCJJbnZhbGlkIHRyaWdnZXIgZWRnZS4gU29mdHdhcmUgdHJpZ2dlciBoYXMgbm90IGVkZ2UuXG4iKTsKKwkJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1RSSUdfRURHRTsKKwkJfQorCisJCWlmICh0cmlnX3R5cGUgPT0gTUVfVFJJR19UWVBFX0VYVF9ESUdJVEFMKSB7CisJCQlzd2l0Y2ggKHRyaWdfZWRnZSkgeworCQkJY2FzZSBNRV9UUklHX0VER0VfQU5ZOgorCQkJY2FzZSBNRV9UUklHX0VER0VfUklTSU5HOgorCQkJY2FzZSBNRV9UUklHX0VER0VfRkFMTElORzoKKwkJCQlicmVhazsKKworCQkJZGVmYXVsdDoKKwkJCQlQRVJST1IoIkludmFsaWQgdHJpZ2dlciBlZGdlLlxuIik7CisJCQkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfVFJJR19FREdFOworCQkJfQorCQl9CisKKwkJaWYgKCh0cmlnX3R5cGUgIT0gTUVfVFJJR19UWVBFX1NXKQorCQkgICAgJiYgKHRyaWdfdHlwZSAhPSBNRV9UUklHX1RZUEVfRVhUX0RJR0lUQUwpKSB7CisJCQlQRVJST1IKKwkJCSAgICAoIkludmFsaWQgdHJpZ2dlciB0eXBlLiBUcmlnZ2VyIG11c3QgYmUgc29mdHdhcmUgb3IgZGlnaXRhbC5cbiIpOworCQkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfVFJJR19UWVBFOworCQl9CisJfSBlbHNlIHsJCS8vU2luZ2xlCisJCWlmICh0cmlnX2VkZ2UgIT0gTUVfVFJJR19FREdFX05PTkUpIHsKKwkJCVBFUlJPUgorCQkJICAgICgiSW52YWxpZCB0cmlnZ2VyIGVkZ2UuIFNpbmdsZSBvdXRwdXQgdHJpZ2dlciBoYXNuJ3Qgb3duIGVkZ2UuXG4iKTsKKwkJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1RSSUdfRURHRTsKKwkJfQorCisJCWlmICh0cmlnX3R5cGUgIT0gTUVfVFJJR19UWVBFX1NXKSB7CisJCQlQRVJST1IKKwkJCSAgICAoIkludmFsaWQgdHJpZ2dlciB0eXBlLiBUcmlnZ2VyIG11c3QgYmUgc29mdHdhcmUuXG4iKTsKKwkJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1RSSUdfVFlQRTsKKwkJfQorCisJfQorCisJaWYgKCh0cmlnX2NoYW4gIT0gTUVfVFJJR19DSEFOX0RFRkFVTFQpCisJICAgICYmICh0cmlnX2NoYW4gIT0gTUVfVFJJR19DSEFOX1NZTkNIUk9OT1VTKSkgeworCQlQRVJST1IoIkludmFsaWQgdHJpZ2dlciBjaGFubmVsIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9UUklHX0NIQU47CisJfQorLyoKKwlpZiAoKHRyaWdfdHlwZSA9PSBNRV9UUklHX1RZUEVfRVhUX0RJR0lUQUwpICYmICh0cmlnX2NoYW4gIT0gTUVfVFJJR19DSEFOX1NZTkNIUk9OT1VTKSkKKwl7CisJCVBFUlJPUigiSW52YWxpZCB0cmlnZ2VyIGNoYW5uZWwgc3BlY2lmaWVkLiBNdXN0IGJlIHN5bmNocm9ub3VzIHdoZW4gZGlnaXRhbCBpcyBjaG9vc2UuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfVFJJR19DSEFOOworCX0KKyovCisJaWYgKHJlZiAhPSBNRV9SRUZfQU9fR1JPVU5EKSB7CisJCVBFUlJPUgorCQkgICAgKCJJbnZhbGlkIHJlZmVyZW5jZS4gQW5hbG9nIG91dHB1dHMgaGF2ZSB0byBoYXZlIGdvdCBSRUZfQU9fR1JPVU5ELlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1JFRjsKKwl9CisKKwlpZiAoc2luZ2xlX2NvbmZpZyAhPSAwKSB7CisJCVBFUlJPUgorCQkgICAgKCJJbnZhbGlkIHNpbmdsZSBjb25maWcgc3BlY2lmaWVkLiBPbmx5IG9uZSByYW5nZSBmb3IgYW5sb2cgb3V0cHV0cyBpcyBhdmFpbGFibGUuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfU0lOR0xFX0NPTkZJRzsKKwl9CisKKwlpZiAoY2hhbm5lbCAhPSAwKSB7CisJCVBFUlJPUgorCQkgICAgKCJJbnZhbGlkIGNoYW5uZWwgbnVtYmVyIHNwZWNpZmllZC4gQW5hbG9nIG91dHB1dCBoYXZlIG9ubHkgb25lIGNoYW5uZWwuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwl9CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwkvL1N1YmRldmljZSBydW5uaW5nIGluIHN0cmVhbSBtb2RlIQorCWlmICgoaW5zdGFuY2UtPnN0YXR1cyA+PSBhb19zdGF0dXNfc3RyZWFtX3J1bl93YWl0KQorCSAgICAmJiAoaW5zdGFuY2UtPnN0YXR1cyA8IGFvX3N0YXR1c19zdHJlYW1fZW5kKSkgeworCQlQRVJST1IoIlN1YmRldmljZSBpcyBidXN5LlxuIik7CisJCU1FX1NVQkRFVklDRV9FWElUOworCisJCXJldHVybiBNRV9FUlJOT19TVUJERVZJQ0VfQlVTWTsKKwl9CisvLy8gQG5vdGUgRm9yIHNpbmdsZSBhbGwgY2FsbHMgKGNvbmZpZyBhbmQgd3JpdGUpIGFyZSBlcmFzaW5nIHByZXZpb3VzIHN0YXRlIQorCisJaW5zdGFuY2UtPnN0YXR1cyA9IGFvX3N0YXR1c19ub25lOworCisJLy8gQ29ycmVjdCBzaW5nbGUgbWlycm9ycworCWluc3RhbmNlLT5zaW5nbGVfdmFsdWVfaW5fZmlmbyA9IGluc3RhbmNlLT5zaW5nbGVfdmFsdWU7CisKKwkvL1N0b3AgZGV2aWNlCisJZXJyID0gYW9fc3RvcF9pbW1lZGlhdGVseShpbnN0YW5jZSk7CisJaWYgKGVycikgeworCQlQRVJST1JfQ1JJVElDQUwoIkZTTSBJUyBCVVNZIVxuIik7CisJCU1FX1NVQkRFVklDRV9FWElUOworCisJCXJldHVybiBNRV9FUlJOT19TVUJERVZJQ0VfQlVTWTsKKwl9CisKKwlpZiAoaW5zdGFuY2UtPmZpZm8pIHsJLy8gU2V0IGNvbnRyb2wgcmVnaXN0ZXIuCisJCXNwaW5fbG9ja19pcnFzYXZlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisJCS8vIFNldCBzdG9wIGJpdC4gU3RvcCBzdHJlYW1pbmcgbW9kZSAoSWYgcnVubmluZy4pLgorCQljdHJsID0gaW5sKGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCS8vUmVzZXQgYWxsIGJpdHMuCisJCWN0cmwgPQorCQkgICAgTUU2MDAwX0FPX0NUUkxfQklUX0lNTUVESUFURV9TVE9QIHwgTUU2MDAwX0FPX0NUUkxfQklUX1NUT1A7CisJCWlmICh0cmlnX3R5cGUgPT0gTUVfVFJJR19UWVBFX0VYVF9ESUdJVEFMKSB7CisJCQlQSU5GTygiRXh0ZXJuYWwgZGlnaXRhbCB0cmlnZ2VyLlxuIik7CisKKwkJCWlmICh0cmlnX2VkZ2UgPT0gTUVfVFJJR19FREdFX0FOWSkgeworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0cmwgfD0gTUU2MDAwX0FPX0NUUkxfQklUX0VYX1RSSUdfRURHRSB8IE1FNjAwMF9BT19DVFJMX0JJVF9FWF9UUklHX0VER0VfQk9USDsKKwkJCQlpbnN0YW5jZS0+Y3RybF90cmcgPQorCQkJCSAgICBNRTYwMDBfQU9fQ1RSTF9CSVRfRVhfVFJJR19FREdFIHwKKwkJCQkgICAgTUU2MDAwX0FPX0NUUkxfQklUX0VYX1RSSUdfRURHRV9CT1RIOworCQkJfSBlbHNlIGlmICh0cmlnX2VkZ2UgPT0gTUVfVFJJR19FREdFX0ZBTExJTkcpIHsKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHJsIHw9IE1FNjAwMF9BT19DVFJMX0JJVF9FWF9UUklHX0VER0U7CisJCQkJaW5zdGFuY2UtPmN0cmxfdHJnID0KKwkJCQkgICAgTUU2MDAwX0FPX0NUUkxfQklUX0VYX1RSSUdfRURHRTsKKwkJCX0gZWxzZSBpZiAodHJpZ19lZGdlID09IE1FX1RSSUdfRURHRV9SSVNJTkcpIHsKKwkJCQlpbnN0YW5jZS0+Y3RybF90cmcgPSAweDA7CisJCQl9CisJCX0gZWxzZSBpZiAodHJpZ190eXBlID09IE1FX1RSSUdfVFlQRV9TVykgeworCQkJUERFQlVHKCJTT0ZUV0FSRSBUUklHR0VSXG4iKTsKKwkJCWluc3RhbmNlLT5jdHJsX3RyZyA9IDB4MDsKKwkJfQorCQlvdXRsKGN0cmwsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIGN0cmwpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisJfSBlbHNlIHsKKwkJUERFQlVHKCJTT0ZUV0FSRSBUUklHR0VSXG4iKTsKKwl9CisKKwkvLyBTZXQgcHJlbG9hZC9zeW5jaHJvbml6YXRpb24gcmVnaXN0ZXIuCisJc3Bpbl9sb2NrKGluc3RhbmNlLT5wcmVsb2FkX3JlZ19sb2NrKTsKKworCWlmICh0cmlnX3R5cGUgPT0gTUVfVFJJR19UWVBFX1NXKSB7CisJCSppbnN0YW5jZS0+cHJlbG9hZF9mbGFncyAmPQorCQkgICAgfihNRTYwMDBfQU9fU1lOQ19FWFRfVFJJRyA8PCBpbnN0YW5jZS0+YW9faWR4KTsKKwl9IGVsc2UJCQkvL2lmICh0cmlnX3R5cGUgPT0gTUVfVFJJR19UWVBFX0VYVF9ESUdJVEFMKQorCXsKKwkJKmluc3RhbmNlLT5wcmVsb2FkX2ZsYWdzIHw9CisJCSAgICBNRTYwMDBfQU9fU1lOQ19FWFRfVFJJRyA8PCBpbnN0YW5jZS0+YW9faWR4OworCX0KKworCWlmICh0cmlnX2NoYW4gPT0gTUVfVFJJR19DSEFOX0RFRkFVTFQpIHsKKwkJKmluc3RhbmNlLT5wcmVsb2FkX2ZsYWdzICY9CisJCSAgICB+KE1FNjAwMF9BT19TWU5DX0hPTEQgPDwgaW5zdGFuY2UtPmFvX2lkeCk7CisJfSBlbHNlCQkJLy9pZiAodHJpZ19jaGFuID09IE1FX1RSSUdfQ0hBTl9TWU5DSFJPTk9VUykKKwl7CisJCSppbnN0YW5jZS0+cHJlbG9hZF9mbGFncyB8PQorCQkgICAgTUU2MDAwX0FPX1NZTkNfSE9MRCA8PCBpbnN0YW5jZS0+YW9faWR4OworCX0KKworCS8vUmVzZXQgaGFyZHdhcmUgcmVnaXN0ZXIKKwlzeW5jID0gaW5sKGluc3RhbmNlLT5wcmVsb2FkX3JlZyk7CisJUERFQlVHX1JFRygicHJlbG9hZF9yZWcgaW5sKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5wcmVsb2FkX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgc3luYyk7CisJc3luYyAmPSB+KE1FNjAwMF9BT19TWU5DX0VYVF9UUklHIDw8IGluc3RhbmNlLT5hb19pZHgpOworCXN5bmMgfD0gTUU2MDAwX0FPX1NZTkNfSE9MRCA8PCBpbnN0YW5jZS0+YW9faWR4OworCisJLy9PdXRwdXQgY29uZmlndXJlZCBpbiBkZWZhdWx0IG1vZGUgKHNhZmUgb25lKQorCW91dGwoc3luYywgaW5zdGFuY2UtPnByZWxvYWRfcmVnKTsKKwlQREVCVUdfUkVHKCJwcmVsb2FkX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5wcmVsb2FkX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgc3luYyk7CisJc3Bpbl91bmxvY2soaW5zdGFuY2UtPnByZWxvYWRfcmVnX2xvY2spOworCisJaW5zdGFuY2UtPnN0YXR1cyA9IGFvX3N0YXR1c19zaW5nbGVfY29uZmlndXJlZDsKKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZTYwMDBfYW9faW9fc2luZ2xlX3JlYWQobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgaW50IGNoYW5uZWwsCisJCQkJICAgIGludCAqdmFsdWUsIGludCB0aW1lX291dCwgaW50IGZsYWdzKQoreworCW1lNjAwMF9hb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisKKwl1bnNpZ25lZCBsb25nIGo7CisJdW5zaWduZWQgbG9uZyBkZWxheSA9IDA7CisKKwlpbnN0YW5jZSA9IChtZTYwMDBfYW9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJUERFQlVHKCJleGVjdXRlZC4gaWR4PSVkXG4iLCBpbnN0YW5jZS0+YW9faWR4KTsKKworCWlmIChmbGFncyAmIH5NRV9JT19TSU5HTEVfTk9OQkxPQ0tJTkcpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWcgc3BlY2lmaWVkLiAlZFxuIiwgZmxhZ3MpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlpZiAoKGluc3RhbmNlLT5zdGF0dXMgPj0gYW9fc3RhdHVzX3N0cmVhbV9jb25maWd1cmVkKQorCSAgICAmJiAoaW5zdGFuY2UtPnN0YXR1cyA8PSBhb19zdGF0dXNfc3RyZWFtX2VuZCkpIHsKKwkJUEVSUk9SKCJTdWJkZXZpY2Ugbm90IGNvbmZpZ3VyZWQgdG8gd29yayBpbiBzaW5nbGUgbW9kZSFcbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fUFJFVklPVVNfQ09ORklHOworCX0KKworCWlmIChjaGFubmVsICE9IDApIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGNoYW5uZWwgbnVtYmVyIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCX0KKworCWlmICh0aW1lX291dCA8IDApIHsKKwkJUEVSUk9SKCJJbnZhbGlkIHRpbWVvdXQgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1RJTUVPVVQ7CisJfQorCisJTUVfU1VCREVWSUNFX0VOVEVSOworCWlmICgoIWZsYWdzKSAmJiAoaW5zdGFuY2UtPnN0YXR1cyA9PSBhb19zdGF0dXNfc2luZ2xlX3J1bl93YWl0KSkgewkvL0Jsb2NraW5nIG1vZGUuIFdhaXQgZm9yIHRyaWdnZXIuCisJCWlmICh0aW1lX291dCkgeworCQkJZGVsYXkgPSAodGltZV9vdXQgKiBIWikgLyAxMDAwOworCQkJaWYgKGRlbGF5ID09IDApCisJCQkJZGVsYXkgPSAxOworCQl9CisKKwkJaiA9IGppZmZpZXM7CisKKwkJLy9Pbmx5IHJ1bmluZyBwcm9jZXNzIHdpbGwgaW50ZXJydXB0IHRoaXMgY2FsbC4gRXZlbnRzIGFyZSBzaWduYWxlZCB3aGVuIHN0YXR1cyBjaGFuZ2UuIFRoaXMgcHJvY2VkdXJlIGhhcyBvd24gdGltZW91dC4KKwkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoaW5zdGFuY2UtPndhaXRfcXVldWUsCisJCQkJCQkgKGluc3RhbmNlLT5zdGF0dXMgIT0KKwkJCQkJCSAgYW9fc3RhdHVzX3NpbmdsZV9ydW5fd2FpdCksCisJCQkJCQkgKGRlbGF5KSA/IGRlbGF5IDogTE9OR19NQVgpOworCisJCWlmIChpbnN0YW5jZS0+c3RhdHVzID09IGFvX3N0YXR1c19ub25lKSB7CisJCQlQREVCVUcoIlNpbmdsZSBjYW5jZWxlZC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fQ0FOQ0VMTEVEOworCQl9CisKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQlQRVJST1IoIldhaXQgb24gc3RhcnQgb2Ygc3RhdGUgbWFjaGluZSBpbnRlcnJ1cHRlZC5cbiIpOworCQkJaW5zdGFuY2UtPnN0YXR1cyA9IGFvX3N0YXR1c19ub25lOworCQkJYW9fc3RvcF9pbW1lZGlhdGVseShpbnN0YW5jZSk7CisJCQllcnIgPSBNRV9FUlJOT19TSUdOQUw7CisJCX0KKworCQlpZiAoKGRlbGF5KSAmJiAoKGppZmZpZXMgLSBqKSA+PSBkZWxheSkpIHsKKwkJCVBERUJVRygiVGltZW91dCByZWFjaGVkLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19USU1FT1VUOworCQl9CisKKwkJKnZhbHVlID0KKwkJICAgICghZXJyKSA/IGluc3RhbmNlLT5zaW5nbGVfdmFsdWVfaW5fZmlmbyA6IGluc3RhbmNlLT4KKwkJICAgIHNpbmdsZV92YWx1ZTsKKwl9IGVsc2UgewkJLy9Ob24tYmxvY2tpbmcgbW9kZQorCQkvL1JlYWQgdmFsdWUKKwkJKnZhbHVlID0gaW5zdGFuY2UtPnNpbmdsZV92YWx1ZTsKKwl9CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWU2MDAwX2FvX2lvX3NpbmdsZV93cml0ZShtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgIGludCBjaGFubmVsLAorCQkJCSAgICAgaW50IHZhbHVlLCBpbnQgdGltZV9vdXQsIGludCBmbGFncykKK3sKKwltZTYwMDBfYW9fc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCXVuc2lnbmVkIGxvbmcgY3B1X2ZsYWdzOworCXVuc2lnbmVkIGxvbmcgajsKKwl1bnNpZ25lZCBsb25nIGRlbGF5ID0gMDsKKworCXVpbnQzMl90IHN5bmNfbWFzazsKKwl1aW50MzJfdCBtb2RlOworCisJdWludDMyX3QgdG1wOworCisvLy8gV29ya2Fyb3VuZCBmb3IgbWl4LW1vZGUgLSBiZWdpbgorCXVpbnQzMl90IGN0cmwgPSAweDA7CisJdWludDMyX3Qgc3RhdHVzOworLy8vIFdvcmthcm91bmQgZm9yIG1peC1tb2RlIC0gZW5kCisKKwlpbnN0YW5jZSA9IChtZTYwMDBfYW9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJUERFQlVHKCJleGVjdXRlZC4gaWR4PSVkXG4iLCBpbnN0YW5jZS0+YW9faWR4KTsKKworCWlmIChmbGFncyAmCisJICAgIH4oTUVfSU9fU0lOR0xFX1RZUEVfVFJJR19TWU5DSFJPTk9VUyB8CisJICAgICAgTUVfSU9fU0lOR0xFX1RZUEVfV1JJVEVfTk9OQkxPQ0tJTkcpKSB7CisJCVBFUlJPUigiSW52YWxpZCBmbGFnIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlpZiAoKGluc3RhbmNlLT5zdGF0dXMgPT0gYW9fc3RhdHVzX25vbmUpCisJICAgIHx8IChpbnN0YW5jZS0+c3RhdHVzID4gYW9fc3RhdHVzX3NpbmdsZV9lbmQpKSB7CisJCVBFUlJPUigiU3ViZGV2aWNlIG5vdCBjb25maWd1cmVkIHRvIHdvcmsgaW4gc2luZ2xlIG1vZGUhXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX1BSRVZJT1VTX0NPTkZJRzsKKwl9CisKKwlpZiAoY2hhbm5lbCAhPSAwKSB7CisJCVBFUlJPUigiSW52YWxpZCBjaGFubmVsIG51bWJlciBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwl9CisKKwlpZiAodmFsdWUgJiB+TUU2MDAwX0FPX01BWF9EQVRBKSB7CisJCVBFUlJPUigiSW52YWxpZCB2YWx1ZSBwcm92aWRlZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fVkFMVUVfT1VUX09GX1JBTkdFOworCX0KKworCWlmICh0aW1lX291dCA8IDApIHsKKwkJUEVSUk9SKCJJbnZhbGlkIHRpbWVvdXQgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1RJTUVPVVQ7CisJfQorCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisvLy8gQG5vdGUgRm9yIHNpbmdsZSBhbGwgY2FsbHMgKGNvbmZpZyBhbmQgd3JpdGUpIGFyZSBlcmFzaW5nIHByZXZpb3VzIHN0YXRlIQorCisJLy9DYW5jZWwgY29udHJvbCB0YXNrCisJUERFQlVHKCJDYW5jZWwgY29udHJvbCB0YXNrLiBpZHg9JWRcbiIsIGluc3RhbmNlLT5hb19pZHgpOworCWluc3RhbmNlLT5hb19jb250cm9sX3Rhc2tfZmxhZyA9IDA7CisJY2FuY2VsX2RlbGF5ZWRfd29yaygmaW5zdGFuY2UtPmFvX2NvbnRyb2xfdGFzayk7CisKKwkvLyBDb3JyZWN0IHNpbmdsZSBtaXJyb3JzCisJaW5zdGFuY2UtPnNpbmdsZV92YWx1ZV9pbl9maWZvID0gaW5zdGFuY2UtPnNpbmdsZV92YWx1ZTsKKworCS8vU3RvcCBkZXZpY2UKKwllcnIgPSBhb19zdG9wX2ltbWVkaWF0ZWx5KGluc3RhbmNlKTsKKwlpZiAoZXJyKSB7CisJCVBFUlJPUl9DUklUSUNBTCgiRlNNIElTIEJVU1khXG4iKTsKKwkJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwkJcmV0dXJuIE1FX0VSUk5PX1NVQkRFVklDRV9CVVNZOworCX0KKworCWlmICh0aW1lX291dCkgeworCQlkZWxheSA9ICh0aW1lX291dCAqIEhaKSAvIDEwMDA7CisKKwkJaWYgKGRlbGF5ID09IDApCisJCQlkZWxheSA9IDE7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKworCWluc3RhbmNlLT5zaW5nbGVfdmFsdWVfaW5fZmlmbyA9IHZhbHVlOworCisJaWYgKGluc3RhbmNlLT5maWZvKSB7CisJCWN0cmwgPSBpbmwoaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwl9CisKKwlpZiAoaW5zdGFuY2UtPmZpZm8gJiBNRTYwMDBfQU9fSEFTX0ZJRk8pIHsJLy8vIFdvcmthcm91bmQgZm9yIG1peC1tb2RlIC0gYmVnaW4KKwkJLy9TZXQgc3BlZWQKKwkJb3V0bChNRTYwMDBfQU9fTUlOX0NIQU5fVElDS1MgLSAxLCBpbnN0YW5jZS0+dGltZXJfcmVnKTsKKwkJUERFQlVHX1JFRygidGltZXJfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkgICBpbnN0YW5jZS0+dGltZXJfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgKGludClNRTYwMDBfQU9fTUlOX0NIQU5fVElDS1MpOworCQlpbnN0YW5jZS0+aGFyZHdhcmVfc3RvcF9kZWxheSA9IEhaIC8gMTA7CS8vMTAwbXMKKworCQlzdGF0dXMgPSBpbmwoaW5zdGFuY2UtPnN0YXR1c19yZWcpOworCisJCS8vU2V0IHRoZSBjb250aW5vdXMgbW9kZS4KKwkJY3RybCAmPSB+TUU2MDAwX0FPX0NUUkxfTU9ERV9NQVNLOworCQljdHJsIHw9IE1FNjAwMF9BT19NT0RFX0NPTlRJTlVPVVM7CisKKwkJLy9QcmVwYXJlIEZJRk8KKwkJaWYgKCEoY3RybCAmIE1FNjAwMF9BT19DVFJMX0JJVF9FTkFCTEVfRklGTykpIHsJLy9GSUZPIHdhc24ndCBlbmFiZWxlZC4gRG8gaXQuCisJCQlQSU5GTygiRW5hYmxlaW5nIEZJRk8uXG4iKTsKKwkJCWN0cmwgJj0gfk1FNjAwMF9BT19DVFJMX0JJVF9FTkFCTEVfSVJROworCQkJY3RybCB8PSBNRTYwMDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0ZJRk87CisJCX0gZWxzZSB7CS8vQ2hlY2sgaWYgRklGTyBpcyBlbXB0eQorCQkJaWYgKHN0YXR1cyAmIE1FNjAwMF9BT19TVEFUVVNfQklUX0VGKSB7CS8vRklGTyBub3QgZW1wdHkKKwkJCQlQSU5GTygiUmVzZXRpbmcgRklGTy5cbiIpOworCQkJCWN0cmwgJj0KKwkJCQkgICAgfihNRTYwMDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0ZJRk8gfAorCQkJCSAgICAgIE1FNjAwMF9BT19DVFJMX0JJVF9FTkFCTEVfSVJRKTsKKwkJCQlvdXRsKGN0cmwsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCQkJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLQorCQkJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsIGN0cmwpOworCisJCQkJY3RybCB8PSBNRTYwMDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0ZJRk87CisJCQl9IGVsc2UgewkvL0ZJRk8gZW1wdHksIG9ubHkgaW50ZXJydXB0IG5lZWRzIHRvIGJlIGRpc2FibGVkIQorCQkJCWN0cmwgJj0gfk1FNjAwMF9BT19DVFJMX0JJVF9FTkFCTEVfSVJROworCQkJfQorCQl9CisKKwkJb3V0bChjdHJsLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCBjdHJsKTsKKworCQkvL1Jlc2V0IGludGVycnVwdCBsYXRjaAorCQlpbmwoaW5zdGFuY2UtPmlycV9yZXNldF9yZWcpOworCisJCS8vV3JpdGUgb3V0cHV0IC0gMSB2YWx1ZSB0byBGSUZPCisJCWlmIChpbnN0YW5jZS0+YW9faWR4ICYgMHgxKSB7CisJCQlvdXRsKHZhbHVlIDw8PSAxNiwgaW5zdGFuY2UtPmZpZm9fcmVnKTsKKwkJCVBERUJVR19SRUcoImZpZm9fcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIGluc3RhbmNlLT5maWZvX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICB2YWx1ZSA8PD0gMTYpOworCQl9IGVsc2UgeworCQkJb3V0bCh2YWx1ZSwgaW5zdGFuY2UtPmZpZm9fcmVnKTsKKwkJCVBERUJVR19SRUcoImZpZm9fcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIGluc3RhbmNlLT5maWZvX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICB2YWx1ZSk7CisJCX0KKwkJLy8vIFdvcmthcm91bmQgZm9yIG1peC1tb2RlIC0gZW5kCisJfSBlbHNlIHsJCS8vTm8gRklGTyAtIGFsd2F5cyBpbiBzaW5nbGUgbW9kZQorCQkvL1dyaXRlIHZhbHVlCisJCVBERUJVRygiV3JpdGUgdmFsdWVcbiIpOworCQlvdXRsKHZhbHVlLCBpbnN0YW5jZS0+c2luZ2xlX3JlZyk7CisJCVBERUJVR19SRUcoInNpbmdsZV9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgIGluc3RhbmNlLT5zaW5nbGVfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCB2YWx1ZSk7CisJfQorCisJbW9kZSA9ICppbnN0YW5jZS0+cHJlbG9hZF9mbGFncyA+PiBpbnN0YW5jZS0+YW9faWR4OworCW1vZGUgJj0gKE1FNjAwMF9BT19TWU5DX0hPTEQgfCBNRTYwMDBfQU9fU1lOQ19FWFRfVFJJRyk7CisKKwlQSU5GTygiVHJpZ2dlcmluZyBtb2RlOiAweCUwOHhcbiIsIG1vZGUpOworCisJc3Bpbl9sb2NrKGluc3RhbmNlLT5wcmVsb2FkX3JlZ19sb2NrKTsKKwlzeW5jX21hc2sgPSBpbmwoaW5zdGFuY2UtPnByZWxvYWRfcmVnKTsKKwlQREVCVUdfUkVHKCJwcmVsb2FkX3JlZyBpbmwoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPnByZWxvYWRfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCBzeW5jX21hc2spOworCXN3aXRjaCAobW9kZSkgeworCWNhc2UgMDoJCS8vMHgwMDAwMDAwMDogSW5kaXZpZHVhbCBzb2Z0d2FyZQorCQljdHJsICY9IH5NRTYwMDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0VYX1RSSUc7CisKKwkJaWYgKGluc3RhbmNlLT5maWZvICYgTUU2MDAwX0FPX0hBU19GSUZPKSB7CS8vIEZJRk8gLSBDb250aW5vdXMgbW9kZQorCQkJY3RybCAmPSB+TUU2MDAwX0FPX0NUUkxfQklUX0VOQUJMRV9FWF9UUklHOworCQkJaWYgKChzeW5jX21hc2sgJiAoKE1FNjAwMF9BT19TWU5DX0hPTEQgfCBNRTYwMDBfQU9fU1lOQ19FWFRfVFJJRykgPDwgaW5zdGFuY2UtPmFvX2lkeCkpICE9IDB4MCkgewkvL05vdyB3ZSBjYW4gc2V0IGNvcnJlY3QgbW9kZS4KKwkJCQlzeW5jX21hc2sgJj0KKwkJCQkgICAgfigoTUU2MDAwX0FPX1NZTkNfRVhUX1RSSUcgfAorCQkJCSAgICAgICBNRTYwMDBfQU9fU1lOQ19IT0xEKSA8PCBpbnN0YW5jZS0+CisJCQkJICAgICAgYW9faWR4KTsKKworCQkJCW91dGwoc3luY19tYXNrLCBpbnN0YW5jZS0+cHJlbG9hZF9yZWcpOworCQkJCVBERUJVR19SRUcKKwkJCQkgICAgKCJwcmVsb2FkX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJCSAgICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgICAgaW5zdGFuY2UtPnByZWxvYWRfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgICAgc3luY19tYXNrKTsKKwkJCX0KKwkJfSBlbHNlIHsJLy8gTm8gRklGTyAtIFNpbmdsZSBtb2RlOiBJbiB0aGlzIGNhc2UgcmVzZXR0aW5nICdNRTYwMDBfQU9fU1lOQ19IT0xEJyB3aWxsIHRyaWdnZXIgb3V0cHV0LgorCQkJaWYgKChzeW5jX21hc2sgJiAoKE1FNjAwMF9BT19TWU5DX0hPTEQgfCBNRTYwMDBfQU9fU1lOQ19FWFRfVFJJRykgPDwgaW5zdGFuY2UtPmFvX2lkeCkpICE9IE1FNjAwMF9BT19TWU5DX0hPTEQpIHsJLy9Ob3cgd2UgY2FuIHNldCBjb3JyZWN0IG1vZGUuIFRoaXMgaXMgZXhjZXB0aW9uLiBJdCBpcyBzZXQgdG8gc3luY2hyb25vdXMgYW5kIHRyaWdnZXJlZCBsYXRlci4KKwkJCQlzeW5jX21hc2sgJj0KKwkJCQkgICAgfihNRTYwMDBfQU9fU1lOQ19FWFRfVFJJRyA8PCBpbnN0YW5jZS0+CisJCQkJICAgICAgYW9faWR4KTsKKwkJCQlzeW5jX21hc2sgfD0KKwkJCQkgICAgTUU2MDAwX0FPX1NZTkNfSE9MRCA8PCBpbnN0YW5jZS0+YW9faWR4OworCisJCQkJb3V0bChzeW5jX21hc2ssIGluc3RhbmNlLT5wcmVsb2FkX3JlZyk7CisJCQkJUERFQlVHX1JFRworCQkJCSAgICAoInByZWxvYWRfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkJICAgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgICBpbnN0YW5jZS0+cHJlbG9hZF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgICBzeW5jX21hc2spOworCQkJfQorCQl9CisJCWluc3RhbmNlLT5zaW5nbGVfdmFsdWUgPSB2YWx1ZTsKKwkJYnJlYWs7CisKKwljYXNlIE1FNjAwMF9BT19TWU5DX0VYVF9UUklHOgkvLzB4MDAwMTAwMDA6IEluZGl2aWR1YWwgaGFyZHdhcmUKKwkJUERFQlVHKCJESUdJVEFMIFRSSUdHRVJcbiIpOworCQljdHJsIHw9IE1FNjAwMF9BT19DVFJMX0JJVF9FTkFCTEVfRVhfVFJJRzsKKworCQlpZiAoaW5zdGFuY2UtPmZpZm8gJiBNRTYwMDBfQU9fSEFTX0ZJRk8pIHsJLy8gRklGTyAtIENvbnRpbm91cyBtb2RlCisJCQlpZiAoKHN5bmNfbWFzayAmICgoTUU2MDAwX0FPX1NZTkNfSE9MRCB8IE1FNjAwMF9BT19TWU5DX0VYVF9UUklHKSA8PCBpbnN0YW5jZS0+YW9faWR4KSkgIT0gMHgwKSB7CS8vTm93IHdlIGNhbiBzZXQgY29ycmVjdCBtb2RlLgorCQkJCXN5bmNfbWFzayAmPQorCQkJCSAgICB+KChNRTYwMDBfQU9fU1lOQ19FWFRfVFJJRyB8CisJCQkJICAgICAgIE1FNjAwMF9BT19TWU5DX0hPTEQpIDw8IGluc3RhbmNlLT4KKwkJCQkgICAgICBhb19pZHgpOworCisJCQkJb3V0bChzeW5jX21hc2ssIGluc3RhbmNlLT5wcmVsb2FkX3JlZyk7CisJCQkJUERFQlVHX1JFRworCQkJCSAgICAoInByZWxvYWRfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkJICAgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgICBpbnN0YW5jZS0+cHJlbG9hZF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgICBzeW5jX21hc2spOworCQkJfQorCQl9IGVsc2UgewkvLyBObyBGSUZPIC0gU2luZ2xlIG1vZGUKKwkJCWlmICgoc3luY19tYXNrICYKKwkJCSAgICAgKChNRTYwMDBfQU9fU1lOQ19IT0xEIHwgTUU2MDAwX0FPX1NZTkNfRVhUX1RSSUcpIDw8CisJCQkgICAgICBpbnN0YW5jZS0+YW9faWR4KSkgIT0gTUU2MDAwX0FPX1NZTkNfSE9MRCkgeworCQkJCS8vTm93IHdlIGNhbiBzZXQgY29ycmVjdCBtb2RlCisJCQkJc3luY19tYXNrICY9CisJCQkJICAgIH4oTUU2MDAwX0FPX1NZTkNfRVhUX1RSSUcgPDwgaW5zdGFuY2UtPgorCQkJCSAgICAgIGFvX2lkeCk7CisJCQkJc3luY19tYXNrIHw9CisJCQkJICAgIE1FNjAwMF9BT19TWU5DX0hPTEQgPDwgaW5zdGFuY2UtPmFvX2lkeDsKKworCQkJCW91dGwoc3luY19tYXNrLCBpbnN0YW5jZS0+cHJlbG9hZF9yZWcpOworCQkJCVBERUJVR19SRUcKKwkJCQkgICAgKCJwcmVsb2FkX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJCSAgICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgICAgaW5zdGFuY2UtPnByZWxvYWRfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgICAgc3luY19tYXNrKTsKKwkJCX0KKwkJfQorCQlicmVhazsKKworCWNhc2UgTUU2MDAwX0FPX1NZTkNfSE9MRDoJLy8weDAwMDAwMDAxOiBTeW5jaHJvbm91cyBzb2Z0d2FyZQorCQljdHJsICY9IH5NRTYwMDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0VYX1RSSUc7CisKKwkJaWYgKChzeW5jX21hc2sgJgorCQkgICAgICgoTUU2MDAwX0FPX1NZTkNfSE9MRCB8IE1FNjAwMF9BT19TWU5DX0VYVF9UUklHKSA8PAorCQkgICAgICBpbnN0YW5jZS0+YW9faWR4KSkgIT0KKwkJICAgIChNRTYwMDBfQU9fU1lOQ19IT0xEIHwgTUU2MDAwX0FPX1NZTkNfRVhUX1RSSUcpKSB7CisJCQkvL05vdyB3ZSBjYW4gc2V0IGNvcnJlY3QgbW9kZQorCQkJc3luY19tYXNrIHw9CisJCQkgICAgTUU2MDAwX0FPX1NZTkNfRVhUX1RSSUcgPDwgaW5zdGFuY2UtPmFvX2lkeDsKKwkJCXN5bmNfbWFzayB8PSBNRTYwMDBfQU9fU1lOQ19IT0xEIDw8IGluc3RhbmNlLT5hb19pZHg7CisJCQlvdXRsKHN5bmNfbWFzaywgaW5zdGFuY2UtPnByZWxvYWRfcmVnKTsKKwkJCVBERUJVR19SRUcoInByZWxvYWRfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIGluc3RhbmNlLT5wcmVsb2FkX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICBzeW5jX21hc2spOworCQl9CisJCS8vU2V0IHRyaWdnZXJpbmcgZmxhZworCQkqaW5zdGFuY2UtPnRyaWdnZXJpbmdfZmxhZ3MgfD0gMHgxIDw8IGluc3RhbmNlLT5hb19pZHg7CisJCWJyZWFrOworCisJY2FzZSAoTUU2MDAwX0FPX1NZTkNfSE9MRCB8IE1FNjAwMF9BT19TWU5DX0VYVF9UUklHKToJLy8weDAwMDEwMDAxOiBTeW5jaHJvbm91cyBoYXJkd2FyZQorCQlQREVCVUcoIkRJR0lUQUwgVFJJR0dFUlxuIik7CisJCWN0cmwgfD0gTUU2MDAwX0FPX0NUUkxfQklUX0VOQUJMRV9FWF9UUklHOworCisJCWlmICgoc3luY19tYXNrICYKKwkJICAgICAoKE1FNjAwMF9BT19TWU5DX0hPTEQgfCBNRTYwMDBfQU9fU1lOQ19FWFRfVFJJRykgPDwKKwkJICAgICAgaW5zdGFuY2UtPmFvX2lkeCkpICE9CisJCSAgICAoTUU2MDAwX0FPX1NZTkNfSE9MRCB8IE1FNjAwMF9BT19TWU5DX0VYVF9UUklHKSkgeworCQkJLy9Ob3cgd2UgY2FuIHNldCBjb3JyZWN0IG1vZGUKKwkJCXN5bmNfbWFzayB8PQorCQkJICAgIChNRTYwMDBfQU9fU1lOQ19IT0xEIHwgTUU2MDAwX0FPX1NZTkNfRVhUX1RSSUcpIDw8CisJCQkgICAgaW5zdGFuY2UtPmFvX2lkeDsKKwkJCW91dGwoc3luY19tYXNrLCBpbnN0YW5jZS0+cHJlbG9hZF9yZWcpOworCQkJUERFQlVHX1JFRygicHJlbG9hZF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgaW5zdGFuY2UtPnByZWxvYWRfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIHN5bmNfbWFzayk7CisJCX0KKwkJLy9TZXQgdHJpZ2dlcmluZyBmbGFnCisJCSppbnN0YW5jZS0+dHJpZ2dlcmluZ19mbGFncyB8PSAweDEgPDwgaW5zdGFuY2UtPmFvX2lkeDsKKwkJYnJlYWs7CisJfQorLy8gICAgICAgICAgICAgIHNwaW5fdW5sb2NrKGluc3RhbmNlLT5wcmVsb2FkX3JlZ19sb2NrKTsgICAgICAgIC8vIE1vdmVkIGRvd24uCisKKwlpZiAoaW5zdGFuY2UtPmZpZm8pIHsJLy9BY3RpdmF0ZSBJU00gKHJlbW92ZSAnc3RvcCcgYml0cykKKwkJY3RybCAmPQorCQkgICAgfihNRTYwMDBfQU9fQ1RSTF9CSVRfRVhfVFJJR19FREdFIHwKKwkJICAgICAgTUU2MDAwX0FPX0NUUkxfQklUX0VYX1RSSUdfRURHRV9CT1RIKTsKKwkJY3RybCB8PSBpbnN0YW5jZS0+Y3RybF90cmc7CisJCWN0cmwgJj0KKwkJICAgIH4oTUU2MDAwX0FPX0NUUkxfQklUX1NUT1AgfAorCQkgICAgICBNRTYwMDBfQU9fQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1ApOworCisJCW91dGwoY3RybCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgY3RybCk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKworLy8vIEBub3RlIFdoZW4gZmxhZyAnTUVfSU9fU0lOR0xFX1RZUEVfVFJJR19TWU5DSFJPTk9VUycgaXMgc2V0IHRoYW4gb3V0cHV0IGlzIHRyaWdnZXJlZC4gQUxXQVlTIQorCisJUElORk8oIjwlcz4gc3RhcnQgbW9kZT0gMHglMDh4ICVzXG4iLCBfX2Z1bmNfXywgbW9kZSwKKwkgICAgICAoZmxhZ3MgJiBNRV9JT19TSU5HTEVfVFlQRV9UUklHX1NZTkNIUk9OT1VTKSA/ICJTWU5DSFJPTk9VUyIgOgorCSAgICAgICIiKTsKKwlpZiAoaW5zdGFuY2UtPmZpZm8gJiBNRTYwMDBfQU9fSEFTX0ZJRk8pIHsJLy8gRklGTyAtIENvbnRpbm91cyBtb2RlCisJCWlmIChmbGFncyAmIE1FX0lPX1NJTkdMRV9UWVBFX1RSSUdfU1lOQ0hST05PVVMpIHsJLy9UcmlnZ2VyIG91dHB1dHMKKwkJCS8vQWRkIGNoYW5uZWwgdG8gc3RhcnQgbGlzdAorCQkJb3V0bChzeW5jX21hc2sgfAorCQkJICAgICAoTUU2MDAwX0FPX1NZTkNfSE9MRCA8PCBpbnN0YW5jZS0+YW9faWR4KSwKKwkJCSAgICAgaW5zdGFuY2UtPnByZWxvYWRfcmVnKTsKKwkJCVBERUJVR19SRUcoInByZWxvYWRfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIGluc3RhbmNlLT5wcmVsb2FkX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICBzeW5jX21hc2sgfCAoTUU2MDAwX0FPX1NZTkNfSE9MRCA8PAorCQkJCQkJaW5zdGFuY2UtPmFvX2lkeCkpOworCisJCQkvL0ZpcmUKKwkJCVBJTkZPCisJCQkgICAgKCJGaXJlZCBhbGwgc29mdHdhcmUgc3luY2hyb25vdXMgb3V0cHV0cyBieSBzb2Z0d2FyZSB0cmlnZ2VyLlxuIik7CisJCQlvdXRsKDB4ODAwMCwgaW5zdGFuY2UtPnNpbmdsZV9yZWcpOworCQkJUERFQlVHX1JFRygic2luZ2xlX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICBpbnN0YW5jZS0+c2luZ2xlX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICAweDgwMDApOworCisJCQkvL1Jlc3RvcmUgc2F2ZSBzZXR0aW5ncworCQkJb3V0bChzeW5jX21hc2ssIGluc3RhbmNlLT5wcmVsb2FkX3JlZyk7CisJCQlQREVCVUdfUkVHKCJwcmVsb2FkX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICBpbnN0YW5jZS0+cHJlbG9hZF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgc3luY19tYXNrKTsKKworCQl9IGVsc2UgaWYgKCFtb2RlKSB7CS8vVHJpZ2dlciBvdXRwdXRzCisvKgkJCS8vUmVtb3ZlIGNoYW5uZWwgZnJvbSBzdGFydCBsaXN0CisJCQlvdXRsKHN5bmNfbWFzayAmIH4oTUU2MDAwX0FPX1NZTkNfSE9MRCA8PCBpbnN0YW5jZS0+YW9faWR4KSwgaW5zdGFuY2UtPnByZWxvYWRfcmVnKTsKKwkJCVBERUJVR19SRUcoInByZWxvYWRfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwgaW5zdGFuY2UtPnByZWxvYWRfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCBzeW5jX21hc2sgJiB+KE1FNjAwMF9BT19TWU5DX0hPTEQgPDwgaW5zdGFuY2UtPmFvX2lkeCkpOworKi8KKwkJCS8vRmlyZQorCQkJUElORk8oIlNvZnR3YXJlIHRyaWdnZXIuXG4iKTsKKwkJCW91dGwoMHg4MDAwLCBpbnN0YW5jZS0+c2luZ2xlX3JlZyk7CisJCQlQREVCVUdfUkVHKCJzaW5nbGVfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIGluc3RhbmNlLT5zaW5nbGVfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIDB4ODAwMCk7CisKKy8qCQkJLy9SZXN0b3JlIHNhdmUgc2V0dGluZ3MKKwkJCW91dGwoc3luY19tYXNrLCBpbnN0YW5jZS0+cHJlbG9hZF9yZWcpOworCQkJUERFQlVHX1JFRygicHJlbG9hZF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLCBpbnN0YW5jZS0+cHJlbG9hZF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIHN5bmNfbWFzayk7CisqLworCQl9CisvLy8gQG5vdGUgVGhpcyBpcyBtaXgtbW9kZSBjYXNlLiBGb3Igbm93IEkgZG8gbm90IGhhdmUgcG9zc2liaWxpdHkgdG8gdHJpZ2dlciBmaXJzdCA0IGNoYW5uZWxzIChjb250aW5vdXMgbW9kZSkgYW5kIG90aGVyIChzaW5nbGUpIG9uZXMgYXQgb25jZS4KKy8vLyBAbm90ZSBCZWNhdXNlIHRyaWdnZXJpbmcgaXMgbm90IHdvcmtpbmcgaXQgY2FuIG5vdCBiZSBhZGQgdG8gc3luY2hyb25vdXMgbGlzdC4gRmlyc3QgNCBjaGFubmVscyBkb24ndCBuZWVkIHRoaXMgaW5mb3JtYXRpb24sIGFueXdheS4KKwkJKmluc3RhbmNlLT50cmlnZ2VyaW5nX2ZsYWdzICY9IDB4RkZGRkZGRjA7CisJfSBlbHNlIHsJCS8vIE5vIEZJRk8gLSBTaW5nbGUgbW9kZQorCQlpZiAoZmxhZ3MgJiBNRV9JT19TSU5HTEVfVFlQRV9UUklHX1NZTkNIUk9OT1VTKSB7CS8vRmlyZWQgYWxsIHNvZnR3YXJlIHN5bmNocm9ub3VzIG91dHB1dHMuCisJCQl0bXAgPSB+KCppbnN0YW5jZS0+cHJlbG9hZF9mbGFncyB8IDB4RkZGRjAwMDApOworCQkJUElORk8KKwkJCSAgICAoIkZpcmVkIGFsbCBzb2Z0d2FyZSBzeW5jaHJvbm91cyBvdXRwdXRzLiBtYXNrOjB4JTA4eFxuIiwKKwkJCSAgICAgdG1wKTsKKwkJCXRtcCB8PSBzeW5jX21hc2sgJiAweEZGRkYwMDAwOworCQkJLy8gQWRkIHRoaXMgY2hhbm5lbCB0byBsaXN0CisJCQl0bXAgJj0gfihNRTYwMDBfQU9fU1lOQ19IT0xEIDw8IGluc3RhbmNlLT5hb19pZHgpOworCisJCQkvL0ZpcmUKKwkJCVBJTkZPKCJTb2Z0d2FyZSB0cmlnZ2VyLlxuIik7CisJCQlvdXRsKHRtcCwgaW5zdGFuY2UtPnByZWxvYWRfcmVnKTsKKwkJCVBERUJVR19SRUcoInByZWxvYWRfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIGluc3RhbmNlLT5wcmVsb2FkX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICB0bXApOworCisJCQkvL1Jlc3RvcmUgc2F2ZSBzZXR0aW5ncworCQkJb3V0bChzeW5jX21hc2ssIGluc3RhbmNlLT5wcmVsb2FkX3JlZyk7CisJCQlQREVCVUdfUkVHKCJwcmVsb2FkX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICBpbnN0YW5jZS0+cHJlbG9hZF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgc3luY19tYXNrKTsKKworCQkJLy9TZXQgYWxsIGFzIHRyaWdnZXJlZC4KKwkJCSppbnN0YW5jZS0+dHJpZ2dlcmluZ19mbGFncyA9IDB4MDsKKwkJfSBlbHNlIGlmICghbW9kZSkgewkvLyBBZGQgdGhpcyBjaGFubmVsIHRvIGxpc3QKKwkJCW91dGwoc3luY19tYXNrICYKKwkJCSAgICAgfihNRTYwMDBfQU9fU1lOQ19IT0xEIDw8IGluc3RhbmNlLT5hb19pZHgpLAorCQkJICAgICBpbnN0YW5jZS0+cHJlbG9hZF9yZWcpOworCQkJUERFQlVHX1JFRygicHJlbG9hZF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgaW5zdGFuY2UtPnByZWxvYWRfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIHN5bmNfbWFzayAmIH4oTUU2MDAwX0FPX1NZTkNfSE9MRCA8PAorCQkJCQkJIGluc3RhbmNlLT5hb19pZHgpKTsKKworCQkJLy9GaXJlCisJCQlQSU5GTygiU29mdHdhcmUgdHJpZ2dlci5cbiIpOworCisJCQkvL1Jlc3RvcmUgc2F2ZSBzZXR0aW5ncworCQkJb3V0bChzeW5jX21hc2ssIGluc3RhbmNlLT5wcmVsb2FkX3JlZyk7CisJCQlQREVCVUdfUkVHKCJwcmVsb2FkX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICBpbnN0YW5jZS0+cHJlbG9hZF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgc3luY19tYXNrKTsKKworCQkJLy9TZXQgYWxsIGFzIHRyaWdnZXJlZC4KKwkJCSppbnN0YW5jZS0+dHJpZ2dlcmluZ19mbGFncyA9IDB4MDsKKwkJfQorCisJfQorCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5wcmVsb2FkX3JlZ19sb2NrKTsKKworCWluc3RhbmNlLT5zdGF0dXMgPSBhb19zdGF0dXNfc2luZ2xlX3J1bl93YWl0OworCisJaW5zdGFuY2UtPnRpbWVvdXQuZGVsYXkgPSBkZWxheTsKKwlpbnN0YW5jZS0+dGltZW91dC5zdGFydF90aW1lID0gamlmZmllczsKKwlpbnN0YW5jZS0+YW9fY29udHJvbF90YXNrX2ZsYWcgPSAxOworCXF1ZXVlX2RlbGF5ZWRfd29yayhpbnN0YW5jZS0+bWU2MDAwX3dvcmtxdWV1ZSwKKwkJCSAgICZpbnN0YW5jZS0+YW9fY29udHJvbF90YXNrLCAxKTsKKworCWlmICghKGZsYWdzICYgTUVfSU9fU0lOR0xFX1RZUEVfV1JJVEVfTk9OQkxPQ0tJTkcpKSB7CisJCWogPSBqaWZmaWVzOworCisJCS8vT25seSBydW5pbmcgcHJvY2VzcyB3aWxsIGludGVycnVwdCB0aGlzIGNhbGwuIEV2ZW50cyBhcmUgc2lnbmFsZWQgd2hlbiBzdGF0dXMgY2hhbmdlLiBFeHRyYSB0aW1lb3V0IGFkZCBmb3Igc2FmZSByZWFzb24uCisJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KGluc3RhbmNlLT53YWl0X3F1ZXVlLAorCQkJCQkJIChpbnN0YW5jZS0+c3RhdHVzICE9CisJCQkJCQkgIGFvX3N0YXR1c19zaW5nbGVfcnVuX3dhaXQpLAorCQkJCQkJIChkZWxheSkgPyBkZWxheSArCisJCQkJCQkgMSA6IExPTkdfTUFYKTsKKworCQlpZiAoaW5zdGFuY2UtPnN0YXR1cyAhPSBhb19zdGF0dXNfc2luZ2xlX2VuZCkgeworCQkJUERFQlVHKCJTaW5nbGUgY2FuY2VsZWQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0NBTkNFTExFRDsKKwkJfQorCisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJUEVSUk9SKCJXYWl0IG9uIHN0YXJ0IG9mIHN0YXRlIG1hY2hpbmUgaW50ZXJydXB0ZWQuXG4iKTsKKwkJCWluc3RhbmNlLT5hb19jb250cm9sX3Rhc2tfZmxhZyA9IDA7CisJCQljYW5jZWxfZGVsYXllZF93b3JrKCZpbnN0YW5jZS0+YW9fY29udHJvbF90YXNrKTsKKwkJCWFvX3N0b3BfaW1tZWRpYXRlbHkoaW5zdGFuY2UpOworCQkJaW5zdGFuY2UtPnN0YXR1cyA9IGFvX3N0YXR1c19ub25lOworCQkJZXJyID0gTUVfRVJSTk9fU0lHTkFMOworCQl9CisKKwkJaWYgKChkZWxheSkgJiYgKChqaWZmaWVzIC0gaikgPj0gZGVsYXkpKSB7CisJCQlpZiAoaW5zdGFuY2UtPnN0YXR1cyA9PSBhb19zdGF0dXNfc2luZ2xlX2VuZCkgeworCQkJCVBERUJVRygiVGltZW91dCByZWFjaGVkLlxuIik7CisJCQl9IGVsc2UgaWYgKChqaWZmaWVzIC0gaikgPiBkZWxheSkgeworCQkJCVBFUlJPUgorCQkJCSAgICAoIlRpbWVvdXQgcmVhY2hlZC4gTm90IGhhbmRsZWQgYnkgY29udHJvbCB0YXNrIVxuIik7CisJCQkJYW9fc3RvcF9pbW1lZGlhdGVseShpbnN0YW5jZSk7CisJCQl9IGVsc2UgeworCQkJCVBFUlJPUgorCQkJCSAgICAoIlRpbWVvdXQgcmVhY2hlZC4gU2lnbmFsIGNvbWUgYnV0IHN0YXR1cyBpcyBzdHJhbmdlOiAlZFxuIiwKKwkJCQkgICAgIGluc3RhbmNlLT5zdGF0dXMpOworCQkJCWFvX3N0b3BfaW1tZWRpYXRlbHkoaW5zdGFuY2UpOworCQkJfQorCisJCQlpbnN0YW5jZS0+YW9fY29udHJvbF90YXNrX2ZsYWcgPSAwOworCQkJY2FuY2VsX2RlbGF5ZWRfd29yaygmaW5zdGFuY2UtPmFvX2NvbnRyb2xfdGFzayk7CisJCQlpbnN0YW5jZS0+c3RhdHVzID0gYW9fc3RhdHVzX3NpbmdsZV9lbmQ7CisJCQllcnIgPSBNRV9FUlJOT19USU1FT1VUOworCQl9CisJfQorCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lNjAwMF9hb19pb19zdHJlYW1fY29uZmlnKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgICBtZUlPU3RyZWFtQ29uZmlnX3QgKiBjb25maWdfbGlzdCwKKwkJCQkgICAgICBpbnQgY291bnQsCisJCQkJICAgICAgbWVJT1N0cmVhbVRyaWdnZXJfdCAqIHRyaWdnZXIsCisJCQkJICAgICAgaW50IGZpZm9faXJxX3RocmVzaG9sZCwgaW50IGZsYWdzKQoreworCW1lNjAwMF9hb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJdWludDMyX3QgY3RybDsKKwl1bnNpZ25lZCBsb25nIGNwdV9mbGFnczsKKwl1aW50NjRfdCBjb252X3RpY2tzOworCXVuc2lnbmVkIGludCBjb252X3N0YXJ0X3RpY2tzX2xvdyA9IHRyaWdnZXItPmlDb252U3RhcnRUaWNrc0xvdzsKKwl1bnNpZ25lZCBpbnQgY29udl9zdGFydF90aWNrc19oaWdoID0gdHJpZ2dlci0+aUNvbnZTdGFydFRpY2tzSGlnaDsKKworCWluc3RhbmNlID0gKG1lNjAwMF9hb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlQREVCVUcoImV4ZWN1dGVkLiBpZHg9JWRcbiIsIGluc3RhbmNlLT5hb19pZHgpOworCisJaWYgKCEoaW5zdGFuY2UtPmZpZm8gJiBNRTYwMDBfQU9fSEFTX0ZJRk8pKSB7CisJCVBFUlJPUigiTm90IGEgc3RyZWFtaW5nIGFvLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19OT1RfU1VQUE9SVEVEOworCX0KKworCWNvbnZfdGlja3MgPQorCSAgICAodWludDY0X3QpIGNvbnZfc3RhcnRfdGlja3NfbG93ICsKKwkgICAgKCh1aW50NjRfdCkgY29udl9zdGFydF90aWNrc19oaWdoIDw8IDMyKTsKKworCWlmIChmbGFncyAmCisJICAgIH4oTUVfSU9fU1RSRUFNX0NPTkZJR19IQVJEV0FSRV9PTkxZIHwKKwkgICAgICBNRV9JT19TVFJFQU1fQ09ORklHX1dSQVBBUk9VTkQpKSB7CisJCVBFUlJPUigiSW52YWxpZCBmbGFncy5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlpZiAoZmxhZ3MgJiBNRV9JT19TVFJFQU1fQ09ORklHX0hBUkRXQVJFX09OTFkpIHsKKwkJaWYgKCFmbGFncyAmIE1FX0lPX1NUUkVBTV9DT05GSUdfV1JBUEFST1VORCkgeworCQkJUEVSUk9SCisJCQkgICAgKCJIYXJkd2FyZSBNRV9JT19TVFJFQU1fQ09ORklHX0hBUkRXQVJFX09OTFkgaGFzIHRvIGJlIHdpdGggTUVfSU9fU1RSRUFNX0NPTkZJR19XUkFQQVJPVU5ELlxuIik7CisJCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwkJfQorCisJCWlmICgodHJpZ2dlci0+aUFjcVN0b3BUcmlnVHlwZSAhPSBNRV9UUklHX1RZUEVfTk9ORSkKKwkJICAgIHx8ICh0cmlnZ2VyLT5pU2NhblN0b3BUcmlnVHlwZSAhPSBNRV9UUklHX1RZUEVfTk9ORSkpIHsKKwkJCVBFUlJPUgorCQkJICAgICgiSGFyZHdhcmUgd3JhcGFyb3VuZCBtb2RlIG11c3QgYmUgaW4gaW5maW5pdGUgbW9kZS5cbiIpOworCQkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJCX0KKwl9CisKKwlpZiAoY291bnQgIT0gMSkgeworCQlQRVJST1IoIk9ubHkgMSBlbnRyeSBpbiBjb25maWcgbGlzdCBhY2NlcHRhYmxlLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0NPTkZJR19MSVNUX0NPVU5UOworCX0KKworCWlmIChjb25maWdfbGlzdFswXS5pQ2hhbm5lbCAhPSAwKSB7CisJCVBFUlJPUigiSW52YWxpZCBjaGFubmVsIG51bWJlciBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwl9CisKKwlpZiAoY29uZmlnX2xpc3RbMF0uaVN0cmVhbUNvbmZpZyAhPSAwKSB7CisJCVBFUlJPUigiT25seSBvbmUgcmFuZ2UgYXZhaWxhYmxlLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1NUUkVBTV9DT05GSUc7CisJfQorCisJaWYgKGNvbmZpZ19saXN0WzBdLmlSZWYgIT0gTUVfUkVGX0FPX0dST1VORCkgeworCQlQRVJST1IoIk91dHB1dCBpcyByZWZlcmVuY2VkIHRvIGdyb3VuZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9SRUY7CisJfQorCisJaWYgKCh0cmlnZ2VyLT5pQWNxU3RhcnRUaWNrc0xvdyAhPSAwKQorCSAgICB8fCAodHJpZ2dlci0+aUFjcVN0YXJ0VGlja3NIaWdoICE9IDApKSB7CisJCVBFUlJPUgorCQkgICAgKCJJbnZhbGlkIGFjcXVpc2l0aW9uIHN0YXJ0IHRyaWdnZXIgYXJndW1lbnQgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0FDUV9TVEFSVF9BUkc7CisJfQorCisJaWYgKGNvbmZpZ19saXN0WzBdLmlGbGFncykgeworCQlQRVJST1IoIkludmFsaWQgY29uZmlnIGxpc3QgZmxhZy5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlpZiAoKHRyaWdnZXItPmlBY3FTdGFydFRyaWdUeXBlICE9IE1FX1RSSUdfVFlQRV9TVykKKwkgICAgJiYgKHRyaWdnZXItPmlBY3FTdGFydFRyaWdUeXBlICE9IE1FX1RSSUdfVFlQRV9FWFRfRElHSVRBTCkpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGFjcXVpc2l0aW9uIHN0YXJ0IHRyaWdnZXIgdHlwZSBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfQUNRX1NUQVJUX1RSSUdfVFlQRTsKKwl9CisKKwlpZiAodHJpZ2dlci0+aUFjcVN0YXJ0VHJpZ1R5cGUgPT0gTUVfVFJJR19UWVBFX0VYVF9ESUdJVEFMKSB7CisJCXN3aXRjaCAodHJpZ2dlci0+aUFjcVN0YXJ0VHJpZ0VkZ2UpIHsKKwkJY2FzZSBNRV9UUklHX0VER0VfUklTSU5HOgorCQljYXNlIE1FX1RSSUdfRURHRV9GQUxMSU5HOgorCQljYXNlIE1FX1RSSUdfRURHRV9BTlk6CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJUEVSUk9SCisJCQkgICAgKCJJbnZhbGlkIGFjcXVpc2l0aW9uIHN0YXJ0IHRyaWdnZXIgZWRnZSBzcGVjaWZpZWQuXG4iKTsKKwkJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0FDUV9TVEFSVF9UUklHX0VER0U7CisJCX0KKwl9CisKKwlpZiAoKHRyaWdnZXItPmlBY3FTdGFydFRyaWdUeXBlID09IE1FX1RSSUdfVFlQRV9TVykKKwkgICAgJiYgKHRyaWdnZXItPmlBY3FTdGFydFRyaWdFZGdlICE9IE1FX1RSSUdfVFlQRV9OT05FKSkgeworCQlQRVJST1IoIkludmFsaWQgYWNxdWlzaXRpb24gc3RhcnQgdHJpZ2dlciBlZGdlIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9BQ1FfU1RBUlRfVFJJR19FREdFOworCX0KKworCWlmICh0cmlnZ2VyLT5pU2NhblN0YXJ0VHJpZ1R5cGUgIT0gTUVfVFJJR19UWVBFX0ZPTExPVykgeworCQlQRVJST1IoIkludmFsaWQgc2NhbiBzdGFydCB0cmlnZ2VyIHR5cGUgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1NDQU5fU1RBUlRfVFJJR19UWVBFOworCX0KKworCWlmICh0cmlnZ2VyLT5pQ29udlN0YXJ0VHJpZ1R5cGUgIT0gTUVfVFJJR19UWVBFX1RJTUVSKSB7CisJCVBFUlJPUigiSW52YWxpZCBjb252IHN0YXJ0IHRyaWdnZXIgdHlwZSBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfQ09OVl9TVEFSVF9UUklHX1RZUEU7CisJfQorCisJaWYgKChjb252X3RpY2tzIDwgTUU2MDAwX0FPX01JTl9DSEFOX1RJQ0tTKQorCSAgICB8fCAoY29udl90aWNrcyA+IE1FNjAwMF9BT19NQVhfQ0hBTl9USUNLUykpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGNvbnYgc3RhcnQgdHJpZ2dlciBhcmd1bWVudCBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfQ09OVl9TVEFSVF9BUkc7CisJfQorCisJaWYgKHRyaWdnZXItPmlBY3FTdGFydFRpY2tzTG93IHx8IHRyaWdnZXItPmlBY3FTdGFydFRpY2tzSGlnaCkgeworCQlQRVJST1IoIkludmFsaWQgYWNxIHN0YXJ0IHRyaWdnZXIgYXJndW1lbnQgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0FDUV9TVEFSVF9BUkc7CisJfQorCisJaWYgKHRyaWdnZXItPmlTY2FuU3RhcnRUaWNrc0xvdyB8fCB0cmlnZ2VyLT5pU2NhblN0YXJ0VGlja3NIaWdoKSB7CisJCVBFUlJPUigiSW52YWxpZCBzY2FuIHN0YXJ0IHRyaWdnZXIgYXJndW1lbnQgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1NDQU5fU1RBUlRfQVJHOworCX0KKworCXN3aXRjaCAodHJpZ2dlci0+aVNjYW5TdG9wVHJpZ1R5cGUpIHsKKwljYXNlIE1FX1RSSUdfVFlQRV9OT05FOgorCQlpZiAodHJpZ2dlci0+aVNjYW5TdG9wQ291bnQgIT0gMCkgeworCQkJUEVSUk9SKCJJbnZhbGlkIHNjYW4gc3RvcCBjb3VudCBzcGVjaWZpZWQuXG4iKTsKKwkJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1NDQU5fU1RPUF9BUkc7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIE1FX1RSSUdfVFlQRV9DT1VOVDoKKwkJaWYgKGZsYWdzICYgTUVfSU9fU1RSRUFNX0NPTkZJR19XUkFQQVJPVU5EKSB7CisJCQlpZiAodHJpZ2dlci0+aVNjYW5TdG9wQ291bnQgPD0gMCkgeworCQkJCVBFUlJPUigiSW52YWxpZCBzY2FuIHN0b3AgY291bnQgc3BlY2lmaWVkLlxuIik7CisJCQkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfU0NBTl9TVE9QX0FSRzsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCVBFUlJPUigiVGhlIGNvbnRpbm91cyBtb2RlIGhhcyBub3QgJ3NjYW4nIGNvbnRlY3RzLlxuIik7CisJCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9BQ1FfU1RPUF9UUklHX1RZUEU7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlQRVJST1IoIkludmFsaWQgc2NhbiBzdG9wIHRyaWdnZXIgdHlwZSBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfU0NBTl9TVE9QX1RSSUdfVFlQRTsKKwl9CisKKwlzd2l0Y2ggKHRyaWdnZXItPmlBY3FTdG9wVHJpZ1R5cGUpIHsKKwljYXNlIE1FX1RSSUdfVFlQRV9OT05FOgorCQlpZiAodHJpZ2dlci0+aUFjcVN0b3BDb3VudCAhPSAwKSB7CisJCQlQRVJST1IoIkludmFsaWQgYWNxIHN0b3AgY291bnQgc3BlY2lmaWVkLlxuIik7CisJCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9BQ1FfU1RPUF9BUkc7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIE1FX1RSSUdfVFlQRV9DT1VOVDoKKwkJaWYgKHRyaWdnZXItPmlTY2FuU3RvcFRyaWdUeXBlICE9IE1FX1RSSUdfVFlQRV9OT05FKSB7CisJCQlQRVJST1IoIkludmFsaWQgYWNxIHN0b3AgdHJpZ2dlciB0eXBlIHNwZWNpZmllZC5cbiIpOworCQkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfQUNRX1NUT1BfVFJJR19UWVBFOworCQl9CisKKwkJaWYgKGZsYWdzICYgTUVfSU9fU1RSRUFNX0NPTkZJR19XUkFQQVJPVU5EKSB7CisJCQlpZiAodHJpZ2dlci0+aUFjcVN0b3BDb3VudCA8PSAwKSB7CisJCQkJUEVSUk9SCisJCQkJICAgICgiVGhlIGNvbnRpbm91cyBtb2RlIGhhcyBub3QgJ3NjYW4nIGNvbnRlY3RzLlxuIik7CisJCQkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfQUNRX1NUT1BfQVJHOworCQkJfQorCQl9CisvLyAgICAgICAgICAgICAgICAgICAgICBlbHNlCisvLyAgICAgICAgICAgICAgICAgICAgICB7CisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBFUlJPUigiSW52YWxpZCBhY3Egc3RvcCB0cmlnZ2VyIHR5cGUgc3BlY2lmaWVkLlxuIik7CisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNRV9FUlJOT19JTlZBTElEX0FDUV9TVE9QX1RSSUdfVFlQRTsKKy8vICAgICAgICAgICAgICAgICAgICAgIH0KKworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCVBFUlJPUigiSW52YWxpZCBhY3Egc3RvcCB0cmlnZ2VyIHR5cGUgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0FDUV9TVE9QX1RSSUdfVFlQRTsKKwl9CisKKwlzd2l0Y2ggKHRyaWdnZXItPmlBY3FTdGFydFRyaWdDaGFuKSB7CisJY2FzZSBNRV9UUklHX0NIQU5fREVGQVVMVDoKKwljYXNlIE1FX1RSSUdfQ0hBTl9TWU5DSFJPTk9VUzoKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlQRVJST1IoIkludmFsaWQgYWNxIHN0YXJ0IHRyaWdnZXIgY2hhbm5lbCBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfQUNRX1NUQVJUX1RSSUdfQ0hBTjsKKwl9CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwkvL1N0b3AgZGV2aWNlCisKKwkvL0NhbmNlbCBjb250cm9sIHRhc2sKKwlQREVCVUcoIkNhbmNlbCBjb250cm9sIHRhc2suIGlkeD0lZFxuIiwgaW5zdGFuY2UtPmFvX2lkeCk7CisJaW5zdGFuY2UtPmFvX2NvbnRyb2xfdGFza19mbGFnID0gMDsKKwljYW5jZWxfZGVsYXllZF93b3JrKCZpbnN0YW5jZS0+YW9fY29udHJvbF90YXNrKTsKKworCS8vQ2hlY2sgaWYgc3RhdGUgbWFjaGluZSBpcyBzdG9wcGVkLgorCWVyciA9IGFvX3N0b3BfaW1tZWRpYXRlbHkoaW5zdGFuY2UpOworCWlmIChlcnIpIHsKKwkJUEVSUk9SX0NSSVRJQ0FMKCJGU00gSVMgQlVTWSFcbiIpOworCQlNRV9TVUJERVZJQ0VfRVhJVDsKKworCQlyZXR1cm4gTUVfRVJSTk9fU1VCREVWSUNFX0JVU1k7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKwkvL1Jlc2V0IGNvbnRyb2wgcmVnaXN0ZXIuIEJsb2NrIGFsbCBhY3Rpb25zLiBEaXNhYmxlIElSUS4gRGlzYWJsZSBGSUZPLgorCWN0cmwgPSBNRTYwMDBfQU9fQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1AgfCBNRTYwMDBfQU9fQ1RSTF9CSVRfU1RPUDsKKwlvdXRsKGN0cmwsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIGN0cmwpOworCisJLy9SZXNldCBpbnRlcnJ1cHQgbGF0Y2gKKwlpbmwoaW5zdGFuY2UtPmlycV9yZXNldF9yZWcpOworCisJLy9UaGlzIGlzIHBhcmFub2ljLCBidXQgdG8gYmUgc3VyZS4KKwlpbnN0YW5jZS0+cHJlbG9hZGVkX2NvdW50ID0gMDsKKwlpbnN0YW5jZS0+ZGF0YV9jb3VudCA9IDA7CisJaW5zdGFuY2UtPmNpcmNfYnVmLmhlYWQgPSAwOworCWluc3RhbmNlLT5jaXJjX2J1Zi50YWlsID0gMDsKKworCS8qIFNldCBtb2RlLiAqLworCWlmIChmbGFncyAmIE1FX0lPX1NUUkVBTV9DT05GSUdfV1JBUEFST1VORCkgewkvL1dyYXBhcm91bmQKKwkJaWYgKGZsYWdzICYgTUVfSU9fU1RSRUFNX0NPTkZJR19IQVJEV0FSRV9PTkxZKSB7CS8vSGFyZHdhcmUgd3JhcGFyb3VuZAorCQkJUElORk8oIkhhcmR3YXJlIHdyYXBhcm91bmQuXG4iKTsKKwkJCWN0cmwgfD0gTUU2MDAwX0FPX01PREVfV1JBUEFST1VORDsKKwkJCWluc3RhbmNlLT5tb2RlID0gTUU2MDAwX0FPX0hXX1dSQVBfTU9ERTsKKwkJfSBlbHNlIHsJLy9Tb2Z0d2FyZSB3cmFwYXJvdW5kCisJCQlQSU5GTygiU29mdHdhcmUgd3JhcGFyb3VuZC5cbiIpOworCQkJY3RybCB8PSBNRTYwMDBfQU9fTU9ERV9DT05USU5VT1VTOworCQkJaW5zdGFuY2UtPm1vZGUgPSBNRTYwMDBfQU9fU1dfV1JBUF9NT0RFOworCQl9CisJfSBlbHNlIHsJCS8vQ29udGlub3VzCisJCVBJTkZPKCJDb250aW5vdXMuXG4iKTsKKwkJY3RybCB8PSBNRTYwMDBfQU9fTU9ERV9DT05USU5VT1VTOworCQlpbnN0YW5jZS0+bW9kZSA9IE1FNjAwMF9BT19DT05USU5PVVM7CisJfQorCisJLy9TZXQgdGhlIHRyaWdnZXIgZWRnZS4KKwlpZiAodHJpZ2dlci0+aUFjcVN0YXJ0VHJpZ1R5cGUgPT0gTUVfVFJJR19UWVBFX0VYVF9ESUdJVEFMKSB7CS8vU2V0IHRoZSB0cmlnZ2VyIHR5cGUgYW5kIGVkZ2UgZm9yIGV4dGVybmFsIHRyaWdnZXIuCisJCVBJTkZPKCJFeHRlcm5hbCBkaWdpdGFsIHRyaWdnZXIuXG4iKTsKKwkJaW5zdGFuY2UtPnN0YXJ0X21vZGUgPSBNRTYwMDBfQU9fRVhUX1RSSUc7CisKKwkJc3dpdGNoICh0cmlnZ2VyLT5pQWNxU3RhcnRUcmlnRWRnZSkgeworCQljYXNlIE1FX1RSSUdfRURHRV9SSVNJTkc6CisJCQlQSU5GTygiU2V0IHRoZSB0cmlnZ2VyIGVkZ2U6IHJpc2luZy5cbiIpOworCQkJaW5zdGFuY2UtPmN0cmxfdHJnID0gMHgwOworCQkJYnJlYWs7CisKKwkJY2FzZSBNRV9UUklHX0VER0VfRkFMTElORzoKKwkJCVBJTkZPKCJTZXQgdGhlIHRyaWdnZXIgZWRnZTogZmFsbGluZy5cbiIpOworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0cmwgfD0gTUU2MDAwX0FPX0NUUkxfQklUX0VYX1RSSUdfRURHRTsKKwkJCWluc3RhbmNlLT5jdHJsX3RyZyA9IE1FNjAwMF9BT19DVFJMX0JJVF9FWF9UUklHX0VER0U7CisJCQlicmVhazsKKworCQljYXNlIE1FX1RSSUdfRURHRV9BTlk6CisJCQlQSU5GTygiU2V0IHRoZSB0cmlnZ2VyIGVkZ2U6IGJvdGggZWRnZXMuXG4iKTsKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHJsIHw9IE1FNjAwMF9BT19DVFJMX0JJVF9FWF9UUklHX0VER0UgfCBNRTYwMDBfQU9fQ1RSTF9CSVRfRVhfVFJJR19FREdFX0JPVEg7CisJCQlpbnN0YW5jZS0+Y3RybF90cmcgPQorCQkJICAgIE1FNjAwMF9BT19DVFJMX0JJVF9FWF9UUklHX0VER0UgfAorCQkJICAgIE1FNjAwMF9BT19DVFJMX0JJVF9FWF9UUklHX0VER0VfQk9USDsKKwkJCWJyZWFrOworCQl9CisJfSBlbHNlIHsKKwkJUElORk8oIkludGVybmFsIHNvZnR3YXJlIHRyaWdnZXIuXG4iKTsKKwkJaW5zdGFuY2UtPnN0YXJ0X21vZGUgPSAwOworCX0KKworCS8vU2V0IHRoZSBzdG9wIG1vZGUgYW5kIHZhbHVlLgorCWlmICh0cmlnZ2VyLT5pQWNxU3RvcFRyaWdUeXBlID09IE1FX1RSSUdfVFlQRV9DT1VOVCkgewkvL0Ftb3VudCBvZiBkYXRhCisJCWluc3RhbmNlLT5zdG9wX21vZGUgPSBNRTYwMDBfQU9fQUNRX1NUT1BfTU9ERTsKKwkJaW5zdGFuY2UtPnN0b3BfY291bnQgPSB0cmlnZ2VyLT5pQWNxU3RvcENvdW50OworCX0gZWxzZSBpZiAodHJpZ2dlci0+aVNjYW5TdG9wVHJpZ1R5cGUgPT0gTUVfVFJJR19UWVBFX0NPVU5UKSB7CS8vQW1vdW50IG9mICdzY2FucycKKwkJaW5zdGFuY2UtPnN0b3BfbW9kZSA9IE1FNjAwMF9BT19TQ0FOX1NUT1BfTU9ERTsKKwkJaW5zdGFuY2UtPnN0b3BfY291bnQgPSB0cmlnZ2VyLT5pU2NhblN0b3BDb3VudDsKKwl9IGVsc2UgewkJLy9JbmZpbml0ZQorCQlpbnN0YW5jZS0+c3RvcF9tb2RlID0gTUU2MDAwX0FPX0lORl9TVE9QX01PREU7CisJCWluc3RhbmNlLT5zdG9wX2NvdW50ID0gMDsKKwl9CisKKwlQSU5GTygiU3RvcCBjb3VudDogJWQuXG4iLCBpbnN0YW5jZS0+c3RvcF9jb3VudCk7CisKKwlpZiAodHJpZ2dlci0+aUFjcVN0YXJ0VHJpZ0NoYW4gPT0gTUVfVFJJR19DSEFOX1NZTkNIUk9OT1VTKSB7CS8vU3luY2hyb25vdXMgc3RhcnQKKwkJaW5zdGFuY2UtPnN0YXJ0X21vZGUgfD0gTUU2MDAwX0FPX1NZTkNfSE9MRDsKKwkJaWYgKHRyaWdnZXItPmlBY3FTdGFydFRyaWdUeXBlID09IE1FX1RSSUdfVFlQRV9FWFRfRElHSVRBTCkgewkvL0V4dGVybmFseSB0cmlnZ2VyZWQKKwkJCVBJTkZPKCJTeW5jaHJvbm91cyBzdGFydC4gRXh0ZXJuYWx5IHRyaWdnZXIgYWN0aXZlLlxuIik7CisJCQlpbnN0YW5jZS0+c3RhcnRfbW9kZSB8PSBNRTYwMDBfQU9fU1lOQ19FWFRfVFJJRzsKKwkJfQorI2lmZGVmIE1FREVCVUdfSU5GTworCQllbHNlIHsKKwkJCVBJTkZPCisJCQkgICAgKCJTeW5jaHJvbm91cyBzdGFydC4gRXh0ZXJuYWx5IHRyaWdnZXIgZGlzc2FibGVkLlxuIik7CisJCX0KKyNlbmRpZgorCisJfQorCS8vU2V0IHNwZWVkCisJb3V0bChjb252X3RpY2tzIC0gMiwgaW5zdGFuY2UtPnRpbWVyX3JlZyk7CisJUERFQlVHX1JFRygidGltZXJfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JWxseFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+dGltZXJfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCBjb252X3RpY2tzIC0gMik7CisJaW5zdGFuY2UtPmhhcmR3YXJlX3N0b3BfZGVsYXkgPSAoaW50KShjb252X3RpY2tzICogSFopIC8gTUU2MDAwX0FPX0JBU0VfRlJFUVVFTkNZOwkvLzw9PSBNVVNUIGJlIHdpdGggY2FzdCEKKworCS8vIFdyaXRlIHRoZSBjb250cm9sIHdvcmQKKwlvdXRsKGN0cmwsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIGN0cmwpOworCisJLy9TZXQgc3RhdHVzLgorCWluc3RhbmNlLT5zdGF0dXMgPSBhb19zdGF0dXNfc3RyZWFtX2NvbmZpZ3VyZWQ7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lNjAwMF9hb19pb19zdHJlYW1fbmV3X3ZhbHVlcyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJCSAgaW50IHRpbWVfb3V0LCBpbnQgKmNvdW50LCBpbnQgZmxhZ3MpCit7CisJbWU2MDAwX2FvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwlsb25nIHQgPSAwOworCWxvbmcgajsKKworCWluc3RhbmNlID0gKG1lNjAwMF9hb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlQREVCVUcoImV4ZWN1dGVkLiBpZHg9JWRcbiIsIGluc3RhbmNlLT5hb19pZHgpOworCisJaWYgKCEoaW5zdGFuY2UtPmZpZm8gJiBNRTYwMDBfQU9fSEFTX0ZJRk8pKSB7CisJCVBFUlJPUigiTm90IGEgc3RyZWFtaW5nIGFvLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19OT1RfU1VQUE9SVEVEOworCX0KKworCWlmIChmbGFncykgeworCQlQRVJST1IoIkludmFsaWQgZmxhZyBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJfQorCisJaWYgKCFpbnN0YW5jZS0+Y2lyY19idWYuYnVmKSB7CisJCVBFUlJPUigiQ2lyY3VsYXIgYnVmZmVyIG5vdCBleGlzdHMuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVEVSTkFMOworCX0KKworCWlmICh0aW1lX291dCA8IDApIHsKKwkJUEVSUk9SKCJJbnZhbGlkIHRpbWVfb3V0IHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9USU1FT1VUOworCX0KKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCWlmIChtZV9jaXJjX2J1Zl9zcGFjZSgmaW5zdGFuY2UtPmNpcmNfYnVmKSkgewkvL1RoZSBidWZmZXIgaXMgTk9UIGZ1bGwuCisJCSpjb3VudCA9IG1lX2NpcmNfYnVmX3NwYWNlKCZpbnN0YW5jZS0+Y2lyY19idWYpOworCX0gZWxzZSB7CQkvL1RoZSBidWZmZXIgaXMgZnVsbC4KKwkJaWYgKHRpbWVfb3V0KSB7CisJCQl0ID0gKHRpbWVfb3V0ICogSFopIC8gMTAwMDsKKworCQkJaWYgKHQgPT0gMCkKKwkJCQl0ID0gMTsKKwkJfSBlbHNlIHsJLy9NYXggdGltZS4KKwkJCXQgPSBMT05HX01BWDsKKwkJfQorCisJCSpjb3VudCA9IDA7CisKKwkJaiA9IGppZmZpZXM7CisKKwkJLy9Pbmx5IHJ1bmluZyBwcm9jZXNzIHdpbGwgaW50ZXJydXB0IHRoaXMgY2FsbC4gSW50ZXJydXB0cyBhcmUgd2hlbiBGSUZPIEhGIGlzIHNpZ25hbGVkLgorCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChpbnN0YW5jZS0+d2FpdF9xdWV1ZSwKKwkJCQkJCSAoKG1lX2NpcmNfYnVmX3NwYWNlCisJCQkJCQkgICAoJmluc3RhbmNlLT5jaXJjX2J1ZikpCisJCQkJCQkgIHx8ICEoaW5sKGluc3RhbmNlLT5zdGF0dXNfcmVnKQorCQkJCQkJICAgICAgICYKKwkJCQkJCSAgICAgICBNRTYwMDBfQU9fU1RBVFVTX0JJVF9GU00pKSwKKwkJCQkJCSB0KTsKKworCQlpZiAoIShpbmwoaW5zdGFuY2UtPnN0YXR1c19yZWcpICYgTUU2MDAwX0FPX1NUQVRVU19CSVRfRlNNKSkgeworCQkJUEVSUk9SKCJBTyBzdWJkZXZpY2UgaXMgbm90IHJ1bm5pbmcuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX1NVQkRFVklDRV9OT1RfUlVOTklORzsKKwkJfSBlbHNlIGlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJUEVSUk9SKCJXYWl0IG9uIHZhbHVlcyBpbnRlcnJ1cHRlZCBmcm9tIHNpZ25hbC5cbiIpOworCQkJaW5zdGFuY2UtPnN0YXR1cyA9IGFvX3N0YXR1c19ub25lOworCQkJYW9fc3RvcF9pbW1lZGlhdGVseShpbnN0YW5jZSk7CisJCQllcnIgPSBNRV9FUlJOT19TSUdOQUw7CisJCX0gZWxzZSBpZiAoKGppZmZpZXMgLSBqKSA+PSB0KSB7CisJCQlQRVJST1IoIldhaXQgb24gdmFsdWVzIHRpbWVkIG91dC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fVElNRU9VVDsKKwkJfSBlbHNlIHsJLy9VZmYuLi4gYWxsIGlzIGdvb2QuIEluZm9ybSB1c2VyIGFib3V0IGVtcHR5IHNwYWNlLgorCQkJKmNvdW50ID0gbWVfY2lyY19idWZfc3BhY2UoJmluc3RhbmNlLT5jaXJjX2J1Zik7CisJCX0KKwl9CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWU2MDAwX2FvX2lvX3N0cmVhbV9zdGFydChtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgIGludCBzdGFydF9tb2RlLCBpbnQgdGltZV9vdXQsIGludCBmbGFncykKK3sKKwltZTYwMDBfYW9fc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCXVuc2lnbmVkIGxvbmcgY3B1X2ZsYWdzID0gMDsKKwl1aW50MzJfdCBzdGF0dXM7CisJdWludDMyX3QgY3RybDsKKwl1aW50MzJfdCBzeW5jaDsKKwlpbnQgY291bnQgPSAwOworCWludCBjaXJjX2J1ZmZlcl9jb3VudDsKKworCXVuc2lnbmVkIGxvbmcgcmVmOworCXVuc2lnbmVkIGxvbmcgZGVsYXkgPSAwOworCisJaW5zdGFuY2UgPSAobWU2MDAwX2FvX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCVBERUJVRygiZXhlY3V0ZWQuIGlkeD0lZFxuIiwgaW5zdGFuY2UtPmFvX2lkeCk7CisKKwlpZiAoIShpbnN0YW5jZS0+ZmlmbyAmIE1FNjAwMF9BT19IQVNfRklGTykpIHsKKwkJUEVSUk9SKCJOb3QgYSBzdHJlYW1pbmcgYW8uXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX05PVF9TVVBQT1JURUQ7CisJfQorCisJaWYgKGZsYWdzICYgfk1FX0lPX1NUUkVBTV9TVEFSVF9UWVBFX1RSSUdfU1lOQ0hST05PVVMpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWdzLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCWlmICh0aW1lX291dCA8IDApIHsKKwkJUEVSUk9SKCJJbnZhbGlkIHRpbWVvdXQgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1RJTUVPVVQ7CisJfQorCisJaWYgKChzdGFydF9tb2RlICE9IE1FX1NUQVJUX01PREVfQkxPQ0tJTkcpCisJICAgICYmIChzdGFydF9tb2RlICE9IE1FX1NUQVJUX01PREVfTk9OQkxPQ0tJTkcpKSB7CisJCVBFUlJPUigiSW52YWxpZCBzdGFydCBtb2RlIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9TVEFSVF9NT0RFOworCX0KKworCWlmICh0aW1lX291dCkgeworCQlkZWxheSA9ICh0aW1lX291dCAqIEhaKSAvIDEwMDA7CisJCWlmIChkZWxheSA9PSAwKQorCQkJZGVsYXkgPSAxOworCX0KKworCXN3aXRjaCAoaW5zdGFuY2UtPnN0YXR1cykgewkvL0NoZWNraW5nIGFjdHVhbCBtb2RlLgorCWNhc2UgYW9fc3RhdHVzX3N0cmVhbV9jb25maWd1cmVkOgorCWNhc2UgYW9fc3RhdHVzX3N0cmVhbV9lbmQ6CisJCS8vQ29ycmVjdCBtb2RlcyEKKwkJYnJlYWs7CisKKwkJLy9UaGUgZGV2aWNlIGlzIGluIHdyb25nIG1vZGUuCisJY2FzZSBhb19zdGF0dXNfbm9uZToKKwljYXNlIGFvX3N0YXR1c19zaW5nbGVfY29uZmlndXJlZDoKKwljYXNlIGFvX3N0YXR1c19zaW5nbGVfcnVuX3dhaXQ6CisJY2FzZSBhb19zdGF0dXNfc2luZ2xlX3J1bjoKKwljYXNlIGFvX3N0YXR1c19zaW5nbGVfZW5kX3dhaXQ6CisJCVBFUlJPUgorCQkgICAgKCJTdWJkZXZpY2UgbXVzdCBiZSBwcmVpbml0aWFsaXplIGNvcnJlY3RseSBmb3Igc3RyZWFtaW5nLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19QUkVWSU9VU19DT05GSUc7CisKKwljYXNlIGFvX3N0YXR1c19zdHJlYW1fZmlmb19lcnJvcjoKKwljYXNlIGFvX3N0YXR1c19zdHJlYW1fYnVmZmVyX2Vycm9yOgorCWNhc2UgYW9fc3RhdHVzX3N0cmVhbV9lcnJvcjoKKwkJUERFQlVHKCJCZWZvcmUgcmVzdGFydCBicm9rZSBzdHJlYW0gJ1NUT1AnIG11c3QgYmUgY2FsZWQuXG4iKTsKKwkJcmV0dXJuIE1FX1NUQVRVU19FUlJPUjsKKworCWNhc2UgYW9fc3RhdHVzX3N0cmVhbV9ydW5fd2FpdDoKKwljYXNlIGFvX3N0YXR1c19zdHJlYW1fcnVuOgorCWNhc2UgYW9fc3RhdHVzX3N0cmVhbV9lbmRfd2FpdDoKKwkJUERFQlVHKCJTdHJlYW0gaXMgYWxyZWFkeSB3b3JraW5nLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19TVUJERVZJQ0VfQlVTWTsKKworCWRlZmF1bHQ6CisJCWluc3RhbmNlLT5zdGF0dXMgPSBhb19zdGF0dXNfc3RyZWFtX2Vycm9yOworCQlQRVJST1JfQ1JJVElDQUwoIlN0YXR1cyBpcyBpbiB3cm9uZyBzdGF0ZSFcbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5URVJOQUw7CisKKwl9CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlpZiAoaW5zdGFuY2UtPm1vZGUgPT0gTUU2MDAwX0FPX0NPTlRJTk9VUykgewkvL0NvbnRpbm91cworCQlpbnN0YW5jZS0+Y2lyY19idWYudGFpbCArPSBpbnN0YW5jZS0+cHJlbG9hZGVkX2NvdW50OworCQlpbnN0YW5jZS0+Y2lyY19idWYudGFpbCAmPSBpbnN0YW5jZS0+Y2lyY19idWYubWFzazsKKwl9CisJY2lyY19idWZmZXJfY291bnQgPSBtZV9jaXJjX2J1Zl92YWx1ZXMoJmluc3RhbmNlLT5jaXJjX2J1Zik7CisKKwlpZiAoIWNpcmNfYnVmZmVyX2NvdW50ICYmICFpbnN0YW5jZS0+cHJlbG9hZGVkX2NvdW50KSB7CS8vTm8gdmFsdWVzIGluIGJ1ZmZlcgorCQlNRV9TVUJERVZJQ0VfRVhJVDsKKwkJUEVSUk9SKCJObyB2YWx1ZXMgaW4gYnVmZmVyIVxuIik7CisJCXJldHVybiBNRV9FUlJOT19MQUNLX09GX1JFU09VUkNFUzsKKwl9CisKKwkvL0NhbmNlbCBjb250cm9sIHRhc2sKKwlQREVCVUcoIkNhbmNlbCBjb250cm9sIHRhc2suIGlkeD0lZFxuIiwgaW5zdGFuY2UtPmFvX2lkeCk7CisJaW5zdGFuY2UtPmFvX2NvbnRyb2xfdGFza19mbGFnID0gMDsKKwljYW5jZWxfZGVsYXllZF93b3JrKCZpbnN0YW5jZS0+YW9fY29udHJvbF90YXNrKTsKKworCS8vU3RvcCBkZXZpY2UKKwllcnIgPSBhb19zdG9wX2ltbWVkaWF0ZWx5KGluc3RhbmNlKTsKKwlpZiAoZXJyKSB7CisJCVBFUlJPUl9DUklUSUNBTCgiRlNNIElTIEJVU1khXG4iKTsKKwkJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwkJcmV0dXJuIE1FX0VSUk5PX1NVQkRFVklDRV9CVVNZOworCX0KKwkvL1NldCB2YWx1ZXMgZm9yIHNpbmdsZV9yZWFkKCkKKwlpbnN0YW5jZS0+c2luZ2xlX3ZhbHVlID0gTUU2MDAwX0FPX01BWF9EQVRBICsgMTsKKwlpbnN0YW5jZS0+c2luZ2xlX3ZhbHVlX2luX2ZpZm8gPSBNRTYwMDBfQU9fTUFYX0RBVEEgKyAxOworCisJLy9TZXR0aW5nIHN0b3AgcG9pbnRzCisJaWYgKGluc3RhbmNlLT5zdG9wX21vZGUgPT0gTUU2MDAwX0FPX1NDQU5fU1RPUF9NT0RFKSB7CisJCWluc3RhbmNlLT5zdG9wX2RhdGFfY291bnQgPQorCQkgICAgaW5zdGFuY2UtPnN0b3BfY291bnQgKiBjaXJjX2J1ZmZlcl9jb3VudDsKKwl9IGVsc2UgeworCQlpbnN0YW5jZS0+c3RvcF9kYXRhX2NvdW50ID0gaW5zdGFuY2UtPnN0b3BfY291bnQ7CisJfQorCisJaWYgKChpbnN0YW5jZS0+c3RvcF9kYXRhX2NvdW50ICE9IDApCisJICAgICYmIChpbnN0YW5jZS0+c3RvcF9kYXRhX2NvdW50IDwgY2lyY19idWZmZXJfY291bnQpKSB7CisJCVBFUlJPUigiTW9yZSBkYXRhIGluIGJ1ZmZlciB0aGFuIHByZXZpb3VzbHkgc2V0IGxpbWl0IVxuIik7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKwljdHJsID0gaW5sKGluc3RhbmNlLT5jdHJsX3JlZyk7CisJLy9DaGVjayBGSUZPCisJaWYgKCEoY3RybCAmIE1FNjAwMF9BT19DVFJMX0JJVF9FTkFCTEVfRklGTykpIHsJLy9GSUZPIHdhc24ndCBlbmFiZWxlZC4gRG8gaXQuIDw9IFRoaXMgc2hvdWxkIGJlIGRvbmUgYnkgdXNlciBjYWxsIHdpdGggTUVfV1JJVEVfTU9ERV9QUkVMT0FECisJCVBJTkZPKCJFbmFibGVpbmcgRklGTy5cbiIpOworCQljdHJsIHw9IE1FNjAwMF9BT19DVFJMX0JJVF9FTkFCTEVfRklGTzsKKwkJY3RybCAmPSB+TUU2MDAwX0FPX0NUUkxfQklUX0VOQUJMRV9JUlE7CisKKwkJaW5zdGFuY2UtPnByZWxvYWRlZF9jb3VudCA9IDA7CisJCWluc3RhbmNlLT5kYXRhX2NvdW50ID0gMDsKKwl9IGVsc2UgewkJLy9CbG9jayBJUlEKKwkJY3RybCAmPSB+TUU2MDAwX0FPX0NUUkxfQklUX0VOQUJMRV9JUlE7CisJfQorCW91dGwoY3RybCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgY3RybCk7CisKKwkvL1Jlc2V0IGludGVycnVwdCBsYXRjaAorCWlubChpbnN0YW5jZS0+aXJxX3Jlc2V0X3JlZyk7CisKKwkvL0ZpbGwgRklGTyA8PSBHZW5lcmFseSB0aGlzIHNob3VsZCBiZSBkb25lIGJ5IHVzZXIgcHJlLWxvYWQgY2FsbCBidXQgdGhpcyBpcyBzZWNvbmQgcGxhY2UgdG8gZG8gaXQuCisJc3RhdHVzID0gaW5sKGluc3RhbmNlLT5zdGF0dXNfcmVnKTsKKwlpZiAoIShzdGF0dXMgJiBNRTYwMDBfQU9fU1RBVFVTX0JJVF9FRikpIHsJLy9GSUZPIGVtcHR5CisJCWlmIChpbnN0YW5jZS0+c3RvcF9kYXRhX2NvdW50ICE9IDApIHsKKwkJCWNvdW50ID0gTUU2MDAwX0FPX0ZJRk9fQ09VTlQ7CisJCX0gZWxzZSB7CisJCQljb3VudCA9CisJCQkgICAgKE1FNjAwMF9BT19GSUZPX0NPVU5UIDwKKwkJCSAgICAgaW5zdGFuY2UtPgorCQkJICAgICBzdG9wX2RhdGFfY291bnQpID8gTUU2MDAwX0FPX0ZJRk9fQ09VTlQgOgorCQkJICAgIGluc3RhbmNlLT5zdG9wX2RhdGFfY291bnQ7CisJCX0KKworCQkvL0NvcHkgZGF0YQorCQljb3VudCA9CisJCSAgICBhb193cml0ZV9kYXRhKGluc3RhbmNlLCBjb3VudCwgaW5zdGFuY2UtPnByZWxvYWRlZF9jb3VudCk7CisKKwkJaWYgKGNvdW50IDwgMCkgewkvL1RoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbmQhCisJCQlQRVJST1JfQ1JJVElDQUwoIkNPUFkgRklOSVNIIFdJVEggRVJST1IhXG4iKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywKKwkJCQkJICAgICAgIGNwdV9mbGFncyk7CisJCQlNRV9TVUJERVZJQ0VfRVhJVDsKKwkJCXJldHVybiBNRV9FUlJOT19JTlRFUk5BTDsKKwkJfQorCX0KKwkvL1NldCBwcmUtbG9hZCBmZWF0dXJlcy4KKwlzcGluX2xvY2soaW5zdGFuY2UtPnByZWxvYWRfcmVnX2xvY2spOworCXN5bmNoID0gaW5sKGluc3RhbmNlLT5wcmVsb2FkX3JlZyk7CisJc3luY2ggJj0KKwkgICAgfigoTUU2MDAwX0FPX1NZTkNfSE9MRCB8IE1FNjAwMF9BT19TWU5DX0VYVF9UUklHKSA8PCBpbnN0YW5jZS0+CisJICAgICAgYW9faWR4KTsKKwlzeW5jaCB8PQorCSAgICAoaW5zdGFuY2UtPnN0YXJ0X21vZGUgJiB+TUU2MDAwX0FPX0VYVF9UUklHKSA8PCBpbnN0YW5jZS0+YW9faWR4OworCW91dGwoc3luY2gsIGluc3RhbmNlLT5wcmVsb2FkX3JlZyk7CisJUERFQlVHX1JFRygicHJlbG9hZF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+cHJlbG9hZF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIHN5bmNoKTsKKwlzcGluX3VubG9jayhpbnN0YW5jZS0+cHJlbG9hZF9yZWdfbG9jayk7CisKKwkvL0RlZmF1bHQgY291bnQgaXMgJzAnCisJaWYgKGluc3RhbmNlLT5tb2RlID09IE1FNjAwMF9BT19DT05USU5PVVMpIHsJLy9Db250aW5vdXMKKwkJaW5zdGFuY2UtPnByZWxvYWRlZF9jb3VudCA9IDA7CisJCWluc3RhbmNlLT5jaXJjX2J1Zi50YWlsICs9IGNvdW50OworCQlpbnN0YW5jZS0+Y2lyY19idWYudGFpbCAmPSBpbnN0YW5jZS0+Y2lyY19idWYubWFzazsKKwl9IGVsc2UgewkJLy9XcmFwYXJvdW5kCisJCWluc3RhbmNlLT5wcmVsb2FkZWRfY291bnQgKz0gY291bnQ7CisJCWluc3RhbmNlLT5kYXRhX2NvdW50ICs9IGNvdW50OworCisJCS8vU3BlY2lhbCBjYXNlOiBJbmZpbml0ZSB3cmFwYXJvdW5kIHdpdGggbGVzcyB0aGFuIEZJRk8gZGF0YXMgYWx3YXlzIHNob3VsZCBydW5zIGluIGhhcmR3YXJlIG1vZGUuCisJCWlmICgoaW5zdGFuY2UtPnN0b3BfbW9kZSA9PSBNRTYwMDBfQU9fSU5GX1NUT1BfTU9ERSkKKwkJICAgICYmIChjaXJjX2J1ZmZlcl9jb3VudCA8PSBNRTYwMDBfQU9fRklGT19DT1VOVCkpIHsJLy9DaGFuZ2UgdG8gaGFyZHdhcmUgd3JhcGFyb3VuZAorCQkJUERFQlVHCisJCQkgICAgKCJDaGFuZ2VpbmcgbW9kZSBmcm9tIHNvZnR3YXJlIHdyYXBhcm91bmQgdG8gaGFyZHdhcmUgd3JhcGFyb3VuZC5cbiIpOworCQkJLy9Db3B5IGFsbCBkYXRhCisJCQljb3VudCA9CisJCQkgICAgYW9fd3JpdGVfZGF0YShpbnN0YW5jZSwgY2lyY19idWZmZXJfY291bnQsCisJCQkJCSAgaW5zdGFuY2UtPnByZWxvYWRlZF9jb3VudCk7CisJCQljdHJsICY9IH5NRTYwMDBfQU9fQ1RSTF9NT0RFX01BU0s7CisJCQljdHJsIHw9IE1FNjAwMF9BT19NT0RFX1dSQVBBUk9VTkQ7CisJCX0KKworCQlpZiAoaW5zdGFuY2UtPnByZWxvYWRlZF9jb3VudCA9PSBtZV9jaXJjX2J1Zl92YWx1ZXMoJmluc3RhbmNlLT5jaXJjX2J1ZikpIHsJLy9SZXNldCBwb3NpdGlvbiBpbmRpY2F0b3IuCisJCQlpbnN0YW5jZS0+cHJlbG9hZGVkX2NvdW50ID0gMDsKKwkJfSBlbHNlIGlmIChpbnN0YW5jZS0+cHJlbG9hZGVkX2NvdW50ID4gbWVfY2lyY19idWZfdmFsdWVzKCZpbnN0YW5jZS0+Y2lyY19idWYpKSB7CS8vVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuZCEKKwkJCVBFUlJPUl9DUklUSUNBTAorCQkJICAgICgiUFJFTE9BREVEIE1PUkUgVkFMVUVTIFRIQU4gQVJFIElOIEJVRkZFUiFcbiIpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLAorCQkJCQkgICAgICAgY3B1X2ZsYWdzKTsKKwkJCU1FX1NVQkRFVklDRV9FWElUOworCQkJcmV0dXJuIE1FX0VSUk5PX0lOVEVSTkFMOworCQl9CisJfQorCisJLy9TZXQgc3RhdHVzIHRvICd3YWl0IGZvciBzdGFydCcKKwlpbnN0YW5jZS0+c3RhdHVzID0gYW9fc3RhdHVzX3N0cmVhbV9ydW5fd2FpdDsKKworCXN0YXR1cyA9IGlubChpbnN0YW5jZS0+c3RhdHVzX3JlZyk7CisJLy9TdGFydCBzdGF0ZSBtYWNoaW5lIGFuZCBpbnRlcnJ1cHRzCisJUElORk8oIjwlczolZD4gU3RhcnQgc3RhdGUgbWFjaGluZS5cbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisJY3RybCAmPSB+KE1FNjAwMF9BT19DVFJMX0JJVF9TVE9QIHwgTUU2MDAwX0FPX0NUUkxfQklUX0lNTUVESUFURV9TVE9QKTsKKwlpZiAoaW5zdGFuY2UtPnN0YXJ0X21vZGUgPT0gTUU2MDAwX0FPX0VYVF9UUklHKSB7CisJCVBERUJVRygiRElHSVRBTCBUUklHR0VSXG4iKTsKKwkJY3RybCB8PSBNRTYwMDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0VYX1RSSUc7CisJfQorCWlmICghKHN0YXR1cyAmIE1FNjAwMF9BT19TVEFUVVNfQklUX0hGKSkgewkvL01vcmUgdGhhbiBoYWxmIQorCQlpZiAoKGN0cmwgJiBNRTYwMDBfQU9fQ1RSTF9NT0RFX01BU0spID09IE1FNjAwMF9BT19NT0RFX0NPTlRJTlVPVVMpIHsJLy9FbmFibGUgSVJRIG9ubHkgd2hlbiBoYXJkd2FyZV9jb250aW5vdXMgaXMgc2V0IGFuZCBGSUZPIGlzIG1vcmUgdGhhbiBoYWxmCisJCQlQSU5GTygiPCVzOiVkPiBTdGFydCBpbnRlcnJ1cHRzLlxuIiwgX19mdW5jX18sCisJCQkgICAgICBfX0xJTkVfXyk7CisJCQljdHJsIHw9IE1FNjAwMF9BT19DVFJMX0JJVF9FTkFCTEVfSVJROworCQl9CisJfQorCW91dGwoY3RybCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgY3RybCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCisJLy9UcmlnZ2VyIG91dHB1dAorCVBJTkZPKCI8JXM+IHN0YXJ0IG1vZGU9IDB4JXggJXNcbiIsIF9fZnVuY19fLCBpbnN0YW5jZS0+c3RhcnRfbW9kZSwKKwkgICAgICAoZmxhZ3MgJiBNRV9JT19TSU5HTEVfVFlQRV9UUklHX1NZTkNIUk9OT1VTKSA/ICJTWU5DSFJPTk9VUyIgOgorCSAgICAgICIiKTsKKwlpZiAoZmxhZ3MgJiBNRV9JT19TSU5HTEVfVFlQRV9UUklHX1NZTkNIUk9OT1VTKSB7CS8vVHJpZ2dlciBvdXRwdXRzCisJCXNwaW5fbG9jayhpbnN0YW5jZS0+cHJlbG9hZF9yZWdfbG9jayk7CisJCXN5bmNoID0gaW5sKGluc3RhbmNlLT5wcmVsb2FkX3JlZyk7CisJCS8vQWRkIGNoYW5uZWwgdG8gc3RhcnQgbGlzdAorCQlvdXRsKHN5bmNoIHwgKE1FNjAwMF9BT19TWU5DX0hPTEQgPDwgaW5zdGFuY2UtPmFvX2lkeCksCisJCSAgICAgaW5zdGFuY2UtPnByZWxvYWRfcmVnKTsKKwkJUERFQlVHX1JFRygicHJlbG9hZF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgIGluc3RhbmNlLT5wcmVsb2FkX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgIHN5bmNoIHwgKE1FNjAwMF9BT19TWU5DX0hPTEQgPDwgaW5zdGFuY2UtPmFvX2lkeCkpOworCisJCS8vRmlyZQorCQlQSU5GTworCQkgICAgKCJGaXJlZCBhbGwgc29mdHdhcmUgc3luY2hyb25vdXMgb3V0cHV0cyBieSBzb2Z0d2FyZSB0cmlnZ2VyLlxuIik7CisJCW91dGwoMHg4MDAwLCBpbnN0YW5jZS0+c2luZ2xlX3JlZyk7CisJCVBERUJVR19SRUcoInNpbmdsZV9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgIGluc3RhbmNlLT5zaW5nbGVfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCAweDgwMDApOworCisJCS8vUmVzdG9yZSBzYXZlIHNldHRpbmdzCisJCW91dGwoc3luY2gsIGluc3RhbmNlLT5wcmVsb2FkX3JlZyk7CisJCVBERUJVR19SRUcoInByZWxvYWRfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkgICBpbnN0YW5jZS0+cHJlbG9hZF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIHN5bmNoKTsKKwkJc3Bpbl91bmxvY2soaW5zdGFuY2UtPnByZWxvYWRfcmVnX2xvY2spOworCX0gZWxzZSBpZiAoIWluc3RhbmNlLT5zdGFydF9tb2RlKSB7CS8vVHJpZ2dlciBvdXRwdXRzCisvKgorCQlzcGluX2xvY2soaW5zdGFuY2UtPnByZWxvYWRfcmVnX2xvY2spOworCQkJc3luY2ggPSBpbmwoaW5zdGFuY2UtPnByZWxvYWRfcmVnKTsKKwkJCS8vUmVtb3ZlIGNoYW5uZWwgZnJvbSBzdGFydCBsaXN0CisJCQlvdXRsKHN5bmNoICYgfihNRTYwMDBfQU9fU1lOQ19IT0xEIDw8IGluc3RhbmNlLT5hb19pZHgpLCBpbnN0YW5jZS0+cHJlbG9hZF9yZWcpOworCQkJUERFQlVHX1JFRygicHJlbG9hZF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLCBpbnN0YW5jZS0+cHJlbG9hZF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIHN5bmNoICYgfihNRTYwMDBfQU9fU1lOQ19IT0xEIDw8IGluc3RhbmNlLT5hb19pZHgpKTsKKyovCisJCS8vRmlyZQorCQlQSU5GTygiU29mdHdhcmUgdHJpZ2dlci5cbiIpOworCQlvdXRsKDB4ODAwMCwgaW5zdGFuY2UtPnNpbmdsZV9yZWcpOworCQlQREVCVUdfUkVHKCJzaW5nbGVfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkgICBpbnN0YW5jZS0+c2luZ2xlX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgMHg4MDAwKTsKKworLyoKKwkJCS8vUmVzdG9yZSBzYXZlIHNldHRpbmdzCisJCQlvdXRsKHN5bmNoLCBpbnN0YW5jZS0+cHJlbG9hZF9yZWcpOworCQkJUERFQlVHX1JFRygicHJlbG9hZF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLCBpbnN0YW5jZS0+cHJlbG9hZF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIHN5bmNoKTsKKwkJc3Bpbl91bmxvY2soaW5zdGFuY2UtPnByZWxvYWRfcmVnX2xvY2spOworKi8KKwl9CisJLy8gU2V0IGNvbnRyb2wgdGFzaydzIHRpbWVvdXQKKwlpbnN0YW5jZS0+dGltZW91dC5kZWxheSA9IGRlbGF5OworCWluc3RhbmNlLT50aW1lb3V0LnN0YXJ0X3RpbWUgPSBqaWZmaWVzOworCisJaWYgKHN0YXR1cyAmIE1FNjAwMF9BT19TVEFUVVNfQklUX0hGKSB7CS8vTGVzcyB0aGFuIGhhbGYgYnV0IG5vdCBlbXB0eSEKKwkJUElORk8oIkxlc3MgdGhhbiBoYWxmLlxuIik7CisJCWlmIChpbnN0YW5jZS0+c3RvcF9kYXRhX2NvdW50ID09IDApIHsKKwkJCWNvdW50ID0gTUU2MDAwX0FPX0ZJRk9fQ09VTlQgLyAyOworCQl9IGVsc2UgeworCQkJY291bnQgPQorCQkJICAgICgoTUU2MDAwX0FPX0ZJRk9fQ09VTlQgLyAyKSA8CisJCQkgICAgIGluc3RhbmNlLT5zdG9wX2RhdGFfY291bnQpID8gTUU2MDAwX0FPX0ZJRk9fQ09VTlQgLworCQkJICAgIDIgOiBpbnN0YW5jZS0+c3RvcF9kYXRhX2NvdW50OworCQl9CisKKwkJLy9Db3B5IGRhdGEKKwkJY291bnQgPQorCQkgICAgYW9fd3JpdGVfZGF0YShpbnN0YW5jZSwgY291bnQsIGluc3RhbmNlLT5wcmVsb2FkZWRfY291bnQpOworCisJCWlmIChjb3VudCA8IDApIHsJLy9UaGlzIHNob3VsZCBuZXZlciBoYXBwZW5kIQorCQkJUEVSUk9SX0NSSVRJQ0FMKCJDT1BZIEZJTklTSCBXSVRIIEVSUk9SIVxuIik7CisJCQlNRV9TVUJERVZJQ0VfRVhJVDsKKwkJCXJldHVybiBNRV9FUlJOT19JTlRFUk5BTDsKKwkJfQorCisJCWlmIChpbnN0YW5jZS0+bW9kZSA9PSBNRTYwMDBfQU9fQ09OVElOT1VTKSB7CS8vQ29udGlub3VzCisJCQlpbnN0YW5jZS0+Y2lyY19idWYudGFpbCArPSBjb3VudDsKKwkJCWluc3RhbmNlLT5jaXJjX2J1Zi50YWlsICY9IGluc3RhbmNlLT5jaXJjX2J1Zi5tYXNrOworCQl9IGVsc2UgewkvL1dyYXBhcm91bmQKKwkJCWluc3RhbmNlLT5kYXRhX2NvdW50ICs9IGNvdW50OworCQkJaW5zdGFuY2UtPnByZWxvYWRlZF9jb3VudCArPSBjb3VudDsKKworCQkJaWYgKGluc3RhbmNlLT5wcmVsb2FkZWRfY291bnQgPT0gbWVfY2lyY19idWZfdmFsdWVzKCZpbnN0YW5jZS0+Y2lyY19idWYpKSB7CS8vUmVzZXQgcG9zaXRpb24gaW5kaWNhdG9yLgorCQkJCWluc3RhbmNlLT5wcmVsb2FkZWRfY291bnQgPSAwOworCQkJfSBlbHNlIGlmIChpbnN0YW5jZS0+cHJlbG9hZGVkX2NvdW50ID4gbWVfY2lyY19idWZfdmFsdWVzKCZpbnN0YW5jZS0+Y2lyY19idWYpKSB7CS8vVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuZCEKKwkJCQlQRVJST1JfQ1JJVElDQUwKKwkJCQkgICAgKCJQUkVMT0FERUQgTU9SRSBWQUxVRVMgVEhBTiBBUkUgSU4gQlVGRkVSIVxuIik7CisJCQkJTUVfU1VCREVWSUNFX0VYSVQ7CisJCQkJcmV0dXJuIE1FX0VSUk5PX0lOVEVSTkFMOworCQkJfQorCQl9CisKKwkJc3RhdHVzID0gaW5sKGluc3RhbmNlLT5zdGF0dXNfcmVnKTsKKwkJaWYgKCEoc3RhdHVzICYgTUU2MDAwX0FPX1NUQVRVU19CSVRfSEYpKSB7CS8vTW9yZSB0aGFuIGhhbGYhCisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCQkJUElORk8oIjwlczolZD4gU3RhcnQgaW50ZXJydXB0cy5cbiIsIF9fZnVuY19fLAorCQkJICAgICAgX19MSU5FX18pOworCQkJY3RybCA9IGlubChpbnN0YW5jZS0+Y3RybF9yZWcpOworCQkJY3RybCB8PSBNRTYwMDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0lSUTsKKwkJCW91dGwoY3RybCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICBjdHJsKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywKKwkJCQkJICAgICAgIGNwdV9mbGFncyk7CisJCX0KKwl9CisJLy9TcGVjaWFsIGNhc2U6IExpbWl0ZWQgd3JhcGFyb3VuZCB3aXRoIGxlc3MgdGhhbiBIQUxGIEZJRk8gZGF0YXMgbmVlZCB3b3JrIGFyb3VuZCB0byBnZW5lcmF0ZSBmaXJzdCBpbnRlcnJ1cHQuCisJaWYgKChpbnN0YW5jZS0+c3RvcF9tb2RlICE9IE1FNjAwMF9BT19JTkZfU1RPUF9NT0RFKQorCSAgICAmJiAoaW5zdGFuY2UtPm1vZGUgPT0gTUU2MDAwX0FPX1NXX1dSQVBfTU9ERSkKKwkgICAgJiYgKGNpcmNfYnVmZmVyX2NvdW50IDw9IChNRTYwMDBfQU9fRklGT19DT1VOVCAvIDIpKSkgewkvL1B1dCBtb3JlIGRhdGEgdG8gRklGTworCQlQSU5GTygiTGltaXRlZCB3cmFwYXJvdW5kIHdpdGggbGVzcyB0aGFuIEhBTEYgRklGTyBkYXRhcy5cbiIpOworCQlpZiAoaW5zdGFuY2UtPnByZWxvYWRlZF9jb3VudCkgewkvL1RoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbmQhCisJCQlQRVJST1JfQ1JJVElDQUwKKwkJCSAgICAoIkVSUk9SIFdIRU4gTE9BRElORyBWQUxVRVMgRk9SIFdSQVBBUk9VTkQhXG4iKTsKKwkJCU1FX1NVQkRFVklDRV9FWElUOworCQkJcmV0dXJuIE1FX0VSUk5PX0lOVEVSTkFMOworCQl9CisKKwkJd2hpbGUgKGluc3RhbmNlLT5zdG9wX2RhdGFfY291bnQgPiBpbnN0YW5jZS0+ZGF0YV9jb3VudCkgewkvL01heGltdW0gZGF0YSBub3Qgc2V0IGpldC4KKwkJCS8vQ29weSB0byBidWZmZXIKKwkJCWlmIChjaXJjX2J1ZmZlcl9jb3VudCAhPSBhb193cml0ZV9kYXRhKGluc3RhbmNlLCBjaXJjX2J1ZmZlcl9jb3VudCwgMCkpIHsJLy9UaGlzIHNob3VsZCBuZXZlciBoYXBwZW5kIQorCQkJCVBFUlJPUl9DUklUSUNBTAorCQkJCSAgICAoIkVSUk9SIFdIRU4gTE9BRElORyBWQUxVRVMgRk9SIFdSQVBBUk9VTkQhXG4iKTsKKwkJCQlNRV9TVUJERVZJQ0VfRVhJVDsKKwkJCQlyZXR1cm4gTUVfRVJSTk9fSU5URVJOQUw7CisJCQl9CisJCQlpbnN0YW5jZS0+ZGF0YV9jb3VudCArPSBjaXJjX2J1ZmZlcl9jb3VudDsKKworCQkJaWYgKCEoKHN0YXR1cyA9IGlubChpbnN0YW5jZS0+c3RhdHVzX3JlZykpICYgTUU2MDAwX0FPX1NUQVRVU19CSVRfSEYpKSB7CS8vRklGTyBpcyBtb3JlIHRoYW4gaGFsZi4gRW5hYmxlIElSUSBhbmQgZW5kIGNvcHkuCisJCQkJLy9SZXNldCBpbnRlcnJ1cHQgbGF0Y2gKKwkJCQlpbmwoaW5zdGFuY2UtPmlycV9yZXNldF9yZWcpOworCisJCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywKKwkJCQkJCSAgY3B1X2ZsYWdzKTsKKwkJCQlQSU5GTygiPCVzOiVkPiBTdGFydCBpbnRlcnJ1cHRzLlxuIiwKKwkJCQkgICAgICBfX2Z1bmNfXywgX19MSU5FX18pOworCQkJCWN0cmwgPSBpbmwoaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJCQljdHJsIHw9IE1FNjAwMF9BT19DVFJMX0JJVF9FTkFCTEVfSVJROworCQkJCW91dGwoY3RybCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJCQlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtCisJCQkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwgY3RybCk7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPgorCQkJCQkJICAgICAgIHN1YmRldmljZV9sb2NrLAorCQkJCQkJICAgICAgIGNwdV9mbGFncyk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisJLy8gU2NoZWR1bGUgY29udHJvbCB0YXNrCisJaW5zdGFuY2UtPmFvX2NvbnRyb2xfdGFza19mbGFnID0gMTsKKwlxdWV1ZV9kZWxheWVkX3dvcmsoaW5zdGFuY2UtPm1lNjAwMF93b3JrcXVldWUsCisJCQkgICAmaW5zdGFuY2UtPmFvX2NvbnRyb2xfdGFzaywgMSk7CisKKwlpZiAoc3RhcnRfbW9kZSA9PSBNRV9TVEFSVF9NT0RFX0JMT0NLSU5HKSB7CS8vV2FpdCBmb3Igc3RhcnQuCisJCXJlZiA9IGppZmZpZXM7CisJCS8vT25seSBydW5pbmcgcHJvY2VzcyB3aWxsIGludGVycnVwdCB0aGlzIGNhbGwuIEV2ZW50cyBhcmUgc2lnbmFsZWQgd2hlbiBzdGF0dXMgY2hhbmdlLiBFeHRyYSB0aW1lb3V0IGFkZCBmb3Igc2FmZSByZWFzb24uCisJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KGluc3RhbmNlLT53YWl0X3F1ZXVlLAorCQkJCQkJIChpbnN0YW5jZS0+c3RhdHVzICE9CisJCQkJCQkgIGFvX3N0YXR1c19zdHJlYW1fcnVuX3dhaXQpLAorCQkJCQkJIChkZWxheSkgPyBkZWxheSArCisJCQkJCQkgMSA6IExPTkdfTUFYKTsKKworCQlpZiAoKGluc3RhbmNlLT5zdGF0dXMgIT0gYW9fc3RhdHVzX3N0cmVhbV9ydW4pCisJCSAgICAmJiAoaW5zdGFuY2UtPnN0YXR1cyAhPSBhb19zdGF0dXNfc3RyZWFtX2VuZCkpIHsKKwkJCVBERUJVRygiU3RhcnRpbmcgc3RyZWFtIGNhbmNlbGVkLiAlZFxuIiwKKwkJCSAgICAgICBpbnN0YW5jZS0+c3RhdHVzKTsKKwkJCWVyciA9IE1FX0VSUk5PX0NBTkNFTExFRDsKKwkJfQorCisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJUEVSUk9SKCJXYWl0IG9uIHN0YXJ0IG9mIHN0YXRlIG1hY2hpbmUgaW50ZXJydXB0ZWQuXG4iKTsKKwkJCWluc3RhbmNlLT5zdGF0dXMgPSBhb19zdGF0dXNfbm9uZTsKKwkJCWFvX3N0b3BfaW1tZWRpYXRlbHkoaW5zdGFuY2UpOworCQkJZXJyID0gTUVfRVJSTk9fU0lHTkFMOworCQl9CisKKwkJaWYgKChkZWxheSkgJiYgKChqaWZmaWVzIC0gcmVmKSA+PSBkZWxheSkpIHsKKwkJCWlmIChpbnN0YW5jZS0+c3RhdHVzICE9IGFvX3N0YXR1c19zdHJlYW1fcnVuKSB7CisJCQkJaWYgKGluc3RhbmNlLT5zdGF0dXMgPT0gYW9fc3RhdHVzX3N0cmVhbV9lbmQpIHsKKwkJCQkJUERFQlVHKCJUaW1lb3V0IHJlYWNoZWQuXG4iKTsKKwkJCQl9IGVsc2UgaWYgKChqaWZmaWVzIC0gcmVmKSA+IGRlbGF5KSB7CisJCQkJCVBFUlJPUgorCQkJCQkgICAgKCJUaW1lb3V0IHJlYWNoZWQuIE5vdCBoYW5kbGVkIGJ5IGNvbnRyb2wgdGFzayFcbiIpOworCQkJCQlhb19zdG9wX2ltbWVkaWF0ZWx5KGluc3RhbmNlKTsKKwkJCQl9IGVsc2UgeworCQkJCQlQRVJST1IKKwkJCQkJICAgICgiVGltZW91dCByZWFjaGVkLiBTaWduYWwgY29tZSBidXQgc3RhdHVzIGlzIHN0cmFuZ2U6ICVkXG4iLAorCQkJCQkgICAgIGluc3RhbmNlLT5zdGF0dXMpOworCQkJCQlhb19zdG9wX2ltbWVkaWF0ZWx5KGluc3RhbmNlKTsKKwkJCQl9CisKKwkJCQlpbnN0YW5jZS0+YW9fY29udHJvbF90YXNrX2ZsYWcgPSAwOworCQkJCWNhbmNlbF9kZWxheWVkX3dvcmsoJmluc3RhbmNlLT5hb19jb250cm9sX3Rhc2spOworCQkJCWluc3RhbmNlLT5zdGF0dXMgPSBhb19zdGF0dXNfc3RyZWFtX2VuZDsKKwkJCQllcnIgPSBNRV9FUlJOT19USU1FT1VUOworCQkJfQorCQl9CisJfQorCisJTUVfU1VCREVWSUNFX0VYSVQ7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZTYwMDBfYW9faW9fc3RyZWFtX3N0YXR1cyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgICAgaW50IHdhaXQsCisJCQkJICAgICAgaW50ICpzdGF0dXMsIGludCAqdmFsdWVzLCBpbnQgZmxhZ3MpCit7CisJbWU2MDAwX2FvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKworCWluc3RhbmNlID0gKG1lNjAwMF9hb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlQREVCVUcoImV4ZWN1dGVkLiBpZHg9JWRcbiIsIGluc3RhbmNlLT5hb19pZHgpOworCisJaWYgKCEoaW5zdGFuY2UtPmZpZm8gJiBNRTYwMDBfQU9fSEFTX0ZJRk8pKSB7CisJCVBFUlJPUigiTm90IGEgc3RyZWFtaW5nIGFvLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19OT1RfU1VQUE9SVEVEOworCX0KKworCWlmIChmbGFncykgeworCQlQRVJST1IoIkludmFsaWQgZmxhZyBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJfQorCisJaWYgKCh3YWl0ICE9IE1FX1dBSVRfTk9ORSkgJiYgKHdhaXQgIT0gTUVfV0FJVF9JRExFKSkgeworCQlQRVJST1IoIkludmFsaWQgd2FpdCBhcmd1bWVudCBzcGVjaWZpZWQuXG4iKTsKKwkJKnN0YXR1cyA9IE1FX1NUQVRVU19JTlZBTElEOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9XQUlUOworCX0KKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCXN3aXRjaCAoaW5zdGFuY2UtPnN0YXR1cykgeworCWNhc2UgYW9fc3RhdHVzX3NpbmdsZV9jb25maWd1cmVkOgorCWNhc2UgYW9fc3RhdHVzX3NpbmdsZV9lbmQ6CisJY2FzZSBhb19zdGF0dXNfc3RyZWFtX2NvbmZpZ3VyZWQ6CisJY2FzZSBhb19zdGF0dXNfc3RyZWFtX2VuZDoKKwljYXNlIGFvX3N0YXR1c19zdHJlYW1fZmlmb19lcnJvcjoKKwljYXNlIGFvX3N0YXR1c19zdHJlYW1fYnVmZmVyX2Vycm9yOgorCWNhc2UgYW9fc3RhdHVzX3N0cmVhbV9lcnJvcjoKKwkJKnN0YXR1cyA9IE1FX1NUQVRVU19JRExFOworCQlicmVhazsKKworCWNhc2UgYW9fc3RhdHVzX3NpbmdsZV9ydW5fd2FpdDoKKwljYXNlIGFvX3N0YXR1c19zaW5nbGVfcnVuOgorCWNhc2UgYW9fc3RhdHVzX3NpbmdsZV9lbmRfd2FpdDoKKwljYXNlIGFvX3N0YXR1c19zdHJlYW1fcnVuX3dhaXQ6CisJY2FzZSBhb19zdGF0dXNfc3RyZWFtX3J1bjoKKwljYXNlIGFvX3N0YXR1c19zdHJlYW1fZW5kX3dhaXQ6CisJCSpzdGF0dXMgPSBNRV9TVEFUVVNfQlVTWTsKKwkJYnJlYWs7CisKKwljYXNlIGFvX3N0YXR1c19ub25lOgorCWRlZmF1bHQ6CisJCSpzdGF0dXMgPQorCQkgICAgKGlubChpbnN0YW5jZS0+c3RhdHVzX3JlZykgJiBNRTYwMDBfQU9fU1RBVFVTX0JJVF9GU00pID8KKwkJICAgIE1FX1NUQVRVU19CVVNZIDogTUVfU1RBVFVTX0lETEU7CisJCWJyZWFrOworCX0KKworCWlmICgod2FpdCA9PSBNRV9XQUlUX0lETEUpICYmICgqc3RhdHVzID09IE1FX1NUQVRVU19CVVNZKSkgeworCQkvL09ubHkgcnVuaW5nIHByb2Nlc3Mgd2lsbCBpbnRlcnJ1cHQgdGhpcyBjYWxsLiBFdmVudHMgYXJlIHNpZ25hbGVkIHdoZW4gc3RhdHVzIGNoYW5nZS4gRXh0cmEgdGltZW91dCBhZGQgZm9yIHNhZmUgcmVhc29uLgorCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChpbnN0YW5jZS0+d2FpdF9xdWV1ZSwKKwkJCQkJCSAoKGluc3RhbmNlLT5zdGF0dXMgIT0KKwkJCQkJCSAgIGFvX3N0YXR1c19zaW5nbGVfcnVuX3dhaXQpCisJCQkJCQkgICYmIChpbnN0YW5jZS0+c3RhdHVzICE9CisJCQkJCQkgICAgICBhb19zdGF0dXNfc2luZ2xlX3J1bikKKwkJCQkJCSAgJiYgKGluc3RhbmNlLT5zdGF0dXMgIT0KKwkJCQkJCSAgICAgIGFvX3N0YXR1c19zaW5nbGVfZW5kX3dhaXQpCisJCQkJCQkgICYmIChpbnN0YW5jZS0+c3RhdHVzICE9CisJCQkJCQkgICAgICBhb19zdGF0dXNfc3RyZWFtX3J1bl93YWl0KQorCQkJCQkJICAmJiAoaW5zdGFuY2UtPnN0YXR1cyAhPQorCQkJCQkJICAgICAgYW9fc3RhdHVzX3N0cmVhbV9ydW4pCisJCQkJCQkgICYmIChpbnN0YW5jZS0+c3RhdHVzICE9CisJCQkJCQkgICAgICBhb19zdGF0dXNfc3RyZWFtX2VuZF93YWl0KSksCisJCQkJCQkgTE9OR19NQVgpOworCisJCWlmIChpbnN0YW5jZS0+c3RhdHVzICE9IGFvX3N0YXR1c19zdHJlYW1fZW5kKSB7CisJCQlQREVCVUcoIldhaXQgZm9yIElETEUgY2FuY2VsZWQuICVkXG4iLAorCQkJICAgICAgIGluc3RhbmNlLT5zdGF0dXMpOworCQkJZXJyID0gTUVfRVJSTk9fQ0FOQ0VMTEVEOworCQl9CisKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQlQRVJST1IoIldhaXQgZm9yIElETEUgaW50ZXJydXB0ZWQuXG4iKTsKKwkJCWluc3RhbmNlLT5zdGF0dXMgPSBhb19zdGF0dXNfbm9uZTsKKwkJCWFvX3N0b3BfaW1tZWRpYXRlbHkoaW5zdGFuY2UpOworCQkJZXJyID0gTUVfRVJSTk9fU0lHTkFMOworCQl9CisKKwkJKnN0YXR1cyA9IE1FX1NUQVRVU19JRExFOworCX0KKworCSp2YWx1ZXMgPSBtZV9jaXJjX2J1Zl9zcGFjZSgmaW5zdGFuY2UtPmNpcmNfYnVmKTsKKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZTYwMDBfYW9faW9fc3RyZWFtX3N0b3AobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgaW50IHN0b3BfbW9kZSwgaW50IGZsYWdzKQorewkJCQkvLy8gQG5vdGUgU3RvcCB3b3JrIGFuZCBlbXB0eSBidWZmZXIgYW5kIEZJRk8KKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwltZTYwMDBfYW9fc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCXVuc2lnbmVkIGxvbmcgY3B1X2ZsYWdzOworCXZvbGF0aWxlIHVpbnQzMl90IGN0cmw7CisKKwlpbnN0YW5jZSA9IChtZTYwMDBfYW9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJUERFQlVHKCJleGVjdXRlZC4gaWR4PSVkXG4iLCBpbnN0YW5jZS0+YW9faWR4KTsKKworCWlmIChmbGFncyAmIH5NRV9JT19TVFJFQU1fU1RPUF9QUkVTRVJWRV9CVUZGRVJTKSB7CisJCVBFUlJPUigiSW52YWxpZCBmbGFnIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlpZiAoKHN0b3BfbW9kZSAhPSBNRV9TVE9QX01PREVfSU1NRURJQVRFKQorCSAgICAmJiAoc3RvcF9tb2RlICE9IE1FX1NUT1BfTU9ERV9MQVNUX1ZBTFVFKSkgeworCQlQRVJST1IoIkludmFsaWQgc3RvcCBtb2RlIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9TVE9QX01PREU7CisJfQorCisJaWYgKCEoaW5zdGFuY2UtPmZpZm8gJiBNRTYwMDBfQU9fSEFTX0ZJRk8pKSB7CisJCVBFUlJPUigiTm90IGEgc3RyZWFtaW5nIGFvLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19OT1RfU1VQUE9SVEVEOworCX0KKworCWlmIChpbnN0YW5jZS0+c3RhdHVzIDwgYW9fc3RhdHVzX3N0cmVhbV9jb25maWd1cmVkKSB7CisJCS8vVGhlcmUgaXMgbm90aGluZyB0byBzdG9wIQorCQlQRVJST1IoIlN1YmRldmljZSBub3QgaW4gc3RyZWFtaW5nIG1vZGUuICVkXG4iLAorCQkgICAgICAgaW5zdGFuY2UtPnN0YXR1cyk7CisJCXJldHVybiBNRV9FUlJOT19QUkVWSU9VU19DT05GSUc7CisJfQorCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJLy9NYXJrIGFzIHN0b3BwaW5nLiA9PiBTb2Z0d2FyZSBzdG9wLgorCWluc3RhbmNlLT5zdGF0dXMgPSBhb19zdGF0dXNfc3RyZWFtX2VuZF93YWl0OworCisJaWYgKHN0b3BfbW9kZSA9PSBNRV9TVE9QX01PREVfSU1NRURJQVRFKSB7CS8vU3RvcHBlZCBub3chCisJCWVyciA9IGFvX3N0b3BfaW1tZWRpYXRlbHkoaW5zdGFuY2UpOworCX0gZWxzZSBpZiAoc3RvcF9tb2RlID09IE1FX1NUT1BfTU9ERV9MQVNUX1ZBTFVFKSB7CisJCWN0cmwgPSBpbmwoaW5zdGFuY2UtPmN0cmxfcmVnKSAmIE1FNjAwMF9BT19DVFJMX01PREVfTUFTSzsKKwkJaWYgKGN0cmwgPT0gTUU2MDAwX0FPX01PREVfV1JBUEFST1VORCkgewkvL0hhcmR3YXJlIHdyYXBhcm91bmQgPT4gSGFyZHdhcmUgc3RvcC4KKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisJCQljdHJsID0gaW5sKGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCQljdHJsIHw9IE1FNjAwMF9BT19DVFJMX0JJVF9TVE9QOworCQkJY3RybCAmPSB+TUU2MDAwX0FPX0NUUkxfQklUX0VOQUJMRV9JUlE7CisJCQlvdXRsKGN0cmwsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCQlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgY3RybCk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssCisJCQkJCSAgICAgICBjcHVfZmxhZ3MpOworCisJCQkvL1Jlc2V0IGludGVycnVwdCBsYXRjaAorCQkJaW5sKGluc3RhbmNlLT5pcnFfcmVzZXRfcmVnKTsKKwkJfQorCQkvL09ubHkgcnVuaW5nIHByb2Nlc3Mgd2lsbCBpbnRlcnJ1cHQgdGhpcyBjYWxsLiBFdmVudHMgYXJlIHNpZ25hbGVkIHdoZW4gc3RhdHVzIGNoYW5nZS4gRXh0cmEgdGltZW91dCBhZGQgZm9yIHNhZmUgcmVhc29uLgorCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChpbnN0YW5jZS0+d2FpdF9xdWV1ZSwKKwkJCQkJCSAoaW5zdGFuY2UtPnN0YXR1cyAhPQorCQkJCQkJICBhb19zdGF0dXNfc3RyZWFtX2VuZF93YWl0KSwKKwkJCQkJCSBMT05HX01BWCk7CisKKwkJaWYgKGluc3RhbmNlLT5zdGF0dXMgIT0gYW9fc3RhdHVzX3N0cmVhbV9lbmQpIHsKKwkJCVBERUJVRygiU3RvcHBpbmcgc3RyZWFtIGNhbmNlbGVkLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19DQU5DRUxMRUQ7CisJCX0KKworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCVBFUlJPUigiU3RvcHBpbmcgc3RyZWFtIGludGVycnVwdGVkLlxuIik7CisJCQlpbnN0YW5jZS0+c3RhdHVzID0gYW9fc3RhdHVzX25vbmU7CisJCQlhb19zdG9wX2ltbWVkaWF0ZWx5KGluc3RhbmNlKTsKKwkJCWVyciA9IE1FX0VSUk5PX1NJR05BTDsKKwkJfQorCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisJY3RybCA9IGlubChpbnN0YW5jZS0+Y3RybF9yZWcpOworCWN0cmwgfD0gTUU2MDAwX0FPX0NUUkxfQklUX1NUT1AgfCBNRTYwMDBfQU9fQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1A7CisJY3RybCAmPSB+TUU2MDAwX0FPX0NUUkxfQklUX0VOQUJMRV9JUlE7CisJaWYgKCFmbGFncykgewkJLy9SZXNldCBGSUZPCisJCWN0cmwgJj0gfk1FNjAwMF9BT19DVFJMX0JJVF9FTkFCTEVfRklGTzsKKwl9CisJb3V0bChjdHJsLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCBjdHJsKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisKKwkvL1Jlc2V0IGludGVycnVwdCBsYXRjaAorCWlubChpbnN0YW5jZS0+aXJxX3Jlc2V0X3JlZyk7CisKKwlpZiAoIWZsYWdzKSB7CQkvL1Jlc2V0IHNvZnR3YXJlIGJ1ZmZlcgorCQlpbnN0YW5jZS0+Y2lyY19idWYuaGVhZCA9IDA7CisJCWluc3RhbmNlLT5jaXJjX2J1Zi50YWlsID0gMDsKKwkJaW5zdGFuY2UtPnByZWxvYWRlZF9jb3VudCA9IDA7CisJCWluc3RhbmNlLT5kYXRhX2NvdW50ID0gMDsKKwl9CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWU2MDAwX2FvX2lvX3N0cmVhbV93cml0ZShtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgIGludCB3cml0ZV9tb2RlLAorCQkJCSAgICAgaW50ICp2YWx1ZXMsIGludCAqY291bnQsIGludCBmbGFncykKK3sKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwltZTYwMDBfYW9fc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCXVuc2lnbmVkIGxvbmcgY3B1X2ZsYWdzID0gMDsKKwl1aW50MzJfdCByZWdfY29weTsKKworCWludCBjb3BpZWRfZnJvbV91c2VyID0gMDsKKwlpbnQgbGVmdF90b19jb3B5X2Zyb21fdXNlciA9ICpjb3VudDsKKworCWludCBjb3BpZWRfdmFsdWVzOworCisJaW5zdGFuY2UgPSAobWU2MDAwX2FvX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCVBERUJVRygiZXhlY3V0ZWQuIGlkeD0lZFxuIiwgaW5zdGFuY2UtPmFvX2lkeCk7CisKKwkvL0NoZWNraW5nIGFyZ3VtZW50cworCWlmICghKGluc3RhbmNlLT5maWZvICYgTUU2MDAwX0FPX0hBU19GSUZPKSkgeworCQlQRVJST1IoIk5vdCBhIHN0cmVhbWluZyBhby5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fTk9UX1NVUFBPUlRFRDsKKwl9CisKKwlpZiAoZmxhZ3MpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWcgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCWlmICgqY291bnQgPD0gMCkgeworCQlQRVJST1IoIkludmFsaWQgY291bnQgb2YgdmFsdWVzIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9WQUxVRV9DT1VOVDsKKwl9CisKKwlpZiAodmFsdWVzID09IE5VTEwpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGFkZHJlc3Mgb2YgdmFsdWVzIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9QT0lOVEVSOworCX0KKworCWlmICgoaW5zdGFuY2UtPnN0YXR1cyA9PSBhb19zdGF0dXNfbm9uZSkgfHwgKGluc3RhbmNlLT5zdGF0dXMgPT0gYW9fc3RhdHVzX3NpbmdsZV9jb25maWd1cmVkKSkgewkvL1RoZSBkZXZpY2UgaXMgaW4gc2luZ2xlIG1vZGUuCisJCVBFUlJPUgorCQkgICAgKCJTdWJkZXZpY2UgbXVzdCBiZSBwcmVpbml0aWFsaXplIGNvcnJlY3RseSBmb3Igc3RyZWFtaW5nLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19QUkVWSU9VU19DT05GSUc7CisJfQorCisJc3dpdGNoICh3cml0ZV9tb2RlKSB7CisJY2FzZSBNRV9XUklURV9NT0RFX1BSRUxPQUQ6CisKKwkJLy9EZXZpY2UgbXVzdCBiZSBzdG9wcGVkLgorCQlpZiAoKGluc3RhbmNlLT5zdGF0dXMgIT0gYW9fc3RhdHVzX3N0cmVhbV9jb25maWd1cmVkKQorCQkgICAgJiYgKGluc3RhbmNlLT5zdGF0dXMgIT0gYW9fc3RhdHVzX3N0cmVhbV9lbmQpKSB7CisJCQlQRVJST1IKKwkJCSAgICAoIlN1YmRldmljZSBtdXN0bid0IGJlIHJ1bmluZyB3aGVuICdwcmUtbG9hZCcgbW9kZSBpcyB1c2VkLlxuIik7CisJCQlyZXR1cm4gTUVfRVJSTk9fUFJFVklPVVNfQ09ORklHOworCQl9CisJCWJyZWFrOworCWNhc2UgTUVfV1JJVEVfTU9ERV9OT05CTE9DS0lORzoKKwljYXNlIE1FX1dSSVRFX01PREVfQkxPQ0tJTkc6CisJCS8vLyBAbm90ZSBJbiBibG9ja2luZyBtb2RlOiBXaGVuIGRldmljZSBpcyBub3QgcnVuaW5nIGFuZCB0aGVyZSBpcyBub3QgZW5vdWdodCBzcGFjZSBjYWxsIHdpbGwgYmxvY2tlZCB1cCEKKwkJLy8vIEBub3RlIFNvbWUgb3RoZXIgdGhyZWFkIG11c3QgZW1wdHkgYnVmZmVyIGJ5IHN0cmF0aW5nIGVuZ2luZS4KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlQRVJST1IoIkludmFsaWQgd3JpdGUgbW9kZSBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfV1JJVEVfTU9ERTsKKwl9CisKKwlpZiAoaW5zdGFuY2UtPm1vZGUgJiBNRTYwMDBfQU9fV1JBUF9NT0RFKSB7CS8vV3JhcGFyb3VuZCBtb2RlLiBEZXZpY2UgbXVzdCBiZSBzdG9wcGVkLgorCQlpZiAoKGluc3RhbmNlLT5zdGF0dXMgIT0gYW9fc3RhdHVzX3N0cmVhbV9jb25maWd1cmVkKQorCQkgICAgJiYgKGluc3RhbmNlLT5zdGF0dXMgIT0gYW9fc3RhdHVzX3N0cmVhbV9lbmQpKSB7CisJCQlQRVJST1IKKwkJCSAgICAoIlN1YmRldmljZSBtdXN0bid0IGJlIHJ1bmluZyB3aGVuICdwcmUtbG9hZCcgbW9kZSBpcyB1c2VkLlxuIik7CisJCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9XUklURV9NT0RFOworCQl9CisJfQorCisJaWYgKChpbnN0YW5jZS0+bW9kZSA9PSBNRTYwMDBfQU9fSFdfV1JBUF9NT0RFKQorCSAgICAmJiAod3JpdGVfbW9kZSAhPSBNRV9XUklURV9NT0RFX1BSRUxPQUQpKSB7CisvKgorCQlQRVJST1IoIk9ubHkgJ3ByZS1sb2FkJyB3cml0ZSBpcyBhY2NlcHRhYmxlIGluIGhhcmR3YXJlIHdyYXBhcm91bmQgbW9kZS5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fUFJFVklPVVNfQ09ORklHOworKi8KKwkJLy9UaGlzIGlzIHRyYW5zcGFyZW50IGZvciB1c2VyLgorCQlQREVCVUcoIkNoYW5naW5nIHdyaXRlX21vZGUgdG8gTUVfV1JJVEVfTU9ERV9QUkVMT0FELlxuIik7CisJCXdyaXRlX21vZGUgPSBNRV9XUklURV9NT0RFX1BSRUxPQUQ7CisJfQorCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJaWYgKHdyaXRlX21vZGUgPT0gTUVfV1JJVEVfTU9ERV9QUkVMT0FEKSB7CS8vSW5pdCBlbnZpcm9tZW50IC0gcHJlbG9hZAorCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCQlyZWdfY29weSA9IGlubChpbnN0YW5jZS0+Y3RybF9yZWcpOworCQkvL0NoZWNrIEZJRk8KKwkJaWYgKCEocmVnX2NvcHkgJiBNRTYwMDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0ZJRk8pKSB7CS8vRklGTyBub3QgYWN0aXZlLiBFbmFibGUgaXQuCisJCQlyZWdfY29weSB8PSBNRTYwMDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0ZJRk87CisJCQlvdXRsKHJlZ19jb3B5LCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQkJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIHJlZ19jb3B5KTsKKwkJCWluc3RhbmNlLT5wcmVsb2FkZWRfY291bnQgPSAwOworCQl9CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKwl9CisKKwl3aGlsZSAoMSkgeworCQkvL0NvcHkgdG8gYnVmZmVyLiBUaGlzIHN0ZXAgaXMgY29tbW9uIGZvciBhbGwgbW9kZXMuCisJCWNvcGllZF9mcm9tX3VzZXIgPQorCQkgICAgYW9fZ2V0X2RhdGFfZnJvbV91c2VyKGluc3RhbmNlLCBsZWZ0X3RvX2NvcHlfZnJvbV91c2VyLAorCQkJCQkgIHZhbHVlcyArICgqY291bnQgLQorCQkJCQkJICAgIGxlZnRfdG9fY29weV9mcm9tX3VzZXIpKTsKKwkJbGVmdF90b19jb3B5X2Zyb21fdXNlciAtPSBjb3BpZWRfZnJvbV91c2VyOworCisJCXJlZ19jb3B5ID0gaW5sKGluc3RhbmNlLT5zdGF0dXNfcmVnKTsKKwkJaWYgKChpbnN0YW5jZS0+c3RhdHVzID09IGFvX3N0YXR1c19zdHJlYW1fcnVuKSAmJiAhKHJlZ19jb3B5ICYgTUU2MDAwX0FPX1NUQVRVU19CSVRfRlNNKSkgewkvL0JST0tFTiBQSVBFISBUaGUgc3RhdGUgbWFjaGluZSBpcyBzdG9wZWQgYnV0IGxvZ2ljYWwgc3RhdHVzIHNob3cgdGhhdCBzaG91bGQgYmUgd29ya2luZy4KKwkJCVBFUlJPUigiQnJva2VuIHBpcGUgaW4gd3JpdGUuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX1NVQkRFVklDRV9OT1RfUlVOTklORzsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKChpbnN0YW5jZS0+c3RhdHVzID09IGFvX3N0YXR1c19zdHJlYW1fcnVuKSAmJiAoaW5zdGFuY2UtPm1vZGUgPT0gTUU2MDAwX0FPX0NPTlRJTk9VUykgJiYgKHJlZ19jb3B5ICYgTUU2MDAwX0FPX1NUQVRVU19CSVRfSEYpKSB7CS8vQ29udGlub3VzIG1vZGUgcnVuaW5nIGFuZCBkYXRhIGFyZSBiZWxvdyBoYWxmIQorCisJCQkvLyBCbG9jayBpbnRlcnJ1cHRzLgorCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKwkJCXJlZ19jb3B5ID0gaW5sKGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCQlyZWdfY29weSAmPSB+TUU2MDAwX0FPX0NUUkxfQklUX0VOQUJMRV9JUlE7CisJCQlvdXRsKHJlZ19jb3B5LCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQkJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIHJlZ19jb3B5KTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywKKwkJCQkJICAgICAgIGNwdV9mbGFncyk7CisKKwkJCS8vRmFzdCBjb3B5CisJCQljb3BpZWRfdmFsdWVzID0KKwkJCSAgICBhb193cml0ZV9kYXRhKGluc3RhbmNlLCBNRTYwMDBfQU9fRklGT19DT1VOVCAvIDIsCisJCQkJCSAgMCk7CisJCQlpZiAoY29waWVkX3ZhbHVlcyA+IDApIHsKKwkJCQlpbnN0YW5jZS0+Y2lyY19idWYudGFpbCArPSBjb3BpZWRfdmFsdWVzOworCQkJCWluc3RhbmNlLT5jaXJjX2J1Zi50YWlsICY9CisJCQkJICAgIGluc3RhbmNlLT5jaXJjX2J1Zi5tYXNrOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJLy9SZXNldCBpbnRlcnJ1cHQgbGF0Y2gKKwkJCWlubChpbnN0YW5jZS0+aXJxX3Jlc2V0X3JlZyk7CisKKwkJCS8vIEFjdGl2YXRlIGludGVycnVwdHMuCisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCQkJcmVnX2NvcHkgPSBpbmwoaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJCXJlZ19jb3B5IHw9IE1FNjAwMF9BT19DVFJMX0JJVF9FTkFCTEVfSVJROworCQkJb3V0bChyZWdfY29weSwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICByZWdfY29weSk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssCisJCQkJCSAgICAgICBjcHVfZmxhZ3MpOworCisJCQlpZiAoY29waWVkX3ZhbHVlcyA9PSAwKSB7CS8vVGhpcyB3YXMgY2hlY2tlZCBhbmQgbmV2ZXIgc2hvdWxkIGhhcHBlbmQhCisJCQkJUEVSUk9SX0NSSVRJQ0FMKCJDT1BZIEZJTklTSCBXSVRIIDAhXG4iKTsKKwkJCX0KKworCQkJaWYgKGNvcGllZF92YWx1ZXMgPCAwKSB7CS8vVGhpcyB3YXMgY2hlY2tlZCBhbmQgbmV2ZXIgc2hvdWxkIGhhcHBlbmQhCisJCQkJUEVSUk9SX0NSSVRJQ0FMKCJDT1BZIEZJTklTSCBXSVRIIEVSUk9SIVxuIik7CisJCQkJaW5zdGFuY2UtPnN0YXR1cyA9IGFvX3N0YXR1c19zdHJlYW1fZmlmb19lcnJvcjsKKwkJCQllcnIgPSBNRV9FUlJOT19GSUZPX0JVRkZFUl9PVkVSRkxPVzsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCWlmICghbGVmdF90b19jb3B5X2Zyb21fdXNlcikgewkvL0FsbCBkYXRhcyB3ZXJlIGNvcGllZC4KKwkJCWJyZWFrOworCQl9IGVsc2UgewkvL05vdCBhbGwgZGF0YXMgd2VyZSBjb3BpZWQuCisJCQlpZiAoaW5zdGFuY2UtPm1vZGUgJiBNRTYwMDBfQU9fV1JBUF9NT0RFKSB7CS8vRXJyb3IgdG9vIG11Y2ggZGF0YXMhIFdyYXBhcm91bmQgaXMgbGltaXRlZCBpbiBzaXplIQorCQkJCVBFUlJPUgorCQkJCSAgICAoIlRvbyBtdWNoIGRhdGEgZm9yIHdyYXBhcm91bmQgbW9kZSEgIEV4Y2VlZGVkIHNpemUgb2YgJWxkLlxuIiwKKwkJCQkgICAgIE1FNjAwMF9BT19DSVJDX0JVRl9DT1VOVCAtIDEpOworCQkJCWVyciA9IE1FX0VSUk5PX1JJTkdfQlVGRkVSX09WRVJGTE9XOworCQkJCWJyZWFrOworCQkJfQorCisJCQlpZiAod3JpdGVfbW9kZSAhPSBNRV9XUklURV9NT0RFX0JMT0NLSU5HKSB7CS8vTm9uIGJsb2NraW5nIGNhbGxzCisJCQkJYnJlYWs7CisJCQl9CisKKwkJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShpbnN0YW5jZS0+d2FpdF9xdWV1ZSwKKwkJCQkJCSBtZV9jaXJjX2J1Zl9zcGFjZSgmaW5zdGFuY2UtPgorCQkJCQkJCQkgICBjaXJjX2J1ZikpOworCisJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCQlQRVJST1IoIldyaXRpbmcgaW50ZXJydXB0ZWQgYnkgc2lnbmFsLlxuIik7CisJCQkJaW5zdGFuY2UtPnN0YXR1cyA9IGFvX3N0YXR1c19ub25lOworCQkJCWFvX3N0b3BfaW1tZWRpYXRlbHkoaW5zdGFuY2UpOworCQkJCWVyciA9IE1FX0VSUk5PX1NJR05BTDsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJaWYgKGluc3RhbmNlLT5zdGF0dXMgPT0gYW9fc3RhdHVzX25vbmUpIHsJLy9SZXNldAorCQkJCVBFUlJPUigiV3JpdGluZyBpbnRlcnJ1cHRlZCBieSByZXNldC5cbiIpOworCQkJCWVyciA9IE1FX0VSUk5PX0NBTkNFTExFRDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCWlmICh3cml0ZV9tb2RlID09IE1FX1dSSVRFX01PREVfUFJFTE9BRCkgewkvL0NvcHkgZGF0YSB0byBGSUZPIC0gcHJlbG9hZAorCQljb3BpZWRfdmFsdWVzID0KKwkJICAgIGFvX3dyaXRlX2RhdGFfcG9vbGluZyhpbnN0YW5jZSwgTUU2MDAwX0FPX0ZJRk9fQ09VTlQsCisJCQkJCSAgaW5zdGFuY2UtPnByZWxvYWRlZF9jb3VudCk7CisJCWluc3RhbmNlLT5wcmVsb2FkZWRfY291bnQgKz0gY29waWVkX3ZhbHVlczsKKwkJaW5zdGFuY2UtPmRhdGFfY291bnQgKz0gY29waWVkX3ZhbHVlczsKKworCQlpZiAoKGluc3RhbmNlLT5tb2RlID09IE1FNjAwMF9BT19IV19XUkFQX01PREUpCisJCSAgICAmJiAobWVfY2lyY19idWZfdmFsdWVzKCZpbnN0YW5jZS0+Y2lyY19idWYpID4KKwkJCU1FNjAwMF9BT19GSUZPX0NPVU5UKSkgeworCQkJUEVSUk9SCisJCQkgICAgKCJUb28gbXVjaCBkYXRhIGZvciBoYXJkd2FyZSB3cmFwYXJvdW5kIG1vZGUhIEV4Y2VlZGVkIHNpemUgb2YgJWQuXG4iLAorCQkJICAgICBNRTYwMDBfQU9fRklGT19DT1VOVCk7CisJCQllcnIgPSBNRV9FUlJOT19GSUZPX0JVRkZFUl9PVkVSRkxPVzsKKwkJfQorCX0KKworCSpjb3VudCA9ICpjb3VudCAtIGxlZnRfdG9fY29weV9mcm9tX3VzZXI7CisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gZXJyOworfQorCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsIDYsIDE5KQorc3RhdGljIGlycXJldHVybl90IG1lNjAwMF9hb19pc3IoaW50IGlycSwgdm9pZCAqZGV2X2lkKQorI2Vsc2UKK3N0YXRpYyBpcnFyZXR1cm5fdCBtZTYwMDBfYW9faXNyKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCisjZW5kaWYKK3sKKwltZTYwMDBfYW9fc3ViZGV2aWNlX3QgKmluc3RhbmNlID0gZGV2X2lkOworCXVpbnQzMl90IGlycV9zdGF0dXM7CisJdWludDMyX3QgY3RybDsKKwl1aW50MzJfdCBzdGF0dXM7CisJaW50IGNvdW50ID0gMDsKKworCVBERUJVRygiZXhlY3V0ZWQuIGlkeD0lZFxuIiwgaW5zdGFuY2UtPmFvX2lkeCk7CisKKwlpZiAoaXJxICE9IGluc3RhbmNlLT5pcnEpIHsKKwkJUEVSUk9SKCJJbmNvcnJlY3QgaW50ZXJydXB0IG51bTogJWQuXG4iLCBpcnEpOworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCisJaXJxX3N0YXR1cyA9IGlubChpbnN0YW5jZS0+aXJxX3N0YXR1c19yZWcpOworCWlmICghKGlycV9zdGF0dXMgJiAoTUU2MDAwX0lSUV9TVEFUVVNfQklUX0FPX0hGIDw8IGluc3RhbmNlLT5hb19pZHgpKSkgeworCQlQSU5GTygiJWxkIFNoYXJlZCBpbnRlcnJ1cHQuICVzKCk6IElEPSVkOiBzdGF0dXNfcmVnPTB4JTA0WFxuIiwKKwkJICAgICAgamlmZmllcywgX19mdW5jX18sIGluc3RhbmNlLT5hb19pZHgsIGlycV9zdGF0dXMpOworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCisJaWYgKCFpbnN0YW5jZS0+Y2lyY19idWYuYnVmKSB7CisJCWluc3RhbmNlLT5zdGF0dXMgPSBhb19zdGF0dXNfc3RyZWFtX2Vycm9yOworCQlQRVJST1JfQ1JJVElDQUwoIkNJUkNVTEFSIEJVRkZFUiBOT1QgRVhJU1RTIVxuIik7CisJCS8vQmxvY2sgaW50ZXJydXB0cy4gU3RvcCBtYWNoaW5lLgorCQljdHJsID0gaW5sKGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCWN0cmwgJj0gfk1FNjAwMF9BT19DVFJMX0JJVF9FTkFCTEVfSVJROworCQljdHJsIHw9CisJCSAgICBNRTYwMDBfQU9fQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1AgfCBNRTYwMDBfQU9fQ1RSTF9CSVRfU1RPUDsKKwkJb3V0bChjdHJsLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCBjdHJsKTsKKworCQkvL0luZm9ybSB1c2VyCisJCXdha2VfdXBfaW50ZXJydXB0aWJsZV9hbGwoJmluc3RhbmNlLT53YWl0X3F1ZXVlKTsKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KKworCXN0YXR1cyA9IGlubChpbnN0YW5jZS0+c3RhdHVzX3JlZyk7CisJaWYgKCEoc3RhdHVzICYgTUU2MDAwX0FPX1NUQVRVU19CSVRfRlNNKSkgewkvL1RvbyBsYXRlLiBOb3Qgd29ya2luZyEgRU5EPyBCUk9LRU4gUElQRT8KKwkJLy8vIEBub3RlIEVycm9yIGNoZWNraW5nIHdhcyBtb3ZlZCB0byBzZXBhcmF0ZSB0YXNrLgorCQlQREVCVUcoIkludGVycnVwdCBjb21lIGJ1dCBJU00gaXMgbm90IHdvcmtpbmchXG4iKTsKKwkJLy9CbG9jayBpbnRlcnJ1cHRzLiBTdG9wIG1hY2hpbmUuCisJCWN0cmwgPSBpbmwoaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJY3RybCAmPSB+TUU2MDAwX0FPX0NUUkxfQklUX0VOQUJMRV9JUlE7CisJCWN0cmwgfD0KKwkJICAgIE1FNjAwMF9BT19DVFJMX0JJVF9TVE9QIHwgTUU2MDAwX0FPX0NUUkxfQklUX0lNTUVESUFURV9TVE9QOworCQlvdXRsKGN0cmwsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIGN0cmwpOworCisJCS8vUmVzZXQgaW50ZXJydXB0IGxhdGNoCisJCWlubChpbnN0YW5jZS0+aXJxX3Jlc2V0X3JlZyk7CisKKwkJLy8vIEBub3RlIFVzZXIgbm90aWZpY2F0aW9uIHdhcyBhbHNvIG1vdmVkIHRvIHNlcGFyYXRlIHRhc2suCisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9CisJLy9HZW5lcmFsIHByb2NlZHVyZS4gUHJvY2VzcyBtb3JlIGRhdGFzLgorCisjaWZkZWYgTUVERUJVR19ERUJVRworCWlmICghbWVfY2lyY19idWZfdmFsdWVzKCZpbnN0YW5jZS0+Y2lyY19idWYpKSB7CS8vQnVmZmVyIGlzIGVtcHR5IQorCQlQREVCVUcoIkNpcmN1bGFyIGJ1ZmZlciBlbXB0eSFcbiIpOworCX0KKyNlbmRpZgorCisJLy9DaGVjayBGSUZPCisJaWYgKHN0YXR1cyAmIE1FNjAwMF9BT19TVEFUVVNfQklUX0hGKSB7CS8vT0sgbGVzcyB0aGFuIGhhbGYKKworCQkvL0Jsb2NrIGludGVycnVwdHMKKwkJY3RybCA9IGlubChpbnN0YW5jZS0+Y3RybF9yZWcpOworCQljdHJsICY9IH5NRTYwMDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0lSUTsKKwkJb3V0bChjdHJsLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCBjdHJsKTsKKworCQlkbyB7CisJCQkvL0NhbGN1bGF0ZSBob3cgbWFueSBzaG91bGQgYmUgY29waWVkLgorCQkJY291bnQgPQorCQkJICAgIChpbnN0YW5jZS0+c3RvcF9kYXRhX2NvdW50KSA/IGluc3RhbmNlLT4KKwkJCSAgICBzdG9wX2RhdGFfY291bnQgLQorCQkJICAgIGluc3RhbmNlLT5kYXRhX2NvdW50IDogTUU2MDAwX0FPX0ZJRk9fQ09VTlQgLyAyOworCQkJaWYgKE1FNjAwMF9BT19GSUZPX0NPVU5UIC8gMiA8IGNvdW50KSB7CisJCQkJY291bnQgPSBNRTYwMDBfQU9fRklGT19DT1VOVCAvIDI7CisJCQl9CisJCQkvL0NvcHkgZGF0YQorCQkJaWYgKGluc3RhbmNlLT5tb2RlID09IE1FNjAwMF9BT19DT05USU5PVVMpIHsJLy9Db250aW5vdXMKKwkJCQljb3VudCA9IGFvX3dyaXRlX2RhdGEoaW5zdGFuY2UsIGNvdW50LCAwKTsKKwkJCQlpZiAoY291bnQgPiAwKSB7CisJCQkJCWluc3RhbmNlLT5jaXJjX2J1Zi50YWlsICs9IGNvdW50OworCQkJCQlpbnN0YW5jZS0+Y2lyY19idWYudGFpbCAmPQorCQkJCQkgICAgaW5zdGFuY2UtPmNpcmNfYnVmLm1hc2s7CisJCQkJCWluc3RhbmNlLT5kYXRhX2NvdW50ICs9IGNvdW50OworCisJCQkJCWlmICgoaW5zdGFuY2UtPnN0YXR1cyA9PSBhb19zdGF0dXNfc3RyZWFtX2VuZF93YWl0KSAmJiAhbWVfY2lyY19idWZfdmFsdWVzKCZpbnN0YW5jZS0+Y2lyY19idWYpKSB7CS8vU3RvcGluZy4gV2hvbGUgYnVmZmVyIHdhcyBjb3BpZWQuCisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCX0gZWxzZSBpZiAoKGluc3RhbmNlLT5tb2RlID09IE1FNjAwMF9BT19TV19XUkFQX01PREUpICYmICgoY3RybCAmIE1FNjAwMF9BT19DVFJMX01PREVfTUFTSykgPT0gTUU2MDAwX0FPX01PREVfQ09OVElOVU9VUykpIHsJLy9XcmFwYXJvdW5kIChzb2Z0d2FyZSkKKwkJCQlpZiAoaW5zdGFuY2UtPnN0YXR1cyA9PSBhb19zdGF0dXNfc3RyZWFtX2VuZF93YWl0KSB7CS8vV2Ugc3RvcGluZyA9PiBDb3B5IHRvIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlci4KKwkJCQkJY291bnQgPQorCQkJCQkgICAgYW9fd3JpdGVfZGF0YShpbnN0YW5jZSwgY291bnQsIDApOworCQkJCX0gZWxzZSB7CS8vQ29weSBpbiB3cmFwYXJvdW5kIG1vZGUuCisJCQkJCWNvdW50ID0KKwkJCQkJICAgIGFvX3dyaXRlX2RhdGFfd3JhcGFyb3VuZChpbnN0YW5jZSwKKwkJCQkJCQkJICAgICBjb3VudCwKKwkJCQkJCQkJICAgICBpbnN0YW5jZS0+CisJCQkJCQkJCSAgICAgcHJlbG9hZGVkX2NvdW50KTsKKwkJCQl9CisKKwkJCQlpZiAoY291bnQgPiAwKSB7CisJCQkJCWluc3RhbmNlLT5kYXRhX2NvdW50ICs9IGNvdW50OworCQkJCQlpbnN0YW5jZS0+cHJlbG9hZGVkX2NvdW50ICs9IGNvdW50OworCQkJCQlpbnN0YW5jZS0+cHJlbG9hZGVkX2NvdW50ICU9CisJCQkJCSAgICBtZV9jaXJjX2J1Zl92YWx1ZXMoJmluc3RhbmNlLT4KKwkJCQkJCQkgICAgICAgY2lyY19idWYpOworCisJCQkJCWlmICgoaW5zdGFuY2UtPnN0YXR1cyA9PSBhb19zdGF0dXNfc3RyZWFtX2VuZF93YWl0KSAmJiAhaW5zdGFuY2UtPnByZWxvYWRlZF9jb3VudCkgewkvL1N0b3BpbmcuIFdob2xlIGJ1ZmZlciB3YXMgY29waWVkLgorCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisJCQl9CisKKwkJCWlmICgoY291bnQgPD0gMCkgfHwgKGluc3RhbmNlLT5zdG9wX2RhdGFfY291bnQgJiYgKGluc3RhbmNlLT5zdG9wX2RhdGFfY291bnQgPD0gaW5zdGFuY2UtPmRhdGFfY291bnQpKSkgewkvL0VuZCBvZiB3b3JrLgorCQkJCWJyZWFrOworCQkJfQorCQl9CQkvL1JlcGVhdCBpZiBzdGlsbCBpcyB1bmRlciBoYWxmIGZpZm8KKwkJd2hpbGUgKChzdGF0dXMgPQorCQkJaW5sKGluc3RhbmNlLT5zdGF0dXNfcmVnKSkgJiBNRTYwMDBfQU9fU1RBVFVTX0JJVF9IRik7CisKKwkJLy9VbmJsb2NrIGludGVycnVwdHMKKwkJY3RybCA9IGlubChpbnN0YW5jZS0+Y3RybF9yZWcpOworCQlpZiAoY291bnQgPj0gMCkgewkvL0NvcHkgd2FzIHN1Y2Nlc3NmdWwuCisJCQlpZiAoaW5zdGFuY2UtPnN0b3BfZGF0YV9jb3VudCAmJiAoaW5zdGFuY2UtPnN0b3BfZGF0YV9jb3VudCA8PSBpbnN0YW5jZS0+ZGF0YV9jb3VudCkpIHsJLy9GaW5pc2hpbmcgd29yay4gTm8gbW9yZSBpbnRlcnJ1cHRzLgorCQkJCVBERUJVRygiRmluaXNoaW5nIHdvcmsuIEludGVycnVwdCBkaXNhYmxlZC5cbiIpOworCQkJCWluc3RhbmNlLT5zdGF0dXMgPSBhb19zdGF0dXNfc3RyZWFtX2VuZF93YWl0OworCQkJfSBlbHNlIGlmIChjb3VudCA+IDApIHsJLy9Ob3JtYWwgd29yay4gRW5hYmxlIGludGVycnVwdC4KKwkJCQlQREVCVUcoIk5vcm1hbCB3b3JrLiBFbmFibGUgaW50ZXJydXB0LlxuIik7CisJCQkJY3RybCB8PSBNRTYwMDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0lSUTsKKwkJCX0gZWxzZSB7CS8vTm9ybWFsIHdvcmsgYnV0IHRoZXJlIGFyZSBubyBtb3JlIGRhdGEgaW4gYnVmZmVyLiBJbnRlcnJ1cHQgYmxvY2tlZC4gc3RyZWFtX3dyaXRlKCkgd2lsbCB1bmJsb2NrIGl0LgorCQkJCVBERUJVRworCQkJCSAgICAoIk5vIGRhdGEgaW4gc29mdHdhcmUgYnVmZmVyLiBJbnRlcnJ1cHQgYmxvY2tlZC5cbiIpOworCQkJfQorCQl9IGVsc2UgewkvL0Vycm9yIGR1cmluZyBjb3B5LgorCQkJaW5zdGFuY2UtPnN0YXR1cyA9IGFvX3N0YXR1c19zdHJlYW1fZmlmb19lcnJvcjsKKwkJfQorCisJCW91dGwoY3RybCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgY3RybCk7CisJfSBlbHNlIHsJCS8vPz8gbW9yZSB0aGFuIGhhbGYKKwkJUERFQlVHCisJCSAgICAoIkludGVycnVwdCBjb21lIGJ1dCBGSUZPIG1vcmUgdGhhbiBoYWxmIGZ1bGwhIFJlc2V0IGludGVycnVwdC5cbiIpOworCX0KKworCVBJTkZPKCJJU1I6IEJ1ZmZlciBjb3VudDogJWQuKFQ6JWQgSDolZClcbiIsCisJICAgICAgbWVfY2lyY19idWZfdmFsdWVzKCZpbnN0YW5jZS0+Y2lyY19idWYpLCBpbnN0YW5jZS0+Y2lyY19idWYudGFpbCwKKwkgICAgICBpbnN0YW5jZS0+Y2lyY19idWYuaGVhZCk7CisJUElORk8oIklTUjogU3RvcCBjb3VudDogJWQuXG4iLCBpbnN0YW5jZS0+c3RvcF9jb3VudCk7CisJUElORk8oIklTUjogU3RvcCBkYXRhIGNvdW50OiAlZC5cbiIsIGluc3RhbmNlLT5zdG9wX2RhdGFfY291bnQpOworCVBJTkZPKCJJU1I6IERhdGEgY291bnQ6ICVkLlxuIiwgaW5zdGFuY2UtPmRhdGFfY291bnQpOworCisJLy9SZXNldCBpbnRlcnJ1cHQgbGF0Y2gKKwlpbmwoaW5zdGFuY2UtPmlycV9yZXNldF9yZWcpOworCisJLy9JbmZvcm0gdXNlcgorCXdha2VfdXBfaW50ZXJydXB0aWJsZV9hbGwoJmluc3RhbmNlLT53YWl0X3F1ZXVlKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIHZvaWQgbWU2MDAwX2FvX2Rlc3RydWN0b3Ioc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlKQoreworCW1lNjAwMF9hb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisKKwlpbnN0YW5jZSA9IChtZTYwMDBfYW9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJUERFQlVHKCJleGVjdXRlZC4gaWR4PSVkXG4iLCBpbnN0YW5jZS0+YW9faWR4KTsKKworCWluc3RhbmNlLT5hb19jb250cm9sX3Rhc2tfZmxhZyA9IDA7CisKKwkvLyBSZXNldCBzdWJkZXZpY2UgdG8gYXN1cmUgY2xlYW4gZXhpdC4KKwltZTYwMDBfYW9faW9fcmVzZXRfc3ViZGV2aWNlKHN1YmRldmljZSwgTlVMTCwKKwkJCQkgICAgIE1FX0lPX1JFU0VUX1NVQkRFVklDRV9OT19GTEFHUyk7CisKKwkvLyBSZW1vdmUgYW55IHRhc2tzIGZyb20gd29yayBxdWV1ZS4gVGhpcyBpcyBwYXJhbm9pYyBiZWNhdXNlIGl0IHdhcyBkb25lIGFsbHJlYWR5IGluIHJlc2V0KCkuCisJaWYgKCFjYW5jZWxfZGVsYXllZF93b3JrKCZpbnN0YW5jZS0+YW9fY29udHJvbF90YXNrKSkgewkvL1dhaXQgMiB0aWNrcyB0byBiZSBzdXJlIHRoYXQgY29udHJvbCB0YXNrIGlzIHJlbW92ZWQgZnJvbSBxdWV1ZS4KKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJc2NoZWR1bGVfdGltZW91dCgyKTsKKwl9CisKKwlpZiAoaW5zdGFuY2UtPmZpZm8gJiBNRTYwMDBfQU9fSEFTX0ZJRk8pIHsKKwkJaWYgKGluc3RhbmNlLT5pcnEpIHsKKwkJCWZyZWVfaXJxKGluc3RhbmNlLT5pcnEsIGluc3RhbmNlKTsKKwkJCWluc3RhbmNlLT5pcnEgPSAwOworCQl9CisKKwkJaWYgKGluc3RhbmNlLT5jaXJjX2J1Zi5idWYpIHsKKwkJCVBERUJVRygiZnJlZSBjaXJjX2J1ZiA9ICVwIHNpemU9JWQiLAorCQkJICAgICAgIGluc3RhbmNlLT5jaXJjX2J1Zi5idWYsCisJCQkgICAgICAgUEFHRV9TSElGVCA8PCBNRTYwMDBfQU9fQ0lSQ19CVUZfU0laRV9PUkRFUik7CisJCQlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKWluc3RhbmNlLT5jaXJjX2J1Zi5idWYsCisJCQkJICAgTUU2MDAwX0FPX0NJUkNfQlVGX1NJWkVfT1JERVIpOworCQl9CisJCWluc3RhbmNlLT5jaXJjX2J1Zi5idWYgPSBOVUxMOworCX0KKworCW1lX3N1YmRldmljZV9kZWluaXQoJmluc3RhbmNlLT5iYXNlKTsKKwlrZnJlZShpbnN0YW5jZSk7Cit9CisKK21lNjAwMF9hb19zdWJkZXZpY2VfdCAqbWU2MDAwX2FvX2NvbnN0cnVjdG9yKHVpbnQzMl90IHJlZ19iYXNlLAorCQkJCQkgICAgIHNwaW5sb2NrX3QgKiBwcmVsb2FkX3JlZ19sb2NrLAorCQkJCQkgICAgIHVpbnQzMl90ICogcHJlbG9hZF9mbGFncywKKwkJCQkJICAgICB1aW50MzJfdCAqIHRyaWdnZXJpbmdfZmxhZ3MsCisJCQkJCSAgICAgaW50IGFvX2lkeCwKKwkJCQkJICAgICBpbnQgZmlmbywKKwkJCQkJICAgICBpbnQgaXJxLAorCQkJCQkgICAgIGludCBoaWdoX3JhbmdlLAorCQkJCQkgICAgIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICptZTYwMDBfd3EpCit7CisJbWU2MDAwX2FvX3N1YmRldmljZV90ICpzdWJkZXZpY2U7CisJaW50IGVycjsKKworCVBERUJVRygiZXhlY3V0ZWQgSUQ9JWQuXG4iLCBhb19pZHgpOworCisJLyogQWxsb2NhdGUgbWVtb3J5IGZvciBzdWJkZXZpY2UgaW5zdGFuY2UgKi8KKwlzdWJkZXZpY2UgPSBrbWFsbG9jKHNpemVvZihtZTYwMDBfYW9fc3ViZGV2aWNlX3QpLCBHRlBfS0VSTkVMKTsKKworCWlmICghc3ViZGV2aWNlKSB7CisJCVBFUlJPUigiQ2Fubm90IGdldCBtZW1vcnkgZm9yIHN1YmRldmljZSBpbnN0YW5jZS5cbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwltZW1zZXQoc3ViZGV2aWNlLCAwLCBzaXplb2YobWU2MDAwX2FvX3N1YmRldmljZV90KSk7CisKKwkvKiBJbml0aWFsaXplIHN1YmRldmljZSBiYXNlIGNsYXNzICovCisJZXJyID0gbWVfc3ViZGV2aWNlX2luaXQoJnN1YmRldmljZS0+YmFzZSk7CisKKwlpZiAoZXJyKSB7CisJCVBFUlJPUigiQ2Fubm90IGluaXRpYWxpemUgc3ViZGV2aWNlIGJhc2UgY2xhc3MgaW5zdGFuY2UuXG4iKTsKKwkJa2ZyZWUoc3ViZGV2aWNlKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCS8vIEluaXRpYWxpemUgc3BpbiBsb2Nrcy4KKwlzcGluX2xvY2tfaW5pdCgmc3ViZGV2aWNlLT5zdWJkZXZpY2VfbG9jayk7CisKKwlzdWJkZXZpY2UtPnByZWxvYWRfcmVnX2xvY2sgPSBwcmVsb2FkX3JlZ19sb2NrOworCXN1YmRldmljZS0+cHJlbG9hZF9mbGFncyA9IHByZWxvYWRfZmxhZ3M7CisJc3ViZGV2aWNlLT50cmlnZ2VyaW5nX2ZsYWdzID0gdHJpZ2dlcmluZ19mbGFnczsKKworCS8qIFN0b3JlIGFuYWxvZyBvdXRwdXQgaW5kZXggKi8KKwlzdWJkZXZpY2UtPmFvX2lkeCA9IGFvX2lkeDsKKworCS8qIFN0b3JlIGlmIGFuYWxvZyBvdXRwdXQgaGFzIGZpZm8gKi8KKwlzdWJkZXZpY2UtPmZpZm8gPSBmaWZvOworCisJaWYgKHN1YmRldmljZS0+ZmlmbyAmIE1FNjAwMF9BT19IQVNfRklGTykgeworCQkvKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBjaXJjdWxhciBidWZmZXIgKi8KKwkJc3ViZGV2aWNlLT5jaXJjX2J1Zi5tYXNrID0gTUU2MDAwX0FPX0NJUkNfQlVGX0NPVU5UIC0gMTsKKwkJc3ViZGV2aWNlLT5jaXJjX2J1Zi5idWYgPQorCQkgICAgKHZvaWQgKilfX2dldF9mcmVlX3BhZ2VzKEdGUF9LRVJORUwsCisJCQkJCSAgICAgTUU2MDAwX0FPX0NJUkNfQlVGX1NJWkVfT1JERVIpOworCQlQREVCVUcoImNpcmNfYnVmID0gJXAgc2l6ZT0lbGRcbiIsIHN1YmRldmljZS0+Y2lyY19idWYuYnVmLAorCQkgICAgICAgTUU2MDAwX0FPX0NJUkNfQlVGX1NJWkUpOworCisJCWlmICghc3ViZGV2aWNlLT5jaXJjX2J1Zi5idWYpIHsKKwkJCVBFUlJPUgorCQkJICAgICgiQ2Fubm90IGluaXRpYWxpemUgc3ViZGV2aWNlIGJhc2UgY2xhc3MgaW5zdGFuY2UuXG4iKTsKKwkJCWtmcmVlKHN1YmRldmljZSk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJCW1lbXNldChzdWJkZXZpY2UtPmNpcmNfYnVmLmJ1ZiwgMCwgTUU2MDAwX0FPX0NJUkNfQlVGX1NJWkUpOworCX0gZWxzZSB7CisJCXN1YmRldmljZS0+Y2lyY19idWYubWFzayA9IDA7CisJCXN1YmRldmljZS0+Y2lyY19idWYuYnVmID0gTlVMTDsKKwl9CisJc3ViZGV2aWNlLT5jaXJjX2J1Zi5oZWFkID0gMDsKKwlzdWJkZXZpY2UtPmNpcmNfYnVmLnRhaWwgPSAwOworCisJc3ViZGV2aWNlLT5zdGF0dXMgPSBhb19zdGF0dXNfbm9uZTsKKwlzdWJkZXZpY2UtPmFvX2NvbnRyb2xfdGFza19mbGFnID0gMDsKKwlzdWJkZXZpY2UtPnRpbWVvdXQuZGVsYXkgPSAwOworCXN1YmRldmljZS0+dGltZW91dC5zdGFydF90aW1lID0gamlmZmllczsKKworCS8qIEluaXRpYWxpemUgd2FpdCBxdWV1ZSAqLworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnN1YmRldmljZS0+d2FpdF9xdWV1ZSk7CisKKwkvKiBJbml0aWFsaXplIHNpbmdsZSB2YWx1ZSB0byAwViAqLworCXN1YmRldmljZS0+c2luZ2xlX3ZhbHVlID0gMHg4MDAwOworCXN1YmRldmljZS0+c2luZ2xlX3ZhbHVlX2luX2ZpZm8gPSAweDgwMDA7CisKKwkvKiBJbml0aWFsaXplIHJhbmdlIGJvYXJkZXJzICovCisJaWYgKGhpZ2hfcmFuZ2UpIHsKKwkJc3ViZGV2aWNlLT5taW4gPSBNRTYwMDBfQU9fTUlOX1JBTkdFX0hJR0g7CisJCXN1YmRldmljZS0+bWF4ID0gTUU2MDAwX0FPX01BWF9SQU5HRV9ISUdIOworCX0gZWxzZSB7CisJCXN1YmRldmljZS0+bWluID0gTUU2MDAwX0FPX01JTl9SQU5HRTsKKwkJc3ViZGV2aWNlLT5tYXggPSBNRTYwMDBfQU9fTUFYX1JBTkdFOworCX0KKworCS8qIFJlZ2lzdGVyIGludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmUgKi8KKworCWlmIChzdWJkZXZpY2UtPmZpZm8gJiBNRTYwMDBfQU9fSEFTX0ZJRk8pIHsKKwkJc3ViZGV2aWNlLT5pcnEgPSBpcnE7CisJCWlmIChyZXF1ZXN0X2lycShzdWJkZXZpY2UtPmlycSwgbWU2MDAwX2FvX2lzciwKKyNpZmRlZiBJUlFGX0RJU0FCTEVECisJCQkJSVJRRl9ESVNBQkxFRCB8IElSUUZfU0hBUkVELAorI2Vsc2UKKwkJCQlTQV9JTlRFUlJVUFQgfCBTQV9TSElSUSwKKyNlbmRpZgorCQkJCU1FNjAwMF9OQU1FLCBzdWJkZXZpY2UpKSB7CisJCQlQRVJST1IoIkNhbm5vdCBnZXQgaW50ZXJydXB0IGxpbmUuXG4iKTsKKwkJCVBERUJVRygiZnJlZSBjaXJjX2J1ZiA9ICVwIHNpemU9JWQiLAorCQkJICAgICAgIHN1YmRldmljZS0+Y2lyY19idWYuYnVmLAorCQkJICAgICAgIFBBR0VfU0hJRlQgPDwgTUU2MDAwX0FPX0NJUkNfQlVGX1NJWkVfT1JERVIpOworCQkJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZylzdWJkZXZpY2UtPmNpcmNfYnVmLmJ1ZiwKKwkJCQkgICBNRTYwMDBfQU9fQ0lSQ19CVUZfU0laRV9PUkRFUik7CisJCQlzdWJkZXZpY2UtPmNpcmNfYnVmLmJ1ZiA9IE5VTEw7CisJCQlrZnJlZShzdWJkZXZpY2UpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJUElORk8oIlJlZ2lzdGVyZWQgaXJxPSVkLlxuIiwgc3ViZGV2aWNlLT5pcnEpOworCX0gZWxzZSB7CisJCXN1YmRldmljZS0+aXJxID0gMDsKKwl9CisKKwkvKiBJbml0aWFsaXplIHJlZ2lzdGVycyAqLworCS8vIE9ubHkgc3RyZWFtZWQgc3ViZGV2aWNlcyBzdXBwb3J0IGludGVycnVwdHMuIEZvciB0aGUgcmVzdCB0aGlzIHJlZ2lzdGVyIGhhcyBubyBtZWFuaW5nLgorCXN1YmRldmljZS0+aXJxX3N0YXR1c19yZWcgPSByZWdfYmFzZSArIE1FNjAwMF9BT19JUlFfU1RBVFVTX1JFRzsKKwlzdWJkZXZpY2UtPnByZWxvYWRfcmVnID0gcmVnX2Jhc2UgKyBNRTYwMDBfQU9fUFJFTE9BRF9SRUc7CisKKwlpZiAoYW9faWR4ID09IDApIHsKKwkJc3ViZGV2aWNlLT5jdHJsX3JlZyA9IHJlZ19iYXNlICsgTUU2MDAwX0FPXzAwX0NUUkxfUkVHOworCQlzdWJkZXZpY2UtPnN0YXR1c19yZWcgPSByZWdfYmFzZSArIE1FNjAwMF9BT18wMF9TVEFUVVNfUkVHOworCQlzdWJkZXZpY2UtPmZpZm9fcmVnID0gcmVnX2Jhc2UgKyBNRTYwMDBfQU9fMDBfRklGT19SRUc7CisJCXN1YmRldmljZS0+dGltZXJfcmVnID0gcmVnX2Jhc2UgKyBNRTYwMDBfQU9fMDBfVElNRVJfUkVHOworCQlzdWJkZXZpY2UtPmlycV9yZXNldF9yZWcgPQorCQkgICAgcmVnX2Jhc2UgKyBNRTYwMDBfQU9fMDBfSVJRX1JFU0VUX1JFRzsKKwkJc3ViZGV2aWNlLT5zaW5nbGVfcmVnID0gcmVnX2Jhc2UgKyBNRTYwMDBfQU9fMDBfU0lOR0xFX1JFRzsKKwl9IGVsc2UgaWYgKGFvX2lkeCA9PSAxKSB7CisJCXN1YmRldmljZS0+Y3RybF9yZWcgPSByZWdfYmFzZSArIE1FNjAwMF9BT18wMV9DVFJMX1JFRzsKKwkJc3ViZGV2aWNlLT5zdGF0dXNfcmVnID0gcmVnX2Jhc2UgKyBNRTYwMDBfQU9fMDFfU1RBVFVTX1JFRzsKKwkJc3ViZGV2aWNlLT5maWZvX3JlZyA9IHJlZ19iYXNlICsgTUU2MDAwX0FPXzAxX0ZJRk9fUkVHOworCQlzdWJkZXZpY2UtPnRpbWVyX3JlZyA9IHJlZ19iYXNlICsgTUU2MDAwX0FPXzAxX1RJTUVSX1JFRzsKKwkJc3ViZGV2aWNlLT5pcnFfcmVzZXRfcmVnID0KKwkJICAgIHJlZ19iYXNlICsgTUU2MDAwX0FPXzAxX0lSUV9SRVNFVF9SRUc7CisJCXN1YmRldmljZS0+c2luZ2xlX3JlZyA9IHJlZ19iYXNlICsgTUU2MDAwX0FPXzAxX1NJTkdMRV9SRUc7CisJfSBlbHNlIGlmIChhb19pZHggPT0gMikgeworCQlzdWJkZXZpY2UtPmN0cmxfcmVnID0gcmVnX2Jhc2UgKyBNRTYwMDBfQU9fMDJfQ1RSTF9SRUc7CisJCXN1YmRldmljZS0+c3RhdHVzX3JlZyA9IHJlZ19iYXNlICsgTUU2MDAwX0FPXzAyX1NUQVRVU19SRUc7CisJCXN1YmRldmljZS0+Zmlmb19yZWcgPSByZWdfYmFzZSArIE1FNjAwMF9BT18wMl9GSUZPX1JFRzsKKwkJc3ViZGV2aWNlLT50aW1lcl9yZWcgPSByZWdfYmFzZSArIE1FNjAwMF9BT18wMl9USU1FUl9SRUc7CisJCXN1YmRldmljZS0+aXJxX3Jlc2V0X3JlZyA9CisJCSAgICByZWdfYmFzZSArIE1FNjAwMF9BT18wMl9JUlFfUkVTRVRfUkVHOworCQlzdWJkZXZpY2UtPnNpbmdsZV9yZWcgPSByZWdfYmFzZSArIE1FNjAwMF9BT18wMl9TSU5HTEVfUkVHOworCX0gZWxzZSBpZiAoYW9faWR4ID09IDMpIHsKKwkJc3ViZGV2aWNlLT5jdHJsX3JlZyA9IHJlZ19iYXNlICsgTUU2MDAwX0FPXzAzX0NUUkxfUkVHOworCQlzdWJkZXZpY2UtPnN0YXR1c19yZWcgPSByZWdfYmFzZSArIE1FNjAwMF9BT18wM19TVEFUVVNfUkVHOworCQlzdWJkZXZpY2UtPmZpZm9fcmVnID0gcmVnX2Jhc2UgKyBNRTYwMDBfQU9fMDNfRklGT19SRUc7CisJCXN1YmRldmljZS0+dGltZXJfcmVnID0gcmVnX2Jhc2UgKyBNRTYwMDBfQU9fMDNfVElNRVJfUkVHOworCQlzdWJkZXZpY2UtPmlycV9yZXNldF9yZWcgPQorCQkgICAgcmVnX2Jhc2UgKyBNRTYwMDBfQU9fMDNfSVJRX1JFU0VUX1JFRzsKKwkJc3ViZGV2aWNlLT5zaW5nbGVfcmVnID0gcmVnX2Jhc2UgKyBNRTYwMDBfQU9fMDNfU0lOR0xFX1JFRzsKKwl9IGVsc2UgeworCQlzdWJkZXZpY2UtPmN0cmxfcmVnID0gcmVnX2Jhc2UgKyBNRTYwMDBfQU9fRFVNWTsKKwkJc3ViZGV2aWNlLT5maWZvX3JlZyA9IHJlZ19iYXNlICsgTUU2MDAwX0FPX0RVTVk7CisJCXN1YmRldmljZS0+dGltZXJfcmVnID0gcmVnX2Jhc2UgKyBNRTYwMDBfQU9fRFVNWTsKKwkJc3ViZGV2aWNlLT5pcnFfcmVzZXRfcmVnID0gcmVnX2Jhc2UgKyBNRTYwMDBfQU9fRFVNWTsKKwkJc3ViZGV2aWNlLT5zaW5nbGVfcmVnID0gcmVnX2Jhc2UgKyBNRTYwMDBfQU9fRFVNWTsKKworCQlzdWJkZXZpY2UtPnN0YXR1c19yZWcgPSByZWdfYmFzZSArIE1FNjAwMF9BT19TSU5HTEVfU1RBVFVTX1JFRzsKKwkJaWYgKGFvX2lkeCA9PSA0KSB7CisJCQlzdWJkZXZpY2UtPnNpbmdsZV9yZWcgPQorCQkJICAgIHJlZ19iYXNlICsgTUU2MDAwX0FPXzA0X1NJTkdMRV9SRUc7CisJCX0gZWxzZSBpZiAoYW9faWR4ID09IDUpIHsKKwkJCXN1YmRldmljZS0+c2luZ2xlX3JlZyA9CisJCQkgICAgcmVnX2Jhc2UgKyBNRTYwMDBfQU9fMDVfU0lOR0xFX1JFRzsKKwkJfSBlbHNlIGlmIChhb19pZHggPT0gNikgeworCQkJc3ViZGV2aWNlLT5zaW5nbGVfcmVnID0KKwkJCSAgICByZWdfYmFzZSArIE1FNjAwMF9BT18wNl9TSU5HTEVfUkVHOworCQl9IGVsc2UgaWYgKGFvX2lkeCA9PSA3KSB7CisJCQlzdWJkZXZpY2UtPnNpbmdsZV9yZWcgPQorCQkJICAgIHJlZ19iYXNlICsgTUU2MDAwX0FPXzA3X1NJTkdMRV9SRUc7CisJCX0gZWxzZSBpZiAoYW9faWR4ID09IDgpIHsKKwkJCXN1YmRldmljZS0+c2luZ2xlX3JlZyA9CisJCQkgICAgcmVnX2Jhc2UgKyBNRTYwMDBfQU9fMDhfU0lOR0xFX1JFRzsKKwkJfSBlbHNlIGlmIChhb19pZHggPT0gOSkgeworCQkJc3ViZGV2aWNlLT5zaW5nbGVfcmVnID0KKwkJCSAgICByZWdfYmFzZSArIE1FNjAwMF9BT18wOV9TSU5HTEVfUkVHOworCQl9IGVsc2UgaWYgKGFvX2lkeCA9PSAxMCkgeworCQkJc3ViZGV2aWNlLT5zaW5nbGVfcmVnID0KKwkJCSAgICByZWdfYmFzZSArIE1FNjAwMF9BT18xMF9TSU5HTEVfUkVHOworCQl9IGVsc2UgaWYgKGFvX2lkeCA9PSAxMSkgeworCQkJc3ViZGV2aWNlLT5zaW5nbGVfcmVnID0KKwkJCSAgICByZWdfYmFzZSArIE1FNjAwMF9BT18xMV9TSU5HTEVfUkVHOworCQl9IGVsc2UgaWYgKGFvX2lkeCA9PSAxMikgeworCQkJc3ViZGV2aWNlLT5zaW5nbGVfcmVnID0KKwkJCSAgICByZWdfYmFzZSArIE1FNjAwMF9BT18xMl9TSU5HTEVfUkVHOworCQl9IGVsc2UgaWYgKGFvX2lkeCA9PSAxMykgeworCQkJc3ViZGV2aWNlLT5zaW5nbGVfcmVnID0KKwkJCSAgICByZWdfYmFzZSArIE1FNjAwMF9BT18xM19TSU5HTEVfUkVHOworCQl9IGVsc2UgaWYgKGFvX2lkeCA9PSAxNCkgeworCQkJc3ViZGV2aWNlLT5zaW5nbGVfcmVnID0KKwkJCSAgICByZWdfYmFzZSArIE1FNjAwMF9BT18xNF9TSU5HTEVfUkVHOworCQl9IGVsc2UgaWYgKGFvX2lkeCA9PSAxNSkgeworCQkJc3ViZGV2aWNlLT5zaW5nbGVfcmVnID0KKwkJCSAgICByZWdfYmFzZSArIE1FNjAwMF9BT18xNV9TSU5HTEVfUkVHOworCQl9IGVsc2UgeworCQkJUEVSUk9SX0NSSVRJQ0FMKCJXUk9ORyBTVUJERVZJQ0UgSUQ9JWQhIiwgYW9faWR4KTsKKwkJCW1lX3N1YmRldmljZV9kZWluaXQoKG1lX3N1YmRldmljZV90ICopIHN1YmRldmljZSk7CisJCQlpZiAoc3ViZGV2aWNlLT5maWZvKSB7CisJCQkJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZylzdWJkZXZpY2UtPmNpcmNfYnVmLgorCQkJCQkgICBidWYsIE1FNjAwMF9BT19DSVJDX0JVRl9TSVpFX09SREVSKTsKKwkJCX0KKwkJCXN1YmRldmljZS0+Y2lyY19idWYuYnVmID0gTlVMTDsKKwkJCWtmcmVlKHN1YmRldmljZSk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCX0KKyNpZmRlZiBNRURFQlVHX0RFQlVHX1JFRworCXN1YmRldmljZS0+cmVnX2Jhc2UgPSByZWdfYmFzZTsKKyNlbmRpZgorCisJLyogT3ZlcnJpZGUgYmFzZSBjbGFzcyBtZXRob2RzLiAqLworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfZGVzdHJ1Y3RvciA9IG1lNjAwMF9hb19kZXN0cnVjdG9yOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fcmVzZXRfc3ViZGV2aWNlID0KKwkgICAgbWU2MDAwX2FvX2lvX3Jlc2V0X3N1YmRldmljZTsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3NpbmdsZV9jb25maWcgPQorCSAgICBtZTYwMDBfYW9faW9fc2luZ2xlX2NvbmZpZzsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3NpbmdsZV9yZWFkID0gbWU2MDAwX2FvX2lvX3NpbmdsZV9yZWFkOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fc2luZ2xlX3dyaXRlID0KKwkgICAgbWU2MDAwX2FvX2lvX3NpbmdsZV93cml0ZTsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3N0cmVhbV9jb25maWcgPQorCSAgICBtZTYwMDBfYW9faW9fc3RyZWFtX2NvbmZpZzsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3N0cmVhbV9uZXdfdmFsdWVzID0KKwkgICAgbWU2MDAwX2FvX2lvX3N0cmVhbV9uZXdfdmFsdWVzOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fc3RyZWFtX3dyaXRlID0KKwkgICAgbWU2MDAwX2FvX2lvX3N0cmVhbV93cml0ZTsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3N0cmVhbV9zdGFydCA9CisJICAgIG1lNjAwMF9hb19pb19zdHJlYW1fc3RhcnQ7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19zdHJlYW1fc3RhdHVzID0KKwkgICAgbWU2MDAwX2FvX2lvX3N0cmVhbV9zdGF0dXM7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19zdHJlYW1fc3RvcCA9IG1lNjAwMF9hb19pb19zdHJlYW1fc3RvcDsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X251bWJlcl9jaGFubmVscyA9CisJICAgIG1lNjAwMF9hb19xdWVyeV9udW1iZXJfY2hhbm5lbHM7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9zdWJkZXZpY2VfdHlwZSA9CisJICAgIG1lNjAwMF9hb19xdWVyeV9zdWJkZXZpY2VfdHlwZTsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV9jYXBzID0KKwkgICAgbWU2MDAwX2FvX3F1ZXJ5X3N1YmRldmljZV9jYXBzOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfcXVlcnlfc3ViZGV2aWNlX2NhcHNfYXJncyA9CisJICAgIG1lNjAwMF9hb19xdWVyeV9zdWJkZXZpY2VfY2Fwc19hcmdzOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfcXVlcnlfcmFuZ2VfYnlfbWluX21heCA9CisJICAgIG1lNjAwMF9hb19xdWVyeV9yYW5nZV9ieV9taW5fbWF4OworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfcXVlcnlfbnVtYmVyX3JhbmdlcyA9CisJICAgIG1lNjAwMF9hb19xdWVyeV9udW1iZXJfcmFuZ2VzOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfcXVlcnlfcmFuZ2VfaW5mbyA9CisJICAgIG1lNjAwMF9hb19xdWVyeV9yYW5nZV9pbmZvOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfcXVlcnlfdGltZXIgPSBtZTYwMDBfYW9fcXVlcnlfdGltZXI7CisKKwkvL3ByZXBhcmUgd29yayBxdWV1ZSBhbmQgd29yayBmdW5jdGlvbgorCXN1YmRldmljZS0+bWU2MDAwX3dvcmtxdWV1ZSA9IG1lNjAwMF93cTsKKworLyogd29ya3F1ZXVlIEFQSSBjaGFuZ2VkIGluIGtlcm5lbCAyLjYuMjAgKi8KKyNpZiAoIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwyMCkgKQorCUlOSVRfV09SSygmc3ViZGV2aWNlLT5hb19jb250cm9sX3Rhc2ssIG1lNjAwMF9hb193b3JrX2NvbnRyb2xfdGFzaywKKwkJICAodm9pZCAqKXN1YmRldmljZSk7CisjZWxzZQorCUlOSVRfREVMQVlFRF9XT1JLKCZzdWJkZXZpY2UtPmFvX2NvbnRyb2xfdGFzaywKKwkJCSAgbWU2MDAwX2FvX3dvcmtfY29udHJvbF90YXNrKTsKKyNlbmRpZgorCisJaWYgKHN1YmRldmljZS0+ZmlmbykgewkvL1NldCBzcGVlZAorCQlvdXRsKE1FNjAwMF9BT19NSU5fQ0hBTl9USUNLUyAtIDEsIHN1YmRldmljZS0+dGltZXJfcmVnKTsKKwkJc3ViZGV2aWNlLT5oYXJkd2FyZV9zdG9wX2RlbGF5ID0gSFogLyAxMDsJLy8xMDBtcworCX0KKworCXJldHVybiBzdWJkZXZpY2U7Cit9CisKKy8qKiBAYnJpZWYgU3RvcCBwcmVzZW50YXRpb24uIFByZXNlcnZlIEZJRk9zLgorKgorKiBAcGFyYW0gaW5zdGFuY2UgVGhlIHN1YmRldmljZSBpbnN0YW5jZSAocG9pbnRlcikuCisqLworaW50IGlubGluZSBhb19zdG9wX2ltbWVkaWF0ZWx5KG1lNjAwMF9hb19zdWJkZXZpY2VfdCAqIGluc3RhbmNlKQoreworCXVuc2lnbmVkIGxvbmcgY3B1X2ZsYWdzOworCXVpbnQzMl90IGN0cmw7CisJaW50IHRpbWVvdXQ7CisJaW50IGk7CisJdWludDMyX3Qgc2luZ2xlX21hc2s7CisKKwlzaW5nbGVfbWFzayA9CisJICAgIChpbnN0YW5jZS0+YW9faWR4IC0gTUU2MDAwX0FPX1NJTkdMRV9TVEFUVVNfT0ZGU0VUIDwKKwkgICAgIDApID8gMHgwMDAwIDogKDB4MDAwMSA8PCAoaW5zdGFuY2UtPmFvX2lkeCAtCisJCQkJICAgICAgIE1FNjAwMF9BT19TSU5HTEVfU1RBVFVTX09GRlNFVCkpOworCisJdGltZW91dCA9CisJICAgIChpbnN0YW5jZS0+aGFyZHdhcmVfc3RvcF9kZWxheSA+CisJICAgICAoSFogLyAxMCkpID8gaW5zdGFuY2UtPmhhcmR3YXJlX3N0b3BfZGVsYXkgOiBIWiAvIDEwOworCWZvciAoaSA9IDA7IGkgPD0gdGltZW91dDsgaSsrKSB7CisJCWlmIChpbnN0YW5jZS0+ZmlmbykgeworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKwkJCS8vIFN0b3AgYWxsIGFjdGlvbnMuIE5vIGNvbmRpdGlvbnMhIEJsb2NrIGludGVycnVwdHMuIExlYXZlIEZJRk8gdW50b3VjaGVkIQorCQkJY3RybCA9IGlubChpbnN0YW5jZS0+Y3RybF9yZWcpOworCQkJY3RybCB8PQorCQkJICAgIE1FNjAwMF9BT19DVFJMX0JJVF9TVE9QIHwKKwkJCSAgICBNRTYwMDBfQU9fQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1A7CisJCQljdHJsICY9CisJCQkgICAgfihNRTYwMDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0lSUSB8CisJCQkgICAgICBNRTYwMDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0VYX1RSSUcpOworCQkJb3V0bChjdHJsLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQkJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIGN0cmwpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLAorCQkJCQkgICAgICAgY3B1X2ZsYWdzKTsKKworCQkJaWYgKCEoaW5sKGluc3RhbmNlLT5zdGF0dXNfcmVnKSAmIE1FNjAwMF9BT19TVEFUVVNfQklUX0ZTTSkpIHsJLy8gRXhpdC4KKwkJCQlicmVhazsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmICghKGlubChpbnN0YW5jZS0+c3RhdHVzX3JlZykgJiBzaW5nbGVfbWFzaykpIHsJLy8gRXhpdC4KKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCVBJTkZPKCI8JXM+IFdhaXQgZm9yIHN0b3A6ICVkXG4iLCBfX2Z1bmNfXywgaSk7CisKKwkJLy9TdGlsbCB3b3JraW5nIQorCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQlzY2hlZHVsZV90aW1lb3V0KDEpOworCX0KKworCWlmIChpID4gdGltZW91dCkgeworCQlQRVJST1JfQ1JJVElDQUwoIkZTTSBJUyBCVVNZIVxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlRFUk5BTDsKKwl9CisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKKy8qKiBAYnJpZWYgQ29weSBkYXRhIGZyb20gY2lyY3VsYXIgYnVmZmVyIHRvIGZpZm8gKGZhc3QpIGluIHdyYXBhcm91bmQuCisqIEBub3RlIFRoaXMgaXMgdGltZSBjcml0aWNhbCBmdW5jdGlvbi4gQ2hlY2tpbmcgaXMgZG9uZSBhdCBiZWdpbmluZyBhbmQgZW5kIG9ubHkuCisqIEBub3RlIFRoZSBpcyBub3QgcmVhc29uYWJsZSB3YXkgdG8gY2hlY2sgaG93IG1hbnkgd2FsdWVzIHdhcyBpbiBGSUZPIGF0IGJlZ2luaW5nLiBUaGUgY291bnQgbXVzdCBiZSBtYW5hZ2VkIGV4dGVybmFseS4KKyoKKyogQHBhcmFtIGluc3RhbmNlIFRoZSBzdWJkZXZpY2UgaW5zdGFuY2UgKHBvaW50ZXIpLgorKiBAcGFyYW0gY291bnQgTWF4aW11bSBudW1iZXIgb2YgY29waWVkIGRhdGEuCisqIEBwYXJhbSBzdGFydF9wb3MgUG9zaXRpb24gb2YgdGhlIGZpcnMgdmFsdWUgaW4gYnVmZmVyLgorKgorKiBAcmV0dXJuIE9uIHN1Y2Nlc3M6IE51bWJlciBvZiBjb3BpZWQgZGF0YS4KKyogQHJldHVybiBPbiBlcnJvci9zdWNjZXNzOiAwLglObyBkYXRhcyB3ZXJlIGNvcGllZCA9PiBubyBkYXRhIGluIGJ1ZmZlci4KKyogQHJldHVybiBPbiBlcnJvcjogLU1FX0VSUk5PX0ZJRk9fQlVGRkVSX09WRVJGTE9XLgorKi8KK2ludCBpbmxpbmUgYW9fd3JpdGVfZGF0YV93cmFwYXJvdW5kKG1lNjAwMF9hb19zdWJkZXZpY2VfdCAqIGluc3RhbmNlLCBpbnQgY291bnQsCisJCQkJICAgIGludCBzdGFydF9wb3MpCit7CQkJCS8vLyBAbm90ZSBUaGlzIGlzIHRpbWUgY3JpdGljYWwgZnVuY3Rpb24hCisJdWludDMyX3Qgc3RhdHVzOworCXVpbnQzMl90IHZhbHVlOworCWludCBwb3MgPQorCSAgICAoaW5zdGFuY2UtPmNpcmNfYnVmLnRhaWwgKyBzdGFydF9wb3MpICYgaW5zdGFuY2UtPmNpcmNfYnVmLm1hc2s7CisJaW50IGxvY2FsX2NvdW50ID0gY291bnQ7CisJaW50IGkgPSAxOworCisJaWYgKGNvdW50IDw9IDApIHsJLy9Xcm9uZyBjb3VudCEKKwkJcmV0dXJuIDA7CisJfQorCisJd2hpbGUgKGkgPCBsb2NhbF9jb3VudCkgeworCQkvL0dldCB2YWx1ZSBmcm9tIGJ1ZmZlcgorCQl2YWx1ZSA9ICooaW5zdGFuY2UtPmNpcmNfYnVmLmJ1ZiArIHBvcyk7CisJCS8vUHJlcGFyZSBpdAorCQlpZiAoaW5zdGFuY2UtPmFvX2lkeCAmIDB4MSkgeworCQkJdmFsdWUgPDw9IDE2OworCQl9CisJCS8vUHV0IHZhbHVlIHRvIEZJRk8KKwkJb3V0bCh2YWx1ZSwgaW5zdGFuY2UtPmZpZm9fcmVnKTsKKwkJLy9QREVCVUdfUkVHKCJpZHg9JWQgZmlmb19yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPmFvX2lkeCwgaW5zdGFuY2UtPnJlZ19iYXNlLCBpbnN0YW5jZS0+Zmlmb19yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIHZhbHVlKTsKKworCQlwb3MrKzsKKwkJcG9zICY9IGluc3RhbmNlLT5jaXJjX2J1Zi5tYXNrOworCQlpZiAocG9zID09IGluc3RhbmNlLT5jaXJjX2J1Zi5oZWFkKSB7CisJCQlwb3MgPSBpbnN0YW5jZS0+Y2lyY19idWYudGFpbDsKKwkJfQorCQlpKys7CisJfQorCisJc3RhdHVzID0gaW5sKGluc3RhbmNlLT5zdGF0dXNfcmVnKTsKKwlpZiAoIShzdGF0dXMgJiBNRTYwMDBfQU9fU1RBVFVTX0JJVF9GRikpIHsJLy9GSUZPIGlzIGZ1bGwgYmVmb3JlIGFsbCBkYXRhcyB3ZXJlIGNvcGllZCEKKwkJUEVSUk9SKCJpZHg9JWQgRklGTyBpcyBmdWxsIGJlZm9yZSBhbGwgZGF0YXMgd2VyZSBjb3BpZWQhXG4iLAorCQkgICAgICAgaW5zdGFuY2UtPmFvX2lkeCk7CisJCXJldHVybiAtTUVfRVJSTk9fRklGT19CVUZGRVJfT1ZFUkZMT1c7CisJfSBlbHNlIHsJCS8vQWRkIGxhc3QgdmFsdWUKKwkJdmFsdWUgPSAqKGluc3RhbmNlLT5jaXJjX2J1Zi5idWYgKyBwb3MpOworCQlpZiAoaW5zdGFuY2UtPmFvX2lkeCAmIDB4MSkgeworCQkJdmFsdWUgPDw9IDE2OworCQl9CisJCS8vUHV0IHZhbHVlIHRvIEZJRk8KKwkJb3V0bCh2YWx1ZSwgaW5zdGFuY2UtPmZpZm9fcmVnKTsKKwkJLy9QREVCVUdfUkVHKCJpZHg9JWQgZmlmb19yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPmFvX2lkeCwgaW5zdGFuY2UtPnJlZ19iYXNlLCBpbnN0YW5jZS0+Zmlmb19yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIHZhbHVlKTsKKwl9CisKKwlQSU5GTygiaWR4PSVkIFdSQVBBUk9VTkQgTE9BREVEICVkIHZhbHVlc1xuIiwgaW5zdGFuY2UtPmFvX2lkeCwKKwkgICAgICBsb2NhbF9jb3VudCk7CisJcmV0dXJuIGxvY2FsX2NvdW50OworfQorCisvKiogQGJyaWVmIENvcHkgZGF0YSBmcm9tIHNvZnR3YXJlIGJ1ZmZlciB0byBmaWZvIChmYXN0KS4KKyogQG5vdGUgVGhpcyBpcyB0aW1lIGNyaXRpY2FsIGZ1bmN0aW9uLiBDaGVja2luZyBpcyBkb25lIGF0IGJlZ2luaW5nIGFuZCBlbmQgb25seS4KKyogQG5vdGUgVGhlIGlzIG5vdCByZWFzb25hYmxlIHdheSB0byBjaGVjayBob3cgbWFueSB3YWx1ZXMgd2FzIGluIEZJRk8gYXQgYmVnaW5pbmcuIFRoZSBjb3VudCBtdXN0IGJlIG1hbmFnZWQgZXh0ZXJuYWx5LgorKgorKiBAcGFyYW0gaW5zdGFuY2UgVGhlIHN1YmRldmljZSBpbnN0YW5jZSAocG9pbnRlcikuCisqIEBwYXJhbSBjb3VudCBNYXhpbXVtIG51bWJlciBvZiBjb3BpZWQgZGF0YS4KKyogQHBhcmFtIHN0YXJ0X3BvcyBQb3NpdGlvbiBvZiB0aGUgZmlycyB2YWx1ZSBpbiBidWZmZXIuCisqCisqIEByZXR1cm4gT24gc3VjY2VzczogTnVtYmVyIG9mIGNvcGllZCBkYXRhLgorKiBAcmV0dXJuIE9uIGVycm9yL3N1Y2Nlc3M6IDAuCU5vIGRhdGFzIHdlcmUgY29waWVkID0+IG5vIGRhdGEgaW4gYnVmZmVyLgorKiBAcmV0dXJuIE9uIGVycm9yOiAtTUVfRVJSTk9fRklGT19CVUZGRVJfT1ZFUkZMT1cuCisqLworaW50IGlubGluZSBhb193cml0ZV9kYXRhKG1lNjAwMF9hb19zdWJkZXZpY2VfdCAqIGluc3RhbmNlLCBpbnQgY291bnQsCisJCQkgaW50IHN0YXJ0X3BvcykKK3sJCQkJLy8vIEBub3RlIFRoaXMgaXMgdGltZSBjcml0aWNhbCBmdW5jdGlvbiEKKwl1aW50MzJfdCBzdGF0dXM7CisJdWludDMyX3QgdmFsdWU7CisJaW50IHBvcyA9CisJICAgIChpbnN0YW5jZS0+Y2lyY19idWYudGFpbCArIHN0YXJ0X3BvcykgJiBpbnN0YW5jZS0+Y2lyY19idWYubWFzazsKKwlpbnQgbG9jYWxfY291bnQgPSBjb3VudDsKKwlpbnQgbWF4X2NvdW50OworCWludCBpID0gMTsKKworCWlmIChjb3VudCA8PSAwKSB7CS8vV3JvbmcgY291bnQhCisJCXJldHVybiAwOworCX0KKworCW1heF9jb3VudCA9IG1lX2NpcmNfYnVmX3ZhbHVlcygmaW5zdGFuY2UtPmNpcmNfYnVmKSAtIHN0YXJ0X3BvczsKKwlpZiAobWF4X2NvdW50IDw9IDApIHsJLy9ObyBkYXRhIHRvIGNvcHkhCisJCXJldHVybiAwOworCX0KKworCWlmIChtYXhfY291bnQgPCBjb3VudCkgeworCQlsb2NhbF9jb3VudCA9IG1heF9jb3VudDsKKwl9CisKKwl3aGlsZSAoaSA8IGxvY2FsX2NvdW50KSB7CisJCS8vR2V0IHZhbHVlIGZyb20gYnVmZmVyCisJCXZhbHVlID0gKihpbnN0YW5jZS0+Y2lyY19idWYuYnVmICsgcG9zKTsKKwkJLy9QcmVwYXJlIGl0CisJCWlmIChpbnN0YW5jZS0+YW9faWR4ICYgMHgxKSB7CisJCQl2YWx1ZSA8PD0gMTY7CisJCX0KKwkJLy9QdXQgdmFsdWUgdG8gRklGTworCQlvdXRsKHZhbHVlLCBpbnN0YW5jZS0+Zmlmb19yZWcpOworCQkvL1BERUJVR19SRUcoImlkeD0lZCBmaWZvX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+YW9faWR4LCBpbnN0YW5jZS0+cmVnX2Jhc2UsIGluc3RhbmNlLT5maWZvX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgdmFsdWUpOworCisJCXBvcysrOworCQlwb3MgJj0gaW5zdGFuY2UtPmNpcmNfYnVmLm1hc2s7CisJCWkrKzsKKwl9CisKKwlzdGF0dXMgPSBpbmwoaW5zdGFuY2UtPnN0YXR1c19yZWcpOworCWlmICghKHN0YXR1cyAmIE1FNjAwMF9BT19TVEFUVVNfQklUX0ZGKSkgewkvL0ZJRk8gaXMgZnVsbCBiZWZvcmUgYWxsIGRhdGFzIHdlcmUgY29waWVkIQorCQlQRVJST1IoImlkeD0lZCBGSUZPIGlzIGZ1bGwgYmVmb3JlIGFsbCBkYXRhcyB3ZXJlIGNvcGllZCFcbiIsCisJCSAgICAgICBpbnN0YW5jZS0+YW9faWR4KTsKKwkJcmV0dXJuIC1NRV9FUlJOT19GSUZPX0JVRkZFUl9PVkVSRkxPVzsKKwl9IGVsc2UgewkJLy9BZGQgbGFzdCB2YWx1ZQorCQl2YWx1ZSA9ICooaW5zdGFuY2UtPmNpcmNfYnVmLmJ1ZiArIHBvcyk7CisJCWlmIChpbnN0YW5jZS0+YW9faWR4ICYgMHgxKSB7CisJCQl2YWx1ZSA8PD0gMTY7CisJCX0KKwkJLy9QdXQgdmFsdWUgdG8gRklGTworCQlvdXRsKHZhbHVlLCBpbnN0YW5jZS0+Zmlmb19yZWcpOworCQkvL1BERUJVR19SRUcoImlkeD0lZCBmaWZvX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+YW9faWR4LCBpbnN0YW5jZS0+cmVnX2Jhc2UsIGluc3RhbmNlLT5maWZvX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgdmFsdWUpOworCX0KKworCVBJTkZPKCJpZHg9JWQgRkFTVCBMT0FERUQgJWQgdmFsdWVzXG4iLCBpbnN0YW5jZS0+YW9faWR4LCBsb2NhbF9jb3VudCk7CisJcmV0dXJuIGxvY2FsX2NvdW50OworfQorCisvKiogQGJyaWVmIENvcHkgZGF0YSBmcm9tIHNvZnR3YXJlIGJ1ZmZlciB0byBmaWZvIChzbG93KS4KKyogQG5vdGUgVGhpcyBpcyBzbG93IGZ1bmN0aW9uIHRoYXQgY29weSBhbGwgZGF0YSBmcm9tIGJ1ZmZlciB0byBGSUZPIHdpdGggZnVsbCBjb250cm9sLgorKgorKiBAcGFyYW0gaW5zdGFuY2UgVGhlIHN1YmRldmljZSBpbnN0YW5jZSAocG9pbnRlcikuCisqIEBwYXJhbSBjb3VudCBNYXhpbXVtIG51bWJlciBvZiBjb3BpZWQgZGF0YS4KKyogQHBhcmFtIHN0YXJ0X3BvcyBQb3NpdGlvbiBvZiB0aGUgZmlycyB2YWx1ZSBpbiBidWZmZXIuCisqCisqIEByZXR1cm4gT24gc3VjY2VzczogTnVtYmVyIG9mIGNvcGllZCB2YWx1ZXMuCisqIEByZXR1cm4gT24gZXJyb3Ivc3VjY2VzczogMC4JRklGTyB3YXMgZnVsbCBhdCBiZWdpbmluZy4KKyogQHJldHVybiBPbiBlcnJvcjogLU1FX0VSUk5PX1JJTkdfQlVGRkVSX1VOREVGRkxPVy4KKyovCitpbnQgaW5saW5lIGFvX3dyaXRlX2RhdGFfcG9vbGluZyhtZTYwMDBfYW9fc3ViZGV2aWNlX3QgKiBpbnN0YW5jZSwgaW50IGNvdW50LAorCQkJCSBpbnQgc3RhcnRfcG9zKQorewkJCQkvLy8gQG5vdGUgVGhpcyBpcyBzbG93IGZ1bmN0aW9uIQorCXVpbnQzMl90IHN0YXR1czsKKwl1aW50MzJfdCB2YWx1ZTsKKwlpbnQgcG9zID0KKwkgICAgKGluc3RhbmNlLT5jaXJjX2J1Zi50YWlsICsgc3RhcnRfcG9zKSAmIGluc3RhbmNlLT5jaXJjX2J1Zi5tYXNrOworCWludCBsb2NhbF9jb3VudCA9IGNvdW50OworCWludCBpOworCWludCBtYXhfY291bnQ7CisKKwlpZiAoY291bnQgPD0gMCkgewkvL1dyb25nIGNvdW50IQorCQlQRVJST1IoImlkeD0lZCBTTE9XIExPQURFRDogV3JvbmcgY291bnQhXG4iLCBpbnN0YW5jZS0+YW9faWR4KTsKKwkJcmV0dXJuIDA7CisJfQorCisJbWF4X2NvdW50ID0gbWVfY2lyY19idWZfdmFsdWVzKCZpbnN0YW5jZS0+Y2lyY19idWYpIC0gc3RhcnRfcG9zOworCWlmIChtYXhfY291bnQgPD0gMCkgewkvL05vIGRhdGEgdG8gY29weSEKKwkJUEVSUk9SKCJpZHg9JWQgU0xPVyBMT0FERUQ6IE5vIGRhdGEgdG8gY29weSFcbiIsCisJCSAgICAgICBpbnN0YW5jZS0+YW9faWR4KTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKG1heF9jb3VudCA8IGNvdW50KSB7CisJCWxvY2FsX2NvdW50ID0gbWF4X2NvdW50OworCX0KKworCWZvciAoaSA9IDA7IGkgPCBsb2NhbF9jb3VudDsgaSsrKSB7CisJCXN0YXR1cyA9IGlubChpbnN0YW5jZS0+c3RhdHVzX3JlZyk7CisJCWlmICghKHN0YXR1cyAmIE1FNjAwMF9BT19TVEFUVVNfQklUX0ZGKSkgewkvL0ZJRk8gaXMgZnVsbCEKKwkJCXJldHVybiBpOworCQl9CisJCS8vR2V0IHZhbHVlIGZyb20gYnVmZmVyCisJCXZhbHVlID0gKihpbnN0YW5jZS0+Y2lyY19idWYuYnVmICsgcG9zKTsKKwkJLy9QcmVwYXJlIGl0CisJCWlmIChpbnN0YW5jZS0+YW9faWR4ICYgMHgxKSB7CisJCQl2YWx1ZSA8PD0gMTY7CisJCX0KKwkJLy9QdXQgdmFsdWUgdG8gRklGTworCQlvdXRsKHZhbHVlLCBpbnN0YW5jZS0+Zmlmb19yZWcpOworCQkvL1BERUJVR19SRUcoImlkeD0lZCBmaWZvX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+YW9faWR4LCBpbnN0YW5jZS0+cmVnX2Jhc2UsIGluc3RhbmNlLT5maWZvX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgdmFsdWUpOworCisJCXBvcysrOworCQlwb3MgJj0gaW5zdGFuY2UtPmNpcmNfYnVmLm1hc2s7CisJfQorCisJUElORk8oImlkeD0lZCBTTE9XIExPQURFRCAlZCB2YWx1ZXNcbiIsIGluc3RhbmNlLT5hb19pZHgsIGxvY2FsX2NvdW50KTsKKwlyZXR1cm4gbG9jYWxfY291bnQ7Cit9CisKKy8qKiBAYnJpZWYgQ29weSBkYXRhIGZyb20gdXNlciBzcGFjZSB0byBjaXJjdWxhciBidWZmZXIuCisqIEBwYXJhbSBpbnN0YW5jZSBUaGUgc3ViZGV2aWNlIGluc3RhbmNlIChwb2ludGVyKS4KKyogQHBhcmFtIGNvdW50IE51bWJlciBvZiBkYXRhcyBpbiB1c2VyIHNwYWNlLgorKiBAcGFyYW0gdXNlcl92YWx1ZXMgQnVmZmVyJ3MgcG9pbnRlci4KKyoKKyogQHJldHVybiBPbiBzdWNjZXNzOiBOdW1iZXIgb2YgY29waWVkIHZhbHVlcy4KKyogQHJldHVybiBPbiBlcnJvcjogLU1FX0VSUk5PX0lOVEVSTkFMLgorKi8KK2ludCBpbmxpbmUgYW9fZ2V0X2RhdGFfZnJvbV91c2VyKG1lNjAwMF9hb19zdWJkZXZpY2VfdCAqIGluc3RhbmNlLCBpbnQgY291bnQsCisJCQkJIGludCAqdXNlcl92YWx1ZXMpCit7CisJaW50IGksIGVycjsKKwlpbnQgZW1wdHlfc3BhY2U7CisJaW50IGNvcGllZDsKKwlpbnQgdmFsdWU7CisKKwllbXB0eV9zcGFjZSA9IG1lX2NpcmNfYnVmX3NwYWNlKCZpbnN0YW5jZS0+Y2lyY19idWYpOworCS8vV2UgaGF2ZSBvbmx5IHRoaXMgc3BhY2UgZnJlZS4KKwljb3BpZWQgPSAoY291bnQgPCBlbXB0eV9zcGFjZSkgPyBjb3VudCA6IGVtcHR5X3NwYWNlOworCWZvciAoaSA9IDA7IGkgPCBjb3BpZWQ7IGkrKykgewkvL0NvcHkgZnJvbSB1c2VyIHRvIGJ1ZmZlcgorCQlpZiAoKGVyciA9IGdldF91c2VyKHZhbHVlLCAoaW50ICopKHVzZXJfdmFsdWVzICsgaSkpKSkgeworCQkJUEVSUk9SCisJCQkgICAgKCJpZHg9JWQgQlVGRkVSIExPQURFRDogZ2V0X3VzZXIoMHglcCkgcmV0dXJuIGFuIGVycm9yOiAlZFxuIiwKKwkJCSAgICAgaW5zdGFuY2UtPmFvX2lkeCwgdXNlcl92YWx1ZXMgKyBpLCBlcnIpOworCQkJcmV0dXJuIC1NRV9FUlJOT19JTlRFUk5BTDsKKwkJfQorCQkvLy8gQG5vdGUgVGhlIGFuYWxvZyBvdXRwdXQgaW4gbWU2MDAwIHNlcmllcyBoYXMgc2l6ZSBvZiAxNiBiaXRzLgorCQkqKGluc3RhbmNlLT5jaXJjX2J1Zi5idWYgKyBpbnN0YW5jZS0+Y2lyY19idWYuaGVhZCkgPQorCQkgICAgKHVpbnQxNl90KSB2YWx1ZTsKKwkJaW5zdGFuY2UtPmNpcmNfYnVmLmhlYWQrKzsKKwkJaW5zdGFuY2UtPmNpcmNfYnVmLmhlYWQgJj0gaW5zdGFuY2UtPmNpcmNfYnVmLm1hc2s7CisJfQorCisJUElORk8oImlkeD0lZCBCVUZGRVIgTE9BREVEICVkIHZhbHVlc1xuIiwgaW5zdGFuY2UtPmFvX2lkeCwgY29waWVkKTsKKwlyZXR1cm4gY29waWVkOworfQorCitzdGF0aWMgdm9pZCBtZTYwMDBfYW9fd29ya19jb250cm9sX3Rhc2soCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDIwKQorCQkJCQkgICAgICAgdm9pZCAqc3ViZGV2aWNlCisjZWxzZQorCQkJCQkgICAgICAgc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrCisjZW5kaWYKKyAgICApCit7CisJbWU2MDAwX2FvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwl1bnNpZ25lZCBsb25nIGNwdV9mbGFncyA9IDA7CisJdWludDMyX3Qgc3RhdHVzOworCXVpbnQzMl90IGN0cmw7CisJdWludDMyX3Qgc3luY2g7CisJaW50IHJlc2NoZWR1bGUgPSAwOworCWludCBzaWduYWxpbmcgPSAwOworCXVpbnQzMl90IHNpbmdsZV9tYXNrOworCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDIwKQorCWluc3RhbmNlID0gKG1lNjAwMF9hb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisjZWxzZQorCWluc3RhbmNlID0KKwkgICAgY29udGFpbmVyX29mKCh2b2lkICopd29yaywgbWU2MDAwX2FvX3N1YmRldmljZV90LCBhb19jb250cm9sX3Rhc2spOworI2VuZGlmCisJUElORk8oIjwlczogJWxkPiBleGVjdXRlZC4gaWR4PSVkXG4iLCBfX2Z1bmNfXywgamlmZmllcywKKwkgICAgICBpbnN0YW5jZS0+YW9faWR4KTsKKworCXN0YXR1cyA9IGlubChpbnN0YW5jZS0+c3RhdHVzX3JlZyk7CisJUERFQlVHX1JFRygic3RhdHVzX3JlZyBpbmwoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPnN0YXR1c19yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIHN0YXR1cyk7CisKKy8vLyBAbm90ZSBBT19TVEFUVVNfQklUX0ZTTSBkb2Vzbid0IHdvcmsgYXMgc2hvdWxkIGJlIGZvciBwdXJlIHNpbmdsZSBjaGFubmVscyAoaWR4Pj00KQorLy8gICAgICBzaW5nbGVfbWFzayA9IChpbnN0YW5jZS0+YW9faWR4LU1FNjAwMF9BT19TSU5HTEVfU1RBVFVTX09GRlNFVCA8IDApID8gMHgwMDAwIDogKDB4MDAwMSA8PCAoaW5zdGFuY2UtPmFvX2lkeC1NRTYwMDBfQU9fU0lOR0xFX1NUQVRVU19PRkZTRVQpKTsKKwlzaW5nbGVfbWFzayA9ICppbnN0YW5jZS0+dHJpZ2dlcmluZ19mbGFncyAmICgweDEgPDwgaW5zdGFuY2UtPmFvX2lkeCk7CisKKwlzd2l0Y2ggKGluc3RhbmNlLT5zdGF0dXMpIHsJLy8gQ2hlY2tpbmcgYWN0dWFsIG1vZGUuCisKKwkJLy8gTm90IGNvbmZpZ3VyZWQgZm9yIHdvcmsuCisJY2FzZSBhb19zdGF0dXNfbm9uZToKKwkJYnJlYWs7CisKKwkJLy9UaGlzIGFyZSBzdGFibGUgbW9kZXMuIE5vIG5lZWQgdG8gZG8gYW55dGhpbmcuICg/KQorCWNhc2UgYW9fc3RhdHVzX3NpbmdsZV9jb25maWd1cmVkOgorCWNhc2UgYW9fc3RhdHVzX3N0cmVhbV9jb25maWd1cmVkOgorCWNhc2UgYW9fc3RhdHVzX3N0cmVhbV9maWZvX2Vycm9yOgorCWNhc2UgYW9fc3RhdHVzX3N0cmVhbV9idWZmZXJfZXJyb3I6CisJY2FzZSBhb19zdGF0dXNfc3RyZWFtX2Vycm9yOgorCQlQRVJST1IoIlNob3VsZG4ndCBiZSBydW5uaW5nIS5cbiIpOworCQlicmVhazsKKworCQkvLyBTaW5nbGUgbW9kZXMKKwljYXNlIGFvX3N0YXR1c19zaW5nbGVfcnVuX3dhaXQ6CisJY2FzZSBhb19zdGF0dXNfc2luZ2xlX3J1bjoKKwljYXNlIGFvX3N0YXR1c19zaW5nbGVfZW5kX3dhaXQ6CisJCWlmIChpbnN0YW5jZS0+ZmlmbykgewkvLyBFeHRyYSByZWdpc3RlcnMuCisJCQlpZiAoIShzdGF0dXMgJiBNRTYwMDBfQU9fU1RBVFVTX0JJVF9GU00pKSB7CS8vIFN0YXRlIG1hY2hpbmUgaXMgbm90IHdvcmtpbmcuCisJCQkJaWYgKCgoaW5zdGFuY2UtPmZpZm8gJiBNRTYwMDBfQU9fSEFTX0ZJRk8pCisJCQkJICAgICAmJiAoIShzdGF0dXMgJiBNRTYwMDBfQU9fU1RBVFVTX0JJVF9FRikpKQorCQkJCSAgICB8fCAoIShpbnN0YW5jZS0+ZmlmbyAmIE1FNjAwMF9BT19IQVNfRklGTykpKSB7CS8vIFNpbmdsZSBpcyBpbiBlbmQgc3RhdGUuCisJCQkJCVBERUJVRworCQkJCQkgICAgKCJTaW5nbGUgY2FsbCBoYXMgYmVlbiBjb21wbGl0ZWQuXG4iKTsKKworCQkJCQkvLyBTZXQgY29ycmVjdCB2YWx1ZSBmb3Igc2luZ2xlX3JlYWQoKTsKKwkJCQkJaW5zdGFuY2UtPnNpbmdsZV92YWx1ZSA9CisJCQkJCSAgICBpbnN0YW5jZS0+c2luZ2xlX3ZhbHVlX2luX2ZpZm87CisKKwkJCQkJLy8gU2V0IHN0YXR1cyBhcyAnYW9fc3RhdHVzX3NpbmdsZV9lbmQnCisJCQkJCWluc3RhbmNlLT5zdGF0dXMgPSBhb19zdGF0dXNfc2luZ2xlX2VuZDsKKworCQkJCQlzcGluX2xvY2soaW5zdGFuY2UtPnByZWxvYWRfcmVnX2xvY2spOworCQkJCQlpZiAoKHNpbmdsZV9tYXNrKSAmJiAoKmluc3RhbmNlLT5wcmVsb2FkX2ZsYWdzICYgKE1FNjAwMF9BT19TWU5DX0hPTEQgPDwgaW5zdGFuY2UtPmFvX2lkeCkpKSB7CS8vIFRoaXMgaXMgb25lIG9mIHN5bmNocm9ub3VzIHN0YXJ0IGNoYW5uZWxzLiBTZXQgYWxsIGFzIHRyaWdnZXJlZC4KKwkJCQkJCSppbnN0YW5jZS0+dHJpZ2dlcmluZ19mbGFncyA9CisJCQkJCQkgICAgMHgwMDAwMDAwMDsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCS8vU2V0IHRoaXMgY2hhbm5lbCBhcyB0cmlnZ2VyZWQgKG5vbmUgYWN0aXZlKS4KKwkJCQkJCSppbnN0YW5jZS0+dHJpZ2dlcmluZ19mbGFncyAmPQorCQkJCQkJICAgIH4oMHgxIDw8IGluc3RhbmNlLT5hb19pZHgpOworCQkJCQl9CisJCQkJCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5wcmVsb2FkX3JlZ19sb2NrKTsKKworCQkJCQkvLyBTaWduYWwgdGhlIGVuZC4KKwkJCQkJc2lnbmFsaW5nID0gMTsKKwkJCQkJLy8gV2FpdCBmb3Igc3RvcCBJU00uCisJCQkJCXJlc2NoZWR1bGUgPSAxOworCisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCS8vIENoZWNrIHRpbWVvdXQuCisJCQlpZiAoKGluc3RhbmNlLT50aW1lb3V0LmRlbGF5KSAmJiAoKGppZmZpZXMgLSBpbnN0YW5jZS0+dGltZW91dC5zdGFydF90aW1lKSA+PSBpbnN0YW5jZS0+dGltZW91dC5kZWxheSkpIHsJLy8gVGltZW91dAorCQkJCVBERUJVRygiVGltZW91dCByZWFjaGVkLlxuIik7CisJCQkJLy8gU3RvcCBhbGwgYWN0aW9ucy4gTm8gY29uZGl0aW9ucyEgQmxvY2sgaW50ZXJydXB0cyBhbmQgdHJpZ2dlci4gTGVhdmUgRklGTyB1bnRvdWNoZWQhCisJCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywKKwkJCQkJCSAgY3B1X2ZsYWdzKTsKKwkJCQljdHJsID0gaW5sKGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCQkJY3RybCB8PQorCQkJCSAgICBNRTYwMDBfQU9fQ1RSTF9CSVRfU1RPUCB8CisJCQkJICAgIE1FNjAwMF9BT19DVFJMX0JJVF9JTU1FRElBVEVfU1RPUDsKKwkJCQljdHJsICY9CisJCQkJICAgIH4oTUU2MDAwX0FPX0NUUkxfQklUX0VOQUJMRV9JUlEgfAorCQkJCSAgICAgIE1FNjAwMF9BT19DVFJMX0JJVF9FTkFCTEVfRVhfVFJJRyk7CisJCQkJY3RybCAmPQorCQkJCSAgICB+KE1FNjAwMF9BT19DVFJMX0JJVF9FWF9UUklHX0VER0UgfAorCQkJCSAgICAgIE1FNjAwMF9BT19DVFJMX0JJVF9FWF9UUklHX0VER0VfQk9USCk7CisJCQkJLy9EaXNhYmxpbmcgRklGTworCQkJCWN0cmwgJj0gfk1FNjAwMF9BT19DVFJMX0JJVF9FTkFCTEVfRklGTzsKKworCQkJCW91dGwoY3RybCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJCQlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtCisJCQkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwgY3RybCk7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPgorCQkJCQkJICAgICAgIHN1YmRldmljZV9sb2NrLAorCQkJCQkJICAgICAgIGNwdV9mbGFncyk7CisKKwkJCQkvL1Jlc2V0IGludGVycnVwdCBsYXRjaAorCQkJCWlubChpbnN0YW5jZS0+aXJxX3Jlc2V0X3JlZyk7CisKKwkJCQlzcGluX2xvY2soaW5zdGFuY2UtPnByZWxvYWRfcmVnX2xvY2spOworCQkJCS8vUmVtb3ZlIGZyb20gc3luY2hyb25vdXMgc3RhcnQuIEJsb2NrIHRyaWdnZXJpbmcgZnJvbSB0aGlzIG91dHB1dC4KKwkJCQlzeW5jaCA9IGlubChpbnN0YW5jZS0+cHJlbG9hZF9yZWcpOworCQkJCXN5bmNoICY9CisJCQkJICAgIH4oKE1FNjAwMF9BT19TWU5DX0hPTEQgfAorCQkJCSAgICAgICBNRTYwMDBfQU9fU1lOQ19FWFRfVFJJRykgPDwgaW5zdGFuY2UtPgorCQkJCSAgICAgIGFvX2lkeCk7CisJCQkJaWYgKCEoaW5zdGFuY2UtPmZpZm8gJiBNRTYwMDBfQU9fSEFTX0ZJRk8pKSB7CS8vIE5vIEZJRk8gLSBzZXQgdG8gc2luZ2xlIHNhZmUgbW9kZQorCQkJCQlzeW5jaCB8PQorCQkJCQkgICAgTUU2MDAwX0FPX1NZTkNfSE9MRCA8PCBpbnN0YW5jZS0+CisJCQkJCSAgICBhb19pZHg7CisJCQkJfQorCQkJCW91dGwoc3luY2gsIGluc3RhbmNlLT5wcmVsb2FkX3JlZyk7CisJCQkJUERFQlVHX1JFRworCQkJCSAgICAoInByZWxvYWRfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkJICAgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgICBpbnN0YW5jZS0+cHJlbG9hZF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgICBzeW5jaCk7CisJCQkJLy9TZXQgdGhpcyBjaGFubmVsIGFzIHRyaWdnZXJlZCAobm9uZSBhY3RpdmUpLgorCQkJCSppbnN0YW5jZS0+dHJpZ2dlcmluZ19mbGFncyAmPQorCQkJCSAgICB+KDB4MSA8PCBpbnN0YW5jZS0+YW9faWR4KTsKKwkJCQlzcGluX3VubG9jayhpbnN0YW5jZS0+cHJlbG9hZF9yZWdfbG9jayk7CisKKwkJCQkvLyBTZXQgY29ycmVjdCB2YWx1ZSBmb3Igc2luZ2xlX3JlYWQoKTsKKwkJCQlpbnN0YW5jZS0+c2luZ2xlX3ZhbHVlX2luX2ZpZm8gPQorCQkJCSAgICBpbnN0YW5jZS0+c2luZ2xlX3ZhbHVlOworCisJCQkJaW5zdGFuY2UtPnN0YXR1cyA9IGFvX3N0YXR1c19zaW5nbGVfZW5kOworCisJCQkJLy8gU2lnbmFsIHRoZSBlbmQuCisJCQkJc2lnbmFsaW5nID0gMTsKKwkJCX0KKwkJfSBlbHNlIHsJLy8gTm8gZXh0cmEgcmVnaXN0ZXJzLgorLyoKKwkJCQlpZiAoIShzdGF0dXMgJiBzaW5nbGVfbWFzaykpCisJCQkJey8vIFN0YXRlIG1hY2hpbmUgaXMgbm90IHdvcmtpbmcuCisJCQkJCVBERUJVRygiU2luZ2xlIGNhbGwgaGFzIGJlZW4gY29tcGxpdGVkLlxuIik7CisKKwkJCQkJLy8gU2V0IGNvcnJlY3QgdmFsdWUgZm9yIHNpbmdsZV9yZWFkKCk7CisJCQkJCWluc3RhbmNlLT5zaW5nbGVfdmFsdWUgPSBpbnN0YW5jZS0+c2luZ2xlX3ZhbHVlX2luX2ZpZm87CisKKwkJCQkJLy8gU2V0IHN0YXR1cyBhcyAnYW9fc3RhdHVzX3NpbmdsZV9lbmQnCisJCQkJCWluc3RhbmNlLT5zdGF0dXMgPSBhb19zdGF0dXNfc2luZ2xlX2VuZDsKKworCQkJCQkvLyBTaWduYWwgdGhlIGVuZC4KKwkJCQkJc2lnbmFsaW5nID0gMTsKKwkJCQkJLy8gV2FpdCBmb3Igc3RvcCBJU00uCisJCQkJCXJlc2NoZWR1bGUgPSAxOworCisJCQkJCWJyZWFrOworCQkJCX0KKyovCisJCQlpZiAoIXNpbmdsZV9tYXNrKSB7CS8vIFdhcyB0cmlnZ2VyZWQuCisJCQkJUERFQlVHKCJTaW5nbGUgY2FsbCBoYXMgYmVlbiBjb21wbGl0ZWQuXG4iKTsKKworCQkJCS8vIFNldCBjb3JyZWN0IHZhbHVlIGZvciBzaW5nbGVfcmVhZCgpOworCQkJCWluc3RhbmNlLT5zaW5nbGVfdmFsdWUgPQorCQkJCSAgICBpbnN0YW5jZS0+c2luZ2xlX3ZhbHVlX2luX2ZpZm87CisKKwkJCQkvLyBTZXQgc3RhdHVzIGFzICdhb19zdGF0dXNfc2luZ2xlX2VuZCcKKwkJCQlpbnN0YW5jZS0+c3RhdHVzID0gYW9fc3RhdHVzX3NpbmdsZV9lbmQ7CisKKwkJCQkvLyBTaWduYWwgdGhlIGVuZC4KKwkJCQlzaWduYWxpbmcgPSAxOworCisJCQkJYnJlYWs7CisJCQl9CisJCQkvLyBDaGVjayB0aW1lb3V0LgorCQkJaWYgKChpbnN0YW5jZS0+dGltZW91dC5kZWxheSkgJiYgKChqaWZmaWVzIC0gaW5zdGFuY2UtPnRpbWVvdXQuc3RhcnRfdGltZSkgPj0gaW5zdGFuY2UtPnRpbWVvdXQuZGVsYXkpKSB7CS8vIFRpbWVvdXQKKwkJCQlQREVCVUcoIlRpbWVvdXQgcmVhY2hlZC5cbiIpOworCisJCQkJc3Bpbl9sb2NrKGluc3RhbmNlLT5wcmVsb2FkX3JlZ19sb2NrKTsKKwkJCQkvL1JlbW92ZSBmcm9tIHN5bmNocm9ub3VzIHN0YXJ0LiBCbG9jayB0cmlnZ2VyaW5nIGZyb20gdGhpcyBvdXRwdXQuCisJCQkJc3luY2ggPSBpbmwoaW5zdGFuY2UtPnByZWxvYWRfcmVnKTsKKwkJCQlzeW5jaCAmPQorCQkJCSAgICB+KE1FNjAwMF9BT19TWU5DX0VYVF9UUklHIDw8IGluc3RhbmNlLT4KKwkJCQkgICAgICBhb19pZHgpOworCQkJCXN5bmNoIHw9CisJCQkJICAgIE1FNjAwMF9BT19TWU5DX0hPTEQgPDwgaW5zdGFuY2UtPmFvX2lkeDsKKworCQkJCW91dGwoc3luY2gsIGluc3RhbmNlLT5wcmVsb2FkX3JlZyk7CisJCQkJUERFQlVHX1JFRworCQkJCSAgICAoInByZWxvYWRfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkJICAgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgICBpbnN0YW5jZS0+cHJlbG9hZF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgICBzeW5jaCk7CisJCQkJLy9TZXQgdGhpcyBjaGFubmVsIGFzIHRyaWdnZXJlZCAobm9uZSBhY3RpdmUpLgorCQkJCSppbnN0YW5jZS0+dHJpZ2dlcmluZ19mbGFncyAmPQorCQkJCSAgICB+KDB4MSA8PCBpbnN0YW5jZS0+YW9faWR4KTsKKwkJCQlzcGluX3VubG9jayhpbnN0YW5jZS0+cHJlbG9hZF9yZWdfbG9jayk7CisKKwkJCQkvLyBSZXN0b3JlIG9sZCBzZXR0aW5ncy4KKwkJCQlQREVCVUcoIldyaXRlIG9sZCB2YWx1ZSBiYWNrIHRvIHJlZ2lzdGVyLlxuIik7CisJCQkJb3V0bChpbnN0YW5jZS0+c2luZ2xlX3ZhbHVlLAorCQkJCSAgICAgaW5zdGFuY2UtPnNpbmdsZV9yZWcpOworCQkJCVBERUJVR19SRUcKKwkJCQkgICAgKCJzaW5nbGVfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkJICAgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgICBpbnN0YW5jZS0+c2luZ2xlX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICAgIGluc3RhbmNlLT5zaW5nbGVfdmFsdWUpOworCisJCQkJLy8gU2V0IGNvcnJlY3QgdmFsdWUgZm9yIHNpbmdsZV9yZWFkKCk7CisJCQkJaW5zdGFuY2UtPnNpbmdsZV92YWx1ZV9pbl9maWZvID0KKwkJCQkgICAgaW5zdGFuY2UtPnNpbmdsZV92YWx1ZTsKKworCQkJCWluc3RhbmNlLT5zdGF0dXMgPSBhb19zdGF0dXNfc2luZ2xlX2VuZDsKKworCQkJCS8vIFNpZ25hbCB0aGUgZW5kLgorCQkJCXNpZ25hbGluZyA9IDE7CisJCQl9CisJCX0KKworCQkvLyBXYWl0IGZvciBzdG9wLgorCQlyZXNjaGVkdWxlID0gMTsKKwkJYnJlYWs7CisKKwljYXNlIGFvX3N0YXR1c19zdHJlYW1fZW5kOgorCQlpZiAoIShpbnN0YW5jZS0+ZmlmbyAmIE1FNjAwMF9BT19IQVNfRklGTykpIHsJLy8gTm8gRklGTworCQkJUEVSUk9SX0NSSVRJQ0FMCisJCQkgICAgKCJTdHJlYW1pbmcgb24gc2luZ2xlIGRldmljZSEgVGhpcyBmZWF0dXJlIGlzIG5vdCBpbXBsZW1lbnRlZCBpbiB0aGlzIHZlcnNpb24hXG4iKTsKKwkJCWluc3RhbmNlLT5zdGF0dXMgPSBhb19zdGF0dXNfc3RyZWFtX2Vycm9yOworCQkJLy8gU2lnbmFsIHRoZSBlbmQuCisJCQlzaWduYWxpbmcgPSAxOworCQkJYnJlYWs7CisJCX0KKwljYXNlIGFvX3N0YXR1c19zaW5nbGVfZW5kOgorCQlpZiAoaW5zdGFuY2UtPmZpZm8pIHsJLy8gRXh0cmEgcmVnaXN0ZXJzLgorCQkJaWYgKHN0YXR1cyAmIE1FNjAwMF9BT19TVEFUVVNfQklUX0ZTTSkgewkvLyBTdGF0ZSBtYWNoaW5lIGlzIHdvcmtpbmcgYnV0IHRoZSBzdGF0dXMgaXMgc2V0IHRvIGVuZC4gRm9yY2Ugc3RvcC4KKworCQkJCS8vIFdhaXQgZm9yIHN0b3AuCisJCQkJcmVzY2hlZHVsZSA9IDE7CisJCQl9CisKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisJCQkvLyBTdG9wIGFsbCBhY3Rpb25zLiBObyBjb25kaXRpb25zISBCbG9jayBpbnRlcnJ1cHRzIGFuZCB0cmlnZ2VyLiBMZWF2ZSBGSUZPIHVudG91Y2hlZCEKKwkJCWN0cmwgPSBpbmwoaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJCWN0cmwgfD0KKwkJCSAgICBNRTYwMDBfQU9fQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1AgfAorCQkJICAgIE1FNjAwMF9BT19DVFJMX0JJVF9TVE9QOworCQkJY3RybCAmPQorCQkJICAgIH4oTUU2MDAwX0FPX0NUUkxfQklUX0VOQUJMRV9JUlEgfAorCQkJICAgICAgTUU2MDAwX0FPX0NUUkxfQklUX0VOQUJMRV9FWF9UUklHKTsKKwkJCW91dGwoY3RybCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICBjdHJsKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywKKwkJCQkJICAgICAgIGNwdV9mbGFncyk7CisKKwkJCS8vUmVzZXQgaW50ZXJydXB0IGxhdGNoCisJCQlpbmwoaW5zdGFuY2UtPmlycV9yZXNldF9yZWcpOworCQl9IGVsc2UgewkvLyBObyBleHRyYSByZWdpc3RlcnMuCisvKgorCQkJCWlmIChzdGF0dXMgJiBzaW5nbGVfbWFzaykKKwkJCQl7Ly8gU3RhdGUgbWFjaGluZSBpcyB3b3JraW5nIGJ1dCB0aGUgc3RhdHVzIGlzIHNldCB0byBlbmQuIEZvcmNlIHN0b3AuCisKKwkJCQkJLy8gV2FpdCBmb3Igc3RvcC4KKwkJCQkJcmVzY2hlZHVsZSA9IDE7CisJCQkJfQorKi8KKwkJfQorCQlicmVhazsKKworCQkvLyBTdHJlYW0gbW9kZXMKKwljYXNlIGFvX3N0YXR1c19zdHJlYW1fcnVuX3dhaXQ6CisJCWlmICghKGluc3RhbmNlLT5maWZvICYgTUU2MDAwX0FPX0hBU19GSUZPKSkgewkvLyBObyBGSUZPCisJCQlQRVJST1JfQ1JJVElDQUwKKwkJCSAgICAoIlN0cmVhbWluZyBvbiBzaW5nbGUgZGV2aWNlISBUaGlzIGZlYXR1cmUgaXMgbm90IGltcGxlbWVudGVkIGluIHRoaXMgdmVyc2lvbiFcbiIpOworCQkJaW5zdGFuY2UtPnN0YXR1cyA9IGFvX3N0YXR1c19zdHJlYW1fZXJyb3I7CisJCQkvLyBTaWduYWwgdGhlIGVuZC4KKwkJCXNpZ25hbGluZyA9IDE7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChzdGF0dXMgJiBNRTYwMDBfQU9fU1RBVFVTX0JJVF9GU00pIHsJLy8gU3RhdGUgbWFjaGluZSBpcyB3b3JraW5nLiBXYWl0aW5nIGZvciBzdGFydCBmaW5pc2guCisJCQlpbnN0YW5jZS0+c3RhdHVzID0gYW9fc3RhdHVzX3N0cmVhbV9ydW47CisKKwkJCS8vIFNpZ25hbCBlbmQgb2YgdGhpcyBzdGVwCisJCQlzaWduYWxpbmcgPSAxOworCQl9IGVsc2UgewkvLyBTdGF0ZSBtYWNoaW5lIGlzIG5vdCB3b3JraW5nLgorCQkJaWYgKCEoc3RhdHVzICYgTUU2MDAwX0FPX1NUQVRVU19CSVRfRUYpKSB7CS8vIEZJRk8gaXMgZW1wdHkuIFByb2NlZHVyZSBoYXMgc3RhcnRlZCBhbmQgZmluaXNoIGFscmVhZHkhCisJCQkJaW5zdGFuY2UtPnN0YXR1cyA9IGFvX3N0YXR1c19zdHJlYW1fZW5kOworCisJCQkJLy8gU2lnbmFsIHRoZSBlbmQuCisJCQkJc2lnbmFsaW5nID0gMTsKKwkJCQkvLyBXYWl0IGZvciBzdG9wLgorCQkJCXJlc2NoZWR1bGUgPSAxOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJLy8gQ2hlY2sgdGltZW91dC4KKwkJaWYgKChpbnN0YW5jZS0+dGltZW91dC5kZWxheSkgJiYgKChqaWZmaWVzIC0gaW5zdGFuY2UtPnRpbWVvdXQuc3RhcnRfdGltZSkgPj0gaW5zdGFuY2UtPnRpbWVvdXQuZGVsYXkpKSB7CS8vIFRpbWVvdXQKKwkJCVBERUJVRygiVGltZW91dCByZWFjaGVkLlxuIik7CisJCQkvLyBTdG9wIGFsbCBhY3Rpb25zLiBObyBjb25kaXRpb25zISBCbG9jayBpbnRlcnJ1cHRzLiBMZWF2ZSBGSUZPIHVudG91Y2hlZCEKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisJCQljdHJsID0gaW5sKGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCQljdHJsIHw9CisJCQkgICAgTUU2MDAwX0FPX0NUUkxfQklUX1NUT1AgfAorCQkJICAgIE1FNjAwMF9BT19DVFJMX0JJVF9JTU1FRElBVEVfU1RPUDsKKwkJCWN0cmwgJj0KKwkJCSAgICB+KE1FNjAwMF9BT19DVFJMX0JJVF9FTkFCTEVfSVJRIHwKKwkJCSAgICAgIE1FNjAwMF9BT19DVFJMX0JJVF9FTkFCTEVfRVhfVFJJRyk7CisJCQlvdXRsKGN0cmwsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCQlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgY3RybCk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssCisJCQkJCSAgICAgICBjcHVfZmxhZ3MpOworCisJCQkvL1Jlc2V0IGludGVycnVwdCBsYXRjaAorCQkJaW5sKGluc3RhbmNlLT5pcnFfcmVzZXRfcmVnKTsKKworCQkJc3Bpbl9sb2NrKGluc3RhbmNlLT5wcmVsb2FkX3JlZ19sb2NrKTsKKwkJCS8vUmVtb3ZlIGZyb20gc3luY2hyb25vdXMgc3RhcnQuIEJsb2NrIHRyaWdnZXJpbmcgZnJvbSB0aGlzIG91dHB1dC4KKwkJCXN5bmNoID0gaW5sKGluc3RhbmNlLT5wcmVsb2FkX3JlZyk7CisJCQlzeW5jaCAmPQorCQkJICAgIH4oKE1FNjAwMF9BT19TWU5DX0hPTEQgfCBNRTYwMDBfQU9fU1lOQ19FWFRfVFJJRykgPDwKKwkJCSAgICAgIGluc3RhbmNlLT5hb19pZHgpOworCQkJb3V0bChzeW5jaCwgaW5zdGFuY2UtPnByZWxvYWRfcmVnKTsKKwkJCVBERUJVR19SRUcoInByZWxvYWRfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIGluc3RhbmNlLT5wcmVsb2FkX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICBzeW5jaCk7CisJCQlzcGluX3VubG9jayhpbnN0YW5jZS0+cHJlbG9hZF9yZWdfbG9jayk7CisKKwkJCWluc3RhbmNlLT5zdGF0dXMgPSBhb19zdGF0dXNfc3RyZWFtX2VuZDsKKworCQkJLy8gU2lnbmFsIHRoZSBlbmQuCisJCQlzaWduYWxpbmcgPSAxOworCQl9CisJCS8vIFdhaXQgZm9yIHN0b3AuCisJCXJlc2NoZWR1bGUgPSAxOworCQlicmVhazsKKworCWNhc2UgYW9fc3RhdHVzX3N0cmVhbV9ydW46CisJCWlmICghKGluc3RhbmNlLT5maWZvICYgTUU2MDAwX0FPX0hBU19GSUZPKSkgewkvLyBObyBGSUZPCisJCQlQRVJST1JfQ1JJVElDQUwKKwkJCSAgICAoIlN0cmVhbWluZyBvbiBzaW5nbGUgZGV2aWNlISBUaGlzIGZlYXR1cmUgaXMgbm90IGltcGxlbWVudGVkIGluIHRoaXMgdmVyc2lvbiFcbiIpOworCQkJaW5zdGFuY2UtPnN0YXR1cyA9IGFvX3N0YXR1c19zdHJlYW1fZXJyb3I7CisJCQkvLyBTaWduYWwgdGhlIGVuZC4KKwkJCXNpZ25hbGluZyA9IDE7CisJCQlicmVhazsKKwkJfQorCisJCWlmICghKHN0YXR1cyAmIE1FNjAwMF9BT19TVEFUVVNfQklUX0ZTTSkpIHsJLy8gU3RhdGUgbWFjaGluZSBpcyBub3Qgd29ya2luZy4gVGhpcyBpcyBhbiBlcnJvci4KKwkJCS8vIEJST0tFTiBQSVBFIQorCQkJaWYgKCEoc3RhdHVzICYgTUU2MDAwX0FPX1NUQVRVU19CSVRfRUYpKSB7CS8vIEZJRk8gaXMgZW1wdHkuCisJCQkJaWYgKG1lX2NpcmNfYnVmX3ZhbHVlcygmaW5zdGFuY2UtPmNpcmNfYnVmKSkgewkvLyBTb2Z0d2FyZSBidWZmZXIgaXMgbm90IGVtcHR5LgorCQkJCQlpZiAoaW5zdGFuY2UtPnN0b3BfZGF0YV9jb3VudCAmJiAoaW5zdGFuY2UtPnN0b3BfZGF0YV9jb3VudCA8PSBpbnN0YW5jZS0+ZGF0YV9jb3VudCkpIHsJLy9GaW5pc2hpbmcgd29yay4gUmVxdWVkIGRhdGEgc2hvd24uCisJCQkJCQlQREVCVUcKKwkJCQkJCSAgICAoIklTTSBzdG9wZWQuIE5vIGRhdGEgaW4gRklGTy4gQnVmZmVyIGlzIG5vdCBlbXB0eS5cbiIpOworCQkJCQkJaW5zdGFuY2UtPnN0YXR1cyA9CisJCQkJCQkgICAgYW9fc3RhdHVzX3N0cmVhbV9lbmQ7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlQRVJST1IKKwkJCQkJCSAgICAoIk91dHB1dCBzdHJlYW0gaGFzIGJlZW4gYnJva2VuLiBJU00gc3RvcGVkLiBObyBkYXRhIGluIEZJRk8uIEJ1ZmZlciBpcyBub3QgZW1wdHkuXG4iKTsKKwkJCQkJCWluc3RhbmNlLT5zdGF0dXMgPQorCQkJCQkJICAgIGFvX3N0YXR1c19zdHJlYW1fYnVmZmVyX2Vycm9yOworCQkJCQl9CisJCQkJfSBlbHNlIHsJLy8gU29mdHdhcmUgYnVmZmVyIGlzIGVtcHR5LgorCQkJCQlQREVCVUcKKwkJCQkJICAgICgiSVNNIHN0b3BlZC4gTm8gZGF0YSBpbiBGSUZPLiBCdWZmZXIgaXMgZW1wdHkuXG4iKTsKKwkJCQkJaW5zdGFuY2UtPnN0YXR1cyA9IGFvX3N0YXR1c19zdHJlYW1fZW5kOworCQkJCX0KKwkJCX0gZWxzZSB7CS8vIFRoZXJlIGFyZSBzdGlsbCBkYXRhcyBpbiBGSUZPLgorCQkJCWlmIChtZV9jaXJjX2J1Zl92YWx1ZXMoJmluc3RhbmNlLT5jaXJjX2J1ZikpIHsJLy8gU29mdHdhcmUgYnVmZmVyIGlzIG5vdCBlbXB0eS4KKwkJCQkJUEVSUk9SCisJCQkJCSAgICAoIk91dHB1dCBzdHJlYW0gaGFzIGJlZW4gYnJva2VuLiBJU00gc3RvcGVkIGJ1dCBzb21lIGRhdGEgaW4gRklGTyBhbmQgYnVmZmVyLlxuIik7CisJCQkJfSBlbHNlIHsJLy8gU29mdHdhcmUgYnVmZmVyIGlzIGVtcHR5LgorCQkJCQlQRVJST1IKKwkJCQkJICAgICgiT3V0cHV0IHN0cmVhbSBoYXMgYmVlbiBicm9rZW4uIElTTSBzdG9wZWQgYnV0IHNvbWUgZGF0YSBpbiBGSUZPLiBCdWZmZXIgaXMgZW1wdHkuXG4iKTsKKwkJCQl9CisJCQkJaW5zdGFuY2UtPnN0YXR1cyA9IGFvX3N0YXR1c19zdHJlYW1fZmlmb19lcnJvcjsKKworCQkJfQorCisJCQkvLyBTaWduYWwgdGhlIGZhaWx1cmUuCisJCQlzaWduYWxpbmcgPSAxOworCQkJYnJlYWs7CisJCX0KKwkJLy8gV2FpdCBmb3Igc3RvcC4KKwkJcmVzY2hlZHVsZSA9IDE7CisJCWJyZWFrOworCisJY2FzZSBhb19zdGF0dXNfc3RyZWFtX2VuZF93YWl0OgorCQlpZiAoIShpbnN0YW5jZS0+ZmlmbyAmIE1FNjAwMF9BT19IQVNfRklGTykpIHsJLy8gTm8gRklGTworCQkJUEVSUk9SX0NSSVRJQ0FMCisJCQkgICAgKCJTdHJlYW1pbmcgb24gc2luZ2xlIGRldmljZSEgVGhpcyBmZWF0dXJlIGlzIG5vdCBpbXBsZW1lbnRlZCBpbiB0aGlzIHZlcnNpb24hXG4iKTsKKwkJCWluc3RhbmNlLT5zdGF0dXMgPSBhb19zdGF0dXNfc3RyZWFtX2Vycm9yOworCQkJLy8gU2lnbmFsIHRoZSBlbmQuCisJCQlzaWduYWxpbmcgPSAxOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoIShzdGF0dXMgJiBNRTYwMDBfQU9fU1RBVFVTX0JJVF9GU00pKSB7CS8vIFN0YXRlIG1hY2hpbmUgaXMgbm90IHdvcmtpbmcuIFdhaXRpbmcgZm9yIHN0b3AgZmluaXNoLgorCQkJaW5zdGFuY2UtPnN0YXR1cyA9IGFvX3N0YXR1c19zdHJlYW1fZW5kOworCQkJc2lnbmFsaW5nID0gMTsKKwkJfQorCQkvLyBTdGF0ZSBtYWNoaW5lIGlzIHdvcmtpbmcuCisJCXJlc2NoZWR1bGUgPSAxOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCVBFUlJPUl9DUklUSUNBTCgiU3RhdHVzIGlzIGluIHdyb25nIHN0YXRlICglZCkhXG4iLAorCQkJCWluc3RhbmNlLT5zdGF0dXMpOworCQlpbnN0YW5jZS0+c3RhdHVzID0gYW9fc3RhdHVzX3N0cmVhbV9lcnJvcjsKKwkJLy8gU2lnbmFsIHRoZSBlbmQuCisJCXNpZ25hbGluZyA9IDE7CisJCWJyZWFrOworCisJfQorCisJaWYgKHNpZ25hbGluZykgewkvL1NpZ25hbCBpdC4KKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlX2FsbCgmaW5zdGFuY2UtPndhaXRfcXVldWUpOworCX0KKworCWlmIChpbnN0YW5jZS0+YW9fY29udHJvbF90YXNrX2ZsYWcgJiYgcmVzY2hlZHVsZSkgewkvLyBSZXNjaGVkdWxlIHRhc2sKKwkJcXVldWVfZGVsYXllZF93b3JrKGluc3RhbmNlLT5tZTYwMDBfd29ya3F1ZXVlLAorCQkJCSAgICZpbnN0YW5jZS0+YW9fY29udHJvbF90YXNrLCAxKTsKKwl9IGVsc2UgeworCQlQSU5GTygiPCVzPiBFbmRpbmcgY29udHJvbCB0YXNrLlxuIiwgX19mdW5jX18pOworCX0KKworfQorCitzdGF0aWMgaW50IG1lNjAwMF9hb19xdWVyeV9yYW5nZV9ieV9taW5fbWF4KG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQkgICAgaW50IHVuaXQsCisJCQkJCSAgICBpbnQgKm1pbiwKKwkJCQkJICAgIGludCAqbWF4LCBpbnQgKm1heGRhdGEsIGludCAqcmFuZ2UpCit7CisJbWU2MDAwX2FvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKworCWluc3RhbmNlID0gKG1lNjAwMF9hb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlQREVCVUcoImV4ZWN1dGVkLiBpZHg9JWRcbiIsIGluc3RhbmNlLT5hb19pZHgpOworCisJaWYgKCgqbWF4IC0gKm1pbikgPCAwKSB7CisJCVBFUlJPUigiSW52YWxpZCBtaW5pbXVtIGFuZCBtYXhpbXVtIHZhbHVlcyBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfTUlOX01BWDsKKwl9CisKKwlpZiAoKHVuaXQgPT0gTUVfVU5JVF9WT0xUKSB8fCAodW5pdCA9PSBNRV9VTklUX0FOWSkpIHsKKwkJaWYgKCgqbWF4IDw9IChpbnN0YW5jZS0+bWF4ICsgMTAwMCkpICYmICgqbWluID49IGluc3RhbmNlLT5taW4pKSB7CisJCQkqbWluID0gaW5zdGFuY2UtPm1pbjsKKwkJCSptYXggPSBpbnN0YW5jZS0+bWF4OworCQkJKm1heGRhdGEgPSBNRTYwMDBfQU9fTUFYX0RBVEE7CisJCQkqcmFuZ2UgPSAwOworCQl9IGVsc2UgeworCQkJUEVSUk9SKCJObyBtYXRjaGluZyByYW5nZSBhdmFpbGFibGUuXG4iKTsKKwkJCXJldHVybiBNRV9FUlJOT19OT19SQU5HRTsKKwkJfQorCX0gZWxzZSB7CisJCVBFUlJPUigiSW52YWxpZCBwaHlzaWNhbCB1bml0IHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9VTklUOworCX0KKworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lNjAwMF9hb19xdWVyeV9udW1iZXJfcmFuZ2VzKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQkgaW50IHVuaXQsIGludCAqY291bnQpCit7CisJbWU2MDAwX2FvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKworCWluc3RhbmNlID0gKG1lNjAwMF9hb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlQREVCVUcoImV4ZWN1dGVkLiBpZHg9JWRcbiIsIGluc3RhbmNlLT5hb19pZHgpOworCisJaWYgKCh1bml0ID09IE1FX1VOSVRfVk9MVCkgfHwgKHVuaXQgPT0gTUVfVU5JVF9BTlkpKSB7CisJCSpjb3VudCA9IDE7CisJfSBlbHNlIHsKKwkJKmNvdW50ID0gMDsKKwl9CisKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZTYwMDBfYW9fcXVlcnlfcmFuZ2VfaW5mbyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgICBpbnQgcmFuZ2UsCisJCQkJICAgICAgaW50ICp1bml0LAorCQkJCSAgICAgIGludCAqbWluLCBpbnQgKm1heCwgaW50ICptYXhkYXRhKQoreworCW1lNjAwMF9hb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisKKwlpbnN0YW5jZSA9IChtZTYwMDBfYW9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJUERFQlVHKCJleGVjdXRlZC4gaWR4PSVkXG4iLCBpbnN0YW5jZS0+YW9faWR4KTsKKworCWlmIChyYW5nZSA9PSAwKSB7CisJCSp1bml0ID0gTUVfVU5JVF9WT0xUOworCQkqbWluID0gaW5zdGFuY2UtPm1pbjsKKwkJKm1heCA9IGluc3RhbmNlLT5tYXg7CisJCSptYXhkYXRhID0gTUU2MDAwX0FPX01BWF9EQVRBOworCX0gZWxzZSB7CisJCVBFUlJPUigiSW52YWxpZCByYW5nZSBudW1iZXIgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1JBTkdFOworCX0KKworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lNjAwMF9hb19xdWVyeV90aW1lcihtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgaW50IHRpbWVyLAorCQkJCSBpbnQgKmJhc2VfZnJlcXVlbmN5LAorCQkJCSBsb25nIGxvbmcgKm1pbl90aWNrcywgbG9uZyBsb25nICptYXhfdGlja3MpCit7CisJbWU2MDAwX2FvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKworCWluc3RhbmNlID0gKG1lNjAwMF9hb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlQREVCVUcoImV4ZWN1dGVkLiBpZHg9JWRcbiIsIGluc3RhbmNlLT5hb19pZHgpOworCisJaWYgKGluc3RhbmNlLT5maWZvKSB7CS8vU3RyZWFtaW5nIGRldmljZS4KKwkJKmJhc2VfZnJlcXVlbmN5ID0gTUU2MDAwX0FPX0JBU0VfRlJFUVVFTkNZOworCQlpZiAodGltZXIgPT0gTUVfVElNRVJfQUNRX1NUQVJUKSB7CisJCQkqbWluX3RpY2tzID0gTUU2MDAwX0FPX01JTl9BQ1FfVElDS1M7CisJCQkqbWF4X3RpY2tzID0gTUU2MDAwX0FPX01BWF9BQ1FfVElDS1M7CisJCX0gZWxzZSBpZiAodGltZXIgPT0gTUVfVElNRVJfQ09OVl9TVEFSVCkgeworCQkJKm1pbl90aWNrcyA9IE1FNjAwMF9BT19NSU5fQ0hBTl9USUNLUzsKKwkJCSptYXhfdGlja3MgPSBNRTYwMDBfQU9fTUFYX0NIQU5fVElDS1M7CisJCX0KKwl9IGVsc2UgewkJLy9Ob3Qgc3RyZWFtaW5nIGRldmljZSEKKwkJKmJhc2VfZnJlcXVlbmN5ID0gMDsKKwkJKm1pbl90aWNrcyA9IDA7CisJCSptYXhfdGlja3MgPSAwOworCX0KKworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lNjAwMF9hb19xdWVyeV9udW1iZXJfY2hhbm5lbHMobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJCSAgIGludCAqbnVtYmVyKQoreworCW1lNjAwMF9hb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJaW5zdGFuY2UgPSAobWU2MDAwX2FvX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCVBERUJVRygiZXhlY3V0ZWQuIGlkeD0lZFxuIiwgaW5zdGFuY2UtPmFvX2lkeCk7CisKKwkqbnVtYmVyID0gMTsKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZTYwMDBfYW9fcXVlcnlfc3ViZGV2aWNlX3R5cGUobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJCSAgaW50ICp0eXBlLCBpbnQgKnN1YnR5cGUpCit7CisJbWU2MDAwX2FvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKworCWluc3RhbmNlID0gKG1lNjAwMF9hb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlQREVCVUcoImV4ZWN1dGVkLiBpZHg9JWRcbiIsIGluc3RhbmNlLT5hb19pZHgpOworCisJKnR5cGUgPSBNRV9UWVBFX0FPOworCSpzdWJ0eXBlID0KKwkgICAgKGluc3RhbmNlLT4KKwkgICAgIGZpZm8gJiBNRTYwMDBfQU9fSEFTX0ZJRk8pID8gTUVfU1VCVFlQRV9TVFJFQU1JTkcgOgorCSAgICBNRV9TVUJUWVBFX1NJTkdMRTsKKworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lNjAwMF9hb19xdWVyeV9zdWJkZXZpY2VfY2FwcyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwgaW50ICpjYXBzKQoreworCW1lNjAwMF9hb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJaW5zdGFuY2UgPSAobWU2MDAwX2FvX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCVBERUJVRygiZXhlY3V0ZWQuIGlkeD0lZFxuIiwgaW5zdGFuY2UtPmFvX2lkeCk7CisKKwkqY2FwcyA9CisJICAgIE1FX0NBUFNfQU9fVFJJR19TWU5DSFJPTk9VUyB8ICgoaW5zdGFuY2UtPmZpZm8pID8gTUVfQ0FQU19BT19GSUZPIDoKKwkJCQkJICAgTUVfQ0FQU19OT05FKTsKKworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lNjAwMF9hb19xdWVyeV9zdWJkZXZpY2VfY2Fwc19hcmdzKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSwKKwkJCQkJICAgICAgIGludCBjYXAsIGludCAqYXJncywgaW50IGNvdW50KQoreworCW1lNjAwMF9hb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisKKwlpbnN0YW5jZSA9IChtZTYwMDBfYW9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJUERFQlVHKCJleGVjdXRlZC4gaWR4PSVkXG4iLCBpbnN0YW5jZS0+YW9faWR4KTsKKworCWlmIChjb3VudCAhPSAxKSB7CisJCVBFUlJPUigiSW52YWxpZCBjYXBhYmlsaXR5IGFyZ3VtZW50IGNvdW50LlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0NBUF9BUkdfQ09VTlQ7CisJfQorCisJc3dpdGNoIChjYXApIHsKKwljYXNlIE1FX0NBUF9BSV9GSUZPX1NJWkU6CisJCWFyZ3NbMF0gPSAoaW5zdGFuY2UtPmZpZm8pID8gTUU2MDAwX0FPX0ZJRk9fQ09VTlQgOiAwOworCQlicmVhazsKKworCWNhc2UgTUVfQ0FQX0FJX0JVRkZFUl9TSVpFOgorCQlhcmdzWzBdID0KKwkJICAgIChpbnN0YW5jZS0+Y2lyY19idWYuYnVmKSA/IE1FNjAwMF9BT19DSVJDX0JVRl9DT1VOVCA6IDA7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJUEVSUk9SKCJJbnZhbGlkIGNhcGFiaWxpdHkuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DQVA7CisJCWFyZ3NbMF0gPSAwOworCX0KKworCXJldHVybiBlcnI7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU2MDAwX2FvLmggYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU2MDAwX2FvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTYyOTY0OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTYwMDBfYW8uaApAQCAtMCwwICsxLDIwMCBAQAorLyoqCisgKiBAZmlsZSBtZTYwMDBfYW8uaAorICoKKyAqIEBicmllZiBNZWlsaGF1cyBNRS02MDAwIGFuYWxvZyBvdXRwdXQgc3ViZGV2aWNlIGNsYXNzLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX01FNjAwMF9BT19IXworI2RlZmluZSBfTUU2MDAwX0FPX0hfCisKKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSAibWVzdWJkZXZpY2UuaCIKKyNpbmNsdWRlICJtZWNpcmNfYnVmLmgiCisjaW5jbHVkZSAibWVpb2N0bC5oIgorCisjaWZkZWYgX19LRVJORUxfXworCisjZGVmaW5lIE1FNjAwMF9BT19NQVhfU1VCREVWSUNFUwkxNgorI2RlZmluZSBNRTYwMDBfQU9fRklGT19DT1VOVAkJODE5MgorCisjZGVmaW5lIE1FNjAwMF9BT19CQVNFX0ZSRVFVRU5DWQkzMzAwMDAwMEwKKworI2RlZmluZSBNRTYwMDBfQU9fTUlOX0FDUV9USUNLUwkJMExMCisjZGVmaW5lIE1FNjAwMF9BT19NQVhfQUNRX1RJQ0tTCQkwTEwKKworI2RlZmluZSBNRTYwMDBfQU9fTUlOX0NIQU5fVElDS1MJNjZMTAorI2RlZmluZSBNRTYwMDBfQU9fTUFYX0NIQU5fVElDS1MJMHhGRkZGRkZGRkxMCisKKyNkZWZpbmUgTUU2MDAwX0FPX01JTl9SQU5HRQkJCS0xMDAwMDAwMAorI2RlZmluZSBNRTYwMDBfQU9fTUFYX1JBTkdFCQkJOTk5OTY5NAorCisjZGVmaW5lIE1FNjAwMF9BT19NSU5fUkFOR0VfSElHSAkwCisjZGVmaW5lIE1FNjAwMF9BT19NQVhfUkFOR0VfSElHSAk0OTk5OTIzNworCisjZGVmaW5lIE1FNjAwMF9BT19NQVhfREFUQQkJCTB4RkZGRgorCisjaWZkZWYgTUVfU1lOQVBTRQorIyBkZWZpbmUgTUU2MDAwX0FPX0NJUkNfQlVGX1NJWkVfT1JERVIgCQk4CS8vIDJebiBQQUdFUyA9Pj4gTWF4aW11bSB2YWx1ZSBvZiAxTUIgZm9yIFN5bmFwc2UKKyNlbHNlCisjIGRlZmluZSBNRTYwMDBfQU9fQ0lSQ19CVUZfU0laRV9PUkRFUiAJCTUJLy8gMl5uIFBBR0VTID0+PiAxMjhLQgorI2VuZGlmCisjZGVmaW5lIE1FNjAwMF9BT19DSVJDX0JVRl9TSVpFIAkJUEFHRV9TSVpFPDxNRTYwMDBfQU9fQ0lSQ19CVUZfU0laRV9PUkRFUgkvLyBCdWZmZXIgc2l6ZSBpbiBieXRlcy4KKworIyAgaWZkZWYgX0NCVUZGXzMyYl90CisjICAgZGVmaW5lIE1FNjAwMF9BT19DSVJDX0JVRl9DT1VOVAkoKE1FNjAwMF9BT19DSVJDX0JVRl9TSVpFKSAvIHNpemVvZih1aW50MzJfdCkpCS8vIFNpemUgaW4gdmFsdWVzCisjICBlbHNlCisjICAgZGVmaW5lIE1FNjAwMF9BT19DSVJDX0JVRl9DT1VOVAkoKE1FNjAwMF9BT19DSVJDX0JVRl9TSVpFKSAvIHNpemVvZih1aW50MTZfdCkpCS8vIFNpemUgaW4gdmFsdWVzCisjICBlbmRpZgorCisjICBkZWZpbmUgTUU2MDAwX0FPX0NPTlRJTk9VUwkJCQkJMHgwCisjICBkZWZpbmUgTUU2MDAwX0FPX1dSQVBfTU9ERQkJCQkJMHgxCisjICBkZWZpbmUgTUU2MDAwX0FPX0hXX01PREUJCQkJCQkweDIKKworIyAgZGVmaW5lIE1FNjAwMF9BT19IV19XUkFQX01PREUJCQkJKE1FNjAwMF9BT19XUkFQX01PREUgfCBNRTYwMDBfQU9fSFdfTU9ERSkKKyMgIGRlZmluZSBNRTYwMDBfQU9fU1dfV1JBUF9NT0RFCQkJCU1FNjAwMF9BT19XUkFQX01PREUKKworIyAgZGVmaW5lIE1FNjAwMF9BT19JTkZfU1RPUF9NT0RFCQkJCTB4MAorIyAgZGVmaW5lIE1FNjAwMF9BT19BQ1FfU1RPUF9NT0RFCQkJCTB4MQorIyAgZGVmaW5lIE1FNjAwMF9BT19TQ0FOX1NUT1BfTU9ERQkJCQkweDIKKworIyAgZGVmaW5lIE1FNjAwMF9BT19FWFRSQV9IQVJEV0FSRQkJCQkweDEKKyMgIGRlZmluZSBNRTYwMDBfQU9fSEFTX0ZJRk8JCQkJCTB4MgorCit0eXBlZGVmIGVudW0gTUU2MDAwX0FPX1NUQVRVUyB7CisJYW9fc3RhdHVzX25vbmUgPSAwLAorCWFvX3N0YXR1c19zaW5nbGVfY29uZmlndXJlZCwKKwlhb19zdGF0dXNfc2luZ2xlX3J1bl93YWl0LAorCWFvX3N0YXR1c19zaW5nbGVfcnVuLAorCWFvX3N0YXR1c19zaW5nbGVfZW5kX3dhaXQsCisJYW9fc3RhdHVzX3NpbmdsZV9lbmQsCisJYW9fc3RhdHVzX3N0cmVhbV9jb25maWd1cmVkLAorCWFvX3N0YXR1c19zdHJlYW1fcnVuX3dhaXQsCisJYW9fc3RhdHVzX3N0cmVhbV9ydW4sCisJYW9fc3RhdHVzX3N0cmVhbV9lbmRfd2FpdCwKKwlhb19zdGF0dXNfc3RyZWFtX2VuZCwKKwlhb19zdGF0dXNfc3RyZWFtX2ZpZm9fZXJyb3IsCisJYW9fc3RhdHVzX3N0cmVhbV9idWZmZXJfZXJyb3IsCisJYW9fc3RhdHVzX3N0cmVhbV9lcnJvciwKKwlhb19zdGF0dXNfbGFzdAorfSBNRTYwMDBfQU9fU1RBVFVTOworCit0eXBlZGVmIHN0cnVjdCBtZTYwMDBfYW9fdGltZW91dCB7CisJdW5zaWduZWQgbG9uZyBzdGFydF90aW1lOworCXVuc2lnbmVkIGxvbmcgZGVsYXk7Cit9IG1lNjAwMF9hb190aW1lb3V0X3Q7CisKKy8qKgorICogQGJyaWVmIFRoZSBNRS02MDAwIGFuYWxvZyBvdXRwdXQgc3ViZGV2aWNlIGNsYXNzLgorICovCit0eXBlZGVmIHN0cnVjdCBtZTYwMDBfYW9fc3ViZGV2aWNlIHsKKwkvKiBJbmhlcml0YW5jZSAqLworCW1lX3N1YmRldmljZV90IGJhc2U7CQkJCQkvKio8IFRoZSBzdWJkZXZpY2UgYmFzZSBjbGFzcy4gKi8KKwl1bnNpZ25lZCBpbnQgYW9faWR4OworCisJLyogQXR0cmlidXRlcyAqLworCXNwaW5sb2NrX3Qgc3ViZGV2aWNlX2xvY2s7CQkJCS8qKjwgU3BpbiBsb2NrIHRvIHByb3RlY3QgdGhlIHN1YmRldmljZSBmcm9tIGNvbmN1cnJlbnQgYWNjZXNzLiAqLworCXNwaW5sb2NrX3QgKnByZWxvYWRfcmVnX2xvY2s7CQkJLyoqPCBTcGluIGxvY2sgdG8gcHJvdGVjdCBwcmVsb2FkX3JlZyBmcm9tIGNvbmN1cnJlbnQgYWNjZXNzLiAqLworCisJdWludDMyX3QgKnByZWxvYWRfZmxhZ3M7CisJdWludDMyX3QgKnRyaWdnZXJpbmdfZmxhZ3M7CisKKwkvKiBIYXJkd2FyZSBmZWF1dHJlcyAqLworCXVuc2lnbmVkIGludCBpcnE7CQkJCQkJLyoqPCBUaGUgaW50ZXJydXB0IHJlcXVlc3QgbnVtYmVyIGFzc2lnbmVkIGJ5IHRoZSBQQ0kgQklPUy4gKi8KKwlpbnQgZmlmbzsJCQkJCQkJCS8qKjwgSWYgc2V0IHRoaXMgZGV2aWNlIGhhcyBhIEZJRk8uICovCisKKwkvL1JhbmdlCisJaW50IG1pbjsKKwlpbnQgbWF4OworCisJaW50IHNpbmdsZV92YWx1ZTsJCQkJCQkvKio8IE1pcnJvciBvZiB0aGUgb3V0cHV0IHZhbHVlIGluIHNpbmdsZSBtb2RlLiAqLworCWludCBzaW5nbGVfdmFsdWVfaW5fZmlmbzsJCQkJLyoqPCBNaXJyb3Igb2YgdGhlIHZhbHVlIHdyaXR0ZW4gaW4gc2luZ2xlIG1vZGUuICovCisJdWludDMyX3QgY3RybF90cmc7CQkJCQkJLyoqPCBNaXJyb3Igb2YgdGhlIHRyaWdnZXIgc2V0dGluZ3MuICovCisKKwl2b2xhdGlsZSBpbnQgbW9kZTsJCQkJCQkvKio8IEZsYWdzIHVzZWQgZm9yIHN0b3JpbmcgU1cgd3JhcGFyb3VuZCBzZXR1cCovCisJaW50IHN0b3BfbW9kZTsJCQkJCQkJLyoqPCBUaGUgdXNlciBkZWZpbmVkIHN0b3AgY29uZGl0aW9uIGZsYWcuICovCisJdW5zaWduZWQgaW50IHN0YXJ0X21vZGU7CisJdW5zaWduZWQgaW50IHN0b3BfY291bnQ7CQkJCS8qKjwgVGhlIHVzZXIgZGVmaW5lZCBkYXRlcyBwcmVzZW50YXRpb24gZW5kIGNvdW50LiAqLworCXVuc2lnbmVkIGludCBzdG9wX2RhdGFfY291bnQ7CQkJLyoqPCBUaGUgc3RvcCBwcmVzZW50YXRpb24gY291bnQuICovCisJdW5zaWduZWQgaW50IGRhdGFfY291bnQ7CQkJCS8qKjwgVGhlIHJlYWwgcHJlc2VudGF0aW9uIGNvdW50LiAqLworCXVuc2lnbmVkIGludCBwcmVsb2FkZWRfY291bnQ7CQkJLyoqPCBUaGUgbmV4dCBkYXRhIGFkZHJlcyBpbiBidWZmZXIuIDw9IGZvciB3cmFwYXJvdW5kIG1vZGUuICovCisJaW50IGhhcmR3YXJlX3N0b3BfZGVsYXk7CQkJCS8qKjwgVGhlIHRpbWUgdGhhdCBzdG9wIGNhbiB0YWtlLiBUaGlzIGlzIG9ubHkgdG8gbm90IHNob3cgaGFyZHdhcmUgYnVnIHRvIHVzZXIuICovCisKKwl2b2xhdGlsZSBlbnVtIE1FNjAwMF9BT19TVEFUVVMgc3RhdHVzOwkvKio8IFRoZSBjdXJyZW50IHN0cmVhbSBzdGF0dXMgZmxhZy4gKi8KKwltZTYwMDBfYW9fdGltZW91dF90IHRpbWVvdXQ7CQkJLyoqPCBUaGUgdGltZW91dCBmb3Igc3RhcnQgaW4gYmxvY2tpbmcgYW5kIG5vbi1ibG9ja2luZyBtb2RlLiAqLworCisJCQkJCQkJCQkvKiBSZWdpc3RlcnMgKi8vKio8IEFsbCByZWdpc3RlcnMgYXJlIDMyIGJpdHMgbG9uZy4gKi8KKwl1bnNpZ25lZCBsb25nIGN0cmxfcmVnOworCXVuc2lnbmVkIGxvbmcgc3RhdHVzX3JlZzsKKwl1bnNpZ25lZCBsb25nIGZpZm9fcmVnOworCXVuc2lnbmVkIGxvbmcgc2luZ2xlX3JlZzsKKwl1bnNpZ25lZCBsb25nIHRpbWVyX3JlZzsKKwl1bnNpZ25lZCBsb25nIGlycV9zdGF0dXNfcmVnOworCXVuc2lnbmVkIGxvbmcgcHJlbG9hZF9yZWc7CisJdW5zaWduZWQgbG9uZyBpcnFfcmVzZXRfcmVnOworI2lmZGVmIE1FREVCVUdfREVCVUdfUkVHCisJdW5zaWduZWQgbG9uZyByZWdfYmFzZTsKKyNlbmRpZgorCisJLyogU29mdHdhcmUgYnVmZmVyICovCisJbWVfY2lyY19idWZfdCBjaXJjX2J1ZjsJCQkJCS8qKjwgQ2lyY3VsYXIgYnVmZmVyIGhvbGRpbmcgbWVhc3VybWVudCBkYXRhLiAqLworCXdhaXRfcXVldWVfaGVhZF90IHdhaXRfcXVldWU7CQkJLyoqPCBXYWl0IHF1ZXVlIHRvIHB1dCBvbiB0YXNrcyB3YWl0aW5nIGZvciBkYXRhIHRvIGFycml2ZS4gKi8KKworCXN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICptZTYwMDBfd29ya3F1ZXVlOworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwyMCkKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgYW9fY29udHJvbF90YXNrOworI2Vsc2UKKwlzdHJ1Y3QgZGVsYXllZF93b3JrIGFvX2NvbnRyb2xfdGFzazsKKyNlbmRpZgorCisJdm9sYXRpbGUgaW50IGFvX2NvbnRyb2xfdGFza19mbGFnOwkJLyoqPCBGbGFnIGNvbnRyb2xpbmcgcmVleGVjdXRpbmcgb2YgY29udHJvbCB0YXNrICovCisKK30gbWU2MDAwX2FvX3N1YmRldmljZV90OworCisvKioKKyAqIEBicmllZiBUaGUgY29uc3RydWN0b3IgdG8gZ2VuZXJhdGUgYSBNRS02MDAwIGFuYWxvZyBvdXRwdXQgc3ViZGV2aWNlIGluc3RhbmNlLgorICoKKyAqIEBwYXJhbSByZWdfYmFzZSBUaGUgcmVnaXN0ZXIgYmFzZSBhZGRyZXNzIG9mIHRoZSBkZXZpY2UgYXMgcmV0dXJuZWQgYnkgdGhlIFBDSSBCSU9TLgorICogQHBhcmFtIGN0cmxfcmVnX2xvY2sgUG9pbnRlciB0byBzcGluIGxvY2sgcHJvdGVjdGluZyB0aGUgY29udHJvbCByZWdpc3RlciBmcm9tIGNvbmN1cnJlbnQgYWNjZXNzLgorICogQHBhcmFtIHByZWxvYWRfZmxhZ3MgUG9pbnRlciB0byBzcGluIGxvY2sgcHJvdGVjdGluZyB0aGUgaG9sZCZ0cmlnZ2VyIHJlZ2lzdGVyIGZyb20gY29uY3VycmVudCBhY2Nlc3MuCisgKiBAcGFyYW0gYW9faWR4IFN1YmRldmljZSBudW1iZXIuCisgKiBAcGFyYW0gZmlmbyBGbGFnIHNldCBpZiBzdWJkZXZpY2UgaGFzIGhhcmR3YXJlIEZJRk8uCisgKiBAcGFyYW0gaXJxIElSUSBudW1iZXIuCisgKiBAcGFyYW0gaGlnaF9yYW5nZSBGbGFnIHNldCBpZiBzdWJkZXZpY2UgaGFzIGhpZ2ggY3VycmVuIG91dHB1dC4KKyAqIEBwYXJhbSBtZTYwMDBfd3EgUXVldWUgZm9yIGFzeW5jaHJvbm91cyB0YXNrICgxIHF1ZXVlIGZvciBhbGwgc3ViZGV2aWNlIG9uIDEgYm9hcmQpLgorICoKKyAqIEByZXR1cm4gUG9pbnRlciB0byBuZXcgaW5zdGFuY2Ugb24gc3VjY2Vzcy5cbgorICogTlVMTCBvbiBlcnJvci4KKyAqLworbWU2MDAwX2FvX3N1YmRldmljZV90ICptZTYwMDBfYW9fY29uc3RydWN0b3IodWludDMyX3QgcmVnX2Jhc2UsCisJCQkJCSAgICAgc3BpbmxvY2tfdCAqIHByZWxvYWRfcmVnX2xvY2ssCisJCQkJCSAgICAgdWludDMyX3QgKiBwcmVsb2FkX2ZsYWdzLAorCQkJCQkgICAgIHVpbnQzMl90ICogdHJpZ2dlcmluZ19mbGFncywKKwkJCQkJICAgICBpbnQgYW9faWR4LAorCQkJCQkgICAgIGludCBmaWZvLAorCQkJCQkgICAgIGludCBpcnEsCisJCQkJCSAgICAgaW50IGhpZ2hfcmFuZ2UsCisJCQkJCSAgICAgc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QKKwkJCQkJICAgICAqbWU2MDAwX3dxKTsKKworI2VuZGlmIC8vX19LRVJORUxfXworI2VuZGlmIC8vX01FNjAwMF9BT19IXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lNjAwMF9hb19yZWcuaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTYwMDBfYW9fcmVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWI4ZjQ2ZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTYwMDBfYW9fcmVnLmgKQEAgLTAsMCArMSwxNzcgQEAKKy8qKgorICogQGZpbGUgbWU2MDAwX2FvX3JlZy5oCisgKgorICogQGJyaWVmIE1FLTYwMDAgYW5hbG9nIG91dHB1dCBzdWJkZXZpY2UgcmVnaXN0ZXIgZGVmaW5pdGlvbnMuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfTUU2MDAwX0FPX1JFR19IXworI2RlZmluZSBfTUU2MDAwX0FPX1JFR19IXworCisjaWZkZWYgX19LRVJORUxfXworCisvLyBBTworI2RlZmluZSBNRTYwMDBfQU9fMDBfQ1RSTF9SRUcJCQkJCTB4MDAJLy8gUi9XCisjZGVmaW5lIE1FNjAwMF9BT18wMF9TVEFUVVNfUkVHCQkJCQkweDA0CS8vIFIvXworI2RlZmluZSBNRTYwMDBfQU9fMDBfRklGT19SRUcJCQkJCTB4MDgJLy8gXy9XCisjZGVmaW5lIE1FNjAwMF9BT18wMF9TSU5HTEVfUkVHCQkJCQkweDBDCS8vIFIvVworI2RlZmluZSBNRTYwMDBfQU9fMDBfVElNRVJfUkVHCQkJCQkweDEwCS8vIF8vVworCisjZGVmaW5lIE1FNjAwMF9BT18wMV9DVFJMX1JFRwkJCQkJMHgxOAkvLyBSL1cKKyNkZWZpbmUgTUU2MDAwX0FPXzAxX1NUQVRVU19SRUcJCQkJCTB4MUMJLy8gUi9fCisjZGVmaW5lIE1FNjAwMF9BT18wMV9GSUZPX1JFRwkJCQkJMHgyMAkvLyBfL1cKKyNkZWZpbmUgTUU2MDAwX0FPXzAxX1NJTkdMRV9SRUcJCQkJCTB4MjQJLy8gUi9XCisjZGVmaW5lIE1FNjAwMF9BT18wMV9USU1FUl9SRUcJCQkJCTB4MjgJLy8gXy9XCisKKyNkZWZpbmUgTUU2MDAwX0FPXzAyX0NUUkxfUkVHCQkJCQkweDMwCS8vIFIvVworI2RlZmluZSBNRTYwMDBfQU9fMDJfU1RBVFVTX1JFRwkJCQkJMHgzNAkvLyBSL18KKyNkZWZpbmUgTUU2MDAwX0FPXzAyX0ZJRk9fUkVHCQkJCQkweDM4CS8vIF8vVworI2RlZmluZSBNRTYwMDBfQU9fMDJfU0lOR0xFX1JFRwkJCQkJMHgzQwkvLyBSL1cKKyNkZWZpbmUgTUU2MDAwX0FPXzAyX1RJTUVSX1JFRwkJCQkJMHg0MAkvLyBfL1cKKworI2RlZmluZSBNRTYwMDBfQU9fMDNfQ1RSTF9SRUcJCQkJCTB4NDgJLy8gUi9XCisjZGVmaW5lIE1FNjAwMF9BT18wM19TVEFUVVNfUkVHCQkJCQkweDRDCS8vIFIvXworI2RlZmluZSBNRTYwMDBfQU9fMDNfRklGT19SRUcJCQkJCTB4NTAJLy8gXy9XCisjZGVmaW5lIE1FNjAwMF9BT18wM19TSU5HTEVfUkVHCQkJCQkweDU0CS8vIFIvVworI2RlZmluZSBNRTYwMDBfQU9fMDNfVElNRVJfUkVHCQkJCQkweDU4CS8vIF8vVworCisjZGVmaW5lIE1FNjAwMF9BT19TSU5HTEVfU1RBVFVTX1JFRwkJCQkweEE0CS8vIFIvXworI2RlZmluZSBNRTYwMDBfQU9fU0lOR0xFX1NUQVRVU19PRkZTRVQJCQk0CS8vVGhlIGZpcnN0IHNpbmdsZSBzdWJkZXZpY2UgPT4gYml0IDAgaW4gTUU2MDAwX0FPX1NJTkdMRV9TVEFUVVNfUkVHLgorCisjZGVmaW5lIE1FNjAwMF9BT18wNF9TVEFUVVNfUkVHCQkJCQlNRTYwMDBfQU9fU0lOR0xFX1NUQVRVU19SRUcKKyNkZWZpbmUgTUU2MDAwX0FPXzA0X1NJTkdMRV9SRUcJCQkJCTB4NzQJLy8gXy9XCisKKyNkZWZpbmUgTUU2MDAwX0FPXzA1X1NUQVRVU19SRUcJCQkJCU1FNjAwMF9BT19TSU5HTEVfU1RBVFVTX1JFRworI2RlZmluZSBNRTYwMDBfQU9fMDVfU0lOR0xFX1JFRwkJCQkJMHg3OAkvLyBfL1cKKworI2RlZmluZSBNRTYwMDBfQU9fMDZfU1RBVFVTX1JFRwkJCQkJTUU2MDAwX0FPX1NJTkdMRV9TVEFUVVNfUkVHCisjZGVmaW5lIE1FNjAwMF9BT18wNl9TSU5HTEVfUkVHCQkJCQkweDdDCS8vIF8vVworCisjZGVmaW5lIE1FNjAwMF9BT18wN19TVEFUVVNfUkVHCQkJCQlNRTYwMDBfQU9fU0lOR0xFX1NUQVRVU19SRUcKKyNkZWZpbmUgTUU2MDAwX0FPXzA3X1NJTkdMRV9SRUcJCQkJCTB4ODAJLy8gXy9XCisKKyNkZWZpbmUgTUU2MDAwX0FPXzA4X1NUQVRVU19SRUcJCQkJCU1FNjAwMF9BT19TSU5HTEVfU1RBVFVTX1JFRworI2RlZmluZSBNRTYwMDBfQU9fMDhfU0lOR0xFX1JFRwkJCQkJMHg4NAkvLyBfL1cKKworI2RlZmluZSBNRTYwMDBfQU9fMDlfU1RBVFVTX1JFRwkJCQkJTUU2MDAwX0FPX1NJTkdMRV9TVEFUVVNfUkVHCisjZGVmaW5lIE1FNjAwMF9BT18wOV9TSU5HTEVfUkVHCQkJCQkweDg4CS8vIF8vVworCisjZGVmaW5lIE1FNjAwMF9BT18xMF9TVEFUVVNfUkVHCQkJCQlNRTYwMDBfQU9fU0lOR0xFX1NUQVRVU19SRUcKKyNkZWZpbmUgTUU2MDAwX0FPXzEwX1NJTkdMRV9SRUcJCQkJCTB4OEMJLy8gXy9XCisKKyNkZWZpbmUgTUU2MDAwX0FPXzExX1NUQVRVU19SRUcJCQkJCU1FNjAwMF9BT19TSU5HTEVfU1RBVFVTX1JFRworI2RlZmluZSBNRTYwMDBfQU9fMTFfU0lOR0xFX1JFRwkJCQkJMHg5MAkvLyBfL1cKKworI2RlZmluZSBNRTYwMDBfQU9fMTJfU1RBVFVTX1JFRwkJCQkJTUU2MDAwX0FPX1NJTkdMRV9TVEFUVVNfUkVHCisjZGVmaW5lIE1FNjAwMF9BT18xMl9TSU5HTEVfUkVHCQkJCQkweDk0CS8vIF8vVworCisjZGVmaW5lIE1FNjAwMF9BT18xM19TVEFUVVNfUkVHCQkJCQlNRTYwMDBfQU9fU0lOR0xFX1NUQVRVU19SRUcKKyNkZWZpbmUgTUU2MDAwX0FPXzEzX1NJTkdMRV9SRUcJCQkJCTB4OTgJLy8gXy9XCisKKyNkZWZpbmUgTUU2MDAwX0FPXzE0X1NUQVRVU19SRUcJCQkJCU1FNjAwMF9BT19TSU5HTEVfU1RBVFVTX1JFRworI2RlZmluZSBNRTYwMDBfQU9fMTRfU0lOR0xFX1JFRwkJCQkJMHg5QwkvLyBfL1cKKworI2RlZmluZSBNRTYwMDBfQU9fMTVfU1RBVFVTX1JFRwkJCQkJTUU2MDAwX0FPX1NJTkdMRV9TVEFUVVNfUkVHCisjZGVmaW5lIE1FNjAwMF9BT18xNV9TSU5HTEVfUkVHCQkJCQkweEEwCS8vIF8vVworCisvL01FNjAwMF9BT19DVFJMX1JFRworI2RlZmluZSBNRTYwMDBfQU9fTU9ERV9TSU5HTEUJCQkJCTB4MDAKKyNkZWZpbmUgTUU2MDAwX0FPX01PREVfV1JBUEFST1VORAkJCQkweDAxCisjZGVmaW5lIE1FNjAwMF9BT19NT0RFX0NPTlRJTlVPVVMJCQkJMHgwMgorI2RlZmluZSBNRTYwMDBfQU9fQ1RSTF9NT0RFX01BU0sJCQkJKE1FNjAwMF9BT19NT0RFX1dSQVBBUk9VTkQgfCBNRTYwMDBfQU9fTU9ERV9DT05USU5VT1VTKQorCisjZGVmaW5lIE1FNjAwMF9BT19DVFJMX0JJVF9NT0RFX1dSQVBBUk9VTkQJCTB4MDAxCisjZGVmaW5lIE1FNjAwMF9BT19DVFJMX0JJVF9NT0RFX0NPTlRJTlVPVVMJCTB4MDAyCisjZGVmaW5lIE1FNjAwMF9BT19DVFJMX0JJVF9TVE9QCQkJCQkweDAwNAorI2RlZmluZSBNRTYwMDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0ZJRk8JCQkweDAwOAorI2RlZmluZSBNRTYwMDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0VYX1RSSUcJCTB4MDEwCisjZGVmaW5lIE1FNjAwMF9BT19DVFJMX0JJVF9FWF9UUklHX0VER0UJCQkweDAyMAorI2RlZmluZSBNRTYwMDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0lSUQkJCTB4MDQwCisjZGVmaW5lIE1FNjAwMF9BT19DVFJMX0JJVF9JTU1FRElBVEVfU1RPUAkJMHgwODAKKyNkZWZpbmUgTUU2MDAwX0FPX0NUUkxfQklUX0VYX1RSSUdfRURHRV9CT1RIIAkweDgwMAorCisvL01FNjAwMF9BT19TVEFUVVNfUkVHCisjZGVmaW5lIE1FNjAwMF9BT19TVEFUVVNfQklUX0ZTTQkJCQkweDAxCisjZGVmaW5lIE1FNjAwMF9BT19TVEFUVVNfQklUX0ZGCQkJCQkweDAyCisjZGVmaW5lIE1FNjAwMF9BT19TVEFUVVNfQklUX0hGCQkJCQkweDA0CisjZGVmaW5lIE1FNjAwMF9BT19TVEFUVVNfQklUX0VGCQkJCQkweDA4CisKKyNkZWZpbmUgTUU2MDAwX0FPX1BSRUxPQURfUkVHCQkJCQkweEE4CS8vIFIvVyAgICAvLy9NRTYwMDBfQU9fU1lOQ19SRUcgPD09PiBNRTYwMDBfQU9fUFJFTE9BRF9SRUcKKy8qCisjZGVmaW5lIE1FNjAwMF9BT19TWU5DX0hPTERfMAkJCQkJMHgwMDAwMDAwMQorI2RlZmluZSBNRTYwMDBfQU9fU1lOQ19IT0xEXzEJCQkJCTB4MDAwMDAwMDIKKyNkZWZpbmUgTUU2MDAwX0FPX1NZTkNfSE9MRF8yCQkJCQkweDAwMDAwMDA0CisjZGVmaW5lIE1FNjAwMF9BT19TWU5DX0hPTERfMwkJCQkJMHgwMDAwMDAwOAorI2RlZmluZSBNRTYwMDBfQU9fU1lOQ19IT0xEXzQJCQkJCTB4MDAwMDAwMTAKKyNkZWZpbmUgTUU2MDAwX0FPX1NZTkNfSE9MRF81CQkJCQkweDAwMDAwMDIwCisjZGVmaW5lIE1FNjAwMF9BT19TWU5DX0hPTERfNgkJCQkJMHgwMDAwMDA0MAorI2RlZmluZSBNRTYwMDBfQU9fU1lOQ19IT0xEXzcJCQkJCTB4MDAwMDAwODAKKyNkZWZpbmUgTUU2MDAwX0FPX1NZTkNfSE9MRF84CQkJCQkweDAwMDAwMTAwCisjZGVmaW5lIE1FNjAwMF9BT19TWU5DX0hPTERfOQkJCQkJMHgwMDAwMDIwMAorI2RlZmluZSBNRTYwMDBfQU9fU1lOQ19IT0xEXzEwCQkJCQkweDAwMDAwNDAwCisjZGVmaW5lIE1FNjAwMF9BT19TWU5DX0hPTERfMTEJCQkJCTB4MDAwMDA4MDAKKyNkZWZpbmUgTUU2MDAwX0FPX1NZTkNfSE9MRF8xMgkJCQkJMHgwMDAwMTAwMAorI2RlZmluZSBNRTYwMDBfQU9fU1lOQ19IT0xEXzEzCQkJCQkweDAwMDAyMDAwCisjZGVmaW5lIE1FNjAwMF9BT19TWU5DX0hPTERfMTQJCQkJCTB4MDAwMDQwMDAKKyNkZWZpbmUgTUU2MDAwX0FPX1NZTkNfSE9MRF8xNQkJCQkJMHgwMDAwODAwMAorKi8KKyNkZWZpbmUgTUU2MDAwX0FPX1NZTkNfSE9MRAkJCQkJCTB4MDAwMDAwMDEKKy8qCisjZGVmaW5lIE1FNjAwMF9BT19TWU5DX0VYVF9UUklHXzAJCQkJMHgwMDAxMDAwMAorI2RlZmluZSBNRTYwMDBfQU9fU1lOQ19FWFRfVFJJR18xCQkJCTB4MDAwMjAwMDAKKyNkZWZpbmUgTUU2MDAwX0FPX1NZTkNfRVhUX1RSSUdfMgkJCQkweDAwMDQwMDAwCisjZGVmaW5lIE1FNjAwMF9BT19TWU5DX0VYVF9UUklHXzMJCQkJMHgwMDA4MDAwMAorI2RlZmluZSBNRTYwMDBfQU9fU1lOQ19FWFRfVFJJR180CQkJCTB4MDAxMDAwMDAKKyNkZWZpbmUgTUU2MDAwX0FPX1NZTkNfRVhUX1RSSUdfNQkJCQkweDAwMjAwMDAwCisjZGVmaW5lIE1FNjAwMF9BT19TWU5DX0VYVF9UUklHXzYJCQkJMHgwMDQwMDAwMAorI2RlZmluZSBNRTYwMDBfQU9fU1lOQ19FWFRfVFJJR183CQkJCTB4MDA4MDAwMDAKKyNkZWZpbmUgTUU2MDAwX0FPX1NZTkNfRVhUX1RSSUdfOAkJCQkweDAxMDAwMDAwCisjZGVmaW5lIE1FNjAwMF9BT19TWU5DX0VYVF9UUklHXzkJCQkJMHgwMjAwMDAwMAorI2RlZmluZSBNRTYwMDBfQU9fU1lOQ19FWFRfVFJJR18xMAkJCQkweDA0MDAwMDAwCisjZGVmaW5lIE1FNjAwMF9BT19TWU5DX0VYVF9UUklHXzExCQkJCTB4MDgwMDAwMDAKKyNkZWZpbmUgTUU2MDAwX0FPX1NZTkNfRVhUX1RSSUdfMTIJCQkJMHgxMDAwMDAwMAorI2RlZmluZSBNRTYwMDBfQU9fU1lOQ19FWFRfVFJJR18xMwkJCQkweDIwMDAwMDAwCisjZGVmaW5lIE1FNjAwMF9BT19TWU5DX0VYVF9UUklHXzE0CQkJCTB4NDAwMDAwMDAKKyNkZWZpbmUgTUU2MDAwX0FPX1NZTkNfRVhUX1RSSUdfMTUJCQkJMHg4MDAwMDAwMAorKi8KKyNkZWZpbmUgTUU2MDAwX0FPX1NZTkNfRVhUX1RSSUcJCQkJCTB4MDAwMTAwMDAKKworI2RlZmluZSBNRTYwMDBfQU9fRVhUX1RSSUcJCQkJCQkweDgwMDAwMDAwCisKKy8vIEFPLUlSUQorI2RlZmluZSBNRTYwMDBfQU9fSVJRX1NUQVRVU19SRUcJCQkJMHg2MAkvLyBSL18KKyNkZWZpbmUgTUU2MDAwX0FPXzAwX0lSUV9SRVNFVF9SRUcJCQkJMHg2NAkvLyBSL18KKyNkZWZpbmUgTUU2MDAwX0FPXzAxX0lSUV9SRVNFVF9SRUcJCQkJMHg2OAkvLyBSL18KKyNkZWZpbmUgTUU2MDAwX0FPXzAyX0lSUV9SRVNFVF9SRUcJCQkJMHg2QwkvLyBSL18KKyNkZWZpbmUgTUU2MDAwX0FPXzAzX0lSUV9SRVNFVF9SRUcJCQkJMHg3MAkvLyBSL18KKworI2RlZmluZSBNRTYwMDBfSVJRX1NUQVRVU19CSVRfMAkJCQkJMHgwMQorI2RlZmluZSBNRTYwMDBfSVJRX1NUQVRVU19CSVRfMQkJCQkJMHgwMgorI2RlZmluZSBNRTYwMDBfSVJRX1NUQVRVU19CSVRfMgkJCQkJMHgwNAorI2RlZmluZSBNRTYwMDBfSVJRX1NUQVRVU19CSVRfMwkJCQkJMHgwOAorCisjZGVmaW5lIE1FNjAwMF9JUlFfU1RBVFVTX0JJVF9BT19IRgkJCQlNRTYwMDBfSVJRX1NUQVRVU19CSVRfMAorCisvL0RVTVkgcmVnaXN0ZXIKKyNkZWZpbmUgTUU2MDAwX0FPX0RVTVkJCQkJCQkJCQkweEZDCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lNjAwMF9kZXZpY2UuYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTYwMDBfZGV2aWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmVlNGM1OAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTYwMDBfZGV2aWNlLmMKQEAgLTAsMCArMSwyMTEgQEAKKy8qKgorICogQGZpbGUgbWU2MDAwX2RldmljZS5jCisgKgorICogQGJyaWVmIERldmljZSBjbGFzcyB0ZW1wbGF0ZSBpbXBsZW1lbnRhdGlvbi4KKyAqIEBub3RlIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKiBAYXV0aG9yIEd1ZW50ZXIgR2ViaGFyZHQKKyAqIEBhdXRob3IgS3J6eXN6dG9mIEdhbnR6a2UJKGsuZ2FudHprZUBtZWlsaGF1cy5kZSkKKyAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9fS0VSTkVMX18KKyMgIGRlZmluZSBfX0tFUk5FTF9fCisjZW5kaWYKKworI2lmbmRlZiBNT0RVTEUKKyMgIGRlZmluZSBNT0RVTEUKKyNlbmRpZgorCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKKyNpbmNsdWRlICJtZWlkcy5oIgorI2luY2x1ZGUgIm1lZXJyb3IuaCIKKyNpbmNsdWRlICJtZWNvbW1vbi5oIgorI2luY2x1ZGUgIm1laW50ZXJuYWwuaCIKKworI2luY2x1ZGUgIm1lZmlybXdhcmUuaCIKKworI2luY2x1ZGUgIm1lc3ViZGV2aWNlLmgiCisjaW5jbHVkZSAibWVkZWJ1Zy5oIgorI2luY2x1ZGUgIm1lZGV2aWNlLmgiCisjaW5jbHVkZSAibWU2MDAwX3JlZy5oIgorI2luY2x1ZGUgIm1lNjAwMF9kZXZpY2UuaCIKKyNpbmNsdWRlICJtZXBseF9yZWcuaCIKKyNpbmNsdWRlICJtZTYwMDBfZGlvLmgiCisjaW5jbHVkZSAibWU2MDAwX2FvLmgiCisKKy8qKgorICogQGJyaWVmIEdsb2JhbCB2YXJpYWJsZS4KKyAqIFRoaXMgaXMgd29ya2luZyBxdWV1ZSBmb3IgcnVuaW5nIGEgc2VwYXJhdGUgYXRhc2sgdGhhdCB3aWxsIGJlIHJlc3BvbnNpYmxlIGZvciB3b3JrIHN0YXR1cyAoc3RhcnQsIHN0b3AsIHRpbWVvdXRzKS4KKyAqLworc3RhdGljIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICptZTYwMDBfd29ya3F1ZXVlOworCittZV9kZXZpY2VfdCAqbWU2MDAwX3BjaV9jb25zdHJ1Y3RvcihzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldmljZSkKK3sKKwltZTYwMDBfZGV2aWNlX3QgKm1lNjAwMF9kZXZpY2U7CisJbWVfc3ViZGV2aWNlX3QgKnN1YmRldmljZTsKKwl1bnNpZ25lZCBpbnQgdmVyc2lvbl9pZHg7CisJaW50IGVycjsKKwlpbnQgaTsKKwlpbnQgaGlnaF9yYW5nZSA9IDA7CisJaW50IGZpZm87CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwkvLyBBbGxvY2F0ZSBzdHJ1Y3R1cmUgZm9yIGRldmljZSBpbnN0YW5jZS4KKwltZTYwMDBfZGV2aWNlID0ga21hbGxvYyhzaXplb2YobWU2MDAwX2RldmljZV90KSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIW1lNjAwMF9kZXZpY2UpIHsKKwkJUEVSUk9SKCJDYW5ub3QgZ2V0IG1lbW9yeSBmb3IgZGV2aWNlIGluc3RhbmNlLlxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCW1lbXNldChtZTYwMDBfZGV2aWNlLCAwLCBzaXplb2YobWU2MDAwX2RldmljZV90KSk7CisKKwkvLyBJbml0aWFsaXplIGJhc2UgY2xhc3Mgc3RydWN0dXJlLgorCWVyciA9IG1lX2RldmljZV9wY2lfaW5pdCgobWVfZGV2aWNlX3QgKikgbWU2MDAwX2RldmljZSwgcGNpX2RldmljZSk7CisKKwlpZiAoZXJyKSB7CisJCWtmcmVlKG1lNjAwMF9kZXZpY2UpOworCQlQRVJST1IoIkNhbm5vdCBpbml0aWFsaXplIGRldmljZSBiYXNlIGNsYXNzLlxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCS8qIERvd25sb2FkIHRoZSB4aWxpbnggZmlybXdhcmUgKi8KKwllcnIgPSBtZV94aWxpbnhfZG93bmxvYWQobWU2MDAwX2RldmljZS0+YmFzZS5pbmZvLnBjaS5yZWdfYmFzZXNbMV0sCisJCQkJIG1lNjAwMF9kZXZpY2UtPmJhc2UuaW5mby5wY2kucmVnX2Jhc2VzWzJdLAorCQkJCSAmcGNpX2RldmljZS0+ZGV2LCAibWU2MDAwLmJpbiIpOworCisJaWYgKGVycikgeworCQltZV9kZXZpY2VfZGVpbml0KChtZV9kZXZpY2VfdCAqKSBtZTYwMDBfZGV2aWNlKTsKKwkJa2ZyZWUobWU2MDAwX2RldmljZSk7CisJCVBFUlJPUigiQ2FuJ3QgZG93bmxvYWQgZmlybXdhcmUuXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJLyogR2V0IHRoZSBpbmRleCBpbiB0aGUgZGV2aWNlIHZlcnNpb24gaW5mb3JtYXRpb24gdGFibGUuICovCisJdmVyc2lvbl9pZHggPQorCSAgICBtZTYwMDBfdmVyc2lvbnNfZ2V0X2RldmljZV9pbmRleChtZTYwMDBfZGV2aWNlLT5iYXNlLmluZm8ucGNpLgorCQkJCQkgICAgIGRldmljZV9pZCk7CisKKwkvLyBJbml0aWFsaXplIHNwaW4gbG9jayAuCisJc3Bpbl9sb2NrX2luaXQoJm1lNjAwMF9kZXZpY2UtPnByZWxvYWRfcmVnX2xvY2spOworCXNwaW5fbG9ja19pbml0KCZtZTYwMDBfZGV2aWNlLT5kaW9fY3RybF9yZWdfbG9jayk7CisKKwkvKiBDcmVhdGUgZGlnaXRhbCBpbnB1dC9vdXRwdXQgaW5zdGFuY2VzLiAqLworCWZvciAoaSA9IDA7IGkgPCBtZTYwMDBfdmVyc2lvbnNbdmVyc2lvbl9pZHhdLmRpb19zdWJkZXZpY2VzOyBpKyspIHsKKwkJc3ViZGV2aWNlID0KKwkJICAgIChtZV9zdWJkZXZpY2VfdCAqKSBtZTYwMDBfZGlvX2NvbnN0cnVjdG9yKG1lNjAwMF9kZXZpY2UtPgorCQkJCQkJCSAgICAgIGJhc2UuaW5mby5wY2kuCisJCQkJCQkJICAgICAgcmVnX2Jhc2VzWzNdLCBpLAorCQkJCQkJCSAgICAgICZtZTYwMDBfZGV2aWNlLT4KKwkJCQkJCQkgICAgICBkaW9fY3RybF9yZWdfbG9jayk7CisKKwkJaWYgKCFzdWJkZXZpY2UpIHsKKwkJCW1lX2RldmljZV9kZWluaXQoKG1lX2RldmljZV90ICopIG1lNjAwMF9kZXZpY2UpOworCQkJa2ZyZWUobWU2MDAwX2RldmljZSk7CisJCQlQRVJST1IoIkNhbm5vdCBnZXQgbWVtb3J5IGZvciBzdWJkZXZpY2UuXG4iKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisKKwkJbWVfc2xpc3RfYWRkX3N1YmRldmljZV90YWlsKCZtZTYwMDBfZGV2aWNlLT5iYXNlLnNsaXN0LAorCQkJCQkgICAgc3ViZGV2aWNlKTsKKwl9CisKKwkvKiBDcmVhdGUgYW5hbG9nIG91dHB1dCBpbnN0YW5jZXMuICovCisJZm9yIChpID0gMDsgaSA8IG1lNjAwMF92ZXJzaW9uc1t2ZXJzaW9uX2lkeF0uYW9fc3ViZGV2aWNlczsgaSsrKSB7CisJCWhpZ2hfcmFuZ2UgPSAoKGkgPT0gOCkKKwkJCSAgICAgICYmCisJCQkgICAgICAoKG1lNjAwMF9kZXZpY2UtPmJhc2UuaW5mby5wY2kuZGV2aWNlX2lkID09CisJCQkJUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYzNTkpCisJCQkgICAgICAgfHwgKG1lNjAwMF9kZXZpY2UtPmJhc2UuaW5mby5wY2kuZGV2aWNlX2lkID09CisJCQkJICAgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYyNTkpCisJCQkgICAgICApCisJCSAgICApPyAxIDogMDsKKworCQlmaWZvID0KKwkJICAgIChpIDwKKwkJICAgICBtZTYwMDBfdmVyc2lvbnNbdmVyc2lvbl9pZHhdLgorCQkgICAgIGFvX2ZpZm8pID8gTUU2MDAwX0FPX0hBU19GSUZPIDogMHgwOworCQlmaWZvIHw9IChpIDwgNCkgPyBNRTYwMDBfQU9fRVhUUkFfSEFSRFdBUkUgOiAweDA7CisKKwkJc3ViZGV2aWNlID0KKwkJICAgIChtZV9zdWJkZXZpY2VfdCAqKSBtZTYwMDBfYW9fY29uc3RydWN0b3IobWU2MDAwX2RldmljZS0+CisJCQkJCQkJICAgICBiYXNlLmluZm8ucGNpLgorCQkJCQkJCSAgICAgcmVnX2Jhc2VzWzJdLAorCQkJCQkJCSAgICAgJm1lNjAwMF9kZXZpY2UtPgorCQkJCQkJCSAgICAgcHJlbG9hZF9yZWdfbG9jaywKKwkJCQkJCQkgICAgICZtZTYwMDBfZGV2aWNlLT4KKwkJCQkJCQkgICAgIHByZWxvYWRfZmxhZ3MsCisJCQkJCQkJICAgICAmbWU2MDAwX2RldmljZS0+CisJCQkJCQkJICAgICB0cmlnZ2VyaW5nX2ZsYWdzLAorCQkJCQkJCSAgICAgaSwgZmlmbywKKwkJCQkJCQkgICAgIG1lNjAwMF9kZXZpY2UtPgorCQkJCQkJCSAgICAgYmFzZS5pcnEsCisJCQkJCQkJICAgICBoaWdoX3JhbmdlLAorCQkJCQkJCSAgICAgbWU2MDAwX3dvcmtxdWV1ZSk7CisKKwkJaWYgKCFzdWJkZXZpY2UpIHsKKwkJCW1lX2RldmljZV9kZWluaXQoKG1lX2RldmljZV90ICopIG1lNjAwMF9kZXZpY2UpOworCQkJa2ZyZWUobWU2MDAwX2RldmljZSk7CisJCQlQRVJST1IoIkNhbm5vdCBnZXQgbWVtb3J5IGZvciBzdWJkZXZpY2UuXG4iKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisKKwkJbWVfc2xpc3RfYWRkX3N1YmRldmljZV90YWlsKCZtZTYwMDBfZGV2aWNlLT5iYXNlLnNsaXN0LAorCQkJCQkgICAgc3ViZGV2aWNlKTsKKwl9CisKKwlyZXR1cm4gKG1lX2RldmljZV90ICopIG1lNjAwMF9kZXZpY2U7Cit9CisKKy8vIEluaXQgYW5kIGV4aXQgb2YgbW9kdWxlLgorCitzdGF0aWMgaW50IF9faW5pdCBtZTYwMDBfaW5pdCh2b2lkKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCW1lNjAwMF93b3JrcXVldWUgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZSgibWU2MDAwIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBtZTYwMDBfZXhpdCh2b2lkKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWZsdXNoX3dvcmtxdWV1ZShtZTYwMDBfd29ya3F1ZXVlKTsKKwlkZXN0cm95X3dvcmtxdWV1ZShtZTYwMDBfd29ya3F1ZXVlKTsKK30KKworbW9kdWxlX2luaXQobWU2MDAwX2luaXQpOworbW9kdWxlX2V4aXQobWU2MDAwX2V4aXQpOworCisvLyBBZG1pbmlzdHJhdGl2ZSBzdHVmZiBmb3IgbW9kaW5mby4KK01PRFVMRV9BVVRIT1IKKyAgICAoIkd1ZW50ZXIgR2ViaGFyZHQgPGcuZ2ViaGFyZHRAbWVpbGhhdXMuZGU+ICYgS3J6eXN6dG9mIEdhbnR6a2UgPGsuZ2FudHprZUBtZWlsaGF1cy5kZT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiRGV2aWNlIERyaXZlciBNb2R1bGUgZm9yIE1FLTYwMDAgRGV2aWNlIik7CitNT0RVTEVfU1VQUE9SVEVEX0RFVklDRSgiTWVpbGhhdXMgTUUtNjAwMCBEZXZpY2VzIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKy8vIEV4cG9ydCB0aGUgY29uc3RydWN0b3IuCitFWFBPUlRfU1lNQk9MKG1lNjAwMF9wY2lfY29uc3RydWN0b3IpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lNjAwMF9kZXZpY2UuaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTYwMDBfZGV2aWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThjYzdkMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTYwMDBfZGV2aWNlLmgKQEAgLTAsMCArMSwxNDkgQEAKKy8qKgorICogQGZpbGUgbWU2MDAwX2RldmljZS5oCisgKgorICogQGJyaWVmIE1FLTYwMDAgZGV2aWNlIGNsYXNzLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX01FNjAwMF9ERVZJQ0VfSAorI2RlZmluZSBfTUU2MDAwX0RFVklDRV9ICisKKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorCisjaW5jbHVkZSAibWVkZXZpY2UuaCIKKworI2lmZGVmIF9fS0VSTkVMX18KKworLyoqCisgKiBAYnJpZWYgU3RydWN0dXJlIGhvbGRpbmcgTUUtNjAwMCBkZXZpY2UgY2FwYWJpbGl0aWVzLgorICovCit0eXBlZGVmIHN0cnVjdCBtZTYwMDBfdmVyc2lvbiB7CisJdWludDE2X3QgZGV2aWNlX2lkOworCXVuc2lnbmVkIGludCBkaW9fc3ViZGV2aWNlczsKKwl1bnNpZ25lZCBpbnQgYW9fc3ViZGV2aWNlczsKKwl1bnNpZ25lZCBpbnQgYW9fZmlmbzsJLy9Ib3cgbWFueSBkZXZpY2VzIGhhdmUgRklGTworfSBtZTYwMDBfdmVyc2lvbl90OworCisvKioKKyAqIEBicmllZiBNRS02MDAwIGRldmljZSBjYXBhYmlsaXRpZXMuCisgKi8KK3N0YXRpYyBtZTYwMDBfdmVyc2lvbl90IG1lNjAwMF92ZXJzaW9uc1tdID0geworCXtQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjAwNCwgMCwgNCwgMH0sCisJe1BDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDA4LCAwLCA4LCAwfSwKKwl7UENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwMEYsIDAsIDE2LCAwfSwKKworCXtQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjAxNCwgMCwgNCwgMH0sCisJe1BDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDE4LCAwLCA4LCAwfSwKKwl7UENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwMUYsIDAsIDE2LCAwfSwKKworCXtQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjAzNCwgMCwgNCwgMH0sCisJe1BDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDM4LCAwLCA4LCAwfSwKKwl7UENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwM0YsIDAsIDE2LCAwfSwKKworCXtQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjEwNCwgMCwgNCwgNH0sCisJe1BDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTA4LCAwLCA4LCA0fSwKKwl7UENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYxMEYsIDAsIDE2LCA0fSwKKworCXtQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjExNCwgMCwgNCwgNH0sCisJe1BDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTE4LCAwLCA4LCA0fSwKKwl7UENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYxMUYsIDAsIDE2LCA0fSwKKworCXtQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjEzNCwgMCwgNCwgNH0sCisJe1BDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTM4LCAwLCA4LCA0fSwKKwl7UENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYxM0YsIDAsIDE2LCA0fSwKKworCXtQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjA0NCwgMiwgNCwgMH0sCisJe1BDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDQ4LCAyLCA4LCAwfSwKKwl7UENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwNEYsIDIsIDE2LCAwfSwKKworCXtQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjA1NCwgMiwgNCwgMH0sCisJe1BDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDU4LCAyLCA4LCAwfSwKKwl7UENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwNUYsIDIsIDE2LCAwfSwKKworCXtQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjA3NCwgMiwgNCwgMH0sCisJe1BDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDc4LCAyLCA4LCAwfSwKKwl7UENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwN0YsIDIsIDE2LCAwfSwKKworCXtQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjE0NCwgMiwgNCwgNH0sCisJe1BDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTQ4LCAyLCA4LCA0fSwKKwl7UENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYxNEYsIDIsIDE2LCA0fSwKKworCXtQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjE1NCwgMiwgNCwgNH0sCisJe1BDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTU4LCAyLCA4LCA0fSwKKwl7UENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYxNUYsIDIsIDE2LCA0fSwKKworCXtQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjE3NCwgMiwgNCwgNH0sCisJe1BDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTc4LCAyLCA4LCA0fSwKKwl7UENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYxN0YsIDIsIDE2LCA0fSwKKworCXtQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjI1OSwgMiwgOSwgMH0sCisKKwl7UENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYzNTksIDIsIDksIDR9LAorCisJezB9LAorfTsKKworI2RlZmluZSBNRTYwMDBfREVWSUNFX1ZFUlNJT05TIChzaXplb2YobWU2MDAwX3ZlcnNpb25zKSAvIHNpemVvZihtZTYwMDBfdmVyc2lvbl90KSAtIDEpCS8qKjwgUmV0dXJucyB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaW4gI21lNjAwMF92ZXJzaW9ucy4gKi8KKworLyoqCisgKiBAYnJpZWYgUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGRldmljZSBlbnRyeSBpbiAjbWU2MDAwX3ZlcnNpb25zLgorICoKKyAqIEBwYXJhbSBkZXZpY2VfaWQgVGhlIFBDSSBkZXZpY2UgaWQgb2YgdGhlIGRldmljZSB0byBxdWVyeS4KKyAqIEByZXR1cm4gVGhlIGluZGV4IG9mIHRoZSBkZXZpY2UgaW4gI21lNjAwMF92ZXJzaW9ucy4KKyAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgbWU2MDAwX3ZlcnNpb25zX2dldF9kZXZpY2VfaW5kZXgodWludDE2X3QgZGV2aWNlX2lkKQoreworCXVuc2lnbmVkIGludCBpOworCWZvciAoaSA9IDA7IGkgPCBNRTYwMDBfREVWSUNFX1ZFUlNJT05TOyBpKyspCisJCWlmIChtZTYwMDBfdmVyc2lvbnNbaV0uZGV2aWNlX2lkID09IGRldmljZV9pZCkKKwkJCWJyZWFrOworCXJldHVybiBpOworfQorCisvKioKKyAqIEBicmllZiBUaGUgTUUtNjAwMCBkZXZpY2UgY2xhc3Mgc3RydWN0dXJlLgorICovCit0eXBlZGVmIHN0cnVjdCBtZTYwMDBfZGV2aWNlIHsKKwltZV9kZXZpY2VfdCBiYXNlOwkJCS8qKjwgVGhlIE1laWxoYXVzIGRldmljZSBiYXNlIGNsYXNzLiAqLworCisJLyogQ2hpbGQgY2xhc3MgYXR0cmlidXRlcy4gKi8KKwlzcGlubG9ja190IHByZWxvYWRfcmVnX2xvY2s7CQkvKio8IEd1YXJkcyB0aGUgcHJlbG9hZCByZWdpc3Rlci4gKi8KKwl1aW50MzJfdCBwcmVsb2FkX2ZsYWdzOworCXVpbnQzMl90IHRyaWdnZXJpbmdfZmxhZ3M7CisKKwlzcGlubG9ja190IGRpb19jdHJsX3JlZ19sb2NrOworfSBtZTYwMDBfZGV2aWNlX3Q7CisKKy8qKgorICogQGJyaWVmIFRoZSBNRS02MDAwIGRldmljZSBjbGFzcyBjb25zdHJ1Y3Rvci4KKyAqCisgKiBAcGFyYW0gcGNpX2RldmljZSBUaGUgcGNpIGRldmljZSBzdHJ1Y3R1cmUgZ2l2ZW4gYnkgdGhlIFBDSSBzdWJzeXN0ZW0uCisgKgorICogQHJldHVybiBPbiBzdWNjZXMgYSBuZXcgTUUtNjAwMCBkZXZpY2UgaW5zdGFuY2UuIFxuCisgKiAgICAgICAgIE5VTEwgb24gZXJyb3IuCisgKi8KK21lX2RldmljZV90ICptZTYwMDBfcGNpX2NvbnN0cnVjdG9yKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2aWNlKQorICAgIF9fYXR0cmlidXRlX18gKCh3ZWFrKSk7CisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU2MDAwX2Rpby5jIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lNjAwMF9kaW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2YxMDY5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lNjAwMF9kaW8uYwpAQCAtMCwwICsxLDQxNSBAQAorLyoqCisgKiBAZmlsZSBtZTYwMDBfZGlvLmMKKyAqCisgKiBAYnJpZWYgTUUtNjAwMCBkaWdpdGFsIGlucHV0L291dHB1dCBzdWJkZXZpY2UgaW5zdGFuY2UuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKiBAYXV0aG9yIEtyenlzenRvZiBHYW50emtlCShrLmdhbnR6a2VAbWVpbGhhdXMuZGUpCisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0tFUk5FTF9fCisjICBkZWZpbmUgX19LRVJORUxfXworI2VuZGlmCisKKy8qCisgKiBJbmNsdWRlcworICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjaW5jbHVkZSAibWVkZWZpbmVzLmgiCisjaW5jbHVkZSAibWVpbnRlcm5hbC5oIgorI2luY2x1ZGUgIm1lZXJyb3IuaCIKKworI2luY2x1ZGUgIm1lZGVidWcuaCIKKyNpbmNsdWRlICJtZTYwMDBfZGlvX3JlZy5oIgorI2luY2x1ZGUgIm1lNjAwMF9kaW8uaCIKKworLyoKKyAqIERlZmluZXMKKyAqLworCisvKgorICogRnVuY3Rpb25zCisgKi8KKworc3RhdGljIGludCBtZTYwMDBfZGlvX2lvX3Jlc2V0X3N1YmRldmljZShzdHJ1Y3QgbWVfc3ViZGV2aWNlICpzdWJkZXZpY2UsCisJCQkJCSBzdHJ1Y3QgZmlsZSAqZmlsZXAsIGludCBmbGFncykKK3sKKwltZTYwMDBfZGlvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwl1aW50OF90IG1vZGU7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbnN0YW5jZSA9IChtZTYwMDBfZGlvX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCWlmIChmbGFncykgeworCQlQRVJST1IoIkludmFsaWQgZmxhZyBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJfQorCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJc3Bpbl9sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCXNwaW5fbG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisJbW9kZSA9IGluYihpbnN0YW5jZS0+Y3RybF9yZWcpOworCW1vZGUgJj0gfigweDMgPDwgKGluc3RhbmNlLT5kaW9faWR4ICogMikpOworCW91dGIobW9kZSwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgbW9kZSk7CisJc3Bpbl91bmxvY2soaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2spOworCisJb3V0YigweDAwLCBpbnN0YW5jZS0+cG9ydF9yZWcpOworCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCAweDAwKTsKKwlzcGluX3VubG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWU2MDAwX2Rpb19pb19zaW5nbGVfY29uZmlnKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgICAgIGludCBjaGFubmVsLAorCQkJCSAgICAgICBpbnQgc2luZ2xlX2NvbmZpZywKKwkJCQkgICAgICAgaW50IHJlZiwKKwkJCQkgICAgICAgaW50IHRyaWdfY2hhbiwKKwkJCQkgICAgICAgaW50IHRyaWdfdHlwZSwgaW50IHRyaWdfZWRnZSwgaW50IGZsYWdzKQoreworCW1lNjAwMF9kaW9fc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCXVpbnQ4X3QgbW9kZTsKKwlpbnQgc2l6ZSA9CisJICAgIGZsYWdzICYgKE1FX0lPX1NJTkdMRV9DT05GSUdfRElPX0JJVCB8IE1FX0lPX1NJTkdMRV9DT05GSUdfRElPX0JZVEUKKwkJICAgICB8IE1FX0lPX1NJTkdMRV9DT05GSUdfRElPX1dPUkQgfAorCQkgICAgIE1FX0lPX1NJTkdMRV9DT05GSUdfRElPX0RXT1JEKTsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lNjAwMF9kaW9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJTUVfU1VCREVWSUNFX0VOVEVSIHNwaW5fbG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKwlzcGluX2xvY2soaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2spOworCW1vZGUgPSBpbmIoaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwlzd2l0Y2ggKHNpemUpIHsKKwljYXNlIE1FX0lPX1NJTkdMRV9DT05GSUdfTk9fRkxBR1M6CisJY2FzZSBNRV9JT19TSU5HTEVfQ09ORklHX0RJT19CWVRFOgorCQlpZiAoY2hhbm5lbCA9PSAwKSB7CisJCQlpZiAoc2luZ2xlX2NvbmZpZyA9PSBNRV9TSU5HTEVfQ09ORklHX0RJT19JTlBVVCkgeworCQkJCW1vZGUgJj0KKwkJCQkgICAgfigoTUU2MDAwX0RJT19DVFJMX0JJVF9NT0RFXzAgfAorCQkJCSAgICAgICBNRTYwMDBfRElPX0NUUkxfQklUX01PREVfMSkgPDwKKwkJCQkgICAgICAoaW5zdGFuY2UtPmRpb19pZHggKiAyKSk7CisJCQl9IGVsc2UgaWYgKHNpbmdsZV9jb25maWcgPT0gTUVfU0lOR0xFX0NPTkZJR19ESU9fT1VUUFVUKSB7CisJCQkJbW9kZSAmPQorCQkJCSAgICB+KChNRTYwMDBfRElPX0NUUkxfQklUX01PREVfMCB8CisJCQkJICAgICAgIE1FNjAwMF9ESU9fQ1RSTF9CSVRfTU9ERV8xKSA8PAorCQkJCSAgICAgIChpbnN0YW5jZS0+ZGlvX2lkeCAqIDIpKTsKKwkJCQltb2RlIHw9CisJCQkJICAgIE1FNjAwMF9ESU9fQ1RSTF9CSVRfTU9ERV8wIDw8IChpbnN0YW5jZS0+CisJCQkJCQkJCSAgIGRpb19pZHggKiAyKTsKKwkJCX0gZWxzZSB7CisJCQkJUEVSUk9SCisJCQkJICAgICgiSW52YWxpZCBwb3J0IGNvbmZpZ3VyYXRpb24gc3BlY2lmaWVkLlxuIik7CisJCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9TSU5HTEVfQ09ORklHOworCQkJfQorCQl9IGVsc2UgeworCQkJUEVSUk9SKCJJbnZhbGlkIGNoYW5uZWwgbnVtYmVyLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlQRVJST1IoIkludmFsaWQgZmxhZ3MuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlpZiAoIWVycikgeworCQlvdXRiKG1vZGUsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIG1vZGUpOworCX0KKwlzcGluX3VubG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisJc3Bpbl91bmxvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWU2MDAwX2Rpb19pb19zaW5nbGVfcmVhZChtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgIGludCBjaGFubmVsLAorCQkJCSAgICAgaW50ICp2YWx1ZSwgaW50IHRpbWVfb3V0LCBpbnQgZmxhZ3MpCit7CisJbWU2MDAwX2Rpb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJdWludDhfdCBtb2RlOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJaW5zdGFuY2UgPSAobWU2MDAwX2Rpb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlNRV9TVUJERVZJQ0VfRU5URVIgc3Bpbl9sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCXNwaW5fbG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisJc3dpdGNoIChmbGFncykgeworCWNhc2UgTUVfSU9fU0lOR0xFX1RZUEVfRElPX0JJVDoKKwkJaWYgKChjaGFubmVsID49IDApICYmIChjaGFubmVsIDwgOCkpIHsKKwkJCW1vZGUgPQorCQkJICAgIGluYihpbnN0YW5jZS0+CisJCQkJY3RybF9yZWcpICYgKChNRTYwMDBfRElPX0NUUkxfQklUX01PREVfMCB8CisJCQkJCSAgICAgIE1FNjAwMF9ESU9fQ1RSTF9CSVRfTU9ERV8xKSA8PAorCQkJCQkgICAgIChpbnN0YW5jZS0+ZGlvX2lkeCAqIDIpKTsKKwkJCWlmICgobW9kZSA9PQorCQkJICAgICAoTUU2MDAwX0RJT19DVFJMX0JJVF9NT0RFXzAgPDwKKwkJCSAgICAgIChpbnN0YW5jZS0+ZGlvX2lkeCAqIDIpKSkgfHwgIW1vZGUpIHsKKwkJCQkqdmFsdWUgPQorCQkJCSAgICBpbmIoaW5zdGFuY2UtPnBvcnRfcmVnKSAmICgweDEgPDwgY2hhbm5lbCk7CisJCQl9IGVsc2UgeworCQkJCVBFUlJPUigiUG9ydCBub3QgaW4gb3V0cHV0IG9yIGlucHV0IG1vZGUuXG4iKTsKKwkJCQllcnIgPSBNRV9FUlJOT19QUkVWSU9VU19DT05GSUc7CisJCQl9CisJCX0gZWxzZSB7CisJCQlQRVJST1IoIkludmFsaWQgYml0IG51bWJlciBzcGVjaWZpZWQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwkJfQorCQlicmVhazsKKworCWNhc2UgTUVfSU9fU0lOR0xFX05PX0ZMQUdTOgorCWNhc2UgTUVfSU9fU0lOR0xFX1RZUEVfRElPX0JZVEU6CisJCWlmIChjaGFubmVsID09IDApIHsKKwkJCW1vZGUgPQorCQkJICAgIGluYihpbnN0YW5jZS0+CisJCQkJY3RybF9yZWcpICYgKChNRTYwMDBfRElPX0NUUkxfQklUX01PREVfMCB8CisJCQkJCSAgICAgIE1FNjAwMF9ESU9fQ1RSTF9CSVRfTU9ERV8xKSA8PAorCQkJCQkgICAgIChpbnN0YW5jZS0+ZGlvX2lkeCAqIDIpKTsKKwkJCWlmICgobW9kZSA9PQorCQkJICAgICAoTUU2MDAwX0RJT19DVFJMX0JJVF9NT0RFXzAgPDwKKwkJCSAgICAgIChpbnN0YW5jZS0+ZGlvX2lkeCAqIDIpKSkgfHwgIW1vZGUpIHsKKwkJCQkqdmFsdWUgPSBpbmIoaW5zdGFuY2UtPnBvcnRfcmVnKSAmIDB4MDBGRjsKKwkJCX0gZWxzZSB7CisJCQkJUEVSUk9SKCJQb3J0IG5vdCBpbiBvdXRwdXQgb3IgaW5wdXQgbW9kZS5cbiIpOworCQkJCWVyciA9IE1FX0VSUk5PX1BSRVZJT1VTX0NPTkZJRzsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCVBFUlJPUigiSW52YWxpZCBieXRlIG51bWJlciBzcGVjaWZpZWQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCVBFUlJPUigiSW52YWxpZCBmbGFncyBzcGVjaWZpZWQuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisJc3Bpbl91bmxvY2soaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2spOworCXNwaW5fdW5sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lNjAwMF9kaW9faW9fc2luZ2xlX3dyaXRlKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgICBpbnQgY2hhbm5lbCwKKwkJCQkgICAgICBpbnQgdmFsdWUsIGludCB0aW1lX291dCwgaW50IGZsYWdzKQoreworCW1lNjAwMF9kaW9fc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCXVpbnQ4X3QgbW9kZTsKKwl1aW50OF90IGJ5dGU7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbnN0YW5jZSA9IChtZTYwMDBfZGlvX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCU1FX1NVQkRFVklDRV9FTlRFUiBzcGluX2xvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisJc3Bpbl9sb2NrKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrKTsKKwlzd2l0Y2ggKGZsYWdzKSB7CisJY2FzZSBNRV9JT19TSU5HTEVfVFlQRV9ESU9fQklUOgorCQlpZiAoKGNoYW5uZWwgPj0gMCkgJiYgKGNoYW5uZWwgPCA4KSkgeworCQkJbW9kZSA9CisJCQkgICAgaW5iKGluc3RhbmNlLT4KKwkJCQljdHJsX3JlZykgJiAoKE1FNjAwMF9ESU9fQ1RSTF9CSVRfTU9ERV8wIHwKKwkJCQkJICAgICAgTUU2MDAwX0RJT19DVFJMX0JJVF9NT0RFXzEpIDw8CisJCQkJCSAgICAgKGluc3RhbmNlLT5kaW9faWR4ICogMikpOworCisJCQlpZiAobW9kZSA9PQorCQkJICAgIChNRTYwMDBfRElPX0NUUkxfQklUX01PREVfMCA8PAorCQkJICAgICAoaW5zdGFuY2UtPmRpb19pZHggKiAyKSkpIHsKKwkJCQlieXRlID0gaW5iKGluc3RhbmNlLT5wb3J0X3JlZykgJiAweDAwRkY7CisKKwkJCQlpZiAodmFsdWUpCisJCQkJCWJ5dGUgfD0gMHgxIDw8IGNoYW5uZWw7CisJCQkJZWxzZQorCQkJCQlieXRlICY9IH4oMHgxIDw8IGNoYW5uZWwpOworCisJCQkJb3V0YihieXRlLCBpbnN0YW5jZS0+cG9ydF9yZWcpOworCQkJfSBlbHNlIHsKKwkJCQlQRVJST1IoIlBvcnQgbm90IGluIG91dHB1dCBvciBpbnB1dCBtb2RlLlxuIik7CisJCQkJZXJyID0gTUVfRVJSTk9fUFJFVklPVVNfQ09ORklHOworCQkJfQorCQl9IGVsc2UgeworCQkJUEVSUk9SKCJJbnZhbGlkIGJpdCBudW1iZXIgc3BlY2lmaWVkLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIE1FX0lPX1NJTkdMRV9OT19GTEFHUzoKKwljYXNlIE1FX0lPX1NJTkdMRV9UWVBFX0RJT19CWVRFOgorCQlpZiAoY2hhbm5lbCA9PSAwKSB7CisJCQltb2RlID0KKwkJCSAgICBpbmIoaW5zdGFuY2UtPgorCQkJCWN0cmxfcmVnKSAmICgoTUU2MDAwX0RJT19DVFJMX0JJVF9NT0RFXzAgfAorCQkJCQkgICAgICBNRTYwMDBfRElPX0NUUkxfQklUX01PREVfMSkgPDwKKwkJCQkJICAgICAoaW5zdGFuY2UtPmRpb19pZHggKiAyKSk7CisKKwkJCWlmIChtb2RlID09CisJCQkgICAgKE1FNjAwMF9ESU9fQ1RSTF9CSVRfTU9ERV8wIDw8CisJCQkgICAgIChpbnN0YW5jZS0+ZGlvX2lkeCAqIDIpKSkgeworCQkJCW91dGIodmFsdWUsIGluc3RhbmNlLT5wb3J0X3JlZyk7CisJCQl9IGVsc2UgeworCQkJCVBFUlJPUigiUG9ydCBub3QgaW4gb3V0cHV0IG9yIGlucHV0IG1vZGUuXG4iKTsKKwkJCQllcnIgPSBNRV9FUlJOT19QUkVWSU9VU19DT05GSUc7CisJCQl9CisJCX0gZWxzZSB7CisJCQlQRVJST1IoIkludmFsaWQgYnl0ZSBudW1iZXIgc3BlY2lmaWVkLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlQRVJST1IoIkludmFsaWQgZmxhZ3Mgc3BlY2lmaWVkLlxuIik7CisJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJfQorCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrKTsKKwlzcGluX3VubG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZTYwMDBfZGlvX3F1ZXJ5X251bWJlcl9jaGFubmVscyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJICAgIGludCAqbnVtYmVyKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwkqbnVtYmVyID0gODsKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZTYwMDBfZGlvX3F1ZXJ5X3N1YmRldmljZV90eXBlKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQkgICBpbnQgKnR5cGUsIGludCAqc3VidHlwZSkKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJKnR5cGUgPSBNRV9UWVBFX0RJTzsKKwkqc3VidHlwZSA9IE1FX1NVQlRZUEVfU0lOR0xFOworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lNjAwMF9kaW9fcXVlcnlfc3ViZGV2aWNlX2NhcHMobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJCSAgIGludCAqY2FwcykKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJKmNhcHMgPSBNRV9DQVBTX0RJT19ESVJfQllURTsKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworbWU2MDAwX2Rpb19zdWJkZXZpY2VfdCAqbWU2MDAwX2Rpb19jb25zdHJ1Y3Rvcih1aW50MzJfdCByZWdfYmFzZSwKKwkJCQkJICAgICAgIHVuc2lnbmVkIGludCBkaW9faWR4LAorCQkJCQkgICAgICAgc3BpbmxvY2tfdCAqIGN0cmxfcmVnX2xvY2spCit7CisJbWU2MDAwX2Rpb19zdWJkZXZpY2VfdCAqc3ViZGV2aWNlOworCWludCBlcnI7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwkvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHN1YmRldmljZSBpbnN0YW5jZSAqLworCXN1YmRldmljZSA9IGttYWxsb2Moc2l6ZW9mKG1lNjAwMF9kaW9fc3ViZGV2aWNlX3QpLCBHRlBfS0VSTkVMKTsKKworCWlmICghc3ViZGV2aWNlKSB7CisJCVBFUlJPUigiQ2Fubm90IGdldCBtZW1vcnkgZm9yIHN1YmRldmljZSBpbnN0YW5jZS5cbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwltZW1zZXQoc3ViZGV2aWNlLCAwLCBzaXplb2YobWU2MDAwX2Rpb19zdWJkZXZpY2VfdCkpOworCisJLyogSW5pdGlhbGl6ZSBzdWJkZXZpY2UgYmFzZSBjbGFzcyAqLworCWVyciA9IG1lX3N1YmRldmljZV9pbml0KCZzdWJkZXZpY2UtPmJhc2UpOworCWlmIChlcnIpIHsKKwkJUEVSUk9SKCJDYW5ub3QgaW5pdGlhbGl6ZSBzdWJkZXZpY2UgYmFzZSBjbGFzcyBpbnN0YW5jZS5cbiIpOworCQlrZnJlZShzdWJkZXZpY2UpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKiBTZXQgdGhlIHN1YmRldmljZSBwb3J0cyAqLworCXN1YmRldmljZS0+Y3RybF9yZWcgPSByZWdfYmFzZSArIE1FNjAwMF9ESU9fQ1RSTF9SRUc7CisJc3dpdGNoIChkaW9faWR4KSB7CisJY2FzZSAwOgorCQlzdWJkZXZpY2UtPnBvcnRfcmVnID0gcmVnX2Jhc2UgKyBNRTYwMDBfRElPX1BPUlRfMF9SRUc7CisJCWJyZWFrOworCWNhc2UgMToKKwkJc3ViZGV2aWNlLT5wb3J0X3JlZyA9IHJlZ19iYXNlICsgTUU2MDAwX0RJT19QT1JUXzFfUkVHOworCQlicmVhazsKKwlkZWZhdWx0OgorCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX1NVQkRFVklDRTsKKwl9CisKKwlpZiAoZXJyKSB7CisJCVBFUlJPUigiQ2Fubm90IGluaXRpYWxpemUgc3ViZGV2aWNlIGJhc2UgY2xhc3MgaW5zdGFuY2UuXG4iKTsKKwkJa2ZyZWUoc3ViZGV2aWNlKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCS8vIEluaXRpYWxpemUgc3BpbiBsb2Nrcy4KKwlzcGluX2xvY2tfaW5pdCgmc3ViZGV2aWNlLT5zdWJkZXZpY2VfbG9jayk7CisKKwlzdWJkZXZpY2UtPmN0cmxfcmVnX2xvY2sgPSBjdHJsX3JlZ19sb2NrOworCisJLyogU2F2ZSBkaWdpdGFsIGkvbyBpbmRleCAqLworCXN1YmRldmljZS0+ZGlvX2lkeCA9IGRpb19pZHg7CisKKyNpZmRlZiBNRURFQlVHX0RFQlVHX1JFRworCXN1YmRldmljZS0+cmVnX2Jhc2UgPSByZWdfYmFzZTsKKyNlbmRpZgorCisJLyogT3ZlcmxvYWQgYmFzZSBjbGFzcyBtZXRob2RzLiAqLworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fcmVzZXRfc3ViZGV2aWNlID0KKwkgICAgbWU2MDAwX2Rpb19pb19yZXNldF9zdWJkZXZpY2U7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19zaW5nbGVfY29uZmlnID0KKwkgICAgbWU2MDAwX2Rpb19pb19zaW5nbGVfY29uZmlnOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fc2luZ2xlX3JlYWQgPSBtZTYwMDBfZGlvX2lvX3NpbmdsZV9yZWFkOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fc2luZ2xlX3dyaXRlID0KKwkgICAgbWU2MDAwX2Rpb19pb19zaW5nbGVfd3JpdGU7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9udW1iZXJfY2hhbm5lbHMgPQorCSAgICBtZTYwMDBfZGlvX3F1ZXJ5X251bWJlcl9jaGFubmVsczsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV90eXBlID0KKwkgICAgbWU2MDAwX2Rpb19xdWVyeV9zdWJkZXZpY2VfdHlwZTsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV9jYXBzID0KKwkgICAgbWU2MDAwX2Rpb19xdWVyeV9zdWJkZXZpY2VfY2FwczsKKworCXJldHVybiBzdWJkZXZpY2U7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU2MDAwX2Rpby5oIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lNjAwMF9kaW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NThiZWMxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lNjAwMF9kaW8uaApAQCAtMCwwICsxLDY4IEBACisvKioKKyAqIEBmaWxlIG1lNjAwMF9kaW8uaAorICoKKyAqIEBicmllZiBNRS02MDAwIGRpZ2l0YWwgaW5wdXQvb3V0cHV0IHN1YmRldmljZSBjbGFzcy4KKyAqIEBub3RlIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKiBAYXV0aG9yIEd1ZW50ZXIgR2ViaGFyZHQKKyAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9NRTYwMDBfRElPX0hfCisjZGVmaW5lIF9NRTYwMDBfRElPX0hfCisKKyNpbmNsdWRlICJtZXN1YmRldmljZS5oIgorCisjaWZkZWYgX19LRVJORUxfXworCisvKioKKyAqIEBicmllZiBUaGUgdGVtcGxhdGUgc3ViZGV2aWNlIGNsYXNzLgorICovCit0eXBlZGVmIHN0cnVjdCBtZTYwMDBfZGlvX3N1YmRldmljZSB7CisJLyogSW5oZXJpdGFuY2UgKi8KKwltZV9zdWJkZXZpY2VfdCBiYXNlOwkJCS8qKjwgVGhlIHN1YmRldmljZSBiYXNlIGNsYXNzLiAqLworCisJLyogQXR0cmlidXRlcyAqLworCXNwaW5sb2NrX3Qgc3ViZGV2aWNlX2xvY2s7CQkvKio8IFNwaW4gbG9jayB0byBwcm90ZWN0IHRoZSBzdWJkZXZpY2UgZnJvbSBjb25jdXJyZW50IGFjY2Vzcy4gKi8KKwlzcGlubG9ja190ICpjdHJsX3JlZ19sb2NrOwkJLyoqPCBTcGluIGxvY2sgdG8gcHJvdGVjdCAjY3RybF9yZWcgZnJvbSBjb25jdXJyZW50IGFjY2Vzcy4gKi8KKwl1bnNpZ25lZCBpbnQgZGlvX2lkeDsJCQkvKio8IFRoZSBpbmRleCBvZiB0aGUgZGlnaXRhbCBpL28gb24gdGhlIGRldmljZS4gKi8KKworCXVuc2lnbmVkIGxvbmcgcG9ydF9yZWc7CQkJLyoqPCBSZWdpc3RlciBob2xkaW5nIHRoZSBwb3J0IHN0YXR1cy4gKi8KKwl1bnNpZ25lZCBsb25nIGN0cmxfcmVnOwkJCS8qKjwgUmVnaXN0ZXIgdG8gY29uZmlndXJlIHRoZSBwb3J0IGRpcmVjdGlvbi4gKi8KKyNpZmRlZiBNRURFQlVHX0RFQlVHX1JFRworCXVuc2lnbmVkIGxvbmcgcmVnX2Jhc2U7CisjZW5kaWYKK30gbWU2MDAwX2Rpb19zdWJkZXZpY2VfdDsKKworLyoqCisgKiBAYnJpZWYgVGhlIGNvbnN0cnVjdG9yIHRvIGdlbmVyYXRlIGEgTUUtNjAwMCBkaWdpdGFsIGlucHV0L291cHV0IHN1YmRldmljZSBpbnN0YW5jZS4KKyAqCisgKiBAcGFyYW0gcmVnX2Jhc2UgVGhlIHJlZ2lzdGVyIGJhc2UgYWRkcmVzcyBvZiB0aGUgZGV2aWNlIGFzIHJldHVybmVkIGJ5IHRoZSBQQ0kgQklPUy4KKyAqIEBwYXJhbSBkaW9faWR4IFRoZSBpbmRleCBvZiB0aGUgZGlnaXRhbCBpL28gcG9ydCBvbiB0aGUgZGV2aWNlLgorICogQHBhcmFtIGN0cmxfcmVnX2xvY2sgU3BpbiBsb2NrIHByb3RlY3RpbmcgdGhlIGNvbnRyb2wgcmVnaXN0ZXIuCisgKgorICogQHJldHVybiBQb2ludGVyIHRvIG5ldyBpbnN0YW5jZSBvbiBzdWNjZXNzLlxuCisgKiBOVUxMIG9uIGVycm9yLgorICovCittZTYwMDBfZGlvX3N1YmRldmljZV90ICptZTYwMDBfZGlvX2NvbnN0cnVjdG9yKHVpbnQzMl90IHJlZ19iYXNlLAorCQkJCQkgICAgICAgdW5zaWduZWQgaW50IGRpb19pZHgsCisJCQkJCSAgICAgICBzcGlubG9ja190ICogY3RybF9yZWdfbG9jayk7CisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU2MDAwX2Rpb19yZWcuaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTYwMDBfZGlvX3JlZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2N2E3OTEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU2MDAwX2Rpb19yZWcuaApAQCAtMCwwICsxLDQzIEBACisvKioKKyAqIEBmaWxlIG1lNjAwMF9kaW9fcmVnLmgKKyAqCisgKiBAYnJpZWYgTUUtNjAwMCBkaWdpdGFsIGlucHV0L291dHB1dCBzdWJkZXZpY2UgcmVnaXN0ZXIgZGVmaW5pdGlvbnMuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfTUU2MDAwX0RJT19SRUdfSF8KKyNkZWZpbmUgX01FNjAwMF9ESU9fUkVHX0hfCisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKyNkZWZpbmUgTUU2MDAwX0RJT19DVFJMX1JFRwkJCQkweDAwCS8vIFIvVworI2RlZmluZSBNRTYwMDBfRElPX1BPUlRfMF9SRUcJCQkweDAxCS8vIFIvVworI2RlZmluZSBNRTYwMDBfRElPX1BPUlRfMV9SRUcJCQkweDAyCS8vIFIvVworI2RlZmluZSBNRTYwMDBfRElPX1BPUlRfUkVHCQkJCU1FNjAwMF9ESU9fUE9SVF8wX1JFRwkvLyBSL1cKKworI2RlZmluZSBNRTYwMDBfRElPX0NUUkxfQklUX01PREVfMAkJMHgwMQorI2RlZmluZSBNRTYwMDBfRElPX0NUUkxfQklUX01PREVfMQkJMHgwMgorI2RlZmluZSBNRTYwMDBfRElPX0NUUkxfQklUX01PREVfMgkJMHgwNAorI2RlZmluZSBNRTYwMDBfRElPX0NUUkxfQklUX01PREVfMwkJMHgwOAorCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lNjAwMF9yZWcuaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTYwMDBfcmVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDM1MjczMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTYwMDBfcmVnLmgKQEAgLTAsMCArMSwzNSBAQAorLyoqCisgKiBAZmlsZSBtZTYwMDBfcmVnLmgKKyAqCisgKiBAYnJpZWYgTUUtNjAwMCBkZXZpY2UgcmVnaXN0ZXIgZGVmaW5pdGlvbnMuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfTUU2MDAwX1JFR19IXworI2RlZmluZSBfTUU2MDAwX1JFR19IXworCisjaWZkZWYgX19LRVJORUxfXworCisjZGVmaW5lIE1FNjAwMF9JTklUX1hJTElOWF9SRUcJCTB4QUMJLy8gUi8tCisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU4MTAwX2RldmljZS5jIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODEwMF9kZXZpY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmI3OWU0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODEwMF9kZXZpY2UuYwpAQCAtMCwwICsxLDE4NyBAQAorLyoqCisgKiBAZmlsZSBtZTgxMDBfZGV2aWNlLmMKKyAqCisgKiBAYnJpZWYgTUUtODEwMCBkZXZpY2UgY2xhc3MgaW1wbGVtZW50YXRpb24uCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0tFUk5FTF9fCisjICBkZWZpbmUgX19LRVJORUxfXworI2VuZGlmCisKKyNpZm5kZWYgTU9EVUxFCisjICBkZWZpbmUgTU9EVUxFCisjZW5kaWYKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCisjaW5jbHVkZSAibWVpZHMuaCIKKyNpbmNsdWRlICJtZWVycm9yLmgiCisjaW5jbHVkZSAibWVjb21tb24uaCIKKyNpbmNsdWRlICJtZWludGVybmFsLmgiCisKKyNpbmNsdWRlICJtZWRlYnVnLmgiCisjaW5jbHVkZSAibWVkZXZpY2UuaCIKKyNpbmNsdWRlICJtZTgxMDBfZGV2aWNlLmgiCisjaW5jbHVkZSAibWVzdWJkZXZpY2UuaCIKKyNpbmNsdWRlICJtZTgxMDBfZGkuaCIKKyNpbmNsdWRlICJtZTgxMDBfZG8uaCIKKyNpbmNsdWRlICJtZTgyNTQuaCIKKworbWVfZGV2aWNlX3QgKm1lODEwMF9wY2lfY29uc3RydWN0b3Ioc3RydWN0IHBjaV9kZXYgKnBjaV9kZXZpY2UpCit7CisJbWU4MTAwX2RldmljZV90ICptZTgxMDBfZGV2aWNlOworCW1lX3N1YmRldmljZV90ICpzdWJkZXZpY2U7CisJdW5zaWduZWQgaW50IHZlcnNpb25faWR4OworCWludCBlcnI7CisJaW50IGk7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwkvLyBBbGxvY2F0ZSBzdHJ1Y3R1cmUgZm9yIGRldmljZSBpbnN0YW5jZS4KKwltZTgxMDBfZGV2aWNlID0ga21hbGxvYyhzaXplb2YobWU4MTAwX2RldmljZV90KSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIW1lODEwMF9kZXZpY2UpIHsKKwkJUEVSUk9SKCJDYW5ub3QgZ2V0IG1lbW9yeSBmb3IgZGV2aWNlIGluc3RhbmNlLlxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCW1lbXNldChtZTgxMDBfZGV2aWNlLCAwLCBzaXplb2YobWU4MTAwX2RldmljZV90KSk7CisKKwkvLyBJbml0aWFsaXplIGJhc2UgY2xhc3Mgc3RydWN0dXJlLgorCWVyciA9IG1lX2RldmljZV9wY2lfaW5pdCgobWVfZGV2aWNlX3QgKikgbWU4MTAwX2RldmljZSwgcGNpX2RldmljZSk7CisKKwlpZiAoZXJyKSB7CisJCWtmcmVlKG1lODEwMF9kZXZpY2UpOworCQlQRVJST1IoIkNhbm5vdCBpbml0aWFsaXplIGRldmljZSBiYXNlIGNsYXNzLlxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCS8qIEdldCB0aGUgaW5kZXggaW4gdGhlIGRldmljZSB2ZXJzaW9uIGluZm9ybWF0aW9uIHRhYmxlLiAqLworCXZlcnNpb25faWR4ID0KKwkgICAgbWU4MTAwX3ZlcnNpb25zX2dldF9kZXZpY2VfaW5kZXgobWU4MTAwX2RldmljZS0+YmFzZS5pbmZvLnBjaS4KKwkJCQkJICAgICBkZXZpY2VfaWQpOworCisJLy8gSW5pdGlhbGl6ZSBzcGluIGxvY2sgLgorCXNwaW5fbG9ja19pbml0KCZtZTgxMDBfZGV2aWNlLT5kaW9fY3RybF9yZWdfbG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJm1lODEwMF9kZXZpY2UtPmN0cl9jdHJsX3JlZ19sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmbWU4MTAwX2RldmljZS0+Y2xrX3NyY19yZWdfbG9jayk7CisKKwkvLyBDcmVhdGUgc3ViZGV2aWNlIGluc3RhbmNlcy4KKworCWZvciAoaSA9IDA7IGkgPCBtZTgxMDBfdmVyc2lvbnNbdmVyc2lvbl9pZHhdLmRpX3N1YmRldmljZXM7IGkrKykgeworCQlzdWJkZXZpY2UgPQorCQkgICAgKG1lX3N1YmRldmljZV90ICopIG1lODEwMF9kaV9jb25zdHJ1Y3RvcihtZTgxMDBfZGV2aWNlLT4KKwkJCQkJCQkgICAgIGJhc2UuaW5mby5wY2kuCisJCQkJCQkJICAgICByZWdfYmFzZXNbMl0sCisJCQkJCQkJICAgICBtZTgxMDBfZGV2aWNlLT4KKwkJCQkJCQkgICAgIGJhc2UuaW5mby5wY2kuCisJCQkJCQkJICAgICByZWdfYmFzZXNbMV0sIGksCisJCQkJCQkJICAgICBtZTgxMDBfZGV2aWNlLT4KKwkJCQkJCQkgICAgIGJhc2UuaXJxLAorCQkJCQkJCSAgICAgJm1lODEwMF9kZXZpY2UtPgorCQkJCQkJCSAgICAgZGlvX2N0cmxfcmVnX2xvY2spOworCisJCWlmICghc3ViZGV2aWNlKSB7CisJCQltZV9kZXZpY2VfZGVpbml0KChtZV9kZXZpY2VfdCAqKSBtZTgxMDBfZGV2aWNlKTsKKwkJCWtmcmVlKG1lODEwMF9kZXZpY2UpOworCQkJUEVSUk9SKCJDYW5ub3QgZ2V0IG1lbW9yeSBmb3Igc3ViZGV2aWNlLlxuIik7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJCW1lX3NsaXN0X2FkZF9zdWJkZXZpY2VfdGFpbCgmbWU4MTAwX2RldmljZS0+YmFzZS5zbGlzdCwKKwkJCQkJICAgIHN1YmRldmljZSk7CisJfQorCisJZm9yIChpID0gMDsgaSA8IG1lODEwMF92ZXJzaW9uc1t2ZXJzaW9uX2lkeF0uZG9fc3ViZGV2aWNlczsgaSsrKSB7CisJCXN1YmRldmljZSA9CisJCSAgICAobWVfc3ViZGV2aWNlX3QgKikgbWU4MTAwX2RvX2NvbnN0cnVjdG9yKG1lODEwMF9kZXZpY2UtPgorCQkJCQkJCSAgICAgYmFzZS5pbmZvLnBjaS4KKwkJCQkJCQkgICAgIHJlZ19iYXNlc1syXSwgaSwKKwkJCQkJCQkgICAgICZtZTgxMDBfZGV2aWNlLT4KKwkJCQkJCQkgICAgIGRpb19jdHJsX3JlZ19sb2NrKTsKKworCQlpZiAoIXN1YmRldmljZSkgeworCQkJbWVfZGV2aWNlX2RlaW5pdCgobWVfZGV2aWNlX3QgKikgbWU4MTAwX2RldmljZSk7CisJCQlrZnJlZShtZTgxMDBfZGV2aWNlKTsKKwkJCVBFUlJPUigiQ2Fubm90IGdldCBtZW1vcnkgZm9yIHN1YmRldmljZS5cbiIpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKworCQltZV9zbGlzdF9hZGRfc3ViZGV2aWNlX3RhaWwoJm1lODEwMF9kZXZpY2UtPmJhc2Uuc2xpc3QsCisJCQkJCSAgICBzdWJkZXZpY2UpOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBtZTgxMDBfdmVyc2lvbnNbdmVyc2lvbl9pZHhdLmN0cl9zdWJkZXZpY2VzOyBpKyspIHsKKwkJc3ViZGV2aWNlID0KKwkJICAgIChtZV9zdWJkZXZpY2VfdCAqKSBtZTgyNTRfY29uc3RydWN0b3IobWU4MTAwX2RldmljZS0+YmFzZS4KKwkJCQkJCQkgIGluZm8ucGNpLmRldmljZV9pZCwKKwkJCQkJCQkgIG1lODEwMF9kZXZpY2UtPmJhc2UuCisJCQkJCQkJICBpbmZvLnBjaS5yZWdfYmFzZXNbMl0sCisJCQkJCQkJICAwLCBpLAorCQkJCQkJCSAgJm1lODEwMF9kZXZpY2UtPgorCQkJCQkJCSAgY3RyX2N0cmxfcmVnX2xvY2ssCisJCQkJCQkJICAmbWU4MTAwX2RldmljZS0+CisJCQkJCQkJICBjbGtfc3JjX3JlZ19sb2NrKTsKKworCQlpZiAoIXN1YmRldmljZSkgeworCQkJbWVfZGV2aWNlX2RlaW5pdCgobWVfZGV2aWNlX3QgKikgbWU4MTAwX2RldmljZSk7CisJCQlrZnJlZShtZTgxMDBfZGV2aWNlKTsKKwkJCVBFUlJPUigiQ2Fubm90IGdldCBtZW1vcnkgZm9yIHN1YmRldmljZS5cbiIpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKworCQltZV9zbGlzdF9hZGRfc3ViZGV2aWNlX3RhaWwoJm1lODEwMF9kZXZpY2UtPmJhc2Uuc2xpc3QsCisJCQkJCSAgICBzdWJkZXZpY2UpOworCX0KKworCXJldHVybiAobWVfZGV2aWNlX3QgKikgbWU4MTAwX2RldmljZTsKK30KKworLy8gSW5pdCBhbmQgZXhpdCBvZiBtb2R1bGUuCisKK3N0YXRpYyBpbnQgX19pbml0IG1lODEwMF9pbml0KHZvaWQpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbi4iKTsKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIHZvaWQgX19leGl0IG1lODEwMF9leGl0KHZvaWQpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbi4iKTsKK30KKworbW9kdWxlX2luaXQobWU4MTAwX2luaXQpOworCittb2R1bGVfZXhpdChtZTgxMDBfZXhpdCk7CisKKy8vIEFkbWluaXN0cmF0aXZlIHN0dWZmIGZvciBtb2RpbmZvLgorTU9EVUxFX0FVVEhPUigiR3VlbnRlciBHZWJoYXJkdCA8Zy5nZWJoYXJkdEBtZWlsaGF1cy5kZT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiRGV2aWNlIERyaXZlciBNb2R1bGUgZm9yIFRlbXBsYXRlIERldmljZSIpOworTU9EVUxFX1NVUFBPUlRFRF9ERVZJQ0UoIk1laWxoYXVzIFRlbXBsYXRlIERldmljZXMiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworLy8gRXhwb3J0IHRoZSBjb25zdHJ1Y3Rvci4KK0VYUE9SVF9TWU1CT0wobWU4MTAwX3BjaV9jb25zdHJ1Y3Rvcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU4MTAwX2RldmljZS5oIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODEwMF9kZXZpY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NGM0MmVmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODEwMF9kZXZpY2UuaApAQCAtMCwwICsxLDk3IEBACisvKioKKyAqIEBmaWxlIG1lODEwMF9kZXZpY2UuaAorICoKKyAqIEBicmllZiBNRS04MTAwIGRldmljZSBjbGFzcy4KKyAqIEBub3RlIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKiBAYXV0aG9yIEd1ZW50ZXIgR2ViaGFyZHQKKyAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9NRTgxMDBfREVWSUNFX0gKKyNkZWZpbmUgX01FODEwMF9ERVZJQ0VfSAorCisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKworI2luY2x1ZGUgIm1lZGV2aWNlLmgiCisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKy8qKgorICogQGJyaWVmIFN0cnVjdHVyZSBob2xkaW5nIE1FLTgxMDAgZGV2aWNlIGNhcGFiaWxpdGllcy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgbWU4MTAwX3ZlcnNpb24geworCXVpbnQxNl90IGRldmljZV9pZDsKKwl1bnNpZ25lZCBpbnQgZGlfc3ViZGV2aWNlczsKKwl1bnNpZ25lZCBpbnQgZG9fc3ViZGV2aWNlczsKKwl1bnNpZ25lZCBpbnQgY3RyX3N1YmRldmljZXM7Cit9IG1lODEwMF92ZXJzaW9uX3Q7CisKKy8qKgorICogQGJyaWVmIERldmljZSBjYXBhYmlsaXRpZXMuCisgKi8KK3N0YXRpYyBtZTgxMDBfdmVyc2lvbl90IG1lODEwMF92ZXJzaW9uc1tdID0geworCXtQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FODEwMF9BLCAxLCAxLCAzfSwKKwl7UENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTgxMDBfQiwgMiwgMiwgM30sCisJezB9LAorfTsKKworI2RlZmluZSBNRTgxMDBfREVWSUNFX1ZFUlNJT05TIChzaXplb2YobWU4MTAwX3ZlcnNpb25zKSAvIHNpemVvZihtZTgxMDBfdmVyc2lvbl90KSAtIDEpCS8qKjwgUmV0dXJucyB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaW4gI21lODEwMF92ZXJzaW9ucy4gKi8KKworLyoqCisgKiBAYnJpZWYgUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGRldmljZSBlbnRyeSBpbiAjbWU4MTAwX3ZlcnNpb25zLgorICoKKyAqIEBwYXJhbSBkZXZpY2VfaWQgVGhlIFBDSSBkZXZpY2UgaWQgb2YgdGhlIGRldmljZSB0byBxdWVyeS4KKyAqIEByZXR1cm4gVGhlIGluZGV4IG9mIHRoZSBkZXZpY2UgaW4gI21lODEwMF92ZXJzaW9ucy4KKyAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgbWU4MTAwX3ZlcnNpb25zX2dldF9kZXZpY2VfaW5kZXgodWludDE2X3QgZGV2aWNlX2lkKQoreworCXVuc2lnbmVkIGludCBpOworCWZvciAoaSA9IDA7IGkgPCBNRTgxMDBfREVWSUNFX1ZFUlNJT05TOyBpKyspCisJCWlmIChtZTgxMDBfdmVyc2lvbnNbaV0uZGV2aWNlX2lkID09IGRldmljZV9pZCkKKwkJCWJyZWFrOworCXJldHVybiBpOworfQorCisvKioKKyAqIEBicmllZiBUaGUgTUUtODEwMCBkZXZpY2UgY2xhc3Mgc3RydWN0dXJlLgorICovCit0eXBlZGVmIHN0cnVjdCBtZTgxMDBfZGV2aWNlIHsKKwltZV9kZXZpY2VfdCBiYXNlOwkJCS8qKjwgVGhlIE1laWxoYXVzIGRldmljZSBiYXNlIGNsYXNzLiAqLworCisJLyogQ2hpbGQgY2xhc3MgYXR0cmlidXRlcy4gKi8KKwlzcGlubG9ja190IGRpb19jdHJsX3JlZ19sb2NrOworCXNwaW5sb2NrX3QgY3RyX2N0cmxfcmVnX2xvY2s7CisJc3BpbmxvY2tfdCBjbGtfc3JjX3JlZ19sb2NrOworfSBtZTgxMDBfZGV2aWNlX3Q7CisKKy8qKgorICogQGJyaWVmIFRoZSBNRS04MTAwIGRldmljZSBjbGFzcyBjb25zdHJ1Y3Rvci4KKyAqCisgKiBAcGFyYW0gcGNpX2RldmljZSBUaGUgcGNpIGRldmljZSBzdHJ1Y3R1cmUgZ2l2ZW4gYnkgdGhlIFBDSSBzdWJzeXN0ZW0uCisgKgorICogQHJldHVybiBPbiBzdWNjZXMgYSBuZXcgTUUtODEwMCBkZXZpY2UgaW5zdGFuY2UuIFxuCisgKiAgICAgICAgIE5VTEwgb24gZXJyb3IuCisgKi8KK21lX2RldmljZV90ICptZTgxMDBfcGNpX2NvbnN0cnVjdG9yKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2aWNlKQorICAgIF9fYXR0cmlidXRlX18gKCh3ZWFrKSk7CisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU4MTAwX2RpLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU4MTAwX2RpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTcxNzI3YwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTgxMDBfZGkuYwpAQCAtMCwwICsxLDY5MyBAQAorLyoqCisgKiBAZmlsZSBtZTgxMDBfZGkuYworICoKKyAqIEBicmllZiBNRS04MTAwIGRpZ2l0YWwgaW5wdXQgc3ViZGV2aWNlIGluc3RhbmNlLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICogQGF1dGhvciBLcnp5c3p0b2YgR2FudHprZQkoay5nYW50emtlQG1laWxoYXVzLmRlKQorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX19LRVJORUxfXworIyAgZGVmaW5lIF9fS0VSTkVMX18KKyNlbmRpZgorCisvKgorICogSW5jbHVkZXMKKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisKKyNpbmNsdWRlICJtZWRlZmluZXMuaCIKKyNpbmNsdWRlICJtZWVycm9yLmgiCisKKyNpbmNsdWRlICJtZWlkcy5oIgorI2luY2x1ZGUgIm1lZGVidWcuaCIKKyNpbmNsdWRlICJtZXBseF9yZWcuaCIKKyNpbmNsdWRlICJtZTgxMDBfcmVnLmgiCisjaW5jbHVkZSAibWU4MTAwX2RpX3JlZy5oIgorI2luY2x1ZGUgIm1lODEwMF9kaS5oIgorCisvKgorICogRGVmaW5lcworICovCisKKy8qCisgKiBGdW5jdGlvbnMKKyAqLworCitzdGF0aWMgaW50IG1lODEwMF9kaV9pb19yZXNldF9zdWJkZXZpY2Uoc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlLAorCQkJCQlzdHJ1Y3QgZmlsZSAqZmlsZXAsIGludCBmbGFncykKK3sKKwltZTgxMDBfZGlfc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCXVuc2lnbmVkIHNob3J0IGN0cmw7CisJdW5zaWduZWQgbG9uZyBjcHVfZmxhZ3M7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbnN0YW5jZSA9IChtZTgxMDBfZGlfc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJaWYgKGZsYWdzKSB7CisJCVBFUlJPUigiSW52YWxpZCBmbGFnIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCXNwaW5fbG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisJY3RybCA9IGludyhpbnN0YW5jZS0+Y3RybF9yZWcpOworCWN0cmwgJj0gfihNRTgxMDBfRElPX0NUUkxfQklUX0lOVEJfMSB8IE1FODEwMF9ESU9fQ1RSTF9CSVRfSU5UQl8wKTsKKwlvdXR3KGN0cmwsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIGN0cmwpOworCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrKTsKKworCW91dHcoMCwgaW5zdGFuY2UtPm1hc2tfcmVnKTsKKwlQREVCVUdfUkVHKCJtYXNrX3JlZyBvdXR3KDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5tYXNrX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgMCk7CisJb3V0dygwLCBpbnN0YW5jZS0+cGF0dGVybl9yZWcpOworCVBERUJVR19SRUcoInBhdHRlcm5fcmVnIG91dHcoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPnBhdHRlcm5fcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCAwKTsKKwlpbnN0YW5jZS0+cmlzZWQgPSAtMTsKKwlpbnN0YW5jZS0+aXJxX2NvdW50ID0gMDsKKwlpbnN0YW5jZS0+ZmlsdGVyaW5nX2ZsYWcgPSAwOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKworCW91dGwoUExYX0lOVENTUl9MT0NBTF9JTlQxX0VOIHwKKwkgICAgIFBMWF9JTlRDU1JfTE9DQUxfSU5UMV9QT0wgfAorCSAgICAgUExYX0lOVENTUl9MT0NBTF9JTlQyX0VOIHwKKwkgICAgIFBMWF9JTlRDU1JfTE9DQUxfSU5UMl9QT0wgfAorCSAgICAgUExYX0lOVENTUl9QQ0lfSU5UX0VOLCBpbnN0YW5jZS0+aXJxX3N0YXR1c19yZWcpOworCVBERUJVR19SRUcoInBseDppcnFfc3RhdHVzX3JlZyBvdXRsKDB4JWxYKT0weCV4XG4iLAorCQkgICBpbnN0YW5jZS0+aXJxX3N0YXR1c19yZWcsCisJCSAgIFBMWF9JTlRDU1JfTE9DQUxfSU5UMV9FTiB8IFBMWF9JTlRDU1JfTE9DQUxfSU5UMV9QT0wgfAorCQkgICBQTFhfSU5UQ1NSX0xPQ0FMX0lOVDJfRU4gfCBQTFhfSU5UQ1NSX0xPQ0FMX0lOVDJfUE9MIHwKKwkJICAgUExYX0lOVENTUl9QQ0lfSU5UX0VOKTsKKworCXdha2VfdXBfaW50ZXJydXB0aWJsZV9hbGwoJmluc3RhbmNlLT53YWl0X3F1ZXVlKTsKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lODEwMF9kaV9pb19pcnFfc3RhcnQobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICBpbnQgY2hhbm5lbCwKKwkJCQkgIGludCBpcnFfc291cmNlLAorCQkJCSAgaW50IGlycV9lZGdlLCBpbnQgaXJxX2FyZywgaW50IGZsYWdzKQoreworCW1lODEwMF9kaV9zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJdWludDE2X3QgY3RybDsKKwl1bnNpZ25lZCBsb25nIGNwdV9mbGFnczsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lODEwMF9kaV9zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlpZiAoaXJxX3NvdXJjZSA9PSBNRV9JUlFfU09VUkNFX0RJT19QQVRURVJOKSB7CisJCWlmIChmbGFncyAmCisJCSAgICB+KE1FX0lPX0lSUV9TVEFSVF9QQVRURVJOX0ZJTFRFUklORyB8CisJCSAgICAgIE1FX0lPX0lSUV9TVEFSVF9ESU9fV09SRCkpIHsKKwkJCVBFUlJPUigiSW52YWxpZCBmbGFnIHNwZWNpZmllZC5cbiIpOworCQkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJCX0KKworCQlpZiAoaXJxX2VkZ2UgIT0gTUVfSVJRX0VER0VfTk9UX1VTRUQpIHsKKwkJCVBFUlJPUigiSW52YWxpZCBpcnEgZWRnZSBzcGVjaWZpZWQuXG4iKTsKKwkJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0lSUV9FREdFOworCQl9CisJfSBlbHNlIGlmIChpcnFfc291cmNlID09IE1FX0lSUV9TT1VSQ0VfRElPX01BU0spIHsKKwkJaWYgKGZsYWdzICYKKwkJICAgIH4oTUVfSU9fSVJRX1NUQVJUX0VYVEVOREVEX1NUQVRVUyB8CisJCSAgICAgIE1FX0lPX0lSUV9TVEFSVF9ESU9fV09SRCkpIHsKKwkJCVBFUlJPUigiSW52YWxpZCBmbGFnIHNwZWNpZmllZC5cbiIpOworCQkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJCX0KKworCQlpZiAoaXJxX2VkZ2UgIT0gTUVfSVJRX0VER0VfQU5ZKSB7CisJCQlQRVJST1IoIkludmFsaWQgaXJxIGVkZ2Ugc3BlY2lmaWVkLlxuIik7CisJCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9JUlFfRURHRTsKKwkJfQorCisJCWlmICghKGlycV9hcmcgJiAweEZGRkYpKSB7CisJCQlQRVJST1IoIk5vIG1hc2sgc3BlY2lmaWVkLlxuIik7CisJCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9JUlFfQVJHOworCQl9CisJfSBlbHNlIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGlycSBzb3VyY2Ugc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0lSUV9TT1VSQ0U7CisJfQorCisJaWYgKGNoYW5uZWwpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGNoYW5uZWwgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJfQorCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKwlpZiAoaXJxX3NvdXJjZSA9PSBNRV9JUlFfU09VUkNFX0RJT19QQVRURVJOKSB7CisJCW91dHcoaXJxX2FyZywgaW5zdGFuY2UtPnBhdHRlcm5fcmVnKTsKKwkJaW5zdGFuY2UtPmNvbXBhcmVfdmFsdWUgPSBpcnFfYXJnOworCQlpbnN0YW5jZS0+ZmlsdGVyaW5nX2ZsYWcgPQorCQkgICAgKGZsYWdzICYgTUVfSU9fSVJRX1NUQVJUX1BBVFRFUk5fRklMVEVSSU5HKSA/IDEgOiAwOworCX0KKwlpZiAoaXJxX3NvdXJjZSA9PSBNRV9JUlFfU09VUkNFX0RJT19NQVNLKSB7CisJCW91dHcoaXJxX2FyZywgaW5zdGFuY2UtPm1hc2tfcmVnKTsKKwl9CisKKwlzcGluX2xvY2soaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2spOworCWN0cmwgPSBpbncoaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwljdHJsIHw9IE1FODEwMF9ESU9fQ1RSTF9CSVRfSU5UQl8wOworCWlmIChpcnFfc291cmNlID09IE1FX0lSUV9TT1VSQ0VfRElPX1BBVFRFUk4pIHsKKwkJY3RybCAmPSB+TUU4MTAwX0RJT19DVFJMX0JJVF9JTlRCXzE7CisJfQorCisJaWYgKGlycV9zb3VyY2UgPT0gTUVfSVJRX1NPVVJDRV9ESU9fTUFTSykgeworCQljdHJsIHw9IE1FODEwMF9ESU9fQ1RSTF9CSVRfSU5UQl8xOworCX0KKwlvdXR3KGN0cmwsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0dygweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIGN0cmwpOworCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrKTsKKworCWluc3RhbmNlLT5yaXNlZCA9IDA7CisJaW5zdGFuY2UtPnN0YXR1c192YWx1ZSA9IDA7CisJaW5zdGFuY2UtPnN0YXR1c192YWx1ZV9lZGdlcyA9IDA7CisJaW5zdGFuY2UtPmxpbmVfdmFsdWUgPSBpbncoaW5zdGFuY2UtPnBvcnRfcmVnKTsKKwlpbnN0YW5jZS0+c3RhdHVzX2ZsYWcgPSBmbGFncyAmIE1FX0lPX0lSUV9TVEFSVF9FWFRFTkRFRF9TVEFUVVM7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lODEwMF9kaV9pb19pcnFfd2FpdChtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSBpbnQgY2hhbm5lbCwKKwkJCQkgaW50ICppcnFfY291bnQsCisJCQkJIGludCAqdmFsdWUsIGludCB0aW1lX291dCwgaW50IGZsYWdzKQoreworCW1lODEwMF9kaV9zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJbG9uZyB0ID0gMDsKKwl1bnNpZ25lZCBsb25nIGNwdV9mbGFnczsKKwlpbnQgY291bnQ7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJUERFVkVMT1AoIlBJRDogJWQuXG4iLCBjdXJyZW50LT5waWQpOworCisJaW5zdGFuY2UgPSAobWU4MTAwX2RpX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCWlmIChmbGFncyAmCisJICAgIH4oTUVfSU9fSVJRX1dBSVRfTk9STUFMX1NUQVRVUyB8IE1FX0lPX0lSUV9XQUlUX0VYVEVOREVEX1NUQVRVUykpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWcgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCWlmIChjaGFubmVsKSB7CisJCVBFUlJPUigiSW52YWxpZCBjaGFubmVsIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCX0KKworCWlmICh0aW1lX291dCA8IDApIHsKKwkJUEVSUk9SKCJJbnZhbGlkIHRpbWVfb3V0IHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9USU1FT1VUOworCX0KKworCWlmICh0aW1lX291dCkgeworCQl0ID0gKHRpbWVfb3V0ICogSFopIC8gMTAwMDsKKworCQlpZiAodCA9PSAwKQorCQkJdCA9IDE7CisJfQorCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJaWYgKGluc3RhbmNlLT5yaXNlZCA8PSAwKSB7CisJCWluc3RhbmNlLT5yaXNlZCA9IDA7CisJCWNvdW50ID0gaW5zdGFuY2UtPmlycV9jb3VudDsKKworCQlpZiAodGltZV9vdXQpIHsKKwkJCXQgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChpbnN0YW5jZS0+CisJCQkJCQkJICAgICB3YWl0X3F1ZXVlLAorCQkJCQkJCSAgICAgKChjb3VudCAhPQorCQkJCQkJCSAgICAgICBpbnN0YW5jZS0+CisJCQkJCQkJICAgICAgIGlycV9jb3VudCkKKwkJCQkJCQkgICAgICB8fCAoaW5zdGFuY2UtPgorCQkJCQkJCQkgIHJpc2VkIDwgMCkpLAorCQkJCQkJCSAgICAgdCk7CisvLyAgICAgICAgICAgICAgICAgICAgICB0ID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoaW5zdGFuY2UtPndhaXRfcXVldWUsIChpbnN0YW5jZS0+cmlzZWQgIT0gMCksIHQpOworCQkJaWYgKHQgPT0gMCkgeworCQkJCVBFUlJPUigiV2FpdCBvbiBpbnRlcnJ1cHQgdGltZWQgb3V0LlxuIik7CisJCQkJZXJyID0gTUVfRVJSTk9fVElNRU9VVDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShpbnN0YW5jZS0+d2FpdF9xdWV1ZSwKKwkJCQkJCSAoKGNvdW50ICE9IGluc3RhbmNlLT5pcnFfY291bnQpCisJCQkJCQkgIHx8IChpbnN0YW5jZS0+cmlzZWQgPCAwKSkpOworLy8gICAgICAgICAgICAgICAgICAgICAgd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGluc3RhbmNlLT53YWl0X3F1ZXVlLCAoaW5zdGFuY2UtPnJpc2VkICE9IDApKTsKKwkJfQorCisJCWlmIChpbnN0YW5jZS0+cmlzZWQgPCAwKSB7CisJCQlQRVJST1IoIldhaXQgb24gaW50ZXJydXB0IGFib3J0ZWQgYnkgdXNlci5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fQ0FOQ0VMTEVEOworCQl9CisJfQorCisJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCVBFUlJPUigiV2FpdCBvbiBpbnRlcnJ1cHQgYWJvcnRlZCBieSBzaWduYWwuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fU0lHTkFMOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisJKmlycV9jb3VudCA9IGluc3RhbmNlLT5pcnFfY291bnQ7CisJaWYgKCFlcnIpIHsKKwkJaWYgKGZsYWdzICYgTUVfSU9fSVJRX1dBSVRfTk9STUFMX1NUQVRVUykgeworCQkJKnZhbHVlID0gaW5zdGFuY2UtPnN0YXR1c192YWx1ZTsKKwkJfSBlbHNlIGlmIChmbGFncyAmIE1FX0lPX0lSUV9XQUlUX0VYVEVOREVEX1NUQVRVUykgeworCQkJKnZhbHVlID0gaW5zdGFuY2UtPnN0YXR1c192YWx1ZV9lZGdlczsKKwkJfSBlbHNlIHsJLy8gVXNlIGRlZmF1bHQKKwkJCWlmICghaW5zdGFuY2UtPnN0YXR1c19mbGFnKSB7CisJCQkJKnZhbHVlID0gaW5zdGFuY2UtPnN0YXR1c192YWx1ZTsKKwkJCX0gZWxzZSB7CisJCQkJKnZhbHVlID0gaW5zdGFuY2UtPnN0YXR1c192YWx1ZV9lZGdlczsKKwkJCX0KKwkJfQorCQlpbnN0YW5jZS0+cmlzZWQgPSAwOworLyoKKwkJCWluc3RhbmNlLT5zdGF0dXNfdmFsdWUgPSAwOworCQkJaW5zdGFuY2UtPnN0YXR1c192YWx1ZV9lZGdlcyA9IDA7CisqLworCX0gZWxzZSB7CisJCSp2YWx1ZSA9IDA7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZTgxMDBfZGlfaW9faXJxX3N0b3AobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJIHN0cnVjdCBmaWxlICpmaWxlcCwgaW50IGNoYW5uZWwsIGludCBmbGFncykKK3sKKwltZTgxMDBfZGlfc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCXVpbnQxNl90IGN0cmw7CisJdW5zaWduZWQgbG9uZyBjcHVfZmxhZ3M7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbnN0YW5jZSA9IChtZTgxMDBfZGlfc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJaWYgKGZsYWdzKSB7CisJCVBFUlJPUigiSW52YWxpZCBmbGFnIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlpZiAoY2hhbm5lbCkgeworCQlQRVJST1IoIkludmFsaWQgY2hhbm5lbCBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwl9CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCXNwaW5fbG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisJY3RybCA9IGludyhpbnN0YW5jZS0+Y3RybF9yZWcpOworCWN0cmwgJj0gfihNRTgxMDBfRElPX0NUUkxfQklUX0lOVEJfMSB8IE1FODEwMF9ESU9fQ1RSTF9CSVRfSU5UQl8wKTsKKwlvdXR3KGN0cmwsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0dygweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIGN0cmwpOworCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrKTsKKwlpbnN0YW5jZS0+cmlzZWQgPSAtMTsKKwlpbnN0YW5jZS0+c3RhdHVzX3ZhbHVlID0gMDsKKwlpbnN0YW5jZS0+c3RhdHVzX3ZhbHVlX2VkZ2VzID0gMDsKKwlpbnN0YW5jZS0+ZmlsdGVyaW5nX2ZsYWcgPSAwOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGVfYWxsKCZpbnN0YW5jZS0+d2FpdF9xdWV1ZSk7CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lODEwMF9kaV9pb19zaW5nbGVfY29uZmlnKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgICBpbnQgY2hhbm5lbCwKKwkJCQkgICAgICBpbnQgc2luZ2xlX2NvbmZpZywKKwkJCQkgICAgICBpbnQgcmVmLAorCQkJCSAgICAgIGludCB0cmlnX2NoYW4sCisJCQkJICAgICAgaW50IHRyaWdfdHlwZSwgaW50IHRyaWdfZWRnZSwgaW50IGZsYWdzKQoreworCW1lODEwMF9kaV9zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbnN0YW5jZSA9IChtZTgxMDBfZGlfc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJc3Bpbl9sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCisJc3dpdGNoIChmbGFncykgeworCWNhc2UgTUVfSU9fU0lOR0xFX0NPTkZJR19OT19GTEFHUzoKKwljYXNlIE1FX0lPX1NJTkdMRV9DT05GSUdfRElPX1dPUkQ6CisJCWlmIChjaGFubmVsID09IDApIHsKKwkJCWlmIChzaW5nbGVfY29uZmlnID09IE1FX1NJTkdMRV9DT05GSUdfRElPX0lOUFVUKSB7CisJCQl9IGVsc2UgeworCQkJCVBFUlJPUgorCQkJCSAgICAoIkludmFsaWQgcG9ydCBjb25maWd1cmF0aW9uIHNwZWNpZmllZC5cbiIpOworCQkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfU0lOR0xFX0NPTkZJRzsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCVBFUlJPUigiSW52YWxpZCBjaGFubmVsIG51bWJlci5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWdzIHNwZWNpZmllZC5cbiIpOworCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCXNwaW5fdW5sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lODEwMF9kaV9pb19zaW5nbGVfcmVhZChtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICBpbnQgY2hhbm5lbCwKKwkJCQkgICAgaW50ICp2YWx1ZSwgaW50IHRpbWVfb3V0LCBpbnQgZmxhZ3MpCit7CisJbWU4MTAwX2RpX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lODEwMF9kaV9zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlzcGluX2xvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisKKwlzd2l0Y2ggKGZsYWdzKSB7CisKKwljYXNlIE1FX0lPX1NJTkdMRV9UWVBFX0RJT19CSVQ6CisJCWlmICgoY2hhbm5lbCA+PSAwKSAmJiAoY2hhbm5lbCA8IDE2KSkgeworCQkJKnZhbHVlID0gaW53KGluc3RhbmNlLT5wb3J0X3JlZykgJiAoMHgxIDw8IGNoYW5uZWwpOworCQl9IGVsc2UgeworCQkJUEVSUk9SKCJJbnZhbGlkIGJpdCBudW1iZXIgc3BlY2lmaWVkLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIE1FX0lPX1NJTkdMRV9UWVBFX0RJT19CWVRFOgorCQlpZiAoY2hhbm5lbCA9PSAwKSB7CisJCQkqdmFsdWUgPSBpbncoaW5zdGFuY2UtPnBvcnRfcmVnKSAmIDB4RkY7CisJCX0gZWxzZSBpZiAoY2hhbm5lbCA9PSAxKSB7CisJCQkqdmFsdWUgPSAoaW53KGluc3RhbmNlLT5wb3J0X3JlZykgPj4gOCkgJiAweEZGOworCQl9IGVsc2UgeworCQkJUEVSUk9SKCJJbnZhbGlkIGJ5dGUgbnVtYmVyIHNwZWNpZmllZC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCQl9CisJCWJyZWFrOworCisJY2FzZSBNRV9JT19TSU5HTEVfTk9fRkxBR1M6CisJY2FzZSBNRV9JT19TSU5HTEVfVFlQRV9ESU9fV09SRDoKKwkJaWYgKGNoYW5uZWwgPT0gMCkgeworCQkJKnZhbHVlID0gaW53KGluc3RhbmNlLT5wb3J0X3JlZyk7CisJCX0gZWxzZSB7CisJCQlQRVJST1IoIkludmFsaWQgd29yZCBudW1iZXIgc3BlY2lmaWVkLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJCX0KKworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCVBFUlJPUigiSW52YWxpZCBmbGFncyBzcGVjaWZpZWQuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlzcGluX3VubG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZTgxMDBfZGlfcXVlcnlfbnVtYmVyX2NoYW5uZWxzKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQkgICBpbnQgKm51bWJlcikKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJKm51bWJlciA9IDE2OworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lODEwMF9kaV9xdWVyeV9zdWJkZXZpY2VfdHlwZShtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJICBpbnQgKnR5cGUsIGludCAqc3VidHlwZSkKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJKnR5cGUgPSBNRV9UWVBFX0RJOworCSpzdWJ0eXBlID0gTUVfU1VCVFlQRV9TSU5HTEU7CisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWU4MTAwX2RpX3F1ZXJ5X3N1YmRldmljZV9jYXBzKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLCBpbnQgKmNhcHMpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCSpjYXBzID0gTUVfQ0FQU19ESU9fQklUX1BBVFRFUk5fSVJRIHwgTUVfQ0FQU19ESU9fQklUX01BU0tfSVJRX0VER0VfQU5ZOworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgdm9pZCBtZTgxMDBfZGlfZGVzdHJ1Y3RvcihzdHJ1Y3QgbWVfc3ViZGV2aWNlICpzdWJkZXZpY2UpCit7CisJbWU4MTAwX2RpX3N1YmRldmljZV90ICppbnN0YW5jZTsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lODEwMF9kaV9zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlmcmVlX2lycShpbnN0YW5jZS0+aXJxLCAodm9pZCAqKWluc3RhbmNlKTsKKwltZV9zdWJkZXZpY2VfZGVpbml0KCZpbnN0YW5jZS0+YmFzZSk7CisJa2ZyZWUoaW5zdGFuY2UpOworfQorCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsIDYsIDE5KQorc3RhdGljIGlycXJldHVybl90IG1lODEwMF9pc3IoaW50IGlycSwgdm9pZCAqZGV2X2lkKQorI2Vsc2UKK3N0YXRpYyBpcnFyZXR1cm5fdCBtZTgxMDBfaXNyKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCisjZW5kaWYKK3sKKwltZTgxMDBfZGlfc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCXVpbnQzMl90IGljc3I7CisKKwl1aW50MTZfdCBpcnFfc3RhdHVzOworCXVpbnQxNl90IGxpbmVfdmFsdWUgPSAwOworCisJdWludDMyX3Qgc3RhdHVzX3ZhbCA9IDA7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbnN0YW5jZSA9IChtZTgxMDBfZGlfc3ViZGV2aWNlX3QgKikgZGV2X2lkOworCisJaWYgKGlycSAhPSBpbnN0YW5jZS0+aXJxKSB7CisJCVBFUlJPUigiSW5jb3JyZWN0IGludGVycnVwdCBudW06ICVkLlxuIiwgaXJxKTsKKwkJcmV0dXJuIElSUV9OT05FOworCX0KKworCWljc3IgPSBpbmwoaW5zdGFuY2UtPmlycV9zdGF0dXNfcmVnKTsKKwlpZiAoaW5zdGFuY2UtPmRpX2lkeCA9PSAwKSB7CisKKwkJaWYgKChpY3NyICYKKwkJICAgICAoUExYX0lOVENTUl9MT0NBTF9JTlQxX1NUQVRFIHwgUExYX0lOVENTUl9QQ0lfSU5UX0VOIHwKKwkJICAgICAgUExYX0lOVENTUl9MT0NBTF9JTlQxX0VOKSkgIT0KKwkJICAgIChQTFhfSU5UQ1NSX0xPQ0FMX0lOVDFfU1RBVEUgfCBQTFhfSU5UQ1NSX1BDSV9JTlRfRU4gfAorCQkgICAgIFBMWF9JTlRDU1JfTE9DQUxfSU5UMV9FTikpIHsKKwkJCVBJTkZPCisJCQkgICAgKCIlbGQgU2hhcmVkIGludGVycnVwdC4gJXMoKTogaWR4PTAgcGx4OmlycV9zdGF0dXNfcmVnPTB4JTA0WFxuIiwKKwkJCSAgICAgamlmZmllcywgX19mdW5jX18sIGljc3IpOworCQkJcmV0dXJuIElSUV9OT05FOworCQl9CisJfSBlbHNlIGlmIChpbnN0YW5jZS0+ZGlfaWR4ID09IDEpIHsKKwkJaWYgKChpY3NyICYKKwkJICAgICAoUExYX0lOVENTUl9MT0NBTF9JTlQyX1NUQVRFIHwgUExYX0lOVENTUl9QQ0lfSU5UX0VOIHwKKwkJICAgICAgUExYX0lOVENTUl9MT0NBTF9JTlQyX0VOKSkgIT0KKwkJICAgIChQTFhfSU5UQ1NSX0xPQ0FMX0lOVDJfU1RBVEUgfCBQTFhfSU5UQ1NSX1BDSV9JTlRfRU4gfAorCQkgICAgIFBMWF9JTlRDU1JfTE9DQUxfSU5UMl9FTikpIHsKKwkJCVBJTkZPCisJCQkgICAgKCIlbGQgU2hhcmVkIGludGVycnVwdC4gJXMoKTogaWR4PTEgcGx4OmlycV9zdGF0dXNfcmVnPTB4JTA0WFxuIiwKKwkJCSAgICAgamlmZmllcywgX19mdW5jX18sIGljc3IpOworCQkJcmV0dXJuIElSUV9OT05FOworCQl9CisJfSBlbHNlIHsKKwkJUEVSUk9SKCIlcygpOldyb25nIGludGVycnVwdCBpZHg9JWQgY3NyPTB4JVguXG4iLCBfX2Z1bmNfXywKKwkJICAgICAgIGluc3RhbmNlLT5kaV9pZHgsIGljc3IpOworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCisJUERFQlVHKCJtZTgxMDBfaXNyKCk6SW50ZXJydXB0IGZyb20gaWR4PSVkIG9jY3VyZWQuXG4iLAorCSAgICAgICBpbnN0YW5jZS0+ZGlfaWR4KTsKKwlzcGluX2xvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisJaW53KGluc3RhbmNlLT5pcnFfcmVzZXRfcmVnKTsKKwlsaW5lX3ZhbHVlID0gaW53KGluc3RhbmNlLT5wb3J0X3JlZyk7CisKKwlpcnFfc3RhdHVzID0gaW5zdGFuY2UtPmxpbmVfdmFsdWUgXiBsaW5lX3ZhbHVlOworCisJLy8gTWFrZSBleHRlbmRlZCBpbmZvcm1hdGlvbi4KKwlzdGF0dXNfdmFsIHw9ICgweDAwRkYgJiAofih1aW50MTZfdCkgaW5zdGFuY2UtPmxpbmVfdmFsdWUgJiBsaW5lX3ZhbHVlKSkgPDwgMTY7CS8vUmFpc2UKKwlzdGF0dXNfdmFsIHw9ICgweDAwRkYgJiAoKHVpbnQxNl90KSBpbnN0YW5jZS0+bGluZV92YWx1ZSAmIH5saW5lX3ZhbHVlKSk7CS8vRmFsbAorCisJaW5zdGFuY2UtPmxpbmVfdmFsdWUgPSBsaW5lX3ZhbHVlOworCisJaWYgKGluc3RhbmNlLT5yaXNlZCA9PSAwKSB7CisJCWluc3RhbmNlLT5zdGF0dXNfdmFsdWUgPSBpcnFfc3RhdHVzOworCQlpbnN0YW5jZS0+c3RhdHVzX3ZhbHVlX2VkZ2VzID0gc3RhdHVzX3ZhbDsKKwl9IGVsc2UgeworCQlpbnN0YW5jZS0+c3RhdHVzX3ZhbHVlIHw9IGlycV9zdGF0dXM7CisJCWluc3RhbmNlLT5zdGF0dXNfdmFsdWVfZWRnZXMgfD0gc3RhdHVzX3ZhbDsKKwl9CisKKwlpZiAoaW5zdGFuY2UtPmZpbHRlcmluZ19mbGFnKSB7CS8vIEZvciBjb21wYXJlIG1vZGUgb25seS4KKwkJaWYgKGluc3RhbmNlLT5jb21wYXJlX3ZhbHVlID09IGluc3RhbmNlLT5saW5lX3ZhbHVlKSB7CisJCQlpbnN0YW5jZS0+cmlzZWQgPSAxOworCQkJaW5zdGFuY2UtPmlycV9jb3VudCsrOworCQl9CisJfSBlbHNlIHsKKwkJaW5zdGFuY2UtPnJpc2VkID0gMTsKKwkJaW5zdGFuY2UtPmlycV9jb3VudCsrOworCX0KKworCXNwaW5fdW5sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCXdha2VfdXBfaW50ZXJydXB0aWJsZV9hbGwoJmluc3RhbmNlLT53YWl0X3F1ZXVlKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworbWU4MTAwX2RpX3N1YmRldmljZV90ICptZTgxMDBfZGlfY29uc3RydWN0b3IodWludDMyX3QgbWU4MTAwX3JlZ19iYXNlLAorCQkJCQkgICAgIHVpbnQzMl90IHBseF9yZWdfYmFzZSwKKwkJCQkJICAgICB1bnNpZ25lZCBpbnQgZGlfaWR4LAorCQkJCQkgICAgIGludCBpcnEsCisJCQkJCSAgICAgc3BpbmxvY2tfdCAqIGN0cmxfcmVnX2xvY2spCit7CisJbWU4MTAwX2RpX3N1YmRldmljZV90ICpzdWJkZXZpY2U7CisJaW50IGVycjsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCS8qIEFsbG9jYXRlIG1lbW9yeSBmb3Igc3ViZGV2aWNlIGluc3RhbmNlICovCisJc3ViZGV2aWNlID0ga21hbGxvYyhzaXplb2YobWU4MTAwX2RpX3N1YmRldmljZV90KSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIXN1YmRldmljZSkgeworCQlQRVJST1IoIkNhbm5vdCBnZXQgbWVtb3J5IGZvciBzdWJkZXZpY2UgaW5zdGFuY2UuXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJbWVtc2V0KHN1YmRldmljZSwgMCwgc2l6ZW9mKG1lODEwMF9kaV9zdWJkZXZpY2VfdCkpOworCisJLyogSW5pdGlhbGl6ZSBzdWJkZXZpY2UgYmFzZSBjbGFzcyAqLworCWVyciA9IG1lX3N1YmRldmljZV9pbml0KCZzdWJkZXZpY2UtPmJhc2UpOworCisJaWYgKGVycikgeworCQlQRVJST1IoIkNhbm5vdCBpbml0aWFsaXplIHN1YmRldmljZSBiYXNlIGNsYXNzIGluc3RhbmNlLlxuIik7CisJCWtmcmVlKHN1YmRldmljZSk7CisJCXJldHVybiBOVUxMOworCX0KKwkvLyBJbml0aWFsaXplIHNwaW4gbG9ja3MuCisJc3Bpbl9sb2NrX2luaXQoJnN1YmRldmljZS0+c3ViZGV2aWNlX2xvY2spOworCisJc3ViZGV2aWNlLT5jdHJsX3JlZ19sb2NrID0gY3RybF9yZWdfbG9jazsKKworCS8qIFNhdmUgdGhlIHN1YmRldmljZSBpbmRleC4gKi8KKwlzdWJkZXZpY2UtPmRpX2lkeCA9IGRpX2lkeDsKKworCS8qIEluaXRpYWxpemUgd2FpdCBxdWV1ZSAqLworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnN1YmRldmljZS0+d2FpdF9xdWV1ZSk7CisKKwkvKiBSZWdpc3RlciBpbnRlcnJ1cHQgc2VydmljZSByb3V0aW5lLiAqLworCXN1YmRldmljZS0+aXJxID0gaXJxOworCWVyciA9IHJlcXVlc3RfaXJxKHN1YmRldmljZS0+aXJxLCBtZTgxMDBfaXNyLAorI2lmZGVmIElSUUZfRElTQUJMRUQKKwkJCSAgSVJRRl9ESVNBQkxFRCB8IElSUUZfU0hBUkVELAorI2Vsc2UKKwkJCSAgU0FfSU5URVJSVVBUIHwgU0FfU0hJUlEsCisjZW5kaWYKKwkJCSAgTUU4MTAwX05BTUUsICh2b2lkICopc3ViZGV2aWNlKTsKKworCWlmIChlcnIpIHsKKwkJUEVSUk9SKCJDYW5ub3QgaW5pdGlhbGl6ZSBzdWJkZXZpY2UgYmFzZSBjbGFzcyBpbnN0YW5jZS5cbiIpOworCQlrZnJlZShzdWJkZXZpY2UpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJUElORk8oIlJlZ2lzdGVyZWQgaXJxPSVkLlxuIiwgc3ViZGV2aWNlLT5pcnEpOworCisJLyogSW5pdGlhbGl6ZSB0aGUgcmVnaXN0ZXJzICovCisJc3ViZGV2aWNlLT5jdHJsX3JlZyA9CisJICAgIG1lODEwMF9yZWdfYmFzZSArIE1FODEwMF9DVFJMX1JFR19BICsgZGlfaWR4ICogTUU4MTAwX1JFR19PRkZTRVQ7CisJc3ViZGV2aWNlLT5wb3J0X3JlZyA9CisJICAgIG1lODEwMF9yZWdfYmFzZSArIE1FODEwMF9ESV9SRUdfQSArIGRpX2lkeCAqIE1FODEwMF9SRUdfT0ZGU0VUOworCXN1YmRldmljZS0+bWFza19yZWcgPQorCSAgICBtZTgxMDBfcmVnX2Jhc2UgKyBNRTgxMDBfTUFTS19SRUdfQSArIGRpX2lkeCAqIE1FODEwMF9SRUdfT0ZGU0VUOworCXN1YmRldmljZS0+cGF0dGVybl9yZWcgPQorCSAgICBtZTgxMDBfcmVnX2Jhc2UgKyBNRTgxMDBfUEFUVEVSTl9SRUdfQSArIGRpX2lkeCAqIE1FODEwMF9SRUdfT0ZGU0VUOworCXN1YmRldmljZS0+ZGluX2ludF9yZWcgPQorCSAgICBtZTgxMDBfcmVnX2Jhc2UgKyBNRTgxMDBfSU5UX0RJX1JFR19BICsgZGlfaWR4ICogTUU4MTAwX1JFR19PRkZTRVQ7CisJc3ViZGV2aWNlLT5pcnFfcmVzZXRfcmVnID0KKwkgICAgbWU4MTAwX3JlZ19iYXNlICsgTUU4MTAwX1JFU19JTlRfUkVHX0EgKyBkaV9pZHggKiBNRTgxMDBfUkVHX09GRlNFVDsKKwlzdWJkZXZpY2UtPmlycV9zdGF0dXNfcmVnID0gcGx4X3JlZ19iYXNlICsgUExYX0lOVENTUjsKKyNpZmRlZiBNRURFQlVHX0RFQlVHX1JFRworCXN1YmRldmljZS0+cmVnX2Jhc2UgPSBtZTgxMDBfcmVnX2Jhc2U7CisjZW5kaWYKKworCS8qIE92ZXJsb2FkIGJhc2UgY2xhc3MgbWV0aG9kcy4gKi8KKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX2lycV9zdGFydCA9IG1lODEwMF9kaV9pb19pcnFfc3RhcnQ7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19pcnFfd2FpdCA9IG1lODEwMF9kaV9pb19pcnFfd2FpdDsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX2lycV9zdG9wID0gbWU4MTAwX2RpX2lvX2lycV9zdG9wOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fcmVzZXRfc3ViZGV2aWNlID0KKwkgICAgbWU4MTAwX2RpX2lvX3Jlc2V0X3N1YmRldmljZTsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3NpbmdsZV9jb25maWcgPQorCSAgICBtZTgxMDBfZGlfaW9fc2luZ2xlX2NvbmZpZzsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3NpbmdsZV9yZWFkID0gbWU4MTAwX2RpX2lvX3NpbmdsZV9yZWFkOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfcXVlcnlfbnVtYmVyX2NoYW5uZWxzID0KKwkgICAgbWU4MTAwX2RpX3F1ZXJ5X251bWJlcl9jaGFubmVsczsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV90eXBlID0KKwkgICAgbWU4MTAwX2RpX3F1ZXJ5X3N1YmRldmljZV90eXBlOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfcXVlcnlfc3ViZGV2aWNlX2NhcHMgPQorCSAgICBtZTgxMDBfZGlfcXVlcnlfc3ViZGV2aWNlX2NhcHM7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9kZXN0cnVjdG9yID0gbWU4MTAwX2RpX2Rlc3RydWN0b3I7CisKKwlzdWJkZXZpY2UtPnJpc2VkID0gMDsKKwlzdWJkZXZpY2UtPmlycV9jb3VudCA9IDA7CisKKwlyZXR1cm4gc3ViZGV2aWNlOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODEwMF9kaS5oIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODEwMF9kaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxZGI3OTEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU4MTAwX2RpLmgKQEAgLTAsMCArMSw4OSBAQAorLyoqCisgKiBAZmlsZSBtZTgxMDBfZGkuaAorICoKKyAqIEBicmllZiBNRS04MTAwIGRpZ2l0YWwgaW5wdXQgc3ViZGV2aWNlIGNsYXNzLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX01FODEwMF9ESV9IXworI2RlZmluZSBfTUU4MTAwX0RJX0hfCisKKyNpbmNsdWRlICJtZXN1YmRldmljZS5oIgorCisjaWZkZWYgX19LRVJORUxfXworCisvKioKKyAqIEBicmllZiBUaGUgdGVtcGxhdGUgc3ViZGV2aWNlIGNsYXNzLgorICovCit0eXBlZGVmIHN0cnVjdCBtZTgxMDBfZGlfc3ViZGV2aWNlIHsKKwkvLyBJbmhlcml0YW5jZQorCW1lX3N1YmRldmljZV90IGJhc2U7CQkJLyoqPCBUaGUgc3ViZGV2aWNlIGJhc2UgY2xhc3MuICovCisKKwkvKiBBdHRyaWJ1dGVzICovCisJc3BpbmxvY2tfdCBzdWJkZXZpY2VfbG9jazsJCS8qKjwgU3BpbiBsb2NrIHRvIHByb3RlY3QgdGhlIHN1YmRldmljZSBmcm9tIGNvbmN1cnJlbnQgYWNjZXNzLiAqLworCXNwaW5sb2NrX3QgKmN0cmxfcmVnX2xvY2s7CisKKwl1bnNpZ25lZCBkaV9pZHg7CisKKwlpbnQgaXJxOworCXZvbGF0aWxlIGludCByaXNlZDsKKwl1bnNpZ25lZCBpbnQgaXJxX2NvdW50OworCisJdWludCBzdGF0dXNfZmxhZzsJCQkJLyoqPCBEZWZhdWx0IGludGVydXB0IHN0YXR1cyBmbGFnICovCisJdWludCBzdGF0dXNfdmFsdWU7CQkJCS8qKjwgSW50ZXJ1cHQgc3RhdHVzICovCisJdWludCBzdGF0dXNfdmFsdWVfZWRnZXM7CQkvKio8IEV4dGVuZGVkIGludGVydXB0IHN0YXR1cyAqLworCXVpbnQgbGluZV92YWx1ZTsKKworCXVpbnQxNl90IGNvbXBhcmVfdmFsdWU7CisJdWludDhfdCBmaWx0ZXJpbmdfZmxhZzsKKworCXdhaXRfcXVldWVfaGVhZF90IHdhaXRfcXVldWU7CisKKwl1bnNpZ25lZCBsb25nIGN0cmxfcmVnOworCXVuc2lnbmVkIGxvbmcgcG9ydF9yZWc7CisJdW5zaWduZWQgbG9uZyBtYXNrX3JlZzsKKwl1bnNpZ25lZCBsb25nIHBhdHRlcm5fcmVnOworCXVuc2lnbmVkIGxvbmcgbG9uZyBkaW5faW50X3JlZzsKKwl1bnNpZ25lZCBsb25nIGlycV9yZXNldF9yZWc7CisJdW5zaWduZWQgbG9uZyBpcnFfc3RhdHVzX3JlZzsKKyNpZmRlZiBNRURFQlVHX0RFQlVHX1JFRworCXVuc2lnbmVkIGxvbmcgcmVnX2Jhc2U7CisjZW5kaWYKKworfSBtZTgxMDBfZGlfc3ViZGV2aWNlX3Q7CisKKy8qKgorICogQGJyaWVmIFRoZSBjb25zdHJ1Y3RvciB0byBnZW5lcmF0ZSBhIE1FLTgxMDAgZGlnaXRhbCBpbnB1dCBzdWJkZXZpY2UgaW5zdGFuY2UuCisgKgorICogQHBhcmFtIHJlZ19iYXNlIFRoZSByZWdpc3RlciBiYXNlIGFkZHJlc3Mgb2YgdGhlIGRldmljZSBhcyByZXR1cm5lZCBieSB0aGUgUENJIEJJT1MuCisgKgorICogQHJldHVybiBQb2ludGVyIHRvIG5ldyBpbnN0YW5jZSBvbiBzdWNjZXNzLlxuCisgKiBOVUxMIG9uIGVycm9yLgorICovCittZTgxMDBfZGlfc3ViZGV2aWNlX3QgKm1lODEwMF9kaV9jb25zdHJ1Y3Rvcih1aW50MzJfdCBtZTgxMDBfcmVnX2Jhc2UsCisJCQkJCSAgICAgdWludDMyX3QgcGx4X3JlZ19iYXNlLAorCQkJCQkgICAgIHVuc2lnbmVkIGludCBkaV9pZHgsCisJCQkJCSAgICAgaW50IGlycSwKKwkJCQkJICAgICBzcGlubG9ja190ICogY3RybF9sZWdfbG9jayk7CisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU4MTAwX2RpX3JlZy5oIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODEwMF9kaV9yZWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjNiZDE5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODEwMF9kaV9yZWcuaApAQCAtMCwwICsxLDQ3IEBACisvKioKKyAqIEBmaWxlIG1lODEwMF9kaV9yZWcuaAorICoKKyAqIEBicmllZiBNRS04MTAwIGRpZ2l0YWwgaW5wdXQgc3ViZGV2aWNlIHJlZ2lzdGVyIGRlZmluaXRpb25zLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX01FODEwMF9ESV9SRUdfSF8KKyNkZWZpbmUgX01FODEwMF9ESV9SRUdfSF8KKworI2lmZGVmIF9fS0VSTkVMX18KKworI2RlZmluZSBNRTgxMDBfUkVTX0lOVF9SRUdfQQkJMHgwMgkvLyhyLCApCisjZGVmaW5lIE1FODEwMF9ESV9SRUdfQQkJCTB4MDQJLy8ociwgKQorI2RlZmluZSBNRTgxMDBfUEFUVEVSTl9SRUdfQQkJMHgwOAkvLyggLHcpCisjZGVmaW5lIE1FODEwMF9NQVNLX1JFR19BCQkweDBBCS8vKCAsdykKKyNkZWZpbmUgTUU4MTAwX0lOVF9ESV9SRUdfQQkJMHgwQQkvLyhyLCApCisKKyNkZWZpbmUgTUU4MTAwX1JFU19JTlRfUkVHX0IJCTB4MEUJLy8ociwgKQorI2RlZmluZSBNRTgxMDBfRElfUkVHX0IJCQkweDEwCS8vKHIsICkKKyNkZWZpbmUgTUU4MTAwX1BBVFRFUk5fUkVHX0IJCTB4MTQJLy8oICx3KQorI2RlZmluZSBNRTgxMDBfTUFTS19SRUdfQgkJMHgxNgkvLyggLHcpCisjZGVmaW5lIE1FODEwMF9JTlRfRElfUkVHX0IJCTB4MTYJLy8ociwgKQorCisjZGVmaW5lIE1FODEwMF9SRUdfT0ZGU0VUCQkweDBDCisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU4MTAwX2RvLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU4MTAwX2RvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU3YjlmOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTgxMDBfZG8uYwpAQCAtMCwwICsxLDM5MSBAQAorLyoqCisgKiBAZmlsZSBtZTgxMDBfZG8uYworICoKKyAqIEBicmllZiBNRS04MTAwIGRpZ2l0YWwgb3V0cHV0IHN1YmRldmljZSBpbnN0YW5jZS4KKyAqIEBub3RlIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKiBAYXV0aG9yIEd1ZW50ZXIgR2ViaGFyZHQKKyAqIEBhdXRob3IgS3J6eXN6dG9mIEdhbnR6a2UJKGsuZ2FudHprZUBtZWlsaGF1cy5kZSkKKyAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9fS0VSTkVMX18KKyMgIGRlZmluZSBfX0tFUk5FTF9fCisjZW5kaWYKKworLyoKKyAqIEluY2x1ZGVzCisgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNpbmNsdWRlICJtZWRlZmluZXMuaCIKKyNpbmNsdWRlICJtZWludGVybmFsLmgiCisjaW5jbHVkZSAibWVlcnJvci5oIgorCisjaW5jbHVkZSAibWVkZWJ1Zy5oIgorI2luY2x1ZGUgIm1lODEwMF9yZWcuaCIKKyNpbmNsdWRlICJtZTgxMDBfZG9fcmVnLmgiCisjaW5jbHVkZSAibWU4MTAwX2RvLmgiCisKKy8qCisgKiBEZWZpbmVzCisgKi8KKworLyoKKyAqIEZ1bmN0aW9ucworICovCisKK3N0YXRpYyBpbnQgbWU4MTAwX2RvX2lvX3Jlc2V0X3N1YmRldmljZShzdHJ1Y3QgbWVfc3ViZGV2aWNlICpzdWJkZXZpY2UsCisJCQkJCXN0cnVjdCBmaWxlICpmaWxlcCwgaW50IGZsYWdzKQoreworCW1lODEwMF9kb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJdWludDE2X3QgY3RybDsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lODEwMF9kb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlpZiAoZmxhZ3MpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWcgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCXNwaW5fbG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKwlzcGluX2xvY2soaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2spOworCWN0cmwgPSBpbncoaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwljdHJsICY9IE1FODEwMF9ESU9fQ1RSTF9CSVRfSU5UQl8xIHwgTUU4MTAwX0RJT19DVFJMX0JJVF9JTlRCXzA7CisJb3V0dyhjdHJsLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCVBERUJVR19SRUcoImN0cmxfcmVnIG91dHcoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCBjdHJsKTsKKwlzcGluX3VubG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisJb3V0dygwLCBpbnN0YW5jZS0+cG9ydF9yZWcpOworCWluc3RhbmNlLT5wb3J0X3JlZ19taXJyb3IgPSAwOworCVBERUJVR19SRUcoInBvcnRfcmVnIG91dHcoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPnBvcnRfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCAwKTsKKwlzcGluX3VubG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWU4MTAwX2RvX2lvX3NpbmdsZV9jb25maWcobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICAgIGludCBjaGFubmVsLAorCQkJCSAgICAgIGludCBzaW5nbGVfY29uZmlnLAorCQkJCSAgICAgIGludCByZWYsCisJCQkJICAgICAgaW50IHRyaWdfY2hhbiwKKwkJCQkgICAgICBpbnQgdHJpZ190eXBlLCBpbnQgdHJpZ19lZGdlLCBpbnQgZmxhZ3MpCit7CisJbWU4MTAwX2RvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwlpbnQgY29uZmlnOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJaW5zdGFuY2UgPSAobWU4MTAwX2RvX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCXNwaW5fbG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKwlzcGluX2xvY2soaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2spOworCWNvbmZpZyA9IGludyhpbnN0YW5jZS0+Y3RybF9yZWcpOworCXN3aXRjaCAoZmxhZ3MpIHsKKwljYXNlIE1FX0lPX1NJTkdMRV9DT05GSUdfTk9fRkxBR1M6CisJY2FzZSBNRV9JT19TSU5HTEVfQ09ORklHX0RJT19XT1JEOgorCQlpZiAoY2hhbm5lbCA9PSAwKSB7CisJCQlpZiAoc2luZ2xlX2NvbmZpZyA9PQorCQkJICAgIE1FX1NJTkdMRV9DT05GSUdfRElPX0hJR0hfSU1QRURBTkNFKSB7CisJCQkJY29uZmlnICY9IH4oTUU4MTAwX0RJT19DVFJMX0JJVF9FTkFCTEVfRElPKTsKKwkJCX0gZWxzZSBpZiAoc2luZ2xlX2NvbmZpZyA9PSBNRV9TSU5HTEVfQ09ORklHX0RJT19TSU5LKSB7CisJCQkJY29uZmlnIHw9IE1FODEwMF9ESU9fQ1RSTF9CSVRfRU5BQkxFX0RJTzsKKwkJCQljb25maWcgJj0gfk1FODEwMF9ESU9fQ1RSTF9CSVRfU09VUkNFOworCQkJfSBlbHNlIGlmIChzaW5nbGVfY29uZmlnID09IE1FX1NJTkdMRV9DT05GSUdfRElPX1NPVVJDRSkgeworCQkJCWNvbmZpZyB8PQorCQkJCSAgICBNRTgxMDBfRElPX0NUUkxfQklUX0VOQUJMRV9ESU8gfAorCQkJCSAgICBNRTgxMDBfRElPX0NUUkxfQklUX1NPVVJDRTsKKwkJCX0gZWxzZSB7CisJCQkJUEVSUk9SCisJCQkJICAgICgiSW52YWxpZCBwb3J0IGNvbmZpZ3VyYXRpb24gc3BlY2lmaWVkLlxuIik7CisJCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9TSU5HTEVfQ09ORklHOworCQkJfQorCQl9IGVsc2UgeworCQkJUEVSUk9SKCJJbnZhbGlkIHdvcmQgbnVtYmVyIHNwZWNpZmllZC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWdzIHNwZWNpZmllZC5cbiIpOworCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCWlmICghZXJyKSB7CisJCW91dHcoY29uZmlnLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXR3KDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCBjb25maWcpOworCX0KKworCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrKTsKKwlzcGluX3VubG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZTgxMDBfZG9faW9fc2luZ2xlX3JlYWQobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgaW50IGNoYW5uZWwsCisJCQkJICAgIGludCAqdmFsdWUsIGludCB0aW1lX291dCwgaW50IGZsYWdzKQoreworCW1lODEwMF9kb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbnN0YW5jZSA9IChtZTgxMDBfZG9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJc3Bpbl9sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCXN3aXRjaCAoZmxhZ3MpIHsKKwljYXNlIE1FX0lPX1NJTkdMRV9UWVBFX0RJT19CSVQ6CisJCWlmICgoY2hhbm5lbCA+PSAwKSAmJiAoY2hhbm5lbCA8IDE2KSkgeworCQkJKnZhbHVlID0gaW5zdGFuY2UtPnBvcnRfcmVnX21pcnJvciAmICgweDEgPDwgY2hhbm5lbCk7CisJCX0gZWxzZSB7CisJCQlQRVJST1IoIkludmFsaWQgYml0IG51bWJlciBzcGVjaWZpZWQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwkJfQorCQlicmVhazsKKworCWNhc2UgTUVfSU9fU0lOR0xFX1RZUEVfRElPX0JZVEU6CisJCWlmIChjaGFubmVsID09IDApIHsKKwkJCSp2YWx1ZSA9IGluc3RhbmNlLT5wb3J0X3JlZ19taXJyb3IgJiAweEZGOworCQl9IGVsc2UgaWYgKGNoYW5uZWwgPT0gMSkgeworCQkJKnZhbHVlID0gKGluc3RhbmNlLT5wb3J0X3JlZ19taXJyb3IgPj4gOCkgJiAweEZGOworCQl9IGVsc2UgeworCQkJUEVSUk9SKCJJbnZhbGlkIGJ5dGUgbnVtYmVyIHNwZWNpZmllZC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCQl9CisJCWJyZWFrOworCisJY2FzZSBNRV9JT19TSU5HTEVfTk9fRkxBR1M6CisJY2FzZSBNRV9JT19TSU5HTEVfVFlQRV9ESU9fV09SRDoKKwkJaWYgKGNoYW5uZWwgPT0gMCkgeworCQkJKnZhbHVlID0gaW5zdGFuY2UtPnBvcnRfcmVnX21pcnJvcjsKKwkJfSBlbHNlIHsKKwkJCVBFUlJPUigiSW52YWxpZCB3b3JkIG51bWJlciBzcGVjaWZpZWQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCVBFUlJPUigiSW52YWxpZCBmbGFncyBzcGVjaWZpZWQuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisJc3Bpbl91bmxvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWU4MTAwX2RvX2lvX3NpbmdsZV93cml0ZShtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgIGludCBjaGFubmVsLAorCQkJCSAgICAgaW50IHZhbHVlLCBpbnQgdGltZV9vdXQsIGludCBmbGFncykKK3sKKwltZTgxMDBfZG9fc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJaW5zdGFuY2UgPSAobWU4MTAwX2RvX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCXNwaW5fbG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKwlzd2l0Y2ggKGZsYWdzKSB7CisJY2FzZSBNRV9JT19TSU5HTEVfVFlQRV9ESU9fQklUOgorCQlpZiAoKGNoYW5uZWwgPj0gMCkgJiYgKGNoYW5uZWwgPCAxNikpIHsKKwkJCWluc3RhbmNlLT5wb3J0X3JlZ19taXJyb3IgPQorCQkJICAgIHZhbHVlID8gKGluc3RhbmNlLT4KKwkJCQkgICAgIHBvcnRfcmVnX21pcnJvciB8ICgweDEgPDwgY2hhbm5lbCkpCisJCQkgICAgOiAoaW5zdGFuY2UtPnBvcnRfcmVnX21pcnJvciAmIH4oMHgxIDw8IGNoYW5uZWwpKTsKKwkJCW91dHcoaW5zdGFuY2UtPnBvcnRfcmVnX21pcnJvciwgaW5zdGFuY2UtPnBvcnRfcmVnKTsKKwkJCVBERUJVR19SRUcoInBvcnRfcmVnIG91dHcoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIGluc3RhbmNlLT5wb3J0X3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICBpbnN0YW5jZS0+cG9ydF9yZWdfbWlycm9yKTsKKwkJfSBlbHNlIHsKKwkJCVBFUlJPUigiSW52YWxpZCBiaXQgbnVtYmVyIHNwZWNpZmllZC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCQl9CisJCWJyZWFrOworCisJY2FzZSBNRV9JT19TSU5HTEVfVFlQRV9ESU9fQllURToKKwkJaWYgKGNoYW5uZWwgPT0gMCkgeworCQkJaW5zdGFuY2UtPnBvcnRfcmVnX21pcnJvciAmPSB+MHhGRjsKKwkJCWluc3RhbmNlLT5wb3J0X3JlZ19taXJyb3IgfD0gdmFsdWUgJiAweEZGOworCQkJb3V0dyhpbnN0YW5jZS0+cG9ydF9yZWdfbWlycm9yLCBpbnN0YW5jZS0+cG9ydF9yZWcpOworCQkJUERFQlVHX1JFRygicG9ydF9yZWcgb3V0dygweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgaW5zdGFuY2UtPnBvcnRfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIGluc3RhbmNlLT5wb3J0X3JlZ19taXJyb3IpOworCQl9IGVsc2UgaWYgKGNoYW5uZWwgPT0gMSkgeworCQkJaW5zdGFuY2UtPnBvcnRfcmVnX21pcnJvciAmPSB+MHhGRjAwOworCQkJaW5zdGFuY2UtPnBvcnRfcmVnX21pcnJvciB8PSAodmFsdWUgPDwgOCkgJiAweEZGMDA7CisJCQlvdXR3KGluc3RhbmNlLT5wb3J0X3JlZ19taXJyb3IsIGluc3RhbmNlLT5wb3J0X3JlZyk7CisJCQlQREVCVUdfUkVHKCJwb3J0X3JlZyBvdXR3KDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICBpbnN0YW5jZS0+cG9ydF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgaW5zdGFuY2UtPnBvcnRfcmVnX21pcnJvcik7CisJCX0gZWxzZSB7CisJCQlQRVJST1IoIkludmFsaWQgYnl0ZSBudW1iZXIgc3BlY2lmaWVkLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIE1FX0lPX1NJTkdMRV9OT19GTEFHUzoKKwljYXNlIE1FX0lPX1NJTkdMRV9UWVBFX0RJT19XT1JEOgorCQlpZiAoY2hhbm5lbCA9PSAwKSB7CisJCQlpbnN0YW5jZS0+cG9ydF9yZWdfbWlycm9yID0gdmFsdWU7CisJCQlvdXR3KHZhbHVlLCBpbnN0YW5jZS0+cG9ydF9yZWcpOworCQkJUERFQlVHX1JFRygicG9ydF9yZWcgb3V0dygweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgaW5zdGFuY2UtPnBvcnRfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIHZhbHVlKTsKKwkJfSBlbHNlIHsKKwkJCVBFUlJPUigiSW52YWxpZCBieXRlIG51bWJlciBzcGVjaWZpZWQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCVBFUlJPUigiSW52YWxpZCBmbGFncyBzcGVjaWZpZWQuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisJc3Bpbl91bmxvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWU4MTAwX2RvX3F1ZXJ5X251bWJlcl9jaGFubmVscyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJICAgaW50ICpudW1iZXIpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCSpudW1iZXIgPSAxNjsKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZTgxMDBfZG9fcXVlcnlfc3ViZGV2aWNlX3R5cGUobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJCSAgaW50ICp0eXBlLCBpbnQgKnN1YnR5cGUpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCSp0eXBlID0gTUVfVFlQRV9ETzsKKwkqc3VidHlwZSA9IE1FX1NVQlRZUEVfU0lOR0xFOworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lODEwMF9kb19xdWVyeV9zdWJkZXZpY2VfY2FwcyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwgaW50ICpjYXBzKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwkqY2FwcyA9IE1FX0NBUFNfRElPX1NJTktfU09VUkNFOworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCittZTgxMDBfZG9fc3ViZGV2aWNlX3QgKm1lODEwMF9kb19jb25zdHJ1Y3Rvcih1aW50MzJfdCByZWdfYmFzZSwKKwkJCQkJICAgICB1bnNpZ25lZCBpbnQgZG9faWR4LAorCQkJCQkgICAgIHNwaW5sb2NrX3QgKiBjdHJsX3JlZ19sb2NrKQoreworCW1lODEwMF9kb19zdWJkZXZpY2VfdCAqc3ViZGV2aWNlOworCWludCBlcnI7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwkvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHN1YmRldmljZSBpbnN0YW5jZSAqLworCXN1YmRldmljZSA9IGttYWxsb2Moc2l6ZW9mKG1lODEwMF9kb19zdWJkZXZpY2VfdCksIEdGUF9LRVJORUwpOworCisJaWYgKCFzdWJkZXZpY2UpIHsKKwkJUEVSUk9SKCJDYW5ub3QgZ2V0IG1lbW9yeSBmb3Igc3ViZGV2aWNlIGluc3RhbmNlLlxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCW1lbXNldChzdWJkZXZpY2UsIDAsIHNpemVvZihtZTgxMDBfZG9fc3ViZGV2aWNlX3QpKTsKKworCS8qIEluaXRpYWxpemUgc3ViZGV2aWNlIGJhc2UgY2xhc3MgKi8KKwllcnIgPSBtZV9zdWJkZXZpY2VfaW5pdCgmc3ViZGV2aWNlLT5iYXNlKTsKKworCWlmIChlcnIpIHsKKwkJUEVSUk9SKCJDYW5ub3QgaW5pdGlhbGl6ZSBzdWJkZXZpY2UgYmFzZSBjbGFzcyBpbnN0YW5jZS5cbiIpOworCQlrZnJlZShzdWJkZXZpY2UpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKiBJbml0aWFsaXplIHJlZ2lzdGVycyAqLworCWlmIChkb19pZHggPT0gMCkgeworCQlzdWJkZXZpY2UtPnBvcnRfcmVnID0gcmVnX2Jhc2UgKyBNRTgxMDBfRE9fUkVHX0E7CisJCXN1YmRldmljZS0+Y3RybF9yZWcgPSByZWdfYmFzZSArIE1FODEwMF9DVFJMX1JFR19BOworCX0gZWxzZSBpZiAoZG9faWR4ID09IDEpIHsKKwkJc3ViZGV2aWNlLT5wb3J0X3JlZyA9IHJlZ19iYXNlICsgTUU4MTAwX0RPX1JFR19COworCQlzdWJkZXZpY2UtPmN0cmxfcmVnID0gcmVnX2Jhc2UgKyBNRTgxMDBfQ1RSTF9SRUdfQjsKKwl9IGVsc2UgeworCQlQRVJST1IoIldyb25nIHN1YmRldmljZSBpZHg9JWQuXG4iLCBkb19pZHgpOworCQlrZnJlZShzdWJkZXZpY2UpOworCQlyZXR1cm4gTlVMTDsKKwl9CisjaWZkZWYgTUVERUJVR19ERUJVR19SRUcKKwlzdWJkZXZpY2UtPnJlZ19iYXNlID0gcmVnX2Jhc2U7CisjZW5kaWYKKworCS8vIEluaXRpYWxpemUgc3BpbiBsb2Nrcy4KKwlzcGluX2xvY2tfaW5pdCgmc3ViZGV2aWNlLT5zdWJkZXZpY2VfbG9jayk7CisJc3ViZGV2aWNlLT5jdHJsX3JlZ19sb2NrID0gY3RybF9yZWdfbG9jazsKKworCS8qIFNhdmUgdGhlIHN1YmRldmljZSBpbmRleCAqLworCXN1YmRldmljZS0+ZG9faWR4ID0gZG9faWR4OworCisJLyogT3ZlcmxvYWQgYmFzZSBjbGFzcyBtZXRob2RzLiAqLworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fcmVzZXRfc3ViZGV2aWNlID0KKwkgICAgbWU4MTAwX2RvX2lvX3Jlc2V0X3N1YmRldmljZTsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3NpbmdsZV9jb25maWcgPQorCSAgICBtZTgxMDBfZG9faW9fc2luZ2xlX2NvbmZpZzsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3NpbmdsZV9yZWFkID0gbWU4MTAwX2RvX2lvX3NpbmdsZV9yZWFkOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fc2luZ2xlX3dyaXRlID0KKwkgICAgbWU4MTAwX2RvX2lvX3NpbmdsZV93cml0ZTsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X251bWJlcl9jaGFubmVscyA9CisJICAgIG1lODEwMF9kb19xdWVyeV9udW1iZXJfY2hhbm5lbHM7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9zdWJkZXZpY2VfdHlwZSA9CisJICAgIG1lODEwMF9kb19xdWVyeV9zdWJkZXZpY2VfdHlwZTsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV9jYXBzID0KKwkgICAgbWU4MTAwX2RvX3F1ZXJ5X3N1YmRldmljZV9jYXBzOworCisJcmV0dXJuIHN1YmRldmljZTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTgxMDBfZG8uaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTgxMDBfZG8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hY2Y4ODAxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODEwMF9kby5oCkBAIC0wLDAgKzEsNzAgQEAKKy8qKgorICogQGZpbGUgbWU4MTAwX2RvLmgKKyAqCisgKiBAYnJpZWYgTUUtODEwMCBkaWdpdGFsIG91dHB1dCBzdWJkZXZpY2UgY2xhc3MuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfTUU4MTAwX0RPX0hfCisjZGVmaW5lIF9NRTgxMDBfRE9fSF8KKworI2luY2x1ZGUgIm1lc3ViZGV2aWNlLmgiCisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKy8qKgorICogQGJyaWVmIFRoZSB0ZW1wbGF0ZSBzdWJkZXZpY2UgY2xhc3MuCisgKi8KK3R5cGVkZWYgc3RydWN0IG1lODEwMF9kb19zdWJkZXZpY2UgeworCS8qIEluaGVyaXRhbmNlICovCisJbWVfc3ViZGV2aWNlX3QgYmFzZTsJCQkvKio8IFRoZSBzdWJkZXZpY2UgYmFzZSBjbGFzcy4gKi8KKworCS8qIEF0dHJpYnV0ZXMgKi8KKwlzcGlubG9ja190IHN1YmRldmljZV9sb2NrOwkJLyoqPCBTcGluIGxvY2sgdG8gcHJvdGVjdCB0aGUgc3ViZGV2aWNlIGZyb20gY29uY3VycmVudCBhY2Nlc3MuICovCisJc3BpbmxvY2tfdCAqY3RybF9yZWdfbG9jazsJCS8qKjwgU3BpbiBsb2NrIHRvIHByb3RlY3QgdGhlICNjdHJsX3JlZy4gKi8KKworCXVuc2lnbmVkIGludCBkb19pZHg7CisKKwl1aW50MTZfdCBwb3J0X3JlZ19taXJyb3I7CQkvKio8IE1pcnJvciB1c2VkIHRvIHN0b3JlIGN1cnJlbnQgcG9ydCByZWdpc3RlciBzZXR0aW5nIHdoaWNoIGlzIHdyaXRlIG9ubHkuICovCisKKwl1bnNpZ25lZCBsb25nIHBvcnRfcmVnOwkJCS8qKjwgUmVnaXN0ZXIgaG9sZGluZyB0aGUgcG9ydCBzdGF0dXMuICovCisJdW5zaWduZWQgbG9uZyBjdHJsX3JlZzsJCQkvKio8IENvbnRyb2wgcmVnaXN0ZXIuICovCisjaWZkZWYgTUVERUJVR19ERUJVR19SRUcKKwl1bnNpZ25lZCBsb25nIHJlZ19iYXNlOworI2VuZGlmCit9IG1lODEwMF9kb19zdWJkZXZpY2VfdDsKKworLyoqCisgKiBAYnJpZWYgVGhlIGNvbnN0cnVjdG9yIHRvIGdlbmVyYXRlIGEgTUUtODEwMCBkaWdpdGFsIG91dHB1dCBzdWJkZXZpY2UgaW5zdGFuY2UuCisgKgorICogQHBhcmFtIHJlZ19iYXNlIFRoZSByZWdpc3RlciBiYXNlIGFkZHJlc3Mgb2YgdGhlIGRldmljZSBhcyByZXR1cm5lZCBieSB0aGUgUENJIEJJT1MuCisgKiBAcGFyYW0gZG9faWR4IFRoZSBpbmRleCBvZiB0aGUgZGlnaXRhbCBvdXRwdXQgc3ViZGV2aWNlIG9uIHRoaXMgZGV2aWNlLgorICoKKyAqIEByZXR1cm4gUG9pbnRlciB0byBuZXcgaW5zdGFuY2Ugb24gc3VjY2Vzcy5cbgorICogTlVMTCBvbiBlcnJvci4KKyAqLworbWU4MTAwX2RvX3N1YmRldmljZV90ICptZTgxMDBfZG9fY29uc3RydWN0b3IodWludDMyX3QgcmVnX2Jhc2UsCisJCQkJCSAgICAgdW5zaWduZWQgaW50IGRvX2lkeCwKKwkJCQkJICAgICBzcGlubG9ja190ICogY3RybF9yZWdfbG9jayk7CisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU4MTAwX2RvX3JlZy5oIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODEwMF9kb19yZWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2EyMzgwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODEwMF9kb19yZWcuaApAQCAtMCwwICsxLDM2IEBACisvKioKKyAqIEBmaWxlIG1lODEwMF9hb19yZWcuaAorICoKKyAqIEBicmllZiBNRS04MTAwIGFuYWxvZyBvdXRwdXQgc3ViZGV2aWNlIHJlZ2lzdGVyIGRlZmluaXRpb25zLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX01FODEwMF9ET19SRUdfSF8KKyNkZWZpbmUgX01FODEwMF9ET19SRUdfSF8KKworI2lmZGVmIF9fS0VSTkVMX18KKworI2RlZmluZSBNRTgxMDBfRE9fUkVHX0EJCQkweDA2CS8vKCAsdykKKyNkZWZpbmUgTUU4MTAwX0RPX1JFR19CCQkJMHgxMgkvLyggLHcpCisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU4MTAwX3JlZy5oIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODEwMF9yZWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOGM0YjFjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODEwMF9yZWcuaApAQCAtMCwwICsxLDQxIEBACisvKioKKyAqIEBmaWxlIG1lODEwMF9yZWcuaAorICoKKyAqIEBicmllZiBNRS04MTAwIHJlZ2lzdGVyIGRlZmluaXRpb25zLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX01FODEwMF9SRUdfSF8KKyNkZWZpbmUgX01FODEwMF9SRUdfSF8KKworI2lmZGVmIF9fS0VSTkVMX18KKworI2RlZmluZSBNRTgxMDBfQ1RSTF9SRUdfQQkJCTB4MDAJLy8oICx3KQorI2RlZmluZSBNRTgxMDBfQ1RSTF9SRUdfQgkJCTB4MEMJLy8oICx3KQorCisjZGVmaW5lIE1FODEwMF9ESU9fQ1RSTF9CSVRfU09VUkNFCQkweDEwCisjZGVmaW5lIE1FODEwMF9ESU9fQ1RSTF9CSVRfSU5UQl8xCQkweDIwCisjZGVmaW5lIE1FODEwMF9ESU9fQ1RSTF9CSVRfSU5UQl8wCQkweDQwCisjZGVmaW5lIE1FODEwMF9ESU9fQ1RSTF9CSVRfRU5BQkxFX0RJTwkJMHg4MAorCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODIwMF9kZXZpY2UuYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTgyMDBfZGV2aWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjYxYzBjYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTgyMDBfZGV2aWNlLmMKQEAgLTAsMCArMSwxOTQgQEAKKy8qKgorICogQGZpbGUgbWU4MjAwX2RldmljZS5jCisgKgorICogQGJyaWVmIE1FLTgyMDAgZGV2aWNlIGNsYXNzIGltcGxlbWVudGF0aW9uLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICogQGF1dGhvciBLcnp5c3p0b2YgR2FudHprZQkoay5nYW50emtlQG1laWxoYXVzLmRlKQorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX19LRVJORUxfXworIyAgZGVmaW5lIF9fS0VSTkVMX18KKyNlbmRpZgorCisjaWZuZGVmIE1PRFVMRQorIyAgZGVmaW5lIE1PRFVMRQorI2VuZGlmCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKworI2luY2x1ZGUgIm1laWRzLmgiCisjaW5jbHVkZSAibWVlcnJvci5oIgorI2luY2x1ZGUgIm1lY29tbW9uLmgiCisjaW5jbHVkZSAibWVpbnRlcm5hbC5oIgorCisjaW5jbHVkZSAibWVkZWJ1Zy5oIgorI2luY2x1ZGUgIm1lcGx4X3JlZy5oIgorI2luY2x1ZGUgIm1lZGV2aWNlLmgiCisjaW5jbHVkZSAibWU4MjAwX2RldmljZS5oIgorI2luY2x1ZGUgIm1lc3ViZGV2aWNlLmgiCisjaW5jbHVkZSAibWU4MjAwX2RpLmgiCisjaW5jbHVkZSAibWU4MjAwX2RvLmgiCisjaW5jbHVkZSAibWU4MjAwX2Rpby5oIgorCittZV9kZXZpY2VfdCAqbWU4MjAwX3BjaV9jb25zdHJ1Y3RvcihzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldmljZSkKK3sKKwltZTgyMDBfZGV2aWNlX3QgKm1lODIwMF9kZXZpY2U7CisJbWVfc3ViZGV2aWNlX3QgKnN1YmRldmljZTsKKwl1bnNpZ25lZCBpbnQgdmVyc2lvbl9pZHg7CisJaW50IGVycjsKKwlpbnQgaTsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCS8vIEFsbG9jYXRlIHN0cnVjdHVyZSBmb3IgZGV2aWNlIGluc3RhbmNlLgorCW1lODIwMF9kZXZpY2UgPSBrbWFsbG9jKHNpemVvZihtZTgyMDBfZGV2aWNlX3QpLCBHRlBfS0VSTkVMKTsKKworCWlmICghbWU4MjAwX2RldmljZSkgeworCQlQRVJST1IoIkNhbm5vdCBnZXQgbWVtb3J5IGZvciBkZXZpY2UgaW5zdGFuY2UuXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJbWVtc2V0KG1lODIwMF9kZXZpY2UsIDAsIHNpemVvZihtZTgyMDBfZGV2aWNlX3QpKTsKKworCS8vIEluaXRpYWxpemUgYmFzZSBjbGFzcyBzdHJ1Y3R1cmUuCisJZXJyID0gbWVfZGV2aWNlX3BjaV9pbml0KChtZV9kZXZpY2VfdCAqKSBtZTgyMDBfZGV2aWNlLCBwY2lfZGV2aWNlKTsKKworCWlmIChlcnIpIHsKKwkJa2ZyZWUobWU4MjAwX2RldmljZSk7CisJCVBFUlJPUigiQ2Fubm90IGluaXRpYWxpemUgZGV2aWNlIGJhc2UgY2xhc3MuXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJLyogR2V0IHRoZSBpbmRleCBpbiB0aGUgZGV2aWNlIHZlcnNpb24gaW5mb3JtYXRpb24gdGFibGUuICovCisJdmVyc2lvbl9pZHggPQorCSAgICBtZTgyMDBfdmVyc2lvbnNfZ2V0X2RldmljZV9pbmRleChtZTgyMDBfZGV2aWNlLT5iYXNlLmluZm8ucGNpLgorCQkJCQkgICAgIGRldmljZV9pZCk7CisKKwkvLyBJbml0aWFsaXplIHNwaW4gbG9jayAuCisJc3Bpbl9sb2NrX2luaXQoJm1lODIwMF9kZXZpY2UtPmlycV9jdHJsX2xvY2spOworCXNwaW5fbG9ja19pbml0KCZtZTgyMDBfZGV2aWNlLT5pcnFfbW9kZV9sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmbWU4MjAwX2RldmljZS0+ZGlvX2N0cmxfbG9jayk7CisKKwkvKiBTZXR1cCB0aGUgUExYIGludGVycnVwdCBjb25maWd1cmF0aW9uICovCisJb3V0bChQTFhfSU5UQ1NSX0xPQ0FMX0lOVDFfRU4gfAorCSAgICAgUExYX0lOVENTUl9MT0NBTF9JTlQxX1BPTCB8CisJICAgICBQTFhfSU5UQ1NSX0xPQ0FMX0lOVDJfRU4gfAorCSAgICAgUExYX0lOVENTUl9MT0NBTF9JTlQyX1BPTCB8CisJICAgICBQTFhfSU5UQ1NSX1BDSV9JTlRfRU4sCisJICAgICBtZTgyMDBfZGV2aWNlLT5iYXNlLmluZm8ucGNpLnJlZ19iYXNlc1sxXSArIFBMWF9JTlRDU1IpOworCisJLy8gQ3JlYXRlIHN1YmRldmljZSBpbnN0YW5jZXMuCisKKwlmb3IgKGkgPSAwOyBpIDwgbWU4MjAwX3ZlcnNpb25zW3ZlcnNpb25faWR4XS5kaV9zdWJkZXZpY2VzOyBpKyspIHsKKwkJc3ViZGV2aWNlID0KKwkJICAgIChtZV9zdWJkZXZpY2VfdCAqKSBtZTgyMDBfZGlfY29uc3RydWN0b3IobWU4MjAwX2RldmljZS0+CisJCQkJCQkJICAgICBiYXNlLmluZm8ucGNpLgorCQkJCQkJCSAgICAgcmVnX2Jhc2VzWzJdLCBpLAorCQkJCQkJCSAgICAgbWU4MjAwX2RldmljZS0+CisJCQkJCQkJICAgICBiYXNlLmlycSwKKwkJCQkJCQkgICAgICZtZTgyMDBfZGV2aWNlLT4KKwkJCQkJCQkgICAgIGlycV9jdHJsX2xvY2ssCisJCQkJCQkJICAgICAmbWU4MjAwX2RldmljZS0+CisJCQkJCQkJICAgICBpcnFfbW9kZV9sb2NrKTsKKworCQlpZiAoIXN1YmRldmljZSkgeworCQkJbWVfZGV2aWNlX2RlaW5pdCgobWVfZGV2aWNlX3QgKikgbWU4MjAwX2RldmljZSk7CisJCQlrZnJlZShtZTgyMDBfZGV2aWNlKTsKKwkJCVBFUlJPUigiQ2Fubm90IGdldCBtZW1vcnkgZm9yIHN1YmRldmljZS5cbiIpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKworCQltZV9zbGlzdF9hZGRfc3ViZGV2aWNlX3RhaWwoJm1lODIwMF9kZXZpY2UtPmJhc2Uuc2xpc3QsCisJCQkJCSAgICBzdWJkZXZpY2UpOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBtZTgyMDBfdmVyc2lvbnNbdmVyc2lvbl9pZHhdLmRvX3N1YmRldmljZXM7IGkrKykgeworCQlzdWJkZXZpY2UgPQorCQkgICAgKG1lX3N1YmRldmljZV90ICopIG1lODIwMF9kb19jb25zdHJ1Y3RvcihtZTgyMDBfZGV2aWNlLT4KKwkJCQkJCQkgICAgIGJhc2UuaW5mby5wY2kuCisJCQkJCQkJICAgICByZWdfYmFzZXNbMl0sIGksCisJCQkJCQkJICAgICBtZTgyMDBfZGV2aWNlLT4KKwkJCQkJCQkgICAgIGJhc2UuaXJxLAorCQkJCQkJCSAgICAgJm1lODIwMF9kZXZpY2UtPgorCQkJCQkJCSAgICAgaXJxX21vZGVfbG9jayk7CisKKwkJaWYgKCFzdWJkZXZpY2UpIHsKKwkJCW1lX2RldmljZV9kZWluaXQoKG1lX2RldmljZV90ICopIG1lODIwMF9kZXZpY2UpOworCQkJa2ZyZWUobWU4MjAwX2RldmljZSk7CisJCQlQRVJST1IoIkNhbm5vdCBnZXQgbWVtb3J5IGZvciBzdWJkZXZpY2UuXG4iKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisKKwkJbWVfc2xpc3RfYWRkX3N1YmRldmljZV90YWlsKCZtZTgyMDBfZGV2aWNlLT5iYXNlLnNsaXN0LAorCQkJCQkgICAgc3ViZGV2aWNlKTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgbWU4MjAwX3ZlcnNpb25zW3ZlcnNpb25faWR4XS5kaW9fc3ViZGV2aWNlczsgaSsrKSB7CisJCXN1YmRldmljZSA9CisJCSAgICAobWVfc3ViZGV2aWNlX3QgKikgbWU4MjAwX2Rpb19jb25zdHJ1Y3RvcihtZTgyMDBfZGV2aWNlLT4KKwkJCQkJCQkgICAgICBiYXNlLmluZm8ucGNpLgorCQkJCQkJCSAgICAgIHJlZ19iYXNlc1syXSwgaSwKKwkJCQkJCQkgICAgICAmbWU4MjAwX2RldmljZS0+CisJCQkJCQkJICAgICAgZGlvX2N0cmxfbG9jayk7CisKKwkJaWYgKCFzdWJkZXZpY2UpIHsKKwkJCW1lX2RldmljZV9kZWluaXQoKG1lX2RldmljZV90ICopIG1lODIwMF9kZXZpY2UpOworCQkJa2ZyZWUobWU4MjAwX2RldmljZSk7CisJCQlQRVJST1IoIkNhbm5vdCBnZXQgbWVtb3J5IGZvciBzdWJkZXZpY2UuXG4iKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisKKwkJbWVfc2xpc3RfYWRkX3N1YmRldmljZV90YWlsKCZtZTgyMDBfZGV2aWNlLT5iYXNlLnNsaXN0LAorCQkJCQkgICAgc3ViZGV2aWNlKTsKKwl9CisKKwlyZXR1cm4gKG1lX2RldmljZV90ICopIG1lODIwMF9kZXZpY2U7Cit9CisKKy8vIEluaXQgYW5kIGV4aXQgb2YgbW9kdWxlLgorCitzdGF0aWMgaW50IF9faW5pdCBtZTgyMDBfaW5pdCh2b2lkKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4uIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBtZTgyMDBfZXhpdCh2b2lkKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4uIik7Cit9CisKK21vZHVsZV9pbml0KG1lODIwMF9pbml0KTsKKworbW9kdWxlX2V4aXQobWU4MjAwX2V4aXQpOworCisvLyBBZG1pbmlzdHJhdGl2ZSBzdHVmZiBmb3IgbW9kaW5mby4KK01PRFVMRV9BVVRIT1IoIkd1ZW50ZXIgR2ViaGFyZHQgPGcuZ2ViaGFyZHRAbWVpbGhhdXMuZGU+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkRldmljZSBEcml2ZXIgTW9kdWxlIGZvciBUZW1wbGF0ZSBEZXZpY2UiKTsKK01PRFVMRV9TVVBQT1JURURfREVWSUNFKCJNZWlsaGF1cyBUZW1wbGF0ZSBEZXZpY2VzIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKy8vIEV4cG9ydCB0aGUgY29uc3RydWN0b3IuCitFWFBPUlRfU1lNQk9MKG1lODIwMF9wY2lfY29uc3RydWN0b3IpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODIwMF9kZXZpY2UuaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTgyMDBfZGV2aWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2JkMmEwMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTgyMDBfZGV2aWNlLmgKQEAgLTAsMCArMSw5NyBAQAorLyoqCisgKiBAZmlsZSBtZTgyMDBfZGV2aWNlLmgKKyAqCisgKiBAYnJpZWYgTUUtODIwMCBkZXZpY2UgY2xhc3MuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfTUU4MjAwX0RFVklDRV9ICisjZGVmaW5lIF9NRTgyMDBfREVWSUNFX0gKKworI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisKKyNpbmNsdWRlICJtZWRldmljZS5oIgorCisjaWZkZWYgX19LRVJORUxfXworCisvKioKKyAqIEBicmllZiBTdHJ1Y3R1cmUgaG9sZGluZyBNRS04MjAwIGRldmljZSBjYXBhYmlsaXRpZXMuCisgKi8KK3R5cGVkZWYgc3RydWN0IG1lODIwMF92ZXJzaW9uIHsKKwl1aW50MTZfdCBkZXZpY2VfaWQ7CisJdW5zaWduZWQgaW50IGRpX3N1YmRldmljZXM7CisJdW5zaWduZWQgaW50IGRvX3N1YmRldmljZXM7CisJdW5zaWduZWQgaW50IGRpb19zdWJkZXZpY2VzOworfSBtZTgyMDBfdmVyc2lvbl90OworCisvKioKKyAqIEBicmllZiBEZXZpY2UgY2FwYWJpbGl0aWVzLgorICovCitzdGF0aWMgbWU4MjAwX3ZlcnNpb25fdCBtZTgyMDBfdmVyc2lvbnNbXSA9IHsKKwl7UENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTgyMDBfQSwgMSwgMSwgMn0sCisJe1BDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU4MjAwX0IsIDIsIDIsIDJ9LAorCXswfSwKK307CisKKyNkZWZpbmUgTUU4MjAwX0RFVklDRV9WRVJTSU9OUyAoc2l6ZW9mKG1lODIwMF92ZXJzaW9ucykgLyBzaXplb2YobWU4MjAwX3ZlcnNpb25fdCkgLSAxKQkvKio8IFJldHVybnMgdGhlIG51bWJlciBvZiBlbnRyaWVzIGluICNtZTgyMDBfdmVyc2lvbnMuICovCisKKy8qKgorICogQGJyaWVmIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBkZXZpY2UgZW50cnkgaW4gI21lODIwMF92ZXJzaW9ucy4KKyAqCisgKiBAcGFyYW0gZGV2aWNlX2lkIFRoZSBQQ0kgZGV2aWNlIGlkIG9mIHRoZSBkZXZpY2UgdG8gcXVlcnkuCisgKiBAcmV0dXJuIFRoZSBpbmRleCBvZiB0aGUgZGV2aWNlIGluICNtZTgyMDBfdmVyc2lvbnMuCisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IG1lODIwMF92ZXJzaW9uc19nZXRfZGV2aWNlX2luZGV4KHVpbnQxNl90IGRldmljZV9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgTUU4MjAwX0RFVklDRV9WRVJTSU9OUzsgaSsrKQorCQlpZiAobWU4MjAwX3ZlcnNpb25zW2ldLmRldmljZV9pZCA9PSBkZXZpY2VfaWQpCisJCQlicmVhazsKKwlyZXR1cm4gaTsKK30KKworLyoqCisgKiBAYnJpZWYgVGhlIE1FLTgyMDAgZGV2aWNlIGNsYXNzIHN0cnVjdHVyZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgbWU4MjAwX2RldmljZSB7CisJbWVfZGV2aWNlX3QgYmFzZTsJCS8qKjwgVGhlIE1laWxoYXVzIGRldmljZSBiYXNlIGNsYXNzLiAqLworCisJLyogQ2hpbGQgY2xhc3MgYXR0cmlidXRlcy4gKi8KKwlzcGlubG9ja190IGlycV9jdHJsX2xvY2s7CS8qKjwgTG9jayBmb3IgdGhlIGludGVycnVwdCBjb250cm9sIHJlZ2lzdGVyLiAqLworCXNwaW5sb2NrX3QgaXJxX21vZGVfbG9jazsJLyoqPCBMb2NrIGZvciB0aGUgaW50ZXJydXB0IG1vZGUgcmVnaXN0ZXIuICovCisJc3BpbmxvY2tfdCBkaW9fY3RybF9sb2NrOwkvKio8IExvY2sgZm9yIHRoZSBkaWdpdGFsIGkvbyBjb250cm9sIHJlZ2lzdGVyLiAqLworfSBtZTgyMDBfZGV2aWNlX3Q7CisKKy8qKgorICogQGJyaWVmIFRoZSBNRS04MjAwIGRldmljZSBjbGFzcyBjb25zdHJ1Y3Rvci4KKyAqCisgKiBAcGFyYW0gcGNpX2RldmljZSBUaGUgcGNpIGRldmljZSBzdHJ1Y3R1cmUgZ2l2ZW4gYnkgdGhlIFBDSSBzdWJzeXN0ZW0uCisgKgorICogQHJldHVybiBPbiBzdWNjZXMgYSBuZXcgTUUtODIwMCBkZXZpY2UgaW5zdGFuY2UuIFxuCisgKiAgICAgICAgIE5VTEwgb24gZXJyb3IuCisgKi8KK21lX2RldmljZV90ICptZTgyMDBfcGNpX2NvbnN0cnVjdG9yKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2aWNlKQorICAgIF9fYXR0cmlidXRlX18gKCh3ZWFrKSk7CisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU4MjAwX2RpLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU4MjAwX2RpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjc1MjViYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTgyMDBfZGkuYwpAQCAtMCwwICsxLDg1NyBAQAorLyoqCisgKiBAZmlsZSBtZTgyMDBfZGkuYworICoKKyAqIEBicmllZiBNRS04MjAwIGRpZ2l0YWwgaW5wdXQgc3ViZGV2aWNlIGluc3RhbmNlLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICogQGF1dGhvciBLcnp5c3p0b2YgR2FudHprZQkoay5nYW50emtlQG1laWxoYXVzLmRlKQorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX19LRVJORUxfXworIyAgZGVmaW5lIF9fS0VSTkVMX18KKyNlbmRpZgorCisvLy9JbmNsdWRlcworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisKKyNpbmNsdWRlICJtZWRlZmluZXMuaCIKKyNpbmNsdWRlICJtZWVycm9yLmgiCisKKyNpbmNsdWRlICJtZWlkcy5oIgorI2luY2x1ZGUgIm1lZGVidWcuaCIKKyNpbmNsdWRlICJtZTgyMDBfcmVnLmgiCisjaW5jbHVkZSAibWU4MjAwX2RpX3JlZy5oIgorI2luY2x1ZGUgIm1lODIwMF9kaS5oIgorCisvLy8gRGVmaW5lcworc3RhdGljIHZvaWQgbWU4MjAwX2RpX2Rlc3RydWN0b3Ioc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlKTsKK3N0YXRpYyBpbnQgbWU4MjAwX2RpX2lvX2lycV9zdGFydChtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgIGludCBjaGFubmVsLAorCQkJCSAgaW50IGlycV9zb3VyY2UsCisJCQkJICBpbnQgaXJxX2VkZ2UsIGludCBpcnFfYXJnLCBpbnQgZmxhZ3MpOworc3RhdGljIGludCBtZTgyMDBfZGlfaW9faXJxX3dhaXQobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgaW50IGNoYW5uZWwsCisJCQkJIGludCAqaXJxX2NvdW50LAorCQkJCSBpbnQgKnZhbHVlLCBpbnQgdGltZV9vdXQsIGludCBmbGFncyk7CitzdGF0aWMgaW50IG1lODIwMF9kaV9pb19pcnFfc3RvcChtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgc3RydWN0IGZpbGUgKmZpbGVwLCBpbnQgY2hhbm5lbCwgaW50IGZsYWdzKTsKK3N0YXRpYyBpbnQgbWU4MjAwX2RpX2lvX3NpbmdsZV9jb25maWcobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICAgIGludCBjaGFubmVsLAorCQkJCSAgICAgIGludCBzaW5nbGVfY29uZmlnLAorCQkJCSAgICAgIGludCByZWYsCisJCQkJICAgICAgaW50IHRyaWdfY2hhbiwKKwkJCQkgICAgICBpbnQgdHJpZ190eXBlLCBpbnQgdHJpZ19lZGdlLCBpbnQgZmxhZ3MpOworc3RhdGljIGludCBtZTgyMDBfZGlfaW9fc2luZ2xlX3JlYWQobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgaW50IGNoYW5uZWwsCisJCQkJICAgIGludCAqdmFsdWUsIGludCB0aW1lX291dCwgaW50IGZsYWdzKTsKK3N0YXRpYyBpbnQgbWU4MjAwX2RpX2lvX3Jlc2V0X3N1YmRldmljZShzdHJ1Y3QgbWVfc3ViZGV2aWNlICpzdWJkZXZpY2UsCisJCQkJCXN0cnVjdCBmaWxlICpmaWxlcCwgaW50IGZsYWdzKTsKK3N0YXRpYyBpbnQgbWU4MjAwX2RpX3F1ZXJ5X251bWJlcl9jaGFubmVscyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJICAgaW50ICpudW1iZXIpOworc3RhdGljIGludCBtZTgyMDBfZGlfcXVlcnlfc3ViZGV2aWNlX3R5cGUobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJCSAgaW50ICp0eXBlLCBpbnQgKnN1YnR5cGUpOworc3RhdGljIGludCBtZTgyMDBfZGlfcXVlcnlfc3ViZGV2aWNlX2NhcHMobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJCSAgaW50ICpjYXBzKTsKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiwgNiwgMTkpCitzdGF0aWMgaXJxcmV0dXJuX3QgbWU4MjAwX2lzcihpbnQgaXJxLCB2b2lkICpkZXZfaWQpOworI2Vsc2UKK3N0YXRpYyBpcnFyZXR1cm5fdCBtZTgyMDBfaXNyKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworI2VuZGlmCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsIDYsIDE5KQorc3RhdGljIGlycXJldHVybl90IG1lODIwMF9pc3JfRVgoaW50IGlycSwgdm9pZCAqZGV2X2lkKTsKKyNlbHNlCitzdGF0aWMgaXJxcmV0dXJuX3QgbWU4MjAwX2lzcl9FWChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKKyNlbmRpZgorc3RhdGljIHZvaWQgbWU4MjAwX2RpX2NoZWNrX3ZlcnNpb24obWU4MjAwX2RpX3N1YmRldmljZV90ICogaW5zdGFuY2UsCisJCQkJICAgIHVuc2lnbmVkIGxvbmcgYWRkcik7CisKKy8vL0Z1bmN0aW9ucworc3RhdGljIGludCBtZTgyMDBfZGlfaW9faXJxX3N0YXJ0KG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgaW50IGNoYW5uZWwsCisJCQkJICBpbnQgaXJxX3NvdXJjZSwKKwkJCQkgIGludCBpcnFfZWRnZSwgaW50IGlycV9hcmcsIGludCBmbGFncykKK3sKKwltZTgyMDBfZGlfc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCXZvbGF0aWxlIHVpbnQ4X3QgdG1wOworCXVuc2lnbmVkIGxvbmcgc3RhdHVzOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJaW5zdGFuY2UgPSAobWU4MjAwX2RpX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCWlmIChpcnFfc291cmNlID09IE1FX0lSUV9TT1VSQ0VfRElPX1BBVFRFUk4pIHsKKwkJaWYgKGZsYWdzICYKKwkJICAgIH4oTUVfSU9fSVJRX1NUQVJUX1BBVFRFUk5fRklMVEVSSU5HIHwKKwkJICAgICAgTUVfSU9fSVJRX1NUQVJUX0RJT19CWVRFKSkgeworCQkJUEVSUk9SKCJJbnZhbGlkIGZsYWcgc3BlY2lmaWVkLlxuIik7CisJCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwkJfQorCisJCWlmIChpcnFfZWRnZSAhPSBNRV9JUlFfRURHRV9OT1RfVVNFRCkgeworCQkJUEVSUk9SKCJJbnZhbGlkIGlycSBlZGdlIHNwZWNpZmllZC5cbiIpOworCQkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfSVJRX0VER0U7CisJCX0KKwl9IGVsc2UgaWYgKGlycV9zb3VyY2UgPT0gTUVfSVJRX1NPVVJDRV9ESU9fTUFTSykgeworCQlpZiAoZmxhZ3MgJgorCQkgICAgfihNRV9JT19JUlFfU1RBUlRfRVhURU5ERURfU1RBVFVTIHwKKwkJICAgICAgTUVfSU9fSVJRX1NUQVJUX0RJT19CWVRFKSkgeworCQkJUEVSUk9SKCJJbnZhbGlkIGZsYWcgc3BlY2lmaWVkLlxuIik7CisJCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwkJfQorCisJCWlmICgoaXJxX2VkZ2UgIT0gTUVfSVJRX0VER0VfUklTSU5HKQorCQkgICAgJiYgKGlycV9lZGdlICE9IE1FX0lSUV9FREdFX0ZBTExJTkcpCisJCSAgICAmJiAoaXJxX2VkZ2UgIT0gTUVfSVJRX0VER0VfQU5ZKSkgeworCQkJUEVSUk9SKCJJbnZhbGlkIGlycSBlZGdlIHNwZWNpZmllZC5cbiIpOworCQkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfSVJRX0VER0U7CisJCX0KKworCQlpZiAoIShpcnFfYXJnICYgMHhGRikpIHsKKwkJCVBFUlJPUigiTm8gbWFzayBzcGVjaWZpZWQuXG4iKTsKKwkJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0lSUV9BUkc7CisJCX0KKwl9IGVsc2UgeworCQlQRVJST1IoIkludmFsaWQgaXJxIHNvdXJjZSBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfSVJRX1NPVVJDRTsKKwl9CisKKwlpZiAoY2hhbm5lbCkgeworCQlQRVJST1IoIkludmFsaWQgY2hhbm5lbCBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwl9CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBzdGF0dXMpOworCWlmIChpcnFfc291cmNlID09IE1FX0lSUV9TT1VSQ0VfRElPX1BBVFRFUk4pIHsKKwkJb3V0YihpcnFfYXJnLCBpbnN0YW5jZS0+Y29tcGFyZV9yZWcpOworCQlQREVCVUdfUkVHKCJjb21wYXJlX3JlZyBvdXRiKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPmNvbXBhcmVfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCBpcnFfYXJnKTsKKwkJb3V0YigweEZGLCBpbnN0YW5jZS0+bWFza19yZWcpOworCQlQREVCVUdfUkVHKCJtYXNrX3JlZyBvdXRiKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPm1hc2tfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCAweGZmKTsKKwkJaW5zdGFuY2UtPmNvbXBhcmVfdmFsdWUgPSBpcnFfYXJnOworCQlpbnN0YW5jZS0+ZmlsdGVyaW5nX2ZsYWcgPQorCQkgICAgKGZsYWdzICYgTUVfSU9fSVJRX1NUQVJUX1BBVFRFUk5fRklMVEVSSU5HKSA/IDEgOiAwOworCX0KKwlpZiAoaXJxX3NvdXJjZSA9PSBNRV9JUlFfU09VUkNFX0RJT19NQVNLKSB7CisJCW91dGIoaXJxX2FyZywgaW5zdGFuY2UtPm1hc2tfcmVnKTsKKwkJUERFQlVHX1JFRygibWFza19yZWcgb3V0YigweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgIGluc3RhbmNlLT5tYXNrX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgaXJxX2FyZyk7CisJCWluc3RhbmNlLT5maWx0ZXJpbmdfZmxhZyA9IDA7CisJfQorCisJc3Bpbl9sb2NrKGluc3RhbmNlLT5pcnFfbW9kZV9sb2NrKTsKKwl0bXAgPSBpbmIoaW5zdGFuY2UtPmlycV9tb2RlX3JlZyk7CisJdG1wICY9CisJICAgIH4oTUU4MjAwX0lSUV9NT0RFX01BU0sgPDwKKwkgICAgICAoTUU4MjAwX0lSUV9NT0RFX0RJX1NISUZUICogaW5zdGFuY2UtPmRpX2lkeCkpOworCWlmIChpcnFfc291cmNlID09IE1FX0lSUV9TT1VSQ0VfRElPX1BBVFRFUk4pIHsKKwkJdG1wIHw9CisJCSAgICBNRTgyMDBfSVJRX01PREVfTUFTS19DT01QQVJFIDw8IChNRTgyMDBfSVJRX01PREVfRElfU0hJRlQgKgorCQkJCQkJICAgICBpbnN0YW5jZS0+ZGlfaWR4KTsKKwl9CisKKwlpZiAoaXJxX3NvdXJjZSA9PSBNRV9JUlFfU09VUkNFX0RJT19NQVNLKSB7CisJCXRtcCB8PQorCQkgICAgTUU4MjAwX0lSUV9NT0RFX01BU0tfTUFTSyA8PCAoTUU4MjAwX0lSUV9NT0RFX0RJX1NISUZUICoKKwkJCQkJCSAgaW5zdGFuY2UtPmRpX2lkeCk7CisJfQorCW91dGIodG1wLCBpbnN0YW5jZS0+aXJxX21vZGVfcmVnKTsKKwlQREVCVUdfUkVHKCJpcnFfbW9kZV9yZWcgb3V0YigweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+aXJxX21vZGVfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCB0bXApOworCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5pcnFfbW9kZV9sb2NrKTsKKworCXNwaW5fbG9jayhpbnN0YW5jZS0+aXJxX2N0cmxfbG9jayk7CisJdG1wID0gaW5iKGluc3RhbmNlLT5pcnFfY3RybF9yZWcpOworCXRtcCB8PQorCSAgICAoTUU4MjAwX0RJX0lSUV9DVFJMX0JJVF9DTEVBUiA8PAorCSAgICAgKE1FODIwMF9ESV9JUlFfQ1RSTF9TSElGVCAqIGluc3RhbmNlLT5kaV9pZHgpKTsKKwl0bXAgfD0KKwkgICAgTUU4MjAwX0RJX0lSUV9DVFJMX0JJVF9FTkFCTEUgPDwgKE1FODIwMF9ESV9JUlFfQ1RSTF9TSElGVCAqCisJCQkJCSAgICAgIGluc3RhbmNlLT5kaV9pZHgpOworCisJaWYgKGlycV9zb3VyY2UgPT0gTUVfSVJRX1NPVVJDRV9ESU9fTUFTSykgeworCQl0bXAgJj0KKwkJICAgIH4oTUU4MjAwX0RJX0lSUV9DVFJMX01BU0tfRURHRSA8PAorCQkgICAgICAoTUU4MjAwX0RJX0lSUV9DVFJMX1NISUZUICogaW5zdGFuY2UtPmRpX2lkeCkpOworCQlpZiAoaXJxX2VkZ2UgPT0gTUVfSVJRX0VER0VfUklTSU5HKSB7CisJCQl0bXAgfD0KKwkJCSAgICBNRTgyMDBfRElfSVJRX0NUUkxfTUFTS19FREdFX1JJU0lORyA8PAorCQkJICAgIChNRTgyMDBfRElfSVJRX0NUUkxfU0hJRlQgKiBpbnN0YW5jZS0+ZGlfaWR4KTsKKwkJfSBlbHNlIGlmIChpcnFfZWRnZSA9PSBNRV9JUlFfRURHRV9GQUxMSU5HKSB7CisJCQl0bXAgfD0KKwkJCSAgICBNRTgyMDBfRElfSVJRX0NUUkxfTUFTS19FREdFX0ZBTExJTkcgPDwKKwkJCSAgICAoTUU4MjAwX0RJX0lSUV9DVFJMX1NISUZUICogaW5zdGFuY2UtPmRpX2lkeCk7CisJCX0gZWxzZSBpZiAoaXJxX2VkZ2UgPT0gTUVfSVJRX0VER0VfQU5ZKSB7CisJCQl0bXAgfD0KKwkJCSAgICBNRTgyMDBfRElfSVJRX0NUUkxfTUFTS19FREdFX0FOWSA8PAorCQkJICAgIChNRTgyMDBfRElfSVJRX0NUUkxfU0hJRlQgKiBpbnN0YW5jZS0+ZGlfaWR4KTsKKwkJfQorCX0KKwlvdXRiKHRtcCwgaW5zdGFuY2UtPmlycV9jdHJsX3JlZyk7CisJUERFQlVHX1JFRygiaXJxX2N0cmxfcmVnIG91dGIoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPmlycV9jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgdG1wKTsKKwl0bXAgJj0KKwkgICAgfihNRTgyMDBfRElfSVJRX0NUUkxfQklUX0NMRUFSIDw8CisJICAgICAgKE1FODIwMF9ESV9JUlFfQ1RSTF9TSElGVCAqIGluc3RhbmNlLT5kaV9pZHgpKTsKKwlvdXRiKHRtcCwgaW5zdGFuY2UtPmlycV9jdHJsX3JlZyk7CisJUERFQlVHX1JFRygiaXJxX2N0cmxfcmVnIG91dGIoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPmlycV9jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgdG1wKTsKKworCWluc3RhbmNlLT5saW5lX3ZhbHVlID0gaW5iKGluc3RhbmNlLT5wb3J0X3JlZyk7CisJc3Bpbl91bmxvY2soaW5zdGFuY2UtPmlycV9jdHJsX2xvY2spOworCisJaW5zdGFuY2UtPnJpc2VkID0gMDsKKwlpbnN0YW5jZS0+c3RhdHVzX3ZhbHVlID0gMDsKKwlpbnN0YW5jZS0+c3RhdHVzX3ZhbHVlX2VkZ2VzID0gMDsKKwlpbnN0YW5jZS0+c3RhdHVzX2ZsYWcgPSBmbGFncyAmIE1FX0lPX0lSUV9TVEFSVF9FWFRFTkRFRF9TVEFUVVM7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBzdGF0dXMpOworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZTgyMDBfZGlfaW9faXJxX3dhaXQobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgaW50IGNoYW5uZWwsCisJCQkJIGludCAqaXJxX2NvdW50LAorCQkJCSBpbnQgKnZhbHVlLCBpbnQgdGltZV9vdXQsIGludCBmbGFncykKK3sKKwltZTgyMDBfZGlfc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCWxvbmcgdCA9IDA7CisJdW5zaWduZWQgbG9uZyBjcHVfZmxhZ3M7CisJaW50IGNvdW50OworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCVBERVZFTE9QKCJQSUQ6ICVkLlxuIiwgY3VycmVudC0+cGlkKTsKKworCWluc3RhbmNlID0gKG1lODIwMF9kaV9zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlpZiAoZmxhZ3MgJgorCSAgICB+KE1FX0lPX0lSUV9XQUlUX05PUk1BTF9TVEFUVVMgfCBNRV9JT19JUlFfV0FJVF9FWFRFTkRFRF9TVEFUVVMpKSB7CisJCVBFUlJPUigiSW52YWxpZCBmbGFnIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlpZiAoY2hhbm5lbCkgeworCQlQRVJST1IoIkludmFsaWQgY2hhbm5lbCBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwl9CisKKwlpZiAodGltZV9vdXQgPCAwKSB7CisJCVBFUlJPUigiSW52YWxpZCB0aW1lX291dCBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfVElNRU9VVDsKKwl9CisKKwlpZiAodGltZV9vdXQpIHsKKwkJdCA9ICh0aW1lX291dCAqIEhaKSAvIDEwMDA7CisKKwkJaWYgKHQgPT0gMCkKKwkJCXQgPSAxOworCX0KKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCWlmIChpbnN0YW5jZS0+cmlzZWQgPD0gMCkgeworCQlpbnN0YW5jZS0+cmlzZWQgPSAwOworCQljb3VudCA9IGluc3RhbmNlLT5jb3VudDsKKworCQlpZiAodGltZV9vdXQpIHsKKwkJCXQgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChpbnN0YW5jZS0+CisJCQkJCQkJICAgICB3YWl0X3F1ZXVlLAorCQkJCQkJCSAgICAgKChjb3VudCAhPQorCQkJCQkJCSAgICAgICBpbnN0YW5jZS0+Y291bnQpCisJCQkJCQkJICAgICAgfHwgKGluc3RhbmNlLT4KKwkJCQkJCQkJICByaXNlZCA8IDApKSwKKwkJCQkJCQkgICAgIHQpOworLy8gICAgICAgICAgICAgICAgICAgICAgdCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KGluc3RhbmNlLT53YWl0X3F1ZXVlLCAoaW5zdGFuY2UtPnJpc2VkICE9IDApLCB0KTsKKwkJCWlmICh0ID09IDApIHsKKwkJCQlQRVJST1IoIldhaXQgb24gaW50ZXJydXB0IHRpbWVkIG91dC5cbiIpOworCQkJCWVyciA9IE1FX0VSUk5PX1RJTUVPVVQ7CisJCQl9CisJCX0gZWxzZSB7CisJCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoaW5zdGFuY2UtPndhaXRfcXVldWUsCisJCQkJCQkgKChjb3VudCAhPSBpbnN0YW5jZS0+Y291bnQpCisJCQkJCQkgIHx8IChpbnN0YW5jZS0+cmlzZWQgPCAwKSkpOworLy8gICAgICAgICAgICAgICAgICAgICAgd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGluc3RhbmNlLT53YWl0X3F1ZXVlLCAoaW5zdGFuY2UtPnJpc2VkICE9IDApKTsKKwkJfQorCisJCWlmIChpbnN0YW5jZS0+cmlzZWQgPCAwKSB7CisJCQlQRVJST1IoIldhaXQgb24gaW50ZXJydXB0IGFib3J0ZWQgYnkgdXNlci5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fQ0FOQ0VMTEVEOworCQl9CisJfQorCisJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCVBFUlJPUigiV2FpdCBvbiBpbnRlcnJ1cHQgYWJvcnRlZCBieSBzaWduYWwuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fU0lHTkFMOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisJKmlycV9jb3VudCA9IGluc3RhbmNlLT5jb3VudDsKKwlpZiAoIWVycikgeworCQlpZiAoZmxhZ3MgJiBNRV9JT19JUlFfV0FJVF9OT1JNQUxfU1RBVFVTKSB7CisJCQkqdmFsdWUgPSBpbnN0YW5jZS0+c3RhdHVzX3ZhbHVlOworCQl9IGVsc2UgaWYgKGZsYWdzICYgTUVfSU9fSVJRX1dBSVRfRVhURU5ERURfU1RBVFVTKSB7CisJCQkqdmFsdWUgPSBpbnN0YW5jZS0+c3RhdHVzX3ZhbHVlX2VkZ2VzOworCQl9IGVsc2UgewkvLyBVc2UgZGVmYXVsdAorCQkJaWYgKCFpbnN0YW5jZS0+c3RhdHVzX2ZsYWcpIHsKKwkJCQkqdmFsdWUgPSBpbnN0YW5jZS0+c3RhdHVzX3ZhbHVlOworCQkJfSBlbHNlIHsKKwkJCQkqdmFsdWUgPSBpbnN0YW5jZS0+c3RhdHVzX3ZhbHVlX2VkZ2VzOworCQkJfQorCQl9CisJCWluc3RhbmNlLT5yaXNlZCA9IDA7CisvKgorCQkJaW5zdGFuY2UtPnN0YXR1c192YWx1ZSA9IDA7CisJCQlpbnN0YW5jZS0+c3RhdHVzX3ZhbHVlX2VkZ2VzID0gMDsKKyovCisJfSBlbHNlIHsKKwkJKnZhbHVlID0gMDsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lODIwMF9kaV9pb19pcnFfc3RvcChtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgc3RydWN0IGZpbGUgKmZpbGVwLCBpbnQgY2hhbm5lbCwgaW50IGZsYWdzKQoreworCW1lODIwMF9kaV9zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJdWludDhfdCB0bXA7CisJdW5zaWduZWQgbG9uZyBzdGF0dXM7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbnN0YW5jZSA9IChtZTgyMDBfZGlfc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJaWYgKGZsYWdzKSB7CisJCVBFUlJPUigiSW52YWxpZCBmbGFnIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlpZiAoY2hhbm5lbCkgeworCQlQRVJST1IoIkludmFsaWQgY2hhbm5lbCBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwl9CisKKwlNRV9TVUJERVZJQ0VfRU5URVIgc3Bpbl9sb2NrX2lycXNhdmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgc3RhdHVzKTsKKwlzcGluX2xvY2soaW5zdGFuY2UtPmlycV9jdHJsX2xvY2spOworCXRtcCA9IGluYihpbnN0YW5jZS0+aXJxX2N0cmxfcmVnKTsKKwl0bXAgfD0KKwkgICAgKE1FODIwMF9ESV9JUlFfQ1RSTF9CSVRfRU5BQkxFIDw8CisJICAgICAoTUU4MjAwX0RJX0lSUV9DVFJMX1NISUZUICogaW5zdGFuY2UtPmRpX2lkeCkpOworCW91dGIodG1wLCBpbnN0YW5jZS0+aXJxX2N0cmxfcmVnKTsKKwlQREVCVUdfUkVHKCJpcnFfY3RybF9yZWcgb3V0YigweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+aXJxX2N0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCB0bXApOworCXRtcCAmPQorCSAgICB+KE1FODIwMF9ESV9JUlFfQ1RSTF9CSVRfRU5BQkxFIDw8CisJICAgICAgKE1FODIwMF9ESV9JUlFfQ1RSTF9TSElGVCAqIGluc3RhbmNlLT5kaV9pZHgpKTsKKwl0bXAgfD0KKwkgICAgKE1FODIwMF9ESV9JUlFfQ1RSTF9CSVRfQ0xFQVIgPDwKKwkgICAgIChNRTgyMDBfRElfSVJRX0NUUkxfU0hJRlQgKiBpbnN0YW5jZS0+ZGlfaWR4KSk7CisvLyAgICAgICAgICAgICAgICAgICAgICB0bXAgJj0gfihNRTgyMDBfRElfSVJRX0NUUkxfQklUX0NMRUFSIDw8IChNRTgyMDBfRElfSVJRX0NUUkxfU0hJRlQgKiBpbnN0YW5jZS0+ZGlfaWR4KSk7CisJb3V0Yih0bXAsIGluc3RhbmNlLT5pcnFfY3RybF9yZWcpOworCVBERUJVR19SRUcoImlycV9jdHJsX3JlZyBvdXRiKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5pcnFfY3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIHRtcCk7CisJc3Bpbl91bmxvY2soaW5zdGFuY2UtPmlycV9jdHJsX2xvY2spOworCisJaW5zdGFuY2UtPnJpc2VkID0gLTE7CisJaW5zdGFuY2UtPnN0YXR1c192YWx1ZSA9IDA7CisJaW5zdGFuY2UtPnN0YXR1c192YWx1ZV9lZGdlcyA9IDA7CisJaW5zdGFuY2UtPmZpbHRlcmluZ19mbGFnID0gMDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIHN0YXR1cyk7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlX2FsbCgmaW5zdGFuY2UtPndhaXRfcXVldWUpOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZTgyMDBfZGlfaW9fc2luZ2xlX2NvbmZpZyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgICAgaW50IGNoYW5uZWwsCisJCQkJICAgICAgaW50IHNpbmdsZV9jb25maWcsCisJCQkJICAgICAgaW50IHJlZiwKKwkJCQkgICAgICBpbnQgdHJpZ19jaGFuLAorCQkJCSAgICAgIGludCB0cmlnX3R5cGUsIGludCB0cmlnX2VkZ2UsIGludCBmbGFncykKK3sKKwltZTgyMDBfZGlfc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCXVuc2lnbmVkIGxvbmcgc3RhdHVzOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJaW5zdGFuY2UgPSAobWU4MjAwX2RpX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIHN0YXR1cyk7CisKKwlzd2l0Y2ggKGZsYWdzKSB7CisJY2FzZSBNRV9JT19TSU5HTEVfQ09ORklHX05PX0ZMQUdTOgorCWNhc2UgTUVfSU9fU0lOR0xFX0NPTkZJR19ESU9fQllURToKKwkJaWYgKGNoYW5uZWwgPT0gMCkgeworCQkJaWYgKHNpbmdsZV9jb25maWcgPT0gTUVfU0lOR0xFX0NPTkZJR19ESU9fSU5QVVQpIHsKKwkJCX0gZWxzZSB7CisJCQkJUEVSUk9SKCJJbnZhbGlkIHBvcnQgZGlyZWN0aW9uIHNwZWNpZmllZC5cbiIpOworCQkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfU0lOR0xFX0NPTkZJRzsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCVBFUlJPUigiSW52YWxpZCBjaGFubmVsIG51bWJlci5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWdzIHNwZWNpZmllZC5cbiIpOworCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgc3RhdHVzKTsKKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZTgyMDBfZGlfaW9fc2luZ2xlX3JlYWQobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgaW50IGNoYW5uZWwsCisJCQkJICAgIGludCAqdmFsdWUsIGludCB0aW1lX291dCwgaW50IGZsYWdzKQoreworCW1lODIwMF9kaV9zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJdW5zaWduZWQgbG9uZyBzdGF0dXM7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbnN0YW5jZSA9IChtZTgyMDBfZGlfc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgc3RhdHVzKTsKKworCXN3aXRjaCAoZmxhZ3MpIHsKKwljYXNlIE1FX0lPX1NJTkdMRV9UWVBFX0RJT19CSVQ6CisJCWlmICgoY2hhbm5lbCA+PSAwKSAmJiAoY2hhbm5lbCA8IDgpKSB7CisJCQkqdmFsdWUgPSBpbmIoaW5zdGFuY2UtPnBvcnRfcmVnKSAmICgweDEgPDwgY2hhbm5lbCk7CisJCX0gZWxzZSB7CisJCQlQRVJST1IoIkludmFsaWQgYml0IG51bWJlciBzcGVjaWZpZWQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwkJfQorCQlicmVhazsKKworCWNhc2UgTUVfSU9fU0lOR0xFX05PX0ZMQUdTOgorCWNhc2UgTUVfSU9fU0lOR0xFX1RZUEVfRElPX0JZVEU6CisJCWlmIChjaGFubmVsID09IDApIHsKKwkJCSp2YWx1ZSA9IGluYihpbnN0YW5jZS0+cG9ydF9yZWcpOworCQl9IGVsc2UgeworCQkJUEVSUk9SKCJJbnZhbGlkIGNoYW5uZWwgbnVtYmVyLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlQRVJST1IoIkludmFsaWQgZmxhZ3Mgc3BlY2lmaWVkLlxuIik7CisJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBzdGF0dXMpOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lODIwMF9kaV9pb19yZXNldF9zdWJkZXZpY2Uoc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlLAorCQkJCQlzdHJ1Y3QgZmlsZSAqZmlsZXAsIGludCBmbGFncykKK3sKKwltZTgyMDBfZGlfc3ViZGV2aWNlX3QgKmluc3RhbmNlID0gKG1lODIwMF9kaV9zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpZiAoZmxhZ3MpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWcgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCWluc3RhbmNlLT5jb3VudCA9IDA7CisJcmV0dXJuIG1lODIwMF9kaV9pb19pcnFfc3RvcChzdWJkZXZpY2UsIGZpbGVwLCAwLCAwKTsKK30KKworc3RhdGljIGludCBtZTgyMDBfZGlfcXVlcnlfbnVtYmVyX2NoYW5uZWxzKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQkgICBpbnQgKm51bWJlcikKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJKm51bWJlciA9IDg7CisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWU4MjAwX2RpX3F1ZXJ5X3N1YmRldmljZV90eXBlKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQkgIGludCAqdHlwZSwgaW50ICpzdWJ0eXBlKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwkqdHlwZSA9IE1FX1RZUEVfREk7CisJKnN1YnR5cGUgPSBNRV9TVUJUWVBFX1NJTkdMRTsKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZTgyMDBfZGlfcXVlcnlfc3ViZGV2aWNlX2NhcHMobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsIGludCAqY2FwcykKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJKmNhcHMgPQorCSAgICBNRV9DQVBTX0RJT19CSVRfUEFUVEVSTl9JUlEgfAorCSAgICBNRV9DQVBTX0RJT19CSVRfTUFTS19JUlFfRURHRV9SSVNJTkcgfAorCSAgICBNRV9DQVBTX0RJT19CSVRfTUFTS19JUlFfRURHRV9GQUxMSU5HIHwKKwkgICAgTUVfQ0FQU19ESU9fQklUX01BU0tfSVJRX0VER0VfQU5ZOworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsIDYsIDE5KQorc3RhdGljIGlycXJldHVybl90IG1lODIwMF9pc3IoaW50IGlycSwgdm9pZCAqZGV2X2lkKQorI2Vsc2UKK3N0YXRpYyBpcnFyZXR1cm5fdCBtZTgyMDBfaXNyKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCisjZW5kaWYKK3sKKwltZTgyMDBfZGlfc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCXVpbnQ4X3QgY3RybDsKKwl1aW50OF90IGlycV9zdGF0dXM7CisJdWludDhfdCBsaW5lX3ZhbHVlID0gMDsKKwl1aW50OF90IGxpbmVfc3RhdHVzID0gMDsKKwl1aW50MzJfdCBzdGF0dXNfdmFsID0gMDsKKworCWluc3RhbmNlID0gKG1lODIwMF9kaV9zdWJkZXZpY2VfdCAqKSBkZXZfaWQ7CisKKwlpZiAoaXJxICE9IGluc3RhbmNlLT5pcnEpIHsKKwkJUEVSUk9SKCJJbmNvcnJlY3QgaW50ZXJydXB0IG51bTogJWQuXG4iLCBpcnEpOworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCisJaXJxX3N0YXR1cyA9IGluYihpbnN0YW5jZS0+aXJxX3N0YXR1c19yZWcpOworCWlmICghaXJxX3N0YXR1cykgeworCQlQSU5GTworCQkgICAgKCIlbGQgU2hhcmVkIGludGVycnVwdC4gJXMoKTogaWR4PSVkIGlycV9zdGF0dXNfcmVnPTB4JTA0WFxuIiwKKwkJICAgICBqaWZmaWVzLCBfX2Z1bmNfXywgaW5zdGFuY2UtPmRpX2lkeCwgaXJxX3N0YXR1cyk7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlzcGluX2xvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisJc3Bpbl9sb2NrKGluc3RhbmNlLT5pcnFfY3RybF9sb2NrKTsKKwljdHJsID0gaW5iKGluc3RhbmNlLT5pcnFfY3RybF9yZWcpOworCWN0cmwgfD0KKwkgICAgTUU4MjAwX0RJX0lSUV9DVFJMX0JJVF9DTEVBUiA8PCAoTUU4MjAwX0RJX0lSUV9DVFJMX1NISUZUICoKKwkJCQkJICAgICBpbnN0YW5jZS0+ZGlfaWR4KTsKKwlvdXRiKGN0cmwsIGluc3RhbmNlLT5pcnFfY3RybF9yZWcpOworCVBERUJVR19SRUcoImlycV9jdHJsX3JlZyBvdXRiKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5pcnFfY3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIGN0cmwpOworCWN0cmwgJj0KKwkgICAgfihNRTgyMDBfRElfSVJRX0NUUkxfQklUX0NMRUFSIDw8CisJICAgICAgKE1FODIwMF9ESV9JUlFfQ1RSTF9TSElGVCAqIGluc3RhbmNlLT5kaV9pZHgpKTsKKwlvdXRiKGN0cmwsIGluc3RhbmNlLT5pcnFfY3RybF9yZWcpOworCVBERUJVR19SRUcoImlycV9jdHJsX3JlZyBvdXRiKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5pcnFfY3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIGN0cmwpOworCisJbGluZV92YWx1ZSA9IGluYihpbnN0YW5jZS0+cG9ydF9yZWcpOworCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5pcnFfY3RybF9sb2NrKTsKKworCWxpbmVfc3RhdHVzID0gKCh1aW50OF90KSBpbnN0YW5jZS0+bGluZV92YWx1ZSBeIGxpbmVfdmFsdWUpOworCisJLy8gTWFrZSBleHRlbmRlZCBpbmZvcm1hdGlvbi4KKwlzdGF0dXNfdmFsIHw9ICgweDAwRkYgJiAofih1aW50OF90KSBpbnN0YW5jZS0+bGluZV92YWx1ZSAmIGxpbmVfdmFsdWUpKSA8PCAxNjsJLy9SYWlzZQorCXN0YXR1c192YWwgfD0gKDB4MDBGRiAmICgodWludDhfdCkgaW5zdGFuY2UtPmxpbmVfdmFsdWUgJiB+bGluZV92YWx1ZSkpOwkvL0ZhbGwKKworCWluc3RhbmNlLT5saW5lX3ZhbHVlID0gKGludClsaW5lX3ZhbHVlOworCisJaWYgKGluc3RhbmNlLT5yaXNlZCA9PSAwKSB7CisJCWluc3RhbmNlLT5zdGF0dXNfdmFsdWUgPSBpcnFfc3RhdHVzIHwgbGluZV9zdGF0dXM7CisJCWluc3RhbmNlLT5zdGF0dXNfdmFsdWVfZWRnZXMgPSBzdGF0dXNfdmFsOworCX0gZWxzZSB7CisJCWluc3RhbmNlLT5zdGF0dXNfdmFsdWUgfD0gaXJxX3N0YXR1cyB8IGxpbmVfc3RhdHVzOworCQlpbnN0YW5jZS0+c3RhdHVzX3ZhbHVlX2VkZ2VzIHw9IHN0YXR1c192YWw7CisJfQorCisJaWYgKGluc3RhbmNlLT5maWx0ZXJpbmdfZmxhZykgewkvLyBGb3IgY29tcGFyZSBtb2RlIG9ubHkuCisJCWlmIChpbnN0YW5jZS0+Y29tcGFyZV92YWx1ZSA9PSBpbnN0YW5jZS0+bGluZV92YWx1ZSkgeworCQkJaW5zdGFuY2UtPnJpc2VkID0gMTsKKwkJCWluc3RhbmNlLT5jb3VudCsrOworCQl9CisJfSBlbHNlIHsKKwkJaW5zdGFuY2UtPnJpc2VkID0gMTsKKwkJaW5zdGFuY2UtPmNvdW50Kys7CisJfQorCXNwaW5fdW5sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCisJc3Bpbl91bmxvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisKKwl3YWtlX3VwX2ludGVycnVwdGlibGVfYWxsKCZpbnN0YW5jZS0+d2FpdF9xdWV1ZSk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiwgNiwgMTkpCitzdGF0aWMgaXJxcmV0dXJuX3QgbWU4MjAwX2lzcl9FWChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCisjZWxzZQorc3RhdGljIGlycXJldHVybl90IG1lODIwMF9pc3JfRVgoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKKyNlbmRpZgoreworCW1lODIwMF9kaV9zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJdWludDhfdCBpcnFfc3RhdHVzID0gMDsKKwl1aW50MTZfdCBpcnFfc3RhdHVzX0VYID0gMDsKKwl1aW50MzJfdCBzdGF0dXNfdmFsID0gMDsKKwlpbnQgaSwgajsKKworCWluc3RhbmNlID0gKG1lODIwMF9kaV9zdWJkZXZpY2VfdCAqKSBkZXZfaWQ7CisKKwlpZiAoaXJxICE9IGluc3RhbmNlLT5pcnEpIHsKKwkJUEVSUk9SKCJJbmNvcnJlY3QgaW50ZXJydXB0IG51bTogJWQuXG4iLCBpcnEpOworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJLy9SZXNldCBsYXRjaGVzLiBDb3B5IHN0YXR1cyB0byBleHRlbmRlZCByZWdpc3RlcnMuCisJaXJxX3N0YXR1cyA9IGluYihpbnN0YW5jZS0+aXJxX3N0YXR1c19yZWcpOworCVBERUJVR19SRUcoImlkeD0lZCBpcnFfc3RhdHVzX3JlZz0weCUwMlhcbiIsIGluc3RhbmNlLT5kaV9pZHgsCisJCSAgIGlycV9zdGF0dXMpOworCisJaWYgKCFpcnFfc3RhdHVzKSB7CisJCVBJTkZPCisJCSAgICAoIiVsZCBTaGFyZWQgaW50ZXJydXB0LiAlcygpOiBpZHg9JWQgaXJxX3N0YXR1c19yZWc9MHglMDRYXG4iLAorCQkgICAgIGppZmZpZXMsIF9fZnVuY19fLCBpbnN0YW5jZS0+ZGlfaWR4LCBpcnFfc3RhdHVzKTsKKwkJcmV0dXJuIElSUV9OT05FOworCX0KKworCWlycV9zdGF0dXNfRVggPSBpbmIoaW5zdGFuY2UtPmlycV9zdGF0dXNfbG93X3JlZyk7CisJaXJxX3N0YXR1c19FWCB8PSAoaW5iKGluc3RhbmNlLT5pcnFfc3RhdHVzX2hpZ2hfcmVnKSA8PCA4KTsKKworCVBERVZFTE9QKCJFWFRFTkRFRCBSRUc6IDB4JTA0eFxuIiwgaXJxX3N0YXR1c19FWCk7CisJaW5zdGFuY2UtPmxpbmVfdmFsdWUgPSBpbmIoaW5zdGFuY2UtPnBvcnRfcmVnKTsKKworCS8vIEZvcm1hdCBleHRlbmRlZCBpbmZvcm1hdGlvbi4KKwlmb3IgKGkgPSAwLCBqID0gMDsgaSA8IDg7IGkrKywgaiArPSAyKSB7CisJCXN0YXR1c192YWwgfD0gKCgweDAxIDw8IGopICYgaXJxX3N0YXR1c19FWCkgPj4gKGogLSBpKTsJLy9GYWxsCisJCXN0YXR1c192YWwgfD0gKCgweDAxIDw8IChqICsgMSkpICYgaXJxX3N0YXR1c19FWCkgPDwgKDE1IC0gaiArIGkpOwkvL1JhaXNlCisJfQorCisJc3Bpbl9sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCWlmIChpbnN0YW5jZS0+cmlzZWQgPT0gMCkgeworCQlpbnN0YW5jZS0+c3RhdHVzX3ZhbHVlID0gaXJxX3N0YXR1czsKKwkJaW5zdGFuY2UtPnN0YXR1c192YWx1ZV9lZGdlcyA9IHN0YXR1c192YWw7CisJfSBlbHNlIHsKKwkJaW5zdGFuY2UtPnN0YXR1c192YWx1ZSB8PSBpcnFfc3RhdHVzOworCQlpbnN0YW5jZS0+c3RhdHVzX3ZhbHVlX2VkZ2VzIHw9IHN0YXR1c192YWw7CisJfQorCisJaWYgKGluc3RhbmNlLT5maWx0ZXJpbmdfZmxhZykgewkvLyBGb3IgY29tcGFyZSBtb2RlIG9ubHkuCisJCWlmIChpbnN0YW5jZS0+Y29tcGFyZV92YWx1ZSA9PSBpbnN0YW5jZS0+bGluZV92YWx1ZSkgeworCQkJaW5zdGFuY2UtPnJpc2VkID0gMTsKKwkJCWluc3RhbmNlLT5jb3VudCsrOworCQl9CisJfSBlbHNlIHsKKwkJaW5zdGFuY2UtPnJpc2VkID0gMTsKKwkJaW5zdGFuY2UtPmNvdW50Kys7CisJfQorCXNwaW5fdW5sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlX2FsbCgmaW5zdGFuY2UtPndhaXRfcXVldWUpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgdm9pZCBtZTgyMDBfZGlfZGVzdHJ1Y3RvcihzdHJ1Y3QgbWVfc3ViZGV2aWNlICpzdWJkZXZpY2UpCit7CisJbWU4MjAwX2RpX3N1YmRldmljZV90ICppbnN0YW5jZTsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lODIwMF9kaV9zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlmcmVlX2lycShpbnN0YW5jZS0+aXJxLCAodm9pZCAqKWluc3RhbmNlKTsKKwltZV9zdWJkZXZpY2VfZGVpbml0KCZpbnN0YW5jZS0+YmFzZSk7CisJa2ZyZWUoaW5zdGFuY2UpOworfQorCittZTgyMDBfZGlfc3ViZGV2aWNlX3QgKm1lODIwMF9kaV9jb25zdHJ1Y3Rvcih1aW50MzJfdCBtZTgyMDBfcmVnYmFzZSwKKwkJCQkJICAgICB1bnNpZ25lZCBpbnQgZGlfaWR4LAorCQkJCQkgICAgIGludCBpcnEsCisJCQkJCSAgICAgc3BpbmxvY2tfdCAqIGlycV9jdHJsX2xvY2ssCisJCQkJCSAgICAgc3BpbmxvY2tfdCAqIGlycV9tb2RlX2xvY2spCit7CisJbWU4MjAwX2RpX3N1YmRldmljZV90ICpzdWJkZXZpY2U7CisJaW50IGVycjsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCS8qIEFsbG9jYXRlIG1lbW9yeSBmb3Igc3ViZGV2aWNlIGluc3RhbmNlICovCisJc3ViZGV2aWNlID0ga21hbGxvYyhzaXplb2YobWU4MjAwX2RpX3N1YmRldmljZV90KSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIXN1YmRldmljZSkgeworCQlQRVJST1IoIkNhbm5vdCBnZXQgbWVtb3J5IGZvciBzdWJkZXZpY2UgaW5zdGFuY2UuXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJbWVtc2V0KHN1YmRldmljZSwgMCwgc2l6ZW9mKG1lODIwMF9kaV9zdWJkZXZpY2VfdCkpOworCisJLyogSW5pdGlhbGl6ZSBzdWJkZXZpY2UgYmFzZSBjbGFzcyAqLworCWVyciA9IG1lX3N1YmRldmljZV9pbml0KCZzdWJkZXZpY2UtPmJhc2UpOworCisJaWYgKGVycikgeworCQlQRVJST1IoIkNhbm5vdCBpbml0aWFsaXplIHN1YmRldmljZSBiYXNlIGNsYXNzIGluc3RhbmNlLlxuIik7CisJCWtmcmVlKHN1YmRldmljZSk7CisJCXJldHVybiBOVUxMOworCX0KKwkvLyBDaGVjayBmaXJtd2FyZSB2ZXJzaW9uLgorCW1lODIwMF9kaV9jaGVja192ZXJzaW9uKHN1YmRldmljZSwKKwkJCQltZTgyMDBfcmVnYmFzZSArIE1FODIwMF9GSVJNV0FSRV9WRVJTSU9OX1JFRyk7CisKKwkvLyBJbml0aWFsaXplIHNwaW4gbG9ja3MuCisJc3Bpbl9sb2NrX2luaXQoJnN1YmRldmljZS0+c3ViZGV2aWNlX2xvY2spOworCisJc3ViZGV2aWNlLT5pcnFfY3RybF9sb2NrID0gaXJxX2N0cmxfbG9jazsKKwlzdWJkZXZpY2UtPmlycV9tb2RlX2xvY2sgPSBpcnFfbW9kZV9sb2NrOworCisJLyogU2F2ZSB0aGUgc3ViZGV2aWNlIGluZGV4LiAqLworCXN1YmRldmljZS0+ZGlfaWR4ID0gZGlfaWR4OworCisJLyogSW5pdGlhbGl6ZSByZWdpc3RlcnMgKi8KKwlpZiAoZGlfaWR4ID09IDApIHsKKwkJc3ViZGV2aWNlLT5wb3J0X3JlZyA9IG1lODIwMF9yZWdiYXNlICsgTUU4MjAwX0RJX1BPUlRfMF9SRUc7CisJCXN1YmRldmljZS0+bWFza19yZWcgPSBtZTgyMDBfcmVnYmFzZSArIE1FODIwMF9ESV9NQVNLXzBfUkVHOworCQlzdWJkZXZpY2UtPmNvbXBhcmVfcmVnID0KKwkJICAgIG1lODIwMF9yZWdiYXNlICsgTUU4MjAwX0RJX0NPTVBBUkVfMF9SRUc7CisJCXN1YmRldmljZS0+aXJxX3N0YXR1c19yZWcgPQorCQkgICAgbWU4MjAwX3JlZ2Jhc2UgKyBNRTgyMDBfRElfQ0hBTkdFXzBfUkVHOworCisJCXN1YmRldmljZS0+aXJxX3N0YXR1c19sb3dfcmVnID0KKwkJICAgIG1lODIwMF9yZWdiYXNlICsgTUU4MjAwX0RJX0VYVEVORF9DSEFOR0VfMF9MT1dfUkVHOworCQlzdWJkZXZpY2UtPmlycV9zdGF0dXNfaGlnaF9yZWcgPQorCQkgICAgbWU4MjAwX3JlZ2Jhc2UgKyBNRTgyMDBfRElfRVhURU5EX0NIQU5HRV8wX0hJR0hfUkVHOworCX0gZWxzZSBpZiAoZGlfaWR4ID09IDEpIHsKKwkJc3ViZGV2aWNlLT5wb3J0X3JlZyA9IG1lODIwMF9yZWdiYXNlICsgTUU4MjAwX0RJX1BPUlRfMV9SRUc7CisJCXN1YmRldmljZS0+bWFza19yZWcgPSBtZTgyMDBfcmVnYmFzZSArIE1FODIwMF9ESV9NQVNLXzFfUkVHOworCQlzdWJkZXZpY2UtPmNvbXBhcmVfcmVnID0KKwkJICAgIG1lODIwMF9yZWdiYXNlICsgTUU4MjAwX0RJX0NPTVBBUkVfMV9SRUc7CisJCXN1YmRldmljZS0+aXJxX3N0YXR1c19yZWcgPQorCQkgICAgbWU4MjAwX3JlZ2Jhc2UgKyBNRTgyMDBfRElfQ0hBTkdFXzFfUkVHOworCisJCXN1YmRldmljZS0+aXJxX3N0YXR1c19sb3dfcmVnID0KKwkJICAgIG1lODIwMF9yZWdiYXNlICsgTUU4MjAwX0RJX0VYVEVORF9DSEFOR0VfMV9MT1dfUkVHOworCQlzdWJkZXZpY2UtPmlycV9zdGF0dXNfaGlnaF9yZWcgPQorCQkgICAgbWU4MjAwX3JlZ2Jhc2UgKyBNRTgyMDBfRElfRVhURU5EX0NIQU5HRV8xX0hJR0hfUkVHOworCX0gZWxzZSB7CisJCVBFUlJPUigiV3Jvbmcgc3ViZGV2aWNlIGlkeD0lZC5cbiIsIGRpX2lkeCk7CisJCWtmcmVlKHN1YmRldmljZSk7CisJCXJldHVybiBOVUxMOworCX0KKwlzdWJkZXZpY2UtPmlycV9jdHJsX3JlZyA9IG1lODIwMF9yZWdiYXNlICsgTUU4MjAwX0RJX0lSUV9DVFJMX1JFRzsKKwlzdWJkZXZpY2UtPmlycV9tb2RlX3JlZyA9IG1lODIwMF9yZWdiYXNlICsgTUU4MjAwX0lSUV9NT0RFX1JFRzsKKyNpZmRlZiBNRURFQlVHX0RFQlVHX1JFRworCXN1YmRldmljZS0+cmVnX2Jhc2UgPSBtZTgyMDBfcmVnYmFzZTsKKyNlbmRpZgorCisJLyogSW5pdGlhbGl6ZSB3YWl0IHF1ZXVlICovCisJaW5pdF93YWl0cXVldWVfaGVhZCgmc3ViZGV2aWNlLT53YWl0X3F1ZXVlKTsKKworCS8qIE92ZXJsb2FkIGJhc2UgY2xhc3MgbWV0aG9kcy4gKi8KKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX2lycV9zdGFydCA9IG1lODIwMF9kaV9pb19pcnFfc3RhcnQ7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19pcnFfd2FpdCA9IG1lODIwMF9kaV9pb19pcnFfd2FpdDsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX2lycV9zdG9wID0gbWU4MjAwX2RpX2lvX2lycV9zdG9wOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fcmVzZXRfc3ViZGV2aWNlID0KKwkgICAgbWU4MjAwX2RpX2lvX3Jlc2V0X3N1YmRldmljZTsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3NpbmdsZV9jb25maWcgPQorCSAgICBtZTgyMDBfZGlfaW9fc2luZ2xlX2NvbmZpZzsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3NpbmdsZV9yZWFkID0gbWU4MjAwX2RpX2lvX3NpbmdsZV9yZWFkOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfcXVlcnlfbnVtYmVyX2NoYW5uZWxzID0KKwkgICAgbWU4MjAwX2RpX3F1ZXJ5X251bWJlcl9jaGFubmVsczsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV90eXBlID0KKwkgICAgbWU4MjAwX2RpX3F1ZXJ5X3N1YmRldmljZV90eXBlOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfcXVlcnlfc3ViZGV2aWNlX2NhcHMgPQorCSAgICBtZTgyMDBfZGlfcXVlcnlfc3ViZGV2aWNlX2NhcHM7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9kZXN0cnVjdG9yID0gbWU4MjAwX2RpX2Rlc3RydWN0b3I7CisKKwlzdWJkZXZpY2UtPnJpc2VkID0gMDsKKwlzdWJkZXZpY2UtPmNvdW50ID0gMDsKKworCS8qIFJlZ2lzdGVyIGludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmUuICovCisJc3ViZGV2aWNlLT5pcnEgPSBpcnE7CisJaWYgKHN1YmRldmljZS0+dmVyc2lvbiA+IDApIHsJLy8gTkVXCisJCWVyciA9IHJlcXVlc3RfaXJxKHN1YmRldmljZS0+aXJxLCBtZTgyMDBfaXNyX0VYLAorI2lmZGVmIElSUUZfRElTQUJMRUQKKwkJCQkgIElSUUZfRElTQUJMRUQgfCBJUlFGX1NIQVJFRCwKKyNlbHNlCisJCQkJICBTQV9JTlRFUlJVUFQgfCBTQV9TSElSUSwKKyNlbmRpZgorCQkJCSAgTUU4MjAwX05BTUUsICh2b2lkICopc3ViZGV2aWNlKTsKKwl9IGVsc2UgewkJLy9PTEQKKwkJZXJyID0gcmVxdWVzdF9pcnEoc3ViZGV2aWNlLT5pcnEsIG1lODIwMF9pc3IsCisjaWZkZWYgSVJRRl9ESVNBQkxFRAorCQkJCSAgSVJRRl9ESVNBQkxFRCB8IElSUUZfU0hBUkVELAorI2Vsc2UKKwkJCQkgIFNBX0lOVEVSUlVQVCB8IFNBX1NISVJRLAorI2VuZGlmCisJCQkJICBNRTgyMDBfTkFNRSwgKHZvaWQgKilzdWJkZXZpY2UpOworCX0KKworCWlmIChlcnIpIHsKKwkJUEVSUk9SKCJDYW5ub3QgaW5pdGlhbGl6ZSBzdWJkZXZpY2UgYmFzZSBjbGFzcyBpbnN0YW5jZS5cbiIpOworCQlrZnJlZShzdWJkZXZpY2UpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJUERFQlVHKCJSZWdpc3RyZWQgaXJxPSVkLlxuIiwgc3ViZGV2aWNlLT5pcnEpOworCisJcmV0dXJuIHN1YmRldmljZTsKK30KKworc3RhdGljIHZvaWQgbWU4MjAwX2RpX2NoZWNrX3ZlcnNpb24obWU4MjAwX2RpX3N1YmRldmljZV90ICogaW5zdGFuY2UsCisJCQkJICAgIHVuc2lnbmVkIGxvbmcgYWRkcikKK3sKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwlpbnN0YW5jZS0+dmVyc2lvbiA9IDB4MDAwMDAwRkYgJiBpbmIoYWRkcik7CisJUERFVkVMT1AoIm1lODIwMCBmaXJtd2FyZSB2ZXJzaW9uOiAlZFxuIiwgaW5zdGFuY2UtPnZlcnNpb24pOworCisJLy8vIEBub3RlIEZpeCBmb3Igd3JvbmcgdmFsdWVzIGluIHRoaXMgcmVnaXN0cnkuCisJaWYgKChpbnN0YW5jZS0+dmVyc2lvbiA8IDB4NykgfHwgKGluc3RhbmNlLT52ZXJzaW9uID4gMHgxRikpCisJCWluc3RhbmNlLT52ZXJzaW9uID0gMHgwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODIwMF9kaS5oIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODIwMF9kaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhM2IwMDUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU4MjAwX2RpLmgKQEAgLTAsMCArMSw5MiBAQAorLyoqCisgKiBAZmlsZSBtZTgyMDBfZGkuaAorICoKKyAqIEBicmllZiBNRS04MjAwIGRpZ2l0YWwgaW5wdXQgc3ViZGV2aWNlIGNsYXNzLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX01FODIwMF9ESV9IXworI2RlZmluZSBfTUU4MjAwX0RJX0hfCisKKyNpbmNsdWRlICJtZXN1YmRldmljZS5oIgorCisjaWZkZWYgX19LRVJORUxfXworCisvKioKKyAqIEBicmllZiBUaGUgdGVtcGxhdGUgc3ViZGV2aWNlIGNsYXNzLgorICovCit0eXBlZGVmIHN0cnVjdCBtZTgyMDBfZGlfc3ViZGV2aWNlIHsKKwkvKiBJbmhlcml0YW5jZSAqLworCW1lX3N1YmRldmljZV90IGJhc2U7CQkJLyoqPCBUaGUgc3ViZGV2aWNlIGJhc2UgY2xhc3MuICovCisKKwkvKiBBdHRyaWJ1dGVzICovCisJc3BpbmxvY2tfdCBzdWJkZXZpY2VfbG9jazsJCS8qKjwgU3BpbiBsb2NrIHRvIHByb3RlY3QgdGhlIHN1YmRldmljZSBmcm9tIGNvbmN1cnJlbnQgYWNjZXNzLiAqLworCXNwaW5sb2NrX3QgKmN0cmxfcmVnX2xvY2s7CisJc3BpbmxvY2tfdCAqaXJxX2N0cmxfbG9jazsKKwlzcGlubG9ja190ICppcnFfbW9kZV9sb2NrOworCisJdW5zaWduZWQgaW50IGRpX2lkeDsKKwl1bnNpZ25lZCBpbnQgdmVyc2lvbjsKKworCWludCBpcnE7CQkJCQkJLyoqPCBUaGUgbnVtYmVyIG9mIHRoZSBpbnRlcnJ1cHQgcmVxdWVzdC4gKi8KKwl2b2xhdGlsZSBpbnQgcmlzZWQ7CQkJCS8qKjwgRmxhZyB0byBpbmRpY2F0ZSBpZiBhbiBpbnRlcnJ1cHQgb2NjdXJlZC4gKi8KKwl1aW50IHN0YXR1c19mbGFnOwkJCQkvKio8IERlZmF1bHQgaW50ZXJ1cHQgc3RhdHVzIGZsYWcgKi8KKwl1aW50IHN0YXR1c192YWx1ZTsJCQkJLyoqPCBJbnRlcnVwdCBzdGF0dXMgKi8KKwl1aW50IHN0YXR1c192YWx1ZV9lZGdlczsJCQkvKio8IEV4dGVuZGVkIGludGVydXB0IHN0YXR1cyAqLworCXVpbnQgbGluZV92YWx1ZTsKKwlpbnQgY291bnQ7CQkJCQkJLyoqPCBDb3VudHMgdGhlIG51bWJlciBvZiBpbnRlcnJ1cHRzIG9jY3VyZWQuICovCisJdWludDhfdCBjb21wYXJlX3ZhbHVlOworCXVpbnQ4X3QgZmlsdGVyaW5nX2ZsYWc7CisKKwl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0X3F1ZXVlOwkvKio8IFRvIHdhaXQgb24gaW50ZXJydXB0cy4gKi8KKworCXVuc2lnbmVkIGxvbmcgcG9ydF9yZWc7CQkJLyoqPCBUaGUgZGlnaXRhbCBpbnB1dCBwb3J0LiAqLworCXVuc2lnbmVkIGxvbmcgY29tcGFyZV9yZWc7CQkvKio8IFRoZSByZWdpc3RlciB0byBob2xkIHRoZSB2YWx1ZSB0byBjb21wYXJlIHdpdGguICovCisJdW5zaWduZWQgbG9uZyBtYXNrX3JlZzsJCQkvKio8IFRoZSByZWdpc3RlciB0byBob2xkIHRoZSBtYXNrLiAqLworCXVuc2lnbmVkIGxvbmcgaXJxX21vZGVfcmVnOwkJLyoqPCBUaGUgaW50ZXJydXB0IG1vZGUgcmVnaXN0ZXIuICovCisJdW5zaWduZWQgbG9uZyBpcnFfY3RybF9yZWc7CQkvKio8IFRoZSBpbnRlcnJ1cHQgY29udHJvbCByZWdpc3Rlci4gKi8KKwl1bnNpZ25lZCBsb25nIGlycV9zdGF0dXNfcmVnOwkvKio8IFRoZSBpbnRlcnJ1cHQgc3RhdHVzIHJlZ2lzdGVyLiBBbHNvIGludGVycnVwdCByZXNldGluZyByZWdpc3RlciAoZmlybXdhcmUgdmVyc2lvbiA3IGFuZCBsYXRlcikuKi8KKyNpZmRlZiBNRURFQlVHX0RFQlVHX1JFRworCXVuc2lnbmVkIGxvbmcgcmVnX2Jhc2U7CisjZW5kaWYKKwl1bnNpZ25lZCBsb25nIGZpcm13YXJlX3ZlcnNpb25fcmVnOwkvKio8IFRoZSBpbnRlcnJ1cHQgcmVzZXRpbmcgcmVnaXN0ZXIuICovCisKKwl1bnNpZ25lZCBsb25nIGlycV9zdGF0dXNfbG93X3JlZzsJLyoqPCBUaGUgaW50ZXJydXB0IGV4dGVuZGVkIHN0YXR1cyByZWdpc3RlciAobG93IHBhcnQpLiAqLworCXVuc2lnbmVkIGxvbmcgaXJxX3N0YXR1c19oaWdoX3JlZzsJLyoqPCBUaGUgaW50ZXJydXB0IGV4dGVuZGVkIHN0YXR1cyByZWdpc3RlciAoaGlnaCBwYXJ0KS4gKi8KK30gbWU4MjAwX2RpX3N1YmRldmljZV90OworCisvKioKKyAqIEBicmllZiBUaGUgY29uc3RydWN0b3IgdG8gZ2VuZXJhdGUgYSBNRS04MjAwIGRpZ2l0YWwgaW5wdXQgc3ViZGV2aWNlIGluc3RhbmNlLgorICoKKyAqIEBwYXJhbSByZWdfYmFzZSBUaGUgcmVnaXN0ZXIgYmFzZSBhZGRyZXNzIG9mIHRoZSBkZXZpY2UgYXMgcmV0dXJuZWQgYnkgdGhlIFBDSSBCSU9TLgorICoKKyAqIEByZXR1cm4gUG9pbnRlciB0byBuZXcgaW5zdGFuY2Ugb24gc3VjY2Vzcy5cbgorICogTlVMTCBvbiBlcnJvci4KKyAqLworbWU4MjAwX2RpX3N1YmRldmljZV90ICptZTgyMDBfZGlfY29uc3RydWN0b3IodWludDMyX3QgbWU4MjAwX3JlZ19iYXNlLAorCQkJCQkgICAgIHVuc2lnbmVkIGludCBkaV9pZHgsCisJCQkJCSAgICAgaW50IGlycSwKKwkJCQkJICAgICBzcGlubG9ja190ICogaXJxX2N0cmxfbG9jaywKKwkJCQkJICAgICBzcGlubG9ja190ICogaXJxX21vZGVfbG9jayk7CisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU4MjAwX2RpX3JlZy5oIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODIwMF9kaV9yZWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOWE2MTlkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODIwMF9kaV9yZWcuaApAQCAtMCwwICsxLDc1IEBACisvKioKKyAqIEBmaWxlIG1lODIwMF9kaV9yZWcuaAorICoKKyAqIEBicmllZiBNRS04MjAwIGRpZ2l0YWwgaW5wdXQgc3ViZGV2aWNlIHJlZ2lzdGVyIGRlZmluaXRpb25zLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX01FODIwMF9ESV9SRUdfSF8KKyNkZWZpbmUgX01FODIwMF9ESV9SRUdfSF8KKworI2lmZGVmIF9fS0VSTkVMX18KKworLy8gQ29tbW9uIHJlZ2lzdHJ5IGZvciB3aG9sZSBmYW1pbHkuCisjZGVmaW5lIE1FODIwMF9ESV9QT1JUXzBfUkVHCQkJCQkweDMJLy8gUgorI2RlZmluZSBNRTgyMDBfRElfUE9SVF8xX1JFRwkJCQkJMHg0CS8vIFIKKworI2RlZmluZSBNRTgyMDBfRElfTUFTS18wX1JFRwkJCQkJMHg1CS8vIFIvVworI2RlZmluZSBNRTgyMDBfRElfTUFTS18xX1JFRwkJCQkJMHg2CS8vIFIvVworCisjZGVmaW5lIE1FODIwMF9ESV9DT01QQVJFXzBfUkVHCQkJCQkweEEJLy8gUi9XCisjZGVmaW5lIE1FODIwMF9ESV9DT01QQVJFXzFfUkVHCQkJCQkweEIJLy8gUi9XCisKKyNkZWZpbmUgTUU4MjAwX0RJX0lSUV9DVFJMX1JFRwkJCQkJMHhDCS8vIFIvVworCisjaWZuZGVmIE1FODIwMF9JUlFfTU9ERV9SRUcKKyMgZGVmaW5lIE1FODIwMF9JUlFfTU9ERV9SRUcJCQkJCTB4RAkvLyBSL1cKKyNlbmRpZgorCisvLyBUaGlzIHJlZ2lzdHJ5IGFyZSBmb3IgYWxsIHZlcnNpb25zCisjZGVmaW5lIE1FODIwMF9ESV9DSEFOR0VfMF9SRUcJCQkJCTB4RQkvLyBSCisjZGVmaW5lIE1FODIwMF9ESV9DSEFOR0VfMV9SRUcJCQkJCTB4RgkvLyBSCisKKyNkZWZpbmUgTUU4MjAwX0RJX0lSUV9DVFJMX0JJVF9DTEVBUgkJCTB4NAorI2RlZmluZSBNRTgyMDBfRElfSVJRX0NUUkxfQklUX0VOQUJMRQkJCTB4OAorCisvLyBUaGlzIHJlZ2lzdHJ5IGFyZSBmb3IgZmlybXdhcmUgdmVyc2lvbnMgNyBhbmQgbGF0ZXIKKyNkZWZpbmUgTUU4MjAwX0RJX0VYVEVORF9DSEFOR0VfMF9MT1dfUkVHCQkweDEwCS8vIFIKKyNkZWZpbmUgTUU4MjAwX0RJX0VYVEVORF9DSEFOR0VfMF9ISUdIX1JFRwkJMHgxMQkvLyBSCisjZGVmaW5lIE1FODIwMF9ESV9FWFRFTkRfQ0hBTkdFXzFfTE9XX1JFRwkJMHgxMgkvLyBSCisjZGVmaW5lIE1FODIwMF9ESV9FWFRFTkRfQ0hBTkdFXzFfSElHSF9SRUcJCTB4MTMJLy8gUgorCisjaWZuZGVmIE1FODIwMF9GSVJNV0FSRV9WRVJTSU9OX1JFRworIyBkZWZpbmUgTUU4MjAwX0ZJUk1XQVJFX1ZFUlNJT05fUkVHCQkJMHgxNAkvLyBSCisjZW5kaWYKKworLy8gQml0IGRlZmluaXRpb25zCisjZGVmaW5lIE1FODIwMF9ESV9JUlFfQ1RSTF9NQVNLX0VER0UJCQkweDMKKyNkZWZpbmUgTUU4MjAwX0RJX0lSUV9DVFJMX01BU0tfRURHRV9SSVNJTkcJCTB4MAorI2RlZmluZSBNRTgyMDBfRElfSVJRX0NUUkxfTUFTS19FREdFX0ZBTExJTkcJMHgxCisjZGVmaW5lIE1FODIwMF9ESV9JUlFfQ1RSTF9NQVNLX0VER0VfQU5ZCQkweDMKKworLy8gT3RoZXJzCisjZGVmaW5lIE1FODIwMF9ESV9JUlFfQ1RSTF9TSElGVAkJCQk0CisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU4MjAwX2Rpby5jIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODIwMF9kaW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjhjYTFiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODIwMF9kaW8uYwpAQCAtMCwwICsxLDQxOCBAQAorLyoqCisgKiBAZmlsZSBtZTgyMDBfZGlvLmMKKyAqCisgKiBAYnJpZWYgTUUtODIwMCBkaWdpdGFsIGlucHV0L291dHB1dCBzdWJkZXZpY2UgaW5zdGFuY2UuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKiBAYXV0aG9yIEtyenlzenRvZiBHYW50emtlCShrLmdhbnR6a2VAbWVpbGhhdXMuZGUpCisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0tFUk5FTF9fCisjICBkZWZpbmUgX19LRVJORUxfXworI2VuZGlmCisKKy8qCisgKiBJbmNsdWRlcworICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjaW5jbHVkZSAibWVkZWZpbmVzLmgiCisjaW5jbHVkZSAibWVpbnRlcm5hbC5oIgorI2luY2x1ZGUgIm1lZXJyb3IuaCIKKworI2luY2x1ZGUgIm1lZGVidWcuaCIKKyNpbmNsdWRlICJtZTgyMDBfZGlvX3JlZy5oIgorI2luY2x1ZGUgIm1lODIwMF9kaW8uaCIKKworLyoKKyAqIERlZmluZXMKKyAqLworCisvKgorICogRnVuY3Rpb25zCisgKi8KKworc3RhdGljIGludCBtZTgyMDBfZGlvX2lvX3Jlc2V0X3N1YmRldmljZShzdHJ1Y3QgbWVfc3ViZGV2aWNlICpzdWJkZXZpY2UsCisJCQkJCSBzdHJ1Y3QgZmlsZSAqZmlsZXAsIGludCBmbGFncykKK3sKKwltZTgyMDBfZGlvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwl1aW50OF90IG1vZGU7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpZiAoZmxhZ3MpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWcgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCWluc3RhbmNlID0gKG1lODIwMF9kaW9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJc3Bpbl9sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCXNwaW5fbG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisJbW9kZSA9IGluYihpbnN0YW5jZS0+Y3RybF9yZWcpOworCW1vZGUgJj0gfigweDMgPDwgKGluc3RhbmNlLT5kaW9faWR4ICogMikpOworCW91dGIobW9kZSwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgbW9kZSk7CisJc3Bpbl91bmxvY2soaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2spOworCW91dGIoMHgwMCwgaW5zdGFuY2UtPnBvcnRfcmVnKTsKKwlQREVCVUdfUkVHKCJwb3J0X3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5wb3J0X3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgMHgwMCk7CisJc3Bpbl91bmxvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lODIwMF9kaW9faW9fc2luZ2xlX2NvbmZpZyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICAgICBpbnQgY2hhbm5lbCwKKwkJCQkgICAgICAgaW50IHNpbmdsZV9jb25maWcsCisJCQkJICAgICAgIGludCByZWYsCisJCQkJICAgICAgIGludCB0cmlnX2NoYW4sCisJCQkJICAgICAgIGludCB0cmlnX3R5cGUsIGludCB0cmlnX2VkZ2UsIGludCBmbGFncykKK3sKKwltZTgyMDBfZGlvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwl1aW50MzJfdCBtb2RlOworCXVpbnQzMl90IHNpemUgPQorCSAgICBmbGFncyAmIChNRV9JT19TSU5HTEVfQ09ORklHX0RJT19CSVQgfCBNRV9JT19TSU5HTEVfQ09ORklHX0RJT19CWVRFCisJCSAgICAgfCBNRV9JT19TSU5HTEVfQ09ORklHX0RJT19XT1JEIHwKKwkJICAgICBNRV9JT19TSU5HTEVfQ09ORklHX0RJT19EV09SRCk7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbnN0YW5jZSA9IChtZTgyMDBfZGlvX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCXNwaW5fbG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKwlzcGluX2xvY2soaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2spOworCW1vZGUgPSBpbmIoaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwlzd2l0Y2ggKHNpemUpIHsKKwljYXNlIE1FX0lPX1NJTkdMRV9DT05GSUdfTk9fRkxBR1M6CisJY2FzZSBNRV9JT19TSU5HTEVfQ09ORklHX0RJT19CWVRFOgorCQlpZiAoY2hhbm5lbCA9PSAwKSB7CisJCQlpZiAoc2luZ2xlX2NvbmZpZyA9PSBNRV9TSU5HTEVfQ09ORklHX0RJT19JTlBVVCkgeworCQkJCW1vZGUgJj0KKwkJCQkgICAgfigoTUU4MjAwX0RJT19DVFJMX0JJVF9NT0RFXzAgfAorCQkJCSAgICAgICBNRTgyMDBfRElPX0NUUkxfQklUX01PREVfMSkgPDwKKwkJCQkgICAgICAoaW5zdGFuY2UtPmRpb19pZHggKiAyKSk7CisJCQl9IGVsc2UgaWYgKHNpbmdsZV9jb25maWcgPT0gTUVfU0lOR0xFX0NPTkZJR19ESU9fT1VUUFVUKSB7CisJCQkJbW9kZSAmPQorCQkJCSAgICB+KChNRTgyMDBfRElPX0NUUkxfQklUX01PREVfMCB8CisJCQkJICAgICAgIE1FODIwMF9ESU9fQ1RSTF9CSVRfTU9ERV8xKSA8PAorCQkJCSAgICAgIChpbnN0YW5jZS0+ZGlvX2lkeCAqIDIpKTsKKwkJCQltb2RlIHw9CisJCQkJICAgIE1FODIwMF9ESU9fQ1RSTF9CSVRfTU9ERV8wIDw8IChpbnN0YW5jZS0+CisJCQkJCQkJCSAgIGRpb19pZHggKiAyKTsKKwkJCX0gZWxzZSB7CisJCQkJUEVSUk9SCisJCQkJICAgICgiSW52YWxpZCBwb3J0IGNvbmZpZ3VyYXRpb24gc3BlY2lmaWVkLlxuIik7CisJCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9TSU5HTEVfQ09ORklHOworCQkJfQorCQl9IGVsc2UgeworCQkJUEVSUk9SKCJJbnZhbGlkIGNoYW5uZWwgbnVtYmVyLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJCX0KKworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCVBFUlJPUigiSW52YWxpZCBmbGFncy5cbiIpOworCisJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJfQorCisJaWYgKCFlcnIpIHsKKwkJb3V0Yihtb2RlLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCBtb2RlKTsKKwl9CisJc3Bpbl91bmxvY2soaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2spOworCXNwaW5fdW5sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lODIwMF9kaW9faW9fc2luZ2xlX3JlYWQobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgICBpbnQgY2hhbm5lbCwKKwkJCQkgICAgIGludCAqdmFsdWUsIGludCB0aW1lX291dCwgaW50IGZsYWdzKQoreworCW1lODIwMF9kaW9fc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCXVpbnQ4X3QgbW9kZTsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lODIwMF9kaW9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJc3Bpbl9sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCXNwaW5fbG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisJc3dpdGNoIChmbGFncykgeworCWNhc2UgTUVfSU9fU0lOR0xFX1RZUEVfRElPX0JJVDoKKwkJaWYgKChjaGFubmVsID49IDApICYmIChjaGFubmVsIDwgOCkpIHsKKwkJCW1vZGUgPQorCQkJICAgIGluYihpbnN0YW5jZS0+CisJCQkJY3RybF9yZWcpICYgKChNRTgyMDBfRElPX0NUUkxfQklUX01PREVfMCB8CisJCQkJCSAgICAgIE1FODIwMF9ESU9fQ1RSTF9CSVRfTU9ERV8xKSA8PAorCQkJCQkgICAgIChpbnN0YW5jZS0+ZGlvX2lkeCAqIDIpKTsKKworCQkJaWYgKChtb2RlID09CisJCQkgICAgIChNRTgyMDBfRElPX0NUUkxfQklUX01PREVfMCA8PAorCQkJICAgICAgKGluc3RhbmNlLT5kaW9faWR4ICogMikpKSB8fCAhbW9kZSkgeworCQkJCSp2YWx1ZSA9CisJCQkJICAgIGluYihpbnN0YW5jZS0+CisJCQkJCXBvcnRfcmVnKSAmICgweDAwMDEgPDwgY2hhbm5lbCk7CisJCQl9IGVsc2UgeworCQkJCVBFUlJPUigiUG9ydCBub3QgaW4gb3V0cHV0IG9yIGlucHV0IG1vZGUuXG4iKTsKKwkJCQllcnIgPSBNRV9FUlJOT19QUkVWSU9VU19DT05GSUc7CisJCQl9CisJCX0gZWxzZSB7CisJCQlQRVJST1IoIkludmFsaWQgYml0IG51bWJlciBzcGVjaWZpZWQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwkJfQorCQlicmVhazsKKworCWNhc2UgTUVfSU9fU0lOR0xFX05PX0ZMQUdTOgorCWNhc2UgTUVfSU9fU0lOR0xFX1RZUEVfRElPX0JZVEU6CisJCWlmIChjaGFubmVsID09IDApIHsKKwkJCW1vZGUgPQorCQkJICAgIGluYihpbnN0YW5jZS0+CisJCQkJY3RybF9yZWcpICYgKChNRTgyMDBfRElPX0NUUkxfQklUX01PREVfMCB8CisJCQkJCSAgICAgIE1FODIwMF9ESU9fQ1RSTF9CSVRfTU9ERV8xKSA8PAorCQkJCQkgICAgIChpbnN0YW5jZS0+ZGlvX2lkeCAqIDIpKTsKKworCQkJaWYgKChtb2RlID09CisJCQkgICAgIChNRTgyMDBfRElPX0NUUkxfQklUX01PREVfMCA8PAorCQkJICAgICAgKGluc3RhbmNlLT5kaW9faWR4ICogMikpKSB8fCAhbW9kZSkgeworCQkJCSp2YWx1ZSA9IGluYihpbnN0YW5jZS0+cG9ydF9yZWcpICYgMHgwMEZGOworCQkJfSBlbHNlIHsKKwkJCQlQRVJST1IoIlBvcnQgbm90IGluIG91dHB1dCBvciBpbnB1dCBtb2RlLlxuIik7CisJCQkJZXJyID0gTUVfRVJSTk9fUFJFVklPVVNfQ09ORklHOworCQkJfQorCQl9IGVsc2UgeworCQkJUEVSUk9SKCJJbnZhbGlkIGJ5dGUgbnVtYmVyIHNwZWNpZmllZC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWdzIHNwZWNpZmllZC5cbiIpOworCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKwlzcGluX3VubG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisJc3Bpbl91bmxvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWU4MjAwX2Rpb19pb19zaW5nbGVfd3JpdGUobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICAgIGludCBjaGFubmVsLAorCQkJCSAgICAgIGludCB2YWx1ZSwgaW50IHRpbWVfb3V0LCBpbnQgZmxhZ3MpCit7CisJbWU4MjAwX2Rpb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJdWludDhfdCBtb2RlOworCXVpbnQ4X3QgYnl0ZTsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lODIwMF9kaW9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJc3Bpbl9sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCXNwaW5fbG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisJc3dpdGNoIChmbGFncykgeworCWNhc2UgTUVfSU9fU0lOR0xFX1RZUEVfRElPX0JJVDoKKwkJaWYgKChjaGFubmVsID49IDApICYmIChjaGFubmVsIDwgOCkpIHsKKwkJCW1vZGUgPQorCQkJICAgIGluYihpbnN0YW5jZS0+CisJCQkJY3RybF9yZWcpICYgKChNRTgyMDBfRElPX0NUUkxfQklUX01PREVfMCB8CisJCQkJCSAgICAgIE1FODIwMF9ESU9fQ1RSTF9CSVRfTU9ERV8xKSA8PAorCQkJCQkgICAgIChpbnN0YW5jZS0+ZGlvX2lkeCAqIDIpKTsKKworCQkJaWYgKG1vZGUgPT0KKwkJCSAgICAoTUU4MjAwX0RJT19DVFJMX0JJVF9NT0RFXzAgPDwKKwkJCSAgICAgKGluc3RhbmNlLT5kaW9faWR4ICogMikpKSB7CisJCQkJYnl0ZSA9IGluYihpbnN0YW5jZS0+cG9ydF9yZWcpOworCisJCQkJaWYgKHZhbHVlKQorCQkJCQlieXRlIHw9IDB4MSA8PCBjaGFubmVsOworCQkJCWVsc2UKKwkJCQkJYnl0ZSAmPSB+KDB4MSA8PCBjaGFubmVsKTsKKworCQkJCW91dGIoYnl0ZSwgaW5zdGFuY2UtPnBvcnRfcmVnKTsKKwkJCQlQREVCVUdfUkVHKCJwb3J0X3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJCSAgIGluc3RhbmNlLT5wb3J0X3JlZyAtCisJCQkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwgYnl0ZSk7CisJCQl9IGVsc2UgeworCQkJCVBFUlJPUigiUG9ydCBub3QgaW4gb3V0cHV0IG9yIGlucHV0IG1vZGUuXG4iKTsKKwkJCQllcnIgPSBNRV9FUlJOT19QUkVWSU9VU19DT05GSUc7CisJCQl9CisJCX0gZWxzZSB7CisJCQlQRVJST1IoIkludmFsaWQgYml0IG51bWJlciBzcGVjaWZpZWQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwkJfQorCQlicmVhazsKKworCWNhc2UgTUVfSU9fU0lOR0xFX05PX0ZMQUdTOgorCWNhc2UgTUVfSU9fU0lOR0xFX1RZUEVfRElPX0JZVEU6CisJCWlmIChjaGFubmVsID09IDApIHsKKwkJCW1vZGUgPQorCQkJICAgIGluYihpbnN0YW5jZS0+CisJCQkJY3RybF9yZWcpICYgKChNRTgyMDBfRElPX0NUUkxfQklUX01PREVfMCB8CisJCQkJCSAgICAgIE1FODIwMF9ESU9fQ1RSTF9CSVRfTU9ERV8xKSA8PAorCQkJCQkgICAgIChpbnN0YW5jZS0+ZGlvX2lkeCAqIDIpKTsKKworCQkJaWYgKG1vZGUgPT0KKwkJCSAgICAoTUU4MjAwX0RJT19DVFJMX0JJVF9NT0RFXzAgPDwKKwkJCSAgICAgKGluc3RhbmNlLT5kaW9faWR4ICogMikpKSB7CisJCQkJb3V0Yih2YWx1ZSwgaW5zdGFuY2UtPnBvcnRfcmVnKTsKKwkJCQlQREVCVUdfUkVHKCJwb3J0X3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJCSAgIGluc3RhbmNlLT5wb3J0X3JlZyAtCisJCQkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwgdmFsdWUpOworCQkJfSBlbHNlIHsKKwkJCQlQRVJST1IoIlBvcnQgbm90IGluIG91dHB1dCBvciBpbnB1dCBtb2RlLlxuIik7CisJCQkJZXJyID0gTUVfRVJSTk9fUFJFVklPVVNfQ09ORklHOworCQkJfQorCQl9IGVsc2UgeworCQkJUEVSUk9SKCJJbnZhbGlkIGJ5dGUgbnVtYmVyIHNwZWNpZmllZC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWdzIHNwZWNpZmllZC5cbiIpOworCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKwlzcGluX3VubG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisJc3Bpbl91bmxvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWU4MjAwX2Rpb19xdWVyeV9udW1iZXJfY2hhbm5lbHMobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJCSAgICBpbnQgKm51bWJlcikKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJKm51bWJlciA9IDg7CisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWU4MjAwX2Rpb19xdWVyeV9zdWJkZXZpY2VfdHlwZShtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJICAgaW50ICp0eXBlLCBpbnQgKnN1YnR5cGUpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCSp0eXBlID0gTUVfVFlQRV9ESU87CisJKnN1YnR5cGUgPSBNRV9TVUJUWVBFX1NJTkdMRTsKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZTgyMDBfZGlvX3F1ZXJ5X3N1YmRldmljZV9jYXBzKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQkgICBpbnQgKmNhcHMpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCSpjYXBzID0gTUVfQ0FQU19ESU9fRElSX0JZVEU7CisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK21lODIwMF9kaW9fc3ViZGV2aWNlX3QgKm1lODIwMF9kaW9fY29uc3RydWN0b3IodWludDMyX3QgcmVnX2Jhc2UsCisJCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgZGlvX2lkeCwKKwkJCQkJICAgICAgIHNwaW5sb2NrX3QgKiBjdHJsX3JlZ19sb2NrKQoreworCW1lODIwMF9kaW9fc3ViZGV2aWNlX3QgKnN1YmRldmljZTsKKwlpbnQgZXJyOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJLyogQWxsb2NhdGUgbWVtb3J5IGZvciBzdWJkZXZpY2UgaW5zdGFuY2UgKi8KKwlzdWJkZXZpY2UgPSBrbWFsbG9jKHNpemVvZihtZTgyMDBfZGlvX3N1YmRldmljZV90KSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIXN1YmRldmljZSkgeworCQlQRVJST1IoIkNhbm5vdCBnZXQgbWVtb3J5IGZvciBzdWJkZXZpY2UgaW5zdGFuY2UuXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJbWVtc2V0KHN1YmRldmljZSwgMCwgc2l6ZW9mKG1lODIwMF9kaW9fc3ViZGV2aWNlX3QpKTsKKworCS8qIEluaXRpYWxpemUgc3ViZGV2aWNlIGJhc2UgY2xhc3MgKi8KKwllcnIgPSBtZV9zdWJkZXZpY2VfaW5pdCgmc3ViZGV2aWNlLT5iYXNlKTsKKworCWlmIChlcnIpIHsKKwkJUEVSUk9SKCJDYW5ub3QgaW5pdGlhbGl6ZSBzdWJkZXZpY2UgYmFzZSBjbGFzcyBpbnN0YW5jZS5cbiIpOworCQlrZnJlZShzdWJkZXZpY2UpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJLy8gSW5pdGlhbGl6ZSBzcGluIGxvY2tzLgorCXNwaW5fbG9ja19pbml0KCZzdWJkZXZpY2UtPnN1YmRldmljZV9sb2NrKTsKKworCXN1YmRldmljZS0+Y3RybF9yZWdfbG9jayA9IGN0cmxfcmVnX2xvY2s7CisKKwkvKiBTYXZlIGRpZ2l0YWwgaS9vIGluZGV4ICovCisJc3ViZGV2aWNlLT5kaW9faWR4ID0gZGlvX2lkeDsKKworCS8qIFNhdmUgdGhlIHN1YmRldmljZSBpbmRleCAqLworCXN1YmRldmljZS0+Y3RybF9yZWcgPSByZWdfYmFzZSArIE1FODIwMF9ESU9fQ1RSTF9SRUc7CisJc3ViZGV2aWNlLT5wb3J0X3JlZyA9IHJlZ19iYXNlICsgTUU4MjAwX0RJT19QT1JUX1JFRyArIGRpb19pZHg7CisjaWZkZWYgTUVERUJVR19ERUJVR19SRUcKKwlzdWJkZXZpY2UtPnJlZ19iYXNlID0gcmVnX2Jhc2U7CisjZW5kaWYKKworCS8qIE92ZXJsb2FkIGJhc2UgY2xhc3MgbWV0aG9kcy4gKi8KKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3Jlc2V0X3N1YmRldmljZSA9CisJICAgIG1lODIwMF9kaW9faW9fcmVzZXRfc3ViZGV2aWNlOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fc2luZ2xlX2NvbmZpZyA9CisJICAgIG1lODIwMF9kaW9faW9fc2luZ2xlX2NvbmZpZzsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3NpbmdsZV9yZWFkID0gbWU4MjAwX2Rpb19pb19zaW5nbGVfcmVhZDsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3NpbmdsZV93cml0ZSA9CisJICAgIG1lODIwMF9kaW9faW9fc2luZ2xlX3dyaXRlOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfcXVlcnlfbnVtYmVyX2NoYW5uZWxzID0KKwkgICAgbWU4MjAwX2Rpb19xdWVyeV9udW1iZXJfY2hhbm5lbHM7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9zdWJkZXZpY2VfdHlwZSA9CisJICAgIG1lODIwMF9kaW9fcXVlcnlfc3ViZGV2aWNlX3R5cGU7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9zdWJkZXZpY2VfY2FwcyA9CisJICAgIG1lODIwMF9kaW9fcXVlcnlfc3ViZGV2aWNlX2NhcHM7CisKKwlyZXR1cm4gc3ViZGV2aWNlOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODIwMF9kaW8uaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTgyMDBfZGlvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWRkZDkzZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTgyMDBfZGlvLmgKQEAgLTAsMCArMSw2OCBAQAorLyoqCisgKiBAZmlsZSBtZTgyMDBfZGlvLmgKKyAqCisgKiBAYnJpZWYgTUUtODIwMCBkaWdpdGFsIGlucHV0L291dHB1dCBzdWJkZXZpY2UgY2xhc3MuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfTUU4MjAwX0RJT19IXworI2RlZmluZSBfTUU4MjAwX0RJT19IXworCisjaW5jbHVkZSAibWVzdWJkZXZpY2UuaCIKKworI2lmZGVmIF9fS0VSTkVMX18KKworLyoqCisgKiBAYnJpZWYgVGhlIHRlbXBsYXRlIHN1YmRldmljZSBjbGFzcy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgbWU4MjAwX2Rpb19zdWJkZXZpY2UgeworCS8qIEluaGVyaXRhbmNlICovCisJbWVfc3ViZGV2aWNlX3QgYmFzZTsJCQkvKio8IFRoZSBzdWJkZXZpY2UgYmFzZSBjbGFzcy4gKi8KKworCS8qIEF0dHJpYnV0ZXMgKi8KKwlzcGlubG9ja190IHN1YmRldmljZV9sb2NrOwkJLyoqPCBTcGluIGxvY2sgdG8gcHJvdGVjdCB0aGUgc3ViZGV2aWNlIGZyb20gY29uY3VycmVudCBhY2Nlc3MuICovCisJc3BpbmxvY2tfdCAqY3RybF9yZWdfbG9jazsJCS8qKjwgU3BpbiBsb2NrIHRvIHByb3RlY3QgI2N0cmxfcmVnIGZyb20gY29uY3VycmVudCBhY2Nlc3MuICovCisJdW5zaWduZWQgaW50IGRpb19pZHg7CQkJLyoqPCBUaGUgaW5kZXggb2YgdGhlIGRpZ2l0YWwgaS9vIG9uIHRoZSBkZXZpY2UuICovCisKKwl1bnNpZ25lZCBsb25nIHBvcnRfcmVnOwkJCS8qKjwgUmVnaXN0ZXIgaG9sZGluZyB0aGUgcG9ydCBzdGF0dXMuICovCisJdW5zaWduZWQgbG9uZyBjdHJsX3JlZzsJCQkvKio8IFJlZ2lzdGVyIHRvIGNvbmZpZ3VyZSB0aGUgcG9ydCBkaXJlY3Rpb24uICovCisjaWZkZWYgTUVERUJVR19ERUJVR19SRUcKKwl1bnNpZ25lZCBsb25nIHJlZ19iYXNlOworI2VuZGlmCit9IG1lODIwMF9kaW9fc3ViZGV2aWNlX3Q7CisKKy8qKgorICogQGJyaWVmIFRoZSBjb25zdHJ1Y3RvciB0byBnZW5lcmF0ZSBhIE1FLTgyMDAgZGlnaXRhbCBpbnB1dC9vdXB1dCBzdWJkZXZpY2UgaW5zdGFuY2UuCisgKgorICogQHBhcmFtIHJlZ19iYXNlIFRoZSByZWdpc3RlciBiYXNlIGFkZHJlc3Mgb2YgdGhlIGRldmljZSBhcyByZXR1cm5lZCBieSB0aGUgUENJIEJJT1MuCisgKiBAcGFyYW0gZGlvX2lkeCBUaGUgaW5kZXggb2YgdGhlIGRpZ2l0YWwgaS9vIHBvcnQgb24gdGhlIGRldmljZS4KKyAqIEBwYXJhbSBjdHJsX3JlZ19sb2NrIFNwaW4gbG9jayBwcm90ZWN0aW5nIHRoZSBjb250cm9sIHJlZ2lzdGVyLgorICoKKyAqIEByZXR1cm4gUG9pbnRlciB0byBuZXcgaW5zdGFuY2Ugb24gc3VjY2Vzcy5cbgorICogTlVMTCBvbiBlcnJvci4KKyAqLworbWU4MjAwX2Rpb19zdWJkZXZpY2VfdCAqbWU4MjAwX2Rpb19jb25zdHJ1Y3Rvcih1aW50MzJfdCByZWdfYmFzZSwKKwkJCQkJICAgICAgIHVuc2lnbmVkIGludCBkaW9faWR4LAorCQkJCQkgICAgICAgc3BpbmxvY2tfdCAqIGN0cmxfcmVnX2xvY2spOworCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODIwMF9kaW9fcmVnLmggYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU4MjAwX2Rpb19yZWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzk0YTEzMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTgyMDBfZGlvX3JlZy5oCkBAIC0wLDAgKzEsNDMgQEAKKy8qKgorICogQGZpbGUgbWU4MjAwX2Rpb19yZWcuaAorICoKKyAqIEBicmllZiBNRS04MjAwIGRpZ2l0YWwgaW5wdXQvb3V0cHV0IHN1YmRldmljZSByZWdpc3RlciBkZWZpbml0aW9ucy4KKyAqIEBub3RlIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKiBAYXV0aG9yIEd1ZW50ZXIgR2ViaGFyZHQKKyAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9NRTgyMDBfRElPX1JFR19IXworI2RlZmluZSBfTUU4MjAwX0RJT19SRUdfSF8KKworI2lmZGVmIF9fS0VSTkVMX18KKworI2RlZmluZSBNRTgyMDBfRElPX0NUUkxfUkVHCQkJCQkweDcJLy8gUi9XCisjZGVmaW5lIE1FODIwMF9ESU9fUE9SVF8wX1JFRwkJCQkweDgJLy8gUi9XCisjZGVmaW5lIE1FODIwMF9ESU9fUE9SVF8xX1JFRwkJCQkweDkJLy8gUi9XCisjZGVmaW5lIE1FODIwMF9ESU9fUE9SVF9SRUcJCQkJCU1FODIwMF9ESU9fUE9SVF8wX1JFRwkvLyBSL1cKKworI2RlZmluZSBNRTgyMDBfRElPX0NUUkxfQklUX01PREVfMAkJCTB4MDEKKyNkZWZpbmUgTUU4MjAwX0RJT19DVFJMX0JJVF9NT0RFXzEJCQkweDAyCisjZGVmaW5lIE1FODIwMF9ESU9fQ1RSTF9CSVRfTU9ERV8yCQkJMHgwNAorI2RlZmluZSBNRTgyMDBfRElPX0NUUkxfQklUX01PREVfMwkJCTB4MDgKKworI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTgyMDBfZG8uYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTgyMDBfZG8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMmJlYmQxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODIwMF9kby5jCkBAIC0wLDAgKzEsNjAwIEBACisvKioKKyAqIEBmaWxlIG1lODIwMF9kby5jCisgKgorICogQGJyaWVmIE1FLTgyMDAgZGlnaXRhbCBvdXRwdXQgc3ViZGV2aWNlIGluc3RhbmNlLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICogQGF1dGhvciBLcnp5c3p0b2YgR2FudHprZQkoay5nYW50emtlQG1laWxoYXVzLmRlKQorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX19LRVJORUxfXworIyAgZGVmaW5lIF9fS0VSTkVMX18KKyNlbmRpZgorCisvKgorICogSW5jbHVkZXMKKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisKKyNpbmNsdWRlICJtZWRlZmluZXMuaCIKKyNpbmNsdWRlICJtZWludGVybmFsLmgiCisjaW5jbHVkZSAibWVlcnJvci5oIgorCisjaW5jbHVkZSAibWVpZHMuaCIKKyNpbmNsdWRlICJtZWRlYnVnLmgiCisjaW5jbHVkZSAibWU4MjAwX3JlZy5oIgorI2luY2x1ZGUgIm1lODIwMF9kb19yZWcuaCIKKyNpbmNsdWRlICJtZTgyMDBfZG8uaCIKKworLyoKKyAqIERlZmluZXMKKyAqLworCisvKgorICogRnVuY3Rpb25zCisgKi8KKworc3RhdGljIGludCBtZTgyMDBfZG9faW9faXJxX3N0YXJ0KG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgaW50IGNoYW5uZWwsCisJCQkJICBpbnQgaXJxX3NvdXJjZSwKKwkJCQkgIGludCBpcnFfZWRnZSwgaW50IGlycV9hcmcsIGludCBmbGFncykKK3sKKwltZTgyMDBfZG9fc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCXVpbnQ4X3QgdG1wOworCXVuc2lnbmVkIGxvbmcgc3RhdHVzOworCisJaWYgKGZsYWdzICYgfk1FX0lPX0lSUV9TVEFSVF9ESU9fQllURSkgeworCQlQRVJST1IoIkludmFsaWQgZmxhZyBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJfQorCisJaWYgKGNoYW5uZWwgIT0gMCkgeworCQlQRVJST1IoIkludmFsaWQgY2hhbm5lbCBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwl9CisKKwlpZiAoaXJxX3NvdXJjZSAhPSBNRV9JUlFfU09VUkNFX0RJT19PVkVSX1RFTVApIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGludGVycnVwdCBzb3VyY2Ugc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0lSUV9TT1VSQ0U7CisJfQorCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJaW5zdGFuY2UgPSAobWU4MjAwX2RvX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIHN0YXR1cyk7CisJc3Bpbl9sb2NrKGluc3RhbmNlLT5pcnFfbW9kZV9sb2NrKTsKKwl0bXAgPSBpbmIoaW5zdGFuY2UtPmlycV9jdHJsX3JlZyk7CisJdG1wIHw9CisJICAgIE1FODIwMF9JUlFfTU9ERV9CSVRfRU5BQkxFX1BPV0VSIDw8IChNRTgyMDBfSVJRX01PREVfUE9XRVJfU0hJRlQgKgorCQkJCQkJIGluc3RhbmNlLT5kb19pZHgpOworCW91dGIodG1wLCBpbnN0YW5jZS0+aXJxX2N0cmxfcmVnKTsKKwlQREVCVUdfUkVHKCJpcnFfY3RybF9yZWcgb3V0YigweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+aXJxX2N0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCB0bXApOworCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5pcnFfbW9kZV9sb2NrKTsKKwlpbnN0YW5jZS0+cmlzZWQgPSAwOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgc3RhdHVzKTsKKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZTgyMDBfZG9faW9faXJxX3dhaXQobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgaW50IGNoYW5uZWwsCisJCQkJIGludCAqaXJxX2NvdW50LAorCQkJCSBpbnQgKnZhbHVlLCBpbnQgdGltZV9vdXQsIGludCBmbGFncykKK3sKKwltZTgyMDBfZG9fc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCWxvbmcgdCA9IDA7CisJdW5zaWduZWQgbG9uZyBjcHVfZmxhZ3M7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbnN0YW5jZSA9IChtZTgyMDBfZG9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJaWYgKGZsYWdzKSB7CisJCVBFUlJPUigiSW52YWxpZCBmbGFnIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlpZiAodGltZV9vdXQgPCAwKSB7CisJCVBFUlJPUigiSW52YWxpZCB0aW1lX291dCBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfVElNRU9VVDsKKwl9CisKKwlpZiAodGltZV9vdXQpIHsKKwkJdCA9ICh0aW1lX291dCAqIEhaKSAvIDEwMDA7CisKKwkJaWYgKHQgPT0gMCkKKwkJCXQgPSAxOworCX0KKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCWlmIChpbnN0YW5jZS0+cmlzZWQgPD0gMCkgeworCQlpbnN0YW5jZS0+cmlzZWQgPSAwOworCisJCWlmICh0aW1lX291dCkgeworCQkJdCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KGluc3RhbmNlLT4KKwkJCQkJCQkgICAgIHdhaXRfcXVldWUsCisJCQkJCQkJICAgICAoaW5zdGFuY2UtPnJpc2VkICE9CisJCQkJCQkJICAgICAgMCksIHQpOworCisJCQlpZiAodCA9PSAwKSB7CisJCQkJUEVSUk9SCisJCQkJICAgICgiV2FpdCBvbiBleHRlcm5hbCBpbnRlcnJ1cHQgdGltZWQgb3V0LlxuIik7CisJCQkJZXJyID0gTUVfRVJSTk9fVElNRU9VVDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShpbnN0YW5jZS0+d2FpdF9xdWV1ZSwKKwkJCQkJCSAoaW5zdGFuY2UtPnJpc2VkICE9IDApKTsKKwkJfQorCisJCWlmIChpbnN0YW5jZS0+cmlzZWQgPCAwKSB7CisJCQlQRVJST1IoIldhaXQgb24gaW50ZXJydXB0IGFib3J0ZWQgYnkgdXNlci5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fQ0FOQ0VMTEVEOworCQl9CisJfQorCisJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCVBFUlJPUigiV2FpdCBvbiBleHRlcm5hbCBpbnRlcnJ1cHQgYWJvcnRlZCBieSBzaWduYWwuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fU0lHTkFMOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisJaW5zdGFuY2UtPnJpc2VkID0gMDsKKwkqaXJxX2NvdW50ID0gaW5zdGFuY2UtPmNvdW50OworCSp2YWx1ZSA9IDA7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lODIwMF9kb19pb19pcnFfc3RvcChtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgc3RydWN0IGZpbGUgKmZpbGVwLCBpbnQgY2hhbm5lbCwgaW50IGZsYWdzKQoreworCW1lODIwMF9kb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJdWludDhfdCB0bXA7CisJdW5zaWduZWQgbG9uZyBjcHVfZmxhZ3M7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbnN0YW5jZSA9IChtZTgyMDBfZG9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJaWYgKGZsYWdzKSB7CisJCVBFUlJPUigiSW52YWxpZCBmbGFnIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCXNwaW5fbG9jayhpbnN0YW5jZS0+aXJxX21vZGVfbG9jayk7CisJdG1wID0gaW5iKGluc3RhbmNlLT5pcnFfY3RybF9yZWcpOworCXRtcCAmPQorCSAgICB+KE1FODIwMF9JUlFfTU9ERV9CSVRfRU5BQkxFX1BPV0VSIDw8CisJICAgICAgKE1FODIwMF9JUlFfTU9ERV9QT1dFUl9TSElGVCAqIGluc3RhbmNlLT5kb19pZHgpKTsKKwlvdXRiKHRtcCwgaW5zdGFuY2UtPmlycV9jdHJsX3JlZyk7CisJUERFQlVHX1JFRygiaXJxX2N0cmxfcmVnIG91dGIoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPmlycV9jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgdG1wKTsKKwlzcGluX3VubG9jayhpbnN0YW5jZS0+aXJxX21vZGVfbG9jayk7CisJaW5zdGFuY2UtPnJpc2VkID0gLTE7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCXdha2VfdXBfaW50ZXJydXB0aWJsZV9hbGwoJmluc3RhbmNlLT53YWl0X3F1ZXVlKTsKKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWU4MjAwX2RvX2lvX3Jlc2V0X3N1YmRldmljZShzdHJ1Y3QgbWVfc3ViZGV2aWNlICpzdWJkZXZpY2UsCisJCQkJCXN0cnVjdCBmaWxlICpmaWxlcCwgaW50IGZsYWdzKQoreworCW1lODIwMF9kb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJdW5zaWduZWQgbG9uZyBjcHVfZmxhZ3M7CisJdWludDhfdCB0bXA7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbnN0YW5jZSA9IChtZTgyMDBfZG9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJaWYgKGZsYWdzKSB7CisJCVBFUlJPUigiSW52YWxpZCBmbGFnIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCW91dGIoMHgwMCwgaW5zdGFuY2UtPnBvcnRfcmVnKTsKKwlQREVCVUdfUkVHKCJwb3J0X3JlZyBvdXRiKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5wb3J0X3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgMHgwMCk7CisJc3Bpbl9sb2NrKGluc3RhbmNlLT5pcnFfbW9kZV9sb2NrKTsKKwl0bXAgPSBpbmIoaW5zdGFuY2UtPmlycV9jdHJsX3JlZyk7CisJdG1wICY9CisJICAgIH4oTUU4MjAwX0lSUV9NT0RFX0JJVF9FTkFCTEVfUE9XRVIgPDwKKwkgICAgICAoTUU4MjAwX0lSUV9NT0RFX1BPV0VSX1NISUZUICogaW5zdGFuY2UtPmRvX2lkeCkpOworCW91dGIodG1wLCBpbnN0YW5jZS0+aXJxX2N0cmxfcmVnKTsKKwlQREVCVUdfUkVHKCJpcnFfY3RybF9yZWcgb3V0YigweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+aXJxX2N0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCB0bXApOworCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5pcnFfbW9kZV9sb2NrKTsKKwlpbnN0YW5jZS0+cmlzZWQgPSAtMTsKKwlpbnN0YW5jZS0+Y291bnQgPSAwOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGVfYWxsKCZpbnN0YW5jZS0+d2FpdF9xdWV1ZSk7CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lODIwMF9kb19pb19zaW5nbGVfY29uZmlnKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgICBpbnQgY2hhbm5lbCwKKwkJCQkgICAgICBpbnQgc2luZ2xlX2NvbmZpZywKKwkJCQkgICAgICBpbnQgcmVmLAorCQkJCSAgICAgIGludCB0cmlnX2NoYW4sCisJCQkJICAgICAgaW50IHRyaWdfdHlwZSwgaW50IHRyaWdfZWRnZSwgaW50IGZsYWdzKQoreworCW1lODIwMF9kb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJdW5zaWduZWQgbG9uZyBzdGF0dXM7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbnN0YW5jZSA9IChtZTgyMDBfZG9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgc3RhdHVzKTsKKwlzd2l0Y2ggKGZsYWdzKSB7CisJY2FzZSBNRV9JT19TSU5HTEVfQ09ORklHX05PX0ZMQUdTOgorCWNhc2UgTUVfSU9fU0lOR0xFX0NPTkZJR19ESU9fQllURToKKwkJaWYgKGNoYW5uZWwgPT0gMCkgeworCQkJaWYgKHNpbmdsZV9jb25maWcgPT0gTUVfU0lOR0xFX0NPTkZJR19ESU9fT1VUUFVUKSB7CisJCQl9IGVsc2UgeworCQkJCVBFUlJPUigiSW52YWxpZCBieXRlIGRpcmVjdGlvbiBzcGVjaWZpZWQuXG4iKTsKKwkJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX1NJTkdMRV9DT05GSUc7CisJCQl9CisJCX0gZWxzZSB7CisJCQlQRVJST1IoIkludmFsaWQgYnl0ZSBzcGVjaWZpZWQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCVBFUlJPUigiSW52YWxpZCBmbGFncyBzcGVjaWZpZWQuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBzdGF0dXMpOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lODIwMF9kb19pb19zaW5nbGVfcmVhZChtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICBpbnQgY2hhbm5lbCwKKwkJCQkgICAgaW50ICp2YWx1ZSwgaW50IHRpbWVfb3V0LCBpbnQgZmxhZ3MpCit7CisJbWU4MjAwX2RvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwl1bnNpZ25lZCBsb25nIHN0YXR1czsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lODIwMF9kb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBzdGF0dXMpOworCXN3aXRjaCAoZmxhZ3MpIHsKKwljYXNlIE1FX0lPX1NJTkdMRV9UWVBFX0RJT19CSVQ6CisJCWlmICgoY2hhbm5lbCA+PSAwKSAmJiAoY2hhbm5lbCA8IDgpKSB7CisJCQkqdmFsdWUgPSBpbmIoaW5zdGFuY2UtPnBvcnRfcmVnKSAmICgweDEgPDwgY2hhbm5lbCk7CisJCX0gZWxzZSB7CisJCQlQRVJST1IoIkludmFsaWQgYml0IG51bWJlciBzcGVjaWZpZWQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwkJfQorCQlicmVhazsKKworCWNhc2UgTUVfSU9fU0lOR0xFX05PX0ZMQUdTOgorCWNhc2UgTUVfSU9fU0lOR0xFX1RZUEVfRElPX0JZVEU6CisJCWlmIChjaGFubmVsID09IDApIHsKKwkJCSp2YWx1ZSA9IGluYihpbnN0YW5jZS0+cG9ydF9yZWcpOworCQl9IGVsc2UgeworCQkJUEVSUk9SKCJJbnZhbGlkIGJ5dGUgbnVtYmVyIHNwZWNpZmllZC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWdzIHNwZWNpZmllZC5cbiIpOworCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIHN0YXR1cyk7CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWU4MjAwX2RvX2lvX3NpbmdsZV93cml0ZShtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgIGludCBjaGFubmVsLAorCQkJCSAgICAgaW50IHZhbHVlLCBpbnQgdGltZV9vdXQsIGludCBmbGFncykKK3sKKwltZTgyMDBfZG9fc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCXVpbnQ4X3Qgc3RhdGU7CisJdW5zaWduZWQgbG9uZyBzdGF0dXM7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbnN0YW5jZSA9IChtZTgyMDBfZG9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgc3RhdHVzKTsKKwlzd2l0Y2ggKGZsYWdzKSB7CisJY2FzZSBNRV9JT19TSU5HTEVfVFlQRV9ESU9fQklUOgorCQlpZiAoKGNoYW5uZWwgPj0gMCkgJiYgKGNoYW5uZWwgPCA4KSkgeworCQkJc3RhdGUgPSBpbmIoaW5zdGFuY2UtPnBvcnRfcmVnKTsKKwkJCXN0YXRlID0KKwkJCSAgICB2YWx1ZSA/IChzdGF0ZSB8ICgweDEgPDwgY2hhbm5lbCkpIDogKHN0YXRlICYKKwkJCQkJCQkJICB+KDB4MSA8PAorCQkJCQkJCQkgICAgY2hhbm5lbCkpOworCQkJb3V0YihzdGF0ZSwgaW5zdGFuY2UtPnBvcnRfcmVnKTsKKwkJCVBERUJVR19SRUcoInBvcnRfcmVnIG91dGIoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIGluc3RhbmNlLT5wb3J0X3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICBzdGF0ZSk7CisJCX0gZWxzZSB7CisJCQlQRVJST1IoIkludmFsaWQgYml0IG51bWJlciBzcGVjaWZpZWQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwkJfQorCQlicmVhazsKKworCWNhc2UgTUVfSU9fU0lOR0xFX05PX0ZMQUdTOgorCWNhc2UgTUVfSU9fU0lOR0xFX1RZUEVfRElPX0JZVEU6CisJCWlmIChjaGFubmVsID09IDApIHsKKwkJCW91dGIodmFsdWUsIGluc3RhbmNlLT5wb3J0X3JlZyk7CisJCQlQREVCVUdfUkVHKCJwb3J0X3JlZyBvdXRiKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICBpbnN0YW5jZS0+cG9ydF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgdmFsdWUpOworCQl9IGVsc2UgeworCQkJUEVSUk9SKCJJbnZhbGlkIGJ5dGUgbnVtYmVyIHNwZWNpZmllZC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWdzIHNwZWNpZmllZC5cbiIpOworCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIHN0YXR1cyk7CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWU4MjAwX2RvX3F1ZXJ5X251bWJlcl9jaGFubmVscyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJICAgaW50ICpudW1iZXIpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCSpudW1iZXIgPSA4OworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lODIwMF9kb19xdWVyeV9zdWJkZXZpY2VfdHlwZShtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJICBpbnQgKnR5cGUsIGludCAqc3VidHlwZSkKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJKnR5cGUgPSBNRV9UWVBFX0RPOworCSpzdWJ0eXBlID0gTUVfU1VCVFlQRV9TSU5HTEU7CisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWU4MjAwX2RvX3F1ZXJ5X3N1YmRldmljZV9jYXBzKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLCBpbnQgKmNhcHMpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCSpjYXBzID0gTUVfQ0FQU19ESU9fT1ZFUl9URU1QX0lSUTsKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIHZvaWQgbWU4MjAwX2RvX2Rlc3RydWN0b3Ioc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlKQoreworCW1lODIwMF9kb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbnN0YW5jZSA9IChtZTgyMDBfZG9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJZnJlZV9pcnEoaW5zdGFuY2UtPmlycSwgKHZvaWQgKilpbnN0YW5jZSk7CisJbWVfc3ViZGV2aWNlX2RlaW5pdCgmaW5zdGFuY2UtPmJhc2UpOworCWtmcmVlKGluc3RhbmNlKTsKK30KKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLCA2LCAxOSkKK3N0YXRpYyBpcnFyZXR1cm5fdCBtZTgyMDBfZG9faXNyKGludCBpcnEsIHZvaWQgKmRldl9pZCkKKyNlbHNlCitzdGF0aWMgaXJxcmV0dXJuX3QgbWU4MjAwX2RvX2lzcihpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQorI2VuZGlmCit7CisJbWU4MjAwX2RvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwl1aW50MTZfdCBjdHJsOworCXVpbnQ4X3QgaXJxX3N0YXR1czsKKworCWluc3RhbmNlID0gKG1lODIwMF9kb19zdWJkZXZpY2VfdCAqKSBkZXZfaWQ7CisKKwlpZiAoaXJxICE9IGluc3RhbmNlLT5pcnEpIHsKKwkJUEVSUk9SKCJJbmNvcnJlY3QgaW50ZXJydXB0IG51bTogJWQuXG4iLCBpcnEpOworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCisJaXJxX3N0YXR1cyA9IGluYihpbnN0YW5jZS0+aXJxX3N0YXR1c19yZWcpOworCWlmICghCisJICAgIChpcnFfc3RhdHVzICYKKwkgICAgIChNRTgyMDBfRE9fSVJRX1NUQVRVU19CSVRfQUNUSVZFIDw8IGluc3RhbmNlLT5kb19pZHgpKSkgeworCQlQSU5GTworCQkgICAgKCIlbGQgU2hhcmVkIGludGVycnVwdC4gJXMoKTogaWR4PSVkIGlycV9zdGF0dXNfcmVnPTB4JTA0WFxuIiwKKwkJICAgICBqaWZmaWVzLCBfX2Z1bmNfXywgaW5zdGFuY2UtPmRvX2lkeCwgaXJxX3N0YXR1cyk7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlzcGluX2xvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisJaW5zdGFuY2UtPnJpc2VkID0gMTsKKwlpbnN0YW5jZS0+Y291bnQrKzsKKworCXNwaW5fbG9jayhpbnN0YW5jZS0+aXJxX21vZGVfbG9jayk7CisJY3RybCA9IGludyhpbnN0YW5jZS0+aXJxX2N0cmxfcmVnKTsKKwljdHJsIHw9IE1FODIwMF9JUlFfTU9ERV9CSVRfQ0xFQVJfUE9XRVIgPDwgaW5zdGFuY2UtPmRvX2lkeDsKKwlvdXR3KGN0cmwsIGluc3RhbmNlLT5pcnFfY3RybF9yZWcpOworCVBERUJVR19SRUcoImlycV9jdHJsX3JlZyBvdXR3KDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5pcnFfY3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIGN0cmwpOworCWN0cmwgJj0gfihNRTgyMDBfSVJRX01PREVfQklUX0NMRUFSX1BPV0VSIDw8IGluc3RhbmNlLT5kb19pZHgpOworCW91dHcoY3RybCwgaW5zdGFuY2UtPmlycV9jdHJsX3JlZyk7CisJUERFQlVHX1JFRygiaXJxX2N0cmxfcmVnIG91dHcoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPmlycV9jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgY3RybCk7CisJc3Bpbl91bmxvY2soaW5zdGFuY2UtPmlycV9tb2RlX2xvY2spOworCXNwaW5fdW5sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCXdha2VfdXBfaW50ZXJydXB0aWJsZV9hbGwoJmluc3RhbmNlLT53YWl0X3F1ZXVlKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworbWU4MjAwX2RvX3N1YmRldmljZV90ICptZTgyMDBfZG9fY29uc3RydWN0b3IodWludDMyX3QgcmVnX2Jhc2UsCisJCQkJCSAgICAgdW5zaWduZWQgaW50IGRvX2lkeCwKKwkJCQkJICAgICBpbnQgaXJxLAorCQkJCQkgICAgIHNwaW5sb2NrX3QgKiBpcnFfbW9kZV9sb2NrKQoreworCW1lODIwMF9kb19zdWJkZXZpY2VfdCAqc3ViZGV2aWNlOworCWludCBlcnI7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwkvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHN1YmRldmljZSBpbnN0YW5jZSAqLworCXN1YmRldmljZSA9IGttYWxsb2Moc2l6ZW9mKG1lODIwMF9kb19zdWJkZXZpY2VfdCksIEdGUF9LRVJORUwpOworCisJaWYgKCFzdWJkZXZpY2UpIHsKKwkJUEVSUk9SKCJDYW5ub3QgZ2V0IG1lbW9yeSBmb3Igc3ViZGV2aWNlIGluc3RhbmNlLlxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCW1lbXNldChzdWJkZXZpY2UsIDAsIHNpemVvZihtZTgyMDBfZG9fc3ViZGV2aWNlX3QpKTsKKworCS8qIEluaXRpYWxpemUgc3ViZGV2aWNlIGJhc2UgY2xhc3MgKi8KKwllcnIgPSBtZV9zdWJkZXZpY2VfaW5pdCgmc3ViZGV2aWNlLT5iYXNlKTsKKworCWlmIChlcnIpIHsKKwkJUEVSUk9SKCJDYW5ub3QgaW5pdGlhbGl6ZSBzdWJkZXZpY2UgYmFzZSBjbGFzcyBpbnN0YW5jZS5cbiIpOworCQlrZnJlZShzdWJkZXZpY2UpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJLy8gSW5pdGlhbGl6ZSBzcGluIGxvY2tzLgorCXNwaW5fbG9ja19pbml0KCZzdWJkZXZpY2UtPnN1YmRldmljZV9sb2NrKTsKKworCXN1YmRldmljZS0+aXJxX21vZGVfbG9jayA9IGlycV9tb2RlX2xvY2s7CisKKwkvKiBTYXZlIHRoZSBpbmRleCBvZiB0aGUgZGlnaXRhbCBvdXRwdXQgKi8KKwlzdWJkZXZpY2UtPmRvX2lkeCA9IGRvX2lkeDsKKwlzdWJkZXZpY2UtPmlycSA9IGlycTsKKworCS8qIEluaXRpYWxpemUgdGhlIHJlZ2lzdGVycyAqLworCWlmIChkb19pZHggPT0gMCkgeworCQlzdWJkZXZpY2UtPnBvcnRfcmVnID0gcmVnX2Jhc2UgKyBNRTgyMDBfRE9fUE9SVF8wX1JFRzsKKwl9IGVsc2UgaWYgKGRvX2lkeCA9PSAxKSB7CisJCXN1YmRldmljZS0+cG9ydF9yZWcgPSByZWdfYmFzZSArIE1FODIwMF9ET19QT1JUXzFfUkVHOworCX0gZWxzZSB7CisJCVBFUlJPUigiV3Jvbmcgc3ViZGV2aWNlIGlkeD0lZC5cbiIsIGRvX2lkeCk7CisJCWtmcmVlKHN1YmRldmljZSk7CisJCXJldHVybiBOVUxMOworCX0KKwlzdWJkZXZpY2UtPmlycV9jdHJsX3JlZyA9IHJlZ19iYXNlICsgTUU4MjAwX0lSUV9NT0RFX1JFRzsKKwlzdWJkZXZpY2UtPmlycV9zdGF0dXNfcmVnID0gcmVnX2Jhc2UgKyBNRTgyMDBfRE9fSVJRX1NUQVRVU19SRUc7CisjaWZkZWYgTUVERUJVR19ERUJVR19SRUcKKwlzdWJkZXZpY2UtPnJlZ19iYXNlID0gcmVnX2Jhc2U7CisjZW5kaWYKKworCS8qIEluaXRpYWxpemUgdGhlIHdhaXQgcXVldWUgKi8KKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzdWJkZXZpY2UtPndhaXRfcXVldWUpOworCisJLyogUmVxdWVzdCB0aGUgaW50ZXJydXB0IGxpbmUgKi8KKwllcnIgPSByZXF1ZXN0X2lycShpcnEsIG1lODIwMF9kb19pc3IsCisjaWZkZWYgSVJRRl9ESVNBQkxFRAorCQkJICBJUlFGX0RJU0FCTEVEIHwgSVJRRl9TSEFSRUQsCisjZWxzZQorCQkJICBTQV9JTlRFUlJVUFQgfCBTQV9TSElSUSwKKyNlbmRpZgorCQkJICBNRTgyMDBfTkFNRSwgKHZvaWQgKilzdWJkZXZpY2UpOworCisJaWYgKGVycikgeworCQlQRVJST1IoIkNhbm5vdCBnZXQgaW50ZXJydXB0IGxpbmUuXG4iKTsKKwkJa2ZyZWUoc3ViZGV2aWNlKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCVBJTkZPKCJSZWdpc3RlcmVkIGlycT0lZC5cbiIsIGlycSk7CisKKwkvKiBPdmVybG9hZCBiYXNlIGNsYXNzIG1ldGhvZHMuICovCisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19pcnFfc3RhcnQgPSBtZTgyMDBfZG9faW9faXJxX3N0YXJ0OworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9faXJxX3dhaXQgPSBtZTgyMDBfZG9faW9faXJxX3dhaXQ7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19pcnFfc3RvcCA9IG1lODIwMF9kb19pb19pcnFfc3RvcDsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3Jlc2V0X3N1YmRldmljZSA9CisJICAgIG1lODIwMF9kb19pb19yZXNldF9zdWJkZXZpY2U7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19zaW5nbGVfY29uZmlnID0KKwkgICAgbWU4MjAwX2RvX2lvX3NpbmdsZV9jb25maWc7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19zaW5nbGVfcmVhZCA9IG1lODIwMF9kb19pb19zaW5nbGVfcmVhZDsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3NpbmdsZV93cml0ZSA9CisJICAgIG1lODIwMF9kb19pb19zaW5nbGVfd3JpdGU7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9udW1iZXJfY2hhbm5lbHMgPQorCSAgICBtZTgyMDBfZG9fcXVlcnlfbnVtYmVyX2NoYW5uZWxzOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfcXVlcnlfc3ViZGV2aWNlX3R5cGUgPQorCSAgICBtZTgyMDBfZG9fcXVlcnlfc3ViZGV2aWNlX3R5cGU7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9zdWJkZXZpY2VfY2FwcyA9CisJICAgIG1lODIwMF9kb19xdWVyeV9zdWJkZXZpY2VfY2FwczsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2Rlc3RydWN0b3IgPSBtZTgyMDBfZG9fZGVzdHJ1Y3RvcjsKKworCXN1YmRldmljZS0+cmlzZWQgPSAwOworCXN1YmRldmljZS0+Y291bnQgPSAwOworCisJcmV0dXJuIHN1YmRldmljZTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTgyMDBfZG8uaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTgyMDBfZG8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzU4MTI1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODIwMF9kby5oCkBAIC0wLDAgKzEsNzUgQEAKKy8qKgorICogQGZpbGUgbWU4MjAwX2RvLmgKKyAqCisgKiBAYnJpZWYgTUUtODIwMCBkaWdpdGFsIG91dHB1dCBzdWJkZXZpY2UgY2xhc3MuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfTUU4MjAwX0RPX0hfCisjZGVmaW5lIF9NRTgyMDBfRE9fSF8KKworI2luY2x1ZGUgIm1lc3ViZGV2aWNlLmgiCisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKy8qKgorICogQGJyaWVmIFRoZSB0ZW1wbGF0ZSBzdWJkZXZpY2UgY2xhc3MuCisgKi8KK3R5cGVkZWYgc3RydWN0IG1lODIwMF9kb19zdWJkZXZpY2UgeworCS8qIEluaGVyaXRhbmNlICovCisJbWVfc3ViZGV2aWNlX3QgYmFzZTsJCQkvKio8IFRoZSBzdWJkZXZpY2UgYmFzZSBjbGFzcy4gKi8KKworCS8qIEF0dHJpYnV0ZXMgKi8KKwlzcGlubG9ja190IHN1YmRldmljZV9sb2NrOwkJLyoqPCBTcGluIGxvY2sgdG8gcHJvdGVjdCB0aGUgc3ViZGV2aWNlIGZyb20gY29uY3VycmVudCBhY2Nlc3MuICovCisJc3BpbmxvY2tfdCAqaXJxX21vZGVfbG9jazsKKworCWludCBpcnE7CQkJCS8qKjwgVGhlIG51bWJlciBvZiB0aGUgaW50ZXJydXB0IHJlcXVlc3QgKi8KKwlpbnQgcmlzZWQ7CQkJCS8qKjwgRmxhZyB0byBpbmRpY2F0ZSBpZiBhbiBpbnRlcnJ1cHQgb2NjdXJlZCAqLworCWludCBjb3VudDsJCQkJLyoqPCBDb3VudHMgdGhlIG51bWJlciBvZiBpbnRlcnJ1cHRzIG9jY3VyZWQgKi8KKwl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0X3F1ZXVlOwkJLyoqPCBUbyB3YWl0IG9uIGludGVycnVwdHMgKi8KKworCXVuc2lnbmVkIGludCBkb19pZHg7CQkJLyoqPCBUaGUgbnVtYmVyIG9mIHRoZSBkaWdpdGFsIG91dHB1dCAqLworCisJdW5zaWduZWQgbG9uZyBwb3J0X3JlZzsJCQkvKio8IFRoZSBkaWdpdGFsIG91dHB1dCBwb3J0ICovCisJdW5zaWduZWQgbG9uZyBpcnFfY3RybF9yZWc7CQkvKio8IFRoZSBpbnRlcnJ1cHQgY29udHJvbCByZWdpc3RlciAqLworCXVuc2lnbmVkIGxvbmcgaXJxX3N0YXR1c19yZWc7CQkvKio8IFRoZSBpbnRlcnJ1cHQgc3RhdHVzIHJlZ2lzdGVyICovCisjaWZkZWYgTUVERUJVR19ERUJVR19SRUcKKwl1bnNpZ25lZCBsb25nIHJlZ19iYXNlOworI2VuZGlmCit9IG1lODIwMF9kb19zdWJkZXZpY2VfdDsKKworLyoqCisgKiBAYnJpZWYgVGhlIGNvbnN0cnVjdG9yIHRvIGdlbmVyYXRlIGEgTUUtODIwMCBkaWdpdGFsIG91dHB1dCBzdWJkZXZpY2UgaW5zdGFuY2UuCisgKgorICogQHBhcmFtIHJlZ19iYXNlIFRoZSByZWdpc3RlciBiYXNlIGFkZHJlc3Mgb2YgdGhlIGRldmljZSBhcyByZXR1cm5lZCBieSB0aGUgUENJIEJJT1MuCisgKiBAcGFyYW0gZG9faWR4IFRoZSBpbmRleCBvZiB0aGUgZGlnaXRhbCBvdXRwdXQgc3ViZGV2aWNlIG9uIHRoaXMgZGV2aWNlLgorICoKKyAqIEByZXR1cm4gUG9pbnRlciB0byBuZXcgaW5zdGFuY2Ugb24gc3VjY2Vzcy5cbgorICogTlVMTCBvbiBlcnJvci4KKyAqLworbWU4MjAwX2RvX3N1YmRldmljZV90ICptZTgyMDBfZG9fY29uc3RydWN0b3IodWludDMyX3QgcmVnX2Jhc2UsCisJCQkJCSAgICAgdW5zaWduZWQgaW50IGRvX2lkeCwKKwkJCQkJICAgICBpbnQgaXJxLAorCQkJCQkgICAgIHNwaW5sb2NrX3QgKiBpcnFfbW9kZV9sb2NrKTsKKworI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTgyMDBfZG9fcmVnLmggYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU4MjAwX2RvX3JlZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxMDk1MDQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU4MjAwX2RvX3JlZy5oCkBAIC0wLDAgKzEsNDAgQEAKKy8qKgorICogQGZpbGUgbWU4MjAwX2FvX3JlZy5oCisgKgorICogQGJyaWVmIE1FLTgyMDAgYW5hbG9nIG91dHB1dCBzdWJkZXZpY2UgcmVnaXN0ZXIgZGVmaW5pdGlvbnMuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfTUU4MjAwX0RPX1JFR19IXworI2RlZmluZSBfTUU4MjAwX0RPX1JFR19IXworCisjaWZkZWYgX19LRVJORUxfXworCisjZGVmaW5lIE1FODIwMF9ET19JUlFfU1RBVFVTX1JFRwkJCTB4MAkvLyBSCisjZGVmaW5lIE1FODIwMF9ET19QT1JUXzBfUkVHCQkJCTB4MQkvLyBSL1cKKyNkZWZpbmUgTUU4MjAwX0RPX1BPUlRfMV9SRUcJCQkJMHgyCS8vIFIvVworCisjZGVmaW5lIE1FODIwMF9ET19JUlFfU1RBVFVTX0JJVF9BQ1RJVkUJCTB4MQorI2RlZmluZSBNRTgyMDBfRE9fSVJRX1NUQVRVU19TSElGVAkJCTEKKworI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTgyMDBfcmVnLmggYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU4MjAwX3JlZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3M2ZlNGQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU4MjAwX3JlZy5oCkBAIC0wLDAgKzEsNDYgQEAKKy8qKgorICogQGZpbGUgbWU4MjAwX3JlZy5oCisgKgorICogQGJyaWVmIE1FLTgyMDAgcmVnaXN0ZXIgZGVmaW5pdGlvbnMuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfTUU4MjAwX1JFR19IXworI2RlZmluZSBfTUU4MjAwX1JFR19IXworCisjaWZkZWYgX19LRVJORUxfXworCisjZGVmaW5lIE1FODIwMF9JUlFfTU9ERV9SRUcJCQkJMHhECS8vIFIvVworCisjZGVmaW5lIE1FODIwMF9JUlFfTU9ERV9NQVNLICAgICAJCQkweDMKKworI2RlZmluZSBNRTgyMDBfSVJRX01PREVfTUFTS19NQVNLCQkJMHgwCisjZGVmaW5lIE1FODIwMF9JUlFfTU9ERV9NQVNLX0NPTVBBUkUJCQkweDEKKworI2RlZmluZSBNRTgyMDBfSVJRX01PREVfQklUX0VOQUJMRV9QT1dFUgkJMHgxMAorI2RlZmluZSBNRTgyMDBfSVJRX01PREVfQklUX0NMRUFSX1BPV0VSCQkJMHg0MAorCisjZGVmaW5lIE1FODIwMF9JUlFfTU9ERV9ESV9TSElGVAkJCTIKKyNkZWZpbmUgTUU4MjAwX0lSUV9NT0RFX1BPV0VSX1NISUZUCQkJMQorCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODI1NC5jIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODI1NC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlNDRjM2QKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU4MjU0LmMKQEAgLTAsMCArMSwxMTc2IEBACisvKioKKyAqIEBmaWxlIG1lODI1NC5jCisgKgorICogQGJyaWVmIDgyNTQgc3ViZGV2aWNlIGluc3RhbmNlLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX19LRVJORUxfXworIyAgZGVmaW5lIF9fS0VSTkVMX18KKyNlbmRpZgorCisvKgorICogSW5jbHVkZXMKKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2luY2x1ZGUgIm1lZGVmaW5lcy5oIgorI2luY2x1ZGUgIm1laW50ZXJuYWwuaCIKKyNpbmNsdWRlICJtZWVycm9yLmgiCisKKyNpbmNsdWRlICJtZWRlYnVnLmgiCisjaW5jbHVkZSAibWU4MjU0X3JlZy5oIgorI2luY2x1ZGUgIm1lODI1NC5oIgorCisvKgorICogRGVmaW5lcworICovCisjZGVmaW5lIE1FODI1NF9OVU1CRVJfQ0hBTk5FTFMgMQkvKio8IE9uZSBjaGFubmVsIHBlciBjb3VudGVyLiAqLworI2RlZmluZSBNRTgyNTRfQ1RSX1dJRFRIIDE2CQkJLyoqPCBPbmUgY291bnRlciBoYXMgMTYgYml0cy4gKi8KKworLyoKKyAqIEZ1bmN0aW9ucworICovCisKK3N0YXRpYyBpbnQgbWU4MjU0X2lvX3Jlc2V0X3N1YmRldmljZShzdHJ1Y3QgbWVfc3ViZGV2aWNlICpzdWJkZXZpY2UsCisJCQkJICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsIGludCBmbGFncykKK3sKKwltZTgyNTRfc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCXVpbnQ4X3QgY2xrX3NyYzsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lODI1NF9zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlpZiAoZmxhZ3MpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWcgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCXNwaW5fbG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKwlzcGluX2xvY2soaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2spOworCWlmIChpbnN0YW5jZS0+Y3RyX2lkeCA9PSAwKQorCQlvdXRiKE1FODI1NF9DVFJMX1NDMCB8IE1FODI1NF9DVFJMX0xNIHwgTUU4MjU0X0NUUkxfTTAgfAorCQkgICAgIE1FODI1NF9DVFJMX0JJTiwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwllbHNlIGlmIChpbnN0YW5jZS0+Y3RyX2lkeCA9PSAxKQorCQlvdXRiKE1FODI1NF9DVFJMX1NDMSB8IE1FODI1NF9DVFJMX0xNIHwgTUU4MjU0X0NUUkxfTTAgfAorCQkgICAgIE1FODI1NF9DVFJMX0JJTiwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwllbHNlCisJCW91dGIoTUU4MjU0X0NUUkxfU0MyIHwgTUU4MjU0X0NUUkxfTE0gfCBNRTgyNTRfQ1RSTF9NMCB8CisJCSAgICAgTUU4MjU0X0NUUkxfQklOLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrKTsKKworCW91dGIoMHgwMCwgaW5zdGFuY2UtPnZhbF9yZWcpOworCW91dGIoMHgwMCwgaW5zdGFuY2UtPnZhbF9yZWcpOworCisJc3Bpbl9sb2NrKGluc3RhbmNlLT5jbGtfc3JjX3JlZ19sb2NrKTsKKwljbGtfc3JjID0gaW5iKGluc3RhbmNlLT5jbGtfc3JjX3JlZyk7CisKKwlzd2l0Y2ggKGluc3RhbmNlLT5kZXZpY2VfaWQpIHsKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNDAwOgorCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE0MEE6CisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTQwQjoKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNEUwOgorCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE0RUE6CisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTRFQjoKKwkJaWYgKGluc3RhbmNlLT5tZTgyNTRfaWR4ID09IDApIHsKKwkJCWlmIChpbnN0YW5jZS0+Y3RyX2lkeCA9PSAwKQorCQkJCWNsa19zcmMgJj0KKwkJCQkgICAgfihNRTE0MDBBQl84MjU0X0FfMF9DTEtfU1JDXzEwTUhaIHwKKwkJCQkgICAgICBNRTE0MDBBQl84MjU0X0FfMF9DTEtfU1JDX1FVQVJaKTsKKwkJCWVsc2UgaWYgKGluc3RhbmNlLT5jdHJfaWR4ID09IDEpCisJCQkJY2xrX3NyYyAmPSB+KE1FMTQwMEFCXzgyNTRfQV8xX0NMS19TUkNfUFJFVik7CisJCQllbHNlCisJCQkJY2xrX3NyYyAmPSB+KE1FMTQwMEFCXzgyNTRfQV8yX0NMS19TUkNfUFJFVik7CisJCX0gZWxzZSB7CisJCQlpZiAoaW5zdGFuY2UtPmN0cl9pZHggPT0gMCkKKwkJCQljbGtfc3JjICY9CisJCQkJICAgIH4oTUUxNDAwQUJfODI1NF9CXzBfQ0xLX1NSQ18xME1IWiB8CisJCQkJICAgICAgTUUxNDAwQUJfODI1NF9CXzBfQ0xLX1NSQ19RVUFSWik7CisJCQllbHNlIGlmIChpbnN0YW5jZS0+Y3RyX2lkeCA9PSAxKQorCQkJCWNsa19zcmMgJj0gfihNRTE0MDBBQl84MjU0X0JfMV9DTEtfU1JDX1BSRVYpOworCQkJZWxzZQorCQkJCWNsa19zcmMgJj0gfihNRTE0MDBBQl84MjU0X0JfMl9DTEtfU1JDX1BSRVYpOworCQl9CisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTQwQzoKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNDBEOgorCQlzd2l0Y2ggKGluc3RhbmNlLT5tZTgyNTRfaWR4KSB7CisJCWNhc2UgMDoKKwkJY2FzZSAyOgorCQljYXNlIDQ6CisJCWNhc2UgNjoKKwkJY2FzZSA4OgorCQkJaWYgKGluc3RhbmNlLT5jdHJfaWR4ID09IDApCisJCQkJY2xrX3NyYyAmPSB+KE1FMTQwMENEXzgyNTRfQUNFXzBfQ0xLX1NSQ19NQVNLKTsKKwkJCWVsc2UgaWYgKGluc3RhbmNlLT5jdHJfaWR4ID09IDEpCisJCQkJY2xrX3NyYyAmPSB+KE1FMTQwMENEXzgyNTRfQUNFXzFfQ0xLX1NSQ19NQVNLKTsKKwkJCWVsc2UKKwkJCQljbGtfc3JjICY9IH4oTUUxNDAwQ0RfODI1NF9BQ0VfMl9DTEtfU1JDX01BU0spOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWlmIChpbnN0YW5jZS0+Y3RyX2lkeCA9PSAwKQorCQkJCWNsa19zcmMgJj0gfihNRTE0MDBDRF84MjU0X0JEXzBfQ0xLX1NSQ19NQVNLKTsKKwkJCWVsc2UgaWYgKGluc3RhbmNlLT5jdHJfaWR4ID09IDEpCisJCQkJY2xrX3NyYyAmPSB+KE1FMTQwMENEXzgyNTRfQkRfMV9DTEtfU1JDX01BU0spOworCQkJZWxzZQorCQkJCWNsa19zcmMgJj0gfihNRTE0MDBDRF84MjU0X0JEXzJfQ0xLX1NSQ19NQVNLKTsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDYxMDoKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjYwOgorCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2NjBJOgorCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2NjBTOgorCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2NjBJUzoKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjcwOgorCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2NzBJOgorCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2NzBTOgorCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2NzBJUzoKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjgwOgorCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2ODBJOgorCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2ODBTOgorCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2ODBJUzoKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU4MTAwX0E6CisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FODEwMF9COgorCisJCS8qIE5vIGNsb2NrIHNvdXJjZSByZWdpc3RlciBhdmFpbGFibGUgKi8KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlQRVJST1IoIkludmFsaWQgZGV2aWNlIHR5cGUuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fSU5URVJOQUw7CisJfQorCisJaWYgKCFlcnIpCisJCW91dGIoY2xrX3NyYywgaW5zdGFuY2UtPmNsa19zcmNfcmVnKTsKKworCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5jbGtfc3JjX3JlZ19sb2NrKTsKKwlzcGluX3VubG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZTE0MDBfYWJfcmVmX2NvbmZpZyhtZTgyNTRfc3ViZGV2aWNlX3QgKiBpbnN0YW5jZSwgaW50IHJlZikKK3sKKwl1aW50OF90IGNsa19zcmM7CisKKwlzcGluX2xvY2soaW5zdGFuY2UtPmNsa19zcmNfcmVnX2xvY2spOworCWNsa19zcmMgPSBpbmIoaW5zdGFuY2UtPmNsa19zcmNfcmVnKTsKKworCXN3aXRjaCAocmVmKSB7CisJY2FzZSBNRV9SRUZfQ1RSX0VYVEVSTkFMOgorCQlpZiAoaW5zdGFuY2UtPm1lODI1NF9pZHggPT0gMCkgeworCQkJaWYgKGluc3RhbmNlLT5jdHJfaWR4ID09IDApCisJCQkJY2xrX3NyYyAmPSB+KE1FMTQwMEFCXzgyNTRfQV8wX0NMS19TUkNfUVVBUlopOworCQkJZWxzZSBpZiAoaW5zdGFuY2UtPmN0cl9pZHggPT0gMSkKKwkJCQljbGtfc3JjICY9IH4oTUUxNDAwQUJfODI1NF9BXzFfQ0xLX1NSQ19QUkVWKTsKKwkJCWVsc2UKKwkJCQljbGtfc3JjICY9IH4oTUUxNDAwQUJfODI1NF9BXzJfQ0xLX1NSQ19QUkVWKTsKKwkJfSBlbHNlIHsKKwkJCWlmIChpbnN0YW5jZS0+Y3RyX2lkeCA9PSAwKQorCQkJCWNsa19zcmMgJj0gfihNRTE0MDBBQl84MjU0X0JfMF9DTEtfU1JDX1FVQVJaKTsKKwkJCWVsc2UgaWYgKGluc3RhbmNlLT5jdHJfaWR4ID09IDEpCisJCQkJY2xrX3NyYyAmPSB+KE1FMTQwMEFCXzgyNTRfQl8xX0NMS19TUkNfUFJFVik7CisJCQllbHNlCisJCQkJY2xrX3NyYyAmPSB+KE1FMTQwMEFCXzgyNTRfQl8yX0NMS19TUkNfUFJFVik7CisJCX0KKworCQlicmVhazsKKworCWNhc2UgTUVfUkVGX0NUUl9QUkVWSU9VUzoKKwkJaWYgKGluc3RhbmNlLT5tZTgyNTRfaWR4ID09IDApIHsKKwkJCWlmIChpbnN0YW5jZS0+Y3RyX2lkeCA9PSAwKSB7CisJCQkJUEVSUk9SKCJJbnZhbGlkIHJlZmVyZW5jZS5cbiIpOworCQkJCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5jbGtfc3JjX3JlZ19sb2NrKTsKKwkJCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9TSU5HTEVfQ09ORklHOworCQkJfSBlbHNlIGlmIChpbnN0YW5jZS0+Y3RyX2lkeCA9PSAxKQorCQkJCWNsa19zcmMgfD0gKE1FMTQwMEFCXzgyNTRfQV8xX0NMS19TUkNfUFJFVik7CisJCQllbHNlCisJCQkJY2xrX3NyYyB8PSAoTUUxNDAwQUJfODI1NF9BXzJfQ0xLX1NSQ19QUkVWKTsKKwkJfSBlbHNlIHsKKwkJCWlmIChpbnN0YW5jZS0+Y3RyX2lkeCA9PSAwKSB7CisJCQkJUEVSUk9SKCJJbnZhbGlkIHJlZmVyZW5jZS5cbiIpOworCQkJCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5jbGtfc3JjX3JlZ19sb2NrKTsKKwkJCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9TSU5HTEVfQ09ORklHOworCQkJfSBlbHNlIGlmIChpbnN0YW5jZS0+Y3RyX2lkeCA9PSAxKQorCQkJCWNsa19zcmMgfD0gKE1FMTQwMEFCXzgyNTRfQl8xX0NMS19TUkNfUFJFVik7CisJCQllbHNlCisJCQkJY2xrX3NyYyB8PSAoTUUxNDAwQUJfODI1NF9CXzJfQ0xLX1NSQ19QUkVWKTsKKwkJfQorCisJCWJyZWFrOworCisJY2FzZSBNRV9SRUZfQ1RSX0lOVEVSTkFMXzFNSFo6CisJCWlmIChpbnN0YW5jZS0+bWU4MjU0X2lkeCA9PSAwKSB7CisJCQlpZiAoaW5zdGFuY2UtPmN0cl9pZHggPT0gMCkgeworCQkJCWNsa19zcmMgfD0gKE1FMTQwMEFCXzgyNTRfQV8wX0NMS19TUkNfUVVBUlopOworCQkJCWNsa19zcmMgJj0gfihNRTE0MDBBQl84MjU0X0FfMF9DTEtfU1JDXzEwTUhaKTsKKwkJCX0gZWxzZSB7CisJCQkJUEVSUk9SKCJJbnZhbGlkIHJlZmVyZW5jZS5cbiIpOworCQkJCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5jbGtfc3JjX3JlZ19sb2NrKTsKKwkJCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9TSU5HTEVfQ09ORklHOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKGluc3RhbmNlLT5jdHJfaWR4ID09IDApIHsKKwkJCQljbGtfc3JjIHw9IChNRTE0MDBBQl84MjU0X0JfMF9DTEtfU1JDX1FVQVJaKTsKKwkJCQljbGtfc3JjICY9IH4oTUUxNDAwQUJfODI1NF9CXzBfQ0xLX1NSQ18xME1IWik7CisJCQl9IGVsc2UgeworCQkJCVBFUlJPUigiSW52YWxpZCByZWZlcmVuY2UuXG4iKTsKKwkJCQlzcGluX3VubG9jayhpbnN0YW5jZS0+Y2xrX3NyY19yZWdfbG9jayk7CisJCQkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfU0lOR0xFX0NPTkZJRzsKKwkJCX0KKwkJfQorCisJCWJyZWFrOworCisJY2FzZSBNRV9SRUZfQ1RSX0lOVEVSTkFMXzEwTUhaOgorCQlpZiAoaW5zdGFuY2UtPm1lODI1NF9pZHggPT0gMCkgeworCQkJaWYgKGluc3RhbmNlLT5jdHJfaWR4ID09IDApIHsKKwkJCQljbGtfc3JjIHw9IChNRTE0MDBBQl84MjU0X0FfMF9DTEtfU1JDX1FVQVJaKTsKKwkJCQljbGtfc3JjIHw9IChNRTE0MDBBQl84MjU0X0FfMF9DTEtfU1JDXzEwTUhaKTsKKwkJCX0gZWxzZSB7CisJCQkJUEVSUk9SKCJJbnZhbGlkIHJlZmVyZW5jZS5cbiIpOworCQkJCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5jbGtfc3JjX3JlZ19sb2NrKTsKKwkJCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9TSU5HTEVfQ09ORklHOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKGluc3RhbmNlLT5jdHJfaWR4ID09IDApIHsKKwkJCQljbGtfc3JjIHw9IChNRTE0MDBBQl84MjU0X0FfMF9DTEtfU1JDX1FVQVJaKTsKKwkJCQljbGtfc3JjIHw9IChNRTE0MDBBQl84MjU0X0FfMF9DTEtfU1JDXzEwTUhaKTsKKwkJCX0gZWxzZSB7CisJCQkJUEVSUk9SKCJJbnZhbGlkIHJlZmVyZW5jZS5cbiIpOworCQkJCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5jbGtfc3JjX3JlZ19sb2NrKTsKKwkJCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9TSU5HTEVfQ09ORklHOworCQkJfQorCQl9CisKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlQRVJST1IoIkludmFsaWQgcmVmZXJlbmNlLlxuIik7CisJCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5jbGtfc3JjX3JlZ19sb2NrKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfUkVGOworCX0KKworCW91dGIoY2xrX3NyYywgaW5zdGFuY2UtPmNsa19zcmNfcmVnKTsKKwlzcGluX3VubG9jayhpbnN0YW5jZS0+Y2xrX3NyY19yZWdfbG9jayk7CisKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZTE0MDBfY2RfcmVmX2NvbmZpZyhtZTgyNTRfc3ViZGV2aWNlX3QgKiBpbnN0YW5jZSwgaW50IHJlZikKK3sKKwl1aW50OF90IGNsa19zcmM7CisKKwlzcGluX2xvY2soaW5zdGFuY2UtPmNsa19zcmNfcmVnX2xvY2spOworCWNsa19zcmMgPSBpbmIoaW5zdGFuY2UtPmNsa19zcmNfcmVnKTsKKworCXN3aXRjaCAocmVmKSB7CisJY2FzZSBNRV9SRUZfQ1RSX0VYVEVSTkFMOgorCQlzd2l0Y2ggKGluc3RhbmNlLT5tZTgyNTRfaWR4KSB7CisJCWNhc2UgMDoKKwkJY2FzZSAyOgorCQljYXNlIDQ6CisJCWNhc2UgNjoKKwkJY2FzZSA4OgorCQkJaWYgKGluc3RhbmNlLT5jdHJfaWR4ID09IDApCisJCQkJY2xrX3NyYyAmPSB+KE1FMTQwMENEXzgyNTRfQUNFXzBfQ0xLX1NSQ19NQVNLKTsKKwkJCWVsc2UgaWYgKGluc3RhbmNlLT5jdHJfaWR4ID09IDEpCisJCQkJY2xrX3NyYyAmPSB+KE1FMTQwMENEXzgyNTRfQUNFXzFfQ0xLX1NSQ19NQVNLKTsKKwkJCWVsc2UKKwkJCQljbGtfc3JjICY9IH4oTUUxNDAwQ0RfODI1NF9BQ0VfMl9DTEtfU1JDX01BU0spOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWlmIChpbnN0YW5jZS0+Y3RyX2lkeCA9PSAwKQorCQkJCWNsa19zcmMgJj0gfihNRTE0MDBDRF84MjU0X0JEXzBfQ0xLX1NSQ19NQVNLKTsKKwkJCWVsc2UgaWYgKGluc3RhbmNlLT5jdHJfaWR4ID09IDEpCisJCQkJY2xrX3NyYyAmPSB+KE1FMTQwMENEXzgyNTRfQkRfMV9DTEtfU1JDX01BU0spOworCQkJZWxzZQorCQkJCWNsa19zcmMgJj0gfihNRTE0MDBDRF84MjU0X0JEXzJfQ0xLX1NSQ19NQVNLKTsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCisJY2FzZSBNRV9SRUZfQ1RSX1BSRVZJT1VTOgorCQlzd2l0Y2ggKGluc3RhbmNlLT5tZTgyNTRfaWR4KSB7CisJCWNhc2UgMDoKKwkJY2FzZSAyOgorCQljYXNlIDQ6CisJCWNhc2UgNjoKKwkJY2FzZSA4OgorCQkJaWYgKGluc3RhbmNlLT5jdHJfaWR4ID09IDApIHsKKwkJCQljbGtfc3JjICY9IH4oTUUxNDAwQ0RfODI1NF9BQ0VfMF9DTEtfU1JDX01BU0spOworCQkJCWNsa19zcmMgfD0gKE1FMTQwMENEXzgyNTRfQUNFXzBfQ0xLX1NSQ19QUkVWKTsKKwkJCX0gZWxzZSBpZiAoaW5zdGFuY2UtPmN0cl9pZHggPT0gMSkgeworCQkJCWNsa19zcmMgJj0gfihNRTE0MDBDRF84MjU0X0FDRV8xX0NMS19TUkNfTUFTSyk7CisJCQkJY2xrX3NyYyB8PSAoTUUxNDAwQ0RfODI1NF9BQ0VfMV9DTEtfU1JDX1BSRVYpOworCQkJfSBlbHNlIHsKKwkJCQljbGtfc3JjICY9IH4oTUUxNDAwQ0RfODI1NF9BQ0VfMl9DTEtfU1JDX01BU0spOworCQkJCWNsa19zcmMgfD0gKE1FMTQwMENEXzgyNTRfQUNFXzJfQ0xLX1NSQ19QUkVWKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlpZiAoaW5zdGFuY2UtPmN0cl9pZHggPT0gMCkgeworCQkJCWNsa19zcmMgJj0gfihNRTE0MDBDRF84MjU0X0JEXzBfQ0xLX1NSQ19NQVNLKTsKKwkJCQljbGtfc3JjIHw9IChNRTE0MDBDRF84MjU0X0JEXzBfQ0xLX1NSQ19QUkVWKTsKKwkJCX0gZWxzZSBpZiAoaW5zdGFuY2UtPmN0cl9pZHggPT0gMSkgeworCQkJCWNsa19zcmMgJj0gfihNRTE0MDBDRF84MjU0X0JEXzFfQ0xLX1NSQ19NQVNLKTsKKwkJCQljbGtfc3JjIHw9IChNRTE0MDBDRF84MjU0X0JEXzFfQ0xLX1NSQ19QUkVWKTsKKwkJCX0gZWxzZSB7CisJCQkJY2xrX3NyYyAmPSB+KE1FMTQwMENEXzgyNTRfQkRfMl9DTEtfU1JDX01BU0spOworCQkJCWNsa19zcmMgfD0gKE1FMTQwMENEXzgyNTRfQkRfMl9DTEtfU1JDX1BSRVYpOworCQkJfQorCQkJYnJlYWs7CisJCX0KKworCQlicmVhazsKKworCWNhc2UgTUVfUkVGX0NUUl9JTlRFUk5BTF8xTUhaOgorCQlzd2l0Y2ggKGluc3RhbmNlLT5tZTgyNTRfaWR4KSB7CisJCWNhc2UgMDoKKwkJY2FzZSAyOgorCQljYXNlIDQ6CisJCWNhc2UgNjoKKwkJY2FzZSA4OgorCQkJaWYgKGluc3RhbmNlLT5jdHJfaWR4ID09IDApIHsKKwkJCQljbGtfc3JjICY9IH4oTUUxNDAwQ0RfODI1NF9BQ0VfMF9DTEtfU1JDX01BU0spOworCQkJCWNsa19zcmMgfD0gKE1FMTQwMENEXzgyNTRfQUNFXzBfQ0xLX1NSQ18xTUhaKTsKKwkJCX0gZWxzZSB7CisJCQkJUEVSUk9SKCJJbnZhbGlkIHJlZmVyZW5jZS5cbiIpOworCQkJCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5jbGtfc3JjX3JlZ19sb2NrKTsKKwkJCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9SRUY7CisJCQl9CisKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlpZiAoaW5zdGFuY2UtPmN0cl9pZHggPT0gMCkgeworCQkJCWNsa19zcmMgJj0gfihNRTE0MDBDRF84MjU0X0JEXzBfQ0xLX1NSQ19NQVNLKTsKKwkJCQljbGtfc3JjIHw9IChNRTE0MDBDRF84MjU0X0JEXzBfQ0xLX1NSQ18xTUhaKTsKKwkJCX0gZWxzZSB7CisJCQkJUEVSUk9SKCJJbnZhbGlkIHJlZmVyZW5jZS5cbiIpOworCQkJCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5jbGtfc3JjX3JlZ19sb2NrKTsKKwkJCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9SRUY7CisJCQl9CisJCQlicmVhazsKKwkJfQorCisJCWJyZWFrOworCisJY2FzZSBNRV9SRUZfQ1RSX0lOVEVSTkFMXzEwTUhaOgorCQlzd2l0Y2ggKGluc3RhbmNlLT5tZTgyNTRfaWR4KSB7CisJCWNhc2UgMDoKKwkJY2FzZSAyOgorCQljYXNlIDQ6CisJCWNhc2UgNjoKKwkJY2FzZSA4OgorCQkJaWYgKGluc3RhbmNlLT5jdHJfaWR4ID09IDApIHsKKwkJCQljbGtfc3JjICY9IH4oTUUxNDAwQ0RfODI1NF9BQ0VfMF9DTEtfU1JDX01BU0spOworCQkJCWNsa19zcmMgfD0gKE1FMTQwMENEXzgyNTRfQUNFXzBfQ0xLX1NSQ18xME1IWik7CisJCQl9IGVsc2UgeworCQkJCVBFUlJPUigiSW52YWxpZCByZWZlcmVuY2UuXG4iKTsKKwkJCQlzcGluX3VubG9jayhpbnN0YW5jZS0+Y2xrX3NyY19yZWdfbG9jayk7CisJCQkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfUkVGOworCQkJfQorCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWlmIChpbnN0YW5jZS0+Y3RyX2lkeCA9PSAwKSB7CisJCQkJY2xrX3NyYyAmPSB+KE1FMTQwMENEXzgyNTRfQkRfMF9DTEtfU1JDX01BU0spOworCQkJCWNsa19zcmMgfD0gKE1FMTQwMENEXzgyNTRfQkRfMF9DTEtfU1JDXzEwTUhaKTsKKwkJCX0gZWxzZSB7CisJCQkJUEVSUk9SKCJJbnZhbGlkIHJlZmVyZW5jZS5cbiIpOworCQkJCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5jbGtfc3JjX3JlZ19sb2NrKTsKKwkJCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9SRUY7CisJCQl9CisKKwkJCWJyZWFrOworCQl9CisKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlQRVJST1IoIkludmFsaWQgcmVmZXJlbmNlLlxuIik7CisJCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5jbGtfc3JjX3JlZ19sb2NrKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfUkVGOworCX0KKworCW91dGIoY2xrX3NyYywgaW5zdGFuY2UtPmNsa19zcmNfcmVnKTsKKwlzcGluX3VubG9jayhpbnN0YW5jZS0+Y2xrX3NyY19yZWdfbG9jayk7CisKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZTQ2MDBfcmVmX2NvbmZpZyhtZTgyNTRfc3ViZGV2aWNlX3QgKiBpbnN0YW5jZSwgaW50IHJlZikKK3sKKwlzd2l0Y2ggKHJlZikgeworCisJY2FzZSBNRV9SRUZfQ1RSX0VYVEVSTkFMOgorCQkvLyBOb3RoaW5nIHRvIGRvCisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJUEVSUk9SKCJJbnZhbGlkIHJlZmVyZW5jZS5cbiIpOworLy8gICAgICAgICAgICAgICAgICAgICAgc3Bpbl91bmxvY2soaW5zdGFuY2UtPmNsa19zcmNfcmVnX2xvY2spOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9SRUY7CisJfQorCisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWU4MTAwX3JlZl9jb25maWcobWU4MjU0X3N1YmRldmljZV90ICogaW5zdGFuY2UsIGludCByZWYpCit7CisJc3dpdGNoIChyZWYpIHsKKworCWNhc2UgTUVfUkVGX0NUUl9FWFRFUk5BTDoKKwkJLy8gTm90aGluZyB0byBkbworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCVBFUlJPUigiSW52YWxpZCByZWZlcmVuY2UuXG4iKTsKKy8vICAgICAgICAgICAgICAgICAgICAgIHNwaW5fdW5sb2NrKGluc3RhbmNlLT5jbGtfc3JjX3JlZ19sb2NrKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfUkVGOworCX0KKworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lODI1NF9pb19zaW5nbGVfY29uZmlnKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSwKKwkJCQkgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgaW50IGNoYW5uZWwsCisJCQkJICAgaW50IHNpbmdsZV9jb25maWcsCisJCQkJICAgaW50IHJlZiwKKwkJCQkgICBpbnQgdHJpZ19jaGFuLAorCQkJCSAgIGludCB0cmlnX3R5cGUsIGludCB0cmlnX2VkZ2UsIGludCBmbGFncykKK3sKKwltZTgyNTRfc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCWludCBlcnI7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpZiAoY2hhbm5lbCkgeworCQlQRVJST1IoIkludmFsaWQgY2hhbm5lbC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCX0KKworCWluc3RhbmNlID0gKG1lODI1NF9zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlpZiAoZmxhZ3MpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWcgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCXNwaW5fbG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKwkvLyBDb25maWd1cmUgdGhlIGNvdW50ZXIgbW9kZXMKKwlpZiAoaW5zdGFuY2UtPmN0cl9pZHggPT0gMCkgeworCQlpZiAoc2luZ2xlX2NvbmZpZyA9PSBNRV9TSU5HTEVfQ09ORklHX0NUUl84MjU0X01PREVfMCkgeworCQkJb3V0YihNRTgyNTRfQ1RSTF9TQzAgfCBNRTgyNTRfQ1RSTF9MTSB8IE1FODI1NF9DVFJMX00wIHwKKwkJCSAgICAgTUU4MjU0X0NUUkxfQklOLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQl9IGVsc2UgaWYgKHNpbmdsZV9jb25maWcgPT0gTUVfU0lOR0xFX0NPTkZJR19DVFJfODI1NF9NT0RFXzEpIHsKKwkJCW91dGIoTUU4MjU0X0NUUkxfU0MwIHwgTUU4MjU0X0NUUkxfTE0gfCBNRTgyNTRfQ1RSTF9NMSB8CisJCQkgICAgIE1FODI1NF9DVFJMX0JJTiwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJfSBlbHNlIGlmIChzaW5nbGVfY29uZmlnID09IE1FX1NJTkdMRV9DT05GSUdfQ1RSXzgyNTRfTU9ERV8yKSB7CisJCQlvdXRiKE1FODI1NF9DVFJMX1NDMCB8IE1FODI1NF9DVFJMX0xNIHwgTUU4MjU0X0NUUkxfTTIgfAorCQkJICAgICBNRTgyNTRfQ1RSTF9CSU4sIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCX0gZWxzZSBpZiAoc2luZ2xlX2NvbmZpZyA9PSBNRV9TSU5HTEVfQ09ORklHX0NUUl84MjU0X01PREVfMykgeworCQkJb3V0YihNRTgyNTRfQ1RSTF9TQzAgfCBNRTgyNTRfQ1RSTF9MTSB8IE1FODI1NF9DVFJMX00zIHwKKwkJCSAgICAgTUU4MjU0X0NUUkxfQklOLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQl9IGVsc2UgaWYgKHNpbmdsZV9jb25maWcgPT0gTUVfU0lOR0xFX0NPTkZJR19DVFJfODI1NF9NT0RFXzQpIHsKKwkJCW91dGIoTUU4MjU0X0NUUkxfU0MwIHwgTUU4MjU0X0NUUkxfTE0gfCBNRTgyNTRfQ1RSTF9NNCB8CisJCQkgICAgIE1FODI1NF9DVFJMX0JJTiwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJfSBlbHNlIGlmIChzaW5nbGVfY29uZmlnID09IE1FX1NJTkdMRV9DT05GSUdfQ1RSXzgyNTRfTU9ERV81KSB7CisJCQlvdXRiKE1FODI1NF9DVFJMX1NDMCB8IE1FODI1NF9DVFJMX0xNIHwgTUU4MjU0X0NUUkxfTTUgfAorCQkJICAgICBNRTgyNTRfQ1RSTF9CSU4sIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCX0gZWxzZSB7CisJCQlQRVJST1IoIkludmFsaWQgc2luZ2xlIGNvbmZpZ3VyYXRpb24uXG4iKTsKKwkJCXNwaW5fdW5sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCQkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfU0lOR0xFX0NPTkZJRzsKKwkJfQorCX0gZWxzZSBpZiAoaW5zdGFuY2UtPmN0cl9pZHggPT0gMSkgeworCQlpZiAoc2luZ2xlX2NvbmZpZyA9PSBNRV9TSU5HTEVfQ09ORklHX0NUUl84MjU0X01PREVfMCkgeworCQkJb3V0YihNRTgyNTRfQ1RSTF9TQzEgfCBNRTgyNTRfQ1RSTF9MTSB8IE1FODI1NF9DVFJMX00wIHwKKwkJCSAgICAgTUU4MjU0X0NUUkxfQklOLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQl9IGVsc2UgaWYgKHNpbmdsZV9jb25maWcgPT0gTUVfU0lOR0xFX0NPTkZJR19DVFJfODI1NF9NT0RFXzEpIHsKKwkJCW91dGIoTUU4MjU0X0NUUkxfU0MxIHwgTUU4MjU0X0NUUkxfTE0gfCBNRTgyNTRfQ1RSTF9NMSB8CisJCQkgICAgIE1FODI1NF9DVFJMX0JJTiwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJfSBlbHNlIGlmIChzaW5nbGVfY29uZmlnID09IE1FX1NJTkdMRV9DT05GSUdfQ1RSXzgyNTRfTU9ERV8yKSB7CisJCQlvdXRiKE1FODI1NF9DVFJMX1NDMSB8IE1FODI1NF9DVFJMX0xNIHwgTUU4MjU0X0NUUkxfTTIgfAorCQkJICAgICBNRTgyNTRfQ1RSTF9CSU4sIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCX0gZWxzZSBpZiAoc2luZ2xlX2NvbmZpZyA9PSBNRV9TSU5HTEVfQ09ORklHX0NUUl84MjU0X01PREVfMykgeworCQkJb3V0YihNRTgyNTRfQ1RSTF9TQzEgfCBNRTgyNTRfQ1RSTF9MTSB8IE1FODI1NF9DVFJMX00zIHwKKwkJCSAgICAgTUU4MjU0X0NUUkxfQklOLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQl9IGVsc2UgaWYgKHNpbmdsZV9jb25maWcgPT0gTUVfU0lOR0xFX0NPTkZJR19DVFJfODI1NF9NT0RFXzQpIHsKKwkJCW91dGIoTUU4MjU0X0NUUkxfU0MxIHwgTUU4MjU0X0NUUkxfTE0gfCBNRTgyNTRfQ1RSTF9NNCB8CisJCQkgICAgIE1FODI1NF9DVFJMX0JJTiwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJfSBlbHNlIGlmIChzaW5nbGVfY29uZmlnID09IE1FX1NJTkdMRV9DT05GSUdfQ1RSXzgyNTRfTU9ERV81KSB7CisJCQlvdXRiKE1FODI1NF9DVFJMX1NDMSB8IE1FODI1NF9DVFJMX0xNIHwgTUU4MjU0X0NUUkxfTTUgfAorCQkJICAgICBNRTgyNTRfQ1RSTF9CSU4sIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCX0gZWxzZSB7CisJCQlQRVJST1IoIkludmFsaWQgc2luZ2xlIGNvbmZpZ3VyYXRpb24uXG4iKTsKKwkJCXNwaW5fdW5sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCQkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfU0lOR0xFX0NPTkZJRzsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChzaW5nbGVfY29uZmlnID09IE1FX1NJTkdMRV9DT05GSUdfQ1RSXzgyNTRfTU9ERV8wKSB7CisJCQlvdXRiKE1FODI1NF9DVFJMX1NDMiB8IE1FODI1NF9DVFJMX0xNIHwgTUU4MjU0X0NUUkxfTTAgfAorCQkJICAgICBNRTgyNTRfQ1RSTF9CSU4sIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCX0gZWxzZSBpZiAoc2luZ2xlX2NvbmZpZyA9PSBNRV9TSU5HTEVfQ09ORklHX0NUUl84MjU0X01PREVfMSkgeworCQkJb3V0YihNRTgyNTRfQ1RSTF9TQzIgfCBNRTgyNTRfQ1RSTF9MTSB8IE1FODI1NF9DVFJMX00xIHwKKwkJCSAgICAgTUU4MjU0X0NUUkxfQklOLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQl9IGVsc2UgaWYgKHNpbmdsZV9jb25maWcgPT0gTUVfU0lOR0xFX0NPTkZJR19DVFJfODI1NF9NT0RFXzIpIHsKKwkJCW91dGIoTUU4MjU0X0NUUkxfU0MyIHwgTUU4MjU0X0NUUkxfTE0gfCBNRTgyNTRfQ1RSTF9NMiB8CisJCQkgICAgIE1FODI1NF9DVFJMX0JJTiwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJfSBlbHNlIGlmIChzaW5nbGVfY29uZmlnID09IE1FX1NJTkdMRV9DT05GSUdfQ1RSXzgyNTRfTU9ERV8zKSB7CisJCQlvdXRiKE1FODI1NF9DVFJMX1NDMiB8IE1FODI1NF9DVFJMX0xNIHwgTUU4MjU0X0NUUkxfTTMgfAorCQkJICAgICBNRTgyNTRfQ1RSTF9CSU4sIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCX0gZWxzZSBpZiAoc2luZ2xlX2NvbmZpZyA9PSBNRV9TSU5HTEVfQ09ORklHX0NUUl84MjU0X01PREVfNCkgeworCQkJb3V0YihNRTgyNTRfQ1RSTF9TQzIgfCBNRTgyNTRfQ1RSTF9MTSB8IE1FODI1NF9DVFJMX000IHwKKwkJCSAgICAgTUU4MjU0X0NUUkxfQklOLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQl9IGVsc2UgaWYgKHNpbmdsZV9jb25maWcgPT0gTUVfU0lOR0xFX0NPTkZJR19DVFJfODI1NF9NT0RFXzUpIHsKKwkJCW91dGIoTUU4MjU0X0NUUkxfU0MyIHwgTUU4MjU0X0NUUkxfTE0gfCBNRTgyNTRfQ1RSTF9NNSB8CisJCQkgICAgIE1FODI1NF9DVFJMX0JJTiwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJfSBlbHNlIHsKKwkJCVBFUlJPUigiSW52YWxpZCBzaW5nbGUgY29uZmlndXJhdGlvbi5cbiIpOworCQkJc3Bpbl91bmxvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisJCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9TSU5HTEVfQ09ORklHOworCQl9CisJfQorCisJc3dpdGNoIChpbnN0YW5jZS0+ZGV2aWNlX2lkKSB7CisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTQwMDoKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNEUwOgorCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE0MEE6CisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTRFQToKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNDBCOgorCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE0RUI6CisJCWVyciA9IG1lMTQwMF9hYl9yZWZfY29uZmlnKGluc3RhbmNlLCByZWYpOworCisJCWlmIChlcnIpIHsKKwkJCXNwaW5fdW5sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCQkJcmV0dXJuIGVycjsKKwkJfQorCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTQwQzoKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNDBEOgorCQllcnIgPSBtZTE0MDBfY2RfcmVmX2NvbmZpZyhpbnN0YW5jZSwgcmVmKTsKKworCQlpZiAoZXJyKSB7CisJCQlzcGluX3VubG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKwkJCXJldHVybiBlcnI7CisJCX0KKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2MTA6CisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDY2MDoKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjYwSToKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjYwUzoKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjYwSVM6CisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDY3MDoKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjcwSToKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjcwUzoKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjcwSVM6CisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDY4MDoKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjgwSToKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjgwUzoKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjgwSVM6CisJCWVyciA9IG1lNDYwMF9yZWZfY29uZmlnKGluc3RhbmNlLCByZWYpOworCisJCWlmIChlcnIpIHsKKwkJCXNwaW5fdW5sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCQkJcmV0dXJuIGVycjsKKwkJfQorCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FODEwMF9BOgorCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTgxMDBfQjoKKwkJZXJyID0gbWU4MTAwX3JlZl9jb25maWcoaW5zdGFuY2UsIHJlZik7CisKKwkJaWYgKGVycikgeworCQkJc3Bpbl91bmxvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisJCQlyZXR1cm4gZXJyOworCQl9CisKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlQRVJST1IoIkludmFsaWQgZGV2aWNlIHR5cGUuXG4iKTsKKworCQlzcGluX3VubG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Bpbl91bmxvY2soaW5zdGFuY2UtPmNsa19zcmNfcmVnX2xvY2spOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9TSU5HTEVfQ09ORklHOworCX0KKwlzcGluX3VubG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWU4MjU0X2lvX3NpbmdsZV9yZWFkKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSwKKwkJCQkgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSBpbnQgY2hhbm5lbCwKKwkJCQkgaW50ICp2YWx1ZSwgaW50IHRpbWVfb3V0LCBpbnQgZmxhZ3MpCit7CisJbWU4MjU0X3N1YmRldmljZV90ICppbnN0YW5jZTsKKwl1aW50MTZfdCBsb19ieXRlOworCXVpbnQxNl90IGhpX2J5dGU7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpZiAoY2hhbm5lbCkgeworCQlQRVJST1IoIkludmFsaWQgY2hhbm5lbC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCX0KKworCWluc3RhbmNlID0gKG1lODI1NF9zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlpZiAoZmxhZ3MpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWcgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCXNwaW5fbG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKwlzcGluX2xvY2soaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2spOworCWlmIChpbnN0YW5jZS0+Y3RyX2lkeCA9PSAwKQorCQlvdXRiKE1FODI1NF9DVFJMX1NDMCB8IE1FODI1NF9DVFJMX1RMTywgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwllbHNlIGlmIChpbnN0YW5jZS0+Y3RyX2lkeCA9PSAxKQorCQlvdXRiKE1FODI1NF9DVFJMX1NDMSB8IE1FODI1NF9DVFJMX1RMTywgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwllbHNlCisJCW91dGIoTUU4MjU0X0NUUkxfU0MyIHwgTUU4MjU0X0NUUkxfVExPLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCisJbG9fYnl0ZSA9IGluYihpbnN0YW5jZS0+dmFsX3JlZyk7CisJaGlfYnl0ZSA9IGluYihpbnN0YW5jZS0+dmFsX3JlZyk7CisJc3Bpbl91bmxvY2soaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2spOworCisJKnZhbHVlID0gbG9fYnl0ZSB8IChoaV9ieXRlIDw8IDgpOworCXNwaW5fdW5sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZTgyNTRfaW9fc2luZ2xlX3dyaXRlKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSwKKwkJCQkgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgIGludCBjaGFubmVsLAorCQkJCSAgaW50IHZhbHVlLCBpbnQgdGltZV9vdXQsIGludCBmbGFncykKK3sKKwltZTgyNTRfc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJaWYgKGNoYW5uZWwpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGNoYW5uZWwuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwl9CisKKwlpbnN0YW5jZSA9IChtZTgyNTRfc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJaWYgKGZsYWdzKSB7CisJCVBFUlJPUigiSW52YWxpZCBmbGFnIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlzcGluX2xvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisJb3V0Yih2YWx1ZSwgaW5zdGFuY2UtPnZhbF9yZWcpOworCW91dGIoKHZhbHVlID4+IDgpLCBpbnN0YW5jZS0+dmFsX3JlZyk7CisJc3Bpbl91bmxvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lODI1NF9xdWVyeV9udW1iZXJfY2hhbm5lbHMoc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlLAorCQkJCQlpbnQgKm51bWJlcikKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJKm51bWJlciA9IE1FODI1NF9OVU1CRVJfQ0hBTk5FTFM7CisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWU4MjU0X3F1ZXJ5X3N1YmRldmljZV90eXBlKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSwKKwkJCQkgICAgICAgaW50ICp0eXBlLCBpbnQgKnN1YnR5cGUpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCSp0eXBlID0gTUVfVFlQRV9DVFI7CisJKnN1YnR5cGUgPSBNRV9TVUJUWVBFX0NUUl84MjU0OworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lODI1NF9xdWVyeV9zdWJkZXZpY2VfY2FwcyhzdHJ1Y3QgbWVfc3ViZGV2aWNlICpzdWJkZXZpY2UsCisJCQkJICAgICAgIGludCAqY2FwcykKK3sKKwltZTgyNTRfc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwlpbnN0YW5jZSA9IChtZTgyNTRfc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCSpjYXBzID0gaW5zdGFuY2UtPmNhcHM7CisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWU4MjU0X3F1ZXJ5X3N1YmRldmljZV9jYXBzX2FyZ3Moc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlLAorCQkJCQkgICAgaW50IGNhcCwgaW50ICphcmdzLCBpbnQgY291bnQpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJaWYgKGNvdW50ICE9IDEpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGNhcGFiaWxpdHkgYXJndW1lbnQgY291bnQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfQ0FQX0FSR19DT1VOVDsKKwl9CisKKwlpZiAoY2FwID09IE1FX0NBUF9DVFJfV0lEVEgpIHsKKwkJYXJnc1swXSA9IE1FODI1NF9DVFJfV0lEVEg7CisJfSBlbHNlIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGNhcGFiaWxpdHkuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfQ0FQOworCX0KKworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgdWludDMyX3QgbWUxNDAwQUJfZ2V0X3ZhbF9yZWcodWludDMyX3QgcmVnX2Jhc2UsIHVuc2lnbmVkIGludCBtZTgyNTRfaWR4LAorCQkJCSAgICAgdW5zaWduZWQgaW50IGN0cl9pZHgpCit7CisJc3dpdGNoIChtZTgyNTRfaWR4KSB7CisKKwljYXNlIDA6CisJCXJldHVybiAocmVnX2Jhc2UgKyBNRTE0MDBBQl84MjU0X0FfMF9WQUxfUkVHICsgY3RyX2lkeCk7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gKHJlZ19iYXNlICsgTUUxNDAwQUJfODI1NF9CXzBfVkFMX1JFRyArIGN0cl9pZHgpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdWludDMyX3QgbWUxNDAwQUJfZ2V0X2N0cmxfcmVnKHVpbnQzMl90IHJlZ19iYXNlLAorCQkJCSAgICAgIHVuc2lnbmVkIGludCBtZTgyNTRfaWR4LAorCQkJCSAgICAgIHVuc2lnbmVkIGludCBjdHJfaWR4KQoreworCXN3aXRjaCAobWU4MjU0X2lkeCkgeworCWNhc2UgMDoKKwkJcmV0dXJuIChyZWdfYmFzZSArIE1FMTQwMEFCXzgyNTRfQV9DVFJMX1JFRyk7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gKHJlZ19iYXNlICsgTUUxNDAwQUJfODI1NF9CX0NUUkxfUkVHKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHVpbnQzMl90IG1lMTQwMEFCX2dldF9jbGtfc3JjX3JlZyh1aW50MzJfdCByZWdfYmFzZSwKKwkJCQkJIHVuc2lnbmVkIGludCBtZTgyNTRfaWR4LAorCQkJCQkgdW5zaWduZWQgaW50IGN0cl9pZHgpCit7CisJc3dpdGNoIChtZTgyNTRfaWR4KSB7CisJY2FzZSAwOgorCQlyZXR1cm4gKHJlZ19iYXNlICsgTUUxNDAwQUJfQ0xLX1NSQ19SRUcpOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIChyZWdfYmFzZSArIE1FMTQwMEFCX0NMS19TUkNfUkVHKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHVpbnQzMl90IG1lMTQwMENEX2dldF92YWxfcmVnKHVpbnQzMl90IHJlZ19iYXNlLCB1bnNpZ25lZCBpbnQgbWU4MjU0X2lkeCwKKwkJCQkgICAgIHVuc2lnbmVkIGludCBjdHJfaWR4KQoreworCXN3aXRjaCAobWU4MjU0X2lkeCkgeworCWNhc2UgMDoKKwkJcmV0dXJuIChyZWdfYmFzZSArIE1FMTQwMENfODI1NF9BXzBfVkFMX1JFRyArIGN0cl9pZHgpOworCisJY2FzZSAxOgorCQlyZXR1cm4gKHJlZ19iYXNlICsgTUUxNDAwQ184MjU0X0JfMF9WQUxfUkVHICsgY3RyX2lkeCk7CisKKwljYXNlIDI6CisJCXJldHVybiAocmVnX2Jhc2UgKyBNRTE0MDBDXzgyNTRfQ18wX1ZBTF9SRUcgKyBjdHJfaWR4KTsKKworCWNhc2UgMzoKKwkJcmV0dXJuIChyZWdfYmFzZSArIE1FMTQwMENfODI1NF9EXzBfVkFMX1JFRyArIGN0cl9pZHgpOworCisJY2FzZSA0OgorCQlyZXR1cm4gKHJlZ19iYXNlICsgTUUxNDAwQ184MjU0X0VfMF9WQUxfUkVHICsgY3RyX2lkeCk7CisKKwljYXNlIDU6CisJCXJldHVybiAocmVnX2Jhc2UgKyBNRTE0MDBEXzgyNTRfQV8wX1ZBTF9SRUcgKyBjdHJfaWR4KTsKKworCWNhc2UgNjoKKwkJcmV0dXJuIChyZWdfYmFzZSArIE1FMTQwMERfODI1NF9CXzBfVkFMX1JFRyArIGN0cl9pZHgpOworCisJY2FzZSA3OgorCQlyZXR1cm4gKHJlZ19iYXNlICsgTUUxNDAwRF84MjU0X0NfMF9WQUxfUkVHICsgY3RyX2lkeCk7CisKKwljYXNlIDg6CisJCXJldHVybiAocmVnX2Jhc2UgKyBNRTE0MDBEXzgyNTRfRF8wX1ZBTF9SRUcgKyBjdHJfaWR4KTsKKworCWRlZmF1bHQ6CisJCXJldHVybiAocmVnX2Jhc2UgKyBNRTE0MDBEXzgyNTRfRV8wX1ZBTF9SRUcgKyBjdHJfaWR4KTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHVpbnQzMl90IG1lMTQwMENEX2dldF9jdHJsX3JlZyh1aW50MzJfdCByZWdfYmFzZSwKKwkJCQkgICAgICB1bnNpZ25lZCBpbnQgbWU4MjU0X2lkeCwKKwkJCQkgICAgICB1bnNpZ25lZCBpbnQgY3RyX2lkeCkKK3sKKwlzd2l0Y2ggKG1lODI1NF9pZHgpIHsKKwljYXNlIDA6CisJCXJldHVybiAocmVnX2Jhc2UgKyBNRTE0MDBDXzgyNTRfQV9DVFJMX1JFRyk7CisKKwljYXNlIDE6CisJCXJldHVybiAocmVnX2Jhc2UgKyBNRTE0MDBDXzgyNTRfQl9DVFJMX1JFRyk7CisKKwljYXNlIDI6CisJCXJldHVybiAocmVnX2Jhc2UgKyBNRTE0MDBDXzgyNTRfQ19DVFJMX1JFRyk7CisKKwljYXNlIDM6CisJCXJldHVybiAocmVnX2Jhc2UgKyBNRTE0MDBDXzgyNTRfRF9DVFJMX1JFRyk7CisKKwljYXNlIDQ6CisJCXJldHVybiAocmVnX2Jhc2UgKyBNRTE0MDBDXzgyNTRfRV9DVFJMX1JFRyk7CisKKwljYXNlIDU6CisJCXJldHVybiAocmVnX2Jhc2UgKyBNRTE0MDBEXzgyNTRfQV9DVFJMX1JFRyk7CisKKwljYXNlIDY6CisJCXJldHVybiAocmVnX2Jhc2UgKyBNRTE0MDBEXzgyNTRfQl9DVFJMX1JFRyk7CisKKwljYXNlIDc6CisJCXJldHVybiAocmVnX2Jhc2UgKyBNRTE0MDBEXzgyNTRfQ19DVFJMX1JFRyk7CisKKwljYXNlIDg6CisJCXJldHVybiAocmVnX2Jhc2UgKyBNRTE0MDBEXzgyNTRfRF9DVFJMX1JFRyk7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gKHJlZ19iYXNlICsgTUUxNDAwRF84MjU0X0VfQ1RSTF9SRUcpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdWludDMyX3QgbWUxNDAwQ0RfZ2V0X2Nsa19zcmNfcmVnKHVpbnQzMl90IHJlZ19iYXNlLAorCQkJCQkgdW5zaWduZWQgaW50IG1lODI1NF9pZHgsCisJCQkJCSB1bnNpZ25lZCBpbnQgY3RyX2lkeCkKK3sKKwlzd2l0Y2ggKG1lODI1NF9pZHgpIHsKKwljYXNlIDA6CisJCXJldHVybiAocmVnX2Jhc2UgKyBNRTE0MDBDX0NMS19TUkNfMF9SRUcpOworCisJY2FzZSAxOgorCQlyZXR1cm4gKHJlZ19iYXNlICsgTUUxNDAwQ19DTEtfU1JDXzBfUkVHKTsKKworCWNhc2UgMjoKKwkJcmV0dXJuIChyZWdfYmFzZSArIE1FMTQwMENfQ0xLX1NSQ18xX1JFRyk7CisKKwljYXNlIDM6CisJCXJldHVybiAocmVnX2Jhc2UgKyBNRTE0MDBDX0NMS19TUkNfMV9SRUcpOworCisJY2FzZSA0OgorCQlyZXR1cm4gKHJlZ19iYXNlICsgTUUxNDAwQ19DTEtfU1JDXzJfUkVHKTsKKworCWNhc2UgNToKKwkJcmV0dXJuIChyZWdfYmFzZSArIE1FMTQwMERfQ0xLX1NSQ18wX1JFRyk7CisKKwljYXNlIDY6CisJCXJldHVybiAocmVnX2Jhc2UgKyBNRTE0MDBEX0NMS19TUkNfMF9SRUcpOworCisJY2FzZSA3OgorCQlyZXR1cm4gKHJlZ19iYXNlICsgTUUxNDAwRF9DTEtfU1JDXzFfUkVHKTsKKworCWNhc2UgODoKKwkJcmV0dXJuIChyZWdfYmFzZSArIE1FMTQwMERfQ0xLX1NSQ18xX1JFRyk7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gKHJlZ19iYXNlICsgTUUxNDAwRF9DTEtfU1JDXzJfUkVHKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHVpbnQzMl90IG1lNDYwMF9nZXRfdmFsX3JlZyh1aW50MzJfdCByZWdfYmFzZSwgdW5zaWduZWQgaW50IG1lODI1NF9pZHgsCisJCQkJICAgdW5zaWduZWQgaW50IGN0cl9pZHgpCit7CisJcmV0dXJuIChyZWdfYmFzZSArIE1FNDYwMF84MjU0XzBfVkFMX1JFRyArIGN0cl9pZHgpOworfQorCitzdGF0aWMgdWludDMyX3QgbWU0NjAwX2dldF9jdHJsX3JlZyh1aW50MzJfdCByZWdfYmFzZSwgdW5zaWduZWQgaW50IG1lODI1NF9pZHgsCisJCQkJICAgIHVuc2lnbmVkIGludCBjdHJfaWR4KQoreworCXJldHVybiAocmVnX2Jhc2UgKyBNRTQ2MDBfODI1NF9DVFJMX1JFRyk7Cit9CisKK3N0YXRpYyB1aW50MzJfdCBtZTgxMDBfZ2V0X3ZhbF9yZWcodWludDMyX3QgcmVnX2Jhc2UsIHVuc2lnbmVkIGludCBtZTgyNTRfaWR4LAorCQkJCSAgIHVuc2lnbmVkIGludCBjdHJfaWR4KQoreworCXJldHVybiAocmVnX2Jhc2UgKyBNRTgxMDBfQ09VTlRFUl9SRUdfMCArIGN0cl9pZHggKiAyKTsKK30KKworc3RhdGljIHVpbnQzMl90IG1lODEwMF9nZXRfY3RybF9yZWcodWludDMyX3QgcmVnX2Jhc2UsIHVuc2lnbmVkIGludCBtZTgyNTRfaWR4LAorCQkJCSAgICB1bnNpZ25lZCBpbnQgY3RyX2lkeCkKK3sKKwlyZXR1cm4gKHJlZ19iYXNlICsgTUU4MTAwX0NPVU5URVJfQ1RSTF9SRUcpOworfQorCittZTgyNTRfc3ViZGV2aWNlX3QgKm1lODI1NF9jb25zdHJ1Y3Rvcih1aW50MzJfdCBkZXZpY2VfaWQsCisJCQkJICAgICAgIHVpbnQzMl90IHJlZ19iYXNlLAorCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgbWU4MjU0X2lkeCwKKwkJCQkgICAgICAgdW5zaWduZWQgaW50IGN0cl9pZHgsCisJCQkJICAgICAgIHNwaW5sb2NrX3QgKiBjdHJsX3JlZ19sb2NrLAorCQkJCSAgICAgICBzcGlubG9ja190ICogY2xrX3NyY19yZWdfbG9jaykKK3sKKwltZTgyNTRfc3ViZGV2aWNlX3QgKnN1YmRldmljZTsKKwlpbnQgZXJyOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJLy8gQWxsb2NhdGUgbWVtb3J5IGZvciBzdWJkZXZpY2UgaW5zdGFuY2UKKwlzdWJkZXZpY2UgPSBrbWFsbG9jKHNpemVvZihtZTgyNTRfc3ViZGV2aWNlX3QpLCBHRlBfS0VSTkVMKTsKKworCWlmICghc3ViZGV2aWNlKSB7CisJCVBFUlJPUigiQ2Fubm90IGdldCBtZW1vcnkgZm9yIDgyNTQgaW5zdGFuY2UuXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJbWVtc2V0KHN1YmRldmljZSwgMCwgc2l6ZW9mKG1lODI1NF9zdWJkZXZpY2VfdCkpOworCisJLy8gQ2hlY2sgaWYgY291bnRlciBpbmRleCBpcyBvdXQgb2YgcmFuZ2UKKworCWlmIChjdHJfaWR4ID4gMikgeworCQlQRVJST1IoIkNvdW50ZXIgaW5kZXggaXMgb3V0IG9mIHJhbmdlLlxuIik7CisJCWtmcmVlKHN1YmRldmljZSk7CisJCXJldHVybiBOVUxMOworCX0KKwkvLyBJbml0aWFsaXplIHN1YmRldmljZSBiYXNlIGNsYXNzCisJZXJyID0gbWVfc3ViZGV2aWNlX2luaXQoJnN1YmRldmljZS0+YmFzZSk7CisKKwlpZiAoZXJyKSB7CisJCVBFUlJPUigiQ2Fubm90IGluaXRpYWxpemUgc3ViZGV2aWNlIGJhc2UgY2xhc3MgaW5zdGFuY2UuXG4iKTsKKwkJa2ZyZWUoc3ViZGV2aWNlKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCS8vIEluaXRpYWxpemUgc3BpbiBsb2Nrcy4KKwlzcGluX2xvY2tfaW5pdCgmc3ViZGV2aWNlLT5zdWJkZXZpY2VfbG9jayk7CisJc3ViZGV2aWNlLT5jdHJsX3JlZ19sb2NrID0gY3RybF9yZWdfbG9jazsKKwlzdWJkZXZpY2UtPmNsa19zcmNfcmVnX2xvY2sgPSBjbGtfc3JjX3JlZ19sb2NrOworCisJLy8gU2F2ZSB0eXBlIG9mIE1laWxoYXVzIGRldmljZQorCXN1YmRldmljZS0+ZGV2aWNlX2lkID0gZGV2aWNlX2lkOworCisJLy8gU2F2ZSB0aGUgaW5kaWNlcworCXN1YmRldmljZS0+bWU4MjU0X2lkeCA9IG1lODI1NF9pZHg7CisJc3ViZGV2aWNlLT5jdHJfaWR4ID0gY3RyX2lkeDsKKworCS8vIERvIGRldmljZSBzcGVjaWZpYyBpbml0aWFsaXphdGlvbgorCXN3aXRjaCAoZGV2aWNlX2lkKSB7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNDBBOgorCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE0RUE6CisJCS8vIENoZWNrIGlmIDgyNTQgaW5kZXggaXMgb3V0IG9mIHJhbmdlCisJCWlmIChtZTgyNTRfaWR4ID4gMCkgeworCQkJUEVSUk9SKCI4MjU0IGluZGV4IGlzIG91dCBvZiByYW5nZS5cbiIpOworCQkJbWVfc3ViZGV2aWNlX2RlaW5pdCgmc3ViZGV2aWNlLT5iYXNlKTsKKwkJCWtmcmVlKHN1YmRldmljZSk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTQwQjoJLy8gRmFsbCB0aHJvdWdoCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTRFQjoKKwkJLy8gQ2hlY2sgaWYgODI1NCBpbmRleCBpcyBvdXQgb2YgcmFuZ2UKKwkJaWYgKG1lODI1NF9pZHggPiAxKSB7CisJCQlQRVJST1IoIjgyNTQgaW5kZXggaXMgb3V0IG9mIHJhbmdlLlxuIik7CisJCQltZV9zdWJkZXZpY2VfZGVpbml0KCZzdWJkZXZpY2UtPmJhc2UpOworCQkJa2ZyZWUoc3ViZGV2aWNlKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCS8vIEluaXRpYWxpemUgdGhlIGNvdW50ZXJzIGNhcGFiaWxpdGllcworCQlpZiAoY3RyX2lkeCA9PSAwKQorCQkJc3ViZGV2aWNlLT5jYXBzID0KKwkJCSAgICBNRV9DQVBTX0NUUl9DTEtfSU5URVJOQUxfMU1IWiB8CisJCQkgICAgTUVfQ0FQU19DVFJfQ0xLX0lOVEVSTkFMXzEwTUhaIHwKKwkJCSAgICBNRV9DQVBTX0NUUl9DTEtfRVhURVJOQUw7CisJCWVsc2UKKwkJCXN1YmRldmljZS0+Y2FwcyA9CisJCQkgICAgTUVfQ0FQU19DVFJfQ0xLX1BSRVZJT1VTIHwgTUVfQ0FQU19DVFJfQ0xLX0VYVEVSTkFMOworCisJCS8vIEdldCB0aGUgY291bnRlcnMgcmVnaXN0ZXJzCisJCXN1YmRldmljZS0+dmFsX3JlZyA9CisJCSAgICBtZTE0MDBBQl9nZXRfdmFsX3JlZyhyZWdfYmFzZSwgbWU4MjU0X2lkeCwgY3RyX2lkeCk7CisJCXN1YmRldmljZS0+Y3RybF9yZWcgPQorCQkgICAgbWUxNDAwQUJfZ2V0X2N0cmxfcmVnKHJlZ19iYXNlLCBtZTgyNTRfaWR4LCBjdHJfaWR4KTsKKwkJc3ViZGV2aWNlLT5jbGtfc3JjX3JlZyA9CisJCSAgICBtZTE0MDBBQl9nZXRfY2xrX3NyY19yZWcocmVnX2Jhc2UsIG1lODI1NF9pZHgsIGN0cl9pZHgpOworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE0MEM6CisJCS8vIENoZWNrIGlmIDgyNTQgaW5kZXggaXMgb3V0IG9mIHJhbmdlCisJCWlmIChtZTgyNTRfaWR4ID4gNCkgeworCQkJUEVSUk9SKCI4MjU0IGluZGV4IGlzIG91dCBvZiByYW5nZS5cbiIpOworCQkJbWVfc3ViZGV2aWNlX2RlaW5pdCgmc3ViZGV2aWNlLT5iYXNlKTsKKwkJCWtmcmVlKHN1YmRldmljZSk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTQwRDoKKwkJLy8gQ2hlY2sgaWYgODI1NCBpbmRleCBpcyBvdXQgb2YgcmFuZ2UKKwkJaWYgKG1lODI1NF9pZHggPiA5KSB7CisJCQlQRVJST1IoIjgyNTQgaW5kZXggaXMgb3V0IG9mIHJhbmdlLlxuIik7CisJCQltZV9zdWJkZXZpY2VfZGVpbml0KCZzdWJkZXZpY2UtPmJhc2UpOworCQkJa2ZyZWUoc3ViZGV2aWNlKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCS8vIEluaXRpYWxpemUgdGhlIGNvdW50ZXJzIGNhcGFiaWxpdGllcworCQlpZiAoY3RyX2lkeCA9PSAwKSB7CisJCQlpZiAobWU4MjU0X2lkeCA9PSAwKQorCQkJCXN1YmRldmljZS0+Y2FwcyA9CisJCQkJICAgIE1FX0NBUFNfQ1RSX0NMS19QUkVWSU9VUyB8CisJCQkJICAgIE1FX0NBUFNfQ1RSX0NMS19JTlRFUk5BTF8xTUhaIHwKKwkJCQkgICAgTUVfQ0FQU19DVFJfQ0xLX0lOVEVSTkFMXzEwTUhaIHwKKwkJCQkgICAgTUVfQ0FQU19DVFJfQ0xLX0VYVEVSTkFMOworCQkJZWxzZQorCQkJCXN1YmRldmljZS0+Y2FwcyA9CisJCQkJICAgIE1FX0NBUFNfQ1RSX0NMS19JTlRFUk5BTF8xTUhaIHwKKwkJCQkgICAgTUVfQ0FQU19DVFJfQ0xLX0lOVEVSTkFMXzEwTUhaIHwKKwkJCQkgICAgTUVfQ0FQU19DVFJfQ0xLX0VYVEVSTkFMOworCQl9IGVsc2UKKwkJCXN1YmRldmljZS0+Y2FwcyA9CisJCQkgICAgTUVfQ0FQU19DVFJfQ0xLX1BSRVZJT1VTIHwgTUVfQ0FQU19DVFJfQ0xLX0VYVEVSTkFMOworCisJCS8vIEdldCB0aGUgY291bnRlcnMgcmVnaXN0ZXJzCisJCXN1YmRldmljZS0+dmFsX3JlZyA9CisJCSAgICBtZTE0MDBDRF9nZXRfdmFsX3JlZyhyZWdfYmFzZSwgbWU4MjU0X2lkeCwgY3RyX2lkeCk7CisJCXN1YmRldmljZS0+Y3RybF9yZWcgPQorCQkgICAgbWUxNDAwQ0RfZ2V0X2N0cmxfcmVnKHJlZ19iYXNlLCBtZTgyNTRfaWR4LCBjdHJfaWR4KTsKKwkJc3ViZGV2aWNlLT5jbGtfc3JjX3JlZyA9CisJCSAgICBtZTE0MDBDRF9nZXRfY2xrX3NyY19yZWcocmVnX2Jhc2UsIG1lODI1NF9pZHgsIGN0cl9pZHgpOworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2MTA6CisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDY2MDoKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjYwSToKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjYwUzoKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjYwSVM6CisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDY3MDoKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjcwSToKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjcwUzoKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjcwSVM6CisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDY4MDoKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjgwSToKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjgwUzoKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjgwSVM6CisJCS8vIENoZWNrIGlmIDgyNTQgaW5kZXggaXMgb3V0IG9mIHJhbmdlCisJCWlmIChtZTgyNTRfaWR4ID4gMCkgeworCQkJUEVSUk9SKCI4MjU0IGluZGV4IGlzIG91dCBvZiByYW5nZS5cbiIpOworCQkJbWVfc3ViZGV2aWNlX2RlaW5pdCgmc3ViZGV2aWNlLT5iYXNlKTsKKwkJCWtmcmVlKHN1YmRldmljZSk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQkvLyBJbml0aWFsaXplIHRoZSBjb3VudGVycyBjYXBhYmlsaXRpZXMKKwkJc3ViZGV2aWNlLT5jYXBzID0gTUVfQ0FQU19DVFJfQ0xLX0VYVEVSTkFMOworCisJCS8vIEdldCB0aGUgY291bnRlcnMgcmVnaXN0ZXJzCisJCXN1YmRldmljZS0+dmFsX3JlZyA9CisJCSAgICBtZTQ2MDBfZ2V0X3ZhbF9yZWcocmVnX2Jhc2UsIG1lODI1NF9pZHgsIGN0cl9pZHgpOworCQlzdWJkZXZpY2UtPmN0cmxfcmVnID0KKwkJICAgIG1lNDYwMF9nZXRfY3RybF9yZWcocmVnX2Jhc2UsIG1lODI1NF9pZHgsIGN0cl9pZHgpOworCQlzdWJkZXZpY2UtPmNsa19zcmNfcmVnID0gMDsJLy8gTm90IHVzZWQKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU4MTAwX0E6CisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FODEwMF9COgorCQkvLyBDaGVjayBpZiA4MjU0IGluZGV4IGlzIG91dCBvZiByYW5nZQorCQlpZiAobWU4MjU0X2lkeCA+IDApIHsKKwkJCVBFUlJPUigiODI1NCBpbmRleCBpcyBvdXQgb2YgcmFuZ2UuXG4iKTsKKwkJCW1lX3N1YmRldmljZV9kZWluaXQoJnN1YmRldmljZS0+YmFzZSk7CisJCQlrZnJlZShzdWJkZXZpY2UpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJLy8gSW5pdGlhbGl6ZSB0aGUgY291bnRlcnMgY2FwYWJpbGl0aWVzCisJCXN1YmRldmljZS0+Y2FwcyA9IE1FX0NBUFNfQ1RSX0NMS19FWFRFUk5BTDsKKworCQkvLyBHZXQgdGhlIGNvdW50ZXJzIHJlZ2lzdGVycworCQlzdWJkZXZpY2UtPnZhbF9yZWcgPQorCQkgICAgbWU4MTAwX2dldF92YWxfcmVnKHJlZ19iYXNlLCBtZTgyNTRfaWR4LCBjdHJfaWR4KTsKKwkJc3ViZGV2aWNlLT5jdHJsX3JlZyA9CisJCSAgICBtZTgxMDBfZ2V0X2N0cmxfcmVnKHJlZ19iYXNlLCBtZTgyNTRfaWR4LCBjdHJfaWR4KTsKKwkJc3ViZGV2aWNlLT5jbGtfc3JjX3JlZyA9IDA7CS8vIE5vdCB1c2VkCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDY1MDoKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNDAwOgorCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE0RTA6CisJCVBFUlJPUigiTm8gODI1NCBzdWJkZXZpY2VzIGF2YWlsYWJsZSBmb3Igc3ViZGV2aWNlIGRldmljZS5cbiIpOworCQltZV9zdWJkZXZpY2VfZGVpbml0KCZzdWJkZXZpY2UtPmJhc2UpOworCQlrZnJlZShzdWJkZXZpY2UpOworCQlyZXR1cm4gTlVMTDsKKworCWRlZmF1bHQ6CisJCVBFUlJPUigiVW5rbm93biBkZXZpY2UgdHlwZS5cbiIpOworCQltZV9zdWJkZXZpY2VfZGVpbml0KCZzdWJkZXZpY2UtPmJhc2UpOworCQlrZnJlZShzdWJkZXZpY2UpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvLyBPdmVybG9hZCBzdWJkZXZpY2UgYmFzZSBjbGFzcyBtZXRob2RzLgorCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fcmVzZXRfc3ViZGV2aWNlID0KKwkgICAgbWU4MjU0X2lvX3Jlc2V0X3N1YmRldmljZTsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3NpbmdsZV9jb25maWcgPSBtZTgyNTRfaW9fc2luZ2xlX2NvbmZpZzsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3NpbmdsZV9yZWFkID0gbWU4MjU0X2lvX3NpbmdsZV9yZWFkOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fc2luZ2xlX3dyaXRlID0gbWU4MjU0X2lvX3NpbmdsZV93cml0ZTsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X251bWJlcl9jaGFubmVscyA9CisJICAgIG1lODI1NF9xdWVyeV9udW1iZXJfY2hhbm5lbHM7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9zdWJkZXZpY2VfdHlwZSA9CisJICAgIG1lODI1NF9xdWVyeV9zdWJkZXZpY2VfdHlwZTsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV9jYXBzID0KKwkgICAgbWU4MjU0X3F1ZXJ5X3N1YmRldmljZV9jYXBzOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfcXVlcnlfc3ViZGV2aWNlX2NhcHNfYXJncyA9CisJICAgIG1lODI1NF9xdWVyeV9zdWJkZXZpY2VfY2Fwc19hcmdzOworCisJcmV0dXJuIHN1YmRldmljZTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTgyNTQuaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTgyNTQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzJiNzE5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODI1NC5oCkBAIC0wLDAgKzEsODAgQEAKKy8qKgorICogQGZpbGUgbWU4MjU0LmgKKyAqCisgKiBAYnJpZWYgODI1NCBjb3VudGVyIGltcGxlbWVudGF0aW9uLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX01FODI1NF9IXworI2RlZmluZSBfTUU4MjU0X0hfCisKKyNpbmNsdWRlICJtZXN1YmRldmljZS5oIgorI2luY2x1ZGUgIm1lc2xvY2suaCIKKworI2lmZGVmIF9fS0VSTkVMX18KKworLyoqCisgKiBAYnJpZWYgVGhlIDgyNTQgc3ViZGV2aWNlIGNsYXNzLgorICovCit0eXBlZGVmIHN0cnVjdCBtZTgyNTRfc3ViZGV2aWNlIHsKKwkvKiBJbmhlcml0YW5jZSAqLworCW1lX3N1YmRldmljZV90IGJhc2U7CQkJLyoqPCBUaGUgc3ViZGV2aWNlIGJhc2UgY2xhc3MuICovCisKKwkvKiBBdHRyaWJ1dGVzICovCisJc3BpbmxvY2tfdCBzdWJkZXZpY2VfbG9jazsJCS8qKjwgU3BpbiBsb2NrIHRvIHByb3RlY3QgdGhlIHN1YmRldmljZSBmcm9tIGNvbmN1cnJlbnQgYWNjZXNzLiAqLworCisJc3BpbmxvY2tfdCAqY3RybF9yZWdfbG9jazsJCS8qKjwgU3BpbiBsb2NrIHRvIHByb3RlY3QgdGhlIGNvbnRyb2wgcmVnaXN0ZXIgZnJvbSBjb25jdXJyZW50IGFjY2Vzcy4gKi8KKwlzcGlubG9ja190ICpjbGtfc3JjX3JlZ19sb2NrOwkJLyoqPCBTcGluIGxvY2sgdG8gcHJvdGVjdCB0aGUgY2xvY2sgc291cmNlIHJlZ2lzdGVyIGZyb20gY29uY3VycmVudCBhY2Nlc3MuICovCisKKwl1aW50MzJfdCBkZXZpY2VfaWQ7CQkJLyoqPCBUaGUgTWVpbGhhdXMgZGV2aWNlIHR5cGUgY2FycnlpbmcgdGhlIDgyNTQgY2hpcC4gKi8KKwlpbnQgbWU4MjU0X2lkeDsJCQkJLyoqPCBUaGUgaW5kZXggb2YgdGhlIDgyNTQgY2hpcCBvbiB0aGUgZGV2aWNlLiAqLworCWludCBjdHJfaWR4OwkJCQkvKio8IFRoZSBpbmRleCBvZiB0aGUgY291bnRlciBvbiB0aGUgODI1NCBjaGlwLiAqLworCisJaW50IGNhcHM7CQkJCS8qKjwgSG9sZHMgdGhlIGRldmljZSBjYXBhYmlsaXRpZXMuICovCisKKwl1bnNpZ25lZCBsb25nIHZhbF9yZWc7CQkJLyoqPCBIb2xkcyB0aGUgYWN0dWFsIGNvdW50ZXIgdmFsdWUuICovCisJdW5zaWduZWQgbG9uZyBjdHJsX3JlZzsJCQkvKio8IFJlZ2lzdGVyIHRvIGNvbmZpZ3VyZSB0aGUgODI1NCBtb2Rlcy4gKi8KKwl1bnNpZ25lZCBsb25nIGNsa19zcmNfcmVnOwkJLyoqPCBSZWdpc3RlciB0byBjb25maWd1cmUgdGhlIGNvdW50ZXIgY29ubmVjdGlvbnMuICovCit9IG1lODI1NF9zdWJkZXZpY2VfdDsKKworLyoqCisgKiBAYnJpZWYgVGhlIGNvbnN0cnVjdG9yIHRvIGdlbmVyYXRlIGEgODI1NCBpbnN0YW5jZS4KKyAqCisgKiBAcGFyYW0gZGV2aWNlX2lkIFRoZSBraW5kIG9mIE1laWxoYXVzIGRldmljZSBob2xkaW5nIHRoZSA4MjU0LgorICogQHBhcmFtIHJlZ19iYXNlIFRoZSByZWdpc3RlciBiYXNlIGFkZHJlc3Mgb2YgdGhlIGRldmljZSBhcyByZXR1cm5lZCBieSB0aGUgUENJIEJJT1MuCisgKiBAcGFyYW0gbWU4MjU0X2lkeCBUaGUgaW5kZXggb2YgdGhlIDgyNTQgY2hpcCBvbiB0aGUgTWVpbGhhdXMgZGV2aWNlLgorICogQHBhcmFtIGN0cl9pZHggVGhlIGluZGV4IG9mIHRoZSBjb3VudGVyIGluc2lkZSBhIDgyNTQgY2hpcC4KKyAqIEBwYXJhbSBjdHJsX3JlZ19sb2NrIFBvaW50ZXIgdG8gc3BpbiBsb2NrIHByb3RlY3RpbmcgdGhlIDgyNTQgY29udHJvbCByZWdpc3RlciBmcm9tIGNvbmN1cnJlbnQgYWNjZXNzLgorICogQHBhcmFtIGNsa19zcmNfcmVnX2xvY2sgUG9pbnRlciB0byBzcGluIGxvY2sgcHJvdGVjdGluZyB0aGUgY2xvY2sgc291cmNlIHJlZ2lzdGVyIGZyb20gY29uY3VycmVudCBhY2Nlc3MuCisgKgorICogQHJldHVybiBQb2ludGVyIHRvIG5ldyBpbnN0YW5jZSBvbiBzdWNjZXNzLlxuCisgKiBOVUxMIG9uIGVycm9yLgorICovCittZTgyNTRfc3ViZGV2aWNlX3QgKm1lODI1NF9jb25zdHJ1Y3Rvcih1aW50MzJfdCBkZXZpY2VfaWQsCisJCQkJICAgICAgIHVpbnQzMl90IHJlZ19iYXNlLAorCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgbWU4MjU0X2lkeCwKKwkJCQkgICAgICAgdW5zaWduZWQgaW50IGN0cl9pZHgsCisJCQkJICAgICAgIHNwaW5sb2NrX3QgKiBjdHJsX3JlZ19sb2NrLAorCQkJCSAgICAgICBzcGlubG9ja190ICogY2xrX3NyY19yZWdfbG9jayk7CisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU4MjU0X3JlZy5oIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODI1NF9yZWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTJjMzZiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODI1NF9yZWcuaApAQCAtMCwwICsxLDE3MiBAQAorLyoqCisgKiBAZmlsZSBtZTgyNTRfcmVnLmgKKyAqCisgKiBAYnJpZWYgODI1NCBjb3VudGVyIHJlZ2lzdGVyIGRlZmluaXRpb25zLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA2IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICovCisKKyNpZm5kZWYgX01FODI1NF9SRUdfSF8KKyNkZWZpbmUgX01FODI1NF9SRUdfSF8KKworI2lmZGVmIF9fS0VSTkVMX18KKworLyogTUUxNDAwIEEvQiByZWdpc3RlciBvZmZzZXRzICovCisjZGVmaW5lIE1FMTQwMEFCXzgyNTRfQV8wX1ZBTF9SRUcJCTB4MDAwNCAvKio8IE9mZnNldCBvZiA4MjU0IEEgY291bnRlciAwIHZhbHVlIHJlZ2lzdGVyLiAqLworI2RlZmluZSBNRTE0MDBBQl84MjU0X0FfMV9WQUxfUkVHCQkweDAwMDUgLyoqPCBPZmZzZXQgb2YgODI1NCBBIGNvdW50ZXIgMSB2YWx1ZSByZWdpc3Rlci4gKi8KKyNkZWZpbmUgTUUxNDAwQUJfODI1NF9BXzJfVkFMX1JFRwkJMHgwMDA2IC8qKjwgT2Zmc2V0IG9mIDgyNTQgQSBjb3VudGVyIDIgdmFsdWUgcmVnaXN0ZXIuICovCisjZGVmaW5lIE1FMTQwMEFCXzgyNTRfQV9DVFJMX1JFRwkJMHgwMDA3IC8qKjwgT2Zmc2V0IG9mIDgyNTQgQSBjb250cm9sIHJlZ2lzdGVyLiAqLworCisjZGVmaW5lIE1FMTQwMEFCXzgyNTRfQl8wX1ZBTF9SRUcJCTB4MDAwQyAvKio8IE9mZnNldCBvZiA4MjU0IEIgY291bnRlciAwIHZhbHVlIHJlZ2lzdGVyLiAqLworI2RlZmluZSBNRTE0MDBBQl84MjU0X0JfMV9WQUxfUkVHCQkweDAwMEQgLyoqPCBPZmZzZXQgb2YgODI1NCBCIGNvdW50ZXIgMSB2YWx1ZSByZWdpc3Rlci4gKi8KKyNkZWZpbmUgTUUxNDAwQUJfODI1NF9CXzJfVkFMX1JFRwkJMHgwMDBFIC8qKjwgT2Zmc2V0IG9mIDgyNTQgQiBjb3VudGVyIDIgdmFsdWUgcmVnaXN0ZXIuICovCisjZGVmaW5lIE1FMTQwMEFCXzgyNTRfQl9DVFJMX1JFRwkJMHgwMDBGIC8qKjwgT2Zmc2V0IG9mIDgyNTQgQiBjb250cm9sIHJlZ2lzdGVyLiAqLworCisjZGVmaW5lIE1FMTQwMEFCX0NMS19TUkNfUkVHCQkJMHgwMDEwIC8qKjwgT2Zmc2V0IG9mIGNsb2NrIHNvdXJjZSByZWdpc3Rlci4gKi8KKworLyogTUUxNDAwIEMgcmVnaXN0ZXIgb2Zmc2V0cyAqLworI2RlZmluZSBNRTE0MDBDXzgyNTRfQV8wX1ZBTF9SRUcJCTB4MDAwNCAvKio8IE9mZnNldCBvZiA4MjU0IEEgY291bnRlciAwIHZhbHVlIHJlZ2lzdGVyLiAqLworI2RlZmluZSBNRTE0MDBDXzgyNTRfQV8xX1ZBTF9SRUcJCTB4MDAwNSAvKio8IE9mZnNldCBvZiA4MjU0IEEgY291bnRlciAwIHZhbHVlIHJlZ2lzdGVyLiAqLworI2RlZmluZSBNRTE0MDBDXzgyNTRfQV8yX1ZBTF9SRUcJCTB4MDAwNiAvKio8IE9mZnNldCBvZiA4MjU0IEEgY291bnRlciAwIHZhbHVlIHJlZ2lzdGVyLiAqLworI2RlZmluZSBNRTE0MDBDXzgyNTRfQV9DVFJMX1JFRwkJCTB4MDAwNyAvKio8IE9mZnNldCBvZiA4MjU0IEEgY29udHJvbCByZWdpc3Rlci4gKi8KKworI2RlZmluZSBNRTE0MDBDXzgyNTRfQl8wX1ZBTF9SRUcJCTB4MDAwQyAvKio8IE9mZnNldCBvZiA4MjU0IEIgY291bnRlciAwIHZhbHVlIHJlZ2lzdGVyLiAqLworI2RlZmluZSBNRTE0MDBDXzgyNTRfQl8xX1ZBTF9SRUcJCTB4MDAwRCAvKio8IE9mZnNldCBvZiA4MjU0IEIgY291bnRlciAwIHZhbHVlIHJlZ2lzdGVyLiAqLworI2RlZmluZSBNRTE0MDBDXzgyNTRfQl8yX1ZBTF9SRUcJCTB4MDAwRSAvKio8IE9mZnNldCBvZiA4MjU0IEIgY291bnRlciAwIHZhbHVlIHJlZ2lzdGVyLiAqLworI2RlZmluZSBNRTE0MDBDXzgyNTRfQl9DVFJMX1JFRwkJCTB4MDAwRiAvKio8IE9mZnNldCBvZiA4MjU0IEIgY29udHJvbCByZWdpc3Rlci4gKi8KKworI2RlZmluZSBNRTE0MDBDXzgyNTRfQ18wX1ZBTF9SRUcJCTB4MDAxMCAvKio8IE9mZnNldCBvZiA4MjU0IEMgY291bnRlciAwIHZhbHVlIHJlZ2lzdGVyLiAqLworI2RlZmluZSBNRTE0MDBDXzgyNTRfQ18xX1ZBTF9SRUcJCTB4MDAxMSAvKio8IE9mZnNldCBvZiA4MjU0IEMgY291bnRlciAwIHZhbHVlIHJlZ2lzdGVyLiAqLworI2RlZmluZSBNRTE0MDBDXzgyNTRfQ18yX1ZBTF9SRUcJCTB4MDAxMiAvKio8IE9mZnNldCBvZiA4MjU0IEMgY291bnRlciAwIHZhbHVlIHJlZ2lzdGVyLiAqLworI2RlZmluZSBNRTE0MDBDXzgyNTRfQ19DVFJMX1JFRwkJCTB4MDAxMyAvKio8IE9mZnNldCBvZiA4MjU0IEMgY29udHJvbCByZWdpc3Rlci4gKi8KKworI2RlZmluZSBNRTE0MDBDXzgyNTRfRF8wX1ZBTF9SRUcJCTB4MDAxNCAvKio8IE9mZnNldCBvZiA4MjU0IEQgY291bnRlciAwIHZhbHVlIHJlZ2lzdGVyLiAqLworI2RlZmluZSBNRTE0MDBDXzgyNTRfRF8xX1ZBTF9SRUcJCTB4MDAxNSAvKio8IE9mZnNldCBvZiA4MjU0IEQgY291bnRlciAwIHZhbHVlIHJlZ2lzdGVyLiAqLworI2RlZmluZSBNRTE0MDBDXzgyNTRfRF8yX1ZBTF9SRUcJCTB4MDAxNiAvKio8IE9mZnNldCBvZiA4MjU0IEQgY291bnRlciAwIHZhbHVlIHJlZ2lzdGVyLiAqLworI2RlZmluZSBNRTE0MDBDXzgyNTRfRF9DVFJMX1JFRwkJCTB4MDAxNyAvKio8IE9mZnNldCBvZiA4MjU0IEQgY29udHJvbCByZWdpc3Rlci4gKi8KKworI2RlZmluZSBNRTE0MDBDXzgyNTRfRV8wX1ZBTF9SRUcJCTB4MDAxOCAvKio8IE9mZnNldCBvZiA4MjU0IEUgY291bnRlciAwIHZhbHVlIHJlZ2lzdGVyLiAqLworI2RlZmluZSBNRTE0MDBDXzgyNTRfRV8xX1ZBTF9SRUcJCTB4MDAxOSAvKio8IE9mZnNldCBvZiA4MjU0IEUgY291bnRlciAwIHZhbHVlIHJlZ2lzdGVyLiAqLworI2RlZmluZSBNRTE0MDBDXzgyNTRfRV8yX1ZBTF9SRUcJCTB4MDAxQSAvKio8IE9mZnNldCBvZiA4MjU0IEUgY291bnRlciAwIHZhbHVlIHJlZ2lzdGVyLiAqLworI2RlZmluZSBNRTE0MDBDXzgyNTRfRV9DVFJMX1JFRwkJCTB4MDAxQiAvKio8IE9mZnNldCBvZiA4MjU0IEUgY29udHJvbCByZWdpc3Rlci4gKi8KKworI2RlZmluZSBNRTE0MDBDX0NMS19TUkNfMF9SRUcgIAkJCTB4MDAxQyAvKio8IE9mZnNldCBvZiBjbG9jayBzb3VyY2UgcmVnaXN0ZXIgMC4gKi8KKyNkZWZpbmUgTUUxNDAwQ19DTEtfU1JDXzFfUkVHICAJCQkweDAwMUQgLyoqPCBPZmZzZXQgb2YgY2xvY2sgc291cmNlIHJlZ2lzdGVyIDEuICovCisjZGVmaW5lIE1FMTQwMENfQ0xLX1NSQ18yX1JFRyAgCQkJMHgwMDFFIC8qKjwgT2Zmc2V0IG9mIGNsb2NrIHNvdXJjZSByZWdpc3RlciAyLiAqLworCisvKiBNRTE0MDAgRCByZWdpc3RlciBvZmZzZXRzICovCisjZGVmaW5lIE1FMTQwMERfODI1NF9BXzBfVkFMX1JFRwkJMHgwMDQ0IC8qKjwgT2Zmc2V0IG9mIDgyNTQgQSBjb3VudGVyIDAgdmFsdWUgcmVnaXN0ZXIuICovCisjZGVmaW5lIE1FMTQwMERfODI1NF9BXzFfVkFMX1JFRwkJMHgwMDQ1IC8qKjwgT2Zmc2V0IG9mIDgyNTQgQSBjb3VudGVyIDAgdmFsdWUgcmVnaXN0ZXIuICovCisjZGVmaW5lIE1FMTQwMERfODI1NF9BXzJfVkFMX1JFRwkJMHgwMDQ2IC8qKjwgT2Zmc2V0IG9mIDgyNTQgQSBjb3VudGVyIDAgdmFsdWUgcmVnaXN0ZXIuICovCisjZGVmaW5lIE1FMTQwMERfODI1NF9BX0NUUkxfUkVHCQkJMHgwMDQ3IC8qKjwgT2Zmc2V0IG9mIDgyNTQgQSBjb250cm9sIHJlZ2lzdGVyLiAqLworCisjZGVmaW5lIE1FMTQwMERfODI1NF9CXzBfVkFMX1JFRwkJMHgwMDRDIC8qKjwgT2Zmc2V0IG9mIDgyNTQgQiBjb3VudGVyIDAgdmFsdWUgcmVnaXN0ZXIuICovCisjZGVmaW5lIE1FMTQwMERfODI1NF9CXzFfVkFMX1JFRwkJMHgwMDREIC8qKjwgT2Zmc2V0IG9mIDgyNTQgQiBjb3VudGVyIDAgdmFsdWUgcmVnaXN0ZXIuICovCisjZGVmaW5lIE1FMTQwMERfODI1NF9CXzJfVkFMX1JFRwkJMHgwMDRFIC8qKjwgT2Zmc2V0IG9mIDgyNTQgQiBjb3VudGVyIDAgdmFsdWUgcmVnaXN0ZXIuICovCisjZGVmaW5lIE1FMTQwMERfODI1NF9CX0NUUkxfUkVHCQkJMHgwMDRGIC8qKjwgT2Zmc2V0IG9mIDgyNTQgQiBjb250cm9sIHJlZ2lzdGVyLiAqLworCisjZGVmaW5lIE1FMTQwMERfODI1NF9DXzBfVkFMX1JFRwkJMHgwMDUwIC8qKjwgT2Zmc2V0IG9mIDgyNTQgQyBjb3VudGVyIDAgdmFsdWUgcmVnaXN0ZXIuICovCisjZGVmaW5lIE1FMTQwMERfODI1NF9DXzFfVkFMX1JFRwkJMHgwMDUxIC8qKjwgT2Zmc2V0IG9mIDgyNTQgQyBjb3VudGVyIDAgdmFsdWUgcmVnaXN0ZXIuICovCisjZGVmaW5lIE1FMTQwMERfODI1NF9DXzJfVkFMX1JFRwkJMHgwMDUyIC8qKjwgT2Zmc2V0IG9mIDgyNTQgQyBjb3VudGVyIDAgdmFsdWUgcmVnaXN0ZXIuICovCisjZGVmaW5lIE1FMTQwMERfODI1NF9DX0NUUkxfUkVHCQkJMHgwMDUzIC8qKjwgT2Zmc2V0IG9mIDgyNTQgQyBjb250cm9sIHJlZ2lzdGVyLiAqLworCisjZGVmaW5lIE1FMTQwMERfODI1NF9EXzBfVkFMX1JFRwkJMHgwMDU0IC8qKjwgT2Zmc2V0IG9mIDgyNTQgRCBjb3VudGVyIDAgdmFsdWUgcmVnaXN0ZXIuICovCisjZGVmaW5lIE1FMTQwMERfODI1NF9EXzFfVkFMX1JFRwkJMHgwMDU1IC8qKjwgT2Zmc2V0IG9mIDgyNTQgRCBjb3VudGVyIDAgdmFsdWUgcmVnaXN0ZXIuICovCisjZGVmaW5lIE1FMTQwMERfODI1NF9EXzJfVkFMX1JFRwkJMHgwMDU2IC8qKjwgT2Zmc2V0IG9mIDgyNTQgRCBjb3VudGVyIDAgdmFsdWUgcmVnaXN0ZXIuICovCisjZGVmaW5lIE1FMTQwMERfODI1NF9EX0NUUkxfUkVHCQkJMHgwMDU3IC8qKjwgT2Zmc2V0IG9mIDgyNTQgRCBjb250cm9sIHJlZ2lzdGVyLiAqLworCisjZGVmaW5lIE1FMTQwMERfODI1NF9FXzBfVkFMX1JFRwkJMHgwMDU4IC8qKjwgT2Zmc2V0IG9mIDgyNTQgRSBjb3VudGVyIDAgdmFsdWUgcmVnaXN0ZXIuICovCisjZGVmaW5lIE1FMTQwMERfODI1NF9FXzFfVkFMX1JFRwkJMHgwMDU5IC8qKjwgT2Zmc2V0IG9mIDgyNTQgRSBjb3VudGVyIDAgdmFsdWUgcmVnaXN0ZXIuICovCisjZGVmaW5lIE1FMTQwMERfODI1NF9FXzJfVkFMX1JFRwkJMHgwMDVBIC8qKjwgT2Zmc2V0IG9mIDgyNTQgRSBjb3VudGVyIDAgdmFsdWUgcmVnaXN0ZXIuICovCisjZGVmaW5lIE1FMTQwMERfODI1NF9FX0NUUkxfUkVHCQkJMHgwMDVCIC8qKjwgT2Zmc2V0IG9mIDgyNTQgRSBjb250cm9sIHJlZ2lzdGVyLiAqLworCisjZGVmaW5lIE1FMTQwMERfQ0xLX1NSQ18wX1JFRyAgCQkJMHgwMDVDIC8qKjwgT2Zmc2V0IG9mIGNsb2NrIHNvdXJjZSByZWdpc3RlciAwLiAqLworI2RlZmluZSBNRTE0MDBEX0NMS19TUkNfMV9SRUcgIAkJCTB4MDA1RCAvKio8IE9mZnNldCBvZiBjbG9jayBzb3VyY2UgcmVnaXN0ZXIgMS4gKi8KKyNkZWZpbmUgTUUxNDAwRF9DTEtfU1JDXzJfUkVHICAJCQkweDAwNUUgLyoqPCBPZmZzZXQgb2YgY2xvY2sgc291cmNlIHJlZ2lzdGVyIDIuICovCisKKy8qIE1FNDYwMCByZWdpc3RlciBvZmZzZXRzICovCisjZGVmaW5lIE1FNDYwMF84MjU0XzBfVkFMX1JFRwkJCTB4MDAwMCAvKio8IE9mZnNldCBvZiA4MjU0IEEgY291bnRlciAwIHZhbHVlIHJlZ2lzdGVyLiAqLworI2RlZmluZSBNRTQ2MDBfODI1NF8xX1ZBTF9SRUcJCQkweDAwMDEgLyoqPCBPZmZzZXQgb2YgODI1NCBBIGNvdW50ZXIgMCB2YWx1ZSByZWdpc3Rlci4gKi8KKyNkZWZpbmUgTUU0NjAwXzgyNTRfMl9WQUxfUkVHCQkJMHgwMDAyIC8qKjwgT2Zmc2V0IG9mIDgyNTQgQSBjb3VudGVyIDAgdmFsdWUgcmVnaXN0ZXIuICovCisjZGVmaW5lIE1FNDYwMF84MjU0X0NUUkxfUkVHCQkJMHgwMDAzIC8qKjwgT2Zmc2V0IG9mIDgyNTQgQSBjb250cm9sIHJlZ2lzdGVyLiAqLworCisvKiBDb21tYW5kIHdvcmRzIGZvciA4MjU0IGNvbnRyb2wgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgTUU4MjU0X0NUUkxfU0MwICAgMHgwMAkgLyoqPCBDb3VudGVyIDAgc2VsZWN0aW9uLiAqLworI2RlZmluZSBNRTgyNTRfQ1RSTF9TQzEgICAweDQwCSAvKio8IENvdW50ZXIgMSBzZWxlY3Rpb24uICovCisjZGVmaW5lIE1FODI1NF9DVFJMX1NDMiAgIDB4ODAJIC8qKjwgQ291bnRlciAyIHNlbGVjdGlvbi4gKi8KKworI2RlZmluZSBNRTgyNTRfQ1RSTF9UTE8gICAweDAwCSAvKio8IENvdW50ZXIgbGF0Y2hpbmcgb3BlcmF0aW9uLiAqLworI2RlZmluZSBNRTgyNTRfQ1RSTF9MU0IgICAweDEwCSAvKio8IE9ubHkgcmVhZCBMU0IuICovCisjZGVmaW5lIE1FODI1NF9DVFJMX01TQiAgIDB4MjAJIC8qKjwgT25seSByZWFkIE1TQi4gKi8KKyNkZWZpbmUgTUU4MjU0X0NUUkxfTE0gICAgMHgzMAkgLyoqPCBGaXJzdCByZWFkIExTQiwgdGhlbiBNU0IuICAqLworCisjZGVmaW5lIE1FODI1NF9DVFJMX00wICAgIDB4MDAJIC8qKjwgTW9kZSAwIHNlbGVjdGlvbi4gKi8KKyNkZWZpbmUgTUU4MjU0X0NUUkxfTTEgICAgMHgwMgkgLyoqPCBNb2RlIDEgc2VsZWN0aW9uLiAqLworI2RlZmluZSBNRTgyNTRfQ1RSTF9NMiAgICAweDA0CSAvKio8IE1vZGUgMiBzZWxlY3Rpb24uICovCisjZGVmaW5lIE1FODI1NF9DVFJMX00zICAgIDB4MDYJIC8qKjwgTW9kZSAzIHNlbGVjdGlvbi4gKi8KKyNkZWZpbmUgTUU4MjU0X0NUUkxfTTQgICAgMHgwOAkgLyoqPCBNb2RlIDQgc2VsZWN0aW9uLiAqLworI2RlZmluZSBNRTgyNTRfQ1RSTF9NNSAgICAweDBBCSAvKio8IE1vZGUgNSBzZWxlY3Rpb24uICovCisKKyNkZWZpbmUgTUU4MjU0X0NUUkxfQklOICAgMHgwMAkgLyoqPCBCaW5hcnkgY291bnRlci4gKi8KKyNkZWZpbmUgTUU4MjU0X0NUUkxfQkNEICAgMHgwMQkgLyoqPCBCQ0QgY291bnRlci4gKi8KKworLyogTUUtMTQwMCBBL0IgY2xvY2sgc291cmNlIHJlZ2lzdGVyIGJpdHMgKi8KKyNkZWZpbmUgTUUxNDAwQUJfODI1NF9BXzBfQ0xLX1NSQ18xTUhaCQkoMCA8PCA3KQkvKio8IDFNSHogY2xvY2suICovCisjZGVmaW5lIE1FMTQwMEFCXzgyNTRfQV8wX0NMS19TUkNfMTBNSFoJCSgxIDw8IDcpCS8qKjwgMTBNSHogY2xvY2suICovCisjZGVmaW5lIE1FMTQwMEFCXzgyNTRfQV8wX0NMS19TUkNfUElOCQkoMCA8PCA2KQkvKio8IENMSyAwIHRvIFNVQi1ELiAqLworI2RlZmluZSBNRTE0MDBBQl84MjU0X0FfMF9DTEtfU1JDX1FVQVJaCQkoMSA8PCA2KQkvKio8IENvbm5lY3QgQ0xLIDAgd2l0aCBxdWFyei4gKi8KKworI2RlZmluZSBNRTE0MDBBQl84MjU0X0FfMV9DTEtfU1JDX1BJTgkJKDAgPDwgNSkJLyoqPCBDTEsgMSB0byBTVUItRC4gKi8KKyNkZWZpbmUgTUUxNDAwQUJfODI1NF9BXzFfQ0xLX1NSQ19QUkVWCQkoMSA8PCA1KQkvKio8IENvbm5lY3QgT1VUIDAgd2l0aCBDTEsgMS4gKi8KKworI2RlZmluZSBNRTE0MDBBQl84MjU0X0FfMl9DTEtfU1JDX1BJTgkJKDAgPDwgNCkJLyoqPCBDTEsgMiB0byBTVUItRC4gKi8KKyNkZWZpbmUgTUUxNDAwQUJfODI1NF9BXzJfQ0xLX1NSQ19QUkVWCQkoMSA8PCA0KQkvKio8IENvbm5lY3QgT1VUIDEgd2l0aCBDTEsgMi4gKi8KKworI2RlZmluZSBNRTE0MDBBQl84MjU0X0JfMF9DTEtfU1JDXzFNSFoJCSgwIDw8IDMpCS8qKjwgMU1IeiBjbG9jay4gKi8KKyNkZWZpbmUgTUUxNDAwQUJfODI1NF9CXzBfQ0xLX1NSQ18xME1IWgkJKDEgPDwgMykJLyoqPCAxME1IeiBjbG9jay4gKi8KKyNkZWZpbmUgTUUxNDAwQUJfODI1NF9CXzBfQ0xLX1NSQ19QSU4JCSgwIDw8IDIpCS8qKjwgQ0xLIDAgdG8gU1VCLUQuICovCisjZGVmaW5lIE1FMTQwMEFCXzgyNTRfQl8wX0NMS19TUkNfUVVBUloJCSgxIDw8IDIpCS8qKjwgQ29ubmVjdCBDTEsgMCB3aXRoIHF1YXJ6LiAqLworCisjZGVmaW5lIE1FMTQwMEFCXzgyNTRfQl8xX0NMS19TUkNfUElOCQkoMCA8PCAxKQkvKio8IENMSyAxIHRvIFNVQi1ELiAqLworI2RlZmluZSBNRTE0MDBBQl84MjU0X0JfMV9DTEtfU1JDX1BSRVYJCSgxIDw8IDEpCS8qKjwgQ29ubmVjdCBPVVQgMCB3aXRoIENMSyAxLiAqLworCisjZGVmaW5lIE1FMTQwMEFCXzgyNTRfQl8yX0NMS19TUkNfUElOCQkoMCA8PCAwKQkvKio8IENMSyAyIHRvIFNVQi1ELiAqLworI2RlZmluZSBNRTE0MDBBQl84MjU0X0JfMl9DTEtfU1JDX1BSRVYJCSgxIDw8IDApCS8qKjwgQ29ubmVjdCBPVVQgMSB3aXRoIENMSyAyLiAqLworCisvKiBNRS0xNDAwIEMvRCBjbG9jayBzb3VyY2UgcmVnaXN0ZXJzIGJpdHMgKi8KKyNkZWZpbmUgTUUxNDAwQ0RfODI1NF9BQ0VfMF9DTEtfU1JDX01BU0sJMHgwMwkvKio8IE1hc2tzIGFsbCBDTEsgc291cmNlIGJpdHMuICovCisjZGVmaW5lIE1FMTQwMENEXzgyNTRfQUNFXzBfQ0xLX1NSQ19QSU4JCTB4MDAJLyoqPCBDb25uZWN0IENMSyB0byBTVUItRC4gKi8KKyNkZWZpbmUgTUUxNDAwQ0RfODI1NF9BQ0VfMF9DTEtfU1JDXzFNSFoJMHgwMQkvKio8IENvbm5lY3QgQ0xLIHRvIDFNSHouICovCisjZGVmaW5lIE1FMTQwMENEXzgyNTRfQUNFXzBfQ0xLX1NSQ18xME1IWgkweDAyCS8qKjwgQ29ubmVjdCBDTEsgdG8gMTBNSHouICovCisjZGVmaW5lIE1FMTQwMENEXzgyNTRfQUNFXzBfQ0xLX1NSQ19QUkVWCTB4MDMJLyoqPCBDb25uZWN0IENMSyB0byBwcmV2aW91cyBjb3VudGVyIG91dHB1dCBvbiBNRS0xNDAwIEQgZXh0ZW5zaW9uLiAqLworCisjZGVmaW5lIE1FMTQwMENEXzgyNTRfQUNFXzFfQ0xLX1NSQ19NQVNLCTB4MDQJLyoqPCBNYXNrcyBhbGwgQ0xLIHNvdXJjZSBiaXRzLiAqLworI2RlZmluZSBNRTE0MDBDRF84MjU0X0FDRV8xX0NMS19TUkNfUElOCQkweDAwCS8qKjwgQ29ubmVjdCBDTEsgdG8gU1VCLUQuICovCisjZGVmaW5lIE1FMTQwMENEXzgyNTRfQUNFXzFfQ0xLX1NSQ19QUkVWCTB4MDQJLyoqPCBDb25uZWN0IENMSyB0byBwcmV2aW91cyBjb3VudGVyIG91dHB1dC4gKi8KKworI2RlZmluZSBNRTE0MDBDRF84MjU0X0FDRV8yX0NMS19TUkNfTUFTSwkweDA4CS8qKjwgTWFza3MgYWxsIENMSyBzb3VyY2UgYml0cy4gKi8KKyNkZWZpbmUgTUUxNDAwQ0RfODI1NF9BQ0VfMl9DTEtfU1JDX1BJTgkJMHgwMAkvKio8IENvbm5lY3QgdG8gU1VCLUQuICovCisjZGVmaW5lIE1FMTQwMENEXzgyNTRfQUNFXzJfQ0xLX1NSQ19QUkVWCTB4MDgJLyoqPCBDb25uZWN0IENMSyB0byBwcmV2aW91cyBjb3VudGVyIG91dHB1dC4gKi8KKworI2RlZmluZSBNRTE0MDBDRF84MjU0X0JEXzBfQ0xLX1NSQ19NQVNLCQkweDMwCS8qKjwgTWFza3MgYWxsIENMSyBzb3VyY2UgYml0cy4gKi8KKyNkZWZpbmUgTUUxNDAwQ0RfODI1NF9CRF8wX0NMS19TUkNfUElOCQkweDAwCS8qKjwgQ29ubmVjdCBDTEsgdG8gU1VCLUQuICovCisjZGVmaW5lIE1FMTQwMENEXzgyNTRfQkRfMF9DTEtfU1JDXzFNSFoJCTB4MTAJLyoqPCBDb25uZWN0IENMSyB0byAxTUh6LiAqLworI2RlZmluZSBNRTE0MDBDRF84MjU0X0JEXzBfQ0xLX1NSQ18xME1IWgkweDIwCS8qKjwgQ29ubmVjdCBDTEsgdG8gMTBNSHouICovCisjZGVmaW5lIE1FMTQwMENEXzgyNTRfQkRfMF9DTEtfU1JDX1BSRVYJCTB4MzAJLyoqPCBDb25uZWN0IENMSyB0byBwcmV2aW91cyBjb3VudGVyIG91dHB1dC4gKi8KKworI2RlZmluZSBNRTE0MDBDRF84MjU0X0JEXzFfQ0xLX1NSQ19NQVNLCQkweDQwCS8qKjwgTWFza3MgYWxsIENMSyBzb3VyY2UgYml0cy4gKi8KKyNkZWZpbmUgTUUxNDAwQ0RfODI1NF9CRF8xX0NMS19TUkNfUElOCQkweDAwCS8qKjwgQ29ubmVjdCBDTEsgdG8gU1VCLUQuICovCisjZGVmaW5lIE1FMTQwMENEXzgyNTRfQkRfMV9DTEtfU1JDX1BSRVYJCTB4NDAJLyoqPCBDb25uZWN0IENMSyB0byBwcmV2aW91cyBjb3VudGVyIG91dHB1dC4gKi8KKworI2RlZmluZSBNRTE0MDBDRF84MjU0X0JEXzJfQ0xLX1NSQ19NQVNLCQkweDgwCS8qKjwgTWFza3MgYWxsIENMSyBzb3VyY2UgYml0cy4gKi8KKyNkZWZpbmUgTUUxNDAwQ0RfODI1NF9CRF8yX0NMS19TUkNfUElOCQkweDAwCS8qKjwgQ29ubmVjdCBDTEsgdG8gU1VCLUQuICovCisjZGVmaW5lIE1FMTQwMENEXzgyNTRfQkRfMl9DTEtfU1JDX1BSRVYJCTB4ODAJLyoqPCBDb25uZWN0IENMSyB0byBwcmV2aW91cyBjb3VudGVyIG91dHB1dC4gKi8KKworLyogTUUtODEwMCBjb3VudGVyIHJlZ2lzdGVycyAqLworI2RlZmluZSBNRTgxMDBfQ09VTlRFUl9SRUdfMAkJCQkweDE4CS8vKHIsdykKKyNkZWZpbmUgTUU4MTAwX0NPVU5URVJfUkVHXzEJCQkJMHgxQQkvLyhyLHcpCisjZGVmaW5lIE1FODEwMF9DT1VOVEVSX1JFR18yCQkJCTB4MUMJLy8ocix3KQorI2RlZmluZSBNRTgxMDBfQ09VTlRFUl9DVFJMX1JFRwkJCQkweDFFCS8vKHIsdykKKworI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTgyNTUuYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTgyNTUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODBlN2Y4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODI1NS5jCkBAIC0wLDAgKzEsNDYyIEBACisvKioKKyAqIEBmaWxlIG1lODI1NS5jCisgKgorICogQGJyaWVmIDgyNTUgc3ViZGV2aWNlIGluc3RhbmNlLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX19LRVJORUxfXworIyAgZGVmaW5lIF9fS0VSTkVMX18KKyNlbmRpZgorCisvKgorICogSW5jbHVkZXMKKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2luY2x1ZGUgIm1lZGVmaW5lcy5oIgorI2luY2x1ZGUgIm1laW50ZXJuYWwuaCIKKyNpbmNsdWRlICJtZWVycm9yLmgiCisjaW5jbHVkZSAibWVkZWJ1Zy5oIgorCisjaW5jbHVkZSAibWU4MjU1X3JlZy5oIgorI2luY2x1ZGUgIm1lODI1NS5oIgorCisvKgorICogRGVmaW5lcworICovCisKKy8qCisgKiBGdW5jdGlvbnMKKyAqLworCitzdGF0aWMgdWludDhfdCBnZXRfbW9kZV9mcm9tX21pcnJvcih1aW50MzJfdCBtaXJyb3IpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJaWYgKG1pcnJvciAmIE1FODI1NV9QT1JUXzBfT1VUUFVUKSB7CisJCWlmIChtaXJyb3IgJiBNRTgyNTVfUE9SVF8xX09VVFBVVCkgeworCQkJaWYgKG1pcnJvciAmIE1FODI1NV9QT1JUXzJfT1VUUFVUKSB7CisJCQkJcmV0dXJuIE1FODI1NV9NT0RFX09PTzsKKwkJCX0gZWxzZSB7CisJCQkJcmV0dXJuIE1FODI1NV9NT0RFX0lPTzsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChtaXJyb3IgJiBNRTgyNTVfUE9SVF8yX09VVFBVVCkgeworCQkJCXJldHVybiBNRTgyNTVfTU9ERV9PSU87CisJCQl9IGVsc2UgeworCQkJCXJldHVybiBNRTgyNTVfTU9ERV9JSU87CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlpZiAobWlycm9yICYgTUU4MjU1X1BPUlRfMV9PVVRQVVQpIHsKKwkJCWlmIChtaXJyb3IgJiBNRTgyNTVfUE9SVF8yX09VVFBVVCkgeworCQkJCXJldHVybiBNRTgyNTVfTU9ERV9PT0k7CisJCQl9IGVsc2UgeworCQkJCXJldHVybiBNRTgyNTVfTU9ERV9JT0k7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAobWlycm9yICYgTUU4MjU1X1BPUlRfMl9PVVRQVVQpIHsKKwkJCQlyZXR1cm4gTUU4MjU1X01PREVfT0lJOworCQkJfSBlbHNlIHsKKwkJCQlyZXR1cm4gTUU4MjU1X01PREVfSUlJOworCQkJfQorCQl9CisJfQorfQorCitzdGF0aWMgaW50IG1lODI1NV9pb19yZXNldF9zdWJkZXZpY2Uoc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlLAorCQkJCSAgICAgc3RydWN0IGZpbGUgKmZpbGVwLCBpbnQgZmxhZ3MpCit7CisJbWU4MjU1X3N1YmRldmljZV90ICppbnN0YW5jZTsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lODI1NV9zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlpZiAoZmxhZ3MpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWcgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCXNwaW5fbG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKwlzcGluX2xvY2soaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2spOworCSppbnN0YW5jZS0+Y3RybF9yZWdfbWlycm9yICY9CisJICAgIH4oTUU4MjU1X1BPUlRfMF9PVVRQVVQgPDwgaW5zdGFuY2UtPmRpb19pZHgpOworCW91dGIoZ2V0X21vZGVfZnJvbV9taXJyb3IoKmluc3RhbmNlLT5jdHJsX3JlZ19taXJyb3IpLAorCSAgICAgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwlzcGluX3VubG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisKKwlvdXRiKDAsIGluc3RhbmNlLT5wb3J0X3JlZyk7CisJc3Bpbl91bmxvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lODI1NV9pb19zaW5nbGVfY29uZmlnKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSwKKwkJCQkgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgaW50IGNoYW5uZWwsCisJCQkJICAgaW50IHNpbmdsZV9jb25maWcsCisJCQkJICAgaW50IHJlZiwKKwkJCQkgICBpbnQgdHJpZ19jaGFuLAorCQkJCSAgIGludCB0cmlnX3R5cGUsIGludCB0cmlnX2VkZ2UsIGludCBmbGFncykKK3sKKwltZTgyNTVfc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJaW5zdGFuY2UgPSAobWU4MjU1X3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCWlmIChmbGFncyAmIH5NRV9JT19TSU5HTEVfQ09ORklHX0RJT19CWVRFKSB7CisJCVBFUlJPUigiSW52YWxpZCBmbGFnIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlpZiAoY2hhbm5lbCkgeworCQlQRVJST1IoIkludmFsaWQgY2hhbm5lbC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCX0KKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCXNwaW5fbG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKwlpZiAoc2luZ2xlX2NvbmZpZyA9PSBNRV9TSU5HTEVfQ09ORklHX0RJT19JTlBVVCkgeworCQlzcGluX2xvY2soaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2spOworCQkqaW5zdGFuY2UtPmN0cmxfcmVnX21pcnJvciAmPQorCQkgICAgfihNRTgyNTVfUE9SVF8wX09VVFBVVCA8PCBpbnN0YW5jZS0+ZGlvX2lkeCk7CisJCW91dGIoZ2V0X21vZGVfZnJvbV9taXJyb3IoKmluc3RhbmNlLT5jdHJsX3JlZ19taXJyb3IpLAorCQkgICAgIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrKTsKKwl9IGVsc2UgaWYgKHNpbmdsZV9jb25maWcgPT0gTUVfU0lOR0xFX0NPTkZJR19ESU9fT1VUUFVUKSB7CisJCXNwaW5fbG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisJCSppbnN0YW5jZS0+Y3RybF9yZWdfbWlycm9yIHw9CisJCSAgICAoTUU4MjU1X1BPUlRfMF9PVVRQVVQgPDwgaW5zdGFuY2UtPmRpb19pZHgpOworCQlvdXRiKGdldF9tb2RlX2Zyb21fbWlycm9yKCppbnN0YW5jZS0+Y3RybF9yZWdfbWlycm9yKSwKKwkJICAgICBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQlzcGluX3VubG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisJfSBlbHNlIHsKKwkJUEVSUk9SKCJJbnZhbGlkIHBvcnQgZGlyZWN0aW9uLlxuIik7CisJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfU0lOR0xFX0NPTkZJRzsKKwl9CisJc3Bpbl91bmxvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWU4MjU1X2lvX3NpbmdsZV9yZWFkKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSwKKwkJCQkgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSBpbnQgY2hhbm5lbCwKKwkJCQkgaW50ICp2YWx1ZSwgaW50IHRpbWVfb3V0LCBpbnQgZmxhZ3MpCit7CisJbWU4MjU1X3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lODI1NV9zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlzcGluX2xvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisJc3dpdGNoIChmbGFncykgeworCWNhc2UgTUVfSU9fU0lOR0xFX1RZUEVfRElPX0JJVDoKKwkJaWYgKChjaGFubmVsID49IDApICYmIChjaGFubmVsIDwgOCkpIHsKKwkJCSp2YWx1ZSA9IGluYihpbnN0YW5jZS0+cG9ydF9yZWcpICYgKDB4MSA8PCBjaGFubmVsKTsKKwkJfSBlbHNlIHsKKwkJCVBFUlJPUigiSW52YWxpZCBiaXQgbnVtYmVyLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIE1FX0lPX1NJTkdMRV9OT19GTEFHUzoKKwljYXNlIE1FX0lPX1NJTkdMRV9UWVBFX0RJT19CWVRFOgorCQlpZiAoY2hhbm5lbCA9PSAwKSB7CisJCQkqdmFsdWUgPSBpbmIoaW5zdGFuY2UtPnBvcnRfcmVnKTsKKwkJfSBlbHNlIHsKKwkJCVBFUlJPUigiSW52YWxpZCBieXRlIG51bWJlci5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWdzIHNwZWNpZmllZC5cbiIpOworCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKwlzcGluX3VubG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZTgyNTVfaW9fc2luZ2xlX3dyaXRlKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSwKKwkJCQkgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgIGludCBjaGFubmVsLAorCQkJCSAgaW50IHZhbHVlLCBpbnQgdGltZV9vdXQsIGludCBmbGFncykKK3sKKwltZTgyNTVfc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCXVpbnQ4X3QgYnl0ZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lODI1NV9zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlzcGluX2xvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisJc3dpdGNoIChmbGFncykgeworCWNhc2UgTUVfSU9fU0lOR0xFX1RZUEVfRElPX0JJVDoKKwkJaWYgKChjaGFubmVsID49IDApICYmIChjaGFubmVsIDwgOCkpIHsKKwkJCWlmICgqaW5zdGFuY2UtPgorCQkJICAgIGN0cmxfcmVnX21pcnJvciAmIChNRTgyNTVfUE9SVF8wX09VVFBVVCA8PAorCQkJCQkgICAgICAgaW5zdGFuY2UtPmRpb19pZHgpKSB7CisJCQkJYnl0ZSA9IGluYihpbnN0YW5jZS0+cG9ydF9yZWcpOworCisJCQkJaWYgKHZhbHVlKQorCQkJCQlieXRlIHw9IDB4MSA8PCBjaGFubmVsOworCQkJCWVsc2UKKwkJCQkJYnl0ZSAmPSB+KDB4MSA8PCBjaGFubmVsKTsKKworCQkJCW91dGIoYnl0ZSwgaW5zdGFuY2UtPnBvcnRfcmVnKTsKKwkJCX0gZWxzZSB7CisJCQkJUEVSUk9SKCJQb3J0IG5vdCBpbiBvdXRwdXQgbW9kZS5cbiIpOworCQkJCWVyciA9IE1FX0VSUk5PX1BSRVZJT1VTX0NPTkZJRzsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCVBFUlJPUigiSW52YWxpZCBiaXQgbnVtYmVyLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIE1FX0lPX1NJTkdMRV9OT19GTEFHUzoKKwljYXNlIE1FX0lPX1NJTkdMRV9UWVBFX0RJT19CWVRFOgorCQlpZiAoY2hhbm5lbCA9PSAwKSB7CisJCQlpZiAoKmluc3RhbmNlLT4KKwkJCSAgICBjdHJsX3JlZ19taXJyb3IgJiAoTUU4MjU1X1BPUlRfMF9PVVRQVVQgPDwKKwkJCQkJICAgICAgIGluc3RhbmNlLT5kaW9faWR4KSkgeworCQkJCW91dGIodmFsdWUsIGluc3RhbmNlLT5wb3J0X3JlZyk7CisJCQl9IGVsc2UgeworCQkJCVBFUlJPUigiUG9ydCBub3QgaW4gb3V0cHV0IG1vZGUuXG4iKTsKKwkJCQllcnIgPSBNRV9FUlJOT19QUkVWSU9VU19DT05GSUc7CisJCQl9CisJCX0gZWxzZSB7CisJCQlQRVJST1IoIkludmFsaWQgYnl0ZSBudW1iZXIuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCVBFUlJPUigiSW52YWxpZCBmbGFncyBzcGVjaWZpZWQuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisJc3Bpbl91bmxvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWU4MjU1X3F1ZXJ5X251bWJlcl9jaGFubmVscyhzdHJ1Y3QgbWVfc3ViZGV2aWNlICpzdWJkZXZpY2UsCisJCQkJCWludCAqbnVtYmVyKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwkqbnVtYmVyID0gTUU4MjU1X05VTUJFUl9DSEFOTkVMUzsKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZTgyNTVfcXVlcnlfc3ViZGV2aWNlX3R5cGUoc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlLAorCQkJCSAgICAgICBpbnQgKnR5cGUsIGludCAqc3VidHlwZSkKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJKnR5cGUgPSBNRV9UWVBFX0RJTzsKKwkqc3VidHlwZSA9IE1FX1NVQlRZUEVfU0lOR0xFOworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lODI1NV9xdWVyeV9zdWJkZXZpY2VfY2FwcyhzdHJ1Y3QgbWVfc3ViZGV2aWNlICpzdWJkZXZpY2UsCisJCQkJICAgICAgIGludCAqY2FwcykKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJKmNhcHMgPSBNRV9DQVBTX0RJT19ESVJfQllURTsKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworbWU4MjU1X3N1YmRldmljZV90ICptZTgyNTVfY29uc3RydWN0b3IodWludDMyX3QgZGV2aWNlX2lkLAorCQkJCSAgICAgICB1aW50MzJfdCByZWdfYmFzZSwKKwkJCQkgICAgICAgdW5zaWduZWQgaW50IG1lODI1NV9pZHgsCisJCQkJICAgICAgIHVuc2lnbmVkIGludCBkaW9faWR4LAorCQkJCSAgICAgICBpbnQgKmN0cmxfcmVnX21pcnJvciwKKwkJCQkgICAgICAgc3BpbmxvY2tfdCAqIGN0cmxfcmVnX2xvY2spCit7CisJbWU4MjU1X3N1YmRldmljZV90ICpzdWJkZXZpY2U7CisJaW50IGVycjsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCS8qIEFsbG9jYXRlIG1lbW9yeSBmb3Igc3ViZGV2aWNlIGluc3RhbmNlICovCisJc3ViZGV2aWNlID0ga21hbGxvYyhzaXplb2YobWU4MjU1X3N1YmRldmljZV90KSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIXN1YmRldmljZSkgeworCQlQRVJST1IoIkNhbm5vdCBnZXQgbWVtb3J5IGZvciA4MjU1IGluc3RhbmNlLlxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCW1lbXNldChzdWJkZXZpY2UsIDAsIHNpemVvZihtZTgyNTVfc3ViZGV2aWNlX3QpKTsKKworCS8qIENoZWNrIGlmIGNvdW50ZXIgaW5kZXggaXMgb3V0IG9mIHJhbmdlICovCisKKwlpZiAoZGlvX2lkeCA+IDIpIHsKKwkJUEVSUk9SKCJESU8gaW5kZXggaXMgb3V0IG9mIHJhbmdlLlxuIik7CisJCWtmcmVlKHN1YmRldmljZSk7CisJCXJldHVybiBOVUxMOworCX0KKworCS8qIEluaXRpYWxpemUgc3ViZGV2aWNlIGJhc2UgY2xhc3MgKi8KKwllcnIgPSBtZV9zdWJkZXZpY2VfaW5pdCgmc3ViZGV2aWNlLT5iYXNlKTsKKworCWlmIChlcnIpIHsKKwkJUEVSUk9SKCJDYW5ub3QgaW5pdGlhbGl6ZSBzdWJkZXZpY2UgYmFzZSBjbGFzcyBpbnN0YW5jZS5cbiIpOworCQlrZnJlZShzdWJkZXZpY2UpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJLy8gSW5pdGlhbGl6ZSBzcGluIGxvY2tzLgorCXNwaW5fbG9ja19pbml0KCZzdWJkZXZpY2UtPnN1YmRldmljZV9sb2NrKTsKKworCXN1YmRldmljZS0+Y3RybF9yZWdfbG9jayA9IGN0cmxfcmVnX2xvY2s7CisKKwkvKiBTYXZlIHRoZSBwb2ludGVyIHRvIGdsb2JhbCBwb3J0IHNldHRpbmdzICovCisJc3ViZGV2aWNlLT5jdHJsX3JlZ19taXJyb3IgPSBjdHJsX3JlZ19taXJyb3I7CisKKwkvKiBTYXZlIHR5cGUgb2YgTWVpbGhhdXMgZGV2aWNlICovCisJc3ViZGV2aWNlLT5kZXZpY2VfaWQgPSBkZXZpY2VfaWQ7CisKKwkvKiBTYXZlIHRoZSBpbmRpY2VzICovCisJc3ViZGV2aWNlLT5tZTgyNTVfaWR4ID0gbWU4MjU1X2lkeDsKKwlzdWJkZXZpY2UtPmRpb19pZHggPSBkaW9faWR4OworCisJLyogRG8gZGV2aWNlIHNwZWNpZmljIGluaXRpYWxpemF0aW9uICovCisJc3dpdGNoIChkZXZpY2VfaWQpIHsKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNDAwOgorCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE0RTA6CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNDBBOgorCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE0RUE6CisJCS8qIENoZWNrIGlmIDgyNTUgaW5kZXggaXMgb3V0IG9mIHJhbmdlICovCisJCWlmIChtZTgyNTVfaWR4ID4gMCkgeworCQkJUEVSUk9SKCI4MjU1IGluZGV4IGlzIG91dCBvZiByYW5nZS5cbiIpOworCQkJbWVfc3ViZGV2aWNlX2RlaW5pdCgmc3ViZGV2aWNlLT5iYXNlKTsKKwkJCWtmcmVlKHN1YmRldmljZSk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTQwQjoJLyogRmFsbCB0aHJvdWdoICovCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTRFQjoKKwkJLyogQ2hlY2sgaWYgODI1NSBpbmRleCBpcyBvdXQgb2YgcmFuZ2UgKi8KKwkJaWYgKG1lODI1NV9pZHggPiAxKSB7CisJCQlQRVJST1IoIjgyNTUgaW5kZXggaXMgb3V0IG9mIHJhbmdlLlxuIik7CisJCQltZV9zdWJkZXZpY2VfZGVpbml0KCZzdWJkZXZpY2UtPmJhc2UpOworCQkJa2ZyZWUoc3ViZGV2aWNlKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisKKwkJLyogR2V0IHRoZSByZWdpc3RlcnMgKi8KKwkJaWYgKG1lODI1NV9pZHggPT0gMCkgeworCQkJc3ViZGV2aWNlLT5jdHJsX3JlZyA9IHJlZ19iYXNlICsgTUUxNDAwQUJfUE9SVF9BX0NUUkw7CisJCQlzdWJkZXZpY2UtPnBvcnRfcmVnID0KKwkJCSAgICByZWdfYmFzZSArIE1FMTQwMEFCX1BPUlRfQV8wICsgZGlvX2lkeDsKKwkJfSBlbHNlIGlmIChtZTgyNTVfaWR4ID09IDEpIHsKKwkJCXN1YmRldmljZS0+Y3RybF9yZWcgPSByZWdfYmFzZSArIE1FMTQwMEFCX1BPUlRfQl9DVFJMOworCQkJc3ViZGV2aWNlLT5wb3J0X3JlZyA9CisJCQkgICAgcmVnX2Jhc2UgKyBNRTE0MDBBQl9QT1JUX0JfMCArIGRpb19pZHg7CisJCX0KKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE0MEM6CisJCS8qIENoZWNrIGlmIDgyNTUgaW5kZXggaXMgb3V0IG9mIHJhbmdlICovCisJCWlmIChtZTgyNTVfaWR4ID4gMCkgeworCQkJUEVSUk9SKCI4MjU1IGluZGV4IGlzIG91dCBvZiByYW5nZS5cbiIpOworCQkJbWVfc3ViZGV2aWNlX2RlaW5pdCgmc3ViZGV2aWNlLT5iYXNlKTsKKwkJCWtmcmVlKHN1YmRldmljZSk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTQwRDoJLyogRmFsbCB0aHJvdWdoICovCisJCS8qIENoZWNrIGlmIDgyNTUgaW5kZXggaXMgb3V0IG9mIHJhbmdlICovCisJCWlmIChtZTgyNTVfaWR4ID4gMSkgeworCQkJUEVSUk9SKCI4MjU1IGluZGV4IGlzIG91dCBvZiByYW5nZS5cbiIpOworCQkJbWVfc3ViZGV2aWNlX2RlaW5pdCgmc3ViZGV2aWNlLT5iYXNlKTsKKwkJCWtmcmVlKHN1YmRldmljZSk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJCS8qIEdldCB0aGUgcmVnaXN0ZXJzICovCisJCWlmIChtZTgyNTVfaWR4ID09IDApIHsKKwkJCXN1YmRldmljZS0+Y3RybF9yZWcgPSByZWdfYmFzZSArIE1FMTQwMENEX1BPUlRfQV9DVFJMOworCQkJc3ViZGV2aWNlLT5wb3J0X3JlZyA9CisJCQkgICAgcmVnX2Jhc2UgKyBNRTE0MDBDRF9QT1JUX0FfMCArIGRpb19pZHg7CisJCX0gZWxzZSBpZiAobWU4MjU1X2lkeCA9PSAxKSB7CisJCQlzdWJkZXZpY2UtPmN0cmxfcmVnID0gcmVnX2Jhc2UgKyBNRTE0MDBDRF9QT1JUX0JfQ1RSTDsKKwkJCXN1YmRldmljZS0+cG9ydF9yZWcgPQorCQkJICAgIHJlZ19iYXNlICsgTUUxNDAwQ0RfUE9SVF9CXzAgKyBkaW9faWR4OworCQl9CisKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlQRVJST1IoIlVua25vd24gZGV2aWNlIHR5cGUuIGRldiBJRDogMHglMDR4XG4iLCBkZXZpY2VfaWQpOworCisJCW1lX3N1YmRldmljZV9kZWluaXQoJnN1YmRldmljZS0+YmFzZSk7CisKKwkJa2ZyZWUoc3ViZGV2aWNlKTsKKworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKiBPdmVybG9hZCBzdWJkZXZpY2UgYmFzZSBjbGFzcyBtZXRob2RzLiAqLworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fcmVzZXRfc3ViZGV2aWNlID0KKwkgICAgbWU4MjU1X2lvX3Jlc2V0X3N1YmRldmljZTsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3NpbmdsZV9jb25maWcgPSBtZTgyNTVfaW9fc2luZ2xlX2NvbmZpZzsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3NpbmdsZV9yZWFkID0gbWU4MjU1X2lvX3NpbmdsZV9yZWFkOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fc2luZ2xlX3dyaXRlID0gbWU4MjU1X2lvX3NpbmdsZV93cml0ZTsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X251bWJlcl9jaGFubmVscyA9CisJICAgIG1lODI1NV9xdWVyeV9udW1iZXJfY2hhbm5lbHM7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9zdWJkZXZpY2VfdHlwZSA9CisJICAgIG1lODI1NV9xdWVyeV9zdWJkZXZpY2VfdHlwZTsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV9jYXBzID0KKwkgICAgbWU4MjU1X3F1ZXJ5X3N1YmRldmljZV9jYXBzOworCisJcmV0dXJuIHN1YmRldmljZTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTgyNTUuaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTgyNTUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzgyMzAwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODI1NS5oCkBAIC0wLDAgKzEsNTkgQEAKKy8qKgorICogQGZpbGUgbWU4MjU1LmgKKyAqCisgKiBAYnJpZWYgTWVpbGhhdXMgUElPIDgyNTUgaW1wbGVtZW50YXRpb24uCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDYgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKi8KKworI2lmbmRlZiBfTUU4MjU1X0hfCisjZGVmaW5lIF9NRTgyNTVfSF8KKworI2luY2x1ZGUgIm1lc3ViZGV2aWNlLmgiCisjaW5jbHVkZSAibWVzbG9jay5oIgorCisjaWZkZWYgX19LRVJORUxfXworCisvKioKKyAqIEBicmllZiBUaGUgODI1NSBzdWJkZXZpY2UgY2xhc3MuCisgKi8KK3R5cGVkZWYgc3RydWN0IG1lODI1NV9zdWJkZXZpY2UgeworCS8qIEluaGVyaXRhbmNlICovCisJbWVfc3ViZGV2aWNlX3QgYmFzZTsJCQkvKio8IFRoZSBzdWJkZXZpY2UgYmFzZSBjbGFzcy4gKi8KKworCS8qIEF0dHJpYnV0ZXMgKi8KKwlzcGlubG9ja190IHN1YmRldmljZV9sb2NrOwkJLyoqPCBTcGluIGxvY2sgdG8gcHJvdGVjdCB0aGUgc3ViZGV2aWNlIGZyb20gY29uY3VycmVudCBhY2Nlc3MuICovCisKKwlpbnQgKmN0cmxfcmVnX21pcnJvcjsJCQkvKio8IFBvaW50ZXIgdG8gbWlycm9yIG9mIHRoZSBjb250cm9sIHJlZ2lzdGVyLiAqLworCXNwaW5sb2NrX3QgKmN0cmxfcmVnX2xvY2s7CQkvKio8IFNwaW4gbG9jayB0byBwcm90ZWN0ICNjdHJsX3JlZyBhbmQgI2N0cmxfcmVnX21pcnJvciBmcm9tIGNvbmN1cnJlbnQgYWNjZXNzLiAqLworCisJdWludDMyX3QgZGV2aWNlX2lkOwkJCQkvKio8IFRoZSBQQ0kgZGV2aWNlIGlkIG9mIHRoZSBkZXZpY2UgaG9sZGluZyB0aGUgODI1NSBjaGlwLiAqLworCWludCBtZTgyNTVfaWR4OwkJCQkJLyoqPCBUaGUgaW5kZXggb2YgdGhlIDgyNTUgY2hpcCBvbiB0aGUgZGV2aWNlLiAqLworCWludCBkaW9faWR4OwkJCQkJLyoqPCBUaGUgaW5kZXggb2YgdGhlIERJTyBwb3J0IG9uIHRoZSA4MjU1IGNoaXAuICovCisKKwl1bnNpZ25lZCBsb25nIHBvcnRfcmVnOwkJCS8qKjwgUmVnaXN0ZXIgdG8gcmVhZCBvciB3cml0ZSBhIHZhbHVlIGZyb20gb3IgdG8gdGhlIHBvcnQgcmVzcGVjdGl2ZWx5LiAqLworCXVuc2lnbmVkIGxvbmcgY3RybF9yZWc7CQkJLyoqPCBSZWdpc3RlciB0byBjb25maWd1cmUgdGhlIDgyNTUgbW9kZXMuICovCit9IG1lODI1NV9zdWJkZXZpY2VfdDsKKworLyoqCisgKiBAYnJpZWYgVGhlIGNvbnN0cnVjdG9yIHRvIGdlbmVyYXRlIGEgODI1NSBpbnN0YW5jZS4KKyAqCisgKiBAcGFyYW0gZGV2aWNlX2lkIFRoZSBraW5kIG9mIE1laWxoYXVzIGRldmljZSBob2xkaW5nIHRoZSA4MjU1LgorICogQHBhcmFtIHJlZ19iYXNlIFRoZSByZWdpc3RlciBiYXNlIGFkZHJlc3Mgb2YgdGhlIGRldmljZSBhcyByZXR1cm5lZCBieSB0aGUgUENJIEJJT1MuCisgKiBAcGFyYW0gbWU4MjU1X2lkeCBUaGUgaW5kZXggb2YgdGhlIDgyNTUgY2hpcCBvbiB0aGUgTWVpbGhhdXMgZGV2aWNlLgorICogQHBhcmFtIGRpb19pZHggVGhlIGluZGV4IG9mIHRoZSBjb3VudGVyIGluc2lkZSBhIDgyNTUgY2hpcC4KKyAqIEBwYXJhbSBjdHJfcmVnX21pcnJvciBQb2ludGVyIHRvIG1pcnJvciBvZiBjb250cm9sIHJlZ2lzdGVyLgorICogQHBhcmFtIGN0cmxfcmVnX2xvY2sgUG9pbnRlciB0byBzcGluIGxvY2sgcHJvdGVjdGluZyB0aGUgODI1NSBjb250cm9sIHJlZ2lzdGVyIGFuZCAjY3RybF9yZWdfbWlycm9yIGZyb20gY29uY3VycmVudCBhY2Nlc3MuCisgKgorICogQHJldHVybiBQb2ludGVyIHRvIG5ldyBpbnN0YW5jZSBvbiBzdWNjZXNzLlxuCisgKiBOVUxMIG9uIGVycm9yLgorICovCittZTgyNTVfc3ViZGV2aWNlX3QgKm1lODI1NV9jb25zdHJ1Y3Rvcih1aW50MzJfdCBkZXZpY2VfaWQsCisJCQkJICAgICAgIHVpbnQzMl90IHJlZ19iYXNlLAorCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgbWU4MjU1X2lkeCwKKwkJCQkgICAgICAgdW5zaWduZWQgaW50IGRpb19pZHgsCisJCQkJICAgICAgIGludCAqY3RybF9yZWdfbWlycm9yLAorCQkJCSAgICAgICBzcGlubG9ja190ICogY3RybF9yZWdfbG9jayk7CisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU4MjU1X3JlZy5oIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODI1NV9yZWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMWRlYTFhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODI1NV9yZWcuaApAQCAtMCwwICsxLDUwIEBACisvKioKKyAqIEBmaWxlIG1lODI1NV9yZWcuaAorICoKKyAqIEBicmllZiA4MjU1IGNvdW50ZXIgcmVnaXN0ZXIgZGVmaW5pdGlvbnMuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDYgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKi8KKworI2lmbmRlZiBfTUU4MjU1X1JFR19IXworI2RlZmluZSBfTUU4MjU1X1JFR19IXworCisjaWZkZWYgX19LRVJORUxfXworCisjZGVmaW5lIE1FODI1NV9OVU1CRVJfQ0hBTk5FTFMJCTgJCS8qKjwgVGhlIG51bWJlciBvZiBjaGFubmVscyBwZXIgODI1NSBwb3J0LiAqLworCisjZGVmaW5lIE1FMTQwMEFCX1BPUlRfQV8wCQkJMHgwMDAwCS8qKjwgUG9ydCAwIG9mZnNldC4gKi8KKyNkZWZpbmUgTUUxNDAwQUJfUE9SVF9BXzEJCQkweDAwMDEJLyoqPCBQb3J0IDEgb2Zmc2V0LiAqLworI2RlZmluZSBNRTE0MDBBQl9QT1JUX0FfMgkJCTB4MDAwMgkvKio8IFBvcnQgMiBvZmZzZXQuICovCisjZGVmaW5lIE1FMTQwMEFCX1BPUlRfQV9DVFJMCQkweDAwMDMJLyoqPCBDb250cm9sIHJlZ2lzdGVyIGZvciA4MjU1IEEuICovCisKKyNkZWZpbmUgTUUxNDAwQUJfUE9SVF9CXzAJCQkweDAwMDgJLyoqPCBQb3J0IDAgb2Zmc2V0LiAqLworI2RlZmluZSBNRTE0MDBBQl9QT1JUX0JfMQkJCTB4MDAwOQkvKio8IFBvcnQgMSBvZmZzZXQuICovCisjZGVmaW5lIE1FMTQwMEFCX1BPUlRfQl8yCQkJMHgwMDBBCS8qKjwgUG9ydCAyIG9mZnNldC4gKi8KKyNkZWZpbmUgTUUxNDAwQUJfUE9SVF9CX0NUUkwJCTB4MDAwQgkvKio8IENvbnRyb2wgcmVnaXN0ZXIgZm9yIDgyNTUgQi4gKi8KKworI2RlZmluZSBNRTE0MDBDRF9QT1JUX0FfMAkJCTB4MDAwMAkvKio8IFBvcnQgMCBvZmZzZXQuICovCisjZGVmaW5lIE1FMTQwMENEX1BPUlRfQV8xCQkJMHgwMDAxCS8qKjwgUG9ydCAxIG9mZnNldC4gKi8KKyNkZWZpbmUgTUUxNDAwQ0RfUE9SVF9BXzIJCQkweDAwMDIJLyoqPCBQb3J0IDIgb2Zmc2V0LiAqLworI2RlZmluZSBNRTE0MDBDRF9QT1JUX0FfQ1RSTAkJMHgwMDAzCS8qKjwgQ29udHJvbCByZWdpc3RlciBmb3IgODI1NSBBLiAqLworCisjZGVmaW5lIE1FMTQwMENEX1BPUlRfQl8wCQkJMHgwMDQwCS8qKjwgUG9ydCAwIG9mZnNldC4gKi8KKyNkZWZpbmUgTUUxNDAwQ0RfUE9SVF9CXzEJCQkweDAwNDEJLyoqPCBQb3J0IDEgb2Zmc2V0LiAqLworI2RlZmluZSBNRTE0MDBDRF9QT1JUX0JfMgkJCTB4MDA0MgkvKio8IFBvcnQgMiBvZmZzZXQuICovCisjZGVmaW5lIE1FMTQwMENEX1BPUlRfQl9DVFJMCQkweDAwNDMJLyoqPCBDb250cm9sIHJlZ2lzdGVyIGZvciA4MjU1IEIuICovCisKKyNkZWZpbmUgTUU4MjU1X01PREVfT09PCQkJCTB4ODAJLyoqPCBQb3J0IDIgPSBPdXRwdXQsIFBvcnQgMSA9IE91dHB1dCwgUG9ydCAwID0gT3V0cHV0ICovCisjZGVmaW5lIE1FODI1NV9NT0RFX0lPTwkJCQkweDg5CS8qKjwgUG9ydCAyID0gSW5wdXQsICBQb3J0IDEgPSBPdXRwdXQsIFBvcnQgMCA9IE91dHB1dCAqLworI2RlZmluZSBNRTgyNTVfTU9ERV9PSU8JCQkJMHg4MgkvKio8IFBvcnQgMiA9IE91dHB1dCwgUG9ydCAxID0gSW5wdXQsICBQb3J0IDAgPSBPdXRwdXQgKi8KKyNkZWZpbmUgTUU4MjU1X01PREVfSUlPCQkJCTB4OEIJLyoqPCBQb3J0IDIgPSBJbnB1dCwgIFBvcnQgMSA9IElucHV0LCAgUG9ydCAwID0gT3V0cHV0ICovCisjZGVmaW5lIE1FODI1NV9NT0RFX09PSQkJCQkweDkwCS8qKjwgUG9ydCAyID0gT3V0cHV0LCBQb3J0IDEgPSBPdXRwdXQsIFBvcnQgMCA9IElucHV0ICovCisjZGVmaW5lIE1FODI1NV9NT0RFX0lPSQkJCQkweDk5CS8qKjwgUG9ydCAyID0gSW5wdXQsICBQb3J0IDEgPSBPdXRwdXQsIFBvcnQgMCA9IElucHV0ICovCisjZGVmaW5lIE1FODI1NV9NT0RFX09JSQkJCQkweDkyCS8qKjwgUG9ydCAyID0gT3V0cHV0LCBQb3J0IDEgPSBJbnB1dCwgIFBvcnQgMCA9IElucHV0ICovCisjZGVmaW5lIE1FODI1NV9NT0RFX0lJSQkJCQkweDlCCS8qKjwgUG9ydCAyID0gSW5wdXQsICBQb3J0IDEgPSBJbnB1dCwgIFBvcnQgMCA9IElucHV0ICovCisKKyNkZWZpbmUgTUU4MjU1X1BPUlRfMF9PVVRQVVQJCTB4MQkJLyoqPCBJZiBzZXQgaW4gbWlycm9yIHRoZW4gcG9ydCAwIGlzIGluIG91dHB1dCBtb2RlLiAqLworI2RlZmluZSBNRTgyNTVfUE9SVF8xX09VVFBVVAkJMHgyCQkvKio8IElmIHNldCBpbiBtaXJyb3IgdGhlbiBwb3J0IDEgaXMgaW4gb3V0cHV0IG1vZGUuICovCisjZGVmaW5lIE1FODI1NV9QT1JUXzJfT1VUUFVUCQkweDQJCS8qKjwgSWYgc2V0IGluIG1pcnJvciB0aGVuIHBvcnQgMiBpcyBpbiBvdXRwdXQgbW9kZS4gKi8KKworI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZWNpcmNfYnVmLmggYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWVjaXJjX2J1Zi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5YjU5MWUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWVjaXJjX2J1Zi5oCkBAIC0wLDAgKzEsMTMxIEBACisvKioKKyAqIEBmaWxlIG1lY2lyY19idWYuaAorICoKKyAqIEBicmllZiBNZWlsaGF1cyBjaXJjdWxhciBidWZmZXIgaW1wbGVtZW50YXRpb24uCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKiBAYXV0aG9yIEtyenlzenRvZiBHYW50emtlICAoay5nYW50emtlQG1laWxoYXVzLmRlKQorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX01FQ0lSQ19CVUZfSF8KKyNkZWZpbmUgX01FQ0lSQ19CVUZfSF8KKworIyBpZmRlZiBfX0tFUk5FTF9fCisKKyMgIGlmZGVmIEJPU0NICisKK3R5cGVkZWYgc3RydWN0IG1lX2NpcmNfYnVmIHsKKwl1bnNpZ25lZCBpbnQgbWFzazsKKy8vICAgICAgdW5zaWduZWQgaW50IGNvdW50OworCXVpbnQzMl90ICpidWY7CisJaW50IHZvbGF0aWxlIGhlYWQ7CisJaW50IHZvbGF0aWxlIHRhaWw7Cit9IG1lX2NpcmNfYnVmX3Q7CisKK3N0YXRpYyBpbnQgaW5saW5lIG1lX2NpcmNfYnVmX3ZhbHVlcyhtZV9jaXJjX2J1Zl90ICogYnVmKQoreworLy8gICAgICByZXR1cm4gKChidWYtPmhlYWQgLSBidWYtPnRhaWwpICYgKGJ1Zi0+Y291bnQgLSAxKSk7CisJcmV0dXJuICgoYnVmLT5oZWFkIC0gYnVmLT50YWlsKSAmIChidWYtPm1hc2spKTsKK30KKworc3RhdGljIGludCBpbmxpbmUgbWVfY2lyY19idWZfc3BhY2UobWVfY2lyY19idWZfdCAqIGJ1ZikKK3sKKy8vICAgICAgcmV0dXJuICgoYnVmLT50YWlsIC0gKGJ1Zi0+aGVhZCArIDEpKSAmIChidWYtPmNvdW50IC0gMSkpOworCXJldHVybiAoKGJ1Zi0+dGFpbCAtIChidWYtPmhlYWQgKyAxKSkgJiAoYnVmLT5tYXNrKSk7Cit9CisKK3N0YXRpYyBpbnQgaW5saW5lIG1lX2NpcmNfYnVmX3ZhbHVlc190b19lbmQobWVfY2lyY19idWZfdCAqIGJ1ZikKK3sKKwlpbnQgZW5kOworCWludCBuOworLy8gICAgICBlbmQgPSBidWYtPmNvdW50IC0gYnVmLT50YWlsOworLy8gICAgICBuID0gKGJ1Zi0+aGVhZCArIGVuZCkgJiAoYnVmLT5jb3VudCAtIDEpOworCWVuZCA9IGJ1Zi0+bWFzayArIDEgLSBidWYtPnRhaWw7CisJbiA9IChidWYtPmhlYWQgKyBlbmQpICYgKGJ1Zi0+bWFzayk7CisJcmV0dXJuIChuIDwgZW5kKSA/IG4gOiBlbmQ7Cit9CisKK3N0YXRpYyBpbnQgaW5saW5lIG1lX2NpcmNfYnVmX3NwYWNlX3RvX2VuZChtZV9jaXJjX2J1Zl90ICogYnVmKQoreworCWludCBlbmQ7CisJaW50IG47CisKKy8vICAgICAgZW5kID0gYnVmLT5jb3VudCAtIDEgLSBidWYtPmhlYWQ7CisvLyAgICAgIG4gPSAoZW5kICsgYnVmLT50YWlsKSAmIChidWYtPmNvdW50IC0gMSk7CisJZW5kID0gYnVmLT5tYXNrIC0gYnVmLT5oZWFkOworCW4gPSAoZW5kICsgYnVmLT50YWlsKSAmIChidWYtPm1hc2spOworCXJldHVybiAobiA8PSBlbmQpID8gbiA6IChlbmQgKyAxKTsKK30KKworI2RlZmluZSBfQ0JVRkZfMzJiX3QKKworIyAgZWxzZQkvL35CT1NDSAorLy8vIEBub3RlIGJ1Zi0+bWFzayA9IGJ1Zi0+Y291bnQtMSA9IE1FNDYwMF9BSV9DSVJDX0JVRl9DT1VOVC0xCisKKyMgICBpZmRlZiBfQ0JVRkZfMzJiX3QKKwkvLzMyIGJpdAordHlwZWRlZiBzdHJ1Y3QgbWVfY2lyY19idWZfMzJiIHsKKwlpbnQgdm9sYXRpbGUgaGVhZDsKKwlpbnQgdm9sYXRpbGUgdGFpbDsKKwl1bnNpZ25lZCBpbnQgbWFzazsJLy9idWZmb3Igc2l6ZS0xIG11c3QgYmUgMl5uLTEgdG8gd29yaworCXVpbnQzMl90ICpidWY7Cit9IG1lX2NpcmNfYnVmX3Q7CisjICAgZWxzZQorCS8vMTYgYml0Cit0eXBlZGVmIHN0cnVjdCBtZV9jaXJjX2J1Zl8xNmIgeworCWludCB2b2xhdGlsZSBoZWFkOworCWludCB2b2xhdGlsZSB0YWlsOworCXVuc2lnbmVkIGludCBtYXNrOwkvL2J1ZmZvciBzaXplLTEgbXVzdCBiZSAyXm4tMSB0byB3b3JrCisJdWludDE2X3QgKmJ1ZjsKK30gbWVfY2lyY19idWZfdDsKKyMgICBlbmRpZiAvL19DQlVGRl8zMmJfdAorCisvKiogSG93IG1hbnkgdmFsdWVzIGlzIGluIGJ1ZmZlciAqLworc3RhdGljIGludCBpbmxpbmUgbWVfY2lyY19idWZfdmFsdWVzKG1lX2NpcmNfYnVmX3QgKiBidWYpCit7CisJcmV0dXJuICgoYnVmLT5oZWFkIC0gYnVmLT50YWlsKSAmIChidWYtPm1hc2spKTsKK30KKworLyoqIEhvdyBtYW55IHNwYWNlIGxlZnQgKi8KK3N0YXRpYyBpbnQgaW5saW5lIG1lX2NpcmNfYnVmX3NwYWNlKG1lX2NpcmNfYnVmX3QgKiBidWYpCit7CisJcmV0dXJuICgoYnVmLT50YWlsIC0gKGJ1Zi0+aGVhZCArIDEpKSAmIChidWYtPm1hc2spKTsKK30KKworLyoqIEhvdyBtYW55IHZhbHVlcyBjYW4gYmUgcmVhZCBmcm9tIGJ1ZmZvciBpbiBvbmUgY2h1bmNrLiAqLworc3RhdGljIGludCBpbmxpbmUgbWVfY2lyY19idWZfdmFsdWVzX3RvX2VuZChtZV9jaXJjX2J1Zl90ICogYnVmKQoreworCXJldHVybiAoYnVmLT50YWlsIDw9CisJCWJ1Zi0+aGVhZCkgPyAoYnVmLT5oZWFkIC0gYnVmLT50YWlsKSA6IChidWYtPm1hc2sgLSBidWYtPnRhaWwgKworCQkJCQkJCTEpOworfQorCisvKiogSG93IG1hbnkgdmFsdWVzIGNhbiBiZSB3cml0ZSB0byBidWZmZXIgaW4gb25lIGNodW5jay4gKi8KK3N0YXRpYyBpbnQgaW5saW5lIG1lX2NpcmNfYnVmX3NwYWNlX3RvX2VuZChtZV9jaXJjX2J1Zl90ICogYnVmKQoreworCXJldHVybiAoYnVmLT50YWlsIDw9CisJCWJ1Zi0+aGVhZCkgPyAoYnVmLT5tYXNrIC0gYnVmLT5oZWFkICsgMSkgOiAoYnVmLT50YWlsIC0KKwkJCQkJCQkgICAgYnVmLT5oZWFkIC0gMSk7Cit9CisKKyMgIGVuZGlmIC8vQk9TQ0gKKyMgZW5kaWYJLy9fX0tFUk5FTF9fCisjZW5kaWYgLy9fTUVDSVJDX0JVRl9IXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lY29tbW9uLmggYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWVjb21tb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjQ3YzM4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lY29tbW9uLmgKQEAgLTAsMCArMSwyNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogU291cmNlIEZpbGUJOm1lY29tbW9uLmgKKyAqIEF1dGhvcgk6R0cgKEd1ZW50ZXIgR2ViaGFyZHQpCTxnLmdlYmhhcmR0QG1laWxoYXVzLmRlPgorICogQXV0aG9yCTpLRyAoS3J6eXN6dG9mIEdhbnR6a2UpCTxrLmdhbnR6a2VAbWVpbGhhdXMuZGU+CisgKi8KKworI2lmbmRlZiBfTUVDT01NT05fSF8KKyNkZWZpbmUgX01FQ09NTU9OX0hfCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFRoZSB2ZXJzaW9uIG9mIHRoaXMgcmVsZWFzZQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2lmbmRlZiBNRV9WRVJTSU9OX0RSSVZFUgorLyogVW5rbm93biB2ZXJzaW9uICovCisjIGRlZmluZSBNRV9WRVJTSU9OX0RSSVZFUgkweEZGRkZGRkZGCisjZW5kaWYKKworI2lmbmRlZiBMSUJNRURSSVZFUl9WRVJTSU9OCisvKiBVbmtub3duIHZlcnNpb24gKi8KKyMgZGVmaW5lIExJQk1FRFJJVkVSX1ZFUlNJT04JMHhGRkZGRkZGRgorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lZGVidWcuaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZWRlYnVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGNmYjk3YwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZWRlYnVnLmgKQEAgLTAsMCArMSwxMjUgQEAKKy8qKgorICogQGZpbGUgbWVkZWJ1Zy5oCisgKgorICogQGJyaWVmIERlYnVnZ2luZyBkZWZpbmVzLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA2IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICogQGF1dGhvciBLcnp5c3p0b2YgR2FudHprZQkoay5nYW50emtlQG1laWxoYXVzLmRlKQorICovCisKKyNpZm5kZWYgX01FREVCVUdfSF8KKyNkZWZpbmUgX01FREVCVUdfSF8KKworI2lmZGVmIF9fS0VSTkVMX18KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorCisvL01lc3NhZ2VzIGNvbnRyb2wuCisKKyNpZmRlZiBNRURFQlVHX1RFU1RfQUxMCQkvKiBTd2l0Y2ggdG8gZW5hYmxlIGFsbCBpbmZvIG1lc3NhZ2VzLiAqLworIyBpZm5kZWYgTUVERUJVR19URVNUCisjICBkZWZpbmUgTUVERUJVR19URVNUCisjIGVuZGlmCisjIGlmbmRlZiBNRURFQlVHX1RFU1RfSU5GTworIyAgZGVmaW5lIE1FREVCVUdfVEVTVF9JTkZPCisjIGVuZGlmCisjIGlmbmRlZiBNRURFQlVHX0RFQlVHX1JFRworIyAgZGVmaW5lIE1FREVCVUdfREVCVUdfUkVHCS8qIFN3aXRjaCB0byBlbmFibGUgcmVnaXN0cnkgYWNjZXNzIGRlYnVnaW5nIG1lc3NhZ2VzLiAqLworIyBlbmRpZgorIyBpZm5kZWYgTUVERUJVR19ERUJVR19MT0NLUworIyAgZGVmaW5lIE1FREVCVUdfREVCVUdfTE9DS1MJLyogU3dpdGNoIHRvIGVuYWJsZSBsb2NraW5nIG1lc3NhZ2VzLiAqLworIyBlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBNRURFQlVHX1RFU1RfSU5GTwkvKiBTd2l0Y2ggdG8gZW5hYmxlIGluZm8gIGFuZCB0ZXN0IG1lc3NhZ2VzLiAqLworIyBpZm5kZWYgTUVERUJVR19JTkZPCisjICBkZWZpbmUgTUVERUJVR19JTkZPCQkvKiBTd2l0Y2ggdG8gZW5hYmxlIGluZm8gbWVzc2FnZXMuICovCisjIGVuZGlmCisjIGlmbmRlZiBNRURFQlVHX1RFU1QKKyMgIGRlZmluZSBNRURFQlVHX1RFU1QKKyMgZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgTUVERUJVR19URVNUCQkvKiBTd2l0Y2ggdG8gZW5hYmxlIGRlYnVnIHRlc3QgbWVzc2FnZXMuICovCisjIGlmbmRlZiBNRURFQlVHX0RFQlVHCisjICBkZWZpbmUgTUVERUJVR19ERUJVRwkJLyogU3dpdGNoIHRvIGVuYWJsZSBkZWJ1ZyBtZXNzYWdlcy4gKi8KKyMgZW5kaWYKKyMgaWZuZGVmIE1FREVCVUdfRVJST1IKKyMgIGRlZmluZSBNRURFQlVHX0VSUk9SCQkvKiBTd2l0Y2ggdG8gZW5hYmxlIGVycm9yIG1lc3NhZ2VzLiAqLworIyBlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBNRURFQlVHX0VSUk9SCQkvKiBTd2l0Y2ggdG8gZW5hYmxlIGVycm9yIG1lc3NhZ2VzLiAqLworIyBpZm5kZWYgTUVERUJVR19FUlJPUl9DUklUSUNBTAkvKiBBbHNvIGNyaXRpY2FsIGVycm9yIG1lc3NhZ2VzLiAqLworIyAgZGVmaW5lIE1FREVCVUdfRVJST1JfQ1JJVElDQUwJLyogU3dpdGNoIHRvIGVuYWJsZSBoaWdoIGltcG9ydGFuY2UgZXJyb3IgbWVzc2FnZXMuICovCisjIGVuZGlmCisjZW5kaWYKKworI3VuZGVmIFBERUJVRwkJCS8qIE9ubHkgdG8gYmUgc3VyZS4gKi8KKyN1bmRlZiBQSU5GTwkJCS8qIE9ubHkgdG8gYmUgc3VyZS4gKi8KKyN1bmRlZiBQRVJST1IJCQkvKiBPbmx5IHRvIGJlIHN1cmUuICovCisjdW5kZWYgUEVSUk9SX0NSSVRJQ0FMCQkvKiBPbmx5IHRvIGJlIHN1cmUuICovCisjdW5kZWYgUERFQlVHX1JFRwkJLyogT25seSB0byBiZSBzdXJlLiAqLworI3VuZGVmIFBERUJVR19MT0NLUwkJLyogT25seSB0byBiZSBzdXJlLiAqLworI3VuZGVmIFBTRUNVUklUWQkJLyogT25seSB0byBiZSBzdXJlLiAqLworI3VuZGVmIFBMT0cJCQkvKiBPbmx5IHRvIGJlIHN1cmUuICovCisKKyNpZmRlZiBNRURFQlVHX0RFQlVHCisjIGRlZmluZSBQREVCVUcoZm10LCBhcmdzLi4uKSBcCisJcHJpbnRrKEtFUk5fREVCVUciTUVfRFJWIEQ6IDwlcz4gIiBmbXQsIF9fZnVuY19fLCAjI2FyZ3MpCisjZWxzZQorIyBkZWZpbmUgUERFQlVHKGZtdCwgYXJncy4uLikKKyNlbmRpZgorCisjaWZkZWYgTUVERUJVR19ERUJVR19MT0NLUworIyBkZWZpbmUgUERFQlVHX0xPQ0tTKGZtdCwgYXJncy4uLikgXAorCXByaW50ayhLRVJOX0RFQlVHIk1FX0RSViBMOiA8JXM+ICIgZm10LCBfX2Z1bmNfXywgIyNhcmdzKQorI2Vsc2UKKyMgZGVmaW5lIFBERUJVR19MT0NLUyhmbXQsIGFyZ3MuLi4pCisjZW5kaWYKKworI2lmZGVmIE1FREVCVUdfREVCVUdfUkVHCisjIGRlZmluZSBQREVCVUdfUkVHKGZtdCwgYXJncy4uLikgXAorCXByaW50ayhLRVJOX0RFQlVHIk1FX0RSViBSOiA8JXM6JWQ+IFJFRzoiIGZtdCwgX19mdW5jX18sIF9fTElORV9fLCAjI2FyZ3MpCisjZWxzZQorIyBkZWZpbmUgUERFQlVHX1JFRyhmbXQsIGFyZ3MuLi4pCisjZW5kaWYKKworI2lmZGVmIE1FREVCVUdfSU5GTworIyBkZWZpbmUgUElORk8oZm10LCBhcmdzLi4uKSBcCisJcHJpbnRrKEtFUk5fSU5GTyJNRV9EUlYgSTogIiBmbXQsICMjYXJncykKKyNlbHNlCisjIGRlZmluZSBQSU5GTyhmbXQsIGFyZ3MuLi4pCisjZW5kaWYKKworI2lmZGVmIE1FREVCVUdfRVJST1IKKyMgZGVmaW5lIFBFUlJPUihmbXQsIGFyZ3MuLi4pIFwKKwlwcmludGsoS0VSTl9FUlIiTUVfRFJWIEU6IDwlczolaT4gIiBmbXQsIF9fRklMRV9fLCBfX0xJTkVfXywgIyNhcmdzKQorI2Vsc2UKKyMgZGVmaW5lIFBFUlJPUihmbXQsIGFyZ3MuLi4pCisjZW5kaWYKKworI2lmZGVmIE1FREVCVUdfRVJST1JfQ1JJVElDQUwKKyMgZGVmaW5lIFBFUlJPUl9DUklUSUNBTChmbXQsIGFyZ3MuLi4pIFwKKwlwcmludGsoS0VSTl9DUklUIk1FX0RSViBDOiA8JXM6JWk+ICIgZm10LCBfX0ZJTEVfXywgX19MSU5FX18sICMjYXJncykKKyNlbHNlCisjIGRlZmluZSBQRVJST1JfQ1JJVElDQUwoZm10LCBhcmdzLi4uKQorI2VuZGlmCisKKy8vVGhpcyBkZWJ1ZyBpcyBvbmx5IHRvIGRldGVjdCBsb2dpY2FsIGVycm9ycyEKKyMgZGVmaW5lIFBTRUNVUklUWShmbXQsIGFyZ3MuLi4pIFwKKwlwcmludGsoS0VSTl9DUklUIk1FX0RSViBTRUNVUklUWTogPCVzOiVzOiVpPiAiIGZtdCwgX19GSUxFX18sIF9fZnVuY19fLCBfX0xJTkVfXywgIyNhcmdzKQorLy9UaGlzIGRlYnVnIGlzIHRvIGtlZXAgdHJhY2sgaW4gY3VzdG9tZXJzJyBzeXN0ZW0KKyMgZGVmaW5lIFBMT0coZm10LCBhcmdzLi4uKSBcCisJcHJpbnRrKEtFUk5fSU5GTyJNRV9EUlY6ICIgZm10LCAjI2FyZ3MpCisKKy8vVGhpcyBkZWJ1ZyBpcyB0byBjaGVjayBuZXcgcGFydHMgZHVyaW5nIGRldmVsb3BtZW50CisjaWZkZWYgTUVERUJVR19ERVZFTE9QCisjIGRlZmluZSBQREVWRUxPUChmbXQsIGFyZ3MuLi4pIFwKKwlwcmludGsoS0VSTl9DUklUIk1FX0RSVjogPCVzOiVzOiVpPiAiIGZtdCwgX19GSUxFX18sIF9fZnVuY19fLCBfX0xJTkVfXywgIyNhcmdzKQorI2Vsc2UKKyMgZGVmaW5lIFBERVZFTE9QKGZtdCwgYXJncy4uLikKKyNlbmRpZgorCisjZW5kaWYgLy9fX0tFUk5FTF9fCisjZW5kaWYgLy9fTUVERUJVR19IXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lZGVmaW5lcy5oIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lZGVmaW5lcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxNThlZjUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWVkZWZpbmVzLmgKQEAgLTAsMCArMSw0NDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFNvdXJjZSBGaWxlIDogbWVkZWZpbmVzLmgKKyAqIEF1dGhvciAgICAgIDogR0cgKEd1ZW50ZXIgR2ViaGFyZHQpICA8Zy5nZWJoYXJkdEBtZWlsaGF1cy5kZT4KKyAqIEF1dGhvciAgICAgIDogS0cgKEtyenlzenRvZiBHYW50emtlKSAgPGsuZ2FudHprZUBtZWlsaGF1cy5kZT4KKyAqLworCisjaWZuZGVmIF9NRURFRklORVNfSF8KKyNkZWZpbmUgX01FREVGSU5FU19IXworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBHZW5lcmFsCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjZGVmaW5lIE1FX1ZBTFVFX05PVF9VU0VECQkJCQkJCTB4MAorI2RlZmluZSBNRV9WQUxVRV9JTlZBTElECQkJCQkJCX4weDAKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRGVmaW5lcyBjb21tb24gdG8gYWNjZXNzIGZ1bmN0aW9ucworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2RlZmluZSBNRV9MT0NLX1JFTEVBU0UJCQkJCQkJCTB4MDAwMTAwMDEKKyNkZWZpbmUgTUVfTE9DS19TRVQJCQkJCQkJCQkweDAwMDEwMDAyCisjZGVmaW5lIE1FX0xPQ0tfQ0hFQ0sJCQkJCQkJCTB4MDAwMTAwMDMKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRGVmaW5lcyBtZU9wZW4gZnVuY3Rpb24KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNkZWZpbmUgTUVfT1BFTl9OT19GTEFHUwkJCQkJCQkweDAKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRGVmaW5lcyBtZUNsb3NlIGZ1bmN0aW9uCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjZGVmaW5lIE1FX0NMT1NFX05PX0ZMQUdTCQkJCQkJCTB4MAorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBEZWZpbmVzIG1lTG9ja0RyaXZlciBmdW5jdGlvbgorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2RlZmluZSBNRV9MT0NLX0RSSVZFUl9OT19GTEFHUwkJCQkJCTB4MAorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBEZWZpbmVzIG1lTG9ja0RldmljZSBmdW5jdGlvbgorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2RlZmluZSBNRV9MT0NLX0RFVklDRV9OT19GTEFHUwkJCQkJCTB4MAorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBEZWZpbmVzIG1lTG9ja1N1YmRldmljZSBmdW5jdGlvbgorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2RlZmluZSBNRV9MT0NLX1NVQkRFVklDRV9OT19GTEFHUwkJCQkJMHgwCisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRGVmaW5lcyBjb21tb24gdG8gZXJyb3IgZnVuY3Rpb25zCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjZGVmaW5lIE1FX0VSUk9SX01TR19NQVhfQ09VTlQJCQkJCQkyNTYKKworI2RlZmluZSBNRV9TV0lUQ0hfRElTQUJMRQkJCQkJCQkweDAwMDIwMDAxCisjZGVmaW5lIE1FX1NXSVRDSF9FTkFCTEUJCQkJCQkJMHgwMDAyMDAwMgorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBEZWZpbmVzIGNvbW1vbiB0byBpbyBmdW5jdGlvbnMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNkZWZpbmUgTUVfUkVGX0RJT19GSUZPX0xPVwkJCQkJCQkweDAwMDMwMDAxCisjZGVmaW5lIE1FX1JFRl9ESU9fRklGT19ISUdICQkJCQkJMHgwMDAzMDAwMgorCisjZGVmaW5lIE1FX1JFRl9DVFJfUFJFVklPVVMJCQkJCQkJMHgwMDA0MDAwMQorI2RlZmluZSBNRV9SRUZfQ1RSX0lOVEVSTkFMXzFNSFoJCQkJCTB4MDAwNDAwMDIKKyNkZWZpbmUgTUVfUkVGX0NUUl9JTlRFUk5BTF8xME1IWgkJCQkJMHgwMDA0MDAwMworI2RlZmluZSBNRV9SRUZfQ1RSX0VYVEVSTkFMCQkJCQkJCTB4MDAwNDAwMDQKKworI2RlZmluZSBNRV9SRUZfQUlfR1JPVU5ECQkJCQkJCTB4MDAwNTAwMDEKKyNkZWZpbmUgTUVfUkVGX0FJX0RJRkZFUkVOVElBTAkJCQkJCTB4MDAwNTAwMDIKKworI2RlZmluZSBNRV9SRUZfQU9fR1JPVU5ECQkJCQkJCTB4MDAwNjAwMDEKKworI2RlZmluZSBNRV9UUklHX0NIQU5fREVGQVVMVAkJCQkJCTB4MDAwNzAwMDEKKyNkZWZpbmUgTUVfVFJJR19DSEFOX1NZTkNIUk9OT1VTCQkJCQkweDAwMDcwMDAyCisKKyNkZWZpbmUgTUVfVFJJR19UWVBFX05PTkUJCQkJCQkJMHgwMDAwMDAwMAorI2RlZmluZSBNRV9UUklHX1RZUEVfU1cJCQkJCQkJCTB4MDAwODAwMDEKKyNkZWZpbmUgTUVfVFJJR19UWVBFX1RIUkVTSE9MRAkJCQkJCTB4MDAwODAwMDIKKyNkZWZpbmUgTUVfVFJJR19UWVBFX1dJTkRPVwkJCQkJCQkweDAwMDgwMDAzCisjZGVmaW5lIE1FX1RSSUdfVFlQRV9FREdFCQkJCQkJCTB4MDAwODAwMDQKKyNkZWZpbmUgTUVfVFJJR19UWVBFX1NMT1BFCQkJCQkJCTB4MDAwODAwMDUKKyNkZWZpbmUgTUVfVFJJR19UWVBFX0VYVF9ESUdJVEFMCQkJCQkweDAwMDgwMDA2CisjZGVmaW5lIE1FX1RSSUdfVFlQRV9FWFRfQU5BTE9HCQkJCQkJMHgwMDA4MDAwNworI2RlZmluZSBNRV9UUklHX1RZUEVfUEFUVEVSTgkJCQkJCTB4MDAwODAwMDgKKyNkZWZpbmUgTUVfVFJJR19UWVBFX1RJTUVSCQkJCQkJCTB4MDAwODAwMDkKKyNkZWZpbmUgTUVfVFJJR19UWVBFX0NPVU5UCQkJCQkJCTB4MDAwODAwMEEKKyNkZWZpbmUgTUVfVFJJR19UWVBFX0ZPTExPVwkJCQkJCQkweDAwMDgwMDBCCisKKyNkZWZpbmUgTUVfVFJJR19FREdFX05PTkUJCQkJCQkJMHgwMDAwMDAwMAorI2RlZmluZSBNRV9UUklHX0VER0VfQUJPVkUJCQkJCQkJMHgwMDA5MDAwMQorI2RlZmluZSBNRV9UUklHX0VER0VfQkVMT1cJCQkJCQkJMHgwMDA5MDAwMgorI2RlZmluZSBNRV9UUklHX0VER0VfRU5UUlkJCQkJCQkJMHgwMDA5MDAwMworI2RlZmluZSBNRV9UUklHX0VER0VfRVhJVAkJCQkJCQkweDAwMDkwMDA0CisjZGVmaW5lIE1FX1RSSUdfRURHRV9SSVNJTkcJCQkJCQkJMHgwMDA5MDAwNQorI2RlZmluZSBNRV9UUklHX0VER0VfRkFMTElORwkJCQkJCTB4MDAwOTAwMDYKKyNkZWZpbmUgTUVfVFJJR19FREdFX0FOWQkJCQkJCQkweDAwMDkwMDA3CisKKyNkZWZpbmUgTUVfVElNRVJfQUNRX1NUQVJUCQkJCQkJCTB4MDAwQTAwMDEKKyNkZWZpbmUgTUVfVElNRVJfU0NBTl9TVEFSVAkJCQkJCQkweDAwMEEwMDAyCisjZGVmaW5lIE1FX1RJTUVSX0NPTlZfU1RBUlQJCQkJCQkJMHgwMDBBMDAwMworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBEZWZpbmVzIGZvciBtZUlPRnJlcXVlbmN5VG9UaWNrcyBmdW5jdGlvbgorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2RlZmluZSBNRV9JT19GUkVRVUVOQ1lfVE9fVElDS1NfTk9fRkxBR1MJCQkweDAKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRGVmaW5lcyBmb3IgbWVJT0lycVN0YXJ0IGZ1bmN0aW9uCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjZGVmaW5lIE1FX0lSUV9TT1VSQ0VfRElPX1BBVFRFUk4JCQkJCTB4MDAwQjAwMDEKKyNkZWZpbmUgTUVfSVJRX1NPVVJDRV9ESU9fTUFTSwkJCQkJCTB4MDAwQjAwMDIKKyNkZWZpbmUgTUVfSVJRX1NPVVJDRV9ESU9fTElORQkJCQkJCTB4MDAwQjAwMDMKKyNkZWZpbmUgTUVfSVJRX1NPVVJDRV9ESU9fT1ZFUl9URU1QCQkJCQkweDAwMEIwMDA0CisKKyNkZWZpbmUgTUVfSVJRX0VER0VfTk9UX1VTRUQJCQkJCQkweDAwMDAwMDAwCisjZGVmaW5lIE1FX0lSUV9FREdFX1JJU0lORwkJCQkJCQkweDAwMEMwMDAxCisjZGVmaW5lIE1FX0lSUV9FREdFX0ZBTExJTkcJCQkJCQkJMHgwMDBDMDAwMgorI2RlZmluZSBNRV9JUlFfRURHRV9BTlkJCQkJCQkJCTB4MDAwQzAwMDMKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRGVmaW5lcyBmb3IgbWVJT0lycVN0YXJ0IGZ1bmN0aW9uCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjZGVmaW5lIE1FX0lPX0lSUV9TVEFSVF9OT19GTEFHUwkJCQkJMHgwMDAwMDAKKyNkZWZpbmUgTUVfSU9fSVJRX1NUQVJUX0RJT19CSVQJCQkJCQkweDAwMDAwMQorI2RlZmluZSBNRV9JT19JUlFfU1RBUlRfRElPX0JZVEUJCQkJCTB4MDAwMDAyCisjZGVmaW5lIE1FX0lPX0lSUV9TVEFSVF9ESU9fV09SRAkJCQkJMHgwMDAwMDQKKyNkZWZpbmUgTUVfSU9fSVJRX1NUQVJUX0RJT19EV09SRAkJCQkJMHgwMDAwMDgKKyNkZWZpbmUgTUVfSU9fSVJRX1NUQVJUX1BBVFRFUk5fRklMVEVSSU5HCQkJMHgwMDAwMTAKKyNkZWZpbmUgTUVfSU9fSVJRX1NUQVJUX0VYVEVOREVEX1NUQVRVUwkJCQkweDAwMDAyMAorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBEZWZpbmVzIGZvciBtZUlPSXJxV2FpdCBmdW5jdGlvbgorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2RlZmluZSBNRV9JT19JUlFfV0FJVF9OT19GTEFHUwkJCQkJCTB4MDAwMDAwCisjZGVmaW5lIE1FX0lPX0lSUV9XQUlUX05PUk1BTF9TVEFUVVMJCQkJMHgwMDAwMDEKKyNkZWZpbmUgTUVfSU9fSVJRX1dBSVRfRVhURU5ERURfU1RBVFVTCQkJCTB4MDAwMDAyCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIERlZmluZXMgZm9yIG1lSU9JcnFTdG9wIGZ1bmN0aW9uCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjZGVmaW5lIE1FX0lPX0lSUV9TVE9QX05PX0ZMQUdTCQkJCQkJMHgwMDAwMDAKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRGVmaW5lcyBmb3IgbWVJT0lycVNldENhbGxiYWNrIGZ1bmN0aW9uCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjZGVmaW5lIE1FX0lPX0lSUV9TRVRfQ0FMTEJBQ0tfTk9fRkxBR1MJCQkJMHgwCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIERlZmluZXMgZm9yIG1lSU9SZXNldERldmljZSBmdW5jdGlvbgorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2RlZmluZSBNRV9JT19SRVNFVF9ERVZJQ0VfTk9fRkxBR1MJCQkJCTB4MAorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBEZWZpbmVzIGZvciBtZUlPUmVzZXRTdWJkZXZpY2UgZnVuY3Rpb24KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNkZWZpbmUgTUVfSU9fUkVTRVRfU1VCREVWSUNFX05PX0ZMQUdTCQkJCTB4MAorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBEZWZpbmVzIGZvciBtZUlPU2luZ2xlQ29uZmlnIGZ1bmN0aW9uCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjZGVmaW5lIE1FX1NJTkdMRV9DT05GSUdfRElPX0lOUFVUCQkJCQkweDAwMEQwMDAxCisjZGVmaW5lIE1FX1NJTkdMRV9DT05GSUdfRElPX09VVFBVVAkJCQkJMHgwMDBEMDAwMgorI2RlZmluZSBNRV9TSU5HTEVfQ09ORklHX0RJT19ISUdIX0lNUEVEQU5DRQkJCTB4MDAwRDAwMDMKKyNkZWZpbmUgTUVfU0lOR0xFX0NPTkZJR19ESU9fU0lOSwkJCQkJMHgwMDBEMDAwNAorI2RlZmluZSBNRV9TSU5HTEVfQ09ORklHX0RJT19TT1VSQ0UJCQkJCTB4MDAwRDAwMDUKKyNkZWZpbmUgTUVfU0lOR0xFX0NPTkZJR19ESU9fTVVYMzJNCQkJCQkweDAwMEQwMDA2CisjZGVmaW5lIE1FX1NJTkdMRV9DT05GSUdfRElPX0RFTVVYMzIJCQkJMHgwMDBEMDAwNworI2RlZmluZSBNRV9TSU5HTEVfQ09ORklHX0RJT19CSVRfUEFUVEVSTgkJCTB4MDAwRDAwMDgKKworI2RlZmluZSBNRV9TSU5HTEVfQ09ORklHX0NUUl84MjU0X01PREVfMAkJCTB4MDAwRTAwMDEKKyNkZWZpbmUgTUVfU0lOR0xFX0NPTkZJR19DVFJfODI1NF9NT0RFXzEJCQkweDAwMEUwMDAyCisjZGVmaW5lIE1FX1NJTkdMRV9DT05GSUdfQ1RSXzgyNTRfTU9ERV8yCQkJMHgwMDBFMDAwMworI2RlZmluZSBNRV9TSU5HTEVfQ09ORklHX0NUUl84MjU0X01PREVfMwkJCTB4MDAwRTAwMDQKKyNkZWZpbmUgTUVfU0lOR0xFX0NPTkZJR19DVFJfODI1NF9NT0RFXzQJCQkweDAwMEUwMDA1CisjZGVmaW5lIE1FX1NJTkdMRV9DT05GSUdfQ1RSXzgyNTRfTU9ERV81CQkJMHgwMDBFMDAwNgorCisjZGVmaW5lIE1FX0lPX1NJTkdMRV9DT05GSUdfTk9fRkxBR1MJCQkJMHgwMAorI2RlZmluZSBNRV9JT19TSU5HTEVfQ09ORklHX0RJT19CSVQJCQkJCTB4MDEKKyNkZWZpbmUgTUVfSU9fU0lOR0xFX0NPTkZJR19ESU9fQllURQkJCQkweDAyCisjZGVmaW5lIE1FX0lPX1NJTkdMRV9DT05GSUdfRElPX1dPUkQJCQkJMHgwNAorI2RlZmluZSBNRV9JT19TSU5HTEVfQ09ORklHX0RJT19EV09SRAkJCQkweDA4CisjZGVmaW5lIE1FX0lPX1NJTkdMRV9DT05GSUdfTVVMVElTSUdfTEVEX09OCQkJMHgxMAorI2RlZmluZSBNRV9JT19TSU5HTEVfQ09ORklHX01VTFRJU0lHX0xFRF9PRkYJCTB4MjAKKyNkZWZpbmUgTUVfSU9fU0lOR0xFX0NPTkZJR19BSV9STVMJCQkJCTB4NDAKKyNkZWZpbmUgTUVfSU9fU0lOR0xFX0NPTkZJR19DT05USU5VRQkJCQkweDgwCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIERlZmluZXMgZm9yIG1lSU9TaW5nbGUgZnVuY3Rpb24KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNkZWZpbmUgTUVfSU9fU0lOR0xFX05PX0ZMQUdTCQkJCQkJMHgwCisjZGVmaW5lIE1FX0lPX1NJTkdMRV9OT05CTE9DS0lORwkJCQkJMHgyMAorCisjZGVmaW5lIE1FX0RJUl9JTlBVVAkJCQkJCQkJMHgwMDBGMDAwMQorI2RlZmluZSBNRV9ESVJfT1VUUFVUCQkJCQkJCQkweDAwMEYwMDAyCisKKyNkZWZpbmUgTUVfSU9fU0lOR0xFX1RZUEVfTk9fRkxBR1MJCQkJCTB4MDAKKyNkZWZpbmUgTUVfSU9fU0lOR0xFX1RZUEVfRElPX0JJVAkJCQkJMHgwMQorI2RlZmluZSBNRV9JT19TSU5HTEVfVFlQRV9ESU9fQllURQkJCQkJMHgwMgorI2RlZmluZSBNRV9JT19TSU5HTEVfVFlQRV9ESU9fV09SRAkJCQkJMHgwNAorI2RlZmluZSBNRV9JT19TSU5HTEVfVFlQRV9ESU9fRFdPUkQJCQkJCTB4MDgKKyNkZWZpbmUgTUVfSU9fU0lOR0xFX1RZUEVfVFJJR19TWU5DSFJPTk9VUwkJCTB4MTAKKyNkZWZpbmUgTUVfSU9fU0lOR0xFX1RZUEVfV1JJVEVfTk9OQkxPQ0tJTkcJCQkweDIwCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIERlZmluZXMgZm9yIG1lSU9TdHJlYW1Db25maWcgZnVuY3Rpb24KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNkZWZpbmUgTUVfSU9fU1RSRUFNX0NPTkZJR19OT19GTEFHUwkJCQkweDAKKyNkZWZpbmUgTUVfSU9fU1RSRUFNX0NPTkZJR19CSVRfUEFUVEVSTgkJCQkweDEKKyNkZWZpbmUgTUVfSU9fU1RSRUFNX0NPTkZJR19XUkFQQVJPVU5ECQkJCTB4MgorI2RlZmluZSBNRV9JT19TVFJFQU1fQ09ORklHX1NBTVBMRV9BTkRfSE9MRAkJCTB4NAorI2RlZmluZSBNRV9JT19TVFJFQU1fQ09ORklHX0hBUkRXQVJFX09OTFkJCQkweDgKKworI2RlZmluZSBNRV9JT19TVFJFQU1fQ09ORklHX1RZUEVfTk9fRkxBR1MJCQkweDAKKworI2RlZmluZSBNRV9JT19TVFJFQU1fVFJJR0dFUl9UWVBFX05PX0ZMQUdTCQkJMHgwCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIERlZmluZXMgZm9yIG1lSU9TdHJlYW1SZWFkIGZ1bmN0aW9uCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjZGVmaW5lIE1FX1JFQURfTU9ERV9CTE9DS0lORwkJCQkJCTB4MDAxMDAwMDEKKyNkZWZpbmUgTUVfUkVBRF9NT0RFX05PTkJMT0NLSU5HCQkJCQkweDAwMTAwMDAyCisKKyNkZWZpbmUgTUVfSU9fU1RSRUFNX1JFQURfTk9fRkxBR1MJCQkJCTB4MAorI2RlZmluZSBNRV9JT19TVFJFQU1fUkVBRF9GUkFNRVMJCQkJCTB4MQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBEZWZpbmVzIGZvciBtZUlPU3RyZWFtV3JpdGUgZnVuY3Rpb24KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNkZWZpbmUgTUVfV1JJVEVfTU9ERV9CTE9DS0lORwkJCQkJCTB4MDAxMTAwMDEKKyNkZWZpbmUgTUVfV1JJVEVfTU9ERV9OT05CTE9DS0lORwkJCQkJMHgwMDExMDAwMgorI2RlZmluZSBNRV9XUklURV9NT0RFX1BSRUxPQUQJCQkJCQkweDAwMTEwMDAzCisKKyNkZWZpbmUgTUVfSU9fU1RSRUFNX1dSSVRFX05PX0ZMQUdTCQkJCQkweDAwMDAwMDAwCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIERlZmluZXMgZm9yIG1lSU9TdHJlYW1TdGFydCBmdW5jdGlvbgorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2RlZmluZSBNRV9JT19TVFJFQU1fU1RBUlRfTk9fRkxBR1MJCQkJCTB4MDAwMDAwMDAKKworI2RlZmluZSBNRV9TVEFSVF9NT0RFX0JMT0NLSU5HCQkJCQkJMHgwMDEyMDAwMQorI2RlZmluZSBNRV9TVEFSVF9NT0RFX05PTkJMT0NLSU5HCQkJCQkweDAwMTIwMDAyCisKKyNkZWZpbmUgTUVfSU9fU1RSRUFNX1NUQVJUX1RZUEVfTk9fRkxBR1MJCQkweDAKKyNkZWZpbmUgTUVfSU9fU1RSRUFNX1NUQVJUX1RZUEVfVFJJR19TWU5DSFJPTk9VUwkweDEKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRGVmaW5lcyBmb3IgbWVJT1N0cmVhbVN0b3AgZnVuY3Rpb24KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNkZWZpbmUgTUVfSU9fU1RSRUFNX1NUT1BfTk9fRkxBR1MJCQkJCTB4MDAwMDAwMDAKKyNkZWZpbmUgTUVfSU9fU1RSRUFNX1NUT1BfUFJFU0VSVkVfQlVGRkVSUwkJCTB4MDAwMDAwMDEKKworI2RlZmluZSBNRV9TVE9QX01PREVfSU1NRURJQVRFCQkJCQkJMHgwMDEzMDAwMQorI2RlZmluZSBNRV9TVE9QX01PREVfTEFTVF9WQUxVRQkJCQkJCTB4MDAxMzAwMDIKKworI2RlZmluZSBNRV9JT19TVFJFQU1fU1RPUF9UWVBFX05PX0ZMQUdTCQkJCTB4MDAwMDAwMDAKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRGVmaW5lcyBmb3IgbWVJT1N0cmVhbVN0YXR1cyBmdW5jdGlvbgorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2RlZmluZSBNRV9XQUlUX05PTkUJCQkJCQkJCTB4MDAxNDAwMDEKKyNkZWZpbmUgTUVfV0FJVF9JRExFCQkJCQkJCQkweDAwMTQwMDAyCisKKyNkZWZpbmUgTUVfU1RBVFVTX0lOVkFMSUQJCQkJCQkJMHgwMDAwMDAwMAorI2RlZmluZSBNRV9TVEFUVVNfSURMRQkJCQkJCQkJMHgwMDE1MDAwMQorI2RlZmluZSBNRV9TVEFUVVNfQlVTWQkJCQkJCQkJMHgwMDE1MDAwMgorI2RlZmluZSBNRV9TVEFUVVNfRVJST1IJCQkJCQkJCTB4MDAxNTAwMDMKKworI2RlZmluZSBNRV9JT19TVFJFQU1fU1RBVFVTX05PX0ZMQUdTCQkJCTB4MDAwMDAwMDAKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRGVmaW5lcyBmb3IgbWVJT1N0cmVhbVNldENhbGxiYWNrcyBmdW5jdGlvbgorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2RlZmluZSBNRV9JT19TVFJFQU1fU0VUX0NBTExCQUNLU19OT19GTEFHUwkJCTB4MDAwMDAwMDAKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRGVmaW5lcyBmb3IgbWVJT1N0cmVhbU5ld1ZhbHVlcyBmdW5jdGlvbgorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2RlZmluZSBNRV9JT19TVFJFQU1fTkVXX1ZBTFVFU19OT19GTEFHUwkJCTB4MDAwMDAwMDAKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRGVmaW5lcyBmb3IgbWVJT1RpbWVUb1RpY2tzIGZ1bmN0aW9uCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjZGVmaW5lIE1FX0lPX1NUUkVBTV9USU1FX1RPX1RJQ0tTX05PX0ZMQUdTCQkJMHgwMDAwMDAwMAorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBEZWZpbmVzIGZvciBtb2R1bGUgdHlwZXMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNkZWZpbmUgTUVfTU9EVUxFX1RZUEVfTVVMVElTSUdfTk9ORQkJCQkweDAwMDAwMDAwCisjZGVmaW5lIE1FX01PRFVMRV9UWVBFX01VTFRJU0lHX0RJRkYxNl8xMFYJCQkweDAwMTYwMDAxCisjZGVmaW5lIE1FX01PRFVMRV9UWVBFX01VTFRJU0lHX0RJRkYxNl8yMFYJCQkweDAwMTYwMDAyCisjZGVmaW5lIE1FX01PRFVMRV9UWVBFX01VTFRJU0lHX0RJRkYxNl81MFYJCQkweDAwMTYwMDAzCisjZGVmaW5lIE1FX01PRFVMRV9UWVBFX01VTFRJU0lHX0NVUlJFTlQxNl8wXzIwTUEJMHgwMDE2MDAwNAorI2RlZmluZSBNRV9NT0RVTEVfVFlQRV9NVUxUSVNJR19SVEQ4X1BUMTAwCQkJMHgwMDE2MDAwNQorI2RlZmluZSBNRV9NT0RVTEVfVFlQRV9NVUxUSVNJR19SVEQ4X1BUNTAwCQkJMHgwMDE2MDAwNgorI2RlZmluZSBNRV9NT0RVTEVfVFlQRV9NVUxUSVNJR19SVEQ4X1BUMTAwMAkJCTB4MDAxNjAwMDcKKyNkZWZpbmUgTUVfTU9EVUxFX1RZUEVfTVVMVElTSUdfVEU4X1RZUEVfQgkJCTB4MDAxNjAwMDgKKyNkZWZpbmUgTUVfTU9EVUxFX1RZUEVfTVVMVElTSUdfVEU4X1RZUEVfRQkJCTB4MDAxNjAwMDkKKyNkZWZpbmUgTUVfTU9EVUxFX1RZUEVfTVVMVElTSUdfVEU4X1RZUEVfSgkJCTB4MDAxNjAwMEEKKyNkZWZpbmUgTUVfTU9EVUxFX1RZUEVfTVVMVElTSUdfVEU4X1RZUEVfSwkJCTB4MDAxNjAwMEIKKyNkZWZpbmUgTUVfTU9EVUxFX1RZUEVfTVVMVElTSUdfVEU4X1RZUEVfTgkJCTB4MDAxNjAwMEMKKyNkZWZpbmUgTUVfTU9EVUxFX1RZUEVfTVVMVElTSUdfVEU4X1RZUEVfUgkJCTB4MDAxNjAwMEQKKyNkZWZpbmUgTUVfTU9EVUxFX1RZUEVfTVVMVElTSUdfVEU4X1RZUEVfUwkJCTB4MDAxNjAwMEUKKyNkZWZpbmUgTUVfTU9EVUxFX1RZUEVfTVVMVElTSUdfVEU4X1RZUEVfVAkJCTB4MDAxNjAwMEYKKyNkZWZpbmUgTUVfTU9EVUxFX1RZUEVfTVVMVElTSUdfVEU4X1RFTVBfU0VOU09SCQkweDAwMTYwMDEwCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIERlZmluZXMgZm9yIG1lUXVlcnlTdWJkZXZpY2VDYXBzIGZ1bmN0aW9uCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjZGVmaW5lIE1FX0NBUFNfTk9ORQkJCQkJCQkJMHgwMDAwMDAwMAorCisjZGVmaW5lIE1FX0NBUFNfRElPX0RJUl9CSVQJCQkJCQkJMHgwMDAwMDAwMQorI2RlZmluZSBNRV9DQVBTX0RJT19ESVJfQllURQkJCQkJCTB4MDAwMDAwMDIKKyNkZWZpbmUgTUVfQ0FQU19ESU9fRElSX1dPUkQJCQkJCQkweDAwMDAwMDA0CisjZGVmaW5lIE1FX0NBUFNfRElPX0RJUl9EV09SRAkJCQkJCTB4MDAwMDAwMDgKKyNkZWZpbmUgTUVfQ0FQU19ESU9fU0lOS19TT1VSQ0UJCQkJCQkweDAwMDAwMDEwCisjZGVmaW5lIE1FX0NBUFNfRElPX0JJVF9QQVRURVJOX0lSUQkJCQkJMHgwMDAwMDAyMAorI2RlZmluZSBNRV9DQVBTX0RJT19CSVRfTUFTS19JUlFfRURHRV9SSVNJTkcJCTB4MDAwMDAwNDAKKyNkZWZpbmUgTUVfQ0FQU19ESU9fQklUX01BU0tfSVJRX0VER0VfRkFMTElORwkJMHgwMDAwMDA4MAorI2RlZmluZSBNRV9DQVBTX0RJT19CSVRfTUFTS19JUlFfRURHRV9BTlkJCQkweDAwMDAwMTAwCisjZGVmaW5lIE1FX0NBUFNfRElPX09WRVJfVEVNUF9JUlEJCQkJCTB4MDAwMDAyMDAKKworI2RlZmluZSBNRV9DQVBTX0NUUl9DTEtfUFJFVklPVVMJCQkJCTB4MDAwMDAwMDEKKyNkZWZpbmUgTUVfQ0FQU19DVFJfQ0xLX0lOVEVSTkFMXzFNSFoJCQkJMHgwMDAwMDAwMgorI2RlZmluZSBNRV9DQVBTX0NUUl9DTEtfSU5URVJOQUxfMTBNSFoJCQkJMHgwMDAwMDAwNAorI2RlZmluZSBNRV9DQVBTX0NUUl9DTEtfRVhURVJOQUwJCQkJCTB4MDAwMDAwMDgKKworI2RlZmluZSBNRV9DQVBTX0FJX1RSSUdfU1lOQ0hST05PVVMJCQkJCTB4MDAwMDAwMDEKKy8vLyBAbm90ZSBCYWNrd2FyZCBjb21wYXRpYmlsaXR5IGZvciBtZTE2MDAgaW4gb2xkIHN0eWxlLgorI2RlZmluZSBNRV9DQVBTX0FJX1RSSUdfU0lNVUxUQU5FT1VTCQkJCU1FX0NBUFNfQUlfVFJJR19TWU5DSFJPTk9VUworI2RlZmluZSBNRV9DQVBTX0FJX0ZJRk8JCQkJCQkJCTB4MDAwMDAwMDIKKyNkZWZpbmUgTUVfQ0FQU19BSV9GSUZPX1RIUkVTSE9MRAkJCQkJMHgwMDAwMDAwNAorCisjZGVmaW5lIE1FX0NBUFNfQU9fVFJJR19TWU5DSFJPTk9VUwkJCQkJMHgwMDAwMDAwMQorLy8vIEBub3RlIEJhY2t3YXJkIGNvbXBhdGliaWxpdHkgZm9yIG1lMTYwMCBpbiBvbGQgc3R5bGUuCisjZGVmaW5lIE1FX0NBUFNfQU9fVFJJR19TSU1VTFRBTkVPVVMJCQkJTUVfQ0FQU19BT19UUklHX1NZTkNIUk9OT1VTCisjZGVmaW5lIE1FX0NBUFNfQU9fRklGTwkJCQkJCQkJMHgwMDAwMDAwMgorI2RlZmluZSBNRV9DQVBTX0FPX0ZJRk9fVEhSRVNIT0xECQkJCQkweDAwMDAwMDA0CisKKyNkZWZpbmUgTUVfQ0FQU19FWFRfSVJRX0VER0VfUklTSU5HCQkJCQkweDAwMDAwMDAxCisjZGVmaW5lIE1FX0NBUFNfRVhUX0lSUV9FREdFX0ZBTExJTkcJCQkJMHgwMDAwMDAwMgorI2RlZmluZSBNRV9DQVBTX0VYVF9JUlFfRURHRV9BTlkJCQkJCTB4MDAwMDAwMDQKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRGVmaW5lcyBmb3IgbWVRdWVyeVN1YmRldmljZUNhcHNBcmdzIGZ1bmN0aW9uCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjZGVmaW5lIE1FX0NBUF9BSV9GSUZPX1NJWkUJCQkJCQkJMHgwMDFEMDAwMAorI2RlZmluZSBNRV9DQVBfQUlfQlVGRkVSX1NJWkUJCQkJCQkweDAwMUQwMDAxCisKKyNkZWZpbmUgTUVfQ0FQX0FPX0ZJRk9fU0laRQkJCQkJCQkweDAwMUYwMDAwCisjZGVmaW5lIE1FX0NBUF9BT19CVUZGRVJfU0laRQkJCQkJCTB4MDAxRjAwMDEKKworI2RlZmluZSBNRV9DQVBfQ1RSX1dJRFRICQkJCQkJCTB4MDAyMDAwMDAKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRGVmaW5lcyBjb21tb24gdG8gcXVlcnkgZnVuY3Rpb25zCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjZGVmaW5lIE1FX1VOSVRfSU5WQUxJRAkJCQkJCQkJMHgwMDAwMDAwMAorI2RlZmluZSBNRV9VTklUX1ZPTFQJCQkJCQkJCTB4MDAxNzAwMDEKKyNkZWZpbmUgTUVfVU5JVF9BTVBFUkUJCQkJCQkJCTB4MDAxNzAwMDIKKyNkZWZpbmUgTUVfVU5JVF9BTlkJCQkJCQkJCQkweDAwMTcwMDAzCisKKyNkZWZpbmUgTUVfVFlQRV9JTlZBTElECQkJCQkJCQkweDAwMDAwMDAwCisjZGVmaW5lIE1FX1RZUEVfQU8JCQkJCQkJCQkweDAwMTgwMDAxCisjZGVmaW5lIE1FX1RZUEVfQUkJCQkJCQkJCQkweDAwMTgwMDAyCisjZGVmaW5lIE1FX1RZUEVfRElPCQkJCQkJCQkJMHgwMDE4MDAwMworI2RlZmluZSBNRV9UWVBFX0RPCQkJCQkJCQkJMHgwMDE4MDAwNAorI2RlZmluZSBNRV9UWVBFX0RJCQkJCQkJCQkJMHgwMDE4MDAwNQorI2RlZmluZSBNRV9UWVBFX0NUUgkJCQkJCQkJCTB4MDAxODAwMDYKKyNkZWZpbmUgTUVfVFlQRV9FWFRfSVJRCQkJCQkJCQkweDAwMTgwMDA3CisKKyNkZWZpbmUgTUVfU1VCVFlQRV9JTlZBTElECQkJCQkJCTB4MDAwMDAwMDAKKyNkZWZpbmUgTUVfU1VCVFlQRV9TSU5HTEUJCQkJCQkJMHgwMDE5MDAwMQorI2RlZmluZSBNRV9TVUJUWVBFX1NUUkVBTUlORwkJCQkJCTB4MDAxOTAwMDIKKyNkZWZpbmUgTUVfU1VCVFlQRV9DVFJfODI1NAkJCQkJCQkweDAwMTkwMDAzCisjZGVmaW5lIE1FX1NVQlRZUEVfQU5ZCQkJCQkJCQkweDAwMTkwMDA0CisKKyNkZWZpbmUgTUVfREVWSUNFX0RSSVZFUl9OQU1FX01BWF9DT1VOVAkJCQk2NAorI2RlZmluZSBNRV9ERVZJQ0VfTkFNRV9NQVhfQ09VTlQJCQkJCTY0CisKKyNkZWZpbmUgTUVfREVWSUNFX0RFU0NSSVBUSU9OX01BWF9DT1VOVAkJCQkyNTYKKworI2RlZmluZSBNRV9CVVNfVFlQRV9JTlZBTElECQkJCQkJCTB4MDAwMDAwMDAKKyNkZWZpbmUgTUVfQlVTX1RZUEVfUENJCQkJCQkJCQkweDAwMUEwMDAxCisjZGVmaW5lIE1FX0JVU19UWVBFX1VTQgkJCQkJCQkJMHgwMDFBMDAwMgorCisjZGVmaW5lIE1FX1BMVUdHRURfSU5WQUxJRAkJCQkJCQkweDAwMDAwMDAwCisjZGVmaW5lIE1FX1BMVUdHRURfSU4JCQkJCQkJCTB4MDAxQjAwMDEKKyNkZWZpbmUgTUVfUExVR0dFRF9PVVQJCQkJCQkJCTB4MDAxQjAwMDIKKworI2RlZmluZSBNRV9FWFRFTlNJT05fVFlQRV9JTlZBTElECQkJCQkweDAwMDAwMDAwCisjZGVmaW5lIE1FX0VYVEVOU0lPTl9UWVBFX05PTkUJCQkJCQkweDAwMUMwMDAxCisjZGVmaW5lIE1FX0VYVEVOU0lPTl9UWVBFX01VWDMyTQkJCQkJMHgwMDFDMDAwMgorI2RlZmluZSBNRV9FWFRFTlNJT05fVFlQRV9ERU1VWDMyCQkJCQkweDAwMUMwMDAzCisjZGVmaW5lIE1FX0VYVEVOU0lPTl9UWVBFX01VWDMyUwkJCQkJMHgwMDFDMDAwNAorCisjZGVmaW5lIE1FX0FDQ0VTU19UWVBFX0lOVkFMSUQJCQkJCQkweDAwMDAwMDAwCisjZGVmaW5lIE1FX0FDQ0VTU19UWVBFX0xPQ0FMCQkJCQkJMHgwMDFEMDAwMQorI2RlZmluZSBNRV9BQ0NFU1NfVFlQRV9SRU1PVEUJCQkJCQkweDAwMUQwMDAyCisKKy8vLyBAbm90ZSBBZGQgYnkgS0cKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRGVmaW5lcyBmb3IgbWVVdGlsaXR5UFdNCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworI2RlZmluZSBNRV9QV01fU1RBUlRfQ09OTkVDVF9JTlRFUk5BTAkJCQkweDAwMjAwMDAxCisKKy8qIEZsYWdzIGZvciBTaW5nbGVDb25maWcgY2hhbm5lbHMgY29uZmlndXJlICovCisjZGVmaW5lIE1FX1NJTkdMRV9DSEFOTkVMX05PVF9DT05GSUdVUkVECQkJMHgwMAorI2RlZmluZSBNRV9TSU5HTEVfQ0hBTk5FTF9DT05GSUdVUkVECQkJCTB4MDEKKworLyogRGVmaW5lIGlmIGNvbmZpZ3VyYXRpb24gc2hvdWxkIGJlIGRvd25sb2FkZWQgdG8gZHJpdmVyICovCisjZGVmaW5lIE1FX0NPTkZJR19MT0FEX05PX0ZMQUdTCQkJCQkJMHgwCisjZGVmaW5lIE1FX0NPTkZJR19MT0FEX1RPX0RSSVZFUgkJCQkJMHgxCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lZGV2aWNlLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWVkZXZpY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjYyZTE2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lZGV2aWNlLmMKQEAgLTAsMCArMSwxNzQwIEBACisvKioKKyAqIEBmaWxlIG1lZGV2aWNlLmMKKyAqCisgKiBAYnJpZWYgTWVpbGhhdXMgZGV2aWNlIGJhc2UgY2xhc3MuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKiBAYXV0aG9yIEtyenlzenRvZiBHYW50emtlCShrLmdhbnR6a2VAbWVpbGhhdXMuZGUpCisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2luY2x1ZGUgIm1lY29tbW9uLmgiCisjaW5jbHVkZSAibWVpbnRlcm5hbC5oIgorI2luY2x1ZGUgIm1lZGVmaW5lcy5oIgorI2luY2x1ZGUgIm1lZXJyb3IuaCIKKworI2luY2x1ZGUgIm1lZGVidWcuaCIKKyNpbmNsdWRlICJtZWRldmljZS5oIgorCisjaWZuZGVmIF9fS0VSTkVMX18KKyMgIGRlZmluZSBfX0tFUk5FTF9fCisjZW5kaWYKKworc3RhdGljIGludCBtZV9kZXZpY2VfaW9faXJxX3N0YXJ0KHN0cnVjdCBtZV9kZXZpY2UgKmRldmljZSwKKwkJCQkgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgIGludCBzdWJkZXZpY2UsCisJCQkJICBpbnQgY2hhbm5lbCwKKwkJCQkgIGludCBpcnFfc291cmNlLAorCQkJCSAgaW50IGlycV9lZGdlLCBpbnQgaXJxX2FyZywgaW50IGZsYWdzKQoreworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCW1lX3N1YmRldmljZV90ICpzOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJLy8gQ2hlY2sgc3ViZGV2aWNlIGluZGV4LgorCWlmIChzdWJkZXZpY2UgPj0gbWVfc2xpc3RfZ2V0X251bWJlcl9zdWJkZXZpY2VzKCZkZXZpY2UtPnNsaXN0KSkgeworCQlQRVJST1IoIkludmFsaWQgc3ViZGV2aWNlLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1NVQkRFVklDRTsKKwl9CisJLy8gRW50ZXIgZGV2aWNlLgorCWVyciA9IG1lX2Rsb2NrX2VudGVyKCZkZXZpY2UtPmRsb2NrLCBmaWxlcCk7CisKKwlpZiAoZXJyKSB7CisJCVBFUlJPUigiQ2Fubm90IGVudGVyIGRldmljZS5cbiIpOworCQlyZXR1cm4gZXJyOworCX0KKwkvLyBHZXQgc3ViZGV2aWNlIGluc3RhbmNlLgorCXMgPSBtZV9zbGlzdF9nZXRfc3ViZGV2aWNlKCZkZXZpY2UtPnNsaXN0LCBzdWJkZXZpY2UpOworCisJaWYgKHMpIHsKKwkJLy8gQ2FsbCBzdWJkZXZpY2UgbWV0aG9kLgorCQllcnIgPSBzLT5tZV9zdWJkZXZpY2VfaW9faXJxX3N0YXJ0KHMsCisJCQkJCQkgICBmaWxlcCwKKwkJCQkJCSAgIGNoYW5uZWwsCisJCQkJCQkgICBpcnFfc291cmNlLAorCQkJCQkJICAgaXJxX2VkZ2UsIGlycV9hcmcsIGZsYWdzKTsKKwl9IGVsc2UgeworCQkvLyBTb21ldGhpbmcgcmVhbGx5IGJhZCBoYXBwZW5lZC4KKwkJUEVSUk9SKCJDYW5ub3QgZ2V0IHN1YmRldmljZSBpbnN0YW5jZS5cbiIpOworCQllcnIgPSBNRV9FUlJOT19JTlRFUk5BTDsKKwl9CisKKwkvLyBFeGl0IGRldmljZS4KKwltZV9kbG9ja19leGl0KCZkZXZpY2UtPmRsb2NrLCBmaWxlcCk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lX2RldmljZV9pb19pcnFfd2FpdChzdHJ1Y3QgbWVfZGV2aWNlICpkZXZpY2UsCisJCQkJIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgaW50IHN1YmRldmljZSwKKwkJCQkgaW50IGNoYW5uZWwsCisJCQkJIGludCAqaXJxX2NvdW50LAorCQkJCSBpbnQgKnZhbHVlLCBpbnQgdGltZV9vdXQsIGludCBmbGFncykKK3sKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwltZV9zdWJkZXZpY2VfdCAqczsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCS8vIENoZWNrIHN1YmRldmljZSBpbmRleC4KKwlpZiAoc3ViZGV2aWNlID49IG1lX3NsaXN0X2dldF9udW1iZXJfc3ViZGV2aWNlcygmZGV2aWNlLT5zbGlzdCkpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIHN1YmRldmljZS5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9TVUJERVZJQ0U7CisJfQorCS8vIEVudGVyIGRldmljZS4KKwllcnIgPSBtZV9kbG9ja19lbnRlcigmZGV2aWNlLT5kbG9jaywgZmlsZXApOworCisJaWYgKGVycikgeworCQlQRVJST1IoIkNhbm5vdCBlbnRlciBkZXZpY2UuXG4iKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJLy8gR2V0IHN1YmRldmljZSBpbnN0YW5jZS4KKwlzID0gbWVfc2xpc3RfZ2V0X3N1YmRldmljZSgmZGV2aWNlLT5zbGlzdCwgc3ViZGV2aWNlKTsKKworCWlmIChzKSB7CisJCS8vIENhbGwgc3ViZGV2aWNlIG1ldGhvZC4KKwkJZXJyID0gcy0+bWVfc3ViZGV2aWNlX2lvX2lycV93YWl0KHMsCisJCQkJCQkgIGZpbGVwLAorCQkJCQkJICBjaGFubmVsLAorCQkJCQkJICBpcnFfY291bnQsCisJCQkJCQkgIHZhbHVlLCB0aW1lX291dCwgZmxhZ3MpOworCX0gZWxzZSB7CisJCS8vIFNvbWV0aGluZyByZWFsbHkgYmFkIGhhcHBlbmVkLgorCQlQRVJST1IoIkNhbm5vdCBnZXQgc3ViZGV2aWNlIGluc3RhbmNlLlxuIik7CisJCWVyciA9IE1FX0VSUk5PX0lOVEVSTkFMOworCX0KKworCS8vIEV4aXQgZGV2aWNlLgorCW1lX2Rsb2NrX2V4aXQoJmRldmljZS0+ZGxvY2ssIGZpbGVwKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWVfZGV2aWNlX2lvX2lycV9zdG9wKHN0cnVjdCBtZV9kZXZpY2UgKmRldmljZSwKKwkJCQkgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSBpbnQgc3ViZGV2aWNlLCBpbnQgY2hhbm5lbCwgaW50IGZsYWdzKQoreworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCW1lX3N1YmRldmljZV90ICpzOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJLy8gQ2hlY2sgc3ViZGV2aWNlIGluZGV4LgorCWlmIChzdWJkZXZpY2UgPj0gbWVfc2xpc3RfZ2V0X251bWJlcl9zdWJkZXZpY2VzKCZkZXZpY2UtPnNsaXN0KSkgeworCQlQRVJST1IoIkludmFsaWQgc3ViZGV2aWNlLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1NVQkRFVklDRTsKKwl9CisJLy8gRW50ZXIgZGV2aWNlLgorCWVyciA9IG1lX2Rsb2NrX2VudGVyKCZkZXZpY2UtPmRsb2NrLCBmaWxlcCk7CisKKwlpZiAoZXJyKSB7CisJCVBFUlJPUigiQ2Fubm90IGVudGVyIGRldmljZS5cbiIpOworCQlyZXR1cm4gZXJyOworCX0KKwkvLyBHZXQgc3ViZGV2aWNlIGluc3RhbmNlLgorCXMgPSBtZV9zbGlzdF9nZXRfc3ViZGV2aWNlKCZkZXZpY2UtPnNsaXN0LCBzdWJkZXZpY2UpOworCisJaWYgKHMpIHsKKwkJLy8gQ2FsbCBzdWJkZXZpY2UgbWV0aG9kLgorCQllcnIgPSBzLT5tZV9zdWJkZXZpY2VfaW9faXJxX3N0b3AocywgZmlsZXAsIGNoYW5uZWwsIGZsYWdzKTsKKwl9IGVsc2UgeworCQkvLyBTb21ldGhpbmcgcmVhbGx5IGJhZCBoYXBwZW5lZC4KKwkJUEVSUk9SKCJDYW5ub3QgZ2V0IHN1YmRldmljZSBpbnN0YW5jZS5cbiIpOworCQllcnIgPSBNRV9FUlJOT19JTlRFUk5BTDsKKwl9CisKKwkvLyBFeGl0IGRldmljZS4KKwltZV9kbG9ja19leGl0KCZkZXZpY2UtPmRsb2NrLCBmaWxlcCk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lX2RldmljZV9pb19yZXNldF9kZXZpY2Uoc3RydWN0IG1lX2RldmljZSAqZGV2aWNlLAorCQkJCSAgICAgc3RydWN0IGZpbGUgKmZpbGVwLCBpbnQgZmxhZ3MpCit7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJbWVfc3ViZGV2aWNlX3QgKnM7CisJaW50IGksIG47CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwkvKiBHZXQgdGhlIG51bWJlciBvZiBzdWJkZXZpY2VzLiAqLworCW4gPSBtZV9zbGlzdF9nZXRfbnVtYmVyX3N1YmRldmljZXMoJmRldmljZS0+c2xpc3QpOworCisJLy8gRW50ZXIgZGV2aWNlLgorCWVyciA9IG1lX2Rsb2NrX2VudGVyKCZkZXZpY2UtPmRsb2NrLCBmaWxlcCk7CisKKwlpZiAoZXJyKSB7CisJCVBFUlJPUigiQ2Fubm90IGVudGVyIGRldmljZS5cbiIpOworCQlyZXR1cm4gZXJyOworCX0KKworCS8qIFJlc2V0IGV2ZXJ5IHN1YmRldmljZSBpbiBsaXN0LiAqLworCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKwkJcyA9IG1lX3NsaXN0X2dldF9zdWJkZXZpY2UoJmRldmljZS0+c2xpc3QsIGkpOworCQllcnIgPSBzLT5tZV9zdWJkZXZpY2VfaW9fcmVzZXRfc3ViZGV2aWNlKHMsIGZpbGVwLCBmbGFncyk7CisKKwkJaWYgKGVycikgeworCQkJUEVSUk9SKCJDYW5ub3QgcmVzZXQgc3ViZGV2aWNlLlxuIik7CisJCQlicmVhazsKKwkJfQorCX0KKworCS8vIEV4aXQgZGV2aWNlLgorCW1lX2Rsb2NrX2V4aXQoJmRldmljZS0+ZGxvY2ssIGZpbGVwKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWVfZGV2aWNlX2lvX3Jlc2V0X3N1YmRldmljZShzdHJ1Y3QgbWVfZGV2aWNlICpkZXZpY2UsCisJCQkJCXN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkJaW50IHN1YmRldmljZSwgaW50IGZsYWdzKQoreworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCW1lX3N1YmRldmljZV90ICpzOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJLy8gQ2hlY2sgc3ViZGV2aWNlIGluZGV4LgorCisJaWYgKHN1YmRldmljZSA+PSBtZV9zbGlzdF9nZXRfbnVtYmVyX3N1YmRldmljZXMoJmRldmljZS0+c2xpc3QpKSB7CisJCVBFUlJPUigiSW52YWxpZCBzdWJkZXZpY2UuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfU1VCREVWSUNFOworCX0KKwkvLyBFbnRlciBkZXZpY2UuCisJZXJyID0gbWVfZGxvY2tfZW50ZXIoJmRldmljZS0+ZGxvY2ssIGZpbGVwKTsKKworCWlmIChlcnIpIHsKKwkJUEVSUk9SKCJDYW5ub3QgZW50ZXIgZGV2aWNlLlxuIik7CisJCXJldHVybiBlcnI7CisJfQorCS8vIEdldCBzdWJkZXZpY2UgaW5zdGFuY2UuCisJcyA9IG1lX3NsaXN0X2dldF9zdWJkZXZpY2UoJmRldmljZS0+c2xpc3QsIHN1YmRldmljZSk7CisKKwlpZiAocykgeworCQkvLyBDYWxsIHN1YmRldmljZSBtZXRob2QuCisJCWVyciA9IHMtPm1lX3N1YmRldmljZV9pb19yZXNldF9zdWJkZXZpY2UocywgZmlsZXAsIGZsYWdzKTsKKwl9IGVsc2UgeworCQkvLyBTb21ldGhpbmcgcmVhbGx5IGJhZCBoYXBwZW5lZC4KKwkJUEVSUk9SKCJDYW5ub3QgZ2V0IHN1YmRldmljZSBpbnN0YW5jZS5cbiIpOworCQllcnIgPSBNRV9FUlJOT19JTlRFUk5BTDsKKwl9CisKKwkvLyBFeGl0IGRldmljZS4KKwltZV9kbG9ja19leGl0KCZkZXZpY2UtPmRsb2NrLCBmaWxlcCk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lX2RldmljZV9pb19zaW5nbGVfY29uZmlnKHN0cnVjdCBtZV9kZXZpY2UgKmRldmljZSwKKwkJCQkgICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgICAgaW50IHN1YmRldmljZSwKKwkJCQkgICAgICBpbnQgY2hhbm5lbCwKKwkJCQkgICAgICBpbnQgc2luZ2xlX2NvbmZpZywKKwkJCQkgICAgICBpbnQgcmVmLAorCQkJCSAgICAgIGludCB0cmlnX2NoYW4sCisJCQkJICAgICAgaW50IHRyaWdfdHlwZSwgaW50IHRyaWdfZWRnZSwgaW50IGZsYWdzKQoreworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCW1lX3N1YmRldmljZV90ICpzOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJLy8gQ2hlY2sgc3ViZGV2aWNlIGluZGV4LgorCisJaWYgKHN1YmRldmljZSA+PSBtZV9zbGlzdF9nZXRfbnVtYmVyX3N1YmRldmljZXMoJmRldmljZS0+c2xpc3QpKSB7CisJCVBFUlJPUigiSW52YWxpZCBzdWJkZXZpY2UuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfU1VCREVWSUNFOworCX0KKwkvLyBFbnRlciBkZXZpY2UuCisJZXJyID0gbWVfZGxvY2tfZW50ZXIoJmRldmljZS0+ZGxvY2ssIGZpbGVwKTsKKworCWlmIChlcnIpIHsKKwkJUEVSUk9SKCJDYW5ub3QgZW50ZXIgZGV2aWNlLlxuIik7CisJCXJldHVybiBlcnI7CisJfQorCS8vIEdldCBzdWJkZXZpY2UgaW5zdGFuY2UuCisJcyA9IG1lX3NsaXN0X2dldF9zdWJkZXZpY2UoJmRldmljZS0+c2xpc3QsIHN1YmRldmljZSk7CisKKwlpZiAocykgeworCQkvLyBDYWxsIHN1YmRldmljZSBtZXRob2QuCisJCWVyciA9IHMtPm1lX3N1YmRldmljZV9pb19zaW5nbGVfY29uZmlnKHMsCisJCQkJCQkgICAgICAgZmlsZXAsCisJCQkJCQkgICAgICAgY2hhbm5lbCwKKwkJCQkJCSAgICAgICBzaW5nbGVfY29uZmlnLAorCQkJCQkJICAgICAgIHJlZiwKKwkJCQkJCSAgICAgICB0cmlnX2NoYW4sCisJCQkJCQkgICAgICAgdHJpZ190eXBlLAorCQkJCQkJICAgICAgIHRyaWdfZWRnZSwgZmxhZ3MpOworCX0gZWxzZSB7CisJCS8vIFNvbWV0aGluZyByZWFsbHkgYmFkIGhhcHBlbmVkLgorCQlQRVJST1IoIkNhbm5vdCBnZXQgc3ViZGV2aWNlIGluc3RhbmNlLlxuIik7CisJCWVyciA9IE1FX0VSUk5PX0lOVEVSTkFMOworCX0KKworCS8vIEV4aXQgZGV2aWNlLgorCW1lX2Rsb2NrX2V4aXQoJmRldmljZS0+ZGxvY2ssIGZpbGVwKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWVfZGV2aWNlX2lvX3NpbmdsZV9yZWFkKHN0cnVjdCBtZV9kZXZpY2UgKmRldmljZSwKKwkJCQkgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICBpbnQgc3ViZGV2aWNlLAorCQkJCSAgICBpbnQgY2hhbm5lbCwKKwkJCQkgICAgaW50ICp2YWx1ZSwgaW50IHRpbWVfb3V0LCBpbnQgZmxhZ3MpCit7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJbWVfc3ViZGV2aWNlX3QgKnM7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwkvLyBDaGVjayBzdWJkZXZpY2UgaW5kZXguCisKKwlpZiAoc3ViZGV2aWNlID49IG1lX3NsaXN0X2dldF9udW1iZXJfc3ViZGV2aWNlcygmZGV2aWNlLT5zbGlzdCkpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIHN1YmRldmljZS5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9TVUJERVZJQ0U7CisJfQorCS8vIEVudGVyIGRldmljZS4KKwllcnIgPSBtZV9kbG9ja19lbnRlcigmZGV2aWNlLT5kbG9jaywgZmlsZXApOworCisJaWYgKGVycikgeworCQlQRVJST1IoIkNhbm5vdCBlbnRlciBkZXZpY2UuXG4iKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJLy8gR2V0IHN1YmRldmljZSBpbnN0YW5jZS4KKwlzID0gbWVfc2xpc3RfZ2V0X3N1YmRldmljZSgmZGV2aWNlLT5zbGlzdCwgc3ViZGV2aWNlKTsKKworCWlmIChzKSB7CisJCS8vIENhbGwgc3ViZGV2aWNlIG1ldGhvZC4KKwkJZXJyID0gcy0+bWVfc3ViZGV2aWNlX2lvX3NpbmdsZV9yZWFkKHMsCisJCQkJCQkgICAgIGZpbGVwLAorCQkJCQkJICAgICBjaGFubmVsLAorCQkJCQkJICAgICB2YWx1ZSwgdGltZV9vdXQsIGZsYWdzKTsKKwl9IGVsc2UgeworCQkvLyBTb21ldGhpbmcgcmVhbGx5IGJhZCBoYXBwZW5lZC4KKwkJUEVSUk9SKCJDYW5ub3QgZ2V0IHN1YmRldmljZSBpbnN0YW5jZS5cbiIpOworCQllcnIgPSBNRV9FUlJOT19JTlRFUk5BTDsKKwl9CisKKwkvLyBFeGl0IGRldmljZS4KKwltZV9kbG9ja19leGl0KCZkZXZpY2UtPmRsb2NrLCBmaWxlcCk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lX2RldmljZV9pb19zaW5nbGVfd3JpdGUoc3RydWN0IG1lX2RldmljZSAqZGV2aWNlLAorCQkJCSAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICAgaW50IHN1YmRldmljZSwKKwkJCQkgICAgIGludCBjaGFubmVsLAorCQkJCSAgICAgaW50IHZhbHVlLCBpbnQgdGltZV9vdXQsIGludCBmbGFncykKK3sKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwltZV9zdWJkZXZpY2VfdCAqczsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCS8vIENoZWNrIHN1YmRldmljZSBpbmRleC4KKworCWlmIChzdWJkZXZpY2UgPj0gbWVfc2xpc3RfZ2V0X251bWJlcl9zdWJkZXZpY2VzKCZkZXZpY2UtPnNsaXN0KSkgeworCQlQRVJST1IoIkludmFsaWQgc3ViZGV2aWNlLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1NVQkRFVklDRTsKKwl9CisJLy8gRW50ZXIgZGV2aWNlLgorCWVyciA9IG1lX2Rsb2NrX2VudGVyKCZkZXZpY2UtPmRsb2NrLCBmaWxlcCk7CisKKwlpZiAoZXJyKSB7CisJCVBFUlJPUigiQ2Fubm90IGVudGVyIGRldmljZS5cbiIpOworCQlyZXR1cm4gZXJyOworCX0KKwkvLyBHZXQgc3ViZGV2aWNlIGluc3RhbmNlLgorCXMgPSBtZV9zbGlzdF9nZXRfc3ViZGV2aWNlKCZkZXZpY2UtPnNsaXN0LCBzdWJkZXZpY2UpOworCisJaWYgKHMpIHsKKwkJLy8gQ2FsbCBzdWJkZXZpY2UgbWV0aG9kLgorCQllcnIgPSBzLT5tZV9zdWJkZXZpY2VfaW9fc2luZ2xlX3dyaXRlKHMsCisJCQkJCQkgICAgICBmaWxlcCwKKwkJCQkJCSAgICAgIGNoYW5uZWwsCisJCQkJCQkgICAgICB2YWx1ZSwgdGltZV9vdXQsIGZsYWdzKTsKKwl9IGVsc2UgeworCQkvLyBTb21ldGhpbmcgcmVhbGx5IGJhZCBoYXBwZW5lZC4KKwkJUEVSUk9SKCJDYW5ub3QgZ2V0IHN1YmRldmljZSBpbnN0YW5jZS5cbiIpOworCQllcnIgPSBNRV9FUlJOT19JTlRFUk5BTDsKKwl9CisKKwkvLyBFeGl0IGRldmljZS4KKwltZV9kbG9ja19leGl0KCZkZXZpY2UtPmRsb2NrLCBmaWxlcCk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lX2RldmljZV9pb19zdHJlYW1fY29uZmlnKHN0cnVjdCBtZV9kZXZpY2UgKmRldmljZSwKKwkJCQkgICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgICAgaW50IHN1YmRldmljZSwKKwkJCQkgICAgICBtZUlPU3RyZWFtQ29uZmlnX3QgKiBjb25maWdfbGlzdCwKKwkJCQkgICAgICBpbnQgY291bnQsCisJCQkJICAgICAgbWVJT1N0cmVhbVRyaWdnZXJfdCAqIHRyaWdnZXIsCisJCQkJICAgICAgaW50IGZpZm9faXJxX3RocmVzaG9sZCwgaW50IGZsYWdzKQoreworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCW1lX3N1YmRldmljZV90ICpzOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJLy8gQ2hlY2sgc3ViZGV2aWNlIGluZGV4LgorCisJaWYgKHN1YmRldmljZSA+PSBtZV9zbGlzdF9nZXRfbnVtYmVyX3N1YmRldmljZXMoJmRldmljZS0+c2xpc3QpKSB7CisJCVBFUlJPUigiSW52YWxpZCBzdWJkZXZpY2UuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfU1VCREVWSUNFOworCX0KKwkvLyBFbnRlciBkZXZpY2UuCisJZXJyID0gbWVfZGxvY2tfZW50ZXIoJmRldmljZS0+ZGxvY2ssIGZpbGVwKTsKKworCWlmIChlcnIpIHsKKwkJUEVSUk9SKCJDYW5ub3QgZW50ZXIgZGV2aWNlLlxuIik7CisJCXJldHVybiBlcnI7CisJfQorCS8vIEdldCBzdWJkZXZpY2UgaW5zdGFuY2UuCisJcyA9IG1lX3NsaXN0X2dldF9zdWJkZXZpY2UoJmRldmljZS0+c2xpc3QsIHN1YmRldmljZSk7CisKKwlpZiAocykgeworCQkvLyBDYWxsIHN1YmRldmljZSBtZXRob2QuCisJCWVyciA9IHMtPm1lX3N1YmRldmljZV9pb19zdHJlYW1fY29uZmlnKHMsCisJCQkJCQkgICAgICAgZmlsZXAsCisJCQkJCQkgICAgICAgY29uZmlnX2xpc3QsCisJCQkJCQkgICAgICAgY291bnQsCisJCQkJCQkgICAgICAgdHJpZ2dlciwKKwkJCQkJCSAgICAgICBmaWZvX2lycV90aHJlc2hvbGQsCisJCQkJCQkgICAgICAgZmxhZ3MpOworCX0gZWxzZSB7CisJCS8vIFNvbWV0aGluZyByZWFsbHkgYmFkIGhhcHBlbmVkLgorCQlQRVJST1IoIkNhbm5vdCBnZXQgc3ViZGV2aWNlIGluc3RhbmNlLlxuIik7CisJCWVyciA9IE1FX0VSUk5PX0lOVEVSTkFMOworCX0KKworCS8vIEV4aXQgZGV2aWNlLgorCW1lX2Rsb2NrX2V4aXQoJmRldmljZS0+ZGxvY2ssIGZpbGVwKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWVfZGV2aWNlX2lvX3N0cmVhbV9uZXdfdmFsdWVzKHN0cnVjdCBtZV9kZXZpY2UgKmRldmljZSwKKwkJCQkJICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJCSAgaW50IHN1YmRldmljZSwKKwkJCQkJICBpbnQgdGltZV9vdXQsIGludCAqY291bnQsIGludCBmbGFncykKK3sKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwltZV9zdWJkZXZpY2VfdCAqczsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCS8vIENoZWNrIHN1YmRldmljZSBpbmRleC4KKworCWlmIChzdWJkZXZpY2UgPj0gbWVfc2xpc3RfZ2V0X251bWJlcl9zdWJkZXZpY2VzKCZkZXZpY2UtPnNsaXN0KSkgeworCQlQRVJST1IoIkludmFsaWQgc3ViZGV2aWNlLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1NVQkRFVklDRTsKKwl9CisJLy8gRW50ZXIgZGV2aWNlLgorCWVyciA9IG1lX2Rsb2NrX2VudGVyKCZkZXZpY2UtPmRsb2NrLCBmaWxlcCk7CisKKwlpZiAoZXJyKSB7CisJCVBFUlJPUigiQ2Fubm90IGVudGVyIGRldmljZS5cbiIpOworCQlyZXR1cm4gZXJyOworCX0KKwkvLyBHZXQgc3ViZGV2aWNlIGluc3RhbmNlLgorCXMgPSBtZV9zbGlzdF9nZXRfc3ViZGV2aWNlKCZkZXZpY2UtPnNsaXN0LCBzdWJkZXZpY2UpOworCisJaWYgKHMpIHsKKwkJLy8gQ2FsbCBzdWJkZXZpY2UgbWV0aG9kLgorCQllcnIgPSBzLT5tZV9zdWJkZXZpY2VfaW9fc3RyZWFtX25ld192YWx1ZXMocywKKwkJCQkJCQkgICBmaWxlcCwKKwkJCQkJCQkgICB0aW1lX291dCwKKwkJCQkJCQkgICBjb3VudCwgZmxhZ3MpOworCX0gZWxzZSB7CisJCS8vIFNvbWV0aGluZyByZWFsbHkgYmFkIGhhcHBlbmVkLgorCQlQRVJST1IoIkNhbm5vdCBnZXQgc3ViZGV2aWNlIGluc3RhbmNlLlxuIik7CisJCWVyciA9IE1FX0VSUk5PX0lOVEVSTkFMOworCX0KKworCS8vIEV4aXQgZGV2aWNlLgorCW1lX2Rsb2NrX2V4aXQoJmRldmljZS0+ZGxvY2ssIGZpbGVwKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWVfZGV2aWNlX2lvX3N0cmVhbV9yZWFkKHN0cnVjdCBtZV9kZXZpY2UgKmRldmljZSwKKwkJCQkgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICBpbnQgc3ViZGV2aWNlLAorCQkJCSAgICBpbnQgcmVhZF9tb2RlLAorCQkJCSAgICBpbnQgKnZhbHVlcywgaW50ICpjb3VudCwgaW50IGZsYWdzKQoreworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCW1lX3N1YmRldmljZV90ICpzOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJLy8gQ2hlY2sgc3ViZGV2aWNlIGluZGV4LgorCisJaWYgKHN1YmRldmljZSA+PSBtZV9zbGlzdF9nZXRfbnVtYmVyX3N1YmRldmljZXMoJmRldmljZS0+c2xpc3QpKSB7CisJCVBFUlJPUigiSW52YWxpZCBzdWJkZXZpY2UuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfU1VCREVWSUNFOworCX0KKwkvLyBFbnRlciBkZXZpY2UuCisJZXJyID0gbWVfZGxvY2tfZW50ZXIoJmRldmljZS0+ZGxvY2ssIGZpbGVwKTsKKworCWlmIChlcnIpIHsKKwkJUEVSUk9SKCJDYW5ub3QgZW50ZXIgZGV2aWNlLlxuIik7CisJCXJldHVybiBlcnI7CisJfQorCS8vIEdldCBzdWJkZXZpY2UgaW5zdGFuY2UuCisJcyA9IG1lX3NsaXN0X2dldF9zdWJkZXZpY2UoJmRldmljZS0+c2xpc3QsIHN1YmRldmljZSk7CisKKwlpZiAocykgeworCQkvLyBDYWxsIHN1YmRldmljZSBtZXRob2QuCisJCWVyciA9IHMtPm1lX3N1YmRldmljZV9pb19zdHJlYW1fcmVhZChzLAorCQkJCQkJICAgICBmaWxlcCwKKwkJCQkJCSAgICAgcmVhZF9tb2RlLAorCQkJCQkJICAgICB2YWx1ZXMsIGNvdW50LCBmbGFncyk7CisJfSBlbHNlIHsKKwkJLy8gU29tZXRoaW5nIHJlYWxseSBiYWQgaGFwcGVuZWQuCisJCVBFUlJPUigiQ2Fubm90IGdldCBzdWJkZXZpY2UgaW5zdGFuY2UuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fSU5URVJOQUw7CisJfQorCisJLy8gRXhpdCBkZXZpY2UuCisJbWVfZGxvY2tfZXhpdCgmZGV2aWNlLT5kbG9jaywgZmlsZXApOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZV9kZXZpY2VfaW9fc3RyZWFtX3N0YXJ0KHN0cnVjdCBtZV9kZXZpY2UgKmRldmljZSwKKwkJCQkgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgIGludCBzdWJkZXZpY2UsCisJCQkJICAgICBpbnQgc3RhcnRfbW9kZSwgaW50IHRpbWVfb3V0LCBpbnQgZmxhZ3MpCit7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJbWVfc3ViZGV2aWNlX3QgKnM7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwkvLyBDaGVjayBzdWJkZXZpY2UgaW5kZXguCisKKwlpZiAoc3ViZGV2aWNlID49IG1lX3NsaXN0X2dldF9udW1iZXJfc3ViZGV2aWNlcygmZGV2aWNlLT5zbGlzdCkpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIHN1YmRldmljZS5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9TVUJERVZJQ0U7CisJfQorCS8vIEVudGVyIGRldmljZS4KKwllcnIgPSBtZV9kbG9ja19lbnRlcigmZGV2aWNlLT5kbG9jaywgZmlsZXApOworCisJaWYgKGVycikgeworCQlQRVJST1IoIkNhbm5vdCBlbnRlciBkZXZpY2UuXG4iKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJLy8gR2V0IHN1YmRldmljZSBpbnN0YW5jZS4KKwlzID0gbWVfc2xpc3RfZ2V0X3N1YmRldmljZSgmZGV2aWNlLT5zbGlzdCwgc3ViZGV2aWNlKTsKKworCWlmIChzKSB7CisJCS8vIENhbGwgc3ViZGV2aWNlIG1ldGhvZC4KKwkJZXJyID0gcy0+bWVfc3ViZGV2aWNlX2lvX3N0cmVhbV9zdGFydChzLAorCQkJCQkJICAgICAgZmlsZXAsCisJCQkJCQkgICAgICBzdGFydF9tb2RlLAorCQkJCQkJICAgICAgdGltZV9vdXQsIGZsYWdzKTsKKwl9IGVsc2UgeworCQkvLyBTb21ldGhpbmcgcmVhbGx5IGJhZCBoYXBwZW5lZC4KKwkJUEVSUk9SKCJDYW5ub3QgZ2V0IHN1YmRldmljZSBpbnN0YW5jZS5cbiIpOworCQllcnIgPSBNRV9FUlJOT19JTlRFUk5BTDsKKwl9CisKKwkvLyBFeGl0IGRldmljZS4KKwltZV9kbG9ja19leGl0KCZkZXZpY2UtPmRsb2NrLCBmaWxlcCk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lX2RldmljZV9pb19zdHJlYW1fc3RhdHVzKHN0cnVjdCBtZV9kZXZpY2UgKmRldmljZSwKKwkJCQkgICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgICAgaW50IHN1YmRldmljZSwKKwkJCQkgICAgICBpbnQgd2FpdCwKKwkJCQkgICAgICBpbnQgKnN0YXR1cywgaW50ICpjb3VudCwgaW50IGZsYWdzKQoreworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCW1lX3N1YmRldmljZV90ICpzOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJLy8gQ2hlY2sgc3ViZGV2aWNlIGluZGV4LgorCisJaWYgKHN1YmRldmljZSA+PSBtZV9zbGlzdF9nZXRfbnVtYmVyX3N1YmRldmljZXMoJmRldmljZS0+c2xpc3QpKSB7CisJCVBFUlJPUigiSW52YWxpZCBzdWJkZXZpY2UuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfU1VCREVWSUNFOworCX0KKwkvLyBFbnRlciBkZXZpY2UuCisJZXJyID0gbWVfZGxvY2tfZW50ZXIoJmRldmljZS0+ZGxvY2ssIGZpbGVwKTsKKworCWlmIChlcnIpIHsKKwkJUEVSUk9SKCJDYW5ub3QgZW50ZXIgZGV2aWNlLlxuIik7CisJCXJldHVybiBlcnI7CisJfQorCS8vIEdldCBzdWJkZXZpY2UgaW5zdGFuY2UuCisJcyA9IG1lX3NsaXN0X2dldF9zdWJkZXZpY2UoJmRldmljZS0+c2xpc3QsIHN1YmRldmljZSk7CisKKwlpZiAocykgeworCQkvLyBDYWxsIHN1YmRldmljZSBtZXRob2QuCisJCWVyciA9IHMtPm1lX3N1YmRldmljZV9pb19zdHJlYW1fc3RhdHVzKHMsCisJCQkJCQkgICAgICAgZmlsZXAsCisJCQkJCQkgICAgICAgd2FpdCwKKwkJCQkJCSAgICAgICBzdGF0dXMsIGNvdW50LCBmbGFncyk7CisJfSBlbHNlIHsKKwkJLy8gU29tZXRoaW5nIHJlYWxseSBiYWQgaGFwcGVuZWQuCisJCVBFUlJPUigiQ2Fubm90IGdldCBzdWJkZXZpY2UgaW5zdGFuY2UuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fSU5URVJOQUw7CisJfQorCisJLy8gRXhpdCBkZXZpY2UuCisJbWVfZGxvY2tfZXhpdCgmZGV2aWNlLT5kbG9jaywgZmlsZXApOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZV9kZXZpY2VfaW9fc3RyZWFtX3N0b3Aoc3RydWN0IG1lX2RldmljZSAqZGV2aWNlLAorCQkJCSAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgIGludCBzdWJkZXZpY2UsIGludCBzdG9wX21vZGUsIGludCBmbGFncykKK3sKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwltZV9zdWJkZXZpY2VfdCAqczsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCS8vIENoZWNrIHN1YmRldmljZSBpbmRleC4KKworCWlmIChzdWJkZXZpY2UgPj0gbWVfc2xpc3RfZ2V0X251bWJlcl9zdWJkZXZpY2VzKCZkZXZpY2UtPnNsaXN0KSkgeworCQlQRVJST1IoIkludmFsaWQgc3ViZGV2aWNlLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1NVQkRFVklDRTsKKwl9CisJLy8gRW50ZXIgZGV2aWNlLgorCWVyciA9IG1lX2Rsb2NrX2VudGVyKCZkZXZpY2UtPmRsb2NrLCBmaWxlcCk7CisKKwlpZiAoZXJyKSB7CisJCVBFUlJPUigiQ2Fubm90IGVudGVyIGRldmljZS5cbiIpOworCQlyZXR1cm4gZXJyOworCX0KKwkvLyBHZXQgc3ViZGV2aWNlIGluc3RhbmNlLgorCXMgPSBtZV9zbGlzdF9nZXRfc3ViZGV2aWNlKCZkZXZpY2UtPnNsaXN0LCBzdWJkZXZpY2UpOworCisJaWYgKHMpIHsKKwkJLy8gQ2FsbCBzdWJkZXZpY2UgbWV0aG9kLgorCQllcnIgPSBzLT5tZV9zdWJkZXZpY2VfaW9fc3RyZWFtX3N0b3AocywKKwkJCQkJCSAgICAgZmlsZXAsIHN0b3BfbW9kZSwgZmxhZ3MpOworCX0gZWxzZSB7CisJCS8vIFNvbWV0aGluZyByZWFsbHkgYmFkIGhhcHBlbmVkLgorCQlQRVJST1IoIkNhbm5vdCBnZXQgc3ViZGV2aWNlIGluc3RhbmNlLlxuIik7CisJCWVyciA9IE1FX0VSUk5PX0lOVEVSTkFMOworCX0KKworCS8vIEV4aXQgZGV2aWNlLgorCW1lX2Rsb2NrX2V4aXQoJmRldmljZS0+ZGxvY2ssIGZpbGVwKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWVfZGV2aWNlX2lvX3N0cmVhbV93cml0ZShzdHJ1Y3QgbWVfZGV2aWNlICpkZXZpY2UsCisJCQkJICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgICBpbnQgc3ViZGV2aWNlLAorCQkJCSAgICAgaW50IHdyaXRlX21vZGUsCisJCQkJICAgICBpbnQgKnZhbHVlcywgaW50ICpjb3VudCwgaW50IGZsYWdzKQoreworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCW1lX3N1YmRldmljZV90ICpzOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJLy8gQ2hlY2sgc3ViZGV2aWNlIGluZGV4LgorCisJaWYgKHN1YmRldmljZSA+PSBtZV9zbGlzdF9nZXRfbnVtYmVyX3N1YmRldmljZXMoJmRldmljZS0+c2xpc3QpKSB7CisJCVBFUlJPUigiSW52YWxpZCBzdWJkZXZpY2UuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfU1VCREVWSUNFOworCX0KKwkvLyBFbnRlciBkZXZpY2UuCisJZXJyID0gbWVfZGxvY2tfZW50ZXIoJmRldmljZS0+ZGxvY2ssIGZpbGVwKTsKKworCWlmIChlcnIpIHsKKwkJUEVSUk9SKCJDYW5ub3QgZW50ZXIgZGV2aWNlLlxuIik7CisJCXJldHVybiBlcnI7CisJfQorCS8vIEdldCBzdWJkZXZpY2UgaW5zdGFuY2UuCisJcyA9IG1lX3NsaXN0X2dldF9zdWJkZXZpY2UoJmRldmljZS0+c2xpc3QsIHN1YmRldmljZSk7CisKKwlpZiAocykgeworCQkvLyBDYWxsIHN1YmRldmljZSBtZXRob2QuCisJCWVyciA9IHMtPm1lX3N1YmRldmljZV9pb19zdHJlYW1fd3JpdGUocywKKwkJCQkJCSAgICAgIGZpbGVwLAorCQkJCQkJICAgICAgd3JpdGVfbW9kZSwKKwkJCQkJCSAgICAgIHZhbHVlcywgY291bnQsIGZsYWdzKTsKKwl9IGVsc2UgeworCQkvLyBTb21ldGhpbmcgcmVhbGx5IGJhZCBoYXBwZW5lZC4KKwkJUEVSUk9SKCJDYW5ub3QgZ2V0IHN1YmRldmljZSBpbnN0YW5jZS5cbiIpOworCQllcnIgPSBNRV9FUlJOT19JTlRFUk5BTDsKKwl9CisKKwkvLyBFeGl0IGRldmljZS4KKwltZV9kbG9ja19leGl0KCZkZXZpY2UtPmRsb2NrLCBmaWxlcCk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lX2RldmljZV9sb2NrX2RldmljZShzdHJ1Y3QgbWVfZGV2aWNlICpkZXZpY2UsCisJCQkJIHN0cnVjdCBmaWxlICpmaWxlcCwgaW50IGxvY2ssIGludCBmbGFncykKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlyZXR1cm4gbWVfZGxvY2tfbG9jaygmZGV2aWNlLT5kbG9jaywKKwkJCSAgICAgZmlsZXAsIGxvY2ssIGZsYWdzLCAmZGV2aWNlLT5zbGlzdCk7Cit9CisKK3N0YXRpYyBpbnQgbWVfZGV2aWNlX2xvY2tfc3ViZGV2aWNlKHN0cnVjdCBtZV9kZXZpY2UgKmRldmljZSwKKwkJCQkgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICBpbnQgc3ViZGV2aWNlLCBpbnQgbG9jaywgaW50IGZsYWdzKQoreworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCW1lX3N1YmRldmljZV90ICpzOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJLy8gQ2hlY2sgc3ViZGV2aWNlIGluZGV4LgorCisJaWYgKHN1YmRldmljZSA+PSBtZV9zbGlzdF9nZXRfbnVtYmVyX3N1YmRldmljZXMoJmRldmljZS0+c2xpc3QpKSB7CisJCVBFUlJPUigiSW52YWxpZCBzdWJkZXZpY2UuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfU1VCREVWSUNFOworCX0KKwkvLyBFbnRlciBkZXZpY2UuCisJZXJyID0gbWVfZGxvY2tfZW50ZXIoJmRldmljZS0+ZGxvY2ssIGZpbGVwKTsKKworCWlmIChlcnIpIHsKKwkJUEVSUk9SKCJDYW5ub3QgZW50ZXIgZGV2aWNlLlxuIik7CisJCXJldHVybiBlcnI7CisJfQorCS8vIEdldCBzdWJkZXZpY2UgaW5zdGFuY2UuCisJcyA9IG1lX3NsaXN0X2dldF9zdWJkZXZpY2UoJmRldmljZS0+c2xpc3QsIHN1YmRldmljZSk7CisKKwlpZiAocykgeworCQkvLyBDYWxsIHN1YmRldmljZSBtZXRob2QuCisJCWVyciA9IHMtPm1lX3N1YmRldmljZV9sb2NrX3N1YmRldmljZShzLCBmaWxlcCwgbG9jaywgZmxhZ3MpOworCX0gZWxzZSB7CisJCS8vIFNvbWV0aGluZyByZWFsbHkgYmFkIGhhcHBlbmVkLgorCQlQRVJST1IoIkNhbm5vdCBnZXQgc3ViZGV2aWNlIGluc3RhbmNlLlxuIik7CisJCWVyciA9IE1FX0VSUk5PX0lOVEVSTkFMOworCX0KKworCS8vIEV4aXQgZGV2aWNlLgorCW1lX2Rsb2NrX2V4aXQoJmRldmljZS0+ZGxvY2ssIGZpbGVwKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWVfZGV2aWNlX3F1ZXJ5X2Rlc2NyaXB0aW9uX2RldmljZShzdHJ1Y3QgbWVfZGV2aWNlICpkZXZpY2UsCisJCQkJCSAgICAgIGNoYXIgKipkZXNjcmlwdGlvbikKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJKmRlc2NyaXB0aW9uID0gZGV2aWNlLT5kZXZpY2VfZGVzY3JpcHRpb247CisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWVfZGV2aWNlX3F1ZXJ5X2luZm9fZGV2aWNlKHN0cnVjdCBtZV9kZXZpY2UgKmRldmljZSwKKwkJCQkgICAgICAgaW50ICp2ZW5kb3JfaWQsCisJCQkJICAgICAgIGludCAqZGV2aWNlX2lkLAorCQkJCSAgICAgICBpbnQgKnNlcmlhbF9ubywKKwkJCQkgICAgICAgaW50ICpidXNfdHlwZSwKKwkJCQkgICAgICAgaW50ICpidXNfbm8sCisJCQkJICAgICAgIGludCAqZGV2X25vLCBpbnQgKmZ1bmNfbm8sIGludCAqcGx1Z2dlZCkKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpZiAoZGV2aWNlLT5idXNfdHlwZSA9PSBNRV9CVVNfVFlQRV9QQ0kpIHsKKwkJKnZlbmRvcl9pZCA9IGRldmljZS0+aW5mby5wY2kudmVuZG9yX2lkOworCQkqZGV2aWNlX2lkID0gZGV2aWNlLT5pbmZvLnBjaS5kZXZpY2VfaWQ7CisJCSpzZXJpYWxfbm8gPSBkZXZpY2UtPmluZm8ucGNpLnNlcmlhbF9ubzsKKwkJKmJ1c190eXBlID0gTUVfQlVTX1RZUEVfUENJOworCQkqYnVzX25vID0gZGV2aWNlLT5pbmZvLnBjaS5wY2lfYnVzX25vOworCQkqZGV2X25vID0gZGV2aWNlLT5pbmZvLnBjaS5wY2lfZGV2X25vOworCQkqZnVuY19ubyA9IGRldmljZS0+aW5mby5wY2kucGNpX2Z1bmNfbm87CisJCSpwbHVnZ2VkID0gTUVfUExVR0dFRF9JTjsKKwl9IGVsc2UgeworCQkqcGx1Z2dlZCA9IE1FX1BMVUdHRURfT1VUOworCX0KKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZV9kZXZpY2VfcXVlcnlfbmFtZV9kZXZpY2Uoc3RydWN0IG1lX2RldmljZSAqZGV2aWNlLCBjaGFyICoqbmFtZSkKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJKm5hbWUgPSBkZXZpY2UtPmRldmljZV9uYW1lOworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lX2RldmljZV9xdWVyeV9uYW1lX2RldmljZV9kcml2ZXIoc3RydWN0IG1lX2RldmljZSAqZGV2aWNlLAorCQkJCQkgICAgICBjaGFyICoqbmFtZSkKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJKm5hbWUgPSBkZXZpY2UtPmRyaXZlcl9uYW1lOworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lX2RldmljZV9xdWVyeV9udW1iZXJfc3ViZGV2aWNlcyhzdHJ1Y3QgbWVfZGV2aWNlICpkZXZpY2UsCisJCQkJCSAgICAgaW50ICpudW1iZXIpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCXJldHVybiBtZV9zbGlzdF9xdWVyeV9udW1iZXJfc3ViZGV2aWNlcygmZGV2aWNlLT5zbGlzdCwgbnVtYmVyKTsKK30KKworc3RhdGljIGludCBtZV9kZXZpY2VfcXVlcnlfbnVtYmVyX2NoYW5uZWxzKHN0cnVjdCBtZV9kZXZpY2UgKmRldmljZSwKKwkJCQkJICAgaW50IHN1YmRldmljZSwgaW50ICpudW1iZXIpCit7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJbWVfc3ViZGV2aWNlX3QgKnM7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwkvLyBDaGVjayBzdWJkZXZpY2UgaW5kZXguCisKKwlpZiAoc3ViZGV2aWNlID49IG1lX3NsaXN0X2dldF9udW1iZXJfc3ViZGV2aWNlcygmZGV2aWNlLT5zbGlzdCkpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIHN1YmRldmljZS5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9TVUJERVZJQ0U7CisJfQorCS8vIEdldCBzdWJkZXZpY2UgaW5zdGFuY2UuCisJcyA9IG1lX3NsaXN0X2dldF9zdWJkZXZpY2UoJmRldmljZS0+c2xpc3QsIHN1YmRldmljZSk7CisKKwlpZiAocykgeworCQkvLyBDYWxsIHN1YmRldmljZSBtZXRob2QuCisJCWVyciA9IHMtPm1lX3N1YmRldmljZV9xdWVyeV9udW1iZXJfY2hhbm5lbHMocywgbnVtYmVyKTsKKwl9IGVsc2UgeworCQkvLyBTb21ldGhpbmcgcmVhbGx5IGJhZCBoYXBwZW5lZC4KKwkJUEVSUk9SKCJDYW5ub3QgZ2V0IHN1YmRldmljZSBpbnN0YW5jZS5cbiIpOworCQllcnIgPSBNRV9FUlJOT19JTlRFUk5BTDsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lX2RldmljZV9xdWVyeV9udW1iZXJfcmFuZ2VzKHN0cnVjdCBtZV9kZXZpY2UgKmRldmljZSwKKwkJCQkJIGludCBzdWJkZXZpY2UsIGludCB1bml0LCBpbnQgKmNvdW50KQoreworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCW1lX3N1YmRldmljZV90ICpzOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJLy8gQ2hlY2sgc3ViZGV2aWNlIGluZGV4LgorCisJaWYgKHN1YmRldmljZSA+PSBtZV9zbGlzdF9nZXRfbnVtYmVyX3N1YmRldmljZXMoJmRldmljZS0+c2xpc3QpKSB7CisJCVBFUlJPUigiSW52YWxpZCBzdWJkZXZpY2UuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfU1VCREVWSUNFOworCX0KKwkvLyBHZXQgc3ViZGV2aWNlIGluc3RhbmNlLgorCXMgPSBtZV9zbGlzdF9nZXRfc3ViZGV2aWNlKCZkZXZpY2UtPnNsaXN0LCBzdWJkZXZpY2UpOworCisJaWYgKHMpIHsKKwkJLy8gQ2FsbCBzdWJkZXZpY2UgbWV0aG9kLgorCQllcnIgPSBzLT5tZV9zdWJkZXZpY2VfcXVlcnlfbnVtYmVyX3JhbmdlcyhzLCB1bml0LCBjb3VudCk7CisJfSBlbHNlIHsKKwkJLy8gU29tZXRoaW5nIHJlYWxseSBiYWQgaGFwcGVuZWQuCisJCVBFUlJPUigiQ2Fubm90IGdldCBzdWJkZXZpY2UgaW5zdGFuY2UuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fSU5URVJOQUw7CisJfQorCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZV9kZXZpY2VfcXVlcnlfcmFuZ2VfYnlfbWluX21heChzdHJ1Y3QgbWVfZGV2aWNlICpkZXZpY2UsCisJCQkJCSAgICBpbnQgc3ViZGV2aWNlLAorCQkJCQkgICAgaW50IHVuaXQsCisJCQkJCSAgICBpbnQgKm1pbiwKKwkJCQkJICAgIGludCAqbWF4LCBpbnQgKm1heGRhdGEsIGludCAqcmFuZ2UpCit7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJbWVfc3ViZGV2aWNlX3QgKnM7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwkvLyBDaGVjayBzdWJkZXZpY2UgaW5kZXguCisKKwlpZiAoc3ViZGV2aWNlID49IG1lX3NsaXN0X2dldF9udW1iZXJfc3ViZGV2aWNlcygmZGV2aWNlLT5zbGlzdCkpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIHN1YmRldmljZS5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9TVUJERVZJQ0U7CisJfQorCS8vIEdldCBzdWJkZXZpY2UgaW5zdGFuY2UuCisJcyA9IG1lX3NsaXN0X2dldF9zdWJkZXZpY2UoJmRldmljZS0+c2xpc3QsIHN1YmRldmljZSk7CisKKwlpZiAocykgeworCQkvLyBDYWxsIHN1YmRldmljZSBtZXRob2QuCisJCWVyciA9IHMtPm1lX3N1YmRldmljZV9xdWVyeV9yYW5nZV9ieV9taW5fbWF4KHMsCisJCQkJCQkJICAgICB1bml0LAorCQkJCQkJCSAgICAgbWluLAorCQkJCQkJCSAgICAgbWF4LAorCQkJCQkJCSAgICAgbWF4ZGF0YSwgcmFuZ2UpOworCX0gZWxzZSB7CisJCS8vIFNvbWV0aGluZyByZWFsbHkgYmFkIGhhcHBlbmVkLgorCQlQRVJST1IoIkNhbm5vdCBnZXQgc3ViZGV2aWNlIGluc3RhbmNlLlxuIik7CisJCWVyciA9IE1FX0VSUk5PX0lOVEVSTkFMOworCX0KKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWVfZGV2aWNlX3F1ZXJ5X3JhbmdlX2luZm8oc3RydWN0IG1lX2RldmljZSAqZGV2aWNlLAorCQkJCSAgICAgIGludCBzdWJkZXZpY2UsCisJCQkJICAgICAgaW50IHJhbmdlLAorCQkJCSAgICAgIGludCAqdW5pdCwKKwkJCQkgICAgICBpbnQgKm1pbiwgaW50ICptYXgsIGludCAqbWF4ZGF0YSkKK3sKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwltZV9zdWJkZXZpY2VfdCAqczsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCS8vIENoZWNrIHN1YmRldmljZSBpbmRleC4KKworCWlmIChzdWJkZXZpY2UgPj0gbWVfc2xpc3RfZ2V0X251bWJlcl9zdWJkZXZpY2VzKCZkZXZpY2UtPnNsaXN0KSkgeworCQlQRVJST1IoIkludmFsaWQgc3ViZGV2aWNlLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1NVQkRFVklDRTsKKwl9CisJLy8gR2V0IHN1YmRldmljZSBpbnN0YW5jZS4KKwlzID0gbWVfc2xpc3RfZ2V0X3N1YmRldmljZSgmZGV2aWNlLT5zbGlzdCwgc3ViZGV2aWNlKTsKKworCWlmIChzKSB7CisJCS8vIENhbGwgc3ViZGV2aWNlIG1ldGhvZC4KKwkJZXJyID0gcy0+bWVfc3ViZGV2aWNlX3F1ZXJ5X3JhbmdlX2luZm8ocywKKwkJCQkJCSAgICAgICByYW5nZSwKKwkJCQkJCSAgICAgICB1bml0LCBtaW4sIG1heCwgbWF4ZGF0YSk7CisJfSBlbHNlIHsKKwkJLy8gU29tZXRoaW5nIHJlYWxseSBiYWQgaGFwcGVuZWQuCisJCVBFUlJPUigiQ2Fubm90IGdldCBzdWJkZXZpY2UgaW5zdGFuY2UuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fSU5URVJOQUw7CisJfQorCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZV9kZXZpY2VfcXVlcnlfc3ViZGV2aWNlX2J5X3R5cGUoc3RydWN0IG1lX2RldmljZSAqZGV2aWNlLAorCQkJCQkgICAgIGludCBzdGFydF9zdWJkZXZpY2UsCisJCQkJCSAgICAgaW50IHR5cGUsCisJCQkJCSAgICAgaW50IHN1YnR5cGUsIGludCAqc3ViZGV2aWNlKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCXJldHVybiBtZV9zbGlzdF9nZXRfc3ViZGV2aWNlX2J5X3R5cGUoJmRldmljZS0+c2xpc3QsCisJCQkJCSAgICAgIHN0YXJ0X3N1YmRldmljZSwKKwkJCQkJICAgICAgdHlwZSwgc3VidHlwZSwgc3ViZGV2aWNlKTsKK30KKworc3RhdGljIGludCBtZV9kZXZpY2VfcXVlcnlfc3ViZGV2aWNlX3R5cGUoc3RydWN0IG1lX2RldmljZSAqZGV2aWNlLAorCQkJCQkgIGludCBzdWJkZXZpY2UsCisJCQkJCSAgaW50ICp0eXBlLCBpbnQgKnN1YnR5cGUpCit7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJbWVfc3ViZGV2aWNlX3QgKnM7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwkvLyBDaGVjayBzdWJkZXZpY2UgaW5kZXguCisKKwlpZiAoc3ViZGV2aWNlID49IG1lX3NsaXN0X2dldF9udW1iZXJfc3ViZGV2aWNlcygmZGV2aWNlLT5zbGlzdCkpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIHN1YmRldmljZS5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9TVUJERVZJQ0U7CisJfQorCS8vIEdldCBzdWJkZXZpY2UgaW5zdGFuY2UuCisJcyA9IG1lX3NsaXN0X2dldF9zdWJkZXZpY2UoJmRldmljZS0+c2xpc3QsIHN1YmRldmljZSk7CisKKwlpZiAocykgeworCQkvLyBDYWxsIHN1YmRldmljZSBtZXRob2QuCisJCWVyciA9IHMtPm1lX3N1YmRldmljZV9xdWVyeV9zdWJkZXZpY2VfdHlwZShzLCB0eXBlLCBzdWJ0eXBlKTsKKwl9IGVsc2UgeworCQkvLyBTb21ldGhpbmcgcmVhbGx5IGJhZCBoYXBwZW5lZC4KKwkJUEVSUk9SKCJDYW5ub3QgZ2V0IHN1YmRldmljZSBpbnN0YW5jZS5cbiIpOworCQllcnIgPSBNRV9FUlJOT19JTlRFUk5BTDsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lX2RldmljZV9xdWVyeV9zdWJkZXZpY2VfY2FwcyhzdHJ1Y3QgbWVfZGV2aWNlICpkZXZpY2UsCisJCQkJCSAgaW50IHN1YmRldmljZSwgaW50ICpjYXBzKQoreworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCW1lX3N1YmRldmljZV90ICpzOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJLy8gQ2hlY2sgc3ViZGV2aWNlIGluZGV4LgorCisJaWYgKHN1YmRldmljZSA+PSBtZV9zbGlzdF9nZXRfbnVtYmVyX3N1YmRldmljZXMoJmRldmljZS0+c2xpc3QpKSB7CisJCVBFUlJPUigiSW52YWxpZCBzdWJkZXZpY2UuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfU1VCREVWSUNFOworCX0KKwkvLyBHZXQgc3ViZGV2aWNlIGluc3RhbmNlLgorCXMgPSBtZV9zbGlzdF9nZXRfc3ViZGV2aWNlKCZkZXZpY2UtPnNsaXN0LCBzdWJkZXZpY2UpOworCisJaWYgKHMpIHsKKwkJLy8gQ2FsbCBzdWJkZXZpY2UgbWV0aG9kLgorCQllcnIgPSBzLT5tZV9zdWJkZXZpY2VfcXVlcnlfc3ViZGV2aWNlX2NhcHMocywgY2Fwcyk7CisJfSBlbHNlIHsKKwkJLy8gU29tZXRoaW5nIHJlYWxseSBiYWQgaGFwcGVuZWQuCisJCVBFUlJPUigiQ2Fubm90IGdldCBzdWJkZXZpY2UgaW5zdGFuY2UuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fSU5URVJOQUw7CisJfQorCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZV9kZXZpY2VfcXVlcnlfc3ViZGV2aWNlX2NhcHNfYXJncyhzdHJ1Y3QgbWVfZGV2aWNlICpkZXZpY2UsCisJCQkJCSAgICAgICBpbnQgc3ViZGV2aWNlLAorCQkJCQkgICAgICAgaW50IGNhcCwgaW50ICphcmdzLCBpbnQgY291bnQpCit7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJbWVfc3ViZGV2aWNlX3QgKnM7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwkvLyBDaGVjayBzdWJkZXZpY2UgaW5kZXguCisKKwlpZiAoc3ViZGV2aWNlID49IG1lX3NsaXN0X2dldF9udW1iZXJfc3ViZGV2aWNlcygmZGV2aWNlLT5zbGlzdCkpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIHN1YmRldmljZS5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9TVUJERVZJQ0U7CisJfQorCS8vIEdldCBzdWJkZXZpY2UgaW5zdGFuY2UuCisJcyA9IG1lX3NsaXN0X2dldF9zdWJkZXZpY2UoJmRldmljZS0+c2xpc3QsIHN1YmRldmljZSk7CisKKwlpZiAocykgeworCQkvLyBDYWxsIHN1YmRldmljZSBtZXRob2QuCisJCWVyciA9IHMtPm1lX3N1YmRldmljZV9xdWVyeV9zdWJkZXZpY2VfY2Fwc19hcmdzKHMsCisJCQkJCQkJCWNhcCwKKwkJCQkJCQkJYXJncywgY291bnQpOworCX0gZWxzZSB7CisJCS8vIFNvbWV0aGluZyByZWFsbHkgYmFkIGhhcHBlbmVkLgorCQlQRVJST1IoIkNhbm5vdCBnZXQgc3ViZGV2aWNlIGluc3RhbmNlLlxuIik7CisJCWVyciA9IE1FX0VSUk5PX0lOVEVSTkFMOworCX0KKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWVfZGV2aWNlX3F1ZXJ5X3RpbWVyKHN0cnVjdCBtZV9kZXZpY2UgKmRldmljZSwKKwkJCQkgaW50IHN1YmRldmljZSwKKwkJCQkgaW50IHRpbWVyLAorCQkJCSBpbnQgKmJhc2VfZnJlcXVlbmN5LAorCQkJCSB1aW50NjRfdCAqIG1pbl90aWNrcywgdWludDY0X3QgKiBtYXhfdGlja3MpCit7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJbWVfc3ViZGV2aWNlX3QgKnM7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwkvLyBDaGVjayBzdWJkZXZpY2UgaW5kZXguCisKKwlpZiAoc3ViZGV2aWNlID49IG1lX3NsaXN0X2dldF9udW1iZXJfc3ViZGV2aWNlcygmZGV2aWNlLT5zbGlzdCkpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIHN1YmRldmljZS5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9TVUJERVZJQ0U7CisJfQorCS8vIEdldCBzdWJkZXZpY2UgaW5zdGFuY2UuCisJcyA9IG1lX3NsaXN0X2dldF9zdWJkZXZpY2UoJmRldmljZS0+c2xpc3QsIHN1YmRldmljZSk7CisKKwlpZiAocykgeworCQkvLyBDYWxsIHN1YmRldmljZSBtZXRob2QuCisJCWVyciA9IHMtPm1lX3N1YmRldmljZV9xdWVyeV90aW1lcihzLAorCQkJCQkJICB0aW1lciwKKwkJCQkJCSAgYmFzZV9mcmVxdWVuY3ksCisJCQkJCQkgIG1pbl90aWNrcywgbWF4X3RpY2tzKTsKKwl9IGVsc2UgeworCQkvLyBTb21ldGhpbmcgcmVhbGx5IGJhZCBoYXBwZW5lZC4KKwkJUEVSUk9SKCJDYW5ub3QgZ2V0IHN1YmRldmljZSBpbnN0YW5jZS5cbiIpOworCQllcnIgPSBNRV9FUlJOT19JTlRFUk5BTDsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lX2RldmljZV9xdWVyeV92ZXJzaW9uX2RldmljZV9kcml2ZXIoc3RydWN0IG1lX2RldmljZSAqZGV2aWNlLAorCQkJCQkJIGludCAqdmVyc2lvbikKKy8qKiBAdG9kbyBWZXJzaW9ucyBzaG9sZCBiZSByZWFkIGZyb20gZHJpdmVyLiBJIG11c3Qgb3ZlcndyaXRlIHRoaXMgZnVuY3Rpb24gaW4gZWFjaCBtb2R1bGUuIEhlcmUgc2hvdWxkIGJlIHJldHVybmVkIGFuIGVycm9yIQorKi8KK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJKnZlcnNpb24gPSBNRV9WRVJTSU9OX0RSSVZFUjsKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZV9kZXZpY2VfY29uZmlnX2xvYWQoc3RydWN0IG1lX2RldmljZSAqZGV2aWNlLCBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJIG1lX2NmZ19kZXZpY2VfZW50cnlfdCAqIGNvbmZpZykKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7CS8vSWYgbm8gbmVlZCBmb3IgY29uZmlnIHJldHVybiBzdWNjZXNzLgorLy8gICAgICByZXR1cm4gTUVfRVJSTk9fTk9UX1NVUFBPUlRFRDsKK30KKworc3RhdGljIHZvaWQgbWVfZGV2aWNlX2Rlc3RydWN0b3IobWVfZGV2aWNlX3QgKiBtZV9kZXZpY2UpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCW1lX2RldmljZV9kZWluaXQobWVfZGV2aWNlKTsKKwlrZnJlZShtZV9kZXZpY2UpOworfQorCisvKiAvL21lX2RldmljZV91c2JfaW5pdAoraW50IG1lX2RldmljZV91c2JfaW5pdChtZV9kZXZpY2VfdCAqbWVfZGV2aWNlLCBzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZXJmYWNlKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwlyZXR1cm4gLTE7Cit9CisqLworCitzdGF0aWMgaW50IGdldF9kZXZpY2VfZGVzY3JpcHRpb25zKHVpbnQxNl90IGRldmljZV9pZCwKKwkJCQkgICBjaGFyICoqZGV2aWNlX25hbWUsCisJCQkJICAgY2hhciAqKmRldmljZV9kZXNjcmlwdGlvbiwKKwkJCQkgICBjaGFyICoqZHJpdmVyX25hbWUpCisvKiogQHRvZG8gVGhpcyBpcyB3cm9uZyBjb25jZXB0ISBTdGF0aWMgdGFibGUgaGFzIHRvbyBzdHJvbmcgbGltaXRhdGlvbnMhCisqICdkZXZpY2VfbmFtZScgYW5kICdkcml2ZXJfbmFtZScgc2hvdWxkIGJlIGNhbGN1bGF0ZWQgZnJvbSAnZGV2aWNlX2lkJworKiAnZGV2aWNlX2Rlc2NyaXB0aW9uJyBzaG91bGQgYmUgcmVhZCBmcm9tIGRldmljZSBvciBtb3ZlZCB0byB1c2VyIHNwYWNlIGFuZCBoYW5kbGVkIGJ5IGxpYnJhcnkhCisqLworeworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCXN3aXRjaCAoZGV2aWNlX2lkKSB7CisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTAwMDoKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxMDAwX0E6CisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTAwMF9COgorCQkqZGV2aWNlX25hbWUgPSBNRTEwMDBfTkFNRV9ERVZJQ0VfTUUxMDAwOworCQkqZGV2aWNlX2Rlc2NyaXB0aW9uID0gTUUxMDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTEwMDA7CisJCSpkcml2ZXJfbmFtZSA9IE1FMTAwMF9OQU1FX0RSSVZFUjsKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNDAwOgorCQkqZGV2aWNlX25hbWUgPSBNRTE0MDBfTkFNRV9ERVZJQ0VfTUUxNDAwOworCQkqZGV2aWNlX2Rlc2NyaXB0aW9uID0gTUUxNDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTE0MDA7CisJCSpkcml2ZXJfbmFtZSA9IE1FMTQwMF9OQU1FX0RSSVZFUjsKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNDBBOgorCQkqZGV2aWNlX25hbWUgPSBNRTE0MDBfTkFNRV9ERVZJQ0VfTUUxNDAwQTsKKwkJKmRldmljZV9kZXNjcmlwdGlvbiA9IE1FMTQwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUUxNDAwQTsKKwkJKmRyaXZlcl9uYW1lID0gTUUxNDAwX05BTUVfRFJJVkVSOworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE0MEI6CisJCSpkZXZpY2VfbmFtZSA9IE1FMTQwMF9OQU1FX0RFVklDRV9NRTE0MDBCOworCQkqZGV2aWNlX2Rlc2NyaXB0aW9uID0gTUUxNDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTE0MDBCOworCQkqZHJpdmVyX25hbWUgPSBNRTE0MDBfTkFNRV9EUklWRVI7CisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTRFMDoKKwkJKmRldmljZV9uYW1lID0gTUUxNDAwX05BTUVfREVWSUNFX01FMTQwMEU7CisJCSpkZXZpY2VfZGVzY3JpcHRpb24gPSBNRTE0MDBfREVTQ1JJUFRJT05fREVWSUNFX01FMTQwMEU7CisJCSpkcml2ZXJfbmFtZSA9IE1FMTQwMF9OQU1FX0RSSVZFUjsKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNEVBOgorCQkqZGV2aWNlX25hbWUgPSBNRTE0MDBfTkFNRV9ERVZJQ0VfTUUxNDAwRUE7CisJCSpkZXZpY2VfZGVzY3JpcHRpb24gPSBNRTE0MDBfREVTQ1JJUFRJT05fREVWSUNFX01FMTQwMEVBOworCQkqZHJpdmVyX25hbWUgPSBNRTE0MDBfTkFNRV9EUklWRVI7CisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTRFQjoKKwkJKmRldmljZV9uYW1lID0gTUUxNDAwX05BTUVfREVWSUNFX01FMTQwMEVCOworCQkqZGV2aWNlX2Rlc2NyaXB0aW9uID0gTUUxNDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTE0MDBFQjsKKwkJKmRyaXZlcl9uYW1lID0gTUUxNDAwX05BTUVfRFJJVkVSOworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE0MEM6CisJCSpkZXZpY2VfbmFtZSA9IE1FMTQwMF9OQU1FX0RFVklDRV9NRTE0MDBDOworCQkqZGV2aWNlX2Rlc2NyaXB0aW9uID0gTUUxNDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTE0MDBDOworCQkqZHJpdmVyX25hbWUgPSBNRTE0MDBfTkFNRV9EUklWRVI7CisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTQwRDoKKwkJKmRldmljZV9uYW1lID0gTUUxNDAwX05BTUVfREVWSUNFX01FMTQwMEQ7CisJCSpkZXZpY2VfZGVzY3JpcHRpb24gPSBNRTE0MDBfREVTQ1JJUFRJT05fREVWSUNFX01FMTQwMEQ7CisJCSpkcml2ZXJfbmFtZSA9IE1FMTQwMF9OQU1FX0RSSVZFUjsKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNjAwXzRVOgorCQkqZGV2aWNlX25hbWUgPSBNRTE2MDBfTkFNRV9ERVZJQ0VfTUUxNjAwNFU7CisJCSpkZXZpY2VfZGVzY3JpcHRpb24gPSBNRTE2MDBfREVTQ1JJUFRJT05fREVWSUNFX01FMTYwMDRVOworCQkqZHJpdmVyX25hbWUgPSBNRTE2MDBfTkFNRV9EUklWRVI7CisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTYwMF84VToKKwkJKmRldmljZV9uYW1lID0gTUUxNjAwX05BTUVfREVWSUNFX01FMTYwMDhVOworCQkqZGV2aWNlX2Rlc2NyaXB0aW9uID0gTUUxNjAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTE2MDA4VTsKKwkJKmRyaXZlcl9uYW1lID0gTUUxNjAwX05BTUVfRFJJVkVSOworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE2MDBfMTJVOgorCQkqZGV2aWNlX25hbWUgPSBNRTE2MDBfTkFNRV9ERVZJQ0VfTUUxNjAwMTJVOworCQkqZGV2aWNlX2Rlc2NyaXB0aW9uID0gTUUxNjAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTE2MDAxMlU7CisJCSpkcml2ZXJfbmFtZSA9IE1FMTYwMF9OQU1FX0RSSVZFUjsKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNjAwXzE2VToKKwkJKmRldmljZV9uYW1lID0gTUUxNjAwX05BTUVfREVWSUNFX01FMTYwMDE2VTsKKwkJKmRldmljZV9kZXNjcmlwdGlvbiA9IE1FMTYwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUUxNjAwMTZVOworCQkqZHJpdmVyX25hbWUgPSBNRTE2MDBfTkFNRV9EUklWRVI7CisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTYwMF8xNlVfOEk6CisJCSpkZXZpY2VfbmFtZSA9IE1FMTYwMF9OQU1FX0RFVklDRV9NRTE2MDAxNlU4STsKKwkJKmRldmljZV9kZXNjcmlwdGlvbiA9IE1FMTYwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUUxNjAwMTZVOEk7CisJCSpkcml2ZXJfbmFtZSA9IE1FMTYwMF9OQU1FX0RSSVZFUjsKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjEwOgorCQkqZGV2aWNlX25hbWUgPSBNRTQ2MDBfTkFNRV9ERVZJQ0VfTUU0NjEwOworCQkqZGV2aWNlX2Rlc2NyaXB0aW9uID0gTUU0NjAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTQ2MTA7CisJCSpkcml2ZXJfbmFtZSA9IE1FNDYwMF9OQU1FX0RSSVZFUjsKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjUwOgorCQkqZGV2aWNlX25hbWUgPSBNRTQ2MDBfTkFNRV9ERVZJQ0VfTUU0NjUwOworCQkqZGV2aWNlX2Rlc2NyaXB0aW9uID0gTUU0NjAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTQ2NTA7CisJCSpkcml2ZXJfbmFtZSA9IE1FNDYwMF9OQU1FX0RSSVZFUjsKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjYwOgorCQkqZGV2aWNlX25hbWUgPSBNRTQ2MDBfTkFNRV9ERVZJQ0VfTUU0NjYwOworCQkqZGV2aWNlX2Rlc2NyaXB0aW9uID0gTUU0NjAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTQ2NjA7CisJCSpkcml2ZXJfbmFtZSA9IE1FNDYwMF9OQU1FX0RSSVZFUjsKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjYwSToKKwkJKmRldmljZV9uYW1lID0gTUU0NjAwX05BTUVfREVWSUNFX01FNDY2MEk7CisJCSpkZXZpY2VfZGVzY3JpcHRpb24gPSBNRTQ2MDBfREVTQ1JJUFRJT05fREVWSUNFX01FNDY2MEk7CisJCSpkcml2ZXJfbmFtZSA9IE1FNDYwMF9OQU1FX0RSSVZFUjsKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjYwUzoKKwkJKmRldmljZV9uYW1lID0gTUU0NjAwX05BTUVfREVWSUNFX01FNDY2MFM7CisJCSpkZXZpY2VfZGVzY3JpcHRpb24gPSBNRTQ2MDBfREVTQ1JJUFRJT05fREVWSUNFX01FNDY2MFM7CisJCSpkcml2ZXJfbmFtZSA9IE1FNDYwMF9OQU1FX0RSSVZFUjsKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjYwSVM6CisJCSpkZXZpY2VfbmFtZSA9IE1FNDYwMF9OQU1FX0RFVklDRV9NRTQ2NjBJUzsKKwkJKmRldmljZV9kZXNjcmlwdGlvbiA9IE1FNDYwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU0NjYwSVM7CisJCSpkcml2ZXJfbmFtZSA9IE1FNDYwMF9OQU1FX0RSSVZFUjsKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjcwOgorCQkqZGV2aWNlX25hbWUgPSBNRTQ2MDBfTkFNRV9ERVZJQ0VfTUU0NjcwOworCQkqZGV2aWNlX2Rlc2NyaXB0aW9uID0gTUU0NjAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTQ2NzA7CisJCSpkcml2ZXJfbmFtZSA9IE1FNDYwMF9OQU1FX0RSSVZFUjsKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjcwSToKKwkJKmRldmljZV9uYW1lID0gTUU0NjAwX05BTUVfREVWSUNFX01FNDY3MEk7CisJCSpkZXZpY2VfZGVzY3JpcHRpb24gPSBNRTQ2MDBfREVTQ1JJUFRJT05fREVWSUNFX01FNDY3MEk7CisJCSpkcml2ZXJfbmFtZSA9IE1FNDYwMF9OQU1FX0RSSVZFUjsKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjcwUzoKKwkJKmRldmljZV9uYW1lID0gTUU0NjAwX05BTUVfREVWSUNFX01FNDY3MFM7CisJCSpkZXZpY2VfZGVzY3JpcHRpb24gPSBNRTQ2MDBfREVTQ1JJUFRJT05fREVWSUNFX01FNDY3MFM7CisJCSpkcml2ZXJfbmFtZSA9IE1FNDYwMF9OQU1FX0RSSVZFUjsKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjcwSVM6CisJCSpkZXZpY2VfbmFtZSA9IE1FNDYwMF9OQU1FX0RFVklDRV9NRTQ2NzBJUzsKKwkJKmRldmljZV9kZXNjcmlwdGlvbiA9IE1FNDYwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU0NjcwSVM7CisJCSpkcml2ZXJfbmFtZSA9IE1FNDYwMF9OQU1FX0RSSVZFUjsKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjgwOgorCQkqZGV2aWNlX25hbWUgPSBNRTQ2MDBfTkFNRV9ERVZJQ0VfTUU0NjgwOworCQkqZGV2aWNlX2Rlc2NyaXB0aW9uID0gTUU0NjAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTQ2ODA7CisJCSpkcml2ZXJfbmFtZSA9IE1FNDYwMF9OQU1FX0RSSVZFUjsKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjgwSToKKwkJKmRldmljZV9uYW1lID0gTUU0NjAwX05BTUVfREVWSUNFX01FNDY4MEk7CisJCSpkZXZpY2VfZGVzY3JpcHRpb24gPSBNRTQ2MDBfREVTQ1JJUFRJT05fREVWSUNFX01FNDY4MEk7CisJCSpkcml2ZXJfbmFtZSA9IE1FNDYwMF9OQU1FX0RSSVZFUjsKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjgwUzoKKwkJKmRldmljZV9uYW1lID0gTUU0NjAwX05BTUVfREVWSUNFX01FNDY4MFM7CisJCSpkZXZpY2VfZGVzY3JpcHRpb24gPSBNRTQ2MDBfREVTQ1JJUFRJT05fREVWSUNFX01FNDY4MFM7CisJCSpkcml2ZXJfbmFtZSA9IE1FNDYwMF9OQU1FX0RSSVZFUjsKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjgwSVM6CisJCSpkZXZpY2VfbmFtZSA9IE1FNDYwMF9OQU1FX0RFVklDRV9NRTQ2ODBJUzsKKwkJKmRldmljZV9kZXNjcmlwdGlvbiA9IE1FNDYwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU0NjgwSVM7CisJCSpkcml2ZXJfbmFtZSA9IE1FNDYwMF9OQU1FX0RSSVZFUjsKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDA0OgorCQkqZGV2aWNlX25hbWUgPSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MDAwNDsKKwkJKmRldmljZV9kZXNjcmlwdGlvbiA9IE1FNjAwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU2MDAwNDsKKwkJKmRyaXZlcl9uYW1lID0gTUU2MDAwX05BTUVfRFJJVkVSOworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwMDg6CisJCSpkZXZpY2VfbmFtZSA9IE1FNjAwMF9OQU1FX0RFVklDRV9NRTYwMDA4OworCQkqZGV2aWNlX2Rlc2NyaXB0aW9uID0gTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYwMDA4OworCQkqZHJpdmVyX25hbWUgPSBNRTYwMDBfTkFNRV9EUklWRVI7CisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjAwRjoKKwkJKmRldmljZV9uYW1lID0gTUU2MDAwX05BTUVfREVWSUNFX01FNjAwMDE2OworCQkqZGV2aWNlX2Rlc2NyaXB0aW9uID0gTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYwMDAxNjsKKwkJKmRyaXZlcl9uYW1lID0gTUU2MDAwX05BTUVfRFJJVkVSOworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwMTQ6CisJCSpkZXZpY2VfbmFtZSA9IE1FNjAwMF9OQU1FX0RFVklDRV9NRTYwMDBJNDsKKwkJKmRldmljZV9kZXNjcmlwdGlvbiA9IE1FNjAwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU2MDAwSTQ7CisJCSpkcml2ZXJfbmFtZSA9IE1FNjAwMF9OQU1FX0RSSVZFUjsKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDE4OgorCQkqZGV2aWNlX25hbWUgPSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MDAwSTg7CisJCSpkZXZpY2VfZGVzY3JpcHRpb24gPSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjAwMEk4OworCQkqZHJpdmVyX25hbWUgPSBNRTYwMDBfTkFNRV9EUklWRVI7CisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjAxRjoKKwkJKmRldmljZV9uYW1lID0gTUU2MDAwX05BTUVfREVWSUNFX01FNjAwMEkxNjsKKwkJKmRldmljZV9kZXNjcmlwdGlvbiA9IE1FNjAwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU2MDAwSTE2OworCQkqZHJpdmVyX25hbWUgPSBNRTYwMDBfTkFNRV9EUklWRVI7CisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjAzNDoKKwkJKmRldmljZV9uYW1lID0gTUU2MDAwX05BTUVfREVWSUNFX01FNjAwMElTTEU0OworCQkqZGV2aWNlX2Rlc2NyaXB0aW9uID0gTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYwMDBJU0xFNDsKKwkJKmRyaXZlcl9uYW1lID0gTUU2MDAwX05BTUVfRFJJVkVSOworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwMzg6CisJCSpkZXZpY2VfbmFtZSA9IE1FNjAwMF9OQU1FX0RFVklDRV9NRTYwMDBJU0xFODsKKwkJKmRldmljZV9kZXNjcmlwdGlvbiA9IE1FNjAwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU2MDAwSVNMRTg7CisJCSpkcml2ZXJfbmFtZSA9IE1FNjAwMF9OQU1FX0RSSVZFUjsKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDNGOgorCQkqZGV2aWNlX25hbWUgPSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MDAwSVNMRTE2OworCQkqZGV2aWNlX2Rlc2NyaXB0aW9uID0gTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYwMDBJU0xFMTY7CisJCSpkcml2ZXJfbmFtZSA9IE1FNjAwMF9OQU1FX0RSSVZFUjsKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTA0OgorCQkqZGV2aWNlX25hbWUgPSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MTAwNDsKKwkJKmRldmljZV9kZXNjcmlwdGlvbiA9IE1FNjAwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU2MTAwNDsKKwkJKmRyaXZlcl9uYW1lID0gTUU2MDAwX05BTUVfRFJJVkVSOworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYxMDg6CisJCSpkZXZpY2VfbmFtZSA9IE1FNjAwMF9OQU1FX0RFVklDRV9NRTYxMDA4OworCQkqZGV2aWNlX2Rlc2NyaXB0aW9uID0gTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYxMDA4OworCQkqZHJpdmVyX25hbWUgPSBNRTYwMDBfTkFNRV9EUklWRVI7CisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjEwRjoKKwkJKmRldmljZV9uYW1lID0gTUU2MDAwX05BTUVfREVWSUNFX01FNjEwMDE2OworCQkqZGV2aWNlX2Rlc2NyaXB0aW9uID0gTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYxMDAxNjsKKwkJKmRyaXZlcl9uYW1lID0gTUU2MDAwX05BTUVfRFJJVkVSOworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYxMTQ6CisJCSpkZXZpY2VfbmFtZSA9IE1FNjAwMF9OQU1FX0RFVklDRV9NRTYxMDBJNDsKKwkJKmRldmljZV9kZXNjcmlwdGlvbiA9IE1FNjAwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU2MTAwSTQ7CisJCSpkcml2ZXJfbmFtZSA9IE1FNjAwMF9OQU1FX0RSSVZFUjsKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTE4OgorCQkqZGV2aWNlX25hbWUgPSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MTAwSTg7CisJCSpkZXZpY2VfZGVzY3JpcHRpb24gPSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjEwMEk4OworCQkqZHJpdmVyX25hbWUgPSBNRTYwMDBfTkFNRV9EUklWRVI7CisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjExRjoKKwkJKmRldmljZV9uYW1lID0gTUU2MDAwX05BTUVfREVWSUNFX01FNjEwMEkxNjsKKwkJKmRldmljZV9kZXNjcmlwdGlvbiA9IE1FNjAwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU2MTAwSTE2OworCQkqZHJpdmVyX25hbWUgPSBNRTYwMDBfTkFNRV9EUklWRVI7CisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjEzNDoKKwkJKmRldmljZV9uYW1lID0gTUU2MDAwX05BTUVfREVWSUNFX01FNjEwMElTTEU0OworCQkqZGV2aWNlX2Rlc2NyaXB0aW9uID0gTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYxMDBJU0xFNDsKKwkJKmRyaXZlcl9uYW1lID0gTUU2MDAwX05BTUVfRFJJVkVSOworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYxMzg6CisJCSpkZXZpY2VfbmFtZSA9IE1FNjAwMF9OQU1FX0RFVklDRV9NRTYxMDBJU0xFODsKKwkJKmRldmljZV9kZXNjcmlwdGlvbiA9IE1FNjAwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU2MTAwSVNMRTg7CisJCSpkcml2ZXJfbmFtZSA9IE1FNjAwMF9OQU1FX0RSSVZFUjsKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTNGOgorCQkqZGV2aWNlX25hbWUgPSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MTAwSVNMRTE2OworCQkqZGV2aWNlX2Rlc2NyaXB0aW9uID0gTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYxMDBJU0xFMTY7CisJCSpkcml2ZXJfbmFtZSA9IE1FNjAwMF9OQU1FX0RSSVZFUjsKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDQ0OgorCQkqZGV2aWNlX25hbWUgPSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MDAwNERJTzsKKwkJKmRldmljZV9kZXNjcmlwdGlvbiA9IE1FNjAwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU2MDAwNERJTzsKKwkJKmRyaXZlcl9uYW1lID0gTUU2MDAwX05BTUVfRFJJVkVSOworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwNDg6CisJCSpkZXZpY2VfbmFtZSA9IE1FNjAwMF9OQU1FX0RFVklDRV9NRTYwMDA4RElPOworCQkqZGV2aWNlX2Rlc2NyaXB0aW9uID0gTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYwMDA4RElPOworCQkqZHJpdmVyX25hbWUgPSBNRTYwMDBfTkFNRV9EUklWRVI7CisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjA0RjoKKwkJKmRldmljZV9uYW1lID0gTUU2MDAwX05BTUVfREVWSUNFX01FNjAwMDE2RElPOworCQkqZGV2aWNlX2Rlc2NyaXB0aW9uID0gTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYwMDAxNkRJTzsKKwkJKmRyaXZlcl9uYW1lID0gTUU2MDAwX05BTUVfRFJJVkVSOworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwNTQ6CisJCSpkZXZpY2VfbmFtZSA9IE1FNjAwMF9OQU1FX0RFVklDRV9NRTYwMDBJNERJTzsKKwkJKmRldmljZV9kZXNjcmlwdGlvbiA9IE1FNjAwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU2MDAwSTRESU87CisJCSpkcml2ZXJfbmFtZSA9IE1FNjAwMF9OQU1FX0RSSVZFUjsKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDU4OgorCQkqZGV2aWNlX25hbWUgPSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MDAwSThESU87CisJCSpkZXZpY2VfZGVzY3JpcHRpb24gPSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjAwMEk4RElPOworCQkqZHJpdmVyX25hbWUgPSBNRTYwMDBfTkFNRV9EUklWRVI7CisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjA1RjoKKwkJKmRldmljZV9uYW1lID0gTUU2MDAwX05BTUVfREVWSUNFX01FNjAwMEkxNkRJTzsKKwkJKmRldmljZV9kZXNjcmlwdGlvbiA9IE1FNjAwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU2MDAwSTE2RElPOworCQkqZHJpdmVyX25hbWUgPSBNRTYwMDBfTkFNRV9EUklWRVI7CisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjA3NDoKKwkJKmRldmljZV9uYW1lID0gTUU2MDAwX05BTUVfREVWSUNFX01FNjAwMElTTEU0RElPOworCQkqZGV2aWNlX2Rlc2NyaXB0aW9uID0gTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYwMDBJU0xFNERJTzsKKwkJKmRyaXZlcl9uYW1lID0gTUU2MDAwX05BTUVfRFJJVkVSOworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwNzg6CisJCSpkZXZpY2VfbmFtZSA9IE1FNjAwMF9OQU1FX0RFVklDRV9NRTYwMDBJU0xFOERJTzsKKwkJKmRldmljZV9kZXNjcmlwdGlvbiA9IE1FNjAwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU2MDAwSVNMRThESU87CisJCSpkcml2ZXJfbmFtZSA9IE1FNjAwMF9OQU1FX0RSSVZFUjsKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDdGOgorCQkqZGV2aWNlX25hbWUgPSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MDAwSVNMRTE2RElPOworCQkqZGV2aWNlX2Rlc2NyaXB0aW9uID0gTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYwMDBJU0xFMTZESU87CisJCSpkcml2ZXJfbmFtZSA9IE1FNjAwMF9OQU1FX0RSSVZFUjsKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTQ0OgorCQkqZGV2aWNlX25hbWUgPSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MTAwNERJTzsKKwkJKmRldmljZV9kZXNjcmlwdGlvbiA9IE1FNjAwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU2MTAwNERJTzsKKwkJKmRyaXZlcl9uYW1lID0gTUU2MDAwX05BTUVfRFJJVkVSOworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYxNDg6CisJCSpkZXZpY2VfbmFtZSA9IE1FNjAwMF9OQU1FX0RFVklDRV9NRTYxMDA4RElPOworCQkqZGV2aWNlX2Rlc2NyaXB0aW9uID0gTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYxMDA4RElPOworCQkqZHJpdmVyX25hbWUgPSBNRTYwMDBfTkFNRV9EUklWRVI7CisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjE0RjoKKwkJKmRldmljZV9uYW1lID0gTUU2MDAwX05BTUVfREVWSUNFX01FNjEwMDE2RElPOworCQkqZGV2aWNlX2Rlc2NyaXB0aW9uID0gTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYxMDAxNkRJTzsKKwkJKmRyaXZlcl9uYW1lID0gTUU2MDAwX05BTUVfRFJJVkVSOworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYxNTQ6CisJCSpkZXZpY2VfbmFtZSA9IE1FNjAwMF9OQU1FX0RFVklDRV9NRTYxMDBJNERJTzsKKwkJKmRldmljZV9kZXNjcmlwdGlvbiA9IE1FNjAwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU2MTAwSTRESU87CisJCSpkcml2ZXJfbmFtZSA9IE1FNjAwMF9OQU1FX0RSSVZFUjsKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTU4OgorCQkqZGV2aWNlX25hbWUgPSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MTAwSThESU87CisJCSpkZXZpY2VfZGVzY3JpcHRpb24gPSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjEwMEk4RElPOworCQkqZHJpdmVyX25hbWUgPSBNRTYwMDBfTkFNRV9EUklWRVI7CisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjE1RjoKKwkJKmRldmljZV9uYW1lID0gTUU2MDAwX05BTUVfREVWSUNFX01FNjEwMEkxNkRJTzsKKwkJKmRldmljZV9kZXNjcmlwdGlvbiA9IE1FNjAwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU2MTAwSTE2RElPOworCQkqZHJpdmVyX25hbWUgPSBNRTYwMDBfTkFNRV9EUklWRVI7CisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjE3NDoKKwkJKmRldmljZV9uYW1lID0gTUU2MDAwX05BTUVfREVWSUNFX01FNjEwMElTTEU0RElPOworCQkqZGV2aWNlX2Rlc2NyaXB0aW9uID0gTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYxMDBJU0xFNERJTzsKKwkJKmRyaXZlcl9uYW1lID0gTUU2MDAwX05BTUVfRFJJVkVSOworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYxNzg6CisJCSpkZXZpY2VfbmFtZSA9IE1FNjAwMF9OQU1FX0RFVklDRV9NRTYxMDBJU0xFOERJTzsKKwkJKmRldmljZV9kZXNjcmlwdGlvbiA9IE1FNjAwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU2MTAwSVNMRThESU87CisJCSpkcml2ZXJfbmFtZSA9IE1FNjAwMF9OQU1FX0RSSVZFUjsKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTdGOgorCQkqZGV2aWNlX25hbWUgPSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MTAwSVNMRTE2RElPOworCQkqZGV2aWNlX2Rlc2NyaXB0aW9uID0gTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYxMDBJU0xFMTZESU87CisJCSpkcml2ZXJfbmFtZSA9IE1FNjAwMF9OQU1FX0RSSVZFUjsKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MjU5OgorCQkqZGV2aWNlX25hbWUgPSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MjAwSTlESU87CisJCSpkZXZpY2VfZGVzY3JpcHRpb24gPSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjIwMEk5RElPOworCQkqZHJpdmVyX25hbWUgPSBNRTYwMDBfTkFNRV9EUklWRVI7CisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjM1OToKKwkJKmRldmljZV9uYW1lID0gTUU2MDAwX05BTUVfREVWSUNFX01FNjMwMEk5RElPOworCQkqZGV2aWNlX2Rlc2NyaXB0aW9uID0gTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYzMDBJOURJTzsKKwkJKmRyaXZlcl9uYW1lID0gTUU2MDAwX05BTUVfRFJJVkVSOworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTA2MzA6CisJCSpkZXZpY2VfbmFtZSA9IE1FMDYwMF9OQU1FX0RFVklDRV9NRTA2MzA7CisJCSpkZXZpY2VfZGVzY3JpcHRpb24gPSBNRTA2MDBfREVTQ1JJUFRJT05fREVWSUNFX01FMDYzMDsKKwkJKmRyaXZlcl9uYW1lID0gTUUwNjAwX05BTUVfRFJJVkVSOworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTgxMDBfQToKKwkJKmRldmljZV9uYW1lID0gTUU4MTAwX05BTUVfREVWSUNFX01FODEwMEE7CisJCSpkZXZpY2VfZGVzY3JpcHRpb24gPSBNRTgxMDBfREVTQ1JJUFRJT05fREVWSUNFX01FODEwMEE7CisJCSpkcml2ZXJfbmFtZSA9IE1FODEwMF9OQU1FX0RSSVZFUjsKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU4MTAwX0I6CisJCSpkZXZpY2VfbmFtZSA9IE1FODEwMF9OQU1FX0RFVklDRV9NRTgxMDBCOworCQkqZGV2aWNlX2Rlc2NyaXB0aW9uID0gTUU4MTAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTgxMDBCOworCQkqZHJpdmVyX25hbWUgPSBNRTgxMDBfTkFNRV9EUklWRVI7CisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FODIwMF9BOgorCQkqZGV2aWNlX25hbWUgPSBNRTgyMDBfTkFNRV9ERVZJQ0VfTUU4MjAwQTsKKwkJKmRldmljZV9kZXNjcmlwdGlvbiA9IE1FODIwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU4MjAwQTsKKwkJKmRyaXZlcl9uYW1lID0gTUU4MjAwX05BTUVfRFJJVkVSOworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTgyMDBfQjoKKwkJKmRldmljZV9uYW1lID0gTUU4MjAwX05BTUVfREVWSUNFX01FODIwMEI7CisJCSpkZXZpY2VfZGVzY3JpcHRpb24gPSBNRTgyMDBfREVTQ1JJUFRJT05fREVWSUNFX01FODIwMEI7CisJCSpkcml2ZXJfbmFtZSA9IE1FODIwMF9OQU1FX0RSSVZFUjsKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUwOTQwOgorCQkqZGV2aWNlX25hbWUgPSBNRTA5MDBfTkFNRV9ERVZJQ0VfTUUwOTQwOworCQkqZGV2aWNlX2Rlc2NyaXB0aW9uID0gTUUwOTAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTA5NDA7CisJCSpkcml2ZXJfbmFtZSA9IE1FMDkwMF9OQU1FX0RSSVZFUjsKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUwOTUwOgorCQkqZGV2aWNlX25hbWUgPSBNRTA5MDBfTkFNRV9ERVZJQ0VfTUUwOTUwOworCQkqZGV2aWNlX2Rlc2NyaXB0aW9uID0gTUUwOTAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTA5NTA7CisJCSpkcml2ZXJfbmFtZSA9IE1FMDkwMF9OQU1FX0RSSVZFUjsKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUwOTYwOgorCQkqZGV2aWNlX25hbWUgPSBNRTA5MDBfTkFNRV9ERVZJQ0VfTUUwOTYwOworCQkqZGV2aWNlX2Rlc2NyaXB0aW9uID0gTUUwOTAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTA5NjA7CisJCSpkcml2ZXJfbmFtZSA9IE1FMDkwMF9OQU1FX0RSSVZFUjsKKwkJYnJlYWs7CisvKgorCQljYXNlIFVTQl9ERVZJQ0VfSURfTUVQSElTVE9fUzE6CisJCQkqZGV2aWNlX25hbWUgPSBNRVBISVNUT19TMV9OQU1FX0RFVklDRTsKKwkJCSpkZXZpY2VfZGVzY3JpcHRpb24gPSBNRVBISVNUT19TMV9ERVNDUklQVElPTl9ERVZJQ0U7CisJCQkqZHJpdmVyX25hbWUgPSBNRVBISVNUT19TMV9OQU1FX0RSSVZFUjsKKwkJCWJyZWFrOworKi8KKwlkZWZhdWx0OgorCQkqZGV2aWNlX25hbWUgPSBFTVBUWV9OQU1FX0RFVklDRTsKKwkJKmRldmljZV9kZXNjcmlwdGlvbiA9IEVNUFRZX0RFU0NSSVBUSU9OX0RFVklDRTsKKwkJKmRyaXZlcl9uYW1lID0gRU1QVFlfTkFNRV9EUklWRVI7CisKKwkJUEVSUk9SKCJJbnZhbGlkIGRldmljZSBpZC5cbiIpOworCisJCXJldHVybiAxOworCX0KKworCXJldHVybiAwOworfQorCitpbnQgbWVfZGV2aWNlX3BjaV9pbml0KG1lX2RldmljZV90ICogbWVfZGV2aWNlLCBzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldmljZSkKK3sKKwlpbnQgZXJyOworCWludCBpOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJLy8gSW5pdGlhbGl6ZSBkZXZpY2UgbGlzdCBoZWFkLgorCUlOSVRfTElTVF9IRUFEKCZtZV9kZXZpY2UtPmxpc3QpOworCisJLy8gSW5pdGlhbGl6ZSBkZXZpY2UgZGVzY3JpcHRpb24gc3RyaW5ncy4KKwllcnIgPSBnZXRfZGV2aWNlX2Rlc2NyaXB0aW9ucyhwY2lfZGV2aWNlLT5kZXZpY2UsCisJCQkJICAgICAgJm1lX2RldmljZS0+ZGV2aWNlX25hbWUsCisJCQkJICAgICAgJm1lX2RldmljZS0+ZGV2aWNlX2Rlc2NyaXB0aW9uLAorCQkJCSAgICAgICZtZV9kZXZpY2UtPmRyaXZlcl9uYW1lKTsKKworCWlmIChlcnIpIHsKKwkJUEVSUk9SKCJDYW5ub3QgaW5pdGlhbGl6ZSBkZXZpY2UgZGVzY3JpcHRpb24gc3RyaW5ncy5cbiIpOworCQlyZXR1cm4gMTsKKwl9CisJLy8gRW5hYmxlIHRoZSBwY2kgZGV2aWNlLgorCWVyciA9IHBjaV9lbmFibGVfZGV2aWNlKHBjaV9kZXZpY2UpOworCisJaWYgKGVyciA8IDApIHsKKwkJUEVSUk9SKCJDYW5ub3QgZW5hYmxlIFBDSSBkZXZpY2UuXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCS8vIFJlcXVlc3QgdGhlIFBDSSByZWdpc3RlciByZWdpb25zLgorCWVyciA9IHBjaV9yZXF1ZXN0X3JlZ2lvbnMocGNpX2RldmljZSwgbWVfZGV2aWNlLT5kZXZpY2VfbmFtZSk7CisKKwlpZiAoZXJyIDwgMCkgeworCQlQRVJST1IoIkNhbm5vdCByZXF1ZXN0IFBDSSByZWdpb25zLlxuIik7CisJCWdvdG8gRVJST1JfMDsKKwl9CisJLy8gVGhlIGJ1cyBjYXJyeWluZyB0aGUgZGV2aWNlIGlzIGEgUENJIGJ1cy4KKwltZV9kZXZpY2UtPmJ1c190eXBlID0gTUVfQlVTX1RZUEVfUENJOworCisJLy8gU3RvcmUgdGhlIFBDSSBpbmZvcm1hdGlvbiBmb3IgbGF0ZXIgdXNhZ2UuCisJbWVfZGV2aWNlLT5pbmZvLnBjaS5wY2lfZGV2aWNlID0gcGNpX2RldmljZTsKKworCS8vIEdldCBQQ0kgcmVnaXN0ZXIgYmFzZXMgYW5kIHNpemVzLgorCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHsKKwkJbWVfZGV2aWNlLT5pbmZvLnBjaS5yZWdfYmFzZXNbaV0gPQorCQkgICAgcGNpX3Jlc291cmNlX3N0YXJ0KHBjaV9kZXZpY2UsIGkpOworCQltZV9kZXZpY2UtPmluZm8ucGNpLnJlZ19zaXplc1tpXSA9CisJCSAgICBwY2lfcmVzb3VyY2VfbGVuKHBjaV9kZXZpY2UsIGkpOworCX0KKworCS8vIEdldCB0aGUgUENJIGxvY2F0aW9uLgorCW1lX2RldmljZS0+aW5mby5wY2kucGNpX2J1c19ubyA9IHBjaV9kZXZpY2UtPmJ1cy0+bnVtYmVyOworCW1lX2RldmljZS0+aW5mby5wY2kucGNpX2Rldl9ubyA9IFBDSV9TTE9UKHBjaV9kZXZpY2UtPmRldmZuKTsKKwltZV9kZXZpY2UtPmluZm8ucGNpLnBjaV9mdW5jX25vID0gUENJX0ZVTkMocGNpX2RldmljZS0+ZGV2Zm4pOworCisJLy8gR2V0IE1laWxoYXVzIHNwZWNpZmljIGRldmljZSBpbmZvcm1hdGlvbi4KKwltZV9kZXZpY2UtPmluZm8ucGNpLnZlbmRvcl9pZCA9IHBjaV9kZXZpY2UtPnZlbmRvcjsKKwltZV9kZXZpY2UtPmluZm8ucGNpLmRldmljZV9pZCA9IHBjaV9kZXZpY2UtPmRldmljZTsKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShwY2lfZGV2aWNlLCAweDA4LAorCQkJICAgICAmbWVfZGV2aWNlLT5pbmZvLnBjaS5od19yZXZpc2lvbik7CisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBjaV9kZXZpY2UsIDB4MkMsICZtZV9kZXZpY2UtPmluZm8ucGNpLnNlcmlhbF9ubyk7CisKKwkvLyBHZXQgdGhlIGludGVycnVwdCByZXF1ZXN0IG51bWJlci4KKwltZV9kZXZpY2UtPmlycSA9IHBjaV9kZXZpY2UtPmlycTsKKworCS8vIEluaXRpYWxpemUgZGV2aWNlIGxvY2sgaW5zdGFuY2UuCisJZXJyID0gbWVfZGxvY2tfaW5pdCgmbWVfZGV2aWNlLT5kbG9jayk7CisKKwlpZiAoZXJyKSB7CisJCVBFUlJPUigiQ2Fubm90IGluaXRpYWxpemUgZGV2aWNlIGxvY2sgaW5zdGFuY2UuXG4iKTsKKwkJZ290byBFUlJPUl8xOworCX0KKwkvLyBJbml0aWFsaXplIHN1YmRldmljZSBsaXN0IGluc3RhbmNlLgorCW1lX3NsaXN0X2luaXQoJm1lX2RldmljZS0+c2xpc3QpOworCisJaWYgKGVycikgeworCQlQRVJST1IoIkNhbm5vdCBpbml0aWFsaXplIHN1YmRldmljZSBsaXN0IGluc3RhbmNlLlxuIik7CisJCWdvdG8gRVJST1JfMjsKKwl9CisJLy8gSW5pdGlhbGl6ZSBtZXRob2QgcG9pbnRlcnMuCisJbWVfZGV2aWNlLT5tZV9kZXZpY2VfaW9faXJxX3N0YXJ0ID0gbWVfZGV2aWNlX2lvX2lycV9zdGFydDsKKwltZV9kZXZpY2UtPm1lX2RldmljZV9pb19pcnFfd2FpdCA9IG1lX2RldmljZV9pb19pcnFfd2FpdDsKKwltZV9kZXZpY2UtPm1lX2RldmljZV9pb19pcnFfc3RvcCA9IG1lX2RldmljZV9pb19pcnFfc3RvcDsKKwltZV9kZXZpY2UtPm1lX2RldmljZV9pb19yZXNldF9kZXZpY2UgPSBtZV9kZXZpY2VfaW9fcmVzZXRfZGV2aWNlOworCW1lX2RldmljZS0+bWVfZGV2aWNlX2lvX3Jlc2V0X3N1YmRldmljZSA9IG1lX2RldmljZV9pb19yZXNldF9zdWJkZXZpY2U7CisJbWVfZGV2aWNlLT5tZV9kZXZpY2VfaW9fc2luZ2xlX2NvbmZpZyA9IG1lX2RldmljZV9pb19zaW5nbGVfY29uZmlnOworCW1lX2RldmljZS0+bWVfZGV2aWNlX2lvX3NpbmdsZV9yZWFkID0gbWVfZGV2aWNlX2lvX3NpbmdsZV9yZWFkOworCW1lX2RldmljZS0+bWVfZGV2aWNlX2lvX3NpbmdsZV93cml0ZSA9IG1lX2RldmljZV9pb19zaW5nbGVfd3JpdGU7CisJbWVfZGV2aWNlLT5tZV9kZXZpY2VfaW9fc3RyZWFtX2NvbmZpZyA9IG1lX2RldmljZV9pb19zdHJlYW1fY29uZmlnOworCW1lX2RldmljZS0+bWVfZGV2aWNlX2lvX3N0cmVhbV9uZXdfdmFsdWVzID0KKwkgICAgbWVfZGV2aWNlX2lvX3N0cmVhbV9uZXdfdmFsdWVzOworCW1lX2RldmljZS0+bWVfZGV2aWNlX2lvX3N0cmVhbV9yZWFkID0gbWVfZGV2aWNlX2lvX3N0cmVhbV9yZWFkOworCW1lX2RldmljZS0+bWVfZGV2aWNlX2lvX3N0cmVhbV9zdGFydCA9IG1lX2RldmljZV9pb19zdHJlYW1fc3RhcnQ7CisJbWVfZGV2aWNlLT5tZV9kZXZpY2VfaW9fc3RyZWFtX3N0YXR1cyA9IG1lX2RldmljZV9pb19zdHJlYW1fc3RhdHVzOworCW1lX2RldmljZS0+bWVfZGV2aWNlX2lvX3N0cmVhbV9zdG9wID0gbWVfZGV2aWNlX2lvX3N0cmVhbV9zdG9wOworCW1lX2RldmljZS0+bWVfZGV2aWNlX2lvX3N0cmVhbV93cml0ZSA9IG1lX2RldmljZV9pb19zdHJlYW1fd3JpdGU7CisJbWVfZGV2aWNlLT5tZV9kZXZpY2VfbG9ja19kZXZpY2UgPSBtZV9kZXZpY2VfbG9ja19kZXZpY2U7CisJbWVfZGV2aWNlLT5tZV9kZXZpY2VfbG9ja19zdWJkZXZpY2UgPSBtZV9kZXZpY2VfbG9ja19zdWJkZXZpY2U7CisJbWVfZGV2aWNlLT5tZV9kZXZpY2VfcXVlcnlfZGVzY3JpcHRpb25fZGV2aWNlID0KKwkgICAgbWVfZGV2aWNlX3F1ZXJ5X2Rlc2NyaXB0aW9uX2RldmljZTsKKwltZV9kZXZpY2UtPm1lX2RldmljZV9xdWVyeV9pbmZvX2RldmljZSA9IG1lX2RldmljZV9xdWVyeV9pbmZvX2RldmljZTsKKwltZV9kZXZpY2UtPm1lX2RldmljZV9xdWVyeV9uYW1lX2RldmljZSA9IG1lX2RldmljZV9xdWVyeV9uYW1lX2RldmljZTsKKwltZV9kZXZpY2UtPm1lX2RldmljZV9xdWVyeV9uYW1lX2RldmljZV9kcml2ZXIgPQorCSAgICBtZV9kZXZpY2VfcXVlcnlfbmFtZV9kZXZpY2VfZHJpdmVyOworCW1lX2RldmljZS0+bWVfZGV2aWNlX3F1ZXJ5X251bWJlcl9zdWJkZXZpY2VzID0KKwkgICAgbWVfZGV2aWNlX3F1ZXJ5X251bWJlcl9zdWJkZXZpY2VzOworCW1lX2RldmljZS0+bWVfZGV2aWNlX3F1ZXJ5X251bWJlcl9jaGFubmVscyA9CisJICAgIG1lX2RldmljZV9xdWVyeV9udW1iZXJfY2hhbm5lbHM7CisJbWVfZGV2aWNlLT5tZV9kZXZpY2VfcXVlcnlfbnVtYmVyX3JhbmdlcyA9CisJICAgIG1lX2RldmljZV9xdWVyeV9udW1iZXJfcmFuZ2VzOworCW1lX2RldmljZS0+bWVfZGV2aWNlX3F1ZXJ5X3JhbmdlX2J5X21pbl9tYXggPQorCSAgICBtZV9kZXZpY2VfcXVlcnlfcmFuZ2VfYnlfbWluX21heDsKKwltZV9kZXZpY2UtPm1lX2RldmljZV9xdWVyeV9yYW5nZV9pbmZvID0gbWVfZGV2aWNlX3F1ZXJ5X3JhbmdlX2luZm87CisJbWVfZGV2aWNlLT5tZV9kZXZpY2VfcXVlcnlfc3ViZGV2aWNlX2J5X3R5cGUgPQorCSAgICBtZV9kZXZpY2VfcXVlcnlfc3ViZGV2aWNlX2J5X3R5cGU7CisJbWVfZGV2aWNlLT5tZV9kZXZpY2VfcXVlcnlfc3ViZGV2aWNlX3R5cGUgPQorCSAgICBtZV9kZXZpY2VfcXVlcnlfc3ViZGV2aWNlX3R5cGU7CisJbWVfZGV2aWNlLT5tZV9kZXZpY2VfcXVlcnlfc3ViZGV2aWNlX2NhcHMgPQorCSAgICBtZV9kZXZpY2VfcXVlcnlfc3ViZGV2aWNlX2NhcHM7CisJbWVfZGV2aWNlLT5tZV9kZXZpY2VfcXVlcnlfc3ViZGV2aWNlX2NhcHNfYXJncyA9CisJICAgIG1lX2RldmljZV9xdWVyeV9zdWJkZXZpY2VfY2Fwc19hcmdzOworCW1lX2RldmljZS0+bWVfZGV2aWNlX3F1ZXJ5X3RpbWVyID0gbWVfZGV2aWNlX3F1ZXJ5X3RpbWVyOworCW1lX2RldmljZS0+bWVfZGV2aWNlX3F1ZXJ5X3ZlcnNpb25fZGV2aWNlX2RyaXZlciA9CisJICAgIG1lX2RldmljZV9xdWVyeV92ZXJzaW9uX2RldmljZV9kcml2ZXI7CisJbWVfZGV2aWNlLT5tZV9kZXZpY2VfY29uZmlnX2xvYWQgPSBtZV9kZXZpY2VfY29uZmlnX2xvYWQ7CisJbWVfZGV2aWNlLT5tZV9kZXZpY2VfZGVzdHJ1Y3RvciA9IG1lX2RldmljZV9kZXN0cnVjdG9yOworCisJcmV0dXJuIDA7CisKKyAgICAgIEVSUk9SXzA6CisJbWVfZGxvY2tfZGVpbml0KCZtZV9kZXZpY2UtPmRsb2NrKTsKKworICAgICAgRVJST1JfMToKKwlwY2lfcmVsZWFzZV9yZWdpb25zKHBjaV9kZXZpY2UpOworCisgICAgICBFUlJPUl8yOgorCXBjaV9kaXNhYmxlX2RldmljZShwY2lfZGV2aWNlKTsKKworCXJldHVybiAxOworfQorCit2b2lkIG1lX2RldmljZV9kZWluaXQobWVfZGV2aWNlX3QgKiBtZV9kZXZpY2UpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJbWVfc2xpc3RfZGVpbml0KCZtZV9kZXZpY2UtPnNsaXN0KTsKKwltZV9kbG9ja19kZWluaXQoJm1lX2RldmljZS0+ZGxvY2spOworCisJaWYgKG1lX2RldmljZS0+YnVzX3R5cGUgPT0gTUVfQlVTX1RZUEVfUENJKSB7CisJCXBjaV9yZWxlYXNlX3JlZ2lvbnMobWVfZGV2aWNlLT5pbmZvLnBjaS5wY2lfZGV2aWNlKTsKKwkJcGNpX2Rpc2FibGVfZGV2aWNlKG1lX2RldmljZS0+aW5mby5wY2kucGNpX2RldmljZSk7CisJfQorLyoKKwllbHNlCisJeworCQkvLyBNdXN0IGJlIGFuIFVTQiBkZXZpY2UuCisJfQorKi8KK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZWRldmljZS5oIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lZGV2aWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjVkYTgyOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZWRldmljZS5oCkBAIC0wLDAgKzEsMzA0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBTb3VyY2UgRmlsZSA6IG1lZGV2aWNlLmgKKyAqIEF1dGhvciAgICAgIDogR0cgKEd1ZW50ZXIgR2ViaGFyZHQpICA8c3VwcG9ydEBtZWlsaGF1cy5kZT4KKyAqLworCisjaWZuZGVmIF9NRURFVklDRV9IXworI2RlZmluZSBfTUVERVZJQ0VfSF8KKworI2lmbmRlZiBLQlVJTERfTU9ETkFNRQorIyAgZGVmaW5lIEtCVUlMRF9NT0ROQU1FIEtCVUlMRF9TVFIobWVtYWluKQorI2VuZGlmCisKKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKy8vI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKworI2luY2x1ZGUgIm1ldHlwZXMuaCIKKyNpbmNsdWRlICJtZXNsaXN0LmgiCisjaW5jbHVkZSAibWVkbG9jay5oIgorCisjaWZkZWYgX19LRVJORUxfXworCisvKioKKyAqIEBicmllZiBEZWZpbmVzIGEgcG9pbnRlciB0eXBlIHRvIGEgUENJIGNvbnN0cnVjdG9yIGZ1bmN0aW9uLgorICovCit0eXBlZGVmIHN0cnVjdCBtZV9kZXZpY2UgKigqbWVfcGNpX2NvbnN0cnVjdG9yX3QpIChzdHJ1Y3QgcGNpX2RldiAqKTsKKworLyoqCisgKiBAYnJpZWYgRGVmaW5lcyBhIHBvaW50ZXIgdHlwZSB0byBhIE1FLTQwMDAgUENJIGNvbnN0cnVjdG9yIGZ1bmN0aW9uLgorICovCisjaWZkZWYgQk9TQ0gKK3R5cGVkZWYgc3RydWN0IG1lX2RldmljZSAqKCptZV9ib3NjaF9jb25zdHJ1Y3Rvcl90KSAoc3RydWN0IHBjaV9kZXYgKiwKKwkJCQkJCSAgICAgaW50IG1lX2Jvc2NoX2Z3KTsKKyNlbmRpZgorCisvKioKKyAqIEBicmllZiBEZWZpbmVzIGEgcG9pbnRlciB0eXBlIHRvIGEgVVNCIGNvbnN0cnVjdG9yIGZ1bmN0aW9uLgorICovCisvL3R5cGVkZWYgc3RydWN0IG1lX2RldmljZSAqKCptZV91c2JfY29uc3RydWN0b3JfdCkoc3RydWN0IHVzYl9pbnRlcmZhY2UgKik7CisKKy8qKgorICogQGJyaWVmIERlZmluZXMgYSBwb2ludGVyIHR5cGUgdG8gdGhlIGR1bW15IGNvbnN0cnVjdG9yIGZ1bmN0aW9uLgorICovCit0eXBlZGVmIHN0cnVjdCBtZV9kZXZpY2UgKigqbWVfZHVtbXlfY29uc3RydWN0b3JfdCkgKHVuc2lnbmVkIHNob3J0IHZlbmRvcl9pZCwKKwkJCQkJCSAgICAgdW5zaWduZWQgc2hvcnQgZGV2aWNlX2lkLAorCQkJCQkJICAgICB1bnNpZ25lZCBpbnQgc2VyaWFsX25vLAorCQkJCQkJICAgICBpbnQgYnVzX3R5cGUsCisJCQkJCQkgICAgIGludCBidXNfbm8sCisJCQkJCQkgICAgIGludCBkZXZfbm8sIGludCBmdW5jX25vKTsKKworLy9leHRlcm4gbWVfdXNiX2NvbnN0cnVjdG9yX3QgbWVwaGlzdG9fczFfY29uc3RydWN0b3IgX19hdHRyaWJ1dGVfXyAoKHdlYWspKTsKKworLyoqCisgKiBAYnJpZWYgSG9sZHMgdGhlIFBDSSBkZXZpY2UgaW5mb3JtYXRpb24uCisgKi8KK3R5cGVkZWYgc3RydWN0IG1lX3BjaV9pbmZvIHsKKwlzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldmljZTsJCQkvKio8IEtlcm5lbCBQQ0kgZGV2aWNlIHN0cnVjdHVyZS4gKi8KKwl1aW50MzJfdCByZWdfYmFzZXNbNl07CQkJCS8qKjwgVGhlIGJhc2UgYWRyZXNzZXMgb2YgdGhlIFBDSSBiYXJzLiAqLworCXVpbnQzMl90IHJlZ19zaXplc1s2XTsJCQkJLyoqPCBUaGUgc2l6ZXMgb2YgdGhlIFBDSSBiYXJzLiAqLworCisJdWludDMyX3QgcGNpX2J1c19ubzsJCQkJLyoqPCBQQ0kgYnVzIG51bWJlci4gKi8KKwl1aW50MzJfdCBwY2lfZGV2X25vOwkJCQkvKio8IFBDSSBkZXZpY2UgbnVtYmVyLiAqLworCXVpbnQzMl90IHBjaV9mdW5jX25vOwkJCQkvKio8IFBDSSBmdW5jdGlvbiBudW1iZXIuICovCisKKwl1aW50MTZfdCB2ZW5kb3JfaWQ7CQkJCQkvKio8IE1laWxoYXVzIFBDSSB2ZW5kb3IgaWQuICovCisJdWludDE2X3QgZGV2aWNlX2lkOwkJCQkJLyoqPCBNZWlsaGF1cyBkZXZpY2UgaWQuICovCisJdWludDhfdCBod19yZXZpc2lvbjsJCQkJLyoqPCBIYXJkd2FyZSByZXZpc2lvbiBvZiB0aGUgZGV2aWNlLiAqLworCXVpbnQzMl90IHNlcmlhbF9ubzsJCQkJCS8qKjwgU2VyaWFsIG51bWJlciBvZiB0aGUgZGV2aWNlLiAqLworfSBtZV9wY2lfaW5mb190OworCisvKioKKyAqIEBicmllZiBIb2xkcyB0aGUgVVNCIGRldmljZSBpbmZvcm1hdGlvbi4KKyAqLworLy90eXBlZGVmIHN0cnVjdCBtZV91c2JfaW5mbyB7CisvL30gbWVfdXNiX2luZm9fdDsKKworLyoqCisgKiBAYnJpZWYgVGhlIE1laWxoYXVzIGRldmljZSBiYXNlIGNsYXNzIHN0cnVjdHVyZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgbWVfZGV2aWNlIHsKKwkvKiBBdHRyaWJ1dGVzICovCisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwkJCQkvKio8IEVuYWJsZXMgdGhlIGRldmljZSB0byBiZSBhZGRlZCB0byBhIGR5bmFtaWMgbGlzdC4gKi8KKy8vICAgICAgaW50IG1hZ2ljOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgVGhlIG1hZ2ljIG51bWJlciBvZiB0aGUgc3RydWN0dXJlLiAqLworCisJaW50IGJ1c190eXBlOwkJCQkJCS8qKjwgVGhlIGRlc2NyaW1pbmF0b3IgZm9yIHRoZSB1bmlvbi4gKi8KKwl1bmlvbiB7CisJCW1lX3BjaV9pbmZvX3QgcGNpOwkJCQkvKio8IFBDSSBzcGVjaWZpYyBkZXZpY2UgaW5mb3JtYXRpb24uICovCisvLyAgICAgICAgICAgICAgbWVfdXNiX2luZm9fdCB1c2I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBVU0Igc3BlY2lmaWMgZGV2aWNlIGluZm9ybWF0aW9uLiAqLworCX0gaW5mbzsJCQkJCQkJCS8qKjwgSG9sZHMgdGhlIGRldmljZSBpbmZvcm1hdGlvbi4gKi8KKworCWludCBpcnE7CQkJCQkJCS8qKjwgVGhlIGlycSBhc3NpZ25lZCB0byB0aGlzIGRldmljZS4gKi8KKworCW1lX2Rsb2NrX3QgZGxvY2s7CQkJCQkvKio8IFRoZSBkZXZpY2UgbG9ja2luZyBzdHJ1Y3R1cmUuICovCisJbWVfc2xpc3RfdCBzbGlzdDsJCQkJCS8qKjwgVGhlIGNvbnRhaW5lciBob2xkaW5nIGFsbCBzdWJkZXZpY2VzIGJlbG9uZ2luZyB0byB0aGlzIGRldmljZS4gKi8KKworCWNoYXIgKmRldmljZV9uYW1lOwkJCQkJLyoqPCBUaGUgbmFtZSBvZiB0aGUgTWVpbGhhdXMgZGV2aWNlLiAqLworCWNoYXIgKmRldmljZV9kZXNjcmlwdGlvbjsJCQkvKio8IFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgTWVpbGhhdXMgZGV2aWNlLiAqLworCWNoYXIgKmRyaXZlcl9uYW1lOwkJCQkJLyoqPCBUaGUgbmFtZSBvZiB0aGUgZGV2aWNlIGRyaXZlciBtb2R1bGUgc3VwcG9ydGluZyB0aGUgZGV2aWNlIGZhbWlseS4gKi8KKworCS8qIE1ldGhvZHMgKi8KKwlpbnQgKCptZV9kZXZpY2VfaW9faXJxX3N0YXJ0KSAoc3RydWN0IG1lX2RldmljZSAqIGRldmljZSwKKwkJCQkgICAgICAgc3RydWN0IGZpbGUgKiBmaWxlcCwKKwkJCQkgICAgICAgaW50IHN1YmRldmljZSwKKwkJCQkgICAgICAgaW50IGNoYW5uZWwsCisJCQkJICAgICAgIGludCBpcnFfc291cmNlLAorCQkJCSAgICAgICBpbnQgaXJxX2VkZ2UsIGludCBpcnFfYXJnLCBpbnQgZmxhZ3MpOworCisJaW50ICgqbWVfZGV2aWNlX2lvX2lycV93YWl0KSAoc3RydWN0IG1lX2RldmljZSAqIGRldmljZSwKKwkJCQkgICAgICBzdHJ1Y3QgZmlsZSAqIGZpbGVwLAorCQkJCSAgICAgIGludCBzdWJkZXZpY2UsCisJCQkJICAgICAgaW50IGNoYW5uZWwsCisJCQkJICAgICAgaW50ICppcnFfY291bnQsCisJCQkJICAgICAgaW50ICp2YWx1ZSwgaW50IHRpbWVfb3V0LCBpbnQgZmxhZ3MpOworCisJaW50ICgqbWVfZGV2aWNlX2lvX2lycV9zdG9wKSAoc3RydWN0IG1lX2RldmljZSAqIGRldmljZSwKKwkJCQkgICAgICBzdHJ1Y3QgZmlsZSAqIGZpbGVwLAorCQkJCSAgICAgIGludCBzdWJkZXZpY2UsIGludCBjaGFubmVsLCBpbnQgZmxhZ3MpOworCisJaW50ICgqbWVfZGV2aWNlX2lvX3Jlc2V0X2RldmljZSkgKHN0cnVjdCBtZV9kZXZpY2UgKiBkZXZpY2UsCisJCQkJCSAgc3RydWN0IGZpbGUgKiBmaWxlcCwgaW50IGZsYWdzKTsKKworCWludCAoKm1lX2RldmljZV9pb19yZXNldF9zdWJkZXZpY2UpIChzdHJ1Y3QgbWVfZGV2aWNlICogZGV2aWNlLAorCQkJCQkgICAgIHN0cnVjdCBmaWxlICogZmlsZXAsCisJCQkJCSAgICAgaW50IHN1YmRldmljZSwgaW50IGZsYWdzKTsKKworCWludCAoKm1lX2RldmljZV9pb19zaW5nbGVfY29uZmlnKSAoc3RydWN0IG1lX2RldmljZSAqIGRldmljZSwKKwkJCQkJICAgc3RydWN0IGZpbGUgKiBmaWxlcCwKKwkJCQkJICAgaW50IHN1YmRldmljZSwKKwkJCQkJICAgaW50IGNoYW5uZWwsCisJCQkJCSAgIGludCBzaW5nbGVfY29uZmlnLAorCQkJCQkgICBpbnQgcmVmLAorCQkJCQkgICBpbnQgdHJpZ19jaGFuLAorCQkJCQkgICBpbnQgdHJpZ190eXBlLAorCQkJCQkgICBpbnQgdHJpZ19lZGdlLCBpbnQgZmxhZ3MpOworCisJaW50ICgqbWVfZGV2aWNlX2lvX3NpbmdsZV9yZWFkKSAoc3RydWN0IG1lX2RldmljZSAqIGRldmljZSwKKwkJCQkJIHN0cnVjdCBmaWxlICogZmlsZXAsCisJCQkJCSBpbnQgc3ViZGV2aWNlLAorCQkJCQkgaW50IGNoYW5uZWwsCisJCQkJCSBpbnQgKnZhbHVlLCBpbnQgdGltZV9vdXQsIGludCBmbGFncyk7CisKKwlpbnQgKCptZV9kZXZpY2VfaW9fc2luZ2xlX3dyaXRlKSAoc3RydWN0IG1lX2RldmljZSAqIGRldmljZSwKKwkJCQkJICBzdHJ1Y3QgZmlsZSAqIGZpbGVwLAorCQkJCQkgIGludCBzdWJkZXZpY2UsCisJCQkJCSAgaW50IGNoYW5uZWwsCisJCQkJCSAgaW50IHZhbHVlLCBpbnQgdGltZV9vdXQsIGludCBmbGFncyk7CisKKwlpbnQgKCptZV9kZXZpY2VfaW9fc3RyZWFtX2NvbmZpZykgKHN0cnVjdCBtZV9kZXZpY2UgKiBkZXZpY2UsCisJCQkJCSAgIHN0cnVjdCBmaWxlICogZmlsZXAsCisJCQkJCSAgIGludCBzdWJkZXZpY2UsCisJCQkJCSAgIG1lSU9TdHJlYW1Db25maWdfdCAqIGNvbmZpZ19saXN0LAorCQkJCQkgICBpbnQgY291bnQsCisJCQkJCSAgIG1lSU9TdHJlYW1UcmlnZ2VyX3QgKiB0cmlnZ2VyLAorCQkJCQkgICBpbnQgZmlmb19pcnFfdGhyZXNob2xkLCBpbnQgZmxhZ3MpOworCisJaW50ICgqbWVfZGV2aWNlX2lvX3N0cmVhbV9uZXdfdmFsdWVzKSAoc3RydWN0IG1lX2RldmljZSAqIGRldmljZSwKKwkJCQkJICAgICAgIHN0cnVjdCBmaWxlICogZmlsZXAsCisJCQkJCSAgICAgICBpbnQgc3ViZGV2aWNlLAorCQkJCQkgICAgICAgaW50IHRpbWVfb3V0LAorCQkJCQkgICAgICAgaW50ICpjb3VudCwgaW50IGZsYWdzKTsKKworCWludCAoKm1lX2RldmljZV9pb19zdHJlYW1fcmVhZCkgKHN0cnVjdCBtZV9kZXZpY2UgKiBkZXZpY2UsCisJCQkJCSBzdHJ1Y3QgZmlsZSAqIGZpbGVwLAorCQkJCQkgaW50IHN1YmRldmljZSwKKwkJCQkJIGludCByZWFkX21vZGUsCisJCQkJCSBpbnQgKnZhbHVlcywgaW50ICpjb3VudCwgaW50IGZsYWdzKTsKKworCWludCAoKm1lX2RldmljZV9pb19zdHJlYW1fc3RhcnQpIChzdHJ1Y3QgbWVfZGV2aWNlICogZGV2aWNlLAorCQkJCQkgIHN0cnVjdCBmaWxlICogZmlsZXAsCisJCQkJCSAgaW50IHN1YmRldmljZSwKKwkJCQkJICBpbnQgc3RhcnRfbW9kZSwKKwkJCQkJICBpbnQgdGltZV9vdXQsIGludCBmbGFncyk7CisKKwlpbnQgKCptZV9kZXZpY2VfaW9fc3RyZWFtX3N0YXR1cykgKHN0cnVjdCBtZV9kZXZpY2UgKiBkZXZpY2UsCisJCQkJCSAgIHN0cnVjdCBmaWxlICogZmlsZXAsCisJCQkJCSAgIGludCBzdWJkZXZpY2UsCisJCQkJCSAgIGludCB3YWl0LAorCQkJCQkgICBpbnQgKnN0YXR1cywgaW50ICpjb3VudCwgaW50IGZsYWdzKTsKKworCWludCAoKm1lX2RldmljZV9pb19zdHJlYW1fc3RvcCkgKHN0cnVjdCBtZV9kZXZpY2UgKiBkZXZpY2UsCisJCQkJCSBzdHJ1Y3QgZmlsZSAqIGZpbGVwLAorCQkJCQkgaW50IHN1YmRldmljZSwKKwkJCQkJIGludCBzdG9wX21vZGUsIGludCBmbGFncyk7CisKKwlpbnQgKCptZV9kZXZpY2VfaW9fc3RyZWFtX3dyaXRlKSAoc3RydWN0IG1lX2RldmljZSAqIGRldmljZSwKKwkJCQkJICBzdHJ1Y3QgZmlsZSAqIGZpbGVwLAorCQkJCQkgIGludCBzdWJkZXZpY2UsCisJCQkJCSAgaW50IHdyaXRlX21vZGUsCisJCQkJCSAgaW50ICp2YWx1ZXMsIGludCAqY291bnQsIGludCBmbGFncyk7CisKKwlpbnQgKCptZV9kZXZpY2VfbG9ja19kZXZpY2UpIChzdHJ1Y3QgbWVfZGV2aWNlICogZGV2aWNlLAorCQkJCSAgICAgIHN0cnVjdCBmaWxlICogZmlsZXAsIGludCBsb2NrLCBpbnQgZmxhZ3MpOworCisJaW50ICgqbWVfZGV2aWNlX2xvY2tfc3ViZGV2aWNlKSAoc3RydWN0IG1lX2RldmljZSAqIGRldmljZSwKKwkJCQkJIHN0cnVjdCBmaWxlICogZmlsZXAsCisJCQkJCSBpbnQgc3ViZGV2aWNlLCBpbnQgbG9jaywgaW50IGZsYWdzKTsKKworCWludCAoKm1lX2RldmljZV9xdWVyeV9kZXNjcmlwdGlvbl9kZXZpY2UpIChzdHJ1Y3QgbWVfZGV2aWNlICogZGV2aWNlLAorCQkJCQkJICAgY2hhciAqKmRlc2NyaXB0aW9uKTsKKworCWludCAoKm1lX2RldmljZV9xdWVyeV9pbmZvX2RldmljZSkgKHN0cnVjdCBtZV9kZXZpY2UgKiBkZXZpY2UsCisJCQkJCSAgICBpbnQgKnZlbmRvcl9pZCwKKwkJCQkJICAgIGludCAqZGV2aWNlX2lkLAorCQkJCQkgICAgaW50ICpzZXJpYWxfbm8sCisJCQkJCSAgICBpbnQgKmJ1c190eXBlLAorCQkJCQkgICAgaW50ICpidXNfbm8sCisJCQkJCSAgICBpbnQgKmRldl9ubywKKwkJCQkJICAgIGludCAqZnVuY19ubywgaW50ICpwbHVnZ2VkKTsKKworCWludCAoKm1lX2RldmljZV9xdWVyeV9uYW1lX2RldmljZSkgKHN0cnVjdCBtZV9kZXZpY2UgKiBkZXZpY2UsCisJCQkJCSAgICBjaGFyICoqbmFtZSk7CisKKwlpbnQgKCptZV9kZXZpY2VfcXVlcnlfbmFtZV9kZXZpY2VfZHJpdmVyKSAoc3RydWN0IG1lX2RldmljZSAqIGRldmljZSwKKwkJCQkJCSAgIGNoYXIgKipuYW1lKTsKKworCWludCAoKm1lX2RldmljZV9xdWVyeV9udW1iZXJfc3ViZGV2aWNlcykgKHN0cnVjdCBtZV9kZXZpY2UgKiBkZXZpY2UsCisJCQkJCQkgIGludCAqbnVtYmVyKTsKKworCWludCAoKm1lX2RldmljZV9xdWVyeV9udW1iZXJfY2hhbm5lbHMpIChzdHJ1Y3QgbWVfZGV2aWNlICogZGV2aWNlLAorCQkJCQkJaW50IHN1YmRldmljZSwgaW50ICpudW1iZXIpOworCisJaW50ICgqbWVfZGV2aWNlX3F1ZXJ5X251bWJlcl9yYW5nZXMpIChzdHJ1Y3QgbWVfZGV2aWNlICogZGV2aWNlLAorCQkJCQkgICAgICBpbnQgc3ViZGV2aWNlLAorCQkJCQkgICAgICBpbnQgdW5pdCwgaW50ICpjb3VudCk7CisKKwlpbnQgKCptZV9kZXZpY2VfcXVlcnlfcmFuZ2VfYnlfbWluX21heCkgKHN0cnVjdCBtZV9kZXZpY2UgKiBkZXZpY2UsCisJCQkJCQkgaW50IHN1YmRldmljZSwKKwkJCQkJCSBpbnQgdW5pdCwKKwkJCQkJCSBpbnQgKm1pbiwKKwkJCQkJCSBpbnQgKm1heCwKKwkJCQkJCSBpbnQgKm1heGRhdGEsIGludCAqcmFuZ2UpOworCisJaW50ICgqbWVfZGV2aWNlX3F1ZXJ5X3JhbmdlX2luZm8pIChzdHJ1Y3QgbWVfZGV2aWNlICogZGV2aWNlLAorCQkJCQkgICBpbnQgc3ViZGV2aWNlLAorCQkJCQkgICBpbnQgcmFuZ2UsCisJCQkJCSAgIGludCAqdW5pdCwKKwkJCQkJICAgaW50ICptaW4sIGludCAqbWF4LCBpbnQgKm1heGRhdGEpOworCisJaW50ICgqbWVfZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV9ieV90eXBlKSAoc3RydWN0IG1lX2RldmljZSAqIGRldmljZSwKKwkJCQkJCSAgaW50IHN0YXJ0X3N1YmRldmljZSwKKwkJCQkJCSAgaW50IHR5cGUsCisJCQkJCQkgIGludCBzdWJ0eXBlLCBpbnQgKnN1YmRldmljZSk7CisKKwlpbnQgKCptZV9kZXZpY2VfcXVlcnlfc3ViZGV2aWNlX3R5cGUpIChzdHJ1Y3QgbWVfZGV2aWNlICogZGV2aWNlLAorCQkJCQkgICAgICAgaW50IHN1YmRldmljZSwKKwkJCQkJICAgICAgIGludCAqdHlwZSwgaW50ICpzdWJ0eXBlKTsKKworCWludCAoKm1lX2RldmljZV9xdWVyeV9zdWJkZXZpY2VfY2FwcykgKHN0cnVjdCBtZV9kZXZpY2UgKiBkZXZpY2UsCisJCQkJCSAgICAgICBpbnQgc3ViZGV2aWNlLCBpbnQgKmNhcHMpOworCisJaW50ICgqbWVfZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV9jYXBzX2FyZ3MpIChzdHJ1Y3QgbWVfZGV2aWNlICogZGV2aWNlLAorCQkJCQkJICAgIGludCBzdWJkZXZpY2UsCisJCQkJCQkgICAgaW50IGNhcCwKKwkJCQkJCSAgICBpbnQgKmFyZ3MsIGludCBjb3VudCk7CisKKwlpbnQgKCptZV9kZXZpY2VfcXVlcnlfdGltZXIpIChzdHJ1Y3QgbWVfZGV2aWNlICogZGV2aWNlLAorCQkJCSAgICAgIGludCBzdWJkZXZpY2UsCisJCQkJICAgICAgaW50IHRpbWVyLAorCQkJCSAgICAgIGludCAqYmFzZV9mcmVxdWVuY3ksCisJCQkJICAgICAgdWludDY0X3QgKiBtaW5fdGlja3MsCisJCQkJICAgICAgdWludDY0X3QgKiBtYXhfdGlja3MpOworCisJaW50ICgqbWVfZGV2aWNlX3F1ZXJ5X3ZlcnNpb25fZGV2aWNlX2RyaXZlcikgKHN0cnVjdCBtZV9kZXZpY2UgKiBkZXZpY2UsCisJCQkJCQkgICAgICBpbnQgKnZlcnNpb24pOworCisJaW50ICgqbWVfZGV2aWNlX2NvbmZpZ19sb2FkKSAoc3RydWN0IG1lX2RldmljZSAqIGRldmljZSwKKwkJCQkgICAgICBzdHJ1Y3QgZmlsZSAqIGZpbGVwLAorCQkJCSAgICAgIG1lX2NmZ19kZXZpY2VfZW50cnlfdCAqIGNvbmZpZyk7CisKKwl2b2lkICgqbWVfZGV2aWNlX2Rlc3RydWN0b3IpIChzdHJ1Y3QgbWVfZGV2aWNlICogZGV2aWNlKTsKK30gbWVfZGV2aWNlX3Q7CisKKy8qKgorICogQGJyaWVmIEluaXRpYWxpemVzIGEgUENJIGRldmljZSBiYXNlIGNsYXNzIHN0cnVjdHVyZS4KKyAqCisgKiBAcGFyYW0gcGNpX2RldmljZSBUaGUgUENJIGRldmljZSBjb250ZXh0IGFzIGhhbmRlZCBvdmVyIGJ5IGtlcm5lbC4KKyAqCisgKiBAcmV0dXJuIDAgb24gc3VjY2Vzcy4KKyAqLworaW50IG1lX2RldmljZV9wY2lfaW5pdChtZV9kZXZpY2VfdCAqIG1lX2RldmljZSwgc3RydWN0IHBjaV9kZXYgKnBjaV9kZXZpY2UpOworCisvKioKKyAqIEBicmllZiBJbml0aWFsaXplcyBhIFVTQiBkZXZpY2UgYmFzZSBjbGFzcyBzdHJ1Y3R1cmUuCisgKgorICogQHBhcmFtIHVzYl9pbnRlcmZhY2UgVGhlIFVTQiBkZXZpY2UgaW50ZXJmYWNlIGFzIGhhbmRlZCBvdmVyIGJ5IGtlcm5lbC4KKyAqCisgKiBAcmV0dXJuIDAgb24gc3VjY2Vzcy4KKyAqLworLy9pbnQgbWVfZGV2aWNlX3VzYl9pbml0KG1lX2RldmljZV90ICptZV9kZXZpY2UsIHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2UpOworCisvKioKKyAgKiBAYnJpZWYgRGVpbml0aWFsaXplcyBhIGRldmljZSBiYXNlIGNsYXNzIHN0cnVjdHVyZSBhbmQgZnJlZXMgYW55IHByZXZpb3VzbHkKKyAgKiByZXF1ZXN0ZWQgcmVzb3VyY2VzIHJlbGF0ZWQgd2l0aCB0aGlzIHN0cnVjdHVyZS4gSXQgYWxzbyBmcmVlcyBhbnkgc3ViZGV2aWNlCisgICogaW5zdGFuY2UgaG9sZCBieSB0aGUgc3ViZGV2aWNlIGxpc3QuCisgICoKKyAgKiBAcGFyYW0gbWVfZGV2aWNlIFRoZSBkZXZpY2UgY2xhc3MgdG8gZGVpbml0aWFsaXplLgorICAqLwordm9pZCBtZV9kZXZpY2VfZGVpbml0KG1lX2RldmljZV90ICogbWVfZGV2aWNlKTsKKworI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZWRsaXN0LmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWVkbGlzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmNGUzNjkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWVkbGlzdC5jCkBAIC0wLDAgKzEsMTI3IEBACisvKioKKyAqIEBmaWxlIG1lX2RsaXN0LmMKKyAqCisgKiBAYnJpZWYgSW1wbGVtZW50cyB0aGUgZGV2aWNlIGxpc3QgY2xhc3MuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2luY2x1ZGUgIm1lZXJyb3IuaCIKKyNpbmNsdWRlICJtZWRlZmluZXMuaCIKKworI2luY2x1ZGUgIm1lZGxpc3QuaCIKKyNpbmNsdWRlICJtZWRlYnVnLmgiCisKK2ludCBtZV9kbGlzdF9xdWVyeV9udW1iZXJfZGV2aWNlcyhzdHJ1Y3QgbWVfZGxpc3QgKmRsaXN0LCBpbnQgKm51bWJlcikKK3sKKwlQREVCVUdfTE9DS1MoImNhbGxlZC5cbiIpOworCSpudW1iZXIgPSBkbGlzdC0+bjsKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKwordW5zaWduZWQgaW50IG1lX2RsaXN0X2dldF9udW1iZXJfZGV2aWNlcyhzdHJ1Y3QgbWVfZGxpc3QgKmRsaXN0KQoreworCVBERUJVR19MT0NLUygiY2FsbGVkLlxuIik7CisJcmV0dXJuIGRsaXN0LT5uOworfQorCittZV9kZXZpY2VfdCAqbWVfZGxpc3RfZ2V0X2RldmljZShzdHJ1Y3QgbWVfZGxpc3QgKiBkbGlzdCwgdW5zaWduZWQgaW50IGluZGV4KQoreworCisJc3RydWN0IGxpc3RfaGVhZCAqcG9zOworCW1lX2RldmljZV90ICpkZXZpY2UgPSBOVUxMOworCXVuc2lnbmVkIGludCBpID0gMDsKKworCVBERUJVR19MT0NLUygiY2FsbGVkLlxuIik7CisKKwlpZiAoaW5kZXggPj0gZGxpc3QtPm4pIHsKKwkJUEVSUk9SKCJJbmRleCBvdXQgb2YgcmFuZ2UuXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJbGlzdF9mb3JfZWFjaChwb3MsICZkbGlzdC0+aGVhZCkgeworCQlpZiAoaSA9PSBpbmRleCkgeworCQkJZGV2aWNlID0gbGlzdF9lbnRyeShwb3MsIG1lX2RldmljZV90LCBsaXN0KTsKKwkJCWJyZWFrOworCQl9CisKKwkJKytpOworCX0KKworCXJldHVybiBkZXZpY2U7Cit9CisKK3ZvaWQgbWVfZGxpc3RfYWRkX2RldmljZV90YWlsKHN0cnVjdCBtZV9kbGlzdCAqZGxpc3QsIG1lX2RldmljZV90ICogZGV2aWNlKQoreworCVBERUJVR19MT0NLUygiY2FsbGVkLlxuIik7CisKKwlsaXN0X2FkZF90YWlsKCZkZXZpY2UtPmxpc3QsICZkbGlzdC0+aGVhZCk7CisJKytkbGlzdC0+bjsKK30KKworbWVfZGV2aWNlX3QgKm1lX2RsaXN0X2RlbF9kZXZpY2VfdGFpbChzdHJ1Y3QgbWVfZGxpc3QgKmRsaXN0KQoreworCisJc3RydWN0IGxpc3RfaGVhZCAqbGFzdDsKKwltZV9kZXZpY2VfdCAqZGV2aWNlOworCisJUERFQlVHX0xPQ0tTKCJjYWxsZWQuXG4iKTsKKworCWlmIChsaXN0X2VtcHR5KCZkbGlzdC0+aGVhZCkpCisJCXJldHVybiBOVUxMOworCisJbGFzdCA9IGRsaXN0LT5oZWFkLnByZXY7CisKKwlkZXZpY2UgPSBsaXN0X2VudHJ5KGxhc3QsIG1lX2RldmljZV90LCBsaXN0KTsKKworCWxpc3RfZGVsKGxhc3QpOworCisJLS1kbGlzdC0+bjsKKworCXJldHVybiBkZXZpY2U7Cit9CisKK2ludCBtZV9kbGlzdF9pbml0KG1lX2RsaXN0X3QgKiBkbGlzdCkKK3sKKwlQREVCVUdfTE9DS1MoImNhbGxlZC5cbiIpOworCisJSU5JVF9MSVNUX0hFQUQoJmRsaXN0LT5oZWFkKTsKKwlkbGlzdC0+biA9IDA7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgbWVfZGxpc3RfZGVpbml0KG1lX2RsaXN0X3QgKiBkbGlzdCkKK3sKKworCXN0cnVjdCBsaXN0X2hlYWQgKnM7CisJbWVfZGV2aWNlX3QgKmRldmljZTsKKworCVBERUJVR19MT0NLUygiY2FsbGVkLlxuIik7CisKKwl3aGlsZSAoIWxpc3RfZW1wdHkoJmRsaXN0LT5oZWFkKSkgeworCQlzID0gZGxpc3QtPmhlYWQubmV4dDsKKwkJbGlzdF9kZWwocyk7CisJCWRldmljZSA9IGxpc3RfZW50cnkocywgbWVfZGV2aWNlX3QsIGxpc3QpOworCQlkZXZpY2UtPm1lX2RldmljZV9kZXN0cnVjdG9yKGRldmljZSk7CisJfQorCisJZGxpc3QtPm4gPSAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lZGxpc3QuaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZWRsaXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDkxYzExZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZWRsaXN0LmgKQEAgLTAsMCArMSw5MSBAQAorLyoqCisgKiBAZmlsZSBtZV9kbGlzdC5oCisgKgorICogQGJyaWVmIFByb3ZpZGVzIHRoZSBkZXZpY2UgbGlzdCBjbGFzcy4KKyAqIEBub3RlIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKiBAYXV0aG9yIEd1ZW50ZXIgR2ViaGFyZHQKKyAqLworCisjaWZuZGVmIF9NRV9ETElTVF9IXworI2RlZmluZSBfTUVfRExJU1RfSF8KKworI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKworI2luY2x1ZGUgIm1lZGV2aWNlLmgiCisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKy8qKgorICogQGJyaWVmIFRoZSBkZXZpY2UgbGlzdCBjb250YWluZXIuCisgKi8KK3R5cGVkZWYgc3RydWN0IG1lX2RsaXN0IHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGhlYWQ7CQkvKio8IFRoZSBoZWFkIG9mIHRoZSBpbnRlcm5hbCBsaXN0LiAqLworCXVuc2lnbmVkIGludCBuOwkJCS8qKjwgVGhlIG51bWJlciBvZiBkZXZpY2VzIGluIHRoZSBsaXN0LiAqLworfSBtZV9kbGlzdF90OworCisvKioKKyAqIEBicmllZiBRdWVyaWVzIHRoZSBudW1iZXIgb2YgZGV2aWNlcyBjdXJyZW50bHkgaW5zaWRlIHRoZSBsaXN0LgorICoKKyAqIEBwYXJhbSBkbGlzdCBUaGUgZGV2aWNlIGxpc3QgdG8gcXVlcnkuCisgKiBAcGFyYW1bb3V0XSBudW1iZXIgVGhlIG51bWJlciBvZiBkZXZpY2VzLgorICoKKyAqIEByZXR1cm4gTUUtaURTIGVycm9yIGNvZGUuCisgKi8KK2ludCBtZV9kbGlzdF9xdWVyeV9udW1iZXJfZGV2aWNlcyhzdHJ1Y3QgbWVfZGxpc3QgKmRsaXN0LCBpbnQgKm51bWJlcik7CisKKy8qKgorICogQGJyaWVmIFJldHVybnMgdGhlIG51bWJlciBvZiBkZXZpY2VzIGN1cnJlbnRseSBpbnNpZGUgdGhlIGxpc3QuCisgKgorICogQHBhcmFtIGRsaXN0IFRoZSBkZXZpY2UgbGlzdCB0byBxdWVyeS4KKyAqCisgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgZGV2aWNlcyBpbiB0aGUgbGlzdC4KKyAqLwordW5zaWduZWQgaW50IG1lX2RsaXN0X2dldF9udW1iZXJfZGV2aWNlcyhzdHJ1Y3QgbWVfZGxpc3QgKmRsaXN0KTsKKworLyoqCisgKiBAYnJpZWYgR2V0IGEgZGV2aWNlIGJ5IGluZGV4LgorICoKKyAqIEBwYXJhbSBkbGlzdCBUaGUgZGV2aWNlIGxpc3QgdG8gcXVlcnkuCisgKiBAcGFyYW0gaW5kZXggVGhlIGluZGV4IG9mIHRoZSBkZXZpY2UgdG8gZ2V0IGluIHRoZSBsaXN0LgorICoKKyAqIEByZXR1cm4gVGhlIGRldmljZSBhdCBpbmRleCBpZiBhdmFpbGFibGUuXG4KKyAqICAgICAgICAgTlVMTCBpZiB0aGUgaW5kZXggaXMgb3V0IG9mIHJhbmdlLgorICovCittZV9kZXZpY2VfdCAqbWVfZGxpc3RfZ2V0X2RldmljZShzdHJ1Y3QgbWVfZGxpc3QgKmRsaXN0LCB1bnNpZ25lZCBpbnQgaW5kZXgpOworCisvKioKKyAqIEBicmllZiBBZGRzIGEgZGV2aWNlIHRvIHRoZSB0YWlsIG9mIHRoZSBsaXN0LgorICoKKyAqIEBwYXJhbSBkbGlzdCBUaGUgZGV2aWNlIGxpc3QgdG8gYWRkIGEgZGV2aWNlIHRvLgorICogQHBhcmFtIGRldmljZSBUaGUgZGV2aWNlIHRvIGFkZCB0byB0aGUgbGlzdC4KKyAqLwordm9pZCBtZV9kbGlzdF9hZGRfZGV2aWNlX3RhaWwoc3RydWN0IG1lX2RsaXN0ICpkbGlzdCwgbWVfZGV2aWNlX3QgKiBkZXZpY2UpOworCisvKioKKyAqIEBicmllZiBSZW1vdmVzIGEgZGV2aWNlIGZyb20gdGhlIHRhaWwgb2YgdGhlIGxpc3QuCisgKgorICogQHBhcmFtIGRsaXN0IFRoZSBkZXZpY2UgbGlzdC4KKyAqCisgKiBAcmV0dXJuIFBvaW50ZXIgdG8gdGhlIHJlbW92ZWQgc3ViZGVpdmNlLlxuCisgKiAgICAgICAgIE5VTEwgaW4gY2FzZXMgd2hlcmUgdGhlIGxpc3Qgd2FzIGVtcHR5LgorICovCittZV9kZXZpY2VfdCAqbWVfZGxpc3RfZGVsX2RldmljZV90YWlsKHN0cnVjdCBtZV9kbGlzdCAqZGxpc3QpOworCisvKioKKyAqIEBicmllZiBJbml0aWFsaXplcyBhIGRldmljZSBsaXN0IHN0cnVjdHVyZS4KKyAqCisgKiBAcGFyYW0gbG9jayBUaGUgZGV2aWNlIGxpc3Qgc3RydWN0dXJlIHRvIGluaXRpYWxpemUuCisgKiBAcmV0dXJuIDAgb24gc3VjY2Vzcy4KKyAqLworaW50IG1lX2RsaXN0X2luaXQobWVfZGxpc3RfdCAqIGRsaXN0KTsKKworLyoqCisgKiBAYnJpZWYgRGVpbml0aWFsaXplcyBhIGRldmljZSBsaXN0IHN0cnVjdHVyZSBhbmQgZGVzdHJ1Y3RzIGV2ZXJ5IGRldmljZSBpbiBpdC4KKyAqCisgKiBAcGFyYW0gZGxpc3QgVGhlIGRldmljZSBsaXN0IHN0cnVjdHVyZSB0byBkZWluaXRpYWxpemUuCisgKiBAcmV0dXJuIDAgb24gc3VjY2Vzcy4KKyAqLwordm9pZCBtZV9kbGlzdF9kZWluaXQobWVfZGxpc3RfdCAqIGRsaXN0KTsKKworI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZWRsb2NrLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWVkbG9jay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2NDllM2QKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWVkbG9jay5jCkBAIC0wLDAgKzEsMTk1IEBACisvKioKKyAqIEBmaWxlIG1lZGxvY2suYworICoKKyAqIEBicmllZiBJbXBsZW1lbnRzIHRoZSBkZXZpY2UgbG9jayBjbGFzcy4KKyAqIEBub3RlIENvcHlyaWdodCAoQykgMjAwNiBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKiBAYXV0aG9yIEd1ZW50ZXIgR2ViaGFyZHQKKyAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKworI2luY2x1ZGUgIm1lZGVmaW5lcy5oIgorI2luY2x1ZGUgIm1lZXJyb3IuaCIKKworI2luY2x1ZGUgIm1lZGVidWcuaCIKKyNpbmNsdWRlICJtZXNsaXN0LmgiCisjaW5jbHVkZSAibWVzdWJkZXZpY2UuaCIKKyNpbmNsdWRlICJtZWRsb2NrLmgiCisKK2ludCBtZV9kbG9ja19lbnRlcihzdHJ1Y3QgbWVfZGxvY2sgKmRsb2NrLCBzdHJ1Y3QgZmlsZSAqZmlsZXApCit7CisJUERFQlVHX0xPQ0tTKCJleGVjdXRlZC5cbiIpOworCisJc3Bpbl9sb2NrKCZkbG9jay0+c3Bpbl9sb2NrKTsKKworCWlmICgoZGxvY2stPmZpbGVwKSAhPSBOVUxMICYmIChkbG9jay0+ZmlsZXAgIT0gZmlsZXApKSB7CisJCVBFUlJPUigiRGV2aWNlIGlzIGxvY2tlZCBieSBhbm90aGVyIHByb2Nlc3MuXG4iKTsKKwkJc3Bpbl91bmxvY2soJmRsb2NrLT5zcGluX2xvY2spOworCQlyZXR1cm4gTUVfRVJSTk9fTE9DS0VEOworCX0KKworCWRsb2NrLT5jb3VudCsrOworCisJc3Bpbl91bmxvY2soJmRsb2NrLT5zcGluX2xvY2spOworCisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK2ludCBtZV9kbG9ja19leGl0KHN0cnVjdCBtZV9kbG9jayAqZGxvY2ssIHN0cnVjdCBmaWxlICpmaWxlcCkKK3sKKwlQREVCVUdfTE9DS1MoImV4ZWN1dGVkLlxuIik7CisKKwlzcGluX2xvY2soJmRsb2NrLT5zcGluX2xvY2spOworCWRsb2NrLT5jb3VudC0tOworCXNwaW5fdW5sb2NrKCZkbG9jay0+c3Bpbl9sb2NrKTsKKworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitpbnQgbWVfZGxvY2tfbG9jayhzdHJ1Y3QgbWVfZGxvY2sgKmRsb2NrLAorCQkgIHN0cnVjdCBmaWxlICpmaWxlcCwgaW50IGxvY2ssIGludCBmbGFncywgbWVfc2xpc3RfdCAqIHNsaXN0KQoreworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCWludCBpOworCW1lX3N1YmRldmljZV90ICpzdWJkZXZpY2U7CisKKwlQREVCVUdfTE9DS1MoImV4ZWN1dGVkLlxuIik7CisKKwlzcGluX2xvY2soJmRsb2NrLT5zcGluX2xvY2spOworCisJc3dpdGNoIChsb2NrKSB7CisKKwljYXNlIE1FX0xPQ0tfUkVMRUFTRToKKwkJaWYgKChkbG9jay0+ZmlsZXAgPT0gZmlsZXApIHx8IChkbG9jay0+ZmlsZXAgPT0gTlVMTCkpIHsKKwkJCWRsb2NrLT5maWxlcCA9IE5VTEw7CisKKwkJCS8qIFVubG9jayBhbGwgcG9zc2libHkgbG9ja2VkIHN1YmRldmljZXMuICovCisKKwkJCWZvciAoaSA9IDA7IGkgPCBtZV9zbGlzdF9nZXRfbnVtYmVyX3N1YmRldmljZXMoc2xpc3QpOworCQkJICAgICBpKyspIHsKKwkJCQlzdWJkZXZpY2UgPSBtZV9zbGlzdF9nZXRfc3ViZGV2aWNlKHNsaXN0LCBpKTsKKworCQkJCWlmIChzdWJkZXZpY2UpCisJCQkJCWVyciA9CisJCQkJCSAgICBzdWJkZXZpY2UtPgorCQkJCQkgICAgbWVfc3ViZGV2aWNlX2xvY2tfc3ViZGV2aWNlCisJCQkJCSAgICAoc3ViZGV2aWNlLCBmaWxlcCwgTUVfTE9DS19SRUxFQVNFLAorCQkJCQkgICAgIGZsYWdzKTsKKwkJCQllbHNlCisJCQkJCWVyciA9IE1FX0VSUk5PX0lOVEVSTkFMOworCQkJfQorCQl9CisKKwkJYnJlYWs7CisKKwljYXNlIE1FX0xPQ0tfU0VUOgorCQlpZiAoZGxvY2stPmNvdW50KSB7CisJCQlQRVJST1IoIkRldmljZSBpcyB1c2VkIGJ5IGFub3RoZXIgcHJvY2Vzcy5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fVVNFRDsKKwkJfSBlbHNlIGlmICgoZGxvY2stPmZpbGVwICE9IE5VTEwpICYmIChkbG9jay0+ZmlsZXAgIT0gZmlsZXApKSB7CisJCQlQRVJST1IoIkRldmljZSBpcyBsb2NrZWQgYnkgYW5vdGhlciBwcm9jZXNzLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19MT0NLRUQ7CisJCX0gZWxzZSBpZiAoZGxvY2stPmZpbGVwID09IE5VTEwpIHsKKwkJCS8qIENoZWNrIGFueSBzdWJkZXZpY2UgaXMgbG9ja2VkIGJ5IGFub3RoZXIgcHJvY2Vzcy4gKi8KKworCQkJZm9yIChpID0gMDsgaSA8IG1lX3NsaXN0X2dldF9udW1iZXJfc3ViZGV2aWNlcyhzbGlzdCk7CisJCQkgICAgIGkrKykgeworCQkJCXN1YmRldmljZSA9IG1lX3NsaXN0X2dldF9zdWJkZXZpY2Uoc2xpc3QsIGkpOworCisJCQkJaWYgKHN1YmRldmljZSkgeworCQkJCQlpZiAoKGVyciA9CisJCQkJCSAgICAgc3ViZGV2aWNlLT4KKwkJCQkJICAgICBtZV9zdWJkZXZpY2VfbG9ja19zdWJkZXZpY2UKKwkJCQkJICAgICAoc3ViZGV2aWNlLCBmaWxlcCwgTUVfTE9DS19DSEVDSywKKwkJCQkJICAgICAgZmxhZ3MpKSkgeworCQkJCQkJUEVSUk9SCisJCQkJCQkgICAgKCJBIHN1YmRldmljZSBpcyBsb2NrZWQgYnkgYW5vdGhlciBwcm9jZXNzLlxuIik7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCWVyciA9IE1FX0VSUk5PX0lOVEVSTkFMOworCQkJCX0KKwkJCX0KKworCQkJLyogSWYgbm8gc3ViZGV2aWNlcyBhcmUgbG9ja2VkIGJ5IG90aGVyIHByb2Nlc3NlcywKKwkJCSAgIHdlIGNhbiB0YWtlIG93bmVyc2hpcCBvZiB0aGUgZGV2aWNlLiBPdGhlcndpc2Ugd2UganVtcCBhaGVhZC4gKi8KKwkJCWlmICghZXJyKQorCQkJCWRsb2NrLT5maWxlcCA9IGZpbGVwOworCQl9CisKKwkJYnJlYWs7CisKKwljYXNlIE1FX0xPQ0tfQ0hFQ0s6CisJCWlmIChkbG9jay0+Y291bnQpIHsKKwkJCWVyciA9IE1FX0VSUk5PX1VTRUQ7CisJCX0gZWxzZSBpZiAoKGRsb2NrLT5maWxlcCAhPSBOVUxMKSAmJiAoZGxvY2stPmZpbGVwICE9IGZpbGVwKSkgeworCQkJZXJyID0gTUVfRVJSTk9fTE9DS0VEOworCQl9IGVsc2UgaWYgKGRsb2NrLT5maWxlcCA9PSBOVUxMKSB7CisJCQlmb3IgKGkgPSAwOyBpIDwgbWVfc2xpc3RfZ2V0X251bWJlcl9zdWJkZXZpY2VzKHNsaXN0KTsKKwkJCSAgICAgaSsrKSB7CisJCQkJc3ViZGV2aWNlID0gbWVfc2xpc3RfZ2V0X3N1YmRldmljZShzbGlzdCwgaSk7CisKKwkJCQlpZiAoc3ViZGV2aWNlKSB7CisJCQkJCWlmICgoZXJyID0KKwkJCQkJICAgICBzdWJkZXZpY2UtPgorCQkJCQkgICAgIG1lX3N1YmRldmljZV9sb2NrX3N1YmRldmljZQorCQkJCQkgICAgIChzdWJkZXZpY2UsIGZpbGVwLCBNRV9MT0NLX0NIRUNLLAorCQkJCQkgICAgICBmbGFncykpKSB7CisJCQkJCQlQRVJST1IKKwkJCQkJCSAgICAoIkEgc3ViZGV2aWNlIGlzIGxvY2tlZCBieSBhbm90aGVyIHByb2Nlc3MuXG4iKTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJZXJyID0gTUVfRVJSTk9fSU5URVJOQUw7CisJCQkJfQorCQkJfQorCQl9CisKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlQRVJST1IoIkludmFsaWQgbG9jay5cbiIpOworCisJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfTE9DSzsKKworCQlicmVhazsKKwl9CisKKwlzcGluX3VubG9jaygmZGxvY2stPnNwaW5fbG9jayk7CisKKwlyZXR1cm4gZXJyOworfQorCit2b2lkIG1lX2Rsb2NrX2RlaW5pdChzdHJ1Y3QgbWVfZGxvY2sgKmRsb2NrKQoreworCVBERUJVR19MT0NLUygiZXhlY3V0ZWQuXG4iKTsKK30KKworaW50IG1lX2Rsb2NrX2luaXQobWVfZGxvY2tfdCAqIGRsb2NrKQoreworCVBERUJVR19MT0NLUygiZXhlY3V0ZWQuXG4iKTsKKworCWRsb2NrLT5maWxlcCA9IE5VTEw7CisJZGxvY2stPmNvdW50ID0gMDsKKwlzcGluX2xvY2tfaW5pdCgmZGxvY2stPnNwaW5fbG9jayk7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZWRsb2NrLmggYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWVkbG9jay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkNmRkYzgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWVkbG9jay5oCkBAIC0wLDAgKzEsNzYgQEAKKy8qKgorICogQGZpbGUgbWVkbG9jay5oCisgKgorICogQGJyaWVmIFByb3ZpZGVzIHRoZSBkZXZpY2UgbG9jayBjbGFzcy4KKyAqIEBub3RlIENvcHlyaWdodCAoQykgMjAwNiBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKiBAYXV0aG9yIEd1ZW50ZXIgR2ViaGFyZHQKKyAqLworCisjaWZuZGVmIF9NRURMT0NLX0hfCisjZGVmaW5lIF9NRURMT0NLX0hfCisKKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorCisjaWZkZWYgX19LRVJORUxfXworCisvKioKKyAqIEBicmllZiBUaGUgZGV2aWNlIGxvY2sgY2xhc3MuCisgKi8KK3R5cGVkZWYgc3RydWN0IG1lX2Rsb2NrIHsKKwlzdHJ1Y3QgZmlsZSAqZmlsZXA7CQkvKio8IFBvaW50ZXIgdG8gZmlsZSBzdHJ1Y3R1cmUgaG9sZGluZyB0aGUgZGV2aWNlLiAqLworCWludCBjb3VudDsJCQkJLyoqPCBOdW1iZXIgb2YgdGFza3Mgd2hpY2ggYXJlIGluc2lkZSB0aGUgZGV2aWNlLiAqLworCXNwaW5sb2NrX3Qgc3Bpbl9sb2NrOwkvKio8IFNwaW4gbG9jayBwcm90ZWN0aW5nIHRoZSBhdHRyaWJ1dGVzIGZyb20gY29uY3VycmVudCBhY2Nlc3MuICovCit9IG1lX2Rsb2NrX3Q7CisKKy8qKgorICogQGJyaWVmIFRyaWVzIHRvIGVudGVyIGEgZGV2aWNlLgorICoKKyAqIEBwYXJhbSBkbG9jayBUaGUgZGV2aWNlIGxvY2sgaW5zdGFuY2UuCisgKiBAcGFyYW0gZmlsZXAgVGhlIGZpbGUgc3RydWN0dXJlIGlkZW50aWZ5aW5nIHRoZSBjYWxsaW5nIHByb2Nlc3MuCisgKgorICogQHJldHVybiAwIG9uIHN1Y2Nlc3MuCisgKi8KK2ludCBtZV9kbG9ja19lbnRlcihzdHJ1Y3QgbWVfZGxvY2sgKmRsb2NrLCBzdHJ1Y3QgZmlsZSAqZmlsZXApOworCisvKioKKyAqIEBicmllZiBFeGl0cyBhIGRldmljZS4KKyAqCisgKiBAcGFyYW0gZGxvY2sgVGhlIGRldmljZSBsb2NrIGluc3RhbmNlLgorICogQHBhcmFtIGZpbGVwIFRoZSBmaWxlIHN0cnVjdHVyZSBpZGVudGlmeWluZyB0aGUgY2FsbGluZyBwcm9jZXNzLgorICoKKyAqIEByZXR1cm4gMCBvbiBzdWNjZXNzLgorICovCitpbnQgbWVfZGxvY2tfZXhpdChzdHJ1Y3QgbWVfZGxvY2sgKmRsb2NrLCBzdHJ1Y3QgZmlsZSAqZmlsZXApOworCisvKioKKyAqIEBicmllZiBUcmllcyB0byBwZXJmb3JtIGEgbG9ja2luZyBhY3Rpb24gb24gYSBkZXZpY2UuCisgKgorICogQHBhcmFtIGRsb2NrIFRoZSBkZXZpY2UgbG9jayBpbnN0YW5jZS4KKyAqIEBwYXJhbSBmaWxlcCBUaGUgZmlsZSBzdHJ1Y3R1cmUgaWRlbnRpZnlpbmcgdGhlIGNhbGxpbmcgcHJvY2Vzcy4KKyAqIEBwYXJhbSBUaGUgYWN0aW9uIHRvIGJlIGRvbmUuCisgKiBAcGFyYW0gZmxhZ3MgRmxhZ3MgZnJvbSB1c2VyIHNwYWNlLgorICogQHBhcmFtIHNsaXN0IFRoZSBzdWJkZXZpY2UgbGlzdCBvZiB0aGUgZGV2aWNlLgorICoKKyAqIEByZXR1cm4gMCBvbiBzdWNjZXNzLgorICovCitpbnQgbWVfZGxvY2tfbG9jayhzdHJ1Y3QgbWVfZGxvY2sgKmRsb2NrLAorCQkgIHN0cnVjdCBmaWxlICpmaWxlcCwgaW50IGxvY2ssIGludCBmbGFncywgbWVfc2xpc3RfdCAqIHNsaXN0KTsKKworLyoqCisgKiBAYnJpZWYgSW5pdGlhbGl6ZXMgYSBsb2NrIHN0cnVjdHVyZS4KKyAqCisgKiBAcGFyYW0gZGxvY2sgVGhlIGxvY2sgc3RydWN0dXJlIHRvIGluaXRpYWxpemUuCisgKiBAcmV0dXJuIDAgb24gc3VjY2Vzcy4KKyAqLworaW50IG1lX2Rsb2NrX2luaXQobWVfZGxvY2tfdCAqIGRsb2NrKTsKKworLyoqCisgKiBAYnJpZWYgRGVpbml0aWFsaXplcyBhIGxvY2sgc3RydWN0dXJlLgorICoKKyAqIEBwYXJhbSBkbG9jayBUaGUgbG9jayBzdHJ1Y3R1cmUgdG8gZGVpbml0aWFsaXplLgorICogQHJldHVybiAwIG9uIHN1Y2Nlc3MuCisgKi8KK3ZvaWQgbWVfZGxvY2tfZGVpbml0KG1lX2Rsb2NrX3QgKiBkbG9jayk7CisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWVkcml2ZXIuaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZWRyaXZlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyZTI0MDgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWVkcml2ZXIuaApAQCAtMCwwICsxLDM1MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogU291cmNlIEZpbGUgOiBtZWRyaXZlci5oCisgKiBBdXRob3IgICAgICA6IEdHIChHdWVudGVyIEdlYmhhcmR0KSAgPGcuZ2ViaGFyZHRAbWVpbGhhdXMuZGU+CisgKiAgQXV0aG9yOglLcnp5c3p0b2YgR2FudHprZQk8ay5nYW50emtlQG1laWxoYXVzLmRlPgorICovCisKKyNpZm5kZWYgX01FRFJJVkVSX0hfCisjZGVmaW5lIF9NRURSSVZFUl9IXworCisjaW5jbHVkZSAibWV0eXBlcy5oIgorI2luY2x1ZGUgIm1lZXJyb3IuaCIKKyNpbmNsdWRlICJtZWRlZmluZXMuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisJLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkgIEZ1bmN0aW9ucyB0byBhY2Nlc3MgdGhlIGRyaXZlciBzeXN0ZW0KKwkgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisJaW50IG1lT3BlbihpbnQgaUZsYWdzKTsKKwlpbnQgbWVDbG9zZShpbnQgaUZsYWdzKTsKKworCWludCBtZUxvY2tEcml2ZXIoaW50IGlMb2NrLCBpbnQgaUZsYWdzKTsKKwlpbnQgbWVMb2NrRGV2aWNlKGludCBpRGV2aWNlLCBpbnQgaUxvY2ssIGludCBpRmxhZ3MpOworCWludCBtZUxvY2tTdWJkZXZpY2UoaW50IGlEZXZpY2UsIGludCBpU3ViZGV2aWNlLCBpbnQgaUxvY2ssIGludCBpRmxhZ3MpOworCisJLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkgIEVycm9yIGhhbmRsaW5nIGZ1bmN0aW9ucworCSAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKwlpbnQgbWVFcnJvckdldExhc3RNZXNzYWdlKGNoYXIgKnBjRXJyb3JNc2csIGludCBpQ291bnQpOworCWludCBtZUVycm9yR2V0TWVzc2FnZShpbnQgaUVycm9yQ29kZSwgY2hhciAqcGNFcnJvck1zZywgaW50IGlDb3VudCk7CisJaW50IG1lRXJyb3JTZXREZWZhdWx0UHJvYyhpbnQgaVN3aXRjaCk7CisJaW50IG1lRXJyb3JTZXRVc2VyUHJvYyhtZUVycm9yQ0JfdCBwRXJyb3JQcm9jKTsKKworCisJLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkgIEZ1bmN0aW9ucyB0byBwZXJmb3JtIEkvTyBvbiBhIGRldmljZQorCSAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKwlpbnQgbWVJT0lycVNldENhbGxiYWNrKAorCQkJaW50IGlEZXZpY2UsCisJCQlpbnQgaVN1YmRldmljZSwKKwkJCW1lSU9JcnFDQl90IHBDYWxsYmFjaywKKwkJCXZvaWQgKnBDYWxsYmFja0NvbnRleHQsCisJCQlpbnQgaUZsYWdzKTsKKwlpbnQgbWVJT0lycVN0YXJ0KAorCQkJaW50IGlEZXZpY2UsCisJCQlpbnQgaVN1YmRldmljZSwKKwkJCWludCBpQ2hhbm5lbCwKKwkJCWludCBpSXJxU291cmNlLAorCQkJaW50IGlJcnFFZGdlLAorCQkJaW50IGlJcnFBcmcsCisJCQlpbnQgaUZsYWdzKTsKKwlpbnQgbWVJT0lycVN0b3AoCisJCQlpbnQgaURldmljZSwKKwkJCWludCBpU3ViZGV2aWNlLAorCQkJaW50IGlDaGFubmVsLAorCQkJaW50IGlGbGFncyk7CisJaW50IG1lSU9JcnFXYWl0KAorCQkJaW50IGlEZXZpY2UsCisJCQlpbnQgaVN1YmRldmljZSwKKwkJCWludCBpQ2hhbm5lbCwKKwkJCWludCAqcGlJcnFDb3VudCwKKwkJCWludCAqcGlWYWx1ZSwKKwkJCWludCBpVGltZU91dCwKKwkJCWludCBpRmxhZ3MpOworCisJaW50IG1lSU9SZXNldERldmljZShpbnQgaURldmljZSwgaW50IGlGbGFncyk7CisJaW50IG1lSU9SZXNldFN1YmRldmljZShpbnQgaURldmljZSwgaW50IGlTdWJkZXZpY2UsIGludCBpRmxhZ3MpOworCisJaW50IG1lSU9TdHJlYW1GcmVxdWVuY3lUb1RpY2tzKAorCQkJaW50IGlEZXZpY2UsCisJCQlpbnQgaVN1YmRldmljZSwKKwkJCWludCBpVGltZXIsCisJCQlkb3VibGUgKnBkRnJlcXVlbmN5LAorCQkJaW50ICpwaVRpY2tzTG93LAorCQkJaW50ICpwaVRpY2tzSGlnaCwKKwkJCWludCBpRmxhZ3MpOworCisJaW50IG1lSU9TaW5nbGVDb25maWcoCisJCQlpbnQgaURldmljZSwKKwkJCWludCBpU3ViZGV2aWNlLAorCQkJaW50IGlDaGFubmVsLAorCQkJaW50IGlTaW5nbGVDb25maWcsCisJCQlpbnQgaVJlZiwKKwkJCWludCBpVHJpZ0NoYW4sCisJCQlpbnQgaVRyaWdUeXBlLAorCQkJaW50IGlUcmlnRWRnZSwKKwkJCWludCBpRmxhZ3MpOworCWludCBtZUlPU2luZ2xlKG1lSU9TaW5nbGVfdCAqcFNpbmdsZUxpc3QsIGludCBpQ291bnQsIGludCBpRmxhZ3MpOworCisJaW50IG1lSU9TdHJlYW1Db25maWcoCisJCQlpbnQgaURldmljZSwKKwkJCWludCBpU3ViZGV2aWNlLAorCQkJbWVJT1N0cmVhbUNvbmZpZ190ICpwQ29uZmlnTGlzdCwKKwkJCWludCBpQ291bnQsCisJCQltZUlPU3RyZWFtVHJpZ2dlcl90ICpwVHJpZ2dlciwKKwkJCWludCBpRmlmb0lycVRocmVzaG9sZCwKKwkJCWludCBpRmxhZ3MpOworCWludCBtZUlPU3RyZWFtTmV3VmFsdWVzKAorCQkJaW50IGlEZXZpY2UsCisJCQlpbnQgaVN1YmRldmljZSwKKwkJCWludCBpVGltZU91dCwKKwkJCWludCAqcGlDb3VudCwKKwkJCWludCBpRmxhZ3MpOworCWludCBtZUlPU3RyZWFtUmVhZCgKKwkJCWludCBpRGV2aWNlLAorCQkJaW50IGlTdWJkZXZpY2UsCisJCQlpbnQgaVJlYWRNb2RlLAorCQkJaW50ICpwaVZhbHVlcywKKwkJCWludCAqcGlDb3VudCwKKwkJCWludCBpRmxhZ3MpOworCWludCBtZUlPU3RyZWFtV3JpdGUoCisJCQlpbnQgaURldmljZSwKKwkJCWludCBpU3ViZGV2aWNlLAorCQkJaW50IGlXcml0ZU1vZGUsCisJCQlpbnQgKnBpVmFsdWVzLAorCQkJaW50ICpwaUNvdW50LAorCQkJaW50IGlGbGFncyk7CisJaW50IG1lSU9TdHJlYW1TdGFydChtZUlPU3RyZWFtU3RhcnRfdCAqcFN0YXJ0TGlzdCwgaW50IGlDb3VudCwgaW50IGlGbGFncyk7CisJaW50IG1lSU9TdHJlYW1TdG9wKG1lSU9TdHJlYW1TdG9wX3QgKnBTdG9wTGlzdCwgaW50IGlDb3VudCwgaW50IGlGbGFncyk7CisJaW50IG1lSU9TdHJlYW1TdGF0dXMoCisJCQlpbnQgaURldmljZSwKKwkJCWludCBpU3ViZGV2aWNlLAorCQkJaW50IGlXYWl0LAorCQkJaW50ICpwaVN0YXR1cywKKwkJCWludCAqcGlDb3VudCwKKwkJCWludCBpRmxhZ3MpOworCWludCBtZUlPU3RyZWFtU2V0Q2FsbGJhY2tzKAorCQkJaW50IGlEZXZpY2UsCisJCQlpbnQgaVN1YmRldmljZSwKKwkJCW1lSU9TdHJlYW1DQl90IHBTdGFydENCLAorCQkJdm9pZCAqcFN0YXJ0Q0JDb250ZXh0LAorCQkJbWVJT1N0cmVhbUNCX3QgcE5ld1ZhbHVlc0NCLAorCQkJdm9pZCAqcE5ld1ZhbHVlc0NCQ29udGV4dCwKKwkJCW1lSU9TdHJlYW1DQl90IHBFbmRDQiwKKwkJCXZvaWQgKnBFbmRDQkNvbnRleHQsCisJCQlpbnQgaUZsYWdzKTsKKwlpbnQgbWVJT1N0cmVhbVRpbWVUb1RpY2tzKAorCQkJaW50IGlEZXZpY2UsCisJCQlpbnQgaVN1YmRldmljZSwKKwkJCWludCBpVGltZXIsCisJCQlkb3VibGUgKnBkVGltZSwKKwkJCWludCAqcGlUaWNrc0xvdywKKwkJCWludCAqcGlUaWNrc0hpZ2gsCisJCQlpbnQgaUZsYWdzKTsKKworCisJLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkgIEZ1bmN0aW9ucyB0byBxdWVyeSB0aGUgZHJpdmVyIHN5c3RlbQorCSAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKwlpbnQgbWVRdWVyeURlc2NyaXB0aW9uRGV2aWNlKGludCBpRGV2aWNlLCBjaGFyICpwY0Rlc2NyaXB0aW9uLCBpbnQgaUNvdW50KTsKKworCWludCBtZVF1ZXJ5SW5mb0RldmljZSgKKwkJCWludCBpRGV2aWNlLAorCQkJaW50ICpwaVZlbmRvcklkLAorCQkJaW50ICpwaURldmljZUlkLAorCQkJaW50ICpwaVNlcmlhbE5vLAorCQkJaW50ICpwaUJ1c1R5cGUsCisJCQlpbnQgKnBpQnVzTm8sCisJCQlpbnQgKnBpRGV2Tm8sCisJCQlpbnQgKnBpRnVuY05vLAorCQkJaW50ICpwaVBsdWdnZWQpOworCisJaW50IG1lUXVlcnlOYW1lRGV2aWNlKGludCBpRGV2aWNlLCBjaGFyICpwY05hbWUsIGludCBpQ291bnQpOworCWludCBtZVF1ZXJ5TmFtZURldmljZURyaXZlcihpbnQgaURldmljZSwgY2hhciAqcGNOYW1lLCBpbnQgaUNvdW50KTsKKworCWludCBtZVF1ZXJ5TnVtYmVyRGV2aWNlcyhpbnQgKnBpTnVtYmVyKTsKKwlpbnQgbWVRdWVyeU51bWJlclN1YmRldmljZXMoaW50IGlEZXZpY2UsIGludCAqcGlOdW1iZXIpOworCWludCBtZVF1ZXJ5TnVtYmVyQ2hhbm5lbHMoaW50IGlEZXZpY2UsIGludCBpU3ViZGV2aWNlLCBpbnQgKnBpTnVtYmVyKTsKKwlpbnQgbWVRdWVyeU51bWJlclJhbmdlcygKKwkJCWludCBpRGV2aWNlLAorCQkJaW50IGlTdWJkZXZpY2UsCisJCQlpbnQgaVVuaXQsCisJCQlpbnQgKnBpTnVtYmVyKTsKKworCWludCBtZVF1ZXJ5UmFuZ2VCeU1pbk1heCgKKwkJCWludCBpRGV2aWNlLAorCQkJaW50IGlTdWJkZXZpY2UsCisJCQlpbnQgaVVuaXQsCisJCQlkb3VibGUgKnBkTWluLAorCQkJZG91YmxlICpwZE1heCwKKwkJCWludCAqcGlNYXhEYXRhLAorCQkJaW50ICpwaVJhbmdlKTsKKwlpbnQgbWVRdWVyeVJhbmdlSW5mbygKKwkJCWludCBpRGV2aWNlLAorCQkJaW50IGlTdWJkZXZpY2UsCisJCQlpbnQgaVJhbmdlLAorCQkJaW50ICpwaVVuaXQsCisJCQlkb3VibGUgKnBkTWluLAorCQkJZG91YmxlICpwZE1heCwKKwkJCWludCAqcGlNYXhEYXRhKTsKKworCWludCBtZVF1ZXJ5U3ViZGV2aWNlQnlUeXBlKAorCQkJaW50IGlEZXZpY2UsCisJCQlpbnQgaVN0YXJ0U3ViZGV2aWNlLAorCQkJaW50IGlUeXBlLAorCQkJaW50IGlTdWJ0eXBlLAorCQkJaW50ICpwaVN1YmRldmljZSk7CisJaW50IG1lUXVlcnlTdWJkZXZpY2VUeXBlKAorCQkJaW50IGlEZXZpY2UsCisJCQlpbnQgaVN1YmRldmljZSwKKwkJCWludCAqcGlUeXBlLAorCQkJaW50ICpwaVN1YnR5cGUpOworCWludCBtZVF1ZXJ5U3ViZGV2aWNlQ2FwcygKKwkJCWludCBpRGV2aWNlLAorCQkJaW50IGlTdWJkZXZpY2UsCisJCQlpbnQgKnBpQ2Fwcyk7CisJaW50IG1lUXVlcnlTdWJkZXZpY2VDYXBzQXJncygKKwkJCWludCBpRGV2aWNlLAorCQkJaW50IGlTdWJkZXZpY2UsCisJCQlpbnQgaUNhcCwKKwkJCWludCAqcGlBcmdzLAorCQkJaW50IGlDb3VudCk7CisKKwlpbnQgbWVRdWVyeVZlcnNpb25MaWJyYXJ5KGludCAqcGlWZXJzaW9uKTsKKwlpbnQgbWVRdWVyeVZlcnNpb25NYWluRHJpdmVyKGludCAqcGlWZXJzaW9uKTsKKwlpbnQgbWVRdWVyeVZlcnNpb25EZXZpY2VEcml2ZXIoaW50IGlEZXZpY2UsIGludCAqcGlWZXJzaW9uKTsKKworCisJLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkgIENvbW1vbiB1dGlsaXR5IGZ1bmN0aW9ucworCSAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKwlpbnQgbWVVdGlsaXR5RXh0cmFjdFZhbHVlcygKKwkJCWludCBpQ2hhbm5lbCwKKwkJCWludCAqcGlBSUJ1ZmZlciwKKwkJCWludCBpQUlCdWZmZXJDb3VudCwKKwkJCW1lSU9TdHJlYW1Db25maWdfdCAqcENvbmZpZ0xpc3QsCisJCQlpbnQgaUNvbmZpZ0xpc3RDb3VudCwKKwkJCWludCAqcGlDaGFuQnVmZmVyLAorCQkJaW50ICpwaUNoYW5CdWZmZXJDb3VudCk7CisJaW50IG1lVXRpbGl0eURpZ2l0YWxUb1BoeXNpY2FsKAorCQkJZG91YmxlIGRNaW4sCisJCQlkb3VibGUgZE1heCwKKwkJCWludCBpTWF4RGF0YSwKKwkJCWludCBpRGF0YSwKKwkJCWludCBpTW9kdWxlVHlwZSwKKwkJCWRvdWJsZSBkUmVmVmFsdWUsCisJCQlkb3VibGUgKnBkUGh5c2ljYWwpOworCWludCBtZVV0aWxpdHlEaWdpdGFsVG9QaHlzaWNhbFYoCisJCQlkb3VibGUgZE1pbiwKKwkJCWRvdWJsZSBkTWF4LAorCQkJaW50IGlNYXhEYXRhLAorCQkJaW50ICpwaURhdGFCdWZmZXIsCisJCQlpbnQgaUNvdW50LAorCQkJaW50IGlNb2R1bGVUeXBlLAorCQkJZG91YmxlIGRSZWZWYWx1ZSwKKwkJCWRvdWJsZSAqcGRQaHlzaWNhbEJ1ZmZlcik7CisJaW50IG1lVXRpbGl0eVBoeXNpY2FsVG9EaWdpdGFsKAorCQkJZG91YmxlIGRNaW4sCisJCQlkb3VibGUgZE1heCwKKwkJCWludCBpTWF4RGF0YSwKKwkJCWRvdWJsZSBkUGh5c2ljYWwsCisJCQlpbnQgKnBpRGF0YSk7CisJaW50IG1lVXRpbGl0eVBXTVN0YXJ0KAorCQkJaW50IGlEZXZpY2UsCisJCQlpbnQgaVN1YmRldmljZTEsCisJCQlpbnQgaVN1YmRldmljZTIsCisJCQlpbnQgaVN1YmRldmljZTMsCisJCQlpbnQgaVJlZiwKKwkJCWludCBpUHJlc2NhbGVyLAorCQkJaW50IGlEdXR5Q3ljbGUsCisJCQlpbnQgaUZsYWcpOworCWludCBtZVV0aWxpdHlQV01TdG9wKGludCBpRGV2aWNlLAorCQkJaW50IGlTdWJkZXZpY2UxKTsKKwlpbnQgbWVVdGlsaXR5UFdNUmVzdGFydCgKKwkJCWludCBpRGV2aWNlLAorCQkJaW50IGlTdWJkZXZpY2UxLAorCQkJaW50IGlSZWYsCisJCQlpbnQgaVByZXNjYWxlcik7CisKKworCS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJICBMb2FkIGNvbmZpZ3VyYXRpb24gZnJvbSBmaWxlIGludG8gZHJpdmVyIHN5c3RlbQorCSAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKwlpbnQgbWVDb25maWdMb2FkKGNoYXIgKnBjQ29uZmlnRmlsZSk7CisKKworCS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJICBGdW5jdGlvbnMgdG8gcXVlcnkgYSByZW1vdGUgZHJpdmVyIHN5c3RlbQorCSAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKwlpbnQgbWVSUXVlcnlEZXNjcmlwdGlvbkRldmljZSgKKwkJCWNoYXIgKmxvY2F0aW9uLAorCQkJaW50IGlEZXZpY2UsCisJCQljaGFyICpwY0Rlc2NyaXB0aW9uLAorCQkJaW50IGlDb3VudCk7CisKKwlpbnQgbWVSUXVlcnlJbmZvRGV2aWNlKAorCQkJY2hhciAqbG9jYXRpb24sCisJCQlpbnQgaURldmljZSwKKwkJCWludCAqcGlWZW5kb3JJZCwKKwkJCWludCAqcGlEZXZpY2VJZCwKKwkJCWludCAqcGlTZXJpYWxObywKKwkJCWludCAqcGlCdXNUeXBlLAorCQkJaW50ICpwaUJ1c05vLAorCQkJaW50ICpwaURldk5vLAorCQkJaW50ICpwaUZ1bmNObywKKwkJCWludCAqcGlQbHVnZ2VkKTsKKworCWludCBtZVJRdWVyeU5hbWVEZXZpY2UoCisJCQljaGFyICpsb2NhdGlvbiwKKwkJCWludCBpRGV2aWNlLAorCQkJY2hhciAqcGNOYW1lLAorCQkJaW50IGlDb3VudCk7CisKKwlpbnQgbWVSUXVlcnlOdW1iZXJEZXZpY2VzKGNoYXIgKmxvY2F0aW9uLCBpbnQgKnBpTnVtYmVyKTsKKwlpbnQgbWVSUXVlcnlOdW1iZXJTdWJkZXZpY2VzKGNoYXIgKmxvY2F0aW9uLCBpbnQgaURldmljZSwgaW50ICpwaU51bWJlcik7CisJaW50IG1lUlF1ZXJ5TnVtYmVyQ2hhbm5lbHMoCisJCQljaGFyICpsb2NhdGlvbiwKKwkJCWludCBpRGV2aWNlLAorCQkJaW50IGlTdWJkZXZpY2UsCisJCQlpbnQgKnBpTnVtYmVyKTsKKwlpbnQgbWVSUXVlcnlOdW1iZXJSYW5nZXMoCisJCQljaGFyICpsb2NhdGlvbiwKKwkJCWludCBpRGV2aWNlLAorCQkJaW50IGlTdWJkZXZpY2UsCisJCQlpbnQgaVVuaXQsCisJCQlpbnQgKnBpTnVtYmVyKTsKKworCWludCBtZVJRdWVyeVJhbmdlSW5mbygKKwkJCWNoYXIgKmxvY2F0aW9uLAorCQkJaW50IGlEZXZpY2UsCisJCQlpbnQgaVN1YmRldmljZSwKKwkJCWludCBpUmFuZ2UsCisJCQlpbnQgKnBpVW5pdCwKKwkJCWRvdWJsZSAqcGRNaW4sCisJCQlkb3VibGUgKnBkTWF4LAorCQkJaW50ICpwaU1heERhdGEpOworCisJaW50IG1lUlF1ZXJ5U3ViZGV2aWNlVHlwZSgKKwkJCWNoYXIgKmxvY2F0aW9uLAorCQkJaW50IGlEZXZpY2UsCisJCQlpbnQgaVN1YmRldmljZSwKKwkJCWludCAqcGlUeXBlLAorCQkJaW50ICpwaVN1YnR5cGUpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZWR1bW15LmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWVkdW1teS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhOWYwOGQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWVkdW1teS5jCkBAIC0wLDAgKzEsMTI2NiBAQAorLyogRGV2aWNlIGRyaXZlciBmb3IgTWVpbGhhdXMgTUUtRFVNTVkgZGV2aWNlcy4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiAgICBDb3B5cmlnaHQgKEMpIDIwMDUgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqICAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKy8qCisgKiBVc2VyIGFwcGxpY2F0aW9uIGNvdWxkIGFsc28gaW5jbHVkZSB0aGUga2VybmVsIGhlYWRlciBmaWxlcy4gQnV0IHRoZQorICogcmVhbCBrZXJuZWwgZnVuY3Rpb25zIGFyZSBwcm90ZWN0ZWQgYnkgI2lmZGVmIF9fS0VSTkVMX18uCisgKi8KKyNpZm5kZWYgX19LRVJORUxfXworIyAgZGVmaW5lIF9fS0VSTkVMX18KKyNlbmRpZgorCisvKgorICogVGhpcyBtdXN0IGJlIGRlZmluZWQgYmVmb3JlIG1vZHVsZS5oIGlzIGluY2x1ZGVkLiBOb3QgbmVlZGVkLCB3aGVuCisgKiBpdCBpcyBhIGJ1aWx0IGluIGRyaXZlci4KKyAqLworI2lmbmRlZiBNT0RVTEUKKyMgIGRlZmluZSBNT0RVTEUKKyNlbmRpZgorCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCisjaW5jbHVkZSAibWVlcnJvci5oIgorI2luY2x1ZGUgIm1laW50ZXJuYWwuaCIKKworI2luY2x1ZGUgIm1laWRzLmgiCisjaW5jbHVkZSAibWVjb21tb24uaCIKKyNpbmNsdWRlICJtZWRldmljZS5oIgorI2luY2x1ZGUgIm1lZGVidWcuaCIKKworI2luY2x1ZGUgIm1lZHVtbXkuaCIKKworc3RhdGljIGludCBtZWR1bW15X2lvX2lycV9zdGFydChtZV9kZXZpY2VfdCAqIGRldmljZSwKKwkJCQlzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJaW50IHN1YmRldmljZSwKKwkJCQlpbnQgY2hhbm5lbCwKKwkJCQlpbnQgaXJxX3NvdXJjZSwKKwkJCQlpbnQgaXJxX2VkZ2UsIGludCBpcnFfYXJnLCBpbnQgZmxhZ3MpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCXJldHVybiBNRV9FUlJOT19ERVZJQ0VfVU5QTFVHR0VEOworfQorCitzdGF0aWMgaW50IG1lZHVtbXlfaW9faXJxX3dhaXQobWVfZGV2aWNlX3QgKiBkZXZpY2UsCisJCQkgICAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJICAgICAgIGludCBzdWJkZXZpY2UsCisJCQkgICAgICAgaW50IGNoYW5uZWwsCisJCQkgICAgICAgaW50ICppcnFfY291bnQsCisJCQkgICAgICAgaW50ICp2YWx1ZSwgaW50IHRpbWVvdXQsIGludCBmbGFncykKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJcmV0dXJuIE1FX0VSUk5PX0RFVklDRV9VTlBMVUdHRUQ7Cit9CisKK3N0YXRpYyBpbnQgbWVkdW1teV9pb19pcnFfc3RvcChtZV9kZXZpY2VfdCAqIGRldmljZSwKKwkJCSAgICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkgICAgICAgaW50IHN1YmRldmljZSwgaW50IGNoYW5uZWwsIGludCBmbGFncykKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJcmV0dXJuIE1FX0VSUk5PX0RFVklDRV9VTlBMVUdHRUQ7Cit9CisKK3N0YXRpYyBpbnQgbWVkdW1teV9pb19yZXNldF9kZXZpY2UobWVfZGV2aWNlX3QgKiBkZXZpY2UsCisJCQkJICAgc3RydWN0IGZpbGUgKmZpbGVwLCBpbnQgZmxhZ3MpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCXJldHVybiBNRV9FUlJOT19ERVZJQ0VfVU5QTFVHR0VEOworfQorCitzdGF0aWMgaW50IG1lZHVtbXlfaW9fcmVzZXRfc3ViZGV2aWNlKG1lX2RldmljZV90ICogZGV2aWNlLAorCQkJCSAgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgICBpbnQgc3ViZGV2aWNlLCBpbnQgZmxhZ3MpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCXJldHVybiBNRV9FUlJOT19ERVZJQ0VfVU5QTFVHR0VEOworfQorCitzdGF0aWMgaW50IG1lZHVtbXlfaW9fc2luZ2xlX2NvbmZpZyhtZV9kZXZpY2VfdCAqIGRldmljZSwKKwkJCQkgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICBpbnQgc3ViZGV2aWNlLAorCQkJCSAgICBpbnQgY2hhbm5lbCwKKwkJCQkgICAgaW50IHNpbmdsZV9jb25maWcsCisJCQkJICAgIGludCByZWYsCisJCQkJICAgIGludCB0cmlnX2NoYW4sCisJCQkJICAgIGludCB0cmlnX3R5cGUsIGludCB0cmlnX2VkZ2UsIGludCBmbGFncykKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJcmV0dXJuIE1FX0VSUk5PX0RFVklDRV9VTlBMVUdHRUQ7Cit9CisKK3N0YXRpYyBpbnQgbWVkdW1teV9pb19zaW5nbGVfcmVhZChtZV9kZXZpY2VfdCAqIGRldmljZSwKKwkJCQkgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgIGludCBzdWJkZXZpY2UsCisJCQkJICBpbnQgY2hhbm5lbCwKKwkJCQkgIGludCAqdmFsdWUsIGludCB0aW1lX291dCwgaW50IGZsYWdzKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwlyZXR1cm4gTUVfRVJSTk9fREVWSUNFX1VOUExVR0dFRDsKK30KKworc3RhdGljIGludCBtZWR1bW15X2lvX3NpbmdsZV93cml0ZShtZV9kZXZpY2VfdCAqIGRldmljZSwKKwkJCQkgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgaW50IHN1YmRldmljZSwKKwkJCQkgICBpbnQgY2hhbm5lbCwKKwkJCQkgICBpbnQgdmFsdWUsIGludCB0aW1lX291dCwgaW50IGZsYWdzKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwlyZXR1cm4gTUVfRVJSTk9fREVWSUNFX1VOUExVR0dFRDsKK30KKworc3RhdGljIGludCBtZWR1bW15X2lvX3N0cmVhbV9jb25maWcobWVfZGV2aWNlX3QgKiBkZXZpY2UsCisJCQkJICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgaW50IHN1YmRldmljZSwKKwkJCQkgICAgbWVJT1N0cmVhbUNvbmZpZ190ICogY29uZmlnX2xpc3QsCisJCQkJICAgIGludCBjb3VudCwKKwkJCQkgICAgbWVJT1N0cmVhbVRyaWdnZXJfdCAqIHRyaWdnZXIsCisJCQkJICAgIGludCBmaWZvX2lycV90aHJlc2hvbGQsIGludCBmbGFncykKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJcmV0dXJuIE1FX0VSUk5PX0RFVklDRV9VTlBMVUdHRUQ7Cit9CisKK3N0YXRpYyBpbnQgbWVkdW1teV9pb19zdHJlYW1fbmV3X3ZhbHVlcyhtZV9kZXZpY2VfdCAqIGRldmljZSwKKwkJCQkJc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCQlpbnQgc3ViZGV2aWNlLAorCQkJCQlpbnQgdGltZW91dCwgaW50ICpjb3VudCwgaW50IGZsYWdzKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwlyZXR1cm4gTUVfRVJSTk9fREVWSUNFX1VOUExVR0dFRDsKK30KKworc3RhdGljIGludCBtZWR1bW15X2lvX3N0cmVhbV9yZWFkKG1lX2RldmljZV90ICogZGV2aWNlLAorCQkJCSAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgaW50IHN1YmRldmljZSwKKwkJCQkgIGludCByZWFkX21vZGUsCisJCQkJICBpbnQgKnZhbHVlcywgaW50ICpjb3VudCwgaW50IGZsYWdzKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwlyZXR1cm4gTUVfRVJSTk9fREVWSUNFX1VOUExVR0dFRDsKK30KKworc3RhdGljIGludCBtZWR1bW15X2lvX3N0cmVhbV9zdGFydChtZV9kZXZpY2VfdCAqIGRldmljZSwKKwkJCQkgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgaW50IHN1YmRldmljZSwKKwkJCQkgICBpbnQgc3RhcnRfbW9kZSwgaW50IHRpbWVfb3V0LCBpbnQgZmxhZ3MpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCXJldHVybiBNRV9FUlJOT19ERVZJQ0VfVU5QTFVHR0VEOworfQorCitzdGF0aWMgaW50IG1lZHVtbXlfaW9fc3RyZWFtX3N0YXR1cyhtZV9kZXZpY2VfdCAqIGRldmljZSwKKwkJCQkgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICBpbnQgc3ViZGV2aWNlLAorCQkJCSAgICBpbnQgd2FpdCwKKwkJCQkgICAgaW50ICpzdGF0dXMsIGludCAqdmFsdWVzLCBpbnQgZmxhZ3MpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCXJldHVybiBNRV9FUlJOT19ERVZJQ0VfVU5QTFVHR0VEOworfQorCitzdGF0aWMgaW50IG1lZHVtbXlfaW9fc3RyZWFtX3N0b3AobWVfZGV2aWNlX3QgKiBkZXZpY2UsCisJCQkJICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICBpbnQgc3ViZGV2aWNlLCBpbnQgc3RvcF9tb2RlLCBpbnQgZmxhZ3MpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCXJldHVybiBNRV9FUlJOT19ERVZJQ0VfVU5QTFVHR0VEOworfQorCitzdGF0aWMgaW50IG1lZHVtbXlfaW9fc3RyZWFtX3dyaXRlKG1lX2RldmljZV90ICogZGV2aWNlLAorCQkJCSAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICBpbnQgc3ViZGV2aWNlLAorCQkJCSAgIGludCB3cml0ZV9tb2RlLAorCQkJCSAgIGludCAqdmFsdWVzLCBpbnQgKmNvdW50LCBpbnQgZmxhZ3MpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCXJldHVybiBNRV9FUlJOT19ERVZJQ0VfVU5QTFVHR0VEOworfQorCitzdGF0aWMgaW50IG1lZHVtbXlfbG9ja19kZXZpY2UobWVfZGV2aWNlX3QgKiBkZXZpY2UsCisJCQkgICAgICAgc3RydWN0IGZpbGUgKmZpbGVwLCBpbnQgbG9jaywgaW50IGZsYWdzKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwlyZXR1cm4gTUVfRVJSTk9fREVWSUNFX1VOUExVR0dFRDsKK30KKworc3RhdGljIGludCBtZWR1bW15X2xvY2tfc3ViZGV2aWNlKG1lX2RldmljZV90ICogZGV2aWNlLAorCQkJCSAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgaW50IHN1YmRldmljZSwgaW50IGxvY2ssIGludCBmbGFncykKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJcmV0dXJuIE1FX0VSUk5PX0RFVklDRV9VTlBMVUdHRUQ7Cit9CisKK3N0YXRpYyBpbnQgbWVkdW1teV9xdWVyeV9kZXNjcmlwdGlvbl9kZXZpY2UobWVfZGV2aWNlX3QgKiBkZXZpY2UsCisJCQkJCSAgICBjaGFyICoqZGVzY3JpcHRpb24pCit7CisJbWVkdW1teV9kZXZpY2VfdCAqaW5zdGFuY2UgPSAobWVkdW1teV9kZXZpY2VfdCAqKSBkZXZpY2U7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKy8vICAgICAgaWYgKGluc3RhbmNlLT5tYWdpYyAhPSBNRURVTU1ZX01BR0lDX05VTUJFUikKKy8vICAgICAgeworLy8gICAgICAgICAgICAgIFBFUlJPUigiV3JvbmcgbWFnaWMgbnVtYmVyLlxuIik7CisvLyAgICAgICAgICAgICAgcmV0dXJuIE1FX0VSUk5PX0lOVEVSTkFMOworLy8gICAgICB9CisKKwlzd2l0Y2ggKGluc3RhbmNlLT5kZXZpY2VfaWQpIHsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTEwMDA6CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxMDAwX0E6CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxMDAwX0I6CisJCSpkZXNjcmlwdGlvbiA9IE1FMTAwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUUxMDAwOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTQwMDoKKwkJKmRlc2NyaXB0aW9uID0gTUUxNDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTE0MDA7CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNDBBOgorCQkqZGVzY3JpcHRpb24gPSBNRTE0MDBfREVTQ1JJUFRJT05fREVWSUNFX01FMTQwMEE7CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNDBCOgorCQkqZGVzY3JpcHRpb24gPSBNRTE0MDBfREVTQ1JJUFRJT05fREVWSUNFX01FMTQwMEI7CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNEUwOgorCQkqZGVzY3JpcHRpb24gPSBNRTE0MDBfREVTQ1JJUFRJT05fREVWSUNFX01FMTQwMEU7CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNEVBOgorCQkqZGVzY3JpcHRpb24gPSBNRTE0MDBfREVTQ1JJUFRJT05fREVWSUNFX01FMTQwMEVBOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTRFQjoKKwkJKmRlc2NyaXB0aW9uID0gTUUxNDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTE0MDBFQjsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE0MEM6CisJCSpkZXNjcmlwdGlvbiA9IE1FMTQwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUUxNDAwQzsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE0MEQ6CisJCSpkZXNjcmlwdGlvbiA9IE1FMTQwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUUxNDAwRDsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE2MDBfNFU6CisJCSpkZXNjcmlwdGlvbiA9IE1FMTYwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUUxNjAwNFU7CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNjAwXzhVOgorCQkqZGVzY3JpcHRpb24gPSBNRTE2MDBfREVTQ1JJUFRJT05fREVWSUNFX01FMTYwMDhVOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTYwMF8xMlU6CisJCSpkZXNjcmlwdGlvbiA9IE1FMTYwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUUxNjAwMTJVOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTYwMF8xNlU6CisJCSpkZXNjcmlwdGlvbiA9IE1FMTYwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUUxNjAwMTZVOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTYwMF8xNlVfOEk6CisJCSpkZXNjcmlwdGlvbiA9IE1FMTYwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUUxNjAwMTZVOEk7CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjEwOgorCQkqZGVzY3JpcHRpb24gPSBNRTQ2MDBfREVTQ1JJUFRJT05fREVWSUNFX01FNDYxMDsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2NTA6CisJCSpkZXNjcmlwdGlvbiA9IE1FNDYwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU0NjUwOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDY2MDoKKwkJKmRlc2NyaXB0aW9uID0gTUU0NjAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTQ2NjA7CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjYwSToKKwkJKmRlc2NyaXB0aW9uID0gTUU0NjAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTQ2NjBJOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDY2MFM6CisJCSpkZXNjcmlwdGlvbiA9IE1FNDYwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU0NjYwUzsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2NjBJUzoKKwkJKmRlc2NyaXB0aW9uID0gTUU0NjAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTQ2NjBJUzsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2NzA6CisJCSpkZXNjcmlwdGlvbiA9IE1FNDYwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU0NjcwOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDY3MEk6CisJCSpkZXNjcmlwdGlvbiA9IE1FNDYwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU0NjcwSTsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2NzBTOgorCQkqZGVzY3JpcHRpb24gPSBNRTQ2MDBfREVTQ1JJUFRJT05fREVWSUNFX01FNDY3MFM7CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjcwSVM6CisJCSpkZXNjcmlwdGlvbiA9IE1FNDYwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU0NjcwSVM7CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjgwOgorCQkqZGVzY3JpcHRpb24gPSBNRTQ2MDBfREVTQ1JJUFRJT05fREVWSUNFX01FNDY4MDsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2ODBJOgorCQkqZGVzY3JpcHRpb24gPSBNRTQ2MDBfREVTQ1JJUFRJT05fREVWSUNFX01FNDY4MEk7CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjgwUzoKKwkJKmRlc2NyaXB0aW9uID0gTUU0NjAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTQ2ODBTOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDY4MElTOgorCQkqZGVzY3JpcHRpb24gPSBNRTQ2MDBfREVTQ1JJUFRJT05fREVWSUNFX01FNDY4MElTOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjAwNDoKKwkJKmRlc2NyaXB0aW9uID0gTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYwMDA0OworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjAwODoKKwkJKmRlc2NyaXB0aW9uID0gTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYwMDA4OworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjAwRjoKKwkJKmRlc2NyaXB0aW9uID0gTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYwMDAxNjsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwMTQ6CisJCSpkZXNjcmlwdGlvbiA9IE1FNjAwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU2MDAwSTQ7CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDE4OgorCQkqZGVzY3JpcHRpb24gPSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjAwMEk4OworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjAxRjoKKwkJKmRlc2NyaXB0aW9uID0gTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYwMDBJMTY7CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDM0OgorCQkqZGVzY3JpcHRpb24gPSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjAwMElTTEU0OworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjAzODoKKwkJKmRlc2NyaXB0aW9uID0gTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYwMDBJU0xFODsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwM0Y6CisJCSpkZXNjcmlwdGlvbiA9IE1FNjAwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU2MDAwSVNMRTE2OworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjEwNDoKKwkJKmRlc2NyaXB0aW9uID0gTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYxMDA0OworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjEwODoKKwkJKmRlc2NyaXB0aW9uID0gTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYxMDA4OworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjEwRjoKKwkJKmRlc2NyaXB0aW9uID0gTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYxMDAxNjsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYxMTQ6CisJCSpkZXNjcmlwdGlvbiA9IE1FNjAwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU2MTAwSTQ7CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTE4OgorCQkqZGVzY3JpcHRpb24gPSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjEwMEk4OworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjExRjoKKwkJKmRlc2NyaXB0aW9uID0gTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYxMDBJMTY7CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTM0OgorCQkqZGVzY3JpcHRpb24gPSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjEwMElTTEU0OworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjEzODoKKwkJKmRlc2NyaXB0aW9uID0gTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYxMDBJU0xFODsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYxM0Y6CisJCSpkZXNjcmlwdGlvbiA9IE1FNjAwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU2MTAwSVNMRTE2OworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjA0NDoKKwkJKmRlc2NyaXB0aW9uID0gTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYwMDA0RElPOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjA0ODoKKwkJKmRlc2NyaXB0aW9uID0gTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYwMDA4RElPOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjA0RjoKKwkJKmRlc2NyaXB0aW9uID0gTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYwMDAxNkRJTzsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwNTQ6CisJCSpkZXNjcmlwdGlvbiA9IE1FNjAwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU2MDAwSTRESU87CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDU4OgorCQkqZGVzY3JpcHRpb24gPSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjAwMEk4RElPOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjA1RjoKKwkJKmRlc2NyaXB0aW9uID0gTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYwMDBJMTZESU87CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDc0OgorCQkqZGVzY3JpcHRpb24gPSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjAwMElTTEU0RElPOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjA3ODoKKwkJKmRlc2NyaXB0aW9uID0gTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYwMDBJU0xFOERJTzsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwN0Y6CisJCSpkZXNjcmlwdGlvbiA9IE1FNjAwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU2MDAwSVNMRTE2RElPOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjE0NDoKKwkJKmRlc2NyaXB0aW9uID0gTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYxMDA0RElPOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjE0ODoKKwkJKmRlc2NyaXB0aW9uID0gTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYxMDA4RElPOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjE0RjoKKwkJKmRlc2NyaXB0aW9uID0gTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYxMDAxNkRJTzsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYxNTQ6CisJCSpkZXNjcmlwdGlvbiA9IE1FNjAwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU2MTAwSTRESU87CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTU4OgorCQkqZGVzY3JpcHRpb24gPSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjEwMEk4RElPOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjE1RjoKKwkJKmRlc2NyaXB0aW9uID0gTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYxMDBJMTZESU87CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTc0OgorCQkqZGVzY3JpcHRpb24gPSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjEwMElTTEU0RElPOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjE3ODoKKwkJKmRlc2NyaXB0aW9uID0gTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYxMDBJU0xFOERJTzsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYxN0Y6CisJCSpkZXNjcmlwdGlvbiA9IE1FNjAwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU2MTAwSVNMRTE2RElPOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjI1OToKKwkJKmRlc2NyaXB0aW9uID0gTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYyMDBJOURJTzsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYzNTk6CisJCSpkZXNjcmlwdGlvbiA9IE1FNjAwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU2MzAwSTlESU87CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUwNjMwOgorCQkqZGVzY3JpcHRpb24gPSBNRTA2MDBfREVTQ1JJUFRJT05fREVWSUNFX01FMDYzMDsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTgxMDBfQToKKwkJKmRlc2NyaXB0aW9uID0gTUU4MTAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTgxMDBBOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FODEwMF9COgorCQkqZGVzY3JpcHRpb24gPSBNRTgxMDBfREVTQ1JJUFRJT05fREVWSUNFX01FODEwMEI7CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUwOTQwOgorCQkqZGVzY3JpcHRpb24gPSBNRTA5MDBfREVTQ1JJUFRJT05fREVWSUNFX01FMDk0MDsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTA5NTA6CisJCSpkZXNjcmlwdGlvbiA9IE1FMDkwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUUwOTUwOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMDk2MDoKKwkJKmRlc2NyaXB0aW9uID0gTUUwOTAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTA5NjA7CisKKwkJYnJlYWs7CisvKgorCQljYXNlIFVTQl9ERVZJQ0VfSURfTUVQSElTVE9fUzE6CisJCQkqZGVzY3JpcHRpb24gPSBNRVBISVNUT19TMV9ERVNDUklQVElPTl9ERVZJQ0U7CisKKwkJCWJyZWFrOworKi8KKwlkZWZhdWx0OgorCQkqZGVzY3JpcHRpb24gPSBFTVBUWV9ERVNDUklQVElPTl9ERVZJQ0U7CisJCVBFUlJPUigiSW52YWxpZCBkZXZpY2UgaWQgaW4gZGV2aWNlIGluZm8uXG4iKTsKKworCQlyZXR1cm4gTUVfRVJSTk9fSU5URVJOQUw7CisJfQorCisJcmV0dXJuIE1FX0VSUk5PX0RFVklDRV9VTlBMVUdHRUQ7Cit9CisKK3N0YXRpYyBpbnQgbWVkdW1teV9xdWVyeV9pbmZvX2RldmljZShtZV9kZXZpY2VfdCAqIGRldmljZSwKKwkJCQkgICAgIGludCAqdmVuZG9yX2lkLAorCQkJCSAgICAgaW50ICpkZXZpY2VfaWQsCisJCQkJICAgICBpbnQgKnNlcmlhbF9ubywKKwkJCQkgICAgIGludCAqYnVzX3R5cGUsCisJCQkJICAgICBpbnQgKmJ1c19ubywKKwkJCQkgICAgIGludCAqZGV2X25vLCBpbnQgKmZ1bmNfbm8sIGludCAqcGx1Z2dlZCkKK3sKKwltZWR1bW15X2RldmljZV90ICppbnN0YW5jZSA9IChtZWR1bW15X2RldmljZV90ICopIGRldmljZTsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworLy8gICAgICBpZiAoaW5zdGFuY2UtPm1hZ2ljICE9IE1FRFVNTVlfTUFHSUNfTlVNQkVSKQorLy8gICAgICB7CisvLyAgICAgICAgICAgICAgUEVSUk9SKCJXcm9uZyBtYWdpYyBudW1iZXIuXG4iKTsKKy8vICAgICAgICAgICAgICByZXR1cm4gTUVfRVJSTk9fSU5URVJOQUw7CisvLyAgICAgIH0KKworCSp2ZW5kb3JfaWQgPSBpbnN0YW5jZS0+dmVuZG9yX2lkOworCSpkZXZpY2VfaWQgPSBpbnN0YW5jZS0+ZGV2aWNlX2lkOworCSpzZXJpYWxfbm8gPSBpbnN0YW5jZS0+c2VyaWFsX25vOworCSpidXNfdHlwZSA9IGluc3RhbmNlLT5idXNfdHlwZTsKKwkqYnVzX25vID0gaW5zdGFuY2UtPmJ1c19ubzsKKwkqZGV2X25vID0gaW5zdGFuY2UtPmRldl9ubzsKKwkqZnVuY19ubyA9IGluc3RhbmNlLT5mdW5jX25vOworCSpwbHVnZ2VkID0gTUVfUExVR0dFRF9PVVQ7CisKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZWR1bW15X3F1ZXJ5X25hbWVfZGV2aWNlX2RyaXZlcihtZV9kZXZpY2VfdCAqIGRldmljZSwgY2hhciAqKm5hbWUpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCSpuYW1lID0gTUVEVU1NWV9OQU1FX0RSSVZFUjsKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZWR1bW15X3F1ZXJ5X25hbWVfZGV2aWNlKG1lX2RldmljZV90ICogZGV2aWNlLCBjaGFyICoqbmFtZSkKK3sKKwltZWR1bW15X2RldmljZV90ICppbnN0YW5jZSA9IChtZWR1bW15X2RldmljZV90ICopIGRldmljZTsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworLy8gLy8gLy8gICAgICAgIGlmIChpbnN0YW5jZS0+bWFnaWMgIT0gTUVEVU1NWV9NQUdJQ19OVU1CRVIpCisvLyAvLyAvLyAgICAgICAgeworLy8gLy8gLy8gICAgICAgICAgICAgICAgUEVSUk9SKCJXcm9uZyBtYWdpYyBudW1iZXIuXG4iKTsKKy8vIC8vIC8vICAgICAgICAgICAgICAgIHJldHVybiBNRV9FUlJOT19JTlRFUk5BTDsKKy8vIC8vIC8vICAgICAgICB9CisKKwlzd2l0Y2ggKGluc3RhbmNlLT5kZXZpY2VfaWQpIHsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTEwMDA6CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxMDAwX0E6CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxMDAwX0I6CisJCSpuYW1lID0gTUUxMDAwX05BTUVfREVWSUNFX01FMTAwMDsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE0MDA6CisJCSpuYW1lID0gTUUxNDAwX05BTUVfREVWSUNFX01FMTQwMDsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE0MEE6CisJCSpuYW1lID0gTUUxNDAwX05BTUVfREVWSUNFX01FMTQwMEE7CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNDBCOgorCQkqbmFtZSA9IE1FMTQwMF9OQU1FX0RFVklDRV9NRTE0MDBCOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTRFMDoKKwkJKm5hbWUgPSBNRTE0MDBfTkFNRV9ERVZJQ0VfTUUxNDAwRTsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE0RUE6CisJCSpuYW1lID0gTUUxNDAwX05BTUVfREVWSUNFX01FMTQwMEVBOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTRFQjoKKwkJKm5hbWUgPSBNRTE0MDBfTkFNRV9ERVZJQ0VfTUUxNDAwRUI7CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNDBDOgorCQkqbmFtZSA9IE1FMTQwMF9OQU1FX0RFVklDRV9NRTE0MDBDOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTQwRDoKKwkJKm5hbWUgPSBNRTE0MDBfTkFNRV9ERVZJQ0VfTUUxNDAwRDsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE2MDBfNFU6CisJCSpuYW1lID0gTUUxNjAwX05BTUVfREVWSUNFX01FMTYwMDRVOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTYwMF84VToKKwkJKm5hbWUgPSBNRTE2MDBfTkFNRV9ERVZJQ0VfTUUxNjAwOFU7CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNjAwXzEyVToKKwkJKm5hbWUgPSBNRTE2MDBfTkFNRV9ERVZJQ0VfTUUxNjAwMTJVOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTYwMF8xNlU6CisJCSpuYW1lID0gTUUxNjAwX05BTUVfREVWSUNFX01FMTYwMDE2VTsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE2MDBfMTZVXzhJOgorCQkqbmFtZSA9IE1FMTYwMF9OQU1FX0RFVklDRV9NRTE2MDAxNlU4STsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2MTA6CisJCSpuYW1lID0gTUU0NjAwX05BTUVfREVWSUNFX01FNDYxMDsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2NTA6CisJCSpuYW1lID0gTUU0NjAwX05BTUVfREVWSUNFX01FNDY1MDsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2NjA6CisJCSpuYW1lID0gTUU0NjAwX05BTUVfREVWSUNFX01FNDY2MDsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2NjBJOgorCQkqbmFtZSA9IE1FNDYwMF9OQU1FX0RFVklDRV9NRTQ2NjBJOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDY3MDoKKwkJKm5hbWUgPSBNRTQ2MDBfTkFNRV9ERVZJQ0VfTUU0NjcwOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDY3MEk6CisJCSpuYW1lID0gTUU0NjAwX05BTUVfREVWSUNFX01FNDY3MEk7CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjcwUzoKKwkJKm5hbWUgPSBNRTQ2MDBfTkFNRV9ERVZJQ0VfTUU0NjcwUzsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2NzBJUzoKKwkJKm5hbWUgPSBNRTQ2MDBfTkFNRV9ERVZJQ0VfTUU0NjcwSVM7CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjgwOgorCQkqbmFtZSA9IE1FNDYwMF9OQU1FX0RFVklDRV9NRTQ2ODA7CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjgwSToKKwkJKm5hbWUgPSBNRTQ2MDBfTkFNRV9ERVZJQ0VfTUU0NjgwSTsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2ODBTOgorCQkqbmFtZSA9IE1FNDYwMF9OQU1FX0RFVklDRV9NRTQ2ODBTOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDY4MElTOgorCQkqbmFtZSA9IE1FNDYwMF9OQU1FX0RFVklDRV9NRTQ2ODBJUzsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwMDQ6CisJCSpuYW1lID0gTUU2MDAwX05BTUVfREVWSUNFX01FNjAwMDQ7CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDA4OgorCQkqbmFtZSA9IE1FNjAwMF9OQU1FX0RFVklDRV9NRTYwMDA4OworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjAwRjoKKwkJKm5hbWUgPSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MDAwMTY7CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDE0OgorCQkqbmFtZSA9IE1FNjAwMF9OQU1FX0RFVklDRV9NRTYwMDBJNDsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwMTg6CisJCSpuYW1lID0gTUU2MDAwX05BTUVfREVWSUNFX01FNjAwMEk4OworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjAxRjoKKwkJKm5hbWUgPSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MDAwSTE2OworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjAzNDoKKwkJKm5hbWUgPSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MDAwSVNMRTQ7CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDM4OgorCQkqbmFtZSA9IE1FNjAwMF9OQU1FX0RFVklDRV9NRTYwMDBJU0xFODsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwM0Y6CisJCSpuYW1lID0gTUU2MDAwX05BTUVfREVWSUNFX01FNjAwMElTTEUxNjsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYxMDQ6CisJCSpuYW1lID0gTUU2MDAwX05BTUVfREVWSUNFX01FNjEwMDQ7CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTA4OgorCQkqbmFtZSA9IE1FNjAwMF9OQU1FX0RFVklDRV9NRTYxMDA4OworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjEwRjoKKwkJKm5hbWUgPSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MTAwMTY7CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTE0OgorCQkqbmFtZSA9IE1FNjAwMF9OQU1FX0RFVklDRV9NRTYxMDBJNDsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYxMTg6CisJCSpuYW1lID0gTUU2MDAwX05BTUVfREVWSUNFX01FNjEwMEk4OworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjExRjoKKwkJKm5hbWUgPSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MTAwSTE2OworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjEzNDoKKwkJKm5hbWUgPSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MTAwSVNMRTQ7CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTM4OgorCQkqbmFtZSA9IE1FNjAwMF9OQU1FX0RFVklDRV9NRTYxMDBJU0xFODsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYxM0Y6CisJCSpuYW1lID0gTUU2MDAwX05BTUVfREVWSUNFX01FNjEwMElTTEUxNjsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwNDQ6CisJCSpuYW1lID0gTUU2MDAwX05BTUVfREVWSUNFX01FNjAwMDRESU87CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDQ4OgorCQkqbmFtZSA9IE1FNjAwMF9OQU1FX0RFVklDRV9NRTYwMDA4RElPOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjA0RjoKKwkJKm5hbWUgPSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MDAwMTZESU87CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDU0OgorCQkqbmFtZSA9IE1FNjAwMF9OQU1FX0RFVklDRV9NRTYwMDBJNERJTzsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwNTg6CisJCSpuYW1lID0gTUU2MDAwX05BTUVfREVWSUNFX01FNjAwMEk4RElPOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjA1RjoKKwkJKm5hbWUgPSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MDAwSTE2RElPOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjA3NDoKKwkJKm5hbWUgPSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MDAwSVNMRTRESU87CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDc4OgorCQkqbmFtZSA9IE1FNjAwMF9OQU1FX0RFVklDRV9NRTYwMDBJU0xFOERJTzsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwN0Y6CisJCSpuYW1lID0gTUU2MDAwX05BTUVfREVWSUNFX01FNjAwMElTTEUxNkRJTzsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYxNDQ6CisJCSpuYW1lID0gTUU2MDAwX05BTUVfREVWSUNFX01FNjEwMDRESU87CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTQ4OgorCQkqbmFtZSA9IE1FNjAwMF9OQU1FX0RFVklDRV9NRTYxMDA4RElPOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjE0RjoKKwkJKm5hbWUgPSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MTAwMTZESU87CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTU0OgorCQkqbmFtZSA9IE1FNjAwMF9OQU1FX0RFVklDRV9NRTYxMDBJNERJTzsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYxNTg6CisJCSpuYW1lID0gTUU2MDAwX05BTUVfREVWSUNFX01FNjEwMEk4RElPOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjE1RjoKKwkJKm5hbWUgPSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MTAwSTE2RElPOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjE3NDoKKwkJKm5hbWUgPSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MTAwSVNMRTRESU87CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTc4OgorCQkqbmFtZSA9IE1FNjAwMF9OQU1FX0RFVklDRV9NRTYxMDBJU0xFOERJTzsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYxN0Y6CisJCSpuYW1lID0gTUU2MDAwX05BTUVfREVWSUNFX01FNjEwMElTTEUxNkRJTzsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTA2MzA6CisJCSpuYW1lID0gTUUwNjAwX05BTUVfREVWSUNFX01FMDYzMDsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTgxMDBfQToKKwkJKm5hbWUgPSBNRTgxMDBfTkFNRV9ERVZJQ0VfTUU4MTAwQTsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTgxMDBfQjoKKwkJKm5hbWUgPSBNRTgxMDBfTkFNRV9ERVZJQ0VfTUU4MTAwQjsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTA5NDA6CisJCSpuYW1lID0gTUUwOTAwX05BTUVfREVWSUNFX01FMDk0MDsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTA5NTA6CisJCSpuYW1lID0gTUUwOTAwX05BTUVfREVWSUNFX01FMDk1MDsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTA5NjA6CisJCSpuYW1lID0gTUUwOTAwX05BTUVfREVWSUNFX01FMDk2MDsKKworCQlicmVhazsKKy8qCisJCWNhc2UgVVNCX0RFVklDRV9JRF9NRVBISVNUT19TMToKKwkJCSpuYW1lID0gTUVQSElTVE9fUzFfTkFNRV9ERVZJQ0U7CisKKwkJCWJyZWFrOworKi8KKwlkZWZhdWx0OgorCQkqbmFtZSA9IEVNUFRZX05BTUVfREVWSUNFOworCQlQRVJST1IoIkludmFsaWQgUENJIGRldmljZSBpZC5cbiIpOworCisJCXJldHVybiBNRV9FUlJOT19JTlRFUk5BTDsKKwl9CisKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZWR1bW15X3F1ZXJ5X251bWJlcl9zdWJkZXZpY2VzKG1lX2RldmljZV90ICogZGV2aWNlLCBpbnQgKm51bWJlcikKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJcmV0dXJuIE1FX0VSUk5PX0RFVklDRV9VTlBMVUdHRUQ7Cit9CisKK3N0YXRpYyBpbnQgbWVkdW1teV9xdWVyeV9udW1iZXJfY2hhbm5lbHMobWVfZGV2aWNlX3QgKiBkZXZpY2UsCisJCQkJCSBpbnQgc3ViZGV2aWNlLCBpbnQgKm51bWJlcikKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJcmV0dXJuIE1FX0VSUk5PX0RFVklDRV9VTlBMVUdHRUQ7Cit9CisKK3N0YXRpYyBpbnQgbWVkdW1teV9xdWVyeV9udW1iZXJfcmFuZ2VzKG1lX2RldmljZV90ICogZGV2aWNlLAorCQkJCSAgICAgICBpbnQgc3ViZGV2aWNlLCBpbnQgdW5pdCwgaW50ICpjb3VudCkKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJcmV0dXJuIE1FX0VSUk5PX0RFVklDRV9VTlBMVUdHRUQ7Cit9CisKK3N0YXRpYyBpbnQgbWVkdW1teV9xdWVyeV9zdWJkZXZpY2VfdHlwZShtZV9kZXZpY2VfdCAqIGRldmljZSwKKwkJCQkJaW50IHN1YmRldmljZSwgaW50ICp0eXBlLCBpbnQgKnN1YnR5cGUpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCXJldHVybiBNRV9FUlJOT19ERVZJQ0VfVU5QTFVHR0VEOworfQorCitzdGF0aWMgaW50IG1lZHVtbXlfcXVlcnlfc3ViZGV2aWNlX2NhcHMobWVfZGV2aWNlX3QgKiBkZXZpY2UsCisJCQkJCWludCBzdWJkZXZpY2UsIGludCAqY2FwcykKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJcmV0dXJuIE1FX0VSUk5PX0RFVklDRV9VTlBMVUdHRUQ7Cit9CisKK3N0YXRpYyBpbnQgbWVkdW1teV9xdWVyeV9zdWJkZXZpY2VfY2Fwc19hcmdzKG1lX2RldmljZV90ICogZGV2aWNlLAorCQkJCQkgICAgIGludCBzdWJkZXZpY2UsCisJCQkJCSAgICAgaW50IGNhcCwgaW50ICphcmdzLCBpbnQgY291bnQpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCXJldHVybiBNRV9FUlJOT19OT1RfU1VQUE9SVEVEOworfQorCitzdGF0aWMgaW50IG1lZHVtbXlfcXVlcnlfc3ViZGV2aWNlX2J5X3R5cGUobWVfZGV2aWNlX3QgKiBkZXZpY2UsCisJCQkJCSAgIGludCBzdGFydF9zdWJkZXZpY2UsCisJCQkJCSAgIGludCB0eXBlLAorCQkJCQkgICBpbnQgc3VidHlwZSwgaW50ICpzdWJkZXZpY2UpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCXJldHVybiBNRV9FUlJOT19ERVZJQ0VfVU5QTFVHR0VEOworfQorCitzdGF0aWMgaW50IG1lZHVtbXlfcXVlcnlfcmFuZ2VfYnlfbWluX21heChtZV9kZXZpY2VfdCAqIGRldmljZSwKKwkJCQkJICBpbnQgc3ViZGV2aWNlLAorCQkJCQkgIGludCB1bml0LAorCQkJCQkgIGludCAqbWluLAorCQkJCQkgIGludCAqbWF4LCBpbnQgKm1heGRhdGEsIGludCAqcmFuZ2UpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCXJldHVybiBNRV9FUlJOT19ERVZJQ0VfVU5QTFVHR0VEOworfQorCitzdGF0aWMgaW50IG1lZHVtbXlfcXVlcnlfcmFuZ2VfaW5mbyhtZV9kZXZpY2VfdCAqIGRldmljZSwKKwkJCQkgICAgaW50IHN1YmRldmljZSwKKwkJCQkgICAgaW50IHJhbmdlLAorCQkJCSAgICBpbnQgKnVuaXQsIGludCAqbWluLCBpbnQgKm1heCwgaW50ICptYXhkYXRhKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwlyZXR1cm4gTUVfRVJSTk9fREVWSUNFX1VOUExVR0dFRDsKK30KKworaW50IG1lZHVtbXlfcXVlcnlfdGltZXIobWVfZGV2aWNlX3QgKiBkZXZpY2UsCisJCQlpbnQgc3ViZGV2aWNlLAorCQkJaW50IHRpbWVyLAorCQkJaW50ICpiYXNlX2ZyZXF1ZW5jeSwKKwkJCXVpbnQ2NF90ICogbWluX3RpY2tzLCB1aW50NjRfdCAqIG1heF90aWNrcykKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJcmV0dXJuIE1FX0VSUk5PX0RFVklDRV9VTlBMVUdHRUQ7Cit9CisKK3N0YXRpYyBpbnQgbWVkdW1teV9xdWVyeV92ZXJzaW9uX2RldmljZV9kcml2ZXIobWVfZGV2aWNlX3QgKiBkZXZpY2UsCisJCQkJCSAgICAgICBpbnQgKnZlcnNpb24pCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJKnZlcnNpb24gPSBNRV9WRVJTSU9OX0RSSVZFUjsKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIHZvaWQgbWVkdW1teV9kZXN0cnVjdG9yKG1lX2RldmljZV90ICogZGV2aWNlKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwlrZnJlZShkZXZpY2UpOworfQorCitzdGF0aWMgaW50IGluaXRfZGV2aWNlX2luZm8odW5zaWduZWQgc2hvcnQgdmVuZG9yX2lkLAorCQkJICAgIHVuc2lnbmVkIHNob3J0IGRldmljZV9pZCwKKwkJCSAgICB1bnNpZ25lZCBpbnQgc2VyaWFsX25vLAorCQkJICAgIGludCBidXNfdHlwZSwKKwkJCSAgICBpbnQgYnVzX25vLAorCQkJICAgIGludCBkZXZfbm8sCisJCQkgICAgaW50IGZ1bmNfbm8sIG1lZHVtbXlfZGV2aWNlX3QgKiBpbnN0YW5jZSkKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKy8vICAgICAgaW5zdGFuY2UtPm1hZ2ljID0gTUVEVU1NWV9NQUdJQ19OVU1CRVI7CisJaW5zdGFuY2UtPnZlbmRvcl9pZCA9IHZlbmRvcl9pZDsKKwlpbnN0YW5jZS0+ZGV2aWNlX2lkID0gZGV2aWNlX2lkOworCWluc3RhbmNlLT5zZXJpYWxfbm8gPSBzZXJpYWxfbm87CisJaW5zdGFuY2UtPmJ1c190eXBlID0gYnVzX3R5cGU7CisJaW5zdGFuY2UtPmJ1c19ubyA9IGJ1c19ubzsKKwlpbnN0YW5jZS0+ZGV2X25vID0gZGV2X25vOworCWluc3RhbmNlLT5mdW5jX25vID0gZnVuY19ubzsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1lZHVtbXlfY29uZmlnX2xvYWQobWVfZGV2aWNlX3QgKiBkZXZpY2UsIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCSAgICAgICBtZV9jZmdfZGV2aWNlX2VudHJ5X3QgKiBjb25maWcpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IGluaXRfZGV2aWNlX2luc3RhbmNlKG1lX2RldmljZV90ICogZGV2aWNlKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCUlOSVRfTElTVF9IRUFEKCZkZXZpY2UtPmxpc3QpOworCisJZGV2aWNlLT5tZV9kZXZpY2VfaW9faXJxX3N0YXJ0ID0gbWVkdW1teV9pb19pcnFfc3RhcnQ7CisJZGV2aWNlLT5tZV9kZXZpY2VfaW9faXJxX3dhaXQgPSBtZWR1bW15X2lvX2lycV93YWl0OworCWRldmljZS0+bWVfZGV2aWNlX2lvX2lycV9zdG9wID0gbWVkdW1teV9pb19pcnFfc3RvcDsKKwlkZXZpY2UtPm1lX2RldmljZV9pb19yZXNldF9kZXZpY2UgPSBtZWR1bW15X2lvX3Jlc2V0X2RldmljZTsKKwlkZXZpY2UtPm1lX2RldmljZV9pb19yZXNldF9zdWJkZXZpY2UgPSBtZWR1bW15X2lvX3Jlc2V0X3N1YmRldmljZTsKKwlkZXZpY2UtPm1lX2RldmljZV9pb19zaW5nbGVfY29uZmlnID0gbWVkdW1teV9pb19zaW5nbGVfY29uZmlnOworCWRldmljZS0+bWVfZGV2aWNlX2lvX3NpbmdsZV9yZWFkID0gbWVkdW1teV9pb19zaW5nbGVfcmVhZDsKKwlkZXZpY2UtPm1lX2RldmljZV9pb19zaW5nbGVfd3JpdGUgPSBtZWR1bW15X2lvX3NpbmdsZV93cml0ZTsKKwlkZXZpY2UtPm1lX2RldmljZV9pb19zdHJlYW1fY29uZmlnID0gbWVkdW1teV9pb19zdHJlYW1fY29uZmlnOworCWRldmljZS0+bWVfZGV2aWNlX2lvX3N0cmVhbV9uZXdfdmFsdWVzID0gbWVkdW1teV9pb19zdHJlYW1fbmV3X3ZhbHVlczsKKwlkZXZpY2UtPm1lX2RldmljZV9pb19zdHJlYW1fcmVhZCA9IG1lZHVtbXlfaW9fc3RyZWFtX3JlYWQ7CisJZGV2aWNlLT5tZV9kZXZpY2VfaW9fc3RyZWFtX3N0YXJ0ID0gbWVkdW1teV9pb19zdHJlYW1fc3RhcnQ7CisJZGV2aWNlLT5tZV9kZXZpY2VfaW9fc3RyZWFtX3N0YXR1cyA9IG1lZHVtbXlfaW9fc3RyZWFtX3N0YXR1czsKKwlkZXZpY2UtPm1lX2RldmljZV9pb19zdHJlYW1fc3RvcCA9IG1lZHVtbXlfaW9fc3RyZWFtX3N0b3A7CisJZGV2aWNlLT5tZV9kZXZpY2VfaW9fc3RyZWFtX3dyaXRlID0gbWVkdW1teV9pb19zdHJlYW1fd3JpdGU7CisKKwlkZXZpY2UtPm1lX2RldmljZV9sb2NrX2RldmljZSA9IG1lZHVtbXlfbG9ja19kZXZpY2U7CisJZGV2aWNlLT5tZV9kZXZpY2VfbG9ja19zdWJkZXZpY2UgPSBtZWR1bW15X2xvY2tfc3ViZGV2aWNlOworCisJZGV2aWNlLT5tZV9kZXZpY2VfcXVlcnlfZGVzY3JpcHRpb25fZGV2aWNlID0KKwkgICAgbWVkdW1teV9xdWVyeV9kZXNjcmlwdGlvbl9kZXZpY2U7CisJZGV2aWNlLT5tZV9kZXZpY2VfcXVlcnlfaW5mb19kZXZpY2UgPSBtZWR1bW15X3F1ZXJ5X2luZm9fZGV2aWNlOworCWRldmljZS0+bWVfZGV2aWNlX3F1ZXJ5X25hbWVfZGV2aWNlX2RyaXZlciA9CisJICAgIG1lZHVtbXlfcXVlcnlfbmFtZV9kZXZpY2VfZHJpdmVyOworCWRldmljZS0+bWVfZGV2aWNlX3F1ZXJ5X25hbWVfZGV2aWNlID0gbWVkdW1teV9xdWVyeV9uYW1lX2RldmljZTsKKworCWRldmljZS0+bWVfZGV2aWNlX3F1ZXJ5X251bWJlcl9zdWJkZXZpY2VzID0KKwkgICAgbWVkdW1teV9xdWVyeV9udW1iZXJfc3ViZGV2aWNlczsKKwlkZXZpY2UtPm1lX2RldmljZV9xdWVyeV9udW1iZXJfY2hhbm5lbHMgPSBtZWR1bW15X3F1ZXJ5X251bWJlcl9jaGFubmVsczsKKwlkZXZpY2UtPm1lX2RldmljZV9xdWVyeV9udW1iZXJfcmFuZ2VzID0gbWVkdW1teV9xdWVyeV9udW1iZXJfcmFuZ2VzOworCisJZGV2aWNlLT5tZV9kZXZpY2VfcXVlcnlfcmFuZ2VfYnlfbWluX21heCA9CisJICAgIG1lZHVtbXlfcXVlcnlfcmFuZ2VfYnlfbWluX21heDsKKwlkZXZpY2UtPm1lX2RldmljZV9xdWVyeV9yYW5nZV9pbmZvID0gbWVkdW1teV9xdWVyeV9yYW5nZV9pbmZvOworCisJZGV2aWNlLT5tZV9kZXZpY2VfcXVlcnlfc3ViZGV2aWNlX3R5cGUgPSBtZWR1bW15X3F1ZXJ5X3N1YmRldmljZV90eXBlOworCWRldmljZS0+bWVfZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV9ieV90eXBlID0KKwkgICAgbWVkdW1teV9xdWVyeV9zdWJkZXZpY2VfYnlfdHlwZTsKKwlkZXZpY2UtPm1lX2RldmljZV9xdWVyeV9zdWJkZXZpY2VfY2FwcyA9IG1lZHVtbXlfcXVlcnlfc3ViZGV2aWNlX2NhcHM7CisJZGV2aWNlLT5tZV9kZXZpY2VfcXVlcnlfc3ViZGV2aWNlX2NhcHNfYXJncyA9CisJICAgIG1lZHVtbXlfcXVlcnlfc3ViZGV2aWNlX2NhcHNfYXJnczsKKworCWRldmljZS0+bWVfZGV2aWNlX3F1ZXJ5X3RpbWVyID0gbWVkdW1teV9xdWVyeV90aW1lcjsKKworCWRldmljZS0+bWVfZGV2aWNlX3F1ZXJ5X3ZlcnNpb25fZGV2aWNlX2RyaXZlciA9CisJICAgIG1lZHVtbXlfcXVlcnlfdmVyc2lvbl9kZXZpY2VfZHJpdmVyOworCisJZGV2aWNlLT5tZV9kZXZpY2VfZGVzdHJ1Y3RvciA9IG1lZHVtbXlfZGVzdHJ1Y3RvcjsKKwlkZXZpY2UtPm1lX2RldmljZV9jb25maWdfbG9hZCA9IG1lZHVtbXlfY29uZmlnX2xvYWQ7CisJcmV0dXJuIDA7Cit9CisKK21lX2RldmljZV90ICptZWR1bW15X2NvbnN0cnVjdG9yKHVuc2lnbmVkIHNob3J0IHZlbmRvcl9pZCwKKwkJCQkgdW5zaWduZWQgc2hvcnQgZGV2aWNlX2lkLAorCQkJCSB1bnNpZ25lZCBpbnQgc2VyaWFsX25vLAorCQkJCSBpbnQgYnVzX3R5cGUsCisJCQkJIGludCBidXNfbm8sIGludCBkZXZfbm8sIGludCBmdW5jX25vKQoreworCWludCByZXN1bHQgPSAwOworCW1lZHVtbXlfZGV2aWNlX3QgKmluc3RhbmNlOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJLyogQWxsb2NhdGUgc3RydWN0dXJlIGZvciBkZXZpY2UgYXR0cmlidXRlcyAqLworCWluc3RhbmNlID0ga21hbGxvYyhzaXplb2YobWVkdW1teV9kZXZpY2VfdCksIEdGUF9LRVJORUwpOworCisJaWYgKCFpbnN0YW5jZSkgeworCQlQRVJST1IoIkNhbid0IGdldCBtZW1vcnkgZm9yIGRldmljZSBpbnN0YW5jZS5cbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwltZW1zZXQoaW5zdGFuY2UsIDAsIHNpemVvZihtZWR1bW15X2RldmljZV90KSk7CisKKwkvKiBJbml0aWFsaXplIGRldmljZSBpbmZvICovCisJcmVzdWx0ID0gaW5pdF9kZXZpY2VfaW5mbyh2ZW5kb3JfaWQsCisJCQkJICBkZXZpY2VfaWQsCisJCQkJICBzZXJpYWxfbm8sCisJCQkJICBidXNfdHlwZSwgYnVzX25vLCBkZXZfbm8sIGZ1bmNfbm8sIGluc3RhbmNlKTsKKworCWlmIChyZXN1bHQpIHsKKwkJUEVSUk9SKCJDYW5ub3QgaW5pdCBiYW9yZCBpbmZvLlxuIik7CisJCWtmcmVlKGluc3RhbmNlKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJLyogSW5pdGlhbGl6ZSBkZXZpY2UgaW5zdGFuY2UgKi8KKwlyZXN1bHQgPSBpbml0X2RldmljZV9pbnN0YW5jZSgobWVfZGV2aWNlX3QgKikgaW5zdGFuY2UpOworCisJaWYgKHJlc3VsdCkgeworCQlQRVJST1IoIkNhbm5vdCBpbml0IGJhb3JkIGluZm8uXG4iKTsKKwkJa2ZyZWUoaW5zdGFuY2UpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlyZXR1cm4gKG1lX2RldmljZV90ICopIGluc3RhbmNlOworfQorCisvLyBJbml0IGFuZCBleGl0IG9mIG1vZHVsZS4KKworc3RhdGljIGludCBfX2luaXQgZHVtbXlfaW5pdCh2b2lkKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGR1bW15X2V4aXQodm9pZCkKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7Cit9CisKK21vZHVsZV9pbml0KGR1bW15X2luaXQpOworCittb2R1bGVfZXhpdChkdW1teV9leGl0KTsKKworLy8gQWRtaW5pc3RyYXRpdmUgc3R1ZmYgZm9yIG1vZGluZm8uCitNT0RVTEVfQVVUSE9SKCJHdWVudGVyIEdlYmhhcmR0IDxnLmdlYmhhcmR0QG1laWxoYXVzLmRlPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJEZXZpY2UgRHJpdmVyIE1vZHVsZSBmb3IgTWVpbGhhdXMgTUUtRFVNTVkgRGV2aWNlcyIpOworTU9EVUxFX1NVUFBPUlRFRF9ERVZJQ0UoIk1laWxoYXVzIE1FLURVTU1ZIERldmljZXMiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworLy8gRXhwb3J0IHRoZSBjb25zdHJ1Y3Rvci4KK0VYUE9SVF9TWU1CT0wobWVkdW1teV9jb25zdHJ1Y3Rvcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWVkdW1teS5oIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lZHVtbXkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTcwMDBmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lZHVtbXkuaApAQCAtMCwwICsxLDQwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA1IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBTb3VyY2UgRmlsZSA6IG1lZHVtbXkuaAorICogQXV0aG9yICAgICAgOiBHRyAoR3VlbnRlciBHZWJoYXJkdCkgIDxnLmdlYmhhcmR0QG1laWxoYXVzLmRlPgorICovCisKKyNpZm5kZWYgX01FRFVNTVlfSF8KKyNkZWZpbmUgX01FRFVNTVlfSF8KKworI2luY2x1ZGUgIm1ldHlwZXMuaCIKKyNpbmNsdWRlICJtZWRlZmluZXMuaCIKKyNpbmNsdWRlICJtZWRldmljZS5oIgorCisjaWZkZWYgX19LRVJORUxfXworCisjZGVmaW5lIE1FRFVNTVlfTUFHSUNfTlVNQkVSCTB4RERERAorCit0eXBlZGVmIHN0cnVjdCBtZWR1bW15X2RldmljZSB7CisJbWVfZGV2aWNlX3QgYmFzZTsJCQkvKio8IFRoZSBNZWlsaGF1cyBkZXZpY2UgYmFzZSBjbGFzcy4gKi8KKy8vICAgICAgaW50IG1hZ2ljOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBUaGUgbWFnaWMgbnVtYmVyIG9mIHRoZSBzdHJ1Y3R1cmUgKi8KKwl1bnNpZ25lZCBzaG9ydCB2ZW5kb3JfaWQ7CS8qKjwgVmVuZG9yIElEICovCisJdW5zaWduZWQgc2hvcnQgZGV2aWNlX2lkOwkvKio8IERldmljZSBJRCAqLworCXVuc2lnbmVkIGludCBzZXJpYWxfbm87CQkvKio8IFNlcmlhbCBudW1iZXIgb2YgdGhlIGRldmljZSAqLworCWludCBidXNfdHlwZTsJCQkJLyoqPCBCdXMgdHlwZSAqLworCWludCBidXNfbm87CQkJCQkvKio8IEJ1cyBudW1iZXIgKi8KKwlpbnQgZGV2X25vOwkJCQkJLyoqPCBEZXZpY2UgbnVtYmVyICovCisJaW50IGZ1bmNfbm87CQkJCS8qKjwgRnVuY3Rpb24gbnVtYmVyICovCit9IG1lZHVtbXlfZGV2aWNlX3Q7CisKK21lX2RldmljZV90ICptZWR1bW15X2NvbnN0cnVjdG9yKHVuc2lnbmVkIHNob3J0IHZlbmRvcl9pZCwKKwkJCQkgdW5zaWduZWQgc2hvcnQgZGV2aWNlX2lkLAorCQkJCSB1bnNpZ25lZCBpbnQgc2VyaWFsX25vLAorCQkJCSBpbnQgYnVzX3R5cGUsCisJCQkJIGludCBidXNfbm8sCisJCQkJIGludCBkZXZfbm8sCisJCQkJIGludCBmdW5jX25vKSBfX2F0dHJpYnV0ZV9fICgod2VhaykpOworCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lZXJyb3IuaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZWVycm9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWVkYTRiZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZWVycm9yLmgKQEAgLTAsMCArMSwxMDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFNvdXJjZSBGaWxlIDogbWVlcnJvci5oCisgKiBBdXRob3IgICAgICA6IEdHIChHdWVudGVyIEdlYmhhcmR0KSAgPGcuZ2ViaGFyZHRAbWVpbGhhdXMuZGU+CisgKiBBdXRob3IgICAgICA6IEtHIChLcnp5c3p0b2YgR2FudHprZSkJPGsuZ2FudHprZUBtZWlsaGF1cy5kZT4KKyAqLworCisjaWZuZGVmIF9NRUVSUk9SX0hfCisjZGVmaW5lIF9NRUVSUk9SX0hfCisKK2V4dGVybiBjaGFyICptZUVycm9yTXNnVGFibGVbXTsKKworI2RlZmluZSBNRV9FUlJOT19TVUNDRVNTCQkJCQkJMAorI2RlZmluZSBNRV9FUlJOT19JTlZBTElEX0RFVklDRQkJCQkJMQorI2RlZmluZSBNRV9FUlJOT19JTlZBTElEX1NVQkRFVklDRQkJCQkyCisjZGVmaW5lIE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTAkJCQkzCisjZGVmaW5lIE1FX0VSUk5PX0lOVkFMSURfU0lOR0xFX0NPTkZJRwkJCTQKKyNkZWZpbmUgTUVfRVJSTk9fSU5WQUxJRF9SRUYJCQkJCTUKKyNkZWZpbmUgTUVfRVJSTk9fSU5WQUxJRF9UUklHX0NIQU4JCQkJNgorI2RlZmluZSBNRV9FUlJOT19JTlZBTElEX1RSSUdfVFlQRQkJCQk3CisjZGVmaW5lIE1FX0VSUk5PX0lOVkFMSURfVFJJR19FREdFCQkJCTgKKyNkZWZpbmUgTUVfRVJSTk9fSU5WQUxJRF9USU1FT1VUCQkJCTkKKyNkZWZpbmUgTUVfRVJSTk9fSU5WQUxJRF9GTEFHUwkJCQkJMTAKKyNkZWZpbmUgTUVfRVJSTk9fT1BFTgkJCQkJCQkxMQorI2RlZmluZSBNRV9FUlJOT19DTE9TRQkJCQkJCQkxMgorI2RlZmluZSBNRV9FUlJOT19OT1RfT1BFTgkJCQkJCTEzCisjZGVmaW5lIE1FX0VSUk5PX0lOVkFMSURfRElSCQkJCQkxNAorI2RlZmluZSBNRV9FUlJOT19QUkVWSU9VU19DT05GSUcJCQkJMTUKKyNkZWZpbmUgTUVfRVJSTk9fTk9UX1NVUFBPUlRFRAkJCQkJMTYKKyNkZWZpbmUgTUVfRVJSTk9fU1VCREVWSUNFX1RZUEUJCQkJCTE3CisjZGVmaW5lIE1FX0VSUk5PX1VTRVJfQlVGRkVSX1NJWkUJCQkJMTgKKyNkZWZpbmUgTUVfRVJSTk9fTE9DS0VECQkJCQkJCTE5CisjZGVmaW5lIE1FX0VSUk5PX05PTU9SRV9TVUJERVZJQ0VfVFlQRQkJCTIwCisjZGVmaW5lIE1FX0VSUk5PX1RJTUVPVVQJCQkJCQkyMQorI2RlZmluZSBNRV9FUlJOT19TSUdOQUwJCQkJCQkJMjIKKyNkZWZpbmUgTUVfRVJSTk9fSU5WQUxJRF9JUlFfU09VUkNFCQkJCTIzCisjZGVmaW5lIE1FX0VSUk5PX1RIUkVBRF9SVU5OSU5HCQkJCQkyNAorI2RlZmluZSBNRV9FUlJOT19TVEFSVF9USFJFQUQJCQkJCTI1CisjZGVmaW5lIE1FX0VSUk5PX0NBTkNFTF9USFJFQUQJCQkJCTI2CisjZGVmaW5lIE1FX0VSUk5PX05PX0NBTExCQUNLCQkJCQkyNworI2RlZmluZSBNRV9FUlJOT19VU0VECQkJCQkJCTI4CisjZGVmaW5lIE1FX0VSUk5PX0lOVkFMSURfVU5JVAkJCQkJMjkKKyNkZWZpbmUgTUVfRVJSTk9fSU5WQUxJRF9NSU5fTUFYCQkJCTMwCisjZGVmaW5lIE1FX0VSUk5PX05PX1JBTkdFCQkJCQkJMzEKKyNkZWZpbmUgTUVfRVJSTk9fSU5WQUxJRF9SQU5HRQkJCQkJMzIKKyNkZWZpbmUgTUVfRVJSTk9fU1VCREVWSUNFX0JVU1kJCQkJCTMzCisjZGVmaW5lIE1FX0VSUk5PX0lOVkFMSURfTE9DSwkJCQkJMzQKKyNkZWZpbmUgTUVfRVJSTk9fSU5WQUxJRF9TV0lUQ0gJCQkJCTM1CisjZGVmaW5lIE1FX0VSUk5PX0lOVkFMSURfRVJST1JfTVNHX0NPVU5UCQkzNgorI2RlZmluZSBNRV9FUlJOT19JTlZBTElEX1NUUkVBTV9DT05GSUcJCQkzNworI2RlZmluZSBNRV9FUlJOT19JTlZBTElEX0NPTkZJR19MSVNUX0NPVU5UCQkzOAorI2RlZmluZSBNRV9FUlJOT19JTlZBTElEX0FDUV9TVEFSVF9UUklHX1RZUEUJMzkKKyNkZWZpbmUgTUVfRVJSTk9fSU5WQUxJRF9BQ1FfU1RBUlRfVFJJR19FREdFCTQwCisjZGVmaW5lIE1FX0VSUk5PX0lOVkFMSURfQUNRX1NUQVJUX1RSSUdfQ0hBTgk0MQorI2RlZmluZSBNRV9FUlJOT19JTlZBTElEX0FDUV9TVEFSVF9USU1FT1VUCQk0MgorI2RlZmluZSBNRV9FUlJOT19JTlZBTElEX0FDUV9TVEFSVF9BUkcJCQk0MworI2RlZmluZSBNRV9FUlJOT19JTlZBTElEX1NDQU5fU1RBUlRfVFJJR19UWVBFCTQ0CisjZGVmaW5lIE1FX0VSUk5PX0lOVkFMSURfU0NBTl9TVEFSVF9BUkcJCQk0NQorI2RlZmluZSBNRV9FUlJOT19JTlZBTElEX0NPTlZfU1RBUlRfVFJJR19UWVBFCTQ2CisjZGVmaW5lIE1FX0VSUk5PX0lOVkFMSURfQ09OVl9TVEFSVF9BUkcJCQk0NworI2RlZmluZSBNRV9FUlJOT19JTlZBTElEX1NDQU5fU1RPUF9UUklHX1RZUEUJNDgKKyNkZWZpbmUgTUVfRVJSTk9fSU5WQUxJRF9TQ0FOX1NUT1BfQVJHCQkJNDkKKyNkZWZpbmUgTUVfRVJSTk9fSU5WQUxJRF9BQ1FfU1RPUF9UUklHX1RZUEUJCTUwCisjZGVmaW5lIE1FX0VSUk5PX0lOVkFMSURfQUNRX1NUT1BfQVJHCQkJNTEKKyNkZWZpbmUgTUVfRVJSTk9fU1VCREVWSUNFX05PVF9SVU5OSU5HCQkJNTIKKyNkZWZpbmUgTUVfRVJSTk9fSU5WQUxJRF9SRUFEX01PREUJCQkJNTMKKyNkZWZpbmUgTUVfRVJSTk9fSU5WQUxJRF9WQUxVRV9DT1VOVAkJCTU0CisjZGVmaW5lIE1FX0VSUk5PX0lOVkFMSURfV1JJVEVfTU9ERQkJCQk1NQorI2RlZmluZSBNRV9FUlJOT19JTlZBTElEX1RJTUVSCQkJCQk1NgorI2RlZmluZSBNRV9FUlJOT19ERVZJQ0VfVU5QTFVHR0VECQkJCTU3CisjZGVmaW5lIE1FX0VSUk5PX1VTRURfSU5URVJOQUwJCQkJCTU4CisjZGVmaW5lIE1FX0VSUk5PX0lOVkFMSURfRFVUWV9DWUNMRQkJCQk1OQorI2RlZmluZSBNRV9FUlJOT19JTlZBTElEX1dBSVQJCQkJCTYwCisjZGVmaW5lIE1FX0VSUk5PX0NPTk5FQ1RfUkVNT1RFCQkJCQk2MQorI2RlZmluZSBNRV9FUlJOT19DT01NVU5JQ0FUSU9OCQkJCQk2MgorI2RlZmluZSBNRV9FUlJOT19JTlZBTElEX1NJTkdMRV9MSVNUCQkJNjMKKyNkZWZpbmUgTUVfRVJSTk9fSU5WQUxJRF9NT0RVTEVfVFlQRQkJCTY0CisjZGVmaW5lIE1FX0VSUk5PX0lOVkFMSURfU1RBUlRfTU9ERQkJCQk2NQorI2RlZmluZSBNRV9FUlJOT19JTlZBTElEX1NUT1BfTU9ERQkJCQk2NgorI2RlZmluZSBNRV9FUlJOT19JTlZBTElEX0ZJRk9fSVJRX1RIUkVTSE9MRAkJNjcKKyNkZWZpbmUgTUVfRVJSTk9fSU5WQUxJRF9QT0lOVEVSCQkJCTY4CisjZGVmaW5lIE1FX0VSUk5PX0NSRUFURV9FVkVOVAkJCQkJNjkKKyNkZWZpbmUgTUVfRVJSTk9fTEFDS19PRl9SRVNPVVJDRVMJCQkJNzAKKyNkZWZpbmUgTUVfRVJSTk9fQ0FOQ0VMTEVECQkJCQkJNzEKKyNkZWZpbmUgTUVfRVJSTk9fUklOR19CVUZGRVJfT1ZFUkZMT1cJCQk3MgorI2RlZmluZSBNRV9FUlJOT19SSU5HX0JVRkZFUl9VTkRFRkZMT1cJCQk3MworI2RlZmluZSBNRV9FUlJOT19JTlZBTElEX0lSUV9FREdFCQkJCTc0CisjZGVmaW5lIE1FX0VSUk5PX0lOVkFMSURfSVJRX0FSRwkJCQk3NQorI2RlZmluZSBNRV9FUlJOT19JTlZBTElEX0NBUAkJCQkJNzYKKyNkZWZpbmUgTUVfRVJSTk9fSU5WQUxJRF9DQVBfQVJHX0NPVU5UCQkJNzcKKyNkZWZpbmUgTUVfRVJSTk9fSU5URVJOQUwJCQkJCQk3OAorCisvKiogTmV3IGVycm9yIGZvciByYW5nZSBjaGVjayAqLworI2RlZmluZSBNRV9FUlJOT19WQUxVRV9PVVRfT0ZfUkFOR0UJCQkJNzkKKyNkZWZpbmUgTUVfRVJSTk9fRklGT19CVUZGRVJfT1ZFUkZMT1cJCQk4MAorI2RlZmluZSBNRV9FUlJOT19GSUZPX0JVRkZFUl9VTkRFRkZMT1cJCQk4MQorCisjZGVmaW5lIE1FX0VSUk5PX0lOVkFMSURfRVJST1JfTlVNQkVSCQkJODIKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lZmlybXdhcmUuYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZWZpcm13YXJlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA3ZDIwMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZWZpcm13YXJlLmMKQEAgLTAsMCArMSwxMzcgQEAKKy8qKgorICogQGZpbGUgbWVmaXJtd2FyZS5jCisgKgorICogQGJyaWVmIEltcGxlbWVudHMgdGhlIGZpcm13YXJlIGhhbmRsaW5nLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICogQGF1dGhvciBLcnp5c3p0b2YgR2FudHprZQkoay5nYW50emtlQG1laWxoYXVzLmRlKQorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkgICAgICoKKyAqICAgQ29weXJpZ2h0IChDKSAyMDA3IGJ5IEtyenlzenRvZiBHYW50emtlIGsuZ2FudHprZUBtZWlsaGF1cy5kZSAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX19LRVJORUxfXworIyBkZWZpbmUgX19LRVJORUxfXworI2VuZGlmCisKKyNpZm5kZWYgS0JVSUxEX01PRE5BTUUKKyMgIGRlZmluZSBLQlVJTERfTU9ETkFNRSBLQlVJTERfU1RSKG1lZmlybXdhcmUpCisjZW5kaWYKKworI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisKKyNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgorCisjaW5jbHVkZSAibWVwbHhfcmVnLmgiCisjaW5jbHVkZSAibWVkZWJ1Zy5oIgorCisjaW5jbHVkZSAibWVmaXJtd2FyZS5oIgorCitpbnQgbWVfeGlsaW54X2Rvd25sb2FkKHVuc2lnbmVkIGxvbmcgcmVnaXN0ZXJfYmFzZV9jb250cm9sLAorCQkgICAgICAgdW5zaWduZWQgbG9uZyByZWdpc3Rlcl9iYXNlX2RhdGEsCisJCSAgICAgICBzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmZpcm13YXJlX25hbWUpCit7CisJaW50IGVyciA9IE1FX0VSUk5PX0ZJUk1XQVJFOworCXVpbnQzMl90IHZhbHVlID0gMDsKKwlpbnQgaWR4ID0gMDsKKworCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZnc7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpZiAoIWZpcm13YXJlX25hbWUpIHsKKwkJUEVSUk9SKCJSZXF1ZXN0IGZvciBmaXJtd2FyZSBmYWlsZWQuIE5vIG5hbWUgcHJvdmlkZWQuIFxuIik7CisJCXJldHVybiBlcnI7CisJfQorCisJUElORk8oIlJlcXVlc3QgJyVzJyBmaXJtd2FyZS5cbiIsIGZpcm13YXJlX25hbWUpOworCWVyciA9IHJlcXVlc3RfZmlybXdhcmUoJmZ3LCBmaXJtd2FyZV9uYW1lLCBkZXYpOworCisJaWYgKGVycikgeworCQlQRVJST1IoIlJlcXVlc3QgZm9yIGZpcm13YXJlIGZhaWxlZC5cbiIpOworCQlyZXR1cm4gZXJyOworCX0KKwkvLyBTZXQgUExYIGxvY2FsIGludGVycnVwdCAyIHBvbGFyaXR5IHRvIGhpZ2guCisJLy8gSW50ZXJydXB0IGlzIHRocm93biBieSBpbml0IHBpbiBvZiB4aWxpbnguCisJb3V0bChQTFhfSU5UQ1NSX0xPQ0FMX0lOVDJfUE9MLCByZWdpc3Rlcl9iYXNlX2NvbnRyb2wgKyBQTFhfSU5UQ1NSKTsKKworCS8vIFNldCAvQ1MgYW5kIC9XUklURSBvZiB0aGUgWGlsaW54CisJdmFsdWUgPSBpbmwocmVnaXN0ZXJfYmFzZV9jb250cm9sICsgUExYX0lDUik7CisJdmFsdWUgfD0gTUVfRklSTVdBUkVfQ1NfV1JJVEU7CisJb3V0bCh2YWx1ZSwgcmVnaXN0ZXJfYmFzZV9jb250cm9sICsgUExYX0lDUik7CisKKwkvLyBJbml0IFhpbGlueCB3aXRoIENTMQorCWlubChyZWdpc3Rlcl9iYXNlX2RhdGEgKyBNRV9YSUxJTlhfQ1MxX1JFRyk7CisKKwkvLyBXYWl0IGZvciBpbml0IHRvIGNvbXBsZXRlCisJdWRlbGF5KDIwKTsKKworCS8vIENoZWNrbCAvSU5JVCBwaW4KKwlpZiAoIQorCSAgICAoaW5sKHJlZ2lzdGVyX2Jhc2VfY29udHJvbCArIFBMWF9JTlRDU1IpICYKKwkgICAgIFBMWF9JTlRDU1JfTE9DQUxfSU5UMl9TVEFURSkpIHsKKwkJUEVSUk9SKCJDYW4ndCBpbml0IFhpbGlueC5cbiIpOworCQlyZWxlYXNlX2Zpcm13YXJlKGZ3KTsKKwkJcmV0dXJuIC1FSU87CisJfQorCS8vIFJlc2V0IC9DUyBhbmQgL1dSSVRFIG9mIHRoZSBYaWxpbngKKwl2YWx1ZSA9IGlubChyZWdpc3Rlcl9iYXNlX2NvbnRyb2wgKyBQTFhfSUNSKTsKKwl2YWx1ZSAmPSB+TUVfRklSTVdBUkVfQ1NfV1JJVEU7CisJb3V0bCh2YWx1ZSwgcmVnaXN0ZXJfYmFzZV9jb250cm9sICsgUExYX0lDUik7CisKKwkvLyBEb3dubG9hZCBYaWxpbnggZmlybXdhcmUKKwl1ZGVsYXkoMTApOworCisJZm9yIChpZHggPSAwOyBpZHggPCBmdy0+c2l6ZTsgaWR4KyspIHsKKwkJb3V0bChmdy0+ZGF0YVtpZHhdLCByZWdpc3Rlcl9iYXNlX2RhdGEpOworI2lmZGVmIE1FNjAwMF92Ml80CisvLy8gICAgIFRoaXMgY2hlY2tpbmcgb25seSBmb3IgYm9hcmQncyB2ZXJzaW9uIDIuNAorCQkvLyBDaGVjayBpZiBCVVNZIGZsYWcgaXMgc2V0IChsb3cgPSByZWFkeSwgaGlnaCA9IGJ1c3kpCisJCWlmIChpbmwocmVnaXN0ZXJfYmFzZV9jb250cm9sICsgUExYX0lDUikgJgorCQkgICAgTUVfRklSTVdBUkVfQlVTWV9GTEFHKSB7CisJCQlQRVJST1IoIlhpbGlueCBpcyBzdGlsbCBidXN5IChpZHggPSAlZClcbiIsIGlkeCk7CisJCQlyZWxlYXNlX2Zpcm13YXJlKGZ3KTsKKwkJCXJldHVybiAtRUlPOworCQl9CisjZW5kaWYgLy9NRTYwMDBfdjJfNAorCX0KKwlQREVCVUcoIkRvd25sb2FkIGZpbmlzaGVkLiAlZCBieXRlcyB3cml0dGVuIHRvIFBMWC5cbiIsIGlkeCk7CisKKwkvLyBJZiBkb25lIGZsYWcgaXMgaGlnaCBkb3dubG9hZCB3YXMgc3VjY2Vzc2Z1bAorCWlmIChpbmwocmVnaXN0ZXJfYmFzZV9jb250cm9sICsgUExYX0lDUikgJiBNRV9GSVJNV0FSRV9ET05FX0ZMQUcpIHsKKwkJUERFQlVHKCJTVUNDRVNTLiBEb25lIGZsYWcgaXMgc2V0LlxuIik7CisJfSBlbHNlIHsKKwkJUEVSUk9SKCJGQUlMVVJFLiBET05FIGZsYWcgaXMgbm90IHNldC5cbiIpOworCQlyZWxlYXNlX2Zpcm13YXJlKGZ3KTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJLy8gU2V0IC9DUyBhbmQgL1dSSVRFCisJdmFsdWUgPSBpbmwocmVnaXN0ZXJfYmFzZV9jb250cm9sICsgUExYX0lDUik7CisJdmFsdWUgfD0gTUVfRklSTVdBUkVfQ1NfV1JJVEU7CisJb3V0bCh2YWx1ZSwgcmVnaXN0ZXJfYmFzZV9jb250cm9sICsgUExYX0lDUik7CisKKwlQREVCVUcoIkVuYWJsZSBpbnRlcnJ1cHRzIG9uIHRoZSBQQ0kgaW50ZXJmYWNlLlxuIik7CisJb3V0bChNRV9QTFhfUENJX0FDVElWQVRFLCByZWdpc3Rlcl9iYXNlX2NvbnRyb2wgKyBQTFhfSU5UQ1NSKTsKKwlyZWxlYXNlX2Zpcm13YXJlKGZ3KTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lZmlybXdhcmUuaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZWZpcm13YXJlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI2ODUwOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZWZpcm13YXJlLmgKQEAgLTAsMCArMSw1NyBAQAorLyoqCisgKiBAZmlsZSBtZWZpcm13YXJlLmgKKyAqCisgKiBAYnJpZWYgRGVmaW5pdGlvbnMgb2YgdGhlIGZpcm13YXJlIGhhbmRsaW5nIGZ1bmN0aW9ucy4KKyAqIEBub3RlIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKiBAYXV0aG9yIEtyenlzenRvZiBHYW50emtlCShrLmdhbnR6a2VAbWVpbGhhdXMuZGUpCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKSAgICAgKgorICogICBDb3B5cmlnaHQgKEMpIDIwMDcgYnkgS3J6eXN6dG9mIEdhbnR6a2Ugay5nYW50emtlQG1laWxoYXVzLmRlICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfTUVGSVJNV0FSRV9ICisjIGRlZmluZSBfTUVGSVJNV0FSRV9ICisKKyMgaWZkZWYgX19LRVJORUxfXworCisjZGVmaW5lIE1FX0VSUk5PX0ZJUk1XQVJFCQktMQorCisvKioKKyogUmVnaXN0cnkKKyovCisjZGVmaW5lIE1FX1hJTElOWF9DUzFfUkVHCQkweDAwQzgKKworLyoqCisqIEZsYWdzIChiaXRzKQorKi8KKworI2RlZmluZSBNRV9GSVJNV0FSRV9CVVNZX0ZMQUcJMHgwMDAwMDAyMAorI2RlZmluZSBNRV9GSVJNV0FSRV9ET05FX0ZMQUcJMHgwMDAwMDAwNAorI2RlZmluZSBNRV9GSVJNV0FSRV9DU19XUklURQkweDAwMDAwMTAwCisKKyNkZWZpbmUgTUVfUExYX1BDSV9BQ1RJVkFURQkJMHg0MworCitpbnQgbWVfeGlsaW54X2Rvd25sb2FkKHVuc2lnbmVkIGxvbmcgcmVnaXN0ZXJfYmFzZV9jb250cm9sLAorCQkgICAgICAgdW5zaWduZWQgbG9uZyByZWdpc3Rlcl9iYXNlX2RhdGEsCisJCSAgICAgICBzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmZpcm13YXJlX25hbWUpOworCisjIGVuZGlmCS8vX19LRVJORUxfXworCisjZW5kaWYgLy9fTUVGSVJNV0FSRV9ICmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWVpZHMuaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZWlkcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzZTc1N2MKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWVpZHMuaApAQCAtMCwwICsxLDMxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA1IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBTb3VyY2UgRmlsZSA6IG1laWRzLmgKKyAqIEF1dGhvciAgICAgIDogR0cgKEd1ZW50ZXIgR2ViaGFyZHQpICA8Zy5nZWJoYXJkdEBtZWlsaGF1cy5kZT4KKyAqLworCisjaWZuZGVmIF9NRUlEU19IXworI2RlZmluZSBfTUVJRFNfSF8KKworI2lmZGVmIF9fS0VSTkVMX18KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBEcml2ZXIgbmFtZXMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2RlZmluZSBNRU1BSU5fTkFNRQkJCQkibWVtYWluIgorI2RlZmluZSBNRTEwMDBfTkFNRQkJCQkibWUxMDAwIgorI2RlZmluZSBNRTE0MDBfTkFNRQkJCQkibWUxNDAwIgorI2RlZmluZSBNRTE2MDBfTkFNRQkJCQkibWUxNjAwIgorI2RlZmluZSBNRTQ2MDBfTkFNRQkJCQkibWU0NjAwIgorI2RlZmluZSBNRTYwMDBfTkFNRQkJCQkibWU2MDAwIgorI2RlZmluZSBNRTA2MDBfTkFNRQkJCQkibWUwNjAwIgkvLyJtZTYzMCIKKyNkZWZpbmUgTUU4MTAwX05BTUUJCQkJIm1lODEwMCIKKyNkZWZpbmUgTUU4MjAwX05BTUUJCQkJIm1lODIwMCIKKyNkZWZpbmUgTUUwOTAwX05BTUUJCQkJIm1lMDkwMCIJLy8ibWU5eCIKKy8vI2RlZmluZSBNRVBISVNUT19TMV9OQU1FICAgICAgICAgICAgICAgICAgICAgICJtZXBoaXN0b19zMSIKKyNkZWZpbmUgTUVEVU1NWV9OQU1FCQkJIm1lZHVtbXkiCisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWVpbnRlcm5hbC5oIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21laW50ZXJuYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDEyNmI0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21laW50ZXJuYWwuaApAQCAtMCwwICsxLDM2MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogU291cmNlIEZpbGUgOiBtZWludGVybmFsLmgKKyAqIEF1dGhvciAgICAgIDogR0cgKEd1ZW50ZXIgR2ViaGFyZHQpICA8Zy5nZWJoYXJkdEBtZWlsaGF1cy5kZT4KKyAqLworCisjaWZuZGVmIF9NRUlOVEVSTkFMX0hfCisjZGVmaW5lIF9NRUlOVEVSTkFMX0hfCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgUENJIFZlbmRvciBJRHMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX01FSUxIQVVTCQkJCQkJMHgxNDAyCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgUENJIERldmljZSBJRHMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTAwMAkJCQkweDEwMDAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTEwMDBfQQkJCQkweDEwMEEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTEwMDBfQgkJCQkweDEwMEIKKworI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTQwMAkJCQkweDE0MDAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE0MEEJCQkJMHgxNDBBCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNDBCCQkJCTB4MTQwQgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTRFMAkJCQkweDE0RTAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE0RUEJCQkJMHgxNEVBCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNEVCCQkJCTB4MTRFQgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTQwQwkJCQkwWDE0MEMKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE0MEQJCQkJMFgxNDBECisKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE2MDBfNFUJCQkweDE2MDQgLy8gNCB2b2x0YWdlIG91dHB1dHMKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE2MDBfOFUJCQkweDE2MDggLy8gOCB2b2x0YWdlIG91dHB1dHMKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE2MDBfMTJVCQkJMHgxNjBDIC8vIDEyIHZvbHRhZ2Ugb3V0cHV0cworI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTYwMF8xNlUJCQkweDE2MEYgLy8gMTYgdm9sdGFnZSBvdXRwdXRzCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNjAwXzE2VV84SQkJMHgxNjhGIC8vIDE2IHZvbHRhZ2UvOCBjdXJyZW50IG8uCisKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2MTAJCQkJMHg0NjEwIC8vIEpla3lsbAorCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjUwCQkJCTB4NDY1MCAvLyBMb3cgQ29zdCB2ZXJzaW9uCisKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2NjAJCQkJMHg0NjYwIC8vIFN0YW5kYXJkIHZlcnNpb24KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2NjBJCQkJCTB4NDY2MSAvLyBJc29sYXRlZCB2ZXJzaW9uCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjYwUwkJCQkweDQ2NjIgLy8gU3RhbmRhcmQgdmVyc2lvbiB3aXRoIFNhbXBsZSBhbmQgSG9sZAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDY2MElTCQkJCTB4NDY2MyAvLyBJc29sYXRlZCB2ZXJzaW9uIHdpdGggU2FtcGxlIGFuZCBIb2xkCisKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2NzAJCQkJMHg0NjcwIC8vIFN0YW5kYXJkIHZlcnNpb24KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2NzBJCQkJCTB4NDY3MSAvLyBJc29sYXRlZCB2ZXJzaW9uCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjcwUwkJCQkweDQ2NzIgLy8gU3RhbmRhcmQgdmVyc2lvbiB3aXRoIFNhbXBsZSBhbmQgSG9sZAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDY3MElTCQkJCTB4NDY3MyAvLyBJc29sYXRlZCB2ZXJzaW9uIHdpdGggU2FtcGxlIGFuZCBIb2xkCisKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2ODAJCQkJMHg0NjgwIC8vIFN0YW5kYXJkIHZlcnNpb24KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2ODBJCQkJCTB4NDY4MSAvLyBJc29sYXRlZCB2ZXJzaW9uCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjgwUwkJCQkweDQ2ODIgLy8gU3RhbmRhcmQgdmVyc2lvbiB3aXRoIFNhbXBsZSBhbmQgSG9sZAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDY4MElTCQkJCTB4NDY4MyAvLyBJc29sYXRlZCB2ZXJzaW9uIHdpdGggU2FtcGxlIGFuZCBIb2xkCisKKy8qIE1FNjAwMCBzdGFuZGFyZCB2ZXJzaW9uICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDA0ICAgCQkJMHg2MDA0CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDA4ICAgCQkJMHg2MDA4CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDBGICAgCQkJMHg2MDBGCisKKy8qIE1FNjAwMCBpc29sYXRlZCB2ZXJzaW9uICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDE0ICAgCQkJMHg2MDE0CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDE4ICAgCQkJMHg2MDE4CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDFGICAgCQkJMHg2MDFGCisKKy8qIE1FNjAwMCBpc2xlIHZlcnNpb24gKi8KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwMzQgICAJCQkweDYwMzQKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwMzggICAJCQkweDYwMzgKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwM0YgICAJCQkweDYwM0YKKworLyogTUU2MDAwIHN0YW5kYXJkIHZlcnNpb24gd2l0aCBESU8gKi8KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwNDQgICAJCQkweDYwNDQKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwNDggICAJCQkweDYwNDgKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwNEYgICAJCQkweDYwNEYKKworLyogTUU2MDAwIGlzb2xhdGVkIHZlcnNpb24gd2l0aCBESU8gKi8KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwNTQgICAJCQkweDYwNTQKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwNTggICAJCQkweDYwNTgKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwNUYgICAJCQkweDYwNUYKKworLyogTUU2MDAwIGlzbGUgdmVyc2lvbiB3aXRoIERJTyAqLworI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjA3NCAgIAkJCTB4NjA3NAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjA3OCAgIAkJCTB4NjA3OAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjA3RiAgIAkJCTB4NjA3RgorCisvKiBNRTYxMDAgc3RhbmRhcmQgdmVyc2lvbiAqLworI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjEwNCAgIAkJCTB4NjEwNAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjEwOCAgIAkJCTB4NjEwOAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjEwRiAgIAkJCTB4NjEwRgorCisvKiBNRTYxMDAgaXNvbGF0ZWQgdmVyc2lvbiAqLworI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjExNCAgIAkJCTB4NjExNAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjExOCAgIAkJCTB4NjExOAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjExRiAgIAkJCTB4NjExRgorCisvKiBNRTYxMDAgaXNsZSB2ZXJzaW9uICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTM0ICAgCQkJMHg2MTM0CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTM4ICAgCQkJMHg2MTM4CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTNGICAgCQkJMHg2MTNGCisKKy8qIE1FNjEwMCBzdGFuZGFyZCB2ZXJzaW9uIHdpdGggRElPICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTQ0CQkJCTB4NjE0NAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjE0OCAgIAkJCTB4NjE0OAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjE0RiAgIAkJCTB4NjE0RgorCisvKiBNRTYxMDAgaXNvbGF0ZWQgdmVyc2lvbiB3aXRoIERJTyAqLworI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjE1NCAgIAkJCTB4NjE1NAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjE1OCAgIAkJCTB4NjE1OAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjE1RiAgIAkJCTB4NjE1RgorCisvKiBNRTYxMDAgaXNsZSB2ZXJzaW9uIHdpdGggRElPICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTc0ICAgCQkJMHg2MTc0CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTc4ICAgCQkJMHg2MTc4CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTdGICAgCQkJMHg2MTdGCisKKy8qIE1FNjIwMCBpc29sYXRlZCB2ZXJzaW9uIHdpdGggRElPICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MjU5CQkJCTB4NjI1OQorCisvKiBNRTYzMDAgaXNvbGF0ZWQgdmVyc2lvbiB3aXRoIERJTyAqLworI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjM1OQkJCQkweDYzNTkKKworLyogTUUwNjMwICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUwNjMwCQkJCTB4MDYzMAorCisvKiBNRTgxMDAgKi8KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTgxMDBfQQkJCQkweDgxMEEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTgxMDBfQiAgCQkJMHg4MTBCCisKKy8qIE1FODIwMCAqLworI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FODIwMF9BCQkJCTB4ODIwQQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FODIwMF9CICAJCQkweDgyMEIKKworLyogTUUwOTAwICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUwOTQwCQkJCTB4MDk0MAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMDk1MAkJCQkweDA5NTAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTA5NjAJCQkJMHgwOTYwCisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBVU0IgVmVuZG9yIElEcworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvLyNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9NRVBISVNUT19TMQkJCQkJMHgwNDAzCisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBVU0IgRGV2aWNlIElEcworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvLyNkZWZpbmUgVVNCX0RFVklDRV9JRF9NRVBISVNUT19TMQkJCQkJMHhEQ0QwCisKKworLyogTUUtMTAwMCBkZWZpbmVzICovCisjZGVmaW5lIE1FMTAwMF9OQU1FX0RSSVZFUgkJCQkJCQkiTUUtMTAwMCIKKworI2RlZmluZSBNRTEwMDBfTkFNRV9ERVZJQ0VfTUUxMDAwCQkJCQkiTUUtMTAwMCIKKworI2RlZmluZSBNRTEwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FMTAwMAkJCSJNRS0xMDAwIGRldmljZSwgMTI4IGRpZ2l0YWwgaS9vIGxpbmVzLiIKKworLyogTUUtMTQwMCBkZWZpbmVzICovCisjZGVmaW5lIE1FMTQwMF9OQU1FX0RSSVZFUgkJCQkJCQkiTUUtMTQwMCIKKworI2RlZmluZSBNRTE0MDBfTkFNRV9ERVZJQ0VfTUUxNDAwCQkJCQkiTUUtMTQwMCIKKyNkZWZpbmUgTUUxNDAwX05BTUVfREVWSUNFX01FMTQwMEUJCQkJCSJNRS0xNDAwRSIKKyNkZWZpbmUgTUUxNDAwX05BTUVfREVWSUNFX01FMTQwMEEJCQkJCSJNRS0xNDAwQSIKKyNkZWZpbmUgTUUxNDAwX05BTUVfREVWSUNFX01FMTQwMEVBCQkJCQkiTUUtMTQwMEVBIgorI2RlZmluZSBNRTE0MDBfTkFNRV9ERVZJQ0VfTUUxNDAwQgkJCQkJIk1FLTE0MDBCIgorI2RlZmluZSBNRTE0MDBfTkFNRV9ERVZJQ0VfTUUxNDAwRUIJCQkJCSJNRS0xNDAwRUIiCisjZGVmaW5lIE1FMTQwMF9OQU1FX0RFVklDRV9NRTE0MDBDCQkJCQkiTUUtMTQwMEMiCisjZGVmaW5lIE1FMTQwMF9OQU1FX0RFVklDRV9NRTE0MDBECQkJCQkiTUUtMTQwMEQiCisKKyNkZWZpbmUgTUUxNDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTE0MDAJCQkiTUUtMTQwMCBkZXZpY2UsIDI0IGRpZ2l0YWwgaS9vIGxpbmVzLiIKKyNkZWZpbmUgTUUxNDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTE0MDBFCQkJIk1FLTE0MDBFIGRldmljZSwgMjQgZGlnaXRhbCBpL28gbGluZXMuIgorI2RlZmluZSBNRTE0MDBfREVTQ1JJUFRJT05fREVWSUNFX01FMTQwMEEJCQkiTUUtMTQwMEEgZGV2aWNlLCAyNCBkaWdpdGFsIGkvbyBsaW5lcywgMyBjb3VudGVycy4iCisjZGVmaW5lIE1FMTQwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUUxNDAwRUEJCQkiTUUtMTQwMEVBIGRldmljZSwgMjQgZGlnaXRhbCBpL28gbGluZXMsIDMgY291bnRlcnMuIgorI2RlZmluZSBNRTE0MDBfREVTQ1JJUFRJT05fREVWSUNFX01FMTQwMEIJCQkiTUUtMTQwMEIgZGV2aWNlLCA0OCBkaWdpdGFsIGkvbyBsaW5lcywgNiBjb3VudGVycy4iCisjZGVmaW5lIE1FMTQwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUUxNDAwRUIJCQkiTUUtMTQwMEVCIGRldmljZSwgNDggZGlnaXRhbCBpL28gbGluZXMsIDYgY291bnRlcnMuIgorI2RlZmluZSBNRTE0MDBfREVTQ1JJUFRJT05fREVWSUNFX01FMTQwMEMJCQkiTUUtMTQwMEMgZGV2aWNlLCAyNCBkaWdpdGFsIGkvbyBsaW5lcywgMTUgY291bnRlcnMuIgorI2RlZmluZSBNRTE0MDBfREVTQ1JJUFRJT05fREVWSUNFX01FMTQwMEQJCQkiTUUtMTQwMEQgZGV2aWNlLCA0OCBkaWdpdGFsIGkvbyBsaW5lcywgMzAgY291bnRlcnMuIgorCisvKiBNRS0xNjAwIGRlZmluZXMgKi8KKyNkZWZpbmUgTUUxNjAwX05BTUVfRFJJVkVSCQkJCQkJCSJNRS0xNjAwIgorCisjZGVmaW5lIE1FMTYwMF9OQU1FX0RFVklDRV9NRTE2MDA0VQkJCQkJIk1FLTE2MDAvNFUiCisjZGVmaW5lIE1FMTYwMF9OQU1FX0RFVklDRV9NRTE2MDA4VQkJCQkJIk1FLTE2MDAvOFUiCisjZGVmaW5lIE1FMTYwMF9OQU1FX0RFVklDRV9NRTE2MDAxMlUJCQkJIk1FLTE2MDAvMTJVIgorI2RlZmluZSBNRTE2MDBfTkFNRV9ERVZJQ0VfTUUxNjAwMTZVCQkJCSJNRS0xNjAwLzE2VSIKKyNkZWZpbmUgTUUxNjAwX05BTUVfREVWSUNFX01FMTYwMDE2VThJCQkJCSJNRS0xNjAwLzE2VThJIgorCisjZGVmaW5lIE1FMTYwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUUxNjAwNFUJCQkiTUUtMTYwMC80VSBkZXZpY2UsIDQgdm9sdGFnZSBvdXRwdXRzLiIKKyNkZWZpbmUgTUUxNjAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTE2MDA4VQkJCSJNRS0xNjAwLzhVIGRldmljZSwgOCB2b2x0YWdlIG91dHB1dHMuIgorI2RlZmluZSBNRTE2MDBfREVTQ1JJUFRJT05fREVWSUNFX01FMTYwMDEyVQkJCSJNRS0xNjAwLzEyVSBkZXZpY2UsIDEyIHZvbHRhZ2Ugb3V0cHV0cy4iCisjZGVmaW5lIE1FMTYwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUUxNjAwMTZVCQkJIk1FLTE2MDAvMTZVIGRldmljZSwgMTYgdm9sdGFnZSBvdXRwdXRzLiIKKyNkZWZpbmUgTUUxNjAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTE2MDAxNlU4SQkJIk1FLTE2MDAvMTZVOEkgZGV2aWNlLCAxNiB2b2x0YWdlLCA4IGN1cnJlbnQgb3V0cHV0cy4iCisKKy8qIE1FLTQwMDAgZGVmaW5lcyAqLworI2RlZmluZSBNRTQ2MDBfTkFNRV9EUklWRVIJCQkJCQkJIk1FLTQ2MDAiCisKKyNkZWZpbmUgTUU0NjAwX05BTUVfREVWSUNFX01FNDYxMAkJCQkJIk1FLTQ2MTAiCisjZGVmaW5lIE1FNDYwMF9OQU1FX0RFVklDRV9NRTQ2NTAJCQkJCSJNRS00NjUwIgorI2RlZmluZSBNRTQ2MDBfTkFNRV9ERVZJQ0VfTUU0NjYwCQkJCQkiTUUtNDY2MCIKKyNkZWZpbmUgTUU0NjAwX05BTUVfREVWSUNFX01FNDY2MEkJCQkJCSJNRS00NjYwSSIKKyNkZWZpbmUgTUU0NjAwX05BTUVfREVWSUNFX01FNDY2MFMJCQkJCSJNRS00NjYwUyIKKyNkZWZpbmUgTUU0NjAwX05BTUVfREVWSUNFX01FNDY2MElTCQkJCQkiTUUtNDY2MElTIgorI2RlZmluZSBNRTQ2MDBfTkFNRV9ERVZJQ0VfTUU0NjcwCQkJCQkiTUUtNDY3MCIKKyNkZWZpbmUgTUU0NjAwX05BTUVfREVWSUNFX01FNDY3MEkJCQkJCSJNRS00NjcwSSIKKyNkZWZpbmUgTUU0NjAwX05BTUVfREVWSUNFX01FNDY3MFMJCQkJCSJNRS00NjcwUyIKKyNkZWZpbmUgTUU0NjAwX05BTUVfREVWSUNFX01FNDY3MElTCQkJCQkiTUUtNDY3MElTIgorI2RlZmluZSBNRTQ2MDBfTkFNRV9ERVZJQ0VfTUU0NjgwCQkJCQkiTUUtNDY4MCIKKyNkZWZpbmUgTUU0NjAwX05BTUVfREVWSUNFX01FNDY4MEkJCQkJCSJNRS00NjgwSSIKKyNkZWZpbmUgTUU0NjAwX05BTUVfREVWSUNFX01FNDY4MFMJCQkJCSJNRS00NjgwUyIKKyNkZWZpbmUgTUU0NjAwX05BTUVfREVWSUNFX01FNDY4MElTCQkJCQkiTUUtNDY4MElTIgorCisjZGVmaW5lIE1FNDYwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU0NjEwCQkJIk1FLTQ2MTAgZGV2aWNlLCAxNiBzdHJlYW1pbmcgYW5hbG9nIGlucHV0cywgMzIgZGlnaXRhbCBpL28gbGluZXMsIDMgY291bnRlcnMsIDEgZXh0ZXJuYWwgaW50ZXJydXB0LiIKKyNkZWZpbmUgTUU0NjAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTQ2NTAJCQkiTUUtNDY1MCBkZXZpY2UsIDE2IHN0cmVhbWluZyBhbmFsb2cgaW5wdXRzLCAzMiBkaWdpdGFsIGkvbyBsaW5lcywgMSBleHRlcm5hbCBpbnRlcnJ1cHQuIgorI2RlZmluZSBNRTQ2MDBfREVTQ1JJUFRJT05fREVWSUNFX01FNDY2MAkJCSJNRS00NjYwIGRldmljZSwgMTYgc3RyZWFtaW5nIGFuYWxvZyBpbnB1dHMsIDIgc2luZ2xlIGFuYWxvZyBvdXRwdXRzLCAzMiBkaWdpdGFsIGkvbyBsaW5lcywgMyBjb3VudGVycywgMSBleHRlcm5hbCBpbnRlcnJ1cHQuIgorI2RlZmluZSBNRTQ2MDBfREVTQ1JJUFRJT05fREVWSUNFX01FNDY2MEkJCQkiTUUtNDY2MEkgb3B0byBpc29sYXRlZCBkZXZpY2UsIDE2IHN0cmVhbWluZyBhbmFsb2cgaW5wdXRzLCAyIHNpbmdsZSBhbmFsb2cgb3V0cHV0cywgMzIgZGlnaXRhbCBpL28gbGluZXMsIDMgY291bnRlcnMsIDEgZXh0ZXJuYWwgaW50ZXJydXB0LiIKKyNkZWZpbmUgTUU0NjAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTQ2NjBTCQkJIk1FLTQ2NjAgZGV2aWNlLCAxNiBzdHJlYW1pbmcgYW5hbG9nIGlucHV0cyAoOCBTJkgpLCAyIHNpbmdsZSBhbmFsb2cgb3V0cHV0cywgMzIgZGlnaXRhbCBpL28gbGluZXMsIDMgY291bnRlcnMsIDEgZXh0ZXJuYWwgaW50ZXJydXB0LiIKKyNkZWZpbmUgTUU0NjAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTQ2NjBJUwkJCSJNRS00NjYwSSBvcHRvIGlzb2xhdGVkIGRldmljZSwgMTYgc3RyZWFtaW5nIGFuYWxvZyBpbnB1dHMgKDggUyZIKSwgMiBzaW5nbGUgYW5hbG9nIG91dHB1dHMsIDMyIGRpZ2l0YWwgaS9vIGxpbmVzLCAzIGNvdW50ZXJzLCAxIGV4dGVybmFsIGludGVycnVwdC4iCisjZGVmaW5lIE1FNDYwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU0NjcwCQkJIk1FLTQ2NzAgZGV2aWNlLCAzMiBzdHJlYW1pbmcgYW5hbG9nIGlucHV0cywgNCBzaW5nbGUgYW5hbG9nIG91dHB1dHMsIDMyIGRpZ2l0YWwgaS9vIGxpbmVzLCAzIGNvdW50ZXJzLCAxIGV4dGVybmFsIGludGVycnVwdC4iCisjZGVmaW5lIE1FNDYwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU0NjcwSQkJCSJNRS00NjcwSSBvcHRvIGlzb2xhdGVkIGRldmljZSwgMzIgc3RyZWFtaW5nIGFuYWxvZyBpbnB1dHMsIDQgc2luZ2xlIGFuYWxvZyBvdXRwdXRzLCAzMiBkaWdpdGFsIGkvbyBsaW5lcywgMyBjb3VudGVycywgMSBleHRlcm5hbCBpbnRlcnJ1cHQuIgorI2RlZmluZSBNRTQ2MDBfREVTQ1JJUFRJT05fREVWSUNFX01FNDY3MFMJCQkiTUUtNDY3MFMgZGV2aWNlLCAzMiBzdHJlYW1pbmcgYW5hbG9nIGlucHV0cyAoOCBTJkgpLCA0IHNpbmdsZSBhbmFsb2cgb3V0cHV0cywgMzIgZGlnaXRhbCBpL28gbGluZXMsIDMgY291bnRlcnMsIDEgZXh0ZXJuYWwgaW50ZXJydXB0LiIKKyNkZWZpbmUgTUU0NjAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTQ2NzBJUwkJCSJNRS00NjcwSVMgb3B0byBpc29sYXRlZCBkZXZpY2UsIDMyIHN0cmVhbWluZyBhbmFsb2cgaW5wdXRzICg4IFMmSCksIDQgc2luZ2xlIGFuYWxvZyBvdXRwdXRzLCAzMiBkaWdpdGFsIGkvbyBsaW5lcywgMyBjb3VudGVycywgMSBleHRlcm5hbCBpbnRlcnJ1cHQuIgorI2RlZmluZSBNRTQ2MDBfREVTQ1JJUFRJT05fREVWSUNFX01FNDY4MAkJCSJNRS00NjgwIGRldmljZSwgMzIgc3RyZWFtaW5nIGFuYWxvZyBpbnB1dHMsIDQgc3RyZWFtaW5nIGFuYWxvZyBvdXRwdXRzLCAzMiBkaWdpdGFsIGkvbyBsaW5lcywgMyBjb3VudGVycywgMSBleHRlcm5hbCBpbnRlcnJ1cHQuIgorI2RlZmluZSBNRTQ2MDBfREVTQ1JJUFRJT05fREVWSUNFX01FNDY4MEkJCQkiTUUtNDY4MEkgb3B0byBpc29sYXRlZCBkZXZpY2UsIDMyIHN0cmVhbWluZyBhbmFsb2cgaW5wdXRzLCA0IHN0cmVhbWluZyBhbmFsb2cgb3V0cHV0cywgMzIgZGlnaXRhbCBpL28gbGluZXMsIDMgY291bnRlcnMsIDEgZXh0ZXJuYWwgaW50ZXJydXB0LiIKKyNkZWZpbmUgTUU0NjAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTQ2ODBTCQkJIk1FLTQ2ODBTIGRldmljZSwgMzIgc3RyZWFtaW5nIGFuYWxvZyBpbnB1dHMsIDQgc3RyZWFtaW5nIGFuYWxvZyBvdXRwdXRzLCAzMiBkaWdpdGFsIGkvbyBsaW5lcywgMyBjb3VudGVycywgMSBleHRlcm5hbCBpbnRlcnJ1cHQuIgorI2RlZmluZSBNRTQ2MDBfREVTQ1JJUFRJT05fREVWSUNFX01FNDY4MElTCQkJIk1FLTQ2ODBJUyBvcHRvIGlzb2xhdGVkIGRldmljZSwgMzIgc3RyZWFtaW5nIGFuYWxvZyBpbnB1dHMgKDggUyZIKSwgNCBzdHJlYW1pbmcgYW5hbG9nIG91dHB1dHMsIDMyIGRpZ2l0YWwgaS9vIGxpbmVzLCAzIGNvdW50ZXJzLCAxIGV4dGVybmFsIGludGVycnVwdC4iCisKKy8qIE1FLTYwMDAgZGVmaW5lcyAqLworI2RlZmluZSBNRTYwMDBfTkFNRV9EUklWRVIJCQkJCQkJIk1FLTYwMDAiCisKKyNkZWZpbmUgTUU2MDAwX05BTUVfREVWSUNFX01FNjAwMDQJCQkJCSJNRS02MDAwLzQiCisjZGVmaW5lIE1FNjAwMF9OQU1FX0RFVklDRV9NRTYwMDA4CQkJCQkiTUUtNjAwMC84IgorI2RlZmluZSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MDAwMTYJCQkJCSJNRS02MDAwLzE2IgorI2RlZmluZSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MDAwSTQJCQkJCSJNRS02MDAwSS80IgorI2RlZmluZSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MDAwSTgJCQkJCSJNRS02MDAwSS84IgorI2RlZmluZSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MDAwSTE2CQkJCSJNRS02MDAwSS8xNiIKKyNkZWZpbmUgTUU2MDAwX05BTUVfREVWSUNFX01FNjAwMElTTEU0CQkJCSJNRS02MDAwSVNMRS80IgorI2RlZmluZSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MDAwSVNMRTgJCQkJIk1FLTYwMDBJU0xFLzgiCisjZGVmaW5lIE1FNjAwMF9OQU1FX0RFVklDRV9NRTYwMDBJU0xFMTYJCQkJIk1FLTYwMDBJU0xFLzE2IgorI2RlZmluZSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MTAwNAkJCQkJIk1FLTYxMDAvNCIKKyNkZWZpbmUgTUU2MDAwX05BTUVfREVWSUNFX01FNjEwMDgJCQkJCSJNRS02MTAwLzgiCisjZGVmaW5lIE1FNjAwMF9OQU1FX0RFVklDRV9NRTYxMDAxNgkJCQkJIk1FLTYxMDAvMTYiCisjZGVmaW5lIE1FNjAwMF9OQU1FX0RFVklDRV9NRTYxMDBJNAkJCQkJIk1FLTYxMDBJLzQiCisjZGVmaW5lIE1FNjAwMF9OQU1FX0RFVklDRV9NRTYxMDBJOAkJCQkJIk1FLTYxMDBJLzgiCisjZGVmaW5lIE1FNjAwMF9OQU1FX0RFVklDRV9NRTYxMDBJMTYJCQkJIk1FLTYxMDBJLzE2IgorI2RlZmluZSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MTAwSVNMRTQJCQkJIk1FLTYxMDBJU0xFLzQiCisjZGVmaW5lIE1FNjAwMF9OQU1FX0RFVklDRV9NRTYxMDBJU0xFOAkJCQkiTUUtNjEwMElTTEUvOCIKKyNkZWZpbmUgTUU2MDAwX05BTUVfREVWSUNFX01FNjEwMElTTEUxNgkJCQkiTUUtNjEwMElTTEUvMTYiCisjZGVmaW5lIE1FNjAwMF9OQU1FX0RFVklDRV9NRTYwMDA0RElPCQkJCSJNRS02MDAwLzQvRElPIgorI2RlZmluZSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MDAwOERJTwkJCQkiTUUtNjAwMC84L0RJTyIKKyNkZWZpbmUgTUU2MDAwX05BTUVfREVWSUNFX01FNjAwMDE2RElPCQkJCSJNRS02MDAwLzE2L0RJTyIKKyNkZWZpbmUgTUU2MDAwX05BTUVfREVWSUNFX01FNjAwMEk0RElPCQkJCSJNRS02MDAwSS80L0RJTyIKKyNkZWZpbmUgTUU2MDAwX05BTUVfREVWSUNFX01FNjAwMEk4RElPCQkJCSJNRS02MDAwSS84L0RJTyIKKyNkZWZpbmUgTUU2MDAwX05BTUVfREVWSUNFX01FNjAwMEkxNkRJTwkJCQkiTUUtNjAwMEkvMTYvRElPIgorI2RlZmluZSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MDAwSVNMRTRESU8JCQkiTUUtNjAwMElTTEUvNC9ESU8iCisjZGVmaW5lIE1FNjAwMF9OQU1FX0RFVklDRV9NRTYwMDBJU0xFOERJTwkJCSJNRS02MDAwSVNMRS84L0RJTyIKKyNkZWZpbmUgTUU2MDAwX05BTUVfREVWSUNFX01FNjAwMElTTEUxNkRJTwkJCSJNRS02MDAwSVNMRS8xNi9ESU8iCisjZGVmaW5lIE1FNjAwMF9OQU1FX0RFVklDRV9NRTYxMDA0RElPCQkJCSJNRS02MTAwLzQvRElPIgorI2RlZmluZSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MTAwOERJTwkJCQkiTUUtNjEwMC84L0RJTyIKKyNkZWZpbmUgTUU2MDAwX05BTUVfREVWSUNFX01FNjEwMDE2RElPCQkJCSJNRS02MTAwLzE2L0RJTyIKKyNkZWZpbmUgTUU2MDAwX05BTUVfREVWSUNFX01FNjEwMEk0RElPCQkJCSJNRS02MTAwSS80L0RJTyIKKyNkZWZpbmUgTUU2MDAwX05BTUVfREVWSUNFX01FNjEwMEk4RElPCQkJCSJNRS02MTAwSS84L0RJTyIKKyNkZWZpbmUgTUU2MDAwX05BTUVfREVWSUNFX01FNjEwMEkxNkRJTwkJCQkiTUUtNjEwMEkvMTYvRElPIgorI2RlZmluZSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MTAwSVNMRTRESU8JCQkiTUUtNjEwMElTTEUvNC9ESU8iCisjZGVmaW5lIE1FNjAwMF9OQU1FX0RFVklDRV9NRTYxMDBJU0xFOERJTwkJCSJNRS02MTAwSVNMRS84L0RJTyIKKyNkZWZpbmUgTUU2MDAwX05BTUVfREVWSUNFX01FNjEwMElTTEUxNkRJTwkJCSJNRS02MTAwSVNMRS8xNi9ESU8iCisjZGVmaW5lIE1FNjAwMF9OQU1FX0RFVklDRV9NRTYyMDBJOURJTwkJCQkiTUUtNjIwMEkvOS9ESU8iCisjZGVmaW5lIE1FNjAwMF9OQU1FX0RFVklDRV9NRTYzMDBJOURJTwkJCQkiTUUtNjMwMEkvOS9ESU8iCisKKyNkZWZpbmUgTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYwMDA0CQkJIk1FLTYwMDAvNCBkZXZpY2UsIDQgc2luZ2xlIGFuYWxvZyBvdXRwdXRzLiIKKyNkZWZpbmUgTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYwMDA4CQkJIk1FLTYwMDAvOCBkZXZpY2UsIDggc2luZ2xlIGFuYWxvZyBvdXRwdXRzIgorI2RlZmluZSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjAwMDE2CQkJIk1FLTYwMDAvMTYgZGV2aWNlLCAxNiBzaW5nbGUgYW5hbG9nIG91dHB1dHMiCisjZGVmaW5lIE1FNjAwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU2MDAwSTQJCQkiTUUtNjAwMEkvNCBpc29sYXRlZCBkZXZpY2UsIDQgc2luZ2xlIGFuYWxvZyBvdXRwdXRzIgorI2RlZmluZSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjAwMEk4CQkJIk1FLTYwMDBJLzggaXNvbGF0ZWQgZGV2aWNlLCA4IHNpbmdsZSBhbmFsb2cgb3V0cHV0cyIKKyNkZWZpbmUgTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYwMDBJMTYJCQkiTUUtNjAwMEkvMTYgaXNvbGF0ZWQgZGV2aWNlLCAxNiBzaW5nbGUgYW5hbG9nIG91dHB1dHMiCisjZGVmaW5lIE1FNjAwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU2MDAwSVNMRTQJCSJNRS02MDAwSVNMRS80IGlzbGUgZGV2aWNlLCA0IHNpbmdsZSBhbmFsb2cgb3V0cHV0cyIKKyNkZWZpbmUgTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYwMDBJU0xFOAkJIk1FLTYwMDBJU0xFLzggaXNsZSBkZXZpY2UsIDggc2luZ2xlIGFuYWxvZyBvdXRwdXRzIgorI2RlZmluZSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjAwMElTTEUxNgkJIk1FLTYwMDBJU0xFLzE2IGlzbGUgZGV2aWNlLCAxNiBzaW5nbGUgYW5hbG9nIG91dHB1dHMiCisjZGVmaW5lIE1FNjAwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU2MTAwNAkJCSJNRS02MTAwLzQgZGV2aWNlLCA0IHN0cmVhbWluZyBhbmFsb2cgb3V0cHV0cy4iCisjZGVmaW5lIE1FNjAwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU2MTAwOAkJCSJNRS02MTAwLzggZGV2aWNlLCA0IHN0cmVhbWluZywgNCBzaW5nbGUgYW5hbG9nIG91dHB1dHMuIgorI2RlZmluZSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjEwMDE2CQkJIk1FLTYxMDAvMTYgZGV2aWNlLCA0IHN0cmVhbWluZywgMTIgc2luZ2xlIGFuYWxvZyBvdXRwdXRzLiIKKyNkZWZpbmUgTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYxMDBJNAkJCSJNRS02MTAwSS80IGlzb2xhdGVkIGRldmljZSwgNCBzdHJlYW1pbmcgYW5hbG9nIG91dHB1dHMuIgorI2RlZmluZSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjEwMEk4CQkJIk1FLTYxMDBJLzggaXNvbGF0ZWQgZGV2aWNlLCA0IHN0cmVhbWluZywgNCBzaW5nbGUgYW5hbG9nIG91dHB1dHMuIgorI2RlZmluZSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjEwMEkxNgkJCSJNRS02MTAwSS8xNiBpc29sYXRlZCBkZXZpY2UsIDQgc3RyZWFtaW5nLCAxMiBzaW5nbGUgYW5hbG9nIG91dHB1dHMuIgorI2RlZmluZSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjEwMElTTEU0CQkiTUUtNjEwMElTTEUvNCBpc2xlIGRldmljZSwgNCBzdHJlYW1pbmcgYW5hbG9nIG91dHB1dHMuIgorI2RlZmluZSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjEwMElTTEU4CQkiTUUtNjEwMElTTEUvOCBpc2xlIGRldmljZSwgNCBzdHJlYW1pbmcsIDQgc2luZ2xlIGFuYWxvZyBvdXRwdXRzLiIKKyNkZWZpbmUgTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYxMDBJU0xFMTYJCSJNRS02MTAwSVNMRS8xNiBpc2xlIGRldmljZSwgNCBzdHJlYW1pbmcsIDEyIHNpbmdsZSBhbmFsb2cgb3V0cHV0cy4iCisjZGVmaW5lIE1FNjAwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU2MDAwNERJTwkJIk1FLTYwMDAvNC9ESU8gZGV2aWNlLCA0IHNpbmdsZSBhbmFsb2cgb3V0cHV0cywgMTYgZGlnaXRhbCBpL28gbGluZXMuIgorI2RlZmluZSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjAwMDhESU8JCSJNRS02MDAwLzgvRElPIGRldmljZSwgOCBzaW5nbGUgYW5hbG9nIG91dHB1dHMsIDE2IGRpZ2l0YWwgaS9vIGxpbmVzLiIKKyNkZWZpbmUgTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYwMDAxNkRJTwkJIk1FLTYwMDAvMTYvRElPIGRldmljZSwgOCBzaW5nbGUgYW5hbG9nIG91dHB1dHMsIDE2IGRpZ2l0YWwgaS9vIGxpbmVzLiIKKyNkZWZpbmUgTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYwMDBJNERJTwkJIk1FLTYwMDBJLzQvRElPIGlzb2xhdGVkIGRldmljZSwgNCBzaW5nbGUgYW5hbG9nIG91dHB1dHMsIDE2IGRpZ2l0YWwgaS9vIGxpbmVzLiIKKyNkZWZpbmUgTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYwMDBJOERJTwkJIk1FLTYwMDBJLzgvRElPIGlzb2xhdGVkIGRldmljZSwgOCBzaW5nbGUgYW5hbG9nIG91dHB1dHMsIDE2IGRpZ2l0YWwgaS9vIGxpbmVzLiIKKyNkZWZpbmUgTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYwMDBJMTZESU8JCSJNRS02MDAwSS8xNi9ESU8gaXNvbGF0ZWQgZGV2aWNlLCAxNiBzaW5nbGUgYW5hbG9nIG91dHB1dHMsIDE2IGRpZ2l0YWwgaS9vIGxpbmVzLiIKKyNkZWZpbmUgTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYwMDBJU0xFNERJTwkiTUUtNjAwMElTTEUvNC9ESU8gaXNsZSBkZXZpY2UsIDQgc2luZ2xlIGFuYWxvZyBvdXRwdXRzLCAxNiBkaWdpdGFsIGkvbyBsaW5lcy4iCisjZGVmaW5lIE1FNjAwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU2MDAwSVNMRThESU8JIk1FLTYwMDBJU0xFLzgvRElPIGlzbGUgZGV2aWNlLCA4IHNpbmdsZSBhbmFsb2cgb3V0cHV0cywgMTYgZGlnaXRhbCBpL28gbGluZXMuIgorI2RlZmluZSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjAwMElTTEUxNkRJTwkiTUUtNjAwMElTTEUvMTYvRElPIGlzbGUgZGV2aWNlLCAxNiBzaW5nbGUgYW5hbG9nIG91dHB1dHMsIDE2IGRpZ2l0YWwgaS9vIGxpbmVzLiIKKyNkZWZpbmUgTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYxMDA0RElPCQkiTUUtNjEwMC80L0RJTyBkZXZpY2UsIDQgc3RyZWFtaW5nIGFuYWxvZyBvdXRwdXRzLCAxNiBkaWdpdGFsIGkvbyBsaW5lcy4iCisjZGVmaW5lIE1FNjAwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU2MTAwOERJTwkJIk1FLTYxMDAvOC9ESU8gZGV2aWNlLCA0IHN0cmVhbWluZywgNCBzaW5nbGUgYW5hbG9nIG91dHB1dHMsIDE2IGRpZ2l0YWwgaS9vIGxpbmVzLiIKKyNkZWZpbmUgTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYxMDAxNkRJTwkJIk1FLTYxMDAvMTYvRElPIGRldmljZSwgNCBzdHJlYW1pbmcsIDEyIHNpbmdsZSBhbmFsb2cgb3V0cHV0cywgMTYgZGlnaXRhbCBpL28gbGluZXMuIgorI2RlZmluZSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjEwMEk0RElPCQkiTUUtNjEwMEkvNC9ESU8gaXNvbGF0ZWQgZGV2aWNlLCA0IHN0cmVhbWluZyBhbmFsb2cgb3V0cHV0cywgMTYgZGlnaXRhbCBpL28gbGluZXMuIgorI2RlZmluZSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjEwMEk4RElPCQkiTUUtNjEwMEkvOC9ESU8gaXNvbGF0ZWQgZGV2aWNlLCA0IHN0cmVhbWluZywgNCBzaW5nbGUgYW5hbG9nIG91dHB1dHMsIDE2IGRpZ2l0YWwgaS9vIGxpbmVzLiIKKyNkZWZpbmUgTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYxMDBJMTZESU8JCSJNRS02MTAwSS8xNi9ESU8gaXNvbGF0ZWQgZGV2aWNlLCA0IHN0cmVhbWluZywgMTIgc2luZ2xlIGFuYWxvZyBvdXRwdXRzLCAxNiBkaWdpdGFsIGkvbyBsaW5lcy4iCisjZGVmaW5lIE1FNjAwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU2MTAwSVNMRTRESU8JIk1FLTYxMDBJU0xFLzQvRElPIGlzbGUgZGV2aWNlLCA0IHN0cmVhbWluZyBhbmFsb2cgb3V0cHV0cywgMTYgZGlnaXRhbCBpL28gbGluZXMuIgorI2RlZmluZSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjEwMElTTEU4RElPCSJNRS02MTAwSVNMRS84L0RJTyBpc2xlIGRldmljZSwgNCBzdHJlYW1pbmcsIDQgc2luZ2xlIGFuYWxvZyBvdXRwdXRzLCAxNiBkaWdpdGFsIGkvbyBsaW5lcy4iCisjZGVmaW5lIE1FNjAwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU2MTAwSVNMRTE2RElPCSJNRS02MTAwSVNMRS8xNi9ESU8gaXNsZSBkZXZpY2UsIDQgc3RyZWFtaW5nLCAxMiBzaW5nbGUgYW5hbG9nIG91dHB1dHMsIDE2IGRpZ2l0YWwgaS9vIGxpbmVzLiIKKyNkZWZpbmUgTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYyMDBJOURJTwkJIk1FLTYyMDBJLzkvRElPIGlzb2xhdGVkIGRldmljZSwgOSBzaW5nbGUgYW5hbG9nIG91dHB1dHMsIDE2IGRpZ2l0YWwgaS9vIGxpbmVzLiIKKyNkZWZpbmUgTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYzMDBJOURJTwkJIk1FLTYzMDBJLzkvRElPIGlzb2xhdGVkIGRldmljZSwgNCBzdHJlYW1pbmcsIDUgc2luZ2xlIGFuYWxvZyBvdXRwdXRzLCAxNiBkaWdpdGFsIGkvbyBsaW5lcy4iCisKKy8qIE1FLTYzMCBkZWZpbmVzICovCisjZGVmaW5lIE1FMDYwMF9OQU1FX0RSSVZFUgkJCQkJCQkiTUUtMDYwMCIKKworI2RlZmluZSBNRTA2MDBfTkFNRV9ERVZJQ0VfTUUwNjMwCQkJCQkiTUUtNjMwIgorCisjZGVmaW5lIE1FMDYwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUUwNjMwCQkJIk1FLTYzMCBkZXZpY2UsIHVwIHRvIDE2IHJlbGF5LCA4IGRpZ2l0YWwgdHRsIGlucHV0IGxpbmVzLCA4IGlzb2xhdGVkIGRpZ2l0YWwgaW5wdXQgbGluZXMsIDE2IGRpZ2l0YWwgaS9vIGxpbmVzLCAyIGV4dGVybmFsIGludGVycnVwdHMuIgorCisvKiBNRS04MTAwIGRlZmluZXMgKi8KKyNkZWZpbmUgTUU4MTAwX05BTUVfRFJJVkVSCQkJCQkJCSJNRS04MTAwIgorCisjZGVmaW5lIE1FODEwMF9OQU1FX0RFVklDRV9NRTgxMDBBCQkJCQkiTUUtODEwMEEiCisjZGVmaW5lIE1FODEwMF9OQU1FX0RFVklDRV9NRTgxMDBCCQkJCQkiTUUtODEwMEIiCisKKyNkZWZpbmUgTUU4MTAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTgxMDBBCQkJIk1FLTgxMDBBIG9wdG8gaXNvbGF0ZWQgZGV2aWNlLCAxNiBkaWdpdGFsIGlucHV0IGxpbmVzLCAxNiBkaWdpdGFsIG91dHB1dCBsaW5lcy4iCisjZGVmaW5lIE1FODEwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU4MTAwQgkJCSJNRS04MTAwQiBvcHRvIGlzb2xhdGVkIGRldmljZSwgMzIgZGlnaXRhbCBpbnB1dCBsaW5lcywgMzIgZGlnaXRhbCBvdXRwdXQgbGluZXMsIDMgY291bnRlcnMuIgorCisvKiBNRS04MjAwIGRlZmluZXMgKi8KKyNkZWZpbmUgTUU4MjAwX05BTUVfRFJJVkVSCQkJCQkJCSJNRS04MjAwIgorCisjZGVmaW5lIE1FODIwMF9OQU1FX0RFVklDRV9NRTgyMDBBCQkJCQkiTUUtODIwMEEiCisjZGVmaW5lIE1FODIwMF9OQU1FX0RFVklDRV9NRTgyMDBCCQkJCQkiTUUtODIwMEIiCisKKyNkZWZpbmUgTUU4MjAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTgyMDBBCQkJIk1FLTgyMDBBIG9wdG8gaXNvbGF0ZWQgZGV2aWNlLCA4IGRpZ2l0YWwgb3V0cHV0IGxpbmVzLCA4IGRpZ2l0YWwgaW5wdXQgbGluZXMsIDE2IGRpZ2l0YWwgaS9vIGxpbmVzLiIKKyNkZWZpbmUgTUU4MjAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTgyMDBCCQkJIk1FLTgyMDBCIG9wdG8gaXNvbGF0ZWQgZGV2aWNlLCAxNiBkaWdpdGFsIG91dHB1dCBsaW5lcywgMTYgZGlnaXRhbCBpbnB1dCBsaW5lcywgMTYgZGlnaXRhbCBpL28gbGluZXMuIgorCisvKiBNRS0wOTAwIGRlZmluZXMgKi8KKyNkZWZpbmUgTUUwOTAwX05BTUVfRFJJVkVSCQkJCQkJCSJNRS0wOTAwIgorCisjZGVmaW5lIE1FMDkwMF9OQU1FX0RFVklDRV9NRTA5NDAJCQkJCSJNRS05NCIKKyNkZWZpbmUgTUUwOTAwX05BTUVfREVWSUNFX01FMDk1MAkJCQkJIk1FLTk1IgorI2RlZmluZSBNRTA5MDBfTkFNRV9ERVZJQ0VfTUUwOTYwCQkJCQkiTUUtOTYiCisKKyNkZWZpbmUgTUUwOTAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTA5NDAJCQkiTUUtOTQgZGV2aWNlLCAxNiBkaWdpdGFsIGlucHV0IGxpbmVzLCAyIGV4dGVybmFsIGludGVycnVwdCBsaW5lcy4iCisjZGVmaW5lIE1FMDkwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUUwOTUwCQkJIk1FLTk1IGRldmljZSwgMTYgZGlnaXRhbCBvdXRwdXQgbGluZXMuIgorI2RlZmluZSBNRTA5MDBfREVTQ1JJUFRJT05fREVWSUNFX01FMDk2MAkJCSJNRS05NiBkZXZpY2UsIDggZGlnaXRhbCBpbnB1dCBsaW5lcywgOCBkaWdpdGFsIG91dHB1dCBsaW5lcywgMiBleHRlcm5hbCBpbnRlcnJ1cHQgbGluZXMuIgorCisvKiBNRS1EVU1NWSBkZWZpbmVzICovCisjZGVmaW5lIE1FRFVNTVlfTkFNRV9EUklWRVIJCQkJCQkJIk1FLUR1bW15IgorCisvKiBNRVBISVNUT19TMSBkZWZpbmVzICovCisvKgorI2RlZmluZSBNRVBISVNUT19TMV9OQU1FX0RSSVZFUgkJCQkJCSJNRXBoaXN0byBTY29wZSAxIgorI2RlZmluZSBNRVBISVNUT19TMV9OQU1FX0RFVklDRQkJCQkJCSJNRXBoaXN0byBTY29wZSAxIgorI2RlZmluZSBNRVBISVNUT19TMV9ERVNDUklQVElPTl9ERVZJQ0UJCQkJIk1FcGhpc3RvIFNjb3BlIDEgZGV2aWNlLCAyIGFuYWxvZyBpbnB1dHMsIDI0IGRpZ2l0YWwgaS9vLiIKKyovCisvKiBFcnJvciBkZWZpbmVzICovCisjZGVmaW5lIEVNUFRZX05BTUVfRFJJVkVSCQkJCQkJCSJNRS0/Pz8iCisjZGVmaW5lIEVNUFRZX05BTUVfREVWSUNFCQkJCQkJCSJNRS0/Pz8iCisjZGVmaW5lIEVNUFRZX0RFU0NSSVBUSU9OX0RFVklDRQkJCQkJIk1FLT8/PyB1bmtub3duIGRldmljZSIKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWVpb2N0bC5oIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21laW9jdGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGM3MTlmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21laW9jdGwuaApAQCAtMCwwICsxLDUxNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogU291cmNlIEZpbGUgOiBtZWlvY3RsLmgKKyAqIEF1dGhvciAgICAgIDogR0cgKEd1ZW50ZXIgR2ViaGFyZHQpICA8Zy5nZWJoYXJkdEBtZWlsaGF1cy5kZT4KKyAqLworCisjaWZuZGVmIF9NRUlPQ1RMX0hfCisjZGVmaW5lIF9NRUlPQ1RMX0hfCisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBUeXBlcyBmb3IgdGhlIGlucHV0L291dHB1dCBpb2N0bHMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKwordHlwZWRlZiBzdHJ1Y3QgbWVfaW9faXJxX3N0YXJ0IHsKKwlpbnQgZGV2aWNlOworCWludCBzdWJkZXZpY2U7CisJaW50IGNoYW5uZWw7CisJaW50IGlycV9zb3VyY2U7CisJaW50IGlycV9lZGdlOworCWludCBpcnFfYXJnOworCWludCBmbGFnczsKKwlpbnQgZXJybm87Cit9IG1lX2lvX2lycV9zdGFydF90OworCisKK3R5cGVkZWYgc3RydWN0IG1lX2lvX2lycV93YWl0IHsKKwlpbnQgZGV2aWNlOworCWludCBzdWJkZXZpY2U7CisJaW50IGNoYW5uZWw7CisJaW50IGlycV9jb3VudDsKKwlpbnQgdmFsdWU7CisJaW50IHRpbWVfb3V0OworCWludCBmbGFnczsKKwlpbnQgZXJybm87Cit9IG1lX2lvX2lycV93YWl0X3Q7CisKKwordHlwZWRlZiBzdHJ1Y3QgbWVfaW9faXJxX3N0b3AgeworCWludCBkZXZpY2U7CisJaW50IHN1YmRldmljZTsKKwlpbnQgY2hhbm5lbDsKKwlpbnQgZmxhZ3M7CisJaW50IGVycm5vOworfSBtZV9pb19pcnFfc3RvcF90OworCisKK3R5cGVkZWYgc3RydWN0IG1lX2lvX3Jlc2V0X2RldmljZSB7CisJaW50IGRldmljZTsKKwlpbnQgZmxhZ3M7CisJaW50IGVycm5vOworfSBtZV9pb19yZXNldF9kZXZpY2VfdDsKKworCit0eXBlZGVmIHN0cnVjdCBtZV9pb19yZXNldF9zdWJkZXZpY2UgeworCWludCBkZXZpY2U7CisJaW50IHN1YmRldmljZTsKKwlpbnQgZmxhZ3M7CisJaW50IGVycm5vOworfSBtZV9pb19yZXNldF9zdWJkZXZpY2VfdDsKKworCit0eXBlZGVmIHN0cnVjdCBtZV9pb19zaW5nbGVfY29uZmlnIHsKKwlpbnQgZGV2aWNlOworCWludCBzdWJkZXZpY2U7CisJaW50IGNoYW5uZWw7CisJaW50IHNpbmdsZV9jb25maWc7CisJaW50IHJlZjsKKwlpbnQgdHJpZ19jaGFuOworCWludCB0cmlnX3R5cGU7CisJaW50IHRyaWdfZWRnZTsKKwlpbnQgZmxhZ3M7CisJaW50IGVycm5vOworfSBtZV9pb19zaW5nbGVfY29uZmlnX3Q7CisKKwordHlwZWRlZiBzdHJ1Y3QgbWVfaW9fc2luZ2xlIHsKKwltZUlPU2luZ2xlX3QgKnNpbmdsZV9saXN0OworCWludCBjb3VudDsKKwlpbnQgZmxhZ3M7CisJaW50IGVycm5vOworfSBtZV9pb19zaW5nbGVfdDsKKworCit0eXBlZGVmIHN0cnVjdCBtZV9pb19zdHJlYW1fY29uZmlnIHsKKwlpbnQgZGV2aWNlOworCWludCBzdWJkZXZpY2U7CisJbWVJT1N0cmVhbUNvbmZpZ190ICpjb25maWdfbGlzdDsKKwlpbnQgY291bnQ7CisJbWVJT1N0cmVhbVRyaWdnZXJfdCB0cmlnZ2VyOworCWludCBmaWZvX2lycV90aHJlc2hvbGQ7CisJaW50IGZsYWdzOworCWludCBlcnJubzsKK30gbWVfaW9fc3RyZWFtX2NvbmZpZ190OworCisKK3R5cGVkZWYgc3RydWN0IG1lX2lvX3N0cmVhbV9uZXdfdmFsdWVzIHsKKwlpbnQgZGV2aWNlOworCWludCBzdWJkZXZpY2U7CisJaW50IHRpbWVfb3V0OworCWludCBjb3VudDsKKwlpbnQgZmxhZ3M7CisJaW50IGVycm5vOworfSBtZV9pb19zdHJlYW1fbmV3X3ZhbHVlc190OworCisKK3R5cGVkZWYgc3RydWN0IG1lX2lvX3N0cmVhbV9yZWFkIHsKKwlpbnQgZGV2aWNlOworCWludCBzdWJkZXZpY2U7CisJaW50IHJlYWRfbW9kZTsKKwlpbnQgKnZhbHVlczsKKwlpbnQgY291bnQ7CisJaW50IGZsYWdzOworCWludCBlcnJubzsKK30gbWVfaW9fc3RyZWFtX3JlYWRfdDsKKworCit0eXBlZGVmIHN0cnVjdCBtZV9pb19zdHJlYW1fc3RhcnQgeworCW1lSU9TdHJlYW1TdGFydF90ICpzdGFydF9saXN0OworCWludCBjb3VudDsKKwlpbnQgZmxhZ3M7CisJaW50IGVycm5vOworfSBtZV9pb19zdHJlYW1fc3RhcnRfdDsKKworCit0eXBlZGVmIHN0cnVjdCBtZV9pb19zdHJlYW1fc3RhdHVzIHsKKwlpbnQgZGV2aWNlOworCWludCBzdWJkZXZpY2U7CisJaW50IHdhaXQ7CisJaW50IHN0YXR1czsKKwlpbnQgY291bnQ7CisJaW50IGZsYWdzOworCWludCBlcnJubzsKK30gbWVfaW9fc3RyZWFtX3N0YXR1c190OworCisKK3R5cGVkZWYgc3RydWN0IG1lX2lvX3N0cmVhbV9zdG9wIHsKKwltZUlPU3RyZWFtU3RvcF90ICpzdG9wX2xpc3Q7CisJaW50IGNvdW50OworCWludCBmbGFnczsKKwlpbnQgZXJybm87Cit9IG1lX2lvX3N0cmVhbV9zdG9wX3Q7CisKKwordHlwZWRlZiBzdHJ1Y3QgbWVfaW9fc3RyZWFtX3dyaXRlIHsKKwlpbnQgZGV2aWNlOworCWludCBzdWJkZXZpY2U7CisJaW50IHdyaXRlX21vZGU7CisJaW50ICp2YWx1ZXM7CisJaW50IGNvdW50OworCWludCBmbGFnczsKKwlpbnQgZXJybm87Cit9IG1lX2lvX3N0cmVhbV93cml0ZV90OworCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgVHlwZXMgZm9yIHRoZSBsb2NrIGlvY3RscworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCit0eXBlZGVmIHN0cnVjdCBtZV9sb2NrX2RldmljZSB7CisJaW50IGRldmljZTsKKwlpbnQgbG9jazsKKwlpbnQgZmxhZ3M7CisJaW50IGVycm5vOworfSBtZV9sb2NrX2RldmljZV90OworCisKK3R5cGVkZWYgc3RydWN0IG1lX2xvY2tfZHJpdmVyIHsKKwlpbnQgZmxhZ3M7CisJaW50IGxvY2s7CisJaW50IGVycm5vOworfSBtZV9sb2NrX2RyaXZlcl90OworCisKK3R5cGVkZWYgc3RydWN0IG1lX2xvY2tfc3ViZGV2aWNlIHsKKwlpbnQgZGV2aWNlOworCWludCBzdWJkZXZpY2U7CisJaW50IGxvY2s7CisJaW50IGZsYWdzOworCWludCBlcnJubzsKK30gbWVfbG9ja19zdWJkZXZpY2VfdDsKKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFR5cGVzIGZvciB0aGUgcXVlcnkgaW9jdGxzCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3R5cGVkZWYgc3RydWN0IG1lX3F1ZXJ5X2luZm9fZGV2aWNlIHsKKwlpbnQgZGV2aWNlOworCWludCB2ZW5kb3JfaWQ7CisJaW50IGRldmljZV9pZDsKKwlpbnQgc2VyaWFsX25vOworCWludCBidXNfdHlwZTsKKwlpbnQgYnVzX25vOworCWludCBkZXZfbm87CisJaW50IGZ1bmNfbm87CisJaW50IHBsdWdnZWQ7CisJaW50IGVycm5vOworfSBtZV9xdWVyeV9pbmZvX2RldmljZV90OworCisKK3R5cGVkZWYgc3RydWN0IG1lX3F1ZXJ5X2Rlc2NyaXB0aW9uX2RldmljZSB7CisJaW50IGRldmljZTsKKwljaGFyICpuYW1lOworCWludCBjb3VudDsKKwlpbnQgZXJybm87Cit9IG1lX3F1ZXJ5X2Rlc2NyaXB0aW9uX2RldmljZV90OworCisKK3R5cGVkZWYgc3RydWN0IG1lX3F1ZXJ5X25hbWVfZGV2aWNlIHsKKwlpbnQgZGV2aWNlOworCWNoYXIgKm5hbWU7CisJaW50IGNvdW50OworCWludCBlcnJubzsKK30gbWVfcXVlcnlfbmFtZV9kZXZpY2VfdDsKKworCit0eXBlZGVmIHN0cnVjdCBtZV9xdWVyeV9uYW1lX2RldmljZV9kcml2ZXIgeworCWludCBkZXZpY2U7CisJY2hhciAqbmFtZTsKKwlpbnQgY291bnQ7CisJaW50IGVycm5vOworfSBtZV9xdWVyeV9uYW1lX2RldmljZV9kcml2ZXJfdDsKKworCit0eXBlZGVmIHN0cnVjdCBtZV9xdWVyeV92ZXJzaW9uX21haW5fZHJpdmVyIHsKKwlpbnQgdmVyc2lvbjsKKwlpbnQgZXJybm87Cit9IG1lX3F1ZXJ5X3ZlcnNpb25fbWFpbl9kcml2ZXJfdDsKKworCit0eXBlZGVmIHN0cnVjdCBtZV9xdWVyeV92ZXJzaW9uX2RldmljZV9kcml2ZXIgeworCWludCBkZXZpY2U7CisJaW50IHZlcnNpb247CisJaW50IGVycm5vOworfSBtZV9xdWVyeV92ZXJzaW9uX2RldmljZV9kcml2ZXJfdDsKKworCit0eXBlZGVmIHN0cnVjdCBtZV9xdWVyeV9udW1iZXJfZGV2aWNlcyB7CisJaW50IG51bWJlcjsKKwlpbnQgZXJybm87Cit9IG1lX3F1ZXJ5X251bWJlcl9kZXZpY2VzX3Q7CisKKwordHlwZWRlZiBzdHJ1Y3QgbWVfcXVlcnlfbnVtYmVyX3N1YmRldmljZXMgeworCWludCBkZXZpY2U7CisJaW50IG51bWJlcjsKKwlpbnQgZXJybm87Cit9IG1lX3F1ZXJ5X251bWJlcl9zdWJkZXZpY2VzX3Q7CisKKwordHlwZWRlZiBzdHJ1Y3QgbWVfcXVlcnlfbnVtYmVyX2NoYW5uZWxzIHsKKwlpbnQgZGV2aWNlOworCWludCBzdWJkZXZpY2U7CisJaW50IG51bWJlcjsKKwlpbnQgZXJybm87Cit9IG1lX3F1ZXJ5X251bWJlcl9jaGFubmVsc190OworCisKK3R5cGVkZWYgc3RydWN0IG1lX3F1ZXJ5X251bWJlcl9yYW5nZXMgeworCWludCBkZXZpY2U7CisJaW50IHN1YmRldmljZTsKKwlpbnQgY2hhbm5lbDsKKwlpbnQgdW5pdDsKKwlpbnQgbnVtYmVyOworCWludCBlcnJubzsKK30gbWVfcXVlcnlfbnVtYmVyX3Jhbmdlc190OworCisKK3R5cGVkZWYgc3RydWN0IG1lX3F1ZXJ5X3N1YmRldmljZV9ieV90eXBlIHsKKwlpbnQgZGV2aWNlOworCWludCBzdGFydF9zdWJkZXZpY2U7CisJaW50IHR5cGU7CisJaW50IHN1YnR5cGU7CisJaW50IHN1YmRldmljZTsKKwlpbnQgZXJybm87Cit9IG1lX3F1ZXJ5X3N1YmRldmljZV9ieV90eXBlX3Q7CisKKwordHlwZWRlZiBzdHJ1Y3QgbWVfcXVlcnlfc3ViZGV2aWNlX3R5cGUgeworCWludCBkZXZpY2U7CisJaW50IHN1YmRldmljZTsKKwlpbnQgdHlwZTsKKwlpbnQgc3VidHlwZTsKKwlpbnQgZXJybm87Cit9IG1lX3F1ZXJ5X3N1YmRldmljZV90eXBlX3Q7CisKKwordHlwZWRlZiBzdHJ1Y3QgbWVfcXVlcnlfc3ViZGV2aWNlX2NhcHMgeworCWludCBkZXZpY2U7CisJaW50IHN1YmRldmljZTsKKwlpbnQgY2FwczsKKwlpbnQgZXJybm87Cit9IG1lX3F1ZXJ5X3N1YmRldmljZV9jYXBzX3Q7CisKKwordHlwZWRlZiBzdHJ1Y3QgbWVfcXVlcnlfc3ViZGV2aWNlX2NhcHNfYXJncyB7CisJaW50IGRldmljZTsKKwlpbnQgc3ViZGV2aWNlOworCWludCBjYXA7CisJaW50IGFyZ3NbOF07CisJaW50IGNvdW50OworCWludCBlcnJubzsKK30gbWVfcXVlcnlfc3ViZGV2aWNlX2NhcHNfYXJnc190OworCisKK3R5cGVkZWYgc3RydWN0IG1lX3F1ZXJ5X3RpbWVyIHsKKwlpbnQgZGV2aWNlOworCWludCBzdWJkZXZpY2U7CisJaW50IHRpbWVyOworCWludCBiYXNlX2ZyZXF1ZW5jeTsKKwlsb25nIGxvbmcgbWluX3RpY2tzOworCWxvbmcgbG9uZyBtYXhfdGlja3M7CisJaW50IGVycm5vOworfSBtZV9xdWVyeV90aW1lcl90OworCisKK3R5cGVkZWYgc3RydWN0IG1lX3F1ZXJ5X3JhbmdlX2J5X21pbl9tYXggeworCWludCBkZXZpY2U7CisJaW50IHN1YmRldmljZTsKKwlpbnQgY2hhbm5lbDsKKwlpbnQgdW5pdDsKKwlpbnQgbWluOworCWludCBtYXg7CisJaW50IG1heF9kYXRhOworCWludCByYW5nZTsKKwlpbnQgZXJybm87Cit9IG1lX3F1ZXJ5X3JhbmdlX2J5X21pbl9tYXhfdDsKKworCit0eXBlZGVmIHN0cnVjdCBtZV9xdWVyeV9yYW5nZV9pbmZvIHsKKwlpbnQgZGV2aWNlOworCWludCBzdWJkZXZpY2U7CisJaW50IGNoYW5uZWw7CisJaW50IHVuaXQ7CisJaW50IHJhbmdlOworCWludCBtaW47CisJaW50IG1heDsKKwlpbnQgbWF4X2RhdGE7CisJaW50IGVycm5vOworfSBtZV9xdWVyeV9yYW5nZV9pbmZvX3Q7CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBUeXBlcyBmb3IgdGhlIGNvbmZpZ3VyYXRpb24gaW9jdGxzCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3R5cGVkZWYgc3RydWN0IG1lX2NmZ190Y3BpcF9sb2NhdGlvbiB7CisJaW50IGFjY2Vzc190eXBlOworCWNoYXIgKnJlbW90ZV9ob3N0OworCWludCByZW1vdGVfZGV2aWNlX251bWJlcjsKK30gbWVfY2ZnX3RjcGlwX2xvY2F0aW9uX3Q7CisKKwordHlwZWRlZiB1bmlvbiBtZV9jZmdfdGNwaXAgeworCWludCBhY2Nlc3NfdHlwZTsKKwltZV9jZmdfdGNwaXBfbG9jYXRpb25fdCBsb2NhdGlvbjsKK30gbWVfY2ZnX3RjcGlwX3Q7CisKKwordHlwZWRlZiBzdHJ1Y3QgbWVfY2ZnX3BjaV9od19sb2NhdGlvbiB7CisJdW5zaWduZWQgaW50IGJ1c190eXBlOworCXVuc2lnbmVkIGludCBidXNfbm87CisJdW5zaWduZWQgaW50IGRldmljZV9ubzsKKwl1bnNpZ25lZCBpbnQgZnVuY3Rpb25fbm87Cit9IG1lX2NmZ19wY2lfaHdfbG9jYXRpb25fdDsKKworLyoKK3R5cGVkZWYgc3RydWN0IG1lX2NmZ191c2JfaHdfbG9jYXRpb24geworCXVuc2lnbmVkIGludCBidXNfdHlwZTsKKwl1bnNpZ25lZCBpbnQgcm9vdF9odWJfbm87Cit9IG1lX2NmZ191c2JfaHdfbG9jYXRpb25fdDsKKyovCisKK3R5cGVkZWYgdW5pb24gbWVfY2ZnX2h3X2xvY2F0aW9uIHsKKwl1bnNpZ25lZCBpbnQgYnVzX3R5cGU7CisJbWVfY2ZnX3BjaV9od19sb2NhdGlvbl90IHBjaTsKKy8vCW1lX2NmZ191c2JfaHdfbG9jYXRpb25fdCB1c2I7Cit9IG1lX2NmZ19od19sb2NhdGlvbl90OworCisKK3R5cGVkZWYgc3RydWN0IG1lX2NmZ19kZXZpY2VfaW5mbyB7CisJdW5zaWduZWQgaW50IHZlbmRvcl9pZDsKKwl1bnNpZ25lZCBpbnQgZGV2aWNlX2lkOworCXVuc2lnbmVkIGludCBzZXJpYWxfbm87CisJbWVfY2ZnX2h3X2xvY2F0aW9uX3QgaHdfbG9jYXRpb247Cit9IG1lX2NmZ19kZXZpY2VfaW5mb190OworCisKK3R5cGVkZWYgc3RydWN0IG1lX2NmZ19zdWJkZXZpY2VfaW5mbyB7CisJaW50IHR5cGU7CisJaW50IHN1Yl90eXBlOworCXVuc2lnbmVkIGludCBudW1iZXJfY2hhbm5lbHM7Cit9IG1lX2NmZ19zdWJkZXZpY2VfaW5mb190OworCisKK3R5cGVkZWYgc3RydWN0IG1lX2NmZ19yYW5nZV9lbnRyeSB7CisJaW50IHVuaXQ7CisJZG91YmxlIG1pbjsKKwlkb3VibGUgbWF4OworCXVuc2lnbmVkIGludCBtYXhfZGF0YTsKK30gbWVfY2ZnX3JhbmdlX2VudHJ5X3Q7CisKKwordHlwZWRlZiBzdHJ1Y3QgbWVfY2ZnX211eDMybV9kZXZpY2UgeworCWludCB0eXBlOworCWludCB0aW1lZDsKKwl1bnNpZ25lZCBpbnQgYWlfY2hhbm5lbDsKKwl1bnNpZ25lZCBpbnQgZGlvX2RldmljZTsKKwl1bnNpZ25lZCBpbnQgZGlvX3N1YmRldmljZTsKKwl1bnNpZ25lZCBpbnQgdGltZXJfZGV2aWNlOworCXVuc2lnbmVkIGludCB0aW1lcl9zdWJkZXZpY2U7CisJdW5zaWduZWQgaW50IG11eDMyc19jb3VudDsKK30gbWVfY2ZnX211eDMybV9kZXZpY2VfdDsKKworCit0eXBlZGVmIHN0cnVjdCBtZV9jZmdfZGVtdXgzMl9kZXZpY2UgeworCWludCB0eXBlOworCWludCB0aW1lZDsKKwl1bnNpZ25lZCBpbnQgYW9fY2hhbm5lbDsKKwl1bnNpZ25lZCBpbnQgZGlvX2RldmljZTsKKwl1bnNpZ25lZCBpbnQgZGlvX3N1YmRldmljZTsKKwl1bnNpZ25lZCBpbnQgdGltZXJfZGV2aWNlOworCXVuc2lnbmVkIGludCB0aW1lcl9zdWJkZXZpY2U7Cit9IG1lX2NmZ19kZW11eDMyX2RldmljZV90OworCisKK3R5cGVkZWYgdW5pb24gbWVfY2ZnX2V4dGVybmFsX2RldmljZSB7CisJaW50IHR5cGU7CisJbWVfY2ZnX211eDMybV9kZXZpY2VfdCBtdXgzMm07CisJbWVfY2ZnX2RlbXV4MzJfZGV2aWNlX3QgZGVtdXgzMjsKK30gbWVfY2ZnX2V4dGVybmFsX2RldmljZV90OworCisKK3R5cGVkZWYgc3RydWN0IG1lX2NmZ19zdWJkZXZpY2VfZW50cnkgeworCW1lX2NmZ19zdWJkZXZpY2VfaW5mb190IGluZm87CisJbWVfY2ZnX3JhbmdlX2VudHJ5X3QgKnJhbmdlX2xpc3Q7CisJdW5zaWduZWQgaW50IGNvdW50OworCWludCBsb2NrZWQ7CisJbWVfY2ZnX2V4dGVybmFsX2RldmljZV90IGV4dGVybmFsX2RldmljZTsKK30gbWVfY2ZnX3N1YmRldmljZV9lbnRyeV90OworCisKK3R5cGVkZWYgc3RydWN0IG1lX2NmZ19kZXZpY2VfZW50cnkgeworCW1lX2NmZ190Y3BpcF90IHRjcGlwOworCW1lX2NmZ19kZXZpY2VfaW5mb190IGluZm87CisJbWVfY2ZnX3N1YmRldmljZV9lbnRyeV90ICpzdWJkZXZpY2VfbGlzdDsKKwl1bnNpZ25lZCBpbnQgY291bnQ7Cit9IG1lX2NmZ19kZXZpY2VfZW50cnlfdDsKKworCit0eXBlZGVmIHN0cnVjdCBtZV9jb25maWdfbG9hZCB7CisJbWVfY2ZnX2RldmljZV9lbnRyeV90ICpkZXZpY2VfbGlzdDsKKwl1bnNpZ25lZCBpbnQgY291bnQ7CisJaW50IGVycm5vOworfSBtZV9jb25maWdfbG9hZF90OworCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgVGhlIGlvY3RscyBvZiB0aGUgYm9hcmQKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2RlZmluZSBNRU1BSU5fTUFHSUMgJ3knCisKKyNkZWZpbmUgTUVfSU9fSVJRX0VOQUJMRQkJCQlfSU9SIChNRU1BSU5fTUFHSUMsIDEsIG1lX2lvX2lycV9zdGFydF90KQorI2RlZmluZSBNRV9JT19JUlFfV0FJVAkJCQkJX0lPUiAoTUVNQUlOX01BR0lDLCAyLCBtZV9pb19pcnFfd2FpdF90KQorI2RlZmluZSBNRV9JT19JUlFfRElTQUJMRQkJCQlfSU9SIChNRU1BSU5fTUFHSUMsIDMsIG1lX2lvX2lycV9zdG9wX3QpCisKKyNkZWZpbmUgTUVfSU9fUkVTRVRfREVWSUNFCQkJCV9JT1cgKE1FTUFJTl9NQUdJQywgNCwgbWVfaW9fcmVzZXRfZGV2aWNlX3QpCisjZGVmaW5lIE1FX0lPX1JFU0VUX1NVQkRFVklDRQkJCV9JT1cgKE1FTUFJTl9NQUdJQywgNSwgbWVfaW9fcmVzZXRfc3ViZGV2aWNlX3QpCisKKyNkZWZpbmUgTUVfSU9fU0lOR0xFCQkJCQlfSU9XUihNRU1BSU5fTUFHSUMsIDYsIG1lX2lvX3NpbmdsZV90KQorI2RlZmluZSBNRV9JT19TSU5HTEVfQ09ORklHCQkJCV9JT1cgKE1FTUFJTl9NQUdJQywgNywgbWVfaW9fc2luZ2xlX2NvbmZpZ190KQorCisjZGVmaW5lIE1FX0lPX1NUUkVBTV9DT05GSUcJCQkJX0lPVyAoTUVNQUlOX01BR0lDLCA4LCBtZV9pb19zdHJlYW1fY29uZmlnX3QpCisjZGVmaW5lIE1FX0lPX1NUUkVBTV9ORVdfVkFMVUVTCQkJX0lPUiAoTUVNQUlOX01BR0lDLCA5LCBtZV9pb19zdHJlYW1fbmV3X3ZhbHVlc190KQorI2RlZmluZSBNRV9JT19TVFJFQU1fUkVBRAkJCQlfSU9SIChNRU1BSU5fTUFHSUMsIDEwLCBtZV9pb19zdHJlYW1fcmVhZF90KQorI2RlZmluZSBNRV9JT19TVFJFQU1fU1RBUlQJCQkJX0lPVyAoTUVNQUlOX01BR0lDLCAxMSwgbWVfaW9fc3RyZWFtX3N0YXJ0X3QpCisjZGVmaW5lIE1FX0lPX1NUUkVBTV9TVEFUVVMJCQkJX0lPUiAoTUVNQUlOX01BR0lDLCAxMiwgbWVfaW9fc3RyZWFtX3N0YXR1c190KQorI2RlZmluZSBNRV9JT19TVFJFQU1fU1RPUAkJCQlfSU9XIChNRU1BSU5fTUFHSUMsIDEzLCBtZV9pb19zdHJlYW1fc3RvcF90KQorI2RlZmluZSBNRV9JT19TVFJFQU1fV1JJVEUJCQkJX0lPVyAoTUVNQUlOX01BR0lDLCAxNCwgbWVfaW9fc3RyZWFtX3dyaXRlX3QpCisKKyNkZWZpbmUgTUVfTE9DS19EUklWRVIJCQkJCV9JT1cgKE1FTUFJTl9NQUdJQywgMTUsIG1lX2xvY2tfZHJpdmVyX3QpCisjZGVmaW5lIE1FX0xPQ0tfREVWSUNFCQkJCQlfSU9XIChNRU1BSU5fTUFHSUMsIDE2LCBtZV9sb2NrX2RldmljZV90KQorI2RlZmluZSBNRV9MT0NLX1NVQkRFVklDRQkJCQlfSU9XIChNRU1BSU5fTUFHSUMsIDE3LCBtZV9sb2NrX3N1YmRldmljZV90KQorCisjZGVmaW5lIE1FX1FVRVJZX0RFU0NSSVBUSU9OX0RFVklDRQkJX0lPUiAoTUVNQUlOX01BR0lDLCAxOCwgbWVfcXVlcnlfZGVzY3JpcHRpb25fZGV2aWNlX3QpCisKKyNkZWZpbmUgTUVfUVVFUllfSU5GT19ERVZJQ0UJCQlfSU9SIChNRU1BSU5fTUFHSUMsIDE5LCBtZV9xdWVyeV9pbmZvX2RldmljZV90KQorCisjZGVmaW5lIE1FX1FVRVJZX05BTUVfREVWSUNFCQkJX0lPUiAoTUVNQUlOX01BR0lDLCAyMCwgbWVfcXVlcnlfbmFtZV9kZXZpY2VfdCkKKyNkZWZpbmUgTUVfUVVFUllfTkFNRV9ERVZJQ0VfRFJJVkVSCQlfSU9SIChNRU1BSU5fTUFHSUMsIDIxLCBtZV9xdWVyeV9uYW1lX2RldmljZV9kcml2ZXJfdCkKKworI2RlZmluZSBNRV9RVUVSWV9OVU1CRVJfREVWSUNFUwkJCV9JT1IgKE1FTUFJTl9NQUdJQywgMjIsIG1lX3F1ZXJ5X251bWJlcl9kZXZpY2VzX3QpCisjZGVmaW5lIE1FX1FVRVJZX05VTUJFUl9TVUJERVZJQ0VTCQlfSU9SIChNRU1BSU5fTUFHSUMsIDIzLCBtZV9xdWVyeV9udW1iZXJfc3ViZGV2aWNlc190KQorI2RlZmluZSBNRV9RVUVSWV9OVU1CRVJfQ0hBTk5FTFMJCV9JT1IgKE1FTUFJTl9NQUdJQywgMjQsIG1lX3F1ZXJ5X251bWJlcl9jaGFubmVsc190KQorI2RlZmluZSBNRV9RVUVSWV9OVU1CRVJfUkFOR0VTCQkJX0lPUiAoTUVNQUlOX01BR0lDLCAyNSwgbWVfcXVlcnlfbnVtYmVyX3Jhbmdlc190KQorCisjZGVmaW5lIE1FX1FVRVJZX1JBTkdFX0JZX01JTl9NQVgJCV9JT1IgKE1FTUFJTl9NQUdJQywgMjYsIG1lX3F1ZXJ5X3JhbmdlX2J5X21pbl9tYXhfdCkKKyNkZWZpbmUgTUVfUVVFUllfUkFOR0VfSU5GTwkJCQlfSU9SIChNRU1BSU5fTUFHSUMsIDI3LCBtZV9xdWVyeV9yYW5nZV9pbmZvX3QpCisKKyNkZWZpbmUgTUVfUVVFUllfU1VCREVWSUNFX0JZX1RZUEUJCV9JT1IgKE1FTUFJTl9NQUdJQywgMjgsIG1lX3F1ZXJ5X3N1YmRldmljZV9ieV90eXBlX3QpCisjZGVmaW5lIE1FX1FVRVJZX1NVQkRFVklDRV9UWVBFCQkJX0lPUiAoTUVNQUlOX01BR0lDLCAyOSwgbWVfcXVlcnlfc3ViZGV2aWNlX3R5cGVfdCkKKyNkZWZpbmUgTUVfUVVFUllfU1VCREVWSUNFX0NBUFMJCQlfSU9SIChNRU1BSU5fTUFHSUMsIDI5LCBtZV9xdWVyeV9zdWJkZXZpY2VfY2Fwc190KQorI2RlZmluZSBNRV9RVUVSWV9TVUJERVZJQ0VfQ0FQU19BUkdTCV9JT1IgKE1FTUFJTl9NQUdJQywgMzAsIG1lX3F1ZXJ5X3N1YmRldmljZV9jYXBzX2FyZ3NfdCkKKworI2RlZmluZSBNRV9RVUVSWV9USU1FUgkJCQkJX0lPUiAoTUVNQUlOX01BR0lDLCAzMSwgbWVfcXVlcnlfdGltZXJfdCkKKworI2RlZmluZSBNRV9RVUVSWV9WRVJTSU9OX0RFVklDRV9EUklWRVIJX0lPUiAoTUVNQUlOX01BR0lDLCAzMiwgbWVfcXVlcnlfdmVyc2lvbl9kZXZpY2VfZHJpdmVyX3QpCisjZGVmaW5lIE1FX1FVRVJZX1ZFUlNJT05fTUFJTl9EUklWRVIJX0lPUiAoTUVNQUlOX01BR0lDLCAzMywgbWVfcXVlcnlfdmVyc2lvbl9tYWluX2RyaXZlcl90KQorCisjZGVmaW5lIE1FX0NPTkZJR19MT0FECQkJCQlfSU9XUihNRU1BSU5fTUFHSUMsIDM0LCBtZV9jb25maWdfbG9hZF90KQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZW1haW4uYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZW1haW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDlkMWE2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lbWFpbi5jCkBAIC0wLDAgKzEsMjAyMiBAQAorLyoqCisgKiBAZmlsZSBtZW1haW4uYworICoKKyAqIEBicmllZiBNYWluIE1laWxoYXVzIGRldmljZSBkcml2ZXIuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKiBAYXV0aG9yIEtyenlzenRvZiBHYW50emtlCShrLmdhbnR6a2VAbWVpbGhhdXMuZGUpCisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0tFUk5FTF9fCisjICBkZWZpbmUgX19LRVJORUxfXworI2VuZGlmCisKKyNpZm5kZWYgTU9EVUxFCisjICBkZWZpbmUgTU9EVUxFCisjZW5kaWYKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorLy8jaW5jbHVkZSA8bGludXgvdXNiLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L2NkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9yd3NlbS5oPgorCisjaW5jbHVkZSAibWVkZWZpbmVzLmgiCisjaW5jbHVkZSAibWV0eXBlcy5oIgorI2luY2x1ZGUgIm1lZXJyb3IuaCIKKworI2luY2x1ZGUgIm1lZGVidWcuaCIKKyNpbmNsdWRlICJtZW1haW4uaCIKKyNpbmNsdWRlICJtZWRldmljZS5oIgorI2luY2x1ZGUgIm1laW9jdGwuaCIKKyNpbmNsdWRlICJtZWNvbW1vbi5oIgorCisvKiBNb2R1bGUgcGFyYW1ldGVycworKi8KKworI2lmZGVmIEJPU0NICitzdGF0aWMgdW5zaWduZWQgaW50IG1lX2Jvc2NoX2Z3ID0gMDsKKworIyBpZmRlZiBtb2R1bGVfcGFyYW0KK21vZHVsZV9wYXJhbShtZV9ib3NjaF9mdywgaW50LCBTX0lSVUdPKTsKKyMgZWxzZQorTU9EVUxFX1BBUk0obWVfYm9zY2hfZncsICJpIik7CisjIGVuZGlmCisKK01PRFVMRV9QQVJNX0RFU0MobWVfYm9zY2hfZncsCisJCSAiRmxhZ3Mgd2hpY2ggc2lnbmFscyB0aGUgTUUtNDYwMCBkcml2ZXIgdG8gbG9hZCB0aGUgYm9zY2ggZmlybXdhcmUgKGRlZmF1bHQgPSAwKS4iKTsKKyNlbmRpZiAvL0JPU0NICisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbWFqb3IgPSAwOworI2lmZGVmIG1vZHVsZV9wYXJhbQorbW9kdWxlX3BhcmFtKG1ham9yLCBpbnQsIFNfSVJVR08pOworI2Vsc2UKK01PRFVMRV9QQVJNKG1ham9yLCAiaSIpOworI2VuZGlmCisKKy8qIEdsb2JhbCBEcml2ZXIgTG9jaworKi8KKworc3RhdGljIHN0cnVjdCBmaWxlICptZV9maWxlcCA9IE5VTEw7CitzdGF0aWMgaW50IG1lX2NvdW50ID0gMDsKK3N0YXRpYyBzcGlubG9ja190IG1lX2xvY2sgPSBTUElOX0xPQ0tfVU5MT0NLRUQ7CitzdGF0aWMgREVDTEFSRV9SV1NFTShtZV9yd3NlbSk7CisKKy8qIEJvYXJkIGluc3RhbmNlcyBhcmUga2VwdCBpbiBhIGdsb2JhbCBsaXN0ICovCitMSVNUX0hFQUQobWVfZGV2aWNlX2xpc3QpOworCisvKiBQcm90b3R5cGVzCisqLworCitzdGF0aWMgaW50IG1lX3Byb2JlX3BjaShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpOworc3RhdGljIHZvaWQgbWVfcmVtb3ZlX3BjaShzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKK3N0YXRpYyBpbnQgaW5zZXJ0X3RvX2RldmljZV9saXN0KG1lX2RldmljZV90ICogbl9kZXZpY2UpOworc3RhdGljIGludCByZXBsYWNlX3dpdGhfZHVtbXkoaW50IHZlbmRvcl9pZCwgaW50IGRldmljZV9pZCwgaW50IHNlcmlhbF9ubyk7CitzdGF0aWMgdm9pZCBjbGVhcl9kZXZpY2VfbGlzdCh2b2lkKTsKK3N0YXRpYyBpbnQgbWVfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlX3B0ciwgc3RydWN0IGZpbGUgKmZpbGVwKTsKK3N0YXRpYyBpbnQgbWVfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGZpbGUgKik7CitzdGF0aWMgaW50IG1lX2lvY3RsKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZmlsZSAqLCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGxvbmcpOworLy9zdGF0aWMgaW50IG1lX3Byb2JlX3VzYihzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZXJmYWNlLCBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpOworLy9zdGF0aWMgdm9pZCBtZV9kaXNjb25uZWN0X3VzYihzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZXJmYWNlKTsKKworLyogQ2hhcmFjdGVyIGRldmljZSBzdHJ1Y3R1cmUKKyovCisKK3N0YXRpYyBzdHJ1Y3QgY2RldiAqY2RldnA7CisKKy8qIEZpbGUgb3BlcmF0aW9ucyBwcm92aWRlZCBieSB0aGUgbW9kdWxlCisqLworCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBtZV9maWxlX29wZXJhdGlvbnMgPSB7CisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLmlvY3RsID0gbWVfaW9jdGwsCisJLm9wZW4gPSBtZV9vcGVuLAorCS5yZWxlYXNlID0gbWVfcmVsZWFzZSwKK307CisKK3N0cnVjdCBwY2lfZHJpdmVyIG1lX3BjaV9kcml2ZXIgPSB7CisJLm5hbWUgPSBNRU1BSU5fTkFNRSwKKwkuaWRfdGFibGUgPSBtZV9wY2lfdGFibGUsCisJLnByb2JlID0gbWVfcHJvYmVfcGNpLAorCS5yZW1vdmUgPSBtZV9yZW1vdmVfcGNpCit9OworCisvKiAvL21lX3VzYl9kcml2ZXIKK3N0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciBtZV91c2JfZHJpdmVyID0KK3sKKwkubmFtZSA9IE1FTUFJTl9OQU1FLAorCS5pZF90YWJsZSA9IG1lX3VzYl90YWJsZSwKKwkucHJvYmUgPSBtZV9wcm9iZV91c2IsCisJLmRpc2Nvbm5lY3QgPSBtZV9kaXNjb25uZWN0X3VzYgorfTsKKyovCisKKyNpZmRlZiBNRV9MT0NLX01VTFRJUExFWF9URU1QTEFURQorTUVfTE9DS19NVUxUSVBMRVhfVEVNUExBVEUoIm1lX2xvY2tfZGV2aWNlIiwKKwkJCSAgIG1lX2xvY2tfZGV2aWNlX3QsCisJCQkgICBtZV9sb2NrX2RldmljZSwKKwkJCSAgIG1lX2RldmljZV9sb2NrX2RldmljZSwKKwkJCSAgIChkZXZpY2UsIGZpbGVwLCBrYXJnLmxvY2ssIGthcmcuZmxhZ3MpKQorCisgICAgTUVfTE9DS19NVUxUSVBMRVhfVEVNUExBVEUoIm1lX2xvY2tfc3ViZGV2aWNlIiwKKwkJCSAgIG1lX2xvY2tfc3ViZGV2aWNlX3QsCisJCQkgICBtZV9sb2NrX3N1YmRldmljZSwKKwkJCSAgIG1lX2RldmljZV9sb2NrX3N1YmRldmljZSwKKwkJCSAgIChkZXZpY2UsIGZpbGVwLCBrYXJnLnN1YmRldmljZSwga2FyZy5sb2NrLAorCQkJa2FyZy5mbGFncykpCisjZWxzZQorI2Vycm9yIG1hY3JvIE1FX0xPQ0tfTVVMVElQTEVYX1RFTVBMQVRFIG5vdCBkZWZpbmVkCisjZW5kaWYKKworI2lmZGVmIE1FX0lPX01VTFRJUExFWF9URU1QTEFURQorTUVfSU9fTVVMVElQTEVYX1RFTVBMQVRFKCJtZV9pb19pcnFfc3RhcnQiLAorCQkJIG1lX2lvX2lycV9zdGFydF90LAorCQkJIG1lX2lvX2lycV9zdGFydCwKKwkJCSBtZV9kZXZpY2VfaW9faXJxX3N0YXJ0LAorCQkJIChkZXZpY2UsCisJCQkgIGZpbGVwLAorCQkJICBrYXJnLnN1YmRldmljZSwKKwkJCSAga2FyZy5jaGFubmVsLAorCQkJICBrYXJnLmlycV9zb3VyY2UsCisJCQkgIGthcmcuaXJxX2VkZ2UsIGthcmcuaXJxX2FyZywga2FyZy5mbGFncykpCisKKyAgICBNRV9JT19NVUxUSVBMRVhfVEVNUExBVEUoIm1lX2lvX2lycV93YWl0IiwKKwkJCSBtZV9pb19pcnFfd2FpdF90LAorCQkJIG1lX2lvX2lycV93YWl0LAorCQkJIG1lX2RldmljZV9pb19pcnFfd2FpdCwKKwkJCSAoZGV2aWNlLAorCQkgICAgICBmaWxlcCwKKwkJICAgICAga2FyZy5zdWJkZXZpY2UsCisJCSAgICAgIGthcmcuY2hhbm5lbCwKKwkJICAgICAgJmthcmcuaXJxX2NvdW50LCAma2FyZy52YWx1ZSwga2FyZy50aW1lX291dCwga2FyZy5mbGFncykpCisKKyAgICBNRV9JT19NVUxUSVBMRVhfVEVNUExBVEUoIm1lX2lvX2lycV9zdG9wIiwKKwkJCSBtZV9pb19pcnFfc3RvcF90LAorCQkJIG1lX2lvX2lycV9zdG9wLAorCQkJIG1lX2RldmljZV9pb19pcnFfc3RvcCwKKwkJCSAoZGV2aWNlLAorCQkgICAgICBmaWxlcCwga2FyZy5zdWJkZXZpY2UsIGthcmcuY2hhbm5lbCwga2FyZy5mbGFncykpCisKKyAgICBNRV9JT19NVUxUSVBMRVhfVEVNUExBVEUoIm1lX2lvX3Jlc2V0X2RldmljZSIsCisJCQkgbWVfaW9fcmVzZXRfZGV2aWNlX3QsCisJCQkgbWVfaW9fcmVzZXRfZGV2aWNlLAorCQkJIG1lX2RldmljZV9pb19yZXNldF9kZXZpY2UsIChkZXZpY2UsIGZpbGVwLCBrYXJnLmZsYWdzKSkKKworICAgIE1FX0lPX01VTFRJUExFWF9URU1QTEFURSgibWVfaW9fcmVzZXRfc3ViZGV2aWNlIiwKKwkJCSBtZV9pb19yZXNldF9zdWJkZXZpY2VfdCwKKwkJCSBtZV9pb19yZXNldF9zdWJkZXZpY2UsCisJCQkgbWVfZGV2aWNlX2lvX3Jlc2V0X3N1YmRldmljZSwKKwkJCSAoZGV2aWNlLCBmaWxlcCwga2FyZy5zdWJkZXZpY2UsIGthcmcuZmxhZ3MpKQorCisgICAgTUVfSU9fTVVMVElQTEVYX1RFTVBMQVRFKCJtZV9pb19zaW5nbGVfY29uZmlnIiwKKwkJCSBtZV9pb19zaW5nbGVfY29uZmlnX3QsCisJCQkgbWVfaW9fc2luZ2xlX2NvbmZpZywKKwkJCSBtZV9kZXZpY2VfaW9fc2luZ2xlX2NvbmZpZywKKwkJCSAoZGV2aWNlLAorCQkgICAgICBmaWxlcCwKKwkJICAgICAga2FyZy5zdWJkZXZpY2UsCisJCSAgICAgIGthcmcuY2hhbm5lbCwKKwkJICAgICAga2FyZy5zaW5nbGVfY29uZmlnLAorCQkgICAgICBrYXJnLnJlZiwKKwkJICAgICAga2FyZy50cmlnX2NoYW4sCisJCSAgICAgIGthcmcudHJpZ190eXBlLCBrYXJnLnRyaWdfZWRnZSwga2FyZy5mbGFncykpCisKKyAgICBNRV9JT19NVUxUSVBMRVhfVEVNUExBVEUoIm1lX2lvX3N0cmVhbV9uZXdfdmFsdWVzIiwKKwkJCSBtZV9pb19zdHJlYW1fbmV3X3ZhbHVlc190LAorCQkJIG1lX2lvX3N0cmVhbV9uZXdfdmFsdWVzLAorCQkJIG1lX2RldmljZV9pb19zdHJlYW1fbmV3X3ZhbHVlcywKKwkJCSAoZGV2aWNlLAorCQkgICAgICBmaWxlcCwKKwkJICAgICAga2FyZy5zdWJkZXZpY2UsIGthcmcudGltZV9vdXQsICZrYXJnLmNvdW50LCBrYXJnLmZsYWdzKSkKKworICAgIE1FX0lPX01VTFRJUExFWF9URU1QTEFURSgibWVfaW9fc3RyZWFtX3JlYWQiLAorCQkJIG1lX2lvX3N0cmVhbV9yZWFkX3QsCisJCQkgbWVfaW9fc3RyZWFtX3JlYWQsCisJCQkgbWVfZGV2aWNlX2lvX3N0cmVhbV9yZWFkLAorCQkJIChkZXZpY2UsCisJCSAgICAgIGZpbGVwLAorCQkgICAgICBrYXJnLnN1YmRldmljZSwKKwkJICAgICAga2FyZy5yZWFkX21vZGUsIGthcmcudmFsdWVzLCAma2FyZy5jb3VudCwga2FyZy5mbGFncykpCisKKyAgICBNRV9JT19NVUxUSVBMRVhfVEVNUExBVEUoIm1lX2lvX3N0cmVhbV9zdGF0dXMiLAorCQkJIG1lX2lvX3N0cmVhbV9zdGF0dXNfdCwKKwkJCSBtZV9pb19zdHJlYW1fc3RhdHVzLAorCQkJIG1lX2RldmljZV9pb19zdHJlYW1fc3RhdHVzLAorCQkJIChkZXZpY2UsCisJCSAgICAgIGZpbGVwLAorCQkgICAgICBrYXJnLnN1YmRldmljZSwKKwkJICAgICAga2FyZy53YWl0LCAma2FyZy5zdGF0dXMsICZrYXJnLmNvdW50LCBrYXJnLmZsYWdzKSkKKworICAgIE1FX0lPX01VTFRJUExFWF9URU1QTEFURSgibWVfaW9fc3RyZWFtX3dyaXRlIiwKKwkJCSBtZV9pb19zdHJlYW1fd3JpdGVfdCwKKwkJCSBtZV9pb19zdHJlYW1fd3JpdGUsCisJCQkgbWVfZGV2aWNlX2lvX3N0cmVhbV93cml0ZSwKKwkJCSAoZGV2aWNlLAorCQkgICAgICBmaWxlcCwKKwkJICAgICAga2FyZy5zdWJkZXZpY2UsCisJCSAgICAgIGthcmcud3JpdGVfbW9kZSwga2FyZy52YWx1ZXMsICZrYXJnLmNvdW50LCBrYXJnLmZsYWdzKSkKKyNlbHNlCisjZXJyb3IgbWFjcm8gTUVfSU9fTVVMVElQTEVYX1RFTVBMQVRFIG5vdCBkZWZpbmVkCisjZW5kaWYKKworI2lmZGVmIE1FX1FVRVJZX01VTFRJUExFWF9TVFJfVEVNUExBVEUKK01FX1FVRVJZX01VTFRJUExFWF9TVFJfVEVNUExBVEUoIm1lX3F1ZXJ5X25hbWVfZGV2aWNlIiwKKwkJCQltZV9xdWVyeV9uYW1lX2RldmljZV90LAorCQkJCW1lX3F1ZXJ5X25hbWVfZGV2aWNlLAorCQkJCW1lX2RldmljZV9xdWVyeV9uYW1lX2RldmljZSwgKGRldmljZSwgJm1zZykpCisKKyAgICBNRV9RVUVSWV9NVUxUSVBMRVhfU1RSX1RFTVBMQVRFKCJtZV9xdWVyeV9uYW1lX2RldmljZV9kcml2ZXIiLAorCQkJCW1lX3F1ZXJ5X25hbWVfZGV2aWNlX2RyaXZlcl90LAorCQkJCW1lX3F1ZXJ5X25hbWVfZGV2aWNlX2RyaXZlciwKKwkJCQltZV9kZXZpY2VfcXVlcnlfbmFtZV9kZXZpY2VfZHJpdmVyLAorCQkJCShkZXZpY2UsICZtc2cpKQorCisgICAgTUVfUVVFUllfTVVMVElQTEVYX1NUUl9URU1QTEFURSgibWVfcXVlcnlfZGVzY3JpcHRpb25fZGV2aWNlIiwKKwkJCQltZV9xdWVyeV9kZXNjcmlwdGlvbl9kZXZpY2VfdCwKKwkJCQltZV9xdWVyeV9kZXNjcmlwdGlvbl9kZXZpY2UsCisJCQkJbWVfZGV2aWNlX3F1ZXJ5X2Rlc2NyaXB0aW9uX2RldmljZSwKKwkJCQkoZGV2aWNlLCAmbXNnKSkKKyNlbHNlCisjZXJyb3IgbWFjcm8gTUVfUVVFUllfTVVMVElQTEVYX1NUUl9URU1QTEFURSBub3QgZGVmaW5lZAorI2VuZGlmCisKKyNpZmRlZiBNRV9RVUVSWV9NVUxUSVBMRVhfVEVNUExBVEUKK01FX1FVRVJZX01VTFRJUExFWF9URU1QTEFURSgibWVfcXVlcnlfaW5mb19kZXZpY2UiLAorCQkJICAgIG1lX3F1ZXJ5X2luZm9fZGV2aWNlX3QsCisJCQkgICAgbWVfcXVlcnlfaW5mb19kZXZpY2UsCisJCQkgICAgbWVfZGV2aWNlX3F1ZXJ5X2luZm9fZGV2aWNlLAorCQkJICAgIChkZXZpY2UsCisJCQkgICAgICZrYXJnLnZlbmRvcl9pZCwKKwkJCSAgICAgJmthcmcuZGV2aWNlX2lkLAorCQkJICAgICAma2FyZy5zZXJpYWxfbm8sCisJCQkgICAgICZrYXJnLmJ1c190eXBlLAorCQkJICAgICAma2FyZy5idXNfbm8sCisJCQkgICAgICZrYXJnLmRldl9ubywgJmthcmcuZnVuY19ubywgJmthcmcucGx1Z2dlZCkpCisKKyAgICBNRV9RVUVSWV9NVUxUSVBMRVhfVEVNUExBVEUoIm1lX3F1ZXJ5X251bWJlcl9zdWJkZXZpY2VzIiwKKwkJCSAgICBtZV9xdWVyeV9udW1iZXJfc3ViZGV2aWNlc190LAorCQkJICAgIG1lX3F1ZXJ5X251bWJlcl9zdWJkZXZpY2VzLAorCQkJICAgIG1lX2RldmljZV9xdWVyeV9udW1iZXJfc3ViZGV2aWNlcywKKwkJCSAgICAoZGV2aWNlLCAma2FyZy5udW1iZXIpKQorCisgICAgTUVfUVVFUllfTVVMVElQTEVYX1RFTVBMQVRFKCJtZV9xdWVyeV9udW1iZXJfY2hhbm5lbHMiLAorCQkJICAgIG1lX3F1ZXJ5X251bWJlcl9jaGFubmVsc190LAorCQkJICAgIG1lX3F1ZXJ5X251bWJlcl9jaGFubmVscywKKwkJCSAgICBtZV9kZXZpY2VfcXVlcnlfbnVtYmVyX2NoYW5uZWxzLAorCQkJICAgIChkZXZpY2UsIGthcmcuc3ViZGV2aWNlLCAma2FyZy5udW1iZXIpKQorCisgICAgTUVfUVVFUllfTVVMVElQTEVYX1RFTVBMQVRFKCJtZV9xdWVyeV9zdWJkZXZpY2VfYnlfdHlwZSIsCisJCQkgICAgbWVfcXVlcnlfc3ViZGV2aWNlX2J5X3R5cGVfdCwKKwkJCSAgICBtZV9xdWVyeV9zdWJkZXZpY2VfYnlfdHlwZSwKKwkJCSAgICBtZV9kZXZpY2VfcXVlcnlfc3ViZGV2aWNlX2J5X3R5cGUsCisJCQkgICAgKGRldmljZSwKKwkJCSBrYXJnLnN0YXJ0X3N1YmRldmljZSwKKwkJCSBrYXJnLnR5cGUsIGthcmcuc3VidHlwZSwgJmthcmcuc3ViZGV2aWNlKSkKKworICAgIE1FX1FVRVJZX01VTFRJUExFWF9URU1QTEFURSgibWVfcXVlcnlfc3ViZGV2aWNlX3R5cGUiLAorCQkJICAgIG1lX3F1ZXJ5X3N1YmRldmljZV90eXBlX3QsCisJCQkgICAgbWVfcXVlcnlfc3ViZGV2aWNlX3R5cGUsCisJCQkgICAgbWVfZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV90eXBlLAorCQkJICAgIChkZXZpY2UsIGthcmcuc3ViZGV2aWNlLCAma2FyZy50eXBlLCAma2FyZy5zdWJ0eXBlKSkKKworICAgIE1FX1FVRVJZX01VTFRJUExFWF9URU1QTEFURSgibWVfcXVlcnlfc3ViZGV2aWNlX2NhcHMiLAorCQkJICAgIG1lX3F1ZXJ5X3N1YmRldmljZV9jYXBzX3QsCisJCQkgICAgbWVfcXVlcnlfc3ViZGV2aWNlX2NhcHMsCisJCQkgICAgbWVfZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV9jYXBzLAorCQkJICAgIChkZXZpY2UsIGthcmcuc3ViZGV2aWNlLCAma2FyZy5jYXBzKSkKKworICAgIE1FX1FVRVJZX01VTFRJUExFWF9URU1QTEFURSgibWVfcXVlcnlfc3ViZGV2aWNlX2NhcHNfYXJncyIsCisJCQkgICAgbWVfcXVlcnlfc3ViZGV2aWNlX2NhcHNfYXJnc190LAorCQkJICAgIG1lX3F1ZXJ5X3N1YmRldmljZV9jYXBzX2FyZ3MsCisJCQkgICAgbWVfZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV9jYXBzX2FyZ3MsCisJCQkgICAgKGRldmljZSwga2FyZy5zdWJkZXZpY2UsIGthcmcuY2FwLCBrYXJnLmFyZ3MsCisJCQkga2FyZy5jb3VudCkpCisKKyAgICBNRV9RVUVSWV9NVUxUSVBMRVhfVEVNUExBVEUoIm1lX3F1ZXJ5X251bWJlcl9yYW5nZXMiLAorCQkJICAgIG1lX3F1ZXJ5X251bWJlcl9yYW5nZXNfdCwKKwkJCSAgICBtZV9xdWVyeV9udW1iZXJfcmFuZ2VzLAorCQkJICAgIG1lX2RldmljZV9xdWVyeV9udW1iZXJfcmFuZ2VzLAorCQkJICAgIChkZXZpY2UsIGthcmcuc3ViZGV2aWNlLCBrYXJnLnVuaXQsICZrYXJnLm51bWJlcikpCisKKyAgICBNRV9RVUVSWV9NVUxUSVBMRVhfVEVNUExBVEUoIm1lX3F1ZXJ5X3JhbmdlX2J5X21pbl9tYXgiLAorCQkJICAgIG1lX3F1ZXJ5X3JhbmdlX2J5X21pbl9tYXhfdCwKKwkJCSAgICBtZV9xdWVyeV9yYW5nZV9ieV9taW5fbWF4LAorCQkJICAgIG1lX2RldmljZV9xdWVyeV9yYW5nZV9ieV9taW5fbWF4LAorCQkJICAgIChkZXZpY2UsCisJCQkga2FyZy5zdWJkZXZpY2UsCisJCQkga2FyZy51bml0LAorCQkJICZrYXJnLm1pbiwgJmthcmcubWF4LCAma2FyZy5tYXhfZGF0YSwgJmthcmcucmFuZ2UpKQorCisgICAgTUVfUVVFUllfTVVMVElQTEVYX1RFTVBMQVRFKCJtZV9xdWVyeV9yYW5nZV9pbmZvIiwKKwkJCSAgICBtZV9xdWVyeV9yYW5nZV9pbmZvX3QsCisJCQkgICAgbWVfcXVlcnlfcmFuZ2VfaW5mbywKKwkJCSAgICBtZV9kZXZpY2VfcXVlcnlfcmFuZ2VfaW5mbywKKwkJCSAgICAoZGV2aWNlLAorCQkJIGthcmcuc3ViZGV2aWNlLAorCQkJIGthcmcucmFuZ2UsCisJCQkgJmthcmcudW5pdCwgJmthcmcubWluLCAma2FyZy5tYXgsICZrYXJnLm1heF9kYXRhKSkKKworICAgIE1FX1FVRVJZX01VTFRJUExFWF9URU1QTEFURSgibWVfcXVlcnlfdGltZXIiLAorCQkJICAgIG1lX3F1ZXJ5X3RpbWVyX3QsCisJCQkgICAgbWVfcXVlcnlfdGltZXIsCisJCQkgICAgbWVfZGV2aWNlX3F1ZXJ5X3RpbWVyLAorCQkJICAgIChkZXZpY2UsCisJCQkga2FyZy5zdWJkZXZpY2UsCisJCQkga2FyZy50aW1lciwKKwkJCSAma2FyZy5iYXNlX2ZyZXF1ZW5jeSwKKwkJCSAma2FyZy5taW5fdGlja3MsICZrYXJnLm1heF90aWNrcykpCisKKyAgICBNRV9RVUVSWV9NVUxUSVBMRVhfVEVNUExBVEUoIm1lX3F1ZXJ5X3ZlcnNpb25fZGV2aWNlX2RyaXZlciIsCisJCQkgICAgbWVfcXVlcnlfdmVyc2lvbl9kZXZpY2VfZHJpdmVyX3QsCisJCQkgICAgbWVfcXVlcnlfdmVyc2lvbl9kZXZpY2VfZHJpdmVyLAorCQkJICAgIG1lX2RldmljZV9xdWVyeV92ZXJzaW9uX2RldmljZV9kcml2ZXIsCisJCQkgICAgKGRldmljZSwgJmthcmcudmVyc2lvbikpCisjZWxzZQorI2Vycm9yIG1hY3JvIE1FX1FVRVJZX01VTFRJUExFWF9URU1QTEFURSBub3QgZGVmaW5lZAorI2VuZGlmCisKKy8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKi8KKworc3RhdGljIG1lX2RldmljZV90ICpnZXRfZHVtbXlfaW5zdGFuY2UodW5zaWduZWQgc2hvcnQgdmVuZG9yX2lkLAorCQkJCSAgICAgICB1bnNpZ25lZCBzaG9ydCBkZXZpY2VfaWQsCisJCQkJICAgICAgIHVuc2lnbmVkIGludCBzZXJpYWxfbm8sCisJCQkJICAgICAgIGludCBidXNfdHlwZSwKKwkJCQkgICAgICAgaW50IGJ1c19ubywgaW50IGRldl9ubywgaW50IGZ1bmNfbm8pCit7CisJaW50IGVycjsKKwltZV9kdW1teV9jb25zdHJ1Y3Rvcl90IGNvbnN0cnVjdG9yID0gTlVMTDsKKwltZV9kZXZpY2VfdCAqaW5zdGFuY2U7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpZiAoKGNvbnN0cnVjdG9yID0gc3ltYm9sX2dldChtZWR1bW15X2NvbnN0cnVjdG9yKSkgPT0gTlVMTCkgeworCQllcnIgPSByZXF1ZXN0X21vZHVsZShNRURVTU1ZX05BTUUpOworCisJCWlmIChlcnIpIHsKKwkJCVBFUlJPUigiRXJyb3Igd2hpbGUgcmVxdWVzdCBmb3IgbW9kdWxlICVzLlxuIiwKKwkJCSAgICAgICBNRURVTU1ZX05BTUUpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKworCQlpZiAoKGNvbnN0cnVjdG9yID0gc3ltYm9sX2dldChtZWR1bW15X2NvbnN0cnVjdG9yKSkgPT0gTlVMTCkgeworCQkJUEVSUk9SKCJDYW4ndCBnZXQgJXMgZHJpdmVyIG1vZHVsZSBjb25zdHJ1Y3Rvci5cbiIsCisJCQkgICAgICAgTUVEVU1NWV9OQU1FKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJfQorCisJaWYgKChpbnN0YW5jZSA9ICgqY29uc3RydWN0b3IpICh2ZW5kb3JfaWQsCisJCQkJCWRldmljZV9pZCwKKwkJCQkJc2VyaWFsX25vLAorCQkJCQlidXNfdHlwZSwKKwkJCQkJYnVzX25vLCBkZXZfbm8sIGZ1bmNfbm8pKSA9PSBOVUxMKQorCQlzeW1ib2xfcHV0KG1lZHVtbXlfY29uc3RydWN0b3IpOworCisJcmV0dXJuIGluc3RhbmNlOworfQorCitzdGF0aWMgaW50IG1lX3Byb2JlX3BjaShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCit7CisJaW50IGVycjsKKwltZV9wY2lfY29uc3RydWN0b3JfdCBjb25zdHJ1Y3RvciA9IE5VTEw7CisjaWZkZWYgQk9TQ0gKKwltZV9ib3NjaF9jb25zdHJ1Y3Rvcl90IGNvbnN0cnVjdG9yX2Jvc2NoID0gTlVMTDsKKyNlbmRpZgorCW1lX2RldmljZV90ICpuX2RldmljZSA9IE5VTEw7CisJdWludDMyX3QgZGV2aWNlOworCisJY2hhciBjb25zdHJ1Y3Rvcl9uYW1lWzI0XSA9ICJtZTAwMDBfcGNpX2NvbnN0cnVjdG9yIjsKKwljaGFyIG1vZHVsZV9uYW1lWzddID0gIm1lMDAwMCI7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJZGV2aWNlID0gZGV2LT5kZXZpY2U7CisJaWYgKChkZXZpY2UgJiAweEYwMDApID09IDB4NjAwMCkgewkvLyBFeGNlcHRpb25zOiBtZTYxeHgsIG1lNjJ4eCwgbWU2M3h4IGFyZSBoYW5kbGVkIGJ5IG9uZSBkcml2ZXIuCisJCWRldmljZSAmPSAweEYwRkY7CisJfQorCisJY29uc3RydWN0b3JfbmFtZVsyXSArPSAoY2hhcikoKGRldmljZSA+PiAxMikgJiAweDAwMEYpOworCWNvbnN0cnVjdG9yX25hbWVbM10gKz0gKGNoYXIpKChkZXZpY2UgPj4gOCkgJiAweDAwMEYpOworCVBERUJVRygiY29uc3RydWN0b3JfbmFtZTogJXNcbiIsIGNvbnN0cnVjdG9yX25hbWUpOworCW1vZHVsZV9uYW1lWzJdICs9IChjaGFyKSgoZGV2aWNlID4+IDEyKSAmIDB4MDAwRik7CisJbW9kdWxlX25hbWVbM10gKz0gKGNoYXIpKChkZXZpY2UgPj4gOCkgJiAweDAwMEYpOworCVBERUJVRygibW9kdWxlX25hbWU6ICVzXG4iLCBtb2R1bGVfbmFtZSk7CisKKwlpZiAoKGNvbnN0cnVjdG9yID0KKwkgICAgIChtZV9wY2lfY29uc3RydWN0b3JfdCkgc3ltYm9sX2dldChjb25zdHJ1Y3Rvcl9uYW1lKSkgPT0gTlVMTCkgeworCQlpZiAocmVxdWVzdF9tb2R1bGUobW9kdWxlX25hbWUpKSB7CisJCQlQRVJST1IoIkVycm9yIHdoaWxlIHJlcXVlc3QgZm9yIG1vZHVsZSAlcy5cbiIsCisJCQkgICAgICAgbW9kdWxlX25hbWUpOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKworCQlpZiAoKGNvbnN0cnVjdG9yID0KKwkJICAgICAobWVfcGNpX2NvbnN0cnVjdG9yX3QpIHN5bWJvbF9nZXQoY29uc3RydWN0b3JfbmFtZSkpID09CisJCSAgICBOVUxMKSB7CisJCQlQRVJST1IoIkNhbid0IGdldCAlcyBkcml2ZXIgbW9kdWxlIGNvbnN0cnVjdG9yLlxuIiwKKwkJCSAgICAgICBtb2R1bGVfbmFtZSk7CisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJfQorCX0KKyNpZmRlZiBCT1NDSAorCWlmICgoZGV2aWNlICYgMHhGMDAwKSA9PSAweDQwMDApIHsJLy8gQm9zY2ggYnVpbGQgaGFzIGRpZmZlcm50IGNvbnN0cnVjdG9yIGZvciBtZTQ2MDAuCisJCWlmICgobl9kZXZpY2UgPQorCQkgICAgICgqY29uc3RydWN0b3JfYm9zY2gpIChkZXYsIG1lX2Jvc2NoX2Z3KSkgPT0gTlVMTCkgeworCQkJc3ltYm9sX3B1dChjb25zdHJ1Y3Rvcl9uYW1lKTsKKwkJCVBFUlJPUgorCQkJICAgICgiQ2FuJ3QgZ2V0IGRldmljZSBpbnN0YW5jZSBvZiAlcyBkcml2ZXIgbW9kdWxlLlxuIiwKKwkJCSAgICAgbW9kdWxlX25hbWUpOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKwl9IGVsc2UgeworI2VuZGlmCisJCWlmICgobl9kZXZpY2UgPSAoKmNvbnN0cnVjdG9yKSAoZGV2KSkgPT0gTlVMTCkgeworCQkJc3ltYm9sX3B1dChjb25zdHJ1Y3Rvcl9uYW1lKTsKKwkJCVBFUlJPUgorCQkJICAgICgiQ2FuJ3QgZ2V0IGRldmljZSBpbnN0YW5jZSBvZiAlcyBkcml2ZXIgbW9kdWxlLlxuIiwKKwkJCSAgICAgbW9kdWxlX25hbWUpOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKyNpZmRlZiBCT1NDSAorCX0KKyNlbmRpZgorCisJaW5zZXJ0X3RvX2RldmljZV9saXN0KG5fZGV2aWNlKTsKKwllcnIgPQorCSAgICBuX2RldmljZS0+bWVfZGV2aWNlX2lvX3Jlc2V0X2RldmljZShuX2RldmljZSwgTlVMTCwKKwkJCQkJCU1FX0lPX1JFU0VUX0RFVklDRV9OT19GTEFHUyk7CisJaWYgKGVycikgeworCQlQRVJST1IoIkVycm9yIHdoaWxlIHJlc2V0aW5nIGRldmljZS5cbiIpOworCX0gZWxzZSB7CisJCVBERUJVRygiUmVzZXRpbmcgZGV2aWNlIHdhcyBzdWNlc3NmdWwuXG4iKTsKKwl9CisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyB2b2lkIHJlbGVhc2VfaW5zdGFuY2UobWVfZGV2aWNlX3QgKiBkZXZpY2UpCit7CisJaW50IHZlbmRvcl9pZDsKKwlpbnQgZGV2aWNlX2lkOworCWludCBzZXJpYWxfbm87CisJaW50IGJ1c190eXBlOworCWludCBidXNfbm87CisJaW50IGRldl9ubzsKKwlpbnQgZnVuY19ubzsKKwlpbnQgcGx1Z2dlZDsKKworCXVpbnQzMl90IGRldl9pZDsKKworCWNoYXIgY29uc3RydWN0b3JfbmFtZVsyNF0gPSAibWUwMDAwX3BjaV9jb25zdHJ1Y3RvciI7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlkZXZpY2UtPm1lX2RldmljZV9xdWVyeV9pbmZvX2RldmljZShkZXZpY2UsCisJCQkJCSAgICAmdmVuZG9yX2lkLAorCQkJCQkgICAgJmRldmljZV9pZCwKKwkJCQkJICAgICZzZXJpYWxfbm8sCisJCQkJCSAgICAmYnVzX3R5cGUsCisJCQkJCSAgICAmYnVzX25vLAorCQkJCQkgICAgJmRldl9ubywgJmZ1bmNfbm8sICZwbHVnZ2VkKTsKKworCWRldl9pZCA9IGRldmljZV9pZDsKKwlkZXZpY2UtPm1lX2RldmljZV9kZXN0cnVjdG9yKGRldmljZSk7CisKKwlpZiAocGx1Z2dlZCAhPSBNRV9QTFVHR0VEX0lOKSB7CisJCVBERUJVRygicmVsZWFzZTogbWVkdW1teV9jb25zdHJ1Y3RvclxuIik7CisKKwkJc3ltYm9sX3B1dCgibWVkdW1teV9jb25zdHJ1Y3RvciIpOworCX0gZWxzZSB7CisJCWlmICgoZGV2X2lkICYgMHhGMDAwKSA9PSAweDYwMDApIHsJLy8gRXhjZXB0aW9uczogbWU2MXh4LCBtZTYyeHgsIG1lNjN4eCBhcmUgaGFuZGxlZCBieSBvbmUgZHJpdmVyLgorCQkJZGV2X2lkICY9IDB4RjBGRjsKKwkJfQorCisJCWNvbnN0cnVjdG9yX25hbWVbMl0gKz0gKGNoYXIpKChkZXZfaWQgPj4gMTIpICYgMHgwMDBGKTsKKwkJY29uc3RydWN0b3JfbmFtZVszXSArPSAoY2hhcikoKGRldl9pZCA+PiA4KSAmIDB4MDAwRik7CisJCVBERUJVRygicmVsZWFzZTogJXNcbiIsIGNvbnN0cnVjdG9yX25hbWUpOworCisJCXN5bWJvbF9wdXQoY29uc3RydWN0b3JfbmFtZSk7CisJfQorfQorCitzdGF0aWMgaW50IGluc2VydF90b19kZXZpY2VfbGlzdChtZV9kZXZpY2VfdCAqIG5fZGV2aWNlKQoreworCW1lX2RldmljZV90ICpvX2RldmljZSA9IE5VTEw7CisKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwb3M7CisJaW50IG5fdmVuZG9yX2lkOworCWludCBuX2RldmljZV9pZDsKKwlpbnQgbl9zZXJpYWxfbm87CisJaW50IG5fYnVzX3R5cGU7CisJaW50IG5fYnVzX25vOworCWludCBuX2Rldl9ubzsKKwlpbnQgbl9mdW5jX25vOworCWludCBuX3BsdWdnZWQ7CisJaW50IG9fdmVuZG9yX2lkOworCWludCBvX2RldmljZV9pZDsKKwlpbnQgb19zZXJpYWxfbm87CisJaW50IG9fYnVzX3R5cGU7CisJaW50IG9fYnVzX25vOworCWludCBvX2Rldl9ubzsKKwlpbnQgb19mdW5jX25vOworCWludCBvX3BsdWdnZWQ7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwluX2RldmljZS0+bWVfZGV2aWNlX3F1ZXJ5X2luZm9fZGV2aWNlKG5fZGV2aWNlLAorCQkJCQkgICAgICAmbl92ZW5kb3JfaWQsCisJCQkJCSAgICAgICZuX2RldmljZV9pZCwKKwkJCQkJICAgICAgJm5fc2VyaWFsX25vLAorCQkJCQkgICAgICAmbl9idXNfdHlwZSwKKwkJCQkJICAgICAgJm5fYnVzX25vLAorCQkJCQkgICAgICAmbl9kZXZfbm8sCisJCQkJCSAgICAgICZuX2Z1bmNfbm8sICZuX3BsdWdnZWQpOworCisJZG93bl93cml0ZSgmbWVfcndzZW0pOworCisJbGlzdF9mb3JfZWFjaChwb3MsICZtZV9kZXZpY2VfbGlzdCkgeworCQlvX2RldmljZSA9IGxpc3RfZW50cnkocG9zLCBtZV9kZXZpY2VfdCwgbGlzdCk7CisJCW9fZGV2aWNlLT5tZV9kZXZpY2VfcXVlcnlfaW5mb19kZXZpY2Uob19kZXZpY2UsCisJCQkJCQkgICAgICAmb192ZW5kb3JfaWQsCisJCQkJCQkgICAgICAmb19kZXZpY2VfaWQsCisJCQkJCQkgICAgICAmb19zZXJpYWxfbm8sCisJCQkJCQkgICAgICAmb19idXNfdHlwZSwKKwkJCQkJCSAgICAgICZvX2J1c19ubywKKwkJCQkJCSAgICAgICZvX2Rldl9ubywKKwkJCQkJCSAgICAgICZvX2Z1bmNfbm8sICZvX3BsdWdnZWQpOworCisJCWlmIChvX3BsdWdnZWQgPT0gTUVfUExVR0dFRF9PVVQpIHsKKwkJCWlmICgoKG9fdmVuZG9yX2lkID09IG5fdmVuZG9yX2lkKSAmJgorCQkJICAgICAob19kZXZpY2VfaWQgPT0gbl9kZXZpY2VfaWQpICYmCisJCQkgICAgIChvX3NlcmlhbF9ubyA9PSBuX3NlcmlhbF9ubykgJiYKKwkJCSAgICAgKG9fYnVzX3R5cGUgPT0gbl9idXNfdHlwZSkpIHx8CisJCQkgICAgKChvX3ZlbmRvcl9pZCA9PSBuX3ZlbmRvcl9pZCkgJiYKKwkJCSAgICAgKG9fZGV2aWNlX2lkID09IG5fZGV2aWNlX2lkKSAmJgorCQkJICAgICAob19idXNfdHlwZSA9PSBuX2J1c190eXBlKSAmJgorCQkJICAgICAob19idXNfbm8gPT0gbl9idXNfbm8pICYmCisJCQkgICAgIChvX2Rldl9ubyA9PSBuX2Rldl9ubykgJiYKKwkJCSAgICAgKG9fZnVuY19ubyA9PSBuX2Z1bmNfbm8pKSkgeworCQkJCW5fZGV2aWNlLT5saXN0LnByZXYgPSBwb3MtPnByZXY7CisJCQkJbl9kZXZpY2UtPmxpc3QubmV4dCA9IHBvcy0+bmV4dDsKKwkJCQlwb3MtPnByZXYtPm5leHQgPSAmbl9kZXZpY2UtPmxpc3Q7CisJCQkJcG9zLT5uZXh0LT5wcmV2ID0gJm5fZGV2aWNlLT5saXN0OworCQkJCXJlbGVhc2VfaW5zdGFuY2Uob19kZXZpY2UpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJaWYgKHBvcyA9PSAmbWVfZGV2aWNlX2xpc3QpIHsKKwkJbGlzdF9hZGRfdGFpbCgmbl9kZXZpY2UtPmxpc3QsICZtZV9kZXZpY2VfbGlzdCk7CisJfQorCisJdXBfd3JpdGUoJm1lX3J3c2VtKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBtZV9yZW1vdmVfcGNpKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJaW50IHZlbmRvcl9pZCA9IGRldi0+dmVuZG9yOworCWludCBkZXZpY2VfaWQgPSBkZXYtPmRldmljZTsKKwlpbnQgc3Vic3lzdGVtX3ZlbmRvciA9IGRldi0+c3Vic3lzdGVtX3ZlbmRvcjsKKwlpbnQgc3Vic3lzdGVtX2RldmljZSA9IGRldi0+c3Vic3lzdGVtX2RldmljZTsKKwlpbnQgc2VyaWFsX25vID0gKHN1YnN5c3RlbV9kZXZpY2UgPDwgMTYpIHwgc3Vic3lzdGVtX3ZlbmRvcjsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCVBJTkZPKCJWZW5kb3IgaWQgPSAweCUwOFhcbiIsIHZlbmRvcl9pZCk7CisJUElORk8oIkRldmljZSBpZCA9IDB4JTA4WFxuIiwgZGV2aWNlX2lkKTsKKwlQSU5GTygiU2VyaWFsIE51bWJlciA9IDB4JTA4WFxuIiwgc2VyaWFsX25vKTsKKworCXJlcGxhY2Vfd2l0aF9kdW1teSh2ZW5kb3JfaWQsIGRldmljZV9pZCwgc2VyaWFsX25vKTsKK30KKworc3RhdGljIGludCByZXBsYWNlX3dpdGhfZHVtbXkoaW50IHZlbmRvcl9pZCwgaW50IGRldmljZV9pZCwgaW50IHNlcmlhbF9ubykKK3sKKworCXN0cnVjdCBsaXN0X2hlYWQgKnBvczsKKwltZV9kZXZpY2VfdCAqbl9kZXZpY2UgPSBOVUxMOworCW1lX2RldmljZV90ICpvX2RldmljZSA9IE5VTEw7CisJaW50IG9fdmVuZG9yX2lkOworCWludCBvX2RldmljZV9pZDsKKwlpbnQgb19zZXJpYWxfbm87CisJaW50IG9fYnVzX3R5cGU7CisJaW50IG9fYnVzX25vOworCWludCBvX2Rldl9ubzsKKwlpbnQgb19mdW5jX25vOworCWludCBvX3BsdWdnZWQ7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlkb3duX3dyaXRlKCZtZV9yd3NlbSk7CisKKwlsaXN0X2Zvcl9lYWNoKHBvcywgJm1lX2RldmljZV9saXN0KSB7CisJCW9fZGV2aWNlID0gbGlzdF9lbnRyeShwb3MsIG1lX2RldmljZV90LCBsaXN0KTsKKwkJb19kZXZpY2UtPm1lX2RldmljZV9xdWVyeV9pbmZvX2RldmljZShvX2RldmljZSwKKwkJCQkJCSAgICAgICZvX3ZlbmRvcl9pZCwKKwkJCQkJCSAgICAgICZvX2RldmljZV9pZCwKKwkJCQkJCSAgICAgICZvX3NlcmlhbF9ubywKKwkJCQkJCSAgICAgICZvX2J1c190eXBlLAorCQkJCQkJICAgICAgJm9fYnVzX25vLAorCQkJCQkJICAgICAgJm9fZGV2X25vLAorCQkJCQkJICAgICAgJm9fZnVuY19ubywgJm9fcGx1Z2dlZCk7CisKKwkJaWYgKG9fcGx1Z2dlZCA9PSBNRV9QTFVHR0VEX0lOKSB7CisJCQlpZiAoKChvX3ZlbmRvcl9pZCA9PSB2ZW5kb3JfaWQpICYmCisJCQkgICAgIChvX2RldmljZV9pZCA9PSBkZXZpY2VfaWQpICYmCisJCQkgICAgIChvX3NlcmlhbF9ubyA9PSBzZXJpYWxfbm8pKSkgeworCQkJCW5fZGV2aWNlID0gZ2V0X2R1bW15X2luc3RhbmNlKG9fdmVuZG9yX2lkLAorCQkJCQkJCSAgICAgIG9fZGV2aWNlX2lkLAorCQkJCQkJCSAgICAgIG9fc2VyaWFsX25vLAorCQkJCQkJCSAgICAgIG9fYnVzX3R5cGUsCisJCQkJCQkJICAgICAgb19idXNfbm8sCisJCQkJCQkJICAgICAgb19kZXZfbm8sCisJCQkJCQkJICAgICAgb19mdW5jX25vKTsKKworCQkJCWlmICghbl9kZXZpY2UpIHsKKwkJCQkJdXBfd3JpdGUoJm1lX3J3c2VtKTsKKwkJCQkJUEVSUk9SKCJDYW5ub3QgZ2V0IGR1bW15IGluc3RhbmNlLlxuIik7CisJCQkJCXJldHVybiAxOworCQkJCX0KKworCQkJCW5fZGV2aWNlLT5saXN0LnByZXYgPSBwb3MtPnByZXY7CisKKwkJCQluX2RldmljZS0+bGlzdC5uZXh0ID0gcG9zLT5uZXh0OworCQkJCXBvcy0+cHJldi0+bmV4dCA9ICZuX2RldmljZS0+bGlzdDsKKwkJCQlwb3MtPm5leHQtPnByZXYgPSAmbl9kZXZpY2UtPmxpc3Q7CisJCQkJcmVsZWFzZV9pbnN0YW5jZShvX2RldmljZSk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwl1cF93cml0ZSgmbWVfcndzZW0pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGNsZWFyX2RldmljZV9saXN0KHZvaWQpCit7CisKKwlzdHJ1Y3QgbGlzdF9oZWFkICplbnRyeTsKKwltZV9kZXZpY2VfdCAqZGV2aWNlOworCisJLy8gQ2xlYXIgdGhlIGRldmljZSBpbmZvIGxpc3QgLgorCWRvd25fd3JpdGUoJm1lX3J3c2VtKTsKKworCXdoaWxlICghbGlzdF9lbXB0eSgmbWVfZGV2aWNlX2xpc3QpKSB7CisJCWVudHJ5ID0gbWVfZGV2aWNlX2xpc3QubmV4dDsKKwkJZGV2aWNlID0gbGlzdF9lbnRyeShlbnRyeSwgbWVfZGV2aWNlX3QsIGxpc3QpOworCQlsaXN0X2RlbChlbnRyeSk7CisJCXJlbGVhc2VfaW5zdGFuY2UoZGV2aWNlKTsKKwl9CisKKwl1cF93cml0ZSgmbWVfcndzZW0pOworfQorCitzdGF0aWMgaW50IGxvY2tfZHJpdmVyKHN0cnVjdCBmaWxlICpmaWxlcCwgaW50IGxvY2ssIGludCBmbGFncykKK3sKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwltZV9kZXZpY2VfdCAqZGV2aWNlOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJZG93bl9yZWFkKCZtZV9yd3NlbSk7CisKKwlzcGluX2xvY2soJm1lX2xvY2spOworCisJc3dpdGNoIChsb2NrKSB7CisKKwljYXNlIE1FX0xPQ0tfU0VUOgorCQlpZiAobWVfY291bnQpIHsKKwkJCVBFUlJPUgorCQkJICAgICgiRHJpdmVyIFN5c3RlbSBpcyBjdXJyZW50bHkgdXNlZCBieSBhbm90aGVyIHByb2Nlc3MuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX1VTRUQ7CisJCX0gZWxzZSBpZiAoKG1lX2ZpbGVwICE9IE5VTEwpICYmIChtZV9maWxlcCAhPSBmaWxlcCkpIHsKKwkJCVBFUlJPUgorCQkJICAgICgiRHJpdmVyIFN5c3RlbSBpcyBhbHJlYWR5IGxvZ2dlZCBieSBhbm90aGVyIHByb2Nlc3MuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0xPQ0tFRDsKKwkJfSBlbHNlIHsKKwkJCWxpc3RfZm9yX2VhY2hfZW50cnkoZGV2aWNlLCAmbWVfZGV2aWNlX2xpc3QsIGxpc3QpIHsKKwkJCQllcnIgPQorCQkJCSAgICBkZXZpY2UtPm1lX2RldmljZV9sb2NrX2RldmljZShkZXZpY2UsIGZpbGVwLAorCQkJCQkJCQkgIE1FX0xPQ0tfQ0hFQ0ssCisJCQkJCQkJCSAgZmxhZ3MpOworCisJCQkJaWYgKGVycikKKwkJCQkJYnJlYWs7CisJCQl9CisKKwkJCWlmICghZXJyKQorCQkJCW1lX2ZpbGVwID0gZmlsZXA7CisJCX0KKworCQlicmVhazsKKworCWNhc2UgTUVfTE9DS19SRUxFQVNFOgorCQlpZiAoKG1lX2ZpbGVwICE9IE5VTEwpICYmIChtZV9maWxlcCAhPSBmaWxlcCkpIHsKKwkJCWVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJCX0gZWxzZSB7CisJCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRldmljZSwgJm1lX2RldmljZV9saXN0LCBsaXN0KSB7CisJCQkJZGV2aWNlLT5tZV9kZXZpY2VfbG9ja19kZXZpY2UoZGV2aWNlLCBmaWxlcCwKKwkJCQkJCQkgICAgICBNRV9MT0NLX1JFTEVBU0UsCisJCQkJCQkJICAgICAgZmxhZ3MpOworCQkJfQorCisJCQltZV9maWxlcCA9IE5VTEw7CisJCX0KKworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCVBFUlJPUigiSW52YWxpZCBsb2NrIHNwZWNpZmllZC5cbiIpOworCisJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfTE9DSzsKKworCQlicmVhazsKKwl9CisKKwlzcGluX3VubG9jaygmbWVfbG9jayk7CisKKwl1cF9yZWFkKCZtZV9yd3NlbSk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lX2xvY2tfZHJpdmVyKHN0cnVjdCBmaWxlICpmaWxlcCwgbWVfbG9ja19kcml2ZXJfdCAqIGFyZykKK3sKKwlpbnQgZXJyID0gMDsKKworCW1lX2xvY2tfZHJpdmVyX3QgbG9jazsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWVyciA9IGNvcHlfZnJvbV91c2VyKCZsb2NrLCBhcmcsIHNpemVvZihtZV9sb2NrX2RyaXZlcl90KSk7CisKKwlpZiAoZXJyKSB7CisJCVBFUlJPUigiQ2FuJ3QgY29weSBhcmd1bWVudHMgdG8ga2VybmVsIHNwYWNlLlxuIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCWxvY2suZXJybm8gPSBsb2NrX2RyaXZlcihmaWxlcCwgbG9jay5sb2NrLCBsb2NrLmZsYWdzKTsKKworCWVyciA9IGNvcHlfdG9fdXNlcihhcmcsICZsb2NrLCBzaXplb2YobWVfbG9ja19kcml2ZXJfdCkpOworCisJaWYgKGVycikgeworCQlQRVJST1IoIkNhbid0IGNvcHkgcXVlcnkgYmFjayB0byB1c2VyIHNwYWNlLlxuIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lX29wZW4oc3RydWN0IGlub2RlICppbm9kZV9wdHIsIHN0cnVjdCBmaWxlICpmaWxlcCkKK3sKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwkvLyBOb3RoaW5nIHRvIGRvIGhlcmUuCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWVfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlX3B0ciwgc3RydWN0IGZpbGUgKmZpbGVwKQoreworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCWxvY2tfZHJpdmVyKGZpbGVwLCBNRV9MT0NLX1JFTEVBU0UsIE1FX0xPQ0tfRFJJVkVSX05PX0ZMQUdTKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1lX3F1ZXJ5X3ZlcnNpb25fbWFpbl9kcml2ZXIoc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCQltZV9xdWVyeV92ZXJzaW9uX21haW5fZHJpdmVyX3QgKiBhcmcpCit7CisJaW50IGVycjsKKwltZV9xdWVyeV92ZXJzaW9uX21haW5fZHJpdmVyX3Qga2FyZzsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWthcmcudmVyc2lvbiA9IE1FX1ZFUlNJT05fRFJJVkVSOworCWthcmcuZXJybm8gPSBNRV9FUlJOT19TVUNDRVNTOworCisJZXJyID0gY29weV90b191c2VyKGFyZywgJmthcmcsIHNpemVvZihtZV9xdWVyeV92ZXJzaW9uX21haW5fZHJpdmVyX3QpKTsKKworCWlmIChlcnIpIHsKKwkJUEVSUk9SKCJDYW4ndCBjb3B5IHF1ZXJ5IGJhY2sgdG8gdXNlciBzcGFjZS5cbiIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtZV9jb25maWdfbG9hZF9kZXZpY2Uoc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSBtZV9jZmdfZGV2aWNlX2VudHJ5X3QgKiBrYXJnLCBpbnQgZGV2aWNlX25vKQoreworCisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJaW50IGsgPSAwOworCisJc3RydWN0IGxpc3RfaGVhZCAqcG9zID0gTlVMTDsKKwltZV9kZXZpY2VfdCAqZGV2aWNlID0gTlVMTDsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWxpc3RfZm9yX2VhY2gocG9zLCAmbWVfZGV2aWNlX2xpc3QpIHsKKwkJaWYgKGsgPT0gZGV2aWNlX25vKSB7CisJCQlkZXZpY2UgPSBsaXN0X2VudHJ5KHBvcywgbWVfZGV2aWNlX3QsIGxpc3QpOworCQkJYnJlYWs7CisJCX0KKworCQlrKys7CisJfQorCisJaWYgKHBvcyA9PSAmbWVfZGV2aWNlX2xpc3QpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGRldmljZSBudW1iZXIgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0RFVklDRTsKKwl9IGVsc2UgeworCQlzcGluX2xvY2soJm1lX2xvY2spOworCisJCWlmICgobWVfZmlsZXAgIT0gTlVMTCkgJiYgKG1lX2ZpbGVwICE9IGZpbGVwKSkgeworCQkJc3Bpbl91bmxvY2soJm1lX2xvY2spOworCQkJUEVSUk9SKCJSZXNvdXJjZSBpcyBsb2NrZWQgYnkgYW5vdGhlciBwcm9jZXNzLlxuIik7CisJCQlyZXR1cm4gTUVfRVJSTk9fTE9DS0VEOworCQl9IGVsc2UgeworCQkJbWVfY291bnQrKzsKKwkJCXNwaW5fdW5sb2NrKCZtZV9sb2NrKTsKKworCQkJZXJyID0KKwkJCSAgICBkZXZpY2UtPm1lX2RldmljZV9jb25maWdfbG9hZChkZXZpY2UsIGZpbGVwLCBrYXJnKTsKKworCQkJc3Bpbl9sb2NrKCZtZV9sb2NrKTsKKwkJCW1lX2NvdW50LS07CisJCQlzcGluX3VubG9jaygmbWVfbG9jayk7CisJCX0KKwl9CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lX2NvbmZpZ19sb2FkKHN0cnVjdCBmaWxlICpmaWxlcCwgbWVfY29uZmlnX2xvYWRfdCAqIGFyZykKK3sKKwlpbnQgZXJyOworCWludCBpOworCW1lX2NvbmZpZ19sb2FkX3QgY2ZnX3NldHVwOworCW1lX2NvbmZpZ19sb2FkX3Qga2FyZ19jZmdfc2V0dXA7CisKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwb3MgPSBOVUxMOworCisJc3RydWN0IGxpc3RfaGVhZCBuZXdfbGlzdDsKKwltZV9kZXZpY2VfdCAqb19kZXZpY2U7CisJbWVfZGV2aWNlX3QgKm5fZGV2aWNlOworCWludCBvX3ZlbmRvcl9pZDsKKwlpbnQgb19kZXZpY2VfaWQ7CisJaW50IG9fc2VyaWFsX25vOworCWludCBvX2J1c190eXBlOworCWludCBvX2J1c19ubzsKKwlpbnQgb19kZXZfbm87CisJaW50IG9fZnVuY19ubzsKKwlpbnQgb19wbHVnZ2VkOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJLy8gQ29weSBhcmd1bWVudCB0byBrZXJuZWwgc3BhY2UuCisJZXJyID0gY29weV9mcm9tX3VzZXIoJmthcmdfY2ZnX3NldHVwLCBhcmcsIHNpemVvZihtZV9jb25maWdfbG9hZF90KSk7CisKKwlpZiAoZXJyKSB7CisJCVBFUlJPUigiQ2FuJ3QgY29weSBhcmd1bWVudHMgdG8ga2VybmVsIHNwYWNlLlxuIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKwkvLyBBbGxvY2F0ZSBrZXJuZWwgYnVmZmVyIGZvciBkZXZpY2UgbGlzdC4KKwljZmdfc2V0dXAuZGV2aWNlX2xpc3QgPQorCSAgICBrbWFsbG9jKHNpemVvZihtZV9jZmdfZGV2aWNlX2VudHJ5X3QpICoga2FyZ19jZmdfc2V0dXAuY291bnQsCisJCSAgICBHRlBfS0VSTkVMKTsKKworCWlmICghY2ZnX3NldHVwLmRldmljZV9saXN0KSB7CisJCVBFUlJPUigiQ2FuJ3QgZ2V0IGJ1ZmZlciAlbGkgZm9yIGRldmljZSBsaXN0LlxuIiwKKwkJICAgICAgIHNpemVvZihtZV9jZmdfZGV2aWNlX2VudHJ5X3QpICoga2FyZ19jZmdfc2V0dXAuY291bnQpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJLy8gQ29weSBkZXZpY2UgbGlzdCB0byBrZXJuZWwgc3BhY2UuCisJZXJyID0KKwkgICAgY29weV9mcm9tX3VzZXIoY2ZnX3NldHVwLmRldmljZV9saXN0LCBrYXJnX2NmZ19zZXR1cC5kZXZpY2VfbGlzdCwKKwkJCSAgIHNpemVvZihtZV9jZmdfZGV2aWNlX2VudHJ5X3QpICoKKwkJCSAgIGthcmdfY2ZnX3NldHVwLmNvdW50KTsKKworCWlmIChlcnIpIHsKKwkJUEVSUk9SKCJDYW4ndCBjb3B5IGRldmljZSBsaXN0IHRvIGtlcm5lbCBzcGFjZS5cbiIpOworCQlrZnJlZShjZmdfc2V0dXAuZGV2aWNlX2xpc3QpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwljZmdfc2V0dXAuY291bnQgPSBrYXJnX2NmZ19zZXR1cC5jb3VudDsKKworCUlOSVRfTElTVF9IRUFEKCZuZXdfbGlzdCk7CisKKwlkb3duX3dyaXRlKCZtZV9yd3NlbSk7CisKKwlzcGluX2xvY2soJm1lX2xvY2spOworCisJaWYgKChtZV9maWxlcCAhPSBOVUxMKSAmJiAobWVfZmlsZXAgIT0gZmlsZXApKSB7CisJCXNwaW5fdW5sb2NrKCZtZV9sb2NrKTsKKwkJUEVSUk9SKCJEcml2ZXIgU3lzdGVtIGlzIGxvZ2dlZCBieSBhbm90aGVyIHByb2Nlc3MuXG4iKTsKKwkJa2FyZ19jZmdfc2V0dXAuZXJybm8gPSBNRV9FUlJOT19MT0NLRUQ7CisJfSBlbHNlIHsKKwkJbWVfY291bnQrKzsKKwkJc3Bpbl91bmxvY2soJm1lX2xvY2spOworCisJCWZvciAoaSA9IDA7IGkgPCBrYXJnX2NmZ19zZXR1cC5jb3VudDsgaSsrKSB7CisJCQlQREVCVUcoIm1lX2NvbmZpZ19sb2FkKCkgZGV2aWNlPSVkLlxuIiwgaSk7CisJCQlpZiAoY2ZnX3NldHVwLmRldmljZV9saXN0W2ldLnRjcGlwLmFjY2Vzc190eXBlID09CisJCQkgICAgTUVfQUNDRVNTX1RZUEVfTE9DQUwpIHsKKwkJCQlsaXN0X2Zvcl9lYWNoKHBvcywgJm1lX2RldmljZV9saXN0KSB7CisJCQkJCW9fZGV2aWNlID0KKwkJCQkJICAgIGxpc3RfZW50cnkocG9zLCBtZV9kZXZpY2VfdCwgbGlzdCk7CisJCQkJCW9fZGV2aWNlLT4KKwkJCQkJICAgIG1lX2RldmljZV9xdWVyeV9pbmZvX2RldmljZQorCQkJCQkgICAgKG9fZGV2aWNlLCAmb192ZW5kb3JfaWQsCisJCQkJCSAgICAgJm9fZGV2aWNlX2lkLCAmb19zZXJpYWxfbm8sCisJCQkJCSAgICAgJm9fYnVzX3R5cGUsICZvX2J1c19ubywgJm9fZGV2X25vLAorCQkJCQkgICAgICZvX2Z1bmNfbm8sICZvX3BsdWdnZWQpOworCisJCQkJCWlmIChjZmdfc2V0dXAuZGV2aWNlX2xpc3RbaV0uaW5mby4KKwkJCQkJICAgIGh3X2xvY2F0aW9uLmJ1c190eXBlID09CisJCQkJCSAgICBNRV9CVVNfVFlQRV9QQ0kpIHsKKwkJCQkJCWlmICgoKG9fdmVuZG9yX2lkID09CisJCQkJCQkgICAgICBjZmdfc2V0dXAuZGV2aWNlX2xpc3RbaV0uCisJCQkJCQkgICAgICBpbmZvLnZlbmRvcl9pZCkKKwkJCQkJCSAgICAgJiYgKG9fZGV2aWNlX2lkID09CisJCQkJCQkJIGNmZ19zZXR1cC4KKwkJCQkJCQkgZGV2aWNlX2xpc3RbaV0uaW5mby4KKwkJCQkJCQkgZGV2aWNlX2lkKQorCQkJCQkJICAgICAmJiAob19zZXJpYWxfbm8gPT0KKwkJCQkJCQkgY2ZnX3NldHVwLgorCQkJCQkJCSBkZXZpY2VfbGlzdFtpXS5pbmZvLgorCQkJCQkJCSBzZXJpYWxfbm8pCisJCQkJCQkgICAgICYmIChvX2J1c190eXBlID09CisJCQkJCQkJIGNmZ19zZXR1cC4KKwkJCQkJCQkgZGV2aWNlX2xpc3RbaV0uaW5mby4KKwkJCQkJCQkgaHdfbG9jYXRpb24uYnVzX3R5cGUpKQorCQkJCQkJICAgIHx8CisJCQkJCQkgICAgKChvX3ZlbmRvcl9pZCA9PQorCQkJCQkJICAgICAgY2ZnX3NldHVwLmRldmljZV9saXN0W2ldLgorCQkJCQkJICAgICAgaW5mby52ZW5kb3JfaWQpCisJCQkJCQkgICAgICYmIChvX2RldmljZV9pZCA9PQorCQkJCQkJCSBjZmdfc2V0dXAuCisJCQkJCQkJIGRldmljZV9saXN0W2ldLmluZm8uCisJCQkJCQkJIGRldmljZV9pZCkKKwkJCQkJCSAgICAgJiYgKG9fYnVzX3R5cGUgPT0KKwkJCQkJCQkgY2ZnX3NldHVwLgorCQkJCQkJCSBkZXZpY2VfbGlzdFtpXS5pbmZvLgorCQkJCQkJCSBod19sb2NhdGlvbi5idXNfdHlwZSkKKwkJCQkJCSAgICAgJiYgKG9fYnVzX25vID09CisJCQkJCQkJIGNmZ19zZXR1cC4KKwkJCQkJCQkgZGV2aWNlX2xpc3RbaV0uaW5mby4KKwkJCQkJCQkgaHdfbG9jYXRpb24ucGNpLmJ1c19ubykKKwkJCQkJCSAgICAgJiYgKG9fZGV2X25vID09CisJCQkJCQkJIGNmZ19zZXR1cC4KKwkJCQkJCQkgZGV2aWNlX2xpc3RbaV0uaW5mby4KKwkJCQkJCQkgaHdfbG9jYXRpb24ucGNpLgorCQkJCQkJCSBkZXZpY2Vfbm8pCisJCQkJCQkgICAgICYmIChvX2Z1bmNfbm8gPT0KKwkJCQkJCQkgY2ZnX3NldHVwLgorCQkJCQkJCSBkZXZpY2VfbGlzdFtpXS5pbmZvLgorCQkJCQkJCSBod19sb2NhdGlvbi5wY2kuCisJCQkJCQkJIGZ1bmN0aW9uX25vKSkpIHsKKwkJCQkJCQlsaXN0X21vdmVfdGFpbChwb3MsCisJCQkJCQkJCSAgICAgICAmbmV3X2xpc3QpOworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQl9CisvKgorCQkJCQllbHNlIGlmIChjZmdfc2V0dXAuZGV2aWNlX2xpc3RbaV0uaW5mby5od19sb2NhdGlvbi5idXNfdHlwZSA9PSBNRV9CVVNfVFlQRV9VU0IpCisJCQkJCXsKKwkJCQkJCWlmICgoKG9fdmVuZG9yX2lkID09IGNmZ19zZXR1cC5kZXZpY2VfbGlzdFtpXS5pbmZvLnZlbmRvcl9pZCkgJiYKKwkJCQkJCSAgICAgICAgKG9fZGV2aWNlX2lkID09IGNmZ19zZXR1cC5kZXZpY2VfbGlzdFtpXS5pbmZvLmRldmljZV9pZCkgJiYKKwkJCQkJCSAgICAgICAgKG9fc2VyaWFsX25vID09IGNmZ19zZXR1cC5kZXZpY2VfbGlzdFtpXS5pbmZvLnNlcmlhbF9ubykgJiYKKwkJCQkJCSAgICAgICAgKG9fYnVzX3R5cGUgPT0gY2ZnX3NldHVwLmRldmljZV9saXN0W2ldLmluZm8uaHdfbG9jYXRpb24uYnVzX3R5cGUpKSB8fAorCQkJCQkJICAgICAgICAoKG9fdmVuZG9yX2lkID09IGNmZ19zZXR1cC5kZXZpY2VfbGlzdFtpXS5pbmZvLnZlbmRvcl9pZCkgJiYKKwkJCQkJCSAgICAgICAgIChvX2RldmljZV9pZCA9PSBjZmdfc2V0dXAuZGV2aWNlX2xpc3RbaV0uaW5mby5kZXZpY2VfaWQpICYmCisJCQkJCQkgICAgICAgICAob19idXNfdHlwZSA9PSBjZmdfc2V0dXAuZGV2aWNlX2xpc3RbaV0uaW5mby5od19sb2NhdGlvbi5idXNfdHlwZSkgJiYKKwkJCQkJCSAgICAgICAgIChvX2J1c19ubyA9PSBjZmdfc2V0dXAuZGV2aWNlX2xpc3RbaV0uaW5mby5od19sb2NhdGlvbi51c2Iucm9vdF9odWJfbm8pKSkKKwkJCQkJCXsKKwkJCQkJCQlsaXN0X21vdmVfdGFpbChwb3MsICZuZXdfbGlzdCk7CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCX0KKyovCisJCQkJCWVsc2UgeworCQkJCQkJUEVSUk9SKCJXcm9uZyBidXMgdHlwZTogJWQuXG4iLAorCQkJCQkJICAgICAgIGNmZ19zZXR1cC5kZXZpY2VfbGlzdFtpXS4KKwkJCQkJCSAgICAgICBpbmZvLmh3X2xvY2F0aW9uLgorCQkJCQkJICAgICAgIGJ1c190eXBlKTsKKwkJCQkJfQorCQkJCX0KKworCQkJCWlmIChwb3MgPT0gJm1lX2RldmljZV9saXN0KSB7CS8vIERldmljZSBpcyBub3QgYWxyZWFkeSBpbiB0aGUgbGlzdAorCQkJCQlpZiAoY2ZnX3NldHVwLmRldmljZV9saXN0W2ldLmluZm8uCisJCQkJCSAgICBod19sb2NhdGlvbi5idXNfdHlwZSA9PQorCQkJCQkgICAgTUVfQlVTX1RZUEVfUENJKSB7CisJCQkJCQluX2RldmljZSA9CisJCQkJCQkgICAgZ2V0X2R1bW15X2luc3RhbmNlCisJCQkJCQkgICAgKGNmZ19zZXR1cC5kZXZpY2VfbGlzdFtpXS4KKwkJCQkJCSAgICAgaW5mby52ZW5kb3JfaWQsCisJCQkJCQkgICAgIGNmZ19zZXR1cC5kZXZpY2VfbGlzdFtpXS4KKwkJCQkJCSAgICAgaW5mby5kZXZpY2VfaWQsCisJCQkJCQkgICAgIGNmZ19zZXR1cC5kZXZpY2VfbGlzdFtpXS4KKwkJCQkJCSAgICAgaW5mby5zZXJpYWxfbm8sCisJCQkJCQkgICAgIGNmZ19zZXR1cC5kZXZpY2VfbGlzdFtpXS4KKwkJCQkJCSAgICAgaW5mby5od19sb2NhdGlvbi5idXNfdHlwZSwKKwkJCQkJCSAgICAgY2ZnX3NldHVwLmRldmljZV9saXN0W2ldLgorCQkJCQkJICAgICBpbmZvLmh3X2xvY2F0aW9uLnBjaS4KKwkJCQkJCSAgICAgYnVzX25vLAorCQkJCQkJICAgICBjZmdfc2V0dXAuZGV2aWNlX2xpc3RbaV0uCisJCQkJCQkgICAgIGluZm8uaHdfbG9jYXRpb24ucGNpLgorCQkJCQkJICAgICBkZXZpY2Vfbm8sCisJCQkJCQkgICAgIGNmZ19zZXR1cC5kZXZpY2VfbGlzdFtpXS4KKwkJCQkJCSAgICAgaW5mby5od19sb2NhdGlvbi5wY2kuCisJCQkJCQkgICAgIGZ1bmN0aW9uX25vKTsKKworCQkJCQkJaWYgKCFuX2RldmljZSkgeworCQkJCQkJCVBFUlJPUgorCQkJCQkJCSAgICAoIkNhbid0IGdldCBkdW1teSBpbnN0YW5jZS5cbiIpOworCQkJCQkJCWtmcmVlKGNmZ19zZXR1cC4KKwkJCQkJCQkgICAgICBkZXZpY2VfbGlzdCk7CisJCQkJCQkJc3Bpbl9sb2NrKCZtZV9sb2NrKTsKKwkJCQkJCQltZV9jb3VudC0tOworCQkJCQkJCXNwaW5fdW5sb2NrKCZtZV9sb2NrKTsKKwkJCQkJCQl1cF93cml0ZSgmbWVfcndzZW0pOworCQkJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCQkJfQorCisJCQkJCQlsaXN0X2FkZF90YWlsKCZuX2RldmljZS0+bGlzdCwKKwkJCQkJCQkgICAgICAmbmV3X2xpc3QpOworCQkJCQl9CisvKgorCQkJCQllbHNlIGlmIChjZmdfc2V0dXAuZGV2aWNlX2xpc3RbaV0uaW5mby5od19sb2NhdGlvbi5idXNfdHlwZSA9PSBNRV9CVVNfVFlQRV9VU0IpCisJCQkJCXsKKwkJCQkJCW5fZGV2aWNlID0gZ2V0X2R1bW15X2luc3RhbmNlKAorCQkJCQkJICAgICAgICAgICAgICAgY2ZnX3NldHVwLmRldmljZV9saXN0W2ldLmluZm8udmVuZG9yX2lkLAorCQkJCQkJICAgICAgICAgICAgICAgY2ZnX3NldHVwLmRldmljZV9saXN0W2ldLmluZm8uZGV2aWNlX2lkLAorCQkJCQkJICAgICAgICAgICAgICAgY2ZnX3NldHVwLmRldmljZV9saXN0W2ldLmluZm8uc2VyaWFsX25vLAorCQkJCQkJICAgICAgICAgICAgICAgY2ZnX3NldHVwLmRldmljZV9saXN0W2ldLmluZm8uaHdfbG9jYXRpb24uYnVzX3R5cGUsCisJCQkJCQkgICAgICAgICAgICAgICBjZmdfc2V0dXAuZGV2aWNlX2xpc3RbaV0uaW5mby5od19sb2NhdGlvbi51c2Iucm9vdF9odWJfbm8sCisJCQkJCQkgICAgICAgICAgICAgICAwLAorCQkJCQkJICAgICAgICAgICAgICAgMCk7CisKKwkJCQkJCWlmICghbl9kZXZpY2UpCisJCQkJCQl7CisJCQkJCQkJUEVSUk9SKCJDYW4ndCBnZXQgZHVtbXkgaW5zdGFuY2UuXG4iKTsKKwkJCQkJCQlrZnJlZShjZmdfc2V0dXAuZGV2aWNlX2xpc3QpOworCQkJCQkJCXNwaW5fbG9jaygmbWVfbG9jayk7CisJCQkJCQkJbWVfY291bnQtLTsKKwkJCQkJCQlzcGluX3VubG9jaygmbWVfbG9jayk7CisJCQkJCQkJdXBfd3JpdGUoJm1lX3J3c2VtKTsKKwkJCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQkJCX0KKworCQkJCQkJbGlzdF9hZGRfdGFpbCgmbl9kZXZpY2UtPmxpc3QsICZuZXdfbGlzdCk7CisJCQkJCX0KKyovCisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQluX2RldmljZSA9IGdldF9kdW1teV9pbnN0YW5jZSgwLAorCQkJCQkJCSAgICAgIDAsIDAsIDAsIDAsIDAsIDApOworCisJCQkJaWYgKCFuX2RldmljZSkgeworCQkJCQlQRVJST1IoIkNhbid0IGdldCBkdW1teSBpbnN0YW5jZS5cbiIpOworCQkJCQlrZnJlZShjZmdfc2V0dXAuZGV2aWNlX2xpc3QpOworCQkJCQlzcGluX2xvY2soJm1lX2xvY2spOworCQkJCQltZV9jb3VudC0tOworCQkJCQlzcGluX3VubG9jaygmbWVfbG9jayk7CisJCQkJCXVwX3dyaXRlKCZtZV9yd3NlbSk7CisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCX0KKworCQkJCWxpc3RfYWRkX3RhaWwoJm5fZGV2aWNlLT5saXN0LCAmbmV3X2xpc3QpOworCQkJfQorCQl9CisKKwkJd2hpbGUgKCFsaXN0X2VtcHR5KCZtZV9kZXZpY2VfbGlzdCkpIHsKKwkJCW9fZGV2aWNlID0KKwkJCSAgICBsaXN0X2VudHJ5KG1lX2RldmljZV9saXN0Lm5leHQsIG1lX2RldmljZV90LCBsaXN0KTsKKwkJCW9fZGV2aWNlLT5tZV9kZXZpY2VfcXVlcnlfaW5mb19kZXZpY2Uob19kZXZpY2UsCisJCQkJCQkJICAgICAgJm9fdmVuZG9yX2lkLAorCQkJCQkJCSAgICAgICZvX2RldmljZV9pZCwKKwkJCQkJCQkgICAgICAmb19zZXJpYWxfbm8sCisJCQkJCQkJICAgICAgJm9fYnVzX3R5cGUsCisJCQkJCQkJICAgICAgJm9fYnVzX25vLAorCQkJCQkJCSAgICAgICZvX2Rldl9ubywKKwkJCQkJCQkgICAgICAmb19mdW5jX25vLAorCQkJCQkJCSAgICAgICZvX3BsdWdnZWQpOworCisJCQlpZiAob19wbHVnZ2VkID09IE1FX1BMVUdHRURfSU4pIHsKKwkJCQlsaXN0X21vdmVfdGFpbChtZV9kZXZpY2VfbGlzdC5uZXh0LCAmbmV3X2xpc3QpOworCQkJfSBlbHNlIHsKKwkJCQlsaXN0X2RlbChtZV9kZXZpY2VfbGlzdC5uZXh0KTsKKwkJCQlyZWxlYXNlX2luc3RhbmNlKG9fZGV2aWNlKTsKKwkJCX0KKwkJfQorCisJCS8vIE1vdmUgdGVtcG9yYXJ5IG5ldyBsaXN0IHRvIGdsb2JhbCBkcml2ZXIgbGlzdC4KKwkJbGlzdF9zcGxpY2UoJm5ld19saXN0LCAmbWVfZGV2aWNlX2xpc3QpOworCisJCWthcmdfY2ZnX3NldHVwLmVycm5vID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgY2ZnX3NldHVwLmNvdW50OyBpKyspIHsKKworCQlrYXJnX2NmZ19zZXR1cC5lcnJubyA9CisJCSAgICBtZV9jb25maWdfbG9hZF9kZXZpY2UoZmlsZXAsICZjZmdfc2V0dXAuZGV2aWNlX2xpc3RbaV0sIGkpOworCQlpZiAoa2FyZ19jZmdfc2V0dXAuZXJybm8pIHsKKwkJCVBFUlJPUigibWVfY29uZmlnX2xvYWRfZGV2aWNlKCVkKT0lZFxuIiwgaSwKKwkJCSAgICAgICBrYXJnX2NmZ19zZXR1cC5lcnJubyk7CisJCQlicmVhazsKKwkJfQorCX0KKworCXNwaW5fbG9jaygmbWVfbG9jayk7CisKKwltZV9jb3VudC0tOworCXNwaW5fdW5sb2NrKCZtZV9sb2NrKTsKKwl1cF93cml0ZSgmbWVfcndzZW0pOworCisJZXJyID0gY29weV90b191c2VyKGFyZywgJmthcmdfY2ZnX3NldHVwLCBzaXplb2YobWVfY29uZmlnX2xvYWRfdCkpOworCisJaWYgKGVycikgeworCQlQRVJST1IoIkNhbid0IGNvcHkgY29uZmlnIGxpc3QgdG8gdXNlciBzcGFjZS5cbiIpOworCQlrZnJlZShjZmdfc2V0dXAuZGV2aWNlX2xpc3QpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlrZnJlZShjZmdfc2V0dXAuZGV2aWNlX2xpc3QpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1lX2lvX3N0cmVhbV9zdGFydChzdHJ1Y3QgZmlsZSAqZmlsZXAsIG1lX2lvX3N0cmVhbV9zdGFydF90ICogYXJnKQoreworCWludCBlcnI7CisJaW50IGksIGs7CisKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwb3M7CisJbWVfZGV2aWNlX3QgKmRldmljZTsKKwltZV9pb19zdHJlYW1fc3RhcnRfdCBrYXJnOworCW1lSU9TdHJlYW1TdGFydF90ICpsaXN0OworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJZXJyID0gY29weV9mcm9tX3VzZXIoJmthcmcsIGFyZywgc2l6ZW9mKG1lX2lvX3N0cmVhbV9zdGFydF90KSk7CisKKwlpZiAoZXJyKSB7CisJCVBFUlJPUigiQ2FuJ3QgY29weSBhcmd1bWVudHMgdG8ga2VybmVsIHNwYWNlLlxuIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCWthcmcuZXJybm8gPSBNRV9FUlJOT19TVUNDRVNTOworCisJbGlzdCA9IGttYWxsb2Moc2l6ZW9mKG1lSU9TdHJlYW1TdGFydF90KSAqIGthcmcuY291bnQsIEdGUF9LRVJORUwpOworCisJaWYgKCFsaXN0KSB7CisJCVBFUlJPUigiQ2FuJ3QgZ2V0IGJ1ZmZlciBmb3Igc3RhcnQgbGlzdC5cbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwllcnIgPQorCSAgICBjb3B5X2Zyb21fdXNlcihsaXN0LCBrYXJnLnN0YXJ0X2xpc3QsCisJCQkgICBzaXplb2YobWVJT1N0cmVhbVN0YXJ0X3QpICoga2FyZy5jb3VudCk7CisKKwlpZiAoZXJyKSB7CisJCVBFUlJPUigiQ2FuJ3QgY29weSBzdGFydCBsaXN0IHRvIGtlcm5lbCBzcGFjZS5cbiIpOworCQlrZnJlZShsaXN0KTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJc3Bpbl9sb2NrKCZtZV9sb2NrKTsKKworCWlmICgobWVfZmlsZXAgIT0gTlVMTCkgJiYgKG1lX2ZpbGVwICE9IGZpbGVwKSkgeworCQlzcGluX3VubG9jaygmbWVfbG9jayk7CisJCVBFUlJPUigiRHJpdmVyIFN5c3RlbSBpcyBsb2dnZWQgYnkgYW5vdGhlciBwcm9jZXNzLlxuIik7CisKKwkJZm9yIChpID0gMDsgaSA8IGthcmcuY291bnQ7IGkrKykgeworCQkJbGlzdFtpXS5pRXJybm8gPSBNRV9FUlJOT19MT0NLRUQ7CisJCX0KKwl9IGVsc2UgeworCQltZV9jb3VudCsrOworCQlzcGluX3VubG9jaygmbWVfbG9jayk7CisKKwkJZm9yIChpID0gMDsgaSA8IGthcmcuY291bnQ7IGkrKykgeworCQkJZG93bl9yZWFkKCZtZV9yd3NlbSk7CisJCQlrID0gMDsKKwkJCWxpc3RfZm9yX2VhY2gocG9zLCAmbWVfZGV2aWNlX2xpc3QpIHsKKwkJCQlpZiAoayA9PSBsaXN0W2ldLmlEZXZpY2UpIHsKKwkJCQkJZGV2aWNlID0KKwkJCQkJICAgIGxpc3RfZW50cnkocG9zLCBtZV9kZXZpY2VfdCwgbGlzdCk7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCWsrKzsKKwkJCX0KKworCQkJaWYgKHBvcyA9PSAmbWVfZGV2aWNlX2xpc3QpIHsKKwkJCQl1cF9yZWFkKCZtZV9yd3NlbSk7CisJCQkJUEVSUk9SKCJJbnZhbGlkIGRldmljZSBudW1iZXIgc3BlY2lmaWVkLlxuIik7CisJCQkJbGlzdFtpXS5pRXJybm8gPSBNRV9FUlJOT19JTlZBTElEX0RFVklDRTsKKwkJCQlrYXJnLmVycm5vID0gTUVfRVJSTk9fSU5WQUxJRF9ERVZJQ0U7CisJCQkJYnJlYWs7CisJCQl9IGVsc2UgeworCQkJCWxpc3RbaV0uaUVycm5vID0KKwkJCQkgICAgZGV2aWNlLT5tZV9kZXZpY2VfaW9fc3RyZWFtX3N0YXJ0KGRldmljZSwKKwkJCQkJCQkJICAgICAgZmlsZXAsCisJCQkJCQkJCSAgICAgIGxpc3RbaV0uCisJCQkJCQkJCSAgICAgIGlTdWJkZXZpY2UsCisJCQkJCQkJCSAgICAgIGxpc3RbaV0uCisJCQkJCQkJCSAgICAgIGlTdGFydE1vZGUsCisJCQkJCQkJCSAgICAgIGxpc3RbaV0uCisJCQkJCQkJCSAgICAgIGlUaW1lT3V0LAorCQkJCQkJCQkgICAgICBsaXN0W2ldLgorCQkJCQkJCQkgICAgICBpRmxhZ3MpOworCisJCQkJaWYgKGxpc3RbaV0uaUVycm5vKSB7CisJCQkJCXVwX3JlYWQoJm1lX3J3c2VtKTsKKwkJCQkJa2FyZy5lcnJubyA9IGxpc3RbaV0uaUVycm5vOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisKKwkJCXVwX3JlYWQoJm1lX3J3c2VtKTsKKwkJfQorCisJCXNwaW5fbG9jaygmbWVfbG9jayk7CisKKwkJbWVfY291bnQtLTsKKwkJc3Bpbl91bmxvY2soJm1lX2xvY2spOworCX0KKworCWVyciA9IGNvcHlfdG9fdXNlcihhcmcsICZrYXJnLCBzaXplb2YobWVfaW9fc3RyZWFtX3N0YXJ0X3QpKTsKKworCWlmIChlcnIpIHsKKwkJUEVSUk9SKCJDYW4ndCBjb3B5IGFyZ3VtZW50cyB0byB1c2VyIHNwYWNlLlxuIik7CisJCWtmcmVlKGxpc3QpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwllcnIgPQorCSAgICBjb3B5X3RvX3VzZXIoa2FyZy5zdGFydF9saXN0LCBsaXN0LAorCQkJIHNpemVvZihtZUlPU3RyZWFtU3RhcnRfdCkgKiBrYXJnLmNvdW50KTsKKworCWlmIChlcnIpIHsKKwkJUEVSUk9SKCJDYW4ndCBjb3B5IHN0YXJ0IGxpc3QgdG8gdXNlciBzcGFjZS5cbiIpOworCQlrZnJlZShsaXN0KTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJa2ZyZWUobGlzdCk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lX2lvX3NpbmdsZShzdHJ1Y3QgZmlsZSAqZmlsZXAsIG1lX2lvX3NpbmdsZV90ICogYXJnKQoreworCWludCBlcnI7CisJaW50IGksIGs7CisKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwb3M7CisJbWVfZGV2aWNlX3QgKmRldmljZTsKKwltZV9pb19zaW5nbGVfdCBrYXJnOworCW1lSU9TaW5nbGVfdCAqbGlzdDsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWVyciA9IGNvcHlfZnJvbV91c2VyKCZrYXJnLCBhcmcsIHNpemVvZihtZV9pb19zaW5nbGVfdCkpOworCisJaWYgKGVycikgeworCQlQRVJST1IoIkNhbid0IGNvcHkgYXJndW1lbnRzIHRvIGtlcm5lbCBzcGFjZS5cbiIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlrYXJnLmVycm5vID0gTUVfRVJSTk9fU1VDQ0VTUzsKKworCWxpc3QgPSBrbWFsbG9jKHNpemVvZihtZUlPU2luZ2xlX3QpICoga2FyZy5jb3VudCwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIWxpc3QpIHsKKwkJUEVSUk9SKCJDYW4ndCBnZXQgYnVmZmVyIGZvciBzaW5nbGUgbGlzdC5cbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwllcnIgPQorCSAgICBjb3B5X2Zyb21fdXNlcihsaXN0LCBrYXJnLnNpbmdsZV9saXN0LAorCQkJICAgc2l6ZW9mKG1lSU9TaW5nbGVfdCkgKiBrYXJnLmNvdW50KTsKKworCWlmIChlcnIpIHsKKwkJUEVSUk9SKCJDYW4ndCBjb3B5IHNpbmdsZSBsaXN0IHRvIGtlcm5lbCBzcGFjZS5cbiIpOworCQlrZnJlZShsaXN0KTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJc3Bpbl9sb2NrKCZtZV9sb2NrKTsKKworCWlmICgobWVfZmlsZXAgIT0gTlVMTCkgJiYgKG1lX2ZpbGVwICE9IGZpbGVwKSkgeworCQlzcGluX3VubG9jaygmbWVfbG9jayk7CisJCVBFUlJPUigiRHJpdmVyIFN5c3RlbSBpcyBsb2dnZWQgYnkgYW5vdGhlciBwcm9jZXNzLlxuIik7CisKKwkJZm9yIChpID0gMDsgaSA8IGthcmcuY291bnQ7IGkrKykgeworCQkJbGlzdFtpXS5pRXJybm8gPSBNRV9FUlJOT19MT0NLRUQ7CisJCX0KKwl9IGVsc2UgeworCQltZV9jb3VudCsrOworCQlzcGluX3VubG9jaygmbWVfbG9jayk7CisKKwkJZm9yIChpID0gMDsgaSA8IGthcmcuY291bnQ7IGkrKykgeworCQkJayA9IDA7CisKKwkJCWRvd25fcmVhZCgmbWVfcndzZW0pOworCisJCQlsaXN0X2Zvcl9lYWNoKHBvcywgJm1lX2RldmljZV9saXN0KSB7CisJCQkJaWYgKGsgPT0gbGlzdFtpXS5pRGV2aWNlKSB7CisJCQkJCWRldmljZSA9CisJCQkJCSAgICBsaXN0X2VudHJ5KHBvcywgbWVfZGV2aWNlX3QsIGxpc3QpOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQlrKys7CisJCQl9CisKKwkJCWlmIChwb3MgPT0gJm1lX2RldmljZV9saXN0KSB7CisJCQkJdXBfcmVhZCgmbWVfcndzZW0pOworCQkJCVBFUlJPUigiSW52YWxpZCBkZXZpY2UgbnVtYmVyIHNwZWNpZmllZC5cbiIpOworCQkJCWxpc3RbaV0uaUVycm5vID0gTUVfRVJSTk9fSU5WQUxJRF9ERVZJQ0U7CisJCQkJa2FyZy5lcnJubyA9IE1FX0VSUk5PX0lOVkFMSURfREVWSUNFOworCQkJCWJyZWFrOworCQkJfSBlbHNlIHsKKwkJCQlpZiAobGlzdFtpXS5pRGlyID09IE1FX0RJUl9PVVRQVVQpIHsKKwkJCQkJbGlzdFtpXS5pRXJybm8gPQorCQkJCQkgICAgZGV2aWNlLT4KKwkJCQkJICAgIG1lX2RldmljZV9pb19zaW5nbGVfd3JpdGUoZGV2aWNlLAorCQkJCQkJCQkgICAgICBmaWxlcCwKKwkJCQkJCQkJICAgICAgbGlzdFtpXS4KKwkJCQkJCQkJICAgICAgaVN1YmRldmljZSwKKwkJCQkJCQkJICAgICAgbGlzdFtpXS4KKwkJCQkJCQkJICAgICAgaUNoYW5uZWwsCisJCQkJCQkJCSAgICAgIGxpc3RbaV0uCisJCQkJCQkJCSAgICAgIGlWYWx1ZSwKKwkJCQkJCQkJICAgICAgbGlzdFtpXS4KKwkJCQkJCQkJICAgICAgaVRpbWVPdXQsCisJCQkJCQkJCSAgICAgIGxpc3RbaV0uCisJCQkJCQkJCSAgICAgIGlGbGFncyk7CisKKwkJCQkJaWYgKGxpc3RbaV0uaUVycm5vKSB7CisJCQkJCQl1cF9yZWFkKCZtZV9yd3NlbSk7CisJCQkJCQlrYXJnLmVycm5vID0gbGlzdFtpXS5pRXJybm87CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0gZWxzZSBpZiAobGlzdFtpXS5pRGlyID09IE1FX0RJUl9JTlBVVCkgeworCQkJCQlsaXN0W2ldLmlFcnJubyA9CisJCQkJCSAgICBkZXZpY2UtPgorCQkJCQkgICAgbWVfZGV2aWNlX2lvX3NpbmdsZV9yZWFkKGRldmljZSwKKwkJCQkJCQkJICAgICBmaWxlcCwKKwkJCQkJCQkJICAgICBsaXN0W2ldLgorCQkJCQkJCQkgICAgIGlTdWJkZXZpY2UsCisJCQkJCQkJCSAgICAgbGlzdFtpXS4KKwkJCQkJCQkJICAgICBpQ2hhbm5lbCwKKwkJCQkJCQkJICAgICAmbGlzdFtpXS4KKwkJCQkJCQkJICAgICBpVmFsdWUsCisJCQkJCQkJCSAgICAgbGlzdFtpXS4KKwkJCQkJCQkJICAgICBpVGltZU91dCwKKwkJCQkJCQkJICAgICBsaXN0W2ldLgorCQkJCQkJCQkgICAgIGlGbGFncyk7CisKKwkJCQkJaWYgKGxpc3RbaV0uaUVycm5vKSB7CisJCQkJCQl1cF9yZWFkKCZtZV9yd3NlbSk7CisJCQkJCQlrYXJnLmVycm5vID0gbGlzdFtpXS5pRXJybm87CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCXVwX3JlYWQoJm1lX3J3c2VtKTsKKwkJCQkJUEVSUk9SCisJCQkJCSAgICAoIkludmFsaWQgc2luZ2xlIGRpcmVjdGlvbiBzcGVjaWZpZWQuXG4iKTsKKwkJCQkJbGlzdFtpXS5pRXJybm8gPSBNRV9FUlJOT19JTlZBTElEX0RJUjsKKwkJCQkJa2FyZy5lcnJubyA9IE1FX0VSUk5PX0lOVkFMSURfRElSOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisKKwkJCXVwX3JlYWQoJm1lX3J3c2VtKTsKKwkJfQorCisJCXNwaW5fbG9jaygmbWVfbG9jayk7CisKKwkJbWVfY291bnQtLTsKKwkJc3Bpbl91bmxvY2soJm1lX2xvY2spOworCX0KKworCWVyciA9IGNvcHlfdG9fdXNlcihhcmcsICZrYXJnLCBzaXplb2YobWVfaW9fc2luZ2xlX3QpKTsKKworCWlmIChlcnIpIHsKKwkJUEVSUk9SKCJDYW4ndCBjb3B5IGFyZ3VtZW50cyB0byB1c2VyIHNwYWNlLlxuIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCWVyciA9CisJICAgIGNvcHlfdG9fdXNlcihrYXJnLnNpbmdsZV9saXN0LCBsaXN0LAorCQkJIHNpemVvZihtZUlPU2luZ2xlX3QpICoga2FyZy5jb3VudCk7CisKKwlpZiAoZXJyKSB7CisJCVBFUlJPUigiQ2FuJ3QgY29weSBzaW5nbGUgbGlzdCB0byB1c2VyIHNwYWNlLlxuIik7CisJCWtmcmVlKGxpc3QpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlrZnJlZShsaXN0KTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWVfaW9fc3RyZWFtX2NvbmZpZyhzdHJ1Y3QgZmlsZSAqZmlsZXAsIG1lX2lvX3N0cmVhbV9jb25maWdfdCAqIGFyZykKK3sKKwlpbnQgZXJyOworCWludCBrID0gMDsKKworCXN0cnVjdCBsaXN0X2hlYWQgKnBvczsKKwltZV9kZXZpY2VfdCAqZGV2aWNlOworCW1lX2lvX3N0cmVhbV9jb25maWdfdCBrYXJnOworCW1lSU9TdHJlYW1Db25maWdfdCAqbGlzdDsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWVyciA9IGNvcHlfZnJvbV91c2VyKCZrYXJnLCBhcmcsIHNpemVvZihtZV9pb19zdHJlYW1fY29uZmlnX3QpKTsKKworCWlmIChlcnIpIHsKKwkJUEVSUk9SKCJDYW4ndCBjb3B5IGFyZ3VtZW50cyB0byBrZXJuZWwgc3BhY2UuXG4iKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJbGlzdCA9IGttYWxsb2Moc2l6ZW9mKG1lSU9TdHJlYW1Db25maWdfdCkgKiBrYXJnLmNvdW50LCBHRlBfS0VSTkVMKTsKKworCWlmICghbGlzdCkgeworCQlQRVJST1IoIkNhbid0IGdldCBidWZmZXIgZm9yIGNvbmZpZyBsaXN0LlxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWVyciA9CisJICAgIGNvcHlfZnJvbV91c2VyKGxpc3QsIGthcmcuY29uZmlnX2xpc3QsCisJCQkgICBzaXplb2YobWVJT1N0cmVhbUNvbmZpZ190KSAqIGthcmcuY291bnQpOworCisJaWYgKGVycikgeworCQlQRVJST1IoIkNhbid0IGNvcHkgY29uZmlnIGxpc3QgdG8ga2VybmVsIHNwYWNlLlxuIik7CisJCWtmcmVlKGxpc3QpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlzcGluX2xvY2soJm1lX2xvY2spOworCisJaWYgKChtZV9maWxlcCAhPSBOVUxMKSAmJiAobWVfZmlsZXAgIT0gZmlsZXApKSB7CisJCXNwaW5fdW5sb2NrKCZtZV9sb2NrKTsKKwkJUEVSUk9SKCJEcml2ZXIgU3lzdGVtIGlzIGxvZ2dlZCBieSBhbm90aGVyIHByb2Nlc3MuXG4iKTsKKwkJa2FyZy5lcnJubyA9IE1FX0VSUk5PX0xPQ0tFRDsKKwl9IGVsc2UgeworCQltZV9jb3VudCsrOworCQlzcGluX3VubG9jaygmbWVfbG9jayk7CisKKwkJZG93bl9yZWFkKCZtZV9yd3NlbSk7CisKKwkJbGlzdF9mb3JfZWFjaChwb3MsICZtZV9kZXZpY2VfbGlzdCkgeworCQkJaWYgKGsgPT0ga2FyZy5kZXZpY2UpIHsKKwkJCQlkZXZpY2UgPSBsaXN0X2VudHJ5KHBvcywgbWVfZGV2aWNlX3QsIGxpc3QpOworCQkJCWJyZWFrOworCQkJfQorCisJCQlrKys7CisJCX0KKworCQlpZiAocG9zID09ICZtZV9kZXZpY2VfbGlzdCkgeworCQkJUEVSUk9SKCJJbnZhbGlkIGRldmljZSBudW1iZXIgc3BlY2lmaWVkLlxuIik7CisJCQlrYXJnLmVycm5vID0gTUVfRVJSTk9fSU5WQUxJRF9ERVZJQ0U7CisJCX0gZWxzZSB7CisJCQlrYXJnLmVycm5vID0KKwkJCSAgICBkZXZpY2UtPm1lX2RldmljZV9pb19zdHJlYW1fY29uZmlnKGRldmljZSwgZmlsZXAsCisJCQkJCQkJICAgICAgIGthcmcuc3ViZGV2aWNlLAorCQkJCQkJCSAgICAgICBsaXN0LCBrYXJnLmNvdW50LAorCQkJCQkJCSAgICAgICAma2FyZy50cmlnZ2VyLAorCQkJCQkJCSAgICAgICBrYXJnLgorCQkJCQkJCSAgICAgICBmaWZvX2lycV90aHJlc2hvbGQsCisJCQkJCQkJICAgICAgIGthcmcuZmxhZ3MpOworCQl9CisKKwkJdXBfcmVhZCgmbWVfcndzZW0pOworCisJCXNwaW5fbG9jaygmbWVfbG9jayk7CisJCW1lX2NvdW50LS07CisJCXNwaW5fdW5sb2NrKCZtZV9sb2NrKTsKKwl9CisKKwllcnIgPSBjb3B5X3RvX3VzZXIoYXJnLCAma2FyZywgc2l6ZW9mKG1lX2lvX3N0cmVhbV9jb25maWdfdCkpOworCisJaWYgKGVycikgeworCQlQRVJST1IoIkNhbid0IGNvcHkgYmFjayB0byB1c2VyIHNwYWNlLlxuIik7CisJCWtmcmVlKGxpc3QpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlrZnJlZShsaXN0KTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWVfcXVlcnlfbnVtYmVyX2RldmljZXMoc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgIG1lX3F1ZXJ5X251bWJlcl9kZXZpY2VzX3QgKiBhcmcpCit7CisJaW50IGVycjsKKwltZV9xdWVyeV9udW1iZXJfZGV2aWNlc190IGthcmc7CisKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwb3M7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlrYXJnLm51bWJlciA9IDA7CisJZG93bl9yZWFkKCZtZV9yd3NlbSk7CisJbGlzdF9mb3JfZWFjaChwb3MsICZtZV9kZXZpY2VfbGlzdCkgeworCQlrYXJnLm51bWJlcisrOworCX0KKworCXVwX3JlYWQoJm1lX3J3c2VtKTsKKworCWthcmcuZXJybm8gPSBNRV9FUlJOT19TVUNDRVNTOworCisJZXJyID0gY29weV90b191c2VyKGFyZywgJmthcmcsIHNpemVvZihtZV9xdWVyeV9udW1iZXJfZGV2aWNlc190KSk7CisKKwlpZiAoZXJyKSB7CisJCVBFUlJPUigiQ2FuJ3QgY29weSBxdWVyeSBiYWNrIHRvIHVzZXIgc3BhY2UuXG4iKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWVfaW9fc3RyZWFtX3N0b3Aoc3RydWN0IGZpbGUgKmZpbGVwLCBtZV9pb19zdHJlYW1fc3RvcF90ICogYXJnKQoreworCWludCBlcnI7CisJaW50IGksIGs7CisKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwb3M7CisJbWVfZGV2aWNlX3QgKmRldmljZTsKKwltZV9pb19zdHJlYW1fc3RvcF90IGthcmc7CisJbWVJT1N0cmVhbVN0b3BfdCAqbGlzdDsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWVyciA9IGNvcHlfZnJvbV91c2VyKCZrYXJnLCBhcmcsIHNpemVvZihtZV9pb19zdHJlYW1fc3RvcF90KSk7CisKKwlpZiAoZXJyKSB7CisJCVBFUlJPUigiQ2FuJ3QgY29weSBhcmd1bWVudHMgdG8ga2VybmVsIHNwYWNlLlxuIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCWthcmcuZXJybm8gPSBNRV9FUlJOT19TVUNDRVNTOworCisJbGlzdCA9IGttYWxsb2Moc2l6ZW9mKG1lSU9TdHJlYW1TdG9wX3QpICoga2FyZy5jb3VudCwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIWxpc3QpIHsKKwkJUEVSUk9SKCJDYW4ndCBnZXQgYnVmZmVyIGZvciBzdG9wIGxpc3QuXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJZXJyID0KKwkgICAgY29weV9mcm9tX3VzZXIobGlzdCwga2FyZy5zdG9wX2xpc3QsCisJCQkgICBzaXplb2YobWVJT1N0cmVhbVN0b3BfdCkgKiBrYXJnLmNvdW50KTsKKworCWlmIChlcnIpIHsKKwkJUEVSUk9SKCJDYW4ndCBjb3B5IHN0b3AgbGlzdCB0byBrZXJuZWwgc3BhY2UuXG4iKTsKKwkJa2ZyZWUobGlzdCk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCXNwaW5fbG9jaygmbWVfbG9jayk7CisKKwlpZiAoKG1lX2ZpbGVwICE9IE5VTEwpICYmIChtZV9maWxlcCAhPSBmaWxlcCkpIHsKKwkJc3Bpbl91bmxvY2soJm1lX2xvY2spOworCQlQRVJST1IoIkRyaXZlciBTeXN0ZW0gaXMgbG9nZ2VkIGJ5IGFub3RoZXIgcHJvY2Vzcy5cbiIpOworCisJCWZvciAoaSA9IDA7IGkgPCBrYXJnLmNvdW50OyBpKyspIHsKKwkJCWxpc3RbaV0uaUVycm5vID0gTUVfRVJSTk9fTE9DS0VEOworCQl9CisJfSBlbHNlIHsKKwkJbWVfY291bnQrKzsKKwkJc3Bpbl91bmxvY2soJm1lX2xvY2spOworCisJCWZvciAoaSA9IDA7IGkgPCBrYXJnLmNvdW50OyBpKyspIHsKKwkJCWsgPSAwOworCQkJZG93bl9yZWFkKCZtZV9yd3NlbSk7CisJCQlsaXN0X2Zvcl9lYWNoKHBvcywgJm1lX2RldmljZV9saXN0KSB7CisJCQkJaWYgKGsgPT0gbGlzdFtpXS5pRGV2aWNlKSB7CisJCQkJCWRldmljZSA9CisJCQkJCSAgICBsaXN0X2VudHJ5KHBvcywgbWVfZGV2aWNlX3QsIGxpc3QpOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQlrKys7CisJCQl9CisKKwkJCWlmIChwb3MgPT0gJm1lX2RldmljZV9saXN0KSB7CisJCQkJdXBfcmVhZCgmbWVfcndzZW0pOworCQkJCVBFUlJPUigiSW52YWxpZCBkZXZpY2UgbnVtYmVyIHNwZWNpZmllZC5cbiIpOworCQkJCWxpc3RbaV0uaUVycm5vID0gTUVfRVJSTk9fSU5WQUxJRF9ERVZJQ0U7CisJCQkJa2FyZy5lcnJubyA9IE1FX0VSUk5PX0lOVkFMSURfREVWSUNFOworCQkJCWJyZWFrOworCQkJfSBlbHNlIHsKKwkJCQlsaXN0W2ldLmlFcnJubyA9CisJCQkJICAgIGRldmljZS0+bWVfZGV2aWNlX2lvX3N0cmVhbV9zdG9wKGRldmljZSwKKwkJCQkJCQkJICAgICBmaWxlcCwKKwkJCQkJCQkJICAgICBsaXN0W2ldLgorCQkJCQkJCQkgICAgIGlTdWJkZXZpY2UsCisJCQkJCQkJCSAgICAgbGlzdFtpXS4KKwkJCQkJCQkJICAgICBpU3RvcE1vZGUsCisJCQkJCQkJCSAgICAgbGlzdFtpXS4KKwkJCQkJCQkJICAgICBpRmxhZ3MpOworCisJCQkJaWYgKGxpc3RbaV0uaUVycm5vKSB7CisJCQkJCXVwX3JlYWQoJm1lX3J3c2VtKTsKKwkJCQkJa2FyZy5lcnJubyA9IGxpc3RbaV0uaUVycm5vOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisKKwkJCXVwX3JlYWQoJm1lX3J3c2VtKTsKKwkJfQorCisJCXNwaW5fbG9jaygmbWVfbG9jayk7CisKKwkJbWVfY291bnQtLTsKKwkJc3Bpbl91bmxvY2soJm1lX2xvY2spOworCX0KKworCWVyciA9IGNvcHlfdG9fdXNlcihhcmcsICZrYXJnLCBzaXplb2YobWVfaW9fc3RyZWFtX3N0b3BfdCkpOworCisJaWYgKGVycikgeworCQlQRVJST1IoIkNhbid0IGNvcHkgYXJndW1lbnRzIHRvIHVzZXIgc3BhY2UuXG4iKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJZXJyID0KKwkgICAgY29weV90b191c2VyKGthcmcuc3RvcF9saXN0LCBsaXN0LAorCQkJIHNpemVvZihtZUlPU3RyZWFtU3RvcF90KSAqIGthcmcuY291bnQpOworCisJaWYgKGVycikgeworCQlQRVJST1IoIkNhbid0IGNvcHkgc3RvcCBsaXN0IHRvIHVzZXIgc3BhY2UuXG4iKTsKKwkJa2ZyZWUobGlzdCk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCWtmcmVlKGxpc3QpOworCisJcmV0dXJuIGVycjsKK30KKworLyogIC8vbWVfcHJvYmVfdXNiCitzdGF0aWMgaW50IG1lX3Byb2JlX3VzYihzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZXJmYWNlLCBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCit7CisJLy9pbnQgZXJyOworCS8vbWVfdXNiX2NvbnN0cnVjdG9yX3QgKmNvbnN0cnVjdG9yID0gTlVMTDsKKwltZV9kZXZpY2VfdCAqbl9kZXZpY2UgPSBOVUxMOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJc3dpdGNoIChpZC0+aWRQcm9kdWN0KQorCXsKKwkJCWNhc2UgVVNCX0RFVklDRV9JRF9NRVBISVNUT19TMToKKwkJCQlpZigoY29uc3RydWN0b3IgPSBzeW1ib2xfZ2V0KG1lcGhpc3RvX3MxX2NvbnN0cnVjdG9yKSkgPT0gTlVMTCl7CisJCQkJCWVyciA9IHJlcXVlc3RfbW9kdWxlKE1FUEhJU1RPX1MxX05BTUUpOworCQkJCQlpZihlcnIpeworCQkJCQkJUEVSUk9SKCJFcnJvciB3aGlsZSByZXF1ZXN0IGZvciBtb2R1bGUgJXMuXG4iLCBNRVBISVNUT19TMV9OQU1FKTsKKwkJCQkJCXJldHVybiAtRU5PREVWOworCQkJCQl9CisJCQkJCWlmKChjb25zdHJ1Y3RvciA9IHN5bWJvbF9nZXQobWVwaGlzdG9fczFfY29uc3RydWN0b3IpKSA9PSBOVUxMKXsKKwkJCQkJCVBFUlJPUigiQ2FuJ3QgZ2V0ICVzIGRyaXZlciBtb2R1bGUgY29uc3RydWN0b3IuXG4iLCBNRVBISVNUT19TMV9OQU1FKTsKKwkJCQkJCXJldHVybiAtRU5PREVWOworCQkJCQl9CisJCQkJfQorCisJCQkJaWYoKG5fZGV2aWNlID0gKCpjb25zdHJ1Y3RvcikoaW50ZXJmYWNlKSkgPT0gTlVMTCl7CisJCQkJCXN5bWJvbF9wdXQobWVwaGlzdG9fczFfY29uc3RydWN0b3IpOworCQkJCQlQRVJST1IoIkNhbid0IGdldCBkZXZpY2UgaW5zdGFuY2Ugb2YgJXMgZHJpdmVyIG1vZHVsZS5cbiIsIE1FUEhJU1RPX1MxX05BTUUpOworCQkJCQlyZXR1cm4gLUVOT0RFVjsKKwkJCQl9CisKKwkJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJUEVSUk9SKCJJbnZhbGlkIHByb2R1Y3QgaWQuXG4iKTsKKworCQkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIGluc2VydF90b19kZXZpY2VfbGlzdChuX2RldmljZSk7Cit9CisqLworCisvKiAgLy9tZV9kaXNjb25uZWN0X3VzYgorc3RhdGljIHZvaWQgbWVfZGlzY29ubmVjdF91c2Ioc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGVyZmFjZSkKK3sKKworCXN0cnVjdCB1c2JfZGV2aWNlICpkZXZpY2UgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KGludGVyZmFjZSk7CisJaW50IHZlbmRvcl9pZCA9IGRldmljZS0+ZGVzY3JpcHRvci5pZFZlbmRvcjsKKwlpbnQgZGV2aWNlX2lkID0gZGV2aWNlLT5kZXNjcmlwdG9yLmlkUHJvZHVjdDsKKwlpbnQgc2VyaWFsX25vOworCisJc3NjYW5mKCZkZXZpY2UtPnNlcmlhbFsyXSwgIiV4IiwgJnNlcmlhbF9ubyk7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlQSU5GTygiVmVuZG9yIGlkID0gMHglMDhYXG4iLCB2ZW5kb3JfaWQpOworCVBJTkZPKCJEZXZpY2UgaWQgPSAweCUwOFhcbiIsIGRldmljZV9pZCk7CisJUElORk8oIlNlcmlhbCBOdW1iZXIgPSAweCUwOFhcbiIsIHNlcmlhbF9ubyk7CisKKwlyZXBsYWNlX3dpdGhfZHVtbXkodmVuZG9yX2lkLCBkZXZpY2VfaWQsIHNlcmlhbF9ubyk7Cit9CisqLworCitzdGF0aWMgaW50IG1lX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGVwLAorCQkgICAgc3RydWN0IGZpbGUgKmZpbGVwLCB1bnNpZ25lZCBpbnQgc2VydmljZSwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpZiAoX0lPQ19UWVBFKHNlcnZpY2UpICE9IE1FTUFJTl9NQUdJQykgeworCQlQRVJST1IoIkludmFsaWQgbWFnaWMgbnVtYmVyLlxuIik7CisJCXJldHVybiAtRU5PVFRZOworCX0KKworCVBERUJVRygic2VydmljZSBudW1iZXI6IDB4JXguXG4iLCBzZXJ2aWNlKTsKKworCXN3aXRjaCAoc2VydmljZSkgeworCWNhc2UgTUVfSU9fSVJRX0VOQUJMRToKKwkJcmV0dXJuIG1lX2lvX2lycV9zdGFydChmaWxlcCwgKG1lX2lvX2lycV9zdGFydF90ICopIGFyZyk7CisKKwljYXNlIE1FX0lPX0lSUV9XQUlUOgorCQlyZXR1cm4gbWVfaW9faXJxX3dhaXQoZmlsZXAsIChtZV9pb19pcnFfd2FpdF90ICopIGFyZyk7CisKKwljYXNlIE1FX0lPX0lSUV9ESVNBQkxFOgorCQlyZXR1cm4gbWVfaW9faXJxX3N0b3AoZmlsZXAsIChtZV9pb19pcnFfc3RvcF90ICopIGFyZyk7CisKKwljYXNlIE1FX0lPX1JFU0VUX0RFVklDRToKKwkJcmV0dXJuIG1lX2lvX3Jlc2V0X2RldmljZShmaWxlcCwgKG1lX2lvX3Jlc2V0X2RldmljZV90ICopIGFyZyk7CisKKwljYXNlIE1FX0lPX1JFU0VUX1NVQkRFVklDRToKKwkJcmV0dXJuIG1lX2lvX3Jlc2V0X3N1YmRldmljZShmaWxlcCwKKwkJCQkJICAgICAobWVfaW9fcmVzZXRfc3ViZGV2aWNlX3QgKikgYXJnKTsKKworCWNhc2UgTUVfSU9fU0lOR0xFX0NPTkZJRzoKKwkJcmV0dXJuIG1lX2lvX3NpbmdsZV9jb25maWcoZmlsZXAsCisJCQkJCSAgIChtZV9pb19zaW5nbGVfY29uZmlnX3QgKikgYXJnKTsKKworCWNhc2UgTUVfSU9fU0lOR0xFOgorCQlyZXR1cm4gbWVfaW9fc2luZ2xlKGZpbGVwLCAobWVfaW9fc2luZ2xlX3QgKikgYXJnKTsKKworCWNhc2UgTUVfSU9fU1RSRUFNX0NPTkZJRzoKKwkJcmV0dXJuIG1lX2lvX3N0cmVhbV9jb25maWcoZmlsZXAsCisJCQkJCSAgIChtZV9pb19zdHJlYW1fY29uZmlnX3QgKikgYXJnKTsKKworCWNhc2UgTUVfSU9fU1RSRUFNX05FV19WQUxVRVM6CisJCXJldHVybiBtZV9pb19zdHJlYW1fbmV3X3ZhbHVlcyhmaWxlcCwKKwkJCQkJICAgICAgIChtZV9pb19zdHJlYW1fbmV3X3ZhbHVlc190ICopCisJCQkJCSAgICAgICBhcmcpOworCisJY2FzZSBNRV9JT19TVFJFQU1fUkVBRDoKKwkJcmV0dXJuIG1lX2lvX3N0cmVhbV9yZWFkKGZpbGVwLCAobWVfaW9fc3RyZWFtX3JlYWRfdCAqKSBhcmcpOworCisJY2FzZSBNRV9JT19TVFJFQU1fU1RBUlQ6CisJCXJldHVybiBtZV9pb19zdHJlYW1fc3RhcnQoZmlsZXAsIChtZV9pb19zdHJlYW1fc3RhcnRfdCAqKSBhcmcpOworCisJY2FzZSBNRV9JT19TVFJFQU1fU1RBVFVTOgorCQlyZXR1cm4gbWVfaW9fc3RyZWFtX3N0YXR1cyhmaWxlcCwKKwkJCQkJICAgKG1lX2lvX3N0cmVhbV9zdGF0dXNfdCAqKSBhcmcpOworCisJY2FzZSBNRV9JT19TVFJFQU1fU1RPUDoKKwkJcmV0dXJuIG1lX2lvX3N0cmVhbV9zdG9wKGZpbGVwLCAobWVfaW9fc3RyZWFtX3N0b3BfdCAqKSBhcmcpOworCisJY2FzZSBNRV9JT19TVFJFQU1fV1JJVEU6CisJCXJldHVybiBtZV9pb19zdHJlYW1fd3JpdGUoZmlsZXAsIChtZV9pb19zdHJlYW1fd3JpdGVfdCAqKSBhcmcpOworCisJY2FzZSBNRV9MT0NLX0RSSVZFUjoKKwkJcmV0dXJuIG1lX2xvY2tfZHJpdmVyKGZpbGVwLCAobWVfbG9ja19kcml2ZXJfdCAqKSBhcmcpOworCisJY2FzZSBNRV9MT0NLX0RFVklDRToKKwkJcmV0dXJuIG1lX2xvY2tfZGV2aWNlKGZpbGVwLCAobWVfbG9ja19kZXZpY2VfdCAqKSBhcmcpOworCisJY2FzZSBNRV9MT0NLX1NVQkRFVklDRToKKwkJcmV0dXJuIG1lX2xvY2tfc3ViZGV2aWNlKGZpbGVwLCAobWVfbG9ja19zdWJkZXZpY2VfdCAqKSBhcmcpOworCisJY2FzZSBNRV9RVUVSWV9JTkZPX0RFVklDRToKKwkJcmV0dXJuIG1lX3F1ZXJ5X2luZm9fZGV2aWNlKGZpbGVwLAorCQkJCQkgICAgKG1lX3F1ZXJ5X2luZm9fZGV2aWNlX3QgKikgYXJnKTsKKworCWNhc2UgTUVfUVVFUllfREVTQ1JJUFRJT05fREVWSUNFOgorCQlyZXR1cm4gbWVfcXVlcnlfZGVzY3JpcHRpb25fZGV2aWNlKGZpbGVwLAorCQkJCQkJICAgKG1lX3F1ZXJ5X2Rlc2NyaXB0aW9uX2RldmljZV90CisJCQkJCQkgICAgKikgYXJnKTsKKworCWNhc2UgTUVfUVVFUllfTkFNRV9ERVZJQ0U6CisJCXJldHVybiBtZV9xdWVyeV9uYW1lX2RldmljZShmaWxlcCwKKwkJCQkJICAgIChtZV9xdWVyeV9uYW1lX2RldmljZV90ICopIGFyZyk7CisKKwljYXNlIE1FX1FVRVJZX05BTUVfREVWSUNFX0RSSVZFUjoKKwkJcmV0dXJuIG1lX3F1ZXJ5X25hbWVfZGV2aWNlX2RyaXZlcihmaWxlcCwKKwkJCQkJCSAgIChtZV9xdWVyeV9uYW1lX2RldmljZV9kcml2ZXJfdAorCQkJCQkJICAgICopIGFyZyk7CisKKwljYXNlIE1FX1FVRVJZX05VTUJFUl9ERVZJQ0VTOgorCQlyZXR1cm4gbWVfcXVlcnlfbnVtYmVyX2RldmljZXMoZmlsZXAsCisJCQkJCSAgICAgICAobWVfcXVlcnlfbnVtYmVyX2RldmljZXNfdCAqKQorCQkJCQkgICAgICAgYXJnKTsKKworCWNhc2UgTUVfUVVFUllfTlVNQkVSX1NVQkRFVklDRVM6CisJCXJldHVybiBtZV9xdWVyeV9udW1iZXJfc3ViZGV2aWNlcyhmaWxlcCwKKwkJCQkJCSAgKG1lX3F1ZXJ5X251bWJlcl9zdWJkZXZpY2VzX3QKKwkJCQkJCSAgICopIGFyZyk7CisKKwljYXNlIE1FX1FVRVJZX05VTUJFUl9DSEFOTkVMUzoKKwkJcmV0dXJuIG1lX3F1ZXJ5X251bWJlcl9jaGFubmVscyhmaWxlcCwKKwkJCQkJCShtZV9xdWVyeV9udW1iZXJfY2hhbm5lbHNfdCAqKQorCQkJCQkJYXJnKTsKKworCWNhc2UgTUVfUVVFUllfTlVNQkVSX1JBTkdFUzoKKwkJcmV0dXJuIG1lX3F1ZXJ5X251bWJlcl9yYW5nZXMoZmlsZXAsCisJCQkJCSAgICAgIChtZV9xdWVyeV9udW1iZXJfcmFuZ2VzX3QgKikgYXJnKTsKKworCWNhc2UgTUVfUVVFUllfUkFOR0VfQllfTUlOX01BWDoKKwkJcmV0dXJuIG1lX3F1ZXJ5X3JhbmdlX2J5X21pbl9tYXgoZmlsZXAsCisJCQkJCQkgKG1lX3F1ZXJ5X3JhbmdlX2J5X21pbl9tYXhfdCAqKQorCQkJCQkJIGFyZyk7CisKKwljYXNlIE1FX1FVRVJZX1JBTkdFX0lORk86CisJCXJldHVybiBtZV9xdWVyeV9yYW5nZV9pbmZvKGZpbGVwLAorCQkJCQkgICAobWVfcXVlcnlfcmFuZ2VfaW5mb190ICopIGFyZyk7CisKKwljYXNlIE1FX1FVRVJZX1NVQkRFVklDRV9CWV9UWVBFOgorCQlyZXR1cm4gbWVfcXVlcnlfc3ViZGV2aWNlX2J5X3R5cGUoZmlsZXAsCisJCQkJCQkgIChtZV9xdWVyeV9zdWJkZXZpY2VfYnlfdHlwZV90CisJCQkJCQkgICAqKSBhcmcpOworCisJY2FzZSBNRV9RVUVSWV9TVUJERVZJQ0VfVFlQRToKKwkJcmV0dXJuIG1lX3F1ZXJ5X3N1YmRldmljZV90eXBlKGZpbGVwLAorCQkJCQkgICAgICAgKG1lX3F1ZXJ5X3N1YmRldmljZV90eXBlX3QgKikKKwkJCQkJICAgICAgIGFyZyk7CisKKwljYXNlIE1FX1FVRVJZX1NVQkRFVklDRV9DQVBTOgorCQlyZXR1cm4gbWVfcXVlcnlfc3ViZGV2aWNlX2NhcHMoZmlsZXAsCisJCQkJCSAgICAgICAobWVfcXVlcnlfc3ViZGV2aWNlX2NhcHNfdCAqKQorCQkJCQkgICAgICAgYXJnKTsKKworCWNhc2UgTUVfUVVFUllfU1VCREVWSUNFX0NBUFNfQVJHUzoKKwkJcmV0dXJuIG1lX3F1ZXJ5X3N1YmRldmljZV9jYXBzX2FyZ3MoZmlsZXAsCisJCQkJCQkgICAgKG1lX3F1ZXJ5X3N1YmRldmljZV9jYXBzX2FyZ3NfdAorCQkJCQkJICAgICAqKSBhcmcpOworCisJY2FzZSBNRV9RVUVSWV9USU1FUjoKKwkJcmV0dXJuIG1lX3F1ZXJ5X3RpbWVyKGZpbGVwLCAobWVfcXVlcnlfdGltZXJfdCAqKSBhcmcpOworCisJY2FzZSBNRV9RVUVSWV9WRVJTSU9OX01BSU5fRFJJVkVSOgorCQlyZXR1cm4gbWVfcXVlcnlfdmVyc2lvbl9tYWluX2RyaXZlcihmaWxlcCwKKwkJCQkJCSAgICAobWVfcXVlcnlfdmVyc2lvbl9tYWluX2RyaXZlcl90CisJCQkJCQkgICAgICopIGFyZyk7CisKKwljYXNlIE1FX1FVRVJZX1ZFUlNJT05fREVWSUNFX0RSSVZFUjoKKwkJcmV0dXJuIG1lX3F1ZXJ5X3ZlcnNpb25fZGV2aWNlX2RyaXZlcihmaWxlcCwKKwkJCQkJCSAgICAgIChtZV9xdWVyeV92ZXJzaW9uX2RldmljZV9kcml2ZXJfdAorCQkJCQkJICAgICAgICopIGFyZyk7CisKKwljYXNlIE1FX0NPTkZJR19MT0FEOgorCQlyZXR1cm4gbWVfY29uZmlnX2xvYWQoZmlsZXAsIChtZV9jb25maWdfbG9hZF90ICopIGFyZyk7CisJfQorCisJUEVSUk9SKCJJbnZhbGlkIGlvY3RsIG51bWJlci5cbiIpOworCXJldHVybiAtRU5PVFRZOworfQorCisvLyBJbml0IGFuZCBleGl0IG9mIG1vZHVsZS4KK3N0YXRpYyBpbnQgbWVtYWluX2luaXQodm9pZCkKK3sKKwlpbnQgcmVzdWx0ID0gMDsKKwlkZXZfdCBkZXYgPSBNS0RFVihtYWpvciwgMCk7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwkvLyBSZWdpc3RlciBwY2kgZHJpdmVyLiBUaGlzIHdpbGwgcmV0dXJuIDAgaWYgdGhlIFBDSSBzdWJzeXN0ZW0gaXMgbm90IGF2YWlsYWJsZS4KKwlyZXN1bHQgPSBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZtZV9wY2lfZHJpdmVyKTsKKworCWlmIChyZXN1bHQgPCAwKSB7CisJCVBFUlJPUigiQ2FuJ3QgcmVnaXN0ZXIgcGNpIGRyaXZlci5cbiIpOworCQlnb3RvIElOSVRfRVJST1JfMTsKKwl9CisKKy8qCisJLy8gUmVnaXN0ZXIgdXNiIGRyaXZlci4gVGhpcyB3aWxsIHJldHVybiAtRU5PREVWIGlmIG5vIFVTQiBzdWJzeXN0ZW0gaXMgYXZhaWxhYmxlLgorCXJlc3VsdCA9IHVzYl9yZWdpc3RlcigmbWVfdXNiX2RyaXZlcik7CisKKwlpZiAocmVzdWx0KQorCXsKKwkJaWYgKHJlc3VsdCA9PSAtRU5PREVWKQorCQl7CisJCQlQRVJST1IoIk5vIFVTQiBzdWJzeXN0ZW0gYXZhaWxhYmxlLlxuIik7CisJCX0KKwkJZWxzZQorCQl7CisJCQlQRVJST1IoIkNhbid0IHJlZ2lzdGVyIHVzYiBkcml2ZXIuXG4iKTsKKwkJCWdvdG8gSU5JVF9FUlJPUl8yOworCQl9CisJfQorKi8KKwkvLyBSZWdpc3RlciB0aGUgY2hhcmFjdGVyIGRldmljZS4KKwlpZiAobWFqb3IpIHsKKwkJcmVzdWx0ID0gcmVnaXN0ZXJfY2hyZGV2X3JlZ2lvbihkZXYsIDEsIE1FTUFJTl9OQU1FKTsKKwl9IGVsc2UgeworCQlyZXN1bHQgPSBhbGxvY19jaHJkZXZfcmVnaW9uKCZkZXYsIDAsIDEsIE1FTUFJTl9OQU1FKTsKKwkJbWFqb3IgPSBNQUpPUihkZXYpOworCX0KKworCWlmIChyZXN1bHQgPCAwKSB7CisJCVBFUlJPUigiQ2FuJ3QgZ2V0IG1ham9yIGRyaXZlciBuby5cbiIpOworCQlnb3RvIElOSVRfRVJST1JfMzsKKwl9CisKKwljZGV2cCA9IGNkZXZfYWxsb2MoKTsKKworCWlmICghY2RldnApIHsKKwkJUEVSUk9SKCJDYW4ndCBnZXQgY2hhcmFjdGVyIGRldmljZSBzdHJ1Y3R1cmUuXG4iKTsKKwkJcmVzdWx0ID0gLUVOT01FTTsKKwkJZ290byBJTklUX0VSUk9SXzQ7CisJfQorCisJY2RldnAtPm9wcyA9ICZtZV9maWxlX29wZXJhdGlvbnM7CisKKwljZGV2cC0+b3duZXIgPSBUSElTX01PRFVMRTsKKworCXJlc3VsdCA9IGNkZXZfYWRkKGNkZXZwLCBkZXYsIDEpOworCisJaWYgKHJlc3VsdCA8IDApIHsKKwkJUEVSUk9SKCJDYW5ub3QgYWRkIGNoYXJhY3RlciBkZXZpY2Ugc3RydWN0dXJlLlxuIik7CisJCWdvdG8gSU5JVF9FUlJPUl81OworCX0KKworCXJldHVybiAwOworCisgICAgICBJTklUX0VSUk9SXzU6CisJY2Rldl9kZWwoY2RldnApOworCisgICAgICBJTklUX0VSUk9SXzQ6CisJdW5yZWdpc3Rlcl9jaHJkZXZfcmVnaW9uKGRldiwgMSk7CisKKyAgICAgIElOSVRfRVJST1JfMzoKKy8vICAgICAgdXNiX2RlcmVnaXN0ZXIoJm1lX3VzYl9kcml2ZXIpOworCisvL0lOSVRfRVJST1JfMjoKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJm1lX3BjaV9kcml2ZXIpOworCWNsZWFyX2RldmljZV9saXN0KCk7CisKKyAgICAgIElOSVRfRVJST1JfMToKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgbWVtYWluX2V4aXQodm9pZCkKK3sKKwlkZXZfdCBkZXYgPSBNS0RFVihtYWpvciwgMCk7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwljZGV2X2RlbChjZGV2cCk7CisJdW5yZWdpc3Rlcl9jaHJkZXZfcmVnaW9uKGRldiwgMSk7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZtZV9wY2lfZHJpdmVyKTsKKy8vICAgICAgdXNiX2RlcmVnaXN0ZXIoJm1lX3VzYl9kcml2ZXIpOworCWNsZWFyX2RldmljZV9saXN0KCk7Cit9CisKK21vZHVsZV9pbml0KG1lbWFpbl9pbml0KTsKK21vZHVsZV9leGl0KG1lbWFpbl9leGl0KTsKKworLy8gQWRtaW5pc3RyYXRpdmUgc3R1ZmYgZm9yIG1vZGluZm8uCitNT0RVTEVfQVVUSE9SCisgICAgKCJHdWVudGVyIEdlYmhhcmR0IDxnLmdlYmhhcmR0QG1laWxoYXVzLmRlPiAmIEtyenlzenRvZiBHYW50emtlIDxrLmdhbnR6a2VAbWVpbGhhdXMuZGU+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkNlbnRyYWwgbW9kdWxlIGZvciBNZWlsaGF1cyBEcml2ZXIgU3lzdGVtLiIpOworTU9EVUxFX1NVUFBPUlRFRF9ERVZJQ0UoIk1laWxoYXVzIFBDSS9jUENJIGJvYXJkcy4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworI2lmZGVmIEJPU0NICisvLyBFeHBvcnQgdGhlIGZsYWcgZm9yIHRoZSBCT1NDSCBmaXJtd2FyZS4KK0VYUE9SVF9TWU1CT0wobWVfYm9zY2hfZncpOworI2VuZGlmIC8vIEJPU0NICmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWVtYWluLmggYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWVtYWluLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzYxNmZmNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZW1haW4uaApAQCAtMCwwICsxLDQ2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogU291cmNlIEZpbGUgOiBtZW1haW4uaAorICogQXV0aG9yICAgICAgOiBHRyAoR3VlbnRlciBHZWJoYXJkdCkgIDxnLmdlYmhhcmR0QG1laWxoYXVzLmRlPgorICovCisKKyNpZm5kZWYgX01FTUFJTl9IXworI2RlZmluZSBfTUVNQUlOX0hfCisKKyNpbmNsdWRlICJtZWludGVybmFsLmgiCisKKyNpbmNsdWRlICJtZWlkcy5oIgorI2luY2x1ZGUgIm1lZGVidWcuaCIKKworI2luY2x1ZGUgIm1lZGV2aWNlLmgiCisvKiNpbmNsdWRlICJtZTEwMDBfZGV2aWNlLmgiCisjaW5jbHVkZSAibWUxNDAwX2RldmljZS5oIgorI2luY2x1ZGUgIm1lMTYwMF9kZXZpY2UuaCIqLworI2luY2x1ZGUgIm1lNDYwMF9kZXZpY2UuaCIKKy8qI2luY2x1ZGUgIm1lNjAwMF9kZXZpY2UuaCIKKyNpbmNsdWRlICJtZTA2MDBfZGV2aWNlLmgiCisjaW5jbHVkZSAibWU4MTAwX2RldmljZS5oIgorI2luY2x1ZGUgIm1lODIwMF9kZXZpY2UuaCIKKyNpbmNsdWRlICJtZTA5MDBfZGV2aWNlLmgiKi8KKyNpbmNsdWRlICJtZWR1bW15LmgiCisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgUENJIGRldmljZSB0YWJsZS4KKyAgVGhpcyBpcyB1c2VkIGJ5IG1vZHByb2JlIHRvIHRyYW5zbGF0ZSBQQ0kgSURzIHRvIGRyaXZlcnMuCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBtZV9wY2lfdGFibGVbXSBfX2RldmluaXRkYXRhID0geworCXtQQ0lfVkVORE9SX0lEX01FSUxIQVVTLCBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTAwMCwgUENJX0FOWV9JRCwKKwkgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJe1BDSV9WRU5ET1JfSURfTUVJTEhBVVMsIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxMDAwX0EsIFBDSV9BTllfSUQsCisJIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCXtQQ0lfVkVORE9SX0lEX01FSUxIQVVTLCBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTAwMF9CLCBQQ0lfQU5ZX0lELAorCSBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKworCXtQQ0lfVkVORE9SX0lEX01FSUxIQVVTLCBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTQwMCwgUENJX0FOWV9JRCwKKwkgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJe1BDSV9WRU5ET1JfSURfTUVJTEhBVVMsIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNDBBLCBQQ0lfQU5ZX0lELAorCSBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKwl7UENJX1ZFTkRPUl9JRF9NRUlMSEFVUywgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE0MEIsIFBDSV9BTllfSUQsCisJIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCXtQQ0lfVkVORE9SX0lEX01FSUxIQVVTLCBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTRFMCwgUENJX0FOWV9JRCwKKwkgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJe1BDSV9WRU5ET1JfSURfTUVJTEhBVVMsIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNEVBLCBQQ0lfQU5ZX0lELAorCSBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKwl7UENJX1ZFTkRPUl9JRF9NRUlMSEFVUywgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE0RUIsIFBDSV9BTllfSUQsCisJIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCXtQQ0lfVkVORE9SX0lEX01FSUxIQVVTLCBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTQwQywgUENJX0FOWV9JRCwKKwkgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJe1BDSV9WRU5ET1JfSURfTUVJTEhBVVMsIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNDBELCBQQ0lfQU5ZX0lELAorCSBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKworCXtQQ0lfVkVORE9SX0lEX01FSUxIQVVTLCBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTYwMF80VSwgUENJX0FOWV9JRCwKKwkgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJe1BDSV9WRU5ET1JfSURfTUVJTEhBVVMsIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNjAwXzhVLCBQQ0lfQU5ZX0lELAorCSBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKwl7UENJX1ZFTkRPUl9JRF9NRUlMSEFVUywgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE2MDBfMTJVLCBQQ0lfQU5ZX0lELAorCSBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKwl7UENJX1ZFTkRPUl9JRF9NRUlMSEFVUywgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE2MDBfMTZVLCBQQ0lfQU5ZX0lELAorCSBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKwl7UENJX1ZFTkRPUl9JRF9NRUlMSEFVUywgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE2MDBfMTZVXzhJLAorCSBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKworCXtQQ0lfVkVORE9SX0lEX01FSUxIQVVTLCBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDYxMCwgUENJX0FOWV9JRCwKKwkgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJe1BDSV9WRU5ET1JfSURfTUVJTEhBVVMsIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjUwLCBQQ0lfQU5ZX0lELAorCSBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKwl7UENJX1ZFTkRPUl9JRF9NRUlMSEFVUywgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2NjAsIFBDSV9BTllfSUQsCisJIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCXtQQ0lfVkVORE9SX0lEX01FSUxIQVVTLCBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDY2MEksIFBDSV9BTllfSUQsCisJIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCXtQQ0lfVkVORE9SX0lEX01FSUxIQVVTLCBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDY3MCwgUENJX0FOWV9JRCwKKwkgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJe1BDSV9WRU5ET1JfSURfTUVJTEhBVVMsIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjcwSSwgUENJX0FOWV9JRCwKKwkgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJe1BDSV9WRU5ET1JfSURfTUVJTEhBVVMsIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjcwUywgUENJX0FOWV9JRCwKKwkgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJe1BDSV9WRU5ET1JfSURfTUVJTEhBVVMsIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjcwSVMsIFBDSV9BTllfSUQsCisJIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCXtQQ0lfVkVORE9SX0lEX01FSUxIQVVTLCBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDY4MCwgUENJX0FOWV9JRCwKKwkgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJe1BDSV9WRU5ET1JfSURfTUVJTEhBVVMsIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjgwSSwgUENJX0FOWV9JRCwKKwkgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJe1BDSV9WRU5ET1JfSURfTUVJTEhBVVMsIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjgwUywgUENJX0FOWV9JRCwKKwkgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJe1BDSV9WRU5ET1JfSURfTUVJTEhBVVMsIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjgwSVMsIFBDSV9BTllfSUQsCisJIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCisJe1BDSV9WRU5ET1JfSURfTUVJTEhBVVMsIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDA0LCBQQ0lfQU5ZX0lELAorCSBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKwl7UENJX1ZFTkRPUl9JRF9NRUlMSEFVUywgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwMDgsIFBDSV9BTllfSUQsCisJIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCXtQQ0lfVkVORE9SX0lEX01FSUxIQVVTLCBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjAwRiwgUENJX0FOWV9JRCwKKwkgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisKKwl7UENJX1ZFTkRPUl9JRF9NRUlMSEFVUywgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwMTQsIFBDSV9BTllfSUQsCisJIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCXtQQ0lfVkVORE9SX0lEX01FSUxIQVVTLCBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjAxOCwgUENJX0FOWV9JRCwKKwkgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJe1BDSV9WRU5ET1JfSURfTUVJTEhBVVMsIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDFGLCBQQ0lfQU5ZX0lELAorCSBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKworCXtQQ0lfVkVORE9SX0lEX01FSUxIQVVTLCBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjAzNCwgUENJX0FOWV9JRCwKKwkgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJe1BDSV9WRU5ET1JfSURfTUVJTEhBVVMsIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDM4LCBQQ0lfQU5ZX0lELAorCSBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKwl7UENJX1ZFTkRPUl9JRF9NRUlMSEFVUywgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwM0YsIFBDSV9BTllfSUQsCisJIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCisJe1BDSV9WRU5ET1JfSURfTUVJTEhBVVMsIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTA0LCBQQ0lfQU5ZX0lELAorCSBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKwl7UENJX1ZFTkRPUl9JRF9NRUlMSEFVUywgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYxMDgsIFBDSV9BTllfSUQsCisJIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCXtQQ0lfVkVORE9SX0lEX01FSUxIQVVTLCBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjEwRiwgUENJX0FOWV9JRCwKKwkgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisKKwl7UENJX1ZFTkRPUl9JRF9NRUlMSEFVUywgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYxMTQsIFBDSV9BTllfSUQsCisJIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCXtQQ0lfVkVORE9SX0lEX01FSUxIQVVTLCBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjExOCwgUENJX0FOWV9JRCwKKwkgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJe1BDSV9WRU5ET1JfSURfTUVJTEhBVVMsIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTFGLCBQQ0lfQU5ZX0lELAorCSBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKworCXtQQ0lfVkVORE9SX0lEX01FSUxIQVVTLCBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjEzNCwgUENJX0FOWV9JRCwKKwkgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJe1BDSV9WRU5ET1JfSURfTUVJTEhBVVMsIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTM4LCBQQ0lfQU5ZX0lELAorCSBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKwl7UENJX1ZFTkRPUl9JRF9NRUlMSEFVUywgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYxM0YsIFBDSV9BTllfSUQsCisJIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCisJe1BDSV9WRU5ET1JfSURfTUVJTEhBVVMsIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDQ0LCBQQ0lfQU5ZX0lELAorCSBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKwl7UENJX1ZFTkRPUl9JRF9NRUlMSEFVUywgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwNDgsIFBDSV9BTllfSUQsCisJIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCXtQQ0lfVkVORE9SX0lEX01FSUxIQVVTLCBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjA0RiwgUENJX0FOWV9JRCwKKwkgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisKKwl7UENJX1ZFTkRPUl9JRF9NRUlMSEFVUywgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwNTQsIFBDSV9BTllfSUQsCisJIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCXtQQ0lfVkVORE9SX0lEX01FSUxIQVVTLCBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjA1OCwgUENJX0FOWV9JRCwKKwkgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJe1BDSV9WRU5ET1JfSURfTUVJTEhBVVMsIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDVGLCBQQ0lfQU5ZX0lELAorCSBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKworCXtQQ0lfVkVORE9SX0lEX01FSUxIQVVTLCBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjA3NCwgUENJX0FOWV9JRCwKKwkgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJe1BDSV9WRU5ET1JfSURfTUVJTEhBVVMsIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDc4LCBQQ0lfQU5ZX0lELAorCSBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKwl7UENJX1ZFTkRPUl9JRF9NRUlMSEFVUywgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwN0YsIFBDSV9BTllfSUQsCisJIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCisJe1BDSV9WRU5ET1JfSURfTUVJTEhBVVMsIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTQ0LCBQQ0lfQU5ZX0lELAorCSBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKwl7UENJX1ZFTkRPUl9JRF9NRUlMSEFVUywgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYxNDgsIFBDSV9BTllfSUQsCisJIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCXtQQ0lfVkVORE9SX0lEX01FSUxIQVVTLCBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjE0RiwgUENJX0FOWV9JRCwKKwkgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisKKwl7UENJX1ZFTkRPUl9JRF9NRUlMSEFVUywgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYxNTQsIFBDSV9BTllfSUQsCisJIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCXtQQ0lfVkVORE9SX0lEX01FSUxIQVVTLCBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjE1OCwgUENJX0FOWV9JRCwKKwkgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJe1BDSV9WRU5ET1JfSURfTUVJTEhBVVMsIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTVGLCBQQ0lfQU5ZX0lELAorCSBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKworCXtQQ0lfVkVORE9SX0lEX01FSUxIQVVTLCBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjE3NCwgUENJX0FOWV9JRCwKKwkgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJe1BDSV9WRU5ET1JfSURfTUVJTEhBVVMsIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTc4LCBQQ0lfQU5ZX0lELAorCSBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKwl7UENJX1ZFTkRPUl9JRF9NRUlMSEFVUywgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYxN0YsIFBDSV9BTllfSUQsCisJIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCisJe1BDSV9WRU5ET1JfSURfTUVJTEhBVVMsIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MjU5LCBQQ0lfQU5ZX0lELAorCSBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKworCXtQQ0lfVkVORE9SX0lEX01FSUxIQVVTLCBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjM1OSwgUENJX0FOWV9JRCwKKwkgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisKKwl7UENJX1ZFTkRPUl9JRF9NRUlMSEFVUywgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTA2MzAsIFBDSV9BTllfSUQsCisJIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCisJe1BDSV9WRU5ET1JfSURfTUVJTEhBVVMsIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU4MTAwX0EsIFBDSV9BTllfSUQsCisJIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCXtQQ0lfVkVORE9SX0lEX01FSUxIQVVTLCBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FODEwMF9CLCBQQ0lfQU5ZX0lELAorCSBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKworCXtQQ0lfVkVORE9SX0lEX01FSUxIQVVTLCBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FODIwMF9BLCBQQ0lfQU5ZX0lELAorCSBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKwl7UENJX1ZFTkRPUl9JRF9NRUlMSEFVUywgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTgyMDBfQiwgUENJX0FOWV9JRCwKKwkgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisKKwl7UENJX1ZFTkRPUl9JRF9NRUlMSEFVUywgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTA5NDAsIFBDSV9BTllfSUQsCisJIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCXtQQ0lfVkVORE9SX0lEX01FSUxIQVVTLCBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMDk1MCwgUENJX0FOWV9JRCwKKwkgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJe1BDSV9WRU5ET1JfSURfTUVJTEhBVVMsIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUwOTYwLCBQQ0lfQU5ZX0lELAorCSBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKworCXswfQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIG1lX3BjaV90YWJsZSk7CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgVVNCIGRldmljZSB0YWJsZS4KKyAgVGhpcyBpcyB1c2VkIGJ5IG1vZHByb2JlIHRvIHRyYW5zbGF0ZSBVU0IgSURzIHRvIGRyaXZlcnMuCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisvKgorc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2lkIG1lX3VzYl90YWJsZVtdIF9fZGV2aW5pdGRhdGEgPSB7CisJeyBVU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfTUVQSElTVE9fUzEsIFVTQl9ERVZJQ0VfSURfTUVQSElTVE9fUzEpIH0sCisJeyAwIH0KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUgKHVzYiwgbWVfdXNiX3RhYmxlKTsKKyovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgVGVtcGxhdGVzCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNkZWZpbmUgTUVfTE9DS19NVUxUSVBMRVhfVEVNUExBVEUoTkFNRSwgVFlQRSwgQ0FMTCwgREVWX0NBTEwsIEFSR1MpCVwKK3N0YXRpYyBpbnQgQ0FMTChzdHJ1Y3QgZmlsZSAqZmlsZXAsIFRZUEUgKmFyZyl7CVwKKwlpbnQgZXJyID0gMDsgXAorCWludCBrID0gMDsgXAorCXN0cnVjdCBsaXN0X2hlYWQgKnBvczsgXAorCW1lX2RldmljZV90ICpkZXZpY2U7IFwKKwlUWVBFIGthcmc7IFwKKwlcCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOyBcCisJXAorCWVyciA9IGNvcHlfZnJvbV91c2VyKCZrYXJnLCBhcmcsIHNpemVvZihUWVBFKSk7IFwKKwlpZihlcnIpeyBcCisJCVBFUlJPUigiQ2FuJ3QgY29weSBhcmd1bWVudHMgdG8ga2VybmVsIHNwYWNlXG4iKTsgXAorCQlyZXR1cm4gLUVGQVVMVDsgXAorCX0gXAorCVwKKwlkb3duX3JlYWQoJm1lX3J3c2VtKTsJXAorCVwKKwlsaXN0X2Zvcl9lYWNoKHBvcywgJm1lX2RldmljZV9saXN0KXsJXAorCQlpZihrID09IGthcmcuZGV2aWNlKXsJXAorCQkJZGV2aWNlID0gbGlzdF9lbnRyeShwb3MsIG1lX2RldmljZV90LCBsaXN0KTsJXAorCQkJCWJyZWFrOwlcCisJCX0JXAorCQlrKys7CVwKKwl9CVwKKwlcCisJaWYocG9zID09ICZtZV9kZXZpY2VfbGlzdCl7IFwKKwkJUEVSUk9SKCJJbnZhbGlkIGRldmljZSBudW1iZXIgc3BlY2lmaWVkXG4iKTsgXAorCQlrYXJnLmVycm5vID0gTUVfRVJSTk9fSU5WQUxJRF9ERVZJQ0U7IFwKKwl9IFwKKwllbHNleyBcCisJCXNwaW5fbG9jaygmbWVfbG9jayk7CVwKKwkJaWYoKG1lX2ZpbGVwICE9IE5VTEwpICYmIChtZV9maWxlcCAhPSBmaWxlcCkpewlcCisJCQlzcGluX3VubG9jaygmbWVfbG9jayk7CVwKKwkJCVBFUlJPUigiUmVzb3VyY2UgaXMgbG9ja2VkIGJ5IGFub3RoZXIgcHJvY2Vzc1xuIik7CVwKKwkJCWlmKGthcmcubG9jayA9PSBNRV9MT0NLX1NFVCkJXAorCQkJCWthcmcuZXJybm8gPSBNRV9FUlJOT19MT0NLRUQ7CVwKKwkJCWVsc2UgaWYoa2FyZy5sb2NrID09IE1FX0xPQ0tfUkVMRUFTRSkJXAorCQkJCWthcmcuZXJybm8gPSBNRV9FUlJOT19TVUNDRVNTOwlcCisJCQllbHNlewlcCisJCQkJUEVSUk9SKCJJbnZhbGlkIGxvY2sgc3BlY2lmaWVkXG4iKTsJXAorCQkJCWthcmcuZXJybm8gPSBNRV9FUlJOT19JTlZBTElEX0xPQ0s7CVwKKwkJCX1cCisJCX0JXAorCQllbHNlIHsJXAorCQkJbWVfY291bnQrKzsJXAorCQkJc3Bpbl91bmxvY2soJm1lX2xvY2spOwlcCisJCQlcCisJCQlrYXJnLmVycm5vID0gZGV2aWNlLT5ERVZfQ0FMTCBBUkdTOwlcCisJCQlcCisJCQlzcGluX2xvY2soJm1lX2xvY2spOwlcCisJCQltZV9jb3VudC0tOwlcCisJCQlzcGluX3VubG9jaygmbWVfbG9jayk7CVwKKwkJfQlcCisJfSBcCisJXAorCXVwX3JlYWQoJm1lX3J3c2VtKTsJXAorCVwKKwllcnIgPSBjb3B5X3RvX3VzZXIoYXJnLCAma2FyZywgc2l6ZW9mKFRZUEUpKTsgXAorCWlmKGVycil7IFwKKwkJUEVSUk9SKCJDYW4ndCBjb3B5IGFyZ3VtZW50cyBiYWNrIHRvIHVzZXIgc3BhY2VcbiIpOyBcCisJCXJldHVybiAtRUZBVUxUOyBcCisJfSBcCisJXAorCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOyBcCit9CisKKyNkZWZpbmUgTUVfSU9fTVVMVElQTEVYX1RFTVBMQVRFKE5BTUUsIFRZUEUsIENBTEwsIERFVl9DQUxMLCBBUkdTKQlcCitzdGF0aWMgaW50IENBTEwoc3RydWN0IGZpbGUgKmZpbGVwLCBUWVBFICphcmcpewlcCisJaW50IGVyciA9IDA7IFwKKwlpbnQgayA9IDA7IFwKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwb3M7IFwKKwltZV9kZXZpY2VfdCAqZGV2aWNlOyBcCisJVFlQRSBrYXJnOyBcCisJXAorCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsgXAorCVwKKwllcnIgPSBjb3B5X2Zyb21fdXNlcigma2FyZywgYXJnLCBzaXplb2YoVFlQRSkpOyBcCisJaWYoZXJyKXsgXAorCQlQRVJST1IoIkNhbid0IGNvcHkgYXJndW1lbnRzIHRvIGtlcm5lbCBzcGFjZVxuIik7IFwKKwkJcmV0dXJuIC1FRkFVTFQ7IFwKKwl9IFwKKwlcCisJZG93bl9yZWFkKCZtZV9yd3NlbSk7CVwKKwlcCisJbGlzdF9mb3JfZWFjaChwb3MsICZtZV9kZXZpY2VfbGlzdCl7CVwKKwkJaWYoayA9PSBrYXJnLmRldmljZSl7CVwKKwkJCWRldmljZSA9IGxpc3RfZW50cnkocG9zLCBtZV9kZXZpY2VfdCwgbGlzdCk7CVwKKwkJCQlicmVhazsJXAorCQl9CVwKKwkJaysrOwlcCisJfQlcCisJXAorCWlmKHBvcyA9PSAmbWVfZGV2aWNlX2xpc3QpeyBcCisJCVBFUlJPUigiSW52YWxpZCBkZXZpY2UgbnVtYmVyIHNwZWNpZmllZFxuIik7IFwKKwkJa2FyZy5lcnJubyA9IE1FX0VSUk5PX0lOVkFMSURfREVWSUNFOyBcCisJfSBcCisJZWxzZXsgXAorCQlzcGluX2xvY2soJm1lX2xvY2spOwlcCisJCWlmKChtZV9maWxlcCAhPSBOVUxMKSAmJiAobWVfZmlsZXAgIT0gZmlsZXApKXsJXAorCQkJc3Bpbl91bmxvY2soJm1lX2xvY2spOwlcCisJCQlQRVJST1IoIlJlc291cmNlIGlzIGxvY2tlZCBieSBhbm90aGVyIHByb2Nlc3NcbiIpOwlcCisJCQlrYXJnLmVycm5vID0gTUVfRVJSTk9fTE9DS0VEOwlcCisJCX0JXAorCQllbHNlIHsJXAorCQkJbWVfY291bnQrKzsJXAorCQkJc3Bpbl91bmxvY2soJm1lX2xvY2spOwlcCisJCQlcCisJCQlrYXJnLmVycm5vID0gZGV2aWNlLT5ERVZfQ0FMTCBBUkdTOwlcCisJCQlcCisJCQlzcGluX2xvY2soJm1lX2xvY2spOwlcCisJCQltZV9jb3VudC0tOwlcCisJCQlzcGluX3VubG9jaygmbWVfbG9jayk7CVwKKwkJfQlcCisJfSBcCisJXAorCXVwX3JlYWQoJm1lX3J3c2VtKTsJXAorCVwKKwllcnIgPSBjb3B5X3RvX3VzZXIoYXJnLCAma2FyZywgc2l6ZW9mKFRZUEUpKTsgXAorCWlmKGVycil7IFwKKwkJUEVSUk9SKCJDYW4ndCBjb3B5IGFyZ3VtZW50cyBiYWNrIHRvIHVzZXIgc3BhY2VcbiIpOyBcCisJCXJldHVybiAtRUZBVUxUOyBcCisJfSBcCisgXAorCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOyBcCit9CisKKyNkZWZpbmUgTUVfUVVFUllfTVVMVElQTEVYX1NUUl9URU1QTEFURShOQU1FLCBUWVBFLCBDQUxMLCBERVZfQ0FMTCwgQVJHUykJXAorc3RhdGljIGludCBDQUxMKHN0cnVjdCBmaWxlICpmaWxlcCwgVFlQRSAqYXJnKXsJXAorCWludCBlcnIgPSAwOwlcCisJaW50IGsgPSAwOwlcCisJc3RydWN0IGxpc3RfaGVhZCAqcG9zOwlcCisJbWVfZGV2aWNlX3QgKmRldmljZTsJXAorCWNoYXIgKm1zZyA9IE5VTEw7CVwKKwlUWVBFIGthcmc7CVwKKwlcCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOyBcCisJXAorCWVyciA9IGNvcHlfZnJvbV91c2VyKCZrYXJnLCBhcmcsIHNpemVvZihUWVBFKSk7CVwKKwlpZihlcnIpewlcCisJCVBFUlJPUigiQ2FuJ3QgY29weSBhcmd1bWVudHMgdG8ga2VybmVsIHNwYWNlXG4iKTsJXAorCQlyZXR1cm4gLUVGQVVMVDsJXAorCX0JXAorCVwKKwlkb3duX3JlYWQoJm1lX3J3c2VtKTsJXAorCVwKKwlsaXN0X2Zvcl9lYWNoKHBvcywgJm1lX2RldmljZV9saXN0KXsJXAorCQlpZihrID09IGthcmcuZGV2aWNlKXsJXAorCQkJZGV2aWNlID0gbGlzdF9lbnRyeShwb3MsIG1lX2RldmljZV90LCBsaXN0KTsJXAorCQkJCWJyZWFrOwlcCisJCX0JXAorCQlrKys7CVwKKwl9CVwKKwlcCisJaWYocG9zID09ICZtZV9kZXZpY2VfbGlzdCl7CVwKKwkJUEVSUk9SKCJJbnZhbGlkIGRldmljZSBudW1iZXIgc3BlY2lmaWVkXG4iKTsJXAorCQlrYXJnLmVycm5vID0gTUVfRVJSTk9fSU5WQUxJRF9ERVZJQ0U7CVwKKwl9CVwKKwllbHNlewlcCisJCWthcmcuZXJybm8gPSBkZXZpY2UtPkRFVl9DQUxMIEFSR1M7CVwKKwkJaWYoIWthcmcuZXJybm8pewlcCisJCQlpZigoc3RybGVuKG1zZykgKyAxKSA+IGthcmcuY291bnQpewlcCisJCQkJUEVSUk9SKCJVc2VyIGJ1ZmZlciBmb3IgZGV2aWNlIG5hbWUgaXMgdG8gbGl0dGxlXG4iKTsJXAorCQkJCWthcmcuZXJybm8gPSBNRV9FUlJOT19VU0VSX0JVRkZFUl9TSVpFOwlcCisJCQl9CVwKKwkJCWVsc2V7CVwKKwkJCQllcnIgPSBjb3B5X3RvX3VzZXIoa2FyZy5uYW1lLCBtc2csIHN0cmxlbihtc2cpICsgMSk7CVwKKwkJCQlpZihlcnIpewlcCisJCQkJCVBFUlJPUigiQ2FuJ3QgY29weSBkZXZpY2UgbmFtZSB0byB1c2VyIHNwYWNlXG4iKTsJXAorCQkJCQlyZXR1cm4gLUVGQVVMVDsJXAorCQkJCX0JXAorCQkJfQlcCisJCX0JXAorCX0JXAorCVwKKwl1cF9yZWFkKCZtZV9yd3NlbSk7CVwKKwlcCisJZXJyID0gY29weV90b191c2VyKGFyZywgJmthcmcsIHNpemVvZihUWVBFKSk7CVwKKwlpZihlcnIpewlcCisJCVBFUlJPUigiQ2FuJ3QgY29weSBxdWVyeSBiYWNrIHRvIHVzZXIgc3BhY2VcbiIpOwlcCisJCXJldHVybiAtRUZBVUxUOwlcCisJfQlcCisJXAorCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOwlcCit9CisKKyNkZWZpbmUgTUVfUVVFUllfTVVMVElQTEVYX1RFTVBMQVRFKE5BTUUsIFRZUEUsIENBTEwsIERFVl9DQUxMLCBBUkdTKQlcCitzdGF0aWMgaW50IENBTEwoc3RydWN0IGZpbGUgKmZpbGVwLCBUWVBFICphcmcpewlcCisJaW50IGVyciA9IDA7CVwKKwlpbnQgayA9IDA7CVwKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwb3M7CVwKKwltZV9kZXZpY2VfdCAqZGV2aWNlOwlcCisJVFlQRSBrYXJnOwlcCisJCVwKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7IFwKKwkgXAorCWVyciA9IGNvcHlfZnJvbV91c2VyKCZrYXJnLCBhcmcsIHNpemVvZihUWVBFKSk7CVwKKwlpZihlcnIpewlcCisJCVBFUlJPUigiQ2FuJ3QgY29weSBhcmd1bWVudHMgZnJvbSB1c2VyIHNwYWNlXG4iKTsJXAorCQlyZXR1cm4gLUVGQVVMVDsJXAorCX0JXAorCVwKKwlkb3duX3JlYWQoJm1lX3J3c2VtKTsJXAorCVwKKwlsaXN0X2Zvcl9lYWNoKHBvcywgJm1lX2RldmljZV9saXN0KXsJXAorCQlpZihrID09IGthcmcuZGV2aWNlKXsJXAorCQkJZGV2aWNlID0gbGlzdF9lbnRyeShwb3MsIG1lX2RldmljZV90LCBsaXN0KTsJXAorCQkJYnJlYWs7CVwKKwkJfQlcCisJCWsrKzsJXAorCX0JXAorCQlcCisJaWYocG9zID09ICZtZV9kZXZpY2VfbGlzdCl7CVwKKwkJUEVSUk9SKCJJbnZhbGlkIGRldmljZSBudW1iZXIgc3BlY2lmaWVkXG4iKTsJXAorCQlrYXJnLmVycm5vID0gTUVfRVJSTk9fSU5WQUxJRF9ERVZJQ0U7CVwKKwl9CVwKKwllbHNlewlcCisJCWthcmcuZXJybm8gPSBkZXZpY2UtPkRFVl9DQUxMIEFSR1M7CVwKKwl9CVwKKwlcCisJdXBfcmVhZCgmbWVfcndzZW0pOwlcCisJXAorCWVyciA9IGNvcHlfdG9fdXNlcihhcmcsICZrYXJnLCBzaXplb2YoVFlQRSkpOwlcCisJaWYoZXJyKXsJXAorCQlQRVJST1IoIkNhbid0IGNvcHkgYXJndW1lbnRzIHRvIHVzZXIgc3BhY2VcbiIpOwlcCisJCXJldHVybiAtRUZBVUxUOwlcCisJfQlcCisJCVwKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsJXAorfQorCisjZW5kaWYgLy9fX0tFUk5FTF9fCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZXBseF9yZWcuaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZXBseF9yZWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODY4NjE0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lcGx4X3JlZy5oCkBAIC0wLDAgKzEsNTMgQEAKKy8qKgorICogQGZpbGUgbWVwbHhfcmVnLmgKKyAqCisgKiBAYnJpZWYgUExYIDkwNTIgUENJIGJyaWRnZSByZWdpc3RlciBkZWZpbml0aW9ucy4KKyAqIEBub3RlIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKiBAYXV0aG9yIEd1ZW50ZXIgR2ViaGFyZHQKKyAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9NRVBMWF9SRUdfSF8KKyNkZWZpbmUgX01FUExYX1JFR19IXworCisjaWZkZWYgX19LRVJORUxfXworCisjZGVmaW5lIFBMWF9JTlRDU1IJCQkJMHg0QwkJLyoqPCBJbnRlcnJ1cHQgY29udHJvbCBhbmQgc3RhdHVzIHJlZ2lzdGVyLiAqLworI2RlZmluZSBQTFhfSU5UQ1NSX0xPQ0FMX0lOVDFfRU4JCTB4MDEJCS8qKjwgSWYgc2V0LCBsb2NhbCBpbnRlcnJ1cHQgMSBpcyBlbmFibGVkIChyL3cpLiAqLworI2RlZmluZSBQTFhfSU5UQ1NSX0xPQ0FMX0lOVDFfUE9MCQkweDAyCQkvKio8IElmIHNldCwgbG9jYWwgaW50ZXJydXB0IDEgcG9sYXJpdHkgaXMgYWN0aXZlIGhpZ2ggKHIvdykuICovCisjZGVmaW5lIFBMWF9JTlRDU1JfTE9DQUxfSU5UMV9TVEFURQkJMHgwNAkJLyoqPCBJZiBzZXQsIGxvY2FsIGludGVycnVwdCAxIGlzIGFjdGl2ZSAoci9fKS4gKi8KKyNkZWZpbmUgUExYX0lOVENTUl9MT0NBTF9JTlQyX0VOCQkweDA4CQkvKio8IElmIHNldCwgbG9jYWwgaW50ZXJydXB0IDIgaXMgZW5hYmxlZCAoci93KS4gKi8KKyNkZWZpbmUgUExYX0lOVENTUl9MT0NBTF9JTlQyX1BPTAkJMHgxMAkJLyoqPCBJZiBzZXQsIGxvY2FsIGludGVycnVwdCAyIHBvbGFyaXR5IGlzIGFjdGl2ZSBoaWdoIChyL3cpLiAqLworI2RlZmluZSBQTFhfSU5UQ1NSX0xPQ0FMX0lOVDJfU1RBVEUJCTB4MjAJCS8qKjwgSWYgc2V0LCBsb2NhbCBpbnRlcnJ1cHQgMiBpcyBhY3RpdmUgIChyL18pLiAqLworI2RlZmluZSBQTFhfSU5UQ1NSX1BDSV9JTlRfRU4JCQkweDQwCQkvKio8IElmIHNldCwgUENJIGludGVycnVwdCBpcyBlbmFibGVkIChyL3cpLiAqLworI2RlZmluZSBQTFhfSU5UQ1NSX1NPRlRfSU5UCQkJMHg4MAkJLyoqPCBJZiBzZXQsIGEgc29mdHdhcmUgaW50ZXJydXB0IGlzIGdlbmVyYXRlZCAoci93KS4gKi8KKworI2RlZmluZSBQTFhfSUNSCQkJCQkweDUwCQkvKio8IEluaXRpYWxpemF0aW9uIGNvbnRyb2wgcmVnaXN0ZXIuICovCisjZGVmaW5lIFBMWF9JQ1JfQklUX0VFUFJPTV9DTE9DS19TRVQJCTB4MDEwMDAwMDAKKyNkZWZpbmUgUExYX0lDUl9CSVRfRUVQUk9NX0NISVBfU0VMRUNUCQkweDAyMDAwMDAwCisjZGVmaW5lIFBMWF9JQ1JfQklUX0VFUFJPTV9XUklURQkJMHgwNDAwMDAwMAorI2RlZmluZSBQTFhfSUNSX0JJVF9FRVBST01fUkVBRAkJCTB4MDgwMDAwMDAKKyNkZWZpbmUgUExYX0lDUl9CSVRfRUVQUk9NX1ZBTElECQkweDEwMDAwMDAwCisKKyNkZWZpbmUgUExYX0lDUl9NQVNLX0VFUFJPTQkJCTB4MUYwMDAwMDAKKyNkZWZpbmUgRUVQUk9NX0RFTEFZCQkJCTEKKworI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZXNsaXN0LmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWVzbGlzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlOGI2NmMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWVzbGlzdC5jCkBAIC0wLDAgKzEsMTczIEBACisvKioKKyAqIEBmaWxlIG1lX3NsaXN0LmMKKyAqCisgKiBAYnJpZWYgSW1wbGVtZW50cyB0aGUgc3ViZGV2aWNlIGxpc3QgY2xhc3MuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2luY2x1ZGUgIm1lZXJyb3IuaCIKKyNpbmNsdWRlICJtZWRlZmluZXMuaCIKKworI2luY2x1ZGUgIm1lc2xpc3QuaCIKKyNpbmNsdWRlICJtZWRlYnVnLmgiCisKK2ludCBtZV9zbGlzdF9xdWVyeV9udW1iZXJfc3ViZGV2aWNlcyhzdHJ1Y3QgbWVfc2xpc3QgKnNsaXN0LCBpbnQgKm51bWJlcikKK3sKKwlQREVCVUdfTE9DS1MoImNhbGxlZC5cbiIpOworCSpudW1iZXIgPSBzbGlzdC0+bjsKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKwordW5zaWduZWQgaW50IG1lX3NsaXN0X2dldF9udW1iZXJfc3ViZGV2aWNlcyhzdHJ1Y3QgbWVfc2xpc3QgKnNsaXN0KQoreworCVBERUJVR19MT0NLUygiY2FsbGVkLlxuIik7CisJcmV0dXJuIHNsaXN0LT5uOworfQorCittZV9zdWJkZXZpY2VfdCAqbWVfc2xpc3RfZ2V0X3N1YmRldmljZShzdHJ1Y3QgbWVfc2xpc3QgKiBzbGlzdCwKKwkJCQkgICAgICAgdW5zaWduZWQgaW50IGluZGV4KQoreworCisJc3RydWN0IGxpc3RfaGVhZCAqcG9zOworCW1lX3N1YmRldmljZV90ICpzdWJkZXZpY2UgPSBOVUxMOworCXVuc2lnbmVkIGludCBpID0gMDsKKworCVBERUJVR19MT0NLUygiY2FsbGVkLlxuIik7CisKKwlpZiAoaW5kZXggPj0gc2xpc3QtPm4pIHsKKwkJUEVSUk9SKCJJbmRleCBvdXQgb2YgcmFuZ2UuXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJbGlzdF9mb3JfZWFjaChwb3MsICZzbGlzdC0+aGVhZCkgeworCQlpZiAoaSA9PSBpbmRleCkgeworCQkJc3ViZGV2aWNlID0gbGlzdF9lbnRyeShwb3MsIG1lX3N1YmRldmljZV90LCBsaXN0KTsKKwkJCWJyZWFrOworCQl9CisKKwkJKytpOworCX0KKworCXJldHVybiBzdWJkZXZpY2U7Cit9CisKK2ludCBtZV9zbGlzdF9nZXRfc3ViZGV2aWNlX2J5X3R5cGUoc3RydWN0IG1lX3NsaXN0ICpzbGlzdCwKKwkJCQkgICB1bnNpZ25lZCBpbnQgc3RhcnRfc3ViZGV2aWNlLAorCQkJCSAgIGludCB0eXBlLCBpbnQgc3VidHlwZSwgaW50ICpzdWJkZXZpY2UpCit7CisJbWVfc3ViZGV2aWNlX3QgKnBvczsKKwlpbnQgc190eXBlLCBzX3N1YnR5cGU7CisJdW5zaWduZWQgaW50IGluZGV4ID0gMDsKKworCVBERUJVR19MT0NLUygiY2FsbGVkLlxuIik7CisKKwlpZiAoc3RhcnRfc3ViZGV2aWNlID49IHNsaXN0LT5uKSB7CisJCVBFUlJPUigiU3RhcnQgaW5kZXggb3V0IG9mIHJhbmdlLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19OT01PUkVfU1VCREVWSUNFX1RZUEU7CisJfQorCisJbGlzdF9mb3JfZWFjaF9lbnRyeShwb3MsICZzbGlzdC0+aGVhZCwgbGlzdCkgeworCQlpZiAoaW5kZXggPCBzdGFydF9zdWJkZXZpY2UpIHsJLy8gR28gZm9yd2FyZCB0byBzdGFydCBzdWJkZXZpY2UuCisJCQkrK2luZGV4OworCQkJY29udGludWU7CisJCX0KKworCQlwb3MtPm1lX3N1YmRldmljZV9xdWVyeV9zdWJkZXZpY2VfdHlwZShwb3MsCisJCQkJCQkgICAgICAgJnNfdHlwZSwgJnNfc3VidHlwZSk7CisKKwkJaWYgKHN1YnR5cGUgPT0gTUVfU1VCVFlQRV9BTlkpIHsKKwkJCWlmIChzX3R5cGUgPT0gdHlwZSkKKwkJCQlicmVhazsKKwkJfSBlbHNlIHsKKwkJCWlmICgoc190eXBlID09IHR5cGUpICYmIChzX3N1YnR5cGUgPT0gc3VidHlwZSkpCisJCQkJYnJlYWs7CisJCX0KKworCQkrK2luZGV4OworCX0KKworCWlmIChpbmRleCA+PSBzbGlzdC0+bikgeworCQlyZXR1cm4gTUVfRVJSTk9fTk9NT1JFX1NVQkRFVklDRV9UWVBFOworCX0KKworCSpzdWJkZXZpY2UgPSBpbmRleDsKKworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCit2b2lkIG1lX3NsaXN0X2FkZF9zdWJkZXZpY2VfdGFpbChzdHJ1Y3QgbWVfc2xpc3QgKnNsaXN0LAorCQkJCSBtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSkKK3sKKwlQREVCVUdfTE9DS1MoImNhbGxlZC5cbiIpOworCisJbGlzdF9hZGRfdGFpbCgmc3ViZGV2aWNlLT5saXN0LCAmc2xpc3QtPmhlYWQpOworCSsrc2xpc3QtPm47Cit9CisKK21lX3N1YmRldmljZV90ICptZV9zbGlzdF9kZWxfc3ViZGV2aWNlX3RhaWwoc3RydWN0IG1lX3NsaXN0ICpzbGlzdCkKK3sKKworCXN0cnVjdCBsaXN0X2hlYWQgKmxhc3Q7CisJbWVfc3ViZGV2aWNlX3QgKnN1YmRldmljZTsKKworCVBERUJVR19MT0NLUygiY2FsbGVkLlxuIik7CisKKwlpZiAobGlzdF9lbXB0eSgmc2xpc3QtPmhlYWQpKQorCQlyZXR1cm4gTlVMTDsKKworCWxhc3QgPSBzbGlzdC0+aGVhZC5wcmV2OworCisJc3ViZGV2aWNlID0gbGlzdF9lbnRyeShsYXN0LCBtZV9zdWJkZXZpY2VfdCwgbGlzdCk7CisKKwlsaXN0X2RlbChsYXN0KTsKKworCS0tc2xpc3QtPm47CisKKwlyZXR1cm4gc3ViZGV2aWNlOworfQorCitpbnQgbWVfc2xpc3RfaW5pdChtZV9zbGlzdF90ICogc2xpc3QpCit7CisJUERFQlVHX0xPQ0tTKCJjYWxsZWQuXG4iKTsKKworCUlOSVRfTElTVF9IRUFEKCZzbGlzdC0+aGVhZCk7CisJc2xpc3QtPm4gPSAwOworCXJldHVybiAwOworfQorCit2b2lkIG1lX3NsaXN0X2RlaW5pdChtZV9zbGlzdF90ICogc2xpc3QpCit7CisKKwlzdHJ1Y3QgbGlzdF9oZWFkICpzOworCW1lX3N1YmRldmljZV90ICpzdWJkZXZpY2U7CisKKwlQREVCVUdfTE9DS1MoImNhbGxlZC5cbiIpOworCisJd2hpbGUgKCFsaXN0X2VtcHR5KCZzbGlzdC0+aGVhZCkpIHsKKwkJcyA9IHNsaXN0LT5oZWFkLm5leHQ7CisJCWxpc3RfZGVsKHMpOworCQlzdWJkZXZpY2UgPSBsaXN0X2VudHJ5KHMsIG1lX3N1YmRldmljZV90LCBsaXN0KTsKKwkJc3ViZGV2aWNlLT5tZV9zdWJkZXZpY2VfZGVzdHJ1Y3RvcihzdWJkZXZpY2UpOworCX0KKworCXNsaXN0LT5uID0gMDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZXNsaXN0LmggYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWVzbGlzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyNmM4OTYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWVzbGlzdC5oCkBAIC0wLDAgKzEsMTA4IEBACisvKioKKyAqIEBmaWxlIG1lX3NsaXN0LmgKKyAqCisgKiBAYnJpZWYgUHJvdmlkZXMgdGhlIHN1YmRldmljZSBsaXN0IGNsYXNzLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICovCisKKyNpZm5kZWYgX01FX1NMSVNUX0hfCisjZGVmaW5lIF9NRV9TTElTVF9IXworCisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorCisjaW5jbHVkZSAibWVzdWJkZXZpY2UuaCIKKworI2lmZGVmIF9fS0VSTkVMX18KKworLyoqCisgKiBAYnJpZWYgVGhlIHN1YmRldmljZSBsaXN0IGNvbnRhaW5lci4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgbWVfc2xpc3QgeworCXN0cnVjdCBsaXN0X2hlYWQgaGVhZDsJCS8qKjwgVGhlIGhlYWQgb2YgdGhlIGludGVybmFsIGxpc3QuICovCisJdW5zaWduZWQgaW50IG47CQkJLyoqPCBUaGUgbnVtYmVyIG9mIHN1YmRldmljZXMgaW4gdGhlIGxpc3QuICovCit9IG1lX3NsaXN0X3Q7CisKKy8qKgorICogQGJyaWVmIFF1ZXJpZXMgdGhlIG51bWJlciBvZiBzdWJkZXZpY2VzIGN1cnJlbnRseSBpbnNpZGUgdGhlIGxpc3QuCisgKgorICogQHBhcmFtIHNsaXN0IFRoZSBzdWJkZXZpY2UgbGlzdCB0byBxdWVyeS4KKyAqIEBwYXJhbVtvdXRdIG51bWJlciBUaGUgbnVtYmVyIG9mIHN1YmRldmljZXMgb2YgdGhlIGRldmljZS4KKyAqCisgKiBAcmV0dXJuIE1FLWlEUyBlcnJvciBjb2RlLgorICovCitpbnQgbWVfc2xpc3RfcXVlcnlfbnVtYmVyX3N1YmRldmljZXMoc3RydWN0IG1lX3NsaXN0ICpzbGlzdCwgaW50ICpudW1iZXIpOworCisvKioKKyAqIEBicmllZiBSZXR1cm5zIHRoZSBudW1iZXIgb2Ygc3ViZGV2aWNlcyBjdXJyZW50bHkgaW5zaWRlIHRoZSBsaXN0LgorICoKKyAqIEBwYXJhbSBzbGlzdCBUaGUgc3ViZGV2aWNlIGxpc3QgdG8gcXVlcnkuCisgKgorICogQHJldHVybiBUaGUgbnVtYmVyIG9mIHN1YmRldmljZXMgaW4gdGhlIGxpc3QuCisgKi8KK3Vuc2lnbmVkIGludCBtZV9zbGlzdF9nZXRfbnVtYmVyX3N1YmRldmljZXMoc3RydWN0IG1lX3NsaXN0ICpzbGlzdCk7CisKKy8qKgorICogQGJyaWVmIEdldCBhIHN1YmRldmljZSBieSBpbmRleC4KKyAqCisgKiBAcGFyYW0gc2xpc3QgVGhlIHN1YmRldmljZSBsaXN0IHRvIHF1ZXJ5LgorICogQHBhcmFtIGluZGV4IFRoZSBpbmRleCBvZiB0aGUgc3ViZGV2aWNlIHRvIGdldCBpbiB0aGUgbGlzdC4KKyAqCisgKiBAcmV0dXJuIFRoZSBzdWJkZXZpY2UgYXQgaW5kZXggaWYgYXZhaWxhYmxlLlxuCisgKiAgICAgICAgIE5VTEwgaWYgdGhlIGluZGV4IGlzIG91dCBvZiByYW5nZS4KKyAqLworbWVfc3ViZGV2aWNlX3QgKm1lX3NsaXN0X2dldF9zdWJkZXZpY2Uoc3RydWN0IG1lX3NsaXN0ICpzbGlzdCwKKwkJCQkgICAgICAgdW5zaWduZWQgaW50IGluZGV4KTsKKworLyoqCisgKiBAYnJpZWYgR2V0IGEgc3ViZGV2aWNlIGluZGV4IGJ5IHR5cGUgYW5kIHN1YnR5cGUuCisgKgorICogQHBhcmFtIHNsaXN0IFRoZSBzdWJkZXZpY2UgbGlzdCB0byBxdWVyeS4KKyAqIEBwYXJhbSBzdGFydF9zdWJkZXZpY2UgVGhlIHN1YmRldmljZSBpbmRleCBhdCB3aGljaCB0aGUgc3RhcnQgc2hhbGwgYmVnaW4uCisgKiBAcGFyYW0gdHlwZSBUaGUgdHlwZSBvZiB0aGUgc3ViZGV2aWNlIHRvIHF1ZXJ5LgorICogQHBhcmFtIHN1YnR5cGUgVGhlIHN1YnR5cGUgb2YgdGhlIHN1YmRldmljZSB0byBxdWVyeS4KKyAqIEBwYXJhbVtvdXRdIHN1YmRldmljZSBPbiBzdWNjZXNzIHRoaXMgcGFyYW1ldGVyIHJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBzdWJkZXZpY2UgbWF0Y2hpbmcgdGhlIHJlcXVlc3RlZCB0eXBlLgorICoKKyAqIEByZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUyBvbiBzdWNjZXNzLgorICovCitpbnQgbWVfc2xpc3RfZ2V0X3N1YmRldmljZV9ieV90eXBlKHN0cnVjdCBtZV9zbGlzdCAqc2xpc3QsCisJCQkJICAgdW5zaWduZWQgaW50IHN0YXJ0X3N1YmRldmljZSwKKwkJCQkgICBpbnQgdHlwZSwgaW50IHN1YnR5cGUsIGludCAqc3ViZGV2aWNlKTsKKworLyoqCisgKiBAYnJpZWYgQWRkcyBhIHN1YmRldmljZSB0byB0aGUgdGFpbCBvZiB0aGUgbGlzdC4KKyAqCisgKiBAcGFyYW0gc2xpc3QgVGhlIHN1YmRldmljZSBsaXN0IHRvIGFkZCBhIHN1YmRldmljZSB0by4KKyAqIEBwYXJhbSBzdWJkZXZpY2UgVGhlIHN1YmRldmljZSB0byBhZGQgdG8gdGhlIGxpc3QuCisgKi8KK3ZvaWQgbWVfc2xpc3RfYWRkX3N1YmRldmljZV90YWlsKHN0cnVjdCBtZV9zbGlzdCAqc2xpc3QsCisJCQkJIG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlKTsKKworLyoqCisgKiBAYnJpZWYgUmVtb3ZlcyBhIHN1YmRldmljZSBmcm9tIHRoZSB0YWlsIG9mIHRoZSBsaXN0LgorICoKKyAqIEBwYXJhbSBzbGlzdCBUaGUgc3ViZGV2aWNlIGxpc3QuCisgKgorICogQHJldHVybiBQb2ludGVyIHRvIHRoZSByZW1vdmVkIHN1YmRlaXZjZS5cbgorICogICAgICAgICBOVUxMIGluIGNhc2VzIHdoZXJlIHRoZSBsaXN0IHdhcyBlbXB0eS4KKyAqLworbWVfc3ViZGV2aWNlX3QgKm1lX3NsaXN0X2RlbF9zdWJkZXZpY2VfdGFpbChzdHJ1Y3QgbWVfc2xpc3QgKnNsaXN0KTsKKworLyoqCisgKiBAYnJpZWYgSW5pdGlhbGl6ZXMgYSBzdWJkZXZpY2UgbGlzdCBzdHJ1Y3R1cmUuCisgKgorICogQHBhcmFtIGxvY2sgVGhlIHN1YmRldmljZSBsaXN0IHN0cnVjdHVyZSB0byBpbml0aWFsaXplLgorICogQHJldHVybiAwIG9uIHN1Y2Nlc3MuCisgKi8KK2ludCBtZV9zbGlzdF9pbml0KG1lX3NsaXN0X3QgKiBzbGlzdCk7CisKKy8qKgorICogQGJyaWVmIERlaW5pdGlhbGl6ZXMgYSBzdWJkZXZpY2UgbGlzdCBzdHJ1Y3R1cmUgYW5kIGRlc3RydWN0cyBldmVyeSBzdWJkZXZpY2UgaW4gaXQuCisgKgorICogQHBhcmFtIHNsaXN0IFRoZSBzdWJkZXZpY2UgbGlzdCBzdHJ1Y3R1cmUgdG8gZGVpbml0aWFsaXplLgorICogQHJldHVybiAwIG9uIHN1Y2Nlc3MuCisgKi8KK3ZvaWQgbWVfc2xpc3RfZGVpbml0KG1lX3NsaXN0X3QgKiBzbGlzdCk7CisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWVzbG9jay5jIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lc2xvY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjMwYjg5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lc2xvY2suYwpAQCAtMCwwICsxLDEzNiBAQAorLyoqCisgKiBAZmlsZSBtZXNsb2NrLmMKKyAqCisgKiBAYnJpZWYgSW1wbGVtZW50cyB0aGUgc3ViZGV2aWNlIGxvY2sgY2xhc3MuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDYgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisKKyNpbmNsdWRlICJtZWRlZmluZXMuaCIKKyNpbmNsdWRlICJtZWVycm9yLmgiCisKKyNpbmNsdWRlICJtZWRlYnVnLmgiCisjaW5jbHVkZSAibWVzbG9jay5oIgorCitpbnQgbWVfc2xvY2tfZW50ZXIoc3RydWN0IG1lX3Nsb2NrICpzbG9jaywgc3RydWN0IGZpbGUgKmZpbGVwKQoreworCVBERUJVR19MT0NLUygiZXhlY3V0ZWQuXG4iKTsKKworCXNwaW5fbG9jaygmc2xvY2stPnNwaW5fbG9jayk7CisKKwlpZiAoKHNsb2NrLT5maWxlcCkgIT0gTlVMTCAmJiAoc2xvY2stPmZpbGVwICE9IGZpbGVwKSkgeworCQlQRVJST1IoIlN1YmRldmljZSBpcyBsb2NrZWQgYnkgYW5vdGhlciBwcm9jZXNzLlxuIik7CisJCXNwaW5fdW5sb2NrKCZzbG9jay0+c3Bpbl9sb2NrKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0xPQ0tFRDsKKwl9CisKKwlzbG9jay0+Y291bnQrKzsKKworCXNwaW5fdW5sb2NrKCZzbG9jay0+c3Bpbl9sb2NrKTsKKworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitpbnQgbWVfc2xvY2tfZXhpdChzdHJ1Y3QgbWVfc2xvY2sgKnNsb2NrLCBzdHJ1Y3QgZmlsZSAqZmlsZXApCit7CisJUERFQlVHX0xPQ0tTKCJleGVjdXRlZC5cbiIpOworCisJc3Bpbl9sb2NrKCZzbG9jay0+c3Bpbl9sb2NrKTsKKwlzbG9jay0+Y291bnQtLTsKKwlzcGluX3VubG9jaygmc2xvY2stPnNwaW5fbG9jayk7CisKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworaW50IG1lX3Nsb2NrX2xvY2soc3RydWN0IG1lX3Nsb2NrICpzbG9jaywgc3RydWN0IGZpbGUgKmZpbGVwLCBpbnQgbG9jaykKK3sKKwlQREVCVUdfTE9DS1MoImV4ZWN1dGVkLlxuIik7CisKKwlzd2l0Y2ggKGxvY2spIHsKKworCWNhc2UgTUVfTE9DS19SRUxFQVNFOgorCQlzcGluX2xvY2soJnNsb2NrLT5zcGluX2xvY2spOworCisJCWlmIChzbG9jay0+ZmlsZXAgPT0gZmlsZXApCisJCQlzbG9jay0+ZmlsZXAgPSBOVUxMOworCisJCXNwaW5fdW5sb2NrKCZzbG9jay0+c3Bpbl9sb2NrKTsKKworCQlicmVhazsKKworCWNhc2UgTUVfTE9DS19TRVQ6CisJCXNwaW5fbG9jaygmc2xvY2stPnNwaW5fbG9jayk7CisKKwkJaWYgKHNsb2NrLT5jb3VudCkgeworCQkJc3Bpbl91bmxvY2soJnNsb2NrLT5zcGluX2xvY2spOworCQkJUEVSUk9SKCJTdWJkZXZpY2UgaXMgdXNlZCBieSBhbm90aGVyIHByb2Nlc3MuXG4iKTsKKwkJCXJldHVybiBNRV9FUlJOT19VU0VEOworCQl9IGVsc2UgaWYgKHNsb2NrLT5maWxlcCA9PSBOVUxMKQorCQkJc2xvY2stPmZpbGVwID0gZmlsZXA7CisJCWVsc2UgaWYgKHNsb2NrLT5maWxlcCAhPSBmaWxlcCkgeworCQkJc3Bpbl91bmxvY2soJnNsb2NrLT5zcGluX2xvY2spOworCQkJUEVSUk9SKCJTdWJkZXZpY2UgaXMgbG9ja2VkIGJ5IGFub3RoZXIgcHJvY2Vzcy5cbiIpOworCQkJcmV0dXJuIE1FX0VSUk5PX0xPQ0tFRDsKKwkJfQorCisJCXNwaW5fdW5sb2NrKCZzbG9jay0+c3Bpbl9sb2NrKTsKKworCQlicmVhazsKKworCWNhc2UgTUVfTE9DS19DSEVDSzoKKwkJc3Bpbl9sb2NrKCZzbG9jay0+c3Bpbl9sb2NrKTsKKworCQlpZiAoc2xvY2stPmNvdW50KSB7CisJCQlzcGluX3VubG9jaygmc2xvY2stPnNwaW5fbG9jayk7CisJCQlyZXR1cm4gTUVfRVJSTk9fVVNFRDsKKwkJfSBlbHNlIGlmICgoc2xvY2stPmZpbGVwICE9IE5VTEwpICYmIChzbG9jay0+ZmlsZXAgIT0gZmlsZXApKSB7CisJCQlzcGluX3VubG9jaygmc2xvY2stPnNwaW5fbG9jayk7CisJCQlyZXR1cm4gTUVfRVJSTk9fTE9DS0VEOworCQl9CisKKwkJc3Bpbl91bmxvY2soJnNsb2NrLT5zcGluX2xvY2spOworCisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3ZvaWQgbWVfc2xvY2tfZGVpbml0KHN0cnVjdCBtZV9zbG9jayAqc2xvY2spCit7CisJUERFQlVHX0xPQ0tTKCJleGVjdXRlZC5cbiIpOworfQorCitpbnQgbWVfc2xvY2tfaW5pdChtZV9zbG9ja190ICogc2xvY2spCit7CisJUERFQlVHX0xPQ0tTKCJleGVjdXRlZC5cbiIpOworCisJc2xvY2stPmZpbGVwID0gTlVMTDsKKwlzbG9jay0+Y291bnQgPSAwOworCXNwaW5fbG9ja19pbml0KCZzbG9jay0+c3Bpbl9sb2NrKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lc2xvY2suaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZXNsb2NrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQyYjI1YwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZXNsb2NrLmgKQEAgLTAsMCArMSw3MyBAQAorLyoqCisgKiBAZmlsZSBtZXNsb2NrLmgKKyAqCisgKiBAYnJpZWYgUHJvdmlkZXMgdGhlIHN1YmRldmljZSBsb2NrIGNsYXNzLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA2IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICovCisKKyNpZm5kZWYgX01FU0xPQ0tfSF8KKyNkZWZpbmUgX01FU0xPQ0tfSF8KKworI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKy8qKgorICogQGJyaWVmIFRoZSBzdWJkZXZpY2UgbG9jayBjbGFzcy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgbWVfc2xvY2sgeworCXN0cnVjdCBmaWxlICpmaWxlcDsJCS8qKjwgUG9pbnRlciB0byBmaWxlIHN0cnVjdHVyZSBob2xkaW5nIHRoZSBzdWJkZXZpY2UuICovCisJaW50IGNvdW50OwkJCS8qKjwgTnVtYmVyIG9mIHRhc2tzIHdoaWNoIGFyZSBpbnNpZGUgdGhlIHN1YmRldmljZS4gKi8KKwlzcGlubG9ja190IHNwaW5fbG9jazsJCS8qKjwgU3BpbiBsb2NrIHByb3RlY3RpbmcgdGhlIGF0dHJpYnV0ZXMgZnJvbSBjb25jdXJyZW50IGFjY2Vzcy4gKi8KK30gbWVfc2xvY2tfdDsKKworLyoqCisgKiBAYnJpZWYgVHJpZXMgdG8gZW50ZXIgYSBzdWJkZXZpY2UuCisgKgorICogQHBhcmFtIHNsb2NrIFRoZSBzdWJkZXZpY2UgbG9jayBpbnN0YW5jZS4KKyAqIEBwYXJhbSBmaWxlcCBUaGUgZmlsZSBzdHJ1Y3R1cmUgaWRlbnRpZnlpbmcgdGhlIGNhbGxpbmcgcHJvY2Vzcy4KKyAqCisgKiBAcmV0dXJuIDAgb24gc3VjY2Vzcy4KKyAqLworaW50IG1lX3Nsb2NrX2VudGVyKHN0cnVjdCBtZV9zbG9jayAqc2xvY2ssIHN0cnVjdCBmaWxlICpmaWxlcCk7CisKKy8qKgorICogQGJyaWVmIEV4aXRzIGEgc3ViZGV2aWNlLgorICoKKyAqIEBwYXJhbSBzbG9jayBUaGUgc3ViZGV2aWNlIGxvY2sgaW5zdGFuY2UuCisgKiBAcGFyYW0gZmlsZXAgVGhlIGZpbGUgc3RydWN0dXJlIGlkZW50aWZ5aW5nIHRoZSBjYWxsaW5nIHByb2Nlc3MuCisgKgorICogQHJldHVybiAwIG9uIHN1Y2Nlc3MuCisgKi8KK2ludCBtZV9zbG9ja19leGl0KHN0cnVjdCBtZV9zbG9jayAqc2xvY2ssIHN0cnVjdCBmaWxlICpmaWxlcCk7CisKKy8qKgorICogQGJyaWVmIFRyaWVzIHRvIHBlcmZvcm0gYSBsb2NraW5nIGFjdGlvbiBvbiBhIHN1YmRldmljZS4KKyAqCisgKiBAcGFyYW0gc2xvY2sgVGhlIHN1YmRldmljZSBsb2NrIGluc3RhbmNlLgorICogQHBhcmFtIGZpbGVwIFRoZSBmaWxlIHN0cnVjdHVyZSBpZGVudGlmeWluZyB0aGUgY2FsbGluZyBwcm9jZXNzLgorICogQHBhcmFtIFRoZSBhY3Rpb24gdG8gYmUgZG9uZS4KKyAqCisgKiBAcmV0dXJuIDAgb24gc3VjY2Vzcy4KKyAqLworaW50IG1lX3Nsb2NrX2xvY2soc3RydWN0IG1lX3Nsb2NrICpzbG9jaywgc3RydWN0IGZpbGUgKmZpbGVwLCBpbnQgbG9jayk7CisKKy8qKgorICogQGJyaWVmIEluaXRpYWxpemVzIGEgbG9jayBzdHJ1Y3R1cmUuCisgKgorICogQHBhcmFtIHNsb2NrIFRoZSBsb2NrIHN0cnVjdHVyZSB0byBpbml0aWFsaXplLgorICogQHJldHVybiAwIG9uIHN1Y2Nlc3MuCisgKi8KK2ludCBtZV9zbG9ja19pbml0KG1lX3Nsb2NrX3QgKiBzbG9jayk7CisKKy8qKgorICogQGJyaWVmIERlaW5pdGlhbGl6ZXMgYSBsb2NrIHN0cnVjdHVyZS4KKyAqCisgKiBAcGFyYW0gc2xvY2sgVGhlIGxvY2sgc3RydWN0dXJlIHRvIGRlaW5pdGlhbGl6ZS4KKyAqIEByZXR1cm4gMCBvbiBzdWNjZXNzLgorICovCit2b2lkIG1lX3Nsb2NrX2RlaW5pdChtZV9zbG9ja190ICogc2xvY2spOworCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lc3ViZGV2aWNlLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWVzdWJkZXZpY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OGQ0ZjFmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lc3ViZGV2aWNlLmMKQEAgLTAsMCArMSwzMTcgQEAKKy8qKgorICogQGZpbGUgbWVzdWJkZXZpY2UuYworICoKKyAqIEBicmllZiBTdWJkZXZpY2UgYmFzZSBjbGFzcyBpbXBsZW1lbnRpb24uCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX19LRVJORUxfXworIyAgZGVmaW5lIF9fS0VSTkVMX18KKyNlbmRpZgorCisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCisjaW5jbHVkZSAibWVkZWZpbmVzLmgiCisjaW5jbHVkZSAibWVlcnJvci5oIgorCisjaW5jbHVkZSAibWVkZWJ1Zy5oIgorI2luY2x1ZGUgIm1lc3ViZGV2aWNlLmgiCisKK3N0YXRpYyBpbnQgbWVfc3ViZGV2aWNlX2lvX2lycV9zdGFydChzdHJ1Y3QgbWVfc3ViZGV2aWNlICpzdWJkZXZpY2UsCisJCQkJICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgICBpbnQgY2hhbm5lbCwKKwkJCQkgICAgIGludCBpcnFfc291cmNlLAorCQkJCSAgICAgaW50IGlycV9lZGdlLCBpbnQgaXJxX2FyZywgaW50IGZsYWdzKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwlyZXR1cm4gTUVfRVJSTk9fTk9UX1NVUFBPUlRFRDsKK30KKworc3RhdGljIGludCBtZV9zdWJkZXZpY2VfaW9faXJxX3dhaXQoc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlLAorCQkJCSAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgIGludCBjaGFubmVsLAorCQkJCSAgICBpbnQgKmlycV9jb3VudCwKKwkJCQkgICAgaW50ICp2YWx1ZSwgaW50IHRpbWVfb3V0LCBpbnQgZmxhZ3MpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCXJldHVybiBNRV9FUlJOT19OT1RfU1VQUE9SVEVEOworfQorCitzdGF0aWMgaW50IG1lX3N1YmRldmljZV9pb19pcnFfc3RvcChzdHJ1Y3QgbWVfc3ViZGV2aWNlICpzdWJkZXZpY2UsCisJCQkJICAgIHN0cnVjdCBmaWxlICpmaWxlcCwgaW50IGNoYW5uZWwsIGludCBmbGFncykKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJcmV0dXJuIE1FX0VSUk5PX05PVF9TVVBQT1JURUQ7Cit9CisKK3N0YXRpYyBpbnQgbWVfc3ViZGV2aWNlX2lvX3Jlc2V0X3N1YmRldmljZShzdHJ1Y3QgbWVfc3ViZGV2aWNlICpzdWJkZXZpY2UsCisJCQkJCSAgIHN0cnVjdCBmaWxlICpmaWxlcCwgaW50IGZsYWdzKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwlyZXR1cm4gTUVfRVJSTk9fTk9UX1NVUFBPUlRFRDsKK30KKworc3RhdGljIGludCBtZV9zdWJkZXZpY2VfaW9fc2luZ2xlX2NvbmZpZyhzdHJ1Y3QgbWVfc3ViZGV2aWNlICpzdWJkZXZpY2UsCisJCQkJCSBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJCSBpbnQgY2hhbm5lbCwKKwkJCQkJIGludCBzaW5nbGVfY29uZmlnLAorCQkJCQkgaW50IHJlZiwKKwkJCQkJIGludCB0cmlnX2NoYW4sCisJCQkJCSBpbnQgdHJpZ190eXBlLAorCQkJCQkgaW50IHRyaWdfZWRnZSwgaW50IGZsYWdzKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwlyZXR1cm4gTUVfRVJSTk9fTk9UX1NVUFBPUlRFRDsKK30KKworc3RhdGljIGludCBtZV9zdWJkZXZpY2VfaW9fc2luZ2xlX3JlYWQoc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlLAorCQkJCSAgICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgICAgIGludCBjaGFubmVsLAorCQkJCSAgICAgICBpbnQgKnZhbHVlLCBpbnQgdGltZV9vdXQsIGludCBmbGFncykKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJcmV0dXJuIE1FX0VSUk5PX05PVF9TVVBQT1JURUQ7Cit9CisKK3N0YXRpYyBpbnQgbWVfc3ViZGV2aWNlX2lvX3NpbmdsZV93cml0ZShzdHJ1Y3QgbWVfc3ViZGV2aWNlICpzdWJkZXZpY2UsCisJCQkJCXN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkJaW50IGNoYW5uZWwsCisJCQkJCWludCB2YWx1ZSwgaW50IHRpbWVfb3V0LCBpbnQgZmxhZ3MpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCXJldHVybiBNRV9FUlJOT19OT1RfU1VQUE9SVEVEOworfQorCitzdGF0aWMgaW50IG1lX3N1YmRldmljZV9pb19zdHJlYW1fY29uZmlnKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSwKKwkJCQkJIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkJIG1lSU9TdHJlYW1Db25maWdfdCAqIGNvbmZpZ19saXN0LAorCQkJCQkgaW50IGNvdW50LAorCQkJCQkgbWVJT1N0cmVhbVRyaWdnZXJfdCAqIHRyaWdnZXIsCisJCQkJCSBpbnQgZmlmb19pcnFfdGhyZXNob2xkLCBpbnQgZmxhZ3MpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCXJldHVybiBNRV9FUlJOT19OT1RfU1VQUE9SVEVEOworfQorCitzdGF0aWMgaW50IG1lX3N1YmRldmljZV9pb19zdHJlYW1fbmV3X3ZhbHVlcyhzdHJ1Y3QgbWVfc3ViZGV2aWNlICpzdWJkZXZpY2UsCisJCQkJCSAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCQkgICAgIGludCB0aW1lX291dCwKKwkJCQkJICAgICBpbnQgKmNvdW50LCBpbnQgZmxhZ3MpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCXJldHVybiBNRV9FUlJOT19OT1RfU1VQUE9SVEVEOworfQorCitzdGF0aWMgaW50IG1lX3N1YmRldmljZV9pb19zdHJlYW1fcmVhZChzdHJ1Y3QgbWVfc3ViZGV2aWNlICpzdWJkZXZpY2UsCisJCQkJICAgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgICAgaW50IHJlYWRfbW9kZSwKKwkJCQkgICAgICAgaW50ICp2YWx1ZXMsIGludCAqY291bnQsIGludCBmbGFncykKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJcmV0dXJuIE1FX0VSUk5PX05PVF9TVVBQT1JURUQ7Cit9CisKK3N0YXRpYyBpbnQgbWVfc3ViZGV2aWNlX2lvX3N0cmVhbV9zdGFydChzdHJ1Y3QgbWVfc3ViZGV2aWNlICpzdWJkZXZpY2UsCisJCQkJCXN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkJaW50IHN0YXJ0X21vZGUsIGludCB0aW1lX291dCwgaW50IGZsYWdzKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwlyZXR1cm4gTUVfRVJSTk9fTk9UX1NVUFBPUlRFRDsKK30KKworc3RhdGljIGludCBtZV9zdWJkZXZpY2VfaW9fc3RyZWFtX3N0YXR1cyhzdHJ1Y3QgbWVfc3ViZGV2aWNlICpzdWJkZXZpY2UsCisJCQkJCSBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJCSBpbnQgd2FpdCwKKwkJCQkJIGludCAqc3RhdHVzLCBpbnQgKmNvdW50LCBpbnQgZmxhZ3MpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCXJldHVybiBNRV9FUlJOT19OT1RfU1VQUE9SVEVEOworfQorCitzdGF0aWMgaW50IG1lX3N1YmRldmljZV9pb19zdHJlYW1fc3RvcChzdHJ1Y3QgbWVfc3ViZGV2aWNlICpzdWJkZXZpY2UsCisJCQkJICAgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgICAgaW50IHN0b3BfbW9kZSwgaW50IGZsYWdzKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwlyZXR1cm4gTUVfRVJSTk9fTk9UX1NVUFBPUlRFRDsKK30KKworc3RhdGljIGludCBtZV9zdWJkZXZpY2VfaW9fc3RyZWFtX3dyaXRlKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSwKKwkJCQkJc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCQlpbnQgd3JpdGVfbW9kZSwKKwkJCQkJaW50ICp2YWx1ZXMsIGludCAqY291bnQsIGludCBmbGFncykKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJcmV0dXJuIE1FX0VSUk5PX05PVF9TVVBQT1JURUQ7Cit9CisKK3N0YXRpYyBpbnQgbWVfc3ViZGV2aWNlX2xvY2tfc3ViZGV2aWNlKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsIGludCBsb2NrLCBpbnQgZmxhZ3MpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCXJldHVybiBtZV9zbG9ja19sb2NrKCZzdWJkZXZpY2UtPmxvY2ssIGZpbGVwLCBsb2NrKTsKK30KKworc3RhdGljIGludCBtZV9zdWJkZXZpY2VfcXVlcnlfbnVtYmVyX2NoYW5uZWxzKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSwKKwkJCQkJICAgICAgaW50ICpudW1iZXIpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCXJldHVybiBNRV9FUlJOT19OT1RfU1VQUE9SVEVEOworfQorCitzdGF0aWMgaW50IG1lX3N1YmRldmljZV9xdWVyeV9udW1iZXJfcmFuZ2VzKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSwKKwkJCQkJICAgIGludCB1bml0LCBpbnQgKmNvdW50KQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwlyZXR1cm4gTUVfRVJSTk9fTk9UX1NVUFBPUlRFRDsKK30KKworc3RhdGljIGludCBtZV9zdWJkZXZpY2VfcXVlcnlfcmFuZ2VfYnlfbWluX21heChzdHJ1Y3QgbWVfc3ViZGV2aWNlICpzdWJkZXZpY2UsCisJCQkJCSAgICAgICBpbnQgdW5pdCwKKwkJCQkJICAgICAgIGludCAqbWluLAorCQkJCQkgICAgICAgaW50ICptYXgsCisJCQkJCSAgICAgICBpbnQgKm1heGRhdGEsIGludCAqcmFuZ2UpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCXJldHVybiBNRV9FUlJOT19OT1RfU1VQUE9SVEVEOworfQorCitzdGF0aWMgaW50IG1lX3N1YmRldmljZV9xdWVyeV9yYW5nZV9pbmZvKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSwKKwkJCQkJIGludCByYW5nZSwKKwkJCQkJIGludCAqdW5pdCwKKwkJCQkJIGludCAqbWluLCBpbnQgKm1heCwgaW50ICptYXhkYXRhKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwlyZXR1cm4gTUVfRVJSTk9fTk9UX1NVUFBPUlRFRDsKK30KKworc3RhdGljIGludCBtZV9zdWJkZXZpY2VfcXVlcnlfc3ViZGV2aWNlX3R5cGUoc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlLAorCQkJCQkgICAgIGludCAqdHlwZSwgaW50ICpzdWJ0eXBlKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwlyZXR1cm4gTUVfRVJSTk9fTk9UX1NVUFBPUlRFRDsKK30KKworc3RhdGljIGludCBtZV9zdWJkZXZpY2VfcXVlcnlfc3ViZGV2aWNlX2NhcHMoc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlLAorCQkJCQkgICAgIGludCAqY2FwcykKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJKmNhcHMgPSAwOworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lX3N1YmRldmljZV9xdWVyeV9zdWJkZXZpY2VfY2Fwc19hcmdzKHN0cnVjdCBtZV9zdWJkZXZpY2UKKwkJCQkJCSAgKnN1YmRldmljZSwgaW50IGNhcCwKKwkJCQkJCSAgaW50ICphcmdzLCBpbnQgY291bnQpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCXJldHVybiBNRV9FUlJOT19OT1RfU1VQUE9SVEVEOworfQorCitzdGF0aWMgaW50IG1lX3N1YmRldmljZV9xdWVyeV90aW1lcihzdHJ1Y3QgbWVfc3ViZGV2aWNlICpzdWJkZXZpY2UsCisJCQkJICAgIGludCB0aW1lciwKKwkJCQkgICAgaW50ICpiYXNlX2ZyZXF1ZW5jeSwKKwkJCQkgICAgbG9uZyBsb25nICptaW5fdGlja3MsIGxvbmcgbG9uZyAqbWF4X3RpY2tzKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwlyZXR1cm4gTUVfRVJSTk9fTk9UX1NVUFBPUlRFRDsKK30KKworc3RhdGljIGludCBtZV9zdWJkZXZpY2VfY29uZmlnX2xvYWQoc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlLAorCQkJCSAgICBtZV9jZmdfZGV2aWNlX2VudHJ5X3QgKiBjb25maWcpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgdm9pZCBtZV9zdWJkZXZpY2VfZGVzdHJ1Y3RvcihzdHJ1Y3QgbWVfc3ViZGV2aWNlICpzdWJkZXZpY2UpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCW1lX3N1YmRldmljZV9kZWluaXQoc3ViZGV2aWNlKTsKKwlrZnJlZShzdWJkZXZpY2UpOworfQorCitpbnQgbWVfc3ViZGV2aWNlX2luaXQobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UpCit7CisJaW50IGVycjsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCS8qIEluaXQgbGlzdCBoZWFkICovCisJSU5JVF9MSVNUX0hFQUQoJnN1YmRldmljZS0+bGlzdCk7CisKKwkvKiBJbml0aWFsaXplIHRoZSBzdWJkZXZpY2UgbG9jayBpbnN0YW5jZSAqLworCisJZXJyID0gbWVfc2xvY2tfaW5pdCgmc3ViZGV2aWNlLT5sb2NrKTsKKworCWlmIChlcnIpIHsKKwkJUEVSUk9SKCJDYW5ub3QgaW5pdGlhbGl6ZSBzdWJkZXZpY2UgbG9jayBpbnN0YW5jZS5cbiIpOworCQlyZXR1cm4gMTsKKwl9CisKKwkvKiBTdWJkZXZpY2UgYmFzZSBjbGFzcyBtZXRob2RzICovCisJc3ViZGV2aWNlLT5tZV9zdWJkZXZpY2VfaW9faXJxX3N0YXJ0ID0gbWVfc3ViZGV2aWNlX2lvX2lycV9zdGFydDsKKwlzdWJkZXZpY2UtPm1lX3N1YmRldmljZV9pb19pcnFfd2FpdCA9IG1lX3N1YmRldmljZV9pb19pcnFfd2FpdDsKKwlzdWJkZXZpY2UtPm1lX3N1YmRldmljZV9pb19pcnFfc3RvcCA9IG1lX3N1YmRldmljZV9pb19pcnFfc3RvcDsKKwlzdWJkZXZpY2UtPm1lX3N1YmRldmljZV9pb19yZXNldF9zdWJkZXZpY2UgPQorCSAgICBtZV9zdWJkZXZpY2VfaW9fcmVzZXRfc3ViZGV2aWNlOworCXN1YmRldmljZS0+bWVfc3ViZGV2aWNlX2lvX3NpbmdsZV9jb25maWcgPQorCSAgICBtZV9zdWJkZXZpY2VfaW9fc2luZ2xlX2NvbmZpZzsKKwlzdWJkZXZpY2UtPm1lX3N1YmRldmljZV9pb19zaW5nbGVfcmVhZCA9IG1lX3N1YmRldmljZV9pb19zaW5nbGVfcmVhZDsKKwlzdWJkZXZpY2UtPm1lX3N1YmRldmljZV9pb19zaW5nbGVfd3JpdGUgPSBtZV9zdWJkZXZpY2VfaW9fc2luZ2xlX3dyaXRlOworCXN1YmRldmljZS0+bWVfc3ViZGV2aWNlX2lvX3N0cmVhbV9jb25maWcgPQorCSAgICBtZV9zdWJkZXZpY2VfaW9fc3RyZWFtX2NvbmZpZzsKKwlzdWJkZXZpY2UtPm1lX3N1YmRldmljZV9pb19zdHJlYW1fbmV3X3ZhbHVlcyA9CisJICAgIG1lX3N1YmRldmljZV9pb19zdHJlYW1fbmV3X3ZhbHVlczsKKwlzdWJkZXZpY2UtPm1lX3N1YmRldmljZV9pb19zdHJlYW1fcmVhZCA9IG1lX3N1YmRldmljZV9pb19zdHJlYW1fcmVhZDsKKwlzdWJkZXZpY2UtPm1lX3N1YmRldmljZV9pb19zdHJlYW1fc3RhcnQgPSBtZV9zdWJkZXZpY2VfaW9fc3RyZWFtX3N0YXJ0OworCXN1YmRldmljZS0+bWVfc3ViZGV2aWNlX2lvX3N0cmVhbV9zdGF0dXMgPQorCSAgICBtZV9zdWJkZXZpY2VfaW9fc3RyZWFtX3N0YXR1czsKKwlzdWJkZXZpY2UtPm1lX3N1YmRldmljZV9pb19zdHJlYW1fc3RvcCA9IG1lX3N1YmRldmljZV9pb19zdHJlYW1fc3RvcDsKKwlzdWJkZXZpY2UtPm1lX3N1YmRldmljZV9pb19zdHJlYW1fd3JpdGUgPSBtZV9zdWJkZXZpY2VfaW9fc3RyZWFtX3dyaXRlOworCXN1YmRldmljZS0+bWVfc3ViZGV2aWNlX2xvY2tfc3ViZGV2aWNlID0gbWVfc3ViZGV2aWNlX2xvY2tfc3ViZGV2aWNlOworCXN1YmRldmljZS0+bWVfc3ViZGV2aWNlX3F1ZXJ5X251bWJlcl9jaGFubmVscyA9CisJICAgIG1lX3N1YmRldmljZV9xdWVyeV9udW1iZXJfY2hhbm5lbHM7CisJc3ViZGV2aWNlLT5tZV9zdWJkZXZpY2VfcXVlcnlfbnVtYmVyX3JhbmdlcyA9CisJICAgIG1lX3N1YmRldmljZV9xdWVyeV9udW1iZXJfcmFuZ2VzOworCXN1YmRldmljZS0+bWVfc3ViZGV2aWNlX3F1ZXJ5X3JhbmdlX2J5X21pbl9tYXggPQorCSAgICBtZV9zdWJkZXZpY2VfcXVlcnlfcmFuZ2VfYnlfbWluX21heDsKKwlzdWJkZXZpY2UtPm1lX3N1YmRldmljZV9xdWVyeV9yYW5nZV9pbmZvID0KKwkgICAgbWVfc3ViZGV2aWNlX3F1ZXJ5X3JhbmdlX2luZm87CisJc3ViZGV2aWNlLT5tZV9zdWJkZXZpY2VfcXVlcnlfc3ViZGV2aWNlX3R5cGUgPQorCSAgICBtZV9zdWJkZXZpY2VfcXVlcnlfc3ViZGV2aWNlX3R5cGU7CisJc3ViZGV2aWNlLT5tZV9zdWJkZXZpY2VfcXVlcnlfc3ViZGV2aWNlX2NhcHMgPQorCSAgICBtZV9zdWJkZXZpY2VfcXVlcnlfc3ViZGV2aWNlX2NhcHM7CisJc3ViZGV2aWNlLT5tZV9zdWJkZXZpY2VfcXVlcnlfc3ViZGV2aWNlX2NhcHNfYXJncyA9CisJICAgIG1lX3N1YmRldmljZV9xdWVyeV9zdWJkZXZpY2VfY2Fwc19hcmdzOworCXN1YmRldmljZS0+bWVfc3ViZGV2aWNlX3F1ZXJ5X3RpbWVyID0gbWVfc3ViZGV2aWNlX3F1ZXJ5X3RpbWVyOworCXN1YmRldmljZS0+bWVfc3ViZGV2aWNlX2NvbmZpZ19sb2FkID0gbWVfc3ViZGV2aWNlX2NvbmZpZ19sb2FkOworCXN1YmRldmljZS0+bWVfc3ViZGV2aWNlX2Rlc3RydWN0b3IgPSBtZV9zdWJkZXZpY2VfZGVzdHJ1Y3RvcjsKKworCXJldHVybiAwOworfQorCit2b2lkIG1lX3N1YmRldmljZV9kZWluaXQobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCW1lX3N1YmRldmljZV9pb19yZXNldF9zdWJkZXZpY2Uoc3ViZGV2aWNlLCBOVUxMLAorCQkJCQlNRV9JT19SRVNFVF9TVUJERVZJQ0VfTk9fRkxBR1MpOworCW1lX3Nsb2NrX2RlaW5pdCgmc3ViZGV2aWNlLT5sb2NrKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZXN1YmRldmljZS5oIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lc3ViZGV2aWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTllYzJiNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZXN1YmRldmljZS5oCkBAIC0wLDAgKzEsMTk3IEBACisvKioKKyAqIEBmaWxlIG1lc3ViZGV2aWNlLmgKKyAqCisgKiBAYnJpZWYgUHJvdmlkZXMgdGhlIHN1YmRldmljZSBiYXNlIGNsYXNzLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICovCisKKyNpZm5kZWYgX01FU1VCREVWSUNFX0hfCisjZGVmaW5lIF9NRVNVQkRFVklDRV9IXworCisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorCisjaW5jbHVkZSAibWV0eXBlcy5oIgorI2luY2x1ZGUgIm1laW9jdGwuaCIKKyNpbmNsdWRlICJtZXNsb2NrLmgiCisKKyMgaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKy8qKgorICogQGJyaWVmIE1hY3JvIHVzZWQgdG8gZW50ZXIgYSBzdWJkZXZpY2UuCisgKi8KKyNkZWZpbmUgTUVfU1VCREVWSUNFX0VOVEVSCVwKK3sgXAorCWludCBlcnI7IFwKKwllcnIgPSBtZV9zbG9ja19lbnRlcigmaW5zdGFuY2UtPmJhc2UubG9jaywgZmlsZXApOyBcCisJaWYoZXJyKXsgXAorCQlQRVJST1IoIkNhbm5vdCBlbnRlciBzdWJkZXZpY2UuXG4iKTsgXAorCQlyZXR1cm4gZXJyOyBcCisJfSBcCit9CisKKy8qKgorICogQGJyaWVmIE1hY3JvIHVzZWQgdG8gZXhpdCBhIHN1YmRldmljZS4KKyAqLworI2RlZmluZSBNRV9TVUJERVZJQ0VfRVhJVAlcCit7XAorCWludCBlcnI7IFwKKwllcnIgPSBtZV9zbG9ja19leGl0KCZpbnN0YW5jZS0+YmFzZS5sb2NrLCBmaWxlcCk7IFwKKwlpZihlcnIpeyBcCisJCVBFUlJPUigiQ2Fubm90IGV4aXQgc3ViZGV2aWNlLlxuIik7IFwKKwkJcmV0dXJuIGVycjsgXAorCX0gXAorfQorCisvKioKKyAqIEBicmllZiBUaGUgc3ViZGV2aWNlIGJhc2UgY2xhc3MuCisgKi8KK3R5cGVkZWYgc3RydWN0IG1lX3N1YmRldmljZSB7CisJLyogQXR0cmlidXRlcyAqLworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsJCS8qKjwgRW5hYmxlcyB0aGUgc3ViZGV2aWNlIHRvIGJlIGFkZGVkIHRvIGEgZHluYW1pYyBsaXN0LiAqLworCW1lX3Nsb2NrX3QgbG9jazsJCS8qKjwgVXNlZCBieSB1c2VyIGFwcGxpY2F0aW9uIGluIG9yZGVyIHRvIGxvY2sgdGhlIHN1YmRldmljZSBmb3IgZXhjbHVzaXZlIHVzYWdlLiAqLworCisJLyogTWV0aG9kcyAqLworCWludCAoKm1lX3N1YmRldmljZV9pb19pcnFfc3RhcnQpIChzdHJ1Y3QgbWVfc3ViZGV2aWNlICogc3ViZGV2aWNlLAorCQkJCQkgIHN0cnVjdCBmaWxlICogZmlsZXAsCisJCQkJCSAgaW50IGNoYW5uZWwsCisJCQkJCSAgaW50IGlycV9zb3VyY2UsCisJCQkJCSAgaW50IGlycV9lZGdlLCBpbnQgaXJxX2FyZywgaW50IGZsYWdzKTsKKworCWludCAoKm1lX3N1YmRldmljZV9pb19pcnFfd2FpdCkgKHN0cnVjdCBtZV9zdWJkZXZpY2UgKiBzdWJkZXZpY2UsCisJCQkJCSBzdHJ1Y3QgZmlsZSAqIGZpbGVwLAorCQkJCQkgaW50IGNoYW5uZWwsCisJCQkJCSBpbnQgKmlycV9jb3VudCwKKwkJCQkJIGludCAqdmFsdWUsIGludCB0aW1lX291dCwgaW50IGZsYWdzKTsKKworCWludCAoKm1lX3N1YmRldmljZV9pb19pcnFfc3RvcCkgKHN0cnVjdCBtZV9zdWJkZXZpY2UgKiBzdWJkZXZpY2UsCisJCQkJCSBzdHJ1Y3QgZmlsZSAqIGZpbGVwLAorCQkJCQkgaW50IGNoYW5uZWwsIGludCBmbGFncyk7CisKKwlpbnQgKCptZV9zdWJkZXZpY2VfaW9fcmVzZXRfc3ViZGV2aWNlKSAoc3RydWN0IG1lX3N1YmRldmljZSAqIHN1YmRldmljZSwKKwkJCQkJCXN0cnVjdCBmaWxlICogZmlsZXAsIGludCBmbGFncyk7CisKKwlpbnQgKCptZV9zdWJkZXZpY2VfaW9fc2luZ2xlX2NvbmZpZykgKHN0cnVjdCBtZV9zdWJkZXZpY2UgKiBzdWJkZXZpY2UsCisJCQkJCSAgICAgIHN0cnVjdCBmaWxlICogZmlsZXAsCisJCQkJCSAgICAgIGludCBjaGFubmVsLAorCQkJCQkgICAgICBpbnQgc2luZ2xlX2NvbmZpZywKKwkJCQkJICAgICAgaW50IHJlZiwKKwkJCQkJICAgICAgaW50IHRyaWdfY2hhbiwKKwkJCQkJICAgICAgaW50IHRyaWdfdHlwZSwKKwkJCQkJICAgICAgaW50IHRyaWdfZWRnZSwgaW50IGZsYWdzKTsKKworCWludCAoKm1lX3N1YmRldmljZV9pb19zaW5nbGVfcmVhZCkgKHN0cnVjdCBtZV9zdWJkZXZpY2UgKiBzdWJkZXZpY2UsCisJCQkJCSAgICBzdHJ1Y3QgZmlsZSAqIGZpbGVwLAorCQkJCQkgICAgaW50IGNoYW5uZWwsCisJCQkJCSAgICBpbnQgKnZhbHVlLAorCQkJCQkgICAgaW50IHRpbWVfb3V0LCBpbnQgZmxhZ3MpOworCisJaW50ICgqbWVfc3ViZGV2aWNlX2lvX3NpbmdsZV93cml0ZSkgKHN0cnVjdCBtZV9zdWJkZXZpY2UgKiBzdWJkZXZpY2UsCisJCQkJCSAgICAgc3RydWN0IGZpbGUgKiBmaWxlcCwKKwkJCQkJICAgICBpbnQgY2hhbm5lbCwKKwkJCQkJICAgICBpbnQgdmFsdWUsCisJCQkJCSAgICAgaW50IHRpbWVfb3V0LCBpbnQgZmxhZ3MpOworCisJaW50ICgqbWVfc3ViZGV2aWNlX2lvX3N0cmVhbV9jb25maWcpIChzdHJ1Y3QgbWVfc3ViZGV2aWNlICogc3ViZGV2aWNlLAorCQkJCQkgICAgICBzdHJ1Y3QgZmlsZSAqIGZpbGVwLAorCQkJCQkgICAgICBtZUlPU3RyZWFtQ29uZmlnX3QgKiBjb25maWdfbGlzdCwKKwkJCQkJICAgICAgaW50IGNvdW50LAorCQkJCQkgICAgICBtZUlPU3RyZWFtVHJpZ2dlcl90ICogdHJpZ2dlciwKKwkJCQkJICAgICAgaW50IGZpZm9faXJxX3RocmVzaG9sZCwKKwkJCQkJICAgICAgaW50IGZsYWdzKTsKKworCWludCAoKm1lX3N1YmRldmljZV9pb19zdHJlYW1fbmV3X3ZhbHVlcykgKHN0cnVjdCBtZV9zdWJkZXZpY2UgKgorCQkJCQkJICBzdWJkZXZpY2UsCisJCQkJCQkgIHN0cnVjdCBmaWxlICogZmlsZXAsCisJCQkJCQkgIGludCB0aW1lX291dCwgaW50ICpjb3VudCwKKwkJCQkJCSAgaW50IGZsYWdzKTsKKworCWludCAoKm1lX3N1YmRldmljZV9pb19zdHJlYW1fcmVhZCkgKHN0cnVjdCBtZV9zdWJkZXZpY2UgKiBzdWJkZXZpY2UsCisJCQkJCSAgICBzdHJ1Y3QgZmlsZSAqIGZpbGVwLAorCQkJCQkgICAgaW50IHJlYWRfbW9kZSwKKwkJCQkJICAgIGludCAqdmFsdWVzLCBpbnQgKmNvdW50LCBpbnQgZmxhZ3MpOworCisJaW50ICgqbWVfc3ViZGV2aWNlX2lvX3N0cmVhbV9zdGFydCkgKHN0cnVjdCBtZV9zdWJkZXZpY2UgKiBzdWJkZXZpY2UsCisJCQkJCSAgICAgc3RydWN0IGZpbGUgKiBmaWxlcCwKKwkJCQkJICAgICBpbnQgc3RhcnRfbW9kZSwKKwkJCQkJICAgICBpbnQgdGltZV9vdXQsIGludCBmbGFncyk7CisKKwlpbnQgKCptZV9zdWJkZXZpY2VfaW9fc3RyZWFtX3N0YXR1cykgKHN0cnVjdCBtZV9zdWJkZXZpY2UgKiBzdWJkZXZpY2UsCisJCQkJCSAgICAgIHN0cnVjdCBmaWxlICogZmlsZXAsCisJCQkJCSAgICAgIGludCB3YWl0LAorCQkJCQkgICAgICBpbnQgKnN0YXR1cywKKwkJCQkJICAgICAgaW50ICpjb3VudCwgaW50IGZsYWdzKTsKKworCWludCAoKm1lX3N1YmRldmljZV9pb19zdHJlYW1fc3RvcCkgKHN0cnVjdCBtZV9zdWJkZXZpY2UgKiBzdWJkZXZpY2UsCisJCQkJCSAgICBzdHJ1Y3QgZmlsZSAqIGZpbGVwLAorCQkJCQkgICAgaW50IHN0b3BfbW9kZSwgaW50IGZsYWdzKTsKKworCWludCAoKm1lX3N1YmRldmljZV9pb19zdHJlYW1fd3JpdGUpIChzdHJ1Y3QgbWVfc3ViZGV2aWNlICogc3ViZGV2aWNlLAorCQkJCQkgICAgIHN0cnVjdCBmaWxlICogZmlsZXAsCisJCQkJCSAgICAgaW50IHdyaXRlX21vZGUsCisJCQkJCSAgICAgaW50ICp2YWx1ZXMsCisJCQkJCSAgICAgaW50ICpjb3VudCwgaW50IGZsYWdzKTsKKworCWludCAoKm1lX3N1YmRldmljZV9sb2NrX3N1YmRldmljZSkgKHN0cnVjdCBtZV9zdWJkZXZpY2UgKiBzdWJkZXZpY2UsCisJCQkJCSAgICBzdHJ1Y3QgZmlsZSAqIGZpbGVwLAorCQkJCQkgICAgaW50IGxvY2ssIGludCBmbGFncyk7CisKKwlpbnQgKCptZV9zdWJkZXZpY2VfcXVlcnlfbnVtYmVyX2NoYW5uZWxzKSAoc3RydWN0IG1lX3N1YmRldmljZSAqCisJCQkJCQkgICBzdWJkZXZpY2UsIGludCAqbnVtYmVyKTsKKworCWludCAoKm1lX3N1YmRldmljZV9xdWVyeV9udW1iZXJfcmFuZ2VzKSAoc3RydWN0IG1lX3N1YmRldmljZSAqCisJCQkJCQkgc3ViZGV2aWNlLCBpbnQgdW5pdCwKKwkJCQkJCSBpbnQgKmNvdW50KTsKKworCWludCAoKm1lX3N1YmRldmljZV9xdWVyeV9yYW5nZV9ieV9taW5fbWF4KSAoc3RydWN0IG1lX3N1YmRldmljZSAqCisJCQkJCQkgICAgc3ViZGV2aWNlLCBpbnQgdW5pdCwKKwkJCQkJCSAgICBpbnQgKm1pbiwgaW50ICptYXgsCisJCQkJCQkgICAgaW50ICptYXhkYXRhLCBpbnQgKnJhbmdlKTsKKworCWludCAoKm1lX3N1YmRldmljZV9xdWVyeV9yYW5nZV9pbmZvKSAoc3RydWN0IG1lX3N1YmRldmljZSAqIHN1YmRldmljZSwKKwkJCQkJICAgICAgaW50IHJhbmdlLAorCQkJCQkgICAgICBpbnQgKnVuaXQsCisJCQkJCSAgICAgIGludCAqbWluLCBpbnQgKm1heCwgaW50ICptYXhkYXRhKTsKKworCWludCAoKm1lX3N1YmRldmljZV9xdWVyeV9zdWJkZXZpY2VfdHlwZSkgKHN0cnVjdCBtZV9zdWJkZXZpY2UgKgorCQkJCQkJICBzdWJkZXZpY2UsIGludCAqdHlwZSwKKwkJCQkJCSAgaW50ICpzdWJ0eXBlKTsKKworCWludCAoKm1lX3N1YmRldmljZV9xdWVyeV9zdWJkZXZpY2VfY2FwcykgKHN0cnVjdCBtZV9zdWJkZXZpY2UgKgorCQkJCQkJICBzdWJkZXZpY2UsIGludCAqY2Fwcyk7CisKKwlpbnQgKCptZV9zdWJkZXZpY2VfcXVlcnlfc3ViZGV2aWNlX2NhcHNfYXJncykgKHN0cnVjdCBtZV9zdWJkZXZpY2UgKgorCQkJCQkJICAgICAgIHN1YmRldmljZSwgaW50IGNhcCwKKwkJCQkJCSAgICAgICBpbnQgKmFyZ3MsIGludCBjb3VudCk7CisKKwlpbnQgKCptZV9zdWJkZXZpY2VfcXVlcnlfdGltZXIpIChzdHJ1Y3QgbWVfc3ViZGV2aWNlICogc3ViZGV2aWNlLAorCQkJCQkgaW50IHRpbWVyLAorCQkJCQkgaW50ICpiYXNlX2ZyZXF1ZW5jeSwKKwkJCQkJIGxvbmcgbG9uZyAqbWluX3RpY2tzLAorCQkJCQkgbG9uZyBsb25nICptYXhfdGlja3MpOworCisJaW50ICgqbWVfc3ViZGV2aWNlX2NvbmZpZ19sb2FkKSAoc3RydWN0IG1lX3N1YmRldmljZSAqIHN1YmRldmljZSwKKwkJCQkJIG1lX2NmZ19kZXZpY2VfZW50cnlfdCAqIGNvbmZpZyk7CisKKwl2b2lkICgqbWVfc3ViZGV2aWNlX2Rlc3RydWN0b3IpIChzdHJ1Y3QgbWVfc3ViZGV2aWNlICogc3ViZGV2aWNlKTsKK30gbWVfc3ViZGV2aWNlX3Q7CisKKy8qKgorICogQGJyaWVmIEluaXRpYWxpemVzIGEgc3ViZGV2aWNlIHN0cnVjdHVyZS4KKyAqCisgKiBAcGFyYW0gc3ViZGV2aWNlIFRoZSBzdWJkZXZpY2Ugc3RydWN0dXJlIHRvIGluaXRpYWxpemUuCisgKiBAcmV0dXJuIDAgb24gc3VjY2Vzcy4KKyAqLworaW50IG1lX3N1YmRldmljZV9pbml0KG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlKTsKKworLyoqCisgKiBAYnJpZWYgRGVpbml0aWFsaXplcyBhIHN1YmRldmljZSBzdHJ1Y3R1cmUuCisgKgorICogQHBhcmFtIHN1YmRldmljZSBUaGUgc3ViZGV2aWNlIHN0cnVjdHVyZSB0byBpbml0aWFsaXplLgorICovCit2b2lkIG1lX3N1YmRldmljZV9kZWluaXQobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UpOworCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21ldGVtcGxfZGV2aWNlLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWV0ZW1wbF9kZXZpY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDg2MzJkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21ldGVtcGxfZGV2aWNlLmMKQEAgLTAsMCArMSwxMzcgQEAKKy8qKgorICogQGZpbGUgbWV0ZW1wbF9kZXZpY2UuYworICoKKyAqIEBicmllZiB0ZW1wbGF0ZSBkZXZpY2UgY2xhc3MgaW1wbGVtZW50YXRpb24uCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0tFUk5FTF9fCisjICBkZWZpbmUgX19LRVJORUxfXworI2VuZGlmCisKKyNpZm5kZWYgTU9EVUxFCisjICBkZWZpbmUgTU9EVUxFCisjZW5kaWYKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCisjaW5jbHVkZSA8bWVpZHMuaD4KKyNpbmNsdWRlICJtZWVycm9yLmgiCisjaW5jbHVkZSAibWVjb21tb24uaCIKKyNpbmNsdWRlICJtZWludGVybmFsLmgiCisKKyNpbmNsdWRlICJtZWRlYnVnLmgiCisjaW5jbHVkZSAibWVkZXZpY2UuaCIKKyNpbmNsdWRlICJtZXRlbXBsX2RldmljZS5oIgorI2luY2x1ZGUgIm1lc3ViZGV2aWNlLmgiCisjaW5jbHVkZSAibWV0ZW1wbF9zdWIuaCIKKworbWVfZGV2aWNlX3QgKm1ldGVtcGxfcGNpX2NvbnN0cnVjdG9yKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2aWNlKQoreworCW1ldGVtcGxfZGV2aWNlX3QgKm1ldGVtcGxfZGV2aWNlOworCW1lX3N1YmRldmljZV90ICpzdWJkZXZpY2U7CisJdW5zaWduZWQgaW50IHZlcnNpb25faWR4OworCWludCBlcnI7CisJaW50IGk7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwkvLyBBbGxvY2F0ZSBzdHJ1Y3R1cmUgZm9yIGRldmljZSBpbnN0YW5jZS4KKwltZXRlbXBsX2RldmljZSA9IGttYWxsb2Moc2l6ZW9mKG1ldGVtcGxfZGV2aWNlX3QpLCBHRlBfS0VSTkVMKTsKKworCWlmICghbWV0ZW1wbF9kZXZpY2UpIHsKKwkJUEVSUk9SKCJDYW5ub3QgZ2V0IG1lbW9yeSBmb3IgZGV2aWNlIGluc3RhbmNlLlxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCW1lbXNldChtZXRlbXBsX2RldmljZSwgMCwgc2l6ZW9mKG1ldGVtcGxfZGV2aWNlX3QpKTsKKworCS8vIEluaXRpYWxpemUgYmFzZSBjbGFzcyBzdHJ1Y3R1cmUuCisJZXJyID0gbWVfZGV2aWNlX3BjaV9pbml0KChtZV9kZXZpY2VfdCAqKSBtZXRlbXBsX2RldmljZSwgcGNpX2RldmljZSk7CisKKwlpZiAoZXJyKSB7CisJCWtmcmVlKG1ldGVtcGxfZGV2aWNlKTsKKwkJUEVSUk9SKCJDYW5ub3QgaW5pdGlhbGl6ZSBkZXZpY2UgYmFzZSBjbGFzcy5cbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKiBHZXQgdGhlIGluZGV4IGluIHRoZSBkZXZpY2UgdmVyc2lvbiBpbmZvcm1hdGlvbiB0YWJsZS4gKi8KKwl2ZXJzaW9uX2lkeCA9CisJICAgIG1ldGVtcGxfdmVyc2lvbnNfZ2V0X2RldmljZV9pbmRleChtZXRlbXBsX2RldmljZS0+YmFzZS5pbmZvLnBjaS4KKwkJCQkJICAgICAgZGV2aWNlX2lkKTsKKworCS8vIEluaXRpYWxpemUgc3BpbiBsb2NrIC4KKwlzcGluX2xvY2tfaW5pdCgmbWV0ZW1wbF9kZXZpY2UtPmN0cmxfcmVnX2xvY2spOworCisJLy8gQ3JlYXRlIHN1YmRldmljZSBpbnN0YW5jZXMuCisJZm9yIChpID0gMDsgaSA8IG1ldGVtcGxfdmVyc2lvbnNbdmVyc2lvbl9pZHhdLnN1YmRldmljZXM7IGkrKykgeworCQlzdWJkZXZpY2UgPQorCQkgICAgKG1lX3N1YmRldmljZV90ICopIG1ldGVtcGxfc3ViX2NvbnN0cnVjdG9yKG1ldGVtcGxfZGV2aWNlLT4KKwkJCQkJCQkgICAgICAgYmFzZS5pbmZvLnBjaS4KKwkJCQkJCQkgICAgICAgcmVnX2Jhc2VzWzJdLCBpLAorCQkJCQkJCSAgICAgICAmbWV0ZW1wbF9kZXZpY2UtPgorCQkJCQkJCSAgICAgICBjdHJsX3JlZ19sb2NrKTsKKworCQlpZiAoIXN1YmRldmljZSkgeworCQkJbWVfZGV2aWNlX2RlaW5pdCgobWVfZGV2aWNlX3QgKikgbWV0ZW1wbF9kZXZpY2UpOworCQkJa2ZyZWUobWV0ZW1wbF9kZXZpY2UpOworCQkJUEVSUk9SKCJDYW5ub3QgZ2V0IG1lbW9yeSBmb3Igc3ViZGV2aWNlLlxuIik7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJCW1lX3NsaXN0X2FkZF9zdWJkZXZpY2VfdGFpbCgmbWV0ZW1wbF9kZXZpY2UtPmJhc2Uuc2xpc3QsCisJCQkJCSAgICBzdWJkZXZpY2UpOworCX0KKworCS8qIE92ZXJ3cml0ZSBiYXNlIGNsYXNzIG1ldGhvZHMgaWYgYXBwbGljYWJsZS4gKi8KKworCXJldHVybiAobWVfZGV2aWNlX3QgKikgbWV0ZW1wbF9kZXZpY2U7Cit9CisKKy8vIEluaXQgYW5kIGV4aXQgb2YgbW9kdWxlLgorCitzdGF0aWMgaW50IF9faW5pdCBtZXRlbXBsX2luaXQodm9pZCkKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuLiIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgbWV0ZW1wbF9leGl0KHZvaWQpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbi4iKTsKK30KKworbW9kdWxlX2luaXQobWV0ZW1wbF9pbml0KTsKKworbW9kdWxlX2V4aXQobWV0ZW1wbF9leGl0KTsKKworLy8gQWRtaW5pc3RyYXRpdmUgc3R1ZmYgZm9yIG1vZGluZm8uCitNT0RVTEVfQVVUSE9SKCJHdWVudGVyIEdlYmhhcmR0IDxnLmdlYmhhcmR0QG1laWxoYXVzLmRlPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJEZXZpY2UgRHJpdmVyIE1vZHVsZSBmb3IgVGVtcGxhdGUgRGV2aWNlIik7CitNT0RVTEVfU1VQUE9SVEVEX0RFVklDRSgiTWVpbGhhdXMgVGVtcGxhdGUgRGV2aWNlcyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisvLyBFeHBvcnQgdGhlIGNvbnN0cnVjdG9yLgorRVhQT1JUX1NZTUJPTChtZXRlbXBsX3BjaV9jb25zdHJ1Y3Rvcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWV0ZW1wbF9kZXZpY2UuaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZXRlbXBsX2RldmljZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjMzcwMmMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWV0ZW1wbF9kZXZpY2UuaApAQCAtMCwwICsxLDkyIEBACisvKioKKyAqIEBmaWxlIG1ldGVtcGxfZGV2aWNlLmgKKyAqCisgKiBAYnJpZWYgdGVtcGxhdGUgZGV2aWNlIGNsYXNzLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX01FVEVNUExfREVWSUNFX0gKKyNkZWZpbmUgX01FVEVNUExfREVWSUNFX0gKKworI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisKKyNpbmNsdWRlICJtZWRldmljZS5oIgorCisjaWZkZWYgX19LRVJORUxfXworCisvKioKKyAqIEBicmllZiBTdHJ1Y3R1cmUgaG9sZGluZyB0ZW1wbGF0ZSBkZXZpY2UgY2FwYWJpbGl0aWVzLgorICovCit0eXBlZGVmIHN0cnVjdCBtZXRlbXBsX3ZlcnNpb24geworCXVpbnQxNl90IGRldmljZV9pZDsKKwl1bnNpZ25lZCBpbnQgc3ViZGV2aWNlczsKK30gbWV0ZW1wbF92ZXJzaW9uX3Q7CisKKy8qKgorICogQGJyaWVmIERldmljZSBjYXBhYmlsaXRpZXMuCisgKi8KK3N0YXRpYyBtZXRlbXBsX3ZlcnNpb25fdCBtZXRlbXBsX3ZlcnNpb25zW10gPSB7CisJezB4REVBRCwgMX0sCisJezB9LAorfTsKKworI2RlZmluZSBNRVRFTVBMX0RFVklDRV9WRVJTSU9OUyAoc2l6ZW9mKG1ldGVtcGxfdmVyc2lvbnMpIC8gc2l6ZW9mKG1ldGVtcGxfdmVyc2lvbl90KSAtIDEpIC8qKjwgUmV0dXJucyB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaW4gI21ldGVtcGxfdmVyc2lvbnMuICovCisKKy8qKgorICogQGJyaWVmIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBkZXZpY2UgZW50cnkgaW4gI21ldGVtcGxfdmVyc2lvbnMuCisgKgorICogQHBhcmFtIGRldmljZV9pZCBUaGUgUENJIGRldmljZSBpZCBvZiB0aGUgZGV2aWNlIHRvIHF1ZXJ5LgorICogQHJldHVybiBUaGUgaW5kZXggb2YgdGhlIGRldmljZSBpbiAjbWV0ZW1wbF92ZXJzaW9ucy4KKyAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgbWV0ZW1wbF92ZXJzaW9uc19nZXRfZGV2aWNlX2luZGV4KHVpbnQxNl90IGRldmljZV9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgTUVURU1QTF9ERVZJQ0VfVkVSU0lPTlM7IGkrKykKKwkJaWYgKG1ldGVtcGxfdmVyc2lvbnNbaV0uZGV2aWNlX2lkID09IGRldmljZV9pZCkKKwkJCWJyZWFrOworCXJldHVybiBpOworfQorCisvKioKKyAqIEBicmllZiBUaGUgdGVtcGxhdGUgZGV2aWNlIGNsYXNzIHN0cnVjdHVyZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgbWV0ZW1wbF9kZXZpY2UgeworCW1lX2RldmljZV90IGJhc2U7CQkJLyoqPCBUaGUgTWVpbGhhdXMgZGV2aWNlIGJhc2UgY2xhc3MuICovCisKKwkvKiBDaGlsZCBjbGFzcyBhdHRyaWJ1dGVzLiAqLworCXNwaW5sb2NrX3QgY3RybF9yZWdfbG9jazsKK30gbWV0ZW1wbF9kZXZpY2VfdDsKKworLyoqCisgKiBAYnJpZWYgVGhlIHRlbXBsYXRlIGRldmljZSBjbGFzcyBjb25zdHJ1Y3Rvci4KKyAqCisgKiBAcGFyYW0gcGNpX2RldmljZSBUaGUgcGNpIGRldmljZSBzdHJ1Y3R1cmUgZ2l2ZW4gYnkgdGhlIFBDSSBzdWJzeXN0ZW0uCisgKgorICogQHJldHVybiBPbiBzdWNjZXMgYSBuZXcgdGVtcGxhdGUgZGV2aWNlIGluc3RhbmNlLiBcbgorICogICAgICAgICBOVUxMIG9uIGVycm9yLgorICovCittZV9kZXZpY2VfdCAqbWV0ZW1wbF9wY2lfY29uc3RydWN0b3Ioc3RydWN0IHBjaV9kZXYgKnBjaV9kZXZpY2UpCisgICAgX19hdHRyaWJ1dGVfXyAoKHdlYWspKTsKKworI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZXRlbXBsX3N1Yi5jIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21ldGVtcGxfc3ViLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFkNjVkOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZXRlbXBsX3N1Yi5jCkBAIC0wLDAgKzEsMTQ5IEBACisvKioKKyAqIEBmaWxlIG1ldGVtcGxfc3ViLmMKKyAqCisgKiBAYnJpZWYgU3ViZGV2aWNlIGluc3RhbmNlLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX19LRVJORUxfXworIyAgZGVmaW5lIF9fS0VSTkVMX18KKyNlbmRpZgorCisvKgorICogSW5jbHVkZXMKKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2luY2x1ZGUgIm1lZGVmaW5lcy5oIgorI2luY2x1ZGUgIm1laW50ZXJuYWwuaCIKKyNpbmNsdWRlICJtZWVycm9yLmgiCisKKyNpbmNsdWRlICJtZWRlYnVnLmgiCisjaW5jbHVkZSAibWV0ZW1wbF9zdWJfcmVnLmgiCisjaW5jbHVkZSAibWV0ZW1wbF9zdWIuaCIKKworLyoKKyAqIERlZmluZXMKKyAqLworCisvKgorICogRnVuY3Rpb25zCisgKi8KKworc3RhdGljIHZvaWQgbWV0ZW1wbF9zdWJfZGVzdHJ1Y3RvcihzdHJ1Y3QgbWVfc3ViZGV2aWNlICpzdWJkZXZpY2UpCit7CisJbWV0ZW1wbF9zdWJfc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCWluc3RhbmNlID0gKG1ldGVtcGxfc3ViX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCS8qIFVudGlsIHRoZXJlIHRoaXMgd2FzIHRoZSB0aGluZ3MgdGhlIGRlZmF1bHQgY29uc3RydWN0b3IgZG9lcy4KKwkgICBJZiB5b3UgZG8gbm90IGhhdmUgYW55IGFkZGl0aW9uYWwgdGhpbmdzIHRvIGRvIHlvdSBjYW4gd2lwZSBpdCBvdXQuICovCisKKwltZV9zdWJkZXZpY2VfZGVpbml0KCZpbnN0YW5jZS0+YmFzZSk7CisJa2ZyZWUoaW5zdGFuY2UpOworfQorCitzdGF0aWMgaW50IG1ldGVtcGxfc3ViX3F1ZXJ5X251bWJlcl9jaGFubmVscyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJICAgICBpbnQgKm51bWJlcikKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJKm51bWJlciA9IDA7CisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWV0ZW1wbF9zdWJfcXVlcnlfc3ViZGV2aWNlX3R5cGUobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJCSAgICBpbnQgKnR5cGUsIGludCAqc3VidHlwZSkKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJKnR5cGUgPSAwOworCSpzdWJ0eXBlID0gMDsKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZXRlbXBsX3N1Yl9xdWVyeV9zdWJkZXZpY2VfY2FwcyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJICAgIGludCAqY2FwcykKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJKmNhcHMgPSAwOworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCittZXRlbXBsX3N1Yl9zdWJkZXZpY2VfdCAqbWV0ZW1wbF9zdWJfY29uc3RydWN0b3IodWludDMyX3QgcmVnX2Jhc2UsCisJCQkJCQkgdW5zaWduZWQgaW50IHN1Yl9pZHgsCisJCQkJCQkgc3BpbmxvY2tfdCAqIGN0cmxfcmVnX2xvY2spCit7CisJbWV0ZW1wbF9zdWJfc3ViZGV2aWNlX3QgKnN1YmRldmljZTsKKwlpbnQgZXJyOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJLyogQWxsb2NhdGUgbWVtb3J5IGZvciBzdWJkZXZpY2UgaW5zdGFuY2UgKi8KKwlzdWJkZXZpY2UgPSBrbWFsbG9jKHNpemVvZihtZXRlbXBsX3N1Yl9zdWJkZXZpY2VfdCksIEdGUF9LRVJORUwpOworCisJaWYgKCFzdWJkZXZpY2UpIHsKKwkJUEVSUk9SKCJDYW5ub3QgZ2V0IG1lbW9yeSBmb3Igc3ViZGV2aWNlIGluc3RhbmNlLlxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCW1lbXNldChzdWJkZXZpY2UsIDAsIHNpemVvZihtZXRlbXBsX3N1Yl9zdWJkZXZpY2VfdCkpOworCisJLyogQ2hlY2sgaWYgc3ViZGV2aWNlIGluZGV4IGlzIG91dCBvZiByYW5nZSAqLworCisJaWYgKHN1Yl9pZHggPj0gMikgeworCQlQRVJST1IoIlRlbXBsYXRlIHN1YmRldmljZSBpbmRleCBpcyBvdXQgb2YgcmFuZ2UuXG4iKTsKKwkJa2ZyZWUoc3ViZGV2aWNlKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJLyogSW5pdGlhbGl6ZSBzdWJkZXZpY2UgYmFzZSBjbGFzcyAqLworCWVyciA9IG1lX3N1YmRldmljZV9pbml0KCZzdWJkZXZpY2UtPmJhc2UpOworCisJaWYgKGVycikgeworCQlQRVJST1IoIkNhbm5vdCBpbml0aWFsaXplIHN1YmRldmljZSBiYXNlIGNsYXNzIGluc3RhbmNlLlxuIik7CisJCWtmcmVlKHN1YmRldmljZSk7CisJCXJldHVybiBOVUxMOworCX0KKwkvLyBJbml0aWFsaXplIHNwaW4gbG9ja3MuCisJc3Bpbl9sb2NrX2luaXQoJnN1YmRldmljZS0+c3ViZGV2aWNlX2xvY2spOworCisJc3ViZGV2aWNlLT5jdHJsX3JlZ19sb2NrID0gY3RybF9yZWdfbG9jazsKKworCS8qIFNhdmUgdGhlIHN1YmRldmljZSBpbmRleCAqLworCXN1YmRldmljZS0+c3ViX2lkeCA9IHN1Yl9pZHg7CisKKwkvKiBPdmVycmlkZSBiYXNlIGNsYXNzIG1ldGhvZHMuICovCisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9kZXN0cnVjdG9yID0gbWV0ZW1wbF9zdWJfZGVzdHJ1Y3RvcjsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X251bWJlcl9jaGFubmVscyA9CisJICAgIG1ldGVtcGxfc3ViX3F1ZXJ5X251bWJlcl9jaGFubmVsczsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV90eXBlID0KKwkgICAgbWV0ZW1wbF9zdWJfcXVlcnlfc3ViZGV2aWNlX3R5cGU7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9zdWJkZXZpY2VfY2FwcyA9CisJICAgIG1ldGVtcGxfc3ViX3F1ZXJ5X3N1YmRldmljZV9jYXBzOworCisJcmV0dXJuIHN1YmRldmljZTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZXRlbXBsX3N1Yi5oIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21ldGVtcGxfc3ViLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODBjOGFmOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZXRlbXBsX3N1Yi5oCkBAIC0wLDAgKzEsNjQgQEAKKy8qKgorICogQGZpbGUgbWV0ZW1wbF9zdWIuaAorICoKKyAqIEBicmllZiBNZWlsaGF1cyBzdWJkZXZpY2UgY2xhc3MuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfTUVURU1QTF9TVUJfSF8KKyNkZWZpbmUgX01FVEVNUExfU1VCX0hfCisKKyNpbmNsdWRlICJtZXN1YmRldmljZS5oIgorCisjaWZkZWYgX19LRVJORUxfXworCisvKioKKyAqIEBicmllZiBUaGUgc3ViZGV2aWNlIGNsYXNzLgorICovCit0eXBlZGVmIHN0cnVjdCBtZXRlbXBsX3N1Yl9zdWJkZXZpY2UgeworCS8qIEluaGVyaXRhbmNlICovCisJbWVfc3ViZGV2aWNlX3QgYmFzZTsJCQkvKio8IFRoZSBzdWJkZXZpY2UgYmFzZSBjbGFzcy4gKi8KKworCS8qIEF0dHJpYnV0ZXMgKi8KKwlzcGlubG9ja190IHN1YmRldmljZV9sb2NrOwkJLyoqPCBTcGluIGxvY2sgdG8gcHJvdGVjdCB0aGUgc3ViZGV2aWNlIGZyb20gY29uY3VycmVudCBhY2Nlc3MuICovCisJc3BpbmxvY2tfdCAqY3RybF9yZWdfbG9jazsJCS8qKjwgU3BpbiBsb2NrIHRvIHByb3RlY3QgI2N0cmxfcmVnIGZyb20gY29uY3VycmVudCBhY2Nlc3MuICovCisJaW50IHN1Yl9pZHg7CQkJCS8qKjwgVGhlIGluZGV4IG9mIHRoZSBzdWJkZXZpY2Ugb24gdGhlIGRldmljZS4gKi8KKworCXVuc2lnbmVkIGxvbmcgY3RybF9yZWc7CQkJLyoqPCBSZWdpc3RlciB0byBjb25maWd1cmUgdGhlIG1vZGVzLiAqLworfSBtZXRlbXBsX3N1Yl9zdWJkZXZpY2VfdDsKKworLyoqCisgKiBAYnJpZWYgVGhlIGNvbnN0cnVjdG9yIHRvIGdlbmVyYXRlIGEgc3ViZGV2aWNlIGluc3RhbmNlLgorICoKKyAqIEBwYXJhbSByZWdfYmFzZSBUaGUgcmVnaXN0ZXIgYmFzZSBhZGRyZXNzIG9mIHRoZSBkZXZpY2UgYXMgcmV0dXJuZWQgYnkgdGhlIFBDSSBCSU9TLgorICogQHBhcmFtIHN1Yl9pZHggVGhlIGluZGV4IG9mIHRoZSBzdWJkZXZpY2Ugb24gdGhlIGRldmljZS4KKyAqIEBwYXJhbSBjdHJsX3JlZ19sb2NrIFBvaW50ZXIgdG8gc3BpbiBsb2NrIHByb3RlY3RpbmcgdGhlIGNvbnRyb2wgcmVnaXN0ZXIgZnJvbSBjb25jdXJyZW50IGFjY2Vzcy4KKyAqCisgKiBAcmV0dXJuIFBvaW50ZXIgdG8gbmV3IGluc3RhbmNlIG9uIHN1Y2Nlc3MuXG4KKyAqIE5VTEwgb24gZXJyb3IuCisgKi8KK21ldGVtcGxfc3ViX3N1YmRldmljZV90ICptZXRlbXBsX3N1Yl9jb25zdHJ1Y3Rvcih1aW50MzJfdCByZWdfYmFzZSwKKwkJCQkJCSB1bnNpZ25lZCBpbnQgc3ViX2lkeCwKKwkJCQkJCSBzcGlubG9ja190ICogY3RybF9yZWdfbG9jayk7CisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWV0ZW1wbF9zdWJfcmVnLmggYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWV0ZW1wbF9zdWJfcmVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWEyY2FiNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZXRlbXBsX3N1Yl9yZWcuaApAQCAtMCwwICsxLDM1IEBACisvKioKKyAqIEBmaWxlIG1ldGVtcGxfc3ViX3JlZy5oCisgKgorICogQGJyaWVmIFN1YmRldmljZSByZWdpc3RlciBkZWZpbml0aW9ucy4KKyAqIEBub3RlIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKiBAYXV0aG9yIEd1ZW50ZXIgR2ViaGFyZHQKKyAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9NRVRFTVBMX1NVQl9SRUdfSF8KKyNkZWZpbmUgX01FVEVNUExfU1VCX1JFR19IXworCisjaWZkZWYgX19LRVJORUxfXworCisjZGVmaW5lIE1FVEVNUExfUE9SVF9NT0RFCQkJMHgwMDEwCQkvKio8IENvbmZpZ3VyYXRpb24gcmVnaXN0ZXIuICovCisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWV0eXBlcy5oIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21ldHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjhlYTE1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21ldHlwZXMuaApAQCAtMCwwICsxLDk1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA1IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBTb3VyY2UgRmlsZSA6IG1ldHlwZXMuaAorICogQXV0aG9yICAgICAgOiBHRyAoR3VlbnRlciBHZWJoYXJkdCkgIDxnLmdlYmhhcmR0QG1laWxoYXVzLmRlPgorICovCisKKyNpZm5kZWYgX01FVFlQRVNfSF8KKyNkZWZpbmUgX01FVFlQRVNfSF8KKworCit0eXBlZGVmIGludCAoKm1lRXJyb3JDQl90KShjaGFyICpwY0Z1bmN0aW9uTmFtZSwgaW50IGlFcnJvckNvZGUpOworCit0eXBlZGVmIGludCAoKm1lSU9TdHJlYW1DQl90KSgKKwkJaW50IGlEZXZpY2UsCisJCWludCBpU3ViZGV2aWNlLAorCQlpbnQgaUNvdW50LAorCSAgIAl2b2lkICpwdkNvbnRleHQsCisJICAgCWludCBpRXJyb3JDb2RlKTsKKwordHlwZWRlZiBpbnQgKCptZUlPSXJxQ0JfdCkoCisJCWludCBpRGV2aWNlLAorCSAgIAlpbnQgaVN1YmRldmljZSwKKwkgICAJaW50IGlDaGFubmVsLAorCQlpbnQgaUlycUNvdW50LAorCSAgIAlpbnQgaVZhbHVlLAorCSAgIAl2b2lkICpwdkNvbnRleHQsCisJICAgCWludCBpRXJyb3JDb2RlKTsKKworCit0eXBlZGVmIHN0cnVjdCBtZUlPU2luZ2xlIHsKKwlpbnQgaURldmljZTsKKwlpbnQgaVN1YmRldmljZTsKKwlpbnQgaUNoYW5uZWw7CisJaW50IGlEaXI7CisJaW50IGlWYWx1ZTsKKwlpbnQgaVRpbWVPdXQ7CisJaW50IGlGbGFnczsKKwlpbnQgaUVycm5vOworfSBtZUlPU2luZ2xlX3Q7CisKKwordHlwZWRlZiBzdHJ1Y3QgbWVJT1N0cmVhbUNvbmZpZyB7CisJaW50IGlDaGFubmVsOworCWludCBpU3RyZWFtQ29uZmlnOworCWludCBpUmVmOworCWludCBpRmxhZ3M7Cit9IG1lSU9TdHJlYW1Db25maWdfdDsKKworCit0eXBlZGVmIHN0cnVjdCBtZUlPU3RyZWFtVHJpZ2dlciB7CisJaW50IGlBY3FTdGFydFRyaWdUeXBlOworCWludCBpQWNxU3RhcnRUcmlnRWRnZTsKKwlpbnQgaUFjcVN0YXJ0VHJpZ0NoYW47CisJaW50IGlBY3FTdGFydFRpY2tzTG93OworCWludCBpQWNxU3RhcnRUaWNrc0hpZ2g7CisJaW50IGlBY3FTdGFydEFyZ3NbMTBdOworCWludCBpU2NhblN0YXJ0VHJpZ1R5cGU7CisJaW50IGlTY2FuU3RhcnRUaWNrc0xvdzsKKwlpbnQgaVNjYW5TdGFydFRpY2tzSGlnaDsKKwlpbnQgaVNjYW5TdGFydEFyZ3NbMTBdOworCWludCBpQ29udlN0YXJ0VHJpZ1R5cGU7CisJaW50IGlDb252U3RhcnRUaWNrc0xvdzsKKwlpbnQgaUNvbnZTdGFydFRpY2tzSGlnaDsKKwlpbnQgaUNvbnZTdGFydEFyZ3NbMTBdOworCWludCBpU2NhblN0b3BUcmlnVHlwZTsKKwlpbnQgaVNjYW5TdG9wQ291bnQ7CisJaW50IGlTY2FuU3RvcEFyZ3NbMTBdOworCWludCBpQWNxU3RvcFRyaWdUeXBlOworCWludCBpQWNxU3RvcENvdW50OworCWludCBpQWNxU3RvcEFyZ3NbMTBdOworCWludCBpRmxhZ3M7Cit9IG1lSU9TdHJlYW1UcmlnZ2VyX3Q7CisKKwordHlwZWRlZiBzdHJ1Y3QgbWVJT1N0cmVhbVN0YXJ0IHsKKwlpbnQgaURldmljZTsKKwlpbnQgaVN1YmRldmljZTsKKwlpbnQgaVN0YXJ0TW9kZTsKKwlpbnQgaVRpbWVPdXQ7CisJaW50IGlGbGFnczsKKwlpbnQgaUVycm5vOworfSBtZUlPU3RyZWFtU3RhcnRfdDsKKworCit0eXBlZGVmIHN0cnVjdCBtZUlPU3RyZWFtU3RvcCB7CisJaW50IGlEZXZpY2U7CisJaW50IGlTdWJkZXZpY2U7CisJaW50IGlTdG9wTW9kZTsKKwlpbnQgaUZsYWdzOworCWludCBpRXJybm87Cit9IG1lSU9TdHJlYW1TdG9wX3Q7CisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWltaW8vS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy9taW1pby9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwYmE0YzgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWltaW8vS2NvbmZpZwpAQCAtMCwwICsxLDEwIEBACitjb25maWcgSU5QVVRfTUlNSU8KKwl0cmlzdGF0ZSAiTWltaW8gWGkgaW50ZXJhY3RpdmUgd2hpdGVib2FyZCBzdXBwb3J0IgorCWRlcGVuZHMgb24gVVNCCisJZGVmYXVsdCBOCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byB1c2UgYSBNaW1pbyBYaSBpbnRlcmFjdGl2ZQorCSAgd2hpdGVib2FyZCBkZXZpY2UuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIG1pbWlvLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21pbWlvL01ha2VmaWxlIGIvZHJpdmVycy9zdGFnaW5nL21pbWlvL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3ODA3ZWUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWltaW8vTWFrZWZpbGUKQEAgLTAsMCArMSBAQAorb2JqLSQoQ09ORklHX0lOUFVUX01JTUlPKQkrPSBtaW1pby5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWltaW8vbWltaW8uYyBiL2RyaXZlcnMvc3RhZ2luZy9taW1pby9taW1pby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiYTgxMDMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWltaW8vbWltaW8uYwpAQCAtMCwwICsxLDkxNCBAQAorLyoKKyAqIEhhcmR3YXJlIGV2ZW50ID0+IGlucHV0IGV2ZW50IG1hcHBpbmc6CisgKgorICoKKyAqCisgaW5wdXQuaDojZGVmaW5lIEJUTl9UT09MX1BFTiAgICAgICAgICAgIDB4MTQwIGJsYWNrCisgaW5wdXQuaDojZGVmaW5lIEJUTl9UT09MX1JVQkJFUiAgICAgICAgIDB4MTQxIGJsdWUKKyBpbnB1dC5oOiNkZWZpbmUgQlROX1RPT0xfQlJVU0ggICAgICAgICAgMHgxNDIgZ3JlZW4KKyBpbnB1dC5oOiNkZWZpbmUgQlROX1RPT0xfUEVOQ0lMICAgICAgICAgMHgxNDMgcmVkCisgaW5wdXQuaDojZGVmaW5lIEJUTl9UT09MX0FJUkJSVVNIICAgICAgIDB4MTQ0IGVyYXNlcgorIGlucHV0Lmg6I2RlZmluZSBCVE5fVE9PTF9GSU5HRVIgICAgICAgICAweDE0NSBzbWFsbCBlcmFzZXIKKyBpbnB1dC5oOiNkZWZpbmUgQlROX1RPT0xfTU9VU0UgICAgICAgICAgMHgxNDYgbWltaW8gaW50ZXJhY3RpdmUKKyBpbnB1dC5oOiNkZWZpbmUgQlROX1RPT0xfTEVOUyAgICAgICAgICAgMHgxNDcgbWltaW8gaW50ZXJhY3RpdmUgYnV0MQorIGlucHV0Lmg6I2RlZmluZSBMT0NBTEJUTl9UT09MX0VYVFJBMSAgICAweDE0YSBtaW1pbyBpbnRlcmFjdGl2ZSBidXQyID09IEJUTl9UT1VDSAorIGlucHV0Lmg6I2RlZmluZSBMT0NBTEJUTl9UT09MX0VYVFJBMiAgICAweDE0YiBtaW1pbyBleHRyYSBwZW5zIChvcmFuZ2UsIGJyb3duLCB5ZWxsb3csIHB1cnBsZSkgPT0gQlROX1NUWUxVUworIGlucHV0Lmg6I2RlZmluZSBMT0NBTEJUTl9UT09MX0VYVFJBMyAgICAweDE0YyB1bnVzZWQgPT0gQlROX1NUWUxVUzIKKyBpbnB1dC5oOiNkZWZpbmUgQlROX1RPT0xfRE9VQkxFVEFQICAgICAgMHgxNGQgdW51c2VkCisgaW5wdXQuaDojZGVmaW5lIEJUTl9UT09MX1RSSVBMRVRBUCAgICAgIDB4MTRlIHVudXNlZAorICoKKyAqIE1JTUlPX0VWX1BFTkRPV04oTUlNSU9fUEVOX0spICAgICA9PiBFVl9LRVkgQklUKEJUTl9UT09MX1BFTikKKyAqIE1JTUlPX0VWX1BFTkRPV04oTUlNSU9fUEVOX0IpICAgICA9PiBFVl9LRVkgQklUKEJUTl9UT09MX1JVQkJFUikKKyAqIE1JTUlPX0VWX1BFTkRPV04oTUlNSU9fUEVOX0cpICAgICA9PiBFVl9LRVkgQklUKEJUTl9UT09MX0JSVVNIKQorICogTUlNSU9fRVZfUEVORE9XTihNSU1JT19QRU5fUikgICAgID0+IEVWX0tFWSBCSVQoQlROX1RPT0xfUEVOQ0lMKQorICogTUlNSU9fRVZfUEVORE9XTihNSU1JT19QRU5fRSkgICAgID0+IEVWX0tFWSBCSVQoQlROX1RPT0xfQUlSQlJVU0gpCisgKiBNSU1JT19FVl9QRU5ET1dOKE1JTUlPX1BFTl9FUykgICAgPT4gRVZfS0VZIEJJVChCVE5fVE9PTF9GSU5HRVIpCisgKiBNSU1JT19FVl9QRU5ET1dOKE1JTUlPX1BFTl9JKSAgICAgPT4gRVZfS0VZIEJJVChCVE5fVE9PTF9NT1VTRSkKKyAqIE1JTUlPX0VWX1BFTkRPV04oTUlNSU9fUEVOX0lMKSAgICA9PiBFVl9LRVkgQklUKEJUTl9UT09MX0xFTlMpCisgKiBNSU1JT19FVl9QRU5ET1dOKE1JTUlPX1BFTl9JUikgICAgPT4gRVZfS0VZIEJJVChCVE5fVE9PTF9ET1VCTEVUQVApCisgKiBNSU1JT19FVl9QRU5ET1dOKE1JTUlPX1BFTl9FWCkgICAgPT4gRVZfS0VZIEJJVChCVE5fVE9PTF9UUklQTEVUQVApCisgKiBNSU1JT19FVl9QRU5EQVRBICAgICAgICAgICAgICAgICA9PiBFVl9BQlMgQklUKEFCU19YKSwgQklUKEFCU19ZKQorICogTUlNSU9fRVZfTUVNUkVTRVQgICAgICAgICAgICAgID0+IEVWX0tFWSBCSVQoQlROXzApCisgKiBNSU1JT19FVl9BQ0MoQUNDX05FV1BBR0UpICAgICAgID0+IEVWX0tFWSBCSVQoQlROXzEpCisgKiBNSU1JT19FVl9BQ0MoQUNDX1RBR1BBR0UpICAgICAgPT4gRVZfS0VZIEJJVChCVE5fMikKKyAqIE1JTUlPX0VWX0FDQyhBQ0NfUFJJTlRQQUdFKSAgICAgID0+IEVWX0tFWSBCSVQoQlROXzMpCisgKiBNSU1JT19FVl9BQ0MoQUNDX01BWElNSVpFKSAgICAgID0+IEVWX0tFWSBCSVQoQlROXzQpCisgKiBNSU1JT19FVl9BQ0MoQUNDX0ZJTkRDVExQTkwpICAgICAgPT4gRVZfS0VZIEJJVChCVE5fNSkKKyAqCisgKgorICogb3BlbiBpc3N1ZXM6CisgKiAgICAgIC0gY29sZC1sb2FkIG9mIGRhdGEgY2FwdHVyZWQgd2hlbiBtaW1pbyBpbiBzdGFuZGFsb25lIG1vZGUgbm90IHlldAorICogICAgICAgICBzdXBwb3J0ZWQ7IG5lZWQgdG8gc25vb3AgV2luMzIgYm94IHRvIHNlZSBkYXRhc3RyZWFtIGZvciB0aGlzLgorICogICAgICAgLSBtaW1pbyBtb3VzZSBub3QgeWV0IHN1cHBvcnRlZDsgbmVlZCB0byBzbm9vcCBXaW4zMiBib3ggdG8gc2VlIHRoZQorICogICAgICAgICBkYXRhc3RyZWFtIGZvciB0aGlzLgorICovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CisjaW5jbHVkZSA8bGludXgvdXNiLmg+CisKKyNkZWZpbmUgRFJJVkVSX1ZFUlNJT04JCSJ2MC4wMzEiCisjZGVmaW5lIERSSVZFUl9BVVRIT1IJCSJtd2lsZGVyQGNzLm5tc3UuZWR1IgorI2RlZmluZSBEUklWRVJfREVTQwkJIlVTQiBtaW1pby14aSBkcml2ZXIiCisKK2VudW0ge1VQVkFMVUUsIERPV05WQUxVRSwgTU9WRVZBTFVFfTsKKworI2RlZmluZSBNSU1JT19YUkFOR0VfTUFYCTk2MDAKKyNkZWZpbmUgTUlNSU9fWVJBTkdFX01BWAk0ODAwCisKKyNkZWZpbmUgTE9DQUxCVE5fVE9PTF9FWFRSQTEJQlROX1RPVUNICisjZGVmaW5lIExPQ0FMQlROX1RPT0xfRVhUUkEyCUJUTl9TVFlMVVMKKyNkZWZpbmUgTE9DQUxCVE5fVE9PTF9FWFRSQTMJQlROX1NUWUxVUzIKKworI2RlZmluZSBNSU1JT19WRU5ET1JfSUQJCTB4MDhkMworI2RlZmluZSBNSU1JT19QUk9EVUNUX0lECTB4MDAwMQorI2RlZmluZSBNSU1JT19NQVhQQVlMT0FECSg4KQorI2RlZmluZSBNSU1JT19NQVhOQU1FTEVOCSg2NCkKKyNkZWZpbmUgTUlNSU9fVFhXQUlUCQkoMSkKKyNkZWZpbmUgTUlNSU9fVFhET05FCQkoMikKKworI2RlZmluZSBNSU1JT19FVl9QRU5ET1dOCSgweDIyKQorI2RlZmluZSBNSU1JT19FVl9QRU5EQVRBCSgweDI0KQorI2RlZmluZSBNSU1JT19FVl9QRU5VUAkJKDB4NTEpCisjZGVmaW5lIE1JTUlPX0VWX01FTVJFU0VUCSgweDQ1KQorI2RlZmluZSBNSU1JT19FVl9BQ0MJCSgweGIyKQorCisjZGVmaW5lIE1JTUlPX1BFTl9LCQkoMSkJLyogYmxhY2sgcGVuICovCisjZGVmaW5lIE1JTUlPX1BFTl9CCQkoMikJLyogYmx1ZSBwZW4gKi8KKyNkZWZpbmUgTUlNSU9fUEVOX0cJCSgzKQkvKiBncmVlbiBwZW4gKi8KKyNkZWZpbmUgTUlNSU9fUEVOX1IJCSg0KQkvKiByZWQgcGVuICovCisvKiA1LCA2LCA3LCA4IGFyZSBleHRyYSBwZW5zICovCisjZGVmaW5lIE1JTUlPX1BFTl9FCQkoOSkJLyogYmlnIGVyYXNlciAqLworI2RlZmluZSBNSU1JT19QRU5fRVMJCSgxMCkJLyogbGlsIGVyYXNlciAqLworI2RlZmluZSBNSU1JT19QRU5KVU1QX1NUQVJUCSgxMCkKKyNkZWZpbmUgTUlNSU9fUEVOSlVNUAkJKDYpCisjZGVmaW5lIE1JTUlPX1BFTl9JCQkoMTcpCS8qIG1pbWlvIGludGVyYWN0aXZlICovCisjZGVmaW5lIE1JTUlPX1BFTl9JTAkJKDE4KQkvKiBtaW1pbyBpbnRlcmFjdGl2ZSBidXR0b24gMSAqLworI2RlZmluZSBNSU1JT19QRU5fSVIJCSgxOSkJLyogbWltaW8gaW50ZXJhY3RpdmUgYnV0dG9uIDIgKi8KKworI2RlZmluZSBNSU1JT19QRU5fTUFYCQkoTUlNSU9fUEVOX0lSKQorCisjZGVmaW5lIEFDQ19ET05FCQkoMCkKKyNkZWZpbmUgQUNDX05FV1BBR0UJCSgxKQorI2RlZmluZSBBQ0NfVEFHUEFHRQkJKDIpCisjZGVmaW5lIEFDQ19QUklOVFBBR0UJCSg0KQorI2RlZmluZSBBQ0NfTUFYSU1JWkUJCSg4KQorI2RlZmluZSBBQ0NfRklORENUTFBOTAkJKDE2KQorCisjZGVmaW5lIGlzdmFsaWR0eHNpemUobikJKChuKSA+IDAgJiYgKG4pIDw9IE1JTUlPX01BWFBBWUxPQUQpCisKKworc3RydWN0IHBrdGJ1ZiB7CisJdW5zaWduZWQgY2hhciBpbnN0cjsKKwl1bnNpZ25lZCBjaGFyIGJ1ZlsxNl07CisJdW5zaWduZWQgY2hhciAqcDsKKwl1bnNpZ25lZCBjaGFyICpxOworfTsKKworc3RydWN0IHVzYmludGVuZHB0IHsKKwlkbWFfYWRkcl90IGRtYTsKKwlzdHJ1Y3QgdXJiICp1cmI7CisJdW5zaWduZWQgY2hhciAqYnVmOworCXN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZGVzYzsKK307CisKK3N0cnVjdCBtaW1pbyB7CisJc3RydWN0IGlucHV0X2RldiAqaWRldjsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldjsKKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqdWlmYzsKKwlpbnQgb3BlbjsKKwlpbnQgcHJlc2VudDsKKwlpbnQgZ3JlZXRlZDsKKwlpbnQgdHhmbGFnczsKKwljaGFyIHBoeXNbTUlNSU9fTUFYTkFNRUxFTl07CisJc3RydWN0IHVzYmludGVuZHB0IGluOworCXN0cnVjdCB1c2JpbnRlbmRwdCBvdXQ7CisJc3RydWN0IHBrdGJ1ZiBwa3RidWY7CisJdW5zaWduZWQgY2hhciBtaW5vcjsKKwl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0cTsKKwlzcGlubG9ja190IHR4bG9jazsKKwl2b2lkICgqcnhoYW5kbGVyKShzdHJ1Y3QgbWltaW8gKiwgdW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCBpbnQpOworCWludCBsYXN0X3Blbl9kb3duOworfTsKKworc3RhdGljIHZvaWQgbWltaW9fY2xvc2Uoc3RydWN0IGlucHV0X2RldiAqKTsKK3N0YXRpYyB2b2lkIG1pbWlvX2RlYWxsb2Moc3RydWN0IG1pbWlvICopOworc3RhdGljIHZvaWQgbWltaW9fZGlzY29ubmVjdChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqKTsKK3N0YXRpYyBpbnQgbWltaW9fZ3JlZXQoc3RydWN0IG1pbWlvICopOworc3RhdGljIHZvaWQgbWltaW9faXJxX2luKHN0cnVjdCB1cmIgKik7CitzdGF0aWMgdm9pZCBtaW1pb19pcnFfb3V0KHN0cnVjdCB1cmIgKik7CitzdGF0aWMgaW50IG1pbWlvX29wZW4oc3RydWN0IGlucHV0X2RldiAqKTsKK3N0YXRpYyBpbnQgbWltaW9fcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKiwgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKik7CitzdGF0aWMgdm9pZCBtaW1pb19yeF9oYW5kbGVyKHN0cnVjdCBtaW1pbyAqLCB1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGludCk7CitzdGF0aWMgaW50IG1pbWlvX3R4KHN0cnVjdCBtaW1pbyAqLCBjb25zdCBjaGFyICosIGludCk7CisKK3N0YXRpYyBjaGFyIG1pbWlvX25hbWVbXSA9ICJWaXJ0dWFsSW5rIG1pbWlvLVhpIjsKK3N0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9pZCBtaW1pb190YWJsZSBbXSA9IHsKKwl7IFVTQl9ERVZJQ0UoTUlNSU9fVkVORE9SX0lELCBNSU1JT19QUk9EVUNUX0lEKSB9LAorCXsgVVNCX0RFVklDRSgweDA1MjUsIDB4YTRhMCkgfSwgLyogZ2FkZ2V0IHplcm8gZmlybXdhcmUgKi8KKwl7IH0KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUodXNiLCBtaW1pb190YWJsZSk7CisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciBtaW1pb19kcml2ZXIgPSB7CisJLm5hbWUgPSAibWltaW8iLAorCS5wcm9iZSA9IG1pbWlvX3Byb2JlLAorCS5kaXNjb25uZWN0ID0gbWltaW9fZGlzY29ubmVjdCwKKwkuaWRfdGFibGUgPSBtaW1pb190YWJsZSwKK307CisKK3N0YXRpYyBERUNMQVJFX01VVEVYKGRpc2Nvbm5lY3Rfc2VtKTsKKworc3RhdGljIHZvaWQgbWltaW9fY2xvc2Uoc3RydWN0IGlucHV0X2RldiAqaWRldikKK3sKKwlzdHJ1Y3QgbWltaW8gKm1pbWlvOworCisJbWltaW8gPSBpbnB1dF9nZXRfZHJ2ZGF0YShpZGV2KTsKKwlpZiAoIW1pbWlvKSB7CisJCWRldl9lcnIoJmlkZXYtPmRldiwgIm51bGwgbWltaW8gYXR0YWNoZWQgdG8gaW5wdXQgZGV2aWNlXG4iKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChtaW1pby0+b3BlbiA8PSAwKQorCQlkZXZfZXJyKCZpZGV2LT5kZXYsICJtaW1pbyBub3Qgb3Blbi5cbiIpOworCWVsc2UKKwkJbWltaW8tPm9wZW4tLTsKKworCWlmIChtaW1pby0+cHJlc2VudCA9PSAwICYmIG1pbWlvLT5vcGVuID09IDApCisJCW1pbWlvX2RlYWxsb2MobWltaW8pOworfQorCitzdGF0aWMgdm9pZCBtaW1pb19kZWFsbG9jKHN0cnVjdCBtaW1pbyAqbWltaW8pCit7CisJaWYgKG1pbWlvID09IE5VTEwpCisJCXJldHVybjsKKworCXVzYl9raWxsX3VyYihtaW1pby0+aW4udXJiKTsKKworCXVzYl9raWxsX3VyYihtaW1pby0+b3V0LnVyYik7CisKKwlpZiAobWltaW8tPmlkZXYpIHsKKwkJaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2UobWltaW8tPmlkZXYpOworCQlpZiAobWltaW8tPmlkZXYtPmdyYWIpCisJCQlpbnB1dF9jbG9zZV9kZXZpY2UobWltaW8tPmlkZXYtPmdyYWIpOworCQllbHNlCisJCQlkZXZfZGJnKCZtaW1pby0+aWRldi0+ZGV2LCAibWltaW8tPmlkZXYtPmdyYWIgPT0gTlVMTCIKKwkJCQkiIC0tIGRpZG4ndCBjYWxsIGlucHV0X2Nsb3NlX2RldmljZVxuIik7CisJfQorCisJdXNiX2ZyZWVfdXJiKG1pbWlvLT5pbi51cmIpOworCisJdXNiX2ZyZWVfdXJiKG1pbWlvLT5vdXQudXJiKTsKKworCWlmIChtaW1pby0+aW4uYnVmKSB7CisJCXVzYl9idWZmZXJfZnJlZShtaW1pby0+dWRldiwgTUlNSU9fTUFYUEFZTE9BRCwgbWltaW8tPmluLmJ1ZiwKKwkJCQltaW1pby0+aW4uZG1hKTsKKwl9CisKKwlpZiAobWltaW8tPm91dC5idWYpCisJCXVzYl9idWZmZXJfZnJlZShtaW1pby0+dWRldiwgTUlNSU9fTUFYUEFZTE9BRCwgbWltaW8tPm91dC5idWYsCisJCQkJbWltaW8tPm91dC5kbWEpOworCisJaWYgKG1pbWlvLT5pZGV2KQorCQlpbnB1dF9mcmVlX2RldmljZShtaW1pby0+aWRldik7CisKKwlrZnJlZShtaW1pbyk7Cit9CisKK3N0YXRpYyB2b2lkIG1pbWlvX2Rpc2Nvbm5lY3Qoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmlmYykKK3sKKwlzdHJ1Y3QgbWltaW8gKm1pbWlvOworCisJZG93bigmZGlzY29ubmVjdF9zZW0pOworCisJbWltaW8gPSB1c2JfZ2V0X2ludGZkYXRhKGlmYyk7CisJdXNiX3NldF9pbnRmZGF0YShpZmMsIE5VTEwpOworCWRldl9kYmcoJm1pbWlvLT5pZGV2LT5kZXYsICJkaXNjb25uZWN0XG4iKTsKKworCWlmIChtaW1pbykgeworCQltaW1pby0+cHJlc2VudCA9IDA7CisKKwkJaWYgKG1pbWlvLT5vcGVuIDw9IDApCisJCQltaW1pb19kZWFsbG9jKG1pbWlvKTsKKwl9CisKKwl1cCgmZGlzY29ubmVjdF9zZW0pOworfQorCitzdGF0aWMgaW50IG1pbWlvX2dyZWV0KHN0cnVjdCBtaW1pbyAqbWltaW8pCit7CisJY29uc3Qgc3RydWN0IGdydHBrdCB7CisJCWludCBuYnl0ZXM7CisJCXVuc2lnbmVkIGRlbGF5OworCQljaGFyIGRhdGFbOF07CisJfSBncnRwa3RzW10gPSB7CisJCXsgMywgMCwgeyAweDExLCAweDU1LCAweDQ0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwIH0gfSwKKwkJeyA1LCAwLCB7IDB4NTMsIDB4NTUsIDB4MDAsIDB4MDAsIDB4MDYsIDB4MDAsIDB4MDAsIDB4MDAgfSB9LAorCQl7IDUsIDAsIHsgMHg0MywgMHg1NSwgMHgwMCwgMHgwMCwgMHgxNiwgMHgwMCwgMHgwMCwgMHgwMCB9IH0sCisJCXsgNSwgMCwgeyAweDMzLCAweDU1LCAweDAwLCAweDAwLCAweDY2LCAweDAwLCAweDAwLCAweDAwIH0gfSwKKwkJeyA1LCAwLCB7IDB4MTMsIDB4MDAsIDB4NWUsIDB4MDIsIDB4NGYsIDB4MDAsIDB4MDAsIDB4MDAgfSB9LAorCQl7IDUsIDAsIHsgMHgxMywgMHgwMCwgMHgwNCwgMHgwMywgMHgxNCwgMHgwMCwgMHgwMCwgMHgwMCB9IH0sCisJCXsgNSwgMiwgeyAweDEzLCAweDAwLCAweDAwLCAweDA0LCAweDE3LCAweDAwLCAweDAwLCAweDAwIH0gfSwKKwkJeyA1LCAwLCB7IDB4MTMsIDB4MDAsIDB4MGQsIDB4MDgsIDB4MTYsIDB4MDAsIDB4MDAsIDB4MDAgfSB9LAorCQl7IDUsIDAsIHsgMHgxMywgMHgwMCwgMHg0ZCwgMHgwMSwgMHg1ZiwgMHgwMCwgMHgwMCwgMHgwMCB9IH0sCisJCXsgMywgMCwgeyAweGYxLCAweDU1LCAweGE0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwIH0gfSwKKwkJeyA3LCAyLCB7IDB4NTIsIDB4NTUsIDB4MDAsIDB4MDcsIDB4MzEsIDB4NTUsIDB4NjQsIDB4MDAgfSB9LAorCQl7IDAsIDAsIHsgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCB9IH0sCisJfTsKKwlpbnQgcnNsdDsKKwljb25zdCBzdHJ1Y3QgZ3J0cGt0ICpwa3Q7CisKKwlmb3IgKHBrdCA9IGdydHBrdHM7IHBrdC0+bmJ5dGVzOyBwa3QrKykgeworCQlyc2x0ID0gbWltaW9fdHgobWltaW8sIHBrdC0+ZGF0YSwgcGt0LT5uYnl0ZXMpOworCQlpZiAocnNsdCkKKwkJCXJldHVybiByc2x0OworCQlpZiAocGt0LT5kZWxheSkKKwkJCW1zbGVlcChwa3QtPmRlbGF5KTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbWltaW9faXJxX2luKHN0cnVjdCB1cmIgKnVyYikKK3sKKwlpbnQgcnNsdDsKKwljaGFyICpkYXRhOworCWNvbnN0IGNoYXIgKnJlYXNvbiA9ICJnb2luZyBkb3duIjsKKwlzdHJ1Y3QgbWltaW8gKm1pbWlvOworCisJbWltaW8gPSB1cmItPmNvbnRleHQ7CisKKwlpZiAobWltaW8gPT0gTlVMTCkKKwkJLyogcGFyYW5vaWEgKi8KKwkJcmV0dXJuOworCisJc3dpdGNoICh1cmItPnN0YXR1cykgeworCWNhc2UgMDoKKwkJLyogc3VjY2VzcyAqLworCQlicmVhazsKKwljYXNlIC1FVElNRURPVVQ6CisJCXJlYXNvbiA9ICJ0aW1lb3V0IC0tIHVucGx1Z2dlZD8iOworCWNhc2UgLUVDT05OUkVTRVQ6CisJY2FzZSAtRU5PRU5UOgorCWNhc2UgLUVTSFVURE9XTjoKKwkJZGV2X2RiZygmbWltaW8tPmlkZXYtPmRldiwgIiVzLlxuIiwgcmVhc29uKTsKKwkJcmV0dXJuOworCWRlZmF1bHQ6CisJCWRldl9kYmcoJm1pbWlvLT5pZGV2LT5kZXYsICJ1bmtub3duIHVyYi1zdGF0dXM6ICVkLlxuIiwKKwkJCXVyYi0+c3RhdHVzKTsKKwkJZ290byBleGl0OworCX0KKwlkYXRhID0gbWltaW8tPmluLmJ1ZjsKKworCWlmIChtaW1pby0+cnhoYW5kbGVyKQorCQltaW1pby0+cnhoYW5kbGVyKG1pbWlvLCBkYXRhLCB1cmItPmFjdHVhbF9sZW5ndGgpOworZXhpdDoKKwkvKgorCSAqIEtlZXAgbGlzdGVuaW5nIHRvIGRldmljZSBvbiBzYW1lIHVyYi4KKwkgKi8KKwlyc2x0ID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfQVRPTUlDKTsKKwlpZiAocnNsdCkKKwkJZGV2X2VycigmbWltaW8tPmlkZXYtPmRldiwgInVzYl9zdWJtaXRfdXJiIGZhaWx1cmU6ICVkLlxuIiwKKwkJCXJzbHQpOworfQorCitzdGF0aWMgdm9pZCBtaW1pb19pcnFfb3V0KHN0cnVjdCB1cmIgKnVyYikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBtaW1pbyAqbWltaW87CisKKwltaW1pbyA9IHVyYi0+Y29udGV4dDsKKworCWlmICh1cmItPnN0YXR1cykKKwkJZGV2X2RiZygmbWltaW8tPmlkZXYtPmRldiwgInVyYi1zdGF0dXM6ICVkLlxuIiwgdXJiLT5zdGF0dXMpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJm1pbWlvLT50eGxvY2ssIGZsYWdzKTsKKwltaW1pby0+dHhmbGFncyB8PSBNSU1JT19UWERPTkU7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWltaW8tPnR4bG9jaywgZmxhZ3MpOworCXdtYigpOworCXdha2VfdXAoJm1pbWlvLT53YWl0cSk7Cit9CisKK3N0YXRpYyBpbnQgbWltaW9fb3BlbihzdHJ1Y3QgaW5wdXRfZGV2ICppZGV2KQoreworCWludCByc2x0OworCXN0cnVjdCBtaW1pbyAqbWltaW87CisKKwlyc2x0ID0gMDsKKwlkb3duKCZkaXNjb25uZWN0X3NlbSk7CisJbWltaW8gPSBpbnB1dF9nZXRfZHJ2ZGF0YShpZGV2KTsKKwlkZXZfZGJnKCZpZGV2LT5kZXYsICJtaW1pb19vcGVuXG4iKTsKKworCWlmIChtaW1pbyA9PSBOVUxMKSB7CisJCWRldl9lcnIoJmlkZXYtPmRldiwgIm51bGwgbWltaW8uXG4iKTsKKwkJcnNsdCA9IC1FTk9ERVY7CisJCWdvdG8gZXhpdDsKKwl9CisKKwlpZiAobWltaW8tPm9wZW4rKykKKwkJZ290byBleGl0OworCisJaWYgKG1pbWlvLT5wcmVzZW50ICYmICFtaW1pby0+Z3JlZXRlZCkgeworCQlzdHJ1Y3QgdXJiICp1cmIgPSBtaW1pby0+aW4udXJiOworCQltaW1pby0+aW4udXJiLT5kZXYgPSBtaW1pby0+dWRldjsKKwkJcnNsdCA9IHVzYl9zdWJtaXRfdXJiKG1pbWlvLT5pbi51cmIsIEdGUF9LRVJORUwpOworCQlpZiAocnNsdCkgeworCQkJZGV2X2VycigmaWRldi0+ZGV2LCAidXNiX3N1Ym1pdF91cmIgZmFpbHVyZSAiCisJCQkJIihyZXMgPSAlZDogJXMpLiBOb3QgZ3JlZXRpbmcuXG4iLAorCQkJCXJzbHQsCisJCQkJKCF1cmIgPyAidXJiIGlzIE5VTEwiIDoKKwkJCQkgKHVyYi0+aGNwcml2ID8gInVyYi0+aGNwcml2IGlzIG5vbi1OVUxMIiA6CisJCQkJICAoIXVyYi0+Y29tcGxldGUgPyAidXJiIGlzIG5vdCBjb21wbGV0ZSIgOgorCQkJCSAgICh1cmItPm51bWJlcl9vZl9wYWNrZXRzIDw9IDAgPyAidXJiIGhhcyBubyBwYWNrZXRzIiA6CisJCQkJICAgICh1cmItPmludGVydmFsIDw9IDAgPyAidXJiIGludGVydmFsIHRvbyBzbWFsbCIgOgorCQkJCSAgICAgInVyYiBpbnRlcnZhbCB0b28gbGFyZ2Ugb3Igc29tZSBvdGhlciBlcnJvciIpKSkpKSk7CisJCQlyc2x0ID0gLUVJTzsKKwkJCWdvdG8gZXhpdDsKKwkJfQorCQlyc2x0ID0gbWltaW9fZ3JlZXQobWltaW8pOworCQlpZiAocnNsdCA9PSAwKSB7CisJCQlkZXZfZGJnKCZpZGV2LT5kZXYsICJNaW1pbyBncmVldGVkIE9LLlxuIik7CisJCQltaW1pby0+Z3JlZXRlZCA9IDE7CisJCX0gZWxzZSB7CisJCQlkZXZfZGJnKCZpZGV2LT5kZXYsICJNaW1pbyBncmVldCBGYWlsdXJlICglZClcbiIsCisJCQkJcnNsdCk7CisJCX0KKwl9CisKK2V4aXQ6CisJdXAoJmRpc2Nvbm5lY3Rfc2VtKTsKKwlyZXR1cm4gcnNsdDsKK30KKworc3RhdGljIGludCBtaW1pb19wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaWZjLAorCQkgICAgICAgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKQoreworCWNoYXIgcGF0aFs2NF07CisJaW50IHBpcGUsIG1heHA7CisJc3RydWN0IG1pbWlvICptaW1pbzsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldjsKKwlzdHJ1Y3QgdXNiX2hvc3RfaW50ZXJmYWNlICpob3N0aWZjOworCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0X2RldjsKKwlpbnQgcmVzID0gMDsKKwlpbnQgaTsKKworCXVkZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KGlmYyk7CisKKwltaW1pbyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBtaW1pbyksIEdGUF9LRVJORUwpOworCWlmICghbWltaW8pCisJCXJldHVybiAtRU5PTUVNOworCisJaW5wdXRfZGV2ID0gaW5wdXRfYWxsb2NhdGVfZGV2aWNlKCk7CisJaWYgKCFpbnB1dF9kZXYpIHsKKwkJbWltaW9fZGVhbGxvYyhtaW1pbyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCW1pbWlvLT51aWZjID0gaWZjOworCW1pbWlvLT51ZGV2ID0gdWRldjsKKwltaW1pby0+cGt0YnVmLnAgPSBtaW1pby0+cGt0YnVmLmJ1ZjsKKwltaW1pby0+cGt0YnVmLnEgPSBtaW1pby0+cGt0YnVmLmJ1ZjsKKwkvKiBpbml0X2lucHV0X2RldihtaW1pby0+aWRldik7ICovCisJbWltaW8tPmlkZXYgPSBpbnB1dF9kZXY7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmbWltaW8tPndhaXRxKTsKKwlzcGluX2xvY2tfaW5pdCgmbWltaW8tPnR4bG9jayk7CisJaG9zdGlmYyA9IGlmYy0+Y3VyX2FsdHNldHRpbmc7CisKKwlpZiAoaG9zdGlmYy0+ZGVzYy5iTnVtRW5kcG9pbnRzICE9IDIpIHsKKwkJZGV2X2VycigmdWRldi0+ZGV2LCAiVW5leHBlY3RlZCBlbmRwb2ludCBjb3VudDogJWQuXG4iLAorCQkJaG9zdGlmYy0+ZGVzYy5iTnVtRW5kcG9pbnRzKTsKKwkJbWltaW9fZGVhbGxvYyhtaW1pbyk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCW1pbWlvLT5pbi5kZXNjID0gJihob3N0aWZjLT5lbmRwb2ludFswXS5kZXNjKTsKKwltaW1pby0+b3V0LmRlc2MgPSAmKGhvc3RpZmMtPmVuZHBvaW50WzFdLmRlc2MpOworCisJbWltaW8tPmluLmJ1ZiA9IHVzYl9idWZmZXJfYWxsb2ModWRldiwgTUlNSU9fTUFYUEFZTE9BRCwgR0ZQX0tFUk5FTCwKKwkJCQkJICZtaW1pby0+aW4uZG1hKTsKKwltaW1pby0+b3V0LmJ1ZiA9IHVzYl9idWZmZXJfYWxsb2ModWRldiwgTUlNSU9fTUFYUEFZTE9BRCwgR0ZQX0tFUk5FTCwKKwkJCQkJICAmbWltaW8tPm91dC5kbWEpOworCisJaWYgKG1pbWlvLT5pbi5idWYgPT0gTlVMTCB8fCBtaW1pby0+b3V0LmJ1ZiA9PSBOVUxMKSB7CisJCWRldl9lcnIoJnVkZXYtPmRldiwgInVzYl9idWZmZXJfYWxsb2MgZmFpbHVyZS5cbiIpOworCQltaW1pb19kZWFsbG9jKG1pbWlvKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJbWltaW8tPmluLnVyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7CisJbWltaW8tPm91dC51cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOworCisJaWYgKG1pbWlvLT5pbi51cmIgPT0gTlVMTCB8fCBtaW1pby0+b3V0LnVyYiA9PSBOVUxMKSB7CisJCWRldl9lcnIoJnVkZXYtPmRldiwgInVzYl9hbGxvY191cmIgZmFpbHVyZS5cbiIpOworCQltaW1pb19kZWFsbG9jKG1pbWlvKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJLyoKKwkgKiBCdWlsZCB0aGUgaW5wdXQgdXJiLgorCSAqLworCXBpcGUgPSB1c2JfcmN2aW50cGlwZSh1ZGV2LCBtaW1pby0+aW4uZGVzYy0+YkVuZHBvaW50QWRkcmVzcyk7CisJbWF4cCA9IHVzYl9tYXhwYWNrZXQodWRldiwgcGlwZSwgdXNiX3BpcGVvdXQocGlwZSkpOworCWlmIChtYXhwID4gTUlNSU9fTUFYUEFZTE9BRCkKKwkJbWF4cCA9IE1JTUlPX01BWFBBWUxPQUQ7CisJdXNiX2ZpbGxfaW50X3VyYihtaW1pby0+aW4udXJiLCB1ZGV2LCBwaXBlLCBtaW1pby0+aW4uYnVmLCBtYXhwLAorCQkJIG1pbWlvX2lycV9pbiwgbWltaW8sIG1pbWlvLT5pbi5kZXNjLT5iSW50ZXJ2YWwpOworCW1pbWlvLT5pbi51cmItPnRyYW5zZmVyX2RtYSA9IG1pbWlvLT5pbi5kbWE7CisJbWltaW8tPmluLnVyYi0+dHJhbnNmZXJfZmxhZ3MgfD0gVVJCX05PX1RSQU5TRkVSX0RNQV9NQVA7CisKKwkvKgorCSAqIEJ1aWxkIHRoZSBvdXRwdXQgdXJiLgorCSAqLworCXBpcGUgPSB1c2Jfc25kaW50cGlwZSh1ZGV2LCBtaW1pby0+b3V0LmRlc2MtPmJFbmRwb2ludEFkZHJlc3MpOworCW1heHAgPSB1c2JfbWF4cGFja2V0KHVkZXYsIHBpcGUsIHVzYl9waXBlb3V0KHBpcGUpKTsKKwlpZiAobWF4cCA+IE1JTUlPX01BWFBBWUxPQUQpCisJCW1heHAgPSBNSU1JT19NQVhQQVlMT0FEOworCXVzYl9maWxsX2ludF91cmIobWltaW8tPm91dC51cmIsIHVkZXYsIHBpcGUsIG1pbWlvLT5vdXQuYnVmLCBtYXhwLAorCQkJIG1pbWlvX2lycV9vdXQsIG1pbWlvLCBtaW1pby0+b3V0LmRlc2MtPmJJbnRlcnZhbCk7CisJbWltaW8tPm91dC51cmItPnRyYW5zZmVyX2RtYSA9IG1pbWlvLT5vdXQuZG1hOworCW1pbWlvLT5vdXQudXJiLT50cmFuc2Zlcl9mbGFncyB8PSBVUkJfTk9fVFJBTlNGRVJfRE1BX01BUDsKKworCS8qCisJICogQnVpbGQgaW5wdXQgZGV2aWNlIGluZm8KKwkgKi8KKwl1c2JfbWFrZV9wYXRoKHVkZXYsIHBhdGgsIDY0KTsKKwlzbnByaW50ZihtaW1pby0+cGh5cywgTUlNSU9fTUFYTkFNRUxFTiwgIiVzL2lucHV0MCIsIHBhdGgpOworCWlucHV0X3NldF9kcnZkYXRhKGlucHV0X2RldiwgbWltaW8pOworCS8qIGlucHV0X2Rldi0+ZGV2ID0gJmlmYy0+ZGV2OyAqLworCWlucHV0X2Rldi0+b3BlbiA9IG1pbWlvX29wZW47CisJaW5wdXRfZGV2LT5jbG9zZSA9IG1pbWlvX2Nsb3NlOworCWlucHV0X2Rldi0+bmFtZSA9IG1pbWlvX25hbWU7CisJaW5wdXRfZGV2LT5waHlzID0gbWltaW8tPnBoeXM7CisJaW5wdXRfZGV2LT5kZXYucGFyZW50ID0gJmlmYy0+ZGV2OworCisJaW5wdXRfZGV2LT5pZC5idXN0eXBlID0gQlVTX1VTQjsKKwlpbnB1dF9kZXYtPmlkLnZlbmRvciA9IGxlMTZfdG9fY3B1KHVkZXYtPmRlc2NyaXB0b3IuaWRWZW5kb3IpOworCWlucHV0X2Rldi0+aWQucHJvZHVjdCA9IGxlMTZfdG9fY3B1KHVkZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0KTsKKwlpbnB1dF9kZXYtPmlkLnZlcnNpb24gPSBsZTE2X3RvX2NwdSh1ZGV2LT5kZXNjcmlwdG9yLmJjZERldmljZSk7CisKKwlpbnB1dF9kZXYtPmV2Yml0WzBdIHw9IEJJVChFVl9LRVkpIHwgQklUKEVWX0FCUyk7CisJZm9yIChpID0gQlROX1RPT0xfUEVOOyBpIDw9IExPQ0FMQlROX1RPT0xfRVhUUkEyOyArK2kpCisJCXNldF9iaXQoaSwgaW5wdXRfZGV2LT5rZXliaXQpOworCisJaW5wdXRfZGV2LT5rZXliaXRbQklUX1dPUkQoQlROX01JU0MpXSB8PSBCSVRfTUFTSyhCVE5fMCkgfAorCQkJCQkJIEJJVF9NQVNLKEJUTl8xKSB8CisJCQkJCQkgQklUX01BU0soQlROXzIpIHwKKwkJCQkJCSBCSVRfTUFTSyhCVE5fMykgfAorCQkJCQkJIEJJVF9NQVNLKEJUTl80KSB8CisJCQkJCQkgQklUX01BU0soQlROXzUpOworCS8qICAgaW5wdXRfZGV2LT5rZXliaXRbQlROX01PVVNFXSB8PSBCSVQoQlROX0xFRlQpOyAqLworCWlucHV0X2Rldi0+YWJzYml0WzBdIHw9IEJJVF9NQVNLKEFCU19YKSB8IEJJVF9NQVNLKEFCU19ZKTsKKwlpbnB1dF9zZXRfYWJzX3BhcmFtcyhpbnB1dF9kZXYsIEFCU19YLCAwLCBNSU1JT19YUkFOR0VfTUFYLCAwLCAwKTsKKwlpbnB1dF9zZXRfYWJzX3BhcmFtcyhpbnB1dF9kZXYsIEFCU19ZLCAwLCBNSU1JT19ZUkFOR0VfTUFYLCAwLCAwKTsKKwlpbnB1dF9kZXYtPmFic2JpdFtCSVRfV09SRChBQlNfTUlTQyldIHw9IEJJVF9NQVNLKEFCU19NSVNDKTsKKworI2lmIDAKKwlpbnB1dF9kZXYtPmFic21pbltBQlNfWF0gPSAwOworCWlucHV0X2Rldi0+YWJzbWluW0FCU19ZXSA9IDA7CisJaW5wdXRfZGV2LT5hYnNtYXhbQUJTX1hdID0gOTYwMDsKKwlpbnB1dF9kZXYtPmFic21heFtBQlNfWV0gPSA0ODAwOworCWlucHV0X2Rldi0+YWJzZnV6eltBQlNfWF0gPSAwOworCWlucHV0X2Rldi0+YWJzZnV6eltBQlNfWV0gPSAwOworCWlucHV0X2Rldi0+YWJzZmxhdFtBQlNfWF0gPSAwOworCWlucHV0X2Rldi0+YWJzZmxhdFtBQlNfWV0gPSAwOworI2VuZGlmCisKKyNpZiAwCisJLyogdGhpcyB3aWxsIGp1c3QgcmVkdWNlIHRoZSBwcmVjaXNpb24gKi8KKwlpbnB1dF9kZXYtPmFic2Z1enpbQUJTX1hdID0gODsgLyogZXhwZXJpbWVudGFsOyBtYXkgbmVlZCB0byBjaGFuZ2UgKi8KKwlpbnB1dF9kZXYtPmFic2Z1enpbQUJTX1ldID0gODsgLyogZXhwZXJpbWVudGFsOyBtYXkgbmVlZCB0byBjaGFuZ2UgKi8KKyNlbmRpZgorCisJLyoKKwkgKiBSZWdpc3RlciB0aGUgaW5wdXQgZGV2aWNlLgorCSAqLworCXJlcyA9IGlucHV0X3JlZ2lzdGVyX2RldmljZShtaW1pby0+aWRldik7CisJaWYgKHJlcykgeworCQlkZXZfZXJyKCZ1ZGV2LT5kZXYsICJpbnB1dF9yZWdpc3Rlcl9kZXZpY2UgZmFpbHVyZSAoJWQpXG4iLAorCQkJcmVzKTsKKwkJbWltaW9fZGVhbGxvYyhtaW1pbyk7CisJCXJldHVybiAtRUlPOworCX0KKwlkZXZfZGJnKCZtaW1pby0+aWRldi0+ZGV2LCAiaW5wdXQ6ICVzIG9uICVzIChyZXMgPSAlZCkuXG4iLAorCQlpbnB1dF9kZXYtPm5hbWUsIGlucHV0X2Rldi0+cGh5cywgcmVzKTsKKworCXVzYl9zZXRfaW50ZmRhdGEoaWZjLCBtaW1pbyk7CisJbWltaW8tPnByZXNlbnQgPSAxOworCisJLyoKKwkgKiBTdWJtaXQgdGhlIGlucHV0IHVyYiB0byB0aGUgdXNiIHN1YnN5c3RlbS4KKwkgKi8KKwltaW1pby0+aW4udXJiLT5kZXYgPSBtaW1pby0+dWRldjsKKwlyZXMgPSB1c2Jfc3VibWl0X3VyYihtaW1pby0+aW4udXJiLCBHRlBfS0VSTkVMKTsKKwlpZiAocmVzKSB7CisJCWRldl9lcnIoJm1pbWlvLT5pZGV2LT5kZXYsICJ1c2Jfc3VibWl0X3VyYiBmYWlsdXJlICglZClcbiIsCisJCQlyZXMpOworCQltaW1pb19kZWFsbG9jKG1pbWlvKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJLyoKKwkgKiBBdHRlbXB0IHRvIGdyZWV0IHRoZSBtaW1pbyBhZnRlciBnaXZpbmcKKwkgKiBpdCBzb21lIHBvc3QtaW5pdCBzZXR0bGluZyB0aW1lLgorCSAqCisJICogbm90ZTogc29tZXRpbWVzIHRoaXMgc2xlZXAgaW50ZXJ2YWwgaXNuJ3QKKwkgKiBsb25nIGVub3VnaCB0byBwZXJtaXQgdGhlIGRldmljZSB0byByZS1pbml0CisJICogYWZ0ZXIgYSBob3Qtc3dhcDsgbWF5YmUgbmVlZCB0byBidW1wIGl0IHVwLgorCSAqCisJICogQXMgaXQgaXMsIHRoaXMgcHJvYmFibHkgYnJlYWtzIG1vZHVsZSB1bmxvYWRpbmcgc3VwcG9ydCEKKwkgKi8KKwltc2xlZXAoMTAyNCk7CisKKwlyZXMgPSBtaW1pb19ncmVldChtaW1pbyk7CisJaWYgKHJlcyA9PSAwKSB7CisJCWRldl9kYmcoJm1pbWlvLT5pZGV2LT5kZXYsICJNaW1pbyBncmVldGVkIE9LLlxuIik7CisJCW1pbWlvLT5ncmVldGVkID0gMTsKKwkJbWltaW8tPnJ4aGFuZGxlciA9IG1pbWlvX3J4X2hhbmRsZXI7CisJfSBlbHNlIHsKKwkJZGV2X2RiZygmbWltaW8tPmlkZXYtPmRldiwgIk1pbWlvIGdyZWV0IEZhaWx1cmUgKCVkKVxuIiwgcmVzKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBoYW5kbGVfbWltaW9fcnhfcGVudXBkb3duKHN0cnVjdCBtaW1pbyAqbWltaW8sCisJCQkJICAgICBpbnQgZG93biwKKwkJCQkgICAgIGNvbnN0IGNoYXIgKmNvbnN0IGluc3RyW10sCisJCQkJICAgICBjb25zdCBpbnQgaW5zdHJfb2ZzdFtdKQoreworCWludCBwZW5pZCwgeDsKKwlpZiAobWltaW8tPnBrdGJ1Zi5xIC0gbWltaW8tPnBrdGJ1Zi5wIDwgKGRvd24gPyA0IDogMykpCisJCXJldHVybiAxOyAJCS8qIHBhcnRpYWwgcGt0ICovCisKKwlpZiAoZG93bikgeworCQl4ID0gKm1pbWlvLT5wa3RidWYucCBeICoobWltaW8tPnBrdGJ1Zi5wICsgMSkgXgorCQkJKihtaW1pby0+cGt0YnVmLnAgKyAyKTsKKwkJaWYgKHggIT0gKihtaW1pby0+cGt0YnVmLnAgKyAzKSkgeworCQkJZGV2X2RiZygmbWltaW8tPmlkZXYtPmRldiwgIkVWX1BFTiVzOiBiYWQgeHN1bS5cbiIsCisJCQkJZG93biA/ICJET1dOIjoiVVAiKTsKKwkJCS8qIHNraXAgdGhpcyBldmVudCBkYXRhICovCisJCQltaW1pby0+cGt0YnVmLnAgKz0gNDsKKwkJCS8qIGRlY29kZSBhbnkgcmVtYWluaW5nIGV2ZW50cyAqLworCQkJcmV0dXJuIDA7CisJCX0KKwkJcGVuaWQgPSBtaW1pby0+cGt0YnVmLmluc3RyID0gKihtaW1pby0+cGt0YnVmLnAgKyAyKTsKKwkJaWYgKHBlbmlkID4gTUlNSU9fUEVOX01BWCkgeworCQkJZGV2X2RiZygmbWltaW8tPmlkZXYtPmRldiwKKwkJCQkiVW5tYXBwZWQgcGVuSUQgKG5vdCBpbiBbMCwgJWRdKTogJWRcbiIsCisJCQkJTUlNSU9fUEVOX01BWCwgKGludCltaW1pby0+cGt0YnVmLmluc3RyKTsKKwkJCXBlbmlkID0gbWltaW8tPnBrdGJ1Zi5pbnN0ciA9IDA7CisJCX0KKwkJbWltaW8tPmxhc3RfcGVuX2Rvd24gPSBwZW5pZDsKKwl9IGVsc2UgeworCQlwZW5pZCA9IG1pbWlvLT5sYXN0X3Blbl9kb3duOworCX0KKwlkZXZfZGJnKCZtaW1pby0+aWRldi0+ZGV2LCAiJXMgKGlkICVkLCBjb2RlICVkKSAlcy5cbiIsIGluc3RyW3BlbmlkXSwKKwkJaW5zdHJfb2ZzdFtwZW5pZF0sIHBlbmlkLCBkb3duID8gImRvd24iIDogInVwIik7CisKKwlpZiAoaW5zdHJfb2ZzdFtwZW5pZF0gPj0gMCkgeworCQlpbnQgY29kZSA9IEJUTl9UT09MX1BFTiArIGluc3RyX29mc3RbcGVuaWRdOworCQlpbnQgdmFsdWUgPSBkb3duID8gRE9XTlZBTFVFIDogVVBWQUxVRTsKKwkJaWYgKGNvZGUgPiBLRVlfTUFYKQorCQkJZGV2X2RiZygmbWltaW8tPmlkZXYtPmRldiwgImlucHV0X2V2ZW50IHdpbGwgaWdub3JlICIKKwkJCQkiLS0gY29kZSAoJWQpID4gS0VZX01BWFxuIiwgY29kZSk7CisJCWlmICghdGVzdF9iaXQoY29kZSwgbWltaW8tPmlkZXYtPmtleWJpdCkpCisJCQlkZXZfZGJnKCZtaW1pby0+aWRldi0+ZGV2LCAiaW5wdXRfZXZlbnQgd2lsbCBpZ25vcmUgIgorCQkJCSItLSBiaXQgZm9yIGNvZGUgKCVkKSBub3QgZW5hYmxlZFxuIiwgY29kZSk7CisJCWlmICghIXRlc3RfYml0KGNvZGUsIG1pbWlvLT5pZGV2LT5rZXkpID09IHZhbHVlKQorCQkJZGV2X2RiZygmbWltaW8tPmlkZXYtPmRldiwgImlucHV0X2V2ZW50IHdpbGwgaWdub3JlICIKKwkJCQkiLS0gYml0IGZvciBjb2RlICglZCkgYWxyZWFkeSBzZXQgdG8gJWRcbiIsCisJCQkJY29kZSwgdmFsdWUpOworCQlpZiAodmFsdWUgIT0gRE9XTlZBTFVFKSB7CisJCQkvKiBpbnB1dF9yZWdzKG1pbWlvLT5pZGV2LCByZWdzKTsgKi8KKwkJCWlucHV0X3JlcG9ydF9rZXkobWltaW8tPmlkZXYsIGNvZGUsIHZhbHVlKTsKKwkJCWlucHV0X3N5bmMobWltaW8tPmlkZXYpOworCQl9IGVsc2UgeworCQkJLyogd2FpdCB1bnRpbCB3ZSBnZXQgc29tZSBjb29yZGluYXRlcyAqLworCQl9CisJfSBlbHNlIHsKKwkJZGV2X2RiZygmbWltaW8tPmlkZXYtPmRldiwgInBlbklEIG9mZnNldFslZF0gPT0gJWQgaXMgPCAwICIKKwkJCSItIG5vdCBzZW5kaW5nXG4iLCBwZW5pZCwgaW5zdHJfb2ZzdFtwZW5pZF0pOworCX0KKwltaW1pby0+cGt0YnVmLnAgKz0gZG93biA/IDQgOiAzOyAvKiAzIGZvciB1cCwgNCBmb3IgZG93biAqLworCXJldHVybiAwOworfQorCisvKgorICogU3RheSB0dW5lZCBmb3IgcGFydGlhbC1wYWNrZXQgZXhjaXRlbWVudC4KKyAqCisgKiBUaGlzIHJvdXRpbmUgYnVmZmVycyBkYXRhIHBhY2tldHMgcmVjZWl2ZWQgZnJvbSB0aGUgbWltaW8gZGV2aWNlCisgKiBpbiB0aGUgbWltaW8ncyBkYXRhIHNwYWNlLiAgVGhpcyBidWZmZXJpbmcgaXMgbmVjZXNzYXJ5IGJlY2F1c2UKKyAqIHRoZSBtaW1pbydzIGluIGVuZHBvaW50IGNhbiBzZXJ2ZSB1cyBwYXJ0aWFsIHBhY2tldHMgb2YgZGF0YSwgYW5kCisgKiB3ZSB3YW50IHRoZSBkcml2ZXIgdG8gc3VwcG9ydCB0aGUgc2VydmljaW5nIG9mIG11bHRpcGxlIG1pbWlvcy4KKyAqIEVtcGlyaWNhbCBldmlkZW5jZSBnYXRoZXJlZCBzbyBmYXIgc3VnZ2VzdHMgdGhhdCB0aGUgbWV0aG9kIG9mCisgKiBidWZmZXJpbmcgcGFja2V0IGRhdGEgaW4gdGhlIG1pbWlvJ3MgZGF0YSBzcGFjZSB3b3Jrcy4gIFByZXZpb3VzCisgKiB2ZXJzaW9ucyBvZiB0aGlzIGRyaXZlciBkaWQgbm90IGJ1ZmZlciBwYWNrZXQgZGF0YSBpbiBlYWNoIG1pbWlvJ3MKKyAqIGRhdGEtc3BhY2UsIGFuZCB3ZXJlIHRoZXJlZm9yZSBub3QgYWJsZSB0byBzZXJ2aWNlIG11bHRpcGxlIG1pbWlvcy4KKyAqIE5vdGUgdGhhdCBzaW5jZSB0aGUgY2FsbGVyIG9mIHRoaXMgcm91dGluZSBpcyBydW5uaW5nIGluIGludGVycnVwdAorICogY29udGV4dCwgY2FyZSBuZWVkcyB0byBiZSB0YWtlbiB0byBlbnN1cmUgdGhhdCB0aGlzIHJvdXRpbmUgZG9lcyBub3QKKyAqIGJlY29tZSBibG9hdGVkLCBhbmQgaXQgbWF5IGJlIHRoYXQgYW5vdGhlciBzcGlubG9jayBpcyBuZWVkZWQgaW4gZWFjaAorICogbWltaW8gdG8gZ3VhcmQgdGhlIGJ1ZmZlcmVkIHBhY2tldCBkYXRhIHByb3Blcmx5LgorICovCitzdGF0aWMgdm9pZCBtaW1pb19yeF9oYW5kbGVyKHN0cnVjdCBtaW1pbyAqbWltaW8sCisJCQkgICAgIHVuc2lnbmVkIGNoYXIgKmRhdGEsCisJCQkgICAgIHVuc2lnbmVkIGludCBuYnl0ZXMpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJm1pbWlvLT5pZGV2LT5kZXY7CisJdW5zaWduZWQgaW50IHg7CisJdW5zaWduZWQgaW50IHk7CisJc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBpbnN0cltdID0geworCQkiPzAiLAorCQkiYmxhY2sgcGVuIiwgImJsdWUgcGVuIiwgImdyZWVuIHBlbiIsICJyZWQgcGVuIiwKKwkJImJyb3duIHBlbiIsICJvcmFuZ2UgcGVuIiwgInB1cnBsZSBwZW4iLCAieWVsbG93IHBlbiIsCisJCSJiaWcgZXJhc2VyIiwgImxpbCBlcmFzZXIiLAorCQkiPzExIiwgIj8xMiIsICI/MTMiLCAiPzE0IiwgIj8xNSIsICI/MTYiLAorCQkibWltaW8gaW50ZXJhY3RpdmUiLCAiaW50ZXJhY3RpdmUgYnV0dG9uMSIsCisJCSJpbnRlcmFjdGl2ZSBidXR0b24yIgorCX07CisKKwkvKiBNaW1pbyBJbnRlcmFjdGl2ZSBnaXZlczoKKwkgKiBkb3duOiBbMHgyMiAweDAxIDB4MTEgMHgzMiAweDI0XQorCSAqIGIxICA6IFsweDIyIDB4MDEgMHgxMiAweDMxIDB4MjRdCisJICogYjIgIDogWzB4MjIgMHgwMSAweDEzIDB4MzAgMHgyNF0KKwkgKi8KKwlzdGF0aWMgY29uc3QgaW50IGluc3RyX29mc3RbXSA9IHsKKwkJLTEsCisJCTAsIDEsIDIsIDMsCisJCTksIDksIDksIDksCisJCTQsIDUsCisJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCTYsIDcsIDgsCisJfTsKKworCW1lbWNweShtaW1pby0+cGt0YnVmLnEsIGRhdGEsIG5ieXRlcyk7CisJbWltaW8tPnBrdGJ1Zi5xICs9IG5ieXRlczsKKworCXdoaWxlIChtaW1pby0+cGt0YnVmLnAgPCBtaW1pby0+cGt0YnVmLnEpIHsKKwkJaW50IHQgPSAqbWltaW8tPnBrdGJ1Zi5wOworCQlzd2l0Y2ggKHQpIHsKKwkJY2FzZSBNSU1JT19FVl9QRU5VUDoKKwkJY2FzZSBNSU1JT19FVl9QRU5ET1dOOgorCQkJaWYgKGhhbmRsZV9taW1pb19yeF9wZW51cGRvd24obWltaW8sCisJCQkJCQkgICAgICB0ID09IE1JTUlPX0VWX1BFTkRPV04sCisJCQkJCQkgICAgICBpbnN0ciwgaW5zdHJfb2ZzdCkpCisJCQkJcmV0dXJuOyAvKiBwYXJ0aWFsIHBhY2tldCAqLworCQkJYnJlYWs7CisKKwkJY2FzZSBNSU1JT19FVl9QRU5EQVRBOgorCQkJaWYgKG1pbWlvLT5wa3RidWYucSAtIG1pbWlvLT5wa3RidWYucCA8IDYpCisJCQkJLyogcGFydGlhbCBwa3QgKi8KKwkJCQlyZXR1cm47CisJCQl4ID0gKm1pbWlvLT5wa3RidWYucCBeICoobWltaW8tPnBrdGJ1Zi5wICsgMSkgXgorCQkJCSoobWltaW8tPnBrdGJ1Zi5wICsgMikgXgorCQkJCSoobWltaW8tPnBrdGJ1Zi5wICsgMykgXgorCQkJCSoobWltaW8tPnBrdGJ1Zi5wICsgNCk7CisJCQlpZiAoeCAhPSAqKG1pbWlvLT5wa3RidWYucCArIDUpKSB7CisJCQkJZGV2X2RiZyhkZXYsICJFVl9QRU5EQVRBOiBiYWQgeHN1bS5cbiIpOworCQkJCW1pbWlvLT5wa3RidWYucCArPSA2OyAvKiBza2lwIHRoaXMgZXZlbnQgZGF0YSAqLworCQkJCWJyZWFrOyAvKiBkZWNvZGUgYW55IHJlbWFpbmluZyBldmVudHMgKi8KKwkJCX0KKwkJCXggPSAqKG1pbWlvLT5wa3RidWYucCArIDEpOworCQkJeCA8PD0gODsKKwkJCXggfD0gKihtaW1pby0+cGt0YnVmLnAgKyAyKTsKKwkJCXkgPSAqKG1pbWlvLT5wa3RidWYucCArIDMpOworCQkJeSA8PD0gODsKKwkJCXkgfD0gKihtaW1pby0+cGt0YnVmLnAgKyA0KTsKKwkJCWRldl9kYmcoZGV2LCAiY29vcmQ6ICglZCwgJWQpXG4iLCB4LCB5KTsKKwkJCWlmIChpbnN0cl9vZnN0W21pbWlvLT5wa3RidWYuaW5zdHJdID49IDApIHsKKwkJCQlpbnQgY29kZSA9IEJUTl9UT09MX1BFTiArCisJCQkJCSAgIGluc3RyX29mc3RbbWltaW8tPmxhc3RfcGVuX2Rvd25dOworI2lmIDAKKwkJCQkvKiBVdHRlciBoYWNrIHRvIGVuc3VyZSB3ZSBnZXQgZm9yd2FyZGVkIF9BTkRfCisJCQkJICogc28gd2UgY2FuIGlkZW50aWZ5IHdoZW4gYSBjb21wbGV0ZSBzaWduYWwgaXMKKwkJCQkgKiByZWNlaXZlZCAqLworCQkJCW1pbWlvLT5pZGV2LT5hYnNbQUJTX1ldID0gLTE7CisJCQkJbWltaW8tPmlkZXYtPmFic1tBQlNfWF0gPSAtMTsKKyNlbmRpZgorCQkJCS8qIGlucHV0X3JlZ3MobWltaW8tPmlkZXYsIHJlZ3MpOyAqLworCQkJCWlucHV0X3JlcG9ydF9hYnMobWltaW8tPmlkZXYsIEFCU19YLCB4KTsKKwkJCQlpbnB1dF9yZXBvcnRfYWJzKG1pbWlvLT5pZGV2LCBBQlNfWSwgeSk7CisJCQkJLyogZmFrZSBhIHBlbnVwICovCisJCQkJY2hhbmdlX2JpdChjb2RlLCBtaW1pby0+aWRldi0+a2V5KTsKKwkJCQlpbnB1dF9yZXBvcnRfa2V5KG1pbWlvLT5pZGV2LAorCQkJCQkJIGNvZGUsCisJCQkJCQkgRE9XTlZBTFVFKTsKKwkJCQkvKiBhbHdheXMgc3luYyBoZXJlICovCisJCQkJbWltaW8tPmlkZXYtPnN5bmMgPSAwOworCQkJCWlucHV0X3N5bmMobWltaW8tPmlkZXYpOworCQkJfQorCQkJbWltaW8tPnBrdGJ1Zi5wICs9IDY7CisJCQlicmVhazsKKwkJY2FzZSBNSU1JT19FVl9NRU1SRVNFVDoKKwkJCWlmIChtaW1pby0+cGt0YnVmLnEgLSBtaW1pby0+cGt0YnVmLnAgPCA3KQorCQkJCS8qIHBhcnRpYWwgcGt0ICovCisJCQkJcmV0dXJuOworCQkJZGV2X2RiZyhkZXYsICJtZW0tcmVzZXQuXG4iKTsKKwkJCS8qIGlucHV0X3JlZ3MobWltaW8tPmlkZXYsIHJlZ3MpOyAqLworCQkJaW5wdXRfZXZlbnQobWltaW8tPmlkZXYsIEVWX0tFWSwgQlROXzAsIDEpOworCQkJaW5wdXRfZXZlbnQobWltaW8tPmlkZXYsIEVWX0tFWSwgQlROXzAsIDApOworCQkJaW5wdXRfc3luYyhtaW1pby0+aWRldik7CisJCQltaW1pby0+cGt0YnVmLnAgKz0gNzsKKwkJCWJyZWFrOworCQljYXNlIE1JTUlPX0VWX0FDQzoKKwkJCWlmIChtaW1pby0+cGt0YnVmLnEgLSBtaW1pby0+cGt0YnVmLnAgPCA0KQorCQkJCS8qIHBhcnRpYWwgcGt0ICovCisJCQkJcmV0dXJuOworCQkJeCA9ICptaW1pby0+cGt0YnVmLnAgXiAqKG1pbWlvLT5wa3RidWYucCArIDEpIF4KKwkJCQkqKG1pbWlvLT5wa3RidWYucCArIDIpOworCQkJaWYgKHggIT0gKihtaW1pby0+cGt0YnVmLnAgKyAzKSkgeworCQkJCWRldl9kYmcoZGV2LCAiRVZfQUNDOiBiYWQgeHN1bS5cbiIpOworCQkJCW1pbWlvLT5wa3RidWYucCArPSA0OyAvKiBza2lwIHRoaXMgZXZlbnQgZGF0YSAqLworCQkJCWJyZWFrOyAvKiBkZWNvZGUgYW55IHJlbWFpbmluZyBldmVudHMgKi8KKwkJCX0KKwkJCXN3aXRjaCAoKihtaW1pby0+cGt0YnVmLnAgKyAyKSkgeworCQkJY2FzZSBBQ0NfTkVXUEFHRToKKwkJCQlkZXZfZGJnKCZtaW1pby0+aWRldi0+ZGV2LCAibmV3LXBhZ2UuXG4iKTsKKwkJCQkvKiBpbnB1dF9yZWdzKG1pbWlvLT5pZGV2LCByZWdzKTsgKi8KKwkJCQlpbnB1dF9ldmVudChtaW1pby0+aWRldiwgRVZfS0VZLCBCVE5fMSwgMSk7CisJCQkJaW5wdXRfZXZlbnQobWltaW8tPmlkZXYsIEVWX0tFWSwgQlROXzEsIDApOworCQkJCWlucHV0X3N5bmMobWltaW8tPmlkZXYpOworCQkJCWJyZWFrOworCQkJY2FzZSBBQ0NfVEFHUEFHRToKKwkJCQlkZXZfZGJnKCZtaW1pby0+aWRldi0+ZGV2LCAidGFnLXBhZ2UuXG4iKTsKKwkJCQkvKiBpbnB1dF9yZWdzKG1pbWlvLT5pZGV2LCByZWdzKTsgKi8KKwkJCQlpbnB1dF9ldmVudChtaW1pby0+aWRldiwgRVZfS0VZLCBCVE5fMiwgMSk7CisJCQkJaW5wdXRfZXZlbnQobWltaW8tPmlkZXYsIEVWX0tFWSwgQlROXzIsIDApOworCQkJCWlucHV0X3N5bmMobWltaW8tPmlkZXYpOworCQkJCWJyZWFrOworCQkJY2FzZSBBQ0NfUFJJTlRQQUdFOgorCQkJCWRldl9kYmcoJm1pbWlvLT5pZGV2LT5kZXYsICJwcmludC1wYWdlLlxuIik7CisJCQkJLyogaW5wdXRfcmVncyhtaW1pby0+aWRldiwgcmVncyk7Ki8KKwkJCQlpbnB1dF9ldmVudChtaW1pby0+aWRldiwgRVZfS0VZLCBCVE5fMywgMSk7CisJCQkJaW5wdXRfZXZlbnQobWltaW8tPmlkZXYsIEVWX0tFWSwgQlROXzMsIDApOworCQkJCWlucHV0X3N5bmMobWltaW8tPmlkZXYpOworCQkJCWJyZWFrOworCQkJY2FzZSBBQ0NfTUFYSU1JWkU6CisJCQkJZGV2X2RiZygmbWltaW8tPmlkZXYtPmRldiwKKwkJCQkJIm1heGltaXplLXdpbmRvdy5cbiIpOworCQkJCS8qIGlucHV0X3JlZ3MobWltaW8tPmlkZXYsIHJlZ3MpOyAqLworCQkJCWlucHV0X2V2ZW50KG1pbWlvLT5pZGV2LCBFVl9LRVksIEJUTl80LCAxKTsKKwkJCQlpbnB1dF9ldmVudChtaW1pby0+aWRldiwgRVZfS0VZLCBCVE5fNCwgMCk7CisJCQkJaW5wdXRfc3luYyhtaW1pby0+aWRldik7CisJCQkJYnJlYWs7CisJCQljYXNlIEFDQ19GSU5EQ1RMUE5MOgorCQkJCWRldl9kYmcoJm1pbWlvLT5pZGV2LT5kZXYsICJmaW5kLWN0bC1wYW5lbC5cbiIpOworCQkJCS8qIGlucHV0X3JlZ3MobWltaW8tPmlkZXYsIHJlZ3MpOyAqLworCQkJCWlucHV0X2V2ZW50KG1pbWlvLT5pZGV2LCBFVl9LRVksIEJUTl81LCAxKTsKKwkJCQlpbnB1dF9ldmVudChtaW1pby0+aWRldiwgRVZfS0VZLCBCVE5fNSwgMCk7CisJCQkJaW5wdXRfc3luYyhtaW1pby0+aWRldik7CisJCQkJYnJlYWs7CisJCQljYXNlIEFDQ19ET05FOgorCQkJCWRldl9kYmcoJm1pbWlvLT5pZGV2LT5kZXYsICJhY2MtZG9uZS5cbiIpOworCQkJCS8qIG5vIGV2ZW50IGlzIGRpc3BhdGNoZWQgdG8gdGhlIGlucHV0CisJCQkJICogc3Vic3lzdGVtIGZvciB0aGlzIGRldmljZSBldmVudC4KKwkJCQkgKi8KKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJZGV2X2RiZyhkZXYsICJ1bmtub3duIGFjYyBldmVudC5cbiIpOworCQkJCWJyZWFrOworCQkJfQorCQkJbWltaW8tPnBrdGJ1Zi5wICs9IDQ7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCW1pbWlvLT5wa3RidWYucCsrOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvKgorCSAqIE5vIHBhcnRpYWwgZXZlbnQgd2FzIHJlY2VpdmVkLCBzbyByZXNldCBtaW1pbydzIHBrdGJ1ZiBwdHJzLgorCSAqLworCW1pbWlvLT5wa3RidWYucCA9IG1pbWlvLT5wa3RidWYucSA9IG1pbWlvLT5wa3RidWYuYnVmOworfQorCitzdGF0aWMgaW50IG1pbWlvX3R4KHN0cnVjdCBtaW1pbyAqbWltaW8sIGNvbnN0IGNoYXIgKmJ1ZiwgaW50IG5ieXRlcykKK3sKKwlpbnQgcnNsdDsKKwlpbnQgdGltZW91dDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCisJaWYgKCEoaXN2YWxpZHR4c2l6ZShuYnl0ZXMpKSkgeworCQlkZXZfZXJyKCZtaW1pby0+aWRldi0+ZGV2LCAiaW52YWxpZCBhcmc6IG5ieXRlczogJWQuXG4iLAorCQkJbmJ5dGVzKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyoKKwkgKiBJbml0IHRoZSBvdXQgdXJiIGFuZCBjb3B5IHRoZSBkYXRhIHRvIHNlbmQuCisJICovCisJbWltaW8tPm91dC51cmItPmRldiA9IG1pbWlvLT51ZGV2OworCW1pbWlvLT5vdXQudXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID0gbmJ5dGVzOworCW1lbWNweShtaW1pby0+b3V0LnVyYi0+dHJhbnNmZXJfYnVmZmVyLCBidWYsIG5ieXRlcyk7CisKKwkvKgorCSAqIFNlbmQgdGhlIGRhdGEuCisJICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJm1pbWlvLT50eGxvY2ssIGZsYWdzKTsKKwltaW1pby0+dHhmbGFncyA9IE1JTUlPX1RYV0FJVDsKKwlyc2x0ID0gdXNiX3N1Ym1pdF91cmIobWltaW8tPm91dC51cmIsIEdGUF9BVE9NSUMpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1pbWlvLT50eGxvY2ssIGZsYWdzKTsKKwlkZXZfZGJnKCZtaW1pby0+aWRldi0+ZGV2LCAicnNsdDogJWQuXG4iLCByc2x0KTsKKworCWlmIChyc2x0KSB7CisJCWRldl9lcnIoJm1pbWlvLT5pZGV2LT5kZXYsICJ1c2Jfc3VibWl0X3VyYiBmYWlsdXJlOiAlZC5cbiIsCisJCQlyc2x0KTsKKwkJcmV0dXJuIHJzbHQ7CisJfQorCisJLyoKKwkgKiBXYWl0IGZvciBjb21wbGV0aW9uIHRvIGJlIHNpZ25hbGxlZCAodGhlIG1pbWlvX2lycV9vdXQKKwkgKiBjb21wbGV0aW9uIHJvdXRpbmUgd2lsbCBvciBNSU1JT19UWERPTkUgaW4gd2l0aCB0eGZsYWdzKS4KKwkgKi8KKwl0aW1lb3V0ID0gSFo7CisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwlhZGRfd2FpdF9xdWV1ZSgmbWltaW8tPndhaXRxLCAmd2FpdCk7CisKKwl3aGlsZSAodGltZW91dCAmJiAoKG1pbWlvLT50eGZsYWdzICYgTUlNSU9fVFhET05FKSA9PSAwKSkgeworCQl0aW1lb3V0ID0gc2NoZWR1bGVfdGltZW91dCh0aW1lb3V0KTsKKwkJcm1iKCk7CisJfQorCisJaWYgKChtaW1pby0+dHhmbGFncyAmIE1JTUlPX1RYRE9ORSkgPT0gMCkKKwkJZGV2X2RiZygmbWltaW8tPmlkZXYtPmRldiwgInR4IHRpbWVkIG91dC5cbiIpOworCisJLyoKKwkgKiBOb3cgdGhhdCBjb21wbGV0aW9uIGhhcyBiZWVuIHNpZ25hbGxlZCwKKwkgKiB1bmxpbmsgdGhlIHVyYiBzbyB0aGF0IGl0IGNhbiBiZSByZWN5Y2xlZC4KKwkgKi8KKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCXJlbW92ZV93YWl0X3F1ZXVlKCZtaW1pby0+d2FpdHEsICZ3YWl0KTsKKwl1c2JfdW5saW5rX3VyYihtaW1pby0+b3V0LnVyYik7CisKKwlyZXR1cm4gcnNsdDsKK30KKworc3RhdGljIGludCBfX2luaXQgbWltaW9faW5pdCh2b2lkKQoreworCWludCByc2x0OworCisJcnNsdCA9IHVzYl9yZWdpc3RlcigmbWltaW9fZHJpdmVyKTsKKwlpZiAocnNsdCAhPSAwKSB7CisJCWVycigiJXM6IHVzYl9yZWdpc3RlciBmYWlsdXJlOiAlZCIsIF9fZnVuY19fLCByc2x0KTsKKwkJcmV0dXJuIHJzbHQ7CisJfQorCisJcHJpbnRrKEtFUk5fSU5GTyBLQlVJTERfTU9ETkFNRSAiOiIKKwkgICAgICAgRFJJVkVSX0RFU0MgIiAiIERSSVZFUl9WRVJTSU9OICJcbiIpOworCXJldHVybiByc2x0OworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgbWltaW9fZXhpdCh2b2lkKQoreworCXVzYl9kZXJlZ2lzdGVyKCZtaW1pb19kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChtaW1pb19pbml0KTsKK21vZHVsZV9leGl0KG1pbWlvX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKERSSVZFUl9BVVRIT1IpOworTU9EVUxFX0RFU0NSSVBUSU9OKERSSVZFUl9ERVNDKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9hbXNkdS5jIGIvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2Ftc2R1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzkxMjNkNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9hbXNkdS5jCkBAIC0wLDAgKzEsMTM0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggQXRoZXJvcyBDb21tdW5pY2F0aW9ucyBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgImNwcmVjb21wLmgiCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmR2V0QW1zZHVTdWJGcmFtZSAgICAgICAgICAqLworLyogICAgICBHZXQgYSBzdWJmcmFtZSBmcm9tIGEtTVNEVS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYnVmIDogQS1NU0RVIGZyYW1lIGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIG9mZnNldCA6IG9mZnNldCBvZiBzdWJmcmFtZSBpbiB0aGUgQS1NU0RVICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIE5VTEwgb3Igc3ViZnJhbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFN0ZXBoZW4gQ2hlbiAgICAgICAgQXRoZXJvcyBDb21tdW5pY2F0aW9ucywgSU5DLiAgICAyMDA3LjIgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit6YnVmX3QqIHpmR2V0QW1zZHVTdWJGcmFtZSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90KiBvZmZzZXQpCit7CisgICAgdTE2X3Qgc3ViZnJhbWVMZW47CisgICAgdTE2X3QgYW1zZHVMZW4gPSB6ZndCdWZHZXRTaXplKGRldiwgYnVmKTsKKyAgICB6YnVmX3QqIG5ld0J1ZjsKKworICAgIFpNX1BFUkZPUk1BTkNFX1JYX0FNU0RVKGRldiwgYnVmLCBhbXNkdUxlbik7CisKKyAgICAvKiBWZXJpZnkgQS1NU0RVIGxlbmd0aCAqLworICAgIGlmIChhbXNkdUxlbiA8ICgqb2Zmc2V0ICsgMTQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgLyogTG9jYXRlIEEtTVNEVSBzdWJmcmFtZSBieSBvZmZzZXQgYW5kIHZlcmlmeSBzdWJmcmFtZSBsZW5ndGggKi8KKyAgICBzdWJmcmFtZUxlbiA9ICh6bXdfYnVmX3JlYWRiKGRldiwgYnVmLCAqb2Zmc2V0ICsgMTIpIDw8IDgpICsKKyAgICAgICAgICAgICAgICAgIHptd19idWZfcmVhZGIoZGV2LCBidWYsICpvZmZzZXQgKyAxMyk7CisgICAgaWYgKHN1YmZyYW1lTGVuID09IDApCisgICAgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICAvKiBWZXJpZnkgQS1NU0RVIHN1YmZyYW1lIGxlbmd0aCAqLworICAgIGlmICgoKm9mZnNldCsxNCtzdWJmcmFtZUxlbikgPD0gYW1zZHVMZW4pCisgICAgeworICAgICAgICAvKiBBbGxvY2F0ZSBhIG5ldyBidWZmZXIgKi8KKyAgICAgICAgaWYgKChuZXdCdWYgPSB6ZndCdWZBbGxvY2F0ZShkZXYsIDI0KzIrc3ViZnJhbWVMZW4pKSAhPSBOVUxMKQorICAgICAgICB7CisjaWZkZWYgWk1fRU5BQkxFX05BVElWRV9XSUZJCisgICAgICAgICAgICAvKiBDb3B5IGFuZCBjb252ZXJ0IHN1YmZyYW1lIHRvIHdsYW4gZnJhbWUgZm9ybWF0ICovCisgICAgICAgICAgICAvKiBTSEFMTCBOT1QgSU5DTFVERSBRT1MgYW5kIEFNU0RVIGhlYWRlci4gUmF5IDIwMDcwODA3IEZvciBWaXN0YSAqLworICAgICAgICAgICAgemZSeEJ1ZmZlckNvcHkoZGV2LCBuZXdCdWYsIGJ1ZiwgMCwgMCwgMjQpOworICAgICAgICAgICAgemZSeEJ1ZmZlckNvcHkoZGV2LCBuZXdCdWYsIGJ1ZiwgMjQsICpvZmZzZXQrMTQsIHN1YmZyYW1lTGVuKTsKKyAgICAgICAgICAgIHpmd0J1ZlNldFNpemUoZGV2LCBuZXdCdWYsIDI0K3N1YmZyYW1lTGVuKTsKKyNlbHNlCisgICAgICAgICAgICAvKiBDb3B5IHN1YmZyYW1lIHRvIG5ldyBidWZmZXIgKi8KKyAgICAgICAgICAgIHpmUnhCdWZmZXJDb3B5KGRldiwgbmV3QnVmLCBidWYsIDAsICpvZmZzZXQsIDE0K3N1YmZyYW1lTGVuKTsKKyAgICAgICAgICAgIHpmd0J1ZlNldFNpemUoZGV2LCBuZXdCdWYsIDE0K3N1YmZyYW1lTGVuKTsKKyNlbmRpZgorICAgICAgICAgICAgLyogVXBkYXRlIG9mZnNldCAqLworICAgICAgICAgICAgKm9mZnNldCArPSAoKCgxNCtzdWJmcmFtZUxlbikrMykgJiAweGZmZmMpOworCisgICAgICAgICAgICAvKiBSZXR1cm4gYnVmZmVyIHBvaW50ZXIgKi8KKyAgICAgICAgICAgIHJldHVybiBuZXdCdWY7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmRGVBbXNkdSAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBEZS1BTVNEVS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYnVmIDogQS1NU0RVIGZyYW1lIGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIHZhcCA6IFZBUCBwb3J0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIE5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFN0ZXBoZW4gQ2hlbiAgICAgICAgQXRoZXJvcyBDb21tdW5pY2F0aW9ucywgSU5DLiAgICAyMDA3LjIgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHpmRGVBbXNkdSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IHZhcCwgdThfdCBlbmNyeU1vZGUpCit7CisgICAgdTE2X3Qgb2Zmc2V0ID0gWk1fU0laRV9PRl9XTEFOX0RBVEFfSEVBREVSK1pNX1NJWkVfT0ZfUU9TX0NUUkw7CisgICAgemJ1Zl90KiBzdWJmcmFtZUJ1ZjsKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBaTV9CVUZGRVJfVFJBQ0UoZGV2LCBidWYpCisKKyAgICBpZiAoZW5jcnlNb2RlID09IFpNX0FFUyB8fCBlbmNyeU1vZGUgPT0gWk1fVEtJUCkKKyAgICB7CisgICAgICAgIG9mZnNldCArPSAoWk1fU0laRV9PRl9JViArIFpNX1NJWkVfT0ZfRVhUX0lWKTsKKyAgICB9CisgICAgZWxzZSBpZiAoZW5jcnlNb2RlID09IFpNX1dFUDY0IHx8IGVuY3J5TW9kZSA9PSBaTV9XRVAxMjgpCisgICAgeworICAgICAgICBvZmZzZXQgKz0gWk1fU0laRV9PRl9JVjsKKyAgICB9CisKKyAgICAvKiBSZXBlYXRseSBjYWxsaW5nIHpmR2V0QW1zZHVTdWJGcmFtZSgpIHVudGlsIE5VTEwgcmV0dXJuZWQgKi8KKyAgICB3aGlsZSAoKHN1YmZyYW1lQnVmID0gemZHZXRBbXNkdVN1YkZyYW1lKGRldiwgYnVmLCAmb2Zmc2V0KSkgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHdkLT5jb21tVGFsbHkuTm90aWZ5TkRJU1J4RnJtQ250Kys7CisgICAgICAgIGlmICh3ZC0+emZjYlJlY3ZFdGggIT0gTlVMTCkKKyAgICAJeworICAgICAgICAgICAgd2QtPnpmY2JSZWN2RXRoKGRldiwgc3ViZnJhbWVCdWYsICh1OF90KXZhcCk7CisgICAgICAgICAgICBaTV9QRVJGT1JNQU5DRV9SWF9NU0RVKGRldiwgd2QtPnRpY2spOworICAgICAgICB9CisgICAgfQorICAgIHpmd0J1ZkZyZWUoZGV2LCBidWYsIDApOworCisgICAgcmV0dXJuOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2NhZ2cuYyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9jYWdnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDk0MjE5MAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9jYWdnLmMKQEAgLTAsMCArMSwzNjExIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggQXRoZXJvcyBDb21tdW5pY2F0aW9ucyBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kdWxlIE5hbWUgOiBjYWdnLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBBYnN0cmFjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFRoaXMgbW9kdWxlIGNvbnRhaW5zIEEtTVBEVSBhZ2dyZWdhdGlvbiByZWxhdGVkIGZ1bmN0aW9ucy4gICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBOT1RFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIE5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJjcHJlY29tcC5oIgorCitleHRlcm4gdThfdCB6Y1VwVG9BY1s4XTsKK2NvbnN0IHU4X3QgcHJpW10gPSB7MywzLDIsMywyLDEsMywyLDEsMH07CisKKwordTE2X3QgYWdncl9jb3VudDsKK3UzMl90IHN1Y2Nlc3NfbXBkdTsKK3UzMl90IHRvdGFsX21wZHU7CisKK3ZvaWQgemZBZ2dJbml0KHpkZXZfdCogZGV2KQoreworICAgIHUxNl90IGksajsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisgICAgLyoKKyAgICAgKiByZXNldCBzdGEgaW5mb3JtYXRpb24KKyAgICAgKi8KKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgd2QtPmFnZ0luaXRpYXRlZCA9IDA7CisgICAgd2QtPmFkZGJhQ29tcGxldGUgPSAwOworICAgIHdkLT5hZGRiYUNvdW50ID0gMDsKKyAgICB3ZC0+cmVvcmRlciA9IDE7CisgICAgZm9yIChpPTA7IGk8Wk1fTUFYX1NUQV9TVVBQT1JUOyBpKyspCisgICAgeworICAgICAgICBmb3IgKGo9MDsgajxaTV9BQzsgaisrKQorICAgICAgICB7CisgICAgICAgICAgICAvL3dkLT5hZ2dTdGFbaV0uYWdnUU51bWJlcltqXSA9IFpNX0FHR19QT09MX1NJWkU7CisgICAgICAgICAgICB3ZC0+YWdnU3RhW2ldLmFnZ0ZsYWdbal0gPSB3ZC0+YWdnU3RhW2ldLmNvdW50W2pdID0gMDsKKyAgICAgICAgICAgIHdkLT5hZ2dTdGFbaV0udGlkX3R4W2pdID0gTlVMTDsKKyAgICAgICAgICAgIHdkLT5hZ2dTdGFbaV0udGlkX3R4W2orMV0gPSBOVUxMOworCisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIHJlc2V0IFR4L1J4IGFnZ3JlZ2F0aW9uIHF1ZXVlIGluZm9ybWF0aW9uCisgICAgICovCisgICAgd2QtPmFnZ1N0YXRlID0gMDsKKyAgICBmb3IgKGk9MDsgaTxaTV9BR0dfUE9PTF9TSVpFOyBpKyspCisgICAgeworICAgICAgICAvKgorICAgICAgICAgKiByZXNldCB0eCBhZ2dyZWdhdGlvbiBxdWV1ZQorICAgICAgICAgKi8KKyAgICAgICAgd2QtPmFnZ1FQb29sW2ldID0gemZ3TWVtQWxsb2NhdGUoZGV2LCBzaXplb2Yoc3RydWN0IGFnZ1F1ZXVlKSk7CisgICAgICAgIGlmKCF3ZC0+YWdnUVBvb2xbaV0pCisgICAgICAgIHsKKyAgICAgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgd2QtPmFnZ1FQb29sW2ldLT5hZ2dIZWFkID0gd2QtPmFnZ1FQb29sW2ldLT5hZ2dUYWlsID0KKyAgICAgICAgd2QtPmFnZ1FQb29sW2ldLT5hZ2dRRW5hYmxlZCA9IHdkLT5hZ2dRUG9vbFtpXS0+YWdnUmVhZHkgPQorICAgICAgICB3ZC0+YWdnUVBvb2xbaV0tPmNsZWFyRmxhZyA9IHdkLT5hZ2dRUG9vbFtpXS0+ZGVsZXRlRmxhZyA9IDA7CisgICAgICAgIC8vd2QtPmFnZ1FQb29sW2ldLT5hZ2dTaXplID0gMTY7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogcmVzZXQgcnggYWdncmVnYXRpb24gcXVldWUKKyAgICAgICAgICovCisgICAgICAgIHdkLT50aWRfcnhbaV0gPSB6ZndNZW1BbGxvY2F0ZShkZXYsIHNpemVvZihzdHJ1Y3QgYWdnX3RpZF9yeCkpOworICAgICAgICBpZiAoIXdkLT50aWRfcnhbaV0pCisgICAgICAgIHsKKyAgICAgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgd2QtPnRpZF9yeFtpXS0+YWlkID0gWk1fTUFYX1NUQV9TVVBQT1JUOworICAgICAgICB3ZC0+dGlkX3J4W2ldLT5zZXFfc3RhcnQgPSB3ZC0+dGlkX3J4W2ldLT5iYXdfaGVhZCA9IFwKKyAgICAgICAgd2QtPnRpZF9yeFtpXS0+YmF3X3RhaWwgPSAwOworICAgICAgICB3ZC0+dGlkX3J4W2ldLT5zcV9leGNlZWRfY291bnQgPSB3ZC0+dGlkX3J4W2ldLT5zcV9iZWhpbmRfY291bnQgPSAwOworICAgICAgICBmb3IgKGo9MDsgajw9Wk1fQUdHX0JBV19TSVpFOyBqKyspCisgICAgICAgICAgICB3ZC0+dGlkX3J4W2ldLT5mcmFtZVtqXS5idWYgPSAwOworICAgICAgICAvKgorICAgICAgICAgKiByZXNldCBBRERCQSBleGNoYW5nZSBzdGF0dXMgY29kZQorICAgICAgICAgKiAwOiBOVUxMCisgICAgICAgICAqIDE6IEFEREJBIFJlcXVlc3Qgc2VudC9yZWNlaXZlZAorICAgICAgICAgKiAyOiBBQ0sgZm9yIEFEREJBIFJlcXVlc3Qgc2VudC9yZWNlaXZlZAorICAgICAgICAgKiAzOiBBRERCQSBSZXNwb25zZSBzZW50L3JlY2VpdmVkCisgICAgICAgICAqIDQ6IEFDSyBmb3IgQUREQkEgUmVzcG9uc2Ugc2VudC9yZWNlaXZlZAorICAgICAgICAgKi8KKyAgICAgICAgd2QtPnRpZF9yeFtpXS0+YWRkQmFFeGNoYW5nZVN0YXR1c0NvZGUgPSAwOworCisgICAgfQorICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgemZBZ2dUYWxseVJlc2V0KGRldik7CisgICAgREVTVFEuaW5pdCA9IHpmQWdnRGVzdEluaXQ7CisgICAgREVTVFEuaW5pdChkZXYpOworICAgIHdkLT5hZ2dJbml0aWF0ZWQgPSAxOworICAgIGFnZ3JfY291bnQgPSAwOworICAgIHN1Y2Nlc3NfbXBkdSA9IDA7CisgICAgdG90YWxfbXBkdSA9IDA7CisjaWZkZWYgWk1fRU5BQkxFX0FHR1JFR0FUSU9OCisjaWZuZGVmIFpNX0VOQUJMRV9GV19CQV9SRVRSQU5TTUlTU0lPTiAvL2Rpc2FibGUgQkFXCisgICAgQkFXID0gemZ3TWVtQWxsb2NhdGUoZGV2LCBzaXplb2Yoc3RydWN0IGJhd19lbmFibGVyKSk7CisgICAgaWYoIUJBVykKKyAgICB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQkFXLT5pbml0ID0gemZCYXdJbml0OworICAgIEJBVy0+aW5pdChkZXYpOworI2VuZGlmIC8vZGlzYWJsZSBCQVcKKyNlbmRpZgorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZBZ2dHZXRTdGEgICAgICAgICAgICAgICAgICovCisvKiAgICAgIHJldHVybiBTVEEgQUlELiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICB0YWtlIGJ1ZiBhcyBpbnB1dCwgdXNlIHRoZSBkZXN0IGFkZHJlc3Mgb2YgYnVmIGFzIGluZGV4IHRvICAgICAgKi8KKy8qICAgICAgc2VhcmNoIFNUQSBBSUQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGJ1ZiA6IGJ1ZmZlciBmb3Igb25lIHBhcnRpY3VsYXIgcGFja2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIEFJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIEhvbmRhICAgICAgICAgICAgICAgWnlEQVMgVGVjaG5vbG9neSBDb3Jwb3JhdGlvbiAgICAyMDA2LjExICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworCit1MTZfdCB6ZkFnZ0dldFN0YSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpCit7CisgICAgdTE2X3QgaWQ7CisgICAgdTE2X3QgZHN0WzNdOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIGRzdFswXSA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIDApOworICAgIGRzdFsxXSA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIDIpOworICAgIGRzdFsyXSA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIDQpOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIGlmKHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0FQKSB7CisgICAgICAgIGlkID0gemZBcEZpbmRTdGEoZGV2LCBkc3QpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgaWQgPSAwOworICAgIH0KKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisjaWYgWk1fQUdHX0ZQR0FfREVCVUcKKyAgICBpZCA9IDA7CisjZW5kaWYKKworICAgIHJldHVybiBpZDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZBZ2dUeEdldFF1ZXVlICAgICAgICAgICAgICovCisvKiAgICAgIHJldHVybiBRdWV1ZSBQb29sIGluZGV4LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICB0YWtlIGFpZCBhcyBpbnB1dCwgbG9vayBmb3IgdGhlIHF1ZXVlIGluZGV4IGFzc29jaWF0ZWQgICAgICAgICAgKi8KKy8qICAgICAgd2l0aCB0aGlzIGFpZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGFpZCA6IGFzc29jaWF0ZWQgaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFF1ZXVlIG51bWJlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIEhvbmRhICAgICAgICAgICAgICAgWnlEQVMgVGVjaG5vbG9neSBDb3Jwb3JhdGlvbiAgICAyMDA2LjExICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitUSURfVFggemZBZ2dUeEdldFF1ZXVlKHpkZXZfdCogZGV2LCB1MTZfdCBhaWQsIHUxNl90IHRpZCkKK3sKKyAgICAvL3UxNl90ICAgaTsKKyAgICBUSURfVFggIHRpZF90eDsKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICAvL3ptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICAvKgorICAgICAqIG5vdCBhIFNUQSBhaWQKKyAgICAgKi8KKyAgICBpZiAoMHhmZmZmID09IGFpZCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICAvL3ptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICB0aWRfdHggPSB3ZC0+YWdnU3RhW2FpZF0udGlkX3R4W3RpZF07CisgICAgaWYgKCF0aWRfdHgpIHJldHVybiBOVUxMOworICAgIGlmICgwID09IHRpZF90eC0+YWdnUUVuYWJsZWQpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgLy96bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgcmV0dXJuIHRpZF90eDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmQWdnVHhOZXdRdWV1ZSAgICAgICAgICAgICAqLworLyogICAgICByZXR1cm4gUXVldWUgUG9vbCBpbmRleC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgdGFrZSBhaWQgYXMgaW5wdXQsIGZpbmQgYSBuZXcgcXVldWUgZm9yIHRoaXMgYWlkLiAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGFpZCA6IGFzc29jaWF0ZWQgaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFF1ZXVlIG51bWJlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIEhvbmRhICAgICAgICAgICAgICAgWnlEQVMgVGVjaG5vbG9neSBDb3Jwb3JhdGlvbiAgICAyMDA2LjEyICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitUSURfVFggemZBZ2dUeE5ld1F1ZXVlKHpkZXZfdCogZGV2LCB1MTZfdCBhaWQsIHUxNl90IHRpZCwgemJ1Zl90KiBidWYpCit7CisgICAgdTE2X3QgICBpOworICAgIFRJRF9UWCAgdGlkX3R4PU5VTEw7CisgICAgdTE2X3QgICBhYyA9IHpjVXBUb0FjW3RpZCYweDddICYgMHgzOworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICAvKgorICAgICAqIG5vdCBhIFNUQSBhaWQKKyAgICAgKi8KKyAgICBpZiAoMHhmZmZmID09IGFpZCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgLyoKKyAgICAgKiBmaW5kIG9uZSBuZXcgcXVldWUgZm9yIHN0YQorICAgICAqLworICAgIGZvciAoaT0wOyBpPFpNX0FHR19QT09MX1NJWkU7IGkrKykKKyAgICB7CisgICAgICAgIGlmICh3ZC0+YWdnUVBvb2xbaV0tPmFnZ1FFbmFibGVkKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiB0aGlzIHEgaXMgZW5hYmxlZAorICAgICAgICAgICAgICAgICAqLworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgdGlkX3R4ID0gd2QtPmFnZ1FQb29sW2ldOworICAgICAgICAgICAgdGlkX3R4LT5hZ2dRRW5hYmxlZCA9IDE7CisgICAgICAgICAgICB0aWRfdHgtPmFnZ1FTVEEgPSBhaWQ7CisgICAgICAgICAgICB0aWRfdHgtPmFjID0gYWM7CisgICAgICAgICAgICB0aWRfdHgtPnRpZCA9IHRpZDsKKyAgICAgICAgICAgIHRpZF90eC0+YWdnSGVhZCA9IHRpZF90eC0+YWdnVGFpbCA9IHRpZF90eC0+c2l6ZSA9IDA7CisgICAgICAgICAgICB0aWRfdHgtPmFnZ1JlYWR5ID0gMDsKKyAgICAgICAgICAgIHdkLT5hZ2dTdGFbYWlkXS50aWRfdHhbdGlkXSA9IHRpZF90eDsKKyAgICAgICAgICAgIHRpZF90eC0+ZHN0WzBdID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMCk7CisgICAgICAgICAgICB0aWRfdHgtPmRzdFsxXSA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIDIpOworICAgICAgICAgICAgdGlkX3R4LT5kc3RbMl0gPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCA0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIHJldHVybiB0aWRfdHg7Cit9CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZBZ2dUeEVucXVldWUgICAgICAgICAgICAgICovCisvKiAgICAgIHJldHVybiBTdGF0dXMgY29kZSBaTV9TVUNDRVNTIG9yIGVycm9yIGNvZGUgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICB0YWtlIChhaWQsYWMscW51bSxidWYpIGFzIGlucHV0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYWlkIDogYXNzb2NpYXRlZCBpZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGFjICA6IGFjY2VzcyBjYXRlZ29yeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBxbnVtOiB0aGUgcXVldWUgbnVtYmVyIHRvIHdoaWNoIHdpbGwgYmUgZW5xdWV1ZWQgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYnVmIDogdGhlIHBhY2tldCB0byBiZSBxdWV1ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgc3RhdHVzIGNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgSG9uZGEgICAgICAgICAgICAgICBBdGhlcm9zIENvbW11bmljYXRpb25zLCBJTkMuICAgIDIwMDYuMTIgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UxNl90IHpmQWdnVHhFbnF1ZXVlKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3QgYWlkLCBUSURfVFggdGlkX3R4KQoreworICAgIC8vdTE2X3QgICBxbGVuLCBmcmFtZUxlbjsKKyAgICB1MzJfdCAgIHRpbWU7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIHRpZF90eC0+c2l6ZSA9IHptX2FnZ19xbGVuKGRldiwgdGlkX3R4LT5hZ2dIZWFkLCB0aWRfdHgtPmFnZ1RhaWwpOworCisgICAgaWYgKHRpZF90eC0+c2l6ZSA8IChaTV9BR0dRX1NJWkUgLSAyKSkKKyAgICB7CisgICAgICAgIC8qIFF1ZXVlIG5vdCBmdWxsICovCisKKworICAgICAgICAvKgorICAgICAgICAgKiBidWZmZXIgY29weQorICAgICAgICAgKiBpbiB6ZndCdWZGcmVlIHdpbGwgcmV0dXJuIGEgbmRpc21zZW5kY29tcGxldGUKKyAgICAgICAgICogdG8gcmVzb2x2ZSB0aGUgc3luY2hyb25pemUgcHJvYmxlbSBpbiBhZ2dyZWdhdGUKKyAgICAgICAgICovCisKKyAgICAgICAgdThfdCAgICBzZW5kQ29tcGxldGUgPSAwOworCisgICAgICAgIHRpZF90eC0+YWdndnR4cVt0aWRfdHgtPmFnZ0hlYWRdLmJ1ZiA9IGJ1ZjsKKyAgICAgICAgdGltZSA9IHptX2FnZ19HZXRUaW1lKCk7CisgICAgICAgIHRpZF90eC0+YWdndnR4cVt0aWRfdHgtPmFnZ0hlYWRdLmFycml2YWxUaW1lID0gdGltZTsKKyAgICAgICAgdGlkX3R4LT5hZ2d2dHhxW3RpZF90eC0+YWdnSGVhZF0uYmF3X3JldHJhbnNtaXQgPSAwOworCisgICAgICAgIHRpZF90eC0+YWdnSGVhZCA9ICgodGlkX3R4LT5hZ2dIZWFkICsgMSkgJiBaTV9BR0dRX1NJWkVfTUFTSyk7CisgICAgICAgIHRpZF90eC0+bGFzdEFycml2YWwgPSB0aW1lOworICAgICAgICB0aWRfdHgtPnNpemUrKzsKKyAgICAgICAgdGlkX3R4LT5zaXplID0gem1fYWdnX3FsZW4oZGV2LCB0aWRfdHgtPmFnZ0hlYWQsIHRpZF90eC0+YWdnVGFpbCk7CisgICAgICAgIGlmIChidWYgJiYgKHRpZF90eC0+c2l6ZSA8IChaTV9BR0dRX1NJWkUgLSAxMCkpKSB7CisgICAgICAgICAgICB0aWRfdHgtPmNvbXBsZXRlID0gdGlkX3R4LT5hZ2dIZWFkOworICAgICAgICAgICAgc2VuZENvbXBsZXRlID0gMTsKKyAgICAgICAgfQorICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgICAgIGlmICghREVTVFEuZXhpc3QoZGV2LCAwLCB0aWRfdHgtPmFjLCB0aWRfdHgsIE5VTEwpKSB7CisgICAgICAgICAgICBERVNUUS5pbnNlcnQoZGV2LCAwLCB0aWRfdHgtPmFjLCB0aWRfdHgsIE5VTEwpOworICAgICAgICB9CisKKyAgICAgICAgem1fbXNnMV9hZ2coWk1fTFZfMCwgInRpZF90eC0+c2l6ZT0iLCB0aWRfdHgtPnNpemUpOworICAgICAgICAvL3ptX2RlYnVnX21zZzEoInRpZF90eC0+c2l6ZT0iLCB0aWRfdHgtPnNpemUpOworCisgICAgICAgIGlmIChidWYgJiYgc2VuZENvbXBsZXRlICYmIHdkLT56ZmNiU2VuZENvbXBsZXRlSW5kaWNhdGlvbikgeworICAgICAgICAgICAgLy96bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICAgICAgd2QtPnpmY2JTZW5kQ29tcGxldGVJbmRpY2F0aW9uKGRldiwgYnVmKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qaWYgKHRpZF90eC0+c2l6ZSA+PSAxNiAmJiB6ZkhwR2V0RnJlZVR4ZENvdW50KGRldikgPiAyMCkKKyAgICAgICAgICAgIHpmQWdnVHhTZW5kKGRldiwgemZIcEdldEZyZWVUeGRDb3VudChkZXYpLCB0aWRfdHgpOworICAgICAgICAqLworICAgICAgICByZXR1cm4gWk1fU1VDQ0VTUzsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgem1fbXNnMV9hZ2coWk1fTFZfMCwgImNhbid0IGVucXVldWUsIHRpZF90eC0+c2l6ZT0iLCB0aWRfdHgtPnNpemUpOworICAgICAgICAvKgorICAgICAgICAgKiBRdWV1ZSBGdWxsCisgICAgICAgICAqLworCisgICAgICAgIC8qCisgICAgICAgICAqIHptX21zZzFfYWdnKFpNX0xWXzAsICJRdWV1ZSBmdWxsLCBxbnVtID0gIiwgcW51bSk7CisgICAgICAgICAqIHdkLT5jb21tVGFsbHkudHhRb3NEcm9wQ291bnRbYWNdKys7CisgICAgICAgICAqIHpmd0J1ZkZyZWUoZGV2LCBidWYsIFpNX1NVQ0NFU1MpOworICAgICAgICAgKiB6bV9tc2cxX2FnZyhaTV9MVl8xLCAiUGFja2V0IGRpc2NhcmRlZCwgVlRYUSBmdWxsLCBhYz0iLCBhYyk7CisgICAgICAgICAqCisgICAgICAgICAqIHJldHVybiBaTV9FUlJfRVhDRUVEX1BSSU9SSVRZX1RIUkVTSE9MRDsKKyAgICAgICAgICovCisgICAgfQorCisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIGlmICghREVTVFEuZXhpc3QoZGV2LCAwLCB0aWRfdHgtPmFjLCB0aWRfdHgsIE5VTEwpKSB7CisgICAgICAgICAgICBERVNUUS5pbnNlcnQoZGV2LCAwLCB0aWRfdHgtPmFjLCB0aWRfdHgsIE5VTEwpOworICAgIH0KKworICAgIHJldHVybiBaTV9FUlJfRVhDRUVEX1BSSU9SSVRZX1RIUkVTSE9MRDsKK30KKwordTE2X3QgICAgemZBZ2dEZXN0RXhpc3QoemRldl90KiBkZXYsIHUxNl90IFF0eXBlLCB1MTZfdCBhYywgVElEX1RYIHRpZF90eCwgdm9pZCogdnR4cSkgeworICAgIHN0cnVjdCBkZXN0KiBkZXN0OworICAgIHUxNl90ICAgZXhpc3QgPSAwOworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIGlmICghREVTVFEuSGVhZFthY10pIHsKKyAgICAgICAgZXhpc3QgPSAwOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgZGVzdCA9IERFU1RRLkhlYWRbYWNdOworICAgICAgICBpZiAoZGVzdC0+dGlkX3R4ID09IHRpZF90eCkgeworICAgICAgICAgICAgZXhpc3QgPSAxOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgd2hpbGUgKGRlc3QtPm5leHQgIT0gREVTVFEuSGVhZFthY10pIHsKKyAgICAgICAgICAgICAgICBkZXN0ID0gZGVzdC0+bmV4dDsKKyAgICAgICAgICAgICAgICBpZiAoZGVzdC0+dGlkX3R4ID09IHRpZF90eCl7CisgICAgICAgICAgICAgICAgICAgIGV4aXN0ID0gMTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIHJldHVybiBleGlzdDsKK30KKwordm9pZCAgICB6ZkFnZ0Rlc3RJbnNlcnQoemRldl90KiBkZXYsIHUxNl90IFF0eXBlLCB1MTZfdCBhYywgVElEX1RYIHRpZF90eCwgdm9pZCogdnR4cSkKK3sKKyAgICBzdHJ1Y3QgZGVzdCogbmV3X2Rlc3Q7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIG5ld19kZXN0ID0gemZ3TWVtQWxsb2NhdGUoZGV2LCBzaXplb2Yoc3RydWN0IGRlc3QpKTsKKyAgICBpZighbmV3X2Rlc3QpCisgICAgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG5ld19kZXN0LT5RdHlwZSA9IFF0eXBlOworICAgIG5ld19kZXN0LT50aWRfdHggPSB0aWRfdHg7CisgICAgaWYgKDAgPT0gUXR5cGUpCisgICAgICAgIG5ld19kZXN0LT50aWRfdHggPSB0aWRfdHg7CisgICAgZWxzZQorICAgICAgICBuZXdfZGVzdC0+dnR4cSA9IHZ0eHE7CisgICAgaWYgKCFERVNUUS5IZWFkW2FjXSkgeworCisgICAgICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgIG5ld19kZXN0LT5uZXh0ID0gbmV3X2Rlc3Q7CisgICAgICAgIERFU1RRLkhlYWRbYWNdID0gREVTVFEuZGVzdFthY10gPSBuZXdfZGVzdDsKKyAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICB9CisgICAgZWxzZSB7CisKKyAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgbmV3X2Rlc3QtPm5leHQgPSBERVNUUS5kZXN0W2FjXS0+bmV4dDsKKyAgICAgICAgREVTVFEuZGVzdFthY10tPm5leHQgPSBuZXdfZGVzdDsKKyAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICB9CisKKworICAgIC8vREVTVFEuc2l6ZVthY10rKzsKKyAgICByZXR1cm47Cit9CisKK3ZvaWQgICAgemZBZ2dEZXN0RGVsZXRlKHpkZXZfdCogZGV2LCB1MTZfdCBRdHlwZSwgVElEX1RYIHRpZF90eCwgdm9pZCogdnR4cSkKK3sKKyAgICBzdHJ1Y3QgZGVzdCogZGVzdCwgKnRlbXA7CisgICAgdTE2X3QgICBpOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgaWYgKHdkLT5kZXN0TG9jaykgeworICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICByZXR1cm47CisgICAgfQorCisKKyAgICAvL3ptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisgICAgZm9yIChpPTA7IGk8NDsgaSsrKSB7CisgICAgICAgIGlmICghREVTVFEuSGVhZFtpXSkgY29udGludWU7CisgICAgICAgIGRlc3QgPSBERVNUUS5IZWFkW2ldOworICAgICAgICBpZiAoIWRlc3QpIGNvbnRpbnVlOworCisKKyAgICAgICAgd2hpbGUgKGRlc3QgJiYgKGRlc3QtPm5leHQgIT0gREVTVFEuSGVhZFtpXSkpIHsKKyAgICAgICAgICAgIGlmIChRdHlwZSA9PSAwICYmIGRlc3QtPm5leHQtPnRpZF90eCA9PSB0aWRfdHgpeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKFF0eXBlID09IDEgJiYgZGVzdC0+bmV4dC0+dnR4cSA9PSB2dHhxKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZXN0ID0gZGVzdC0+bmV4dDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgoUXR5cGUgPT0gMCAmJiBkZXN0LT5uZXh0LT50aWRfdHggPT0gdGlkX3R4KSB8fCAoUXR5cGUgPT0gMSAmJiBkZXN0LT5uZXh0LT52dHhxID09IHZ0eHEpKSB7CisKKyAgICAgICAgICAgIHRpZF90eC0+c2l6ZSA9IHptX2FnZ19xbGVuKGRldiwgdGlkX3R4LT5hZ2dIZWFkLCB0aWRfdHgtPmFnZ1RhaWwpOworICAgICAgICAgICAgaWYgKHRpZF90eC0+c2l6ZSkgeworICAgICAgICAgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFERVNUUS5IZWFkW2ldKSB7CisgICAgICAgICAgICAgICAgdGVtcCA9IE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICB0ZW1wID0gZGVzdC0+bmV4dDsKKyAgICAgICAgICAgICAgICBpZiAodGVtcCA9PSBkZXN0KSB7CisgICAgICAgICAgICAgICAgICAgIERFU1RRLkhlYWRbaV0gPSBERVNUUS5kZXN0W2ldID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgLy9ERVNUUS5zaXplW2ldID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGRlc3QtPm5leHQgPSBkZXN0LT5uZXh0LT5uZXh0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHRlbXAgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICB7LyogZG8gbm90aGluZyAqL30gLy96ZndNZW1GcmVlKGRldiwgdGVtcCwgc2l6ZW9mKHN0cnVjdCBkZXN0KSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgemZ3TWVtRnJlZShkZXYsIHRlbXAsIHNpemVvZihzdHJ1Y3QgZGVzdCkpOworCisgICAgICAgICAgICAvKnptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgICAgICBpZiAoREVTVFEuc2l6ZVtpXSA+IDApCisgICAgICAgICAgICAgICAgREVTVFEuc2l6ZVtpXS0tOworICAgICAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgICovCisgICAgICAgIH0KKworICAgIH0KKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIHJldHVybjsKK30KKwordm9pZCAgICB6ZkFnZ0Rlc3RJbml0KHpkZXZfdCogZGV2KQoreworICAgIHUxNl90IGk7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgLy96bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgZm9yIChpPTA7IGk8NDsgaSsrKSB7CisgICAgICAgIC8vd2QtPmRlc3RRLkhlYWRbaV0ubmV4dCA9IHdkLT5kZXN0US5IZWFkW2ldOworICAgICAgICAvL3dkLT5kZXN0US5kZXN0W2ldID0gd2QtPmRlc3RRLkhlYWRbaV07CisgICAgICAgIC8vREVTVFEuc2l6ZVtpXSA9IDA7CisgICAgICAgIERFU1RRLkhlYWRbaV0gPSBOVUxMOworICAgIH0KKyAgICBERVNUUS5pbnNlcnQgID0gemZBZ2dEZXN0SW5zZXJ0OworICAgIERFU1RRLmRlbGV0ZSAgPSB6ZkFnZ0Rlc3REZWxldGU7CisgICAgREVTVFEuaW5pdCAgICA9IHpmQWdnRGVzdEluaXQ7CisgICAgREVTVFEuZ2V0TmV4dCA9IHpmQWdnRGVzdEdldE5leHQ7CisgICAgREVTVFEuZXhpc3QgICA9IHpmQWdnRGVzdEV4aXN0OworICAgIERFU1RRLnBwcmkgPSAwOworICAgIHJldHVybjsKK30KKworc3RydWN0IGRlc3QqIHpmQWdnRGVzdEdldE5leHQoemRldl90KiBkZXYsIHUxNl90IGFjKQoreworICAgIHN0cnVjdCBkZXN0ICpkZXN0ID0gTlVMTDsKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICBpZiAoREVTVFEuZGVzdFthY10pIHsKKyAgICAgICAgZGVzdCA9IERFU1RRLmRlc3RbYWNdOworICAgICAgICBERVNUUS5kZXN0W2FjXSA9IERFU1RRLmRlc3RbYWNdLT5uZXh0OworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgZGVzdCA9IE5VTEw7CisgICAgfQorICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICByZXR1cm4gZGVzdDsKK30KKworI2lmZGVmIFpNX0VOQUJMRV9BR0dSRUdBVElPTgorI2lmbmRlZiBaTV9FTkFCTEVfRldfQkFfUkVUUkFOU01JU1NJT04gLy9kaXNhYmxlIEJBVwordTE2X3QgICB6ZkFnZ1RpZFR4SW5zZXJ0SGVhZCh6ZGV2X3QqIGRldiwgc3RydWN0IGJ1ZkluZm8gKmJ1Zl9pbmZvLFRJRF9UWCB0aWRfdHgpCit7CisgICAgemJ1Zl90KiBidWY7CisgICAgdTMyX3QgdGltZTsKKyAgICBzdHJ1Y3QgYmF3X2hlYWRlciAqYmF3X2hlYWRlcjsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKworICAgIGJ1ZiA9IGJ1Zl9pbmZvLT5idWY7CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIHRpZF90eC0+c2l6ZSA9IHptX2FnZ19xbGVuKGRldiwgdGlkX3R4LT5hZ2dIZWFkLCB0aWRfdHgtPmFnZ1RhaWwpOworICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICBpZiAodGlkX3R4LT5zaXplID49IChaTV9BR0dRX1NJWkUgLSAyKSkgeworICAgICAgICB6ZndCdWZGcmVlKGRldiwgYnVmLCBaTV9TVUNDRVNTKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICB0aWRfdHgtPmFnZ1RhaWwgPSAodGlkX3R4LT5hZ2dUYWlsID09IDApPyBaTV9BR0dRX1NJWkVfTUFTSzogdGlkX3R4LT5hZ2dUYWlsIC0gMTsKKyAgICB0aWRfdHgtPmFnZ3Z0eHFbdGlkX3R4LT5hZ2dUYWlsXS5idWYgPSBidWY7CisgICAgLy90aW1lID0gem1fYWdnX0dldFRpbWUoKTsKKyAgICB0aWRfdHgtPmFnZ3Z0eHFbdGlkX3R4LT5hZ2dUYWlsXS5hcnJpdmFsVGltZSA9IGJ1Zl9pbmZvLT50aW1lc3RhbXA7CisgICAgdGlkX3R4LT5hZ2d2dHhxW3RpZF90eC0+YWdnVGFpbF0uYmF3X3JldHJhbnNtaXQgPSBidWZfaW5mby0+YmF3X3JldHJhbnNtaXQ7CisKKyAgICBiYXdfaGVhZGVyID0gJnRpZF90eC0+YWdndnR4cVt0aWRfdHgtPmFnZ1RhaWxdLmJhd19oZWFkZXI7CisgICAgYmF3X2hlYWRlci0+aGVhZGVyTGVuICAgPSBidWZfaW5mby0+YmF3X2hlYWRlci0+aGVhZGVyTGVuOworICAgIGJhd19oZWFkZXItPm1pY0xlbiAgICAgID0gYnVmX2luZm8tPmJhd19oZWFkZXItPm1pY0xlbjsKKyAgICBiYXdfaGVhZGVyLT5zbmFwTGVuICAgICA9IGJ1Zl9pbmZvLT5iYXdfaGVhZGVyLT5zbmFwTGVuOworICAgIGJhd19oZWFkZXItPnJlbW92ZUxlbiAgID0gYnVmX2luZm8tPmJhd19oZWFkZXItPnJlbW92ZUxlbjsKKyAgICBiYXdfaGVhZGVyLT5rZXlJZHggICAgICA9IGJ1Zl9pbmZvLT5iYXdfaGVhZGVyLT5rZXlJZHg7CisgICAgemZ3TWVtb3J5Q29weSgodThfdCAqKWJhd19oZWFkZXItPmhlYWRlciwgKHU4X3QgKilidWZfaW5mby0+YmF3X2hlYWRlci0+aGVhZGVyLCA1OCk7CisgICAgemZ3TWVtb3J5Q29weSgodThfdCAqKWJhd19oZWFkZXItPm1pYyAgICwgKHU4X3QgKilidWZfaW5mby0+YmF3X2hlYWRlci0+bWljICAgLCA4KTsKKyAgICB6ZndNZW1vcnlDb3B5KCh1OF90ICopYmF3X2hlYWRlci0+c25hcCAgLCAodThfdCAqKWJ1Zl9pbmZvLT5iYXdfaGVhZGVyLT5zbmFwICAsIDgpOworCisgICAgdGlkX3R4LT5zaXplKys7CisgICAgdGlkX3R4LT5zaXplID0gem1fYWdnX3FsZW4oZGV2LCB0aWRfdHgtPmFnZ0hlYWQsIHRpZF90eC0+YWdnVGFpbCk7CisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIC8vdGlkX3R4LT5sYXN0QXJyaXZhbCA9IHRpbWU7CisgICAgaWYgKDEgPT0gdGlkX3R4LT5zaXplKSB7CisgICAgICAgIERFU1RRLmluc2VydChkZXYsIDAsIHRpZF90eC0+YWMsIHRpZF90eCwgTlVMTCk7CisgICAgfQorCisKKyAgICB6bV9tc2cxX2FnZyhaTV9MVl8wLCAiMHhDMjppbnNlcnRIZWFkLCB0aWRfdHgtPnNpemU9IiwgdGlkX3R4LT5zaXplKTsKKworICAgIHJldHVybiBUUlVFOworfQorI2VuZGlmIC8vZGlzYWJsZSBCQVcKKyNlbmRpZgorCit2b2lkICAgIHpmaVR4Q29tcGxldGUoemRldl90KiBkZXYpCit7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICAvL3ptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICBpZiggKHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0FQKSB8fAorICAgICAgICAod2QtPndsYW5Nb2RlID09IFpNX01PREVfSU5GUkFTVFJVQ1RVUkUgJiYgd2QtPnN0YS5FbmFibGVIVCkgfHwKKyAgICAgICAgKHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX1BTRVVETykgKSB7CisgICAgICAgIHpmQWdnVHhTY2hlZHVsZXIoZGV2LCAwKTsKKyAgICB9CisKKyAgICByZXR1cm47Cit9CisKK1RJRF9UWCAgemZBZ2dUeFJlYWR5KHpkZXZfdCogZGV2KSB7CisgICAgLy9zdHJ1Y3QgZGVzdCogZGVzdDsKKyAgICB1MTZfdCAgIGk7CisgICAgVElEX1RYICB0aWRfdHggPSBOVUxMOworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIGZvciAoaT0wOyBpPFpNX0FHR19QT09MX1NJWkU7IGkrKykKKyAgICB7CisgICAgICAgIGlmICh3ZC0+YWdnUVBvb2xbaV0tPmFnZ1FFbmFibGVkKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAod2QtPmFnZ1FQb29sW2ldLT5zaXplID49IDE2KSB7CisgICAgICAgICAgICAgICAgdGlkX3R4ID0gd2QtPmFnZ1FQb29sW2ldOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICB9CisgICAgfQorICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgcmV0dXJuIHRpZF90eDsKK30KKwordTE2X3QgICB6ZkFnZ1ZhbGlkVGlkVHgoemRldl90KiBkZXYsIFRJRF9UWCB0aWRfdHgpIHsKKyAgICB1MTZfdCAgIGksIHZhbGlkID0gMDsKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICBmb3IgKGk9MDsgaTxaTV9BR0dfUE9PTF9TSVpFOyBpKyspCisgICAgeworICAgICAgICBpZiAod2QtPmFnZ1FQb29sW2ldID09IHRpZF90eCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsaWQgPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgIH0KKyAgICB9CisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIHJldHVybiB2YWxpZDsKK30KKwordm9pZCAgICB6ZkFnZ1R4U2NoZWR1bGVyKHpkZXZfdCogZGV2LCB1OF90IFNjYW5BbmRDbGVhcikKK3sKKyAgICBUSURfVFggIHRpZF90eCA9IE5VTEw7CisgICAgdm9pZCogICB2dHhxOworICAgIHN0cnVjdCBkZXN0KiBkZXN0OworICAgIHpidWZfdCogIGJ1ZjsKKyAgICB1MzJfdCB0eHFsLCBtaW5fdHhxbDsKKyAgICAvL3UxNl90IGFnZ3Jfc2l6ZSA9IDE7CisgICAgdTE2X3QgdHhxX3RocmVzaG9sZDsKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgaWYgKCF3ZC0+YWdnSW5pdGlhdGVkKQorICAgIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8qIGRlYnVnICovCisgICAgdHhxbCA9IFRYUUw7CisgICAgbWluX3R4cWwgPSBBR0dfTUlOX1RYUUw7CisKKyAgICBpZih3ZC0+dHhxX3RocmVzaG9sZCkKKyAgICAgICAgdHhxX3RocmVzaG9sZCA9IHdkLT50eHFfdGhyZXNob2xkOworICAgIGVsc2UKKyAgICAgICAgdHhxX3RocmVzaG9sZCA9IEFHR19NSU5fVFhRTDsKKworICAgIHRpZF90eCA9IHpmQWdnVHhSZWFkeShkZXYpOworICAgIGlmICh0aWRfdHgpIFNjYW5BbmRDbGVhciA9IDA7CisgICAgd2hpbGUgKHpmSHBHZXRGcmVlVHhkQ291bnQoZGV2KSA+IDIwICYmIChUWFFMIDwgdHhxX3RocmVzaG9sZCB8fCB0aWRfdHgpKSB7CisgICAgLy93aGlsZSAoemZIcEdldEZyZWVUeGRDb3VudChkZXYpID4gMjAgJiYgKFNjYW5BbmRDbGVhciB8fCB0aWRfdHgpKSB7CisgICAgLy93aGlsZSAoVFhRTCA8IHR4cV90aHJlc2hvbGQpIHsKKyAgICAgICAgdTE2X3QgaTsKKyAgICAgICAgdThfdCBhYzsKKyAgICAgICAgczhfdCBkZXN0UV9jb3VudCA9IDA7CisgICAgLy93aGlsZSAoKHpmSHBHZXRGcmVlVHhkQ291bnQoZGV2KSkgPiAzMikgeworCisgICAgICAgIC8vRGJnUHJpbnQoInpmQWdnVHhTY2hlZHVsZXI6IGluIHdoaWxlIGxvb3AiKTsKKyAgICAgICAgZm9yIChpPTA7IGk8NDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoREVTVFEuSGVhZFtpXSkgZGVzdFFfY291bnQrKzsKKyAgICAgICAgfQorICAgICAgICBpZiAoMCA+PSBkZXN0UV9jb3VudCkgYnJlYWs7CisKKyAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgYWMgPSBwcmlbREVTVFEucHByaV07IERFU1RRLnBwcmkgPSAoREVTVFEucHByaSArIDEpICUgMTA7CisgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICAgICAgZm9yIChpPTA7IGk8MTA7IGkrKyl7CisgICAgICAgICAgICBpZihERVNUUS5IZWFkW2FjXSkgYnJlYWs7CisKKyAgICAgICAgICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgICAgICBhYyA9IHByaVtERVNUUS5wcHJpXTsgREVTVFEucHByaSA9IChERVNUUS5wcHJpICsgMSkgJSAxMDsKKyAgICAgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGkgPT0gMTApIGJyZWFrOworICAgICAgICAvL0RiZ1ByaW50KCJ6ZkFnZ1R4U2NoZWR1bGVyOiBoYXZlIGRlc3QgUSIpOworICAgICAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICB3ZC0+ZGVzdExvY2sgPSAxOworICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgICAgIGRlc3QgPSBERVNUUS5nZXROZXh0KGRldiwgYWMpOworICAgICAgICBpZiAoIWRlc3QpIHsKKyAgICAgICAgICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgICAgICB3ZC0+ZGVzdExvY2sgPSAwOworICAgICAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgICAgICAgICAgRGJnUHJpbnQoImJ1ZyByZXBvcnQhIERFU1RRLmdldE5leHQgZ290IG5vdGhpbmchIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoZGVzdC0+UXR5cGUgPT0gMCkgeworICAgICAgICAgICAgdGlkX3R4ID0gZGVzdC0+dGlkX3R4OworCisgICAgICAgICAgICAvL0RiZ1ByaW50KCJ6ZkFnZ1R4U2NoZWR1bGVyOiBoYXZlIHRpZF90eCBRIik7CisKKyAgICAgICAgICAgIGlmKHRpZF90eCAmJiB6ZkFnZ1ZhbGlkVGlkVHgoZGV2LCB0aWRfdHgpKQorICAgICAgICAgICAgICAgIHRpZF90eC0+c2l6ZSA9IHptX2FnZ19xbGVuKGRldiwgdGlkX3R4LT5hZ2dIZWFkLCB0aWRfdHgtPmFnZ1RhaWwpOworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgICAgICB3ZC0+ZGVzdExvY2sgPSAwOworICAgICAgICAgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICAgICAgICAgICAgICB0aWRfdHggPSB6ZkFnZ1R4UmVhZHkoZGV2KTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgIHdkLT5kZXN0TG9jayA9IDA7CisgICAgICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICAgICAgLy96bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICAgICAgaWYgKHRpZF90eCAmJiAhdGlkX3R4LT5zaXplKSB7CisKKyAgICAgICAgICAgICAgICAvL3ptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgICAgICAgICAgLy9ERVNUUS5kZWxldGUoZGV2LCAwLCB0aWRfdHgsIE5VTEwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZih3ZC0+YWdnU3RhdGUgPT0gMCl7CisgICAgICAgICAgICAgICAgLy93ZC0+YWdnU3RhdGUgPSAxOworICAgICAgICAgICAgICAgIC8vem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgICAgICB6ZkFnZ1R4U2VuZChkZXYsIHpmSHBHZXRGcmVlVHhkQ291bnQoZGV2KSwgdGlkX3R4KTsKKyAgICAgICAgICAgICAgICAvL3dkLT5hZ2dTdGF0ZSA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAvL3ptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICB2dHhxID0gZGVzdC0+dnR4cTsKKyAgICAgICAgICAgIGJ1ZiA9IHpmR2V0VnR4cShkZXYsIGFjKTsKKyAgICAgICAgICAgIHptX2Fzc2VydCggYnVmICE9IDAgKTsKKworICAgICAgICAgICAgemZUeFNlbmRFdGgoZGV2LCBidWYsIDAsIFpNX0VYVEVSTkFMX0FMTE9DX0JVRiwgMCk7CisKKyAgICAgICAgfQorICAgICAgICAvKmZsdXNoIGFsbCBidXQgPCAxNiBmcmFtZXMgaW4gdGlkX3R4IHRvIFRYUSovCisgICAgICAgIHRpZF90eCA9IHpmQWdnVHhSZWFkeShkZXYpOworICAgIH0KKworICAgIC8qd2hpbGUgKCh6ZkhwR2V0RnJlZVR4ZENvdW50KGRldikpID4gMzIpIHsKKyAgICAvL3doaWxlICgoemZIcEdldEZyZWVUeGRDb3VudChkZXYpKSA+IDMyKSB7CisKKyAgICAgICAgZGVzdFFfY291bnQgPSAwOworICAgICAgICBmb3IgKGk9MDsgaTw0OyBpKyspIGRlc3RRX2NvdW50ICs9IHdkLT5kZXN0US5zaXplW2ldOworICAgICAgICBpZiAoMCA+PSBkZXN0UV9jb3VudCkgYnJlYWs7CisKKyAgICAgICAgYWMgPSBwcmlbd2QtPmRlc3RRLnBwcmldOyB3ZC0+ZGVzdFEucHByaSA9ICh3ZC0+ZGVzdFEucHByaSArIDEpICUgMTA7CisgICAgICAgIGZvciAoaT0wOyBpPDEwOyBpKyspeworICAgICAgICAgICAgaWYod2QtPmRlc3RRLnNpemVbYWNdIT0wKSBicmVhazsKKyAgICAgICAgICAgIGFjID0gcHJpW3dkLT5kZXN0US5wcHJpXTsgd2QtPmRlc3RRLnBwcmkgPSAod2QtPmRlc3RRLnBwcmkgKyAxKSAlIDEwOworICAgICAgICB9CisgICAgICAgIGlmIChpID09IDEwKSBicmVhazsKKyAgICAgICAgZGVzdCA9IHdkLT5kZXN0US5nZXROZXh0KGRldiwgYWMpOworICAgICAgICBpZiAoZGVzdC0+UXR5cGUgPT0gMCkgeworICAgICAgICAgICAgdGlkX3R4ID0gZGVzdC0+dGlkX3R4OworICAgICAgICAgICAgdGlkX3R4LT5zaXplID0gem1fYWdnX3FsZW4oZGV2LCB0aWRfdHgtPmFnZ0hlYWQsIHRpZF90eC0+YWdnVGFpbCk7CisgICAgICAgICAgICBpZiAoIXRpZF90eC0+c2l6ZSkgeworICAgICAgICAgICAgICAgIHdkLT5kZXN0US5kZWxldGUoZGV2LCAwLCB0aWRfdHgsIE5VTEwpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZigod2QtPmFnZ1N0YXRlID09IDApICYmICh0aWRfdHgtPnNpemUgPj0gMTYpKXsKKyAgICAgICAgICAgICAgICB6ZkFnZ1R4U2VuZChkZXYsIHpmSHBHZXRGcmVlVHhkQ291bnQoZGV2KSwgdGlkX3R4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9CisgICAgKi8KKyAgICByZXR1cm47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZkFnZ1R4ICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgcmV0dXJuIFN0YXR1cyBjb2RlIFpNX1NVQ0NFU1Mgb3IgZXJyb3IgY29kZSAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIG1hbmFnZW1lbnQgQS1NUERVIGFnZ3JlZ2F0aW9uIGZ1bmN0aW9uLCAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBtYW5hZ2VtZW50IGFnZ3JlZ2F0aW9uIHF1ZXVlLCBjYWxjdWxhdGUgYXJyaXZhbHJhdGUsICAgICAgICAgICAgKi8KKy8qICAgICAgYWRkL2RlbGV0ZSBhbiBhZ2dyZWdhdGlvbiBxdWV1ZSBvZiBhIHN0cmVhbSwgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGVucXVldWUgcGFja2V0cyBpbnRvIHJlc3BvbnNpYmxlIGFnZ3JlZ2F0ZSBxdWV1ZS4gICAgICAgICAgICAgICAqLworLyogICAgICB0YWtlIChkZXYsIGJ1ZiwgYWMpIGFzIGlucHV0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYnVmIDogcGFja2V0IGJ1ZmYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGFjICA6IGFjY2VzcyBjYXRlZ29yeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIHN0YXR1cyBjb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIEhvbmRhICAgICAgICAgICAgICAgQXRoZXJvcyBDb21tdW5pY2F0aW9ucywgSU5DLiAgICAyMDA2LjEyICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MTZfdCB6ZkFnZ1R4KHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3QgdGlkKQoreworICAgIHUxNl90IGFpZDsKKyAgICAvL3UxNl90IHFudW07CisgICAgLy91MTZfdCBhZ2dmbGFnID0gMDsKKyAgICAvL3UxNl90IGFycml2YWxyYXRlID0gMDsKKyAgICBUSURfVFggdGlkX3R4OworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIGlmKCF3ZC0+YWdnSW5pdGlhdGVkKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFpNX0VSUl9UWF9CVUZGRVJfVU5BVkFJTEFCTEU7CisgICAgfQorCisgICAgYWlkID0gemZBZ2dHZXRTdGEoZGV2LCBidWYpOworCisgICAgLy9hcnJpdmFscmF0ZSA9IHpmQWdnVHhBcnJpdmFsUmF0ZShkZXYsIGFpZCwgdGlkKTsKKworICAgIGlmICgweGZmZmYgPT0gYWlkKQorICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogU1RBIG5vdCBhc3NvY2lhdGVkLCB0aGlzIGlzIGEgQkMvTUMgb3IgU1RBLT5BUCBwYWNrZXQKKyAgICAgICAgICovCisKKyAgICAgICAgcmV0dXJuIFpNX0VSUl9UWF9CVUZGRVJfVU5BVkFJTEFCTEU7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBTVEEgYXNzb2NpYXRlZCwgYSB1bmljYXN0IHBhY2tldAorICAgICAqLworCisgICAgdGlkX3R4ID0gemZBZ2dUeEdldFF1ZXVlKGRldiwgYWlkLCB0aWQpOworCisgICAgLyp0aWRfcS50aWRfdHggPSB0aWRfdHg7CisgICAgd2QtPmRlc3RRLmluc2VydCA9IHpmQWdnRGVzdEluc2VydDsKKyAgICB3ZC0+ZGVzdFEuaW5zZXJ0KGRldiwgMCwgdGlkX3EpOworICAgICovCisgICAgaWYgKHRpZF90eCAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogdGhpcyAoYWlkLCBhYykgaXMgYWdncmVnYXRlZAorICAgICAgICAgKi8KKworICAgICAgICAvL2lmIChhcnJpdmFscmF0ZSA8IFpNX0FHR19MT1dfVEhSRVNIT0xEKQorICAgICAgICBpZiAoMCkKKyAgICAgICAgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIGFycml2YWwgcmF0ZSB0b28gbG93CisgICAgICAgICAgICAgKiBkZWxldGUgdGhpcyBhZ2dyZWdhdGUgcXVldWUKKyAgICAgICAgICAgICAqLworCisgICAgICAgICAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgICAgICAgICAvL3dkLT5hZ2dRUG9vbFtxbnVtXS0+Y2xlYXJGbGFnID0gd2QtPmFnZ1FQb29sW3FudW1dLT5kZWxldGVGbGFnID0xOworCisgICAgICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gemZBZ2dUeEVucXVldWUoZGV2LCBidWYsIGFpZCwgdGlkX3R4KTsKKworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKgorICAgICAgICAgKiB0aGlzIChhaWQsIGFjKSBub3QgeWV0IGFnZ3JlZ2F0ZWQKKyAgICAgICAgICogcXVldWUgbm90IGZvdW5kCisgICAgICAgICAqLworCisgICAgICAgIC8vaWYgKGFycml2YWxyYXRlID4gWk1fQUdHX0hJR0hfVEhSRVNIT0xEKQorICAgICAgICBpZiAoMSkKKyAgICAgICAgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIGFycml2YWxyYXRlIGhpZ2ggZW5vdWdoIHRvIGdldCBhIG5ldyBhZ2cgcXVldWUKKyAgICAgICAgICAgICAqLworCisgICAgICAgICAgICB0aWRfdHggPSB6ZkFnZ1R4TmV3UXVldWUoZGV2LCBhaWQsIHRpZCwgYnVmKTsKKworICAgICAgICAgICAgLy96bV9tc2cxX2FnZyhaTV9MVl8wLCAiZ2V0IG5ldyBBZ2dRdWV1ZSBxbnVtID0gIiwgdGlkX3R4LT4pOworCisgICAgICAgICAgICBpZiAodGlkX3R4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogZ290IGEgbmV3IGFnZ3JlZ2F0ZSBxdWV1ZQorICAgICAgICAgICAgICAgICAqLworCisgICAgICAgICAgICAgICAgLy96bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgICAgICAgICAgICAgLy93ZC0+YWdnU3RhW2FpZF0uYWdnRmxhZ1thY10gPSAxOworCisgICAgICAgICAgICAgICAgLy96bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBhZGQgQUREQkEgZnVuY3Rpb25zIGhlcmUKKyAgICAgICAgICAgICAgICAgKiByZXR1cm4gWk1fRVJSX1RYX0JVRkZFUl9VTkFWQUlMQUJMRTsKKyAgICAgICAgICAgICAgICAgKi8KKworCisgICAgICAgICAgICAgICAgLy96ZkFnZ1NlbmRBZGRiYVJlcXVlc3QoZGV2LCB0aWRfdHgtPmRzdCwgdGlkX3R4LT5hYywgdGlkX3R4LT50aWQpOworICAgICAgICAgICAgICAgIC8vem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgICAgICAgICAgICAgIC8vd2QtPmFnZ1N0YVthaWRdLmFnZ0ZsYWdbYWNdID0gMDsKKworICAgICAgICAgICAgICAgIC8vem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgICAgICAgICAgICAgIHJldHVybiB6ZkFnZ1R4RW5xdWV1ZShkZXYsIGJ1ZiwgYWlkLCB0aWRfdHgpOworCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBqdXN0IGNhbid0IGdldCBhIG5ldyBhZ2dyZWdhdGUgcXVldWUKKyAgICAgICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgICAgIHJldHVybiBaTV9FUlJfVFhfQlVGRkVSX1VOQVZBSUxBQkxFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIGFycml2YWwgcmF0ZSBpcyBub3QgaGlnaCBlbm91Z2ggdG8gZ2V0IGEgbmV3IGFnZyBxdWV1ZQorICAgICAgICAgICAgICovCisKKyAgICAgICAgICAgIHJldHVybiBaTV9FUlJfVFhfQlVGRkVSX1VOQVZBSUxBQkxFOworICAgICAgICB9CisgICAgfQorCisKKworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZkFnZ1R4UmVhZHlDb3VudCAgICAgICAgICAgKi8KKy8qICAgICAgcmV0dXJuIGNvdW50ZXIgb2YgcmVhZHkgdG8gYWdncmVnYXRlIHF1ZXVlcy4gICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIHRha2UgKGRldiwgYWMpIGFzIGlucHV0LCBvbmx5IGNhbGN1bGF0ZSB0aGUgcmVhZHkgdG8gYWdncmVnYXRlICAqLworLyogICAgICBxdWV1ZXMgb2Ygb25lIHBhcnRpY3VsYXIgYWMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYWMgIDogYWNjZXNzIGNhdGVnb3J5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgY291bnRlciBvZiByZWFkeSB0byBhZ2dyZWdhdGUgcXVldWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgSG9uZGEgICAgICAgICAgICAgICBBdGhlcm9zIENvbW11bmljYXRpb25zLCBJTkMuICAgIDIwMDYuMTIgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UxNl90IHpmQWdnVHhSZWFkeUNvdW50KHpkZXZfdCogZGV2LCB1MTZfdCBhYykKK3sKKyAgICB1MTZfdCBpOworICAgIHUxNl90IHJlYWR5Y291bnQgPSAwOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICBmb3IgKGk9MCA7IGk8Wk1fQUdHX1BPT0xfU0laRTsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKHdkLT5hZ2dRUG9vbFtpXS0+YWdnUUVuYWJsZWQgJiYgKHdkLT5hZ2dRUG9vbFtpXS0+YWdnUmVhZHkgfHwgXAorICAgICAgICAgICAgICAgIHdkLT5hZ2dRUG9vbFtpXS0+Y2xlYXJGbGFnKSAmJiBhYyA9PSB3ZC0+YWdnUVBvb2xbaV0tPmFjKQorICAgICAgICAgICAgcmVhZHljb3VudCsrOworICAgIH0KKworICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICByZXR1cm4gcmVhZHljb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmQWdnVHhQYXJ0aWFsICAgICAgICAgICAgICAqLworLyogICAgICByZXR1cm4gdGhlIG51bWJlciB0aGF0IFZ0eHEgaGFzIHRvIHNlbmQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgdGFrZSAoZGV2LCBhYywgcmVhZHljb3VudCkgYXMgaW5wdXQsIGNhbGN1bGF0ZSB0aGUgcmF0aW8gb2YgICAgICovCisvKiAgICAgIFZ0eHEgbGVuZ3RoIHRvIChWdHhxIGxlbmd0aCArIHJlYWR5Y291bnQpIG9mIGEgcGFydGljdWxhciBhYywgICAqLworLyogICAgICBhbmQgcmV0dXJucyB0aGUgVnR4cSBsZW5ndGggKiB0aGUgcmF0aW8gICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYWMgIDogYWNjZXNzIGNhdGVnb3J5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIHJlYWR5Y291bnQ6IHRoZSBudW1iZXIgb2YgcmVhZHkgdG8gYWdncmVnYXRlIHF1ZXVlcyBvZiB0aGlzIGFjICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFZ0eHEgbGVuZ3RoICogcmF0aW8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIEhvbmRhICAgICAgICAgICAgICAgQXRoZXJvcyBDb21tdW5pY2F0aW9ucywgSU5DLiAgICAyMDA2LjEyICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MTZfdCB6ZkFnZ1R4UGFydGlhbCh6ZGV2X3QqIGRldiwgdTE2X3QgYWMsIHUxNl90IHJlYWR5Y291bnQpCit7CisgICAgdTE2X3QgcWxlbjsKKyAgICB1MTZfdCBwYXJ0aWFsOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICBxbGVuID0gem1fYWdnX3FsZW4oZGV2LCB3ZC0+dnR4cUhlYWRbYWNdLCB3ZC0+dnR4cVRhaWxbYWNdKTsKKworICAgIGlmICgocWxlbiArIHJlYWR5Y291bnQpID4gMCkKKyAgICB7CisgICAgICAgIHBhcnRpYWwgPSAodTE2X3QpKCB6bV9hZ2dfd2VpZ2h0KGFjKSAqICgodTE2X3QpcWxlbi8ocWxlbiArIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlYWR5Y291bnQpKSApOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBwYXJ0aWFsID0gMDsKKyAgICB9CisKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgaWYgKHBhcnRpYWwgPiBxbGVuKQorICAgICAgICBwYXJ0aWFsID0gcWxlbjsKKworICAgIHJldHVybiBwYXJ0aWFsOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZkFnZ1R4U2VuZCAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgcmV0dXJuIHNlbnRjb3VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIHRha2UgKGRldiwgYWMsIG4pIGFzIGlucHV0LCBuIGlzIHRoZSBudW1iZXIgb2Ygc2NoZWR1bGVkIGFnZyAgICAqLworLyogICAgICBxdWV1ZXMgdG8gYmUgc2VudCBvZiB0aGUgcGFydGljdWxhciBhYy4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYWMgIDogYWNjZXNzIGNhdGVnb3J5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIG4gICA6IHRoZSBudW1iZXIgb2Ygc2NoZWR1bGVkIGFnZ3JlZ2F0aW9uIHF1ZXVlcyB0byBiZSBzZW50ICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIHNlbnRjb3VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIEhvbmRhICAgICAgICAgICAgICAgQXRoZXJvcyBDb21tdW5pY2F0aW9ucywgSU5DLiAgICAyMDA2LjEyICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MTZfdCB6ZkFnZ1R4U2VuZCh6ZGV2X3QqIGRldiwgdTMyX3QgZnJlZVR4ZCwgVElEX1RYIHRpZF90eCkKK3sKKyAgICAvL3UxNl90ICAgcW51bTsKKyAgICAvL3UxNl90ICAgcWxlbjsKKyAgICB1MTZfdCAgIGo7CisgICAgLy91MTZfdCAgIHNlbnRjb3VudCA9IDA7CisgICAgemJ1Zl90KiBidWY7CisgICAgc3RydWN0ICBhZ2dDb250cm9sIGFnZ0NvbnRyb2w7CisgICAgdTE2X3QgICBhZ2dMZW47CisgICAgLy96YnVmX3QqICBuZXdCdWY7CisgICAgLy91MTZfdCAgIGJ1ZkxlbjsKKyAgICAvL1RJRF9CQVcgdGlkX2JhdyA9IE5VTEw7CisgICAgLy9zdHJ1Y3QgYnVmSW5mbyAqYnVmX2luZm87CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgLy93aGlsZSAodGlkX3R4LT5zaXplID4gMCkKKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgdGlkX3R4LT5zaXplID0gem1fYWdnX3FsZW4oZGV2LCB0aWRfdHgtPmFnZ0hlYWQsIHRpZF90eC0+YWdnVGFpbCk7CisgICAgYWdnTGVuID0gem1fYWdnX21pbigxNiwgem1fYWdnX21pbih0aWRfdHgtPnNpemUsICh1MTZfdCkoZnJlZVR4ZCAtIDIpKSk7CisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIHdoeSB0aGVyZSBoYXZlIHRvIGJlIDIgZnJlZSBUeGQ/CisgICAgICAgICAgICAgKi8KKyAgICBpZiAoYWdnTGVuIDw9MCApCisgICAgICAgIHJldHVybiAwOworCisKKyAgICBpZiAoYWdnTGVuID09IDEpIHsKKyAgICAgICAgYnVmID0gemZBZ2dUeEdldFZ0eHEoZGV2LCB0aWRfdHgpOworICAgICAgICBpZiAoYnVmKQorICAgICAgICAgICAgemZUeFNlbmRFdGgoZGV2LCBidWYsIDAsIFpNX0VYVEVSTkFMX0FMTE9DX0JVRiwgMCk7CisgICAgICAgIGlmICh0aWRfdHgtPnNpemUgPT0gMCkgeworICAgICAgICAgICAgLy9ERVNUUS5kZWxldGUoZGV2LCAwLCB0aWRfdHgsIE5VTEwpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogRnJlZSBUeGQgcXVldWUgaXMgYmlnIGVub3VnaCB0byBwdXQgYWdncmVnYXRpb24KKyAgICAgICAgICAgICAgICAgKi8KKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIGlmICh3ZC0+YWdnU3RhdGUgPT0gMSkgeworICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgd2QtPmFnZ1N0YXRlID0gMTsKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisKKyAgICB6bV9tc2cxX2FnZyhaTV9MVl8wLCAiYWdnTGVuPSIsIGFnZ0xlbik7CisgICAgdGlkX3R4LT5hZ2dGcmFtZVNpemUgPSAwOworICAgIGZvciAoaj0wOyBqIDwgYWdnTGVuOyBqKyspIHsKKyAgICAgICAgYnVmID0gemZBZ2dUeEdldFZ0eHEoZGV2LCB0aWRfdHgpOworCisgICAgICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgIHRpZF90eC0+c2l6ZSA9IHptX2FnZ19xbGVuKGRldiwgdGlkX3R4LT5hZ2dIZWFkLCB0aWRfdHgtPmFnZ1RhaWwpOworICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgICAgIGlmICggYnVmICkgeworICAgICAgICAgICAgLy9zdHJ1Y3QgYWdnVGFsbHkgKmFnZ190YWw7CisgICAgICAgICAgICB1MTZfdCBjb21wbGV0ZUluZGV4OworCisgICAgICAgICAgICBpZiAoMCA9PSBqKSB7CisgICAgICAgICAgICAgICAgYWdnQ29udHJvbC5hbXBkdUluZGljYXRpb24gPSBaTV9BR0dfRklSU1RfTVBEVTsKKworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoKGogPT0gKGFnZ0xlbiAtIDEpKSB8fCB0aWRfdHgtPnNpemUgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhZ2dDb250cm9sLmFtcGR1SW5kaWNhdGlvbiA9IFpNX0FHR19MQVNUX01QRFU7CisgICAgICAgICAgICAgICAgLy93ZC0+YWdnU3RhdGUgPSAwOworCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYWdnQ29udHJvbC5hbXBkdUluZGljYXRpb24gPSBaTV9BR0dfTUlERExFX01QRFU7CisgICAgICAgICAgICAgICAgLyogdGhlIHBhY2tldCBpcyBkZWxheWVkIG1vcmUgdGhhbiA1MDAgbXMsIGRyb3AgaXQgKi8KKworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGlkX3R4LT5hZ2dGcmFtZVNpemUgKz0gemZ3QnVmR2V0U2l6ZShkZXYsIGJ1Zik7CisgICAgICAgICAgICBhZ2dDb250cm9sLmFkZGJhSW5kaWNhdGlvbiA9IDA7CisgICAgICAgICAgICBhZ2dDb250cm9sLmFnZ0VuYWJsZWQgPSAxOworCisjaWZkZWYgWk1fQUdHX1RBTExZCisgICAgICAgICAgICBhZ2dfdGFsID0gJndkLT5hZ2dfdGFsOworICAgICAgICAgICAgYWdnX3RhbC0+c2VudF9wYWNrZXRzX3N1bSsrOworCisjZW5kaWYKKworICAgICAgICAgICAgemZBZ2dUeFNlbmRFdGgoZGV2LCBidWYsIDAsIFpNX0VYVEVSTkFMX0FMTE9DX0JVRiwgMCwgJmFnZ0NvbnRyb2wsIHRpZF90eCk7CisKKyAgICAgICAgICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgICAgICBjb21wbGV0ZUluZGV4ID0gdGlkX3R4LT5jb21wbGV0ZTsKKyAgICAgICAgICAgIGlmKHptX2FnZ19pblEodGlkX3R4LCB0aWRfdHgtPmNvbXBsZXRlKSkKKyAgICAgICAgICAgICAgICB6bV9hZ2dfcGx1cyh0aWRfdHgtPmNvbXBsZXRlKTsKKyAgICAgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICAgICAgICAgIGlmKHptX2FnZ19pblEodGlkX3R4LCBjb21wbGV0ZUluZGV4KSAmJiB3ZC0+emZjYlNlbmRDb21wbGV0ZUluZGljYXRpb24KKyAgICAgICAgICAgICAgICAgICAgJiYgdGlkX3R4LT5hZ2d2dHhxW2NvbXBsZXRlSW5kZXhdLmJ1ZikgeworICAgICAgICAgICAgICAgIHdkLT56ZmNiU2VuZENvbXBsZXRlSW5kaWNhdGlvbihkZXYsIHRpZF90eC0+YWdndnR4cVtjb21wbGV0ZUluZGV4XS5idWYpOworICAgICAgICAgICAgICAgIHptX2RlYnVnX21zZzAoImluIHF1ZXVlIGNvbXBsZXRlIHdvcmtlZCEiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIHRoaXMgYWdncmVnYXRpb24gcXVldWUgaXMgZW1wdHkKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgem1fbXNnMV9hZ2coWk1fTFZfMCwgImFnZ0xlbiBub3QgcmVhY2hlZCwgYnV0IG5vIG1vcmUgZnJhbWUsIGo9Iiwgaik7CisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgd2QtPmFnZ1N0YXRlID0gMDsKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgLy96bV9hY3F1aXJlX2FnZ19zcGluX2xvY2soQWRhcHRlcik7CisgICAgdGlkX3R4LT5zaXplID0gem1fYWdnX3FsZW4oZGV2LCB0aWRfdHgtPmFnZ0hlYWQsIHRpZF90eC0+YWdnVGFpbCk7CisgICAgLy96bV9yZWxlYXNlX2FnZ19zcGluX2xvY2soQWRhcHRlcik7CisKKyAgICBpZiAodGlkX3R4LT5zaXplID09IDApIHsKKyAgICAgICAgLy9ERVNUUS5kZWxldGUoZGV2LCAwLCB0aWRfdHgsIE5VTEwpOworICAgIH0KKworCisKKyAgICAvL3pmQWdnSW52b2tlQmFyKGRldiwgdGlkX3R4KTsKKyAgICBpZihqPjApIHsKKyAgICAgICAgYWdncl9jb3VudCsrOworICAgICAgICB6bV9tc2cxX2FnZyhaTV9MVl8wLCAiMHhDMjpzZW50IDEgYWdnciwgYWdncl9jb3VudD0iLCBhZ2dyX2NvdW50KTsKKyAgICAgICAgem1fbXNnMV9hZ2coWk1fTFZfMCwgIjB4QzI6c2VudCAxIGFnZ3IsIGFnZ3Jfc2l6ZT0iLCBqKTsKKyAgICB9CisgICAgcmV0dXJuIGo7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmQWdnVHhHZXRSZWFkeVF1ZXVlICAgICAgICAqLworLyogICAgICByZXR1cm4gdGhlIG51bWJlciBvZiB0aGUgYWdncmVnYXRpb24gcXVldWUgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgdGFrZSAoZGV2LCBhYykgYXMgaW5wdXQsIGZpbmQgdGhlIGFnZyBxdWV1ZSB3aXRoIHNtYWxsZXN0ICAgICAgICovCisvKiAgICAgIGFycml2YWwgdGltZSAod2FpdGVkIGxvbmdlc3QpIGFtb25nIHRob3NlIHJlYWR5IG9yIGNsZWFyRmxhZyAgICAqLworLyogICAgICBzZXQgcXVldWVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYWMgIDogYWNjZXNzIGNhdGVnb3J5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYWdncmVnYXRpb24gcXVldWUgbnVtYmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgSG9uZGEgICAgICAgICAgICAgICBBdGhlcm9zIENvbW11bmljYXRpb25zLCBJTkMuICAgIDIwMDYuMTIgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1RJRF9UWCB6ZkFnZ1R4R2V0UmVhZHlRdWV1ZSh6ZGV2X3QqIGRldiwgdTE2X3QgYWMpCit7CisgICAgLy91MTZfdCAgICAgICBxbnVtID0gWk1fQUdHX1BPT0xfU0laRTsKKyAgICB1MTZfdCAgICAgICBpOworICAgIHUzMl90ICAgICAgIHRpbWUgPSAwOworICAgIFRJRF9UWCAgICAgIHRpZF90eCA9IE5VTEw7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIGZvciAoaT0wIDtpPFpNX0FHR19QT09MX1NJWkU7IGkrKykKKyAgICB7CisgICAgICAgIGlmICgxID09IHdkLT5hZ2dRUG9vbFtpXS0+YWdnUUVuYWJsZWQgJiYgYWMgPT0gd2QtPmFnZ1FQb29sW2ldLT5hYyAmJgorICAgICAgICAgICAgICAgICh3ZC0+YWdnUVBvb2xbaV0tPnNpemUgPiAwKSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKDAgPT0gdGltZSB8fCB0aW1lID4gd2QtPmFnZ1FQb29sW2ldLT5hZ2d2dHhxWyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2QtPmFnZ1FQb29sW2ldLT5hZ2dIZWFkIF0uYXJyaXZhbFRpbWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGlkX3R4ID0gd2QtPmFnZ1FQb29sW2ldOworICAgICAgICAgICAgICAgIHRpbWUgPSB0aWRfdHgtPmFnZ3Z0eHFbIHRpZF90eC0+YWdnSGVhZCBdLmFycml2YWxUaW1lOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIHJldHVybiB0aWRfdHg7Cit9CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZBZ2dUeEdldFZ0eHEgICAgICAgICAgICAgICovCisvKiAgICAgIHJldHVybiBhbiBNU0RVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICB0YWtlIChkZXYsIHFudW0pIGFzIGlucHV0LCByZXR1cm4gYW4gTVNEVSBvdXQgb2YgdGhlIGFnZyBxdWV1ZS4gKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgcW51bTogcXVldWUgbnVtYmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYSBNU0RVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgSG9uZGEgICAgICAgICAgICAgICBBdGhlcm9zIENvbW11bmljYXRpb25zLCBJTkMuICAgIDIwMDYuMTIgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3pidWZfdCogemZBZ2dUeEdldFZ0eHEoemRldl90KiBkZXYsIFRJRF9UWCB0aWRfdHgpCit7CisgICAgemJ1Zl90KiBidWYgPSBOVUxMOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIGlmICh0aWRfdHgtPmFnZ0hlYWQgIT0gdGlkX3R4LT5hZ2dUYWlsKQorICAgIHsKKyAgICAgICAgYnVmID0gdGlkX3R4LT5hZ2d2dHhxWyB0aWRfdHgtPmFnZ1RhaWwgXS5idWY7CisKKyAgICAgICAgdGlkX3R4LT5hZ2d2dHhxW3RpZF90eC0+YWdnVGFpbF0uYnVmID0gTlVMTDsKKworICAgICAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICB0aWRfdHgtPmFnZ1RhaWwgPSAoKHRpZF90eC0+YWdnVGFpbCArIDEpICYgWk1fQUdHUV9TSVpFX01BU0spOworICAgICAgICBpZih0aWRfdHgtPnNpemUgPiAwKSB0aWRfdHgtPnNpemUtLTsKKyAgICAgICAgdGlkX3R4LT5zaXplID0gem1fYWdnX3FsZW4oZGV2LCB0aWRfdHgtPmFnZ0hlYWQsIHRpZF90eC0+YWdnVGFpbCk7CisgICAgICAgIGlmIChOVUxMID09IGJ1ZikgeworICAgICAgICAgICAgLy90aWRfdHgtPmFnZ1RhaWwgPSB0aWRfdHgtPmFnZ0hlYWQgPSB0aWRfdHgtPnNpemUgPSAwOworICAgICAgICAgICAgLy96bV9tc2cxX2FnZyhaTV9MVl8wLCAiR2V0VnR4cSBidWYgPT0gTlVMTCwgdGlkX3R4LT5zaXplPSIsIHRpZF90eC0+c2l6ZSk7CisgICAgICAgIH0KKyAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogcXVldWUgaXMgZW1wdHkKKyAgICAgICAgICovCisgICAgICAgIHptX21zZzFfYWdnKFpNX0xWXzAsICJ0aWRfdHgtPmFnZ0hlYWQgPT0gdGlkX3R4LT5hZ2dUYWlsLCB0aWRfdHgtPnNpemU9IiwgdGlkX3R4LT5zaXplKTsKKworICAgIH0KKworICAgIGlmICh6bV9hZ2dfcWxlbihkZXYsIHRpZF90eC0+YWdnSGVhZCwgdGlkX3R4LT5hZ2dUYWlsKSAhPSB0aWRfdHgtPnNpemUpCisgICAgICAgIHptX21zZzFfYWdnKFpNX0xWXzAsICJxbGVuIT10aWRfdHgtPnNpemUhIHRpZF90eC0+c2l6ZT0iLCB0aWRfdHgtPnNpemUpOworICAgIHJldHVybiBidWY7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmQWdnVHhEZWxldGVRdWV1ZSAgICAgICAgICAqLworLyogICAgICByZXR1cm4gWk1fU1VDQ0VTUyAoY2FuJ3QgZmFpbCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgdGFrZSAoZGV2LCBxbnVtKSBhcyBpbnB1dCwgcmVzZXQgKGRlbGV0ZSkgdGhpcyBhZ2dyZWdhdGUgcXVldWUsICovCisvKiAgICAgIHRoaXMgcXVldWUgaXMgdmlydHVhbGx5IHJldHVybmVkIHRvIHRoZSBhZ2dyZWdhdGUgcXVldWUgcG9vbC4gICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGRldiA6IGRldmljZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBxbnVtOiBxdWV1ZSBudW1iZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBaTV9TVUNDRVNTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBIb25kYSAgICAgICAgICAgICAgIEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMsIElOQy4gICAgMjAwNi4xMiAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTE2X3QgemZBZ2dUeERlbGV0ZVF1ZXVlKHpkZXZfdCogZGV2LCB1MTZfdCBxbnVtKQoreworICAgIHUxNl90IGFjLCB0aWQ7CisgICAgc3RydWN0IGFnZ1F1ZXVlICp0eF90aWQ7CisgICAgc3RydWN0IGFnZ1N0YSAgICphZ2dfc3RhOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHR4X3RpZCA9IHdkLT5hZ2dRUG9vbFtxbnVtXTsKKyAgICBhZ2dfc3RhID0gJndkLT5hZ2dTdGFbdHhfdGlkLT5hZ2dRU1RBXTsKKyAgICBhYyA9IHR4X3RpZC0+YWM7CisgICAgdGlkID0gdHhfdGlkLT50aWQ7CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgdHhfdGlkLT5hZ2dRRW5hYmxlZCA9IDA7CisgICAgdHhfdGlkLT5hZ2dIZWFkID0gdHhfdGlkLT5hZ2dUYWlsID0gMDsKKyAgICB0eF90aWQtPmFnZ1JlYWR5ID0gMDsKKyAgICB0eF90aWQtPmNsZWFyRmxhZyA9IHR4X3RpZC0+ZGVsZXRlRmxhZyA9IDA7CisgICAgdHhfdGlkLT5zaXplID0gMDsKKyAgICBhZ2dfc3RhLT5jb3VudFthY10gPSAwOworCisgICAgYWdnX3N0YS0+dGlkX3R4W3RpZF0gPSBOVUxMOworICAgIGFnZ19zdGEtPmFnZ0ZsYWdbYWNdID0gMDsKKworICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICB6bV9tc2cxX2FnZyhaTV9MVl8wLCAicXVldWUgZGVsZXRlZCEgcW51bT0iLCBxbnVtKTsKKworICAgIHJldHVybiBaTV9TVUNDRVNTOworfQorCisjaWZkZWYgWk1fRU5BQkxFX0FHR1JFR0FUSU9OCisjaWZuZGVmIFpNX0VOQUJMRV9GV19CQV9SRVRSQU5TTUlTU0lPTiAvL2Rpc2FibGUgQkFXCit2b2lkIHpmQmF3Q29yZSh6ZGV2X3QqIGRldiwgdTE2X3QgYmF3X3NlcSwgdTMyX3QgYml0bWFwLCB1MTZfdCBhZ2dMZW4pIHsKKyAgICBUSURfQkFXIHRpZF9iYXc7CisgICAgczE2X3QgaTsKKyAgICB6YnVmX3QqIGJ1ZjsKKyAgICBzdHJ1Y3QgYnVmSW5mbyAqYnVmX2luZm87CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisgICAgLy96bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworICAgIHRpZF9iYXcgPSBCQVctPmdldFEoZGV2LCBiYXdfc2VxKTsKKyAgICAvL3RpZF9iYXcgPSBOVUxMOworICAgIGlmIChOVUxMID09IHRpZF9iYXcpCisgICAgICAgIHJldHVybjsKKworICAgIHRvdGFsX21wZHUgKz0gYWdnTGVuOworICAgIGZvciAoaSA9IGFnZ0xlbiAtIDE7IGk+PTA7IGktLSkgeworICAgICAgICBpZiAoKChiaXRtYXAgPj4gaSkgJiAweDEpID09IDApIHsKKyAgICAgICAgICAgIGJ1Zl9pbmZvID0gQkFXLT5wb3AoZGV2LCBpLCB0aWRfYmF3KTsKKyAgICAgICAgICAgIGJ1ZiA9IGJ1Zl9pbmZvLT5idWY7CisgICAgICAgICAgICBpZiAoYnVmKSB7CisgICAgICAgICAgICAgICAgLy93ZC0+emZjYlNldEJhd1EoZGV2LCBidWYsIDApOworICAgICAgICAgICAgICAgIHpmQWdnVGlkVHhJbnNlcnRIZWFkKGRldiwgYnVmX2luZm8sIHRpZF9iYXctPnRpZF90eCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBzdWNjZXNzX21wZHUrKzsKKyAgICAgICAgfQorICAgIH0KKyAgICBCQVctPmRpc2FibGUoZGV2LCB0aWRfYmF3KTsKKyAgICB6ZkFnZ1R4U2NoZWR1bGVyKGRldik7CisgICAgem1fZGVidWdfbXNnMSgic3VjY2Vzc19tcGR1ID0gIiwgc3VjY2Vzc19tcGR1KTsKKyAgICB6bV9kZWJ1Z19tc2cxKCIgIHRvdGFsX21wZHUgPSAiLCB0b3RhbF9tcGR1KTsKK30KKwordm9pZCAgICB6ZkJhd0luaXQoemRldl90KiBkZXYpIHsKKyAgICBUSURfQkFXIHRpZF9iYXc7CisgICAgdTE2X3QgaSxqOworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICAvL3ptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICBmb3IgKGk9MDsgaTxaTV9CQVdfUE9PTF9TSVpFOyBpKyspeworICAgICAgICB0aWRfYmF3ID0gJkJBVy0+dGlkX2Jhd1tpXTsKKyAgICAgICAgZm9yIChqPTA7IGo8Wk1fVlRYUV9TSVpFOyBqKyspIHsKKyAgICAgICAgICAgIHRpZF9iYXctPmZyYW1lW2pdLmJ1ZiA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgdGlkX2Jhdy0+ZW5hYmxlZCA9IHRpZF9iYXctPmhlYWQgPSB0aWRfYmF3LT50YWlsID0gdGlkX2Jhdy0+c2l6ZSA9IDA7CisgICAgICAgIHRpZF9iYXctPnN0YXJ0X3NlcSA9IDA7CisgICAgfQorICAgIEJBVy0+ZGVsUG9pbnQgPSAwOworICAgIEJBVy0+Y29yZSA9IHpmQmF3Q29yZTsKKyAgICBCQVctPmdldE5ld1EgPSB6ZkJhd0dldE5ld1E7CisgICAgQkFXLT5pbnNlcnQgPSB6ZkJhd0luc2VydDsKKyAgICBCQVctPnBvcCA9IHpmQmF3UG9wOworICAgIEJBVy0+ZW5hYmxlID0gemZCYXdFbmFibGU7CisgICAgQkFXLT5kaXNhYmxlID0gemZCYXdEaXNhYmxlOworICAgIEJBVy0+Z2V0USA9IHpmQmF3R2V0UTsKK30KKworCisKK1RJRF9CQVcgemZCYXdHZXROZXdRKHpkZXZfdCogZGV2LCB1MTZfdCBzdGFydF9zZXEsIFRJRF9UWCB0aWRfdHgpIHsKKyAgICBUSURfQkFXIHRpZF9iYXc9TlVMTDsKKyAgICBUSURfQkFXIG5leHRfYmF3PU5VTEw7CisgICAgdTE2X3QgaTsKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisgICAgLy96bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgLyoKKyAgICBmb3IgKGk9MDsgaTxaTV9CQVdfUE9PTF9TSVpFOyBpKyspeworICAgICAgICB0aWRfYmF3ID0gJkJBVy0+dGlkX2Jhd1tpXTsKKyAgICAgICAgaWYgKEZBTFNFID09IHRpZF9iYXctPmVuYWJsZWQpCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgKi8KKworICAgIHRpZF9iYXcgPSAmQkFXLT50aWRfYmF3W0JBVy0+ZGVsUG9pbnRdOworICAgIGkgPSBCQVctPmRlbFBvaW50OworICAgIC8vaWYgKFpNX0JBV19QT09MX1NJWkUgPT0gaSkgeworICAgICAgICAvL3JldHVybiBOVUxMOworICAgIC8vICAgIHU4X3QgdGVtcCA9IEJBVy0+ZGVsUG9pbnQ7CisgICAgLy8gICAgdGlkX2JhdyA9ICZCQVctPnRpZF9iYXdbQkFXLT5kZWxQb2ludF07CisgICAgLy8gICAgQkFXLT5kaXNhYmxlKGRldiwgdGlkX2Jhdyk7CisgICAgLy8gICAgQkFXLT5kZWxQb2ludCA9IChCQVctPmRlbFBvaW50IDwgKFpNX0JBV19QT09MX1NJWkUgLSAxKSk/IChCQVctPmRlbFBvaW50ICsgMSk6IDA7CisgICAgLy8gICAgdGVtcCA9IEJBVy0+ZGVsUG9pbnQ7CisgICAgLy99CisKKyAgICB6bV9tc2cxX2FnZyhaTV9MVl8wLCAiZ2V0IG5ldyB0aWRfYmF3LCBpbmRleD0iLCBpKTsKKyAgICBCQVctPmRlbFBvaW50ID0gKGkgPCAoWk1fQkFXX1BPT0xfU0laRSAtMSkpPyAoaSArIDEpOiAwOworICAgIG5leHRfYmF3ID0gJkJBVy0+dGlkX2Jhd1tCQVctPmRlbFBvaW50XTsKKyAgICBpZiAoMSA9PSBuZXh0X2Jhdy0+ZW5hYmxlZCkgQkFXLT5kaXNhYmxlKGRldiwgbmV4dF9iYXcpOworCisgICAgQkFXLT5lbmFibGUoZGV2LCB0aWRfYmF3LCBzdGFydF9zZXEpOworICAgIHRpZF9iYXctPnRpZF90eCA9IHRpZF90eDsKKworICAgIHJldHVybiB0aWRfYmF3OworfQorCit1MTZfdCAgIHpmQmF3SW5zZXJ0KHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3QgYmF3X3NlcSwgVElEX0JBVyB0aWRfYmF3LCB1OF90IGJhd19yZXRyYW5zbWl0LCBzdHJ1Y3QgYmF3X2hlYWRlcl9yICpoZWFkZXJfcikgeworICAgIC8vVElEX0JBVyB0aWRfYmF3OworICAgIC8vdTE2X3QgICBidWZMZW47CisKKyAgICAvL3ptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICAvL3ptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICBpZih0aWRfYmF3LT5zaXplIDwgKFpNX1ZUWFFfU0laRSAtIDEpKSB7CisgICAgICAgIHN0cnVjdCBiYXdfaGVhZGVyICpiYXdfaGVhZGVyID0gJnRpZF9iYXctPmZyYW1lW3RpZF9iYXctPmhlYWRdLmJhd19oZWFkZXI7CisKKyAgICAgICAgYmF3X2hlYWRlci0+aGVhZGVyTGVuICAgPSBoZWFkZXJfci0+aGVhZGVyTGVuOworICAgICAgICBiYXdfaGVhZGVyLT5taWNMZW4gICAgICA9IGhlYWRlcl9yLT5taWNMZW47CisgICAgICAgIGJhd19oZWFkZXItPnNuYXBMZW4gICAgID0gaGVhZGVyX3ItPnNuYXBMZW47CisgICAgICAgIGJhd19oZWFkZXItPnJlbW92ZUxlbiAgID0gaGVhZGVyX3ItPnJlbW92ZUxlbjsKKyAgICAgICAgYmF3X2hlYWRlci0+a2V5SWR4ICAgICAgPSBoZWFkZXJfci0+a2V5SWR4OworICAgICAgICB6ZndNZW1vcnlDb3B5KCh1OF90ICopYmF3X2hlYWRlci0+aGVhZGVyLCAodThfdCAqKWhlYWRlcl9yLT5oZWFkZXIsIDU4KTsKKyAgICAgICAgemZ3TWVtb3J5Q29weSgodThfdCAqKWJhd19oZWFkZXItPm1pYyAgICwgKHU4X3QgKiloZWFkZXJfci0+bWljICAgLCA4KTsKKyAgICAgICAgemZ3TWVtb3J5Q29weSgodThfdCAqKWJhd19oZWFkZXItPnNuYXAgICwgKHU4X3QgKiloZWFkZXJfci0+c25hcCAgLCA4KTsKKyAgICAgICAgLy93ZC0+emZjYlNldEJhd1EoZGV2LCBidWYsIDEpOworICAgICAgICB0aWRfYmF3LT5mcmFtZVt0aWRfYmF3LT5oZWFkXS5idWYgPSBidWY7CisgICAgICAgIHRpZF9iYXctPmZyYW1lW3RpZF9iYXctPmhlYWRdLmJhd19zZXEgPSBiYXdfc2VxOworICAgICAgICB0aWRfYmF3LT5mcmFtZVt0aWRfYmF3LT5oZWFkXS5iYXdfcmV0cmFuc21pdCA9IGJhd19yZXRyYW5zbWl0ICsgMTsKKworICAgICAgICAvL3RpZF9iYXctPmZyYW1lW3RpZF9iYXctPmhlYWRdLmRhdGEgPSBwQnVmLT5kYXRhOworICAgICAgICB0aWRfYmF3LT5oZWFkKys7CisgICAgICAgIHRpZF9iYXctPnNpemUrKzsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIC8vd2QtPnpmY2JTZXRCYXdRKGRldiwgYnVmLCAwKTsKKyAgICAgICAgemZ3QnVmRnJlZShkZXYsIGJ1ZiwgWk1fU1VDQ0VTUyk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgcmV0dXJuIFRSVUU7Cit9CisKK3N0cnVjdCBidWZJbmZvKiB6ZkJhd1BvcCh6ZGV2X3QqIGRldiwgdTE2X3QgaW5kZXgsIFRJRF9CQVcgdGlkX2JhdykgeworICAgIC8vVElEX0JBVyB0aWRfYmF3OworICAgIC8vemJ1Zl90KiBidWY7CisgICAgc3RydWN0IGJ1ZkluZm8gKmJ1Zl9pbmZvOworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIGJ1Zl9pbmZvID0gJndkLT5idWZfaW5mbzsKKyAgICBidWZfaW5mby0+YmF3X2hlYWRlciA9IE5VTEw7CisKKyAgICBpZiAoTlVMTCA9PSAoYnVmX2luZm8tPmJ1ZiA9IHRpZF9iYXctPmZyYW1lW2luZGV4XS5idWYpKQorICAgICAgICByZXR1cm4gYnVmX2luZm87CisKKyAgICBidWZfaW5mby0+YmF3X3JldHJhbnNtaXQgPSB0aWRfYmF3LT5mcmFtZVtpbmRleF0uYmF3X3JldHJhbnNtaXQ7CisgICAgYnVmX2luZm8tPmJhd19oZWFkZXIgPSAmdGlkX2Jhdy0+ZnJhbWVbaW5kZXhdLmJhd19oZWFkZXI7CisgICAgYnVmX2luZm8tPnRpbWVzdGFtcCA9IHRpZF9iYXctPmZyYW1lW2luZGV4XS50aW1lc3RhbXA7CisgICAgLy9wQnVmLT5kYXRhID0gcEJ1Zi0+YnVmZmVyOworICAgIC8vd2QtPnpmY2JSZXN0b3JlQnVmRGF0YShkZXYsIGJ1Zik7CisgICAgdGlkX2Jhdy0+ZnJhbWVbaW5kZXhdLmJ1ZiA9IE5VTEw7CisKKyAgICByZXR1cm4gYnVmX2luZm87Cit9CisKK3ZvaWQgICAgemZCYXdFbmFibGUoemRldl90KiBkZXYsIFRJRF9CQVcgdGlkX2JhdywgdTE2X3Qgc3RhcnRfc2VxKSB7CisgICAgLy9USURfQkFXIHRpZF9iYXc7CisKKyAgICAvL3ptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICAvL3ptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICB0aWRfYmF3LT5lbmFibGVkID0gVFJVRTsKKyAgICB0aWRfYmF3LT5oZWFkID0gdGlkX2Jhdy0+dGFpbCA9IHRpZF9iYXctPnNpemUgPSAwOworICAgIHRpZF9iYXctPnN0YXJ0X3NlcSA9IHN0YXJ0X3NlcTsKK30KKwordm9pZCAgICB6ZkJhd0Rpc2FibGUoemRldl90KiBkZXYsIFRJRF9CQVcgdGlkX2JhdykgeworICAgIC8vVElEX0JBVyB0aWRfYmF3OworICAgIHUxNl90IGk7CisKKyAgICAvL3ptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICAvL3ptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisgICAgZm9yIChpPTA7IGk8Wk1fVlRYUV9TSVpFOyBpKyspIHsKKyAgICAgICAgaWYgKHRpZF9iYXctPmZyYW1lW2ldLmJ1ZikgeworCisgICAgICAgICAgICAvL3dkLT56ZmNiU2V0QmF3UShkZXYsIHRpZF9iYXctPmZyYW1lW2ldLmJ1ZiwgMCk7CisgICAgICAgICAgICB6ZndCdWZGcmVlKGRldiwgdGlkX2Jhdy0+ZnJhbWVbaV0uYnVmLCBaTV9TVUNDRVNTKTsKKyAgICAgICAgICAgIHRpZF9iYXctPmZyYW1lW2ldLmJ1ZiA9IE5VTEw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB0aWRfYmF3LT5lbmFibGVkID0gRkFMU0U7Cit9CisKK1RJRF9CQVcgemZCYXdHZXRRKHpkZXZfdCogZGV2LCB1MTZfdCBiYXdfc2VxKSB7CisgICAgVElEX0JBVyB0aWRfYmF3PU5VTEw7CisgICAgdTE2X3QgaTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICAvL3ptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisgICAgZm9yIChpPTA7IGk8Wk1fQkFXX1BPT0xfU0laRTsgaSsrKXsKKyAgICAgICAgdGlkX2JhdyA9ICZCQVctPnRpZF9iYXdbaV07CisgICAgICAgIGlmIChUUlVFID09IHRpZF9iYXctPmVuYWJsZWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHptX21zZzFfYWdnKFpNX0xWXzAsICJnZXQgYW4gb2xkIHRpZF9iYXcsIGJhd19zZXE9IiwgYmF3X3NlcSk7CisgICAgICAgICAgICB6bV9tc2cxX2FnZyhaTV9MVl8wLCAiY2hlY2sgYSAgdGlkX2Jhdy0+c3RhcnRfc2VxPSIsIHRpZF9iYXctPnN0YXJ0X3NlcSk7CisgICAgICAgICAgICBpZihiYXdfc2VxID09IHRpZF9iYXctPnN0YXJ0X3NlcSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgfQorICAgIGlmIChaTV9CQVdfUE9PTF9TSVpFID09IGkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiB0aWRfYmF3OworfQorI2VuZGlmIC8vZGlzYWJsZSBCQVcKKyNlbmRpZgorCit1MTZfdCB6ZkFnZ1RhbGx5UmVzZXQoemRldl90KiBkZXYpCit7CisgICAgc3RydWN0IGFnZ1RhbGx5KiBhZ2dfdGFsOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgLy96bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgYWdnX3RhbCA9ICZ3ZC0+YWdnX3RhbDsKKyAgICBhZ2dfdGFsLT5nb3RfcGFja2V0c19zdW0gPSAwOworICAgIGFnZ190YWwtPmdvdF9ieXRlc19zdW0gPSAwOworICAgIGFnZ190YWwtPnNlbnRfYnl0ZXNfc3VtID0gMDsKKyAgICBhZ2dfdGFsLT5zZW50X3BhY2tldHNfc3VtID0gMDsKKyAgICBhZ2dfdGFsLT5hdmdfZ290X3BhY2tldHMgPSAwOworICAgIGFnZ190YWwtPmF2Z19nb3RfYnl0ZXMgPSAwOworICAgIGFnZ190YWwtPmF2Z19zZW50X3BhY2tldHMgPSAwOworICAgIGFnZ190YWwtPmF2Z19zZW50X2J5dGVzID0gMDsKKyAgICBhZ2dfdGFsLT50aW1lID0gMDsKKyAgICByZXR1cm4gMDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZBZ2dTY2FuQW5kQ2xlYXIgICAgICAgICAgICovCisvKiAgICAgIElmIHRoZSBwYWNrZXRzIGluIGEgcXVldWUgaGF2ZSB3YWl0ZWQgZm9yIHRvbyBsb25nLCBjbGVhciBhbmQgICAqLworLyogICAgICBkZWxldGUgdGhpcyBhZ2dyZWdhdGlvbiBxdWV1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgICAgIDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgdGltZSAgICA6IGN1cnJlbnQgdGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgWk1fU1VDQ0VTUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgSG9uZGEgICAgICAgICAgICAgICBBdGhlcm9zIENvbW11bmljYXRpb25zLCBJTkMuICAgIDIwMDYuMTIgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UxNl90ICAgemZBZ2dTY2FuQW5kQ2xlYXIoemRldl90KiBkZXYsIHUzMl90IHRpbWUpCit7CisgICAgdTE2X3QgaTsKKyAgICB1MTZfdCBoZWFkOworICAgIHUxNl90IHRhaWw7CisgICAgdTMyX3QgdGljazsKKyAgICB1MzJfdCBhcnJpdmFsVGltZTsKKyAgICAvL3UxNl90IGFpZCwgYWM7CisgICAgVElEX1RYIHRpZF90eDsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICBpZighKHdkLT5zdGF0ZSA9PSBaTV9XTEFOX1NUQVRFX0VOQUJMRUQpKSByZXR1cm4gMDsKKyAgICB6ZkFnZ1R4U2NoZWR1bGVyKGRldiwgMSk7CisgICAgdGljayA9IHptX2FnZ19HZXRUaW1lKCk7CisgICAgZm9yIChpPTA7IGk8Wk1fQUdHX1BPT0xfU0laRTsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKCF3ZC0+YWdnUVBvb2xbaV0pIHJldHVybiAwOworICAgICAgICBpZiAoMSA9PSB3ZC0+YWdnUVBvb2xbaV0tPmFnZ1FFbmFibGVkKQorICAgICAgICB7CisgICAgICAgICAgICB0aWRfdHggPSB3ZC0+YWdnUVBvb2xbaV07CisgICAgICAgICAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgICAgICAgICBoZWFkID0gdGlkX3R4LT5hZ2dIZWFkOworICAgICAgICAgICAgdGFpbCA9IHRpZF90eC0+YWdnVGFpbDsKKworICAgICAgICAgICAgYXJyaXZhbFRpbWUgPSAodTMyX3QpdGlkX3R4LT5hZ2d2dHhxW3RpZF90eC0+YWdnVGFpbF0uYXJyaXZhbFRpbWU7CisKKworICAgICAgICAgICAgaWYoKHRpY2sgLSBhcnJpdmFsVGltZSkgPD0gWk1fQUdHX0NMRUFSX1RJTUUpCisgICAgICAgICAgICB7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYoKHRpZF90eC0+c2l6ZSA9IHptX2FnZ19xbGVuKGRldiwgdGlkX3R4LT5hZ2dIZWFkLCB0aWRfdHgtPmFnZ1RhaWwpKSA+IDApCisgICAgICAgICAgICB7CisKKyAgICAgICAgICAgICAgICB0aWRfdHgtPmNsZWFyRmxhZyA9IDE7CisKKyAgICAgICAgICAgICAgICAvL3ptX21zZzFfYWdnKFpNX0xWXzAsICJjbGVhciBxdWV1ZSAgICB0aWNrID0iLCB0aWNrKTsKKyAgICAgICAgICAgICAgICAvL3ptX21zZzFfYWdnKFpNX0xWXzAsICJjbGVhciBxdWV1ZSBhcnJpdmFsID0iLCBhcnJpdmFsVGltZSk7CisKKworICAgICAgICAgICAgICAgIC8vem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgICAgICAvL3pmQWdnVHhTY2hlZHVsZXIoZGV2KTsKKyAgICAgICAgICAgICAgICAvL3ptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHRpZF90eC0+c2l6ZSA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogcXVldWUgZW1wdHkKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBpZiAodGljayAtIHRpZF90eC0+bGFzdEFycml2YWwgPiBaTV9BR0dfREVMRVRFX1RJTUUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB6bV9tc2cxX2FnZyhaTV9MVl8wLCAiZGVsZXRlIHF1ZXVlLCBpZGxlIGZvciBuIHNlYy4gbiA9ICIsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBaTV9BR0dfREVMRVRFX1RJTUUvMTApOworCisgICAgICAgICAgICAgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgICAgICAgICAgICAgIHpmQWdnVHhEZWxldGVRdWV1ZShkZXYsIGkpOworICAgICAgICAgICAgICAgICAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgfQorICAgIH0KKworICAgICAgICB6ZkFnZ1J4Q2xlYXIoZGV2LCB0aW1lKTsKKworI2lmZGVmIFpNX0FHR19UQUxMWQorICAgIGlmKCh3ZC0+dGljayAlIDEwMCkgPT0gMCkgeworICAgICAgICB6ZkFnZ1ByaW50VGFsbHkoZGV2KTsKKyAgICB9CisjZW5kaWYKKworICAgIHJldHVybiBaTV9TVUNDRVNTOworfQorCit1MTZfdCAgIHpmQWdnUHJpbnRUYWxseSh6ZGV2X3QqIGRldikKK3sKKyAgICBzdHJ1Y3QgYWdnVGFsbHkqIGFnZ190YWw7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICAvL3ptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICBhZ2dfdGFsID0gJndkLT5hZ2dfdGFsOworCisgICAgaWYoYWdnX3RhbC0+Z290X3BhY2tldHNfc3VtIDwgMTApCisgICAgeworICAgICAgICB6ZkFnZ1RhbGx5UmVzZXQoZGV2KTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgYWdnX3RhbC0+dGltZSsrOworICAgIGFnZ190YWwtPmF2Z19nb3RfcGFja2V0cyA9IChhZ2dfdGFsLT5hdmdfZ290X3BhY2tldHMgKiAoYWdnX3RhbC0+dGltZSAtIDEpICsKKyAgICAgICAgICAgIGFnZ190YWwtPmdvdF9wYWNrZXRzX3N1bSkgLyBhZ2dfdGFsLT50aW1lOworICAgIGFnZ190YWwtPmF2Z19nb3RfYnl0ZXMgPSAoYWdnX3RhbC0+YXZnX2dvdF9ieXRlcyAqIChhZ2dfdGFsLT50aW1lIC0gMSkgKworICAgICAgICAgICAgYWdnX3RhbC0+Z290X2J5dGVzX3N1bSkgLyBhZ2dfdGFsLT50aW1lOworICAgIGFnZ190YWwtPmF2Z19zZW50X3BhY2tldHMgPSAoYWdnX3RhbC0+YXZnX3NlbnRfcGFja2V0cyAqIChhZ2dfdGFsLT50aW1lIC0gMSkKKyAgICAgICAgICAgICsgYWdnX3RhbC0+c2VudF9wYWNrZXRzX3N1bSkgLyBhZ2dfdGFsLT50aW1lOworICAgIGFnZ190YWwtPmF2Z19zZW50X2J5dGVzID0gKGFnZ190YWwtPmF2Z19zZW50X2J5dGVzICogKGFnZ190YWwtPnRpbWUgLSAxKSArCisgICAgICAgICAgICBhZ2dfdGFsLT5zZW50X2J5dGVzX3N1bSkgLyBhZ2dfdGFsLT50aW1lOworICAgIHptX21zZzFfYWdnKFpNX0xWXzAsICJnb3RfcGFja2V0c19zdW0gPSIsIGFnZ190YWwtPmdvdF9wYWNrZXRzX3N1bSk7CisgICAgem1fbXNnMV9hZ2coWk1fTFZfMCwgIiAgZ290X2J5dGVzX3N1bSA9IiwgYWdnX3RhbC0+Z290X2J5dGVzX3N1bSk7CisgICAgem1fbXNnMV9hZ2coWk1fTFZfMCwgInNlbnRfcGFja2V0c19zdW09IiwgYWdnX3RhbC0+c2VudF9wYWNrZXRzX3N1bSk7CisgICAgem1fbXNnMV9hZ2coWk1fTFZfMCwgIiBzZW50X2J5dGVzX3N1bSA9IiwgYWdnX3RhbC0+c2VudF9ieXRlc19zdW0pOworICAgIGFnZ190YWwtPmdvdF9wYWNrZXRzX3N1bSA9IGFnZ190YWwtPmdvdF9ieXRlc19zdW0gPWFnZ190YWwtPnNlbnRfcGFja2V0c19zdW0KKyAgICAgICAgICAgICAgICA9IGFnZ190YWwtPnNlbnRfYnl0ZXNfc3VtID0gMDsKKyAgICB6bV9tc2cxX2FnZyhaTV9MVl8wLCAiYXZnX2dvdF9wYWNrZXRzID0iLCBhZ2dfdGFsLT5hdmdfZ290X3BhY2tldHMpOworICAgIHptX21zZzFfYWdnKFpNX0xWXzAsICIgIGF2Z19nb3RfYnl0ZXMgPSIsIGFnZ190YWwtPmF2Z19nb3RfYnl0ZXMpOworICAgIHptX21zZzFfYWdnKFpNX0xWXzAsICJhdmdfc2VudF9wYWNrZXRzPSIsIGFnZ190YWwtPmF2Z19zZW50X3BhY2tldHMpOworICAgIHptX21zZzFfYWdnKFpNX0xWXzAsICIgYXZnX3NlbnRfYnl0ZXMgPSIsIGFnZ190YWwtPmF2Z19zZW50X2J5dGVzKTsKKyAgICBpZiAoKHdkLT5jb21tVGFsbHkuQkFfRmFpbCA9PSAwKSB8fCAod2QtPmNvbW1UYWxseS5Id19UeF9NUERVID09IDApKQorICAgIHsKKyAgICAgICAgem1fbXNnMV9hZ2coWk1fTFZfMCwgIkhhcmR3YXJlIFR4IE1QRFU9Iiwgd2QtPmNvbW1UYWxseS5Id19UeF9NUERVKTsKKyAgICAgICAgem1fbXNnMV9hZ2coWk1fTFZfMCwgIiAgQkEgRmFpbCBudW1iZXI9Iiwgd2QtPmNvbW1UYWxseS5CQV9GYWlsKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICB6bV9tc2cxX2FnZyhaTV9MVl8wLCAiMS8oQkEgZmFpbCByYXRlKT0iLCB3ZC0+Y29tbVRhbGx5Lkh3X1R4X01QRFUvd2QtPmNvbW1UYWxseS5CQV9GYWlsKTsKKworICAgIHJldHVybiAwOworfQorCit1MTZfdCB6ZkFnZ1J4Q2xlYXIoemRldl90KiBkZXYsIHUzMl90IHRpbWUpCit7CisgICAgdTE2X3QgICBpOworICAgIHN0cnVjdCBhZ2dfdGlkX3J4ICp0aWRfcng7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgZm9yIChpPTA7IGk8Wk1fQUdHX1BPT0xfU0laRTsgaSsrKQorICAgIHsKKyAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgdGlkX3J4ID0gd2QtPnRpZF9yeFtpXTsKKyAgICAgICAgaWYgKHRpZF9yeC0+YmF3X2hlYWQgIT0gdGlkX3J4LT5iYXdfdGFpbCkKKyAgICAgICAgeworICAgICAgICAgICAgdTE2X3QgaiA9IHRpZF9yeC0+YmF3X3RhaWw7CisgICAgICAgICAgICB3aGlsZSAoKGogIT0gdGlkX3J4LT5iYXdfaGVhZCkgJiYgIXRpZF9yeC0+ZnJhbWVbal0uYnVmKSB7CisgICAgICAgICAgICAJaiA9IChqICsgMSkgJiBaTV9BR0dfQkFXX01BU0s7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKGogIT0gdGlkX3J4LT5iYXdfaGVhZCkgJiYgKHRpbWUgLSB0aWRfcngtPmZyYW1lW2pdLmFycml2YWxUaW1lKSA+CisgICAgICAgICAgICAgICAgICAgIChaTV9BR0dfQ0xFQVJfVElNRSAtIDUpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgICAgICAgICAgem1fbXNnMF9hZ2coWk1fTFZfMSwgInF1ZXVlIFJ4Rmx1c2ggYnkgUnhDbGVhciIpOworICAgICAgICAgICAgICAgIHpmQWdnUnhGbHVzaChkZXYsIDAsIHRpZF9yeCk7CisgICAgICAgICAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIH0KKworICAgIHJldHVybiBaTV9TVUNDRVNTOworfQorCitzdHJ1Y3QgYWdnX3RpZF9yeCogemZBZ2dSeEVuYWJsZWQoemRldl90KiBkZXYsIHpidWZfdCogYnVmKQoreworICAgIHUxNl90ICAgZHN0MCwgc3JjWzNdLCBhYywgYWlkLCBmcmFnT2ZmOworICAgIHU4X3QgICAgdXA7CisgICAgdTE2X3QgICBvZmZzZXQgPSAwOworICAgIHUxNl90ICAgc2VxX25vOworICAgIHUxNl90IGZyYW1lVHlwZTsKKyAgICB1MTZfdCBmcmFtZUN0cmw7CisgICAgdTE2X3QgZnJhbWVTdWJ0eXBlOworICAgIHUzMl90IHRjcF9zZXE7CisgICAgLy9zdHJ1Y3QgYWdnU3RhICphZ2dfc3RhOworI2lmIFpNX0FHR19GUEdBX1JFT1JERVJJTkcKKyAgICBzdHJ1Y3QgYWdnX3RpZF9yeCAqdGlkX3J4OworI2VuZGlmCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgLy96bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworICAgIHNlcV9ubyA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIDIyKSA+PiA0OworICAgIC8vRGJnUHJpbnQoIlJ4IHNlcT0lZFxuIiwgc2VxX25vKTsKKyAgICBpZiAod2QtPnN0YS5FbmFibGVIVCA9PSAwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgZnJhbWVDdHJsID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgMCk7CisgICAgZnJhbWVUeXBlID0gZnJhbWVDdHJsICYgMHhmOworICAgIGZyYW1lU3VidHlwZSA9IGZyYW1lQ3RybCAmIDB4ZjA7CisKKworICAgIGlmIChmcmFtZVR5cGUgIT0gWk1fV0xBTl9EQVRBX0ZSQU1FKSAvL25vbi1Rb3MgRGF0YT8gKGZyYW1lU3VidHlwZSYweDgwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorI2lmZGVmIFpNX0VOQUJMRV9QRVJGT1JNQU5DRV9FVkFMVUFUSU9OCisgICAgdGNwX3NlcSA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIDIyKzM2KSA8PCAyNDsKKyAgICB0Y3Bfc2VxICs9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIDIyKzM3KSA8PCAxNjsKKyAgICB0Y3Bfc2VxICs9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIDIyKzM4KSA8PCA4OworICAgIHRjcF9zZXEgKz0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgMjIrMzkpOworI2VuZGlmCisKKyAgICBaTV9TRVFfREVCVUcoIkluICAgICAgICAgICAgICAgICAgICU1ZCwgJTEydVxuIiwgc2VxX25vLCB0Y3Bfc2VxKTsKKyAgICBkc3QwID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1Ziwgb2Zmc2V0KzQpOworCisgICAgc3JjWzBdID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1Ziwgb2Zmc2V0KzEwKTsKKyAgICBzcmNbMV0gPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCBvZmZzZXQrMTIpOworICAgIHNyY1syXSA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIG9mZnNldCsxNCk7CisKKyNpZiBaTV9BR0dfRlBHQV9ERUJVRworICAgIGFpZCA9IDA7CisjZWxzZQorICAgIGFpZCA9IHpmQXBGaW5kU3RhKGRldiwgc3JjKTsKKyNlbmRpZgorCisgICAgLy9hZ2dfc3RhID0gJndkLT5hZ2dTdGFbYWlkXTsKKyAgICAvL3pmVHhHZXRJcFRvc0FuZEZyYWcoZGV2LCBidWYsICZ1cCwgJmZyYWdPZmYpOworICAgIC8vYWMgPSB6Y1VwVG9BY1t1cCYweDddICYgMHgzOworCisgICAgLyoKKyAgICAgKiBGaWx0ZXIgdW5pY2FzdCBmcmFtZSBvbmx5LCBhaWQgPT0gMCBpcyBmb3IgZGVidWcgb25seQorICAgICAqLworICAgIGlmICgoZHN0MCAmIDB4MSkgPT0gMCAmJiBhaWQgPT0gMCkKKyAgICB7CisjaWYgWk1fQUdHX0ZQR0FfUkVPUkRFUklORworICAgICAgICB0aWRfcnggPSB6ZkFnZ1J4R2V0UXVldWUoZGV2LCBidWYpIDsKKyAgICAgICAgaWYoIXRpZF9yeCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vaWYgKHRpZF9yeC0+YWRkQmFFeGNoYW5nZVN0YXR1c0NvZGUgPT0gWk1fQUdHX0FEREJBX1JFU1BPTlNFKQorICAgICAgICAgICAgcmV0dXJuIHRpZF9yeDsKKyAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgcmV0dXJuIE5VTEw7CisjZW5kaWYKKyAgICB9CisKKyAgICByZXR1cm4gTlVMTDsKK30KKwordTE2X3QgemZBZ2dSeCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHN0cnVjdCB6c0FkZGl0aW9uSW5mbyAqYWRkSW5mbywgc3RydWN0IGFnZ190aWRfcnggKnRpZF9yeCkKK3sKKyAgICB1MTZfdCAgIHNlcV9ubzsKKyAgICBzMTZfdCAgIGluZGV4OworICAgIHUxNl90ICAgb2Zmc2V0ID0gMDsKKyAgICB6YnVmX3QqIHBidWY7CisgICAgdThfdCAgICBmcmFtZVN1YlR5cGU7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgWk1fQlVGRkVSX1RSQUNFKGRldiwgYnVmKQorCisgICAgWk1fUEVSRk9STUFOQ0VfUlhfUkVPUkRFUihkZXYpOworCisgICAgc2VxX25vID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1Ziwgb2Zmc2V0KzIyKSA+PiA0OworCisgICAgaW5kZXggPSBzZXFfbm8gLSB0aWRfcngtPnNlcV9zdGFydDsKKyAgICAvKgorICAgICAqIGZvciBkZWJ1ZworICAgICAqLworCisgICAgLyogem1fbXNnMl9hZ2coWk1fTFZfMCwgInF1ZXVlIHNlcSA9ICIsIHNlcV9ubyk7CisgICAgICogRGJnUHJpbnQoIiVzOiVzJWx4aCAlcyVseGhcbiIsIF9fZnVuY19fLCAicXVldWUgc2VxPSIsIHNlcV9ubywKKyAgICAgKiAgICI7IHNlcV9zdGFydD0iLCB0aWRfcngtPnNlcV9zdGFydCk7CisgICAgICovCisKKyAgICAvL0RiZ1ByaW50KCJzZXFfbm89JWQsIHNlcV9zdGFydD0lZFxuIiwgc2VxX25vLCB0aWRfcngtPnNlcV9zdGFydCk7CisKKyAgICAvKiBJbiBzb21lIEFQcywgd2UgZm91bmQgdGhhdCBpdCBtaWdodCB0cmFuc21pdCBOVUxMIGRhdGEgd2hvc2Ugc2VxdWVuY2UgbnVtYmVyCisgICAgICAgaXMgb3V0IG9yIG9yZGVyLiBJbiBvcmRlciB0byBhdm9pZCB0aGlzIHByb2JsZW0sIHdlIGlnbm9yZSB0aGVzZSBOVUxMIGRhdGEuCisgICAgICovCisKKyAgICBmcmFtZVN1YlR5cGUgPSAoem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMCkgJiAweEYwKSA+PiA0OworCisgICAgLyogSWYgdGhpcyBpcyBhIE5VTEwgZGF0YSBpbnN0ZWFkIG9mIFFvcyBOVUxMIGRhdGEgKi8KKyAgICBpZiAoKGZyYW1lU3ViVHlwZSAmIDB4MEMpID09IDB4MDQpCisgICAgeworICAgICAgICBzMTZfdCBzZXFfZGlmZjsKKworICAgICAgICBzZXFfZGlmZiA9IChzZXFfbm8gPiB0aWRfcngtPnNlcV9zdGFydCkgPworICAgICAgICAgICAgICAgICAgICAgICBzZXFfbm8gLSB0aWRfcngtPnNlcV9zdGFydCA6IHRpZF9yeC0+c2VxX3N0YXJ0IC0gc2VxX25vOworCisgICAgICAgIGlmIChzZXFfZGlmZiA+IFpNX0FHR19CQVdfU0laRSkKKyAgICAgICAgeworICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiRnJlZSBSeCBOVUxMIGRhdGEgaW4gemZBZ2dSeCIpOworCisgICAgICAgICAgICAvKiBGcmVlIFJ4IGJ1ZmZlciAqLworICAgICAgICAgICAgemZ3QnVmRnJlZShkZXYsIGJ1ZiwgMCk7CisgICAgICAgICAgICByZXR1cm4gWk1fRVJSX09VVF9PRl9PUkRFUl9OVUxMX0RBVEE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIHNlcXVlbmNlIG51bWJlciB3cmFwIGF0IDRrCisgICAgICovCisgICAgaWYgKHRpZF9yeC0+c2VxX3N0YXJ0ID4gc2VxX25vKQorICAgIHsKKyAgICAgICAgLy9pbmRleCArPSA0MDk2OworCisgICAgICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgIGlmICh0aWRfcngtPnNlcV9zdGFydCA+PSA0MDk2KSB7CisgICAgICAgICAgICB0aWRfcngtPnNlcV9zdGFydCA9IDA7CisgICAgICAgIH0KKyAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIH0KKworICAgIGlmICh0aWRfcngtPnNlcV9zdGFydCA9PSBzZXFfbm8pIHsKKyAgICAJem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAJaWYgKCgodGlkX3J4LT5iYXdfaGVhZCAtIHRpZF9yeC0+YmF3X3RhaWwpICYgWk1fQUdHX0JBV19NQVNLKSA+IDApIHsKKyAgICAJICAgIC8vRGJnUHJpbnQoImhlYWQ9JWQsIHRhaWw9JWQiLCB0aWRfcngtPmJhd19oZWFkLCB0aWRfcngtPmJhd190YWlsKTsKKyAgICAgICAgICAgIHRpZF9yeC0+YmF3X3RhaWwgPSAodGlkX3J4LT5iYXdfdGFpbCArIDEpICYgWk1fQUdHX0JBV19NQVNLOworICAgICAgICB9CisgICAgICAgIHRpZF9yeC0+c2VxX3N0YXJ0ID0gKHRpZF9yeC0+c2VxX3N0YXJ0ICsgMSkgJiAoNDA5NiAtIDEpOworICAgIAl6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgICAgIFpNX1BFUkZPUk1BTkNFX1JYX1NFUShkZXYsIGJ1Zik7CisKKyAgICAJaWYgKHdkLT56ZmNiUmVjdjgwMjExICE9IE5VTEwpIHsKKyAgICAgICAgICAgIC8vc2VxX25vID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1Ziwgb2Zmc2V0KzIyKSA+PiA0OworICAgICAgICAgICAgLy9EYmdQcmludCgiUmVjdiBpbmRpY2F0ZSBzZXE9JWRcbiIsIHNlcV9ubyk7CisgICAgICAgICAgICAvL0RiZ1ByaW50KCIxLiBzZXE9JWRcbiIsIHNlcV9ubyk7CisKKyAgICAgICAgICAgIHdkLT56ZmNiUmVjdjgwMjExKGRldiwgYnVmLCBhZGRJbmZvKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHpmaVJlY3Y4MDIxMShkZXYsIGJ1ZiwgYWRkSW5mbyk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoIXpmQWdnUnhFbnF1ZXVlKGRldiwgYnVmLCB0aWRfcngsIGFkZEluZm8pKQorICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogZHVwbGljYXRlZCBwYWNrZXQKKyAgICAgICAgICovCisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIHdoaWxlICh0aWRfcngtPmJhd19oZWFkICE9IHRpZF9yeC0+YmF3X3RhaWwpIHsvLyAmJiB0aWRfcngtPmZyYW1lW3RpZF9yeC0+YmF3X3RhaWxdLmJ1ZikKKyAgICAgICAgdTE2X3QgdGFpbEluZGV4OworCisgICAgICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICAgICAgdGFpbEluZGV4ID0gdGlkX3J4LT5iYXdfdGFpbDsKKyAgICAgICAgcGJ1ZiA9IHRpZF9yeC0+ZnJhbWVbdGFpbEluZGV4XS5idWY7CisgICAgICAgIHRpZF9yeC0+ZnJhbWVbdGFpbEluZGV4XS5idWYgPSAwOworICAgICAgICBpZiAoIXBidWYpCisgICAgICAgIHsKKyAgICAgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHRpZF9yeC0+YmF3X3RhaWwgPSAodGlkX3J4LT5iYXdfdGFpbCArIDEpICYgWk1fQUdHX0JBV19NQVNLOworICAgICAgICB0aWRfcngtPnNlcV9zdGFydCA9ICh0aWRfcngtPnNlcV9zdGFydCArIDEpICYgKDQwOTYgLSAxKTsKKworCisgICAgICAgIC8vaWYocGJ1ZiAmJiB0aWRfcngtPmJhd19zaXplID4gMCkKKyAgICAgICAgLy8gICAgdGlkX3J4LT5iYXdfc2l6ZS0tOworCisgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICAgICAgWk1fUEVSRk9STUFOQ0VfUlhfU0VRKGRldiwgcGJ1Zik7CisKKyAgICAgICAgaWYgKHdkLT56ZmNiUmVjdjgwMjExICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vc2VxX25vID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIHBidWYsIG9mZnNldCsyMikgPj4gNDsKKyAgICAgICAgICAgIC8vRGJnUHJpbnQoIlJlY3YgaW5kaWNhdGUgc2VxPSVkXG4iLCBzZXFfbm8pOworICAgICAgICAgICAgLy9EYmdQcmludCgiMS4gc2VxPSVkXG4iLCBzZXFfbm8pOworICAgICAgICAgICAgd2QtPnpmY2JSZWN2ODAyMTEoZGV2LCBwYnVmLCBhZGRJbmZvKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vc2VxX25vID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIHBidWYsIG9mZnNldCsyMikgPj4gNDsKKyAgICAgICAgICAgIC8vRGJnUHJpbnQoIlJlY3YgaW5kaWNhdGUgc2VxPSVkXG4iLCBzZXFfbm8pOworICAgICAgICAgICAgemZpUmVjdjgwMjExKGRldiwgcGJ1ZiwgYWRkSW5mbyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMTsKK30KKworc3RydWN0IGFnZ190aWRfcnggKnpmQWdnUnhHZXRRdWV1ZSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpCit7CisgICAgdTE2X3QgICBzcmNbM107CisgICAgdTE2X3QgICBhaWQsIGFjLCBpOworICAgIHUxNl90ICAgb2Zmc2V0ID0gMDsKKyAgICBzdHJ1Y3QgYWdnX3RpZF9yeCAqdGlkX3J4ID0gTlVMTDsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIC8vem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHNyY1swXSA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIG9mZnNldCsxMCk7CisgICAgc3JjWzFdID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1Ziwgb2Zmc2V0KzEyKTsKKyAgICBzcmNbMl0gPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCBvZmZzZXQrMTQpOworICAgIGFpZCA9IHpmQXBGaW5kU3RhKGRldiwgc3JjKTsKKworICAgIGFjID0gKHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIDI0KSAmIDB4Rik7CisKKyAgICAvLyBtYXJrIGJ5IHNwaW4gbG9jayBkZWJ1ZworICAgIC8vem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIGZvciAoaT0wOyBpPFpNX0FHR19QT09MX1NJWkUgOyBpKyspCisgICAgeworICAgICAgICBpZigod2QtPnRpZF9yeFtpXS0+YWlkID09IGFpZCkgJiYgKHdkLT50aWRfcnhbaV0tPmFjID09IGFjKSkKKyAgICAgICAgeworICAgICAgICAgICAgdGlkX3J4ID0gd2QtPnRpZF9yeFtpXTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gbWFyayBieSBzcGluIGxvY2sgZGVidWcKKyAgICAvL3ptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgcmV0dXJuIHRpZF9yeDsKK30KKworCit1MTZfdCAgIHpmQWdnUnhFbnF1ZXVlKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1Ziwgc3RydWN0IGFnZ190aWRfcnggKnRpZF9yeCwgc3RydWN0IHpzQWRkaXRpb25JbmZvICphZGRJbmZvKQoreworICAgIHUxNl90IHNlcV9ubywgb2Zmc2V0ID0gMDsKKyAgICB1MTZfdCBxX2luZGV4OworICAgIHMxNl90IGluZGV4OworICAgIHU4X3QgIGJkcm9wZnJhbWUgPSAwOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIFpNX0JVRkZFUl9UUkFDRShkZXYsIGJ1ZikKKworICAgIHNlcV9ubyA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIG9mZnNldCsyMikgPj4gNDsKKyAgICBpbmRleCAgPSBzZXFfbm8gLSB0aWRfcngtPnNlcV9zdGFydDsKKworICAgIC8qCisgICAgICogc2VxdWVuY2UgbnVtYmVyIHdyYXAgYXQgNGsKKyAgICAgKiAtMTAwMDogY2hlY2sgZm9yIGR1cGxpY2F0ZSBwYXN0IHBhY2tldAorICAgICAqLworICAgIGJkcm9wZnJhbWUgPSAwOworICAgIGlmICh0aWRfcngtPnNlcV9zdGFydCA+IHNlcV9ubykgeworICAgICAgICBpZiAoKHRpZF9yeC0+c2VxX3N0YXJ0ID4gMzk2NykgJiYgKHNlcV9ubyA8IDEyOCkpIHsKKyAgICAgICAgICAgIGluZGV4ICs9IDQwOTY7CisgICAgICAgIH0gZWxzZSBpZiAodGlkX3J4LT5zZXFfc3RhcnQgLSBzZXFfbm8gPiA3MCkgeworICAgICAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgIHRpZF9yeC0+c3FfYmVoaW5kX2NvdW50Kys7CisgICAgICAgICAgICBpZiAodGlkX3J4LT5zcV9iZWhpbmRfY291bnQgPiAzKSB7CisgICAgICAgICAgICAgICAgdGlkX3J4LT5zcV9iZWhpbmRfY291bnQgPSAwOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBiZHJvcGZyYW1lID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBiZHJvcGZyYW1lID0gMTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChzZXFfbm8gLSB0aWRfcngtPnNlcV9zdGFydCA+IDcwKSB7CisgICAgICAgICAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICAgICAgdGlkX3J4LT5zcV9leGNlZWRfY291bnQrKzsKKyAgICAgICAgICAgIGlmICh0aWRfcngtPnNxX2V4Y2VlZF9jb3VudCA+IDMpIHsKKyAgICAgICAgICAgICAgICB0aWRfcngtPnNxX2V4Y2VlZF9jb3VudCA9IDA7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGJkcm9wZnJhbWUgPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChiZHJvcGZyYW1lID09IDEpIHsKKyAgICAgICAgLyppZiAod2QtPnpmY2JSZWN2ODAyMTEgIT0gTlVMTCkgeworICAgICAgICAgICAgd2QtPnpmY2JSZWN2ODAyMTEoZGV2LCBidWYsIGFkZEluZm8pOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgemZpUmVjdjgwMjExKGRldiwgYnVmLCBhZGRJbmZvKTsKKyAgICAgICAgfSovCisKKyAgICAgICAgWk1fUEVSRk9STUFOQ0VfRlJFRShkZXYsIGJ1Zik7CisKKyAgICAgICAgemZ3QnVmRnJlZShkZXYsIGJ1ZiwgMCk7CisgICAgICAgIC8qemZBZ2dSeEZsdXNoKGRldiwgc2VxX25vLCB0aWRfcngpOworICAgICAgICB0aWRfcngtPnNlcV9zdGFydCA9IHNlcV9ubzsKKyAgICAgICAgaW5kZXggPSBzZXFfbm8gLSB0aWRfcngtPnNlcV9zdGFydDsKKyAgICAgICAgKi8KKworICAgICAgICAvL0RiZ1ByaW50KCJGcmVlIGFuIG9sZCBwYWNrZXQsIHNlcV9zdGFydD0lZCwgc2VxX25vPSVkXG4iLCB0aWRfcngtPnNlcV9zdGFydCwgc2VxX25vKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBkdXBsaWNhdGUgcGFzdCBwYWNrZXQKKyAgICAgICAgICogaGFwcGVucyBvbmx5IGluIHNpbXVsYXRlZCBhZ2dyZWdhdGlvbiBlbnZpcm9ubWVudAorICAgICAgICAgKi8KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgaWYgKHRpZF9yeC0+c3FfZXhjZWVkX2NvdW50ID4gMCl7CisgICAgICAgICAgICB0aWRfcngtPnNxX2V4Y2VlZF9jb3VudC0tOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHRpZF9yeC0+c3FfYmVoaW5kX2NvdW50ID4gMCkgeworICAgICAgICAgICAgdGlkX3J4LT5zcV9iZWhpbmRfY291bnQtLTsKKyAgICAgICAgfQorICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIH0KKworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgemZBZ2dSeEZsdXNoKGRldiwgc2VxX25vLCB0aWRfcngpOworICAgICAgICB0aWRfcngtPnNlcV9zdGFydCA9IHNlcV9ubzsKKyAgICAgICAgaW5kZXggPSAwOworICAgIH0KKworICAgIC8vaWYgKGluZGV4ID49IChaTV9BR0dfQkFXX1NJWkUgLSAxKSkKKyAgICBpZiAoaW5kZXggPj0gKFpNX0FHR19CQVdfTUFTSykpCisgICAgeworICAgICAgICAvKgorICAgICAgICAgKiBxdWV1ZSBmdWxsCisgICAgICAgICAqLworICAgICAgICAvL0RiZ1ByaW50KCJpbmRleCA+PSA2NCwgc2VxX3N0YXJ0PSVkLCBzZXFfbm89JWRcbiIsIHRpZF9yeC0+c2VxX3N0YXJ0LCBzZXFfbm8pOworICAgICAgICB6ZkFnZ1J4Rmx1c2goZGV2LCBzZXFfbm8sIHRpZF9yeCk7CisgICAgICAgIC8vdGlkX3J4LT5zZXFfc3RhcnQgPSBzZXFfbm87CisgICAgICAgIGluZGV4ID0gc2VxX25vIC0gdGlkX3J4LT5zZXFfc3RhcnQ7CisgICAgICAgIGlmICgodGlkX3J4LT5zZXFfc3RhcnQgPiBzZXFfbm8pICYmICh0aWRfcngtPnNlcV9zdGFydCA+IDEwMDApICYmICh0aWRfcngtPnNlcV9zdGFydCAtIDEwMDApID4gc2VxX25vKQorICAgICAgICB7CisgICAgICAgIC8vaW5kZXggPSBzZXFfbm8gLSB0aWRfcngtPnNlcV9zdGFydDsKKyAgICAgICAgICAgIGluZGV4ICs9IDQwOTY7CisgICAgICAgIH0KKyAgICAgICAgLy9pbmRleCA9IHNlcV9ubyAtIHRpZF9yeC0+c2VxX3N0YXJ0OworICAgICAgICB3aGlsZSAoaW5kZXggPj0gKFpNX0FHR19CQVdfTUFTSykpIHsKKyAgICAgICAgICAgIC8vRGJnUHJpbnQoImluZGV4ID49IDY0LCBzZXFfc3RhcnQ9JWQsIHNlcV9ubz0lZFxuIiwgdGlkX3J4LT5zZXFfc3RhcnQsIHNlcV9ubyk7CisgICAgICAgICAgICB0aWRfcngtPnNlcV9zdGFydCA9ICh0aWRfcngtPnNlcV9zdGFydCArIFpNX0FHR19CQVdfTUFTSykgJiAoNDA5NiAtIDEpOworICAgICAgICAgICAgaW5kZXggPSBzZXFfbm8gLSB0aWRfcngtPnNlcV9zdGFydDsKKyAgICAgICAgICAgIGlmICgodGlkX3J4LT5zZXFfc3RhcnQgPiBzZXFfbm8pICYmICh0aWRfcngtPnNlcV9zdGFydCA+IDEwMDApICYmICh0aWRfcngtPnNlcV9zdGFydCAtIDEwMDApID4gc2VxX25vKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGluZGV4ICs9IDQwOTY7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKworICAgIHFfaW5kZXggPSAodGlkX3J4LT5iYXdfdGFpbCArIGluZGV4KSAmIFpNX0FHR19CQVdfTUFTSzsKKyAgICBpZiAodGlkX3J4LT5mcmFtZVtxX2luZGV4XS5idWYgJiYgKCgodGlkX3J4LT5iYXdfaGVhZCAtIHRpZF9yeC0+YmF3X3RhaWwpICYgWk1fQUdHX0JBV19NQVNLKSA+CisgICAgICAgICAgICAgICAgKCgocV9pbmRleCkgLSB0aWRfcngtPmJhd190YWlsKSAmIFpNX0FHR19CQVdfTUFTSykpKQorICAgIHsKKworICAgICAgICBaTV9QRVJGT1JNQU5DRV9EVVAoZGV2LCB0aWRfcngtPmZyYW1lW3FfaW5kZXhdLmJ1ZiwgYnVmKTsKKyAgICAgICAgemZ3QnVmRnJlZShkZXYsIGJ1ZiwgMCk7CisgICAgICAgIC8vRGJnUHJpbnQoIkZyZWUgYSBkdXBsaWNhdGUgcGFja2V0LCBzZXFfc3RhcnQ9JWQsIHNlcV9ubz0lZFxuIiwgdGlkX3J4LT5zZXFfc3RhcnQsIHNlcV9ubyk7CisgICAgICAgIC8vRGJnUHJpbnQoImhlYWQ9JWQsIHRhaWw9JWQiLCB0aWRfcngtPmJhd19oZWFkLCB0aWRfcngtPmJhd190YWlsKTsKKyAgICAgICAgLyoKKyAgICAgICAgICogZHVwbGljYXRlIHBhY2tldAorICAgICAgICAgKi8KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICBpZih0aWRfcngtPmZyYW1lW3FfaW5kZXhdLmJ1ZikgeworICAgICAgICB6ZndCdWZGcmVlKGRldiwgdGlkX3J4LT5mcmFtZVtxX2luZGV4XS5idWYsIDApOworICAgICAgICB0aWRfcngtPmZyYW1lW3FfaW5kZXhdLmJ1ZiA9IDA7CisgICAgfQorCisgICAgdGlkX3J4LT5mcmFtZVtxX2luZGV4XS5idWYgPSBidWY7CisgICAgdGlkX3J4LT5mcmFtZVtxX2luZGV4XS5hcnJpdmFsVGltZSA9IHptX2FnZ19HZXRUaW1lKCk7CisgICAgemZ3TWVtb3J5Q29weSgodm9pZCopJnRpZF9yeC0+ZnJhbWVbcV9pbmRleF0uYWRkSW5mbywgKHZvaWQqKWFkZEluZm8sIHNpemVvZihzdHJ1Y3QgenNBZGRpdGlvbkluZm8pKTsKKworICAgIC8qCisgICAgICogZm9yIGRlYnVnIHNpbXVsYXRlZCBhZ2dyZWdhdGlvbiBvbmx5LAorICAgICAqIHNob3VsZCBiZSBkb25lIGluIHJ4IG9mIEFEREJBIFJlcXVlc3QKKyAgICAgKi8KKyAgICAvL3RpZF9yeC0+YWRkSW5mbyA9IGFkZEluZm87CisKKworICAgIGlmICgoKHRpZF9yeC0+YmF3X2hlYWQgLSB0aWRfcngtPmJhd190YWlsKSAmIFpNX0FHR19CQVdfTUFTSykgPD0gaW5kZXgpCisgICAgeworICAgICAgICAvL3RpZF9yeC0+YmF3X3NpemUgPSBpbmRleCArIDE7CisgICAgICAgIGlmICgoKHRpZF9yeC0+YmF3X2hlYWQgLSB0aWRfcngtPmJhd190YWlsKSAmIFpNX0FHR19CQVdfTUFTSykgPD0KKyAgICAgICAgICAgICAgICAvLygocV9pbmRleCArIDEpICYgWk1fQUdHX0JBV19NQVNLKSkKKyAgICAgICAgICAgICAgICAoKChxX2luZGV4KSAtIHRpZF9yeC0+YmF3X3RhaWwpICYgWk1fQUdHX0JBV19NQVNLKSkvL3RpZF9yeC0+YmF3X3NpemUgKQorICAgICAgICAgICAgdGlkX3J4LT5iYXdfaGVhZCA9IChxX2luZGV4ICsgMSkgJiBaTV9BR0dfQkFXX01BU0s7CisgICAgfQorICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICAvKgorICAgICAqIHN1Y2Nlc3MKKyAgICAgKi8KKyAgICAvL0RiZ1ByaW50KCJoZWFkPSVkLCB0YWlsPSVkLCBzdGFydD0lZCIsIHRpZF9yeC0+YmF3X2hlYWQsIHRpZF9yeC0+YmF3X3RhaWwsIHRpZF9yeC0+c2VxX3N0YXJ0KTsKKyAgICByZXR1cm4gMTsKK30KKwordTE2X3QgemZBZ2dSeEZsdXNoKHpkZXZfdCogZGV2LCB1MTZfdCBzZXFfbm8sIHN0cnVjdCBhZ2dfdGlkX3J4ICp0aWRfcngpCit7CisgICAgemJ1Zl90KiBwYnVmOworICAgIHUxNl90ICAgc2VxOworICAgIHN0cnVjdCB6c0FkZGl0aW9uSW5mbyBhZGRJbmZvOworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgWk1fUEVSRk9STUFOQ0VfUlhfRkxVU0goZGV2KTsKKworICAgIHdoaWxlICgxKQorICAgIHsKKyAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgaWYgKHRpZF9yeC0+YmF3X3RhaWwgPT0gdGlkX3J4LT5iYXdfaGVhZCkgeworICAgICAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgcGJ1ZiA9IHRpZF9yeC0+ZnJhbWVbdGlkX3J4LT5iYXdfdGFpbF0uYnVmOworICAgICAgICB6ZndNZW1vcnlDb3B5KCh2b2lkKikmYWRkSW5mbywgKHZvaWQqKSZ0aWRfcngtPmZyYW1lW3RpZF9yeC0+YmF3X3RhaWxdLmFkZEluZm8sIHNpemVvZihzdHJ1Y3QgenNBZGRpdGlvbkluZm8pKTsKKyAgICAgICAgdGlkX3J4LT5mcmFtZVt0aWRfcngtPmJhd190YWlsXS5idWYgPSAwOworICAgICAgICAvL2lmKHBidWYgJiYgdGlkX3J4LT5iYXdfc2l6ZSA+IDApIHRpZF9yeC0+YmF3X3NpemUtLTsKKyAgICAgICAgdGlkX3J4LT5iYXdfdGFpbCA9ICh0aWRfcngtPmJhd190YWlsICsgMSkgJiBaTV9BR0dfQkFXX01BU0s7CisgICAgICAgIHRpZF9yeC0+c2VxX3N0YXJ0ID0gKHRpZF9yeC0+c2VxX3N0YXJ0ICsgMSkgJiAoNDA5NiAtIDEpOworCSAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgICAgIGlmIChwYnVmKQorICAgICAgICB7CisKKyAgICAgICAgICAgIFpNX1BFUkZPUk1BTkNFX1JYX1NFUShkZXYsIHBidWYpOworCisgICAgICAgICAgICBpZiAod2QtPnpmY2JSZWN2ODAyMTEgIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzZXEgPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgcGJ1ZiwgMjIpID4+IDQ7CisgICAgICAgICAgICAgICAgLy9EYmdQcmludCgiUmVjdiBpbmRpY2F0ZSBzZXE9JWRcbiIsIHNlcSk7CisgICAgICAgICAgICAgICAgLy9EYmdQcmludCgiMi4gc2VxPSVkXG4iLCBzZXEpOworICAgICAgICAgICAgICAgIHdkLT56ZmNiUmVjdjgwMjExKGRldiwgcGJ1ZiwgJmFkZEluZm8pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNlcSA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBwYnVmLCAyMikgPj4gNDsKKyAgICAgICAgICAgICAgICAvL0RiZ1ByaW50KCJSZWN2IGluZGljYXRlIHNlcT0lZFxuIiwgc2VxKTsKKyAgICAgICAgICAgICAgICB6ZmlSZWN2ODAyMTEoZGV2LCBwYnVmLCAmYWRkSW5mbyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIHRpZF9yeC0+YmF3X2hlYWQgPSB0aWRfcngtPmJhd190YWlsID0gMDsKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIHJldHVybiAxOworfQorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmQWdnUnhGcmVlQnVmICAgICAgICAgICAgICAqLworLyogICAgICBGcmVlcyBhbGwgcXVldWVkIHBhY2tldHMgaW4gYnVmZmVyIHdoZW4gdGhlIGRyaXZlciBpcyBkb3duLiAgICAgKi8KKy8qICAgICAgVGhlIHpmRnJlZVJlc291cmNlKCkgd2lsbCBjaGVjayBpZiB0aGUgYnVmZmVyIGlzIGFsbCBmcmVlZC4gICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2ICAgICA6IGRldmljZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgWk1fU1VDQ0VTUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgSG9uZGEgICAgICAgICAgICAgICBBdGhlcm9zIENvbW11bmljYXRpb25zLCBJTkMuICAgIDIwMDYuMTIgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UxNl90ICAgemZBZ2dSeEZyZWVCdWYoemRldl90KiBkZXYsIHUxNl90IGRlc3Ryb3kpCit7CisgICAgdTE2X3QgICBpOworICAgIHpidWZfdCogYnVmOworICAgIHN0cnVjdCBhZ2dfdGlkX3J4ICp0aWRfcng7CisKKyAgICBUSURfVFggIHRpZF90eDsKKyAgICAvL3N0cnVjdCBidWZJbmZvICpidWZfaW5mbzsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgZm9yIChpPTA7IGk8Wk1fQUdHX1BPT0xfU0laRTsgaSsrKQorICAgIHsKKyAgICAgICAgdTE2X3QgajsKKworICAgICAgICB0aWRfcnggPSB3ZC0+dGlkX3J4W2ldOworCisgICAgICAgIGZvcihqPTA7IGogPD0gWk1fQUdHX0JBV19TSVpFOyBqKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgICAgICBidWYgPSB0aWRfcngtPmZyYW1lW2pdLmJ1ZjsKKyAgICAgICAgICAgIHRpZF9yeC0+ZnJhbWVbal0uYnVmID0gMDsKKyAgICAgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICAgICAgICAgIGlmIChidWYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgemZ3QnVmRnJlZShkZXYsIGJ1ZiwgMCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAjaWYgMAorICAgICAgICBpZiAoIHRpZF9yeC0+YmF3X2hlYWQgIT0gdGlkX3J4LT5iYXdfdGFpbCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHdoaWxlICh0aWRfcngtPmJhd19oZWFkICE9IHRpZF9yeC0+YmF3X3RhaWwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnVmID0gdGlkX3J4LT5mcmFtZVt0aWRfcngtPmJhd190YWlsXS5idWY7CisgICAgICAgICAgICAgICAgdGlkX3J4LT5mcmFtZVt0aWRfcngtPmJhd190YWlsXS5idWYgPSAwOworICAgICAgICAgICAgICAgIGlmIChidWYpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB6ZndCdWZGcmVlKGRldiwgYnVmLCAwKTsKKworICAgICAgICAgICAgICAgICAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICAgICAgICAgICAgICB0aWRfcngtPmZyYW1lW3RpZF9yeC0+YmF3X3RhaWxdLmJ1ZiA9IDA7CisgICAgICAgICAgICAgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgICAgICAgICAgLy9pZiAodGlkX3J4LT5iYXdfc2l6ZSA+IDApdGlkX3J4LT5iYXdfc2l6ZS0tOworICAgICAgICAgICAgICAgIHRpZF9yeC0+YmF3X3RhaWwgPSAodGlkX3J4LT5iYXdfdGFpbCArIDEpICYgWk1fQUdHX0JBV19NQVNLOworICAgICAgICAgICAgICAgIHRpZF9yeC0+c2VxX3N0YXJ0Kys7CisgICAgICAgICAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAjZW5kaWYKKworICAgICAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICB0aWRfcngtPnNlcV9zdGFydCA9IDA7CisgICAgICAgIHRpZF9yeC0+YmF3X2hlYWQgPSB0aWRfcngtPmJhd190YWlsID0gMDsKKyAgICAgICAgdGlkX3J4LT5haWQgPSBaTV9NQVhfU1RBX1NVUFBPUlQ7CisgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICAgICAgI2lmZGVmIFpNX0VOQUJMRV9BR0dSRUdBVElPTgorICAgICAgICAjaWZuZGVmIFpNX0VOQUJMRV9GV19CQV9SRVRSQU5TTUlTU0lPTiAvL2Rpc2FibGUgQkFXCisgICAgICAgIGlmICh0aWRfYmF3LT5lbmFibGVkKSB7CisgICAgICAgICAgICB6bV9tc2cxX2FnZyhaTV9MVl8wLCAiRGV2aWNlIGRvd24sIGNsZWFyIEJBVyBxdWV1ZToiLCBpKTsKKyAgICAgICAgICAgIEJBVy0+ZGlzYWJsZShkZXYsIHRpZF9iYXcpOworICAgICAgICB9CisgICAgICAgICNlbmRpZgorICAgICAgICAjZW5kaWYKKyAgICAgICAgaWYgKDEgPT0gd2QtPmFnZ1FQb29sW2ldLT5hZ2dRRW5hYmxlZCkgeworICAgICAgICAgICAgdGlkX3R4ID0gd2QtPmFnZ1FQb29sW2ldOworICAgICAgICAgICAgYnVmID0gemZBZ2dUeEdldFZ0eHEoZGV2LCB0aWRfdHgpOworICAgICAgICAgICAgd2hpbGUgKGJ1ZikgeworICAgICAgICAgICAgICAgIHpmd0J1ZkZyZWUoZGV2LCBidWYsIDApOworICAgICAgICAgICAgICAgIGJ1ZiA9IHpmQWdnVHhHZXRWdHhxKGRldiwgdGlkX3R4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmKGRlc3Ryb3kpIHsKKyAgICAgICAgICAgIHpmd01lbUZyZWUoZGV2LCB3ZC0+YWdnUVBvb2xbaV0sIHNpemVvZihzdHJ1Y3QgYWdnUXVldWUpKTsKKyAgICAgICAgICAgIHpmd01lbUZyZWUoZGV2LCB3ZC0+dGlkX3J4W2ldLCBzaXplb2Yoc3RydWN0IGFnZ190aWRfcngpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAjaWZkZWYgWk1fRU5BQkxFX0FHR1JFR0FUSU9OCisgICAgI2lmbmRlZiBaTV9FTkFCTEVfRldfQkFfUkVUUkFOU01JU1NJT04gLy9kaXNhYmxlIEJBVworICAgIGlmKGRlc3Ryb3kpIHpmd01lbUZyZWUoZGV2LCBCQVcsIHNpemVvZihzdHJ1Y3QgYmF3X2VuYWJsZXIpKTsKKyAgICAjZW5kaWYKKyAgICAjZW5kaWYKKyAgICByZXR1cm4gWk1fU1VDQ0VTUzsKK30KKworCit2b2lkIHpmQWdnUmVjdkJBUih6ZGV2X3QqIGRldiwgemJ1Zl90ICpidWYpIHsKKyAgICB1MTZfdCBzdGFydF9zZXEsIGxlbjsKKyAgICB1OF90IGksIGJpdG1hcFs4XTsKKyAgICBsZW4gPSB6ZndCdWZHZXRTaXplKGRldiwgYnVmKTsKKyAgICBzdGFydF9zZXEgPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCBsZW4tMik7CisgICAgRGJnUHJpbnQoIlJlY2VpdmVkIGEgQkFSIENvbnRyb2wgZnJhbWUsIHN0YXJ0X3NlcT0lZCIsIHN0YXJ0X3NlcT4+NCk7CisgICAgLyogdG9kbzogc2V0IHRoZSBiaXRtYXAgYnkgcmVvcmRlcmluZyBidWZmZXIhICovCisgICAgZm9yIChpPTA7IGk8ODsgaSsrKSBiaXRtYXBbaV09MDsKKyAgICB6ZlNlbmRCQShkZXYsIHN0YXJ0X3NlcSwgYml0bWFwKTsKK30KKworI2lmZGVmIFpNX0VOQUJMRV9BR0dSRUdBVElPTgorI2lmbmRlZiBaTV9FTkFCTEVfRldfQkFfUkVUUkFOU01JU1NJT04gLy9kaXNhYmxlIEJBVwordm9pZCB6ZkFnZ1R4UmV0cmFuc21pdCh6ZGV2X3QqIGRldiwgc3RydWN0IGJ1ZkluZm8gKmJ1Zl9pbmZvLCBzdHJ1Y3QgYWdnQ29udHJvbCAqYWdnQ29udHJvbCwgVElEX1RYIHRpZF90eCkgeworICAgIHUxNl90IHJlbW92ZUxlbjsKKyAgICB1MTZfdCBlcnI7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisgICAgaWYgKGFnZ0NvbnRyb2wgJiYgKFpNX0FHR19GSVJTVF9NUERVID09IGFnZ0NvbnRyb2wtPmFtcGR1SW5kaWNhdGlvbikgKSB7CisgICAgICAgIHRpZF90eC0+YmFyX3NzbiA9IGJ1Zl9pbmZvLT5iYXdfaGVhZGVyLT5oZWFkZXJbMTVdOworICAgICAgICBhZ2dDb250cm9sLT50aWRfYmF3LT5zdGFydF9zZXEgPSB0aWRfdHgtPmJhcl9zc24gPj4gNDsKKyAgICAgICAgem1fbXNnMV9hZ2coWk1fTFZfMCwgInN0YXJ0IHNlcT0iLCB0aWRfdHgtPmJhcl9zc24gPj4gNCk7CisgICAgfQorICAgIGJ1Zl9pbmZvLT5iYXdfaGVhZGVyLT5oZWFkZXJbNF0gfD0gKDEgPDwgMTEpOworICAgIGlmIChhZ2dDb250cm9sICYmIGFnZ0NvbnRyb2wtPmFnZ0VuYWJsZWQpIHsKKyAgICAgICAgLy9pZiAod2QtPmVuYWJsZUFnZ3JlZ2F0aW9uPT0wICYmICEoYnVmX2luZm8tPmJhd19oZWFkZXItPmhlYWRlcls2XSYweDEpKQorICAgICAgICAvL3sKKyAgICAgICAgICAgIC8vaWYgKCgoYnVmX2luZm8tPmJhd19oZWFkZXItPmhlYWRlclsyXSAmIDB4MykgPT0gMikpCisgICAgICAgICAgICAvL3sKKyAgICAgICAgICAgICAgICAvKiBFbmFibGUgYWdncmVnYXRpb24gKi8KKyAgICAgICAgICAgICAgICBidWZfaW5mby0+YmF3X2hlYWRlci0+aGVhZGVyWzFdIHw9IDB4MjA7CisgICAgICAgICAgICAgICAgaWYgKFpNX0FHR19MQVNUX01QRFUgPT0gYWdnQ29udHJvbC0+YW1wZHVJbmRpY2F0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgIGJ1Zl9pbmZvLT5iYXdfaGVhZGVyLT5oZWFkZXJbMV0gfD0gMHg0MDAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYnVmX2luZm8tPmJhd19oZWFkZXItPmhlYWRlclsxXSAmPSB+MHg0MDAwOworICAgICAgICAgICAgICAgICAgICAvL3ptX2RlYnVnX21zZzAoIlpNX0FHR19MQVNUX01QRFUiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAvL30KKyAgICAgICAgICAgIC8vZWxzZSB7CisgICAgICAgICAgICAvLyAgICB6bV9kZWJ1Z19tc2cxKCJubyBhZ2dyLCBoZWFkZXJbMl0mMHgzID0gIixidWZfaW5mby0+YmF3X2hlYWRlci0+aGVhZGVyWzJdICYgMHgzKQorICAgICAgICAgICAgLy8gICAgYWdnQ29udHJvbC0+YWdnRW5hYmxlZCA9IDA7CisgICAgICAgICAgICAvL30KKyAgICAgICAgLy99CisgICAgICAgIC8vZWxzZSB7CisgICAgICAgIC8vICAgIHptX2RlYnVnX21zZzEoIm5vIGFnZ3IsIHdkLT5lbmFibGVBZ2dyZWdhdGlvbiA9ICIsIHdkLT5lbmFibGVBZ2dyZWdhdGlvbik7CisgICAgICAgIC8vICAgIHptX2RlYnVnX21zZzEoIm5vIGFnZ3IsICFoZWFkZXJbNl0mMHgxID0gIiwhKGJ1Zl9pbmZvLT5iYXdfaGVhZGVyLT5oZWFkZXJbNl0mMHgxKSk7CisgICAgICAgIC8vICAgIGFnZ0NvbnRyb2wtPmFnZ0VuYWJsZWQgPSAwOworICAgICAgICAvL30KKyAgICB9CisKKyAgICAvKmlmIChhZ2dDb250cm9sLT50aWRfYmF3KSB7CisgICAgICAgIHN0cnVjdCBiYXdfaGVhZGVyX3IgaGVhZGVyX3I7CisKKyAgICAgICAgaGVhZGVyX3IuaGVhZGVyICAgICAgPSBidWZfaW5mby0+YmF3X2hlYWRlci0+aGVhZGVyOworICAgICAgICBoZWFkZXJfci5taWMgICAgICAgICA9IGJ1Zl9pbmZvLT5iYXdfaGVhZGVyLT5taWM7CisgICAgICAgIGhlYWRlcl9yLnNuYXAgICAgICAgID0gYnVmX2luZm8tPmJhd19oZWFkZXItPnNuYXA7CisgICAgICAgIGhlYWRlcl9yLmhlYWRlckxlbiAgID0gYnVmX2luZm8tPmJhd19oZWFkZXItPmhlYWRlckxlbjsKKyAgICAgICAgaGVhZGVyX3IubWljTGVuICAgICAgPSBidWZfaW5mby0+YmF3X2hlYWRlci0+bWljTGVuOworICAgICAgICBoZWFkZXJfci5zbmFwTGVuICAgICA9IGJ1Zl9pbmZvLT5iYXdfaGVhZGVyLT5zbmFwTGVuOworICAgICAgICBoZWFkZXJfci5yZW1vdmVMZW4gICA9IGJ1Zl9pbmZvLT5iYXdfaGVhZGVyLT5yZW1vdmVMZW47CisgICAgICAgIGhlYWRlcl9yLmtleUlkeCAgICAgID0gYnVmX2luZm8tPmJhd19oZWFkZXItPmtleUlkeDsKKworICAgICAgICBCQVctPmluc2VydChkZXYsIGJ1Zl9pbmZvLT5idWYsIHRpZF90eC0+YmFyX3NzbiA+PiA0LCBhZ2dDb250cm9sLT50aWRfYmF3LCBidWZfaW5mby0+YmF3X3JldHJhbnNtaXQsICZoZWFkZXJfcik7CisgICAgfSovCisKKyAgICBpZiAoKGVyciA9IHpmSHBTZW5kKGRldiwKKyAgICAgICAgICAgICAgICAgICAgYnVmX2luZm8tPmJhd19oZWFkZXItPmhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgYnVmX2luZm8tPmJhd19oZWFkZXItPmhlYWRlckxlbiwKKyAgICAgICAgICAgICAgICAgICAgYnVmX2luZm8tPmJhd19oZWFkZXItPnNuYXAsCisgICAgICAgICAgICAgICAgICAgIGJ1Zl9pbmZvLT5iYXdfaGVhZGVyLT5zbmFwTGVuLAorICAgICAgICAgICAgICAgICAgICBidWZfaW5mby0+YmF3X2hlYWRlci0+bWljLAorICAgICAgICAgICAgICAgICAgICBidWZfaW5mby0+YmF3X2hlYWRlci0+bWljTGVuLAorICAgICAgICAgICAgICAgICAgICBidWZfaW5mby0+YnVmLAorICAgICAgICAgICAgICAgICAgICBidWZfaW5mby0+YmF3X2hlYWRlci0+cmVtb3ZlTGVuLAorICAgICAgICAgICAgICAgICAgICBaTV9FWFRFUk5BTF9BTExPQ19CVUYsCisgICAgICAgICAgICAgICAgICAgICh1OF90KXRpZF90eC0+YWMsCisgICAgICAgICAgICAgICAgICAgIGJ1Zl9pbmZvLT5iYXdfaGVhZGVyLT5rZXlJZHgpKSAhPSBaTV9TVUNDRVNTKQorICAgIHsKKyAgICAgICAgZ290byB6bEVycm9yOworICAgIH0KKworICAgIHJldHVybjsKKworemxFcnJvcjoKKyAgICB6ZndCdWZGcmVlKGRldiwgYnVmX2luZm8tPmJ1ZiwgMCk7CisgICAgcmV0dXJuOworCit9CisjZW5kaWYgLy9kaXNhYmxlIEJBVworI2VuZGlmCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZBZ2dUeFNlbmRFdGggICAgICAgICAgICAgICovCisvKiAgICAgIENhbGxlZCB0byB0cmFuc21pdCBFdGhlcm5ldCBmcmFtZSBmcm9tIHVwcGVyIGVsYXllci4gICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGRldiA6IGRldmljZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBidWYgOiBidWZmZXIgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgcG9ydCA6IFdMQU4gcG9ydCwgMD0+c3RhbmRhcmQsIDB4MTAtMHgxNz0+VkFQLCAweDIwLTB4MjU9PldEUyAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZXJyb3IgY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiwgSG9uZGEgICAgICBBdGhlcm9zIENvbW11bmljYXRpb25zLCBJbmMuICAgIDIwMDYuMTIgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UxNl90IHpmQWdnVHhTZW5kRXRoKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3QgcG9ydCwgdTE2X3QgYnVmVHlwZSwgdThfdCBmbGFnLCBzdHJ1Y3QgYWdnQ29udHJvbCAqYWdnQ29udHJvbCwgVElEX1RYIHRpZF90eCkKK3sKKyAgICB1MTZfdCBlcnI7CisgICAgLy91MTZfdCBhZGRyVGJsU2l6ZTsKKyAgICAvL3N0cnVjdCB6c0FkZHJUYmwgYWRkclRibDsKKyAgICB1MTZfdCByZW1vdmVMZW47CisgICAgdTE2X3QgaGVhZGVyWyg4KzMwKzIrMTgpLzJdOyAgICAvKiBjdHIrKDQrYTErYTIrYTMrMithNCkrcW9zK2l2ICovCisgICAgdTE2X3QgaGVhZGVyTGVuOworICAgIHUxNl90IG1pY1s4LzJdOworICAgIHUxNl90IG1pY0xlbjsKKyAgICB1MTZfdCBzbmFwWzgvMl07CisgICAgdTE2X3Qgc25hcExlbjsKKyAgICB1MTZfdCBmcmFnTGVuOworICAgIHUxNl90IGZyYW1lTGVuOworICAgIHUxNl90IGZyYWdOdW07CisgICAgc3RydWN0IHpzRnJhZyBmcmFnOworICAgIHUxNl90IGksIGlkOworICAgIHUxNl90IGRhWzNdOworICAgIHUxNl90IHNhWzNdOworICAgIHU4X3QgdXA7CisgICAgdThfdCBxb3NUeXBlLCBrZXlJZHggPSAwOworICAgIHUxNl90IGZyYWdPZmY7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgem1fbXNnMV90eChaTV9MVl8yLCAiemZUeFNlbmRFdGgoKSwgcG9ydD0iLCBwb3J0KTsKKworICAgIC8qIEdldCBJUCBUT1MgZm9yIFFvUyBBQyBhbmQgSVAgZnJhZyBvZmZzZXQgKi8KKyAgICB6ZlR4R2V0SXBUb3NBbmRGcmFnKGRldiwgYnVmLCAmdXAsICZmcmFnT2ZmKTsKKworI2lmZGVmIFpNX0VOQUJMRV9OQVRJVkVfV0lGSQorICAgIGlmICggd2QtPndsYW5Nb2RlID09IFpNX01PREVfSU5GUkFTVFJVQ1RVUkUgKQorICAgIHsKKyAgICAgICAgLyogREEgKi8KKyAgICAgICAgZGFbMF0gPSB6bXdfdHhfYnVmX3JlYWRoKGRldiwgYnVmLCAxNik7CisgICAgICAgIGRhWzFdID0gem13X3R4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMTgpOworICAgICAgICBkYVsyXSA9IHptd190eF9idWZfcmVhZGgoZGV2LCBidWYsIDIwKTsKKyAgICAgICAgLyogU0EgKi8KKyAgICAgICAgc2FbMF0gPSB6bXdfdHhfYnVmX3JlYWRoKGRldiwgYnVmLCAxMCk7CisgICAgICAgIHNhWzFdID0gem13X3R4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMTIpOworICAgICAgICBzYVsyXSA9IHptd190eF9idWZfcmVhZGgoZGV2LCBidWYsIDE0KTsKKyAgICB9CisgICAgZWxzZSBpZiAoIHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0lCU1MgKQorICAgIHsKKyAgICAgICAgLyogREEgKi8KKyAgICAgICAgZGFbMF0gPSB6bXdfdHhfYnVmX3JlYWRoKGRldiwgYnVmLCA0KTsKKyAgICAgICAgZGFbMV0gPSB6bXdfdHhfYnVmX3JlYWRoKGRldiwgYnVmLCA2KTsKKyAgICAgICAgZGFbMl0gPSB6bXdfdHhfYnVmX3JlYWRoKGRldiwgYnVmLCA4KTsKKyAgICAgICAgLyogU0EgKi8KKyAgICAgICAgc2FbMF0gPSB6bXdfdHhfYnVmX3JlYWRoKGRldiwgYnVmLCAxMCk7CisgICAgICAgIHNhWzFdID0gem13X3R4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMTIpOworICAgICAgICBzYVsyXSA9IHptd190eF9idWZfcmVhZGgoZGV2LCBidWYsIDE0KTsKKyAgICB9CisgICAgZWxzZSBpZiAoIHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0FQICkKKyAgICB7CisgICAgICAgIC8qIERBICovCisgICAgICAgIGRhWzBdID0gem13X3R4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgNCk7CisgICAgICAgIGRhWzFdID0gem13X3R4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgNik7CisgICAgICAgIGRhWzJdID0gem13X3R4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgOCk7CisgICAgICAgIC8qIFNBICovCisgICAgICAgIHNhWzBdID0gem13X3R4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMTYpOworICAgICAgICBzYVsxXSA9IHptd190eF9idWZfcmVhZGgoZGV2LCBidWYsIDE4KTsKKyAgICAgICAgc2FbMl0gPSB6bXdfdHhfYnVmX3JlYWRoKGRldiwgYnVmLCAyMCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8vCisgICAgfQorI2Vsc2UKKyAgICAvKiBEQSAqLworICAgIGRhWzBdID0gem13X3R4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMCk7CisgICAgZGFbMV0gPSB6bXdfdHhfYnVmX3JlYWRoKGRldiwgYnVmLCAyKTsKKyAgICBkYVsyXSA9IHptd190eF9idWZfcmVhZGgoZGV2LCBidWYsIDQpOworICAgIC8qIFNBICovCisgICAgc2FbMF0gPSB6bXdfdHhfYnVmX3JlYWRoKGRldiwgYnVmLCA2KTsKKyAgICBzYVsxXSA9IHptd190eF9idWZfcmVhZGgoZGV2LCBidWYsIDgpOworICAgIHNhWzJdID0gem13X3R4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMTApOworI2VuZGlmCisgICAgLy9EZWNpZGUgS2V5IEluZGV4IGluIEFUT00sIE5vIG1lYW5pbmcgaW4gT1RVUy0tQ1dZYW5nKG0pCisgICAgaWYgKHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0FQKQorICAgIHsKKyAgICAgICAga2V5SWR4ID0gd2QtPmFwLmJjSGFsS2V5SWR4W3BvcnRdOworICAgICAgICBpZCA9IHpmQXBGaW5kU3RhKGRldiwgZGEpOworICAgICAgICBpZiAoaWQgIT0gMHhmZmZmKQorICAgICAgICB7CisgICAgICAgICAgICBzd2l0Y2ggKHdkLT5hcC5zdGFUYWJsZVtpZF0uZW5jcnlNb2RlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgY2FzZSBaTV9BRVM6CisgICAgICAgICAgICBjYXNlIFpNX1RLSVA6CisjaWZkZWYgWk1fRU5BQkxFX0NFTkMKKyAgICAgICAgICAgIGNhc2UgWk1fQ0VOQzoKKyNlbmRpZiAvL1pNX0VOQUJMRV9DRU5DCisgICAgICAgICAgICAgICAga2V5SWR4ID0gd2QtPmFwLnN0YVRhYmxlW2lkXS5rZXlJZHg7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgc3dpdGNoICh3ZC0+c3RhLmVuY3J5TW9kZSkKKyAgICAgICAgeworICAgICAgICBjYXNlIFpNX1dFUDY0OgorICAgICAgICBjYXNlIFpNX1dFUDEyODoKKyAgICAgICAgY2FzZSBaTV9XRVAyNTY6CisgICAgICAgICAgICBrZXlJZHggPSB3ZC0+c3RhLmtleUlkOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgWk1fQUVTOgorICAgICAgICBjYXNlIFpNX1RLSVA6CisgICAgICAgICAgICBpZiAoKGRhWzBdJiAweDEpKQorICAgICAgICAgICAgICAgIGtleUlkeCA9IDU7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAga2V5SWR4ID0gNDsKKyAgICAgICAgICAgIGJyZWFrOworI2lmZGVmIFpNX0VOQUJMRV9DRU5DCisgICAgICAgIGNhc2UgWk1fQ0VOQzoKKyAgICAgICAgICAgIGtleUlkeCA9IHdkLT5zdGEuY2VuY0tleUlkOworICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYgLy9aTV9FTkFCTEVfQ0VOQworICAgICAgICB9CisgICAgfQorCisgICAgLyogQ3JlYXRlIFNOQVAgKi8KKyAgICByZW1vdmVMZW4gPSB6ZlR4R2VuV2xhblNuYXAoZGV2LCBidWYsIHNuYXAsICZzbmFwTGVuKTsKKyAgICAvL3ptX21zZzFfdHgoWk1fTFZfMCwgImZyYWdPZmY9IiwgZnJhZ09mZik7CisKKyAgICBmcmFnTGVuID0gd2QtPmZyYWdUaHJlc2hvbGQ7CisgICAgZnJhbWVMZW4gPSB6ZndCdWZHZXRTaXplKGRldiwgYnVmKTsKKyAgICBmcmFtZUxlbiAtPSByZW1vdmVMZW47CisKKyNpZiAwCisgICAgLyogQ3JlYXRlIE1JQyAqLworICAgIGlmICggKHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0lORlJBU1RSVUNUVVJFKSYmCisgICAgICAgICAod2QtPnN0YS5lbmNyeU1vZGUgPT0gWk1fVEtJUCkgKQorICAgIHsKKyAgICAgICAgaWYgKCBmcmFtZUxlbiA+IGZyYWdMZW4gKQorICAgICAgICB7CisgICAgICAgICAgICBtaWNMZW4gPSB6ZlR4R2VuV2xhblRhaWwoZGV2LCBidWYsIHNuYXAsIHNuYXBMZW4sIG1pYyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvKiBhcHBlbmQgTUlDIGJ5IEhNQUMgKi8KKyAgICAgICAgICAgIG1pY0xlbiA9IDg7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgbWljTGVuID0gMDsKKyAgICB9CisjZWxzZQorICAgIGlmICggZnJhbWVMZW4gPiBmcmFnTGVuICkKKyAgICB7CisgICAgICAgIG1pY0xlbiA9IHpmVHhHZW5XbGFuVGFpbChkZXYsIGJ1Ziwgc25hcCwgc25hcExlbiwgbWljKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogYXBwZW5kIE1JQyBieSBITUFDICovCisgICAgICAgIG1pY0xlbiA9IDA7CisgICAgfQorI2VuZGlmCisKKyAgICAvKiBBY2Nlc3MgQ2F0ZWdvcnkgKi8KKyAgICBpZiAod2QtPndsYW5Nb2RlID09IFpNX01PREVfQVApCisgICAgeworICAgICAgICB6ZkFwR2V0U3RhUW9zVHlwZShkZXYsIGRhLCAmcW9zVHlwZSk7CisgICAgICAgIGlmIChxb3NUeXBlID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHVwID0gMDsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9JTkZSQVNUUlVDVFVSRSkKKyAgICB7CisgICAgICAgIGlmICh3ZC0+c3RhLndtZUNvbm5lY3RlZCA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICB1cCA9IDA7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogVE9ETyA6IFNUQSBRb1MgY29udHJvbCBmaWVsZCAqLworICAgICAgICB1cCA9IDA7CisgICAgfQorCisgICAgLyogQXNzaWduIHNlcXVlbmNlIG51bWJlciAqLworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgZnJhZy5zZXFbMF0gPSAoKHdkLT5zZXFbemNVcFRvQWNbdXAmMHg3XV0rKykgPDwgNCk7CisgICAgaWYgKGFnZ0NvbnRyb2wgJiYgKFpNX0FHR19GSVJTVF9NUERVID09IGFnZ0NvbnRyb2wtPmFtcGR1SW5kaWNhdGlvbikgKSB7CisgICAgICAgIHRpZF90eC0+YmFyX3NzbiA9IGZyYWcuc2VxWzBdOworCisgICAgICAgIHptX21zZzFfYWdnKFpNX0xWXzAsICJzdGFydCBzZXE9IiwgdGlkX3R4LT5iYXJfc3NuID4+IDQpOworICAgIH0KKyAgICAvL3RpZF90eC0+YmF3X2J1Zlt0aWRfdHgtPmJhd19oZWFkLTFdLmJhd19zZXE9ZnJhZy5zZXFbMF07CisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworCisgICAgICAgIGZyYWcuYnVmWzBdID0gYnVmOworICAgICAgICBmcmFnLmJ1ZlR5cGVbMF0gPSBidWZUeXBlOworICAgICAgICBmcmFnLmZsYWdbMF0gPSBmbGFnOworICAgICAgICBmcmFnTnVtID0gMTsKKworICAgIGZvciAoaT0wOyBpPGZyYWdOdW07IGkrKykKKyAgICB7CisgICAgICAgIC8qIENyZWF0ZSBXTEFOIGhlYWRlcihDb250cm9sIFNldHRpbmcgKyA4MDIuMTEgaGVhZGVyICsgSVYpICovCisgICAgICAgIGlmICh1cCAhPTAgKSB6bV9kZWJ1Z19tc2cxKCJ1cCBub3QgMCwgdXA9Iix1cCk7CisgICAgICAgIGhlYWRlckxlbiA9IHpmVHhHZW5XbGFuSGVhZGVyKGRldiwgZnJhZy5idWZbaV0sIGhlYWRlciwgZnJhZy5zZXFbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYWcuZmxhZ1tpXSwgc25hcExlbittaWNMZW4sIHJlbW92ZUxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9ydCwgZGEsIHNhLCB1cCwgJm1pY0xlbiwgc25hcCwgc25hcExlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWdnQ29udHJvbCk7CisKKyAgICAgICAgLyogR2V0IGJ1ZmZlciBETUEgYWRkcmVzcyAqLworICAgICAgICAvL2lmICgoYWRkclRibFNpemUgPSB6ZndCdWZNYXBEbWEoZGV2LCBmcmFnLmJ1ZltpXSwgJmFkZHJUYmwpKSA9PSAwKQorICAgICAgICAvL2lmICgoYWRkclRibFNpemUgPSB6ZndNYXBUeERtYShkZXYsIGZyYWcuYnVmW2ldLCAmYWRkclRibCkpID09IDApCisgICAgICAgIC8veworICAgICAgICAvLyAgICBlcnIgPSBaTV9FUlJfQlVGRkVSX0RNQV9BRERSOworICAgICAgICAvLyAgICBnb3RvIHpsRXJyb3I7CisgICAgICAgIC8vfQorCisgICAgICAgIC8qIEZsdXNoIGJ1ZmZlciBvbiBjYWNoZSAqLworICAgICAgICAvL3pmd0J1ZkZsdXNoKGRldiwgZnJhZy5idWZbaV0pOworCisjaWYgMAorICAgICAgICB6bV9tc2cxX3R4KFpNX0xWXzAsICJoZWFkZXJMZW49IiwgaGVhZGVyTGVuKTsKKyAgICAgICAgem1fbXNnMV90eChaTV9MVl8wLCAic25hcExlbj0iLCBzbmFwTGVuKTsKKyAgICAgICAgem1fbXNnMV90eChaTV9MVl8wLCAibWljTGVuPSIsIG1pY0xlbik7CisgICAgICAgIHptX21zZzFfdHgoWk1fTFZfMCwgInJlbW92ZUxlbj0iLCByZW1vdmVMZW4pOworICAgICAgICB6bV9tc2cxX3R4KFpNX0xWXzAsICJhZGRyVGJsU2l6ZT0iLCBhZGRyVGJsU2l6ZSk7CisgICAgICAgIHptX21zZzFfdHgoWk1fTFZfMCwgImZyYWcuYnVmVHlwZVswXT0iLCBmcmFnLmJ1ZlR5cGVbMF0pOworI2VuZGlmCisKKyAgICAgICAgZnJhZ0xlbiA9IHpmd0J1ZkdldFNpemUoZGV2LCBmcmFnLmJ1ZltpXSk7CisgICAgICAgIGlmICgoZGFbMF0mMHgxKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICB3ZC0+Y29tbVRhbGx5LnR4VW5pY2FzdEZybSsrOworICAgICAgICAgICAgd2QtPmNvbW1UYWxseS50eFVuaWNhc3RPY3RldHMgKz0gKGZyYWdMZW4rc25hcExlbik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoKGRhWzBdJiAweDEpKQorICAgICAgICB7CisgICAgICAgICAgICB3ZC0+Y29tbVRhbGx5LnR4QnJvYWRjYXN0RnJtKys7CisgICAgICAgICAgICB3ZC0+Y29tbVRhbGx5LnR4QnJvYWRjYXN0T2N0ZXRzICs9IChmcmFnTGVuK3NuYXBMZW4pOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgd2QtPmNvbW1UYWxseS50eE11bHRpY2FzdEZybSsrOworICAgICAgICAgICAgd2QtPmNvbW1UYWxseS50eE11bHRpY2FzdE9jdGV0cyArPSAoZnJhZ0xlbitzbmFwTGVuKTsKKyAgICAgICAgfQorICAgICAgICB3ZC0+bGVkU3RydWN0LnR4VHJhZmZpYysrOworCisjaWYgMCAvL1dobyBjYXJlIHRoaXM/CisgICAgICAgIGlmICggKGkpJiYoaSA9PSAoZnJhZ051bS0xKSkgKQorICAgICAgICB7CisgICAgICAgICAgICB3ZC0+dHJhZlRhbGx5LnR4RGF0YUJ5dGVDb3VudCAtPSBtaWNMZW47CisgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgIC8qaWYgKGFnZ0NvbnRyb2wtPnRpZF9iYXcgJiYgYWdnQ29udHJvbC0+YWdnRW5hYmxlZCkgeworICAgICAgICAgICAgc3RydWN0IGJhd19oZWFkZXJfciBoZWFkZXJfcjsKKworICAgICAgICAgICAgaGVhZGVyX3IuaGVhZGVyICAgICAgPSBoZWFkZXI7CisgICAgICAgICAgICBoZWFkZXJfci5taWMgICAgICAgICA9IG1pYzsKKyAgICAgICAgICAgIGhlYWRlcl9yLnNuYXAgICAgICAgID0gc25hcDsKKyAgICAgICAgICAgIGhlYWRlcl9yLmhlYWRlckxlbiAgID0gaGVhZGVyTGVuOworICAgICAgICAgICAgaGVhZGVyX3IubWljTGVuICAgICAgPSBtaWNMZW47CisgICAgICAgICAgICBoZWFkZXJfci5zbmFwTGVuICAgICA9IHNuYXBMZW47CisgICAgICAgICAgICBoZWFkZXJfci5yZW1vdmVMZW4gICA9IHJlbW92ZUxlbjsKKyAgICAgICAgICAgIGhlYWRlcl9yLmtleUlkeCAgICAgID0ga2V5SWR4OworCisgICAgICAgICAgICBCQVctPmluc2VydChkZXYsIGJ1ZiwgdGlkX3R4LT5iYXJfc3NuID4+IDQsIGFnZ0NvbnRyb2wtPnRpZF9iYXcsIDAsICZoZWFkZXJfcik7CisgICAgICAgIH0qLworCisgICAgICAgIGlmICgoZXJyID0gemZIcFNlbmQoZGV2LCBoZWFkZXIsIGhlYWRlckxlbiwgc25hcCwgc25hcExlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWljLCBtaWNMZW4sIGZyYWcuYnVmW2ldLCByZW1vdmVMZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYWcuYnVmVHlwZVtpXSwgemNVcFRvQWNbdXAmMHg3XSwga2V5SWR4KSkgIT0gWk1fU1VDQ0VTUykKKyAgICAgICAgeworICAgICAgICAgICAgZ290byB6bEVycm9yOworICAgICAgICB9CisKKworICAgICAgICBjb250aW51ZTsKKworemxFcnJvcjoKKyAgICAgICAgaWYgKGZyYWcuYnVmVHlwZVtpXSA9PSBaTV9FWFRFUk5BTF9BTExPQ19CVUYpCisgICAgICAgIHsKKyAgICAgICAgICAgIHpmd0J1ZkZyZWUoZGV2LCBmcmFnLmJ1ZltpXSwgZXJyKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChmcmFnLmJ1ZlR5cGVbaV0gPT0gWk1fSU5URVJOQUxfQUxMT0NfQlVGKQorICAgICAgICB7CisgICAgICAgICAgICB6ZndCdWZGcmVlKGRldiwgZnJhZy5idWZbaV0sIDApOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgem1fYXNzZXJ0KDApOworICAgICAgICB9CisgICAgfSAvKiBmb3IgKGk9MDsgaTxmcmFnTnVtOyBpKyspICovCisKKyAgICByZXR1cm4gWk1fU1VDQ0VTUzsKK30KKworLyoKKyAqIHpmQWdnU2VuZEFEREJBKCkgcmVmZXJzIHpmU2VuZE1tRnJhbWUoKSBpbiBjbW0uYworICovCit1MTZfdCAgIHpmQWdnU2VuZEFkZGJhUmVxdWVzdCh6ZGV2X3QqIGRldiwgdTE2X3QgKmRzdCwgdTE2X3QgYWMsIHUxNl90IHVwKQoreworICAgIHpidWZfdCogYnVmOworICAgIC8vdTE2X3QgYWRkclRibFNpemU7CisgICAgLy9zdHJ1Y3QgenNBZGRyVGJsIGFkZHJUYmw7CisgICAgLy91MTZfdCBlcnI7CisgICAgdTE2X3Qgb2Zmc2V0ID0gMDsKKyAgICB1MTZfdCBobGVuID0gMzI7CisgICAgdTE2X3QgaGVhZGVyWygyNCsyNSsxKS8yXTsKKyAgICB1MTZfdCB2YXAgPSAwOworICAgIHUxNl90IGk7CisgICAgdThfdCBlbmNyeXB0ID0gMDsKKworICAgIC8vem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgLy96bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisKKyAgICAvKgorICAgICAqIFRCRCA6IE1heGltdW0gc2l6ZSBvZiBtYW5hZ21lbnQgZnJhbWUKKyAgICAgKi8KKyAgICBpZiAoKGJ1ZiA9IHpmd0J1ZkFsbG9jYXRlKGRldiwgMTAyNCkpID09IE5VTEwpCisgICAgeworICAgICAgICB6bV9tc2cwX21tKFpNX0xWXzAsICJBbGxvYyBtbSBidWYgRmFpbCEiKTsKKyAgICAgICAgcmV0dXJuIFpNX1NVQ0NFU1M7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBSZXNlcnZlIHJvb20gZm9yIHdsYW4gaGVhZGVyCisgICAgICovCisgICAgb2Zmc2V0ID0gaGxlbjsKKworICAgIC8qCisgICAgICogYWRkIGFkZGJhIGZyYW1lIGJvZHkKKyAgICAgKi8KKyAgICBvZmZzZXQgPSB6ZkFnZ1NldEFkZGJhRnJhbWVCb2R5KGRldiwgYnVmLCBvZmZzZXQsIGFjLCB1cCk7CisKKworICAgIHpmd0J1ZlNldFNpemUoZGV2LCBidWYsIG9mZnNldCk7CisKKyAgICAvKgorICAgICAqIENvcHkgd2xhbiBoZWFkZXIKKyAgICAgKi8KKyAgICB6ZkFnZ0dlbkFkZGJhSGVhZGVyKGRldiwgZHN0LCBoZWFkZXIsIG9mZnNldC1obGVuLCBidWYsIHZhcCwgZW5jcnlwdCk7CisgICAgZm9yIChpPTA7IGk8KGhsZW4+PjEpOyBpKyspCisgICAgeworICAgICAgICB6bXdfdHhfYnVmX3dyaXRlaChkZXYsIGJ1ZiwgaSoyLCBoZWFkZXJbaV0pOworICAgIH0KKworICAgIC8qIEdldCBidWZmZXIgRE1BIGFkZHJlc3MgKi8KKyAgICAvL2lmICgoYWRkclRibFNpemUgPSB6ZndCdWZNYXBEbWEoZGV2LCBidWYsICZhZGRyVGJsKSkgPT0gMCkKKyAgICAvL2lmICgoYWRkclRibFNpemUgPSB6ZndNYXBUeERtYShkZXYsIGJ1ZiwgJmFkZHJUYmwpKSA9PSAwKQorICAgIC8veworICAgIC8vICAgIGdvdG8gemxFcnJvcjsKKyAgICAvL30KKworICAgIC8vem1fbXNnMl9tbShaTV9MVl8yLCAib2Zmc2V0PSIsIG9mZnNldCk7CisgICAgLy96bV9tc2cyX21tKFpNX0xWXzIsICJobGVuPSIsIGhsZW4pOworICAgIC8vem1fbXNnMl9tbShaTV9MVl8yLCAiYWRkclRibFNpemU9IiwgYWRkclRibFNpemUpOworICAgIC8vem1fbXNnMl9tbShaTV9MVl8yLCAiYWRkclRibC5sZW5bMF09IiwgYWRkclRibC5sZW5bMF0pOworICAgIC8vem1fbXNnMl9tbShaTV9MVl8yLCAiYWRkclRibC5waHlzQWRkcmxbMF09IiwgYWRkclRibC5waHlzQWRkcmxbMF0pOworICAgIC8vem1fbXNnMl9tbShaTV9MVl8yLCAiYnVmLT5kYXRhPSIsIGJ1Zi0+ZGF0YSk7CisKKyAgICAjaWYgMAorICAgIGlmICgoZXJyID0gemZIcFNlbmQoZGV2LCBOVUxMLCAwLCBOVUxMLCAwLCBOVUxMLCAwLCBidWYsIDAsCisgICAgICAgICAgICBaTV9JTlRFUk5BTF9BTExPQ19CVUYsIDAsIDB4ZmYpKSAhPSBaTV9TVUNDRVNTKQorICAgIHsKKyAgICAgICAgZ290byB6bEVycm9yOworICAgIH0KKyAgICAjZWxzZQorICAgIHpmUHV0Vm1tcShkZXYsIGJ1Zik7CisgICAgemZQdXNoVnR4cShkZXYpOworICAgICNlbmRpZgorCisgICAgcmV0dXJuIFpNX1NVQ0NFU1M7CisKK30KKwordTE2X3QgICB6ZkFnZ1NldEFkZGJhRnJhbWVCb2R5KHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3Qgb2Zmc2V0LCB1MTZfdCBhYywgdTE2X3QgdXApCit7CisgICAgdTE2X3QgYmFfcGFyYW1ldGVyLCBzdGFydF9zZXE7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICAvL3ptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisgICAgLyoKKyAgICAgKiBBRERCQSBSZXF1ZXN0IGZyYW1lIGJvZHkKKyAgICAgKi8KKworICAgIC8qCisgICAgICogQ2F0ZWdvcnkKKyAgICAgKi8KKyAgICB6bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIDMpOworICAgIC8qCisgICAgICogQWN0aW9uIGRldGFpbHMgPSAwCisgICAgICovCisgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCBaTV9XTEFOX0FEREJBX1JFUVVFU1RfRlJBTUUpOworICAgIC8qCisgICAgICogRGlhbG9nIFRva2VuID0gbm9uemVybworICAgICAqIFRCRDogZGVmaW5lIGhvdyB0byBnZXQgZGlhbG9nIHRva2VuPworICAgICAqLworICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgMik7CisgICAgLyoKKyAgICAgKiBCbG9jayBBY2sgcGFyYW1ldGVyIHNldAorICAgICAqIEJBIHBvbGljeSA9IDEgZm9yIGltbWVkaWF0ZSBCQSwgMCBmb3IgZGVsYXllZCBCQQorICAgICAqIFRJRCg0Yml0cykgJiBidWZmZXIgc2l6ZSg0Yml0cykgKFRJRD11cCAmIGJ1ZmZlciBzaXplPTB4ODApCisgICAgICogVEJEOiBob3cgdG8gZ2V0IGJ1ZmZlciBzaXplPworICAgICAqIKJ6oneid6J3oneid6J3oneid6J3oneic6J3oneid6J3oneid6J3oneid6J3oneic6J3oneid6J3oneid6J3oneic6J3oneid6J3oneid6J3oneid6J3oneid6J3onsKKyAgICAgKiCieCAgICBCMCAgICCieCAgICBCMSAgICAgonggQjIgIEI1IKJ4IEI2ICAgICAgQjE1IKJ4CisgICAgICogonWid6J3oneid6J3oneid6J3oneid6Jxoneid6J3oneid6J3oneid6J3oneid6Jxoneid6J3oneid6J3oneid6Jxoneid6J3oneid6J3oneid6J3oneid6J3oneidAorICAgICAqIKJ4IFJlc2VydmVkIKJ4IEJBIHBvbGljeSCieCAgVElEICAgonggQnVmZmVyIHNpemUgongKKyAgICAgKiCifKJ3oneid6J3oneid6J3oneid6J3onKid6J3oneid6J3oneid6J3oneid6J3onKid6J3oneid6J3oneid6J3onKid6J3oneid6J3oneid6J3oneid6J3oneid6J9CisgICAgICovCisgICAgYmFfcGFyYW1ldGVyID0gMSA8PCAxMjsgICAgIC8vIGJ1ZmZlciBzaXplID0gMHg0MCg2NCkKKyAgICBiYV9wYXJhbWV0ZXIgfD0gdXAgPDwgMjsgICAgLy8gdGlkID0gdXAKKyAgICBiYV9wYXJhbWV0ZXIgfD0gMjsgICAgICAgICAgLy8gYmEgcG9saWN5ID0gMQorICAgIHptd190eF9idWZfd3JpdGVoKGRldiwgYnVmLCBvZmZzZXQsIGJhX3BhcmFtZXRlcik7CisgICAgb2Zmc2V0Kz0yOworICAgIC8qCisgICAgICogQkEgdGltZW91dCB2YWx1ZQorICAgICAqLworICAgIHptd190eF9idWZfd3JpdGVoKGRldiwgYnVmLCBvZmZzZXQsIDApOworICAgIG9mZnNldCs9MjsKKyAgICAvKgorICAgICAqIEJBIHN0YXJ0aW5nIHNlcXVlbmNlIG51bWJlcgorICAgICAqIKJ6oneid6J3oneid6J3oneid6J3oneid6J3oneic6J3oneid6J3oneid6J3oneid6J3oneid6J3oneid6J3oneid6J3oneid6J7CisgICAgICogonggQjAgICAgICAgQjMgonggQjQgICAgICAgICAgICAgIEIxNSCieAorICAgICAqIKJ1oneid6J3oneid6J3oneid6J3oneid6J3oneicaJ3oneid6J3oneid6J3oneid6J3oneid6J3oneid6J3oneid6J3oneid6J0CisgICAgICogonggRnJhZyBudW0oMCkgonggQkEgc3RhcnRpbmcgc2VxIG51bSCieAorICAgICAqIKJ8oneid6J3oneid6J3oneid6J3oneid6J3oneicqJ3oneid6J3oneid6J3oneid6J3oneid6J3oneid6J3oneid6J3oneid6J9CisgICAgICovCisgICAgc3RhcnRfc2VxID0gKCh3ZC0+c2VxW2FjXSkgPDwgNCkgJiAweEZGRjA7CisgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCwgc3RhcnRfc2VxKTsKKyAgICBvZmZzZXQrPTI7CisKKyAgICByZXR1cm4gb2Zmc2V0OworfQorCit1MTZfdCB6ZkFnZ0dlbkFkZGJhSGVhZGVyKHpkZXZfdCogZGV2LCB1MTZfdCogZHN0LAorICAgICAgICB1MTZfdCogaGVhZGVyLCB1MTZfdCBsZW4sIHpidWZfdCogYnVmLCB1MTZfdCB2YXAsIHU4X3QgZW5jcnlwdCkKK3sKKyAgICB1OF90ICBobGVuID0gMzI7ICAgICAgICAvLyBNQUMgY3RybCArIFBIWSBjdHJsICsgODAyLjExIE1NIGhlYWRlcgorICAgIC8vdThfdCBmcmFtZVR5cGUgPSBaTV9XTEFOX0ZSQU1FX1RZUEVfQUNUSU9OOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIC8qCisgICAgICogR2VuZXJhdGUgY29udHJvbCBzZXR0aW5nCisgICAgICovCisgICAgLy9ib2R5TGVuID0gemZ3QnVmR2V0U2l6ZShkZXYsIGJ1Zik7CisgICAgaGVhZGVyWzBdID0gMjQrbGVuKzQ7ICAgLy9MZW5ndGgKKyAgICBoZWFkZXJbMV0gPSAweDg7ICAgICAgICAvL01BQyBjb250cm9sLCBiYWNrb2ZmICsgKGFjaykKKworI2lmIDAKKyAgICAvKiBDQ0sgMU0gKi8KKyAgICBoZWFkZXJbMl0gPSAweDBmMDA7ICAgICAgICAgIC8vUEhZIGNvbnRyb2wgTAorICAgIGhlYWRlclszXSA9IDB4MDAwMDsgICAgICAgICAgLy9QSFkgY29udHJvbCBICisjZWxzZQorICAgIC8qIE9GRE0gNk0gKi8KKyAgICBoZWFkZXJbMl0gPSAweDBmMDE7ICAgICAgICAgIC8vUEhZIGNvbnRyb2wgTAorICAgIGhlYWRlclszXSA9IDB4MDAwQjsgICAgICAgICAgLy9QSFkgY29udHJvbCBICisjZW5kaWYKKworICAgIC8qCisgICAgICogR2VuZXJhdGUgV0xBTiBoZWFkZXIKKyAgICAgKiBGcmFtZSBjb250cm9sIGZyYW1lIHR5cGUgYW5kIHN1YnR5cGUKKyAgICAgKi8KKyAgICBoZWFkZXJbNCswXSA9IFpNX1dMQU5fRlJBTUVfVFlQRV9BQ1RJT047CisgICAgLyoKKyAgICAgKiBEdXJhdGlvbgorICAgICAqLworICAgIGhlYWRlcls0KzFdID0gMDsKKworICAgIGlmICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9JTkZSQVNUUlVDVFVSRSkKKyAgICB7CisgICAgICAgIGhlYWRlcls0KzhdID0gd2QtPnN0YS5ic3NpZFswXTsKKyAgICAgICAgaGVhZGVyWzQrOV0gPSB3ZC0+c3RhLmJzc2lkWzFdOworICAgICAgICBoZWFkZXJbNCsxMF0gPSB3ZC0+c3RhLmJzc2lkWzJdOworICAgIH0KKyAgICBlbHNlIGlmICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9QU0VVRE8pCisgICAgeworICAgICAgICAvKiBBZGRyZXNzIDMgPSAwMDowMDowMDowMDowMDowMCAqLworICAgICAgICBoZWFkZXJbNCs4XSA9IDA7CisgICAgICAgIGhlYWRlcls0KzldID0gMDsKKyAgICAgICAgaGVhZGVyWzQrMTBdID0gMDsKKyAgICB9CisgICAgZWxzZSBpZiAod2QtPndsYW5Nb2RlID09IFpNX01PREVfSUJTUykKKyAgICB7CisgICAgICAgIGhlYWRlcls0KzhdID0gd2QtPnN0YS5ic3NpZFswXTsKKyAgICAgICAgaGVhZGVyWzQrOV0gPSB3ZC0+c3RhLmJzc2lkWzFdOworICAgICAgICBoZWFkZXJbNCsxMF0gPSB3ZC0+c3RhLmJzc2lkWzJdOworICAgIH0KKyAgICBlbHNlIGlmICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9BUCkKKyAgICB7CisgICAgICAgIC8qIEFkZHJlc3MgMyA9IEJTU0lEICovCisgICAgICAgIGhlYWRlcls0KzhdID0gd2QtPm1hY0FkZHJbMF07CisgICAgICAgIGhlYWRlcls0KzldID0gd2QtPm1hY0FkZHJbMV07CisgICAgICAgIGhlYWRlcls0KzEwXSA9IHdkLT5tYWNBZGRyWzJdICsgKHZhcDw8OCk7CisgICAgfQorCisgICAgLyogQWRkcmVzcyAxID0gREEgKi8KKyAgICBoZWFkZXJbNCsyXSA9IGRzdFswXTsKKyAgICBoZWFkZXJbNCszXSA9IGRzdFsxXTsKKyAgICBoZWFkZXJbNCs0XSA9IGRzdFsyXTsKKworICAgIC8qIEFkZHJlc3MgMiA9IFNBICovCisgICAgaGVhZGVyWzQrNV0gPSB3ZC0+bWFjQWRkclswXTsKKyAgICBoZWFkZXJbNCs2XSA9IHdkLT5tYWNBZGRyWzFdOworICAgIGlmICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9BUCkKKyAgICB7CisgICAgICAgIGhlYWRlcls0KzddID0gd2QtPm1hY0FkZHJbMl0gKyAodmFwPDw4KTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaGVhZGVyWzQrN10gPSB3ZC0+bWFjQWRkclsyXTsKKyAgICB9CisKKyAgICAvKiBTZXF1ZW5jZSBDb250cm9sICovCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICBoZWFkZXJbNCsxMV0gPSAoKHdkLT5tbXNlcSsrKTw8NCk7CisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworCisgICAgcmV0dXJuIGhsZW47Cit9CisKKwordTE2X3QgICB6ZkFnZ1Byb2Nlc3NBY3Rpb24oemRldl90KiBkZXYsIHpidWZfdCogYnVmKQoreworICAgIHUxNl90IGNhdGVnb3J5OworCisgICAgLy96bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICAvL3ptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICBjYXRlZ29yeSA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIDI0KTsKKworICAgIHN3aXRjaCAoY2F0ZWdvcnkpCisgICAgeworICAgIGNhc2UgWk1fV0xBTl9CTE9DS19BQ0tfQUNUSU9OX0ZSQU1FOgorICAgICAgICB6ZkFnZ0Jsb2NrQWNrQWN0aW9uRnJhbWUoZGV2LCBidWYpOworICAgICAgICBicmVhazsKKworICAgIH0KKworICAgIHJldHVybiBaTV9TVUNDRVNTOworfQorCisKK3UxNl90ICAgemZBZ2dCbG9ja0Fja0FjdGlvbkZyYW1lKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZikKK3sKKyAgICB1OF90IGFjdGlvbjsKKworICAgIC8vem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgLy96bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgYWN0aW9uID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgMjUpOworI2lmZGVmIFpNX0VOQUJMRV9BR0dSRUdBVElPTgorICAgIHN3aXRjaCAoYWN0aW9uKQorICAgIHsKKyAgICBjYXNlIFpNX1dMQU5fQUREQkFfUkVRVUVTVF9GUkFNRToKKyAgICAgICAgem1fbXNnMF9hZ2coWk1fTFZfMCwgIlJlY2VpdmVkIEJBIEFjdGlvbiBmcmFtZSBpcyBBRERCQSByZXF1ZXN0Iik7CisgICAgICAgIHpmQWdnUmVjdkFkZGJhUmVxdWVzdChkZXYsIGJ1Zik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgWk1fV0xBTl9BRERCQV9SRVNQT05TRV9GUkFNRToKKyAgICAgICAgem1fbXNnMF9hZ2coWk1fTFZfMCwgIlJlY2VpdmVkIEJBIEFjdGlvbiBmcmFtZSBpcyBBRERCQSByZXNwb25zZSIpOworICAgICAgICB6ZkFnZ1JlY3ZBZGRiYVJlc3BvbnNlKGRldiwgYnVmKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBaTV9XTEFOX0RFTEJBX0ZSQU1FOgorICAgICAgICB6ZkFnZ1JlY3ZEZWxiYShkZXYsIGJ1Zik7CisgICAgICAgIGJyZWFrOworICAgIH0KKyNlbmRpZgorICAgIHJldHVybiBaTV9TVUNDRVNTOworfQorCit1MTZfdCAgIHpmQWdnUmVjdkFkZGJhUmVxdWVzdCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpCit7CisgICAgLy91MTZfdCBkaWFsb2c7CisgICAgc3RydWN0IGFnZ0JhRnJhbWVQYXJhbWV0ZXIgYmY7CisgICAgdTE2X3QgaTsKKyAgICAvL3ptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIC8vem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIGJmLmJ1ZiA9IGJ1ZjsKKyAgICBiZi5kaWFsb2cgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCAyNik7CisgICAgLyoKKyAgICAgKiBiYSBwYXJhbWV0ZXIgc2V0CisgICAgICovCisgICAgYmYuYmFfcGFyYW1ldGVyID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMjcpOworICAgIGJmLmJhX3BvbGljeSAgID0gKGJmLmJhX3BhcmFtZXRlciA+PiAxKSAmIDE7CisgICAgYmYudGlkICAgICAgICAgPSAoYmYuYmFfcGFyYW1ldGVyID4+IDIpICYgMHhGOworICAgIGJmLmJ1ZmZlcl9zaXplID0gKGJmLmJhX3BhcmFtZXRlciA+PiA2KTsKKyAgICAvKgorICAgICAqIEJBIHRpbWVvdXQgdmFsdWUKKyAgICAgKi8KKyAgICBiZi5iYV90aW1lb3V0ID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMjkpOworICAgIC8qCisgICAgICogQkEgc3RhcnRpbmcgc2VxdWVuY2UgbnVtYmVyCisgICAgICovCisgICAgYmYuYmFfc3RhcnRfc2VxID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMzEpID4+IDQ7CisKKyAgICBpPTI2OworICAgIHdoaWxlKGkgPCAzMikgeworICAgICAgICB6bV9kZWJ1Z19tc2cyKCJSZWN2IEFEREJBIFJlcToiLCB6bXdfcnhfYnVmX3JlYWRiKGRldixidWYsaSkpOworICAgICAgICBpKys7CisgICAgfQorCisgICAgemZBZ2dTZW5kQWRkYmFSZXNwb25zZShkZXYsICZiZik7CisKKyAgICB6ZkFnZ0FkZGJhU2V0VGlkUngoZGV2LCBidWYsICZiZik7CisKKyAgICByZXR1cm4gWk1fU1VDQ0VTUzsKK30KKwordTE2X3QgICB6ZkFnZ0FkZGJhU2V0VGlkUngoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCBzdHJ1Y3QgYWdnQmFGcmFtZVBhcmFtZXRlciAqYmYpCit7CisgICAgdTE2X3QgaSwgYWMsIGFpZCwgZnJhZ09mZjsKKyAgICB1MTZfdCBzcmNbM107CisgICAgdTE2X3Qgb2Zmc2V0ID0gMDsKKyAgICB1OF90ICB1cDsKKyAgICBzdHJ1Y3QgYWdnX3RpZF9yeCAqdGlkX3J4ID0gTlVMTDsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICBzcmNbMF0gPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCBvZmZzZXQrMTApOworICAgIHNyY1sxXSA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIG9mZnNldCsxMik7CisgICAgc3JjWzJdID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1Ziwgb2Zmc2V0KzE0KTsKKyAgICBhaWQgPSB6ZkFwRmluZFN0YShkZXYsIHNyYyk7CisKKyAgICB6ZlR4R2V0SXBUb3NBbmRGcmFnKGRldiwgYnVmLCAmdXAsICZmcmFnT2ZmKTsKKyAgICBhYyA9IHpjVXBUb0FjW3VwJjB4N10gJiAweDM7CisKKyAgICBhYyA9IGJmLT50aWQ7CisKKyAgICBmb3IgKGk9MDsgaTxaTV9BR0dfUE9PTF9TSVpFIDsgaSsrKQorICAgIHsKKyAgICAgICAgaWYoKHdkLT50aWRfcnhbaV0tPmFpZCA9PSBhaWQpICYmICh3ZC0+dGlkX3J4W2ldLT5hYyA9PSBhYykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRpZF9yeCA9IHdkLT50aWRfcnhbaV07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghdGlkX3J4KQorICAgIHsKKyAgICAgICAgZm9yIChpPTA7IGk8Wk1fQUdHX1BPT0xfU0laRTsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAod2QtPnRpZF9yeFtpXS0+YWlkID09IFpNX01BWF9TVEFfU1VQUE9SVCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aWRfcnggPSB3ZC0+dGlkX3J4W2ldOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghdGlkX3J4KQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIHRpZF9yeC0+YWlkID0gYWlkOworICAgIHRpZF9yeC0+YWMgPSBhYzsKKyAgICB0aWRfcngtPmFkZEJhRXhjaGFuZ2VTdGF0dXNDb2RlID0gWk1fQUdHX0FEREJBX1JFU1BPTlNFOworICAgIHRpZF9yeC0+c2VxX3N0YXJ0ID0gYmYtPmJhX3N0YXJ0X3NlcTsKKyAgICB0aWRfcngtPmJhd19oZWFkID0gdGlkX3J4LT5iYXdfdGFpbCA9IDA7CisgICAgdGlkX3J4LT5zcV9leGNlZWRfY291bnQgPSB0aWRfcngtPnNxX2JlaGluZF9jb3VudCA9IDA7CisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIHJldHVybiAwOworfQorCit1MTZfdCAgIHpmQWdnUmVjdkFkZGJhUmVzcG9uc2UoemRldl90KiBkZXYsIHpidWZfdCogYnVmKQoreworICAgIHUxNl90IGksYWMsIGFpZD0wOworICAgIHUxNl90IHNyY1szXTsKKyAgICBzdHJ1Y3QgYWdnQmFGcmFtZVBhcmFtZXRlciBiZjsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIC8vem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHNyY1swXSA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIDEwKTsKKyAgICBzcmNbMV0gPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCAxMik7CisgICAgc3JjWzJdID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMTQpOworCisgICAgaWYgKHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0FQKQorICAgICAgICBhaWQgPSB6ZkFwRmluZFN0YShkZXYsIHNyYyk7CisKKworICAgIGJmLmJ1ZiA9IGJ1ZjsKKyAgICBiZi5kaWFsb2cgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCAyNik7CisgICAgYmYuc3RhdHVzX2NvZGUgPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCAyNyk7CisgICAgaWYgKCFiZi5zdGF0dXNfY29kZSkKKyAgICB7CisgICAgICAgIHdkLT5hZGRiYUNvbXBsZXRlPTE7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBiYSBwYXJhbWV0ZXIgc2V0CisgICAgICovCisgICAgYmYuYmFfcGFyYW1ldGVyID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMjkpOworICAgIGJmLmJhX3BvbGljeSAgID0gKGJmLmJhX3BhcmFtZXRlciA+PiAxKSAmIDE7CisgICAgYmYudGlkICAgICAgICAgPSAoYmYuYmFfcGFyYW1ldGVyID4+IDIpICYgMHhGOworICAgIGJmLmJ1ZmZlcl9zaXplID0gKGJmLmJhX3BhcmFtZXRlciA+PiA2KTsKKyAgICAvKgorICAgICAqIEJBIHRpbWVvdXQgdmFsdWUKKyAgICAgKi8KKyAgICBiZi5iYV90aW1lb3V0ID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMzEpOworCisgICAgaT0yNjsKKyAgICB3aGlsZShpIDwgMzIpIHsKKyAgICAgICAgem1fZGVidWdfbXNnMigiUmVjdiBBRERCQSBSc3A6Iiwgem13X3J4X2J1Zl9yZWFkYihkZXYsYnVmLGkpKTsKKyAgICAgICAgaSsrOworICAgIH0KKworICAgIGFjID0gemNVcFRvQWNbYmYudGlkJjB4N10gJiAweDM7CisKKyAgICAvL3ptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICAvL3dkLT5hZ2dTdGFbYWlkXS5hZ2dGbGFnW2FjXSA9IDA7CisKKyAgICAvL3ptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICByZXR1cm4gWk1fU1VDQ0VTUzsKK30KKwordTE2X3QgICB6ZkFnZ1JlY3ZEZWxiYSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpCit7CisgICAgLy96bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICAvL3ptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisgICAgcmV0dXJuIFpNX1NVQ0NFU1M7Cit9CisKK3UxNl90ICAgemZBZ2dTZW5kQWRkYmFSZXNwb25zZSh6ZGV2X3QqIGRldiwgc3RydWN0IGFnZ0JhRnJhbWVQYXJhbWV0ZXIgKmJmKQoreworICAgIHpidWZfdCogYnVmOworICAgIC8vdTE2X3QgYWRkclRibFNpemU7CisgICAgLy9zdHJ1Y3QgenNBZGRyVGJsIGFkZHJUYmw7CisgICAgLy91MTZfdCBlcnI7CisgICAgdTE2X3Qgb2Zmc2V0ID0gMDsKKyAgICB1MTZfdCBobGVuID0gMzI7CisgICAgdTE2X3QgaGVhZGVyWygyNCsyNSsxKS8yXTsKKyAgICB1MTZfdCB2YXAgPSAwOworICAgIHUxNl90IGk7CisgICAgdThfdCBlbmNyeXB0ID0gMDsKKyAgICB1MTZfdCBkc3RbM107CisKKyAgICAvL3ptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIC8vem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworCisgICAgLyoKKyAgICAgKiBUQkQgOiBNYXhpbXVtIHNpemUgb2YgbWFuYWdtZW50IGZyYW1lCisgICAgICovCisgICAgaWYgKChidWYgPSB6ZndCdWZBbGxvY2F0ZShkZXYsIDEwMjQpKSA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgem1fbXNnMF9tbShaTV9MVl8wLCAiQWxsb2MgbW0gYnVmIEZhaWwhIik7CisgICAgICAgIHJldHVybiBaTV9TVUNDRVNTOworICAgIH0KKworICAgIC8qCisgICAgICogUmVzZXJ2ZSByb29tIGZvciB3bGFuIGhlYWRlcgorICAgICAqLworICAgIG9mZnNldCA9IGhsZW47CisKKyAgICAvKgorICAgICAqIGFkZCBhZGRiYSBmcmFtZSBib2R5CisgICAgICovCisgICAgb2Zmc2V0ID0gemZBZ2dTZXRBZGRiYVJlc3BvbnNlRnJhbWVCb2R5KGRldiwgYnVmLCBiZiwgb2Zmc2V0KTsKKworCisgICAgemZ3QnVmU2V0U2l6ZShkZXYsIGJ1Ziwgb2Zmc2V0KTsKKworICAgIC8qCisgICAgICogQ29weSB3bGFuIGhlYWRlcgorICAgICAqLworCisgICAgZHN0WzBdID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJmLT5idWYsIDEwKTsKKyAgICBkc3RbMV0gPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYmYtPmJ1ZiwgMTIpOworICAgIGRzdFsyXSA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBiZi0+YnVmLCAxNCk7CisgICAgemZBZ2dHZW5BZGRiYUhlYWRlcihkZXYsIGRzdCwgaGVhZGVyLCBvZmZzZXQtaGxlbiwgYnVmLCB2YXAsIGVuY3J5cHQpOworICAgIGZvciAoaT0wOyBpPChobGVuPj4xKTsgaSsrKQorICAgIHsKKyAgICAgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIGkqMiwgaGVhZGVyW2ldKTsKKyAgICB9CisKKyAgICAvKiBHZXQgYnVmZmVyIERNQSBhZGRyZXNzICovCisgICAgLy9pZiAoKGFkZHJUYmxTaXplID0gemZ3QnVmTWFwRG1hKGRldiwgYnVmLCAmYWRkclRibCkpID09IDApCisgICAgLy9pZiAoKGFkZHJUYmxTaXplID0gemZ3TWFwVHhEbWEoZGV2LCBidWYsICZhZGRyVGJsKSkgPT0gMCkKKyAgICAvL3sKKyAgICAvLyAgICBnb3RvIHpsRXJyb3I7CisgICAgLy99CisKKyAgICAvL3ptX21zZzJfbW0oWk1fTFZfMiwgIm9mZnNldD0iLCBvZmZzZXQpOworICAgIC8vem1fbXNnMl9tbShaTV9MVl8yLCAiaGxlbj0iLCBobGVuKTsKKyAgICAvL3ptX21zZzJfbW0oWk1fTFZfMiwgImFkZHJUYmxTaXplPSIsIGFkZHJUYmxTaXplKTsKKyAgICAvL3ptX21zZzJfbW0oWk1fTFZfMiwgImFkZHJUYmwubGVuWzBdPSIsIGFkZHJUYmwubGVuWzBdKTsKKyAgICAvL3ptX21zZzJfbW0oWk1fTFZfMiwgImFkZHJUYmwucGh5c0FkZHJsWzBdPSIsIGFkZHJUYmwucGh5c0FkZHJsWzBdKTsKKyAgICAvL3ptX21zZzJfbW0oWk1fTFZfMiwgImJ1Zi0+ZGF0YT0iLCBidWYtPmRhdGEpOworCisgICAgI2lmIDAKKyAgICBpZiAoKGVyciA9IHpmSHBTZW5kKGRldiwgTlVMTCwgMCwgTlVMTCwgMCwgTlVMTCwgMCwgYnVmLCAwLAorICAgICAgICAgICAgWk1fSU5URVJOQUxfQUxMT0NfQlVGLCAwLCAweGZmKSkgIT0gWk1fU1VDQ0VTUykKKyAgICB7CisgICAgICAgIGdvdG8gemxFcnJvcjsKKyAgICB9CisgICAgI2Vsc2UKKyAgICB6ZlB1dFZtbXEoZGV2LCBidWYpOworICAgIHpmUHVzaFZ0eHEoZGV2KTsKKyAgICAjZW5kaWYKKworICAgIC8vemZBZ2dTZW5kQWRkYmFSZXF1ZXN0KGRldiwgZHN0LCB6Y1VwVG9BY1tiZi0+dGlkJjB4N10gJiAweDMsIGJmLT50aWQpOworICAgIHJldHVybiBaTV9TVUNDRVNTOworCit9CisKK3UxNl90ICAgemZBZ2dTZXRBZGRiYVJlc3BvbnNlRnJhbWVCb2R5KHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgYWdnQmFGcmFtZVBhcmFtZXRlciAqYmYsIHUxNl90IG9mZnNldCkKK3sKKworICAgIC8vem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgLy96bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworICAgIC8qCisgICAgICogQUREQkEgUmVxdWVzdCBmcmFtZSBib2R5CisgICAgICovCisKKyAgICAvKgorICAgICAqIENhdGVnb3J5CisgICAgICovCisgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCAzKTsKKyAgICAvKgorICAgICAqIEFjdGlvbiBkZXRhaWxzID0gMAorICAgICAqLworICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgWk1fV0xBTl9BRERCQV9SRVNQT05TRV9GUkFNRSk7CisgICAgLyoKKyAgICAgKiBEaWFsb2cgVG9rZW4gPSBub256ZXJvCisgICAgICovCisgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCBiZi0+ZGlhbG9nKTsKKyAgICAvKgorICAgICAqIFN0YXR1cyBjb2RlCisgICAgICovCisgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCwgMCk7CisgICAgb2Zmc2V0Kz0yOworICAgIC8qCisgICAgICogQmxvY2sgQWNrIHBhcmFtZXRlciBzZXQKKyAgICAgKiBCQSBwb2xpY3kgPSAxIGZvciBpbW1lZGlhdGUgQkEsIDAgZm9yIGRlbGF5ZWQgQkEKKyAgICAgKiBUSUQoNGJpdHMpICYgYnVmZmVyIHNpemUoNGJpdHMpIChUSUQ9MHgxICYgYnVmZmVyIHNpemU9MHg4MCkKKyAgICAgKiBUQkQ6IGhvdyB0byBnZXQgVElEIG51bWJlciBhbmQgYnVmZmVyIHNpemU/CisgICAgICogonqid6J3oneid6J3oneid6J3oneid6Jzoneid6J3oneid6J3oneid6J3oneid6Jzoneid6J3oneid6J3oneid6Jzoneid6J3oneid6J3oneid6J3oneid6J3oneieworICAgICAqIKJ4ICAgIEIwICAgIKJ4ICAgIEIxICAgICCieCBCMiAgQjUgonggQjYgICAgICBCMTUgongKKyAgICAgKiCidaJ3oneid6J3oneid6J3oneid6J3onGid6J3oneid6J3oneid6J3oneid6J3onGid6J3oneid6J3oneid6J3onGid6J3oneid6J3oneid6J3oneid6J3oneid6J0CisgICAgICogonggUmVzZXJ2ZWQgonggQkEgcG9saWN5IKJ4ICBUSUQgICCieCBCdWZmZXIgc2l6ZSCieAorICAgICAqIKJ8oneid6J3oneid6J3oneid6J3oneicqJ3oneid6J3oneid6J3oneid6J3oneicqJ3oneid6J3oneid6J3oneicqJ3oneid6J3oneid6J3oneid6J3oneid6J3on0KKyAgICAgKi8KKyAgICB6bXdfdHhfYnVmX3dyaXRlaChkZXYsIGJ1Ziwgb2Zmc2V0LCBiZi0+YmFfcGFyYW1ldGVyKTsKKyAgICBvZmZzZXQrPTI7CisgICAgLyoKKyAgICAgKiBCQSB0aW1lb3V0IHZhbHVlCisgICAgICovCisgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCwgYmYtPmJhX3RpbWVvdXQpOworICAgIG9mZnNldCs9MjsKKworICAgIHJldHVybiBvZmZzZXQ7Cit9CisKK3ZvaWQgICB6ZkFnZ0ludm9rZUJhcih6ZGV2X3QqIGRldiwgVElEX1RYIHRpZF90eCkKK3sKKyAgICBzdHJ1Y3QgYWdnQmFyQ29udHJvbCBhZ2dCYXJDb250cm9sOworICAgIC8vem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgLy96bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworICAgIC8vYmFyX2NvbnRyb2wgPSBhZ2dCYXJDb250cm9sLT50aWRfaW5mbyA8PCAxMiB8IGFnZ0JhckNvbnRyb2wtPmNvbXByZXNzZWRfYml0bWFwIDw8IDIKKyAgICAvLyAgICAgICAgfCBhZ2dCYXJDb250cm9sLT5tdWx0aV90aWQgPDwgMSB8IGFnZ0JhckNvbnRyb2wtPmJhcl9hY2tfcG9saWN5OworICAgIGFnZ0JhckNvbnRyb2wuYmFyX2Fja19wb2xpY3kgPSAwOworICAgIGFnZ0JhckNvbnRyb2wubXVsdGlfdGlkID0gMDsKKyAgICBhZ2dCYXJDb250cm9sLmNvbXByZXNzZWRfYml0bWFwID0gMDsKKyAgICBhZ2dCYXJDb250cm9sLnRpZF9pbmZvID0gdGlkX3R4LT50aWQ7CisgICAgemZBZ2dTZW5kQmFyKGRldiwgdGlkX3R4LCAmYWdnQmFyQ29udHJvbCk7CisKKyAgICByZXR1cm47CisKK30KKy8qCisgKiB6ZkFnZ1NlbmRCYXIoKSByZWZlcnMgemZBZ2dTZW5kQWRkYmFSZXF1ZXN0KCkKKyAqLwordTE2X3QgICB6ZkFnZ1NlbmRCYXIoemRldl90KiBkZXYsIFRJRF9UWCB0aWRfdHgsIHN0cnVjdCBhZ2dCYXJDb250cm9sICphZ2dCYXJDb250cm9sKQoreworICAgIHpidWZfdCogYnVmOworICAgIC8vdTE2X3QgYWRkclRibFNpemU7CisgICAgLy9zdHJ1Y3QgenNBZGRyVGJsIGFkZHJUYmw7CisgICAgLy91MTZfdCBlcnI7CisgICAgdTE2X3Qgb2Zmc2V0ID0gMDsKKyAgICB1MTZfdCBobGVuID0gMTYrODsgIC8qIG1hYyBoZWFkZXIgKyBjb250cm9sIGhlYWRlcnMqLworICAgIHUxNl90IGhlYWRlclsoOCsyNCsxKS8yXTsKKyAgICB1MTZfdCB2YXAgPSAwOworICAgIHUxNl90IGk7CisgICAgdThfdCBlbmNyeXB0ID0gMDsKKworICAgIC8vem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgLy96bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisKKyAgICAvKgorICAgICAqIFRCRCA6IE1heGltdW0gc2l6ZSBvZiBtYW5hZ21lbnQgZnJhbWUKKyAgICAgKi8KKyAgICBpZiAoKGJ1ZiA9IHpmd0J1ZkFsbG9jYXRlKGRldiwgMTAyNCkpID09IE5VTEwpCisgICAgeworICAgICAgICB6bV9tc2cwX21tKFpNX0xWXzAsICJBbGxvYyBtbSBidWYgRmFpbCEiKTsKKyAgICAgICAgcmV0dXJuIFpNX1NVQ0NFU1M7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBSZXNlcnZlIHJvb20gZm9yIHdsYW4gaGVhZGVyCisgICAgICovCisgICAgb2Zmc2V0ID0gaGxlbjsKKworICAgIC8qCisgICAgICogYWRkIGFkZGJhIGZyYW1lIGJvZHkKKyAgICAgKi8KKyAgICBvZmZzZXQgPSB6ZkFnZ1NldEJhckJvZHkoZGV2LCBidWYsIG9mZnNldCwgdGlkX3R4LCBhZ2dCYXJDb250cm9sKTsKKworCisgICAgemZ3QnVmU2V0U2l6ZShkZXYsIGJ1Ziwgb2Zmc2V0KTsKKworICAgIC8qCisgICAgICogQ29weSB3bGFuIGhlYWRlcgorICAgICAqLworICAgIHpmQWdnR2VuQmFySGVhZGVyKGRldiwgdGlkX3R4LT5kc3QsIGhlYWRlciwgb2Zmc2V0LWhsZW4sIGJ1ZiwgdmFwLCBlbmNyeXB0KTsKKyAgICBmb3IgKGk9MDsgaTwoaGxlbj4+MSk7IGkrKykKKyAgICB7CisgICAgICAgIHptd190eF9idWZfd3JpdGVoKGRldiwgYnVmLCBpKjIsIGhlYWRlcltpXSk7CisgICAgfQorCisgICAgLyogR2V0IGJ1ZmZlciBETUEgYWRkcmVzcyAqLworICAgIC8vaWYgKChhZGRyVGJsU2l6ZSA9IHpmd0J1Zk1hcERtYShkZXYsIGJ1ZiwgJmFkZHJUYmwpKSA9PSAwKQorICAgIC8vaWYgKChhZGRyVGJsU2l6ZSA9IHpmd01hcFR4RG1hKGRldiwgYnVmLCAmYWRkclRibCkpID09IDApCisgICAgLy97CisgICAgLy8gICAgZ290byB6bEVycm9yOworICAgIC8vfQorCisgICAgLy96bV9tc2cyX21tKFpNX0xWXzIsICJvZmZzZXQ9Iiwgb2Zmc2V0KTsKKyAgICAvL3ptX21zZzJfbW0oWk1fTFZfMiwgImhsZW49IiwgaGxlbik7CisgICAgLy96bV9tc2cyX21tKFpNX0xWXzIsICJhZGRyVGJsU2l6ZT0iLCBhZGRyVGJsU2l6ZSk7CisgICAgLy96bV9tc2cyX21tKFpNX0xWXzIsICJhZGRyVGJsLmxlblswXT0iLCBhZGRyVGJsLmxlblswXSk7CisgICAgLy96bV9tc2cyX21tKFpNX0xWXzIsICJhZGRyVGJsLnBoeXNBZGRybFswXT0iLCBhZGRyVGJsLnBoeXNBZGRybFswXSk7CisgICAgLy96bV9tc2cyX21tKFpNX0xWXzIsICJidWYtPmRhdGE9IiwgYnVmLT5kYXRhKTsKKworICAgICNpZiAwCisgICAgaWYgKChlcnIgPSB6ZkhwU2VuZChkZXYsIE5VTEwsIDAsIE5VTEwsIDAsIE5VTEwsIDAsIGJ1ZiwgMCwKKyAgICAgICAgICAgIFpNX0lOVEVSTkFMX0FMTE9DX0JVRiwgMCwgMHhmZikpICE9IFpNX1NVQ0NFU1MpCisgICAgeworICAgICAgICBnb3RvIHpsRXJyb3I7CisgICAgfQorICAgICNlbHNlCisgICAgemZQdXRWbW1xKGRldiwgYnVmKTsKKyAgICB6ZlB1c2hWdHhxKGRldik7CisgICAgI2VuZGlmCisKKyAgICByZXR1cm4gWk1fU1VDQ0VTUzsKKworfQorCit1MTZfdCAgIHpmQWdnU2V0QmFyQm9keSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IG9mZnNldCwgVElEX1RYIHRpZF90eCwgc3RydWN0IGFnZ0JhckNvbnRyb2wgKmFnZ0JhckNvbnRyb2wpCit7CisgICAgdTE2X3QgYmFyX2NvbnRyb2wsIHN0YXJ0X3NlcTsKKworICAgIC8vem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgLy96bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworICAgIC8qCisgICAgICogQkFSIENvbnRyb2wgZnJhbWUgYm9keQorICAgICAqLworCisgICAgLyoKKyAgICAgKiBCQVIgQ29udHJvbCBGaWVsZAorICAgICAqIKJ6oneid6J3oneid6J3oneid6J3onOid6J3oneid6J3oneid6J3oneid6J3onOid6J3oneid6J3oneid6J3oneid6J3oneic6J3oneid6J3oneid6J3oneid6J3onOid6J3oneid6J3oneid6J3oneid6J7CisgICAgICogonggICAgQjAgICCieCAgICBCMSAgICAgonggICAgIEIyICAgICCieCBCMyAgIEIxMSCieCBCMTIgIEIxNSCieAorICAgICAqIKJ1oneid6J3oneid6J3oneid6J3onGid6J3oneid6J3oneid6J3oneid6J3onGid6J3oneid6J3oneid6J3oneid6J3oneicaJ3oneid6J3oneid6J3oneid6J3onGid6J3oneid6J3oneid6J3oneid6J0CisgICAgICogonggQkFSIEFjayCieCBNdWx0aS1USUQgonggQ29tcHJlc3NlZCCieCBSZXNlcnZlZCCieCBUSURfSU5GTyCieAorICAgICAqIKJ4ICBQb2xpY3kgonggICAgICAgICAgIKJ4ICAgQml0bWFwICAgonggICAgICAgICAgonggICAgICAgICAgongKKyAgICAgKiCifKJ3oneid6J3oneid6J3oneid6Jyoneid6J3oneid6J3oneid6J3oneid6Jyoneid6J3oneid6J3oneid6J3oneid6J3onKid6J3oneid6J3oneid6J3oneid6Jyoneid6J3oneid6J3oneid6J3oneifQorICAgICAqLworICAgIGJhcl9jb250cm9sID0gYWdnQmFyQ29udHJvbC0+dGlkX2luZm8gPDwgMTIgfCBhZ2dCYXJDb250cm9sLT5jb21wcmVzc2VkX2JpdG1hcCA8PCAyCisgICAgICAgICAgICB8IGFnZ0JhckNvbnRyb2wtPm11bHRpX3RpZCA8PCAxIHwgYWdnQmFyQ29udHJvbC0+YmFyX2Fja19wb2xpY3k7CisKKyAgICB6bXdfdHhfYnVmX3dyaXRlaChkZXYsIGJ1Ziwgb2Zmc2V0LCBiYXJfY29udHJvbCk7CisgICAgb2Zmc2V0Kz0yOworICAgIGlmICgwID09IGFnZ0JhckNvbnRyb2wtPm11bHRpX3RpZCkgeworICAgICAgICAvKgorICAgICAgICAgKiBCQSBzdGFydGluZyBzZXF1ZW5jZSBudW1iZXIKKyAgICAgICAgICogonqid6J3oneid6J3oneid6J3oneid6J3oneid6Jzoneid6J3oneid6J3oneid6J3oneid6J3oneid6J3oneid6J3oneid6J3onsKKyAgICAgICAgICogonggQjAgICAgICAgQjMgonggQjQgICAgICAgICAgICAgIEIxNSCieAorICAgICAgICAgKiCidaJ3oneid6J3oneid6J3oneid6J3oneid6J3onGid6J3oneid6J3oneid6J3oneid6J3oneid6J3oneid6J3oneid6J3oneidAorICAgICAgICAgKiCieCBGcmFnIG51bSgwKSCieCBCQSBzdGFydGluZyBzZXEgbnVtIKJ4CisgICAgICAgICAqIKJ8oneid6J3oneid6J3oneid6J3oneid6J3oneicqJ3oneid6J3oneid6J3oneid6J3oneid6J3oneid6J3oneid6J3oneid6J9CisgICAgICAgICAqLworICAgICAgICBzdGFydF9zZXEgPSAodGlkX3R4LT5iYXJfc3NuIDw8IDQpICYgMHhGRkYwOworICAgICAgICB6bXdfdHhfYnVmX3dyaXRlaChkZXYsIGJ1Ziwgb2Zmc2V0LCBzdGFydF9zZXEpOworICAgICAgICBvZmZzZXQrPTI7CisgICAgfQorICAgIGlmICgxID09IGFnZ0JhckNvbnRyb2wtPm11bHRpX3RpZCAmJiAxID09IGFnZ0JhckNvbnRyb2wtPmNvbXByZXNzZWRfYml0bWFwKSB7CisgICAgICAgIC8qIG11bHRpLXRpZCBCbG9ja0Fja1JlcSB2YXJpYW50LCBub3QgaW1wbGVtZW50ZWQqLworICAgIH0KKworICAgIHJldHVybiBvZmZzZXQ7Cit9CisKK3UxNl90IHpmQWdnR2VuQmFySGVhZGVyKHpkZXZfdCogZGV2LCB1MTZfdCogZHN0LAorICAgICAgICB1MTZfdCogaGVhZGVyLCB1MTZfdCBsZW4sIHpidWZfdCogYnVmLCB1MTZfdCB2YXAsIHU4X3QgZW5jcnlwdCkKK3sKKyAgICB1OF90ICBobGVuID0gMTYrODsgICAgICAgIC8vIE1BQyBjdHJsICsgUEhZIGN0cmwgKyA4MDIuMTEgTU0gaGVhZGVyCisgICAgLy91OF90IGZyYW1lVHlwZSA9IFpNX1dMQU5fRlJBTUVfVFlQRV9BQ1RJT047CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgLyoKKyAgICAgKiBHZW5lcmF0ZSBjb250cm9sIHNldHRpbmcKKyAgICAgKi8KKyAgICAvL2JvZHlMZW4gPSB6ZndCdWZHZXRTaXplKGRldiwgYnVmKTsKKyAgICBoZWFkZXJbMF0gPSAxNitsZW4rNDsgICAvL0xlbmd0aAorICAgIGhlYWRlclsxXSA9IDB4ODsgICAgICAgIC8vTUFDIGNvbnRyb2wsIGJhY2tvZmYgKyAoYWNrKQorCisjaWYgMQorICAgIC8qIENDSyAxTSAqLworICAgIGhlYWRlclsyXSA9IDB4MGYwMDsgICAgICAgICAgLy9QSFkgY29udHJvbCBMCisgICAgaGVhZGVyWzNdID0gMHgwMDAwOyAgICAgICAgICAvL1BIWSBjb250cm9sIEgKKyNlbHNlCisgICAgLyogQ0NLIDZNICovCisgICAgaGVhZGVyWzJdID0gMHgwZjAxOyAgICAgICAgICAvL1BIWSBjb250cm9sIEwKKyAgICBoZWFkZXJbM10gPSAweDAwMEI7ICAgICAgICAgIC8vUEhZIGNvbnRyb2wgSAorCisjZW5kaWYKKyAgICAvKgorICAgICAqIEdlbmVyYXRlIFdMQU4gaGVhZGVyCisgICAgICogRnJhbWUgY29udHJvbCBmcmFtZSB0eXBlIGFuZCBzdWJ0eXBlCisgICAgICovCisgICAgaGVhZGVyWzQrMF0gPSBaTV9XTEFOX0ZSQU1FX1RZUEVfQkFSOworICAgIC8qCisgICAgICogRHVyYXRpb24KKyAgICAgKi8KKyAgICBoZWFkZXJbNCsxXSA9IDA7CisKKyAgICAvKiBBZGRyZXNzIDEgPSBEQSAqLworICAgIGhlYWRlcls0KzJdID0gZHN0WzBdOworICAgIGhlYWRlcls0KzNdID0gZHN0WzFdOworICAgIGhlYWRlcls0KzRdID0gZHN0WzJdOworCisgICAgLyogQWRkcmVzcyAyID0gU0EgKi8KKyAgICBoZWFkZXJbNCs1XSA9IHdkLT5tYWNBZGRyWzBdOworICAgIGhlYWRlcls0KzZdID0gd2QtPm1hY0FkZHJbMV07CisgICAgaWYgKHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0FQKQorICAgIHsKKyNpZmRlZiBaTV9WQVBNT0RFX01VTFRJTEVfU1NJRAorICAgICAgICBoZWFkZXJbNCs3XSA9IHdkLT5tYWNBZGRyWzJdOyAvL011bHRpcGxlIFNTSUQKKyNlbHNlCisgICAgICAgIGhlYWRlcls0KzddID0gd2QtPm1hY0FkZHJbMl0gKyAodmFwPDw4KTsgLy9WQVAKKyNlbmRpZgorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBoZWFkZXJbNCs3XSA9IHdkLT5tYWNBZGRyWzJdOworICAgIH0KKworICAgIC8qIFNlcXVlbmNlIENvbnRyb2wgKi8KKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIGhlYWRlcls0KzExXSA9ICgod2QtPm1tc2VxKyspPDw0KTsKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisKKyAgICByZXR1cm4gaGxlbjsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9jYWdnLmggYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvY2FnZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkODdhNTYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvY2FnZy5oCkBAIC0wLDAgKzEsNDM1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggQXRoZXJvcyBDb21tdW5pY2F0aW9ucyBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZHVsZSBOYW1lIDogY2FnZy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBBYnN0cmFjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBUaGlzIG1vZHVsZSBjb250YWlucyBBLU1QRFUgYWdncmVnYXRpb24gcmVsYXRpdmVkIGZ1bmN0aW9ucy4gICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBOT1RFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBOb25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLypSZXZpc2lvbiBIaXN0b3J5OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBXaG8gICAgICAgICBXaGVuICAgICAgICBXaGF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIC0tLS0tLS0tICAgIC0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBIb25kYSAgICAgICAxMi00LTA2ICAgICBjcmVhdGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX0NBR0dfSAorI2RlZmluZSBfQ0FHR19ICisKKworLyoKKyAqIHRoZSBhZ2dyZWdhdGlvbiBmdW5jdGlvbnMgZmxhZywgMCBpZiBkb24ndCBkbyBhZ2dyZWdhdGUKKyAqLworCisjZGVmaW5lIFpNX0FHR19GUEdBX0RFQlVHICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgWk1fQUdHX0ZQR0FfUkVPUkRFUklORyAgICAgICAgICAgICAgMQorCisjaWZuZGVmIFpNX0FHR19UQUxMWQorLy8jZGVmaW5lIFpNX0FHR19UQUxMWQorI2VuZGlmCisvKgorICogQWdncmVnYXRlIGNvbnRyb2wKKyAqLworCisKKyNkZWZpbmUgWk1fQUdHX1BPT0xfU0laRSAgICAgICAgICAgICAgICAgICAgMjAKKyNkZWZpbmUgWk1fQkFXX1BPT0xfU0laRSAgICAgICAgICAgICAgICAgICAgMzIKKyNkZWZpbmUgWk1fQUdHUV9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgNjQKKyNkZWZpbmUgWk1fQUdHUV9TSVpFX01BU0sgICAgICAgICAgICAgICAgICAgKFpNX0FHR1FfU0laRS0xKQorI2RlZmluZSBaTV9BR0dfTE9XX1RIUkVTSE9MRCAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFpNX0FHR19ISUdIX1RIUkVTSE9MRCAgICAgICAgICAgICAgIDUKKworLyoKKyAqIG51bWJlciBvZiBhY2Nlc3MgY2F0ZWdvcmllcyAoYWMpCisgKi8KKyNkZWZpbmUgWk1fQUMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNAorLyoKKyAqIHRoZSB0aW1lciB0byBjbGVhciBhZ2dyZWdhdGlvbiBxdWV1ZSwgdW5pdDogMSB0aWNrCisgKiBpZiB0aGUgcGFja2V0IGlzIHRvbyBvbGQgKGN1cnJlbnQgdGltZSAtIGFycml2YWwgdGltZSkKKyAqIHRoZSBwYWNrZXQgYW5kIHRoZSBhZ2dyZWdhdGUgcXVldWUgd2lsbCBiZSBjbGVhcmVkCisgKi8KKyNkZWZpbmUgWk1fQUdHX0NMRUFSX1RJTUUgICAgICAgICAgICAgICAgICAgMTAKKy8qCisgKiBkZWxldGUgdGhlIHF1ZXVlIGlmIGlkbGUgZm9yIFpNX0RFTEVURV9USU1FCisgKiB1bml0OiAxMG1zCisgKi8KKyNkZWZpbmUgWk1fQUdHX0RFTEVURV9USU1FICAgICAgICAgICAgICAgICAgMTAwMDAKKworLyoKKyAqIGJsb2NrIGFjayB3aW5kb3cgc2l6ZQorICovCisjZGVmaW5lIFpNX0FHR19CQVdfU0laRSAgICAgICAgICAgICAgICAgICAgIDY0CisjZGVmaW5lIFpNX0FHR19CQVdfTUFTSyAgICAgICAgICAgICAgICAgICAgIChaTV9BR0dfQkFXX1NJWkUtMSkKKy8qCisgKiBvcmlnaW5hdG9yICAgICBBRERCQSBSZXNxdWVzdCAgICByZWNlaXZlcgorICogICAgICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+fAorICogICAgIDF8ICAgICAgICAgIEFDSyAgICAgICAgICAgICAgICAgfDEKKyAqICAgICAgfDwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAqICAgICAyfCAgICAgICAgIEFEREJBIFJlc3BvbnNlICAgICAgIHwyCisgKiAgICAgIHw8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgKiAgICAgM3wgICAgICAgICAgQUNLICAgICAgICAgICAgICAgICB8MworICogICAgICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+fAorICogICAgIDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQKKyAqLworI2RlZmluZSBaTV9BR0dfQUREQkFfUkVRVUVTVCAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFpNX0FHR19BRERCQV9SRVFVRVNUX0FDSyAgICAgICAgICAgIDIKKyNkZWZpbmUgWk1fQUdHX0FEREJBX1JFU1BPTlNFICAgICAgICAgICAgICAgMworI2RlZmluZSBaTV9BR0dfQUREQkFfUkVTUE9OU0VfQUNLICAgICAgICAgICA0CisKKyNkZWZpbmUgWk1fQUdHX1NJTkdMRV9NUERVICAgICAgICAgICAgICAgICAgMDAKKyNkZWZpbmUgWk1fQUdHX0ZJUlNUX01QRFUgICAgICAgICAgICAgICAgICAgMDEKKyNkZWZpbmUgWk1fQUdHX01JRERMRV9NUERVICAgICAgICAgICAgICAgICAgMTEKKyNkZWZpbmUgWk1fQUdHX0xBU1RfTVBEVSAgICAgICAgICAgICAgICAgICAgMTAKKy8qCisgKiBlbmQgb2YgQWdncmVnYXRlIGNvbnRyb2wKKyAqLworCisjZGVmaW5lIFRJRF9UWCAgc3RydWN0IGFnZ1F1ZXVlKgorI2RlZmluZSBUSURfQkFXIHN0cnVjdCBiYXdfcSoKKyNkZWZpbmUgQkFXIHdkLT5iYXdfZW5hYmxlcgorI2RlZmluZSBERVNUUSB3ZC0+ZGVzdFEKKworLyoKKyAqIFF1ZXVlIGFjY2VzcworICovCisjZGVmaW5lIHptX2FnZ19xbGVuKGRldiwgaGVhZCwgdGFpbCkgKChoZWFkIC0gdGFpbCkgJiBaTV9BR0dRX1NJWkVfTUFTSykKKyNkZWZpbmUgem1fYWdnX2luUSh0aWRfdHgsIHB0KSAoKCgocHQgLSB0aWRfdHgtPmFnZ1RhaWwpICYgWk1fQUdHUV9TSVpFX01BU0spIDwgXAorICAgICAgICAoKHRpZF90eC0+YWdnSGVhZCAtIHRpZF90eC0+YWdnVGFpbCkgJiBaTV9BR0dRX1NJWkVfTUFTSykpPyBUUlVFOkZBTFNFKQorI2RlZmluZSB6bV9hZ2dfcGx1cyhwdCkgcHQgPSAocHQgKyAxKSAmIFpNX0FHR1FfU0laRV9NQVNLCisjZGVmaW5lIHptX2FnZ19taW4oQSwgQikgKChBPkIpPyBCOkEpCisjZGVmaW5lIHptX2FnZ19HZXRUaW1lKCkgd2QtPnRpY2sKKyNkZWZpbmUgVFhRTCAoemZIcEdldE1heFR4ZENvdW50KGRldikgLSB6ZkhwR2V0RnJlZVR4ZENvdW50KGRldikpCisKKy8qIGRvbid0IGNoYW5nZSBBR0dfTUlOX1RYUUwgZWFzaWx5LCB0aGlzIG1pZ2h0IGNhdXNlIEJBVyBCU09EICovCisjZGVmaW5lIEFHR19NSU5fVFhRTCAgICAgICAgICAgICAgICAgICAgICAgIDIKKy8qCisgKiBjb25zaWRlciB0Y3AsdWRwLGFjKDEyMzQpCisgKi8KKyNkZWZpbmUgem1fYWdnX2R5bmFtaWNfdGhyZXNob2xkKGRldiwgYXIpICAgKChhciA+IDE2KT8gMTE6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhciA+IDEyKT8gODogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFyID4gOCk/IDU6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhciA+IDQpPyAyOjEpCisjZGVmaW5lIHptX2FnZ193ZWlnaHQoYWMpICAgKCgzID09IGFjKT8gNDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMiA9PSBhYyk/IDM6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDAgPT0gYWMpPyAyOjEpCisvKgorICogdGhlIHJlcXVpcmVkIGZyZWUgcXVldWUgcmF0aW8gcGVyIGFjCisgKi8KKworI2RlZmluZSB6bV9hZ2dfcmF0aW8oYWMpICAgICgoMyA9PSBhYyk/IDM6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDIgPT0gYWMpPyAoemZIcEdldE1heFR4ZENvdW50KGRldikqMS80KTogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMCA9PSBhYyk/ICh6ZkhwR2V0TWF4VHhkQ291bnQoZGV2KSoyLzQpOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHpmSHBHZXRNYXhUeGRDb3VudChkZXYpKjMvNCkpCisKKy8vI2RlZmluZSB6bV9hZ2dfcmF0aW8oYWMpICAgIDMKKy8qCisgKiBlbmQgb2YgUXVldWUgYWNjZXNzCisgKi8KKworI2RlZmluZSBaTV9BR0dNU0dfTEVWICAgIFpNX0xWXzMKKyNkZWZpbmUgem1fbXNnMF9hZ2cobHYsIG1zZykgaWYgKFpNX0FHR01TR19MRVYgPj0gbHYpIFwKKyAgICAgICAge3ptX2RlYnVnX21zZzAobXNnKTt9CisjZGVmaW5lIHptX21zZzFfYWdnKGx2LCBtc2csIHZhbCkgaWYgKFpNX0FHR01TR19MRVYgPj0gbHYpIFwKKyAgICAgICAge3ptX2RlYnVnX21zZzEobXNnLCB2YWwpO30KKyNkZWZpbmUgem1fbXNnMl9hZ2cobHYsIG1zZywgdmFsKSBpZiAoWk1fQUdHTVNHX0xFViA+PSBsdikgXAorICAgICAgICB7em1fZGVidWdfbXNnMihtc2csIHZhbCk7fQorCisjaWZuZGVmIFpNX0VOQUJMRV9GV19CQV9SRVRSQU5TTUlTU0lPTiAvL2Rpc2FibGUgQkFXCitzdHJ1Y3QgYmF3X2hlYWRlcl9yIHsKKyAgICB1MTZfdCAgICAgICAqaGVhZGVyOworICAgIHUxNl90ICAgICAgICptaWM7CisgICAgdTE2X3QgICAgICAgKnNuYXA7CisgICAgdTE2X3QgICAgICAgaGVhZGVyTGVuOworICAgIHUxNl90ICAgICAgIG1pY0xlbjsKKyAgICB1MTZfdCAgICAgICBzbmFwTGVuOworICAgIHUxNl90ICAgICAgIHJlbW92ZUxlbjsKKyAgICB1OF90ICAgICAgICBrZXlJZHg7Cit9OworCitzdHJ1Y3QgYmF3X2hlYWRlciB7CisgICAgdTE2X3QgICAgICAgaGVhZGVyWzI5XTsvL1soOCszMCsyKzE4KS8yXTsgIDU4IGJ5dGVzICAvKiBjdHIrKDQrYTErYTIrYTMrMithNCkrcW9zK2l2ICovCisgICAgdTE2X3QgICAgICAgaGVhZGVyTGVuOworICAgIHUxNl90ICAgICAgIG1pY1s0XTsgLy9bOC8yXTsgOCBieXRlcworICAgIHUxNl90ICAgICAgIG1pY0xlbjsKKyAgICB1MTZfdCAgICAgICBzbmFwWzRdOyAvL1s4LzJdOyA4IGJ5dGVzCisgICAgdTE2X3QgICAgICAgc25hcExlbjsKKyAgICB1MTZfdCAgICAgICByZW1vdmVMZW47CisgICAgdThfdCAgICAgICAga2V5SWR4OworfTsKKworc3RydWN0IGJ1ZkluZm8geworICAgIHpidWZfdCogICAgIGJ1ZjsKKyAgICB1OF90ICAgICAgICBiYXdfcmV0cmFuc21pdDsKKyAgICB1MzJfdCAgICAgICB0aW1lc3RhbXA7CisgICAgc3RydWN0IGJhd19oZWFkZXIgICAqYmF3X2hlYWRlcjsKK307CisjZW5kaWYKK3N0cnVjdCBhZ2dFbGVtZW50Cit7CisgICAgemJ1Zl90KiAgICAgYnVmOworICAgIHUzMl90ICAgICAgIGFycml2YWxUaW1lOworICAgIHU4X3QgICAgICAgIGJhd19yZXRyYW5zbWl0OworICAgIHN0cnVjdCB6c0FkZGl0aW9uSW5mbyBhZGRJbmZvOworICAgIC8vc3RydWN0IGJhd19oZWFkZXIgIGJhd19oZWFkZXI7Cit9OworCisKKyNpZm5kZWYgWk1fRU5BQkxFX0ZXX0JBX1JFVFJBTlNNSVNTSU9OIC8vZGlzYWJsZSBCQVcKK3N0cnVjdCBiYXdfYnVmCit7CisgICAgemJ1Zl90KiAgICAgYnVmOworICAgIHUxNl90ICAgICAgIGJhd19zZXE7CisgICAgdTMyX3QgICAgICAgdGltZXN0YW1wOworICAgIHU4X3QgICAgICAgIGJhd19yZXRyYW5zbWl0OworICAgIHN0cnVjdCBiYXdfaGVhZGVyIGJhd19oZWFkZXI7Cit9OworCitzdHJ1Y3QgYmF3X3EgeworICAgIHN0cnVjdCBiYXdfYnVmICBmcmFtZVtaTV9WVFhRX1NJWkVdOworICAgIHUxNl90ICAgICAgIGVuYWJsZWQ7CisgICAgdTE2X3QgICAgICAgc3RhcnRfc2VxOworICAgIHUxNl90ICAgICAgIGhlYWQ7CisgICAgdTE2X3QgICAgICAgdGFpbDsKKyAgICB1MTZfdCAgICAgICBzaXplOworICAgIFRJRF9UWCAgICAgIHRpZF90eDsKKworICAgIC8vc3RydWN0IGJhd19oZWFkZXIgKmJhd19oZWFkZXI7Cit9OworCitzdHJ1Y3QgYmF3X2VuYWJsZXIKK3sKKyAgICBzdHJ1Y3QgYmF3X3EgICAgdGlkX2Jhd1taTV9CQVdfUE9PTF9TSVpFXTsKKyAgICB1OF90ICAgIGRlbFBvaW50OworICAgIHZvaWQgICAgKCpjb3JlKSh6ZGV2X3QqIGRldiwgdTE2X3QgYmF3X3NlcSwgdTMyX3QgYml0bWFwLCB1MTZfdCBhZ2dMZW4pOworICAgIC8vdm9pZCAgICAoKmNvcmUpOworICAgIHZvaWQgICAgKCppbml0KSh6ZGV2X3QqIGRldik7CisgICAgVElEX0JBVyAoKmdldE5ld1EpKHpkZXZfdCogZGV2LCB1MTZfdCBzdGFydF9zZXEsIFRJRF9UWCB0aWRfdHgpOworICAgIFRJRF9CQVcgKCpnZXRRKSh6ZGV2X3QqIGRldiwgdTE2X3QgYmF3X3NlcSk7CisgICAgdTE2X3QgICAoKmluc2VydCkoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCBiYXdfc2VxLCBUSURfQkFXIHRpZF9iYXcsIHU4X3QgYmF3X3JldHJhbnNtaXQsIHN0cnVjdCBiYXdfaGVhZGVyX3IgKmhlYWRlcl9yKTsKKyAgICBzdHJ1Y3QgYnVmSW5mbyogKCpwb3ApKHpkZXZfdCogZGV2LCB1MTZfdCBpbmRleCwgVElEX0JBVyB0aWRfYmF3KTsKKyAgICB2b2lkICAgICgqZW5hYmxlKSh6ZGV2X3QqIGRldiwgVElEX0JBVyB0aWRfYmF3LCB1MTZfdCBzdGFydF9zZXEpOworICAgIHZvaWQgICAgKCpkaXNhYmxlKSh6ZGV2X3QqIGRldiwgVElEX0JBVyB0aWRfYmF3KTsKKworfTsKKyNlbmRpZgorc3RydWN0IGFnZ1F1ZXVlCit7CisgICAgc3RydWN0ICAgICAgYWdnRWxlbWVudCAgYWdndnR4cVtaTV9BR0dRX1NJWkVdOworICAgIHUxNl90ICAgICAgIGFnZ0hlYWQ7CisgICAgdTE2X3QgICAgICAgYWdnVGFpbDsKKyAgICBzMTZfdCAgICAgICBzaXplOworICAgIHUxNl90ICAgICAgIGFnZ1FTVEE7CisgICAgdTE2X3QgICAgICAgYWdnUUVuYWJsZWQ7CisgICAgdTE2X3QgICAgICAgYWM7CisgICAgdTE2X3QgICAgICAgdGlkOworICAgIHUxNl90ICAgICAgIGFnZ1JlYWR5OworICAgIHUxNl90ICAgICAgIGNsZWFyRmxhZzsKKyAgICB1MTZfdCAgICAgICBkZWxldGVGbGFnOworICAgIHUzMl90ICAgICAgIGxhc3RBcnJpdmFsOworICAgIHUxNl90ICAgICAgIGFnZ0ZyYW1lU2l6ZTsKKyAgICB1MTZfdCAgICAgICBiYXJfc3NuOyAgICAvKiBzdGFydGluZyBzZXF1ZW5jZSBudW1iZXIgaW4gQkFSICovCisgICAgdTE2X3QgICAgICAgZHN0WzNdOworICAgIHUxNl90ICAgICAgIGNvbXBsZXRlOyAgICAgLyogY29tcGxldGUgaW5kaWNhdGlvbiBwb2ludGVyICovCit9OworCitzdHJ1Y3QgYWdnU3RhCit7CisgICAgdTE2X3QgICAgICAgY291bnRbWk1fQUNdOworICAgIFRJRF9UWCAgICAgIHRpZF90eFs4XTsKKyAgICB1MTZfdCAgICAgICBhZ2dGbGFnW1pNX0FDXTsKK307CisKK3N0cnVjdCBhZ2dfdGlkX3J4Cit7CisgICAgdTE2X3QgICAgICAgYWlkOworICAgIHUxNl90ICAgICAgIGFjOworICAgIHUxNl90ICAgICAgIGFkZEJhRXhjaGFuZ2VTdGF0dXNDb2RlOworICAgIC8vc3RydWN0IHpzQWRkaXRpb25JbmZvICphZGRJbmZvOworICAgIHUxNl90ICAgICAgIHNlcV9zdGFydDsJCS8qIGZpcnN0IHNlcSBleHBlY3RlZCBuZXh0ICovCisgICAgdTE2X3QgICAgICAgYmF3X2hlYWQ7CQkvKiBoZWFkIG9mIHZhbGlkIGJsb2NrIGFjayB3aW5kb3cgKi8KKyAgICB1MTZfdCAgICAgICBiYXdfdGFpbDsJCS8qIHRhaWwgb2YgdmFsaWQgYmxvY2sgYWNrIHdpbmRvdyAqLworICAgIC8vdTE2X3QgICAgICAgZnJlZV9jb3VudDsJCS8qIGJsb2NrIGFjayB3aW5kb3cgc2l6ZQkqLworICAgIHU4X3QgICAgICAgIHNxX2V4Y2VlZF9jb3VudDsKKyAgICB1OF90ICAgICAgICBzcV9iZWhpbmRfY291bnQ7CisgICAgc3RydWN0IGFnZ0VsZW1lbnQgZnJhbWVbWk1fQUdHX0JBV19TSVpFICsgMV07IC8qIG91dC1vZi1vcmRlciByeCBmcmFtZXMgKi8KK307CisKK3N0cnVjdCBhZ2dDb250cm9sCit7CisgICAgdTE2X3QgICAgICAgYWdnRW5hYmxlZDsKKyAgICB1MTZfdCAgICAgICBhbXBkdUluZGljYXRpb247CisgICAgdTE2X3QgICAgICAgYWRkYmFJbmRpY2F0aW9uOworICAgIC8vVElEX0JBVyAgICAgdGlkX2JhdzsKKyAgICB1MzJfdCAgICAgICB0aW1lc3RhbXA7Cit9OworCitzdHJ1Y3QgYWdnQmFGcmFtZVBhcmFtZXRlcgoreworICAgIHpidWZfdCogICAgIGJ1ZjsKKyAgICB1MTZfdCAgICAgICBiYV9wYXJhbWV0ZXI7CisgICAgdThfdCAgICAgICAgZGlhbG9nOworICAgIHUxNl90ICAgICAgIGJhX3BvbGljeTsKKyAgICB1MTZfdCAgICAgICB0aWQ7CisgICAgdTE2X3QgICAgICAgYnVmZmVyX3NpemU7CisgICAgdTE2X3QgICAgICAgYmFfdGltZW91dDsKKyAgICB1MTZfdCAgICAgICBiYV9zdGFydF9zZXE7CisgICAgdTE2X3QgICAgICAgc3RhdHVzX2NvZGU7Cit9OworCitzdHJ1Y3QgYWdnQmFyQ29udHJvbAoreworICAgIHUxNl90ICAgICAgIGJhcl9hY2tfcG9saWN5ICAgICAgOworICAgIHUxNl90ICAgICAgIG11bHRpX3RpZCAgICAgICAgICAgOworICAgIHUxNl90ICAgICAgIGNvbXByZXNzZWRfYml0bWFwICAgOworICAgIHUxNl90ICAgICAgIHRpZF9pbmZvICAgICAgICAgICAgOworfTsKKworc3RydWN0IGFnZ1RhbGx5Cit7CisgICAgdTMyX3QgICAgICAgZ290X3BhY2tldHNfc3VtOworICAgIHUzMl90ICAgICAgIGdvdF9ieXRlc19zdW07CisgICAgdTMyX3QgICAgICAgc2VudF9wYWNrZXRzX3N1bTsKKyAgICB1MzJfdCAgICAgICBzZW50X2J5dGVzX3N1bTsKKyAgICB1MzJfdCAgICAgICBhdmdfZ290X3BhY2tldHM7CisgICAgdTMyX3QgICAgICAgYXZnX2dvdF9ieXRlczsKKyAgICB1MzJfdCAgICAgICBhdmdfc2VudF9wYWNrZXRzOworICAgIHUzMl90ICAgICAgIGF2Z19zZW50X2J5dGVzOworICAgIHUxNl90ICAgICAgIHRpbWU7Cit9OworCisKK3N0cnVjdCBkZXN0USB7CisgICAgc3RydWN0IGRlc3R7CisgICAgICAgIHUxNl90ICAgUXR5cGUgOiAxOyAvKiAwIGFnZ3IsIDEgdnR4cSAqLworICAgICAgICBUSURfVFggIHRpZF90eDsKKyAgICAgICAgdm9pZCogICB2dHhxOworCisgICAgICAgIHN0cnVjdCBkZXN0KiBuZXh0OworICAgIH0gKmRlc3RbNF07CisgICAgc3RydWN0IGRlc3QqIEhlYWRbNF07CisgICAgLy9zMTZfdCAgIHNpemVbNF07CisgICAgdTE2X3QgICBwcHJpOworICAgIHZvaWQgICAgKCppbnNlcnQpKHpkZXZfdCogZGV2LCB1MTZfdCBRdHlwZSwgdTE2X3QgYWMsIFRJRF9UWCB0aWRfdHgsIHZvaWQqIHZ0eHEpOworICAgIHZvaWQgICAgKCpkZWxldGUpKHpkZXZfdCogZGV2LCB1MTZfdCBRdHlwZSwgVElEX1RYIHRpZF90eCwgdm9pZCogdnR4cSk7CisgICAgdm9pZCAgICAoKmluaXQpKHpkZXZfdCogZGV2KTsKKyAgICBzdHJ1Y3QgZGVzdCogKCpnZXROZXh0KSh6ZGV2X3QqIGRldiwgdTE2X3QgYWMpOworICAgIHUxNl90ICAgKCpleGlzdCkoemRldl90KiBkZXYsIHUxNl90IFF0eXBlLCB1MTZfdCBhYywgVElEX1RYIHRpZF90eCwgdm9pZCogdnR4cSk7CisgICAgLy92b2lkICAgICgqc2NhbikoemRldl90KiBkZXYpOworfTsKKy8qCisgKiBhZ2dyZWdhdGlvbiB0eAorICovCit2b2lkICAgIHpmQWdnSW5pdCh6ZGV2X3QqIGRldik7Cit1MTZfdCAgIHpmQXBGaW5kU3RhKHpkZXZfdCogZGV2LCB1MTZfdCogYWRkcik7Cit1MTZfdCAgIHpmQWdnR2V0U3RhKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1Zik7CitUSURfVFggIHpmQWdnVHhHZXRRdWV1ZSh6ZGV2X3QqIGRldiwgdTE2X3QgYWlkLCB1MTZfdCB0aWQpOworVElEX1RYICB6ZkFnZ1R4TmV3UXVldWUoemRldl90KiBkZXYsIHUxNl90IGFpZCwgdTE2X3QgdGlkLCB6YnVmX3QqIGJ1Zik7Cit1MTZfdCAgIHpmQWdnVHhFbnF1ZXVlKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3QgYWlkLCBUSURfVFggdGlkX3R4KTsKK3UxNl90ICAgemZBZ2dUeCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IHRpZCk7Cit1MTZfdCAgIHpmQWdnVHhSZWFkeUNvdW50KHpkZXZfdCogZGV2LCB1MTZfdCBhYyk7Cit1MTZfdCAgIHpmQWdnVHhQYXJ0aWFsKHpkZXZfdCogZGV2LCB1MTZfdCBhYywgdTE2X3QgcmVhZHljb3VudCk7Cit1MTZfdCAgIHpmQWdnVHhTZW5kKHpkZXZfdCogZGV2LCB1MzJfdCBmcmVlVHhkLCBUSURfVFggdGlkX3R4KTsKK1RJRF9UWCAgemZBZ2dUeEdldFJlYWR5UXVldWUoemRldl90KiBkZXYsIHUxNl90IGFjKTsKK3pidWZfdCogemZBZ2dUeEdldFZ0eHEoemRldl90KiBkZXYsIFRJRF9UWCB0aWRfdHgpOwordTE2X3QgICB6ZkFnZ1R4RGVsZXRlUXVldWUoemRldl90KiBkZXYsIHUxNl90IHFudW0pOwordTE2X3QgICB6ZkFnZ1NjYW5BbmRDbGVhcih6ZGV2X3QqIGRldiwgdTMyX3QgdGltZSk7Cit1MTZfdCAgIHpmQWdnQ2xlYXJRdWV1ZSh6ZGV2X3QqIGRldik7Cit2b2lkICAgIHpmQWdnVHhTY2hlZHVsZXIoemRldl90KiBkZXYsIHU4X3QgU2NhbkFuZENsZWFyKTsKKworLyogdGlkX3R4IG1hbmlwdWxhdGlvbiAqLworI2lmbmRlZiBaTV9FTkFCTEVfRldfQkFfUkVUUkFOU01JU1NJT04gLy9kaXNhYmxlIEJBVwordTE2X3QgICB6ZkFnZ1RpZFR4SW5zZXJ0SGVhZCh6ZGV2X3QqIGRldiwgc3RydWN0IGJ1ZkluZm8qIGJ1Zl9pbmZvLCBUSURfVFggdGlkX3R4KTsKKyNlbmRpZgordm9pZCAgICB6ZkFnZ0Rlc3RJbnNlcnQoemRldl90KiBkZXYsIHUxNl90IFF0eXBlLCB1MTZfdCBhYywgVElEX1RYIHRpZF90eCwgdm9pZCogdnR4cSk7Cit2b2lkICAgIHpmQWdnRGVzdERlbGV0ZSh6ZGV2X3QqIGRldiwgdTE2X3QgUXR5cGUsIFRJRF9UWCB0aWRfdHgsIHZvaWQqIHZ0eHEpOwordm9pZCAgICB6ZkFnZ0Rlc3RJbml0KHpkZXZfdCogZGV2KTsKK3N0cnVjdCBkZXN0KiB6ZkFnZ0Rlc3RHZXROZXh0KHpkZXZfdCogZGV2LCB1MTZfdCBhYyk7Cit1MTZfdCAgIHpmQWdnRGVzdEV4aXN0KHpkZXZfdCogZGV2LCB1MTZfdCBRdHlwZSwgdTE2X3QgYWMsIFRJRF9UWCB0aWRfdHgsIHZvaWQqIHZ0eHEpOworLyoKKyAqIGFnZ3JlZ2F0aW9uIHJ4CisgKi8KK3N0cnVjdCBhZ2dfdGlkX3J4ICp6ZkFnZ1J4RW5hYmxlZCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpOwordTE2X3QgICB6ZkFnZ1J4KHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1Ziwgc3RydWN0IHpzQWRkaXRpb25JbmZvICphZGRJbmZvLCBzdHJ1Y3QgYWdnX3RpZF9yeCAqdGlkX3J4KTsKK3N0cnVjdCBhZ2dfdGlkX3J4ICp6ZkFnZ1J4R2V0UXVldWUoemRldl90KiBkZXYsIHpidWZfdCogYnVmKTsKK3UxNl90ICAgemZBZ2dSeEVucXVldWUoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCBzdHJ1Y3QgYWdnX3RpZF9yeCAqdGlkX3J4LCBzdHJ1Y3QgenNBZGRpdGlvbkluZm8gKmFkZEluZm8pOwordTE2X3QgICB6ZkFnZ1J4Rmx1c2goemRldl90KiBkZXYsIHUxNl90IHNlcV9ubywgc3RydWN0IGFnZ190aWRfcnggKnRpZF9yeCk7Cit1MTZfdCAgIHpmQWdnUnhGcmVlQnVmKHpkZXZfdCogZGV2LCB1MTZfdCBkZXN0cm95KTsKK3UxNl90ICAgemZBZ2dSeENsZWFyKHpkZXZfdCogZGV2LCB1MzJfdCB0aW1lKTsKK3ZvaWQgICAgemZBZ2dSZWN2QkFSKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1Zik7CisvKgorICogZW5kIG9mIGFnZ3JlZ2F0aW9uIHJ4CisgKi8KKworLyoKKyAqIEFEREJBCisgKi8KK3UxNl90ICAgemZBZ2dTZW5kQWRkYmFSZXF1ZXN0KHpkZXZfdCogZGV2LCB1MTZfdCAqZHN0LCB1MTZfdCBhYywgdTE2X3QgdXApOwordTE2X3QgICB6ZkFnZ1NldEFkZGJhRnJhbWVCb2R5KHpkZXZfdCogZGV2LHpidWZfdCogYnVmLCB1MTZfdCBvZmZzZXQsIHUxNl90IGFjLCB1MTZfdCB1cCk7Cit1MTZfdCAgIHpmQWdnR2VuQWRkYmFIZWFkZXIoemRldl90KiBkZXYsIHUxNl90KiBkc3QsCisgICAgICAgICAgICAgICAgdTE2X3QqIGhlYWRlciwgdTE2X3QgbGVuLCB6YnVmX3QqIGJ1ZiwgdTE2X3QgdmFwLCB1OF90IGVuY3J5cHQpOwordTE2X3QgICB6ZkFnZ1Byb2Nlc3NBY3Rpb24oemRldl90KiBkZXYsIHpidWZfdCogYnVmKTsKK3UxNl90ICAgemZBZ2dCbG9ja0Fja0FjdGlvbkZyYW1lKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1Zik7Cit1MTZfdCAgIHpmQWdnUmVjdkFkZGJhUmVxdWVzdCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpOwordTE2X3QgICB6ZkFnZ1JlY3ZBZGRiYVJlc3BvbnNlKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1Zik7Cit1MTZfdCAgIHpmQWdnUmVjdkRlbGJhKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1Zik7Cit1MTZfdCAgIHpmQWdnU2VuZEFkZGJhUmVzcG9uc2UoemRldl90KiBkZXYsIHN0cnVjdCBhZ2dCYUZyYW1lUGFyYW1ldGVyICpiZik7Cit1MTZfdCAgIHpmQWdnU2V0QWRkYmFSZXNwb25zZUZyYW1lQm9keSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsCisgICAgICAgICAgICAgICAgc3RydWN0IGFnZ0JhRnJhbWVQYXJhbWV0ZXIgKmJmLCB1MTZfdCBvZmZzZXQpOwordTE2X3QgICB6ZkFnZ0FkZGJhU2V0VGlkUngoemRldl90KiBkZXYsIHpidWZfdCogYnVmLAorICAgICAgICAgICAgICAgIHN0cnVjdCBhZ2dCYUZyYW1lUGFyYW1ldGVyICpiZik7CisvKgorICogemZBZ2dUeFNlbmRFdGgKKyAqLwordTE2X3QgemZBZ2dUeFNlbmRFdGgoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCBwb3J0LCB1MTZfdCBidWZUeXBlLCB1OF90IGZsYWcsIHN0cnVjdCBhZ2dDb250cm9sICphZ2dDb250cm9sLCBUSURfVFggdGlkX3R4KTsKKworLyoKKyAqIHN0YXRpc3RpY3MgZnVuY3Rpb25zCisgKi8KK3UxNl90IHpmQWdnVGFsbHlSZXNldCh6ZGV2X3QqIGRldik7CisKK3UxNl90ICAgemZBZ2dQcmludFRhbGx5KHpkZXZfdCogZGV2KTsKKworLyoKKyAqIEJBUgorICovCit2b2lkICAgIHpmQWdnSW52b2tlQmFyKHpkZXZfdCogZGV2LCBUSURfVFggdGlkX3R4KTsKK3UxNl90ICAgemZBZ2dTZW5kQmFyKHpkZXZfdCogZGV2LCBUSURfVFggdGlkX3R4LCBzdHJ1Y3QgYWdnQmFyQ29udHJvbCAqYWdnQmFyQ29udHJvbCk7Cit1MTZfdCAgIHpmQWdnU2V0QmFyQm9keSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IG9mZnNldCwgVElEX1RYIHRpZF90eCwgc3RydWN0IGFnZ0JhckNvbnRyb2wgKmFnZ0JhckNvbnRyb2wpOwordTE2X3QgICB6ZkFnZ0dlbkJhckhlYWRlcih6ZGV2X3QqIGRldiwgdTE2X3QqIGRzdCwKKyAgICAgICAgICAgICAgICB1MTZfdCogaGVhZGVyLCB1MTZfdCBsZW4sIHpidWZfdCogYnVmLCB1MTZfdCB2YXAsIHU4X3QgZW5jcnlwdCk7CisKKyNpZm5kZWYgWk1fRU5BQkxFX0ZXX0JBX1JFVFJBTlNNSVNTSU9OIC8vZGlzYWJsZSBCQVcKKy8qIEJBVyBCQSByZXRyYW5zbWlzc2lvbiAqLwordm9pZCAgICB6ZkJhd0NvcmUoemRldl90KiBkZXYsIHUxNl90IGJhd19zZXEsIHUzMl90IGJpdG1hcCwgdTE2X3QgYWdnTGVuKTsKK3ZvaWQgICAgemZCYXdJbml0KHpkZXZfdCogZGV2KTsKK1RJRF9CQVcgemZCYXdHZXROZXdRKHpkZXZfdCogZGV2LCB1MTZfdCBzdGFydF9zZXEsIFRJRF9UWCB0aWRfdHgpOwordTE2X3QgICB6ZkJhd0luc2VydCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IGJhd19zZXEsIFRJRF9CQVcgdGlkX2JhdywgdThfdCBiYXdfcmV0cmFuc21pdCwgc3RydWN0IGJhd19oZWFkZXJfciAqaGVhZGVyX3IpOworc3RydWN0IGJ1ZkluZm8qIHpmQmF3UG9wKHpkZXZfdCogZGV2LCB1MTZfdCBpbmRleCwgVElEX0JBVyB0aWRfYmF3KTsKK3ZvaWQgICAgemZCYXdFbmFibGUoemRldl90KiBkZXYsIFRJRF9CQVcgdGlkX2JhdywgdTE2X3Qgc3RhcnRfc2VxKTsKK3ZvaWQgICAgemZCYXdEaXNhYmxlKHpkZXZfdCogZGV2LCBUSURfQkFXIHRpZF9iYXcpOworVElEX0JBVyB6ZkJhd0dldFEoemRldl90KiBkZXYsIHUxNl90IGJhd19zZXEpOwordm9pZCB6ZkFnZ1R4UmV0cmFuc21pdCh6ZGV2X3QqIGRldiwgc3RydWN0IGJ1ZkluZm8gKmJ1Zl9pbmZvLCBzdHJ1Y3QgYWdnQ29udHJvbCAqYWdnQ29udHJvbCwgVElEX1RYIHRpZF90eCk7CisjZW5kaWYKKy8qIGV4dGVybiBmdW5jdGlvbnMgKi8KK2V4dGVybiB6YnVmX3QqIHpmR2V0VnR4cSh6ZGV2X3QqIGRldiwgdThfdCBhYyk7CisKKyNlbmRpZiAvKiAjaWZuZGVmIF9DQUdHX0ggKi8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2NjbWQuYyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9jY21kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDc5OTc3OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9jY21kLmMKQEAgLTAsMCArMSwxODYxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggQXRoZXJvcyBDb21tdW5pY2F0aW9ucyBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kdWxlIE5hbWUgOiBjbWQuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBBYnN0cmFjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFRoaXMgbW9kdWxlIGNvbnRhaW5zIGNvbW1hbmQgaW50ZXJmYWNlIGZ1bmN0aW9ucy4gICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBOT1RFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIE5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSAiY3ByZWNvbXAuaCIKKyNpbmNsdWRlICIuLi9oYWwvaHByZWcuaCIKKworCit1MTZfdCB6ZldsYW5SZXNldCh6ZGV2X3QqIGRldik7Cit1MzJfdCB6ZlVwZGF0ZVJ4UmF0ZSh6ZGV2X3QqIGRldik7CisKKworZXh0ZXJuIHZvaWQgemZpVXNiUmVjdih6ZGV2X3QgKmRldiwgemJ1Zl90ICpidWYpOworZXh0ZXJuIHZvaWQgemZpVXNiUmVnSW4oemRldl90KiBkZXYsIHUzMl90KiByc3AsIHUxNl90IHJzcExlbik7CitleHRlcm4gdm9pZCB6ZmlVc2JPdXRDb21wbGV0ZSh6ZGV2X3QqIGRldiwgemJ1Zl90ICpidWYsIHU4X3Qgc3RhdHVzLCB1OF90ICpoZHIpOworZXh0ZXJuIHZvaWQgemZpVXNiUmVnT3V0Q29tcGxldGUoemRldl90KiBkZXYpOworZXh0ZXJuIHUxNl90IHpmSHBSZWluaXQoemRldl90KiBkZXYsIHUzMl90IGZyZXF1ZW5jeSk7CisKKy8qIEdldCBzaXplIChieXRlKSBvZiBkcml2ZXIgY29yZSBnbG9iYWwgZGF0YSBzdHJ1Y3R1cmUuICAgICovCisvKiBUaGlzIHNpemUgd2lsbCBiZSB1c2VkIGJ5IGRyaXZlciB3cmFwcGVyIHRvIGFsbG9jYXRlICAgICAqLworLyogYSBtZW1vcnkgc3BhY2UgZm9yIGRyaXZlciBjb3JlIHRvIHN0b3JlIGdsb2JhbCB2YXJpYWJsZXMgKi8KK3UxNl90IHpmaUdsb2JhbERhdGFTaXplKHpkZXZfdCogZGV2KQoreworICAgIHUzMl90IHJldDsKKyAgICByZXQgPSAoc2l6ZW9mKHN0cnVjdCB6c1dsYW5EZXYpKTsKKyAgICB6bV9hc3NlcnQoKHJldD4+MTYpID09IDApOworICAgIHJldHVybiAodTE2X3QpcmV0OworfQorCisKKy8qIEluaXRpYWxpemUgV0xBTiBoYXJkd2FyZSBhbmQgc29mdHdhcmUsIHJlc291cmNlIHdpbGwgYmUgYWxsb2NhdGVkICovCisvKiBmb3IgV0xBTiBvcGVyYXRpb24sIG11c3QgYmUgY2FsbGVkIGZpcnN0IGJlZm9yZSBvdGhlciBmdW5jdGlvbi4gICAqLworZXh0ZXJuIHUxNl90IHpmaVdsYW5PcGVuKHpkZXZfdCogZGV2LCBzdHJ1Y3QgenNDYkZ1bmNUYmwqIGNiRnVuY1RibCkKK3sKKyAgICAvL3UxNl90IHJldDsKKyAgICAvL3UzMl90IGk7CisgICAgLy91OF90KiBjaDsKKyAgICAvL3U4X3QgIGJQYXNzaXZlOworICAgIHUzMl90IGRldlNpemU7CisgICAgc3RydWN0IHpmQ2JVc2JGdW5jVGJsIGNiVXNiRnVuY1RibDsKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bV9kZWJ1Z19tc2cwKCJzdGFydCIpOworCisgICAgZGV2U2l6ZSA9IHNpemVvZihzdHJ1Y3QgenNXbGFuRGV2KTsKKyAgICAvKiBaZXJvaXplIHpzV2xhbkRldiBzdHJ1Y3QgKi8KKyAgICB6Zlplcm9NZW1vcnkoKHU4X3QqKXdkLCAodTE2X3QpZGV2U2l6ZSk7CisKKyNpZmRlZiBaTV9FTkFCTEVfQUdHUkVHQVRJT04KKyAgICB6ZkFnZ0luaXQoZGV2KTsKKyNlbmRpZgorCisgICAgemZDd21Jbml0KGRldik7CisKKyAgICB3ZC0+Y29tbVRhbGx5LlJhdGVDdHJsVHhNUERVID0gMDsKKyAgICB3ZC0+Y29tbVRhbGx5LlJhdGVDdHJsQkFGYWlsID0gMDsKKyAgICB3ZC0+cHJlYW1ibGVUeXBlSW5Vc2VkID0gWk1fUFJFQU1CTEVfVFlQRV9TSE9SVDsKKworICAgIGlmIChjYkZ1bmNUYmwgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIC8qIHpmY2JSZWN2RXRoKCkgaXMgbWFuZGF0b3J5ICovCisgICAgICAgIHptX2Fzc2VydCgwKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYgKGNiRnVuY1RibC0+emZjYlJlY3ZFdGggPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgLyogemZjYlJlY3ZFdGgoKSBpcyBtYW5kYXRvcnkgKi8KKyAgICAgICAgICAgIHptX2Fzc2VydCgwKTsKKyAgICAgICAgfQorICAgICAgICB3ZC0+emZjYkF1dGhOb3RpZnkgPSBjYkZ1bmNUYmwtPnpmY2JBdXRoTm90aWZ5OworICAgICAgICB3ZC0+emZjYkF1dGhOb3RpZnkgPSBjYkZ1bmNUYmwtPnpmY2JBdXRoTm90aWZ5OworICAgICAgICB3ZC0+emZjYkFzb2NOb3RpZnkgPSBjYkZ1bmNUYmwtPnpmY2JBc29jTm90aWZ5OworICAgICAgICB3ZC0+emZjYkRpc0Fzb2NOb3RpZnkgPSBjYkZ1bmNUYmwtPnpmY2JEaXNBc29jTm90aWZ5OworICAgICAgICB3ZC0+emZjYkFwQ29ubmVjdE5vdGlmeSA9IGNiRnVuY1RibC0+emZjYkFwQ29ubmVjdE5vdGlmeTsKKyAgICAgICAgd2QtPnpmY2JDb25uZWN0Tm90aWZ5ID0gY2JGdW5jVGJsLT56ZmNiQ29ubmVjdE5vdGlmeTsKKyAgICAgICAgd2QtPnpmY2JTY2FuTm90aWZ5ID0gY2JGdW5jVGJsLT56ZmNiU2Nhbk5vdGlmeTsKKyAgICAgICAgd2QtPnpmY2JNaWNGYWlsdXJlTm90aWZ5ID0gY2JGdW5jVGJsLT56ZmNiTWljRmFpbHVyZU5vdGlmeTsKKyAgICAgICAgd2QtPnpmY2JBcE1pY0ZhaWx1cmVOb3RpZnkgPSBjYkZ1bmNUYmwtPnpmY2JBcE1pY0ZhaWx1cmVOb3RpZnk7CisgICAgICAgIHdkLT56ZmNiSWJzc1BhcnRuZXJOb3RpZnkgPSBjYkZ1bmNUYmwtPnpmY2JJYnNzUGFydG5lck5vdGlmeTsKKyAgICAgICAgd2QtPnpmY2JNYWNBZGRyZXNzTm90aWZ5ID0gY2JGdW5jVGJsLT56ZmNiTWFjQWRkcmVzc05vdGlmeTsKKyAgICAgICAgd2QtPnpmY2JTZW5kQ29tcGxldGVJbmRpY2F0aW9uID0gY2JGdW5jVGJsLT56ZmNiU2VuZENvbXBsZXRlSW5kaWNhdGlvbjsKKyAgICAgICAgd2QtPnpmY2JSZWN2RXRoID0gY2JGdW5jVGJsLT56ZmNiUmVjdkV0aDsKKyAgICAgICAgd2QtPnpmY2JSZXN0b3JlQnVmRGF0YSA9IGNiRnVuY1RibC0+emZjYlJlc3RvcmVCdWZEYXRhOworICAgICAgICB3ZC0+emZjYlJlY3Y4MDIxMSA9IGNiRnVuY1RibC0+emZjYlJlY3Y4MDIxMTsKKyNpZmRlZiBaTV9FTkFCTEVfQ0VOQworICAgICAgICB3ZC0+emZjYkNlbmNBc29jTm90aWZ5ID0gY2JGdW5jVGJsLT56ZmNiQ2VuY0Fzb2NOb3RpZnk7CisjZW5kaWYgLy9aTV9FTkFCTEVfQ0VOQworICAgICAgICB3ZC0+emZjYkNsYXNzaWZ5VHhQYWNrZXQgPSBjYkZ1bmNUYmwtPnpmY2JDbGFzc2lmeVR4UGFja2V0OworICAgICAgICB3ZC0+emZjYkh3V2F0Y2hEb2dOb3RpZnkgPSBjYkZ1bmNUYmwtPnpmY2JId1dhdGNoRG9nTm90aWZ5OworICAgIH0KKworICAgIC8vYWRkIGJ5IGhvbmRhIDAzMzAKKyAgICBjYlVzYkZ1bmNUYmwuemZjYlVzYlJlY3YgPSB6ZmlVc2JSZWN2OworICAgIGNiVXNiRnVuY1RibC56ZmNiVXNiUmVnSW4gPSB6ZmlVc2JSZWdJbjsKKyAgICBjYlVzYkZ1bmNUYmwuemZjYlVzYk91dENvbXBsZXRlID0gemZpVXNiT3V0Q29tcGxldGU7CisgICAgY2JVc2JGdW5jVGJsLnpmY2JVc2JSZWdPdXRDb21wbGV0ZSA9IHpmaVVzYlJlZ091dENvbXBsZXRlOworICAgIHpmd1VzYlJlZ2lzdGVyQ2FsbEJhY2soZGV2LCAmY2JVc2JGdW5jVGJsKTsKKyAgICAvKiBJbml0IE9XTiBNQUMgYWRkcmVzcyAqLworICAgIHdkLT5tYWNBZGRyWzBdID0gMHg4MDAwOworICAgIHdkLT5tYWNBZGRyWzFdID0gMHgwMDAwOworICAgIHdkLT5tYWNBZGRyWzJdID0gMHgwMDAwOworCisgICAgd2QtPnJlZ3VsYXRpb25UYWJsZS5yZWdpb25Db2RlID0gMHhmZmZmOworCisgICAgemZIcEluaXQoZGV2LCB3ZC0+ZnJlcXVlbmN5KTsKKworICAgIC8qIGluaXQgcmVnaW9uIGNvZGUgKi8KKyAgICAvL3dkLT5yZWd1bGF0aW9uVGFibGUucmVnaW9uQ29kZSA9IE5VTEwxX1dPUkxEOyAvL09ubHkgMi40ZyBSZWdDb2RlCisgICAgLy96ZkhwR2V0UmVndWxhdGlvblRhYmxlZnJvbVJlZ2lvbkNvZGUoZGV2LCBOVUxMMV9XT1JMRCk7CisgICAgLy96ZmlXbGFuU2V0RG90MTFETW9kZShkZXYgLCAxKTsgLy8gRW5hYmxlIDgwMi4xMWQKKyAgICAvKiBHZXQgdGhlIGZpcnN0IGNoYW5uZWwgKi8KKyAgICAvL3dkLT5mcmVxdWVuY3kgPSB6ZkNoR2V0Rmlyc3RDaGFubmVsKGRldiwgJmJQYXNzaXZlKTsKKyNpZmRlZiBaTV9BUF9ERUJVRworICAgIC8vd2QtPmZyZXF1ZW5jeSA9IDI0Mzc7CisjZW5kaWYKKworICAgIC8vU1RBIG1vZGUKKyAgICB3ZC0+c3RhLm1UeFJhdGUgPSAweDA7CisgICAgd2QtPnN0YS51VHhSYXRlID0gMHgzOworICAgIHdkLT5zdGEubW1UeFJhdGUgPSAweDA7CisgICAgd2QtPnN0YS5hZGFwdGVyU3RhdGUgPSBaTV9TVEFfU1RBVEVfRElTQ09OTkVDVDsKKyAgICB3ZC0+c3RhLmNhcGFiaWxpdHlbMF0gPSAweDAxOworICAgIHdkLT5zdGEuY2FwYWJpbGl0eVsxXSA9IDB4MDA7CisKKyAgICB3ZC0+c3RhLnByZWFtYmxlVHlwZUhUID0gMDsKKyAgICB3ZC0+c3RhLmh0Q3RybEJhbmR3aWR0aCA9IDA7CisgICAgd2QtPnN0YS5odEN0cmxTVEJDID0gMDsKKyAgICB3ZC0+c3RhLmh0Q3RybFNHID0gMDsKKyAgICB3ZC0+c3RhLmRlZmF1bHRUQSA9IDA7CisgICAgLy93ZC0+c3RhLmFjdGl2ZXNjYW5UaWNrUGVyQ2hhbm5lbCA9IFpNX1RJTUVfQUNUSVZFX1NDQU4vWk1fTVNfUEVSX1RJQ0s7CisJeworCQl1OF90IER1ciA9IFpNX1RJTUVfQUNUSVZFX1NDQU47CisJCXpmd0dldEFjdGl2ZVNjYW5EdXIoZGV2LCAmRHVyKTsKKwkJd2QtPnN0YS5hY3RpdmVzY2FuVGlja1BlckNoYW5uZWwgPSBEdXIvWk1fTVNfUEVSX1RJQ0s7CisKKwl9CisgICAgd2QtPnN0YS5wYXNzaXZlU2NhblRpY2tQZXJDaGFubmVsID0gWk1fVElNRV9QQVNTSVZFX1NDQU4vWk1fTVNfUEVSX1RJQ0s7CisgICAgd2QtPnN0YS5iQXV0b1JlY29ubmVjdCA9IFRSVUU7CisgICAgd2QtPnN0YS5kcm9wVW5lbmNyeXB0ZWRQa3RzID0gRkFMU0U7CisKKyAgICAvKiBzZXQgZGVmYXVsdCB0byBieXBhc3MgYWxsIG11bHRpY2FzdCBwYWNrZXQgZm9yIGxpbnV4LCB3aW5kb3cgWFAgd291bGQgc2V0IDAgYnkgd3JhcHBlciBpbml0aWFsaXphdGlvbiAqLworCXdkLT5zdGEuYkFsbE11bHRpY2FzdCA9IDE7CisKKyAgICAvKiBJbml0aWFsIHRoZSBSSUZTIFN0YXR1cyAvIFJJRlMtbGlrZSBmcmFtZSBjb3VudCAvIFJJRlMgY291bnQgKi8KKyAgICB3ZC0+c3RhLnJpZnNTdGF0ZSA9IFpNX1JJRlNfU1RBVEVfREVURUNUSU5HOworICAgIHdkLT5zdGEucmlmc0xpa2VGcmFtZUNudCA9IDA7CisgICAgd2QtPnN0YS5yaWZzQ291bnQgPSAwOworCisgICAgd2QtPnN0YS5vc1J4RmlsdGVyID0gMDsKKyAgICB3ZC0+c3RhLmJTYWZlTW9kZSA9IDA7CisKKyAgICAvL0NvbW1vbgorICAgIHpmUmVzZXRTdXBwb3J0UmF0ZShkZXYsIFpNX0RFRkFVTFRfU1VQUE9SVF9SQVRFX0RJU0NPTk5FQ1QpOworICAgIHdkLT5iZWFjb25JbnRlcnZhbCA9IDEwMDsKKyAgICB3ZC0+cnRzVGhyZXNob2xkID0gMjM0NjsKKyAgICB3ZC0+ZnJhZ1RocmVzaG9sZCA9IDMyNzY3OworICAgIHdkLT53bGFuTW9kZSA9IFpNX01PREVfSU5GUkFTVFJVQ1RVUkU7CisgICAgd2QtPnR4TUNTID0gMHhmZjsgICAgLy9BVVRPCisgICAgd2QtPmR0aW0gPSAxOworICAgIC8vd2QtPnR4TVQgPSAxOyAgICAgICAvL09GRE0KKyAgICB3ZC0+dGljayA9IDE7CisgICAgd2QtPm1heFR4UG93ZXIyID0gMHhmZjsKKyAgICB3ZC0+bWF4VHhQb3dlcjUgPSAweGZmOworICAgIHdkLT5zdXBwb3J0TW9kZSA9IDB4ZmZmZmZmZmY7CisgICAgd2QtPndzLmFkaG9jTW9kZSA9IFpNX0FESE9DQkFORF9HOworICAgIHdkLT53cy5hdXRvU2V0RnJlcXVlbmN5ID0gMHhmZjsKKworICAgIC8vQVAgbW9kZQorICAgIC8vd2QtPmJnTW9kZSA9IHdkLT53cy5iZ01vZGU7CisgICAgd2QtPmFwLnNzaWRMZW5bMF0gPSA2OworICAgIHdkLT5hcC5zc2lkWzBdWzBdID0gJ1onOworICAgIHdkLT5hcC5zc2lkWzBdWzFdID0gJ0QnOworICAgIHdkLT5hcC5zc2lkWzBdWzJdID0gJzEnOworICAgIHdkLT5hcC5zc2lkWzBdWzNdID0gJzInOworICAgIHdkLT5hcC5zc2lkWzBdWzRdID0gJzInOworICAgIHdkLT5hcC5zc2lkWzBdWzVdID0gJzEnOworCisgICAgLy8gSW5pdCB0aGUgY291bnRyeSBpc28gbmFtZSBhcyBOQQorICAgIHdkLT53cy5jb3VudHJ5SXNvTmFtZVswXSA9IDA7CisgICAgd2QtPndzLmNvdW50cnlJc29OYW1lWzFdID0gMDsKKyAgICB3ZC0+d3MuY291bnRyeUlzb05hbWVbMl0gPSAnXDAnOworCisJLyogaW5pdCBmcmFnbWVudGF0aW9uIGlzIGRpc2FibGVkICovCisJLy96ZmlXbGFuU2V0RnJhZ1RocmVzaG9sZChkZXYsIDApOworCisJLyogYWlyb3BlZWsgOiBzd1NuaWZmZXIgMT0+b24gIDA9Pm9mZiAqLworCXdkLT5zd1NuaWZmZXIgPSAwOworICAgIHdkLT5YTGlua01vZGUgPSAwOworCisvLyBqaGxlZSBIVCAwCisjaWYgMQorICAgIC8qIEFQIE1vZGUqLworICAgIC8qIEluaXQgSFQgQ2FwYWJpbGl0eSBJbmZvICovCisgICAgd2QtPmFwLkhUQ2FwLkRhdGEuRWxlbWVudElEID0gWk1fV0xBTl9FSURfSFRfQ0FQQUJJTElUWTsKKyAgICB3ZC0+YXAuSFRDYXAuRGF0YS5MZW5ndGggPSAyNjsKKyAgICAvL3dkLT5hcC5IVENhcC5EYXRhLlN1cENoYW5uZWxXaWR0aFNldCA9IDA7CisgICAgLy93ZC0+YXAuSFRDYXAuRGF0YS5NSU1PUG93ZXJTYXZlID0gMzsKKyAgICAvL3dkLT5hcC5IVENhcC5EYXRhLlNob3J0R0lmb3I0ME1IeiA9IDA7CisgICAgLy93ZC0+YXAuSFRDYXAuRGF0YS5TaG9ydEdJZm9yMjBNSHogPSAwOworICAgIC8vd2QtPmFwLkhUQ2FwLkRhdGEuRFNTU2FuZENDS2luNDBNSHogPSAwOworICAgIHdkLT5hcC5IVENhcC5EYXRhLkFNUERVUGFyYW0gfD0gSFRDQVBfTWF4UnhBTVBEVTM7CisgICAgd2QtPmFwLkhUQ2FwLkRhdGEuTUNTU2V0WzBdID0gMHhGRjsgLy8gTUNTIDAgfiAgNworICAgIHdkLT5hcC5IVENhcC5EYXRhLk1DU1NldFsxXSA9IDB4RkY7IC8vIE1DUyA4IH4gMTUKKworICAgIC8qIEluaXQgRXh0ZW5kZWQgSFQgQ2FwYWJpbGl0eSBJbmZvICovCisgICAgd2QtPmFwLkV4dEhUQ2FwLkRhdGEuRWxlbWVudElEID0gWk1fV0xBTl9FSURfRVhURU5ERURfSFRfQ0FQQUJJTElUWTsKKyAgICB3ZC0+YXAuRXh0SFRDYXAuRGF0YS5MZW5ndGggPSAyMjsKKyAgICB3ZC0+YXAuRXh0SFRDYXAuRGF0YS5Db250cm9sQ2hhbm5lbCA9IDY7CisgICAgLy93ZC0+YXAuRXh0SFRDYXAuRGF0YS5FeHRDaGFubmVsT2Zmc2V0ID0gMzsKKyAgICB3ZC0+YXAuRXh0SFRDYXAuRGF0YS5DaGFubmVsSW5mbyB8PSBFeHRIdENhcF9SZWNvbVR4V2lkdGhTZXQ7CisgICAgLy93ZC0+YXAuRXh0SFRDYXAuRGF0YS5SSUZTTW9kZSA9IDE7CisgICAgd2QtPmFwLkV4dEhUQ2FwLkRhdGEuT3BlcmF0aW5nSW5mbyB8PSAxOworCisgICAgLyogU1RBIE1vZGUqLworICAgIC8qIEluaXQgSFQgQ2FwYWJpbGl0eSBJbmZvICovCisgICAgd2QtPnN0YS5IVENhcC5EYXRhLkVsZW1lbnRJRCA9IFpNX1dMQU5fRUlEX0hUX0NBUEFCSUxJVFk7CisgICAgd2QtPnN0YS5IVENhcC5EYXRhLkxlbmd0aCA9IDI2OworCisgICAgLyogVGVzdCB3aXRoIDVHLUFQIDogNzYwMyAqLworICAgIC8vd2QtPnN0YS5IVENhcC5EYXRhLlN1cENoYW5uZWxXaWR0aFNldCA9IDE7CisgICAgd2QtPnN0YS5IVENhcC5EYXRhLkh0Q2FwSW5mbyB8PSBIVENBUF9TTUVuYWJsZWQ7CisgICAgd2QtPnN0YS5IVENhcC5EYXRhLkh0Q2FwSW5mbyB8PSBIVENBUF9TdXBDaGFubmVsV2lkdGhTZXQ7CisgICAgd2QtPnN0YS5IVENhcC5EYXRhLkh0Q2FwSW5mbyB8PSBIVENBUF9TaG9ydEdJZm9yNDBNSHo7CisgICAgd2QtPnN0YS5IVENhcC5EYXRhLkh0Q2FwSW5mbyB8PSBIVENBUF9EU1NTYW5kQ0NLaW40ME1IejsKKyNpZm5kZWYgWk1fRElTQUJMRV9BTVNEVThLX1NVUFBPUlQKKyAgICB3ZC0+c3RhLkhUQ2FwLkRhdGEuSHRDYXBJbmZvIHw9IEhUQ0FQX01heEFNU0RVTGVuZ3RoOworI2VuZGlmCisgICAgLy93ZC0+c3RhLkhUQ2FwLkRhdGEuTUlNT1Bvd2VyU2F2ZSA9IDA7CisgICAgLy93ZC0+c3RhLkhUQ2FwLkRhdGEuU2hvcnRHSWZvcjQwTUh6ID0gMDsKKyAgICAvL3dkLT5zdGEuSFRDYXAuRGF0YS5TaG9ydEdJZm9yMjBNSHogPSAwOworICAgIC8vd2QtPnN0YS5IVENhcC5EYXRhLkRTU1NhbmRDQ0tpbjQwTUh6ID0gMDsKKyAgICB3ZC0+c3RhLkhUQ2FwLkRhdGEuQU1QRFVQYXJhbSB8PSBIVENBUF9NYXhSeEFNUERVMzsKKyAgICB3ZC0+c3RhLkhUQ2FwLkRhdGEuTUNTU2V0WzBdID0gMHhGRjsgLy8gTUNTIDAgfiAgNworICAgIHdkLT5zdGEuSFRDYXAuRGF0YS5NQ1NTZXRbMV0gPSAweEZGOyAvLyBNQ1MgOCB+IDE1CisgICAgd2QtPnN0YS5IVENhcC5EYXRhLlBDTyB8PSBIVENBUF9UcmFuc21pc3Npb25UaW1lMzsKKyAgICAvL3dkLT5zdGEuSFRDYXAuRGF0YS5UcmFuc21pc3Npb25UaW1lID0gMDsKKyAgICAvKiBJbml0IEV4dGVuZGVkIEhUIENhcGFiaWxpdHkgSW5mbyAqLworICAgIHdkLT5zdGEuRXh0SFRDYXAuRGF0YS5FbGVtZW50SUQgPSBaTV9XTEFOX0VJRF9FWFRFTkRFRF9IVF9DQVBBQklMSVRZOworICAgIHdkLT5zdGEuRXh0SFRDYXAuRGF0YS5MZW5ndGggPSAyMjsKKyAgICB3ZC0+c3RhLkV4dEhUQ2FwLkRhdGEuQ29udHJvbENoYW5uZWwgPSA2OworCisgICAgLy93ZC0+c3RhLkV4dEhUQ2FwLkRhdGEuRXh0Q2hhbm5lbE9mZnNldCB8PSAzOworICAgIHdkLT5zdGEuRXh0SFRDYXAuRGF0YS5DaGFubmVsSW5mbyB8PSBFeHRIdENhcF9FeHRDaGFubmVsT2Zmc2V0QmVsb3c7CisKKyAgICAvL3dkLT5zdGEuRXh0SFRDYXAuRGF0YS5SZWNvbVR4V2lkdGhTZXQgPSAxOworICAgIC8vd2QtPnN0YS5FeHRIVENhcC5EYXRhLlJJRlNNb2RlID0gMTsKKyAgICB3ZC0+c3RhLkV4dEhUQ2FwLkRhdGEuT3BlcmF0aW5nSW5mbyB8PSAxOworI2VuZGlmCisKKyNpZiAwCisgICAgLyogV01FIHRlc3QgY29kZSAqLworICAgIHdkLT5hcC5xb3NNb2RlWzBdID0gMTsKKyNlbmRpZgorCisgICAgd2QtPmxlZFN0cnVjdC5sZWRNb2RlWzBdID0gMHgyMjIxOworICAgIHdkLT5sZWRTdHJ1Y3QubGVkTW9kZVsxXSA9IDB4MjIyMTsKKworICAgIHpmVGltZXJJbml0KGRldik7CisKKyAgICBaTV9QRVJGT1JNQU5DRV9JTklUKGRldik7CisKKyAgICB6ZkJzc0luZm9DcmVhdGUoZGV2KTsKKyAgICB6ZlNjYW5NZ3JJbml0KGRldik7CisgICAgemZQb3dlclNhdmluZ01nckluaXQoZGV2KTsKKworI2lmIDAKKyAgICAvKiBUZXN0IGNvZGUgKi8KKyAgICB7CisgICAgICAgIHUzMl90IGtleVs0XSA9IHsweGZmZmZmZmZmLCAweGZmLCAwLCAwfTsKKyAgICAgICAgdTE2X3QgYWRkclszXSA9IHsweDgwMDAsIDB4MDFhYiwgMHgwMDAwfTsKKyAgICAgICAgLy96ZlNldEtleShkZXYsIDAsIDAsIFpNX1dFUDY0LCBhZGRyLCBrZXkpOworICAgICAgICAvL3pmU2V0S2V5KGRldiwgMCwgMCwgWk1fQUVTLCBhZGRyLCBrZXkpOworICAgICAgICAvL3pmU2V0S2V5KGRldiwgNjQsIDAsIDEsIHdkLT5tYWNBZGRyLCBrZXkpOworICAgIH0KKyNlbmRpZgorCisgICAgLy8gV01FIHNldHRpbmdzCisgICAgd2QtPndzLnN0YVdtZUVuYWJsZWQgPSAxOyAgICAgICAgICAgLy8gRW5hYmxlIFdNRSBieSBkZWZhdWx0CisgICAgI2RlZmluZSBaTV9VQVBTRF9RX1NJWkUgMzIgLy8yXk4KKyAgICB3ZC0+YXAudWFwc2RRID0gemZRdWV1ZUNyZWF0ZShkZXYsIFpNX1VBUFNEX1FfU0laRSk7CisgICAgem1fYXNzZXJ0KHdkLT5hcC51YXBzZFEgIT0gTlVMTCk7CisgICAgd2QtPnN0YS51YXBzZFEgPSB6ZlF1ZXVlQ3JlYXRlKGRldiwgWk1fVUFQU0RfUV9TSVpFKTsKKyAgICB6bV9hc3NlcnQod2QtPnN0YS51YXBzZFEgIT0gTlVMTCk7CisKKyAgICAvL3pmSHBJbml0KGRldiwgd2QtPmZyZXF1ZW5jeSk7CisKKyAgICAvKiBNQUMgYWRkcmVzcyAqLworICAgIC8vemZIcFNldE1hY0FkZHJlc3MoZGV2LCB3ZC0+bWFjQWRkciwgMCk7CisgICAgemZIcEdldE1hY0FkZHJlc3MoZGV2KTsKKworICAgIHpmQ29yZVNldEZyZXF1ZW5jeShkZXYsIHdkLT5mcmVxdWVuY3kpOworCisjaWYgWk1fUENJX0xPT1BfQkFDSyA9PSAxCisgICAgemZ3V3JpdGVSZWcoZGV2LCBaTV9SRUdfUENJX0NPTlRST0wsIDYpOworI2VuZGlmIC8qICNpZiBaTV9QQ0lfTE9PUF9CQUNLID09IDEgKi8KKworICAgIC8vemZpV2xhblNldERvdDExRE1vZGUoZGV2ICwgMSk7IC8vIEVuYWJsZSA4MDIuMTFkCisgICAgLy96ZmlXbGFuU2V0RG90MTFIREZTTW9kZShkZXYgLCAxKTsgLy8gRW5hYmxlIDgwMi4xMWggREZTCisgICAgd2QtPnN0YS5ERlNFbmFibGUgPSAxOworICAgIHdkLT5zdGEuY2FwYWJpbGl0eVsxXSB8PSBaTV9CSVRfMDsKKworICAgIC8vemZpV2xhblNldEZyZXF1ZW5jeShkZXYsIDUyNjAwMDAsIFRSVUUpOworICAgIC8vemZpV2xhblNldEFuaU1vZGUoZGV2ICwgMSk7IC8vIEVuYWJsZSBBTkkKKworICAgIC8qIFRyZ2dlciBSeCBETUEgKi8KKyAgICB6ZkhwU3RhcnRSZWN2KGRldik7CisKKyAgICB6bV9kZWJ1Z19tc2cwKCJlbmQiKTsKKworICAgIHJldHVybiAwOworfQorCisvKiBXTEFOIGhhcmR3YXJlIHdpbGwgYmUgc2h1dGRvd24gYW5kIGFsbCByZXNvdXJjZSB3aWxsIGJlIHJlbGVhc2UgKi8KK3UxNl90IHpmaVdsYW5DbG9zZSh6ZGV2X3QqIGRldikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bV9tc2cwX2luaXQoWk1fTFZfMCwgImVudGVyIik7CisKKyAgICB3ZC0+c3RhdGUgPSBaTV9XTEFOX1NUQVRFX0NMT1NFREVEOworCisgICAgLy96ZmlXbGFuRGlzYWJsZShkZXYsIDEpOworICAgIHpmV2xhblJlc2V0KGRldik7CisKKyAgICB6ZkhwU3RvcFJlY3YoZGV2KTsKKworICAgIC8qIERpc2FibGUgTUFDICovCisgICAgLyogRGlzYWJsZSBQSFkgKi8KKyAgICAvKiBEaXNhYmxlIFJGICovCisKKyAgICB6ZkhwUmVsZWFzZShkZXYpOworCisgICAgemZRdWV1ZURlc3Ryb3koZGV2LCB3ZC0+YXAudWFwc2RRKTsKKyAgICB6ZlF1ZXVlRGVzdHJveShkZXYsIHdkLT5zdGEudWFwc2RRKTsKKworICAgIHpmQnNzSW5mb0Rlc3Ryb3koZGV2KTsKKworI2lmZGVmIFpNX0VOQUJMRV9BR0dSRUdBVElPTgorICAgIC8qIGFkZCBieSBob25kYSAqLworICAgIHpmQWdnUnhGcmVlQnVmKGRldiwgMSk7ICAvLzEgZm9yIHJlbGVhc2Ugc3RydWN0dXJlIG1lbW9yeQorICAgIC8qIGVuZCBvZiBhZGQgYnkgaG9uZGEgKi8KKyNlbmRpZgorCisgICAgem1fbXNnMF9pbml0KFpNX0xWXzAsICJleGl0Iik7CisKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCB6ZkdldFdyYXBwZXJTZXR0aW5nKHpkZXZfdCogZGV2KQoreworICAgIHU4X3QgICBiUGFzc2l2ZTsKKyAgICB1MTZfdCB2YXBJZCA9IDA7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworI2lmIDAKKyAgICBpZiAoICh3ZC0+d3MuY291bnRyeUlzb05hbWVbMF0gIT0gMCkKKyAgICAgICAgIHx8ICh3ZC0+d3MuY291bnRyeUlzb05hbWVbMV0gIT0gMCkKKyAgICAgICAgIHx8ICh3ZC0+d3MuY291bnRyeUlzb05hbWVbMl0gIT0gJ1wwJykgKQorICAgIHsKKyAgICAgICAgemZIcEdldFJlZ3VsYXRpb25UYWJsZWZyb21SZWdpb25Db2RlKAorICAgICAgICAgICAgZGV2LAorICAgICAgICAgICAgemZIcEdldFJlZ2lvbkNvZGVGcm9tSXNvTmFtZShkZXYsIHdkLT53cy5jb3VudHJ5SXNvTmFtZSkgKTsKKyAgICB9CisjZW5kaWYKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgd2QtPndsYW5Nb2RlID0gd2QtPndzLndsYW5Nb2RlOworCisgICAgLyogc2V0IGNoYW5uZWwgKi8KKyAgICBpZiAoIHdkLT53cy5mcmVxdWVuY3kgKQorICAgIHsKKyAgICAgICAgd2QtPmZyZXF1ZW5jeSA9IHdkLT53cy5mcmVxdWVuY3k7CisgICAgICAgIHdkLT53cy5mcmVxdWVuY3kgPSAwOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB3ZC0+ZnJlcXVlbmN5ID0gemZDaEdldEZpcnN0Q2hhbm5lbChkZXYsICZiUGFzc2l2ZSk7CisKKyAgICAgICAgaWYgKCB3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9JQlNTICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHdkLT53cy5hZGhvY01vZGUgPT0gWk1fQURIT0NCQU5EX0EpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2QtPmZyZXF1ZW5jeSA9IFpNX0NIX0FfMzY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICB3ZC0+ZnJlcXVlbmN5ID0gWk1fQ0hfR182OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorI2lmZGVmIFpNX0FQX0RFQlVHCisgICAgLyogaG9uZGEgYWRkIGZvciBkZWJ1ZywgMjQzNyBjaGFubmVsIDYsIDI0NTIgY2hhbm5lbCA5ICovCisgICAgd2QtPmZyZXF1ZW5jeSA9IDI0Mzc7CisgICAgLyogZW5kIG9mIGFkZCBieSBob25kYSAqLworI2VuZGlmCisKKyAgICAvKiBzZXQgcHJlYW1ibGUgdHlwZSAqLworICAgIHN3aXRjaCAod2QtPndzLnByZWFtYmxlVHlwZSkKKyAgICB7CisgICAgY2FzZSBaTV9QUkVBTUJMRV9UWVBFX0FVVE86CisgICAgY2FzZSBaTV9QUkVBTUJMRV9UWVBFX1NIT1JUOgorICAgIGNhc2UgWk1fUFJFQU1CTEVfVFlQRV9MT05HOgorICAgICAgICB3ZC0+cHJlYW1ibGVUeXBlID0gd2QtPndzLnByZWFtYmxlVHlwZTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgd2QtPnByZWFtYmxlVHlwZSA9IFpNX1BSRUFNQkxFX1RZUEVfU0hPUlQ7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICB3ZC0+d3MucHJlYW1ibGVUeXBlID0gMDsKKworICAgIGlmICggd2QtPndsYW5Nb2RlID09IFpNX01PREVfQVAgKQorICAgIHsKKyAgICAgICAgdmFwSWQgPSB6ZndHZXRWYXBJZChkZXYpOworCisgICAgICAgIGlmICh2YXBJZCA9PSAweGZmZmYpCisgICAgICAgIHsKKyAgICAgICAgICAgIHdkLT5hcC5hdXRoQWxnb1swXSA9IHdkLT53cy5hdXRoTW9kZTsKKyAgICAgICAgICAgIHdkLT5hcC5lbmNyeU1vZGVbMF0gPSB3ZC0+d3MuZW5jcnlNb2RlOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgd2QtPmFwLmF1dGhBbGdvW3ZhcElkICsgMV0gPSB3ZC0+d3MuYXV0aE1vZGU7CisgICAgICAgICAgICB3ZC0+YXAuZW5jcnlNb2RlW3ZhcElkICsgMV0gPSB3ZC0+d3MuZW5jcnlNb2RlOworICAgICAgICB9CisgICAgICAgIHdkLT53cy5hdXRoTW9kZSA9IDA7CisgICAgICAgIHdkLT53cy5lbmNyeU1vZGUgPSBaTV9OT19XRVA7CisKKyAgICAgICAgLyogR2V0IGJlYWNvbkludGVydmFsIGZyb20gV3JhcHBlclNldHRpbmcgKi8KKyAgICAgICAgaWYgKCh3ZC0+d3MuYmVhY29uSW50ZXJ2YWwgPj0gMjApICYmICh3ZC0+d3MuYmVhY29uSW50ZXJ2YWwgPD0gMTAwMCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHdkLT5iZWFjb25JbnRlcnZhbCA9IHdkLT53cy5iZWFjb25JbnRlcnZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHdkLT5iZWFjb25JbnRlcnZhbCA9IDEwMDsgLy8xMDBtcworICAgICAgICB9CisKKyAgICAgICAgaWYgKHdkLT53cy5kdGltID4gMCkKKyAgICAgICAgeworICAgICAgICAgICAgd2QtPmR0aW0gPSB3ZC0+d3MuZHRpbTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHdkLT5kdGltID0gMTsKKyAgICAgICAgfQorCisgICAgICAgIHdkLT5hcC5xb3NNb2RlID0gd2QtPndzLmFwV21lRW5hYmxlZCAmIDB4MTsKKyAgICAgICAgd2QtPmFwLnVhcHNkRW5hYmxlZCA9ICh3ZC0+d3MuYXBXbWVFbmFibGVkICYgMHgyKSA+PiAxOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB3ZC0+c3RhLmF1dGhNb2RlID0gd2QtPndzLmF1dGhNb2RlOworICAgICAgICB3ZC0+c3RhLmN1cnJlbnRBdXRoTW9kZSA9IHdkLT53cy5hdXRoTW9kZTsKKyAgICAgICAgd2QtPnN0YS53ZXBTdGF0dXMgPSB3ZC0+d3Mud2VwU3RhdHVzOworCisgICAgICAgIGlmICggd2QtPndzLmJlYWNvbkludGVydmFsICkKKyAgICAgICAgeworICAgICAgICAgICAgd2QtPmJlYWNvbkludGVydmFsID0gd2QtPndzLmJlYWNvbkludGVydmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgd2QtPmJlYWNvbkludGVydmFsID0gMHg2NDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICggd2QtPndsYW5Nb2RlID09IFpNX01PREVfSUJTUyApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIDEuIFNldCBkZWZhdWx0IGNoYW5uZWwgNiAoMjQzN01IeikgKi8KKy8vICAgICAgICAgICAgd2QtPmZyZXF1ZW5jeSA9IDI0Mzc7CisKKyAgICAgICAgICAgIC8qIDIuIE90dXMgc3VwcG9ydCA4MDIuMTFnIE1vZGUgKi8KKyAgICAgICAgICAgIGlmICgod2QtPndzLmFkaG9jTW9kZSA9PSBaTV9BREhPQ0JBTkRfRykgfHwKKyAgICAgICAgICAgICAgICAod2QtPndzLmFkaG9jTW9kZSA9PSBaTV9BREhPQ0JBTkRfQkcpIHx8CisgICAgICAgICAgICAgICAgKHdkLT53cy5hZGhvY01vZGUgPT0gWk1fQURIT0NCQU5EX0FCRykgKSB7CisgICAgICAgICAgICAgICAgd2QtPndmYy5iSWJzc0dNb2RlID0gMTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgd2QtPndmYy5iSWJzc0dNb2RlID0gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogMy4gc2V0IHNob3J0IHByZWFtYmxlICAqLworICAgICAgICAgICAgLy93ZC0+c3RhLnByZWFtYmxlVHlwZSA9IFpNX1BSRUFNQkxFX1RZUEVfU0hPUlQgOworICAgICAgICB9CisKKyAgICAgICAgLyogc2V0IEFUSU0gd2luZG93ICovCisgICAgICAgIGlmICggd2QtPndzLmF0aW1XaW5kb3cgKQorICAgICAgICB7CisgICAgICAgICAgICB3ZC0+c3RhLmF0aW1XaW5kb3cgPSB3ZC0+d3MuYXRpbVdpbmRvdzsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vd2QtPnN0YS5hdGltV2luZG93ID0gMHgwYTsKKyAgICAgICAgICAgIHdkLT5zdGEuYXRpbVdpbmRvdyA9IDA7CisgICAgICAgIH0KKworICAgICAgICAvL3dkLT5zdGEuY29ubmVjdGluZ0hpZGRlbkFQID0gMTsvL3dkLT53cy5jb25uZWN0aW5nSGlkZGVuQVA7CisgICAgICAgIHdkLT5zdGEuZHJvcFVuZW5jcnlwdGVkUGt0cyA9IHdkLT53cy5kcm9wVW5lbmNyeXB0ZWRQa3RzOworICAgICAgICB3ZC0+c3RhLmlic3NKb2luT25seSA9IHdkLT53cy5pYnNzSm9pbk9ubHk7CisKKyAgICAgICAgaWYgKCB3ZC0+d3MuYkRlc2lyZWRCc3NpZCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHpmTWVtb3J5Q29weSh3ZC0+c3RhLmRlc2lyZWRCc3NpZCwgd2QtPndzLmRlc2lyZWRCc3NpZCwgNik7CisgICAgICAgICAgICB3ZC0+c3RhLmJEZXNpcmVkQnNzaWQgPSBUUlVFOworICAgICAgICAgICAgd2QtPndzLmJEZXNpcmVkQnNzaWQgPSBGQUxTRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHdkLT5zdGEuYkRlc2lyZWRCc3NpZCA9IEZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgLyogY2hlY2sgc3NpZCAqLworICAgICAgICBpZiAoIHdkLT53cy5zc2lkTGVuICE9IDAgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoICghemZNZW1vcnlJc0VxdWFsKHdkLT53cy5zc2lkLCB3ZC0+c3RhLnNzaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEuc3NpZExlbikpfHwKKyAgICAgICAgICAgICAgICAgKHdkLT53cy5zc2lkTGVuICE9IHdkLT5zdGEuc3NpZExlbil8fAorICAgICAgICAgICAgICAgICAod2QtPnN0YS5hdXRoTW9kZSA9PSBaTV9BVVRIX01PREVfV1BBKXx8CisgICAgICAgICAgICAgICAgICh3ZC0+c3RhLmF1dGhNb2RlID09IFpNX0FVVEhfTU9ERV9XUEFQU0spIHx8CisgICAgICAgICAgICAgICAgICh3ZC0+d3Muc3RhV21lUW9zSW5mbyE9IDApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKmlmIHUtQVBTRCB0ZXN0KHNldCBRb3NJbmZvKSwgY2xlYXIgY29ubmVjdEJ5UmVhc3NvIHRvIGRvIGFzc29jaWF0aW9uIChub3QgcmVhc3NvY2lhdGlvbikqLworICAgICAgICAgICAgICAgIHdkLT5zdGEuY29ubmVjdEJ5UmVhc3NvID0gRkFMU0U7CisgICAgICAgICAgICAgICAgd2QtPnN0YS5mYWlsQ250T2ZSZWFzc28gPSAwOworICAgICAgICAgICAgICAgIHdkLT5zdGEucG1raWRJbmZvLmJzc2lkQ291bnQgPSAwOworCisgICAgICAgICAgICAgICAgd2QtPnN0YS5zc2lkTGVuID0gd2QtPndzLnNzaWRMZW47CisgICAgICAgICAgICAgICAgemZNZW1vcnlDb3B5KHdkLT5zdGEuc3NpZCwgd2QtPndzLnNzaWQsIHdkLT5zdGEuc3NpZExlbik7CisKKyAgICAgICAgICAgICAgICBpZiAoIHdkLT5zdGEuc3NpZExlbiA8IDMyICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEuc3NpZFt3ZC0+c3RhLnNzaWRMZW5dID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7ICAgLyogQU5ZIEJTUyAqLworICAgICAgICAgICAgd2QtPnN0YS5zc2lkWzBdID0gMDsKKyAgICAgICAgICAgIHdkLT5zdGEuc3NpZExlbiA9IDA7CisgICAgICAgIH0KKworICAgICAgICB3ZC0+c3RhLndtZUVuYWJsZWQgPSB3ZC0+d3Muc3RhV21lRW5hYmxlZDsKKyAgICAgICAgd2QtPnN0YS53bWVRb3NJbmZvID0gd2QtPndzLnN0YVdtZVFvc0luZm87CisKKyAgICB9CisKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworfQorCit1MTZfdCB6ZldsYW5FbmFibGUoemRldl90KiBkZXYpCit7CisgICAgdThfdCAgICAgYnNzaWRbNl0gPSB7MHgwLCAweDAsIDB4MCwgMHgwLCAweDAsIDB4MH07CisgICAgdTE2X3QgaTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICBpZiAoIHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX1VOS05PV04gKQorICAgIHsKKyAgICAgICAgem1fZGVidWdfbXNnMCgiVW5rbm93biBNb2RlLi4uU2tpcC4uLiIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBpZiAod2QtPndsYW5Nb2RlID09IFpNX01PREVfQVApCisgICAgeworICAgICAgICB1MTZfdCB2YXBJZDsKKworICAgICAgICB2YXBJZCA9IHpmd0dldFZhcElkKGRldik7CisKKyAgICAgICAgaWYgKHZhcElkID09IDB4ZmZmZikKKyAgICAgICAgeworICAgICAgICAgICAgLyogQVAgbW9kZSAqLworICAgICAgICAgICAgemZBcEluaXRTdGFUYmwoZGV2KTsKKworICAgICAgICAgICAgLyogQVAgZGVmYXVsdCBwYXJhbWV0ZXJzICovCisgICAgICAgICAgICB3ZC0+YlJhdGUgPSAweGY7CisgICAgICAgICAgICB3ZC0+Z1JhdGUgPSAweGZmOworICAgICAgICAgICAgd2QtPmJSYXRlQmFzaWMgPSAweGY7CisgICAgICAgICAgICB3ZC0+Z1JhdGVCYXNpYyA9IDB4MDsKKyAgICAgICAgICAgIC8vd2QtPmJlYWNvbkludGVydmFsID0gMTAwOworICAgICAgICAgICAgd2QtPmFwLmFwQml0bWFwID0gMTsKKyAgICAgICAgICAgIHdkLT5hcC5iZWFjb25Db3VudGVyID0gMDsKKyAgICAgICAgICAgIC8vd2QtPmFwLnZhcE51bWJlciA9IDE7ICAgIC8vbWFyayBieSB5Z3dlaSBmb3IgVmFwCisKKyAgICAgICAgICAgIHdkLT5hcC5oaWRlU3NpZFswXSA9IDA7CisgICAgICAgICAgICB3ZC0+YXAuc3RhQWdpbmdUaW1lU2VjID0gMTAqNjA7CisgICAgICAgICAgICB3ZC0+YXAuc3RhUHJvYmluZ1RpbWVTZWMgPSA2MDsKKworICAgICAgICAgICAgZm9yIChpPTA7IGk8Wk1fTUFYX0FQX1NVUFBPUlQ7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3ZC0+YXAuYmNtY0hlYWRbaV0gPSB3ZC0+YXAuYmNtY1RhaWxbaV0gPSAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvL3dkLT5hcC51bmlIZWFkID0gd2QtPmFwLnVuaVRhaWwgPSAwOworCisgICAgICAgICAgICAvKiBsb2FkIEFQIHBhcmFtZXRlcnMgKi8KKyAgICAgICAgICAgIHdkLT5iUmF0ZUJhc2ljID0gd2QtPndzLmJSYXRlQmFzaWM7CisgICAgICAgICAgICB3ZC0+Z1JhdGVCYXNpYyA9IHdkLT53cy5nUmF0ZUJhc2ljOworICAgICAgICAgICAgd2QtPmJnTW9kZSA9IHdkLT53cy5iZ01vZGU7CisgICAgICAgICAgICBpZiAoKHdkLT53cy5zc2lkTGVuIDw9IDMyKSAmJiAod2QtPndzLnNzaWRMZW4gIT0gMCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2QtPmFwLnNzaWRMZW5bMF0gPSB3ZC0+d3Muc3NpZExlbjsKKyAgICAgICAgICAgICAgICBmb3IoaT0wOyBpPHdkLT53cy5zc2lkTGVuOyBpKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB3ZC0+YXAuc3NpZFswXVtpXSA9IHdkLT53cy5zc2lkW2ldOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB3ZC0+d3Muc3NpZExlbiA9IDA7IC8vIFJlc2V0IFdyYXBwZXIgVmFyaWFibGUKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHdkLT5hcC5lbmNyeU1vZGVbMF0gPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3ZC0+YXAuY2FwYWJbMF0gPSAweDAwMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3ZC0+YXAuY2FwYWJbMF0gPSAweDAxMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIHNldCBTaG9ydCBTbG90IFRpbWUgYml0IGlmIG5vdCAxMWIgKi8KKyAgICAgICAgICAgIGlmICh3ZC0+YXAud2xhblR5cGVbMF0gIT0gWk1fV0xBTl9UWVBFX1BVUkVfQikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgd2QtPmFwLmNhcGFiWzBdIHw9IDB4NDAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyB3ZC0+YXAudmFwTnVtYmVyID0gMTsgICAgLy8gbWFyayBieSB5Z3dlaSBmb3IgVmFwIFRlc3QKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyNpZiAwCisgICAgICAgICAgICAvKiBWQVAgVGVzdCBDb2RlICovCisgICAgICAgICAgICB3ZC0+YXAuYXBCaXRtYXAgPSAweDM7CisgICAgICAgICAgICB3ZC0+YXAuY2FwYWJbMV0gPSAweDQwMTsKKyAgICAgICAgICAgIHdkLT5hcC5zc2lkTGVuWzFdID0gNDsKKyAgICAgICAgICAgIHdkLT5hcC5zc2lkWzFdWzBdID0gJ3YnOworICAgICAgICAgICAgd2QtPmFwLnNzaWRbMV1bMV0gPSAnYSc7CisgICAgICAgICAgICB3ZC0+YXAuc3NpZFsxXVsyXSA9ICdwJzsKKyAgICAgICAgICAgIHdkLT5hcC5zc2lkWzFdWzNdID0gJzEnOworICAgICAgICAgICAgd2QtPmFwLmF1dGhBbGdvWzFdID0gd2QtPndzLmF1dGhNb2RlOworICAgICAgICAgICAgd2QtPmFwLmVuY3J5TW9kZVsxXSA9IHdkLT53cy5lbmNyeU1vZGU7CisgICAgICAgICAgICB3ZC0+YXAudmFwTnVtYmVyID0gMjsKKyNlbHNlCisgICAgICAgICAgICAvKiBWQVAgVGVzdCBDb2RlICovCisgICAgICAgICAgICB3ZC0+YXAuYXBCaXRtYXAgPSAweDEgfCAoMHgwMSA8PCAodmFwSWQrMSkpOworCisgICAgICAgICAgICBpZiAoKHdkLT53cy5zc2lkTGVuIDw9IDMyKSAmJiAod2QtPndzLnNzaWRMZW4gIT0gMCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2QtPmFwLnNzaWRMZW5bdmFwSWQrMV0gPSB3ZC0+d3Muc3NpZExlbjsKKyAgICAgICAgICAgICAgICBmb3IoaT0wOyBpPHdkLT53cy5zc2lkTGVuOyBpKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB3ZC0+YXAuc3NpZFt2YXBJZCsxXVtpXSA9IHdkLT53cy5zc2lkW2ldOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB3ZC0+d3Muc3NpZExlbiA9IDA7IC8vIFJlc2V0IFdyYXBwZXIgVmFyaWFibGUKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHdkLT5hcC5lbmNyeU1vZGVbdmFwSWQrMV0gPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3ZC0+YXAuY2FwYWJbdmFwSWQrMV0gPSAweDQwMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3ZC0+YXAuY2FwYWJbdmFwSWQrMV0gPSAweDQxMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgd2QtPmFwLmF1dGhBbGdvW3ZhcElkKzFdID0gd2QtPndzLmF1dGhNb2RlOworICAgICAgICAgICAgd2QtPmFwLmVuY3J5TW9kZVt2YXBJZCsxXSA9IHdkLT53cy5lbmNyeU1vZGU7CisKKyAgICAgICAgICAgIC8qIE5lZWQgdG8gYmUgbW9kaWZpZWQgd2hlbiBWQVAgaXMgdXNlZCAqLworICAgICAgICAgICAgLy93ZC0+YXAudmFwTnVtYmVyID0gMjsKKyNlbmRpZgorICAgICAgICB9CisKKyAgICAgICAgd2QtPmFwLnZhcE51bWJlcisrOworCisgICAgICAgIHpmQ29yZVNldEZyZXF1ZW5jeShkZXYsIHdkLT5mcmVxdWVuY3kpOworCisgICAgICAgIHpmSW5pdE1hY0FwTW9kZShkZXYpOworCisgICAgICAgIC8qIERpc2FibGUgcHJvdGVjdGlvbiBtb2RlICovCisgICAgICAgIHpmQXBTZXRQcm90ZWN0aW9uTW9kZShkZXYsIDApOworCisgICAgICAgIHpmQXBTZW5kQmVhY29uKGRldik7CisgICAgfSAvKmlmICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9BUCkgKi8KKyAgICBlbHNlCisgICAgeworICAgICAgICB6ZlNjYW5NZ3JTY2FuU3RvcChkZXYsIFpNX1NDQU5fTUdSX1NDQU5fSU5URVJOQUwpOworICAgICAgICB6ZlNjYW5NZ3JTY2FuU3RvcChkZXYsIFpNX1NDQU5fTUdSX1NDQU5fRVhURVJOQUwpOworCisgICAgICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgIHdkLT5zdGEub3Bwb3NpdGVDb3VudCA9IDA7ICAgIC8qIHJlc2V0IG9wcG9zaXRlIGNvdW50ICovCisgICAgICAgIC8vd2QtPnN0YS5iQXV0b1JlY29ubmVjdCA9IHdkLT5zdGEuYkF1dG9SZWNvbm5lY3RFbmFibGVkOworICAgICAgICAvL3dkLT5zdGEuc2NhbldpdGhTU0lEID0gMDsKKyAgICAgICAgemZTdGFJbml0T3Bwb3NpdGVJbmZvKGRldik7CisgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICAgICAgemZTdGFSZXNldFN0YXR1cyhkZXYsIDApOworCisgICAgICAgIGlmICggKHdkLT5zdGEuY21EaXNhbGxvd1NzaWRMZW5ndGggIT0gMCkmJgorICAgICAgICAgICAgICh3ZC0+c3RhLnNzaWRMZW4gPT0gd2QtPnN0YS5jbURpc2FsbG93U3NpZExlbmd0aCkmJgorICAgICAgICAgICAgICh6Zk1lbW9yeUlzRXF1YWwod2QtPnN0YS5zc2lkLCB3ZC0+c3RhLmNtRGlzYWxsb3dTc2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5zc2lkTGVuKSkgJiYKKyAgICAgICAgICAgICAod2QtPnN0YS53ZXBTdGF0dXMgPT0gWk1fRU5DUllQVElPTl9US0lQKSkKKyAgICAgICAgeyAgIC8qIGNvdW50ZXJtZWFzdXJlcyAqLworICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiY291bnRlcm1lYXN1cmVzIGRpc2FsbG93IGFzc29jaWF0aW9uIik7CisKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHN3aXRjaCggd2QtPndsYW5Nb2RlICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIFpNX01PREVfSUJTUzoKKyAgICAgICAgICAgICAgICAgICAgLyogc29tZSByZWdpc3RlcnMgbWF5IGJlIHNldCBoZXJlICovCisgICAgICAgICAgICAgICAgICAgIGlmICggd2QtPnN0YS5hdXRoTW9kZSA9PSBaTV9BVVRIX01PREVfV1BBMlBTSyApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHpmSHBTZXRBcFN0YU1vZGUoZGV2LCBaTV9IQUxfODAyMTFfTU9ERV9JQlNTX1dQQTJQU0spOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgemZIcFNldEFwU3RhTW9kZShkZXYsIFpNX0hBTF84MDIxMV9NT0RFX0lCU1NfR0VORVJBTCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB6bV9tc2cwX21tKFpNX0xWXzAsICJaTV9NT0RFX0lCU1MiKTsKKyAgICAgICAgICAgICAgICAgICAgemZJYnNzQ29ubmVjdE5ldHdvcmsoZGV2KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIFpNX01PREVfSU5GUkFTVFJVQ1RVUkU6CisgICAgICAgICAgICAgICAgICAgIC8qIHNvbWUgcmVnaXN0ZXJzIG1heSBiZSBzZXQgaGVyZSAqLworICAgICAgICAgICAgICAgICAgICB6ZkhwU2V0QXBTdGFNb2RlKGRldiwgWk1fSEFMXzgwMjExX01PREVfU1RBKTsKKworICAgICAgICAgICAgICAgICAgICB6ZkluZnJhQ29ubmVjdE5ldHdvcmsoZGV2KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIFpNX01PREVfUFNFVURPOgorICAgICAgICAgICAgICAgICAgICAvKiBzb21lIHJlZ2lzdGVycyBtYXkgYmUgc2V0IGhlcmUgKi8KKyAgICAgICAgICAgICAgICAgICAgemZIcFNldEFwU3RhTW9kZShkZXYsIFpNX0hBTF84MDIxMV9NT0RFX1NUQSk7CisKKyAgICAgICAgICAgICAgICAgICAgemZVcGRhdGVCc3NpZChkZXYsIGJzc2lkKTsKKyAgICAgICAgICAgICAgICAgICAgemZDb3JlU2V0RnJlcXVlbmN5KGRldiwgd2QtPmZyZXF1ZW5jeSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLy9pZiAoICh3ZC0+d2xhbk1vZGUgIT0gWk1fTU9ERV9JTkZSQVNUUlVDVFVSRSkmJgorICAgIC8vICAgICAod2QtPndsYW5Nb2RlICE9IFpNX01PREVfQVApICkKKyAgICBpZiAoIHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX1BTRVVETyApCisgICAgeworICAgICAgICAvKiBSZXNldCBXbGFuIHN0YXR1cyAqLworICAgICAgICB6ZldsYW5SZXNldChkZXYpOworCisgICAgICAgIGlmICh3ZC0+emZjYkNvbm5lY3ROb3RpZnkgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgd2QtPnpmY2JDb25uZWN0Tm90aWZ5KGRldiwgWk1fU1RBVFVTX01FRElBX0NPTk5FQ1QsIHdkLT5zdGEuYnNzaWQpOworICAgICAgICB9CisgICAgICAgIHpmQ2hhbmdlQWRhcHRlclN0YXRlKGRldiwgWk1fU1RBX1NUQVRFX0NPTk5FQ1RFRCk7CisgICAgfQorCisKKyAgICBpZih3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9BUCkKKyAgICB7CisgICAgICAgIGlmICh3ZC0+emZjYkNvbm5lY3ROb3RpZnkgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgd2QtPnpmY2JDb25uZWN0Tm90aWZ5KGRldiwgWk1fU1RBVFVTX01FRElBX0NPTk5FQ1QsIHdkLT5zdGEuYnNzaWQpOworICAgICAgICB9CisgICAgICAgIC8vemZDaGFuZ2VBZGFwdGVyU3RhdGUoZGV2LCBaTV9TVEFfU1RBVEVfQ09OTkVDVEVEKTsKKyAgICB9CisKKyAgICAvLyBBc3NpZ24gZGVmYXVsdCBUeCBSYXRlCisgICAgaWYgKCB3ZC0+c3RhLkVuYWJsZUhUICkKKyAgICB7CisJCXUzMl90IG9uZVR4U3RyZWFtQ2FwOworCQlvbmVUeFN0cmVhbUNhcCA9ICh6ZkhwQ2FwYWJpbGl0eShkZXYpICYgWk1fSFBfQ0FQXzExTl9PTkVfVFhfU1RSRUFNKTsKKwkJaWYob25lVHhTdHJlYW1DYXApCisJCQl3ZC0+Q3VycmVudFR4UmF0ZUticHMgPSAxMzUwMDA7CisJCWVsc2UKKwkJCXdkLT5DdXJyZW50VHhSYXRlS2JwcyA9IDI3MDAwMDsKKyAgICAgICAgd2QtPkN1cnJlbnRSeFJhdGVLYnBzID0gMjcwMDAwOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB3ZC0+Q3VycmVudFR4UmF0ZUticHMgPSA1NDAwMDsKKyAgICAgICAgd2QtPkN1cnJlbnRSeFJhdGVLYnBzID0gNTQwMDA7CisgICAgfQorCisgICAgd2QtPnN0YXRlID0gWk1fV0xBTl9TVEFURV9FTkFCTEVEOworCisgICAgcmV0dXJuIDA7Cit9CisKKy8qIEVuYWJsZS9kaXNhYmxlIFdsYW4gb3BlcmF0aW9uICovCit1MTZfdCB6ZmlXbGFuRW5hYmxlKHpkZXZfdCogZGV2KQoreworICAgIHUxNl90IHJldDsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptX21zZzBfbW0oWk1fTFZfMSwgIkVuYWJsZSBXbGFuIik7CisKKyAgICB6ZkdldFdyYXBwZXJTZXR0aW5nKGRldik7CisKKyAgICB6Zlplcm9NZW1vcnkoKHU4X3QqKSAmd2QtPnRyYWZUYWxseSwgc2l6ZW9mKHN0cnVjdCB6c1RyYWZUYWxseSkpOworCisgICAgLy8gUmVzZXQgY21NaWNGYWlsdXJlQ291bnQgdG8gMCBmb3IgbmV3IGFzc29jaWF0aW9uIHJlcXVlc3QKKyAgICBpZiAoIHdkLT5zdGEuY21NaWNGYWlsdXJlQ291bnQgPT0gMSApCisgICAgeworICAgICAgICB6ZlRpbWVyQ2FuY2VsKGRldiwgWk1fRVZFTlRfQ01fVElNRVIpOworICAgICAgICB3ZC0+c3RhLmNtTWljRmFpbHVyZUNvdW50ID0gMDsKKyAgICB9CisKKyAgICB6ZkZsdXNoVnR4cShkZXYpOworICAgIGlmICgod2QtPnF1ZXVlRmx1c2hlZCAmIDB4MTApICE9IDApCisgICAgeworICAgICAgICB6ZkhwVXNiUmVzZXQoZGV2KTsKKyAgICB9CisgICAgcmV0ID0gemZXbGFuRW5hYmxlKGRldik7CisKKyAgICByZXR1cm4gcmV0OworfQorLyogQWRkIGEgZmxhZyBuYW1lZCBSZXNldEtleUNhY2hlIHRvIHNob3cgaWYgS2V5Q2FjaGUgc2hvdWxkIGJlIGNsZWFyZWQuCisgICBmb3IgaG9zdGFwZCBpbiBBUCBtb2RlLCBpZiBkcml2ZXIgcmVjZWl2ZXMgaXdjb25maWcgaW9jdGwKKyAgIGFmdGVyIHNldHRpbmcgZ3JvdXAga2V5LCBpdCBzaG91bGRuJ3QgY2xlYXIgS2V5Q2FjaGUuICAgICAgICAgICAgICAgICAqLwordTE2X3QgemZpV2xhbkRpc2FibGUoemRldl90KiBkZXYsIHU4X3QgUmVzZXRLZXlDYWNoZSkKK3sKKyAgICB1MTZfdCAgaTsKKyAgICB1OF90IGlzQ29ubmVjdGVkOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisjaWZkZWYgWk1fRU5BQkxFX0lCU1NfV1BBMlBTSworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisjZW5kaWYKKyAgICB3ZC0+c3RhdGUgPSBaTV9XTEFOX1NUQVRFX0RJU0FCTEVEOworCisgICAgem1fbXNnMF9tbShaTV9MVl8xLCAiRGlzYWJsZSBXbGFuIik7CisKKyAgICBpZiAoIHdkLT53bGFuTW9kZSAhPSBaTV9NT0RFX0FQICkKKyAgICB7CisgICAgICAgIGlzQ29ubmVjdGVkID0gemZTdGFJc0Nvbm5lY3RlZChkZXYpOworCisgICAgICAgIGlmICggKHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0lORlJBU1RSVUNUVVJFKSYmCisgICAgICAgICAgICAgKHdkLT5zdGEuY3VycmVudEF1dGhNb2RlICE9IFpNX0FVVEhfTU9ERV9XUEEyKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIHNlbmQgZGVhdXRoZW50aWNhdGlvbiBmcmFtZSAqLworICAgICAgICAgICAgaWYgKGlzQ29ubmVjdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vemZpV2xhbkRlYXV0aChkZXYsIE5VTEwsIDApOworICAgICAgICAgICAgICAgIHpmU2VuZE1tRnJhbWUoZGV2LCBaTV9XTEFOX0ZSQU1FX1RZUEVfREVBVVRILCB3ZC0+c3RhLmJzc2lkLCAzLCAwLCAwKTsKKyAgICAgICAgICAgICAgICAvL3ptd19kZWJ1Z19tc2cwKCJzZW5kIGEgRGVhdXRoIGZyYW1lISIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gUmVtb3ZlIGFsbCB0aGUgY29ubmVjdGVkIHBlZXIgc3RhdGlvbnMKKyAgICAgICAgaWYgKCB3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9JQlNTICkKKyAgICAgICAgeworICAgICAgICAgICAgd2QtPnN0YS5pYnNzQnNzSXNDcmVhdG9yID0gMDsKKyAgICAgICAgICAgIHpmVGltZXJDYW5jZWwoZGV2LCBaTV9FVkVOVF9JQlNTX01PTklUT1IpOworICAgICAgICAgICAgemZTdGFJYnNzTW9uaXRvcmluZyhkZXYsIDEpOworICAgICAgICB9CisKKyNpZmRlZiBaTV9FTkFCTEVfSUJTU19XUEEyUFNLCisgICAgICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgIHdkLT5zdGEuaWJzc1dwYTJQc2sgPSAwOworICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworI2VuZGlmCisKKyAgICAgICAgd2QtPnN0YS53cGFTdGF0ZSA9IFpNX1NUQV9XUEFfU1RBVEVfSU5JVDsKKworICAgICAgICAvKiByZXNldCBjb25uZWN0IHRpbWVvdXQgY291bnRlciAqLworICAgICAgICB3ZC0+c3RhLmNvbm5lY3RUaW1lb3V0Q291bnQgPSAwOworCisgICAgICAgIC8qIHJlc2V0IGNvbm5lY3RTdGF0ZSB0byBOb25lICovCisgICAgICAgIHdkLT5zdGEuY29ubmVjdFN0YXRlID0gWk1fU1RBX0NPTk5fU1RBVEVfTk9ORTsKKworICAgICAgICAvKiByZXNldCBsZWFwIGVuYWJsZSB2YXJpYWJsZSAqLworICAgICAgICB3ZC0+c3RhLmxlYXBFbmFibGVkID0gMDsKKworICAgICAgICAvKiBEaXNhYmxlIHRoZSBSSUZTIFN0YXR1cyAvIFJJRlMtbGlrZSBmcmFtZSBjb3VudCAvIFJJRlMgY291bnQgKi8KKyAgICAgICAgaWYoIHdkLT5zdGEucmlmc1N0YXRlID09IFpNX1JJRlNfU1RBVEVfREVURUNURUQgKQorICAgICAgICAgICAgemZIcERpc2FibGVSaWZzKGRldik7CisgICAgICAgIHdkLT5zdGEucmlmc1N0YXRlID0gWk1fUklGU19TVEFURV9ERVRFQ1RJTkc7CisgICAgICAgIHdkLT5zdGEucmlmc0xpa2VGcmFtZUNudCA9IDA7CisgICAgICAgIHdkLT5zdGEucmlmc0NvdW50ID0gMDsKKworICAgICAgICB3ZC0+c3RhLm9zUnhGaWx0ZXIgPSAwOworICAgICAgICB3ZC0+c3RhLmJTYWZlTW9kZSA9IDA7CisKKyAgICAgICAgemZDaGFuZ2VBZGFwdGVyU3RhdGUoZGV2LCBaTV9TVEFfU1RBVEVfRElTQ09OTkVDVCk7CisgICAgICAgIGlmIChSZXNldEtleUNhY2hlKQorICAgICAgICAgICAgemZIcFJlc2V0S2V5Q2FjaGUoZGV2KTsKKworICAgICAgICBpZiAoaXNDb25uZWN0ZWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh3ZC0+emZjYkNvbm5lY3ROb3RpZnkgIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3ZC0+emZjYkNvbm5lY3ROb3RpZnkoZGV2LCBaTV9TVEFUVVNfTUVESUFfQ09OTkVDVElPTl9ESVNBQkxFRCwgd2QtPnN0YS5ic3NpZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpZiAod2QtPnpmY2JDb25uZWN0Tm90aWZ5ICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2QtPnpmY2JDb25uZWN0Tm90aWZ5KGRldiwgWk1fU1RBVFVTX01FRElBX0RJU0FCTEVELCB3ZC0+c3RhLmJzc2lkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIC8vaWYgKHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0FQKQorICAgIHsKKyAgICAgICAgZm9yIChpPTA7IGk8Wk1fTUFYX1NUQV9TVVBQT1JUOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIHNlbmQgZGVhdXRoZW50aWNhdGlvbiBmcmFtZSAqLworICAgICAgICAgICAgaWYgKHdkLT5hcC5zdGFUYWJsZVtpXS52YWxpZCA9PSAxKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIFJlYXNvbiA6IFNlbmRpbmcgc3RhdGlvbiBpcyBsZWF2aW5nICovCisgICAgICAgICAgICAgICAgemZTZW5kTW1GcmFtZShkZXYsIFpNX1dMQU5fRlJBTUVfVFlQRV9ERUFVVEgsCisgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+YXAuc3RhVGFibGVbaV0uYWRkciwgMywgMCwgMCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoUmVzZXRLZXlDYWNoZSkKKyAgICAgICAgICAgIHpmSHBSZXNldEtleUNhY2hlKGRldik7CisKKyAgICAgICAgd2QtPmFwLnZhcE51bWJlci0tOworICAgIH0KKworICAgIC8qIHN0b3AgYmVhY29uICovCisgICAgemZIcERpc2FibGVCZWFjb24oZGV2KTsKKworICAgIC8qIEZsdXNoIFZUeFEgYW5kIE1tUSAqLworICAgIHpmRmx1c2hWdHhxKGRldik7CisgICAgLyogRmx1c2ggQVAgUFMgcXVldWVzICovCisgICAgemZBcEZsdXNoQnVmZmVyZWRQc0ZyYW1lKGRldik7CisgICAgLyogRnJlZSBidWZmZXIgaW4gZGVmcmFnbWVudCBsaXN0Ki8KKyAgICB6ZkFnaW5nRGVmcmFnTGlzdChkZXYsIDEpOworCisgICAgI2lmZGVmIFpNX0VOQUJMRV9BR0dSRUdBVElPTgorICAgIC8qIGFkZCBieSBob25kYSAqLworICAgIHpmQWdnUnhGcmVlQnVmKGRldiwgMCk7ICAvLzEgZm9yIHJlbGVhc2Ugc3RydWN0dXJlIG1lbW9yeQorICAgIC8qIGVuZCBvZiBhZGQgYnkgaG9uZGEgKi8KKyAgICAjZW5kaWYKKworICAgIC8vIENsZWFyIHRoZSBpbmZvcm1hdGlvbiBmb3IgdGhlIHBlZXIgc3RhdGlvbnMgb2YgSUJTUyBvciBBUCBvZiBTdGF0aW9uIG1vZGUKKyAgICB6Zlplcm9NZW1vcnkoKHU4X3QqKXdkLT5zdGEub3Bwb3NpdGVJbmZvLCBzaXplb2Yoc3RydWN0IHpzT3Bwb3NpdGVJbmZvKSAqIFpNX01BWF9PUFBPU0lURV9DT1VOVCk7CisKKyAgICAvKiBUdXJuIG9mZiBTb2Z0d2FyZSBXRVAvVEtJUCAqLworICAgIGlmICh3ZC0+c3RhLlNXRW5jcnlwdEVuYWJsZSAhPSAwKQorICAgIHsKKyAgICAgICAgem1fZGVidWdfbXNnMCgiRGlzYWJsZSBzb2Z0d2FyZSBlbmNyeXB0aW9uIik7CisgICAgICAgIHpmU3RhRGlzYWJsZVNXRW5jcnlwdGlvbihkZXYpOworICAgIH0KKworICAgIC8qIEltcHJvdmUgV0VQL1RLSVAgcGVyZm9ybWFjZSB3aXRoIEhUIEFQLCBkZXRhaWwgaW5mb3JtYXRpb24gcGxlYXNlIGxvb2sgYnVnIzMyNDk1ICovCisgICAgLy96ZkhwU2V0VFRTSUZTVGltZShkZXYsIDB4OCk7CisKKyAgICByZXR1cm4gMDsKK30KKwordTE2X3QgemZpV2xhblN1c3BlbmQoemRldl90KiBkZXYpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICAvLyBDaGFuZ2UgdGhlIEhBTCBzdGF0ZSB0byBpbml0IHNvIHRoYXQgYW55IHBhY2tldCBjYW4ndCBiZSB0cmFuc21pdHRlZCBiZXR3ZWVuCisgICAgLy8gcmVzdW1lICYgSEFMIHJlaW5pdC4gVGhpcyB3b3VsZCBjYXVzZSB0aGUgY2hpcCBoYW5nIGlzc3VlIGluIE9UVVMuCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICB3ZC0+aGFsU3RhdGUgPSBaTV9IQUxfU1RBVEVfSU5JVDsKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3UxNl90IHpmaVdsYW5SZXN1bWUoemRldl90KiBkZXYsIHU4X3QgZG9SZWNvbm4pCit7CisgICAgdTE2X3QgcmV0OworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgLyogUmVkb3dubG9hZCBmaXJtd2FyZSwgUmVpbml0IE1BQyxQSFksUkYgKi8KKyAgICB6ZkhwUmVpbml0KGRldiwgd2QtPmZyZXF1ZW5jeSk7CisKKyAgICAvL1NldCBjaGFubmVsIGFjY29yZGluZyB0byBBUCdzIGNvbmZpZ3VyYXRpb24KKyAgICB6ZkNvcmVTZXRGcmVxdWVuY3lFeFYyKGRldiwgd2QtPmZyZXF1ZW5jeSwgd2QtPkJhbmRXaWR0aDQwLAorICAgICAgICAgICAgd2QtPkV4dE9mZnNldCwgTlVMTCwgMSk7CisKKyAgICB6ZkhwU2V0TWFjQWRkcmVzcyhkZXYsIHdkLT5tYWNBZGRyLCAwKTsKKworICAgIC8qIFN0YXJ0IFJ4ICovCisgICAgemZIcFN0YXJ0UmVjdihkZXYpOworCisgICAgemZGbHVzaFZ0eHEoZGV2KTsKKworICAgIGlmICggd2QtPndsYW5Nb2RlICE9IFpNX01PREVfSU5GUkFTVFJVQ1RVUkUgJiYKKyAgICAgICAgIHdkLT53bGFuTW9kZSAhPSBaTV9NT0RFX0lCU1MgKQorICAgIHsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgem1fbXNnMF9tbShaTV9MVl8xLCAiUmVzdW1lIFdsYW4iKTsKKyAgICBpZiAoICh6ZlN0YUlzQ29ubmVjdGVkKGRldikpIHx8ICh6ZlN0YUlzQ29ubmVjdGluZyhkZXYpKSApCisgICAgeworICAgICAgICBpZiAoZG9SZWNvbm4gPT0gMSkKKyAgICAgICAgeworICAgICAgICAgICAgem1fbXNnMF9tbShaTV9MVl8xLCAiUmUtY29ubmVjdC4uLiIpOworICAgICAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgIHdkLT5zdGEuY29ubmVjdEJ5UmVhc3NvID0gRkFMU0U7CisgICAgICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgICAgICAgICB6ZldsYW5FbmFibGUoZGV2KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChkb1JlY29ubiA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICB6ZkhwU2V0Um9sbENhbGxUYWJsZShkZXYpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0ID0gMDsKKworICAgIHJldHVybiByZXQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgIHpmaVdsYW5GbHVzaEFsbFF1ZXVlZEJ1ZmZlcnMgKi8KKy8qICAgICAgRmx1c2ggVmlydHVhbCBUeFEsIE1tUSwgUFMgZnJhbWVzIGFuZCBkZWZyYWdtZW50IGxpc3QgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiBDaGVuICAgICAgICBBdGhlcm9zIENvbW11bmljYXRpb25zLCBJTkMuICAgIDIwMDcuMSAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgemZpV2xhbkZsdXNoQWxsUXVldWVkQnVmZmVycyh6ZGV2X3QqIGRldikKK3sKKyAgICAvKiBGbHVzaCBWVHhRIGFuZCBNbVEgKi8KKyAgICB6ZkZsdXNoVnR4cShkZXYpOworICAgIC8qIEZsdXNoIEFQIFBTIHF1ZXVlcyAqLworICAgIHpmQXBGbHVzaEJ1ZmZlcmVkUHNGcmFtZShkZXYpOworICAgIC8qIEZyZWUgYnVmZmVyIGluIGRlZnJhZ21lbnQgbGlzdCovCisgICAgemZBZ2luZ0RlZnJhZ0xpc3QoZGV2LCAxKTsKK30KKworLyogRG8gV0xBTiBzaXRlIHN1cnZleSAqLwordTE2X3QgemZpV2xhblNjYW4oemRldl90KiBkZXYpCit7CisgICAgdTE2X3QgcmV0ID0gMTsKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bV9kZWJ1Z19tc2cwKCIiKTsKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgaWYgKHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0FQKQorICAgIHsKKyAgICAgICAgd2QtPmhlYXJ0QmVhdE5vdGlmaWNhdGlvbiB8PSBaTV9CU1NJRF9MSVNUX1NDQU47CisgICAgICAgIHdkLT5zdGEuc2NhbkZyZXF1ZW5jeSA9IDA7CisgICAgICAgIC8vd2QtPnN0YS5wVXBkYXRlQnNzTGlzdC0+YnNzQ291bnQgPSAwOworICAgICAgICByZXQgPSAwOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAjaWYgMAorICAgICAgICBpZiAoICF6ZlN0YUJsb2NrV2xhblNjYW4oZGV2KSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzAoInNjYW4gcmVxdWVzdCIpOworICAgICAgICAgICAgLy96ZlRpbWVyU2NoZWR1bGUoZGV2LCBaTV9FVkVOVF9TQ0FOLCBaTV9USUNLX1pFUk8pOworICAgICAgICAgICAgcmV0ID0gMDsKKyAgICAgICAgICAgIGdvdG8gc3RhcnRfc2NhbjsKKyAgICAgICAgfQorICAgICAgICAjZWxzZQorICAgICAgICAgICAgZ290byBzdGFydF9zY2FuOworICAgICAgICAjZW5kaWYKKyAgICB9CisKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgcmV0dXJuIHJldDsKKworc3RhcnRfc2NhbjoKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgaWYod2QtPmxlZFN0cnVjdC5MRURDdHJsRmxhZ0Zyb21SZWcgJiBaTV9MRURfQ1RSTF9GTEFHX0FMUEhBKSAgIC8vIGZsYWcgZm9yIEFscGhhCisgICAgICAgIHdkLT5sZWRTdHJ1Y3QuTEVEQ3RybEZsYWcgfD0gWk1fTEVEX0NUUkxfRkxBR19BTFBIQTsKKworICAgIHJldCA9IHpmU2Nhbk1nclNjYW5TdGFydChkZXYsIFpNX1NDQU5fTUdSX1NDQU5fRVhURVJOQUwpOworCisgICAgem1fZGVidWdfbXNnMSgicmV0ID0gIiwgcmV0KTsKKworICAgIHJldHVybiByZXQ7Cit9CisKKworLyogcmF0ZSAgICAgICAgICovCisvKiAgICAwIDogQVVUTyAgKi8KKy8qICAgIDEgOiBDQ0sgMU0gKi8KKy8qICAgIDIgOiBDQ0sgMk0gKi8KKy8qICAgIDMgOiBDQ0sgNS41TSAqLworLyogICAgNCA6IENDSyAxMU0gKi8KKy8qICAgIDUgOiBPRkRNIDZNICovCisvKiAgICA2IDogT0ZETSA5TSAqLworLyogICAgNyA6IE9GRE0gMTJNICovCisvKiAgICA4IDogT0ZETSAxOE0gKi8KKy8qICAgIDkgOiBPRkRNIDI0TSAqLworLyogICAgMTAgOiBPRkRNIDM2TSAqLworLyogICAgMTEgOiBPRkRNIDQ4TSAqLworLyogICAgMTIgOiBPRkRNIDU0TSAqLworLyogICAgMTMgOiBNQ1MgMCAqLworLyogICAgMjggOiBNQ1MgMTUgKi8KK3UxNl90IHpjUmF0ZVRvTUNTW10gPQorICAgIHsweGZmLCAwLCAxLCAyLCAzLCAweGIsIDB4ZiwgMHhhLCAweGUsIDB4OSwgMHhkLCAweDgsIDB4Y307Cit1MTZfdCB6Y1JhdGVUb01UW10gPSB7MCwgMCwgMCwgMCwgMCwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMX07CisKK3UxNl90IHpmaVdsYW5TZXRUeFJhdGUoemRldl90KiBkZXYsIHUxNl90IHJhdGUpCit7ICAgLy8gamhsZWUgSFQgMAorICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIGlmIChyYXRlIDw9MTIpCisgICAgeworICAgICAgICB3ZC0+dHhNQ1MgPSB6Y1JhdGVUb01DU1tyYXRlXTsKKyAgICAgICAgd2QtPnR4TVQgPSB6Y1JhdGVUb01UW3JhdGVdOworICAgICAgICByZXR1cm4gWk1fU1VDQ0VTUzsKKyAgICB9CisgICAgZWxzZSBpZiAoKHJhdGU8PTI4KXx8KHJhdGU9PTEzKzMyKSkKKyAgICB7CisgICAgICAgIHdkLT50eE1DUyA9IHJhdGUgLSAxMiAtIDE7CisgICAgICAgIHdkLT50eE1UID0gMjsKKyAgICAgICAgcmV0dXJuIFpNX1NVQ0NFU1M7CisgICAgfQorCisgICAgcmV0dXJuIFpNX0VSUl9JTlZBTElEX1RYX1JBVEU7Cit9CisKK2NvbnN0IHUzMl90IHpjUmF0ZUlkVG9LYnBzNDBNW10gPQorICAgIHsKKyAgICAgICAgMTAwMCwgMjAwMCwgNTUwMCwgMTEwMDAsICAgICAgICAgICAgICAgICAgLyogMU0sIDJNLCA1TSwgMTFNICAgICAgICAgICwgIDAgIDEgIDIgIDMqLworICAgICAgICA2MDAwLCA5MDAwLCAxMjAwMCwgMTgwMDAsICAgICAgICAgICAgICAgICAvKiA2TSAgOU0gIDEyTSAgMThNICAgICAgICAgLCAgNCAgNSAgNiAgNyovCisgICAgICAgIDI0MDAwLCAzNjAwMCwgNDgwMDAsIDU0MDAwLCAgICAgICAgICAgICAgIC8qIDI0TSAgMzZNICA0OE0gIDU0TSAgICAgICAsICA4ICA5IDEwIDExKi8KKyAgICAgICAgMTM1MDAsIDI3MDAwLCA0MDUwMCwgNTQwMDAsICAgICAgICAgICAgICAgLyogTUNTMCBNQ1MxIE1DUzIgTUNTMyAgICAgICwgMTIgMTMgMTQgMTUqLworICAgICAgICA4MTAwMCwgMTA4MDAwLCAxMjE1MDAsIDEzNTAwMCwgICAgICAgICAgICAvKiBNQ1M0IE1DUzUgTUNTNiBNQ1M3ICAgICAgLCAxNiAxNyAxOCAxOSovCisgICAgICAgIDI3MDAwLCA1NDAwMCwgODEwMDAsIDEwODAwMCwgICAgICAgICAgICAgIC8qIE1DUzggTUNTOSBNQ1MxMCBNQ1MxMSAgICAsIDIwIDIxIDIyIDIzKi8KKyAgICAgICAgMTYyMDAwLCAyMTYwMDAsIDI0MzAwMCwgMjcwMDAwLCAgICAgICAgICAgLyogTUNTMTIgTUNTMTMgTUNTMTQgTUNTMTUgICwgMjQgMjUgMjYgMjcqLworICAgICAgICAyNzAwMDAsIDMwMDAwMCwgMTUwMDAwICAgICAgICAgICAgICAgICAgICAvKiBNQ1MxNFNHLCBNQ1MxNVNHLCBNQ1M3U0cgLCAyOCAyOSAzMCovCisgICAgfTsKKworY29uc3QgdTMyX3QgemNSYXRlSWRUb0ticHMyME1bXSA9CisgICAgeworICAgICAgICAxMDAwLCAyMDAwLCA1NTAwLCAxMTAwMCwgICAgICAgICAgICAgICAgICAvKiAxTSwgMk0sIDVNLCAxMU0gICAgICAgICAgLCAgMCAgMSAgMiAgMyovCisgICAgICAgIDYwMDAsIDkwMDAsIDEyMDAwLCAxODAwMCwgICAgICAgICAgICAgICAgIC8qIDZNICA5TSAgMTJNICAxOE0gICAgICAgICAsICA0ICA1ICA2ICA3Ki8KKyAgICAgICAgMjQwMDAsIDM2MDAwLCA0ODAwMCwgNTQwMDAsICAgICAgICAgICAgICAgLyogMjRNICAzNk0gIDQ4TSAgNTRNICAgICAgICwgIDggIDkgMTAgMTEqLworICAgICAgICA2NTAwLCAxMzAwMCwgMTk1MDAsIDI2MDAwLCAgICAgICAgICAgICAgICAvKiBNQ1MwIE1DUzEgTUNTMiBNQ1MzICAgICAgLCAxMiAxMyAxNCAxNSovCisgICAgICAgIDM5MDAwLCA1MjAwMCwgNTg1MDAsIDY1MDAwLCAgICAgICAgICAgICAgIC8qIE1DUzQgTUNTNSBNQ1M2IE1DUzcgICAgICAsIDE2IDE3IDE4IDE5Ki8KKyAgICAgICAgMTMwMDAsIDI2MDAwLCAzOTAwMCwgNTIwMDAsICAgICAgICAgICAgICAgLyogTUNTOCBNQ1M5IE1DUzEwIE1DUzExICAgICwgMjAgMjEgMjIgMjMqLworICAgICAgICA3ODAwMCwgMTA0MDAwLCAxMTcwMDAsIDEzMDAwMCwgICAgICAgICAgICAvKiBNQ1MxMiBNQ1MxMyBNQ1MxNCBNQ1MxNSAgLCAyNCAyNSAyNiAyNyovCisgICAgICAgIDEzMDAwMCwgMTQ0NDAwLCA3MjIwMCAgICAgICAgICAgICAgICAgICAgIC8qIE1DUzE0U0csIE1DUzE1U0csIE1TRzdTRyAsIDI4IDI5IDMwKi8KKyAgICB9OworCit1MzJfdCB6ZmlXbGFuUXVlcnlUeFJhdGUoemRldl90KiBkZXYpCit7CisgICAgdThfdCByYXRlSWQgPSAweGZmOworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgLyogSWYgVHggcmF0ZSBoYWQgbm90IGJlZW4gdHJhaW5lZCwgcmV0dXJuIG1heGltdW0gVHggcmF0ZSBpbnN0ZWFkICovCisgICAgaWYgKCh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9JTkZSQVNUUlVDVFVSRSkgJiYgKHpmU3RhSXNDb25uZWN0ZWQoZGV2KSkpCisgICAgeworICAgICAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICAvL05vdCBpbiBmaXhlZCByYXRlIG1vZGUKKyAgICAgICAgaWYgKHdkLT50eE1DUyA9PSAweGZmKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoKHdkLT5zdGEub3Bwb3NpdGVJbmZvWzBdLnJjQ2VsbC5mbGFnICYgWk1fUkNfVFJBSU5FRF9CSVQpID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmF0ZUlkID0gd2QtPnN0YS5vcHBvc2l0ZUluZm9bMF0ucmNDZWxsLm9wZXJhdGlvblJhdGVTZXRbd2QtPnN0YS5vcHBvc2l0ZUluZm9bMF0ucmNDZWxsLm9wZXJhdGlvblJhdGVDb3VudC0xXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByYXRlSWQgPSB3ZC0+c3RhLm9wcG9zaXRlSW5mb1swXS5yY0NlbGwub3BlcmF0aW9uUmF0ZVNldFt3ZC0+c3RhLm9wcG9zaXRlSW5mb1swXS5yY0NlbGwuY3VycmVudFJhdGVJbmRleF07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICB9CisgICAgaWYgKHJhdGVJZCAhPSAweGZmKQorICAgIHsKKyAgICAgICAgaWYgKHdkLT5zdGEuaHRDdHJsQmFuZHdpZHRoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gemNSYXRlSWRUb0ticHM0ME1bcmF0ZUlkXTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB6Y1JhdGVJZFRvS2JwczIwTVtyYXRlSWRdOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJldHVybiB3ZC0+Q3VycmVudFR4UmF0ZUticHM7CisgICAgfQorfQorCit2b2lkIHpmV2xhblVwZGF0ZVJ4UmF0ZSh6ZGV2X3QqIGRldiwgc3RydWN0IHpzQWRkaXRpb25JbmZvKiBhZGRJbmZvKQoreworICAgIHUzMl90IHJ4UmF0ZUticHM7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworICAgIC8vem1fbXNnMV9tbShaTV9MVl8wLCAiYWRkSW5mby0+VGFpbC5EYXRhLlJ4TWFjU3RhdHVzID0iLCBhZGRJbmZvLT5UYWlsLkRhdGEuUnhNYWNTdGF0dXMgJiAweDAzKTsKKworICAgIC8qIGI1fmI0OiBNUERVIGluZGljYXRpb24uICAgICAgICAgICAgICAgICovCisgICAgLyogICAgICAgIDAwOiBTaW5nbGUgTVBEVS4gICAgICAgICAgICAgICAgKi8KKyAgICAvKiAgICAgICAgMTA6IEZpcnN0IE1QRFUgb2YgQS1NUERVLiAgICAgICAqLworICAgIC8qICAgICAgICAxMTogTWlkZGxlIE1QRFUgb2YgQS1NUERVLiAgICAgICovCisgICAgLyogICAgICAgIDAxOiBMYXN0IE1QRFUgb2YgQS1NUERVLiAgICAgICAgKi8KKyAgICAvKiBPbmx5IEZpcnN0IE1QRFUgYW5kIFNpbmdsZSBNUERVIGhhdmUgUExDUCBoZWFkZXIgKi8KKyAgICAvKiBGaXJzdCBNUERVICA6IChtcGR1SW5kICYgMHgzMCkgPT0gMHgwMCAqLworICAgIC8qIFNpbmdsZSBNUERVIDogKG1wZHVJbmQgJiAweDMwKSA9PSAweDIwICovCisgICAgaWYgKChhZGRJbmZvLT5UYWlsLkRhdGEuUnhNYWNTdGF0dXMgJiAweDEwKSA9PSAwKQorICAgIHsKKyAgICAgICAgLyogTW9kdWxhdGlvbiB0eXBlICovCisgICAgICAgIHdkLT5tb2R1bGF0aW9uVHlwZSA9IGFkZEluZm8tPlRhaWwuRGF0YS5SeE1hY1N0YXR1cyAmIDB4MDM7CisgICAgICAgIHN3aXRjaCh3ZC0+bW9kdWxhdGlvblR5cGUpCisgICAgICAgIHsKKyAgICAJCWNhc2UgMHgwOiB3ZC0+cmF0ZUZpZWxkID0gYWRkSW5mby0+UGxjcEhlYWRlclswXSAmIDB4ZmY7IC8vQ0NLIG1vZGUKKyAgICAgICAgICAgICAgICAgICAgICB3ZC0+cnhJbmZvID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAJCWNhc2UgMHgxOiB3ZC0+cmF0ZUZpZWxkID0gYWRkSW5mby0+UGxjcEhlYWRlclswXSAmIDB4MGY7IC8vTGVnYWN5LU9GRE0gbW9kZQorICAgICAgICAgICAgICAgICAgICAgIHdkLT5yeEluZm8gPSAwOworICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgIAkJY2FzZSAweDI6IHdkLT5yYXRlRmllbGQgPSBhZGRJbmZvLT5QbGNwSGVhZGVyWzNdOyAvL0hULU9GRE0gbW9kZQorICAgIAkJICAgICAgICAgIHdkLT5yeEluZm8gPSBhZGRJbmZvLT5QbGNwSGVhZGVyWzZdOworICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDogYnJlYWs7CisgICAgICAgICB9CisKKyAgICAgICAgcnhSYXRlS2JwcyA9IHpmVXBkYXRlUnhSYXRlKGRldik7CisgICAgICAgIGlmICh3ZC0+Q3VycmVudFJ4UmF0ZVVwZGF0ZWQgPT0gMSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHJ4UmF0ZUticHMgPiB3ZC0+Q3VycmVudFJ4UmF0ZUticHMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2QtPkN1cnJlbnRSeFJhdGVLYnBzID0gcnhSYXRlS2JwczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHdkLT5DdXJyZW50UnhSYXRlS2JwcyA9IHJ4UmF0ZUticHM7CisgICAgICAgICAgICB3ZC0+Q3VycmVudFJ4UmF0ZVVwZGF0ZWQgPSAxOworICAgICAgICB9CisgICAgfQorfQorI2lmIDAKK3UxNl90IHpjSW5kZXh0b1JhdGVCR1sxNl0gPSB7MTAwMCwgMjAwMCwgNTUwMCwgMTEwMDAsIDAsIDAsIDAsIDAsIDQ4MDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI0MDAwLCAxMjAwMCwgNjAwMCwgNTQwMDAsIDM2MDAwLCAxODAwMCwgOTAwMH07Cit1MzJfdCB6Y0luZGV4dG9SYXRlTjIwTFsxNl0gPSB7NjUwMCwgMTMwMDAsIDE5NTAwLCAyNjAwMCwgMzkwMDAsIDUyMDAwLCA1ODUwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDY1MDAwLCAxMzAwMCwgMjYwMDAsIDM5MDAwLCA1MjAwMCwgNzgwMDAsIDEwNDAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExNzAwMCwgMTMwMDAwfTsKK3UzMl90IHpjSW5kZXh0b1JhdGVOMjBTWzE2XSA9IHs3MjAwLCAxNDQwMCwgMjE3MDAsIDI4OTAwLCA0MzMwMCwgNTc4MDAsIDY1MDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzIyMDAsIDE0NDAwLCAyODkwMCwgNDMzMDAsIDU3ODAwLCA4NjcwMCwgMTE1NjAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTMwMDAwLCAxNDQ0MDB9OwordTMyX3QgemNJbmRleHRvUmF0ZU40MExbMTZdID0gezEzNTAwLCAyNzAwMCwgNDA1MDAsIDU0MDAwLCA4MTAwMCwgMTA4MDAwLCAxMjE1MDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMzUwMDAsIDI3MDAwLCA1NDAwMCwgODEwMDAsIDEwODAwMCwgMTYyMDAwLCAyMTYwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNDMwMDAsIDI3MDAwMH07Cit1MzJfdCB6Y0luZGV4dG9SYXRlTjQwU1sxNl0gPSB7MTUwMDAsIDMwMDAwLCA0NTAwMCwgNjAwMDAsIDkwMDAwLCAxMjAwMDAsIDEzNTAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE1MDAwMCwgMzAwMDAsIDYwMDAwLCA5MDAwMCwgMTIwMDAwLCAxODAwMDAsIDI0MDAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI3MDAwMCwgMzAwMDAwfTsKKyNlbmRpZgorCitleHRlcm4gdTE2X3QgemNJbmRleHRvUmF0ZUJHWzE2XTsKK2V4dGVybiB1MzJfdCB6Y0luZGV4dG9SYXRlTjIwTFsxNl07CitleHRlcm4gdTMyX3QgemNJbmRleHRvUmF0ZU4yMFNbMTZdOworZXh0ZXJuIHUzMl90IHpjSW5kZXh0b1JhdGVONDBMWzE2XTsKK2V4dGVybiB1MzJfdCB6Y0luZGV4dG9SYXRlTjQwU1sxNl07CisKK3UzMl90IHpmaVdsYW5RdWVyeVJ4UmF0ZSh6ZGV2X3QqIGRldikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB3ZC0+Q3VycmVudFJ4UmF0ZVVwZGF0ZWQgPSAwOworICAgIHJldHVybiB3ZC0+Q3VycmVudFJ4UmF0ZUticHM7Cit9CisKK3UzMl90IHpmVXBkYXRlUnhSYXRlKHpkZXZfdCogZGV2KQoreworICAgIHU4X3QgbWNzLCBiYW5kd2lkdGg7CisgICAgdTMyX3QgcnhSYXRlS2JwcyA9IDEzMDAwMDsKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBzd2l0Y2ggKHdkLT5tb2R1bGF0aW9uVHlwZSkKKyAgICB7CisJCWNhc2UgMHgwOiAvL0NDSyBtb2RlCisgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHdkLT5yYXRlRmllbGQpCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgY2FzZSAweDBhOiByeFJhdGVLYnBzID0gMTAwMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICBjYXNlIDB4MTQ6IHJ4UmF0ZUticHMgPSAyMDAwOworCisgICAgICAgICAgICAgICAgICAgICAgY2FzZSAweDM3OiByeFJhdGVLYnBzID0gNTUwMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICBjYXNlIDB4NmU6IHJ4UmF0ZUticHMgPSAxMTAwMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgYnJlYWs7CisJCWNhc2UgMHgxOiAvL0xlZ2FjeS1PRkRNIG1vZGUKKyAgICAgICAgICAgICAgICAgIGlmICh3ZC0+cmF0ZUZpZWxkIDw9IDE1KQorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgIHJ4UmF0ZUticHMgPSB6Y0luZGV4dG9SYXRlQkdbd2QtPnJhdGVGaWVsZF07CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICBicmVhazsKKwkJY2FzZSAweDI6IC8vSFQtT0ZETSBtb2RlCisJCSAgICAgICAgICBtY3MgPSB3ZC0+cmF0ZUZpZWxkICYgMHg3RjsKKwkJICAgICAgICAgIGJhbmR3aWR0aCA9IHdkLT5yYXRlRmllbGQgJiAweDgwOworICAgICAgICAgICAgICAgICAgaWYgKG1jcyA8PSAxNSkKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICBpZiAoYmFuZHdpZHRoICE9IDApCisgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICBpZigod2QtPnJ4SW5mbyAmIDB4ODApICE9IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNob3J0IEdJIDQwIE1IeiBNSU1PIFJhdGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ4UmF0ZUticHMgPSB6Y0luZGV4dG9SYXRlTjQwU1ttY3NdOworICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTG9uZyBHSSA0MCBNSHogTUlNTyBSYXRlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByeFJhdGVLYnBzID0gemNJbmRleHRvUmF0ZU40MExbbWNzXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICBpZigod2QtPnJ4SW5mbyAmIDB4ODApICE9IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNob3J0IEdJIDIwIE1IeiBNSU1PIFJhdGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ4UmF0ZUticHMgPSB6Y0luZGV4dG9SYXRlTjIwU1ttY3NdOworICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTG9uZyBHSSAyMCBNSHogTUlNTyBSYXRlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByeFJhdGVLYnBzID0gemNJbmRleHRvUmF0ZU4yMExbbWNzXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIC8vem1fbXNnMV9tbShaTV9MVl8wLCAid2QtPkN1cnJlbnRSeFJhdGVLYnBzPSIsIHdkLT5DdXJyZW50UnhSYXRlS2Jwcyk7CisKKyAgICAgLy8gVG9EbzogdXNlIGJhbmR3aXRoIGZpZWxkIHRvIGRlZmluZSA0ME1CCisgICAgcmV0dXJuIHJ4UmF0ZUticHM7Cit9CisKKy8qIEdldCBXTEFOIHN0YXN0aWNzICovCit1MTZfdCB6ZmlXbGFuR2V0U3RhdGlzdGljcyh6ZGV2X3QqIGRldikKK3sKKyAgICAvKiBSZXR1cm4gbGluayBzdGF0aXN0aWNzICovCisgICAgcmV0dXJuIDA7Cit9CisKK3UxNl90IHpmaVdsYW5SZXNldCh6ZGV2X3QqIGRldikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB3ZC0+c3RhdGUgPSBaTV9XTEFOX1NUQVRFX0RJU0FCTEVEOworCisgICAgcmV0dXJuIHpmV2xhblJlc2V0KGRldik7Cit9CisKKy8qIFJlc2V0IFdMQU4gKi8KK3UxNl90IHpmV2xhblJlc2V0KHpkZXZfdCogZGV2KQoreworICAgIHU4X3QgaXNDb25uZWN0ZWQ7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHptX2RlYnVnX21zZzAoInpmV2xhblJlc2V0Iik7CisKKyAgICBpc0Nvbm5lY3RlZCA9IHpmU3RhSXNDb25uZWN0ZWQoZGV2KTsKKworICAgIC8vaWYgKCB3ZC0+d2xhbk1vZGUgIT0gWk1fTU9ERV9BUCApCisgICAgeworICAgICAgICBpZiAoICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9JTkZSQVNUUlVDVFVSRSkmJgorICAgICAgICAgICAgICh3ZC0+c3RhLmN1cnJlbnRBdXRoTW9kZSAhPSBaTV9BVVRIX01PREVfV1BBMikgKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBzZW5kIGRlYXV0aGVudGljYXRpb24gZnJhbWUgKi8KKyAgICAgICAgICAgIGlmIChpc0Nvbm5lY3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvL3pmaVdsYW5EZWF1dGgoZGV2LCBOVUxMLCAwKTsKKyAgICAgICAgICAgICAgICB6ZlNlbmRNbUZyYW1lKGRldiwgWk1fV0xBTl9GUkFNRV9UWVBFX0RFQVVUSCwgd2QtPnN0YS5ic3NpZCwgMywgMCwgMCk7CisgICAgICAgICAgICAgICAgLy96bXdfZGVidWdfbXNnMCgic2VuZCBhIERlYXV0aCBmcmFtZSEiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHpmQ2hhbmdlQWRhcHRlclN0YXRlKGRldiwgWk1fU1RBX1NUQVRFX0RJU0NPTk5FQ1QpOworICAgIHpmSHBSZXNldEtleUNhY2hlKGRldik7CisKKyAgICBpZiAoaXNDb25uZWN0ZWQpCisgICAgeworICAgICAgICAvL3pmaVdsYW5EaXNhYmxlKGRldik7CisgICAgICAgIGlmICh3ZC0+emZjYkNvbm5lY3ROb3RpZnkgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgd2QtPnpmY2JDb25uZWN0Tm90aWZ5KGRldiwgWk1fU1RBVFVTX01FRElBX0NPTk5FQ1RJT05fUkVTRVQsIHdkLT5zdGEuYnNzaWQpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmICh3ZC0+emZjYkNvbm5lY3ROb3RpZnkgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgd2QtPnpmY2JDb25uZWN0Tm90aWZ5KGRldiwgWk1fU1RBVFVTX01FRElBX1JFU0VULCB3ZC0+c3RhLmJzc2lkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIHN0b3AgYmVhY29uICovCisgICAgemZIcERpc2FibGVCZWFjb24oZGV2KTsKKworICAgIC8qIEZyZWUgYnVmZmVyIGluIGRlZnJhZ21lbnQgbGlzdCovCisgICAgemZBZ2luZ0RlZnJhZ0xpc3QoZGV2LCAxKTsKKworICAgIC8qIEZsdXNoIFZUeFEgYW5kIE1tUSAqLworICAgIHpmRmx1c2hWdHhxKGRldik7CisKKyAgICAjaWZkZWYgWk1fRU5BQkxFX0FHR1JFR0FUSU9OCisgICAgLyogYWRkIGJ5IGhvbmRhICovCisgICAgemZBZ2dSeEZyZWVCdWYoZGV2LCAwKTsgIC8vMSBmb3IgcmVsZWFzZSBzdHJ1Y3R1cmUgbWVtb3J5CisgICAgLyogZW5kIG9mIGFkZCBieSBob25kYSAqLworICAgICNlbmRpZgorCisgICAgemZTdGFSZWZyZXNoQmxvY2tMaXN0KGRldiwgMSk7CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgemZUaW1lckNhbmNlbChkZXYsIFpNX0VWRU5UX0lCU1NfTU9OSVRPUik7CisgICAgemZUaW1lckNhbmNlbChkZXYsIFpNX0VWRU5UX0NNX0JMT0NLX1RJTUVSKTsKKyAgICB6ZlRpbWVyQ2FuY2VsKGRldiwgWk1fRVZFTlRfQ01fRElTQ09OTkVDVCk7CisKKyAgICB3ZC0+c3RhLmNvbm5lY3RTdGF0ZSA9IFpNX1NUQV9DT05OX1NUQVRFX05PTkU7CisgICAgd2QtPnN0YS5jb25uZWN0QnlSZWFzc28gPSBGQUxTRTsKKyAgICB3ZC0+c3RhLmNtRGlzYWxsb3dTc2lkTGVuZ3RoID0gMDsKKyAgICB3ZC0+c3RhLmJBdXRvUmVjb25uZWN0ID0gMDsKKyAgICB3ZC0+c3RhLkludGVybmFsU2NhblJlcSA9IDA7CisgICAgd2QtPnN0YS5lbmNyeU1vZGUgPSBaTV9OT19XRVA7CisgICAgd2QtPnN0YS53ZXBTdGF0dXMgPSBaTV9FTkNSWVBUSU9OX1dFUF9ESVNBQkxFRDsKKyAgICB3ZC0+c3RhLndwYVN0YXRlID0gWk1fU1RBX1dQQV9TVEFURV9JTklUOworICAgIHdkLT5zdGEuY21NaWNGYWlsdXJlQ291bnQgPSAwOworICAgIHdkLT5zdGEuaWJzc0Jzc0lzQ3JlYXRvciA9IDA7CisjaWZkZWYgWk1fRU5BQkxFX0lCU1NfV1BBMlBTSworICAgIHdkLT5zdGEuaWJzc1dwYTJQc2sgPSAwOworI2VuZGlmCisgICAgLyogcmVzZXQgY29ubmVjdCB0aW1lb3V0IGNvdW50ZXIgKi8KKyAgICB3ZC0+c3RhLmNvbm5lY3RUaW1lb3V0Q291bnQgPSAwOworCisgICAgLyogcmVzZXQgbGVhcCBlbmFibGUgdmFyaWFibGUgKi8KKyAgICB3ZC0+c3RhLmxlYXBFbmFibGVkID0gMDsKKworICAgIC8qIFJlc2V0IHRoZSBSSUZTIFN0YXR1cyAvIFJJRlMtbGlrZSBmcmFtZSBjb3VudCAvIFJJRlMgY291bnQgKi8KKyAgICBpZiggd2QtPnN0YS5yaWZzU3RhdGUgPT0gWk1fUklGU19TVEFURV9ERVRFQ1RFRCApCisgICAgICAgIHpmSHBEaXNhYmxlUmlmcyhkZXYpOworICAgIHdkLT5zdGEucmlmc1N0YXRlID0gWk1fUklGU19TVEFURV9ERVRFQ1RJTkc7CisgICAgd2QtPnN0YS5yaWZzTGlrZUZyYW1lQ250ID0gMDsKKyAgICB3ZC0+c3RhLnJpZnNDb3VudCA9IDA7CisKKyAgICB3ZC0+c3RhLm9zUnhGaWx0ZXIgPSAwOworICAgIHdkLT5zdGEuYlNhZmVNb2RlID0gMDsKKworICAgIC8vIENsZWFyIHRoZSBpbmZvcm1hdGlvbiBmb3IgdGhlIHBlZXIgc3RhdGlvbnMgb2YgSUJTUyBvciBBUCBvZiBTdGF0aW9uIG1vZGUKKyAgICB6Zlplcm9NZW1vcnkoKHU4X3QqKXdkLT5zdGEub3Bwb3NpdGVJbmZvLCBzaXplb2Yoc3RydWN0IHpzT3Bwb3NpdGVJbmZvKSAqIFpNX01BWF9PUFBPU0lURV9DT1VOVCk7CisKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgemZTY2FuTWdyU2NhblN0b3AoZGV2LCBaTV9TQ0FOX01HUl9TQ0FOX0lOVEVSTkFMKTsKKyAgICB6ZlNjYW5NZ3JTY2FuU3RvcChkZXYsIFpNX1NDQU5fTUdSX1NDQU5fRVhURVJOQUwpOworCisgICAgLyogVHVybiBvZmYgU29mdHdhcmUgV0VQL1RLSVAgKi8KKyAgICBpZiAod2QtPnN0YS5TV0VuY3J5cHRFbmFibGUgIT0gMCkKKyAgICB7CisgICAgICAgIHptX2RlYnVnX21zZzAoIkRpc2FibGUgc29mdHdhcmUgZW5jcnlwdGlvbiIpOworICAgICAgICB6ZlN0YURpc2FibGVTV0VuY3J5cHRpb24oZGV2KTsKKyAgICB9CisKKyAgICAvKiBJbXByb3ZlIFdFUC9US0lQIHBlcmZvcm1hY2Ugd2l0aCBIVCBBUCwgZGV0YWlsIGluZm9ybWF0aW9uIHBsZWFzZSBsb29rIGJ1ZyMzMjQ5NSAqLworICAgIC8vemZIcFNldFRUU0lGU1RpbWUoZGV2LCAweDgpOworCisgICAgLyogS2VlcCBQc2V1ZG8gbW9kZSAqLworICAgIGlmICggd2QtPndsYW5Nb2RlICE9IFpNX01PREVfUFNFVURPICkKKyAgICB7CisgICAgICAgIHdkLT53bGFuTW9kZSA9IFpNX01PREVfSU5GUkFTVFJVQ1RVUkU7CisgICAgfQorICAgIHJldHVybiAwOworfQorCisvKiBEZWF1dGhlbnRpY2F0ZSBhIFNUQSAqLwordTE2X3QgemZpV2xhbkRlYXV0aCh6ZGV2X3QqIGRldiwgdTE2X3QqIG1hY0FkZHIsIHUxNl90IHJlYXNvbikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBpZiAoIHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0FQICkKKyAgICB7CisgICAgICAgIC8vdTE2X3QgaWQ7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogd2Ugd2lsbCByZXNldCBhbGwga2V5IGluIHpmSHBSZXNldEtleUNhY2hlKCkgd2hlbiBjYWxsCisgICAgICAgICAqIHpmaVdsYW5EaXNhYmxlKCksIGlmIHdlIHdhbnQgdG8gcmVzZXQgUGFpcndpc2VLZXkgZm9yIGVhY2ggc3RhLAorICAgICAgICAgKiBuZWVkIHRvIHVzZSBhIG51bGxBZGRyIHRvIGxldCBrZXlpbmRleCBub3QgbWF0Y2guCisgICAgICAgICAqIG90aGVyd2lzZSBoYXJkd2FyZSB3aWxsIHN0aWxsIGZpbmQgUGFpcndpc2VLZXkgd2hlbiBBUCBjaGFuZ2UKKyAgICAgICAgICogZW5jcnlwdGlvbiBtb2RlIGZyb20gV1BBIHRvIFdFUAorICAgICAgICAgKi8KKworICAgICAgICAvKgorICAgICAgICBpZiAoKGlkID0gemZBcEZpbmRTdGEoZGV2LCBtYWNBZGRyKSkgIT0gMHhmZmZmKQorICAgICAgICB7CisgICAgICAgICAgICB1MzJfdCBrZXlbOF07CisgICAgICAgICAgICB1MTZfdCBudWxsQWRkclszXSA9IHsgMHgwLCAweDAsIDB4MCB9OworCisgICAgICAgICAgICBpZiAod2QtPmFwLnN0YVRhYmxlW2ldLmVuY3J5TW9kZSAhPSBaTV9OT19XRVApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgemZIcFNldEFwUGFpcndpc2VLZXkoZGV2LCBudWxsQWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgIFpNX05PX1dFUCwgJmtleVswXSwgJmtleVs0XSwgaSsxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vemZIcFNldEFwUGFpcndpc2VLZXkoZGV2LCAodTE2X3QgKiltYWNBZGRyLAorICAgICAgICAgICAgLy8gICAgICAgIFpNX05PX1dFUCwgJmtleVswXSwgJmtleVs0XSwgaWQrMSk7CisgICAgICAgICAgICB3ZC0+YXAuc3RhVGFibGVbaWRdLmVuY3J5TW9kZSA9IFpNX05PX1dFUDsKKyAgICAgICAgICAgIHdkLT5hcC5zdGFUYWJsZVtpZF0ua2V5SWR4ID0gMHhmZjsKKyAgICAgICAgfQorICAgICAgICAqLworCisgICAgICAgIHpmU2VuZE1tRnJhbWUoZGV2LCBaTV9XTEFOX0ZSQU1FX1RZUEVfREVBVVRILCBtYWNBZGRyLCByZWFzb24sIDAsIDApOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB6ZlNlbmRNbUZyYW1lKGRldiwgWk1fV0xBTl9GUkFNRV9UWVBFX0RFQVVUSCwgd2QtPnN0YS5ic3NpZCwgMywgMCwgMCk7CisgICAgfQorCisgICAgLyogSXNzdWUgREVBVVRIIGNvbW1hbmQgdG8gRlcgKi8KKyAgICByZXR1cm4gMDsKK30KKworCisvKiBYUCBwYWNrZXQgZmlsdGVyIGZlYXR1cmUgOiAqLworLyogMT0+ZW5hYmxlOiBBbGwgbXVsdGljYXN0IGFkZHJlc3MgcGFja2V0cywgbm90IGp1c3QgdGhlIG9uZXMgZW51bWVyYXRlZCBpbiB0aGUgbXVsdGljYXN0IGFkZHJlc3MgbGlzdC4gKi8KKy8qIDA9PmRpc2FibGUgKi8KK3ZvaWQgemZpV2xhblNldEFsbE11bHRpY2FzdCh6ZGV2X3QqIGRldiwgdTMyX3Qgc2V0dGluZykKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisgICAgem1fbXNnMV9tbShaTV9MVl8wLCAic3RhLmJBbGxNdWx0aWNhc3QgPSAiLCBzZXR0aW5nKTsKKyAgICB3ZC0+c3RhLmJBbGxNdWx0aWNhc3QgPSAodThfdClzZXR0aW5nOworfQorCisKKy8qIEhUIGNvbmZpZ3VyZSBBUEkgKi8KK3ZvaWQgemZpV2xhblNldEhUQ3RybCh6ZGV2X3QqIGRldiwgdTMyX3QgKnNldHRpbmcsIHUzMl90IGZvcmNlVHhUUEMpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgd2QtPnByZWFtYmxlVHlwZSAgICAgICAgPSAodThfdClzZXR0aW5nWzBdOworICAgIHdkLT5zdGEucHJlYW1ibGVUeXBlSFQgID0gKHU4X3Qpc2V0dGluZ1sxXTsKKyAgICB3ZC0+c3RhLmh0Q3RybEJhbmR3aWR0aCA9ICh1OF90KXNldHRpbmdbMl07CisgICAgd2QtPnN0YS5odEN0cmxTVEJDICAgICAgPSAodThfdClzZXR0aW5nWzNdOworICAgIHdkLT5zdGEuaHRDdHJsU0cgICAgICAgID0gKHU4X3Qpc2V0dGluZ1s0XTsKKyAgICB3ZC0+c3RhLmRlZmF1bHRUQSAgICAgICA9ICh1OF90KXNldHRpbmdbNV07CisgICAgd2QtPmVuYWJsZUFnZ3JlZ2F0aW9uICAgPSAodThfdClzZXR0aW5nWzZdOworICAgIHdkLT5lbmFibGVXRFMgICAgICAgICAgID0gKHU4X3Qpc2V0dGluZ1s3XTsKKworICAgIHdkLT5mb3JjZVR4VFBDICAgICAgICAgID0gZm9yY2VUeFRQQzsKK30KKworLyogRkI1MCBpbiBPUyBYUCwgUkQgcHJpdmF0ZSB0ZXN0IGNvZGUgKi8KK3ZvaWQgemZpV2xhblF1ZXJ5SFRDdHJsKHpkZXZfdCogZGV2LCB1MzJfdCAqc2V0dGluZywgdTMyX3QgKmZvcmNlVHhUUEMpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgc2V0dGluZ1swXSA9IHdkLT5wcmVhbWJsZVR5cGU7CisgICAgc2V0dGluZ1sxXSA9IHdkLT5zdGEucHJlYW1ibGVUeXBlSFQ7CisgICAgc2V0dGluZ1syXSA9IHdkLT5zdGEuaHRDdHJsQmFuZHdpZHRoOworICAgIHNldHRpbmdbM10gPSB3ZC0+c3RhLmh0Q3RybFNUQkM7CisgICAgc2V0dGluZ1s0XSA9IHdkLT5zdGEuaHRDdHJsU0c7CisgICAgc2V0dGluZ1s1XSA9IHdkLT5zdGEuZGVmYXVsdFRBOworICAgIHNldHRpbmdbNl0gPSB3ZC0+ZW5hYmxlQWdncmVnYXRpb247CisgICAgc2V0dGluZ1s3XSA9IHdkLT5lbmFibGVXRFM7CisKKyAgICAqZm9yY2VUeFRQQyA9IHdkLT5mb3JjZVR4VFBDOworfQorCit2b2lkIHpmaVdsYW5EYmcoemRldl90KiBkZXYsIHU4X3Qgc2V0dGluZykKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB3ZC0+ZW5hYmxlSEFMRGJnSW5mbyA9IHNldHRpbmc7Cit9CisKKy8qIEZCNTAgaW4gT1MgWFAsIFJEIHByaXZhdGUgdGVzdCBjb2RlICovCit2b2lkIHpmaVdsYW5TZXRSeFBhY2tldER1bXAoemRldl90KiBkZXYsIHUzMl90IHNldHRpbmcpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworICAgIGlmIChzZXR0aW5nKQorICAgIHsKKyAgICAgICAgd2QtPnJ4UGFja2V0RHVtcCA9IDE7ICAgLyogZW5hYmxlICovCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHdkLT5yeFBhY2tldER1bXAgPSAwOyAgIC8qIGRpc2FibGUgKi8KKyAgICB9Cit9CisKKworLyogRkI1MCBpbiBPUyBYUCwgUkQgcHJpdmF0ZSB0ZXN0IGNvZGUgKi8KKy8qIFRhbGx5ICovCit2b2lkIHpmaVdsYW5SZXNldFRhbGx5KHpkZXZfdCogZGV2KQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisJICAgd2QtPmNvbW1UYWxseS50eFVuaWNhc3RGcm0gPSAwOwkJLy90eFVuaWNhc3RGcmFtZXMKKwkgICB3ZC0+Y29tbVRhbGx5LnR4TXVsdGljYXN0RnJtID0gMDsJCS8vdHhNdWx0aWNhc3RGcmFtZXMKKwkgICB3ZC0+Y29tbVRhbGx5LnR4VW5pY2FzdE9jdGV0cyA9IDA7CS8vdHhVbmlPY3RldHMgIGJ5dGUgc2l6ZQorCSAgIHdkLT5jb21tVGFsbHkudHhNdWx0aWNhc3RPY3RldHMgPSAwOwkvL3R4TXVsdGlPY3RldHMgIGJ5dGUgc2l6ZQorCSAgIHdkLT5jb21tVGFsbHkudHhGcm1VcHBlck5ESVMgPSAwOworCSAgIHdkLT5jb21tVGFsbHkudHhGcm1EcnZNZ3QgPSAwOworCSAgIHdkLT5jb21tVGFsbHkuUmV0cnlGYWlsQ250ID0gMDsKKwkgICB3ZC0+Y29tbVRhbGx5Lkh3X1RvdGFsVHhGcm0gPSAwOwkJLy9IYXJkd2FyZSB0b3RhbCBUeCBGcmFtZQorCSAgIHdkLT5jb21tVGFsbHkuSHdfUmV0cnlDbnQgPSAwOwkJLy90eE11bHRpcGxlUmV0cmllc0ZyYW1lcworCSAgIHdkLT5jb21tVGFsbHkuSHdfVW5kZXJydW5DbnQgPSAwOy8vCisJICAgd2QtPmNvbW1UYWxseS5Ecml2ZXJSeEZybUNudCA9IDA7Ly8KKwkgICB3ZC0+Y29tbVRhbGx5LnJ4VW5pY2FzdEZybSA9IDA7CQkvL3J4VW5pY2FzdEZyYW1lcworCSAgIHdkLT5jb21tVGFsbHkucnhNdWx0aWNhc3RGcm0gPSAwOwkvL3J4TXVsdGljYXN0RnJhbWVzCisJICAgd2QtPmNvbW1UYWxseS5Ob3RpZnlORElTUnhGcm1DbnQgPSAwOy8vCisJICAgd2QtPmNvbW1UYWxseS5yeFVuaWNhc3RPY3RldHMgPSAwOwkvL3J4VW5pT2N0ZXRzICBieXRlIHNpemUKKwkgICB3ZC0+Y29tbVRhbGx5LnJ4TXVsdGljYXN0T2N0ZXRzID0gMDsJLy9yeE11bHRpT2N0ZXRzICBieXRlIHNpemUKKwkgICB3ZC0+Y29tbVRhbGx5LkRyaXZlckRpc2NhcmRlZEZybSA9IDA7Ly8gRGlzY2FyZCBieSBWYWxpZGF0ZUZyYW1lCisJICAgd2QtPmNvbW1UYWxseS5MZXNzVGhhbkRhdGFNaW5MZW4gPSAwOy8vCisJICAgd2QtPmNvbW1UYWxseS5HcmVhdGVyVGhhbk1heExlbiA9IDA7Ly8KKwkgICB3ZC0+Y29tbVRhbGx5LkRyaXZlckRpc2NhcmRlZEZybUNhdXNlQnlNdWx0aWNhc3RMaXN0ID0gMDsKKwkgICB3ZC0+Y29tbVRhbGx5LkRyaXZlckRpc2NhcmRlZEZybUNhdXNlQnlGcm1DdHJsID0gMDsKKwkgICB3ZC0+Y29tbVRhbGx5LnJ4TmVlZEZyZ0ZybSA9IDA7CQkvLyBuZWVkIG1vcmUgZnJnIGZybQorCSAgIHdkLT5jb21tVGFsbHkuRHJpdmVyUnhNZ3RGcm1DbnQgPSAwOworCSAgIHdkLT5jb21tVGFsbHkucnhCcm9hZGNhc3RGcm0gPSAwOwkvL1JlY2VpdmUgYnJvYWRjYXN0IGZyYW1lIGNvdW50CisJICAgd2QtPmNvbW1UYWxseS5yeEJyb2FkY2FzdE9jdGV0cyA9IDA7CS8vUmVjZWl2ZSBicm9hZGNhc3QgZnJhbWUgYnl0ZSBzaXplCisJICAgd2QtPmNvbW1UYWxseS5Id19Ub3RhbFJ4RnJtID0gMDsvLworCSAgIHdkLT5jb21tVGFsbHkuSHdfQ1JDMTZDbnQgPSAwOwkJLy9yeFBMQ1BDUkNFcnJDbnQKKwkgICB3ZC0+Y29tbVRhbGx5Lkh3X0NSQzMyQ250ID0gMDsJCS8vcnhDUkMzMkVyckNudAorCSAgIHdkLT5jb21tVGFsbHkuSHdfRGVjcnlwRXJyX1VOSSA9IDA7Ly8KKwkgICB3ZC0+Y29tbVRhbGx5Lkh3X0RlY3J5cEVycl9NdWwgPSAwOy8vCisJICAgd2QtPmNvbW1UYWxseS5Id19SeEZJRk9PdmVycnVuID0gMDsvLworCSAgIHdkLT5jb21tVGFsbHkuSHdfUnhUaW1lT3V0ID0gMDsKKwkgICB3ZC0+Y29tbVRhbGx5Lkxvc3NBUCA9IDA7Ly8KKworCSAgIHdkLT5jb21tVGFsbHkuVHhfTVBEVSA9IDA7CisJICAgd2QtPmNvbW1UYWxseS5CQV9GYWlsID0gMDsKKwkgICB3ZC0+Y29tbVRhbGx5Lkh3X1R4X0FNUERVID0gMDsKKwkgICB3ZC0+Y29tbVRhbGx5Lkh3X1R4X01QRFUgPSAwOworCisgICAgd2QtPmNvbW1UYWxseS50eFFvc0Ryb3BDb3VudFswXSA9IDA7CisgICAgd2QtPmNvbW1UYWxseS50eFFvc0Ryb3BDb3VudFsxXSA9IDA7CisgICAgd2QtPmNvbW1UYWxseS50eFFvc0Ryb3BDb3VudFsyXSA9IDA7CisgICAgd2QtPmNvbW1UYWxseS50eFFvc0Ryb3BDb3VudFszXSA9IDA7CisgICAgd2QtPmNvbW1UYWxseS50eFFvc0Ryb3BDb3VudFs0XSA9IDA7CisKKyAgICB3ZC0+Y29tbVRhbGx5Lkh3X1J4TVBEVSA9IDA7CisgICAgd2QtPmNvbW1UYWxseS5Id19SeERyb3BNUERVID0gMDsKKyAgICB3ZC0+Y29tbVRhbGx5Lkh3X1J4RGVsTVBEVSA9IDA7CisKKyAgICB3ZC0+Y29tbVRhbGx5Lkh3X1J4UGh5TWlzY0Vycm9yID0gMDsKKyAgICB3ZC0+Y29tbVRhbGx5Lkh3X1J4UGh5WFJFcnJvciA9IDA7CisgICAgd2QtPmNvbW1UYWxseS5Id19SeFBoeU9GRE1FcnJvciA9IDA7CisgICAgd2QtPmNvbW1UYWxseS5Id19SeFBoeUNDS0Vycm9yID0gMDsKKyAgICB3ZC0+Y29tbVRhbGx5Lkh3X1J4UGh5SFRFcnJvciA9IDA7CisgICAgd2QtPmNvbW1UYWxseS5Id19SeFBoeVRvdGFsQ291bnQgPSAwOworCisjaWYJKGRlZmluZWQoR0NDSykgJiYgZGVmaW5lZChPRkRNKSkKKwkgICB3ZC0+Y29tbVRhbGx5LnJ4MTFiRGF0YUZyYW1lID0gMDsKKwkgICB3ZC0+Y29tbVRhbGx5LnJ4T0ZETURhdGFGcmFtZSA9IDA7CisjZW5kaWYKKworICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7Cit9CisKKy8qIEZCNTAgaW4gT1MgWFAsIFJEIHByaXZhdGUgdGVzdCBjb2RlICovCit2b2lkIHpmaVdsYW5RdWVyeVRhbGx5KHpkZXZfdCogZGV2LCBzdHJ1Y3QgenNDb21tVGFsbHkgKnRhbGx5KQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIHpmTWVtb3J5Q29weSgodThfdCopdGFsbHksICh1OF90Kikmd2QtPmNvbW1UYWxseSwgc2l6ZW9mKHN0cnVjdCB6c0NvbW1UYWxseSkpOworICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7Cit9Cit2b2lkIHpmaVdsYW5RdWVyeVRyYWZUYWxseSh6ZGV2X3QqIGRldiwgc3RydWN0IHpzVHJhZlRhbGx5ICp0YWxseSkKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICB6Zk1lbW9yeUNvcHkoKHU4X3QqKXRhbGx5LCAodThfdCopJndkLT50cmFmVGFsbHksIHNpemVvZihzdHJ1Y3QgenNUcmFmVGFsbHkpKTsKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworfQorCit2b2lkIHpmaVdsYW5RdWVyeU1vbkhhbFJ4SW5mbyh6ZGV2X3QqIGRldiwgc3RydWN0IHpzTW9uSGFsUnhJbmZvICptb25IYWxSeEluZm8pCit7CisgICAgemZIcFF1ZXJ5TW9uSGFsUnhJbmZvKGRldiwgKHU4X3QgKiltb25IYWxSeEluZm8pOworfQorCisvKiBwYXJzZSB0aGUgbW9kZU1ES0VuYWJsZSB0byBEcnZDb3JlICovCit2b2lkIHpmaURLRW5hYmxlKHpkZXZfdCogZGV2LCB1MzJfdCBlbmFibGUpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgd2QtPm1vZGVNREtFbmFibGUgPSBlbmFibGU7CisgICAgem1fZGVidWdfbXNnMSgibW9kZU1ES0VuYWJsZSA9ICIsIHdkLT5tb2RlTURLRW5hYmxlKTsKK30KKworLyogYWlyb1BlZWsgKi8KK3UzMl90IHpmaVdsYW5RdWVyeVBhY2tldFR5cGVQcm9taXNjdW91cyh6ZGV2X3QqIGRldikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICByZXR1cm4gd2QtPnN3U25pZmZlcjsKK30KKworLyogYWlyb1BlZWsgKi8KK3ZvaWQgemZpV2xhblNldFBhY2tldFR5cGVQcm9taXNjdW91cyh6ZGV2X3QqIGRldiwgdTMyX3Qgc2V0VmFsdWUpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisJICAgd2QtPnN3U25pZmZlciA9IHNldFZhbHVlOworCSAgIHptX21zZzFfbW0oWk1fTFZfMCwgIndkLT5zd1NuaWZmZXIgIiwgd2QtPnN3U25pZmZlcik7CisJICAgaWYgKHNldFZhbHVlKQorCSAgIHsKKwkgICAgICAgCS8qIHdyaXRlIHJlZ2lzdGVyIGZvciBzbmlmZmVyIG1vZGUgKi8KKyAgICAgICAgICAgIHpmSHBTZXRTbmlmZmVyTW9kZShkZXYsIDEpOworICAgICAgICAgICAgem1fbXNnMF9tbShaTV9MVl8xLCAiZW5hbGJlIHNuaWZmZXIgbW9kZSIpOworCSAgIH0KKwkgICBlbHNlCisJICAgeworICAgICAgICAgICAgemZIcFNldFNuaWZmZXJNb2RlKGRldiwgMCk7CisgICAgICAgICAgICB6bV9tc2cwX21tKFpNX0xWXzAsICJkaXNhbGJlIHNuaWZmZXIgbW9kZSIpOworCSAgIH0KK30KKwordm9pZCB6ZmlXbGFuU2V0WExpbmtNb2RlKHpkZXZfdCogZGV2LCB1MzJfdCBzZXRWYWx1ZSkKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB3ZC0+WExpbmtNb2RlID0gc2V0VmFsdWU7CisgICAgaWYgKHNldFZhbHVlKQorICAgIHsKKyAgICAgICAgLyogd3JpdGUgcmVnaXN0ZXIgZm9yIHNuaWZmZXIgbW9kZSAqLworICAgICAgICB6ZkhwU2V0U25pZmZlck1vZGUoZGV2LCAxKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgemZIcFNldFNuaWZmZXJNb2RlKGRldiwgMCk7CisgICAgfQorfQorCitleHRlcm4gdm9pZCB6ZlN0YUNoYW5uZWxNYW5hZ2VtZW50KHpkZXZfdCogZGV2LCB1OF90IHNjYW4pOwordm9pZCB6ZmlTZXRDaGFubmVsTWFuYWdlbWVudCh6ZGV2X3QqIGRldiwgdTMyX3Qgc2V0dGluZykKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBzd2l0Y2ggKHNldHRpbmcpCisgICAgeworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICB3ZC0+c3RhLkVuYWJsZUhUID0gMTsKKyAgICAgICAgICAgIHdkLT5CYW5kV2lkdGg0MCA9IDE7CisgICAgICAgICAgICB3ZC0+RXh0T2Zmc2V0ICAgPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgIHdkLT5zdGEuRW5hYmxlSFQgPSAxOworICAgICAgICAgICAgd2QtPkJhbmRXaWR0aDQwID0gMTsKKyAgICAgICAgICAgIHdkLT5FeHRPZmZzZXQgICA9IDM7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgd2QtPnN0YS5FbmFibGVIVCA9IDE7CisgICAgICAgICAgICB3ZC0+QmFuZFdpZHRoNDAgPSAwOworICAgICAgICAgICAgd2QtPkV4dE9mZnNldCAgID0gMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgd2QtPkJhbmRXaWR0aDQwID0gMDsKKyAgICAgICAgICAgIHdkLT5FeHRPZmZzZXQgICA9IDA7CisgICAgICAgICAgICBicmVhazsKKworICAgIH0KKyAgICB6ZkNvcmVTZXRGcmVxdWVuY3lFeChkZXYsIHdkLT5mcmVxdWVuY3ksIHdkLT5CYW5kV2lkdGg0MCwKKyAgICAgICAgICAgICAgICAgICAgd2QtPkV4dE9mZnNldCwgTlVMTCk7Cit9CisKK3ZvaWQgemZpU2V0Umlmcyh6ZGV2X3QqIGRldiwgdTE2X3Qgc2V0dGluZykKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB3ZC0+c3RhLmllLkh0SW5mby5DaGFubmVsSW5mbyB8PSBFeHRIdENhcF9SSUZTTW9kZTsKKyAgICB3ZC0+c3RhLkVuYWJsZUhUID0gMTsKKyAgICBzd2l0Y2ggKHNldHRpbmcpCisgICAgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICB3ZC0+c3RhLkhUMjA0MCA9IDA7CisvLyAgICAgICAgICAgIHpmSHBTZXRSaWZzKGRldiwgMSwgMCwgKHdkLT5zdGEuY3VycmVudEZyZXF1ZW5jeSA8IDMwMDApPyAxOjApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIHdkLT5zdGEuSFQyMDQwID0gMTsKKy8vICAgICAgICAgICAgemZIcFNldFJpZnMoZGV2LCAxLCAxLCAod2QtPnN0YS5jdXJyZW50RnJlcXVlbmN5IDwgMzAwMCk/IDE6MCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHdkLT5zdGEuSFQyMDQwID0gMDsKKy8vICAgICAgICAgICAgemZIcFNldFJpZnMoZGV2LCAxLCAwLCAod2QtPnN0YS5jdXJyZW50RnJlcXVlbmN5IDwgMzAwMCk/IDE6MCk7CisgICAgICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK3ZvaWQgemZpQ2hlY2tSaWZzKHpkZXZfdCogZGV2KQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIGlmKHdkLT5zdGEuaWUuSHRJbmZvLkNoYW5uZWxJbmZvICYgRXh0SHRDYXBfUklGU01vZGUpCisgICAgeworLy8gICAgICAgIHpmSHBTZXRSaWZzKGRldiwgd2QtPnN0YS5FbmFibGVIVCwgd2QtPnN0YS5IVDIwNDAsICh3ZC0+c3RhLmN1cnJlbnRGcmVxdWVuY3kgPCAzMDAwKT8gMTowKTsKKyAgICB9Cit9CisKK3ZvaWQgemZpU2V0UmVvcmRlcih6ZGV2X3QqIGRldiwgdTE2X3QgdmFsdWUpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgd2QtPnJlb3JkZXIgPSB2YWx1ZTsKK30KKwordm9pZCB6ZmlTZXRTZXFEZWJ1Zyh6ZGV2X3QqIGRldiwgdTE2X3QgdmFsdWUpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgd2QtPnNlcV9kZWJ1ZyA9IHZhbHVlOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2NmdW5jLmMgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvY2Z1bmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kN2M0OWQ3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2NmdW5jLmMKQEAgLTAsMCArMSwxMjI3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggQXRoZXJvcyBDb21tdW5pY2F0aW9ucyBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgImNwcmVjb21wLmgiCisKK3U4X3QgemZRdWVyeU9wcG9zaXRlUmF0ZSh6ZGV2X3QqIGRldiwgdThfdCBkc3RfbWFjWzZdLCB1OF90IGZyYW1lVHlwZSkKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICAvKiBGb3IgQVAncyByYXRlIGFkYXB0aW9uICovCisgICAgaWYgKCB3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9BUCApCisgICAgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvKiBGb3IgU1RBJ3MgcmF0ZSBhZGFwdGlvbiAqLworICAgIGlmICggKGZyYW1lVHlwZSAmIDB4MGMpID09IFpNX1dMQU5fREFUQV9GUkFNRSApCisgICAgeworICAgICAgICBpZiAoIFpNX0lTX01VTFRJQ0FTVChkc3RfbWFjKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB3ZC0+c3RhLm1UeFJhdGU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gd2QtPnN0YS51VHhSYXRlOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHdkLT5zdGEubW1UeFJhdGU7Cit9CisKK3ZvaWQgemZDb3B5VG9JbnRUeEJ1ZmZlcih6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHU4X3QqIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICB1MTZfdCBvZmZzZXQsIHUxNl90IGxlbmd0aCkKK3sKKyAgICB1MTZfdCBpOworCisgICAgZm9yKGk9MDsgaTxsZW5ndGg7aSsrKQorICAgIHsKKyAgICAgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCtpLCBzcmNbaV0pOworICAgIH0KK30KKwordm9pZCB6ZkNvcHlUb1J4QnVmZmVyKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdThfdCogc3JjLAorICAgICAgICAgICAgICAgICAgICAgIHUxNl90IG9mZnNldCwgdTE2X3QgbGVuZ3RoKQoreworICAgIHUxNl90IGk7CisKKyAgICBmb3IoaT0wOyBpPGxlbmd0aDtpKyspCisgICAgeworICAgICAgICB6bXdfcnhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0K2ksIHNyY1tpXSk7CisgICAgfQorfQorCit2b2lkIHpmQ29weUZyb21JbnRUeEJ1ZmZlcih6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHU4X3QqIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxNl90IG9mZnNldCwgdTE2X3QgbGVuZ3RoKQoreworICAgIHUxNl90IGk7CisKKyAgICBmb3IoaT0wOyBpPGxlbmd0aDsgaSsrKQorICAgIHsKKyAgICAgICAgZHN0W2ldID0gem13X3R4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0K2kpOworICAgIH0KK30KKwordm9pZCB6ZkNvcHlGcm9tUnhCdWZmZXIoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1OF90KiBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICB1MTZfdCBvZmZzZXQsIHUxNl90IGxlbmd0aCkKK3sKKyAgICB1MTZfdCBpOworCisgICAgZm9yKGk9MDsgaTxsZW5ndGg7IGkrKykKKyAgICB7CisgICAgICAgIGRzdFtpXSA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCtpKTsKKyAgICB9Cit9CisKKyNpZiAxCit2b2lkIHpmTWVtb3J5Q29weSh1OF90KiBkc3QsIHU4X3QqIHNyYywgdTE2X3QgbGVuZ3RoKQoreworICAgIHpmd01lbW9yeUNvcHkoZHN0LCBzcmMsIGxlbmd0aCk7Cit9CisKK3ZvaWQgemZNZW1vcnlNb3ZlKHU4X3QqIGRzdCwgdThfdCogc3JjLCB1MTZfdCBsZW5ndGgpCit7CisgICAgemZ3TWVtb3J5TW92ZShkc3QsIHNyYywgbGVuZ3RoKTsKK30KKwordm9pZCB6Zlplcm9NZW1vcnkodThfdCogdmEsIHUxNl90IGxlbmd0aCkKK3sKKyAgICB6ZndaZXJvTWVtb3J5KHZhLCBsZW5ndGgpOworfQorCit1OF90IHpmTWVtb3J5SXNFcXVhbCh1OF90KiBtMSwgdThfdCogbTIsIHUxNl90IGxlbmd0aCkKK3sKKyAgICByZXR1cm4gemZ3TWVtb3J5SXNFcXVhbChtMSwgbTIsIGxlbmd0aCk7Cit9CisjZW5kaWYKKwordThfdCB6ZlJ4QnVmZmVyRXF1YWxUb1N0cih6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHU4X3QqIHN0ciwgdTE2X3Qgb2Zmc2V0LCB1MTZfdCBsZW5ndGgpCit7CisgICAgdTE2X3QgaTsKKyAgICB1OF90IGNoOworCisgICAgZm9yKGk9MDsgaTxsZW5ndGg7IGkrKykKKyAgICB7CisgICAgICAgIGNoID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0K2kpOworICAgICAgICBpZiAoIGNoICE9IHN0cltpXSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBUUlVFOworfQorCit2b2lkIHpmVHhCdWZmZXJDb3B5KHpkZXZfdCpkZXYsIHpidWZfdCogZHN0LCB6YnVmX3QqIHNyYywKKyAgICAgICAgICAgICAgICAgICAgdTE2X3QgZHN0T2Zmc2V0LCB1MTZfdCBzcmNPZmZzZXQsIHUxNl90IGxlbmd0aCkKK3sKKyAgICB1MTZfdCBpOworCisgICAgZm9yKGk9MDsgaTxsZW5ndGg7IGkrKykKKyAgICB7CisgICAgICAgIHptd190eF9idWZfd3JpdGViKGRldiwgZHN0LCBkc3RPZmZzZXQraSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgem13X3R4X2J1Zl9yZWFkYihkZXYsIHNyYywgc3JjT2Zmc2V0K2kpKTsKKyAgICB9Cit9CisKK3ZvaWQgemZSeEJ1ZmZlckNvcHkoemRldl90KmRldiwgemJ1Zl90KiBkc3QsIHpidWZfdCogc3JjLAorICAgICAgICAgICAgICAgICAgICB1MTZfdCBkc3RPZmZzZXQsIHUxNl90IHNyY09mZnNldCwgdTE2X3QgbGVuZ3RoKQoreworICAgIHUxNl90IGk7CisKKyAgICBmb3IoaT0wOyBpPGxlbmd0aDsgaSsrKQorICAgIHsKKyAgICAgICAgem13X3J4X2J1Zl93cml0ZWIoZGV2LCBkc3QsIGRzdE9mZnNldCtpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3JlYWRiKGRldiwgc3JjLCBzcmNPZmZzZXQraSkpOworICAgIH0KK30KKworCit2b2lkIHpmQ29sbGVjdEhXVGFsbHkoemRldl90KmRldiwgdTMyX3QqIHJzcCwgdThfdCBpZCkKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIGlmIChpZCA9PSAwKQorICAgIHsKKyAgICAgICAgd2QtPmNvbW1UYWxseS5Id19VbmRlcnJ1bkNudCArPSAoMHhGRkZGICYgcnNwWzFdKTsKKyAgICAgICAgd2QtPmNvbW1UYWxseS5Id19Ub3RhbFJ4RnJtICs9IHJzcFsyXTsKKyAgICAgICAgd2QtPmNvbW1UYWxseS5Id19DUkMzMkNudCArPSByc3BbM107CisgICAgICAgIHdkLT5jb21tVGFsbHkuSHdfQ1JDMTZDbnQgKz0gcnNwWzRdOworICAgICAgICAjaWZkZWYgWk1fRU5BQkxFX05BVElWRV9XSUZJCisgICAgICAgIC8qIFRoZXNlIGNvZGUgYXJlIGhlcmUgdG8gc2F0aXNmeSBWaXN0YSBEVE0gKi8KKyAgICAgICAgd2QtPmNvbW1UYWxseS5Id19EZWNyeXBFcnJfVU5JICs9ICgocnNwWzVdPjUwKSAmJiAocnNwWzVdPDYwKSk/NTA6cnNwWzVdOworICAgICAgICAjZWxzZQorICAgICAgICB3ZC0+Y29tbVRhbGx5Lkh3X0RlY3J5cEVycl9VTkkgKz0gcnNwWzVdOworICAgICAgICAjZW5kaWYKKyAgICAgICAgd2QtPmNvbW1UYWxseS5Id19SeEZJRk9PdmVycnVuICs9IHJzcFs2XTsKKyAgICAgICAgd2QtPmNvbW1UYWxseS5Id19EZWNyeXBFcnJfTXVsICs9IHJzcFs3XTsKKyAgICAgICAgd2QtPmNvbW1UYWxseS5Id19SZXRyeUNudCArPSByc3BbOF07CisgICAgICAgIHdkLT5jb21tVGFsbHkuSHdfVG90YWxUeEZybSArPSByc3BbOV07CisgICAgICAgIHdkLT5jb21tVGFsbHkuSHdfUnhUaW1lT3V0ICs9cnNwWzEwXTsKKworICAgICAgICB3ZC0+Y29tbVRhbGx5LlR4X01QRFUgKz0gcnNwWzExXTsKKyAgICAgICAgd2QtPmNvbW1UYWxseS5CQV9GYWlsICs9IHJzcFsxMl07CisgICAgICAgIHdkLT5jb21tVGFsbHkuSHdfVHhfQU1QRFUgKz0gcnNwWzEzXTsKKyAgICAgICAgd2QtPmNvbW1UYWxseS5Id19UeF9NUERVICs9IHJzcFsxNF07CisgICAgICAgIHdkLT5jb21tVGFsbHkuUmF0ZUN0cmxUeE1QRFUgKz0gcnNwWzExXTsKKyAgICAgICAgd2QtPmNvbW1UYWxseS5SYXRlQ3RybEJBRmFpbCArPSByc3BbMTJdOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB3ZC0+Y29tbVRhbGx5Lkh3X1J4TVBEVSArPSByc3BbMV07CisgICAgICAgIHdkLT5jb21tVGFsbHkuSHdfUnhEcm9wTVBEVSArPSByc3BbMl07CisgICAgICAgIHdkLT5jb21tVGFsbHkuSHdfUnhEZWxNUERVICs9IHJzcFszXTsKKworICAgICAgICB3ZC0+Y29tbVRhbGx5Lkh3X1J4UGh5TWlzY0Vycm9yICs9IHJzcFs0XTsKKyAgICAgICAgd2QtPmNvbW1UYWxseS5Id19SeFBoeVhSRXJyb3IgKz0gcnNwWzVdOworICAgICAgICB3ZC0+Y29tbVRhbGx5Lkh3X1J4UGh5T0ZETUVycm9yICs9IHJzcFs2XTsKKyAgICAgICAgd2QtPmNvbW1UYWxseS5Id19SeFBoeUNDS0Vycm9yICs9IHJzcFs3XTsKKyAgICAgICAgd2QtPmNvbW1UYWxseS5Id19SeFBoeUhURXJyb3IgKz0gcnNwWzhdOworICAgICAgICB3ZC0+Y29tbVRhbGx5Lkh3X1J4UGh5VG90YWxDb3VudCArPSByc3BbOV07CisgICAgfQorCisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIGlmIChpZCA9PSAwKQorICAgIHsKKyAgICAgICAgem1fbXNnMV9tbShaTV9MVl8xLCAicnNwbGVuID0iLCByc3BbMF0pOworICAgICAgICB6bV9tc2cxX21tKFpNX0xWXzEsICJId19VbmRlcnJ1bkNudCAgICA9ICIsICgweEZGRkYgJiByc3BbMV0pKTsKKyAgICAgICAgem1fbXNnMV9tbShaTV9MVl8xLCAiSHdfVG90YWxSeEZybSAgICAgPSAiLCByc3BbMl0pOworICAgICAgICB6bV9tc2cxX21tKFpNX0xWXzEsICJId19DUkMzMkNudCAgICAgICA9ICIsIHJzcFszXSk7CisgICAgICAgIHptX21zZzFfbW0oWk1fTFZfMSwgIkh3X0NSQzE2Q250ICAgICAgID0gIiwgcnNwWzRdKTsKKyAgICAgICAgem1fbXNnMV9tbShaTV9MVl8xLCAiSHdfRGVjcnlwRXJyX1VOSSAgPSAiLCByc3BbNV0pOworICAgICAgICB6bV9tc2cxX21tKFpNX0xWXzEsICJId19SeEZJRk9PdmVycnVuICA9ICIsIHJzcFs2XSk7CisgICAgICAgIHptX21zZzFfbW0oWk1fTFZfMSwgIkh3X0RlY3J5cEVycl9NdWwgID0gIiwgcnNwWzddKTsKKyAgICAgICAgem1fbXNnMV9tbShaTV9MVl8xLCAiSHdfUmV0cnlDbnQgICAgICAgPSAiLCByc3BbOF0pOworICAgICAgICB6bV9tc2cxX21tKFpNX0xWXzEsICJId19Ub3RhbFR4RnJtICAgICA9ICIsIHJzcFs5XSk7CisgICAgICAgIHptX21zZzFfbW0oWk1fTFZfMSwgIkh3X1J4VGltZU91dCAgICAgID0gIiwgcnNwWzEwXSk7CisgICAgICAgIHptX21zZzFfbW0oWk1fTFZfMSwgIlR4X01QRFUgICAgICAgICAgID0gIiwgcnNwWzExXSk7CisgICAgICAgIHptX21zZzFfbW0oWk1fTFZfMSwgIkJBX0ZhaWwgICAgICAgICAgID0gIiwgcnNwWzEyXSk7CisgICAgICAgIHptX21zZzFfbW0oWk1fTFZfMSwgIkh3X1R4X0FNUERVICAgICAgID0gIiwgcnNwWzEzXSk7CisgICAgICAgIHptX21zZzFfbW0oWk1fTFZfMSwgIkh3X1R4X01QRFUgICAgICAgID0gIiwgcnNwWzE0XSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHptX21zZzFfbW0oWk1fTFZfMSwgInJzcGxlbiAgICAgICAgICAgICA9ICIsIHJzcFswXSk7CisgICAgICAgIHptX21zZzFfbW0oWk1fTFZfMSwgIkh3X1J4TVBEVSAgICAgICAgICA9ICIsICgweEZGRkYgJiByc3BbMV0pKTsKKyAgICAgICAgem1fbXNnMV9tbShaTV9MVl8xLCAiSHdfUnhEcm9wTVBEVSAgICAgID0gIiwgcnNwWzJdKTsKKyAgICAgICAgem1fbXNnMV9tbShaTV9MVl8xLCAiSHdfUnhEZWxNUERVICAgICAgID0gIiwgcnNwWzNdKTsKKyAgICAgICAgem1fbXNnMV9tbShaTV9MVl8xLCAiSHdfUnhQaHlNaXNjRXJyb3IgID0gIiwgcnNwWzRdKTsKKyAgICAgICAgem1fbXNnMV9tbShaTV9MVl8xLCAiSHdfUnhQaHlYUkVycm9yICAgID0gIiwgcnNwWzVdKTsKKyAgICAgICAgem1fbXNnMV9tbShaTV9MVl8xLCAiSHdfUnhQaHlPRkRNRXJyb3IgID0gIiwgcnNwWzZdKTsKKyAgICAgICAgem1fbXNnMV9tbShaTV9MVl8xLCAiSHdfUnhQaHlDQ0tFcnJvciAgID0gIiwgcnNwWzddKTsKKyAgICAgICAgem1fbXNnMV9tbShaTV9MVl8xLCAiSHdfUnhQaHlIVEVycm9yICAgID0gIiwgcnNwWzhdKTsKKyAgICAgICAgem1fbXNnMV9tbShaTV9MVl8xLCAiSHdfUnhQaHlUb3RhbENvdW50ID0gIiwgcnNwWzldKTsKKyAgICB9CisKK30KKworLyogVGltZXIgcmVsYXRlZCBmdW5jdGlvbnMgKi8KK3ZvaWQgemZUaW1lckluaXQoemRldl90KiBkZXYpCit7CisgICAgdThfdCAgIGk7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bV9kZWJ1Z19tc2cwKCIiKTsKKworICAgIHdkLT50aW1lckxpc3QuZnJlZUNvdW50ID0gWk1fTUFYX1RJTUVSX0NPVU5UOworICAgIHdkLT50aW1lckxpc3QuaGVhZCA9ICYod2QtPnRpbWVyTGlzdC5saXN0WzBdKTsKKyAgICB3ZC0+dGltZXJMaXN0LnRhaWwgPSAmKHdkLT50aW1lckxpc3QubGlzdFtaTV9NQVhfVElNRVJfQ09VTlQtMV0pOworICAgIHdkLT50aW1lckxpc3QuaGVhZC0+cHJlID0gTlVMTDsKKyAgICB3ZC0+dGltZXJMaXN0LmhlYWQtPm5leHQgPSAmKHdkLT50aW1lckxpc3QubGlzdFsxXSk7CisgICAgd2QtPnRpbWVyTGlzdC50YWlsLT5wcmUgPSAmKHdkLT50aW1lckxpc3QubGlzdFtaTV9NQVhfVElNRVJfQ09VTlQtMl0pOworICAgIHdkLT50aW1lckxpc3QudGFpbC0+bmV4dCA9IE5VTEw7CisKKyAgICBmb3IoIGk9MTsgaTwoWk1fTUFYX1RJTUVSX0NPVU5ULTEpOyBpKysgKQorICAgIHsKKyAgICAgICAgd2QtPnRpbWVyTGlzdC5saXN0W2ldLnByZSA9ICYod2QtPnRpbWVyTGlzdC5saXN0W2ktMV0pOworICAgICAgICB3ZC0+dGltZXJMaXN0Lmxpc3RbaV0ubmV4dCA9ICYod2QtPnRpbWVyTGlzdC5saXN0W2krMV0pOworICAgIH0KKworICAgIHdkLT5iVGltZXJSZWFkeSA9IFRSVUU7Cit9CisKKwordTE2X3QgemZUaW1lclNjaGVkdWxlKHpkZXZfdCogZGV2LCB1MTZfdCBldmVudCwgdTMyX3QgdGljaykKK3sKKyAgICBzdHJ1Y3QgenNUaW1lckVudHJ5ICpwRnJlZUVudHJ5OworICAgIHN0cnVjdCB6c1RpbWVyRW50cnkgKnBFbnRyeTsKKyAgICB1OF90ICAgaSwgY291bnQ7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBpZiAoIHdkLT50aW1lckxpc3QuZnJlZUNvdW50ID09IDAgKQorICAgIHsKKyAgICAgICAgem1fZGVidWdfbXNnMCgibm8gbW9yZSB0aW1lciIpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICAvL3ptX2RlYnVnX21zZzIoImV2ZW50ID0gIiwgZXZlbnQpOworICAgIC8vem1fZGVidWdfbXNnMSgidGFyZ2V0IHRpY2sgPSAiLCB3ZC0+dGljayArIHRpY2spOworCisgICAgY291bnQgPSBaTV9NQVhfVElNRVJfQ09VTlQgLSB3ZC0+dGltZXJMaXN0LmZyZWVDb3VudDsKKworICAgIGlmICggY291bnQgPT0gMCApCisgICAgeworICAgICAgICB3ZC0+dGltZXJMaXN0LmZyZWVDb3VudC0tOworICAgICAgICB3ZC0+dGltZXJMaXN0LmhlYWQtPmV2ZW50ID0gZXZlbnQ7CisgICAgICAgIHdkLT50aW1lckxpc3QuaGVhZC0+dGltZXIgPSB3ZC0+dGljayArIHRpY2s7CisgICAgICAgIC8vem1fZGVidWdfbXNnMSgiZnJlZSB0aW1lciBjb3VudCA9ICIsIHdkLT50aW1lckxpc3QuZnJlZUNvdW50KTsKKworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBwRnJlZUVudHJ5ID0gd2QtPnRpbWVyTGlzdC50YWlsOworICAgIHBGcmVlRW50cnktPnRpbWVyID0gd2QtPnRpY2sgKyB0aWNrOworICAgIHBGcmVlRW50cnktPmV2ZW50ID0gZXZlbnQ7CisgICAgd2QtPnRpbWVyTGlzdC50YWlsID0gcEZyZWVFbnRyeS0+cHJlOworICAgIHBFbnRyeSA9IHdkLT50aW1lckxpc3QuaGVhZDsKKworICAgIGZvciggaT0wOyBpPGNvdW50OyBpKysgKQorICAgIHsKKyAgICAgICAgLy8gcHJldmVudCBmcm9tIHRoZSBjYXNlIG9mIHRpY2sgb3ZlcmZsb3cKKyAgICAgICAgaWYgKCAoIHBFbnRyeS0+dGltZXIgPiBwRnJlZUVudHJ5LT50aW1lciApJiYKKyAgICAgICAgICAgICAoKHBFbnRyeS0+dGltZXIgLSBwRnJlZUVudHJ5LT50aW1lcikgPCAxMDAwMDAwMDAwKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggaSAhPSAwICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwRnJlZUVudHJ5LT5wcmUgPSBwRW50cnktPnByZTsKKyAgICAgICAgICAgICAgICBwRnJlZUVudHJ5LT5wcmUtPm5leHQgPSBwRnJlZUVudHJ5OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBGcmVlRW50cnktPnByZSA9IE5VTEw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHBFbnRyeS0+cHJlID0gcEZyZWVFbnRyeTsKKyAgICAgICAgICAgIHBGcmVlRW50cnktPm5leHQgPSBwRW50cnk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHBFbnRyeSA9IHBFbnRyeS0+bmV4dDsKKyAgICB9CisKKyAgICBpZiAoIGkgPT0gMCApCisgICAgeworICAgICAgICB3ZC0+dGltZXJMaXN0LmhlYWQgPSBwRnJlZUVudHJ5OworICAgIH0KKworICAgIGlmICggaSA9PSBjb3VudCApCisgICAgeworICAgICAgICBwRnJlZUVudHJ5LT5wcmUgPSBwRW50cnktPnByZTsKKyAgICAgICAgcEZyZWVFbnRyeS0+cHJlLT5uZXh0ID0gcEZyZWVFbnRyeTsKKyAgICAgICAgcEVudHJ5LT5wcmUgPSBwRnJlZUVudHJ5OworICAgICAgICBwRnJlZUVudHJ5LT5uZXh0ID0gcEVudHJ5OworICAgIH0KKworICAgIHdkLT50aW1lckxpc3QuZnJlZUNvdW50LS07CisgICAgLy96bV9kZWJ1Z19tc2cxKCJmcmVlIHRpbWVyIGNvdW50ID0gIiwgd2QtPnRpbWVyTGlzdC5mcmVlQ291bnQpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3UxNl90IHpmVGltZXJDYW5jZWwoemRldl90KiBkZXYsIHUxNl90IGV2ZW50KQoreworICAgIHN0cnVjdCB6c1RpbWVyRW50cnkgKnBFbnRyeTsKKyAgICB1OF90ICAgaSwgY291bnQ7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICAvL3ptX2RlYnVnX21zZzIoImV2ZW50ID0gIiwgZXZlbnQpOworICAgIC8vem1fZGVidWdfbXNnMSgiZnJlZSB0aW1lciBjb3VudChiKSA9ICIsIHdkLT50aW1lckxpc3QuZnJlZUNvdW50KTsKKworICAgIHBFbnRyeSA9IHdkLT50aW1lckxpc3QuaGVhZDsKKyAgICBjb3VudCA9IFpNX01BWF9USU1FUl9DT1VOVCAtIHdkLT50aW1lckxpc3QuZnJlZUNvdW50OworCisgICAgZm9yKCBpPTA7IGk8Y291bnQ7IGkrKyApCisgICAgeworICAgICAgICBpZiAoIHBFbnRyeS0+ZXZlbnQgPT0gZXZlbnQgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHBFbnRyeSA9PSB3ZC0+dGltZXJMaXN0LmhlYWQgKQorICAgICAgICAgICAgeyAgIC8qIHJlbW92ZSBoZWFkIGVudHJ5ICovCisgICAgICAgICAgICAgICAgd2QtPnRpbWVyTGlzdC5oZWFkID0gcEVudHJ5LT5uZXh0OworICAgICAgICAgICAgICAgIHdkLT50aW1lckxpc3QudGFpbC0+bmV4dCA9IHBFbnRyeTsKKyAgICAgICAgICAgICAgICBwRW50cnktPnByZSA9IHdkLT50aW1lckxpc3QudGFpbDsKKyAgICAgICAgICAgICAgICB3ZC0+dGltZXJMaXN0LnRhaWwgPSBwRW50cnk7CisgICAgICAgICAgICAgICAgcEVudHJ5ID0gd2QtPnRpbWVyTGlzdC5oZWFkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeyAgIC8qIHJlbW92ZSBub24taGVhZCBlbnRyeSAqLworICAgICAgICAgICAgICAgIHBFbnRyeS0+cHJlLT5uZXh0ID0gcEVudHJ5LT5uZXh0OworICAgICAgICAgICAgICAgIHBFbnRyeS0+bmV4dC0+cHJlID0gcEVudHJ5LT5wcmU7CisgICAgICAgICAgICAgICAgd2QtPnRpbWVyTGlzdC50YWlsLT5uZXh0ID0gcEVudHJ5OworICAgICAgICAgICAgICAgIHBFbnRyeS0+cHJlID0gd2QtPnRpbWVyTGlzdC50YWlsOworICAgICAgICAgICAgICAgIHdkLT50aW1lckxpc3QudGFpbCA9IHBFbnRyeTsKKyAgICAgICAgICAgICAgICBwRW50cnkgPSBwRW50cnktPm5leHQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHdkLT50aW1lckxpc3QuZnJlZUNvdW50Kys7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwRW50cnkgPSBwRW50cnktPm5leHQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvL3ptX2RlYnVnX21zZzEoImZyZWUgdGltZXIgY291bnQoYSkgPSAiLCB3ZC0+dGltZXJMaXN0LmZyZWVDb3VudCk7CisKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCB6ZlRpbWVyQ2xlYXIoemRldl90KiBkZXYpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgd2QtPnRpbWVyTGlzdC5mcmVlQ291bnQgPSBaTV9NQVhfVElNRVJfQ09VTlQ7Cit9CisKK3UxNl90IHpmVGltZXJDaGVja0FuZEhhbmRsZSh6ZGV2X3QqIGRldikKK3sKKyAgICBzdHJ1Y3QgenNUaW1lckVudHJ5ICpwRW50cnk7CisgICAgc3RydWN0IHpzVGltZXJFbnRyeSAqcFRoZUxhc3RFbnRyeSA9IE5VTEw7CisgICAgdTE2X3QgIGV2ZW50W1pNX01BWF9USU1FUl9DT1VOVF07CisgICAgdThfdCAgIGksIGo9MCwgY291bnQ7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgaWYgKCAhd2QtPmJUaW1lclJlYWR5ICkKKyAgICB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICBwRW50cnkgPSB3ZC0+dGltZXJMaXN0LmhlYWQ7CisgICAgY291bnQgPSBaTV9NQVhfVElNRVJfQ09VTlQgLSB3ZC0+dGltZXJMaXN0LmZyZWVDb3VudDsKKworICAgIGZvciggaT0wOyBpPGNvdW50OyBpKysgKQorICAgIHsKKyAgICAgICAgLy8gcHJldmVudCBmcm9tIHRoZSBjYXNlIG9mIHRpY2sgb3ZlcmZsb3cKKyAgICAgICAgaWYgKCAoIHBFbnRyeS0+dGltZXIgPiB3ZC0+dGljayApJiYKKyAgICAgICAgICAgICAoKHBFbnRyeS0+dGltZXIgLSB3ZC0+dGljaykgPCAxMDAwMDAwMDAwKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgZXZlbnRbaisrXSA9IHBFbnRyeS0+ZXZlbnQ7CisgICAgICAgIHBUaGVMYXN0RW50cnkgPSBwRW50cnk7CisgICAgICAgIHBFbnRyeSA9IHBFbnRyeS0+bmV4dDsKKyAgICB9CisKKyAgICBpZiAoIGogPiAwICkKKyAgICB7CisgICAgICAgIHdkLT50aW1lckxpc3QudGFpbC0+bmV4dCA9IHdkLT50aW1lckxpc3QuaGVhZDsKKyAgICAgICAgd2QtPnRpbWVyTGlzdC5oZWFkLT5wcmUgPSB3ZC0+dGltZXJMaXN0LnRhaWw7CisgICAgICAgIHdkLT50aW1lckxpc3QuaGVhZCA9IHBFbnRyeTsKKyAgICAgICAgd2QtPnRpbWVyTGlzdC50YWlsID0gcFRoZUxhc3RFbnRyeTsKKyAgICAgICAgd2QtPnRpbWVyTGlzdC5mcmVlQ291bnQgKz0gajsKKyAgICAgICAgLy96bV9kZWJ1Z19tc2cxKCJmcmVlIHRpbWVyIGNvdW50ID0gIiwgd2QtPnRpbWVyTGlzdC5mcmVlQ291bnQpOworICAgIH0KKworICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICB6ZlByb2Nlc3NFdmVudChkZXYsIGV2ZW50LCBqKTsKKworICAgIHJldHVybiAwOworfQorCit1MzJfdCB6ZkNvcmVTZXRLZXkoemRldl90KiBkZXYsIHU4X3QgdXNlciwgdThfdCBrZXlJZCwgdThfdCB0eXBlLAorICAgICAgICB1MTZfdCogbWFjLCB1MzJfdCoga2V5KQoreworICAgIHUzMl90IHJldDsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICB3ZC0+c3RhLmZsYWdLZXlDaGFuZ2luZysrOworICAgIHptX2RlYnVnX21zZzEoIiAgIHpmQ29yZVNldEtleSsrKysgIiwgd2QtPnN0YS5mbGFnS2V5Q2hhbmdpbmcpOworICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICByZXQgPSB6ZkhwU2V0S2V5KGRldiwgdXNlciwga2V5SWQsIHR5cGUsIG1hYywga2V5KTsKKyAgICByZXR1cm4gcmV0OworfQorCit2b2lkIHpmQ29yZVNldEtleUNvbXBsZXRlKHpkZXZfdCogZGV2KQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisjaWYgMAorICAgIHdkLT5zdGEuZmxhZ0tleUNoYW5naW5nID0gMDsKKyNlbHNlCisgICAgaWYod2QtPnN0YS5mbGFnS2V5Q2hhbmdpbmcpCisgICAgeworICAgICAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICB3ZC0+c3RhLmZsYWdLZXlDaGFuZ2luZy0tOworICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIH0KKyNlbmRpZgorICAgIHptX2RlYnVnX21zZzEoIiAgemZDb3JlU2V0S2V5Q29tcGxldGUtLS0gIiwgd2QtPnN0YS5mbGFnS2V5Q2hhbmdpbmcpOworCisgICAgemZQdXNoVnR4cShkZXYpOworfQorCit2b2lkIHpmQ29yZUhhbEluaXRDb21wbGV0ZSh6ZGV2X3QqIGRldikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgd2QtPmhhbFN0YXRlID0gWk1fSEFMX1NUQVRFX1JVTk5JTkc7CisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIHpmUHVzaFZ0eHEoZGV2KTsKK30KKwordm9pZCB6ZkNvcmVNYWNBZGRyZXNzTm90aWZ5KHpkZXZfdCogZGV2LCB1OF90KiBhZGRyKQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHdkLT5tYWNBZGRyWzBdID0gYWRkclswXSB8ICgodTE2X3QpYWRkclsxXTw8OCk7CisgICAgd2QtPm1hY0FkZHJbMV0gPSBhZGRyWzJdIHwgKCh1MTZfdClhZGRyWzNdPDw4KTsKKyAgICB3ZC0+bWFjQWRkclsyXSA9IGFkZHJbNF0gfCAoKHUxNl90KWFkZHJbNV08PDgpOworCisKKyAgICAvL3pmSHBTZXRNYWNBZGRyZXNzKGRldiwgd2QtPm1hY0FkZHIsIDApOworICAgIGlmICh3ZC0+emZjYk1hY0FkZHJlc3NOb3RpZnkgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHdkLT56ZmNiTWFjQWRkcmVzc05vdGlmeShkZXYsIGFkZHIpOworICAgIH0KK30KKwordm9pZCB6ZkNvcmVTZXRJc29OYW1lKHpkZXZfdCogZGV2LCB1OF90KiBpc29OYW1lKQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHdkLT53cy5jb3VudHJ5SXNvTmFtZVswXSA9IGlzb05hbWVbMF07CisgICAgd2QtPndzLmNvdW50cnlJc29OYW1lWzFdID0gaXNvTmFtZVsxXTsKKyAgICB3ZC0+d3MuY291bnRyeUlzb05hbWVbMl0gPSAnXDAnOworIH0KKworCitleHRlcm4gdm9pZCB6ZlNjYW5NZ3JTY2FuRXZlbnRTdGFydCh6ZGV2X3QqIGRldik7CitleHRlcm4gdThfdCB6ZlNjYW5NZ3JTY2FuRXZlbnRUaW1lb3V0KHpkZXZfdCogZGV2KTsKK2V4dGVybiB2b2lkIHpmU2Nhbk1nclNjYW5FdmVudFJldHJ5KHpkZXZfdCogZGV2KTsKKwordm9pZCB6ZlByb2Nlc3NFdmVudCh6ZGV2X3QqIGRldiwgdTE2X3QqIGV2ZW50QXJyYXksIHU4X3QgZXZlbnRDb3VudCkKK3sKKyAgICB1OF90IGksIGosIGJ5cGFzcyA9IEZBTFNFOworICAgIHUxNl90IGV2ZW50QnlwYXNzWzMyXTsKKyAgICB1OF90IGV2ZW50QnlwYXNzQ291bnQgPSAwOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHpmWmVyb01lbW9yeSgodThfdCopIGV2ZW50QnlwYXNzLCA2NCk7CisKKyAgICBmb3IoIGk9MDsgaTxldmVudENvdW50OyBpKysgKQorICAgIHsKKyAgICAgICAgZm9yKCBqPTA7IGo8ZXZlbnRCeXBhc3NDb3VudDsgaisrICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCBldmVudEJ5cGFzc1tqXSA9PSBldmVudEFycmF5W2ldICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBieXBhc3MgPSBUUlVFOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKCBieXBhc3MgKQorICAgICAgICB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIHN3aXRjaCggZXZlbnRBcnJheVtpXSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgWk1fRVZFTlRfU0NBTjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHpmU2Nhbk1nclNjYW5FdmVudFN0YXJ0KGRldik7CisgICAgICAgICAgICAgICAgICAgIGV2ZW50QnlwYXNzW2V2ZW50QnlwYXNzQ291bnQrK10gPSBaTV9FVkVOVF9JTl9TQ0FOOworICAgICAgICAgICAgICAgICAgICBldmVudEJ5cGFzc1tldmVudEJ5cGFzc0NvdW50KytdID0gWk1fRVZFTlRfVElNRU9VVF9TQ0FOOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBaTV9FVkVOVF9USU1FT1VUX1NDQU46CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB1OF90IHJlczsKKworICAgICAgICAgICAgICAgICAgICByZXMgPSB6ZlNjYW5NZ3JTY2FuRXZlbnRUaW1lb3V0KGRldik7CisgICAgICAgICAgICAgICAgICAgIGlmICggcmVzID09IDAgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBldmVudEJ5cGFzc1tldmVudEJ5cGFzc0NvdW50KytdID0gWk1fRVZFTlRfVElNRU9VVF9TQ0FOOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCByZXMgPT0gMSApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50QnlwYXNzW2V2ZW50QnlwYXNzQ291bnQrK10gPSBaTV9FVkVOVF9JTl9TQ0FOOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIFpNX0VWRU5UX0lCU1NfTU9OSVRPUjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHpmU3RhSWJzc01vbml0b3JpbmcoZGV2LCAwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgWk1fRVZFTlRfSU5fU0NBTjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHpmU2Nhbk1nclNjYW5FdmVudFJldHJ5KGRldik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIFpNX0VWRU5UX0NNX1RJTUVSOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgem1fbXNnMF9tbShaTV9MVl8wLCAiWk1fRVZFTlRfQ01fVElNRVIiKTsKKworICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLmNtTWljRmFpbHVyZUNvdW50ID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgWk1fRVZFTlRfQ01fRElTQ09OTkVDVDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHptX21zZzBfbW0oWk1fTFZfMCwgIlpNX0VWRU5UX0NNX0RJU0NPTk5FQ1QiKTsKKworICAgICAgICAgICAgICAgICAgICB6ZkNoYW5nZUFkYXB0ZXJTdGF0ZShkZXYsIFpNX1NUQV9TVEFURV9ESVNDT05ORUNUKTsKKworICAgICAgICAgICAgICAgICAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICAgICAgICAgICAgICAvL3pmVGltZXJTY2hlZHVsZShkZXYsIFpNX0VWRU5UX0NNX0JMT0NLX1RJTUVSLAorICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICBaTV9USUNLX0NNX0JMT0NLX1RJTUVPVVQpOworCisgICAgICAgICAgICAgICAgICAgIC8qIFRpbWVyIFJlc29sdXRpb24gb24gV2luWFAgaXMgMTUvMTYgbXMgICovCisgICAgICAgICAgICAgICAgICAgIC8qIERlY3JlYXNlIFRpbWUgb2Zmc2V0IGZvciA8WFA+IENvdW50ZXIgTWVhc3VyZSAqLworICAgICAgICAgICAgICAgICAgICB6ZlRpbWVyU2NoZWR1bGUoZGV2LCBaTV9FVkVOVF9DTV9CTE9DS19USU1FUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWk1fVElDS19DTV9CTE9DS19USU1FT1VUIC0gWk1fVElDS19DTV9CTE9DS19USU1FT1VUX09GRlNFVCk7CisKKyAgICAgICAgICAgICAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5jbU1pY0ZhaWx1cmVDb3VudCA9IDA7CisgICAgICAgICAgICAgICAgICAgIC8vemZpV2xhbkRpc2FibGUoZGV2KTsKKyAgICAgICAgICAgICAgICAgICAgemZIcFJlc2V0S2V5Q2FjaGUoZGV2KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHdkLT56ZmNiQ29ubmVjdE5vdGlmeSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+emZjYkNvbm5lY3ROb3RpZnkoZGV2LCBaTV9TVEFUVVNfTUVESUFfRElTQ09OTkVDVF9NSUNfRkFJTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5ic3NpZCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgWk1fRVZFTlRfQ01fQkxPQ0tfVElNRVI6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB6bV9tc2cwX21tKFpNX0xWXzAsICJaTV9FVkVOVF9DTV9CTE9DS19USU1FUiIpOworCisgICAgICAgICAgICAgICAgICAgIC8vem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5jbURpc2FsbG93U3NpZExlbmd0aCA9IDA7CisgICAgICAgICAgICAgICAgICAgIGlmICggd2QtPnN0YS5iQXV0b1JlY29ubmVjdCApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHptX21zZzBfbW0oWk1fTFZfMCwgIlpNX0VWRU5UX0NNX0JMT0NLX1RJTUVSOmJBdXRvUmVjb25uZWN0IT0wIik7CisgICAgICAgICAgICAgICAgICAgICAgICB6ZlNjYW5NZ3JTY2FuU3RvcChkZXYsIFpNX1NDQU5fTUdSX1NDQU5fSU5URVJOQUwpOworICAgICAgICAgICAgICAgICAgICAgICAgemZTY2FuTWdyU2NhblN0YXJ0KGRldiwgWk1fU0NBTl9NR1JfU0NBTl9JTlRFUk5BTCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy96bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBaTV9FVkVOVF9USU1FT1VUX0FEREJBOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCF3ZC0+YWRkYmFDb21wbGV0ZSAmJiAod2QtPmFkZGJhQ291bnQgPCA1KSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgemZBZ2dTZW5kQWRkYmFSZXF1ZXN0KGRldiwgd2QtPnN0YS5ic3NpZCwgMCwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+YWRkYmFDb3VudCsrOworICAgICAgICAgICAgICAgICAgICAgICAgemZUaW1lclNjaGVkdWxlKGRldiwgWk1fRVZFTlRfVElNRU9VVF9BRERCQSwgMTAwKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHpmVGltZXJDYW5jZWwoZGV2LCBaTV9FVkVOVF9USU1FT1VUX0FEREJBKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgI2lmZGVmIFpNX0VOQUJMRV9QRVJGT1JNQU5DRV9FVkFMVUFUSU9OCisgICAgICAgICAgICBjYXNlIFpNX0VWRU5UX1RJTUVPVVRfUEVSRk9STUFOQ0U6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB6ZmlQZXJmb3JtYW5jZVJlZnJlc2goZGV2KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgIGNhc2UgWk1fRVZFTlRfU0tJUF9DT1VOVEVSTUVBU1VSRToKKwkJCQkvL2VuYWJsZSB0aGUgQ291bnRlcm1lYXN1cmUKKwkJCQl7CisJCQkJCXptX2RlYnVnX21zZzAoIkNvdW50ZXJtZWFzdXJlIDogRW5hYmxlIE1JQyBDaGVjayAiKTsKKwkJCQkJd2QtPlRLSVBfR3JvdXBfS2V5Q2hhbmdpbmcgPSAweDA7CisJCQkJfQorCQkJCWJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIHpmQnNzSW5mb0NyZWF0ZSh6ZGV2X3QqIGRldikKK3sKKyAgICB1OF90ICAgaTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgd2QtPnN0YS5ic3NMaXN0LmJzc0NvdW50ID0gMDsKKyAgICB3ZC0+c3RhLmJzc0xpc3QuaGVhZCA9IE5VTEw7CisgICAgd2QtPnN0YS5ic3NMaXN0LnRhaWwgPSBOVUxMOworICAgIHdkLT5zdGEuYnNzSW5mb0FycmF5SGVhZCA9IDA7CisgICAgd2QtPnN0YS5ic3NJbmZvQXJyYXlUYWlsID0gMDsKKyAgICB3ZC0+c3RhLmJzc0luZm9GcmVlQ291bnQgPSBaTV9NQVhfQlNTOworCisgICAgZm9yKCBpPTA7IGk8IFpNX01BWF9CU1M7IGkrKyApCisgICAgeworICAgICAgICAvL3dkLT5zdGEuYnNzSW5mb0FycmF5W2ldID0gJih3ZC0+c3RhLmJzc0luZm9Qb29sW2ldKTsKKyAgICAgICAgd2QtPnN0YS5ic3NJbmZvQXJyYXlbaV0gPSB6ZndNZW1BbGxvY2F0ZShkZXYsIHNpemVvZihzdHJ1Y3QgenNCc3NJbmZvKSk7CisKKyAgICB9CisKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworfQorCit2b2lkIHpmQnNzSW5mb0Rlc3Ryb3koemRldl90KiBkZXYpCit7CisgICAgdThfdCAgIGk7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgemZCc3NJbmZvUmVmcmVzaChkZXYsIDEpOworCisgICAgZm9yKCBpPTA7IGk8IFpNX01BWF9CU1M7IGkrKyApCisgICAgeworICAgICAgICBpZiAod2QtPnN0YS5ic3NJbmZvQXJyYXlbaV0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgemZ3TWVtRnJlZShkZXYsIHdkLT5zdGEuYnNzSW5mb0FycmF5W2ldLCBzaXplb2Yoc3RydWN0IHpzQnNzSW5mbykpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgem1fYXNzZXJ0KDApOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybjsKK30KKworc3RydWN0IHpzQnNzSW5mbyogemZCc3NJbmZvQWxsb2NhdGUoemRldl90KiBkZXYpCit7CisgICAgc3RydWN0IHpzQnNzSW5mbyogcEJzc0luZm87CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBpZiAod2QtPnN0YS5ic3NJbmZvRnJlZUNvdW50ID09IDApCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgcEJzc0luZm8gPSB3ZC0+c3RhLmJzc0luZm9BcnJheVt3ZC0+c3RhLmJzc0luZm9BcnJheUhlYWRdOworICAgIHdkLT5zdGEuYnNzSW5mb0FycmF5W3dkLT5zdGEuYnNzSW5mb0FycmF5SGVhZF0gPSBOVUxMOworICAgIHdkLT5zdGEuYnNzSW5mb0FycmF5SGVhZCA9ICh3ZC0+c3RhLmJzc0luZm9BcnJheUhlYWQgKyAxKSAmIChaTV9NQVhfQlNTIC0gMSk7CisgICAgd2QtPnN0YS5ic3NJbmZvRnJlZUNvdW50LS07CisKKyAgICB6Zlplcm9NZW1vcnkoKHU4X3QqKXBCc3NJbmZvLCBzaXplb2Yoc3RydWN0IHpzQnNzSW5mbykpOworCisgICAgcmV0dXJuIHBCc3NJbmZvOworfQorCit2b2lkIHpmQnNzSW5mb0ZyZWUoemRldl90KiBkZXYsIHN0cnVjdCB6c0Jzc0luZm8qIHBCc3NJbmZvKQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptX2Fzc2VydCh3ZC0+c3RhLmJzc0luZm9BcnJheVt3ZC0+c3RhLmJzc0luZm9BcnJheVRhaWxdID09IE5VTEwpOworCisgICAgcEJzc0luZm8tPnNpZ25hbFN0cmVuZ3RoID0gcEJzc0luZm8tPnNpZ25hbFF1YWxpdHkgPSAwOworICAgIHBCc3NJbmZvLT5zb3J0VmFsdWUgPSAwOworCisgICAgd2QtPnN0YS5ic3NJbmZvQXJyYXlbd2QtPnN0YS5ic3NJbmZvQXJyYXlUYWlsXSA9IHBCc3NJbmZvOworICAgIHdkLT5zdGEuYnNzSW5mb0FycmF5VGFpbCA9ICh3ZC0+c3RhLmJzc0luZm9BcnJheVRhaWwgKyAxKSAmIChaTV9NQVhfQlNTIC0gMSk7CisgICAgd2QtPnN0YS5ic3NJbmZvRnJlZUNvdW50Kys7Cit9CisKK3ZvaWQgemZCc3NJbmZvUmVvcmRlckxpc3QoemRldl90KiBkZXYpCit7CisgICAgc3RydWN0IHpzQnNzSW5mbyogcEJzc0luZm8gPSBOVUxMOworICAgIHN0cnVjdCB6c0Jzc0luZm8qIHBJbnNCc3NJbmZvID0gTlVMTDsKKyAgICBzdHJ1Y3QgenNCc3NJbmZvKiBwTmV4dEJzc0luZm8gPSBOVUxMOworICAgIHN0cnVjdCB6c0Jzc0luZm8qIHBQcmVCc3NJbmZvID0gTlVMTDsKKyAgICB1OF90IGkgPSAwOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICBpZiAod2QtPnN0YS5ic3NMaXN0LmJzc0NvdW50ID4gMSkKKyAgICB7CisgICAgICAgIHBJbnNCc3NJbmZvID0gd2QtPnN0YS5ic3NMaXN0LmhlYWQ7CisgICAgICAgIHdkLT5zdGEuYnNzTGlzdC50YWlsID0gcEluc0Jzc0luZm87CisgICAgICAgIHBCc3NJbmZvID0gcEluc0Jzc0luZm8tPm5leHQ7CisgICAgICAgIHBJbnNCc3NJbmZvLT5uZXh0ID0gTlVMTDsKKyAgICAgICAgd2hpbGUgKHBCc3NJbmZvICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGkgPSAwOworICAgICAgICAgICAgd2hpbGUgKDEpCisgICAgICAgICAgICB7CisvLyAgICAgICAgICAgICAgICBpZiAocEJzc0luZm8tPnNpZ25hbFN0cmVuZ3RoID49IHBJbnNCc3NJbmZvLT5zaWduYWxTdHJlbmd0aCkKKyAgICAgICAgICAgICAgICBpZiggcEJzc0luZm8tPnNvcnRWYWx1ZSA+PSBwSW5zQnNzSW5mby0+c29ydFZhbHVlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGk9PTApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vSW5zZXJ0IEJzc0luZm8gdG8gaGVhZAorICAgICAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5ic3NMaXN0LmhlYWQgPSBwQnNzSW5mbzsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBOZXh0QnNzSW5mbyA9IHBCc3NJbmZvLT5uZXh0OworICAgICAgICAgICAgICAgICAgICAgICAgcEJzc0luZm8tPm5leHQgPSBwSW5zQnNzSW5mbzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy9JbnNlcnQgQnNzSW5mbyB0byBuZWl0aGVyIGhlYWQgbm9yIHRhaWwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBQcmVCc3NJbmZvLT5uZXh0ID0gcEJzc0luZm87CisgICAgICAgICAgICAgICAgICAgICAgICBwTmV4dEJzc0luZm8gPSBwQnNzSW5mby0+bmV4dDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBCc3NJbmZvLT5uZXh0ID0gcEluc0Jzc0luZm87CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAocEluc0Jzc0luZm8tPm5leHQgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy9TaWduYWwgc3RyZW5ndGggc21hbGxlciB0aGFuIGN1cnJlbnQgQnNzSW5mbywgY2hlY2sgbmV4dAorICAgICAgICAgICAgICAgICAgICAgICAgcFByZUJzc0luZm8gPSBwSW5zQnNzSW5mbzsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBJbnNCc3NJbmZvID0gcEluc0Jzc0luZm8tPm5leHQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvL0luc2VydCBCc3NJbmZvIHRvIHRhaWwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBJbnNCc3NJbmZvLT5uZXh0ID0gcEJzc0luZm87CisgICAgICAgICAgICAgICAgICAgICAgICBwTmV4dEJzc0luZm8gPSBwQnNzSW5mby0+bmV4dDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEuYnNzTGlzdC50YWlsID0gcEJzc0luZm87CisgICAgICAgICAgICAgICAgICAgICAgICBwQnNzSW5mby0+bmV4dCA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwQnNzSW5mbyA9IHBOZXh0QnNzSW5mbzsKKyAgICAgICAgICAgIHBJbnNCc3NJbmZvID0gd2QtPnN0YS5ic3NMaXN0LmhlYWQ7CisgICAgICAgIH0KKyAgICB9IC8vaWYgKHdkLT5zdGEuYnNzTGlzdC5ic3NDb3VudCA+IDEpCisKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworfQorCit2b2lkIHpmQnNzSW5mb0luc2VydFRvTGlzdCh6ZGV2X3QqIGRldiwgc3RydWN0IHpzQnNzSW5mbyogcEJzc0luZm8pCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem1fYXNzZXJ0KHBCc3NJbmZvKTsKKworICAgIC8vem1fZGVidWdfbXNnMigicEJzc0luZm8gPSAiLCBwQnNzSW5mbyk7CisKKyAgICBpZiAoIHdkLT5zdGEuYnNzTGlzdC5ic3NDb3VudCA9PSAwICkKKyAgICB7CisgICAgICAgIHdkLT5zdGEuYnNzTGlzdC5oZWFkID0gcEJzc0luZm87CisgICAgICAgIHdkLT5zdGEuYnNzTGlzdC50YWlsID0gcEJzc0luZm87CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHdkLT5zdGEuYnNzTGlzdC50YWlsLT5uZXh0ID0gcEJzc0luZm87CisgICAgICAgIHdkLT5zdGEuYnNzTGlzdC50YWlsID0gcEJzc0luZm87CisgICAgfQorCisgICAgcEJzc0luZm8tPm5leHQgPSBOVUxMOworICAgIHdkLT5zdGEuYnNzTGlzdC5ic3NDb3VudCsrOworCisgICAgLy96bV9kZWJ1Z19tc2cyKCJic3MgY291bnQgPSAiLCB3ZC0+c3RhLmJzc0xpc3QuYnNzQ291bnQpOworfQorCit2b2lkIHpmQnNzSW5mb1JlbW92ZUZyb21MaXN0KHpkZXZfdCogZGV2LCBzdHJ1Y3QgenNCc3NJbmZvKiBwQnNzSW5mbykKK3sKKyAgICBzdHJ1Y3QgenNCc3NJbmZvKiBwTm93QnNzSW5mbzsKKyAgICBzdHJ1Y3QgenNCc3NJbmZvKiBwUHJlQnNzSW5mbyA9IE5VTEw7CisgICAgdThfdCAgIGk7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bV9hc3NlcnQocEJzc0luZm8pOworICAgIHptX2Fzc2VydCh3ZC0+c3RhLmJzc0xpc3QuYnNzQ291bnQpOworCisgICAgLy96bV9kZWJ1Z19tc2cyKCJwQnNzSW5mbyA9ICIsIHBCc3NJbmZvKTsKKworICAgIHBOb3dCc3NJbmZvID0gd2QtPnN0YS5ic3NMaXN0LmhlYWQ7CisKKyAgICBmb3IoIGk9MDsgaTx3ZC0+c3RhLmJzc0xpc3QuYnNzQ291bnQ7IGkrKyApCisgICAgeworICAgICAgICBpZiAoIHBOb3dCc3NJbmZvID09IHBCc3NJbmZvICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCBpID09IDAgKQorICAgICAgICAgICAgeyAgIC8qIHJlbW92ZSBoZWFkICovCisgICAgICAgICAgICAgICAgd2QtPnN0YS5ic3NMaXN0LmhlYWQgPSBwQnNzSW5mby0+bmV4dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwUHJlQnNzSW5mby0+bmV4dCA9IHBCc3NJbmZvLT5uZXh0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIGkgPT0gKHdkLT5zdGEuYnNzTGlzdC5ic3NDb3VudCAtIDEpICkKKyAgICAgICAgICAgIHsgICAvKiByZW1vdmUgdGFpbCAqLworICAgICAgICAgICAgICAgIHdkLT5zdGEuYnNzTGlzdC50YWlsID0gcFByZUJzc0luZm87CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgcFByZUJzc0luZm8gPSBwTm93QnNzSW5mbzsKKyAgICAgICAgcE5vd0Jzc0luZm8gPSBwTm93QnNzSW5mby0+bmV4dDsKKyAgICB9CisKKyAgICB6bV9hc3NlcnQoaSAhPSB3ZC0+c3RhLmJzc0xpc3QuYnNzQ291bnQpOworICAgIHdkLT5zdGEuYnNzTGlzdC5ic3NDb3VudC0tOworCisgICAgLy96bV9kZWJ1Z19tc2cyKCJic3MgY291bnQgPSAiLCB3ZC0+c3RhLmJzc0xpc3QuYnNzQ291bnQpOworfQorCit2b2lkIHpmQnNzSW5mb1JlZnJlc2goemRldl90KiBkZXYsIHUxNl90IG1vZGUpCit7CisgICAgc3RydWN0IHpzQnNzSW5mbyogICBwQnNzSW5mbzsKKyAgICBzdHJ1Y3QgenNCc3NJbmZvKiAgIHBOZXh0QnNzSW5mbzsKKyAgICB1OF90ICAgaSwgYnNzQ291bnQ7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBwQnNzSW5mbyA9IHdkLT5zdGEuYnNzTGlzdC5oZWFkOworICAgIGJzc0NvdW50ID0gd2QtPnN0YS5ic3NMaXN0LmJzc0NvdW50OworCisgICAgZm9yKCBpPTA7IGk8YnNzQ291bnQ7IGkrKyApCisgICAgeworICAgICAgICBpZiAobW9kZSA9PSAxKQorICAgICAgICB7CisgICAgICAgICAgICBwTmV4dEJzc0luZm8gPSBwQnNzSW5mby0+bmV4dDsKKyAgICAgICAgICAgIHpmQnNzSW5mb1JlbW92ZUZyb21MaXN0KGRldiwgcEJzc0luZm8pOworICAgICAgICAgICAgemZCc3NJbmZvRnJlZShkZXYsIHBCc3NJbmZvKTsKKyAgICAgICAgICAgIHBCc3NJbmZvID0gcE5leHRCc3NJbmZvOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCBwQnNzSW5mby0+ZmxhZyAmIFpNX0JTU19JTkZPX1ZBTElEX0JJVCApCisgICAgICAgICAgICB7ICAgLyogdGhpcyBvbmUgbXVzdCBiZSBrZXB0ICovCisgICAgICAgICAgICAgICAgcEJzc0luZm8tPmZsYWcgJj0gflpNX0JTU19JTkZPX1ZBTElEX0JJVDsKKyAgICAgICAgICAgICAgICBwQnNzSW5mbyA9IHBCc3NJbmZvLT5uZXh0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICNkZWZpbmUgWk1fQlNTX0NBQ0hFX1RJTUVfSU5fTVMgICAyMDAwMAorICAgICAgICAgICAgICAgIGlmICgod2QtPnRpY2sgLSBwQnNzSW5mby0+dGljaykgPiAoWk1fQlNTX0NBQ0hFX1RJTUVfSU5fTVMvWk1fTVNfUEVSX1RJQ0spKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcE5leHRCc3NJbmZvID0gcEJzc0luZm8tPm5leHQ7CisgICAgICAgICAgICAgICAgICAgIHpmQnNzSW5mb1JlbW92ZUZyb21MaXN0KGRldiwgcEJzc0luZm8pOworICAgICAgICAgICAgICAgICAgICB6ZkJzc0luZm9GcmVlKGRldiwgcEJzc0luZm8pOworICAgICAgICAgICAgICAgICAgICBwQnNzSW5mbyA9IHBOZXh0QnNzSW5mbzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcEJzc0luZm8gPSBwQnNzSW5mby0+bmV4dDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IC8vZm9yKCBpPTA7IGk8YnNzQ291bnQ7IGkrKyApCisgICAgcmV0dXJuOworfQorCit2b2lkIHpmRHVtcFNTSUQodThfdCBsZW5ndGgsIHU4X3QgKnZhbHVlKQoreworICAgIHU4X3QgYnVmWzUwXTsKKyAgICB1OF90IHRtcExlbmd0aCA9IGxlbmd0aDsKKworICAgIGlmICggdG1wTGVuZ3RoID4gNDkgKQorICAgIHsKKyAgICAgICAgdG1wTGVuZ3RoID0gNDk7CisgICAgfQorCisgICAgemZNZW1vcnlDb3B5KGJ1ZiwgdmFsdWUsIHRtcExlbmd0aCk7CisgICAgYnVmW3RtcExlbmd0aF0gPSAnXDAnOworICAgIC8vcHJpbnRrKCJTU0lEOiAlc1xuIiwgYnVmKTsKKyAgICAvL3ptX2RlYnVnX21zZ19zKCJzc2lkID0gIiwgdmFsdWUpOworfQorCit2b2lkIHpmQ29yZVJlaW5pdCh6ZGV2X3QqIGRldikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB3ZC0+c3RhLmZsYWdLZXlDaGFuZ2luZyA9IDA7CisgICAgd2QtPnN0YS5mbGFnRnJlcUNoYW5naW5nID0gMDsKK30KKwordm9pZCB6ZkdlbmVyYXRlUmFuZG9tQlNTSUQoemRldl90KiBkZXYsIHU4X3QgKk1BQ0FkZHIsIHU4X3QgKkJTU0lEKQoreworICAgIC8vVUxPTkdMT05HICAgdGltZTsKKyAgICB1MzJfdCB0aW1lOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgdGltZSA9IHdkLT50aWNrOworCisgICAgLy8KKyAgICAvLyBJbml0aWFsaXplIHRoZSByYW5kb20gQlNTSUQgdG8gYmUgdGhlIHNhbWUgYXMgTUFDIGFkZHJlc3MuCisgICAgLy8KKworICAgIC8vIFJ0bENvcHlNZW1vcnkoQlNTSUQsIE1BQ0FkZHIsIHNpemVvZihET1QxMV9NQUNfQUREUkVTUykpOworICAgIHpmTWVtb3J5Q29weShCU1NJRCwgTUFDQWRkciwgNik7CisKKyAgICAvLworICAgIC8vIEdldCB0aGUgc3lzdGVtIHRpbWUgaW4gMTAgbWlsbGlzZWNvbmQuCisgICAgLy8KKworICAgIC8vIE5kaXNHZXRDdXJyZW50U3lzdGVtVGltZSgoUExBUkdFX0lOVEVHRVIpJnRpbWUpOworICAgIC8vIHRpbWUgLz0gMTAwMDAwOworCisgICAgLy8KKyAgICAvLyBSYW5kb21pemUgdGhlIGZpcnN0IDQgYnl0ZXMgb2YgQlNTSUQuCisgICAgLy8KKworICAgIEJTU0lEWzBdIF49ICh1OF90KSh0aW1lICYgMHhmZik7CisgICAgQlNTSURbMF0gJj0gfjB4MDE7ICAgICAgICAgICAgICAvLyBUdXJuIG9mZiBtdWx0aWNhc3QgYml0CisgICAgQlNTSURbMF0gfD0gMHgwMjsgICAgICAgICAgICAgICAvLyBUdXJuIG9uIGxvY2FsIGJpdAorCisgICAgdGltZSA+Pj0gODsKKyAgICBCU1NJRFsxXSBePSAodThfdCkodGltZSAmIDB4ZmYpOworCisgICAgdGltZSA+Pj0gODsKKyAgICBCU1NJRFsyXSBePSAodThfdCkodGltZSAmIDB4ZmYpOworCisgICAgdGltZSA+Pj0gODsKKyAgICBCU1NJRFszXSBePSAodThfdCkodGltZSAmIDB4ZmYpOworfQorCit1OF90IHpmaVdsYW5HZXREZXN0QWRkckZyb21CdWYoemRldl90ICpkZXYsIHpidWZfdCAqYnVmLCB1MTZfdCAqbWFjQWRkcikKK3sKKyNpZmRlZiBaTV9FTkFCTEVfTkFUSVZFX1dJRkkKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBpZiAoIHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0lORlJBU1RSVUNUVVJFICkKKyAgICB7CisgICAgICAgIC8qIERBICovCisgICAgICAgIG1hY0FkZHJbMF0gPSB6bXdfdHhfYnVmX3JlYWRoKGRldiwgYnVmLCAxNik7CisgICAgICAgIG1hY0FkZHJbMV0gPSB6bXdfdHhfYnVmX3JlYWRoKGRldiwgYnVmLCAxOCk7CisgICAgICAgIG1hY0FkZHJbMl0gPSB6bXdfdHhfYnVmX3JlYWRoKGRldiwgYnVmLCAyMCk7CisgICAgfQorICAgIGVsc2UgaWYgKCB3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9JQlNTICkKKyAgICB7CisgICAgICAgIC8qIERBICovCisgICAgICAgIG1hY0FkZHJbMF0gPSB6bXdfdHhfYnVmX3JlYWRoKGRldiwgYnVmLCA0KTsKKyAgICAgICAgbWFjQWRkclsxXSA9IHptd190eF9idWZfcmVhZGgoZGV2LCBidWYsIDYpOworICAgICAgICBtYWNBZGRyWzJdID0gem13X3R4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgOCk7CisgICAgfQorICAgIGVsc2UgaWYgKCB3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9BUCApCisgICAgeworICAgICAgICAvKiBEQSAqLworICAgICAgICBtYWNBZGRyWzBdID0gem13X3R4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgNCk7CisgICAgICAgIG1hY0FkZHJbMV0gPSB6bXdfdHhfYnVmX3JlYWRoKGRldiwgYnVmLCA2KTsKKyAgICAgICAgbWFjQWRkclsyXSA9IHptd190eF9idWZfcmVhZGgoZGV2LCBidWYsIDgpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisjZWxzZQorICAgIC8qIERBICovCisgICAgbWFjQWRkclswXSA9IHptd190eF9idWZfcmVhZGgoZGV2LCBidWYsIDApOworICAgIG1hY0FkZHJbMV0gPSB6bXdfdHhfYnVmX3JlYWRoKGRldiwgYnVmLCAyKTsKKyAgICBtYWNBZGRyWzJdID0gem13X3R4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgNCk7CisjZW5kaWYKKworICAgIHJldHVybiAwOworfQorCisvKiBMZWF2ZSBhbiBlbXB0eSBsaW5lIGJlbG93IHRvIHJlbW92ZSB3YXJuaW5nIG1lc3NhZ2Ugb24gc29tZSBjb21waWxlciAqLworCit1MTZfdCB6ZkZpbmRDbGVhbkZyZXF1ZW5jeSh6ZGV2X3QqIGRldiwgdTMyX3QgYWRob2NNb2RlKQoreworICAgIHU4X3QgICBpLCBqOworICAgIHUxNl90ICByZXR1cm5DaGFubmVsOworICAgIHUxNl90ICBjb3VudF8yNEcgPSAwLCBtaW4yNEdJbmRleCA9IDA7CisgICAgdTE2X3QgIGNvdW50XzVHID0gMCwgIG1pbjVHSW5kZXggPSAwOworICAgIHUxNl90ICBDb21iaW5hdGlvbkJzc051bWJlckluMjRHWzE1XSA9IHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH07CisgICAgdTE2X3QgIEJzc051bWJlckluMjRHWzE3XSAgPSB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfTsKKyAgICB1MTZfdCAgQXJyYXlfMjRHWzE1XSAgICAgICA9IHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH07CisgICAgdTE2X3QgIEJzc051bWJlckluNUdbMzFdICAgPSB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH07CisgICAgdTE2X3QgIEFycmF5XzVHWzMxXSAgICAgICAgPSB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH07CisgICAgc3RydWN0IHpzQnNzSW5mbyogcEJzc0luZm87CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBpZiAoKHBCc3NJbmZvID0gd2QtPnN0YS5ic3NMaXN0LmhlYWQpID09IE5VTEwpCisgICAgeworICAgICAgICBpZiggYWRob2NNb2RlID09IFpNX0FESE9DQkFORF9CIHx8IGFkaG9jTW9kZSA9PSBaTV9BREhPQ0JBTkRfRyB8fAorICAgICAgICAgICAgYWRob2NNb2RlID09IFpNX0FESE9DQkFORF9CRyB8fCBhZGhvY01vZGUgPT0gWk1fQURIT0NCQU5EX0FCRyApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybkNoYW5uZWwgPSB6ZkNoR2V0Rmlyc3QyR2h6Q2hhbm5lbChkZXYpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuQ2hhbm5lbCA9IHpmQ2hHZXRGaXJzdDVHaHpDaGFubmVsKGRldik7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmV0dXJuQ2hhbm5lbDsKKyAgICB9CisKKyAgICAvKiAjMSBHZXQgQWxsb3dlZCBDaGFubmVsIGZvbGxvd2luZyBDb3VudHJ5IENvZGUgISAqLworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgd2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxDbnQ7IGkrKykKKyAgICB7CisgICAgICAgIGlmICh3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbFtpXS5jaGFubmVsIDwgMzAwMCkKKyAgICAgICAgeyAvLyAyLjRHSHoKKyAgICAgICAgICAgIEFycmF5XzI0R1tjb3VudF8yNEddID0gd2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxbaV0uY2hhbm5lbDsKKyAgICAgICAgICAgIGNvdW50XzI0RysrOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeyAvLyA1R0h6CisgICAgICAgICAgICBjb3VudF81RysrOworICAgICAgICAgICAgQXJyYXlfNUdbaV0gPSB3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbFtpXS5jaGFubmVsOworICAgICAgICB9CisgICAgfQorICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICB3aGlsZSggcEJzc0luZm8gIT0gTlVMTCApCisgICAgeworICAgICAgICAvKiAjMl8xIENvdW50IEJTUyBudW1iZXIgaW4gc29tZSBzcGVjaWZpY2VkIGZyZXF1ZW5jeSBpbiAyLjRHSHogYmFuZCAhICovCisgICAgICAgIGlmKCBhZGhvY01vZGUgPT0gWk1fQURIT0NCQU5EX0IgfHwgYWRob2NNb2RlID09IFpNX0FESE9DQkFORF9HIHx8CisgICAgICAgICAgICBhZGhvY01vZGUgPT0gWk1fQURIT0NCQU5EX0JHIHx8IGFkaG9jTW9kZSA9PSBaTV9BREhPQ0JBTkRfQUJHICkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yKCBpPTA7IGk8PShjb3VudF8yNEcrMyk7IGkrKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoIHBCc3NJbmZvLT5mcmVxdWVuY3kgPT0gQXJyYXlfMjRHW2ldICkKKyAgICAgICAgICAgICAgICB7IC8vIEFycmF5XzI0R1swXSBjb3JyZXNwb25kIHRvIEJzc051bWJlckluMjRHWzJdCisgICAgICAgICAgICAgICAgICAgIEJzc051bWJlckluMjRHW3BCc3NJbmZvLT5jaGFubmVsKzFdKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogIzJfMiBDb3VudCBCU1MgbnVtYmVyIGluIHNvbWUgc3BlY2lmaWNlZCBmcmVxdWVuY3kgaW4gNUdIeiBiYW5kICEgKi8KKyAgICAgICAgaWYoIGFkaG9jTW9kZSA9PSBaTV9BREhPQ0JBTkRfQSB8fCBhZGhvY01vZGUgPT0gWk1fQURIT0NCQU5EX0FCRyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciggaT0wOyBpPGNvdW50XzVHOyBpKysgKQorICAgICAgICAgICAgeyAvLyA1R0h6IGNoYW5uZWwgaXMgbm90IGVxdWFsIHRvIGFycmF5IGluZGV4CisgICAgICAgICAgICAgICAgaWYoIHBCc3NJbmZvLT5mcmVxdWVuY3kgPT0gQXJyYXlfNUdbaV0gKQorICAgICAgICAgICAgICAgIHsgLy8gQXJyYXlfNUdbMF0gY29ycmVzcG9uZCB0byBCc3NOdW1iZXJJbjVHWzBdCisgICAgICAgICAgICAgICAgICAgIEJzc051bWJlckluNUdbaV0rKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwQnNzSW5mbyA9IHBCc3NJbmZvLT5uZXh0OworICAgIH0KKworI2lmIDAKKyAgICBmb3IoaT0wOyBpPD0oY291bnRfMjRHKzMpOyBpKyspCisgICAgeworICAgICAgICBwcmludGsoIjIuNEdIeiBCZWZvcmUgY29tYmluLCAlZCBCU1MgbmV0d29yayA6ICVkIiwgaSwgQnNzTnVtYmVySW4yNEdbaV0pOworICAgIH0KKworICAgIGZvcihpPTA7IGk8Y291bnRfNUc7IGkrKykKKyAgICB7CisgICAgICAgIHByaW50aygiNUdIeiBCZWZvcmUgY29tYmluLCAlZCBCU1MgbmV0d29yayA6ICVkIiwgaSwgQnNzTnVtYmVySW41R1tpXSk7CisgICAgfQorI2VuZGlmCisKKyAgICBpZiggYWRob2NNb2RlID09IFpNX0FESE9DQkFORF9CIHx8IGFkaG9jTW9kZSA9PSBaTV9BREhPQ0JBTkRfRyB8fAorICAgICAgICBhZGhvY01vZGUgPT0gWk1fQURIT0NCQU5EX0JHIHx8IGFkaG9jTW9kZSA9PSBaTV9BREhPQ0JBTkRfQUJHICkKKyAgICB7CisgICAgICAgIC8qICMzXzEgQ291bnQgQlNTIG51bWJlciB0aGF0IGluZmx1ZW5jZSB0aGUgc3BlY2lmaWNlZCBmcmVxdWVuY3kgaW4gMi40R0h6ICEgKi8KKyAgICAgICAgZm9yKCBqPTA7IGo8Y291bnRfMjRHOyBqKysgKQorICAgICAgICB7CisgICAgICAgICAgICBDb21iaW5hdGlvbkJzc051bWJlckluMjRHW2pdID0gQnNzTnVtYmVySW4yNEdbal0gICArIEJzc051bWJlckluMjRHW2orMV0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJzc051bWJlckluMjRHW2orMl0gKyBCc3NOdW1iZXJJbjI0R1tqKzNdICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCc3NOdW1iZXJJbjI0R1tqKzRdOworICAgICAgICAgICAgLy9wcmludGsoIkFmdGVyIGNvbWJpbmUsIHRoZSBudW1iZXIgb2YgQlNTIG5ldHdvcmsgY2hhbm5lbCAlZCBpcyAlZCIsCisgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaiAsIENvbWJpbmF0aW9uQnNzTnVtYmVySW4yNEdbal0pOworICAgICAgICB9CisKKyAgICAgICAgLyogIzRfMSBGaW5kIHRoZSBsZXNzIHV0aWxpemVkIGZyZXF1ZW5jeSBpbiAyLjRHSHogYmFuZCAhICovCisgICAgICAgIG1pbjI0R0luZGV4ID0gemZGaW5kTWluaW11bVV0aWxpemF0aW9uQ2hhbm5lbEluZGV4KGRldiwgQ29tYmluYXRpb25Cc3NOdW1iZXJJbjI0RywgY291bnRfMjRHKTsKKyAgICB9CisKKyAgICAvKiAjNF8yIEZpbmQgdGhlIGxlc3MgdXRpbGl6ZWQgZnJlcXVlbmN5IGluIDVHSHogYmFuZCAhICovCisgICAgaWYoIGFkaG9jTW9kZSA9PSBaTV9BREhPQ0JBTkRfQSB8fCBhZGhvY01vZGUgPT0gWk1fQURIT0NCQU5EX0FCRyApCisgICAgeworICAgICAgICBtaW41R0luZGV4ID0gemZGaW5kTWluaW11bVV0aWxpemF0aW9uQ2hhbm5lbEluZGV4KGRldiwgQnNzTnVtYmVySW41RywgY291bnRfNUcpOworICAgIH0KKworICAgIGlmKCBhZGhvY01vZGUgPT0gWk1fQURIT0NCQU5EX0IgfHwgYWRob2NNb2RlID09IFpNX0FESE9DQkFORF9HIHx8IGFkaG9jTW9kZSA9PSBaTV9BREhPQ0JBTkRfQkcgKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEFycmF5XzI0R1ttaW4yNEdJbmRleF07CisgICAgfQorICAgIGVsc2UgaWYoIGFkaG9jTW9kZSA9PSBaTV9BREhPQ0JBTkRfQSApCisgICAgeworICAgICAgICByZXR1cm4gQXJyYXlfNUdbbWluNUdJbmRleF07CisgICAgfQorICAgIGVsc2UgaWYoIGFkaG9jTW9kZSA9PSBaTV9BREhPQ0JBTkRfQUJHICkKKyAgICB7CisgICAgICAgIGlmICggQ29tYmluYXRpb25Cc3NOdW1iZXJJbjI0R1ttaW4yNEdJbmRleF0gPD0gQnNzTnVtYmVySW41R1ttaW41R0luZGV4XSApCisgICAgICAgICAgICByZXR1cm4gQXJyYXlfMjRHW21pbjI0R0luZGV4XTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIEFycmF5XzVHW21pbjVHSW5kZXhdOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHJldHVybiAyNDEyOworfQorCit1MTZfdCB6ZkZpbmRNaW5pbXVtVXRpbGl6YXRpb25DaGFubmVsSW5kZXgoemRldl90KiBkZXYsIHUxNl90KiBhcnJheSwgdTE2X3QgY291bnQpCit7CisgICAgdThfdCAgIGk7CisgICAgdTE2X3QgIHRlbXBNaW5JbmRleCwgdGVtcE1pblZhbHVlOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgaSA9IDE7CisgICAgdGVtcE1pbkluZGV4ID0gMDsKKyAgICB0ZW1wTWluVmFsdWUgPSBhcnJheVt0ZW1wTWluSW5kZXhdOworICAgIHdoaWxlKCBpPCBjb3VudCApCisgICAgeworICAgICAgICBpZiggYXJyYXlbaV0gPCB0ZW1wTWluVmFsdWUgKQorICAgICAgICB7CisgICAgICAgICAgICB0ZW1wTWluVmFsdWUgPSBhcnJheVtpXTsKKyAgICAgICAgICAgIHRlbXBNaW5JbmRleCA9IGk7CisgICAgICAgIH0KKyAgICAgICAgaSsrOworICAgIH0KKworICAgIHJldHVybiB0ZW1wTWluSW5kZXg7Cit9CisKK3U4X3QgemZDb21wYXJlV2l0aEJzc2lkKHpkZXZfdCogZGV2LCB1MTZfdCogYnNzaWQpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgaWYgKCB6Zk1lbW9yeUlzRXF1YWwoKHU4X3QqKWJzc2lkLCAodThfdCopd2QtPnN0YS5ic3NpZCwgNikgKQorICAgIHsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9jZnVuYy5oIGIvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2NmdW5jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM3NTQ4YwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9jZnVuYy5oCkBAIC0wLDAgKzEsNDQ5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggQXRoZXJvcyBDb21tdW5pY2F0aW9ucyBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kdWxlIE5hbWUgOiBmdW5jX2V4dHIuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBBYnN0cmFjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFRoaXMgbW9kdWxlIGNvbnRhaW5zIGZ1bmN0aW9uIHByb3RvdHlwZS4gICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBOT1RFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIE5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX0NGVU5DX0gKKyNkZWZpbmUgX0NGVU5DX0gKKworI2luY2x1ZGUgInF1ZXVlLmgiCisKKy8qIGFtc2R1LmMgKi8KK3ZvaWQgemZEZUFtc2R1KHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3QgdmFwLCB1OF90IGVuY3J5TW9kZSk7CisKKy8qIGNzY2FubWdyLmMgKi8KK3ZvaWQgemZTY2FuTWdySW5pdCh6ZGV2X3QqIGRldik7Cit1OF90IHpmU2Nhbk1nclNjYW5TdGFydCh6ZGV2X3QqIGRldiwgdThfdCBzY2FuVHlwZSk7Cit2b2lkIHpmU2Nhbk1nclNjYW5TdG9wKHpkZXZfdCogZGV2LCB1OF90IHNjYW5UeXBlKTsKK3ZvaWQgemZTY2FuTWdyU2NhbkFjayh6ZGV2X3QqIGRldik7CisKKy8qIGNwc21nci5jICovCit2b2lkIHpmUG93ZXJTYXZpbmdNZ3JJbml0KHpkZXZfdCogZGV2KTsKK3ZvaWQgemZQb3dlclNhdmluZ01nclNldE1vZGUoemRldl90KiBkZXYsIHU4X3QgbW9kZSk7Cit2b2lkIHpmUG93ZXJTYXZpbmdNZ3JNYWluKHpkZXZfdCogZGV2KTsKK3ZvaWQgemZQb3dlclNhdmluZ01ncldha2V1cCh6ZGV2X3QqIGRldik7Cit1OF90IHpmUG93ZXJTYXZpbmdNZ3JJc1NsZWVwaW5nKHpkZXZfdCAqZGV2KTsKK3ZvaWQgemZQb3dlclNhdmluZ01nclByb2Nlc3NCZWFjb24oemRldl90KiBkZXYsIHpidWZfdCogYnVmKTsKK3ZvaWQgemZQb3dlclNhdmluZ01nckF0aW1XaW5FeHBpcmVkKHpkZXZfdCogZGV2KTsKK3ZvaWQgemZQb3dlclNhdmluZ01nckNvbm5lY3ROb3RpZnkoemRldl90ICpkZXYpOwordm9pZCB6ZlBvd2VyU2F2aW5nTWdyUHJlVEJUVEludGVycnVwdCh6ZGV2X3QgKmRldik7CisKKy8qIGNjbWQuYyAqLwordTE2X3QgemZXbGFuRW5hYmxlKHpkZXZfdCogZGV2KTsKKworLyogY2Z1bmMuYyAqLwordThfdCB6ZlF1ZXJ5T3Bwb3NpdGVSYXRlKHpkZXZfdCogZGV2LCB1OF90IGRzdF9tYWNbNl0sIHU4X3QgZnJhbWVUeXBlKTsKK3ZvaWQgemZDb3B5VG9JbnRUeEJ1ZmZlcih6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHU4X3QqIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICB1MTZfdCBvZmZzZXQsIHUxNl90IGxlbmd0aCk7Cit2b2lkIHpmQ29weVRvUnhCdWZmZXIoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1OF90KiBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgdTE2X3Qgb2Zmc2V0LCB1MTZfdCBsZW5ndGgpOwordm9pZCB6ZkNvcHlGcm9tSW50VHhCdWZmZXIoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1OF90KiBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1MTZfdCBvZmZzZXQsIHUxNl90IGxlbmd0aCk7Cit2b2lkIHpmQ29weUZyb21SeEJ1ZmZlcih6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHU4X3QqIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHUxNl90IG9mZnNldCwgdTE2X3QgbGVuZ3RoKTsKK3ZvaWQgemZNZW1vcnlDb3B5KHU4X3QqIGRzdCwgdThfdCogc3JjLCB1MTZfdCBsZW5ndGgpOwordm9pZCB6Zk1lbW9yeU1vdmUodThfdCogZHN0LCB1OF90KiBzcmMsIHUxNl90IGxlbmd0aCk7Cit2b2lkIHpmWmVyb01lbW9yeSh1OF90KiB2YSwgdTE2X3QgbGVuZ3RoKTsKK3U4X3QgemZNZW1vcnlJc0VxdWFsKHU4X3QqIG0xLCB1OF90KiBtMiwgdTE2X3QgbGVuZ3RoKTsKK3U4X3QgemZSeEJ1ZmZlckVxdWFsVG9TdHIoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCBjb25zdCB1OF90KiBzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHUxNl90IG9mZnNldCwgdTE2X3QgbGVuZ3RoKTsKK3ZvaWQgemZUeEJ1ZmZlckNvcHkoemRldl90KmRldiwgemJ1Zl90KiBkc3QsIHpidWZfdCogc3JjLAorICAgICAgICAgICAgICAgICAgICB1MTZfdCBkc3RPZmZzZXQsIHUxNl90IHNyY09mZnNldCwgdTE2X3QgbGVuZ3RoKTsKK3ZvaWQgemZSeEJ1ZmZlckNvcHkoemRldl90KmRldiwgemJ1Zl90KiBkc3QsIHpidWZfdCogc3JjLAorICAgICAgICAgICAgICAgICAgICB1MTZfdCBkc3RPZmZzZXQsIHUxNl90IHNyY09mZnNldCwgdTE2X3QgbGVuZ3RoKTsKKwordm9pZCB6ZkNvbGxlY3RIV1RhbGx5KHpkZXZfdCpkZXYsIHUzMl90KiByc3AsIHU4X3QgaWQpOwordm9pZCB6ZlRpbWVySW5pdCh6ZGV2X3QqIGRldik7Cit1MTZfdCB6ZlRpbWVyU2NoZWR1bGUoemRldl90KiBkZXYsIHUxNl90IGV2ZW50LCB1MzJfdCB0aWNrKTsKK3UxNl90IHpmVGltZXJDYW5jZWwoemRldl90KiBkZXYsIHUxNl90IGV2ZW50KTsKK3ZvaWQgemZUaW1lckNsZWFyKHpkZXZfdCogZGV2KTsKK3UxNl90IHpmVGltZXJDaGVja0FuZEhhbmRsZSh6ZGV2X3QqIGRldik7Cit2b2lkIHpmUHJvY2Vzc0V2ZW50KHpkZXZfdCogZGV2LCB1MTZfdCogZXZlbnRBcnJheSwgdThfdCBldmVudENvdW50KTsKKwordm9pZCB6ZkJzc0luZm9DcmVhdGUoemRldl90KiBkZXYpOwordm9pZCB6ZkJzc0luZm9EZXN0cm95KHpkZXZfdCogZGV2KTsKKworc3RydWN0IHpzQnNzSW5mbyogemZCc3NJbmZvQWxsb2NhdGUoemRldl90KiBkZXYpOwordm9pZCB6ZkJzc0luZm9GcmVlKHpkZXZfdCogZGV2LCBzdHJ1Y3QgenNCc3NJbmZvKiBwQnNzSW5mbyk7Cit2b2lkIHpmQnNzSW5mb1Jlb3JkZXJMaXN0KHpkZXZfdCogZGV2KTsKK3ZvaWQgemZCc3NJbmZvSW5zZXJ0VG9MaXN0KHpkZXZfdCogZGV2LCBzdHJ1Y3QgenNCc3NJbmZvKiBwQnNzSW5mbyk7Cit2b2lkIHpmQnNzSW5mb1JlbW92ZUZyb21MaXN0KHpkZXZfdCogZGV2LCBzdHJ1Y3QgenNCc3NJbmZvKiBwQnNzSW5mbyk7Cit2b2lkIHpmQnNzSW5mb1JlZnJlc2goemRldl90KiBkZXYsIHUxNl90IG1vZGUpOwordm9pZCB6ZkNvcmVTZXRGcmVxdWVuY3lDb21wbGV0ZSh6ZGV2X3QqIGRldik7Cit2b2lkIHpmQ29yZVNldEZyZXF1ZW5jeSh6ZGV2X3QqIGRldiwgdTE2X3QgZnJlcXVlbmN5KTsKK3ZvaWQgemZDb3JlU2V0RnJlcXVlbmN5VjIoemRldl90KiBkZXYsIHUxNl90IGZyZXF1ZW5jeSwKKyAgICAgICAgemZwRnJlcUNoYW5nZUNvbXBsZXRlQ2IgY2IpOwordm9pZCB6ZkNvcmVTZXRGcmVxdWVuY3lFeCh6ZGV2X3QqIGRldiwgdTE2X3QgZnJlcXVlbmN5LCB1OF90IGJ3NDAsCisgICAgICAgIHU4X3QgZXh0T2Zmc2V0LCB6ZnBGcmVxQ2hhbmdlQ29tcGxldGVDYiBjYik7Cit2b2lkIHpmQ29yZVNldEZyZXF1ZW5jeUV4VjIoemRldl90KiBkZXYsIHUxNl90IGZyZXF1ZW5jeSwgdThfdCBidzQwLAorICAgICAgICB1OF90IGV4dE9mZnNldCwgemZwRnJlcUNoYW5nZUNvbXBsZXRlQ2IgY2IsIHU4X3QgZm9yY2VTZXRGcmVxKTsKK3ZvaWQgemZSZVNldEN1cnJlbnRGcmVxdWVuY3koemRldl90KiBkZXYpOwordTMyX3QgemZDb3JlU2V0S2V5KHpkZXZfdCogZGV2LCB1OF90IHVzZXIsIHU4X3Qga2V5SWQsIHU4X3QgdHlwZSwKKyAgICAgICAgdTE2X3QqIG1hYywgdTMyX3QqIGtleSk7Cit2b2lkIHpmQ29yZVNldEtleUNvbXBsZXRlKHpkZXZfdCogZGV2KTsKK3ZvaWQgemZDb3JlUmVpbml0KHpkZXZfdCogZGV2KTsKK3ZvaWQgemZDb3JlTWFjQWRkcmVzc05vdGlmeSh6ZGV2X3QqIGRldiwgdThfdCAqYWRkcik7Cit2b2lkIHpmQ29yZVNldElzb05hbWUoemRldl90KiBkZXYsIHU4X3QqIGlzb05hbWUpOwordm9pZCB6ZkdlbmVyYXRlUmFuZG9tQlNTSUQoemRldl90KiBkZXYsIHU4X3QgKk1BQ0FkZHIsIHU4X3QgKkJTU0lEKTsKK3ZvaWQgemZDb3JlSGFsSW5pdENvbXBsZXRlKHpkZXZfdCogZGV2KTsKKwordTE2X3QgemZGaW5kQ2xlYW5GcmVxdWVuY3koemRldl90KiBkZXYsIHUzMl90IGFkaG9jTW9kZSk7Cit1MTZfdCB6ZkZpbmRNaW5pbXVtVXRpbGl6YXRpb25DaGFubmVsSW5kZXgoemRldl90KiBkZXYsIHUxNl90KiBhcnJheSwgdTE2X3QgY291bnQpOwordThfdCB6ZkNvbXBhcmVXaXRoQnNzaWQoemRldl90KiBkZXYsIHUxNl90KiBic3NpZCk7CisKKy8qIGNoYi5jICovCit2b2lkIHpmRHVtcEJzc0xpc3QoemRldl90KiBkZXYpOworCisKK3UxNl90IHpmSXNzdWVDbWQoemRldl90KiBkZXYsIHUzMl90KiBjbWQsIHUxNl90IGNtZExlbiwgdTE2X3Qgc3JjLCB1OF90KiBidWYpOworCisKKy8qIGNpYy5jICovCit2b2lkIHpmVXBkYXRlQnNzaWQoemRldl90KiBkZXYsIHU4X3QqIGJzc2lkKTsKK3ZvaWQgemZSZXNldFN1cHBvcnRSYXRlKHpkZXZfdCogZGV2LCB1OF90IHR5cGUpOwordm9pZCB6ZlVwZGF0ZVN1cHBvcnRSYXRlKHpkZXZfdCogZGV2LCB1OF90KiByYXRlQXJyYXkpOwordThfdCB6ZklzR09ubHlNb2RlKHpkZXZfdCogZGV2LCB1MTZfdCAgZnJlcXVlbmN5LCB1OF90KiByYXRlQXJyYXkpOwordm9pZCB6ZkdhdGhlckJNb2RlKHpkZXZfdCogZGV2LCB1OF90KiByYXRlQXJyYXksIHU4X3QqIGV4dHJhdGVBcnJheSk7Cit1OF90IHpmUFNEZXZpY2VTbGVlcCh6ZGV2X3QqIGRldik7Cit1MTZfdCB6ZkdldFJhbmRvbU51bWJlcih6ZGV2X3QqIGRldiwgdTE2X3QgaW5pdFZhbHVlKTsKK3ZvaWQgemZDb3JlRXZlbnQoemRldl90KiBkZXYsIHUxNl90IGV2ZW50LCB1OF90KiByc3ApOwordm9pZCB6ZkJlYWNvbkNmZ0ludGVycnVwdCh6ZGV2X3QqIGRldiwgdThfdCogcnNwKTsKK3ZvaWQgemZFbmRPZkF0aW1XaW5kb3dJbnRlcnJ1cHQoemRldl90KiBkZXYpOworCisvKiBjaW5pdC5jICovCit1MTZfdCB6ZlR4R2VuV2xhbkhlYWRlcih6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90KiBoZWFkZXIsIHUxNl90IHNlcSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHU4X3QgZmxhZywgdTE2X3QgcGx1c0xlbiwgdTE2X3QgbWludXNMZW4sIHUxNl90IHBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICB1MTZfdCogZGEsIHUxNl90KiBzYSwgdThfdCB1cCwgdTE2X3QgKm1pY0xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHUxNl90KiBzbmFwLCB1MTZfdCBzbmFwTGVuLCBzdHJ1Y3QgYWdnQ29udHJvbCAqYWdnQ29udHJvbCk7Cit1MTZfdCB6ZlR4R2VuTW1IZWFkZXIoemRldl90KiBkZXYsIHU4X3QgZnJhbWVUeXBlLCB1MTZfdCogZHN0LAorICAgICAgICB1MTZfdCogaGVhZGVyLCB1MTZfdCBsZW4sIHpidWZfdCogYnVmLCB1MTZfdCB2YXAsIHU4X3QgZW5jcnlwdCk7Cit2b2lkIHpmSW5pdE1hY0FwTW9kZSh6ZGV2X3QqIGRldik7Cit1MTZfdCB6ZkNoR2V0TmV4dENoYW5uZWwoemRldl90KiBkZXYsIHUxNl90IGZyZXF1ZW5jeSwgdThfdCogcGJQYXNzaXZlKTsKK3UxNl90IHpmQ2hHZXRGaXJzdENoYW5uZWwoemRldl90KiBkZXYsIHU4X3QqIHBiUGFzc2l2ZSk7Cit1MTZfdCB6ZkNoR2V0Rmlyc3QyR2h6Q2hhbm5lbCh6ZGV2X3QqIGRldik7Cit1MTZfdCB6ZkNoR2V0Rmlyc3Q1R2h6Q2hhbm5lbCh6ZGV2X3QqIGRldik7Cit1MTZfdCB6ZkNoR2V0TGFzdENoYW5uZWwoemRldl90KiBkZXYsIHU4X3QqIHBiUGFzc2l2ZSk7Cit1MTZfdCB6ZkNoR2V0TGFzdDVHaHpDaGFubmVsKHpkZXZfdCogZGV2KTsKK3UxNl90IHpmQ2hOdW1Ub0ZyZXEoemRldl90KiBkZXYsIHU4X3QgY2gsIHU4X3QgZnJlcUJhbmQpOwordThfdCB6ZkNoRnJlcVRvTnVtKHUxNl90IGZyZXEsIHU4X3QqIGJJczVHQmFuZCk7CisKKy8qIGNtbS5jICovCit2b2lkIHpmUHJvY2Vzc01hbmFnZW1lbnQoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCBzdHJ1Y3QgenNBZGRpdGlvbkluZm8qIEFkZEluZm8pOyAvL0NXWWFuZyhtKQordm9pZCB6ZlNlbmRNbUZyYW1lKHpkZXZfdCogZGV2LCB1OF90IGZyYW1lVHlwZSwgdTE2X3QqIGRzdCwKKyAgICAgICAgICAgICAgICAgICB1MzJfdCBwMSwgdTMyX3QgcDIsIHUzMl90IHAzKTsKK3UxNl90IHpmRmluZEVsZW1lbnQoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1OF90IGVpZCk7Cit1MTZfdCB6ZkZpbmRXaWZpRWxlbWVudCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHU4X3QgdHlwZSwgdThfdCBzdWJ0eXBlKTsKK3UxNl90IHpmRmluZFN1cGVyR0VsZW1lbnQoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1OF90IHR5cGUpOwordTE2X3QgemZGaW5kWFJFbGVtZW50KHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdThfdCB0eXBlKTsKK3UxNl90IHpmUmVtb3ZlRWxlbWVudCh6ZGV2X3QqIGRldiwgdThfdCogYnVmLCB1MTZfdCBzaXplLCB1OF90IGVpZCk7Cit1MTZfdCB6ZlVwZGF0ZUVsZW1lbnQoemRldl90KiBkZXYsIHU4X3QqIGJ1ZiwgdTE2X3Qgc2l6ZSwgdThfdCogdXBkYXRlZWlkKTsKK3ZvaWQgemZQcm9jZXNzUHJvYmVSZXEoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCogc3JjKTsKK3ZvaWQgemZQcm9jZXNzUHJvYmVSc3AoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCBzdHJ1Y3QgenNBZGRpdGlvbkluZm8qIEFkZEluZm8pOwordTE2X3QgemZTZW5kUHJvYmVSZXEoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCBvZmZzZXQsIHU4X3QgYldpdGhTU0lEKTsKK3UxNl90IHpmTW1BZGRJZVN1cHBvcnRSYXRlKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxNl90IG9mZnNldCwgdThfdCBlaWQsIHU4X3QgcmF0ZVNldCk7Cit1MTZfdCB6Zk1tQWRkSWVEcyh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IG9mZnNldCk7Cit1MTZfdCB6Zk1tQWRkSWVFcnAoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCBvZmZzZXQpOwordm9pZCB6ZlVwZGF0ZURlZmF1bHRRb3NQYXJhbWV0ZXIoemRldl90KiBkZXYsIHU4X3QgbW9kZSk7Cit1MTZfdCB6Zk1tQWRkSWVXcGEoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCBvZmZzZXQsIHUxNl90IGFwSWQpOwordTE2X3QgemZNbUFkZEhUQ2FwYWJpbGl0eSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IG9mZnNldCk7IC8vQ1dZYW5nKCspCit1MTZfdCB6Zk1tQWRkUHJlTkhUQ2FwYWJpbGl0eSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IG9mZnNldCk7Cit1MTZfdCB6Zk1tQWRkRXh0ZW5kZWRIVENhcGFiaWxpdHkoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCBvZmZzZXQpOyAvL0NXWWFuZygrKQordTE2X3QgemZGaW5kQVRIRXh0Q2FwKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdThfdCB0eXBlLCB1OF90IHN1YnR5cGUpOwordTE2X3QgemZGaW5kQnJkY21NcnZsUmxua0V4dENhcCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpOwordTE2X3QgemZGaW5kTWFydmVsRXh0Q2FwKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1Zik7Cit1MTZfdCB6ZkZpbmRCcm9hZGNvbUV4dENhcCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpOwordTE2X3QgemZGaW5kUmxua0V4dENhcCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpOworCisvKiBjbW1hcC5jICovCit2b2lkIHpmTW1BcFRpbWVUaWNrKHpkZXZfdCogZGV2KTsKK3ZvaWQgemZBcEFnaW5nU3RhKHpkZXZfdCogZGV2KTsKK3UxNl90IHpmQXBBZGRTdGEoemRldl90KiBkZXYsIHUxNl90KiBhZGRyLCB1MTZfdCBzdGF0ZSwgdTE2X3QgYXBJZCwgdThfdCB0eXBlLAorICAgICAgICAgICAgICAgICB1OF90IHFvc1R5cGUsIHU4X3QgcW9zSW5mbyk7Cit2b2lkIHpmQXBQcm90Y3Rpb25Nb25pdG9yKHpkZXZfdCogZGV2KTsKK3ZvaWQgemZBcFByb2Nlc3NCZWFjb24oemRldl90KiBkZXYsIHpidWZfdCogYnVmKTsKK3ZvaWQgemZBcFByb2Nlc3NBdXRoKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3QqIHNyYywgdTE2X3QgYXBJZCk7Cit2b2lkIHpmQXBQcm9jZXNzQXNvY1JlcSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90KiBzcmMsIHUxNl90IGFwSWQpOwordm9pZCB6ZkFwUHJvY2Vzc0Fzb2NSc3AoemRldl90KiBkZXYsIHpidWZfdCogYnVmKTsKK3ZvaWQgemZBcFByb2Nlc3NEZWF1dGgoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCogc3JjLCB1MTZfdCBhcElkKTsKK3ZvaWQgemZBcFByb2Nlc3NEaXNhc29jKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3QqIHNyYywgdTE2X3QgYXBJZCk7Cit2b2lkIHpmQXBQcm9jZXNzUHJvYmVSc3AoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCBzdHJ1Y3QgenNBZGRpdGlvbkluZm8qIEFkZEluZm8pOwordm9pZCB6ZkFwU3RvcmVBc29jUmVxSWUoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCBhaWQpOwordTE2X3QgemZBcEFkZEllU3NpZCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IG9mZnNldCwgdTE2X3QgdmFwKTsKK3ZvaWQgemZBcFNlbmRCZWFjb24oemRldl90KiBkZXYpOwordTE2X3QgemZBcEdldFNUQUluZm8oemRldl90KiBkZXYsIHUxNl90KiBhZGRyLCB1MTZfdCogc3RhdGUsIHU4X3QqIHZhcCk7Cit1MTZfdCB6ZkludHJhYnNzRm9yd2FyZCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHU4X3Qgc3JjVmFwKTsKK3UxNl90IHpmQXBCdWZmZXJQc0ZyYW1lKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3QgcG9ydCk7Cit2b2lkIHpmQXBJbml0U3RhVGJsKHpkZXZfdCogZGV2KTsKK3ZvaWQgemZBcEdldFN0YVR4UmF0ZUFuZFFvc1R5cGUoemRldl90KiBkZXYsIHUxNl90KiBhZGRyLCB1MzJfdCogcGh5Q3RybCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdThfdCogcW9zVHlwZSwgdTE2X3QqIHJjUHJvYmluZ0ZsYWcpOwordm9pZCB6ZkFwR2V0U3RhUW9zVHlwZSh6ZGV2X3QqIGRldiwgdTE2X3QqIGFkZHIsIHU4X3QqIHFvc1R5cGUpOwordm9pZCB6ZkFwU2V0U3RhVHhSYXRlKHpkZXZfdCogZGV2LCB1MTZfdCogYWRkciwgdTMyX3QgcGh5Q3RybCk7CitzdHJ1Y3QgenNNaWNWYXIqIHpmQXBHZXRSeE1pY0tleSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpOworc3RydWN0IHpzTWljVmFyKiB6ZkFwR2V0VHhNaWNLZXkoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1OF90KiBxb3NUeXBlKTsKK3UxNl90IHpmQXBBZGRJZVdtZVBhcmEoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCBvZmZzZXQsIHUxNl90IHZhcCk7Cit1MTZfdCB6ZkFwVXBkYXRlUHNCaXQoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1OF90KiB2YXAsIHU4X3QqIHVhcHNkVHJpZyk7Cit2b2lkIHpmQXBQcm9jZXNzUHNQb2xsKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1Zik7Cit1MTZfdCB6ZkFwRmluZFN0YSh6ZGV2X3QqIGRldiwgdTE2X3QqIGFkZHIpOwordm9pZCB6ZkFwR2V0U3RhRW5jcnlUeXBlKHpkZXZfdCogZGV2LCB1MTZfdCogYWRkciwgdThfdCogZW5jcnlUeXBlKTsKK3ZvaWQgemZBcEdldFN0YVdwYUl2KHpkZXZfdCogZGV2LCB1MTZfdCogYWRkciwgdTE2X3QqIGl2MTYsIHUzMl90KiBpdjMyKTsKK3ZvaWQgemZBcFNldFN0YVdwYUl2KHpkZXZfdCogZGV2LCB1MTZfdCogYWRkciwgdTE2X3QgaXYxNiwgdTMyX3QgaXYzMik7Cit2b2lkIHpmQXBDbGVhclN0YUtleSh6ZGV2X3QqIGRldiwgdTE2X3QqIGFkZHIpOworI2lmZGVmIFpNX0VOQUJMRV9DRU5DCit2b2lkIHpmQXBHZXRTdGFDZW5jSXZBbmRLZXlJZHgoemRldl90KiBkZXYsIHUxNl90KiBhZGRyLCB1MzJfdCAqaXYsCisgICAgICAgIHU4X3QgKmtleUlkeCk7Cit2b2lkIHpmQXBTZXRTdGFDZW5jSXYoemRldl90KiBkZXYsIHUxNl90KiBhZGRyLCB1MzJfdCAqaXYpOworI2VuZGlmIC8vWk1fRU5BQkxFX0NFTkMKK3ZvaWQgemZBcFNldFByb3RlY3Rpb25Nb2RlKHpkZXZfdCogZGV2LCB1MTZfdCBtb2RlKTsKK3ZvaWQgemZBcEZsdXNoQnVmZmVyZWRQc0ZyYW1lKHpkZXZfdCogZGV2KTsKK3ZvaWQgemZBcFNlbmRGYWlsdXJlKHpkZXZfdCogZGV2LCB1OF90KiBhZGRyKTsKK3U4X3QgemZBcFJlbW92ZUZyb21Qc1F1ZXVlKHpkZXZfdCogZGV2LCB1MTZfdCBpZCwgdTE2X3QqIHNyYyk7Cit2b2lkIHpmQXBQcm9jZXNzQWN0aW9uKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1Zik7CisvKiBjbW1zdGEuYyAqLwordm9pZCB6Zk1tU3RhVGltZVRpY2soemRldl90KiBkZXYpOwordm9pZCB6ZlJlV3JpdGVCZWFjb25TdGFydEFkZHJlc3MoemRldl90KiBkZXYpOyAgLy8gTXh6ZW5nCit2b2lkIHpmU3RhUHJvY2Vzc0JlYWNvbih6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHN0cnVjdCB6c0FkZGl0aW9uSW5mbyogQWRkSW5mbyk7IC8vQ1dZYW5nKG0pCit2b2lkIHpmU3RhUHJvY2Vzc0F1dGgoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCogc3JjLCB1MTZfdCBhcElkKTsKK3ZvaWQgemZTdGFQcm9jZXNzQXNvY1JlcSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90KiBzcmMsIHUxNl90IGFwSWQpOwordm9pZCB6ZlN0YVByb2Nlc3NBc29jUnNwKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1Zik7Cit2b2lkIHpmU3RhUHJvY2Vzc0RlYXV0aCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpOwordm9pZCB6ZlN0YVByb2Nlc3NEaXNhc29jKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1Zik7Cit2b2lkIHpmU3RhUHJvY2Vzc1Byb2JlUnNwKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1Ziwgc3RydWN0IHpzQWRkaXRpb25JbmZvKiBBZGRJbmZvKTsKK3ZvaWQgemZTdGFQcm9jZXNzQXRpbSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpOwordm9pZCB6ZlN0YVN0b3JlQXNvY1JzcEllKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1Zik7Cit2b2lkIHpmU3RhQ2hhbm5lbE1hbmFnZW1lbnQoemRldl90KiBkZXYsIHU4X3Qgc2Nhbik7Cit2b2lkIHpmSWJzc0Nvbm5lY3ROZXR3b3JrKHpkZXZfdCogZGV2KTsKK3ZvaWQgemZJbmZyYUNvbm5lY3ROZXR3b3JrKHpkZXZfdCogZGV2KTsKK3U4X3QgemZDaGVja0F1dGhlbnRpY2F0aW9uKHpkZXZfdCogZGV2LCBzdHJ1Y3QgenNCc3NJbmZvKiBwQnNzSW5mbyk7Cit1OF90IHpmQ2hhbmdlQWRhcHRlclN0YXRlKHpkZXZfdCogZGV2LCB1OF90IG5ld1N0YXRlKTsKK3UxNl90IHpmU3RhQWRkSWVTc2lkKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3Qgb2Zmc2V0KTsKK3UxNl90IHpmU3RhQWRkSWVXcGFSc24oemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCBvZmZzZXQsIHU4X3QgZnJhbWVUeXBlKTsKK3UxNl90IHpmU3RhQWRkSWVJYnNzKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3Qgb2Zmc2V0KTsKK3ZvaWQgemZTdGFTdGFydENvbm5lY3QoemRldl90KiBkZXYsIHU4X3QgYklzU2hhcmVkS2V5KTsKK3U4X3QgemZTdGFJc0Nvbm5lY3RlZCh6ZGV2X3QqIGRldik7Cit1OF90IHpmU3RhSXNDb25uZWN0aW5nKHpkZXZfdCogZGV2KTsKK3U4X3QgemZTdGFJc0Rpc2Nvbm5lY3QoemRldl90KiBkZXYpOwordm9pZCB6ZlN0YVNlbmRCZWFjb24oemRldl90KiBkZXYpOwordm9pZCB6ZlNlbmROdWxsRGF0YSh6ZGV2X3QqIGRldiwgdThfdCB0eXBlKTsKK3ZvaWQgemZTZW5kUFNQb2xsKHpkZXZfdCogZGV2KTsKK3ZvaWQgemZTZW5kQkEoemRldl90KiBkZXYsIHUxNl90IHN0YXJ0X3NlcSwgdThfdCAqYml0bWFwKTsKK3ZvaWQgemRSYXRlSW5mb0NvdW50VHgoemRldl90KiBkZXYsIHUxNl90KiBtYWNBZGRyKTsKK3N0cnVjdCB6c01pY1ZhciogemZTdGFHZXRSeE1pY0tleSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpOworc3RydWN0IHpzTWljVmFyKiB6ZlN0YUdldFR4TWljS2V5KHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1Zik7Cit1MTZfdCB6ZlN0YVJ4VmFsaWRhdGVGcmFtZSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpOwordm9pZCB6ZlN0YU1pY0ZhaWx1cmVIYW5kbGluZyh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpOwordThfdCB6ZlN0YUJsb2NrV2xhblNjYW4oemRldl90KiBkZXYpOwordm9pZCB6ZlN0YUlic3NQU0NoZWNrU3RhdGUoemRldl90KiBkZXYsIHpidWZfdCogYnVmKTsKK3U4X3QgemZTdGFJYnNzUFNRdWV1ZURhdGEoemRldl90KiBkZXYsIHpidWZfdCogYnVmKTsKK3ZvaWQgemZTdGFJYnNzUFNTZW5kKHpkZXZfdCogZGV2KTsKK3ZvaWQgemZTdGFSZXNldFN0YXR1cyh6ZGV2X3QqIGRldiwgdThfdCBiSW5pdCk7Cit1MTZfdCB6ZlN0YUFkZEllV21lSW5mbyh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IG9mZnNldCwgdThfdCBxb3NJbmZvKTsKK3ZvaWQgemZJbml0UGFydG5lck5vdGlmeUV2ZW50KHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1Ziwgc3RydWN0IHpzUGFydG5lck5vdGlmeUV2ZW50ICpldmVudCk7Cit2b2lkIHpmU3RhSW5pdE9wcG9zaXRlSW5mbyh6ZGV2X3QqIGRldik7Cit2b2lkIHpmU3RhSWJzc01vbml0b3JpbmcoemRldl90KiBkZXYsIHU4X3QgcmVzZXQpOworc3RydWN0IHpzQnNzSW5mbyogemZTdGFGaW5kQnNzSW5mbyh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHN0cnVjdCB6c1dsYW5Qcm9iZVJzcEZyYW1lSGVhZGVyICpwUHJvYmVSc3BIZWFkZXIpOwordThfdCB6ZlN0YUluaXRCc3NJbmZvKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwKKyAgICAgICAgc3RydWN0IHpzV2xhblByb2JlUnNwRnJhbWVIZWFkZXIgKnBQcm9iZVJzcEhlYWRlciwKKyAgICAgICAgc3RydWN0IHpzQnNzSW5mbyogcEJzc0luZm8sIHN0cnVjdCB6c0FkZGl0aW9uSW5mbyogQWRkSW5mbywgdThfdCB0eXBlKTsKK3M4X3QgemZTdGFGaW5kRnJlZU9wcG9zaXRlKHpkZXZfdCogZGV2LCB1MTZfdCAqc2EsIGludCAqcEZvdW5kSWR4KTsKK3M4X3QgemZTdGFGaW5kT3Bwb3NpdGVCeU1BQ0FkZHIoemRldl90KiBkZXYsIHUxNl90ICpzYSwgdThfdCAqcEZvdW5kSWR4KTsKK3ZvaWQgemZTdGFSZWZyZXNoQmxvY2tMaXN0KHpkZXZfdCogZGV2LCB1MTZfdCBmbHVzaEZsYWcpOwordm9pZCB6ZlN0YUNvbm5lY3RGYWlsKHpkZXZfdCogZGV2LCB1MTZfdCByZWFzb24sIHUxNl90KiBic3NpZCwgdThfdCB3ZWlnaHQpOwordm9pZCB6ZlN0YUdldFR4UmF0ZSh6ZGV2X3QqIGRldiwgdTE2X3QqIG1hY0FkZHIsIHUzMl90KiBwaHlDdHJsLAorICAgICAgICB1MTZfdCogcmNQcm9iaW5nRmxhZyk7Cit1MTZfdCB6ZlN0YVByb2Nlc3NBY3Rpb24oemRldl90KiBkZXYsIHpidWZfdCogYnVmKTsKK3N0cnVjdCB6c1RraXBTZWVkKiB6ZlN0YUdldFJ4U2VlZCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpOworI2lmZGVmIFpNX0VOQUJMRV9DRU5DCisvKiBDRU5DICovCit1MTZfdCB6ZlN0YUFkZEllQ2VuYyh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IG9mZnNldCk7CisjZW5kaWYgLy9aTV9FTkFCTEVfQ0VOQwordm9pZCB6ZlN0YUVuYWJsZVNXRW5jcnlwdGlvbih6ZGV2X3QgKmRldiwgdThfdCB2YWx1ZSk7Cit2b2lkIHpmU3RhRGlzYWJsZVNXRW5jcnlwdGlvbih6ZGV2X3QgKmRldik7Cit1MTZfdCB6ZkNvbXB1dGVCc3NJbmZvV2VpZ2h0VmFsdWUoemRldl90ICpkZXYsIHU4X3QgaXNCTW9kZSwgdThfdCBpc0hULCB1OF90IGlzSFQ0MCwgdThfdCBzaWduYWxTdHJlbmd0aCk7Cit1MTZfdCB6ZlN0YUFkZElic3NBZGRpdGlvbmFsSUUoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCBvZmZzZXQpOworCisvKiBjdGtpcC5jICovCit2b2lkIHpmVGtpcEluaXQodThfdCoga2V5LCB1OF90KiB0YSwgc3RydWN0IHpzVGtpcFNlZWQqIHBTZWVkLCB1OF90KiBpbml0SXYpOwordm9pZCB6Zk1pY1NldEtleSh1OF90KiBrZXksIHN0cnVjdCB6c01pY1ZhciogcE1pYyk7Cit2b2lkIHpmTWljQXBwZW5kQnl0ZSh1OF90IGIsIHN0cnVjdCB6c01pY1ZhciogcE1pYyk7Cit2b2lkIHpmTWljQ2xlYXIoc3RydWN0IHpzTWljVmFyKiBwTWljKTsKK3ZvaWQgemZNaWNBcHBlbmRUeEJ1Zih6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHU4X3QqIGRhLCB1OF90KiBzYSwKKyAgICAgICAgICAgICAgICAgICAgICB1MTZfdCByZW1vdmVMZW4sIHU4X3QqIG1pYyk7Cit1OF90IHpmTWljUnhWZXJpZnkoemRldl90KiBkZXYsIHpidWZfdCogYnVmKTsKK3ZvaWQgemZNaWNHZXRNaWModThfdCogZHN0LCBzdHJ1Y3QgenNNaWNWYXIqIHBNaWMpOwordm9pZCB6ZkNhbFR4TWljKHpkZXZfdCAqZGV2LCB6YnVmX3QgKmJ1ZiwgdThfdCAqc25hcCwgdTE2X3Qgc25hcExlbiwgdTE2X3Qgb2Zmc2V0LCB1MTZfdCAqZGEsIHUxNl90ICpzYSwgdThfdCB1cCwgdThfdCAqbWljKTsKK3ZvaWQgemZUS0lQRW5jcnlwdCh6ZGV2X3QgKmRldiwgemJ1Zl90ICpidWYsIHU4X3QgKnNuYXAsIHUxNl90IHNuYXBMZW4sIHUxNl90IG9mZnNldCwgdThfdCBrZXlMZW4sIHU4X3QqIGtleSwgdTMyX3QqIGljdik7Cit1MTZfdCB6ZlRLSVBEZWNyeXB0KHpkZXZfdCAqZGV2LCB6YnVmX3QgKmJ1ZiwgdTE2X3Qgb2Zmc2V0LCB1OF90IGtleUxlbiwgdThfdCoga2V5KTsKK3ZvaWQgemZUa2lwR2V0c2VlZHModTE2X3QgaXYxNiwgdThfdCAqUkM0S2V5LCBzdHJ1Y3QgenNUa2lwU2VlZCAqU2VlZCk7Cit1OF90IHpmVGtpcFBoYXNlMUtleU1peCh1MzJfdCBpdjMyLCBzdHJ1Y3QgenNUa2lwU2VlZCogcFNlZWQpOwordThfdCB6ZlRraXBQaGFzZTJLZXlNaXgodTE2X3QgaXYxNiwgc3RydWN0IHpzVGtpcFNlZWQqIHBTZWVkKTsKK3ZvaWQgemZXRVBFbmNyeXB0KHpkZXZfdCAqZGV2LCB6YnVmX3QgKmJ1ZiwgdThfdCAqc25hcCwgdTE2X3Qgc25hcExlbiwgdTE2X3Qgb2Zmc2V0LCB1OF90IGtleUxlbiwgdThfdCogV2VwS2V5LCB1OF90ICppdik7Cit1MTZfdCB6ZldFUERlY3J5cHQoemRldl90ICpkZXYsIHpidWZfdCAqYnVmLCB1MTZfdCBvZmZzZXQsIHU4X3Qga2V5TGVuLCB1OF90KiBXZXBLZXksIHU4X3QgKml2KTsKKworLyogY3R4cnguYyAqLwordTE2X3QgemZTZW5kODAyMTFGcmFtZSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpOwordm9pZCB6ZklzclBjaVR4Q29tcCh6ZGV2X3QqIGRldik7Cit2b2lkIHpmVHhQY2lEbWFTdGFydCh6ZGV2X3QqIGRldik7Cit1MTZfdCB6ZlR4UG9ydENvbnRyb2woemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCBwb3J0KTsKK3UxNl90IHpmVHhTZW5kRXRoKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3QgcG9ydCwKKyAgICAgICAgICAgICAgICAgIHUxNl90IGJ1ZlR5cGUsIHUxNl90IGZsYWcpOwordTE2X3QgemZUeEdlbldsYW5UYWlsKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3QqIHNuYXAsIHUxNl90IHNuYXBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgdTE2X3QqIG1pYyk7Cit1MTZfdCB6ZlR4R2VuV2xhblNuYXAoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCogc25hcCwgdTE2X3QqIHNuYXBsZW4pOwordm9pZCB6ZlR4R2V0SXBUb3NBbmRGcmFnKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdThfdCogdXAsIHUxNl90KiBmcmFnT2ZmKTsKK3UxNl90IHpmUHV0VnR4cSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpOwordm9pZCB6ZlB1c2hWdHhxKHpkZXZfdCogZGV2KTsKK3U4X3QgemZJc1Z0eHFFbXB0eSh6ZGV2X3QqIGRldik7Cit1MTZfdCB6ZkdldFNlcUN0cmwoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCBvZmZzZXQpOwordThfdCB6ZkdldEZyYWdObyh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpOwordm9pZCB6ZlNob3dSeEVBUE9MKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3Qgb2Zmc2V0KTsKK3ZvaWQgemZTaG93VHhFQVBPTCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IG9mZnNldCk7Cit2b2lkIHpmQ29yZVJlY3YoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCBzdHJ1Y3QgenNBZGRpdGlvbkluZm8qIGFkZEluZm8pOwordTE2X3QgemZQdXRWbW1xKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1Zik7Cit2b2lkIHpmRmx1c2hWdHhxKHpkZXZfdCogZGV2KTsKK3ZvaWQgemZBZ2luZ0RlZnJhZ0xpc3QoemRldl90KiBkZXYsIHUxNl90IGZsdXNoRmxhZyk7CisKK3ZvaWQgemZMZWQxMDBtc0N0cmwoemRldl90KiBkZXYpOwordm9pZCB6ZjgwMjExRnJhbWVTZW5kKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3QqIGhlYWRlciwgdTE2X3Qgc25hcExlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxNl90KiBkYSwgdTE2X3QqIHNhLCB1OF90IHVwLCB1MTZfdCBoZWFkZXJMZW4sIHUxNl90KiBzbmFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdTE2X3QqIHRhaWwsIHUxNl90IHRhaWxMZW4sIHUxNl90IG9mZnNldCwgdTE2X3QgYnVmVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHU4X3QgYWMsIHU4X3Qga2V5SWR4KTsKK3ZvaWQgemZDaGVja0lzUklGU0ZyYW1lKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3QgZnJhbWVTdWJUeXBlKTsKKworLyogcXVldWUuYyAqLworc3RydWN0IHpzUXVldWUqIHpmUXVldWVDcmVhdGUoemRldl90KiBkZXYsIHUxNl90IHNpemUpOwordm9pZCB6ZlF1ZXVlRGVzdHJveSh6ZGV2X3QqIGRldiwgc3RydWN0IHpzUXVldWUqIHEpOwordTE2X3QgemZRdWV1ZVB1dE5jcyh6ZGV2X3QqIGRldiwgc3RydWN0IHpzUXVldWUqIHEsIHpidWZfdCogYnVmLCB1MzJfdCB0aWNrKTsKK3UxNl90IHpmUXVldWVQdXQoemRldl90KiBkZXYsIHN0cnVjdCB6c1F1ZXVlKiBxLCB6YnVmX3QqIGJ1ZiwgdTMyX3QgdGljayk7Cit6YnVmX3QqIHpmUXVldWVHZXQoemRldl90KiBkZXYsIHN0cnVjdCB6c1F1ZXVlKiBxKTsKK3pidWZfdCogemZRdWV1ZUdldFdpdGhNYWMoemRldl90KiBkZXYsIHN0cnVjdCB6c1F1ZXVlKiBxLCB1OF90KiBhZGRyLCB1OF90KiBtYik7Cit2b2lkIHpmUXVldWVGbHVzaCh6ZGV2X3QqIGRldiwgc3RydWN0IHpzUXVldWUqIHEpOwordm9pZCB6ZlF1ZXVlQWdlKHpkZXZfdCogZGV2LCBzdHJ1Y3QgenNRdWV1ZSogcSwgdTMyX3QgdGljaywgdTMyX3QgbXNBZ2UpOwordm9pZCB6ZlF1ZXVlR2VuZXJhdGVVYXBzZFRpbSh6ZGV2X3QqIGRldiwgc3RydWN0IHpzUXVldWUqIHEsCisgICAgICAgIHU4X3QqIHVuaUJpdE1hcCwgdTE2X3QqIGhpZ2hlc3RCeXRlKTsKKworLyogaHBtYWluLmMgKi8KK3UxNl90IHpmSHBJbml0KHpkZXZfdCogZGV2LCB1MzJfdCBmcmVxdWVuY3kpOwordTE2X3QgemZIcFJlbGVhc2UoemRldl90KiBkZXYpOwordm9pZCB6ZkhwU2V0RnJlcXVlbmN5RXgoemRldl90KiBkZXYsIHUzMl90IGZyZXF1ZW5jeSwgdThfdCBidzQwLAorICAgICAgICB1OF90IGV4dE9mZnNldCwgdThfdCBpbml0UkYpOwordTE2X3QgemZIcFN0YXJ0UmVjdih6ZGV2X3QqIGRldik7Cit1MTZfdCB6ZkhwU3RvcFJlY3YoemRldl90KiBkZXYpOwordTE2X3QgemZIcFJlc2V0S2V5Q2FjaGUoemRldl90KiBkZXYpOwordTE2X3QgemZIcFNldEFwU3RhTW9kZSh6ZGV2X3QqIGRldiwgdThfdCBtb2RlKTsKK3UxNl90IHpmSHBTZXRCc3NpZCh6ZGV2X3QqIGRldiwgdThfdCogYnNzaWQpOwordTE2X3QgemZIcFNldFNuaWZmZXJNb2RlKHpkZXZfdCogZGV2LCB1MTZfdCBvbik7Cit1OF90IHpmSHBVcGRhdGVRb3NQYXJhbWV0ZXIoemRldl90KiBkZXYsIHUxNl90KiBjd21pblRibCwgdTE2X3QqIGN3bWF4VGJsLAorICAgICAgICB1MTZfdCogYWlmc1RibCwgdTE2X3QqIHR4b3BUYmwpOwordm9pZCB6ZkhwU2V0QXRpbVdpbmRvdyh6ZGV2X3QqIGRldiwgdTE2X3QgYXRpbVdpbik7Cit2b2lkIHpmSHBFbmFibGVCZWFjb24oemRldl90KiBkZXYsIHUxNl90IG1vZGUsIHUxNl90IGJjbkludGVydmFsLCB1MTZfdCBkdGltLCB1OF90IGVuYWJsZUF0aW0pOwordm9pZCB6ZkhwRGlzYWJsZUJlYWNvbih6ZGV2X3QqIGRldik7Cit2b2lkIHpmSHBTZXRCYXNpY1JhdGVTZXQoemRldl90KiBkZXYsIHUxNl90IGJSYXRlQmFzaWMsIHUxNl90IGdSYXRlQmFzaWMpOwordm9pZCB6ZkhwU2V0UlRTQ1RTUmF0ZSh6ZGV2X3QqIGRldiwgdTMyX3QgcmF0ZSk7Cit2b2lkIHpmSHBTZXRNYWNBZGRyZXNzKHpkZXZfdCogZGV2LCB1MTZfdCogbWFjQWRkciwgdTE2X3QgbWFjQWRkcklkKTsKK3UzMl90IHpmSHBHZXRNYWNBZGRyZXNzKHpkZXZfdCogZGV2KTsKK3UzMl90IHpmSHBHZXRUcmFuc21pdFBvd2VyKHpkZXZfdCogZGV2KTsKK3ZvaWQgemZIcFNldE11bHRpY2FzdExpc3QoemRldl90KiBkZXYsIHU4X3Qgc2l6ZSwgdThfdCogcExpc3QsIHU4X3QgYkFsbE11bHRpY2FzdCk7CisKK3UxNl90IHpmSHBSZW1vdmVLZXkoemRldl90KiBkZXYsIHUxNl90IHVzZXIpOwordTMyX3QgemZIcFNldEtleSh6ZGV2X3QqIGRldiwgdThfdCB1c2VyLCB1OF90IGtleUlkLCB1OF90IHR5cGUsCisgICAgICAgIHUxNl90KiBtYWMsIHUzMl90KiBrZXkpOworLy91MzJfdCB6ZkhwU2V0U3RhUGFpcndpc2VLZXkoemRldl90KiBkZXYsIHUxNl90KiBhcE1hY0FkZHIsIHU4X3QgdHlwZSwKKy8vICAgICAgICB1MzJfdCoga2V5LCB1MzJfdCogbWljS2V5KTsKKy8vdTMyX3QgemZIcFNldFN0YUdyb3VwS2V5KHpkZXZfdCogZGV2LCB1MTZfdCogYXBNYWNBZGRyLCB1OF90IHR5cGUsCisvLyAgICAgICAgdTMyX3QqIGtleSwgdTMyX3QqIG1pY0tleSk7Cit1MzJfdCB6ZkhwU2V0QXBQYWlyd2lzZUtleSh6ZGV2X3QqIGRldiwgdTE2X3QqIHN0YU1hY0FkZHIsIHU4X3QgdHlwZSwKKyAgICAgICAgdTMyX3QqIGtleSwgdTMyX3QqIG1pY0tleSwgdTE2X3Qgc3RhQWlkKTsKK3UzMl90IHpmSHBTZXRBcEdyb3VwS2V5KHpkZXZfdCogZGV2LCB1MTZfdCogYXBNYWNBZGRyLCB1OF90IHR5cGUsCisgICAgICAgIHUzMl90KiBrZXksIHUzMl90KiBtaWNLZXksIHUxNl90IHZhcElkKTsKK3UzMl90IHpmSHBTZXREZWZhdWx0S2V5KHpkZXZfdCogZGV2LCB1OF90IGtleUlkLCB1OF90IHR5cGUsIHUzMl90KiBrZXksIHUzMl90KiBtaWNLZXkpOwordTMyX3QgemZIcFNldFBlclVzZXJLZXkoemRldl90KiBkZXYsIHU4X3QgdXNlciwgdThfdCBrZXlJZCwgdThfdCogbWFjLCB1OF90IHR5cGUsIHUzMl90KiBrZXksIHUzMl90KiBtaWNLZXkpOworCit2b2lkIHpmSHBTZW5kQmVhY29uKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3QgbGVuKTsKK3UxNl90IHpmSHBHZXRQYXlsb2FkTGVuKHpkZXZfdCogZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgemJ1Zl90KiBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICB1MTZfdCBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICB1MTZfdCBwbGNwSGRyTGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3QgKnJ4TVQsCisgICAgICAgICAgICAgICAgICAgICAgICB1MzJfdCAqcnhNQ1MsCisgICAgICAgICAgICAgICAgICAgICAgICB1MzJfdCAqcnhCVywKKyAgICAgICAgICAgICAgICAgICAgICAgIHUzMl90ICpyeFNHCisgICAgICAgICAgICAgICAgICAgICAgICApOwordTMyX3QgemZIcEdldEZyZWVUeGRDb3VudCh6ZGV2X3QqIGRldik7Cit1MzJfdCB6ZkhwR2V0TWF4VHhkQ291bnQoemRldl90KiBkZXYpOwordTE2X3QgemZIcFNlbmQoemRldl90KiBkZXYsIHUxNl90KiBoZWFkZXIsIHUxNl90IGhlYWRlckxlbiwKKyAgICAgICAgdTE2X3QqIHNuYXAsIHUxNl90IHNuYXBMZW4sIHUxNl90KiB0YWlsLCB1MTZfdCB0YWlsTGVuLCB6YnVmX3QqIGJ1ZiwKKyAgICAgICAgdTE2X3Qgb2Zmc2V0LCB1MTZfdCBidWZUeXBlLCB1OF90IGFjLCB1OF90IGtleUlkeCk7Cit2b2lkIHpmSHBHZXRSZWd1bGF0aW9uVGFibGVmcm9tUmVnaW9uQ29kZSh6ZGV2X3QqIGRldiwgdTE2X3QgcmVnaW9uQ29kZSk7Cit2b2lkIHpmSHBHZXRSZWd1bGF0aW9uVGFibGVmcm9tQ291bnRyeSh6ZGV2X3QqIGRldiwgdTE2X3QgQ291bnRyeUNvZGUpOwordThfdCB6ZkhwR2V0UmVndWxhdGlvblRhYmxlZnJvbUlTTyh6ZGV2X3QqIGRldiwgdThfdCAqY291bnRyeUluZm8sIHU4X3QgbGVuZ3RoKTsKK2NvbnN0IGNoYXIqIHpmSHBHZXRpc29OYW1lZnJvbXJlZ2lvbkNvZGUoemRldl90KiBkZXYsIHUxNl90IHJlZ2lvbkNvZGUpOwordTE2X3QgemZIcEdldFJlZ2lvbkNvZGVGcm9tSXNvTmFtZSh6ZGV2X3QqIGRldiwgdThfdCAqY291bnRyeUlzb05hbWUpOwordThfdCB6ZkhwR2V0UmVndWxhdG9yeURvbWFpbih6ZGV2X3QqIGRldik7Cit2b2lkIHpmSHBMZWRDdHJsKHpkZXZfdCogZGV2LCB1MTZfdCBsZWRJZCwgdThfdCBtb2RlKTsKK3UxNl90IHpmSHBSZXNldFR4UngoemRldl90KiBkZXYpOwordTE2X3QgemZIcERlbGV0ZUFsbG93Q2hhbm5lbCh6ZGV2X3QqIGRldiwgdTE2X3QgZnJlcSk7Cit1MTZfdCB6ZkhwQWRkQWxsb3dDaGFubmVsKHpkZXZfdCogZGV2LCB1MTZfdCBmcmVxKTsKK3UzMl90IHpmSHBDd21VcGRhdGUoemRldl90KiBkZXYpOwordTMyX3QgemZIcEFuaVVwZGF0ZSh6ZGV2X3QqIGRldik7Cit1MzJfdCB6ZkhwQW5pVXBkYXRlUnNzaSh6ZGV2X3QqIGRldiwgdThfdCByc3NpKTsKK3ZvaWQgemZIcEFuaUF0dGFjaCh6ZGV2X3QqIGRldik7Cit2b2lkIHpmSHBBbmlBclBvbGwoemRldl90KiBkZXYsIHUzMl90IGxpc3RlblRpbWUsIHUzMl90IHBoeUNudDEsIHUzMl90IHBoeUNudDIpOwordm9pZCB6ZkhwSGVhcnRCZWF0KHpkZXZfdCogZGV2KTsKK3ZvaWQgemZIcFBvd2VyU2F2ZVNldFN0YXRlKHpkZXZfdCogZGV2LCB1OF90IHBzU3RhdGUpOwordm9pZCB6ZkhwUG93ZXJTYXZlU2V0TW9kZSh6ZGV2X3QqIGRldiwgdThfdCBzdGFNb2RlLCB1OF90IHBzTW9kZSwgdTE2X3QgYmNuSW50ZXJ2YWwpOwordTE2X3QgemZIcElzRGZzQ2hhbm5lbCh6ZGV2X3QqIGRldiwgdTE2X3QgZnJlcSk7Cit1MTZfdCB6ZkhwSXNEZnNDaGFubmVsTkNTKHpkZXZfdCogZGV2LCB1MTZfdCBmcmVxKTsKK3UxNl90IHpmSHBGaW5kRmlyc3ROb25EZnNDaGFubmVsKHpkZXZfdCogZGV2LCB1MTZfdCBhQmFuZCk7Cit1MTZfdCB6ZkhwSXNBbGxvd2VkQ2hhbm5lbCh6ZGV2X3QqIGRldiwgdTE2X3QgZnJlcSk7Cit2b2lkIHpmSHBEaXNhYmxlRGZzQ2hhbm5lbCh6ZGV2X3QqIGRldiwgdThfdCBkaXNhYmxlRmxhZyk7Cit2b2lkIHpmSHBTZXRUVFNJRlNUaW1lKHpkZXZfdCogZGV2LCB1OF90IHNpZnNfdGltZSk7CisKK3ZvaWQgemZIcFF1ZXJ5TW9uSGFsUnhJbmZvKHpkZXZfdCogZGV2LCB1OF90ICptb25IYWxSeEluZm8pOworCit2b2lkIHpmRHVtcFNTSUQodThfdCBsZW5ndGgsIHU4X3QgKnZhbHVlKTsKK3ZvaWQgemZIcFNldEFnZ1BrdE51bSh6ZGV2X3QqIGRldiwgdTMyX3QgbnVtKTsKK3ZvaWQgemZIcFNldE1QRFVEZW5zaXR5KHpkZXZfdCogZGV2LCB1OF90IGRlbnNpdHkpOwordm9pZCB6ZkhwU2V0U2xvdFRpbWUoemRldl90KiBkZXYsIHU4X3QgdHlwZSk7Cit2b2lkIHpmSHBTZXRTbG90VGltZVJlZ2lzdGVyKHpkZXZfdCogZGV2LCB1OF90IHR5cGUpOwordm9pZCB6ZkhwU2V0Umlmcyh6ZGV2X3QqIGRldiwgdThfdCBodF9lbmFibGUsIHU4X3QgaHQyMDQwLCB1OF90IGdfbW9kZSk7Cit2b2lkIHpmSHBCZWdpblNpdGVTdXJ2ZXkoemRldl90KiBkZXYsIHU4X3Qgc3RhdHVzKTsKK3ZvaWQgemZIcEZpbmlzaFNpdGVTdXJ2ZXkoemRldl90KiBkZXYsIHU4X3Qgc3RhdHVzKTsKK3UxNl90IHpmSHBFbmFibGVId1JldHJ5KHpkZXZfdCogZGV2KTsKK3UxNl90IHpmSHBEaXNhYmxlSHdSZXRyeSh6ZGV2X3QqIGRldik7Cit2b2lkIHpmSHBTV0RlY3J5cHQoemRldl90KiBkZXYsIHU4X3QgZW5hYmxlKTsKK3ZvaWQgemZIcFNXRW5jcnlwdCh6ZGV2X3QqIGRldiwgdThfdCBlbmFibGUpOwordTMyX3QgemZIcENhcGFiaWxpdHkoemRldl90KiBkZXYpOwordm9pZCB6ZkhwU2V0Um9sbENhbGxUYWJsZSh6ZGV2X3QqIGRldik7Cit1OF90IHpmSHByZWd1bGF0b3J5RG9tYWluKHpkZXZfdCogZGV2KTsKK3UxNl90IHpmU3RhQWRkSWVQb3dlckNhcCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IG9mZnNldCk7Cit1OF90IHpmSHBHZXRNYXhUeFBvd2VyKHpkZXZfdCogZGV2KTsKK3U4X3QgemZIcEdldE1pblR4UG93ZXIoemRldl90KiBkZXYpOwordTE2X3QgemZTdGFBZGRJZVN1cHBvcnRDaCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IG9mZnNldCk7Cit2b2lkIHpmSHBFbmFibGVSaWZzKHpkZXZfdCogZGV2LCB1OF90IG1vZGUyNGcsIHU4X3QgbW9kZUh0LCB1OF90IG1vZGVIdDIwNDApOwordm9pZCB6ZkhwRGlzYWJsZVJpZnMoemRldl90KiBkZXYpOwordTE2X3QgemZIcFVzYlJlc2V0KHpkZXZfdCogZGV2KTsKKworCisjZW5kaWYgLyogI2lmbmRlZiBfQ0ZVTkNfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2NoYi5jIGIvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2NoYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmYWMxNTAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvY2hiLmMKQEAgLTAsMCArMSwyMDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBBdGhlcm9zIENvbW11bmljYXRpb25zIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2R1bGUgTmFtZSA6IGhiLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEFic3RyYWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgVGhpcyBtb2R1bGUgY29udGFpbnMgaG91c2Uga2VlcGluZyBhbmQgdGltZXIgZnVuY3Rpb25zLiAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE5PVEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlICJjcHJlY29tcC5oIgorCisvKiBDYWxsZWQgYnkgd3JhcHBlciBldmVyeSAxMCBtc2VjICovCit2b2lkIHpmaUhlYXJ0QmVhdCh6ZGV2X3QqIGRldikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB3ZC0+dGljaysrOworCisjaWYgMAorICAgIC8qID0+IGV2ZXJ5IDEuMjggc2Vjb25kcyAqLworICAgIGlmICh3ZC0+Y3dtLmN3X2VuYWJsZSAmJiAoKHdkLT50aWNrICYgMHg3ZikgPT0gMHgzZikpCisgICAgeworICAgICAgICB6ZkhwQ3dtVXBkYXRlKGRldik7CisgICAgfQorI2VuZGlmCisgICAgLyogPT4gZXZlcnkgMi41NiBzZWNvbmRzICovCisgICAgaWYgKCh3ZC0+dGljayAmIDB4ZmYpID09IDApCisgICAgeworICAgICAgICB6ZkFnaW5nRGVmcmFnTGlzdChkZXYsIDEpOworICAgIH0KKworICAgIC8qIFdhdGNoIERvZyAqLworICAgIC8vemZXYXRjaERvZygpOworCisgICAgLyogTEVEIENvbnRyb2wgKHBlciAxMDBtcykgKi8KKyAgICBpZiAoKHdkLT50aWNrICUgMTApID09IDkpCisgICAgeworICAgICAgICB6ZkxlZDEwMG1zQ3RybChkZXYpOworI2lmZGVmIFpNX0VOQUJMRV9CQV9SQVRFQ1RSTAorICAgICAgICBpZiAoIXdkLT5tb2RlTURLRW5hYmxlKQorICAgICAgICB7CisgICAgICAgICAgICB6ZmlEYmdSZWFkVGFsbHkoZGV2KTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgfQorCisjaWZkZWYgWk1fRU5BQkxFX1JFV1JJVEVfQkVBQ09OX1NUQVJUX0FERFJFU1MKKyAgICBpZiAoIHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0lCU1MgKQorICAgIHsKKyAgICAgICAgaWYgKCB6ZlN0YUlzQ29ubmVjdGVkKGRldikgKQorICAgICAgICB7CisgICAgICAgICAgICB6ZlJlV3JpdGVCZWFjb25TdGFydEFkZHJlc3MoZGV2KTsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgorCisgICAgaWYgKCB3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9JQlNTICkKKyAgICB7CisgICAgICAgIGlmICggemZTdGFJc0Nvbm5lY3RlZChkZXYpICkKKyAgICAgICAgeworICAgICAgICAgICAgd2QtPnRpY2tJYnNzUmVjZWl2ZUJlYWNvbisrOyAgLy8gYWRkIDEwbXMKKworICAgICAgICAgICAgaWYgKCAod2QtPnN0YS5pYnNzU2l0ZVN1cnZleVN0YXR1cyA9PSAyKSAmJgorICAgICAgICAgICAgICAgICAod2QtPnRpY2tJYnNzUmVjZWl2ZUJlYWNvbiA9PSAzMDApICYmCisgICAgICAgICAgICAgICAgICh3ZC0+c3RhLmlic3NSZWNlaXZlQmVhY29uQ291bnQgPCAzKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiSXQgaXMgaGFwcGVuISEhIE5vIGVycm9yIG1lc3NhZ2UiKTsKKyAgICAgICAgICAgICAgICB6ZlJlU2V0Q3VycmVudEZyZXF1ZW5jeShkZXYpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYod2QtPnN0YS5SZWNlaXZlZFBhY2tldFJhdGVDb3VudGVyIDw9IDApCisgICAgeworICAgICAgICB3ZC0+c3RhLlJlY2VpdmVkUGt0UmF0ZVBlclNlY29uZCA9IHdkLT5zdGEuVG90YWxOdW1iZXJPZlJlY2VpdmVQYWNrZXRzOworCS8vem1fZGVidWdfbXNnMSgiUmVjZWl2ZSBQYWNrZXQgUGVyIFNlY29uZCAgPSAiLCB3ZC0+c3RhLlJlY2VpdmVkUGt0UmF0ZVBlclNlY29uZCk7CisJICAgIGlmICh3ZC0+c3RhLlRvdGFsTnVtYmVyT2ZSZWNlaXZlUGFja2V0cyAhPSAwKQorCSAgICB7CisJICAgICAgICB3ZC0+c3RhLmF2Z1NpemVPZlJlY2VpdmVQYWNrZXRzID0gd2QtPnN0YS5Ub3RhbE51bWJlck9mUmVjZWl2ZUJ5dGVzL3dkLT5zdGEuVG90YWxOdW1iZXJPZlJlY2VpdmVQYWNrZXRzOworCSAgICB9CisJICAgIGVsc2UKKwkgICAgeworCSAgICAgICAgd2QtPnN0YS5hdmdTaXplT2ZSZWNlaXZlUGFja2V0cyA9IDY0MDsKKwkgICAgfQorICAgICAgICB3ZC0+c3RhLlRvdGFsTnVtYmVyT2ZSZWNlaXZlUGFja2V0cyA9IDA7CisgICAgICAgIHdkLT5zdGEuVG90YWxOdW1iZXJPZlJlY2VpdmVCeXRlcyA9IDA7CisgICAgICAgIHdkLT5zdGEuUmVjZWl2ZWRQYWNrZXRSYXRlQ291bnRlciA9IDEwMDsgLypmb3IgYW5vdGhlciAxcyovCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHdkLT5zdGEuUmVjZWl2ZWRQYWNrZXRSYXRlQ291bnRlci0tOworICAgIH0KKworCS8qID0+IGV2ZXJ5IDEuMjggc2Vjb25kcyAqLworCWlmKCh3ZC0+dGljayAmIDB4N2YpID09IDB4M2YpCisJeworCQlpZiggd2QtPnN0YS5Ob25OQVBjb3VudCA+IDApCisJCXsKKwkJCXdkLT5zdGEuUlRTSW5BR0dNb2RlID0gVFJVRTsKKwkJCXdkLT5zdGEuTm9uTkFQY291bnQgPSAwOworCQl9CisJCWVsc2UKKwkJeworCQkJd2QtPnN0YS5SVFNJbkFHR01vZGUgPSBGQUxTRTsKKwkJfQorCX0KKworCisKKyAgICAvKiBNYWludGFpbiBtYW5hZ2VtZW50IHRpbWUgdGljayAqLworICAgIHpmTW1BcFRpbWVUaWNrKGRldik7CisgICAgemZNbVN0YVRpbWVUaWNrKGRldik7CisKKyAgICAvL3pmUGh5Q3JUdW5pbmcoZGV2KTsKKworICAgIC8vemZUeFBvd2VyQ29udHJvbChkZXYpOworICAgIHpmSHBIZWFydEJlYXQoZGV2KTsKKworfQorCisKK3ZvaWQgemZEdW1wQnNzTGlzdCh6ZGV2X3QqIGRldikKK3sKKyAgICBzdHJ1Y3QgenNCc3NJbmZvKiBwQnNzSW5mbzsKKyAgICB1OF90ICAgc3RyWzMzXTsKKyAgICB1OF90ICAgaSwgajsKKyAgICB1MzJfdCAgYWRkcjEsIGFkZHIyOworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgem1fZGVidWdfbXNnMCgiKioqKiogQnNzIHNjYW4gcmVzdWx0ICoqKioqIik7CisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIHBCc3NJbmZvID0gd2QtPnN0YS5ic3NMaXN0LmhlYWQ7CisKKyAgICBmb3IoIGk9MDsgaTx3ZC0+c3RhLmJzc0xpc3QuYnNzQ291bnQ7IGkrKyApCisgICAgeworICAgICAgICBpZiAoIGkgKQorICAgICAgICB7CisgICAgICAgICAgICB6bV9kZWJ1Z19tc2cwKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKKyAgICAgICAgfQorCisgICAgICAgIHptX2RlYnVnX21zZzEoIkJTUyAjIiwgaSk7CisgICAgICAgIGZvcihqPTA7IGo8cEJzc0luZm8tPnNzaWRbMV07IGorKykKKyAgICAgICAgeworICAgICAgICAgICAgc3RyW2pdID0gcEJzc0luZm8tPnNzaWRbMitqXTsKKyAgICAgICAgfQorICAgICAgICBzdHJbcEJzc0luZm8tPnNzaWRbMV1dID0gMDsKKyAgICAgICAgem1fZGVidWdfbXNnMCgiU1NJRCA9ICIpOworICAgICAgICB6bV9kZWJ1Z19tc2cwKHN0cik7CisKKyAgICAgICAgYWRkcjEgPSAocEJzc0luZm8tPmJzc2lkWzBdIDw8IDE2KSArIChwQnNzSW5mby0+YnNzaWRbMV0gPDwgOCApCisgICAgICAgICAgICAgICAgKyBwQnNzSW5mby0+YnNzaWRbMl07CisgICAgICAgIGFkZHIyID0gKHBCc3NJbmZvLT5ic3NpZFszXSA8PCAxNikgKyAocEJzc0luZm8tPmJzc2lkWzRdIDw8IDggKQorICAgICAgICAgICAgICAgICsgcEJzc0luZm8tPmJzc2lkWzVdOworICAgICAgICB6bV9kZWJ1Z19tc2cyKCJCc3NpZCA9ICIsIGFkZHIxKTsKKyAgICAgICAgem1fZGVidWdfbXNnMigiICAgICAgICAiLCBhZGRyMik7CisgICAgICAgIHptX2RlYnVnX21zZzEoImZyZXF1ZW5jeSA9ICIsIHBCc3NJbmZvLT5mcmVxdWVuY3kpOworICAgICAgICB6bV9kZWJ1Z19tc2cxKCJzZWN1cml0eSB0eXBlID0gIiwgcEJzc0luZm8tPnNlY3VyaXR5VHlwZSk7CisgICAgICAgIHptX2RlYnVnX21zZzEoIldNRSA9ICIsIHBCc3NJbmZvLT53bWVTdXBwb3J0KTsKKyAgICAgICAgem1fZGVidWdfbXNnMSgiYmVhY29uIGludGVydmFsID0gIiwgcEJzc0luZm8tPmJlYWNvbkludGVydmFsWzBdCisgICAgICAgICAgICAgICAgICAgICAgKyAocEJzc0luZm8tPmJlYWNvbkludGVydmFsWzFdIDw8IDgpKTsKKyAgICAgICAgem1fZGVidWdfbXNnMSgiY2FwYWJpbGl0eSA9ICIsIHBCc3NJbmZvLT5jYXBhYmlsaXR5WzBdCisgICAgICAgICAgICAgICAgICAgICAgKyAocEJzc0luZm8tPmNhcGFiaWxpdHlbMV0gPDwgOCkpOworICAgICAgICBpZiAoIHBCc3NJbmZvLT5zdXBwb3J0ZWRSYXRlc1sxXSA+IDAgKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IoIGo9MDsgajxwQnNzSW5mby0+c3VwcG9ydGVkUmF0ZXNbMV07IGorKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMigic3VwcG9ydGVkIHJhdGVzID0gIiwgcEJzc0luZm8tPnN1cHBvcnRlZFJhdGVzWzIral0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9yKCBqPTA7IGo8cEJzc0luZm8tPmV4dFN1cHBvcnRlZFJhdGVzWzFdOyBqKysgKQorICAgICAgICB7CisgICAgICAgICAgICB6bV9kZWJ1Z19tc2cyKCJleHQgc3VwcG9ydGVkIHJhdGVzID0gIiwgcEJzc0luZm8tPmV4dFN1cHBvcnRlZFJhdGVzWzIral0pOworICAgICAgICB9CisKKyAgICAgICAgcEJzc0luZm8gPSBwQnNzSW5mby0+bmV4dDsKKyAgICB9CisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIHptX2RlYnVnX21zZzAoIioqKioqKioqKioqKioqKioqKioqKioqKioqKiIpOworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvY2ljLmMgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvY2ljLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzg0ZjA3OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9jaWMuYwpAQCAtMCwwICsxLDQ5NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNy0yMDA4IEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlICJjcHJlY29tcC5oIgorI2luY2x1ZGUgInJhdGVjdHJsLmgiCisKKwordm9pZCB6ZlVwZGF0ZUJzc2lkKHpkZXZfdCogZGV2LCB1OF90KiBic3NpZCkKK3sKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIC8vem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIC8vem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICB3ZC0+c3RhLmJzc2lkWzBdID0gYnNzaWRbMF0gKyAoKCh1MTZfdCkgYnNzaWRbMV0pIDw8IDgpOworICAgIHdkLT5zdGEuYnNzaWRbMV0gPSBic3NpZFsyXSArICgoKHUxNl90KSBic3NpZFszXSkgPDwgOCk7CisgICAgd2QtPnN0YS5ic3NpZFsyXSA9IGJzc2lkWzRdICsgKCgodTE2X3QpIGJzc2lkWzVdKSA8PCA4KTsKKyAgICAvL3ptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICB6ZkhwU2V0QnNzaWQoZGV2LCBic3NpZCk7CisKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmUmVzZXRTdXBwb3J0UmF0ZSAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBSZXNldCBzdXBwb3J0IHJhdGUgdG8gZGVmYXVsdCB2YWx1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgdHlwZTogWk1fREVGQVVMVF9TVVBQT1JUX1JBVEVfWkVSTyAgICAgICA9PiByZXNldCB0byB6ZXJvICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgIFpNX0RFRkFVTFRfU1VQUE9SVF9SQVRFX0RJU0NPTk5FQ1QgPT4gcmVzZXQgdG8gZGlzY29ubmVjdCBzdGF0dXMgICAgICAqLworLyogICAgICAgICAgICBaTV9ERUZBVUxUX1NVUFBPUlRfUkFURV9JQlNTX0IgICAgID0+IHJlc2V0IHRvIElCU1MgY3JlYXRvcihiIG1vZGUpICAgKi8KKy8qICAgICAgICAgICAgWk1fREVGQVVMVF9TVVBQT1JUX1JBVEVfSUJTU19BRyAgICA9PiByZXNldCB0byBJQlNTIGNyZWF0b3IoYS9nIG1vZGUpICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgemZSZXNldFN1cHBvcnRSYXRlKHpkZXZfdCogZGV2LCB1OF90IHR5cGUpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgc3dpdGNoKHR5cGUpCisgICAgeworICAgIGNhc2UgWk1fREVGQVVMVF9TVVBQT1JUX1JBVEVfWkVSTzoKKyAgICAgICAgd2QtPmJSYXRlID0gMDsKKyAgICAgICAgd2QtPmJSYXRlQmFzaWMgPSAwOworICAgICAgICB3ZC0+Z1JhdGUgPSAwOworICAgICAgICB3ZC0+Z1JhdGVCYXNpYyA9IDA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgWk1fREVGQVVMVF9TVVBQT1JUX1JBVEVfRElTQ09OTkVDVDoKKyAgICAgICAgd2QtPmJSYXRlID0gMHhmOworICAgICAgICB3ZC0+YlJhdGVCYXNpYyA9IDB4ZjsKKyAgICAgICAgd2QtPmdSYXRlID0gMHhmZjsKKyAgICAgICAgd2QtPmdSYXRlQmFzaWMgPSAweDE1OworICAgICAgICBicmVhazsKKyAgICBjYXNlIFpNX0RFRkFVTFRfU1VQUE9SVF9SQVRFX0lCU1NfQjoKKyAgICAgICAgd2QtPmJSYXRlID0gMHhmOworICAgICAgICB3ZC0+YlJhdGVCYXNpYyA9IDB4ZjsKKyAgICAgICAgd2QtPmdSYXRlID0gMDsKKyAgICAgICAgd2QtPmdSYXRlQmFzaWMgPSAwOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFpNX0RFRkFVTFRfU1VQUE9SVF9SQVRFX0lCU1NfQUc6CisgICAgICAgIHdkLT5iUmF0ZSA9IDB4ZjsKKyAgICAgICAgd2QtPmJSYXRlQmFzaWMgPSAweGY7CisgICAgICAgIHdkLT5nUmF0ZSA9IDB4ZmY7CisgICAgICAgIHdkLT5nUmF0ZUJhc2ljID0gMDsKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCit2b2lkIHpmVXBkYXRlU3VwcG9ydFJhdGUoemRldl90KiBkZXYsIHU4X3QqIHJhdGVBcnJheSkKK3sKKyAgICB1OF90IGJSYXRlPTAsIGJSYXRlQmFzaWM9MCwgZ1JhdGU9MCwgZ1JhdGVCYXNpYz0wOworICAgIHU4X3QgbGVuZ3RoID0gcmF0ZUFycmF5WzFdOworICAgIHU4X3QgaSwgajsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIGZvcihpPTI7IGk8bGVuZ3RoKzI7IGkrKykKKyAgICB7CisgICAgICAgIGZvcihqPTA7IGo8NDsgaisrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIChyYXRlQXJyYXlbaV0gJiAweDdmKSA9PSB6ZzExYlJhdGVUYmxbal0gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJSYXRlIHw9ICgxIDw8IGopOworICAgICAgICAgICAgICAgIGlmICggcmF0ZUFycmF5W2ldICYgMHg4MCApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiUmF0ZUJhc2ljIHw9ICgxIDw8IGopOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICggaiA9PSA0ICkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yKGo9MDsgajw4OyBqKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCAocmF0ZUFycmF5W2ldICYgMHg3ZikgPT0gemcxMWdSYXRlVGJsW2pdICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGdSYXRlIHw9ICgxIDw8IGopOworICAgICAgICAgICAgICAgICAgICBpZiAoIHJhdGVBcnJheVtpXSAmIDB4ODAgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBnUmF0ZUJhc2ljIHw9ICgxIDw8IGopOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisKKyAgICB3ZC0+YlJhdGUgfD0gYlJhdGU7CisgICAgd2QtPmJSYXRlQmFzaWMgfD0gYlJhdGVCYXNpYzsKKyAgICB3ZC0+Z1JhdGUgfD0gZ1JhdGU7CisgICAgd2QtPmdSYXRlQmFzaWMgfD0gZ1JhdGVCYXNpYzsKK30KKwordThfdCB6ZklzR09ubHlNb2RlKHpkZXZfdCogZGV2LCB1MTZfdCAgZnJlcXVlbmN5LCB1OF90KiByYXRlQXJyYXkpCit7CisgICAgdThfdCBsZW5ndGggPSByYXRlQXJyYXlbMV07CisgICAgdThfdCBpLCBqOworCisgICAgaWYgKGZyZXF1ZW5jeSA8IDMwMDApIHsKKyAgICAgICAgZm9yIChpID0gMjsgaSA8IGxlbmd0aCsyOyBpKyspIHsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCA4OyBqKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoICgocmF0ZUFycmF5W2ldICYgMHg3ZikgPT0gemcxMWdSYXRlVGJsW2pdKQorICAgICAgICAgICAgICAgICAgICAgJiYgKHJhdGVBcnJheVtpXSAmIDB4ODApICkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCB6ZkdhdGhlckJNb2RlKHpkZXZfdCogZGV2LCB1OF90KiByYXRlQXJyYXksIHU4X3QqIGV4dHJhdGVBcnJheSkKK3sKKyAgICB1OF90IGdhdGhlckJNb2RlW1pNX01BWF9TVVBQX1JBVEVTX0lFX1NJWkUgKyAyXTsKKyAgICB1OF90IGksIGosIGsgPSAwOworICAgIHU4X3QgbGVuZ3RoOworCisgICAgZ2F0aGVyQk1vZGVbMF0gPSBaTV9XTEFOX0VJRF9TVVBQT1JUX1JBVEU7CisgICAgZ2F0aGVyQk1vZGVbMV0gPSAwOworCisgICAgbGVuZ3RoID0gcmF0ZUFycmF5WzFdOworICAgIGZvciAoaSA9IDI7IGkgPCBsZW5ndGgrMjsgaSsrKSB7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCA0OyBqKyspIHsKKyAgICAgICAgICAgIGlmICggKHJhdGVBcnJheVtpXSAmIDB4N2YpID09IHpnMTFiUmF0ZVRibFtqXSApIHsKKyAgICAgICAgICAgICAgICBnYXRoZXJCTW9kZVsyK2tdID0gcmF0ZUFycmF5W2ldOworCisgICAgICAgICAgICAgICAgZ2F0aGVyQk1vZGVbMV0rKzsKKyAgICAgICAgICAgICAgICBrKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBsZW5ndGggPSBleHRyYXRlQXJyYXlbMV07CisgICAgZm9yIChpID0gMjsgaSA8IGxlbmd0aCsyOyBpKyspIHsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IDQ7IGorKykgeworICAgICAgICAgICAgaWYgKCAoZXh0cmF0ZUFycmF5W2ldICYgMHg3ZikgPT0gemcxMWJSYXRlVGJsW2pdICkgeworICAgICAgICAgICAgICAgIGdhdGhlckJNb2RlWzIra10gPSBleHRyYXRlQXJyYXlbaV07CisKKyAgICAgICAgICAgICAgICBnYXRoZXJCTW9kZVsxXSsrOworICAgICAgICAgICAgICAgIGsrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGV4dHJhdGVBcnJheVswXSA9IGV4dHJhdGVBcnJheVsxXSA9IDA7CisgICAgemZNZW1vcnlDb3B5KHJhdGVBcnJheSwgZ2F0aGVyQk1vZGUsIGdhdGhlckJNb2RlWzFdKzIpOworfQorCit1MTZfdCB6ZkdldFJhbmRvbU51bWJlcih6ZGV2X3QqIGRldiwgdTE2X3QgaW5pdFZhbHVlKQoreworI2lmIDAKKyAgICAvKiBDb21waWxlci9MaW5rZXIgZXJyb3Igb24gTGludXggKi8KKyAgICBpZiAoIGluaXRWYWx1ZSApCisgICAgeworICAgICAgICBzcmFuZChpbml0VmFsdWUpOworICAgIH0KKworICAgIHJldHVybiAoKHUxNl90KXJhbmQoKSk7CisjZW5kaWYKKyAgICByZXR1cm4gMDsKK30KKwordThfdCB6ZlBTRGV2aWNlU2xlZXAoemRldl90KiBkZXYpCit7CisgICAgLy96bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICAvKiBlbnRlciBQUyBtb2RlICovCisKKyAgICByZXR1cm4gMDsKK30KKwordThfdCB6Y09mZG1QaHlDcnRsVG9SYXRlW10gPQoreworICAgIC8qIDB4OD00OE0sIDB4OT0yNE0sIDB4YT0xMk0sIDB4Yj02TSwgMHhjPTU0TSwgMHhkPTM2TSwgMHhlPTE4TSwgMHhmPTlNICovCisgICAgICAgICAgICAxMCwgICAgICAgOCwgICAgICAgNiwgICAgICA0LCAgICAgIDExLCAgICAgICA5LCAgICAgICA3LCAgICAgIDUKK307CisKK3U4X3QgemZQaHlDdHJsVG9SYXRlKHUzMl90IHBoeUN0cmwpCit7CisgICAgdTMyX3QgbXQsIG1jcywgc2c7CisgICAgdThfdCByYXRlID0gMDsKKworICAgIG10ID0gcGh5Q3RybCAmIDB4MzsKKyAgICBtY3MgPSAocGh5Q3RybD4+MTgpICYgMHgzZjsKKyAgICBzZyA9IChwaHlDdHJsPj4zMSkgJiAweDE7CisKKyAgICBpZiAoKG10ID09IDApICYmIChtY3MgPD0zKSkKKyAgICB7CisgICAgICAgIHJhdGUgPSAodThfdCltY3M7CisgICAgfQorICAgIGVsc2UgaWYgKChtdCA9PSAxKSAmJiAobWNzID49IDB4OCkgJiYgKG1jcyA8PSAweGYpKQorICAgIHsKKyAgICAgICAgcmF0ZSA9IHpjT2ZkbVBoeUNydGxUb1JhdGVbbWNzLThdOworICAgIH0KKyAgICBlbHNlIGlmICgobXQgPT0gMikgJiYgKG1jcyA8PSAxNSkpCisgICAgeworICAgICAgICByYXRlID0gKHU4X3QpbWNzICsgMTI7CisgICAgICAgIGlmKHNnKSB7CisgICAgICAgICAgICBpZiAobWNzICE9IDcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmF0ZSA9ICh1OF90KW1jcyArIDEyICsgMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgLy9NQ1M3LVNHCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmF0ZSA9ICh1OF90KTMwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJhdGU7Cit9CisKKwordm9pZCB6ZkNvcmVFdmVudCh6ZGV2X3QqIGRldiwgdTE2X3QgZXZlbnQsIHU4X3QqIHJzcCkKK3sKKyAgICB1MTZfdCBpOworICAgIHpidWZfdCogcHNCdWY7CisgICAgdThfdCBtb3JlRGF0YTsKKyAgICB1OF90IHZhcCA9IDA7CisgICAgdThfdCBwZWVySWR4OworICAgIHM4X3QgcmVzOworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisKKyAgICBpZiAoZXZlbnQgPT0gMCkgLy9CZWFjb24gRXZlbnQKKyAgICB7CisgICAgICAgIGlmICggd2QtPndsYW5Nb2RlID09IFpNX01PREVfQVAgKQorICAgICAgICB7CisgICAgICAgICAgICB6ZkFwU2VuZEJlYWNvbihkZXYpOworCisgICAgICAgICAgICBpZiAod2QtPkN1cnJlbnREdGltQ291bnQgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBUT0RPIDogU2VuZCBxdWV1ZWQgYnJvYWRjYXN0IGZyYW1lcyBhdCBCQy9NQyBldmVudCAqLworICAgICAgICAgICAgICAgIGRvCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwc0J1ZiA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgIG1vcmVEYXRhID0gMDsKKyAgICAgICAgICAgICAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHdkLT5hcC5iY21jVGFpbFt2YXBdICE9IHdkLT5hcC5iY21jSGVhZFt2YXBdKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvL3ptX21zZzBfbW0oWk1fTFZfMCwgIlNlbmQgQkNNQyBmcmFtZXMiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBzQnVmID0gd2QtPmFwLmJjbWNBcnJheVt2YXBdW3dkLT5hcC5iY21jSGVhZFt2YXBdXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5hcC5iY21jSGVhZFt2YXBdID0gKHdkLT5hcC5iY21jSGVhZFt2YXBdICsgMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiAoWk1fQkNNQ19BUlJBWV9TSVpFIC0gMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAod2QtPmFwLmJjbWNUYWlsW3ZhcF0gIT0gd2QtPmFwLmJjbWNIZWFkW3ZhcF0pCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9yZURhdGEgPSAweDIwOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgICAgICAgICAgICAgIGlmIChwc0J1ZiAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBUT0RPIDogY29uZmlnIG1vcmVEYXRhIGJpdCAqLworICAgICAgICAgICAgICAgICAgICAgICAgemZUeFNlbmRFdGgoZGV2LCBwc0J1ZiwgMCwgWk1fRVhURVJOQUxfQUxMT0NfQlVGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3JlRGF0YSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IHdoaWxlKHBzQnVmICE9IE5VTEwpOworCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvKiBTVEEgbW9kZSAqLworICAgICAgICAgICAgaWYgKCB3ZC0+c3RhLnBvd2VyU2F2ZU1vZGUgPiBaTV9TVEFfUFNfTk9ORSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogc2VuZCBxdWV1ZWQgcGFja2V0cyAqLworICAgICAgICAgICAgICAgIGZvcihpPTA7IGk8d2QtPnN0YS5zdGFQU0RhdGFDb3VudDsgaSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgemZUeFNlbmRFdGgoZGV2LCB3ZC0+c3RhLnN0YVBTRGF0YVF1ZXVlW2ldLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaTV9FWFRFUk5BTF9BTExPQ19CVUYsIDApOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHdkLT5zdGEuc3RhUFNEYXRhQ291bnQgPSAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0lCU1MgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHpmU3RhU2VuZEJlYWNvbihkZXYpOworICAgICAgICAgICAgICAgIHdkLT5zdGEuaWJzc0F0aW1UaW1lciA9IFpNX0JJVF8xNSB8IHdkLT5zdGEuYXRpbVdpbmRvdzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgemZQb3dlclNhdmluZ01nclByZVRCVFRJbnRlcnJ1cHQoZGV2KTsKKyAgICAgICAgfQorICAgIH0gLy9pZiAoZXZlbnQgPT0gMCkgLy9CZWFjb24gRXZlbnQKKyAgICBlbHNlIGlmIChldmVudCA9PSAxKSAvL1JldHJ5IGNvbXBsZXRlZCBldmVudAorICAgIHsKKyAgICAgICAgdTMyX3QgcmV0cnlSYXRlOworCisgICAgICAgIHJldHJ5UmF0ZSA9ICh1MzJfdCkocnNwWzZdKSArICgoKHUzMl90KShyc3BbN10pKTw8OCkKKyAgICAgICAgICAgICAgICArICgoKHUzMl90KShyc3BbOF0pKTw8MTYpICsgKCgodTMyX3QpKHJzcFs5XSkpPDwyNCk7CisgICAgICAgIC8qIERlZ3JhZGUgVHggUmF0ZSAqLworICAgICAgICBpZiAod2QtPndsYW5Nb2RlID09IFpNX01PREVfQVApCisgICAgICAgIHsKKyAgICAgICAgICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgICAgICBpZiAoKGk9emZBcEZpbmRTdGEoZGV2LCAodTE2X3QqKXJzcCkpICE9IDB4ZmZmZikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6ZlJhdGVDdHJsVHhGYWlsRXZlbnQoZGV2LCAmd2QtPmFwLnN0YVRhYmxlW2ldLnJjQ2VsbCwgMCwodTMyX3QpemZQaHlDdHJsVG9SYXRlKHJldHJ5UmF0ZSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgICAgICByZXMgPSB6ZlN0YUZpbmRPcHBvc2l0ZUJ5TUFDQWRkcihkZXYsICh1MTZfdCopcnNwLCAmcGVlcklkeCk7CisgICAgICAgICAgICBpZiAoIHJlcyA9PSAwICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6ZlJhdGVDdHJsVHhGYWlsRXZlbnQoZGV2LCAmd2QtPnN0YS5vcHBvc2l0ZUluZm9bcGVlcklkeF0ucmNDZWxsLCAwLCh1MzJfdCl6ZlBoeUN0cmxUb1JhdGUocmV0cnlSYXRlKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICB9CisgICAgfSAvL2Vsc2UgaWYgKGV2ZW50ID09IDEpIC8vUmV0cnkgY29tcGxldGVkIGV2ZW50CisgICAgZWxzZSBpZiAoZXZlbnQgPT0gMikgLy9UeCBGYWlsIGV2ZW50CisgICAgeworICAgICAgICB1MzJfdCByZXRyeVJhdGU7CisKKyAgICAgICAgcmV0cnlSYXRlID0gKHUzMl90KShyc3BbNl0pICsgKCgodTMyX3QpKHJzcFs3XSkpPDw4KQorICAgICAgICAgICAgICAgICsgKCgodTMyX3QpKHJzcFs4XSkpPDwxNikgKyAoKCh1MzJfdCkocnNwWzldKSk8PDI0KTsKKworICAgICAgICAvKiBEZWdyYWRlIFR4IFJhdGUgKi8KKyAgICAgICAgaWYgKHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0FQKQorICAgICAgICB7CisgICAgICAgICAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICAgICAgaWYgKChpPXpmQXBGaW5kU3RhKGRldiwgKHUxNl90Kilyc3ApKSAhPSAweGZmZmYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgemZSYXRlQ3RybFR4RmFpbEV2ZW50KGRldiwgJndkLT5hcC5zdGFUYWJsZVtpXS5yY0NlbGwsIDAsKHUzMl90KXpmUGh5Q3RybFRvUmF0ZShyZXRyeVJhdGUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICAgICAgICAgIHpmQXBTZW5kRmFpbHVyZShkZXYsIHJzcCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICAgICAgcmVzID0gemZTdGFGaW5kT3Bwb3NpdGVCeU1BQ0FkZHIoZGV2LCAodTE2X3QqKXJzcCwgJnBlZXJJZHgpOworICAgICAgICAgICAgaWYgKCByZXMgPT0gMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgemZSYXRlQ3RybFR4RmFpbEV2ZW50KGRldiwgJndkLT5zdGEub3Bwb3NpdGVJbmZvW3BlZXJJZHhdLnJjQ2VsbCwgMCwodTMyX3QpemZQaHlDdHJsVG9SYXRlKHJldHJ5UmF0ZSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgfQorICAgIH0gLy9lbHNlIGlmIChldmVudCA9PSAyKSAvL1R4IEZhaWwgZXZlbnQKKyAgICBlbHNlIGlmIChldmVudCA9PSAzKSAvL1R4IENvbXAgZXZlbnQKKyAgICB7CisgICAgICAgIHUzMl90IHJldHJ5UmF0ZTsKKworICAgICAgICByZXRyeVJhdGUgPSAodTMyX3QpKHJzcFs2XSkgKyAoKCh1MzJfdCkocnNwWzddKSk8PDgpCisgICAgICAgICAgICAgICAgKyAoKCh1MzJfdCkocnNwWzhdKSk8PDE2KSArICgoKHUzMl90KShyc3BbOV0pKTw8MjQpOworCisgICAgICAgIC8qIFRPRE8gOiBUeCBjb21wbGV0ZWQsIHVzZWQgZm9yIHJhdGUgY29udHJvbCBwcm9iaW5nICovCisgICAgICAgIGlmICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9BUCkKKyAgICAgICAgeworICAgICAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgIGlmICgoaT16ZkFwRmluZFN0YShkZXYsICh1MTZfdCopcnNwKSkgIT0gMHhmZmZmKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHpmUmF0ZUN0cmxUeFN1Y2Nlc3NFdmVudChkZXYsICZ3ZC0+YXAuc3RhVGFibGVbaV0ucmNDZWxsLCB6ZlBoeUN0cmxUb1JhdGUocmV0cnlSYXRlKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgIHJlcyA9IHpmU3RhRmluZE9wcG9zaXRlQnlNQUNBZGRyKGRldiwgKHUxNl90Kilyc3AsICZwZWVySWR4KTsKKyAgICAgICAgICAgIGlmICggcmVzID09IDAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHpmUmF0ZUN0cmxUeFN1Y2Nlc3NFdmVudChkZXYsICZ3ZC0+c3RhLm9wcG9zaXRlSW5mb1twZWVySWR4XS5yY0NlbGwsIHpmUGh5Q3RybFRvUmF0ZShyZXRyeVJhdGUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgIH0KKyAgICB9IC8vZWxzZSBpZiAoZXZlbnQgPT0gMykgLy9UeCBDb21wIGV2ZW50CisgICAgZWxzZSBpZiAoZXZlbnQgPT0gNCkgLy9CQSBmYWlsZWQgY291bnQKKyAgICB7CisgICAgICAgIHUzMl90IGZhaWw7CisgICAgICAgIHUzMl90IHJhdGU7CisgICAgICAgIHBlZXJJZHggPSAwOworCisgICAgICAgIGZhaWw9KCh1MzJfdCopcnNwKVswXSAmIDB4RkZGRjsKKyAgICAgICAgcmF0ZT0oKHUzMl90Kilyc3ApWzBdID4+IDE2OworCisgICAgICAgIGlmIChyYXRlID4gMTUpIHsKKyAgICAgICAgICAgIHJhdGUgPSAocmF0ZSAmIDB4RikgKyAxMiArIDI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICByYXRlID0gcmF0ZSArIDEyOworICAgICAgICB9CisKKyAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgemZSYXRlQ3RybFR4RmFpbEV2ZW50KGRldiwgJndkLT5zdGEub3Bwb3NpdGVJbmZvW3BlZXJJZHhdLnJjQ2VsbCwgKHU4X3QpcmF0ZSwgZmFpbCk7CisgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgfQorfQorCit2b2lkIHpmQmVhY29uQ2ZnSW50ZXJydXB0KHpkZXZfdCogZGV2LCB1OF90KiByc3ApCit7CisgICAgdTMyX3QgdHhCZWFjb25Db3VudGVyOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIGlmICggd2QtPndsYW5Nb2RlID09IFpNX01PREVfSUJTUyApCisgICAgeworICAgICAgICB0eEJlYWNvbkNvdW50ZXIgPSAqKCh1MzJfdCAqKXJzcCk7CisgICAgICAgIGlmICggd2QtPnN0YS5iZWFjb25UeENudCAhPSB0eEJlYWNvbkNvdW50ZXIgKQorICAgICAgICB7CisgICAgICAgICAgICB3ZC0+c3RhLnR4QmVhY29uSW5kID0gMTsKKworICAgICAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgIHdkLT50aWNrSWJzc1NlbmRCZWFjb24gPSAwOworICAgICAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHdkLT5zdGEudHhCZWFjb25JbmQgPSAwOworICAgICAgICB9CisKKyNpZmRlZiBaTV9FTkFCTEVfSUJTU19ERUxBWUVEX0pPSU5fSU5ESUNBVElPTgorICAgICAgICBpZiAoIHdkLT5zdGEudHhCZWFjb25JbmQgJiYgd2QtPnN0YS5pYnNzRGVsYXllZEluZCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh3ZC0+emZjYklic3NQYXJ0bmVyTm90aWZ5ICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2QtPnpmY2JJYnNzUGFydG5lck5vdGlmeShkZXYsIDEsICZ3ZC0+c3RhLmlic3NEZWxheWVkSW5kRXZlbnQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB3ZC0+c3RhLmlic3NEZWxheWVkSW5kID0gMDsKKyAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgd2QtPnN0YS5iZWFjb25UeENudCA9IHR4QmVhY29uQ291bnRlcjsKKworICAgICAgICAvLyBOZWVkIHRvIGNoZWNrIGlmIHRoZSB0aW1lIGlzIGV4cGlyZWQgYWZ0ZXIgQVRJTSB3aW5kb3c/PworCisgICAgICAgIC8vIENoZWNrIGlmIHdlIGhhdmUgYnVmZmVyZWQgYW55IGRhdGEgZm9yIHRob3NlIHN0YXRpb25zIHRoYXQgYXJlIHNsZWVwaW5nCisgICAgICAgIC8vIElmIGl0J3MgdHJ1ZSwgdGhlbiB0cmFuc21pdHRpbmcgQVRJTSBwa3QgdG8gbm90aWZ5IHRoZW0KKworI2lmZGVmIFpNX0VOQUJMRV9JQlNTX1BTCisgICAgICAgIC8vIFRPRE86IE5lZWQgdG8gY2hlY2sgaWYgdGhlIHN0YXRpb24gcmVjZWl2ZSBvdXIgQVRJTSBwa3Q/Pz8KKyAgICAgICAgemZTdGFJYnNzUFNTZW5kKGRldik7CisKKyAgICAgICAgaWYgKCB3ZC0+c3RhLmF0aW1XaW5kb3cgPT0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFdlIHdvbid0IHJlY2VpdmUgdGhlIGVuZCBvZiBBVElNIGlzciBzbyB3ZSBmYWtlIGl0CisgICAgICAgICAgICB6ZlBvd2VyU2F2aW5nTWdyQXRpbVdpbkV4cGlyZWQoZGV2KTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgfQorfQorCit2b2lkIHpmRW5kT2ZBdGltV2luZG93SW50ZXJydXB0KHpkZXZfdCogZGV2KQoreworI2lmZGVmIFpNX0VOQUJMRV9JQlNTX1BTCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgaWYgKCB3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9JQlNTICkKKyAgICB7CisgICAgICAgIC8vIFRyYW5zbWl0IGFueSBxdWV1ZWQgcGt0IGZvciB0aGUgc3RhdGlvbnMhIQorICAgICAgICB6ZlBvd2VyU2F2aW5nTWdyQXRpbVdpbkV4cGlyZWQoZGV2KTsKKyAgICB9CisjZW5kaWYKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9jaW5pdC5jIGIvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2Npbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWY4NTNjZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9jaW5pdC5jCkBAIC0wLDAgKzEsMTkxMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNy0yMDA4IEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZHVsZSBOYW1lIDogaW5pdC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQWJzdHJhY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBUaGlzIG1vZHVsZSBjb250YWlucyBpbml0IGZ1bmN0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTk9URVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBOb25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgImNwcmVjb21wLmgiCisjaW5jbHVkZSAiLi4vaGFsL2hwcmVnLmgiCisKK2V4dGVybiBjb25zdCB1OF90IHpjVXBUb0FjWzhdOworCit1MTZfdCB6Y0luZGV4dG9SYXRlQkdbMTZdID0gezEwMDAsIDIwMDAsIDU1MDAsIDExMDAwLCAwLCAwLCAwLCAwLCA0ODAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNDAwMCwgMTIwMDAsIDYwMDAsIDU0MDAwLCAzNjAwMCwgMTgwMDAsIDkwMDB9OwordTMyX3QgemNJbmRleHRvUmF0ZU4yMExbMTZdID0gezY1MDAsIDEzMDAwLCAxOTUwMCwgMjYwMDAsIDM5MDAwLCA1MjAwMCwgNTg1MDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2NTAwMCwgMTMwMDAsIDI2MDAwLCAzOTAwMCwgNTIwMDAsIDc4MDAwLCAxMDQwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMTcwMDAsIDEzMDAwMH07Cit1MzJfdCB6Y0luZGV4dG9SYXRlTjIwU1sxNl0gPSB7NzIwMCwgMTQ0MDAsIDIxNzAwLCAyODkwMCwgNDMzMDAsIDU3ODAwLCA2NTAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcyMjAwLCAxNDQwMCwgMjg5MDAsIDQzMzAwLCA1NzgwMCwgODY3MDAsIDExNTYwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEzMDAwMCwgMTQ0NDAwfTsKK3UzMl90IHpjSW5kZXh0b1JhdGVONDBMWzE2XSA9IHsxMzUwMCwgMjcwMDAsIDQwNTAwLCA1NDAwMCwgODEwMDAsIDEwODAwMCwgMTIxNTAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTM1MDAwLCAyNzAwMCwgNTQwMDAsIDgxMDAwLCAxMDgwMDAsIDE2MjAwMCwgMjE2MDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjQzMDAwLCAyNzAwMDB9OwordTMyX3QgemNJbmRleHRvUmF0ZU40MFNbMTZdID0gezE1MDAwLCAzMDAwMCwgNDUwMDAsIDYwMDAwLCA5MDAwMCwgMTIwMDAwLCAxMzUwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNTAwMDAsIDMwMDAwLCA2MDAwMCwgOTAwMDAsIDEyMDAwMCwgMTgwMDAwLCAyNDAwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNzAwMDAsIDMwMDAwMH07CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZlR4R2VuV2xhbkhlYWRlciAgICAgICAgICAgKi8KKy8qICAgICAgR2VuZXJhdGUgV0xBTiBNQUMgaGVhZGVyIGFuZCBMTEMgaGVhZGVyLiAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGJ1ZiA6IGJ1ZmZlciBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBpZCA6IEluZGV4IG9mIFR4RCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgcG9ydCA6IFdMQU4gcG9ydCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgbGVuZ3RoIG9mIHJlbW92ZWQgRXRoZXJuZXQgaGVhZGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiAgICAgICAgICAgICBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgIDIwMDUuNSAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UxNl90IHpmVHhHZW5XbGFuSGVhZGVyKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3QqIGhlYWRlciwgdTE2X3Qgc2VxLAorICAgICAgICAgICAgICAgICAgICAgICAgdThfdCBmbGFnLCB1MTZfdCBwbHVzTGVuLCB1MTZfdCBtaW51c0xlbiwgdTE2X3QgcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHUxNl90KiBkYSwgdTE2X3QqIHNhLCB1OF90IHVwLCB1MTZfdCAqbWljTGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgdTE2X3QqIHNuYXAsIHUxNl90IHNuYXBMZW4sIHN0cnVjdCBhZ2dDb250cm9sICphZ2dDb250cm9sKQoreworCisgICAgdTE2X3QgbGVuOworICAgIHUxNl90IG1hY0N0cmw7CisgICAgdTMyX3QgcGh5Q3RybDsKKyAgICB1MTZfdCBobGVuID0gMTY7CisgICAgdTE2X3QgaWN2TGVuID0gMDsKKyAgICB1MTZfdCB3ZHNQb3J0SWQ7CisgICAgdTE2X3QgdmFwID0gMDsKKyAgICB1MTZfdCBtY3MgPSAwOworICAgIHUxNl90IG10ID0gMDsKKyAgICB1OF90ICBxb3NUeXBlOworICAgIHU4X3QgIGIxLCBiMjsKKyAgICB1MTZfdCB3ZHNQb3J0OworICAgIHU4X3QgIGVuY0V4ZW1wdGlvbkFjdGlvblR5cGU7CisgICAgdTE2X3QgcmF0ZVByb2JpbmdGbGFnID0gMDsKKyAgICB1OF90ICB0a2lwRnJhbWVPZmZzZXQgPSAwOworCisjaWZkZWYgWk1fRU5BQkxFX0lCU1NfV1BBMlBTSworICAgIHU4X3QgICAgcmVzLCBwZWVySWR4OworICAgIHU4X3QgICAgdXNlcklkeD0wOworICAgIHUxNl90ICAgKml2MTY7CisgICAgdTMyX3QgICAqaXYzMjsKKyNlbmRpZgorCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAvKiBHZW5lcmF0ZSBXTEFOIGhlYWRlciAqLworICAgIC8qIEZyYW1lIGNvbnRyb2wgKi8KKyAgICBoZWFkZXJbNF0gPSAweDAwMDggfCAoZmxhZzw8OCk7CisgICAgLyogRHVyYXRpb24gKi8KKyAgICBoZWFkZXJbNV0gPSAweDAwMDA7CisKKyAgICBpZiAod2QtPndsYW5Nb2RlID09IFpNX01PREVfSU5GUkFTVFJVQ1RVUkUpCisgICAgeworICAgICAgICAvKiBUb0RTIGJpdCAqLworICAgICAgICBoZWFkZXJbNF0gfD0gMHgwMTAwOworCisgICAgICAgIC8qU29tZXRpbWVzIHdlIHdha2UgdXAgdG8gdHgvcnggYnV0IEFQIHN0aWxsIHRoaW5rIHdlIGFyZSBzbGVlcGluZywgc28gc3RpbGwgbmVlZCB0byBzZXQgdGhpcyBiaXQqLworICAgICAgICBpZiAoIHpmUG93ZXJTYXZpbmdNZ3JJc1NsZWVwaW5nKGRldikgfHwgd2QtPnN0YS5wc01nci50ZW1wV2FrZVVwID09IDEgKQorICAgICAgICB7CisgICAgICAgICAgICBoZWFkZXJbNF0gfD0gMHgxMDAwOworICAgICAgICB9CisKKyAgICAgICAgLyogQWRkcmVzcyAxID0gQlNTSUQgKi8KKyAgICAgICAgaGVhZGVyWzZdID0gd2QtPnN0YS5ic3NpZFswXTsKKyAgICAgICAgaGVhZGVyWzddID0gd2QtPnN0YS5ic3NpZFsxXTsKKyAgICAgICAgaGVhZGVyWzhdID0gd2QtPnN0YS5ic3NpZFsyXTsKKyAgICAgICAgLyogQWRkcmVzcyAzID0gREEgKi8KKyAgICAgICAgaGVhZGVyWzEyXSA9IGRhWzBdOworICAgICAgICBoZWFkZXJbMTNdID0gZGFbMV07CisgICAgICAgIGhlYWRlclsxNF0gPSBkYVsyXTsKKyAgICB9CisgICAgZWxzZSBpZiAod2QtPndsYW5Nb2RlID09IFpNX01PREVfUFNFVURPKQorICAgIHsKKyAgICAgICAgLyogQWRkcmVzcyAxID0gREEgKi8KKyAgICAgICAgaGVhZGVyWzZdID0gZGFbMF07CisgICAgICAgIGhlYWRlcls3XSA9IGRhWzFdOworICAgICAgICBoZWFkZXJbOF0gPSBkYVsyXTsKKyAgICAgICAgLyogQWRkcmVzcyAzID0gMDA6MDA6MDA6MDA6MDA6MDAgKi8KKyAgICAgICAgaGVhZGVyWzEyXSA9IDA7CisgICAgICAgIGhlYWRlclsxM10gPSAwOworICAgICAgICBoZWFkZXJbMTRdID0gMDsKKworICAgICAgICAvKiBQU0VVRE8gdGVzdCA6IFdEUyAqLworICAgICAgICBpZiAod2QtPmVuYWJsZVdEUykKKyAgICAgICAgeworICAgICAgICAgICAgLyogVG9EUyBhbmQgRnJvbURTIGJpdCAqLworICAgICAgICAgICAgaGVhZGVyWzRdIHw9IDB4MDMwMDsKKworICAgICAgICAgICAgLyogQWRkcmVzcyA0ID0gU0EgKi8KKyAgICAgICAgICAgIGhlYWRlclsxNl0gPSAwOworICAgICAgICAgICAgaGVhZGVyWzE3XSA9IDA7CisgICAgICAgICAgICBoZWFkZXJbMThdID0gMDsKKworICAgICAgICAgICAgaGxlbiA9IDE5OworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0lCU1MpCisgICAgeworICAgICAgICAvKiBBZGRyZXNzIDEgPSBEQSAqLworICAgICAgICBoZWFkZXJbNl0gPSBkYVswXTsKKyAgICAgICAgaGVhZGVyWzddID0gZGFbMV07CisgICAgICAgIGhlYWRlcls4XSA9IGRhWzJdOworICAgICAgICAvKiBBZGRyZXNzIDMgPSBCU1NJRCAqLworICAgICAgICBoZWFkZXJbMTJdID0gd2QtPnN0YS5ic3NpZFswXTsKKyAgICAgICAgaGVhZGVyWzEzXSA9IHdkLT5zdGEuYnNzaWRbMV07CisgICAgICAgIGhlYWRlclsxNF0gPSB3ZC0+c3RhLmJzc2lkWzJdOworCisjaWZkZWYgWk1fRU5BQkxFX0lCU1NfV1BBMlBTSworICAgICAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICByZXMgPSB6ZlN0YUZpbmRPcHBvc2l0ZUJ5TUFDQWRkcihkZXYsIGRhLCAmcGVlcklkeCk7CisgICAgICAgIGlmKHJlcyA9PSAwKSAvLyBGaW5kIG9wcG9zaXRlIGluIG91ciBPcHBvc2l0ZUluZm8gU3RydWN0dXJlICEKKyAgICAgICAgeworICAgICAgICAgICAgdXNlcklkeCA9IHBlZXJJZHg7CisgICAgICAgIH0KKyAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyNlbmRpZgorICAgIH0KKyAgICBlbHNlIGlmICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9BUCkKKyAgICB7CisgICAgICAgIGlmIChwb3J0IDwgMHgyMCkKKyAgICAgICAgLyogQVAgbW9kZSAqLworICAgICAgICB7CisgICAgICAgICAgICAvKiBGcm9tRFMgYml0ICovCisgICAgICAgICAgICBoZWFkZXJbNF0gfD0gMHgwMjAwOworCisgICAgICAgICAgICAvKiBBZGRyZXNzIDEgPSBEQSAqLworICAgICAgICAgICAgaGVhZGVyWzZdID0gZGFbMF07CisgICAgICAgICAgICBoZWFkZXJbN10gPSBkYVsxXTsKKyAgICAgICAgICAgIGhlYWRlcls4XSA9IGRhWzJdOworICAgICAgICAgICAgLyogQWRkcmVzcyAzID0gU0EgKi8KKyAgICAgICAgICAgIGhlYWRlclsxMl0gPSBzYVswXTsKKyAgICAgICAgICAgIGhlYWRlclsxM10gPSBzYVsxXTsKKyAgICAgICAgICAgIGhlYWRlclsxNF0gPSBzYVsyXTsKKworICAgICAgICAgICAgaWYgKHBvcnQgPCBaTV9NQVhfQVBfU1VQUE9SVCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXAgPSBwb3J0OworICAgICAgICAgICAgICAgIGhlYWRlclsxNF0gKz0gKHZhcDw8OCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAvKiBXRFMgcG9ydCAqLworICAgICAgICB7CisgICAgICAgICAgICAvKiBUb0RTIGFuZCBGcm9tRFMgYml0ICovCisgICAgICAgICAgICBoZWFkZXJbNF0gfD0gMHgwMzAwOworCisgICAgICAgICAgICB3ZHNQb3J0SWQgPSBwb3J0IC0gMHgyMDsKKworICAgICAgICAgICAgLyogQWRkcmVzcyAxID0gUkEgKi8KKyAgICAgICAgICAgIGhlYWRlcls2XSA9IHdkLT5hcC53ZHMubWFjQWRkclt3ZHNQb3J0SWRdWzBdOworICAgICAgICAgICAgaGVhZGVyWzddID0gd2QtPmFwLndkcy5tYWNBZGRyW3dkc1BvcnRJZF1bMV07CisgICAgICAgICAgICBoZWFkZXJbOF0gPSB3ZC0+YXAud2RzLm1hY0FkZHJbd2RzUG9ydElkXVsyXTsKKyAgICAgICAgICAgIC8qIEFkZHJlc3MgMyA9IERBICovCisgICAgICAgICAgICBoZWFkZXJbMTJdID0gZGFbMF07CisgICAgICAgICAgICBoZWFkZXJbMTNdID0gZGFbMV07CisgICAgICAgICAgICBoZWFkZXJbMTRdID0gZGFbMl07CisgICAgICAgICAgICAvKiBBZGRyZXNzIDQgPSBTQSAqLworICAgICAgICAgICAgaGVhZGVyWzE2XSA9IHNhWzBdOworICAgICAgICAgICAgaGVhZGVyWzE3XSA9IHNhWzFdOworICAgICAgICAgICAgaGVhZGVyWzE4XSA9IHNhWzJdOworCisgICAgICAgICAgICBobGVuID0gMTk7CisgICAgICAgIH0KKyAgICB9IC8qIGVsc2UgaWYgKHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0FQKSAqLworCisgICAgLyogQWRkcmVzcyAyID0gVEEgKi8KKyAgICBoZWFkZXJbOV0gPSB3ZC0+bWFjQWRkclswXTsKKyAgICBoZWFkZXJbMTBdID0gd2QtPm1hY0FkZHJbMV07CisjaWZkZWYgWk1fVkFQTU9ERV9NVUxUSUxFX1NTSUQKKyAgICBoZWFkZXJbMTFdID0gd2QtPm1hY0FkZHJbMl07IC8vTXVsdGlwbGUgU1NJRAorI2Vsc2UKKyAgICBoZWFkZXJbMTFdID0gd2QtPm1hY0FkZHJbMl0gKyAodmFwPDw4KTsgLy9WQVAKKyNlbmRpZgorCisgICAgaWYgKCAod2QtPndsYW5Nb2RlID09IFpNX01PREVfSUJTUykgJiYgKHdkLT5YTGlua01vZGUpICkKKyAgICB7CisgICAgICAgIGhlYWRlcls5XSAgPSBzYVswXTsKKyAgICAgICAgaGVhZGVyWzEwXSA9IHNhWzFdOworICAgICAgICBoZWFkZXJbMTFdID0gc2FbMl07CisgICAgfQorCisgICAgLyogU2VxdWVuY2UgQ29udHJvbCAqLworICAgIGhlYWRlclsxNV0gPSBzZXE7CisKKworICAgIGlmICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9BUCkKKyAgICB7CisgICAgICAgIHpmQXBHZXRTdGFUeFJhdGVBbmRRb3NUeXBlKGRldiwgZGEsICZwaHlDdHJsLCAmcW9zVHlwZSwgJnJhdGVQcm9iaW5nRmxhZyk7CisgICAgICAgIG10ID0gKHUxNl90KShwaHlDdHJsICYgMHgzKTsKKyAgICAgICAgbWNzID0gKHUxNl90KSgocGh5Q3RybCA+PiAxNikgJiAweDNmKTsKKyNpZiAxCisgICAgICAgIC8vemZBcEdldFN0YVFvc1R5cGUoZGV2LCBkYSwgJnFvc1R5cGUpOworCisgICAgICAgIC8qIGlmIERBID09IFdNRSBTVEEgKi8KKyAgICAgICAgaWYgKHFvc1R5cGUgPT0gMSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogUW9TIGRhdGEgKi8KKyAgICAgICAgICAgIGhlYWRlcls0XSB8PSAweDAwODA7CisKKyAgICAgICAgICAgIC8qIFFvUyBDb250cm9sICovCisgICAgICAgICAgICBoZWFkZXJbaGxlbl0gPSB1cDsKKyAgICAgICAgICAgIGhsZW4gKz0gMTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgfQorCisjaWYgMAorICAgIC8vQUdHIFRlc3QgQ29kZQorICAgIGlmIChoZWFkZXJbNl0gPT0gMHg4MDAwKQorICAgIHsKKyAgICAgICAgLyogUW9TIGRhdGEgKi8KKyAgICAgICAgaGVhZGVyWzRdIHw9IDB4MDA4MDsKKworICAgICAgICAvKiBRb1MgQ29udHJvbCAqLworICAgICAgICBoZWFkZXJbaGxlbl0gPSAwOworICAgICAgICBobGVuICs9IDE7CisgICAgfQorI2VuZGlmCisKKyAgICBpZiAod2QtPndsYW5Nb2RlID09IFpNX01PREVfQVApIHsKKyAgICAgICAgLyogVG9kbzogcmF0ZSBjb250cm9sIGhlcmUgZm9yIHFvcyBmaWVsZCAqLworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgLyogUmF0ZSBjb250cm9sICovCisgICAgICAgIHpmU3RhR2V0VHhSYXRlKGRldiwgZGEsICZwaHlDdHJsLCAmcmF0ZVByb2JpbmdGbGFnKTsKKyAgICAgICAgbXQgPSAodTE2X3QpKHBoeUN0cmwgJiAweDMpOworICAgICAgICBtY3MgPSAodTE2X3QpKChwaHlDdHJsID4+IDE2KSAmIDB4M2YpOworICAgIH0KKworICAgIGlmICh3ZC0+dHhNQ1MgIT0gMHhmZikKKyAgICB7CisgICAgICAgIC8qIGZpeGVkIHJhdGUgKi8KKwkgICAgcGh5Q3RybCA9ICgodTMyX3Qpd2QtPnR4TUNTPDwxNikgKyB3ZC0+dHhNVDsKKyAgICAgICAgbWNzID0gd2QtPnR4TUNTOworICAgICAgICBtdCA9IHdkLT50eE1UOworICAgIH0KKworICAgIGlmICh3ZC0+ZW5hYmxlQWdncmVnYXRpb24pCisgICAgeworICAgICAgICAvKiBmb3JjZSBlbmFibGUgYWdncmVnYXRpb24gKi8KKyAgICAgICAgaWYgKHdkLT5lbmFibGVBZ2dyZWdhdGlvbj09MiAmJiAhKGhlYWRlcls2XSYweDEpKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBRb1MgZGF0YSAqLworICAgICAgICAgICAgaGVhZGVyWzRdIHw9IDB4MDA4MDsKKworICAgICAgICAgICAgLyogUW9TIENvbnRyb2wgKi8KKyAgICAgICAgICAgIGhlYWRlcltobGVuXSA9IDA7CisgICAgICAgICAgICBobGVuICs9IDE7CisgICAgICAgIH0KKyAgICAgICAgLyogaWYgd2QtPmVuYWJsZUFnZ3JlZ2F0aW9uPTEgPT4gZm9yY2UgZGlzYWJsZSAqLworICAgICAgICAvKiBpZiB3ZC0+ZW5hYmxlQWdncmVnYXRpb249MCA9PiBhdXRvICovCisgICAgfQorCisjaWZkZWYgWk1fRU5BQkxFX0FHR1JFR0FUSU9OCisgICAgLyoKKyAgICAgKiBhZ2dyZWdhdGlvbiBjb250cm9sCisgICAgICovCisKKyAgICAvKgorICAgICAqIFFvUyBkYXRhCisgICAgICovCisgICAgaWYgKHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0FQKSB7CisgICAgICAgIGlmIChhZ2dDb250cm9sICYmIG10ID09IDIpIHsKKyAgICAgICAgICAgIGlmICh3ZC0+ZW5hYmxlQWdncmVnYXRpb249PTAgJiYgIShoZWFkZXJbNl0mMHgxKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBoZWFkZXJbNF0gfD0gMHgwMDgwOworCisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBRb1MgQ29udHJvbAorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGhlYWRlcltobGVuXSA9IDA7CisgICAgICAgICAgICAgICAgaGxlbiArPSAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorI2VuZGlmCisKKyAgICAvLyBNU0RVIExlbmd0aAorICAgIGxlbiA9IHpmd0J1ZkdldFNpemUoZGV2LCBidWYpOworCisgICAgLyogR2VuZXJhdGUgY29udHJvbCBzZXR0aW5nICovCisgICAgLyogQmFja29mZiwgTm9uLUJ1cnN0IGFuZCBoYXJkd2FyZSBkdXJhdGlvbiAqLworICAgIG1hY0N0cmwgPSAweDIwODsKKworICAgIC8qIEFDSyAqLworICAgIGlmICgoaGVhZGVyWzZdICYgMHgxKSA9PSAweDEpCisgICAgeworICAgICAgICAvKiBtdWx0aWNhc3QgZnJhbWUgOiBTZXQgTk8tQUNLIGJpdCAqLworICAgICAgICBtYWNDdHJsIHw9IDB4NDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogdW5pY2FzdCBmcmFtZSAqLworICAgICNpZiAwCisgICAgICAgIC8vIEVuYWJsZSBSVFMgYWNjb3JkaW5nIHRvIE1QRFUgTGVuZ3RocyAoIG5vdCBNU0RVIExlbmd0aHMgKQorICAgICAgICBpZiAobGVuID49IHdkLT5ydHNUaHJlc2hvbGQpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIEVuYWJsZSBSVFMgKi8KKyAgICAgICAgICAgIG1hY0N0cmwgfD0gMTsKKyAgICAgICAgfQorICAgICNlbmRpZgorICAgIH0KKyAgICAvKiBWQVAgdGVzdCBjb2RlICovCisgICAgLy9tYWNDdHJsIHw9IDB4NDsKKworICAgIGlmICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9BUCkKKyAgICB7CisgICAgICAgIHU4X3QgZW5jcnlUeXBlOworICAgICAgICB1MTZfdCBpdjE2OworICAgICAgICB1MzJfdCBpdjMyOworCisgICAgICAgIC8qIENoZWNrIHdoZXRoZXIgdGhpcyBpcyBhIG11bHRpY2FzdCBmcmFtZSAqLworICAgICAgICBpZiAoKGhlYWRlcls2XSAmIDB4MSkgPT0gMHgxKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBtdWx0aWNhc3QgZnJhbWUgKi8KKyAgICAgICAgICAgIGlmICh3ZC0+YXAuZW5jcnlNb2RlW3ZhcF0gPT0gWk1fVEtJUCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3ZC0+YXAuaXYxNlt2YXBdKys7CisKKyAgICAgICAgICAgICAgICBpZih3ZC0+YXAuaXYxNlt2YXBdID09IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB3ZC0+YXAuaXYzMlt2YXBdKys7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYjEgPSAodThfdCkgKHdkLT5hcC5pdjE2W3ZhcF0gPj4gOCk7CisgICAgICAgICAgICAgICAgYjIgPSAoYjEgfCAweDIwKSAmIDB4N2Y7CisgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW5dID0gKCh1MTZfdCliMiA8PCA4KSArIGIxOworICAgICAgICAgICAgICAgIGIxID0gKHU4X3QpIHdkLT5hcC5pdjE2W3ZhcF07CisgICAgICAgICAgICAgICAgYjIgPSAweDIwIHwgKHdkLT5hcC5iY0tleUluZGV4W3ZhcF0gPDwgNik7CisgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW4rMV0gPSAoKHUxNl90KWIyIDw8IDgpICsgYjE7CisgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW4rMl0gPSAodTE2X3QpIHdkLT5hcC5pdjMyW3ZhcF07CisgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW4rM10gPSAodTE2X3QpICh3ZC0+YXAuaXYzMlt2YXBdID4+IDE2KTsKKworICAgICAgICAgICAgICAgIC8vbWFjQ3RybCB8PSAweDgwOworICAgICAgICAgICAgICAgIG1hY0N0cmwgfD0gMHg0MDsKKyAgICAgICAgICAgICAgICBpY3ZMZW4gPSA0OworCisgICAgICAgICAgICAgICAgLyogc2V0IGhhcmR3YXJlIE1JQyAqLworICAgICAgICAgICAgICAgIGlmICggKCEoc2VxICYgMHhmKSkmJighKGZsYWcgJiAweDQpKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBtYWNDdHJsIHw9IDB4MTAwOworICAgICAgICAgICAgICAgICAgICBwbHVzTGVuICs9IDg7CisgICAgICAgICAgICAgICAgICAgICptaWNMZW4gPSA4OworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGhlYWRlcls0XSB8PSAweDQwMDA7CisgICAgICAgICAgICAgICAgaGxlbiArPSA0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAod2QtPmFwLmVuY3J5TW9kZVt2YXBdID09IFpNX0FFUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3ZC0+YXAuaXYxNlt2YXBdKys7CisKKyAgICAgICAgICAgICAgICBpZih3ZC0+YXAuaXYxNlt2YXBdID09IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB3ZC0+YXAuaXYzMlt2YXBdKys7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYjEgPSAodThfdCkgd2QtPmFwLml2MTZbdmFwXTsKKyAgICAgICAgICAgICAgICBiMiA9ICh1OF90KSAod2QtPmFwLml2MTZbdmFwXSA+PiA4KTsKKyAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbl0gPSAoKHUxNl90KWIyIDw8IDgpICsgYjE7CisgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW4rMV0gPSAweDIwMDAgfCAod2QtPmFwLmJjS2V5SW5kZXhbdmFwXSA8PCAxNCk7CisgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW4rMl0gPSAodTE2X3QpICh3ZC0+YXAuaXYzMlt2YXBdKTsKKyAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbiszXSA9ICh1MTZfdCkgKHdkLT5hcC5pdjMyW3ZhcF0gPj4gMTYpOworCisgICAgICAgICAgICAgICAgbWFjQ3RybCB8PSAweGMwOworICAgICAgICAgICAgICAgIGljdkxlbiA9IDg7ICAvKiBNSUMgKi8KKworICAgICAgICAgICAgICAgIGhlYWRlcls0XSB8PSAweDQwMDA7CisgICAgICAgICAgICAgICAgaGxlbiArPSA0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgI2lmZGVmIFpNX0VOQUJMRV9DRU5DCisgICAgICAgICAgICBlbHNlIGlmICh3ZC0+YXAuZW5jcnlNb2RlW3ZhcF0gPT0gWk1fQ0VOQykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvL3UzMl90IHR4aXZbNF07CisKKyAgICAgICAgICAgICAgICB3ZC0+YXAudHhpdlt2YXBdWzBdKys7CisKKyAgICAgICAgICAgICAgICBpZiAod2QtPmFwLnR4aXZbdmFwXVswXSA9PSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgd2QtPmFwLnR4aXZbdmFwXVsxXSsrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh3ZC0+YXAudHhpdlt2YXBdWzFdID09IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB3ZC0+YXAudHhpdlt2YXBdWzJdKys7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHdkLT5hcC50eGl2W3ZhcF1bMl0gPT0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHdkLT5hcC50eGl2W3ZhcF1bM10rKzsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAod2QtPmFwLnR4aXZbdmFwXVszXSA9PSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgd2QtPmFwLnR4aXZbdmFwXVswXSA9IDA7CisgICAgICAgICAgICAgICAgICAgIHdkLT5hcC50eGl2W3ZhcF1bMV0gPSAwOworICAgICAgICAgICAgICAgICAgICB3ZC0+YXAudHhpdlt2YXBdWzJdID0gMDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbl0gPSAod2QtPmFwLmJjS2V5SW5kZXhbdmFwXSAmIDB4MDAwMSk7ICAgIC8qIEZvciBLZXkgSWQgYW5kIHJlc2VydmVkIGZpZWxkICovCisgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW4rMV0gPSAodTE2X3Qpd2QtPmFwLnR4aXZbdmFwXVswXTsKKyAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbisyXSA9ICh1MTZfdCkod2QtPmFwLnR4aXZbdmFwXVswXSA+PiAxNik7CisgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW4rM10gPSAodTE2X3Qpd2QtPmFwLnR4aXZbdmFwXVsxXTsKKyAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbis0XSA9ICh1MTZfdCkod2QtPmFwLnR4aXZbdmFwXVsxXSA+PiAxNik7CisgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW4rNV0gPSAodTE2X3Qpd2QtPmFwLnR4aXZbdmFwXVsyXTsKKyAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbis2XSA9ICh1MTZfdCkod2QtPmFwLnR4aXZbdmFwXVsyXSA+PiAxNik7CisgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW4rN10gPSAodTE2X3Qpd2QtPmFwLnR4aXZbdmFwXVszXTsKKyAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbis4XSA9ICh1MTZfdCkod2QtPmFwLnR4aXZbdmFwXVszXSA+PiAxNik7CisKKyAgICAgICAgICAgICAgICBtYWNDdHJsIHw9IDB4ODA7CisgICAgICAgICAgICAgICAgaWN2TGVuID0gMTY7ICAvKiBNSUMgKi8KKworICAgICAgICAgICAgICAgIGhlYWRlcls0XSB8PSAweDQwMDA7CisgICAgICAgICAgICAgICAgaGxlbiArPSA5OworICAgICAgICAgICAgfQorICAgICAgICAgICAgI2VuZGlmIC8vWk1fRU5BQkxFX0NFTkMKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIEdldCBTVEEncyBlbmNyeXB0aW9uIHR5cGUgKi8KKyAgICAgICAgICAgIHpmQXBHZXRTdGFFbmNyeVR5cGUoZGV2LCBkYSwgJmVuY3J5VHlwZSk7CisKKyAgICAgICAgICAgIGlmIChlbmNyeVR5cGUgPT0gWk1fVEtJUCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBHZXQgaXYxNiBhbmQgaXYzMiAqLworICAgICAgICAgICAgICAgIHpmQXBHZXRTdGFXcGFJdihkZXYsIGRhLCAmaXYxNiwgJml2MzIpOworCisgICAgICAgICAgICAgICAgaXYxNisrOworICAgICAgICAgICAgICAgIGlmIChpdjE2ID09IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpdjMyKys7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYjEgPSAodThfdCkgKGl2MTYgPj4gOCk7CisgICAgICAgICAgICAgICAgYjIgPSAoYjEgfCAweDIwKSAmIDB4N2Y7CisgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW5dID0gKCh1MTZfdCliMiA8PCA4KSArIGIxOworICAgICAgICAgICAgICAgIGIxID0gKHU4X3QpIGl2MTY7CisgICAgICAgICAgICAgICAgYjIgPSAweDIwOworICAgICAgICAgICAgICAgIGhlYWRlcltobGVuKzFdID0gKCh1MTZfdCliMiA8PCA4KSArIGIxOworICAgICAgICAgICAgICAgIGhlYWRlcltobGVuKzJdID0gKHUxNl90KSBpdjMyOworICAgICAgICAgICAgICAgIGhlYWRlcltobGVuKzNdID0gKHUxNl90KSAoaXYzMiA+PiAxNik7CisKKyAgICAgICAgICAgICAgICAvL21hY0N0cmwgfD0gMHg4MDsKKyAgICAgICAgICAgICAgICBtYWNDdHJsIHw9IDB4NDA7CisgICAgICAgICAgICAgICAgaWN2TGVuID0gNDsKKworICAgICAgICAgICAgICAgIC8qIHNldCBoYXJkd2FyZSBNSUMgKi8KKyAgICAgICAgICAgICAgICBpZiAoICghKHNlcSAmIDB4ZikpJiYoIShmbGFnICYgMHg0KSkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbWFjQ3RybCB8PSAweDEwMDsKKyAgICAgICAgICAgICAgICAgICAgcGx1c0xlbiArPSA4OworICAgICAgICAgICAgICAgICAgICAqbWljTGVuID0gODsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBoZWFkZXJbNF0gfD0gMHg0MDAwOworICAgICAgICAgICAgICAgIGhsZW4gKz0gNDsKKworICAgICAgICAgICAgICAgIC8qIFNldCBpdjE2IGFuZCBpdjMyICovCisgICAgICAgICAgICAgICAgemZBcFNldFN0YVdwYUl2KGRldiwgZGEsIGl2MTYsIGl2MzIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoZW5jcnlUeXBlID09IFpNX0FFUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBHZXQgaXYxNiBhbmQgaXYzMiAqLworICAgICAgICAgICAgICAgIHpmQXBHZXRTdGFXcGFJdihkZXYsIGRhLCAmaXYxNiwgJml2MzIpOworCisgICAgICAgICAgICAgICAgaXYxNisrOworICAgICAgICAgICAgICAgIGlmIChpdjE2ID09IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpdjMyKys7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYjEgPSAodThfdCkgaXYxNjsKKyAgICAgICAgICAgICAgICBiMiA9ICh1OF90KSAoaXYxNiA+PiA4KTsKKyAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbl0gPSAoKHUxNl90KWIyIDw8IDgpICsgYjE7CisgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW4rMV0gPSAweDIwMDA7CisgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW4rMl0gPSAodTE2X3QpIChpdjMyKTsKKyAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbiszXSA9ICh1MTZfdCkgKGl2MzIgPj4gMTYpOworCisgICAgICAgICAgICAgICAgbWFjQ3RybCB8PSAweGMwOworICAgICAgICAgICAgICAgIGljdkxlbiA9IDg7ICAvKiBNSUMgKi8KKworICAgICAgICAgICAgICAgIGhlYWRlcls0XSB8PSAweDQwMDA7CisgICAgICAgICAgICAgICAgaGxlbiArPSA0OworCisgICAgICAgICAgICAgICAgLyogU2V0IGl2MTYgYW5kIGl2MzIgKi8KKyAgICAgICAgICAgICAgICB6ZkFwU2V0U3RhV3BhSXYoZGV2LCBkYSwgaXYxNiwgaXYzMik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAjaWZkZWYgWk1fRU5BQkxFX0NFTkMKKyAgICAgICAgICAgIGVsc2UgaWYgKGVuY3J5VHlwZSA9PSBaTV9DRU5DKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHUzMl90IHR4aXZbNF07CisgICAgICAgICAgICAgICAgdThfdCBrZXlJZHg7CisKKyAgICAgICAgICAgICAgICAvKiBHZXQgQ0VOQyBUeElWICovCisgICAgICAgICAgICAgICAgemZBcEdldFN0YUNlbmNJdkFuZEtleUlkeChkZXYsIGRhLCB0eGl2LCAma2V5SWR4KTsKKworICAgICAgICAgICAgICAgIHR4aXZbMF0gKz0gMjsKKworICAgICAgICAgICAgICAgIGlmICh0eGl2WzBdID09IDAgfHwgdHhpdlswXSA9PSAxKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdHhpdlsxXSsrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0eGl2WzFdID09IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0eGl2WzJdKys7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHR4aXZbMl0gPT0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHR4aXZbM10rKzsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodHhpdlszXSA9PSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdHhpdlswXSA9IDA7CisgICAgICAgICAgICAgICAgICAgIHR4aXZbMV0gPSAwOworICAgICAgICAgICAgICAgICAgICB0eGl2WzJdID0gMDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbl0gPSAoa2V5SWR4ICYgMHgwMDAxKTsgICAgLyogRm9yIEtleSBJZCBhbmQgcmVzZXJ2ZWQgZmllbGQgKi8KKyAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbisxXSA9ICh1MTZfdCl0eGl2WzBdOworICAgICAgICAgICAgICAgIGhlYWRlcltobGVuKzJdID0gKHUxNl90KSh0eGl2WzBdID4+IDE2KTsKKyAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbiszXSA9ICh1MTZfdCl0eGl2WzFdOworICAgICAgICAgICAgICAgIGhlYWRlcltobGVuKzRdID0gKHUxNl90KSh0eGl2WzFdID4+IDE2KTsKKyAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbis1XSA9ICh1MTZfdCl0eGl2WzJdOworICAgICAgICAgICAgICAgIGhlYWRlcltobGVuKzZdID0gKHUxNl90KSh0eGl2WzJdID4+IDE2KTsKKyAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbis3XSA9ICh1MTZfdCl0eGl2WzNdOworICAgICAgICAgICAgICAgIGhlYWRlcltobGVuKzhdID0gKHUxNl90KSh0eGl2WzNdID4+IDE2KTsKKworICAgICAgICAgICAgICAgIG1hY0N0cmwgfD0gMHg4MDsKKyAgICAgICAgICAgICAgICBpY3ZMZW4gPSAxNjsgIC8qIE1JQyAqLworCisgICAgICAgICAgICAgICAgaGVhZGVyWzRdIHw9IDB4NDAwMDsKKyAgICAgICAgICAgICAgICBobGVuICs9IDk7CisKKyAgICAgICAgICAgICAgICAvKiBTZXQgQ0VOQyBJViAqLworICAgICAgICAgICAgICAgIHpmQXBTZXRTdGFDZW5jSXYoZGV2LCBkYSwgdHhpdik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAjZW5kaWYgLy9aTV9FTkFCTEVfQ0VOQworICAgICAgICB9CisKKyAgICAgICAgLyogcHJvdGVjdGlvbiBtb2RlICovCisgICAgICAgIGlmICh3ZC0+YXAucHJvdGVjdGlvbk1vZGUgPT0gMSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogRW5hYmxlIFNlbGYtQ1RTICovCisgICAgICAgICAgICBtYWNDdHJsICY9IDB4RkZGQzsKKyAgICAgICAgICAgIG1hY0N0cmwgfD0gMjsKKyAgICAgICAgfQorCisgICAgICAgIC8qIFJhdGUgQ29udHJvbCAqLworICAgICAgICBpZiAocG9ydCA8IDB4MjApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIEFQICovCisgICAgICAgICAgICAvKiBJViAqLworICAgICAgICAgICAgaWYgKCh3ZC0+YXAuZW5jcnlNb2RlW3ZhcF0gPT0gWk1fV0VQNjQpIHx8CisgICAgICAgICAgICAgICAgICAgICh3ZC0+YXAuZW5jcnlNb2RlW3ZhcF0gPT0gWk1fV0VQMTI4KSB8fAorICAgICAgICAgICAgICAgICAgICAod2QtPmFwLmVuY3J5TW9kZVt2YXBdID09IFpNX1dFUDI1NikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaGVhZGVyWzRdIHw9IDB4NDAwMDsKKyAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbl0gPSAweDA7ICAgLy9JVgorICAgICAgICAgICAgICAgIGhlYWRlcltobGVuKzFdID0gd2QtPmFwLmJjS2V5SW5kZXhbdmFwXSA8PCAxNDsgLy9JViB3aXRoIEtleWlkLS1DV1lhbmcobSkKKyAgICAgICAgICAgICAgICBobGVuICs9IDI7CisgICAgICAgICAgICAgICAgaWN2TGVuID0gNDsKKyAgICAgICAgICAgICAgICBtYWNDdHJsIHw9IDB4NDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvKiBXRFMgKi8KKworICAgICAgICAgICAgLyogVE9ETyA6IEZpeGVkIHJhdGUgdG8gNTRNICovCisgICAgICAgICAgICBwaHlDdHJsID0gMHhjMDAwMTsgICAvL1BIWSBjb250cm9sIEwKKworICAgICAgICAgICAgLyogV0RTIHBvcnQgY2hlY2tpbmcgKi8KKyAgICAgICAgICAgIGlmICgod2RzUG9ydCA9IChwb3J0IC0gMHgyMCkpID49IFpNX01BWF9XRFNfU1VQUE9SVCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3ZHNQb3J0ID0gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgI2lmIDEKKyAgICAgICAgICAgIC8qIElWICovCisgICAgICAgICAgICBzd2l0Y2ggKHdkLT5hcC53ZHMuZW5jcnlNb2RlW3dkc1BvcnRdKQorICAgICAgICAgICAgeworICAgICAgICAgICAgY2FzZSBaTV9XRVA2NDoKKyAgICAgICAgICAgIGNhc2UgWk1fV0VQMTI4OgorICAgICAgICAgICAgY2FzZSBaTV9XRVAyNTY6CisgICAgICAgICAgICAgICAgICAgIGhlYWRlcls0XSB8PSAweDQwMDA7CisgICAgICAgICAgICAgICAgICAgIGhlYWRlcltobGVuXSA9IDB4MDsgICAvL0lWCisgICAgICAgICAgICAgICAgICAgIGhlYWRlcltobGVuKzFdID0gd2QtPmFwLmJjS2V5SW5kZXhbdmFwXSA8PCAxNDsgLy9JViB3aXRoIEtleWlkCisgICAgICAgICAgICAgICAgICAgIGhsZW4gKz0gMjsKKyAgICAgICAgICAgICAgICAgICAgaWN2TGVuID0gNDsKKyAgICAgICAgICAgICAgICAgICAgbWFjQ3RybCB8PSAweDQwOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBaTV9US0lQOgorICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLml2MTYrKzsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIHdkLT5zdGEuaXYxNiA9PSAwICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5pdjMyKys7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBiMSA9ICh1OF90KSAod2QtPnN0YS5pdjE2ID4+IDgpOworICAgICAgICAgICAgICAgICAgICBiMiA9IChiMSB8IDB4MjApICYgMHg3ZjsKKyAgICAgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW5dID0gKCh1MTZfdCliMiA8PCA4KSArIGIxOworICAgICAgICAgICAgICAgICAgICBiMSA9ICh1OF90KSB3ZC0+c3RhLml2MTY7CisgICAgICAgICAgICAgICAgICAgIGIyID0gMHgyMDsKKyAgICAgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW4rMV0gPSAoKHUxNl90KWIyIDw8IDgpICsgYjE7CisgICAgICAgICAgICAgICAgICAgIGhlYWRlcltobGVuKzJdID0gKHUxNl90KSB3ZC0+c3RhLml2MzI7CisgICAgICAgICAgICAgICAgICAgIGhlYWRlcltobGVuKzNdID0gKHUxNl90KSAod2QtPnN0YS5pdjMyID4+IDE2KTsKKworICAgICAgICAgICAgICAgICAgICAvL21hY0N0cmwgfD0gMHg4MDsKKyAgICAgICAgICAgICAgICAgICAgbWFjQ3RybCB8PSAweDQwOworICAgICAgICAgICAgICAgICAgICBpY3ZMZW4gPSA0OworCisgICAgICAgICAgICAgICAgICAgIC8qIHNldCBoYXJkd2FyZSBNSUMgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKCAoIShzZXEgJiAweGYpKSYmKCEoZmxhZyAmIDB4NCkpICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgbWFjQ3RybCB8PSAweDEwMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBsdXNMZW4gKz0gODsKKyAgICAgICAgICAgICAgICAgICAgICAgICptaWNMZW4gPSA4OworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaGVhZGVyWzRdIHw9IDB4NDAwMDsKKyAgICAgICAgICAgICAgICAgICAgaGxlbiArPSA0OworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBaTV9BRVM6CisgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEuaXYxNisrOworICAgICAgICAgICAgICAgICAgICBpZiAoIHdkLT5zdGEuaXYxNiA9PSAwICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5pdjMyKys7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBiMSA9ICh1OF90KSB3ZC0+c3RhLml2MTY7CisgICAgICAgICAgICAgICAgICAgIGIyID0gKHU4X3QpICh3ZC0+c3RhLml2MTYgPj4gOCk7CisgICAgICAgICAgICAgICAgICAgIGhlYWRlcltobGVuXSA9ICgodTE2X3QpYjIgPDwgOCkgKyBiMTsKKyAgICAgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW4rMV0gPSAweDIwMDA7CisgICAgICAgICAgICAgICAgICAgIGhlYWRlcltobGVuKzJdID0gKHUxNl90KSAod2QtPnN0YS5pdjMyKTsKKyAgICAgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW4rM10gPSAodTE2X3QpICh3ZC0+c3RhLml2MzIgPj4gMTYpOworCisgICAgICAgICAgICAgICAgICAgIG1hY0N0cmwgfD0gMHhjMDsgLyogU2V0IHRvIEFFUyBpbiBjb250cm9sIHNldHRpbmcgKi8KKyAgICAgICAgICAgICAgICAgICAgaWN2TGVuID0gODsgIC8qIE1JQyAqLworCisgICAgICAgICAgICAgICAgICAgIGhlYWRlcls0XSB8PSAweDQwMDA7IC8qIFNldCBXRVAgYml0IGluIHdsYW4gaGVhZGVyICovCisgICAgICAgICAgICAgICAgICAgIGhsZW4gKz0gNDsgLyogcGx1cyBJViBsZW5ndGggKi8KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9LyogZW5kIG9mIHN3aXRjaCAqLworICAgICAgICAgICAgI2VuZGlmCisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSAgIC8qIHdkLT53bGFuTW9kZSAhPSBaTV9NT0RFX0FQICovCisgICAgeworICAgICAgICBlbmNFeGVtcHRpb25BY3Rpb25UeXBlID0gemZ3R2V0UGt0RW5jRXhlbXB0aW9uQWN0aW9uVHlwZShkZXYsIGJ1Zik7CisKKyAgICAgICAgaWYgKCB3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9JTkZSQVNUUlVDVFVSRSApCisgICAgICAgIHsKKyAgICAgICAgICAgICNpZiAxCisgICAgICAgICAgICAvKiBpZiBXTUUgQVAgKi8KKyAgICAgICAgICAgIGlmICh3ZC0+c3RhLndtZUNvbm5lY3RlZCAhPSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIFFvUyBkYXRhICovCisgICAgICAgICAgICAgICAgaGVhZGVyWzRdIHw9IDB4MDA4MDsKKworICAgICAgICAgICAgICAgIC8qIFFvUyBDb250cm9sICovCisgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW5dID0gdXA7CisgICAgICAgICAgICAgICAgaGxlbiArPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgI2VuZGlmCisKKyAgICAgICAgICAgIGlmICggZW5jRXhlbXB0aW9uQWN0aW9uVHlwZSA9PSBaTV9FTkNSWVBUSU9OX0VYRU1QVF9OT19FWEVNUFRJT04gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICggd2QtPnN0YS5hdXRoTW9kZSA8IFpNX0FVVEhfTU9ERV9XUEEgKQorICAgICAgICAgICAgICAgIHsgICAvKiBub24tV1BBICovCisgICAgICAgICAgICAgICAgICAgIGlmICggd2QtPnN0YS53ZXBTdGF0dXMgPT0gWk1fRU5DUllQVElPTl9XRVBfRU5BQkxFRCApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHdkLT5zdGEuZW5jcnlNb2RlID09IFpNX1dFUDY0KXx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3ZC0+c3RhLmVuY3J5TW9kZSA9PSBaTV9XRVAxMjgpfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdkLT5zdGEuZW5jcnlNb2RlID09IFpNX1dFUDI1NikgKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcls0XSB8PSAweDQwMDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW5dID0gMHgwOyAgIC8vSVYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbisxXSA9IDB4MDsgLy9JVgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcltobGVuKzFdIHw9ICgoKHUxNl90KSB3ZC0+c3RhLmtleUlkKSA8PCAxNCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGxlbiArPSAyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljdkxlbiA9IDQ7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGb3IgU29mdHdhcmUgV0VQICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh3ZC0+c3RhLlNXRW5jcnlwdEVuYWJsZSAmIFpNX1NXX1dFUF9FTkNSWV9FTikgIT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHU4X3Qga2V5TGVuID0gNTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdThfdCBpdlszXTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdlswXSA9IDB4MDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXZbMV0gPSAweDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl2WzJdID0gMHgwOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3ZC0+c3RhLlNXRW5jcnlNb2RlW3dkLT5zdGEua2V5SWRdID09IFpNX1dFUDY0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlMZW4gPSA1OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHdkLT5zdGEuU1dFbmNyeU1vZGVbd2QtPnN0YS5rZXlJZF0gPT0gWk1fV0VQMTI4KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlMZW4gPSAxMzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh3ZC0+c3RhLlNXRW5jcnlNb2RlW3dkLT5zdGEua2V5SWRdID09IFpNX1dFUDI1NikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5TGVuID0gMjk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ZldFUEVuY3J5cHQoZGV2LCBidWYsICh1OF90Kikgc25hcCwgc25hcExlbiwgbWludXNMZW4sIGtleUxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLndlcEtleVt3ZC0+c3RhLmtleUlkXSwgaXYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWNDdHJsIHw9IDB4NDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7ICAgLyogV1BBICovCisgICAgICAgICAgICAgICAgICAgIGlmICggd2QtPnN0YS53cGFTdGF0ZSA+PSBaTV9TVEFfV1BBX1NUQVRFX1BLX09LICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5pdjE2Kys7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHdkLT5zdGEuaXYxNiA9PSAwICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLml2MzIrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgLyogc2V0IGVuY3J5cHRpb24gbW9kZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCB3ZC0+c3RhLmVuY3J5TW9kZSA9PSBaTV9US0lQICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiMSA9ICh1OF90KSAod2QtPnN0YS5pdjE2ID4+IDgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIyID0gKGIxIHwgMHgyMCkgJiAweDdmOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcltobGVuXSA9ICgodTE2X3QpYjIgPDwgOCkgKyBiMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiMSA9ICh1OF90KSB3ZC0+c3RhLml2MTY7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYjIgPSAweDIwOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGVhZGVyW2hsZW4rMV0gPSAoKCh1MTZfdCkgd2QtPnN0YS5rZXlJZCkgPDwgMTQpIHwgKCgodTE2X3QpYjIgPDwgOCkgKyBiMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU1RBIGluIGluZnJhc3RydWN0dXJlIG1vZGUgc2hvdWxkIHVzZSBrZXlJZCA9IDAgdG8gdHJhbnNtaXQgdW5pY2FzdCAhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW4rMV0gPSAoKCh1MTZfdCliMiA8PCA4KSArIGIxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbisyXSA9ICh1MTZfdCkgd2QtPnN0YS5pdjMyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcltobGVuKzNdID0gKHUxNl90KSAod2QtPnN0YS5pdjMyID4+IDE2KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIElmIHNvZnR3YXJlIGVuY3J5cHRpb24gZW5hYmxlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh3ZC0+c3RhLlNXRW5jcnlwdEVuYWJsZSAmIFpNX1NXX1RLSVBfRU5DUllfRU4pID09IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL21hY0N0cmwgfD0gMHg4MDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVEtJUCBzYW1lIHRvIFdFUCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWNDdHJsIHw9IDB4NDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljdkxlbiA9IDQ7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2V0IGhhcmR3YXJlIE1JQyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICghKHNlcSAmIDB4ZikpJiYoIShmbGFnICYgMHg0KSkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWNDdHJsIHw9IDB4MTAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGx1c0xlbiArPSA4OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm1pY0xlbiA9IDg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdThfdCBtaWNbOF07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxNl90IG9mZnNldDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3QgaWN2OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1OF90IFJDNEtleVsxNl07CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVE9ETzogUmVtb3ZlIHRoZSBjcml0aWNpYWwgc2VjdGlvbiBoZXJlLiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENhbGN1bGF0ZSBNSUMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemZDYWxUeE1pYyhkZXYsIGJ1ZiwgKHU4X3QgKilzbmFwLCBzbmFwTGVuLCBtaW51c0xlbiwgZGEsIHNhLCB1cCwgbWljKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSB6ZndCdWZHZXRTaXplKGRldiwgYnVmKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBcHBlbmQgTUlDIHRvIHRoZSBidWZmZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemZDb3B5VG9JbnRUeEJ1ZmZlcihkZXYsIGJ1ZiwgbWljLCBvZmZzZXQsIDgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ZndCdWZTZXRTaXplKGRldiwgYnVmLCBvZmZzZXQrOCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVEtJUCBLZXkgTWl4aW5nICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpmVGtpcFBoYXNlMUtleU1peCh3ZC0+c3RhLml2MzIsICZ3ZC0+c3RhLnR4U2VlZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpmVGtpcFBoYXNlMktleU1peCh3ZC0+c3RhLml2MTYsICZ3ZC0+c3RhLnR4U2VlZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpmVGtpcEdldHNlZWRzKHdkLT5zdGEuaXYxNiwgUkM0S2V5LCAmd2QtPnN0YS50eFNlZWQpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEVuY3J5cHQgRGF0YSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ZlRLSVBFbmNyeXB0KGRldiwgYnVmLCAodThfdCAqKXNuYXAsIHNuYXBMZW4sIG1pbnVzTGVuLCAxNiwgUkM0S2V5LCAmaWN2KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY3ZMZW4gPSA0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4gKz0gODsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJbNF0gfD0gMHg0MDAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhsZW4gKz0gNDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCB3ZC0+c3RhLmVuY3J5TW9kZSA9PSBaTV9BRVMgKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIxID0gKHU4X3QpIHdkLT5zdGEuaXYxNjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiMiA9ICh1OF90KSAod2QtPnN0YS5pdjE2ID4+IDgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcltobGVuXSA9ICgodTE2X3QpYjIgPDwgOCkgKyBiMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBoZWFkZXJbaGxlbisxXSA9ICgoKHUxNl90KSB3ZC0+c3RhLmtleUlkKSA8PCAxNCkgfCAoMHgyMDAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTVEEgaW4gaW5mcmFzdHJ1Y3R1cmUgbW9kZSBzaG91bGQgdXNlIGtleUlkID0gMCB0byB0cmFuc21pdCB1bmljYXN0ICEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbisxXSA9IDB4MjAwMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbisyXSA9ICh1MTZfdCkgKHdkLT5zdGEuaXYzMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW4rM10gPSAodTE2X3QpICh3ZC0+c3RhLml2MzIgPj4gMTYpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFjQ3RybCB8PSAweGMwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljdkxlbiA9IDg7ICAvKiBNSUMgKi8KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcls0XSB8PSAweDQwMDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGxlbiArPSA0OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgI2lmZGVmIFpNX0VOQUJMRV9DRU5DCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggd2QtPnN0YS5lbmNyeU1vZGUgPT0gWk1fQ0VOQyApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQWNjdW1sYXRlIHRoZSBQTiBzZXF1ZW5jZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEudHhpdlswXSArPSAyOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdkLT5zdGEudHhpdlswXSA9PSAwIHx8IHdkLT5zdGEudHhpdlswXSA9PSAxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS50eGl2WzFdKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdkLT5zdGEudHhpdlsxXSA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS50eGl2WzJdKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdkLT5zdGEudHhpdlsyXSA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS50eGl2WzNdKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdkLT5zdGEudHhpdlszXSA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS50eGl2WzBdID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS50eGl2WzFdID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS50eGl2WzJdID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbl0gPSAod2QtPnN0YS5jZW5jS2V5SWQgJiAweDAwMDEpOyAgICAvKiBGb3IgS2V5IElkIGFuZCByZXNlcnZlZCBmaWVsZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcltobGVuKzFdID0gKHUxNl90KSB3ZC0+c3RhLnR4aXZbMF07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW4rMl0gPSAodTE2X3QpICh3ZC0+c3RhLnR4aXZbMF0gPj4gMTYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcltobGVuKzNdID0gKHUxNl90KSB3ZC0+c3RhLnR4aXZbMV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW4rNF0gPSAodTE2X3QpICh3ZC0+c3RhLnR4aXZbMV0gPj4gMTYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcltobGVuKzVdID0gKHUxNl90KSB3ZC0+c3RhLnR4aXZbMl07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW4rNl0gPSAodTE2X3QpICh3ZC0+c3RhLnR4aXZbMl0gPj4gMTYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcltobGVuKzddID0gKHUxNl90KSB3ZC0+c3RhLnR4aXZbM107CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW4rOF0gPSAodTE2X3QpICh3ZC0+c3RhLnR4aXZbM10gPj4gMTYpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFjQ3RybCB8PSAweDgwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljdkxlbiA9IDE2OyAgLyogTUlDICovCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJbNF0gfD0gMHg0MDAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhsZW4gKz0gOTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICNlbmRpZiAvL1pNX0VOQUJMRV9DRU5DCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IC8vIGlmICggZW5jRXhlbXB0aW9uQWN0aW9uVHlwZSA9PSBaTV9FTkNSWVBUSU9OX0VYRU1QVF9OT19FWEVNUFRJT04gKQorICAgICAgICB9IC8qIGlmICggd2QtPndsYW5Nb2RlICE9IFpNX01PREVfSU5GUkFTVFJVQ1RVUkUgKSAqLworCisgICAgICAgIGlmICggd2QtPndsYW5Nb2RlID09IFpNX01PREVfSUJTUyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggZW5jRXhlbXB0aW9uQWN0aW9uVHlwZSA9PSBaTV9FTkNSWVBUSU9OX0VYRU1QVF9OT19FWEVNUFRJT04gKQorICAgICAgICAgICAgeworI2lmZGVmIFpNX0VOQUJMRV9JQlNTX1dQQTJQU0sKKyAgICAgICAgICAgICAgICBpZiggd2QtPnN0YS5vcHBvc2l0ZUluZm9bdXNlcklkeF0ud3BhU3RhdGUgPj0gWk1fU1RBX1dQQV9TVEFURV9QS19PSyB8fCB3ZC0+c3RhLndwYVN0YXRlID49IFpNX1NUQV9XUEFfU1RBVEVfUEtfT0spCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgaXNVbmljYXN0ID0gMSA7CisKKyAgICAgICAgICAgICAgICAgICAgaWYoKGRhWzBdJiAweDEpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpc1VuaWNhc3QgPSAwIDsgLy8gTm90IHVuaWNhc3QgLCBpcyBicm9hZGNhc3QKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmKCB3ZC0+c3RhLmlic3NXcGEyUHNrID09IDEgKQorICAgICAgICAgICAgICAgICAgICB7IC8qIFRoZSBJViBvcmRlciBpcyBub3QgdGhlIHNhbWUgYmV0d2VlbiB1bmljYXN0IGFuZCBicm9hZGNhc3QgISAqLworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBpc1VuaWNhc3QgKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl2MTYgPSAmd2QtPnN0YS5vcHBvc2l0ZUluZm9bdXNlcklkeF0uaXYxNjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdjMyID0gJndkLT5zdGEub3Bwb3NpdGVJbmZvW3VzZXJJZHhdLml2MzI7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXYxNiA9ICZ3ZC0+c3RhLml2MTY7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXYzMiA9ICZ3ZC0+c3RhLml2MzI7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpdjE2ID0gJndkLT5zdGEuaXYxNjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGl2MzIgPSAmd2QtPnN0YS5pdjMyOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgKCppdjE2KSsrOworICAgICAgICAgICAgICAgICAgICBpZiAoICppdjE2ID09IDAgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAqaXYzMisrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCB3ZC0+c3RhLm9wcG9zaXRlSW5mb1t1c2VySWR4XS5lbmNyeU1vZGUgPT0gWk1fQUVTIHx8IHdkLT5zdGEuZW5jcnlNb2RlID09IFpNX0FFUykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy9wcmludGsoIlN0YXRpb24gZW5jcnlwdGlvbiBtb2RlIGlzIEFFUy1DQ01QXG4iKSA7CisgICAgICAgICAgICAgICAgICAgICAgICBiMSA9ICh1OF90KSAoKml2MTYpOworICAgICAgICAgICAgICAgICAgICAgICAgYjIgPSAodThfdCkgKCgqaXYxNikgPj4gOCk7CisgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbl0gPSAoKHUxNl90KWIyIDw8IDgpICsgYjE7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggaXNVbmljYXN0ICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbisxXSA9IDB4MjAwMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbisxXSA9IDB4MjAwMCB8ICgoKHUxNl90KSB3ZC0+c3RhLmtleUlkKSA8PCAxNCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcltobGVuKzJdID0gKHUxNl90KSAoKml2MzIpOworICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW4rM10gPSAodTE2X3QpICgoKml2MzIpID4+IDE2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1hY0N0cmwgfD0gMHhjMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGljdkxlbiA9IDg7ICAvKiBNSUMgKi8KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGhlYWRlcls0XSB8PSAweDQwMDA7CisgICAgICAgICAgICAgICAgICAgIGhsZW4gKz0gNDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIHdkLT5zdGEud2VwU3RhdHVzID09IFpNX0VOQ1JZUFRJT05fV0VQX0VOQUJMRUQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoICh3ZC0+c3RhLmVuY3J5TW9kZSA9PSBaTV9XRVA2NCl8fAorICAgICAgICAgICAgICAgICAgICAgICAgKHdkLT5zdGEuZW5jcnlNb2RlID09IFpNX1dFUDEyOCl8fAorICAgICAgICAgICAgICAgICAgICAgICAgKHdkLT5zdGEuZW5jcnlNb2RlID09IFpNX1dFUDI1NikgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJbNF0gfD0gMHg0MDAwOworICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW5dID0gMHgwOyAgIC8vSVYKKyAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcltobGVuKzFdID0gMHgwOyAvL0lWCisgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbisxXSB8PSAoKCh1MTZfdCkgd2QtPnN0YS5rZXlJZCkgPDwgMTQpOworICAgICAgICAgICAgICAgICAgICAgICAgaGxlbiArPSAyOworICAgICAgICAgICAgICAgICAgICAgICAgaWN2TGVuID0gNDsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1hY0N0cmwgfD0gMHg0MDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyNlbHNlCisgICAgICAgICAgICAgICAgLyogLS0tLS0gMjAwNzA0MDUgYWRkIGJ5IE14emVuZyAtLS0tLSAqLworICAgICAgICAgICAgICAgIGlmKCB3ZC0+c3RhLndwYVN0YXRlID49IFpNX1NUQV9XUEFfU1RBVEVfUEtfT0sgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGlzVW5pY2FzdCA9IDEgOworCisgICAgICAgICAgICAgICAgICAgIGlmKChkYVswXSYgMHgxKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaXNVbmljYXN0ID0gMCA7IC8vIE5vdCB1bmljYXN0ICwgaXMgYnJvYWRjYXN0CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLml2MTYrKzsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCB3ZC0+c3RhLml2MTYgPT0gMCApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEuaXYzMisrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCB3ZC0+c3RhLmVuY3J5TW9kZSA9PSBaTV9BRVMgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvL3ByaW50aygiU3RhdGlvbiBlbmNyeXB0aW9uIG1vZGUgaXMgQUVTLUNDTVBcbiIpIDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGIxID0gKHU4X3QpIHdkLT5zdGEuaXYxNjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGIyID0gKHU4X3QpICh3ZC0+c3RhLml2MTYgPj4gOCk7CisgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbl0gPSAoKHUxNl90KWIyIDw8IDgpICsgYjE7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggaXNVbmljYXN0ICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbisxXSA9IDB4MjAwMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbisxXSA9IDB4MjAwMCB8ICgoKHUxNl90KSB3ZC0+c3RhLmtleUlkKSA8PCAxNCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbisyXSA9ICh1MTZfdCkgKHdkLT5zdGEuaXYzMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW4rM10gPSAodTE2X3QpICh3ZC0+c3RhLml2MzIgPj4gMTYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hY0N0cmwgfD0gMHhjMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY3ZMZW4gPSA4OyAgLyogTUlDICovCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBoZWFkZXJbNF0gfD0gMHg0MDAwOworICAgICAgICAgICAgICAgICAgICBobGVuICs9IDQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKCB3ZC0+c3RhLndlcFN0YXR1cyA9PSBaTV9FTkNSWVBUSU9OX1dFUF9FTkFCTEVEKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAod2QtPnN0YS5lbmNyeU1vZGUgPT0gWk1fV0VQNjQpfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAod2QtPnN0YS5lbmNyeU1vZGUgPT0gWk1fV0VQMTI4KXx8CisgICAgICAgICAgICAgICAgICAgICAgICAgKHdkLT5zdGEuZW5jcnlNb2RlID09IFpNX1dFUDI1NikgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJbNF0gfD0gMHg0MDAwOworICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW5dID0gMHgwOyAgIC8vSVYKKyAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcltobGVuKzFdID0gMHgwOyAvL0lWCisgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbisxXSB8PSAoKCh1MTZfdCkgd2QtPnN0YS5rZXlJZCkgPDwgMTQpOworICAgICAgICAgICAgICAgICAgICAgICAgaGxlbiArPSAyOworICAgICAgICAgICAgICAgICAgICAgICAgaWN2TGVuID0gNDsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1hY0N0cmwgfD0gMHg0MDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgfSAgIC8vIEVuZCBpZiAoIGVuY0V4ZW1wdGlvbkFjdGlvblR5cGUgPT0gWk1fRU5DUllQVElPTl9FWEVNUFRfTk9fRVhFTVBUSU9OICkKKyAgICAgICAgfSAgIC8vIEVuZCBpZiAoIHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0lCU1MgKQorICAgICAgICBlbHNlIGlmICggd2QtPndsYW5Nb2RlID09IFpNX01PREVfUFNFVURPICkKKyAgICAgICAgeworICAgICAgICAgICAgc3dpdGNoICh3ZC0+c3RhLmVuY3J5TW9kZSkKKwkgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgWk1fV0VQNjQ6CisgICAgICAgICAgICBjYXNlIFpNX1dFUDEyODoKKyAgICAgICAgICAgIGNhc2UgWk1fV0VQMjU2OgorICAgICAgICAgICAgICAgIGhlYWRlcls0XSB8PSAweDQwMDA7CisgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW5dID0gMHgwOyAgIC8vSVYKKyAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbisxXSA9IDB4MDsgLy9JVgorICAgICAgICAgICAgICAgIGhsZW4gKz0gMjsKKyAgICAgICAgICAgICAgICBpY3ZMZW4gPSA0OworICAgICAgICAgICAgICAgIG1hY0N0cmwgfD0gMHg0MDsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBaTV9US0lQOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdkLT5zdGEuaXYxNisrOworICAgICAgICAgICAgICAgIGlmICggd2QtPnN0YS5pdjE2ID09IDAgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5pdjMyKys7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYjEgPSAodThfdCkgKHdkLT5zdGEuaXYxNiA+PiA4KTsKKyAgICAgICAgICAgICAgICBiMiA9IChiMSB8IDB4MjApICYgMHg3ZjsKKyAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbl0gPSAoKHUxNl90KWIyIDw8IDgpICsgYjE7CisgICAgICAgICAgICAgICAgYjEgPSAodThfdCkgd2QtPnN0YS5pdjE2OworICAgICAgICAgICAgICAgIGIyID0gMHgyMDsKKyAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbisxXSA9ICgodTE2X3QpYjIgPDwgOCkgKyBiMTsKKyAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbisyXSA9ICh1MTZfdCkgd2QtPnN0YS5pdjMyOworICAgICAgICAgICAgICAgIGhlYWRlcltobGVuKzNdID0gKHUxNl90KSAod2QtPnN0YS5pdjMyID4+IDE2KTsKKworICAgICAgICAgICAgICAgIC8vbWFjQ3RybCB8PSAweDgwOworICAgICAgICAgICAgICAgIG1hY0N0cmwgfD0gMHg0MDsKKyAgICAgICAgICAgICAgICBpY3ZMZW4gPSA0OworCisgICAgICAgICAgICAgICAgLyogc2V0IGhhcmR3YXJlIE1JQyAqLworICAgICAgICAgICAgICAgIGlmICggKCEoc2VxICYgMHhmKSkmJighKGZsYWcgJiAweDQpKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBtYWNDdHJsIHw9IDB4MTAwOworICAgICAgICAgICAgICAgICAgICBwbHVzTGVuICs9IDg7CisgICAgICAgICAgICAgICAgICAgICptaWNMZW4gPSA4OworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGhlYWRlcls0XSB8PSAweDQwMDA7CisgICAgICAgICAgICAgICAgaGxlbiArPSA0OworICAgICAgICAgICAgfS8qIGVuZCBvZiBQU0VVRE8gVEtJUCAqLworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIFpNX0FFUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3ZC0+c3RhLml2MTYrKzsKKyAgICAgICAgICAgICAgICBpZiAoIHdkLT5zdGEuaXYxNiA9PSAwICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEuaXYzMisrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGIxID0gKHU4X3QpIHdkLT5zdGEuaXYxNjsKKyAgICAgICAgICAgICAgICBiMiA9ICh1OF90KSAod2QtPnN0YS5pdjE2ID4+IDgpOworICAgICAgICAgICAgICAgIGhlYWRlcltobGVuXSA9ICgodTE2X3QpYjIgPDwgOCkgKyBiMTsKKyAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbisxXSA9IDB4MjAwMDsKKyAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbisyXSA9ICh1MTZfdCkgKHdkLT5zdGEuaXYzMik7CisgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW4rM10gPSAodTE2X3QpICh3ZC0+c3RhLml2MzIgPj4gMTYpOworICAgICAgICAgICAgICAgIG1hY0N0cmwgfD0gMHhjMDsKKyAgICAgICAgICAgICAgICBpY3ZMZW4gPSA4OyAgLyogTUlDICovCisgICAgICAgICAgICAgICAgaGVhZGVyWzRdIHw9IDB4NDAwMDsKKyAgICAgICAgICAgICAgICBobGVuICs9IDQ7CisgICAgICAgICAgICB9LyogZW5kIG9mIFBTRVVETyBBRVMgKi8KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgI2lmZGVmIFpNX0VOQUJMRV9DRU5DCisgICAgICAgICAgICAgIGNhc2UgWk1fQ0VOQzoKKyAgICAgICAgICAgICAgICAgICAgLyogQWNjdW1sYXRlIHRoZSBQTiBzZXF1ZW5jZSAqLworICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLnR4aXZbMF0gKz0gMjsKKworICAgICAgICAgICAgICAgICAgICBpZiAod2QtPnN0YS50eGl2WzBdID09IDAgfHwgd2QtPnN0YS50eGl2WzBdID09IDEpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEudHhpdlsxXSsrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHdkLT5zdGEudHhpdlsxXSA9PSAwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLnR4aXZbMl0rKzsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmICh3ZC0+c3RhLnR4aXZbMl0gPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS50eGl2WzNdKys7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAod2QtPnN0YS50eGl2WzNdID09IDApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEudHhpdlswXSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLnR4aXZbMV0gPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS50eGl2WzJdID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGhlYWRlcltobGVuXSA9IDA7CisgICAgICAgICAgICAgICAgICAgIGhlYWRlcltobGVuKzFdID0gKHUxNl90KSB3ZC0+c3RhLnR4aXZbMF07CisgICAgICAgICAgICAgICAgICAgIGhlYWRlcltobGVuKzJdID0gKHUxNl90KSAod2QtPnN0YS50eGl2WzBdID4+IDE2KTsKKyAgICAgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW4rM10gPSAodTE2X3QpIHdkLT5zdGEudHhpdlsxXTsKKyAgICAgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW4rNF0gPSAodTE2X3QpICh3ZC0+c3RhLnR4aXZbMV0gPj4gMTYpOworICAgICAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbis1XSA9ICh1MTZfdCkgd2QtPnN0YS50eGl2WzJdOworICAgICAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbis2XSA9ICh1MTZfdCkgKHdkLT5zdGEudHhpdlsyXSA+PiAxNik7CisgICAgICAgICAgICAgICAgICAgIGhlYWRlcltobGVuKzddID0gKHUxNl90KSB3ZC0+c3RhLnR4aXZbM107CisgICAgICAgICAgICAgICAgICAgIGhlYWRlcltobGVuKzhdID0gKHUxNl90KSAod2QtPnN0YS50eGl2WzNdID4+IDE2KTsKKworICAgICAgICAgICAgICAgICAgICBtYWNDdHJsIHw9IDB4ODA7CisgICAgICAgICAgICAgICAgICAgIGljdkxlbiA9IDE2OyAgLyogTUlDICovCisKKyAgICAgICAgICAgICAgICAgICAgaGVhZGVyWzRdIHw9IDB4NDAwMDsKKyAgICAgICAgICAgICAgICAgICAgaGxlbiArPSA5OworCQkJCWJyZWFrOworCQkgICAgI2VuZGlmIC8vWk1fRU5BQkxFX0NFTkMKKwkJCX0vKiBlbmQgb2Ygc3dpdGNoICovCisJCX0KKworICAgICAgICAvKiBHZW5lcmF0ZSBjb250cm9sIHNldHRpbmcgKi8KKworICAgICAgICAvKiBwcm90ZWN0aW9uIG1vZGUgKi8KKyAgICAgICAgaWYgKHdkLT5lbmFibGVQcm90ZWN0aW9uTW9kZSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHdkLT5lbmFibGVQcm90ZWN0aW9uTW9kZT09MikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBGb3JjZSBlbmFibGUgcHJvdGVjdGlvbjogc2VsZiBjdHMgICovCisgICAgICAgICAgICAgICAgbWFjQ3RybCAmPSAweEZGRkM7CisgICAgICAgICAgICAgICAgbWFjQ3RybCB8PSAyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogaWYgd2QtPmVuYWJsZVByb3RlY3Rpb25Nb2RlPTEgPT4gZm9yY2UgZGlzYWJsZSAqLworICAgICAgICAgICAgLyogaWYgd2QtPmVuYWJsZVByb3RlY3Rpb25Nb2RlPTAgPT4gYXV0byAqLworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworCisgICAgICAgICAgICAvKiBwcm90ZWN0aW9uIG1vZGUgKi8KKyAgICAgICAgICAgIGlmICh3ZC0+c3RhLmJQcm90ZWN0aW9uTW9kZSA9PSBUUlVFKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIEVuYWJsZSBTZWxmLUNUUyAqLworICAgICAgICAgICAgICAgIG1hY0N0cmwgJj0gMHhGRkZDOworICAgICAgICAgICAgICAgIG1hY0N0cmwgfD0gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfQorCisgICAgaWYgKHdkLT50eE1DUyAhPSAweGZmKQorICAgIHsKKyAgICAgICAgLyogZml4ZWQgcmF0ZSAqLworCSAgICBwaHlDdHJsID0gKCh1MzJfdCl3ZC0+dHhNQ1M8PDE2KSArIHdkLT50eE1UOworICAgICAgICBtY3MgPSB3ZC0+dHhNQ1M7CisgICAgICAgIG10ID0gd2QtPnR4TVQ7CisgICAgfQorCisgICAgaWYgKG10ID09IDIpCisgICAgeworI2lmIDAKKyAgICAgICAgLyogSFQgUFQ6IDAgTWl4ZWQgbW9kZSAgICAxIEdyZWVuIGZpZWxkICovCisJICAgIGlmICh3ZC0+c3RhLnByZWFtYmxlVHlwZUhUID09IFpNX1BSRUFNQkxFX1RZUEVfR1JFRU5fRklFTEQpCisJICAgIHsKKyAgICAgICAgICAgIHBoeUN0cmwgfD0gMHg0OyAgICAgLyogQml0IDIgKi8KKyAgICAgICAgfQorI2VuZGlmCisgICAgICAgIC8qIEJhbmR3aWR0aCAqLworICAgICAgICBpZiAod2QtPnN0YS5odEN0cmxCYW5kd2lkdGggPT0gWk1fQkFORFdJRFRIXzQwTUhaKQorICAgICAgICB7CisgICAgICAgICAgICBwaHlDdHJsIHw9ICgweDgwPDwxNik7ICAvKiBCSVQgMjMgKi8KKyAgICAgICAgfQorI2lmIDAKKyAgICAgICAgLyogU1RCQyAqLworICAgICAgICBpZiAod2QtPnN0YS5odEN0cmxTVEJDPD0weDMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBoeUN0cmwgfD0gKHdkLT5zdGEuaHRDdHJsU1RCQzw8MjgpOyAgIC8qIEJJVCAyMyAqLworICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgLyogU2hvcnQgR0kgKi8KKyAgICAgICAgaWYod2QtPnN0YS5odEN0cmxTRykKKyAgICAgICAgeworICAgICAgICAgICAgcGh5Q3RybCB8PSAoMHg4MDAwPDwxNik7ICAgICAgICAgLyogQklUIDMxICovCisgICAgICAgIH0KKworICAgICAgICAvKiBUQSAqLworICAgICAgICBpZiAoICgobWNzID49MHg4KSAmJiAobWNzPD0weGYpKSAgfHwgKHdkLT5zdGEuaHRDdHJsU1RCQykgKQorICAgICAgICB7CisgICAgICAgCSAgICBwaHlDdHJsIHw9IDB4MTgwMDsgICAgICAgICAgICAgICAvKiBCSVQgMTEgMTIgKi8KKyAgICAJfQorICAgIH0KKyAgICBlbHNlIGlmKG10ID09IDEpCisgICAgeworICAgICAgICAjaWYgMAorICAgICAgICAvL2J1ZyB0aGF0IGNhdXNlIE9GRE0gcmF0ZSBiZWNvbWUgZHVwbGljYXRlIGxlZ2FjeSByYXRlCisgICAgICAgIC8qIEJhbmR3aWR0aCAqLworICAgICAgICBpZiAod2QtPnN0YS5odEN0cmxCYW5kd2lkdGggPT0gWk1fQkFORFdJRFRIXzQwTUhaKQorICAgICAgICB7CisgICAgICAgICAgICBwaHlDdHJsIHw9ICgweDgwPDwxNik7ICAvKiBCSVQgMjMgKi8KKyAgICAgICAgICAgIG10ID0gMzsgICAgICAgICAgICAgICAgIC8qIGR1cGxpY2F0ZSBsZWdhY3kgKi8KKyAgICAgICAgICAgIHBoeUN0cmwgfD0gbXQ7CisgICAgICAgIH0KKyAgICAgICAgI2VuZGlmCisgICAgfQorICAgIGVsc2UgaWYobXQgPT0gMCkKKyAgICB7CisJLyogQ0NLIFBUOiBMZWdjeSBQcmVhbWJsZTogMSBsb25nIHByZWFtYmxlICAgIDIgc2hvcnQgcHJlYW1ibGUgKi8KKyAgICAgICAgaWYgKHdkLT5wcmVhbWJsZVR5cGVJblVzZWQgPT0gWk1fUFJFQU1CTEVfVFlQRV9TSE9SVCkKKyAgICAgICAgeworICAgIAkgICAgICAgLy9waHlDdHJsIHw9IDB4NDsgICAgLyogQklUIDIgKi8KKyAgICAJfQorICAgIH0KKworICAgIC8qIFRBICovCisgICAgaWYgKHdkLT5zdGEuZGVmYXVsdFRBKQorICAgIHsKKyAgICAgICAgcGh5Q3RybCB8PSAweDEwMDA7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHBoeUN0cmwgfD0gMHgwODAwOworICAgIH0KKworICAgIC8vR2V0IEN1cnJlbnRUeFJhdGUgLS0gQ1dZYW5nKCspCisgICAgaWYgKChtdCA9PSAwKSB8fCAobXQgPT0gMSkpIC8vQixHIFJhdGUKKyAgICB7CisgICAgICAgIGlmIChtY3MgPCAxNikKKyAgICAgICAgeworICAgICAgICAgICAgd2QtPkN1cnJlbnRUeFJhdGVLYnBzID0gemNJbmRleHRvUmF0ZUJHW21jc107CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAobXQgPT0gMikKKyAgICB7CisgICAgICAgIGlmIChtY3MgPCAxNikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHdkLT5zdGEuaHRDdHJsQmFuZHdpZHRoID09IFpNX0JBTkRXSURUSF80ME1IWikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZigocGh5Q3RybCAmIDB4ODAwMDAwMDApICE9IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKiBTaG9ydCBHSSA0MCBNSHogTUlNTyBSYXRlICovCisgICAgICAgICAgICAgICAgICAgIHdkLT5DdXJyZW50VHhSYXRlS2JwcyA9IHpjSW5kZXh0b1JhdGVONDBTW21jc107CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qIExvbmcgR0kgNDAgTUh6IE1JTU8gUmF0ZSAqLworICAgICAgICAgICAgICAgICAgICB3ZC0+Q3VycmVudFR4UmF0ZUticHMgPSB6Y0luZGV4dG9SYXRlTjQwTFttY3NdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZigocGh5Q3RybCAmIDB4ODAwMDAwMDApICE9IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKiBTaG9ydCBHSSAyMCBNSHogTUlNTyBSYXRlICovCisgICAgICAgICAgICAgICAgICAgIHdkLT5DdXJyZW50VHhSYXRlS2JwcyA9IHpjSW5kZXh0b1JhdGVOMjBTW21jc107CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qIExvbmcgR0kgMjAgTUh6IE1JTU8gUmF0ZSAqLworICAgICAgICAgICAgICAgICAgICB3ZC0+Q3VycmVudFR4UmF0ZUticHMgPSB6Y0luZGV4dG9SYXRlTjIwTFttY3NdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vODAyLjExIGhlYWRlcihpbmNsdWRlIElWKSA9IChobGVuPDwxKS04CisgICAgLy9ldGhlcm5ldCBmcmFtZSA9IGxlbgorICAgIC8vc25hcCArIG1pYyA9IHBsdXNMZW4KKyAgICAvL2V0aGVybmV0IGhlYWRlciA9IG1pbnVzTGVuCisgICAgLy9pY3YgPSBpY3ZMZW4KKyAgICAvL2NyYzMyID0gNAorICAgIC8vbGVuZ3RoPTgwMi4xMSBoZWFkZXIrc25hcCsoZXRoZXJuZXQgZnJhbWUtZXRoZXJuZXQgaGVhZGVyKSttaWMraWN2K2NyYzMyCisgICAgaGVhZGVyWzBdID0gKChobGVuPDwxKS04KStwbHVzTGVuKyhsZW4tbWludXNMZW4pK2ljdkxlbis0OyAgLy9MZW5ndGgKKworICAgIC8vIGhlYWRlclswXSA6IE1QRFUgTGVuZ3RocworICAgIGlmICgoaGVhZGVyWzZdICYgMHgxKSAhPSAweDEpIC8vIFVuaWNhc3QgRnJhbWUKKyAgICB7CisgICAgICAgIGlmIChoZWFkZXJbMF0gPj0gd2QtPnJ0c1RocmVzaG9sZCkKKyAgICAgICAgeworICAgICAgICAgICAgLyogRW5hYmxlIFJUUyAqLworICAgICAgICAgICAgbWFjQ3RybCB8PSAxOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCB3ZC0+c3RhLmVuY3J5TW9kZSA9PSBaTV9US0lQICkKKyAgICAgICAgdGtpcEZyYW1lT2Zmc2V0ID0gODsKKworICAgIGlmKCB3ZC0+c3RhLkVuYWJsZUhUICE9IDEgKQorICAgIHsgLy8gQWdncmVnYXRpb24gc2hvdWxkIG5vdCBiZSBmcmFnbWVudGVkICEKKyAgICAgICAgaWYgKCBoZWFkZXJbMF0gPiAoIHdkLT5mcmFnVGhyZXNob2xkICsgdGtpcEZyYW1lT2Zmc2V0ICkgKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gMDsgLy8gTmVlZCB0byBiZSBmcmFnbWVudGVkICEgIQorICAgICAgICB9CisgICAgfQorCisgICAgLy9pZiAoIHdkLT5zdGEuZW5jcnlNb2RlID09IFpNX1RLSVAgKQorICAgIC8veworICAgIC8vICAgIHptX2RlYnVnX21zZzEoImN0cmwgbGVuZ3RoID0gIiwgaGVhZGVyWzBdKTsKKyAgICAvL30KKworICAgIC8vTUFDIGNvbnRyb2wKKyAgICBpZiAocmF0ZVByb2JpbmdGbGFnICE9IDApCisgICAgeworICAgICAgICBtYWNDdHJsIHw9IDB4ODAwMDsKKyAgICB9CisgICAgaGVhZGVyWzFdID0gbWFjQ3RybDsKKyAgICAvL1BIWSBjb250cm9sIEwKKyAgICBoZWFkZXJbMl0gPSAodTE2X3QpICgocGh5Q3RybCYweGZmZmYpIHwgMHg3MDAgfCAoemNVcFRvQWNbdXAmMHg3XTw8MTMpKTsKKyAgICAvL1BIWSBjb250cm9sIEgKKyAgICBoZWFkZXJbM10gPSAodTE2X3QpICgocGh5Q3RybD4+MTYpIHwgMHg3MDApOworCisgICAgaWYgKHdkLT5lbmFibGVBZ2dyZWdhdGlvbikKKyAgICB7CisgICAgICAgIC8qIGZvcmNlIGVuYWJsZSBhZ2dyZWdhdGlvbiAqLworICAgICAgICBpZiAod2QtPmVuYWJsZUFnZ3JlZ2F0aW9uPT0yICYmICEoaGVhZGVyWzZdJjB4MSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgoKGhlYWRlclsyXSAmIDB4MykgPT0gMikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogRW5hYmxlIGFnZ3JlZ2F0aW9uICovCisgICAgICAgICAgICAgICAgaGVhZGVyWzFdIHw9IDB4MjA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLyogaWYgd2QtPmVuYWJsZUFnZ3JlZ2F0aW9uPTEgPT4gZm9yY2UgZGlzYWJsZSAqLworICAgICAgICAvKiBpZiB3ZC0+ZW5hYmxlQWdncmVnYXRpb249MCA9PiBhdXRvICovCisgICAgfQorCisjaWZkZWYgWk1fRU5BQkxFX0FHR1JFR0FUSU9OCisgICAgaWYgKHdkLT5hZGRiYUNvbXBsZXRlKSB7CisgICAgICAgICNpZmRlZiBaTV9CWVBBU1NfQUdHUl9TQ0hFRFVMSU5HCisgICAgICAgIGlmICghKGhlYWRlcls2XSYweDEpICYmICFyYXRlUHJvYmluZ0ZsYWcgJiYgKHdkLT5lbmFibGVBZ2dyZWdhdGlvbiAhPSAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCgoaGVhZGVyWzJdICYgMHgzKSA9PSAyKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBVbmljYXN0IGZyYW1lIHdpdGggSFQgcmF0ZSA9PiBFbmFibGUgYWdncmVnYXRpb24gKi8KKyAgICAgICAgICAgICAgICAvKiBXZSBvbmx5IHN1cHBvcnQgc29mdHdhcmUgZW5jcnlwdGlvbiBpbiBzaW5nbGUgcGFja2V0IG1vZGUgKi8KKyAgICAgICAgICAgICAgICBpZiAoKHdkLT5zdGEuU1dFbmNyeXB0RW5hYmxlICYgWk1fU1dfVEtJUF9FTkNSWV9FTikgPT0gMCAmJgorICAgICAgICAgICAgICAgICAgICAod2QtPnN0YS5TV0VuY3J5cHRFbmFibGUgJiBaTV9TV19XRVBfRU5DUllfRU4pID09IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKiBTZXQgYWdncmVnYXRpb24gZ3JvdXAgYml0cyBwZXIgQUMgKi8KKyAgICAgICAgICAgICAgICAgICAgaGVhZGVyWzFdIHw9ICgweDIwIHwgKHpjVXBUb0FjW3VwJjB4N108PDEwKSk7CisKKyAgICAgICAgICAgICAgICAgICAgLy9pZiAod2QtPnN0YS5jdXJyZW50RnJlcXVlbmN5IDwgMzAwMCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogaXNzdWU6IC1QQjQyIEVuYWJsZSBSVFMvQ1RTIHRvIHByZXZlbnQgT1dMIFR4IGhhbmcgdXAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIElmIHRoaXMgaXMgT3dsIEFwLCBlbmFibGUgUlRTL0NUUyBwcm90ZWN0ICovCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICh3ZC0+c3RhLmF0aE93bEFwID09IDEpIHx8ICh3ZC0+c3RhLlJUU0luQUdHTW9kZSA9PSBUUlVFKSApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyWzFdICY9IDB4ZmZmYzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJbMV0gfD0gMHgxOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBFbmFibGUgUklGUyA6IHdvcmthcm91bmQgODU0VCBSVFMvQ1RTICovCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBCaXQxMyA6IFRJIGVuYWJsZSBSSUZTICovCisgICAgICAgICAgICAgICAgICAgICAgICAvL2hlYWRlclsxXSB8PSAweDIwMDA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgI2Vsc2UKKyAgICAgICAgLyoKKyAgICAgICAgICogYWdncmVnYXRpb24gYW1wZHVJbmRpY2F0aW9uIGNvbnRyb2wKKyAgICAgICAgICovCisgICAgICAgIGlmIChhZ2dDb250cm9sICYmIGFnZ0NvbnRyb2wtPmFnZ0VuYWJsZWQpIHsKKyAgICAgICAgICAgIGlmICh3ZC0+ZW5hYmxlQWdncmVnYXRpb249PTAgJiYgIShoZWFkZXJbNl0mMHgxKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKChoZWFkZXJbMl0gJiAweDMpID09IDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyogRW5hYmxlIGFnZ3JlZ2F0aW9uICovCisgICAgICAgICAgICAgICAgICAgIGhlYWRlclsxXSB8PSAweDIwOworICAgICAgICAgICAgICAgICAgICBpZiAoWk1fQUdHX0xBU1RfTVBEVSA9PSBhZ2dDb250cm9sLT5hbXBkdUluZGljYXRpb24pCisgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJbMV0gfD0gMHg0MDAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMSgibm8gYWdnciwgaGVhZGVyWzJdJjB4MyA9ICIsaGVhZGVyWzJdICYgMHgzKQorICAgICAgICAgICAgICAgICAgICBhZ2dDb250cm9sLT5hZ2dFbmFibGVkID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICB6bV9kZWJ1Z19tc2cxKCJubyBhZ2dyLCB3ZC0+ZW5hYmxlQWdncmVnYXRpb24gPSAiLCB3ZC0+ZW5hYmxlQWdncmVnYXRpb24pOworICAgICAgICAgICAgICAgIHptX2RlYnVnX21zZzEoIm5vIGFnZ3IsICFoZWFkZXJbNl0mMHgxID0gIiwhKGhlYWRlcls2XSYweDEpKTsKKyAgICAgICAgICAgICAgICBhZ2dDb250cm9sLT5hZ2dFbmFibGVkID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAjZW5kaWYKKworICAgICAgICAjaWZkZWYgWk1fQUdHUl9CSVRfT04KKyAgICAgICAgaWYgKCEoaGVhZGVyWzZdJjB4MSkgJiYgIXJhdGVQcm9iaW5nRmxhZykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCgoaGVhZGVyWzJdICYgMHgzKSA9PSAyKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBVbmljYXN0IGZyYW1lIHdpdGggSFQgcmF0ZSA9PiBFbmFibGUgYWdncmVnYXRpb24gKi8KKyAgICAgICAgICAgICAgICAvKiBTZXQgYWdncmVnYXRpb24gZ3JvdXAgYml0cyBwZXIgQUMgKi8KKyAgICAgICAgICAgICAgICBoZWFkZXJbMV0gfD0gKDB4MjAgfCAoemNVcFRvQWNbdXAmMHg3XTw8MTApKTsKKworICAgICAgICAgICAgICAgIC8vaWYgKHdkLT5zdGEuY3VycmVudEZyZXF1ZW5jeSA8IDMwMDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKiBFbmFibGUgUlRTL0NUUyB0byBwcmV2ZW50IE9XTCBUeCBoYW5nIHVwICovCisgICAgICAgICAgICAgICAgICAgIGhlYWRlclsxXSAmPSAweGZmZmM7CisgICAgICAgICAgICAgICAgICAgIGhlYWRlclsxXSB8PSAweDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICNlbmRpZgorICAgIH0KKyNlbmRpZgorCisgICAgcmV0dXJuIChobGVuPDwxKTsKK30KKworCit1MTZfdCB6ZlR4R2VuTW1IZWFkZXIoemRldl90KiBkZXYsIHU4X3QgZnJhbWVUeXBlLCB1MTZfdCogZHN0LAorICAgICAgICB1MTZfdCogaGVhZGVyLCB1MTZfdCBsZW4sIHpidWZfdCogYnVmLCB1MTZfdCB2YXAsIHU4X3QgZW5jcnlwdCkKK3sKKyAgICAvL3UxNl90IGJvZHlMZW47CisgICAgdThfdCAgaGxlbiA9IDMyOyAgICAgICAgLy8gTUFDIGN0cmwgKyBQSFkgY3RybCArIDgwMi4xMSBNTSBoZWFkZXIKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICAvKiBHZW5lcmF0ZSBjb250cm9sIHNldHRpbmcgKi8KKyAgICAvL2JvZHlMZW4gPSB6ZndCdWZHZXRTaXplKGRldiwgYnVmKTsKKyAgICBoZWFkZXJbMF0gPSAyNCtsZW4rNDsgICAvL0xlbmd0aAorICAgIGlmICgoZHN0WzBdICYgMHgxKSAhPSAwKSAvL0Jyb2FkY2FzdCwgbXVsdGljYXN0IGZyYW1lcworICAgIHsKKyAgICAgICAgaGVhZGVyWzFdID0gMHhjOyAgICAgICAgICAgIC8vTUFDIGNvbnRyb2wsIGJhY2tvZmYgKyBub2FjaworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBoZWFkZXJbMV0gPSAweDg7ICAgICAgICAgICAgLy9NQUMgY29udHJvbCwgYmFja29mZiArIChhY2spCisgICAgfQorICAgIC8qIER1YWxiYW5kIE1hbmFnZW1lbnQgZnJhbWUgdHggUmF0ZSAqLworICAgIGlmICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9BUCkKKyAgICB7CisgICAgICAgIGlmICh3ZC0+ZnJlcXVlbmN5IDwgMzAwMCkKKyAgICAgICAgeworICAgICAgICAgICAgLyogQ0NLIDFNICovCisgICAgICAgICAgICBoZWFkZXJbMl0gPSAweDBmMDA7ICAgICAgICAgIC8vUEhZIGNvbnRyb2wgTAorICAgICAgICAgICAgaGVhZGVyWzNdID0gMHgwMDAwOyAgICAgICAgICAvL1BIWSBjb250cm9sIEgKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIENDSyA2TSAqLworICAgICAgICAgICAgaGVhZGVyWzJdID0gMHgwZjAxOyAgICAgICAgICAvL1BIWSBjb250cm9sIEwKKyAgICAgICAgICAgIGhlYWRlclszXSA9IDB4MDAwQjsgICAgICAgICAgLy9QSFkgY29udHJvbCBICisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYgKHdkLT5zdGEuY3VycmVudEZyZXF1ZW5jeSA8IDMwMDApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIENDSyAyTSAqLworICAgICAgICAgICAgaGVhZGVyWzJdID0gMHgwZjAwOyAgICAgICAgICAvL1BIWSBjb250cm9sIEwKKyAgICAgICAgICAgIGhlYWRlclszXSA9IDB4MDAwMTsgICAgICAgICAgLy9QSFkgY29udHJvbCBICisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvKiBDQ0sgNk0gKi8KKyAgICAgICAgICAgIGhlYWRlclsyXSA9IDB4MGYwMTsgICAgICAgICAgLy9QSFkgY29udHJvbCBMCisgICAgICAgICAgICBoZWFkZXJbM10gPSAweDAwMEI7ICAgICAgICAgIC8vUEhZIGNvbnRyb2wgSAorICAgICAgICB9CisgICAgfQorICAgIC8qIEdlbmVyYXRlIFdMQU4gaGVhZGVyICovCisgICAgLyogRnJhbWUgY29udHJvbCAqLworICAgIGhlYWRlcls0KzBdID0gZnJhbWVUeXBlOworICAgIC8qIER1cmF0aW9uICovCisgICAgaGVhZGVyWzQrMV0gPSAwOworCisgICAgaWYgKHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0lORlJBU1RSVUNUVVJFKQorICAgIHsKKyAgICAgICAgaWYgKCBmcmFtZVR5cGUgPT0gWk1fV0xBTl9GUkFNRV9UWVBFX1BST0JFUkVRICkKKyAgICAgICAgeworICAgICAgICAgICAgaGVhZGVyWzQrOF0gPSAweEZGRkY7CisgICAgICAgICAgICBoZWFkZXJbNCs5XSA9IDB4RkZGRjsKKyAgICAgICAgICAgIGhlYWRlcls0KzEwXSA9IDB4RkZGRjsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICggZnJhbWVUeXBlID09IFpNX1dMQU5fRlJBTUVfVFlQRV9CQSApIHsKKyAgICAgICAgICAgIC8qIGRvIG5vdGhpbmcgKi8KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGhlYWRlcls0KzhdID0gd2QtPnN0YS5ic3NpZFswXTsKKyAgICAgICAgICAgIGhlYWRlcls0KzldID0gd2QtPnN0YS5ic3NpZFsxXTsKKyAgICAgICAgICAgIGhlYWRlcls0KzEwXSA9IHdkLT5zdGEuYnNzaWRbMl07CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAod2QtPndsYW5Nb2RlID09IFpNX01PREVfUFNFVURPKQorICAgIHsKKyAgICAgICAgLyogQWRkcmVzcyAzID0gMDA6MDA6MDA6MDA6MDA6MDAgKi8KKyAgICAgICAgaGVhZGVyWzQrOF0gPSAwOworICAgICAgICBoZWFkZXJbNCs5XSA9IDA7CisgICAgICAgIGhlYWRlcls0KzEwXSA9IDA7CisgICAgfQorICAgIGVsc2UgaWYgKHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0lCU1MpCisgICAgeworICAgICAgICBoZWFkZXJbNCs4XSA9IHdkLT5zdGEuYnNzaWRbMF07CisgICAgICAgIGhlYWRlcls0KzldID0gd2QtPnN0YS5ic3NpZFsxXTsKKyAgICAgICAgaGVhZGVyWzQrMTBdID0gd2QtPnN0YS5ic3NpZFsyXTsKKworICAgICAgICBpZiAoIGZyYW1lVHlwZSA9PSBaTV9XTEFOX0ZSQU1FX1RZUEVfQVRJTSApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIHB1dCBBVElNIHRvIHF1ZXVlIDV0aCAqLworICAgICAgICAgICAgLy9oZWFkZXJbMl0gfD0gKFpNX0JJVF8xM3xaTV9CSVRfMTQpOworICAgICAgICAgICAgaGVhZGVyWzJdIHw9IFpNX0JJVF8xNTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9BUCkKKyAgICB7CisgICAgICAgIC8qIEFkZHJlc3MgMyA9IEJTU0lEICovCisgICAgICAgIGhlYWRlcls0KzhdID0gd2QtPm1hY0FkZHJbMF07CisgICAgICAgIGhlYWRlcls0KzldID0gd2QtPm1hY0FkZHJbMV07CisjaWZkZWYgWk1fVkFQTU9ERV9NVUxUSUxFX1NTSUQKKyAgICAgICAgaGVhZGVyWzQrMTBdID0gd2QtPm1hY0FkZHJbMl07IC8vTXVsdGlwbGUgU1NJRAorI2Vsc2UKKyAgICAgICAgaGVhZGVyWzQrMTBdID0gd2QtPm1hY0FkZHJbMl0gKyAodmFwPDw4KTsgLy9WQVAKKyNlbmRpZgorICAgICAgICAvL2lmIGluIHNjYW4sIG11c3Qgc2V0IGFkZHJlc3MgMyB0byBicm9hZGNhc3QgYmVjYXVzZSBvZiBzb21lIGFwIHdvdWxkIGNhcmUgdGhpcworICAgICAgICAvL2lmICgod2QtPmhlYXJ0QmVhdE5vdGlmaWNhdGlvbiAmIFpNX0JTU0lEX0xJU1RfU0NBTikKKyAgICAgICAgLy8gICAgICAgID09IFpNX0JTU0lEX0xJU1RfU0NBTikKKyAgICAgICAgLy9pZiBGcmFtZVR5cGUgaXMgUHJvYmUgUmVxdWVzdCwgQWRkcmVzczMgc2hvdWxkIGJlIGJvcmFkY2FzdAorICAgICAgICBpZiAoZnJhbWVUeXBlID09IFpNX1dMQU5fRlJBTUVfVFlQRV9QUk9CRVJFUSkKKyAgICAgICAgeworICAgICAgICAgICAgaGVhZGVyWzQrOF0gPSAweEZGRkY7CisgICAgICAgICAgICBoZWFkZXJbNCs5XSA9IDB4RkZGRjsKKyAgICAgICAgICAgIGhlYWRlcls0KzEwXSA9IDB4RkZGRjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIEFkZHJlc3MgMSA9IERBICovCisgICAgaGVhZGVyWzQrMl0gPSBkc3RbMF07CisgICAgaGVhZGVyWzQrM10gPSBkc3RbMV07CisgICAgaGVhZGVyWzQrNF0gPSBkc3RbMl07CisKKyAgICAvKiBBZGRyZXNzIDIgPSBTQSAqLworICAgIGhlYWRlcls0KzVdID0gd2QtPm1hY0FkZHJbMF07CisgICAgaGVhZGVyWzQrNl0gPSB3ZC0+bWFjQWRkclsxXTsKKyAgICBpZiAod2QtPndsYW5Nb2RlID09IFpNX01PREVfQVApCisgICAgeworI2lmZGVmIFpNX1ZBUE1PREVfTVVMVElMRV9TU0lECisgICAgICAgIGhlYWRlcls0KzddID0gd2QtPm1hY0FkZHJbMl07IC8vTXVsdGlwbGUgU1NJRAorI2Vsc2UKKyAgICAgICAgaGVhZGVyWzQrN10gPSB3ZC0+bWFjQWRkclsyXSArICh2YXA8PDgpOyAvL1ZBUAorI2VuZGlmCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGhlYWRlcls0KzddID0gd2QtPm1hY0FkZHJbMl07CisgICAgfQorCisgICAgLyogU2VxdWVuY2UgQ29udHJvbCAqLworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgaGVhZGVyWzQrMTFdID0gKCh3ZC0+bW1zZXErKyk8PDQpOworICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICBpZiggZnJhbWVUeXBlID09IFpNX1dMQU5fRlJBTUVfVFlQRV9RT1NfTlVMTCApCisgICAgeworICAgICAgICAvKlFvcyBDb250cm9sKi8KKyAgICAgICAgaGVhZGVyWzQrMTJdID0gMHgwOworICAgICAgICBobGVuKz0yOworICAgICAgICBoZWFkZXJbMF0rPTI7CisgICAgfQorCisgICAgaWYgKCBlbmNyeXB0ICkKKyAgICB7CisgICAgICAgIGlmICggd2QtPnN0YS53ZXBTdGF0dXMgPT0gWk1fRU5DUllQVElPTl9XRVBfRU5BQkxFRCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggKHdkLT5zdGEuZW5jcnlNb2RlID09IFpNX1dFUDY0KXx8CisgICAgICAgICAgICAgICAgICh3ZC0+c3RhLmVuY3J5TW9kZSA9PSBaTV9XRVAxMjgpfHwKKyAgICAgICAgICAgICAgICAgKHdkLT5zdGEuZW5jcnlNb2RlID09IFpNX1dFUDI1NikgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGhlYWRlcls0XSB8PSAweDQwMDA7CisgICAgICAgICAgICAgICAgaGVhZGVyWzE2XSA9IDB4MDsgICAvL0lWCisgICAgICAgICAgICAgICAgaGVhZGVyWzE3XSA9IDB4MDsgLy9JVgorICAgICAgICAgICAgICAgIGhlYWRlclsxN10gfD0gKCgodTE2X3QpIHdkLT5zdGEua2V5SWQpIDw8IDE0KTsKKyAgICAgICAgICAgICAgICBobGVuICs9IDQ7CisKKyAgICAgICAgICAgICAgICBoZWFkZXJbMF0gKz0gODsgICAgICAgICAvLyBpY3ZMZW4gPSA0OworICAgICAgICAgICAgICAgIGhlYWRlclsxXSB8PSAweDQwOyAgICAgIC8vIGVuYWJsZSBlbmNyeXB0aW9uIG9uIG1hY0N0cmwKKyAgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBFbmFibGUgSFcgZHVyYXRpb24KKyAgICBpZiAoIGZyYW1lVHlwZSAhPSBaTV9XTEFOX0ZSQU1FX1RZUEVfUFNQT0xMICkKKyAgICB7CisgICAgICAgIGhlYWRlclsxXSB8PSAweDIwMDsKKyAgICB9CisKKyAgICByZXR1cm4gaGxlbjsKK30KKwordm9pZCB6ZkluaXRNYWNBcE1vZGUoemRldl90KiBkZXYpCit7CisgICAgdTE2X3QgaTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHpmSHBFbmFibGVCZWFjb24oZGV2LCBaTV9NT0RFX0FQLCAod2QtPmJlYWNvbkludGVydmFsL3dkLT5hcC52YXBOdW1iZXIpLCAxLCAwKTsKKworICAgIC8qIEFQIG1vZGUgKi8KKyAgICB6ZkhwU2V0QXBTdGFNb2RlKGRldiwgWk1fSEFMXzgwMjExX01PREVfQVApOworCisgICAgLyogVkFQIHRlc3QgY29kZSAqLworICAgIC8qIEFQICsgVkFQIG1vZGUgKi8KKyAgICBpZiAod2QtPmFwLnZhcE51bWJlciA+PSAyKQorICAgIHsKKyAgICAgICAgZm9yIChpPTE7IGk8Wk1fTUFYX0FQX1NVUFBPUlQ7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCgod2QtPmFwLmFwQml0bWFwID4+IGkpICYgMHgxKSAhPSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHUxNl90IG1hY1szXTsKKyAgICAgICAgICAgICAgICBtYWNbMF0gPSB3ZC0+bWFjQWRkclswXTsKKyAgICAgICAgICAgICAgICBtYWNbMV0gPSB3ZC0+bWFjQWRkclsxXTsKKyNpZmRlZiBaTV9WQVBNT0RFX01VTFRJTEVfU1NJRAorICAgICAgICAgICAgICAgIG1hY1syXSA9IHdkLT5tYWNBZGRyWzJdOyAvL011bHRpcGxlIFNTSUQKKyNlbHNlCisgICAgICAgICAgICAgICAgbWFjWzJdID0gd2QtPm1hY0FkZHJbMl0gKyAoaTw8OCk7IC8vVkFQCisjZW5kaWYKKyAgICAgICAgICAgICAgICB6ZkhwU2V0TWFjQWRkcmVzcyhkZXYsIG1hYywgaSk7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGJhc2ljIHJhdGUgc2V0dGluZyAqLworICAgIHpmSHBTZXRCYXNpY1JhdGVTZXQoZGV2LCB3ZC0+YlJhdGVCYXNpYywgd2QtPmdSYXRlQmFzaWMpOworCisgICAgLyogU2V0IFR4UXMgQ1dNSU4sIENXTUFYLCBBSUZTIGFuZCBUWE8gdG8gV01FIEFQIGRlZmF1bHQuICovCisgICAgemZVcGRhdGVEZWZhdWx0UW9zUGFyYW1ldGVyKGRldiwgMSk7CisKKyAgICByZXR1cm47Cit9CisKK3UxNl90IHpmQ2hHZXROZXh0Q2hhbm5lbCh6ZGV2X3QqIGRldiwgdTE2X3QgZnJlcXVlbmN5LCB1OF90KiBwYlBhc3NpdmUpCit7CisgICAgdThfdCAgIGk7CisgICAgdThfdCAgIGJQYXNzaXZlOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgLyogQXZvaWQgTlVMTCB2YWx1ZSAqLworICAgIGlmICggcGJQYXNzaXZlID09IE5VTEwgKQorICAgIHsKKyAgICAgICAgcGJQYXNzaXZlID0gJmJQYXNzaXZlOworICAgIH0KKworICAgIGZvciggaT0wOyBpPHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsQ250OyBpKysgKQorICAgIHsKKyAgICAgICAgaWYgKCB3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbFtpXS5jaGFubmVsID09IGZyZXF1ZW5jeSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggaSA9PSAod2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxDbnQtMSkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGkgPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCB3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbFtpXS5jaGFubmVsRmxhZ3MKKyAgICAgICAgICAgICAgICAgICAgJiBaTV9SRUdfRkxBR19DSEFOTkVMX1BBU1NJVkUgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICpwYlBhc3NpdmUgPSBUUlVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICpwYlBhc3NpdmUgPSBGQUxTRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsW2ldLmNoYW5uZWw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMHhmZmZmOworfQorCit1MTZfdCB6ZkNoR2V0Rmlyc3RDaGFubmVsKHpkZXZfdCogZGV2LCB1OF90KiBwYlBhc3NpdmUpCit7CisgICAgdThfdCAgIGJQYXNzaXZlOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgLyogQXZvaWQgTlVMTCB2YWx1ZSAqLworICAgIGlmICggcGJQYXNzaXZlID09IE5VTEwgKQorICAgIHsKKyAgICAgICAgcGJQYXNzaXZlID0gJmJQYXNzaXZlOworICAgIH0KKworICAgaWYgKCB3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbFswXS5jaGFubmVsRmxhZ3MgJiBaTV9SRUdfRkxBR19DSEFOTkVMX1BBU1NJVkUgKQorICAgIHsKKyAgICAgICAgKnBiUGFzc2l2ZSA9IFRSVUU7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgICpwYlBhc3NpdmUgPSBGQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gd2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxbMF0uY2hhbm5lbDsKK30KKwordTE2X3QgemZDaEdldEZpcnN0MkdoekNoYW5uZWwoemRldl90KiBkZXYpCit7CisgICAgdThfdCAgICBpOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgZm9yKCBpPTA7IGk8d2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxDbnQ7IGkrKyApCisgICAgeworICAgICAgICBpZiAoIHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsW2ldLmNoYW5uZWwgPCAzMDAwICkKKyAgICAgICAgeworICAgICAgICAgICAgLyogZmluZCB0aGUgZmlyc3QgMkdoeiBjaGFubmVsICovCisgICAgICAgICAgICByZXR1cm4gd2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxbaV0uY2hhbm5lbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIENhbiBub3QgZmluZCBhbnkgMkdoeiBjaGFubmVsICovCisgICAgcmV0dXJuIDA7Cit9CisKK3UxNl90IHpmQ2hHZXRGaXJzdDVHaHpDaGFubmVsKHpkZXZfdCogZGV2KQoreworICAgIHU4X3QgICAgaTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIGZvciggaT0wOyBpPHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsQ250OyBpKysgKQorICAgIHsKKyAgICAgICAgaWYgKCB3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbFtpXS5jaGFubmVsID4gMzAwMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIGZpbmQgdGhlIGZpcnN0IDVHaHogY2hhbm5lbCAqLworICAgICAgICAgICAgcmV0dXJuIHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsW2ldLmNoYW5uZWw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBDYW4gbm90IGZpbmQgYW55IDVHaHogY2hhbm5lbCAqLworICAgIHJldHVybiAwOworfQorCit1MTZfdCB6ZkNoR2V0TGFzdENoYW5uZWwoemRldl90KiBkZXYsIHU4X3QqIHBiUGFzc2l2ZSkKK3sKKyAgICB1OF90ICAgYlBhc3NpdmU7CisgICAgdThfdCAgIENoYW5uZWxJbmRleDsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIENoYW5uZWxJbmRleCA9IHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsQ250LTE7CisKKyAgICAvKiBBdm9pZCBOVUxMIHZhbHVlICovCisgICAgaWYgKCBwYlBhc3NpdmUgPT0gTlVMTCApCisgICAgeworICAgICAgICBwYlBhc3NpdmUgPSAmYlBhc3NpdmU7CisgICAgfQorCisgICAgaWYgKCB3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbFtDaGFubmVsSW5kZXhdLmNoYW5uZWxGbGFncworICAgICAgICAgICAgJiBaTV9SRUdfRkxBR19DSEFOTkVMX1BBU1NJVkUgKQorICAgIHsKKyAgICAgICAgKnBiUGFzc2l2ZSA9IFRSVUU7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgICpwYlBhc3NpdmUgPSBGQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gd2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxbQ2hhbm5lbEluZGV4XS5jaGFubmVsOworfQorCit1MTZfdCB6ZkNoR2V0TGFzdDVHaHpDaGFubmVsKHpkZXZfdCogZGV2KQoreworICAgIHU4X3QgICAgaTsKKyAgICB1MTZfdCAgIGxhc3Q1R2h6ZnJlcXVlbmN5OworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgbGFzdDVHaHpmcmVxdWVuY3kgPSAwOworICAgIGZvciggaT0wOyBpPHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsQ250OyBpKysgKQorICAgIHsKKyAgICAgICAgaWYgKCB3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbFtpXS5jaGFubmVsID4gMzAwMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGxhc3Q1R2h6ZnJlcXVlbmN5ID0gd2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxbaV0uY2hhbm5lbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBsYXN0NUdoemZyZXF1ZW5jeTsKK30KKworLyogZnJlcUJhbmQgPSAwID0+IGF1dG8gY2hlY2sgICAqLworLyogICAgICAgICAgPSAxID0+IDIuNCBHSHogYmFuZCAqLworLyogICAgICAgICAgPSAyID0+IDUgR0h6IGJhbmQgICAqLwordTE2X3QgemZDaE51bVRvRnJlcSh6ZGV2X3QqIGRldiwgdThfdCBjaCwgdThfdCBmcmVxQmFuZCkKK3sKKyAgICB1MTZfdCBmcmVxID0gMHhmZmZmOworCisgICAgaWYgKCBmcmVxQmFuZCA9PSAwICkKKyAgICB7CisgICAgICAgIGlmIChjaCA+IDE0KQorICAgICAgICB7ICAgLyogYWRhcHRlciBpcyBhdCA1IEdIeiBiYW5kICovCisgICAgICAgICAgICBmcmVxQmFuZCA9IDI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBmcmVxQmFuZCA9IDE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIGZyZXFCYW5kID09IDIgKQorICAgIHsgICAvKiB0aGUgY2hhbm5lbCBiZWxvbmdzIHRvIDUgR0h6IGJhbmQgKi8KKyAgICAgICAgaWYgKCAoY2ggPj0gMTg0KSYmKGNoIDw9IDE5NikgKQorICAgICAgICB7CisgICAgICAgICAgICBmcmVxID0gNDAwMCArIGNoKjU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBmcmVxID0gNTAwMCArIGNoKjU7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsgICAvKiB0aGUgY2hhbm5lbCBiZWxvbmdzIHRvIDIuNCBHSHogYmFuZCAqLworICAgICAgICBpZiAoIGNoID09IDE0ICkKKyAgICAgICAgeworICAgICAgICAgICAgZnJlcSA9IFpNX0NIX0dfMTQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBmcmVxID0gWk1fQ0hfR18xICsgKGNoLTEpKjU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gZnJlcTsKK30KKwordThfdCB6ZkNoRnJlcVRvTnVtKHUxNl90IGZyZXEsIHU4X3QqIHBiSXM1R0JhbmQpCit7CisgICAgdThfdCAgIGNoOworICAgIHU4X3QgICBJczVHQmFuZDsKKworICAgIC8qIHRvIGF2b2lkIE5VTEwgdmFsdWUgKi8KKyAgICBpZiAoIHBiSXM1R0JhbmQgPT0gTlVMTCApCisgICAgeworICAgICAgICBwYklzNUdCYW5kID0gJklzNUdCYW5kOworICAgIH0KKworICAgICpwYklzNUdCYW5kID0gRkFMU0U7CisKKyAgICBpZiAoIGZyZXEgPT0gWk1fQ0hfR18xNCApCisgICAgeworICAgICAgICBjaCA9IDE0OworICAgIH0KKyAgICBlbHNlIGlmICggZnJlcSA8IDQwMDAgKQorICAgIHsKKyAgICAgICAgY2ggPSAoZnJlcSAtIFpNX0NIX0dfMSkgLyA1ICsgMTsKKyAgICB9CisgICAgZWxzZSBpZiAoIGZyZXEgPCA1MDAwICkKKyAgICB7CisgICAgICAgIGNoID0gKGZyZXEgLSA0MDAwKSAvIDU7CisgICAgICAgICpwYklzNUdCYW5kID0gVFJVRTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgY2ggPSAoZnJlcSAtIDUwMDApIC8gNTsKKyAgICAgICAgKnBiSXM1R0JhbmQgPSBUUlVFOworICAgIH0KKworICAgIHJldHVybiBjaDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9jbW0uYyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9jbW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzQzNzlkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2NtbS5jCkBAIC0wLDAgKzEsMjE0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNy0yMDA4IEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZHVsZSBOYW1lIDogbW0uYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQWJzdHJhY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBUaGlzIG1vZHVsZSBjb250YWlucyBjb21tb24gZnVuY3Rpb25zIGZvciBoYW5kbGUgbWFuYWdlbWVudCAgICAgKi8KKy8qICAgICAgZnJhbWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE5PVEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlICJjcHJlY29tcC5oIgorI2luY2x1ZGUgIi4uL2hhbC9ocHJlZy5oIgorCisvKiBUT0RPIDogcHV0IGFsbCBjb25zdGFudCB0YWJsZXMgdG8gYSBmaWxlICovCitjb25zdCB1OF90IHpnMTFiUmF0ZVRibFs0XSA9IHsyLCA0LCAxMSwgMjJ9OworY29uc3QgdThfdCB6ZzExZ1JhdGVUYmxbOF0gPSB7MTIsIDE4LCAyNCwgMzYsIDQ4LCA3MiwgOTYsIDEwOH07CisKKy8qIDB4ZmYgPT4gZWxlbWVudCBkb2VzIG5vdCBleGlzdCAqLworY29uc3QgdThfdCB6Z0VsZW1lbnRPZmZzZXRUYWJsZVtdID0KK3sKKyAgICA0LCAgICAgIC8qICAwIDogYXNvYyByZXEgKi8KKyAgICA2LCAgICAgIC8qICAxIDogYXNvYyByc3AgKi8KKyAgICAxMCwgICAgIC8qICAyIDogcmVhc29jIHJlcSovCisgICAgNiwgICAgICAvKiAgMyA6IHJlYXNvYyByc3AgKi8KKyAgICAwLCAgICAgIC8qICA0IDogcHJvYmUgcmVxICovCisgICAgMTIsICAgICAvKiAgNSA6IHByb2JlIHJzcCAqLworICAgIDB4ZmYsICAgLyogIDYgOiByZXNlcnZlZCAqLworICAgIDB4ZmYsICAgLyogIDcgOiByZXNlcnZlZCAqLworICAgIDEyLCAgICAgLyogIDggOiBiZWFjb24gKi8KKyAgICA0LCAgICAgIC8qICA5IDogQVRJTSAqLworICAgIDB4ZmYsICAgLyogMTAgOiBkaXNhc29jICovCisgICAgNiwgICAgICAvKiAxMSA6IGF1dGggKi8KKyAgICAweGZmLCAgIC8qIDEyIDogZGVhdXRoICovCisgICAgNCwgICAgICAvKiAxMyA6IGFjdGlvbiAqLworICAgIDB4ZmYsICAgLyogMTQgOiByZXNlcnZlZCAqLworICAgIDB4ZmYsICAgLyogMTUgOiByZXNlcnZlZCAqLworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmRmluZEVsZW1lbnQgICAgICAgICAgICAgICAqLworLyogICAgICBGaW5kIGEgc3BlY2lmaWMgZWxlbWVudCBpbiBtYW5hZ2VtZW50IGZyYW1lICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYnVmIDogbWFuYWdlbWVudCBmcmFtZSBidWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGVpZCA6IHRhcmdldCBlbGVtZW50IGlkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGJ5dGUgb2Zmc2V0IG9mIHRhcmdldCBlbGVtZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBvciAweGZmZmYgaWYgbm90IGZvdW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBTdGVwaGVuIENoZW4gICAgICAgIFp5REFTIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24gICAgMjAwNS4xMCAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTE2X3QgemZGaW5kRWxlbWVudCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHU4X3QgZWlkKQoreworICAgIHU4X3Qgc3ViVHlwZTsKKyAgICB1MTZfdCBvZmZzZXQ7CisgICAgdTE2X3QgYnVmTGVuOworICAgIHUxNl90IGVsZW47CisgICAgdThfdCBpZCwgSFRFaWQ9MDsKKyAgICB1OF90IG91aVs0XSA9IHsweDAwLCAweDUwLCAweGYyLCAweDAxfTsKKyAgICB1OF90IG91aTExblszXSA9IHsweDAwLDB4OTAsMHg0Q307CisgICAgdThfdCBIVFR5cGUgPSAwOworCisgICAgLyogR2V0IG9mZnNldCBvZiBmaXJzdCBlbGVtZW50ICovCisgICAgc3ViVHlwZSA9ICh6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCAwKSA+PiA0KTsKKyAgICBpZiAoKG9mZnNldCA9IHpnRWxlbWVudE9mZnNldFRhYmxlW3N1YlR5cGVdKSA9PSAweGZmKQorICAgIHsKKyAgICAgICAgem1fYXNzZXJ0KDApOworICAgIH0KKworICAgIC8qIFBsdXMgd2xhbiBoZWFkZXIgKi8KKyAgICBvZmZzZXQgKz0gMjQ7CisKKyAgICAvLyBqaGxlZSBIVCAwCisKKyAgICBpZiAoKGVpZCA9PSBaTV9XTEFOX0VJRF9IVF9DQVBBQklMSVRZKSB8fAorICAgICAgICAoZWlkID09IFpNX1dMQU5fRUlEX0VYVEVOREVEX0hUX0NBUEFCSUxJVFkpKQorICAgIHsKKyAgICAgICAgSFRFaWQgPSBlaWQ7CisgICAgICAgIGVpZCA9IFpNX1dMQU5fRUlEX1dQQV9JRTsKKyAgICAgICAgSFRUeXBlID0gMTsKKyAgICB9CisKKworICAgIGJ1ZkxlbiA9IHpmd0J1ZkdldFNpemUoZGV2LCBidWYpOworICAgIC8qIFNlYXJjaCBsb29wICovCisgICAgd2hpbGUgKChvZmZzZXQrMik8YnVmTGVuKSAgICAgICAgICAgICAgICAgICAvLyBpbmNsdWRpbmcgZWxlbWVudCBJRCBhbmQgbGVuZ3RoICgyYnl0ZXMpCisgICAgeworICAgICAgICAvKiBTZWFyY2ggdGFyZ2V0IGVsZW1lbnQgKi8KKyAgICAgICAgaWYgKChpZCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCkpID09IGVpZCkKKyAgICAgICAgeworICAgICAgICAgICAgLyogQmluZ28gKi8KKyAgICAgICAgICAgIGlmICgoZWxlbiA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxKSk+KGJ1ZkxlbiAtIG9mZnNldCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogRWxlbWVudCBsZW5ndGggZXJyb3IgKi8KKyAgICAgICAgICAgICAgICByZXR1cm4gMHhmZmZmOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIGVsZW4gPT0gMCAmJiBlaWQgIT0gWk1fV0xBTl9FSURfU1NJRCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBFbGVtZW50IGxlbmd0aCBlcnJvciAqLworICAgICAgICAgICAgICAgIHJldHVybiAweGZmZmY7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggZWlkID09IFpNX1dMQU5fRUlEX1dQQV9JRSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogYXZvaWQgc3RhIHRvIGJlIHRob3VnaHQgdXNlIDExbiB3aGVuIGZpbmQgYSBXUEFfSUUgKi8KKyAgICAgICAgICAgICAgICBpZiAoIChIVFR5cGUgPT0gMCkgJiYgemZSeEJ1ZmZlckVxdWFsVG9TdHIoZGV2LCBidWYsIG91aSwgb2Zmc2V0KzIsIDQpICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBvZmZzZXQ7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gamhsZWUgSFQgMAorICAgICAgICAgICAgICAgIC8vIENXWWFuZygrKQorCisgICAgICAgICAgICAgICAgaWYgKChIVFR5cGUgPT0gMSkgJiYgKCB6ZlJ4QnVmZmVyRXF1YWxUb1N0cihkZXYsIGJ1Ziwgb3VpMTFuLCBvZmZzZXQrMiwgMykgKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICggem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzUpID09IEhURWlkICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9mZnNldCArIDU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gb2Zmc2V0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8qIEFkdmFuY2UgdG8gbmV4dCBlbGVtZW50ICovCisgICAgICAgICNpZiAxCisgICAgICAgIGVsZW4gPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMSk7CisgICAgICAgICNlbHNlCisgICAgICAgIGlmICgoZWxlbiA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxKSkgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDB4ZmZmZjsKKyAgICAgICAgfQorICAgICAgICAjZW5kaWYKKworICAgICAgICBvZmZzZXQgKz0gKGVsZW4rMik7CisgICAgfQorICAgIHJldHVybiAweGZmZmY7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmRmluZFdpZmlFbGVtZW50ICAgICAgICAgICAqLworLyogICAgICBGaW5kIGEgc3BlY2lmaWMgV2lmaSBlbGVtZW50IGluIG1hbmFnZW1lbnQgZnJhbWUgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYnVmIDogbWFuYWdlbWVudCBmcmFtZSBidWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIHR5cGUgOiBPVUkgdHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBzdWJUeXBlIDogT1VJIHN1YnR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBieXRlIG9mZnNldCBvZiB0YXJnZXQgZWxlbWVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgb3IgMHhmZmZmIGlmIG5vdCBmb3VuZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiBDaGVuICAgICAgICBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgIDIwMDYuMSAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UxNl90IHpmRmluZFdpZmlFbGVtZW50KHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdThfdCB0eXBlLCB1OF90IHN1YnR5cGUpCit7CisgICAgdThfdCBzdWJUeXBlOworICAgIHUxNl90IG9mZnNldDsKKyAgICB1MTZfdCBidWZMZW47CisgICAgdTE2X3QgZWxlbjsKKyAgICB1OF90IGlkOworICAgIHU4X3QgdG1wOworCisgICAgLyogR2V0IG9mZnNldCBvZiBmaXJzdCBlbGVtZW50ICovCisgICAgc3ViVHlwZSA9ICh6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCAwKSA+PiA0KTsKKworICAgIGlmICgob2Zmc2V0ID0gemdFbGVtZW50T2Zmc2V0VGFibGVbc3ViVHlwZV0pID09IDB4ZmYpCisgICAgeworICAgICAgICB6bV9hc3NlcnQoMCk7CisgICAgfQorCisgICAgLyogUGx1cyB3bGFuIGhlYWRlciAqLworICAgIG9mZnNldCArPSAyNDsKKworICAgIGJ1ZkxlbiA9IHpmd0J1ZkdldFNpemUoZGV2LCBidWYpOworICAgIC8qIFNlYXJjaCBsb29wICovCisgICAgd2hpbGUgKChvZmZzZXQrMik8YnVmTGVuKSAgICAgICAgICAgICAgICAgICAvLyBpbmNsdWRpbmcgZWxlbWVudCBJRCBhbmQgbGVuZ3RoICgyYnl0ZXMpCisgICAgeworICAgICAgICAvKiBTZWFyY2ggdGFyZ2V0IGVsZW1lbnQgKi8KKyAgICAgICAgaWYgKChpZCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCkpID09IFpNX1dMQU5fRUlEX1dJRklfSUUpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIEJpbmdvICovCisgICAgICAgICAgICBpZiAoKGVsZW4gPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMSkpPihidWZMZW4gLSBvZmZzZXQpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIEVsZW1lbnQgbGVuZ3RoIGVycm9yICovCisgICAgICAgICAgICAgICAgcmV0dXJuIDB4ZmZmZjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBlbGVuID09IDAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAweGZmZmY7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICgoKHRtcCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsyKSkgPT0gMHgwMCkKKyAgICAgICAgICAgICAgICAgICAgJiYgKCh0bXAgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMykpID09IDB4NTApCisgICAgICAgICAgICAgICAgICAgICYmICgodG1wID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzQpKSA9PSAweEYyKQorICAgICAgICAgICAgICAgICAgICAmJiAoKHRtcCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCs1KSkgPT0gdHlwZSkpCisKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIHN1YnR5cGUgIT0gMHhmZiApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoICh0bXAgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrNikpID09IHN1YnR5cGUgICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9mZnNldDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2Zmc2V0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvKiBBZHZhbmNlIHRvIG5leHQgZWxlbWVudCAqLworICAgICAgICBpZiAoKGVsZW4gPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMSkpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAweGZmZmY7CisgICAgICAgIH0KKyAgICAgICAgb2Zmc2V0ICs9IChlbGVuKzIpOworICAgIH0KKyAgICByZXR1cm4gMHhmZmZmOworfQorCit1MTZfdCB6ZlJlbW92ZUVsZW1lbnQoemRldl90KiBkZXYsIHU4X3QqIGJ1ZiwgdTE2X3Qgc2l6ZSwgdThfdCBlaWQpCit7CisgICAgdTE2X3Qgb2Zmc2V0ID0gMDsKKyAgICB1MTZfdCBlbGVuOworICAgIHU4X3QgIEhURWlkID0gMDsKKyAgICB1OF90ICBvdWlbNF0gPSB7MHgwMCwgMHg1MCwgMHhmMiwgMHgwMX07CisgICAgdThfdCAgb3VpMTFuWzNdID0gezB4MDAsMHg5MCwweDRDfTsKKyAgICB1OF90ICBIVFR5cGUgPSAwOworCisgICAgaWYgKChlaWQgPT0gWk1fV0xBTl9FSURfSFRfQ0FQQUJJTElUWSkgfHwKKyAgICAgICAgKGVpZCA9PSBaTV9XTEFOX0VJRF9FWFRFTkRFRF9IVF9DQVBBQklMSVRZKSkKKyAgICB7CisgICAgICAgIEhURWlkID0gZWlkOworICAgICAgICBlaWQgPSBaTV9XTEFOX0VJRF9XUEFfSUU7CisgICAgICAgIEhUVHlwZSA9IDE7CisgICAgfQorCisgICAgd2hpbGUgKG9mZnNldCA8IHNpemUpCisgICAgeworICAgICAgICBlbGVuID0gKihidWYrb2Zmc2V0KzEpOworCisgICAgICAgIGlmICgqKGJ1ZitvZmZzZXQpID09IGVpZCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCBlaWQgPT0gWk1fV0xBTl9FSURfV1BBX0lFICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIChIVFR5cGUgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICYmICgqKGJ1ZitvZmZzZXQrMikgPT0gb3VpWzBdKQorICAgICAgICAgICAgICAgICAgICAgJiYgKCooYnVmK29mZnNldCszKSA9PSBvdWlbMV0pCisgICAgICAgICAgICAgICAgICAgICAmJiAoKihidWYrb2Zmc2V0KzQpID09IG91aVsyXSkKKyAgICAgICAgICAgICAgICAgICAgICYmICgqKGJ1ZitvZmZzZXQrNSkgPT0gb3VpWzNdKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB6Zk1lbW9yeU1vdmUoYnVmK29mZnNldCwgYnVmK29mZnNldCtlbGVuKzIsIHNpemUtb2Zmc2V0LWVsZW4tMik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAoc2l6ZS1lbGVuLTIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICggKEhUVHlwZSA9PSAxKQorICAgICAgICAgICAgICAgICAgICAmJiAoKihidWYrb2Zmc2V0KzIpID09IG91aTExblswXSkKKyAgICAgICAgICAgICAgICAgICAgJiYgKCooYnVmK29mZnNldCszKSA9PSBvdWkxMW5bMV0pCisgICAgICAgICAgICAgICAgICAgICYmICgqKGJ1ZitvZmZzZXQrNCkgPT0gb3VpMTFuWzJdKQorICAgICAgICAgICAgICAgICAgICAmJiAoKihidWYrb2Zmc2V0KzUpID09IEhURWlkKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB6Zk1lbW9yeU1vdmUoYnVmK29mZnNldCwgYnVmK29mZnNldCtlbGVuKzIsIHNpemUtb2Zmc2V0LWVsZW4tMik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAoc2l6ZS1lbGVuLTIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6Zk1lbW9yeU1vdmUoYnVmK29mZnNldCwgYnVmK29mZnNldCtlbGVuKzIsIHNpemUtb2Zmc2V0LWVsZW4tMik7CisgICAgICAgICAgICAgICAgcmV0dXJuIChzaXplLWVsZW4tMik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBvZmZzZXQgKz0gKGVsZW4rMik7CisgICAgfQorCisgICAgcmV0dXJuIHNpemU7Cit9CisKK3UxNl90IHpmVXBkYXRlRWxlbWVudCh6ZGV2X3QqIGRldiwgdThfdCogYnVmLCB1MTZfdCBzaXplLCB1OF90KiB1cGRhdGVlaWQpCit7CisgICAgdTE2X3Qgb2Zmc2V0ID0gMDsKKyAgICB1MTZfdCBlbGVuOworCisgICAgd2hpbGUgKG9mZnNldCA8IHNpemUpIHsKKyAgICAgICAgZWxlbiA9ICooYnVmK29mZnNldCsxKTsKKworICAgICAgICBpZiAoKihidWYrb2Zmc2V0KSA9PSB1cGRhdGVlaWRbMF0pIHsKKyAgICAgICAgICAgIGlmICh1cGRhdGVlaWRbMV0gPD0gZWxlbikgeworICAgICAgICAgICAgICAgIHpmTWVtb3J5TW92ZShidWYrb2Zmc2V0LCB1cGRhdGVlaWQsIHVwZGF0ZWVpZFsxXSsyKTsKKyAgICAgICAgICAgICAgICB6Zk1lbW9yeU1vdmUoYnVmK29mZnNldCt1cGRhdGVlaWRbMV0rMiwgYnVmK29mZnNldCtlbGVuKzIsIHNpemUtb2Zmc2V0LWVsZW4tMik7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gc2l6ZS0oZWxlbi11cGRhdGVlaWRbMV0pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB6Zk1lbW9yeU1vdmUoYnVmK29mZnNldCt1cGRhdGVlaWRbMV0rMiwgYnVmK29mZnNldCtlbGVuKzIsIHNpemUtb2Zmc2V0LWVsZW4tMik7CisgICAgICAgICAgICAgICAgemZNZW1vcnlNb3ZlKGJ1ZitvZmZzZXQsIHVwZGF0ZWVpZCwgdXBkYXRlZWlkWzFdKzIpOworCisgICAgICAgICAgICAgICAgcmV0dXJuIHNpemUrKHVwZGF0ZWVpZFsxXS1lbGVuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIG9mZnNldCArPSAoZWxlbisyKTsKKyAgICB9CisKKyAgICByZXR1cm4gc2l6ZTsKK30KKwordTE2X3QgemZGaW5kU3VwZXJHRWxlbWVudCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHU4X3QgdHlwZSkKK3sKKyAgICB1OF90IHN1YlR5cGU7CisgICAgdTE2X3Qgb2Zmc2V0OworICAgIHUxNl90IGJ1ZkxlbjsKKyAgICB1MTZfdCBlbGVuOworICAgIHU4X3QgaWQ7CisgICAgdThfdCBzdXBlcl9mZWF0dXJlOworICAgIHU4X3Qgb3VpU3VwZXJHWzZdID0gezB4MDAsMHgwMywweDdmLDB4MDEsIDB4MDEsIDB4MDB9OworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgLyogR2V0IG9mZnNldCBvZiBmaXJzdCBlbGVtZW50ICovCisgICAgc3ViVHlwZSA9ICh6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCAwKSA+PiA0KTsKKyAgICBpZiAoKG9mZnNldCA9IHpnRWxlbWVudE9mZnNldFRhYmxlW3N1YlR5cGVdKSA9PSAweGZmKQorICAgIHsKKyAgICAgICAgem1fYXNzZXJ0KDApOworICAgIH0KKworICAgIC8qIFBsdXMgd2xhbiBoZWFkZXIgKi8KKyAgICBvZmZzZXQgKz0gMjQ7CisKKyAgICBidWZMZW4gPSB6ZndCdWZHZXRTaXplKGRldiwgYnVmKTsKKyAgICAvKiBTZWFyY2ggbG9vcCAqLworICAgIHdoaWxlICgob2Zmc2V0KzIpPGJ1ZkxlbikgICAgICAgICAgICAgICAgICAgLy8gaW5jbHVkaW5nIGVsZW1lbnQgSUQgYW5kIGxlbmd0aCAoMmJ5dGVzKQorICAgIHsKKyAgICAgICAgLyogU2VhcmNoIHRhcmdldCBlbGVtZW50ICovCisgICAgICAgIGlmICgoaWQgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQpKSA9PSBaTV9XTEFOX0VJRF9WRU5ET1JfUFJJVkFURSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogQmluZ28gKi8KKyAgICAgICAgICAgIGlmICgoZWxlbiA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxKSk+KGJ1ZkxlbiAtIG9mZnNldCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogRWxlbWVudCBsZW5ndGggZXJyb3IgKi8KKyAgICAgICAgICAgICAgICByZXR1cm4gMHhmZmZmOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIGVsZW4gPT0gMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDB4ZmZmZjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHpmUnhCdWZmZXJFcXVhbFRvU3RyKGRldiwgYnVmLCBvdWlTdXBlckcsIG9mZnNldCsyLCA2KSAmJiAoIHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxKSA+PSA2KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBzdXBlcl9mZWF0dXJlIDA6dXNlRmFzdEZyYW1lLCAxOnVzZUNvbXByZXNzaW9uLCAyOnVzZVR1cmJvUHJpbWUgKi8KKyAgICAgICAgICAgICAgICBzdXBlcl9mZWF0dXJlPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrOCk7CisgICAgICAgICAgICAgICAgaWYgKChzdXBlcl9mZWF0dXJlICYgMHgwMSkgfHwgKHN1cGVyX2ZlYXR1cmUgJiAweDAyKSB8fCAoc3VwZXJfZmVhdHVyZSAmIDB4MDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9mZnNldDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLyogQWR2YW5jZSB0byBuZXh0IGVsZW1lbnQgKi8KKyAgICAgICAgI2lmIDEKKyAgICAgICAgZWxlbiA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxKTsKKyAgICAgICAgI2Vsc2UKKyAgICAgICAgaWYgKChlbGVuID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzEpKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gMHhmZmZmOworICAgICAgICB9CisgICAgICAgICNlbmRpZgorCisgICAgICAgIG9mZnNldCArPSAoZWxlbisyKTsKKyAgICB9CisgICAgcmV0dXJuIDB4ZmZmZjsKK30KKwordTE2X3QgemZGaW5kWFJFbGVtZW50KHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdThfdCB0eXBlKQoreworICAgIHU4X3Qgc3ViVHlwZTsKKyAgICB1MTZfdCBvZmZzZXQ7CisgICAgdTE2X3QgYnVmTGVuOworICAgIHUxNl90IGVsZW47CisgICAgdThfdCBpZDsKKyAgICB1OF90IG91aXhyWzZdID0gezB4MDAsMHgwMywweDdmLDB4MDMsIDB4MDEsIDB4MDB9OworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgLyogR2V0IG9mZnNldCBvZiBmaXJzdCBlbGVtZW50ICovCisgICAgc3ViVHlwZSA9ICh6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCAwKSA+PiA0KTsKKyAgICBpZiAoKG9mZnNldCA9IHpnRWxlbWVudE9mZnNldFRhYmxlW3N1YlR5cGVdKSA9PSAweGZmKQorICAgIHsKKyAgICAgICAgem1fYXNzZXJ0KDApOworICAgIH0KKworICAgIC8qIFBsdXMgd2xhbiBoZWFkZXIgKi8KKyAgICBvZmZzZXQgKz0gMjQ7CisKKyAgICBidWZMZW4gPSB6ZndCdWZHZXRTaXplKGRldiwgYnVmKTsKKyAgICAvKiBTZWFyY2ggbG9vcCAqLworICAgIHdoaWxlICgob2Zmc2V0KzIpPGJ1ZkxlbikgICAgICAgICAgICAgICAgICAgLy8gaW5jbHVkaW5nIGVsZW1lbnQgSUQgYW5kIGxlbmd0aCAoMmJ5dGVzKQorICAgIHsKKyAgICAgICAgLyogU2VhcmNoIHRhcmdldCBlbGVtZW50ICovCisgICAgICAgIGlmICgoaWQgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQpKSA9PSBaTV9XTEFOX0VJRF9WRU5ET1JfUFJJVkFURSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogQmluZ28gKi8KKyAgICAgICAgICAgIGlmICgoZWxlbiA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxKSk+KGJ1ZkxlbiAtIG9mZnNldCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogRWxlbWVudCBsZW5ndGggZXJyb3IgKi8KKyAgICAgICAgICAgICAgICByZXR1cm4gMHhmZmZmOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIGVsZW4gPT0gMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDB4ZmZmZjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHpmUnhCdWZmZXJFcXVhbFRvU3RyKGRldiwgYnVmLCBvdWl4ciwgb2Zmc2V0KzIsIDYpICYmICggem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzEpID49IDYpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBvZmZzZXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLyogQWR2YW5jZSB0byBuZXh0IGVsZW1lbnQgKi8KKyAgICAgICAgI2lmIDEKKyAgICAgICAgZWxlbiA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxKTsKKyAgICAgICAgI2Vsc2UKKyAgICAgICAgaWYgKChlbGVuID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzEpKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gMHhmZmZmOworICAgICAgICB9CisgICAgICAgICNlbmRpZgorCisgICAgICAgIG9mZnNldCArPSAoZWxlbisyKTsKKyAgICB9CisgICAgcmV0dXJuIDB4ZmZmZjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmTW1BZGRJZVN1cHBvcnRSYXRlICAgICAgICAqLworLyogICAgICBBZGQgaW5mb3JtYXRpb24gZWxlbWVudCBTdXBwb3J0IFJhdGUgdG8gYnVmZmVyLiAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYnVmIDogYnVmZmVyIHRvIGFkZCBpbmZvcm1hdGlvbiBlbGVtZW50ICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIG9mZnNldCA6IGFkZCBpbmZvcm1hdGlvbiBlbGVtZW50IGZyb20gdGhpcyBvZmZzZXQgICAgICAgICAgICAgICAqLworLyogICAgICBlaWQgOiBlbGVtZW50IElEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgcmF0ZVNldCA6ICBDQ0sgb3IgT0ZETSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYnVmZmVyIG9mZnNldCBhZnRlciBhZGRpbmcgaW5mb3JtYXRpb24gZWxlbWVudCAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiBDaGVuICAgICAgICBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgIDIwMDUuMTAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UxNl90IHpmTW1BZGRJZVN1cHBvcnRSYXRlKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3Qgb2Zmc2V0LCB1OF90IGVpZCwgdThfdCByYXRlU2V0KQoreworICAgIHU4X3QgbGVuID0gMDsKKyAgICB1MTZfdCBpOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgLy9pZiAoIChyYXRlU2V0ID09IFpNX1JBVEVfU0VUX09GRE0pJiYoKHdkLT5nUmF0ZSAmIDB4ZmYpID09IDApICkKKyAgICAvL3sKKyAgICAvLyAgICByZXR1cm4gb2Zmc2V0OworICAgIC8vfQorCisgICAgLyogSW5mb3JtYXRpb24gOiBTdXBwb3J0IFJhdGUgKi8KKyAgICBpZiAoIHJhdGVTZXQgPT0gWk1fUkFURV9TRVRfQ0NLICkKKyAgICB7CisgICAgICAgIGZvciAoaT0wOyBpPDQ7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCh3ZC0+YlJhdGUgJiAoMHgxPDxpKSkgPT0gKDB4MTw8aSkpCisgICAgICAgICAgICAvL2lmICgoMHhmICYgKDB4MTw8aSkpID09ICgweDE8PGkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrbGVuKzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemcxMWJSYXRlVGJsW2ldKygod2QtPmJSYXRlQmFzaWMgJiAoMHgxPDxpKSk8PCg3LWkpKSk7CisgICAgICAgICAgICAgICAgbGVuKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoIHJhdGVTZXQgPT0gWk1fUkFURV9TRVRfT0ZETSApCisgICAgeworICAgICAgICBmb3IgKGk9MDsgaTw4OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgod2QtPmdSYXRlICYgKDB4MTw8aSkpID09ICgweDE8PGkpKQorICAgICAgICAgICAgLy9pZiAoKDB4ZmYgJiAoMHgxPDxpKSkgPT0gKDB4MTw8aSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCtsZW4rMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ZzExZ1JhdGVUYmxbaV0rKCh3ZC0+Z1JhdGVCYXNpYyAmICgweDE8PGkpKTw8KDctaSkpKTsKKyAgICAgICAgICAgICAgICBsZW4rKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChsZW4gPiAwKQorICAgIHsKKyAgICAgICAgLyogRWxlbWVudCBJRCAqLworICAgICAgICB6bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0LCBlaWQpOworCisgICAgICAgIC8qIEVsZW1lbnQgTGVuZ3RoICovCisgICAgICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrMSwgbGVuKTsKKworICAgICAgICAvKiBSZXR1cm4gdmFsdWUgKi8KKyAgICAgICAgb2Zmc2V0ICs9ICgyK2xlbik7CisgICAgfQorCisgICAgcmV0dXJuIG9mZnNldDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmTW1BZGRJZURzICAgICAgICAgICAgICAgICAqLworLyogICAgICBBZGQgaW5mb3JtYXRpb24gZWxlbWVudCBEUyB0byBidWZmZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYnVmIDogYnVmZmVyIHRvIGFkZCBpbmZvcm1hdGlvbiBlbGVtZW50ICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIG9mZnNldCA6IGFkZCBpbmZvcm1hdGlvbiBlbGVtZW50IGZyb20gdGhpcyBvZmZzZXQgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGJ1ZmZlciBvZmZzZXQgYWZ0ZXIgYWRkaW5nIGluZm9ybWF0aW9uIGVsZW1lbnQgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFN0ZXBoZW4gQ2hlbiAgICAgICAgWnlEQVMgVGVjaG5vbG9neSBDb3Jwb3JhdGlvbiAgICAyMDA1LjEwICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MTZfdCB6Zk1tQWRkSWVEcyh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IG9mZnNldCkKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICAvKiBFbGVtZW50IElEICovCisgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCBaTV9XTEFOX0VJRF9EUyk7CisKKyAgICAvKiBFbGVtZW50IExlbmd0aCAqLworICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgMSk7CisKKyAgICAvKiBJbmZvcm1hdGlvbiA6IERTICovCisgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLAorICAgICAgICAgICAgICAgICAgICAgICAgIHpmQ2hGcmVxVG9OdW0od2QtPmZyZXF1ZW5jeSwgTlVMTCkpOworCisgICAgcmV0dXJuIG9mZnNldDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZNbUFkZEllRXJwICAgICAgICAgICAgICAgICovCisvKiAgICAgIEFkZCBpbmZvcm1hdGlvbiBlbGVtZW50IEVSUCB0byBidWZmZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGRldiA6IGRldmljZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBidWYgOiBidWZmZXIgdG8gYWRkIGluZm9ybWF0aW9uIGVsZW1lbnQgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgb2Zmc2V0IDogYWRkIGluZm9ybWF0aW9uIGVsZW1lbnQgZnJvbSB0aGlzIG9mZnNldCAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYnVmZmVyIG9mZnNldCBhZnRlciBhZGRpbmcgaW5mb3JtYXRpb24gZWxlbWVudCAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiBDaGVuICAgICAgICBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgIDIwMDUuMTAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UxNl90IHpmTW1BZGRJZUVycCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IG9mZnNldCkKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICAvKiBFbGVtZW50IElEICovCisgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCBaTV9XTEFOX0VJRF9FUlApOworCisgICAgLyogRWxlbWVudCBMZW5ndGggKi8KKyAgICB6bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIDEpOworCisgICAgLyogSW5mb3JtYXRpb24gOiBFUlAgKi8KKyAgICB6bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIHdkLT5lcnBFbGVtZW50KTsKKworICAgIHJldHVybiBvZmZzZXQ7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmTW1BZGRJZVdwYSAgICAgICAgICAgICAgICAqLworLyogICAgICBBZGQgaW5mb3JtYXRpb24gZWxlbWVudCBXUEEgdG8gYnVmZmVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYnVmIDogYnVmZmVyIHRvIGFkZCBpbmZvcm1hdGlvbiBlbGVtZW50ICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIG9mZnNldCA6IGFkZCBpbmZvcm1hdGlvbiBlbGVtZW50IGZyb20gdGhpcyBvZmZzZXQgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGJ1ZmZlciBvZmZzZXQgYWZ0ZXIgYWRkaW5nIGluZm9ybWF0aW9uIGVsZW1lbnQgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFl1YW4tR3UgV2VpICAgICAgICAgWnlEQVMgVGVjaG5vbG9neSBDb3Jwb3JhdGlvbiAgICAyMDA2LjIgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MTZfdCB6Zk1tQWRkSWVXcGEoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCBvZmZzZXQsIHUxNl90IGFwSWQpCit7CisgICAgLy9zdHJ1Y3QgenNXbGFuRGV2KiB3ZCA9IChzdHJ1Y3QgenNXbGFuRGV2Kikgem13X3dsYW5fZGV2KGRldik7CisgICAgaW50IGk7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICAvKiBFbGVtZW50IElEICovCisgICAgLy96bXdfaW50dHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIFpNX1dMQU5fRUlEX1dQQV9JRSk7CisKKyAgICAvKiBFbGVtZW50IExlbmd0aCAqLworICAgIC8vem13X2ludHR4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCB3ZC0+YXAud3BhTGVuKTsKKyAgICBmb3IoaSA9IDA7IGkgPCB3ZC0+YXAud3BhTGVuW2FwSWRdOyBpKyspCisgICAgeworICAgICAgICAvKiBJbmZvcm1hdGlvbiA6IFdQQSAqLworICAgICAgICB6bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIHdkLT5hcC53cGFJZVthcElkXVtpXSk7CisgICAgfQorCisgICAgcmV0dXJuIG9mZnNldDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmTW1BZGRIVENhcGFiaWxpdHkgICAgICAgICAqLworLyogICAgICBBZGQgSFQgQ2FwYWJpbGl0eSBJbmZvbWF0aW9uIHRvIGJ1ZmZlci4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYnVmIDogYnVmZmVyIHRvIGFkZCBpbmZvcm1hdGlvbiBlbGVtZW50ICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIG9mZnNldCA6IGFkZCBpbmZvcm1hdGlvbiBlbGVtZW50IGZyb20gdGhpcyBvZmZzZXQgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGJ1ZmZlciBvZmZzZXQgYWZ0ZXIgYWRkaW5nIGluZm9ybWF0aW9uIGVsZW1lbnQgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIENoYW8tV2VuIFlhbmcgICAgIFp5REFTIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24gICAgICAgMjAwNi4wNiAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MTZfdCB6Zk1tQWRkSFRDYXBhYmlsaXR5KHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3Qgb2Zmc2V0KQoreworICAgIHU4X3QgT1VJWzNdID0gezB4MCwweDkwLDB4NEN9OworICAgIHUxNl90IGk7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICAvKiBQcm9iIElEICovCisgICAgem13X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCBaTV9XTEFOX0VJRF9XUEFfSUUpOworCisgICAgaWYgKCB3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9BUCApCisgICAgeworICAgICAgICAvKiBFbGVtZW50IExlbmd0aCAqLworICAgICAgICB6bXdfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIHdkLT5hcC5IVENhcC5EYXRhLkxlbmd0aCArIDQpOworCisgICAgICAgIC8qIE9VSSBEYXRhICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHptd19idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgT1VJW2ldKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIEVsZW1lbnQgVHlwZSBJRCAqLworICAgICAgICB6bXdfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIHdkLT5hcC5IVENhcC5EYXRhLkVsZW1lbnRJRCk7CisKKyAgICAgICAgLyogSFQgQ2FwYWJpbGl0eSBEYXRhICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyNjsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICB6bXdfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIHdkLT5hcC5IVENhcC5CeXRlW2krMl0pOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qIEVsZW1lbnQgTGVuZ3RoICovCisgICAgICAgIHptd19idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgd2QtPnN0YS5IVENhcC5EYXRhLkxlbmd0aCArIDQpOworCisgICAgICAgIC8qIE9VSSBEYXRhICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHptd19idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgT1VJW2ldKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIEVsZW1lbnQgVHlwZSBJRCAqLworICAgICAgICB6bXdfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIHdkLT5zdGEuSFRDYXAuRGF0YS5FbGVtZW50SUQpOworCisgICAgICAgIC8qIEhUIENhcGFiaWxpdHkgRGF0YSAqLworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjY7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgem13X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCB3ZC0+c3RhLkhUQ2FwLkJ5dGVbaSsyXSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gb2Zmc2V0OworfQorCisKK3UxNl90IHpmTW1BZGRQcmVOSFRDYXBhYmlsaXR5KHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3Qgb2Zmc2V0KQoreworICAgIC8vdThfdCBPVUlbM10gPSB7MHgwLDB4OTAsMHg0Q307CisgICAgdTE2X3QgaTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIC8qIFByb2IgSUQgKi8KKyAgICB6bXdfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIFpNX1dMQU5fUFJFTjJfRUlEX0hUQ0FQQUJJTElUWSk7CisKKyAgICBpZiAoIHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0FQICkKKyAgICB7CisgICAgICAgIC8qIEVsZW1lbnQgTGVuZ3RoICovCisgICAgICAgIHptd19idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgd2QtPmFwLkhUQ2FwLkRhdGEuTGVuZ3RoKTsKKworICAgICAgICAvKiBIVCBDYXBhYmlsaXR5IERhdGEgKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDI2OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHptd19idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgd2QtPmFwLkhUQ2FwLkJ5dGVbaSsyXSk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogRWxlbWVudCBMZW5ndGggKi8KKyAgICAgICAgem13X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCB3ZC0+c3RhLkhUQ2FwLkRhdGEuTGVuZ3RoKTsKKworICAgICAgICAvKiBIVCBDYXBhYmlsaXR5IERhdGEgKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDI2OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHptd19idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgd2QtPnN0YS5IVENhcC5CeXRlW2krMl0pOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIG9mZnNldDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICB6Zk1tQWRkRXh0ZW5kZWRIVENhcGFiaWxpdHkgICAqLworLyogICAgICBBZGQgRXh0ZW5kZWQgSFQgQ2FwYWJpbGl0eSBJbmZvbWF0aW9uIHRvIGJ1ZmZlci4gICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYnVmIDogYnVmZmVyIHRvIGFkZCBpbmZvcm1hdGlvbiBlbGVtZW50ICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIG9mZnNldCA6IGFkZCBpbmZvcm1hdGlvbiBlbGVtZW50IGZyb20gdGhpcyBvZmZzZXQgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGJ1ZmZlciBvZmZzZXQgYWZ0ZXIgYWRkaW5nIGluZm9ybWF0aW9uIGVsZW1lbnQgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIENoYW8tV2VuIFlhbmcgICAgIFp5REFTIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24gICAgICAgMjAwNi4wNiAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MTZfdCB6Zk1tQWRkRXh0ZW5kZWRIVENhcGFiaWxpdHkoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCBvZmZzZXQpCit7CisgICAgdThfdCBPVUlbM10gPSB7MHgwLDB4OTAsMHg0Q307CisgICAgdTE2X3QgaTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIC8qIFByb2IgSUQgKi8KKyAgICB6bXdfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIFpNX1dMQU5fRUlEX1dQQV9JRSk7CisKKyAgICBpZiAoIHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0FQICkKKyAgICB7CisgICAgICAgIC8qIEVsZW1lbnQgTGVuZ3RoICovCisgICAgICAgIHptd19idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgd2QtPmFwLkV4dEhUQ2FwLkRhdGEuTGVuZ3RoICsgNCk7CisKKyAgICAgICAgLyogT1VJIERhdGEgKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgem13X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCBPVUlbaV0pOworICAgICAgICB9CisKKyAgICAgICAgLyogRWxlbWVudCBUeXBlIElEICovCisgICAgICAgIHptd19idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgd2QtPmFwLkV4dEhUQ2FwLkRhdGEuRWxlbWVudElEKTsKKworICAgICAgICAvKiBIVCBDYXBhYmlsaXR5IERhdGEgKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDIyOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHptd19idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgd2QtPmFwLkV4dEhUQ2FwLkJ5dGVbaSsyXSk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogRWxlbWVudCBMZW5ndGggKi8KKyAgICAgICAgem13X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCB3ZC0+c3RhLkV4dEhUQ2FwLkRhdGEuTGVuZ3RoICsgNCk7CisKKyAgICAgICAgLyogT1VJIERhdGEgKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgem13X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCBPVUlbaV0pOworICAgICAgICB9CisKKyAgICAgICAgLyogRWxlbWVudCBUeXBlIElEICovCisgICAgICAgIHptd19idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgd2QtPnN0YS5FeHRIVENhcC5EYXRhLkVsZW1lbnRJRCk7CisKKyAgICAgICAgLyogSFQgQ2FwYWJpbGl0eSBEYXRhICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyMjsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICB6bXdfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIHdkLT5zdGEuRXh0SFRDYXAuQnl0ZVtpKzJdKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBvZmZzZXQ7Cit9CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZTZW5kTW1GcmFtZSAgICAgICAgICAgICAgICovCisvKiAgICAgIFNlbmQgbWFuYWdlbWVudCBmcmFtZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGRldiA6IGRldmljZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBmcmFtZVR5cGUgOiBtYW5hZ2VtZW50IGZyYW1lIHR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZHN0IDogZGVzdGluYXRpb24gTUFDIGFkZHJlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIHAxIDogcGFyYW1ldGVyIDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBwMiA6IHBhcmFtZXRlciAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgcDMgOiBwYXJhbWV0ZXIgMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgbm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiBDaGVuICAgICAgICBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgIDIwMDUuMTAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIHByb2JlIHJlcSA6IHAxPT4gYldpdGhTU0lELCBwMj0+UiwgcDM9PlIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBwcm9iZSByc3AgOiBwMT0+UiwgcDI9PlIsIHAzPT5WQVAgSUQoQVApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogZGVhdXRoIDogcDE9PlJlYXNvbiBDb2RlLCBwMj0+UiwgcDM9PlZBUCBJRChBUCkgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERpc2Fzb2MgOiBwMT0+UmVhc29uIENvZGUsIHAyPT5SLCBwMz0+VkFQIElEKEFQKSAgICAgICAgICAgICAgICAgICAgICovCisvKiBBVElNIDogcDE9PlIsIHAyPT5SLCBwMz0+UiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogKHJlKWFzb2MgcnNwIDogcDE9PlN0YXR1cyBDb2RlLCBwMj0+QUlELCBwMz0+VkFQIElEKEFQKSAgICAgICAgICAgICAgKi8KKy8qIGFzb2MgcmVxIDogcDE9PlIsIHAyPT5SLCBwMz0+UiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiByZWFzb2MgcmVxIDogcDE9PkFQIE1BQ1swXSwgcDI9PkFQIE1BQ1sxXSwgcDM9PkFQIE1BQ1syXSAgICAgICAgICAgICAqLworLyogYXV0aCA6IHAxPT5sb3c9QWxnb3JpdGhtLCBoaWdoPVRyYW5zYWN0aW9uLCBwMj0+U3RhdHVzLCBwMz0+VkFQIElEICAgKi8KK3ZvaWQgemZTZW5kTW1GcmFtZSh6ZGV2X3QqIGRldiwgdThfdCBmcmFtZVR5cGUsIHUxNl90KiBkc3QsCisgICAgICAgICAgICAgICAgICAgdTMyX3QgcDEsIHUzMl90IHAyLCB1MzJfdCBwMykKK3sKKyAgICB6YnVmX3QqIGJ1ZjsKKyAgICAvL3UxNl90IGFkZHJUYmxTaXplOworICAgIC8vc3RydWN0IHpzQWRkclRibCBhZGRyVGJsOworICAgIHUxNl90IG9mZnNldCA9IDA7CisgICAgdTE2X3QgaGxlbiA9IDMyOworICAgIHUxNl90IGhlYWRlclsoMjQrMjUrMSkvMl07CisgICAgdTE2X3QgdmFwID0gMDsKKyAgICB1MTZfdCBpOworICAgIHU4X3QgZW5jcnlwdCA9IDA7CisgICAgdTE2X3QgYWlkOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICB6bV9tc2cyX21tKFpNX0xWXzIsICJTZW5kIG1tIGZyYW1lLCB0eXBlPSIsIGZyYW1lVHlwZSk7CisgICAgLyogVEJEIDogTWF4aW11bSBzaXplIG9mIG1hbmFnbWVudCBmcmFtZSAqLworICAgIGlmICgoYnVmID0gemZ3QnVmQWxsb2NhdGUoZGV2LCAxMDI0KSkgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIHptX21zZzBfbW0oWk1fTFZfMCwgIkFsbG9jIG1tIGJ1ZiBGYWlsISIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy9SZXNlcnZlIHJvb20gZm9yIHdsYW4gaGVhZGVyCisgICAgb2Zmc2V0ID0gaGxlbjsKKworICAgIHN3aXRjaCAoZnJhbWVUeXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBaTV9XTEFOX0ZSQU1FX1RZUEVfUFJPQkVSRVEgOgorICAgICAgICAgICAgb2Zmc2V0ID0gemZTZW5kUHJvYmVSZXEoZGV2LCBidWYsIG9mZnNldCwgKHU4X3QpIHAxKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgWk1fV0xBTl9GUkFNRV9UWVBFX1BST0JFUlNQIDoKKyAgICAgICAgICAgIHptX21zZzBfbW0oWk1fTFZfMywgInByb2JlIHJzcCIpOworICAgICAgICAgICAgLyogMjQtMzEgVGltZSBTdGFtcCA6IGhhcmR3YXJlIFdPTidUIGZpbGwgdGhpcyBmaWVsZCAqLworICAgICAgICAgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCwgMCk7CisgICAgICAgICAgICB6bXdfdHhfYnVmX3dyaXRlaChkZXYsIGJ1Ziwgb2Zmc2V0KzIsIDApOworICAgICAgICAgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCs0LCAwKTsKKyAgICAgICAgICAgIHptd190eF9idWZfd3JpdGVoKGRldiwgYnVmLCBvZmZzZXQrNiwgMCk7CisgICAgICAgICAgICBvZmZzZXQrPTg7CisKKyAgICAgICAgICAgIC8qIEJlYWNvbiBJbnRlcnZhbCAqLworICAgICAgICAgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCwgd2QtPmJlYWNvbkludGVydmFsKTsKKyAgICAgICAgICAgIG9mZnNldCs9MjsKKworICAgICAgICAgICAgaWYgKHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0FQKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhcCA9ICh1MTZfdCkgcDM7CisgICAgICAgICAgICAgICAgLyogQ2FwYWJpbGl0eSAqLworICAgICAgICAgICAgICAgIHptd190eF9idWZfd3JpdGVoKGRldiwgYnVmLCBvZmZzZXQsIHdkLT5hcC5jYXBhYlt2YXBdKTsKKyAgICAgICAgICAgICAgICBvZmZzZXQrPTI7CisgICAgICAgICAgICAgICAgLyogU1NJRCAqLworICAgICAgICAgICAgICAgIG9mZnNldCA9IHpmQXBBZGRJZVNzaWQoZGV2LCBidWYsIG9mZnNldCwgdmFwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBDYXBhYmlsaXR5ICovCisgICAgICAgICAgICAgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCB3ZC0+c3RhLmNhcGFiaWxpdHlbMF0pOworICAgICAgICAgICAgICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgd2QtPnN0YS5jYXBhYmlsaXR5WzFdKTsKKyAgICAgICAgICAgICAgICAvKiBTU0lEICovCisgICAgICAgICAgICAgICAgb2Zmc2V0ID0gemZTdGFBZGRJZVNzaWQoZGV2LCBidWYsIG9mZnNldCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIFN1cHBvcnQgUmF0ZSAqLworICAgICAgICAgICAgaWYgKCB3ZC0+ZnJlcXVlbmN5IDwgMzAwMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBvZmZzZXQgPSB6Zk1tQWRkSWVTdXBwb3J0UmF0ZShkZXYsIGJ1Ziwgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWk1fV0xBTl9FSURfU1VQUE9SVF9SQVRFLCBaTV9SQVRFX1NFVF9DQ0spOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG9mZnNldCA9IHpmTW1BZGRJZVN1cHBvcnRSYXRlKGRldiwgYnVmLCBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaTV9XTEFOX0VJRF9TVVBQT1JUX1JBVEUsIFpNX1JBVEVfU0VUX09GRE0pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBEUyBwYXJhbWV0ZXIgc2V0ICovCisgICAgICAgICAgICBvZmZzZXQgPSB6Zk1tQWRkSWVEcyhkZXYsIGJ1Ziwgb2Zmc2V0KTsKKworICAgICAgICAgICAgLyogVE9ETyChRyBJQlNTICovCisgICAgICAgICAgICBpZiAoIHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0lCU1MgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG9mZnNldCA9IHpmU3RhQWRkSWVJYnNzKGRldiwgYnVmLCBvZmZzZXQpOworCisgICAgICAgICAgICAgICAgaWYgKHdkLT5mcmVxdWVuY3kgPCAzMDAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoIHdkLT53ZmMuYklic3NHTW9kZQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHdkLT5zdXBwb3J0TW9kZSAmIChaTV9XSVJFTEVTU19NT0RFXzI0XzU0fFpNX1dJUkVMRVNTX01PREVfMjRfTikpICkgICAgLy8gT25seSBhY2NvbXBhbnkgd2l0aCBlbmFibGluZyBhIG1vZGUgLgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBFUlAgSW5mb3JtYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5lcnBFbGVtZW50ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IHpmTW1BZGRJZUVycChkZXYsIGJ1Ziwgb2Zmc2V0KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLyogRW5hYmxlIEcgTW9kZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgLyogRXh0ZW5kZWQgU3VwcG9ydGVkIFJhdGVzICovCisgICAgICAgICAgICAgICAgICAgCSAgICBvZmZzZXQgPSB6Zk1tQWRkSWVTdXBwb3J0UmF0ZShkZXYsIGJ1Ziwgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaTV9XTEFOX0VJRF9FWFRFTkRFRF9SQVRFLCBaTV9SQVRFX1NFVF9PRkRNKTsKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICBpZiAoKHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0FQKQorICAgICAgICAgICAgICAgICAmJiAod2QtPmFwLndsYW5UeXBlW3ZhcF0gIT0gWk1fV0xBTl9UWVBFX1BVUkVfQikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogRVJQIEluZm9ybWF0aW9uICovCisgICAgICAgICAgICAgICAgb2Zmc2V0ID0gemZNbUFkZEllRXJwKGRldiwgYnVmLCBvZmZzZXQpOworCisgICAgICAgICAgICAgICAgLyogRXh0ZW5kZWQgU3VwcG9ydGVkIFJhdGVzICovCisJCWlmICggd2QtPmZyZXF1ZW5jeSA8IDMwMDAgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvZmZzZXQgPSB6Zk1tQWRkSWVTdXBwb3J0UmF0ZShkZXYsIGJ1Ziwgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaTV9XTEFOX0VJRF9FWFRFTkRFRF9SQVRFLCBaTV9SQVRFX1NFVF9PRkRNKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogRVJQIEluZm9ybWF0aW9uICovCisgICAgICAgICAgICAvL29mZnNldCA9IHpmTW1BZGRJZUVycChkZXYsIGJ1Ziwgb2Zmc2V0KTsKKworICAgICAgICAgICAgLyogRXh0ZW5kZWQgU3VwcG9ydGVkIFJhdGVzICovCisgICAgICAgICAgICAvL29mZnNldCA9IHpmTW1BZGRJZVN1cHBvcnRSYXRlKGRldiwgYnVmLCBvZmZzZXQsCisgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFpNX1dMQU5fRUlEX0VYVEVOREVEX1JBVEUsIFpNX1JBVEVfU0VUX09GRE0pOworCisgICAgICAgICAgICAvKiBUT0RPIDogUlNOICovCisgICAgICAgICAgICBpZiAod2QtPndsYW5Nb2RlID09IFpNX01PREVfQVAgJiYgd2QtPmFwLndwYVN1cHBvcnRbdmFwXSA9PSAxKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG9mZnNldCA9IHpmTW1BZGRJZVdwYShkZXYsIGJ1Ziwgb2Zmc2V0LCB2YXApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoIHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0lCU1MgJiYgd2QtPnN0YS5hdXRoTW9kZSA9PSBaTV9BVVRIX01PREVfV1BBMlBTSykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvZmZzZXQgPSB6ZndTdGFBZGRJZVdwYVJzbihkZXYsIGJ1Ziwgb2Zmc2V0LCBaTV9XTEFOX0ZSQU1FX1RZUEVfQVVUSCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIFdNRSBQYXJhbWV0ZXJzICovCisgICAgICAgICAgICBpZiAod2QtPndsYW5Nb2RlID09IFpNX01PREVfQVApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHdkLT5hcC5xb3NNb2RlID09IDEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSB6ZkFwQWRkSWVXbWVQYXJhKGRldiwgYnVmLCBvZmZzZXQsIHZhcCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHdkLT53bGFuTW9kZSAhPSBaTV9NT0RFX0lCU1MgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gamhsZWUgSFQgMAorICAgICAgICAgICAgLy9DV1lhbmcoKykKKyAgICAgICAgICAgICAgICAvKiBUT0RPIDogTmVlZCB0byBjaGVjayBpZiBpdCBpcyBvayAqLworICAgICAgICAgICAgLyogSFQgQ2FwYWJpbGl0aWVzIEluZm8gKi8KKyAgICAgICAgICAgIG9mZnNldCA9IHpmTW1BZGRIVENhcGFiaWxpdHkoZGV2LCBidWYsIG9mZnNldCk7CisgICAgICAgICAgICAvL0NXWWFuZygrKQorICAgICAgICAgICAgLyogRXh0ZW5kZWQgSFQgQ2FwYWJpbGl0aWVzIEluZm8gKi8KKyAgICAgICAgICAgIG9mZnNldCA9IHpmTW1BZGRFeHRlbmRlZEhUQ2FwYWJpbGl0eShkZXYsIGJ1Ziwgb2Zmc2V0KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCB3ZC0+c3RhLmlic3NBZGRpdGlvbmFsSUVTaXplICkKKyAgICAgICAgICAgICAgICBvZmZzZXQgPSB6ZlN0YUFkZElic3NBZGRpdGlvbmFsSUUoZGV2LCBidWYsIG9mZnNldCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFpNX1dMQU5fRlJBTUVfVFlQRV9BVVRIIDoKKyAgICAgICAgICAgIGlmIChwMSA9PSAweDMwMDAxKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGhsZW4gKz0gNDsKKyAgICAgICAgICAgICAgICBvZmZzZXQgKz0gNDsgICAgICAgIC8vIGZvciByZXNlcnZpbmcgd2VwIGhlYWRlcgorICAgICAgICAgICAgICAgIGVuY3J5cHQgPSAxOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBBbGdvdHJpdGhtIE51bWJlciAqLworICAgICAgICAgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCwgKHUxNl90KShwMSYweGZmZmYpKTsKKyAgICAgICAgICAgIG9mZnNldCs9MjsKKworICAgICAgICAgICAgLyogVHJhbnNhY3Rpb24gTnVtYmVyICovCisgICAgICAgICAgICB6bXdfdHhfYnVmX3dyaXRlaChkZXYsIGJ1Ziwgb2Zmc2V0LCAodTE2X3QpKHAxPj4xNikpOworICAgICAgICAgICAgb2Zmc2V0Kz0yOworCisgICAgICAgICAgICAvKiBTdGF0dXMgQ29kZSAqLworICAgICAgICAgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCwgKHUxNl90KXAyKTsKKyAgICAgICAgICAgIG9mZnNldCs9MjsKKworICAgICAgICAgICAgaWYgKHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0FQKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhcCA9ICh1MTZfdCkgcDM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIENoYWxsZW5nZSBUZXh0ID0+IHNoYXJlLTIgb3Igc2hhcmUtMyAqLworICAgICAgICAgICAgaWYgKHAxID09IDB4MjAwMDEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHAyID09IDApIC8vU3RhdHVzID09IHN1Y2Nlc3MKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHptd19idWZfd3JpdGVoKGRldiwgYnVmLCBvZmZzZXQsIDB4ODAxMCk7CisgICAgICAgICAgICAgICAgICAgIG9mZnNldCs9MjsKKyAgICAgICAgICAgICAgICAgICAgLyogc2hhcmUtMiA6IEFQIGdlbmVyYXRlIGNoYWxsZW5nZSB0ZXh0ICovCisgICAgICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpPDEyODsgaSsrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+YXAuY2hhbGxlbmdlVGV4dFtpXSA9ICh1OF90KXpmR2V0UmFuZG9tTnVtYmVyKGRldiwgMCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgemZDb3B5VG9JbnRUeEJ1ZmZlcihkZXYsIGJ1Ziwgd2QtPmFwLmNoYWxsZW5nZVRleHQsIG9mZnNldCwgMTI4KTsKKyAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IDEyODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChwMSA9PSAweDMwMDAxKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIHNoYXJlLTMgOiBTVEEgcmV0dXJuIGNoYWxsZW5nZSBUZXh0ICovCisgICAgICAgICAgICAgICAgemZDb3B5VG9JbnRUeEJ1ZmZlcihkZXYsIGJ1Ziwgd2QtPnN0YS5jaGFsbGVuZ2VUZXh0LCBvZmZzZXQsIHdkLT5zdGEuY2hhbGxlbmdlVGV4dFsxXSsyKTsKKyAgICAgICAgICAgICAgICBvZmZzZXQgKz0gKHdkLT5zdGEuY2hhbGxlbmdlVGV4dFsxXSsyKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBaTV9XTEFOX0ZSQU1FX1RZUEVfQVNPQ1JFUSA6CisgICAgICAgIGNhc2UgWk1fV0xBTl9GUkFNRV9UWVBFX1JFQVNPQ1JFUSA6CisgICAgICAgICAgICAvKiBDYXBhYmlsaXR5ICovCisgICAgICAgICAgICB6bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIHdkLT5zdGEuY2FwYWJpbGl0eVswXSk7CisgICAgICAgICAgICB6bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIHdkLT5zdGEuY2FwYWJpbGl0eVsxXSk7CisKKyAgICAgICAgICAgIC8qIExpc3RlbiBJbnRlcnZhbCAqLworICAgICAgICAgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCwgMHgwMDA1KTsKKyAgICAgICAgICAgIG9mZnNldCs9MjsKKworICAgICAgICAgICAgLyogUmVhc3NvY2FpdGVkIFJlcXVlc3QgOiBDdXJyZW50IEFQIGFkZHJlc3MgKi8KKyAgICAgICAgICAgIGlmIChmcmFtZVR5cGUgPT0gWk1fV0xBTl9GUkFNRV9UWVBFX1JFQVNPQ1JFUSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHptd190eF9idWZfd3JpdGVoKGRldiwgYnVmLCBvZmZzZXQsIHdkLT5zdGEuYnNzaWRbMF0pOworICAgICAgICAgICAgICAgIG9mZnNldCs9MjsKKyAgICAgICAgICAgIHptd190eF9idWZfd3JpdGVoKGRldiwgYnVmLCBvZmZzZXQsIHdkLT5zdGEuYnNzaWRbMV0pOworICAgICAgICAgICAgICAgIG9mZnNldCs9MjsKKyAgICAgICAgICAgIHptd190eF9idWZfd3JpdGVoKGRldiwgYnVmLCBvZmZzZXQsIHdkLT5zdGEuYnNzaWRbMl0pOworICAgICAgICAgICAgICAgIG9mZnNldCs9MjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogU1NJRCAqLworICAgICAgICAgICAgb2Zmc2V0ID0gemZTdGFBZGRJZVNzaWQoZGV2LCBidWYsIG9mZnNldCk7CisKKworICAgICAgICAgICAgaWYgKCB3ZC0+c3RhLmN1cnJlbnRGcmVxdWVuY3kgPCAzMDAwICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBTdXBwb3J0IFJhdGUgKi8KKyAgICAgICAgICAgICAgICBvZmZzZXQgPSB6Zk1tQWRkSWVTdXBwb3J0UmF0ZShkZXYsIGJ1Ziwgb2Zmc2V0LCBaTV9XTEFOX0VJRF9TVVBQT1JUX1JBVEUsIFpNX1JBVEVfU0VUX0NDSyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogU3VwcG9ydCBSYXRlICovCisgICAgICAgICAgICAgICAgb2Zmc2V0ID0gemZNbUFkZEllU3VwcG9ydFJhdGUoZGV2LCBidWYsIG9mZnNldCwgWk1fV0xBTl9FSURfU1VQUE9SVF9SQVRFLCBaTV9SQVRFX1NFVF9PRkRNKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCh3ZC0+c3RhLmNhcGFiaWxpdHlbMV0gJiBaTV9CSVRfMCkgPT0gMSkKKyAgICAgICAgICAgIHsgICAvL3NwZWN0cnVtIG1hbmFnbWVudCBmbGFnIGVuYWJsZQorICAgICAgICAgICAgICAgIG9mZnNldCA9IHpmU3RhQWRkSWVQb3dlckNhcChkZXYsIGJ1Ziwgb2Zmc2V0KTsKKyAgICAgICAgICAgICAgICBvZmZzZXQgPSB6ZlN0YUFkZEllU3VwcG9ydENoKGRldiwgYnVmLCBvZmZzZXQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAod2QtPnN0YS5jdXJyZW50RnJlcXVlbmN5IDwgMzAwMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBFeHRlbmRlZCBTdXBwb3J0ZWQgUmF0ZXMgKi8KKyAgICAgICAgICAgICAgICBpZiAod2QtPnN1cHBvcnRNb2RlICYgKFpNX1dJUkVMRVNTX01PREVfMjRfNTR8Wk1fV0lSRUxFU1NfTU9ERV8yNF9OKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IHpmTW1BZGRJZVN1cHBvcnRSYXRlKGRldiwgYnVmLCBvZmZzZXQsIFpNX1dMQU5fRUlEX0VYVEVOREVEX1JBVEUsIFpNX1JBVEVfU0VUX09GRE0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAvL29mZnNldCA9IHpmU3RhQWRkSWVXcGFSc24oZGV2LCBidWYsIG9mZnNldCwgZnJhbWVUeXBlKTsKKyAgICAgICAgICAgIC8vTW92ZSB0byB3cmFwcGVyIGZ1bmN0aW9uLCBmb3IgT1MgZGlmZmVyZW5jZS0tQ1dZYW5nKG0pCisgICAgICAgICAgICAvL2ZvciB3aW5kb3dzIHdyYXBwZXIsIHpmd1N0YUFkZEllV3BhUnNuKCkgc2hvdWxkIGJlIGJlbG93OgorICAgICAgICAgICAgLy91MTZfdCB6ZndTdGFBZGRJZVdwYVJzbih6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IG9mZnNldCwgdThfdCBmcmFtZVR5cGUpCisgICAgICAgICAgICAvL3sKKyAgICAgICAgICAgIC8vICAgIHJldHVybiB6ZlN0YUFkZEllV3BhUnNuKGRldiwgYnVmLCBvZmZzZXQsIGZyYW1lVHlwZSk7CisgICAgICAgICAgICAvL30KKyAgICAgICAgICAgIG9mZnNldCA9IHpmd1N0YUFkZEllV3BhUnNuKGRldiwgYnVmLCBvZmZzZXQsIGZyYW1lVHlwZSk7CisKKyNpZmRlZiBaTV9FTkFCTEVfQ0VOQworICAgICAgICAgICAgLyogQ0VOQyAqLworICAgICAgICAgICAgLy9pZiAod2QtPnN0YS5lbmNyeU1vZGUgPT0gWk1fQ0VOQykKKyAgICAgICAgICAgIG9mZnNldCA9IHpmU3RhQWRkSWVDZW5jKGRldiwgYnVmLCBvZmZzZXQpOworI2VuZGlmIC8vWk1fRU5BQkxFX0NFTkMKKyAgICAgICAgICAgIGlmICgoKHdkLT5zdGEud21lRW5hYmxlZCAmIFpNX1NUQV9XTUVfRU5BQkxFX0JJVCkgIT0gMCkgLy9XTUUgZW5hYmxlZAorICAgICAgICAgICAgICAmJiAoKHdkLT5zdGEuYXBXbWVDYXBhYmlsaXR5ICYgMHgxKSAhPSAwKSkgLy9XTUUgQVAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKCh3ZC0+c3RhLmFwV21lQ2FwYWJpbGl0eSAmIDB4ODApICE9IDApIC8vVUFQU0QgQVAKKyAgICAgICAgICAgICAgICAgJiYgKCh3ZC0+c3RhLndtZUVuYWJsZWQgJiBaTV9TVEFfVUFQU0RfRU5BQkxFX0JJVCkgIT0gMCkpIC8vVUFQU0QgZW5hYmxlZAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gemZTdGFBZGRJZVdtZUluZm8oZGV2LCBidWYsIG9mZnNldCwgd2QtPnN0YS53bWVRb3NJbmZvKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gemZTdGFBZGRJZVdtZUluZm8oZGV2LCBidWYsIG9mZnNldCwgMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gamhsZWUgSFQgMAorICAgICAgICAgICAgLy9DV1lhbmcoKykKKyAgICAgICAgICAgIGlmICh3ZC0+c3RhLkVuYWJsZUhUICE9IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgI2lmbmRlZiBaTV9ESVNBQkxFX0FNU0RVOEtfU1VQUE9SVAorICAgICAgICAgICAgICAgICAgICAvL1N1cHBvcnQgOEsgQS1NU0RVCisgICAgICAgICAgICAgICAgICAgIGlmICh3ZC0+c3RhLndlcFN0YXR1cyA9PSBaTV9FTkNSWVBUSU9OX1dFUF9ESVNBQkxFRCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5IVENhcC5EYXRhLkh0Q2FwSW5mbyB8PSBIVENBUF9NYXhBTVNEVUxlbmd0aDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEuSFRDYXAuRGF0YS5IdENhcEluZm8gJj0gKH5IVENBUF9NYXhBTVNEVUxlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAjZWxzZQorICAgICAgICAgICAgICAgICAgICAvL1N1cHBvcnQgNEsgQS1NU0RVCisgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEuSFRDYXAuRGF0YS5IdENhcEluZm8gJj0gKH5IVENBUF9NYXhBTVNEVUxlbmd0aCk7CisgICAgICAgICAgICAgICAgI2VuZGlmCisKKyAgICAgICAgICAgICAgICAvKiBIVCBDYXBhYmlsaXRpZXMgSW5mbyAqLworICAgICAgICAgICAgICAgIGlmICh3ZC0+QmFuZFdpZHRoNDAgPT0gMSkgeworICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLkhUQ2FwLkRhdGEuSHRDYXBJbmZvIHw9IEhUQ0FQX1N1cENoYW5uZWxXaWR0aFNldDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEuSFRDYXAuRGF0YS5IdENhcEluZm8gJj0gfkhUQ0FQX1N1cENoYW5uZWxXaWR0aFNldDsKKyAgICAgICAgICAgICAgICAgICAgLy93ZC0+c3RhLkhUQ2FwLkRhdGEuSHRDYXBJbmZvIHw9IEhUQ0FQX1N1cENoYW5uZWxXaWR0aFNldDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB3ZC0+c3RhLkhUQ2FwLkRhdGEuQU1QRFVQYXJhbSAmPSB+SFRDQVBfTWF4UnhBTVBEVTM7CisgICAgICAgICAgICAgICAgd2QtPnN0YS5IVENhcC5EYXRhLkFNUERVUGFyYW0gfD0gSFRDQVBfTWF4UnhBTVBEVTM7CisgICAgICAgICAgICAgICAgd2QtPnN0YS5IVENhcC5EYXRhLk1DU1NldFsxXSA9IDB4RkY7IC8vIE1DUyA4IH4gMTUKKyAgICAgICAgICAgICAgICBvZmZzZXQgPSB6Zk1tQWRkSFRDYXBhYmlsaXR5KGRldiwgYnVmLCBvZmZzZXQpOworICAgICAgICAgICAgICAgIG9mZnNldCA9IHpmTW1BZGRQcmVOSFRDYXBhYmlsaXR5KGRldiwgYnVmLCBvZmZzZXQpOworICAgICAgICAgICAgICAgIC8vQ1dZYW5nKCspCisgICAgICAgICAgICAgICAgLyogRXh0ZW5kZWQgSFQgQ2FwYWJpbGl0aWVzIEluZm8gKi8KKyAgICAgICAgICAgICAgICAvL29mZnNldCA9IHpmTW1BZGRFeHRlbmRlZEhUQ2FwYWJpbGl0eShkZXYsIGJ1Ziwgb2Zmc2V0KTsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAvL1N0b3JlIGFzb2MgcmVxdWVzdCBmcmFtZSBib2R5LCBmb3IgVklTVEEgb25seQorICAgICAgICAgICAgd2QtPnN0YS5hc29jUmVxRnJhbWVCb2R5U2l6ZSA9ICgob2Zmc2V0IC0gaGxlbikgPgorICAgICAgICAgICAgICAgICAgICBaTV9DQUNIRURfRlJBTUVCT0RZX1NJWkUpPworICAgICAgICAgICAgICAgICAgICBaTV9DQUNIRURfRlJBTUVCT0RZX1NJWkU6KG9mZnNldCAtIGhsZW4pOworICAgICAgICAgICAgZm9yIChpPTA7IGk8d2QtPnN0YS5hc29jUmVxRnJhbWVCb2R5U2l6ZTsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdkLT5zdGEuYXNvY1JlcUZyYW1lQm9keVtpXSA9IHptd190eF9idWZfcmVhZGIoZGV2LCBidWYsIGkgKyBobGVuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgWk1fV0xBTl9GUkFNRV9UWVBFX0FTT0NSU1AgOgorICAgICAgICBjYXNlIFpNX1dMQU5fRlJBTUVfVFlQRV9SRUFTT0NSU1AgOgorICAgICAgICAgICAgdmFwID0gKHUxNl90KSBwMzsKKworICAgICAgICAgICAgLyogQ2FwYWJpbGl0eSAqLworICAgICAgICAgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCwgd2QtPmFwLmNhcGFiW3ZhcF0pOworICAgICAgICAgICAgb2Zmc2V0Kz0yOworCisgICAgICAgICAgICAvKiBTdGF0dXMgQ29kZSAqLworICAgICAgICAgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCwgKHUxNl90KXAxKTsKKyAgICAgICAgICAgIG9mZnNldCs9MjsKKworICAgICAgICAgICAgLyogQUlEICovCisgICAgICAgICAgICB6bXdfdHhfYnVmX3dyaXRlaChkZXYsIGJ1Ziwgb2Zmc2V0LCAodTE2X3QpKHAyfDB4YzAwMCkpOworICAgICAgICAgICAgb2Zmc2V0Kz0yOworCisKKyAgICAgICAgICAgIGlmICggd2QtPmZyZXF1ZW5jeSA8IDMwMDAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLyogU3VwcG9ydCBSYXRlICovCisgICAgICAgICAgICBvZmZzZXQgPSB6Zk1tQWRkSWVTdXBwb3J0UmF0ZShkZXYsIGJ1Ziwgb2Zmc2V0LCBaTV9XTEFOX0VJRF9TVVBQT1JUX1JBVEUsIFpNX1JBVEVfU0VUX0NDSyk7CisKKyAgICAgICAgICAgIC8qIEV4dGVuZGVkIFN1cHBvcnRlZCBSYXRlcyAqLworICAgICAgICAgICAgb2Zmc2V0ID0gemZNbUFkZEllU3VwcG9ydFJhdGUoZGV2LCBidWYsIG9mZnNldCwgWk1fV0xBTl9FSURfRVhURU5ERURfUkFURSwgWk1fUkFURV9TRVRfT0ZETSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogU3VwcG9ydCBSYXRlICovCisgICAgICAgICAgICAgICAgb2Zmc2V0ID0gemZNbUFkZEllU3VwcG9ydFJhdGUoZGV2LCBidWYsIG9mZnNldCwgWk1fV0xBTl9FSURfU1VQUE9SVF9SQVRFLCBaTV9SQVRFX1NFVF9PRkRNKTsKKyAgICAgICAgICAgIH0KKworCisKKyAgICAgICAgICAgIC8qIFdNRSBQYXJhbWV0ZXJzICovCisgICAgICAgICAgICBpZiAod2QtPndsYW5Nb2RlID09IFpNX01PREVfQVApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogVE9ETyA6IGlmIFdNRSBTVEEgdGhlbiBzZW5kIFdNRSBwYXJhbWV0ZXIgZWxlbWVudCAqLworICAgICAgICAgICAgICAgIGlmICh3ZC0+YXAucW9zTW9kZSA9PSAxKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gemZBcEFkZEllV21lUGFyYShkZXYsIGJ1Ziwgb2Zmc2V0LCB2YXApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIGpobGVlIEhUIDAKKyAgICAgICAgICAgIC8vQ1dZYW5nKCspCisgICAgICAgICAgICAvKiBIVCBDYXBhYmlsaXRpZXMgSW5mbyAqLworICAgICAgICAgICAgb2Zmc2V0ID0gemZNbUFkZEhUQ2FwYWJpbGl0eShkZXYsIGJ1Ziwgb2Zmc2V0KTsKKyAgICAgICAgICAgIC8vQ1dZYW5nKCspCisgICAgICAgICAgICAvKiBFeHRlbmRlZCBIVCBDYXBhYmlsaXRpZXMgSW5mbyAqLworICAgICAgICAgICAgb2Zmc2V0ID0gemZNbUFkZEV4dGVuZGVkSFRDYXBhYmlsaXR5KGRldiwgYnVmLCBvZmZzZXQpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBaTV9XTEFOX0ZSQU1FX1RZUEVfQVRJTSA6CisgICAgICAgICAgICAvKiBOVUxMIGZyYW1lICovCisgICAgICAgICAgICAvKiBUT0RPIDogYWRkIHR3byBkdW1iIGJ5dGVzIHRlbXBvcmFyaWx5ICovCisgICAgICAgICAgICBvZmZzZXQgKz0gMjsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgWk1fV0xBTl9GUkFNRV9UWVBFX1FPU19OVUxMIDoKKyAgICAgICAgICAgIHptd19idWZfd3JpdGVoKGRldiwgYnVmLCBvZmZzZXQsIDB4MDAxMCk7CisgICAgICAgICAgICBvZmZzZXQgKz0gMjsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgWk1fV0xBTl9EQVRBX0ZSQU1FIDoKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgWk1fV0xBTl9GUkFNRV9UWVBFX0RJU0FTT0MgOgorICAgICAgICBjYXNlIFpNX1dMQU5fRlJBTUVfVFlQRV9ERUFVVEggOgorICAgICAgICAgICAgaWYgKHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0FQKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICB2YXAgPSAodTE2X3QpIHAzOworCisgICAgICAgICAgICAgIGlmICgoYWlkID0gemZBcEZpbmRTdGEoZGV2LCBkc3QpKSAhPSAweGZmZmYpCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgICAgICAgICAgICAvKiBDbGVhciBTVEEgdGFibGUgKi8KKyAgICAgICAgICAgICAgICAgIHdkLT5hcC5zdGFUYWJsZVthaWRdLnZhbGlkID0gMDsKKworICAgICAgICAgICAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgICAgICAgICAgICAgICAgaWYgKHdkLT56ZmNiRGlzQXNvY05vdGlmeSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgIHdkLT56ZmNiRGlzQXNvY05vdGlmeShkZXYsICh1OF90Kilkc3QsIHZhcCk7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIFJlYXNvbiBDb2RlICovCisgICAgICAgICAgICB6bXdfdHhfYnVmX3dyaXRlaChkZXYsIGJ1Ziwgb2Zmc2V0LCAodTE2X3QpcDEpOworICAgICAgICAgICAgb2Zmc2V0Kz0yOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgemZ3QnVmU2V0U2l6ZShkZXYsIGJ1Ziwgb2Zmc2V0KTsKKworICAgIHptX21zZzJfbW0oWk1fTFZfMiwgIm1hbmFnZW1lbnQgZnJhbWUgYm9keSBzaXplPSIsIG9mZnNldC1obGVuKTsKKworICAgIC8vQ29weSB3bGFuIGhlYWRlcgorICAgIHpmVHhHZW5NbUhlYWRlcihkZXYsIGZyYW1lVHlwZSwgZHN0LCBoZWFkZXIsIG9mZnNldC1obGVuLCBidWYsIHZhcCwgZW5jcnlwdCk7CisgICAgZm9yIChpPTA7IGk8KGhsZW4+PjEpOyBpKyspCisgICAgeworICAgICAgICB6bXdfdHhfYnVmX3dyaXRlaChkZXYsIGJ1ZiwgaSoyLCBoZWFkZXJbaV0pOworICAgIH0KKworICAgIC8qIEdldCBidWZmZXIgRE1BIGFkZHJlc3MgKi8KKyAgICAvL2lmICgoYWRkclRibFNpemUgPSB6ZndCdWZNYXBEbWEoZGV2LCBidWYsICZhZGRyVGJsKSkgPT0gMCkKKyAgICAvL2lmICgoYWRkclRibFNpemUgPSB6ZndNYXBUeERtYShkZXYsIGJ1ZiwgJmFkZHJUYmwpKSA9PSAwKQorICAgIC8veworICAgIC8vICAgIGdvdG8gemxFcnJvcjsKKyAgICAvL30KKworICAgIHptX21zZzJfbW0oWk1fTFZfMiwgIm9mZnNldD0iLCBvZmZzZXQpOworICAgIHptX21zZzJfbW0oWk1fTFZfMiwgImhsZW49IiwgaGxlbik7CisgICAgLy96bV9tc2cyX21tKFpNX0xWXzIsICJhZGRyVGJsU2l6ZT0iLCBhZGRyVGJsU2l6ZSk7CisgICAgLy96bV9tc2cyX21tKFpNX0xWXzIsICJhZGRyVGJsLmxlblswXT0iLCBhZGRyVGJsLmxlblswXSk7CisgICAgLy96bV9tc2cyX21tKFpNX0xWXzIsICJhZGRyVGJsLnBoeXNBZGRybFswXT0iLCBhZGRyVGJsLnBoeXNBZGRybFswXSk7CisgICAgLy96bV9tc2cyX21tKFpNX0xWXzIsICJidWYtPmRhdGE9IiwgYnVmLT5kYXRhKTsKKworICAgICNpZiAwCisgICAgaWYgKChlcnIgPSB6ZkhwU2VuZChkZXYsIE5VTEwsIDAsIE5VTEwsIDAsIE5VTEwsIDAsIGJ1ZiwgMCwKKyAgICAgICAgICAgIFpNX0lOVEVSTkFMX0FMTE9DX0JVRiwgMCwgMHhmZikpICE9IFpNX1NVQ0NFU1MpCisgICAgeworICAgICAgICBnb3RvIHpsRXJyb3I7CisgICAgfQorICAgICNlbHNlCisgICAgemZQdXRWbW1xKGRldiwgYnVmKTsKKyAgICB6ZlB1c2hWdHhxKGRldik7CisgICAgI2VuZGlmCisKKyAgICByZXR1cm47CisjaWYgMAoremxFcnJvcjoKKworICAgIHpmd0J1ZkZyZWUoZGV2LCBidWYsIDApOworICAgIHJldHVybjsKKyNlbmRpZgorfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZlByb2Nlc3NNYW5hZ2VtZW50ICAgICAgICAgKi8KKy8qICAgICAgUHJvY2VzcyByZWNlaXZlZCBtYW5hZ2VtZW50IGZyYW1lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGJ1ZiA6IHJlY2VpdmVkIG1hbmFnZW1lbnQgZnJhbWUgYnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBub25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBTdGVwaGVuIENoZW4gICAgICAgIFp5REFTIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24gICAgMjAwNS4xMCAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB6ZlByb2Nlc3NNYW5hZ2VtZW50KHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1Ziwgc3RydWN0IHpzQWRkaXRpb25JbmZvKiBBZGRJbmZvKSAvL0NXWWFuZyhtKQoreworICAgIHU4X3QgZnJhbWVUeXBlOworICAgIHUxNl90IHRhWzNdOworICAgIHUxNl90IHJhWzNdOworICAgIHUxNl90IHZhcCA9IDAsIGluZGV4ID0gMDsKKyAgICAvL3UxNl90IGk7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICByYVswXSA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIDQpOworICAgIHJhWzFdID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgNik7CisgICAgcmFbMl0gPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCA4KTsKKworICAgIHRhWzBdID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMTApOworICAgIHRhWzFdID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMTIpOworICAgIHRhWzJdID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMTQpOworCisgICAgZnJhbWVUeXBlID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgMCk7CisKKyAgICBpZiAod2QtPndsYW5Nb2RlID09IFpNX01PREVfQVApCisgICAgeworI2lmIDEKKyAgICAgICAgdmFwID0gMDsKKyAgICAgICAgaWYgKChyYVswXSAmIDB4MSkgIT0gMSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogQVAgOiBGaW5kIHZpcnR1YWwgQVAgKi8KKyAgICAgICAgICAgIGlmICgoaW5kZXggPSB6ZkFwRmluZFN0YShkZXYsIHRhKSkgIT0gMHhmZmZmKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhcCA9IHdkLT5hcC5zdGFUYWJsZVtpbmRleF0udmFwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHptX21zZzJfbW0oWk1fTFZfMiwgInZhcD0iLCB2YXApOworI2VuZGlmCisKKyAgICAgICAgLyogRGlzcGF0Y2ggYnkgZnJhbWUgdHlwZSAqLworICAgICAgICBzd2l0Y2ggKGZyYW1lVHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIEJlYWNvbiAqLworICAgICAgICAgICAgY2FzZSBaTV9XTEFOX0ZSQU1FX1RZUEVfQkVBQ09OIDoKKyAgICAgICAgICAgICAgICB6ZkFwUHJvY2Vzc0JlYWNvbihkZXYsIGJ1Zik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgLyogQXV0aGVudGljYXRpb24gKi8KKyAgICAgICAgICAgIGNhc2UgWk1fV0xBTl9GUkFNRV9UWVBFX0FVVEggOgorICAgICAgICAgICAgICAgIHpmQXBQcm9jZXNzQXV0aChkZXYsIGJ1ZiwgdGEsIHZhcCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgLyogQXNzb2NpYXRpb24gcmVxdWVzdCAqLworICAgICAgICAgICAgY2FzZSBaTV9XTEFOX0ZSQU1FX1RZUEVfQVNPQ1JFUSA6CisgICAgICAgICAgICAgICAgLyogUmVhc3NvY2lhdGlvbiByZXF1ZXN0ICovCisgICAgICAgICAgICBjYXNlIFpNX1dMQU5fRlJBTUVfVFlQRV9SRUFTT0NSRVEgOgorICAgICAgICAgICAgICAgIHpmQXBQcm9jZXNzQXNvY1JlcShkZXYsIGJ1ZiwgdGEsIHZhcCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgLyogQXNzb2NpYXRpb24gcmVzcG9uc2UgKi8KKyAgICAgICAgICAgIGNhc2UgWk1fV0xBTl9GUkFNRV9UWVBFX0FTT0NSU1AgOgorICAgICAgICAgICAgICAgIC8vemZBcFByb2Nlc3NBc29jUnNwKGRldiwgYnVmKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAvKiBEZWF1dGhlbnRpY2F0aW9uICovCisgICAgICAgICAgICBjYXNlIFpNX1dMQU5fRlJBTUVfVFlQRV9ERUFVVEggOgorICAgICAgICAgICAgICAgIHpmQXBQcm9jZXNzRGVhdXRoKGRldiwgYnVmLCB0YSwgdmFwKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAvKiBEaXNhc3NvY2lhdGlvbiAqLworICAgICAgICAgICAgY2FzZSBaTV9XTEFOX0ZSQU1FX1RZUEVfRElTQVNPQyA6CisgICAgICAgICAgICAgICAgemZBcFByb2Nlc3NEaXNhc29jKGRldiwgYnVmLCB0YSwgdmFwKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAvKiBQcm9iZSByZXF1ZXN0ICovCisgICAgICAgICAgICBjYXNlIFpNX1dMQU5fRlJBTUVfVFlQRV9QUk9CRVJFUSA6CisgICAgICAgICAgICAgICAgemZQcm9jZXNzUHJvYmVSZXEoZGV2LCBidWYsIHRhKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAvKiBQcm9iZSByZXNwb25zZSAqLworICAgICAgICAgICAgY2FzZSBaTV9XTEFOX0ZSQU1FX1RZUEVfUFJPQkVSU1AgOgorICAgICAgICAgICAgICAgIHpmQXBQcm9jZXNzUHJvYmVSc3AoZGV2LCBidWYsIEFkZEluZm8pOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIC8qIEFjdGlvbiAqLworICAgICAgICAgICAgY2FzZSBaTV9XTEFOX0ZSQU1FX1RZUEVfQUNUSU9OIDoKKyAgICAgICAgICAgICAgICB6ZkFwUHJvY2Vzc0FjdGlvbihkZXYsIGJ1Zik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSAvL2lmICgod2QtPndsYW5Nb2RlID09IFpNX01PREVfSU5GUkFTVFJVQ1RVUkUpIHx8ICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9JQlNTKSkKKyAgICB7CisgICAgICAgIC8qIERpc3BhdGNoIGJ5IGZyYW1lIHR5cGUgKi8KKyAgICAgICAgc3dpdGNoIChmcmFtZVR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBCZWFjb24gKi8KKyAgICAgICAgICAgIGNhc2UgWk1fV0xBTl9GUkFNRV9UWVBFX0JFQUNPTiA6CisgICAgICAgICAgICAgICAgLyogaWYgZW5hYmxlIDgwMi4xMWggYW5kIGN1cnJlbnQgY2hhbmVsIGlzIHNpbGVudCBidXQgcmVjZWl2ZSBiZWFjb24gZnJvbSBvdGhlciBBUCAqLworICAgICAgICAgICAgICAgIGlmICgoKHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsW3dkLT5yZWd1bGF0aW9uVGFibGUuQ3VyQ2hJbmRleF0uY2hhbm5lbEZsYWdzCisgICAgICAgICAgICAgICAgICAgICAgICAmIFpNX1JFR19GTEFHX0NIQU5ORUxfQ1NBKSAhPSAwKSAmJiB3ZC0+c3RhLkRGU0VuYWJsZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsW3dkLT5yZWd1bGF0aW9uVGFibGUuQ3VyQ2hJbmRleF0uY2hhbm5lbEZsYWdzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJj0gfihaTV9SRUdfRkxBR19DSEFOTkVMX0NTQSAmIFpNX1JFR19GTEFHX0NIQU5ORUxfUEFTU0lWRSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHpmU3RhUHJvY2Vzc0JlYWNvbihkZXYsIGJ1ZiwgQWRkSW5mbyk7IC8vQ1dZYW5nKG0pCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgLyogQXV0aGVudGljYXRpb24gKi8KKyAgICAgICAgICAgIGNhc2UgWk1fV0xBTl9GUkFNRV9UWVBFX0FVVEggOgorICAgICAgICAgICAgICAgIC8qIFRPRE8gOiB2YXAgcGFyYW1ldGVyIGlzIHVzZWxlc3MgaW4gU1RBIG1vZGUsIGdldCByaWQgb2YgaXQgKi8KKyAgICAgICAgICAgICAgICB6ZlN0YVByb2Nlc3NBdXRoKGRldiwgYnVmLCB0YSwgMCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgLyogQXNzb2NpYXRpb24gcmVxdWVzdCAqLworICAgICAgICAgICAgY2FzZSBaTV9XTEFOX0ZSQU1FX1RZUEVfQVNPQ1JFUSA6CisgICAgICAgICAgICAgICAgLyogVE9ETyA6IHZhcCBwYXJhbWV0ZXIgaXMgdXNlbGVzcyBpbiBTVEEgbW9kZSwgZ2V0IHJpZCBvZiBpdCAqLworICAgICAgICAgICAgICAgIHpmU3RhUHJvY2Vzc0Fzb2NSZXEoZGV2LCBidWYsIHRhLCAwKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAvKiBBc3NvY2lhdGlvbiByZXNwb25zZSAqLworICAgICAgICAgICAgY2FzZSBaTV9XTEFOX0ZSQU1FX1RZUEVfQVNPQ1JTUCA6CisgICAgICAgICAgICAgICAgLyogUmVhc3NvY2lhdGlvbiByZXF1ZXN0ICovCisgICAgICAgICAgICBjYXNlIFpNX1dMQU5fRlJBTUVfVFlQRV9SRUFTT0NSU1AgOgorICAgICAgICAgICAgICAgIHpmU3RhUHJvY2Vzc0Fzb2NSc3AoZGV2LCBidWYpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIC8qIERlYXV0aGVudGljYXRpb24gKi8KKyAgICAgICAgICAgIGNhc2UgWk1fV0xBTl9GUkFNRV9UWVBFX0RFQVVUSCA6CisgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiRGVhdXRoZW50aWNhdGlvbiByZWNlaXZlZCIpOworICAgICAgICAgICAgICAgIHpmU3RhUHJvY2Vzc0RlYXV0aChkZXYsIGJ1Zik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgLyogRGlzYXNzb2NpYXRpb24gKi8KKyAgICAgICAgICAgIGNhc2UgWk1fV0xBTl9GUkFNRV9UWVBFX0RJU0FTT0MgOgorICAgICAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIkRpc2Fzc29jaWF0aW9uIHJlY2VpdmVkIik7CisgICAgICAgICAgICAgICAgemZTdGFQcm9jZXNzRGlzYXNvYyhkZXYsIGJ1Zik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgLyogUHJvYmUgcmVxdWVzdCAqLworICAgICAgICAgICAgY2FzZSBaTV9XTEFOX0ZSQU1FX1RZUEVfUFJPQkVSRVEgOgorICAgICAgICAgICAgICAgIHpmUHJvY2Vzc1Byb2JlUmVxKGRldiwgYnVmLCB0YSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgLyogUHJvYmUgcmVzcG9uc2UgKi8KKyAgICAgICAgICAgIGNhc2UgWk1fV0xBTl9GUkFNRV9UWVBFX1BST0JFUlNQIDoKKyAgICAgICAgICAgICAgICAvKiBpZiBlbmFibGUgODAyLjExaCBhbmQgY3VycmVudCBjaGFuZWwgaXMgc2lsZW50IGJ1dCByZWNlaXZlIHByb2JlIHJlc3BvbnNlIGZyb20gb3RoZXIgQVAgKi8KKyAgICAgICAgICAgICAgICBpZiAoKCh3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbFt3ZC0+cmVndWxhdGlvblRhYmxlLkN1ckNoSW5kZXhdLmNoYW5uZWxGbGFncworICAgICAgICAgICAgICAgICAgICAgICAgJiBaTV9SRUdfRkxBR19DSEFOTkVMX0NTQSkgIT0gMCkgJiYgd2QtPnN0YS5ERlNFbmFibGUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbFt3ZC0+cmVndWxhdGlvblRhYmxlLkN1ckNoSW5kZXhdLmNoYW5uZWxGbGFncworICAgICAgICAgICAgICAgICAgICAgICAgICAgICY9IH4oWk1fUkVHX0ZMQUdfQ0hBTk5FTF9DU0EgJiBaTV9SRUdfRkxBR19DSEFOTkVMX1BBU1NJVkUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB6ZlN0YVByb2Nlc3NQcm9iZVJzcChkZXYsIGJ1ZiwgQWRkSW5mbyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgWk1fV0xBTl9GUkFNRV9UWVBFX0FUSU06CisgICAgICAgICAgICAgICAgemZTdGFQcm9jZXNzQXRpbShkZXYsIGJ1Zik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgLyogQWN0aW9uICovCisgICAgICAgICAgICBjYXNlIFpNX1dMQU5fRlJBTUVfVFlQRV9BQ1RJT04gOgorICAgICAgICAgICAgICAgIHptX21zZzBfbW0oWk1fTFZfMiwgIlByb2Nlc3NBY3Rpb25NZ3RGcmFtZSIpOworICAgICAgICAgICAgICAgIHpmU3RhUHJvY2Vzc0FjdGlvbihkZXYsIGJ1Zik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZlByb2Nlc3NQcm9iZVJlcSAgICAgICAgICAgKi8KKy8qICAgICAgUHJvY2VzcyBwcm9iZSByZXF1ZXN0IG1hbmFnZW1lbnQgZnJhbWUuICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGJ1ZiA6IGF1dGggZnJhbWUgYnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIG5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFN0ZXBoZW4gQ2hlbiAgICAgICAgWnlEQVMgVGVjaG5vbG9neSBDb3Jwb3JhdGlvbiAgICAyMDA1LjEwICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHpmUHJvY2Vzc1Byb2JlUmVxKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3QqIHNyYykKK3sKKyAgICB1MTZfdCBvZmZzZXQ7CisgICAgdThfdCBsZW47CisgICAgdTE2X3QgaSwgajsKKyAgICB1OF90IGNoOworICAgIHUxNl90IHNlbmRGbGFnOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgLyogY2hlY2sgbW9kZSA6IEFQL0lCU1MgKi8KKyAgICBpZiAoKHdkLT53bGFuTW9kZSAhPSBaTV9NT0RFX0FQKSAmJiAod2QtPndsYW5Nb2RlICE9IFpNX01PREVfSUJTUykpCisgICAgeworICAgICAgICB6bV9tc2cwX21tKFpNX0xWXzMsICJJZ25vcmUgcHJvYmUgcmVxIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoKHdkLT53bGFuTW9kZSAhPSBaTV9NT0RFX0FQKSAmJiAod2QtPnN0YS5hZGFwdGVyU3RhdGUgPT0gWk1fU1RBX1NUQVRFX0RJU0NPTk5FQ1QpKQorICAgIHsKKyAgICAgICAgem1fbXNnMF9tbShaTV9MVl8zLCAiUGFja2V0cyBkcm9wcGVkIGR1ZSB0byBkaXNjb25uZWN0IHN0YXRlIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoIHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0lCU1MgKQorICAgIHsKKyAgICAgICAgemZTZW5kTW1GcmFtZShkZXYsIFpNX1dMQU5fRlJBTUVfVFlQRV9QUk9CRVJTUCwgc3JjLCAwLCAwLCAwKTsKKworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLyogY2hlY2sgU1NJRCAqLworICAgIGlmICgob2Zmc2V0ID0gemZGaW5kRWxlbWVudChkZXYsIGJ1ZiwgWk1fV0xBTl9FSURfU1NJRCkpID09IDB4ZmZmZikKKyAgICB7CisgICAgICAgIHptX21zZzBfbW0oWk1fTFZfMywgInByb2JlIHJlcSBTU0lEIG5vdCBmb3VuZCIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbGVuID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzEpOworCisgICAgZm9yIChpPTA7IGk8Wk1fTUFYX0FQX1NVUFBPUlQ7IGkrKykKKyAgICB7CisgICAgICAgIGlmICgod2QtPmFwLmFwQml0bWFwICYgKDE8PGkpKSAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgICB6bV9tc2cxX21tKFpNX0xWXzMsICJsZW49IiwgbGVuKTsKKyAgICAgICAgICAgIHNlbmRGbGFnID0gMDsKKyAgICAgICAgICAgIC8qIGJvYXJkY2FzdCBTU0lEICovCisgICAgICAgICAgICBpZiAobGVuID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHdkLT5hcC5oaWRlU3NpZFtpXSA9PSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc2VuZEZsYWcgPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIE5vdCBicm9hZGNhc3QgU1NJRCAqLworICAgICAgICAgICAgZWxzZSBpZiAod2QtPmFwLnNzaWRMZW5baV0gPT0gbGVuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvciAoaj0wOyBqPGxlbjsgaisrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChjaCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsyK2opKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICE9IHdkLT5hcC5zc2lkW2ldW2pdKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoaiA9PSBsZW4pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzZW5kRmxhZyA9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNlbmRGbGFnID09IDEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogU2VuZCBwcm9iZSByZXNwb25zZSAqLworICAgICAgICAgICAgICAgIHpmU2VuZE1tRnJhbWUoZGV2LCBaTV9XTEFOX0ZSQU1FX1RZUEVfUFJPQkVSU1AsIHNyYywgaSwgMCwgaSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZlByb2Nlc3NQcm9iZVJzcCAgICAgICAgICAgKi8KKy8qICAgICAgUHJvY2VzcyBwcm9iZSByZXNwb25zZSBtYW5hZ2VtZW50IGZyYW1lLiAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGJ1ZiA6IGF1dGggZnJhbWUgYnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEFkZEluZm8gOiBSeCBIZWFkZXIgYW5kIFJ4IE1hYyBTdGF0dXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBub25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBBcmVzcyBZYW5nICAgICAgICAgIFp5REFTIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24gICAgMjAwNi4xMSAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB6ZlByb2Nlc3NQcm9iZVJzcCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHN0cnVjdCB6c0FkZGl0aW9uSW5mbyogQWRkSW5mbykKK3sKKyAgICAvKiBHYXRoZXIgc2NhbiByZXN1bHQgKi8KKyAgICAvKiBQYXJzZSBUSU0gYW5kIHNlbmQgUFMtUE9MTCBpbiBwb3dlciBzYXZpbmcgbW9kZSAqLworICAgIHN0cnVjdCB6c1dsYW5Qcm9iZVJzcEZyYW1lSGVhZGVyKiAgcFByb2JlUnNwSGVhZGVyOworICAgIHN0cnVjdCB6c0Jzc0luZm8qIHBCc3NJbmZvOworICAgIHU4X3QgICBwQnVmW3NpemVvZihzdHJ1Y3QgenNXbGFuUHJvYmVSc3BGcmFtZUhlYWRlcildOworICAgIGludCAgICByZXM7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgemZDb3B5RnJvbVJ4QnVmZmVyKGRldiwgYnVmLCBwQnVmLCAwLAorICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IHpzV2xhblByb2JlUnNwRnJhbWVIZWFkZXIpKTsKKyAgICBwUHJvYmVSc3BIZWFkZXIgPSAoc3RydWN0IHpzV2xhblByb2JlUnNwRnJhbWVIZWFkZXIqKSBwQnVmOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIC8vem1fZGVidWdfbXNnMSgiYnNzIGNvdW50ID0gIiwgd2QtPnN0YS5ic3NMaXN0LmJzc0NvdW50KTsKKworICAgIHBCc3NJbmZvID0gemZTdGFGaW5kQnNzSW5mbyhkZXYsIGJ1ZiwgcFByb2JlUnNwSGVhZGVyKTsKKworICAgIC8vaWYgKCBpID09IHdkLT5zdGEuYnNzTGlzdC5ic3NDb3VudCApCisgICAgaWYgKCBwQnNzSW5mbyA9PSBOVUxMICkKKyAgICB7CisgICAgICAgIC8qIEFsbG9jYXRlIGEgbmV3IGVudHJ5IGlmIEJTUyBub3QgaW4gdGhlIHNjYW4gbGlzdCAqLworICAgICAgICBwQnNzSW5mbyA9IHpmQnNzSW5mb0FsbG9jYXRlKGRldik7CisgICAgICAgIGlmIChwQnNzSW5mbyAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICByZXMgPSB6ZlN0YUluaXRCc3NJbmZvKGRldiwgYnVmLCBwUHJvYmVSc3BIZWFkZXIsIHBCc3NJbmZvLCBBZGRJbmZvLCAwKTsKKyAgICAgICAgICAgIC8vemZEdW1wU1NJRChwQnNzSW5mby0+c3NpZFsxXSwgJihwQnNzSW5mby0+c3NpZFsyXSkpOworICAgICAgICAgICAgaWYgKCByZXMgIT0gMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgemZCc3NJbmZvRnJlZShkZXYsIHBCc3NJbmZvKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6ZkJzc0luZm9JbnNlcnRUb0xpc3QoZGV2LCBwQnNzSW5mbyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmVzID0gemZTdGFJbml0QnNzSW5mbyhkZXYsIGJ1ZiwgcFByb2JlUnNwSGVhZGVyLCBwQnNzSW5mbywgQWRkSW5mbywgMSk7CisgICAgICAgIGlmIChyZXMgPT0gMikKKyAgICAgICAgeworICAgICAgICAgICAgemZCc3NJbmZvUmVtb3ZlRnJvbUxpc3QoZGV2LCBwQnNzSW5mbyk7CisgICAgICAgICAgICB6ZkJzc0luZm9GcmVlKGRldiwgcEJzc0luZm8pOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCB3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9JQlNTICkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGlkeDsKKworICAgICAgICAgICAgLy8gSXQgd291bGQgcmVzZXQgdGhlIGFsaXZlIGNvdW50ZXIgaWYgdGhlIHBlZXIgc3RhdGlvbiBpcyBmb3VuZCEKKyAgICAgICAgICAgIHpmU3RhRmluZEZyZWVPcHBvc2l0ZShkZXYsICh1MTZfdCAqKXBCc3NJbmZvLT5tYWNhZGRyLCAmaWR4KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICByZXR1cm47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZlNlbmRQcm9iZVJlcSAgICAgICAgICAgICAgKi8KKy8qICAgICAgU2VuZCBwcm9iZSByZXF1ZXN0IG1hbmFnZW1lbnQgZnJhbWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIG5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIEppLUh1YW5nIExlZSAgICAgICAgWnlEQVMgVGVjaG5vbG9neSBDb3Jwb3JhdGlvbiAgICAyMDA1LjExICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3UxNl90IHpmU2VuZFByb2JlUmVxKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3Qgb2Zmc2V0LCB1OF90IGJXaXRoU1NJRCkKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworCisgICAgLyogU1NJRCAqLworICAgIGlmIChiV2l0aFNTSUQgPT0gMCkgIC8qIGJyb2FkY2FzdCBzc2lkICovCisgICAgeworICAgICAgICAvL3ptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgWk1fV0xBTl9FSURfU1NJRCk7CisgICAgICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgMCk7ICAgLyogbGVuZ3RoID0gMCAqLworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICBpZiAod2QtPndzLnByb2JpbmdTc2lkTGlzdFtiV2l0aFNTSUQtMV0uc3NpZExlbiA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICB6bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIFpNX1dMQU5fRUlEX1NTSUQpOworICAgICAgICAgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCAwKTsgICAvKiBsZW5ndGggPSAwICovCisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB6bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIFpNX1dMQU5fRUlEX1NTSUQpOworICAgICAgICAgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLAorICAgICAgICAgICAgICAgICAgICB3ZC0+d3MucHJvYmluZ1NzaWRMaXN0W2JXaXRoU1NJRC0xXS5zc2lkTGVuKTsKKyAgICAgICAgICAgIHpmQ29weVRvSW50VHhCdWZmZXIoZGV2LCBidWYsCisgICAgICAgICAgICAgICAgICAgIHdkLT53cy5wcm9iaW5nU3NpZExpc3RbYldpdGhTU0lELTFdLnNzaWQsCisgICAgICAgICAgICAgICAgICAgIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgd2QtPndzLnByb2JpbmdTc2lkTGlzdFtiV2l0aFNTSUQtMV0uc3NpZExlbik7IC8qIHNzaWQgKi8KKyAgICAgICAgICAgIG9mZnNldCArPSB3ZC0+d3MucHJvYmluZ1NzaWRMaXN0W2JXaXRoU1NJRC0xXS5zc2lkTGVuOworICAgICAgICB9CisgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgfQorCisgICAgLyogU3VwcG9ydGVkIHJhdGVzICovCisgICAgaWYgKCB3ZC0+c3RhLmN1cnJlbnRGcmVxdWVuY3kgPCAzMDAwICkKKyAgICB7ICAgLyogODAyLjExYitnICovCisgICAgICAgIG9mZnNldCA9IHpmTW1BZGRJZVN1cHBvcnRSYXRlKGRldiwgYnVmLCBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFpNX1dMQU5fRUlEX1NVUFBPUlRfUkFURSwgWk1fUkFURV9TRVRfQ0NLKTsKKworICAgICAgICBpZiAod2QtPnN1cHBvcnRNb2RlICYgKFpNX1dJUkVMRVNTX01PREVfMjRfNTR8Wk1fV0lSRUxFU1NfTU9ERV8yNF9OKSkgeworICAgICAgICAgICAgaWYgKHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0lCU1MpIHsKKyAgICAgICAgICAgICAgICBpZiAod2QtPndmYy5iSWJzc0dNb2RlKSB7CisgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IHpmTW1BZGRJZVN1cHBvcnRSYXRlKGRldiwgYnVmLCBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFpNX1dMQU5fRUlEX0VYVEVOREVEX1JBVEUsIFpNX1JBVEVfU0VUX09GRE0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgb2Zmc2V0ID0gemZNbUFkZEllU3VwcG9ydFJhdGUoZGV2LCBidWYsIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWk1fV0xBTl9FSURfRVhURU5ERURfUkFURSwgWk1fUkFURV9TRVRfT0ZETSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsgIC8qIDgwMi4xMWEgKi8KKyAgICAgICAgb2Zmc2V0ID0gemZNbUFkZEllU3VwcG9ydFJhdGUoZGV2LCBidWYsIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWk1fV0xBTl9FSURfU1VQUE9SVF9SQVRFLCBaTV9SQVRFX1NFVF9PRkRNKTsKKyAgICB9CisKKyAgICByZXR1cm4gb2Zmc2V0OworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZlVwZGF0ZURlZmF1bHRRb3NQYXJhbWV0ZXIgKi8KKy8qICAgICAgVXBkYXRlIFR4UXMgQ1dNSU4sIENXTUFYLCBBSUZTIGFuZCBUWE8gdG8gV01FIGRlZmF1bHQgdmFsdWUuICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIG1vZGUgOiAwPT5TVEEsIDE9PkFQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIG5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFN0ZXBoZW4gICAgICAgICAgICAgWnlEQVMgVGVjaG5vbG9neSBDb3Jwb3JhdGlvbiAgICAyMDA2LjYgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHpmVXBkYXRlRGVmYXVsdFFvc1BhcmFtZXRlcih6ZGV2X3QqIGRldiwgdThfdCBtb2RlKQoreworICAgIHUxNl90IGN3bWluWzVdOworICAgIHUxNl90IGN3bWF4WzVdOworICAgIHUxNl90IGFpZnNbNV07CisgICAgdTE2X3QgdHhvcFs1XTsKKworICAgIC8qIFdNTSBwYXJhbWV0ZXIgZm9yIFNUQSAqLworICAgIC8qIEJlc3QgRWZmb3IgKi8KKyAgICBjd21pblswXSA9IDE1OworICAgIGN3bWF4WzBdID0gMTAyMzsKKyAgICBhaWZzWzBdID0gMyAqIDkgKyAxMDsKKyAgICB0eG9wWzBdID0gMDsKKyAgICAvKiBCYWNrIEdyb3VuZCAqLworICAgIGN3bWluWzFdID0gMTU7CisgICAgY3dtYXhbMV0gPSAxMDIzOworICAgIGFpZnNbMV0gPSA3ICogOSArIDEwOworICAgIHR4b3BbMV0gPSAwOworICAgIC8qIFZJREVPICovCisgICAgY3dtaW5bMl0gPSA3OworICAgIGN3bWF4WzJdID0gMTU7CisgICAgYWlmc1syXSA9IDIgKiA5ICsgMTA7CisgICAgdHhvcFsyXSA9IDk0OworICAgIC8qIFZPSUNFICovCisgICAgY3dtaW5bM10gPSAzOworICAgIGN3bWF4WzNdID0gNzsKKyAgICBhaWZzWzNdID0gMiAqIDkgKyAxMDsKKyAgICB0eG9wWzNdID0gNDc7CisgICAgLyogU3BlY2lhbCBUeFEgKi8KKyAgICBjd21pbls0XSA9IDM7CisgICAgY3dtYXhbNF0gPSA3OworICAgIGFpZnNbNF0gPSAyICogOSArIDEwOworICAgIHR4b3BbNF0gPSAwOworCisgICAgLyogV01NIHBhcmFtZXRlciBmb3IgQVAgKi8KKyAgICBpZiAobW9kZSA9PSAxKQorICAgIHsKKyAgICAgICAgY3dtYXhbMF0gPSA2MzsKKyAgICAgICAgYWlmc1szXSA9IDEgKiA5ICsgMTA7CisgICAgICAgIGFpZnNbNF0gPSAxICogOSArIDEwOworICAgIH0KKyAgICB6ZkhwVXBkYXRlUW9zUGFyYW1ldGVyKGRldiwgY3dtaW4sIGN3bWF4LCBhaWZzLCB0eG9wKTsKK30KKwordTE2X3QgemZGaW5kQVRIRXh0Q2FwKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdThfdCB0eXBlLCB1OF90IHN1YnR5cGUpCit7CisgICAgdThfdCBzdWJUeXBlOworICAgIHUxNl90IG9mZnNldDsKKyAgICB1MTZfdCBidWZMZW47CisgICAgdTE2X3QgZWxlbjsKKyAgICB1OF90IGlkOworICAgIHU4X3QgdG1wOworCisgICAgLyogR2V0IG9mZnNldCBvZiBmaXJzdCBlbGVtZW50ICovCisgICAgc3ViVHlwZSA9ICh6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCAwKSA+PiA0KTsKKworICAgIGlmICgob2Zmc2V0ID0gemdFbGVtZW50T2Zmc2V0VGFibGVbc3ViVHlwZV0pID09IDB4ZmYpCisgICAgeworICAgICAgICB6bV9hc3NlcnQoMCk7CisgICAgfQorCisgICAgLyogUGx1cyB3bGFuIGhlYWRlciAqLworICAgIG9mZnNldCArPSAyNDsKKworICAgIGJ1ZkxlbiA9IHpmd0J1ZkdldFNpemUoZGV2LCBidWYpOworCisgICAgLyogU2VhcmNoIGxvb3AgKi8KKyAgICB3aGlsZSAoKG9mZnNldCsyKTxidWZMZW4pICAgICAgICAgICAgICAgICAgIC8vIGluY2x1ZGluZyBlbGVtZW50IElEIGFuZCBsZW5ndGggKDJieXRlcykKKyAgICB7CisgICAgICAgIC8qIFNlYXJjaCB0YXJnZXQgZWxlbWVudCAqLworICAgICAgICBpZiAoKGlkID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KSkgPT0gWk1fV0xBTl9FSURfV0lGSV9JRSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogQmluZ28gKi8KKyAgICAgICAgICAgIGlmICgoZWxlbiA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxKSk+KGJ1ZkxlbiAtIG9mZnNldCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogRWxlbWVudCBsZW5ndGggZXJyb3IgKi8KKyAgICAgICAgICAgICAgICByZXR1cm4gMHhmZmZmOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIGVsZW4gPT0gMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDB4ZmZmZjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCgodG1wID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzIpKSA9PSAweDAwKQorICAgICAgICAgICAgICAgICAgICAmJiAoKHRtcCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCszKSkgPT0gMHgwMykKKyAgICAgICAgICAgICAgICAgICAgJiYgKCh0bXAgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrNCkpID09IDB4N2YpCisgICAgICAgICAgICAgICAgICAgICYmICgodG1wID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzUpKSA9PSB0eXBlKSkKKworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICggc3VidHlwZSAhPSAweGZmICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICggKHRtcCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCs2KSkgPT0gc3VidHlwZSAgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2Zmc2V0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBvZmZzZXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogQWR2YW5jZSB0byBuZXh0IGVsZW1lbnQgKi8KKyAgICAgICAgaWYgKChlbGVuID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzEpKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gMHhmZmZmOworICAgICAgICB9CisgICAgICAgIG9mZnNldCArPSAoZWxlbisyKTsKKyAgICB9CisgICAgcmV0dXJuIDB4ZmZmZjsKK30KKwordTE2X3QgemZGaW5kQnJkY21NcnZsUmxua0V4dENhcCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpCit7CisgICAgdThfdCBzdWJUeXBlOworICAgIHUxNl90IG9mZnNldDsKKyAgICB1MTZfdCBidWZMZW47CisgICAgdTE2X3QgZWxlbjsKKyAgICB1OF90IGlkOworICAgIHU4X3QgdG1wOworCisgICAgLyogR2V0IG9mZnNldCBvZiBmaXJzdCBlbGVtZW50ICovCisgICAgc3ViVHlwZSA9ICh6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCAwKSA+PiA0KTsKKworICAgIGlmICgob2Zmc2V0ID0gemdFbGVtZW50T2Zmc2V0VGFibGVbc3ViVHlwZV0pID09IDB4ZmYpCisgICAgeworICAgICAgICB6bV9hc3NlcnQoMCk7CisgICAgfQorCisgICAgLyogUGx1cyB3bGFuIGhlYWRlciAqLworICAgIG9mZnNldCArPSAyNDsKKworICAgIGJ1ZkxlbiA9IHpmd0J1ZkdldFNpemUoZGV2LCBidWYpOworCisgICAgLyogU2VhcmNoIGxvb3AgKi8KKyAgICB3aGlsZSAoKG9mZnNldCsyKTxidWZMZW4pICAgICAgICAgICAgICAgICAgIC8vIGluY2x1ZGluZyBlbGVtZW50IElEIGFuZCBsZW5ndGggKDJieXRlcykKKyAgICB7CisgICAgICAgIC8qIFNlYXJjaCB0YXJnZXQgZWxlbWVudCAqLworICAgICAgICBpZiAoKGlkID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KSkgPT0gWk1fV0xBTl9FSURfV0lGSV9JRSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogQmluZ28gKi8KKyAgICAgICAgICAgIGlmICgoZWxlbiA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxKSk+KGJ1ZkxlbiAtIG9mZnNldCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogRWxlbWVudCBsZW5ndGggZXJyb3IgKi8KKyAgICAgICAgICAgICAgICByZXR1cm4gMHhmZmZmOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIGVsZW4gPT0gMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDB4ZmZmZjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCgodG1wID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzIpKSA9PSAweDAwKQorICAgICAgICAgICAgICAgICAgICAmJiAoKHRtcCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCszKSkgPT0gMHgxMCkKKyAgICAgICAgICAgICAgICAgICAgJiYgKCh0bXAgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrNCkpID09IDB4MTgpKQorCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG9mZnNldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKCgodG1wID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzIpKSA9PSAweDAwKQorICAgICAgICAgICAgICAgICAgICAmJiAoKHRtcCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCszKSkgPT0gMHg1MCkKKyAgICAgICAgICAgICAgICAgICAgJiYgKCh0bXAgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrNCkpID09IDB4NDMpKQorCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG9mZnNldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICgoaWQgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQpKSA9PSAweDdGKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBCaW5nbyAqLworICAgICAgICAgICAgaWYgKChlbGVuID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzEpKT4oYnVmTGVuIC0gb2Zmc2V0KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBFbGVtZW50IGxlbmd0aCBlcnJvciAqLworICAgICAgICAgICAgICAgIHJldHVybiAweGZmZmY7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggZWxlbiA9PSAwICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gMHhmZmZmOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoKHRtcCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsyKSkgPT0gMHgwMSkKKworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBvZmZzZXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBBZHZhbmNlIHRvIG5leHQgZWxlbWVudCAqLworICAgICAgICBpZiAoKGVsZW4gPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMSkpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAweGZmZmY7CisgICAgICAgIH0KKyAgICAgICAgb2Zmc2V0ICs9IChlbGVuKzIpOworICAgIH0KKyAgICByZXR1cm4gMHhmZmZmOworfQorCit1MTZfdCB6ZkZpbmRNYXJ2ZWxFeHRDYXAoemRldl90KiBkZXYsIHpidWZfdCogYnVmKQoreworICAgIHU4X3Qgc3ViVHlwZTsKKyAgICB1MTZfdCBvZmZzZXQ7CisgICAgdTE2X3QgYnVmTGVuOworICAgIHUxNl90IGVsZW47CisgICAgdThfdCBpZDsKKyAgICB1OF90IHRtcDsKKworICAgIC8qIEdldCBvZmZzZXQgb2YgZmlyc3QgZWxlbWVudCAqLworICAgIHN1YlR5cGUgPSAoem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgMCkgPj4gNCk7CisKKyAgICBpZiAoKG9mZnNldCA9IHpnRWxlbWVudE9mZnNldFRhYmxlW3N1YlR5cGVdKSA9PSAweGZmKQorICAgIHsKKyAgICAgICAgem1fYXNzZXJ0KDApOworICAgIH0KKworICAgIC8qIFBsdXMgd2xhbiBoZWFkZXIgKi8KKyAgICBvZmZzZXQgKz0gMjQ7CisKKyAgICBidWZMZW4gPSB6ZndCdWZHZXRTaXplKGRldiwgYnVmKTsKKworICAgIC8qIFNlYXJjaCBsb29wICovCisgICAgd2hpbGUgKChvZmZzZXQrMik8YnVmTGVuKSAgICAgICAgICAgICAgICAgICAvLyBpbmNsdWRpbmcgZWxlbWVudCBJRCBhbmQgbGVuZ3RoICgyYnl0ZXMpCisgICAgeworICAgICAgICAvKiBTZWFyY2ggdGFyZ2V0IGVsZW1lbnQgKi8KKyAgICAgICAgaWYgKChpZCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCkpID09IFpNX1dMQU5fRUlEX1dJRklfSUUpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIEJpbmdvICovCisgICAgICAgICAgICBpZiAoKGVsZW4gPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMSkpPihidWZMZW4gLSBvZmZzZXQpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIEVsZW1lbnQgbGVuZ3RoIGVycm9yICovCisgICAgICAgICAgICAgICAgcmV0dXJuIDB4ZmZmZjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBlbGVuID09IDAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAweGZmZmY7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICgoKHRtcCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsyKSkgPT0gMHgwMCkKKyAgICAgICAgICAgICAgICAgICYmICgodG1wID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzMpKSA9PSAweDUwKQorICAgICAgICAgICAgICAgICAgJiYgKCh0bXAgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrNCkpID09IDB4NDMpKQorCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG9mZnNldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIEFkdmFuY2UgdG8gbmV4dCBlbGVtZW50ICovCisgICAgICAgIGlmICgoZWxlbiA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxKSkgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDB4ZmZmZjsKKyAgICAgICAgfQorICAgICAgICBvZmZzZXQgKz0gKGVsZW4rMik7CisgICAgfQorICAgIHJldHVybiAweGZmZmY7Cit9CisKK3UxNl90IHpmRmluZEJyb2FkY29tRXh0Q2FwKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZikKK3sKKyAgICB1OF90IHN1YlR5cGU7CisgICAgdTE2X3Qgb2Zmc2V0OworICAgIHUxNl90IGJ1ZkxlbjsKKyAgICB1MTZfdCBlbGVuOworICAgIHU4X3QgaWQ7CisgICAgdThfdCB0bXA7CisKKyAgICAvKiBHZXQgb2Zmc2V0IG9mIGZpcnN0IGVsZW1lbnQgKi8KKyAgICBzdWJUeXBlID0gKHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIDApID4+IDQpOworCisgICAgaWYgKChvZmZzZXQgPSB6Z0VsZW1lbnRPZmZzZXRUYWJsZVtzdWJUeXBlXSkgPT0gMHhmZikKKyAgICB7CisgICAgICAgIHptX2Fzc2VydCgwKTsKKyAgICB9CisKKyAgICAvKiBQbHVzIHdsYW4gaGVhZGVyICovCisgICAgb2Zmc2V0ICs9IDI0OworCisgICAgYnVmTGVuID0gemZ3QnVmR2V0U2l6ZShkZXYsIGJ1Zik7CisKKyAgICAvKiBTZWFyY2ggbG9vcCAqLworICAgIHdoaWxlKChvZmZzZXQrMikgPCBidWZMZW4pICAgICAgICAgICAgICAgICAgIC8vIGluY2x1ZGluZyBlbGVtZW50IElEIGFuZCBsZW5ndGggKDJieXRlcykKKyAgICB7CisgICAgICAgIC8qIFNlYXJjaCB0YXJnZXQgZWxlbWVudCAqLworICAgICAgICBpZiAoKGlkID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KSkgPT0gWk1fV0xBTl9FSURfV0lGSV9JRSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogQmluZ28gKi8KKyAgICAgICAgICAgIGlmICgoZWxlbiA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxKSkgPiAoYnVmTGVuIC0gb2Zmc2V0KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBFbGVtZW50IGxlbmd0aCBlcnJvciAqLworICAgICAgICAgICAgICAgIHJldHVybiAweGZmZmY7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChlbGVuID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDB4ZmZmZjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCAoKHRtcCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsyKSkgPT0gMHgwMCkKKyAgICAgICAgICAgICAgICAgJiYgKCh0bXAgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMykpID09IDB4MTApCisgICAgICAgICAgICAgICAgICYmICgodG1wID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzQpKSA9PSAweDE4KSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG9mZnNldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIEFkdmFuY2UgdG8gbmV4dCBlbGVtZW50ICovCisgICAgICAgIGlmICgoZWxlbiA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxKSkgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDB4ZmZmZjsKKyAgICAgICAgfQorCisgICAgICAgIG9mZnNldCArPSAoZWxlbisyKTsKKyAgICB9CisKKyAgICByZXR1cm4gMHhmZmZmOworfQorCit1MTZfdCB6ZkZpbmRSbG5rRXh0Q2FwKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZikKK3sKKyAgICB1OF90IHN1YlR5cGU7CisgICAgdTE2X3Qgb2Zmc2V0OworICAgIHUxNl90IGJ1ZkxlbjsKKyAgICB1MTZfdCBlbGVuOworICAgIHU4X3QgaWQ7CisgICAgdThfdCB0bXA7CisKKyAgICAvKiBHZXQgb2Zmc2V0IG9mIGZpcnN0IGVsZW1lbnQgKi8KKyAgICBzdWJUeXBlID0gKHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIDApID4+IDQpOworCisgICAgaWYgKChvZmZzZXQgPSB6Z0VsZW1lbnRPZmZzZXRUYWJsZVtzdWJUeXBlXSkgPT0gMHhmZikKKyAgICB7CisgICAgICAgIHptX2Fzc2VydCgwKTsKKyAgICB9CisKKyAgICAvKiBQbHVzIHdsYW4gaGVhZGVyICovCisgICAgb2Zmc2V0ICs9IDI0OworCisgICAgYnVmTGVuID0gemZ3QnVmR2V0U2l6ZShkZXYsIGJ1Zik7CisKKyAgICAvKiBTZWFyY2ggbG9vcCAqLworICAgIHdoaWxlKChvZmZzZXQrMikgPCBidWZMZW4pICAgICAgICAgICAgICAgICAgIC8vIGluY2x1ZGluZyBlbGVtZW50IElEIGFuZCBsZW5ndGggKDJieXRlcykKKyAgICB7CisgICAgICAgIC8qIFNlYXJjaCB0YXJnZXQgZWxlbWVudCAqLworICAgICAgICBpZiAoKGlkID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KSkgPT0gMHg3RikKKyAgICAgICAgeworICAgICAgICAgICAgLyogQmluZ28gKi8KKyAgICAgICAgICAgIGlmICgoZWxlbiA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxKSkgPiAoYnVmTGVuIC0gb2Zmc2V0KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBFbGVtZW50IGxlbmd0aCBlcnJvciAqLworICAgICAgICAgICAgICAgIHJldHVybiAweGZmZmY7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggZWxlbiA9PSAwICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gMHhmZmZmOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoKHRtcCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsyKSkgPT0gMHgwMSkKKworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBvZmZzZXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBBZHZhbmNlIHRvIG5leHQgZWxlbWVudCAqLworICAgICAgICBpZiAoKGVsZW4gPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMSkpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAweGZmZmY7CisgICAgICAgIH0KKworICAgICAgICBvZmZzZXQgKz0gKGVsZW4rMik7CisgICAgfQorCisgICAgcmV0dXJuIDB4ZmZmZjsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9jbW1hcC5jIGIvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2NtbWFwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2YwOWZkZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9jbW1hcC5jCkBAIC0wLDAgKzEsMjQwMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNy0yMDA4IEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZHVsZSBOYW1lIDogbW0uYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQWJzdHJhY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBUaGlzIG1vZHVsZSBjb250YWlucyBjb21tb24gZnVuY3Rpb25zIGZvciBoYW5kbGUgQVAgICAgICAgICAgICAgKi8KKy8qICAgICAgbWFuYWdlbWVudCBmcmFtZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE5PVEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlICJjcHJlY29tcC5oIgorI2luY2x1ZGUgInJhdGVjdHJsLmgiCisKK2V4dGVybiBjb25zdCB1OF90IHpjVXBUb0FjW107CisKK3ZvaWQgemZNbUFwVGltZVRpY2soemRldl90KiBkZXYpCit7CisgICAgdTMyX3Qgbm93OworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIC8vem1fZGVidWdfbXNnMSgid2QtPndsYW5Nb2RlIDogIiwgd2QtPndsYW5Nb2RlKTsKKyAgICBpZiAod2QtPndsYW5Nb2RlID09IFpNX01PREVfQVApCisgICAgeworICAgICAgICAvKiA9PiBldmVyeSAxLjI4IHNlY29uZHMgKi8KKyAgICAgICAgLyogQVAgOiBhZ2luZyBTVEEgdGhhdCBkb2VzIG5vdCBhY3RpdmUgZm9yIHdkLT5hcC5zdGFBZ2luZ1RpbWUgICAgKi8KKyAgICAgICAgbm93ID0gd2QtPnRpY2sgJiAweDdmOworICAgICAgICBpZiAobm93ID09IDB4MCkKKyAgICAgICAgeworICAgICAgICAgICAgemZBcEFnaW5nU3RhKGRldik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAobm93ID09IDB4MWYpCisgICAgICAgIHsKKyAgICAgICAgICAgIHpmUXVldWVBZ2UoZGV2LCB3ZC0+YXAudWFwc2RRLCB3ZC0+dGljaywgMTAwMDApOworICAgICAgICB9CisgICAgICAgIC8qIEFQIDogY2hlY2sgKHdkLT5hcC5wcm90ZWN0ZWRPYnNzKSBhbmQgKHdkLT5hcC5iU3RhQXNzb2NpYXRlZCkgICovCisgICAgICAgIC8qICAgICAgdG8gZW5hYmxlIE5vbkVycCBhbmQgUHJvdGVjdGlvbiBtb2RlICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgIGVsc2UgaWYgKG5vdyA9PSAweDNmKQorICAgICAgICB7CisgICAgICAgICAgICAvL3pmQXBQcm90Y3Rpb25Nb25pdG9yKGRldik7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZkFwSW5pdFN0YVRibCAgICAgICAgICAgICAgKi8KKy8qICAgICAgSW5pdCBBUCdzIHN0YXRpb24gdGFibGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiBDaGVuICAgICAgICBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgIDIwMDUuMTAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgemZBcEluaXRTdGFUYmwoemRldl90KiBkZXYpCit7CisgICAgdTE2X3QgaTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIGZvciAoaT0wOyBpPFpNX01BWF9TVEFfU1VQUE9SVDsgaSsrKQorICAgIHsKKyAgICAgICAgd2QtPmFwLnN0YVRhYmxlW2ldLnZhbGlkID0gMDsKKyAgICAgICAgd2QtPmFwLnN0YVRhYmxlW2ldLnN0YXRlID0gMDsKKyAgICAgICAgd2QtPmFwLnN0YVRhYmxlW2ldLmFkZHJbMF0gPSAwOworICAgICAgICB3ZC0+YXAuc3RhVGFibGVbaV0uYWRkclsxXSA9IDA7CisgICAgICAgIHdkLT5hcC5zdGFUYWJsZVtpXS5hZGRyWzJdID0gMDsKKyAgICAgICAgd2QtPmFwLnN0YVRhYmxlW2ldLnRpbWUgPSAwOworICAgICAgICB3ZC0+YXAuc3RhVGFibGVbaV0udmFwID0gMDsKKyAgICAgICAgd2QtPmFwLnN0YVRhYmxlW2ldLmVuY3J5TW9kZSA9IFpNX05PX1dFUDsKKyAgICB9CisgICAgcmV0dXJuOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZkFwRmluZFN0YSAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgRmluZCBhIFNUQSBpbiBzdGF0aW9uIHRhYmxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGFkZHIgOiBUYXJnZXQgU1RBIGFkZHJlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIDB4ZmZmZiA6IGZhaWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBvdGhlciA6IFNUQSB0YWJsZSBpbmRleCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBTdGVwaGVuIENoZW4gICAgICAgIFp5REFTIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24gICAgMjAwNS4xMCAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTE2X3QgemZBcEZpbmRTdGEoemRldl90KiBkZXYsIHUxNl90KiBhZGRyKQoreworICAgIHUxNl90IGk7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBmb3IgKGk9MDsgaTxaTV9NQVhfU1RBX1NVUFBPUlQ7IGkrKykKKyAgICB7CisgICAgICAgIGlmICh3ZC0+YXAuc3RhVGFibGVbaV0udmFsaWQgPT0gMSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCh3ZC0+YXAuc3RhVGFibGVbaV0uYWRkclswXSA9PSBhZGRyWzBdKQorICAgICAgICAgICAgICAgICAgICAmJiAod2QtPmFwLnN0YVRhYmxlW2ldLmFkZHJbMV0gPT0gYWRkclsxXSkKKyAgICAgICAgICAgICAgICAgICAgJiYgKHdkLT5hcC5zdGFUYWJsZVtpXS5hZGRyWzJdID09IGFkZHJbMl0pKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAweGZmZmY7Cit9CisKK3UxNl90IHpmQXBHZXRTVEFJbmZvKHpkZXZfdCogZGV2LCB1MTZfdCogYWRkciwgdTE2X3QqIHN0YXRlLCB1OF90KiB2YXApCit7CisgICAgdTE2X3QgaWQ7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIGlmICgoaWQgPSB6ZkFwRmluZFN0YShkZXYsIGFkZHIpKSAhPSAweGZmZmYpCisgICAgeworICAgICAgICAqdmFwID0gd2QtPmFwLnN0YVRhYmxlW2lkXS52YXA7CisgICAgICAgICpzdGF0ZSA9IHdkLT5hcC5zdGFUYWJsZVtpZCsrXS5zdGF0ZTsKKyAgICB9CisKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgcmV0dXJuIGlkOworfQorCisKK3ZvaWQgemZBcEdldFN0YVFvc1R5cGUoemRldl90KiBkZXYsIHUxNl90KiBhZGRyLCB1OF90KiBxb3NUeXBlKQoreworICAgIHUxNl90IGlkOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICBpZiAoKGlkID0gemZBcEZpbmRTdGEoZGV2LCBhZGRyKSkgIT0gMHhmZmZmKQorICAgIHsKKyAgICAgICAgKnFvc1R5cGUgPSB3ZC0+YXAuc3RhVGFibGVbaWRdLnFvc1R5cGU7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgICpxb3NUeXBlID0gMDsKKyAgICB9CisKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgcmV0dXJuOworfQorCit2b2lkIHpmQXBHZXRTdGFUeFJhdGVBbmRRb3NUeXBlKHpkZXZfdCogZGV2LCB1MTZfdCogYWRkciwgdTMyX3QqIHBoeUN0cmwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHU4X3QqIHFvc1R5cGUsIHUxNl90KiByY1Byb2JpbmdGbGFnKQoreworICAgIHUxNl90IGlkOworICAgIHU4X3QgcmF0ZTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgaWYgKChpZCA9IHpmQXBGaW5kU3RhKGRldiwgYWRkcikpICE9IDB4ZmZmZikKKyAgICB7CisgICAgICAgIHJhdGUgPSAodThfdCl6ZlJhdGVDdHJsR2V0VHhSYXRlKGRldiwgJndkLT5hcC5zdGFUYWJsZVtpZF0ucmNDZWxsLCByY1Byb2JpbmdGbGFnKTsKKyNpZmRlZiBaTV9BUF9ERUJVRworICAgICAgICAvL3JhdGUgPSAxNTsKKyNlbmRpZgorICAgICAgICAqcGh5Q3RybCA9IHpjUmF0ZVRvUGh5Q3RybFtyYXRlXTsKKyAgICAgICAgKnFvc1R5cGUgPSB3ZC0+YXAuc3RhVGFibGVbaWRdLnFvc1R5cGU7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmICh3ZC0+ZnJlcXVlbmN5IDwgMzAwMCkKKyAgICAgICAgeworICAgICAgICAgICAgLyogQ0NLIDFNICovCisgICAgICAgICAgICAvL2hlYWRlclsyXSA9IDB4MGYwMDsgICAgICAgICAgLy9QSFkgY29udHJvbCBMCisgICAgICAgICAgICAvL2hlYWRlclszXSA9IDB4MDAwMDsgICAgICAgICAgLy9QSFkgY29udHJvbCBICisgICAgICAgICAgICAqcGh5Q3RybCA9IDB4MDAwMDBGMDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvKiBDQ0sgNk0gKi8KKyAgICAgICAgICAgIC8vaGVhZGVyWzJdID0gMHgwZjAxOyAgICAgICAgICAvL1BIWSBjb250cm9sIEwKKyAgICAgICAgICAgIC8vaGVhZGVyWzNdID0gMHgwMDBCOyAgICAgICAgICAvL1BIWSBjb250cm9sIEgKKyAgICAgICAgICAgICpwaHlDdHJsID0gMHgwMDBCMEYwMTsKKyAgICAgICAgfQorICAgICAgICAqcW9zVHlwZSA9IDA7CisgICAgfQorCisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIHptX21zZzJfbW0oWk1fTFZfMywgIlBoeUN0cmw9IiwgKnBoeUN0cmwpOworICAgIHJldHVybjsKK30KKwordm9pZCB6ZkFwR2V0U3RhRW5jcnlUeXBlKHpkZXZfdCogZGV2LCB1MTZfdCogYWRkciwgdThfdCogZW5jcnlUeXBlKQoreworICAgIC8vc3RydWN0IHpzV2xhbkRldiogd2QgPSAoc3RydWN0IHpzV2xhbkRldiopIHptd193bGFuX2RldihkZXYpOworICAgIHUxNl90IGlkOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICBpZiAoKGlkID0gemZBcEZpbmRTdGEoZGV2LCBhZGRyKSkgIT0gMHhmZmZmKQorICAgIHsKKyAgICAgICAgKmVuY3J5VHlwZSA9IHdkLT5hcC5zdGFUYWJsZVtpZF0uZW5jcnlNb2RlOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAqZW5jcnlUeXBlID0gWk1fTk9fV0VQOworICAgIH0KKworICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICB6bV9tc2cyX21tKFpNX0xWXzMsICJlbmN5clR5cGU9IiwgKmVuY3J5VHlwZSk7CisgICAgcmV0dXJuOworfQorCit2b2lkIHpmQXBHZXRTdGFXcGFJdih6ZGV2X3QqIGRldiwgdTE2X3QqIGFkZHIsIHUxNl90KiBpdjE2LCB1MzJfdCogaXYzMikKK3sKKyAgICAvL3N0cnVjdCB6c1dsYW5EZXYqIHdkID0gKHN0cnVjdCB6c1dsYW5EZXYqKSB6bXdfd2xhbl9kZXYoZGV2KTsKKyAgICB1MTZfdCBpZDsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgaWYgKChpZCA9IHpmQXBGaW5kU3RhKGRldiwgYWRkcikpICE9IDB4ZmZmZikKKyAgICB7CisgICAgICAgICppdjE2ID0gd2QtPmFwLnN0YVRhYmxlW2lkXS5pdjE2OworICAgICAgICAqaXYzMiA9IHdkLT5hcC5zdGFUYWJsZVtpZF0uaXYzMjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgKml2MTYgPSAwOworICAgICAgICAqaXYzMiA9IDA7CisgICAgfQorCisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIHptX21zZzJfbW0oWk1fTFZfMywgIml2MTY9IiwgKml2MTYpOworICAgIHptX21zZzJfbW0oWk1fTFZfMywgIml2MzI9IiwgKml2MzIpOworICAgIHJldHVybjsKK30KKwordm9pZCB6ZkFwU2V0U3RhV3BhSXYoemRldl90KiBkZXYsIHUxNl90KiBhZGRyLCB1MTZfdCBpdjE2LCB1MzJfdCBpdjMyKQoreworICAgIC8vc3RydWN0IHpzV2xhbkRldiogd2QgPSAoc3RydWN0IHpzV2xhbkRldiopIHptd193bGFuX2RldihkZXYpOworICAgIHUxNl90IGlkOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICBpZiAoKGlkID0gemZBcEZpbmRTdGEoZGV2LCBhZGRyKSkgIT0gMHhmZmZmKQorICAgIHsKKyAgICAgICAgd2QtPmFwLnN0YVRhYmxlW2lkXS5pdjE2ID0gaXYxNjsKKyAgICAgICAgd2QtPmFwLnN0YVRhYmxlW2lkXS5pdjMyID0gaXYzMjsKKyAgICB9CisKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgem1fbXNnMl9tbShaTV9MVl8zLCAiaXYxNj0iLCBpdjE2KTsKKyAgICB6bV9tc2cyX21tKFpNX0xWXzMsICJpdjMyPSIsIGl2MzIpOworICAgIHJldHVybjsKK30KKwordm9pZCB6ZkFwQ2xlYXJTdGFLZXkoemRldl90KiBkZXYsIHUxNl90KiBhZGRyKQoreworICAgIC8vc3RydWN0IHpzV2xhbkRldiogd2QgPSAoc3RydWN0IHpzV2xhbkRldiopIHptd193bGFuX2RldihkZXYpOworICAgIHUxNl90IGJjQWRkclszXSA9IHsgMHhmZmZmLCAweGZmZmYsIDB4ZmZmZiB9OworICAgIHUxNl90IGlkOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgaWYgKHpmTWVtb3J5SXNFcXVhbCgodThfdCopYmNBZGRyLCAodThfdCopYWRkciwgc2l6ZW9mKGJjQWRkcikpID09IFRSVUUpCisgICAgeworICAgICAgICAvKiBUdXJuIG9mZiBncm91cCBrZXkgaW5mb3JtYXRpb24gKi8KKyAgICAvLyAgICB6ZkNsZWFyS2V5KGRldiwgMCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgICAgICBpZiAoKGlkID0gemZBcEZpbmRTdGEoZGV2LCBhZGRyKSkgIT0gMHhmZmZmKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBUdXJuIG9mZiBTVEEncyBrZXkgaW5mb3JtYXRpb24gKi8KKyAgICAgICAgICAgIHpmSHBSZW1vdmVLZXkoZGV2LCBpZCsxKTsKKworICAgICAgICAgICAgLyogVXBkYXRlIFNUQSdzIEVuY3J5cHRpb24gVHlwZSAqLworICAgICAgICAgICAgd2QtPmFwLnN0YVRhYmxlW2lkXS5lbmNyeU1vZGUgPSBaTV9OT19XRVA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB6bV9tc2cwX21tKFpNX0xWXzMsICJDYW4ndCBmaW5kIFNUQSBhZGRyZXNzXG4iKTsKKyAgICAgICAgfQorICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIH0KK30KKworI2lmZGVmIFpNX0VOQUJMRV9DRU5DCit2b2lkIHpmQXBHZXRTdGFDZW5jSXZBbmRLZXlJZHgoemRldl90KiBkZXYsIHUxNl90KiBhZGRyLCB1MzJfdCAqaXYsIHU4X3QgKmtleUlkeCkKK3sKKyAgICAvL3N0cnVjdCB6c1dsYW5EZXYqIHdkID0gKHN0cnVjdCB6c1dsYW5EZXYqKSB6bXdfd2xhbl9kZXYoZGV2KTsKKyAgICB1MTZfdCBpZDsKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIGlmICgoaWQgPSB6ZkFwRmluZFN0YShkZXYsIGFkZHIpKSAhPSAweGZmZmYpCisgICAgeworICAgICAgICAqaXYrKyA9IHdkLT5hcC5zdGFUYWJsZVtpZF0udHhpdlswXTsKKyAgICAgICAgKml2KysgPSB3ZC0+YXAuc3RhVGFibGVbaWRdLnR4aXZbMV07CisgICAgICAgICppdisrID0gd2QtPmFwLnN0YVRhYmxlW2lkXS50eGl2WzJdOworICAgICAgICAqaXYgPSB3ZC0+YXAuc3RhVGFibGVbaWRdLnR4aXZbM107CisgICAgICAgICprZXlJZHggPSB3ZC0+YXAuc3RhVGFibGVbaWRdLmNlbmNLZXlJZHg7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgICppdisrID0gMHg1YzM2NWMzNzsKKyAgICAgICAgKml2KysgPSAweDVjMzY1YzM2OworICAgICAgICAqaXYrKyA9IDB4NWMzNjVjMzY7CisgICAgICAgICppdiA9IDB4NWMzNjVjMzY7CisgICAgICAgICprZXlJZHggPSAwOworICAgIH0KKworICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgcmV0dXJuOworfQorCit2b2lkIHpmQXBTZXRTdGFDZW5jSXYoemRldl90KiBkZXYsIHUxNl90KiBhZGRyLCB1MzJfdCAqaXYpCit7CisgICAgLy9zdHJ1Y3QgenNXbGFuRGV2KiB3ZCA9IChzdHJ1Y3QgenNXbGFuRGV2Kikgem13X3dsYW5fZGV2KGRldik7CisgICAgdTE2X3QgaWQ7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICBpZiAoKGlkID0gemZBcEZpbmRTdGEoZGV2LCBhZGRyKSkgIT0gMHhmZmZmKQorICAgIHsKKyAgICAgICAgd2QtPmFwLnN0YVRhYmxlW2lkXS50eGl2WzBdID0gKml2Kys7CisgICAgICAgIHdkLT5hcC5zdGFUYWJsZVtpZF0udHhpdlsxXSA9ICppdisrOworICAgICAgICB3ZC0+YXAuc3RhVGFibGVbaWRdLnR4aXZbMl0gPSAqaXYrKzsKKyAgICAgICAgd2QtPmFwLnN0YVRhYmxlW2lkXS50eGl2WzNdID0gKml2OworICAgIH0KKworICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICByZXR1cm47Cit9CisjZW5kaWYgLy9aTV9FTkFCTEVfQ0VOQworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZkFwRmx1c2hCdWZmZXJlZFBzRnJhbWUgICAgKi8KKy8qICAgICAgRnJlZSBidWZmZXJlZCBQUyBmcmFtZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiBDaGVuICAgICAgICBBdGhlcm9zIENvbW11bmljYXRpb25zLCBJTkMuICAgIDIwMDcuMSAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgemZBcEZsdXNoQnVmZmVyZWRQc0ZyYW1lKHpkZXZfdCogZGV2KQoreworICAgIHUxNl90IGVtcHR5RmxhZzsKKyAgICB1MTZfdCBmcmVlQ291bnQ7CisgICAgdTE2X3QgdmFwOworICAgIHpidWZfdCogcHNCdWYgPSBOVUxMOworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgZnJlZUNvdW50ID0gMDsKKyAgICBlbXB0eUZsYWcgPSAwOworICAgIHdoaWxlICgxKQorICAgIHsKKyAgICAgICAgcHNCdWYgPSBOVUxMOworICAgICAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICBpZiAod2QtPmFwLnVuaUhlYWQgIT0gd2QtPmFwLnVuaVRhaWwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBzQnVmID0gd2QtPmFwLnVuaUFycmF5W3dkLT5hcC51bmlIZWFkXTsKKyAgICAgICAgICAgIHdkLT5hcC51bmlIZWFkID0gKHdkLT5hcC51bmlIZWFkICsgMSkgJiAoWk1fVU5JX0FSUkFZX1NJWkUgLSAxKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGVtcHR5RmxhZyA9IDE7CisgICAgICAgIH0KKyAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgICAgICBpZiAocHNCdWYgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgemZ3QnVmRnJlZShkZXYsIHBzQnVmLCBaTV9FUlJfRkxVU0hfUFNfUVVFVUUpOworICAgICAgICB9CisgICAgICAgIHptX2Fzc2VydChmcmVlQ291bnQrKyA8IChaTV9VTklfQVJSQVlfU0laRSoyKSk7CisKKyAgICAgICAgaWYgKGVtcHR5RmxhZyAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAodmFwPTA7IHZhcDxaTV9NQVhfQVBfU1VQUE9SVDsgdmFwKyspCisgICAgeworICAgICAgICBmcmVlQ291bnQgPSAwOworICAgICAgICBlbXB0eUZsYWcgPSAwOworICAgICAgICB3aGlsZSAoMSkKKyAgICAgICAgeworICAgICAgICAgICAgcHNCdWYgPSBOVUxMOworICAgICAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgIGlmICh3ZC0+YXAuYmNtY0hlYWRbdmFwXSAhPSB3ZC0+YXAuYmNtY1RhaWxbdmFwXSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwc0J1ZiA9IHdkLT5hcC5iY21jQXJyYXlbdmFwXVt3ZC0+YXAuYmNtY0hlYWRbdmFwXV07CisgICAgICAgICAgICAgICAgd2QtPmFwLmJjbWNIZWFkW3ZhcF0gPSAod2QtPmFwLmJjbWNIZWFkW3ZhcF0gKyAxKQorICAgICAgICAgICAgICAgICAgICAgICAgJiAoWk1fQkNNQ19BUlJBWV9TSVpFIC0gMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZW1wdHlGbGFnID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICAgICAgICAgIGlmIChwc0J1ZiAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHpmd0J1ZkZyZWUoZGV2LCBwc0J1ZiwgWk1fRVJSX0ZMVVNIX1BTX1FVRVVFKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHptX2Fzc2VydChmcmVlQ291bnQrKyA8IChaTV9CQ01DX0FSUkFZX1NJWkUqMikpOworCisgICAgICAgICAgICBpZiAoZW1wdHlGbGFnICE9IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuOworfQorCisKK3UxNl90IHpmQXBCdWZmZXJQc0ZyYW1lKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3QgcG9ydCkKK3sKKyAgICB1MTZfdCBpZDsKKyAgICB1MTZfdCBhZGRyWzNdOworICAgIHUxNl90IHZhcCA9IDA7CisgICAgdThfdCB1cDsKKyAgICB1MTZfdCBmcmFnT2ZmOworICAgIHU4X3QgYWM7CisgICAgdTE2X3QgcmV0OworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIGlmIChwb3J0IDwgWk1fTUFYX0FQX1NVUFBPUlQpCisgICAgeworICAgICAgICB2YXAgPSBwb3J0OworICAgIH0KKworICAgIGFkZHJbMF0gPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCAwKTsKKyAgICBhZGRyWzFdID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMik7CisgICAgYWRkclsyXSA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIDQpOworCisgICAgaWYgKChhZGRyWzBdICYgMHgxKSA9PSAweDEpCisgICAgeworICAgICAgICBpZiAod2QtPmFwLnN0YVBvd2VyU2F2aW5nID4gMCkKKyAgICAgICAgeworICAgICAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgICAgICAgICAgLyogQnVmZmVyIHRoaXMgQkMgb3IgTUMgZnJhbWUgKi8KKyAgICAgICAgICAgIGlmICgoKHdkLT5hcC5iY21jVGFpbFt2YXBdKzEpJihaTV9CQ01DX0FSUkFZX1NJWkUtMSkpCisgICAgICAgICAgICAgICAgICAgICE9IHdkLT5hcC5iY21jSGVhZFt2YXBdKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdkLT5hcC5iY21jQXJyYXlbdmFwXVt3ZC0+YXAuYmNtY1RhaWxbdmFwXSsrXSA9IGJ1ZjsKKyAgICAgICAgICAgICAgICB3ZC0+YXAuYmNtY1RhaWxbdmFwXSAmPSAoWk1fQkNNQ19BUlJBWV9TSVpFLTEpOworICAgICAgICAgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICAgICAgICAgICAgICB6bV9tc2cwX3R4KFpNX0xWXzAsICJCdWZmZXIgQkNNQyIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIGJjbWNBcnJheSBmdWxsICovCisgICAgICAgICAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgICAgICAgICAgICAgIHptX21zZzBfdHgoWk1fTFZfMCwgIkJDTUMgYnVmZmVyIGZ1bGwiKTsKKworICAgICAgICAgICAgICAgIC8qIGZyZWUgYnVmZmVyIGFjY29yZGluZyB0byBidWZmZXIgdHlwZSAqLworICAgICAgICAgICAgICAgIHpmd0J1ZkZyZWUoZGV2LCBidWYsIFpNX0VSUl9CQ01DX1BTX0JVRkZFUl9VTkFWQUlMQUJMRSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgICAgIGlmICgoaWQgPSB6ZkFwRmluZFN0YShkZXYsIGFkZHIpKSAhPSAweGZmZmYpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh3ZC0+YXAuc3RhVGFibGVbaWRdLnBzTW9kZSA9PSAxKQorICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgemZUeEdldElwVG9zQW5kRnJhZyhkZXYsIGJ1ZiwgJnVwLCAmZnJhZ09mZik7CisgICAgICAgICAgICAgICAgYWMgPSB6Y1VwVG9BY1t1cCYweDddICYgMHgzOworCisgICAgICAgICAgICAgICAgaWYgKCh3ZC0+YXAuc3RhVGFibGVbaWRdLnFvc1R5cGUgPT0gMSkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICgod2QtPmFwLnN0YVRhYmxlW2lkXS5xb3NJbmZvICYgKDB4OD4+YWMpKSAhPSAwKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldCA9IHpmUXVldWVQdXROY3MoZGV2LCB3ZC0+YXAudWFwc2RRLCBidWYsIHdkLT50aWNrKTsKKyAgICAgICAgICAgICAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJldCAhPSBaTV9TVUNDRVNTKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB6ZndCdWZGcmVlKGRldiwgYnVmLCBaTV9FUlJfQVBfVUFQU0RfUVVFVUVfRlVMTCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBCdWZmZXIgdGhpcyB1bmljYXN0IGZyYW1lICovCisgICAgICAgICAgICAgICAgaWYgKCgod2QtPmFwLnVuaVRhaWwrMSkmKFpNX1VOSV9BUlJBWV9TSVpFLTEpKQorICAgICAgICAgICAgICAgICAgICAgICAgIT0gd2QtPmFwLnVuaUhlYWQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB3ZC0+YXAudW5pQXJyYXlbd2QtPmFwLnVuaVRhaWwrK10gPSBidWY7CisgICAgICAgICAgICAgICAgICAgIHdkLT5hcC51bmlUYWlsICY9IChaTV9VTklfQVJSQVlfU0laRS0xKTsKKyAgICAgICAgICAgICAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgICAgICAgICAgem1fbXNnMF90eChaTV9MVl8wLCAiQnVmZmVyIFVOSSIpOworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qIHVuaUFycmF5IGZ1bGwgKi8KKyAgICAgICAgICAgICAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgICAgICAgICAgem1fbXNnMF90eChaTV9MVl8wLCAiVU5JIGJ1ZmZlciBmdWxsIik7CisgICAgICAgICAgICAgICAgICAgIC8qIGZyZWUgYnVmZmVyIGFjY29yZGluZyB0byBidWZmZXIgdHlwZSAqLworICAgICAgICAgICAgICAgICAgICB6ZndCdWZGcmVlKGRldiwgYnVmLCBaTV9FUlJfVU5JX1BTX0JVRkZFUl9VTkFWQUlMQUJMRSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgIH0gLyogaWYgKHdkLT5hcC5zdGFUYWJsZVtpZCsrXS5wc01vZGUgPT0gMSkgKi8KKyAgICAgICAgfSAvKiBpZiAoKGlkID0gemZBcEZpbmRTdGEoZGV2LCBhZGRyKSkgIT0gMHhmZmZmKSAqLworICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCit1MTZfdCB6ZkFwR2V0U1RBSW5mb0FuZFVwZGF0ZVBzKHpkZXZfdCogZGV2LCB1MTZfdCogYWRkciwgdTE2X3QqIHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1OF90KiB2YXAsIHUxNl90IHBzTW9kZSwgdThfdCogdWFwc2RUcmlnKQoreworICAgIHUxNl90IGlkOworICAgIHU4X3QgdWFwc2RTdGFBd2FrZSA9IDA7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworI2lmZGVmIFpNX0FQX0RFQlVHCisgICAgLy9wc01vZGU9MDsKKyNlbmRpZgorCisgICAgaWYgKChpZCA9IHpmQXBGaW5kU3RhKGRldiwgYWRkcikpICE9IDB4ZmZmZikKKyAgICB7CisgICAgICAgIGlmIChwc01vZGUgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgem1fbXNnMF9tbShaTV9MVl8wLCAicHNNb2RlID0gMSIpOworICAgICAgICAgICAgaWYgKHdkLT5hcC5zdGFUYWJsZVtpZF0ucHNNb2RlID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2QtPmFwLnN0YVBvd2VyU2F2aW5nKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHdkLT5hcC5zdGFUYWJsZVtpZF0ucW9zVHlwZSA9PSAxKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgem1fbXNnMF9tbShaTV9MVl8wLCAiVUFQU0QgdHJpZ2dlciIpOworICAgICAgICAgICAgICAgICAgICAqdWFwc2RUcmlnID0gd2QtPmFwLnN0YVRhYmxlW2lkXS5xb3NJbmZvOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh3ZC0+YXAuc3RhVGFibGVbaWRdLnBzTW9kZSAhPSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdkLT5hcC5zdGFQb3dlclNhdmluZy0tOworICAgICAgICAgICAgICAgIGlmICgod2QtPmFwLnN0YVRhYmxlW2lkXS5xb3NUeXBlID09IDEpICYmICgod2QtPmFwLnN0YVRhYmxlW2lkXS5xb3NJbmZvJjB4ZikhPTApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdWFwc2RTdGFBd2FrZSA9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgd2QtPmFwLnN0YVRhYmxlW2lkXS5wc01vZGUgPSAodThfdCkgcHNNb2RlOworICAgICAgICB3ZC0+YXAuc3RhVGFibGVbaWRdLnRpbWUgPSB3ZC0+dGljazsKKyAgICAgICAgKnZhcCA9IHdkLT5hcC5zdGFUYWJsZVtpZF0udmFwOworICAgICAgICAqc3RhdGUgPSB3ZC0+YXAuc3RhVGFibGVbaWQrK10uc3RhdGU7CisgICAgfQorCisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIGlmICh1YXBzZFN0YUF3YWtlID09IDEpCisgICAgeworICAgICAgICB6YnVmX3QqIHBzQnVmOworICAgICAgICB1OF90IG1iOworCisgICAgICAgIHdoaWxlICgxKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoKHBzQnVmID0gemZRdWV1ZUdldFdpdGhNYWMoZGV2LCB3ZC0+YXAudWFwc2RRLCAodThfdCopYWRkciwgJm1iKSkgIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6ZlR4U2VuZEV0aChkZXYsIHBzQnVmLCAwLCBaTV9FWFRFUk5BTF9BTExPQ19CVUYsIDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGlkOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZBcEdldE5ld1N0YSAgICAgICAgICAgICAgICovCisvKiAgICAgIEdldCBhIG5ldyBTVEEgZnJvbSBzdGF0aW9uIHRhYmxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGRldiA6IGRldmljZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIDB4ZmZmZiA6IGZhaWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBvdGhlciA6IFNUQSB0YWJsZSBpbmRleCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBTdGVwaGVuIENoZW4gICAgICAgIFp5REFTIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24gICAgMjAwNS4xMCAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTE2X3QgemZBcEdldE5ld1N0YSh6ZGV2X3QqIGRldikKK3sKKyAgICB1MTZfdCBpOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgZm9yIChpPTA7IGk8Wk1fTUFYX1NUQV9TVVBQT1JUOyBpKyspCisgICAgeworICAgICAgICBpZiAod2QtPmFwLnN0YVRhYmxlW2ldLnZhbGlkID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHptX21zZzJfbW0oWk1fTFZfMCwgInpmQXBHZXROZXdTdGE9IiwgaSk7CisgICAgICAgICAgICByZXR1cm4gaTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMHhmZmZmOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZkFwQWRkU3RhICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgQWRkIGEgU1RBIHRvIHN0YXRpb24gdGFibGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGFkZHIgOiBTVEEgTUFDIGFkZHJlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBzdGF0ZSA6IFNUQSBzdGF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYXBJZCA6IFZpcnR1YWwgQVAgSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIHR5cGUgOiAwPT4xMWIsIDE9PjExZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIDB4ZmZmZiA6IGZhaWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBPdGhlciA6IGluZGV4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBTdGVwaGVuIENoZW4gICAgICAgIFp5REFTIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24gICAgMjAwNS4xMCAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTE2X3QgemZBcEFkZFN0YSh6ZGV2X3QqIGRldiwgdTE2X3QqIGFkZHIsIHUxNl90IHN0YXRlLCB1MTZfdCBhcElkLCB1OF90IHR5cGUsCisgICAgICAgICAgICAgICAgIHU4X3QgcW9zVHlwZSwgdThfdCBxb3NJbmZvKQoreworICAgIHUxNl90IGluZGV4OworICAgIHUxNl90IGk7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgem1fbXNnMV9tbShaTV9MVl8wLCAiU1RBIHR5cGU9IiwgdHlwZSk7CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgaWYgKChpbmRleCA9IHpmQXBGaW5kU3RhKGRldiwgYWRkcikpICE9IDB4ZmZmZikKKyAgICB7CisgICAgICAgIHptX21zZzBfbW0oWk1fTFZfMiwgImZvdW5kIik7CisgICAgICAgIC8qIFVwZGF0ZSBTVEEgc3RhdGUgKi8KKyAgICAgICAgaWYgKChzdGF0ZSA9PSBaTV9TVEFURV9BVVRIKSB8fCAoc3RhdGUgPT0gWk1fU1RBVEVfUFJFQVVUSCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHdkLT5hcC5zdGFUYWJsZVtpbmRleF0uc3RhdGUgPSBzdGF0ZTsKKyAgICAgICAgICAgIHdkLT5hcC5zdGFUYWJsZVtpbmRleF0udGltZSA9IHdkLT50aWNrOworICAgICAgICAgICAgd2QtPmFwLnN0YVRhYmxlW2luZGV4XS52YXAgPSAodThfdClhcElkOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHN0YXRlID09IFpNX1NUQVRFX0FTT0MpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgod2QtPmFwLnN0YVRhYmxlW2luZGV4XS5zdGF0ZSA9PSBaTV9TVEFURV9BVVRIKSkKKyAgICAgICAgICAgICAgICAgICAgLy8mJiAod2QtPmFwLnN0YVRhYmxlW2luZGV4XS52YXAgPT0gYXBJZCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2QtPmFwLnN0YVRhYmxlW2luZGV4XS5zdGF0ZSA9IHN0YXRlOworICAgICAgICAgICAgICAgIHdkLT5hcC5zdGFUYWJsZVtpbmRleF0udGltZSA9IHdkLT50aWNrOworICAgICAgICAgICAgICAgIHdkLT5hcC5zdGFUYWJsZVtpbmRleF0ucW9zVHlwZSA9IHFvc1R5cGU7CisgICAgICAgICAgICAgICAgd2QtPmFwLnN0YVRhYmxlW2luZGV4XS52YXAgPSAodThfdClhcElkOworICAgICAgICAgICAgICAgIHdkLT5hcC5zdGFUYWJsZVtpbmRleF0uc3RhVHlwZSA9IHR5cGU7CisgICAgICAgICAgICAgICAgd2QtPmFwLnN0YVRhYmxlW2luZGV4XS5xb3NJbmZvID0gcW9zSW5mbzsKKworICAgICAgICAgICAgICAgIGlmICh3ZC0+ZnJlcXVlbmN5IDwgMzAwMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qIEluaXQgMTFiL2cgKi8KKyAgICAgICAgICAgICAgICAgICAgemZSYXRlQ3RybEluaXRDZWxsKGRldiwgJndkLT5hcC5zdGFUYWJsZVtpbmRleF0ucmNDZWxsLCB0eXBlLCAxLCAxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyogSW5pdCAxMWEgKi8KKyAgICAgICAgICAgICAgICAgICAgemZSYXRlQ3RybEluaXRDZWxsKGRldiwgJndkLT5hcC5zdGFUYWJsZVtpbmRleF0ucmNDZWxsLCB0eXBlLCAwLCAxKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAod2QtPnpmY2JBcENvbm5lY3ROb3RpZnkgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHdkLT56ZmNiQXBDb25uZWN0Tm90aWZ5KGRldiwgKHU4X3QqKWFkZHIsIGFwSWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbmRleCA9IDB4ZmZmZjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB6bV9tc2cwX21tKFpNX0xWXzIsICJOb3QgZm91bmQiKTsKKyAgICAgICAgaWYgKChzdGF0ZSA9PSBaTV9TVEFURV9BVVRIKSB8fCAoc3RhdGUgPT0gWk1fU1RBVEVfUFJFQVVUSCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIEdldCBhIG5ldyBTVEEgYW5kIHVwZGF0ZSBzdGF0ZSAqLworICAgICAgICAgICAgaW5kZXggPSB6ZkFwR2V0TmV3U3RhKGRldik7CisgICAgICAgICAgICB6bV9tc2cyX21tKFpNX0xWXzEsICJuZXcgU1RBIGluZGV4PSIsIGluZGV4KTsKKworICAgICAgICAgICAgaWYgKGluZGV4ICE9IDB4ZmZmZikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaTwzOyBpKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB3ZC0+YXAuc3RhVGFibGVbaW5kZXhdLmFkZHJbaV0gPSBhZGRyW2ldOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB3ZC0+YXAuc3RhVGFibGVbaW5kZXhdLnN0YXRlID0gc3RhdGU7CisgICAgICAgICAgICAgICAgd2QtPmFwLnN0YVRhYmxlW2luZGV4XS52YWxpZCA9IDE7CisgICAgICAgICAgICAgICAgd2QtPmFwLnN0YVRhYmxlW2luZGV4XS50aW1lID0gd2QtPnRpY2s7CisgICAgICAgICAgICAgICAgd2QtPmFwLnN0YVRhYmxlW2luZGV4XS52YXAgPSAodThfdClhcElkOworICAgICAgICAgICAgICAgIHdkLT5hcC5zdGFUYWJsZVtpbmRleF0uZW5jcnlNb2RlID0gWk1fTk9fV0VQOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIHJldHVybiBpbmRleDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZBcEFnaW5nU3RhICAgICAgICAgICAgICAgICovCisvKiAgICAgIEFnaW5nIFNUQSBpbiBzdGF0aW9uIHRhYmxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGRldiA6IGRldmljZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIG51bWJlciBvZiAxMWIgU1RBIGluIFNUQSB0YWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFN0ZXBoZW4gQ2hlbiAgICAgICAgWnlEQVMgVGVjaG5vbG9neSBDb3Jwb3JhdGlvbiAgICAyMDA1LjEwICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHpmQXBBZ2luZ1N0YSh6ZGV2X3QqIGRldikKK3sKKyAgICB1MTZfdCBpOworICAgIHUzMl90IGRlbHRhTXM7CisgICAgdTE2X3QgYWRkclszXTsKKyAgICB1MTZfdCB0eEZsYWc7CisgICAgdTE2X3QgcHNTdGFDb3VudCA9IDA7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgd2QtPmFwLmdTdGFBc3NvY2lhdGVkID0gd2QtPmFwLmJTdGFBc3NvY2lhdGVkID0gMDsKKworICAgIGZvciAoaT0wOyBpPFpNX01BWF9TVEFfU1VQUE9SVDsgaSsrKQorICAgIHsKKyAgICAgICAgdHhGbGFnID0gMDsKKyAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgaWYgKHdkLT5hcC5zdGFUYWJsZVtpXS52YWxpZCA9PSAxKQorICAgICAgICB7CisgICAgICAgICAgICBhZGRyWzBdID0gd2QtPmFwLnN0YVRhYmxlW2ldLmFkZHJbMF07CisgICAgICAgICAgICBhZGRyWzFdID0gd2QtPmFwLnN0YVRhYmxlW2ldLmFkZHJbMV07CisgICAgICAgICAgICBhZGRyWzJdID0gd2QtPmFwLnN0YVRhYmxlW2ldLmFkZHJbMl07CisgICAgICAgICAgICAvKiBtaWxsaXNlY29uZCAqLworICAgICAgICAgICAgZGVsdGFNcyA9ICh1MzJfdCkoKHUzMl90KXdkLT50aWNrLSh1MzJfdCl3ZC0+YXAuc3RhVGFibGVbaV0udGltZSkKKyAgICAgICAgICAgICAgICAgICAgICAqIFpNX01TX1BFUl9USUNLOworCisgICAgICAgICAgICAvKiBwcmVhdXRoICovCisgICAgICAgICAgICBpZiAoKHdkLT5hcC5zdGFUYWJsZVtpXS5zdGF0ZSA9PSBaTV9TVEFURV9QUkVBVVRIKQorICAgICAgICAgICAgICAgICAgICAmJiAoZGVsdGFNcyA+IFpNX1BSRUFVVEhfVElNRU9VVF9NUykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogQWdpbmcgU1RBICovCisgICAgICAgICAgICAgICAgd2QtPmFwLnN0YVRhYmxlW2ldLnZhbGlkID0gMDsKKyAgICAgICAgICAgICAgICB3ZC0+YXAuYXV0aFNoYXJpbmcgPSAwOworICAgICAgICAgICAgICAgIHR4RmxhZyA9IDE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIGF1dGggKi8KKyAgICAgICAgICAgIGlmICgod2QtPmFwLnN0YVRhYmxlW2ldLnN0YXRlID09IFpNX1NUQVRFX0FVVEgpCisgICAgICAgICAgICAgICAgICAgICYmIChkZWx0YU1zID4gWk1fQVVUSF9USU1FT1VUX01TKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBBZ2luZyBTVEEgKi8KKyAgICAgICAgICAgICAgICB3ZC0+YXAuc3RhVGFibGVbaV0udmFsaWQgPSAwOworICAgICAgICAgICAgICAgIHR4RmxhZyA9IDE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIGFzb2MgKi8KKyAgICAgICAgICAgIGlmICh3ZC0+YXAuc3RhVGFibGVbaV0uc3RhdGUgPT0gWk1fU1RBVEVfQVNPQykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAod2QtPmFwLnN0YVRhYmxlW2ldLnBzTW9kZSAhPSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcHNTdGFDb3VudCsrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChkZWx0YU1zID4gKCh1MzJfdCl3ZC0+YXAuc3RhQWdpbmdUaW1lU2VjPDwxMCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKiBBZ2luZyBTVEEgKi8KKyAgICAgICAgICAgICAgICAgICAgem1fbXNnMV9tbShaTV9MVl8wLCAiQWdlIFNUQSBpbmRleD0iLCBpKTsKKyAgICAgICAgICAgICAgICAgICAgd2QtPmFwLnN0YVRhYmxlW2ldLnZhbGlkID0gMDsKKyAgICAgICAgICAgICAgICAgICAgdHhGbGFnID0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoZGVsdGFNcyA+ICgodTMyX3Qpd2QtPmFwLnN0YVByb2JpbmdUaW1lU2VjPDwxMCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAod2QtPmFwLnN0YVRhYmxlW2ldLnBzTW9kZSA9PSAwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBQcm9iaW5nIG5vbi1QUyBTVEEgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHptX21zZzFfbW0oWk1fTFZfMCwgIlByb2JpbmcgU1RBIGluZGV4PSIsIGkpOworICAgICAgICAgICAgICAgICAgICAgICAgd2QtPmFwLnN0YVRhYmxlW2ldLnRpbWUgKz0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdkLT5hcC5zdGFQcm9iaW5nVGltZVNlYyAqIFpNX1RJQ0tfUEVSX1NFQ09ORCk7CisgICAgICAgICAgICAgICAgICAgICAgICB0eEZsYWcgPSAyOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisKKyAgICAgICAgfQorICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgICAgIGlmICh0eEZsYWcgPT0gMSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogU2VuZCBkZWF1dGhlbnRpY2F0aW9uIG1hbmFnZW1lbnQgZnJhbWUgKi8KKyAgICAgICAgICAgIHpmU2VuZE1tRnJhbWUoZGV2LCBaTV9XTEFOX0ZSQU1FX1RZUEVfREVBVVRILCBhZGRyLCA0LCAwLCAwKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICh0eEZsYWcgPT0gMikKKyAgICAgICAgeworICAgICAgICAgICAgemZTZW5kTW1GcmFtZShkZXYsIFpNX1dMQU5fREFUQV9GUkFNRSwgYWRkciwgMCwgMCwgMCk7CisgICAgICAgIH0KKworICAgIH0KKworICAgIHdkLT5hcC5zdGFQb3dlclNhdmluZyA9IHBzU3RhQ291bnQ7CisKKyAgICByZXR1cm47Cit9CisKK3ZvaWQgemZBcFByb3RjdGlvbk1vbml0b3IoemRldl90KiBkZXYpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgLyogMTFiIFNUQSBhc3NvY2lhdGVkID0+IG5vbkVycCwgUHJvdGVjdCAqLworICAgIGlmICh3ZC0+YXAuYlN0YUFzc29jaWF0ZWQgPiAwKQorICAgIHsKKyAgICAgICAgLyogRW5hYmxlIE5vbkVycCBiaXQgaW4gaW5mb3JtYXRpb24gZWxlbWVudCAqLworICAgICAgICB3ZC0+ZXJwRWxlbWVudCA9IFpNX1dMQU5fTk9OX0VSUF9QUkVTRU5UX0JJVAorICAgICAgICAgICAgICAgICAgICAgICAgIHwgWk1fV0xBTl9VU0VfUFJPVEVDVElPTl9CSVQ7CisKKyAgICAgICAgLyogRW5hYmxlIHByb3RlY3Rpb24gbW9kZSAqLworICAgICAgICB6ZkFwU2V0UHJvdGVjdGlvbk1vZGUoZGV2LCAxKTsKKworICAgIH0KKyAgICAvKiAxMWIgU1RBIG5vdCBhc3NvY2lhdGVkLCBwcm90ZWN0aW9uIE9CU1MgcHJlc2VudCA9PiBQcm90ZWN0ICovCisgICAgZWxzZSBpZiAod2QtPmFwLnByb3RlY3RlZE9ic3MgPiAyKSAvL1RocmVzaG9sZAorICAgIHsKKyAgICAgICAgaWYgKHdkLT5kaXNhYmxlU2VsZkN0cyA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBEaXNhYmxlIE5vbkVycCBiaXQgaW4gaW5mb3JtYXRpb24gZWxlbWVudCAqLworICAgICAgICAgICAgd2QtPmVycEVsZW1lbnQgPSBaTV9XTEFOX1VTRV9QUk9URUNUSU9OX0JJVDsKKworICAgICAgICAgICAgLyogRW5hYmxlIHByb3RlY3Rpb24gbW9kZSAqLworICAgICAgICAgICAgemZBcFNldFByb3RlY3Rpb25Nb2RlKGRldiwgMSk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogRGlzYWJsZSBOb25FcnAgYml0IGluIGluZm9ybWF0aW9uIGVsZW1lbnQgKi8KKyAgICAgICAgd2QtPmVycEVsZW1lbnQgPSAwOworCisgICAgICAgIC8qIERpc2FibGUgcHJvdGVjdGlvbiBtb2RlICovCisgICAgICAgIHpmQXBTZXRQcm90ZWN0aW9uTW9kZShkZXYsIDApOworICAgIH0KKyAgICB3ZC0+YXAucHJvdGVjdGVkT2JzcyA9IDA7Cit9CisKKwordm9pZCB6ZkFwUHJvY2Vzc0JlYWNvbih6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpCit7CisgICAgdTE2X3Qgb2Zmc2V0OworICAgIHU4X3QgY2g7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bV9tc2cwX21tKFpNX0xWXzMsICJSeCBiZWFjb24iKTsKKworICAgIC8qIHVwZGF0ZSBOb24tRVJQIGZsYWcod2QtPmFwLm5vbkVycE9ic3MpICovCisgICAgaWYgKChvZmZzZXQgPSB6ZkZpbmRFbGVtZW50KGRldiwgYnVmLCBaTV9XTEFOX0VJRF9FUlApKSA9PSAweGZmZmYpCisgICAgeworICAgICAgICAvKiAxMWIgT0JTUyAqLworICAgICAgICB3ZC0+YXAucHJvdGVjdGVkT2JzcysrOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgY2ggPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMik7CisgICAgaWYgKChjaCAmIFpNX1dMQU5fVVNFX1BST1RFQ1RJT05fQklUKSA9PSBaTV9XTEFOX1VTRV9QUk9URUNUSU9OX0JJVCkKKyAgICB7CisgICAgICAgIC8qIFByb3RlY3RlZCBPQlNTICovCisgICAgICAgIHdkLT5hcC5wcm90ZWN0ZWRPYnNzID0gMTsKKyAgICB9CisKKyAgICByZXR1cm47Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmUHJvY2Vzc0F1dGggICAgICAgICAgICAgICAqLworLyogICAgICBQcm9jZXNzIGF1dGhlbnRpY2F0ZSBtYW5hZ2VtZW50IGZyYW1lLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYnVmIDogYXV0aCBmcmFtZSBidWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgbm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiBDaGVuICAgICAgICBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgIDIwMDUuMTAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIE5vdGUgOiBBUCBhbGxvd3Mgb25lIGF1dGhlbnRpY2F0aW5nIFNUQSBhdCBhIHRpbWUsIGRvZXMgbm90ICAgICAgICAgICovCisvKiAgICAgICAgc3VwcG9ydCBtdWx0aXBsZSBhdXRoZW50aWNhdGlvbiBwcm9jZXNzLiBNYWtlIHN1cmUgICAgICAgICAgICAqLworLyogICAgICAgIGF1dGhlbnRpY2F0aW9uIHN0YXRlIG1hY2hpbmUgd2lsbCBub3QgYmUgYmxvY2tlZCBkdWUgICAgICAgICAgKi8KKy8qICAgICAgICB0byBpbmNvbXBsZXRlZCBhdXRoZW50aWNhdGlvbiBoYW5kc2hha2UuICAgICAgICAgICAgICAgICAgICAgICovCit2b2lkIHpmQXBQcm9jZXNzQXV0aCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90KiBzcmMsIHUxNl90IGFwSWQpCit7CisgICAgdTE2X3QgYWxnbywgc2VxLCBzdGF0dXM7CisgICAgdThfdCBhdXRoU2hhcmluZzsKKyAgICB1MTZfdCByZXQ7CisgICAgdTE2X3QgaTsKKyAgICB1OF90IGNoYWxsZW5nZVBhc3NlZCA9IDA7CisgICAgdThfdCBmcmFtZUN0cmw7CisgICAgdTMyX3QgcmV0QWxnb1NlcTsKKyAgICB1MzJfdCByZXRTdGF0dXM7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKworICAgIGZyYW1lQ3RybCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIDEpOworICAgIC8qIEFQIDogQXV0aCBzaGFyZSAzICovCisgICAgLyogc2hpZnQgZm9yIFdFUCBJViAqLworICAgIGlmICgoZnJhbWVDdHJsICYgMHg0MCkgIT0gMCkKKyAgICB7CisgICAgICAgIGFsZ28gPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCAyOCk7CisgICAgICAgIHNlcSA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIDMwKTsKKyAgICAgICAgc3RhdHVzID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMzIpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhbGdvID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMjQpOworICAgICAgICBzZXEgPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCAyNik7CisgICAgICAgIHN0YXR1cyA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIDI4KTsKKyAgICB9CisKKyAgICB6bV9tc2cyX21tKFpNX0xWXzAsICJSeCBBdXRoLCBzZXE9Iiwgc2VxKTsKKworICAgIC8qIFNldCBkZWZhdWx0IHRvIGF1dGhlbnRpY2F0aW9uIGFsZ29yaXRobSBub3Qgc3VwcG9ydCAqLworICAgIHJldEFsZ29TZXEgPSAweDIwMDAwIHwgYWxnbzsKKyAgICByZXRTdGF0dXMgPSAxMzsgLyogYXV0aGVudGljYXRpb24gYWxnb3JpdGhtIG5vdCBzdXBwb3J0ICovCisKKyAgICAvKiBBUCA6IEF1dGggb3BlbiAxICovCisgICAgaWYgKGFsZ28gPT0gMCkKKyAgICB7CisgICAgICAgIGlmICh3ZC0+YXAuYXV0aEFsZ29bYXBJZF0gPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0QWxnb1NlcSA9IDB4MjAwMDA7CisgICAgICAgICAgICBpZiAoc2VxID09IDEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogQVAgOiB1cGRhdGUgU1RBIHRvIGF1dGggKi8KKyAgICAgICAgICAgICAgICBpZiAoKHJldCA9IHpmQXBBZGRTdGEoZGV2LCBzcmMsIFpNX1NUQVRFX0FVVEgsIGFwSWQsIDAsIDAsIDApKSAhPSAweGZmZmYpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKiBBUCA6IGNhbGwgemZ3QXV0aE5vdGlmeSgpIGZvciBob3N0IHRvIGp1ZGdlICovCisgICAgICAgICAgICAgICAgICAgIC8vemZ3QXV0aE5vdGlmeShkZXYsIHNyYyk7CisKKyAgICAgICAgICAgICAgICAgICAgLyogQVAgOiByZXNwb25zZSBBdXRoIHNlcT0yLCBzdWNjZXNzICovCisgICAgICAgICAgICAgICAgICAgIHJldFN0YXR1cyA9IDA7CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyogQVAgOiByZXNwb25zZSBBdXRoIHNlcT0yLCB1bnNwZWNpZmljIGVycm9yICovCisgICAgICAgICAgICAgICAgICAgIHJldFN0YXR1cyA9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIEFQIDogcmVzcG9uc2UgQXV0aCBzZXE9Miwgc2VxdWVuY2UgbnVtYmVyIG91dCBvZiBleHBlY3RlZCAqLworICAgICAgICAgICAgICAgIHJldFN0YXR1cyA9IDE0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIC8qIEFQIDogQXV0aCBzaGFyZSAxICovCisgICAgZWxzZSBpZiAoYWxnbyA9PSAxKQorICAgIHsKKyAgICAgICAgaWYgKHdkLT5hcC5hdXRoQWxnb1thcElkXSA9PSAxKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoc2VxID09IDEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0QWxnb1NlcSA9IDB4MjAwMDE7CisKKyAgICAgICAgICAgICAgICAvKiBjcml0aWNhbCBzZWN0aW9uICovCisgICAgICAgICAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgICAgICBpZiAod2QtPmFwLmF1dGhTaGFyaW5nID09IDEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhdXRoU2hhcmluZyA9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGF1dGhTaGFyaW5nID0gMDsKKyAgICAgICAgICAgICAgICAgICAgd2QtPmFwLmF1dGhTaGFyaW5nID0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLyogZW5kIG9mIGNyaXRpY2FsIHNlY3Rpb24gKi8KKyAgICAgICAgICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgICAgICAgICAgICAgaWYgKGF1dGhTaGFyaW5nID09IDEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKiBBUCA6IHJlc3BvbnNlIEF1dGggc2VxPTIsIHN0YXR1cyA9IGZhaWwgKi8KKyAgICAgICAgICAgICAgICAgICAgcmV0U3RhdHVzID0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyogQVAgOiB1cGRhdGUgU1RBIHRvIHByZWF1dGggKi8KKyAgICAgICAgICAgICAgICAgICAgemZBcEFkZFN0YShkZXYsIHNyYywgWk1fU1RBVEVfUFJFQVVUSCwgYXBJZCwgMCwgMCwgMCk7CisKKyAgICAgICAgICAgICAgICAgICAgLyogQVAgOiBjYWxsIHpmd0F1dGhOb3RpZnkoKSBmb3IgaG9zdCB0byBqdWRnZSAqLworICAgICAgICAgICAgICAgICAgICAvL3pmd0F1dGhOb3RpZnkoZGV2LCBzcmMpOworCisgICAgICAgICAgICAgICAgICAgIC8qIEFQIDogcmVzcG9uc2UgQXV0aCBzZXE9MiAqLworICAgICAgICAgICAgICAgICAgICByZXRTdGF0dXMgPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHNlcSA9PSAzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldEFsZ29TZXEgPSAweDQwMDAxOworCisgICAgICAgICAgICAgICAgaWYgKHdkLT5hcC5hdXRoU2hhcmluZyA9PSAxKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyogY2hlY2sgY2hhbGxlbmdlIHRleHQgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKHptd19idWZfcmVhZGgoZGV2LCBidWYsIDMwKzQpID09IDB4ODAxMCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpPTA7IGk8MTI4OyBpKyspCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdkLT5hcC5jaGFsbGVuZ2VUZXh0W2ldCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIT0gem13X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgMzIraSs0KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpID09IDEyOCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFsbGVuZ2VQYXNzZWQgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNoYWxsZW5nZVBhc3NlZCA9PSAxKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBBUCA6IHVwZGF0ZSBTVEEgdG8gYXV0aCAqLworICAgICAgICAgICAgICAgICAgICAgICAgemZBcEFkZFN0YShkZXYsIHNyYywgWk1fU1RBVEVfQVVUSCwgYXBJZCwgMCwgMCwgMCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFQIDogcmVzcG9uc2UgQXV0aCBzZXE9MiAqLworICAgICAgICAgICAgICAgICAgICAgICAgcmV0U3RhdHVzID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFQIDogcmVzcG9uc2UgQXV0aCBzZXE9MiwgY2hhbGxlbmdlIGZhaWx1cmUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldFN0YXR1cyA9IDE1OworCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBUT0RPIDogZGVsZXRlIFNUQSAqLworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgd2QtPmFwLmF1dGhTaGFyaW5nID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0QWxnb1NlcSA9IDB4NDAwMDE7CisgICAgICAgICAgICAgICAgcmV0U3RhdHVzID0gMTQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICB6ZlNlbmRNbUZyYW1lKGRldiwgWk1fV0xBTl9GUkFNRV9UWVBFX0FVVEgsIHNyYywgcmV0QWxnb1NlcSwKKyAgICAgICAgICAgIHJldFN0YXR1cywgYXBJZCk7CisgICAgcmV0dXJuOworfQorCit2b2lkIHpmQXBQcm9jZXNzQXNvY1JlcSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90KiBzcmMsIHUxNl90IGFwSWQpCit7CisgICAgdTE2X3QgYWlkID0gMHhmZmZmOworICAgIHU4X3QgZnJhbWVUeXBlOworICAgIHUxNl90IG9mZnNldDsKKyAgICB1OF90IHN0YVR5cGUgPSAwOworICAgIHU4X3QgcW9zVHlwZSA9IDA7CisgICAgdThfdCBxb3NJbmZvID0gMDsKKyAgICB1OF90IHRtcDsKKyAgICB1MTZfdCBpLCBqLCBrOworICAgIHUxNl90IGVuY01vZGUgPSAwOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworICAgIC8qIEFQIDogY2hlY2sgU1NJRCAqLworICAgIGlmICgob2Zmc2V0ID0gemZGaW5kRWxlbWVudChkZXYsIGJ1ZiwgWk1fV0xBTl9FSURfU1NJRCkpICE9IDB4ZmZmZikKKyAgICB7CisgICAgICAgIGsgPSAwOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgd2QtPmFwLnZhcE51bWJlcjsgaisrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoKHRtcCA9IHptd19idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICE9IHdkLT5hcC5zc2lkTGVuW2pdKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGsrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoayA9PSB3ZC0+YXAudmFwTnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHpsRGVhdXRoOworICAgICAgICB9CisKKyAgICAgICAgayA9IDA7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCB3ZC0+YXAudmFwTnVtYmVyOyBqKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaT0wOyBpPHdkLT5hcC5zc2lkTGVuW2pdOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCh0bXAgPSB6bXdfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMitpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICE9IHdkLT5hcC5zc2lkW2pdW2ldKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGkgPT0gd2QtPmFwLnNzaWRMZW5bal0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBJZCA9IGo7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaysrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChrID09IHdkLT5hcC52YXBOdW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gemxEZWF1dGg7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBUT0RPIDogY2hlY2sgY2FwYWJpbGl0eSAqLworCisgICAgLyogQVAgOiBjaGVjayBzdXBwb3J0IHJhdGUgKi8KKyAgICBpZiAoKG9mZnNldCA9IHpmRmluZEVsZW1lbnQoZGV2LCBidWYsIFpNX1dMQU5fRUlEX0VYVEVOREVEX1JBVEUpKSAhPSAweGZmZmYpCisgICAgeworICAgICAgICAvKiAxMWcgU1RBICovCisgICAgICAgIHN0YVR5cGUgPSAxOworICAgIH0KKyAgICAvL0NXWWFuZygrKQorICAgIGlmICgob2Zmc2V0ID0gemZGaW5kRWxlbWVudChkZXYsIGJ1ZiwgWk1fV0xBTl9FSURfSFRfQ0FQQUJJTElUWSkpICE9IDB4ZmZmZikKKyAgICB7CisgICAgICAgIC8qIDExbiBTVEEgKi8KKyAgICAgICAgc3RhVHlwZSA9IDI7CisgICAgfQorCisgICAgLyogVE9ETyA6IGRvIG5vdCBhbGxvdyAxMWIgU1RBIHRvIGFzc29jaWF0ZWQgaW4gUHVyZSBHIG1vZGUgKi8KKyAgICBpZiAod2QtPmFwLndsYW5UeXBlW2FwSWRdID09IFpNX1dMQU5fVFlQRV9QVVJFX0cgJiYgc3RhVHlwZSA9PSAwKQorICAgIHsKKyAgICAgICAgemZTZW5kTW1GcmFtZShkZXYsIFpNX1dMQU5fRlJBTUVfVFlQRV9ERUFVVEgsIHNyYywgMywgMCwgMCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvKiBJbiBwdXJlIEIgbW9kZSwgd2Ugc2V0IEcgU1RBIGludG8gQiBtb2RlICovCisgICAgaWYgKHdkLT5hcC53bGFuVHlwZVthcElkXSA9PSBaTV9XTEFOX1RZUEVfUFVSRV9CICYmIHN0YVR5cGUgPT0gMSkKKyAgICB7CisgICAgICAgIHN0YVR5cGUgPSAwOworICAgIH0KKworICAgIC8qIEFQIDogY2hlY2sgMTFpIGFuZCBXUEEgKi8KKyAgICAvKiBBUCA6IGNoZWNrIDExaCAqLworCisgICAgLyogQVAgOiBjaGVjayBXTUUgKi8KKyAgICBpZiAoKG9mZnNldCA9IHpmRmluZFdpZmlFbGVtZW50KGRldiwgYnVmLCAyLCAwKSkgIT0gMHhmZmZmKQorICAgIHsKKyAgICAgICAgLyogV01FIFNUQSAqLworICAgICAgICBxb3NUeXBlID0gMTsKKyAgICAgICAgem1fbXNnMF9tbShaTV9MVl8wLCAiV01FIFNUQSIpOworCisgICAgICAgIGlmICh3ZC0+YXAudWFwc2RFbmFibGVkICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHFvc0luZm8gPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrOCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAod2QtPmFwLndwYVN1cHBvcnRbYXBJZF0gPT0gMSkKKyAgICB7CisgICAgICAgIGlmICggKG9mZnNldCA9IHpmRmluZEVsZW1lbnQoZGV2LCBidWYsIFpNX1dMQU5fRUlEX1dQQV9JRSkpICE9IDB4ZmZmZiApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIGdldCBXUEEgSUUgKi8KKyAgICAgICAgICAgIHU4X3QgbGVuZ3RoID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzEpOworICAgICAgICAgICAgaWYgKGxlbmd0aCsyIDwgWk1fTUFYX1dQQUlFX1NJWkUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgemZDb3B5RnJvbVJ4QnVmZmVyKGRldiwgYnVmLCB3ZC0+YXAuc3Rhd3BhSWVbYXBJZF0sIG9mZnNldCwgbGVuZ3RoKzIpOworICAgICAgICAgICAgICAgIHdkLT5hcC5zdGF3cGFMZW5bYXBJZF0gPSBsZW5ndGgrMjsKKyAgICAgICAgICAgICAgICBlbmNNb2RlID0gMTsKKworCisgICAgICAgICAgICAgICAgem1fbXNnMV9tbShaTV9MVl8wLCAiV1BBIE1vZGUgemZ3QXNvY05vdGlmeSwgYXBJZD0iLCBhcElkKTsKKworICAgICAgICAgICAgICAgIC8qIEFQIDogQ2FsbCB6ZndBc29jTm90aWZ5KCkgKi8KKyAgICAgICAgICAgICAgICBpZiAod2QtPnpmY2JBc29jTm90aWZ5ICE9IE5VTEwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB3ZC0+emZjYkFzb2NOb3RpZnkoZGV2LCBzcmMsIHdkLT5hcC5zdGF3cGFJZVthcElkXSwgd2QtPmFwLnN0YXdwYUxlblthcElkXSwgYXBJZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdvdG8gemxEZWF1dGg7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoIChvZmZzZXQgPSB6ZkZpbmRFbGVtZW50KGRldiwgYnVmLCBaTV9XTEFOX0VJRF9SU05fSUUpKSAhPSAweGZmZmYgKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBnZXQgUlNOIElFICovCisgICAgICAgICAgICB1OF90IGxlbmd0aCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxKTsKKyAgICAgICAgICAgIGlmIChsZW5ndGgrMiA8IFpNX01BWF9XUEFJRV9TSVpFKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHpmQ29weUZyb21SeEJ1ZmZlcihkZXYsIGJ1Ziwgd2QtPmFwLnN0YXdwYUllW2FwSWRdLCBvZmZzZXQsIGxlbmd0aCsyKTsKKyAgICAgICAgICAgICAgICB3ZC0+YXAuc3Rhd3BhTGVuW2FwSWRdID0gbGVuZ3RoKzI7CisgICAgICAgICAgICAgICAgZW5jTW9kZSA9IDE7CisKKyAgICAgICAgICAgICAgICB6bV9tc2cxX21tKFpNX0xWXzAsICJSU04gTW9kZSB6ZndBc29jTm90aWZ5LCBhcElkPSIsIGFwSWQpOworCisgICAgICAgICAgICAgICAgLyogQVAgOiBDYWxsIHpmd0Fzb2NOb3RpZnkoKSAqLworICAgICAgICAgICAgICAgIGlmICh3ZC0+emZjYkFzb2NOb3RpZnkgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHdkLT56ZmNiQXNvY05vdGlmeShkZXYsIHNyYywgd2QtPmFwLnN0YXdwYUllW2FwSWRdLCB3ZC0+YXAuc3Rhd3BhTGVuW2FwSWRdLCBhcElkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ290byB6bERlYXV0aDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorI2lmZGVmIFpNX0VOQUJMRV9DRU5DCisgICAgICAgIGVsc2UgaWYgKCAob2Zmc2V0ID0gemZGaW5kRWxlbWVudChkZXYsIGJ1ZiwgWk1fV0xBTl9FSURfQ0VOQ19JRSkpICE9IDB4ZmZmZiApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIGdldCBDRU5DIElFICovCisgICAgICAgICAgICB1OF90IGxlbmd0aCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxKTsKKworICAgICAgICAgICAgaWYgKGxlbmd0aCsyIDwgWk1fTUFYX1dQQUlFX1NJWkUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgemZDb3B5RnJvbVJ4QnVmZmVyKGRldiwgYnVmLCB3ZC0+YXAuc3Rhd3BhSWVbYXBJZF0sIG9mZnNldCwgbGVuZ3RoKzIpOworICAgICAgICAgICAgICAgIHdkLT5hcC5zdGF3cGFMZW5bYXBJZF0gPSBsZW5ndGgrMjsKKyAgICAgICAgICAgICAgICBlbmNNb2RlID0gMTsKKworICAgICAgICAgICAgICAgIHptX21zZzFfbW0oWk1fTFZfMCwgIkNFTkMgTW9kZSB6ZndBc29jTm90aWZ5LCBhcElkPSIsIGFwSWQpOworCisgICAgICAgICAgICAgICAgLyogQVAgOiBDYWxsIHpmd0Fzb2NOb3RpZnkoKSAqLworICAgICAgICAgICAgICAgIGlmICh3ZC0+emZjYkNlbmNBc29jTm90aWZ5ICE9IE5VTEwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB3ZC0+emZjYkNlbmNBc29jTm90aWZ5KGRldiwgc3JjLCB3ZC0+YXAuc3Rhd3BhSWVbYXBJZF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2QtPmFwLnN0YXdwYUxlblthcElkXSwgYXBJZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdvdG8gemxEZWF1dGg7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyNlbmRpZiAvL1pNX0VOQUJMRV9DRU5DCisgICAgICAgIGVsc2UKKyAgICAgICAgeyAgIC8qIGFwIGlzIGVuY3J5cHRpb24gYnV0IHN0YSBoYXMgbm8gd3BhL3JzbiBpZSAqLworICAgICAgICAgICAgemZTZW5kTW1GcmFtZShkZXYsIFpNX1dMQU5fRlJBTUVfVFlQRV9ERUFVVEgsIHNyYywgNiwgMCwgMCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisgICAgLyogc3RhIGhhcyB3cGEvcnNuIGllIGJ1dCBhcCBpcyBubyBlbmNyeXB0aW9uICovCisgICAgaWYgKCh3ZC0+YXAud3BhU3VwcG9ydFthcElkXSA9PSAwKSAmJiAoZW5jTW9kZSA9PSAxKSkKKyAgICB7CisgICAgICAgIHpmU2VuZE1tRnJhbWUoZGV2LCBaTV9XTEFOX0ZSQU1FX1RZUEVfREVBVVRILCBzcmMsIDYsIDAsIDApOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLyogQVAgOiB1cGRhdGUgU1RBIHRvIGFzb2MgKi8KKyAgICBhaWQgPSB6ZkFwQWRkU3RhKGRldiwgc3JjLCBaTV9TVEFURV9BU09DLCBhcElkLCBzdGFUeXBlLCBxb3NUeXBlLCBxb3NJbmZvKTsKKworICAgIHpmQXBTdG9yZUFzb2NSZXFJZShkZXYsIGJ1ZiwgYWlkKTsKKworemxEZWF1dGg6CisgICAgLyogQVAgOiBzZW5kIGFzb2MgcnNwMiAqLworICAgIGlmIChhaWQgIT0gMHhmZmZmKQorICAgIHsKKyAgICAgICAgZnJhbWVUeXBlID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgMCk7CisKKyAgICAgICAgaWYgKGZyYW1lVHlwZSA9PSBaTV9XTEFOX0ZSQU1FX1RZUEVfQVNPQ1JFUSkKKyAgICAgICAgeworICAgICAgICAgICAgemZTZW5kTW1GcmFtZShkZXYsIFpNX1dMQU5fRlJBTUVfVFlQRV9BU09DUlNQLCBzcmMsIDAsIGFpZCsxLCBhcElkKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHpmU2VuZE1tRnJhbWUoZGV2LCBaTV9XTEFOX0ZSQU1FX1RZUEVfUkVBU09DUlNQLCBzcmMsIDAsIGFpZCsxLCBhcElkKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKiBUT0RPIDogc2VuZCBkZWF1dGhlbnRpY2F0aW9uICovCisgICAgICAgIHpmU2VuZE1tRnJhbWUoZGV2LCBaTV9XTEFOX0ZSQU1FX1RZUEVfREVBVVRILCBzcmMsIDYsIDAsIDApOworICAgIH0KKworICAgIHJldHVybjsKK30KKwordm9pZCB6ZkFwU3RvcmVBc29jUmVxSWUoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCBhaWQpCit7CisgICAgLy9zdHJ1Y3QgenNXbGFuQXNzb0ZyYW1lSGVhZGVyKiBwQXNzb0ZyYW1lOworICAgIC8vdThfdCAgcEJ1ZltzaXplb2Yoc3RydWN0IHpzV2xhbkFzc29GcmFtZUhlYWRlcildOworICAgIHUxNl90IG9mZnNldDsKKyAgICB1MzJfdCBpOworICAgIHUxNl90IGxlbmd0aDsKKyAgICB1OF90ICAqaHRjYXA7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBmb3IgKGk9MDsgaTx3ZC0+c3RhLmFzb2NSc3BGcmFtZUJvZHlTaXplOyBpKyspCisgICAgeworICAgICAgICB3ZC0+c3RhLmFzb2NSc3BGcmFtZUJvZHlbaV0gPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBpKzI0KTsKKyAgICB9CisgICAgLyogY2FwYWJpbGl0eTogMiBvY3RldHMgKi8KKyAgICBvZmZzZXQgPSAyNDsKKworICAgIC8qIExpc3RlbiBpbnRlcnZhbDogMiBvY3RldHMgKi8KKyAgICBvZmZzZXQgPSAyNjsKKworICAgIC8qIFNTSUQgKi8KKyAgICBvZmZzZXQgPSAyODsKKworICAgIC8qIHN1cHBvcnRlZCByYXRlcyAqLworICAgIGlmICgob2Zmc2V0ID0gemZGaW5kRWxlbWVudChkZXYsIGJ1ZiwgWk1fV0xBTl9FSURfU1VQUE9SVF9SQVRFKSkgPT0gMHhmZmZmKQorICAgICAgICByZXR1cm47CisgICAgbGVuZ3RoID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0ICsgMSk7CisKKyAgICAvKiBleHRlbmRlZCBzdXBwb3J0ZWQgcmF0ZXMgKi8KKyAgICBpZiAoKG9mZnNldCA9IHpmRmluZEVsZW1lbnQoZGV2LCBidWYsIFpNX1dMQU5fRUlEX0VYVEVOREVEX1JBVEUpKSA9PSAweGZmZmYpCisgICAgICAgIHJldHVybjsKKyAgICBsZW5ndGggPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQgKyAxKTsKKworICAgIC8qIHBvd2VyIGNhcGFiaWxpdHk6NCBvY3RldHMgKi8KKyAgICBvZmZzZXQgPSBvZmZzZXQgKyAyICsgbGVuZ3RoOworCisgICAgLyogc3VwcG9ydGVkIGNoYW5uZWxzOiA0IG9jdGV0cyAqLworICAgIG9mZnNldCA9IG9mZnNldCArIDIgKyA0OworCisgICAgLyogUlNOICovCisKKyAgICAvKiBRb1MgKi8KKworICAgIC8qIEhUIGNhcGFiaWxpdGllczogMjggb2N0ZXRzICovCisgICAgaWYgKChvZmZzZXQgPSB6ZkZpbmRFbGVtZW50KGRldiwgYnVmLCBaTV9XTEFOX0VJRF9IVF9DQVBBQklMSVRZKSkgIT0gMHhmZmZmKSB7CisgICAgICAgIC8qIGF0aGVyb3MgcHJlIG4gKi8KKyAgICAgICAgaHRjYXAgPSAodThfdCAqKSZ3ZC0+YXAuaWVbYWlkXS5IdENhcDsKKyAgICAgICAgaHRjYXBbMF0gPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQpOworICAgICAgICBodGNhcFsxXSA9IDI2OworICAgICAgICBmb3IgKGk9MTsgaTw9MjY7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaHRjYXBbaSsxXSA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCArIGkpOworICAgICAgICAgICAgem1fZGVidWdfbXNnMigiQVNPQzogIEhUIENhcGFiaWxpdGllcywgaHRjYXA9IiwgaHRjYXBbaSsxXSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBlbHNlIGlmICgob2Zmc2V0ID0gemZGaW5kRWxlbWVudChkZXYsIGJ1ZiwgWk1fV0xBTl9QUkVOMl9FSURfSFRDQVBBQklMSVRZKSkgIT0gMHhmZmZmKSB7CisgICAgICAgIC8qIHByZSBuIDIuMCBzdGFuZGFyZCAqLworICAgICAgICBodGNhcCA9ICh1OF90ICopJndkLT5hcC5pZVthaWRdLkh0Q2FwOworICAgICAgICBmb3IgKGk9MDsgaTwyODsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBodGNhcFtpXSA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCArIGkpOworICAgICAgICAgICAgem1fZGVidWdfbXNnMigiQVNPQzogIEhUIENhcGFiaWxpdGllcywgaHRjYXA9IiwgaHRjYXBbaV0pOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAvKiBub3QgMTFuIEFQICovCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKworICAgIC8qIHN1cHBvcnRlZCByZWd1bGF0b3J5IGNsYXNzZXMgKi8KKyAgICBvZmZzZXQgPSBvZmZzZXQgKyBsZW5ndGg7CisgICAgLy9sZW5ndGggPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQgKyAxKTsKKyAgICB7CisgICAgdThfdCAqaHRjYXA7CisgICAgaHRjYXAgPSAodThfdCAqKSZ3ZC0+c3RhLmllLkh0SW5mbzsKKyAgICAvL3ptX2RlYnVnX21zZzIoIkFTT0M6ICBIVCBDYXBhYmlsaXRpZXMgaW5mbz0iLCAoKHUxNl90ICopaHRjYXApWzFdKTsKKyAgICAvL3ptX2RlYnVnX21zZzIoIkFTT0M6ICBBLU1QRFUgcGFyYW1ldGVycz0iLCBodGNhcFs0XSk7CisgICAgLy96bV9kZWJ1Z19tc2cyKCJBU09DOiAgU3VwcG9ydGVkIE1DUyBzZXQ9IiwgKCh1MzJfdCAqKWh0Y2FwKVsxXT4+OCk7CisgICAgfQorCit9CisKK3ZvaWQgemZBcFByb2Nlc3NBc29jUnNwKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZikKK3sKKworfQorCit2b2lkIHpmQXBQcm9jZXNzRGVhdXRoKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3QqIHNyYywgdTE2X3QgYXBJZCkKK3sKKyAgICB1MTZfdCBhaWQ7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIC8qIEFQIDogaWYgU0E9YXNzb2NpYXRlZCBTVEEgdGhlbiBkZWF1dGhlbnRpY2F0ZSBTVEEgKi8KKyAgICBpZiAoKGFpZCA9IHpmQXBGaW5kU3RhKGRldiwgc3JjKSkgIT0gMHhmZmZmKQorICAgIHsKKyAgICAgICAgLyogQ2xlYXIgU1RBIHRhYmxlICovCisgICAgICAgIHdkLT5hcC5zdGFUYWJsZVthaWRdLnZhbGlkID0gMDsKKyAgICAgICAgaWYgKHdkLT56ZmNiRGlzQXNvY05vdGlmeSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB3ZC0+emZjYkRpc0Fzb2NOb3RpZnkoZGV2LCAodThfdCopc3JjLCBhcElkKTsKKyAgICAgICAgfQorICAgIH0KKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCit9CisKK3ZvaWQgemZBcFByb2Nlc3NEaXNhc29jKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3QqIHNyYywgdTE2X3QgYXBJZCkKK3sKKyAgICB1MTZfdCBhaWQ7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIC8qIEFQIDogaWYgU0E9YXNzb2NpYXRlZCBTVEEgdGhlbiBkZWF1dGhlbnRpY2F0ZSBTVEEgKi8KKyAgICBpZiAoKGFpZCA9IHpmQXBGaW5kU3RhKGRldiwgc3JjKSkgIT0gMHhmZmZmKQorICAgIHsKKyAgICAgICAgLyogQ2xlYXIgU1RBIHRhYmxlICovCisgICAgICAgIHdkLT5hcC5zdGFUYWJsZVthaWRdLnZhbGlkID0gMDsKKyAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgaWYgKHdkLT56ZmNiRGlzQXNvY05vdGlmeSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB3ZC0+emZjYkRpc0Fzb2NOb3RpZnkoZGV2LCAodThfdCopc3JjLCBhcElkKTsKKyAgICAgICAgfQorICAgIH0KKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCit9CisKKwordm9pZCB6ZkFwUHJvY2Vzc1Byb2JlUnNwKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1Ziwgc3RydWN0IHpzQWRkaXRpb25JbmZvKiBBZGRJbmZvKQoreworI2lmIDAKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bV9tc2cwX21tKFpNX0xWXzAsICJSeCBwcm9iZXJzcCIpOworCisgICAgLyogR2F0aGVyIHNjYW4gcmVzdWx0ICovCisKKyAgICAvL3ptX2RlYnVnX21zZzEoImJzc0xpc3QgQ291bnQgPSAiLCB3ZC0+c3RhLmJzc0xpc3QuYnNzQ291bnQpOworICAgIC8qIHJldHVybiBpZiBub3QgaW4gc2Nhbm5pbmcgKi8KKyAgICBpZiAoKHdkLT5oZWFydEJlYXROb3RpZmljYXRpb24gJiBaTV9CU1NJRF9MSVNUX1NDQU4pCisgICAgICAgICAgICAhPSBaTV9CU1NJRF9MSVNUX1NDQU4pCisgICAgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy9pZiAoIHdkLT5zdGEucFVwZGF0ZUJzc0xpc3QtPmJzc0NvdW50ID09IFpNX01BWF9CU1MgKQorICAgIGlmICggd2QtPnN0YS5ic3NMaXN0LmJzc0NvdW50ID09IFpNX01BWF9CU1MgKQorICAgIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHpmUHJvY2Vzc1Byb2JlUnNwKGRldiwgYnVmLCBBZGRJbmZvKTsKKworI2VuZGlmCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZkFwQWRkSWVTc2lkICAgICAgICAgICAgICAgKi8KKy8qICAgICAgQWRkIEFQIGluZm9ybWF0aW9uIGVsZW1lbnQgU1NJRCB0byBidWZmZXIuICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGJ1ZiA6IGJ1ZmZlciB0byBhZGQgaW5mb3JtYXRpb24gZWxlbWVudCAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBvZmZzZXQgOiBhZGQgaW5mb3JtYXRpb24gZWxlbWVudCBmcm9tIHRoaXMgb2Zmc2V0ICAgICAgICAgICAgICAgKi8KKy8qICAgICAgdmFwIDogdmlydHVhbCBBUCBJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYnVmZmVyIG9mZnNldCBhZnRlciBhZGRpbmcgaW5mb3JtYXRpb24gZWxlbWVudCAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiBDaGVuICAgICAgICBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgIDIwMDUuMTEgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UxNl90IHpmQXBBZGRJZVNzaWQoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCBvZmZzZXQsIHUxNl90IHZhcCkKK3sKKyAgICB1MTZfdCBpOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgLyogRWxlbWVudCBJRCAqLworICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgWk1fV0xBTl9FSURfU1NJRCk7CisKKyAgICAvKiBFbGVtZW50IExlbmd0aCAqLworICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgd2QtPmFwLnNzaWRMZW5bdmFwXSk7CisKKyAgICAvKiBJbmZvcm1hdGlvbiA6IFNTSUQgKi8KKyAgICBmb3IgKGk9MDsgaTx3ZC0+YXAuc3NpZExlblt2YXBdOyBpKyspCisgICAgeworICAgICAgICB6bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIHdkLT5hcC5zc2lkW3ZhcF1baV0pOworICAgIH0KKworICAgIHJldHVybiBvZmZzZXQ7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmQXBBZGRJZVRpbSAgICAgICAgICAgICAgICAqLworLyogICAgICBBZGQgQVAgaW5mb3JtYXRpb24gZWxlbWVudCBUSU0gdG8gYnVmZmVyLiAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYnVmIDogYnVmZmVyIHRvIGFkZCBpbmZvcm1hdGlvbiBlbGVtZW50ICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIG9mZnNldCA6IGFkZCBpbmZvcm1hdGlvbiBlbGVtZW50IGZyb20gdGhpcyBvZmZzZXQgICAgICAgICAgICAgICAqLworLyogICAgICB2YXAgOiB2aXJ0dWFsIEFQIElEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBidWZmZXIgb2Zmc2V0IGFmdGVyIGFkZGluZyBpbmZvcm1hdGlvbiBlbGVtZW50ICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBTdGVwaGVuIENoZW4gICAgICAgIFp5REFTIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24gICAgMjAwNS4xMSAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTE2X3QgemZBcEFkZEllVGltKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3Qgb2Zmc2V0LCB1MTZfdCB2YXApCit7CisgICAgdThfdCB1bmlCaXRNYXBbOV07CisgICAgdTE2X3QgaGlnaGVzdEJ5dGU7CisgICAgdTE2X3QgaTsKKyAgICB1MTZfdCBsZW5PZmZzZXQ7CisgICAgdTE2X3QgaWQ7CisgICAgdTE2X3QgZHN0WzNdOworICAgIHUxNl90IGFpZDsKKyAgICB1MTZfdCBiaXRQb3NpdGlvbjsKKyAgICB1MTZfdCBieXRlUG9zaXRpb247CisgICAgemJ1Zl90KiBwc0J1ZjsKKyAgICB6YnVmX3QqIHRtcEJ1ZkFycmF5W1pNX1VOSV9BUlJBWV9TSVpFXTsKKyAgICB1MTZfdCB0bXBCdWZBcnJheVNpemUgPSAwOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIC8qIEVsZW1lbnQgSUQgKi8KKyAgICB6bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIFpNX1dMQU5fRUlEX1RJTSk7CisKKyAgICAvKiBvZmZzZXQgb2YgRWxlbWVudCBMZW5ndGggKi8KKyAgICBsZW5PZmZzZXQgPSBvZmZzZXQrKzsKKworICAgIC8qIEluZm9ybWF0aW9uIDogVElNICovCisgICAgLyogRFRJTSBjb3VudCAqLworICAgIC8qIFRPRE8gOiBEb2Vzbid0IHdvcmsgZm9yIFZpcnR1YWwgQVAncyBjYXNlICovCisgICAgd2QtPkN1cnJlbnREdGltQ291bnQrKzsKKyAgICBpZiAod2QtPkN1cnJlbnREdGltQ291bnQgPj0gd2QtPmR0aW0pCisgICAgeworICAgICAgICB3ZC0+Q3VycmVudER0aW1Db3VudCA9IDA7CisgICAgfQorICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgd2QtPkN1cnJlbnREdGltQ291bnQpOworICAgIC8qIERUSU0gcGVyaW9kICovCisgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCB3ZC0+ZHRpbSk7CisgICAgLyogYml0bWFwIG9mZnNldCAqLworICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgMCk7CisKKyAgICAvKiBVcGRhdGUgQkNNQyBiaXQgKi8KKyAgICBpZiAod2QtPkN1cnJlbnREdGltQ291bnQgPT0gMCkKKyAgICB7CisgICAgICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgIHdkLT5hcC50aW1CY21jQml0W3ZhcF0gPSAod2QtPmFwLmJjbWNUYWlsW3ZhcF0hPXdkLT5hcC5iY21jSGVhZFt2YXBdKT8xOjA7CisgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHdkLT5hcC50aW1CY21jQml0W3ZhcF0gPSAwOworICAgIH0KKworICAgIC8qIFVwZGF0ZSBVbmljYXN0IGJpdG1hcCAqLworICAgIC8qIHJlc2V0IGJpdCBtYXAgKi8KKyAgICBmb3IgKGk9MDsgaTw5OyBpKyspCisgICAgeworICAgICAgICB1bmlCaXRNYXBbaV0gPSAwOworICAgIH0KKyAgICBoaWdoZXN0Qnl0ZSA9IDA7CisjaWYgMQorCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIGlkID0gd2QtPmFwLnVuaUhlYWQ7CisgICAgd2hpbGUgKGlkICE9IHdkLT5hcC51bmlUYWlsKQorICAgIHsKKyAgICAgICAgcHNCdWYgPSB3ZC0+YXAudW5pQXJyYXlbaWRdOworCisgICAgICAgIC8qIFRPRE8gOiBBZ2luZyBQUyBmcmFtZSBhZnRlciBxdWV1aW5nIGZvciBtb3JlIHRoYW4gMTAgc2Vjb25kcyAqLworCisgICAgICAgIC8qIGdldCBkZXN0aW5hdGlvbiBTVEEncyBhaWQgKi8KKyAgICAgICAgZHN0WzBdID0gem13X3R4X2J1Zl9yZWFkaChkZXYsIHBzQnVmLCAwKTsKKyAgICAgICAgZHN0WzFdID0gem13X3R4X2J1Zl9yZWFkaChkZXYsIHBzQnVmLCAyKTsKKyAgICAgICAgZHN0WzJdID0gem13X3R4X2J1Zl9yZWFkaChkZXYsIHBzQnVmLCA0KTsKKyAgICAgICAgaWYgKChhaWQgPSB6ZkFwRmluZFN0YShkZXYsIGRzdCkpICE9IDB4ZmZmZikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHdkLT5hcC5zdGFUYWJsZVthaWRdLnBzTW9kZSAhPSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHptX21zZzFfbW0oWk1fTFZfMCwgImFpZD0iLGFpZCk7CisgICAgICAgICAgICAgICAgYWlkKys7CisgICAgICAgICAgICAgICAgem1fYXNzZXJ0KGFpZDw9NjQpOworICAgICAgICAgICAgICAgIGJpdFBvc2l0aW9uID0gKDEgPDwgKGFpZCAmIDB4NykpOworICAgICAgICAgICAgICAgIGJ5dGVQb3NpdGlvbiA9IChhaWQgPj4gMyk7CisgICAgICAgICAgICAgICAgdW5pQml0TWFwW2J5dGVQb3NpdGlvbl0gfD0gYml0UG9zaXRpb247CisKKyAgICAgICAgICAgICAgICBpZiAoYnl0ZVBvc2l0aW9uPmhpZ2hlc3RCeXRlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaGlnaGVzdEJ5dGUgPSBieXRlUG9zaXRpb247CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlkID0gKGlkKzEpICYgKFpNX1VOSV9BUlJBWV9TSVpFLTEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHptX21zZzBfbW0oWk1fTFZfMCwgIlNlbmQgUFMgZnJhbWUgd2hpY2ggU1RBIG5vIGxvbmdlciBpbiBQUyBtb2RlIik7CisgICAgICAgICAgICAgICAgLyogU2VuZCBQUyBmcmFtZSB3aGljaCBTVEEgbm8gbG9uZ2VyIGluIFBTIG1vZGUgKi8KKyAgICAgICAgICAgICAgICB6ZkFwUmVtb3ZlRnJvbVBzUXVldWUoZGV2LCBpZCwgZHN0KTsKKyAgICAgICAgICAgICAgICB0bXBCdWZBcnJheVt0bXBCdWZBcnJheVNpemUrK10gPSBwc0J1ZjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHptX21zZzBfbW0oWk1fTFZfMCwgIkZyZWUgZ2FyYmFnZSBQUyBmcmFtZSIpOworICAgICAgICAgICAgLyogRnJlZSBnYXJiYWdlIFBTIGZyYW1lICovCisgICAgICAgICAgICB6ZkFwUmVtb3ZlRnJvbVBzUXVldWUoZGV2LCBpZCwgZHN0KTsKKyAgICAgICAgICAgIHpmd0J1ZkZyZWUoZGV2LCBwc0J1ZiwgMCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworI2VuZGlmCisKKyAgICB6ZlF1ZXVlR2VuZXJhdGVVYXBzZFRpbShkZXYsIHdkLT5hcC51YXBzZFEsIHVuaUJpdE1hcCwgJmhpZ2hlc3RCeXRlKTsKKworICAgIHptX21zZzFfbW0oWk1fTFZfMywgImJtPSIsdW5pQml0TWFwWzBdKTsKKyAgICB6bV9tc2cxX21tKFpNX0xWXzMsICJoaWdoZXN0Qnl0ZT0iLGhpZ2hlc3RCeXRlKTsKKyAgICB6bV9tc2cxX21tKFpNX0xWXzMsICJ0aW1CY21jQml0W109Iix3ZC0+YXAudGltQmNtY0JpdFt2YXBdKTsKKworICAgIC8qIGJpdG1hcCAqLworICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywKKyAgICAgICAgICAgICAgICAgICAgICAgICB1bmlCaXRNYXBbMF0gfCB3ZC0+YXAudGltQmNtY0JpdFt2YXBdKTsKKyAgICBmb3IgKGk9MDsgaTxoaWdoZXN0Qnl0ZTsgaSsrKQorICAgIHsKKyAgICAgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCB1bmlCaXRNYXBbaSsxXSk7CisgICAgfQorCisgICAgLyogRWxlbWVudCBMZW5ndGggKi8KKyAgICB6bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1ZiwgbGVuT2Zmc2V0LCBoaWdoZXN0Qnl0ZSs0KTsKKworICAgIGZvciAoaT0wOyBpPHRtcEJ1ZkFycmF5U2l6ZTsgaSsrKQorICAgIHsKKyAgICAgICAgLyogUHV0IHRvIFZUWFFbYWNdICovCisgICAgICAgIHpmUHV0VnR4cShkZXYsIHRtcEJ1ZkFycmF5W2ldKTsKKyAgICB9CisgICAgLyogUHVzaCBWVFhRW2FjXSAqLworICAgIHpmUHVzaFZ0eHEoZGV2KTsKKworICAgIHJldHVybiBvZmZzZXQ7Cit9CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZBcFJlbW92ZUZyb21Qc1F1ZXVlICAgICAgICovCisvKiAgICAgIFJlbW92ZSB6YnVmIGZyb20gUFMgcXVldWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGRldiA6IGRldmljZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBpZCA6IGluZGV4IGluIHBzIHF1ZXVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBtb3JlIGRhdGEgYml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBTdGVwaGVuIENoZW4gICAgICAgIEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMsIElOQy4gICAgMjAwNy4xICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordThfdCB6ZkFwUmVtb3ZlRnJvbVBzUXVldWUoemRldl90KiBkZXYsIHUxNl90IGlkLCB1MTZfdCogYWRkcikKK3sKKyAgICB1MTZfdCBkc3RbM107CisgICAgdTE2X3QgbmlkOworICAgIHU4X3QgbW9yZURhdGEgPSAwOworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHdkLT5hcC51bmlUYWlsID0gKHdkLT5hcC51bmlUYWlsLTEpICYgKFpNX1VOSV9BUlJBWV9TSVpFLTEpOworICAgIHdoaWxlIChpZCAhPSB3ZC0+YXAudW5pVGFpbCkKKyAgICB7CisgICAgICAgIG5pZCA9IChpZCArIDEpICYgKFpNX1VOSV9BUlJBWV9TSVpFIC0gMSk7CisgICAgICAgIHdkLT5hcC51bmlBcnJheVtpZF0gPSB3ZC0+YXAudW5pQXJyYXlbbmlkXTsKKworICAgICAgICAvKiBTZWFyY2ggdW50aWwgdGFpbCB0byBjb25maWcgbW9yZSBkYXRhIGJpdCAqLworICAgICAgICBkc3RbMF0gPSB6bXdfYnVmX3JlYWRoKGRldiwgd2QtPmFwLnVuaUFycmF5W2lkXSwgMCk7CisgICAgICAgIGRzdFsxXSA9IHptd19idWZfcmVhZGgoZGV2LCB3ZC0+YXAudW5pQXJyYXlbaWRdLCAyKTsKKyAgICAgICAgZHN0WzJdID0gem13X2J1Zl9yZWFkaChkZXYsIHdkLT5hcC51bmlBcnJheVtpZF0sIDQpOworICAgICAgICBpZiAoKGFkZHJbMF0gPT0gZHN0WzBdKSAmJiAoYWRkclsxXSA9PSBkc3RbMV0pCisgICAgICAgICAgICAgICAgJiYgKGFkZHJbMl0gPT0gZHN0WzJdKSkKKyAgICAgICAgeworICAgICAgICAgICAgbW9yZURhdGEgPSAweDIwOworICAgICAgICB9CisKKyAgICAgICAgaWQgPSBuaWQ7CisgICAgfQorICAgIHJldHVybiBtb3JlRGF0YTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmQXBBZGRJZVdtZVBhcmEgICAgICAgICAgICAqLworLyogICAgICBBZGQgV01FIFBhcmFtZXRlciBFbGVtZW50IHRvIGJ1ZmZlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYnVmIDogYnVmZmVyIHRvIGFkZCBpbmZvcm1hdGlvbiBlbGVtZW50ICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIG9mZnNldCA6IGFkZCBpbmZvcm1hdGlvbiBlbGVtZW50IGZyb20gdGhpcyBvZmZzZXQgICAgICAgICAgICAgICAqLworLyogICAgICB2YXAgOiB2aXJ0dWFsIEFQIElEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBidWZmZXIgb2Zmc2V0IGFmdGVyIGFkZGluZyBpbmZvcm1hdGlvbiBlbGVtZW50ICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBTdGVwaGVuIENoZW4gICAgICAgIFp5REFTIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24gICAgMjAwNi4xICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTE2X3QgemZBcEFkZEllV21lUGFyYSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IG9mZnNldCwgdTE2X3QgdmFwKQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIC8qIEVsZW1lbnQgSUQgKi8KKyAgICB6bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIFpNX1dMQU5fRUlEX1dJRklfSUUpOworCisgICAgLyogRWxlbWVudCBMZW5ndGggKi8KKyAgICB6bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIDI0KTsKKworICAgIC8qIE9VSSAqLworICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgMHgwMCk7CisgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCAweDUwKTsKKyAgICB6bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIDB4RjIpOworICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgMHgwMik7CisgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCAweDAxKTsKKyAgICB6bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIDB4MDEpOworCisgICAgLyogUW9TIEluZm8gKi8KKyAgICBpZiAod2QtPmFwLnVhcHNkRW5hYmxlZCkKKyAgICB7CisgICAgICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgMHg4MSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCAweDAxKTsKKyAgICB9CisKKyAgICAvKiBSZXNlcnZlZCAqLworICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgMHgwMCk7CisKKyAgICAvKiBCZXN0IEVmZm9ydCBBQyBwYXJhbWV0ZXJzICovCisgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCAweDAzKTsKKyAgICB6bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIDB4QTQpOworICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgMHgwMCk7CisgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCAweDAwKTsKKyAgICAvKiBCYWNrZnJvdW5kIEFDIHBhcmFtZXRlcnMgKi8KKyAgICB6bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIDB4MjcpOworICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgMHhBNCk7CisgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCAweDAwKTsKKyAgICB6bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIDB4MDApOworICAgIC8qIFZpZGVvIEFDIHBhcmFtZXRlcnMgKi8KKyAgICB6bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIDB4NDIpOworICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgMHg0Myk7CisgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCAweDVFKTsKKyAgICB6bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIDB4MDApOworICAgIC8qIFZvaWNlIEFDIHBhcmFtZXRlcnMgKi8KKyAgICB6bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIDB4NjIpOworICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgMHgzMik7CisgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCAweDJGKTsKKyAgICB6bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIDB4MDApOworCisgICAgcmV0dXJuIG9mZnNldDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZBcFNlbmRCZWFjb24gICAgICAgICAgICAgICovCisvKiAgICAgIFNuZWQgQVAgbW9kZSBiZWFjb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGRldiA6IGRldmljZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIG5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFN0ZXBoZW4gQ2hlbiAgICAgICAgWnlEQVMgVGVjaG5vbG9neSBDb3Jwb3JhdGlvbiAgICAyMDA1LjExICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHpmQXBTZW5kQmVhY29uKHpkZXZfdCogZGV2KQoreworICAgIHpidWZfdCogYnVmOworICAgIHUxNl90IG9mZnNldDsKKyAgICB1MTZfdCB2YXA7CisgICAgdTE2X3Qgc2VxOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHdkLT5hcC5iZWFjb25Db3VudGVyKys7CisgICAgaWYgKHdkLT5hcC5iZWFjb25Db3VudGVyID49IHdkLT5hcC52YXBOdW1iZXIpCisgICAgeworICAgICAgICB3ZC0+YXAuYmVhY29uQ291bnRlciA9IDA7CisgICAgfQorICAgIHZhcCA9IHdkLT5hcC5iZWFjb25Db3VudGVyOworCisKKyAgICB6bV9tc2cxX21tKFpNX0xWXzIsICJTZW5kIGJlYWNvbiwgdmFwPSIsIHZhcCk7CisKKyAgICAvKiBUQkQgOiBNYXhpbXVtIHNpemUgb2YgYmVhY29uICovCisgICAgaWYgKChidWYgPSB6ZndCdWZBbGxvY2F0ZShkZXYsIDEwMjQpKSA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgem1fbXNnMF9tbShaTV9MVl8wLCAiQWxsb2MgYmVhY29uIGJ1ZiBGYWlsISIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgb2Zmc2V0ID0gMDsKKworICAgIC8qIHdsYW4gaGVhZGVyICovCisgICAgLyogRnJhbWUgY29udHJvbCAqLworICAgIHptd190eF9idWZfd3JpdGVoKGRldiwgYnVmLCBvZmZzZXQsIDB4MDA4MCk7CisgICAgb2Zmc2V0Kz0yOworICAgIC8qIER1cmF0aW9uICovCisgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCwgMHgwMDAwKTsKKyAgICBvZmZzZXQrPTI7CisgICAgLyogQWRkcmVzcyAxICovCisgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCwgMHhmZmZmKTsKKyAgICBvZmZzZXQrPTI7CisgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCwgMHhmZmZmKTsKKyAgICBvZmZzZXQrPTI7CisgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCwgMHhmZmZmKTsKKyAgICBvZmZzZXQrPTI7CisgICAgLyogQWRkcmVzcyAyICovCisgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCwgd2QtPm1hY0FkZHJbMF0pOworICAgIG9mZnNldCs9MjsKKyAgICB6bXdfdHhfYnVmX3dyaXRlaChkZXYsIGJ1Ziwgb2Zmc2V0LCB3ZC0+bWFjQWRkclsxXSk7CisgICAgb2Zmc2V0Kz0yOworI2lmZGVmIFpNX1ZBUE1PREVfTVVMVElMRV9TU0lECisgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCwgd2QtPm1hY0FkZHJbMl0pOyAvL011bHRpcGxlIFNTSUQKKyNlbHNlCisgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCwgKHdkLT5tYWNBZGRyWzJdKyh2YXA8PDgpKSk7IC8vVkFQCisjZW5kaWYKKyAgICBvZmZzZXQrPTI7CisgICAgLyogQWRkcmVzcyAzICovCisgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCwgd2QtPm1hY0FkZHJbMF0pOworICAgIG9mZnNldCs9MjsKKyAgICB6bXdfdHhfYnVmX3dyaXRlaChkZXYsIGJ1Ziwgb2Zmc2V0LCB3ZC0+bWFjQWRkclsxXSk7CisgICAgb2Zmc2V0Kz0yOworI2lmZGVmIFpNX1ZBUE1PREVfTVVMVElMRV9TU0lECisgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCwgd2QtPm1hY0FkZHJbMl0pOyAvL011bHRpcGxlIFNTSUQKKyNlbHNlCisgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCwgKHdkLT5tYWNBZGRyWzJdKyh2YXA8PDgpKSk7IC8vVkFQCisjZW5kaWYKKyAgICBvZmZzZXQrPTI7CisKKyAgICAvKiBTZXF1ZW5jZSBudW1iZXIgKi8KKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIHNlcSA9ICgod2QtPm1tc2VxKyspPDw0KTsKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIHptd190eF9idWZfd3JpdGVoKGRldiwgYnVmLCBvZmZzZXQsIHNlcSk7CisgICAgb2Zmc2V0Kz0yOworCisgICAgLyogMjQtMzEgVGltZSBTdGFtcCA6IGhhcmR3YXJlIHdpbGwgZmlsbCB0aGlzIGZpZWxkICovCisgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCwgMCk7CisgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCsyLCAwKTsKKyAgICB6bXdfdHhfYnVmX3dyaXRlaChkZXYsIGJ1Ziwgb2Zmc2V0KzQsIDApOworICAgIHptd190eF9idWZfd3JpdGVoKGRldiwgYnVmLCBvZmZzZXQrNiwgMCk7CisgICAgb2Zmc2V0Kz04OworCisgICAgLyogQmVhY29uIEludGVydmFsICovCisgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCwgd2QtPmJlYWNvbkludGVydmFsKTsKKyAgICBvZmZzZXQrPTI7CisKKyAgICAvKiBDYXBhYmlsaXR5ICovCisgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCwgd2QtPmFwLmNhcGFiW3ZhcF0pOworICAgIG9mZnNldCs9MjsKKworICAgIC8qIFNTSUQgKi8KKyAgICBpZiAod2QtPmFwLmhpZGVTc2lkW3ZhcF0gPT0gMCkKKyAgICB7CisgICAgICAgIG9mZnNldCA9IHpmQXBBZGRJZVNzaWQoZGV2LCBidWYsIG9mZnNldCwgdmFwKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCBaTV9XTEFOX0VJRF9TU0lEKTsKKyAgICAgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCAwKTsKKworICAgIH0KKworICAgIC8qIFN1cHBvcnQgUmF0ZSAqLworICAgIGlmICggd2QtPmZyZXF1ZW5jeSA8IDMwMDAgKQorICAgIHsKKyAgICBvZmZzZXQgPSB6Zk1tQWRkSWVTdXBwb3J0UmF0ZShkZXYsIGJ1Ziwgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFpNX1dMQU5fRUlEX1NVUFBPUlRfUkFURSwgWk1fUkFURV9TRVRfQ0NLKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgb2Zmc2V0ID0gemZNbUFkZEllU3VwcG9ydFJhdGUoZGV2LCBidWYsIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaTV9XTEFOX0VJRF9TVVBQT1JUX1JBVEUsIFpNX1JBVEVfU0VUX09GRE0pOworICAgIH0KKworICAgIC8qIERTIHBhcmFtZXRlciBzZXQgKi8KKyAgICBvZmZzZXQgPSB6Zk1tQWRkSWVEcyhkZXYsIGJ1Ziwgb2Zmc2V0KTsKKworICAgIC8qIFRJTSAqLworICAgIG9mZnNldCA9IHpmQXBBZGRJZVRpbShkZXYsIGJ1Ziwgb2Zmc2V0LCB2YXApOworCisgICAgLyogSWYgV0xBTiBUeXBlIGlzIG5vdCBQVVJFIEIgKi8KKyAgICBpZiAod2QtPmFwLndsYW5UeXBlW3ZhcF0gIT0gWk1fV0xBTl9UWVBFX1BVUkVfQikKKyAgICB7CisgICAgICAgIGlmICggd2QtPmZyZXF1ZW5jeSA8IDMwMDAgKQorICAgICAgICB7CisgICAgICAgIC8qIEVSUCBJbmZvcm1hdGlvbiAqLworICAgICAgICBvZmZzZXQgPSB6Zk1tQWRkSWVFcnAoZGV2LCBidWYsIG9mZnNldCk7CisKKyAgICAgICAgLyogRXh0ZW5kZWQgU3VwcG9ydGVkIFJhdGVzICovCisgICAgICAgIG9mZnNldCA9IHpmTW1BZGRJZVN1cHBvcnRSYXRlKGRldiwgYnVmLCBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFpNX1dMQU5fRUlEX0VYVEVOREVEX1JBVEUsIFpNX1JBVEVfU0VUX09GRE0pOworICAgIH0KKyAgICB9CisKKyAgICAvKiBUT0RPIDogY291bnRyeSBpbmZvcm1hdGlvbiAqLworICAgIC8qIFRPRE8gOiBSU04gKi8KKyAgICBpZiAod2QtPmFwLndwYVN1cHBvcnRbdmFwXSA9PSAxKQorICAgIHsKKyAgICAgICAgb2Zmc2V0ID0gemZNbUFkZEllV3BhKGRldiwgYnVmLCBvZmZzZXQsIHZhcCk7CisgICAgfQorCisgICAgLyogV01FIFBhcmFtZXRlcnMgKi8KKyAgICBpZiAod2QtPmFwLnFvc01vZGUgPT0gMSkKKyAgICB7CisgICAgICAgIG9mZnNldCA9IHpmQXBBZGRJZVdtZVBhcmEoZGV2LCBidWYsIG9mZnNldCwgdmFwKTsKKyAgICB9CisKKyAgICAvKiBIVCBDYXBhYmlsaXRpZXMgSW5mbyAqLworICAgIG9mZnNldCA9IHpmTW1BZGRIVENhcGFiaWxpdHkoZGV2LCBidWYsIG9mZnNldCk7CisKKyAgICAvKiBFeHRlbmRlZCBIVCBDYXBhYmlsaXRpZXMgSW5mbyAqLworICAgIG9mZnNldCA9IHpmTW1BZGRFeHRlbmRlZEhUQ2FwYWJpbGl0eShkZXYsIGJ1Ziwgb2Zmc2V0KTsKKworICAgIC8qIDEyMTIgOiB3cml0ZSB0byBiZWFjb24gZmlmbyAqLworICAgIC8qIDEyMjEgOiB3cml0ZSB0byBzaGFyZSBtZW1vcnkgKi8KKyAgICB6ZkhwU2VuZEJlYWNvbihkZXYsIGJ1Ziwgb2Zmc2V0KTsKKworICAgIC8qIEZyZWUgYmVhY29uIGJ1ZmZlciAqLworICAgIC8qIFRPRE86IEluIG9yZGVyIHRvIGZpdCB0aGUgbWFkd2lmaSBiZWFjb24gYXJjaGl0ZWN0dXJlLCB3ZSBuZWVkIHRvCisgICAgICAgZnJlZSBiZWFjb24gYnVmZmVyIGluIHRoZSBIQUwgbGF5ZXIuCisgICAgICovCisKKyAgICAvL3pmd0J1ZkZyZWUoZGV2LCBidWYsIDApOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZkludHJhYnNzRm9yd2FyZCAgICAgICAgICAgKi8KKy8qICAgICAgQ2FsbGVkIHRvIHRyYW5zbWl0IGludHJhLUJTUyBmcmFtZSBmcm9tIHVwcGVyIGxheWVyLiAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGJ1ZiA6IGJ1ZmZlciBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICB2YXAgOiB2aXJ0dWFsIEFQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAxIDogdW5pY2FzdCBpbnRyYXMtQlNTIGZyYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgMCA6IG90aGVyIGZyYW1lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiAgICAgICAgICAgICBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgIDIwMDUuMTEgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UxNl90IHpmSW50cmFic3NGb3J3YXJkKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdThfdCBzcmNWYXApCit7CisgICAgdTE2X3QgZXJyOworICAgIHUxNl90IGFzb2NGbGFnID0gMDsKKyAgICB1MTZfdCBkc3RbM107CisgICAgdTE2X3QgYWlkOworICAgIHUxNl90IHN0YVN0YXRlOworICAgIHpidWZfdCogdHhCdWY7CisgICAgdTE2X3QgbGVuOworICAgIHUxNl90IGk7CisgICAgdTE2X3QgdGVtcDsKKyAgICB1MTZfdCByZXQ7CisgICAgdThfdCB2YXAgPSAwOworI2lmZGVmIFpNX0VOQUJMRV9OQVRJVkVfV0lGSQorICAgIGRzdFswXSA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIFpNX1dMQU5fSEVBREVSX0EzX09GRlNFVCk7CisgICAgZHN0WzFdID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgWk1fV0xBTl9IRUFERVJfQTNfT0ZGU0VUKzIpOworICAgIGRzdFsyXSA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIFpNX1dMQU5fSEVBREVSX0EzX09GRlNFVCs0KTsKKyNlbHNlCisgICAgZHN0WzBdID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMCk7CisgICAgZHN0WzFdID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMik7CisgICAgZHN0WzJdID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgNCk7CisjZW5kaWYgIC8vIFpNX0VOQUJMRV9OQVRJVkVfV0lGSQorCisgICAgLyogRG8gSW50cmEtQlNTIGZvcndhcmQoZGF0YSBjb3B5KSBpZiBuZWNlc3NhcnkqLworICAgIGlmICgoZHN0WzBdJjB4MSkgIT0gMHgxKQorICAgIHsKKyAgICAgICAgYWlkID0gemZBcEdldFNUQUluZm8oZGV2LCBkc3QsICZzdGFTdGF0ZSwgJnZhcCk7CisgICAgICAgIGlmICgoYWlkICE9IDB4ZmZmZikgJiYgKHN0YVN0YXRlID09IFpNX1NUQVRFX0FTT0MpICYmIChzcmNWYXAgPT0gdmFwKSkKKyAgICAgICAgeworICAgICAgICAgICAgYXNvY0ZsYWcgPSAxOworICAgICAgICAgICAgem1fbXNnMF9yeChaTV9MVl8yLCAiSW50cmEtQlNTIGZvcndhcmQgOiBhc29jIFNUQSIpOworICAgICAgICB9CisKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgdmFwID0gc3JjVmFwOworICAgICAgICB6bV9tc2cwX3J4KFpNX0xWXzIsICJJbnRyYS1CU1MgZm9yd2FyZCA6IEJDb3JNQyIpOworICAgIH0KKworICAgIC8qIGRlc3RpbmF0aW9uIGFkZHJlc3MgPSBhc3NvY2lhdGVkIFNUQSBvciBCQy9NQyAqLworICAgIGlmICgoYXNvY0ZsYWcgPT0gMSkgfHwgKChkc3RbMF0mMHgxKSA9PSAweDEpKQorICAgIHsKKyAgICAgICAgLyogQWxsb2NhdGUgZnJhbWUgKi8KKyAgICAgICAgaWYgKCh0eEJ1ZiA9IHpmd0J1ZkFsbG9jYXRlKGRldiwgWk1fUlhfRlJBTUVfU0laRSkpCisgICAgICAgICAgICAgICAgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgem1fbXNnMF9yeChaTV9MVl8xLCAiQWxsb2MgaW50cmEtYnNzIGJ1ZiBGYWlsISIpOworICAgICAgICAgICAgZ290byB6bEFsbG9jRXJyb3I7CisgICAgICAgIH0KKworICAgICAgICAvKiBDb3B5IGZyYW1lICovCisgICAgICAgIGxlbiA9IHpmd0J1ZkdldFNpemUoZGV2LCBidWYpOworICAgICAgICBmb3IgKGk9MDsgaTxsZW47IGkrPTIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRlbXAgPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCBpKTsKKyAgICAgICAgICAgIHptd190eF9idWZfd3JpdGVoKGRldiwgdHhCdWYsIGksIHRlbXApOworICAgICAgICB9CisgICAgICAgIHpmd0J1ZlNldFNpemUoZGV2LCB0eEJ1ZiwgbGVuKTsKKworI2lmZGVmIFpNX0VOQUJMRV9OQVRJVkVfV0lGSQorICAgICAgICAvKiBUeC1BMiA9IFJ4LUExLCBUeC1BMyA9IFJ4LUEyLCBUeC1BMSA9IFJ4LUEzICovCisgICAgICAgIGZvciAoaT0wOyBpPDY7IGkrPTIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRlbXAgPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCBaTV9XTEFOX0hFQURFUl9BMV9PRkZTRVQraSk7CisgICAgICAgICAgICB6bXdfdHhfYnVmX3dyaXRlaChkZXYsIHR4QnVmLCBaTV9XTEFOX0hFQURFUl9BMl9PRkZTRVQraSwgdGVtcCk7CisgICAgICAgICAgICB0ZW1wID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgWk1fV0xBTl9IRUFERVJfQTJfT0ZGU0VUK2kpOworICAgICAgICAgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCB0eEJ1ZiwgWk1fV0xBTl9IRUFERVJfQTNfT0ZGU0VUK2ksIHRlbXApOworICAgICAgICAgICAgdGVtcCA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIFpNX1dMQU5fSEVBREVSX0EzX09GRlNFVCtpKTsKKyAgICAgICAgICAgIHptd190eF9idWZfd3JpdGVoKGRldiwgdHhCdWYsIFpNX1dMQU5fSEVBREVSX0ExX09GRlNFVCtpLCB0ZW1wKTsKKyAgICAgICAgfQorCisgICAgICAgICNlbmRpZgorCisgICAgICAgIC8qIFRyYW5zbWl0IGZyYW1lICovCisgICAgICAgIC8qIFJldHVybiBlcnJvciBpZiBwb3J0IGlzIGRpc2FibGVkICovCisgICAgICAgIGlmICgoZXJyID0gemZUeFBvcnRDb250cm9sKGRldiwgdHhCdWYsIHZhcCkpID09IFpNX1BPUlRfRElTQUJMRUQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGVyciA9IFpNX0VSUl9UWF9QT1JUX0RJU0FCTEVEOworICAgICAgICAgICAgZ290byB6bFR4RXJyb3I7CisgICAgICAgIH0KKworI2lmIDEKKyAgICAgICAgLyogQVAgOiBCdWZmZXIgZnJhbWUgZm9yIHBvd2VyIHNhdmluZyBTVEEgKi8KKyAgICAgICAgaWYgKChyZXQgPSB6ZkFwQnVmZmVyUHNGcmFtZShkZXYsIHR4QnVmLCB2YXApKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBmb3J3YXJkIGZyYW1lIGlmIG5vdCBiZWVuIGJ1ZmZlcmVkICovCisgICAgICAgICAgICAjaWYgMQorICAgICAgICAgICAgLyogUHV0IHRvIFZUWFFbYWNdICovCisgICAgICAgICAgICByZXQgPSB6ZlB1dFZ0eHEoZGV2LCB0eEJ1Zik7CisgICAgICAgICAgICAvKiBQdXNoIFZUWFFbYWNdICovCisgICAgICAgICAgICB6ZlB1c2hWdHhxKGRldik7CisgICAgICAgICAgICAjZWxzZQorICAgICAgICAgICAgemZUeFNlbmRFdGgoZGV2LCB0eEJ1ZiwgdmFwLCBaTV9JTlRFUk5BTF9BTExPQ19CVUYsIDApOworICAgICAgICAgICAgI2VuZGlmCisKKyAgICAgICAgfQorI2VuZGlmCisgICAgfQorICAgIHJldHVybiBhc29jRmxhZzsKKworemxUeEVycm9yOgorICAgIHpmd0J1ZkZyZWUoZGV2LCB0eEJ1ZiwgMCk7Cit6bEFsbG9jRXJyb3I6CisgICAgcmV0dXJuIGFzb2NGbGFnOworfQorCitzdHJ1Y3QgenNNaWNWYXIqIHpmQXBHZXRSeE1pY0tleSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpCit7CisgICAgdThfdCBzYVs2XTsKKyAgICB1MTZfdCBpZCA9IDAsIG1hY0FkZHJbM107CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6ZkNvcHlGcm9tUnhCdWZmZXIoZGV2LCBidWYsIHNhLCBaTV9XTEFOX0hFQURFUl9BMl9PRkZTRVQsIDYpOworCisgICAgbWFjQWRkclswXSA9IHNhWzBdICsgKHNhWzFdIDw8IDgpOworICAgIG1hY0FkZHJbMV0gPSBzYVsyXSArIChzYVszXSA8PCA4KTsKKyAgICBtYWNBZGRyWzJdID0gc2FbNF0gKyAoc2FbNV0gPDwgOCk7CisKKyAgICBpZiAoKGlkID0gemZBcEZpbmRTdGEoZGV2LCBtYWNBZGRyKSkgIT0gMHhmZmZmKQorICAgICAgICByZXR1cm4gKCZ3ZC0+YXAuc3RhVGFibGVbaWRdLnJ4TWljS2V5KTsKKworICAgIHJldHVybiBOVUxMOworfQorCitzdHJ1Y3QgenNNaWNWYXIqIHpmQXBHZXRUeE1pY0tleSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHU4X3QqIHFvc1R5cGUpCit7CisgICAgdThfdCBkYVs2XTsKKyAgICB1MTZfdCBpZCA9IDAsIG1hY0FkZHJbM107CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6ZkNvcHlGcm9tSW50VHhCdWZmZXIoZGV2LCBidWYsIGRhLCAwLCA2KTsKKworICAgIG1hY0FkZHJbMF0gPSBkYVswXSArIChkYVsxXSA8PCA4KTsKKyAgICBtYWNBZGRyWzFdID0gZGFbMl0gKyAoZGFbM10gPDwgOCk7CisgICAgbWFjQWRkclsyXSA9IGRhWzRdICsgKGRhWzVdIDw8IDgpOworCisgICAgaWYgKChtYWNBZGRyWzBdICYgMHgxKSkKKyAgICB7CisgICAgICAgIHJldHVybiAoJndkLT5hcC5iY01pY0tleVswXSk7CisgICAgfQorICAgIGVsc2UgaWYgKChpZCA9IHpmQXBGaW5kU3RhKGRldiwgbWFjQWRkcikpICE9IDB4ZmZmZikKKyAgICB7CisgICAgICAgICpxb3NUeXBlID0gd2QtPmFwLnN0YVRhYmxlW2lkXS5xb3NUeXBlOworICAgICAgICByZXR1cm4gKCZ3ZC0+YXAuc3RhVGFibGVbaWRdLnR4TWljS2V5KTsKKyAgICB9CisKKyAgICByZXR1cm4gTlVMTDsKK30KKwordTE2X3QgemZBcFVwZGF0ZVBzQml0KHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdThfdCogdmFwLCB1OF90KiB1YXBzZFRyaWcpCit7CisgICAgdTE2X3Qgc3RhU3RhdGU7CisgICAgdTE2X3QgYWlkOworICAgIHUxNl90IHBzQml0OworICAgIHUxNl90IHNyY1szXTsKKyAgICB1MTZfdCBkc3RbMV07CisgICAgdTE2X3QgaTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHNyY1swXSA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIDEwKTsKKyAgICBzcmNbMV0gPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCAxMik7CisgICAgc3JjWzJdID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMTQpOworCisgICAgaWYgKCh6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCAxKSAmIDB4MykgIT0gMykKKyAgICB7CisgICAgICAgIC8qIEFQICovCisgICAgICAgIGRzdFswXSA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIDQpOworCisgICAgICAgIHBzQml0ID0gKHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIDEpICYgMHgxMCkgPj4gNDsKKyAgICAgICAgLyogR2V0IEFJRCBhbmQgdXBkYXRlIFNUQSBQUyBtb2RlICovCisgICAgICAgIGFpZCA9IHpmQXBHZXRTVEFJbmZvQW5kVXBkYXRlUHMoZGV2LCBzcmMsICZzdGFTdGF0ZSwgdmFwLCBwc0JpdCwgdWFwc2RUcmlnKTsKKworICAgICAgICAvKiBpZiBTVEEgbm90IGFzc29jaWF0ZWQsIHNlbmQgZGVhdXRoICovCisgICAgICAgIGlmICgoYWlkID09IDB4ZmZmZikgfHwgKHN0YVN0YXRlICE9IFpNX1NUQVRFX0FTT0MpKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoKGRzdFswXSYweDEpPT0wKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHpmU2VuZE1tRnJhbWUoZGV2LCBaTV9XTEFOX0ZSQU1FX1RZUEVfREVBVVRILCBzcmMsIDB4NywKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsIDApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gWk1fRVJSX1NUQV9OT1RfQVNTT0NJQVRFRDsKKyAgICAgICAgfQorICAgIH0gLyogaWYgKCh6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCAxKSAmIDB4MykgIT0gMykgKi8KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKiBXRFMgKi8KKyAgICAgICAgZm9yIChpPTA7IGk8Wk1fTUFYX1dEU19TVVBQT1JUOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgod2QtPmFwLndkcy53ZHNCaXRtYXAgJiAoMTw8aSkpICE9IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKChzcmNbMF0gPT0gd2QtPmFwLndkcy5tYWNBZGRyW2ldWzBdKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHNyY1sxXSA9PSB3ZC0+YXAud2RzLm1hY0FkZHJbaV1bMV0pCisgICAgICAgICAgICAgICAgICAgICAgICAmJiAoc3JjWzJdID09IHdkLT5hcC53ZHMubWFjQWRkcltpXVsyXSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAqdmFwID0gMHgyMCArIGk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gWk1fU1VDQ0VTUzsKK30KKwordm9pZCB6ZkFwUHJvY2Vzc1BzUG9sbCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpCit7CisgICAgdTE2X3Qgc3JjWzNdOworICAgIHUxNl90IGRzdFszXTsKKyAgICB6YnVmX3QqIHBzQnVmID0gTlVMTDsKKyAgICB1MTZfdCBpZDsKKyAgICB1OF90IG1vcmVEYXRhID0gMDsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICBzcmNbMF0gPSB6bXdfdHhfYnVmX3JlYWRoKGRldiwgYnVmLCAxMCk7CisgICAgc3JjWzFdID0gem13X3R4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMTIpOworICAgIHNyY1syXSA9IHptd190eF9idWZfcmVhZGgoZGV2LCBidWYsIDE0KTsKKworICAgIC8qIEZpbmQgcHMgYnVmZmVyIGZvciBQc1BvbGwgKi8KKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIGlkID0gd2QtPmFwLnVuaUhlYWQ7CisgICAgd2hpbGUgKGlkICE9IHdkLT5hcC51bmlUYWlsKQorICAgIHsKKyAgICAgICAgcHNCdWYgPSB3ZC0+YXAudW5pQXJyYXlbaWRdOworCisgICAgICAgIGRzdFswXSA9IHptd190eF9idWZfcmVhZGgoZGV2LCBwc0J1ZiwgMCk7CisgICAgICAgIGRzdFsxXSA9IHptd190eF9idWZfcmVhZGgoZGV2LCBwc0J1ZiwgMik7CisgICAgICAgIGRzdFsyXSA9IHptd190eF9idWZfcmVhZGgoZGV2LCBwc0J1ZiwgNCk7CisKKyAgICAgICAgaWYgKChzcmNbMF0gPT0gZHN0WzBdKSAmJiAoc3JjWzFdID09IGRzdFsxXSkgJiYgKHNyY1syXSA9PSBkc3RbMl0pKQorICAgICAgICB7CisgICAgICAgICAgICBtb3JlRGF0YSA9IHpmQXBSZW1vdmVGcm9tUHNRdWV1ZShkZXYsIGlkLCBzcmMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwc0J1ZiA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgaWQgPSAoaWQgKyAxKSAmIChaTV9VTklfQVJSQVlfU0laRSAtIDEpOworICAgIH0KKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgLyogU2VuZCBwcyBidWZmZXIgKi8KKyAgICBpZiAocHNCdWYgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIC8qIFNlbmQgd2l0aCBtb3JlIGRhdGEgYml0ICovCisgICAgICAgIHpmVHhTZW5kRXRoKGRldiwgcHNCdWYsIDAsIFpNX0VYVEVSTkFMX0FMTE9DX0JVRiwgbW9yZURhdGEpOworICAgIH0KKworICAgIHJldHVybjsKK30KKwordm9pZCB6ZkFwU2V0UHJvdGVjdGlvbk1vZGUoemRldl90KiBkZXYsIHUxNl90IG1vZGUpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgaWYgKG1vZGUgPT0gMCkKKyAgICB7CisgICAgICAgIGlmICh3ZC0+YXAucHJvdGVjdGlvbk1vZGUgIT0gbW9kZSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogV3JpdGUgTUFDJlBIWSByZWdpc3RlcnMgdG8gZGlzYWJsZSBwcm90ZWN0aW9uICovCisKKyAgICAgICAgICAgIHdkLT5hcC5wcm90ZWN0aW9uTW9kZSA9IG1vZGU7CisgICAgICAgIH0KKworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpZiAod2QtPmFwLnByb3RlY3Rpb25Nb2RlICE9IG1vZGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFdyaXRlIE1BQyZQSFkgcmVnaXN0ZXJzIHRvIGVuYWJsZSBwcm90ZWN0aW9uICovCisKKyAgICAgICAgICAgIHdkLT5hcC5wcm90ZWN0aW9uTW9kZSA9IG1vZGU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZkFwU2VuZEZhaWx1cmUgICAgICAgICAgICAgKi8KKy8qICAgICAgU2VuZCBmYWlsdXJlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGFkZHIgOiByZWNlaXZlciBhZGRyZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIE5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFN0ZXBoZW4gQ2hlbiAgICAgICAgQXRoZXJvcyBDb21tdW5pY2F0aW9ucywgSU5DLiAgICAyMDA3LjEgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHpmQXBTZW5kRmFpbHVyZSh6ZGV2X3QqIGRldiwgdThfdCogYWRkcikKK3sKKyAgICB1MTZfdCBpZDsKKyAgICB1MTZfdCBzdGFBZGRyWzNdOworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgc3RhQWRkclswXSA9IGFkZHJbMF0gKyAoKCh1MTZfdClhZGRyWzFdKTw8OCk7CisgICAgc3RhQWRkclsxXSA9IGFkZHJbMl0gKyAoKCh1MTZfdClhZGRyWzNdKTw8OCk7CisgICAgc3RhQWRkclsyXSA9IGFkZHJbNF0gKyAoKCh1MTZfdClhZGRyWzVdKTw8OCk7CisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICBpZiAoKGlkID0gemZBcEZpbmRTdGEoZGV2LCBzdGFBZGRyKSkgIT0gMHhmZmZmKQorICAgIHsKKyAgICAgICAgLyogU2VuZCBmYWlsdHVyZSA6IEFkZCAzIG1pbnV0ZXMgdG8gaW5hY3RpdmUgdGltZSB0aGF0IHdpbGwgKi8KKyAgICAgICAgLyogICAgICAgICAgICAgICAgIHdpbGwgbWFrZSBTVEEgYmVlbiBraWNrZWQgb3V0IHNvb24gKi8KKyAgICAgICAgd2QtPmFwLnN0YVRhYmxlW2lkXS50aW1lIC09ICgzKlpNX1RJQ0tfUEVSX01JTlVURSk7CisgICAgfQorICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7Cit9CisKKwordm9pZCB6ZkFwUHJvY2Vzc0FjdGlvbih6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpCit7CisgICAgdThfdCBjYXRlZ29yeTsKKworICAgIC8vem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgLy96bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgY2F0ZWdvcnkgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCAyNCk7CisKKyAgICBzd2l0Y2ggKGNhdGVnb3J5KQorICAgIHsKKyAgICBjYXNlIFpNX1dMQU5fQkxPQ0tfQUNLX0FDVElPTl9GUkFNRToKKyAgICAgICAgemZBZ2dCbG9ja0Fja0FjdGlvbkZyYW1lKGRldiwgYnVmKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2NtbXN0YS5jIGIvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2NtbXN0YS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3NWJhMTEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvY21tc3RhLmMKQEAgLTAsMCArMSw1NzgyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggQXRoZXJvcyBDb21tdW5pY2F0aW9ucyBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgImNwcmVjb21wLmgiCisjaW5jbHVkZSAicmF0ZWN0cmwuaCIKKyNpbmNsdWRlICIuLi9oYWwvaHByZWcuaCIKKworLyogVE9ETyA6IGNoYW5nZSBnbG9iYWwgdmFyaWFibGUgdG8gY29uc3RhbnQgKi8KK3U4X3QgICB6Z1dwYVJhZGl1c091aVtdID0geyAweDAwLCAweDUwLCAweGYyLCAweDAxIH07Cit1OF90ICAgemdXcGFBZXNPdWlbXSA9IHsgMHgwMCwgMHg1MCwgMHhmMiwgMHgwNCB9OwordThfdCAgIHpnV3BhMlJhZGl1c091aVtdID0geyAweDAwLCAweDBmLCAweGFjLCAweDAxIH07Cit1OF90ICAgemdXcGEyQWVzT3VpW10gPSB7IDB4MDAsIDB4MGYsIDB4YWMsIDB4MDQgfTsKKworY29uc3QgdTE2X3QgemNDd1RsYlsxNl0gPSB7ICAgMCwgICAgMSwgICAgMywgICAgNywgICAxNSwgICAzMSwgICA2MywgIDEyNywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNTUsICA1MTEsIDEwMjMsIDIwNDcsIDQwOTUsIDQwOTUsIDQwOTUsIDQwOTV9OworCit2b2lkIHpmU3RhU3RhcnRDb25uZWN0Q2IoemRldl90KiBkZXYpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZTdGFQdXRBcEludG9CbG9ja2luZ0xpc3QgICovCisvKiAgICAgIFB1dCBBUCBpbnRvIGJsb2NraW5nIEFQIGxpc3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGRldiA6IGRldmljZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBic3NpZCA6IEFQJ3MgQlNTSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgd2VpZ2h0IDogd2VpZ2h0IG9mIEFQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgbm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiBDaGVuICAgICAgICBBdGhlcm9zIENvbW11bmljYXRpb25zLCBJTkMuICAgIDIwMDYuMTIgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgemZTdGFQdXRBcEludG9CbG9ja2luZ0xpc3QoemRldl90KiBkZXYsIHU4X3QqIGJzc2lkLCB1OF90IHdlaWdodCkKK3sKKyAgICB1MTZfdCBpLCBqOworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgaWYgKHdlaWdodCA+IDApCisgICAgeworICAgICAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICAvKkZpbmQgc2FtZSBic3NpZCBlbnRyeSBmaXJzdCovCisgICAgICAgIGZvciAoaT0wOyBpPFpNX01BWF9CTE9DS0lOR19BUF9MSVNUX1NJWkU7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChqPTA7IGo8NjsgaisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKHdkLT5zdGEuYmxvY2tpbmdBcExpc3RbaV0uYWRkcltqXSE9IGJzc2lkW2pdKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZihqPT02KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8qVGhpcyBic3NpZCBkb2Vzbid0IGhhdmUgb2xkIHJlY29yZC5GaW5kIGFuIGVtcHR5IGVudHJ5Ki8KKyAgICAgICAgaWYgKGkgPT0gWk1fTUFYX0JMT0NLSU5HX0FQX0xJU1RfU0laRSkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChpPTA7IGk8Wk1fTUFYX0JMT0NLSU5HX0FQX0xJU1RfU0laRTsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICh3ZC0+c3RhLmJsb2NraW5nQXBMaXN0W2ldLndlaWdodCA9PSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogSWYgdGhlIGxpc3QgaXMgZnVsbCwgcGljayBvbmUgZW50cnkgZm9yIHJlcGxhY2VtZW50ICovCisgICAgICAgIGlmIChpID09IFpNX01BWF9CTE9DS0lOR19BUF9MSVNUX1NJWkUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGkgPSBic3NpZFs1XSAmIChaTV9NQVhfQkxPQ0tJTkdfQVBfTElTVF9TSVpFLTEpOworICAgICAgICB9CisKKyAgICAgICAgLyogVXBkYXRlIEFQIGFkZHJlc3MgYW5kIHdlaWdodCAqLworICAgICAgICBmb3IgKGo9MDsgajw2OyBqKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHdkLT5zdGEuYmxvY2tpbmdBcExpc3RbaV0uYWRkcltqXSA9IGJzc2lkW2pdOworICAgICAgICB9CisKKyAgICAgICAgd2QtPnN0YS5ibG9ja2luZ0FwTGlzdFtpXS53ZWlnaHQgPSB3ZWlnaHQ7CisgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgfQorCisgICAgcmV0dXJuOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZlN0YUlzQXBJbkJsb2NraW5nTGlzdCAgICAgKi8KKy8qICAgICAgSXMgQVAgaW4gYmxvY2tpbmcgbGlzdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGJzc2lkIDogQVAncyBCU1NJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFRSVUUgOiBBUCBpbiBibG9ja2luZyBsaXN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBGQUxTRSA6IEFQIG5vdCBpbiBibG9ja2luZyBsaXN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBTdGVwaGVuIENoZW4gICAgICAgIEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMsIElOQy4gICAgMjAwNi4xMiAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTE2X3QgemZTdGFJc0FwSW5CbG9ja2luZ0xpc3QoemRldl90KiBkZXYsIHU4X3QqIGJzc2lkKQoreworICAgIHUxNl90IGksIGo7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworICAgIC8vem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIC8vem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICBmb3IgKGk9MDsgaTxaTV9NQVhfQkxPQ0tJTkdfQVBfTElTVF9TSVpFOyBpKyspCisgICAgeworICAgICAgICBpZiAod2QtPnN0YS5ibG9ja2luZ0FwTGlzdFtpXS53ZWlnaHQgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChqPTA7IGo8NjsgaisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICh3ZC0+c3RhLmJsb2NraW5nQXBMaXN0W2ldLmFkZHJbal0gIT0gYnNzaWRbal0pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaiA9PSA2KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAvL3ptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgcmV0dXJuIEZBTFNFOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZlN0YVJlZnJlc2hCbG9ja0xpc3QgICAgICAgKi8KKy8qICAgICAgSXMgQVAgaW4gYmxvY2tpbmcgbGlzdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGZsdXNoRmxhZyA6IGZsdXNoIHdob2xlIGJsb2NraW5nIGxpc3QgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIG5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFN0ZXBoZW4gQ2hlbiAgICAgICAgQXRoZXJvcyBDb21tdW5pY2F0aW9ucywgSU5DLiAgICAyMDA2LjEyICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHpmU3RhUmVmcmVzaEJsb2NrTGlzdCh6ZGV2X3QqIGRldiwgdTE2X3QgZmx1c2hGbGFnKQoreworICAgIHUxNl90IGk7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIGZvciAoaT0wOyBpPFpNX01BWF9CTE9DS0lOR19BUF9MSVNUX1NJWkU7IGkrKykKKyAgICB7CisgICAgICAgIGlmICh3ZC0+c3RhLmJsb2NraW5nQXBMaXN0W2ldLndlaWdodCAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZmx1c2hGbGFnICE9IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2QtPnN0YS5ibG9ja2luZ0FwTGlzdFtpXS53ZWlnaHQgPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdkLT5zdGEuYmxvY2tpbmdBcExpc3RbaV0ud2VpZ2h0LS07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICByZXR1cm47Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmU3RhQ29ubmVjdEZhaWwgICAgICAgICAgICAqLworLyogICAgICBIYW5kbGUgQ29ubmVjdCBmYWlsdXJlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYnNzaWQgOiBCU1NJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIHJlYXNvbiA6IHJlYXNvbiBvZiBmYWlsdXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIG5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFN0ZXBoZW4gQ2hlbiAgICAgICAgQXRoZXJvcyBDb21tdW5pY2F0aW9ucywgSU5DLiAgICAyMDA2LjEyICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHpmU3RhQ29ubmVjdEZhaWwoemRldl90KiBkZXYsIHUxNl90IHJlYXNvbiwgdTE2X3QqIGJzc2lkLCB1OF90IHdlaWdodCkKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICAvKiBDaGFuZ2UgaW50ZXJuYWwgc3RhdGUgKi8KKyAgICB6ZkNoYW5nZUFkYXB0ZXJTdGF0ZShkZXYsIFpNX1NUQV9TVEFURV9ESVNDT05ORUNUKTsKKworICAgIC8qIEltcHJvdmUgV0VQL1RLSVAgcGVyZm9ybWFjZSB3aXRoIEhUIEFQLCBkZXRhaWwgaW5mb3JtYXRpb24gcGxlYXNlIGxvb2sgYnVnIzMyNDk1ICovCisgICAgLy96ZkhwU2V0VFRTSUZTVGltZShkZXYsIDB4OCk7CisKKyAgICAvKiBOb3RpZnkgd3JhcHBlciBvZiBjb25uZWN0aW9uIHN0YXR1cyBjaGFuZ2VzICovCisgICAgaWYgKHdkLT56ZmNiQ29ubmVjdE5vdGlmeSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgd2QtPnpmY2JDb25uZWN0Tm90aWZ5KGRldiwgcmVhc29uLCBic3NpZCk7CisgICAgfQorCisgICAgLyogUHV0IEFQIGludG8gaW50ZXJuYWwgYmxvY2tpbmcgbGlzdCAqLworICAgIHpmU3RhUHV0QXBJbnRvQmxvY2tpbmdMaXN0KGRldiwgKHU4X3QgKilic3NpZCwgd2VpZ2h0KTsKKworICAgIC8qIElzc3VlIGFub3RoZXIgU0NBTiAqLworICAgIGlmICggd2QtPnN0YS5iQXV0b1JlY29ubmVjdCApCisgICAgeworICAgICAgICB6bV9kZWJ1Z19tc2cwKCJTdGFydCBpbnRlcm5hbCBzY2FuLi4uIik7CisgICAgICAgIHpmU2Nhbk1nclNjYW5TdG9wKGRldiwgWk1fU0NBTl9NR1JfU0NBTl9JTlRFUk5BTCk7CisgICAgICAgIHpmU2Nhbk1nclNjYW5TdGFydChkZXYsIFpNX1NDQU5fTUdSX1NDQU5fSU5URVJOQUwpOworICAgIH0KK30KKwordThfdCB6ZmlXbGFuSUJTU0dldFBlZXJTdGF0aW9uc0NvdW50KHpkZXZfdCogZGV2KQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHJldHVybiB3ZC0+c3RhLm9wcG9zaXRlQ291bnQ7Cit9CisKK3U4X3QgemZpV2xhbklCU1NJdGVyYXRlUGVlclN0YXRpb25zKHpkZXZfdCogZGV2LCB1OF90IG51bVRvSXRlcmF0ZSwgemZwSUJTU0l0ZXJhdGVQZWVyU3RhdGlvbkNiIGNhbGxiYWNrLCB2b2lkICpjdHgpCit7CisgICAgdThfdCBvcHBvc2l0ZUNvdW50OworICAgIHU4X3QgaTsKKyAgICB1OF90IGluZGV4ID0gMDsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgb3Bwb3NpdGVDb3VudCA9IHdkLT5zdGEub3Bwb3NpdGVDb3VudDsKKyAgICBpZiAoIG9wcG9zaXRlQ291bnQgPiBudW1Ub0l0ZXJhdGUgKQorICAgIHsKKyAgICAgICAgb3Bwb3NpdGVDb3VudCA9IG51bVRvSXRlcmF0ZTsKKyAgICB9CisKKyAgICBmb3IoaT0wOyBpIDwgWk1fTUFYX09QUE9TSVRFX0NPVU5UOyBpKyspCisgICAgeworICAgICAgICBpZiAoIG9wcG9zaXRlQ291bnQgPT0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCB3ZC0+c3RhLm9wcG9zaXRlSW5mb1tpXS52YWxpZCA9PSAwICkKKyAgICAgICAgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBjYWxsYmFjayhkZXYsICZ3ZC0+c3RhLm9wcG9zaXRlSW5mb1tpXSwgY3R4LCBpbmRleCsrKTsKKyAgICAgICAgb3Bwb3NpdGVDb3VudC0tOworCisgICAgfQorCisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIHJldHVybiBpbmRleDsKK30KKworCitzOF90IHpmU3RhRmluZEZyZWVPcHBvc2l0ZSh6ZGV2X3QqIGRldiwgdTE2X3QgKnNhLCBpbnQgKnBGb3VuZElkeCkKK3sKKyAgICBpbnQgb3Bwb3NpdGVDb3VudDsKKyAgICBpbnQgaTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIG9wcG9zaXRlQ291bnQgPSB3ZC0+c3RhLm9wcG9zaXRlQ291bnQ7CisKKyAgICBmb3IoaT0wOyBpIDwgWk1fTUFYX09QUE9TSVRFX0NPVU5UOyBpKyspCisgICAgeworICAgICAgICBpZiAoIG9wcG9zaXRlQ291bnQgPT0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCB3ZC0+c3RhLm9wcG9zaXRlSW5mb1tpXS52YWxpZCA9PSAwICkKKyAgICAgICAgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBvcHBvc2l0ZUNvdW50LS07CisgICAgICAgIGlmICggemZNZW1vcnlJc0VxdWFsKCh1OF90Kikgc2EsIHdkLT5zdGEub3Bwb3NpdGVJbmZvW2ldLm1hY0FkZHIsIDYpICkKKyAgICAgICAgeworICAgICAgICAgICAgLy93ZC0+c3RhLm9wcG9zaXRlSW5mb1tpXS5hbGl2ZUNvdW50ZXIrKzsKKyAgICAgICAgICAgIHdkLT5zdGEub3Bwb3NpdGVJbmZvW2ldLmFsaXZlQ291bnRlciA9IFpNX0lCU1NfUEVFUl9BTElWRV9DT1VOVEVSOworCisgICAgICAgICAgICAvKiBpdCBpcyBhbHJlYWR5IHN0b3JlZCAqLworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBDaGVjayBpZiB0aGVyZSdzIHN0aWxsIHNwYWNlIGZvciBuZXcgY29tZXIKKyAgICBpZiAoIHdkLT5zdGEub3Bwb3NpdGVDb3VudCA9PSBaTV9NQVhfT1BQT1NJVEVfQ09VTlQgKQorICAgIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8vIEZpbmQgYW4gdW51c2VkIHNsb3QgZm9yIG5ldyBwZWVyIHN0YXRpb24KKyAgICBmb3IoaT0wOyBpIDwgWk1fTUFYX09QUE9TSVRFX0NPVU5UOyBpKyspCisgICAgeworICAgICAgICBpZiAoIHdkLT5zdGEub3Bwb3NpdGVJbmZvW2ldLnZhbGlkID09IDAgKQorICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgICpwRm91bmRJZHggPSBpOworICAgIHJldHVybiAwOworfQorCitzOF90IHpmU3RhRmluZE9wcG9zaXRlQnlNQUNBZGRyKHpkZXZfdCogZGV2LCB1MTZfdCAqc2EsIHU4X3QgKnBGb3VuZElkeCkKK3sKKyAgICB1MzJfdCBvcHBvc2l0ZUNvdW50OworICAgIHUzMl90IGk7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBvcHBvc2l0ZUNvdW50ID0gd2QtPnN0YS5vcHBvc2l0ZUNvdW50OworCisgICAgZm9yKGk9MDsgaSA8IFpNX01BWF9PUFBPU0lURV9DT1VOVDsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKCBvcHBvc2l0ZUNvdW50ID09IDAgKQorICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmICggd2QtPnN0YS5vcHBvc2l0ZUluZm9baV0udmFsaWQgPT0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgb3Bwb3NpdGVDb3VudC0tOworICAgICAgICBpZiAoIHpmTWVtb3J5SXNFcXVhbCgodThfdCopIHNhLCB3ZC0+c3RhLm9wcG9zaXRlSW5mb1tpXS5tYWNBZGRyLCA2KSApCisgICAgICAgIHsKKyAgICAgICAgICAgICpwRm91bmRJZHggPSAodThfdClpOworCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgICpwRm91bmRJZHggPSAwOworICAgIHJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCB6ZlN0YUluaXRDb21tb25PcHBvc2l0ZUluZm8oemRldl90KiBkZXYsIGludCBpKQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIC8qIHNldCB0aGUgZGVmYXVsdCByYXRlIHRvIHRoZSBoaWdoZXN0IHJhdGUgKi8KKyAgICB3ZC0+c3RhLm9wcG9zaXRlSW5mb1tpXS52YWxpZCA9IDE7CisgICAgd2QtPnN0YS5vcHBvc2l0ZUluZm9baV0uYWxpdmVDb3VudGVyID0gWk1fSUJTU19QRUVSX0FMSVZFX0NPVU5URVI7CisgICAgd2QtPnN0YS5vcHBvc2l0ZUNvdW50Kys7CisKKyNpZmRlZiBaTV9FTkFCTEVfSUJTU19XUEEyUFNLCisgICAgLyogU2V0IHBhcmFtZXRlcnMgZm9yIG5ldyBvcHBvc2l0ZSBwZWVyIHN0YXRpb24gISEhICovCisgICAgd2QtPnN0YS5vcHBvc2l0ZUluZm9baV0uY2FtSWR4ID0gMHhmZjsgIC8vIE5vdCBzZXQga2V5IGluIHRoaXMgbG9jYXRpb24KKyAgICB3ZC0+c3RhLm9wcG9zaXRlSW5mb1tpXS5wa0luc3RhbGxlZCA9IDA7CisgICAgd2QtPnN0YS5vcHBvc2l0ZUluZm9baV0ud3BhU3RhdGUgPSBaTV9TVEFfV1BBX1NUQVRFX0lOSVQgOyAgLy8gTm8gZW5jcnlwdGlvbgorI2VuZGlmCit9CisKK2ludCB6ZlN0YVNldE9wcG9zaXRlSW5mb0Zyb21CU1NJbmZvKHpkZXZfdCogZGV2LCBzdHJ1Y3QgenNCc3NJbmZvKiBwQnNzSW5mbykKK3sKKyAgICBpbnQgaTsKKyAgICB1OF90KiAgZHN0OworICAgIHUxNl90ICBzYVszXTsKKyAgICBpbnQgcmVzOworICAgIHUzMl90IG9uZVR4U3RyZWFtQ2FwOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgemZNZW1vcnlDb3B5KCh1OF90Kikgc2EsIHBCc3NJbmZvLT5tYWNhZGRyLCA2KTsKKworICAgIHJlcyA9IHpmU3RhRmluZEZyZWVPcHBvc2l0ZShkZXYsIHNhLCAmaSk7CisgICAgaWYgKCByZXMgIT0gMCApCisgICAgeworICAgICAgICBnb3RvIHpsUmV0dXJuOworICAgIH0KKworICAgIGRzdCA9IHdkLT5zdGEub3Bwb3NpdGVJbmZvW2ldLm1hY0FkZHI7CisgICAgemZNZW1vcnlDb3B5KGRzdCwgKHU4X3QgKilzYSwgNik7CisKKyAgICBvbmVUeFN0cmVhbUNhcCA9ICh6ZkhwQ2FwYWJpbGl0eShkZXYpICYgWk1fSFBfQ0FQXzExTl9PTkVfVFhfU1RSRUFNKTsKKworICAgIGlmIChwQnNzSW5mby0+ZXh0U3VwcG9ydGVkUmF0ZXNbMV0gIT0gMCkKKyAgICB7CisgICAgICAgIC8qIFRPRE8gOiBIYW5kbGUgMTFuICovCisgICAgICAgIGlmIChwQnNzSW5mby0+ZnJlcXVlbmN5IDwgMzAwMCkKKyAgICAgICAgeworICAgICAgICAgICAgLyogMi40R0h6ICovCisgICAgICAgICAgICBpZiAocEJzc0luZm8tPkVuYWJsZUhUID09IDEpCisgICAgICAgICAgICAgICAgemZSYXRlQ3RybEluaXRDZWxsKGRldiwgJndkLT5zdGEub3Bwb3NpdGVJbmZvW2ldLnJjQ2VsbCwgKG9uZVR4U3RyZWFtQ2FwIT0wKT8zOjIsIDEsIHBCc3NJbmZvLT5TRzQwKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB6ZlJhdGVDdHJsSW5pdENlbGwoZGV2LCAmd2QtPnN0YS5vcHBvc2l0ZUluZm9baV0ucmNDZWxsLCAxLCAxLCBwQnNzSW5mby0+U0c0MCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvKiA1R0h6ICovCisgICAgICAgICAgICBpZiAocEJzc0luZm8tPkVuYWJsZUhUID09IDEpCisgICAgICAgICAgICAgICAgemZSYXRlQ3RybEluaXRDZWxsKGRldiwgJndkLT5zdGEub3Bwb3NpdGVJbmZvW2ldLnJjQ2VsbCwgKG9uZVR4U3RyZWFtQ2FwIT0wKT8zOjIsIDAsIHBCc3NJbmZvLT5TRzQwKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB6ZlJhdGVDdHJsSW5pdENlbGwoZGV2LCAmd2QtPnN0YS5vcHBvc2l0ZUluZm9baV0ucmNDZWxsLCAxLCAwLCBwQnNzSW5mby0+U0c0MCk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogVE9ETyA6IEhhbmRsZSAxMW4gKi8KKyAgICAgICAgaWYgKHBCc3NJbmZvLT5mcmVxdWVuY3kgPCAzMDAwKQorICAgICAgICB7CisgICAgICAgICAgICAvKiAyLjRHSHogKi8KKyAgICAgICAgICAgIGlmIChwQnNzSW5mby0+RW5hYmxlSFQgPT0gMSkKKyAgICAgICAgICAgICAgICB6ZlJhdGVDdHJsSW5pdENlbGwoZGV2LCAmd2QtPnN0YS5vcHBvc2l0ZUluZm9baV0ucmNDZWxsLCAob25lVHhTdHJlYW1DYXAhPTApPzM6MiwgMSwgcEJzc0luZm8tPlNHNDApOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHpmUmF0ZUN0cmxJbml0Q2VsbChkZXYsICZ3ZC0+c3RhLm9wcG9zaXRlSW5mb1tpXS5yY0NlbGwsIDAsIDEsIHBCc3NJbmZvLT5TRzQwKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIDVHSHogKi8KKyAgICAgICAgICAgIGlmIChwQnNzSW5mby0+RW5hYmxlSFQgPT0gMSkKKyAgICAgICAgICAgICAgICB6ZlJhdGVDdHJsSW5pdENlbGwoZGV2LCAmd2QtPnN0YS5vcHBvc2l0ZUluZm9baV0ucmNDZWxsLCAob25lVHhTdHJlYW1DYXAhPTApPzM6MiwgMCwgcEJzc0luZm8tPlNHNDApOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHpmUmF0ZUN0cmxJbml0Q2VsbChkZXYsICZ3ZC0+c3RhLm9wcG9zaXRlSW5mb1tpXS5yY0NlbGwsIDEsIDAsIHBCc3NJbmZvLT5TRzQwKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgemZTdGFJbml0Q29tbW9uT3Bwb3NpdGVJbmZvKGRldiwgaSk7Cit6bFJldHVybjoKKyAgICByZXR1cm4gMDsKK30KKworaW50IHpmU3RhU2V0T3Bwb3NpdGVJbmZvRnJvbVJ4QnVmKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZikKK3sKKyAgICBpbnQgICBpOworICAgIHU4X3QqICBkc3Q7CisgICAgdTE2X3QgIHNhWzNdOworICAgIGludCByZXMgPSAwOworICAgIHUxNl90ICBvZmZzZXQ7CisgICAgdThfdCAgIGJTdXBwb3J0RXh0UmF0ZTsKKyAgICB1MzJfdCBydHNjdHNSYXRlID0gMHhmZmZmZmZmZjsgLyogQ1RTOk9GRE0gNk0sIFJUUzpPRkRNIDZNICovCisgICAgdTMyX3Qgb25lVHhTdHJlYW1DYXA7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHNhWzBdID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgWk1fV0xBTl9IRUFERVJfQTJfT0ZGU0VUKTsKKyAgICBzYVsxXSA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIFpNX1dMQU5fSEVBREVSX0EyX09GRlNFVCsyKTsKKyAgICBzYVsyXSA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIFpNX1dMQU5fSEVBREVSX0EyX09GRlNFVCs0KTsKKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICByZXMgPSB6ZlN0YUZpbmRGcmVlT3Bwb3NpdGUoZGV2LCBzYSwgJmkpOworICAgIGlmICggcmVzICE9IDAgKQorICAgIHsKKyAgICAgICAgZ290byB6bFJldHVybjsKKyAgICB9CisKKyAgICBkc3QgPSB3ZC0+c3RhLm9wcG9zaXRlSW5mb1tpXS5tYWNBZGRyOworICAgIHpmQ29weUZyb21SeEJ1ZmZlcihkZXYsIGJ1ZiwgZHN0LCBaTV9XTEFOX0hFQURFUl9BMl9PRkZTRVQsIDYpOworCisgICAgaWYgKCAod2QtPnN0YS5jdXJyZW50RnJlcXVlbmN5IDwgMzAwMCkgJiYgISh3ZC0+c3VwcG9ydE1vZGUgJiAoWk1fV0lSRUxFU1NfTU9ERV8yNF81NHxaTV9XSVJFTEVTU19NT0RFXzI0X04pKSApCisgICAgeworICAgICAgICBiU3VwcG9ydEV4dFJhdGUgPSAwOworICAgIH0gZWxzZSB7CisgICAgICAgIGJTdXBwb3J0RXh0UmF0ZSA9IDE7CisgICAgfQorCisgICAgaWYgKCAoYlN1cHBvcnRFeHRSYXRlID09IDEpCisgICAgICAgICAmJiAod2QtPnN0YS5jdXJyZW50RnJlcXVlbmN5IDwgMzAwMCkKKyAgICAgICAgICYmICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9JQlNTKQorICAgICAgICAgJiYgKHdkLT53ZmMuYklic3NHTW9kZSA9PSAwKSApCisgICAgeworICAgICAgICBiU3VwcG9ydEV4dFJhdGUgPSAwOworICAgIH0KKworICAgIHdkLT5zdGEuY29ubmVjdGlvbl8xMWIgPSAwOworICAgIG9uZVR4U3RyZWFtQ2FwID0gKHpmSHBDYXBhYmlsaXR5KGRldikgJiBaTV9IUF9DQVBfMTFOX09ORV9UWF9TVFJFQU0pOworCisgICAgaWYgKCAoKG9mZnNldCA9IHpmRmluZEVsZW1lbnQoZGV2LCBidWYsIFpNX1dMQU5fRUlEX0VYVEVOREVEX1JBVEUpKSAhPSAweGZmZmYpCisgICAgICAgICAmJiAoYlN1cHBvcnRFeHRSYXRlID09IDEpICkKKyAgICB7CisgICAgICAgIC8qIFRPRE8gOiBIYW5kbGUgMTFuICovCisgICAgICAgIGlmICh3ZC0+c3RhLmN1cnJlbnRGcmVxdWVuY3kgPCAzMDAwKQorICAgICAgICB7CisgICAgICAgICAgICAvKiAyLjRHSHogKi8KKyAgICAgICAgICAgIGlmICh3ZC0+c3RhLkVuYWJsZUhUID09IDEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8xMW5nCisgICAgICAgICAgICAgICAgemZSYXRlQ3RybEluaXRDZWxsKGRldiwgJndkLT5zdGEub3Bwb3NpdGVJbmZvW2ldLnJjQ2VsbCwgKG9uZVR4U3RyZWFtQ2FwIT0wKT8zOjIsIDEsIHdkLT5zdGEuU0c0MCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8xMWcKKyAgICAgICAgICAgICAgICB6ZlJhdGVDdHJsSW5pdENlbGwoZGV2LCAmd2QtPnN0YS5vcHBvc2l0ZUluZm9baV0ucmNDZWxsLCAxLCAxLCB3ZC0+c3RhLlNHNDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcnRzY3RzUmF0ZSA9IDB4MDAwMDFiYjsgLyogQ1RTOkNDSyAxTSwgUlRTOk9GRE0gNk0gKi8KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIDVHSHogKi8KKyAgICAgICAgICAgIGlmICh3ZC0+c3RhLkVuYWJsZUhUID09IDEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8xMW5hCisgICAgICAgICAgICAgICAgemZSYXRlQ3RybEluaXRDZWxsKGRldiwgJndkLT5zdGEub3Bwb3NpdGVJbmZvW2ldLnJjQ2VsbCwgKG9uZVR4U3RyZWFtQ2FwIT0wKT8zOjIsIDAsIHdkLT5zdGEuU0c0MCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8xMWEKKyAgICAgICAgICAgICAgICB6ZlJhdGVDdHJsSW5pdENlbGwoZGV2LCAmd2QtPnN0YS5vcHBvc2l0ZUluZm9baV0ucmNDZWxsLCAxLCAwLCB3ZC0+c3RhLlNHNDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcnRzY3RzUmF0ZSA9IDB4MTBiMDFiYjsgLyogQ1RTOk9GRE0gNk0sIFJUUzpPRkRNIDZNICovCisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogVE9ETyA6IEhhbmRsZSAxMW4gKi8KKyAgICAgICAgaWYgKHdkLT5zdGEuY3VycmVudEZyZXF1ZW5jeSA8IDMwMDApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIDIuNEdIeiAqLworICAgICAgICAgICAgaWYgKHdkLT5zdGEuRW5hYmxlSFQgPT0gMSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLzExbmcKKyAgICAgICAgICAgICAgICB6ZlJhdGVDdHJsSW5pdENlbGwoZGV2LCAmd2QtPnN0YS5vcHBvc2l0ZUluZm9baV0ucmNDZWxsLCAob25lVHhTdHJlYW1DYXAhPTApPzM6MiwgMSwgd2QtPnN0YS5TRzQwKTsKKyAgICAgICAgICAgICAgICBydHNjdHNSYXRlID0gMHgwMDAwMWJiOyAvKiBDVFM6Q0NLIDFNLCBSVFM6T0ZETSA2TSAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vMTFiCisgICAgICAgICAgICAgICAgemZSYXRlQ3RybEluaXRDZWxsKGRldiwgJndkLT5zdGEub3Bwb3NpdGVJbmZvW2ldLnJjQ2VsbCwgMCwgMSwgd2QtPnN0YS5TRzQwKTsKKyAgICAgICAgICAgICAgICBydHNjdHNSYXRlID0gMHgwOyAvKiBDVFM6Q0NLIDFNLCBSVFM6Q0NLIDFNICovCisgICAgICAgICAgICAgICAgd2QtPnN0YS5jb25uZWN0aW9uXzExYiA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvKiA1R0h6ICovCisgICAgICAgICAgICBpZiAod2QtPnN0YS5FbmFibGVIVCA9PSAxKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vMTFuYQorICAgICAgICAgICAgICAgIHpmUmF0ZUN0cmxJbml0Q2VsbChkZXYsICZ3ZC0+c3RhLm9wcG9zaXRlSW5mb1tpXS5yY0NlbGwsIChvbmVUeFN0cmVhbUNhcCE9MCk/MzoyLCAwLCB3ZC0+c3RhLlNHNDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vMTFhCisgICAgICAgICAgICAgICAgemZSYXRlQ3RybEluaXRDZWxsKGRldiwgJndkLT5zdGEub3Bwb3NpdGVJbmZvW2ldLnJjQ2VsbCwgMSwgMCwgd2QtPnN0YS5TRzQwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJ0c2N0c1JhdGUgPSAweDEwYjAxYmI7IC8qIENUUzpPRkRNIDZNLCBSVFM6T0ZETSA2TSAqLworICAgICAgICB9CisgICAgfQorCisgICAgemZTdGFJbml0Q29tbW9uT3Bwb3NpdGVJbmZvKGRldiwgaSk7CisKK3psUmV0dXJuOgorICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICBpZiAocnRzY3RzUmF0ZSAhPSAweGZmZmZmZmZmKQorICAgIHsKKyAgICAgICAgemZIcFNldFJUU0NUU1JhdGUoZGV2LCBydHNjdHNSYXRlKTsKKyAgICB9CisgICAgcmV0dXJuIHJlczsKK30KKwordm9pZCB6ZlN0YVByb3RFcnBNb25pdG9yKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZikKK3sKKyAgICB1MTZfdCAgIG9mZnNldDsKKyAgICB1OF90ICAgIGVycDsKKyAgICB1OF90ICAgIGJzc2lkWzZdOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgaWYgKCAod2QtPndsYW5Nb2RlID09IFpNX01PREVfSU5GUkFTVFJVQ1RVUkUpJiYoemZTdGFJc0Nvbm5lY3RlZChkZXYpKSApCisgICAgeworICAgICAgICBaTV9NQUNfV09SRF9UT19CWVRFKHdkLT5zdGEuYnNzaWQsIGJzc2lkKTsKKworICAgICAgICBpZiAoemZSeEJ1ZmZlckVxdWFsVG9TdHIoZGV2LCBidWYsIGJzc2lkLCBaTV9XTEFOX0hFQURFUl9BMl9PRkZTRVQsIDYpKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIChvZmZzZXQ9emZGaW5kRWxlbWVudChkZXYsIGJ1ZiwgWk1fV0xBTl9FSURfRVJQKSkgIT0gMHhmZmZmICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBlcnAgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMik7CisKKyAgICAgICAgICAgICAgICBpZiAoIGVycCAmIFpNX0JJVF8xICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vem1fZGVidWdfbXNnMCgicHJvdGVjdGlvbiBtb2RlIG9uIik7CisgICAgICAgICAgICAgICAgICAgIGlmICh3ZC0+c3RhLmJQcm90ZWN0aW9uTW9kZSA9PSBGQUxTRSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5iUHJvdGVjdGlvbk1vZGUgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgemZIcFNldFNsb3RUaW1lKGRldiwgMCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy96bV9kZWJ1Z19tc2cwKCJwcm90ZWN0aW9uIG1vZGUgb2ZmIik7CisgICAgICAgICAgICAgICAgICAgIGlmICh3ZC0+c3RhLmJQcm90ZWN0aW9uTW9kZSA9PSBUUlVFKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLmJQcm90ZWN0aW9uTW9kZSA9IEZBTFNFOworICAgICAgICAgICAgICAgICAgICAgICAgemZIcFNldFNsb3RUaW1lKGRldiwgMSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKwkJLy9DaGVjayB0aGUgZXhpc3RlbmNlIG9mIE5vbi1OIEFQCisJCS8vRm9sbG93IHRoZSBjaGVjayB0aGUgInBCc3NJbmZvLT5FbmFibGVIVCIKKwkJCWlmICgob2Zmc2V0ID0gemZGaW5kRWxlbWVudChkZXYsIGJ1ZiwgWk1fV0xBTl9FSURfSFRfQ0FQQUJJTElUWSkpICE9IDB4ZmZmZikKKwkJCXt9CisJCQllbHNlIGlmICgob2Zmc2V0ID0gemZGaW5kRWxlbWVudChkZXYsIGJ1ZiwgWk1fV0xBTl9QUkVOMl9FSURfSFRDQVBBQklMSVRZKSkgIT0gMHhmZmZmKQorCQkJe30KKwkJCWVsc2UKKwkJCXt3ZC0+c3RhLk5vbk5BUGNvdW50Kys7fQorICAgIH0KK30KKwordm9pZCB6ZlN0YVVwZGF0ZVdtZVBhcmFtZXRlcih6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpCit7CisgICAgdTE2X3QgICB0bXA7CisgICAgdTE2X3QgICBhaWZzWzVdOworICAgIHUxNl90ICAgY3dtaW5bNV07CisgICAgdTE2X3QgICBjd21heFs1XTsKKyAgICB1MTZfdCAgIHR4b3BbNV07CisgICAgdThfdCAgICBhY207CisgICAgdThfdCAgICBhYzsKKyAgICB1MTZfdCAgIGxlbjsKKyAgICB1MTZfdCAgIGk7CisgICAJdTE2X3QgICBvZmZzZXQ7CisgICAgdThfdCAgICByeFdtZVBhcmFtZXRlclNldENvdW50OworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgLyogVXBkYXRlIGlmIFdNRSBwYXJhbWV0ZXIgc2V0IGNvdW50IGlzIGNoYW5nZWQgKi8KKyAgICAvKiBJZiBjb25uZWN0IHRvIFdNRSBBUCAqLworICAgIGlmICh3ZC0+c3RhLndtZUNvbm5lY3RlZCAhPSAwKQorICAgIHsKKyAgICAgICAgLyogRmluZCBXTUUgcGFyYW1ldGVyIGVsZW1lbnQgKi8KKyAgICAgICAgaWYgKChvZmZzZXQgPSB6ZkZpbmRXaWZpRWxlbWVudChkZXYsIGJ1ZiwgMiwgMSkpICE9IDB4ZmZmZikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKChsZW4gPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMSkpID49IDcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcnhXbWVQYXJhbWV0ZXJTZXRDb3VudD16bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrOCk7CisgICAgICAgICAgICAgICAgaWYgKHJ4V21lUGFyYW1ldGVyU2V0Q291bnQgIT0gd2QtPnN0YS53bWVQYXJhbWV0ZXJTZXRDb3VudCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHptX21zZzBfbW0oWk1fTFZfMCwgIndtZVBhcmFtZXRlclNldENvdW50IGNoYW5nZWQhIik7CisgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEud21lUGFyYW1ldGVyU2V0Q291bnQgPSByeFdtZVBhcmFtZXRlclNldENvdW50OworICAgICAgICAgICAgICAgICAgICAvKiByZXRyaWV2ZSBXTUUgcGFyYW1ldGVyIGFuZCB1cGRhdGUgVHhRIHBhcmFtZXRlcnMgKi8KKyAgICAgICAgICAgICAgICAgICAgYWNtID0gMHhmOworICAgICAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaTw0OyBpKyspCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsZW4gPj0gKDgrKGkqNCkrNCkpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wPXptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxMCtpKjQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjID0gKHRtcCA+PiA1KSAmIDB4MzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHRtcCAmIDB4MTApID09IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY20gJj0gKH4oMTw8YWMpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWlmc1thY10gPSAoKHRtcCAmIDB4ZikgKiA5KSArIDEwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcD16bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMTEraSo0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDb252ZXJ0IHRvIDJebiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN3bWluW2FjXSA9IHpjQ3dUbGJbKHRtcCAmIDB4ZildOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN3bWF4W2FjXSA9IHpjQ3dUbGJbKHRtcCA+PiA0KV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHhvcFthY109em13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCsxMitpKjQpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKChhY20gJiAweDQpICE9IDApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGN3bWluWzJdID0gY3dtaW5bMF07CisgICAgICAgICAgICAgICAgICAgICAgICBjd21heFsyXSA9IGN3bWF4WzBdOworICAgICAgICAgICAgICAgICAgICAgICAgYWlmc1syXSA9IGFpZnNbMF07CisgICAgICAgICAgICAgICAgICAgICAgICB0eG9wWzJdID0gdHhvcFswXTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoKGFjbSAmIDB4OCkgIT0gMCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY3dtaW5bM10gPSBjd21pblsyXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGN3bWF4WzNdID0gY3dtYXhbMl07CisgICAgICAgICAgICAgICAgICAgICAgICBhaWZzWzNdID0gYWlmc1syXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHR4b3BbM10gPSB0eG9wWzJdOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGN3bWluWzRdID0gMzsKKyAgICAgICAgICAgICAgICAgICAgY3dtYXhbNF0gPSA3OworICAgICAgICAgICAgICAgICAgICBhaWZzWzRdID0gMjg7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKChjd21pblsyXSthaWZzWzJdKSA+ICgoY3dtaW5bMF0rYWlmc1swXSkrMSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEuYWMwUHJpb3JpdHlIaWdoZXJUaGFuQWMyID0gMTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEuYWMwUHJpb3JpdHlIaWdoZXJUaGFuQWMyID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB6ZkhwVXBkYXRlUW9zUGFyYW1ldGVyKGRldiwgY3dtaW4sIGN3bWF4LCBhaWZzLCB0eG9wKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IC8vaWYgKHdkLT5zdGEud21lQ29ubmVjdGVkICE9IDApCit9CisvKiBwcm9jZXNzIDgwMi4xMWggRHluYW1pYyBGcmVxdWVuY3kgU2VsZWN0aW9uICovCit2b2lkIHpmU3RhVXBkYXRlRG90MTFIREZTKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICAvKgorICAgIENoYW5uZWwgU3dpdGNoIEFubm91bmNlbWVudCBFbGVtZW50IEZvcm1hdAorICAgICstLS0tLS0rLS0tLS0tLS0tLSstLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgfEZvcm1hdHxFbGVtZW50IElEfExlbmd0aHxDaGFubmVsIFN3aXRjaCBNb2RlfE5ldyBDaGFubmVsIE51bWJlcnxDaGFubmVsIFN3aXRjaCBDb3VudHwKKyAgICArLS0tLS0tKy0tLS0tLS0tLS0rLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAgIHxCeXRlcyB8ICAgMSAgICAgIHwgIDEgICB8CSAgICAgMSAgICAgICAgICAgfCAgICAgICAxICAgICAgICAgIHwgICAgICAgICAgMSAgICAgICAgIHwKKyAgICArLS0tLS0tKy0tLS0tLS0tLS0rLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAgIHxWYWx1ZSB8ICAgMzcgICAgIHwgIDMgICB8ICAgICAgIDAgb3IgMSAgICAgIHx1bnNpZ25lZCBpbnRlZ2VyICB8dW5zaWduZWQgaW50ZWdlciAgICB8CisgICAgKy0tLS0tLSstLS0tLS0tLS0tKy0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgICAqLworICAgIC8vdThfdCAgICBsZW5ndGgsIGNoYW5uZWwsIGlzNUc7CisgICAgdTE2X3QgICBvZmZzZXQ7CisKKyAgICAvKiBnZXQgRUlEKENoYW5uZWwgU3dpdGNoIEFubm91bmNlbWVudCkgKi8KKyAgICBpZiAoIChvZmZzZXQgPSB6ZkZpbmRFbGVtZW50KGRldiwgYnVmLCBaTV9XTEFOX0VJRF9DSEFOTkVMX1NXSVRDSF9BTk5PVU5DRSkpID09IDB4ZmZmZiApCisgICAgeworICAgICAgICAvL3ptX2RlYnVnX21zZzAoIkVJRChDaGFubmVsIFN3aXRjaCBBbm5vdW5jZW1lbnQpIG5vdCBmb3VuZCIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGVsc2UgaWYgKCB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMSkgPT0gMHgzICkKKyAgICB7CisgICAgICAgIHptX2RlYnVnX21zZzAoIkVJRChDaGFubmVsIFN3aXRjaCBBbm5vdW5jZW1lbnQpIGZvdW5kIik7CisKKyAgICAgICAgLy9sZW5ndGggPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMSk7CisgICAgICAgIC8vemZDb3B5RnJvbVJ4QnVmZmVyKGRldiwgYnVmLCBwQnNzSW5mby0+c3VwcG9ydGVkUmF0ZXMsIG9mZnNldCwgbGVuZ3RoKzIpOworCisgICAgICAgIC8vQ2hhbmVsbCBTd2l0Y2ggTW9kZSBzZXQgdG8gMSwgZHJpdmVyIHNob3VsZCBkaXNhYmxlIHRyYW5zbWl0IGltbWVkaWF0ZQorICAgICAgICAvL3dlIGRvIHRoaXMgYnkgcG9sbCBDQ0EgaGlnaAorICAgICAgICBpZiAoem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzIpID09IDB4MSApCisgICAgICAgIHsKKyAgICAgICAgCS8vdXNlIFpNX09JRF9JTlRFUk5BTF9XUklURSxaTV9DTURfUkVTRVQgdG8gbm90aWNlIGZpcm13YXJlIGZsdXNoIHF1ZW5lIGFuZCBzdG9wIGRtYSwKKyAgICAgICAgCS8vdGhlbiByZXN0YXJ0IHJ4IGRtYSBidXQgbm90IHR4IGRtYQorICAgICAgICAJaWYgKHdkLT5zdGEuREZTRGlzYWJsZVR4ICE9IFRSVUUpCisgICAgICAgIAl7CisgICAgICAgICAgICAgICAgLyogVE9ETyA6IHpmSHBSZXNldFR4Unggd291bGQgY2F1c2UgUnggaGFuZyAqLworICAgICAgICAgICAgICAgIC8vemZIcFJlc2V0VHhSeChkZXYpOworICAgICAgICAgICAgICAgIHdkLT5zdGEuREZTRGlzYWJsZVR4ID0gVFJVRTsKKyAgICAgICAgICAgICAgICAvKiBUcmdnZXIgUnggRE1BICovCisgICAgICAgICAgICAgICAgemZIcFN0YXJ0UmVjdihkZXYpOworICAgICAgICAgICAgfQorICAgICAgICAJLy9BZGFwdGVyLT5aRDgwMjExSFNldHRpbmcuRGlzYWJsZVR4Qnk4MDIxMUg9VFJVRTsKKyAgICAgICAgCS8vQWNxdWlyZUN0ck9mUGh5UmVnKEFkYXB0ZXIpOworICAgICAgICAJLy9aRDEyMDVfV1JJVEVfUkVHSVNURVIoQWRhcHRlcixDUjI0LCAweDApOworICAgICAgICAJLy9SZWxlYXNlRG9Ob3RTbGVlcChBZGFwdGVyKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrNCkgPD0gMHgyICkKKyAgICAgICAgeworICAgICAgICAJLy9DaGFubmVsIFN3aXRjaAorICAgICAgICAJLy9pZiBDaGFubmVsIFN3aXRjaCBDb3VudCA9IDAgLCBTVEEgc2hvdWxkIGNoYW5nZSBjaGFubmVsIGltbWVkaWF0ZWx5LgorICAgICAgICAJLy9pZiBDaGFubmVsIFN3aXRjaCBDb3VudCA+IDAgLCBTVEEgc2hvdWxkIGNoYW5nZSBjaGFubmVsIGFmdGVyIFRCVFQqY291bnQKKyAgICAgICAgCS8vQnV0IGl0IHdvbid0IGJlIGFjY3VyYXRlIHRvIGxldCBkcml2ZXIgY2FsY3VsYXRlIFRCVFQqY291bnQsIGFuZCB0aGUgdmFsdWUgb2YKKyAgICAgICAgCS8vQ2hhbm5lbCBTd2l0Y2ggQ291bnQgd2lsbCBkZWNyZWFzZSBieSBvbmUgZWFjaCB3aGVuIGNvbnRpbnVlIHJlY2V2aW5nIGJlYWNvbgorICAgICAgICAJLy9TbyB3ZSBjaGFuZ2UgY2hhbm5lbCBoZXJlIHdoZW4gd2UgcmVjZWl2ZSBjb3VudCA8PTIuCisKKyAgICAgICAgICAgIHpmSHBEZWxldGVBbGxvd0NoYW5uZWwoZGV2LCB3ZC0+c3RhLmN1cnJlbnRGcmVxdWVuY3kpOworICAgICAgICAJd2QtPmZyZXF1ZW5jeSA9IHpmQ2hOdW1Ub0ZyZXEoZGV2LCB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMyksIDApOworICAgICAgICAJLy96ZkhwQWRkQWxsb3dDaGFubmVsKGRldiwgd2QtPmZyZXF1ZW5jeSk7CisgICAgICAgIAl6bV9kZWJ1Z19tc2cxKCJDV1kgLSBqdW1wIHRvIGZyZXF1ZW5jeSA9ICIsIHdkLT5mcmVxdWVuY3kpOworICAgICAgICAJemZDb3JlU2V0RnJlcXVlbmN5KGRldiwgd2QtPmZyZXF1ZW5jeSk7CisgICAgICAgIAl3ZC0+c3RhLkRGU0Rpc2FibGVUeCA9IEZBTFNFOworICAgICAgICAgICAgLyogSW5jcmVhc2UgcnhCZWFjb25Db3VudCB0byBwcmV2ZW50IGJlYWNvbiBsb3N0ICovCisgICAgICAgICAgICBpZiAoemZTdGFJc0Nvbm5lY3RlZChkZXYpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdkLT5zdGEucnhCZWFjb25Db3VudCA9IDEgPDwgNjsgLy8gMiB0aW1lcyBvZiBjaGVjayB3b3VsZCBwYXNzCisgICAgICAgICAgICB9CisgICAgICAgIAkvL3N0YXJ0IHR4IGRtYSB0byB0cmFuc21pdCBwYWNrZXQKKworICAgICAgICAJLy9pZiAoem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzMpICE9IHdkLT5mcmVxdWVuY3kpCisgICAgICAgIAkvL3sKKyAgICAgICAgCS8vCS8vWkREYmdQcmludCgoIlJhZGFyIERldGVjdCBieSBBUFxuIikpOworICAgICAgICAJLy8JemZDb3JlU2V0RnJlcXVlbmN5KCk7CisgICAgICAgIAkvLwlQcm9jZXNzUmFkYXJEZXRlY3RFdmVudChBZGFwdGVyKTsKKyAgICAgICAgCS8vCVNldF9SRl9DaGFubmVsKEFkYXB0ZXIsIFN3UmZkLT5SZmQtPlJ4QnVmZmVyW2luZGV4KzNdLCAoVUNIQVIpQWRhcHRlci0+UkZfTW9kZSwgMSk7CisgICAgICAgIAkvLwlBZGFwdGVyLT5DYXJkU2V0dGluZy5DaGFubmVsID0gU3dSZmQtPlJmZC0+UnhCdWZmZXJbaW5kZXgrM107CisgICAgICAgIAkvLwlBZGFwdGVyLT5TYXZlQ2hhbm5lbCA9IEFkYXB0ZXItPkNhcmRTZXR0aW5nLkNoYW5uZWw7CisgICAgICAgIAkvLwlBZGFwdGVyLT5VdGlsaXR5Q2hhbm5lbCA9IEFkYXB0ZXItPkNhcmRTZXR0aW5nLkNoYW5uZWw7CisgICAgICAgIAkvL30KKyAgICAgICAgfQorICAgIH0KKworfQorLyogVE9ETyA6IHByb2Nlc3MgODAyLjExaCBUcmFuc21pc3Npb24gUG93ZXIgQ29udHJvbCAqLwordm9pZCB6ZlN0YVVwZGF0ZURvdDExSFRQQyh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpCit7Cit9CisKKy8qIElCU1MgcG93ZXItc2F2aW5nIG1vZGUgKi8KK3ZvaWQgemZTdGFJYnNzUFNDaGVja1N0YXRlKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZikKK3sKKyAgICB1OF90ICAgaSwgZnJhbWVDdHJsOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgaWYgKCAhemZTdGFJc0Nvbm5lY3RlZChkZXYpICkKKyAgICB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoIHdkLT53bGFuTW9kZSAhPSBaTV9NT0RFX0lCU1MgKQorICAgIHsKKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisKKyAgICAvKiBjaGVjayBCU1NJRCAqLworICAgIGlmICggIXpmUnhCdWZmZXJFcXVhbFRvU3RyKGRldiwgYnVmLCAodThfdCopIHdkLT5zdGEuYnNzaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWk1fV0xBTl9IRUFERVJfQTNfT0ZGU0VULCA2KSApCisgICAgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZnJhbWVDdHJsID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgMSk7CisKKyAgICAvKiBjaGVjayBwb3dlciBtYW5hZ2VtZW50IGJpdCAqLworICAgIGlmICggZnJhbWVDdHJsICYgWk1fQklUXzQgKQorICAgIHsKKyAgICAgICAgZm9yKGk9MTsgaTxaTV9NQVhfUFNfU1RBOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggIXdkLT5zdGEuc3RhUFNMaXN0LmVudGl0eVtpXS5iVXNlZCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIGNoZWNrIHNvdXJjZSBhZGRyZXNzICovCisgICAgICAgICAgICBpZiAoIHpmUnhCdWZmZXJFcXVhbFRvU3RyKGRldiwgYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLnN0YVBTTGlzdC5lbnRpdHlbaV0ubWFjQWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWk1fV0xBTl9IRUFERVJfQTJfT0ZGU0VULCA2KSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9yKGk9MTsgaTxaTV9NQVhfUFNfU1RBOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggIXdkLT5zdGEuc3RhUFNMaXN0LmVudGl0eVtpXS5iVXNlZCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2QtPnN0YS5zdGFQU0xpc3QuZW50aXR5W2ldLmJVc2VkID0gVFJVRTsKKyAgICAgICAgICAgICAgICB3ZC0+c3RhLnN0YVBTTGlzdC5lbnRpdHlbaV0uYkRhdGFRdWV1ZWQgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICggaSA9PSBaTV9NQVhfUFNfU1RBICkKKyAgICAgICAgeworICAgICAgICAgICAgLyogU1RBIGxpc3QgaXMgZnVsbCAqLworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgemZDb3B5RnJvbVJ4QnVmZmVyKGRldiwgYnVmLCB3ZC0+c3RhLnN0YVBTTGlzdC5lbnRpdHlbaV0ubWFjQWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFpNX1dMQU5fSEVBREVSX0EyX09GRlNFVCwgNik7CisKKyAgICAgICAgaWYgKCB3ZC0+c3RhLnN0YVBTTGlzdC5jb3VudCA9PSAwICkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gZW5hYmxlIEFUSU0gd2luZG93CisgICAgICAgICAgICAvL3pmRW5hYmxlQXRpbVdpbmRvdyhkZXYpOworICAgICAgICB9CisKKyAgICAgICAgd2QtPnN0YS5zdGFQU0xpc3QuY291bnQrKzsKKyAgICB9CisgICAgZWxzZSBpZiAoIHdkLT5zdGEuc3RhUFNMaXN0LmNvdW50ICkKKyAgICB7CisgICAgICAgIGZvcihpPTE7IGk8Wk1fTUFYX1BTX1NUQTsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHdkLT5zdGEuc3RhUFNMaXN0LmVudGl0eVtpXS5iVXNlZCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCB6ZlJ4QnVmZmVyRXF1YWxUb1N0cihkZXYsIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEuc3RhUFNMaXN0LmVudGl0eVtpXS5tYWNBZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWk1fV0xBTl9IRUFERVJfQTJfT0ZGU0VULCA2KSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLnN0YVBTTGlzdC5lbnRpdHlbaV0uYlVzZWQgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5zdGFQU0xpc3QuY291bnQtLTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIHdkLT5zdGEuc3RhUFNMaXN0LmVudGl0eVtpXS5iRGF0YVF1ZXVlZCApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNlbmQgcXVldWVkIGRhdGEgKi8KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICggd2QtPnN0YS5zdGFQU0xpc3QuY291bnQgPT0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIGRpc2FibGUgQVRJTSB3aW5kb3cgKi8KKyAgICAgICAgICAgIC8vemZEaXNhYmxlQXRpbVdpbmRvdyhkZXYpOworICAgICAgICB9CisKKyAgICB9Cit9CisKKy8qIElCU1MgcG93ZXItc2F2aW5nIG1vZGUgKi8KK3U4X3QgemZTdGFJYnNzUFNRdWV1ZURhdGEoemRldl90KiBkZXYsIHpidWZfdCogYnVmKQoreworICAgIHU4X3QgICBpOworICAgIHUxNl90ICBkYVszXTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIGlmICggIXpmU3RhSXNDb25uZWN0ZWQoZGV2KSApCisgICAgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBpZiAoIHdkLT53bGFuTW9kZSAhPSBaTV9NT0RFX0lCU1MgKQorICAgIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgaWYgKCB3ZC0+c3RhLnN0YVBTTGlzdC5jb3VudCA9PSAwICYmIHdkLT5zdGEucG93ZXJTYXZlTW9kZSA8PSBaTV9TVEFfUFNfTk9ORSApCisgICAgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvKiBEQSAqLworI2lmZGVmIFpNX0VOQUJMRV9OQVRJVkVfV0lGSQorICAgIGRhWzBdID0gem13X3R4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgWk1fV0xBTl9IRUFERVJfQTFfT0ZGU0VUKTsKKyAgICBkYVsxXSA9IHptd190eF9idWZfcmVhZGgoZGV2LCBidWYsIFpNX1dMQU5fSEVBREVSX0ExX09GRlNFVCArIDIpOworICAgIGRhWzJdID0gem13X3R4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgWk1fV0xBTl9IRUFERVJfQTFfT0ZGU0VUICsgNCk7CisjZWxzZQorICAgIGRhWzBdID0gem13X3R4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMCk7CisgICAgZGFbMV0gPSB6bXdfdHhfYnVmX3JlYWRoKGRldiwgYnVmLCAyKTsKKyAgICBkYVsyXSA9IHptd190eF9idWZfcmVhZGgoZGV2LCBidWYsIDQpOworI2VuZGlmCisKKyAgICBpZiAoIFpNX0lTX01VTFRJQ0FTVF9PUl9CUk9BRENBU1QoZGEpICkKKyAgICB7CisgICAgICAgIHdkLT5zdGEuc3RhUFNMaXN0LmVudGl0eVswXS5iRGF0YVF1ZXVlZCA9IFRSVUU7CisgICAgICAgIHdkLT5zdGEuaWJzc1BTRGF0YVF1ZXVlW3dkLT5zdGEuaWJzc1BTRGF0YUNvdW50KytdID0gYnVmOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICAvLyBVbmljYXN0IHBhY2tldC4uLgorCisgICAgZm9yKGk9MTsgaTxaTV9NQVhfUFNfU1RBOyBpKyspCisgICAgeworICAgICAgICBpZiAoIHpmTWVtb3J5SXNFcXVhbCh3ZC0+c3RhLnN0YVBTTGlzdC5lbnRpdHlbaV0ubWFjQWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHU4X3QqKSBkYSwgNikgKQorICAgICAgICB7CisgICAgICAgICAgICB3ZC0+c3RhLnN0YVBTTGlzdC5lbnRpdHlbaV0uYkRhdGFRdWV1ZWQgPSBUUlVFOworICAgICAgICAgICAgd2QtPnN0YS5pYnNzUFNEYXRhUXVldWVbd2QtPnN0YS5pYnNzUFNEYXRhQ291bnQrK10gPSBidWY7CisKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgfQorCisjaWYgMAorICAgIGlmICggd2QtPnN0YS5wb3dlclNhdmVNb2RlID4gWk1fU1RBX1BTX05PTkUgKQorICAgIHsKKyAgICAgICAgd2QtPnN0YS5zdGFQU0RhdGFRdWV1ZVt3ZC0+c3RhLnN0YVBTRGF0YUNvdW50KytdID0gYnVmOworCisgICAgICAgIHJldHVybiAxOworICAgIH0KKyNlbmRpZgorCisgICAgcmV0dXJuIDA7Cit9CisKKy8qIElCU1MgcG93ZXItc2F2aW5nIG1vZGUgKi8KK3ZvaWQgemZTdGFJYnNzUFNTZW5kKHpkZXZfdCogZGV2KQoreworICAgIHU4X3QgICBpOworICAgIHUxNl90ICBiY2FzdEFkZHJbM10gPSB7MHhmZmZmLCAweGZmZmYsIDB4ZmZmZn07CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBpZiAoICF6ZlN0YUlzQ29ubmVjdGVkKGRldikgKQorICAgIHsKKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisKKyAgICBpZiAoIHdkLT53bGFuTW9kZSAhPSBaTV9NT0RFX0lCU1MgKQorICAgIHsKKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisKKyAgICBmb3IoaT0wOyBpPFpNX01BWF9QU19TVEE7IGkrKykKKyAgICB7CisgICAgICAgIGlmICggd2QtPnN0YS5zdGFQU0xpc3QuZW50aXR5W2ldLmJEYXRhUXVldWVkICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCBpID09IDAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHpmU2VuZE1tRnJhbWUoZGV2LCBaTV9XTEFOX0ZSQU1FX1RZUEVfQVRJTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjYXN0QWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoIHdkLT5zdGEuc3RhUFNMaXN0LmVudGl0eVtpXS5iVXNlZCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gU2VuZCBBVElNIHRvIHByZXZlbnQgdGhlIHBlZXIgdG8gZ28gdG8gc2xlZXAKKyAgICAgICAgICAgICAgICB6ZlNlbmRNbUZyYW1lKGRldiwgWk1fV0xBTl9GUkFNRV9UWVBFX0FUSU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodTE2X3QqKSB3ZC0+c3RhLnN0YVBTTGlzdC5lbnRpdHlbaV0ubWFjQWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIDApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB3ZC0+c3RhLnN0YVBTTGlzdC5lbnRpdHlbaV0uYkRhdGFRdWV1ZWQgPSBGQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvcihpPTA7IGk8d2QtPnN0YS5pYnNzUFNEYXRhQ291bnQ7IGkrKykKKyAgICB7CisgICAgICAgIHpmVHhTZW5kRXRoKGRldiwgd2QtPnN0YS5pYnNzUFNEYXRhUXVldWVbaV0sIDAsCisgICAgICAgICAgICAgICAgICAgIFpNX0VYVEVSTkFMX0FMTE9DX0JVRiwgMCk7CisgICAgfQorCisgICAgd2QtPnN0YS5pYnNzUHJldlBTRGF0YUNvdW50ID0gd2QtPnN0YS5pYnNzUFNEYXRhQ291bnQ7CisgICAgd2QtPnN0YS5pYnNzUFNEYXRhQ291bnQgPSAwOworfQorCisKK3ZvaWQgemZTdGFSZWNvbm5lY3QoemRldl90KiBkZXYpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICBpZiAoIHdkLT53bGFuTW9kZSAhPSBaTV9NT0RFX0lORlJBU1RSVUNUVVJFICYmCisgICAgICAgICB3ZC0+d2xhbk1vZGUgIT0gWk1fTU9ERV9JQlNTICkKKyAgICB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoICh6ZlN0YUlzQ29ubmVjdGVkKGRldikpfHwoemZTdGFJc0Nvbm5lY3RpbmcoZGV2KSkgKQorICAgIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICggd2QtPnN0YS5iQ2hhbm5lbFNjYW4gKQorICAgIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8qIFJlY292ZXIgemVybyBTU0lEIGxlbmd0aCAgKi8KKyAgICBpZiAoICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9JTkZSQVNUUlVDVFVSRSkgJiYgKHdkLT53cy5zc2lkTGVuID09IDApKQorICAgIHsKKyAgICAgICAgem1fZGVidWdfbXNnMCgiemZTdGFSZWNvbm5lY3Q6IE5PVCBTdXBwb3J0ISEgU2V0IFNTSUQgdG8gYW55IEJTUyIpOworICAgICAgICAvKiBBTlkgQlNTICovCisgICAgICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgIHdkLT5zdGEuc3NpZFswXSA9IDA7CisgICAgICAgIHdkLT5zdGEuc3NpZExlbiA9IDA7CisgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgfQorCisgICAgLy8gUkFZOiBUbyBlbnN1cmUgbm8gVFggcGVuZGluZyBiZWZvcmUgcmUtY29ubmVjdGluZworICAgIHpmRmx1c2hWdHhxKGRldik7CisgICAgemZXbGFuRW5hYmxlKGRldik7CisgICAgemZTY2FuTWdyU2NhbkFjayhkZXYpOworfQorCit2b2lkIHpmU3RhVGltZXIxMDBtcyh6ZGV2X3QqIGRldikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBpZiAoICh3ZC0+dGljayAlIDEwKSA9PSAwICkKKyAgICB7CisgICAgICAgIHpmUHVzaFZ0eHEoZGV2KTsKKy8vICAgICAgICB6ZlBvd2VyU2F2aW5nTWdyTWFpbihkZXYpOworICAgIH0KK30KKworCit2b2lkIHpmU3RhQ2hlY2tSeEJlYWNvbih6ZGV2X3QqIGRldikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBpZiAoKCB3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9JTkZSQVNUUlVDVFVSRSApICYmICh6ZlN0YUlzQ29ubmVjdGVkKGRldikpKQorICAgIHsKKyAgICAgICAgaWYgKHdkLT5iZWFjb25JbnRlcnZhbCA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICB3ZC0+YmVhY29uSW50ZXJ2YWwgPSAxMDA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCAod2QtPnRpY2sgJSAoKHdkLT5iZWFjb25JbnRlcnZhbCAqIDEwKSAvIFpNX01TX1BFUl9USUNLKSkgPT0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIENoZWNrIHJ4QmVhY29uQ291bnQgKi8KKyAgICAgICAgICAgIGlmICh3ZC0+c3RhLnJ4QmVhY29uQ291bnQgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAod2QtPnN0YS5iZWFjb25NaXNzU3RhdGUgPT0gMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAJLypub3RpZnkgQVAgdGhhdCB3ZSBsZWZ0Ki8KKyAgICAgICAgICAgIAl6ZlNlbmRNbUZyYW1lKGRldiwgWk1fV0xBTl9GUkFNRV9UWVBFX0RFQVVUSCwgd2QtPnN0YS5ic3NpZCwgMywgMCwgMCk7CisgICAgICAgICAgICAgICAgLyogQmVhY29uIExvc3QgKi8KKyAgICAgICAgICAgICAgICB6ZlN0YUNvbm5lY3RGYWlsKGRldiwgWk1fU1RBVFVTX01FRElBX0RJU0NPTk5FQ1RfQkVBQ09OX01JU1MsCisgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLmJzc2lkLCAwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5iZWFjb25NaXNzU3RhdGUgPSAxOworICAgICAgICAgICAgICAgICAgICAvKiBSZXNldCBjaGFubmVsICovCisgICAgICAgICAgICAgICAgICAgIHpmQ29yZVNldEZyZXF1ZW5jeUV4VjIoZGV2LCB3ZC0+ZnJlcXVlbmN5LCB3ZC0+QmFuZFdpZHRoNDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2QtPkV4dE9mZnNldCwgTlVMTCwgMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdkLT5zdGEuYmVhY29uTWlzc1N0YXRlID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdkLT5zdGEucnhCZWFjb25Db3VudCA9IDA7CisgICAgICAgIH0KKyAgICB9Cit9CisKKworCit2b2lkIHpmU3RhQ2hlY2tDb25uZWN0VGltZW91dCh6ZGV2X3QqIGRldikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIGlmICggd2QtPndsYW5Nb2RlICE9IFpNX01PREVfSU5GUkFTVFJVQ1RVUkUgKQorICAgIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICggIXpmU3RhSXNDb25uZWN0aW5nKGRldikgKQorICAgIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgaWYgKCAod2QtPnN0YS5jb25uZWN0U3RhdGUgPT0gWk1fU1RBX0NPTk5fU1RBVEVfQVVUSF9PUEVOKXx8CisgICAgICAgICAod2QtPnN0YS5jb25uZWN0U3RhdGUgPT0gWk1fU1RBX0NPTk5fU1RBVEVfQVVUSF9TSEFSRV8xKXx8CisgICAgICAgICAod2QtPnN0YS5jb25uZWN0U3RhdGUgPT0gWk1fU1RBX0NPTk5fU1RBVEVfQVVUSF9TSEFSRV8yKXx8CisgICAgICAgICAod2QtPnN0YS5jb25uZWN0U3RhdGUgPT0gWk1fU1RBX0NPTk5fU1RBVEVfQVNTT0NJQVRFKSApCisgICAgeworICAgICAgICBpZiAoICh3ZC0+dGljayAtIHdkLT5zdGEuY29ubmVjdFRpbWVyKSA+IFpNX0lOVEVSVkFMX0NPTk5FQ1RfVElNRU9VVCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggd2QtPnN0YS5jb25uZWN0QnlSZWFzc28gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdkLT5zdGEuZmFpbENudE9mUmVhc3NvKys7CisgICAgICAgICAgICAgICAgaWYgKCB3ZC0+c3RhLmZhaWxDbnRPZlJlYXNzbyA+IDIgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5jb25uZWN0QnlSZWFzc28gPSBGQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHdkLT5zdGEuY29ubmVjdFN0YXRlID0gWk1fU1RBX0NPTk5fU1RBVEVfTk9ORTsKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzEoImNvbm5lY3QgdGltZW91dCwgc3RhdGUgPSAiLCB3ZC0+c3RhLmNvbm5lY3RTdGF0ZSk7CisgICAgICAgICAgICAvL3pmaVdsYW5EaXNhYmxlKGRldik7CisgICAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgcmV0dXJuOworCitmYWlsZWQ6CisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICBpZih3ZC0+c3RhLmF1dGhNb2RlID09IFpNX0FVVEhfTU9ERV9BVVRPKQorCXsgLy8gRml4IHNvbWUgQVAgbm90IHNlbmQgYXV0aGVudGljYXRpb24gZmFpbGVkIG1lc3NhZ2UgdG8gc3RhIGFuZCBsZWFkIHRvIGNvbm5lY3QgdGltZW91dCAhCisgICAgICAgICAgICB3ZC0+c3RhLmNvbm5lY3RUaW1lb3V0Q291bnQrKzsKKwl9CisgICAgemZTdGFDb25uZWN0RmFpbChkZXYsIFpNX1NUQVRVU19NRURJQV9ESVNDT05ORUNUX1RJTUVPVVQsIHdkLT5zdGEuYnNzaWQsIDIpOworICAgIHJldHVybjsKK30KKwordm9pZCB6Zk1tU3RhVGltZVRpY2soemRldl90KiBkZXYpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgLyogYWlyb3BlZWsgKi8KKyAgICBpZiAod2QtPndsYW5Nb2RlICE9IFpNX01PREVfQVAgJiYgIXdkLT5zd1NuaWZmZXIpCisgICAgeworICAgICAgICBpZiAoIHdkLT50aWNrICYgMSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHpmVGltZXJDaGVja0FuZEhhbmRsZShkZXYpOworICAgICAgICB9CisKKyAgICAgICAgemZTdGFDaGVja1J4QmVhY29uKGRldik7CisgICAgICAgIHpmU3RhVGltZXIxMDBtcyhkZXYpOworICAgICAgICB6ZlN0YUNoZWNrQ29ubmVjdFRpbWVvdXQoZGV2KTsKKyAgICAgICAgemZQb3dlclNhdmluZ01nck1haW4oZGV2KTsKKyAgICB9CisKKyNpZmRlZiBaTV9FTkFCTEVfQUdHUkVHQVRJT04KKyAgICAvKgorICAgICAqIGFkZCBieSBob25kYQorICAgICAqLworICAgIHpmQWdnU2NhbkFuZENsZWFyKGRldiwgd2QtPnRpY2spOworI2VuZGlmCit9CisKK3ZvaWQgemZTdGFTZW5kQmVhY29uKHpkZXZfdCogZGV2KQoreworICAgIHpidWZfdCogYnVmOworICAgIHUxNl90IG9mZnNldCwgc2VxOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIC8vem1fZGVidWdfbXNnMCgiXG4iKTsKKworICAgIC8qIFRCRCA6IE1heGltdW0gc2l6ZSBvZiBiZWFjb24gKi8KKyAgICBpZiAoKGJ1ZiA9IHpmd0J1ZkFsbG9jYXRlKGRldiwgMTAyNCkpID09IE5VTEwpCisgICAgeworICAgICAgICB6bV9kZWJ1Z19tc2cwKCJBbGxvY2F0ZSBiZWFjb24gYnVmZmVyIGZhaWxlZCIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgb2Zmc2V0ID0gMDsKKyAgICAvKiB3bGFuIGhlYWRlciAqLworICAgIC8qIEZyYW1lIGNvbnRyb2wgKi8KKyAgICB6bXdfdHhfYnVmX3dyaXRlaChkZXYsIGJ1Ziwgb2Zmc2V0LCAweDAwODApOworICAgIG9mZnNldCs9MjsKKyAgICAvKiBEdXJhdGlvbiAqLworICAgIHptd190eF9idWZfd3JpdGVoKGRldiwgYnVmLCBvZmZzZXQsIDB4MDAwMCk7CisgICAgb2Zmc2V0Kz0yOworICAgIC8qIEFkZHJlc3MgMSAqLworICAgIHptd190eF9idWZfd3JpdGVoKGRldiwgYnVmLCBvZmZzZXQsIDB4ZmZmZik7CisgICAgb2Zmc2V0Kz0yOworICAgIHptd190eF9idWZfd3JpdGVoKGRldiwgYnVmLCBvZmZzZXQsIDB4ZmZmZik7CisgICAgb2Zmc2V0Kz0yOworICAgIHptd190eF9idWZfd3JpdGVoKGRldiwgYnVmLCBvZmZzZXQsIDB4ZmZmZik7CisgICAgb2Zmc2V0Kz0yOworICAgIC8qIEFkZHJlc3MgMiAqLworICAgIHptd190eF9idWZfd3JpdGVoKGRldiwgYnVmLCBvZmZzZXQsIHdkLT5tYWNBZGRyWzBdKTsKKyAgICBvZmZzZXQrPTI7CisgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCwgd2QtPm1hY0FkZHJbMV0pOworICAgIG9mZnNldCs9MjsKKyAgICB6bXdfdHhfYnVmX3dyaXRlaChkZXYsIGJ1Ziwgb2Zmc2V0LCB3ZC0+bWFjQWRkclsyXSk7CisgICAgb2Zmc2V0Kz0yOworICAgIC8qIEFkZHJlc3MgMyAqLworICAgIHptd190eF9idWZfd3JpdGVoKGRldiwgYnVmLCBvZmZzZXQsIHdkLT5zdGEuYnNzaWRbMF0pOworICAgIG9mZnNldCs9MjsKKyAgICB6bXdfdHhfYnVmX3dyaXRlaChkZXYsIGJ1Ziwgb2Zmc2V0LCB3ZC0+c3RhLmJzc2lkWzFdKTsKKyAgICBvZmZzZXQrPTI7CisgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCwgd2QtPnN0YS5ic3NpZFsyXSk7CisgICAgb2Zmc2V0Kz0yOworCisgICAgLyogU2VxdWVuY2UgbnVtYmVyICovCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICBzZXEgPSAoKHdkLT5tbXNlcSsrKTw8NCk7CisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICB6bXdfdHhfYnVmX3dyaXRlaChkZXYsIGJ1Ziwgb2Zmc2V0LCBzZXEpOworICAgIG9mZnNldCs9MjsKKworICAgIC8qIDI0LTMxIFRpbWUgU3RhbXAgOiBoYXJkd2FyZSB3aWxsIGZpbGwgdGhpcyBmaWVsZCAqLworICAgIG9mZnNldCs9ODsKKworICAgIC8qIEJlYWNvbiBJbnRlcnZhbCAqLworICAgIHptd190eF9idWZfd3JpdGVoKGRldiwgYnVmLCBvZmZzZXQsIHdkLT5iZWFjb25JbnRlcnZhbCk7CisgICAgb2Zmc2V0Kz0yOworCisgICAgLyogQ2FwYWJpbGl0eSAqLworICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgd2QtPnN0YS5jYXBhYmlsaXR5WzBdKTsKKyAgICB6bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIHdkLT5zdGEuY2FwYWJpbGl0eVsxXSk7CisKKyAgICAvKiBTU0lEICovCisgICAgb2Zmc2V0ID0gemZTdGFBZGRJZVNzaWQoZGV2LCBidWYsIG9mZnNldCk7CisKKyAgICBpZih3ZC0+ZnJlcXVlbmN5IDw9IFpNX0NIX0dfMTQpICAvLyAyLjQgR0h6ICBiK2cKKyAgICB7CisKKyAgICAJLyogU3VwcG9ydCBSYXRlICovCisgICAgCW9mZnNldCA9IHpmTW1BZGRJZVN1cHBvcnRSYXRlKGRldiwgYnVmLCBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQlaTV9XTEFOX0VJRF9TVVBQT1JUX1JBVEUsIFpNX1JBVEVfU0VUX0NDSyk7CisKKyAgICAJLyogRFMgcGFyYW1ldGVyIHNldCAqLworICAgIAlvZmZzZXQgPSB6Zk1tQWRkSWVEcyhkZXYsIGJ1Ziwgb2Zmc2V0KTsKKworICAgIAlvZmZzZXQgPSB6ZlN0YUFkZEllSWJzcyhkZXYsIGJ1Ziwgb2Zmc2V0KTsKKworICAgICAgICBpZiggd2QtPndmYy5iSWJzc0dNb2RlCisgICAgICAgICAgICAmJiAod2QtPnN1cHBvcnRNb2RlICYgKFpNX1dJUkVMRVNTX01PREVfMjRfNTR8Wk1fV0lSRUxFU1NfTU9ERV8yNF9OKSkgKSAgICAvLyBPbmx5IGFjY29tcGFueSB3aXRoIGVuYWJsaW5nIGEgbW9kZSAuCisgICAgICAgIHsKKyAgICAgIAkgICAgLyogRVJQIEluZm9ybWF0aW9uICovCisgICAgICAgCSAgICB3ZC0+ZXJwRWxlbWVudCA9IDA7CisgICAgICAgCSAgICBvZmZzZXQgPSB6Zk1tQWRkSWVFcnAoZGV2LCBidWYsIG9mZnNldCk7CisgICAgICAgCX0KKworICAgICAgIAkvKiBUT0RPIDogY291bnRyeSBpbmZvcm1hdGlvbiAqLworICAgICAgICAvKiBSU04gKi8KKyAgICAgICAgaWYgKCB3ZC0+c3RhLmF1dGhNb2RlID09IFpNX0FVVEhfTU9ERV9XUEEyUFNLICkKKyAgICAgICAgeworICAgICAgICAgICAgb2Zmc2V0ID0gemZ3U3RhQWRkSWVXcGFSc24oZGV2LCBidWYsIG9mZnNldCwgWk1fV0xBTl9GUkFNRV9UWVBFX0FVVEgpOworICAgICAgICB9CisKKyAgICAgICAgaWYoIHdkLT53ZmMuYklic3NHTW9kZQorICAgICAgICAgICAgJiYgKHdkLT5zdXBwb3J0TW9kZSAmIChaTV9XSVJFTEVTU19NT0RFXzI0XzU0fFpNX1dJUkVMRVNTX01PREVfMjRfTikpICkgICAgLy8gT25seSBhY2NvbXBhbnkgd2l0aCBlbmFibGluZyBhIG1vZGUgLgorICAgICAgICB7CisgICAgICAgICAgICAvKiBFbmFibGUgRyBNb2RlICovCisgICAgICAgICAgICAvKiBFeHRlbmRlZCBTdXBwb3J0ZWQgUmF0ZXMgKi8KKyAgICAgICAJICAgIG9mZnNldCA9IHpmTW1BZGRJZVN1cHBvcnRSYXRlKGRldiwgYnVmLCBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJICAgIFpNX1dMQU5fRUlEX0VYVEVOREVEX1JBVEUsIFpNX1JBVEVfU0VUX09GRE0pOworCSAgICB9CisgICAgfQorICAgIGVsc2UgICAgLy8gNUdIeiBhCisgICAgeworICAgICAgICAvKiBTdXBwb3J0IFJhdGUgYSBNb2RlICovCisgICAgCW9mZnNldCA9IHpmTW1BZGRJZVN1cHBvcnRSYXRlKGRldiwgYnVmLCBvZmZzZXQsCisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgICAgICAgICAgWk1fV0xBTl9FSURfU1VQUE9SVF9SQVRFLCBaTV9SQVRFX1NFVF9PRkRNKTsKKworICAgICAgICAvKiBEUyBwYXJhbWV0ZXIgc2V0ICovCisgICAgCW9mZnNldCA9IHpmTW1BZGRJZURzKGRldiwgYnVmLCBvZmZzZXQpOworCisgICAgCW9mZnNldCA9IHpmU3RhQWRkSWVJYnNzKGRldiwgYnVmLCBvZmZzZXQpOworCisgICAgICAgIC8qIFRPRE8gOiBjb3VudHJ5IGluZm9ybWF0aW9uICovCisgICAgICAgIC8qIFJTTiAqLworICAgICAgICBpZiAoIHdkLT5zdGEuYXV0aE1vZGUgPT0gWk1fQVVUSF9NT0RFX1dQQTJQU0sgKQorICAgICAgICB7CisgICAgICAgICAgICBvZmZzZXQgPSB6ZndTdGFBZGRJZVdwYVJzbihkZXYsIGJ1Ziwgb2Zmc2V0LCBaTV9XTEFOX0ZSQU1FX1RZUEVfQVVUSCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIHdkLT53bGFuTW9kZSAhPSBaTV9NT0RFX0lCU1MgKQorICAgIHsKKyAgICAgICAgLyogVE9ETyA6IE5lZWQgdG8gY2hlY2sgaWYgaXQgaXMgb2sgKi8KKyAgICAgICAgLyogSFQgQ2FwYWJpbGl0aWVzIEluZm8gKi8KKyAgICAgICAgb2Zmc2V0ID0gemZNbUFkZEhUQ2FwYWJpbGl0eShkZXYsIGJ1Ziwgb2Zmc2V0KTsKKworICAgICAgICAvKiBFeHRlbmRlZCBIVCBDYXBhYmlsaXRpZXMgSW5mbyAqLworICAgICAgICBvZmZzZXQgPSB6Zk1tQWRkRXh0ZW5kZWRIVENhcGFiaWxpdHkoZGV2LCBidWYsIG9mZnNldCk7CisgICAgfQorCisgICAgaWYgKCB3ZC0+c3RhLmlic3NBZGRpdGlvbmFsSUVTaXplICkKKyAgICAgICAgb2Zmc2V0ID0gemZTdGFBZGRJYnNzQWRkaXRpb25hbElFKGRldiwgYnVmLCBvZmZzZXQpOworCisgICAgLyogMTIxMiA6IHdyaXRlIHRvIGJlYWNvbiBmaWZvICovCisgICAgLyogMTIyMSA6IHdyaXRlIHRvIHNoYXJlIG1lbW9yeSAqLworICAgIHpmSHBTZW5kQmVhY29uKGRldiwgYnVmLCBvZmZzZXQpOworCisgICAgLyogRnJlZSBiZWFjb24gYnVmZmVyICovCisgICAgLy96ZndCdWZGcmVlKGRldiwgYnVmLCAwKTsKK30KKwordm9pZCB6ZlN0YVNpZ25hbFN0YXRpc3RpYyh6ZGV2X3QqIGRldiwgdThfdCBTaWduYWxTdHJlbmd0aCwgdThfdCBTaWduYWxRdWFsaXR5KSAvL0NXWWFuZygrKQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIC8qIEFkZCBZb3VyIENvZGUgdG8gRG8gV29ya3MgTGlrZSBNb3ZpbmcgQXZlcmFnZSBIZXJlICovCisgICAgd2QtPlNpZ25hbFN0cmVuZ3RoID0gKHdkLT5TaWduYWxTdHJlbmd0aCAqIDcgKyBTaWduYWxTdHJlbmd0aCAqIDMpLzEwOworICAgIHdkLT5TaWduYWxRdWFsaXR5ID0gKHdkLT5TaWduYWxRdWFsaXR5ICogNyArIFNpZ25hbFF1YWxpdHkgKiAzKS8xMDsKKworfQorCitzdHJ1Y3QgenNCc3NJbmZvKiB6ZlN0YUZpbmRCc3NJbmZvKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1Ziwgc3RydWN0IHpzV2xhblByb2JlUnNwRnJhbWVIZWFkZXIgKnBQcm9iZVJzcEhlYWRlcikKK3sKKyAgICB1OF90ICAgIGk7CisgICAgdThfdCAgICBqOworICAgIHU4X3QgICAgazsKKyAgICB1OF90ICAgIGlzTWF0Y2hlZCwgbGVuZ3RoLCBjaGFubmVsOworICAgIHUxNl90ICAgb2Zmc2V0LCBmcmVxdWVuY3k7CisgICAgc3RydWN0IHpzQnNzSW5mbyogcEJzc0luZm87CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBpZiAoKHBCc3NJbmZvID0gd2QtPnN0YS5ic3NMaXN0LmhlYWQpID09IE5VTEwpCisgICAgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBmb3IoIGk9MDsgaTx3ZC0+c3RhLmJzc0xpc3QuYnNzQ291bnQ7IGkrKyApCisgICAgeworICAgICAgICAvL3ptX2RlYnVnX21zZzIoImNoZWNrIHBCc3NJbmZvID0gIiwgcEJzc0luZm8pOworCisgICAgICAgIC8qIENoZWNrIEJTU0lEICovCisgICAgICAgIGZvciggaj0wOyBqPDY7IGorKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggcEJzc0luZm8tPmJzc2lkW2pdICE9IHBQcm9iZVJzcEhlYWRlci0+YnNzaWRbal0gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKwkJLyogQ2hlY2sgU1NJRCAqLworICAgICAgICBpZiAoaiA9PSA2KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocFByb2JlUnNwSGVhZGVyLT5zc2lkWzFdIDw9IDMyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIGNvbXBhcmUgbGVuZ3RoIGFuZCBzc2lkICovCisgICAgICAgICAgICAgICAgaXNNYXRjaGVkID0gMTsKKwkJCQlpZigocFByb2JlUnNwSGVhZGVyLT5zc2lkWzFdICE9IDApICYmIChwQnNzSW5mby0+c3NpZFsxXSAhPSAwKSkKKwkJCQl7CisgICAgICAgICAgICAgICAgZm9yKCBrPTE7IGs8cFByb2JlUnNwSGVhZGVyLT5zc2lkWzFdICsgMTsgaysrICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICggcEJzc0luZm8tPnNzaWRba10gIT0gcFByb2JlUnNwSGVhZGVyLT5zc2lkW2tdICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaXNNYXRjaGVkID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlzTWF0Y2hlZCA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpc01hdGNoZWQgPSAwOworICAgICAgICB9CisKKyAgICAgICAgLyogQ2hlY2sgY2hhbm5lbCAqLworICAgICAgICAvKiBBZGQgY2hlY2sgY2hhbm5lbCB0byBzb2x2ZSB0aGUgYnVnICMzMTIyMiAqLworICAgICAgICBpZiAoaXNNYXRjaGVkKSB7CisgICAgICAgICAgICBpZiAoKG9mZnNldCA9IHpmRmluZEVsZW1lbnQoZGV2LCBidWYsIFpNX1dMQU5fRUlEX0RTKSkgIT0gMHhmZmZmKSB7CisgICAgICAgICAgICAgICAgaWYgKChsZW5ndGggPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMSkpID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgY2hhbm5lbCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsyKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHpmSHBJc0FsbG93ZWRDaGFubmVsKGRldiwgemZDaE51bVRvRnJlcShkZXYsIGNoYW5uZWwsIDApKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmcmVxdWVuY3kgPSAwOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgZnJlcXVlbmN5ID0gemZDaE51bVRvRnJlcShkZXYsIGNoYW5uZWwsIDApOzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGZyZXF1ZW5jeSA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmcmVxdWVuY3kgPSB3ZC0+c3RhLmN1cnJlbnRGcmVxdWVuY3k7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChmcmVxdWVuY3kgIT0gMCkgeworICAgICAgICAgICAgICAgIGlmICggKChmcmVxdWVuY3kgPiAzMDAwKSAmJiAocEJzc0luZm8tPmZyZXF1ZW5jeSA+IDMwMDApKQorICAgICAgICAgICAgICAgICAgICAgfHwgKChmcmVxdWVuY3kgPCAzMDAwKSAmJiAocEJzc0luZm8tPmZyZXF1ZW5jeSA8IDMwMDApKSApIHsKKyAgICAgICAgICAgICAgICAgICAgLyogcmVkdW5kYW50ICovCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHBCc3NJbmZvID0gcEJzc0luZm8tPm5leHQ7CisgICAgfQorCisgICAgaWYgKCBpID09IHdkLT5zdGEuYnNzTGlzdC5ic3NDb3VudCApCisgICAgeworICAgICAgICBwQnNzSW5mbyA9IE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuIHBCc3NJbmZvOworfQorCit1OF90IHpmU3RhSW5pdEJzc0luZm8oemRldl90KiBkZXYsIHpidWZfdCogYnVmLAorICAgICAgICBzdHJ1Y3QgenNXbGFuUHJvYmVSc3BGcmFtZUhlYWRlciAqcFByb2JlUnNwSGVhZGVyLAorICAgICAgICBzdHJ1Y3QgenNCc3NJbmZvKiBwQnNzSW5mbywgc3RydWN0IHpzQWRkaXRpb25JbmZvKiBBZGRJbmZvLCB1OF90IHR5cGUpCit7CisgICAgdThfdCAgICBsZW5ndGgsIGNoYW5uZWwsIGlzNUc7CisgICAgdTE2X3QgICBpLCBvZmZzZXQ7CisgICAgdThfdCAgICBhcFFvc0luZm87CisgICAgdTE2X3QgICAgZWFjaElFbGVuZ3RoID0gMDsKKyAgICB1MTZfdCAgIGFjY3VtdWxhdGVMZW4gPSAwOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgaWYgKCh0eXBlID09IDEpICYmICgocEJzc0luZm8tPmZsYWcgJiBaTV9CU1NfSU5GT19WQUxJRF9CSVQpICE9IDApKQorICAgIHsKKyAgICAgICAgZ290byB6bFVwZGF0ZVJzc2k7CisgICAgfQorCisgICAgLyogZ2V0IFNTSUQgKi8KKyAgICBpZiAoIChvZmZzZXQgPSB6ZkZpbmRFbGVtZW50KGRldiwgYnVmLCBaTV9XTEFOX0VJRF9TU0lEKSkgPT0gMHhmZmZmICkKKyAgICB7CisgICAgICAgIHptX2RlYnVnX21zZzAoIkVJRChTU0lEKSBub3QgZm91bmQiKTsKKyAgICAgICAgZ290byB6bEVycm9yOworICAgIH0KKworICAgIGxlbmd0aCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxKTsKKworCXsKKwkJdThfdCBTaG93X0ZsYWcgPSAwOworCQl6ZndHZXRTaG93WmVyb0xlbmd0aFNTSUQoZGV2LCAmU2hvd19GbGFnKTsKKworCQlpZihTaG93X0ZsYWcpCisJCXsKKwkJCWlmIChsZW5ndGggPiBaTV9NQVhfU1NJRF9MRU5HVEggKQorCQkJeworCQkJCXptX2RlYnVnX21zZzAoIkVJRChTU0lEKSBpcyBpbnZhbGlkIik7CisJCQkJZ290byB6bEVycm9yOworCQkJfQorCQl9CisJCWVsc2UKKwkJeworICAgIGlmICggbGVuZ3RoID09IDAgfHwgbGVuZ3RoID4gWk1fTUFYX1NTSURfTEVOR1RIICkKKyAgICB7CisgICAgICAgIHptX2RlYnVnX21zZzAoIkVJRChTU0lEKSBpcyBpbnZhbGlkIik7CisgICAgICAgIGdvdG8gemxFcnJvcjsKKyAgICB9CisKKwkJfQorCX0KKyAgICB6ZkNvcHlGcm9tUnhCdWZmZXIoZGV2LCBidWYsIHBCc3NJbmZvLT5zc2lkLCBvZmZzZXQsIGxlbmd0aCsyKTsKKworICAgIC8qIGdldCBEUyBwYXJhbWV0ZXIgKi8KKyAgICBpZiAoIChvZmZzZXQgPSB6ZkZpbmRFbGVtZW50KGRldiwgYnVmLCBaTV9XTEFOX0VJRF9EUykpICE9IDB4ZmZmZiApCisgICAgeworICAgICAgICBsZW5ndGggPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMSk7CisgICAgICAgIGlmICggbGVuZ3RoICE9IDEgKQorICAgICAgICB7CisgICAgICAgICAgICB6bV9tc2cwX21tKFpNX0xWXzAsICJBYm5vcm1hbCBEUyBQYXJhbSBTZXQgSUUiKTsKKyAgICAgICAgICAgIGdvdG8gemxFcnJvcjsKKyAgICAgICAgfQorICAgICAgICBjaGFubmVsID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzIpOworCisgICAgICAgIGlmICh6ZkhwSXNBbGxvd2VkQ2hhbm5lbChkZXYsIHpmQ2hOdW1Ub0ZyZXEoZGV2LCBjaGFubmVsLCAwKSkgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byB6bEVycm9yMjsKKyAgICAgICAgfQorCisgICAgICAgIHBCc3NJbmZvLT5mcmVxdWVuY3kgPSB6ZkNoTnVtVG9GcmVxKGRldiwgY2hhbm5lbCwgMCk7IC8vIGF1dG8gY2hlY2sKKyAgICAgICAgcEJzc0luZm8tPmNoYW5uZWwgPSBjaGFubmVsOworCisKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogRFMgcGFyYW1ldGVyIG5vdCBmb3VuZCAqLworICAgICAgICBwQnNzSW5mby0+ZnJlcXVlbmN5ID0gd2QtPnN0YS5jdXJyZW50RnJlcXVlbmN5OworICAgICAgICBwQnNzSW5mby0+Y2hhbm5lbCA9IHpmQ2hGcmVxVG9OdW0od2QtPnN0YS5jdXJyZW50RnJlcXVlbmN5LCAmaXM1Ryk7CisgICAgfQorCisgICAgLyogaW5pdGlhbGl6ZSBzZWN1cml0eSB0eXBlICovCisgICAgcEJzc0luZm8tPnNlY3VyaXR5VHlwZSA9IFpNX1NFQ1VSSVRZX1RZUEVfTk9ORTsKKworICAgIC8qIGdldCBtYWNhZGRyICovCisgICAgZm9yKCBpPTA7IGk8NjsgaSsrICkKKyAgICB7CisgICAgICAgIHBCc3NJbmZvLT5tYWNhZGRyW2ldID0gcFByb2JlUnNwSGVhZGVyLT5zYVtpXTsKKyAgICB9CisKKyAgICAvKiBnZXQgYnNzaWQgKi8KKyAgICBmb3IoIGk9MDsgaTw2OyBpKysgKQorICAgIHsKKyAgICAgICAgcEJzc0luZm8tPmJzc2lkW2ldID0gcFByb2JlUnNwSGVhZGVyLT5ic3NpZFtpXTsKKyAgICB9CisKKyAgICAvKiBnZXQgdGltZXN0YW1wICovCisgICAgZm9yKCBpPTA7IGk8ODsgaSsrICkKKyAgICB7CisgICAgICAgIHBCc3NJbmZvLT50aW1lU3RhbXBbaV0gPSBwUHJvYmVSc3BIZWFkZXItPnRpbWVTdGFtcFtpXTsKKyAgICB9CisKKyAgICAvKiBnZXQgYmVhY29uIGludGVydmFsICovCisgICAgcEJzc0luZm8tPmJlYWNvbkludGVydmFsWzBdID0gcFByb2JlUnNwSGVhZGVyLT5iZWFjb25JbnRlcnZhbFswXTsKKyAgICBwQnNzSW5mby0+YmVhY29uSW50ZXJ2YWxbMV0gPSBwUHJvYmVSc3BIZWFkZXItPmJlYWNvbkludGVydmFsWzFdOworCisgICAgLyogZ2V0IGNhcGFiaWxpdHkgKi8KKyAgICBwQnNzSW5mby0+Y2FwYWJpbGl0eVswXSA9IHBQcm9iZVJzcEhlYWRlci0+Y2FwYWJpbGl0eVswXTsKKyAgICBwQnNzSW5mby0+Y2FwYWJpbGl0eVsxXSA9IHBQcm9iZVJzcEhlYWRlci0+Y2FwYWJpbGl0eVsxXTsKKworICAgIC8qIENvcHkgZnJhbWUgYm9keSAqLworICAgIG9mZnNldCA9IDM2OyAgICAgICAgICAgIC8vIENvcHkgZnJvbSB0aGUgc3RhcnQgb2YgdmFyaWFibGUgSUUKKyAgICBwQnNzSW5mby0+ZnJhbWVCb2R5c2l6ZSA9IHpmd0J1ZkdldFNpemUoZGV2LCBidWYpLW9mZnNldDsKKyAgICBpZiAocEJzc0luZm8tPmZyYW1lQm9keXNpemUgPiAoWk1fTUFYX1BST0JFX0ZSQU1FX0JPRFlfU0laRS0xKSkKKyAgICB7CisgICAgICAgIHBCc3NJbmZvLT5mcmFtZUJvZHlzaXplID0gWk1fTUFYX1BST0JFX0ZSQU1FX0JPRFlfU0laRS0xOworICAgIH0KKyAgICBhY2N1bXVsYXRlTGVuID0gMDsKKyAgICBkbworICAgIHsKKyAgICAgICAgZWFjaElFbGVuZ3RoID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0ICsgYWNjdW11bGF0ZUxlbisxKSArIDI7ICAvL0xlbisoRUlEK0RhdGEpCisKKyAgICAgICAgaWYgKCAoZWFjaElFbGVuZ3RoID49IDIpCisgICAgICAgICAgICAgJiYgKChhY2N1bXVsYXRlTGVuICsgZWFjaElFbGVuZ3RoKSA8PSBwQnNzSW5mby0+ZnJhbWVCb2R5c2l6ZSkgKQorICAgICAgICB7CisgICAgICAgICAgICB6ZkNvcHlGcm9tUnhCdWZmZXIoZGV2LCBidWYsIHBCc3NJbmZvLT5mcmFtZUJvZHkrYWNjdW11bGF0ZUxlbiwgb2Zmc2V0K2FjY3VtdWxhdGVMZW4sIGVhY2hJRWxlbmd0aCk7CisgICAgICAgICAgICBhY2N1bXVsYXRlTGVuKz0odTE2X3QpZWFjaElFbGVuZ3RoOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgem1fbXNnMF9tbShaTV9MVl8xLCAicHJvYmVyc3AgZnJhbWVCb2R5c2l6ZSBhYm5vcm1hbCIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgd2hpbGUoYWNjdW11bGF0ZUxlbiA8IHBCc3NJbmZvLT5mcmFtZUJvZHlzaXplKTsKKyAgICBwQnNzSW5mby0+ZnJhbWVCb2R5c2l6ZSA9IGFjY3VtdWxhdGVMZW47CisKKyAgICAvKiBnZXQgc3VwcG9ydGVkIHJhdGVzICovCisgICAgaWYgKCAob2Zmc2V0ID0gemZGaW5kRWxlbWVudChkZXYsIGJ1ZiwgWk1fV0xBTl9FSURfU1VQUE9SVF9SQVRFKSkgPT0gMHhmZmZmICkKKyAgICB7CisgICAgICAgIHptX2RlYnVnX21zZzAoIkVJRChzdXBwb3J0ZWQgcmF0ZXMpIG5vdCBmb3VuZCIpOworICAgICAgICBnb3RvIHpsRXJyb3I7CisgICAgfQorCisgICAgbGVuZ3RoID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzEpOworICAgIGlmICggbGVuZ3RoID09IDAgfHwgbGVuZ3RoID4gWk1fTUFYX1NVUFBfUkFURVNfSUVfU0laRSkKKyAgICB7CisgICAgICAgIHptX21zZzBfbW0oWk1fTFZfMCwgIlN1cHBvcnRlZCByYXRlcyBJRSBsZW5ndGggYWJub3JtYWwiKTsKKyAgICAgICAgZ290byB6bEVycm9yOworICAgIH0KKyAgICB6ZkNvcHlGcm9tUnhCdWZmZXIoZGV2LCBidWYsIHBCc3NJbmZvLT5zdXBwb3J0ZWRSYXRlcywgb2Zmc2V0LCBsZW5ndGgrMik7CisKKworCisgICAgLyogZ2V0IENvdW50cnkgaW5mb3JtYXRpb24gKi8KKyAgICBpZiAoIChvZmZzZXQgPSB6ZkZpbmRFbGVtZW50KGRldiwgYnVmLCBaTV9XTEFOX0VJRF9DT1VOVFJZKSkgIT0gMHhmZmZmICkKKyAgICB7CisgICAgICAgIGxlbmd0aCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxKTsKKyAgICAgICAgaWYgKGxlbmd0aCA+IFpNX01BWF9DT1VOVFJZX0lORk9fU0laRSkKKyAgICAgICAgeworICAgICAgICAgICAgbGVuZ3RoID0gWk1fTUFYX0NPVU5UUllfSU5GT19TSVpFOworICAgICAgICB9CisgICAgICAgIHpmQ29weUZyb21SeEJ1ZmZlcihkZXYsIGJ1ZiwgcEJzc0luZm8tPmNvdW50cnlJbmZvLCBvZmZzZXQsIGxlbmd0aCsyKTsKKyAgICAgICAgLyogY2hlY2sgODAyLjExZCBzdXBwb3J0IGRhdGEgKi8KKyAgICAgICAgaWYgKHdkLT5zdGEuYjgwMl8xMUQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHpmSHBHZXRSZWd1bGF0aW9uVGFibGVmcm9tSVNPKGRldiwgKHU4X3QgKikmcEJzc0luZm8tPmNvdW50cnlJbmZvLCAzKTsKKyAgICAgICAgICAgIC8qIG9ubHkgc2V0IHJlZ3VsYXRvcnkgb25lIHRpbWUgKi8KKyAgICAgICAgICAgIHdkLT5zdGEuYjgwMl8xMUQgPSAwOworICAgICAgICB9CisgICAgfQorCisgICAgLyogZ2V0IEVSUCBpbmZvcm1hdGlvbiAqLworICAgIGlmICggKG9mZnNldCA9IHpmRmluZEVsZW1lbnQoZGV2LCBidWYsIFpNX1dMQU5fRUlEX0VSUCkpICE9IDB4ZmZmZiApCisgICAgeworICAgICAgICBwQnNzSW5mby0+ZXJwID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzIpOworICAgIH0KKworICAgIC8qIGdldCBleHRlbmRlZCBzdXBwb3J0ZWQgcmF0ZXMgKi8KKyAgICBpZiAoIChvZmZzZXQgPSB6ZkZpbmRFbGVtZW50KGRldiwgYnVmLCBaTV9XTEFOX0VJRF9FWFRFTkRFRF9SQVRFKSkgIT0gMHhmZmZmICkKKyAgICB7CisgICAgICAgIGxlbmd0aCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxKTsKKyAgICAgICAgaWYgKGxlbmd0aCA+IFpNX01BWF9TVVBQX1JBVEVTX0lFX1NJWkUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHptX21zZzBfbW0oWk1fTFZfMCwgIkV4dGVuZGVkIHJhdGVzIElFIGxlbmd0aCBhYm5vcm1hbCIpOworICAgICAgICAgICAgZ290byB6bEVycm9yOworICAgICAgICB9CisgICAgICAgIHpmQ29weUZyb21SeEJ1ZmZlcihkZXYsIGJ1ZiwgcEJzc0luZm8tPmV4dFN1cHBvcnRlZFJhdGVzLCBvZmZzZXQsIGxlbmd0aCsyKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcEJzc0luZm8tPmV4dFN1cHBvcnRlZFJhdGVzWzBdID0gMDsKKyAgICAgICAgcEJzc0luZm8tPmV4dFN1cHBvcnRlZFJhdGVzWzFdID0gMDsKKyAgICB9CisKKyAgICAvKiBnZXQgV1BBIElFICovCisgICAgaWYgKCAob2Zmc2V0ID0gemZGaW5kRWxlbWVudChkZXYsIGJ1ZiwgWk1fV0xBTl9FSURfV1BBX0lFKSkgIT0gMHhmZmZmICkKKyAgICB7CisgICAgICAgIGxlbmd0aCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxKTsKKyAgICAgICAgaWYgKGxlbmd0aCA+IFpNX01BWF9JRV9TSVpFKQorICAgICAgICB7CisgICAgICAgICAgICBsZW5ndGggPSBaTV9NQVhfSUVfU0laRTsKKyAgICAgICAgfQorICAgICAgICB6ZkNvcHlGcm9tUnhCdWZmZXIoZGV2LCBidWYsIHBCc3NJbmZvLT53cGFJZSwgb2Zmc2V0LCBsZW5ndGgrMik7CisgICAgICAgIHBCc3NJbmZvLT5zZWN1cml0eVR5cGUgPSBaTV9TRUNVUklUWV9UWVBFX1dQQTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcEJzc0luZm8tPndwYUllWzFdID0gMDsKKyAgICB9CisKKyAgICAvKiBnZXQgV1BTIElFICovCisgICAgaWYgKChvZmZzZXQgPSB6ZkZpbmRXaWZpRWxlbWVudChkZXYsIGJ1ZiwgNCwgMHhmZikpICE9IDB4ZmZmZikKKyAgICB7CisgICAgICAgIGxlbmd0aCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxKTsKKyAgICAgICAgaWYgKGxlbmd0aCA+IFpNX01BWF9XUFNfSUVfU0laRSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGxlbmd0aCA9IFpNX01BWF9XUFNfSUVfU0laRTsKKyAgICAgICAgfQorICAgICAgICB6ZkNvcHlGcm9tUnhCdWZmZXIoZGV2LCBidWYsIHBCc3NJbmZvLT53c2NJZSwgb2Zmc2V0LCBsZW5ndGgrMik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHBCc3NJbmZvLT53c2NJZVsxXSA9IDA7CisgICAgfQorCisgICAgLyogZ2V0IFN1cGVyRyBJRSAqLworICAgIGlmICgob2Zmc2V0ID0gemZGaW5kU3VwZXJHRWxlbWVudChkZXYsIGJ1ZiwgWk1fV0xBTl9FSURfVkVORE9SX1BSSVZBVEUpKSAhPSAweGZmZmYpCisgICAgeworICAgICAgICBwQnNzSW5mby0+YXBDYXAgfD0gWk1fU3VwZXJHX0FQOworICAgIH0KKworICAgIC8qIGdldCBYUiBJRSAqLworICAgIGlmICgob2Zmc2V0ID0gemZGaW5kWFJFbGVtZW50KGRldiwgYnVmLCBaTV9XTEFOX0VJRF9WRU5ET1JfUFJJVkFURSkpICE9IDB4ZmZmZikKKyAgICB7CisgICAgICAgIHBCc3NJbmZvLT5hcENhcCB8PSBaTV9YUl9BUDsKKyAgICB9CisKKyAgICAvKiBnZXQgUlNOIElFICovCisgICAgaWYgKCAob2Zmc2V0ID0gemZGaW5kRWxlbWVudChkZXYsIGJ1ZiwgWk1fV0xBTl9FSURfUlNOX0lFKSkgIT0gMHhmZmZmICkKKyAgICB7CisgICAgICAgIGxlbmd0aCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxKTsKKyAgICAgICAgaWYgKGxlbmd0aCA+IFpNX01BWF9JRV9TSVpFKQorICAgICAgICB7CisgICAgICAgICAgICBsZW5ndGggPSBaTV9NQVhfSUVfU0laRTsKKyAgICAgICAgfQorICAgICAgICB6ZkNvcHlGcm9tUnhCdWZmZXIoZGV2LCBidWYsIHBCc3NJbmZvLT5yc25JZSwgb2Zmc2V0LCBsZW5ndGgrMik7CisgICAgICAgIHBCc3NJbmZvLT5zZWN1cml0eVR5cGUgPSBaTV9TRUNVUklUWV9UWVBFX1dQQTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcEJzc0luZm8tPnJzbkllWzFdID0gMDsKKyAgICB9CisjaWZkZWYgWk1fRU5BQkxFX0NFTkMKKyAgICAvKiBnZXQgQ0VOQyBJRSAqLworICAgIGlmICggKG9mZnNldCA9IHpmRmluZEVsZW1lbnQoZGV2LCBidWYsIFpNX1dMQU5fRUlEX0NFTkNfSUUpKSAhPSAweGZmZmYgKQorICAgIHsKKyAgICAgICAgbGVuZ3RoID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzEpOworICAgICAgICBpZiAobGVuZ3RoID4gWk1fTUFYX0lFX1NJWkUgKQorICAgICAgICB7CisgICAgICAgICAgICBsZW5ndGggPSBaTV9NQVhfSUVfU0laRTsKKyAgICAgICAgfQorICAgICAgICB6ZkNvcHlGcm9tUnhCdWZmZXIoZGV2LCBidWYsIHBCc3NJbmZvLT5jZW5jSWUsIG9mZnNldCwgbGVuZ3RoKzIpOworICAgICAgICBwQnNzSW5mby0+c2VjdXJpdHlUeXBlID0gWk1fU0VDVVJJVFlfVFlQRV9DRU5DOworICAgICAgICBwQnNzSW5mby0+Y2FwYWJpbGl0eVswXSAmPSAweGZmZWY7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHBCc3NJbmZvLT5jZW5jSWVbMV0gPSAwOworICAgIH0KKyNlbmRpZiAvL1pNX0VOQUJMRV9DRU5DCisgICAgLyogZ2V0IFdNRSBQYXJhbWV0ZXIgSUUsIHByb2JlIHJzcCBtYXkgY29udGFpbiBXTUUgcGFyYW1ldGVyIGVsZW1lbnQgKi8KKyAgICAvL2lmICggd2QtPmJRb1NFbmFibGUgKQorICAgIHsKKyAgICAgICAgaWYgKChvZmZzZXQgPSB6ZkZpbmRXaWZpRWxlbWVudChkZXYsIGJ1ZiwgMiwgMSkpICE9IDB4ZmZmZikKKyAgICAgICAgeworICAgICAgICAgICAgYXBRb3NJbmZvID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzgpICYgMHg4MDsKKyAgICAgICAgICAgIHBCc3NJbmZvLT53bWVTdXBwb3J0ID0gMSB8IGFwUW9zSW5mbzsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICgob2Zmc2V0ID0gemZGaW5kV2lmaUVsZW1lbnQoZGV2LCBidWYsIDIsIDApKSAhPSAweGZmZmYpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwUW9zSW5mbyA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCs4KSAmIDB4ODA7CisgICAgICAgICAgICBwQnNzSW5mby0+d21lU3VwcG9ydCA9IDEgIHwgYXBRb3NJbmZvOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcEJzc0luZm8tPndtZVN1cHBvcnQgPSAwOworICAgICAgICB9CisgICAgfQorICAgIC8vQ1dZYW5nKCspCisgICAgaWYgKChvZmZzZXQgPSB6ZkZpbmRFbGVtZW50KGRldiwgYnVmLCBaTV9XTEFOX0VJRF9IVF9DQVBBQklMSVRZKSkgIT0gMHhmZmZmKQorICAgIHsKKyAgICAgICAgLyogMTFuIEFQICovCisgICAgICAgIHBCc3NJbmZvLT5FbmFibGVIVCA9IDE7CisgICAgICAgIGlmICh6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMSkgJiAweDAyKQorICAgICAgICB7CisgICAgICAgICAgICBwQnNzSW5mby0+ZW5hYmxlSFQ0MCA9IDE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwQnNzSW5mby0+ZW5hYmxlSFQ0MCA9IDA7CisgICAgICAgIH0KKworICAgICAgICBpZiAoem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzEpICYgMHg0MCkKKyAgICAgICAgeworICAgICAgICAgICAgcEJzc0luZm8tPlNHNDAgPSAxOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcEJzc0luZm8tPlNHNDAgPSAwOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKChvZmZzZXQgPSB6ZkZpbmRFbGVtZW50KGRldiwgYnVmLCBaTV9XTEFOX1BSRU4yX0VJRF9IVENBUEFCSUxJVFkpKSAhPSAweGZmZmYpCisgICAgeworICAgICAgICAvKiAxMW4gQVAgKi8KKyAgICAgICAgcEJzc0luZm8tPkVuYWJsZUhUID0gMTsKKyAgICAgICAgcEJzc0luZm8tPmFwQ2FwIHw9IFpNX0FsbDExTl9BUDsKKyAgICAgICAgaWYgKHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsyKSAmIDB4MDIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBCc3NJbmZvLT5lbmFibGVIVDQwID0gMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHBCc3NJbmZvLT5lbmFibGVIVDQwID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMikgJiAweDQwKQorICAgICAgICB7CisgICAgICAgICAgICBwQnNzSW5mby0+U0c0MCA9IDE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwQnNzSW5mby0+U0c0MCA9IDA7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcEJzc0luZm8tPkVuYWJsZUhUID0gMDsKKyAgICB9CisgICAgLyogSFQgaW5mb3JtYXRpb24gKi8KKyAgICBpZiAoKG9mZnNldCA9IHpmRmluZEVsZW1lbnQoZGV2LCBidWYsIFpNX1dMQU5fRUlEX0VYVEVOREVEX0hUX0NBUEFCSUxJVFkpKSAhPSAweGZmZmYpCisgICAgeworICAgICAgICAvKiBhdGhlcm9zIHByZSBuICovCisgICAgICAgIHBCc3NJbmZvLT5leHRDaE9mZnNldCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsyKSAmIDB4MDM7CisgICAgfQorICAgIGVsc2UgaWYgKChvZmZzZXQgPSB6ZkZpbmRFbGVtZW50KGRldiwgYnVmLCBaTV9XTEFOX1BSRU4yX0VJRF9IVElORk9STUFUSU9OKSkgIT0gMHhmZmZmKQorICAgIHsKKyAgICAgICAgLyogcHJlIG4gMi4wIHN0YW5kYXJkICovCisgICAgICAgIHBCc3NJbmZvLT5leHRDaE9mZnNldCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCszKSAmIDB4MDM7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHBCc3NJbmZvLT5leHRDaE9mZnNldCA9IDA7CisgICAgfQorCisgICAgaWYgKCAocEJzc0luZm8tPmVuYWJsZUhUNDAgPT0gMSkKKyAgICAgICAgICYmICgocEJzc0luZm8tPmV4dENoT2Zmc2V0ICE9IDEpICYmIChwQnNzSW5mby0+ZXh0Q2hPZmZzZXQgIT0gMykpICkKKyAgICB7CisgICAgICAgIHBCc3NJbmZvLT5lbmFibGVIVDQwID0gMDsKKyAgICB9CisKKyAgICBpZiAocEJzc0luZm8tPmVuYWJsZUhUNDAgPT0gMSkKKyAgICB7CisgICAgICAgIGlmICh6ZkhwSXNBbGxvd2VkQ2hhbm5lbChkZXYsIHBCc3NJbmZvLT5mcmVxdWVuY3krKChwQnNzSW5mby0+ZXh0Q2hPZmZzZXQ9PTEpPzIwOi0yMCkpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIGlmIGV4dGVuc2lvbiBjaGFubmVsIGlzIG5vdCBhbiBhbGxvd2VkIGNoYW5uZWwsIHRyZWF0IEFQIGFzIG5vbi1IVCBtb2RlICovCisgICAgICAgICAgICBwQnNzSW5mby0+RW5hYmxlSFQgPSAwOworICAgICAgICAgICAgcEJzc0luZm8tPmVuYWJsZUhUNDAgPSAwOworICAgICAgICAgICAgcEJzc0luZm8tPmV4dENoT2Zmc2V0ID0gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGdldCBBVEggRXh0ZW5kZWQgQ2FwYWJpbGl0eSAqLworICAgIGlmICggKChvZmZzZXQgPSB6ZkZpbmRFbGVtZW50KGRldiwgYnVmLCBaTV9XTEFOX0VJRF9FWFRFTkRFRF9IVF9DQVBBQklMSVRZKSkgIT0gMHhmZmZmKSYmCisgICAgICAgICgob2Zmc2V0ID0gemZGaW5kQnJkY21NcnZsUmxua0V4dENhcChkZXYsIGJ1ZikpID09IDB4ZmZmZikpCisKKyAgICB7CisgICAgICAgIHBCc3NJbmZvLT5hdGhPd2xBcCA9IDE7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHBCc3NJbmZvLT5hdGhPd2xBcCA9IDA7CisgICAgfQorCisgICAgLyogZ2V0IEJyb2FkY29tIEV4dGVuZGVkIENhcGFiaWxpdHkgKi8KKyAgICBpZiAoIChwQnNzSW5mby0+RW5hYmxlSFQgPT0gMSkgLy8oKG9mZnNldCA9IHpmRmluZEVsZW1lbnQoZGV2LCBidWYsIFpNX1dMQU5fRUlEX0VYVEVOREVEX0hUX0NBUEFCSUxJVFkpKSAhPSAweGZmZmYpCisgICAgICAgICAmJiAoKG9mZnNldCA9IHpmRmluZEJyb2FkY29tRXh0Q2FwKGRldiwgYnVmKSkgIT0gMHhmZmZmKSApCisgICAgeworICAgICAgICBwQnNzSW5mby0+YnJvYWRjb21IVEFwID0gMTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcEJzc0luZm8tPmJyb2FkY29tSFRBcCA9IDA7CisgICAgfQorCisgICAgLyogZ2V0IE1hcnZlbCBFeHRlbmRlZCBDYXBhYmlsaXR5ICovCisgICAgaWYgKChvZmZzZXQgPSB6ZkZpbmRNYXJ2ZWxFeHRDYXAoZGV2LCBidWYpKSAhPSAweGZmZmYpCisgICAgeworICAgICAgICBwQnNzSW5mby0+bWFydmVsQXAgPSAxOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBwQnNzSW5mby0+bWFydmVsQXAgPSAwOworICAgIH0KKworICAgIC8qIGdldCBBVElNIHdpbmRvdyAqLworICAgIGlmICggKG9mZnNldCA9IHpmRmluZEVsZW1lbnQoZGV2LCBidWYsIFpNX1dMQU5fRUlEX0lCU1MpKSAhPSAweGZmZmYgKQorICAgIHsKKyAgICAgICAgcEJzc0luZm8tPmF0aW1XaW5kb3cgPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLG9mZnNldCsyKTsKKyAgICB9CisKKyAgICAvKiBGaXQgZm9yIHN1cHBvcnQgbW9kZSAqLworICAgIGlmIChwQnNzSW5mby0+ZnJlcXVlbmN5ID4gMzAwMCkgeworICAgICAgICBpZiAod2QtPnN1cHBvcnRNb2RlICYgWk1fV0lSRUxFU1NfTU9ERV81X04pIHsKKyNpZiAwCisgICAgICAgICAgICBpZiAod2QtPnN1cHBvcnRNb2RlICYgWk1fV0lSRUxFU1NfTU9ERV81XzU0KSB7CisgICAgICAgICAgICAgICAgLyogc3VwcG9ydCBtb2RlOiBhLCBuICovCisgICAgICAgICAgICAgICAgLyogZG8gbm90aGluZyAqLworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBzdXBwb3J0IG1vZGU6IG4gKi8KKyAgICAgICAgICAgICAgICAvKiByZWplY3Qgbm9uLW4gYnNzIGluZm8gKi8KKyAgICAgICAgICAgICAgICBpZiAoIXBCc3NJbmZvLT5FbmFibGVIVCkgeworICAgICAgICAgICAgICAgICAgICBnb3RvIHpsRXJyb3IyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKHdkLT5zdXBwb3J0TW9kZSAmIFpNX1dJUkVMRVNTX01PREVfNV81NCkgeworICAgICAgICAgICAgICAgIC8qIHN1cHBvcnQgbW9kZTogYSAqLworICAgICAgICAgICAgICAgIC8qIGRlbGV0ZSBuIG1vZGUgaW5mb3JtYXRpb24gKi8KKyAgICAgICAgICAgICAgICBwQnNzSW5mby0+RW5hYmxlSFQgPSAwOworICAgICAgICAgICAgICAgIHBCc3NJbmZvLT5lbmFibGVIVDQwID0gMDsKKyAgICAgICAgICAgICAgICBwQnNzSW5mby0+YXBDYXAgJj0gKH5aTV9BbGwxMU5fQVApOworICAgICAgICAgICAgICAgIHBCc3NJbmZvLT5leHRDaE9mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgcEJzc0luZm8tPmZyYW1lQm9keXNpemUgPSB6ZlJlbW92ZUVsZW1lbnQoZGV2LCBwQnNzSW5mby0+ZnJhbWVCb2R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCc3NJbmZvLT5mcmFtZUJvZHlzaXplLCBaTV9XTEFOX0VJRF9IVF9DQVBBQklMSVRZKTsKKyAgICAgICAgICAgICAgICBwQnNzSW5mby0+ZnJhbWVCb2R5c2l6ZSA9IHpmUmVtb3ZlRWxlbWVudChkZXYsIHBCc3NJbmZvLT5mcmFtZUJvZHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJzc0luZm8tPmZyYW1lQm9keXNpemUsIFpNX1dMQU5fUFJFTjJfRUlEX0hUQ0FQQUJJTElUWSk7CisgICAgICAgICAgICAgICAgcEJzc0luZm8tPmZyYW1lQm9keXNpemUgPSB6ZlJlbW92ZUVsZW1lbnQoZGV2LCBwQnNzSW5mby0+ZnJhbWVCb2R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCc3NJbmZvLT5mcmFtZUJvZHlzaXplLCBaTV9XTEFOX0VJRF9FWFRFTkRFRF9IVF9DQVBBQklMSVRZKTsKKyAgICAgICAgICAgICAgICBwQnNzSW5mby0+ZnJhbWVCb2R5c2l6ZSA9IHpmUmVtb3ZlRWxlbWVudChkZXYsIHBCc3NJbmZvLT5mcmFtZUJvZHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJzc0luZm8tPmZyYW1lQm9keXNpemUsIFpNX1dMQU5fUFJFTjJfRUlEX0hUSU5GT1JNQVRJT04pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBzdXBwb3J0IG1vZGU6IG5vbmUgKi8KKyAgICAgICAgICAgICAgICBnb3RvIHpsRXJyb3IyOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHdkLT5zdXBwb3J0TW9kZSAmIFpNX1dJUkVMRVNTX01PREVfMjRfTikgeworI2lmIDAKKyAgICAgICAgICAgIGlmICh3ZC0+c3VwcG9ydE1vZGUgJiBaTV9XSVJFTEVTU19NT0RFXzI0XzU0KSB7CisgICAgICAgICAgICAgICAgaWYgKHdkLT5zdXBwb3J0TW9kZSAmIFpNX1dJUkVMRVNTX01PREVfMjRfMTEpIHsKKyAgICAgICAgICAgICAgICAgICAgLyogc3VwcG9ydCBtb2RlOiBiLCBnLCBuICovCisgICAgICAgICAgICAgICAgICAgIC8qIGRvIG5vdGhpbmcgKi8KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvKiBzdXBwb3J0IG1vZGU6IGcsIG4gKi8KKyAgICAgICAgICAgICAgICAgICAgLyogcmVqZWN0IGItb25seSBic3MgaW5mbyAqLworICAgICAgICAgICAgICAgICAgICBpZiAoICghcEJzc0luZm8tPkVuYWJsZUhUKQorICAgICAgICAgICAgICAgICAgICAgICAgICYmIChwQnNzSW5mby0+ZXh0U3VwcG9ydGVkUmF0ZXNbMV0gPT0gMCkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgZ290byB6bEVycm9yMjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKHdkLT5zdXBwb3J0TW9kZSAmIFpNX1dJUkVMRVNTX01PREVfMjRfMTEpIHsKKyAgICAgICAgICAgICAgICAgICAgLyogc3VwcG9ydCBtb2RlOiBiLCBuICovCisgICAgICAgICAgICAgICAgICAgIC8qIDEuIHJlamVjdCBnLW9ubHkgYnNzIGluZm8KKyAgICAgICAgICAgICAgICAgICAgICogMi4gaWYgbm9uIGctb25seSwgZGVsZXRlIGcgbW9kZSBpbmZvcm1hdGlvbgorICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKCAhcEJzc0luZm8tPkVuYWJsZUhUICkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCB6ZklzR09ubHlNb2RlKGRldiwgcEJzc0luZm8tPmZyZXF1ZW5jeSwgcEJzc0luZm8tPnN1cHBvcnRlZFJhdGVzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCB6ZklzR09ubHlNb2RlKGRldiwgcEJzc0luZm8tPmZyZXF1ZW5jeSwgcEJzc0luZm8tPmV4dFN1cHBvcnRlZFJhdGVzKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIHpsRXJyb3IyOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ZkdhdGhlckJNb2RlKGRldiwgcEJzc0luZm8tPnN1cHBvcnRlZFJhdGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJzc0luZm8tPmV4dFN1cHBvcnRlZFJhdGVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQnNzSW5mby0+ZXJwID0gMDsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCc3NJbmZvLT5mcmFtZUJvZHlzaXplID0gemZSZW1vdmVFbGVtZW50KGRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJzc0luZm8tPmZyYW1lQm9keSwgcEJzc0luZm8tPmZyYW1lQm9keXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFpNX1dMQU5fRUlEX0VSUCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJzc0luZm8tPmZyYW1lQm9keXNpemUgPSB6ZlJlbW92ZUVsZW1lbnQoZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQnNzSW5mby0+ZnJhbWVCb2R5LCBwQnNzSW5mby0+ZnJhbWVCb2R5c2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWk1fV0xBTl9FSURfRVhURU5ERURfUkFURSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQnNzSW5mby0+ZnJhbWVCb2R5c2l6ZSA9IHpmVXBkYXRlRWxlbWVudChkZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCc3NJbmZvLT5mcmFtZUJvZHksIHBCc3NJbmZvLT5mcmFtZUJvZHlzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQnNzSW5mby0+c3VwcG9ydGVkUmF0ZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLyogc3VwcG9ydCBtb2RlOiBuICovCisgICAgICAgICAgICAgICAgICAgIC8qIHJlamVjdCBub24tbiBic3MgaW5mbyAqLworICAgICAgICAgICAgICAgICAgICBpZiAoIXBCc3NJbmZvLT5FbmFibGVIVCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZ290byB6bEVycm9yMjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogZGVsZXRlIG4gbW9kZSBpbmZvcm1hdGlvbiAqLworICAgICAgICAgICAgcEJzc0luZm8tPkVuYWJsZUhUID0gMDsKKyAgICAgICAgICAgIHBCc3NJbmZvLT5lbmFibGVIVDQwID0gMDsKKyAgICAgICAgICAgIHBCc3NJbmZvLT5hcENhcCAmPSAoflpNX0FsbDExTl9BUCk7CisgICAgICAgICAgICBwQnNzSW5mby0+ZXh0Q2hPZmZzZXQgPSAwOworICAgICAgICAgICAgcEJzc0luZm8tPmZyYW1lQm9keXNpemUgPSB6ZlJlbW92ZUVsZW1lbnQoZGV2LCBwQnNzSW5mby0+ZnJhbWVCb2R5LAorICAgICAgICAgICAgICAgICAgICAgICAgcEJzc0luZm8tPmZyYW1lQm9keXNpemUsIFpNX1dMQU5fRUlEX0hUX0NBUEFCSUxJVFkpOworICAgICAgICAgICAgcEJzc0luZm8tPmZyYW1lQm9keXNpemUgPSB6ZlJlbW92ZUVsZW1lbnQoZGV2LCBwQnNzSW5mby0+ZnJhbWVCb2R5LAorICAgICAgICAgICAgICAgICAgICAgICAgcEJzc0luZm8tPmZyYW1lQm9keXNpemUsIFpNX1dMQU5fUFJFTjJfRUlEX0hUQ0FQQUJJTElUWSk7CisgICAgICAgICAgICBwQnNzSW5mby0+ZnJhbWVCb2R5c2l6ZSA9IHpmUmVtb3ZlRWxlbWVudChkZXYsIHBCc3NJbmZvLT5mcmFtZUJvZHksCisgICAgICAgICAgICAgICAgICAgICAgICBwQnNzSW5mby0+ZnJhbWVCb2R5c2l6ZSwgWk1fV0xBTl9FSURfRVhURU5ERURfSFRfQ0FQQUJJTElUWSk7CisgICAgICAgICAgICBwQnNzSW5mby0+ZnJhbWVCb2R5c2l6ZSA9IHpmUmVtb3ZlRWxlbWVudChkZXYsIHBCc3NJbmZvLT5mcmFtZUJvZHksCisgICAgICAgICAgICAgICAgICAgICAgICBwQnNzSW5mby0+ZnJhbWVCb2R5c2l6ZSwgWk1fV0xBTl9QUkVOMl9FSURfSFRJTkZPUk1BVElPTik7CisKKyAgICAgICAgICAgIGlmICh3ZC0+c3VwcG9ydE1vZGUgJiBaTV9XSVJFTEVTU19NT0RFXzI0XzU0KSB7CisjaWYgMAorICAgICAgICAgICAgICAgIGlmICh3ZC0+c3VwcG9ydE1vZGUgJiBaTV9XSVJFTEVTU19NT0RFXzI0XzExKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIHN1cHBvcnQgbW9kZTogYiwgZyAqLworICAgICAgICAgICAgICAgICAgICAvKiBkZWxldGUgbiBtb2RlIGluZm9ybWF0aW9uICovCisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLyogc3VwcG9ydCBtb2RlOiBnICovCisgICAgICAgICAgICAgICAgICAgIC8qIGRlbGV0ZSBuIG1vZGUgaW5mb3JtYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgLyogcmVqZWN0IGItb25seSBic3MgaW5mbyAqLworICAgICAgICAgICAgICAgICAgICBpZiAocEJzc0luZm8tPmV4dFN1cHBvcnRlZFJhdGVzWzFdID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIHpsRXJyb3IyOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmICh3ZC0+c3VwcG9ydE1vZGUgJiBaTV9XSVJFTEVTU19NT0RFXzI0XzExKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIHN1cHBvcnQgbW9kZTogYiAqLworICAgICAgICAgICAgICAgICAgICAvKiBkZWxldGUgbiBtb2RlIGluZm9ybWF0aW9uICovCisgICAgICAgICAgICAgICAgICAgIGlmICggemZJc0dPbmx5TW9kZShkZXYsIHBCc3NJbmZvLT5mcmVxdWVuY3ksIHBCc3NJbmZvLT5zdXBwb3J0ZWRSYXRlcykKKyAgICAgICAgICAgICAgICAgICAgICAgICB8fCB6ZklzR09ubHlNb2RlKGRldiwgcEJzc0luZm8tPmZyZXF1ZW5jeSwgcEJzc0luZm8tPmV4dFN1cHBvcnRlZFJhdGVzKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gemxFcnJvcjI7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICB6ZkdhdGhlckJNb2RlKGRldiwgcEJzc0luZm8tPnN1cHBvcnRlZFJhdGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJzc0luZm8tPmV4dFN1cHBvcnRlZFJhdGVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBCc3NJbmZvLT5lcnAgPSAwOworCisgICAgICAgICAgICAgICAgICAgICAgICBwQnNzSW5mby0+ZnJhbWVCb2R5c2l6ZSA9IHpmUmVtb3ZlRWxlbWVudChkZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJzc0luZm8tPmZyYW1lQm9keSwgcEJzc0luZm8tPmZyYW1lQm9keXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWk1fV0xBTl9FSURfRVJQKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBCc3NJbmZvLT5mcmFtZUJvZHlzaXplID0gemZSZW1vdmVFbGVtZW50KGRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQnNzSW5mby0+ZnJhbWVCb2R5LCBwQnNzSW5mby0+ZnJhbWVCb2R5c2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBaTV9XTEFOX0VJRF9FWFRFTkRFRF9SQVRFKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgcEJzc0luZm8tPmZyYW1lQm9keXNpemUgPSB6ZlVwZGF0ZUVsZW1lbnQoZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCc3NJbmZvLT5mcmFtZUJvZHksIHBCc3NJbmZvLT5mcmFtZUJvZHlzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCc3NJbmZvLT5zdXBwb3J0ZWRSYXRlcyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvKiBzdXBwb3J0IG1vZGU6IG5vbmUgKi8KKyAgICAgICAgICAgICAgICAgICAgZ290byB6bEVycm9yMjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwQnNzSW5mby0+ZmxhZyB8PSBaTV9CU1NfSU5GT19WQUxJRF9CSVQ7CisKK3psVXBkYXRlUnNzaToKKyAgICAvKiBVcGRhdGUgVGltZXIgaW5mb3JtYXRpb24gKi8KKyAgICBwQnNzSW5mby0+dGljayA9IHdkLT50aWNrOworCisgICAgLyogVXBkYXRlIEVSUCBpbmZvcm1hdGlvbiAqLworICAgIGlmICggKG9mZnNldCA9IHpmRmluZEVsZW1lbnQoZGV2LCBidWYsIFpNX1dMQU5fRUlEX0VSUCkpICE9IDB4ZmZmZiApCisgICAgeworICAgICAgICBwQnNzSW5mby0+ZXJwID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzIpOworICAgIH0KKworICAgIGlmKCAoczhfdClwQnNzSW5mby0+c2lnbmFsU3RyZW5ndGggPCAoczhfdClBZGRJbmZvLT5UYWlsLkRhdGEuU2lnbmFsU3RyZW5ndGgxICkKKyAgICB7CisgICAgICAgIC8qIFVwZGF0ZSBzaWduYWwgc3RyZW5ndGggKi8KKyAgICAgICAgcEJzc0luZm8tPnNpZ25hbFN0cmVuZ3RoID0gKHU4X3QpQWRkSW5mby0+VGFpbC5EYXRhLlNpZ25hbFN0cmVuZ3RoMTsKKyAgICAgICAgLyogVXBkYXRlIHNpZ25hbCBxdWFsaXR5ICovCisgICAgICAgIHBCc3NJbmZvLT5zaWduYWxRdWFsaXR5ID0gKHU4X3QpKEFkZEluZm8tPlRhaWwuRGF0YS5TaWduYWxTdHJlbmd0aDEgKiAyKTsKKworICAgICAgICAvKiBVcGRhdGUgdGhlIHNvcnRpbmcgdmFsdWUgICovCisgICAgICAgIHBCc3NJbmZvLT5zb3J0VmFsdWUgPSB6ZkNvbXB1dGVCc3NJbmZvV2VpZ2h0VmFsdWUoZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocEJzc0luZm8tPnN1cHBvcnRlZFJhdGVzWzZdICsgcEJzc0luZm8tPmV4dFN1cHBvcnRlZFJhdGVzWzBdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJzc0luZm8tPkVuYWJsZUhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQnNzSW5mby0+ZW5hYmxlSFQ0MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJzc0luZm8tPnNpZ25hbFN0cmVuZ3RoKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKKworemxFcnJvcjoKKworICAgIHJldHVybiAxOworCit6bEVycm9yMjoKKworICAgIHJldHVybiAyOworfQorCit2b2lkIHpmU3RhUHJvY2Vzc0JlYWNvbih6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHN0cnVjdCB6c0FkZGl0aW9uSW5mbyogQWRkSW5mbykgLy9DV1lhbmcobSkKK3sKKyAgICAvKiBQYXJzZSBUSU0gYW5kIHNlbmQgUFMtUE9MTCBpbiBwb3dlciBzYXZpbmcgbW9kZSAqLworICAgIHN0cnVjdCB6c1dsYW5CZWFjb25GcmFtZUhlYWRlciogIHBCZWFjb25IZWFkZXI7CisgICAgc3RydWN0IHpzQnNzSW5mbyogcEJzc0luZm87CisgICAgdThfdCAgIHBCdWZbc2l6ZW9mKHN0cnVjdCB6c1dsYW5CZWFjb25GcmFtZUhlYWRlcildOworICAgIHU4X3QgICBic3NpZFs2XTsKKyAgICBpbnQgICAgcmVzOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIC8qIHN0YSByb3V0aW5lIGpvYnMgKi8KKyAgICB6ZlN0YVByb3RFcnBNb25pdG9yKGRldiwgYnVmKTsgIC8qIGNoZWNrIHByb3RlY3Rpb24gbW9kZSAqLworCisgICAgaWYgKHpmU3RhSXNDb25uZWN0ZWQoZGV2KSkKKyAgICB7CisgICAgICAgIFpNX01BQ19XT1JEX1RPX0JZVEUod2QtPnN0YS5ic3NpZCwgYnNzaWQpOworCisgICAgICAgIGlmICggd2QtPndsYW5Nb2RlID09IFpNX01PREVfSU5GUkFTVFJVQ1RVUkUgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHpmUnhCdWZmZXJFcXVhbFRvU3RyKGRldiwgYnVmLCBic3NpZCwgWk1fV0xBTl9IRUFERVJfQTJfT0ZGU0VULCA2KSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgemZQb3dlclNhdmluZ01nclByb2Nlc3NCZWFjb24oZGV2LCBidWYpOworICAgICAgICAgICAgICAgIHpmU3RhVXBkYXRlV21lUGFyYW1ldGVyKGRldiwgYnVmKTsKKyAgICAgICAgICAgICAgICBpZiAod2QtPnN0YS5ERlNFbmFibGUpCisgICAgICAgICAgICAgICAgICAgIHpmU3RhVXBkYXRlRG90MTFIREZTKGRldiwgYnVmKTsKKyAgICAgICAgICAgICAgICBpZiAod2QtPnN0YS5UUENFbmFibGUpCisgICAgICAgICAgICAgICAgICAgIHpmU3RhVXBkYXRlRG90MTFIVFBDKGRldiwgYnVmKTsKKyAgICAgICAgICAgICAgICAvKiB1cGRhdGUgc2lnbmFsIHN0cmVuZ3RoIGFuZCBzaWduYWwgcXVhbGl0eSAqLworICAgICAgICAgICAgICAgIHpmU3RhU2lnbmFsU3RhdGlzdGljKGRldiwgQWRkSW5mby0+VGFpbC5EYXRhLlNpZ25hbFN0cmVuZ3RoMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFkZEluZm8tPlRhaWwuRGF0YS5TaWduYWxRdWFsaXR5KTsgLy9DV1lhbmcoKykKKyAgICAgICAgICAgICAgICB3ZC0+c3RhLnJ4QmVhY29uQ291bnQrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICggd2QtPndsYW5Nb2RlID09IFpNX01PREVfSUJTUyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggemZSeEJ1ZmZlckVxdWFsVG9TdHIoZGV2LCBidWYsIGJzc2lkLCBaTV9XTEFOX0hFQURFUl9BM19PRkZTRVQsIDYpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgcmVzOworICAgICAgICAgICAgICAgIHN0cnVjdCB6c1BhcnRuZXJOb3RpZnlFdmVudCBldmVudDsKKworICAgICAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIjIwMDcwOTE2IFJlY2VpdmUgb3Bwb3NpdGUgQmVhY29uISIpOworICAgICAgICAgICAgICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgICAgICAgICAgd2QtPnN0YS5pYnNzUmVjZWl2ZUJlYWNvbkNvdW50Kys7CisgICAgICAgICAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgICAgICAgICAgICAgIHJlcyA9IHpmU3RhU2V0T3Bwb3NpdGVJbmZvRnJvbVJ4QnVmKGRldiwgYnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoIHJlcyA9PSAwICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIE5ldyBwZWVyIHN0YXRpb24gZm91bmQuIE5vdGlmeSB0aGUgd3JhcHBlciBub3cKKyAgICAgICAgICAgICAgICAgICAgemZJbml0UGFydG5lck5vdGlmeUV2ZW50KGRldiwgYnVmLCAmZXZlbnQpOworICAgICAgICAgICAgICAgICAgICBpZiAod2QtPnpmY2JJYnNzUGFydG5lck5vdGlmeSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+emZjYklic3NQYXJ0bmVyTm90aWZ5KGRldiwgMSwgJmV2ZW50KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvKiB1cGRhdGUgc2lnbmFsIHN0cmVuZ3RoIGFuZCBzaWduYWwgcXVhbGl0eSAqLworICAgICAgICAgICAgICAgIHpmU3RhU2lnbmFsU3RhdGlzdGljKGRldiwgQWRkSW5mby0+VGFpbC5EYXRhLlNpZ25hbFN0cmVuZ3RoMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFkZEluZm8tPlRhaWwuRGF0YS5TaWduYWxRdWFsaXR5KTsgLy9DV1lhbmcoKykKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vZWxzZSBpZiAoIHdkLT5zdGEuaWJzc1BhcnRuZXJTdGF0dXMgPT0gWk1fSUJTU19QQVJUTkVSX0xPU1QgKQorICAgICAgICAgICAgLy8gV2h5IGRvZXMgdGhpcyBoYXBwZW4gaW4gSUJTUz8/IFRoZSBpbXBhY3Qgb2YgVmlzdGEgc2luY2UKKyAgICAgICAgICAgIC8vIHdlIG5lZWQgdG8gdGVsbCBpdCB0aGUgQlNTSUQKKyNpZiAwCisgICAgICAgICAgICBlbHNlIGlmICggd2QtPnN0YS5vcHBvc2l0ZUNvdW50ID09IDAgKQorICAgICAgICAgICAgeyAgIC8qIElCU1MgbWVyZ2UgaWYgU1NJRCBtYXRjaGVkICovCisgICAgICAgICAgICAgICAgaWYgKCAob2Zmc2V0ID0gemZGaW5kRWxlbWVudChkZXYsIGJ1ZiwgWk1fV0xBTl9FSURfU1NJRCkpICE9IDB4ZmZmZiApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoICh3ZC0+c3RhLnNzaWRMZW4gPT0gem13X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzEpKSYmCisgICAgICAgICAgICAgICAgICAgICAgICAgKHpmUnhCdWZmZXJFcXVhbFRvU3RyKGRldiwgYnVmLCB3ZC0+c3RhLnNzaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCsyLCB3ZC0+c3RhLnNzaWRMZW4pKSApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhcGFiaWxpdHlJbmZvID0gem13X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMzQpOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIGNhcGFiaWxpdHlJbmZvICYgWk1fQklUXzEgKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHdkLT5zdGEuY2FwYWJpbGl0eVswXSAmIFpNX0JJVF80KSA9PQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNhcGFiaWxpdHlJbmZvICYgWk1fQklUXzQpICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIklCU1MgbWVyZ2UiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemZDb3B5RnJvbVJ4QnVmZmVyKGRldiwgYnVmLCBic3NpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFpNX1dMQU5fSEVBREVSX0EzX09GRlNFVCwgNik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpmVXBkYXRlQnNzaWQoZGV2LCBic3NpZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiByZXR1cm4gaWYgbm90IGNoYW5uZWwgc2NhbiAqLworICAgIGlmICggIXdkLT5zdGEuYkNoYW5uZWxTY2FuICkKKyAgICB7CisgICAgICAgIGdvdG8gemxSZXR1cm47CisgICAgfQorCisgICAgemZDb3B5RnJvbVJ4QnVmZmVyKGRldiwgYnVmLCBwQnVmLCAwLCBzaXplb2Yoc3RydWN0IHpzV2xhbkJlYWNvbkZyYW1lSGVhZGVyKSk7CisgICAgcEJlYWNvbkhlYWRlciA9IChzdHJ1Y3QgenNXbGFuQmVhY29uRnJhbWVIZWFkZXIqKSBwQnVmOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIC8vem1fZGVidWdfbXNnMSgiYnNzIGNvdW50ID0gIiwgd2QtPnN0YS5ic3NMaXN0LmJzc0NvdW50KTsKKworICAgIHBCc3NJbmZvID0gemZTdGFGaW5kQnNzSW5mbyhkZXYsIGJ1ZiwgcEJlYWNvbkhlYWRlcik7CisKKyAgICBpZiAoIHBCc3NJbmZvID09IE5VTEwgKQorICAgIHsKKyAgICAgICAgLyogQWxsb2NhdGUgYSBuZXcgZW50cnkgaWYgQlNTIG5vdCBpbiB0aGUgc2NhbiBsaXN0ICovCisgICAgICAgIHBCc3NJbmZvID0gemZCc3NJbmZvQWxsb2NhdGUoZGV2KTsKKyAgICAgICAgaWYgKHBCc3NJbmZvICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJlcyA9IHpmU3RhSW5pdEJzc0luZm8oZGV2LCBidWYsIHBCZWFjb25IZWFkZXIsIHBCc3NJbmZvLCBBZGRJbmZvLCAwKTsKKyAgICAgICAgICAgIC8vemZEdW1wU1NJRChwQnNzSW5mby0+c3NpZFsxXSwgJihwQnNzSW5mby0+c3NpZFsyXSkpOworICAgICAgICAgICAgaWYgKCByZXMgIT0gMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgemZCc3NJbmZvRnJlZShkZXYsIHBCc3NJbmZvKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6ZkJzc0luZm9JbnNlcnRUb0xpc3QoZGV2LCBwQnNzSW5mbyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmVzID0gemZTdGFJbml0QnNzSW5mbyhkZXYsIGJ1ZiwgcEJlYWNvbkhlYWRlciwgcEJzc0luZm8sIEFkZEluZm8sIDEpOworICAgICAgICBpZiAocmVzID09IDIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHpmQnNzSW5mb1JlbW92ZUZyb21MaXN0KGRldiwgcEJzc0luZm8pOworICAgICAgICAgICAgemZCc3NJbmZvRnJlZShkZXYsIHBCc3NJbmZvKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICggd2QtPndsYW5Nb2RlID09IFpNX01PREVfSUJTUyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBpZHg7CisKKyAgICAgICAgICAgIC8vIEl0IHdvdWxkIHJlc2V0IHRoZSBhbGl2ZSBjb3VudGVyIGlmIHRoZSBwZWVyIHN0YXRpb24gaXMgZm91bmQhCisgICAgICAgICAgICB6ZlN0YUZpbmRGcmVlT3Bwb3NpdGUoZGV2LCAodTE2X3QgKilwQnNzSW5mby0+bWFjYWRkciwgJmlkeCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCit6bFJldHVybjoKKworICAgIHJldHVybjsKK30KKworCit2b2lkIHpmQXV0aEZyZXFDb21wbGV0ZUNiKHpkZXZfdCogZGV2KQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIGlmICh3ZC0+c3RhLmNvbm5lY3RTdGF0ZSA9PSBaTV9TVEFfQ09OTl9TVEFURV9BVVRIX0NPTVBMRVRFRCkKKyAgICB7CisgICAgICAgIHptX2RlYnVnX21zZzAoIlpNX1NUQV9DT05OX1NUQVRFX0FTU09DSUFURSIpOworICAgICAgICB3ZC0+c3RhLmNvbm5lY3RUaW1lciA9IHdkLT50aWNrOworICAgICAgICB3ZC0+c3RhLmNvbm5lY3RTdGF0ZSA9IFpNX1NUQV9DT05OX1NUQVRFX0FTU09DSUFURTsKKyAgICB9CisKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIHJldHVybjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmUHJvY2Vzc0F1dGggICAgICAgICAgICAgICAqLworLyogICAgICBQcm9jZXNzIGF1dGhlbnRpY2F0ZSBtYW5hZ2VtZW50IGZyYW1lLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYnVmIDogYXV0aCBmcmFtZSBidWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgbm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiBDaGVuICAgICAgICBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgIDIwMDUuMTAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIE5vdGUgOiBBUCBhbGxvd3Mgb25lIGF1dGhlbnRpY2F0aW5nIFNUQSBhdCBhIHRpbWUsIGRvZXMgbm90ICAgICAgICAgICovCisvKiAgICAgICAgc3VwcG9ydCBtdWx0aXBsZSBhdXRoZW50aWNhdGlvbiBwcm9jZXNzLiBNYWtlIHN1cmUgICAgICAgICAgICAqLworLyogICAgICAgIGF1dGhlbnRpY2F0aW9uIHN0YXRlIG1hY2hpbmUgd2lsbCBub3QgYmUgYmxvY2tlZCBkdWUgICAgICAgICAgKi8KKy8qICAgICAgICB0byBpbmNvbXBsZXRlZCBhdXRoZW50aWNhdGlvbiBoYW5kc2hha2UuICAgICAgICAgICAgICAgICAgICAgICovCit2b2lkIHpmU3RhUHJvY2Vzc0F1dGgoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCogc3JjLCB1MTZfdCBhcElkKQoreworICAgIHN0cnVjdCB6c1dsYW5BdXRoRnJhbWVIZWFkZXIqIHBBdXRoRnJhbWU7CisgICAgdThfdCAgcEJ1ZltzaXplb2Yoc3RydWN0IHpzV2xhbkF1dGhGcmFtZUhlYWRlcildOworICAgIHUzMl90IHAxLCBwMjsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgaWYgKCAhemZTdGFJc0Nvbm5lY3RpbmcoZGV2KSApCisgICAgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgcEF1dGhGcmFtZSA9IChzdHJ1Y3QgenNXbGFuQXV0aEZyYW1lSGVhZGVyKikgcEJ1ZjsKKyAgICB6ZkNvcHlGcm9tUnhCdWZmZXIoZGV2LCBidWYsIHBCdWYsIDAsIHNpemVvZihzdHJ1Y3QgenNXbGFuQXV0aEZyYW1lSGVhZGVyKSk7CisKKyAgICBpZiAoIHdkLT5zdGEuY29ubmVjdFN0YXRlID09IFpNX1NUQV9DT05OX1NUQVRFX0FVVEhfT1BFTiApCisgICAgeworICAgICAgICBpZiAoICh6bXdfbGUxNl90b19jcHUocEF1dGhGcmFtZS0+c2VxKSA9PSAyKSYmCisgICAgICAgICAgICAgKHptd19sZTE2X3RvX2NwdShwQXV0aEZyYW1lLT5hbGdvKSA9PSAwKSYmCisgICAgICAgICAgICAgKHptd19sZTE2X3RvX2NwdShwQXV0aEZyYW1lLT5zdGF0dXMpID09IDApICkKKyAgICAgICAgeworCisgICAgICAgICAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICAgICAgd2QtPnN0YS5jb25uZWN0VGltZXIgPSB3ZC0+dGljazsKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIlpNX1NUQV9DT05OX1NUQVRFX0FVVEhfQ09NUExFVEVEIik7CisgICAgICAgICAgICB3ZC0+c3RhLmNvbm5lY3RTdGF0ZSA9IFpNX1NUQV9DT05OX1NUQVRFX0FVVEhfQ09NUExFVEVEOworICAgICAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgICAgICAgICAgLy9TZXQgY2hhbm5lbCBhY2NvcmRpbmcgdG8gQVAncyBjb25maWd1cmF0aW9uCisgICAgICAgICAgICAvL01vdmUgdG8gaGVyZSBiZWNhdXNlIG9mIENpc2NvIDExbiBBUCBmZWF0dXJlCisgICAgICAgICAgICB6ZkNvcmVTZXRGcmVxdWVuY3lFeChkZXYsIHdkLT5mcmVxdWVuY3ksIHdkLT5CYW5kV2lkdGg0MCwKKyAgICAgICAgICAgICAgICAgICAgd2QtPkV4dE9mZnNldCwgemZBdXRoRnJlcUNvbXBsZXRlQ2IpOworCisgICAgICAgICAgICAvKiBzZW5kIGFzc29jaWF0aW9uIGZyYW1lICovCisgICAgICAgICAgICBpZiAoIHdkLT5zdGEuY29ubmVjdEJ5UmVhc3NvICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6ZlNlbmRNbUZyYW1lKGRldiwgWk1fV0xBTl9GUkFNRV9UWVBFX1JFQVNPQ1JFUSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEuYnNzaWQsIDAsIDAsIDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHpmU2VuZE1tRnJhbWUoZGV2LCBaTV9XTEFOX0ZSQU1FX1RZUEVfQVNPQ1JFUSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEuYnNzaWQsIDAsIDAsIDApOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzEoImF1dGhlbnRpY2F0aW9uIGZhaWxlZCwgc3RhdHVzID0gIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcEF1dGhGcmFtZS0+c3RhdHVzKTsKKworICAgICAgICAgICAgaWYgKHdkLT5zdGEuYXV0aE1vZGUgPT0gWk1fQVVUSF9NT0RFX0FVVE8pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2QtPnN0YS5iSXNTaGFyZWRLZXkgPSAxOworICAgICAgICAgICAgICAgIHpmU3RhU3RhcnRDb25uZWN0KGRldiwgd2QtPnN0YS5iSXNTaGFyZWRLZXkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIlpNX1NUQV9TVEFURV9ESVNDT05ORUNUIik7CisgICAgICAgICAgICAgICAgemZTdGFDb25uZWN0RmFpbChkZXYsIFpNX1NUQVRVU19NRURJQV9ESVNDT05ORUNUX0FVVEhfRkFJTEVELCB3ZC0+c3RhLmJzc2lkLCAzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmICggd2QtPnN0YS5jb25uZWN0U3RhdGUgPT0gWk1fU1RBX0NPTk5fU1RBVEVfQVVUSF9TSEFSRV8xICkKKyAgICB7CisgICAgICAgIGlmICggKHptd19sZTE2X3RvX2NwdShwQXV0aEZyYW1lLT5hbGdvKSA9PSAxKSAmJgorICAgICAgICAgICAgICh6bXdfbGUxNl90b19jcHUocEF1dGhGcmFtZS0+c2VxKSA9PSAyKSAmJgorICAgICAgICAgICAgICh6bXdfbGUxNl90b19jcHUocEF1dGhGcmFtZS0+c3RhdHVzKSA9PSAwKSkKKyAgICAgICAgICAgICAgLy8mJiAocEF1dGhGcmFtZS0+Y2hhbGxlbmdlVGV4dFsxXSA8PSAyNTUpICkKKyAgICAgICAgeworICAgICAgICAgICAgemZNZW1vcnlDb3B5KHdkLT5zdGEuY2hhbGxlbmdlVGV4dCwgcEF1dGhGcmFtZS0+Y2hhbGxlbmdlVGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwQXV0aEZyYW1lLT5jaGFsbGVuZ2VUZXh0WzFdKzIpOworCisgICAgICAgICAgICAvKiBzZW5kIHRoZSAzcmQgYXV0aGVudGljYXRpb24gZnJhbWUgKi8KKyAgICAgICAgICAgIHAxID0gMHgzMDAwMTsKKyAgICAgICAgICAgIHAyID0gMDsKKyAgICAgICAgICAgIHpmU2VuZE1tRnJhbWUoZGV2LCBaTV9XTEFOX0ZSQU1FX1RZUEVfQVVUSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5ic3NpZCwgcDEsIHAyLCAwKTsKKworICAgICAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgIHdkLT5zdGEuY29ubmVjdFRpbWVyID0gd2QtPnRpY2s7CisKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIlpNX1NUQV9TVUJfU1RBVEVfQVVUSF9TSEFSRV8yIik7CisgICAgICAgICAgICB3ZC0+c3RhLmNvbm5lY3RTdGF0ZSA9IFpNX1NUQV9DT05OX1NUQVRFX0FVVEhfU0hBUkVfMjsKKyAgICAgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB6bV9kZWJ1Z19tc2cxKCJhdXRoZW50aWNhdGlvbiBmYWlsZWQsIHN0YXR1cyA9ICIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBBdXRoRnJhbWUtPnN0YXR1cyk7CisKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIlpNX1NUQV9TVEFURV9ESVNDT05ORUNUIik7CisgICAgICAgICAgICB6ZlN0YUNvbm5lY3RGYWlsKGRldiwgWk1fU1RBVFVTX01FRElBX0RJU0NPTk5FQ1RfQVVUSF9GQUlMRUQsIHdkLT5zdGEuYnNzaWQsIDMpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKCB3ZC0+c3RhLmNvbm5lY3RTdGF0ZSA9PSBaTV9TVEFfQ09OTl9TVEFURV9BVVRIX1NIQVJFXzIgKQorICAgIHsKKyAgICAgICAgaWYgKCAoem13X2xlMTZfdG9fY3B1KHBBdXRoRnJhbWUtPmFsZ28pID09IDEpJiYKKyAgICAgICAgICAgICAoem13X2xlMTZfdG9fY3B1KHBBdXRoRnJhbWUtPnNlcSkgPT0gNCkmJgorICAgICAgICAgICAgICh6bXdfbGUxNl90b19jcHUocEF1dGhGcmFtZS0+c3RhdHVzKSA9PSAwKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vU2V0IGNoYW5uZWwgYWNjb3JkaW5nIHRvIEFQJ3MgY29uZmlndXJhdGlvbgorICAgICAgICAgICAgLy9Nb3ZlIHRvIGhlcmUgYmVjYXVzZSBvZiBDaXNjbyAxMW4gQVAgZmVhdHVyZQorICAgICAgICAgICAgemZDb3JlU2V0RnJlcXVlbmN5RXgoZGV2LCB3ZC0+ZnJlcXVlbmN5LCB3ZC0+QmFuZFdpZHRoNDAsCisgICAgICAgICAgICAgICAgICAgIHdkLT5FeHRPZmZzZXQsIE5VTEwpOworCisgICAgICAgICAgICAvKiBzZW5kIGFzc29jaWF0aW9uIGZyYW1lICovCisgICAgICAgICAgICB6ZlNlbmRNbUZyYW1lKGRldiwgWk1fV0xBTl9GUkFNRV9UWVBFX0FTT0NSRVEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEuYnNzaWQsIDAsIDAsIDApOworCisgICAgICAgICAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICAgICAgd2QtPnN0YS5jb25uZWN0VGltZXIgPSB3ZC0+dGljazsKKworICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiWk1fU1RBX1NVQl9TVEFURV9BU1NPQ0lBVEUiKTsKKyAgICAgICAgICAgIHdkLT5zdGEuY29ubmVjdFN0YXRlID0gWk1fU1RBX0NPTk5fU1RBVEVfQVNTT0NJQVRFOworICAgICAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzEoImF1dGhlbnRpY2F0aW9uIGZhaWxlZCwgc3RhdHVzID0gIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcEF1dGhGcmFtZS0+c3RhdHVzKTsKKworICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiWk1fU1RBX1NUQVRFX0RJU0NPTk5FQ1QiKTsKKyAgICAgICAgICAgIHpmU3RhQ29ubmVjdEZhaWwoZGV2LCBaTV9TVEFUVVNfTUVESUFfRElTQ09OTkVDVF9BVVRIX0ZBSUxFRCwgd2QtPnN0YS5ic3NpZCwgMyk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgem1fZGVidWdfbXNnMCgidW5rbm93biBjYXNlIik7CisgICAgfQorfQorCit2b2lkIHpmU3RhUHJvY2Vzc0Fzb2NSZXEoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCogc3JjLCB1MTZfdCBhcElkKQoreworCisgICAgcmV0dXJuOworfQorCit2b2lkIHpmU3RhUHJvY2Vzc0Fzb2NSc3AoemRldl90KiBkZXYsIHpidWZfdCogYnVmKQoreworICAgIHN0cnVjdCB6c1dsYW5Bc3NvRnJhbWVIZWFkZXIqIHBBc3NvRnJhbWU7CisgICAgdThfdCAgcEJ1ZltzaXplb2Yoc3RydWN0IHpzV2xhbkFzc29GcmFtZUhlYWRlcildOworICAgIHUxNl90IG9mZnNldDsKKyAgICB1MzJfdCBpOworICAgIHUzMl90IG9uZVR4U3RyZWFtQ2FwOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgaWYgKCAhemZTdGFJc0Nvbm5lY3RpbmcoZGV2KSApCisgICAgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgcEFzc29GcmFtZSA9IChzdHJ1Y3QgenNXbGFuQXNzb0ZyYW1lSGVhZGVyKikgcEJ1ZjsKKyAgICB6ZkNvcHlGcm9tUnhCdWZmZXIoZGV2LCBidWYsIHBCdWYsIDAsIHNpemVvZihzdHJ1Y3QgenNXbGFuQXNzb0ZyYW1lSGVhZGVyKSk7CisKKyAgICBpZiAoIHdkLT5zdGEuY29ubmVjdFN0YXRlID09IFpNX1NUQV9DT05OX1NUQVRFX0FTU09DSUFURSApCisgICAgeworICAgICAgICBpZiAoIHBBc3NvRnJhbWUtPnN0YXR1cyA9PSAwICkKKyAgICAgICAgeworICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiWk1fU1RBX1NUQVRFX0NPTk5FQ1RFRCIpOworCisgICAgICAgICAgICBpZiAod2QtPnN0YS5FbmFibGVIVCA9PSAxKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdkLT5zdGEud21lQ29ubmVjdGVkID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgod2QtPnN0YS53bWVFbmFibGVkICYgWk1fU1RBX1dNRV9FTkFCTEVfQklUKSAhPSAwKSAvL1dNRSBlbmFibGVkCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogQXNvYyByc3AgbWF5IGNvbnRhaW4gV01FIHBhcmFtZXRlciBlbGVtZW50ICovCisgICAgICAgICAgICAgICAgaWYgKChvZmZzZXQgPSB6ZkZpbmRXaWZpRWxlbWVudChkZXYsIGJ1ZiwgMiwgMSkpICE9IDB4ZmZmZikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIldNRSBlbmFibGUiKTsKKyAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS53bWVDb25uZWN0ZWQgPSAxOworICAgICAgICAgICAgICAgICAgICBpZiAoKHdkLT5zdGEud21lRW5hYmxlZCAmIFpNX1NUQV9VQVBTRF9FTkFCTEVfQklUKSAhPSAwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCs4KSAmIDB4ODApICE9IDApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiVUFQU0QgZW5hYmxlIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5xb3NJbmZvID0gd2QtPnN0YS53bWVRb3NJbmZvOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgemZTdGFVcGRhdGVXbWVQYXJhbWV0ZXIoZGV2LCBidWYpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAvL1N0b3JlIGFzb2MgcmVzcG9uc2UgZnJhbWUgYm9keSwgZm9yIFZJU1RBIG9ubHkKKyAgICAgICAgICAgIHdkLT5zdGEuYXNvY1JzcEZyYW1lQm9keVNpemUgPSB6ZndCdWZHZXRTaXplKGRldiwgYnVmKS0yNDsKKyAgICAgICAgICAgIGlmICh3ZC0+c3RhLmFzb2NSc3BGcmFtZUJvZHlTaXplID4gWk1fQ0FDSEVEX0ZSQU1FQk9EWV9TSVpFKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdkLT5zdGEuYXNvY1JzcEZyYW1lQm9keVNpemUgPSBaTV9DQUNIRURfRlJBTUVCT0RZX1NJWkU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGk9MDsgaTx3ZC0+c3RhLmFzb2NSc3BGcmFtZUJvZHlTaXplOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2QtPnN0YS5hc29jUnNwRnJhbWVCb2R5W2ldID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgaSsyNCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHpmU3RhU3RvcmVBc29jUnNwSWUoZGV2LCBidWYpOworICAgICAgICAgICAgaWYgKHdkLT5zdGEuRW5hYmxlSFQgJiYKKyAgICAgICAgICAgICAgICAoKHdkLT5zdGEuaWUuSHRDYXAuSHRDYXBJbmZvICYgSFRDQVBfU3VwQ2hhbm5lbFdpZHRoU2V0KSAhPSAwKSAmJgorICAgICAgICAgICAgICAgICh3ZC0+RXh0T2Zmc2V0ICE9IDApKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdkLT5zdGEuaHRDdHJsQmFuZHdpZHRoID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3ZC0+c3RhLmh0Q3RybEJhbmR3aWR0aCA9IDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vU2V0IGNoYW5uZWwgYWNjb3JkaW5nIHRvIEFQJ3MgY29uZmlndXJhdGlvbgorICAgICAgICAgICAgLy96ZkNvcmVTZXRGcmVxdWVuY3lFeChkZXYsIHdkLT5mcmVxdWVuY3ksIHdkLT5CYW5kV2lkdGg0MCwKKyAgICAgICAgICAgIC8vICAgICAgICB3ZC0+RXh0T2Zmc2V0LCBOVUxMKTsKKworICAgICAgICAgICAgaWYgKHdkLT5zdGEuRW5hYmxlSFQgPT0gMSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3ZC0+YWRkYmFDb21wbGV0ZSA9IDA7CisKKyAgICAgICAgICAgICAgICBpZiAoKHdkLT5zdGEuU1dFbmNyeXB0RW5hYmxlICYgWk1fU1dfVEtJUF9FTkNSWV9FTikgPT0gMCAmJgorICAgICAgICAgICAgICAgICAgICAod2QtPnN0YS5TV0VuY3J5cHRFbmFibGUgJiBaTV9TV19XRVBfRU5DUllfRU4pID09IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB3ZC0+YWRkYmFDb3VudCA9IDE7CisgICAgICAgICAgICAgICAgICAgIHpmQWdnU2VuZEFkZGJhUmVxdWVzdChkZXYsIHdkLT5zdGEuYnNzaWQsIDAsIDApOworICAgICAgICAgICAgICAgICAgICB6ZlRpbWVyU2NoZWR1bGUoZGV2LCBaTV9FVkVOVF9USU1FT1VUX0FEREJBLCAxMDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogc2V0IFJJRlMgc3VwcG9ydCAqLworICAgICAgICAgICAgaWYod2QtPnN0YS5pZS5IdEluZm8uQ2hhbm5lbEluZm8gJiBFeHRIdENhcF9SSUZTTW9kZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3ZC0+c3RhLkhUMjA0MCA9IDE7CisvLyAgICAgICAgICAgICAgICB6ZkhwU2V0UmlmcyhkZXYsIHdkLT5zdGEuRW5hYmxlSFQsIDEsICh3ZC0+c3RhLmN1cnJlbnRGcmVxdWVuY3kgPCAzMDAwKT8gMTowKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgd2QtPnN0YS5haWQgPSBwQXNzb0ZyYW1lLT5haWQgJiAweDNmZmY7CisgICAgICAgICAgICB3ZC0+c3RhLm9wcG9zaXRlQ291bnQgPSAwOyAgICAvKiByZXNldCBvcHBvc2l0ZSBjb3VudCAqLworICAgICAgICAgICAgemZTdGFTZXRPcHBvc2l0ZUluZm9Gcm9tUnhCdWYoZGV2LCBidWYpOworCisgICAgICAgICAgICB3ZC0+c3RhLnJ4QmVhY29uQ291bnQgPSAxNjsKKworICAgICAgICAgICAgemZDaGFuZ2VBZGFwdGVyU3RhdGUoZGV2LCBaTV9TVEFfU1RBVEVfQ09OTkVDVEVEKTsKKyAgICAgICAgICAgIHdkLT5zdGEuY29ublBvd2VySW5IYWxmRGJtID0gemZIcEdldFRyYW5zbWl0UG93ZXIoZGV2KTsKKyAgICAgICAgICAgIGlmICh3ZC0+emZjYkNvbm5lY3ROb3RpZnkgIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAod2QtPnN0YS5FbmFibGVIVCAhPSAwKSAvKiAxMW4gKi8KKyAgICAgICAgICAgIAl7CisgICAgCQkgICAgICAgIG9uZVR4U3RyZWFtQ2FwID0gKHpmSHBDYXBhYmlsaXR5KGRldikgJiBaTV9IUF9DQVBfMTFOX09ORV9UWF9TVFJFQU0pOworICAgIAkJICAgICAgICBpZiAod2QtPnN0YS5odEN0cmxCYW5kd2lkdGggPT0gMSkgLyogSFQ0MCovCisgICAgCQkgICAgICAgIHsKKyAgICAJCQkJCWlmKG9uZVR4U3RyZWFtQ2FwKSAvKiBvbmUgVHggc3RyZWFtICovCisgICAgCQkJCSAgICB7CisgICAgCQkJCSAgICAgICAgaWYgKHdkLT5zdGEuU0c0MCkKKyAgICAJCQkJICAgICAgICB7CisgICAgCQkJCSAgICAgICAgICAgIHdkLT5DdXJyZW50VHhSYXRlS2JwcyA9IDE1MDAwMDsKKyAgICAJCQkJCQkgICAgd2QtPkN1cnJlbnRSeFJhdGVLYnBzID0gMzAwMDAwOworICAgIAkJCQkgICAgICAgIH0KKyAgICAJCQkJICAgICAgICBlbHNlCisgICAgCQkJCSAgICAgICAgeworICAgIAkJCQkgICAgICAgICAgICB3ZC0+Q3VycmVudFR4UmF0ZUticHMgPSAxMzUwMDA7CisgICAgCQkJCQkJICAgIHdkLT5DdXJyZW50UnhSYXRlS2JwcyA9IDI3MDAwMDsKKyAgICAJCQkJICAgICAgICB9CisgICAgCQkJCSAgICB9CisgICAgCQkJCSAgICBlbHNlIC8qIFR3byBUeCBzdHJlYW1zICovCisgICAgCQkJCSAgICB7CisgICAgCQkJCSAgICAgICAgaWYgKHdkLT5zdGEuU0c0MCkKKyAgICAJCQkJICAgICAgICB7CisgICAgCQkJCSAgICAgICAgICAgIHdkLT5DdXJyZW50VHhSYXRlS2JwcyA9IDMwMDAwMDsKKyAgICAJCQkJCQkgICAgd2QtPkN1cnJlbnRSeFJhdGVLYnBzID0gMzAwMDAwOworICAgIAkJCQkgICAgICAgIH0KKyAgICAJCQkJICAgICAgICBlbHNlCisgICAgCQkJCSAgICAgICAgeworICAgIAkJCQkgICAgICAgICAgICB3ZC0+Q3VycmVudFR4UmF0ZUticHMgPSAyNzAwMDA7CisgICAgCQkJCQkJICAgIHdkLT5DdXJyZW50UnhSYXRlS2JwcyA9IDI3MDAwMDsKKyAgICAJCQkJICAgICAgICB9CisgICAgCQkJCSAgICB9CisgICAgCQkgICAgICAgIH0KKyAgICAJCSAgICAgICAgZWxzZSAvKiBIVDIwICovCisgICAgCQkgICAgICAgIHsKKyAgICAJCSAgICAgICAgICAgIGlmKG9uZVR4U3RyZWFtQ2FwKSAvKiBvbmUgVHggc3RyZWFtICovCisgICAgCQkJCSAgICB7CisgICAgCQkJCSAgICAgICAgd2QtPkN1cnJlbnRUeFJhdGVLYnBzID0gNjUwMDAwOworICAgIAkJCQkJCXdkLT5DdXJyZW50UnhSYXRlS2JwcyA9IDEzMDAwMDsKKyAgICAJCQkJICAgIH0KKyAgICAJCQkJICAgIGVsc2UgLyogVHdvIFR4IHN0cmVhbXMgKi8KKyAgICAJCQkJICAgIHsKKyAgICAJCQkJICAgICAgICB3ZC0+Q3VycmVudFR4UmF0ZUticHMgPSAxMzAwMDA7CisgICAgCQkJCQkgICAgd2QtPkN1cnJlbnRSeFJhdGVLYnBzID0gMTMwMDAwOworICAgIAkJCQkgICAgfQorICAgIAkJICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgLyogMTFhYmcgKi8KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICh3ZC0+c3RhLmNvbm5lY3Rpb25fMTFiICE9IDApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5DdXJyZW50VHhSYXRlS2JwcyA9IDExMDAwOworICAgIAkJCSAgICAgICAgd2QtPkN1cnJlbnRSeFJhdGVLYnBzID0gMTEwMDA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+Q3VycmVudFR4UmF0ZUticHMgPSA1NDAwMDsKKyAgICAJCQkgICAgICAgIHdkLT5DdXJyZW50UnhSYXRlS2JwcyA9IDU0MDAwOworICAgIAkJCSAgICB9CisgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICB3ZC0+emZjYkNvbm5lY3ROb3RpZnkoZGV2LCBaTV9TVEFUVVNfTUVESUFfQ09OTkVDVCwgd2QtPnN0YS5ic3NpZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3ZC0+c3RhLmNvbm5lY3RCeVJlYXNzbyA9IFRSVUU7CisgICAgICAgICAgICB3ZC0+c3RhLmZhaWxDbnRPZlJlYXNzbyA9IDA7CisKKyAgICAgICAgICAgIHpmUG93ZXJTYXZpbmdNZ3JDb25uZWN0Tm90aWZ5KGRldik7CisKKyAgICAgICAgICAgIC8qIERpc2FibGUgaGVyZSBiZWNhdXNlIGZpeGVkIHJhdGUgaXMgb25seSBmb3IgdGVzdCwgVEJELiAqLworICAgICAgICAgICAgLy9pZiAod2QtPnN0YS5FbmFibGVIVCkKKyAgICAgICAgICAgIC8veworICAgICAgICAgICAgLy8gICAgd2QtPnR4TUNTID0gNzsgLy9SYXRlID0gNjVNYnBzCisgICAgICAgICAgICAvLyAgICB3ZC0+dHhNVCA9IDI7IC8vIEh0IHJhdGUKKyAgICAgICAgICAgIC8vICAgIHdkLT5lbmFibGVBZ2dyZWdhdGlvbiA9IDI7IC8vIEVuYWJsZSBBZ2dyZWdhdGlvbgorICAgICAgICAgICAgLy99CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB6bV9kZWJ1Z19tc2cxKCJhc3NvY2lhdGlvbiBmYWlsZWQsIHN0YXR1cyA9ICIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBBc3NvRnJhbWUtPnN0YXR1cyk7CisKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIlpNX1NUQV9TVEFURV9ESVNDT05ORUNUIik7CisgICAgICAgICAgICB3ZC0+c3RhLmNvbm5lY3RCeVJlYXNzbyA9IEZBTFNFOworICAgICAgICAgICAgemZTdGFDb25uZWN0RmFpbChkZXYsIFpNX1NUQVRVU19NRURJQV9ESVNDT05ORUNUX0FTT0NfRkFJTEVELCB3ZC0+c3RhLmJzc2lkLCAzKTsKKyAgICAgICAgfQorICAgIH0KKworfQorCit2b2lkIHpmU3RhU3RvcmVBc29jUnNwSWUoemRldl90KiBkZXYsIHpidWZfdCogYnVmKQoreworICAgIHUxNl90IG9mZnNldDsKKyAgICB1MzJfdCBpOworICAgIHUxNl90IGxlbmd0aDsKKyAgICB1OF90ICAqaHRjYXA7CisgICAgdThfdCAgYXNvY0J3NDAgPSAwOworICAgIHU4X3QgIGFzb2NFeHRPZmZzZXQgPSAwOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgZm9yIChpPTA7IGk8d2QtPnN0YS5hc29jUnNwRnJhbWVCb2R5U2l6ZTsgaSsrKQorICAgIHsKKyAgICAgICAgd2QtPnN0YS5hc29jUnNwRnJhbWVCb2R5W2ldID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgaSsyNCk7CisgICAgfQorCisgICAgLyogSFQgY2FwYWJpbGl0aWVzOiAyOCBvY3RldHMgKi8KKyAgICBpZiAoICAgICgod2QtPnN0YS5jdXJyZW50RnJlcXVlbmN5ID4gMzAwMCkgJiYgISh3ZC0+c3VwcG9ydE1vZGUgJiBaTV9XSVJFTEVTU19NT0RFXzVfTikpCisgICAgICAgICB8fCAoKHdkLT5zdGEuY3VycmVudEZyZXF1ZW5jeSA8IDMwMDApICYmICEod2QtPnN1cHBvcnRNb2RlICYgWk1fV0lSRUxFU1NfTU9ERV8yNF9OKSkgKQorICAgIHsKKyAgICAgICAgLyogbm90IDExbiBBUCAqLworICAgICAgICBodGNhcCA9ICh1OF90ICopJndkLT5zdGEuaWUuSHRDYXA7CisgICAgICAgIGZvciAoaT0wOyBpPDI4OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGh0Y2FwW2ldID0gMDsKKyAgICAgICAgfQorICAgICAgICB3ZC0+QmFuZFdpZHRoNDAgPSAwOworICAgICAgICB3ZC0+RXh0T2Zmc2V0ID0gMDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICgob2Zmc2V0ID0gemZGaW5kRWxlbWVudChkZXYsIGJ1ZiwgWk1fV0xBTl9FSURfSFRfQ0FQQUJJTElUWSkpICE9IDB4ZmZmZikKKyAgICB7CisgICAgICAgIC8qIGF0aGVyb3MgcHJlIG4gKi8KKyAgICAgICAgem1fZGVidWdfbXNnMCgiYXRoZXJvcyBwcmUgbiIpOworICAgICAgICBodGNhcCA9ICh1OF90ICopJndkLT5zdGEuaWUuSHRDYXA7CisgICAgICAgIGh0Y2FwWzBdID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KTsKKyAgICAgICAgaHRjYXBbMV0gPSAyNjsKKyAgICAgICAgZm9yIChpPTE7IGk8PTI2OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGh0Y2FwW2krMV0gPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQgKyBpKTsKKyAgICAgICAgICAgIHptX21zZzJfbW0oWk1fTFZfMSwgIkFTT0M6ICBIVCBDYXBhYmlsaXRpZXMsIGh0Y2FwPSIsIGh0Y2FwW2krMV0pOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKChvZmZzZXQgPSB6ZkZpbmRFbGVtZW50KGRldiwgYnVmLCBaTV9XTEFOX1BSRU4yX0VJRF9IVENBUEFCSUxJVFkpKSAhPSAweGZmZmYpCisgICAgeworICAgICAgICAvKiBwcmUgbiAyLjAgc3RhbmRhcmQgKi8KKyAgICAgICAgem1fZGVidWdfbXNnMCgicHJlIG4gMi4wIHN0YW5kYXJkIik7CisgICAgICAgIGh0Y2FwID0gKHU4X3QgKikmd2QtPnN0YS5pZS5IdENhcDsKKyAgICAgICAgZm9yIChpPTA7IGk8Mjg7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaHRjYXBbaV0gPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQgKyBpKTsKKyAgICAgICAgICAgIHptX21zZzJfbW0oWk1fTFZfMSwgIkFTT0M6ICBIVCBDYXBhYmlsaXRpZXMsIGh0Y2FwPSIsIGh0Y2FwW2ldKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKiBub3QgMTFuIEFQICovCisgICAgICAgIGh0Y2FwID0gKHU4X3QgKikmd2QtPnN0YS5pZS5IdENhcDsKKyAgICAgICAgZm9yIChpPTA7IGk8Mjg7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaHRjYXBbaV0gPSAwOworICAgICAgICB9CisgICAgICAgIHdkLT5CYW5kV2lkdGg0MCA9IDA7CisgICAgICAgIHdkLT5FeHRPZmZzZXQgPSAwOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgYXNvY0J3NDAgPSAodThfdCkoKHdkLT5zdGEuaWUuSHRDYXAuSHRDYXBJbmZvICYgSFRDQVBfU3VwQ2hhbm5lbFdpZHRoU2V0KSA+PiAxKTsKKworICAgIC8qIEhUIGluZm9ybWF0aW9uICovCisgICAgaWYgKChvZmZzZXQgPSB6ZkZpbmRFbGVtZW50KGRldiwgYnVmLCBaTV9XTEFOX0VJRF9FWFRFTkRFRF9IVF9DQVBBQklMSVRZKSkgIT0gMHhmZmZmKQorICAgIHsKKyAgICAgICAgLyogYXRoZXJvcyBwcmUgbiAqLworICAgICAgICB6bV9kZWJ1Z19tc2cwKCJhdGhlcm9zIHByZSBuIEhUSU5GTyIpOworICAgICAgICBsZW5ndGggPSAyMjsKKyAgICAgICAgaHRjYXAgPSAodThfdCAqKSZ3ZC0+c3RhLmllLkh0SW5mbzsKKyAgICAgICAgaHRjYXBbMF0gPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQpOworICAgICAgICBodGNhcFsxXSA9IDIyOworICAgICAgICBmb3IgKGk9MTsgaTw9MjI7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaHRjYXBbaSsxXSA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCArIGkpOworICAgICAgICAgICAgem1fbXNnMl9tbShaTV9MVl8xLCAiQVNPQzogIEhUIEluZm8sIGh0aW5mbz0iLCBodGNhcFtpKzFdKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmICgob2Zmc2V0ID0gemZGaW5kRWxlbWVudChkZXYsIGJ1ZiwgWk1fV0xBTl9QUkVOMl9FSURfSFRJTkZPUk1BVElPTikpICE9IDB4ZmZmZikKKyAgICB7CisgICAgICAgIC8qIHByZSBuIDIuMCBzdGFuZGFyZCAqLworICAgICAgICB6bV9kZWJ1Z19tc2cwKCJwcmUgbiAyLjAgc3RhbmRhcmQgSFRJTkZPIik7CisgICAgICAgIGxlbmd0aCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCArIDEpOworICAgICAgICBodGNhcCA9ICh1OF90ICopJndkLT5zdGEuaWUuSHRJbmZvOworICAgICAgICBmb3IgKGk9MDsgaTwyNDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBodGNhcFtpXSA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCArIGkpOworICAgICAgICAgICAgem1fbXNnMl9tbShaTV9MVl8xLCAiQVNPQzogIEhUIEluZm8sIGh0aW5mbz0iLCBodGNhcFtpXSk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgem1fZGVidWdfbXNnMCgibm8gSFRJTkZPIik7CisgICAgICAgIGh0Y2FwID0gKHU4X3QgKikmd2QtPnN0YS5pZS5IdEluZm87CisgICAgICAgIGZvciAoaT0wOyBpPDI0OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGh0Y2FwW2ldID0gMDsKKyAgICAgICAgfQorICAgIH0KKyAgICBhc29jRXh0T2Zmc2V0ID0gd2QtPnN0YS5pZS5IdEluZm8uQ2hhbm5lbEluZm8gJiBFeHRIdENhcF9FeHRDaGFubmVsT2Zmc2V0QmVsb3c7CisKKyAgICBpZiAoKHdkLT5zdGEuRW5hYmxlSFQgPT0gMSkgJiYgKGFzb2NCdzQwID09IDEpICYmICgoYXNvY0V4dE9mZnNldCA9PSAxKSB8fCAoYXNvY0V4dE9mZnNldCA9PSAzKSkpCisgICAgeworICAgICAgICB3ZC0+QmFuZFdpZHRoNDAgPSBhc29jQnc0MDsKKyAgICAgICAgd2QtPkV4dE9mZnNldCA9IGFzb2NFeHRPZmZzZXQ7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHdkLT5CYW5kV2lkdGg0MCA9IDA7CisgICAgICAgIHdkLT5FeHRPZmZzZXQgPSAwOworICAgIH0KKworICAgIHJldHVybjsKK30KKwordm9pZCB6ZlN0YVByb2Nlc3NEZWF1dGgoemRldl90KiBkZXYsIHpidWZfdCogYnVmKQoreworICAgIHUxNl90IGFwTWFjQWRkclszXTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgLyogU1RBIDogaWYgU0E9Y29ubmVjdGVkIEFQIHRoZW4gZGlzY29ubmVjdCB3aXRoIEFQICovCisgICAgaWYgKCB3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9JTkZSQVNUUlVDVFVSRSApCisgICAgeworICAgICAgICBhcE1hY0FkZHJbMF0gPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCBaTV9XTEFOX0hFQURFUl9BM19PRkZTRVQpOworICAgICAgICBhcE1hY0FkZHJbMV0gPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCBaTV9XTEFOX0hFQURFUl9BM19PRkZTRVQrMik7CisgICAgICAgIGFwTWFjQWRkclsyXSA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIFpNX1dMQU5fSEVBREVSX0EzX09GRlNFVCs0KTsKKyAgCWlmICgoYXBNYWNBZGRyWzBdID09IHdkLT5zdGEuYnNzaWRbMF0pICYmIChhcE1hY0FkZHJbMV0gPT0gd2QtPnN0YS5ic3NpZFsxXSkgJiYgKGFwTWFjQWRkclsyXSA9PSB3ZC0+c3RhLmJzc2lkWzJdKSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHpmd0J1ZkdldFNpemUoZGV2LCBidWYpID49IDI0KzIpIC8vbm90IGEgbWFsZm9ybWVkIGZyYW1lCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCB6ZlN0YUlzQ29ubmVjdGVkKGRldikgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgemZTdGFDb25uZWN0RmFpbChkZXYsIFpNX1NUQVRVU19NRURJQV9ESVNDT05ORUNUX0RFQVVUSCwgd2QtPnN0YS5ic3NpZCwgMik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKHpmU3RhSXNDb25uZWN0aW5nKGRldikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB6ZlN0YUNvbm5lY3RGYWlsKGRldiwgWk1fU1RBVFVTX01FRElBX0RJU0NPTk5FQ1RfQVVUSF9GQUlMRUQsIHdkLT5zdGEuYnNzaWQsIDMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmICggd2QtPndsYW5Nb2RlID09IFpNX01PREVfSUJTUyApCisgICAgeworICAgICAgICB1MTZfdCBwZWVyTWFjQWRkclszXTsKKyAgICAgICAgdThfdCAgcGVlcklkeDsKKyAgICAgICAgczhfdCAgcmVzOworCisgICAgICAgIGlmICggemZTdGFJc0Nvbm5lY3RlZChkZXYpICkKKyAgICAgICAgeworICAgICAgICAgICAgcGVlck1hY0FkZHJbMF0gPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCBaTV9XTEFOX0hFQURFUl9BMl9PRkZTRVQpOworICAgICAgICAgICAgcGVlck1hY0FkZHJbMV0gPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCBaTV9XTEFOX0hFQURFUl9BMl9PRkZTRVQrMik7CisgICAgICAgICAgICBwZWVyTWFjQWRkclsyXSA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIFpNX1dMQU5fSEVBREVSX0EyX09GRlNFVCs0KTsKKworICAgICAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgIHJlcyA9IHpmU3RhRmluZE9wcG9zaXRlQnlNQUNBZGRyKGRldiwgcGVlck1hY0FkZHIsICZwZWVySWR4KTsKKyAgICAgICAgICAgIGlmICggcmVzID09IDAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdkLT5zdGEub3Bwb3NpdGVJbmZvW3BlZXJJZHhdLmFsaXZlQ291bnRlciA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIHpmU3RhUHJvY2Vzc0Rpc2Fzb2MoemRldl90KiBkZXYsIHpidWZfdCogYnVmKQoreworICAgIHUxNl90IGFwTWFjQWRkclszXTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIC8qIFNUQSA6IGlmIFNBPWNvbm5lY3RlZCBBUCB0aGVuIGRpc2Nvbm5lY3Qgd2l0aCBBUCAqLworICAgIGlmICggd2QtPndsYW5Nb2RlID09IFpNX01PREVfSU5GUkFTVFJVQ1RVUkUgKQorICAgIHsKKyAgICAgICAgYXBNYWNBZGRyWzBdID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgWk1fV0xBTl9IRUFERVJfQTNfT0ZGU0VUKTsKKyAgICAgICAgYXBNYWNBZGRyWzFdID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgWk1fV0xBTl9IRUFERVJfQTNfT0ZGU0VUKzIpOworICAgICAgICBhcE1hY0FkZHJbMl0gPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCBaTV9XTEFOX0hFQURFUl9BM19PRkZTRVQrNCk7CisKKyAgICAgICAgaWYgKChhcE1hY0FkZHJbMF0gPT0gd2QtPnN0YS5ic3NpZFswXSkgJiYgKGFwTWFjQWRkclsxXSA9PSB3ZC0+c3RhLmJzc2lkWzFdKSAmJiAoYXBNYWNBZGRyWzJdID09IHdkLT5zdGEuYnNzaWRbMl0pKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoemZ3QnVmR2V0U2l6ZShkZXYsIGJ1ZikgPj0gMjQrMikgLy9ub3QgYSBtYWxmb3JtZWQgZnJhbWUKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIHpmU3RhSXNDb25uZWN0ZWQoZGV2KSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB6ZlN0YUNvbm5lY3RGYWlsKGRldiwgWk1fU1RBVFVTX01FRElBX0RJU0NPTk5FQ1RfRElTQVNPQywgd2QtPnN0YS5ic3NpZCwgMik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHpmU3RhQ29ubmVjdEZhaWwoZGV2LCBaTV9TVEFUVVNfTUVESUFfRElTQ09OTkVDVF9BU09DX0ZBSUxFRCwgd2QtPnN0YS5ic3NpZCwgMyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmUHJvY2Vzc1Byb2JlUmVxICAgICAgICAgICAqLworLyogICAgICBQcm9jZXNzIHByb2JlIHJlcXVlc3QgbWFuYWdlbWVudCBmcmFtZS4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYnVmIDogYXV0aCBmcmFtZSBidWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgbm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiBDaGVuICAgICAgICBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgIDIwMDUuMTAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgemZTdGFQcm9jZXNzUHJvYmVSZXEoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCogc3JjKQoreworICAgIHUxNl90IG9mZnNldDsKKyAgICB1OF90IGxlbjsKKyAgICB1MTZfdCBpLCBqOworICAgIHUxNl90IHNlbmRGbGFnOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgLyogY2hlY2sgbW9kZSA6IEFQL0lCU1MgKi8KKyAgICBpZiAoKHdkLT53bGFuTW9kZSAhPSBaTV9NT0RFX0FQKSB8fCAod2QtPndsYW5Nb2RlICE9IFpNX01PREVfSUJTUykpCisgICAgeworICAgICAgICB6bV9tc2cwX21tKFpNX0xWXzMsICJJZ25vcmUgcHJvYmUgcmVxIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvKiBjaGVjayBTU0lEICovCisgICAgaWYgKChvZmZzZXQgPSB6ZkZpbmRFbGVtZW50KGRldiwgYnVmLCBaTV9XTEFOX0VJRF9TU0lEKSkgPT0gMHhmZmZmKQorICAgIHsKKyAgICAgICAgem1fbXNnMF9tbShaTV9MVl8zLCAicHJvYmUgcmVxIFNTSUQgbm90IGZvdW5kIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBsZW4gPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMSk7CisKKyAgICBmb3IgKGk9MDsgaTxaTV9NQVhfQVBfU1VQUE9SVDsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKCh3ZC0+YXAuYXBCaXRtYXAgJiAoaTw8aSkpICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHNlbmRGbGFnID0gMDsKKyAgICAgICAgICAgIC8qIGJvYXJkY2FzdCBTU0lEICovCisgICAgICAgICAgICBpZiAoKGxlbiA9PSAwKSAmJiAod2QtPmFwLmhpZGVTc2lkW2ldID09IDApKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNlbmRGbGFnID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIE5vdCBicm9hZGNhc3QgU1NJRCAqLworICAgICAgICAgICAgZWxzZSBpZiAod2QtPmFwLnNzaWRMZW5baV0gPT0gbGVuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvciAoaj0wOyBqPGxlbjsgaisrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxK2opCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIT0gd2QtPmFwLnNzaWRbaV1bal0pCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChqID09IGxlbikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHNlbmRGbGFnID0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc2VuZEZsYWcgPT0gMSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBTZW5kIHByb2JlIHJlc3BvbnNlICovCisgICAgICAgICAgICAgICAgemZTZW5kTW1GcmFtZShkZXYsIFpNX1dMQU5fRlJBTUVfVFlQRV9QUk9CRVJTUCwgc3JjLCBpLCAwLCAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCB6ZlN0YVByb2Nlc3NQcm9iZVJzcCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHN0cnVjdCB6c0FkZGl0aW9uSW5mbyogQWRkSW5mbykKK3sKKyAgICAvKiByZXR1cm4gaWYgbm90IGNoYW5uZWwgc2NhbiAqLworICAgIC8vIFByb2JlIHJlc3BvbnNlIGlzIHNlbnQgd2l0aCB1bmljYXN0LiBJcyB0aGlzIHJlcXVpcmVkPworICAgIC8vIElCU1Mgd291bGQgc2VuZCBwcm9iZSByZXF1ZXN0IGFuZCB0aGUgY29kZSBiZWxvdyB3b3VsZCBwcmV2ZW50CisgICAgLy8gdGhlIHByb2JlIHJlc3BvbnNlIGZyb20gaGFuZGxpbmcuCisgICAgI2lmIDAKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBpZiAoICF3ZC0+c3RhLmJDaGFubmVsU2NhbiApCisgICAgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgICNlbmRpZgorCisgICAgemZQcm9jZXNzUHJvYmVSc3AoZGV2LCBidWYsIEFkZEluZm8pOworfQorCit2b2lkIHpmSUJTU1NldHVwQnNzRGVzYyh6ZGV2X3QgKmRldikKK3sKKyNpZmRlZiBaTV9FTkFCTEVfSUJTU19XUEEyUFNLCisgICAgdThfdCBpOworI2VuZGlmCisgICAgc3RydWN0IHpzQnNzSW5mbyAqcEJzc0luZm87CisgICAgdTE2X3Qgb2Zmc2V0ID0gMDsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHBCc3NJbmZvID0gJndkLT5zdGEuaWJzc0Jzc0Rlc2M7CisgICAgemZaZXJvTWVtb3J5KCh1OF90ICopcEJzc0luZm8sIHNpemVvZihzdHJ1Y3QgenNCc3NJbmZvKSk7CisKKyAgICBwQnNzSW5mby0+c2lnbmFsU3RyZW5ndGggPSAxMDA7CisKKyAgICB6Zk1lbW9yeUNvcHkoKHU4X3QgKilwQnNzSW5mby0+bWFjYWRkciwgKHU4X3QgKil3ZC0+bWFjQWRkciw2KTsKKyAgICB6Zk1lbW9yeUNvcHkoKHU4X3QgKilwQnNzSW5mby0+YnNzaWQsICh1OF90ICopd2QtPnN0YS5ic3NpZCwgNik7CisKKyAgICBwQnNzSW5mby0+YmVhY29uSW50ZXJ2YWxbMF0gPSAodThfdCkod2QtPmJlYWNvbkludGVydmFsKSA7CisgICAgcEJzc0luZm8tPmJlYWNvbkludGVydmFsWzFdID0gKHU4X3QpKCh3ZC0+YmVhY29uSW50ZXJ2YWwpID4+IDgpIDsKKworICAgIHBCc3NJbmZvLT5jYXBhYmlsaXR5WzBdID0gd2QtPnN0YS5jYXBhYmlsaXR5WzBdOworICAgIHBCc3NJbmZvLT5jYXBhYmlsaXR5WzFdID0gd2QtPnN0YS5jYXBhYmlsaXR5WzFdOworCisgICAgcEJzc0luZm8tPnNzaWRbMF0gPSBaTV9XTEFOX0VJRF9TU0lEOworICAgIHBCc3NJbmZvLT5zc2lkWzFdID0gd2QtPnN0YS5zc2lkTGVuOworICAgIHpmTWVtb3J5Q29weSgodThfdCAqKSZwQnNzSW5mby0+c3NpZFsyXSwgKHU4X3QgKil3ZC0+c3RhLnNzaWQsIHdkLT5zdGEuc3NpZExlbik7CisgICAgemZNZW1vcnlDb3B5KCh1OF90ICopJnBCc3NJbmZvLT5mcmFtZUJvZHlbb2Zmc2V0XSwgKHU4X3QgKilwQnNzSW5mby0+c3NpZCwKKyAgICAgICAgICAgICAgICAgd2QtPnN0YS5zc2lkTGVuICsgMik7CisgICAgb2Zmc2V0ICs9IHdkLT5zdGEuc3NpZExlbiArIDI7CisKKyAgICAvKiBzdXBwb3J0IHJhdGUgKi8KKworICAgIC8qIERTIHBhcmFtZXRlciBzZXQgKi8KKyAgICBwQnNzSW5mby0+Y2hhbm5lbCA9IHpmQ2hGcmVxVG9OdW0od2QtPmZyZXF1ZW5jeSwgTlVMTCk7CisgICAgcEJzc0luZm8tPmZyZXF1ZW5jeSA9IHdkLT5mcmVxdWVuY3k7CisgICAgcEJzc0luZm8tPmF0aW1XaW5kb3cgPSB3ZC0+c3RhLmF0aW1XaW5kb3c7CisKKyNpZmRlZiBaTV9FTkFCTEVfSUJTU19XUEEyUFNLCisgICAgaWYgKCB3ZC0+c3RhLmF1dGhNb2RlID09IFpNX0FVVEhfTU9ERV9XUEEyUFNLICkKKyAgICB7CisgICAgICAgIHU4X3QgcnNuWzY0XT0KKyAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKiBFbGVtZW50IElEICovCisgICAgICAgICAgICAgICAgICAgIDB4MzAsCisgICAgICAgICAgICAgICAgICAgIC8qIExlbmd0aCAqLworICAgICAgICAgICAgICAgICAgICAweDE0LAorICAgICAgICAgICAgICAgICAgICAvKiBWZXJzaW9uICovCisgICAgICAgICAgICAgICAgICAgIDB4MDEsIDB4MDAsCisgICAgICAgICAgICAgICAgICAgIC8qIEdyb3VwIENpcGhlciBTdWl0ZSwgZGVmYXVsdD1US0lQICovCisgICAgICAgICAgICAgICAgICAgIDB4MDAsIDB4MGYsIDB4YWMsIDB4MDQsCisgICAgICAgICAgICAgICAgICAgIC8qIFBhaXJ3aXNlIENpcGhlciBTdWl0ZSBDb3VudCAqLworICAgICAgICAgICAgICAgICAgICAweDAxLCAweDAwLAorICAgICAgICAgICAgICAgICAgICAvKiBQYWlyd2lzZSBDaXBoZXIgU3VpdGUsIGRlZmF1bHQ9VEtJUCAqLworICAgICAgICAgICAgICAgICAgICAweDAwLCAweDBmLCAweGFjLCAweDAyLAorICAgICAgICAgICAgICAgICAgICAvKiBBdXRoZW50aWNhdGlvbiBhbmQgS2V5IE1hbmFnZW1lbnQgU3VpdGUgQ291bnQgKi8KKyAgICAgICAgICAgICAgICAgICAgMHgwMSwgMHgwMCwKKyAgICAgICAgICAgICAgICAgICAgLyogQXV0aGVudGljYXRpb24gdHlwZSwgZGVmYXVsdD1QU0sgKi8KKyAgICAgICAgICAgICAgICAgICAgMHgwMCwgMHgwZiwgMHhhYywgMHgwMiwKKyAgICAgICAgICAgICAgICAgICAgLyogUlNOIGNhcGFiaWxpdHkgKi8KKyAgICAgICAgICAgICAgICAgICAgMHgwMCwgMHgwMAorICAgICAgICB9OworCisgICAgICAgIC8qIE92ZXJ3cml0ZSBHcm91cCBDaXBoZXIgU3VpdGUgYnkgQVAncyBzZXR0aW5nICovCisgICAgICAgIHpmTWVtb3J5Q29weShyc24rNCwgemdXcGEyQWVzT3VpLCA0KTsKKworICAgICAgICBpZiAoIHdkLT5zdGEud2VwU3RhdHVzID09IFpNX0VOQ1JZUFRJT05fQUVTICkKKyAgICAgICAgeworICAgICAgICAgICAgLyogT3ZlcndyaXRlIFBhaXJ3aXNlIENpcGhlciBTdWl0ZSBieSBBRVMgKi8KKyAgICAgICAgICAgIHpmTWVtb3J5Q29weShyc24rMTAsIHpnV3BhMkFlc091aSwgNCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBSU04gZWxlbWVudCBpZAorICAgICAgICBwQnNzSW5mby0+ZnJhbWVCb2R5W29mZnNldCsrXSA9IFpNX1dMQU5fRUlEX1JTTl9JRSA7CisKKyAgICAgICAgLy8gUlNOIGxlbmd0aAorICAgICAgICBwQnNzSW5mby0+ZnJhbWVCb2R5W29mZnNldCsrXSA9IHJzblsxXSA7CisKKyAgICAgICAgLy8gUlNOIGluZm9ybWF0aW9uCisgICAgICAgIGZvcihpPTA7IGk8cnNuWzFdOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHBCc3NJbmZvLT5mcmFtZUJvZHlbb2Zmc2V0KytdID0gcnNuW2krMl0gOworICAgICAgICB9CisKKyAgICAgICAgemZNZW1vcnlDb3B5KHBCc3NJbmZvLT5yc25JZSwgcnNuLCByc25bMV0rMik7CisgICAgfQorI2VuZGlmCit9CisKK3ZvaWQgemZJYnNzQ29ubmVjdE5ldHdvcmsoemRldl90KiBkZXYpCit7CisgICAgc3RydWN0IHpzQnNzSW5mbyogcEJzc0luZm87CisgICAgc3RydWN0IHpzQnNzSW5mbyB0bXBCc3NJbmZvOworICAgIHU4X3QgICBtYWNBZGRyWzZdLCBic3NpZFs2XSwgYnNzTm90Rm91bmQgPSBUUlVFOworICAgIHUxNl90ICBpLCBqPTEwMDsKKyAgICB1MTZfdCAgazsKKyAgICBzdHJ1Y3QgenNQYXJ0bmVyTm90aWZ5RXZlbnQgZXZlbnQ7CisgICAgdTMyX3QgIGNoYW5uZWxGbGFnczsKKyAgICB1MTZfdCAgb3Bwb3NpdGVXZXBTdGF0dXM7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgLyogY2hhbmdlIHN0YXRlIHRvIENPTk5FQ1RJTkcgYW5kIHN0b3AgdGhlIGNoYW5uZWwgc2Nhbm5pbmcgKi8KKyAgICB6ZkNoYW5nZUFkYXB0ZXJTdGF0ZShkZXYsIFpNX1NUQV9TVEFURV9DT05ORUNUSU5HKTsKKyAgICB6ZlBvd2VyU2F2aW5nTWdyV2FrZXVwKGRldik7CisKKyAgICAvKiBTZXQgVHhRcyBDV01JTiwgQ1dNQVgsIEFJRlMgYW5kIFRYTyB0byBXTUUgU1RBIGRlZmF1bHQuICovCisgICAgemZVcGRhdGVEZWZhdWx0UW9zUGFyYW1ldGVyKGRldiwgMCk7CisKKyAgICB3ZC0+c3RhLmJQcm90ZWN0aW9uTW9kZSA9IEZBTFNFOworICAgIHpmSHBTZXRTbG90VGltZShkZXYsIDEpOworCisgICAgLyogRVNTIGJpdCBvZmYgKi8KKyAgICB3ZC0+c3RhLmNhcGFiaWxpdHlbMF0gJj0gflpNX0JJVF8wOworICAgIC8qIElCU1MgYml0IG9uICovCisgICAgd2QtPnN0YS5jYXBhYmlsaXR5WzBdIHw9IFpNX0JJVF8xOworICAgIC8qIG5vdCBub3QgdXNlIHNob3J0IHNsb3QgdGltZSAqLworICAgIHdkLT5zdGEuY2FwYWJpbGl0eVsxXSAmPSB+Wk1fQklUXzI7CisKKyAgICB3ZC0+c3RhLndtZUNvbm5lY3RlZCA9IDA7CisgICAgd2QtPnN0YS5wc01nci50ZW1wV2FrZVVwID0gMDsKKyAgICB3ZC0+c3RhLnFvc0luZm8gPSAwOworICAgIHdkLT5zdGEuRW5hYmxlSFQgPSAwOworICAgIHdkLT5CYW5kV2lkdGg0MCA9IDA7CisgICAgd2QtPkV4dE9mZnNldCA9IDA7CisKKyAgICBpZiAoIHdkLT5zdGEuYnNzTGlzdC5ic3NDb3VudCApCisgICAgeworICAgICAgICAvL1Jlb3JkZXIgQnNzTGlzdCBieSBSU1NJLS1DV1lhbmcoKykKKyAgICAgICAgemZCc3NJbmZvUmVvcmRlckxpc3QoZGV2KTsKKworICAgICAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgICAgIHBCc3NJbmZvID0gd2QtPnN0YS5ic3NMaXN0LmhlYWQ7CisKKyAgICAgICAgZm9yKGk9MDsgaTx3ZC0+c3RhLmJzc0xpc3QuYnNzQ291bnQ7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgLy8gMjAwNzA4MDYgIzEgUHJpdmFjeSBiaXQKKyAgICAgICAgICAgIGlmICggcEJzc0luZm8tPmNhcGFiaWxpdHlbMF0gJiBaTV9CSVRfNCApCisgICAgICAgICAgICB7IC8vIFByaXZhY3kgSWJzcyBuZXR3b3JrCisvLyAgICAgICAgICAgICAgICB6bV9kZWJ1Z19tc2cwKCJQcml2YWN5IGJpdCBvbiIpOworICAgICAgICAgICAgICAgIG9wcG9zaXRlV2VwU3RhdHVzID0gWk1fRU5DUllQVElPTl9XRVBfRU5BQkxFRDsKKworICAgICAgICAgICAgICAgIGlmICggcEJzc0luZm8tPnJzbkllWzFdICE9IDAgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAocEJzc0luZm8tPnJzbkllWzddID09IDB4MDEpIHx8IChwQnNzSW5mby0+cnNuSWVbN10gPT0gMHgwNSkgKQorICAgICAgICAgICAgICAgICAgICB7IC8vIFdFUC00MCAmIFdFUC0xMDQKKy8vICAgICAgICAgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiV0VQNDAgb3IgV0VQMTA0Iik7CisgICAgICAgICAgICAgICAgICAgICAgICBvcHBvc2l0ZVdlcFN0YXR1cyA9IFpNX0VOQ1JZUFRJT05fV0VQX0VOQUJMRUQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIHBCc3NJbmZvLT5yc25JZVs3XSA9PSAweDAyICkKKyAgICAgICAgICAgICAgICAgICAgeyAvLyBUS0lQCisvLyAgICAgICAgICAgICAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIlRLSVAiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wcG9zaXRlV2VwU3RhdHVzID0gWk1fRU5DUllQVElPTl9US0lQOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBwQnNzSW5mby0+cnNuSWVbN10gPT0gMHgwNCApCisgICAgICAgICAgICAgICAgICAgIHsgLy8gQUVTCisvLyAgICAgICAgICAgICAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIkNDTVAtQUVTIik7CisgICAgICAgICAgICAgICAgICAgICAgICBvcHBvc2l0ZVdlcFN0YXR1cyA9IFpNX0VOQ1JZUFRJT05fQUVTOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworLy8gICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiUHJpdmFjeSBiaXQgb2ZmIik7CisgICAgICAgICAgICAgICAgb3Bwb3NpdGVXZXBTdGF0dXMgPSBaTV9FTkNSWVBUSU9OX1dFUF9ESVNBQkxFRDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCAoemZNZW1vcnlJc0VxdWFsKCYocEJzc0luZm8tPnNzaWRbMl0pLCB3ZC0+c3RhLnNzaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5zc2lkTGVuKSkmJgorICAgICAgICAgICAgICAgICAod2QtPnN0YS5zc2lkTGVuID09IHBCc3NJbmZvLT5zc2lkWzFdKSYmCisgICAgICAgICAgICAgICAgIChvcHBvc2l0ZVdlcFN0YXR1cyA9PSB3ZC0+c3RhLndlcFN0YXR1cykgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIENoZWNrIHN1cHBvcnQgbW9kZSAqLworICAgICAgICAgICAgICAgIGlmIChwQnNzSW5mby0+ZnJlcXVlbmN5ID4gMzAwMCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoICAgKHBCc3NJbmZvLT5FbmFibGVIVCA9PSAxKQorICAgICAgICAgICAgICAgICAgICAgICAgfHwgKHBCc3NJbmZvLT5hcENhcCAmIFpNX0FsbDExTl9BUCkgKSAvLzExbiBBUAorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsRmxhZ3MgPSBDSEFOTkVMX0FfSFQ7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocEJzc0luZm8tPmVuYWJsZUhUNDAgPT0gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxGbGFncyB8PSBDSEFOTkVMX0hUNDA7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsRmxhZ3MgPSBDSEFOTkVMX0E7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAoICAgKHBCc3NJbmZvLT5FbmFibGVIVCA9PSAxKQorICAgICAgICAgICAgICAgICAgICAgICAgfHwgKHBCc3NJbmZvLT5hcENhcCAmIFpNX0FsbDExTl9BUCkgKSAvLzExbiBBUAorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsRmxhZ3MgPSBDSEFOTkVMX0dfSFQ7CisgICAgICAgICAgICAgICAgICAgICAgICBpZihwQnNzSW5mby0+ZW5hYmxlSFQ0MCA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbEZsYWdzIHw9IENIQU5ORUxfSFQ0MDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwQnNzSW5mby0+ZXh0U3VwcG9ydGVkUmF0ZXNbMV0gPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxGbGFncyA9IENIQU5ORUxfQjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbEZsYWdzID0gQ0hBTk5FTF9HOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCAgICgoY2hhbm5lbEZsYWdzID09IENIQU5ORUxfQikgJiYgKHdkLT5jb25uZWN0TW9kZSAmIFpNX0JJVF8wKSkKKyAgICAgICAgICAgICAgICAgICAgfHwgKChjaGFubmVsRmxhZ3MgPT0gQ0hBTk5FTF9HKSAmJiAod2QtPmNvbm5lY3RNb2RlICYgWk1fQklUXzEpKQorICAgICAgICAgICAgICAgICAgICB8fCAoKGNoYW5uZWxGbGFncyA9PSBDSEFOTkVMX0EpICYmICh3ZC0+Y29ubmVjdE1vZGUgJiBaTV9CSVRfMikpCisgICAgICAgICAgICAgICAgICAgIHx8ICgoY2hhbm5lbEZsYWdzICYgQ0hBTk5FTF9IVDIwKSAmJiAod2QtPmNvbm5lY3RNb2RlICYgWk1fQklUXzMpKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwQnNzSW5mbyA9IHBCc3NJbmZvLT5uZXh0OworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvKiBCeXBhc3MgREZTIGNoYW5uZWwgKi8KKyAgICAgICAgICAgICAgICBpZiAoemZIcElzRGZzQ2hhbm5lbE5DUyhkZXYsIHBCc3NJbmZvLT5mcmVxdWVuY3kpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiQnlwYXNzIERGUyBjaGFubmVsIik7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8qIGNoZWNrIElCU1MgYml0ICovCisgICAgICAgICAgICAgICAgaWYgKCBwQnNzSW5mby0+Y2FwYWJpbGl0eVswXSAmIFpNX0JJVF8xICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qIG1heSBjaGVjayB0aW1lc3RhbXAgaGVyZSAqLworICAgICAgICAgICAgICAgICAgICBqID0gaTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwQnNzSW5mbyA9IHBCc3NJbmZvLT5uZXh0OworICAgICAgICB9CisKKyAgICAgICAgaWYgKChqIDwgd2QtPnN0YS5ic3NMaXN0LmJzc0NvdW50KSAmJiAocEJzc0luZm8gIT0gTlVMTCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHpmd01lbW9yeUNvcHkoKHU4X3QqKSZ0bXBCc3NJbmZvLCAodThfdCopKHBCc3NJbmZvKSwgc2l6ZW9mKHN0cnVjdCB6c0Jzc0luZm8pKTsKKyAgICAgICAgICAgIHBCc3NJbmZvID0gJnRtcEJzc0luZm87CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwQnNzSW5mbyA9IE5VTEw7CisgICAgICAgIH0KKworICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgICAgIC8vaWYgKCBqIDwgd2QtPnN0YS5ic3NMaXN0LmJzc0NvdW50ICkKKyAgICAgICAgaWYgKHBCc3NJbmZvICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCByZXM7CisKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIklCU1MgZm91bmQiKTsKKworICAgICAgICAgICAgLyogRm91bmQgSUJTUywgcmVzZXQgYnNzTm90Rm91bmRDb3VudCAqLworICAgICAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgIHdkLT5zdGEuYnNzTm90Rm91bmRDb3VudCA9IDA7CisgICAgICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgICAgICAgICBic3NOb3RGb3VuZCA9IEZBTFNFOworICAgICAgICAgICAgd2QtPnN0YS5hdGltV2luZG93ID0gcEJzc0luZm8tPmF0aW1XaW5kb3c7CisgICAgICAgICAgICB3ZC0+ZnJlcXVlbmN5ID0gcEJzc0luZm8tPmZyZXF1ZW5jeTsKKyAgICAgICAgICAgIC8vd2QtPnN0YS5mbGFnRnJlcUNoYW5naW5nID0gMTsKKyAgICAgICAgICAgIHpmQ29yZVNldEZyZXF1ZW5jeShkZXYsIHdkLT5mcmVxdWVuY3kpOworICAgICAgICAgICAgemZVcGRhdGVCc3NpZChkZXYsIHBCc3NJbmZvLT5ic3NpZCk7CisgICAgICAgICAgICB6ZlJlc2V0U3VwcG9ydFJhdGUoZGV2LCBaTV9ERUZBVUxUX1NVUFBPUlRfUkFURV9aRVJPKTsKKyAgICAgICAgICAgIHpmVXBkYXRlU3VwcG9ydFJhdGUoZGV2LCBwQnNzSW5mby0+c3VwcG9ydGVkUmF0ZXMpOworICAgICAgICAgICAgemZVcGRhdGVTdXBwb3J0UmF0ZShkZXYsIHBCc3NJbmZvLT5leHRTdXBwb3J0ZWRSYXRlcyk7CisgICAgICAgICAgICB3ZC0+YmVhY29uSW50ZXJ2YWwgPSBwQnNzSW5mby0+YmVhY29uSW50ZXJ2YWxbMF0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgodTE2X3QpIHBCc3NJbmZvLT5iZWFjb25JbnRlcnZhbFsxXSkgPDwgOCk7CisKKyAgICAgICAgICAgIGlmICh3ZC0+YmVhY29uSW50ZXJ2YWwgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3ZC0+YmVhY29uSW50ZXJ2YWwgPSAxMDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIHJzbiBpbmZvcm1hdGlvbiBlbGVtZW50ICovCisgICAgICAgICAgICBpZiAoIHBCc3NJbmZvLT5yc25JZVsxXSAhPSAwICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6Zk1lbW9yeUNvcHkod2QtPnN0YS5yc25JZSwgcEJzc0luZm8tPnJzbkllLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQnNzSW5mby0+cnNuSWVbMV0rMik7CisKKyNpZmRlZiBaTV9FTkFCTEVfSUJTU19XUEEyUFNLCisgICAgICAgICAgICAgICAgLyogSWYgbm90IHVzZSBSU05BICwgcnVuIHRyYWRpdGlvbmFsICovCisgICAgICAgICAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgICAgICB3ZC0+c3RhLmlic3NXcGEyUHNrID0gMTsKKyAgICAgICAgICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworI2VuZGlmCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2QtPnN0YS5yc25JZVsxXSA9IDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIHByaXZhY3kgYml0ICovCisgICAgICAgICAgICBpZiAoIHBCc3NJbmZvLT5jYXBhYmlsaXR5WzBdICYgWk1fQklUXzQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdkLT5zdGEuY2FwYWJpbGl0eVswXSB8PSBaTV9CSVRfNDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3ZC0+c3RhLmNhcGFiaWxpdHlbMF0gJj0gflpNX0JJVF80OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBwcmVhbWJsZSB0eXBlICovCisgICAgICAgICAgICB3ZC0+cHJlYW1ibGVUeXBlSW5Vc2VkID0gd2QtPnByZWFtYmxlVHlwZTsKKyAgICAgICAgICAgIGlmICggd2QtPnByZWFtYmxlVHlwZUluVXNlZCA9PSBaTV9QUkVBTUJMRV9UWVBFX0FVVE8gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChwQnNzSW5mby0+Y2FwYWJpbGl0eVswXSAmIFpNX0JJVF81KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgd2QtPnByZWFtYmxlVHlwZUluVXNlZCA9IFpNX1BSRUFNQkxFX1RZUEVfU0hPUlQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHdkLT5wcmVhbWJsZVR5cGVJblVzZWQgPSBaTV9QUkVBTUJMRV9UWVBFX0xPTkc7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAod2QtPnByZWFtYmxlVHlwZUluVXNlZCA9PSBaTV9QUkVBTUJMRV9UWVBFX0xPTkcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2QtPnN0YS5jYXBhYmlsaXR5WzBdICY9IH5aTV9CSVRfNTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3ZC0+c3RhLmNhcGFiaWxpdHlbMF0gfD0gWk1fQklUXzU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHdkLT5zdGEuYmVhY29uRnJhbWVCb2R5U2l6ZSA9IHBCc3NJbmZvLT5mcmFtZUJvZHlzaXplICsgMTI7CisKKyAgICAgICAgICAgIGlmICh3ZC0+c3RhLmJlYWNvbkZyYW1lQm9keVNpemUgPiBaTV9DQUNIRURfRlJBTUVCT0RZX1NJWkUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2QtPnN0YS5iZWFjb25GcmFtZUJvZHlTaXplID0gWk1fQ0FDSEVEX0ZSQU1FQk9EWV9TSVpFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKGs9MDsgazw4OyBrKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2QtPnN0YS5iZWFjb25GcmFtZUJvZHlba10gPSBwQnNzSW5mby0+dGltZVN0YW1wW2tdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgd2QtPnN0YS5iZWFjb25GcmFtZUJvZHlbOF0gPSBwQnNzSW5mby0+YmVhY29uSW50ZXJ2YWxbMF07CisgICAgICAgICAgICB3ZC0+c3RhLmJlYWNvbkZyYW1lQm9keVs5XSA9IHBCc3NJbmZvLT5iZWFjb25JbnRlcnZhbFsxXTsKKyAgICAgICAgICAgIHdkLT5zdGEuYmVhY29uRnJhbWVCb2R5WzEwXSA9IHBCc3NJbmZvLT5jYXBhYmlsaXR5WzBdOworICAgICAgICAgICAgd2QtPnN0YS5iZWFjb25GcmFtZUJvZHlbMTFdID0gcEJzc0luZm8tPmNhcGFiaWxpdHlbMV07CisgICAgICAgICAgICAvL2ZvciAoaz0xMjsgazx3ZC0+c3RhLmJlYWNvbkZyYW1lQm9keVNpemU7IGsrKykKKyAgICAgICAgICAgIGZvciAoaz0wOyBrPHBCc3NJbmZvLT5mcmFtZUJvZHlzaXplOyBrKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2QtPnN0YS5iZWFjb25GcmFtZUJvZHlbaysxMl0gPSBwQnNzSW5mby0+ZnJhbWVCb2R5W2tdOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICAgICAgcmVzID0gemZTdGFTZXRPcHBvc2l0ZUluZm9Gcm9tQlNTSW5mbyhkZXYsIHBCc3NJbmZvKTsKKyAgICAgICAgICAgIGlmICggcmVzID09IDAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHpmTWVtb3J5Q29weShldmVudC5ic3NpZCwgKHU4X3QgKikocEJzc0luZm8tPmJzc2lkKSwgNik7CisgICAgICAgICAgICAgICAgemZNZW1vcnlDb3B5KGV2ZW50LnBlZXJNYWNBZGRyLCAodThfdCAqKShwQnNzSW5mby0+bWFjYWRkciksIDYpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgICAgICAgICAgLy96ZndJYnNzUGFydG5lck5vdGlmeShkZXYsIDEsICZldmVudCk7CisgICAgICAgICAgICBnb3RvIGNvbm5lY3RfZG9uZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIElCU1Mgbm90IGZvdW5kICovCisgICAgaWYgKCBic3NOb3RGb3VuZCApCisgICAgeworI2lmZGVmIFpNX0VOQUJMRV9JQlNTX1dQQTJQU0sKKyAgICAgICAgdTE2X3Qgb2Zmc2V0IDsKKyNlbmRpZgorICAgICAgICBpZiAoIHdkLT5zdGEuaWJzc0pvaW5Pbmx5ICkKKyAgICAgICAgeworICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiSUJTUyBqb2luIG9ubHkuLi5yZXRyeS4uLiIpOworICAgICAgICAgICAgZ290byByZXRyeV9pYnNzOworICAgICAgICB9CisKKyAgICAgICAgaWYod2QtPnN0YS5ic3NOb3RGb3VuZENvdW50PDIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgICAgICB6bV9kZWJ1Z19tc2cxKCJJQlNTIG5vdCBmb3VuZCwgZG8gc2l0ZXN1cnZleSEhICBic3NOb3RGb3VuZENvdW50PSIsIHdkLT5zdGEuYnNzTm90Rm91bmRDb3VudCk7CisgICAgICAgICAgICB3ZC0+c3RhLmJzc05vdEZvdW5kQ291bnQrKzsKKyAgICAgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgICAgICBnb3RvIHJldHJ5X2lic3M7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICAgICAgLyogRmFpbCBJQlNTIGZvdW5kLCBUT0RPIGNyZWF0ZSBJQlNTICovCisgICAgICAgICAgICB3ZC0+c3RhLmJzc05vdEZvdW5kQ291bnQgPSAwOworICAgICAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgfQorCisKKyAgICAgICAgaWYgKHpmSHBJc0Rmc0NoYW5uZWwoZGV2LCB3ZC0+ZnJlcXVlbmN5KSkKKyAgICAgICAgeworICAgICAgICAgICAgd2QtPmZyZXF1ZW5jeSA9IHpmSHBGaW5kRmlyc3ROb25EZnNDaGFubmVsKGRldiwgd2QtPmZyZXF1ZW5jeSA+IDMwMDApOworICAgICAgICB9CisKKyAgICAgICAgaWYoIHdkLT53cy5hdXRvU2V0RnJlcXVlbmN5ID09IDAgKQorICAgICAgICB7IC8qIEF1dG8gc2V0IGZyZXF1ZW5jeSAqLworICAgICAgICAgICAgem1fZGVidWdfbXNnMSgiQ3JlYXRlIEFkIEhvYyBOZXR3b3JrIEJhbmQgIiwgd2QtPndzLmFkaG9jTW9kZSk7CisgICAgICAgICAgICB3ZC0+ZnJlcXVlbmN5ID0gemZGaW5kQ2xlYW5GcmVxdWVuY3koZGV2LCB3ZC0+d3MuYWRob2NNb2RlKTsKKyAgICAgICAgICAgIHdkLT53cy5hdXRvU2V0RnJlcXVlbmN5ID0gMHhmZjsKKyAgICAgICAgfQorICAgICAgICB6bV9kZWJ1Z19tc2cxKCJJQlNTIG5vdCBmb3VuZCwgY3JlYXRlZCBvbmUgaW4gY2hhbm5lbCAiLCB3ZC0+ZnJlcXVlbmN5KTsKKworICAgICAgICB3ZC0+c3RhLmlic3NCc3NJc0NyZWF0b3IgPSAxOworCisgICAgICAgIC8vd2QtPnN0YS5mbGFnRnJlcUNoYW5naW5nID0gMTsKKyAgICAgICAgemZDb3JlU2V0RnJlcXVlbmN5KGRldiwgd2QtPmZyZXF1ZW5jeSk7CisgICAgICAgIGlmICh3ZC0+c3RhLmJEZXNpcmVkQnNzaWQgPT0gVFJVRSkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChrPTA7IGs8NjsgaysrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJzc2lkW2tdID0gd2QtPnN0YS5kZXNpcmVkQnNzaWRba107CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAjaWYgMQorICAgICAgICAgICAgbWFjQWRkclswXSA9ICh3ZC0+bWFjQWRkclswXSAmIDB4ZmYpOworICAgICAgICAgICAgbWFjQWRkclsxXSA9ICh3ZC0+bWFjQWRkclswXSA+PiA4KTsKKyAgICAgICAgICAgIG1hY0FkZHJbMl0gPSAod2QtPm1hY0FkZHJbMV0gJiAweGZmKTsKKyAgICAgICAgICAgIG1hY0FkZHJbM10gPSAod2QtPm1hY0FkZHJbMV0gPj4gOCk7CisgICAgICAgICAgICBtYWNBZGRyWzRdID0gKHdkLT5tYWNBZGRyWzJdICYgMHhmZik7CisgICAgICAgICAgICBtYWNBZGRyWzVdID0gKHdkLT5tYWNBZGRyWzJdID4+IDgpOworICAgICAgICAgICAgemZHZW5lcmF0ZVJhbmRvbUJTU0lEKGRldiwgKHU4X3QgKil3ZC0+bWFjQWRkciwgKHU4X3QgKilic3NpZCk7CisgICAgICAgICAgICAjZWxzZQorICAgICAgICAgICAgZm9yIChrPTA7IGs8NjsgaysrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJzc2lkW2tdID0gKHU4X3QpIHpmR2V0UmFuZG9tTnVtYmVyKGRldiwgMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBic3NpZFswXSAmPSB+Wk1fQklUXzA7CisgICAgICAgICAgICBic3NpZFswXSB8PSBaTV9CSVRfMTsKKyAgICAgICAgICAgICNlbmRpZgorICAgICAgICB9CisKKyAgICAgICAgemZVcGRhdGVCc3NpZChkZXYsIGJzc2lkKTsKKyAgICAgICAgLy93ZC0+c3RhLmF0aW1XaW5kb3cgPSAweDBhOworCisgICAgICAgIC8qIHJhdGUgaW5mb3JtYXRpb24gKi8KKyAgICAgICAgaWYod2QtPmZyZXF1ZW5jeSA8PSBaTV9DSF9HXzE0KSAgLy8gMi40IEdIeiAgYitnCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggd2QtPndmYy5iSWJzc0dNb2RlCisgICAgICAgICAgICAgICAgICYmICh3ZC0+c3VwcG9ydE1vZGUgJiAoWk1fV0lSRUxFU1NfTU9ERV8yNF81NHxaTV9XSVJFTEVTU19NT0RFXzI0X04pKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgemZSZXNldFN1cHBvcnRSYXRlKGRldiwgWk1fREVGQVVMVF9TVVBQT1JUX1JBVEVfSUJTU19BRyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgemZSZXNldFN1cHBvcnRSYXRlKGRldiwgWk1fREVGQVVMVF9TVVBQT1JUX1JBVEVfSUJTU19CKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHpmUmVzZXRTdXBwb3J0UmF0ZShkZXYsIFpNX0RFRkFVTFRfU1VQUE9SVF9SQVRFX0lCU1NfQUcpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCB3ZC0+c3RhLndlcFN0YXR1cyA9PSBaTV9FTkNSWVBUSU9OX1dFUF9ESVNBQkxFRCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHdkLT5zdGEuY2FwYWJpbGl0eVswXSAmPSB+Wk1fQklUXzQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB3ZC0+c3RhLmNhcGFiaWxpdHlbMF0gfD0gWk1fQklUXzQ7CisgICAgICAgIH0KKworICAgICAgICB3ZC0+cHJlYW1ibGVUeXBlSW5Vc2VkID0gd2QtPnByZWFtYmxlVHlwZTsKKyAgICAgICAgaWYgKHdkLT5wcmVhbWJsZVR5cGVJblVzZWQgPT0gWk1fUFJFQU1CTEVfVFlQRV9MT05HKQorICAgICAgICB7CisgICAgICAgICAgICB3ZC0+c3RhLmNhcGFiaWxpdHlbMF0gJj0gflpNX0JJVF81OworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgd2QtPnByZWFtYmxlVHlwZUluVXNlZCA9IFpNX1BSRUFNQkxFX1RZUEVfU0hPUlQ7CisgICAgICAgICAgICB3ZC0+c3RhLmNhcGFiaWxpdHlbMF0gfD0gWk1fQklUXzU7CisgICAgICAgIH0KKworICAgICAgICB6ZklCU1NTZXR1cEJzc0Rlc2MoZGV2KTsKKworI2lmZGVmIFpNX0VOQUJMRV9JQlNTX1dQQTJQU0sKKworICAgICAgICAvLyAyMDA3MDQxMSBBZGQgV1BBMlBTSyBpbmZvcm1hdGlvbiB0byBpdHMgSUJTUyBuZXR3b3JrICEhIQorICAgICAgICBvZmZzZXQgPSAwIDsKKworICAgICAgICAvKiB0aW1lc3RhbXAgKi8KKyAgICAgICAgb2Zmc2V0ICs9IDggOworCisgICAgICAgIC8qIGJlYWNvbiBpbnRlcnZhbCAqLworICAgICAgICB3ZC0+c3RhLmJlYWNvbkZyYW1lQm9keVtvZmZzZXQrK10gPSAodThfdCkod2QtPmJlYWNvbkludGVydmFsKSA7CisgICAgICAgIHdkLT5zdGEuYmVhY29uRnJhbWVCb2R5W29mZnNldCsrXSA9ICh1OF90KSgod2QtPmJlYWNvbkludGVydmFsKSA+PiA4KSA7CisKKyAgICAgICAgLyogY2FwYWJpbGl0eSBpbmZvcm1hdGlvbiAqLworICAgICAgICB3ZC0+c3RhLmJlYWNvbkZyYW1lQm9keVtvZmZzZXQrK10gPSB3ZC0+c3RhLmNhcGFiaWxpdHlbMF0gOworICAgICAgICB3ZC0+c3RhLmJlYWNvbkZyYW1lQm9keVtvZmZzZXQrK10gPSB3ZC0+c3RhLmNhcGFiaWxpdHlbMV0gOworICAgICAgICAjaWYgMAorICAgICAgICAvKiBzc2lkICovCisgICAgICAgIC8vIHNzaWQgZWxlbWVudCBpZAorICAgICAgICB3ZC0+c3RhLmJlYWNvbkZyYW1lQm9keVtvZmZzZXQrK10gPSBaTV9XTEFOX0VJRF9TU0lEIDsKKyAgICAgICAgLy8gc3NpZCBsZW5ndGgKKyAgICAgICAgd2QtPnN0YS5iZWFjb25GcmFtZUJvZHlbb2Zmc2V0KytdID0gd2QtPnN0YS5zc2lkTGVuIDsKKyAgICAgICAgLy8gc3NpZCBpbmZvcm1hdGlvbgorICAgICAgICBmb3IoaT0wOyBpPHdkLT5zdGEuc3NpZExlbjsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICB3ZC0+c3RhLmJlYWNvbkZyYW1lQm9keVtvZmZzZXQrK10gPSB3ZC0+c3RhLnNzaWRbaV0gOworICAgICAgICB9CisKKyAgICAgICAgLyogc3VwcG9ydCByYXRlICovCisgICAgICAgIHJhdGVTZXQgPSBaTV9SQVRFX1NFVF9DQ0sgOworICAgICAgICBpZiAoIChyYXRlU2V0ID09IFpNX1JBVEVfU0VUX09GRE0pJiYoKHdkLT5nUmF0ZSAmIDB4ZmYpID09IDApICkKKyAgICAgICAgeworICAgICAgICAgICAgb2Zmc2V0ICs9IDAgOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLy8gc3VwcG9ydCByYXRlIGVsZW1lbnQgaWQKKyAgICAgICAgICAgIHdkLT5zdGEuYmVhY29uRnJhbWVCb2R5W29mZnNldCsrXSA9IFpNX1dMQU5fRUlEX1NVUFBPUlRfUkFURSA7CisKKyAgICAgICAgICAgIC8vIHN1cHBvcnQgcmF0ZSBsZW5ndGgKKyAgICAgICAgICAgIGxlbk9mZnNldCA9IG9mZnNldCsrOworCisgICAgICAgICAgICAvLyBzdXBwb3J0IHJhdGUgaW5mb3JtYXRpb24KKyAgICAgICAgICAgIGZvciAoaT0wOyBpPDQ7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKHdkLT5iUmF0ZSAmICgweDE8PGkpKSA9PSAoMHgxPDxpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEuYmVhY29uRnJhbWVCb2R5W29mZnNldCsrXSA9CisgICAgICAgICAgICAgICAgCSAgICB6ZzExYlJhdGVUYmxbaV0rKCh3ZC0+YlJhdGVCYXNpYyAmICgweDE8PGkpKTw8KDctaSkpIDsKKyAgICAgICAgICAgICAgICAgICAgbGVuKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBzdXBwb3J0IHJhdGUgbGVuZ3RoCisgICAgICAgICAgICB3ZC0+c3RhLmJlYWNvbkZyYW1lQm9keVtsZW5PZmZzZXRdID0gbGVuIDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIERTIHBhcmFtZXRlciBzZXQgKi8KKyAgICAgICAgLy8gRFMgcGFyYW1ldGVyIHNldCBlbGVtZXQgaWQKKyAgICAgICAgd2QtPnN0YS5iZWFjb25GcmFtZUJvZHlbb2Zmc2V0KytdID0gWk1fV0xBTl9FSURfRFMgOworCisgICAgICAgIC8vIERTIHBhcmFtZXRlciBzZXQgbGVuZ3RoCisgICAgICAgIHdkLT5zdGEuYmVhY29uRnJhbWVCb2R5W29mZnNldCsrXSA9IDEgOworCisgICAgICAgIC8vIERTIHBhcmFtZXRlciBzZXQgaW5mb3JtYXRpb24KKyAgICAgICAgd2QtPnN0YS5iZWFjb25GcmFtZUJvZHlbb2Zmc2V0KytdID0KKyAgICAgICAgIAl6ZkNoRnJlcVRvTnVtKHdkLT5mcmVxdWVuY3ksIE5VTEwpIDsKKworICAgICAgICAvKiBJQlNTIHBhcmFtZXRlciBzZXQgKi8KKyAgICAgICAgLy8gSUJTUyBwYXJhbWV0ZXIgc2V0IGVsZW1lbnQgaWQKKyAgICAgICAgd2QtPnN0YS5iZWFjb25GcmFtZUJvZHlbb2Zmc2V0KytdID0gWk1fV0xBTl9FSURfSUJTUyA7CisKKyAgICAgICAgLy8gSUJTUyBwYXJhbWV0ZXIgc2V0IGxlbmd0aAorICAgICAgICB3ZC0+c3RhLmJlYWNvbkZyYW1lQm9keVtvZmZzZXQrK10gPSAyIDsKKworICAgICAgICAvLyBJQlNTIHBhcmFtZXRlciBzZXQgaW5mb3JtYXRpb24KKyAgICAgICAgd2QtPnN0YS5iZWFjb25GcmFtZUJvZHlbb2Zmc2V0XSA9IHdkLT5zdGEuYXRpbVdpbmRvdyA7CisgICAgICAgIG9mZnNldCArPSAyIDsKKworICAgICAgICAvKiBFUlAgSW5mb3JtYXRpb24gYW5kIEV4dGVuZGVkIFN1cHBvcnRlZCBSYXRlcyAqLworICAgICAgICBpZiAoIHdkLT53ZmMuYklic3NHTW9kZQorICAgICAgICAgICAgICYmICh3ZC0+c3VwcG9ydE1vZGUgJiAoWk1fV0lSRUxFU1NfTU9ERV8yNF81NHxaTV9XSVJFTEVTU19NT0RFXzI0X04pKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIEVSUCBJbmZvcm1hdGlvbiAqLworICAgICAgICAgICAgd2QtPmVycEVsZW1lbnQgPSAwOworICAgICAgICAgICAgLy8gRVJQIGVsZW1lbnQgaWQKKyAgICAgICAgICAgIHdkLT5zdGEuYmVhY29uRnJhbWVCb2R5W29mZnNldCsrXSA9IFpNX1dMQU5fRUlEX0VSUCA7CisKKyAgICAgICAgICAgIC8vIEVSUCBsZW5ndGgKKyAgICAgICAgICAgIHdkLT5zdGEuYmVhY29uRnJhbWVCb2R5W29mZnNldCsrXSA9IDEgOworCisgICAgICAgICAgICAvLyBFUlAgaW5mb3JtYXRpb24KKyAgICAgICAgICAgIHdkLT5zdGEuYmVhY29uRnJhbWVCb2R5W29mZnNldCsrXSA9IHdkLT5lcnBFbGVtZW50IDsKKworICAgICAgICAgICAgLyogRXh0ZW5kZWQgU3VwcG9ydGVkIFJhdGVzICovCisgICAgICAgICAgICBpZiAoIChyYXRlU2V0ID09IFpNX1JBVEVfU0VUX09GRE0pJiYoKHdkLT5nUmF0ZSAmIDB4ZmYpID09IDApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvZmZzZXQgKz0gMCA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbGVuID0gMCA7CisKKyAgICAgICAgICAgICAgICAvLyBFeHRlbmRlZCBTdXBwb3J0ZWQgUmF0ZXMgZWxlbWVudCBpZAorICAgICAgICAgICAgICAgIHdkLT5zdGEuYmVhY29uRnJhbWVCb2R5W29mZnNldCsrXSA9IFpNX1dMQU5fRUlEX0VYVEVOREVEX1JBVEUgOworCisgICAgICAgICAgICAgICAgLy8gRXh0ZW5kZWQgU3VwcG9ydGVkIFJhdGVzIGxlbmd0aAorICAgICAgICAgICAgICAgIGxlbk9mZnNldCA9IG9mZnNldCsrIDsKKworICAgICAgICAgICAgICAgIC8vIEV4dGVuZGVkIFN1cHBvcnRlZCBSYXRlcyBpbmZvcm1hdGlvbgorICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpPDg7IGkrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICgod2QtPmdSYXRlICYgKDB4MTw8aSkpID09ICgweDE8PGkpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLmJlYWNvbkZyYW1lQm9keVtvZmZzZXQrK10gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpnMTFnUmF0ZVRibFtpXSsoKHdkLT5nUmF0ZUJhc2ljICYgKDB4MTw8aSkpPDwoNy1pKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBsZW4rKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIGV4dGVuZGVkIHN1cHBvcnQgcmF0ZSBsZW5ndGgKKyAgICAgICAgICAgIAkgIHdkLT5zdGEuYmVhY29uRnJhbWVCb2R5W2xlbk9mZnNldF0gPSBsZW4gOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICNlbmRpZgorCisgICAgICAgIC8qIFJTTiA6IGltcG9ydGFudCBpbmZvcm1hdGlvbiBpbmZsdWVuY2UgdGhlIHJlc3VsdCBvZiBjcmVhdGluZyBhbiBJQlNTIG5ldHdvcmsgKi8KKyAgICAgICAgaWYgKCB3ZC0+c3RhLmF1dGhNb2RlID09IFpNX0FVVEhfTU9ERV9XUEEyUFNLICkKKyAgICAgICAgeworICAgICAgICAgICAgdThfdCBmcmFtZVR5cGUgPSBaTV9XTEFOX0ZSQU1FX1RZUEVfQVVUSCA7CisgICAgICAgICAgICB1OF90ICAgIHJzbls2NF09CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBFbGVtZW50IElEICovCisgICAgICAgICAgICAgICAgICAgICAgICAweDMwLAorICAgICAgICAgICAgICAgICAgICAgICAgLyogTGVuZ3RoICovCisgICAgICAgICAgICAgICAgICAgICAgICAweDE0LAorICAgICAgICAgICAgICAgICAgICAgICAgLyogVmVyc2lvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgMHgwMSwgMHgwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdyb3VwIENpcGhlciBTdWl0ZSwgZGVmYXVsdD1US0lQICovCisgICAgICAgICAgICAgICAgICAgICAgICAweDAwLCAweDBmLCAweGFjLCAweDA0LAorICAgICAgICAgICAgICAgICAgICAgICAgLyogUGFpcndpc2UgQ2lwaGVyIFN1aXRlIENvdW50ICovCisgICAgICAgICAgICAgICAgICAgICAgICAweDAxLCAweDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgLyogUGFpcndpc2UgQ2lwaGVyIFN1aXRlLCBkZWZhdWx0PVRLSVAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAsIDB4MGYsIDB4YWMsIDB4MDIsCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBBdXRoZW50aWNhdGlvbiBhbmQgS2V5IE1hbmFnZW1lbnQgU3VpdGUgQ291bnQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEsIDB4MDAsCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBBdXRoZW50aWNhdGlvbiB0eXBlLCBkZWZhdWx0PVBTSyAqLworICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCwgMHgwZiwgMHhhYywgMHgwMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJTTiBjYXBhYmlsaXR5ICovCisgICAgICAgICAgICAgICAgICAgICAgICAweDAwLCAweDAwCisgICAgICAgICAgICB9OworCisgICAgICAgICAgICAvKiBPdmVyd3JpdGUgR3JvdXAgQ2lwaGVyIFN1aXRlIGJ5IEFQJ3Mgc2V0dGluZyAqLworICAgICAgICAgICAgemZNZW1vcnlDb3B5KHJzbis0LCB6Z1dwYTJBZXNPdWksIDQpOworCisgICAgICAgICAgICBpZiAoIHdkLT5zdGEud2VwU3RhdHVzID09IFpNX0VOQ1JZUFRJT05fQUVTICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBPdmVyd3JpdGUgUGFpcndpc2UgQ2lwaGVyIFN1aXRlIGJ5IEFFUyAqLworICAgICAgICAgICAgICAgIHpmTWVtb3J5Q29weShyc24rMTAsIHpnV3BhMkFlc091aSwgNCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFJTTiBlbGVtZW50IGlkCisgICAgICAgICAgICB3ZC0+c3RhLmJlYWNvbkZyYW1lQm9keVtvZmZzZXQrK10gPSBaTV9XTEFOX0VJRF9SU05fSUUgOworCisgICAgICAgICAgICAvLyBSU04gbGVuZ3RoCisgICAgICAgICAgICB3ZC0+c3RhLmJlYWNvbkZyYW1lQm9keVtvZmZzZXQrK10gPSByc25bMV0gOworCisgICAgICAgICAgICAvLyBSU04gaW5mb3JtYXRpb24KKyAgICAgICAgICAgIGZvcihpPTA7IGk8cnNuWzFdOyBpKyspCisgICAgICAgICAgICAgICAgd2QtPnN0YS5iZWFjb25GcmFtZUJvZHlbb2Zmc2V0KytdID0gcnNuW2krMl0gOworCisgICAgICAgICAgICB6Zk1lbW9yeUNvcHkod2QtPnN0YS5yc25JZSwgcnNuLCByc25bMV0rMik7CisKKyNpZmRlZiBaTV9FTkFCTEVfSUJTU19XUEEyUFNLCisgICAgICAgICAgICAvKiBJZiBub3QgdXNlIFJTTkEgLCBydW4gdHJhZGl0aW9uYWwgKi8KKyAgICAgICAgICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgICAgICB3ZC0+c3RhLmlic3NXcGEyUHNrID0gMTsKKyAgICAgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisjZW5kaWYKKyAgICAgICAgfQorCisgICAgICAgICNpZiAwCisgICAgICAgIC8qIEhUIENhcGFiaWxpdGllcyBJbmZvICovCisgICAgICAgIHsKKyAgICAgICAgICAgIHU4X3QgT1VJWzNdID0geyAweDAgLCAweDkwICwgMHg0QyB9IDsKKworICAgICAgICAgICAgd2QtPnN0YS5iZWFjb25GcmFtZUJvZHlbb2Zmc2V0KytdID0gWk1fV0xBTl9FSURfV1BBX0lFIDsKKworICAgICAgICAgICAgd2QtPnN0YS5iZWFjb25GcmFtZUJvZHlbb2Zmc2V0KytdID0gd2QtPnN0YS5IVENhcC5EYXRhLkxlbmd0aCArIDQgOworCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdkLT5zdGEuYmVhY29uRnJhbWVCb2R5W29mZnNldCsrXSA9IE9VSVtpXSA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHdkLT5zdGEuYmVhY29uRnJhbWVCb2R5W29mZnNldCsrXSA9IHdkLT5zdGEuSFRDYXAuRGF0YS5FbGVtZW50SUQgOworCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjY7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3ZC0+c3RhLmJlYWNvbkZyYW1lQm9keVtvZmZzZXQrK10gPSB3ZC0+c3RhLkhUQ2FwLkJ5dGVbaSsyXSA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBFeHRlbmRlZCBIVCBDYXBhYmlsaXRpZXMgSW5mbyAqLworICAgICAgICB7CisgICAgICAgICAgICB1OF90IE9VSVszXSA9IHsgMHgwICwgMHg5MCAsIDB4NEMgfSA7CisKKyAgICAgICAgICAgIHdkLT5zdGEuYmVhY29uRnJhbWVCb2R5W29mZnNldCsrXSA9IFpNX1dMQU5fRUlEX1dQQV9JRSA7CisKKyAgICAgICAgICAgIHdkLT5zdGEuYmVhY29uRnJhbWVCb2R5W29mZnNldCsrXSA9IHdkLT5zdGEuRXh0SFRDYXAuRGF0YS5MZW5ndGggKyA0IDsKKworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3ZC0+c3RhLmJlYWNvbkZyYW1lQm9keVtvZmZzZXQrK10gPSBPVUlbaV0gOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB3ZC0+c3RhLmJlYWNvbkZyYW1lQm9keVtvZmZzZXQrK10gPSB3ZC0+c3RhLkV4dEhUQ2FwLkRhdGEuRWxlbWVudElEIDsKKworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDIyOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2QtPnN0YS5iZWFjb25GcmFtZUJvZHlbb2Zmc2V0KytdID0gd2QtPnN0YS5FeHRIVENhcC5CeXRlW2krMl0gOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICNlbmRpZgorCisgICAgICAgIHdkLT5zdGEuYmVhY29uRnJhbWVCb2R5U2l6ZSA9IG9mZnNldCA7CisKKyAgICAgICAgaWYgKHdkLT5zdGEuYmVhY29uRnJhbWVCb2R5U2l6ZSA+IFpNX0NBQ0hFRF9GUkFNRUJPRFlfU0laRSkKKyAgICAgICAgeworICAgICAgICAgICAgd2QtPnN0YS5iZWFjb25GcmFtZUJvZHlTaXplID0gWk1fQ0FDSEVEX0ZSQU1FQk9EWV9TSVpFOworICAgICAgICB9CisKKyAgICAgICAgLy8gMjAwNzA0MTYgTGV0IENyZWF0ZSBJQlNTIG5ldHdvcmsgY291bGQgZW50ZXIgdGhlIHpmd0lic3NQYXJ0bmVyTm90aWZ5IGZ1bmN0aW9uCisgICAgICAgIC8vIGJzc05vdEZvdW5kID0gRkFMU0UgOworCisgICAgICAgIHByaW50aygiVGhlIGNhcGFiaWxpdHkgaW5mbyAxID0gJTAyeFxuIiwgd2QtPnN0YS5jYXBhYmlsaXR5WzBdKSA7CisgICAgICAgIHByaW50aygiVGhlIGNhcGFiaWxpdHkgaW5mbyAyID0gJTAyeFxuIiwgd2QtPnN0YS5jYXBhYmlsaXR5WzFdKSA7CisgICAgICAgIGZvcihrPTA7IGs8d2QtPnN0YS5iZWFjb25GcmFtZUJvZHlTaXplOyBrKyspCisgICAgICAgIHsKKwkgICAgIHByaW50aygiJTAyeCAiLCB3ZC0+c3RhLmJlYWNvbkZyYW1lQm9keVtrXSkgOworICAgICAgICB9CisgICAgICAgICNpZiAwCisgICAgICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgIHpmTWVtb3J5Q29weShldmVudC5ic3NpZCwgKHU4X3QgKilic3NpZCwgNik7CisgICAgICAgIHpmTWVtb3J5Q29weShldmVudC5wZWVyTWFjQWRkciwgKHU4X3QgKil3ZC0+bWFjQWRkciwgNik7CisgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgICNlbmRpZgorI2VuZGlmCisKKyAgICAgICAgLy96bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICAvL3dkLT5zdGEuaWJzc1BhcnRuZXJTdGF0dXMgPSBaTV9JQlNTX1BBUlRORVJfTE9TVDsKKyAgICAgICAgLy96bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB3ZC0+c3RhLmlic3NCc3NJc0NyZWF0b3IgPSAwOworICAgIH0KKworY29ubmVjdF9kb25lOgorICAgIHpmSHBFbmFibGVCZWFjb24oZGV2LCBaTV9NT0RFX0lCU1MsIHdkLT5iZWFjb25JbnRlcnZhbCwgd2QtPmR0aW0sICh1OF90KXdkLT5zdGEuYXRpbVdpbmRvdyk7CisgICAgemZTdGFTZW5kQmVhY29uKGRldik7IC8vIFJlZnJlc2ggQmVhY29uIGNvbnRlbnQgZm9yIFpEMTIxMUIgSGFsUGx1cworICAgIHpmSHBTZXRBdGltV2luZG93KGRldiwgd2QtPnN0YS5hdGltV2luZG93KTsKKworICAgIC8vIFN0YXJ0IHRoZSBJQlNTIHRpbWVyIHRvIG1vbml0b3IgZm9yIG5ldyBzdGF0aW9ucworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgemZUaW1lclNjaGVkdWxlKGRldiwgWk1fRVZFTlRfSUJTU19NT05JVE9SLCBaTV9USUNLX0lCU1NfTU9OSVRPUik7CisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworCisgICAgaWYgKHdkLT56ZmNiQ29ubmVjdE5vdGlmeSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgd2QtPnpmY2JDb25uZWN0Tm90aWZ5KGRldiwgWk1fU1RBVFVTX01FRElBX0NPTk5FQ1QsIHdkLT5zdGEuYnNzaWQpOworICAgIH0KKyAgICB6ZkNoYW5nZUFkYXB0ZXJTdGF0ZShkZXYsIFpNX1NUQV9TVEFURV9DT05ORUNURUQpOworICAgIHdkLT5zdGEuY29ublBvd2VySW5IYWxmRGJtID0gemZIcEdldFRyYW5zbWl0UG93ZXIoZGV2KTsKKworI2lmZGVmIFpNX0VOQUJMRV9JQlNTX0RFTEFZRURfSk9JTl9JTkRJQ0FUSU9OCisgICAgaWYgKCAhYnNzTm90Rm91bmQgKQorICAgIHsKKyAgICAgICAgd2QtPnN0YS5pYnNzRGVsYXllZEluZCA9IDE7CisgICAgICAgIHpmTWVtb3J5Q29weSgodThfdCAqKSZ3ZC0+c3RhLmlic3NEZWxheWVkSW5kRXZlbnQsICh1OF90ICopJmV2ZW50LCBzaXplb2Yoc3RydWN0IHpzUGFydG5lck5vdGlmeUV2ZW50KSk7CisgICAgfQorI2Vsc2UKKyAgICBpZiAoICFic3NOb3RGb3VuZCApCisgICAgeworICAgICAgICBpZiAod2QtPnpmY2JJYnNzUGFydG5lck5vdGlmeSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB3ZC0+emZjYklic3NQYXJ0bmVyTm90aWZ5KGRldiwgMSwgJmV2ZW50KTsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgorCisgICAgcmV0dXJuOworCityZXRyeV9pYnNzOgorICAgIHpmQ2hhbmdlQWRhcHRlclN0YXRlKGRldiwgWk1fU1RBX1NUQVRFX0NPTk5FQ1RJTkcpOworICAgIHpmU3RhQ29ubmVjdEZhaWwoZGV2LCBaTV9TVEFUVVNfTUVESUFfRElTQ09OTkVDVF9OT1RfRk9VTkQsIHdkLT5zdGEuYnNzaWQsIDApOworICAgIHJldHVybjsKK30KKwordm9pZCB6ZlN0YVByb2Nlc3NBdGltKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bV9kZWJ1Z19tc2cwKCJSZWNlaXZpbmcgQXRpbSB3aW5kb3cgbm90aWZpY2F0aW9uIik7CisKKyAgICB3ZC0+c3RhLnJlY3ZBdGltID0gMTsKK30KKworc3RhdGljIHN0cnVjdCB6c0Jzc0luZm8qIHpmSW5mcmFGaW5kQVBUb0Nvbm5lY3QoemRldl90KiBkZXYsCisgICAgICAgIHN0cnVjdCB6c0Jzc0luZm8qIGNhbmRpZGF0ZUJzcykKK3sKKyAgICBzdHJ1Y3QgenNCc3NJbmZvKiBwQnNzSW5mbzsKKyAgICBzdHJ1Y3QgenNCc3NJbmZvKiBwTm93QnNzSW5mbz1OVUxMOworICAgIHUxNl90IGk7CisgICAgdTE2X3QgcmV0LCBhcFdlcFN0YXR1czsKKyAgICB1MzJfdCBrOworICAgIHUzMl90IGNoYW5uZWxGbGFnczsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIHBCc3NJbmZvID0gd2QtPnN0YS5ic3NMaXN0LmhlYWQ7CisKKyAgICBmb3IoaT0wOyBpPHdkLT5zdGEuYnNzTGlzdC5ic3NDb3VudDsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKCBwQnNzSW5mby0+Y2FwYWJpbGl0eVswXSAmIFpNX0JJVF80ICkKKyAgICAgICAgeworICAgICAgICAgICAgYXBXZXBTdGF0dXMgPSBaTV9FTkNSWVBUSU9OX1dFUF9FTkFCTEVEOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBXZXBTdGF0dXMgPSBaTV9FTkNSWVBUSU9OX1dFUF9ESVNBQkxFRDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICggKCh6Zk1lbW9yeUlzRXF1YWwoJihwQnNzSW5mby0+c3NpZFsyXSksIHdkLT5zdGEuc3NpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLnNzaWRMZW4pKSYmCisgICAgICAgICAgICAgICh3ZC0+c3RhLnNzaWRMZW4gPT0gcEJzc0luZm8tPnNzaWRbMV0pKXx8CisgICAgICAgICAgICAgKCh3ZC0+c3RhLnNzaWRMZW4gPT0gMCkmJgorICAgICAgICAgICAgICAgLyogY29ubmVjdCB0byBhbnkgQlNTOiBBUCdzIGFucyBTVEEncyBXRVAgc3RhdHVzIG11c3QgbWF0Y2ggKi8KKyAgICAgICAgICAgICAgKHdkLT5zdGEud2VwU3RhdHVzID09IGFwV2VwU3RhdHVzICkmJgorICAgICAgICAgICAgICAocEJzc0luZm8tPnNlY3VyaXR5VHlwZSAhPSBaTV9TRUNVUklUWV9UWVBFX1dQQSkgKSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCB3ZC0+c3RhLnNzaWRMZW4gPT0gMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiQU5ZIEJTUyBmb3VuZCIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoICgod2QtPnN0YS53ZXBTdGF0dXMgPT0gWk1fRU5DUllQVElPTl9XRVBfRElTQUJMRUQgJiYgYXBXZXBTdGF0dXMgPT0gWk1fRU5DUllQVElPTl9XRVBfRU5BQkxFRCkgfHwKKyAgICAgICAgICAgICAgICAgKHdkLT5zdGEud2VwU3RhdHVzID09IFpNX0VOQ1JZUFRJT05fV0VQX0VOQUJMRUQgJiYKKyAgICAgICAgICAgICAgICAgKGFwV2VwU3RhdHVzID09IFpNX0VOQ1JZUFRJT05fV0VQX0RJU0FCTEVEICYmIHdkLT5zdGEuZHJvcFVuZW5jcnlwdGVkUGt0cyA9PSAxKSkpICYmCisgICAgICAgICAgICAgICAgICh3ZC0+c3RhLmF1dGhNb2RlID49IFpNX0FVVEhfTU9ERV9PUEVOICYmIHdkLT5zdGEuYXV0aE1vZGUgPD0gWk1fQVVUSF9NT0RFX0FVVE8pICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6bV9kZWJ1Z19tc2cwKCJQcml2YWN5IHBvbGljeSBpcyBpbmNvbnNpc3RlbnQiKTsKKyAgICAgICAgICAgICAgICBwQnNzSW5mbyA9IHBCc3NJbmZvLT5uZXh0OworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBmb3IgV1BBIG5lZ2F0aXZlIHRlc3QgKi8KKyAgICAgICAgICAgIGlmICggIXpmQ2hlY2tBdXRoZW50aWNhdGlvbihkZXYsIHBCc3NJbmZvKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcEJzc0luZm8gPSBwQnNzSW5mby0+bmV4dDsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogQ2hlY2sgYnNzaWQgKi8KKyAgICAgICAgICAgIGlmICh3ZC0+c3RhLmJEZXNpcmVkQnNzaWQgPT0gVFJVRSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IgKGs9MDsgazw2OyBrKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAod2QtPnN0YS5kZXNpcmVkQnNzaWRba10gIT0gcEJzc0luZm8tPmJzc2lkW2tdKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB6bV9tc2cwX21tKFpNX0xWXzEsICJkZXNpcmVkIGJzc2lkIG5vdCBtYXRjaGVkIDEiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGsgIT0gNikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHptX21zZzBfbW0oWk1fTFZfMSwgImRlc2lyZWQgYnNzaWQgbm90IG1hdGNoZWQgMiIpOworICAgICAgICAgICAgICAgICAgICBwQnNzSW5mbyA9IHBCc3NJbmZvLT5uZXh0OworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIENoZWNrIHN1cHBvcnQgbW9kZSAqLworICAgICAgICAgICAgaWYgKHBCc3NJbmZvLT5mcmVxdWVuY3kgPiAzMDAwKSB7CisgICAgICAgICAgICAgICAgaWYgKCAgIChwQnNzSW5mby0+RW5hYmxlSFQgPT0gMSkKKyAgICAgICAgICAgICAgICAgICAgfHwgKHBCc3NJbmZvLT5hcENhcCAmIFpNX0FsbDExTl9BUCkgKSAvLzExbiBBUAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2hhbm5lbEZsYWdzID0gQ0hBTk5FTF9BX0hUOworICAgICAgICAgICAgICAgICAgICBpZiAocEJzc0luZm8tPmVuYWJsZUhUNDAgPT0gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbEZsYWdzIHw9IENIQU5ORUxfSFQ0MDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxGbGFncyA9IENIQU5ORUxfQTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmICggICAocEJzc0luZm8tPkVuYWJsZUhUID09IDEpCisgICAgICAgICAgICAgICAgICAgIHx8IChwQnNzSW5mby0+YXBDYXAgJiBaTV9BbGwxMU5fQVApICkgLy8xMW4gQVAKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxGbGFncyA9IENIQU5ORUxfR19IVDsKKyAgICAgICAgICAgICAgICAgICAgaWYocEJzc0luZm8tPmVuYWJsZUhUNDAgPT0gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbEZsYWdzIHw9IENIQU5ORUxfSFQ0MDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChwQnNzSW5mby0+ZXh0U3VwcG9ydGVkUmF0ZXNbMV0gPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbEZsYWdzID0gQ0hBTk5FTF9COworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbEZsYWdzID0gQ0hBTk5FTF9HOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoICAgKChjaGFubmVsRmxhZ3MgPT0gQ0hBTk5FTF9CKSAmJiAod2QtPmNvbm5lY3RNb2RlICYgWk1fQklUXzApKQorICAgICAgICAgICAgICAgIHx8ICgoY2hhbm5lbEZsYWdzID09IENIQU5ORUxfRykgJiYgKHdkLT5jb25uZWN0TW9kZSAmIFpNX0JJVF8xKSkKKyAgICAgICAgICAgICAgICB8fCAoKGNoYW5uZWxGbGFncyA9PSBDSEFOTkVMX0EpICYmICh3ZC0+Y29ubmVjdE1vZGUgJiBaTV9CSVRfMikpCisgICAgICAgICAgICAgICAgfHwgKChjaGFubmVsRmxhZ3MgJiBDSEFOTkVMX0hUMjApICYmICh3ZC0+Y29ubmVjdE1vZGUgJiBaTV9CSVRfMykpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwQnNzSW5mbyA9IHBCc3NJbmZvLT5uZXh0OworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBTa2lwIGlmIEFQIGluIGJsb2NraW5nIGxpc3QgKi8KKyAgICAgICAgICAgIGlmICgocmV0ID0gemZTdGFJc0FwSW5CbG9ja2luZ0xpc3QoZGV2LCBwQnNzSW5mby0+YnNzaWQpKSA9PSBUUlVFKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHptX21zZzBfbW0oWk1fTFZfMCwgIkNhbmRpZGF0ZSBBUCBpbiBibG9ja2luZyBMaXN0LCBza2lwIGlmIHRoZXJlJ3Mgc3RpbGxhIGNob2ljZSEiKTsKKyAgICAgICAgICAgICAgICBwTm93QnNzSW5mbyA9IHBCc3NJbmZvOworICAgICAgICAgICAgICAgIHBCc3NJbmZvID0gcEJzc0luZm8tPm5leHQ7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggcEJzc0luZm8tPmNhcGFiaWxpdHlbMF0gJiBaTV9CSVRfMCApICAvLyBjaGVjayBpZiBpbmZyYS1CU1MKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcE5vd0Jzc0luZm8gPSBwQnNzSW5mbzsKKyAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5hcFdtZUNhcGFiaWxpdHkgPSBwQnNzSW5mby0+d21lU3VwcG9ydDsKKworCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHBCc3NJbmZvID0gcEJzc0luZm8tPm5leHQ7CisgICAgfQorCitkb25lOgorICAgIGlmIChwTm93QnNzSW5mbyAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgemZ3TWVtb3J5Q29weSgodm9pZCopY2FuZGlkYXRlQnNzLCAodm9pZCopcE5vd0Jzc0luZm8sIHNpemVvZihzdHJ1Y3QgenNCc3NJbmZvKSk7CisgICAgICAgIHBOb3dCc3NJbmZvID0gY2FuZGlkYXRlQnNzOworICAgIH0KKworICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICByZXR1cm4gcE5vd0Jzc0luZm87Cit9CisKKwordm9pZCB6ZkluZnJhQ29ubmVjdE5ldHdvcmsoemRldl90KiBkZXYpCit7CisgICAgc3RydWN0IHpzQnNzSW5mbyogcEJzc0luZm87CisgICAgc3RydWN0IHpzQnNzSW5mbyogcE5vd0Jzc0luZm89TlVMTDsKKyAgICBzdHJ1Y3QgenNCc3NJbmZvIGNhbmRpZGF0ZUJzczsKKyAgICAvL3UxNl90IGksIGo9MTAwLCBxdWFsaXR5PTEwMDAwOworICAgIC8vdThfdCByZXQ9RkFMU0UsIGFwV2VwU3RhdHVzOworICAgIHU4X3QgcmV0PUZBTFNFOworICAgIHUxNl90IGs7CisgICAgdThfdCBkZW5zaXR5ID0gWk1fTVBEVV9ERU5TSVRZX05PTkU7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIC8qIFJlc2V0IGJzc05vdEZvdW5kQ291bnQgZm9yIEFkLUhvYzpJQlNTICovCisgICAgLyogTmVlZCByZXZpZXcgOiBJYnNzQ29ubiAtPiBJbmZyYUNvbm4gLT4gSWJzc0Nvbm4gZXRjLCBmbGFnL2NvdW50ZXIgcmVzZXQ/ICovCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICB3ZC0+c3RhLmJzc05vdEZvdW5kQ291bnQgPSAwOworICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICAvKiBTZXQgVHhRcyBDV01JTiwgQ1dNQVgsIEFJRlMgYW5kIFRYTyB0byBXTUUgU1RBIGRlZmF1bHQuICovCisgICAgemZVcGRhdGVEZWZhdWx0UW9zUGFyYW1ldGVyKGRldiwgMCk7CisKKyAgICB6ZlN0YVJlZnJlc2hCbG9ja0xpc3QoZGV2LCAwKTsKKworICAgIC8qIGNoYW5nZSBzdGF0ZSB0byBDT05ORUNUSU5HIGFuZCBzdG9wIHRoZSBjaGFubmVsIHNjYW5uaW5nICovCisgICAgemZDaGFuZ2VBZGFwdGVyU3RhdGUoZGV2LCBaTV9TVEFfU1RBVEVfQ09OTkVDVElORyk7CisgICAgemZQb3dlclNhdmluZ01ncldha2V1cChkZXYpOworCisgICAgd2QtPnN0YS53bWVDb25uZWN0ZWQgPSAwOworICAgIHdkLT5zdGEucHNNZ3IudGVtcFdha2VVcCA9IDA7CisgICAgd2QtPnN0YS5xb3NJbmZvID0gMDsKKyAgICB6ZlF1ZXVlRmx1c2goZGV2LCB3ZC0+c3RhLnVhcHNkUSk7CisKKyAgICB3ZC0+c3RhLmNvbm5lY3RTdGF0ZSA9IFpNX1NUQV9DT05OX1NUQVRFX05PTkU7CisKKyAgICAvL1Jlb3JkZXIgQnNzTGlzdCBieSBSU1NJLS1DV1lhbmcoKykKKyAgICB6ZkJzc0luZm9SZW9yZGVyTGlzdChkZXYpOworCisgICAgcE5vd0Jzc0luZm8gPSB6ZkluZnJhRmluZEFQVG9Db25uZWN0KGRldiwgJmNhbmRpZGF0ZUJzcyk7CisKKwlpZiAod2QtPnN0YS5TV0VuY3J5cHRFbmFibGUgIT0gMCkKKwl7CisJICAgIGlmICh3ZC0+c3RhLmJTYWZlTW9kZSA9PSAwKQorCSAgICB7CisJCSAgICB6ZlN0YURpc2FibGVTV0VuY3J5cHRpb24oZGV2KTsvL1F1aWNrbHkgcmVib290CisJICAgIH0KKwl9CisgICAgaWYgKCBwTm93QnNzSW5mbyAhPSBOVUxMICkKKyAgICB7CisgICAgICAgIC8vem1fYXNzZXJ0KHBOb3dCc3NJbmZvICE9IE5VTEwpOworCisgICAgICAgIHBCc3NJbmZvID0gcE5vd0Jzc0luZm87CisgICAgICAgIHdkLT5zdGEuc3NpZExlbiA9IHBCc3NJbmZvLT5zc2lkWzFdOworICAgICAgICB6Zk1lbW9yeUNvcHkod2QtPnN0YS5zc2lkLCAmKHBCc3NJbmZvLT5zc2lkWzJdKSwgcEJzc0luZm8tPnNzaWRbMV0pOworICAgICAgICB3ZC0+ZnJlcXVlbmN5ID0gcEJzc0luZm8tPmZyZXF1ZW5jeTsKKyAgICAgICAgLy93ZC0+c3RhLmZsYWdGcmVxQ2hhbmdpbmcgPSAxOworCisgICAgICAgIC8vemZDb3JlU2V0RnJlcXVlbmN5KGRldiwgd2QtPmZyZXF1ZW5jeSk7CisgICAgICAgIHpmVXBkYXRlQnNzaWQoZGV2LCBwQnNzSW5mby0+YnNzaWQpOworICAgICAgICB6ZlJlc2V0U3VwcG9ydFJhdGUoZGV2LCBaTV9ERUZBVUxUX1NVUFBPUlRfUkFURV9aRVJPKTsKKyAgICAgICAgemZVcGRhdGVTdXBwb3J0UmF0ZShkZXYsIHBCc3NJbmZvLT5zdXBwb3J0ZWRSYXRlcyk7CisgICAgICAgIHpmVXBkYXRlU3VwcG9ydFJhdGUoZGV2LCBwQnNzSW5mby0+ZXh0U3VwcG9ydGVkUmF0ZXMpOworCisgICAgICAgIHdkLT5iZWFjb25JbnRlcnZhbCA9IHBCc3NJbmZvLT5iZWFjb25JbnRlcnZhbFswXSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKHUxNl90KSBwQnNzSW5mby0+YmVhY29uSW50ZXJ2YWxbMV0pIDw8IDgpOworICAgICAgICBpZiAod2QtPmJlYWNvbkludGVydmFsID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHdkLT5iZWFjb25JbnRlcnZhbCA9IDEwMDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIEVTUyBiaXQgb24gKi8KKyAgICAgICAgd2QtPnN0YS5jYXBhYmlsaXR5WzBdIHw9IFpNX0JJVF8wOworICAgICAgICAvKiBJQlNTIGJpdCBvZmYgKi8KKyAgICAgICAgd2QtPnN0YS5jYXBhYmlsaXR5WzBdICY9IH5aTV9CSVRfMTsKKworICAgICAgICAvKiAxMW4gQVAgZmxhZyAqLworICAgICAgICB3ZC0+c3RhLkVuYWJsZUhUID0gcEJzc0luZm8tPkVuYWJsZUhUOworICAgICAgICB3ZC0+c3RhLlNHNDAgPSBwQnNzSW5mby0+U0c0MDsKKyNpZmRlZiBaTV9FTkFCTEVfQ0VOQworICAgICAgICBpZiAoIHBCc3NJbmZvLT5zZWN1cml0eVR5cGUgPT0gWk1fU0VDVVJJVFlfVFlQRV9DRU5DICkKKyAgICAgICAgeworICAgICAgICAgICAgd2QtPnN0YS53bWVFbmFibGVkID0gMDsgLy9EaXNhYmxlIFdNTSBpbiBDRU5DCisgICAgICAgICAgICBjZW5jSW5pdChkZXYpOworICAgICAgICAgICAgY2VuY1NldENFTkNNb2RlKGRldiwgTmRpc0NFTkNfUFNLKTsKKyAgICAgICAgICAgIHdkLT5zdGEud3BhU3RhdGUgPSBaTV9TVEFfV1BBX1NUQVRFX0lOSVQ7CisgICAgICAgICAgICAvKiBDRU5DICovCisgICAgICAgICAgICBpZiAoIHBCc3NJbmZvLT5jZW5jSWVbMV0gIT0gMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy93ZC0+c3RhLndlcFN0YXR1cyA9IFpNX0VOQ1JZUFRJT05fQ0VOQzsKKyAgICAgICAgICAgICAgICAvL3dkLT5zdGEuZW5jcnlNb2RlID0gWk1fQ0VOQzsKKyAgICAgICAgICAgICAgICB6ZndDZW5jSGFuZGxlQmVhY29uUHJvYnJlc3BvbihkZXYsICh1OF90ICopJnBCc3NJbmZvLT5jZW5jSWUsCisgICAgICAgICAgICAgICAgICAgICAgICAodThfdCAqKSZwQnNzSW5mby0+c3NpZCwgKHU4X3QgKikmcEJzc0luZm8tPm1hY2FkZHIpOworICAgICAgICAgICAgICAgIHpmTWVtb3J5Q29weSh3ZC0+c3RhLmNlbmNJZSwgcEJzc0luZm8tPmNlbmNJZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBCc3NJbmZvLT5jZW5jSWVbMV0rMik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2QtPnN0YS5jZW5jSWVbMV0gPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisjZW5kaWYgLy9aTV9FTkFCTEVfQ0VOQworICAgICAgICBpZiAoIHBCc3NJbmZvLT5zZWN1cml0eVR5cGUgPT0gWk1fU0VDVVJJVFlfVFlQRV9XUEEgKQorICAgICAgICB7CisgICAgICAgICAgICB3ZC0+c3RhLndwYVN0YXRlID0gWk1fU1RBX1dQQV9TVEFURV9JTklUOworCisgICAgICAgICAgICBpZiAoIHdkLT5zdGEud2VwU3RhdHVzID09IFpNX0VOQ1JZUFRJT05fVEtJUCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2QtPnN0YS5lbmNyeU1vZGUgPSBaTV9US0lQOworCisgICAgICAgICAgICAgICAgLyogVHVybiBvbiBzb2Z0d2FyZSBlbmNyeXB0aW9uL2RlY3J5cHRpb24gZm9yIFRLSVAgKi8KKyAgICAgICAgICAgICAgICBpZiAod2QtPnN0YS5FbmFibGVIVCA9PSAxKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgemZTdGFFbmFibGVTV0VuY3J5cHRpb24oZGV2LCAoWk1fU1dfVEtJUF9FTkNSWV9FTnxaTV9TV19US0lQX0RFQ1JZX0VOKSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyogRG8gbm90IHN1cHBvcnQgVEtJUCBpbiAxMW4gbW9kZSAqLworICAgICAgICAgICAgICAgIC8vd2QtPnN0YS5FbmFibGVIVCA9IDA7CisgICAgICAgICAgICAgICAgLy9wQnNzSW5mby0+ZW5hYmxlSFQ0MCA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICggd2QtPnN0YS53ZXBTdGF0dXMgPT0gWk1fRU5DUllQVElPTl9BRVMgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdkLT5zdGEuZW5jcnlNb2RlID0gWk1fQUVTOworCisgICAgICAgICAgICAgICAgLyogSWYgQVAgc3VwcG9ydHMgSFQgbW9kZSAqLworICAgICAgICAgICAgICAgIGlmICh3ZC0+c3RhLkVuYWJsZUhUKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyogU2V0IE1QRFUgZGVuc2l0eSB0byA4IHVzKi8KKyAgICAgICAgICAgICAgICAgICAgZGVuc2l0eSA9IFpNX01QRFVfREVOU0lUWV84VVM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHBCc3NJbmZvLT53cGFJZVsxXSAhPSAwICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6Zk1lbW9yeUNvcHkod2QtPnN0YS53cGFJZSwgcEJzc0luZm8tPndwYUllLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQnNzSW5mby0+d3BhSWVbMV0rMik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2QtPnN0YS53cGFJZVsxXSA9IDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggcEJzc0luZm8tPnJzbkllWzFdICE9IDAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHpmTWVtb3J5Q29weSh3ZC0+c3RhLnJzbkllLCBwQnNzSW5mby0+cnNuSWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCc3NJbmZvLT5yc25JZVsxXSsyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3ZC0+c3RhLnJzbkllWzFdID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisKKworICAgICAgICAvKiBjaGVjayBwcmVhbWJsZSBiaXQgKi8KKyAgICAgICAgd2QtPnByZWFtYmxlVHlwZUluVXNlZCA9IHdkLT5wcmVhbWJsZVR5cGU7CisgICAgICAgIGlmICggd2QtPnByZWFtYmxlVHlwZUluVXNlZCA9PSBaTV9QUkVBTUJMRV9UWVBFX0FVVE8gKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocEJzc0luZm8tPmNhcGFiaWxpdHlbMF0gJiBaTV9CSVRfNSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3ZC0+cHJlYW1ibGVUeXBlSW5Vc2VkID0gWk1fUFJFQU1CTEVfVFlQRV9TSE9SVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3ZC0+cHJlYW1ibGVUeXBlSW5Vc2VkID0gWk1fUFJFQU1CTEVfVFlQRV9MT05HOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHdkLT5wcmVhbWJsZVR5cGVJblVzZWQgPT0gWk1fUFJFQU1CTEVfVFlQRV9MT05HKQorICAgICAgICB7CisgICAgICAgICAgICB3ZC0+c3RhLmNhcGFiaWxpdHlbMF0gJj0gflpNX0JJVF81OworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgd2QtPnN0YS5jYXBhYmlsaXR5WzBdIHw9IFpNX0JJVF81OworICAgICAgICB9CisKKyAgICAgICAgLyogY2hlY2sgODAyLjExbiA0ME1IeiBTZXR0aW5nICovCisgICAgICAgIGlmICgocEJzc0luZm8tPmVuYWJsZUhUNDAgPT0gMSkgJiYKKyAgICAgICAgICAgICgocEJzc0luZm8tPmV4dENoT2Zmc2V0ID09IDEpIHx8IChwQnNzSW5mby0+ZXh0Q2hPZmZzZXQgPT0gMykpKQorICAgICAgICB7CisgICAgICAgICAgICB3ZC0+QmFuZFdpZHRoNDAgPSBwQnNzSW5mby0+ZW5hYmxlSFQ0MDsKKyAgICAgICAgICAgIHdkLT5FeHRPZmZzZXQgPSBwQnNzSW5mby0+ZXh0Q2hPZmZzZXQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB3ZC0+QmFuZFdpZHRoNDAgPSAwOworICAgICAgICAgICAgd2QtPkV4dE9mZnNldCA9IDA7CisgICAgICAgIH0KKworICAgICAgICAvKiBjaGVjayA4MDIuMTFIIHN1cHBvcnQgYml0ICovCisKKyAgICAgICAgLyogY2hlY2sgT3dsIEFwICovCisgICAgICAgIGlmICggcEJzc0luZm8tPmF0aE93bEFwICYgWk1fQklUXzAgKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBJbiB0aGlzIGZ1bmN0aW9uLCBGVyByZXRyeSB3aWxsIGJlIGVuYWJsZSwgWk1fTUFDX1JFR19SRVRSWV9NQVgKKyAgICAgICAgICAgICAgIHdpbGwgYmUgc2V0IHRvIDAuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHpmSHBEaXNhYmxlSHdSZXRyeShkZXYpOworICAgICAgICAgICAgd2QtPnN0YS5hdGhPd2xBcCA9IDE7CisgICAgICAgICAgICAvKiBTZXQgTVBEVSBkZW5zaXR5IHRvIDggdXMqLworICAgICAgICAgICAgZGVuc2l0eSA9IFpNX01QRFVfREVOU0lUWV84VVM7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvKiBJbiB0aGlzIGZ1bmN0aW9uLCBGVyByZXRyeSB3aWxsIGJlIGRpc2FibGUsIFpNX01BQ19SRUdfUkVUUllfTUFYCisgICAgICAgICAgICAgICB3aWxsIGJlIHNldCB0byAzLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICB6ZkhwRW5hYmxlSHdSZXRyeShkZXYpOworICAgICAgICAgICAgd2QtPnN0YS5hdGhPd2xBcCA9IDA7CisgICAgICAgIH0KKyAgICAgICAgd2QtPnJlb3JkZXIgPSAxOworCisgICAgICAgIC8qIFNldCBNUERVIGRlbnNpdHkgKi8KKyAgICAgICAgemZIcFNldE1QRFVEZW5zaXR5KGRldiwgZGVuc2l0eSk7CisKKyAgICAgICAgLyogY2hlY2sgc2hvcnQgc2xvdCB0aW1lIGJpdCAqLworICAgICAgICBpZiAoIHBCc3NJbmZvLT5jYXBhYmlsaXR5WzFdICYgWk1fQklUXzIgKQorICAgICAgICB7CisgICAgICAgICAgICB3ZC0+c3RhLmNhcGFiaWxpdHlbMV0gfD0gWk1fQklUXzI7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIHBCc3NJbmZvLT5lcnAgJiBaTV9CSVRfMSApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vem1fZGVidWdfbXNnMCgicHJvdGVjdGlvbiBtb2RlIG9uIik7CisgICAgICAgICAgICB3ZC0+c3RhLmJQcm90ZWN0aW9uTW9kZSA9IFRSVUU7CisgICAgICAgICAgICB6ZkhwU2V0U2xvdFRpbWUoZGV2LCAwKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vem1fZGVidWdfbXNnMCgicHJvdGVjdGlvbiBtb2RlIG9mZiIpOworICAgICAgICAgICAgd2QtPnN0YS5iUHJvdGVjdGlvbk1vZGUgPSBGQUxTRTsKKyAgICAgICAgICAgIHpmSHBTZXRTbG90VGltZShkZXYsIDEpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBCc3NJbmZvLT5tYXJ2ZWxBcCA9PSAxKQorICAgICAgICB7CisgICAgICAgICAgICB3ZC0+c3RhLmVuYWJsZURydkJBID0gMDsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiA4NzAxIDogTmV0R2VhciAzNTAwIChNQVJWRUxMKQorICAgICAgICAgICAgICogRG93bmxpbmsgaXNzdWUgOiBzZXQgc2xvdHRpbWUgdG8gMjAuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHpmSHBTZXRTbG90VGltZVJlZ2lzdGVyKGRldiwgMCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB3ZC0+c3RhLmVuYWJsZURydkJBID0gMTsKKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFRoaXMgaXMgbm90IGdvb2QgZm9yIGhlcmUgZG8gcmVzZXQgc2xvdCB0aW1lLgorICAgICAgICAgICAgICogSSB0aGluayBpdCBzaG91bGQgcmVzZXQgd2hlbiBsZWF2ZSBNQVJWRUxMIGFwCisgICAgICAgICAgICAgKiBvciBlbnRlciBkaXNjb25uZWN0IHN0YXRlIGV0Yy4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgemZIcFNldFNsb3RUaW1lUmVnaXN0ZXIoZGV2LCAxKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vU3RvcmUgcHJvYmUgcmVzcG9uc2UgZnJhbWUgYm9keSwgZm9yIFZJU1RBIG9ubHkKKyAgICAgICAgd2QtPnN0YS5iZWFjb25GcmFtZUJvZHlTaXplID0gcEJzc0luZm8tPmZyYW1lQm9keXNpemUgKyAxMjsKKyAgICAgICAgaWYgKHdkLT5zdGEuYmVhY29uRnJhbWVCb2R5U2l6ZSA+IFpNX0NBQ0hFRF9GUkFNRUJPRFlfU0laRSkKKyAgICAgICAgeworICAgICAgICAgICAgd2QtPnN0YS5iZWFjb25GcmFtZUJvZHlTaXplID0gWk1fQ0FDSEVEX0ZSQU1FQk9EWV9TSVpFOworICAgICAgICB9CisgICAgICAgIGZvciAoaz0wOyBrPDg7IGsrKykKKyAgICAgICAgeworICAgICAgICAgICAgd2QtPnN0YS5iZWFjb25GcmFtZUJvZHlba10gPSBwQnNzSW5mby0+dGltZVN0YW1wW2tdOworICAgICAgICB9CisgICAgICAgIHdkLT5zdGEuYmVhY29uRnJhbWVCb2R5WzhdID0gcEJzc0luZm8tPmJlYWNvbkludGVydmFsWzBdOworICAgICAgICB3ZC0+c3RhLmJlYWNvbkZyYW1lQm9keVs5XSA9IHBCc3NJbmZvLT5iZWFjb25JbnRlcnZhbFsxXTsKKyAgICAgICAgd2QtPnN0YS5iZWFjb25GcmFtZUJvZHlbMTBdID0gcEJzc0luZm8tPmNhcGFiaWxpdHlbMF07CisgICAgICAgIHdkLT5zdGEuYmVhY29uRnJhbWVCb2R5WzExXSA9IHBCc3NJbmZvLT5jYXBhYmlsaXR5WzFdOworICAgICAgICBmb3IgKGs9MDsgazwod2QtPnN0YS5iZWFjb25GcmFtZUJvZHlTaXplIC0gMTIpOyBrKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHdkLT5zdGEuYmVhY29uRnJhbWVCb2R5W2srMTJdID0gcEJzc0luZm8tPmZyYW1lQm9keVtrXTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICggKCBwQnNzSW5mby0+Y2FwYWJpbGl0eVswXSAmIFpNX0JJVF80ICkmJgorICAgICAgICAgICAgICgoIHdkLT5zdGEuYXV0aE1vZGUgPT0gWk1fQVVUSF9NT0RFX09QRU4gKXx8CisgICAgICAgICAgICAgICggd2QtPnN0YS5hdXRoTW9kZSA9PSBaTV9BVVRIX01PREVfU0hBUkVEX0tFWSl8fAorICAgICAgICAgICAgICAod2QtPnN0YS5hdXRoTW9kZSA9PSBaTV9BVVRIX01PREVfQVVUTykpICkKKyAgICAgICAgeyAgIC8qIHByaXZhY3kgZW5hYmxlZCAqLworCisgICAgICAgICAgICBpZiAoIHdkLT5zdGEud2VwU3RhdHVzID09IFpNX0VOQ1JZUFRJT05fV0VQX0RJU0FCTEVEICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6bV9kZWJ1Z19tc2cwKCJBZGFwdGVyIGlzIG5vIFdFUCwgdHJ5IHRvIGNvbm5lY3QgdG8gV0VQIEFQIik7CisgICAgICAgICAgICAgICAgcmV0ID0gRkFMU0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIERvIG5vdCBzdXBwb3J0IFdFUCBpbiAxMW4gbW9kZSAqLworICAgICAgICAgICAgaWYgKCB3ZC0+c3RhLndlcFN0YXR1cyA9PSBaTV9FTkNSWVBUSU9OX1dFUF9FTkFCTEVEICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBUdXJuIG9uIHNvZnR3YXJlIGVuY3J5cHRpb24vZGVjcnlwdGlvbiBmb3IgV0VQICovCisgICAgICAgICAgICAgICAgaWYgKHdkLT5zdGEuRW5hYmxlSFQgPT0gMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHpmU3RhRW5hYmxlU1dFbmNyeXB0aW9uKGRldiwgKFpNX1NXX1dFUF9FTkNSWV9FTnxaTV9TV19XRVBfREVDUllfRU4pKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvL3dkLT5zdGEuRW5hYmxlSFQgPSAwOworICAgICAgICAgICAgICAgIC8vd2QtPkJhbmRXaWR0aDQwID0gMDsKKyAgICAgICAgICAgICAgICAvL3dkLT5FeHRPZmZzZXQgPSAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB3ZC0+c3RhLmNhcGFiaWxpdHlbMF0gfD0gWk1fQklUXzQ7CisKKyAgICAgICAgICAgIGlmICggd2QtPnN0YS5hdXRoTW9kZSA9PSBaTV9BVVRIX01PREVfQVVUTyApCisgICAgICAgICAgICB7IC8qIFRyeSB0byB1c2Ugb3BlbiBhbmQgc2hhcmVkLWtleSBhdXRoZWh0aWNhdGlvbiBhbHRlcm5hdGl2ZWx5ICovCisgICAgICAgICAgICAgICAgaWYgKCAod2QtPnN0YS5jb25uZWN0VGltZW91dENvdW50ICUgMikgPT0gMCApCisgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEuYklzU2hhcmVkS2V5ID0gMDsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEuYklzU2hhcmVkS2V5ID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKCB3ZC0+c3RhLmF1dGhNb2RlICE9IFpNX0FVVEhfTU9ERV9TSEFSRURfS0VZICkKKyAgICAgICAgICAgIHsgICAvKiBvcGVuICBvciBhdXRvICovCisgICAgICAgICAgICAgICAgLy96ZlN0YVN0YXJ0Q29ubmVjdChkZXYsIDApOworICAgICAgICAgICAgICAgIHdkLT5zdGEuYklzU2hhcmVkS2V5ID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKCB3ZC0+c3RhLmF1dGhNb2RlICE9IFpNX0FVVEhfTU9ERV9PUEVOICkKKyAgICAgICAgICAgIHsgICAvKiBzaGFyZWQga2V5ICovCisgICAgICAgICAgICAgICAgLy96ZlN0YVN0YXJ0Q29ubmVjdChkZXYsIDEpIDsKKyAgICAgICAgICAgICAgICB3ZC0+c3RhLmJJc1NoYXJlZEtleSA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIChwQnNzSW5mby0+c2VjdXJpdHlUeXBlID09IFpNX1NFQ1VSSVRZX1RZUEVfV1BBKXx8CisgICAgICAgICAgICAgICAgIChwQnNzSW5mby0+Y2FwYWJpbGl0eVswXSAmIFpNX0JJVF80KSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2QtPnN0YS5jYXBhYmlsaXR5WzBdIHw9IFpNX0JJVF80OworICAgICAgICAgICAgICAgIC8qIGluaXRpYWxpemUgV1BBIHJlbGF0ZWQgcGFyYW1ldGVycyAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdkLT5zdGEuY2FwYWJpbGl0eVswXSAmPSAoflpNX0JJVF80KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogYXV0aGVudGljYXRpb24gd2l0aCBvcGVuIHN5c3RlbSAqLworICAgICAgICAgICAgLy96ZlN0YVN0YXJ0Q29ubmVjdChkZXYsIDApOworICAgICAgICAgICAgd2QtPnN0YS5iSXNTaGFyZWRLZXkgPSAwOworICAgICAgICB9CisKKyAgICAgICAgLyogSW1wcm92ZSBXRVAvVEtJUCBwZXJmb3JtYWNlIHdpdGggSFQgQVAsIGRldGFpbCBpbmZvcm1hdGlvbiBwbGVhc2UgbG9vayBidWcjMzI0OTUgKi8KKyAgICAgICAgLyoKKyAgICAgICAgaWYgKCAocEJzc0luZm8tPmJyb2FkY29tSFRBcCA9PSAxKQorICAgICAgICAgICAgICYmICh3ZC0+c3RhLlNXRW5jcnlwdEVuYWJsZSAhPSAwKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHpmSHBTZXRUVFNJRlNUaW1lKGRldiwgMHhhKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHpmSHBTZXRUVFNJRlNUaW1lKGRldiwgMHg4KTsKKyAgICAgICAgfQorICAgICAgICAqLworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB6bV9kZWJ1Z19tc2cwKCJEZXNpcmVkIFNTSUQgbm90IGZvdW5kIik7CisgICAgICAgIGdvdG8gemxDb25uZWN0RmFpbGVkOworICAgIH0KKworCisgICAgemZDb3JlU2V0RnJlcXVlbmN5VjIoZGV2LCB3ZC0+ZnJlcXVlbmN5LCB6ZlN0YVN0YXJ0Q29ubmVjdENiKTsKKyAgICByZXR1cm47CisKK3psQ29ubmVjdEZhaWxlZDoKKyAgICB6ZlN0YUNvbm5lY3RGYWlsKGRldiwgWk1fU1RBVFVTX01FRElBX0RJU0NPTk5FQ1RfTk9UX0ZPVU5ELCB3ZC0+c3RhLmJzc2lkLCAwKTsKKyAgICByZXR1cm47Cit9CisKK3U4X3QgemZDaGVja1dQQUF1dGgoemRldl90KiBkZXYsIHN0cnVjdCB6c0Jzc0luZm8qIHBCc3NJbmZvKQoreworICAgIHU4X3QgICByZXQ9VFJVRTsKKyAgICB1OF90ICAgcG1rQ291bnQ7CisgICAgdThfdCAgIGk7CisgICAgdTE2X3QgICBlbmNBbGdvVHlwZSA9IDA7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBpZiAoIHdkLT5zdGEud2VwU3RhdHVzID09IFpNX0VOQ1JZUFRJT05fVEtJUCApCisgICAgeworICAgICAgICBlbmNBbGdvVHlwZSA9IFpNX1RLSVA7CisgICAgfQorICAgIGVsc2UgaWYgKCB3ZC0+c3RhLndlcFN0YXR1cyA9PSBaTV9FTkNSWVBUSU9OX0FFUyApCisgICAgeworICAgICAgICBlbmNBbGdvVHlwZSA9IFpNX0FFUzsKKyAgICB9CisKKyAgICBzd2l0Y2god2QtPnN0YS5hdXRoTW9kZSkKKyAgICB7CisgICAgICAgIGNhc2UgWk1fQVVUSF9NT0RFX1dQQToKKyAgICAgICAgY2FzZSBaTV9BVVRIX01PREVfV1BBUFNLOgorICAgICAgICAgICAgaWYgKCBwQnNzSW5mby0+d3BhSWVbMV0gPT0gMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0ID0gRkFMU0U7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHBta0NvdW50ID0gcEJzc0luZm8tPndwYUllWzEyXTsKKyAgICAgICAgICAgIGZvcihpPTA7IGkgPCBwbWtDb3VudDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICggcEJzc0luZm8tPndwYUllWzE3ICsgNCppXSA9PSBlbmNBbGdvVHlwZSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXQgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICBnb3RvIGRvbmU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXQgPSBGQUxTRTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgWk1fQVVUSF9NT0RFX1dQQTI6CisgICAgICAgIGNhc2UgWk1fQVVUSF9NT0RFX1dQQTJQU0s6CisgICAgICAgICAgICBpZiAoIHBCc3NJbmZvLT5yc25JZVsxXSA9PSAwICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXQgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcG1rQ291bnQgPSBwQnNzSW5mby0+cnNuSWVbOF07CisgICAgICAgICAgICBmb3IoaT0wOyBpIDwgcG1rQ291bnQ7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIHBCc3NJbmZvLT5yc25JZVsxMyArIDQqaV0gPT0gZW5jQWxnb1R5cGUgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgZ290byBkb25lOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0ID0gRkFMU0U7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKK2RvbmU6CisgICAgcmV0dXJuIHJldDsKK30KKwordThfdCB6ZkNoZWNrQXV0aGVudGljYXRpb24oemRldl90KiBkZXYsIHN0cnVjdCB6c0Jzc0luZm8qIHBCc3NJbmZvKQoreworICAgIHU4X3QgICByZXQ9VFJVRTsKKyAgICB1MTZfdCAgZW5jQWxnb1R5cGU7CisgICAgdTE2X3QgVW5pY2FzdENpcGhlck51bTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIC8qIENvbm5lY3RpbmcgdG8gQU5ZIGhhcyBiZWVuIGNoZWNrZWQgKi8KKyAgICBpZiAoIHdkLT5zdGEuc3NpZExlbiA9PSAwICkKKyAgICB7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisKKwlzd2l0Y2god2QtPnN0YS5hdXRoTW9kZSkKKwkvL3N3aXRjaCh3ZC0+d3MuYXV0aE1vZGUpLy9RdWlja2x5IHJlYm9vdAorICAgIHsKKyAgICAgICAgY2FzZSBaTV9BVVRIX01PREVfV1BBX0FVVE86CisgICAgICAgIGNhc2UgWk1fQVVUSF9NT0RFX1dQQVBTS19BVVRPOgorICAgICAgICAgICAgZW5jQWxnb1R5cGUgPSAwOworICAgICAgICAgICAgaWYocEJzc0luZm8tPnJzbkllWzFdICE9IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVW5pY2FzdENpcGhlck51bSA9IChwQnNzSW5mby0+cnNuSWVbOF0pICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBCc3NJbmZvLT5yc25JZVs5XSA8PCA4KTsKKworICAgICAgICAgICAgICAgIC8qIElmIHRoZXJlIGlzIG9ubHkgb25lIHVuaWNhc3QgY2lwaGVyICovCisgICAgICAgICAgICAgICAgaWYgKFVuaWNhc3RDaXBoZXJOdW0gPT0gMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGVuY0FsZ29UeXBlID0gcEJzc0luZm8tPnJzbkllWzEzXTsKKyAgICAgICAgICAgICAgICAgICAgLy9lbmNBbGdvVHlwZSA9IHBCc3NJbmZvLT5yc25JZVs3XTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdTE2X3QgaWk7CisgICAgICAgICAgICAgICAgICAgIHUxNl90IGRlc2lyZWRDaXBoZXIgPSAwOworICAgICAgICAgICAgICAgICAgICB1MTZfdCBJRU9mZlNldCA9IDEzOworCisgICAgICAgICAgICAgICAgICAgIC8qIEVudW1lcmF0ZSBhbGwgdGhlIHN1cHBvcnRlZCB1bmljYXN0IGNpcGhlciAqLworICAgICAgICAgICAgICAgICAgICBmb3IgKGlpID0gMDsgaWkgPCBVbmljYXN0Q2lwaGVyTnVtOyBpaSsrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocEJzc0luZm8tPnJzbkllW0lFT2ZmU2V0K2lpKjRdID4gZGVzaXJlZENpcGhlcikKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNpcmVkQ2lwaGVyID0gcEJzc0luZm8tPnJzbkllW0lFT2ZmU2V0K2lpKjRdOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZW5jQWxnb1R5cGUgPSBkZXNpcmVkQ2lwaGVyOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICggZW5jQWxnb1R5cGUgPT0gMHgwMiApCisgICAgICAgICAgICAgICAgeworICAgIAkJCSAgICB3ZC0+c3RhLndlcFN0YXR1cyA9IFpNX0VOQ1JZUFRJT05fVEtJUDsKKworICAgIAkJCSAgICBpZiAoIHdkLT5zdGEuYXV0aE1vZGUgPT0gWk1fQVVUSF9NT0RFX1dQQV9BVVRPICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5jdXJyZW50QXV0aE1vZGUgPSBaTV9BVVRIX01PREVfV1BBMjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIC8vWk1fQVVUSF9NT0RFX1dQQVBTS19BVVRPCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEuY3VycmVudEF1dGhNb2RlID0gWk1fQVVUSF9NT0RFX1dQQTJQU0s7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIGVuY0FsZ29UeXBlID09IDB4MDQgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS53ZXBTdGF0dXMgPSBaTV9FTkNSWVBUSU9OX0FFUzsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIHdkLT5zdGEuYXV0aE1vZGUgPT0gWk1fQVVUSF9NT0RFX1dQQV9BVVRPICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5jdXJyZW50QXV0aE1vZGUgPSBaTV9BVVRIX01PREVfV1BBMjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIC8vWk1fQVVUSF9NT0RFX1dQQVBTS19BVVRPCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEuY3VycmVudEF1dGhNb2RlID0gWk1fQVVUSF9NT0RFX1dQQTJQU0s7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZihwQnNzSW5mby0+d3BhSWVbMV0gIT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBVbmljYXN0Q2lwaGVyTnVtID0gKHBCc3NJbmZvLT53cGFJZVsxMl0pICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBCc3NJbmZvLT53cGFJZVsxM10gPDwgOCk7CisKKyAgICAgICAgICAgICAgICAvKiBJZiB0aGVyZSBpcyBvbmx5IG9uZSB1bmljYXN0IGNpcGhlciAqLworICAgICAgICAgICAgICAgIGlmIChVbmljYXN0Q2lwaGVyTnVtID09IDEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBlbmNBbGdvVHlwZSA9IHBCc3NJbmZvLT53cGFJZVsxN107CisgICAgICAgICAgICAgICAgICAgIC8vZW5jQWxnb1R5cGUgPSBwQnNzSW5mby0+d3BhSWVbMTFdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB1MTZfdCBpaTsKKyAgICAgICAgICAgICAgICAgICAgdTE2X3QgZGVzaXJlZENpcGhlciA9IDA7CisgICAgICAgICAgICAgICAgICAgIHUxNl90IElFT2ZmU2V0ID0gMTc7CisKKyAgICAgICAgICAgICAgICAgICAgLyogRW51bWVyYXRlIGFsbCB0aGUgc3VwcG9ydGVkIHVuaWNhc3QgY2lwaGVyICovCisgICAgICAgICAgICAgICAgICAgIGZvciAoaWkgPSAwOyBpaSA8IFVuaWNhc3RDaXBoZXJOdW07IGlpKyspCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwQnNzSW5mby0+d3BhSWVbSUVPZmZTZXQraWkqNF0gPiBkZXNpcmVkQ2lwaGVyKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2lyZWRDaXBoZXIgPSBwQnNzSW5mby0+d3BhSWVbSUVPZmZTZXQraWkqNF07CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBlbmNBbGdvVHlwZSA9IGRlc2lyZWRDaXBoZXI7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCBlbmNBbGdvVHlwZSA9PSAweDAyICkKKyAgICAgICAgICAgICAgICB7CisgICAgCQkJICAgIHdkLT5zdGEud2VwU3RhdHVzID0gWk1fRU5DUllQVElPTl9US0lQOworCisgICAgCQkJICAgIGlmICggd2QtPnN0YS5hdXRoTW9kZSA9PSBaTV9BVVRIX01PREVfV1BBX0FVVE8gKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLmN1cnJlbnRBdXRoTW9kZSA9IFpNX0FVVEhfTU9ERV9XUEE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSAvL1pNX0FVVEhfTU9ERV9XUEFQU0tfQVVUTworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLmN1cnJlbnRBdXRoTW9kZSA9IFpNX0FVVEhfTU9ERV9XUEFQU0s7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIGVuY0FsZ29UeXBlID09IDB4MDQgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS53ZXBTdGF0dXMgPSBaTV9FTkNSWVBUSU9OX0FFUzsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIHdkLT5zdGEuYXV0aE1vZGUgPT0gWk1fQVVUSF9NT0RFX1dQQV9BVVRPICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5jdXJyZW50QXV0aE1vZGUgPSBaTV9BVVRIX01PREVfV1BBOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgLy9aTV9BVVRIX01PREVfV1BBUFNLX0FVVE8KKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5jdXJyZW50QXV0aE1vZGUgPSBaTV9BVVRIX01PREVfV1BBUFNLOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldCA9IEZBTFNFOworICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0ID0gRkFMU0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgWk1fQVVUSF9NT0RFX1dQQToKKyAgICAgICAgY2FzZSBaTV9BVVRIX01PREVfV1BBUFNLOgorICAgICAgICBjYXNlIFpNX0FVVEhfTU9ERV9XUEFfTk9ORToKKyAgICAgICAgY2FzZSBaTV9BVVRIX01PREVfV1BBMjoKKyAgICAgICAgY2FzZSBaTV9BVVRIX01PREVfV1BBMlBTSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIHBCc3NJbmZvLT5zZWN1cml0eVR5cGUgIT0gWk1fU0VDVVJJVFlfVFlQRV9XUEEgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0ID0gemZDaGVja1dQQUF1dGgoZGV2LCBwQnNzSW5mbyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFpNX0FVVEhfTU9ERV9PUEVOOgorICAgICAgICBjYXNlIFpNX0FVVEhfTU9ERV9TSEFSRURfS0VZOgorICAgICAgICBjYXNlIFpNX0FVVEhfTU9ERV9BVVRPOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICggcEJzc0luZm8tPndzY0llWzFdICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBBUCBpcyBhIEp1bXBzdGFydCBBUCwgaXQncyBvayEhIFJheQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIHBCc3NJbmZvLT5zZWN1cml0eVR5cGUgPT0gWk1fU0VDVVJJVFlfVFlQRV9XUEEgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK3U4X3QgemZTdGFJc0Nvbm5lY3RlZCh6ZGV2X3QqIGRldikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBpZiAoIHdkLT5zdGEuYWRhcHRlclN0YXRlID09IFpNX1NUQV9TVEFURV9DT05ORUNURUQgKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgICAgcmV0dXJuIEZBTFNFOworfQorCit1OF90IHpmU3RhSXNDb25uZWN0aW5nKHpkZXZfdCogZGV2KQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIGlmICggd2QtPnN0YS5hZGFwdGVyU3RhdGUgPT0gWk1fU1RBX1NUQVRFX0NPTk5FQ1RJTkcgKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgICAgcmV0dXJuIEZBTFNFOworfQorCit1OF90IHpmU3RhSXNEaXNjb25uZWN0KHpkZXZfdCogZGV2KQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIGlmICggd2QtPnN0YS5hZGFwdGVyU3RhdGUgPT0gWk1fU1RBX1NUQVRFX0RJU0NPTk5FQ1QgKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgICAgcmV0dXJuIEZBTFNFOworfQorCit1OF90IHpmQ2hhbmdlQWRhcHRlclN0YXRlKHpkZXZfdCogZGV2LCB1OF90IG5ld1N0YXRlKQoreworICAgIHU4X3QgcmV0ID0gVFJVRTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICAvL2lmICggbmV3U3RhdGUgPT0gd2QtPnN0YS5hZGFwdGVyU3RhdGUgKQorICAgIC8veworICAgIC8vICAgIHJldHVybiBGQUxTRTsKKyAgICAvL30KKworICAgIHN3aXRjaChuZXdTdGF0ZSkKKyAgICB7CisgICAgY2FzZSBaTV9TVEFfU1RBVEVfRElTQ09OTkVDVDoKKyAgICAgICAgemZSZXNldFN1cHBvcnRSYXRlKGRldiwgWk1fREVGQVVMVF9TVVBQT1JUX1JBVEVfRElTQ09OTkVDVCk7CisKKyAgICAgICAgI2lmIDEKKyAgICAgICAgICAgIHpmU2Nhbk1nclNjYW5TdG9wKGRldiwgWk1fU0NBTl9NR1JfU0NBTl9JTlRFUk5BTCk7CisgICAgICAgICNlbHNlCisgICAgICAgICAgICBpZiAoIHdkLT5zdGEuYkNoYW5uZWxTY2FuICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBzdG9wIHRoZSBhY3Rpb24gb2YgY2hhbm5lbCBzY2FubmluZyAqLworICAgICAgICAgICAgICAgIHdkLT5zdGEuYkNoYW5uZWxTY2FuID0gRkFMU0U7CisgICAgICAgICAgICAgICAgcmV0ID0gIFRSVUU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICNlbmRpZgorCisgICAgICAgIGJyZWFrOworICAgIGNhc2UgWk1fU1RBX1NUQVRFX0NPTk5FQ1RJTkc6CisgICAgICAgICNpZiAxCisgICAgICAgICAgICB6ZlNjYW5NZ3JTY2FuU3RvcChkZXYsIFpNX1NDQU5fTUdSX1NDQU5fSU5URVJOQUwpOworICAgICAgICAjZWxzZQorICAgICAgICAgICAgaWYgKCB3ZC0+c3RhLmJDaGFubmVsU2NhbiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogc3RvcCB0aGUgYWN0aW9uIG9mIGNoYW5uZWwgc2Nhbm5pbmcgKi8KKyAgICAgICAgICAgICAgICB3ZC0+c3RhLmJDaGFubmVsU2NhbiA9IEZBTFNFOworICAgICAgICAgICAgICAgIHJldCA9ICBUUlVFOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAjZW5kaWYKKworICAgICAgICBicmVhazsKKyAgICBjYXNlIFpNX1NUQV9TVEFURV9DT05ORUNURUQ6CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8vaWYgKCByZXQgKQorICAgIC8veworICAgICAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICB3ZC0+c3RhLmFkYXB0ZXJTdGF0ZSA9IG5ld1N0YXRlOworICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgICAgIHptX2RlYnVnX21zZzEoImNoYW5nZSBhZGFwdGVyIHN0YXRlID0gIiwgbmV3U3RhdGUpOworICAgIC8vfQorCisgICAgcmV0dXJuIHJldDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmU3RhTW1BZGRJZVNzaWQgICAgICAgICAgICAqLworLyogICAgICBBZGQgaW5mb3JtYXRpb24gZWxlbWVudCBTU0lEIHRvIGJ1ZmZlci4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYnVmIDogYnVmZmVyIHRvIGFkZCBpbmZvcm1hdGlvbiBlbGVtZW50ICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIG9mZnNldCA6IGFkZCBpbmZvcm1hdGlvbiBlbGVtZW50IGZyb20gdGhpcyBvZmZzZXQgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGJ1ZmZlciBvZmZzZXQgYWZ0ZXIgYWRkaW5nIGluZm9ybWF0aW9uIGVsZW1lbnQgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIEppLUh1YW5nIExlZSAgICAgICAgWnlEQVMgVGVjaG5vbG9neSBDb3Jwb3JhdGlvbiAgICAyMDA1LjExICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MTZfdCB6ZlN0YUFkZEllU3NpZCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IG9mZnNldCkKK3sKKyAgICB1MTZfdCBpOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgLyogRWxlbWVudCBJRCAqLworICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgWk1fV0xBTl9FSURfU1NJRCk7CisKKyAgICAvKiBFbGVtZW50IExlbmd0aCAqLworICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgd2QtPnN0YS5zc2lkTGVuKTsKKworICAgIC8qIEluZm9ybWF0aW9uIDogU1NJRCAqLworICAgIGZvciAoaT0wOyBpPHdkLT5zdGEuc3NpZExlbjsgaSsrKQorICAgIHsKKyAgICAgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCB3ZC0+c3RhLnNzaWRbaV0pOworICAgIH0KKworICAgIHJldHVybiBvZmZzZXQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZlN0YU1tQWRkSWVXcGEgICAgICAgICAgICAgKi8KKy8qICAgICAgQWRkIGluZm9ybWF0aW9uIGVsZW1lbnQgU1NJRCB0byBidWZmZXIuICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGJ1ZiA6IGJ1ZmZlciB0byBhZGQgaW5mb3JtYXRpb24gZWxlbWVudCAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBvZmZzZXQgOiBhZGQgaW5mb3JtYXRpb24gZWxlbWVudCBmcm9tIHRoaXMgb2Zmc2V0ICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBidWZmZXIgb2Zmc2V0IGFmdGVyIGFkZGluZyBpbmZvcm1hdGlvbiBlbGVtZW50ICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBKaS1IdWFuZyBMZWUgICAgICAgIFp5REFTIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24gICAgMjAwNi4wMSAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTE2X3QgemZTdGFBZGRJZVdwYVJzbih6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IG9mZnNldCwgdThfdCBmcmFtZVR5cGUpCit7CisgICAgdTMyX3QgIGk7CisgICAgdThfdCAgICBzc25bNjRdPXsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEVsZW1lbnQgSUQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIDB4ZGQsCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBMZW5ndGggKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIDB4MTgsCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBPVUkgdHlwZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCwgMHg1MCwgMHhmMiwgMHgwMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFZlcnNpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEsIDB4MDAsCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBHcm91cCBDaXBoZXIgU3VpdGUsIGRlZmF1bHQ9VEtJUCAqLworICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCwgMHg1MCwgMHhmMiwgMHgwMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBhaXJ3aXNlIENpcGhlciBTdWl0ZSBDb3VudCAqLworICAgICAgICAgICAgICAgICAgICAgICAgMHgwMSwgMHgwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBhaXJ3aXNlIENpcGhlciBTdWl0ZSwgZGVmYXVsdD1US0lQICovCisgICAgICAgICAgICAgICAgICAgICAgICAweDAwLCAweDUwLCAweGYyLCAweDAyLAorICAgICAgICAgICAgICAgICAgICAgICAgLyogQXV0aGVudGljYXRpb24gYW5kIEtleSBNYW5hZ2VtZW50IFN1aXRlIENvdW50ICovCisgICAgICAgICAgICAgICAgICAgICAgICAweDAxLCAweDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgLyogQXV0aGVudGljYXRpb24gdHlwZSwgZGVmYXVsdD1QU0sgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAsIDB4NTAsIDB4ZjIsIDB4MDIsCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBXUEEgY2FwYWJpbGl0eSAqLworICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCwgMHgwMAorICAgICAgICAgICAgICAgICAgICB9OworCisgICAgdThfdCAgICByc25bNjRdPXsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEVsZW1lbnQgSUQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIDB4MzAsCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBMZW5ndGggKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIDB4MTQsCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBWZXJzaW9uICovCisgICAgICAgICAgICAgICAgICAgICAgICAweDAxLCAweDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgLyogR3JvdXAgQ2lwaGVyIFN1aXRlLCBkZWZhdWx0PVRLSVAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAsIDB4MGYsIDB4YWMsIDB4MDIsCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBQYWlyd2lzZSBDaXBoZXIgU3VpdGUgQ291bnQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEsIDB4MDAsCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBQYWlyd2lzZSBDaXBoZXIgU3VpdGUsIGRlZmF1bHQ9VEtJUCAqLworICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCwgMHgwZiwgMHhhYywgMHgwMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEF1dGhlbnRpY2F0aW9uIGFuZCBLZXkgTWFuYWdlbWVudCBTdWl0ZSBDb3VudCAqLworICAgICAgICAgICAgICAgICAgICAgICAgMHgwMSwgMHgwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEF1dGhlbnRpY2F0aW9uIHR5cGUsIGRlZmF1bHQ9UFNLICovCisgICAgICAgICAgICAgICAgICAgICAgICAweDAwLCAweDBmLCAweGFjLCAweDAyLAorICAgICAgICAgICAgICAgICAgICAgICAgLyogUlNOIGNhcGFiaWxpdHkgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAsIDB4MDAKKyAgICAgICAgICAgICAgICAgICAgfTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIGlmICggd2QtPnN0YS5jdXJyZW50QXV0aE1vZGUgPT0gWk1fQVVUSF9NT0RFX1dQQVBTSyApCisgICAgeworICAgICAgICAvKiBPdmVyd3JpdGUgR3JvdXAgQ2lwaGVyIFN1aXRlIGJ5IEFQJ3Mgc2V0dGluZyAqLworICAgICAgICB6Zk1lbW9yeUNvcHkoc3NuKzgsIHdkLT5zdGEud3BhSWUrOCwgNCk7CisKKyAgICAgICAgaWYgKCB3ZC0+c3RhLndlcFN0YXR1cyA9PSBaTV9FTkNSWVBUSU9OX0FFUyApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIE92ZXJ3cml0ZSBQYWlyd2lzZSBDaXBoZXIgU3VpdGUgYnkgQUVTICovCisgICAgICAgICAgICB6Zk1lbW9yeUNvcHkoc3NuKzE0LCB6Z1dwYUFlc091aSwgNCk7CisgICAgICAgIH0KKworICAgICAgICB6ZkNvcHlUb0ludFR4QnVmZmVyKGRldiwgYnVmLCBzc24sIG9mZnNldCwgc3NuWzFdKzIpOworICAgICAgICB6Zk1lbW9yeUNvcHkod2QtPnN0YS53cGFJZSwgc3NuLCBzc25bMV0rMik7CisgICAgICAgIG9mZnNldCArPSAoc3NuWzFdKzIpOworICAgIH0KKyAgICBlbHNlIGlmICggd2QtPnN0YS5jdXJyZW50QXV0aE1vZGUgPT0gWk1fQVVUSF9NT0RFX1dQQSApCisgICAgeworICAgICAgICAvKiBPdmVyd3JpdGUgR3JvdXAgQ2lwaGVyIFN1aXRlIGJ5IEFQJ3Mgc2V0dGluZyAqLworICAgICAgICB6Zk1lbW9yeUNvcHkoc3NuKzgsIHdkLT5zdGEud3BhSWUrOCwgNCk7CisgICAgICAgIC8qIE92ZXJ3cml0ZSBLZXkgTWFuYWdlbWVudCBTdWl0ZSBieSBXUEEtUmFkaXVzICovCisgICAgICAgIHpmTWVtb3J5Q29weShzc24rMjAsIHpnV3BhUmFkaXVzT3VpLCA0KTsKKworICAgICAgICBpZiAoIHdkLT5zdGEud2VwU3RhdHVzID09IFpNX0VOQ1JZUFRJT05fQUVTICkKKyAgICAgICAgeworICAgICAgICAgICAgLyogT3ZlcndyaXRlIFBhaXJ3aXNlIENpcGhlciBTdWl0ZSBieSBBRVMgKi8KKyAgICAgICAgICAgIHpmTWVtb3J5Q29weShzc24rMTQsIHpnV3BhQWVzT3VpLCA0KTsKKyAgICAgICAgfQorCisgICAgICAgIHpmQ29weVRvSW50VHhCdWZmZXIoZGV2LCBidWYsIHNzbiwgb2Zmc2V0LCBzc25bMV0rMik7CisgICAgICAgIHpmTWVtb3J5Q29weSh3ZC0+c3RhLndwYUllLCBzc24sIHNzblsxXSsyKTsKKyAgICAgICAgb2Zmc2V0ICs9IChzc25bMV0rMik7CisgICAgfQorICAgIGVsc2UgaWYgKCB3ZC0+c3RhLmN1cnJlbnRBdXRoTW9kZSA9PSBaTV9BVVRIX01PREVfV1BBMlBTSyApCisgICAgeworICAgICAgICAvKiBPdmVyd3JpdGUgR3JvdXAgQ2lwaGVyIFN1aXRlIGJ5IEFQJ3Mgc2V0dGluZyAqLworICAgICAgICB6Zk1lbW9yeUNvcHkocnNuKzQsIHdkLT5zdGEucnNuSWUrNCwgNCk7CisKKyAgICAgICAgaWYgKCB3ZC0+c3RhLndlcFN0YXR1cyA9PSBaTV9FTkNSWVBUSU9OX0FFUyApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIE92ZXJ3cml0ZSBQYWlyd2lzZSBDaXBoZXIgU3VpdGUgYnkgQUVTICovCisgICAgICAgICAgICB6Zk1lbW9yeUNvcHkocnNuKzEwLCB6Z1dwYTJBZXNPdWksIDQpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCBmcmFtZVR5cGUgPT0gWk1fV0xBTl9GUkFNRV9UWVBFX1JFQVNPQ1JFUSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvcihpPTA7IGk8d2QtPnN0YS5wbWtpZEluZm8uYnNzaWRDb3VudDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICggemZNZW1vcnlJc0VxdWFsKCh1OF90Kikgd2QtPnN0YS5wbWtpZEluZm8uYnNzaWRJbmZvW2ldLmJzc2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1OF90Kikgd2QtPnN0YS5ic3NpZCwgNikgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyogbWF0Y2hlZCAqLworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIGkgPCB3ZC0+c3RhLnBta2lkSW5mby5ic3NpZENvdW50ICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIEZpbGwgUE1LSUQgQ291bnQgaW4gUlNOIGluZm9ybWF0aW9uIGVsZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgcnNuWzIyXSA9IDB4MDE7CisgICAgICAgICAgICAgICAgICAgIHJzblsyM10gPSAweDAwOworCisgICAgICAgICAgICAgICAgICAgIC8vIEZpbGwgUE1LSUQgaW4gUlNOIGluZm9ybWF0aW9uIGVsZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgemZNZW1vcnlDb3B5KHJzbisyNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEucG1raWRJbmZvLmJzc2lkSW5mb1tpXS5wbWtpZCwgMTYpOworCQkJICAgICAgICAgICAgICAgICByc25bMV0gKz0gMTg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgemZDb3B5VG9JbnRUeEJ1ZmZlcihkZXYsIGJ1ZiwgcnNuLCBvZmZzZXQsIHJzblsxXSsyKTsKKyAgICAgICAgemZNZW1vcnlDb3B5KHdkLT5zdGEucnNuSWUsIHJzbiwgcnNuWzFdKzIpOworICAgICAgICBvZmZzZXQgKz0gKHJzblsxXSsyKTsKKyAgICB9CisgICAgZWxzZSBpZiAoIHdkLT5zdGEuY3VycmVudEF1dGhNb2RlID09IFpNX0FVVEhfTU9ERV9XUEEyICkKKyAgICB7CisgICAgICAgIC8qIE92ZXJ3cml0ZSBHcm91cCBDaXBoZXIgU3VpdGUgYnkgQVAncyBzZXR0aW5nICovCisgICAgICAgIHpmTWVtb3J5Q29weShyc24rNCwgd2QtPnN0YS5yc25JZSs0LCA0KTsKKyAgICAgICAgLyogT3ZlcndyaXRlIEtleSBNYW5hZ2VtZW50IFN1aXRlIGJ5IFdQQTItUmFkaXVzICovCisgICAgICAgIHpmTWVtb3J5Q29weShyc24rMTYsIHpnV3BhMlJhZGl1c091aSwgNCk7CisKKyAgICAgICAgaWYgKCB3ZC0+c3RhLndlcFN0YXR1cyA9PSBaTV9FTkNSWVBUSU9OX0FFUyApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIE92ZXJ3cml0ZSBQYWlyd2lzZSBDaXBoZXIgU3VpdGUgYnkgQUVTICovCisgICAgICAgICAgICB6Zk1lbW9yeUNvcHkocnNuKzEwLCB6Z1dwYTJBZXNPdWksIDQpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCggZnJhbWVUeXBlID09IFpNX1dMQU5fRlJBTUVfVFlQRV9SRUFTT0NSRVEgfHwgKCBmcmFtZVR5cGUgPT0gWk1fV0xBTl9GUkFNRV9UWVBFX0FTT0NSRVEgKSkpCisgICAgICAgIHsKKworICAgICAgICAgICAgaWYgKHdkLT5zdGEucG1raWRJbmZvLmJzc2lkQ291bnQgIT0gMCkgeworICAgICAgICAgICAgICAgIC8vIEZpbGwgUE1LSUQgQ291bnQgaW4gUlNOIGluZm9ybWF0aW9uIGVsZW1lbnQKKyAgICAgICAgICAgICAgICByc25bMjJdID0gMTsKKyAgICAgICAgICAgICAgICByc25bMjNdID0gMDsKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqICBUaGUgY2FsbGVyIGlzIHJlc3Buc2libGUgdG8gZ2l2ZSB1cyB0aGUgcmVsZXZhbnQgUE1LSUQuCisgICAgICAgICAgICAgICAgICogIFdlJ2xsIG9ubHkgYWNjZXB0IDEgUE1LSUQgZm9yIG5vdy4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBmb3IoaT0wOyBpPHdkLT5zdGEucG1raWRJbmZvLmJzc2lkQ291bnQ7IGkrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICggemZNZW1vcnlJc0VxdWFsKCh1OF90Kikgd2QtPnN0YS5wbWtpZEluZm8uYnNzaWRJbmZvW2ldLmJzc2lkLCAodThfdCopIHdkLT5zdGEuYnNzaWQsIDYpICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgemZNZW1vcnlDb3B5KHJzbisyNCwgd2QtPnN0YS5wbWtpZEluZm8uYnNzaWRJbmZvW2ldLnBta2lkLCAxNik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByc25bMV0gKz0gMTg7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorCisgICAgICAgIHpmQ29weVRvSW50VHhCdWZmZXIoZGV2LCBidWYsIHJzbiwgb2Zmc2V0LCByc25bMV0rMik7CisgICAgICAgIHpmTWVtb3J5Q29weSh3ZC0+c3RhLnJzbkllLCByc24sIHJzblsxXSsyKTsKKyAgICAgICAgb2Zmc2V0ICs9IChyc25bMV0rMik7CisgICAgfQorCisgICAgcmV0dXJuIG9mZnNldDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmU3RhQWRkSWVJYnNzICAgICAgICAgICAgICAqLworLyogICAgICBBZGQgaW5mb3JtYXRpb24gZWxlbWVudCBJQlNTIHBhcmFtZXRlciB0byBidWZmZXIuICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYnVmIDogYnVmZmVyIHRvIGFkZCBpbmZvcm1hdGlvbiBlbGVtZW50ICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIG9mZnNldCA6IGFkZCBpbmZvcm1hdGlvbiBlbGVtZW50IGZyb20gdGhpcyBvZmZzZXQgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGJ1ZmZlciBvZmZzZXQgYWZ0ZXIgYWRkaW5nIGluZm9ybWF0aW9uIGVsZW1lbnQgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIEppLUh1YW5nIExlZSAgICAgICAgWnlEQVMgVGVjaG5vbG9neSBDb3Jwb3JhdGlvbiAgICAyMDA1LjEyICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MTZfdCB6ZlN0YUFkZEllSWJzcyh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IG9mZnNldCkKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICAvKiBFbGVtZW50IElEICovCisgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCBaTV9XTEFOX0VJRF9JQlNTKTsKKworICAgIC8qIEVsZW1lbnQgTGVuZ3RoICovCisgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCAyKTsKKworICAgIC8qIEFUSU0gd2luZG93ICovCisgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCwgd2QtPnN0YS5hdGltV2luZG93KTsKKyAgICBvZmZzZXQgKz0gMjsKKworICAgIHJldHVybiBvZmZzZXQ7Cit9CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZTdGFBZGRJZVdtZUluZm8gICAgICAgICAgICovCisvKiAgICAgIEFkZCBXTUUgSW5mb3JtYXRpb24gRWxlbWVudCB0byBidWZmZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGRldiA6IGRldmljZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBidWYgOiBidWZmZXIgdG8gYWRkIGluZm9ybWF0aW9uIGVsZW1lbnQgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgb2Zmc2V0IDogYWRkIGluZm9ybWF0aW9uIGVsZW1lbnQgZnJvbSB0aGlzIG9mZnNldCAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYnVmZmVyIG9mZnNldCBhZnRlciBhZGRpbmcgaW5mb3JtYXRpb24gZWxlbWVudCAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiBDaGVuICAgICAgICBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgIDIwMDYuNiAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UxNl90IHpmU3RhQWRkSWVXbWVJbmZvKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3Qgb2Zmc2V0LCB1OF90IHFvc0luZm8pCit7CisgICAgLyogRWxlbWVudCBJRCAqLworICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgWk1fV0xBTl9FSURfV0lGSV9JRSk7CisKKyAgICAvKiBFbGVtZW50IExlbmd0aCAqLworICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgNyk7CisKKyAgICAvKiBPVUkgKi8KKyAgICB6bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIDB4MDApOworICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgMHg1MCk7CisgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCAweEYyKTsKKyAgICB6bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIDB4MDIpOworICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgMHgwMCk7CisgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCAweDAxKTsKKworICAgIC8qIFFvUyBJbmZvICovCisgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCBxb3NJbmZvKTsKKworICAgIHJldHVybiBvZmZzZXQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZlN0YUFkZEllUG93ZXJDYXAgICAgICAgICAgKi8KKy8qICAgICAgQWRkIGluZm9ybWF0aW9uIGVsZW1lbnQgUG93ZXIgY2FwYWJpbGl0eSB0byBidWZmZXIuICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGJ1ZiA6IGJ1ZmZlciB0byBhZGQgaW5mb3JtYXRpb24gZWxlbWVudCAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBvZmZzZXQgOiBhZGQgaW5mb3JtYXRpb24gZWxlbWVudCBmcm9tIHRoaXMgb2Zmc2V0ICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBidWZmZXIgb2Zmc2V0IGFmdGVyIGFkZGluZyBpbmZvcm1hdGlvbiBlbGVtZW50ICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBTaGFyb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwMDcuMTIgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTE2X3QgemZTdGFBZGRJZVBvd2VyQ2FwKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3Qgb2Zmc2V0KQoreworICAgIHU4X3QgTWF4VHhQb3dlcjsKKyAgICB1OF90IE1pblR4UG93ZXI7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICAvKiBFbGVtZW50IElEICovCisgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCBaTV9XTEFOX0VJRF9QT1dFUl9DQVBBQklMSVRZKTsKKworICAgIC8qIEVsZW1lbnQgTGVuZ3RoICovCisgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCAyKTsKKworICAgIE1pblR4UG93ZXIgPSAodThfdCkoemZIcEdldE1pblR4UG93ZXIoZGV2KS8yKTsKKyAgICBNYXhUeFBvd2VyID0gKHU4X3QpKHpmSHBHZXRNYXhUeFBvd2VyKGRldikvMik7CisKKyAgICAvKiBNaW4gVHJhbnNtaXQgUG93ZXIgQ2FwICovCisgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCsrLCBNaW5UeFBvd2VyKTsKKworICAgIC8qIE1heCBUcmFuc21pdCBQb3dlciBDYXAgKi8KKyAgICB6bXdfdHhfYnVmX3dyaXRlaChkZXYsIGJ1Ziwgb2Zmc2V0KyssIE1heFR4UG93ZXIpOworCisgICAgcmV0dXJuIG9mZnNldDsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZlN0YUFkZEllU3VwcG9ydENoICAgICAgICAgICAgICAqLworLyogICAgICBBZGQgaW5mb3JtYXRpb24gZWxlbWVudCBzdXBwb3J0ZWQgY2hhbm5lbHMgdG8gYnVmZmVyLiAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGJ1ZiA6IGJ1ZmZlciB0byBhZGQgaW5mb3JtYXRpb24gZWxlbWVudCAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBvZmZzZXQgOiBhZGQgaW5mb3JtYXRpb24gZWxlbWVudCBmcm9tIHRoaXMgb2Zmc2V0ICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBidWZmZXIgb2Zmc2V0IGFmdGVyIGFkZGluZyBpbmZvcm1hdGlvbiBlbGVtZW50ICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBTaGFyb24gICAgICAgICAgICAyMDA3LjEyICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MTZfdCB6ZlN0YUFkZEllU3VwcG9ydENoKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3Qgb2Zmc2V0KQoreworCisgICAgdThfdCAgIGk7CisgICAgdTE2X3QgIGNvdW50XzI0RyA9IDA7CisgICAgdTE2X3QgIGNvdW50XzVHID0gMDsKKyAgICB1MTZfdCAgY2hhbm5lbE51bTsKKyAgICB1OF90ICAgbGVuZ3RoOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgZm9yIChpID0gMDsgaSA8IHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsQ250OyBpKyspCisgICAgeworICAgICAgICBpZiAod2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxbaV0uY2hhbm5lbCA8IDMwMDApCisgICAgICAgIHsgLy8gMi40SHoKKyAgICAgICAgICAgIGNvdW50XzI0RysrOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeyAvLyA1R0h6CisgICAgICAgICAgICBjb3VudF81RysrOworICAgICAgICB9CisgICAgfQorCisgICAgbGVuZ3RoID0gKHU4X3QpKGNvdW50XzVHICogMiArIDIpOyAvLzVHIGZpbGwgYnkgcGFpciwgMiw0RyAoY29udGludW91cyBjaGFubmVscykgZmlsbCAyIGJ5dGVzCisKKyAgICAvKiBFbGVtZW50IElEICovCisgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCBaTV9XTEFOX0VJRF9TVVBQT1JURURfQ0hBTk5FTFMgKTsKKworICAgIC8qIEVsZW1lbnQgTGVuZ3RoICovCisgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCBsZW5ndGgpOworCisgICAgLy8gMi40R0h6IChjb250aW51b3VzIGNoYW5uZWxzKQorICAgIC8qIEZpcnN0IGNoYW5uZWwgbnVtYmVyICovCisgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCsrLCAxKTsgLy9TdGFydCBmcm9tIGNoYW5ubGUgMQorICAgIC8qIE51bWJlciBvZiBjaGFubmVscyAqLworICAgIHptd190eF9idWZfd3JpdGVoKGRldiwgYnVmLCBvZmZzZXQrKywgY291bnRfMjRHKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCB3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbENudCA7IGkrKykKKyAgICB7CisgICAgICAgIGlmICh3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbFtpXS5jaGFubmVsID4gNDAwMCAmJiB3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbFtpXS5jaGFubmVsIDwgNTAwMCkKKyAgICAgICAgeyAvLyA1R0h6IDQwMDAgLTUwMDBNaHoKKyAgICAgICAgICAgIGNoYW5uZWxOdW0gPSAod2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxbaV0uY2hhbm5lbC00MDAwKS81OworICAgICAgICAgICAgLyogRmlyc3QgY2hhbm5lbCBudW1iZXIgKi8KKyAgICAgICAgICAgIHptd190eF9idWZfd3JpdGVoKGRldiwgYnVmLCBvZmZzZXQrKywgY2hhbm5lbE51bSk7CisgICAgICAgICAgICAvKiBOdW1iZXIgb2YgY2hhbm5lbHMgKi8KKyAgICAgICAgICAgIHptd190eF9idWZfd3JpdGVoKGRldiwgYnVmLCBvZmZzZXQrKywgMSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAod2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxbaV0uY2hhbm5lbCA+PSA1MDAwKQorICAgICAgICB7IC8vIDVHSHogPjUwMDBNaHoKKyAgICAgICAgICAgIGNoYW5uZWxOdW0gPSAod2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxbaV0uY2hhbm5lbC01MDAwKS81OworICAgICAgICAgICAgLyogRmlyc3QgY2hhbm5lbCBudW1iZXIgKi8KKyAgICAgICAgICAgIHptd190eF9idWZfd3JpdGVoKGRldiwgYnVmLCBvZmZzZXQrKywgY2hhbm5lbE51bSk7CisgICAgICAgICAgICAvKiBOdW1iZXIgb2YgY2hhbm5lbHMgKi8KKyAgICAgICAgICAgIHptd190eF9idWZfd3JpdGVoKGRldiwgYnVmLCBvZmZzZXQrKywgMSk7CisgICAgICAgIH0KKyAgICB9CisgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgcmV0dXJuIG9mZnNldDsKK30KKwordm9pZCB6ZlN0YVN0YXJ0Q29ubmVjdENiKHpkZXZfdCogZGV2KQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHpmU3RhU3RhcnRDb25uZWN0KGRldiwgd2QtPnN0YS5iSXNTaGFyZWRLZXkpOworfQorCit2b2lkIHpmU3RhU3RhcnRDb25uZWN0KHpkZXZfdCogZGV2LCB1OF90IGJJc1NoYXJlZEtleSkKK3sKKyAgICB1MzJfdCBwMSwgcDI7CisgICAgdThfdCBuZXdDb25uU3RhdGU7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIC8qIHAxX2xvdyA9IGFsZ29yaXRobSBudW1iZXIsIHAxX2hpZ2ggPSB0cmFuc2FjdGlvbiBzZXF1ZW5jZSBudW1iZXIgKi8KKyAgICBpZiAoIGJJc1NoYXJlZEtleSApCisgICAgeworICAgICAgICAvL3dkLT5zdGEuY29ubmVjdFN0YXRlID0gWk1fU1RBX0NPTk5fU1RBVEVfQVVUSF9TSEFSRV8xOworICAgICAgICBuZXdDb25uU3RhdGUgPSBaTV9TVEFfQ09OTl9TVEFURV9BVVRIX1NIQVJFXzE7CisgICAgICAgIHptX2RlYnVnX21zZzAoIlpNX1NUQV9DT05OX1NUQVRFX0FVVEhfU0hBUkVfMSIpOworICAgICAgICBwMSA9IFpNX0FVVEhfQUxHT19TSEFSRURfS0VZOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvL3dkLT5zdGEuY29ubmVjdFN0YXRlID0gWk1fU1RBX0NPTk5fU1RBVEVfQVVUSF9PUEVOOworICAgICAgICBuZXdDb25uU3RhdGUgPSBaTV9TVEFfQ09OTl9TVEFURV9BVVRIX09QRU47CisgICAgICAgIHptX2RlYnVnX21zZzAoIlpNX1NUQV9DT05OX1NUQVRFX0FVVEhfT1BFTiIpOworICAgICAgICBpZiggd2QtPnN0YS5sZWFwRW5hYmxlZCApCisgICAgICAgICAgICBwMSA9IFpNX0FVVEhfQUxHT19MRUFQOworICAgICAgICBlbHNlCisgICAgICAgICAgICBwMSA9IFpNX0FVVEhfQUxHT19PUEVOX1NZU1RFTTsKKyAgICB9CisKKyAgICAvKiBzdGF0dXMgY29kZSAqLworICAgIHAyID0gMHgwOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICB3ZC0+c3RhLmNvbm5lY3RUaW1lciA9IHdkLT50aWNrOworICAgIHdkLT5zdGEuY29ubmVjdFN0YXRlID0gbmV3Q29ublN0YXRlOworICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICAvKiBzZW5kIHRoZSAxc3QgYXV0aGVudGljYXRpb24gZnJhbWUgKi8KKyAgICB6ZlNlbmRNbUZyYW1lKGRldiwgWk1fV0xBTl9GUkFNRV9UWVBFX0FVVEgsIHdkLT5zdGEuYnNzaWQsIHAxLCBwMiwgMCk7CisKKyAgICByZXR1cm47Cit9CisKK3ZvaWQgemZTZW5kTnVsbERhdGEoemRldl90KiBkZXYsIHU4X3QgdHlwZSkKK3sKKyAgICB6YnVmX3QqIGJ1ZjsKKyAgICAvL3UxNl90IGFkZHJUYmxTaXplOworICAgIC8vc3RydWN0IHpzQWRkclRibCBhZGRyVGJsOworICAgIHUxNl90IGVycjsKKyAgICB1MTZfdCBobGVuOworICAgIHUxNl90IGhlYWRlclsoMzQrOCsxKS8yXTsKKyAgICB1MTZfdCBiY2FzdEFkZHJbM10gPSB7MHhmZmZmLDB4ZmZmZiwweGZmZmZ9OworICAgIHUxNl90ICpkc3RBZGRyOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgaWYgKChidWYgPSB6ZndCdWZBbGxvY2F0ZShkZXYsIDEwMjQpKSA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgem1fbXNnMF9tbShaTV9MVl8wLCAiQWxsb2MgbW0gYnVmIEZhaWwhIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB6ZndCdWZTZXRTaXplKGRldiwgYnVmLCAwKTsKKworICAgIC8vem1fbXNnMl9tbShaTV9MVl8yLCAiYnVmLT5sZW49IiwgYnVmLT5sZW4pOworCisgICAgaWYgKCB3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9JQlNTKQorICAgIHsKKyAgICAgICAgZHN0QWRkciA9IGJjYXN0QWRkcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZHN0QWRkciA9IHdkLT5zdGEuYnNzaWQ7CisgICAgfQorCisgICAgaWYgKHdkLT5zdGEud21lQ29ubmVjdGVkICE9IDApCisgICAgeworICAgICAgICAvKiBJZiBjb25uZWN0IHRvIGEgV01NIEFQLCBTZW5kIFFvUyBOdWxsIGRhdGEgKi8KKyAgICAgICAgaGxlbiA9IHpmVHhHZW5NbUhlYWRlcihkZXYsIFpNX1dMQU5fRlJBTUVfVFlQRV9RT1NfTlVMTCwgZHN0QWRkciwgaGVhZGVyLCAwLCBidWYsIDAsIDApOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBobGVuID0gemZUeEdlbk1tSGVhZGVyKGRldiwgWk1fV0xBTl9GUkFNRV9UWVBFX05VTEwsIGRzdEFkZHIsIGhlYWRlciwgMCwgYnVmLCAwLCAwKTsKKyAgICB9CisKKyAgICBpZiAod2QtPndsYW5Nb2RlID09IFpNX01PREVfSU5GUkFTVFJVQ1RVUkUpCisgICAgeworICAgICAgICBoZWFkZXJbNF0gfD0gMHgwMTAwOyAvL1RPRFMgYml0CisgICAgfQorCisgICAgaWYgKCB0eXBlID09IDEgKQorICAgIHsKKyAgICAgICAgaGVhZGVyWzRdIHw9IDB4MTAwMDsKKyAgICB9CisKKyAgICAvKiBHZXQgYnVmZmVyIERNQSBhZGRyZXNzICovCisgICAgLy9pZiAoKGFkZHJUYmxTaXplID0gemZ3QnVmTWFwRG1hKGRldiwgYnVmLCAmYWRkclRibCkpID09IDApCisgICAgLy9pZiAoKGFkZHJUYmxTaXplID0gemZ3TWFwVHhEbWEoZGV2LCBidWYsICZhZGRyVGJsKSkgPT0gMCkKKyAgICAvL3sKKyAgICAvLyAgICBnb3RvIHpsRXJyb3I7CisgICAgLy99CisKKyAgICAvKmluY3JlYXNlIHVuaWNhc3QgZnJhbWUgY291bnRlciovCisgICAgd2QtPmNvbW1UYWxseS50eFVuaWNhc3RGcm0rKzsKKworICAgIGlmICgoZXJyID0gemZIcFNlbmQoZGV2LCBoZWFkZXIsIGhsZW4sIE5VTEwsIDAsIE5VTEwsIDAsIGJ1ZiwgMCwKKyAgICAgICAgICAgIFpNX0lOVEVSTkFMX0FMTE9DX0JVRiwgMCwgMHhmZikpICE9IFpNX1NVQ0NFU1MpCisgICAgeworICAgICAgICBnb3RvIHpsRXJyb3I7CisgICAgfQorCisKKyAgICByZXR1cm47CisKK3psRXJyb3I6CisKKyAgICB6ZndCdWZGcmVlKGRldiwgYnVmLCAwKTsKKyAgICByZXR1cm47CisKK30KKwordm9pZCB6ZlNlbmRQU1BvbGwoemRldl90KiBkZXYpCit7CisgICAgemJ1Zl90KiBidWY7CisgICAgLy91MTZfdCBhZGRyVGJsU2l6ZTsKKyAgICAvL3N0cnVjdCB6c0FkZHJUYmwgYWRkclRibDsKKyAgICB1MTZfdCBlcnI7CisgICAgdTE2X3QgaGxlbjsKKyAgICB1MTZfdCBoZWFkZXJbKDgrMjQrMSkvMl07CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBpZiAoKGJ1ZiA9IHpmd0J1ZkFsbG9jYXRlKGRldiwgMTAyNCkpID09IE5VTEwpCisgICAgeworICAgICAgICB6bV9tc2cwX21tKFpNX0xWXzAsICJBbGxvYyBtbSBidWYgRmFpbCEiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHpmd0J1ZlNldFNpemUoZGV2LCBidWYsIDApOworCisgICAgLy96bV9tc2cyX21tKFpNX0xWXzIsICJidWYtPmxlbj0iLCBidWYtPmxlbik7CisKKyAgICB6ZlR4R2VuTW1IZWFkZXIoZGV2LCBaTV9XTEFOX0ZSQU1FX1RZUEVfUFNQT0xMLCB3ZC0+c3RhLmJzc2lkLCBoZWFkZXIsIDAsIGJ1ZiwgMCwgMCk7CisKKyAgICBoZWFkZXJbMF0gPSAyMDsKKyAgICBoZWFkZXJbNF0gfD0gMHgxMDAwOworICAgIGhlYWRlcls1XSA9IHdkLT5zdGEuYWlkIHwgMHhjMDAwOyAvL0JvdGggYml0LTE0IGFuZCBiaXQtMTUgYXJlIDEKKyAgICBobGVuID0gMTYgKyA4OworCisgICAgLyogR2V0IGJ1ZmZlciBETUEgYWRkcmVzcyAqLworICAgIC8vaWYgKChhZGRyVGJsU2l6ZSA9IHpmd0J1Zk1hcERtYShkZXYsIGJ1ZiwgJmFkZHJUYmwpKSA9PSAwKQorICAgIC8vaWYgKChhZGRyVGJsU2l6ZSA9IHpmd01hcFR4RG1hKGRldiwgYnVmLCAmYWRkclRibCkpID09IDApCisgICAgLy97CisgICAgLy8gICAgZ290byB6bEVycm9yOworICAgIC8vfQorCisgICAgaWYgKChlcnIgPSB6ZkhwU2VuZChkZXYsIGhlYWRlciwgaGxlbiwgTlVMTCwgMCwgTlVMTCwgMCwgYnVmLCAwLAorICAgICAgICAgICAgWk1fSU5URVJOQUxfQUxMT0NfQlVGLCAwLCAweGZmKSkgIT0gWk1fU1VDQ0VTUykKKyAgICB7CisgICAgICAgIGdvdG8gemxFcnJvcjsKKyAgICB9CisKKyAgICByZXR1cm47CisKK3psRXJyb3I6CisKKyAgICB6ZndCdWZGcmVlKGRldiwgYnVmLCAwKTsKKyAgICByZXR1cm47CisKK30KKwordm9pZCB6ZlNlbmRCQSh6ZGV2X3QqIGRldiwgdTE2X3Qgc3RhcnRfc2VxLCB1OF90ICpiaXRtYXApCit7CisgICAgemJ1Zl90KiBidWY7CisgICAgLy91MTZfdCBhZGRyVGJsU2l6ZTsKKyAgICAvL3N0cnVjdCB6c0FkZHJUYmwgYWRkclRibDsKKyAgICB1MTZfdCBlcnI7CisgICAgdTE2X3QgaGxlbjsKKyAgICB1MTZfdCBoZWFkZXJbKDgrMjQrMSkvMl07CisgICAgdTE2X3QgaSwgb2Zmc2V0ID0gMDsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIGlmICgoYnVmID0gemZ3QnVmQWxsb2NhdGUoZGV2LCAxMDI0KSkgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIHptX21zZzBfbW0oWk1fTFZfMCwgIkFsbG9jIG1tIGJ1ZiBGYWlsISIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgemZ3QnVmU2V0U2l6ZShkZXYsIGJ1ZiwgMTIpOyAvLyAyOCA9IEZDIDIgKyBEVSAyICsgUkEgNiArIFRBIDYgKyBCQUMgMiArIFNFUSAyICsgQml0TWFwIDgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDEyID0gQkFDIDIgKyBTRVEgMiArIEJpdE1hcCA4CisKKyAgICAvL3ptX21zZzJfbW0oWk1fTFZfMiwgImJ1Zi0+bGVuPSIsIGJ1Zi0+bGVuKTsKKworICAgIHpmVHhHZW5NbUhlYWRlcihkZXYsIFpNX1dMQU5fRlJBTUVfVFlQRV9CQSwgd2QtPnN0YS5ic3NpZCwgaGVhZGVyLCAwLCBidWYsIDAsIDApOworCisgICAgaGVhZGVyWzBdID0gMzI7IC8qIE1BQyBoZWFkZXIgMTYgKyBCQSBjb250cm9sIDIgKyBCQSBpbmZvIDEwICsgRkNTIDQqLworICAgIGhlYWRlclsxXSA9IDB4NDsgIC8qIE5vIEFDSyAqLworCisgICAgLyogc2VuZCBieSBPRkRNIDZNICovCisgICAgaGVhZGVyWzJdID0gKHUxNl90KSh6Y1JhdGVUb1BoeUN0cmxbNF0gJiAweGZmZmYpOworICAgIGhlYWRlclszXSA9ICh1MTZfdCkoemNSYXRlVG9QaHlDdHJsWzRdPj4xNikgJiAweGZmZmY7CisKKyAgICBobGVuID0gMTYgKyA4OyAgLyogTUFDIGhlYWRlciAxNiArIGNvbnRyb2wgOCovCisgICAgb2Zmc2V0ID0gMDsKKyAgICB6bXdfdHhfYnVmX3dyaXRlaChkZXYsIGJ1Ziwgb2Zmc2V0LCAweDA1KTsgLypjb21wcmVzc2VkIGJpdG1hcCBvbiovCisgICAgb2Zmc2V0Kz0yOworICAgIHptd190eF9idWZfd3JpdGVoKGRldiwgYnVmLCBvZmZzZXQsIHN0YXJ0X3NlcSk7CisgICAgb2Zmc2V0Kz0yOworCisgICAgZm9yIChpPTA7IGk8ODsgaSsrKSB7CisgICAgICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQsIGJpdG1hcFtpXSk7CisgICAgICAgIG9mZnNldCsrOworICAgIH0KKworICAgIGlmICgoZXJyID0gemZIcFNlbmQoZGV2LCBoZWFkZXIsIGhsZW4sIE5VTEwsIDAsIE5VTEwsIDAsIGJ1ZiwgMCwKKyAgICAgICAgICAgIFpNX0lOVEVSTkFMX0FMTE9DX0JVRiwgMCwgMHhmZikpICE9IFpNX1NVQ0NFU1MpCisgICAgeworICAgICAgICBnb3RvIHpsRXJyb3I7CisgICAgfQorCisgICAgcmV0dXJuOworCit6bEVycm9yOgorCisgICAgemZ3QnVmRnJlZShkZXYsIGJ1ZiwgMCk7CisgICAgcmV0dXJuOworCit9CisKK3ZvaWQgemZTdGFHZXRUeFJhdGUoemRldl90KiBkZXYsIHUxNl90KiBtYWNBZGRyLCB1MzJfdCogcGh5Q3RybCwKKyAgICAgICAgdTE2X3QqIHJjUHJvYmluZ0ZsYWcpCit7CisgICAgdThfdCAgIGFkZHJbNl0sIGk7CisgICAgdThfdCAgIHJhdGU7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICBaTV9NQUNfV09SRF9UT19CWVRFKG1hY0FkZHIsIGFkZHIpOworICAgICpwaHlDdHJsID0gMDsKKworICAgIGlmICggd2QtPndsYW5Nb2RlID09IFpNX01PREVfSU5GUkFTVFJVQ1RVUkUgKQorICAgIHsKKyAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgcmF0ZSA9ICh1OF90KXpmUmF0ZUN0cmxHZXRUeFJhdGUoZGV2LCAmd2QtPnN0YS5vcHBvc2l0ZUluZm9bMF0ucmNDZWxsLCByY1Byb2JpbmdGbGFnKTsKKy8vI2lmZGVmIFpNX0ZCNTAKKyAgICAgICAgLy9yYXRlID0gMjc7CisvLyNlbmRpZgorICAgICAgICAqcGh5Q3RybCA9IHpjUmF0ZVRvUGh5Q3RybFtyYXRlXTsKKyAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgZm9yKGk9MDsgaTx3ZC0+c3RhLm9wcG9zaXRlQ291bnQ7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCBhZGRyWzBdICYmIDB4MDEgPT0gMSApIC8vIFRoZSBkZWZhdWx0IGJlYWNvbiB0cmFuc21pdHRlZCByYXRlIGlzIENDSyBhbmQgMSBNYnBzICwgYnV0IHRoZSBhIG1vZGUgc2hvdWxkIHVzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9GRE0gbW9kdWxhdGlvbiBhbmQgNk1icHMgdG8gdHJhbnNtaXQgYmVhY29uLgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vcmF0ZSA9ICh1OF90KXpmUmF0ZUN0cmxHZXRUeFJhdGUoZGV2LCAmd2QtPnN0YS5vcHBvc2l0ZUluZm9baV0ucmNDZWxsLCByY1Byb2JpbmdGbGFnKTsKKyAgICAgICAgICAgICAgICByYXRlID0gd2QtPnN0YS5vcHBvc2l0ZUluZm9baV0ucmNDZWxsLm9wZXJhdGlvblJhdGVTZXRbMF07CisgICAgICAgICAgICAgICAgKnBoeUN0cmwgPSB6Y1JhdGVUb1BoeUN0cmxbcmF0ZV07CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICggemZNZW1vcnlJc0VxdWFsKGFkZHIsIHdkLT5zdGEub3Bwb3NpdGVJbmZvW2ldLm1hY0FkZHIsIDYpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByYXRlID0gKHU4X3QpemZSYXRlQ3RybEdldFR4UmF0ZShkZXYsICZ3ZC0+c3RhLm9wcG9zaXRlSW5mb1tpXS5yY0NlbGwsIHJjUHJvYmluZ0ZsYWcpOworICAgICAgICAgICAgICAgICpwaHlDdHJsID0gemNSYXRlVG9QaHlDdHJsW3JhdGVdOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgfQorCisgICAgcmV0dXJuOworfQorCitzdHJ1Y3QgenNNaWNWYXIqIHpmU3RhR2V0UnhNaWNLZXkoemRldl90KiBkZXYsIHpidWZfdCogYnVmKQoreworICAgIHU4X3Qga2V5SW5kZXg7CisgICAgdThfdCBkYTA7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICAvKiBpZiBuZWVkIG5vdCBjaGVjayBNSUMsIHJldHVybiBOVUxMICovCisgICAgaWYgKCAoKHdkLT5zdGEuZW5jcnlNb2RlICE9IFpNX1RLSVApJiYod2QtPnN0YS5lbmNyeU1vZGUgIT0gWk1fQUVTKSl8fAorICAgICAgICAgKHdkLT5zdGEud3BhU3RhdGUgPCBaTV9TVEFfV1BBX1NUQVRFX1BLX09LKSApCisgICAgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBkYTAgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBaTV9XTEFOX0hFQURFUl9BMV9PRkZTRVQpOworCisgICAgaWYgKCh6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCAwKSAmIDB4ODApID09IDB4ODApCisgICAgICAgIGtleUluZGV4ID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgWk1fV0xBTl9IRUFERVJfSVZfT0ZGU0VUKzUpOyAvKiBRb3MgUGFja2V0Ki8KKyAgICBlbHNlCisgICAgICAgIGtleUluZGV4ID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgWk1fV0xBTl9IRUFERVJfSVZfT0ZGU0VUKzMpOyAvKiBub3JtYWwgUGFja2V0Ki8KKyAgICBrZXlJbmRleCA9IChrZXlJbmRleCAmIDB4YzApID4+IDY7CisKKyAgICByZXR1cm4gKCZ3ZC0+c3RhLnJ4TWljS2V5W2tleUluZGV4XSk7Cit9CisKK3N0cnVjdCB6c01pY1ZhciogemZTdGFHZXRUeE1pY0tleSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgLyogaWYgbmVlZCBub3QgY2hlY2sgTUlDLCByZXR1cm4gTlVMTCAqLworICAgIC8vaWYgKCAoKHdkLT5zdGEuZW5jcnlNb2RlICE9IFpNX1RLSVApJiYod2QtPnN0YS5lbmNyeU1vZGUgIT0gWk1fQUVTKSl8fAorICAgIC8vICAgICAod2QtPnN0YS53cGFTdGF0ZSA8IFpNX1NUQV9XUEFfU1RBVEVfUEtfT0spICkKKyAgICBpZiAoICh3ZC0+c3RhLmVuY3J5TW9kZSAhPSBaTV9US0lQKSB8fCAod2QtPnN0YS53cGFTdGF0ZSA8IFpNX1NUQV9XUEFfU1RBVEVfUEtfT0spICkKKyAgICB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHJldHVybiAoJndkLT5zdGEudHhNaWNLZXkpOworfQorCit1MTZfdCB6ZlN0YVJ4VmFsaWRhdGVGcmFtZSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpCit7CisgICAgdThfdCAgIGZyYW1lVHlwZSwgZnJhbWVDdHJsOworICAgIHU4X3QgICBkYTA7CisgICAgLy91MTZfdCAgc2FbM107CisgICAgdTE2X3QgIHJldDsKKyAgICB1MTZfdCAgaTsKKyAgICAvL3U4X3QgICAgc2EwOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgZnJhbWVUeXBlID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgMCk7CisgICAgZGEwID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgWk1fV0xBTl9IRUFERVJfQTFfT0ZGU0VUKTsKKyAgICAvL3NhMCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIFpNX1dMQU5fSEVBREVSX0EyX09GRlNFVCk7CisKKyAgICBpZiAoICghemZTdGFJc0Nvbm5lY3RlZChkZXYpKSYmKChmcmFtZVR5cGUgJiAweGYpID09IFpNX1dMQU5fREFUQV9GUkFNRSkgKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFpNX0VSUl9EQVRBX0JFRk9SRV9DT05ORUNURUQ7CisgICAgfQorCisKKyAgICBpZiAoICh6ZlN0YUlzQ29ubmVjdGVkKGRldikpJiYoKGZyYW1lVHlwZSAmIDB4ZikgPT0gWk1fV0xBTl9EQVRBX0ZSQU1FKSApCisgICAgeworICAgICAgICAvKiBjaGVjayBCU1NJRCAqLworICAgICAgICBpZiAoIHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0lORlJBU1RSVUNUVVJFICkKKyAgICAgICAgeworICAgICAgICAgICAgLyogQmlnIEVuZGlhbiBhbmQgTGl0dGxlIEVuZGlhbiBDb21wYXRpYmlsaXR5ICovCisgICAgICAgICAgICB1MTZfdCBtYWNbM107CisgICAgICAgICAgICBtYWNbMF0gPSB6bXdfY3B1X3RvX2xlMTYod2QtPnN0YS5ic3NpZFswXSk7CisgICAgICAgICAgICBtYWNbMV0gPSB6bXdfY3B1X3RvX2xlMTYod2QtPnN0YS5ic3NpZFsxXSk7CisgICAgICAgICAgICBtYWNbMl0gPSB6bXdfY3B1X3RvX2xlMTYod2QtPnN0YS5ic3NpZFsyXSk7CisgICAgICAgICAgICBpZiAoICF6ZlJ4QnVmZmVyRXF1YWxUb1N0cihkZXYsIGJ1ZiwgKHU4X3QgKiltYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaTV9XTEFOX0hFQURFUl9BMl9PRkZTRVQsIDYpICkKKyAgICAgICAgICAgIHsKKy8qV2Ugd2lsbCBnZXQgbG90cyBvZiBnYXJiYWdlIGRhdGEsIGVzcGVjaWFsbHkgaW4gQUVTIG1vZGUuKi8KKy8qVG8gYXZvaWQgc2VuZGluZyB0b28gbWFueSBkZWF1dGhlbnRpY2F0aW9uIGZyYW1lcyBpbiBTVEEgbW9kZSwgbWFyayBpdC4qLworI2lmIDAKKyAgICAgICAgICAgICAgICAvKiBJZiB1bmljYXN0IGZyYW1lLCBzZW5kIGRlYXV0aCB0byB0aGUgdHJhbnNtaXR0ZXIgKi8KKyAgICAgICAgICAgICAgICBpZiAoKCBkYTAgJiAweDAxICkgPT0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpPDM7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgc2FbaV0gPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCBaTV9XTEFOX0hFQURFUl9BMl9PRkZTRVQrKGkqMikpOworICAgICAgICAgICAgICAgICAgICB9CisJCQkJCS8qIElmIG11dGlsY2FzdCBhZGRyZXNzLCBkb24ndCBzZW5kIGRlYXV0aGVudGljYXRpb24qLworCQkJCQlpZiAoKCBzYTAgJiAweDAxICkgPT0gMCkKKwkgICAgICAgICAgICAgICAgICAJemZTZW5kTW1GcmFtZShkZXYsIFpNX1dMQU5fRlJBTUVfVFlQRV9ERUFVVEgsIHNhLCA3LCAwLCAwKTsKKyAgICAgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgICAgICAgICByZXR1cm4gWk1fRVJSX0RBVEFfQlNTSURfTk9UX01BVENIRUQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoIHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0lCU1MgKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBCaWcgRW5kaWFuIGFuZCBMaXR0bGUgRW5kaWFuIENvbXBhdGliaWxpdHkgKi8KKyAgICAgICAgICAgIHUxNl90IG1hY1szXTsKKyAgICAgICAgICAgIG1hY1swXSA9IHptd19jcHVfdG9fbGUxNih3ZC0+c3RhLmJzc2lkWzBdKTsKKyAgICAgICAgICAgIG1hY1sxXSA9IHptd19jcHVfdG9fbGUxNih3ZC0+c3RhLmJzc2lkWzFdKTsKKyAgICAgICAgICAgIG1hY1syXSA9IHptd19jcHVfdG9fbGUxNih3ZC0+c3RhLmJzc2lkWzJdKTsKKyAgICAgICAgICAgIGlmICggIXpmUnhCdWZmZXJFcXVhbFRvU3RyKGRldiwgYnVmLCAodThfdCAqKW1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFpNX1dMQU5fSEVBREVSX0EzX09GRlNFVCwgNikgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBaTV9FUlJfREFUQV9CU1NJRF9OT1RfTUFUQ0hFRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZyYW1lQ3RybCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIDEpOworCisgICAgICAgIC8qIGNoZWNrIHNlY3VyaXR5IGJpdCAqLworICAgICAgICBpZiAoIHdkLT5zdGEuZHJvcFVuZW5jcnlwdGVkUGt0cyAmJgorICAgICAgICAgICAgICh3ZC0+c3RhLndlcFN0YXR1cyAhPSBaTV9FTkNSWVBUSU9OX1dFUF9ESVNBQkxFRCApJiYKKyAgICAgICAgICAgICAoICEoZnJhbWVDdHJsICYgWk1fQklUXzYpICkgKQorICAgICAgICB7ICAgLyogc2VjdXJpdHkgb24sIGJ1dCBnb3QgZGF0YSB3aXRob3V0IGVuY3J5cHRpb24gKi8KKworICAgICAgICAgICAgI2lmIDEKKyAgICAgICAgICAgIHJldCA9IFpNX0VSUl9EQVRBX05PVF9FTkNSWVBURUQ7CisgICAgICAgICAgICBpZiAoIHdkLT5zdGEucFN0YVJ4U2VjdXJpdHlDaGVja0NiICE9IE5VTEwgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldCA9IHdkLT5zdGEucFN0YVJ4U2VjdXJpdHlDaGVja0NiKGRldiwgYnVmKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXQgPSBaTV9FUlJfREFUQV9OT1RfRU5DUllQVEVEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHJldCA9PSBaTV9FUlJfREFUQV9OT1RfRU5DUllQVEVEKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdkLT5jb21tVGFsbHkuc3dSeERyb3BVbmVuY3J5cHRlZENvdW50Kys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgI2Vsc2UKKyAgICAgICAgICAgIGlmICggKHdkLT5zdGEud2VwU3RhdHVzICE9IFpNX0VOQ1JZUFRJT05fVEtJUCkmJgorICAgICAgICAgICAgICAgICAod2QtPnN0YS53ZXBTdGF0dXMgIT0gWk1fRU5DUllQVElPTl9BRVMpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gWk1fRVJSX0RBVEFfTk9UX0VOQ1JZUFRFRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICNlbmRpZgorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIFpNX1NVQ0NFU1M7Cit9CisKK3ZvaWQgemZTdGFNaWNGYWlsdXJlSGFuZGxpbmcoemRldl90KiBkZXYsIHpidWZfdCogYnVmKQoreworICAgIHU4X3QgICBkYTA7CisgICAgdThfdCAgIG1pY05vdGlmeSA9IDE7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgaWYgKCB3ZC0+c3RhLndwYVN0YXRlIDwgIFpNX1NUQV9XUEFfU1RBVEVfUEtfT0sgKQorICAgIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICB3ZC0+c3RhLmNtTWljRmFpbHVyZUNvdW50Kys7CisKKyAgICBpZiAoIHdkLT5zdGEuY21NaWNGYWlsdXJlQ291bnQgPT0gMSApCisgICAgeworICAgICAgICB6bV9kZWJ1Z19tc2cwKCJnZXQgdGhlIGZpcnN0IE1JQyBmYWlsdXJlIik7CisgICAgICAgIC8vemZUaW1lclNjaGVkdWxlKGRldiwgWk1fRVZFTlRfQ01fVElNRVIsIFpNX1RJQ0tfQ01fVElNRU9VVCk7CisKKyAgICAgICAgLyogVGltZXIgUmVzb2x1dGlvbiBvbiBXaW5YUCBpcyAxNS8xNiBtcyAgKi8KKyAgICAgICAgLyogRGVjcmVhc2UgVGltZSBvZmZzZXQgZm9yIDxYUD4gQ291bnRlciBNZWFzdXJlICovCisgICAgICAgIHpmVGltZXJTY2hlZHVsZShkZXYsIFpNX0VWRU5UX0NNX1RJTUVSLCBaTV9USUNLX0NNX1RJTUVPVVQgLSBaTV9USUNLX0NNX1RJTUVPVVRfT0ZGU0VUKTsKKyAgICB9CisgICAgZWxzZSBpZiAoIHdkLT5zdGEuY21NaWNGYWlsdXJlQ291bnQgPT0gMiApCisgICAgeworICAgICAgICB6bV9kZWJ1Z19tc2cwKCJnZXQgdGhlIHNlY29uZCBNSUMgZmFpbHVyZSIpOworICAgICAgICAvKiByZXNlcnZlIDIgc2Vjb25kIGZvciBPUyB0byBzZW5kIE1JQyBmYWlsdXJlIHJlcG9ydCB0byBBUCAqLworICAgICAgICB3ZC0+c3RhLmNtRGlzYWxsb3dTc2lkTGVuZ3RoID0gd2QtPnN0YS5zc2lkTGVuOworICAgICAgICB6Zk1lbW9yeUNvcHkod2QtPnN0YS5jbURpc2FsbG93U3NpZCwgd2QtPnN0YS5zc2lkLCB3ZC0+c3RhLnNzaWRMZW4pOworICAgICAgICAvL3dkLT5zdGEuY21NaWNGYWlsdXJlQ291bnQgPSAwOworICAgICAgICB6ZlRpbWVyQ2FuY2VsKGRldiwgWk1fRVZFTlRfQ01fVElNRVIpOworICAgICAgICAvL3pmVGltZXJTY2hlZHVsZShkZXYsIFpNX0VWRU5UX0NNX0RJU0NPTk5FQ1QsIFpNX1RJQ0tfQ01fRElTQ09OTkVDVCk7CisKKyAgICAgICAgLyogVGltZXIgUmVzb2x1dGlvbiBvbiBXaW5YUCBpcyAxNS8xNiBtcyAgKi8KKyAgICAgICAgLyogRGVjcmVhc2UgVGltZSBvZmZzZXQgZm9yIDxYUD4gQ291bnRlciBNZWFzdXJlICovCisgICAgICAgIHpmVGltZXJTY2hlZHVsZShkZXYsIFpNX0VWRU5UX0NNX0RJU0NPTk5FQ1QsIFpNX1RJQ0tfQ01fRElTQ09OTkVDVCAtIFpNX1RJQ0tfQ01fRElTQ09OTkVDVF9PRkZTRVQpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBtaWNOb3RpZnkgPSAwOworICAgIH0KKworICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICBpZiAobWljTm90aWZ5ID09IDEpCisgICAgeworICAgICAgICBkYTAgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBaTV9XTEFOX0hFQURFUl9BMV9PRkZTRVQpOworICAgICAgICBpZiAoIGRhMCAmIDB4MDEgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAod2QtPnpmY2JNaWNGYWlsdXJlTm90aWZ5ICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2QtPnpmY2JNaWNGYWlsdXJlTm90aWZ5KGRldiwgd2QtPnN0YS5ic3NpZCwgWk1fTUlDX0dST1VQX0VSUk9SKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh3ZC0+emZjYk1pY0ZhaWx1cmVOb3RpZnkgIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3ZC0+emZjYk1pY0ZhaWx1cmVOb3RpZnkoZGV2LCB3ZC0+c3RhLmJzc2lkLCBaTV9NSUNfUEFJUldJU0VfRVJST1IpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCisKK3U4X3QgemZTdGFCbG9ja1dsYW5TY2FuKHpkZXZfdCogZGV2KQoreworICAgIHU4X3QgICByZXQ9RkFMU0U7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBpZiAoIHdkLT5zdGEuYkNoYW5uZWxTY2FuICkKKyAgICB7CisgICAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK3ZvaWQgemZTdGFSZXNldFN0YXR1cyh6ZGV2X3QqIGRldiwgdThfdCBiSW5pdCkKK3sKKyAgICB1OF90ICAgaTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHpmSHBEaXNhYmxlQmVhY29uKGRldik7CisKKyAgICB3ZC0+ZHRpbSA9IDE7CisgICAgd2QtPnN0YS5jYXBhYmlsaXR5WzBdID0gMHgwMTsKKyAgICB3ZC0+c3RhLmNhcGFiaWxpdHlbMV0gPSAweDAwOworICAgIC8qIDgwMi4xMWggKi8KKyAgICBpZiAod2QtPnN0YS5ERlNFbmFibGUgfHwgd2QtPnN0YS5UUENFbmFibGUpCisgICAgICAgIHdkLT5zdGEuY2FwYWJpbGl0eVsxXSB8PSBaTV9CSVRfMDsKKworICAgIC8qIHJlbGVhc2UgcXVldWVkIHBhY2tldHMgKi8KKyAgICBmb3IoaT0wOyBpPHdkLT5zdGEuaWJzc1BTRGF0YUNvdW50OyBpKyspCisgICAgeworICAgICAgICB6ZndCdWZGcmVlKGRldiwgd2QtPnN0YS5pYnNzUFNEYXRhUXVldWVbaV0sIDApOworICAgIH0KKworICAgIGZvcihpPTA7IGk8d2QtPnN0YS5zdGFQU0RhdGFDb3VudDsgaSsrKQorICAgIHsKKyAgICAgICAgemZ3QnVmRnJlZShkZXYsIHdkLT5zdGEuc3RhUFNEYXRhUXVldWVbaV0sIDApOworICAgIH0KKworICAgIHdkLT5zdGEuaWJzc1BTRGF0YUNvdW50ID0gMDsKKyAgICB3ZC0+c3RhLnN0YVBTRGF0YUNvdW50ID0gMDsKKyAgICB6Zlplcm9NZW1vcnkoKHU4X3QqKSAmd2QtPnN0YS5zdGFQU0xpc3QsIHNpemVvZihzdHJ1Y3QgenNTdGFQU0xpc3QpKTsKKworICAgIHdkLT5zdGEud21lQ29ubmVjdGVkID0gMDsKKyAgICB3ZC0+c3RhLnBzTWdyLnRlbXBXYWtlVXAgPSAwOworICAgIHdkLT5zdGEucW9zSW5mbyA9IDA7CisgICAgemZRdWV1ZUZsdXNoKGRldiwgd2QtPnN0YS51YXBzZFEpOworCisgICAgcmV0dXJuOworCit9CisKK3ZvaWQgemZTdGFJYnNzTW9uaXRvcmluZyh6ZGV2X3QqIGRldiwgdThfdCByZXNldCkKK3sKKyAgICB1MTZfdCBpOworICAgIHUxNl90IG9wcG9zaXRlQ291bnQ7CisgICAgc3RydWN0IHpzUGFydG5lck5vdGlmeUV2ZW50IGV2ZW50OworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIC8vem1fZGVidWdfbXNnMSgiemZTdGFJYnNzTW9uaXRvcmluZyAlZCIsIHdkLT5zdGEub3Bwb3NpdGVDb3VudCk7CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgaWYgKCB3ZC0+c3RhLm9wcG9zaXRlQ291bnQgPT0gMCApCisgICAgeworICAgICAgICBnb3RvIGRvbmU7CisgICAgfQorCisgICAgaWYgKCB3ZC0+c3RhLmJDaGFubmVsU2NhbiApCisgICAgeworICAgICAgICBnb3RvIGRvbmU7CisgICAgfQorCisgICAgb3Bwb3NpdGVDb3VudCA9IHdkLT5zdGEub3Bwb3NpdGVDb3VudDsKKworICAgIGZvcihpPTA7IGkgPCBaTV9NQVhfT1BQT1NJVEVfQ09VTlQ7IGkrKykKKyAgICB7CisgICAgICAgIGlmICggb3Bwb3NpdGVDb3VudCA9PSAwICkKKyAgICAgICAgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIHJlc2V0ICkKKyAgICAgICAgeworICAgICAgICAgICAgd2QtPnN0YS5vcHBvc2l0ZUluZm9baV0udmFsaWQgPSAwOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCB3ZC0+c3RhLm9wcG9zaXRlSW5mb1tpXS52YWxpZCA9PSAwICkKKyAgICAgICAgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBvcHBvc2l0ZUNvdW50LS07CisKKyAgICAgICAgaWYgKCB3ZC0+c3RhLm9wcG9zaXRlSW5mb1tpXS5hbGl2ZUNvdW50ZXIgKQorICAgICAgICB7CisgICAgICAgICAgICB6bV9kZWJ1Z19tc2cxKCJTZXR0aW5nIGFsaXZlIHRvICIsIHdkLT5zdGEub3Bwb3NpdGVJbmZvW2ldLmFsaXZlQ291bnRlcik7CisKKyAgICAgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICAgICAgICAgIGlmICggd2QtPnN0YS5vcHBvc2l0ZUluZm9baV0uYWxpdmVDb3VudGVyICE9IFpNX0lCU1NfUEVFUl9BTElWRV9DT1VOVEVSICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6ZlNlbmRNbUZyYW1lKGRldiwgWk1fV0xBTl9GUkFNRV9UWVBFX1BST0JFUkVRLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHUxNl90Kil3ZC0+c3RhLm9wcG9zaXRlSW5mb1tpXS5tYWNBZGRyLCAxLCAwLCAwKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgIHdkLT5zdGEub3Bwb3NpdGVJbmZvW2ldLmFsaXZlQ291bnRlci0tOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiemZTdGFJYnNzTW9uaXRvcmluZyByZW1vdmUgdGhlIHBlZXIgc3RhdGlvbiIpOworICAgICAgICAgICAgemZNZW1vcnlDb3B5KGV2ZW50LmJzc2lkLCAodThfdCAqKSh3ZC0+c3RhLmJzc2lkKSwgNik7CisgICAgICAgICAgICB6Zk1lbW9yeUNvcHkoZXZlbnQucGVlck1hY0FkZHIsIHdkLT5zdGEub3Bwb3NpdGVJbmZvW2ldLm1hY0FkZHIsIDYpOworCisgICAgICAgICAgICB3ZC0+c3RhLm9wcG9zaXRlSW5mb1tpXS52YWxpZCA9IDA7CisgICAgICAgICAgICB3ZC0+c3RhLm9wcG9zaXRlQ291bnQtLTsKKyAgICAgICAgICAgIGlmICh3ZC0+emZjYklic3NQYXJ0bmVyTm90aWZ5ICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgICAgICB3ZC0+emZjYklic3NQYXJ0bmVyTm90aWZ5KGRldiwgMCwgJmV2ZW50KTsKKyAgICAgICAgICAgICAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCitkb25lOgorICAgIGlmICggcmVzZXQgPT0gMCApCisgICAgeworICAgICAgICB6ZlRpbWVyU2NoZWR1bGUoZGV2LCBaTV9FVkVOVF9JQlNTX01PTklUT1IsIFpNX1RJQ0tfSUJTU19NT05JVE9SKTsKKyAgICB9CisKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworfQorCit2b2lkIHpmSW5pdFBhcnRuZXJOb3RpZnlFdmVudCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHN0cnVjdCB6c1BhcnRuZXJOb3RpZnlFdmVudCAqZXZlbnQpCit7CisgICAgdTE2X3QgICpwZWVyTWFjQWRkcjsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHBlZXJNYWNBZGRyID0gKHUxNl90ICopZXZlbnQtPnBlZXJNYWNBZGRyOworCisgICAgemZNZW1vcnlDb3B5KGV2ZW50LT5ic3NpZCwgKHU4X3QgKikod2QtPnN0YS5ic3NpZCksIDYpOworICAgIHBlZXJNYWNBZGRyWzBdID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgWk1fV0xBTl9IRUFERVJfQTJfT0ZGU0VUKTsKKyAgICBwZWVyTWFjQWRkclsxXSA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIFpNX1dMQU5fSEVBREVSX0EyX09GRlNFVCArIDIpOworICAgIHBlZXJNYWNBZGRyWzJdID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgWk1fV0xBTl9IRUFERVJfQTJfT0ZGU0VUICsgNCk7Cit9CisKK3ZvaWQgemZTdGFJbml0T3Bwb3NpdGVJbmZvKHpkZXZfdCogZGV2KQoreworICAgIGludCBpOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgZm9yKGk9MDsgaTxaTV9NQVhfT1BQT1NJVEVfQ09VTlQ7IGkrKykKKyAgICB7CisgICAgICAgIHdkLT5zdGEub3Bwb3NpdGVJbmZvW2ldLnZhbGlkID0gMDsKKyAgICAgICAgd2QtPnN0YS5vcHBvc2l0ZUluZm9baV0uYWxpdmVDb3VudGVyID0gWk1fSUJTU19QRUVSX0FMSVZFX0NPVU5URVI7CisgICAgfQorfQorI2lmZGVmIFpNX0VOQUJMRV9DRU5DCit1MTZfdCB6ZlN0YUFkZEllQ2VuYyh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IG9mZnNldCkKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBpZiAod2QtPnN0YS5jZW5jSWVbMV0gIT0gMCkKKyAgICB7CisgICAgICAgIHpmQ29weVRvSW50VHhCdWZmZXIoZGV2LCBidWYsIHdkLT5zdGEuY2VuY0llLCBvZmZzZXQsIHdkLT5zdGEuY2VuY0llWzFdKzIpOworICAgICAgICBvZmZzZXQgKz0gKHdkLT5zdGEuY2VuY0llWzFdKzIpOworICAgIH0KKyAgICByZXR1cm4gb2Zmc2V0OworfQorI2VuZGlmIC8vWk1fRU5BQkxFX0NFTkMKK3UxNl90IHpmU3RhUHJvY2Vzc0FjdGlvbih6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpCit7CisgICAgdThfdCBjYXRlZ29yeSwgYWN0aW9uRGV0YWlsczsKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBjYXRlZ29yeSA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIDI0KTsKKyAgICBhY3Rpb25EZXRhaWxzID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgMjUpOworICAgIHN3aXRjaCAoY2F0ZWdvcnkpCisgICAgeworICAgICAgICBjYXNlIDA6CQkvL1NwZWN0cnVtIE1hbmFnZW1lbnQKKwkgICAgICAgIHN3aXRjaChhY3Rpb25EZXRhaWxzKQorCSAgICAgICAgeworCSAgICAgICAgCWNhc2UgMDoJCQkvL01lYXN1cmVtZW50IFJlcXVlc3QKKwkgICAgICAgIAkJYnJlYWs7CisJICAgICAgICAJY2FzZSAxOgkJCS8vTWVhc3VyZW1lbnQgUmVwb3J0CisJICAgICAgICAJCS8vUHJvY2Vzc0FjdGlvblNwZWN0cnVtRnJhbWVfTWVhc3VyZW1lbnRSZXBvcnQoQWRhcHRlcixwQWN0aW9uQm9keSszKTsKKwkgICAgICAgIAkJYnJlYWs7CisJICAgICAgICAJY2FzZSAyOgkJCS8vVFBDIHJlcXVlc3QKKyAgICAgICAgICAgICAgICAgICAgLy9pZiAod2QtPnN0YS5UUENFbmFibGUpCisgICAgICAgICAgICAgICAgICAgIC8vICAgIHpmU3RhVXBkYXRlRG90MTFIVFBDKGRldiwgYnVmKTsKKwkgICAgICAgIAkJYnJlYWs7CisJICAgICAgICAJY2FzZSAzOgkJCS8vVFBDIHJlcG9ydAorICAgICAgICAgICAgICAgICAgICAvL2lmICh3ZC0+c3RhLlRQQ0VuYWJsZSkKKyAgICAgICAgICAgICAgICAgICAgLy8gICAgemZTdGFVcGRhdGVEb3QxMUhUUEMoZGV2LCBidWYpOworCSAgICAgICAgCQlicmVhazsKKwkgICAgICAgIAljYXNlIDQ6CQkJLy9DaGFubmVsIFN3aXRjaCBBbm5vdW5jZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgaWYgKHdkLT5zdGEuREZTRW5hYmxlKQorICAgICAgICAgICAgICAgICAgICAgICAgemZTdGFVcGRhdGVEb3QxMUhERlMoZGV2LCBidWYpOworCSAgICAgICAgCQlicmVhazsKKwkgICAgICAgIAlkZWZhdWx0OgorCSAgICAgICAgCQl6bV9kZWJ1Z19tc2cxKCJBY3Rpb24gRnJhbWUgY29udGFpbiBub3Qgc3VwcG9ydCBhY3Rpb24gZmllbGQgIiwgYWN0aW9uRGV0YWlscyk7CisJICAgICAgICAJCWJyZWFrOworCSAgICAgICAgfQorICAgICAgICAJYnJlYWs7CisgICAgICAgIGNhc2UgWk1fV0xBTl9CTE9DS19BQ0tfQUNUSU9OX0ZSQU1FOgorICAgICAgICAgICAgemZBZ2dCbG9ja0Fja0FjdGlvbkZyYW1lKGRldiwgYnVmKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE3OgkvL1FvcyBNYW5hZ2VtZW50CisgICAgICAgIAlicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworLyogRGV0ZXJtaW5lIHRoZSB0aW1lIG5vdCBzZW5kIGJlYWNvbiAsIGlmIG1vcmUgdGhhbiBzb21lIHZhbHVlICwKKyAgIHJlLXdyaXRlIHRoZSBiZWFjb24gc3RhcnQgYWRkcmVzcyAqLwordm9pZCB6ZlJlV3JpdGVCZWFjb25TdGFydEFkZHJlc3MoemRldl90KiBkZXYpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgd2QtPnRpY2tJYnNzU2VuZEJlYWNvbisrOyAgICAvLyBJbmNyZWFzZSAxIHBlciAxMG1zIC4KKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgaWYgKCB3ZC0+dGlja0lic3NTZW5kQmVhY29uID09IDQwICkKKyAgICB7CisvLyAgICAgICAgRGJnUHJpbnQoIjIwMDcwNzI3Iik7CisgICAgICAgIHpmSHBFbmFibGVCZWFjb24oZGV2LCBaTV9NT0RFX0lCU1MsIHdkLT5iZWFjb25JbnRlcnZhbCwgd2QtPmR0aW0sICh1OF90KXdkLT5zdGEuYXRpbVdpbmRvdyk7CisgICAgICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgIHdkLT50aWNrSWJzc1NlbmRCZWFjb24gPSAwOworICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIH0KK30KKworc3RydWN0IHpzVGtpcFNlZWQqIHpmU3RhR2V0UnhTZWVkKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZikKK3sKKyAgICB1OF90IGtleUluZGV4OworICAgIHU4X3QgZGEwOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgLyogaWYgbmVlZCBub3QgY2hlY2sgTUlDLCByZXR1cm4gTlVMTCAqLworICAgIGlmICggKCh3ZC0+c3RhLmVuY3J5TW9kZSAhPSBaTV9US0lQKSYmKHdkLT5zdGEuZW5jcnlNb2RlICE9IFpNX0FFUykpfHwKKyAgICAgICAgICh3ZC0+c3RhLndwYVN0YXRlIDwgWk1fU1RBX1dQQV9TVEFURV9QS19PSykgKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgZGEwID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgWk1fV0xBTl9IRUFERVJfQTFfT0ZGU0VUKTsKKworICAgIGlmICgoem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgMCkgJiAweDgwKSA9PSAweDgwKQorICAgICAgICBrZXlJbmRleCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIFpNX1dMQU5fSEVBREVSX0lWX09GRlNFVCs1KTsgLyogUW9zIFBhY2tldCovCisgICAgZWxzZQorICAgICAgICBrZXlJbmRleCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIFpNX1dMQU5fSEVBREVSX0lWX09GRlNFVCszKTsgLyogbm9ybWFsIFBhY2tldCovCisgICAga2V5SW5kZXggPSAoa2V5SW5kZXggJiAweGMwKSA+PiA2OworCisgICAgcmV0dXJuICgmd2QtPnN0YS5yeFNlZWRba2V5SW5kZXhdKTsKK30KKwordm9pZCB6ZlN0YUVuYWJsZVNXRW5jcnlwdGlvbih6ZGV2X3QgKmRldiwgdThfdCB2YWx1ZSkKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB3ZC0+c3RhLlNXRW5jcnlwdEVuYWJsZSA9IHZhbHVlOworICAgIHpmSHBTV0RlY3J5cHQoZGV2LCAxKTsKKyAgICB6ZkhwU1dFbmNyeXB0KGRldiwgMSk7Cit9CisKK3ZvaWQgemZTdGFEaXNhYmxlU1dFbmNyeXB0aW9uKHpkZXZfdCAqZGV2KQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHdkLT5zdGEuU1dFbmNyeXB0RW5hYmxlID0gMDsKKyAgICB6ZkhwU1dEZWNyeXB0KGRldiwgMCk7CisgICAgemZIcFNXRW5jcnlwdChkZXYsIDApOworfQorCit1MTZfdCB6ZkNvbXB1dGVCc3NJbmZvV2VpZ2h0VmFsdWUoemRldl90ICpkZXYsIHU4X3QgaXNCTW9kZSwgdThfdCBpc0hULCB1OF90IGlzSFQ0MCwgdThfdCBzaWduYWxTdHJlbmd0aCkKK3sKKwl1OF90ICB3ZWlnaHRPZkIgICAgICAgICAgID0gMDsKKwl1OF90ICB3ZWlnaHRPZkFHQmVsb3dUaHIgID0gMDsKKwl1OF90ICB3ZWlnaHRPZkFHVXBUaHIgICAgID0gMTU7CisJdThfdCAgd2VpZ2h0T2ZOMjBCZWxvd1RociA9IDE1OworCXU4X3QgIHdlaWdodE9mTjIwVXBUaHIgICAgPSAzMDsKKwl1OF90ICB3ZWlnaHRPZk40MEJlbG93VGhyID0gMTY7CisJdThfdCAgd2VpZ2h0T2ZONDBVcFRociAgICA9IDMyOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgaWYoIGlzQk1vZGUgPT0gMCApCisgICAgICAgIHJldHVybiAoc2lnbmFsU3RyZW5ndGggKyB3ZWlnaHRPZkIpOyAgICAvLyBwdXJlIGIgbW9kZSAsIGRvIG5vdCBhZGQgdGhlIHdlaWdodCB2YWx1ZSBmb3IgdGhpcyBBUCAhCisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYoIGlzSFQgPT0gMCAmJiBpc0hUNDAgPT0gMCApCisgICAgICAgIHsgLy8gYSAsIGcgLCBiL2cgbW9kZSAhIGFkZCB0aGUgd2VpZ2h0IHZhbHVlIDE1IGZvciB0aGlzIEFQIGlmIGl0J3Mgc2lnbmFsIHN0cmVuZ3RoIGlzIG1vcmUgdGhhbiBzb21lIHZhbHVlICEKKyAgICAgICAgICAgIGlmKCBzaWduYWxTdHJlbmd0aCA8IDE4ICkgLy8gLTc3IGRCbQorCQkJCXJldHVybiBzaWduYWxTdHJlbmd0aCArIHdlaWdodE9mQUdCZWxvd1RocjsKKwkJCWVsc2UKKwkJCQlyZXR1cm4gKHNpZ25hbFN0cmVuZ3RoICsgd2VpZ2h0T2ZBR1VwVGhyKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmKCBpc0hUID09IDEgJiYgaXNIVDQwID09IDAgKQorICAgICAgICB7IC8vIDgwMjExbiBtb2RlIHVzZSAyME1IegorICAgICAgICAgICAgaWYoIHNpZ25hbFN0cmVuZ3RoIDwgMjMgKSAvLyAtNzIgZEJtCisgICAgICAgICAgICAgICAgcmV0dXJuIChzaWduYWxTdHJlbmd0aCArIHdlaWdodE9mTjIwQmVsb3dUaHIpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiAoc2lnbmFsU3RyZW5ndGggKyB3ZWlnaHRPZk4yMFVwVGhyKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIC8vIGlzSFQgPT0gMSAmJiBpc0hUNDAgPT0gMQorICAgICAgICB7IC8vIDgwMjExbiBtb2RlIHVzZSA0ME1IegorICAgICAgICAgICAgaWYoIHNpZ25hbFN0cmVuZ3RoIDwgMTYgKSAvLyAtNzkgZEJtCisgICAgICAgICAgICAgICAgcmV0dXJuIChzaWduYWxTdHJlbmd0aCArIHdlaWdodE9mTjQwQmVsb3dUaHIpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiAoc2lnbmFsU3RyZW5ndGggKyB3ZWlnaHRPZk40MFVwVGhyKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordTE2X3QgemZTdGFBZGRJYnNzQWRkaXRpb25hbElFKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3Qgb2Zmc2V0KQoreworCXUxNl90IGk7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBmb3IgKGk9MDsgaTx3ZC0+c3RhLmlic3NBZGRpdGlvbmFsSUVTaXplOyBpKyspCisgICAgeworICAgICAgICB6bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIHdkLT5zdGEuaWJzc0FkZGl0aW9uYWxJRVtpXSk7CisgICAgfQorCisgICAgcmV0dXJuIG9mZnNldDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9jb2lkLmMgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvY29pZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwMDdmMzEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvY29pZC5jCkBAIC0wLDAgKzEsMjY5NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNy0yMDA4IEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZHVsZSBOYW1lIDogaW9kLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQWJzdHJhY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBUaGlzIG1vZHVsZSBjb250YWlucyBPSUQgZnVuY3Rpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTk9URVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBOb25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgImNwcmVjb21wLmgiCisjaW5jbHVkZSAiLi4vaGFsL2hwcmVnLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZmlXbGFuUXVlcnlNYWNBZGRyZXNzICAgICAgKi8KKy8qICAgICAgUXVlcnkgT1dOIE1BQyBhZGRyZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYWRkciA6IGZvciByZXR1cm4gTUFDIGFkZHJlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiBDaGVuICAgICAgICBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgIDIwMDUuMTAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgemZpV2xhblF1ZXJ5TWFjQWRkcmVzcyh6ZGV2X3QqIGRldiwgdThfdCogYWRkcikKK3sKKyAgICB1MTZfdCB2YXBJZCA9IDA7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgdmFwSWQgPSB6ZndHZXRWYXBJZChkZXYpOworCisgICAgYWRkclswXSA9ICh1OF90KSh3ZC0+bWFjQWRkclswXSAmIDB4ZmYpOworICAgIGFkZHJbMV0gPSAodThfdCkod2QtPm1hY0FkZHJbMF0gPj4gOCk7CisgICAgYWRkclsyXSA9ICh1OF90KSh3ZC0+bWFjQWRkclsxXSAmIDB4ZmYpOworICAgIGFkZHJbM10gPSAodThfdCkod2QtPm1hY0FkZHJbMV0gPj4gOCk7CisgICAgYWRkcls0XSA9ICh1OF90KSh3ZC0+bWFjQWRkclsyXSAmIDB4ZmYpOworICAgIGlmICh2YXBJZCA9PSAweGZmZmYpCisgICAgICAgIGFkZHJbNV0gPSAodThfdCkod2QtPm1hY0FkZHJbMl0gPj4gOCk7CisgICAgZWxzZQorICAgIHsKKyNpZmRlZiBaTV9WQVBNT0RFX01VTFRJTEVfU1NJRAorICAgICAgICBhZGRyWzVdID0gKHU4X3QpKHdkLT5tYWNBZGRyWzJdID4+IDgpOyAvLyBNdWx0aXBsZSBTU0lECisjZWxzZQorICAgICAgICBhZGRyWzVdID0gdmFwSWQgKyAxICsgKHU4X3QpKHdkLT5tYWNBZGRyWzJdID4+IDgpOyAvL1ZBUAorI2VuZGlmCisgICAgfQorCisgICAgcmV0dXJuOworfQorCit2b2lkIHpmaVdsYW5RdWVyeUJzc0xpc3QoemRldl90KiBkZXYsIHN0cnVjdCB6c0Jzc0xpc3QqIHBCc3NMaXN0KQoreworICAgIHN0cnVjdCB6c0Jzc0luZm8qICAgcEJzc0luZm87CisgICAgc3RydWN0IHpzQnNzSW5mbyogICBwRHN0QnNzSW5mbzsKKyAgICB1OF90ICAgaTsKKyAgICB1OF90KiAgcE1lbUxpc3Q7CisgICAgdThfdCogIHBNZW1JbmZvOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHBNZW1MaXN0ID0gKHU4X3QqKSBwQnNzTGlzdDsKKyAgICBwTWVtSW5mbyA9IHBNZW1MaXN0ICsgc2l6ZW9mKHN0cnVjdCB6c0Jzc0xpc3QpOworICAgIHBCc3NMaXN0LT5oZWFkID0gKHN0cnVjdCB6c0Jzc0luZm8qKSBwTWVtSW5mbzsKKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICBwQnNzSW5mbyA9IHdkLT5zdGEuYnNzTGlzdC5oZWFkOworICAgIHBEc3RCc3NJbmZvID0gKHN0cnVjdCB6c0Jzc0luZm8qKSBwTWVtSW5mbzsKKyAgICBwQnNzTGlzdC0+YnNzQ291bnQgPSB3ZC0+c3RhLmJzc0xpc3QuYnNzQ291bnQ7CisKKyAgICBmb3IoIGk9MDsgaTx3ZC0+c3RhLmJzc0xpc3QuYnNzQ291bnQ7IGkrKyApCisgICAgeworICAgICAgICB6Zk1lbW9yeUNvcHkoKHU4X3QqKXBEc3RCc3NJbmZvLCAodThfdCopcEJzc0luZm8sCisgICAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCB6c0Jzc0luZm8pKTsKKworICAgICAgICBpZiAoIHBCc3NJbmZvLT5uZXh0ICE9IE5VTEwgKQorICAgICAgICB7CisgICAgICAgICAgICBwQnNzSW5mbyA9IHBCc3NJbmZvLT5uZXh0OworICAgICAgICAgICAgcERzdEJzc0luZm8tPm5leHQgPSBwRHN0QnNzSW5mbyArIDE7CisgICAgICAgICAgICBwRHN0QnNzSW5mbysrOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgem1fYXNzZXJ0KGk9PSh3ZC0+c3RhLmJzc0xpc3QuYnNzQ291bnQtMSkpOworICAgICAgICB9CisgICAgfQorCisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIHpmU2Nhbk1nclNjYW5BY2soZGV2KTsKK30KKwordm9pZCB6ZmlXbGFuUXVlcnlCc3NMaXN0VjEoemRldl90KiBkZXYsIHN0cnVjdCB6c0Jzc0xpc3RWMSogYnNzTGlzdFYxKQoreworICAgIHN0cnVjdCB6c0Jzc0luZm8qICAgcEJzc0luZm87CisgICAgLy9zdHJ1Y3QgenNCc3NJbmZvKiAgIHBEc3RCc3NJbmZvOworICAgIHU4X3QgICBpLCBqLCBiZHJvcCA9IDAsIGsgPSAwLCBTYW1lX0NvdW50ID0gMDsKKyAgICB1OF90ICAgYnNzaWRbNl07CisgICAgLy91OF90KiAgcE1lbUxpc3Q7CisgICAgLy91OF90KiAgcE1lbUluZm87CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgYnNzTGlzdFYxLT5ic3NDb3VudCA9IHdkLT5zdGEuYnNzTGlzdC5ic3NDb3VudDsKKworICAgIHBCc3NJbmZvID0gd2QtPnN0YS5ic3NMaXN0LmhlYWQ7CisgICAgWk1fTUFDX1dPUkRfVE9fQllURSh3ZC0+c3RhLmJzc2lkLCBic3NpZCk7CisKKyAgICBmb3IoIGk9MDsgaTx3ZC0+c3RhLmJzc0xpc3QuYnNzQ291bnQ7IGkrKyApCisgICAgeworICAgICAgICBiZHJvcCA9IDA7CisgICAgICAgIGlmICggemZTdGFJc0Nvbm5lY3RlZChkZXYpCisgICAgICAgICAgICAgJiYgKHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0lORlJBU1RSVUNUVVJFICkgKQorICAgICAgICB7CisJCQlmb3IgKGogPSAwOyBqIDwgNjsgaisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICggcEJzc0luZm8tPmJzc2lkW2pdICE9IGJzc2lkW2pdICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgICggKGogPT0gNikKKyAgICAgICAgICAgICAgICAgICYmKChwQnNzSW5mby0+c3NpZFsxXSA9PSB3ZC0+c3RhLnNzaWRMZW4pIHx8IChwQnNzSW5mby0+c3NpZFsxXSA9PSAwKSApJiYgKHBCc3NJbmZvLT5mcmVxdWVuY3kgPT0gd2QtPmZyZXF1ZW5jeSkgKQorICAgICAgICAgICAgeworCQkJCWlmKHBCc3NJbmZvLT5zc2lkWzFdID09IDApCisJCQkJCXBCc3NJbmZvLT5zc2lkWzFdID0gd2QtPnN0YS5zc2lkTGVuOworCisJCQkJaWYoU2FtZV9Db3VudCA9PSAwKQorCQkJCXsvL0ZpcnN0IG1lZXQKKwkJCQkJU2FtZV9Db3VudCsrOworCQkJCX0KKwkJCQllbHNlCisJCQkJey8vc2FtZSBvbmUKKwkJCQkJYmRyb3AgPSAxOworCQkJCQlic3NMaXN0VjEtPmJzc0NvdW50LS07CisJCQkJfQorCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoYmRyb3AgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgemZNZW1vcnlDb3B5KCh1OF90KikoJmJzc0xpc3RWMS0+YnNzSW5mb1trXSksICh1OF90KilwQnNzSW5mbywKKyAgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IHpzQnNzSW5mbykpOworCisJCQlpZihTYW1lX0NvdW50ID09IDEpCisJCQl7CisJCQkJemZNZW1vcnlDb3B5KCYoYnNzTGlzdFYxLT5ic3NJbmZvW2tdLnNzaWRbMl0pLCB3ZC0+c3RhLnNzaWQsIHdkLT5zdGEuc3NpZExlbik7CisJCQkJU2FtZV9Db3VudCsrOworCQkJfQorCisJCQlrKys7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIHBCc3NJbmZvLT5uZXh0ICE9IE5VTEwgKQorICAgICAgICB7CisgICAgICAgICAgICBwQnNzSW5mbyA9IHBCc3NJbmZvLT5uZXh0OworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgem1fYXNzZXJ0KGk9PSh3ZC0+c3RhLmJzc0xpc3QuYnNzQ291bnQtMSkpOworICAgICAgICB9CisgICAgfQorCisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIHpmU2Nhbk1nclNjYW5BY2soZGV2KTsKK30KKwordm9pZCB6ZmlXbGFuUXVlcnlBZEhvY0NyZWF0ZWRCc3NEZXNjKHpkZXZfdCogZGV2LCBzdHJ1Y3QgenNCc3NJbmZvICpwQnNzSW5mbykKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6Zk1lbW9yeUNvcHkoKHU4X3QgKilwQnNzSW5mbywgKHU4X3QgKikmd2QtPnN0YS5pYnNzQnNzRGVzYywgc2l6ZW9mKHN0cnVjdCB6c0Jzc0luZm8pKTsKK30KKwordThfdCB6ZmlXbGFuUXVlcnlBZEhvY0lzQ3JlYXRvcih6ZGV2X3QqIGRldikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICByZXR1cm4gd2QtPnN0YS5pYnNzQnNzSXNDcmVhdG9yOworfQorCit1MzJfdCB6ZmlXbGFuUXVlcnlTdXBwb3J0TW9kZSh6ZGV2X3QqIGRldikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICByZXR1cm4gd2QtPnN1cHBvcnRNb2RlOworfQorCit1MzJfdCB6ZmlXbGFuUXVlcnlUcmFuc21pdFBvd2VyKHpkZXZfdCogZGV2KQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHUzMl90IHJldCA9IDA7CisKKyAgICBpZiAoemZTdGFJc0Nvbm5lY3RlZChkZXYpKSB7CisgICAgICAgIHJldCA9IHdkLT5zdGEuY29ublBvd2VySW5IYWxmRGJtOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldCA9IHpmSHBHZXRUcmFuc21pdFBvd2VyKGRldik7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmaVdsYW5GbHVzaEJzc0xpc3QgICAgICAgICAqLworLyogICAgICBGbHVzaCBCU1NJRCBMaXN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBub25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBTdGVwaGVuIENoZW4gICAgICAgIEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMsIElOQy4gICAgMjAwNi4xMiAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB6ZmlXbGFuRmx1c2hCc3NMaXN0KHpkZXZfdCogZGV2KQoreworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIC8qIENhbGwgemZCc3NJbmZvUmVmcmVzaCgpIHR3aWNlIHRvIHJlbW92ZSBhbGwgZW50cnkgKi8KKyAgICB6ZkJzc0luZm9SZWZyZXNoKGRldiwgMSk7CisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKK30KKwordm9pZCB6ZmlXbGFuU2V0V2xhbk1vZGUoemRldl90KiBkZXYsIHU4X3Qgd2xhbk1vZGUpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgd2QtPndzLndsYW5Nb2RlID0gd2xhbk1vZGU7CisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKK30KKwordm9pZCB6ZmlXbGFuU2V0QXV0aGVudGljYXRpb25Nb2RlKHpkZXZfdCogZGV2LCB1OF90IGF1dGhNb2RlKQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIHdkLT53cy5hdXRoTW9kZSA9IGF1dGhNb2RlOworICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7Cit9CisKK3ZvaWQgemZpV2xhblNldFdlcFN0YXR1cyh6ZGV2X3QqIGRldiwgdThfdCB3ZXBTdGF0dXMpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgd2QtPndzLndlcFN0YXR1cyA9IHdlcFN0YXR1czsKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCit9CisKK3ZvaWQgemZpV2xhblNldFNTSUQoemRldl90KiBkZXYsIHU4X3QqIHNzaWQsIHU4X3Qgc3NpZExlbmd0aCkKK3sKKyAgICB1MTZfdCBpOworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICBpZiAoIHNzaWRMZW5ndGggPD0gMzIgKQorICAgIHsKKyAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgICAgICB3ZC0+d3Muc3NpZExlbiA9IHNzaWRMZW5ndGg7CisgICAgICAgIHpmTWVtb3J5Q29weSh3ZC0+d3Muc3NpZCwgc3NpZCwgc3NpZExlbmd0aCk7CisKKyAgICAgICAgaWYgKCBzc2lkTGVuZ3RoIDwgMzIgKQorICAgICAgICB7CisgICAgICAgICAgICB3ZC0+d3Muc3NpZFtzc2lkTGVuZ3RoXSA9IDA7CisgICAgICAgIH0KKworICAgICAgICB3ZC0+d3MucHJvYmluZ1NzaWRMaXN0WzBdLnNzaWRMZW4gPSBzc2lkTGVuZ3RoOworICAgICAgICB6Zk1lbW9yeUNvcHkod2QtPndzLnByb2JpbmdTc2lkTGlzdFswXS5zc2lkLCBzc2lkLCBzc2lkTGVuZ3RoKTsKKyAgICAgICAgZm9yIChpPTE7IGk8Wk1fTUFYX1BST0JFX0hJRERFTl9TU0lEX1NJWkU7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgd2QtPndzLnByb2JpbmdTc2lkTGlzdFtpXS5zc2lkTGVuID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgfQorfQorCit2b2lkIHpmaVdsYW5TZXRGcmFnVGhyZXNob2xkKHpkZXZfdCogZGV2LCB1MTZfdCBmcmFnVGhyZXNob2xkKQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgaWYgKGZyYWdUaHJlc2hvbGQgPT0gMCkKKyAgICB7ICAgLyogZnJhZ21lbnRhdGlvbiBpcyBkaXNhYmxlZCAqLworICAgICAgICB3ZC0+ZnJhZ1RocmVzaG9sZCA9IDMyNzY3OworICAgIH0KKyAgICBlbHNlIGlmIChmcmFnVGhyZXNob2xkIDwgMjU2KQorICAgIHsKKyAgICAgICAgLyogTWluaW11bSBmcmFnbWVudCB0aHJlc2hvbGQgKi8KKyAgICAgICAgd2QtPmZyYWdUaHJlc2hvbGQgPSAyNTY7CisgICAgfQorICAgIGVsc2UgaWYgKGZyYWdUaHJlc2hvbGQgPiAyMzQ2KQorICAgIHsKKyAgICAgICAgd2QtPmZyYWdUaHJlc2hvbGQgPSAyMzQ2OworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB3ZC0+ZnJhZ1RocmVzaG9sZCA9IGZyYWdUaHJlc2hvbGQgJiAweGZmZmU7CisgICAgfQorCisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKK30KKwordm9pZCB6ZmlXbGFuU2V0UnRzVGhyZXNob2xkKHpkZXZfdCogZGV2LCB1MTZfdCBydHNUaHJlc2hvbGQpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgd2QtPnJ0c1RocmVzaG9sZCA9IHJ0c1RocmVzaG9sZDsKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworfQorCit2b2lkIHpmaVdsYW5TZXRGcmVxdWVuY3koemRldl90KiBkZXYsIHUzMl90IGZyZXF1ZW5jeSwgdThfdCBiSW1tZWRpYXRlKQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICBpZiAoIGJJbW1lZGlhdGUgKQorICAgIHsKKyAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgd2QtPmZyZXF1ZW5jeSA9ICh1MTZfdCkgKGZyZXF1ZW5jeS8xMDAwKTsKKyAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgemZDb3JlU2V0RnJlcXVlbmN5KGRldiwgd2QtPmZyZXF1ZW5jeSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgIGlmKCBmcmVxdWVuY3kgPT0gMCApCisgICAgICAgIHsgLy8gQXV0byBzZWxlY3QgY2xlYW4gY2hhbm5lbCBkZXBlbmQgb24gd2lyZWxlc3MgZW52aXJvbm1lbnQgIQorICAgICAgICAgICAgd2QtPndzLmF1dG9TZXRGcmVxdWVuY3kgPSAwOworICAgICAgICB9CisgICAgICAgIHdkLT53cy5mcmVxdWVuY3kgPSAodTE2X3QpIChmcmVxdWVuY3kvMTAwMCk7CisgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgfQorfQorCit2b2lkIHpmaVdsYW5TZXRCc3NpZCh6ZGV2X3QqIGRldiwgdThfdCogYnNzaWQpCit7CisgICAgdTE2X3QgaTsKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICBmb3IgKGk9MDsgaTw2OyBpKyspCisgICAgeworICAgICAgICB3ZC0+d3MuZGVzaXJlZEJzc2lkW2ldID0gYnNzaWRbaV07CisgICAgfQorICAgIHdkLT53cy5iRGVzaXJlZEJzc2lkID0gVFJVRTsKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCit9CisKK3ZvaWQgemZpV2xhblNldEJlYWNvbkludGVydmFsKHpkZXZfdCogZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTE2X3QgIGJlYWNvbkludGVydmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdThfdCAgIGJJbW1lZGlhdGUpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIGlmICggYkltbWVkaWF0ZSApCisgICAgeworICAgICAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICB3ZC0+YmVhY29uSW50ZXJ2YWwgPSBiZWFjb25JbnRlcnZhbDsKKyAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgICAgICAvKiB1cGRhdGUgYmVhY29uIGludGVydmFsIGhlcmUgKi8KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgd2QtPndzLmJlYWNvbkludGVydmFsID0gYmVhY29uSW50ZXJ2YWw7CisgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgfQorfQorCisKK3ZvaWQgemZpV2xhblNldER0aW1Db3VudCh6ZGV2X3QqIGRldiwgdThfdCAgZHRpbSkKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICBpZiAoZHRpbSA+IDApCisgICAgeworICAgICAgICB3ZC0+d3MuZHRpbSA9IGR0aW07CisgICAgfQorICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7Cit9CisKKwordm9pZCB6ZmlXbGFuU2V0QXRpbVdpbmRvdyh6ZGV2X3QqIGRldiwgdTE2X3QgYXRpbVdpbmRvdywgdThfdCBiSW1tZWRpYXRlKQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICBpZiAoIGJJbW1lZGlhdGUgKQorICAgIHsKKyAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgd2QtPnN0YS5hdGltV2luZG93ID0gYXRpbVdpbmRvdzsKKyAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgICAgICAvKiBhdGltIHdpbmRvdyBoZXJlICovCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgIHdkLT53cy5hdGltV2luZG93ID0gYXRpbVdpbmRvdzsKKyAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICB9Cit9CisKKwordm9pZCB6ZmlXbGFuU2V0RW5jcnlNb2RlKHpkZXZfdCogZGV2LCB1OF90IGVuY3J5TW9kZSkKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICBpZiAod2QtPndsYW5Nb2RlID09IFpNX01PREVfQVApCisgICAgeworICAgICAgICAvKiBIb3N0YXBkIElzc3VlICovCisgICAgICAgIGlmICgod2QtPndzLmVuY3J5TW9kZSAhPSBaTV9BRVMpICYmICh3ZC0+d3MuZW5jcnlNb2RlICE9IFpNX1RLSVApKQorICAgICAgICAgICAgd2QtPndzLmVuY3J5TW9kZSA9IGVuY3J5TW9kZTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICB3ZC0+d3MuZW5jcnlNb2RlID0gZW5jcnlNb2RlOworICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7Cit9CisKK3ZvaWQgemZpV2xhblNldERlZmF1bHRLZXlJZCh6ZGV2X3QqIGRldiwgdThfdCBrZXlJZCkKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB3ZC0+c3RhLmtleUlkID0ga2V5SWQ7Cit9CisKK3U4X3QgemZpV2xhblF1ZXJ5SXNQS0luc3RhbGxlZCh6ZGV2X3QgKmRldiwgdThfdCAqc3RhTWFjQWRkcikKK3sKKyAgICB1OF90IGlzSW5zdGFsbGVkID0gMDsKKworI2lmIDEKKy8vI2lmZGVmIFpNX0VOQUJMRV9JQlNTX1dQQTJQU0sKKyAgICB1OF90ICAgcmVzLCBwZWVySWR4OworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgcmVzID0gemZTdGFGaW5kT3Bwb3NpdGVCeU1BQ0FkZHIoZGV2LCAodTE2X3QgKilzdGFNYWNBZGRyLCAmcGVlcklkeCk7CisgICAgaWYoIHJlcyA9PSAwICkKKyAgICB7CisgICAgICAgIGlzSW5zdGFsbGVkID0gd2QtPnN0YS5vcHBvc2l0ZUluZm9bcGVlcklkeF0ucGtJbnN0YWxsZWQ7CisgICAgfQorICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisvLyNlbmRpZgorI2VuZGlmCisKKyAgICByZXR1cm4gaXNJbnN0YWxsZWQ7Cit9CisKK3U4X3QgemZpV2xhblNldEtleSh6ZGV2X3QqIGRldiwgc3RydWN0IHpzS2V5SW5mbyBrZXlJbmZvKQoreworICAgIHUxNl90ICBicm9hZGNhc3RbM10gPSB7MHhmZmZmLCAweGZmZmYsIDB4ZmZmZn07CisgICAgdTMyX3QqIGtleTsKKyAgICB1OF90ICAgZW5jcnlNb2RlID0gWk1fTk9fV0VQOworI2lmZGVmIFpNX0VOQUJMRV9JQlNTX1dQQTJQU0sKKyAgICB1OF90ICAgZW5jcnlUeXBlID0gWk1fTk9fV0VQOworI2VuZGlmCisgICAgdThfdCAgIG1pY0tleVsxNl07CisgICAgdTE2X3QgIGlkID0gMDsKKyAgICB1OF90ICAgdmFwSWQsIGksIGFkZHJbNl07CisgICAgdThfdCAgIHVzZXJJZHg9MDsKKworI2lmZGVmIFpNX0VOQUJMRV9JQlNTX1dQQTJQU0sKKyAgICAvKiBEZXRlcm1pbmUgb3Bwb3NpdGUgZXhpc3Qgb3Igbm90ICovCisgICAgdThfdCAgIHJlcywgcGVlcklkeDsKKy8vICAgIHU4X3QgICB1c2VySWR4PTA7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBpZiAoIHdkLT5zdGEuaWJzc1dwYTJQc2sgPT0gMSApCisgICAgeworICAgICAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICByZXMgPSB6ZlN0YUZpbmRPcHBvc2l0ZUJ5TUFDQWRkcihkZXYsICh1MTZfdCopa2V5SW5mby5tYWNBZGRyLCAmcGVlcklkeCk7CisgICAgICAgIGlmKCByZXMgPT0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHVzZXJJZHggPSBwZWVySWR4OworICAgICAgICAgICAgaWYgKCB3ZC0+c3RhLm9wcG9zaXRlSW5mb1t1c2VySWR4XS5jYW1JZHggPT0gMHhmZiApCisgICAgICAgICAgICAgICAgd2QtPnN0YS5vcHBvc2l0ZUluZm9bdXNlcklkeF0uY2FtSWR4ID0gdXNlcklkeDsKKyAgICAgICAgfQorICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIH0KKyNlbHNlCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworI2VuZGlmCisKKyAgICBpZiAoIGtleUluZm8uZmxhZyAmIFpNX0tFWV9GTEFHX0FVVEhFTlRJQ0FUT1IgKQorICAgIHsgICAvKiBzZXQga2V5IGJ5IGF1dGhlbnRpY2F0b3IgKi8KKyAgICAgICAgLyogc2V0IHBhaXJ3aXNlIGtleSAqLworICAgICAgICBpZiAoa2V5SW5mby5mbGFnICYgWk1fS0VZX0ZMQUdfUEspCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIEZpbmQgU1RBJ3MgaW5mb3JtYXRpb24gKi8KKyAgICAgICAgICAgIGlmICgoaWQgPSB6ZkFwRmluZFN0YShkZXYsIGtleUluZm8ubWFjQWRkcikpID09IDB4ZmZmZikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBDYW4ndCBTVEEgaW4gdGhlIHN0YVRhYmxlICovCisgICAgICAgICAgICAgICAgcmV0dXJuIFpNX1NUQVRVU19GQUlMVVJFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB3ZC0+YXAuc3RhVGFibGVbaWRdLml2MTYgPSAwOworICAgICAgICAgICAgd2QtPmFwLnN0YVRhYmxlW2lkXS5pdjMyID0gMDsKKworICAgICAgICAgICAgaWYgKGtleUluZm8ua2V5TGVuZ3RoID09IDMyKQorICAgICAgICAgICAgeyAgIC8qIFRLSVAgKi8KKyAgICAgICAgICAgICAgICAvL3U4X3QgS2V5UnNjWzZdID0gezAsIDAsIDAsIDAsIDAsIDB9OworCisgICAgICAgICAgICAgICAgLyogSW4gdGhlIGN1cnJlbnQgQVAgbW9kZSwgd2Ugc2V0IEtleVJzYyB0byB6ZXJvICovCisgICAgICAgICAgICAgICAgLy96ZlRraXBJbml0KGtleUluZm8ua2V5LCAodThfdCopIHdkLT5tYWNBZGRyLAorICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAmKHdkLT5hcC5zdGFUYWJsZVtpZF0udHhTZWVkKSwgS2V5UnNjKTsKKyAgICAgICAgICAgICAgICAvL3pmVGtpcEluaXQoa2V5SW5mby5rZXksICh1OF90Kikga2V5SW5mby5tYWNBZGRyLAorICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAmKHdkLT5hcC5zdGFUYWJsZVtpZF0ucnhTZWVkKSwgS2V5UnNjKTsKKyNpZmRlZiBaTV9FTkFCTEVfQ0VOQworICAgICAgICAgICAgICAgIGlmIChrZXlJbmZvLmZsYWcgJiBaTV9LRVlfRkxBR19DRU5DKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiU2V0IENFTkMgcGFpcndpc2UgS2V5Iik7CisKKyAgICAgICAgICAgICAgICAgICAgd2QtPmFwLnN0YVRhYmxlW2lkXS5lbmNyeU1vZGUgPSBaTV9DRU5DOworCisgICAgICAgICAgICAgICAgICAgIC8qIFJlc2V0IHR4aXYgYW5kIHJ4aXYgKi8KKyAgICAgICAgICAgICAgICAgICAgd2QtPmFwLnN0YVRhYmxlW2lkXS50eGl2WzBdID0gMHg1YzM2NWMzNzsKKyAgICAgICAgICAgICAgICAgICAgd2QtPmFwLnN0YVRhYmxlW2lkXS50eGl2WzFdID0gMHg1YzM2NWMzNjsKKyAgICAgICAgICAgICAgICAgICAgd2QtPmFwLnN0YVRhYmxlW2lkXS50eGl2WzJdID0gMHg1YzM2NWMzNjsKKyAgICAgICAgICAgICAgICAgICAgd2QtPmFwLnN0YVRhYmxlW2lkXS50eGl2WzNdID0gMHg1YzM2NWMzNjsKKworICAgICAgICAgICAgICAgICAgICB3ZC0+YXAuc3RhVGFibGVbaWRdLnJ4aXZbMF0gPSAweDVjMzY1YzM2OworICAgICAgICAgICAgICAgICAgICB3ZC0+YXAuc3RhVGFibGVbaWRdLnJ4aXZbMV0gPSAweDVjMzY1YzM2OworICAgICAgICAgICAgICAgICAgICB3ZC0+YXAuc3RhVGFibGVbaWRdLnJ4aXZbMl0gPSAweDVjMzY1YzM2OworICAgICAgICAgICAgICAgICAgICB3ZC0+YXAuc3RhVGFibGVbaWRdLnJ4aXZbM10gPSAweDVjMzY1YzM2OworCisgICAgICAgICAgICAgICAgICAgIC8qIFNldCBLZXkgSW5kZXggKi8KKyAgICAgICAgICAgICAgICAgICAgd2QtPmFwLnN0YVRhYmxlW2lkXS5jZW5jS2V5SWR4ID0ga2V5SW5mby5rZXlJbmRleDsKKworICAgICAgICAgICAgICAgICAgICAvL3pmQ29yZVNldEtleShkZXYsIGlkKzEsIDEsIFpNX0NFTkMsICh1MTZfdCAqKWtleUluZm8ubWFjQWRkciwKKyAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgKHUzMl90KikgJmtleUluZm8ua2V5WzE2XSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyNlbmRpZiAvL1pNX0VOQUJMRV9DRU5DCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB3ZC0+YXAuc3RhVGFibGVbaWRdLmVuY3J5TW9kZSA9IFpNX1RLSVA7CisKKyAgICAgICAgICAgICAgICAgICAgemZNZW1vcnlDb3B5KG1pY0tleSwgJmtleUluZm8ua2V5WzE2XSwgOCk7CisgICAgICAgICAgICAgICAgICAgIHpmTWVtb3J5Q29weSgmbWljS2V5WzhdLCAma2V5SW5mby5rZXlbMjRdLCA4KTsKKworICAgICAgICAgICAgICAgICAgICAvL3pmQ29yZVNldEtleShkZXYsIGlkKzEsIDEsIFpNX1RLSVAsICh1MTZfdCAqKWtleUluZm8ubWFjQWRkciwKKyAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICh1MzJfdCopIG1pY0tleSk7CisKKyAgICAgICAgICAgICAgICAgICAgLyogRm9yIGZyYWdtZW50YXRpb24sIHdlIHVzZSBzb2Z0d2FyZSBNSUMgKi8KKyAgICAgICAgICAgICAgICAgICAgemZNZW1vcnlDb3B5KCh1OF90ICopJih3ZC0+YXAuc3RhVGFibGVbaWRdLnR4TWljS2V5KSwgJihrZXlJbmZvLmtleVsxNl0pLCA4KTsKKyAgICAgICAgICAgICAgICAgICAgemZNZW1vcnlDb3B5KCh1OF90ICopJih3ZC0+YXAuc3RhVGFibGVbaWRdLnJ4TWljS2V5KSwgJihrZXlJbmZvLmtleVsyNF0pLCA4KTsKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGtleUluZm8ua2V5TGVuZ3RoID09IDE2KQorICAgICAgICAgICAgeyAgIC8qIEFFUyAqLworICAgICAgICAgICAgICAgIHdkLT5hcC5zdGFUYWJsZVtpZF0uZW5jcnlNb2RlID0gWk1fQUVTOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoa2V5SW5mby5rZXlMZW5ndGggPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBDbGVhciBLZXkgSW5mbyAqLworICAgICAgICAgICAgICAgIHpmQXBDbGVhclN0YUtleShkZXYsICh1MTZfdCAqKWtleUluZm8ubWFjQWRkcik7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gWk1fU1RBVFVTX1NVQ0NFU1M7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFpNX1NUQVRVU19GQUlMVVJFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvL3pmQ29yZVNldEtleShkZXYsIGlkKzEsIDAsIHdkLT5hcC5zdGFUYWJsZVtpZF0uZW5jcnlNb2RlLAorICAgICAgICAgICAgLy8gICAgICAodTE2X3QgKilrZXlJbmZvLm1hY0FkZHIsICh1MzJfdCopIGtleUluZm8ua2V5KTsKKyAgICAgICAgICAgIHpmSHBTZXRBcFBhaXJ3aXNlS2V5KGRldiwgKHUxNl90ICopa2V5SW5mby5tYWNBZGRyLAorICAgICAgICAgICAgICAgICAgICB3ZC0+YXAuc3RhVGFibGVbaWRdLmVuY3J5TW9kZSwgKHUzMl90Kikga2V5SW5mby5rZXksCisgICAgICAgICAgICAgICAgICAgICh1MzJfdCopICZrZXlJbmZvLmtleVsxNl0sIGlkKzEpOworICAgICAgICAgICAgd2QtPmFwLnN0YVRhYmxlW2lkXS5rZXlJZHggPSBpZCArIDEgKyA0OworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGtleUluZm8uZmxhZyAmIFpNX0tFWV9GTEFHX0dLKQorICAgICAgICB7CisgICAgICAgICAgICB2YXBJZCA9IGtleUluZm8udmFwSWQ7CisKKyAgICAgICAgICAgIHdkLT5hcC5pdjE2W3ZhcElkXSA9IDA7CisgICAgICAgICAgICB3ZC0+YXAuaXYzMlt2YXBJZF0gPSAwOworCisgICAgICAgICAgICBpZiAoa2V5SW5mby5rZXlMZW5ndGggPT0gMzIpCisgICAgICAgICAgICB7ICAgLyogVEtJUCAqLworICAgICAgICAgICAgICAgIC8vdThfdCBLZXlSc2NbNl0gPSB7MCwgMCwgMCwgMCwgMCwgMH07CisKKyAgICAgICAgICAgICAgICAvL3pmVGtpcEluaXQoa2V5SW5mby5rZXksICh1OF90Kikgd2QtPm1hY0FkZHIsCisgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICYod2QtPmFwLmJjU2VlZCksIEtleVJzYyk7CisjaWZkZWYgWk1fRU5BQkxFX0NFTkMKKyAgICAgICAgICAgICAgICBpZiAoa2V5SW5mby5mbGFnICYgWk1fS0VZX0ZMQUdfQ0VOQykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGVuY3J5TW9kZSA9IFpNX0NFTkM7CisgICAgICAgICAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIlNldCBDRU5DIGdyb3VwIEtleSIpOworCisgICAgICAgICAgICAgICAgICAgIC8qIFJlc2V0IHR4aXYgYW5kIHJ4aXYgKi8KKyAgICAgICAgICAgICAgICAgICAgd2QtPmFwLnR4aXZbdmFwSWRdWzBdID0gMHg1YzM2NWMzNjsKKyAgICAgICAgICAgICAgICAgICAgd2QtPmFwLnR4aXZbdmFwSWRdWzFdID0gMHg1YzM2NWMzNjsKKyAgICAgICAgICAgICAgICAgICAgd2QtPmFwLnR4aXZbdmFwSWRdWzJdID0gMHg1YzM2NWMzNjsKKyAgICAgICAgICAgICAgICAgICAgd2QtPmFwLnR4aXZbdmFwSWRdWzNdID0gMHg1YzM2NWMzNjsKKworICAgICAgICAgICAgICAgICAgICAvL3pmQ29yZVNldEtleShkZXYsIDAsIDEsIFpNX0NFTkMsIGtleUluZm8udmFwQWRkciwKKyAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgKHUzMl90KikgJmtleUluZm8ua2V5WzE2XSk7CisgICAgICAgICAgICAgICAgICAgIGtleSA9ICh1MzJfdCopIGtleUluZm8ua2V5OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisjZW5kaWYgLy9aTV9FTkFCTEVfQ0VOQworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZW5jcnlNb2RlID0gWk1fVEtJUDsKKyAgICAgICAgICAgICAgICAgICAga2V5ID0gKHUzMl90ICopa2V5SW5mby5rZXk7CisKKyAgICAgICAgICAgICAgICAgICAgLyogc2V0IE1JQyBrZXkgdG8gSE1BQyAqLworICAgICAgICAgICAgICAgICAgICAvL3pmQ29yZVNldEtleShkZXYsIDAsIDEsIFpNX1RLSVAsIGJyb2FkY2FzdCwKKyAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAodTMyX3QqKSAoJmtleUluZm8ua2V5WzE2XSkpOworICAgICAgICAgICAgICAgICAgICAvL3pmQ29yZVNldEtleShkZXYsIDAsIDEsIFpNX1RLSVAsIGtleUluZm8udmFwQWRkciwKKyAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICh1MzJfdCopICgma2V5SW5mby5rZXlbMTZdKSk7CisKKyAgICAgICAgICAgICAgICAgICAgemZNaWNTZXRLZXkoJihrZXlJbmZvLmtleVsxNl0pLCAmKHdkLT5hcC5iY01pY0tleVswXSkpOworICAgICAgICAgICAgICAgICAgICBrZXkgPSAodTMyX3QqKSBrZXlJbmZvLmtleTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChrZXlJbmZvLmtleUxlbmd0aCA9PSAxNikKKyAgICAgICAgICAgIHsgICAvKiBBRVMgKi8KKyAgICAgICAgICAgICAgICBlbmNyeU1vZGUgPSBaTV9BRVM7CisgICAgICAgICAgICAgICAga2V5ID0gKHUzMl90ICopa2V5SW5mby5rZXk7CisgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiQ1dZIC0gU2V0IEFFUyBHcm91cCBLZXkiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGtleUluZm8ua2V5TGVuZ3RoID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogQ2xlYXIgS2V5IEluZm8gKi8KKyAgICAgICAgICAgICAgICB6ZkFwQ2xlYXJTdGFLZXkoZGV2LCBicm9hZGNhc3QpOworCisgICAgICAgICAgICAgICAgLyogVHVybiBvZmYgV0VQIGJpdCBpbiB0aGUgY2FwYWJpbGl0eSBmaWVsZCAqLworICAgICAgICAgICAgICAgIHdkLT5hcC5jYXBhYlt2YXBJZF0gJj0gMHhmZmVmOworCisgICAgICAgICAgICAgICAgcmV0dXJuIFpNX1NUQVRVU19TVUNDRVNTOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeyAgIC8qIFdFUCAqLworICAgICAgICAgICAgICAgIGlmIChrZXlJbmZvLmtleUxlbmd0aCA9PSA1KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZW5jcnlNb2RlID0gWk1fV0VQNjQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKGtleUluZm8ua2V5TGVuZ3RoID09IDEzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZW5jcnlNb2RlID0gWk1fV0VQMTI4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChrZXlJbmZvLmtleUxlbmd0aCA9PSAyOSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGVuY3J5TW9kZSA9IFpNX1dFUDI1NjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBrZXkgPSAodTMyX3QqKSBrZXlJbmZvLmtleTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gTW9kaWZpY2F0aW9uIGZvciBDQU0gbm90IHN1cHBvcnQgVkFQIHNlYXJjaAorICAgICAgICAgICAgLy96ZkNvcmVTZXRLZXkoZGV2LCAwLCAwLCBlbmNyeU1vZGUsIGJyb2FkY2FzdCwga2V5KTsKKyAgICAgICAgICAgIC8vemZDb3JlU2V0S2V5KGRldiwgMCwgMCwgZW5jcnlNb2RlLCB3ZC0+bWFjQWRkciwga2V5KTsKKyAgICAgICAgICAgIC8vemZDb3JlU2V0S2V5KGRldiwgMCwgMCwgZW5jcnlNb2RlLCBrZXlJbmZvLnZhcEFkZHIsIGtleSk7CisgICAgICAgICAgICB6ZkhwU2V0QXBHcm91cEtleShkZXYsIHdkLT5tYWNBZGRyLCBlbmNyeU1vZGUsCisgICAgICAgICAgICAgICAgICAgIGtleSwgKHUzMl90KikgJmtleUluZm8ua2V5WzE2XSwgdmFwSWQpOworCisgICAgICAgICAgICAvL3pmaVdsYW5TZXRFbmNyeU1vZGUoZGV2LCBlbmNyeU1vZGUpOworICAgICAgICAgICAgd2QtPndzLmVuY3J5TW9kZSA9IGVuY3J5TW9kZTsKKworICAgICAgICAgICAgLyogc2V0IHRoZSBtdWx0aWNhc3QgYWRkcmVzcyBlbmNyeXB0aW9uIHR5cGUgKi8KKyAgICAgICAgICAgIHdkLT5hcC5lbmNyeU1vZGVbdmFwSWRdID0gZW5jcnlNb2RlOworCisgICAgICAgICAgICAvKiBzZXQgdGhlIG11bHRpY2FzdCBrZXkgaW5kZXggKi8KKyAgICAgICAgICAgIHdkLT5hcC5iY0tleUluZGV4W3ZhcElkXSA9IGtleUluZm8ua2V5SW5kZXg7CisgICAgICAgICAgICB3ZC0+YXAuYmNIYWxLZXlJZHhbdmFwSWRdID0gdmFwSWQgKyA2MDsKKworICAgICAgICAgICAgLyogVHVybiBvbiBXRVAgYml0IGluIHRoZSBjYXBhYmlsaXR5IGZpZWxkICovCisgICAgICAgICAgICB3ZC0+YXAuY2FwYWJbdmFwSWRdIHw9IDB4MTA7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsgICAvKiBzZXQgYnkgc3VwcGxpY2FudCAqLworCisgICAgICAgIGlmICgga2V5SW5mby5mbGFnICYgWk1fS0VZX0ZMQUdfUEsgKQorICAgICAgICB7ICAgLyogc2V0IHBhaXJ3aXNlIGtleSAqLworCisgICAgICAgICAgICAvL3pmVGtpcEluaXQoa2V5SW5mby5rZXksICh1OF90Kikgd2QtPm1hY0FkZHIsCisgICAgICAgICAgICAvLyAgICAgICAgICAgJndkLT5zdGEudHhTZWVkLCBrZXlJbmZvLmluaXRJdik7CisgICAgICAgICAgICAvL3pmVGtpcEluaXQoa2V5SW5mby5rZXksICh1OF90Kikgd2QtPnN0YS5ic3NpZCwKKyAgICAgICAgICAgIC8vICAgICAgICAgICAmd2QtPnN0YS5yeFNlZWRba2V5SW5mby5rZXlJbmRleF0sIGtleUluZm8uaW5pdEl2KTsKKworI2lmZGVmIFpNX0VOQUJMRV9JQlNTX1dQQTJQU0sKKyAgICAgICAgICAgIGlmICggd2QtPnN0YS5pYnNzV3BhMlBzayA9PSAxICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiB1bmljYXN0IC0tID4gcGFpcndpc2Uga2V5ICovCisgICAgICAgICAgICAgICAgd2QtPnN0YS5vcHBvc2l0ZUluZm9bdXNlcklkeF0uaXYxNiA9IDA7CisgICAgICAgICAgICAgICAgd2QtPnN0YS5vcHBvc2l0ZUluZm9bdXNlcklkeF0uaXYzMiA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2QtPnN0YS5pdjE2ID0gMDsKKyAgICAgICAgICAgICAgICB3ZC0+c3RhLml2MzIgPSAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB3ZC0+c3RhLm9wcG9zaXRlSW5mb1t1c2VySWR4XS5wa0luc3RhbGxlZCA9IDE7CisjZWxzZQorICAgICAgICAgICAgd2QtPnN0YS5pdjE2ID0gMDsKKyAgICAgICAgICAgIHdkLT5zdGEuaXYzMiA9IDA7CisKKyAgICAgICAgICAgIHdkLT5zdGEub3Bwb3NpdGVJbmZvW3VzZXJJZHhdLnBrSW5zdGFsbGVkID0gMTsKKyNlbmRpZgorCisgICAgICAgICAgICBpZiAoIGtleUluZm8ua2V5TGVuZ3RoID09IDMyICkKKyAgICAgICAgICAgIHsgICAvKiBUS0lQICovCisgICAgICAgICAgICAgICAgemZUa2lwSW5pdChrZXlJbmZvLmtleSwgKHU4X3QqKSB3ZC0+bWFjQWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICZ3ZC0+c3RhLnR4U2VlZCwga2V5SW5mby5pbml0SXYpOworICAgICAgICAgICAgICAgIHpmVGtpcEluaXQoa2V5SW5mby5rZXksICh1OF90Kikgd2QtPnN0YS5ic3NpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICZ3ZC0+c3RhLnJ4U2VlZFtrZXlJbmZvLmtleUluZGV4XSwga2V5SW5mby5pbml0SXYpOworCisjaWZkZWYgWk1fRU5BQkxFX0NFTkMKKyAgICAgICAgICAgICAgICBpZiAoa2V5SW5mby5mbGFnICYgWk1fS0VZX0ZMQUdfQ0VOQykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIlNldCBDRU5DIHBhaXJ3aXNlIEtleSIpOworCisgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEuZW5jcnlNb2RlID0gWk1fQ0VOQzsKKworICAgICAgICAgICAgICAgICAgICAvKiBSZXNldCB0eGl2IGFuZCByeGl2ICovCisgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEudHhpdlswXSA9IDB4NWMzNjVjMzY7CisgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEudHhpdlsxXSA9IDB4NWMzNjVjMzY7CisgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEudHhpdlsyXSA9IDB4NWMzNjVjMzY7CisgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEudHhpdlszXSA9IDB4NWMzNjVjMzY7CisKKyAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5yeGl2WzBdID0gMHg1YzM2NWMzNzsKKyAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5yeGl2WzFdID0gMHg1YzM2NWMzNjsKKyAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5yeGl2WzJdID0gMHg1YzM2NWMzNjsKKyAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5yeGl2WzNdID0gMHg1YzM2NWMzNjsKKworICAgICAgICAgICAgICAgICAgICAvKiBTZXQgS2V5IEluZGV4ICovCisgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEuY2VuY0tleUlkID0ga2V5SW5mby5rZXlJbmRleDsKKworICAgICAgICAgICAgICAgICAgICAvL3pmQ29yZVNldEtleShkZXYsIGlkKzEsIDEsIFpNX0NFTkMsICh1MTZfdCAqKWtleUluZm8ubWFjQWRkciwKKyAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAodTMyX3QqKSAma2V5SW5mby5rZXlbMTZdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorI2VuZGlmIC8vWk1fRU5BQkxFX0NFTkMKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEuZW5jcnlNb2RlID0gWk1fVEtJUDsKKworICAgICAgICAgICAgICAgICAgICAvL3pmQ29yZVNldEtleShkZXYsIDAsIDEsIFpNX1RLSVAsIHdkLT5zdGEuYnNzaWQsCisgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgKHUzMl90KikgJmtleUluZm8ua2V5WzE2XSk7CisKKyAgICAgICAgICAgICAgICAgICAgemZNaWNTZXRLZXkoJmtleUluZm8ua2V5WzE2XSwgJndkLT5zdGEudHhNaWNLZXkpOworICAgICAgICAgICAgICAgICAgICB6Zk1pY1NldEtleSgma2V5SW5mby5rZXlbMjRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmd2QtPnN0YS5yeE1pY0tleVtrZXlJbmZvLmtleUluZGV4XSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoIGtleUluZm8ua2V5TGVuZ3RoID09IDE2ICkKKyAgICAgICAgICAgIHsgICAvKiBBRVMgKi8KKyNpZmRlZiBaTV9FTkFCTEVfSUJTU19XUEEyUFNLCisgICAgICAgICAgICAgICAgaWYgKCB3ZC0+c3RhLmlic3NXcGEyUHNrID09IDEgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5vcHBvc2l0ZUluZm9bdXNlcklkeF0uZW5jcnlNb2RlID0gWk1fQUVTOworICAgICAgICAgICAgICAgICAgICBlbmNyeVR5cGUgPSB3ZC0+c3RhLm9wcG9zaXRlSW5mb1t1c2VySWR4XS5lbmNyeU1vZGU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEuZW5jcnlNb2RlID0gWk1fQUVTOworICAgICAgICAgICAgICAgICAgICBlbmNyeVR5cGUgPSB3ZC0+c3RhLmVuY3J5TW9kZTsKKyAgICAgICAgICAgICAgICB9CisjZWxzZQorICAgICAgICAgICAgICAgIHdkLT5zdGEuZW5jcnlNb2RlID0gWk1fQUVTOworI2VuZGlmCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFpNX1NUQVRVU19GQUlMVVJFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiB1c2VyIDAgKi8KKyAgICAgICAgICAgIC8vemZDb3JlU2V0S2V5KGRldiwgMCwgMCwgd2QtPnN0YS5lbmNyeU1vZGUsCisgICAgICAgICAgICAvLyAgICAgICAgIHdkLT5zdGEuYnNzaWQsICh1MzJfdCopIGtleUluZm8ua2V5KTsKKyAgICAgICAgICAgIC8vemZIcFNldFN0YVBhaXJ3aXNlS2V5KGRldiwgd2QtPnN0YS5ic3NpZCwgd2QtPnN0YS5lbmNyeU1vZGUsCisgICAgICAgICAgICAvLyAgICAodTMyX3QqKSBrZXlJbmZvLmtleSwgKHUzMl90KikgJmtleUluZm8ua2V5WzE2XSk7CisKKyNpZmRlZiBaTV9FTkFCTEVfSUJTU19XUEEyUFNLCisgICAgICAgICAgICBpZiAoIChrZXlJbmZvLmtleUxlbmd0aD09MTYpICYmICh3ZC0+c3RhLmlic3NXcGEyUHNrPT0xKSApCisgICAgICAgICAgICB7IC8qIElmIG5vdCBBRVMtQ0NNUCBhbmQgaWJzcyBuZXR3b3JrICwgdXNlIHRyYWRpdGlvbmFsICovCisgICAgICAgICAgICAgICAgemZIcFNldFBlclVzZXJLZXkoZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VySWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlJbmZvLmtleUluZGV4LCAgLy8ga2V5IGlkID09IDAgKCBQYWlyd2lzZSBrZXkgPSAwICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHU4X3QqKWtleUluZm8ubWFjQWRkciwgICAvLyBSWCBuZWVkIFNvdXJjZSBBZGRyZXNzICggQWRkcmVzcyAyICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jcnlUeXBlLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLmVuY3J5TW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHUzMl90Kikga2V5SW5mby5rZXksICh1MzJfdCopICZrZXlJbmZvLmtleVsxNl0pOworCisgICAgICAgICAgICAgICAgd2QtPnN0YS5vcHBvc2l0ZUluZm9bdXNlcklkeF0ud3BhU3RhdGUgPSBaTV9TVEFfV1BBX1NUQVRFX1BLX09LIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsvKiBCaWcgRW5kaWFuIGFuZCBMaXR0bGUgRW5kaWFuIENvbXBhdGliaWxpdHkgKi8KKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYWRkclsyICogaV0gPSB3ZC0+c3RhLmJzc2lkW2ldICYgMHhmZjsKKyAgICAgICAgICAgICAgICAgICAgYWRkclsyICogaSArIDFdID0gd2QtPnN0YS5ic3NpZFtpXSA+PiA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB6ZkhwU2V0UGVyVXNlcktleShkZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaTV9VU0VSX0tFWV9QSywgICAvLyB1c2VyIGlkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAvLyBrZXkgaWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHIsLy8odThfdCAqKXdkLT5zdGEuYnNzaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLmVuY3J5TW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1MzJfdCopIGtleUluZm8ua2V5LCAodTMyX3QqKSAma2V5SW5mby5rZXlbMTZdKTsKKworICAgICAgICAgICAgICAgIHdkLT5zdGEua2V5SWQgPSA0OworICAgICAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgICAgIC8qIEJpZyBFbmRpYW4gYW5kIExpdHRsZSBFbmRpYW4gQ29tcGF0aWJpbGl0eSAqLworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhZGRyWzIgKiBpXSA9IHdkLT5zdGEuYnNzaWRbaV0gJiAweGZmOworICAgICAgICAgICAgICAgIGFkZHJbMiAqIGkgKyAxXSA9IHdkLT5zdGEuYnNzaWRbaV0gPj4gODsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHpmSHBTZXRQZXJVc2VyS2V5KGRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFpNX1VTRVJfS0VZX1BLLCAgIC8vIHVzZXIgaWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgIC8vIGtleSBpZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkciwvLyh1OF90ICopd2QtPnN0YS5ic3NpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEuZW5jcnlNb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHUzMl90Kikga2V5SW5mby5rZXksICh1MzJfdCopICZrZXlJbmZvLmtleVsxNl0pOworCisgICAgICAgICAgICB3ZC0+c3RhLmtleUlkID0gNDsKKyNlbmRpZgorCisgICAgICAgICAgICB3ZC0+c3RhLndwYVN0YXRlID0gWk1fU1RBX1dQQV9TVEFURV9QS19PSzsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICgga2V5SW5mby5mbGFnICYgWk1fS0VZX0ZMQUdfR0sgKQorICAgICAgICB7ICAgLyogc2V0IGdyb3VwIGtleSAqLworCisgICAgICAgICAgICB6ZlRraXBJbml0KGtleUluZm8ua2V5LCAodThfdCopIHdkLT5zdGEuYnNzaWQsCisgICAgICAgICAgICAgICAgICAgICAgICZ3ZC0+c3RhLnJ4U2VlZFtrZXlJbmZvLmtleUluZGV4XSwga2V5SW5mby5pbml0SXYpOworCisgICAgICAgICAgICBpZiAoIGtleUluZm8ua2V5TGVuZ3RoID09IDMyICkKKyAgICAgICAgICAgIHsgICAvKiBUS0lQICovCisjaWZkZWYgWk1fRU5BQkxFX0NFTkMKKyAgICAgICAgICAgICAgICBpZiAoa2V5SW5mby5mbGFnICYgWk1fS0VZX0ZMQUdfQ0VOQykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGVuY3J5TW9kZSA9IFpNX0NFTkM7CisgICAgICAgICAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIlNldCBDRU5DIGdyb3VwIEtleSIpOworCisgICAgICAgICAgICAgICAgICAgIC8qIFJlc2V0IHR4aXYgYW5kIHJ4aXYgKi8KKyAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5yeGl2R0tbMF0gPSAweDVjMzY1YzM2OworICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLnJ4aXZHS1sxXSA9IDB4NWMzNjVjMzY7CisgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEucnhpdkdLWzJdID0gMHg1YzM2NWMzNjsKKyAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5yeGl2R0tbM10gPSAweDVjMzY1YzM2OworCisgICAgICAgICAgICAgICAgICAgIC8vemZDb3JlU2V0S2V5KGRldiwgMCwgMSwgWk1fQ0VOQywga2V5SW5mby52YXBBZGRyLAorICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICh1MzJfdCopICZrZXlJbmZvLmtleVsxNl0pOworICAgICAgICAgICAgICAgICAgICBrZXkgPSAodTMyX3QqKSBrZXlJbmZvLmtleTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorI2VuZGlmIC8vWk1fRU5BQkxFX0NFTkMKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGVuY3J5TW9kZSA9IFpNX1RLSVA7CisgICAgICAgICAgICAgICAgICAgIGtleSA9ICh1MzJfdCopIHdkLT5zdGEucnhTZWVkW2tleUluZm8ua2V5SW5kZXhdLnRrOworCisgICAgICAgICAgICAgICAgICAgIGlmICggIShrZXlJbmZvLmZsYWcgJiBaTV9LRVlfRkxBR19JTklUX0lWKSApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEucnhTZWVkW2tleUluZm8ua2V5SW5kZXhdLml2MTYgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5yeFNlZWRba2V5SW5mby5rZXlJbmRleF0uaXYzMiA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvKiBzZXQgTUlDIGtleSB0byBITUFDICovCisgICAgICAgICAgICAgICAgICAgIC8vemZDb3JlU2V0S2V5KGRldiwgOCwgMSwgWk1fVEtJUCwgYnJvYWRjYXN0LAorICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICh1MzJfdCopICgma2V5SW5mby5rZXlbMTZdKSk7CisKKyAgICAgICAgICAgICAgICAgICAgemZNaWNTZXRLZXkoJmtleUluZm8ua2V5WzI0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJndkLT5zdGEucnhNaWNLZXlba2V5SW5mby5rZXlJbmRleF0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKCBrZXlJbmZvLmtleUxlbmd0aCA9PSAxNiApCisgICAgICAgICAgICB7ICAgLyogQUVTICovCisgICAgICAgICAgICAgICAgZW5jcnlNb2RlID0gWk1fQUVTOworICAgICAgICAgICAgICAgIC8va2V5ID0gKHUzMl90Kikgd2QtPnN0YS5yeFNlZWRba2V5SW5mby5rZXlJbmRleF0udGs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7ICAgLyogV0VQICovCisgICAgICAgICAgICAgICAgaWYgKCBrZXlJbmZvLmtleUxlbmd0aCA9PSA1ICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGVuY3J5TW9kZSA9IFpNX1dFUDY0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmICgga2V5SW5mby5rZXlMZW5ndGggPT0gMTMgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZW5jcnlNb2RlID0gWk1fV0VQMTI4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmICgga2V5SW5mby5rZXlMZW5ndGggPT0gMjkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZW5jcnlNb2RlID0gWk1fV0VQMjU2OworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGtleSA9ICh1MzJfdCopIGtleUluZm8ua2V5OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiB1c2VyIDggKi8KKyAgICAgICAgICAgIC8vemZDb3JlU2V0S2V5KGRldiwgOCwgMCwgZW5jcnlNb2RlLCBicm9hZGNhc3QsIGtleSk7CisgICAgICAgICAgICAvL3pmSHBTZXRTdGFHcm91cEtleShkZXYsIGJyb2FkY2FzdCwgZW5jcnlNb2RlLAorICAgICAgICAgICAgLy8gICAgICAgICh1MzJfdCopIGtleUluZm8ua2V5LCAodTMyX3QqKSAoJmtleUluZm8ua2V5WzE2XSkpOworCisjaWZkZWYgWk1fRU5BQkxFX0lCU1NfV1BBMlBTSworICAgICAgICAgICAgaWYgKCAoa2V5SW5mby5rZXlMZW5ndGg9PTE2KSAmJiAod2QtPnN0YS5pYnNzV3BhMlBzaz09MSkgKQorICAgICAgICAgICAgey8qIElmIG5vdCBBRVMtQ0NNUCBhbmQgaWJzcyBuZXR3b3JrICwgdXNlIHRyYWRpdGlvbmFsICovCisgICAgICAgICAgICAgICAgemZIcFNldFBlclVzZXJLZXkoZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlcklkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleUluZm8ua2V5SW5kZXgsICAgICAgICAgICAgICAgIC8vIGtleSBpZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKHU4X3QgKilicm9hZGNhc3QsICAgICAgICAgICAgICAgICAgLy8gZm9yIG9ubHkgMiBzdGF0aW9ucyBJQlNTIG5ldHdybCAoIEEyICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1OF90KilrZXlJbmZvLm1hY0FkZHIsICAgLy8gZm9yIG11bHRpcGxlICggPiAyICkgc3RhdGlvbnMgSUJTUyBuZXR3b3JrICggQTIgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jcnlNb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHUzMl90Kikga2V5SW5mby5rZXksICh1MzJfdCopICZrZXlJbmZvLmtleVsxNl0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHpmSHBTZXRQZXJVc2VyS2V5KGRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWk1fVVNFUl9LRVlfR0ssICAgLy8gdXNlciBpZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAvLyBrZXkgaWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHU4X3QgKilicm9hZGNhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY3J5TW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHUzMl90Kikga2V5SW5mby5rZXksICh1MzJfdCopICZrZXlJbmZvLmtleVsxNl0pOworCisgICAgICAgICAgICAgICAgd2QtPnN0YS53cGFTdGF0ZSA9IFpNX1NUQV9XUEFfU1RBVEVfR0tfT0s7CisgICAgICAgICAgICB9CisjZWxzZQorICAgICAgICAgICAgemZIcFNldFBlclVzZXJLZXkoZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWk1fVVNFUl9LRVlfR0ssICAgLy8gdXNlciBpZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgLy8ga2V5IGlkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodThfdCAqKWJyb2FkY2FzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY3J5TW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1MzJfdCopIGtleUluZm8ua2V5LCAodTMyX3QqKSAma2V5SW5mby5rZXlbMTZdKTsKKworICAgICAgICAgICAgd2QtPnN0YS53cGFTdGF0ZSA9IFpNX1NUQV9XUEFfU1RBVEVfR0tfT0s7CisjZW5kaWYKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsgICAvKiBsZWdhY3kgV0VQICovCisgICAgICAgICAgICB6bV9kZWJ1Z19tc2cwKCJsZWdhY3kgV0VQIik7CisKKyAgICAgICAgICAgIGlmICgga2V5SW5mby5rZXlJbmRleCA+PSA0ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gWk1fU1RBVFVTX0ZBSUxVUkU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICgga2V5SW5mby5rZXlMZW5ndGggPT0gNSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiV0VQIDY0Iik7CisKKyAgICAgICAgICAgICAgICBlbmNyeU1vZGUgPSBaTV9XRVA2NDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKCBrZXlJbmZvLmtleUxlbmd0aCA9PSAxMyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiV0VQIDEyOCIpOworCisgICAgICAgICAgICAgICAgZW5jcnlNb2RlID0gWk1fV0VQMTI4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoIGtleUluZm8ua2V5TGVuZ3RoID09IDMyICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBUS0lQICovCisgICAgICAgICAgICAgICAgI2lmIDAKKyAgICAgICAgICAgICAgICAvLyBEb24ndCByZXNldCB0aGUgSVYgc2luY2Ugc29tZSBBUCB3b3VsZCBmYWlsIGluIElWIGNoZWNrIGFuZCBkcm9wIG91ciBjb25uZWN0aW9uCisgICAgICAgICAgICAgICAgaWYgKCB3ZC0+c3RhLndwYVN0YXRlICE9IFpNX1NUQV9XUEFfU1RBVEVfUEtfT0sgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5pdjE2ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5pdjMyID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgI2VuZGlmCisKKyAgICAgICAgICAgICAgICBlbmNyeU1vZGUgPSBaTV9US0lQOworCisgICAgICAgICAgICAgICAgemZUa2lwSW5pdChrZXlJbmZvLmtleSwgKHU4X3QqKSB3ZC0+c3RhLmJzc2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJndkLT5zdGEucnhTZWVkW2tleUluZm8ua2V5SW5kZXhdLCBrZXlJbmZvLmluaXRJdik7CisgICAgICAgICAgICAgICAgemZNaWNTZXRLZXkoJmtleUluZm8ua2V5WzI0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZ3ZC0+c3RhLnJ4TWljS2V5W2tleUluZm8ua2V5SW5kZXhdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKCBrZXlJbmZvLmtleUxlbmd0aCA9PSAxNiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogQUVTICovCisgICAgICAgICAgICAgICAgI2lmIDAKKyAgICAgICAgICAgICAgICAvLyBEb24ndCByZXNldCB0aGUgSVYgc2luY2Ugc29tZSBBUCB3b3VsZCBmYWlsIGluIElWIGNoZWNrIGFuZCBkcm9wIG91ciBjb25uZWN0aW9uCisgICAgICAgICAgICAgICAgaWYgKCB3ZC0+c3RhLndwYVN0YXRlICE9IFpNX1NUQV9XUEFfU1RBVEVfUEtfT0sgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyogYnJvYWRjYXN0IC0tID4gZ3JvdXAga2V5ICovCisgICAgICAgICAgICAgICAgICAgIC8qIE9ubHkgaW5pdGlhbGl6ZSB3aGVuIHNldCBvdXIgZGVmYXVsdCBrZXkgISAqLworICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLml2MTYgPSAwOworICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLml2MzIgPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAjZW5kaWYKKworICAgICAgICAgICAgICAgIGVuY3J5TW9kZSA9IFpNX0FFUzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKCBrZXlJbmZvLmtleUxlbmd0aCA9PSAyOSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiV0VQIDI1NiIpOworCisgICAgICAgICAgICAgICAgZW5jcnlNb2RlID0gWk1fV0VQMjU2OworICAgICAgICAgICAgICAgIC8vemZDb3JlU2V0S2V5KGRldiwgNjQsIDEsIHdkLT5zdGEuZW5jcnlNb2RlLAorICAgICAgICAgICAgICAgIC8vICAgICAgICAgd2QtPnN0YS5ic3NpZCwgKHUzMl90KikgKCZrZXlJbmZvLmtleVsxNl0pKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gWk1fU1RBVFVTX0ZBSUxVUkU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1OF90IGk7CisKKyAgICAgICAgICAgICAgICB6bV9kZWJ1Z19tc2cwKCJrZXkgPSAiKTsKKyAgICAgICAgICAgICAgICBmb3IoaSA9IDA7IGkgPCBrZXlJbmZvLmtleUxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMigiIiwga2V5SW5mby5rZXlbaV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBrZXlJbmZvLmZsYWcgJiBaTV9LRVlfRkxBR19ERUZBVUxUX0tFWSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy9mb3IgV0VQIGRlZmF1bHQga2V5IDF+MyBhbmQgQVRPTSBwbGF0Zm9ybS0tQ1dZYW5nKCspCisgICAgICAgICAgICAgICAgdmFwSWQgPSAwOworICAgICAgICAgICAgICAgIHdkLT5hcC5iY0hhbEtleUlkeFt2YXBJZF0gPSBrZXlJbmZvLmtleUluZGV4OworICAgICAgICAgICAgICAgIHdkLT5hcC5iY0tleUluZGV4W3ZhcElkXSA9IGtleUluZm8ua2V5SW5kZXg7CisgICAgICAgICAgICAgICAgd2QtPnN0YS5rZXlJZCA9IGtleUluZm8ua2V5SW5kZXg7CisgICAgICAgICAgICB9CisKKwkJCWlmKGVuY3J5TW9kZSA9PSBaTV9US0lQKQorCQkJeworCQkJCWlmKHdkLT5US0lQX0dyb3VwX0tleUNoYW5naW5nID09IDB4MSkKKwkJCQl7CisJCQkJCXptX2RlYnVnX21zZzAoIkNvdW50ZXJtZWFzdXJlIDogQ2FuY2VsIE9sZCBUaW1lciAiKTsKKwkJCQkJemZUaW1lckNhbmNlbChkZXYsCVpNX0VWRU5UX1NLSVBfQ09VTlRFUk1FQVNVUkUpOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQl6bV9kZWJ1Z19tc2cwKCJDb3VudGVybWVhc3VyZSA6IENyZWF0ZSBOZXcgVGltZXIgIik7CisJCQkJfQorCisJCQkJd2QtPlRLSVBfR3JvdXBfS2V5Q2hhbmdpbmcgPSAweDE7CisJCQkJemZUaW1lclNjaGVkdWxlKGRldiwgWk1fRVZFTlRfU0tJUF9DT1VOVEVSTUVBU1VSRSwgMTUwKTsKKwkJCX0KKworCisKKwkJCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgIC8qIHVzZSBkZWZhdWx0IGtleSAqLworICAgICAgICAgICAgLy96ZkNvcmVTZXRLZXkoZGV2LCBaTV9VU0VSX0tFWV9ERUZBVUxUK2tleUluZm8ua2V5SW5kZXgsIDAsCisgICAgICAgICAgICAvLyAgICAgICAgIHdkLT5zdGEuZW5jcnlNb2RlLCB3ZC0+c3RhLmJzc2lkLCAodTMyX3QqKSBrZXlJbmZvLmtleSk7CisKKyAgICAgICAgICAgIGlmICggZW5jcnlNb2RlID09IFpNX1RLSVAgfHwKKyAgICAgICAgICAgICAgICAgZW5jcnlNb2RlID09IFpNX0FFUyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgemZIcFNldERlZmF1bHRLZXkoZGV2LCBrZXlJbmZvLmtleUluZGV4LCBlbmNyeU1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodTMyX3QqKSBrZXlJbmZvLmtleSwgKHUzMl90KikgJmtleUluZm8ua2V5WzE2XSk7CisKKyNpZmRlZiBaTV9FTkFCTEVfSUJTU19XUEEyUFNLCisgICAgICAgICAgICBpZiAoIChrZXlJbmZvLmtleUxlbmd0aD09MTYpICYmICh3ZC0+c3RhLmlic3NXcGEyUHNrPT0xKSApCisgICAgICAgICAgICB7LyogSWYgbm90IEFFUy1DQ01QIGFuZCBpYnNzIG5ldHdvcmsgLCB1c2UgdHJhZGl0aW9uYWwgKi8KKyAgICAgICAgICAgICAgICB3ZC0+c3RhLndwYVN0YXRlID0gWk1fU1RBX1dQQV9TVEFURV9QS19PSzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAod2QtPnN0YS53cGFTdGF0ZSA9PSBaTV9TVEFfV1BBX1NUQVRFX1BLX09LKQorICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLndwYVN0YXRlID0gWk1fU1RBX1dQQV9TVEFURV9HS19PSzsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLndwYVN0YXRlID0gWk1fU1RBX1dQQV9TVEFURV9QS19PSzsKKyAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5lbmNyeU1vZGUgPSBlbmNyeU1vZGU7CisgICAgICAgICAgICAgICAgICAgIHdkLT53cy5lbmNyeU1vZGUgPSBlbmNyeU1vZGU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgICAgICAgICBpZiAod2QtPnN0YS53cGFTdGF0ZSA9PSBaTV9TVEFfV1BBX1NUQVRFX1BLX09LKQorICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLndwYVN0YXRlID0gWk1fU1RBX1dQQV9TVEFURV9HS19PSzsKKyAgICAgICAgICAgICAgICBlbHNlIGlmICggd2QtPnN0YS53cGFTdGF0ZSA9PSBaTV9TVEFfV1BBX1NUQVRFX0lOSVQgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS53cGFTdGF0ZSA9IFpNX1NUQV9XUEFfU1RBVEVfUEtfT0s7CisgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEuZW5jcnlNb2RlID0gZW5jcnlNb2RlOworICAgICAgICAgICAgICAgICAgICB3ZC0+d3MuZW5jcnlNb2RlID0gZW5jcnlNb2RlOworICAgICAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHpmSHBTZXREZWZhdWx0S2V5KGRldiwga2V5SW5mby5rZXlJbmRleCwgZW5jcnlNb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1MzJfdCopIGtleUluZm8ua2V5LCBOVUxMKTsKKworICAgICAgICAgICAgICAgIC8qIFNhdmUga2V5IGZvciBzb2Z0d2FyZSBXRVAgKi8KKyAgICAgICAgICAgICAgICB6Zk1lbW9yeUNvcHkod2QtPnN0YS53ZXBLZXlba2V5SW5mby5rZXlJbmRleF0sIGtleUluZm8ua2V5LAorICAgICAgICAgICAgICAgICAgICAgICAga2V5SW5mby5rZXlMZW5ndGgpOworCisgICAgICAgICAgICAgICAgLyogVE9ETzogQ2hlY2sgd2hldGhlciB3ZSBuZWVkIHRvIHNhdmUgdGhlIFNXRW5jcnlNb2RlICovCisgICAgICAgICAgICAgICAgd2QtPnN0YS5TV0VuY3J5TW9kZVtrZXlJbmZvLmtleUluZGV4XSA9IGVuY3J5TW9kZTsKKworICAgICAgICAgICAgICAgIHdkLT5zdGEuZW5jcnlNb2RlID0gZW5jcnlNb2RlOworICAgICAgICAgICAgICAgIHdkLT53cy5lbmNyeU1vZGUgPSBlbmNyeU1vZGU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKy8vICAgIHdkLT5zdGEuZmxhZ0tleUNoYW5naW5nID0gMTsKKyAgICByZXR1cm4gWk1fU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qIFBTRVVETyB0ZXN0ICovCit1OF90IHpmaVdsYW5QU0VVRE9TZXRLZXkoemRldl90KiBkZXYsIHN0cnVjdCB6c0tleUluZm8ga2V5SW5mbykKK3sKKyAgICAvL3UxNl90ICBicm9hZGNhc3RbM10gPSB7MHhmZmZmLCAweGZmZmYsIDB4ZmZmZn07CisgICAgLy91MzJfdCoga2V5OworICAgIHU4X3QgICBtaWNLZXlbMTZdOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgc3dpdGNoIChrZXlJbmZvLmtleUxlbmd0aCkKKyAgICB7CisgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgIHdkLT5zdGEuZW5jcnlNb2RlID0gWk1fV0VQNjQ7CisgICAgICAgICAgICAvKiB1c2UgZGVmYXVsdCBrZXkgKi8KKyAgICAgICAgICAgIHpmQ29yZVNldEtleShkZXYsIDY0LCAwLCBaTV9XRVA2NCwgKHUxNl90ICopa2V5SW5mby5tYWNBZGRyLCAodTMyX3QqKSBrZXlJbmZvLmtleSk7CisJCSAgICAgICAgICBicmVhazsKKworICAgICAgIAljYXNlIDEzOgorICAgICAgICAgICAgd2QtPnN0YS5lbmNyeU1vZGUgPSBaTV9XRVAxMjg7CisgICAgICAgICAgICAvKiB1c2UgZGVmYXVsdCBrZXkgKi8KKyAgICAgICAgICAgIHpmQ29yZVNldEtleShkZXYsIDY0LCAwLCBaTV9XRVAxMjgsICh1MTZfdCAqKWtleUluZm8ubWFjQWRkciwgKHUzMl90Kikga2V5SW5mby5rZXkpOworICAgICAgICAgIAkJYnJlYWs7CisKKyAgICAgICAJY2FzZSAyOToKKyAgICAgICAgICAgIHdkLT5zdGEuZW5jcnlNb2RlID0gWk1fV0VQMjU2OworICAgICAgICAgICAgLyogdXNlIGRlZmF1bHQga2V5ICovCisgICAgICAgICAgICB6ZkNvcmVTZXRLZXkoZGV2LCA2NCwgMSwgWk1fV0VQMjU2LCAgKHUxNl90ICopa2V5SW5mby5tYWNBZGRyLCAodTMyX3QqKSAoJmtleUluZm8ua2V5WzE2XSkpOworICAgICAgICAgICAgemZDb3JlU2V0S2V5KGRldiwgNjQsIDAsIFpNX1dFUDI1NiwgKHUxNl90ICopa2V5SW5mby5tYWNBZGRyLCAodTMyX3QqKSBrZXlJbmZvLmtleSk7CisJCSAgICAgICAgICBicmVhazsKKworICAgICAgIAljYXNlIDE2OgorICAgICAgICAgICAgd2QtPnN0YS5lbmNyeU1vZGUgPSBaTV9BRVM7CisgICAgICAgICAgICAvL3pmQ29yZVNldEtleShkZXYsIDAsIDAsIFpNX0FFUywgKHUxNl90ICopa2V5SW5mby5tYWNBZGRyLCAodTMyX3QqKSBrZXlJbmZvLmtleSk7CisgICAgICAgICAgICB6ZkNvcmVTZXRLZXkoZGV2LCA2NCwgMCwgWk1fQUVTLCAodTE2X3QgKilrZXlJbmZvLm1hY0FkZHIsICh1MzJfdCopIGtleUluZm8ua2V5KTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgCWNhc2UgMzI6CisjaWZkZWYgWk1fRU5BQkxFX0NFTkMKKyAgICAgICAgICAgIGlmIChrZXlJbmZvLmZsYWcgJiBaTV9LRVlfRkxBR19DRU5DKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHUxNl90IGJvYXJkY2FzdEFkZHJbM10gPSB7MHhmZmZmLCAweGZmZmYsIDB4ZmZmZn07CisgICAgICAgICAgICAgICAgdTE2X3QgQWRkcl9hW10gPSB7IDB4MDAwMCwgMHgwMDgwLCAweDA5MDF9OworICAgICAgICAgICAgICAgIHUxNl90IEFkZHJfYltdID0geyAweDAwMDAsIDB4MDA4MCwgMHgwOTAyfTsKKyAgICAgICAgICAgICAgICAvKiBDRU5DIHRlc3Q6IHVzZXIwLDEgYW5kIHVzZXIyIGZvciBib2FyZGNhc3QgKi8KKyAgICAgICAgICAgICAgICB3ZC0+c3RhLmVuY3J5TW9kZSA9IFpNX0NFTkM7CisgICAgICAgICAgICAgICAgemZDb3JlU2V0S2V5KGRldiwgMCwgMSwgWk1fQ0VOQywgKHUxNl90ICopQWRkcl9hLCAodTMyX3QqKSAoJmtleUluZm8ua2V5WzE2XSkpOworICAgICAgICAgICAgICAgIHpmQ29yZVNldEtleShkZXYsIDAsIDAsIFpNX0NFTkMsICh1MTZfdCAqKUFkZHJfYSwgKHUzMl90Kikga2V5SW5mby5rZXkpOworCisgICAgICAgICAgICAgICAgemZDb3JlU2V0S2V5KGRldiwgMSwgMSwgWk1fQ0VOQywgKHUxNl90ICopQWRkcl9iLCAodTMyX3QqKSAoJmtleUluZm8ua2V5WzE2XSkpOworICAgICAgICAgICAgICAgIHpmQ29yZVNldEtleShkZXYsIDEsIDAsIFpNX0NFTkMsICh1MTZfdCAqKUFkZHJfYiwgKHUzMl90Kikga2V5SW5mby5rZXkpOworCisgICAgICAgICAgICAgICAgemZDb3JlU2V0S2V5KGRldiwgMiwgMSwgWk1fQ0VOQywgKHUxNl90ICopYm9hcmRjYXN0QWRkciwgKHUzMl90KikgKCZrZXlJbmZvLmtleVsxNl0pKTsKKyAgICAgICAgICAgICAgICB6ZkNvcmVTZXRLZXkoZGV2LCAyLCAwLCBaTV9DRU5DLCAodTE2X3QgKilib2FyZGNhc3RBZGRyLCAodTMyX3QqKSBrZXlJbmZvLmtleSk7CisKKyAgICAgICAgICAgICAgICAvKiBJbml0aWFsaXplIFBOIHNlcXVlbmNlICovCisgICAgICAgICAgICAgICAgd2QtPnN0YS50eGl2WzBdID0gMHg1YzM2NWMzNjsKKyAgICAgICAgICAgICAgICB3ZC0+c3RhLnR4aXZbMV0gPSAweDVjMzY1YzM2OworICAgICAgICAgICAgICAgIHdkLT5zdGEudHhpdlsyXSA9IDB4NWMzNjVjMzY7CisgICAgICAgICAgICAgICAgd2QtPnN0YS50eGl2WzNdID0gMHg1YzM2NWMzNjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyNlbmRpZiAvL1pNX0VOQUJMRV9DRU5DCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2QtPnN0YS5lbmNyeU1vZGUgPSBaTV9US0lQOworICAgICAgICAgICAgICAgIHpmQ29yZVNldEtleShkZXYsIDY0LCAxLCBaTV9US0lQLCAodTE2X3QgKilrZXlJbmZvLm1hY0FkZHIsICh1MzJfdCopIG1pY0tleSk7CisgICAgICAgICAgICAgICAgemZDb3JlU2V0S2V5KGRldiwgNjQsIDAsIFpNX1RLSVAsICh1MTZfdCAqKWtleUluZm8ubWFjQWRkciwgKHUzMl90Kikga2V5SW5mby5rZXkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB3ZC0+c3RhLmVuY3J5TW9kZSA9IFpNX05PX1dFUDsKKyAgICB9CisKKyAgICByZXR1cm4gWk1fU1RBVFVTX1NVQ0NFU1M7Cit9CisKK3ZvaWQgemZpV2xhblNldFBvd2VyU2F2ZU1vZGUoemRldl90KiBkZXYsIHU4X3QgbW9kZSkKK3sKKyNpZiAwCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgd2QtPnN0YS5wb3dlclNhdmVNb2RlID0gbW9kZTsKKworICAgIC8qIHNlbmQgbnVsbCBkYXRhIHdpdGggUHdyQml0IHRvIGluZm9ybSBBUCAqLworICAgIGlmICggbW9kZSA+IFpNX1NUQV9QU19OT05FICkKKyAgICB7CisgICAgICAgIGlmICggd2QtPndsYW5Nb2RlID09IFpNX01PREVfSU5GUkFTVFJVQ1RVUkUgKQorICAgICAgICB7CisgICAgICAgICAgICB6ZlNlbmROdWxsRGF0YShkZXYsIDEpOworICAgICAgICB9CisKKyAgICAgICAgLyogZGV2aWNlIGludG8gUFMgbW9kZSAqLworICAgICAgICB6ZlBTRGV2aWNlU2xlZXAoZGV2KTsKKyAgICB9CisjZW5kaWYKKworICAgIHpmUG93ZXJTYXZpbmdNZ3JTZXRNb2RlKGRldiwgbW9kZSk7Cit9CisKK3ZvaWQgemZpV2xhblNldE1hY0FkZHJlc3MoemRldl90KiBkZXYsIHUxNl90KiBtYWMpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgd2QtPm1hY0FkZHJbMF0gPSBtYWNbMF07CisgICAgd2QtPm1hY0FkZHJbMV0gPSBtYWNbMV07CisgICAgd2QtPm1hY0FkZHJbMl0gPSBtYWNbMl07CisKKyAgICB6ZkhwU2V0TWFjQWRkcmVzcyhkZXYsIG1hYywgMCk7Cit9CisKK3U4X3QgemZpV2xhblF1ZXJ5V2xhbk1vZGUoemRldl90KiBkZXYpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgcmV0dXJuIHdkLT53bGFuTW9kZTsKK30KKwordThfdCB6ZmlXbGFuUXVlcnlBZGFwdGVyU3RhdGUoemRldl90KiBkZXYpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgcmV0dXJuIHdkLT5zdGF0ZTsKK30KKwordThfdCB6ZmlXbGFuUXVlcnlBdXRoZW50aWNhdGlvbk1vZGUoemRldl90KiBkZXYsIHU4X3QgYldyYXBwZXIpCit7CisgICAgdThfdCAgIGF1dGhNb2RlOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgaWYgKCBiV3JhcHBlciApCisgICAgeworICAgICAgICBhdXRoTW9kZSA9IHdkLT53cy5hdXRoTW9kZTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLy9hdXRoTW9kZSA9IHdkLT5zdGEuYXV0aE1vZGU7CisgICAgICAgIGF1dGhNb2RlID0gd2QtPnN0YS5jdXJyZW50QXV0aE1vZGU7CisgICAgfQorCisgICAgcmV0dXJuIGF1dGhNb2RlOworfQorCit1OF90IHpmaVdsYW5RdWVyeVdlcFN0YXR1cyh6ZGV2X3QqIGRldiwgdThfdCBiV3JhcHBlcikKK3sKKyAgICB1OF90IHdlcFN0YXR1czsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIGlmICggYldyYXBwZXIgKQorICAgIHsKKyAgICAgICAgd2VwU3RhdHVzID0gd2QtPndzLndlcFN0YXR1czsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgd2VwU3RhdHVzID0gd2QtPnN0YS53ZXBTdGF0dXM7CisgICAgfQorCisgICAgcmV0dXJuIHdlcFN0YXR1czsKK30KKwordm9pZCB6ZmlXbGFuUXVlcnlTU0lEKHpkZXZfdCogZGV2LCB1OF90KiBzc2lkLCB1OF90KiBwU3NpZExlbmd0aCkKK3sKKyAgICB1MTZfdCB2YXBJZCA9IDA7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgaWYgKHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0FQKQorICAgIHsKKyAgICAgICAgdmFwSWQgPSB6ZndHZXRWYXBJZChkZXYpOworCisgICAgICAgIGlmICh2YXBJZCA9PSAweGZmZmYpCisgICAgICAgIHsKKyAgICAgICAgICAgICpwU3NpZExlbmd0aCA9IHdkLT5hcC5zc2lkTGVuWzBdOworICAgICAgICAgICAgemZNZW1vcnlDb3B5KHNzaWQsIHdkLT5hcC5zc2lkWzBdLCB3ZC0+YXAuc3NpZExlblswXSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAqcFNzaWRMZW5ndGggPSB3ZC0+YXAuc3NpZExlblt2YXBJZCArIDFdOworICAgICAgICAgICAgemZNZW1vcnlDb3B5KHNzaWQsIHdkLT5hcC5zc2lkW3ZhcElkICsgMV0sIHdkLT5hcC5zc2lkTGVuW3ZhcElkICsgMV0pOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgICpwU3NpZExlbmd0aCA9IHdkLT5zdGEuc3NpZExlbjsKKyAgICAgICAgemZNZW1vcnlDb3B5KHNzaWQsIHdkLT5zdGEuc3NpZCwgd2QtPnN0YS5zc2lkTGVuKTsKKyAgICB9Cit9CisKK3UxNl90IHpmaVdsYW5RdWVyeUZyYWdUaHJlc2hvbGQoemRldl90KiBkZXYpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgcmV0dXJuIHdkLT5mcmFnVGhyZXNob2xkOworfQorCit1MTZfdCB6ZmlXbGFuUXVlcnlSdHNUaHJlc2hvbGQoemRldl90KiBkZXYpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgcmV0dXJuIHdkLT5ydHNUaHJlc2hvbGQ7Cit9CisKK3UzMl90IHpmaVdsYW5RdWVyeUZyZXF1ZW5jeSh6ZGV2X3QqIGRldikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICByZXR1cm4gKHdkLT5mcmVxdWVuY3kqMTAwMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb246IHpmaVdsYW5RdWVyeUN1cnJlbnRGcmVxdWVuY3kKKyAqIFJldHVybiB2YWx1ZToKKyAqICAgLSAgIDAgOiBubyB2YWxpZGF0ZSBjdXJyZW50IGZyZXF1ZW5jeQorICogICAtICg+MCk6IGN1cnJlbnQgZnJlcXVlbmN5IGRlcGVuZCBvbiAicW1vZGUiCisgKiBJbnB1dDoKKyAqICAgLSBxbW9kZToKKyAqICAgICAgMDogcmV0dXJuIHZhbHVlIGRlcGVuZCBvbiB0aGUgc3VwcG9ydCBtb2RlLCB0aGlzCisgICAgICAgICAgIHFtb2RlIGlzIHVzZSB0byBzb2x2ZSB0aGUgYnVnICMzMTIyMworICogICAgICAxOiByZXR1cm4gdGhlIGFjdHVhbGx5IGN1cnJlbnQgZnJlcXVlbmN5CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MzJfdCB6ZmlXbGFuUXVlcnlDdXJyZW50RnJlcXVlbmN5KHpkZXZfdCogZGV2LCB1OF90IHFtb2RlKQoreworICAgIHUzMl90IGZyZXF1ZW5jeTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHN3aXRjaCAocW1vZGUpCisgICAgeworICAgIGNhc2UgMDoKKyAgICAgICAgaWYgKHdkLT5zdGEuY3VycmVudEZyZXF1ZW5jeSA+IDMwMDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh3ZC0+c3VwcG9ydE1vZGUgJiBaTV9XSVJFTEVTU19NT0RFXzUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZnJlcXVlbmN5ID0gd2QtPnN0YS5jdXJyZW50RnJlcXVlbmN5OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAod2QtPnN1cHBvcnRNb2RlICYgWk1fV0lSRUxFU1NfTU9ERV8yNCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmcmVxdWVuY3kgPSB6ZkNoR2V0Rmlyc3QyR2h6Q2hhbm5lbChkZXYpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZyZXF1ZW5jeSA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpZiAod2QtPnN1cHBvcnRNb2RlICYgWk1fV0lSRUxFU1NfTU9ERV8yNCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmcmVxdWVuY3kgPSB3ZC0+c3RhLmN1cnJlbnRGcmVxdWVuY3k7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICh3ZC0+c3VwcG9ydE1vZGUgJiBaTV9XSVJFTEVTU19NT0RFXzUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZnJlcXVlbmN5ID0gemZDaEdldExhc3Q1R2h6Q2hhbm5lbChkZXYpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZyZXF1ZW5jeSA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIDE6CisgICAgICAgIGZyZXF1ZW5jeSA9IHdkLT5zdGEuY3VycmVudEZyZXF1ZW5jeTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgICBmcmVxdWVuY3kgPSAwOworICAgIH0KKworICAgIHJldHVybiAoZnJlcXVlbmN5KjEwMDApOworfQorCit1MzJfdCB6ZmlXbGFuUXVlcnlGcmVxdWVuY3lBdHRyaWJ1dGUoemRldl90KiBkZXYsIHUzMl90IGZyZXEpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgdThfdCAgaTsKKyAgICB1MTZfdCBmcmVxdWVuY3kgPSAodTE2X3QpIChmcmVxLzEwMDApOworICAgIHUzMl90IHJldCA9IDA7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgd2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxDbnQ7IGkrKykKKyAgICB7CisgICAgICAgIGlmICggd2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxbaV0uY2hhbm5lbCA9PSBmcmVxdWVuY3kgKQorICAgICAgICB7CisgICAgICAgICAgICByZXQgPSB3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbFtpXS5jaGFubmVsRmxhZ3M7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCisvKiBCYW5kV2lkdGggIDA9PjIwICAxPT40MCAqLworLyogRXh0T2Zmc2V0ICAwPT4yMCAgMT0+aGlnaCBjb250cm9sIDQwICAgMz0+bG93IGNvbnRyb2wgNDAgKi8KK3ZvaWQgemZpV2xhblF1ZXJ5RnJlcXVlbmN5SFQoemRldl90KiBkZXYsIHUzMl90ICpiYW5kV2lkdGgsIHUzMl90ICpleHRPZmZzZXQpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgKmJhbmRXaWR0aCA9IHdkLT5CYW5kV2lkdGg0MDsKKyAgICAqZXh0T2Zmc2V0ID0gd2QtPkV4dE9mZnNldDsKK30KKwordThfdCB6ZmlXbGFuUXVlcnlDV01vZGUoemRldl90KiBkZXYpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgcmV0dXJuIHdkLT5jd20uY3dfbW9kZTsKK30KKwordTMyX3QgemZpV2xhblF1ZXJ5Q1dFbmFibGUoemRldl90KiBkZXYpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgcmV0dXJuIHdkLT5jd20uY3dfZW5hYmxlOworfQorCit2b2lkIHpmaVdsYW5RdWVyeUJzc2lkKHpkZXZfdCogZGV2LCB1OF90KiBic3NpZCkKK3sKKyAgICB1OF90ICAgYWRkcls2XTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIFpNX01BQ19XT1JEX1RPX0JZVEUod2QtPnN0YS5ic3NpZCwgYWRkcik7CisgICAgemZNZW1vcnlDb3B5KGJzc2lkLCBhZGRyLCA2KTsKK30KKwordTE2X3QgemZpV2xhblF1ZXJ5QmVhY29uSW50ZXJ2YWwoemRldl90KiBkZXYpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgcmV0dXJuIHdkLT5iZWFjb25JbnRlcnZhbDsKK30KKwordTMyX3QgemZpV2xhblF1ZXJ5UnhCZWFjb25Ub3RhbCh6ZGV2X3QqIGRldikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisgICAgd2QtPnN0YS5yeEJlYWNvblRvdGFsICs9IHdkLT5zdGEucnhCZWFjb25Db3VudDsKKworICAgIHJldHVybiB3ZC0+c3RhLnJ4QmVhY29uVG90YWw7Cit9CisKK3UxNl90IHpmaVdsYW5RdWVyeUF0aW1XaW5kb3coemRldl90KiBkZXYpCit7CisgICAgdTE2X3QgYXRpbVdpbmRvdzsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIGF0aW1XaW5kb3cgPSB3ZC0+c3RhLmF0aW1XaW5kb3c7CisKKyAgICByZXR1cm4gYXRpbVdpbmRvdzsKK30KKwordThfdCB6ZmlXbGFuUXVlcnlFbmNyeU1vZGUoemRldl90KiBkZXYpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgaWYgKHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0FQKQorICAgICAgICByZXR1cm4gd2QtPmFwLmVuY3J5TW9kZVswXTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiB3ZC0+c3RhLmVuY3J5TW9kZTsKK30KKwordTE2X3QgemZpV2xhblF1ZXJ5Q2FwYWJpbGl0eSh6ZGV2X3QqIGRldikKK3sKKyAgICB1MTZfdCBjYXBhYmlsaXR5OworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgY2FwYWJpbGl0eSA9IHdkLT5zdGEuY2FwYWJpbGl0eVswXSArCisgICAgICAgICAgICAgICAgICgoKHUxNl90KSB3ZC0+c3RhLmNhcGFiaWxpdHlbMV0pIDw8IDgpOworCisgICAgcmV0dXJuIGNhcGFiaWxpdHk7CisKK30KKwordTE2X3QgemZpV2xhblF1ZXJ5QWlkKHpkZXZfdCogZGV2KQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHJldHVybiB3ZC0+c3RhLmFpZDsKK30KKwordm9pZCB6ZmlXbGFuUXVlcnlTdXBwb3J0UmF0ZSh6ZGV2X3QqIGRldiwgdThfdCogcmF0ZUFycmF5LCB1OF90KiBwTGVuZ3RoKQoreworICAgIHU4X3QgICBpLCBqPTA7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBmb3IoIGk9MDsgaTw0OyBpKysgKQorICAgIHsKKyAgICAgICAgaWYgKCB3ZC0+YlJhdGUgJiAoMHgxIDw8IGkpICkKKyAgICAgICAgeworICAgICAgICAgICAgcmF0ZUFycmF5W2pdID0gemcxMWJSYXRlVGJsW2ldICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICgod2QtPmJSYXRlQmFzaWMgJiAoMHgxPDxpKSk8PCg3LWkpKTsKKyAgICAgICAgICAgIGorKzsKKyAgICAgICAgfQorICAgIH0KKworICAgICpwTGVuZ3RoID0gajsKK30KKwordm9pZCB6ZmlXbGFuUXVlcnlFeHRTdXBwb3J0UmF0ZSh6ZGV2X3QqIGRldiwgdThfdCogcmF0ZUFycmF5LCB1OF90KiBwTGVuZ3RoKQoreworICAgIHU4X3QgICBpLCBqPTA7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBmb3IoIGk9MDsgaTw4OyBpKysgKQorICAgIHsKKyAgICAgICAgaWYgKCB3ZC0+Z1JhdGUgJiAoMHgxIDw8IGkpICkKKyAgICAgICAgeworICAgICAgICAgICAgcmF0ZUFycmF5W2pdID0gemcxMWdSYXRlVGJsW2ldICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICgod2QtPmdSYXRlQmFzaWMgJiAoMHgxPDxpKSk8PCg3LWkpKTsKKyAgICAgICAgICAgIGorKzsKKyAgICAgICAgfQorICAgIH0KKworICAgICpwTGVuZ3RoID0gajsKK30KKwordm9pZCB6ZmlXbGFuUXVlcnlSc25JZSh6ZGV2X3QqIGRldiwgdThfdCogaWUsIHU4X3QqIHBMZW5ndGgpCit7CisgICAgdThfdCBsZW47CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBsZW4gPSB3ZC0+c3RhLnJzbkllWzFdICsgMjsKKyAgICB6Zk1lbW9yeUNvcHkoaWUsIHdkLT5zdGEucnNuSWUsIGxlbik7CisgICAgKnBMZW5ndGggPSBsZW47Cit9CisKK3ZvaWQgemZpV2xhblF1ZXJ5V3BhSWUoemRldl90KiBkZXYsIHU4X3QqIGllLCB1OF90KiBwTGVuZ3RoKQoreworICAgIHU4X3QgbGVuOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgbGVuID0gd2QtPnN0YS53cGFJZVsxXSArIDI7CisgICAgemZNZW1vcnlDb3B5KGllLCB3ZC0+c3RhLndwYUllLCBsZW4pOworICAgICpwTGVuZ3RoID0gbGVuOworCit9CisKK3U4X3QgemZpV2xhblF1ZXJ5TXVsdGljYXN0Q2lwaGVyQWxnbyh6ZGV2X3QgKmRldikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBzd2l0Y2goIHdkLT5zdGEuY3VycmVudEF1dGhNb2RlICkKKyAgICB7CisgICAgICAgIGNhc2UgWk1fQVVUSF9NT0RFX1dQQTJQU0s6CisgICAgICAgIGNhc2UgWk1fQVVUSF9NT0RFX1dQQTI6CisgICAgICAgICAgICBpZiAoIHdkLT5zdGEucnNuSWVbN10gPT0gMiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFpNX1RLSVA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFpNX0FFUzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgWk1fQVVUSF9NT0RFX1dQQVBTSzoKKyAgICAgICAgY2FzZSBaTV9BVVRIX01PREVfV1BBOgorICAgICAgICAgICAgaWYgKCB3ZC0+c3RhLnJzbkllWzExXSA9PSAyICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gWk1fVEtJUDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gWk1fQUVTOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiB3ZC0+c3RhLmVuY3J5TW9kZTsKKyAgICB9Cit9CisKK3U4X3QgemZpV2xhblF1ZXJ5SFRNb2RlKHpkZXZfdCogZGV2KQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICAvLyAwOkxlZ2FuY3ksIDE6TgorICAgIHJldHVybiB3ZC0+c3RhLkVuYWJsZUhUOworfQorCit1OF90IHpmaVdsYW5RdWVyeUJhbmRXaWR0aDQwKHpkZXZfdCogZGV2KQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICAvLyAwOjIwTSwgMTo0ME0KKyAgICByZXR1cm4gd2QtPkJhbmRXaWR0aDQwOworfQorCit1MTZfdCB6ZmlXbGFuUXVlcnlSZWdpb25Db2RlKHpkZXZfdCogZGV2KQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHJldHVybiB3ZC0+cmVndWxhdGlvblRhYmxlLnJlZ2lvbkNvZGU7Cit9Cit2b2lkIHpmaVdsYW5TZXRXcGFJZSh6ZGV2X3QqIGRldiwgdThfdCogaWUsIHU4X3QgTGVuZ3RoKQoreworICAgIHUxNl90IHZhcElkID0gMDsKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBpZiAod2QtPndsYW5Nb2RlID09IFpNX01PREVfQVApIC8vIEFQIE1vZGUKKyAgICB7CisgICAgICAgIHZhcElkID0gemZ3R2V0VmFwSWQoZGV2KTsKKworICAgICAgICBpZiAodmFwSWQgPT0gMHhmZmZmKQorICAgICAgICAgICAgdmFwSWQgPSAwOworICAgICAgICBlbHNlCisgICAgICAgICAgICB2YXBJZCsrOworCisgICAgICAgIHptX2Fzc2VydChMZW5ndGggPCBaTV9NQVhfV1BBSUVfU0laRSk7CisgICAgICAgIGlmIChMZW5ndGggPCBaTV9NQVhfV1BBSUVfU0laRSkKKyAgICAgICAgeworICAgICAgICAgICAgd2QtPmFwLndwYUxlblt2YXBJZF0gPSBMZW5ndGg7CisgICAgICAgICAgICB6Zk1lbW9yeUNvcHkod2QtPmFwLndwYUllW3ZhcElkXSwgaWUsIHdkLT5hcC53cGFMZW5bdmFwSWRdKTsKKyAgICAgICAgfQorCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHdkLT5zdGEud3BhTGVuID0gTGVuZ3RoOworICAgICAgICB6Zk1lbW9yeUNvcHkod2QtPnN0YS53cGFJZSwgaWUsIHdkLT5zdGEud3BhTGVuKTsKKyAgICB9CisgICAgLy96ZmlXbGFuU2V0V3BhU3VwcG9ydChkZXYsIDEpOworICAgIGlmICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9BUCkgLy8gQVAgTW9kZQorICAgIHsKKyAgICAgICAgd2QtPmFwLndwYVN1cHBvcnRbdmFwSWRdID0gMTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgd2QtPnN0YS53cGFTdXBwb3J0ID0gMTsKKyAgICB9CisKK30KKwordm9pZCB6ZmlXbGFuU2V0V3BhU3VwcG9ydCh6ZGV2X3QqIGRldiwgdThfdCBXcGFTdXBwb3J0KQoreworICAgIHUxNl90IHZhcElkID0gMDsKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBpZiAod2QtPndsYW5Nb2RlID09IFpNX01PREVfQVApIC8vIEFQIE1vZGUKKyAgICB7CisgICAgICAgIHZhcElkID0gemZ3R2V0VmFwSWQoZGV2KTsKKworICAgICAgICBpZiAodmFwSWQgPT0gMHhmZmZmKQorICAgICAgICAgICAgdmFwSWQgPSAwOworICAgICAgICBlbHNlCisgICAgICAgICAgICB2YXBJZCsrOworCisgICAgICAgIHdkLT5hcC53cGFTdXBwb3J0W3ZhcElkXSA9IFdwYVN1cHBvcnQ7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHdkLT5zdGEud3BhU3VwcG9ydCA9IFdwYVN1cHBvcnQ7CisgICAgfQorCit9CisKK3ZvaWQgemZpV2xhblNldFByb3RlY3Rpb25Nb2RlKHpkZXZfdCogZGV2LCB1OF90IG1vZGUpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgd2QtPnN0YS5iUHJvdGVjdGlvbk1vZGUgPSBtb2RlOworICAgIGlmICh3ZC0+c3RhLmJQcm90ZWN0aW9uTW9kZSA9PSBUUlVFKQorICAgIHsKKyAgICAgICAgemZIcFNldFNsb3RUaW1lKGRldiwgMCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHpmSHBTZXRTbG90VGltZShkZXYsIDEpOworICAgIH0KKworICAgIHptX21zZzFfbW0oWk1fTFZfMSwgIndkLT5wcm90ZWN0aW9uTW9kZT0iLCB3ZC0+c3RhLmJQcm90ZWN0aW9uTW9kZSk7Cit9CisKK3ZvaWQgemZpV2xhblNldEJhc2ljUmF0ZSh6ZGV2X3QqIGRldiwgdThfdCBiUmF0ZVNldCwgdThfdCBnUmF0ZVNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfdCBuUmF0ZVNldCkKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB3ZC0+d3MuYlJhdGVCYXNpYyA9IGJSYXRlU2V0OworICAgIHdkLT53cy5nUmF0ZUJhc2ljID0gZ1JhdGVTZXQ7CisgICAgd2QtPndzLm5SYXRlQmFzaWMgPSBuUmF0ZVNldDsKK30KKwordm9pZCB6ZmlXbGFuU2V0QkdNb2RlKHpkZXZfdCogZGV2LCB1OF90IG1vZGUpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgd2QtPndzLmJnTW9kZSA9IG1vZGU7Cit9CisKK3ZvaWQgemZpV2xhblNldHByZWFtYmxlVHlwZSh6ZGV2X3QqIGRldiwgdThfdCB0eXBlKQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHdkLT53cy5wcmVhbWJsZVR5cGUgPSB0eXBlOworfQorCit1OF90IHpmaVdsYW5RdWVyeXByZWFtYmxlVHlwZSh6ZGV2X3QqIGRldikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICByZXR1cm4gd2QtPndzLnByZWFtYmxlVHlwZTsKK30KKwordThfdCB6ZmlXbGFuUXVlcnlQb3dlclNhdmVNb2RlKHpkZXZfdCogZGV2KQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHJldHVybiB3ZC0+c3RhLnBvd2VyU2F2ZU1vZGU7Cit9CisKK3U4X3QgemZpV2xhblNldFBta2lkSW5mbyh6ZGV2X3QqIGRldiwgdTE2X3QqIGJzc2lkLCB1OF90KiBwbWtpZCkKK3sKKyAgICB1MzJfdCAgaTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIGZvcihpPTA7IGk8d2QtPnN0YS5wbWtpZEluZm8uYnNzaWRDb3VudDsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKCB6Zk1lbW9yeUlzRXF1YWwoKHU4X3QqKSB3ZC0+c3RhLnBta2lkSW5mby5ic3NpZEluZm9baV0uYnNzaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1OF90KikgYnNzaWQsIDYpICkKKyAgICAgICAgeworICAgICAgICAgICAgLyogbWF0Y2hlZCAqLworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIGkgPCB3ZC0+c3RhLnBta2lkSW5mby5ic3NpZENvdW50ICkKKyAgICB7CisgICAgICAgIC8qIG92ZXJ3cml0ZSB0aGUgb3JpZ2luYWwgb25lICovCisgICAgICAgIHpmTWVtb3J5Q29weSh3ZC0+c3RhLnBta2lkSW5mby5ic3NpZEluZm9baV0ucG1raWQsIHBta2lkLCAxNik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmICggaSA8IFpNX1BNS0lEX01BWF9CU1NfQ05UICkKKyAgICAgICAgeworICAgICAgICAgICAgd2QtPnN0YS5wbWtpZEluZm8uYnNzaWRJbmZvW2ldLmJzc2lkWzBdID0gYnNzaWRbMF07CisgICAgICAgICAgICB3ZC0+c3RhLnBta2lkSW5mby5ic3NpZEluZm9baV0uYnNzaWRbMV0gPSBic3NpZFsxXTsKKyAgICAgICAgICAgIHdkLT5zdGEucG1raWRJbmZvLmJzc2lkSW5mb1tpXS5ic3NpZFsyXSA9IGJzc2lkWzJdOworCisgICAgICAgICAgICB6Zk1lbW9yeUNvcHkod2QtPnN0YS5wbWtpZEluZm8uYnNzaWRJbmZvW2ldLnBta2lkLCBwbWtpZCwgMTYpOworICAgICAgICAgICAgd2QtPnN0YS5wbWtpZEluZm8uYnNzaWRDb3VudCsrOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3UzMl90IHpmaVdsYW5RdWVyeVBta2lkSW5mbyh6ZGV2X3QqIGRldiwgdThfdCogYnVmLCB1MzJfdCBsZW4pCit7CisgICAgLy9zdHJ1Y3QgenNQbWtpZEluZm8qIHBQbWtpZEluZm8gPSAoIHN0cnVjdCB6c1Bta2lkSW5mbyogKSBidWY7CisgICAgdTMyX3QgIHNpemU7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBzaXplID0gc2l6ZW9mKHUzMl90KSArCisgICAgICAgICAgIHdkLT5zdGEucG1raWRJbmZvLmJzc2lkQ291bnQgKiBzaXplb2Yoc3RydWN0IHpzUG1raWRCc3NpZEluZm8pOworCisgICAgaWYgKCBsZW4gPCBzaXplICkKKyAgICB7CisgICAgICAgIHJldHVybiB3ZC0+c3RhLnBta2lkSW5mby5ic3NpZENvdW50OworICAgIH0KKworICAgIHpmTWVtb3J5Q29weShidWYsICh1OF90KikgJndkLT5zdGEucG1raWRJbmZvLCAodTE2X3QpIHNpemUpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgemZpV2xhblNldE11bHRpY2FzdExpc3QoemRldl90KiBkZXYsIHU4X3Qgc2l6ZSwgdThfdCogcExpc3QpCit7CisgICAgc3RydWN0IHpzTXVsdGljYXN0QWRkciogcE1hY0xpc3QgPSAoc3RydWN0IHpzTXVsdGljYXN0QWRkciopIHBMaXN0OworICAgIHU4X3QgICBpOworICAgIHU4X3QgICBiQWxsTXVsdGljYXN0ID0gMDsKKyAgICAvL3UzMl90ICB2YWx1ZTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHdkLT5zdGEubXVsdGljYXN0TGlzdC5zaXplID0gc2l6ZTsKKyAgICBmb3IoaT0wOyBpPHNpemU7IGkrKykKKyAgICB7CisgICAgICAgIHpmTWVtb3J5Q29weSh3ZC0+c3RhLm11bHRpY2FzdExpc3QubWFjQWRkcltpXS5hZGRyLAorICAgICAgICAgICAgICAgICAgICAgcE1hY0xpc3RbaV0uYWRkciwgNik7CisgICAgfQorCisgICAgaWYgKCB3ZC0+c3RhLm9zUnhGaWx0ZXIgJiBaTV9QQUNLRVRfVFlQRV9BTExfTVVMVElDQVNUICkKKyAgICAgICAgYkFsbE11bHRpY2FzdCA9IDE7CisgICAgemZIcFNldE11bHRpY2FzdExpc3QoZGV2LCBzaXplLCBwTGlzdCwgYkFsbE11bHRpY2FzdCk7CisKK30KKwordm9pZCB6ZmlXbGFuUmVtb3ZlS2V5KHpkZXZfdCogZGV2LCB1OF90IGtleVR5cGUsIHU4X3Qga2V5SWQpCit7CisgICAgdTE2X3QgIGZha2VNYWNBZGRyWzNdID0gezAsIDAsIDB9OworICAgIHUzMl90ICBmYWtlS2V5WzRdID0gezAsIDAsIDAsIDB9OworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgaWYgKCBrZXlUeXBlID09IDAgKQorICAgIHsKKyAgICAgICAgLyogcmVtb3ZlIFdFUCBrZXkgKi8KKyAgICAgICAgem1fZGVidWdfbXNnMCgicmVtb3ZlIFdFUCBrZXkiKTsKKyAgICAgICAgemZDb3JlU2V0S2V5KGRldiwgWk1fVVNFUl9LRVlfREVGQVVMVCtrZXlJZCwgMCwKKyAgICAgICAgICAgICAgICAgWk1fTk9fV0VQLCBmYWtlTWFjQWRkciwgZmFrZUtleSk7CisgICAgICAgIHdkLT5zdGEuZW5jcnlNb2RlID0gWk1fTk9fV0VQOworICAgIH0KKyAgICBlbHNlIGlmICgga2V5VHlwZSA9PSAxICkKKyAgICB7CisgICAgICAgIC8qIHJlbW92ZSBwYWlyd2lzZSBrZXkgKi8KKyAgICAgICAgem1fZGVidWdfbXNnMCgicmVtb3ZlIHBhaXJ3aXNlIGtleSIpOworICAgICAgICB6ZkhwUmVtb3ZlS2V5KGRldiwgWk1fVVNFUl9LRVlfUEspOworICAgICAgICB3ZC0+c3RhLmVuY3J5TW9kZSA9IFpNX05PX1dFUDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogcmVtb3ZlIGdyb3VwIGtleSAqLworICAgICAgICB6bV9kZWJ1Z19tc2cwKCJyZW1vdmUgZ3JvdXAga2V5Iik7CisgICAgICAgIHpmSHBSZW1vdmVLZXkoZGV2LCBaTV9VU0VSX0tFWV9HSyk7CisgICAgfQorfQorCisKK3ZvaWQgemZpV2xhblF1ZXJ5UmVndWxhdGlvblRhYmxlKHpkZXZfdCogZGV2LCBzdHJ1Y3QgenNSZWd1bGF0aW9uVGFibGUqIHBFbnRyeSkKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6Zk1lbW9yeUNvcHkoKHU4X3QqKSBwRW50cnksICh1OF90KikgJndkLT5yZWd1bGF0aW9uVGFibGUsCisgICAgICAgICAgICAgICAgIHNpemVvZihzdHJ1Y3QgenNSZWd1bGF0aW9uVGFibGUpKTsKK30KKworLyogcGFyYW1ldGVyICJ0aW1lIiBpcyBzcGVjaWZpZWQgaW4gbXMgKi8KK3ZvaWQgemZpV2xhblNldFNjYW5UaW1lclBlckNoYW5uZWwoemRldl90KiBkZXYsIHUxNl90IHRpbWUpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem1fZGVidWdfbXNnMSgic2NhbiB0aW1lIChtcykgPSAiLCB0aW1lKTsKKworICAgIHdkLT5zdGEuYWN0aXZlc2NhblRpY2tQZXJDaGFubmVsID0gdGltZSAvIFpNX01TX1BFUl9USUNLOworfQorCit2b2lkIHpmaVdsYW5TZXRBdXRvUmVjb25uZWN0KHpkZXZfdCogZGV2LCB1OF90IGVuYWJsZSkKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB3ZC0+c3RhLmJBdXRvUmVjb25uZWN0ID0gZW5hYmxlOworICAgIC8vd2QtPnN0YS5iQXV0b1JlY29ubmVjdEVuYWJsZWQgPSBlbmFibGU7Cit9CisKK3ZvaWQgemZpV2xhblNldFN0YVdtZSh6ZGV2X3QqIGRldiwgdThfdCBlbmFibGUsIHU4X3QgdWFwc2RJbmZvKQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHdkLT53cy5zdGFXbWVFbmFibGVkID0gZW5hYmxlICYgMHgzOworICAgIGlmICgoZW5hYmxlICYgMHgyKSAhPSAwKQorICAgIHsKKyAgICAgICAgd2QtPndzLnN0YVdtZVFvc0luZm8gPSB1YXBzZEluZm8gJiAweDZmOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB3ZC0+d3Muc3RhV21lUW9zSW5mbyA9IDA7CisgICAgfQorfQorCit2b2lkIHpmaVdsYW5TZXRBcFdtZSh6ZGV2X3QqIGRldiwgdThfdCBlbmFibGUpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgd2QtPndzLmFwV21lRW5hYmxlZCA9IGVuYWJsZTsKK30KKwordThfdCB6ZmlXbGFuUXVlcnl3bWVFbmFibGUoemRldl90KiBkZXYpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgcmV0dXJuIHdkLT53cy5zdGFXbWVFbmFibGVkOworfQorCit2b2lkIHpmaVdsYW5TZXRQcm9iaW5nSGlkZGVuU3NpZCh6ZGV2X3QqIGRldiwgdThfdCogc3NpZCwgdThfdCBzc2lkTGVuLAorICAgIHUxNl90IGVudHJ5KQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisKKyAgICBpZiAoKHNzaWRMZW4gPD0gMzIpICYmIChlbnRyeSA8IFpNX01BWF9QUk9CRV9ISURERU5fU1NJRF9TSVpFKSkKKyAgICB7CisgICAgICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgIHdkLT53cy5wcm9iaW5nU3NpZExpc3RbZW50cnldLnNzaWRMZW4gPSBzc2lkTGVuOworICAgICAgICB6Zk1lbW9yeUNvcHkod2QtPndzLnByb2JpbmdTc2lkTGlzdFtlbnRyeV0uc3NpZCwgc3NpZCwgc3NpZExlbik7CisgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgfQorCisgICAgcmV0dXJuOworfQorCit2b2lkIHpmaVdsYW5TZXREaXNhYmxlUHJvYmluZ1dpdGhTc2lkKHpkZXZfdCogZGV2LCB1OF90IG1vZGUpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgd2QtPnN0YS5kaXNhYmxlUHJvYmluZ1dpdGhTc2lkID0gbW9kZTsKKworICAgIHJldHVybjsKK30KKwordm9pZCB6ZmlXbGFuU2V0RHJvcFVuZW5jcnlwdGVkUGFja2V0cyh6ZGV2X3QqIGRldiwgdThfdCBlbmFibGUpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgd2QtPndzLmRyb3BVbmVuY3J5cHRlZFBrdHMgPSBlbmFibGU7Cit9CisKK3ZvaWQgemZpV2xhblNldFN0YVJ4U2VjdXJpdHlDaGVja0NiKHpkZXZfdCogZGV2LCB6ZnBTdGFSeFNlY3VyaXR5Q2hlY2tDYiBwU3RhUnhTZWN1cml0eUNoZWNrQ2IpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgd2QtPnN0YS5wU3RhUnhTZWN1cml0eUNoZWNrQ2IgPSBwU3RhUnhTZWN1cml0eUNoZWNrQ2I7Cit9CisKK3ZvaWQgemZpV2xhblNldElCU1NKb2luT25seSh6ZGV2X3QqIGRldiwgdThfdCBqb2luT25seSkKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB3ZC0+d3MuaWJzc0pvaW5Pbmx5ID0gam9pbk9ubHk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZmlDb25maWdXZHNQb3J0ICAgICAgICAgICAgKi8KKy8qICAgICAgQ29uZmlndXJlIFdEUyBwb3J0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIHdkc1BvcnRJZCA6IFdEUyBwb3J0IElELCBzdGFydCBmcm9tIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBmbGFnIDogMD0+ZGlzYWJsZSBXRFMgcG9ydCwgMT0+ZW5hYmxlIFdEUyBwb3J0ICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgd2RzQWRkciA6IFdEUyBuZWlnaGJvciBNQUMgYWRkcmVzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGVuY1R5cGUgOiBlbmNyeXB0aW9uIHR5cGUgZm9yIFdEUyBwb3J0ICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICB3ZHNLZXkgOiBlbmNyeXB0aW9uIGtleSBmb3IgV0RTIHBvcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBFcnJvciBjb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBTdGVwaGVuIENoZW4gICAgICAgIFp5REFTIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24gICAgMjAwNi42ICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTE2X3QgemZpQ29uZmlnV2RzUG9ydCh6ZGV2X3QqIGRldiwgdThfdCB3ZHNQb3J0SWQsIHUxNl90IGZsYWcsIHUxNl90KiB3ZHNBZGRyLAorICAgICAgICB1MTZfdCBlbmNUeXBlLCB1MzJfdCogd2RzS2V5KQoreworICAgIHUxNl90IGFkZHJbM107CisgICAgdTMyX3Qga2V5WzRdOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgaWYgKHdkc1BvcnRJZCA+IFpNX01BWF9XRFNfU1VQUE9SVCkKKyAgICB7CisgICAgICAgIHJldHVybiBaTV9FUlJfV0RTX1BPUlRfSUQ7CisgICAgfQorCisgICAgaWYgKGZsYWcgPT0gMSkKKyAgICB7CisgICAgICAgIC8qIEVuYWJsZSBXRFMgcG9ydCAqLworICAgICAgICB3ZC0+YXAud2RzLm1hY0FkZHJbd2RzUG9ydElkXVswXSA9IHdkc0FkZHJbMF07CisgICAgICAgIHdkLT5hcC53ZHMubWFjQWRkclt3ZHNQb3J0SWRdWzFdID0gd2RzQWRkclsxXTsKKyAgICAgICAgd2QtPmFwLndkcy5tYWNBZGRyW3dkc1BvcnRJZF1bMl0gPSB3ZHNBZGRyWzJdOworCisgICAgICAgIHdkLT5hcC53ZHMud2RzQml0bWFwIHw9ICgxIDw8IHdkc1BvcnRJZCk7CisgICAgICAgIHdkLT5hcC53ZHMuZW5jcnlNb2RlW3dkc1BvcnRJZF0gPSAodThfdCkgZW5jVHlwZTsKKworICAgICAgICB6ZkNvcmVTZXRLZXkoZGV2LCAxMCtaTV9NQVhfV0RTX1NVUFBPUlQsIDAsICh1OF90KSBlbmNUeXBlLCB3ZHNBZGRyLCB3ZHNLZXkpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKiBEaXNhYmxlIFdEUyBwb3J0ICovCisgICAgICAgIGFkZHJbMF0gPSBhZGRyWzFdID0gYWRkclsyXSA9IDA7CisgICAgICAgIGtleVswXSA9IGtleVsxXSA9IGtleVsyXSA9IGtleVszXSA9IDA7CisgICAgICAgIHdkLT5hcC53ZHMud2RzQml0bWFwICY9ICh+KDEgPDwgd2RzUG9ydElkKSk7CisgICAgICAgIHpmQ29yZVNldEtleShkZXYsIDEwK1pNX01BWF9XRFNfU1VQUE9SVCwgMCwgWk1fTk9fV0VQLCBhZGRyLCBrZXkpOworICAgIH0KKworICAgIHJldHVybiBaTV9TVUNDRVNTOworfQorI2lmZGVmIFpNX0VOQUJMRV9DRU5DCisvKiBDRU5DICovCit2b2lkIHpmaVdsYW5RdWVyeUdTTih6ZGV2X3QqIGRldiwgdThfdCAqZ3NuLCB1MTZfdCB2YXBJZCkKK3sKKyAgICAvL3N0cnVjdCB6c1dsYW5EZXYqIHdkID0gKHN0cnVjdCB6c1dsYW5EZXYqKSB6bXdfd2xhbl9kZXYoZGV2KTsKKyAgICB1MzJfdCB0eGl2WzRdOworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIC8qIGNvbnZlcnQgbGl0dGxlIGVuZGlhbiB0byBiaWcgZW5kaWFuIGZvciAzMiBiaXRzICovCisgICAgdHhpdlszXSA9IHdkLT5hcC50eGl2W3ZhcElkXVswXTsKKyAgICB0eGl2WzJdID0gd2QtPmFwLnR4aXZbdmFwSWRdWzFdOworICAgIHR4aXZbMV0gPSB3ZC0+YXAudHhpdlt2YXBJZF1bMl07CisgICAgdHhpdlswXSA9IHdkLT5hcC50eGl2W3ZhcElkXVszXTsKKworICAgIHpmTWVtb3J5Q29weShnc24sICh1OF90Kil0eGl2LCAxNik7Cit9CisjZW5kaWYgLy9aTV9FTkFCTEVfQ0VOQworLy9DV1lhbmcoKykKK3ZvaWQgemZpV2xhblF1ZXJ5U2lnbmFsSW5mbyh6ZGV2X3QqIGRldiwgdThfdCAqYnVmZmVyKQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIC8qQ2hhbmdlIFNpZ25hbCBTdHJlbmd0aC9RdWFsaXR5IFZhbHVlIHRvIEh1bWFuIFNlbnNlIEhlcmUqLworCisgICAgYnVmZmVyWzBdID0gd2QtPlNpZ25hbFN0cmVuZ3RoOworICAgIGJ1ZmZlclsxXSA9IHdkLT5TaWduYWxRdWFsaXR5OworfQorCisvKiBPUy1YUCAqLwordTE2X3QgemZpU3RhQWRkSWVXcGFSc24oemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCBvZmZzZXQsIHU4X3QgZnJhbWVUeXBlKQoreworICAgIHJldHVybiAgemZTdGFBZGRJZVdwYVJzbihkZXYsIGJ1Ziwgb2Zmc2V0LCBmcmFtZVR5cGUpOworfQorCisvKiB6ZmlEZWJ1Z0NtZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgY21kICAgICAgIHZhbHVlLWRlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAwICAgICAgIHNjaGVkdWxlIHRpbWVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAxICAgICAgIGNhbmNlbCB0aW1lciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgIDIgICAgICAgY2xlYXIgdGltZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgIDMgICAgICAgdGVzdCB0aW1lciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgIDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICA1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgNiAgICAgICBjaGVja3N1bSB0ZXN0ICAgICAwLzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgNyAgICAgICBlbmFibGVQcm90ZWN0aW9uTW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgIDggICAgICAgcnggcGFja2V0IGNvbnRlbnQgZHVtcCAgICAwLzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwordTMyX3QgemZpRGVidWdDbWQoemRldl90KiBkZXYsIHUzMl90IGNtZCwgdTMyX3QgdmFsdWUpCit7CisgICAgdTE2X3QgZXZlbnQ7CisgICAgdTMyX3QgdGljazsKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgaWYgKCBjbWQgPT0gMCApCisgICAgeyAgIC8qIHNjaGVkdWxlIHRpbWVyICovCisgICAgICAgIGV2ZW50ID0gKHUxNl90KSAoKHZhbHVlID4+IDE2KSAmIDB4ZmZmZik7CisgICAgICAgIHRpY2sgPSB2YWx1ZSAmIDB4ZmZmZjsKKyAgICAgICAgemZUaW1lclNjaGVkdWxlKGRldiwgZXZlbnQsIHRpY2spOworICAgIH0KKyAgICBlbHNlIGlmICggY21kID09IDEgKQorICAgIHsgICAvKiBjYW5jZWwgdGltZXIgKi8KKyAgICAgICAgZXZlbnQgPSAodTE2X3QpICh2YWx1ZSAmIDB4ZmZmZik7CisgICAgICAgIHpmVGltZXJDYW5jZWwoZGV2LCBldmVudCk7CisgICAgfQorICAgIGVsc2UgaWYgKCBjbWQgPT0gMiApCisgICAgeyAgIC8qIGNsZWFyIHRpbWVyICovCisgICAgICAgIHpmVGltZXJDbGVhcihkZXYpOworICAgIH0KKyAgICBlbHNlIGlmICggY21kID09IDMgKQorICAgIHsgICAvKiB0ZXN0IHRpbWVyICovCisgICAgICAgIHpmVGltZXJTY2hlZHVsZShkZXYsIDEsICA1MDApOworICAgICAgICB6ZlRpbWVyU2NoZWR1bGUoZGV2LCAyLCAxMDAwKTsKKyAgICAgICAgemZUaW1lclNjaGVkdWxlKGRldiwgMywgMTAwMCk7CisgICAgICAgIHpmVGltZXJTY2hlZHVsZShkZXYsIDQsIDEwMDApOworICAgICAgICB6ZlRpbWVyU2NoZWR1bGUoZGV2LCA1LCAxNTAwKTsKKyAgICAgICAgemZUaW1lclNjaGVkdWxlKGRldiwgNiwgMjAwMCk7CisgICAgICAgIHpmVGltZXJTY2hlZHVsZShkZXYsIDcsIDIyMDApOworICAgICAgICB6ZlRpbWVyU2NoZWR1bGUoZGV2LCA2LCAyNTAwKTsKKyAgICAgICAgemZUaW1lclNjaGVkdWxlKGRldiwgOCwgMjgwMCk7CisgICAgfQorICAgIGVsc2UgaWYgKCBjbWQgPT0gNCkKKyAgICB7CisgICAgICAgIHpmVGltZXJTY2hlZHVsZShkZXYsIDEsICA1MDApOworICAgICAgICB6ZlRpbWVyU2NoZWR1bGUoZGV2LCAyLCAxMDAwKTsKKyAgICAgICAgemZUaW1lclNjaGVkdWxlKGRldiwgMywgMTAwMCk7CisgICAgICAgIHpmVGltZXJTY2hlZHVsZShkZXYsIDQsIDEwMDApOworICAgICAgICB6ZlRpbWVyU2NoZWR1bGUoZGV2LCA1LCAxNTAwKTsKKyAgICAgICAgemZUaW1lclNjaGVkdWxlKGRldiwgNiwgMjAwMCk7CisgICAgICAgIHpmVGltZXJTY2hlZHVsZShkZXYsIDcsIDIyMDApOworICAgICAgICB6ZlRpbWVyU2NoZWR1bGUoZGV2LCA2LCAyNTAwKTsKKyAgICAgICAgemZUaW1lclNjaGVkdWxlKGRldiwgOCwgMjgwMCk7CisgICAgICAgIHpmVGltZXJDYW5jZWwoZGV2LCAxKTsKKyAgICAgICAgemZUaW1lckNhbmNlbChkZXYsIDMpOworICAgICAgICB6ZlRpbWVyQ2FuY2VsKGRldiwgNik7CisgICAgfQorICAgIGVsc2UgaWYgKCBjbWQgPT0gNSApCisgICAgeworICAgICAgICB3ZC0+c3RhLmtleUlkID0gKHU4X3QpIHZhbHVlOworICAgIH0KKwllbHNlIGlmICggY21kID09IDYgKQorCXsKKwkgICAgLyogMDogbm9ybWFsICAgIDE6IGFsd2F5cyBzZXQgVENQL1VEUCBjaGVja3N1bSB6ZXJvICovCisgICAgICAgIHdkLT5jaGVja3N1bVRlc3QgPSB2YWx1ZTsKKwl9CisJZWxzZSBpZiAoIGNtZCA9PSA3ICkKKwl7CisgICAgICAgIHdkLT5lbmFibGVQcm90ZWN0aW9uTW9kZSA9IHZhbHVlOworICAgCSAgICB6bV9tc2cxX21tKFpNX0xWXzEsICJ3ZC0+ZW5hYmxlUHJvdGVjdGlvbk1vZGU9Iiwgd2QtPmVuYWJsZVByb3RlY3Rpb25Nb2RlKTsKKwl9CisJZWxzZSBpZiAoIGNtZCA9PSA4ICkKKwl7CisgICAgICAgIC8qIHJ4IHBhY2tldCBjb250ZW50IGR1bXAgKi8KKyAgICAgICAgaWYgKHZhbHVlKQorICAgICAgICB7CisgICAgICAgICAgICB3ZC0+cnhQYWNrZXREdW1wID0gMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHdkLT5yeFBhY2tldER1bXAgPSAwOworICAgICAgICB9CisJfQorCisKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBaTV9FTkFCTEVfQ0VOQwordThfdCB6ZmlXbGFuU2V0Q2VuY1BhaXJ3aXNlS2V5KHpkZXZfdCogZGV2LCB1OF90IGtleWlkLCB1MzJfdCAqdHhpdiwgdTMyX3QgKnJ4aXYsCisgICAgICAgIHU4X3QgKmtleSwgdThfdCAqbWljKQoreworICAgIHN0cnVjdCB6c0tleUluZm8ga2V5SW5mbzsKKyAgICB1OF90IGNlbmNLZXlbMzJdOworICAgIHU4X3QgaTsKKyAgICB1MTZfdCBtYWNBZGRyWzNdOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisgICAgICAgIGNlbmNLZXlbaV0gPSBrZXlbaV07CisgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisgICAgICAgIGNlbmNLZXlbaSArIDE2XSA9IG1pY1tpXTsKKyAgICBrZXlJbmZvLmtleSA9IGNlbmNLZXk7CisgICAga2V5SW5mby5rZXlMZW5ndGggPSAzMjsKKyAgICBrZXlJbmZvLmtleUluZGV4ID0ga2V5aWQ7CisgICAga2V5SW5mby5mbGFnID0gWk1fS0VZX0ZMQUdfQ0VOQyB8IFpNX0tFWV9GTEFHX1BLOworICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspCisgICAgICAgIG1hY0FkZHJbaV0gPSB3ZC0+c3RhLmJzc2lkW2ldOworICAgIGtleUluZm8ubWFjQWRkciA9IG1hY0FkZHI7CisKKyAgICB6ZmlXbGFuU2V0S2V5KGRldiwga2V5SW5mbyk7CisKKyAgICAvKiBSZXNldCB0eGl2IGFuZCByeGl2ICovCisgICAgLy93ZC0+c3RhLnR4aXZbMF0gPSB0eGl2WzBdOworICAgIC8vd2QtPnN0YS50eGl2WzFdID0gdHhpdlsxXTsKKyAgICAvL3dkLT5zdGEudHhpdlsyXSA9IHR4aXZbMl07CisgICAgLy93ZC0+c3RhLnR4aXZbM10gPSB0eGl2WzNdOworICAgIC8vCisgICAgLy93ZC0+c3RhLnJ4aXZbMF0gPSByeGl2WzBdOworICAgIC8vd2QtPnN0YS5yeGl2WzFdID0gcnhpdlsxXTsKKyAgICAvL3dkLT5zdGEucnhpdlsyXSA9IHJ4aXZbMl07CisgICAgLy93ZC0+c3RhLnJ4aXZbM10gPSByeGl2WzNdOworCisgICAgcmV0dXJuIDA7Cit9CisKK3U4X3QgemZpV2xhblNldENlbmNHcm91cEtleSh6ZGV2X3QqIGRldiwgdThfdCBrZXlpZCwgdTMyX3QgKnJ4aXYsCisgICAgICAgIHU4X3QgKmtleSwgdThfdCAqbWljKQoreworICAgIHN0cnVjdCB6c0tleUluZm8ga2V5SW5mbzsKKyAgICB1OF90IGNlbmNLZXlbMzJdOworICAgIHU4X3QgaTsKKyAgICB1MTZfdCBtYWNBZGRyWzZdID0gezB4ZmZmZiwgMHhmZmZmLCAweGZmZmZ9OworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisgICAgICAgIGNlbmNLZXlbaV0gPSBrZXlbaV07CisgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisgICAgICAgIGNlbmNLZXlbaSArIDE2XSA9IG1pY1tpXTsKKyAgICBrZXlJbmZvLmtleSA9IGNlbmNLZXk7CisgICAga2V5SW5mby5rZXlMZW5ndGggPSAzMjsKKyAgICBrZXlJbmZvLmtleUluZGV4ID0ga2V5aWQ7CisgICAga2V5SW5mby5mbGFnID0gWk1fS0VZX0ZMQUdfQ0VOQyB8IFpNX0tFWV9GTEFHX0dLOworICAgIGtleUluZm8udmFwSWQgPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspCisgICAgICAgIGtleUluZm8udmFwQWRkcltpXSA9IHdkLT5tYWNBZGRyW2ldOworICAgIGtleUluZm8ubWFjQWRkciA9IG1hY0FkZHI7CisKKyAgICB6ZmlXbGFuU2V0S2V5KGRldiwga2V5SW5mbyk7CisKKyAgICAvKiBSZXNldCB0eGl2IGFuZCByeGl2ICovCisgICAgd2QtPnN0YS5yeGl2R0tbMF0gPSAoKHJ4aXZbM10gPj4gMjQpICYgMHhGRikKKyAgICAgICAgICAgICAgICAgICAgICArICgoKHJ4aXZbM10gPj4gMTYpICYgMHhGRikgPDwgOCkKKyAgICAgICAgICAgICAgICAgICAgICArICgoKHJ4aXZbM10gPj4gOCkgJiAweEZGKSA8PCAxNikKKyAgICAgICAgICAgICAgICAgICAgICArICgocnhpdlszXSAmIDB4RkYpIDw8IDI0KTsKKyAgICB3ZC0+c3RhLnJ4aXZHS1sxXSA9ICgocnhpdlsyXSA+PiAyNCkgJiAweEZGKQorICAgICAgICAgICAgICAgICAgICAgICsgKCgocnhpdlsyXSA+PiAxNikgJiAweEZGKSA8PCA4KQorICAgICAgICAgICAgICAgICAgICAgICsgKCgocnhpdlsyXSA+PiA4KSAmIDB4RkYpIDw8IDE2KQorICAgICAgICAgICAgICAgICAgICAgICsgKChyeGl2WzJdICYgMHhGRikgPDwgMjQpOworICAgIHdkLT5zdGEucnhpdkdLWzJdID0gKChyeGl2WzFdID4+IDI0KSAmIDB4RkYpCisgICAgICAgICAgICAgICAgICAgICAgKyAoKChyeGl2WzFdID4+IDE2KSAmIDB4RkYpIDw8IDgpCisgICAgICAgICAgICAgICAgICAgICAgKyAoKChyeGl2WzFdID4+IDgpICYgMHhGRikgPDwgMTYpCisgICAgICAgICAgICAgICAgICAgICAgKyAoKHJ4aXZbMV0gJiAweEZGKSA8PCAyNCk7CisgICAgd2QtPnN0YS5yeGl2R0tbM10gPSAoKHJ4aXZbMF0gPj4gMjQpICYgMHhGRikKKyAgICAgICAgICAgICAgICAgICAgICArICgoKHJ4aXZbMF0gPj4gMTYpICYgMHhGRikgPDwgOCkKKyAgICAgICAgICAgICAgICAgICAgICArICgoKHJ4aXZbMF0gPj4gOCkgJiAweEZGKSA8PCAxNikKKyAgICAgICAgICAgICAgICAgICAgICArICgocnhpdlswXSAmIDB4RkYpIDw8IDI0KTsKKworICAgIHdkLT5zdGEuYXV0aE1vZGUgPSBaTV9BVVRIX01PREVfQ0VOQzsKKyAgICB3ZC0+c3RhLmN1cnJlbnRBdXRoTW9kZSA9IFpNX0FVVEhfTU9ERV9DRU5DOworCisgICAgcmV0dXJuIDA7Cit9CisjZW5kaWYgLy9aTV9FTkFCTEVfQ0VOQworCit1OF90IHpmaVdsYW5TZXREb3QxMURNb2RlKHpkZXZfdCogZGV2LCB1OF90IG1vZGUpCit7CisgICAgdThfdCBpOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgd2QtPnN0YS5iODAyXzExRCA9IG1vZGU7CisgICAgaWYgKG1vZGUpIC8vRW5hYmxlIDgwMi4xMWQKKyAgICB7CisgICAgICAgIHdkLT5yZWd1bGF0aW9uVGFibGUucmVnaW9uQ29kZSA9IE5PX0VOVU1SRDsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsQ250OyBpKyspCisgICAgICAgICAgICB3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbFtpXS5jaGFubmVsRmxhZ3MgfD0gWk1fUkVHX0ZMQUdfQ0hBTk5FTF9QQVNTSVZFOworICAgIH0KKyAgICBlbHNlIC8vRGlzYWJsZQorICAgIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsQ250OyBpKyspCisgICAgICAgICAgICB3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbFtpXS5jaGFubmVsRmxhZ3MgJj0gflpNX1JFR19GTEFHX0NIQU5ORUxfUEFTU0lWRTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKwordThfdCB6ZmlXbGFuU2V0RG90MTFIREZTTW9kZSh6ZGV2X3QqIGRldiwgdThfdCBtb2RlKQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIC8vem1fZGVidWdfbXNnMCgiQ1dZIC0gRW5hYmxlIDgwMi4xMWggREZTIik7CisKKyAgICAvLyBUT0RPIDogREZTIEVuYWJsZSBpbiA1MjUwIHRvIDUzNTAgTUh6IGFuZCA1NDcwIHRvIDU3MjUgTUh6IC4KKyAgICAvL2lmICggQWRhcHRlci0+WkQ4MDIxMUhTdXBwb3J0ICYmCisgICAgLy8gICBBZGFwdGVyLT5DYXJkU2V0dGluZy5OZXR3b3JrVHlwZUluVXNlID09IE5kaXM4MDJfMTFPRkRNNSAmJgorICAgIC8vICAgKChDaGFubmVsTm8gPj01MiAmJiBDaGFubmVsTm8gPD0gNjQpCXx8CQkJCS8vNTI1MH41MzUwIE1IWgorICAgIC8vICAgIChDaGFubmVsTm8gPj0xMDAgJiYgQ2hhbm5lbE5vIDw9IDE0MCkpKSAJCQkvLzU0NzB+NTcyNSBNSFoKKyAgICAvL3sKKyAgICAvLyAgIEFkYXB0ZXItPlpEODAyMTFIU2V0dGluZy5ERlNFbmFibGU9VFJVRTsKKyAgICAvL30KKyAgICAvL2Vsc2UKKyAgICAvL3sKKyAgICAvLyAgIEFkYXB0ZXItPlpEODAyMTFIU2V0dGluZy5ERlNFbmFibGU9RkFMU0U7CisgICAgLy99CisKKyAgICB3ZC0+c3RhLkRGU0VuYWJsZSA9IG1vZGU7CisgICAgaWYgKG1vZGUpCisgICAgICAgIHdkLT5zdGEuY2FwYWJpbGl0eVsxXSB8PSBaTV9CSVRfMDsKKyAgICBlbHNlCisgICAgICAgIHdkLT5zdGEuY2FwYWJpbGl0eVsxXSAmPSAoflpNX0JJVF8wKTsKKworICAgIHJldHVybiAwOworfQorCit1OF90IHpmaVdsYW5TZXREb3QxMUhUUENNb2RlKHpkZXZfdCogZGV2LCB1OF90IG1vZGUpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgLy8gVE9ETyA6IFRQQyBFbmFibGUgaW4gNTE1MH41MzUwIE1IeiBhbmQgNTQ3MH41NzI1TUh6LgorICAgIC8vaWYgKCBBZGFwdGVyLT5aRDgwMjExSFN1cHBvcnQgJiYKKyAgICAvLyAgIEFkYXB0ZXItPkNhcmRTZXR0aW5nLk5ldHdvcmtUeXBlSW5Vc2UgPT0gTmRpczgwMl8xMU9GRE01ICYmCisgICAgLy8gICAoKENoYW5uZWxObyA9PSAzNiB8fCBDaGFubmVsTm8gPT0gNDAgfHwgQ2hhbm5lbE5vID09IDQ0IHx8IENoYW5uZWxObyA9PSA0OCkgfHwJLy81MTUwfjUyNTAgTUhaICwgTm90IEphcGFuCisgICAgLy8gICAgKENoYW5uZWxObyA+PTUyICYmIENoYW5uZWxObyA8PSA2NCkgfHwJCQkJLy81MjUwfjUzNTAgTUhaCisgICAgLy8gICAgKENoYW5uZWxObyA+PTEwMCAmJiBDaGFubmVsTm8gPD0gMTQwKSkpIAkJCS8vNTQ3MH41NzI1IE1IWgorICAgIC8veworICAgIC8vICAgQWRhcHRlci0+WkQ4MDIxMUhTZXR0aW5nLlRQQ0VuYWJsZT1UUlVFOworICAgIC8vfQorICAgIC8vZWxzZQorICAgIC8veworICAgIC8vICAgQWRhcHRlci0+WkQ4MDIxMUhTZXR0aW5nLlRQQ0VuYWJsZT1GQUxTRTsKKyAgICAvL30KKworICAgIHdkLT5zdGEuVFBDRW5hYmxlID0gbW9kZTsKKyAgICBpZiAobW9kZSkKKyAgICAgICAgd2QtPnN0YS5jYXBhYmlsaXR5WzFdIHw9IFpNX0JJVF8wOworICAgIGVsc2UKKyAgICAgICAgd2QtPnN0YS5jYXBhYmlsaXR5WzFdICY9ICh+Wk1fQklUXzApOworCisgICAgcmV0dXJuIDA7Cit9CisKK3U4X3QgemZpV2xhblNldEFuaU1vZGUoemRldl90KiBkZXYsIHU4X3QgbW9kZSkKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB3ZC0+YW5pRW5hYmxlID0gbW9kZTsKKyAgICBpZiAobW9kZSkKKyAgICAgICAgemZIcEFuaUF0dGFjaChkZXYpOworCisgICAgcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBaTV9PU19MSU5VWF9GVU5DCit2b2lkIHpmaVdsYW5TaG93VGFsbHkoemRldl90KiBkZXYpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem1fbXNnMV9tbShaTV9MVl8wLCAiSHdfVW5kZXJydW5DbnQgICAgPSAiLCB3ZC0+Y29tbVRhbGx5Lkh3X1VuZGVycnVuQ250KTsKKyAgICB6bV9tc2cxX21tKFpNX0xWXzAsICJId19Ub3RhbFJ4RnJtICAgICA9ICIsIHdkLT5jb21tVGFsbHkuSHdfVG90YWxSeEZybSk7CisgICAgem1fbXNnMV9tbShaTV9MVl8wLCAiSHdfQ1JDMzJDbnQgICAgICAgPSAiLCB3ZC0+Y29tbVRhbGx5Lkh3X0NSQzMyQ250KTsKKyAgICB6bV9tc2cxX21tKFpNX0xWXzAsICJId19DUkMxNkNudCAgICAgICA9ICIsIHdkLT5jb21tVGFsbHkuSHdfQ1JDMTZDbnQpOworICAgIHptX21zZzFfbW0oWk1fTFZfMSwgIkh3X0RlY3J5cEVycl9VTkkgID0gIiwgd2QtPmNvbW1UYWxseS5Id19EZWNyeXBFcnJfVU5JKTsKKyAgICB6bV9tc2cxX21tKFpNX0xWXzAsICJId19SeEZJRk9PdmVycnVuICA9ICIsIHdkLT5jb21tVGFsbHkuSHdfUnhGSUZPT3ZlcnJ1bik7CisgICAgem1fbXNnMV9tbShaTV9MVl8xLCAiSHdfRGVjcnlwRXJyX011bCAgPSAiLCB3ZC0+Y29tbVRhbGx5Lkh3X0RlY3J5cEVycl9NdWwpOworICAgIHptX21zZzFfbW0oWk1fTFZfMSwgIkh3X1JldHJ5Q250ICAgICAgID0gIiwgd2QtPmNvbW1UYWxseS5Id19SZXRyeUNudCk7CisgICAgem1fbXNnMV9tbShaTV9MVl8wLCAiSHdfVG90YWxUeEZybSAgICAgPSAiLCB3ZC0+Y29tbVRhbGx5Lkh3X1RvdGFsVHhGcm0pOworICAgIHptX21zZzFfbW0oWk1fTFZfMCwgIkh3X1J4VGltZU91dCAgICAgID0gIiwgd2QtPmNvbW1UYWxseS5Id19SeFRpbWVPdXQpOworICAgIHptX21zZzFfbW0oWk1fTFZfMCwgIlR4X01QRFUgICAgICAgICAgID0gIiwgd2QtPmNvbW1UYWxseS5UeF9NUERVKTsKKyAgICB6bV9tc2cxX21tKFpNX0xWXzAsICJCQV9GYWlsICAgICAgICAgICA9ICIsIHdkLT5jb21tVGFsbHkuQkFfRmFpbCk7CisgICAgem1fbXNnMV9tbShaTV9MVl8wLCAiSHdfVHhfQU1QRFUgICAgICAgPSAiLCB3ZC0+Y29tbVRhbGx5Lkh3X1R4X0FNUERVKTsKKyAgICB6bV9tc2cxX21tKFpNX0xWXzAsICJId19UeF9NUERVICAgICAgICA9ICIsIHdkLT5jb21tVGFsbHkuSHdfVHhfTVBEVSk7CisKKyAgICB6bV9tc2cxX21tKFpNX0xWXzEsICJId19SeE1QRFUgICAgICAgICAgPSAiLCB3ZC0+Y29tbVRhbGx5Lkh3X1J4TVBEVSk7CisgICAgem1fbXNnMV9tbShaTV9MVl8xLCAiSHdfUnhEcm9wTVBEVSAgICAgID0gIiwgd2QtPmNvbW1UYWxseS5Id19SeERyb3BNUERVKTsKKyAgICB6bV9tc2cxX21tKFpNX0xWXzEsICJId19SeERlbE1QRFUgICAgICAgPSAiLCB3ZC0+Y29tbVRhbGx5Lkh3X1J4RGVsTVBEVSk7CisgICAgem1fbXNnMV9tbShaTV9MVl8xLCAiSHdfUnhQaHlNaXNjRXJyb3IgID0gIiwgd2QtPmNvbW1UYWxseS5Id19SeFBoeU1pc2NFcnJvcik7CisgICAgem1fbXNnMV9tbShaTV9MVl8xLCAiSHdfUnhQaHlYUkVycm9yICAgID0gIiwgd2QtPmNvbW1UYWxseS5Id19SeFBoeVhSRXJyb3IpOworICAgIHptX21zZzFfbW0oWk1fTFZfMSwgIkh3X1J4UGh5T0ZETUVycm9yICA9ICIsIHdkLT5jb21tVGFsbHkuSHdfUnhQaHlPRkRNRXJyb3IpOworICAgIHptX21zZzFfbW0oWk1fTFZfMSwgIkh3X1J4UGh5Q0NLRXJyb3IgICA9ICIsIHdkLT5jb21tVGFsbHkuSHdfUnhQaHlDQ0tFcnJvcik7CisgICAgem1fbXNnMV9tbShaTV9MVl8xLCAiSHdfUnhQaHlIVEVycm9yICAgID0gIiwgd2QtPmNvbW1UYWxseS5Id19SeFBoeUhURXJyb3IpOworICAgIHptX21zZzFfbW0oWk1fTFZfMSwgIkh3X1J4UGh5VG90YWxDb3VudCA9ICIsIHdkLT5jb21tVGFsbHkuSHdfUnhQaHlUb3RhbENvdW50KTsKKworICAgIGlmICghKCh3ZC0+Y29tbVRhbGx5LlR4X01QRFUgPT0gMCkgJiYgKHdkLT5jb21tVGFsbHkuQkFfRmFpbCA9PSAwKSkpCisgICAgeworICAgICAgICB6bV9kZWJ1Z19tc2dfcCgiQkEgRmFpbCBSYXRpbyglKSAgPSAiLCB3ZC0+Y29tbVRhbGx5LkJBX0ZhaWwgKiAxMDAsCisgICAgICAgICAgICAgICAgKHdkLT5jb21tVGFsbHkuQkFfRmFpbCArIHdkLT5jb21tVGFsbHkuVHhfTVBEVSkpOworICAgIH0KKworICAgIGlmICghKCh3ZC0+Y29tbVRhbGx5Lkh3X1R4X01QRFUgPT0gMCkgJiYgKHdkLT5jb21tVGFsbHkuSHdfVHhfQU1QRFUgPT0gMCkpKQorICAgIHsKKyAgICAgICAgem1fZGVidWdfbXNnX3AoIkF2ZyBBZ2cgTnVtYmVyICAgID0gIiwKKyAgICAgICAgICAgICAgICB3ZC0+Y29tbVRhbGx5Lkh3X1R4X01QRFUsIHdkLT5jb21tVGFsbHkuSHdfVHhfQU1QRFUpOworICAgIH0KK30KKyNlbmRpZgorCit2b2lkIHpmaVdsYW5TZXRNYXhUeFBvd2VyKHpkZXZfdCogZGV2LCB1OF90IHBvd2VyMiwgdThfdCBwb3dlcjUpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgd2QtPm1heFR4UG93ZXIyID0gcG93ZXIyOworICAgIHdkLT5tYXhUeFBvd2VyNSA9IHBvd2VyNTsKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworfQorCit2b2lkIHpmaVdsYW5RdWVyeU1heFR4UG93ZXIoemRldl90KiBkZXYsIHU4X3QgKnBvd2VyMiwgdThfdCAqcG93ZXI1KQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgICpwb3dlcjIgPSB3ZC0+bWF4VHhQb3dlcjI7CisgICAgKnBvd2VyNSA9IHdkLT5tYXhUeFBvd2VyNTsKK30KKwordm9pZCB6ZmlXbGFuU2V0Q29ubmVjdE1vZGUoemRldl90KiBkZXYsIHU4X3QgbW9kZSkKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICB3ZC0+Y29ubmVjdE1vZGUgPSBtb2RlOworICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7Cit9CisKK3ZvaWQgemZpV2xhblNldFN1cHBvcnRNb2RlKHpkZXZfdCogZGV2LCB1MzJfdCBtb2RlKQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIHdkLT5zdXBwb3J0TW9kZSA9IG1vZGU7CisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKK30KKwordm9pZCB6ZmlXbGFuU2V0QWRob2NNb2RlKHpkZXZfdCogZGV2LCB1MzJfdCBtb2RlKQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHdkLT53cy5hZGhvY01vZGUgPSBtb2RlOworfQorCit1MzJfdCB6ZmlXbGFuUXVlcnlBZGhvY01vZGUoemRldl90KiBkZXYsIHU4X3QgYldyYXBwZXIpCit7CisgICAgdTMyX3QgYWRob2NNb2RlOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgaWYgKCBiV3JhcHBlciApCisgICAgeworICAgICAgICBhZGhvY01vZGUgPSB3ZC0+d3MuYWRob2NNb2RlOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhZGhvY01vZGUgPSB3ZC0+d2ZjLmJJYnNzR01vZGU7CisgICAgfQorCisgICAgcmV0dXJuIGFkaG9jTW9kZTsKK30KKworCit1OF90IHpmaVdsYW5TZXRDb3VudHJ5SXNvTmFtZSh6ZGV2X3QqIGRldiwgdThfdCAqY291bnRyeUlzb05hbWUsIHU4X3QgbGVuZ3RoKQoreworICAgIHU4X3QgYnVmWzVdOworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIGlmIChsZW5ndGggPT0gNCkKKyAgICB7CisgICAgICAgIGJ1ZlsyXSA9IHdkLT53cy5jb3VudHJ5SXNvTmFtZVswXSA9IGNvdW50cnlJc29OYW1lWzJdOworICAgICAgICBidWZbM10gPSB3ZC0+d3MuY291bnRyeUlzb05hbWVbMV0gPSBjb3VudHJ5SXNvTmFtZVsxXTsKKyAgICAgICAgYnVmWzRdID0gd2QtPndzLmNvdW50cnlJc29OYW1lWzJdID0gY291bnRyeUlzb05hbWVbMF07CisgICAgfQorICAgIGVsc2UgaWYgKGxlbmd0aCA9PSAzKQorICAgIHsKKyAgICAgICAgYnVmWzJdID0gd2QtPndzLmNvdW50cnlJc29OYW1lWzBdID0gY291bnRyeUlzb05hbWVbMV07CisgICAgICAgIGJ1ZlszXSA9IHdkLT53cy5jb3VudHJ5SXNvTmFtZVsxXSA9IGNvdW50cnlJc29OYW1lWzBdOworICAgICAgICBidWZbNF0gPSB3ZC0+d3MuY291bnRyeUlzb05hbWVbMl0gPSAnXDAnOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICByZXR1cm4gemZIcEdldFJlZ3VsYXRpb25UYWJsZWZyb21JU08oZGV2LCBidWYsIGxlbmd0aCk7Cit9CisKKworY29uc3QgY2hhciogemZpV2xhblF1ZXJ5Q291bnRyeUlzb05hbWUoemRldl90KiBkZXYpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgcmV0dXJuIHdkLT53cy5jb3VudHJ5SXNvTmFtZTsKK30KKworCisKK3ZvaWQgemZpV2xhblNldFJlZ3VsYXRvcnkoemRldl90KiBkZXYsIHU4X3QgQ0NTLCB1MTZfdCBDb2RlLCB1OF90IGJmaXJzdENoYW5uZWwpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIGlmIChDQ1MpCisgICAgeworICAgICAgICAvKiBSZXNldCBSZWd1bGF0aW9uIFRhYmxlIGJ5IENvdW50cnkgQ29kZSAqLworICAgICAgICB6ZkhwR2V0UmVndWxhdGlvblRhYmxlZnJvbUNvdW50cnkoZGV2LCBDb2RlKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogUmVzZXQgUmVndWxhdGlvbiBUYWJsZSBieSBSZWdpb24gQ29kZSAqLworICAgICAgICB6ZkhwR2V0UmVndWxhdGlvblRhYmxlZnJvbVJlZ2lvbkNvZGUoZGV2LCBDb2RlKTsKKyAgICB9CisKKyAgICBpZiAoYmZpcnN0Q2hhbm5lbCkgeworICAgICAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICB3ZC0+ZnJlcXVlbmN5ID0gemZDaEdldEZpcnN0Q2hhbm5lbChkZXYsIE5VTEwpOworICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICB6ZkNvcmVTZXRGcmVxdWVuY3koZGV2LCB3ZC0+ZnJlcXVlbmN5KTsKKyAgICB9Cit9CisKKworY29uc3QgY2hhciogemZpSHBHZXRpc29OYW1lZnJvbXJlZ2lvbkNvZGUoemRldl90KiBkZXYsIHUxNl90IHJlZ2lvbkNvZGUpCit7CisgICAgcmV0dXJuIHpmSHBHZXRpc29OYW1lZnJvbXJlZ2lvbkNvZGUoZGV2LCByZWdpb25Db2RlKTsKK30KKwordTE2X3QgemZpV2xhbkNoYW5uZWxUb0ZyZXF1ZW5jeSh6ZGV2X3QqIGRldiwgdThfdCBjaGFubmVsKQoreworICAgIHJldHVybiB6ZkNoTnVtVG9GcmVxKGRldiwgY2hhbm5lbCwgMCk7Cit9CisKK3U4X3QgemZpV2xhbkZyZXF1ZW5jeVRvQ2hhbm5lbCh6ZGV2X3QqIGRldiwgdTE2X3QgZnJlcSkKK3sKKyAgICB1OF90IGlzNUdCYW5kID0gMDsKKworICAgIHJldHVybiB6ZkNoRnJlcVRvTnVtKGZyZXEsICZpczVHQmFuZCk7Cit9CisKK3ZvaWQgemZpV2xhbkRpc2FibGVEZnNDaGFubmVsKHpkZXZfdCogZGV2LCB1OF90IGRpc2FibGVGbGFnKQoreworICAgIHpmSHBEaXNhYmxlRGZzQ2hhbm5lbChkZXYsIGRpc2FibGVGbGFnKTsKKyAgICByZXR1cm47Cit9CisKK3ZvaWQgemZpV2xhblNldExFREN0cmxQYXJhbSh6ZGV2X3QqIGRldiwgdThfdCB0eXBlLCB1OF90IGZsYWcpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgd2QtPmxlZFN0cnVjdC5MRURDdHJsVHlwZSA9IHR5cGU7CisgICAgd2QtPmxlZFN0cnVjdC5MRURDdHJsRmxhZ0Zyb21SZWcgID0gZmxhZzsKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworfQorCit2b2lkIHpmaVdsYW5FbmFibGVMZWFwQ29uZmlnKHpkZXZfdCogZGV2LCB1OF90IGxlYXBFbmFibGVkKQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHdkLT5zdGEubGVhcEVuYWJsZWQgPSBsZWFwRW5hYmxlZDsKK30KKwordTMyX3QgemZpV2xhblF1ZXJ5SHdDYXBhYmlsaXR5KHpkZXZfdCogZGV2KQoreworICAgIHJldHVybiB6ZkhwQ2FwYWJpbGl0eShkZXYpOworfQorCit1MzJfdCB6ZmlXbGFuUXVlcnlSZWNlaXZlZFBhY2tldCh6ZGV2X3QqIGRldikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICByZXR1cm4gd2QtPnN0YS5SZWNlaXZlZFBrdFJhdGVQZXJTZWNvbmQ7Cit9CisKK3ZvaWQgemZpV2xhbkNoZWNrU1dFbmNyeXB0aW9uKHpkZXZfdCogZGV2KQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIGlmICh3ZC0+c3RhLlNXRW5jcnlwdEVuYWJsZSAhPSAwKQorICAgIHsKKyAgICAgICAgemZIcFNXRGVjcnlwdChkZXYsIDEpOworICAgIH0KK30KKwordTE2X3QgemZpV2xhblF1ZXJ5QWxsb3dDaGFubmVscyh6ZGV2X3QqIGRldiwgdTE2X3QgKmNoYW5uZWxzKQoreworICAgIHUxNl90IGlpOworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIGZvciAoaWkgPSAwOyBpaSA8IHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsQ250OyBpaSsrKQorICAgIHsKKyAgICAgICAgY2hhbm5lbHNbaWldID0gd2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxbaWldLmNoYW5uZWw7CisgICAgfQorCisgICAgcmV0dXJuIHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsQ250OworfQorCit2b2lkIHpmaVdsYW5TZXREeW5hbWljU0lGU1BhcmFtKHpkZXZfdCogZGV2LCB1OF90IHZhbCkKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB3ZC0+ZHluYW1pY1NJRlNFbmFibGUgPSB2YWw7CisKKyAgICB6bV9kZWJ1Z19tc2cxKCJ3ZC0+ZHluYW1pY1NJRlNFbmFibGUgPSAiLCB3ZC0+ZHluYW1pY1NJRlNFbmFibGUpCit9CisKK3UxNl90IHpmaVdsYW5HZXRNdWx0aWNhc3RBZGRyZXNzQ291bnQoemRldl90KiBkZXYpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgcmV0dXJuIHdkLT5zdGEubXVsdGljYXN0TGlzdC5zaXplOworfQorCit2b2lkIHpmaVdsYW5HZXRNdWx0aWNhc3RMaXN0KHpkZXZfdCogZGV2LCB1OF90KiBwTUNMaXN0KQoreworICAgIHN0cnVjdCB6c011bHRpY2FzdEFkZHIqIHBNYWNMaXN0ID0gKHN0cnVjdCB6c011bHRpY2FzdEFkZHIqKSBwTUNMaXN0OworICAgIHU4X3QgaTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIGZvciAoIGk9MDsgaTx3ZC0+c3RhLm11bHRpY2FzdExpc3Quc2l6ZTsgaSsrICkKKyAgICB7CisgICAgICAgIHpmTWVtb3J5Q29weShwTWFjTGlzdFtpXS5hZGRyLCB3ZC0+c3RhLm11bHRpY2FzdExpc3QubWFjQWRkcltpXS5hZGRyLCA2KTsKKyAgICB9Cit9CisKK3ZvaWQgemZpV2xhblNldFBhY2tldEZpbHRlcih6ZGV2X3QqIGRldiwgdTMyX3QgUGFja2V0RmlsdGVyKQoreworICAgIHU4X3QgIGJBbGxNdWx0aWNhc3QgPSAwOworICAgIHUzMl90IG9sZEZpbHRlcjsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIG9sZEZpbHRlciA9IHdkLT5zdGEub3NSeEZpbHRlcjsKKworICAgIHdkLT5zdGEub3NSeEZpbHRlciA9IFBhY2tldEZpbHRlcjsKKworICAgIGlmICgob2xkRmlsdGVyICYgWk1fUEFDS0VUX1RZUEVfQUxMX01VTFRJQ0FTVCkgIT0KKyAgICAgICAgKHdkLT5zdGEub3NSeEZpbHRlciAmIFpNX1BBQ0tFVF9UWVBFX0FMTF9NVUxUSUNBU1QpKQorICAgIHsKKyAgICAgICAgaWYgKCB3ZC0+c3RhLm9zUnhGaWx0ZXIgJiBaTV9QQUNLRVRfVFlQRV9BTExfTVVMVElDQVNUICkKKyAgICAgICAgICAgIGJBbGxNdWx0aWNhc3QgPSAxOworICAgICAgICB6ZkhwU2V0TXVsdGljYXN0TGlzdChkZXYsIHdkLT5zdGEubXVsdGljYXN0TGlzdC5zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodThfdCopd2QtPnN0YS5tdWx0aWNhc3RMaXN0Lm1hY0FkZHIsIGJBbGxNdWx0aWNhc3QpOworICAgIH0KK30KKwordThfdCB6ZmlDb21wYXJlV2l0aE11bHRpY2FzdExpc3RBZGRyZXNzKHpkZXZfdCogZGV2LCB1MTZfdCogZHN0TWFjQWRkcikKK3sKKyAgICB1OF90IGk7CisgICAgdThfdCBiSXNJbk1DTGlzdEFkZHIgPSAwOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgZm9yICggaT0wOyBpPHdkLT5zdGEubXVsdGljYXN0TGlzdC5zaXplOyBpKysgKQorICAgIHsKKyAgICAJaWYgKCB6ZndNZW1vcnlJc0VxdWFsKCh1OF90Kilkc3RNYWNBZGRyLCAodThfdCopd2QtPnN0YS5tdWx0aWNhc3RMaXN0Lm1hY0FkZHJbaV0uYWRkciwgNikgKQorICAgIAl7CisgICAgICAgICAgICBiSXNJbk1DTGlzdEFkZHIgPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgCX0KKyAgICB9CisKKyAgICByZXR1cm4gYklzSW5NQ0xpc3RBZGRyOworfQorCit2b2lkIHpmaVdsYW5TZXRTYWZlTW9kZUVuYWJsZWQoemRldl90KiBkZXYsIHU4X3Qgc2FmZU1vZGUpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgd2QtPnN0YS5iU2FmZU1vZGUgPSBzYWZlTW9kZTsKKworICAgIGlmICggc2FmZU1vZGUgKQorICAgIAl6ZlN0YUVuYWJsZVNXRW5jcnlwdGlvbihkZXYsIDEpOworICAgIGVsc2UKKyAgICAgICAgemZTdGFEaXNhYmxlU1dFbmNyeXB0aW9uKGRldik7Cit9CisKK3ZvaWQgemZpV2xhblNldElCU1NBZGRpdGlvbmFsSUVMZW5ndGgoemRldl90KiBkZXYsIHUzMl90IGlic3NBZGRpdGlvbmFsSUVTaXplLCB1OF90KiBpYnNzQWRkaXRpb25hbElFKQoreworCXptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworCWlmICggaWJzc0FkZGl0aW9uYWxJRVNpemUgKQorICAgIHsKKwkgICAgd2QtPnN0YS5pYnNzQWRkaXRpb25hbElFU2l6ZSA9IGlic3NBZGRpdGlvbmFsSUVTaXplOworICAgICAgICB6Zk1lbW9yeUNvcHkod2QtPnN0YS5pYnNzQWRkaXRpb25hbElFLCBpYnNzQWRkaXRpb25hbElFLCAodTE2X3QpaWJzc0FkZGl0aW9uYWxJRVNpemUpOworICAgIH0KKyAgICBlbHNlCisgICAgCXdkLT5zdGEuaWJzc0FkZGl0aW9uYWxJRVNpemUgPSAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2NwcmVjb21wLmggYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvY3ByZWNvbXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjcwYmZjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2NwcmVjb21wLmgKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNy0yMDA4IEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKyNpZm5kZWYgX0NQUkVDT01QX0gKKyNkZWZpbmUgX0NQUkVDT01QX0gKKworI2luY2x1ZGUgIi4uL29hbF9kdC5oIgorI2luY2x1ZGUgIi4uL29hbF9tYXJjLmgiCisjaW5jbHVkZSAicHViX3pmaS5oIgorI2luY2x1ZGUgInB1Yl96ZncuaCIKKyNpbmNsdWRlICJwdWJfdXNiLmgiCisjaW5jbHVkZSAid2xhbi5oIgorI2luY2x1ZGUgInN0cnVjdC5oIgorI2luY2x1ZGUgImNmdW5jLmgiCisjaW5jbHVkZSAiY2FnZy5oIgorI2luY2x1ZGUgImN3bS5oIgorI2luY2x1ZGUgInBlcmZvcm1hbmNlLmgiCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2Nwc21nci5jIGIvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2Nwc21nci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmNzNjYWMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvY3BzbWdyLmMKQEAgLTAsMCArMSw3MzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBBdGhlcm9zIENvbW11bmljYXRpb25zIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKioKKyAgKiAgVGhlIHBvd2VyIHNhdmluZyBtYW5hZ2VyIGlzIHRvIHNhdmUgdGhlIHBvd2VyIGFzIG11Y2ggYXMgcG9zc2libGUuCisgICogIEdlbmVyYWxseSBzcGVha2luZywgaXQgY29udHJvbHM6CisgICoKKyAgKiAgICAgICAgIC0gd2hlbiB0byBzbGVlcAorICAqICAgICAgICAgLQorICAqCisgICovCisjaW5jbHVkZSAiY3ByZWNvbXAuaCIKKwordm9pZCB6ZlBvd2VyU2F2aW5nTWdySW5pdCh6ZGV2X3QqIGRldikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB3ZC0+c3RhLnBvd2VyU2F2ZU1vZGUgPSBaTV9TVEFfUFNfTk9ORTsKKyAgICB3ZC0+c3RhLnBzTWdyLnN0YXRlID0gWk1fUFNfTVNHX1NUQVRFX0FDVElWRTsKKyAgICB3ZC0+c3RhLnBzTWdyLmlzU2xlZXBBbGxvd2VkID0gMDsKKyAgICB3ZC0+c3RhLnBzTWdyLm1heFNsZWVwUGVyaW9kcyA9IDE7CisgICAgd2QtPnN0YS5wc01nci50aWNrcyA9IDA7CisgICAgd2QtPnN0YS5wc01nci5zbGVlcEFsbG93ZWR0aWNrID0gMDsKK30KKworc3RhdGljIHUxNl90IHpmUG93ZXJTYXZpbmdNZ3JIYW5kbGVQc05vbmUoemRldl90KiBkZXYsIHU4X3QgKmlzV2FrZVVwUmVxdWlyZWQpCit7CisgICAgdTE2X3QgcmV0ID0gMDsKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBzd2l0Y2god2QtPnN0YS5wc01nci5zdGF0ZSkKKyAgICB7CisgICAgICAgIGNhc2UgWk1fUFNfTVNHX1NUQVRFX0FDVElWRToKKyAgICAgICAgICAgICppc1dha2VVcFJlcXVpcmVkID0gMDsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgWk1fUFNfTVNHX1NUQVRFX1QxOgorICAgICAgICBjYXNlIFpNX1BTX01TR19TVEFURV9UMjoKKyAgICAgICAgY2FzZSBaTV9QU19NU0dfU1RBVEVfU0xFRVA6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAqaXNXYWtlVXBSZXF1aXJlZCA9IDE7Cit6bV9kZWJ1Z19tc2cwKCJ6ZlBvd2VyU2F2aW5nTWdySGFuZGxlUHNOb25lOiBXYWtlIHVwIG5vd1xuIik7CisgICAgICAgICAgICBpZiAoIHpmU3RhSXNDb25uZWN0ZWQoZGV2KSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiemZQb3dlclNhdmluZ01nck9uSGFuZGxlVDEgc2VuZCBOdWxsIGRhdGFcbiIpOworICAgICAgICAgICAgICAgIC8vemZTZW5kTnVsbERhdGEoZGV2LCAwKTsKKyAgICAgICAgICAgICAgICByZXQgPSAxOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB3ZC0+c3RhLnBzTWdyLnN0YXRlID0gWk1fUFNfTVNHX1NUQVRFX0FDVElWRTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCB6ZlBvd2VyU2F2aW5nTWdySGFuZGxlUHMoemRldl90KiBkZXYpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgc3dpdGNoKHdkLT5zdGEucHNNZ3Iuc3RhdGUpCisgICAgeworICAgICAgICBjYXNlIFpNX1BTX01TR19TVEFURV9BQ1RJVkU6CisgICAgICAgICAgICAvL3ptX2RlYnVnX21zZzAoInpmUG93ZXJTYXZpbmdNZ3JIYW5kbGVQczogUHJlcGFyZSB0byBzbGVlcC4uLlxuIik7CisgICAgICAgICAgICAvL3dkLT5zdGEucHNNZ3Iuc3RhdGUgPSBaTV9QU19NU0dfU1RBVEVfVDE7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFpNX1BTX01TR19TVEFURV9UMToKKyAgICAgICAgY2FzZSBaTV9QU19NU0dfU1RBVEVfVDI6CisgICAgICAgIGNhc2UgWk1fUFNfTVNHX1NUQVRFX1NMRUVQOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorfQorCit2b2lkIHpmUG93ZXJTYXZpbmdNZ3JTZXRNb2RlKHpkZXZfdCogZGV2LCB1OF90IG1vZGUpCit7CisgICAgdTE2X3Qgc2VuZE51bGwgPSAwOworICAgIHU4X3QgaXNXYWtlVXBSZXF1aXJlZCA9IDA7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHptX2RlYnVnX21zZzEoIm1vZGUgPSAiLCBtb2RlKTsKKworICAgIGlmIChtb2RlID4gWk1fU1RBX1BTX0xJR0hUKQorICAgIHsKKyAgICAgICAgem1fZGVidWdfbXNnMCgicmV0dXJuIC0gd3JvbmcgcG93ZXIgc2F2ZSBtb2RlIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgI2lmIDEKKyAgICBzd2l0Y2gobW9kZSkKKyAgICB7CisgICAgICAgIGNhc2UgWk1fU1RBX1BTX05PTkU6CisgICAgICAgICAgICBzZW5kTnVsbCA9IHpmUG93ZXJTYXZpbmdNZ3JIYW5kbGVQc05vbmUoZGV2LCAmaXNXYWtlVXBSZXF1aXJlZCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFpNX1NUQV9QU19GQVNUOgorICAgICAgICBjYXNlIFpNX1NUQV9QU19MSUdIVDoKKyAgICAgICAgICAgIHdkLT5zdGEucHNNZ3IubWF4U2xlZXBQZXJpb2RzID0gMTsKKyAgICAgICAgICAgIHpmUG93ZXJTYXZpbmdNZ3JIYW5kbGVQcyhkZXYpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBaTV9TVEFfUFNfTUFYOgorICAgICAgICAgICAgd2QtPnN0YS5wc01nci5tYXhTbGVlcFBlcmlvZHMgPSBaTV9QU19NQVhfU0xFRVBfUEVSSU9EUzsKKyAgICAgICAgICAgIHpmUG93ZXJTYXZpbmdNZ3JIYW5kbGVQcyhkZXYpOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgICNlbHNlCisgICAgc3dpdGNoKHdkLT5zdGEucHNNZ3Iuc3RhdGUpCisgICAgeworICAgICAgICBjYXNlIFpNX1BTX01TR19TVEFURV9BQ1RJVkU6CisgICAgICAgICAgICBpZiAoIG1vZGUgIT0gWk1fU1RBX1BTX05PTkUgKQorICAgICAgICAgICAgeworem1fZGVidWdfbXNnMCgiemZQb3dlclNhdmluZ01nclNldE1vZGU6IHN3aXRjaCBmcm9tIFpNX1BTX01TR19TVEFURV9BQ1RJVkUgdG8gWk1fUFNfTVNHX1NUQVRFX1QxXG4iKTsKKyAgICAgICAgICAgICAgICAvLyBTdGFsbCB0aGUgVFggJiBzdGFydCB0byB3YWl0IHRoZSBwZW5kaW5nIFRYIHRvIGJlIGNvbXBsZXRlZAorICAgICAgICAgICAgICAgIHdkLT5zdGEucHNNZ3Iuc3RhdGUgPSBaTV9QU19NU0dfU1RBVEVfVDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFpNX1BTX01TR19TVEFURV9TTEVFUDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICAjZW5kaWYKKworICAgIHdkLT5zdGEucG93ZXJTYXZlTW9kZSA9IG1vZGU7CisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIGlmICggaXNXYWtlVXBSZXF1aXJlZCApCisgICAgeworICAgICAgICB6ZkhwUG93ZXJTYXZlU2V0U3RhdGUoZGV2LCAwKTsKKyAgICAgICAgd2QtPnN0YS5wc01nci50ZW1wV2FrZVVwID0gMDsKKyAgICB9CisKKyAgICBpZiAoIHpmU3RhSXNDb25uZWN0ZWQoZGV2KQorICAgICAgICAgJiYgKHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0lORlJBU1RSVUNUVVJFKSApCisgICAgeworICAgICAgICBzd2l0Y2gobW9kZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBaTV9TVEFfUFNfTk9ORToKKyAgICAgICAgICAgICAgICB6ZkhwUG93ZXJTYXZlU2V0TW9kZShkZXYsIDAsIDAsIHdkLT5iZWFjb25JbnRlcnZhbCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgWk1fU1RBX1BTX0ZBU1Q6CisgICAgICAgICAgICBjYXNlIFpNX1NUQV9QU19NQVg6CisgICAgICAgICAgICBjYXNlIFpNX1NUQV9QU19MSUdIVDoKKyAgICAgICAgICAgICAgICB6ZkhwUG93ZXJTYXZlU2V0TW9kZShkZXYsIDAsIDEsIHdkLT5iZWFjb25JbnRlcnZhbCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgemZIcFBvd2VyU2F2ZVNldE1vZGUoZGV2LCAwLCAwLCB3ZC0+YmVhY29uSW50ZXJ2YWwpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHNlbmROdWxsID09IDEpCisgICAgeworICAgICAgICB6ZlNlbmROdWxsRGF0YShkZXYsIDApOworICAgIH0KKworICAgIHJldHVybjsKK30KKworc3RhdGljIHZvaWQgemZQb3dlclNhdmluZ01nck5vdGlmeVBTVG9BUCh6ZGV2X3QgKmRldikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIGlmICggKHdkLT5zdGEucHNNZ3IudGVtcFdha2VVcCAhPSAxKSYmCisgICAgICAgICAod2QtPnN0YS5wc01nci5sYXN0VHhVbmljYXN0RnJtICE9IHdkLT5jb21tVGFsbHkudHhVbmljYXN0RnJtIHx8CisgICAgICAgICAgd2QtPnN0YS5wc01nci5sYXN0VHhCcm9hZGNhc3RGcm0gIT0gd2QtPmNvbW1UYWxseS50eEJyb2FkY2FzdEZybSB8fAorICAgICAgICAgIHdkLT5zdGEucHNNZ3IubGFzdFR4TXVsdGljYXN0RnJtICE9IHdkLT5jb21tVGFsbHkudHhNdWx0aWNhc3RGcm0pICkKKyAgICB7CisgICAgICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgIHdkLT5zdGEucHNNZ3IubGFzdFR4VW5pY2FzdEZybSA9IHdkLT5jb21tVGFsbHkudHhVbmljYXN0RnJtOworICAgICAgICB3ZC0+c3RhLnBzTWdyLmxhc3RUeEJyb2FkY2FzdEZybSA9IHdkLT5jb21tVGFsbHkudHhCcm9hZGNhc3RGcm07CisgICAgICAgIHdkLT5zdGEucHNNZ3IubGFzdFR4TXVsdGljYXN0RnJtID0gd2QtPmNvbW1UYWxseS50eE11bHRpY2FzdEZybTsKKyAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgICAgICB6ZlNlbmROdWxsRGF0YShkZXYsIDEpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgemZQb3dlclNhdmluZ01nck9uSGFuZGxlVDEoemRldl90KiBkZXYpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICAvLyBJZiB0aGUgdHggUSBpcyBub3QgZW1wdHkuLi5yZXR1cm4KKyAgICBpZiAoIHpmSXNWdHhxRW1wdHkoZGV2KSA9PSBGQUxTRSApCisgICAgeworICAgICAgICByZXR1cm47CisgICAgfQorCit6bV9kZWJ1Z19tc2cwKCJWdHhRIGlzIGVtcHR5IG5vdy4uLkNoZWNrIGlmIEhBTCBUWFEgaXMgZW1wdHlcbiIpOworCisgICAgLy8gVGhlIHRoZSBIQUwgVFggUSBpcyBub3QgZW1wdHkuLi5yZXR1cm4KKyAgICBpZiAoIHpmSHBHZXRGcmVlVHhkQ291bnQoZGV2KSAhPSB6ZkhwR2V0TWF4VHhkQ291bnQoZGV2KSApCisgICAgeworICAgICAgICByZXR1cm47CisgICAgfQorCit6bV9kZWJ1Z19tc2cwKCJIQUwgVFhRIGlzIGVtcHR5IG5vdy4uLkNvdWxkIGdvIHRvIHNsZWVwLi4uXG4iKTsKKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICBpZiAod2QtPnN0YS5wb3dlclNhdmVNb2RlID09IFpNX1NUQV9QU19MSUdIVCkKKyAgICB7CisgICAgICAgIGlmICh3ZC0+c3RhLlJlY2VpdmVkUGt0UmF0ZVBlclNlY29uZCA+IDIwMCkKKyAgICAgICAgeworICAgICAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmICggemZTdGFJc0Nvbm5lY3RlZChkZXYpCisgICAgICAgICAgICAgJiYgKHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0lORlJBU1RSVUNUVVJFKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh3ZC0+c3RhLnBzTWdyLnNsZWVwQWxsb3dlZHRpY2spIHsKKyAgICAgICAgICAgICAgICB3ZC0+c3RhLnBzTWdyLnNsZWVwQWxsb3dlZHRpY2stLTsKKyAgICAgICAgICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHdkLT5zdGEucHNNZ3Iuc3RhdGUgPSBaTV9QU19NU0dfU1RBVEVfVDI7CisKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgLy8gU2VuZCB0aGUgTnVsbCBwa3QgdG8gQVAgdG8gbm90aWZ5IHRoYXQgSSdtIGdvaW5nIHRvIHNsZWVwCisgICAgaWYgKCB6ZlN0YUlzQ29ubmVjdGVkKGRldikgKQorICAgIHsKK3ptX2RlYnVnX21zZzAoInpmUG93ZXJTYXZpbmdNZ3JPbkhhbmRsZVQxIHNlbmQgTnVsbCBkYXRhXG4iKTsKKyAgICAgICAgemZQb3dlclNhdmluZ01nck5vdGlmeVBTVG9BUChkZXYpOworICAgIH0KKworICAgIC8vIFN0YWxsIHRoZSBUWCBub3cKKyAgICAvLyB6ZlR4RW5naW5lU3RvcChkZXYpOworfQorCitzdGF0aWMgdm9pZCB6ZlBvd2VyU2F2aW5nTWdyT25IYW5kbGVUMih6ZGV2X3QqIGRldikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIC8vIFdhaXQgdW50aWwgdGhlIE51bGwgcGt0IGlzIHRyYW5zbWl0dGVkCisgICAgaWYgKCB6ZkhwR2V0RnJlZVR4ZENvdW50KGRldikgIT0gemZIcEdldE1heFR4ZENvdW50KGRldikgKQorICAgIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgd2QtPnN0YS5wc01nci5zdGF0ZSA9IFpNX1BTX01TR19TVEFURV9TTEVFUDsKKyAgICB3ZC0+c3RhLnBzTWdyLmxhc3RUeFVuaWNhc3RGcm0gPSB3ZC0+Y29tbVRhbGx5LnR4VW5pY2FzdEZybTsKKyAgICB3ZC0+c3RhLnBzTWdyLmxhc3RUeEJyb2FkY2FzdEZybSA9IHdkLT5jb21tVGFsbHkudHhCcm9hZGNhc3RGcm07CisgICAgd2QtPnN0YS5wc01nci5sYXN0VHhNdWx0aWNhc3RGcm0gPSB3ZC0+Y29tbVRhbGx5LnR4TXVsdGljYXN0RnJtOworICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICAvLyBMZXQgQ0hJUCBzbGVlcCBub3cKK3ptX2RlYnVnX21zZzAoInpmUG93ZXJTYXZpbmdNZ3JPbkhhbmRsZVQyIHp6enouLi4uXG4iKTsKKyAgICB6ZkhwUG93ZXJTYXZlU2V0U3RhdGUoZGV2LCAxKTsKKyAgICB3ZC0+c3RhLnBzTWdyLnRlbXBXYWtlVXAgPSAwOworfQorCit1OF90IHpmUG93ZXJTYXZpbmdNZ3JJc1NsZWVwaW5nKHpkZXZfdCAqZGV2KQoreworICAgIHU4X3QgaXNTbGVlcGluZyA9IEZBTFNFOworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICBpZiAoIHdkLT5zdGEucHNNZ3Iuc3RhdGUgPT0gWk1fUFNfTVNHX1NUQVRFX1NMRUVQIHx8CisgICAgICAgICB3ZC0+c3RhLnBzTWdyLnN0YXRlID09IFpNX1BTX01TR19TVEFURV9UMikKKyAgICB7CisgICAgICAgIGlzU2xlZXBpbmcgPSBUUlVFOworICAgIH0KKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIHJldHVybiBpc1NsZWVwaW5nOworfQorCitzdGF0aWMgdThfdCB6ZlBvd2VyU2F2aW5nTWdySXNJZGxlKHpkZXZfdCAqZGV2KQoreworICAgIHU4X3QgaXNJZGxlID0gMDsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIGlmICggemZTdGFJc0Nvbm5lY3RlZChkZXYpICYmIHdkLT5zdGEucHNNZ3IuaXNTbGVlcEFsbG93ZWQgPT0gMCApCisgICAgeworICAgICAgICBnb3RvIGRvbmU7CisgICAgfQorCisgICAgaWYgKCB3ZC0+c3RhLmJDaGFubmVsU2NhbiApCisgICAgeworICAgICAgICBnb3RvIGRvbmU7CisgICAgfQorCisgICAgaWYgKCB6ZlN0YUlzQ29ubmVjdGluZyhkZXYpICkKKyAgICB7CisgICAgICAgIGdvdG8gZG9uZTsKKyAgICB9CisKKyAgICBpZiAod2QtPnN0YS5wb3dlclNhdmVNb2RlID09IFpNX1NUQV9QU19MSUdIVCkKKyAgICB7CisgICAgICAgIGlmICh3ZC0+c3RhLlJlY2VpdmVkUGt0UmF0ZVBlclNlY29uZCA+IDIwMCkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBkb25lOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCB6ZlN0YUlzQ29ubmVjdGVkKGRldikKKyAgICAgICAgICAgICAmJiAod2QtPndsYW5Nb2RlID09IFpNX01PREVfSU5GUkFTVFJVQ1RVUkUpICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHdkLT5zdGEucHNNZ3Iuc2xlZXBBbGxvd2VkdGljaykgeworICAgICAgICAgICAgICAgIHdkLT5zdGEucHNNZ3Iuc2xlZXBBbGxvd2VkdGljay0tOworICAgICAgICAgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlzSWRsZSA9IDE7CisKK2RvbmU6CisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIGlmICggemZJc1Z0eHFFbXB0eShkZXYpID09IEZBTFNFICkKKyAgICB7CisgICAgICAgIGlzSWRsZSA9IDA7CisgICAgfQorCisgICAgcmV0dXJuIGlzSWRsZTsKK30KKworc3RhdGljIHZvaWQgemZQb3dlclNhdmluZ01nclNsZWVwSWZJZGxlKHpkZXZfdCAqZGV2KQoreworICAgIHU4X3QgaXNJZGxlOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICBpc0lkbGUgPSB6ZlBvd2VyU2F2aW5nTWdySXNJZGxlKGRldik7CisKKyAgICBpZiAoIGlzSWRsZSA9PSAwICkKKyAgICB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgc3dpdGNoKHdkLT5zdGEucG93ZXJTYXZlTW9kZSkKKyAgICB7CisgICAgICAgIGNhc2UgWk1fU1RBX1BTX05PTkU6CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFpNX1NUQV9QU19NQVg6CisgICAgICAgIGNhc2UgWk1fU1RBX1BTX0ZBU1Q6CisgICAgICAgIGNhc2UgWk1fU1RBX1BTX0xJR0hUOgorICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiemZQb3dlclNhdmluZ01nclNsZWVwSWZJZGxlOiBJRExFIHNvIHNsZXAgbm93Li4uXG4iKTsKKyAgICAgICAgICAgIHdkLT5zdGEucHNNZ3Iuc3RhdGUgPSBaTV9QU19NU0dfU1RBVEVfVDE7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworfQorCitzdGF0aWMgdm9pZCB6ZlBvd2VyU2F2aW5nTWdyRGlzY29ubmVjdE1haW4oemRldl90KiBkZXYpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisjaWZkZWYgWk1fRU5BQkxFX0RJU0NPTk5FQ1RfUFMKKyAgICBzd2l0Y2god2QtPnN0YS5wc01nci5zdGF0ZSkKKyAgICB7CisgICAgICAgIGNhc2UgWk1fUFNfTVNHX1NUQVRFX0FDVElWRToKKyAgICAgICAgICAgIHpmUG93ZXJTYXZpbmdNZ3JTbGVlcElmSWRsZShkZXYpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBaTV9QU19NU0dfU1RBVEVfU0xFRVA6CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFpNX1BTX01TR19TVEFURV9UMToKKyAgICAgICAgICAgIHpmUG93ZXJTYXZpbmdNZ3JPbkhhbmRsZVQxKGRldik7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFpNX1BTX01TR19TVEFURV9UMjoKKyAgICAgICAgICAgIHpmUG93ZXJTYXZpbmdNZ3JPbkhhbmRsZVQyKGRldik7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisjZWxzZQorICAgIHpmUG93ZXJTYXZpbmdNZ3JXYWtldXAoZGV2KTsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZCB6ZlBvd2VyU2F2aW5nTWdySW5mcmFNYWluKHpkZXZfdCogZGV2KQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHN3aXRjaCh3ZC0+c3RhLnBzTWdyLnN0YXRlKQorICAgIHsKKyAgICAgICAgY2FzZSBaTV9QU19NU0dfU1RBVEVfQUNUSVZFOgorICAgICAgICAgICAgemZQb3dlclNhdmluZ01nclNsZWVwSWZJZGxlKGRldik7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFpNX1BTX01TR19TVEFURV9TTEVFUDoKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgWk1fUFNfTVNHX1NUQVRFX1QxOgorICAgICAgICAgICAgemZQb3dlclNhdmluZ01nck9uSGFuZGxlVDEoZGV2KTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgWk1fUFNfTVNHX1NUQVRFX1QyOgorICAgICAgICAgICAgemZQb3dlclNhdmluZ01nck9uSGFuZGxlVDIoZGV2KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KK30KKwordm9pZCB6ZlBvd2VyU2F2aW5nTWdyQXRpbVdpbkV4cGlyZWQoemRldl90KiBkZXYpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisvL3ByaW50aygiemZQb3dlclNhdmluZ01nckF0aW1XaW5FeHBpcmVkICMxXG4iKTsKKyAgICBpZiAoIHdkLT5zdGEucG93ZXJTYXZlTW9kZSA9PSBaTV9TVEFfUFNfTk9ORSApCisgICAgeworICAgICAgICByZXR1cm47CisgICAgfQorCisvL3ByaW50aygiemZQb3dlclNhdmluZ01nckF0aW1XaW5FeHBpcmVkICMyXG4iKTsKKyAgICAvLyBpZiB3ZSByZWNlaXZlZCBhbnkgQVRJTSB3aW5kb3cgZnJvbSB0aGUgb3RoZXJzIHRvIGluZGljYXRlIHdlIGhhdmUgYnVmZmVyZWQgZGF0YQorICAgIC8vIGF0IHRoZSBvdGhlciBzdGF0aW9uLCB3ZSBjYW4ndCBnbyB0byBzbGVlcAorICAgIGlmICggd2QtPnN0YS5yZWN2QXRpbSApCisgICAgeworICAgICAgICB3ZC0+c3RhLnJlY3ZBdGltID0gMDsKKyAgICAgICAgem1fZGVidWdfbXNnMCgiQ2FuJ3Qgc2xlZXAgZHVlIHRvIHJlY2V2aW5nIEFUSU0gd2luZG93ISIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gaWYgd2UgYXJlIHRoZSBvbmUgdG8gdHggYmVhY29uIGR1cmluZyBsYXN0IGJlYWNvbiBpbnRlcnZhbC4gd2UgY2FuJ3QgZ28gdG8gc2xlZXAKKyAgICAvLyBzaW5jZSB3ZSBuZWVkIHRvIGJlIGFsaXZlIHRvIHJlc3BvbmQgdGhlIHByb2JlIHJlcXVlc3QhCisgICAgaWYgKCB3ZC0+c3RhLnR4QmVhY29uSW5kICkKKyAgICB7CisgICAgICAgIHptX2RlYnVnX21zZzAoIkNhbid0IHNsZWVwIGR1ZSB0byBqdXN0IHRyYW5zbWl0IGEgYmVhY29uISIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gSWYgd2UgYnVmZmVyIGFueSBkYXRhIGZvciB0aGUgb3RoZXIgc3RhdGlvbnMuIHdlIGNvdWxkIG5vdCBnbyB0byBzbGVlcAorICAgIGlmICggd2QtPnN0YS5pYnNzUHJldlBTRGF0YUNvdW50ICE9IDAgKQorICAgIHsKKyAgICAgICAgem1fZGVidWdfbXNnMCgiQ2FuJ3Qgc2xlZXAgZHVlIHRvIGJ1ZmZlcmluZyBkYXRhIGZvciB0aGUgb3RoZXJzISIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gYmVmb3JlIHNsZWVwaW5nLCB3ZSBzdGlsbCBuZWVkIHRvIG5vdGlmeSB0aGUgb3RoZXJzIGJ5IHRyYW5zbWl0dGluZyBudWxsCisgICAgLy8gcGt0IHdpdGggcG93ZXIgbWdtdCBiaXQgdHVybmVkIG9uLgorICAgIHpmUG93ZXJTYXZpbmdNZ3JPbkhhbmRsZVQxKGRldik7Cit9CisKK3N0YXRpYyB2b2lkIHpmUG93ZXJTYXZpbmdNZ3JJQlNTTWFpbih6ZGV2X3QqIGRldikKK3sKKyAgICAvLyB3YWl0IGZvciB0aGUgZW5kIG9mCisgICAgLy8gaWYgbmVlZCB0byB3YWl0IHRvIGtub3cgaWYgd2UgYXJlIHRoZSBvbmUgdG8gdHJhbnNtaXQgdGhlIGJlYWNvbgorICAgIC8vIGR1cmluZyB0aGUgYmVhY29uIGludGVydmFsLiBJZiBpdCdzIG1lLCB3ZSBjYW4ndCBnbyB0byBzbGVlcC4KKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHN3aXRjaCh3ZC0+c3RhLnBzTWdyLnN0YXRlKQorICAgIHsKKyAgICAgICAgY2FzZSBaTV9QU19NU0dfU1RBVEVfQUNUSVZFOgorICAgICAgICBjYXNlIFpNX1BTX01TR19TVEFURV9TTEVFUDoKKyAgICAgICAgY2FzZSBaTV9QU19NU0dfU1RBVEVfVDE6CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFpNX1BTX01TR19TVEFURV9UMjoKKyAgICAgICAgICAgIHpmUG93ZXJTYXZpbmdNZ3JPbkhhbmRsZVQyKGRldik7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm47Cit9CisKKyNpZiAxCit2b2lkIHpmUG93ZXJTYXZpbmdNZ3JNYWluKHpkZXZfdCogZGV2KQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHN3aXRjaCAod2QtPnN0YS5hZGFwdGVyU3RhdGUpCisgICAgeworICAgIGNhc2UgWk1fU1RBX1NUQVRFX0RJU0NPTk5FQ1Q6CisgICAgICAgIHpmUG93ZXJTYXZpbmdNZ3JEaXNjb25uZWN0TWFpbihkZXYpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFpNX1NUQV9TVEFURV9DT05ORUNURUQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9JTkZSQVNUUlVDVFVSRSkgeworICAgICAgICAgICAgICAgIHpmUG93ZXJTYXZpbmdNZ3JJbmZyYU1haW4oZGV2KTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAod2QtPndsYW5Nb2RlID09IFpNX01PREVfSUJTUykgeworICAgICAgICAgICAgICAgIHpmUG93ZXJTYXZpbmdNZ3JJQlNTTWFpbihkZXYpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgWk1fU1RBX1NUQVRFX0NPTk5FQ1RJTkc6CisgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorI2Vsc2UKK3ZvaWQgemZQb3dlclNhdmluZ01nck1haW4oemRldl90KiBkZXYpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgaWYgKCB3ZC0+d2xhbk1vZGUgIT0gWk1fTU9ERV9JTkZSQVNUUlVDVFVSRSApCisgICAgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3dpdGNoKHdkLT5zdGEucHNNZ3Iuc3RhdGUpCisgICAgeworICAgICAgICBjYXNlIFpNX1BTX01TR19TVEFURV9BQ1RJVkU6CisgICAgICAgICAgICBnb3RvIGNoZWNrX3NsZWVwOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBaTV9QU19NU0dfU1RBVEVfU0xFRVA6CisgICAgICAgICAgICBnb3RvIHNsZWVwaW5nOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBaTV9QU19NU0dfU1RBVEVfVDE6CisgICAgICAgICAgICB6ZlBvd2VyU2F2aW5nTWdyT25IYW5kbGVUMShkZXYpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBaTV9QU19NU0dfU1RBVEVfVDI6CisgICAgICAgICAgICB6ZlBvd2VyU2F2aW5nTWdyT25IYW5kbGVUMihkZXYpOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuOworCitzbGVlcGluZzoKKyAgICByZXR1cm47CisKK2NoZWNrX3NsZWVwOgorICAgIHpmUG93ZXJTYXZpbmdNZ3JTbGVlcElmSWRsZShkZXYpOworICAgIHJldHVybjsKK30KKyNlbmRpZgorCisjaWZkZWYgWk1fRU5BQkxFX1BPV0VSX1NBVkUKK3ZvaWQgemZQb3dlclNhdmluZ01ncldha2V1cCh6ZGV2X3QqIGRldikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworLy96bV9kZWJ1Z19tc2cwKCJ6ZlBvd2VyU2F2aW5nTWdyV2FrZXVwIik7CisKKyAgICAvL2lmICggd2QtPnN0YS5wc01nci5zdGF0ZSAhPSBaTV9QU19NU0dfU1RBVEVfQUNUSVZFICYmICggemZQb3dlclNhdmluZ01ncklzSWRsZShkZXYpID09IDAgKSkKKyAgICBpZiAoIHdkLT5zdGEucHNNZ3Iuc3RhdGUgIT0gWk1fUFNfTVNHX1NUQVRFX0FDVElWRSApCisgICAgeworICAgICAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgICAgIHdkLT5zdGEucHNNZ3IuaXNTbGVlcEFsbG93ZWQgPSAwOworICAgICAgICB3ZC0+c3RhLnBzTWdyLnN0YXRlID0gWk1fUFNfTVNHX1NUQVRFX0FDVElWRTsKKworICAgICAgICBpZiAoIHdkLT5zdGEucG93ZXJTYXZlTW9kZSA+IFpNX1NUQV9QU19OT05FICkKKyAgICAgICAgICAgIHdkLT5zdGEucHNNZ3IudGVtcFdha2VVcCA9IDE7CisKKyAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgICAgICAvLyBXYWtlIHVwIHRoZSBDSElQIG5vdyEhCisgICAgICAgIHpmSHBQb3dlclNhdmVTZXRTdGF0ZShkZXYsIDApOworICAgIH0KK30KKyNlbHNlCit2b2lkIHpmUG93ZXJTYXZpbmdNZ3JXYWtldXAoemRldl90KiBkZXYpCit7Cit9CisjZW5kaWYKKwordm9pZCB6ZlBvd2VyU2F2aW5nTWdyUHJvY2Vzc0JlYWNvbih6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpCit7CisgICAgdThfdCAgIGxlbmd0aCwgYml0bWFwOworICAgIHUxNl90ICBvZmZzZXQsIG4xLCBuMiwgcSwgcjsKKyAgICB6YnVmX3QqIHBzQnVmOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICBpZiAoIHdkLT5zdGEucG93ZXJTYXZlTW9kZSA9PSBaTV9TVEFfUFNfTk9ORSAgKQorICAgIC8vaWYgKCB3ZC0+c3RhLnBzTWdyLnN0YXRlICE9IFpNX1BTX01TR19TVEFURV9TTEVFUCApCisgICAgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgd2QtPnN0YS5wc01nci5pc1NsZWVwQWxsb3dlZCA9IDE7CisKKyAgICBpZiAoIChvZmZzZXQ9emZGaW5kRWxlbWVudChkZXYsIGJ1ZiwgWk1fV0xBTl9FSURfVElNKSkgIT0gMHhmZmZmICkKKyAgICB7CisgICAgICAgIGxlbmd0aCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxKTsKKworICAgICAgICBpZiAoIGxlbmd0aCA+IDMgKQorICAgICAgICB7CisgICAgICAgICAgICBuMSA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCs0KSAmICh+Wk1fQklUXzApOworICAgICAgICAgICAgbjIgPSBsZW5ndGggKyBuMSAtIDQ7CisgICAgICAgICAgICBxID0gd2QtPnN0YS5haWQgPj4gMzsKKyAgICAgICAgICAgIHIgPSB3ZC0+c3RhLmFpZCAmIDc7CisKKyAgICAgICAgICAgIGlmICgocSA+PSBuMSkgJiYgKHEgPD0gbjIpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJpdG1hcCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCs1K3EtbjEpOworCisgICAgICAgICAgICAgICAgaWYgKCAoYml0bWFwID4+IHIpICYgIFpNX0JJVF8wICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vaWYgKCB3ZC0+c3RhLnBvd2VyU2F2ZU1vZGUgPT0gWk1fU1RBX1BTX0ZBU1QgKQorICAgICAgICAgICAgICAgICAgICBpZiAoIDAgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLnBzTWdyLnN0YXRlID0gWk1fUFNfTVNHX1NUQVRFX1MxOworICAgICAgICAgICAgICAgICAgICAgICAgLy96ZlNlbmRQU1BvbGwoZGV2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHpmU2VuZE51bGxEYXRhKGRldiwgMCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHdkLT5zdGEucW9zSW5mbyYweGYpICE9IDB4ZikKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzZW5kIHBzLXBvbGwgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3ByaW50aygiemZTZW5kUFNQb2xsICMxXG4iKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEucHNNZ3IuaXNTbGVlcEFsbG93ZWQgPSAwOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoICh3ZC0+c3RhLnBvd2VyU2F2ZU1vZGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgWk1fU1RBX1BTX01BWDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFpNX1NUQV9QU19GQVNUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3ptX2RlYnVnX21zZzAoIndha2UgdXAgYW5kIHNlbmQgUFMtUG9sbFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpmU2VuZFBTUG9sbChkZXYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFpNX1NUQV9QU19MSUdIVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMCgid2FrZSB1cCBhbmQgc2VuZCBudWxsIGRhdGFcbiIpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEucHNNZ3Iuc2xlZXBBbGxvd2VkdGljayA9IDQwMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ZlNlbmROdWxsRGF0YShkZXYsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLnBzTWdyLnRlbXBXYWtlVXAgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgd2hpbGUgKChwc0J1ZiA9IHpmUXVldWVHZXQoZGV2LCB3ZC0+c3RhLnVhcHNkUSkpICE9IE5VTEwpCisgICAgeworICAgICAgICB6ZlR4U2VuZEV0aChkZXYsIHBzQnVmLCAwLCBaTV9FWFRFUk5BTF9BTExPQ19CVUYsIDApOworICAgIH0KKworICAgIC8vcHJpbnRrKCJ6ZlBvd2VyU2F2aW5nTWdyUHJvY2Vzc0JlYWNvbiAjMVxuIik7CisgICAgemZQb3dlclNhdmluZ01nck1haW4oZGV2KTsKK30KKwordm9pZCB6ZlBvd2VyU2F2aW5nTWdyQ29ubmVjdE5vdGlmeSh6ZGV2X3QgKmRldikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBpZiAoIHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0lORlJBU1RSVUNUVVJFICkKKyAgICB7CisgICAgICAgIHN3aXRjaCh3ZC0+c3RhLnBvd2VyU2F2ZU1vZGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgWk1fU1RBX1BTX05PTkU6CisgICAgICAgICAgICAgICAgemZIcFBvd2VyU2F2ZVNldE1vZGUoZGV2LCAwLCAwLCB3ZC0+YmVhY29uSW50ZXJ2YWwpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIFpNX1NUQV9QU19GQVNUOgorICAgICAgICAgICAgY2FzZSBaTV9TVEFfUFNfTUFYOgorICAgICAgICAgICAgY2FzZSBaTV9TVEFfUFNfTElHSFQ6CisgICAgICAgICAgICAgICAgemZIcFBvd2VyU2F2ZVNldE1vZGUoZGV2LCAwLCAxLCB3ZC0+YmVhY29uSW50ZXJ2YWwpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHpmSHBQb3dlclNhdmVTZXRNb2RlKGRldiwgMCwgMCwgd2QtPmJlYWNvbkludGVydmFsKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCB6ZlBvd2VyU2F2aW5nTWdyUHJlVEJUVEludGVycnVwdCh6ZGV2X3QgKmRldikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIC8qIGRpc2FibGUgVEJUVCBpbnRlcnJ1cHQgd2hlbiBjaGFuZ2UgZnJvbSBjb25uZWN0aW9uIHRvIGRpc2Nvbm5lY3QgKi8KKyAgICBpZiAoemZTdGFJc0Rpc2Nvbm5lY3QoZGV2KSkgeworICAgICAgICB6ZkhwUG93ZXJTYXZlU2V0TW9kZShkZXYsIDAsIDAsIDApOworICAgICAgICB6ZlBvd2VyU2F2aW5nTWdyV2FrZXVwKGRldik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIHdkLT5zdGEucHNNZ3IudGlja3MrKzsKKworICAgIGlmICggd2QtPnN0YS5wc01nci50aWNrcyA8IHdkLT5zdGEucHNNZ3IubWF4U2xlZXBQZXJpb2RzICkKKyAgICB7CisgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgd2QtPnN0YS5wc01nci50aWNrcyA9IDA7CisgICAgfQorCisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIHpmUG93ZXJTYXZpbmdNZ3JXYWtldXAoZGV2KTsKK30KKworLyogTGVhdmUgYW4gZW1wdHkgbGluZSBiZWxvdyB0byByZW1vdmUgd2FybmluZyBtZXNzYWdlIG9uIHNvbWUgY29tcGlsZXIgKi8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2NzY2FubWdyLmMgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvY3NjYW5tZ3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzI4MzVjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2NzY2FubWdyLmMKQEAgLTAsMCArMSw1MzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBBdGhlcm9zIENvbW11bmljYXRpb25zIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSAiY3ByZWNvbXAuaCIKKwordm9pZCB6ZlNjYW5NZ3JJbml0KHpkZXZfdCogZGV2KQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHdkLT5zdGEuc2Nhbk1nci5zY2FuUmVxc1swXSA9IDA7CisgICAgd2QtPnN0YS5zY2FuTWdyLnNjYW5SZXFzWzFdID0gMDsKKworICAgIHdkLT5zdGEuc2Nhbk1nci5jdXJyU2NhblR5cGUgPSBaTV9TQ0FOX01HUl9TQ0FOX05PTkU7CisgICAgd2QtPnN0YS5zY2FuTWdyLnNjYW5TdGFydERlbGF5ID0gMzsKKyAgICAvL3dkLT5zdGEuc2Nhbk1nci5zY2FuU3RhcnREZWxheSA9IDA7Cit9CisKK3U4X3QgemZTY2FuTWdyU2NhblN0YXJ0KHpkZXZfdCogZGV2LCB1OF90IHNjYW5UeXBlKQoreworICAgIHU4X3QgaTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptX2RlYnVnX21zZzEoInNjYW5UeXBlID0gIiwgc2NhblR5cGUpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIGlmICggc2NhblR5cGUgIT0gWk1fU0NBTl9NR1JfU0NBTl9JTlRFUk5BTCAmJgorICAgICAgICAgc2NhblR5cGUgIT0gWk1fU0NBTl9NR1JfU0NBTl9FWFRFUk5BTCApCisgICAgeworICAgICAgICB6bV9kZWJ1Z19tc2cwKCJ1bmtub3duIHNjYW5UeXBlIik7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBlbHNlIGlmICh6ZlN0YUlzQ29ubmVjdGluZyhkZXYpKQorICAgIHsKKyAgICAgICAgem1fZGVidWdfbXNnMCgicmVqZWN0IHNjYW4gcmVxdWVzdCBkdWUgdG8gY29ubmVjdGluZyIpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBpID0gc2NhblR5cGUgLSAxOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIGlmICggd2QtPnN0YS5zY2FuTWdyLnNjYW5SZXFzW2ldID09IDEgKQorICAgIHsKKyAgICAgICAgem1fZGVidWdfbXNnMSgic2NhbiByZXNjaGVkdWxlZCIsIHNjYW5UeXBlKTsKKyAgICAgICAgZ290byBzY2FuX2RvbmU7CisgICAgfQorCisgICAgd2QtPnN0YS5zY2FuTWdyLnNjYW5SZXFzW2ldID0gMTsKKyAgICB6bV9kZWJ1Z19tc2cxKCJzY2FuIHNjaGVkdWxlZDogIiwgc2NhblR5cGUpOworCisgICAgLy8gSWYgdGhlcmUncyBubyBzY2FuIHBlbmRpbmcsIHdlIGRvIHRoZSBzY2FuIHJpZ2h0IGF3YXkuCisgICAgLy8gSWYgdGhlcmUncyBhbiBpbnRlcm5hbCBzY2FuIGFuZCB0aGUgbmV3IHNjYW4gcmVxdWVzdCBpcyBleHRlcm5hbCBvbmUsCisgICAgLy8gd2Ugd2lsbCByZXN0YXJ0IHRoZSBzY2FuLgorICAgIGlmICggd2QtPnN0YS5zY2FuTWdyLmN1cnJTY2FuVHlwZSA9PSBaTV9TQ0FOX01HUl9TQ0FOX05PTkUgKQorICAgIHsKKyAgICAgICAgZ290byBzY2hlZHVsZV9zY2FuOworICAgIH0KKyAgICBlbHNlIGlmICggd2QtPnN0YS5zY2FuTWdyLmN1cnJTY2FuVHlwZSA9PSBaTV9TQ0FOX01HUl9TQ0FOX0lOVEVSTkFMICYmCisgICAgICAgICAgICAgIHNjYW5UeXBlID09IFpNX1NDQU5fTUdSX1NDQU5fRVhURVJOQUwgKQorICAgIHsKKyAgICAgICAgLy8gU3RvcCB0aGUgaW50ZXJuYWwgc2NhbiAmIHNjaGVkdWxlIGV4dGVybmFsIHNjYW4gZmlyc3QKKyAgICAgICAgemZUaW1lckNhbmNlbChkZXYsIFpNX0VWRU5UX1NDQU4pOworCisgICAgICAgIC8qIEZpeCBmb3IgV0hRTCBzZW5kcmVjdiA9PiB3ZSBkbyBub3QgYXBwbHkgZGVsYXkgdGltZSBpbiB3aGljaCB0aGUgZGV2aWNlCisgICAgICAgICAgIHN0b3AgdHJhbnNtaXR0aW5nIHBhY2tldCB3aGVuIHdlIGFscmVhZHkgY29ubmVjdCB0byBzb21lIEFQICAqLworICAgICAgICB3ZC0+c3RhLmJTY2hlZHVsZVNjYW4gPSBGQUxTRTsKKworICAgICAgICB6ZlRpbWVyQ2FuY2VsKGRldiwgWk1fRVZFTlRfVElNRU9VVF9TQ0FOKTsKKyAgICAgICAgemZUaW1lckNhbmNlbChkZXYsIFpNX0VWRU5UX0lOX1NDQU4pOworCisgICAgICAgIHdkLT5zdGEuYkNoYW5uZWxTY2FuID0gRkFMU0U7CisgICAgICAgIGdvdG8gc2NoZWR1bGVfc2NhbjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgem1fZGVidWdfbXNnMCgiU2NhbiBpcyBidXN5Li4ud2FpdGluZyBsYXRlciB0byBzdGFydFxuIik7CisgICAgfQorCisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICByZXR1cm4gMDsKKworc2Nhbl9kb25lOgorICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgcmV0dXJuIDE7CisKK3NjaGVkdWxlX3NjYW46CisKKyAgICB3ZC0+c3RhLmJTY2hlZHVsZVNjYW4gPSBUUlVFOworCisgICAgemZUaW1lclNjaGVkdWxlKGRldiwgWk1fRVZFTlRfU0NBTiwgd2QtPnN0YS5zY2FuTWdyLnNjYW5TdGFydERlbGF5KTsKKyAgICB3ZC0+c3RhLnNjYW5NZ3Iuc2NhblN0YXJ0RGVsYXkgPSAzOworICAgIC8vd2QtPnN0YS5zY2FuTWdyLnNjYW5TdGFydERlbGF5ID0gMDsKKyAgICB3ZC0+c3RhLnNjYW5NZ3IuY3VyclNjYW5UeXBlID0gc2NhblR5cGU7CisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIGlmICgoemZTdGFJc0Nvbm5lY3RlZChkZXYpKSAmJiAoIXpmUG93ZXJTYXZpbmdNZ3JJc1NsZWVwaW5nKGRldikpKQorICAgIHsKKyAgICAgICAgemZTZW5kTnVsbERhdGEoZGV2LCAxKTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgemZTY2FuTWdyU2NhblN0b3AoemRldl90KiBkZXYsIHU4X3Qgc2NhblR5cGUpCit7CisgICAgdThfdCBzY2FuTm90aWZ5UmVxdWlyZWQgPSAwOworICAgIHU4X3QgdGhlT3RoZXJTY2FuID0gWk1fU0NBTl9NR1JfU0NBTl9OT05FOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICBpZiAoIHdkLT5zdGEuc2Nhbk1nci5jdXJyU2NhblR5cGUgPT0gWk1fU0NBTl9NR1JfU0NBTl9OT05FICkKKyAgICB7CisgICAgICAgIHptX2Fzc2VydCh3ZC0+c3RhLnNjYW5NZ3Iuc2NhblJlcXNbMF0gPT0gMCk7CisgICAgICAgIHptX2Fzc2VydCh3ZC0+c3RhLnNjYW5NZ3Iuc2NhblJlcXNbMV0gPT0gMCk7CisgICAgICAgIGdvdG8gZG9uZTsKKyAgICB9CisKKyAgICBzd2l0Y2goc2NhblR5cGUpCisgICAgeworICAgICAgICBjYXNlIFpNX1NDQU5fTUdSX1NDQU5fRVhURVJOQUw6CisgICAgICAgICAgICBzY2FuTm90aWZ5UmVxdWlyZWQgPSAxOworICAgICAgICAgICAgdGhlT3RoZXJTY2FuID0gWk1fU0NBTl9NR1JfU0NBTl9JTlRFUk5BTDsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgWk1fU0NBTl9NR1JfU0NBTl9JTlRFUk5BTDoKKyAgICAgICAgICAgIHRoZU90aGVyU2NhbiA9IFpNX1NDQU5fTUdSX1NDQU5fRVhURVJOQUw7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZ290byBkb25lOworICAgIH0KKworICAgIGlmICggd2QtPnN0YS5zY2FuTWdyLmN1cnJTY2FuVHlwZSAhPSBzY2FuVHlwZSApCisgICAgeworICAgICAgICBnb3RvIHN0b3BfZG9uZTsKKyAgICB9CisKKyAgICB6ZlRpbWVyQ2FuY2VsKGRldiwgWk1fRVZFTlRfU0NBTik7CisKKyAgICAvKiBGaXggZm9yIFdIUUwgc2VuZHJlY3YgPT4gd2UgZG8gbm90IGFwcGx5IGRlbGF5IHRpbWUgaW4gd2hpY2ggdGhlIGRldmljZQorICAgICAgIHN0b3AgdHJhbnNtaXR0aW5nIHBhY2tldCB3aGVuIHdlIGFscmVhZHkgY29ubmVjdCB0byBzb21lIEFQICAqLworICAgIHdkLT5zdGEuYlNjaGVkdWxlU2NhbiA9IEZBTFNFOworCisgICAgemZUaW1lckNhbmNlbChkZXYsIFpNX0VWRU5UX1RJTUVPVVRfU0NBTik7CisgICAgemZUaW1lckNhbmNlbChkZXYsIFpNX0VWRU5UX0lOX1NDQU4pOworCisgICAgd2QtPnN0YS5iQ2hhbm5lbFNjYW4gPSBGQUxTRTsKKyAgICB3ZC0+c3RhLnNjYW5GcmVxdWVuY3kgPSAwOworCisgICAgaWYgKCB3ZC0+c3RhLnNjYW5NZ3Iuc2NhblJlcXNbdGhlT3RoZXJTY2FuIC0gMV0gKQorICAgIHsKKyAgICAgICAgd2QtPnN0YS5zY2FuTWdyLmN1cnJTY2FuVHlwZSA9IHRoZU90aGVyU2NhbjsKKworICAgICAgICAvLyBTY2hlZHVsZSB0aGUgb3RoZXIgc2NhbiBhZnRlciAxIHNlY29uZCBsYXRlcgorICAgICAgICB6ZlRpbWVyU2NoZWR1bGUoZGV2LCBaTV9FVkVOVF9TQ0FOLCAxMDApOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB3ZC0+c3RhLnNjYW5NZ3IuY3VyclNjYW5UeXBlID0gWk1fU0NBTl9NR1JfU0NBTl9OT05FOworICAgIH0KKworc3RvcF9kb25lOgorICAgIHdkLT5zdGEuc2Nhbk1nci5zY2FuUmVxc1tzY2FuVHlwZSAtIDFdID0gMDsKKworICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICAvKiBhdm9pZCBsb3NlIHJlY2VpdmUgcGFja2V0IHdoZW4gc2l0ZSBzdXJ2ZXkgKi8KKyAgICBpZiAoKHpmU3RhSXNDb25uZWN0ZWQoZGV2KSkgJiYgKCF6ZlBvd2VyU2F2aW5nTWdySXNTbGVlcGluZyhkZXYpKSkKKyAgICB7CisgICAgICAgIHpmU2VuZE51bGxEYXRhKGRldiwgMCk7CisgICAgfQorCisgICAgaWYgKCBzY2FuTm90aWZ5UmVxdWlyZWQgKQorICAgIHsKKyAgICAgICAgem1fZGVidWdfbXNnMCgiU2NhbiBub3RpZnkgYWZ0ZXIgcmVzZXQiKTsKKyAgICAgICAgaWYgKHdkLT56ZmNiU2Nhbk5vdGlmeSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB3ZC0+emZjYlNjYW5Ob3RpZnkoZGV2LCBOVUxMKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybjsKKworZG9uZToKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIHJldHVybjsKK30KKwordm9pZCB6ZlNjYW5NZ3JTY2FuQWNrKHpkZXZfdCogZGV2KQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgd2QtPnN0YS5zY2FuTWdyLnNjYW5TdGFydERlbGF5ID0gMzsKKyAgICAvL3dkLT5zdGEuc2Nhbk1nci5zY2FuU3RhcnREZWxheSA9IDA7CisKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIHJldHVybjsKK30KKworZXh0ZXJuIHZvaWQgemZTdGFSZWNvbm5lY3QoemRldl90KiBkZXYpOworCitzdGF0aWMgdm9pZCB6ZlNjYW5TZW5kUHJvYmVSZXF1ZXN0KHpkZXZfdCogZGV2KQoreworICAgIHU4X3QgazsKKyAgICB1MTZfdCAgZHN0WzNdID0geyAweGZmZmYsIDB4ZmZmZiwgMHhmZmZmIH07CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICAvKiBJbmNyZWFzZSByeEJlYWNvbkNvdW50IHRvIHByZXZlbnQgYmVhY29uIGxvc3QgKi8KKyAgICBpZiAoemZTdGFJc0Nvbm5lY3RlZChkZXYpKQorICAgIHsKKyAgICAgICAgd2QtPnN0YS5yeEJlYWNvbkNvdW50Kys7CisgICAgfQorCisgICAgaWYgKCB3ZC0+c3RhLmJQYXNzaXZlU2NhbiApCisgICAgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIC8qIGVuYWJsZSA4MDIubDExaCBhbmQgaW4gREZTIEJhbmQgLCBkaXNhYmxlIHNlbmRpbmcgcHJvYmUgcmVxdWVzdCAqLworICAgIGlmICh3ZC0+c3RhLkRGU0VuYWJsZSkKKyAgICB7CisgICAgICAgIGlmICh6ZkhwSXNEZnNDaGFubmVsKGRldiwgd2QtPnN0YS5zY2FuRnJlcXVlbmN5KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgemZTZW5kTW1GcmFtZShkZXYsIFpNX1dMQU5fRlJBTUVfVFlQRV9QUk9CRVJFUSwgZHN0LCAwLCAwLCAwKTsKKworICAgIGlmICggd2QtPnN0YS5kaXNhYmxlUHJvYmluZ1dpdGhTc2lkICkKKyAgICB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBmb3IgKGs9MTsgazw9Wk1fTUFYX1BST0JFX0hJRERFTl9TU0lEX1NJWkU7IGsrKykKKyAgICB7CisgICAgICAgIGlmICggd2QtPndzLnByb2JpbmdTc2lkTGlzdFtrLTFdLnNzaWRMZW4gIT0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHpmU2VuZE1tRnJhbWUoZGV2LCBaTV9XTEFOX0ZSQU1FX1RZUEVfUFJPQkVSRVEsIGRzdCwgaywgMCwgMCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHpmU2Nhbk1nckV2ZW50U2V0RnJlcUNvbXBsZXRlQ2IoemRldl90KiBkZXYpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworLy9wcmludGsoInpmU2Nhbk1nckV2ZW50U2V0RnJlcUNvbXBsZXRlQ2IgIzFcbiIpOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICB6ZlRpbWVyU2NoZWR1bGUoZGV2LCBaTV9FVkVOVF9JTl9TQ0FOLCBaTV9USUNLX0lOX1NDQU4pOworICAgIGlmICh3ZC0+c3RhLmJQYXNzaXZlU2NhbikKKyAgICB7CisgICAgICAgIHpmVGltZXJTY2hlZHVsZShkZXYsIFpNX0VWRU5UX1RJTUVPVVRfU0NBTiwgd2QtPnN0YS5wYXNzaXZlU2NhblRpY2tQZXJDaGFubmVsKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgemZUaW1lclNjaGVkdWxlKGRldiwgWk1fRVZFTlRfVElNRU9VVF9TQ0FOLCB3ZC0+c3RhLmFjdGl2ZXNjYW5UaWNrUGVyQ2hhbm5lbCk7CisgICAgfQorICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICB6ZlNjYW5TZW5kUHJvYmVSZXF1ZXN0KGRldik7Cit9CisKKworc3RhdGljIHZvaWQgemZTY2FuTWdyRXZlbnRTY2FuQ29tcGxldGVDYih6ZGV2X3QqIGRldikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBpZiAoKHpmU3RhSXNDb25uZWN0ZWQoZGV2KSkgJiYgKCF6ZlBvd2VyU2F2aW5nTWdySXNTbGVlcGluZyhkZXYpKSkKKyAgICB7CisgICAgICAgIHpmU2VuZE51bGxEYXRhKGRldiwgMCk7CisgICAgfQorICAgIHJldHVybjsKK30KKworCit2b2lkIHpmU2Nhbk1nclNjYW5FdmVudFJldHJ5KHpkZXZfdCogZGV2KQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIGlmICggIXdkLT5zdGEuYkNoYW5uZWxTY2FuICkKKyAgICB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoICF3ZC0+c3RhLmJQYXNzaXZlU2NhbiApCisgICAgeworICAgICAgICB6ZlNjYW5TZW5kUHJvYmVSZXF1ZXN0KGRldik7CisgICAgICAgICNpZiAwCisgICAgICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgIHpmVGltZXJTY2hlZHVsZShkZXYsIFpNX0VWRU5UX0lOX1NDQU4sIFpNX1RJQ0tfSU5fU0NBTik7CisgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgICNlbmRpZgorICAgIH0KK30KKwordThfdCB6ZlNjYW5NZ3JTY2FuRXZlbnRUaW1lb3V0KHpkZXZfdCogZGV2KQoreworICAgIHUxNl90ICAgbmV4dFNjYW5GcmVxdWVuY3kgPSAwOworICAgIHU4X3QgICAgdGVtcDsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIGlmICggd2QtPnN0YS5zY2FuRnJlcXVlbmN5ID09IDAgKQorICAgIHsKKyAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIG5leHRTY2FuRnJlcXVlbmN5ID0gemZDaEdldE5leHRDaGFubmVsKGRldiwgd2QtPnN0YS5zY2FuRnJlcXVlbmN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ3ZC0+c3RhLmJQYXNzaXZlU2Nhbik7CisKKyAgICBpZiAoIChuZXh0U2NhbkZyZXF1ZW5jeSA9PSAweGZmZmYpCisgICAgICAgICB8fCAod2QtPnN0YS5zY2FuRnJlcXVlbmN5ID09IHpmQ2hHZXRMYXN0Q2hhbm5lbChkZXYsICZ0ZW1wKSkgKQorICAgIHsKKyAgICAgICAgdThfdCBjdXJyU2NhblR5cGU7CisgICAgICAgIHU4X3QgaXNFeHRlcm5hbFNjYW4gPSAwOworICAgICAgICB1OF90IGlzSW50ZXJuYWxTY2FuID0gMDsKKworICAgICAgICAvL3ptX2RlYnVnX21zZzEoImVuZCBzY2FuID0gIiwgS2VRdWVyeUludGVycnVwdFRpbWUoKSk7CisgICAgICAgIHdkLT5zdGEuc2NhbkZyZXF1ZW5jeSA9IDA7CisKKyAgICAgICAgem1fZGVidWdfbXNnMSgic2NhbiAxIHR5cGU6ICIsIHdkLT5zdGEuc2Nhbk1nci5jdXJyU2NhblR5cGUpOworICAgICAgICB6bV9kZWJ1Z19tc2cxKCJzY2FuIGNoYW5uZWwgY291bnQgPSAiLCB3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbENudCk7CisKKyAgICAgICAgLy96ZkJzc0luZm9SZWZyZXNoKGRldik7CisgICAgICAgIHpmVGltZXJDYW5jZWwoZGV2LCBaTV9FVkVOVF9USU1FT1VUX1NDQU4pOworCisgICAgICAgIGlmICggd2QtPnN0YS5iQ2hhbm5lbFNjYW4gPT0gRkFMU0UgKQorICAgICAgICB7CisgICAgICAgICAgICB6bV9kZWJ1Z19tc2cwKCJXT1chISBzY2FuIGlzIGNhbmNlbGxlZFxuIik7CisgICAgICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICAgICAgZ290byByZXBvcnRfc2Nhbl9yZXN1bHQ7CisgICAgICAgIH0KKworCisgICAgICAgIGN1cnJTY2FuVHlwZSA9IHdkLT5zdGEuc2Nhbk1nci5jdXJyU2NhblR5cGU7CisgICAgICAgIHN3aXRjaChjdXJyU2NhblR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgWk1fU0NBTl9NR1JfU0NBTl9FWFRFUk5BTDoKKyAgICAgICAgICAgICAgICBpc0V4dGVybmFsU2NhbiA9IDE7CisKKyAgICAgICAgICAgICAgICBpZiAoIHdkLT5zdGEuc2Nhbk1nci5zY2FuUmVxc1taTV9TQ0FOX01HUl9TQ0FOX0lOVEVSTkFMIC0gMV0gKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5zY2FuTWdyLnNjYW5SZXFzW1pNX1NDQU5fTUdSX1NDQU5fSU5URVJOQUwgLSAxXSA9IDA7CisgICAgICAgICAgICAgICAgICAgIGlzSW50ZXJuYWxTY2FuID0gMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBaTV9TQ0FOX01HUl9TQ0FOX0lOVEVSTkFMOgorICAgICAgICAgICAgICAgIGlzSW50ZXJuYWxTY2FuID0gMTsKKworICAgICAgICAgICAgICAgIGlmICggd2QtPnN0YS5zY2FuTWdyLnNjYW5SZXFzW1pNX1NDQU5fTUdSX1NDQU5fRVhURVJOQUwgLSAxXSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBCZWNhdXNlIHRoZSBleHRlcm5hbCBzY2FuIHNob3VsZCBwcmUtZW1wdHMgaW50ZXJuYWwgc2Nhbi4KKyAgICAgICAgICAgICAgICAgICAgLy8gU28gdGhpcyBzaGFsbCBub3QgYmUgaGFwcGVuZWQhIQorICAgICAgICAgICAgICAgICAgICB6bV9hc3NlcnQoMCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgem1fYXNzZXJ0KDApOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgd2QtPnN0YS5zY2FuTWdyLnNjYW5SZXFzW2N1cnJTY2FuVHlwZSAtIDFdID0gMDsKKyAgICAgICAgd2QtPnN0YS5zY2FuTWdyLnNjYW5TdGFydERlbGF5ID0gMTAwOworICAgICAgICB3ZC0+c3RhLnNjYW5NZ3IuY3VyclNjYW5UeXBlID0gWk1fU0NBTl9NR1JfU0NBTl9OT05FOworICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgICAgIC8vU2V0IGNoYW5uZWwgYWNjb3JkaW5nIHRvIEFQJ3MgY29uZmlndXJhdGlvbgorICAgICAgICB6ZkNvcmVTZXRGcmVxdWVuY3lFeChkZXYsIHdkLT5mcmVxdWVuY3ksIHdkLT5CYW5kV2lkdGg0MCwKKyAgICAgICAgICAgICAgICB3ZC0+RXh0T2Zmc2V0LCB6ZlNjYW5NZ3JFdmVudFNjYW5Db21wbGV0ZUNiKTsKKworICAgICAgICB3ZC0+c3RhLmJDaGFubmVsU2NhbiA9IEZBTFNFOworCisgICAgICAgICNpZiAxCisgICAgICAgIGlmICh6ZlN0YUlzQ29ubmVjdGVkKGRldikpCisgICAgICAgIHsgLy8gRmluaXNoIHNpdGUgc3VydmV5LCByZXNldCB0aGUgdmFyaWFibGUgdG8gZGV0ZWN0IHVzaW5nIHdyb25nIGZyZXF1ZW5jeSAhCisgICAgICAgICAgICB6ZkhwRmluaXNoU2l0ZVN1cnZleShkZXYsIDEpOworICAgICAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgIHdkLT5zdGEuaWJzc1NpdGVTdXJ2ZXlTdGF0dXMgPSAyOworICAgICAgICAgICAgd2QtPnRpY2tJYnNzUmVjZWl2ZUJlYWNvbiA9IDA7CisgICAgICAgICAgICB3ZC0+c3RhLmlic3NSZWNlaXZlQmVhY29uQ291bnQgPSAwOworICAgICAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgICAgICAgICAgLyogIzUgUmUtZW5hYmxlIFJJRlMgZnVuY3Rpb24gYWZ0ZXIgdGhlIHNpdGUgc3VydmV5ICEgKi8KKyAgICAgICAgICAgIC8qIFRoaXMgaXMgYmVjYXVzZSBzd2l0Y2ggYmFuZCB3aWxsIHJlc2V0IHRoZSBCQiByZWdpc3RlciB0byBpbml0aWFsIHZhbHVlICovCisgICAgICAgICAgICBpZiggd2QtPnN0YS5yaWZzU3RhdGUgPT0gWk1fUklGU19TVEFURV9ERVRFQ1RFRCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgemZIcEVuYWJsZVJpZnMoZGV2LCAoKHdkLT5zdGEuY3VycmVudEZyZXF1ZW5jeTwzMDAwKT8xOjApLCB3ZC0+c3RhLkVuYWJsZUhULCB3ZC0+c3RhLkhUMjA0MCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB6ZkhwRmluaXNoU2l0ZVN1cnZleShkZXYsIDApOworICAgICAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgIHdkLT5zdGEuaWJzc1NpdGVTdXJ2ZXlTdGF0dXMgPSAwOworICAgICAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgfQorICAgICAgICAjZW5kaWYKKworcmVwb3J0X3NjYW5fcmVzdWx0OgorICAgICAgICAvKiBhdm9pZCBsb3NlIHJlY2VpdmUgcGFja2V0IHdoZW4gc2l0ZSBzdXJ2ZXkgKi8KKyAgICAgICAgLy9pZiAoKHpmU3RhSXNDb25uZWN0ZWQoZGV2KSkgJiYgKCF6ZlBvd2VyU2F2aW5nTWdySXNTbGVlcGluZyhkZXYpKSkKKyAgICAgICAgLy97CisgICAgICAgIC8vICAgIHpmU2VuZE51bGxEYXRhKGRldiwgMCk7CisgICAgICAgIC8vfQorCisgICAgICAgIGlmICggaXNFeHRlcm5hbFNjYW4gKS8vUXVpY2tseSByZWJvb3QKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHdkLT56ZmNiU2Nhbk5vdGlmeSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdkLT56ZmNiU2Nhbk5vdGlmeShkZXYsIE5VTEwpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKCBpc0ludGVybmFsU2NhbiApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vd2QtPnN0YS5JbnRlcm5hbFNjYW5SZXEgPSAwOworICAgICAgICAgICAgemZTdGFSZWNvbm5lY3QoZGV2KTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB3ZC0+c3RhLnNjYW5GcmVxdWVuY3kgPSBuZXh0U2NhbkZyZXF1ZW5jeTsKKworICAgICAgICAvL3ptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgIHpmVGltZXJDYW5jZWwoZGV2LCBaTV9FVkVOVF9JTl9TQ0FOKTsKKyAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgICAgICB6bV9kZWJ1Z19tc2cwKCJzY2FuIDIiKTsKKyAgICAgICAgemZDb3JlU2V0RnJlcXVlbmN5VjIoZGV2LCB3ZC0+c3RhLnNjYW5GcmVxdWVuY3ksIHpmU2Nhbk1nckV2ZW50U2V0RnJlcUNvbXBsZXRlQ2IpOworCisgICAgICAgIHJldHVybiAxOworICAgIH0KK30KKwordm9pZCB6ZlNjYW5NZ3JTY2FuRXZlbnRTdGFydCh6ZGV2X3QqIGRldikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgaWYgKCB3ZC0+c3RhLmJDaGFubmVsU2NhbiApCisgICAgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgemZQb3dlclNhdmluZ01ncldha2V1cChkZXYpOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIGlmICggd2QtPnN0YS5zY2FuTWdyLmN1cnJTY2FuVHlwZSA9PSBaTV9TQ0FOX01HUl9TQ0FOX05PTkUgKQorICAgIHsKKyAgICAgICAgZ290byBub19zY2FuOworICAgIH0KKworICAgIC8vemZCc3NJbmZvUmVmcmVzaChkZXYpOworICAgIHpmQnNzSW5mb1JlZnJlc2goZGV2LCAwKTsKKyAgICB3ZC0+c3RhLmJDaGFubmVsU2NhbiA9IFRSVUU7CisgICAgd2QtPnN0YS5iU2NoZWR1bGVTY2FuID0gRkFMU0U7CisgICAgemZUaW1lckNhbmNlbChkZXYsIFpNX0VWRU5UX0lOX1NDQU4pOworICAgIHpmVGltZXJDYW5jZWwoZGV2LCBaTV9FVkVOVF9USU1FT1VUX1NDQU4pOworCisgICAgLy96bV9kZWJ1Z19tc2cxKCJzdGFydCBzY2FuID0gIiwgS2VRdWVyeUludGVycnVwdFRpbWUoKSk7CisgICAgd2QtPnN0YS5zY2FuRnJlcXVlbmN5ID0gemZDaEdldEZpcnN0Q2hhbm5lbChkZXYsICZ3ZC0+c3RhLmJQYXNzaXZlU2Nhbik7CisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIC8qIGF2b2lkIGxvc2UgcmVjZWl2ZSBwYWNrZXQgd2hlbiBzaXRlIHN1cnZleSAqLworICAgIC8vaWYgKCh6ZlN0YUlzQ29ubmVjdGVkKGRldikpICYmICghemZQb3dlclNhdmluZ01ncklzU2xlZXBpbmcoZGV2KSkpCisgICAgLy97CisgICAgLy8gICAgemZTZW5kTnVsbERhdGEoZGV2LCAxKTsKKyAgICAvL30KKy8vICAgIHptX2RlYnVnX21zZzAoInNjYW4gMCIpOworLy8gICAgemZDb3JlU2V0RnJlcXVlbmN5VjIoZGV2LCB3ZC0+c3RhLnNjYW5GcmVxdWVuY3ksIHpmU2Nhbk1nckV2ZW50U2V0RnJlcUNvbXBsZXRlQ2IpOworCisgICAgI2lmIDEKKyAgICBpZiAoemZTdGFJc0Nvbm5lY3RlZChkZXYpKQorICAgIHsvLyBJZiBkb2luZyBzaXRlIHN1cnZleSAhCisgICAgICAgIHpmSHBCZWdpblNpdGVTdXJ2ZXkoZGV2LCAxKTsKKyAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgd2QtPnN0YS5pYnNzU2l0ZVN1cnZleVN0YXR1cyA9IDE7CisgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHpmSHBCZWdpblNpdGVTdXJ2ZXkoZGV2LCAwKTsKKyAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgd2QtPnN0YS5pYnNzU2l0ZVN1cnZleVN0YXR1cyA9IDA7CisgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgfQorICAgICNlbmRpZgorCisgICAgem1fZGVidWdfbXNnMCgic2NhbiAwIik7CisgICAgemZDb3JlU2V0RnJlcXVlbmN5VjIoZGV2LCB3ZC0+c3RhLnNjYW5GcmVxdWVuY3ksIHpmU2Nhbk1nckV2ZW50U2V0RnJlcUNvbXBsZXRlQ2IpOworCisgICAgcmV0dXJuOworCitub19zY2FuOgorICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgcmV0dXJuOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2N0a2lwLmMgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvY3RraXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTQyZjdhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2N0a2lwLmMKQEAgLTAsMCArMSw1OTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBBdGhlcm9zIENvbW11bmljYXRpb25zIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2R1bGUgTmFtZSA6IGN0a2lwLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEFic3RyYWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgVGhpcyBtb2R1bGUgY29udGFpbnMgVHggYW5kIFJ4IGZ1bmN0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE5PVEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlICJjcHJlY29tcC5oIgorCit1MTZfdCB6Z1RraXBTYm94TG93ZXJbMjU2XSA9CisgICAgeworICAgICAgICAweEE1LDB4ODQsMHg5OSwweDhELDB4MEQsMHhCRCwweEIxLDB4NTQsCisgICAgICAgIDB4NTAsMHgwMywweEE5LDB4N0QsMHgxOSwweDYyLDB4RTYsMHg5QSwKKyAgICAgICAgMHg0NSwweDlELDB4NDAsMHg4NywweDE1LDB4RUIsMHhDOSwweDBCLAorICAgICAgICAweEVDLDB4NjcsMHhGRCwweEVBLDB4QkYsMHhGNywweDk2LDB4NUIsCisgICAgICAgIDB4QzIsMHgxQywweEFFLDB4NkEsMHg1QSwweDQxLDB4MDIsMHg0RiwKKyAgICAgICAgMHg1QywweEY0LDB4MzQsMHgwOCwweDkzLDB4NzMsMHg1MywweDNGLAorICAgICAgICAweDBDLDB4NTIsMHg2NSwweDVFLDB4MjgsMHhBMSwweDBGLDB4QjUsCisgICAgICAgIDB4MDksMHgzNiwweDlCLDB4M0QsMHgyNiwweDY5LDB4Q0QsMHg5RiwKKyAgICAgICAgMHgxQiwweDlFLDB4NzQsMHgyRSwweDJELDB4QjIsMHhFRSwweEZCLAorICAgICAgICAweEY2LDB4NEQsMHg2MSwweENFLDB4N0IsMHgzRSwweDcxLDB4OTcsCisgICAgICAgIDB4RjUsMHg2OCwweDAwLDB4MkMsMHg2MCwweDFGLDB4QzgsMHhFRCwKKyAgICAgICAgMHhCRSwweDQ2LDB4RDksMHg0QiwweERFLDB4RDQsMHhFOCwweDRBLAorICAgICAgICAweDZCLDB4MkEsMHhFNSwweDE2LDB4QzUsMHhENywweDU1LDB4OTQsCisgICAgICAgIDB4Q0YsMHgxMCwweDA2LDB4ODEsMHhGMCwweDQ0LDB4QkEsMHhFMywKKyAgICAgICAgMHhGMywweEZFLDB4QzAsMHg4QSwweEFELDB4QkMsMHg0OCwweDA0LAorICAgICAgICAweERGLDB4QzEsMHg3NSwweDYzLDB4MzAsMHgxQSwweDBFLDB4NkQsCisgICAgICAgIDB4NEMsMHgxNCwweDM1LDB4MkYsMHhFMSwweEEyLDB4Q0MsMHgzOSwKKyAgICAgICAgMHg1NywweEYyLDB4ODIsMHg0NywweEFDLDB4RTcsMHgyQiwweDk1LAorICAgICAgICAweEEwLDB4OTgsMHhEMSwweDdGLDB4NjYsMHg3RSwweEFCLDB4ODMsCisgICAgICAgIDB4Q0EsMHgyOSwweEQzLDB4M0MsMHg3OSwweEUyLDB4MUQsMHg3NiwKKyAgICAgICAgMHgzQiwweDU2LDB4NEUsMHgxRSwweERCLDB4MEEsMHg2QywweEU0LAorICAgICAgICAweDVELDB4NkUsMHhFRiwweEE2LDB4QTgsMHhBNCwweDM3LDB4OEIsCisgICAgICAgIDB4MzIsMHg0MywweDU5LDB4QjcsMHg4QywweDY0LDB4RDIsMHhFMCwKKyAgICAgICAgMHhCNCwweEZBLDB4MDcsMHgyNSwweEFGLDB4OEUsMHhFOSwweDE4LAorICAgICAgICAweEQ1LDB4ODgsMHg2RiwweDcyLDB4MjQsMHhGMSwweEM3LDB4NTEsCisgICAgICAgIDB4MjMsMHg3QywweDlDLDB4MjEsMHhERCwweERDLDB4ODYsMHg4NSwKKyAgICAgICAgMHg5MCwweDQyLDB4QzQsMHhBQSwweEQ4LDB4MDUsMHgwMSwweDEyLAorICAgICAgICAweEEzLDB4NUYsMHhGOSwweEQwLDB4OTEsMHg1OCwweDI3LDB4QjksCisgICAgICAgIDB4MzgsMHgxMywweEIzLDB4MzMsMHhCQiwweDcwLDB4ODksMHhBNywKKyAgICAgICAgMHhCNiwweDIyLDB4OTIsMHgyMCwweDQ5LDB4RkYsMHg3OCwweDdBLAorICAgICAgICAweDhGLDB4RjgsMHg4MCwweDE3LDB4REEsMHgzMSwweEM2LDB4QjgsCisgICAgICAgIDB4QzMsMHhCMCwweDc3LDB4MTEsMHhDQiwweEZDLDB4RDYsMHgzQQorICAgIH07CisKKwordTE2X3QgemdUa2lwU2JveFVwcGVyWzI1Nl0gPQorICAgIHsKKyAgICAgICAgMHhDNiwweEY4LDB4RUUsMHhGNiwweEZGLDB4RDYsMHhERSwweDkxLAorICAgICAgICAweDYwLDB4MDIsMHhDRSwweDU2LDB4RTcsMHhCNSwweDRELDB4RUMsCisgICAgICAgIDB4OEYsMHgxRiwweDg5LDB4RkEsMHhFRiwweEIyLDB4OEUsMHhGQiwKKyAgICAgICAgMHg0MSwweEIzLDB4NUYsMHg0NSwweDIzLDB4NTMsMHhFNCwweDlCLAorICAgICAgICAweDc1LDB4RTEsMHgzRCwweDRDLDB4NkMsMHg3RSwweEY1LDB4ODMsCisgICAgICAgIDB4NjgsMHg1MSwweEQxLDB4RjksMHhFMiwweEFCLDB4NjIsMHgyQSwKKyAgICAgICAgMHgwOCwweDk1LDB4NDYsMHg5RCwweDMwLDB4MzcsMHgwQSwweDJGLAorICAgICAgICAweDBFLDB4MjQsMHgxQiwweERGLDB4Q0QsMHg0RSwweDdGLDB4RUEsCisgICAgICAgIDB4MTIsMHgxRCwweDU4LDB4MzQsMHgzNiwweERDLDB4QjQsMHg1QiwKKyAgICAgICAgMHhBNCwweDc2LDB4QjcsMHg3RCwweDUyLDB4REQsMHg1RSwweDEzLAorICAgICAgICAweEE2LDB4QjksMHgwMCwweEMxLDB4NDAsMHhFMywweDc5LDB4QjYsCisgICAgICAgIDB4RDQsMHg4RCwweDY3LDB4NzIsMHg5NCwweDk4LDB4QjAsMHg4NSwKKyAgICAgICAgMHhCQiwweEM1LDB4NEYsMHhFRCwweDg2LDB4OUEsMHg2NiwweDExLAorICAgICAgICAweDhBLDB4RTksMHgwNCwweEZFLDB4QTAsMHg3OCwweDI1LDB4NEIsCisgICAgICAgIDB4QTIsMHg1RCwweDgwLDB4MDUsMHgzRiwweDIxLDB4NzAsMHhGMSwKKyAgICAgICAgMHg2MywweDc3LDB4QUYsMHg0MiwweDIwLDB4RTUsMHhGRCwweEJGLAorICAgICAgICAweDgxLDB4MTgsMHgyNiwweEMzLDB4QkUsMHgzNSwweDg4LDB4MkUsCisgICAgICAgIDB4OTMsMHg1NSwweEZDLDB4N0EsMHhDOCwweEJBLDB4MzIsMHhFNiwKKyAgICAgICAgMHhDMCwweDE5LDB4OUUsMHhBMywweDQ0LDB4NTQsMHgzQiwweDBCLAorICAgICAgICAweDhDLDB4QzcsMHg2QiwweDI4LDB4QTcsMHhCQywweDE2LDB4QUQsCisgICAgICAgIDB4REIsMHg2NCwweDc0LDB4MTQsMHg5MiwweDBDLDB4NDgsMHhCOCwKKyAgICAgICAgMHg5RiwweEJELDB4NDMsMHhDNCwweDM5LDB4MzEsMHhEMywweEYyLAorICAgICAgICAweEQ1LDB4OEIsMHg2RSwweERBLDB4MDEsMHhCMSwweDlDLDB4NDksCisgICAgICAgIDB4RDgsMHhBQywweEYzLDB4Q0YsMHhDQSwweEY0LDB4NDcsMHgxMCwKKyAgICAgICAgMHg2RiwweEYwLDB4NEEsMHg1QywweDM4LDB4NTcsMHg3MywweDk3LAorICAgICAgICAweENCLDB4QTEsMHhFOCwweDNFLDB4OTYsMHg2MSwweDBELDB4MEYsCisgICAgICAgIDB4RTAsMHg3QywweDcxLDB4Q0MsMHg5MCwweDA2LDB4RjcsMHgxQywKKyAgICAgICAgMHhDMiwweDZBLDB4QUUsMHg2OSwweDE3LDB4OTksMHgzQSwweDI3LAorICAgICAgICAweEQ5LDB4RUIsMHgyQiwweDIyLDB4RDIsMHhBOSwweDA3LDB4MzMsCisgICAgICAgIDB4MkQsMHgzQywweDE1LDB4QzksMHg4NywweEFBLDB4NTAsMHhBNSwKKyAgICAgICAgMHgwMywweDU5LDB4MDksMHgxQSwweDY1LDB4RDcsMHg4NCwweEQwLAorICAgICAgICAweDgyLDB4MjksMHg1QSwweDFFLDB4N0IsMHhBOCwweDZELDB4MkMKKyAgICB9OworCit1MTZfdCB6ZnJvdHIxKHUxNl90IGEpCisvLyByb3RhdGUgcmlnaHQgYnkgMSBiaXQuCit7CisgICAgdTE2X3QgYjsKKworICAgIGlmIChhICYgMHgwMSkKKyAgICB7CisgICAgICAgIGIgPSAoYSA+PiAxKSB8IDB4ODAwMDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYiA9IChhID4+IDEpICYgMHg3ZmZmOworICAgIH0KKyAgICByZXR1cm4gYjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiB6ZlRraXBTYm94KCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJldHVybnMgYSAxNiBiaXQgdmFsdWUgZnJvbSBhIDY0SyBlbnRyeSB0YWJsZS4gVGhlIFRhYmxlICAqLworLyogaXMgc3ludGhlc2l6ZWQgZnJvbSB0d28gMjU2IGVudHJ5IGJ5dGUgd2lkZSB0YWJsZXMuICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UxNl90IHpmVGtpcFNib3godTE2X3QgaW5kZXgpCit7CisgICAgdTE2X3QgICBsb3c7CisgICAgdTE2X3QgICBoaWdoOworICAgIHUxNl90ICAgbGVmdCwgcmlnaHQ7CisKKyAgICBsb3cgPSAoaW5kZXggJiAweEZGKTsKKyAgICBoaWdoID0gKChpbmRleCA+PiA4KSAmIDB4RkYpOworCisgICAgbGVmdCA9IHpnVGtpcFNib3hMb3dlcltsb3ddICsgKHpnVGtpcFNib3hVcHBlcltsb3ddIDw8IDggKTsKKyAgICByaWdodCA9IHpnVGtpcFNib3hVcHBlcltoaWdoXSArICh6Z1RraXBTYm94TG93ZXJbaGlnaF0gPDwgOCApOworCisgICAgcmV0dXJuIChsZWZ0IF4gcmlnaHQpOworfQorCit1OF90IHpmVGtpcFBoYXNlMUtleU1peCh1MzJfdCBpdjMyLCBzdHJ1Y3QgenNUa2lwU2VlZCogcFNlZWQpCit7CisgICAgdTE2X3QgICB0c2MwOworICAgIHUxNl90ICAgdHNjMTsKKyAgICB1MTZfdCAgIGksIGo7CisjaWYgMAorICAgIC8qIE5lZWQgbm90IHByb2NlZWQgdGhpcyBmdW5jdGlvbiB3aXRoIHRoZSBzYW1lIGl2MzIgKi8KKyAgICBpZiAoIGl2MzIgPT0gcFNlZWQtPml2MzIgKQorICAgIHsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorI2VuZGlmCisgICAgdHNjMCA9ICh1MTZfdCkgKChpdjMyID4+IDE2KSAmIDB4ZmZmZik7IC8qIG1zYiAqLworICAgIHRzYzEgPSAodTE2X3QpIChpdjMyICYgMHhmZmZmKTsKKworICAgIC8qIFBoYXNlIDEsIHN0ZXAgMSAqLworICAgIHBTZWVkLT50dGFrWzBdID0gdHNjMTsKKyAgICBwU2VlZC0+dHRha1sxXSA9IHRzYzA7CisgICAgcFNlZWQtPnR0YWtbMl0gPSAodTE2X3QpIChwU2VlZC0+dGFbMF0gKyAocFNlZWQtPnRhWzFdIDw8OCkpOworICAgIHBTZWVkLT50dGFrWzNdID0gKHUxNl90KSAocFNlZWQtPnRhWzJdICsgKHBTZWVkLT50YVszXSA8PDgpKTsKKyAgICBwU2VlZC0+dHRha1s0XSA9ICh1MTZfdCkgKHBTZWVkLT50YVs0XSArIChwU2VlZC0+dGFbNV0gPDw4KSk7CisKKyAgICAvKiBQaGFzZSAxLCBzdGVwIDIgKi8KKyAgICBmb3IgKGk9MDsgaTw4OyBpKyspCisgICAgeworICAgICAgICBqID0gMiooaSAmIDEpOworICAgICAgICBwU2VlZC0+dHRha1swXSA9KHBTZWVkLT50dGFrWzBdICsgemZUa2lwU2JveChwU2VlZC0+dHRha1s0XQorICAgICAgICAgICAgICAgICAgICAgICAgIF4gWk1fQllURV9UT19XT1JEKHBTZWVkLT50a1sxK2pdLCBwU2VlZC0+dGtbal0pKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICYgMHhmZmZmOworICAgICAgICBwU2VlZC0+dHRha1sxXSA9KHBTZWVkLT50dGFrWzFdICsgemZUa2lwU2JveChwU2VlZC0+dHRha1swXQorICAgICAgICAgICAgICAgICAgICAgICAgIF4gWk1fQllURV9UT19XT1JEKHBTZWVkLT50a1s1K2pdLCBwU2VlZC0+dGtbNCtqXSApKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICYgMHhmZmZmOworICAgICAgICBwU2VlZC0+dHRha1syXSA9KHBTZWVkLT50dGFrWzJdICsgemZUa2lwU2JveChwU2VlZC0+dHRha1sxXQorICAgICAgICAgICAgICAgICAgICAgICAgIF4gWk1fQllURV9UT19XT1JEKHBTZWVkLT50a1s5K2pdLCBwU2VlZC0+dGtbOCtqXSApKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICYgMHhmZmZmOworICAgICAgICBwU2VlZC0+dHRha1szXSA9KHBTZWVkLT50dGFrWzNdICsgemZUa2lwU2JveChwU2VlZC0+dHRha1syXQorICAgICAgICAgICAgICAgICAgICAgICAgIF4gWk1fQllURV9UT19XT1JEKHBTZWVkLT50a1sxMytqXSwgcFNlZWQtPnRrWzEyK2pdKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAmIDB4ZmZmZjsKKyAgICAgICAgcFNlZWQtPnR0YWtbNF0gPShwU2VlZC0+dHRha1s0XSArIHpmVGtpcFNib3gocFNlZWQtPnR0YWtbM10KKyAgICAgICAgICAgICAgICAgICAgICAgICBeIFpNX0JZVEVfVE9fV09SRChwU2VlZC0+dGtbMStqXSwgcFNlZWQtPnRrW2pdICApKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICYgMHhmZmZmOworICAgICAgICBwU2VlZC0+dHRha1s0XSA9KHBTZWVkLT50dGFrWzRdICsgaSkgJiAweGZmZmY7CisgICAgfQorCisgICAgaWYgKCBpdjMyID09IChwU2VlZC0+aXYzMisxKSApCisgICAgeworICAgICAgICBwU2VlZC0+aXYzMnRtcCA9IGl2MzI7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCit1OF90IHpmVGtpcFBoYXNlMktleU1peCh1MTZfdCBpdjE2LCBzdHJ1Y3QgenNUa2lwU2VlZCogcFNlZWQpCit7CisgICAgdTE2X3QgdHNjMjsKKworICAgIHRzYzIgPSBpdjE2OworCisgICAgLyogUGhhc2UgMiwgU3RlcCAxICovCisgICAgcFNlZWQtPnBwa1swXSA9IHBTZWVkLT50dGFrWzBdOworICAgIHBTZWVkLT5wcGtbMV0gPSBwU2VlZC0+dHRha1sxXTsKKyAgICBwU2VlZC0+cHBrWzJdID0gcFNlZWQtPnR0YWtbMl07CisgICAgcFNlZWQtPnBwa1szXSA9IHBTZWVkLT50dGFrWzNdOworICAgIHBTZWVkLT5wcGtbNF0gPSBwU2VlZC0+dHRha1s0XTsKKyAgICBwU2VlZC0+cHBrWzVdID0gKHBTZWVkLT50dGFrWzRdICsgdHNjMikgJiAweGZmZmY7CisKKyAgICAvKiBQaGFzZTIsIFN0ZXAgMiAqLworICAgIHBTZWVkLT5wcGtbMF0gPSBwU2VlZC0+cHBrWzBdCisgICAgICAgICAgICAgICAgKyB6ZlRraXBTYm94KHBTZWVkLT5wcGtbNV0gXiBaTV9CWVRFX1RPX1dPUkQocFNlZWQtPnRrWzFdLHBTZWVkLT50a1swXSkpOworICAgIHBTZWVkLT5wcGtbMV0gPSBwU2VlZC0+cHBrWzFdCisgICAgICAgICAgICAgICAgKyB6ZlRraXBTYm94KHBTZWVkLT5wcGtbMF0gXiBaTV9CWVRFX1RPX1dPUkQocFNlZWQtPnRrWzNdLHBTZWVkLT50a1syXSkpOworICAgIHBTZWVkLT5wcGtbMl0gPSBwU2VlZC0+cHBrWzJdCisgICAgICAgICAgICAgICAgKyB6ZlRraXBTYm94KHBTZWVkLT5wcGtbMV0gXiBaTV9CWVRFX1RPX1dPUkQocFNlZWQtPnRrWzVdLHBTZWVkLT50a1s0XSkpOworICAgIHBTZWVkLT5wcGtbM10gPSBwU2VlZC0+cHBrWzNdCisgICAgICAgICAgICAgICAgKyB6ZlRraXBTYm94KHBTZWVkLT5wcGtbMl0gXiBaTV9CWVRFX1RPX1dPUkQocFNlZWQtPnRrWzddLHBTZWVkLT50a1s2XSkpOworICAgIHBTZWVkLT5wcGtbNF0gPSBwU2VlZC0+cHBrWzRdCisgICAgICAgICAgICAgICAgKyB6ZlRraXBTYm94KHBTZWVkLT5wcGtbM10gXiBaTV9CWVRFX1RPX1dPUkQocFNlZWQtPnRrWzldLHBTZWVkLT50a1s4XSkpOworICAgIHBTZWVkLT5wcGtbNV0gPSBwU2VlZC0+cHBrWzVdCisgICAgICAgICAgICAgICAgKyB6ZlRraXBTYm94KHBTZWVkLT5wcGtbNF0gXiBaTV9CWVRFX1RPX1dPUkQocFNlZWQtPnRrWzExXSxwU2VlZC0+dGtbMTBdKSk7CisKKyAgICBwU2VlZC0+cHBrWzBdID0gcFNlZWQtPnBwa1swXQorICAgICAgICAgICAgICAgICsgemZyb3RyMShwU2VlZC0+cHBrWzVdIF4gWk1fQllURV9UT19XT1JEKHBTZWVkLT50a1sxM10scFNlZWQtPnRrWzEyXSkpOworICAgIHBTZWVkLT5wcGtbMV0gPSBwU2VlZC0+cHBrWzFdCisgICAgICAgICAgICAgICAgKyB6ZnJvdHIxKHBTZWVkLT5wcGtbMF0gXiBaTV9CWVRFX1RPX1dPUkQocFNlZWQtPnRrWzE1XSxwU2VlZC0+dGtbMTRdKSk7CisgICAgcFNlZWQtPnBwa1syXSA9IHBTZWVkLT5wcGtbMl0gKyB6ZnJvdHIxKHBTZWVkLT5wcGtbMV0pOworICAgIHBTZWVkLT5wcGtbM10gPSBwU2VlZC0+cHBrWzNdICsgemZyb3RyMShwU2VlZC0+cHBrWzJdKTsKKyAgICBwU2VlZC0+cHBrWzRdID0gcFNlZWQtPnBwa1s0XSArIHpmcm90cjEocFNlZWQtPnBwa1szXSk7CisgICAgcFNlZWQtPnBwa1s1XSA9IHBTZWVkLT5wcGtbNV0gKyB6ZnJvdHIxKHBTZWVkLT5wcGtbNF0pOworCisgICAgaWYgKGl2MTYgPT0gMCkKKyAgICB7CisgICAgICAgIGlmIChwU2VlZC0+aXYxNiA9PSAweGZmZmYpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBTZWVkLT5pdjE2dG1wPTA7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgZWxzZSBpZiAoaXYxNiA9PSAocFNlZWQtPml2MTYrMSkpCisgICAgeworICAgICAgICBwU2VlZC0+aXYxNnRtcCA9IGl2MTY7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHJldHVybiAwOworfQorCit2b2lkIHpmVGtpcEluaXQodThfdCoga2V5LCB1OF90KiB0YSwgc3RydWN0IHpzVGtpcFNlZWQqIHBTZWVkLCB1OF90KiBpbml0SXYpCit7CisgICAgdTE2X3QgIGl2MTY7CisgICAgdTMyX3QgIGl2MzI7CisgICAgdTE2X3QgIGk7CisKKyAgICAvKiBjbGVhciBtZW1vcnkgKi8KKyAgICB6Zlplcm9NZW1vcnkoKHU4X3QqKSBwU2VlZCwgc2l6ZW9mKHN0cnVjdCB6c1RraXBTZWVkKSk7CisgICAgLyogc2V0IGtleSB0byBzZWVkICovCisgICAgemZNZW1vcnlDb3B5KHBTZWVkLT50YSwgdGEsIDYpOworICAgIHpmTWVtb3J5Q29weShwU2VlZC0+dGssIGtleSwgMTYpOworCisgICAgaXYxNiA9ICppbml0SXYrKzsKKyAgICBpdjE2ICs9ICppbml0SXY8PDg7CisgICAgaW5pdEl2Kys7CisKKyAgICBpdjMyPTA7CisKKyAgICBmb3IoaT0wOyBpPDQ7IGkrKykgICAgICAvLyBpbml0aXYgaXMgbGl0dGxlIGVuZGlhbgorICAgIHsKKyAgICAgICAgaXYzMiArPSAqaW5pdEl2PDwoaSo4KTsKKyAgICAgICAgKmluaXRJdisrOworICAgIH0KKworICAgIHBTZWVkLT5pdjMyID0gaXYzMisxOyAvLyBGb3JjZSBSZWNhbGN1bGF0aW5nIG9uIFRraXAgUGhhc2UxCisgICAgemZUa2lwUGhhc2UxS2V5TWl4KGl2MzIsIHBTZWVkKTsKKworICAgIHBTZWVkLT5pdjE2ID0gaXYxNjsKKyAgICBwU2VlZC0+aXYzMiA9IGl2MzI7Cit9CisKK3UzMl90IHpmR2V0VTMydCh1OF90KiBwKQoreworICAgIHUzMl90IHJlcz0wOworICAgIHUxNl90IGk7CisKKyAgICBmb3IoIGk9MDsgaTw0OyBpKysgKQorICAgIHsKKyAgICAgICAgcmVzIHw9ICgqcCsrKSA8PCAoOCppKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzOworCit9CisKK3ZvaWQgemZQdXRVMzJ0KHU4X3QqIHAsIHUzMl90IHZhbHVlKQoreworICAgIHUxNl90IGk7CisKKyAgICBmb3IoaT0wOyBpPDQ7IGkrKykKKyAgICB7CisgICAgICAgICpwKysgPSAodThfdCkgKHZhbHVlICYgMHhmZik7CisgICAgICAgIHZhbHVlID4+PSA4OworICAgIH0KK30KKwordm9pZCB6Zk1pY0NsZWFyKHN0cnVjdCB6c01pY1ZhciogcE1pYykKK3sKKyAgICBwTWljLT5sZWZ0ID0gcE1pYy0+azA7CisgICAgcE1pYy0+cmlnaHQgPSBwTWljLT5rMTsKKyAgICBwTWljLT5uQnl0ZXMgPSAwOworICAgIHBNaWMtPm0gPSAwOworfQorCit2b2lkIHpmTWljU2V0S2V5KHU4X3QqIGtleSwgc3RydWN0IHpzTWljVmFyKiBwTWljKQoreworICAgIHBNaWMtPmswID0gemZHZXRVMzJ0KGtleSk7CisgICAgcE1pYy0+azEgPSB6ZkdldFUzMnQoa2V5KzQpOworICAgIHpmTWljQ2xlYXIocE1pYyk7Cit9CisKK3ZvaWQgemZNaWNBcHBlbmRCeXRlKHU4X3QgYiwgc3RydWN0IHpzTWljVmFyKiBwTWljKQoreworICAgIC8vIEFwcGVuZCB0aGUgYnl0ZSB0byBvdXIgd29yZC1zaXplZCBidWZmZXIKKyAgICBwTWljLT5tIHw9IGIgPDwgKDgqIHBNaWMtPm5CeXRlcyk7CisgICAgcE1pYy0+bkJ5dGVzKys7CisKKyAgICAvLyBQcm9jZXNzIHRoZSB3b3JkIGlmIGl0IGlzIGZ1bGwuCisgICAgaWYgKCBwTWljLT5uQnl0ZXMgPj0gNCApCisgICAgeworICAgICAgICBwTWljLT5sZWZ0IF49IHBNaWMtPm07CisgICAgICAgIHBNaWMtPnJpZ2h0IF49IFpNX1JPTDMyKHBNaWMtPmxlZnQsIDE3ICk7CisgICAgICAgIHBNaWMtPmxlZnQgKz0gcE1pYy0+cmlnaHQ7CisgICAgICAgIHBNaWMtPnJpZ2h0IF49ICgocE1pYy0+bGVmdCAmIDB4ZmYwMGZmMDApID4+IDgpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgKChwTWljLT5sZWZ0ICYgMHgwMGZmMDBmZikgPDwgOCk7CisgICAgICAgIHBNaWMtPmxlZnQgKz0gcE1pYy0+cmlnaHQ7CisgICAgICAgIHBNaWMtPnJpZ2h0IF49IFpNX1JPTDMyKCBwTWljLT5sZWZ0LCAzICk7CisgICAgICAgIHBNaWMtPmxlZnQgKz0gcE1pYy0+cmlnaHQ7CisgICAgICAgIHBNaWMtPnJpZ2h0IF49IFpNX1JPUjMyKCBwTWljLT5sZWZ0LCAyICk7CisgICAgICAgIHBNaWMtPmxlZnQgKz0gcE1pYy0+cmlnaHQ7CisgICAgICAgIC8vIENsZWFyIHRoZSBidWZmZXIKKyAgICAgICAgcE1pYy0+bSA9IDA7CisgICAgICAgIHBNaWMtPm5CeXRlcyA9IDA7CisgICAgfQorfQorCit2b2lkIHpmTWljR2V0TWljKHU4X3QqIGRzdCwgc3RydWN0IHpzTWljVmFyKiBwTWljKQoreworICAgIC8vIEFwcGVuZCB0aGUgbWluaW11bSBwYWRkaW5nCisgICAgemZNaWNBcHBlbmRCeXRlKDB4NWEsIHBNaWMpOworICAgIHpmTWljQXBwZW5kQnl0ZSgwLCBwTWljKTsKKyAgICB6Zk1pY0FwcGVuZEJ5dGUoMCwgcE1pYyk7CisgICAgemZNaWNBcHBlbmRCeXRlKDAsIHBNaWMpOworICAgIHpmTWljQXBwZW5kQnl0ZSgwLCBwTWljKTsKKworICAgIC8vIGFuZCB0aGVuIHplcm9lcyB1bnRpbCB0aGUgbGVuZ3RoIGlzIGEgbXVsdGlwbGUgb2YgNAorICAgIHdoaWxlKCBwTWljLT5uQnl0ZXMgIT0gMCApCisgICAgeworICAgICAgICB6Zk1pY0FwcGVuZEJ5dGUoMCwgcE1pYyk7CisgICAgfQorCisgICAgLy8gVGhlIGFwcGVuZEJ5dGUgZnVuY3Rpb24gaGFzIGFscmVhZHkgY29tcHV0ZWQgdGhlIHJlc3VsdC4KKyAgICB6ZlB1dFUzMnQoZHN0LCBwTWljLT5sZWZ0KTsKKyAgICB6ZlB1dFUzMnQoZHN0KzQsIHBNaWMtPnJpZ2h0KTsKKworICAgIC8vIFJlc2V0IHRvIHRoZSBlbXB0eSBtZXNzYWdlLgorICAgIHpmTWljQ2xlYXIocE1pYyk7CisKK30KKwordThfdCB6Zk1pY1J4VmVyaWZ5KHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZikKK3sKKyAgICBzdHJ1Y3QgenNNaWNWYXIqICBwTWljS2V5OworICAgIHN0cnVjdCB6c01pY1ZhciAgICBNeU1pY0tleTsKKyAgICB1OF90ICAgbWljWzhdOworICAgIHU4X3QgICBkYVs2XTsKKyAgICB1OF90ICAgc2FbNl07CisgICAgdThfdCAgIGJWYWx1ZTsKKyAgICB1MTZfdCAgaSwgcGF5bG9hZE9mZnNldCwgdGFpbE9mZnNldDsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIC8qIG5lZWQgbm90IGNoZWNrIE1JQyBpZiBwTWljS0V5IGlzIGVxdWFsIHRvIE5VTEwgKi8KKyAgICBpZiAoIHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0FQICkKKyAgICB7CisgICAgICAgIHBNaWNLZXkgPSB6ZkFwR2V0UnhNaWNLZXkoZGV2LCBidWYpOworCisgICAgICAgIGlmICggcE1pY0tleSAhPSBOVUxMICkKKyAgICAgICAgeworICAgICAgICAgICAgemZDb3B5RnJvbVJ4QnVmZmVyKGRldiwgYnVmLCBzYSwgWk1fV0xBTl9IRUFERVJfQTJfT0ZGU0VULCA2KTsKKyAgICAgICAgICAgIHpmQ29weUZyb21SeEJ1ZmZlcihkZXYsIGJ1ZiwgZGEsIFpNX1dMQU5fSEVBREVSX0EzX09GRlNFVCwgNik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gWk1fTUlDX1NVQ0NFU1M7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoIHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0lORlJBU1RSVUNUVVJFICkKKyAgICB7CisgICAgICAgIHBNaWNLZXkgPSB6ZlN0YUdldFJ4TWljS2V5KGRldiwgYnVmKTsKKworICAgICAgICBpZiAoIHBNaWNLZXkgIT0gTlVMTCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHpmQ29weUZyb21SeEJ1ZmZlcihkZXYsIGJ1Ziwgc2EsIFpNX1dMQU5fSEVBREVSX0EzX09GRlNFVCwgNik7CisgICAgICAgICAgICB6ZkNvcHlGcm9tUnhCdWZmZXIoZGV2LCBidWYsIGRhLCBaTV9XTEFOX0hFQURFUl9BMV9PRkZTRVQsIDYpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFpNX01JQ19TVUNDRVNTOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJldHVybiBaTV9NSUNfU1VDQ0VTUzsKKyAgICB9CisKKyAgICBNeU1pY0tleS5rMD1wTWljS2V5LT5rMDsKKyAgICBNeU1pY0tleS5rMT1wTWljS2V5LT5rMTsKKyAgICBwTWljS2V5ID0gJk15TWljS2V5OworCisgICAgemZNaWNDbGVhcihwTWljS2V5KTsKKyAgICB0YWlsT2Zmc2V0ID0gemZ3QnVmR2V0U2l6ZShkZXYsIGJ1Zik7CisgICAgdGFpbE9mZnNldCAtPSA4OworCisgICAgLyogYXBwZW5kIERBICovCisgICAgZm9yKGk9MDsgaTw2OyBpKyspCisgICAgeworICAgICAgICB6Zk1pY0FwcGVuZEJ5dGUoZGFbaV0sIHBNaWNLZXkpOworICAgIH0KKyAgICAvKiBhcHBlbmQgU0EgKi8KKyAgICBmb3IoaT0wOyBpPDY7IGkrKykKKyAgICB7CisgICAgICAgIHpmTWljQXBwZW5kQnl0ZShzYVtpXSwgcE1pY0tleSk7CisgICAgfQorCisgICAgLyogYXBwZW5kIGZvciBhbGlnbm1lbnQgKi8KKyAgICBpZiAoKHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIDApICYgMHg4MCkgIT0gMCkKKyAgICAgICAgemZNaWNBcHBlbmRCeXRlKHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsMjQpJjB4NywgcE1pY0tleSk7CisgICAgZWxzZQorICAgICAgICB6Zk1pY0FwcGVuZEJ5dGUoMCwgcE1pY0tleSk7CisgICAgemZNaWNBcHBlbmRCeXRlKDAsIHBNaWNLZXkpOworICAgIHpmTWljQXBwZW5kQnl0ZSgwLCBwTWljS2V5KTsKKyAgICB6Zk1pY0FwcGVuZEJ5dGUoMCwgcE1pY0tleSk7CisKKyAgICAvKiBhcHBlbmQgcGF5bG9hZCAqLworICAgIHBheWxvYWRPZmZzZXQgPSBaTV9TSVpFX09GX1dMQU5fREFUQV9IRUFERVIgKworICAgICAgICAgICAgICAgICAgICBaTV9TSVpFX09GX0lWICsKKyAgICAgICAgICAgICAgICAgICAgWk1fU0laRV9PRl9FWFRfSVY7CisKKyAgICBpZiAoKHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIDApICYgMHg4MCkgIT0gMCkKKyAgICB7CisgICAgICAgIC8qIFFvcyBQYWNrZXQsIFBsY3BoZWFkZXIgKyAyICovCisgICAgICAgIGlmICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9BUCkKKyAgICAgICAgeworICAgICAgICAgICAgLyogVE9ETyA6IFJ4IFFvcyBlbGVtZW50IG9mZnNldCBpbiBzb2Z0d2FyZSBNSUMgY2hlY2sgKi8KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9JTkZSQVNUUlVDVFVSRSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHdkLT5zdGEud21lQ29ubmVjdGVkICE9IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcGF5bG9hZE9mZnNldCArPSAyOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgZm9yKGk9cGF5bG9hZE9mZnNldDsgaTx0YWlsT2Zmc2V0OyBpKyspCisgICAgeworICAgICAgICBiVmFsdWUgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBpKTsKKyAgICAgICAgemZNaWNBcHBlbmRCeXRlKGJWYWx1ZSwgcE1pY0tleSk7CisgICAgfQorCisgICAgemZNaWNHZXRNaWMobWljLCBwTWljS2V5KTsKKworICAgIGlmICggIXpmUnhCdWZmZXJFcXVhbFRvU3RyKGRldiwgYnVmLCBtaWMsIHRhaWxPZmZzZXQsIDgpICkKKyAgICB7CisgICAgICAgIHJldHVybiBaTV9NSUNfRkFJTFVSRTsKKyAgICB9CisKKyAgICByZXR1cm4gWk1fTUlDX1NVQ0NFU1M7Cit9CisKK3ZvaWQgemZUa2lwR2V0c2VlZHModTE2X3QgaXYxNiwgdThfdCAqUkM0S2V5LCBzdHJ1Y3QgenNUa2lwU2VlZCAqU2VlZCkKK3sKKyAgICBSQzRLZXlbMF0gID0gWk1fSEk4KGl2MTYpOworICAgIFJDNEtleVsxXSAgPSAoWk1fSEk4KGl2MTYpIHwgMHgyMCkgJiAweDdmOworICAgIFJDNEtleVsyXSAgPSBaTV9MTzgoaXYxNik7CisgICAgUkM0S2V5WzNdICA9ICgoU2VlZC0+cHBrWzVdIF4gWk1fQllURV9UT19XT1JEKFNlZWQtPnRrWzFdLFNlZWQtPnRrWzBdKSk+PjEpICYgMHhmZjsKKyAgICBSQzRLZXlbNF0gID0gU2VlZC0+cHBrWzBdICYgMHhmZjsKKyAgICBSQzRLZXlbNV0gID0gU2VlZC0+cHBrWzBdID4+IDg7CisgICAgUkM0S2V5WzZdICA9IFNlZWQtPnBwa1sxXSAmIDB4ZmY7CisgICAgUkM0S2V5WzddICA9IFNlZWQtPnBwa1sxXSA+PiA4OworICAgIFJDNEtleVs4XSAgPSBTZWVkLT5wcGtbMl0gJiAweGZmOworICAgIFJDNEtleVs5XSAgPSBTZWVkLT5wcGtbMl0gPj4gODsKKyAgICBSQzRLZXlbMTBdID0gU2VlZC0+cHBrWzNdICYgMHhmZjsKKyAgICBSQzRLZXlbMTFdID0gU2VlZC0+cHBrWzNdID4+IDg7CisgICAgUkM0S2V5WzEyXSA9IFNlZWQtPnBwa1s0XSAmIDB4ZmY7CisgICAgUkM0S2V5WzEzXSA9IFNlZWQtPnBwa1s0XSA+PiA4OworICAgIFJDNEtleVsxNF0gPSBTZWVkLT5wcGtbNV0gJiAweGZmOworICAgIFJDNEtleVsxNV0gPSBTZWVkLT5wcGtbNV0gPj4gODsKK30KKwordm9pZCB6ZkNhbFR4TWljKHpkZXZfdCAqZGV2LCB6YnVmX3QgKmJ1ZiwgdThfdCAqc25hcCwgdTE2X3Qgc25hcExlbiwgdTE2X3Qgb2Zmc2V0LCB1MTZfdCAqZGEsIHUxNl90ICpzYSwgdThfdCB1cCwgdThfdCAqbWljKQoreworICAgIHN0cnVjdCB6c01pY1ZhciogIHBNaWNLZXk7CisgICAgdTE2X3QgIGk7CisgICAgdTE2X3QgbGVuOworICAgIHU4X3QgYlZhbHVlOworICAgIHU4X3QgcW9zVHlwZTsKKyAgICB1OF90ICpwRGEgPSAodThfdCAqKWRhOworICAgIHU4X3QgKnBTYSA9ICh1OF90ICopc2E7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICAvKiBuZWVkIG5vdCBjaGVjayBNSUMgaWYgcE1pY0tFeSBpcyBlcXVhbCB0byBOVUxMICovCisgICAgaWYgKCB3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9BUCApCisgICAgeworICAgICAgICBwTWljS2V5ID0gemZBcEdldFR4TWljS2V5KGRldiwgYnVmLCAmcW9zVHlwZSk7CisKKyAgICAgICAgaWYgKCBwTWljS2V5ID09IE5VTEwgKQorICAgICAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBlbHNlIGlmICggd2QtPndsYW5Nb2RlID09IFpNX01PREVfSU5GUkFTVFJVQ1RVUkUgKQorICAgIHsKKyAgICAgICAgcE1pY0tleSA9IHpmU3RhR2V0VHhNaWNLZXkoZGV2LCBidWYpOworCisgICAgICAgIGlmICggcE1pY0tleSA9PSBOVUxMICkKKyAgICAgICAgeworICAgICAgICAgICAgem1fZGVidWdfbXNnMCgicE1pY0tleSBpcyBOVUxMIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHpmTWljQ2xlYXIocE1pY0tleSk7CisgICAgbGVuID0gemZ3QnVmR2V0U2l6ZShkZXYsIGJ1Zik7CisKKyAgICAvKiBhcHBlbmQgREEgKi8KKyAgICBmb3IoaSA9IDA7IGkgPCA2OyBpKyspCisgICAgeworICAgICAgICB6Zk1pY0FwcGVuZEJ5dGUocERhW2ldLCBwTWljS2V5KTsKKyAgICB9CisKKyAgICAvKiBhcHBlbmQgU0EgKi8KKyAgICBmb3IoaSA9IDA7IGkgPCA2OyBpKyspCisgICAgeworICAgICAgICB6Zk1pY0FwcGVuZEJ5dGUocFNhW2ldLCBwTWljS2V5KTsKKyAgICB9CisKKyAgICBpZiAodXAgIT0gMCkKKyAgICAgICAgemZNaWNBcHBlbmRCeXRlKCh1cCYweDcpLCBwTWljS2V5KTsKKyAgICBlbHNlCisgICAgICAgIHpmTWljQXBwZW5kQnl0ZSgwLCBwTWljS2V5KTsKKworICAgIHpmTWljQXBwZW5kQnl0ZSgwLCBwTWljS2V5KTsKKyAgICB6Zk1pY0FwcGVuZEJ5dGUoMCwgcE1pY0tleSk7CisgICAgemZNaWNBcHBlbmRCeXRlKDAsIHBNaWNLZXkpOworCisgICAgLyogRm9yIFNuYXAgaGVhZGVyICovCisgICAgZm9yKGkgPSAwOyBpIDwgc25hcExlbjsgaSsrKQorICAgIHsKKyAgICAgICAgemZNaWNBcHBlbmRCeXRlKHNuYXBbaV0sIHBNaWNLZXkpOworICAgIH0KKworICAgIGZvcihpID0gb2Zmc2V0OyBpIDwgbGVuOyBpKyspCisgICAgeworICAgICAgICBiVmFsdWUgPSB6bXdfdHhfYnVmX3JlYWRiKGRldiwgYnVmLCBpKTsKKyAgICAgICAgemZNaWNBcHBlbmRCeXRlKGJWYWx1ZSwgcE1pY0tleSk7CisgICAgfQorCisgICAgemZNaWNHZXRNaWMobWljLCBwTWljS2V5KTsKK30KKwordm9pZCB6ZlRLSVBFbmNyeXB0KHpkZXZfdCAqZGV2LCB6YnVmX3QgKmJ1ZiwgdThfdCAqc25hcCwgdTE2X3Qgc25hcExlbiwgdTE2X3Qgb2Zmc2V0LCB1OF90IGtleUxlbiwgdThfdCoga2V5LCB1MzJfdCogaWN2KQoreworICAgIHU4X3QgaXZbM107CisKKyAgICBpdlswXSA9IGtleVswXTsKKyAgICBpdlsxXSA9IGtleVsxXTsKKyAgICBpdlsyXSA9IGtleVsyXTsKKworICAgIGtleUxlbiAtPSAzOworCisgICAgemZXRVBFbmNyeXB0KGRldiwgYnVmLCBzbmFwLCBzbmFwTGVuLCBvZmZzZXQsIGtleUxlbiwgJmtleVszXSwgaXYpOworfQorCit1MTZfdCB6ZlRLSVBEZWNyeXB0KHpkZXZfdCAqZGV2LCB6YnVmX3QgKmJ1ZiwgdTE2X3Qgb2Zmc2V0LCB1OF90IGtleUxlbiwgdThfdCoga2V5KQoreworICAgIHUxNl90IHJldCA9IFpNX0lDVl9TVUNDRVNTOworICAgIHU4X3QgaXZbM107CisKKyAgICBpdlswXSA9IGtleVswXTsKKyAgICBpdlsxXSA9IGtleVsxXTsKKyAgICBpdlsyXSA9IGtleVsyXTsKKworICAgIGtleUxlbiAtPSAzOworCisgICAgcmV0ID0gemZXRVBEZWNyeXB0KGRldiwgYnVmLCBvZmZzZXQsIGtleUxlbiwgJmtleVszXSwgaXYpOworCisgICAgcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9jdHhyeC5jIGIvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2N0eHJ4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTI1OGE3ZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9jdHhyeC5jCkBAIC0wLDAgKzEsNDA5NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNy0yMDA4IEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZHVsZSBOYW1lIDogaHRyLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQWJzdHJhY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBUaGlzIG1vZHVsZSBjb250YWlucyBUeCBhbmQgUnggZnVuY3Rpb25zLiAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTk9URVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBOb25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgImNwcmVjb21wLmgiCisKK3UxNl90IHpmV2xhblJ4VmFsaWRhdGUoemRldl90KiBkZXYsIHpidWZfdCogYnVmKTsKK3UxNl90IHpmV2xhblJ4RmlsdGVyKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1Zik7CisKKworCitjb25zdCB1OF90IHpnU25hcEJyaWRnZVR1bm5lbFs2XSA9IHsgMHhBQSwgMHhBQSwgMHgwMywgMHgwMCwgMHgwMCwgMHhGOCB9OworY29uc3QgdThfdCB6Z1NuYXA4MDIxaFs2XSA9IHsgMHhBQSwgMHhBQSwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCB9OworLyogVGFibGUgZm9yIGNvbnZlcnRpbmcgSVAgRFNDUCBQMi1QMCBiaXRzIHRvIDgwMi4xMWUgQWNjZXNzIENhdGVnb3J5ICovCitjb25zdCB1OF90IHpjVXBUb0FjWzhdID0gezAsIDEsIDEsIDAsIDIsIDIsIDMsIDN9OyAvL1dNTSBkZWZhdWx0CisvL2NvbnN0IHU4X3QgemNVcFRvQWNbOF0gPSB7MCwgMSwgMSwgMCwgMCwgMCwgMCwgMH07IC8vRm9yIDIgVHhRCisvL2NvbnN0IHU4X3QgemNVcFRvQWNbOF0gPSB7MCwgMCwgMCwgMCwgMCwgMCwgMCwgMH07IC8vRm9yIHNpbmdsZSBUeFEKK2NvbnN0IHU4X3QgemNNYXhzcFRvUGt0TnVtWzRdID0gezgsIDIsIDQsIDZ9OworCit1OF90IHpmR2V0RW5jcnlNb2RlRnJvbVJ4U3RhdHVzKHN0cnVjdCB6c0FkZGl0aW9uSW5mbyogYWRkSW5mbykKK3sKKyAgICB1OF90IHNlY3VyaXR5Qnl0ZTsKKyAgICB1OF90IGVuY3J5TW9kZTsKKworICAgIHNlY3VyaXR5Qnl0ZSA9IChhZGRJbmZvLT5UYWlsLkRhdGEuU0FJbmRleCAmIDB4YzApID4+IDQ7ICAvKiBieXRlNCAqLworICAgIHNlY3VyaXR5Qnl0ZSB8PSAoYWRkSW5mby0+VGFpbC5EYXRhLkRBSW5kZXggJiAweGMwKSA+PiA2OyAvKiBieXRlNSAqLworCisgICAgc3dpdGNoKCBzZWN1cml0eUJ5dGUgKQorICAgIHsKKyAgICAgICAgY2FzZSBaTV9OT19XRVA6CisgICAgICAgIGNhc2UgWk1fV0VQNjQ6CisgICAgICAgIGNhc2UgWk1fV0VQMTI4OgorICAgICAgICBjYXNlIFpNX1dFUDI1NjoKKyNpZmRlZiBaTV9FTkFCTEVfQ0VOQworICAgICAgICBjYXNlIFpNX0NFTkM6CisjZW5kaWYgLy9aTV9FTkFCTEVfQ0VOQworICAgICAgICBjYXNlIFpNX1RLSVA6CisgICAgICAgIGNhc2UgWk1fQUVTOgorCisgICAgICAgICAgICBlbmNyeU1vZGUgPSBzZWN1cml0eUJ5dGU7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorCisgICAgICAgICAgICBpZiAoIChzZWN1cml0eUJ5dGUgJiAweGY4KSA9PSAweDA4ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBkZWNyeXB0ZWQgYnkgc29mdHdhcmUKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZW5jcnlNb2RlID0gWk1fTk9fV0VQOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGVuY3J5TW9kZTsKK30KKwordm9pZCB6ZkdldFJ4SXZJY3ZMZW5ndGgoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1OF90IHZhcCwgdTE2X3QqIHBJdkxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHUxNl90KiBwSWN2TGVuLCBzdHJ1Y3QgenNBZGRpdGlvbkluZm8qIGFkZEluZm8pCit7CisgICAgdTE2X3Qgd2RzUG9ydDsKKyAgICB1OF90ICBlbmNyeU1vZGU7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICAqcEl2TGVuID0gMDsKKyAgICAqcEljdkxlbiA9IDA7CisKKyAgICBlbmNyeU1vZGUgPSB6ZkdldEVuY3J5TW9kZUZyb21SeFN0YXR1cyhhZGRJbmZvKTsKKworICAgIGlmICggd2QtPndsYW5Nb2RlID09IFpNX01PREVfQVAgKQorICAgIHsKKyAgICAgICAgaWYgKHZhcCA8IFpNX01BWF9BUF9TVVBQT1JUKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoKCB3ZC0+YXAuZW5jcnlNb2RlW3ZhcF0gPT0gWk1fV0VQNjQgKSB8fAorICAgICAgICAgICAgICAgICAgICAoIHdkLT5hcC5lbmNyeU1vZGVbdmFwXSA9PSBaTV9XRVAxMjggKSB8fAorICAgICAgICAgICAgICAgICAgICAoIHdkLT5hcC5lbmNyeU1vZGVbdmFwXSA9PSBaTV9XRVAyNTYgKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAqcEl2TGVuID0gNDsKKyAgICAgICAgICAgICAgICAqcEljdkxlbiA9IDQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdTE2X3QgaWQ7CisgICAgICAgICAgICAgICAgdTE2X3QgYWRkclszXTsKKworICAgICAgICAgICAgICAgIGFkZHJbMF0gPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCBaTV9XTEFOX0hFQURFUl9BMl9PRkZTRVQpOworICAgICAgICAgICAgICAgIGFkZHJbMV0gPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCBaTV9XTEFOX0hFQURFUl9BMl9PRkZTRVQrMik7CisgICAgICAgICAgICAgICAgYWRkclsyXSA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIFpNX1dMQU5fSEVBREVSX0EyX09GRlNFVCs0KTsKKworICAgICAgICAgICAgICAgIC8qIEZpbmQgU1RBJ3MgaW5mb3JtYXRpb24gKi8KKyAgICAgICAgICAgICAgICBpZiAoKGlkID0gemZBcEZpbmRTdGEoZGV2LCBhZGRyKSkgIT0gMHhmZmZmKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHdkLT5hcC5zdGFUYWJsZVtpZF0uZW5jcnlNb2RlID09IFpNX1RLSVApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICpwSXZMZW4gPSA4OworICAgICAgICAgICAgICAgICAgICAgICAgKnBJY3ZMZW4gPSA0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHdkLT5hcC5zdGFUYWJsZVtpZF0uZW5jcnlNb2RlID09IFpNX0FFUykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgKnBJdkxlbiA9IDg7CisgICAgICAgICAgICAgICAgICAgICAgICAqcEljdkxlbiA9IDg7IC8vIEFFUyBNSUMKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vKnBJY3ZMZW4gPSAwOworICAgICAgICAgICAgICAgICAgICB9CisjaWZkZWYgWk1fRU5BQkxFX0NFTkMKKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAod2QtPmFwLnN0YVRhYmxlW2lkXS5lbmNyeU1vZGUgPT0gWk1fQ0VOQykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgKnBJdkxlbiA9IDE4OworICAgICAgICAgICAgICAgICAgICAgICAgKnBJY3ZMZW49IDE2OworICAgICAgICAgICAgICAgICAgICB9CisjZW5kaWYgLy9aTV9FTkFCTEVfQ0VOQworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIFdEUyBwb3J0IGNoZWNraW5nICovCisgICAgICAgICAgICBpZiAoKHdkc1BvcnQgPSB2YXAgLSAweDIwKSA+PSBaTV9NQVhfV0RTX1NVUFBPUlQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2RzUG9ydCA9IDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN3aXRjaCAod2QtPmFwLndkcy5lbmNyeU1vZGVbd2RzUG9ydF0pCisJCQl7CisJCQljYXNlIFpNX1dFUDY0OgorCQkJY2FzZSBaTV9XRVAxMjg6CisJCQljYXNlIFpNX1dFUDI1NjoKKyAgICAgICAgICAgICAgICAqcEl2TGVuID0gNDsKKyAgICAgICAgICAgICAgICAqcEljdkxlbiA9IDQ7CisJCQkJYnJlYWs7CisJCQljYXNlIFpNX1RLSVA6CisgICAgICAgICAgICAgICAgKnBJdkxlbiA9IDg7CisgICAgICAgICAgICAgICAgKnBJY3ZMZW4gPSA0OworCQkJCWJyZWFrOworCQkJY2FzZSBaTV9BRVM6CisgICAgICAgICAgICAgICAgKnBJdkxlbiA9IDg7CisgICAgICAgICAgICAgICAgKnBJY3ZMZW4gPSAwOworCQkJCWJyZWFrOworI2lmZGVmIFpNX0VOQUJMRV9DRU5DCisgICAgICAgICAgICBjYXNlIFpNX0NFTkM6CisgICAgICAgICAgICAgICAgKnBJdkxlbiA9IDE4OworICAgICAgICAgICAgICAgICpwSWN2TGVuID0gMTY7CisJCQkJYnJlYWs7CisjZW5kaWYgLy9aTV9FTkFCTEVfQ0VOQworCQkJfS8qIGVuZCBvZiBzd2l0Y2ggKi8KKyAgICAgICAgfQorICAgIH0KKwllbHNlIGlmICggd2QtPndsYW5Nb2RlID09IFpNX01PREVfUFNFVURPKQorICAgIHsKKyAgICAgICAgLyogdGVzdDogNjUxOCBmb3IgUUEgYXV0byB0ZXN0ICovCisgICAgICAgIHN3aXRjaCAoZW5jcnlNb2RlKQorCQl7CisgICAgICAgIGNhc2UgWk1fV0VQNjQ6CisgICAgICAgIGNhc2UgWk1fV0VQMTI4OgorICAgICAgICBjYXNlIFpNX1dFUDI1NjoKKyAgICAgICAgICAgICpwSXZMZW4gPSA0OworICAgICAgICAgICAgKnBJY3ZMZW4gPSA0OworCQkJYnJlYWs7CisJCWNhc2UgWk1fVEtJUDoKKyAgICAgICAgICAgICpwSXZMZW4gPSA4OworICAgICAgICAgICAgKnBJY3ZMZW4gPSA0OworCQkJYnJlYWs7CisJCWNhc2UgWk1fQUVTOgorICAgICAgICAgICAgKnBJdkxlbiA9IDg7CisgICAgICAgICAgICAqcEljdkxlbiA9IDA7CisJCQlicmVhazsKKyNpZmRlZiBaTV9FTkFCTEVfQ0VOQworICAgICAgICBjYXNlIFpNX0NFTkM6CisgICAgICAgICAgICAqcEl2TGVuID0gMTg7CisgICAgICAgICAgICAqcEljdkxlbiA9IDE2OworI2VuZGlmIC8vWk1fRU5BQkxFX0NFTkMKKwkJfS8qIGVuZCBvZiBzd2l0Y2ggKi8KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYgKCAoZW5jcnlNb2RlID09IFpNX1dFUDY0KXx8CisgICAgICAgICAgICAgKGVuY3J5TW9kZSA9PSBaTV9XRVAxMjgpfHwKKyAgICAgICAgICAgICAoZW5jcnlNb2RlID09IFpNX1dFUDI1NikgKQorICAgICAgICB7CisgICAgICAgICAgICAqcEl2TGVuID0gNDsKKyAgICAgICAgICAgICpwSWN2TGVuID0gNDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICggZW5jcnlNb2RlID09IFpNX1RLSVAgKQorICAgICAgICB7CisgICAgICAgICAgICAqcEl2TGVuID0gODsKKyAgICAgICAgICAgICpwSWN2TGVuID0gNDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICggZW5jcnlNb2RlID09IFpNX0FFUyApCisgICAgICAgIHsKKyAgICAgICAgICAgICpwSXZMZW4gPSA4OworICAgICAgICAgICAgKnBJY3ZMZW4gPSA4OyAvLyBBRVMgTUlDCisgICAgICAgIH0KKyNpZmRlZiBaTV9FTkFCTEVfQ0VOQworICAgICAgICBlbHNlIGlmICggZW5jcnlNb2RlID09IFpNX0NFTkMpCisgICAgICAgIHsKKyAgICAgICAgICAgICpwSXZMZW4gPSAxODsKKyAgICAgICAgICAgICpwSWN2TGVuPSAxNjsKKyAgICAgICAgfQorI2VuZGlmIC8vWk1fRU5BQkxFX0NFTkMKKyAgICB9Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmQWdpbmdEZWZyYWdMaXN0ICAgICAgICAgICAqLworLyogICAgICBGb3JjZSBmbHVzaGluZyB3aG9sZSBkZWZyYWcgbGlzdCBvciBhZ2luZyB0aGUgYnVmZmVyICAgICAgICAgICAgKi8KKy8qICAgICAgaW4gdGhlIGRlZnJhZyBsaXN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGZsdXNoRmxhZyA6IDE9PmZsdXNoaW5nLCAwPT5BZ2luZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIE5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFN0ZXBoZW4gQ2hlbiAgICAgICAgQXRoZXJvcyBDb21tdW5pY2F0aW9ucywgSU5DLiAgICAyMDA3LjEgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHpmQWdpbmdEZWZyYWdMaXN0KHpkZXZfdCogZGV2LCB1MTZfdCBmbHVzaEZsYWcpCit7CisgICAgdTE2X3QgaSwgajsKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICBmb3IoaT0wOyBpPFpNX01BWF9ERUZSQUdfRU5UUklFUzsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKHdkLT5kZWZyYWdUYWJsZS5kZWZyYWdFbnRyeVtpXS5mcmFnQ291bnQgIT0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgoKHdkLT50aWNrIC0gd2QtPmRlZnJhZ1RhYmxlLmRlZnJhZ0VudHJ5W2ldLnRpY2spID4KKyAgICAgICAgICAgICAgICAgICAgICAgIChaTV9ERUZSQUdfQUdJTkdfVElNRV9TRUMgKiBaTV9USUNLX1BFUl9TRUNPTkQpKQorICAgICAgICAgICAgICAgfHwgKGZsdXNoRmxhZyAhPSAwKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6bV9tc2cxX3J4KFpNX0xWXzIsICJBZ2luZyBkZWZyYWcgbGlzdCA6IiwgaSk7CisgICAgICAgICAgICAgICAgLyogRnJlZSB0aGUgYnVmZmVycyBpbiB0aGUgZGVmcmFnIGxpc3QgKi8KKyAgICAgICAgICAgICAgICBmb3IgKGo9MDsgajx3ZC0+ZGVmcmFnVGFibGUuZGVmcmFnRW50cnlbaV0uZnJhZ0NvdW50OyBqKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB6ZndCdWZGcmVlKGRldiwgd2QtPmRlZnJhZ1RhYmxlLmRlZnJhZ0VudHJ5W2ldLmZyYWdtZW50W2pdLCAwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgd2QtPmRlZnJhZ1RhYmxlLmRlZnJhZ0VudHJ5W2ldLmZyYWdDb3VudCA9IDA7CisgICAgfQorCisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIHJldHVybjsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZBZGRGaXJzdEZyYWdUb0RlZnJhZ0xpc3QgICovCisvKiAgICAgIEFkZCBmaXJzdCBmcmFnbWVudCB0byBkZWZyYWdtZW50IGxpc3QsIHRoZSBmaXJzdCBlbXB0eSBlbnRyeSAgICAqLworLyogICAgICB3aWxsIGJlIHNlbGVjdGVkLiBJZiB0aGUgbGlzdCBpcyBmdWxsLCBzZXF1ZW50aWFsbHkgc2VsZWN0ICAgICAgKi8KKy8qICAgICAgb25lIGVudHJ5IGZvciByZXBsYWNlbWVudC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGJ1ZiA6IGZpcnN0IGZyYWdtZW50IGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBhZGRyIDogYWRkcmVzcyBvZiBmaXJzdCBmcmFnbWVudCBidWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgc2VxTnVtIDogc2VxdWVuY2Ugb2YgZmlyc3QgZnJhZ21lbnQgYnVmZmVyICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiBDaGVuICAgICAgICBBdGhlcm9zIENvbW11bmljYXRpb25zLCBJTkMuICAgIDIwMDcuMSAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgemZBZGRGaXJzdEZyYWdUb0RlZnJhZ0xpc3QoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1OF90KiBhZGRyLCB1MTZfdCBzZXFOdW0pCit7CisgICAgdTE2X3QgaSwgajsKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICAvKiBGaW5kIGFuIGVtcHR5IG9uZSBpbiBkZWZyYWcgbGlzdCAqLworICAgIGZvcihpPTA7IGk8Wk1fTUFYX0RFRlJBR19FTlRSSUVTOyBpKyspCisgICAgeworICAgICAgICBpZiAoIHdkLT5kZWZyYWdUYWJsZS5kZWZyYWdFbnRyeVtpXS5mcmFnQ291bnQgPT0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgLyogSWYgZnVsbCwgc2VxdWVudGlhbGx5IHJlcGxhY2UgZXhpc3Rpbmcgb25lICovCisgICAgaWYgKGkgPT0gWk1fTUFYX0RFRlJBR19FTlRSSUVTKQorICAgIHsKKyAgICAgICAgaSA9IHdkLT5kZWZyYWdUYWJsZS5yZXBsYWNlTnVtKysgJiAoWk1fTUFYX0RFRlJBR19FTlRSSUVTLTEpOworICAgICAgICAvKiBGcmVlIHRoZSBidWZmZXJzIGluIHRoZSBkZWZyYWcgbGlzdCB0byBiZSByZXBsYWNlZCAqLworICAgICAgICBmb3IgKGo9MDsgajx3ZC0+ZGVmcmFnVGFibGUuZGVmcmFnRW50cnlbaV0uZnJhZ0NvdW50OyBqKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHpmd0J1ZkZyZWUoZGV2LCB3ZC0+ZGVmcmFnVGFibGUuZGVmcmFnRW50cnlbaV0uZnJhZ21lbnRbal0sIDApOworICAgICAgICB9CisgICAgfQorCisgICAgd2QtPmRlZnJhZ1RhYmxlLmRlZnJhZ0VudHJ5W2ldLmZyYWdDb3VudCA9IDE7CisgICAgd2QtPmRlZnJhZ1RhYmxlLmRlZnJhZ0VudHJ5W2ldLmZyYWdtZW50WzBdID0gYnVmOworICAgIHdkLT5kZWZyYWdUYWJsZS5kZWZyYWdFbnRyeVtpXS5zZXFOdW0gPSBzZXFOdW07CisgICAgd2QtPmRlZnJhZ1RhYmxlLmRlZnJhZ0VudHJ5W2ldLnRpY2sgPSB3ZC0+dGljazsKKworICAgIGZvciAoaj0wOyBqPDY7IGorKykKKyAgICB7CisgICAgICAgIHdkLT5kZWZyYWdUYWJsZS5kZWZyYWdFbnRyeVtpXS5hZGRyW2pdID0gYWRkcltqXTsKKyAgICB9CisKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgcmV0dXJuOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZkFkZEZyYWdUb0RlZnJhZ0xpc3QgICAgICAgKi8KKy8qICAgICAgQWRkIG1pZGRsZSBvciBsYXN0IGZyYWdtZW50IHRvIGRlZnJhZ21lbnQgbGlzdC4gICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGJ1ZiA6IGZpcnN0IGZyYWdtZW50IGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBhZGRyIDogYWRkcmVzcyBvZiBmcmFnbWVudCBidWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgc2VxTnVtIDogc2VxdWVuY2UgZnJhZ21lbnQgYnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGZyYWdOdW0gOiBmcmFnbWVudCBudW1iZXIgb2YgZnJhZ21lbnQgYnVmZmVyICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBtb3JlRnJhZyA6IG1vcmUgZnJhZyBiaXQgb2YgZnJhZ21lbnQgYnVmZmVyICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYWRkSW5mbyA6IGFkZGl0aW9uIGluZm8gb2YgZnJhZ21lbnQgYnVmZmVyICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiBDaGVuICAgICAgICBBdGhlcm9zIENvbW11bmljYXRpb25zLCBJTkMuICAgIDIwMDcuMSAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3pidWZfdCogemZBZGRGcmFnVG9EZWZyYWdMaXN0KHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdThfdCogYWRkciwKKyAgICAgICAgdTE2X3Qgc2VxTnVtLCB1OF90IGZyYWdOdW0sIHU4X3QgbW9yZUZyYWcsCisgICAgICAgIHN0cnVjdCB6c0FkZGl0aW9uSW5mbyogYWRkSW5mbykKK3sKKyAgICB1MTZfdCBpLCBqLCBrOworICAgIHpidWZfdCogcmV0dXJuQnVmID0gTlVMTDsKKyAgICB1MTZfdCBkZWZyYWdEb25lID0gMDsKKyAgICB1MTZfdCBsZW5FcnIgPSAwOworICAgIHUxNl90IHN0YXJ0QWRkciwgZnJhZ0hlYWQsIGZyYW1lTGVuLCBpdkxlbiwgaWN2TGVuOworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIC8qIEZpbmQgZnJhZyBpbiB0aGUgZGVmcmFnIGxpc3QgKi8KKyAgICBmb3IoaT0wOyBpPFpNX01BWF9ERUZSQUdfRU5UUklFUzsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKCB3ZC0+ZGVmcmFnVGFibGUuZGVmcmFnRW50cnlbaV0uZnJhZ0NvdW50ICE9IDAgKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBDb21wYXJlIGFkZHJlc3MgKi8KKyAgICAgICAgICAgIGZvciAoaj0wOyBqPDY7IGorKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoYWRkcltqXSAhPSB3ZC0+ZGVmcmFnVGFibGUuZGVmcmFnRW50cnlbaV0uYWRkcltqXSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChqID09IDYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogQ29tcGFyZSBzZXF1ZW5jZSBhbmQgZnJhZ21lbnQgbnVtYmVyICovCisgICAgICAgICAgICAgICAgaWYgKHNlcU51bSA9PSB3ZC0+ZGVmcmFnVGFibGUuZGVmcmFnRW50cnlbaV0uc2VxTnVtKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChmcmFnTnVtID09IHdkLT5kZWZyYWdUYWJsZS5kZWZyYWdFbnRyeVtpXS5mcmFnQ291bnQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIChmcmFnTnVtIDwgOCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFkZCBmcmFnIGZyYW1lIHRvIGRlZnJhZyBsaXN0ICovCisgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+ZGVmcmFnVGFibGUuZGVmcmFnRW50cnlbaV0uZnJhZ21lbnRbZnJhZ051bV0gPSBidWY7CisgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+ZGVmcmFnVGFibGUuZGVmcmFnRW50cnlbaV0uZnJhZ0NvdW50Kys7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZyYWdEb25lID0gMTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1vcmVGcmFnID09IDApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbWVyZ2UgYWxsIGZyYWdtZW50IGlmIG1vcmUgZGF0YSBiaXQgaXMgY2xlYXJlZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybkJ1ZiA9IHdkLT5kZWZyYWdUYWJsZS5kZWZyYWdFbnRyeVtpXS5mcmFnbWVudFswXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydEFkZHIgPSB6ZndCdWZHZXRTaXplKGRldiwgcmV0dXJuQnVmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBza2lwIFdMQU4gaGVhZGVyIDI0KERhdGEpIG9yIDI2KFFvUyBEYXRhKSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYWdIZWFkID0gMjQgKyAoKHptd19yeF9idWZfcmVhZGgoZGV2LCByZXR1cm5CdWYsIDApICYgMHg4MCkgPj4gNik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgemZHZXRSeEl2SWN2TGVuZ3RoKGRldiwgcmV0dXJuQnVmLCAwLCAmaXZMZW4sICZpY3ZMZW4sIGFkZEluZm8pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYWdIZWFkICs9IGl2TGVuOyAvKiBza2lwIElWICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGs9MTsgazx3ZC0+ZGVmcmFnVGFibGUuZGVmcmFnRW50cnlbaV0uZnJhZ0NvdW50OyBrKyspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUxlbiA9IHpmd0J1ZkdldFNpemUoZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2QtPmRlZnJhZ1RhYmxlLmRlZnJhZ0VudHJ5W2ldLmZyYWdtZW50W2tdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChzdGFydEFkZHIrZnJhbWVMZW4tZnJhZ0hlYWQpIDwgMTU2MCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemZSeEJ1ZmZlckNvcHkoZGV2LCByZXR1cm5CdWYsIHdkLT5kZWZyYWdUYWJsZS5kZWZyYWdFbnRyeVtpXS5mcmFnbWVudFtrXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRBZGRyLCBmcmFnSGVhZCwgZnJhbWVMZW4tZnJhZ0hlYWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRBZGRyICs9IChmcmFtZUxlbi1mcmFnSGVhZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5FcnIgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpmd0J1ZkZyZWUoZGV2LCB3ZC0+ZGVmcmFnVGFibGUuZGVmcmFnRW50cnlbaV0uZnJhZ21lbnRba10sIDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5kZWZyYWdUYWJsZS5kZWZyYWdFbnRyeVtpXS5mcmFnQ291bnQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpmd0J1ZlNldFNpemUoZGV2LCByZXR1cm5CdWYsIHN0YXJ0QWRkcik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICBpZiAobGVuRXJyID09IDEpCisgICAgeworICAgICAgICB6ZndCdWZGcmVlKGRldiwgcmV0dXJuQnVmLCAwKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChkZWZyYWdEb25lID09IDApCisgICAgeworICAgICAgICB6ZndCdWZGcmVlKGRldiwgYnVmLCAwKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuIHJldHVybkJ1ZjsKK30KKworCisvKiByZXR1cm4gdmFsdWUgPSBOVUxMID0+IHNhdmUgb3IgZnJlZSB0aGlzIGZyYW1lICAgICAgICAgKi8KK3pidWZfdCogemZEZWZyYWdtZW50KHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdThfdCogcGJJc0RlZnJhZywKKyAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB6c0FkZGl0aW9uSW5mbyogYWRkSW5mbykKK3sKKyAgICB1OF90IGZyYWdOdW07CisgICAgdTE2X3Qgc2VxTnVtOworICAgIHU4X3QgbW9yZUZyYWdCaXQ7CisgICAgdThfdCBhZGRyWzZdOworICAgIHUxNl90IGk7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgWk1fQlVGRkVSX1RSQUNFKGRldiwgYnVmKQorCisgICAgKnBiSXNEZWZyYWcgPSBGQUxTRTsKKyAgICBzZXFOdW0gPSB6bXdfYnVmX3JlYWRoKGRldiwgYnVmLCAyMik7CisgICAgZnJhZ051bSA9ICh1OF90KShzZXFOdW0gJiAweGYpOworICAgIG1vcmVGcmFnQml0ID0gKHptd19idWZfcmVhZGIoZGV2LCBidWYsIDEpICYgWk1fQklUXzIpID4+IDI7CisKKyAgICBpZiAoKGZyYWdOdW0gPT0gMCkgJiYgKG1vcmVGcmFnQml0ID09IDApKQorICAgIHsKKyAgICAgICAgLyogTm90IHBhcnQgb2YgYSBmcmFnbWVudGF0aW9uICovCisKKyAgICAgICAgcmV0dXJuIGJ1ZjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgd2QtPmNvbW1UYWxseS5zd1J4RnJhZ21lbnRDb3VudCsrOworICAgICAgICBzZXFOdW0gPSBzZXFOdW0gPj4gNDsKKyAgICAgICAgZm9yIChpPTA7IGk8NjsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBhZGRyW2ldID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgWk1fV0xBTl9IRUFERVJfQTJfT0ZGU0VUK2kpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGZyYWdOdW0gPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgLyogbW9yZSBmcmFnID0gMSAqLworICAgICAgICAgICAgLyogRmlyc3QgcGFydCBvZiBhIGZyYWdtZW50YXRpb24gKi8KKyAgICAgICAgICAgIHptX21zZzFfcngoWk1fTFZfMiwgIkZpcnN0IEZyYWcsIHNlcT0iLCBzZXFOdW0pOworICAgICAgICAgICAgemZBZGRGaXJzdEZyYWdUb0RlZnJhZ0xpc3QoZGV2LCBidWYsIGFkZHIsIHNlcU51bSk7CisgICAgICAgICAgICBidWYgPSBOVUxMOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLyogTWlkZGxlIG9yIGxhc3QgcGFydCBvZiBhIGZyYWdtZW50YXRpb24gKi8KKyAgICAgICAgICAgIHptX21zZzFfcngoWk1fTFZfMiwgIkZyYWcgc2VxPSIsIHNlcU51bSk7CisgICAgICAgICAgICB6bV9tc2cxX3J4KFpNX0xWXzIsICJGcmFnIG1vcmVGcmFnQml0PSIsIG1vcmVGcmFnQml0KTsKKyAgICAgICAgICAgIGJ1ZiA9IHpmQWRkRnJhZ1RvRGVmcmFnTGlzdChkZXYsIGJ1ZiwgYWRkciwgc2VxTnVtLCBmcmFnTnVtLCBtb3JlRnJhZ0JpdCwgYWRkSW5mbyk7CisgICAgICAgICAgICBpZiAoYnVmICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgKnBiSXNEZWZyYWcgPSBUUlVFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGJ1ZjsKK30KKworCisjaWYgWk1fUFJPVE9DT0xfUkVTUE9OU0VfU0lNVUxBVElPTgordTE2X3QgemZTd2FwKHUxNl90IG51bSkKK3sKKyAgICByZXR1cm4gKChudW0gPj4gOCkgKyAoKG51bSAmIDB4ZmYpIDw8IDgpKTsKK30KKworCit2b2lkIHpmUHJvdFJzcFNpbSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpCit7CisgICAgdTE2X3QgZXRoVHlwZTsKKyAgICB1MTZfdCBhcnBPcDsKKyAgICB1MTZfdCBwcm90OworICAgIHUxNl90IHRlbXA7CisgICAgdTE2X3QgaTsKKyAgICB1MTZfdCBkaXBbMl07CisgICAgdTE2X3QgZHN0UG9ydDsKKyAgICB1MTZfdCBzcmNQb3J0OworCisgICAgZXRoVHlwZSA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIDEyKTsKKyAgICB6bV9tc2cyX3J4KFpNX0xWXzIsICJldGhUeXBlPSIsIGV0aFR5cGUpOworCisgICAgLyogQVJQICovCisgICAgaWYgKGV0aFR5cGUgPT0gMHgwNjA4KQorICAgIHsKKyAgICAgICAgYXJwT3AgPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCAyMCk7CisgICAgICAgIGRpcFswXSA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIDM4KTsKKyAgICAgICAgZGlwWzFdID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgNDApOworICAgICAgICB6bV9tc2cyX3J4KFpNX0xWXzIsICJhcnBPcD0iLCBhcnBPcCk7CisgICAgICAgIHptX21zZzJfcngoWk1fTFZfMiwgImlwMD0iLCBkaXBbMF0pOworICAgICAgICB6bV9tc2cyX3J4KFpNX0xWXzIsICJpcDE9IiwgZGlwWzFdKTsKKworICAgICAgICAvL0FSUCByZXF1ZXN0IHRvIDE5Mi4xNjguMS4xNQorICAgICAgICBpZiAoKGFycE9wID09IDB4MDEwMCkgJiYgKGRpcFswXSA9PSAweGE4YzApICYmIChkaXBbMV0gPT0gMHgwZjAxKSk7CisgICAgICAgIHsKKyAgICAgICAgICAgIHptX21zZzBfcngoWk1fTFZfMiwgIkFSUCIpOworICAgICAgICAgICAgLyogQVJQIHJlc3BvbnNlICovCisgICAgICAgICAgICB6bXdfcnhfYnVmX3dyaXRlaChkZXYsIGJ1ZiwgMjAsIDB4MDIwMCk7CisKKyAgICAgICAgICAgIC8qIGRzdCBoYXJkd2FyZSBhZGRyZXNzICovCisKKyAgICAgICAgICAgIC8qIHNyYyBoYXJkd2FyZSBhZGRyZXNzICovCisgICAgICAgICAgICAvL3ptd19yeF9idWZfd3JpdGVoKGRldiwgYnVmLCA2LCAweGEwMDApOworICAgICAgICAgICAgLy96bXdfcnhfYnVmX3dyaXRlaChkZXYsIGJ1ZiwgOCwgMHgwMDAwKTsKKyAgICAgICAgICAgIC8vem13X3J4X2J1Zl93cml0ZWgoZGV2LCBidWYsIDEwLCAweDAwMDApOworCisgICAgICAgICAgICAvKiBkc3QgaXAgYWRkcmVzcyAqLworICAgICAgICAgICAgZm9yIChpPTA7IGk8NTsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRlbXAgPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCAyMisoaSoyKSk7CisgICAgICAgICAgICAgICAgem13X3J4X2J1Zl93cml0ZWgoZGV2LCBidWYsIDMyKyhpKjIpLCB0ZW1wKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogc3JjIGhhcmR3YXJlIGFkZHJlc3MgKi8KKyAgICAgICAgICAgIHptd19yeF9idWZfd3JpdGVoKGRldiwgYnVmLCAyMiwgMHhhMDAwKTsKKyAgICAgICAgICAgIHptd19yeF9idWZfd3JpdGVoKGRldiwgYnVmLCAyNCwgMHgwMDAwKTsKKyAgICAgICAgICAgIHptd19yeF9idWZfd3JpdGVoKGRldiwgYnVmLCAyNiwgMHgwMDAwKTsKKworICAgICAgICAgICAgLyogc3JjIGlwIGFkZHJlc3MgKi8KKyAgICAgICAgICAgIHptd19yeF9idWZfd3JpdGVoKGRldiwgYnVmLCAyOCwgMHhhOGMwKTsKKyAgICAgICAgICAgIHptd19yeF9idWZfd3JpdGVoKGRldiwgYnVmLCAzMCwgMHgwZjAxKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAvKiBJQ01QICovCisgICAgZWxzZSBpZiAoZXRoVHlwZSA9PSAweDAwMDgpCisgICAgeworICAgICAgICB6bV9tc2cwX3J4KFpNX0xWXzIsICJJUCIpOworICAgICAgICBwcm90ID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgMjMpOworICAgICAgICBkaXBbMF0gPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCAzMCk7CisgICAgICAgIGRpcFsxXSA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIDMyKTsKKyAgICAgICAgem1fbXNnMl9yeChaTV9MVl8yLCAicHJvdD0iLCBwcm90KTsKKyAgICAgICAgem1fbXNnMl9yeChaTV9MVl8yLCAiaXAwPSIsIGRpcFswXSk7CisgICAgICAgIHptX21zZzJfcngoWk1fTFZfMiwgImlwMT0iLCBkaXBbMV0pOworCisgICAgICAgIC8qIFBJTkcgcmVxdWVzdCB0byAxOTIuMTY4LjEuMTUgKi8KKyAgICAgICAgaWYgKChwcm90ID09IDB4MSkgJiYgKGRpcFswXSA9PSAweGE4YzApICYmIChkaXBbMV0gPT0gMHgwZjAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgem1fbXNnMF9yeChaTV9MVl8yLCAiSUNNUCIpOworICAgICAgICAgICAgLyogY2hhbmdlIGRzdCAqLworICAgICAgICAgICAgZm9yIChpPTA7IGk8MzsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRlbXAgPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCA2KyhpKjIpKTsKKyAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3dyaXRlaChkZXYsIGJ1ZiwgaSoyLCB0ZW1wKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIGNoYW5nZSBzcmMgKi8KKyAgICAgICAgICAgIHptd19yeF9idWZfd3JpdGVoKGRldiwgYnVmLCA2LCAweGEwMDApOworICAgICAgICAgICAgem13X3J4X2J1Zl93cml0ZWgoZGV2LCBidWYsIDgsIDB4MDAwMCk7CisgICAgICAgICAgICB6bXdfcnhfYnVmX3dyaXRlaChkZXYsIGJ1ZiwgMTAsIDB4MDAwMCk7CisKKyAgICAgICAgICAgIC8qIGV4Y2hhbmdlIHNyYyBpcCBhbmQgZHN0IGlwICovCisgICAgICAgICAgICBmb3IgKGk9MDsgaTwyOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGVtcCA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIDI2KyhpKjIpKTsKKyAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3dyaXRlaChkZXYsIGJ1ZiwgMzArKGkqMiksIHRlbXApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgem13X3J4X2J1Zl93cml0ZWgoZGV2LCBidWYsIDI2LCAweGE4YzApOworICAgICAgICAgICAgem13X3J4X2J1Zl93cml0ZWgoZGV2LCBidWYsIDI4LCAweDBmMDEpOworCisgICAgICAgICAgICAvKiBjaGFuZ2UgaWNtcCB0eXBlIHRvIGVjaG8gcmVwbHkgKi8KKyAgICAgICAgICAgIHptd19yeF9idWZfd3JpdGViKGRldiwgYnVmLCAzNCwgMHgwKTsKKworICAgICAgICAgICAgLyogdXBkYXRlIGljbXAgY2hlY2tzdW0gKi8KKyAgICAgICAgICAgIHRlbXAgPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCAzNik7CisgICAgICAgICAgICB0ZW1wICs9IDg7CisgICAgICAgICAgICB6bXdfcnhfYnVmX3dyaXRlaChkZXYsIGJ1ZiwgMzYsIHRlbXApOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHByb3QgPT0gMHg2KQorICAgICAgICB7CisgICAgICAgICAgICB6bV9tc2cwX3J4KFpNX0xWXzIsICJUQ1AiKTsKKyAgICAgICAgICAgIHNyY1BvcnQgPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCAzNCk7CisgICAgICAgICAgICBkc3RQb3J0ID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMzYpOworICAgICAgICAgICAgem1fbXNnMl9yeChaTV9MVl8yLCAiU3JjIFBvcnQ9Iiwgc3JjUG9ydCk7CisgICAgICAgICAgICB6bV9tc2cyX3J4KFpNX0xWXzIsICJEc3QgUG9ydD0iLCBkc3RQb3J0KTsKKyAgICAgICAgICAgIGlmICgoZHN0UG9ydCA9PSAweDE1MDApIHx8IChzcmNQb3J0ID09IDB4MTUwMCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgem1fbXNnMF9yeChaTV9MVl8yLCAiRlRQIik7CisKKyAgICAgICAgICAgICAgICAvKiBjaGFuZ2UgZHN0ICovCisgICAgICAgICAgICAgICAgZm9yIChpPTA7IGk8MzsgaSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGVtcCA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIDYrKGkqMikpOworICAgICAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3dyaXRlaChkZXYsIGJ1ZiwgaSoyLCB0ZW1wKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLyogY2hhbmdlIHNyYyAqLworICAgICAgICAgICAgICAgIHptd19yeF9idWZfd3JpdGVoKGRldiwgYnVmLCA2LCAweGEwMDApOworICAgICAgICAgICAgICAgIHptd19yeF9idWZfd3JpdGVoKGRldiwgYnVmLCA4LCAweDAwMDApOworICAgICAgICAgICAgICAgIHptd19yeF9idWZfd3JpdGVoKGRldiwgYnVmLCAxMCwgMHgwMDAwKTsKKworICAgICAgICAgICAgICAgIC8qIGV4Y2hhbmdlIHNyYyBpcCBhbmQgZHN0IGlwICovCisgICAgICAgICAgICAgICAgZm9yIChpPTA7IGk8MjsgaSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGVtcCA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIDI2KyhpKjIpKTsKKyAgICAgICAgICAgICAgICAgICAgem13X3J4X2J1Zl93cml0ZWgoZGV2LCBidWYsIDMwKyhpKjIpLCB0ZW1wKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgem13X3J4X2J1Zl93cml0ZWgoZGV2LCBidWYsIDI2LCAweGE4YzApOworICAgICAgICAgICAgICAgIHptd19yeF9idWZfd3JpdGVoKGRldiwgYnVmLCAyOCwgMHgwZjAxKTsKKyNpZiAwCisgICAgICAgICAgICAgICAgLyogUGF0Y2ggc3JjIHBvcnQgKi8KKyAgICAgICAgICAgICAgICB0ZW1wID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMzQpOworICAgICAgICAgICAgICAgIHRlbXAgPSB6ZlN3YXAoemZTd2FwKHRlbXApICsgMSk7CisgICAgICAgICAgICAgICAgem13X3J4X2J1Zl93cml0ZWgoZGV2LCBidWYsIDM0LCB0ZW1wKTsKKyAgICAgICAgICAgICAgICB0ZW1wID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMzgpOworICAgICAgICAgICAgICAgIHRlbXAgPSB6ZlN3YXAoemZTd2FwKHRlbXApICsgMSk7CisgICAgICAgICAgICAgICAgem13X3J4X2J1Zl93cml0ZWgoZGV2LCBidWYsIDM4LCB0ZW1wKTsKKworICAgICAgICAgICAgICAgIC8qIFBhdGNoIGNoZWNrc3VtICovCisgICAgICAgICAgICAgICAgdGVtcCA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIDUwKTsKKyAgICAgICAgICAgICAgICB0ZW1wID0gemZTd2FwKHRlbXApOworICAgICAgICAgICAgICAgIHRlbXAgPSB+dGVtcDsKKyAgICAgICAgICAgICAgICB0ZW1wICs9IDI7CisgICAgICAgICAgICAgICAgdGVtcCA9IH50ZW1wOworICAgICAgICAgICAgICAgIHRlbXAgPSB6ZlN3YXAodGVtcCk7CisgICAgICAgICAgICAgICAgem13X3J4X2J1Zl93cml0ZWgoZGV2LCBidWYsIDUwLCB0ZW1wKTsKKyNlbmRpZgorICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAocHJvdCA9PSAweDExKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBjaGFuZ2UgZHN0ICovCisgICAgICAgICAgICBmb3IgKGk9MDsgaTwzOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGVtcCA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIDYrKGkqMikpOworICAgICAgICAgICAgICAgIHptd19yeF9idWZfd3JpdGVoKGRldiwgYnVmLCBpKjIsIHRlbXApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogY2hhbmdlIHNyYyAqLworICAgICAgICAgICAgem13X3J4X2J1Zl93cml0ZWgoZGV2LCBidWYsIDYsIDB4YTAwMCk7CisgICAgICAgICAgICB6bXdfcnhfYnVmX3dyaXRlaChkZXYsIGJ1ZiwgOCwgMHgwMDAwKTsKKyAgICAgICAgICAgIHptd19yeF9idWZfd3JpdGVoKGRldiwgYnVmLCAxMCwgMHgwMDAwKTsKKworICAgICAgICAgICAgem1fbXNnMF9yeChaTV9MVl8yLCAiVURQIik7CisgICAgICAgICAgICBzcmNQb3J0ID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMzQpOworICAgICAgICAgICAgZHN0UG9ydCA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIDM2KTsKKyAgICAgICAgICAgIHptX21zZzJfcngoWk1fTFZfMiwgIlNyYyBQb3J0PSIsIHNyY1BvcnQpOworICAgICAgICAgICAgem1fbXNnMl9yeChaTV9MVl8yLCAiRHN0IFBvcnQ9IiwgZHN0UG9ydCk7CisKKyAgICAgICAgICAgIC8qIGV4Y2hhbmdlIHNyYyBpcCBhbmQgZHN0IGlwICovCisgICAgICAgICAgICBmb3IgKGk9MDsgaTwyOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGVtcCA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIDI2KyhpKjIpKTsKKyAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3dyaXRlaChkZXYsIGJ1ZiwgMzArKGkqMiksIHRlbXApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgem13X3J4X2J1Zl93cml0ZWgoZGV2LCBidWYsIDI2LCAweGE4YzApOworICAgICAgICAgICAgem13X3J4X2J1Zl93cml0ZWgoZGV2LCBidWYsIDI4LCAweDBmMDEpOworCisgICAgICAgICAgICAvKiBleGNoYW5nZSBwb3J0ICovCisgICAgICAgICAgICB6bXdfcnhfYnVmX3dyaXRlaChkZXYsIGJ1ZiwgMzQsIHNyY1BvcnQrMSk7CisgICAgICAgICAgICB6bXdfcnhfYnVmX3dyaXRlaChkZXYsIGJ1ZiwgMzYsIGRzdFBvcnQpOworCisgICAgICAgICAgICAvKiBjaGVja3N1bSA9IDAgKi8KKyAgICAgICAgICAgIHptd19yeF9idWZfd3JpdGVoKGRldiwgYnVmLCA0MCwgMCk7CisgICAgICAgIH0KKworICAgIH0KKyAgICBlbHNlIGlmIChldGhUeXBlID09IDB4MDA2MCkgLyogPT4weDAwNjAgaXMgcG9ydCAqLworICAgIHsKKyAgICAgICAgLyogY2hhbmdlIHNyYyBmb3IgRXZsIHRvb2wgbG9vcCBiYWNrIHJlY2VpdmUgKi8KKyAgICAgICAgem13X3J4X2J1Zl93cml0ZWgoZGV2LCBidWYsIDYsIDB4YTAwMCk7CisgICAgICAgIHptd19yeF9idWZfd3JpdGVoKGRldiwgYnVmLCA4LCAweDAwMDApOworICAgICAgICB6bXdfcnhfYnVmX3dyaXRlaChkZXYsIGJ1ZiwgMTAsIDB4MDAwMCk7CisgICAgfQorCit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmaVR4U2VuZEV0aCAgICAgICAgICAgICAgICAqLworLyogICAgICBDYWxsZWQgdG8gbmF0aXZlIDgwMi4xMSBtYW5hZ2VtZW50IGZyYW1lcyAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYnVmIDogYnVmZmVyIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIHBvcnQgOiBXTEFOIHBvcnQsIDA9PnN0YW5kYXJkLCAweDEtMHg3PT5WQVAsIDB4MjAtMHgyNT0+V0RTICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGVycm9yIGNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFJheSAgICAgICAgICAgICBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgIDIwMDUuNSAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UxNl90IHpmaVR4U2VuZDgwMjExTWdtdCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IHBvcnQpCit7CisgICAgdTE2X3QgZXJyOworICAgIC8vdTE2X3QgYWRkclRibFNpemUgPSAwOworICAgIC8vc3RydWN0IHpzQWRkclRibCBhZGRyVGJsOworICAgIHUxNl90IGhsZW47CisgICAgdTE2X3QgaGVhZGVyWygyNCsyNSsxKS8yXTsKKyAgICBpbnQgaTsKKworICAgIGZvcihpPTA7aTwxMjtpKyspCisgICAgeworICAgICAgICBoZWFkZXJbaV0gPSB6bXdfYnVmX3JlYWRoKGRldiwgYnVmLCBpKTsKKyAgICB9CisgICAgaGxlbiA9IDI0OworCisgICAgemZ3QnVmUmVtb3ZlSGVhZChkZXYsIGJ1ZiwgMjQpOworCisgICAgaWYgKChlcnIgPSB6ZkhwU2VuZChkZXYsIGhlYWRlciwgaGxlbiwgTlVMTCwgMCwgTlVMTCwgMCwgYnVmLCAwLAorICAgICAgICAgICAgWk1fRVhURVJOQUxfQUxMT0NfQlVGLCAwLCAwKSkgIT0gWk1fU1VDQ0VTUykKKyAgICB7CisgICAgICAgIGdvdG8gemxFcnJvcjsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKKworemxFcnJvcjoKKworICAgIHpmd0J1ZkZyZWUoZGV2LCBidWYsIDApOworICAgIHJldHVybiAwOworfQorCit1OF90IHpmaUlzVHhRdWV1ZUZ1bGwoemRldl90KiBkZXYpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIGlmICgoKCh3ZC0+dnR4cUhlYWRbMF0gKyAxKSAmIFpNX1ZUWFFfU0laRV9NQVNLKSAhPSB3ZC0+dnR4cVRhaWxbMF0pICkKKyAgICB7CisgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZmlUeFNlbmRFdGggICAgICAgICAgICAgICAgKi8KKy8qICAgICAgQ2FsbGVkIHRvIHRyYW5zbWl0IEV0aGVybmV0IGZyYW1lIGZyb20gdXBwZXIgbGF5ZXIuICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGJ1ZiA6IGJ1ZmZlciBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBwb3J0IDogV0xBTiBwb3J0LCAwPT5zdGFuZGFyZCwgMHgxLTB4Nz0+VkFQLCAweDIwLTB4MjU9PldEUyAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBlcnJvciBjb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBTdGVwaGVuICAgICAgICAgICAgIFp5REFTIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24gICAgMjAwNS41ICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTE2X3QgemZpVHhTZW5kRXRoKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3QgcG9ydCkKK3sKKyAgICB1MTZfdCBlcnIsIHJldDsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIFpNX1BFUkZPUk1BTkNFX1RYX01TRFUoZGV2LCB3ZC0+dGljayk7CisgICAgem1fbXNnMV90eChaTV9MVl8yLCAiemZpVHhTZW5kRXRoKCksIHBvcnQ9IiwgcG9ydCk7CisgICAgLyogUmV0dXJuIGVycm9yIGlmIHBvcnQgaXMgZGlzYWJsZWQgKi8KKyAgICBpZiAoKGVyciA9IHpmVHhQb3J0Q29udHJvbChkZXYsIGJ1ZiwgcG9ydCkpID09IFpNX1BPUlRfRElTQUJMRUQpCisgICAgeworICAgICAgICBlcnIgPSBaTV9FUlJfVFhfUE9SVF9ESVNBQkxFRDsKKyAgICAgICAgZ290byB6bEVycm9yOworICAgIH0KKworI2lmIDEKKyAgICBpZiAoKHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0FQKSAmJiAocG9ydCA8IDB4MjApKQorICAgIHsKKyAgICAgICAgLyogQVAgOiBCdWZmZXIgZnJhbWUgZm9yIHBvd2VyIHNhdmluZyBTVEEgKi8KKyAgICAgICAgaWYgKChyZXQgPSB6ZkFwQnVmZmVyUHNGcmFtZShkZXYsIGJ1ZiwgcG9ydCkpID09IDEpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBaTV9TVUNDRVNTOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyNlbmRpZgorICAgIGlmICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9JTkZSQVNUUlVDVFVSRSkKKyAgICB7CisgICAgICAgIGlmICggemZQb3dlclNhdmluZ01ncklzU2xlZXBpbmcoZGV2KSApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qY2hlY2sgWk1fRU5BQkxFX1BPV0VSX1NBVkUgZmxhZyovCisgICAgICAgICAgICB6ZlBvd2VyU2F2aW5nTWdyV2FrZXVwKGRldik7CisgICAgICAgIH0KKyAgICB9CisjaWZkZWYgWk1fRU5BQkxFX0lCU1NfUFMKKyAgICAvKiBJQlNTIHBvd2VyLXNhdmluZyBtb2RlICovCisgICAgZWxzZSBpZiAoIHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0lCU1MgKQorICAgIHsKKyAgICAgICAgaWYgKCB6ZlN0YUlic3NQU1F1ZXVlRGF0YShkZXYsIGJ1ZikgKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gWk1fU1VDQ0VTUzsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgorCisjaWYgMQorICAgIC8vaWYgKCB3ZC0+YlFvU0VuYWJsZSApCisgICAgaWYgKDEpCisgICAgeworICAgICAgICAvKiBQdXQgdG8gVlRYUVthY10gKi8KKyAgICAgICAgcmV0ID0gemZQdXRWdHhxKGRldiwgYnVmKTsKKworICAgICAgICAvKiBQdXNoIFZUWFFbYWNdICovCisgICAgICAgIHpmUHVzaFZ0eHEoZGV2KTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmV0ID0gemZUeFNlbmRFdGgoZGV2LCBidWYsIHBvcnQsIFpNX0VYVEVSTkFMX0FMTE9DX0JVRiwgMCk7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKKyNlbHNlCisgICAgcmV0dXJuIHpmVHhTZW5kRXRoKGRldiwgYnVmLCBwb3J0LCBaTV9FWFRFUk5BTF9BTExPQ19CVUYsIDApOworI2VuZGlmCisKK3psRXJyb3I6CisgICAgem1fbXNnMl90eChaTV9MVl8xLCAiVHggQ29tcCBlcnI9IiwgZXJyKTsKKworICAgIHpmd0J1ZkZyZWUoZGV2LCBidWYsIGVycik7CisgICAgcmV0dXJuIGVycjsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZUeFNlbmRFdGggICAgICAgICAgICAgICAgICovCisvKiAgICAgIENhbGxlZCB0byB0cmFuc21pdCBFdGhlcm5ldCBmcmFtZSBmcm9tIHVwcGVyIGxheWVyLiAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGRldiA6IGRldmljZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBidWYgOiBidWZmZXIgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgcG9ydCA6IFdMQU4gcG9ydCwgMD0+c3RhbmRhcmQsIDB4MTAtMHgxNz0+VkFQLCAweDIwLTB4MjU9PldEUyAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZXJyb3IgY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiAgICAgICAgICAgICBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgIDIwMDUuNSAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UxNl90IHpmVHhTZW5kRXRoKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3QgcG9ydCwgdTE2X3QgYnVmVHlwZSwgdTE2X3QgZmxhZykKK3sKKyAgICB1MTZfdCBlcnI7CisgICAgLy91MTZfdCBhZGRyVGJsU2l6ZTsKKyAgICAvL3N0cnVjdCB6c0FkZHJUYmwgYWRkclRibDsKKyAgICB1MTZfdCByZW1vdmVMZW47CisgICAgdTE2X3QgaGVhZGVyWyg4KzMwKzIrMTgpLzJdOyAgICAvKiBjdHIrKDQrYTErYTIrYTMrMithNCkrcW9zK2l2ICovCisgICAgdTE2X3QgaGVhZGVyTGVuOworICAgIHUxNl90IG1pY1s4LzJdOworICAgIHUxNl90IG1pY0xlbjsKKyAgICB1MTZfdCBzbmFwWzgvMl07CisgICAgdTE2X3Qgc25hcExlbjsKKyAgICB1MTZfdCBmcmFnTGVuOworICAgIHUxNl90IGZyYW1lTGVuOworICAgIHUxNl90IGZyYWdOdW07CisgICAgc3RydWN0IHpzRnJhZyBmcmFnOworICAgIHUxNl90IGksIGosIGlkOworICAgIHUxNl90IG9mZnNldDsKKyAgICB1MTZfdCBkYVszXTsKKyAgICB1MTZfdCBzYVszXTsKKyAgICB1OF90IHVwOworICAgIHU4X3QgcW9zVHlwZSwga2V5SWR4ID0gMDsKKyAgICB1MTZfdCBmcmFnT2ZmOworICAgIHUxNl90IG5ld0ZsYWc7CisgICAgc3RydWN0IHpzTWljVmFyKiAgcE1pY0tleTsKKyAgICB1OF90IHRraXBGcmFtZU9mZnNldCA9IDA7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgbmV3RmxhZyA9IGZsYWcgJiAweGZmMDA7CisgICAgZmxhZyA9IGZsYWcgJiAweGZmOworCisgICAgem1fbXNnMV90eChaTV9MVl8yLCAiemZUeFNlbmRFdGgoKSwgcG9ydD0iLCBwb3J0KTsKKworICAgIC8qIEdldCBJUCBUT1MgZm9yIFFvUyBBQyBhbmQgSVAgZnJhZyBvZmZzZXQgKi8KKyAgICB6ZlR4R2V0SXBUb3NBbmRGcmFnKGRldiwgYnVmLCAmdXAsICZmcmFnT2ZmKTsKKworICAgIC8vRU9TUCBiaXQKKyAgICBpZiAobmV3RmxhZyAmIDB4MTAwKQorICAgIHsKKyAgICAgICAgdXAgfD0gMHgxMDsKKyAgICB9CisKKyNpZmRlZiBaTV9FTkFCTEVfTkFUSVZFX1dJRkkKKyAgICBpZiAoIHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0lORlJBU1RSVUNUVVJFICkKKyAgICB7CisgICAgICAgIC8qIERBICovCisgICAgICAgIGRhWzBdID0gem13X3R4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMTYpOworICAgICAgICBkYVsxXSA9IHptd190eF9idWZfcmVhZGgoZGV2LCBidWYsIDE4KTsKKyAgICAgICAgZGFbMl0gPSB6bXdfdHhfYnVmX3JlYWRoKGRldiwgYnVmLCAyMCk7CisgICAgICAgIC8qIFNBICovCisgICAgICAgIHNhWzBdID0gem13X3R4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMTApOworICAgICAgICBzYVsxXSA9IHptd190eF9idWZfcmVhZGgoZGV2LCBidWYsIDEyKTsKKyAgICAgICAgc2FbMl0gPSB6bXdfdHhfYnVmX3JlYWRoKGRldiwgYnVmLCAxNCk7CisgICAgfQorICAgIGVsc2UgaWYgKCB3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9JQlNTICkKKyAgICB7CisgICAgICAgIC8qIERBICovCisgICAgICAgIGRhWzBdID0gem13X3R4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgNCk7CisgICAgICAgIGRhWzFdID0gem13X3R4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgNik7CisgICAgICAgIGRhWzJdID0gem13X3R4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgOCk7CisgICAgICAgIC8qIFNBICovCisgICAgICAgIHNhWzBdID0gem13X3R4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMTApOworICAgICAgICBzYVsxXSA9IHptd190eF9idWZfcmVhZGgoZGV2LCBidWYsIDEyKTsKKyAgICAgICAgc2FbMl0gPSB6bXdfdHhfYnVmX3JlYWRoKGRldiwgYnVmLCAxNCk7CisgICAgfQorICAgIGVsc2UgaWYgKCB3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9BUCApCisgICAgeworICAgICAgICAvKiBEQSAqLworICAgICAgICBkYVswXSA9IHptd190eF9idWZfcmVhZGgoZGV2LCBidWYsIDQpOworICAgICAgICBkYVsxXSA9IHptd190eF9idWZfcmVhZGgoZGV2LCBidWYsIDYpOworICAgICAgICBkYVsyXSA9IHptd190eF9idWZfcmVhZGgoZGV2LCBidWYsIDgpOworICAgICAgICAvKiBTQSAqLworICAgICAgICBzYVswXSA9IHptd190eF9idWZfcmVhZGgoZGV2LCBidWYsIDE2KTsKKyAgICAgICAgc2FbMV0gPSB6bXdfdHhfYnVmX3JlYWRoKGRldiwgYnVmLCAxOCk7CisgICAgICAgIHNhWzJdID0gem13X3R4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMjApOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvLworICAgIH0KKyNlbHNlCisgICAgLyogREEgKi8KKyAgICBkYVswXSA9IHptd190eF9idWZfcmVhZGgoZGV2LCBidWYsIDApOworICAgIGRhWzFdID0gem13X3R4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMik7CisgICAgZGFbMl0gPSB6bXdfdHhfYnVmX3JlYWRoKGRldiwgYnVmLCA0KTsKKyAgICAvKiBTQSAqLworICAgIHNhWzBdID0gem13X3R4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgNik7CisgICAgc2FbMV0gPSB6bXdfdHhfYnVmX3JlYWRoKGRldiwgYnVmLCA4KTsKKyAgICBzYVsyXSA9IHptd190eF9idWZfcmVhZGgoZGV2LCBidWYsIDEwKTsKKyNlbmRpZgorICAgIC8vRGVjaWRlIEtleSBJbmRleCBpbiBBVE9NLCBObyBtZWFuaW5nIGluIE9UVVMtLUNXWWFuZyhtKQorICAgIGlmICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9BUCkKKyAgICB7CisgICAgICAgIGtleUlkeCA9IHdkLT5hcC5iY0hhbEtleUlkeFtwb3J0XTsKKyAgICAgICAgaWQgPSB6ZkFwRmluZFN0YShkZXYsIGRhKTsKKyAgICAgICAgaWYgKGlkICE9IDB4ZmZmZikKKyAgICAgICAgeworICAgICAgICAgICAgc3dpdGNoICh3ZC0+YXAuc3RhVGFibGVbaWRdLmVuY3J5TW9kZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgWk1fQUVTOgorICAgICAgICAgICAgY2FzZSBaTV9US0lQOgorI2lmZGVmIFpNX0VOQUJMRV9DRU5DCisgICAgICAgICAgICBjYXNlIFpNX0NFTkM6CisjZW5kaWYgLy9aTV9FTkFCTEVfQ0VOQworICAgICAgICAgICAgICAgIGtleUlkeCA9IHdkLT5hcC5zdGFUYWJsZVtpZF0ua2V5SWR4OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHN3aXRjaCAod2QtPnN0YS5lbmNyeU1vZGUpCisgICAgICAgIHsKKyAgICAgICAgY2FzZSBaTV9XRVA2NDoKKyAgICAgICAgY2FzZSBaTV9XRVAxMjg6CisgICAgICAgIGNhc2UgWk1fV0VQMjU2OgorICAgICAgICAgICAga2V5SWR4ID0gd2QtPnN0YS5rZXlJZDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFpNX0FFUzoKKyAgICAgICAgY2FzZSBaTV9US0lQOgorICAgICAgICAgICAgaWYgKChkYVswXSAmIDB4MSkpCisgICAgICAgICAgICAgICAga2V5SWR4ID0gNTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBrZXlJZHggPSA0OworICAgICAgICAgICAgYnJlYWs7CisjaWZkZWYgWk1fRU5BQkxFX0NFTkMKKyAgICAgICAgY2FzZSBaTV9DRU5DOgorICAgICAgICAgICAga2V5SWR4ID0gd2QtPnN0YS5jZW5jS2V5SWQ7CisgICAgICAgICAgICBicmVhazsKKyNlbmRpZiAvL1pNX0VOQUJMRV9DRU5DCisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBDcmVhdGUgU05BUCAqLworICAgIHJlbW92ZUxlbiA9IHpmVHhHZW5XbGFuU25hcChkZXYsIGJ1Ziwgc25hcCwgJnNuYXBMZW4pOworICAgIC8vem1fbXNnMV90eChaTV9MVl8wLCAiZnJhZ09mZj0iLCBmcmFnT2ZmKTsKKworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiBBZGQgMjAwNzEwMjUgTXh6ZW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAgRXRoZXJuZXQgOiBmcmFtZUxlbiA9IHpmd0J1ZkdldFNpemUoZGV2LCBidWYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAtLS0rLS02LS0rLS02LS0rLS0yLS0rLS0tLS0yMC0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tIFZhcmlhYmxlIC0tLS0tLS0rLS0tLS0tLS0tICovCisvKiAgICB8ICBEQSB8ICBTQSB8IFR5cGV8ICBJUCBIZWFkZXIgfCBUQ1AoMjApIFVEUCgxMikgSUNNUCg4KSB8IEFwcGxpY2F0aW9uIFBheWxvYWQgTCB8ICAgICAgICAgICovCisvKiAtLS0rLS0tLS0rLS0tLS0rLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tICovCisvKiAgTVNEVSA9IDYgKyA2ICsgMiArICggTmV0d29yayBMYXllciBoZWFkZXIgKSArICggVHJhbnNwb3J0IExheWVyIGhlYWRlciApICsgTCAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTVNEVSAtIERBIC0gU0EgOiBmcmFtZUxlbiAtPSByZW1vdmVMZW47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAtLS0rLS0yLS0rLS0tLS0yMC0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tIFZhcmlhYmxlIC0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAgICB8IFR5cGV8IElQIEhlYWRlciAgfCBUQ1AoMjApIFVEUCgxMikgSUNNUCg4KSB8IEFwcGxpY2F0aW9uIFBheWxvYWQgTCB8ICAgICAgICAgICAgICAgICAgICAgICovCisvKiAtLS0rLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKgkJCQkJCQkJCQkJCSAgKi8KKy8qICBNUERVIDogZnJhbWVMZW4gKyBtcGR1TGVuZ3RoT2Zmc2V0IDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIC0rLS0tMi0tLSstLS0tMi0tLSstNi0rLTYtKy0tNi0tKy0tLTItLS0tKy0tMS0tKy0tMS0rLS0tMS0tLSstLS0tLS0tMy0tLS0tLSstZnJhbWVMZW4tKy0tLTQtLSstICovCisvKiAgfCBmcmFtZSB8ZHVyYXRpb258IERBfFNBIHxCU1NJRHxzZXF1ZW5jZXxTTkFQIHxTTkFQfENvbnRyb2x8ICAgIFJGQyAxMDQyICB8ICAgICAgICAgIHwgIEZDUyB8ICAqLworLyogIHxDb250cm9sfCAgICAgICAgfCAgIHwgICB8ICAgICB8IG51bWJlciB8RFNBUCB8U1NBUHwgICAgICAgfCBlbmNhcHN1bGF0aW9ufCAgICAgICAgICB8ICAgICAgfCAgKi8KKy8qIC0rLS0tLS0tLSstLS0tLS0tLSstLS0rLS0tKy0tLS0tKy0tLS0tLS0tKy0tLS0tKy0tLS0rLS0tLS0tLSstLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tKy0tLS0tLSstICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisgICAgaWYgKCB3ZC0+c3RhLmVuY3J5TW9kZSA9PSBaTV9US0lQICkKKyAgICAgICAgdGtpcEZyYW1lT2Zmc2V0ID0gODsKKworICAgIGZyYWdMZW4gPSB3ZC0+ZnJhZ1RocmVzaG9sZCArIHRraXBGcmFtZU9mZnNldDsgICAvLyBGcmFnbWVudGF0aW9uIHRocmVzaG9sZCBmb3IgTVBEVSBMZW5ndGhzCisgICAgZnJhbWVMZW4gPSB6ZndCdWZHZXRTaXplKGRldiwgYnVmKTsgICAgLy8gTVNEVSBMZW5ndGhzCisgICAgZnJhbWVMZW4gLT0gcmVtb3ZlTGVuOyAgICAgICAgICAgICAgICAgLy8gTVNEVSBMZW5ndGhzIC0gREEgLSBTQQorCisgICAgLyogIzFzdCBjcmVhdGUgTUlDIExlbmd0aCBtYW51YWxseSAqLworICAgIG1pY0xlbiA9IDA7CisKKyAgICAvKiBBY2Nlc3MgQ2F0ZWdvcnkgKi8KKyAgICBpZiAod2QtPndsYW5Nb2RlID09IFpNX01PREVfQVApCisgICAgeworICAgICAgICB6ZkFwR2V0U3RhUW9zVHlwZShkZXYsIGRhLCAmcW9zVHlwZSk7CisgICAgICAgIGlmIChxb3NUeXBlID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHVwID0gMDsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9JTkZSQVNUUlVDVFVSRSkKKyAgICB7CisgICAgICAgIGlmICh3ZC0+c3RhLndtZUNvbm5lY3RlZCA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICB1cCA9IDA7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogVE9ETyA6IFNUQSBRb1MgY29udHJvbCBmaWVsZCAqLworICAgICAgICB1cCA9IDA7CisgICAgfQorCisgICAgLyogIzJuZCBBc3NpZ24gc2VxdWVuY2UgbnVtYmVyICovCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICBmcmFnLnNlcVswXSA9ICgod2QtPnNlcVt6Y1VwVG9BY1t1cCYweDddXSsrKSA8PCA0KTsKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgLyogIzNyZCBQYXNzIHRoZSB0b3RhbCBwYXlsb2FkIHRvIGdlbmVyYXRlIE1QRFUgbGVuZ3RoICEgKi8KKyAgICBmcmFnLmJ1ZlswXSA9IGJ1ZjsKKyAgICBmcmFnLmJ1ZlR5cGVbMF0gPSBidWZUeXBlOworICAgIGZyYWcuZmxhZ1swXSA9ICh1OF90KWZsYWc7CisgICAgZnJhZ051bSA9IDE7CisKKyAgICBoZWFkZXJMZW4gPSB6ZlR4R2VuV2xhbkhlYWRlcihkZXYsIGZyYWcuYnVmWzBdLCBoZWFkZXIsIGZyYWcuc2VxWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYWcuZmxhZ1swXSwgc25hcExlbittaWNMZW4sIHJlbW92ZUxlbiwgcG9ydCwgZGEsIHNhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwLCAmbWljTGVuLCBzbmFwLCBzbmFwTGVuLCBOVUxMKTsKKworICAgIC8vem1fZGVidWdfbXNnMSgiIzEgaGVhZGVyTGVuID0gIiwgaGVhZGVyTGVuKTsKKworICAgIC8qICM0dGggQ2hlY2sgdGhlIEhlYWRlckxlbiBhbmQgZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIE1QRFUgTGVuZ3RocyBiaWdnZXIgdGhhbiBGcmFnbWVudGF0aW9uIHRocmVzaG9sZCAgKi8KKyAgICAvKiBJZiBNUERVIExlbmd0aHMgbGFyZ2UgdGhhbiBmcmFnbWVudGF0aW9uIHRocmVzaG9sZCAtLT4gaGVhZGVyTGVuID0gMCAqLworICAgIGlmKCBoZWFkZXJMZW4gIT0gMCApCisgICAgeworICAgICAgICB6ZjgwMjExRnJhbWVTZW5kKGRldiwgZnJhZy5idWZbMF0sIGhlYWRlciwgc25hcExlbiwgZGEsIHNhLCB1cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJMZW4sIHNuYXAsIG1pYywgbWljTGVuLCByZW1vdmVMZW4sIGZyYWcuYnVmVHlwZVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB6Y1VwVG9BY1t1cCYweDddLCBrZXlJZHgpOworICAgIH0KKyAgICBlbHNlIC8vaWYoIGhlYWRlckxlbiA9PSAwICkgLy8gTmVlZCB0byBiZSBmcmFnbWVudGVkCisgICAgeworICAgICAgICB1MTZfdCBtcGR1TGVuZ3RoT2Zmc2V0OworICAgICAgICB1MTZfdCBwc2V1ZFNuYXBMZW4gPSAwOworCisgICAgICAgIG1wZHVMZW5ndGhPZmZzZXQgPSBoZWFkZXJbMF0gLSBmcmFtZUxlbjsgLy8gRm9yIGZyYWdtZW50YXRpb24gdGhyZXNob2xkICEKKworICAgICAgICBtaWNMZW4gPSB6ZlR4R2VuV2xhblRhaWwoZGV2LCBidWYsIHNuYXAsIHNuYXBMZW4sIG1pYyk7IC8vIEdldCBzbmFwIGFuZCBtaWMgaW5mb3JtYXRpb24KKworICAgICAgICBmcmFnTGVuID0gZnJhZ0xlbiAtIG1wZHVMZW5ndGhPZmZzZXQ7CisKKyAgICAgICAgLy96bV9kZWJ1Z19tc2cxKCIjMiBmcmFtZUxlbiA9ICIsIGZyYW1lTGVuKTsKKyAgICAgICAgLy96bV9kZWJ1Z19tc2cxKCIjMyBmcmFnVGhyZXNob2xkID0gIiwgZnJhZ0xlbik7CisKKyAgICAgICAgLyogZnJhZ21lbnRhdGlvbiAqLworICAgICAgICBpZiAoZnJhbWVMZW4gPj0gZnJhZ0xlbikKKyAgICAgICAgeworICAgICAgICAgICAgLy9jb3B5IGZyYWdMZW4gdG8gZnJhZworICAgICAgICAgICAgaSA9IDA7CisgICAgICAgICAgICB3aGlsZSggZnJhbWVMZW4gPiAwICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKGZyYWcuYnVmW2ldID0gemZ3QnVmQWxsb2NhdGUoZGV2LCBmcmFnTGVuKzMyKSkgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZyYWcuYnVmVHlwZVtpXSA9IFpNX0lOVEVSTkFMX0FMTE9DX0JVRjsKKyAgICAgICAgICAgICAgICAgICAgZnJhZy5zZXFbaV0gPSBmcmFnLnNlcVswXSArIGk7CisgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IHJlbW92ZUxlbiArIGkqZnJhZ0xlbjsKKworICAgICAgICAgICAgICAgICAgICAvKiBDb25zaWRlciB0aGUgb2Zmc2V0IGlmIHdlIGNvbnNpZGVyIHNuYXAgbGVuZ3RoIHRvIHRoZSBvdGhlciBmcmFnbWVudGVkIGZyYW1lICovCisgICAgICAgICAgICAgICAgICAgIGlmICggaSA+PSAxICkKKyAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IG9mZnNldCArIHBzZXVkU25hcExlbiooaS0xKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoZnJhbWVMZW4gPiBmcmFnTGVuICsgcHNldWRTbmFwTGVuKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBmcmFnLmZsYWdbaV0gPSBmbGFnIHwgMHg0OyAvKiBNb3JlIGRhdGEgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZpcnN0IGZyYWdtZW50ICovCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFkZCBTTkFQICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChqPTA7IGo8c25hcExlbjsgais9MikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHptd190eF9idWZfd3JpdGVoKGRldiwgZnJhZy5idWZbaV0sIGosIHNuYXBbKGo+PjEpXSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpmVHhCdWZmZXJDb3B5KGRldiwgZnJhZy5idWZbaV0sIGJ1Ziwgc25hcExlbiwgb2Zmc2V0LCBmcmFnTGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ZndCdWZTZXRTaXplKGRldiwgZnJhZy5idWZbaV0sIHNuYXBMZW4rZnJhZ0xlbik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBZGQgcHNldWQgc25hcCBsZW5ndGggdG8gdGhlIG90aGVyIGZyYWdtZW50ZWQgZnJhbWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc2V1ZFNuYXBMZW4gPSBzbmFwTGVuOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVMZW4gLT0gZnJhZ0xlbjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEludGVybWVkaWF0ZSBGcmFnbWVudCAqLworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vemZUeEJ1ZmZlckNvcHkoZGV2LCBmcmFnLmJ1ZltpXSwgYnVmLCAwLCBvZmZzZXQsIGZyYWdMZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vemZ3QnVmU2V0U2l6ZShkZXYsIGZyYWcuYnVmW2ldLCBmcmFnTGVuKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpmVHhCdWZmZXJDb3B5KGRldiwgZnJhZy5idWZbaV0sIGJ1ZiwgMCwgb2Zmc2V0LCBmcmFnTGVuK3BzZXVkU25hcExlbiApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpmd0J1ZlNldFNpemUoZGV2LCBmcmFnLmJ1ZltpXSwgZnJhZ0xlbitwc2V1ZFNuYXBMZW4pOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVMZW4gLT0gKGZyYWdMZW4rcHNldWRTbmFwTGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vZnJhbWVMZW4gLT0gZnJhZ0xlbjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIExhc3QgZnJhZ21lbnQgICovCisgICAgICAgICAgICAgICAgICAgICAgICB6ZlR4QnVmZmVyQ29weShkZXYsIGZyYWcuYnVmW2ldLCBidWYsIDAsIG9mZnNldCwgZnJhbWVMZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgLyogQWRkIE1JQyBpZiBuZWVkICovCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIG1pY0xlbiApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgemZDb3B5VG9SeEJ1ZmZlcihkZXYsIGZyYWcuYnVmW2ldLCAodThfdCopIG1pYywgZnJhbWVMZW4sIG1pY0xlbik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB6ZndCdWZTZXRTaXplKGRldiwgZnJhZy5idWZbaV0sIGZyYW1lTGVuK21pY0xlbik7CisgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUxlbiA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBmcmFnLmZsYWdbaV0gPSAodThfdClmbGFnOyAvKiBObyBtb3JlIGRhdGEgKi8KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIFBsZWFzZSBwYXkgYXR0ZW50aW9uIHRvIHRoZSBpbmRleCBvZiB0aGUgYnVmICEhIQorICAgICAgICAgICAgICAgIC8vIElmIHdyaXRlIHRvIG51bGwgYnVmICwgdGhlIE9TIHdpbGwgY3Jhc2ggISEhCisgICAgICAgICAgICAgICAgemZ3Q29weUJ1ZkNvbnRleHQoZGV2LCBidWYsIGZyYWcuYnVmW2ktMV0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZnJhZ051bSA9IGk7CisgICAgICAgICAgICBzbmFwTGVuID0gbWljTGVuID0gcmVtb3ZlTGVuID0gMDsKKworICAgICAgICAgICAgemZ3QnVmRnJlZShkZXYsIGJ1ZiwgMCk7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGk9MDsgaTxmcmFnTnVtOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIENyZWF0ZSBXTEFOIGhlYWRlcihDb250cm9sIFNldHRpbmcgKyA4MDIuMTEgaGVhZGVyICsgSVYpICovCisgICAgICAgICAgICBoZWFkZXJMZW4gPSB6ZlR4R2VuV2xhbkhlYWRlcihkZXYsIGZyYWcuYnVmW2ldLCBoZWFkZXIsIGZyYWcuc2VxW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhZy5mbGFnW2ldLCBzbmFwTGVuK21pY0xlbiwgcmVtb3ZlTGVuLCBwb3J0LCBkYSwgc2EsIHVwLCAmbWljTGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc25hcCwgc25hcExlbiwgTlVMTCk7CisKKyAgICAgICAgICAgIHpmODAyMTFGcmFtZVNlbmQoZGV2LCBmcmFnLmJ1ZltpXSwgaGVhZGVyLCBzbmFwTGVuLCBkYSwgc2EsIHVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJMZW4sIHNuYXAsIG1pYywgbWljTGVuLCByZW1vdmVMZW4sIGZyYWcuYnVmVHlwZVtpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemNVcFRvQWNbdXAmMHg3XSwga2V5SWR4KTsKKworICAgICAgICB9IC8qIGZvciAoaT0wOyBpPGZyYWdOdW07IGkrKykgKi8KKyAgICB9CisKKyAgICByZXR1cm4gWk1fU1VDQ0VTUzsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZUeFBvcnRDb250cm9sICAgICAgICAgICAgICovCisvKiAgICAgIENoZWNrIHBvcnQgc3RhdHVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGJ1ZiA6IGJ1ZmZlciBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBwb3J0IDogcG9ydCBudW1iZXIsIDA9PnN0YW5kYXJkLCAxMC0xNz0+VmlydHVhbCBBUCwgMjAtMjU9PldEUyAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBaTV9QT1JUX0VOQUJMRUQgb3IgWk1fUE9SVF9ESVNBQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBTaWduYXR1cmUgICAgICAgICAgIFp5REFTIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24gICAgMjAwNS40ICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTE2X3QgemZUeFBvcnRDb250cm9sKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3QgcG9ydCkKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBpZiAoIHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0lORlJBU1RSVUNUVVJFICkKKyAgICB7CisgICAgICAgIGlmICggd2QtPnN0YS5hZGFwdGVyU3RhdGUgPT0gWk1fU1RBX1NUQVRFX0RJU0NPTk5FQ1QgKQorICAgICAgICB7CisgICAgICAgICAgICB6bV9tc2cwX3R4KFpNX0xWXzMsICJQYWNrZXRzIGRyb3BwZWQgZHVlIHRvIGRpc2Nvbm5lY3Qgc3RhdGUiKTsKKyAgICAgICAgICAgIHJldHVybiBaTV9QT1JUX0RJU0FCTEVEOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIFpNX1BPUlRfRU5BQkxFRDsKK30KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZklkbFJlY3YgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgRG8gZnJhbWUgdmFsaWRhdGlvbiBhbmQgZmlsdGVyaW5nIHRoZW4gcGFzcyB0byB6ZndSZWN2ODAyMTEoKS4gICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGJ1ZiA6IHJlY2VpdmVkIDgwMi4xMSBmcmFtZSBidWZmZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIE5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFN0ZXBoZW4gICAgICAgICAgICAgWnlEQVMgVGVjaG5vbG9neSBDb3Jwb3JhdGlvbiAgICAyMDA1LjEwICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHpmQ29yZVJlY3YoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCBzdHJ1Y3QgenNBZGRpdGlvbkluZm8qIGFkZEluZm8pCit7CisgICAgdTE2X3QgcmV0ID0gMDsKKyAgICB1MTZfdCBic3NpZFszXTsKKyAgICBzdHJ1Y3QgYWdnX3RpZF9yeCAqdGlkX3J4OworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIFpNX0JVRkZFUl9UUkFDRShkZXYsIGJ1ZikKKworICAgIC8qIHRhbGx5ICovCisgICAgd2QtPmNvbW1UYWxseS5Ecml2ZXJSeEZybUNudCsrOworCisgICAgYnNzaWRbMF0gPSB6bXdfYnVmX3JlYWRoKGRldiwgYnVmLCAxNik7CisgICAgYnNzaWRbMV0gPSB6bXdfYnVmX3JlYWRoKGRldiwgYnVmLCAxOCk7CisgICAgYnNzaWRbMl0gPSB6bXdfYnVmX3JlYWRoKGRldiwgYnVmLCAyMCk7CisKKyAgICAvKiBWYWxpZGF0ZSBSeCBmcmFtZSAqLworICAgIGlmICgocmV0ID0gemZXbGFuUnhWYWxpZGF0ZShkZXYsIGJ1ZikpICE9IFpNX1NVQ0NFU1MpCisgICAgeworICAgICAgICB6bV9tc2cxX3J4KFpNX0xWXzEsICJSeCBpbnZhbGlkOiIsIHJldCk7CisgICAgICAgIGdvdG8gemxFcnJvcjsKKyAgICB9CisKKyNpZmRlZiBaTV9FTkFCTEVfQUdHUkVHQVRJT04KKyAgICAvLyNpZm5kZWYgWk1fRU5BQkxFX0ZXX0JBX1JFVFJBTlNNSVNTSU9OCisgICAgLyoKKyAgICAgKiBhZGQgYnkgaG9uZGEKKyAgICAgKi8KKyAgICB0aWRfcnggPSB6ZkFnZ1J4RW5hYmxlZChkZXYsIGJ1Zik7CisgICAgaWYgKHRpZF9yeCAmJiB3ZC0+cmVvcmRlcikKKyAgICB7CisgICAgICAgIHpmQWdnUngoZGV2LCBidWYsIGFkZEluZm8sIHRpZF9yeCk7CisKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAvKgorICAgICAqIGVuZCBvZiBhZGQgYnkgaG9uZGEKKyAgICAgKi8KKyAgICAvLyNlbmRpZgorI2VuZGlmCisKKyAgICAvKiBGaWx0ZXIgUnggZnJhbWUgKi8KKyAgICBpZiAoKHJldCA9IHpmV2xhblJ4RmlsdGVyKGRldiwgYnVmKSkgIT0gWk1fU1VDQ0VTUykKKyAgICB7CisgICAgICAgIHptX21zZzFfcngoWk1fTFZfMSwgIlJ4IGR1cGxpY2F0ZWQ6IiwgcmV0KTsKKyAgICAgICAgZ290byB6bEVycm9yOworICAgIH0KKworICAgIC8qIERpc2NhcmQgZXJyb3IgZnJhbWUgZXhjZXB0IG1pYyBmYWlsdXJlICovCisgICAgaWYgKChhZGRJbmZvLT5UYWlsLkRhdGEuRXJyb3JJbmRpY2F0aW9uICYgMHgzZikgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICggd2QtPlhMaW5rTW9kZSAmJiAoKGFkZEluZm8tPlRhaWwuRGF0YS5FcnJvckluZGljYXRpb24gJiAweDNmKT09MHgxMCkgJiYKKyAgICAgICAgICAgICB6ZkNvbXBhcmVXaXRoQnNzaWQoZGV2LCBic3NpZCkgKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBCeXBhc3MgZnJhbWVzICEhIQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgZ290byB6bEVycm9yOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKiBPVFVTIGNvbW1hbmQtODIxMiBkdW1wIHJ4IHBhY2tldCAqLworICAgIGlmICh3ZC0+cnhQYWNrZXREdW1wKQorICAgIHsKKyAgICAgICAgemZ3RHVtcEJ1ZihkZXYsIGJ1Zik7CisgICAgfQorCisgICAgLyogQ2FsbCB6ZndSZWN2ODAyMTEoKSB3cmFwcGVyIGZ1bmN0aW9uIHRvIGRlbGl2ZXIgUnggcGFja2V0ICovCisgICAgLyogdG8gZHJpdmVyIGZyYW1ld29yay4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgICBpZiAod2QtPnpmY2JSZWN2ODAyMTEgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHdkLT56ZmNiUmVjdjgwMjExKGRldiwgYnVmLCBhZGRJbmZvKTsgLy9DV1lhbmcobSkKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgemZpUmVjdjgwMjExKGRldiwgYnVmLCBhZGRJbmZvKTsKKyAgICB9CisgICAgcmV0dXJuOworCit6bEVycm9yOgorICAgIHptX21zZzFfcngoWk1fTFZfMSwgIkZyZWUgcGFja2V0LCBlcnJvciBjb2RlOiIsIHJldCk7CisKKyAgICB3ZC0+Y29tbVRhbGx5LkRyaXZlckRpc2NhcmRlZEZybSsrOworCisgICAgLyogRnJlZSBSeCBidWZmZXIgKi8KKyAgICB6ZndCdWZGcmVlKGRldiwgYnVmLCAwKTsKKworICAgIHJldHVybjsKK30KKworCit2b2lkIHpmU2hvd1J4RUFQT0woemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCBvZmZzZXQpCit7CisgICAgdThfdCAgIHBhY2tldFR5cGUsIGtleVR5cGUsIGNvZGUsIGlkZW50aWZpZXIsIHR5cGUsIGZsYWdzOworICAgIHUxNl90ICBwYWNrZXRMZW4sIGtleUluZm8sIGtleUxlbiwga2V5RGF0YUxlbiwgbGVuZ3RoLCBPcF9Db2RlOworICAgIHUzMl90ICByZXBsYXlDb3VudGVySCwgcmVwbGF5Q291bnRlckwsIHZlbmRvcklkLCBWZW5kb3JUeXBlOworCisgICAgLyogRUFQT0wgcGFja2V0IHR5cGUgKi8KKyAgICBwYWNrZXRUeXBlID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzEpOyAvLyAwOiBFQVAtUGFja2V0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMTogRUFQT0wtU3RhcnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAyOiBFQVBPTC1Mb2dvZmYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAzOiBFQVBPTC1LZXkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA0OiBFQVBPTC1FbmNhcHN1bGF0ZWQtQVNGLUFsZXJ0CisKKyAgICAvKiBFQVBPTCBmcmFtZSBmb3JtYXQgKi8KKyAgICAvKiAgMCAgMSAgMiAgMyAgNCAgNSAgNiAgNyAgOCAgOSAxMCAxMSAxMiAxMyAxNCAxNSAgICovCisgICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAqLworICAgIC8qICAgICAgICAgICAgUEFFIEV0aGVybmV0IFR5cGUgKDB4ODg4ZSkgICAgICAgICAgICAgKi8KKyAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAyICovCisgICAgLyogICAgIFByb3RvY29sIFZlcnNpb24gICAgfCAgICAgICAgIFR5cGUgICAgICAgICAgICAqLworICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIDQgKi8KKyAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgTGVuZ3RoICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gNiAqLworICAgIC8qICAgICAgICAgICAgICAgICAgICBQYWNrZXQgQm9keSAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBOICovCisKKyAgICAvKiBFQVBPTCBib2R5IGxlbmd0aCAqLworICAgIHBhY2tldExlbiA9ICgoKHUxNl90KSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMikpIDw8IDgpICsKKyAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMyk7CisKKyAgICBpZiggcGFja2V0VHlwZSA9PSAwICkKKyAgICB7IC8vIEVBUC1QYWNrZXQKKworICAgICAgICAvKiBFQVAtUGFja2V0IENvZGUgKi8KKyAgICAgICAgY29kZSA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCs0KTsgLy8gMSA6IFJlcXVlc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMiA6IFJlc3BvbnNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDMgOiBTdWNjZXNzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDQgOiBGYWlsdXJlCisgICAgICAgIC8vIEFuIEVBUCBwYWNrZXQgb2YgdGhlIHR5cGUgb2YgU3VjY2VzcyBhbmQgRmFpbHVyZSBoYXMgbm8gRGF0YSBmaWVsZCwgYW5kIGhhcyBhIGxlbmd0aCBvZiA0LgorCisgICAgICAgIC8qIEVBUCBQYWNrZXQgZm9ybWF0ICovCisgICAgICAgIC8qICAwICAxICAyICAzICA0ICA1ICA2ICA3ICA4ICA5IDEwIDExIDEyIDEzIDE0IDE1ICAgKi8KKyAgICAgICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAqLworICAgICAgICAvKiAgICAgICAgICAgQ29kZSAgICAgICAgICB8ICAgICAgICBJZGVudGlmaWVyICAgICAgICovCisgICAgICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIDIgKi8KKyAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgIExlbmd0aCAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSA0ICovCisgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTiAqLworCisgICAgICAgIHptX2RlYnVnX21zZzAoIkVBUC1QYWNrZXQiKTsKKyAgICAgICAgem1fZGVidWdfbXNnMSgiUGFja2V0IExlbmd0aCA9ICIsIHBhY2tldExlbik7CisgICAgICAgIHptX2RlYnVnX21zZzEoIkVBUC1QYWNrZXQgQ29kZSA9ICIsIGNvZGUpOworCisgICAgICAgIGlmKCBjb2RlID09IDEgKQorICAgICAgICB7CisgICAgICAgICAgICB6bV9kZWJ1Z19tc2cwKCJFQVAtUGFja2V0IFJlcXVlc3QiKTsKKworICAgICAgICAgICAgLyogRUFQLVBhY2tldCBJZGVudGlmaWVyICovCisgICAgICAgICAgICBpZGVudGlmaWVyID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzUpOworICAgICAgICAgICAgLyogRUFQLVBhY2tldCBMZW5ndGggKi8KKyAgICAgICAgICAgIGxlbmd0aCA9ICgoKHUxNl90KSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrNikpIDw8IDgpICsKKyAgICAgICAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrNyk7CisgICAgICAgICAgICAvKiBFQVAtUGFja2V0IFR5cGUgKi8KKyAgICAgICAgICAgIHR5cGUgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrOCk7IC8vIDEgICA6IElkZW50aXR5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAyICAgOiBOb3RpZmljYXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDMgICA6IE5hayAoUmVzcG9uc2UgT25seSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDQgICA6IE1ENS1DaGFsbGVuZ2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDUgICA6IE9uZSBUaW1lIFBhc3N3b3JkIChPVFApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA2ICAgOiBHZW5lcmljIFRva2VuIENhcmQgKEdUQykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDI1NCA6IChFeHBhbmRlZCBUeXBlcylXaS1GaSBQcm90ZWN0ZWQgU2V0dXAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDI1NSA6IEV4cGVyaW1lbnRhbCBVc2UKKworICAgICAgICAgICAgLyogVGhlIGRhdGEgZmllbGQgaW4gYW4gRUFQIHBhY2tldCBvZiB0aGUgdHlwZSBvZiBSZXF1ZXN0IG9yIFJlc3BvbnNlIGlzIGluIHRoZSBmb3JtYXQgc2hvd24gYmVsbG93aW5nICovCisgICAgICAgICAgICAvKiAgMCAgMSAgMiAgMyAgNCAgNSAgNiAgNyAgICAgICAgICAgICBOICAgICAgICAgICAgICovCisgICAgICAgICAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICovCisgICAgICAgICAgICAvKiAgICAgICAgICAgVHlwZSAgICAgICAgICB8ICAgICAgICBUeXBlIERhdGEgICAgICAgICovCisgICAgICAgICAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICovCisKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzEoIkVBUC1QYWNrZXQgSWRlbnRpZmllciA9ICIsIGlkZW50aWZpZXIpOworICAgICAgICAgICAgem1fZGVidWdfbXNnMSgiRUFQLVBhY2tldCBMZW5ndGggPSAiLCBsZW5ndGgpOworICAgICAgICAgICAgem1fZGVidWdfbXNnMSgiRUFQLVBhY2tldCBUeXBlID0gIiwgdHlwZSk7CisKKyAgICAgICAgICAgIGlmKCB0eXBlID09IDEgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIkVBUC1QYWNrZXQgUmVxdWVzdCBJZGVudGl0eSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiggdHlwZSA9PSAyICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6bV9kZWJ1Z19tc2cwKCJFQVAtUGFja2V0IFJlcXVlc3QgTm90aWZpY2F0aW9uIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmKCB0eXBlID09IDQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIkVBUC1QYWNrZXQgUmVxdWVzdCBNRDUtQ2hhbGxlbmdlIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmKCB0eXBlID09IDUgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIkVBUC1QYWNrZXQgUmVxdWVzdCBPbmUgVGltZSBQYXNzd29yZCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiggdHlwZSA9PSA2ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6bV9kZWJ1Z19tc2cwKCJFQVAtUGFja2V0IFJlcXVlc3QgR2VuZXJpYyBUb2tlbiBDYXJkIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmKCB0eXBlID09IDI1NCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiRUFQLVBhY2tldCBSZXF1ZXN0IFdpLUZpIFByb3RlY3RlZCBTZXR1cCIpOworCisgICAgICAgICAgICAgICAgLyogMCAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgICAgICAgMyAgICovCisgICAgICAgICAgICAgICAgLyogMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxICovCisgICAgICAgICAgICAgICAgLyorLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKyovCisgICAgICAgICAgICAgICAgLyp8ICAgICBUeXBlICAgICAgfCAgICAgICAgICAgICAgIFZlbmRvci1JZCAgICAgICAgICAgICAgICAgICAgICAgfCovCisgICAgICAgICAgICAgICAgLyorLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKyovCisgICAgICAgICAgICAgICAgLyp8ICAgICAgICAgICAgICAgICAgICAgICAgICBWZW5kb3ItVHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgfCovCisgICAgICAgICAgICAgICAgLyorLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKyovCisgICAgICAgICAgICAgICAgLyp8ICAgICAgICAgICAgICBWZW5kb3IgZGF0YS4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgLyorLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKyAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgICAgICAgICAgICAgICAvKiBFQVAtUGFja2V0IFZlbmRvciBJRCAqLworICAgICAgICAgICAgICAgIHZlbmRvcklkID0gKCgodTMyX3QpIHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCs5KSkgPDwgMTYpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKHUzMl90KSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMTApKSA8PCA4KSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMTEpOworICAgICAgICAgICAgICAgIC8qIEVBUC1QYWNrZXQgVmVuZG9yIFR5cGUgKi8KKyAgICAgICAgICAgICAgICBWZW5kb3JUeXBlID0gKCgodTMyX3QpIHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxMikpIDw8IDI0KSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKHUzMl90KSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMTMpKSA8PCAxNikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKCh1MzJfdCkgem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzE0KSkgPDwgOCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMTUpOworICAgICAgICAgICAgICAgIC8qIEVBUC1QYWNrZXQgT3AgQ29kZSAqLworICAgICAgICAgICAgICAgIE9wX0NvZGUgPSAoKCh1MTZfdCkgem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzE2KSkgPDwgOCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMTcpOworICAgICAgICAgICAgICAgIC8qIEVBUC1QYWNrZXQgRmxhZ3MgKi8KKyAgICAgICAgICAgICAgICBmbGFncyA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxOCk7CisKKyAgICAgICAgICAgICAgICB6bV9kZWJ1Z19tc2cxKCJFQVAtUGFja2V0IFZlbmRvciBJRCA9ICIsIHZlbmRvcklkKTsKKyAgICAgICAgICAgICAgICB6bV9kZWJ1Z19tc2cxKCJFQVAtUGFja2V0IFZlbm9kciBUeXBlID0gIiwgVmVuZG9yVHlwZSk7CisgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMSgiRUFQLVBhY2tldCBPcCBDb2RlID0gIiwgT3BfQ29kZSk7CisgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMSgiRUFQLVBhY2tldCBGbGFncyA9ICIsIGZsYWdzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmKCBjb2RlID09IDIgKQorICAgICAgICB7CisgICAgICAgICAgICB6bV9kZWJ1Z19tc2cwKCJFQVAtUGFja2V0IFJlc3BvbnNlIik7CisKKyAgICAgICAgICAgIC8qIEVBUC1QYWNrZXQgSWRlbnRpZmllciAqLworICAgICAgICAgICAgaWRlbnRpZmllciA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCs1KTsKKyAgICAgICAgICAgIC8qIEVBUC1QYWNrZXQgTGVuZ3RoICovCisgICAgICAgICAgICBsZW5ndGggPSAoKCh1MTZfdCkgem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzYpKSA8PCA4KSArCisgICAgICAgICAgICAgICAgICAgICAgem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzcpOworICAgICAgICAgICAgLyogRUFQLVBhY2tldCBUeXBlICovCisgICAgICAgICAgICB0eXBlID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzgpOworCisgICAgICAgICAgICB6bV9kZWJ1Z19tc2cxKCJFQVAtUGFja2V0IElkZW50aWZpZXIgPSAiLCBpZGVudGlmaWVyKTsKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzEoIkVBUC1QYWNrZXQgTGVuZ3RoID0gIiwgbGVuZ3RoKTsKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzEoIkVBUC1QYWNrZXQgVHlwZSA9ICIsIHR5cGUpOworCisgICAgICAgICAgICBpZiggdHlwZSA9PSAxICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6bV9kZWJ1Z19tc2cwKCJFQVAtUGFja2V0IFJlc3BvbnNlIElkZW50aXR5Iik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmKCB0eXBlID09IDIgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIkVBUC1QYWNrZXQgUmVxdWVzdCBOb3RpZmljYXRpb24iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYoIHR5cGUgPT0gMyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiRUFQLVBhY2tldCBSZXF1ZXN0IE5hayIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiggdHlwZSA9PSA0ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6bV9kZWJ1Z19tc2cwKCJFQVAtUGFja2V0IFJlcXVlc3QgTUQ1LUNoYWxsZW5nZSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiggdHlwZSA9PSA1ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6bV9kZWJ1Z19tc2cwKCJFQVAtUGFja2V0IFJlcXVlc3QgT25lIFRpbWUgUGFzc3dvcmQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYoIHR5cGUgPT0gNiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiRUFQLVBhY2tldCBSZXF1ZXN0IEdlbmVyaWMgVG9rZW4gQ2FyZCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiggdHlwZSA9PSAyNTQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIkVBUC1QYWNrZXQgUmVzcG9uc2UgV2ktRmkgUHJvdGVjdGVkIFNldHVwIik7CisKKyAgICAgICAgICAgICAgICAvKiBFQVAtUGFja2V0IFZlbmRvciBJRCAqLworICAgICAgICAgICAgICAgIHZlbmRvcklkID0gKCgodTMyX3QpIHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCs5KSkgPDwgMTYpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKHUzMl90KSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMTApKSA8PCA4KSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMTEpOworICAgICAgICAgICAgICAgIC8qIEVBUC1QYWNrZXQgVmVuZG9yIFR5cGUgKi8KKyAgICAgICAgICAgICAgICBWZW5kb3JUeXBlID0gKCgodTMyX3QpIHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxMikpIDw8IDI0KSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKHUzMl90KSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMTMpKSA8PCAxNikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKCh1MzJfdCkgem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzE0KSkgPDwgOCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMTUpOworICAgICAgICAgICAgICAgIC8qIEVBUC1QYWNrZXQgT3AgQ29kZSAqLworICAgICAgICAgICAgICAgIE9wX0NvZGUgPSAoKCh1MTZfdCkgem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzE2KSkgPDwgOCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMTcpOworICAgICAgICAgICAgICAgIC8qIEVBUC1QYWNrZXQgRmxhZ3MgKi8KKyAgICAgICAgICAgICAgICBmbGFncyA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxOCk7CisKKyAgICAgICAgICAgICAgICB6bV9kZWJ1Z19tc2cxKCJFQVAtUGFja2V0IFZlbmRvciBJRCA9ICIsIHZlbmRvcklkKTsKKyAgICAgICAgICAgICAgICB6bV9kZWJ1Z19tc2cxKCJFQVAtUGFja2V0IFZlbm9kciBUeXBlID0gIiwgVmVuZG9yVHlwZSk7CisgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMSgiRUFQLVBhY2tldCBPcCBDb2RlID0gIiwgT3BfQ29kZSk7CisgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMSgiRUFQLVBhY2tldCBGbGFncyA9ICIsIGZsYWdzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmKCBjb2RlID09IDMgKQorICAgICAgICB7CisgICAgICAgICAgICB6bV9kZWJ1Z19tc2cwKCJFQVAtUGFja2V0IFN1Y2Nlc3MiKTsKKworICAgICAgICAgICAgLyogRUFQLVBhY2tldCBJZGVudGlmaWVyICovCisgICAgICAgICAgICBpZGVudGlmaWVyID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzUpOworICAgICAgICAgICAgLyogRUFQLVBhY2tldCBMZW5ndGggKi8KKyAgICAgICAgICAgIGxlbmd0aCA9ICgoKHUxNl90KSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrNikpIDw8IDgpICsKKyAgICAgICAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrNyk7CisKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzEoIkVBUC1QYWNrZXQgSWRlbnRpZmllciA9ICIsIGlkZW50aWZpZXIpOworICAgICAgICAgICAgem1fZGVidWdfbXNnMSgiRUFQLVBhY2tldCBMZW5ndGggPSAiLCBsZW5ndGgpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYoIGNvZGUgPT0gNCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIkVBUC1QYWNrZXQgRmFpbHVyZSIpOworCisgICAgICAgICAgICAvKiBFQVAtUGFja2V0IElkZW50aWZpZXIgKi8KKyAgICAgICAgICAgIGlkZW50aWZpZXIgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrNSk7CisgICAgICAgICAgICAvKiBFQVAtUGFja2V0IExlbmd0aCAqLworICAgICAgICAgICAgbGVuZ3RoID0gKCgodTE2X3QpIHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCs2KSkgPDwgOCkgKworICAgICAgICAgICAgICAgICAgICAgIHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCs3KTsKKworICAgICAgICAgICAgem1fZGVidWdfbXNnMSgiRUFQLVBhY2tldCBJZGVudGlmaWVyID0gIiwgaWRlbnRpZmllcik7CisgICAgICAgICAgICB6bV9kZWJ1Z19tc2cxKCJFQVAtUGFja2V0IExlbmd0aCA9ICIsIGxlbmd0aCk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiggcGFja2V0VHlwZSA9PSAxICkKKyAgICB7IC8vIEVBUE9MLVN0YXJ0CisgICAgICAgIHptX2RlYnVnX21zZzAoIkVBUE9MLVN0YXJ0Iik7CisgICAgfQorICAgIGVsc2UgaWYoIHBhY2tldFR5cGUgPT0gMiApCisgICAgeyAvLyBFQVBPTC1Mb2dvZmYKKyAgICAgICAgem1fZGVidWdfbXNnMCgiRUFQT0wtTG9nb2ZmIik7CisgICAgfQorICAgIGVsc2UgaWYoIHBhY2tldFR5cGUgPT0gMyApCisgICAgeyAvLyBFQVBPTC1LZXkKKyAgICAgICAgLyogRUFQT0wtS2V5IHR5cGUgKi8KKyAgICAgICAga2V5VHlwZSA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCs0KTsKKyAgICAgICAgLyogRUFQT0wtS2V5IGluZm9ybWF0aW9uICovCisgICAgICAgIGtleUluZm8gPSAoKCh1MTZfdCkgem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzUpKSA8PCA4KSArCisgICAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrNik7CisgICAgICAgIC8qIEVBUE9MLUtleSBsZW5ndGggKi8KKyAgICAgICAga2V5TGVuID0gKCgodTE2X3QpIHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCs3KSkgPDwgOCkgKworICAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrOCk7CisgICAgICAgIC8qIEVBUE9MLUtleSByZXBsYXkgY291bnRlciAoaGlnaCBkb3VibGUgd29yZCkgKi8KKyAgICAgICAgcmVwbGF5Q291bnRlckggPSAoKCh1MzJfdCkgem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzkpKSA8PCAyNCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICgoKHUzMl90KSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMTApKSA8PCAxNikgKworICAgICAgICAgICAgICAgICAgICAgICAgICgoKHUzMl90KSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMTEpKSA8PCA4KSArCisgICAgICAgICAgICAgICAgICAgICAgICAgem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzEyKTsKKyAgICAgICAgLyogRUFQT0wtS2V5IHJlcGxheSBjb3VudGVyIChsb3cgZG91YmxlIHdvcmQpICovCisgICAgICAgIHJlcGxheUNvdW50ZXJMID0gKCgodTMyX3QpIHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxMykpIDw8IDI0KSArCisgICAgICAgICAgICAgICAgICAgICAgICAgKCgodTMyX3QpIHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxNCkpIDw8IDE2KSArCisgICAgICAgICAgICAgICAgICAgICAgICAgKCgodTMyX3QpIHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxNSkpIDw8IDgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMTYpOworICAgICAgICAvKiBFQVBPTC1LZXkgZGF0YSBsZW5ndGggKi8KKyAgICAgICAga2V5RGF0YUxlbiA9ICgoKHUxNl90KSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrOTcpKSA8PCA4KSArCisgICAgICAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrOTgpOworCisgICAgICAgIHptX2RlYnVnX21zZzAoIkVBUE9MLUtleSIpOworICAgICAgICB6bV9kZWJ1Z19tc2cxKCJwYWNrZXQgbGVuZ3RoID0gIiwgcGFja2V0TGVuKTsKKworICAgICAgICBpZiAoIGtleVR5cGUgPT0gMjU0ICkKKyAgICAgICAgeworICAgICAgICAgICAgem1fZGVidWdfbXNnMCgia2V5IHR5cGUgPSAyNTQgKFNTTiBrZXkgZGVzY3JpcHRvcikiKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzIoImtleSB0eXBlID0gMHgiLCBrZXlUeXBlKTsKKyAgICAgICAgfQorCisgICAgICAgIHptX2RlYnVnX21zZzIoInJlcGxheSBjb3VudGVyKEwpID0gIiwgcmVwbGF5Q291bnRlckwpOworCisgICAgICAgIHptX2RlYnVnX21zZzIoImtleSBpbmZvcm1hdGlvbiA9ICIsIGtleUluZm8pOworCisgICAgICAgIGlmICgga2V5SW5mbyAmIFpNX0JJVF8zICkKKyAgICAgICAgeworICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiICAgIC0gcGFpcndpc2Uga2V5Iik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB6bV9kZWJ1Z19tc2cwKCIgICAgLSBncm91cCBrZXkiKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgga2V5SW5mbyAmIFpNX0JJVF82ICkKKyAgICAgICAgeworICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiICAgIC0gVHgga2V5IGluc3RhbGxlZCIpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiICAgIC0gVHgga2V5IG5vdCBzZXQiKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgga2V5SW5mbyAmIFpNX0JJVF83ICkKKyAgICAgICAgeworICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiICAgIC0gQWNrIG5lZWRlZCIpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiICAgIC0gQWNrIG5vdCBuZWVkZWQiKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgga2V5SW5mbyAmIFpNX0JJVF84ICkKKyAgICAgICAgeworICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiICAgIC0gTUlDIHNldCIpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiICAgIC0gTUlDIG5vdCBzZXQiKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgga2V5SW5mbyAmIFpNX0JJVF85ICkKKyAgICAgICAgeworICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiICAgIC0gcGFja2V0IGVuY3J5cHRlZCIpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiICAgIC0gcGFja2V0IG5vdCBlbmNyeXB0ZWQiKTsKKyAgICAgICAgfQorCisgICAgICAgIHptX2RlYnVnX21zZzEoImtleUxlbiA9ICIsIGtleUxlbik7CisgICAgICAgIHptX2RlYnVnX21zZzEoImtleURhdGFMZW4gPSAiLCBrZXlEYXRhTGVuKTsKKyAgICB9CisgICAgZWxzZSBpZiggcGFja2V0VHlwZSA9PSA0ICkKKyAgICB7CisgICAgICAgIHptX2RlYnVnX21zZzAoIkVBUE9MLUVuY2Fwc3VsYXRlZC1BU0YtQWxlcnQiKTsKKyAgICB9Cit9CisKK3ZvaWQgemZTaG93VHhFQVBPTCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IG9mZnNldCkKK3sKKyAgICB1OF90ICAgcGFja2V0VHlwZSwga2V5VHlwZSwgY29kZSwgaWRlbnRpZmllciwgdHlwZSwgZmxhZ3M7CisgICAgdTE2X3QgIHBhY2tldExlbiwga2V5SW5mbywga2V5TGVuLCBrZXlEYXRhTGVuLCBsZW5ndGgsIE9wX0NvZGU7CisgICAgdTMyX3QgIHJlcGxheUNvdW50ZXJILCByZXBsYXlDb3VudGVyTCwgdmVuZG9ySWQsIFZlbmRvclR5cGU7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bV9kZWJ1Z19tc2cxKCJFQVBPTCBQYWNrZXQgc2l6ZSA9ICIsIHpmd0J1ZkdldFNpemUoZGV2LCBidWYpKTsKKworICAgIC8qIEVBUE9MIHBhY2tldCB0eXBlICovCisgICAgLy8gMDogRUFQLVBhY2tldAorICAgIC8vIDE6IEVBUE9MLVN0YXJ0CisgICAgLy8gMjogRUFQT0wtTG9nb2ZmCisgICAgLy8gMzogRUFQT0wtS2V5CisgICAgLy8gNDogRUFQT0wtRW5jYXBzdWxhdGVkLUFTRi1BbGVydAorCisgICAgLyogRUFQT0wgZnJhbWUgZm9ybWF0ICovCisgICAgLyogIDAgIDEgIDIgIDMgIDQgIDUgIDYgIDcgIDggIDkgMTAgMTEgMTIgMTMgMTQgMTUgICAqLworICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgKi8KKyAgICAvKiAgICAgICAgICAgIFBBRSBFdGhlcm5ldCBUeXBlICgweDg4OGUpICAgICAgICAgICAgICovCisgICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gMiAqLworICAgIC8qICAgICBQcm90b2NvbCBWZXJzaW9uICAgIHwgICAgICAgICBUeXBlICAgICAgICAgICAgKi8KKyAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSA0ICovCisgICAgLyogICAgICAgICAgICAgICAgICAgICAgIExlbmd0aCAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIDYgKi8KKyAgICAvKiAgICAgICAgICAgICAgICAgICAgUGFja2V0IEJvZHkgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTiAqLworCisgICAgcGFja2V0VHlwZSA9IHptd190eF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxKTsKKyAgICAvKiBFQVBPTCBib2R5IGxlbmd0aCAqLworICAgIHBhY2tldExlbiA9ICgoKHUxNl90KSB6bXdfdHhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMikpIDw8IDgpICsKKyAgICAgICAgICAgICAgICB6bXdfdHhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMyk7CisKKyAgICBpZiggcGFja2V0VHlwZSA9PSAwICkKKyAgICB7IC8vIEVBUC1QYWNrZXQKKyAgICAgICAgLyogRUFQLVBhY2tldCBDb2RlICovCisgICAgICAgIGNvZGUgPSB6bXdfdHhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrNCk7IC8vIDEgOiBSZXF1ZXN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDIgOiBSZXNwb25zZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAzIDogU3VjY2VzcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA0IDogRmFpbHVyZQorCisgICAgICAgIC8vIEFuIEVBUCBwYWNrZXQgb2YgdGhlIHR5cGUgb2YgU3VjY2VzcyBhbmQgRmFpbHVyZSBoYXMgbm8gRGF0YSBmaWVsZCwgYW5kIGhhcyBhIGxlbmd0aCBvZiA0LgorCisgICAgICAgIC8qIEVBUCBQYWNrZXQgZm9ybWF0ICovCisgICAgICAgIC8qICAwICAxICAyICAzICA0ICA1ICA2ICA3ICA4ICA5IDEwIDExIDEyIDEzIDE0IDE1ICAgKi8KKyAgICAgICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAqLworICAgICAgICAvKiAgICAgICAgICAgQ29kZSAgICAgICAgICB8ICAgICAgICBJZGVudGlmaWVyICAgICAgICovCisgICAgICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIDIgKi8KKyAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgIExlbmd0aCAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSA0ICovCisgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTiAqLworCisgICAgICAgIHptX2RlYnVnX21zZzAoIkVBUC1QYWNrZXQiKTsKKyAgICAgICAgem1fZGVidWdfbXNnMSgiUGFja2V0IExlbmd0aCA9ICIsIHBhY2tldExlbik7CisgICAgICAgIHptX2RlYnVnX21zZzEoIkVBUC1QYWNrZXQgQ29kZSA9ICIsIGNvZGUpOworCisgICAgICAgIGlmKCBjb2RlID09IDEgKQorICAgICAgICB7CisgICAgICAgICAgICB6bV9kZWJ1Z19tc2cwKCJFQVAtUGFja2V0IFJlcXVlc3QiKTsKKworICAgICAgICAgICAgLyogRUFQLVBhY2tldCBJZGVudGlmaWVyICovCisgICAgICAgICAgICBpZGVudGlmaWVyID0gem13X3R4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzUpOworICAgICAgICAgICAgLyogRUFQLVBhY2tldCBMZW5ndGggKi8KKyAgICAgICAgICAgIGxlbmd0aCA9ICgoKHUxNl90KSB6bXdfdHhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrNikpIDw8IDgpICsKKyAgICAgICAgICAgICAgICAgICAgICB6bXdfdHhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrNyk7CisgICAgICAgICAgICAvKiBFQVAtUGFja2V0IFR5cGUgKi8KKyAgICAgICAgICAgIHR5cGUgPSB6bXdfdHhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrOCk7IC8vIDEgICA6IElkZW50aXR5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAyICAgOiBOb3RpZmljYXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDMgICA6IE5hayAoUmVzcG9uc2UgT25seSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDQgICA6IE1ENS1DaGFsbGVuZ2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDUgICA6IE9uZSBUaW1lIFBhc3N3b3JkIChPVFApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA2ICAgOiBHZW5lcmljIFRva2VuIENhcmQgKEdUQykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDI1NCA6IChFeHBhbmRlZCBUeXBlcylXaS1GaSBQcm90ZWN0ZWQgU2V0dXAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDI1NSA6IEV4cGVyaW1lbnRhbCBVc2UKKworICAgICAgICAgICAgLyogVGhlIGRhdGEgZmllbGQgaW4gYW4gRUFQIHBhY2tldCBvZiB0aGUgdHlwZSBvZiBSZXF1ZXN0IG9yIFJlc3BvbnNlIGlzIGluIHRoZSBmb3JtYXQgc2hvd24gYmVsbG93aW5nICovCisgICAgICAgICAgICAvKiAgMCAgMSAgMiAgMyAgNCAgNSAgNiAgNyAgICAgICAgICAgICBOICAgICAgICAgICAgICovCisgICAgICAgICAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICovCisgICAgICAgICAgICAvKiAgICAgICAgICAgVHlwZSAgICAgICAgICB8ICAgICAgICBUeXBlIERhdGEgICAgICAgICovCisgICAgICAgICAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICovCisKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzEoIkVBUC1QYWNrZXQgSWRlbnRpZmllciA9ICIsIGlkZW50aWZpZXIpOworICAgICAgICAgICAgem1fZGVidWdfbXNnMSgiRUFQLVBhY2tldCBMZW5ndGggPSAiLCBsZW5ndGgpOworICAgICAgICAgICAgem1fZGVidWdfbXNnMSgiRUFQLVBhY2tldCBUeXBlID0gIiwgdHlwZSk7CisKKyAgICAgICAgICAgIGlmKCB0eXBlID09IDEgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIkVBUC1QYWNrZXQgUmVxdWVzdCBJZGVudGl0eSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiggdHlwZSA9PSAyICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6bV9kZWJ1Z19tc2cwKCJFQVAtUGFja2V0IFJlcXVlc3QgTm90aWZpY2F0aW9uIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmKCB0eXBlID09IDQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIkVBUC1QYWNrZXQgUmVxdWVzdCBNRDUtQ2hhbGxlbmdlIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmKCB0eXBlID09IDUgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIkVBUC1QYWNrZXQgUmVxdWVzdCBPbmUgVGltZSBQYXNzd29yZCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiggdHlwZSA9PSA2ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6bV9kZWJ1Z19tc2cwKCJFQVAtUGFja2V0IFJlcXVlc3QgR2VuZXJpYyBUb2tlbiBDYXJkIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmKCB0eXBlID09IDI1NCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiRUFQLVBhY2tldCBSZXF1ZXN0IFdpLUZpIFByb3RlY3RlZCBTZXR1cCIpOworCisgICAgICAgICAgICAgICAgLyogMCAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgICAgICAgMyAgICovCisgICAgICAgICAgICAgICAgLyogMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxICovCisgICAgICAgICAgICAgICAgLyorLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKyovCisgICAgICAgICAgICAgICAgLyp8ICAgICBUeXBlICAgICAgfCAgICAgICAgICAgICAgIFZlbmRvci1JZCAgICAgICAgICAgICAgICAgICAgICAgfCovCisgICAgICAgICAgICAgICAgLyorLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKyovCisgICAgICAgICAgICAgICAgLyp8ICAgICAgICAgICAgICAgICAgICAgICAgICBWZW5kb3ItVHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgfCovCisgICAgICAgICAgICAgICAgLyorLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKyovCisgICAgICAgICAgICAgICAgLyp8ICAgICAgICAgICAgICBWZW5kb3IgZGF0YS4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgLyorLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKyAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgICAgICAgICAgICAgICAvKiBFQVAtUGFja2V0IFZlbmRvciBJRCAqLworICAgICAgICAgICAgICAgIHZlbmRvcklkID0gKCgodTMyX3QpIHptd190eF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCs5KSkgPDwgMTYpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKHUzMl90KSB6bXdfdHhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMTApKSA8PCA4KSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICB6bXdfdHhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMTEpOworICAgICAgICAgICAgICAgIC8qIEVBUC1QYWNrZXQgVmVuZG9yIFR5cGUgKi8KKyAgICAgICAgICAgICAgICBWZW5kb3JUeXBlID0gKCgodTMyX3QpIHptd190eF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxMikpIDw8IDI0KSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKHUzMl90KSB6bXdfdHhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMTMpKSA8PCAxNikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKCh1MzJfdCkgem13X3R4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzE0KSkgPDwgOCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6bXdfdHhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMTUpOworICAgICAgICAgICAgICAgIC8qIEVBUC1QYWNrZXQgT3AgQ29kZSAqLworICAgICAgICAgICAgICAgIE9wX0NvZGUgPSAoKCh1MTZfdCkgem13X3R4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzE2KSkgPDwgOCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICB6bXdfdHhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMTcpOworICAgICAgICAgICAgICAgIC8qIEVBUC1QYWNrZXQgRmxhZ3MgKi8KKyAgICAgICAgICAgICAgICBmbGFncyA9IHptd190eF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxOCk7CisKKyAgICAgICAgICAgICAgICB6bV9kZWJ1Z19tc2cxKCJFQVAtUGFja2V0IFZlbmRvciBJRCA9ICIsIHZlbmRvcklkKTsKKyAgICAgICAgICAgICAgICB6bV9kZWJ1Z19tc2cxKCJFQVAtUGFja2V0IFZlbm9kciBUeXBlID0gIiwgVmVuZG9yVHlwZSk7CisgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMSgiRUFQLVBhY2tldCBPcCBDb2RlID0gIiwgT3BfQ29kZSk7CisgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMSgiRUFQLVBhY2tldCBGbGFncyA9ICIsIGZsYWdzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmKCBjb2RlID09IDIgKQorICAgICAgICB7CisgICAgICAgICAgICB6bV9kZWJ1Z19tc2cwKCJFQVAtUGFja2V0IFJlc3BvbnNlIik7CisKKyAgICAgICAgICAgIC8qIEVBUC1QYWNrZXQgSWRlbnRpZmllciAqLworICAgICAgICAgICAgaWRlbnRpZmllciA9IHptd190eF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCs1KTsKKyAgICAgICAgICAgIC8qIEVBUC1QYWNrZXQgTGVuZ3RoICovCisgICAgICAgICAgICBsZW5ndGggPSAoKCh1MTZfdCkgem13X3R4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzYpKSA8PCA4KSArCisgICAgICAgICAgICAgICAgICAgICAgem13X3R4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzcpOworICAgICAgICAgICAgLyogRUFQLVBhY2tldCBUeXBlICovCisgICAgICAgICAgICB0eXBlID0gem13X3R4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzgpOworCisgICAgICAgICAgICB6bV9kZWJ1Z19tc2cxKCJFQVAtUGFja2V0IElkZW50aWZpZXIgPSAiLCBpZGVudGlmaWVyKTsKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzEoIkVBUC1QYWNrZXQgTGVuZ3RoID0gIiwgbGVuZ3RoKTsKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzEoIkVBUC1QYWNrZXQgVHlwZSA9ICIsIHR5cGUpOworCisgICAgICAgICAgICBpZiggdHlwZSA9PSAxICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6bV9kZWJ1Z19tc2cwKCJFQVAtUGFja2V0IFJlc3BvbnNlIElkZW50aXR5Iik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmKCB0eXBlID09IDIgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIkVBUC1QYWNrZXQgUmVxdWVzdCBOb3RpZmljYXRpb24iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYoIHR5cGUgPT0gMyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiRUFQLVBhY2tldCBSZXF1ZXN0IE5hayIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiggdHlwZSA9PSA0ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6bV9kZWJ1Z19tc2cwKCJFQVAtUGFja2V0IFJlcXVlc3QgTUQ1LUNoYWxsZW5nZSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiggdHlwZSA9PSA1ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6bV9kZWJ1Z19tc2cwKCJFQVAtUGFja2V0IFJlcXVlc3QgT25lIFRpbWUgUGFzc3dvcmQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYoIHR5cGUgPT0gNiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiRUFQLVBhY2tldCBSZXF1ZXN0IEdlbmVyaWMgVG9rZW4gQ2FyZCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiggdHlwZSA9PSAyNTQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIkVBUC1QYWNrZXQgUmVzcG9uc2UgV2ktRmkgUHJvdGVjdGVkIFNldHVwIik7CisKKyAgICAgICAgICAgICAgICAvKiBFQVAtUGFja2V0IFZlbmRvciBJRCAqLworICAgICAgICAgICAgICAgIHZlbmRvcklkID0gKCgodTMyX3QpIHptd190eF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCs5KSkgPDwgMTYpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKHUzMl90KSB6bXdfdHhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMTApKSA8PCA4KSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICB6bXdfdHhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMTEpOworICAgICAgICAgICAgICAgIC8qIEVBUC1QYWNrZXQgVmVuZG9yIFR5cGUgKi8KKyAgICAgICAgICAgICAgICBWZW5kb3JUeXBlID0gKCgodTMyX3QpIHptd190eF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxMikpIDw8IDI0KSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKHUzMl90KSB6bXdfdHhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMTMpKSA8PCAxNikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKCh1MzJfdCkgem13X3R4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzE0KSkgPDwgOCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6bXdfdHhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMTUpOworICAgICAgICAgICAgICAgIC8qIEVBUC1QYWNrZXQgT3AgQ29kZSAqLworICAgICAgICAgICAgICAgIE9wX0NvZGUgPSAoKCh1MTZfdCkgem13X3R4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzE2KSkgPDwgOCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICB6bXdfdHhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMTcpOworICAgICAgICAgICAgICAgIC8qIEVBUC1QYWNrZXQgRmxhZ3MgKi8KKyAgICAgICAgICAgICAgICBmbGFncyA9IHptd190eF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxOCk7CisKKyAgICAgICAgICAgICAgICB6bV9kZWJ1Z19tc2cxKCJFQVAtUGFja2V0IFZlbmRvciBJRCA9ICIsIHZlbmRvcklkKTsKKyAgICAgICAgICAgICAgICB6bV9kZWJ1Z19tc2cxKCJFQVAtUGFja2V0IFZlbm9kciBUeXBlID0gIiwgVmVuZG9yVHlwZSk7CisgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMSgiRUFQLVBhY2tldCBPcCBDb2RlID0gIiwgT3BfQ29kZSk7CisgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMSgiRUFQLVBhY2tldCBGbGFncyA9ICIsIGZsYWdzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmKCBjb2RlID09IDMgKQorICAgICAgICB7CisgICAgICAgICAgICB6bV9kZWJ1Z19tc2cwKCJFQVAtUGFja2V0IFN1Y2Nlc3MiKTsKKworICAgICAgICAgICAgLyogRUFQLVBhY2tldCBJZGVudGlmaWVyICovCisgICAgICAgICAgICBpZGVudGlmaWVyID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzUpOworICAgICAgICAgICAgLyogRUFQLVBhY2tldCBMZW5ndGggKi8KKyAgICAgICAgICAgIGxlbmd0aCA9ICgoKHUxNl90KSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrNikpIDw8IDgpICsKKyAgICAgICAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrNyk7CisKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzEoIkVBUC1QYWNrZXQgSWRlbnRpZmllciA9ICIsIGlkZW50aWZpZXIpOworICAgICAgICAgICAgem1fZGVidWdfbXNnMSgiRUFQLVBhY2tldCBMZW5ndGggPSAiLCBsZW5ndGgpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYoIGNvZGUgPT0gNCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIkVBUC1QYWNrZXQgRmFpbHVyZSIpOworCisgICAgICAgICAgICAvKiBFQVAtUGFja2V0IElkZW50aWZpZXIgKi8KKyAgICAgICAgICAgIGlkZW50aWZpZXIgPSB6bXdfdHhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrNSk7CisgICAgICAgICAgICAvKiBFQVAtUGFja2V0IExlbmd0aCAqLworICAgICAgICAgICAgbGVuZ3RoID0gKCgodTE2X3QpIHptd190eF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCs2KSkgPDwgOCkgKworICAgICAgICAgICAgICAgICAgICAgIHptd190eF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCs3KTsKKworICAgICAgICAgICAgem1fZGVidWdfbXNnMSgiRUFQLVBhY2tldCBJZGVudGlmaWVyID0gIiwgaWRlbnRpZmllcik7CisgICAgICAgICAgICB6bV9kZWJ1Z19tc2cxKCJFQVAtUGFja2V0IExlbmd0aCA9ICIsIGxlbmd0aCk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiggcGFja2V0VHlwZSA9PSAxICkKKyAgICB7IC8vIEVBUE9MLVN0YXJ0CisgICAgICAgIHptX2RlYnVnX21zZzAoIkVBUE9MLVN0YXJ0Iik7CisgICAgfQorICAgIGVsc2UgaWYoIHBhY2tldFR5cGUgPT0gMiApCisgICAgeyAvLyBFQVBPTC1Mb2dvZmYKKyAgICAgICAgem1fZGVidWdfbXNnMCgiRUFQT0wtTG9nb2ZmIik7CisgICAgfQorICAgIGVsc2UgaWYoIHBhY2tldFR5cGUgPT0gMyApCisgICAgeyAvLyBFQVBPTC1LZXkKKyAgICAgICAgLyogRUFQT0wtS2V5IHR5cGUgKi8KKyAgICAgICAga2V5VHlwZSA9IHptd190eF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCs0KTsKKyAgICAgICAgLyogRUFQT0wtS2V5IGluZm9ybWF0aW9uICovCisgICAgICAgIGtleUluZm8gPSAoKCh1MTZfdCkgem13X3R4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzUpKSA8PCA4KSArCisgICAgICAgICAgICAgICAgICB6bXdfdHhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrNik7CisgICAgICAgIC8qIEVBUE9MLUtleSBsZW5ndGggKi8KKyAgICAgICAga2V5TGVuID0gKCgodTE2X3QpIHptd190eF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCs3KSkgPDwgOCkgKworICAgICAgICAgICAgICAgICB6bXdfdHhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrOCk7CisgICAgICAgIC8qIEVBUE9MLUtleSByZXBsYXkgY291bnRlciAoaGlnaCBkb3VibGUgd29yZCkgKi8KKyAgICAgICAgcmVwbGF5Q291bnRlckggPSAoKCh1MzJfdCkgem13X3R4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzkpKSA8PCAyNCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICgoKHUzMl90KSB6bXdfdHhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMTApKSA8PCAxNikgKworICAgICAgICAgICAgICAgICAgICAgICAgICgoKHUzMl90KSB6bXdfdHhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMTEpKSA8PCA4KSArCisgICAgICAgICAgICAgICAgICAgICAgICAgem13X3R4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzEyKTsKKyAgICAgICAgLyogRUFQT0wtS2V5IHJlcGxheSBjb3VudGVyIChsb3cgZG91YmxlIHdvcmQpICovCisgICAgICAgIHJlcGxheUNvdW50ZXJMID0gKCgodTMyX3QpIHptd190eF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxMykpIDw8IDI0KSArCisgICAgICAgICAgICAgICAgICAgICAgICAgKCgodTMyX3QpIHptd190eF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxNCkpIDw8IDE2KSArCisgICAgICAgICAgICAgICAgICAgICAgICAgKCgodTMyX3QpIHptd190eF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxNSkpIDw8IDgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICB6bXdfdHhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMTYpOworICAgICAgICAvKiBFQVBPTC1LZXkgZGF0YSBsZW5ndGggKi8KKyAgICAgICAga2V5RGF0YUxlbiA9ICgoKHUxNl90KSB6bXdfdHhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrOTcpKSA8PCA4KSArCisgICAgICAgICAgICAgICAgICAgICB6bXdfdHhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrOTgpOworCisgICAgICAgIHptX2RlYnVnX21zZzAoIkVBUE9MLUtleSIpOworICAgICAgICB6bV9kZWJ1Z19tc2cxKCJwYWNrZXQgbGVuZ3RoID0gIiwgcGFja2V0TGVuKTsKKworICAgICAgICBpZiAoIGtleVR5cGUgPT0gMjU0ICkKKyAgICAgICAgeworICAgICAgICAgICAgem1fZGVidWdfbXNnMCgia2V5IHR5cGUgPSAyNTQgKFNTTiBrZXkgZGVzY3JpcHRvcikiKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzIoImtleSB0eXBlID0gMHgiLCBrZXlUeXBlKTsKKyAgICAgICAgfQorCisgICAgICAgIHptX2RlYnVnX21zZzIoInJlcGxheSBjb3VudGVyKEwpID0gIiwgcmVwbGF5Q291bnRlckwpOworCisgICAgICAgIHptX2RlYnVnX21zZzIoImtleSBpbmZvcm1hdGlvbiA9ICIsIGtleUluZm8pOworCisgICAgICAgIGlmICgga2V5SW5mbyAmIFpNX0JJVF8zICkKKyAgICAgICAgeworICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiICAgIC0gcGFpcndpc2Uga2V5Iik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB6bV9kZWJ1Z19tc2cwKCIgICAgLSBncm91cCBrZXkiKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgga2V5SW5mbyAmIFpNX0JJVF82ICkKKyAgICAgICAgeworICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiICAgIC0gVHgga2V5IGluc3RhbGxlZCIpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiICAgIC0gVHgga2V5IG5vdCBzZXQiKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgga2V5SW5mbyAmIFpNX0JJVF83ICkKKyAgICAgICAgeworICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiICAgIC0gQWNrIG5lZWRlZCIpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiICAgIC0gQWNrIG5vdCBuZWVkZWQiKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgga2V5SW5mbyAmIFpNX0JJVF84ICkKKyAgICAgICAgeworICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiICAgIC0gTUlDIHNldCIpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiICAgIC0gTUlDIG5vdCBzZXQiKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgga2V5SW5mbyAmIFpNX0JJVF85ICkKKyAgICAgICAgeworICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiICAgIC0gcGFja2V0IGVuY3J5cHRlZCIpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiICAgIC0gcGFja2V0IG5vdCBlbmNyeXB0ZWQiKTsKKyAgICAgICAgfQorCisgICAgICAgIHptX2RlYnVnX21zZzEoImtleUxlbiA9ICIsIGtleUxlbik7CisgICAgICAgIHptX2RlYnVnX21zZzEoImtleURhdGFMZW4gPSAiLCBrZXlEYXRhTGVuKTsKKyAgICB9CisgICAgZWxzZSBpZiggcGFja2V0VHlwZSA9PSA0ICkKKyAgICB7CisgICAgICAgIHptX2RlYnVnX21zZzAoIkVBUE9MLUVuY2Fwc3VsYXRlZC1BU0YtQWxlcnQiKTsKKyAgICB9Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmaVJlY3Y4MDIxMSAgICAgICAgICAgICAgICAqLworLyogICAgICBDYWxsZWQgdG8gcmVjZWl2ZSA4MDIuMTEgZnJhbWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYnVmIDogcmVjZWl2ZWQgODAyLjExIGZyYW1lIGJ1ZmZlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiAgICAgICAgICAgICBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgIDIwMDUuNSAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgemZpUmVjdjgwMjExKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1Ziwgc3RydWN0IHpzQWRkaXRpb25JbmZvKiBhZGRJbmZvKQoreworICAgIHU4X3Qgc25hcENhc2U9MCwgZW5jcnlNb2RlOworICAgIHUxNl90IGZyYW1lVHlwZSwgdHlwZUxlbmd0aEZpZWxkOworICAgIHUxNl90IGZyYW1lQ3RybDsKKyAgICB1MTZfdCBmcmFtZVN1YnR5cGU7CisgICAgdTE2X3QgcmV0OworICAgIHUxNl90IGxlbjsKKyAgICB1OF90IGJJc0RlZnJhZyA9IDA7CisgICAgdTE2X3Qgb2Zmc2V0LCB0YWlsTGVuOworICAgIHU4X3QgdmFwID0gMDsKKyAgICB1MTZfdCBkYVszXSwgc2FbM107CisgICAgdTE2X3QgaWk7CisgICAgdThfdCB1YXBzZFRyaWcgPSAwOworICAgIHpidWZfdCogcHNCdWY7CisjaWZkZWYgWk1fRU5BQkxFX05BVElWRV9XSUZJCisgICAgdThfdCBpOworI2VuZGlmCisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBaTV9CVUZGRVJfVFJBQ0UoZGV2LCBidWYpCisKKyAgICAvL3ptX21zZzJfcngoWk1fTFZfMiwgInpmaVJlY3Y4MDIxMSgpLCBidWY9IiwgYnVmKTsKKworICAgIC8vem1fbXNnMl9yeChaTV9MVl8wLCAiaFswXT0iLCB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCAwKSk7CisgICAgLy96bV9tc2cyX3J4KFpNX0xWXzAsICJoWzJdPSIsIHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIDIpKTsKKyAgICAvL3ptX21zZzJfcngoWk1fTFZfMCwgImhbNF09Iiwgem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgNCkpOworCisgICAgZnJhbWVDdHJsID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgMCk7CisgICAgZnJhbWVUeXBlID0gZnJhbWVDdHJsICYgMHhmOworICAgIGZyYW1lU3VidHlwZSA9IGZyYW1lQ3RybCAmIDB4ZjA7CisKKyNpZiAwICAgLy8gTW92ZSB0byBQcm9jZXNzQmVhY29uIHRvIGp1ZGdlIGlmIHRoZXJlJ3MgYSBuZXcgcGVlciBzdGF0aW9uCisgICAgaWYgKCAod2QtPndsYW5Nb2RlID09IFpNX01PREVfSUJTUykmJgorICAgICAgICAgKHdkLT5zdGEuaWJzc1BhcnRuZXJTdGF0dXMgIT0gWk1fSUJTU19QQVJUTkVSX0FMSVZFKSApCisgICAgeworICAgICAgICB6ZlN0YUlic3NNb25pdG9yaW5nKGRldiwgYnVmKTsKKyAgICB9CisjZW5kaWYKKworICAgIC8qIElmIGRhdGEgZnJhbWUgKi8KKyAgICBpZiAoZnJhbWVUeXBlID09IFpNX1dMQU5fREFUQV9GUkFNRSkKKyAgICB7CisgICAgICAgIHdkLT5zdGEuVG90YWxOdW1iZXJPZlJlY2VpdmVQYWNrZXRzKys7CisgICAgICAgIHdkLT5zdGEuVG90YWxOdW1iZXJPZlJlY2VpdmVCeXRlcyArPSB6ZndCdWZHZXRTaXplKGRldiwgYnVmKTsKKyAgICAgICAgLy96bV9kZWJ1Z19tc2cxKCJSZWNlaXZlIHBhY2tldHMgICAgID0gIiwgd2QtPnN0YS5Ub3RhbE51bWJlck9mUmVjZWl2ZVBhY2tldHMpOworCisgICAgICAgIC8vem1fbXNnMF9yeChaTV9MVl8wLCAiUnggZGF0YSIpOworICAgICAgICBpZiAod2QtPndsYW5Nb2RlID09IFpNX01PREVfQVApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgocmV0ID0gemZBcFVwZGF0ZVBzQml0KGRldiwgYnVmLCAmdmFwLCAmdWFwc2RUcmlnKSkgIT0gWk1fU1VDQ0VTUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6ZndCdWZGcmVlKGRldiwgYnVmLCAwKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICgoKHVhcHNkVHJpZyYweGYpICE9IDApICYmICgoZnJhbWVTdWJ0eXBlICYgMHg4MCkgIT0gMCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdThfdCBhYyA9IHpjVXBUb0FjW3ptd19idWZfcmVhZGIoZGV2LCBidWYsIDI0KSYweDddOworICAgICAgICAgICAgICAgIHU4X3QgcGt0TnVtOworICAgICAgICAgICAgICAgIHU4X3QgbWI7CisgICAgICAgICAgICAgICAgdTE2X3QgZmxhZzsKKyAgICAgICAgICAgICAgICB1OF90IHNyY1s2XTsKKworICAgICAgICAgICAgICAgIC8vcHJpbnRrKCJRb1MgY3RybD0lZFxuIiwgem13X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgMjQpKTsKKyAgICAgICAgICAgICAgICAvL3ByaW50aygiVUFQU0QgdHJpZ2dlciwgYWM9JWRcbiIsIGFjKTsKKworICAgICAgICAgICAgICAgIGlmICgoKDB4OD4+YWMpICYgdWFwc2RUcmlnKSAhPSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcGt0TnVtID0gemNNYXhzcFRvUGt0TnVtWyh1YXBzZFRyaWc+PjQpICYgMHgzXTsKKworICAgICAgICAgICAgICAgICAgICBmb3IgKGlpPTA7IGlpPDY7IGlpKyspCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNyY1tpaV0gPSB6bXdfYnVmX3JlYWRiKGRldiwgYnVmLCBaTV9XTEFOX0hFQURFUl9BMl9PRkZTRVQraWkpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpaT0wOyBpaTxwa3ROdW07IGlpKyspCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vaWYgKChwc0J1ZiA9IHpmUXVldWVHZXQoZGV2LCB3ZC0+YXAudWFwc2RRKSkgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocHNCdWYgPSB6ZlF1ZXVlR2V0V2l0aE1hYyhkZXYsIHdkLT5hcC51YXBzZFEsIHNyYywgJm1iKSkgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGlpKzEpID09IHBrdE51bSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vRU9TUCBhbnl3YXkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZyA9IDB4MTAwIHwgKG1iPDw1KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1iICE9IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vbW9yZSBkYXRhLCBub3QgRU9TUAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZyA9IDB4MjA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL25vIG1vcmUgZGF0YSwgRU9TUAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZyA9IDB4MTAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpmVHhTZW5kRXRoKGRldiwgcHNCdWYsIDAsIFpNX0VYVEVSTkFMX0FMTE9DX0JVRiwgZmxhZyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocHNCdWYgPT0gTlVMTCkgfHwgKG1iID09IDApKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoaWkgPT0gMCkgJiYgKHBzQnVmID09IE5VTEwpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemZTZW5kTW1GcmFtZShkZXYsIFpNX1dMQU5fRlJBTUVfVFlQRV9RT1NfTlVMTCwgKHUxNl90KilzcmMsIDAsIDAsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCB3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9JTkZSQVNUUlVDVFVSRSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHUxNl90IGZyYW1lQ3RybE1TQjsKKyAgICAJCXU4X3QgICBic3NpZFs2XTsKKworICAgICAgICAgICAgLyogQ2hlY2sgSXMgUklGUyBmcmFtZSBhbmQgZGVjaWRlIHRvIGVuYWJsZSBSSUZTIG9yIG5vdCAqLworICAgICAgICAgICAgaWYoIHdkLT5zdGEuRW5hYmxlSFQgKQorICAgICAgICAgICAgICAgIHpmQ2hlY2tJc1JJRlNGcmFtZShkZXYsIGJ1ZiwgZnJhbWVTdWJ0eXBlKTsKKworICAgICAgICAgICAgaWYgKCB6ZlBvd2VyU2F2aW5nTWdySXNTbGVlcGluZyhkZXYpIHx8IHdkLT5zdGEucHNNZ3IudGVtcFdha2VVcCA9PSAxKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZyYW1lQ3RybE1TQiA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIDEpOworCisgICAgICAgICAgICAgICAgLyogY2hlY2sgbW9yZSBkYXRhICovCisgICAgICAgICAgICAgICAgaWYgKCBmcmFtZUN0cmxNU0IgJiBaTV9CSVRfNSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvL2lmIHJ4IGZyYW1lJ3MgQUMgaXMgbm90IGRlbGl2ZXJ5LWVuYWJsZWQKKyAgICAgICAgICAgICAgICAgICAgaWYgKCh3ZC0+c3RhLnFvc0luZm8mMHhmKSAhPSAweGYpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHU4X3QgcnhBYyA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGZyYW1lU3VidHlwZSAmIDB4ODApICE9IDApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnhBYyA9IHpjVXBUb0FjW3ptd19idWZfcmVhZGIoZGV2LCBidWYsIDI0KSYweDddOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKCgweDg+PnJ4QWMpICYgd2QtPnN0YS5xb3NJbmZvKSA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpmU2VuZFBTUG9sbChkZXYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEucHNNZ3IudGVtcFdha2VVcCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisJCQkvKmluY3JlYXNlIGJlYWNvbiBjb3VudCB3aGVuIHJlY2VpdmUgdmFpbGQgZGF0YSBmcmFtZSBmcm9tIEFQKi8KKyAgICAgICAgCVpNX01BQ19XT1JEX1RPX0JZVEUod2QtPnN0YS5ic3NpZCwgYnNzaWQpOworCisJCQlpZiAoemZTdGFJc0Nvbm5lY3RlZChkZXYpJiYKKwkJCQl6ZlJ4QnVmZmVyRXF1YWxUb1N0cihkZXYsIGJ1ZiwgYnNzaWQsIFpNX1dMQU5fSEVBREVSX0EyX09GRlNFVCwgNikpCisJCQl7CisgICAgICAgICAgICAgICAgd2QtPnN0YS5yeEJlYWNvbkNvdW50Kys7CisJCQl9CisgICAgICAgIH0KKworICAgICAgICB6bV9tc2cxX3J4KFpNX0xWXzIsICJSeCBWQVA9IiwgdmFwKTsKKworICAgICAgICAvKiBoYW5kbGUgSVYsIEVYVC1JViwgSUNWLCBhbmQgRVhULUlDViAqLworICAgICAgICB6ZkdldFJ4SXZJY3ZMZW5ndGgoZGV2LCBidWYsIHZhcCwgJm9mZnNldCwgJnRhaWxMZW4sIGFkZEluZm8pOworCisgICAgICAgIHpmU3RhSWJzc1BTQ2hlY2tTdGF0ZShkZXYsIGJ1Zik7CisgICAgICAgIC8vUW9TIGRhdGEgZnJhbWUKKyAgICAgICAgaWYgKChmcmFtZVN1YnR5cGUgJiAweDgwKSA9PSAweDgwKQorICAgICAgICB7CisgICAgICAgICAgICBvZmZzZXQgKz0gMjsKKyAgICAgICAgfQorCisgICAgICAgIGxlbiA9IHpmd0J1ZkdldFNpemUoZGV2LCBidWYpOworICAgICAgICAvKiByZW1vdmUgSUNWICovCisgICAgICAgIGlmICh0YWlsTGVuID4gMCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGxlbiA+IHRhaWxMZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbGVuIC09IHRhaWxMZW47CisgICAgICAgICAgICAgICAgemZ3QnVmU2V0U2l6ZShkZXYsIGJ1ZiwgbGVuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIEZpbHRlciBOVUxMIGRhdGEgKi8KKyAgICAgICAgaWYgKCgoZnJhbWVTdWJ0eXBlJjB4NDApICE9IDApIHx8ICgobGVuID0gemZ3QnVmR2V0U2l6ZShkZXYsIGJ1ZikpPD0yNCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHptX21zZzFfcngoWk1fTFZfMSwgIkZyZWUgUnggTlVMTCBkYXRhLCBsZW49IiwgbGVuKTsKKyAgICAgICAgICAgIHpmd0J1ZkZyZWUoZGV2LCBidWYsIDApOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLyogY2hlY2sgYW5kIGhhbmRsZSBkZWZyYWdtZW50YXRpb24gKi8KKyAgICAgICAgaWYgKCB3ZC0+c3RhLmJTYWZlTW9kZSAmJiAod2QtPnN0YS53ZXBTdGF0dXMgPT0gWk1fRU5DUllQVElPTl9BRVMpICYmIHdkLT5zdGEuU1dFbmNyeXB0RW5hYmxlICkKKyAgICAgICAgeworICAgICAgICAgICAgem1fbXNnMF9yeChaTV9MVl8xLCAiQnlwYXNzIGRlZnJhZ21lbnRhdGlvbiBwYWNrZXRzIGluIHNhZmUgbW9kZSIpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCAoYnVmID0gemZEZWZyYWdtZW50KGRldiwgYnVmLCAmYklzRGVmcmFnLCBhZGRJbmZvKSkgPT0gTlVMTCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogSW4gdGhpcyBjYXNlLCB0aGUgYnVmZmVyIGhhcyBiZWVuIGZyZWVkIGluIHpmRGVmcmFnbWVudCAqLworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldCA9IFpNX01JQ19TVUNDRVNTOworCisgICAgICAgIC8qIElmIFNXIFdFUC9US0lQIGFyZSBub3QgdHVybmVkIG9uICovCisgICAgICAgIGlmICgod2QtPnN0YS5TV0VuY3J5cHRFbmFibGUgJiBaTV9TV19US0lQX0RFQ1JZX0VOKSA9PSAwICYmCisgICAgICAgICAgICAod2QtPnN0YS5TV0VuY3J5cHRFbmFibGUgJiBaTV9TV19XRVBfREVDUllfRU4pID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGVuY3J5TW9kZSA9IHpmR2V0RW5jcnlNb2RlRnJvbVJ4U3RhdHVzKGFkZEluZm8pOworCisgICAgICAgICAgICAvKiBjaGVjayBpZiBUS0lQICovCisgICAgICAgICAgICBpZiAoIGVuY3J5TW9kZSA9PSBaTV9US0lQICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIGJJc0RlZnJhZyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXQgPSB6Zk1pY1J4VmVyaWZ5KGRldiwgYnVmKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyogY2hlY2sgTUlDIGZhaWx1cmUgYml0ICovCisgICAgICAgICAgICAgICAgICAgIGlmICggWk1fUlhfU1RBVFVTX0lTX01JQ19GQUlMKGFkZEluZm8pICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gWk1fTUlDX0ZBSUxVUkU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIHJldCA9PSBaTV9NSUNfRkFJTFVSRSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB1OF90IFVuaWNhc3RfUGt0ID0gMHgwOworCisgICAgICAgICAgICAgICAgICAgIGlmICgoem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgWk1fV0xBTl9IRUFERVJfQTFfT0ZGU0VUKSAmIDB4MSkgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgd2QtPmNvbW1UYWxseS5zd1J4VW5pY2FzdE1pY0ZhaWxDb3VudCsrOworICAgICAgICAgICAgICAgICAgICAgICAgVW5pY2FzdF9Qa3QgPSAweDE7CisgICAgICAgICAgICAgICAgICAgIH0vKgorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCBaTV9XTEFOX0hFQURFUl9BMV9PRkZTRVQpID09IDB4ZmZmZikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgd2QtPmNvbW1UYWxseS5zd1J4TXVsdGljYXN0TWljRmFpbENvdW50Kys7CisgICAgICAgICAgICAgICAgICAgIH0qLworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5jb21tVGFsbHkuc3dSeE11bHRpY2FzdE1pY0ZhaWxDb3VudCsrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICggd2QtPndsYW5Nb2RlID09IFpNX01PREVfQVAgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB1MTZfdCBpZHg7CisgICAgICAgICAgICAgICAgICAgICAgICB1OF90IGFkZHJbNl07CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaWR4PTA7IGlkeDw2OyBpZHgrKykKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyW2lkeF0gPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBaTV9XTEFOX0hFQURFUl9BMl9PRkZTRVQraWR4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdkLT56ZmNiQXBNaWNGYWlsdXJlTm90aWZ5ICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2QtPnpmY2JBcE1pY0ZhaWx1cmVOb3RpZnkoZGV2LCBhZGRyLCBidWYpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYoVW5pY2FzdF9Qa3QpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiQ291bnRlcm1lYXN1cmUgOiBVbmljYXN0X1BrdCAiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB6bV9kZWJ1Z19tc2cwKCJDb3VudGVybWVhc3VyZSA6IE5vbi1VbmljYXN0X1BrdCAiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgaWYoKHdkLT5US0lQX0dyb3VwX0tleUNoYW5naW5nID09IDB4MCkgfHwgKFVuaWNhc3RfUGt0ID09IDB4MSkpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiQ291bnRlcm1lYXN1cmUgOiBEbyBNSUMgQ2hlY2sgIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgemZTdGFNaWNGYWlsdXJlSGFuZGxpbmcoZGV2LCBidWYpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIkNvdW50ZXJtZWFzdXJlIDogU0tJUCBNSUMgQ2hlY2sgZHVlIHRvIEdyb3VwIEtleWNoYW5naW5nICIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8qIERpc2NhcmQgTUlDIGZhaWxlZCBmcmFtZSAqLworICAgICAgICAgICAgICAgICAgICB6ZndCdWZGcmVlKGRldiwgYnVmLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHU4X3QgSXNFbmNyeUZyYW1lOworCisgICAgICAgICAgICAvKiBUT0RPOiBDaGVjayB3aGV0aGVyIFdFUCBiaXQgaXMgdHVybmVkIG9uIGluIE1BQyBoZWFkZXIgKi8KKyAgICAgICAgICAgIGVuY3J5TW9kZSA9IFpNX05PX1dFUDsKKworICAgICAgICAgICAgSXNFbmNyeUZyYW1lID0gKHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIDEpICYgMHg0MCk7CisKKyAgICAgICAgICAgIGlmIChJc0VuY3J5RnJhbWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogU29mdHdhcmUgZGVjcnlwdGlvbiBmb3IgVEtJUCAqLworICAgICAgICAgICAgICAgIGlmICh3ZC0+c3RhLlNXRW5jcnlwdEVuYWJsZSAmIFpNX1NXX1RLSVBfREVDUllfRU4pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB1MTZfdCBpdjE2OworICAgICAgICAgICAgICAgICAgICB1MTZfdCBpdjMyOworICAgICAgICAgICAgICAgICAgICB1OF90IFJDNEtleVsxNl07CisgICAgICAgICAgICAgICAgICAgIHUxNl90IEl2T2Zmc2V0OworICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgenNUa2lwU2VlZCAqcnhTZWVkOworCisgICAgICAgICAgICAgICAgICAgIEl2T2Zmc2V0ID0gb2Zmc2V0ICsgWk1fU0laRV9PRl9XTEFOX0RBVEFfSEVBREVSOworCisgICAgICAgICAgICAgICAgICAgIHJ4U2VlZCA9IHpmU3RhR2V0UnhTZWVkKGRldiwgYnVmKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAocnhTZWVkID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHptX2RlYnVnX21zZzAoInJ4U2VlZCBpcyBOVUxMIik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIERpc2NhcmQgdGhpcyBmcmFtZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgemZ3QnVmRnJlZShkZXYsIGJ1ZiwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpdjE2ID0gKHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIEl2T2Zmc2V0KSA8PCA4KSArIHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIEl2T2Zmc2V0KzIpOworICAgICAgICAgICAgICAgICAgICBpdjMyID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgSXZPZmZzZXQrNCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgKHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIEl2T2Zmc2V0KzUpIDw8IDgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICh6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBJdk9mZnNldCs2KSA8PCAxNikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgKHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIEl2T2Zmc2V0KzcpIDw8IDI0KTsKKworICAgICAgICAgICAgICAgICAgICAvKiBUS0lQIEtleSBNaXhpbmcgKi8KKyAgICAgICAgICAgICAgICAgICAgemZUa2lwUGhhc2UxS2V5TWl4KGl2MzIsIHJ4U2VlZCk7CisgICAgICAgICAgICAgICAgICAgIHpmVGtpcFBoYXNlMktleU1peChpdjE2LCByeFNlZWQpOworICAgICAgICAgICAgICAgICAgICB6ZlRraXBHZXRzZWVkcyhpdjE2LCBSQzRLZXksIHJ4U2VlZCk7CisKKyAgICAgICAgICAgICAgICAgICAgLyogRGVjcnlwdCBEYXRhICovCisgICAgICAgICAgICAgICAgICAgIHJldCA9IHpmVEtJUERlY3J5cHQoZGV2LCBidWYsIEl2T2Zmc2V0K1pNX1NJWkVfT0ZfSVYrWk1fU0laRV9PRl9FWFRfSVYsIDE2LCBSQzRLZXkpOworCisgICAgICAgICAgICAgICAgICAgIGlmIChyZXQgPT0gWk1fSUNWX0ZBSUxVUkUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIlRLSVAgSUNWIGZhaWwiKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLyogRGlzY2FyZCBJQ1YgZmFpbGVkIGZyYW1lICovCisgICAgICAgICAgICAgICAgICAgICAgICB6ZndCdWZGcmVlKGRldiwgYnVmLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8qIFJlbW92ZSBJQ1YgZnJvbSBidWZmZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgemZ3QnVmU2V0U2l6ZShkZXYsIGJ1ZiwgbGVuLTQpOworCisgICAgICAgICAgICAgICAgICAgIC8qIENoZWNrIE1JQyAqLworICAgICAgICAgICAgICAgICAgICByZXQgPSB6Zk1pY1J4VmVyaWZ5KGRldiwgYnVmKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAocmV0ID09IFpNX01JQ19GQUlMVVJFKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIFpNX1dMQU5fSEVBREVSX0ExX09GRlNFVCkgJiAweDEpID09IDApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2QtPmNvbW1UYWxseS5zd1J4VW5pY2FzdE1pY0ZhaWxDb3VudCsrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgWk1fV0xBTl9IRUFERVJfQTFfT0ZGU0VUKSA9PSAweGZmZmYpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2QtPmNvbW1UYWxseS5zd1J4TXVsdGljYXN0TWljRmFpbENvdW50Kys7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2QtPmNvbW1UYWxseS5zd1J4TXVsdGljYXN0TWljRmFpbENvdW50Kys7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0FQICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MTZfdCBpZHg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdThfdCBhZGRyWzZdOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpZHg9MDsgaWR4PDY7IGlkeCsrKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcltpZHhdID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgWk1fV0xBTl9IRUFERVJfQTJfT0ZGU0VUK2lkeCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdkLT56ZmNiQXBNaWNGYWlsdXJlTm90aWZ5ICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+emZjYkFwTWljRmFpbHVyZU5vdGlmeShkZXYsIGFkZHIsIGJ1Zik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpmU3RhTWljRmFpbHVyZUhhbmRsaW5nKGRldiwgYnVmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiTUlDIGZhaWwiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIERpc2NhcmQgTUlDIGZhaWxlZCBmcmFtZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgemZ3QnVmRnJlZShkZXYsIGJ1ZiwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBlbmNyeU1vZGUgPSBaTV9US0lQOworICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gWk1fU0laRV9PRl9JViArIFpNX1NJWkVfT0ZfRVhUX0lWOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmKHdkLT5zdGEuU1dFbmNyeXB0RW5hYmxlICYgWk1fU1dfV0VQX0RFQ1JZX0VOKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdTE2X3QgSXZPZmZzZXQ7CisgICAgICAgICAgICAgICAgICAgIHU4X3Qga2V5TGVuID0gNTsKKyAgICAgICAgICAgICAgICAgICAgdThfdCBpdlszXTsKKyAgICAgICAgICAgICAgICAgICAgdThfdCAqd2VwS2V5OworICAgICAgICAgICAgICAgICAgICB1OF90IGtleUlkeDsKKworICAgICAgICAgICAgICAgICAgICBJdk9mZnNldCA9IG9mZnNldCArIFpNX1NJWkVfT0ZfV0xBTl9EQVRBX0hFQURFUjsKKworICAgICAgICAgICAgICAgICAgICAvKiBSZXRyaWV2ZSBJViAqLworICAgICAgICAgICAgICAgICAgICBpdlswXSA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIEl2T2Zmc2V0KTsKKyAgICAgICAgICAgICAgICAgICAgaXZbMV0gPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBJdk9mZnNldCsxKTsKKyAgICAgICAgICAgICAgICAgICAgaXZbMl0gPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBJdk9mZnNldCsyKTsKKworICAgICAgICAgICAgICAgICAgICBrZXlJZHggPSAoKHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIEl2T2Zmc2V0KzMpID4+IDYpICYgMHgwMyk7CisKKyAgICAgICAgICAgICAgICAgICAgSXZPZmZzZXQgKz0gWk1fU0laRV9PRl9JVjsKKworICAgICAgICAgICAgICAgICAgICBpZiAod2QtPnN0YS5TV0VuY3J5TW9kZVtrZXlJZHhdID09IFpNX1dFUDY0KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBrZXlMZW4gPSA1OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHdkLT5zdGEuU1dFbmNyeU1vZGVba2V5SWR4XSA9PSBaTV9XRVAxMjgpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGtleUxlbiA9IDEzOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHdkLT5zdGEuU1dFbmNyeU1vZGVba2V5SWR4XSA9PSBaTV9XRVAyNTYpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGtleUxlbiA9IDI5OworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgemZXRVBEZWNyeXB0KGRldiwgYnVmLCBJdk9mZnNldCwga2V5TGVuLCB3ZC0+c3RhLndlcEtleVtrZXlJZHhdLCBpdik7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJldCA9PSBaTV9JQ1ZfRkFJTFVSRSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiV0VQIElDViBmYWlsIik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIERpc2NhcmQgSUNWIGZhaWxlZCBmcmFtZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgemZ3QnVmRnJlZShkZXYsIGJ1ZiwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBlbmNyeU1vZGUgPSB3ZC0+c3RhLlNXRW5jcnlNb2RlW2tleUlkeF07CisKKyAgICAgICAgICAgICAgICAgICAgLyogUmVtb3ZlIElDViBmcm9tIGJ1ZmZlciAqLworICAgICAgICAgICAgICAgICAgICB6ZndCdWZTZXRTaXplKGRldiwgYnVmLCBsZW4tNCk7CisKKyAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IFpNX1NJWkVfT0ZfSVY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyNpZmRlZiBaTV9FTkFCTEVfQ0VOQworICAgICAgICAvL2Vsc2UgaWYgKCBlbmNyeU1vZGUgPT0gWk1fQ0VOQyApIC8qIGNoZWNrIGlmIENFTkMgKi8KKyAgICAgICAgaWYgKCBlbmNyeU1vZGUgPT0gWk1fQ0VOQyApCisgICAgICAgIHsKKyAgICAgICAgICAgIHUzMl90IHJ4SVZbNF07CisKKyAgICAgICAgICAgIHJ4SVZbMF0gPSAoem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMjgpIDw8IDE2KQorICAgICAgICAgICAgICAgICAgICAgKyB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCAyNik7CisgICAgICAgICAgICByeElWWzFdID0gKHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIDMyKSA8PCAxNikKKyAgICAgICAgICAgICAgICAgICAgICsgem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMzApOworICAgICAgICAgICAgcnhJVlsyXSA9ICh6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCAzNikgPDwgMTYpCisgICAgICAgICAgICAgICAgICAgICArIHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIDM0KTsKKyAgICAgICAgICAgIHJ4SVZbM10gPSAoem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgNDApIDw8IDE2KQorICAgICAgICAgICAgICAgICAgICAgKyB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCAzOCk7CisKKyAgICAgICAgICAgIC8vem1fZGVidWdfbXNnMigicnhJVlswXSA9IDB4IiwgcnhJVlswXSk7CisgICAgICAgICAgICAvL3ptX2RlYnVnX21zZzIoInJ4SVZbMV0gPSAweCIsIHJ4SVZbMV0pOworICAgICAgICAgICAgLy96bV9kZWJ1Z19tc2cyKCJyeElWWzJdID0gMHgiLCByeElWWzJdKTsKKyAgICAgICAgICAgIC8vem1fZGVidWdfbXNnMigicnhJVlszXSA9IDB4IiwgcnhJVlszXSk7CisKKyAgICAgICAgICAgIC8qIGRlc3RpbmF0aW9uIGFkZHJlc3MqLworICAgICAgICAgICAgZGFbMF0gPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCBaTV9XTEFOX0hFQURFUl9BMV9PRkZTRVQpOworICAgICAgICAgICAgZGFbMV0gPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCBaTV9XTEFOX0hFQURFUl9BMV9PRkZTRVQrMik7CisgICAgICAgICAgICBkYVsyXSA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIFpNX1dMQU5fSEVBREVSX0ExX09GRlNFVCs0KTsKKworICAgICAgICAgICAgaWYgKCB3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9BUCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKChkYVswXSAmIDB4MSkpCisgICAgICAgICAgICAgICAgeyAvL211bHRpY2FzdCBmcmFtZQorICAgICAgICAgICAgICAgICAgICAvKiBBY2N1bWxhdGUgdGhlIFBOIHNlcXVlbmNlICovCisgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEucnhpdkdLWzBdICsrOworCisgICAgICAgICAgICAgICAgICAgIGlmICh3ZC0+c3RhLnJ4aXZHS1swXSA9PSAwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLnJ4aXZHS1sxXSsrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHdkLT5zdGEucnhpdkdLWzFdID09IDApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEucnhpdkdLWzJdKys7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAod2QtPnN0YS5yeGl2R0tbMl0gPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5yeGl2R0tbM10rKzsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmICh3ZC0+c3RhLnJ4aXZHS1szXSA9PSAwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLnJ4aXZHS1swXSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLnJ4aXZHS1sxXSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLnJ4aXZHS1syXSA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvL3ptX2RlYnVnX21zZzIoIndkLT5zdGEucnhpdkdLWzBdID0gMHgiLCB3ZC0+c3RhLnJ4aXZHS1swXSk7CisgICAgICAgICAgICAgICAgICAgIC8vem1fZGVidWdfbXNnMigid2QtPnN0YS5yeGl2R0tbMV0gPSAweCIsIHdkLT5zdGEucnhpdkdLWzFdKTsKKyAgICAgICAgICAgICAgICAgICAgLy96bV9kZWJ1Z19tc2cyKCJ3ZC0+c3RhLnJ4aXZHS1syXSA9IDB4Iiwgd2QtPnN0YS5yeGl2R0tbMl0pOworICAgICAgICAgICAgICAgICAgICAvL3ptX2RlYnVnX21zZzIoIndkLT5zdGEucnhpdkdLWzNdID0gMHgiLCB3ZC0+c3RhLnJ4aXZHS1szXSk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAhKCh3ZC0+c3RhLnJ4aXZHS1swXSA9PSByeElWWzBdKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHdkLT5zdGEucnhpdkdLWzFdID09IHJ4SVZbMV0pCisgICAgICAgICAgICAgICAgICAgICAgICAmJiAod2QtPnN0YS5yeGl2R0tbMl0gPT0gcnhJVlsyXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICYmICh3ZC0+c3RhLnJ4aXZHS1szXSA9PSByeElWWzNdKSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHU4X3QgUGFja2V0RGlzY2FyZCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBEaXNjYXJkIFBOIENvZGUgRXJyb3IgZnJhbWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyeElWWzBdIDwgd2QtPnN0YS5yeGl2R0tbMF0pCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFja2V0RGlzY2FyZCA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAod2QtPnN0YS5yeGl2R0tbMF0gPiAweGZmZmZmZmYwKQorICAgICAgICAgICAgICAgICAgICAgICAgeyAvL2JvdW5kYXJ5IGNhc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHJ4SVZbMF0gPCAweGZmZmZmZmYwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoKCgweGZmZmZmZmZmIC0gd2QtPnN0YS5yeGl2R0tbMF0pICsgcnhJVlswXSkgPiAxNikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYWNrZXREaXNjYXJkID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7IC8vbm9ybWFsIGNhc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHJ4SVZbMF0gLSB3ZC0+c3RhLnJ4aXZHS1swXSkgPiAxNikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhY2tldERpc2NhcmQgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN5bmMgc3RhIHBuIGNvZGUgd2l0aCBhcCBiZWNhdXNlIG9mIGxvc3Rpbmcgc29tZSBwYWNrZXRzCisgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLnJ4aXZHS1swXSA9IHJ4SVZbMF07CisgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLnJ4aXZHS1sxXSA9IHJ4SVZbMV07CisgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLnJ4aXZHS1syXSA9IHJ4SVZbMl07CisgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLnJ4aXZHS1szXSA9IHJ4SVZbM107CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoUGFja2V0RGlzY2FyZCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB6bV9kZWJ1Z19tc2cwKCJEaXNjYXJkIFBOIENvZGUgbG9zdCB0b28gbXVjaCBtdWx0aWNhc3QgZnJhbWUiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ZndCdWZGcmVlKGRldiwgYnVmLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsgLy91bmljYXN0IGZyYW1lCisgICAgICAgICAgICAgICAgICAgIC8qIEFjY3VtbGF0ZSB0aGUgUE4gc2VxdWVuY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5yeGl2WzBdICs9IDI7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHdkLT5zdGEucnhpdlswXSA9PSAwIHx8IHdkLT5zdGEucnhpdlswXSA9PSAxKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLnJ4aXZbMV0rKzsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmICh3ZC0+c3RhLnJ4aXZbMV0gPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5yeGl2WzJdKys7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAod2QtPnN0YS5yeGl2WzJdID09IDApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEucnhpdlszXSsrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHdkLT5zdGEucnhpdlszXSA9PSAwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLnJ4aXZbMF0gPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5yeGl2WzFdID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEucnhpdlsyXSA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvL3ptX2RlYnVnX21zZzIoIndkLT5zdGEucnhpdlswXSA9IDB4Iiwgd2QtPnN0YS5yeGl2WzBdKTsKKyAgICAgICAgICAgICAgICAgICAgLy96bV9kZWJ1Z19tc2cyKCJ3ZC0+c3RhLnJ4aXZbMV0gPSAweCIsIHdkLT5zdGEucnhpdlsxXSk7CisgICAgICAgICAgICAgICAgICAgIC8vem1fZGVidWdfbXNnMigid2QtPnN0YS5yeGl2WzJdID0gMHgiLCB3ZC0+c3RhLnJ4aXZbMl0pOworICAgICAgICAgICAgICAgICAgICAvL3ptX2RlYnVnX21zZzIoIndkLT5zdGEucnhpdlszXSA9IDB4Iiwgd2QtPnN0YS5yeGl2WzNdKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoICEoKHdkLT5zdGEucnhpdlswXSA9PSByeElWWzBdKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHdkLT5zdGEucnhpdlsxXSA9PSByeElWWzFdKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHdkLT5zdGEucnhpdlsyXSA9PSByeElWWzJdKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHdkLT5zdGEucnhpdlszXSA9PSByeElWWzNdKSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIlBOIENvZGUgbWlzbWF0Y2gsIGxvc3QgdW5pY2FzdCBmcmFtZSwgc3luYyBwbiBjb2RlIHRvIHJlY3YgcGFja2V0Iik7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBzeW5jIHN0YSBwbiBjb2RlIHdpdGggYXAgYmVjYXVzZSBvZiBsb3N0aW5nIHNvbWUgcGFja2V0cworICAgICAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5yeGl2WzBdID0gcnhJVlswXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEucnhpdlsxXSA9IHJ4SVZbMV07CisgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLnJ4aXZbMl0gPSByeElWWzJdOworICAgICAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5yeGl2WzNdID0gcnhJVlszXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIERpc2NhcmQgUE4gQ29kZSBFcnJvciBmcmFtZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgLy96bV9kZWJ1Z19tc2cwKCJEaXNjYXJkIFBOIENvZGUgbWlzbWF0Y2ggdW5pY2FzdCBmcmFtZSIpOworICAgICAgICAgICAgICAgICAgICAgICAgLy96ZndCdWZGcmVlKGRldiwgYnVmLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisjZW5kaWYgLy9aTV9FTkFCTEVfQ0VOQworCisgICAgICAgIC8qIGZvciB0YWxseSAqLworICAgICAgICBpZiAoKHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIFpNX1dMQU5fSEVBREVSX0ExX09GRlNFVCkgJiAweDEpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIGZvciBBQ1UgdG8gZGlzcGxheSBSeFJhdGUgKi8KKyAgICAgICAgICAgIHpmV2xhblVwZGF0ZVJ4UmF0ZShkZXYsIGFkZEluZm8pOworCisgICAgICAgICAgICB3ZC0+Y29tbVRhbGx5LnJ4VW5pY2FzdEZybSsrOworICAgICAgICAgICAgd2QtPmNvbW1UYWxseS5yeFVuaWNhc3RPY3RldHMgKz0gKGxlbi0yNCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgWk1fV0xBTl9IRUFERVJfQTFfT0ZGU0VUKSA9PSAweGZmZmYpCisgICAgICAgIHsKKyAgICAgICAgICAgIHdkLT5jb21tVGFsbHkucnhCcm9hZGNhc3RGcm0rKzsKKyAgICAgICAgICAgIHdkLT5jb21tVGFsbHkucnhCcm9hZGNhc3RPY3RldHMgKz0gKGxlbi0yNCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB3ZC0+Y29tbVRhbGx5LnJ4TXVsdGljYXN0RnJtKys7CisgICAgICAgICAgICB3ZC0+Y29tbVRhbGx5LnJ4TXVsdGljYXN0T2N0ZXRzICs9IChsZW4tMjQpOworICAgICAgICB9CisgICAgICAgIHdkLT5sZWRTdHJ1Y3QucnhUcmFmZmljKys7CisKKyAgICAgICAgaWYgKChmcmFtZVN1YnR5cGUgJiAweDgwKSA9PSAweDgwKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBpZiBRb1MgY29udHJvbCBiaXQtNyBpcyAxID0+IEEtTVNEVSBmcmFtZSAqLworICAgICAgICAgICAgaWYgKCh6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCAyNCkgJiAweDgwKSAhPSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHpmRGVBbXNkdShkZXYsIGJ1ZiwgdmFwLCBlbmNyeU1vZGUpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFJlbW92ZSBNSUMgb2YgVEtJUAorICAgICAgICBpZiAoIGVuY3J5TW9kZSA9PSBaTV9US0lQICkKKyAgICAgICAgeworICAgICAgICAgICAgemZ3QnVmU2V0U2l6ZShkZXYsIGJ1ZiwgemZ3QnVmR2V0U2l6ZShkZXYsIGJ1ZikgLSA4KTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIENvbnZlcnQgODAyLjExIGFuZCBTTkFQIGhlYWRlciB0byBldGhlcm5ldCBoZWFkZXIgKi8KKyAgICAgICAgaWYgKCAod2QtPndsYW5Nb2RlID09IFpNX01PREVfSU5GUkFTVFJVQ1RVUkUpfHwKKyAgICAgICAgICAgICAod2QtPndsYW5Nb2RlID09IFpNX01PREVfSUJTUykgKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBkZXN0aW5hdGlvbiBhZGRyZXNzKi8KKyAgICAgICAgICAgIGRhWzBdID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgWk1fV0xBTl9IRUFERVJfQTFfT0ZGU0VUKTsKKyAgICAgICAgICAgIGRhWzFdID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgWk1fV0xBTl9IRUFERVJfQTFfT0ZGU0VUKzIpOworICAgICAgICAgICAgZGFbMl0gPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCBaTV9XTEFOX0hFQURFUl9BMV9PRkZTRVQrNCk7CisKKyAgICAgICAgICAgIC8qIGNoZWNrIGJyb2FkY2FzdCBmcmFtZSAqLworICAgICAgICAgICAgaWYgKCAoZGFbMF0gPT0gMHhmZmZmKSAmJiAoZGFbMV0gPT0gMHhmZmZmKSAmJiAoZGFbMl0gPT0gMHhmZmZmKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gQXAgc2VuZCBicm9hZGNhc3QgZnJhbWUgdG8gdGhlIERVVCAhCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBjaGVjayBtdWx0aWNhc3QgZnJhbWUgKi8KKyAgICAgICAgICAgIC8qIFRPRE8gOiBSZW1vdmUgdGhlc2UgY29kZSwgaGFyZHdhcmUgc2hvdWxkIGJlIGFibGUgdG8gYmxvY2sgKi8KKyAgICAgICAgICAgIC8qICAgICAgICBtdWx0aWNhc3QgZnJhbWUgb24gdGhlIG11bHRpY2FzdCBhZGRyZXNzIGxpc3QgICAgICAgKi8KKyAgICAgICAgICAgIC8qICAgICAgICBvciBieXBhc3MgYWxsIG11bHRpY2FzdCBwYWNrZXQgYnkgZmxhZyBiQWxsTXVsdGljYXN0ICovCisgICAgICAgICAgICBlbHNlIGlmICgoZGFbMF0gJiAweDAxKSAmJiAod2QtPnN0YS5iQWxsTXVsdGljYXN0ID09IDApKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvcihpaT0wOyBpaTx3ZC0+c3RhLm11bHRpY2FzdExpc3Quc2l6ZTsgaWkrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICggemZNZW1vcnlJc0VxdWFsKHdkLT5zdGEubXVsdGljYXN0TGlzdC5tYWNBZGRyW2lpXS5hZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodThfdCopIGRhLCA2KSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIGlpID09IHdkLT5zdGEubXVsdGljYXN0TGlzdC5zaXplICkKKyAgICAgICAgICAgICAgICB7ICAgLyogbm90IGZvdW5kICovCisgICAgICAgICAgICAgICAgICAgIHptX2RlYnVnX21zZzAoImRpc2NhcmQgdW5rbm93biBtdWx0aWNhc3QgZnJhbWUiKTsKKworICAgICAgICAgICAgICAgICAgICB6ZndCdWZGcmVlKGRldiwgYnVmLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworI2lmZGVmIFpNX0VOQUJMRV9OQVRJVkVfV0lGSSAvL05hdGl2ZSBXaWZpIDogMSwgRXRoZXJuZXQgZm9ybWF0IDogMAorICAgICAgICAgICAgLy9UbyByZW1vdmUgSVYKKyAgICAgICAgICAgIGlmIChvZmZzZXQgPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvciAoaT0xMjsgaT4wOyBpLS0pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3dyaXRlaChkZXYsIGJ1ZiwgKChpLTEpKjIpK29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCAoaS0xKSoyKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHpmd0J1ZlJlbW92ZUhlYWQoZGV2LCBidWYsIG9mZnNldCk7CisgICAgICAgICAgICB9CisjZWxzZQorCisgICAgICAgICAgICBpZiAoemZSeEJ1ZmZlckVxdWFsVG9TdHIoZGV2LCBidWYsIHpnU25hcEJyaWRnZVR1bm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNCtvZmZzZXQsIDYpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNuYXBDYXNlID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKCB6ZlJ4QnVmZmVyRXF1YWxUb1N0cihkZXYsIGJ1ZiwgemdTbmFwODAyMWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjQrb2Zmc2V0LCA2KSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHlwZUxlbmd0aEZpZWxkID0KKyAgICAgICAgICAgICAgICAgICAgKCgodTE2X3QpIHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIDMwK29mZnNldCkpIDw8IDgpICsKKyAgICAgICAgICAgICAgICAgICAgem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgMzErb2Zmc2V0KTsKKworICAgICAgICAgICAgICAgIC8vem1fZGVidWdfbXNnMigidHB5ZUxlbmd0aEZpZWxkID0gIiwgdHlwZUxlbmd0aEZpZWxkKTsKKworICAgICAgICAgICAgICAgIC8vODEzNyA6IElQWCwgODBGMyA6IEFwcGxldGFsaworICAgICAgICAgICAgICAgIGlmICggKHR5cGVMZW5ndGhGaWVsZCAhPSAweDgxMzcpJiYKKyAgICAgICAgICAgICAgICAgICAgICh0eXBlTGVuZ3RoRmllbGQgIT0gMHg4MEYzKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzbmFwQ2FzZSA9IDI7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCB0eXBlTGVuZ3RoRmllbGQgPT0gMHg4ODhFICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHpmU2hvd1J4RUFQT0woZGV2LCBidWYsIDMyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy96ZndEdW1wQnVmKGRldiwgYnVmKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogc291cmNlIGFkZHJlc3MgKi8KKyAgICAgICAgICAgIGlmICggd2QtPndsYW5Nb2RlID09IFpNX01PREVfSU5GUkFTVFJVQ1RVUkUgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIFNBID0gQWRkcmVzcyAzICovCisgICAgICAgICAgICAgICAgc2FbMF0gPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCBaTV9XTEFOX0hFQURFUl9BM19PRkZTRVQpOworICAgICAgICAgICAgICAgIHNhWzFdID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgWk1fV0xBTl9IRUFERVJfQTNfT0ZGU0VUKzIpOworICAgICAgICAgICAgICAgIHNhWzJdID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgWk1fV0xBTl9IRUFERVJfQTNfT0ZGU0VUKzQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIFNBID0gQWRkcmVzcyAyICovCisgICAgICAgICAgICAgICAgc2FbMF0gPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCBaTV9XTEFOX0hFQURFUl9BMl9PRkZTRVQpOworICAgICAgICAgICAgICAgIHNhWzFdID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgWk1fV0xBTl9IRUFERVJfQTJfT0ZGU0VUKzIpOworICAgICAgICAgICAgICAgIHNhWzJdID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgWk1fV0xBTl9IRUFERVJfQTJfT0ZGU0VUKzQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHNuYXBDYXNlICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBTQSAqLworICAgICAgICAgICAgICAgIHptd19yeF9idWZfd3JpdGVoKGRldiwgYnVmLCAyNCtvZmZzZXQsIHNhWzBdKTsKKyAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3dyaXRlaChkZXYsIGJ1ZiwgMjYrb2Zmc2V0LCBzYVsxXSk7CisgICAgICAgICAgICAgICAgem13X3J4X2J1Zl93cml0ZWgoZGV2LCBidWYsIDI4K29mZnNldCwgc2FbMl0pOworCisgICAgICAgICAgICAgICAgLyogREEgPSBBZGRyZXNzIDEgKi8KKyAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3dyaXRlaChkZXYsIGJ1ZiwgMTgrb2Zmc2V0LCBkYVswXSk7CisgICAgICAgICAgICAgICAgem13X3J4X2J1Zl93cml0ZWgoZGV2LCBidWYsIDIwK29mZnNldCwgZGFbMV0pOworICAgICAgICAgICAgICAgIHptd19yeF9idWZfd3JpdGVoKGRldiwgYnVmLCAyMitvZmZzZXQsIGRhWzJdKTsKKyAgICAgICAgICAgICAgICB6ZndCdWZSZW1vdmVIZWFkKGRldiwgYnVmLCAxOCtvZmZzZXQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIFNBICovCisgICAgICAgICAgICAgICAgem13X3J4X2J1Zl93cml0ZWgoZGV2LCBidWYsIDE2K29mZnNldCwgc2FbMF0pOworICAgICAgICAgICAgICAgIHptd19yeF9idWZfd3JpdGVoKGRldiwgYnVmLCAxOCtvZmZzZXQsIHNhWzFdKTsKKyAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3dyaXRlaChkZXYsIGJ1ZiwgMjArb2Zmc2V0LCBzYVsyXSk7CisKKyAgICAgICAgICAgICAgICAvKiBEQSA9IEFkZHJlc3MgMSAqLworICAgICAgICAgICAgICAgIHptd19yeF9idWZfd3JpdGVoKGRldiwgYnVmLCAxMCtvZmZzZXQsIGRhWzBdKTsKKyAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3dyaXRlaChkZXYsIGJ1ZiwgMTIrb2Zmc2V0LCBkYVsxXSk7CisgICAgICAgICAgICAgICAgem13X3J4X2J1Zl93cml0ZWgoZGV2LCBidWYsIDE0K29mZnNldCwgZGFbMl0pOworICAgICAgICAgICAgICAgIHpmd0J1ZlJlbW92ZUhlYWQoZGV2LCBidWYsIDEwK29mZnNldCk7CisgICAgICAgICAgICAgICAgLyogRXRoZXJuZXQgcGF5bG9hZCBsZW5ndGggKi8KKyAgICAgICAgICAgICAgICB0eXBlTGVuZ3RoRmllbGQgPSB6ZndCdWZHZXRTaXplKGRldiwgYnVmKSAtIDE0OworICAgICAgICAgICAgICAgIHptd19yeF9idWZfd3JpdGVoKGRldiwgYnVmLCAxMiwgKHR5cGVMZW5ndGhGaWVsZDw8OCkrKHR5cGVMZW5ndGhGaWVsZD4+OCkpOworICAgICAgICAgICAgfQorI2VuZGlmICAvLyBaTV9FTkFCTEVfTkFUSVZFX1dJRkkKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9BUCkKKyAgICAgICAgeworICAgICAgICAgICAgLy9pZiAoKHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIDEpICYgMHgzKSAhPSAzKQorICAgICAgICAgICAgaWYgKHZhcCA8IFpNX01BWF9BUF9TVVBQT1JUKQorICAgICAgICAgICAgLyogQVAgbW9kZSAqLworICAgICAgICAgICAgeworI2lmZGVmIFpNX0VOQUJMRV9OQVRJVkVfV0lGSSAvL05hdGl2ZSBXaWZpIDogMSwgRXRoZXJuZXQgZm9ybWF0IDogMAorICAgICAgICAgICAgICAgIC8vVG8gcmVtb3ZlIElWCisgICAgICAgICAgICAgICAgaWYgKG9mZnNldCA+IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGk9MTI7IGk+MDsgaS0tKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3dyaXRlaChkZXYsIGJ1ZiwgKChpLTEpKjIpK29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgKGktMSkqMikpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHpmd0J1ZlJlbW92ZUhlYWQoZGV2LCBidWYsIG9mZnNldCk7CisgICAgICAgICAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgICAgICAgICAvKiBTQSA9IEFkZHJlc3MgMiAqLworICAgICAgICAgICAgICAgIHptd19yeF9idWZfd3JpdGVoKGRldiwgYnVmLCAyNCtvZmZzZXQsIHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICBaTV9XTEFOX0hFQURFUl9BMl9PRkZTRVQpKTsKKyAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3dyaXRlaChkZXYsIGJ1ZiwgMjYrb2Zmc2V0LCB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgWk1fV0xBTl9IRUFERVJfQTJfT0ZGU0VUKzIpKTsKKyAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3dyaXRlaChkZXYsIGJ1ZiwgMjgrb2Zmc2V0LCB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgWk1fV0xBTl9IRUFERVJfQTJfT0ZGU0VUKzQpKTsKKyAgICAgICAgICAgICAgICAvKiBEQSA9IEFkZHJlc3MgMyAqLworICAgICAgICAgICAgICAgIC8qIFNlcSA6IFJlYWQgMjAgd3JpdGUgMjIsIHJlYWQgMTggd3JpdGUgMjAsIHJlYWQgMTYgd3JpdGUgMTggKi8KKyAgICAgICAgICAgICAgICAvKiBzZXF1ZW5jZSBtdXN0IG5vdCBiZSBpbnZlcnRlZCAqLworICAgICAgICAgICAgICAgIHptd19yeF9idWZfd3JpdGVoKGRldiwgYnVmLCAyMitvZmZzZXQsIHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICBaTV9XTEFOX0hFQURFUl9BM19PRkZTRVQrNCkpOworICAgICAgICAgICAgICAgIHptd19yeF9idWZfd3JpdGVoKGRldiwgYnVmLCAyMCtvZmZzZXQsIHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICBaTV9XTEFOX0hFQURFUl9BM19PRkZTRVQrMikpOworICAgICAgICAgICAgICAgIHptd19yeF9idWZfd3JpdGVoKGRldiwgYnVmLCAxOCtvZmZzZXQsIHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICBaTV9XTEFOX0hFQURFUl9BM19PRkZTRVQpKTsKKyAgICAgICAgICAgICAgICB6ZndCdWZSZW1vdmVIZWFkKGRldiwgYnVmLCAxOCtvZmZzZXQpOworI2VuZGlmICAvLyBaTV9FTkFCTEVfTkFUSVZFX1dJRkkKKyAgICAgICAgICAgICAgICAjaWYgMQorICAgICAgICAgICAgICAgIGlmICgocmV0ID0gemZJbnRyYWJzc0ZvcndhcmQoZGV2LCBidWYsIHZhcCkpID09IDEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFJ4IGJ1ZmZlciBpZiBpbnRyYS1CU1MgdW5pY2FzdCBmcmFtZSAqLworICAgICAgICAgICAgICAgICAgICB6bV9tc2cwX3J4KFpNX0xWXzIsICJGcmVlIGludHJhLUJTUyB1bmljYXN0IGZyYW1lIik7CisgICAgICAgICAgICAgICAgICAgIHpmd0J1ZkZyZWUoZGV2LCBidWYsIDApOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgLyogV0RTIG1vZGUgKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6bV9tc2cwX3J4KFpNX0xWXzIsICJSeCBXRFMgZGF0YSIpOworCisgICAgICAgICAgICAgICAgLyogU0EgPSBBZGRyZXNzIDQgKi8KKyAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3dyaXRlaChkZXYsIGJ1ZiwgMzArb2Zmc2V0LCB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgWk1fV0xBTl9IRUFERVJfQTRfT0ZGU0VUKSk7CisgICAgICAgICAgICAgICAgem13X3J4X2J1Zl93cml0ZWgoZGV2LCBidWYsIDMyK29mZnNldCwgem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFpNX1dMQU5fSEVBREVSX0E0X09GRlNFVCsyKSk7CisgICAgICAgICAgICAgICAgem13X3J4X2J1Zl93cml0ZWgoZGV2LCBidWYsIDM0K29mZnNldCwgem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFpNX1dMQU5fSEVBREVSX0E0X09GRlNFVCs0KSk7CisgICAgICAgICAgICAgICAgLyogREEgPSBBZGRyZXNzIDMgKi8KKyAgICAgICAgICAgICAgICAvKiBTZXEgOiBSZWFkIDIwIHdyaXRlIDIyLCByZWFkIDE4IHdyaXRlIDIwLCByZWFkIDE2IHdyaXRlIDE4ICovCisgICAgICAgICAgICAgICAgLyogc2VxdWVuY2UgbXVzdCBub3QgYmUgaW52ZXJ0ZWQgKi8KKyAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3dyaXRlaChkZXYsIGJ1ZiwgMjgrb2Zmc2V0LCB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgWk1fV0xBTl9IRUFERVJfQTNfT0ZGU0VUKzQpKTsKKyAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3dyaXRlaChkZXYsIGJ1ZiwgMjYrb2Zmc2V0LCB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgWk1fV0xBTl9IRUFERVJfQTNfT0ZGU0VUKzIpKTsKKyAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3dyaXRlaChkZXYsIGJ1ZiwgMjQrb2Zmc2V0LCB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgWk1fV0xBTl9IRUFERVJfQTNfT0ZGU0VUKSk7CisgICAgICAgICAgICAgICAgemZ3QnVmUmVtb3ZlSGVhZChkZXYsIGJ1ZiwgMjQrb2Zmc2V0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9QU0VVRE8pCisgICAgICAgIHsKKwkJCS8qIFdEUyB0ZXN0OiByZW1vdmUgYWRkNCAqLworICAgICAgICAgICAgaWYgKHdkLT5lbmFibGVXRFMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IDY7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIFNBID0gQWRkcmVzcyAyICovCisgICAgICAgICAgICB6bXdfcnhfYnVmX3dyaXRlaChkZXYsIGJ1ZiwgMjQrb2Zmc2V0LCB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWk1fV0xBTl9IRUFERVJfQTJfT0ZGU0VUKSk7CisgICAgICAgICAgICB6bXdfcnhfYnVmX3dyaXRlaChkZXYsIGJ1ZiwgMjYrb2Zmc2V0LCB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWk1fV0xBTl9IRUFERVJfQTJfT0ZGU0VUKzIpKTsKKyAgICAgICAgICAgIHptd19yeF9idWZfd3JpdGVoKGRldiwgYnVmLCAyOCtvZmZzZXQsIHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaTV9XTEFOX0hFQURFUl9BMl9PRkZTRVQrNCkpOworICAgICAgICAgICAgLyogREEgPSBBZGRyZXNzIDEgKi8KKyAgICAgICAgICAgIHptd19yeF9idWZfd3JpdGVoKGRldiwgYnVmLCAxOCtvZmZzZXQsIHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaTV9XTEFOX0hFQURFUl9BMV9PRkZTRVQpKTsKKyAgICAgICAgICAgIHptd19yeF9idWZfd3JpdGVoKGRldiwgYnVmLCAyMCtvZmZzZXQsIHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaTV9XTEFOX0hFQURFUl9BMV9PRkZTRVQrMikpOworICAgICAgICAgICAgem13X3J4X2J1Zl93cml0ZWgoZGV2LCBidWYsIDIyK29mZnNldCwgem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFpNX1dMQU5fSEVBREVSX0ExX09GRlNFVCs0KSk7CisgICAgICAgICAgICB6ZndCdWZSZW1vdmVIZWFkKGRldiwgYnVmLCAxOCtvZmZzZXQpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgem1fYXNzZXJ0KDApOworICAgICAgICB9CisKKyAgICAgICAgLyogQ2FsbCB6ZndSZWN2RXRoKCkgdG8gbm90aWZ5IHVwcGVyIGxheWVyICovCisgICAgICAgIC8vem1fbXNnMl9yeChaTV9MVl8yLCAiQ2FsbCB6ZndSZWN2RXRoKCksIGJ1Zj0iLCBidWYpOworICAgICAgICAvL3pmd0R1bXBCdWYoZGV2LCBidWYpOworCisgICAgICAgICNpZiBaTV9QUk9UT0NPTF9SRVNQT05TRV9TSU1VTEFUSU9OID09IDEKKyAgICAgICAgemZQcm90UnNwU2ltKGRldiwgYnVmKTsKKyAgICAgICAgI2VuZGlmCisgICAgICAgIC8vemZ3RHVtcEJ1ZihkZXYsIGJ1Zik7CisKKyAgICAgICAgLyogdGFsbHkgKi8KKyAgICAJd2QtPmNvbW1UYWxseS5Ob3RpZnlORElTUnhGcm1DbnQrKzsKKworICAgIAlpZiAod2QtPnpmY2JSZWN2RXRoICE9IE5VTEwpCisgICAgCXsKKyAgICAgICAgICAgIHdkLT56ZmNiUmVjdkV0aChkZXYsIGJ1ZiwgdmFwKTsKKyAgICAgICAgICAgIFpNX1BFUkZPUk1BTkNFX1JYX01TRFUoZGV2LCB3ZC0+dGljaykKKyAgICAgICAgfQorICAgIH0KKyAgICAvKiBpZiBtYW5hZ2VtZW50IGZyYW1lICovCisgICAgZWxzZSBpZiAoZnJhbWVUeXBlID09IFpNX1dMQU5fTUFOQUdFTUVOVF9GUkFNRSkKKyAgICB7CisgICAgICAgIHptX21zZzJfcngoWk1fTFZfMiwgIlJ4IG1hbmFnZW1lbnQsRkM9IiwgZnJhbWVDdHJsKTsKKyAgICAgICAgLyogQ2FsbCB6ZlByb2Nlc3NNYW5hZ2VtZW50KCkgdG8gaGFuZGxlIG1hbmFnZW1lbnQgZnJhbWUgKi8KKyAgICAgICAgemZQcm9jZXNzTWFuYWdlbWVudChkZXYsIGJ1ZiwgYWRkSW5mbyk7IC8vQ1dZYW5nKG0pCisgICAgICAgIHpmd0J1ZkZyZWUoZGV2LCBidWYsIDApOworICAgIH0KKyAgICAvKiBQc1BvbGwgKi8KKyAgICBlbHNlIGlmICgod2QtPndsYW5Nb2RlID09IFpNX01PREVfQVApICYmIChmcmFtZUN0cmwgPT0gMHhhNCkpCisgICAgeworICAgICAgICB6bV9tc2cwX3J4KFpNX0xWXzAsICJSeCBQc1BvbGwiKTsKKyAgICAgICAgemZBcFByb2Nlc3NQc1BvbGwoZGV2LCBidWYpOworICAgICAgICB6ZndCdWZGcmVlKGRldiwgYnVmLCAwKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgem1fbXNnMF9yeChaTV9MVl8xLCAiUnggZGlzY2FyZCEhIik7CisgICAgICAgIHdkLT5jb21tVGFsbHkuRHJpdmVyRGlzY2FyZGVkRnJtKys7CisKKyAgICAgICAgemZ3QnVmRnJlZShkZXYsIGJ1ZiwgMCk7CisgICAgfQorICAgIHJldHVybjsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZXbGFuUnhWYWxpZGF0ZSAgICAgICAgICAgICovCisvKiAgICAgIFZhbGlkYXRlIFJ4IGZyYW1lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGRldiA6IGRldmljZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBidWYgOiByZWNlaXZlZCA4MDIuMTEgZnJhbWUgYnVmZmVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBFcnJvciBjb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBTdGVwaGVuICAgICAgICAgICAgIFp5REFTIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24gICAgMjAwNS4xMCAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTE2X3QgemZXbGFuUnhWYWxpZGF0ZSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpCit7CisgICAgdTE2X3QgZnJhbWVUeXBlOworICAgIHUxNl90IGZyYW1lQ3RybDsKKyAgICB1MTZfdCBmcmFtZUxlbjsKKyAgICB1MTZfdCByZXQ7CisgICAgdThfdCAgZnJhbWVTdWJUeXBlOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgZnJhbWVDdHJsID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMCk7CisgICAgZnJhbWVUeXBlID0gZnJhbWVDdHJsICYgMHhDOworICAgIGZyYW1lU3ViVHlwZSA9IChmcmFtZUN0cmwgJiAweEYwKSA+PiA0OworCisgICAgZnJhbWVMZW4gPSB6ZndCdWZHZXRTaXplKGRldiwgYnVmKTsKKworICAgIC8qIEFjY2VwdCBEYXRhL01hbmFnZW1lbnQgZnJhbWUgd2l0aCBwcm90b2NvbCB2ZXJzaW9uID0gMCAqLworICAgIGlmICgoZnJhbWVUeXBlID09IDB4OCkgfHwgKGZyYW1lVHlwZSA9PSAweDApKQorICAgIHsKKworICAgICAgICAvKiBUT0RPIDogY2hlY2sgcnggc3RhdHVzID0+IGVycm8gYml0ICovCisKKyAgICAgICAgLyogQ2hlY2sgTWluaW11bSBMZW5ndGggd2l0aCBXZXAgKi8KKyAgICAgICAgaWYgKChmcmFtZUN0cmwgJiAweDQwMDApICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIE1pbmltdW0gTGVuZ3RoID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgLyogICAgIFBMQ1AoNSkrSGVhZGVyKDI0KStJVig0KStJQ1YoNCkrQ1JDKDQpK1J4U3RhdHVzKDgpICovCisgICAgICAgICAgICBpZiAoZnJhbWVMZW4gPCAzMikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gWk1fRVJSX01JTl9SWF9FTkNSWVBUX0ZSQU1FX0xFTkdUSDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICggZnJhbWVTdWJUeXBlID09IDB4NSB8fCBmcmFtZVN1YlR5cGUgPT0gMHg4ICkKKyAgICAgICAgeworICAgICAgICAgICAgLyogTWluaW11bSBMZW5ndGggPSBQTENQKDUpK01BQ0hlYWRlcigyNCkrVGltZXN0YW1wKDgpK0JlYWNvbkludGVydmFsKDIpK0NhcCgyKStDUkMoNCkrUnhTdGF0dXMoOCkgKi8KKyAgICAgICAgICAgIGlmIChmcmFtZUxlbiA8IDM2KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBaTV9FUlJfTUlOX1JYX0ZSQU1FX0xFTkdUSDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIE1pbmltdW0gTGVuZ3RoID0gUExDUCg1KStNQUNIZWFkZXIoMjQpK0NSQyg0KStSeFN0YXR1cyg4KSAqLworICAgICAgICAgICAgaWYgKGZyYW1lTGVuIDwgMjQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFpNX0VSUl9NSU5fUlhfRlJBTUVfTEVOR1RIOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogQ2hlY2sgaWYgZnJhbWUgTGVuZ3RoID4gWk1fV0xBTl9NQVhfUlhfU0laRS4gKi8KKyAgICAgICAgaWYgKGZyYW1lTGVuID4gWk1fV0xBTl9NQVhfUlhfU0laRSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFpNX0VSUl9NQVhfUlhfRlJBTUVfTEVOR1RIOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKChmcmFtZUN0cmwmMHhmZikgPT0gMHhhNCkKKyAgICB7CisgICAgICAgIC8qIFBzUG9sbCAqLworICAgICAgICAvL3ptX21zZzBfcngoWk1fTFZfMCwgInJ4IHBzcG9sbCIpOworICAgIH0KKyAgICBlbHNlIGlmICgoZnJhbWVDdHJsJjB4ZmYpID09IFpNX1dMQU5fRlJBTUVfVFlQRV9CQVIpCisgICAgeworICAgICAgICBpZiAod2QtPnN0YS5lbmFibGVEcnZCQSA9PSAxKQorICAgICAgICB7CisgICAgICAgICAgICB6ZkFnZ1JlY3ZCQVIoZGV2LCBidWYpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIFpNX0VSUl9SWF9CQVJfRlJBTUU7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJldHVybiBaTV9FUlJfUlhfRlJBTUVfVFlQRTsKKyAgICB9CisKKyAgICBpZiAoIHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0FQICkKKyAgICB7CisgICAgfQorICAgIGVsc2UgaWYgKCB3ZC0+d2xhbk1vZGUgIT0gWk1fTU9ERV9QU0VVRE8gKQorICAgIHsKKyAgICAgICAgaWYgKCAocmV0PXpmU3RhUnhWYWxpZGF0ZUZyYW1lKGRldiwgYnVmKSkhPVpNX1NVQ0NFU1MgKQorICAgICAgICB7CisgICAgICAgICAgICAvL3ptX2RlYnVnX21zZzEoImRpc2NhcmQgZnJhbWUsIGNvZGUgPSAiLCByZXQpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBaTV9TVUNDRVNTOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZldsYW5SeEZpbHRlciAgICAgICAgICAgICAgKi8KKy8qICAgICAgRmlsdGVyIGR1cGxpY2F0ZWQgZnJhbWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGJ1ZiA6IHJlY2VpdmVkIDgwMi4xMSBmcmFtZSBidWZmZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIEVycm9yIGNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFN0ZXBoZW4gICAgICAgICAgICAgWnlEQVMgVGVjaG5vbG9neSBDb3Jwb3JhdGlvbiAgICAyMDA1LjEwICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MTZfdCB6ZldsYW5SeEZpbHRlcih6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpCit7CisgICAgdTE2X3Qgc3JjWzNdOworICAgIHUxNl90IGRzdDA7CisgICAgdTE2X3QgZnJhbWVUeXBlOworICAgIHUxNl90IHNlcTsKKyAgICB1MTZfdCBvZmZzZXQ7CisgICAgdTE2X3QgaW5kZXg7CisgICAgdTE2X3QgY29sOworICAgIHUxNl90IGk7CisgICAgdThfdCB1cCA9IDA7IC8qIFVzZXIgcHJpb3JpdHkgKi8KKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICBaTV9CVUZGRVJfVFJBQ0UoZGV2LCBidWYpCisKKyAgICAvKiBSWCBQUkVGSVggKi8KKyAgICBvZmZzZXQgPSAwOworCisgICAgZnJhbWVUeXBlID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1Ziwgb2Zmc2V0KTsKKworICAgIC8vIERvbid0IGRpdmlkZSAyXjQgYmVjYXVzZSB3ZSBkb24ndCB3YW50IHRoZSBmcmFnZW1lbnRhdGlvbiBwa3QgdG8gYmUgdHJlYXRlZCBhcworICAgIC8vIGR1cGxpY2F0ZWQgZnJhbWVzCisgICAgc2VxID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1Ziwgb2Zmc2V0KzIyKTsKKyAgICBkc3QwID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1Ziwgb2Zmc2V0KzQpOworICAgIHNyY1swXSA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIG9mZnNldCsxMCk7CisgICAgc3JjWzFdID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1Ziwgb2Zmc2V0KzEyKTsKKyAgICBzcmNbMl0gPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCBvZmZzZXQrMTQpOworCisgICAgLyogUW9TIGRhdGEgZnJhbWUgKi8KKyAgICBpZiAoKGZyYW1lVHlwZSAmIDB4ODgpID09IDB4ODgpCisgICAgeworICAgICAgICB1cCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsyNCk7CisgICAgICAgIHVwICY9IDB4NzsKKyAgICB9CisKKyAgICBpbmRleCA9IChzcmNbMl0rdXApICYgKFpNX0ZJTFRFUl9UQUJMRV9ST1ctMSk7CisKKyAgICAvKiBUQkQgOiBmaWx0ZXIgZnJhbWUgd2l0aCBzb3VyY2UgYWRkcmVzcyA9PSBvd24gTUFDIGFkcmVzcyAqLworICAgIGlmICgod2QtPm1hY0FkZHJbMF0gPT0gc3JjWzBdKSAmJiAod2QtPm1hY0FkZHJbMV0gPT0gc3JjWzFdKQorICAgICAgICAgICAgJiYgKHdkLT5tYWNBZGRyWzJdID09IHNyY1syXSkpCisgICAgeworICAgICAgICAvL3ptX21zZzBfcngoWk1fTFZfMCwgIlJ4IGZpbHRlcj0+c3JjIGlzIG93biBNQUMiKTsKKyAgICAgICAgd2QtPnRyYWZUYWxseS5yeFNyY0lzT3duTWFjKys7CisjaWYgMAorICAgICAgICByZXR1cm4gWk1fRVJSX1JYX1NSQ19BRERSX0lTX09XTl9NQUM7CisjZW5kaWYKKyAgICB9CisKKyAgICB6bV9tc2cyX3J4KFpNX0xWXzIsICJSeCBzZXE9Iiwgc2VxKTsKKworICAgIC8qIEZpbHRlciB1bmljYXN0IGZyYW1lIG9ubHkgKi8KKyAgICBpZiAoKGRzdDAgJiAweDEpID09IDApCisgICAgeworICAgICAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgICAgIGZvcihpPTA7IGk8Wk1fRklMVEVSX1RBQkxFX0NPTDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoKHdkLT5yeEZpbHRlclRibFtpXVtpbmRleF0uYWRkclswXSA9PSBzcmNbMF0pCisgICAgICAgICAgICAgICAgICAgICYmICh3ZC0+cnhGaWx0ZXJUYmxbaV1baW5kZXhdLmFkZHJbMV0gPT0gc3JjWzFdKQorICAgICAgICAgICAgICAgICAgICAmJiAod2QtPnJ4RmlsdGVyVGJsW2ldW2luZGV4XS5hZGRyWzJdID09IHNyY1syXSkKKyAgICAgICAgICAgICAgICAgICAgJiYgKHdkLT5yeEZpbHRlclRibFtpXVtpbmRleF0udXAgPT0gdXApKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgoKGZyYW1lVHlwZSYweDgwMCk9PTB4ODAwKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYod2QtPnJ4RmlsdGVyVGJsW2ldW2luZGV4XS5zZXE9PXNlcSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICAgICAgICAgICAgICAvKiBoaXQgOiBkdXBsaWNhdGVkIGZyYW1lICovCisgICAgICAgICAgICAgICAgICAgIHptX21zZzBfcngoWk1fTFZfMSwgIlJ4IGZpbHRlciBoaXQ9PmR1cGxpY2F0ZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgd2QtPnRyYWZUYWxseS5yeER1cGxpY2F0ZSsrOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gWk1fRVJSX1JYX0RVUExJQ0FURTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyogaGl0IDogbm90IGR1cGxpY2F0ZWQgZnJhbWUsIHVwZGF0ZSBzZXF1ZW5jZSBudW1iZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgd2QtPnJ4RmlsdGVyVGJsW2ldW2luZGV4XS5zZXEgPSBzZXE7CisgICAgICAgICAgICAgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgICAgICAgICAgICAgIHptX21zZzBfcngoWk1fTFZfMiwgIlJ4IGZpbHRlciBoaXQiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFpNX1NVQ0NFU1M7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IC8qIGZvcihpPTA7IGk8Wk1fRklMVEVSX1RBQkxFX0NPTDsgaSsrKSAqLworCisgICAgICAgIC8qIG1pc3MgOiBhZGQgdG8gdGFibGUgKi8KKyAgICAgICAgem1fbXNnMF9yeChaTV9MVl8xLCAiUnggZmlsdGVyIG1pc3MiKTsKKyAgICAgICAgLyogVE9ETyA6IFJhbmRvbSBzZWxlY3QgYSBjb2x1bW4gKi8KKyAgICAgICAgY29sID0gKHUxNl90KSh3ZC0+dGljayAmIChaTV9GSUxURVJfVEFCTEVfQ09MLTEpKTsKKyAgICAgICAgd2QtPnJ4RmlsdGVyVGJsW2NvbF1baW5kZXhdLmFkZHJbMF0gPSBzcmNbMF07CisgICAgICAgIHdkLT5yeEZpbHRlclRibFtjb2xdW2luZGV4XS5hZGRyWzFdID0gc3JjWzFdOworICAgICAgICB3ZC0+cnhGaWx0ZXJUYmxbY29sXVtpbmRleF0uYWRkclsyXSA9IHNyY1syXTsKKyAgICAgICAgd2QtPnJ4RmlsdGVyVGJsW2NvbF1baW5kZXhdLnNlcSA9IHNlcTsKKyAgICAgICAgd2QtPnJ4RmlsdGVyVGJsW2NvbF1baW5kZXhdLnVwID0gdXA7CisKKyAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICB9IC8qIGlmICgoZHN0MCAmIDB4MSkgPT0gMCkgKi8KKworICAgIHJldHVybiBaTV9TVUNDRVNTOworfQorCisKKwordTE2X3QgemZUeEdlbldsYW5UYWlsKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3QqIHNuYXAsIHUxNl90IHNuYXBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgdTE2X3QqIG1pYykKK3sKKyAgICBzdHJ1Y3QgenNNaWNWYXIqICBwTWljS2V5OworICAgIHUxNl90ICBpLCBsZW5ndGgsIHBheWxvYWRPZmZzZXQ7CisgICAgdThfdCAgIGJWYWx1ZSwgcW9zVHlwZSA9IDA7CisgICAgdThfdCAgIHNuYXBCeXRlWzEyXTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIGlmICggd2QtPndsYW5Nb2RlID09IFpNX01PREVfQVAgKQorICAgIHsKKyAgICAgICAgcE1pY0tleSA9IHpmQXBHZXRUeE1pY0tleShkZXYsIGJ1ZiwgJnFvc1R5cGUpOworCisgICAgICAgIGlmICggcE1pY0tleSA9PSBOVUxMICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoIHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0lORlJBU1RSVUNUVVJFICkKKyAgICB7CisgICAgICAgIHBNaWNLZXkgPSB6ZlN0YUdldFR4TWljS2V5KGRldiwgYnVmKTsKKworICAgICAgICBpZiAoIHBNaWNLZXkgPT0gTlVMTCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGxlbmd0aCA9IHpmd0J1ZkdldFNpemUoZGV2LCBidWYpOworCisgICAgemZNaWNDbGVhcihwTWljS2V5KTsKKworICAgIC8qIGFwcGVuZCBEQSBhbmQgU0EgKi8KKyNpZmRlZiBaTV9FTkFCTEVfTkFUSVZFX1dJRkkKKyAgICBmb3IoaT0xNjsgaTwyMjsgaSsrKQorICAgIHsgLy8gVklTVEEgREEKKyAgICAgICAgYlZhbHVlID0gem13X3R4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgaSk7CisgICAgICAgIHpmTWljQXBwZW5kQnl0ZShiVmFsdWUsIHBNaWNLZXkpOworICAgIH0KKyAgICBmb3IoaT0xMDsgaTwxNjsgaSsrKQorICAgIHsgLy8gVklTVEEgU0EKKyAgICAgICAgYlZhbHVlID0gem13X3R4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgaSk7CisgICAgICAgIHpmTWljQXBwZW5kQnl0ZShiVmFsdWUsIHBNaWNLZXkpOworICAgIH0KKyNlbHNlCisgICAgZm9yKGk9MDsgaTwxMjsgaSsrKQorICAgIHsKKyAgICAgICAgYlZhbHVlID0gem13X3R4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgaSk7CisgICAgICAgIHpmTWljQXBwZW5kQnl0ZShiVmFsdWUsIHBNaWNLZXkpOworICAgIH0KKyNlbmRpZgorCisgICAgLyogYXBwZW5kIGZvciBhbGlnbm1lbnQgKi8KKyAgICBpZiAoIHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0lORlJBU1RSVUNUVVJFICkKKyAgICB7CisgICAgICAgIGlmICh3ZC0+c3RhLndtZUNvbm5lY3RlZCAhPSAwKQorICAgICAgICAgICAgemZNaWNBcHBlbmRCeXRlKHptd190eF9idWZfcmVhZGIoZGV2LCBidWYsIFpNXzgwMjExX0ZSQU1FX0lQX09GRlNFVCArIDEpID4+IDUsIHBNaWNLZXkpOworICAgICAgICBlbHNlCisgICAgICAgICAgICB6Zk1pY0FwcGVuZEJ5dGUoMCwgcE1pY0tleSk7CisgICAgfQorICAgIGVsc2UgaWYgKCB3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9BUCApCisgICAgeworICAgICAgICBpZiAocW9zVHlwZSA9PSAxKQorICAgICAgICAgICAgemZNaWNBcHBlbmRCeXRlKHptd190eF9idWZfcmVhZGIoZGV2LCBidWYsIFpNXzgwMjExX0ZSQU1FX0lQX09GRlNFVCArIDEpID4+IDUsIHBNaWNLZXkpOworICAgICAgICBlbHNlCisgICAgICAgICAgICB6Zk1pY0FwcGVuZEJ5dGUoMCwgcE1pY0tleSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qIFRPRE8gOiBRb3MgU29mdHdhcmUgTUlDIGluIElCU1MgTW9kZSAqLworICAgICAgICB6Zk1pY0FwcGVuZEJ5dGUoMCwgcE1pY0tleSk7CisgICAgfQorICAgIHpmTWljQXBwZW5kQnl0ZSgwLCBwTWljS2V5KTsKKyAgICB6Zk1pY0FwcGVuZEJ5dGUoMCwgcE1pY0tleSk7CisgICAgemZNaWNBcHBlbmRCeXRlKDAsIHBNaWNLZXkpOworCisgICAgaWYgKCBzbmFwbGVuID09IDAgKQorICAgIHsKKyAgICAgICAgcGF5bG9hZE9mZnNldCA9IFpNXzgwMjExX0ZSQU1FX0lQX09GRlNFVDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcGF5bG9hZE9mZnNldCA9IFpNXzgwMjExX0ZSQU1FX1RZUEVfT0ZGU0VUOworCisgICAgICAgIGZvcihpPTA7IGk8KHNuYXBsZW4+PjEpOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHNuYXBCeXRlW2kqMl0gPSAodThfdCkgKHNuYXBbaV0gJiAweGZmKTsKKyAgICAgICAgICAgIHNuYXBCeXRlW2kqMisxXSA9ICh1OF90KSAoKHNuYXBbaV0gPj4gOCkgJiAweGZmKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvcihpPTA7IGk8c25hcGxlbjsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICB6Zk1pY0FwcGVuZEJ5dGUoc25hcEJ5dGVbaV0sIHBNaWNLZXkpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yKGk9cGF5bG9hZE9mZnNldDsgaTxsZW5ndGg7IGkrKykKKyAgICB7CisgICAgICAgIGJWYWx1ZSA9IHptd190eF9idWZfcmVhZGIoZGV2LCBidWYsIGkpOworICAgICAgICB6Zk1pY0FwcGVuZEJ5dGUoYlZhbHVlLCBwTWljS2V5KTsKKyAgICB9CisKKyAgICB6Zk1pY0dldE1pYyggKHU4X3QqKSBtaWMsIHBNaWNLZXkpOworCisgICAgcmV0dXJuIFpNX1NJWkVfT0ZfTUlDOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZlR4R2V0SXBUb3NBbmRGcmFnICAgICAgICAgKi8KKy8qICAgICAgR2V0IElQIFRPUyBhbmQgZnJhZyBvZmZzZXQgZnJvbSBUeCBidWZmZXIgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGJ1ZiA6IFR4IGJ1ZmZlciBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICB1cCA6IHBvaW50ZXIgZm9yIHJldHVybmluZyB1c2VyIHByaW9yaXR5ICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZnJhZ09mZiA6IHBvaW50ZXIgZm9yIHJldHVybmluZyBpcCBmcmFnIG9mZnNldCAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiBDaGVuICAgICAgICBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgIDIwMDYuNiAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgemZUeEdldElwVG9zQW5kRnJhZyh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHU4X3QqIHVwLCB1MTZfdCogZnJhZ09mZikKK3sKKyAgICB1OF90IGlwdjsKKyAgICB1MTZfdCBsZW47CisJdTE2X3QgZXRoZXJUeXBlOworICAgIHU4X3QgdG9zOworCisgICAgKnVwID0gMDsKKyAgICAqZnJhZ09mZiA9IDA7CisKKyAgICBsZW4gPSB6ZndCdWZHZXRTaXplKGRldiwgYnVmKTsKKworICAgIGlmIChsZW4gPj0gMzQpIC8vTWluaW11bSBJUHY0IHBhY2tldCBzaXplLCAxNChFdGhlciBoZWFkZXIpKzIwKElQdjQgaGVhZGVyKQorICAgIHsKKyAgICAgICAgZXRoZXJUeXBlID0gKCgodTE2X3Qpem13X3R4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgWk1fODAyMTFfRlJBTUVfVFlQRV9PRkZTRVQpKTw8OCkKKyAgICAgICAgICAgICAgICAgICAgKyB6bXdfdHhfYnVmX3JlYWRiKGRldiwgYnVmLCBaTV84MDIxMV9GUkFNRV9UWVBFX09GRlNFVCArIDEpOworCisgICAgICAgIC8qIHByb3RvY29sIHR5cGUgPSBJUCAqLworICAgICAgICBpZiAoZXRoZXJUeXBlID09IDB4MDgwMCkKKyAgICAgICAgeworICAgICAgICAgICAgaXB2ID0gem13X3R4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgWk1fODAyMTFfRlJBTUVfSVBfT0ZGU0VUKSA+PiA0OworICAgICAgICAgICAgaWYgKGlwdiA9PSAweDQpIC8vSVB2NAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRvcyA9IHptd190eF9idWZfcmVhZGIoZGV2LCBidWYsIFpNXzgwMjExX0ZSQU1FX0lQX09GRlNFVCArIDEpOworICAgICAgICAgICAgICAgICp1cCA9ICh0b3MgPj4gNSk7CisgICAgICAgICAgICAgICAgKmZyYWdPZmYgPSB6bXdfdHhfYnVmX3JlYWRoKGRldiwgYnVmLCBaTV84MDIxMV9GUkFNRV9JUF9PRkZTRVQgKyA2KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIFRPRE8gOiBoYW5kbGUgVkxBTiB0YWcgYW5kIElQdjYgcGFja2V0ICovCisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuOworfQorCisjaWZkZWYgWk1fRU5BQkxFX05BVElWRV9XSUZJCit1MTZfdCB6ZlR4R2VuV2xhblNuYXAoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCogc25hcCwgdTE2X3QqIHNuYXBsZW4pCit7CisgICAgc25hcFswXSA9IHptd19idWZfcmVhZGgoZGV2LCBidWYsIFpNXzgwMjExX0ZSQU1FX0hFQURFUl9MRU4gKyAwKTsKKyAgICBzbmFwWzFdID0gem13X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgWk1fODAyMTFfRlJBTUVfSEVBREVSX0xFTiArIDIpOworICAgIHNuYXBbMl0gPSB6bXdfYnVmX3JlYWRoKGRldiwgYnVmLCBaTV84MDIxMV9GUkFNRV9IRUFERVJfTEVOICsgNCk7CisgICAgKnNuYXBsZW4gPSA2OworCisgICAgcmV0dXJuIFpNXzgwMjExX0ZSQU1FX0hFQURFUl9MRU4gKyAqc25hcGxlbjsKK30KKyNlbHNlCit1MTZfdCB6ZlR4R2VuV2xhblNuYXAoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCogc25hcCwgdTE2X3QqIHNuYXBsZW4pCit7CisgICAgdTE2X3QgcmVtb3ZlZDsKKwkgICB1MTZfdCBldGhlclR5cGU7CisgICAJdTE2X3QgbGVuOworCisJICAgbGVuID0gemZ3QnVmR2V0U2l6ZShkZXYsIGJ1Zik7CisgICAgaWYgKGxlbiA8IDE0KSAvL01pbmltdW0gRXRoZXJuZXQgcGFja2V0IHNpemUsIDE0KEV0aGVyIGhlYWRlcikKKyAgICB7CisgICAgICAgIC8qIFRPRE8gOiBBc3NlcnQ/ICovCisgICAgICAgICpzbmFwbGVuID0gMDsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLyogR2VuZXJhdGUgUkZDMTA0MiBoZWFkZXIgKi8KKyAgICBldGhlclR5cGUgPSAoKCh1MTZfdCl6bXdfdHhfYnVmX3JlYWRiKGRldiwgYnVmLCAxMikpPDw4KQorICAgICAgICAgICAgICAgICsgem13X3R4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgMTMpOworCisgICAgLy96bV9kZWJ1Z19tc2cyKCJldGhlcm5ldCB0eXBlIG9yIGxlbmd0aCA9ICIsIGV0aGVyVHlwZSk7CisKKyAgICBpZiAoZXRoZXJUeXBlID4gMTUwMCkKKyAgICB7CisgICAgICAgIC8qIEVUSEVSTkVUIGZvcm1hdCAqLworICAgICAgICByZW1vdmVkID0gMTI7CisgICAgICAgIHNuYXBbMF0gPSAweGFhYWE7CisgICAgICAgIHNuYXBbMV0gPSAweDAwMDM7CisgICAgICAgIGlmICgoZXRoZXJUeXBlID09MHg4MTM3KSB8fCAoZXRoZXJUeXBlID09IDB4ODBmMykpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIEJyaWRnZSBUdW5uZWwgKi8KKyAgICAgICAgICAgIHNuYXBbMl0gPSAweEY4MDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvKiBSRkMgMTA0MiAqLworICAgICAgICAgICAgc25hcFsyXSA9IDB4MDAwMDsKKyAgICAgICAgfQorICAgICAgICAqc25hcGxlbiA9IDY7CisKKyAgICAgICAgaWYgKCBldGhlclR5cGUgPT0gMHg4ODhFICkKKyAgICAgICAgeworICAgICAgICAgICAgemZTaG93VHhFQVBPTChkZXYsIGJ1ZiwgMTQpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qIDgwMi4zIGZvcm1hdCAqLworICAgICAgICByZW1vdmVkID0gMTQ7CisgICAgICAgICpzbmFwbGVuID0gMDsKKyAgICB9CisKKyAgICByZXR1cm4gcmVtb3ZlZDsKK30KKyNlbmRpZgorCit1OF90IHpmSXNWdHhxRW1wdHkoemRldl90KiBkZXYpCit7CisgICAgdThfdCBpc0VtcHR5ID0gVFJVRTsKKyAgICB1OF90IGk7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIGlmICh3ZC0+dm1tcUhlYWQgIT0gd2QtPnZtbXFUYWlsKQorICAgIHsKKyAgICAgICAgaXNFbXB0eSA9IEZBTFNFOworICAgICAgICBnb3RvIGNoZWNrX2RvbmU7CisgICAgfQorCisgICAgZm9yKGk9MDsgaSA8IDQ7IGkrKykKKyAgICB7CisgICAgICAgIGlmICh3ZC0+dnR4cUhlYWRbaV0gIT0gd2QtPnZ0eHFUYWlsW2ldKQorICAgICAgICB7CisgICAgICAgICAgICBpc0VtcHR5ID0gRkFMU0U7CisgICAgICAgICAgICBnb3RvIGNoZWNrX2RvbmU7CisgICAgICAgIH0KKyAgICB9CisKK2NoZWNrX2RvbmU6CisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICByZXR1cm4gaXNFbXB0eTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmUHV0VnR4cSAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBQdXQgVHggYnVmZmVyIHRvIHZpcnR1YWwgVHhRICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYnVmIDogVHggYnVmZmVyIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgWk1fU1VDQ0VTUyBvciBlcnJvciBjb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiBDaGVuICAgICAgICBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgIDIwMDYuNiAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UxNl90IHpmUHV0VnR4cSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpCit7CisgICAgdThfdCBhYzsKKyAgICB1OF90IHVwOworICAgIHUxNl90IGZyYWdPZmY7CisjaWZkZWYgWk1fQUdHX1RBTExZCisgICAgc3RydWN0IGFnZ1RhbGx5ICphZ2dfdGFsOworI2VuZGlmCisjaWZkZWYgWk1fRU5BQkxFX0FHR1JFR0FUSU9OCisgICAgI2lmbmRlZiBaTV9CWVBBU1NfQUdHUl9TQ0hFRFVMSU5HCisJdTE2X3QgcmV0OworICAgIHUxNl90IHRpZDsKKyAgICAjZW5kaWYKKyNlbmRpZgorCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHpmVHhHZXRJcFRvc0FuZEZyYWcoZGV2LCBidWYsICZ1cCwgJmZyYWdPZmYpOworCisgICAgaWYgKCB3ZC0+emZjYkNsYXNzaWZ5VHhQYWNrZXQgIT0gTlVMTCApCisgICAgeworICAgICAgICBhYyA9IHdkLT56ZmNiQ2xhc3NpZnlUeFBhY2tldChkZXYsIGJ1Zik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFjID0gemNVcFRvQWNbdXAmMHg3XSAmIDB4MzsKKyAgICB9CisKKyAgICAvKgorICAgICAqIGFkZCBieSBob25kYQorICAgICAqIG1haW4gQS1NUERVIGFnZ3JlZ2F0aW9uIGZ1bmN0aW9uCisgICAgICovCisjaWZkZWYgWk1fQUdHX1RBTExZCisgICAgYWdnX3RhbCA9ICZ3ZC0+YWdnX3RhbDsKKyAgICBhZ2dfdGFsLT5nb3RfcGFja2V0c19zdW0rKzsKKworI2VuZGlmCisKKyNpZmRlZiBaTV9FTkFCTEVfQUdHUkVHQVRJT04KKyAgICAjaWZuZGVmIFpNX0JZUEFTU19BR0dSX1NDSEVEVUxJTkcKKyAgICB0aWQgPSB1cCYweDc7CisgICAgaWYod2QtPmVuYWJsZUFnZ3JlZ2F0aW9uPT0wKQorICAgIHsKKyAgICAgICAgaWYoICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9BUCkgfHwKKyAgICAgICAgICAgICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9JTkZSQVNUUlVDVFVSRSAmJiB3ZC0+c3RhLkVuYWJsZUhUKSB8fAorICAgICAgICAgICAgKHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX1BTRVVETykgKSB7CisgICAgICAgICAgICAvLyAoaW5mcmFzdHJ1Y3R1cmVfbW9kZSAmJiBjb25uZWN0X3RvXzExbl9hcCkgfHwgKGFwX21vZGUgJiYgaXNfMTFuX2FwKQorICAgICAgICAgICAgLy9yZXQgPSB6ZkFnZ1B1dFZ0eHEoZGV2LCBidWYpOworCisKKyAgICAgICAgICAgIHJldCA9IHpmQWdnVHgoZGV2LCBidWYsIHRpZCk7CisgICAgICAgICAgICBpZiAoWk1fU1VDQ0VTUyA9PSByZXQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy96ZndCdWZGcmVlKGRldiwgYnVmLCBaTV9TVUNDRVNTKTsKKworICAgICAgICAgICAgICAgIHJldHVybiBaTV9TVUNDRVNTOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKFpNX0VSUl9FWENFRURfUFJJT1JJVFlfVEhSRVNIT0xEID09IHJldCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3ZC0+Y29tbVRhbGx5LnR4UW9zRHJvcENvdW50W2FjXSsrOworICAgICAgICAgICAgICAgIHpmd0J1ZkZyZWUoZGV2LCBidWYsIFpNX1NVQ0NFU1MpOworCisgICAgICAgICAgICAgICAgem1fbXNnMV90eChaTV9MVl8xLCAiUGFja2V0IGRpc2NhcmRlZCwgVlRYUSBmdWxsLCBhYz0iLCBhYyk7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gWk1fRVJSX0VYQ0VFRF9QUklPUklUWV9USFJFU0hPTEQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoWk1fRVJSX1RYX0JVRkZFUl9VTkFWQUlMQUJMRSA9PSByZXQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAqIGRvIG5vdGhpbmcKKyAgICAgICAgICAgICAgICAqIGNvbnRpbnVlIGZvbGxvd2luZyBwcm9jZXNzaW9uLCBwdXQgaW50byBWVFhRCisgICAgICAgICAgICAgICAgKiByZXR1cm4gWk1fU1VDQ0VTUzsKKyAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgICNlbmRpZgorI2VuZGlmCisgICAgLyoKKyAgICAgKiBlbmQgb2YgYWRkIGJ5IGhvbmRhCisgICAgICovCisKKyAgICAvKiBGaXJzdCBJcCBmcmFnICovCisgICAgaWYgKChmcmFnT2ZmICYgMHhmZjNmKSA9PSAweDAwMjApCisgICAgeworICAgICAgICAvKiBEb24ndCBsZXQgaXAgZnJhZyBpbiBpZiBWVFhRIHVuYWJsZSB0byBob2xkICovCisgICAgICAgIC8qIHdob2xlIGlwIGZyYWcgYnVyc3QoYXNzdW1lIDIwIGZyYWcpICAgICAgICAgKi8KKyAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgaWYgKCgod2QtPnZ0eHFIZWFkW2FjXSAtIHdkLT52dHhxVGFpbFthY10pJiBaTV9WVFhRX1NJWkVfTUFTSykKKyAgICAgICAgICAgICAgICA+IChaTV9WVFhRX1NJWkUtMjApKQorICAgICAgICB7CisgICAgICAgICAgICB3ZC0+cW9zRHJvcElwRnJhZ1thY10gPSAxOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgd2QtPnFvc0Ryb3BJcEZyYWdbYWNdID0gMDsKKyAgICAgICAgfQorICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgICAgIGlmICh3ZC0+cW9zRHJvcElwRnJhZ1thY10gPT0gMSkKKyAgICAgICAgeworICAgICAgICAgICAgLy96bV9kZWJ1Z19tc2cyKCJ2dFEgZnVsbCwgZHJvcCBidWYgPSAiLCBidWYpOworICAgICAgICAgICAgd2QtPmNvbW1UYWxseS50eFFvc0Ryb3BDb3VudFthY10rKzsKKyAgICAgICAgICAgIHpmd0J1ZkZyZWUoZGV2LCBidWYsIFpNX1NVQ0NFU1MpOworICAgICAgICAgICAgem1fbXNnMV90eChaTV9MVl8xLCAiUGFja2V0IGRpc2NhcmRlZCwgZmlyc3QgaXAgZnJhZywgYWM9IiwgYWMpOworICAgICAgICAgICAgLy9WVFhRW10gY2FuIG5vdCBob2xkIHdob2xkIGlwIGZyYWcgYnVyc3QoYXNzdW1lIDIwIGZyYWdzKQorICAgICAgICAgICAgcmV0dXJuIFpNX0VSUl9FWENFRURfUFJJT1JJVFlfVEhSRVNIT0xEOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKChmcmFnT2ZmICYgMHhmZjNmKSA9PSAwKQorICAgIHsKKyAgICAgICAgd2QtPnFvc0Ryb3BJcEZyYWdbYWNdID0gMDsKKyAgICB9CisKKyAgICBpZiAoKChmcmFnT2ZmICY9IDB4ZmYxZikgIT0gMCkgJiYgKHdkLT5xb3NEcm9wSXBGcmFnW2FjXSA9PSAxKSkKKyAgICB7CisgICAgICAgIHdkLT5jb21tVGFsbHkudHhRb3NEcm9wQ291bnRbYWNdKys7CisgICAgICAgIHpmd0J1ZkZyZWUoZGV2LCBidWYsIFpNX1NVQ0NFU1MpOworICAgICAgICB6bV9tc2cxX3R4KFpNX0xWXzEsICJQYWNrZXQgZGlzY2FyZGVkLCBpcCBmcmFnLCBhYz0iLCBhYyk7CisgICAgICAgIC8vRGlzY2FyZCBmb2xsb3dpbmcgaXAgZnJhZ3MKKyAgICAgICAgcmV0dXJuIFpNX0VSUl9FWENFRURfUFJJT1JJVFlfVEhSRVNIT0xEOworICAgIH0KKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgaWYgKCgod2QtPnZ0eHFIZWFkW2FjXSArIDEpICYgWk1fVlRYUV9TSVpFX01BU0spICE9IHdkLT52dHhxVGFpbFthY10pCisgICAgeworICAgICAgICB3ZC0+dnR4cVthY11bd2QtPnZ0eHFIZWFkW2FjXV0gPSBidWY7CisgICAgICAgIHdkLT52dHhxSGVhZFthY10gPSAoKHdkLT52dHhxSGVhZFthY10gKyAxKSAmIFpNX1ZUWFFfU0laRV9NQVNLKTsKKyAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgcmV0dXJuIFpNX1NVQ0NFU1M7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICAgICAgd2QtPmNvbW1UYWxseS50eFFvc0Ryb3BDb3VudFthY10rKzsKKyAgICAgICAgemZ3QnVmRnJlZShkZXYsIGJ1ZiwgWk1fU1VDQ0VTUyk7CisgICAgICAgIHptX21zZzFfdHgoWk1fTFZfMSwgIlBhY2tldCBkaXNjYXJkZWQsIFZUWFEgZnVsbCwgYWM9IiwgYWMpOworICAgICAgICByZXR1cm4gWk1fRVJSX0VYQ0VFRF9QUklPUklUWV9USFJFU0hPTEQ7IC8vVlRYUVtdIEZ1bGwKKyAgICB9Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmR2V0VnR4cSAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBHZXQgVHggYnVmZmVyIGZyb20gdmlydHVhbCBUeFEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBUeCBidWZmZXIgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBTdGVwaGVuIENoZW4gICAgICAgIFp5REFTIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24gICAgMjAwNi42ICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworemJ1Zl90KiB6ZkdldFZ0eHEoemRldl90KiBkZXYsIHU4X3QgYWMpCit7CisgICAgemJ1Zl90KiBidWY7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgYWMgJj0gMHgzOworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgaWYgKHdkLT52dHhxSGVhZFthY10gIT0gd2QtPnZ0eHFUYWlsW2FjXSkKKyAgICB7CisgICAgICAgIGJ1ZiA9IHdkLT52dHhxW2FjXVt3ZC0+dnR4cVRhaWxbYWNdXTsKKyAgICAgICAgd2QtPnZ0eHFUYWlsW2FjXSA9ICgod2QtPnZ0eHFUYWlsW2FjXSArIDEpICYgWk1fVlRYUV9TSVpFX01BU0spOworICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICByZXR1cm4gYnVmOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICByZXR1cm4gMDsgLy9WVFhRW10gZW1wdHkKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZlB1dFZtbXEgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgUHV0IFR4IGJ1ZmZlciB0byB2aXJ0dWFsIE1tUSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGJ1ZiA6IFR4IGJ1ZmZlciBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFpNX1NVQ0NFU1Mgb3IgZXJyb3IgY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFN0ZXBoZW4gQ2hlbiAgICAgICAgWnlEQVMgVGVjaG5vbG9neSBDb3Jwb3JhdGlvbiAgICAyMDA2LjEyICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MTZfdCB6ZlB1dFZtbXEoemRldl90KiBkZXYsIHpidWZfdCogYnVmKQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICBpZiAoKCh3ZC0+dm1tcUhlYWQgKyAxKSAmIFpNX1ZNTVFfU0laRV9NQVNLKSAhPSB3ZC0+dm1tcVRhaWwpCisgICAgeworICAgICAgICB3ZC0+dm1tcVt3ZC0+dm1tcUhlYWRdID0gYnVmOworICAgICAgICB3ZC0+dm1tcUhlYWQgPSAoKHdkLT52bW1xSGVhZCArIDEpICYgWk1fVk1NUV9TSVpFX01BU0spOworICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICByZXR1cm4gWk1fU1VDQ0VTUzsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgICAgICB6ZndCdWZGcmVlKGRldiwgYnVmLCBaTV9TVUNDRVNTKTsKKyAgICAgICAgem1fbXNnMF9tbShaTV9MVl8wLCAiUGFja2V0IGRpc2NhcmRlZCwgVk1tUSBmdWxsIik7CisgICAgICAgIHJldHVybiBaTV9FUlJfVk1NUV9GVUxMOyAvL1ZUWFFbXSBGdWxsCisgICAgfQorfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZkdldFZtbXEgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgR2V0IFR4IGJ1ZmZlciBmcm9tIHZpcnR1YWwgTW1RICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgVHggYnVmZmVyIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiBDaGVuICAgICAgICBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgIDIwMDYuMTIgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3pidWZfdCogemZHZXRWbW1xKHpkZXZfdCogZGV2KQoreworICAgIHpidWZfdCogYnVmOworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICBpZiAod2QtPnZtbXFIZWFkICE9IHdkLT52bW1xVGFpbCkKKyAgICB7CisgICAgICAgIGJ1ZiA9IHdkLT52bW1xW3dkLT52bW1xVGFpbF07CisgICAgICAgIHdkLT52bW1xVGFpbCA9ICgod2QtPnZtbXFUYWlsICsgMSkgJiBaTV9WTU1RX1NJWkVfTUFTSyk7CisgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgIHJldHVybiBidWY7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgIHJldHVybiAwOyAvL1ZUWFFbXSBlbXB0eQorICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmUHVzaFZ0eHEgICAgICAgICAgICAgICAgICAqLworLyogICAgICBTZXJ2aWNlIFZpcnR1YWwgVHhRICh3ZWlnaHRlZCByb3VuZCByb2JpbikgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgR2V0IFR4IGJ1ZmZlciBmb3JtIHZpcnR1YWwgVHhRIGFuZCBwdXQgdG8gaGFyZHdhcmUgVHhEIHF1ZXVlICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiBDaGVuICAgICAgICBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgIDIwMDYuNiAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgemZQdXNoVnR4cSh6ZGV2X3QqIGRldikKK3sKKyAgICB6YnVmX3QqIGJ1ZjsKKyAgICB1MTZfdCBpOworICAgIHUxNl90IHR4ZWQ7CisgICAgdTMyX3QgZnJlZVR4ZDsKKyAgICB1MTZfdCBlcnI7CisgICAgdTE2X3Qgc2tpcEZsYWcgPSAwOworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisKKworICAgIC8vem1fZGVidWdfbXNnMSgiemZIcEdldEZyZWVUeGRDb3VudCA9ICIsIHpmSHBHZXRGcmVlVHhkQ291bnQoZGV2KSk7CisKKyAgICBpZiAod2QtPmhhbFN0YXRlID09IFpNX0hBTF9TVEFURV9JTklUKQorICAgIHsKKyAgICAgICAgaWYgKCF3ZC0+bW9kZU1ES0VuYWJsZSkKKyAgICAgICAgeworICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiSEFMIGlzIG5vdCByZWFkeSBmb3IgVHgiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQorICAgIGVsc2UgaWYgKHdkLT5zdGEuREZTRGlzYWJsZVR4KQorICAgIHsKKyAgICAgICAgem1fZGVidWdfbXNnMCgicmV0dXJuIGJlY2F1c2UgODAyLjExaCBERlMgRGlzYWJsZSBUeCIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGVsc2UgaWYgKHdkLT5zdGEuZmxhZ0ZyZXFDaGFuZ2luZyAhPSAwKQorICAgIHsKKyAgICAgICAgLy9Ib2xkIHVudGlsIFJGIGZyZXF1ZW5jeSBjaGFuZ2VkCisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgZWxzZSBpZiAoKCB3ZC0+c3RhLmZsYWdLZXlDaGFuZ2luZyApICYmICggd2QtPndsYW5Nb2RlICE9IFpNX01PREVfQVAgKSkKKyAgICB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisjaWZkZWYgWk1fRU5BQkxFX1BPV0VSX1NBVkUKKyAgICBlbHNlIGlmICggemZQb3dlclNhdmluZ01ncklzU2xlZXBpbmcoZGV2KSApCisgICAgeworICAgICAgICAvL3ptX2RlYnVnX21zZzAoIlBhY2tldHMgcXVldWVkIHNpbmNlIHRoZSBNQUMgaXMgaW4gcG93ZXItc2F2aW5nIG1vZGVcbiIpOworICAgICAgICByZXR1cm47CisgICAgfQorI2VuZGlmCisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIGlmICh3ZC0+dnR4cVB1c2hpbmcgIT0gMCkKKyAgICB7CisgICAgICAgIHNraXBGbGFnID0gMTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgd2QtPnZ0eHFQdXNoaW5nID0gMTsKKyAgICB9CisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIGlmIChza2lwRmxhZyA9PSAxKQorICAgIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHdoaWxlICgxKQorICAgIHsKKyAgICAgICAgdHhlZCA9IDA7CisKKyAgICAgICAgLyogMjAwNi4xMi4yMCwgU2VydmUgTWFuYWdlbWVudCBxdWV1ZSAqLworICAgICAgICB3aGlsZSggemZIcEdldEZyZWVUeGRDb3VudChkZXYpID4gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgoYnVmID0gemZHZXRWbW1xKGRldikpICE9IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHhlZCA9IDE7CisgICAgICAgICAgICAgICAgLy96bV9kZWJ1Z19tc2cyKCJzZW5kIGJ1ZiA9ICIsIGJ1Zik7CisgICAgICAgICAgICAgICAgaWYgKChlcnIgPSB6ZkhwU2VuZChkZXYsIE5VTEwsIDAsIE5VTEwsIDAsIE5VTEwsIDAsIGJ1ZiwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFpNX0lOVEVSTkFMX0FMTE9DX0JVRiwgMCwgMHhmZikpICE9IFpNX1NVQ0NFU1MpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB6ZndCdWZGcmVlKGRldiwgYnVmLCAwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCh3ZC0+c3RhLmJTY2hlZHVsZVNjYW4pIHx8ICgod2QtPnN0YS5iQ2hhbm5lbFNjYW4gPT0gVFJVRSkgJiYgKHpmU3RhSXNDb25uZWN0ZWQoZGV2KSkpKQorICAgICAgICB7CisgICAgICAgICAgICAvL0hvbGQgdW50aWwgU2NhbiBTdG9wCisgICAgICAgICAgICB3ZC0+dnR4cVB1c2hpbmcgPSAwOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyNpZmRlZiBaTV9FTkFCTEVfQUdHUkVHQVRJT04KKyAgICAjaWZuZGVmIFpNX0JZUEFTU19BR0dSX1NDSEVEVUxJTkcKKyAgICAgICAgaWYoICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9BUCkgfHwKKyAgICAgICAgICAgICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9JTkZSQVNUUlVDVFVSRSAmJiB3ZC0+c3RhLkVuYWJsZUhUKSB8fAorICAgICAgICAgICAgKHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX1BTRVVETykgKSB7CisKKyAgICAgICAgICAgIHpmQWdnVHhTY2hlZHVsZXIoZGV2LCAwKTsKKworICAgICAgICAgICAgaWYgKHR4ZWQgPT0gMCkgeworICAgICAgICAgICAgICAgIHdkLT52dHhxUHVzaGluZyA9IDA7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAjZW5kaWYKKyNlbmRpZgorCisgICAgICAgIC8qIFNlcnZpY2UgVlR4UVszXSAqLworICAgICAgICBmb3IgKGk9MDsgaTw0OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgoZnJlZVR4ZCA9IHpmSHBHZXRGcmVlVHhkQ291bnQoZGV2KSkgPj0gMykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKGJ1ZiA9IHpmR2V0VnR4cShkZXYsIDMpKSAhPSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdHhlZCA9IDE7CisgICAgICAgICAgICAgICAgICAgIC8vem1fZGVidWdfbXNnMigic2VuZCBidWYgPSAiLCBidWYpOworICAgICAgICAgICAgICAgICAgICB6ZlR4U2VuZEV0aChkZXYsIGJ1ZiwgMCwgWk1fRVhURVJOQUxfQUxMT0NfQlVGLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgWk1fUEVSRk9STUFOQ0VfVFhfTVBEVShkZXYsIHdkLT50aWNrKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBTZXJ2aWNlIFZUeFFbMl0gKi8KKyAgICAgICAgZm9yIChpPTA7IGk8MzsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoKGZyZWVUeGQgPSB6ZkhwR2V0RnJlZVR4ZENvdW50KGRldikpID49ICh6ZkhwR2V0TWF4VHhkQ291bnQoZGV2KSoxLzQpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgoYnVmID0gemZHZXRWdHhxKGRldiwgMikpICE9IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0eGVkID0gMTsKKyAgICAgICAgICAgICAgICAgICAgemZUeFNlbmRFdGgoZGV2LCBidWYsIDAsIFpNX0VYVEVSTkFMX0FMTE9DX0JVRiwgMCk7CisgICAgICAgICAgICAgICAgICAgIFpNX1BFUkZPUk1BTkNFX1RYX01QRFUoZGV2LCB3ZC0+dGljayk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICh3ZC0+c3RhLmFjMFByaW9yaXR5SGlnaGVyVGhhbkFjMiA9PSAxKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChidWYgPSB6ZkdldFZ0eHEoZGV2LCAwKSkgIT0gMCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdHhlZCA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICB6ZlR4U2VuZEV0aChkZXYsIGJ1ZiwgMCwgWk1fRVhURVJOQUxfQUxMT0NfQlVGLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFpNX1BFUkZPUk1BTkNFX1RYX01QRFUoZGV2LCB3ZC0+dGljayk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBTZXJ2aWNlIFZUeFFbMF0gKi8KKyAgICAgICAgZm9yIChpPTA7IGk8MjsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoKGZyZWVUeGQgPSB6ZkhwR2V0RnJlZVR4ZENvdW50KGRldikpID49ICh6ZkhwR2V0TWF4VHhkQ291bnQoZGV2KSoyLzQpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgoYnVmID0gemZHZXRWdHhxKGRldiwgMCkpICE9IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0eGVkID0gMTsKKyAgICAgICAgICAgICAgICAgICAgemZUeFNlbmRFdGgoZGV2LCBidWYsIDAsIFpNX0VYVEVSTkFMX0FMTE9DX0JVRiwgMCk7CisgICAgICAgICAgICAgICAgICAgIFpNX1BFUkZPUk1BTkNFX1RYX01QRFUoZGV2LCB3ZC0+dGljayk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgICAgICAvKiBTZXJ2aWNlIFZUeFFbMV0gKi8KKyAgICAgICAgaWYgKChmcmVlVHhkID0gemZIcEdldEZyZWVUeGRDb3VudChkZXYpKSA+PSAoemZIcEdldE1heFR4ZENvdW50KGRldikqMy80KSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKChidWYgPSB6ZkdldFZ0eHEoZGV2LCAxKSkgIT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0eGVkID0gMTsKKyAgICAgICAgICAgICAgICB6ZlR4U2VuZEV0aChkZXYsIGJ1ZiwgMCwgWk1fRVhURVJOQUxfQUxMT0NfQlVGLCAwKTsKKyAgICAgICAgICAgICAgICBaTV9QRVJGT1JNQU5DRV9UWF9NUERVKGRldiwgd2QtPnRpY2spOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogQWxsIFZUeFFzIGFyZSBlaXRoZXIgZW1wdHkgb3IgZXhjZWVkIHRoZWlyIHRocmVzaG9sZCAqLworICAgICAgICBpZiAodHhlZCA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICB3ZC0+dnR4cVB1c2hpbmcgPSAwOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfSAvL3doaWxlICgxKQorfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZkZsdXNoVnR4cSAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgRmx1c2ggVmlydHVhbCBUeFEgYW5kIE1tUSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiBDaGVuICAgICAgICBBdGhlcm9zIENvbW11bmljYXRpb25zLCBJTkMuICAgIDIwMDcuMSAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgemZGbHVzaFZ0eHEoemRldl90KiBkZXYpCit7CisgICAgemJ1Zl90KiBidWY7CisgICAgdThfdCBpOworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIC8qIEZsdXNoIE1tUSAqLworICAgIHdoaWxlICgoYnVmID0gemZHZXRWbW1xKGRldikpICE9IDApCisgICAgeworICAgICAgICB6ZndCdWZGcmVlKGRldiwgYnVmLCAwKTsKKyAgICAgICAgem1fZGVidWdfbXNnMCgiemZGbHVzaFZ0eHE6IFtWbW1xXSIpOworICAgICAgICB3ZC0+cXVldWVGbHVzaGVkICB8PSAweDEwOworICAgIH0KKworICAgIC8qIEZsdXNoIFZUeFEgKi8KKyAgICBmb3IgKGk9MDsgaTw0OyBpKyspCisgICAgeworICAgICAgICB3aGlsZSAoKGJ1ZiA9IHpmR2V0VnR4cShkZXYsIGkpKSAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgICB6ZndCdWZGcmVlKGRldiwgYnVmLCAwKTsKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzEoInpmRmx1c2hWdHhxOiBbemZHZXRWdHhxXS0gIiwgaSk7CisgICAgICAgICAgICB3ZC0+cXVldWVGbHVzaGVkIHw9ICgxPDxpKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCB6ZjgwMjExRnJhbWVTZW5kKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3QqIGhlYWRlciwgdTE2X3Qgc25hcExlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxNl90KiBkYSwgdTE2X3QqIHNhLCB1OF90IHVwLCB1MTZfdCBoZWFkZXJMZW4sIHUxNl90KiBzbmFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdTE2X3QqIHRhaWwsIHUxNl90IHRhaWxMZW4sIHUxNl90IG9mZnNldCwgdTE2X3QgYnVmVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHU4X3QgYWMsIHU4X3Qga2V5SWR4KQoreworICAgIHUxNl90IGVycjsKKyAgICB1MTZfdCBmcmFnTGVuOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgZnJhZ0xlbiA9IHpmd0J1ZkdldFNpemUoZGV2LCBidWYpOworICAgIGlmICgoZGFbMF0mMHgxKSA9PSAwKQorICAgIHsKKyAgICAgICAgd2QtPmNvbW1UYWxseS50eFVuaWNhc3RGcm0rKzsKKyAgICAgICAgd2QtPmNvbW1UYWxseS50eFVuaWNhc3RPY3RldHMgKz0gKGZyYWdMZW4rc25hcExlbik7CisgICAgfQorICAgIGVsc2UgaWYgKGRhWzBdID09IDB4ZmZmZikKKyAgICB7CisgICAgICAgIHdkLT5jb21tVGFsbHkudHhCcm9hZGNhc3RGcm0rKzsKKyAgICAgICAgd2QtPmNvbW1UYWxseS50eEJyb2FkY2FzdE9jdGV0cyArPSAoZnJhZ0xlbitzbmFwTGVuKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgd2QtPmNvbW1UYWxseS50eE11bHRpY2FzdEZybSsrOworICAgICAgICB3ZC0+Y29tbVRhbGx5LnR4TXVsdGljYXN0T2N0ZXRzICs9IChmcmFnTGVuK3NuYXBMZW4pOworICAgIH0KKyAgICB3ZC0+bGVkU3RydWN0LnR4VHJhZmZpYysrOworCisgICAgaWYgKChlcnIgPSB6ZkhwU2VuZChkZXYsIGhlYWRlciwgaGVhZGVyTGVuLCBzbmFwLCBzbmFwTGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgdGFpbCwgdGFpbExlbiwgYnVmLCBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICBidWZUeXBlLCBhYywga2V5SWR4KSkgIT0gWk1fU1VDQ0VTUykKKyAgICB7CisgICAgICAgIGlmIChidWZUeXBlID09IFpNX0VYVEVSTkFMX0FMTE9DX0JVRikKKyAgICAgICAgeworICAgICAgICAgICAgemZ3QnVmRnJlZShkZXYsIGJ1ZiwgZXJyKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChidWZUeXBlID09IFpNX0lOVEVSTkFMX0FMTE9DX0JVRikKKyAgICAgICAgeworICAgICAgICAgICAgemZ3QnVmRnJlZShkZXYsIGJ1ZiwgMCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB6bV9hc3NlcnQoMCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgemZDaGVja0lzUklGU0ZyYW1lKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3QgZnJhbWVTdWJ0eXBlKQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIC8qICMyIFJlY29yZCB0aGUgc2VxdWVuY2UgbnVtYmVyIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSB1bmljYXN0IGZyYW1lIGlzIHNlcGFyYXRlZCBieSBSSUZTIG9yIG5vdCAqLworICAgIGlmIChmcmFtZVN1YnR5cGUgJiAweDgwKQorICAgIHsgICAvL1FvUyBkYXRhIGZyYW1lCisgICAgICAgIHUxNl90IHNlcXVlbmNlTnVtOworICAgICAgICB1MTZfdCBxb3NDb250cm9sRmllbGQ7CisKKyAgICAgICAgc2VxdWVuY2VOdW0gPSAoIHptd19idWZfcmVhZGgoZGV2LCBidWYsIDIyKSA+PiA0ICk7IC8vIERpc2NhcmQgZnJhZ21lbnQgbnVtYmVyICEKKyAgICAgICAgcW9zQ29udHJvbEZpZWxkID0gem13X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMjQpOyAvLyBEb24ndCBjb25zaWRlciBXRFMgKFdpcmVsZXNzIERpc3RyaWJ1dGlvbiBTeXN0ZW0pCisgICAgICAgIC8vRGJnUHJpbnQoIlRoZSBRb1MgQ29udHJvbCBGaWVsZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJWQiLCBxb3NDb250cm9sRmllbGQpOworICAgICAgICAvL0RiZ1ByaW50KCJUaGUgUklGUyBDb3VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICVkIiwgd2QtPnN0YS5yaWZzQ291bnQpOworCisgICAgICAgIGlmKCBxb3NDb250cm9sRmllbGQgJiBaTV9CSVRfNSApCisgICAgICAgIHsvLyBBQ0sgcG9saWN5IGlzICJObyBBQ0siCisgICAgICAgICAgICAvKiBSSUZTLUxpa2UgZnJhbWUgKi8KKyAgICAgICAgICAgIHdkLT5zdGEucmlmc0xpa2VGcmFtZVNlcXVlbmNlW3dkLT5zdGEucmlmc0xpa2VGcmFtZUNudF0gICA9IHNlcXVlbmNlTnVtOworCisgICAgICAgICAgICBpZiggd2QtPnN0YS5yaWZzU3RhdGUgPT0gWk1fUklGU19TVEFURV9ERVRFQ1RJTkcgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCB3ZC0+c3RhLnJpZnNMaWtlRnJhbWVTZXF1ZW5jZVsyXSAhPSAwICkKKyAgICAgICAgICAgICAgICB7Ly8gUklGUy1saWtlIFBhdHRlcm4gY29sbGVjdGVkCisgICAgICAgICAgICAgICAgICAgIGlmKCAoIHdkLT5zdGEucmlmc0xpa2VGcmFtZVNlcXVlbmNlWzJdIC0gd2QtPnN0YS5yaWZzTGlrZUZyYW1lU2VxdWVuY2VbMV0gPT0gMiApICYmCisgICAgICAgICAgICAgICAgICAgICAgICAoIHdkLT5zdGEucmlmc0xpa2VGcmFtZVNlcXVlbmNlWzFdIC0gd2QtPnN0YS5yaWZzTGlrZUZyYW1lU2VxdWVuY2VbMF0gPT0gMiApICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogUklGUyBwYXR0ZXJuIG1hdGNoZWQgKi8KKworICAgICAgICAgICAgICAgICAgICAgICAgLyogIzMgRW5hYmxlIFJJRlMgZnVuY3Rpb24gaWYgdGhlIFJJRlMgcGF0dGVybiBtYXRjaGVkICAqLworICAgICAgICAgICAgICAgICAgICAgICAgemZIcEVuYWJsZVJpZnMoZGV2LCAoKHdkLT5zdGEuY3VycmVudEZyZXF1ZW5jeTwzMDAwKT8xOjApLCB3ZC0+c3RhLkVuYWJsZUhULCB3ZC0+c3RhLkhUMjA0MCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNldCBSSUZTIHRpbWVyCisgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLnJpZnNUaW1lciA9IHdkLT50aWNrOworCisgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLnJpZnNDb3VudCsrOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBTZXQgc3RhdGUgdG8gYmUgRGV0ZWN0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEucmlmc1N0YXRlID0gWk1fUklGU19TVEFURV9ERVRFQ1RFRDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsvLyBzdGF0ZSA9IERldGVjdGVkCisgICAgICAgICAgICAgICAgLy8gUmVzZXQgUklGUyB0aW1lcgorICAgICAgICAgICAgICAgIGlmKCAod2QtPnRpY2sgLSB3ZC0+c3RhLnJpZnNUaW1lcikgPCBaTV9SSUZTX1RJTUVSX1RJTUVPVVQgKQorICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLnJpZnNUaW1lciA9IHdkLT50aWNrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvL0RiZ1ByaW50KCJTTjEgPSAlZCwgU04yID0gJWQsIFNOMyA9ICVkXG4iLCB3ZC0+c3RhLnJpZnNMaWtlRnJhbWVTZXF1ZW5jZVswXSwKKyAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEucmlmc0xpa2VGcmFtZVNlcXVlbmNlWzFdLAorICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5yaWZzTGlrZUZyYW1lU2VxdWVuY2VbMl0pOworCisgICAgICAgICAgICAvLyBVcGRhdGUgUklGUy1saWtlIHNlcXVlbmNlIG51bWJlcgorICAgICAgICAgICAgaWYoIHdkLT5zdGEucmlmc0xpa2VGcmFtZVNlcXVlbmNlWzJdICE9IDAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdkLT5zdGEucmlmc0xpa2VGcmFtZVNlcXVlbmNlWzBdID0gd2QtPnN0YS5yaWZzTGlrZUZyYW1lU2VxdWVuY2VbMV07CisgICAgICAgICAgICAgICAgd2QtPnN0YS5yaWZzTGlrZUZyYW1lU2VxdWVuY2VbMV0gPSB3ZC0+c3RhLnJpZnNMaWtlRnJhbWVTZXF1ZW5jZVsyXTsKKyAgICAgICAgICAgICAgICB3ZC0+c3RhLnJpZnNMaWtlRnJhbWVTZXF1ZW5jZVsyXSA9IDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIE9ubHkgcmVjb3JkIHRocmVlIGFkamFjZW50IGZyYW1lCisgICAgICAgICAgICBpZiggd2QtPnN0YS5yaWZzTGlrZUZyYW1lQ250IDwgMiApCisgICAgICAgICAgICAgICAgd2QtPnN0YS5yaWZzTGlrZUZyYW1lQ250Kys7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiAjNCBEaXNhYmxlIFJJRlMgZnVuY3Rpb24gaWYgdGhlIHRpbWVyIFRJTUVPVVQgICovCisgICAgaWYoIHdkLT5zdGEucmlmc1N0YXRlID09IFpNX1JJRlNfU1RBVEVfREVURUNURUQgKQorICAgIHsKKyAgICAgICAgaWYoICggd2QtPnRpY2sgLSB3ZC0+c3RhLnJpZnNUaW1lciApID4gWk1fUklGU19USU1FUl9USU1FT1VUICkKKyAgICAgICAgey8vIFRJTUVPVVQKKyAgICAgICAgICAgIC8vIERpc2FibGUgUklGUworICAgICAgICAgICAgemZIcERpc2FibGVSaWZzKGRldik7CisKKyAgICAgICAgICAgIC8vIFJlc2V0IFJJRlMtbGlrZSBzZXF1ZW5jZSBudW1iZXIgRklGTworICAgICAgICAgICAgd2QtPnN0YS5yaWZzTGlrZUZyYW1lU2VxdWVuY2VbMF0gPSAwOworICAgICAgICAgICAgd2QtPnN0YS5yaWZzTGlrZUZyYW1lU2VxdWVuY2VbMV0gPSAwOworICAgICAgICAgICAgd2QtPnN0YS5yaWZzTGlrZUZyYW1lU2VxdWVuY2VbMl0gPSAwOworICAgICAgICAgICAgd2QtPnN0YS5yaWZzTGlrZUZyYW1lQ250ID0gMDsKKworICAgICAgICAgICAgLy8gU2V0IHN0YXRlIHRvIGJlIERldGVjdGluZworICAgICAgICAgICAgd2QtPnN0YS5yaWZzU3RhdGUgPSBaTV9SSUZTX1NUQVRFX0RFVEVDVElORzsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9jd2VwLmMgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvY3dlcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjMzFiYjEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvY3dlcC5jCkBAIC0wLDAgKzEsMjk5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggQXRoZXJvcyBDb21tdW5pY2F0aW9ucyBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kdWxlIE5hbWUgOiBjd2VwLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBBYnN0cmFjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFRoaXMgbW9kdWxlIGNvbnRhaW5zIFR4IGFuZCBSeCBmdW5jdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBOT1RFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIE5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSAiY3ByZWNvbXAuaCIKKwordTMyX3QgY3JjMzJfdGFiW10gPQoreworICAgICAgIDB4MDAwMDAwMDBMLCAweDc3MDczMDk2TCwgMHhlZTBlNjEyY0wsIDB4OTkwOTUxYmFMLCAweDA3NmRjNDE5TCwKKyAgICAgICAweDcwNmFmNDhmTCwgMHhlOTYzYTUzNUwsIDB4OWU2NDk1YTNMLCAweDBlZGI4ODMyTCwgMHg3OWRjYjhhNEwsCisgICAgICAgMHhlMGQ1ZTkxZUwsIDB4OTdkMmQ5ODhMLCAweDA5YjY0YzJiTCwgMHg3ZWIxN2NiZEwsIDB4ZTdiODJkMDdMLAorICAgICAgIDB4OTBiZjFkOTFMLCAweDFkYjcxMDY0TCwgMHg2YWIwMjBmMkwsIDB4ZjNiOTcxNDhMLCAweDg0YmU0MWRlTCwKKyAgICAgICAweDFhZGFkNDdkTCwgMHg2ZGRkZTRlYkwsIDB4ZjRkNGI1NTFMLCAweDgzZDM4NWM3TCwgMHgxMzZjOTg1NkwsCisgICAgICAgMHg2NDZiYThjMEwsIDB4ZmQ2MmY5N2FMLCAweDhhNjVjOWVjTCwgMHgxNDAxNWM0ZkwsIDB4NjMwNjZjZDlMLAorICAgICAgIDB4ZmEwZjNkNjNMLCAweDhkMDgwZGY1TCwgMHgzYjZlMjBjOEwsIDB4NGM2OTEwNWVMLCAweGQ1NjA0MWU0TCwKKyAgICAgICAweGEyNjc3MTcyTCwgMHgzYzAzZTRkMUwsIDB4NGIwNGQ0NDdMLCAweGQyMGQ4NWZkTCwgMHhhNTBhYjU2YkwsCisgICAgICAgMHgzNWI1YThmYUwsIDB4NDJiMjk4NmNMLCAweGRiYmJjOWQ2TCwgMHhhY2JjZjk0MEwsIDB4MzJkODZjZTNMLAorICAgICAgIDB4NDVkZjVjNzVMLCAweGRjZDYwZGNmTCwgMHhhYmQxM2Q1OUwsIDB4MjZkOTMwYWNMLCAweDUxZGUwMDNhTCwKKyAgICAgICAweGM4ZDc1MTgwTCwgMHhiZmQwNjExNkwsIDB4MjFiNGY0YjVMLCAweDU2YjNjNDIzTCwgMHhjZmJhOTU5OUwsCisgICAgICAgMHhiOGJkYTUwZkwsIDB4MjgwMmI4OWVMLCAweDVmMDU4ODA4TCwgMHhjNjBjZDliMkwsIDB4YjEwYmU5MjRMLAorICAgICAgIDB4MmY2ZjdjODdMLCAweDU4Njg0YzExTCwgMHhjMTYxMWRhYkwsIDB4YjY2NjJkM2RMLCAweDc2ZGM0MTkwTCwKKyAgICAgICAweDAxZGI3MTA2TCwgMHg5OGQyMjBiY0wsIDB4ZWZkNTEwMmFMLCAweDcxYjE4NTg5TCwgMHgwNmI2YjUxZkwsCisgICAgICAgMHg5ZmJmZTRhNUwsIDB4ZThiOGQ0MzNMLCAweDc4MDdjOWEyTCwgMHgwZjAwZjkzNEwsIDB4OTYwOWE4OGVMLAorICAgICAgIDB4ZTEwZTk4MThMLCAweDdmNmEwZGJiTCwgMHgwODZkM2QyZEwsIDB4OTE2NDZjOTdMLCAweGU2NjM1YzAxTCwKKyAgICAgICAweDZiNmI1MWY0TCwgMHgxYzZjNjE2MkwsIDB4ODU2NTMwZDhMLCAweGYyNjIwMDRlTCwgMHg2YzA2OTVlZEwsCisgICAgICAgMHgxYjAxYTU3YkwsIDB4ODIwOGY0YzFMLCAweGY1MGZjNDU3TCwgMHg2NWIwZDljNkwsIDB4MTJiN2U5NTBMLAorICAgICAgIDB4OGJiZWI4ZWFMLCAweGZjYjk4ODdjTCwgMHg2MmRkMWRkZkwsIDB4MTVkYTJkNDlMLCAweDhjZDM3Y2YzTCwKKyAgICAgICAweGZiZDQ0YzY1TCwgMHg0ZGIyNjE1OEwsIDB4M2FiNTUxY2VMLCAweGEzYmMwMDc0TCwgMHhkNGJiMzBlMkwsCisgICAgICAgMHg0YWRmYTU0MUwsIDB4M2RkODk1ZDdMLCAweGE0ZDFjNDZkTCwgMHhkM2Q2ZjRmYkwsIDB4NDM2OWU5NmFMLAorICAgICAgIDB4MzQ2ZWQ5ZmNMLCAweGFkNjc4ODQ2TCwgMHhkYTYwYjhkMEwsIDB4NDQwNDJkNzNMLCAweDMzMDMxZGU1TCwKKyAgICAgICAweGFhMGE0YzVmTCwgMHhkZDBkN2NjOUwsIDB4NTAwNTcxM2NMLCAweDI3MDI0MWFhTCwgMHhiZTBiMTAxMEwsCisgICAgICAgMHhjOTBjMjA4NkwsIDB4NTc2OGI1MjVMLCAweDIwNmY4NWIzTCwgMHhiOTY2ZDQwOUwsIDB4Y2U2MWU0OWZMLAorICAgICAgIDB4NWVkZWY5MGVMLCAweDI5ZDljOTk4TCwgMHhiMGQwOTgyMkwsIDB4YzdkN2E4YjRMLCAweDU5YjMzZDE3TCwKKyAgICAgICAweDJlYjQwZDgxTCwgMHhiN2JkNWMzYkwsIDB4YzBiYTZjYWRMLCAweGVkYjg4MzIwTCwgMHg5YWJmYjNiNkwsCisgICAgICAgMHgwM2I2ZTIwY0wsIDB4NzRiMWQyOWFMLCAweGVhZDU0NzM5TCwgMHg5ZGQyNzdhZkwsIDB4MDRkYjI2MTVMLAorICAgICAgIDB4NzNkYzE2ODNMLCAweGUzNjMwYjEyTCwgMHg5NDY0M2I4NEwsIDB4MGQ2ZDZhM2VMLCAweDdhNmE1YWE4TCwKKyAgICAgICAweGU0MGVjZjBiTCwgMHg5MzA5ZmY5ZEwsIDB4MGEwMGFlMjdMLCAweDdkMDc5ZWIxTCwgMHhmMDBmOTM0NEwsCisgICAgICAgMHg4NzA4YTNkMkwsIDB4MWUwMWYyNjhMLCAweDY5MDZjMmZlTCwgMHhmNzYyNTc1ZEwsIDB4ODA2NTY3Y2JMLAorICAgICAgIDB4MTk2YzM2NzFMLCAweDZlNmIwNmU3TCwgMHhmZWQ0MWI3NkwsIDB4ODlkMzJiZTBMLCAweDEwZGE3YTVhTCwKKyAgICAgICAweDY3ZGQ0YWNjTCwgMHhmOWI5ZGY2ZkwsIDB4OGViZWVmZjlMLCAweDE3YjdiZTQzTCwgMHg2MGIwOGVkNUwsCisgICAgICAgMHhkNmQ2YTNlOEwsIDB4YTFkMTkzN2VMLCAweDM4ZDhjMmM0TCwgMHg0ZmRmZjI1MkwsIDB4ZDFiYjY3ZjFMLAorICAgICAgIDB4YTZiYzU3NjdMLCAweDNmYjUwNmRkTCwgMHg0OGIyMzY0YkwsIDB4ZDgwZDJiZGFMLCAweGFmMGExYjRjTCwKKyAgICAgICAweDM2MDM0YWY2TCwgMHg0MTA0N2E2MEwsIDB4ZGY2MGVmYzNMLCAweGE4NjdkZjU1TCwgMHgzMTZlOGVlZkwsCisgICAgICAgMHg0NjY5YmU3OUwsIDB4Y2I2MWIzOGNMLCAweGJjNjY4MzFhTCwgMHgyNTZmZDJhMEwsIDB4NTI2OGUyMzZMLAorICAgICAgIDB4Y2MwYzc3OTVMLCAweGJiMGI0NzAzTCwgMHgyMjAyMTZiOUwsIDB4NTUwNTI2MmZMLCAweGM1YmEzYmJlTCwKKyAgICAgICAweGIyYmQwYjI4TCwgMHgyYmI0NWE5MkwsIDB4NWNiMzZhMDRMLCAweGMyZDdmZmE3TCwgMHhiNWQwY2YzMUwsCisgICAgICAgMHgyY2Q5OWU4YkwsIDB4NWJkZWFlMWRMLCAweDliNjRjMmIwTCwgMHhlYzYzZjIyNkwsIDB4NzU2YWEzOWNMLAorICAgICAgIDB4MDI2ZDkzMGFMLCAweDljMDkwNmE5TCwgMHhlYjBlMzYzZkwsIDB4NzIwNzY3ODVMLCAweDA1MDA1NzEzTCwKKyAgICAgICAweDk1YmY0YTgyTCwgMHhlMmI4N2ExNEwsIDB4N2JiMTJiYWVMLCAweDBjYjYxYjM4TCwgMHg5MmQyOGU5YkwsCisgICAgICAgMHhlNWQ1YmUwZEwsIDB4N2NkY2VmYjdMLCAweDBiZGJkZjIxTCwgMHg4NmQzZDJkNEwsIDB4ZjFkNGUyNDJMLAorICAgICAgIDB4NjhkZGIzZjhMLCAweDFmZGE4MzZlTCwgMHg4MWJlMTZjZEwsIDB4ZjZiOTI2NWJMLCAweDZmYjA3N2UxTCwKKyAgICAgICAweDE4Yjc0Nzc3TCwgMHg4ODA4NWFlNkwsIDB4ZmYwZjZhNzBMLCAweDY2MDYzYmNhTCwgMHgxMTAxMGI1Y0wsCisgICAgICAgMHg4ZjY1OWVmZkwsIDB4Zjg2MmFlNjlMLCAweDYxNmJmZmQzTCwgMHgxNjZjY2Y0NUwsIDB4YTAwYWUyNzhMLAorICAgICAgIDB4ZDcwZGQyZWVMLCAweDRlMDQ4MzU0TCwgMHgzOTAzYjNjMkwsIDB4YTc2NzI2NjFMLCAweGQwNjAxNmY3TCwKKyAgICAgICAweDQ5Njk0NzRkTCwgMHgzZTZlNzdkYkwsIDB4YWVkMTZhNGFMLCAweGQ5ZDY1YWRjTCwgMHg0MGRmMGI2NkwsCisgICAgICAgMHgzN2Q4M2JmMEwsIDB4YTliY2FlNTNMLCAweGRlYmI5ZWM1TCwgMHg0N2IyY2Y3ZkwsIDB4MzBiNWZmZTlMLAorICAgICAgIDB4YmRiZGYyMWNMLCAweGNhYmFjMjhhTCwgMHg1M2IzOTMzMEwsIDB4MjRiNGEzYTZMLCAweGJhZDAzNjA1TCwKKyAgICAgICAweGNkZDcwNjkzTCwgMHg1NGRlNTcyOUwsIDB4MjNkOTY3YmZMLCAweGIzNjY3YTJlTCwgMHhjNDYxNGFiOEwsCisgICAgICAgMHg1ZDY4MWIwMkwsIDB4MmE2ZjJiOTRMLCAweGI0MGJiZTM3TCwgMHhjMzBjOGVhMUwsIDB4NWEwNWRmMWJMLAorICAgICAgIDB4MmQwMmVmOGRMCit9OworCit2b2lkIHpmV0VQRW5jcnlwdCh6ZGV2X3QgKmRldiwgemJ1Zl90ICpidWYsIHU4X3QgKnNuYXAsIHUxNl90IHNuYXBMZW4sIHUxNl90IG9mZnNldCwgdThfdCBrZXlMZW4sIHU4X3QqIFdlcEtleSwgdThfdCAqaXYpCit7CisgICAgdThfdCAgICBTWzI1Nl0sUzJbMjU2XTsKKyAgICB1MTZfdCAgIHVpOworICAgIHUxNl90ICAgaTsKKyAgICB1MTZfdCAgIGo7CisgICAgdThfdCAgICB0ZW1wOworICAgIHU4X3QgICAgSzsKKyAgICB1MzJfdCAgIGx0ZW1wOworICAgIHUxNl90ICAgbGVuOworICAgIHUzMl90ICAgaWN2OworICAgIHU4X3QgICAga2V5WzMyXTsKKworICAgIGtleVswXSA9IGl2WzBdOworICAgIGtleVsxXSA9IGl2WzFdOworICAgIGtleVsyXSA9IGl2WzJdOworCisgICAgLyogQXBwZW5kIFdlcCBLZXkgYWZ0ZXIgSVYgKi8KKyAgICB6Zk1lbW9yeUNvcHkoJmtleVszXSwgV2VwS2V5LCBrZXlMZW4pOworCisgICAga2V5TGVuICs9IDM7CisKKyAgICBmb3IoaSA9IDA7IGkgPCAyNTY7IGkrKykKKyAgICB7CisgICAgICAgIFNbaV0gPSAodThfdClpOworICAgICAgICBTMltpXSA9IGtleVtpJihrZXlMZW4tMSldOworICAgIH0KKworICAgIGogPSAwOworICAgIGZvcihpID0gMDsgaSA8IDI1NjsgaSsrKQorICAgIHsKKyAgICAgICAgaiA9IChqICsgU1tpXSArIFMyW2ldKSA7CisgICAgICAgIGomPTI1NSA7CisKKyAgICAgICAgLy8gU3dhcCBTW2ldIGFuZCBTW2pdCisgICAgICAgIHRlbXAgPSBTW2ldOworICAgICAgICBTW2ldID0gU1tqXTsKKyAgICAgICAgU1tqXSA9IHRlbXA7CisgICAgfQorCisgICAgaSA9IGogPSAwOworICAgIGljdiA9IC0xOworCisgICAgLyogRm9yIFNuYXAgSGVhZGVyICovCisgICAgZm9yICh1aSA9IDA7IHVpIDwgc25hcExlbjsgdWkrKykKKyAgICB7CisgICAgICAgIHU4X3QgSW47CisKKyAgICAgICAgaSsrOworICAgICAgICBpICY9IDI1NTsKKyAgICAgICAgaiArPSBTW2ldOworICAgICAgICBqICY9IDI1NTsKKworICAgICAgICAvLyBTd2FwIFNbaV0gYW5kIFNbal0KKyAgICAgICAgdGVtcCA9IFNbaV07CisgICAgICAgIFNbaV0gPSBTW2pdOworICAgICAgICBTW2pdID0gdGVtcDsKKy8vICAgICAgICAgIHRlbXAgPSAoU1tpXSArIHRlbXApICYgMjU1OworICAgICAgICB0ZW1wICs9IFNbaV07CisgICAgICAgIHRlbXAgJj0yNTU7CisgICAgICAgIEsgPSBTW3RlbXBdOyAgICAgICAgLy8gS2V5IHVzZWQgdG8gWG9yIHdpdGggaW5wdXQgZGF0YQorCisgICAgICAgIEluID0gc25hcFt1aV07CisgICAgICAgIGljdiA9ICAoaWN2Pj44KSBeIGNyYzMyX3RhYlsoaWN2XkluKSYweGZmXTsKKworICAgICAgICBzbmFwW3VpXSA9IEluIF4gSzsKKyAgICAgICAgLy96bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1ZiwgdWksIEluIF4gSyk7CisgICAgfQorCisgICAgbGVuID0gemZ3QnVmR2V0U2l6ZShkZXYsIGJ1Zik7CisKKyAgICBmb3IgKHVpID0gb2Zmc2V0OyB1aSA8IGxlbjsgdWkrKykKKyAgICB7CisgICAgICAgIHU4X3QgSW47CisKKyAgICAgICAgaSsrOworICAgICAgICBpICY9IDI1NTsKKyAgICAgICAgaiArPSBTW2ldOworICAgICAgICBqICY9IDI1NTsKKworICAgICAgICAvLyBTd2FwIFNbaV0gYW5kIFNbal0KKyAgICAgICAgdGVtcCA9IFNbaV07CisgICAgICAgIFNbaV0gPSBTW2pdOworICAgICAgICBTW2pdID0gdGVtcDsKKy8vICAgICAgICAgIHRlbXAgPSAoU1tpXSArIHRlbXApICYgMjU1OworICAgICAgICB0ZW1wICs9IFNbaV07CisgICAgICAgIHRlbXAgJj0yNTU7CisgICAgICAgIEsgPSBTW3RlbXBdOyAgICAgICAgLy8gS2V5IHVzZWQgdG8gWG9yIHdpdGggaW5wdXQgZGF0YQorCisgICAgICAgIEluID0gem13X3R4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgdWkpOworICAgICAgICBpY3YgPSAgKGljdj4+OCkgXiBjcmMzMl90YWJbKGljdl5JbikmMHhmZl07CisKKyAgICAgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIHVpLCBJbiBeIEspOworICAgIH0gLy9FbmQgb2YgZm9yICh1aSA9IDA7IHVpIDwgTnVtX0J5dGVzOyB1aSsrKQorCisgICAgaWN2ID0gfihpY3YpOworICAgIGx0ZW1wID0gKHUzMl90KSBpY3Y7CisKKyAgICBmb3IgKHVpID0gMDsgdWkgPCA0OyB1aSsrKQorICAgIHsKKyAgICAgICAgaSArKzsKKyAgICAgICAgaSAmPSAyNTU7CisgICAgICAgIGogKz0gU1tpXTsKKyAgICAgICAgaiAmPSAyNTU7CisKKyAgICAgICAgLy8gU3dhcCBTW2ldIGFuZCBTW2pdCisgICAgICAgIHRlbXAgPSBTW2ldOworICAgICAgICBTW2ldID0gU1tqXTsKKyAgICAgICAgU1tqXSA9IHRlbXA7CisgICAgICAgIHRlbXAgKz0gU1tpXTsKKyAgICAgICAgdGVtcCAmPSAyNTU7CisgICAgICAgIEsgPSBTW3RlbXBdOyAgICAgICAgLy8gS2V5IHVzZWQgdG8gWG9yIHdpdGggaW5wdXQgZGF0YQorCisgICAgICAgIC8vKk91dCsrID0gKHU4X3QpKGx0ZW1wIF4gSykmMHhmZjsKKyAgICAgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIGxlbit1aSwgKHU4X3QpKGx0ZW1wIF4gSykmMHhmZik7CisgICAgICAgIGx0ZW1wID4+PSA4OworICAgIH0KKworICAgIHpmd0J1ZlNldFNpemUoZGV2LCBidWYsIGxlbis0KTsKK30KKwordTE2X3QgemZXRVBEZWNyeXB0KHpkZXZfdCAqZGV2LCB6YnVmX3QgKmJ1ZiwgdTE2X3Qgb2Zmc2V0LCB1OF90IGtleUxlbiwgdThfdCogV2VwS2V5LCB1OF90ICppdikKK3sKKyAgICB1OF90ICAgIFNbMjU2XTsKKyAgICB1OF90ICAgIFMyWzI1Nl07CisgICAgdTE2X3QgICB1aTsKKyAgICB1MTZfdCAgIGk7CisgICAgdTE2X3QgICBqOworICAgIHUzMl90ICAgaWN2X3RtcDsKKyAgICB1MzJfdCAgICppY3Y7CisgICAgdTMyX3QgICByeGJ1Zl9pY3Y7CisgICAgdThfdCAgICB0ZW1wOworICAgIHU4X3QgICAgSzsKKyAgICB1MTZfdCAgIGxlbjsKKyAgICB1OF90ICAgIGtleVszMl07CisKKyAgICAvKiBSZXRyaWV2ZSBJViAqLworICAgIGtleVswXSA9IGl2WzBdOworICAgIGtleVsxXSA9IGl2WzFdOworICAgIGtleVsyXSA9IGl2WzJdOworCisgICAgLyogQXBwZW5kIFdlcCBLZXkgYWZ0ZXIgSVYgKi8KKyAgICB6Zk1lbW9yeUNvcHkoJmtleVszXSwgV2VwS2V5LCBrZXlMZW4pOworCisgICAga2V5TGVuICs9IDM7CisKKyAgICBmb3IoaSA9IDA7IGkgPCAyNTY7IGkrKykKKyAgICB7CisgICAgICAgIFNbaV0gPSAodThfdClpOworICAgICAgICBTMltpXSA9IGtleVtpJihrZXlMZW4tMSldOworICAgIH0KKworICAgIGogPSAwOworICAgIGZvcihpID0gMDsgaSA8IDI1NjsgaSsrKQorICAgIHsKKyAgICAgICAgaiA9IChqICsgU1tpXSArIFMyW2ldKTsKKyAgICAgICAgaiY9MjU1IDsKKworICAgICAgICAvLyBTd2FwIFNbaV0gYW5kIFNbal0KKyAgICAgICAgdGVtcCA9IFNbaV07CisgICAgICAgIFNbaV0gPSBTW2pdOworICAgICAgICBTW2pdID0gdGVtcDsKKyAgICB9CisKKyAgICBpID0gaiA9IDA7CisKKyAgICBsZW4gPSB6ZndCdWZHZXRTaXplKGRldiwgYnVmKTsKKworICAgIGZvciAodWkgPSBvZmZzZXQ7IHVpIDwgbGVuOyB1aSsrKQorICAgIHsKKyAgICAgICAgdThfdCBJbjsKKworICAgICAgICBpKys7CisgICAgICAgIGkgJj0gMjU1OworICAgICAgICBqICs9IFNbaV07CisgICAgICAgIGogJj0gMjU1OworCisgICAgICAgIC8vIFN3YXAgU1tpXSBhbmQgU1tqXQorICAgICAgICB0ZW1wID0gU1tpXTsKKyAgICAgICAgU1tpXSA9IFNbal07CisgICAgICAgIFNbal0gPSB0ZW1wOworLy8gICAgICAgICAgdGVtcCA9IChTW2ldICsgdGVtcCkgJiAyNTU7CisgICAgICAgIHRlbXAgKz0gU1tpXTsKKyAgICAgICAgdGVtcCAmPTI1NTsKKyAgICAgICAgSyA9IFNbdGVtcF07ICAgICAgICAvLyBLZXkgdXNlZCB0byBYb3Igd2l0aCBpbnB1dCBkYXRhCisKKyAgICAgICAgSW4gPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCB1aSk7CisKKyAgICAgICAgem13X3J4X2J1Zl93cml0ZWIoZGV2LCBidWYsIHVpLCBJbiBeIEspOworICAgIH0gLy9FbmQgb2YgZm9yICh1aSA9IDA7IHVpIDwgTnVtX0J5dGVzOyB1aSsrKQorCisgICAgaWN2ID0gJmljdl90bXA7CisgICAgKmljdiA9IC0xOworCisgICAgZm9yICh1aSA9IG9mZnNldDsgdWkgPCBsZW4gLSA0OyB1aSsrKQorICAgIHsKKyAgICAgICAgdThfdCBJbjsKKworICAgICAgICBJbiA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIHVpKTsKKyAgICAgICAgKmljdiA9ICAoKmljdj4+OCkgXiBjcmMzMl90YWJbKCppY3ZeSW4pJjB4ZmZdOworICAgIH0KKworICAgICppY3YgPSB+KmljdjsKKworICAgIHJ4YnVmX2ljdiA9ICh6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBsZW4tNCkgfAorICAgICAgICAgem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgbGVuLTMpIDw8IDggfAorICAgICAgICAgem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgbGVuLTIpIDw8IDE2IHwKKyAgICAgICAgIHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIGxlbi0xKSA8PCAyNCk7CisKKyAgICBpZiAoKmljdiAhPSByeGJ1Zl9pY3YpCisgICAgeworICAgICAgICByZXR1cm4gWk1fSUNWX0ZBSUxVUkU7CisgICAgfQorCisgICAgcmV0dXJuIFpNX0lDVl9TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2N3bS5jIGIvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2N3bS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwZjExNDEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvY3dtLmMKQEAgLTAsMCArMSwxMzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBBdGhlcm9zIENvbW11bmljYXRpb25zIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2R1bGUgTmFtZSA6IGN3bS5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEFic3RyYWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgVGhpcyBtb2R1bGUgY29udGFpbnMgY2hhbm5lbCB3aWR0aCByZWxhdGVkIGZ1bmN0aW9ucy4gICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE5PVEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgImNwcmVjb21wLmgiCisKKworCit2b2lkIHpmQ3dtSW5pdCh6ZGV2X3QqIGRldikgeworICAgIC8vdTE2X3QgaTsKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBzd2l0Y2ggKHdkLT53bGFuTW9kZSkgeworICAgIGNhc2UgWk1fTU9ERV9BUDoKKyAgICAgICAgd2QtPmN3bS5jd19tb2RlID0gQ1dNX01PREUyMDQwOworICAgICAgICB3ZC0+Y3dtLmN3X3dpZHRoID0gQ1dNX1dJRFRINDA7CisgICAgICAgIHdkLT5jd20uY3dfZW5hYmxlID0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBaTV9NT0RFX0lORlJBU1RSVUNUVVJFOgorICAgIGNhc2UgWk1fTU9ERV9QU0VVRE86CisgICAgY2FzZSBaTV9NT0RFX0lCU1M6CisgICAgZGVmYXVsdDoKKyAgICAgICAgd2QtPmN3bS5jd19tb2RlID0gQ1dNX01PREUyMDQwOworICAgICAgICB3ZC0+Y3dtLmN3X3dpZHRoID0gQ1dNX1dJRFRIMjA7CisgICAgICAgIHdkLT5jd20uY3dfZW5hYmxlID0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCisKK3ZvaWQgemZDb3JlQ3dtQnVzeSh6ZGV2X3QqIGRldiwgdTE2X3QgYnVzeSkKK3sKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptX21zZzFfbW0oWk1fTFZfMCwgIkN3bUJ1c3k9IiwgYnVzeSk7CisKKyAgICBpZih3ZC0+Y3dtLmN3X21vZGUgPT0gQ1dNX01PREUyMCkgeworICAgICAgICB3ZC0+Y3dtLmN3X3dpZHRoID0gQ1dNX1dJRFRIMjA7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZih3ZC0+Y3dtLmN3X21vZGUgPT0gQ1dNX01PREU0MCkgeworICAgICAgICB3ZC0+Y3dtLmN3X3dpZHRoID0gQ1dNX1dJRFRINDA7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoYnVzeSkgeworICAgICAgICB3ZC0+Y3dtLmN3X3dpZHRoID0gQ1dNX1dJRFRIMjA7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKworICAgIGlmKCh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9JTkZSQVNUUlVDVFVSRSB8fCB3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9QU0VVRE8gfHwKKyAgICAgICAgd2QtPndsYW5Nb2RlID09IFpNX01PREVfSUJTUykpIHsKKyAgICAgICAgaWYgKHdkLT5zdGEuaWUuSHRDYXAuSHRDYXBJbmZvICYmIEhUQ0FQX1N1cENoYW5uZWxXaWR0aFNldCAhPSAwICYmCisgICAgICAgICAgICB3ZC0+c3RhLmllLkh0SW5mby5DaGFubmVsSW5mbyAmJiBFeHRIdENhcF9SZWNvbVR4V2lkdGhTZXQgIT0gMCAmJgorICAgICAgICAgICAgKHdkLT5zdGEuaWUuSHRJbmZvLkNoYW5uZWxJbmZvICYmIEV4dEh0Q2FwX0V4dENoYW5uZWxPZmZzZXRBYm92ZSkgPT0gMSkgeworCisgICAgICAgICAgICB3ZC0+Y3dtLmN3X3dpZHRoID0gQ1dNX1dJRFRINDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICB3ZC0+Y3dtLmN3X3dpZHRoID0gQ1dNX1dJRFRIMjA7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYod2QtPndsYW5Nb2RlID09IFpNX01PREVfQVApIHsKKyAgICAgICAgd2QtPmN3bS5jd193aWR0aCA9IENXTV9XSURUSDQwOworICAgIH0KKworfQorCisKKworCit1MTZfdCB6ZkN3bUlzRXh0Q2hhbkJ1c3kodTMyX3QgY3RsQnVzeSwgdTMyX3QgZXh0QnVzeSkKK3sKKyAgICB1MzJfdCBidXN5OyAvKiBwZXJjZW50YWdlICovCisgICAgdTMyX3QgY3ljbGVUaW1lLCBjdGxDbGVhcjsKKworICAgIGN5Y2xlVGltZSA9IDEyODAwMDA7IC8vMS4yOCBzZWNvbmRzCisKKyAgICBpZiAoY3ljbGVUaW1lID4gY3RsQnVzeSkgeworICAgICAgICBjdGxDbGVhciA9IGN5Y2xlVGltZSAtIGN0bEJ1c3k7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGN0bENsZWFyID0gMDsKKyAgICB9CisKKyAgICAvKiBDb21wdXRlIHJhdGlvIG9mIGV4dGVuc2lvbiBjaGFubmVsIGJ1c3kgdG8gY29udHJvbCBjaGFubmVsIGNsZWFyCisgICAgICogYXMgYW4gYXBwcm94aW1hdGlvbiB0byBleHRlbnNpb24gY2hhbm5lbCBjbGVhbmxpbmVzcy4KKyAgICAgKgorICAgICAqIEFjY29yZGluZyB0byB0aGUgaGFyZHdhcmUgZm9sa3MsIGV4dCByeGNsZWFyIGlzIHVuZGVmaW5lZAorICAgICAqIGlmIHRoZSBjdHJsIHJ4Y2xlYXIgaXMgZGUtYXNzZXJ0ZWQgKGkuZS4gYnVzeSkKKyAgICAgKi8KKyAgICBpZiAoY3RsQ2xlYXIpIHsKKyAgICAgICAgYnVzeSA9IChleHRCdXN5ICogMTAwKSAvIGN0bENsZWFyOworICAgIH0gZWxzZSB7CisgICAgICAgIGJ1c3kgPSAwOworICAgIH0KKyAgICBpZiAoYnVzeSA+IEFUSF9DV01fRVhUQ0hfQlVTWV9USFJFU0hPTEQpIHsKKyAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgICAgcmV0dXJuIEZBTFNFOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2N3bS5oIGIvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2N3bS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwYzM5ZmEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvY3dtLmgKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNy0yMDA4IEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2R1bGUgTmFtZSA6IGN3bS5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQWJzdHJhY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgVGhpcyBtb2R1bGUgY29udGFpbnMgY2hhbm5lbCB3aWR0aCByZWxhdGl2ZWQgZnVuY3Rpb25zLiAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTk9URVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qUmV2aXNpb24gSGlzdG9yeTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgV2hvICAgICAgICAgV2hlbiAgICAgICAgV2hhdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAtLS0tLS0tLSAgICAtLS0tLS0tLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSG9uZGEgICAgICAgMy0xOS0wNyAgICAgY3JlYXRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9DV01fSAorI2RlZmluZSBfQ1dNX0gKKworI2RlZmluZSBBVEhfQ1dNX0VYVENIX0JVU1lfVEhSRVNIT0xEICAzMCAgLyogRXh0ZW5zaW9uIENoYW5uZWwgQnVzeSBUaHJlc2hvbGQgKDAtMTAwJSkgKi8KKwordm9pZCB6ZkN3bUluaXQoemRldl90KiBkZXYpOwordm9pZCB6ZkNvcmVDd21CdXN5KHpkZXZfdCogZGV2LCB1MTZfdCBidXN5KTsKK3UxNl90IHpmQ3dtSXNFeHRDaGFuQnVzeSh1MzJfdCBjdGxCdXN5LCB1MzJfdCBleHRCdXN5KTsKKworCisKKyNlbmRpZiAvKiAjaWZuZGVmIF9DV01fSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2ZyZXFjdHJsLmMgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvZnJlcWN0cmwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYWIwZGYwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2ZyZXFjdHJsLmMKQEAgLTAsMCArMSwyNTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBBdGhlcm9zIENvbW11bmljYXRpb25zIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSAiY3ByZWNvbXAuaCIKKworLyogemZBZGRGcmVxQ2hhbmdlUmVxIHNob3VsZCBiZSBjYWxsZWQgaW5zaWRlIHRoZSBjcml0aWNhbCBzZWN0aW9uICovCitzdGF0aWMgdm9pZCB6ZkFkZEZyZXFDaGFuZ2VSZXEoemRldl90KiBkZXYsIHUxNl90IGZyZXF1ZW5jeSwgdThfdCBidzQwLAorICAgICAgICB1OF90IGV4dE9mZnNldCwgemZwRnJlcUNoYW5nZUNvbXBsZXRlQ2IgY2IpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisvL3ByaW50aygiemZBZGRGcmVxQ2hhbmdlUmVxICBmcmVxUmVxUXVldWVUYWlsJWRcbiIsIHdkLT5mcmVxQ3RybC5mcmVxUmVxUXVldWVUYWlsKTsKKyAgICB3ZC0+ZnJlcUN0cmwuZnJlcVJlcVF1ZXVlW3dkLT5mcmVxQ3RybC5mcmVxUmVxUXVldWVUYWlsXSA9IGZyZXF1ZW5jeTsKKyAgICB3ZC0+ZnJlcUN0cmwuZnJlcVJlcUJ3NDBbd2QtPmZyZXFDdHJsLmZyZXFSZXFRdWV1ZVRhaWxdID0gYnc0MDsKKyAgICB3ZC0+ZnJlcUN0cmwuZnJlcVJlcUV4dE9mZnNldFt3ZC0+ZnJlcUN0cmwuZnJlcVJlcVF1ZXVlVGFpbF0gPSBleHRPZmZzZXQ7CisgICAgd2QtPmZyZXFDdHJsLmZyZXFDaGFuZ2VDb21wQ2Jbd2QtPmZyZXFDdHJsLmZyZXFSZXFRdWV1ZVRhaWxdID0gY2I7CisgICAgd2QtPmZyZXFDdHJsLmZyZXFSZXFRdWV1ZVRhaWwrKzsKKyAgICBpZiAoIHdkLT5mcmVxQ3RybC5mcmVxUmVxUXVldWVUYWlsID49IFpNX01BWF9GUkVRX1JFUV9RVUVVRSApCisgICAgeworICAgICAgICB3ZC0+ZnJlcUN0cmwuZnJlcVJlcVF1ZXVlVGFpbCA9IDA7CisgICAgfQorfQorCit2b2lkIHpmQ29yZVNldEZyZXF1ZW5jeVYyKHpkZXZfdCogZGV2LCB1MTZfdCBmcmVxdWVuY3ksIHpmcEZyZXFDaGFuZ2VDb21wbGV0ZUNiIGNiKQoreworICAgIHpmQ29yZVNldEZyZXF1ZW5jeUV4KGRldiwgZnJlcXVlbmN5LCAwLCAwLCBjYik7Cit9CisKK3ZvaWQgemZDb3JlU2V0RnJlcXVlbmN5RXhWMih6ZGV2X3QqIGRldiwgdTE2X3QgZnJlcXVlbmN5LCB1OF90IGJ3NDAsCisgICAgICAgIHU4X3QgZXh0T2Zmc2V0LCB6ZnBGcmVxQ2hhbmdlQ29tcGxldGVDYiBjYiwgdThfdCBmb3JjZVNldEZyZXEpCit7CisgICAgdThfdCBzZXRGcmVxSW1tZWQgPSAwOworICAgIHU4X3QgaW5pdFJGID0gMDsKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHptX21zZzFfc2NhbihaTV9MVl8xLCAiRnJlcT0iLCBmcmVxdWVuY3kpOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICBpZiAoKHdkLT5zdGEuY3VycmVudEZyZXF1ZW5jeSA9PSBmcmVxdWVuY3kpCisgICAgICAgICYmICh3ZC0+c3RhLmN1cnJlbnRCdzQwID09IGJ3NDApCisgICAgICAgICYmICh3ZC0+c3RhLmN1cnJlbnRFeHRPZmZzZXQgPT0gZXh0T2Zmc2V0KSkKKyAgICB7CisgICAgICAgIGlmICggZm9yY2VTZXRGcmVxID09IDAgJiYgd2QtPnN0YS5mbGFnRnJlcUNoYW5naW5nID09IDAgKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIGRvbmU7CisgICAgICAgIH0KKyAgICB9CisjaWZkZWYgWk1fRkI1MAorICAgIC8qaWYoZnJlcXVlbmN5IT0yNDM3KSB7CisgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgIHJldHVybjsKKyAgICB9Ki8KKyNlbmRpZgorCisgICAgemZBZGRGcmVxQ2hhbmdlUmVxKGRldiwgZnJlcXVlbmN5LCBidzQwLCBleHRPZmZzZXQsIGNiKTsKKworLy8gICAgem1fYXNzZXJ0KCB3ZC0+c3RhLmZsYWdGcmVxQ2hhbmdpbmcgPT0gMCApOworICAgIC8vd2QtPnN0YS5mbGFnRnJlcUNoYW5naW5nID0gMTsKKyAgICBpZiAoIHdkLT5zdGEuZmxhZ0ZyZXFDaGFuZ2luZyA9PSAwICkKKyAgICB7CisgICAgICAgIGlmICgod2QtPnN0YS5jdXJyZW50Qnc0MCAhPSBidzQwKSB8fCAod2QtPnN0YS5jdXJyZW50RXh0T2Zmc2V0ICE9IGV4dE9mZnNldCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGluaXRSRiA9IDE7CisgICAgICAgIH0KKyAgICAgICAgd2QtPnN0YS5jdXJyZW50RnJlcXVlbmN5ID0gZnJlcXVlbmN5OworICAgICAgICB3ZC0+c3RhLmN1cnJlbnRCdzQwID0gYnc0MDsKKyAgICAgICAgd2QtPnN0YS5jdXJyZW50RXh0T2Zmc2V0ID0gZXh0T2Zmc2V0OworICAgICAgICBzZXRGcmVxSW1tZWQgPSAxOworICAgIH0KKyAgICB3ZC0+c3RhLmZsYWdGcmVxQ2hhbmdpbmcrKzsKKworICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICBpZiAoIHNldEZyZXFJbW1lZCApCisgICAgeworICAgICAgICAvL3pmSHBTZXRGcmVxdWVuY3koZGV2LCBmcmVxdWVuY3ksIDApOworICAgICAgICBpZiAoIGZvcmNlU2V0RnJlcSApCisgICAgICAgIHsgLy8gQ29sZCByZXNldCB0byByZXNldCB0aGUgZnJlcXVlbmN5IGFmdGVyIHNjYW5uaW5nICEKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIiM2XzEgMjAwNzA5MTciKTsKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIkl0IGlzIGhhcHBlbiEhISBObyBlcnJvciBtZXNzYWdlIik7CisgICAgICAgICAgICB6ZkhwU2V0RnJlcXVlbmN5RXgoZGV2LCBmcmVxdWVuY3ksIGJ3NDAsIGV4dE9mZnNldCwgMik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgIHpmSHBTZXRGcmVxdWVuY3lFeChkZXYsIGZyZXF1ZW5jeSwgYnc0MCwgZXh0T2Zmc2V0LCBpbml0UkYpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCAgICB6ZlN0YUlzQ29ubmVjdGVkKGRldikKKyAgICAgICAgICAgICAmJiAoZnJlcXVlbmN5ID09IHdkLT5mcmVxdWVuY3kpKSB7CisgICAgICAgICAgICB3ZC0+c3RhLmNvbm5Qb3dlckluSGFsZkRibSA9IHpmSHBHZXRUcmFuc21pdFBvd2VyKGRldik7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuOworCitkb25lOgorICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICBpZiAoIGNiICE9IE5VTEwgKQorICAgIHsKKyAgICAgICAgY2IoZGV2KTsKKyAgICB9CisgICAgemZQdXNoVnR4cShkZXYpOworICAgIHJldHVybjsKK30KKwordm9pZCB6ZkNvcmVTZXRGcmVxdWVuY3lFeCh6ZGV2X3QqIGRldiwgdTE2X3QgZnJlcXVlbmN5LCB1OF90IGJ3NDAsCisgICAgICAgIHU4X3QgZXh0T2Zmc2V0LCB6ZnBGcmVxQ2hhbmdlQ29tcGxldGVDYiBjYikKK3sKKyAgICB6ZkNvcmVTZXRGcmVxdWVuY3lFeFYyKGRldiwgZnJlcXVlbmN5LCBidzQwLCBleHRPZmZzZXQsIGNiLCAwKTsKK30KKwordm9pZCB6ZkNvcmVTZXRGcmVxdWVuY3koemRldl90KiBkZXYsIHUxNl90IGZyZXF1ZW5jeSkKK3sKKyAgICB6ZkNvcmVTZXRGcmVxdWVuY3lWMihkZXYsIGZyZXF1ZW5jeSwgTlVMTCk7Cit9CisKKy8qIHpmUmVtb3ZlRnJlcUNoYW5nZVJlcSBTSE9VTEQgTk9UIGJlIGNhbGxlZCBpbnNpZGUgdGhlIGNyaXRpY2FsIHNlY3Rpb24gKi8KK3N0YXRpYyB2b2lkIHpmUmVtb3ZlRnJlcUNoYW5nZVJlcSh6ZGV2X3QqIGRldikKK3sKKyAgICB6ZnBGcmVxQ2hhbmdlQ29tcGxldGVDYiBjYiA9IE5VTEw7CisgICAgdTE2X3QgZnJlcXVlbmN5OworICAgIHU4X3QgYnc0MDsKKyAgICB1OF90IGV4dE9mZnNldDsKKyAgICB1MTZfdCBjb21wRnJlcSA9IDA7CisgICAgdThfdCBjb21wQnc0MCA9IDA7CisgICAgdThfdCBjb21wRXh0T2Zmc2V0ID0gMDsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIGlmICh3ZC0+ZnJlcUN0cmwuZnJlcVJlcVF1ZXVlSGVhZCAhPSB3ZC0+ZnJlcUN0cmwuZnJlcVJlcVF1ZXVlVGFpbCkKKyAgICB7CisgICAgICAgIHptX21zZzFfc2NhbihaTV9MVl8xLCAiRnJlcT0iLAorICAgICAgICAgICAgICAgIHdkLT5mcmVxQ3RybC5mcmVxUmVxUXVldWVbd2QtPmZyZXFDdHJsLmZyZXFSZXFRdWV1ZUhlYWRdKTsKKyAgICAgICAgY29tcEZyZXEgPSB3ZC0+ZnJlcUN0cmwuZnJlcVJlcVF1ZXVlW3dkLT5mcmVxQ3RybC5mcmVxUmVxUXVldWVIZWFkXTsKKyAgICAgICAgY29tcEJ3NDAgPSB3ZC0+ZnJlcUN0cmwuZnJlcVJlcUJ3NDBbd2QtPmZyZXFDdHJsLmZyZXFSZXFRdWV1ZUhlYWRdOworICAgICAgICBjb21wRXh0T2Zmc2V0ID0gd2QtPmZyZXFDdHJsLmZyZXFSZXFFeHRPZmZzZXRbd2QtPmZyZXFDdHJsLmZyZXFSZXFRdWV1ZUhlYWRdOworCisgICAgICAgIHdkLT5mcmVxQ3RybC5mcmVxUmVxUXVldWVbd2QtPmZyZXFDdHJsLmZyZXFSZXFRdWV1ZUhlYWRdID0gMDsKKyAgICAgICAgY2IgPSB3ZC0+ZnJlcUN0cmwuZnJlcUNoYW5nZUNvbXBDYlt3ZC0+ZnJlcUN0cmwuZnJlcVJlcVF1ZXVlSGVhZF07CisgICAgICAgIHdkLT5mcmVxQ3RybC5mcmVxUmVxUXVldWVIZWFkKys7CisgICAgICAgIGlmICggd2QtPmZyZXFDdHJsLmZyZXFSZXFRdWV1ZUhlYWQgPj0gWk1fTUFYX0ZSRVFfUkVRX1FVRVVFICkKKyAgICAgICAgeworICAgICAgICAgICAgd2QtPmZyZXFDdHJsLmZyZXFSZXFRdWV1ZUhlYWQgPSAwOworICAgICAgICB9CisgICAgfQorICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICBpZiAoIGNiICE9IE5VTEwgKQorICAgIHsKKyAgICAgICAgY2IoZGV2KTsKKyAgICB9CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIHdoaWxlICh3ZC0+ZnJlcUN0cmwuZnJlcVJlcVF1ZXVlW3dkLT5mcmVxQ3RybC5mcmVxUmVxUXVldWVIZWFkXSAhPSAwKQorICAgIHsKKyAgICAgICAgZnJlcXVlbmN5ID0gd2QtPmZyZXFDdHJsLmZyZXFSZXFRdWV1ZVt3ZC0+ZnJlcUN0cmwuZnJlcVJlcVF1ZXVlSGVhZF07CisgICAgICAgIGJ3NDAgPSB3ZC0+ZnJlcUN0cmwuZnJlcVJlcUJ3NDBbd2QtPmZyZXFDdHJsLmZyZXFSZXFRdWV1ZUhlYWRdOworICAgICAgICBleHRPZmZzZXQ9d2QtPmZyZXFDdHJsLmZyZXFSZXFFeHRPZmZzZXRbd2QtPmZyZXFDdHJsLmZyZXFSZXFRdWV1ZUhlYWRdOworICAgICAgICBpZiAoKGNvbXBGcmVxID09IGZyZXF1ZW5jeSkKKyAgICAgICAgICAgICYmIChjb21wQnc0MCA9PSBidzQwKQorICAgICAgICAgICAgJiYgKGNvbXBFeHRPZmZzZXQgPT0gZXh0T2Zmc2V0KSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogRHVwbGljYXRlZCBmcmVxdWVuY3kgY29tbWFuZCAqLworICAgICAgICAgICAgem1fbXNnMV9zY2FuKFpNX0xWXzEsICJEdXBsaWNhdGVkIEZyZXE9IiwgZnJlcXVlbmN5KTsKKworICAgICAgICAgICAgY2IgPSB3ZC0+ZnJlcUN0cmwuZnJlcUNoYW5nZUNvbXBDYlt3ZC0+ZnJlcUN0cmwuZnJlcVJlcVF1ZXVlSGVhZF07CisgICAgICAgICAgICB3ZC0+ZnJlcUN0cmwuZnJlcVJlcVF1ZXVlW3dkLT5mcmVxQ3RybC5mcmVxUmVxUXVldWVIZWFkXSA9IDA7CisgICAgICAgICAgICB3ZC0+ZnJlcUN0cmwuZnJlcVJlcVF1ZXVlSGVhZCsrOworCisgICAgICAgICAgICBpZiAoIHdkLT5mcmVxQ3RybC5mcmVxUmVxUXVldWVIZWFkID49IFpNX01BWF9GUkVRX1JFUV9RVUVVRSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2QtPmZyZXFDdHJsLmZyZXFSZXFRdWV1ZUhlYWQgPSAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHdkLT5zdGEuZmxhZ0ZyZXFDaGFuZ2luZyAhPSAwICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3ZC0+c3RhLmZsYWdGcmVxQ2hhbmdpbmctLTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgIGlmICggY2IgIT0gTlVMTCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2IoZGV2KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB1OF90ICAgIGluaXRSRiA9IDA7CisgICAgICAgICAgICBpZiAoKHdkLT5zdGEuY3VycmVudEJ3NDAgIT0gYnc0MCkgfHwgKHdkLT5zdGEuY3VycmVudEV4dE9mZnNldCAhPSBleHRPZmZzZXQpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGluaXRSRiA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3ZC0+c3RhLmN1cnJlbnRGcmVxdWVuY3kgPSBmcmVxdWVuY3k7CisgICAgICAgICAgICB3ZC0+c3RhLmN1cnJlbnRCdzQwID0gYnc0MDsKKyAgICAgICAgICAgIHdkLT5zdGEuY3VycmVudEV4dE9mZnNldCA9IGV4dE9mZnNldDsKKyAgICAgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICAgICAgICAgIHpmSHBTZXRGcmVxdWVuY3lFeChkZXYsIGZyZXF1ZW5jeSwgYnc0MCwgZXh0T2Zmc2V0LCBpbml0UkYpOworICAgICAgICAgICAgaWYgKCAgICB6ZlN0YUlzQ29ubmVjdGVkKGRldikKKyAgICAgICAgICAgICAgICAmJiAoZnJlcXVlbmN5ID09IHdkLT5mcmVxdWVuY3kpKSB7CisgICAgICAgICAgICAgICAgd2QtPnN0YS5jb25uUG93ZXJJbkhhbGZEYm0gPSB6ZkhwR2V0VHJhbnNtaXRQb3dlcihkZXYpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIHJldHVybjsKK30KKwordm9pZCB6ZkNvcmVTZXRGcmVxdWVuY3lDb21wbGV0ZSh6ZGV2X3QqIGRldikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHptX21zZzFfc2NhbihaTV9MVl8xLCAiZmxhZ0ZyZXFDaGFuZ2luZz0iLCB3ZC0+c3RhLmZsYWdGcmVxQ2hhbmdpbmcpOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAvL3dkLT5zdGEuZmxhZ0ZyZXFDaGFuZ2luZyA9IDA7CisgICAgaWYgKCB3ZC0+c3RhLmZsYWdGcmVxQ2hhbmdpbmcgIT0gMCApCisgICAgeworICAgICAgICB3ZC0+c3RhLmZsYWdGcmVxQ2hhbmdpbmctLTsKKyAgICB9CisKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgemZSZW1vdmVGcmVxQ2hhbmdlUmVxKGRldik7CisKKyAgICB6ZlB1c2hWdHhxKGRldik7CisgICAgcmV0dXJuOworfQorCit2b2lkIHpmUmVTZXRDdXJyZW50RnJlcXVlbmN5KHpkZXZfdCogZGV2KQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptX2RlYnVnX21zZzAoIkl0IGlzIGhhcHBlbiEhISBObyBlcnJvciBtZXNzYWdlIik7CisKKyAgICB6ZkNvcmVTZXRGcmVxdWVuY3lFeFYyKGRldiwgd2QtPmZyZXF1ZW5jeSwgMCwgMCwgTlVMTCwgMSk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvbGVkbWdyLmMgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvbGVkbWdyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWUxMDRhOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9sZWRtZ3IuYwpAQCAtMCwwICsxLDU1NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNy0yMDA4IEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlICJjcHJlY29tcC5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZMZWRDdHJsVHlwZTEgICAgICAgICAgICAgICovCisvKiAgICAgIFRyYWRpdGlvbmFsIHNpbmdsZS1MRUQgc3RhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGRldiA6IGRldmljZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIE5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFN0ZXBoZW4gQ2hlbiAgICAgICAgQXRoZXJvcyBDb21tdW5pY2F0aW9ucywgSU5DLiAgICAyMDA3LjYgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvLyBiaXQgMTUtMTIgOiBUb2ZmIGZvciBTY2FuIHN0YXRlCisvLyAgICAgMTEtOCA6IFRvbiBmb3IgU2NhbiBzdGF0ZQorLy8gICAgIDcgOiBSZXNlcnZlZAorLy8gICAgIDYgOiBtb2RlCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgICAgYml0IDYgPSAwCisvLyAgICAgNS00IDogQ29ubmVjdCBzdGF0ZQorLy8gICAgICAgICAgIDAwID0+IGFsd2F5cyBvZmYKKy8vICAgICAgICAgICAwMSA9PiBhbHdheXMgb24KKy8vICAgICAgICAgICAxMCA9PiBJZGxlIG9mZiwgYWNpdHZlIG9uCisvLyAgICAgICAgICAgMTEgPT4gSWRsZSBvbiwgYWN0aXZlIG9mZgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gICAgIGJpdCA2ID0gMQorLy8gICAgIDUtNCA6IGZyZXEKKy8vICAgICAgICAgICAwMCA9PiAxSHoKKy8vICAgICAgICAgICAwMSA9PiAwLjVIegorLy8gICAgICAgICAgIDEwID0+IDAuMjVIegorLy8gICAgICAgICAgIDExID0+IDAuMTI1SHoKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICAgICAzIDogUG93ZXIgc2F2ZSBzdGF0ZQorLy8gICAgICAgICAwID0+IGFsd2F5cyBvZmYgaW4gcG93ZXIgc2F2ZSBzdGF0ZQorLy8gICAgICAgICAxID0+IHdvcmtzIGFzIGNvbm5lY3Qgc3RhdGUKKy8vICAgICAyIDogRGlzYWJsZSBzdGF0ZQorLy8gICAgIDEgOiBSZXNlcnZlZAorLy8gICAgIDAgOiBQb3dlci1vbiBzdGF0ZQordm9pZCB6ZkxlZEN0cmxUeXBlMSh6ZGV2X3QqIGRldikKK3sKKyAgICB1MTZfdCBpOworICAgIHUzMl90IHRvbiwgdG9mZiwgdG1wLCBwZXJpb2Q7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgZm9yIChpPTA7IGk8Wk1fTUFYX0xFRF9OVU1CRVI7IGkrKykKKyAgICB7CisgICAgICAgIGlmICh6ZlN0YUlzQ29ubmVjdGVkKGRldikgIT0gVFJVRSkKKyAgICAgICAgeworICAgICAgICAgICAgLy9TY2FuIHN0YXRlCisgICAgICAgICAgICB0b24gPSAoKHdkLT5sZWRTdHJ1Y3QubGVkTW9kZVtpXSAmIDB4ZjAwKSA+PiA4KSAqIDU7CisgICAgICAgICAgICB0b2ZmID0gKCh3ZC0+bGVkU3RydWN0LmxlZE1vZGVbaV0gJiAweGYwMDApID4+IDEyKSAqIDU7CisKKyAgICAgICAgICAgIGlmICgodG9uICsgdG9mZikgIT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0bXAgPSB3ZC0+bGVkU3RydWN0LmNvdW50ZXIgLyAodG9uK3RvZmYpOworICAgICAgICAgICAgICAgIHRtcCA9IHdkLT5sZWRTdHJ1Y3QuY291bnRlciAtICh0bXAgKiAodG9uK3RvZmYpKTsKKyAgICAgICAgICAgICAgICBpZiAodG1wIDwgdG9uKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgemZIcExlZEN0cmwoZGV2LCBpLCAxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgemZIcExlZEN0cmwoZGV2LCBpLCAwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoKHpmUG93ZXJTYXZpbmdNZ3JJc1NsZWVwaW5nKGRldikpICYmICgod2QtPmxlZFN0cnVjdC5sZWRNb2RlW2ldICYgMHg4KSA9PSAwKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6ZkhwTGVkQ3RybChkZXYsIGksIDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vQ29ubmVjdCBzdGF0ZQorICAgICAgICAgICAgICAgIGlmICgod2QtPmxlZFN0cnVjdC5sZWRNb2RlW2ldICYgMHg0MCkgPT0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICgod2QtPmxlZFN0cnVjdC5jb3VudGVyICYgMSkgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgemZIcExlZEN0cmwoZGV2LCBpLCAod2QtPmxlZFN0cnVjdC5sZWRNb2RlW2ldICYgMHgxMCkgPj4gNCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHdkLT5sZWRTdHJ1Y3QudHhUcmFmZmljID4gMCkgfHwgKHdkLT5sZWRTdHJ1Y3QucnhUcmFmZmljID4gMCkpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2QtPmxlZFN0cnVjdC50eFRyYWZmaWMgPSB3ZC0+bGVkU3RydWN0LnJ4VHJhZmZpYyA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh3ZC0+bGVkU3RydWN0LmxlZE1vZGVbaV0gJiAweDIwKSAhPSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemZIcExlZEN0cmwoZGV2LCBpLCAoKHdkLT5sZWRTdHJ1Y3QubGVkTW9kZVtpXSAmIDB4MTApID4+IDQpXjEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0vLyBpZiAoKHdkLT5sZWRTdHJ1Y3QubGVkTW9kZVtpXSAmIDB4NDApID09IDApCisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcGVyaW9kID0gNSAqICgxIDw8ICgod2QtPmxlZFN0cnVjdC5sZWRNb2RlW2ldICYgMHgzMCkgPj4gNCkpOworICAgICAgICAgICAgICAgICAgICB0bXAgPSB3ZC0+bGVkU3RydWN0LmNvdW50ZXIgLyAocGVyaW9kKjIpOworICAgICAgICAgICAgICAgICAgICB0bXAgPSB3ZC0+bGVkU3RydWN0LmNvdW50ZXIgLSAodG1wICogKHBlcmlvZCoyKSk7CisgICAgICAgICAgICAgICAgICAgIGlmICh0bXAgPCBwZXJpb2QpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgod2QtPmxlZFN0cnVjdC5jb3VudGVyICYgMSkgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ZkhwTGVkQ3RybChkZXYsIGksIDApOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgod2QtPmxlZFN0cnVjdC50eFRyYWZmaWMgPiAwKSB8fCAod2QtPmxlZFN0cnVjdC5yeFRyYWZmaWMgPiAwKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5sZWRTdHJ1Y3QudHhUcmFmZmljID0gd2QtPmxlZFN0cnVjdC5yeFRyYWZmaWMgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ZkhwTGVkQ3RybChkZXYsIGksIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgod2QtPmxlZFN0cnVjdC5jb3VudGVyICYgMSkgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ZkhwTGVkQ3RybChkZXYsIGksIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgod2QtPmxlZFN0cnVjdC50eFRyYWZmaWMgPiAwKSB8fCAod2QtPmxlZFN0cnVjdC5yeFRyYWZmaWMgPiAwKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5sZWRTdHJ1Y3QudHhUcmFmZmljID0gd2QtPmxlZFN0cnVjdC5yeFRyYWZmaWMgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ZkhwTGVkQ3RybChkZXYsIGksIDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gLy9lbHNlLCBpZiAoKHdkLT5sZWRTdHJ1Y3QubGVkTW9kZVtpXSAmIDB4NDApID09IDApCisgICAgICAgICAgICB9IC8vZWxzZSwgaWYgKHpmUG93ZXJTYXZpbmdNZ3JJc1NsZWVwaW5nKGRldikpCisgICAgICAgIH0gLy9lbHNlIDogaWYgKHpmU3RhSXNDb25uZWN0ZWQoZGV2KSAhPSBUUlVFKQorICAgIH0gLy9mb3IgKGk9MDsgaTxaTV9NQVhfTEVEX05VTUJFUjsgaSsrKQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZMZWRDdHJsVHlwZTIgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIEN1c3RvbWl6ZSBmb3IgTmV0Z2VhciBEdWFsLUxFRCBzdGF0ZSAoKGJ1ZyMzMTI5MikpICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgMS4gU3RhdHVzOiAgV2hlbiBkb25nbGUgZG9lcyBub3QgY29ubmVjdCB0byAyLjRHIG9yIDVHIGJ1dCBpbiBzaXRlICAgICovCisvKiAgICAgICAgICAgICAgICAgIHN1cnZleS9hc3NvY2lhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICBMRUQgc3RhdHVzOiBTbG93IGJsaW5raW5nLCBBbWJlciB0aGVuIEJsdWUgcGVyIDUwMG1zICAgICAgICAgICAgICAgKi8KKy8qICAgICAgMi4gU3RhdHVzOglDb25uZWN0aW9uIGF0IDIuNEcgaW4gc2l0ZSBzdXJ2ZXkvYXNzb2NpYXRpb24gICAgICAgICAgICAgKi8KKy8qICAgICAgICAgTEVEIHN0YXR1czogU2xvdyBibGlua2luZywgQW1iZXIvb2ZmIHBlciA1MDBtcyAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIDMuIFN0YXR1czoJQ29ubmVjdGlvbiBhdCA1RyBpbiBzaXRlIHN1cnZleS9hc3NvY2lhdGlvbiAgICAgICAgICAgICAgICovCisvKiAgICAgICAgIExFRCBzdGF0dXM6IFNsb3cgYmxpbmtpbmcsIEJsdWUvb2ZmIHBlciA1MDBtcyAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICA0LiBTdGF0dXM6CVdoZW4gdHJhbnNmZXIgdGhlIHBhY2tldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICBMRUQgc3RhdHVzOiBCbGluayBwZXIgcGFja2V0LCBpbmNsdWRpbmcgVFggYW5kIFJYICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgNS4gU3RhdHVzOglXaGVuIGxpbmtpbmcgaXMgZXN0YWJsaXNoZWQgYnV0IG5vIHRyYWZmaWMgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgTEVEIHN0YXR1czogQWx3YXlzIG9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIDYuIFN0YXR1czoJV2hlbiBsaW5raW5nIGlzIGRyb3BwZWQgYnV0IG5vIHJlLWNvbm5lY3Rpb24gICAgICAgICAgICAgICovCisvKiAgICAgICAgIExFRCBzdGF0dXM6IEFsd2F5cyBvZmYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICA3LiBTdGF0dXM6CUZyb20gb25lIGNvbm5lY3Rpb24oMi40RyBvciA1RykgdG8gY2hhbmdlIHRvIGFub3RoZXIgYmFuZCAqLworLyogICAgICAgICBMRUQgc3RhdHVzOiBBbWJlci9CbHVlID0+U2xvdyBibGlua2luZywgQW1iZXIgdGhlbiBCbHVlIHBlciA1MDBtcyAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBOb25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBTaGFuZy1DaHVuIExpdSAgICAgICAgQXRoZXJvcyBDb21tdW5pY2F0aW9ucywgSU5DLiAgICAyMDA3LjExICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB6ZkxlZEN0cmxUeXBlMl9zY2FuKHpkZXZfdCogZGV2KTsKKwordm9pZCB6ZkxlZEN0cmxUeXBlMih6ZGV2X3QqIGRldikKK3sKKyAgICB1MzJfdCB0b24sIHRvZmYsIHRtcCwgcGVyaW9kOworICAgIHUxNl90IE9wZXJhdGVMRUQ7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgaWYgKHpmU3RhSXNDb25uZWN0ZWQoZGV2KSAhPSBUUlVFKQorICAgIHsKKyAgICAgICAgLy8gRGlzY29ubmVjdCBzdGF0ZQorICAgICAgICBpZih3ZC0+bGVkU3RydWN0LmNvdW50ZXIgJSA0ICE9IDApCisgICAgCXsKKyAgICAgIAkgICAgLy8gVXBkYXRlIExFRCBlYWNoIDQwMG1zKDQqMTAwKQorICAgICAgCSAgICAvLyBQcmV2ZW50IHRoaXMgc2l0dWF0aW9uCisgICAgICAgICAgICAvLyAgICAgICAgICAgICAgX19fX19fXyAgICAgICAgIF9fXworICAgICAgICAgICAgLy8gTEVEWzBdIE9OICAgfCAgICAgICB8ICAgICAgIHwgeCB8CisgICAgICAgICAgICAvLyAtLS0tLS0gT0ZGLT4rLSstKy0rLSstKy0rLSstKy0rLSstKy0+Pj4uLi4KKyAgICAgICAgICAgIC8vIExFRFsxXSBPTgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgoKHdkLT5zdGF0ZSA9PSBaTV9XTEFOX1NUQVRFX0RJU0FCTEVEKSAmJiAod2QtPnN0YS5iQ2hhbm5lbFNjYW4pKQorICAgICAgICAgICAgfHwgKCh3ZC0+c3RhdGUgIT0gWk1fV0xBTl9TVEFURV9ESVNBQkxFRCkgJiYgKHdkLT5zdGEuYkF1dG9SZWNvbm5lY3QpKSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gU2Nhbi9BdXRvUmVjb25uZWN0IHN0YXRlCisgICAgICAgICAgICB6ZkxlZEN0cmxUeXBlMl9zY2FuKGRldik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvLyBOZWl0aGVyIENvbm5lY3RlZCBub3IgU2NhbgorICAgICAgICAgICAgemZIcExlZEN0cmwoZGV2LCAwLCAwKTsKKyAgICAgICAgICAgIHpmSHBMZWRDdHJsKGRldiwgMSwgMCk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYoIHdkLT5zdGEuYkNoYW5uZWxTY2FuICkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gU2NhbiBzdGF0ZQorICAgICAgICAgICAgaWYod2QtPmxlZFN0cnVjdC5jb3VudGVyICUgNCAhPSAwKQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIHpmTGVkQ3RybFR5cGUyX3NjYW4oZGV2KTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmKHdkLT5mcmVxdWVuY3kgPCAzMDAwKQorICAgICAgICB7CisgICAgICAgICAgICBPcGVyYXRlTEVEID0gMDsgICAgIC8vIExFRFswXTogd29yayBvbiAyLjRHIChiL2cgYmFuZCkKKyAgICAgICAgICAgIHpmSHBMZWRDdHJsKGRldiwgMSwgMCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBPcGVyYXRlTEVEID0gMTsgICAgIC8vIExFRFsxXTogd29yayBvbiA1RyAoYSBiYW5kKQorICAgICAgICAgICAgemZIcExlZEN0cmwoZGV2LCAwLCAwKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgoemZQb3dlclNhdmluZ01ncklzU2xlZXBpbmcoZGV2KSkgJiYgKCh3ZC0+bGVkU3RydWN0LmxlZE1vZGVbT3BlcmF0ZUxFRF0gJiAweDgpID09IDApKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBJZiBTbGVlcGluZywgdHVybiBPRkYKKyAgICAgICAgICAgIHpmSHBMZWRDdHJsKGRldiwgT3BlcmF0ZUxFRCwgMCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvL0Nvbm5lY3Qgc3RhdGUKKyAgICAgICAgICAgIGlmICgod2QtPmxlZFN0cnVjdC5jb3VudGVyICYgMSkgPT0gMCkgICAvLyBldmVuCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gTm8gdHJhZmZpYywgYWx3YXlzIE9OCisgICAgICAgICAgICAgICAgemZIcExlZEN0cmwoZGV2LCBPcGVyYXRlTEVELCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgICAgICAgLy8gb2RkCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCh3ZC0+bGVkU3RydWN0LnR4VHJhZmZpYyA+IDApIHx8ICh3ZC0+bGVkU3RydWN0LnJ4VHJhZmZpYyA+IDApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gSWYgaGF2ZSB0cmFmZmljLCB0dXJuIE9GRgorCQkgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICBfX19fXyAgIF8gICBfICAgXyAgIF9fX19fCisJCSAgICAgICAgICAgIC8vIExFRFtPcGVyYXRlXSBPTiAgICAgICAgfCB8IHwgfCB8IHwgfCB8CisJCSAgICAgICAgICAgIC8vIC0tLS0tLS0tLS0tLSBPRkYtPi0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLT4+Pi4uLgorCQkgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgICAgICB3ZC0+bGVkU3RydWN0LnR4VHJhZmZpYyA9IHdkLT5sZWRTdHJ1Y3QucnhUcmFmZmljID0gMDsKKyAgICAgICAgICAgICAgICAgICAgemZIcExlZEN0cmwoZGV2LCBPcGVyYXRlTEVELCAwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgemZMZWRDdHJsVHlwZTJfc2Nhbih6ZGV2X3QqIGRldikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICAvLyBXaGVuIGRvaW5nIHNjYW4sIGJsaW5rKEFtYmVyL0JsdWUpIGFuZCBvZmYgcGVyIDUwMG1zIChhYm91dCA0MDBtcyBpbiBvdXIgZHJpdmVyKQorICAgIC8vICAgICAgICAgICAgICAgX19fX19fXyAgICAgICAgICAgICAgICAgICAgICAgICBfX19fX19fCisgICAgLy8gTEVEWzBdIE9OICAgIHwgICAgICAgfCAgICAgICA4ICAgICAgIDEyICAgICAgfCAgICAgICB8CisgICAgLy8gLS0tLS0tIE9GRi0+LSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLT4+Pi4uLgorICAgIC8vIExFRFsxXSBPTiAgICAwICAgICAgIDQgICAgICAgfF9fX19fX198ICAgICAgIDAgICAgICAgMworICAgIC8vCisKKyAgICBzd2l0Y2god2QtPmxlZFN0cnVjdC5jb3VudGVyICUgMTYpCisgICAgeworICAgICAgICBjYXNlIDA6ICAgLy8gY2FzZSAwfjMsIExFRFswXSBvbgorICAgICAgICAgICAgaWYod2QtPnN1cHBvcnRNb2RlICYgWk1fV0lSRUxFU1NfTU9ERV8yNCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6ZkhwTGVkQ3RybChkZXYsIDAsIDEpOworICAgICAgICAgICAgICAgIHpmSHBMZWRDdHJsKGRldiwgMSwgMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgemZIcExlZEN0cmwoZGV2LCAxLCAxKTsKKyAgICAgICAgICAgICAgICB6ZkhwTGVkQ3RybChkZXYsIDAsIDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSA4OiAgIC8vIGNhc2UgOH4xMSwgTEVEWzFdIG9uCisgICAgICAgICAgICBpZih3ZC0+c3VwcG9ydE1vZGUgJiBaTV9XSVJFTEVTU19NT0RFXzUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgemZIcExlZEN0cmwoZGV2LCAxLCAxKTsKKyAgICAgICAgICAgICAgICB6ZkhwTGVkQ3RybChkZXYsIDAsIDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHpmSHBMZWRDdHJsKGRldiwgMCwgMSk7CisgICAgICAgICAgICAgICAgemZIcExlZEN0cmwoZGV2LCAxLCAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6ICAvLyBvdGhlcnMsIGFsbCBvZmYKKyAgICAgICAgICAgIHpmSHBMZWRDdHJsKGRldiwgMCwgMCk7CisgICAgICAgICAgICB6ZkhwTGVkQ3RybChkZXYsIDEsIDApOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZkxlZEN0cmxUeXBlMyAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIEN1c3RvbWl6ZSBmb3IgTmV0Z2VhciBTaW5nbGUtTEVEIHN0YXRlICgoYnVnIzMyMjQzKSkgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIKFFT2ZmOiB3aGVuIHRoZSBhZGFwdGVyIGlzIGRpc2FibGVkIG9yIGhhc24ndCBzdGFydGVkIHRvIGFzc29jaWF0ZSB3aXRoIEFQICAgICovCisvKiAgICAgICAgIHlldC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgoUVPbjogT25jZSBhZHBhdGVyIGFzc29jaWF0ZSB3aXRoIEFQIHN1Y2Nlc3NmdWxseSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICChRVNsb3cgYmxpbmtpbmc6IHdoZW5ldmVyIGFkYXB0ZXJzIGRvIHNpdGUtc3VydmV5IG9yIHRyeSB0byBhc3NvY2lhdGUgd2l0aCBBUCAqLworLyogICAgLSBJZiB0aGVyZSBpcyBhIGNvbm5lY3Rpb24gYWxyZWFkeSwgYW5kIGFkYXB0ZXJzIGRvIHNpdGUtc3VydmV5IG9yICAgICAgICAgICovCisvKiAgICAgIHJlLWFzc29jaWF0ZSBhY3Rpb24sIHRoZSBMRUQgc2hvdWxkIGtlZXAgTEVEIGJhY2tncmFvdWQgYXMgT04sIHRodXMgICAgICAgKi8KKy8qICAgICAgdGhlIGJsaW5raW5nIGJlaGF2aW9yIFNIT1VMRCBiZSBPRkYgKDIwMG1zKSAtIE9OICg4MDBtcykgYW5kIGNvbnRpbnVlIHRoaXMqLworLyogICAgICBjeWNsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAtIElmIHRoZXJlIGlzIG5vIGNvbm5lY3Rpb24geWV0LCBhbmQgYWRhcHRlcnMgc3RhcnQgdG8gZG8gc2l0ZS1zdXJ2ZXkgb3IgICAgKi8KKy8qICAgICAgYXNzb2NpYXRlIGFjdGlvbiwgdGhlIExFRCBzaG91bGQga2VlcCBMRUQgYmFja2dyb3VuZCBhcyBPRkYsIHRodXMgdGhlICAgICAqLworLyogICAgICBibGlua2luZyBiZWhhdmlvciBTSE9VTEQgYmUgT04gKDIwMG1zKSAtIE9GRiAoODAwbXMpIGFuZCBjb250aW51ZSB0aGlzICAgICovCisvKiAgICAgIGN5Y2xlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIC0gRm9yIHRoZSBjYXNlIHRoYXQgYXNzb2NpYXRlIGZhaWwsIGFkcGF0ZXIgc2hvdWxkIGtlZXAgYXNzb2NpYXRpbmcsIGFuZCB0aGUqLworLyogICAgICBMRUQgc2hvdWxkIGFsc28ga2VlcCBzbG93IGJsaW5raW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgoUVRdWljayBibGlua2luZzogdG8gYmxpbmsgT0ZGLU9OIGN5Y2xlIGZvciBlYWNoIHRpbWUgdGhhdCB0cmFmZmljIHBhY2tldCBpcyAgKi8KKy8qICAgIHJlY2VpdmVkIG9yIGlzIHRyYW5zbWl0dGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU2hhbmctQ2h1biBMaXUgICAgICAgIEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMsIElOQy4gICAgMjAwOC4wMSAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgemZMZWRDdHJsVHlwZTNfc2Nhbih6ZGV2X3QqIGRldiwgdTE2X3QgaXNDb25uZWN0KTsKKwordm9pZCB6ZkxlZEN0cmxUeXBlMyh6ZGV2X3QqIGRldikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBpZiAoemZTdGFJc0Nvbm5lY3RlZChkZXYpICE9IFRSVUUpCisgICAgeworICAgICAgICAvLyBEaXNjb25uZWN0IHN0YXRlCisgICAgICAgIGlmKHdkLT5sZWRTdHJ1Y3QuY291bnRlciAlIDIgIT0gMCkKKyAgICAJeworICAgICAgCSAgICAvLyBVcGRhdGUgTEVEIGVhY2ggMjAwbXMoMioxMDApCisgICAgICAJICAgIC8vIFByZXZlbnQgdGhpcyBzaXR1YXRpb24KKyAgICAgICAgICAgIC8vICAgICAgICAgICAgICBfX18gICAgIF8KKyAgICAgICAgICAgIC8vIExFRFswXSBPTiAgIHwgICB8ICAgfHh8CisgICAgICAgICAgICAvLyAtLS0tLS0gT0ZGLT4rLSstKy0rLSstKy0rLT4+Pi4uLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgoKHdkLT5zdGF0ZSA9PSBaTV9XTEFOX1NUQVRFX0RJU0FCTEVEKSAmJiAod2QtPnN0YS5iQ2hhbm5lbFNjYW4pKQorICAgICAgICAgICAgfHwgKCh3ZC0+c3RhdGUgIT0gWk1fV0xBTl9TVEFURV9ESVNBQkxFRCkgJiYgKHdkLT5zdGEuYkF1dG9SZWNvbm5lY3QpKSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gU2Nhbi9BdXRvUmVjb25uZWN0IHN0YXRlCisgICAgICAgICAgICB6ZkxlZEN0cmxUeXBlM19zY2FuKGRldiwgMCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvLyBOZWl0aGVyIENvbm5lY3RlZCBub3IgU2NhbgorICAgICAgICAgICAgemZIcExlZEN0cmwoZGV2LCAwLCAwKTsKKyAgICAgICAgICAgIHpmSHBMZWRDdHJsKGRldiwgMSwgMCk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYoIHdkLT5zdGEuYkNoYW5uZWxTY2FuICkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gU2NhbiBzdGF0ZQorICAgICAgICAgICAgaWYod2QtPmxlZFN0cnVjdC5jb3VudGVyICUgMiAhPSAwKQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIHpmTGVkQ3RybFR5cGUzX3NjYW4oZGV2LCAxKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgoemZQb3dlclNhdmluZ01ncklzU2xlZXBpbmcoZGV2KSkgJiYgKCh3ZC0+bGVkU3RydWN0LmxlZE1vZGVbMF0gJiAweDgpID09IDApKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBJZiBTbGVlcGluZywgdHVybiBPRkYKKyAgICAgICAgICAgIHpmSHBMZWRDdHJsKGRldiwgMCwgMCk7CisgICAgICAgICAgICB6ZkhwTGVkQ3RybChkZXYsIDEsIDApOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLy9Db25uZWN0IHN0YXRlCisgICAgICAgICAgICBpZiAoKHdkLT5sZWRTdHJ1Y3QuY291bnRlciAmIDEpID09IDApICAgLy8gZXZlbgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIE5vIHRyYWZmaWMsIGFsd2F5cyBPTgorICAgICAgICAgICAgICAgIHpmSHBMZWRDdHJsKGRldiwgMCwgMSk7CisgICAgICAgICAgICAgICAgemZIcExlZEN0cmwoZGV2LCAxLCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgICAgICAgLy8gb2RkCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCh3ZC0+bGVkU3RydWN0LnR4VHJhZmZpYyA+IDApIHx8ICh3ZC0+bGVkU3RydWN0LnJ4VHJhZmZpYyA+IDApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gSWYgaGF2ZSB0cmFmZmljLCB0dXJuIE9GRgorCQkgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICBfX19fXyAgIF8gICBfICAgXyAgIF9fX19fCisJCSAgICAgICAgICAgIC8vIExFRFtPcGVyYXRlXSBPTiAgICAgICAgfCB8IHwgfCB8IHwgfCB8CisJCSAgICAgICAgICAgIC8vIC0tLS0tLS0tLS0tLSBPRkYtPi0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLT4+Pi4uLgorCQkgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgICAgICB3ZC0+bGVkU3RydWN0LnR4VHJhZmZpYyA9IHdkLT5sZWRTdHJ1Y3QucnhUcmFmZmljID0gMDsKKyAgICAgICAgICAgICAgICAgICAgemZIcExlZEN0cmwoZGV2LCAwLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgemZIcExlZEN0cmwoZGV2LCAxLCAwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgemZMZWRDdHJsVHlwZTNfc2Nhbih6ZGV2X3QqIGRldiwgdTE2X3QgaXNDb25uZWN0KQoreworICAgIHUzMl90IHRvbiwgdG9mZiwgdG1wOworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIC8vIERvaW5nIHNjYW4gd2hlbiA6CisgICAgLy8gMS4gRGlzY29ubmVjdGVkOiBPTiAoMjAwbXMpIC0gT0ZGICg4MDBtcykgKDIwMG1zLTYwMG1zIGluIG91ciBkcml2ZXIpCisgICAgLy8gICAgICAgICAgICAgICBfX18gICAgICAgICAgICAgX19fICAgICAgICAgICAgIF9fXworICAgIC8vIExFRFswXSBPTiAgICB8ICAgfCAgICAgICAgICAgfCAgIHwgICAgICAgICAgIHwgICB8CisgICAgLy8gLS0tLS0tIE9GRi0+LSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0+Pj4uLi4KKyAgICAvLyAgICAgICAgICAgICAgMCAgIDIgICA0ICAgNiAgIDggIDEwICAxMiAgMTQgIDE2CisgICAgLy8gMi4gQ29ubmVjdGVkOiAgIE9OICg4MDBtcykgLSBPRkYgKDIwMG1zKSAoNjAwbXMtMjAwbXMgaW4gb3VyIGRyaXZlcikKKyAgICAvLyAgICAgICAgICAgICAgIF9fX19fX19fX19fICAgICBfX19fX19fX19fXyAgICAgX19fX19fCisgICAgLy8gTEVEWzBdIE9OICAgIHwgICAgICAgICAgIHwgICB8ICAgICAgICAgICB8ICAgfAorICAgIC8vIC0tLS0tLSBPRkYtPi0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstPj4+Li4uCisgICAgLy8gICAgICAgICAgICAgIDAgICAyICAgNCAgIDYgICA4ICAxMCAgMTIgIDE0ICAxNgorCisgICAgLy9TY2FuIHN0YXRlCisgICAgaWYoIWlzQ29ubmVjdCkKKyAgICAgICAgdG9uID0gMiwgdG9mZiA9IDY7CisgICAgZWxzZQorICAgICAgICB0b24gPSA2LCB0b2ZmID0gMjsKKworICAgIGlmICgodG9uICsgdG9mZikgIT0gMCkKKyAgICB7CisgICAgICAgIHRtcCA9IHdkLT5sZWRTdHJ1Y3QuY291bnRlciAlICh0b24rdG9mZik7CisgICAgICAgaWYgKHRtcCA8IHRvbikKKyAgICAgICAgeworICAgICAgICAgICAgemZIcExlZEN0cmwoZGV2LCAwLCAxKTsKKyAgICAgICAgICAgIHpmSHBMZWRDdHJsKGRldiwgMSwgMSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB6ZkhwTGVkQ3RybChkZXYsIDAsIDApOworICAgICAgICAgICAgemZIcExlZEN0cmwoZGV2LCAxLCAwKTsKKyAgICAgICAgfQorICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmTGVkQ3RybF9CbGlua1doZW5TY2FuX0FscGhhICAgICAqLworLyogICAgICBDdXN0b21pemUgZm9yIEFscGhhL0RMaW5rIExFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgLSBCbGluayBMRUQgMTIgdGltZXMgd2l0aGluIDMgc2Vjb25kcyB3aGVuIGRvaW5nIEFjdGl2ZSBTY2FuICAgICAgICAgICovCisvKgkgICAgICAgICAgICAgICAgICAgICAgX19fICAgX19fICAgX19fICAgX19fICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKgkgICAgICBMRURbMF0gT04gICAgICB8ICAgfCB8ICAgfCB8ICAgfCB8ICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKgkgICAgICAtLS0tLS0tT0ZGLT4tKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0tKy0tPj4+Li4uICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU2hhbmctQ2h1biBMaXUgICAgICAgIEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMsIElOQy4gICAgMjAwNy4xMSAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgemZMZWRDdHJsX0JsaW5rV2hlblNjYW5fQWxwaGEoemRldl90KiBkZXYpCit7CisgICAgc3RhdGljIHUzMl90IGNvdW50ZXIgPSAwOworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIGlmKGNvdW50ZXIgPiAzNCkgICAgICAgIC8vIGNvdW50ZXIgZm9yIDMgc2VjCisgICAgeworICAgICAgICB3ZC0+bGVkU3RydWN0LkxFREN0cmxGbGFnICY9IH4odThfdClaTV9MRURfQ1RSTF9GTEFHX0FMUEhBOworICAgICAgICBjb3VudGVyID0gMDsKKyAgICB9CisKKyAgICBpZiggKGNvdW50ZXIgJSAzKSA8IDIpCisgICAgICAgIHpmSHBMZWRDdHJsKGRldiwgMCwgMSk7CisgICAgZWxzZQorICAgICAgICB6ZkhwTGVkQ3RybChkZXYsIDAsIDApOworCisgICAgY291bnRlcisrOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZkxlZDEwMG1zQ3RybCAgICAgICAgICAgICAgKi8KKy8qICAgICAgTEVEIDEwMCBtaWxsaXNlY29uZHMgdGltZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiBDaGVuICAgICAgICBBdGhlcm9zIENvbW11bmljYXRpb25zLCBJTkMuICAgIDIwMDcuNiAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgemZMZWQxMDBtc0N0cmwoemRldl90KiBkZXYpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgd2QtPmxlZFN0cnVjdC5jb3VudGVyKys7CisKKyAgICBpZih3ZC0+bGVkU3RydWN0LkxFREN0cmxGbGFnKQorICAgIHsKKyAgICAgICAgc3dpdGNoKHdkLT5sZWRTdHJ1Y3QuTEVEQ3RybEZsYWcpIHsKKyAgICAgICAgY2FzZSBaTV9MRURfQ1RSTF9GTEFHX0FMUEhBOgorICAgICAgICAgICAgemZMZWRDdHJsX0JsaW5rV2hlblNjYW5fQWxwaGEoZGV2KTsKKyAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgc3dpdGNoKHdkLT5sZWRTdHJ1Y3QuTEVEQ3RybFR5cGUpIHsKKyAgICAgICAgY2FzZSAxOgkJCS8vIFRyYWRpdGlvbmFsIDEgTEVECisgICAgICAgICAgICB6ZkxlZEN0cmxUeXBlMShkZXYpOworICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDI6CQkJLy8gRHVhbC1MRURzIGZvciBOZXRnZWFyCisgICAgICAgICAgICB6ZkxlZEN0cmxUeXBlMihkZXYpOworICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDM6CQkJLy8gU2luZ2xlLUxFRCBmb3IgTmV0Z2VhciAoV04xMTF2MikKKyAgICAgICAgICAgIHpmTGVkQ3RybFR5cGUzKGRldik7CisgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB6ZkxlZEN0cmxUeXBlMShkZXYpOworICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL3BlcmZvcm1hbmNlLmMgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvcGVyZm9ybWFuY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWI0MmQ1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL3BlcmZvcm1hbmNlLmMKQEAgLTAsMCArMSw0MzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBBdGhlcm9zIENvbW11bmljYXRpb25zIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2R1bGUgTmFtZSA6IHBlcmZvcm1hbmNlLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEFic3RyYWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgVGhpcyBtb2R1bGUgcGVyZm9ybWFuY2UgZXZhbHVhdGlvbiBmdW5jdGlvbnMuICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE5PVEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlICJjcHJlY29tcC5oIgorI2lmZGVmIFpNX0VOQUJMRV9QRVJGT1JNQU5DRV9FVkFMVUFUSU9OCisKKyNkZWZpbmUgWk1fVFBfU0laRSA1MAorc3RydWN0IHpzU3VtbWFyeSB6bV9zdW1tYXJ5Oworc3RydWN0IHpzVmFyaWF0aW9uIHptX3ZhcjsKK3N0cnVjdCB6c1Rocm91Z2hwdXQgem1fdHA7CisKK3ZvaWQgemZpUGVyZm9ybWFuY2VJbml0KHpkZXZfdCogZGV2KQoreworICAgIHUxNl90ICAgaTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptX3N1bW1hcnkudGlja19iYXNlID0gd2QtPnRpY2s7CisgICAgem1fc3VtbWFyeS50eF9tc2R1X2NvdW50ID0gMDsKKyAgICB6bV9zdW1tYXJ5LnR4X21wZHVfY291bnQgPSAwOworICAgIHptX3N1bW1hcnkucnhfbXNkdV9jb3VudCA9IDA7CisgICAgem1fc3VtbWFyeS5yeF9tcGR1X2NvdW50ID0gMDsKKyAgICB6bV9zdW1tYXJ5LnJ4X2Jyb2tlbl9zZXEgPSAwOworICAgIHptX3N1bW1hcnkucnhfYnJva2VuX3N1bSA9IDA7CisgICAgem1fc3VtbWFyeS5yeF9zZXFfYmFzZSA9IDA7CisgICAgem1fc3VtbWFyeS5yeF9icm9rZW5fc2VxX2RpcyA9IDA7CisgICAgem1fc3VtbWFyeS5yeF9kdXBsaWNhdGVfc2VxID0gMDsKKyAgICB6bV9zdW1tYXJ5LnJ4X29sZF9zZXEgPSAwOworICAgIHptX3N1bW1hcnkucmVzZXRfY291bnQgPSAwOworICAgIHptX3N1bW1hcnkucmVzZXRfc3VtID0gMDsKKyAgICB6bV9zdW1tYXJ5LnJ4X2xvc3Rfc3VtID0gMDsKKyAgICB6bV9zdW1tYXJ5LnJ4X2R1cGxpY2F0ZV9lcnJvciA9IDA7CisgICAgem1fc3VtbWFyeS5yeF9mcmVlID0gMDsKKyAgICB6bV9zdW1tYXJ5LnJ4X2Ftc2R1X2xlbiA9IDA7CisgICAgem1fc3VtbWFyeS5yeF9mbHVzaCA9IDA7CisgICAgem1fc3VtbWFyeS5yeF9jbGVhciA9IDA7CisgICAgem1fc3VtbWFyeS5yeF9yZW9yZGVyID0gMDsKKworICAgIGZvciAoaT0wOyBpPDEwMDsgaSsrKQorICAgIHsKKyAgICAgICAgem1fdmFyLnR4X21zZHVfdGlja1tpXSA9IHptX3Zhci50eF9tcGR1X3RpY2tbaV0gPSAwOworICAgICAgICB6bV92YXIucnhfbXNkdV90aWNrW2ldID0gem1fdmFyLnJ4X21wZHVfdGlja1tpXSA9IDA7CisgICAgfQorCisgICAgemZUaW1lclNjaGVkdWxlKGRldiwgWk1fRVZFTlRfVElNRU9VVF9QRVJGT1JNQU5DRSwgMTAwKTsKKworICAgIHptX3RwLnNpemUgPSBaTV9UUF9TSVpFOworICAgIHptX3RwLmhlYWQgPSB6bV90cC5zaXplIC0gMTsKKyAgICB6bV90cC50YWlsID0gMDsKKyAgICBmb3IgKGk9MDsgaTx6bV90cC5zaXplOyBpKyspCisgICAgeworICAgICAgICB6bV90cC50eFtpXT0wOworICAgICAgICB6bV90cC5yeFtpXT0wOworICAgIH0KK30KKwordm9pZCB6ZmlQZXJmb3JtYW5jZUdyYXBoKHpkZXZfdCogZGV2KQoreworICAgIHMxNl90ICAgaSxqOworICAgIHU4X3QgICAgc1taTV9UUF9TSVpFKzVdOworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIGZvciAoaT0wOyBpPCh6bV90cC5zaXplLTEpOyBpKyspCisgICAgeworICAgICAgICB6bV90cC50eFtpXSA9IHptX3RwLnR4W2krMV07CisgICAgICAgIHptX3RwLnJ4W2ldID0gem1fdHAucnhbaSsxXTsKKyAgICB9CisgICAgem1fdHAudHhbem1fdHAuc2l6ZS0xXSA9IHptX3N1bW1hcnkudHhfbXBkdV9jb3VudCoxNTAwKjgvMTAwMDAwMDsKKyAgICB6bV90cC5yeFt6bV90cC5zaXplLTFdID0gem1fc3VtbWFyeS5yeF9tc2R1X2NvdW50KjE1MDAqOC8xMDAwMDAwOworCisgICAgZm9yIChpPTE1OyBpPjA7IGktLSkKKyAgICB7CisgICAgICAgIHNbMF0gPSAoaS8xMCkgKyAnMCc7CisgICAgICAgIHNbMV0gPSAoaSUxMCkgKyAnMCc7CisgICAgICAgIHNbMl0gPSAnMCc7CisgICAgICAgIHNbM10gPSAnfCc7CisgICAgICAgIGZvciAoaj0wOyBqPHptX3RwLnNpemU7IGorKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCh6bV90cC50eFtqXS8xMCA9PSBpKSAmJiAoem1fdHAucnhbal0vMTAgPT0gaSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc1s0K2pdID0gJ1gnOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoem1fdHAudHhbal0vMTAgPT0gaSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzWzQral0gPSAnVCc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICh6bV90cC5yeFtqXS8xMCA9PSBpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNbNCtqXSA9ICdSJzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzWzQral0gPSAnICc7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc1t6bV90cC5zaXplKzRdID0gJ1wwJzsKKyAgICAgICAgRGJnUHJpbnQoIiVzIixzKTsKKyAgICB9CisgICAgRGJnUHJpbnQoIjAwMHxfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyIpOworCit9CisKKwordm9pZCB6ZmlQZXJmb3JtYW5jZVJlZnJlc2goemRldl90KiBkZXYpCit7CisgICAgdTE2X3QgICBpOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgemZpRGJnUmVhZFJlZyhkZXYsIDB4MTE3NzJjKTsKKworICAgIHptX3Zhci50eF9tc2R1X21lYW4gPSB6bV9zdW1tYXJ5LnR4X21zZHVfY291bnQgLyAxMDA7CisgICAgem1fdmFyLnR4X21wZHVfbWVhbiA9IHptX3N1bW1hcnkudHhfbXBkdV9jb3VudCAvIDEwMDsKKyAgICB6bV92YXIucnhfbXNkdV9tZWFuID0gem1fc3VtbWFyeS5yeF9tc2R1X2NvdW50IC8gMTAwOworICAgIHptX3Zhci5yeF9tcGR1X21lYW4gPSB6bV9zdW1tYXJ5LnJ4X21wZHVfY291bnQgLyAxMDA7CisKKyAgICB6bV92YXIudHhfbXNkdV9zdW0gPSB6bV92YXIudHhfbXBkdV9zdW0gPSAwOworICAgIHptX3Zhci5yeF9tc2R1X3N1bSA9IHptX3Zhci5yeF9tcGR1X3N1bSA9IDA7CisgICAgem1fc3VtbWFyeS50eF9pZGxlX2NvdW50ID0gem1fc3VtbWFyeS5yeF9pZGxlX2NvdW50ID0gMDsKKyAgICBmb3IgKGk9MDsgaTwxMDA7IGkrKykKKyAgICB7CisgICAgICAgIHptX3Zhci50eF9tc2R1X3N1bSArPSAoem1fdmFyLnR4X21zZHVfdGlja1tpXSAqIHptX3Zhci50eF9tc2R1X3RpY2tbaV0pOworICAgICAgICB6bV92YXIudHhfbXBkdV9zdW0gKz0gKHptX3Zhci50eF9tcGR1X3RpY2tbaV0gKiB6bV92YXIudHhfbXBkdV90aWNrW2ldKTsKKyAgICAgICAgem1fdmFyLnJ4X21zZHVfc3VtICs9ICh6bV92YXIucnhfbXNkdV90aWNrW2ldICogem1fdmFyLnJ4X21zZHVfdGlja1tpXSk7CisgICAgICAgIHptX3Zhci5yeF9tcGR1X3N1bSArPSAoem1fdmFyLnJ4X21wZHVfdGlja1tpXSAqIHptX3Zhci5yeF9tcGR1X3RpY2tbaV0pOworCisgICAgICAgIGlmICghem1fdmFyLnR4X21wZHVfdGlja1tpXSkgem1fc3VtbWFyeS50eF9pZGxlX2NvdW50Kys7CisgICAgICAgIGlmICghem1fdmFyLnJ4X21wZHVfdGlja1tpXSkgem1fc3VtbWFyeS5yeF9pZGxlX2NvdW50Kys7CisgICAgfQorICAgIHptX3Zhci50eF9tc2R1X3ZhciA9ICh6bV92YXIudHhfbXNkdV9zdW0gLyAxMDApIC0gKHptX3Zhci50eF9tc2R1X21lYW4gKiB6bV92YXIudHhfbXNkdV9tZWFuKTsKKyAgICB6bV92YXIudHhfbXBkdV92YXIgPSAoem1fdmFyLnR4X21wZHVfc3VtIC8gMTAwKSAtICh6bV92YXIudHhfbXBkdV9tZWFuICogem1fdmFyLnR4X21wZHVfbWVhbik7CisgICAgem1fdmFyLnJ4X21zZHVfdmFyID0gKHptX3Zhci5yeF9tc2R1X3N1bSAvIDEwMCkgLSAoem1fdmFyLnJ4X21zZHVfbWVhbiAqIHptX3Zhci5yeF9tc2R1X21lYW4pOworICAgIHptX3Zhci5yeF9tcGR1X3ZhciA9ICh6bV92YXIucnhfbXBkdV9zdW0gLyAxMDApIC0gKHptX3Zhci5yeF9tcGR1X21lYW4gKiB6bV92YXIucnhfbXBkdV9tZWFuKTsKKworICAgIHptX3N1bW1hcnkudGlja19iYXNlID0gd2QtPnRpY2s7CisgICAgem1fc3VtbWFyeS5yeF9icm9rZW5fc3VtICs9IHptX3N1bW1hcnkucnhfYnJva2VuX3NlcTsKKyAgICB6bV9zdW1tYXJ5LnJ4X2xvc3Rfc3VtICs9ICh6bV9zdW1tYXJ5LnJ4X2Jyb2tlbl9zZXEgLSB6bV9zdW1tYXJ5LnJ4X2R1cGxpY2F0ZV9zZXEgLSB6bV9zdW1tYXJ5LnJ4X29sZF9zZXEpOworCisgICAgemZpUGVyZm9ybWFuY2VHcmFwaChkZXYpOworCisgICAgRGJnUHJpbnQoIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuIik7CisgICAgRGJnUHJpbnQoIiogVFg6IE1TRFU9JTVkLCBWQVI9JTVkOyBNUERVPSU1ZCwgVkFSPSU1ZFxuIiwgem1fc3VtbWFyeS50eF9tc2R1X2NvdW50LAorICAgICAgICB6bV92YXIudHhfbXNkdV92YXIsIHptX3N1bW1hcnkudHhfbXBkdV9jb3VudCwgem1fdmFyLnR4X21wZHVfdmFyKTsKKyAgICBEYmdQcmludCgiKiBUWDogaWRsZT0lNWQsVHhSYXRlPSUzZCwgIFBFUj0lNWRcbiIsIHptX3N1bW1hcnkudHhfaWRsZV9jb3VudCwKKyAgICAgICAgd2QtPkN1cnJlbnRUeFJhdGVLYnBzLzEwMDAsCisgICAgICAgICh1MTZfdCl3ZC0+UEVSW3dkLT5zdGEub3Bwb3NpdGVJbmZvWzBdLnJjQ2VsbC5jdXJyZW50UmF0ZV0pOworICAgIERiZ1ByaW50KCIqIFJYOiBNU0RVPSU1ZCwgVkFSPSU1ZDsgTVBEVT0lNWQsIFZBUj0lNWRcbiIsIHptX3N1bW1hcnkucnhfbXNkdV9jb3VudCwKKyAgICAgICAgem1fdmFyLnJ4X21zZHVfdmFyLCB6bV9zdW1tYXJ5LnJ4X21wZHVfY291bnQsIHptX3Zhci5yeF9tcGR1X3Zhcik7CisgICAgRGJnUHJpbnQoIiogUlg6IGlkbGU9JTVkLFJ4UmF0ZT0lM2QsQU1TRFU9JTVkXG4iLCB6bV9zdW1tYXJ5LnJ4X2lkbGVfY291bnQsCisgICAgICAgIHdkLT5DdXJyZW50UnhSYXRlS2Jwcy8xMDAwLCB6bV9zdW1tYXJ5LnJ4X2Ftc2R1X2xlbik7CisgICAgRGJnUHJpbnQoIiogUlggYnJva2VuIHNlcT0lNGQsIGRpc3RhbmNlcz0lNGQsIGR1cGxpY2F0ZXM9JTRkXG4iLCB6bV9zdW1tYXJ5LnJ4X2Jyb2tlbl9zZXEsCisgICAgICAgIHptX3N1bW1hcnkucnhfYnJva2VuX3NlcV9kaXMsIHptX3N1bW1hcnkucnhfZHVwbGljYXRlX3NlcSk7CisgICAgRGJnUHJpbnQoIiogUlggICAgb2xkIHNlcT0lNGQsICAgICAgbG9zdD0lNGQsIGJyb2tlbiBzdW09JTRkXG4iLCB6bV9zdW1tYXJ5LnJ4X29sZF9zZXEsCisgICAgICAgICh6bV9zdW1tYXJ5LnJ4X2Jyb2tlbl9zZXEgLSB6bV9zdW1tYXJ5LnJ4X2R1cGxpY2F0ZV9zZXEgLSB6bV9zdW1tYXJ5LnJ4X29sZF9zZXEpLAorICAgICAgICB6bV9zdW1tYXJ5LnJ4X2Jyb2tlbl9zdW0pOworICAgIERiZ1ByaW50KCIqIFJ4ICAgbG9zdCBzdW09JTRkLGR1cC4gZXJyb3I9JTRkLCBmcmVlIGNvdW50PSU0ZFxuIiwgem1fc3VtbWFyeS5yeF9sb3N0X3N1bSwKKyAgICAgICAgem1fc3VtbWFyeS5yeF9kdXBsaWNhdGVfZXJyb3IsIHptX3N1bW1hcnkucnhfZnJlZSk7CisgICAgRGJnUHJpbnQoIiogUnggIGZsdXNoIHN1bT0lNGQsIGNsZWFyIHN1bT0lNGQsIHJlb3JkZXI9JTdkXG4iLCB6bV9zdW1tYXJ5LnJ4X2ZsdXNoLAorICAgICAgICB6bV9zdW1tYXJ5LnJ4X2NsZWFyLCB6bV9zdW1tYXJ5LnJ4X3Jlb3JkZXIpOworICAgIERiZ1ByaW50KCIqIEZpcm13YXJlIHJlc2V0PSUzZCwgcmVzZXQgc3VtPSU0ZFxuIiwgem1fc3VtbWFyeS5yZXNldF9jb3VudCwKKyAgICAgICAgem1fc3VtbWFyeS5yZXNldF9zdW0pOworICAgIERiZ1ByaW50KCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcblxuIik7CisgICAgLy9yZXNldCBjb3VudCAxMTc3MmMKKyAgICB6bV9zdW1tYXJ5LnR4X21zZHVfY291bnQgPSAwOworICAgIHptX3N1bW1hcnkudHhfbXBkdV9jb3VudCA9IDA7CisgICAgem1fc3VtbWFyeS5yeF9tc2R1X2NvdW50ID0gMDsKKyAgICB6bV9zdW1tYXJ5LnJ4X21wZHVfY291bnQgPSAwOworICAgIHptX3N1bW1hcnkucnhfYnJva2VuX3NlcSA9IDA7CisgICAgem1fc3VtbWFyeS5yeF9icm9rZW5fc2VxX2RpcyA9IDA7CisgICAgem1fc3VtbWFyeS5yeF9kdXBsaWNhdGVfc2VxID0gMDsKKyAgICB6bV9zdW1tYXJ5LnJ4X29sZF9zZXEgPSAwOworICAgIHptX3N1bW1hcnkucmVzZXRfY291bnQgPSAwOworICAgIHptX3N1bW1hcnkucnhfYW1zZHVfbGVuID0gMDsKKworICAgIGZvciAoaT0wOyBpPDEwMDsgaSsrKQorICAgIHsKKyAgICAgICAgem1fdmFyLnR4X21zZHVfdGlja1tpXSA9IHptX3Zhci50eF9tcGR1X3RpY2tbaV0gPSAwOworICAgICAgICB6bV92YXIucnhfbXNkdV90aWNrW2ldID0gem1fdmFyLnJ4X21wZHVfdGlja1tpXSA9IDA7CisgICAgfQorCisgICAgemZUaW1lclNjaGVkdWxlKGRldiwgWk1fRVZFTlRfVElNRU9VVF9QRVJGT1JNQU5DRSwgMTAwKTsKK30KKwordm9pZCB6ZmlUeFBlcmZvcm1hbmNlTVNEVSh6ZGV2X3QqIGRldiwgdTMyX3QgdGljaykKK3sKKyAgICB1MzJfdCAgIGluZGV4OworICAgIHptX3N1bW1hcnkudHhfbXNkdV9jb3VudCsrOworCisgICAgaW5kZXggPSB0aWNrIC0gem1fc3VtbWFyeS50aWNrX2Jhc2U7CisKKyAgICBpZiAoaW5kZXggPCAxMDApCisgICAgeworICAgICAgICB6bV92YXIudHhfbXNkdV90aWNrW2luZGV4XSsrOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvL0RiZ1ByaW50KCJ3ZC0+dGljayBleGNlZWRlZCB0aWNrX2Jhc2UrMTAwIVxuIik7CisgICAgfQorfQorCit2b2lkIHpmaVJ4UGVyZm9ybWFuY2VNU0RVKHpkZXZfdCogZGV2LCB1MzJfdCB0aWNrKQoreworICAgIHUzMl90ICAgaW5kZXg7CisgICAgem1fc3VtbWFyeS5yeF9tc2R1X2NvdW50Kys7CisKKyAgICBpbmRleCA9IHRpY2sgLSB6bV9zdW1tYXJ5LnRpY2tfYmFzZTsKKworICAgIGlmIChpbmRleCA8IDEwMCkKKyAgICB7CisgICAgICAgIHptX3Zhci5yeF9tc2R1X3RpY2tbaW5kZXhdKys7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8vRGJnUHJpbnQoIndkLT50aWNrIGV4Y2VlZGVkIHRpY2tfYmFzZSsxMDAhXG4iKTsKKyAgICB9Cit9CisKK3ZvaWQgemZpVHhQZXJmb3JtYW5jZU1QRFUoemRldl90KiBkZXYsIHUzMl90IHRpY2spCit7CisgICAgdTMyX3QgICBpbmRleDsKKyAgICB6bV9zdW1tYXJ5LnR4X21wZHVfY291bnQrKzsKKworICAgIGluZGV4ID0gdGljayAtIHptX3N1bW1hcnkudGlja19iYXNlOworCisgICAgaWYgKGluZGV4IDwgMTAwKQorICAgIHsKKyAgICAgICAgem1fdmFyLnR4X21wZHVfdGlja1tpbmRleF0rKzsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLy9EYmdQcmludCgid2QtPnRpY2sgZXhjZWVkZWQgdGlja19iYXNlKzEwMCFcbiIpOworICAgIH0KK30KKworI2lmbmRlZiBaTV9JTlRfVVNFX0VQMl9IRUFERVJfU0laRQorI2RlZmluZSBaTV9JTlRfVVNFX0VQMl9IRUFERVJfU0laRSAgIDEyCisjZW5kaWYKK3ZvaWQgemZpUnhQZXJmb3JtYW5jZU1QRFUoemRldl90KiBkZXYsIHpidWZfdCogYnVmKQoreworICAgIHUzMl90ICAgaW5kZXg7CisgICAgdTE2X3QgICBmcmFtZVR5cGU7CisgICAgdTE2X3QgICBmcmFtZUN0cmw7CisgICAgdThfdCAgICBtcGR1SW5kOworICAgIHUxNl90ICAgcGxjcEhkckxlbjsKKyAgICB1MTZfdCAgIGxlbjsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIGxlbiA9IHpmd0J1ZkdldFNpemUoZGV2LCBidWYpOworICAgIG1wZHVJbmQgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBsZW4tMSk7CisgICAgLyogRmlyc3QgTVBEVSBvciBTaW5nbGUgTVBEVSAqLworICAgIGlmKCgobXBkdUluZCAmIDB4MzApID09IDB4MDApIHx8ICgobXBkdUluZCAmIDB4MzApID09IDB4MjApKQorICAgIC8vaWYgKChtcGR1SW5kICYgMHgxMCkgPT0gMHgwMCkKKyAgICB7CisgICAgICAgIHBsY3BIZHJMZW4gPSAxMjsgICAgICAgIC8vIFBMQ1AgaGVhZGVyIGxlbmd0aAorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpZiAoem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgNCkgPT0gd2QtPm1hY0FkZHJbMF0gJiYKKyAgICAgICAgICAgIHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIDYpID09IHdkLT5tYWNBZGRyWzFdICYmCisgICAgICAgICAgICB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCA4KSA9PSB3ZC0+bWFjQWRkclsyXSkgeworICAgICAgICAgICAgcGxjcEhkckxlbiA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMTYpID09IHdkLT5tYWNBZGRyWzBdICYmCisgICAgICAgICAgICAgICAgIHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIDE4KSA9PSB3ZC0+bWFjQWRkclsxXSAmJgorICAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCAyMCkgPT0gd2QtPm1hY0FkZHJbMl0peworICAgICAgICAgICAgcGxjcEhkckxlbiA9IDEyOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgcGxjcEhkckxlbiA9IDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmcmFtZUN0cmwgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBwbGNwSGRyTGVuICsgMCk7CisgICAgZnJhbWVUeXBlID0gZnJhbWVDdHJsICYgMHhmOworCisgICAgaWYgKGZyYW1lVHlwZSAhPSBaTV9XTEFOX0RBVEFfRlJBTUUpCisgICAgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgem1fc3VtbWFyeS5yeF9tcGR1X2NvdW50Kys7CisKKyAgICBpbmRleCA9IHdkLT50aWNrIC0gem1fc3VtbWFyeS50aWNrX2Jhc2U7CisKKyAgICBpZiAoaW5kZXggPCAxMDApCisgICAgeworICAgICAgICB6bV92YXIucnhfbXBkdV90aWNrW2luZGV4XSsrOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvL0RiZ1ByaW50KCJ3ZC0+dGljayBleGNlZWRlZCB0aWNrX2Jhc2UrMTAwIVxuIik7CisgICAgfQorfQorCit2b2lkIHpmaVJ4UGVyZm9ybWFuY2VTZXEoemRldl90KiBkZXYsIHpidWZfdCogYnVmKQoreworICAgIHUxNl90ICAgc2VxX25vOworICAgIHUxNl90ICAgb2Zmc2V0ID0gMDsKKyAgICB1MTZfdCAgIG9sZF9kaXMgPSB6bV9zdW1tYXJ5LnJ4X2Jyb2tlbl9zZXFfZGlzOworICAgIC8vc3lzX3RpbWUgPSBLZVF1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyKCZmcmVxKTsKKworICAgIHNlcV9ubyA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIG9mZnNldCsyMikgPj4gNDsKKworICAgIFpNX1NFUV9ERUJVRygiT3V0ICAgJTVkXG4iLCBzZXFfbm8pOworCisgICAgaWYgKHNlcV9ubyA8IHptX3N1bW1hcnkucnhfc2VxX2Jhc2UpCisgICAgeworICAgICAgICBpZiAoc2VxX25vID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh6bV9zdW1tYXJ5LnJ4X3NlcV9iYXNlICE9IDQwOTUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgem1fc3VtbWFyeS5yeF9icm9rZW5fc2VxKys7CisgICAgICAgICAgICAgICAgWk1fU0VRX0RFQlVHKCJCcm9rZW4gc2VxIik7CisgICAgICAgICAgICAgICAgem1fc3VtbWFyeS5yeF9icm9rZW5fc2VxX2Rpcys9KDQwOTYgLSB6bV9zdW1tYXJ5LnJ4X3NlcV9iYXNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICgoc2VxX25vIDwgMzAwKSAmJiAoem1fc3VtbWFyeS5yeF9zZXFfYmFzZSA+IDM4MDApKQorICAgICAgICB7CisgICAgICAgICAgICB6bV9zdW1tYXJ5LnJ4X2Jyb2tlbl9zZXErKzsKKyAgICAgICAgICAgIFpNX1NFUV9ERUJVRygiQnJva2VuIHNlcSIpOworICAgICAgICAgICAgem1fc3VtbWFyeS5yeF9icm9rZW5fc2VxX2Rpcys9KDQwOTYgLSB6bV9zdW1tYXJ5LnJ4X3NlcV9iYXNlICsgc2VxX25vKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHptX3N1bW1hcnkucnhfYnJva2VuX3NlcSsrOworICAgICAgICAgICAgWk1fU0VRX0RFQlVHKCJCcm9rZW4gc2VxIik7CisgICAgICAgICAgICB6bV9zdW1tYXJ5LnJ4X2Jyb2tlbl9zZXFfZGlzKz0oem1fc3VtbWFyeS5yeF9zZXFfYmFzZSAtIHNlcV9ubyk7CisgICAgICAgICAgICB6bV9zdW1tYXJ5LnJ4X29sZF9zZXErKzsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpZiAoc2VxX25vICE9ICh6bV9zdW1tYXJ5LnJ4X3NlcV9iYXNlICsgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgoc2VxX25vID4gMzgwMCkgJiYgKHptX3N1bW1hcnkucnhfc2VxX2Jhc2UgPCAzMDApKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHptX3N1bW1hcnkucnhfYnJva2VuX3NlcSsrOworICAgICAgICAgICAgICAgIFpNX1NFUV9ERUJVRygiQnJva2VuIHNlcSIpOworICAgICAgICAgICAgICAgIHptX3N1bW1hcnkucnhfYnJva2VuX3NlcV9kaXMrPSg0MDk2IC0gc2VxX25vICsgem1fc3VtbWFyeS5yeF9zZXFfYmFzZSk7CisgICAgICAgICAgICAgICAgem1fc3VtbWFyeS5yeF9vbGRfc2VxKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgem1fc3VtbWFyeS5yeF9icm9rZW5fc2VxKys7CisgICAgICAgICAgICAgICAgWk1fU0VRX0RFQlVHKCJCcm9rZW4gc2VxIik7CisgICAgICAgICAgICAgICAgem1fc3VtbWFyeS5yeF9icm9rZW5fc2VxX2Rpcys9KHNlcV9ubyAtIHptX3N1bW1hcnkucnhfc2VxX2Jhc2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGlmIChzZXFfbm8gPT0gem1fc3VtbWFyeS5yeF9zZXFfYmFzZSkKKyAgICB7CisgICAgICAgIHptX3N1bW1hcnkucnhfZHVwbGljYXRlX3NlcSsrOworICAgIH0KKworICAgIGlmICgoem1fc3VtbWFyeS5yeF9icm9rZW5fc2VxX2RpcyAtIG9sZF9kaXMpID4gMTAwKQorICAgIHsKKyAgICAgICAgRGJnUHJpbnQoIiogc2VxX25vPSU0ZCwgYmFzZV9zZXE9JTRkLCBkaXNfZGlmZj0lNGQiLCBzZXFfbm8sCisgICAgICAgICAgICB6bV9zdW1tYXJ5LnJ4X3NlcV9iYXNlLCB6bV9zdW1tYXJ5LnJ4X2Jyb2tlbl9zZXFfZGlzIC0gb2xkX2Rpcyk7CisgICAgfQorICAgIHptX3N1bW1hcnkucnhfc2VxX2Jhc2UgPSBzZXFfbm87Cit9CisKK3ZvaWQgemZpUnhQZXJmb3JtYW5jZVJlZyh6ZGV2X3QqIGRldiwgdTMyX3QgcmVnLCB1MzJfdCByc3ApCit7CisgICAgem1fc3VtbWFyeS5yZXNldF9jb3VudCA9ICh1MTZfdClyc3AgLSB6bV9zdW1tYXJ5LnJlc2V0X3N1bTsKKyAgICB6bV9zdW1tYXJ5LnJlc2V0X3N1bSA9ICh1MTZfdClyc3A7Cit9CisKK3ZvaWQgemZpUnhQZXJmb3JtYW5jZUR1cCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYxLCB6YnVmX3QqIGJ1ZjIpCit7CisgICAgdTE2X3QgICBzZXFfbm8xLCBzZXFfbm8yOworCisgICAgc2VxX25vMSA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYxLCAyMikgPj4gNDsKKyAgICBzZXFfbm8yID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZjIsIDIyKSA+PiA0OworICAgIGlmIChzZXFfbm8xICE9IHNlcV9ubzIpCisgICAgeworICAgICAgICB6bV9zdW1tYXJ5LnJ4X2R1cGxpY2F0ZV9lcnJvcisrOworICAgIH0KK30KKwordm9pZCB6ZmlSeFBlcmZvcm1hbmNlRnJlZSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpCit7CisgICAgem1fc3VtbWFyeS5yeF9mcmVlKys7Cit9CisKK3ZvaWQgemZpUnhQZXJmb3JtYW5jZUFNU0RVKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3QgbGVuKQoreworICAgIGlmICh6bV9zdW1tYXJ5LnJ4X2Ftc2R1X2xlbiA8IGxlbikKKyAgICB7CisgICAgICAgIHptX3N1bW1hcnkucnhfYW1zZHVfbGVuID0gbGVuOworICAgIH0KK30KK3ZvaWQgemZpUnhQZXJmb3JtYW5jZUZsdXNoKHpkZXZfdCogZGV2KQoreworICAgIHptX3N1bW1hcnkucnhfZmx1c2grKzsKK30KKwordm9pZCB6ZmlSeFBlcmZvcm1hbmNlQ2xlYXIoemRldl90KiBkZXYpCit7CisgICAgem1fc3VtbWFyeS5yeF9jbGVhcisrOworICAgIFpNX1NFUV9ERUJVRygiUnhDbGVhciIpOworfQorCit2b2lkIHpmaVJ4UGVyZm9ybWFuY2VSZW9yZGVyKHpkZXZfdCogZGV2KQoreworICAgIHptX3N1bW1hcnkucnhfcmVvcmRlcisrOworfQorI2VuZGlmIC8qIGVuZCBvZiBaTV9FTkFCTEVfUEVSRk9STUFOQ0VfRVZBTFVBVElPTiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL3BlcmZvcm1hbmNlLmggYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvcGVyZm9ybWFuY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOWY2NThhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL3BlcmZvcm1hbmNlLmgKQEAgLTAsMCArMSw5NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNy0yMDA4IEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisjaWZuZGVmIF9QRVJGT1JNQU5DRV9ICisjZGVmaW5lIF9QRVJGT1JNQU5DRV9ICisKKyNpZmRlZiBaTV9FTkFCTEVfUEVSRk9STUFOQ0VfRVZBTFVBVElPTgorCitzdHJ1Y3QgenNTdW1tYXJ5Cit7CisgICAgdTMyX3QgdHhfbXNkdV9jb3VudDsKKyAgICB1MzJfdCB0eF9tcGR1X2NvdW50OworICAgIHUzMl90IHJ4X21zZHVfY291bnQ7CisgICAgdTMyX3QgcnhfbXBkdV9jb3VudDsKKyAgICB1MzJfdCB0aWNrX2Jhc2U7CisgICAgdTE2X3Qgcnhfc2VxX2Jhc2U7CisgICAgdTE2X3QgcnhfYnJva2VuX3NlcTsKKyAgICB1MTZfdCByeF9icm9rZW5fc3VtOworICAgIHUxNl90IHJ4X2Jyb2tlbl9zZXFfZGlzOworICAgIHUxNl90IHJ4X2R1cGxpY2F0ZV9zZXE7CisgICAgdTE2X3QgcnhfZHVwbGljYXRlX2Vycm9yOworICAgIHUxNl90IHJ4X29sZF9zZXE7CisgICAgdTE2X3QgcnhfbG9zdF9zdW07CisgICAgdTE2X3QgdHhfaWRsZV9jb3VudDsKKyAgICB1MTZfdCByeF9pZGxlX2NvdW50OworICAgIHUxNl90IHJlc2V0X2NvdW50OworICAgIHUxNl90IHJlc2V0X3N1bTsKKyAgICB1MTZfdCByeF9mcmVlOworICAgIHUxNl90IHJ4X2Ftc2R1X2xlbjsKKyAgICB1MTZfdCByeF9mbHVzaDsKKyAgICB1MTZfdCByeF9jbGVhcjsKKyAgICB1MzJfdCByeF9yZW9yZGVyOworfTsKKworc3RydWN0IHpzVmFyaWF0aW9uCit7CisgICAgdTMyX3QgdHhfbXNkdV90aWNrWzEwMF07CisgICAgdTMyX3QgdHhfbXBkdV90aWNrWzEwMF07CisgICAgdTMyX3QgcnhfbXNkdV90aWNrWzEwMF07CisgICAgdTMyX3QgcnhfbXBkdV90aWNrWzEwMF07CisKKyAgICB1MzJfdCB0eF9tc2R1X21lYW47CisgICAgdTMyX3QgdHhfbXBkdV9tZWFuOworICAgIHUzMl90IHJ4X21zZHVfbWVhbjsKKyAgICB1MzJfdCByeF9tcGR1X21lYW47CisKKyAgICB1MzJfdCB0eF9tc2R1X3N1bTsKKyAgICB1MzJfdCB0eF9tcGR1X3N1bTsKKyAgICB1MzJfdCByeF9tc2R1X3N1bTsKKyAgICB1MzJfdCByeF9tcGR1X3N1bTsKKworICAgIHUzMl90IHR4X21zZHVfdmFyOworICAgIHUzMl90IHR4X21wZHVfdmFyOworICAgIHUzMl90IHJ4X21zZHVfdmFyOworICAgIHUzMl90IHJ4X21wZHVfdmFyOworfTsKKworc3RydWN0IHpzVGhyb3VnaHB1dAoreworICAgIHUzMl90IHR4WzUwXTsKKyAgICB1MzJfdCByeFs1MF07CisgICAgdTE2X3QgaGVhZDsKKyAgICB1MTZfdCB0YWlsOworICAgIHUxNl90IHNpemU7CisgICAgTEFSR0VfSU5URUdFUiBzeXNfdGltZTsKKyAgICBMQVJHRV9JTlRFR0VSIGZyZXE7Cit9OworCit2b2lkIHpmaVBlcmZvcm1hbmNlSW5pdCh6ZGV2X3QqIGRldik7Cit2b2lkIHpmaVBlcmZvcm1hbmNlUmVmcmVzaCh6ZGV2X3QqIGRldik7CisKK3ZvaWQgemZpVHhQZXJmb3JtYW5jZU1TRFUoemRldl90KiBkZXYsIHUzMl90IHRpY2spOwordm9pZCB6ZmlSeFBlcmZvcm1hbmNlTVNEVSh6ZGV2X3QqIGRldiwgdTMyX3QgdGljayk7Cit2b2lkIHpmaVR4UGVyZm9ybWFuY2VNUERVKHpkZXZfdCogZGV2LCB1MzJfdCB0aWNrKTsKK3ZvaWQgemZpUnhQZXJmb3JtYW5jZU1QRFUoemRldl90KiBkZXYsIHpidWZfdCogYnVmKTsKK3ZvaWQgemZpUnhQZXJmb3JtYW5jZVNlcSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpOwordm9pZCB6ZmlSeFBlcmZvcm1hbmNlUmVnKHpkZXZfdCogZGV2LCB1MzJfdCByZWcsIHUzMl90IHJzcCk7Cit2b2lkIHpmaVJ4UGVyZm9ybWFuY2VEdXAoemRldl90KiBkZXYsIHpidWZfdCogYnVmMSwgemJ1Zl90KiBidWYyKTsKK3ZvaWQgemZpUnhQZXJmb3JtYW5jZUZyZWUoemRldl90KiBkZXYsIHpidWZfdCogYnVmKTsKK3ZvaWQgemZpUnhQZXJmb3JtYW5jZUFNU0RVKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3QgbGVuKTsKK3ZvaWQgemZpUnhQZXJmb3JtYW5jZUZsdXNoKHpkZXZfdCogZGV2KTsKK3ZvaWQgemZpUnhQZXJmb3JtYW5jZUNsZWFyKHpkZXZfdCogZGV2KTsKK3ZvaWQgemZpUnhQZXJmb3JtYW5jZVJlb3JkZXIoemRldl90KiBkZXYpOworI2VuZGlmIC8qIGVuZCBvZiBaTV9FTkFCTEVfUEVSRk9STUFOQ0VfRVZBTFVBVElPTiAqLworI2VuZGlmIC8qIGVuZCBvZiBfUEVSRk9STUFOQ0VfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL3B1Yl91c2IuaCBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9wdWJfdXNiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzRiNGJkMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9wdWJfdXNiLmgKQEAgLTAsMCArMSwxMDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBBdGhlcm9zIENvbW11bmljYXRpb25zIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisjaWZuZGVmIF9QVUJfVVNCX0gKKyNkZWZpbmUgX1BVQl9VU0JfSAorCisjaW5jbHVkZSAiLi4vb2FsX2R0LmgiCisKKyNkZWZpbmUgWk1fSEFMXzgwMjExX01PREVfQVAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgWk1fSEFMXzgwMjExX01PREVfU1RBICAgICAgICAgICAgIDEKKyNkZWZpbmUgWk1fSEFMXzgwMjExX01PREVfSUJTU19HRU5FUkFMICAgIDIKKyNkZWZpbmUgWk1fSEFMXzgwMjExX01PREVfSUJTU19XUEEyUFNLICAgIDMKKworLyogVVNCIG1vZHVsZSBkZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFF1ZXVlIE1hbmFnZW1lbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA4MDIxMWNvcmUgcmVxdWlyZXMgT0FMIHRvIGltcGxlbWVudCBhIHRyYW5zbWlzc2lvbiBxdWV1ZSBpbiBPQUwncyAgICAqLworLyogVVNCIG1vZHVsZS4gQmVjYXVzZSB0aGVyZSBpcyBvbmx5IGxpbWl0ZWQgb24tY2hpcCBtZW1vcnksIHNvIFVTQiAgICAgKi8KKy8qIGRhdGEgdHJhbnNmZXIgbWF5IGJlIHBlbmRpbmcgdW50aWwgb24tY2hpcCBtZW1vcnkgaXMgYXZhaWxhYmxlLiAgICAgICovCisvKiA4MDIxMWNvcmUgYWxzbyByZXF1aXJlcyBPQUwncyBVU0IgbW9kdWxlIHRvIHByb3ZpZGUgdHdvIGZ1bmN0aW9ucyAgICAqLworLyogemZ3VXNiR2V0RnJlZVR4UVNpemUoKSBhbmQgemZ3VXNiR2V0TWF4VHhRU2l6ZSgpIGZvciA4MDIxMWNvcmUgdG8gICAgKi8KKy8qIHF1ZXJ5IHRoZSBzdGF0dXMgb2YgdGhpcyB0cmFuc21pc3Npb24gcXVldWUuIFRoZSBtYWluIHB1cnBvc2Ugb2YgICAgICovCisvKiB0aGlzIHF1ZXVlIGlzIGZvciBRb1MvV01NLiBUaG91Z2ggdGhlcmUgYXJlIGhhcmR3YXJlIHByaW9yaXR5ICAgICAgICAqLworLyogcXVldWVzIG9uIHRoZSBjaGlwLCBhbmQgYWxzbyBzb2Z0d2FyZSBwcmlvcml0eSBxdWV1ZXMgaW4gdGhlICAgICAgICAgKi8KKy8qIDgwMjExY29yZS4gVGhlcmUgaXMgc3RpbGwgb25lIGFuZCBvbmx5IG9uZSBVU0IgY2hhbm5lbC4gU28gICAgICAgICAgICovCisvKiA4MDIxMWNvcmUgd2lsbCB1c2UgdGhlIGluZm9ybWF0aW9uIHRoYXQgemZ3VXNiR2V0RnJlZVR4UVNpemUoKSAgICAgICAqLworLyogcmV0dXJuZWQgdG8gc2NoZWR1bGUgdGhlIHRyYWZmaWMgZnJvbSB0aGUgc29mdHdhcmUgcHJpb3JpdHkgICAgICAgICAgKi8KKy8qIHF1ZXVlcyB0byB0aGUgaGFyZHdhcmUgcHJpb3JpdHkgcXVldWVzLiBGb3IgZXhhbXBsZSwgaWYgODAyMTFjb3JlICAgICovCisvKiBmb3VuZCB0aGF0IFVTQiB0cmFuc21pc3Npb24gcXVldWUgaXMgZ29pbmcgdG8gYmUgZnVsbCwgaXQgd2lsbCAgICAgICAqLworLyogbm90IGFsbG93IHBhY2tldHMgd2l0aCBsb3dlciBwcmlvcml0eSB0byBlbnRlciB0aGUgVVNCIGNoYW5uZWwuICAgICAgKi8KKworCisvKiBTdHJ1Y3R1cmUgZm9yIFVTQiBjYWxsIGJhY2sgZnVuY3Rpb25zICovCitzdHJ1Y3QgemZDYlVzYkZ1bmNUYmwgeworICAgIHZvaWQgKCp6ZmNiVXNiUmVjdikoemRldl90ICpkZXYsIHpidWZfdCAqYnVmKTsKKyAgICB2b2lkICgqemZjYlVzYlJlZ0luKSh6ZGV2X3QqIGRldiwgdTMyX3QqIHJzcCwgdTE2X3QgcnNwTGVuKTsKKyAgICB2b2lkICgqemZjYlVzYk91dENvbXBsZXRlKSh6ZGV2X3QqIGRldiwgemJ1Zl90ICpidWYsIHU4X3Qgc3RhdHVzLCB1OF90ICpoZHIpOworICAgIHZvaWQgKCp6ZmNiVXNiUmVnT3V0Q29tcGxldGUpKHpkZXZfdCogZGV2KTsKK307CisKKy8qIENhbGwgYmFjayBmdW5jdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBCZWxvdyBhcmUgdGhlIGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBiZSBjYWxsZWQgYnkgdGhlIE9BTCAgICAgICAgICAgICAqLworCisvKiBXaGVuIGRhdGEgaXMgYXZhaWxhYmxlIGluIGVuZHBvaW50IDMsIE9BTCBzaGFsbCBlbWJlZCB0aGUgZGF0YSBpbiAqLworLyogemJ1Zl90IGFuZCBzdXBwbHkgdG8gODAyMTFjb3JlIGJ5IGNhbGxpbmcgdGhpcyBmdW5jdGlvbiAgICAgICAgICAgKi8KKy8qIHZvaWQgKCp6ZmNiVXNiUmVjdikoemRldl90ICpkZXYsIHpidWZfdCAqYnVmKTsgKi8KKworLyogV2hlbiBkYXRhIGlzIGF2YWlsYWJsZSBpbiBlbmRwb2ludCAyLCBPQUwgc2hhbGwgY2FsbCB0aGlzIGZ1bmN0aW9uICovCisvKiB2b2lkICgqemZjYlVzYlJlZ0luKSh6ZGV2X3QqIGRldiwgdTMyX3QqIHJzcCwgdTE2X3QgcnNwTGVuKTsgKi8KKworLyogV2hlbiBVU0IgZGF0YSB0cmFuc2ZlciBjb21wbGV0ZWQgaW4gZW5kcG9pbnQgMSwgT0FMIHNoYWxsIGNhbGwgdGhpcyBmdW5jdGlvbiAqLworLyogdm9pZCAoKnpmY2JVc2JPdXRDb21wbGV0ZSkoemRldl90KiBkZXYsIHpidWZfdCAqYnVmLCB1OF90IHN0YXR1cywgdThfdCAqaGRyKTsgKi8KKworCisvKiBDYWxsIG91dCBmdW5jdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogQmVsb3cgYXJlIHRoZSBmdW5jdGlvbnMgdGhhdCBzdXBwbHkgYnkgdGhlIE9BTCBmb3IgODAyMTFjb3JlIHRvICAgICAgKi8KKy8qIG1hbmlwdWxhdGUgdGhlIFVTQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKy8qIFJldHVybiBPQUwncyBVU0IgVHhRIHNpemUgKi8KK2V4dGVybiB1MzJfdCB6ZndVc2JHZXRNYXhUeFFTaXplKHpkZXZfdCogZGV2KTsKKworLyogUmV0dXJuIE9BTCdzIFR4USBhdmFpbGFibGUgc2l6ZSAqLworZXh0ZXJuIHUzMl90IHpmd1VzYkdldEZyZWVUeFFTaXplKHpkZXZfdCogZGV2KTsKKworLyogUmVnaXN0ZXIgY2FsbCBiYWNrIGZ1bmN0aW9uICovCitleHRlcm4gdm9pZCB6ZndVc2JSZWdpc3RlckNhbGxCYWNrKHpkZXZfdCogZGV2LCBzdHJ1Y3QgemZDYlVzYkZ1bmNUYmwgKnpmVXNiRnVuYyk7CisKKy8qIEVuYWJsZSBVU0IgaW50ZXJydXB0IGVuZHBvaW50ICovCitleHRlcm4gdTMyX3QgemZ3VXNiRW5hYmxlSW50RXB0KHpkZXZfdCAqZGV2LCB1OF90IGVuZHB0KTsKKworLyogRW5hYmxlIFVTQiBSeCBlbmRwb2ludCAqLworZXh0ZXJuIGludCB6ZndVc2JFbmFibGVSeEVwdCh6ZGV2X3QqIGRldiwgdThfdCBlbmRwdCk7CisKKy8qIDgwMjExY29yZSBjYWxsIHRoaXMgZnVuY3Rpb24gdG8gc2VuZCBhIFVTQiByZXF1ZXN0IG92ZXIgZW5kcG9pbnQgMCAqLworZXh0ZXJuIHUzMl90IHpmd1VzYlN1Ym1pdENvbnRyb2woemRldl90KiBkZXYsIHU4X3QgcmVxLCB1MTZfdCB2YWx1ZSwKKyAgICAgICAgdTE2X3QgaW5kZXgsIHZvaWQgKmRhdGEsIHUzMl90IHNpemUpOworZXh0ZXJuIHUzMl90IHpmd1VzYlN1Ym1pdENvbnRyb2xJbyh6ZGV2X3QqIGRldiwgdThfdCByZXEsIHU4X3QgcmVxdHlwZSwKKyAgICAgICAgdTE2X3QgdmFsdWUsIHUxNl90IGluZGV4LCB2b2lkICpkYXRhLCB1MzJfdCBzaXplKTsKKworLyogODAyMTFjb3JlIGNhbGwgdGhpcyBmdW5jdGlvbiB0byB0cmFuc2ZlciBkYXRhIG91dCBvdmVyIGVuZHBvaW50IDEgKi8KK2V4dGVybiB2b2lkIHpmd1VzYkNtZCh6ZGV2X3QqIGRldiwgdThfdCBlbmRwdCwgdTMyX3QqIGNtZCwgdTE2X3QgY21kTGVuKTsKKworLyogODAyMTFjb3JlIGNhbGwgdGhpcyBmdW5jdGlvbiB0byB0cmFuc2ZlciBkYXRhIG91dCBvdmVyIGVuZHBvaW50IDQgKi8KK2V4dGVybiB1MzJfdCB6ZndVc2JTZW5kKHpkZXZfdCogZGV2LCB1OF90IGVuZHB0LCB1OF90ICpoZHIsIHUxNl90IGhkcmxlbiwgdThfdCAqc25hcCwgdTE2X3Qgc25hcExlbiwKKyAgICAgICAgICAgICAgICB1OF90ICp0YWlsLCB1MTZfdCB0YWlsTGVuLCB6YnVmX3QgKmJ1ZiwgdTE2X3Qgb2Zmc2V0KTsKKworLyogODAyMTFjb3JlIGNhbGwgdGhpcyBmdW5jdGlvbiB0byBzZXQgVVNCIGNvbmZpZ3VyYXRpb24gKi8KK2V4dGVybiB1MzJfdCB6ZndVc2JTZXRDb25maWd1cmF0aW9uKHpkZXZfdCAqZGV2LCB1MTZfdCB2YWx1ZSk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL3B1Yl96ZmkuaCBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9wdWJfemZpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTM1YmQ1ZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9wdWJfemZpLmgKQEAgLTAsMCArMSw4MjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBBdGhlcm9zIENvbW11bmljYXRpb25zIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisjaWZuZGVmIF9QVUJfREVGU19ICisjZGVmaW5lIF9QVUJfREVGU19ICisKKyNpbmNsdWRlICIuLi9vYWxfZHQuaCIKKworLyoqKioqIFNlY3Rpb24gMSA6IFR1bmFibGUgUGFyYW1ldGVycyAqKioqKi8KKy8qIFRoZSBkZWZpbnRpb25zIGluIHRoaXMgc2VjdGlvbiBhcmUgdHVuYWJlbCBwYXJhbWV0ZXJzICovCisKKy8qIE1heGltdW0gbnVtYmVyIG9mIEJTUyB0aGF0IGNvdWxkIGJlIHNjYW5lZCAqLworI2RlZmluZSBaTV9NQVhfQlNTICAgICAgICAgICAgICAgICAgICAgICAgICAxMjgKKworLyogTWF4aW11bSBudW1iZXIgb2YgV1BBMiBQTUtJRCB0aGF0IHN1cHBvcnRlZCAqLworI2RlZmluZSBaTV9QTUtJRF9NQVhfQlNTX0NOVCAgICAgICAgICAgICAgIDgKKworLyogRW5hYmxlIGFnZ3JlZ2F0aW9uIGFuZCBkZWFnZ3JlZ2F0aW9uICovCisjZGVmaW5lIFpNX0VOQUJMRV9BR0dSRUdBVElPTgorCisjaWZkZWYgWk1fRU5BQkxFX0FHR1JFR0FUSU9OCisgICAgLyogRW5hYmxlIEJBIGZhaWxlZCByZXRyYW5zbWlzc2lvbiBpbiBmaXJtd2FyZSAqLworICAgICNkZWZpbmUgWk1fRU5BQkxFX0ZXX0JBX1JFVFJBTlNNSVNTSU9OCisgICAgI2RlZmluZSBaTV9CWVBBU1NfQUdHUl9TQ0hFRFVMSU5HCisgICAgLy8jZGVmaW5lIFpNX0FHR1JfQklUX09OCisjZW5kaWYKKworCisjaWZuZGVmIFpNX0ZCNTAKKy8vI2RlZmluZSBaTV9GQjUwCisjZW5kaWYKKworI2lmbmRlZiBaTV9BUF9ERUJVRworLy8jZGVmaW5lIFpNX0FQX0RFQlVHCisjZW5kaWYKKworLy8jZGVmaW5lIFpNX0VOQUJMRV9CQV9SQVRFQ1RSTAorCisvKioqKiogRW5kIG9mIHNlY3Rpb24gMSAqKioqKi8KKworCisvKioqKiogU2VjdGlvbiAyIDogUHVibGljIERlZmluaXRpb25zLCBkYXRhIHN0cnVjdHVyZXMgYW5kIHByb3RvdHlwZXMgKioqKiovCisvKiBmdW5jdGlvbiByZXR1cm4gc3RhdHVzICovCisjZGVmaW5lIFpNX1NUQVRVU19TVUNDRVNTICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgWk1fU1RBVFVTX0ZBSUxVUkUgICAgICAgICAgICAgICAgICAgMQorCisvLyBtZWRpYSBjb25uZWN0IHN0YXR1cworI2RlZmluZSBaTV9TVEFUVVNfTUVESUFfQ09OTkVDVCAgICAgICAgICAgICAweDAwCisjZGVmaW5lIFpNX1NUQVRVU19NRURJQV9ESVNDT05ORUNUICAgICAgICAgIDB4MDEKKyNkZWZpbmUgWk1fU1RBVFVTX01FRElBX0RJU0NPTk5FQ1RfTk9UX0ZPVU5EICAgIDB4MDIKKyNkZWZpbmUgWk1fU1RBVFVTX01FRElBX0RJU0FCTEVEICAgICAgICAgICAgMHgwMworI2RlZmluZSBaTV9TVEFUVVNfTUVESUFfQ09OTkVDVElPTl9ESVNBQkxFRCAweDA0CisjZGVmaW5lIFpNX1NUQVRVU19NRURJQV9DT05ORUNUSU9OX1JFU0VUICAgIDB4MDUKKyNkZWZpbmUgWk1fU1RBVFVTX01FRElBX1JFU0VUICAgICAgICAgICAgICAgMHgwNgorI2RlZmluZSBaTV9TVEFUVVNfTUVESUFfRElTQ09OTkVDVF9ERUFVVEggICAweDA3CisjZGVmaW5lIFpNX1NUQVRVU19NRURJQV9ESVNDT05ORUNUX0RJU0FTT0MgIDB4MDgKKyNkZWZpbmUgWk1fU1RBVFVTX01FRElBX0RJU0NPTk5FQ1RfVElNRU9VVCAgMHgwOQorI2RlZmluZSBaTV9TVEFUVVNfTUVESUFfRElTQ09OTkVDVF9BVVRIX0ZBSUxFRCAgMHgwYQorI2RlZmluZSBaTV9TVEFUVVNfTUVESUFfRElTQ09OTkVDVF9BU09DX0ZBSUxFRCAgMHgwYgorI2RlZmluZSBaTV9TVEFUVVNfTUVESUFfRElTQ09OTkVDVF9NSUNfRkFJTCAgIDB4MGMKKyNkZWZpbmUgWk1fU1RBVFVTX01FRElBX0RJU0NPTk5FQ1RfVU5SRUFDSEFCTEUgMHgwZAorI2RlZmluZSBaTV9TVEFUVVNfTUVESUFfRElTQ09OTkVDVF9CRUFDT05fTUlTUyAgMHgwZQorCisvLyBQYWNrZXQgRmlsdGVyCisjZGVmaW5lIFpNX1BBQ0tFVF9UWVBFX0RJUkVDVEVEICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgWk1fUEFDS0VUX1RZUEVfTVVMVElDQVNUICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBaTV9QQUNLRVRfVFlQRV9BTExfTVVMVElDQVNUICAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIFpNX1BBQ0tFVF9UWVBFX0JST0FEQ0FTVCAgICAgICAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgWk1fUEFDS0VUX1RZUEVfUFJPTUlTQ1VPVVMgICAgICAgICAgMHgwMDAwMDAyMAorCisvKiBCU1MgbW9kZSBkZWZpbml0aW9uICovCisvKiBUT0RPIDogVGhlIGRlZmluaXRpb25zIGhlcmUgYXJlIGNvdXBsZWQgd2l0aCBYUCdzIE5ESVMgT0lELiAqLworLyogICAgICAgIFdlIGNhbid0IGJlIGNoYW5nZWQgdGhlbSBmcmVlbHksIG5lZWQgdG8gZGlzYXJtIHRoaXMgbWluZSAqLworI2RlZmluZSBaTV9NT0RFX0lCU1MgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFpNX01PREVfSU5GUkFTVFJVQ1RVUkUgICAgICAgICAgICAgIDEKKyNkZWZpbmUgWk1fTU9ERV9VTktOT1dOICAgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBaTV9NT0RFX0lORlJBU1RSVUNUVVJFX01BWCAgICAgICAgICAzCisjZGVmaW5lIFpNX01PREVfQVAgICAgICAgICAgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgWk1fTU9ERV9QU0VVRE8gICAgICAgICAgICAgICAgICAgICAgNQorCisKKy8qIEF1dGhlbnRpY2F0aW9uIG1vZGUgKi8KKyNkZWZpbmUgWk1fQVVUSF9NT0RFX09QRU4gICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBaTV9BVVRIX01PREVfU0hBUkVEX0tFWSAgICAgICAgICAgICAxCisjZGVmaW5lIFpNX0FVVEhfTU9ERV9BVVRPICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgWk1fQVVUSF9NT0RFX1dQQSAgICAgICAgICAgICAgICAgICAgMworI2RlZmluZSBaTV9BVVRIX01PREVfV1BBUFNLICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIFpNX0FVVEhfTU9ERV9XUEFfTk9ORSAgICAgICAgICAgICAgIDUKKyNkZWZpbmUgWk1fQVVUSF9NT0RFX1dQQTIgICAgICAgICAgICAgICAgICAgNgorI2RlZmluZSBaTV9BVVRIX01PREVfV1BBMlBTSyAgICAgICAgICAgICAgICA3CisjaWZkZWYgWk1fRU5BQkxFX0NFTkMKKyNkZWZpbmUgWk1fQVVUSF9NT0RFX0NFTkMgICAgICAgICAgICAgICAgICAgOAorI2VuZGlmIC8vWk1fRU5BQkxFX0NFTkMKKyNkZWZpbmUgWk1fQVVUSF9NT0RFX1dQQV9BVVRPICAgICAgICAgICAgICAgOQorI2RlZmluZSBaTV9BVVRIX01PREVfV1BBUFNLX0FVVE8gICAgICAgICAgICAxMAorCisvLyBFbmNyeXB0aW9uIG1vZGUKKyNkZWZpbmUgWk1fTk9fV0VQICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwCisjZGVmaW5lIFpNX0FFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NAorI2RlZmluZSBaTV9US0lQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIKKyNkZWZpbmUgWk1fV0VQNjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxCisjZGVmaW5lIFpNX1dFUDEyOCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NQorI2RlZmluZSBaTV9XRVAyNTYgICAgICAgICAgICAgICAgICAgICAgICAgICAweDYKKyNpZmRlZiBaTV9FTkFCTEVfQ0VOQworI2RlZmluZSBaTV9DRU5DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDcKKyNlbmRpZiAvL1pNX0VOQUJMRV9DRU5DCisKKy8qIEVuY3J5cHRpb24gdHlwZSBmb3Igd2VwIHN0YXR1cyAqLworI2RlZmluZSBaTV9FTkNSWVBUSU9OX1dFUF9ESVNBQkxFRCAgICAgICAgICAwCisjZGVmaW5lIFpNX0VOQ1JZUFRJT05fV0VQX0VOQUJMRUQgICAgICAgICAgIDEKKyNkZWZpbmUgWk1fRU5DUllQVElPTl9XRVBfS0VZX0FCU0VOVCAgICAgICAgMgorI2RlZmluZSBaTV9FTkNSWVBUSU9OX05PVF9TVVBQT1JURUQgICAgICAgICAzCisjZGVmaW5lIFpNX0VOQ1JZUFRJT05fVEtJUCAgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgWk1fRU5DUllQVElPTl9US0lQX0tFWV9BQlNFTlQgICAgICAgNQorI2RlZmluZSBaTV9FTkNSWVBUSU9OX0FFUyAgICAgICAgICAgICAgICAgICA2CisjZGVmaW5lIFpNX0VOQ1JZUFRJT05fQUVTX0tFWV9BQlNFTlQgICAgICAgIDcKKworI2lmZGVmIFpNX0VOQUJMRV9DRU5DCisjZGVmaW5lIFpNX0VOQ1JZUFRJT05fQ0VOQyAgICAgICAgICAgICAgICAgIDgKKyNlbmRpZiAvL1pNX0VOQUJMRV9DRU5DCisKKy8qIHNlY3VyaXR5IHR5cGUgKi8KKyNkZWZpbmUgWk1fU0VDVVJJVFlfVFlQRV9OT05FICAgICAgICAgICAgICAgMAorI2RlZmluZSBaTV9TRUNVUklUWV9UWVBFX1dFUCAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFpNX1NFQ1VSSVRZX1RZUEVfV1BBICAgICAgICAgICAgICAgIDIKKworI2lmZGVmIFpNX0VOQUJMRV9DRU5DCisjZGVmaW5lIFpNX1NFQ1VSSVRZX1RZUEVfQ0VOQyAgICAgICAgICAgICAgIDMKKyNlbmRpZiAvL1pNX0VOQUJMRV9DRU5DCisKKy8qIEVuY3J5cHRpb24gRXhlbXB0aW9uIEFjdGlvbiBUeXBlICAqLworI2RlZmluZSBaTV9FTkNSWVBUSU9OX0VYRU1QVF9OT19FWEVNUFRJT04gICAwCisjZGVmaW5lIFpNX0VOQ1JZUFRJT05fRVhFTVBUX0FMV0FZUyAgICAgICAgIDEKKworLyogTUlDIGZhaWx1cmUgKi8KKyNkZWZpbmUgWk1fTUlDX1BBSVJXSVNFX0VSUk9SICAgICAgICAgICAgICAgMHgwNgorI2RlZmluZSBaTV9NSUNfR1JPVVBfRVJST1IgICAgICAgICAgICAgICAgICAweDBFCisKKworLyogcG93ZXIgc2F2ZSBtb2RlICovCisjZGVmaW5lIFpNX1NUQV9QU19OT05FICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFpNX1NUQV9QU19NQVggICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFpNX1NUQV9QU19GQVNUICAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIFpNX1NUQV9QU19MSUdIVCAgICAgICAgICAgICAgICAgICAzCisKKy8qIFdNRSBBQyBUeXBlICovCisjZGVmaW5lIFpNX1dNRV9BQ19CSyAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgLyogQmFja2dyb3VuZCBBQyAqLworI2RlZmluZSBaTV9XTUVfQUNfQkUgICAgICAgICAgICAgICAgICAgICAgICAxICAgICAgIC8qIEJlc3QtZWZmb3J0IEFDICovCisjZGVmaW5lIFpNX1dNRV9BQ19WSURFTyAgICAgICAgICAgICAgICAgICAgIDIgICAgICAgLyogVmlkZW8gQUMgKi8KKyNkZWZpbmUgWk1fV01FX0FDX1ZPSUNFICAgICAgICAgICAgICAgICAgICAgMyAgICAgICAvKiBWb2ljZSBBQyAqLworCisvKiBQcmVhbWJsZSB0eXBlICovCisjZGVmaW5lIFpNX1BSRUFNQkxFX1RZUEVfQVVUTyAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgWk1fUFJFQU1CTEVfVFlQRV9MT05HICAgICAgICAgICAgICAgMQorI2RlZmluZSBaTV9QUkVBTUJMRV9UWVBFX1NIT1JUICAgICAgICAgICAgICAyCisKKy8qIHdpcmVsZXNzIG1vZGVzIGNvbnN0YW50cyAqLworI2RlZmluZSBaTV9XSVJFTEVTU19NT0RFXzVfNTQgICAgICAgIDB4MDEgICAvLy88IDUgR0h6IDU0IE1icHMKKyNkZWZpbmUgWk1fV0lSRUxFU1NfTU9ERV81XzEwOCAgICAgICAweDAyICAgLy8vPCA1IEdIeiAxMDggTWJwcworI2RlZmluZSBaTV9XSVJFTEVTU19NT0RFXzI0XzExICAgICAgIDB4MDQgICAvLy88IDIuNCBHSHogMTEgTWJwcworI2RlZmluZSBaTV9XSVJFTEVTU19NT0RFXzI0XzU0ICAgICAgIDB4MDggICAvLy88IDIuNCBHSHogNTQgTWJwcworI2RlZmluZSBaTV9XSVJFTEVTU19NT0RFXzI0XzEwOCAgICAgIDB4MTAgICAvLy88IDIuNCBHSHogMTA4IE1icHMKKyNkZWZpbmUgWk1fV0lSRUxFU1NfTU9ERV80OV8xMyAgICAgIDB4MTAwICAgLy8vPCA0LjkgR0h6IDEzLjUgTWJwcywgcXVhcnRlciByYXRlIGNobi1iYW5kd2lkdGggPSA1CisjZGVmaW5lIFpNX1dJUkVMRVNTX01PREVfNDlfMjcgICAgICAweDIwMCAgIC8vLzwgNC45IEdIeiAyNyBNYnBzLCBoYWxmIHJhdGUgY2huLWJhbmR3aWR0aCA9IDEwCisjZGVmaW5lIFpNX1dJUkVMRVNTX01PREVfNDlfNTQgICAgICAweDQwMCAgIC8vLzwgNC45IEdIeiA1NCBNYnBzLCBmdWxsIHJhdGUgY2huLWJhbmR3aWR0aCA9IDIwCisjZGVmaW5lIFpNX1dJUkVMRVNTX01PREVfNV8zMDAgICAgIDB4MTAwMCAgIC8vLzwgNSBHSHogMzAwIE1icHMKKyNkZWZpbmUgWk1fV0lSRUxFU1NfTU9ERV8yNF8zMDAgICAgMHgyMDAwICAgLy8vPCAyLjQgR0h6IDMwMCBNYnBzCisjZGVmaW5lIFpNX1dJUkVMRVNTX01PREVfNV8xMzAgICAgIDB4NDAwMCAgIC8vLzwgNSBHSHogMTMwIE1icHMKKyNkZWZpbmUgWk1fV0lSRUxFU1NfTU9ERV8yNF8xMzAgICAgMHg4MDAwICAgLy8vPCAyLjQgR0h6IDEzMCBNYnBzCisKKyNkZWZpbmUgWk1fV0lSRUxFU1NfTU9ERV8yNF9OICAgICAgKFpNX1dJUkVMRVNTX01PREVfMjRfMTMwfFpNX1dJUkVMRVNTX01PREVfMjRfMzAwKQorI2RlZmluZSBaTV9XSVJFTEVTU19NT0RFXzVfTiAgICAgICAoWk1fV0lSRUxFU1NfTU9ERV81XzEzMHxaTV9XSVJFTEVTU19NT0RFXzVfMzAwKQorI2RlZmluZSBaTV9XSVJFTEVTU19NT0RFXzI0ICAgICAgICAoWk1fV0lSRUxFU1NfTU9ERV8yNF8xMXxaTV9XSVJFTEVTU19NT0RFXzI0XzU0fFpNX1dJUkVMRVNTX01PREVfMjRfTikKKyNkZWZpbmUgWk1fV0lSRUxFU1NfTU9ERV81ICAgICAgICAgKFpNX1dJUkVMRVNTX01PREVfNV81NHxaTV9XSVJFTEVTU19NT0RFXzVfTikKKworLyogQWRIb2MgTW9kZSB3aXRoIGRpZmZlcmVudCBiYW5kICovCisjZGVmaW5lIFpNX0FESE9DQkFORF9BICAgICAgICAgMQorI2RlZmluZSBaTV9BREhPQ0JBTkRfQiAgICAgICAgIDIKKyNkZWZpbmUgWk1fQURIT0NCQU5EX0cgICAgICAgICAzCisjZGVmaW5lIFpNX0FESE9DQkFORF9CRyAgICAgICAgNAorI2RlZmluZSBaTV9BREhPQ0JBTkRfQUJHICAgICAgIDUKKworLyogQXV0aGVudGljYXRpb24gYWxnb3JpdGhtIGluIHRoZSBmaWVsZCBhbGdObyBvZiBhdXRoZW50aWNhdGlvbiBmcmFtZXMgKi8KKyNkZWZpbmUgWk1fQVVUSF9BTEdPX09QRU5fU1lTVEVNICAgICAgMHgxMDAwMCAgICAvKiBPcGVuIHN5c3RlbSAqLworI2RlZmluZSBaTV9BVVRIX0FMR09fU0hBUkVEX0tFWSAgICAgICAweDEwMDAxICAgIC8qIFNoYXJlZCBLZXkgKi8KKyNkZWZpbmUgWk1fQVVUSF9BTEdPX0xFQVAgICAgICAgICAgICAgMHgxMDA4MCAgICAvKiBMZWFwICovCisKK3N0cnVjdCB6c1NjYW5SZXN1bHQKK3sKKyAgICB1MzJfdCByZXNlcnZlZDsKK307CisKKworc3RydWN0IHpzU3Rhc3RpY3MKK3sKKyAgICB1MzJfdCByZXNlcnZlZDsKK307CisKKyNkZWZpbmUgWk1fTUFYX1NVUFBfUkFURVNfSUVfU0laRSAgICAgICAxMgorI2RlZmluZSBaTV9NQVhfSUVfU0laRSAgICAgICAgICAgICAgICAgIDUwIC8vMTAwCisjZGVmaW5lIFpNX01BWF9XUFNfSUVfU0laRSAgICAgICAgICAgICAgMTUwCisjZGVmaW5lIFpNX01BWF9QUk9CRV9GUkFNRV9CT0RZX1NJWkUgICAgNTEyLy8zMDAKKyNkZWZpbmUJWk1fTUFYX0NPVU5UUllfSU5GT19TSVpFCQkyMAorCisjZGVmaW5lIFpNX01BWF9TU0lEX0xFTkdUSCAgICAgICAgICAzMgorc3RydWN0IHpzQnNzSW5mbworeworICAgIHU4X3QgICBtYWNhZGRyWzZdOworICAgIHU4X3QgICBic3NpZFs2XTsKKyAgICB1OF90ICAgYmVhY29uSW50ZXJ2YWxbMl07CisgICAgdThfdCAgIGNhcGFiaWxpdHlbMl07CisgICAgdThfdCAgIHRpbWVTdGFtcFs4XTsKKyAgICB1OF90ICAgc3NpZFtaTV9NQVhfU1NJRF9MRU5HVEggKyAyXTsgICAvLyBFSUQoMSkgKyBMZW5ndGgoMSkgKyBTU0lEKDMyKQorICAgIHU4X3QgICBzdXBwb3J0ZWRSYXRlc1taTV9NQVhfU1VQUF9SQVRFU19JRV9TSVpFICsgMl07IC8vIEVJRCgxKSArIExlbmd0aCgxKSArIHN1cHBvcnRlZCByYXRlcyBbMTJdCisgICAgdThfdCAgIGNoYW5uZWw7CisgICAgdTE2X3QgIGZyZXF1ZW5jeTsKKyAgICB1MTZfdCAgYXRpbVdpbmRvdzsKKyAgICB1OF90ICAgZXJwOworICAgIHU4X3QgICBleHRTdXBwb3J0ZWRSYXRlc1taTV9NQVhfU1VQUF9SQVRFU19JRV9TSVpFICsgMl07IC8vIEVJRCgxKSArIExlbmd0aCgxKSArIGV4dGVuZGVkIHN1cHBvcnRlZCByYXRlcyBbMTJdCisgICAgdThfdCAgIHdwYUllW1pNX01BWF9JRV9TSVpFICsgMl07CisgICAgdThfdCAgIHdzY0llW1pNX01BWF9XUFNfSUVfU0laRSArIDJdOworICAgIHU4X3QgICByc25JZVtaTV9NQVhfSUVfU0laRSArIDJdOworI2lmZGVmIFpNX0VOQUJMRV9DRU5DCisgICAgdThfdCAgIGNlbmNJZVtaTV9NQVhfSUVfU0laRSArIDJdOyAvKiBDRU5DICovIC8qIGhhbGYgc2l6ZSBiZWNhdXNlIG9mIG1lbW9yeSBleGNlZWQgNjRrIGJvdW5kYXJ5ICovCisjZW5kaWYgLy9aTV9FTkFCTEVfQ0VOQworICAgIHU4X3QgICBzZWN1cml0eVR5cGU7CisgICAgdThfdCAgIHNpZ25hbFN0cmVuZ3RoOworICAgIHU4X3QgICBzaWduYWxRdWFsaXR5OworICAgIHUxNl90ICBzb3J0VmFsdWU7CisgICAgdThfdCAgIHdtZVN1cHBvcnQ7CisgICAgdThfdCAgIGZsYWc7CisgICAgdThfdCAgIEVuYWJsZUhUOworICAgIHU4X3QgICBlbmFibGVIVDQwOworICAgIHU4X3QgICBTRzQwOworICAgIHU4X3QgICBleHRDaE9mZnNldDsKKyAgICB1OF90ICAgYXBDYXA7IC8vIGJpdDA6MTFOIEFQCisgICAgdTE2X3QgIGZyYW1lQm9keXNpemU7CisgICAgdThfdCAgIGZyYW1lQm9keVtaTV9NQVhfUFJPQkVfRlJBTUVfQk9EWV9TSVpFXTsKKyAgICB1OF90ICAgY291bnRyeUluZm9bWk1fTUFYX0NPVU5UUllfSU5GT19TSVpFICsgMl07CisgICAgdTE2X3QgIGF0aE93bEFwOworICAgIHUxNl90ICBtYXJ2ZWxBcDsKKyAgICB1MTZfdCAgYnJvYWRjb21IVEFwOworICAgIHUzMl90ICB0aWNrOworICAgIHN0cnVjdCB6c0Jzc0luZm8qIG5leHQ7Cit9OworCitzdHJ1Y3QgenNCc3NMaXN0Cit7CisgICAgdThfdCBic3NDb3VudDsKKyAgICBzdHJ1Y3QgenNCc3NJbmZvKiBoZWFkOworICAgIHN0cnVjdCB6c0Jzc0luZm8qIHRhaWw7Cit9OworCitzdHJ1Y3QgenNCc3NMaXN0VjEKK3sKKyAgICB1OF90IGJzc0NvdW50OworICAgIHN0cnVjdCB6c0Jzc0luZm8gYnNzSW5mb1taTV9NQVhfQlNTXTsKK307CisKKyNkZWZpbmUgWk1fS0VZX0ZMQUdfR0sgICAgICAgICAgICAgICAgIDB4MDAwMQorI2RlZmluZSBaTV9LRVlfRkxBR19QSyAgICAgICAgICAgICAgICAgMFgwMDAyCisjZGVmaW5lIFpNX0tFWV9GTEFHX0FVVEhFTlRJQ0FUT1IgICAgICAweDAwMDQKKyNkZWZpbmUgWk1fS0VZX0ZMQUdfSU5JVF9JViAgICAgICAgICAgIDB4MDAwOAorI2RlZmluZSBaTV9LRVlfRkxBR19ERUZBVUxUX0tFWSAgICAgICAgMHgwMDEwCisKKyNpZmRlZiBaTV9FTkFCTEVfQ0VOQworI2RlZmluZSBaTV9LRVlfRkxBR19DRU5DICAgICAgICAgICAgICAgMHgwMDIwCisjZW5kaWYgLy9aTV9FTkFCTEVfQ0VOQworCisvLyBDb21tZW50OiBGb3IgVEtJUCwga2V5WzBdfmtleVsxNV0gID0+IFRLSVAga2V5CisvLyAgICAgICAgICAgICAgICAgICAga2V5WzE2XX5rZXlbMjNdID0+IFR4IE1JQyBrZXkKKy8vICAgICAgICAgICAgICAgICAgICBrZXlbMjRdfmtleVszMV0gPT4gUnggTUlDIGtleQorc3RydWN0IHpzS2V5SW5mbworeworICAgIHU4X3QqICAga2V5OworICAgIHU4X3QgICAga2V5TGVuZ3RoOworICAgIHU4X3QgICAga2V5SW5kZXg7CisgICAgdThfdCogICBpbml0SXY7CisgICAgdTE2X3QgICBmbGFnOworICAgIHU4X3QgICAgdmFwSWQ7CisgICAgdTE2X3QgICAgdmFwQWRkclszXTsKKyAgICB1MTZfdCogICBtYWNBZGRyOworfTsKKworCisKKy8qCisgKiBDaGFubmVscyBhcmUgc3BlY2lmaWVkIGJ5IGZyZXF1ZW5jeS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXUxNl90CWNoYW5uZWw7CS8qIHNldHRpbmcgaW4gTWh6ICovCisJdTMyX3QJY2hhbm5lbEZsYWdzOwkvKiBzZWUgYmVsb3cgKi8KKwl1OF90CXByaXZGbGFnczsKKwlzOF90CW1heFJlZ1R4UG93ZXI7CS8qIG1heCByZWd1bGF0b3J5IHR4IHBvd2VyIGluIGRCbSAqLworCXM4X3QJbWF4VHhQb3dlcjsJLyogbWF4IHRydWUgdHggcG93ZXIgaW4gMC4yNSBkQm0gKi8KKwlzOF90CW1pblR4UG93ZXI7CS8qIG1pbiB0cnVlIHR4IHBvd2VyIGluIDAuMjUgZEJtICovCit9IFpNX0hBTF9DSEFOTkVMOworCitzdHJ1Y3QgenNSZWd1bGF0aW9uVGFibGUKK3sKKyAgICB1MTZfdCAgIHJlZ2lvbkNvZGU7CisgICAgdTE2X3QgICBDdXJDaEluZGV4OworICAgIHUxNl90ICAgYWxsb3dDaGFubmVsQ250OworICAgIFpNX0hBTF9DSEFOTkVMICAgYWxsb3dDaGFubmVsWzYwXTsgICAvKiAyLjRHSHo6IDE0IGNoYW5uZWxzLCA1IEdIejogMzEgY2hhbm5lbHMgKi8KK307CisKK3N0cnVjdCB6c1BhcnRuZXJOb3RpZnlFdmVudAoreworICAgIHU4X3QgYnNzaWRbNl07ICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBCU1NJRCBvZiBJQlNTCisgICAgdThfdCBwZWVyTWFjQWRkcls2XTsgICAgICAgICAgICAgICAgLy8gVGhlIE1BQyBhZGRyZXNzIG9mIHBlZXIgc3RhdGlvbgorfTsKKworI2RlZmluZSBaTV9SQ19UUkFJTkVEX0JJVCAgIDB4MQorc3RydWN0IHpzUmNDZWxsCit7CisgICAgdTMyX3QgdHhDb3VudDsKKyAgICB1MzJfdCBmYWlsQ291bnQ7CisgICAgdThfdCBjdXJyZW50UmF0ZTsKKyAgICB1OF90IGN1cnJlbnRSYXRlSW5kZXg7CisgICAgdTMyX3QgcHJvYmluZ1RpbWU7CisgICAgdThfdCBvcGVyYXRpb25SYXRlU2V0WzI0XTsKKyAgICB1OF90IG9wZXJhdGlvblJhdGVDb3VudDsKKyAgICB1MTZfdCByeFJzc2k7CisgICAgdThfdCBmbGFnOworICAgIHUzMl90ICBsYXN0dHhDb3VudDsKKyAgICB1MzJfdCAgbGFzdFRpbWU7Cit9OworCitzdHJ1Y3QgenNPcHBvc2l0ZUluZm8KK3sKKyAgICB1OF90ICAgICAgICAgICAgbWFjQWRkcls2XTsKKyAgICBzdHJ1Y3QgenNSY0NlbGwgcmNDZWxsOworICAgIHU4X3QgICAgICAgICAgICB2YWxpZDsgICAgICAgICAgICAgIC8vIFRoaXMgaW5kaWNhdGUgaWYgdGhpcyBvcHBvc2l0ZSBpcyBzdGlsbCB2YWxpZAorICAgIHU4X3QgICAgICAgICAgICBhbGl2ZUNvdW50ZXI7CisgICAgdThfdCAgICAgICAgICAgIHBrSW5zdGFsbGVkOworCisjaWZkZWYgWk1fRU5BQkxFX0lCU1NfV1BBMlBTSworICAgIC8qIEZvciBXUEEyUFNLICEgKi8KKyAgICB1OF90IAkJCXdwYVN0YXRlOworICAgIHU4X3QgICAgICAgICAgICBjYW1JZHg7CisgICAgdThfdCAgICAgICAgICAgIGVuY3J5TW9kZTsKKyAgICB1MTZfdCAgICAgICAgICAgaXYxNjsKKyAgICB1MzJfdCAgICAgICAgICAgaXYzMjsKKyNlbmRpZgorfTsKKwordHlwZWRlZiB2b2lkICgqemZwSUJTU0l0ZXJhdGVQZWVyU3RhdGlvbkNiKSgKKyAgICB6ZGV2X3QqIGRldiwgc3RydWN0IHpzT3Bwb3NpdGVJbmZvICpwZWVySW5mbywgdm9pZCAqY3R4LCB1OF90IGluZGV4KTsKKwordHlwZWRlZiB1MTZfdCAoKnpmcFN0YVJ4U2VjdXJpdHlDaGVja0NiKSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpOworCisKKy8qIENvbW11bmljYXRpb24gVGFsbHkgZGF0YSBzdHJ1Y3R1cmUgKi8KK3N0cnVjdCB6c0NvbW1UYWxseQoreworICAgIHUzMl90IHR4VW5pY2FzdEZybTsJCSAgICAvLyAgMCB0eFVuaWNhc3RGcmFtZXMKKyAgICB1MzJfdCB0eE11bHRpY2FzdEZybTsJCS8vICAxIHR4TXVsdGljYXN0RnJhbWVzCisgICAgdTMyX3QgdHhVbmljYXN0T2N0ZXRzOwkgICAgLy8gIDIgdHhVbmlPY3RldHMgIGJ5dGUgc2l6ZQorICAgIHUzMl90IHR4TXVsdGljYXN0T2N0ZXRzOwkvLyAgMyB0eE11bHRpT2N0ZXRzICBieXRlIHNpemUKKyAgICB1MzJfdCB0eEZybVVwcGVyTkRJUzsgICAgICAgLy8gIDQKKyAgICB1MzJfdCB0eEZybURydk1ndDsgICAgICAgICAgLy8gIDUKKyAgICB1MzJfdCBSZXRyeUZhaWxDbnQ7CQkgICAgLy8gIDYKKyAgICB1MzJfdCBId19Ub3RhbFR4RnJtOwkJLy8gIDcgSGFyZHdhcmUgdG90YWwgVHggRnJhbWUKKyAgICB1MzJfdCBId19SZXRyeUNudDsJCSAgICAvLyAgOCB0eE11bHRpcGxlUmV0cmllc0ZyYW1lcworICAgIHUzMl90IEh3X1VuZGVycnVuQ250OyAgICAgICAvLyAgOQorCisgICAgdTMyX3QgRHJpdmVyUnhGcm1DbnQ7ICAgICAgIC8vIDEwCisgICAgdTMyX3QgcnhVbmljYXN0RnJtOwkJICAgIC8vIDExIHJ4VW5pY2FzdEZyYW1lcworICAgIHUzMl90IHJ4TXVsdGljYXN0RnJtOwkgICAgLy8gMTJyeE11bHRpY2FzdEZyYW1lcworCisgICAgdTMyX3QgTm90aWZ5TkRJU1J4RnJtQ250OyAgIC8vIDE0CisgICAgdTMyX3QgcnhVbmljYXN0T2N0ZXRzOwkvLyAxNSByeFVuaU9jdGV0cyAgYnl0ZSBzaXplCisgICAgdTMyX3QgcnhNdWx0aWNhc3RPY3RldHM7CSAgICAvLyAxNiByeE11bHRpT2N0ZXRzICBieXRlIHNpemUKKyAgICB1MzJfdCBEcml2ZXJEaXNjYXJkZWRGcm07ICAgICAgIC8vIDE3IERpc2NhcmQgYnkgVmFsaWRhdGVGcmFtZQorICAgIHUzMl90IExlc3NUaGFuRGF0YU1pbkxlbjsgICAgICAgLy8gMTgKKyAgICB1MzJfdCBHcmVhdGVyVGhhbk1heExlbjsgICAgICAgIC8vIDE5CisgICAgdTMyX3QgRHJpdmVyRGlzY2FyZGVkRnJtQ2F1c2VCeU11bHRpY2FzdExpc3Q7CisgICAgdTMyX3QgRHJpdmVyRGlzY2FyZGVkRnJtQ2F1c2VCeUZybUN0cmw7CisgICAgdTMyX3QgcnhOZWVkRnJnRnJtOwkJICAgIC8vIDIyIG5lZWQgbW9yZSBmcmcgZnJtCisgICAgdTMyX3QgRHJpdmVyUnhNZ3RGcm1DbnQ7CisgICAgdTMyX3QgcnhCcm9hZGNhc3RGcm07CSAgICAvLyAyNCBSZWNlaXZlIGJyb2FkY2FzdCBmcmFtZSBjb3VudAorICAgIHUzMl90IHJ4QnJvYWRjYXN0T2N0ZXRzOwkvLyAyNSBSZWNlaXZlIGJyb2FkY2FzdCBmcmFtZSBieXRlIHNpemUKKyAgICB1MzJfdCByeDExYkRhdGFGcmFtZTsJCS8vIDI2IE1lYXN1cmVkIHF1YWxpdHkgMTFiIGRhdGEgZnJhbWUgY291bnQKKyAgICB1MzJfdCByeE9GRE1EYXRhRnJhbWU7CSAgICAvLyAyNyBNZWFzdXJlZCBxdWFsaXR5IDExZyBkYXRhIGZyYW1lIGNvdW50CisKKworICAgIHUzMl90IEh3X1RvdGFsUnhGcm07ICAgICAgICAvLyAyOAorICAgIHUzMl90IEh3X0NSQzE2Q250OwkJICAgIC8vIDI5IHJ4UExDUENSQ0VyckNudAorICAgIHUzMl90IEh3X0NSQzMyQ250OwkJICAgIC8vIDMwIHJ4Q1JDMzJFcnJDbnQKKyAgICB1MzJfdCBId19EZWNyeXBFcnJfVU5JOyAgICAgLy8gMzEKKyAgICB1MzJfdCBId19EZWNyeXBFcnJfTXVsOyAgICAgLy8gMzIKKworICAgIHUzMl90IEh3X1J4RklGT092ZXJydW47ICAgICAvLyAzNAorICAgIHUzMl90IEh3X1J4VGltZU91dDsgICAgICAgICAvLyAzNQorICAgIHUzMl90IExvc3NBUDsgICAgICAgICAgICAgICAvLyAzNgorCisgICAgdTMyX3QgVHhfTVBEVTsgICAgICAgICAgICAgIC8vIDM3CisgICAgdTMyX3QgQkFfRmFpbDsgICAgICAgICAgICAgIC8vIDM4CisgICAgdTMyX3QgSHdfVHhfQU1QRFU7ICAgICAgICAgIC8vIDM5CisgICAgdTMyX3QgSHdfVHhfTVBEVTsgICAgICAgICAgIC8vIDQwCisKKyAgICB1MzJfdCBSYXRlQ3RybFR4TVBEVTsKKyAgICB1MzJfdCBSYXRlQ3RybEJBRmFpbDsKKworICAgIHUzMl90IHR4UW9zRHJvcENvdW50WzVdOyAgICAvLzQxIDQyIDQzIDQ0IDQ1CisKKwl1MzJfdCBId19SeE1QRFU7ICAgICAgICAgICAgLy8gNDYKKwl1MzJfdCBId19SeERyb3BNUERVOyAgICAgICAgLy8gNDcKKwl1MzJfdCBId19SeERlbE1QRFU7ICAgICAgICAgLy8gNDgKKworCXUzMl90IEh3X1J4UGh5TWlzY0Vycm9yOyAgICAvLyA0OQorCXUzMl90IEh3X1J4UGh5WFJFcnJvcjsgICAgICAvLyA1MAorICAgIHUzMl90IEh3X1J4UGh5T0ZETUVycm9yOyAgICAvLyA1MQorICAgIHUzMl90IEh3X1J4UGh5Q0NLRXJyb3I7ICAgICAvLyA1MgorICAgIHUzMl90IEh3X1J4UGh5SFRFcnJvcjsgICAgICAvLyA1MworICAgIHUzMl90IEh3X1J4UGh5VG90YWxDb3VudDsgICAvLyA1NAorCisgICAgdTMyX3Qgc3dSeEZyYWdtZW50Q291bnQ7ICAgICAgICAgLy8gNTUKKyAgICB1MzJfdCBzd1J4VW5pY2FzdE1pY0ZhaWxDb3VudDsgICAvLyA1NgorICAgIHUzMl90IHN3UnhNdWx0aWNhc3RNaWNGYWlsQ291bnQ7IC8vIDU3CisgICAgdTMyX3Qgc3dSeERyb3BVbmVuY3J5cHRlZENvdW50OyAgLy8gNTgKKworICAgIHUzMl90IHR4QnJvYWRjYXN0RnJtOworICAgIHUzMl90IHR4QnJvYWRjYXN0T2N0ZXRzOworfTsKKworLyogVHJhZmZpYyBNb25pdG9yIFRhbGx5IGRhdGEgc3RydWN0dXJlICovCitzdHJ1Y3QgenNUcmFmVGFsbHkKK3sKKyAgICB1MzJfdCByeER1cGxpY2F0ZTsKKyAgICB1MzJfdCByeFNyY0lzT3duTWFjOworICAgIC8vdTMyX3QgcnhEYXRhRnJhbWVDb3VudDsKKyAgICAvL3UzMl90IHJ4RGF0YUJ5dGVDb3VudDsKKyAgICAvL3UzMl90IHJ4RGF0YUJ5dGVzSW4xMDAwbXM7CisgICAgLy91MzJfdCByeERhdGFUbXBGb3IxMDAwbXM7CisgICAgLy91MzJfdCByeERhdGFCeXRlc0luMjAwMG1zOworICAgIC8vdTMyX3QgcnhEYXRhVG1wRm9yMjAwMG1zOworCisgICAgLy91MzJfdCB0eERhdGFGcmFtZUNvdW50OworICAgIC8vdTMyX3QgdHhEYXRhQnl0ZUNvdW50OworICAgIC8vdTMyX3QgdHhEYXRhQnl0ZXNJbjEwMDBtczsKKyAgICAvL3UzMl90IHR4RGF0YVRtcEZvcjEwMDBtczsKKyAgICB1MzJfdCB0eERhdGFCeXRlc0luMjAwMG1zOworICAgIHUzMl90IHR4RGF0YVRtcEZvcjIwMDBtczsKK307CisKKy8qIEhhbCByeCBwYWNrZXQgbW9uaXRlciBpbmZvcm1hdGlvbiAqLworc3RydWN0IHpzTW9uSGFsUnhJbmZvCit7CisgICAgdTMyX3QgY3VycmVudFJTU0lbN107CisgICAgdTMyX3QgY3VycmVudFJ4RVZNWzE0XTsKKyAgICB1MzJfdCBjdXJyZW50UnhEYXRhTVQ7CisgICAgdTMyX3QgY3VycmVudFJ4RGF0YU1DUzsKKyAgICB1MzJfdCBjdXJyZW50UnhEYXRhQlc7CisgICAgdTMyX3QgY3VycmVudFJ4RGF0YVNHOworfTsKKworc3RydWN0IHpzVGFpbAoreworICAgIHU4X3QgU2lnbmFsU3RyZW5ndGgxOworICAgIHU4X3QgU2lnbmFsU3RyZW5ndGgyOworICAgIHU4X3QgU2lnbmFsU3RyZW5ndGgzOworICAgIHU4X3QgU2lnbmFsUXVhbGl0eTsKKyAgICB1OF90IFNBSW5kZXg7CisgICAgdThfdCBEQUluZGV4OworICAgIHU4X3QgRXJyb3JJbmRpY2F0aW9uOworICAgIHU4X3QgUnhNYWNTdGF0dXM7Cit9OworCit1bmlvbiB6dVRhaWwKK3sKKyAgICBzdHJ1Y3QgenNUYWlsIERhdGE7CisgICAgdThfdCBCeXRlWzhdOworfTsKKworc3RydWN0IHpzQWRkaXRpb25JbmZvCit7CisgICAgdThfdCBQbGNwSGVhZGVyWzEyXTsKKyAgICB1bmlvbiB6dVRhaWwgICBUYWlsOworfTsKKworCitzdHJ1Y3QgenNQbWtpZEJzc2lkSW5mbworeworICAgIHUxNl90ICAgICAgYnNzaWRbM107CisgICAgdThfdCAgICAgICBwbWtpZFsxNl07Cit9OworCitzdHJ1Y3QgenNQbWtpZEluZm8KK3sKKwkgICB1MzJfdAkJYnNzaWRDb3VudDsKKwkgICBzdHJ1Y3QgenNQbWtpZEJzc2lkSW5mbwlic3NpZEluZm9bWk1fUE1LSURfTUFYX0JTU19DTlRdOworfTsKKworCitzdHJ1Y3QgenNDYkZ1bmNUYmwKK3sKKyAgICB1MTZfdCAoKnpmY2JBdXRoTm90aWZ5KSh6ZGV2X3QqIGRldiwgdTE2X3QqIG1hY0FkZHIpOworICAgIHUxNl90ICgqemZjYkFzb2NOb3RpZnkpKHpkZXZfdCogZGV2LCB1MTZfdCogbWFjQWRkciwgdThfdCogYm9keSwKKyAgICAgICAgICAgIHUxNl90IGJvZHlTaXplLCB1MTZfdCBwb3J0KTsKKyAgICB1MTZfdCAoKnpmY2JEaXNBc29jTm90aWZ5KSh6ZGV2X3QqIGRldiwgdThfdCogbWFjQWRkciwgdTE2X3QgcG9ydCk7CisgICAgdTE2X3QgKCp6ZmNiQXBDb25uZWN0Tm90aWZ5KSh6ZGV2X3QqIGRldiwgdThfdCogbWFjQWRkciwgdTE2X3QgcG9ydCk7CisgICAgdm9pZCAoKnpmY2JDb25uZWN0Tm90aWZ5KSh6ZGV2X3QqIGRldiwgdTE2X3Qgc3RhdHVzLCB1MTZfdCogYnNzaWQpOworICAgIHZvaWQgKCp6ZmNiU2Nhbk5vdGlmeSkoemRldl90KiBkZXYsIHN0cnVjdCB6c1NjYW5SZXN1bHQqIHJlc3VsdCk7CisgICAgdm9pZCAoKnpmY2JNaWNGYWlsdXJlTm90aWZ5KSh6ZGV2X3QqIGRldiwgdTE2X3QqIGFkZHIsIHUxNl90IHN0YXR1cyk7CisgICAgdm9pZCAoKnpmY2JBcE1pY0ZhaWx1cmVOb3RpZnkpKHpkZXZfdCogZGV2LCB1OF90KiBhZGRyLCB6YnVmX3QqIGJ1Zik7CisgICAgdm9pZCAoKnpmY2JJYnNzUGFydG5lck5vdGlmeSkoemRldl90KiBkZXYsIHUxNl90IHN0YXR1cywKKyAgICAgICAgICAgIHN0cnVjdCB6c1BhcnRuZXJOb3RpZnlFdmVudCAqZXZlbnQpOworICAgIHZvaWQgKCp6ZmNiTWFjQWRkcmVzc05vdGlmeSkoemRldl90KiBkZXYsIHU4X3QqIGFkZHIpOworICAgIHZvaWQgKCp6ZmNiU2VuZENvbXBsZXRlSW5kaWNhdGlvbikoemRldl90KiBkZXYsIHpidWZfdCogYnVmKTsKKyAgICB2b2lkICgqemZjYlJlY3ZFdGgpKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3QgcG9ydCk7CisgICAgdm9pZCAoKnpmY2JSZWN2ODAyMTEpKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1Ziwgc3RydWN0IHpzQWRkaXRpb25JbmZvKiBhZGRJbmZvKTsKKyAgICB2b2lkICgqemZjYlJlc3RvcmVCdWZEYXRhKSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpOworI2lmZGVmIFpNX0VOQUJMRV9DRU5DCisgICAgdTE2X3QgKCp6ZmNiQ2VuY0Fzb2NOb3RpZnkpKHpkZXZfdCogZGV2LCB1MTZfdCogbWFjQWRkciwgdThfdCogYm9keSwKKyAgICAgICAgICAgIHUxNl90IGJvZHlTaXplLCB1MTZfdCBwb3J0KTsKKyNlbmRpZiAvL1pNX0VOQUJMRV9DRU5DCisgICAgdThfdCAoKnpmY2JDbGFzc2lmeVR4UGFja2V0KSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpOworCisgICAgdm9pZCAoKnpmY2JId1dhdGNoRG9nTm90aWZ5KSh6ZGV2X3QqIGRldik7Cit9OworCitleHRlcm4gdm9pZCB6Zlplcm9NZW1vcnkodThfdCogdmEsIHUxNl90IGxlbmd0aCk7CisjZGVmaW5lIFpNX0lOSVRfQ0JfRlVOQ19UQUJMRShwKSAgICAgICAgemZaZXJvTWVtb3J5KCh1OF90ICopcCwgc2l6ZW9mKHN0cnVjdCB6c0NiRnVuY1RibCkpOworCisvL2V4dGVybiBzdHJ1Y3QgenNXbGFuRGV2IHpnV2xhbkRldjsKKworLyogSW5pdGlhbGl6ZSBXTEFOIGhhcmR3YXJlIGFuZCBzb2Z0d2FyZSwgcmVzb3VyY2Ugd2lsbCBiZSBhbGxvY2F0ZWQgKi8KKy8qIGZvciBXTEFOIG9wZXJhdGlvbiwgbXVzdCBiZSBjYWxsZWQgZmlyc3QgYmVmb3JlIG90aGVyIGZ1bmN0aW9uLiAgICovCitleHRlcm4gdTE2X3QgemZpV2xhbk9wZW4oemRldl90KiBkZXYsIHN0cnVjdCB6c0NiRnVuY1RibCogY2JGdW5jVGJsKTsKKworLyogV0xBTiBoYXJkd2FyZSB3aWxsIGJlIHNodXRkb3duIGFuZCBhbGwgcmVzb3VyY2Ugd2lsbCBiZSByZWxlYXNlICovCitleHRlcm4gdTE2X3QgemZpV2xhbkNsb3NlKHpkZXZfdCogZGV2KTsKKworLyogRW5hYmxlL2Rpc2FibGUgV2xhbiBvcGVyYXRpb24gKi8KK2V4dGVybiB1MTZfdCB6ZmlXbGFuRW5hYmxlKHpkZXZfdCogZGV2KTsKK2V4dGVybiB1MTZfdCB6ZmlXbGFuRGlzYWJsZSh6ZGV2X3QqIGRldiwgdThfdCBSZXNldEtleUNhY2hlKTsKK2V4dGVybiB1MTZfdCB6ZmlXbGFuUmVzdW1lKHpkZXZfdCogZGV2LCB1OF90IGRvUmVjb25uKTsKK2V4dGVybiB1MTZfdCB6ZmlXbGFuU3VzcGVuZCh6ZGV2X3QqIGRldik7CisKKy8qIEVuYWJsZS9kaXNhYmxlIElTUiBpbnRlcnJ1cHQgKi8KK2V4dGVybiB1MTZfdCB6ZmlXbGFuSW50ZXJydXB0RW5hYmxlKHpkZXZfdCogZGV2KTsKK2V4dGVybiB1MTZfdCB6ZmlXbGFuSW50ZXJydXB0RGlzYWJsZSh6ZGV2X3QqIGRldik7CisKKy8qIERvIFdMQU4gc2l0ZSBzdXJ2ZXkgKi8KK2V4dGVybiB1MTZfdCB6ZmlXbGFuU2Nhbih6ZGV2X3QqIGRldik7CisKKy8qIEdldCBXTEFOIHN0YXN0aWNzICovCitleHRlcm4gdTE2X3QgemZpV2xhbkdldFN0YXRpc3RpY3MoemRldl90KiBkZXYpOworCisvKiBSZXNldCBXTEFOICovCitleHRlcm4gdTE2X3QgemZpV2xhblJlc2V0KHpkZXZfdCogZGV2KTsKKworLyogRGVhdXRoZW50aWNhdGUgYSBTVEEgKi8KK2V4dGVybiB1MTZfdCB6ZmlXbGFuRGVhdXRoKHpkZXZfdCogZGV2LCB1MTZfdCogbWFjQWRkciwgdTE2X3QgcmVhc29uKTsKKworZXh0ZXJuIHUxNl90IHpmaVR4U2VuZEV0aCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IHBvcnQpOworZXh0ZXJuIHU4X3QgemZpSXNUeFF1ZXVlRnVsbCh6ZGV2X3QqIGRldik7CitleHRlcm4gdTE2X3QgemZpVHhTZW5kODAyMTFNZ210KHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3QgcG9ydCk7CisKK2V4dGVybiB2b2lkIHpmaUlzclBjaSh6ZGV2X3QqIGRldik7CisKK2V4dGVybiB1OF90IHpmaVdsYW5JQlNTR2V0UGVlclN0YXRpb25zQ291bnQoemRldl90KiBkZXYpOworZXh0ZXJuIHU4X3QgemZpV2xhbklCU1NJdGVyYXRlUGVlclN0YXRpb25zKHpkZXZfdCogZGV2LCB1OF90IG51bVRvSXRlcmF0ZSwgemZwSUJTU0l0ZXJhdGVQZWVyU3RhdGlvbkNiIGNhbGxiYWNrLCB2b2lkICpjdHgpOworZXh0ZXJuIHZvaWQgemZpV2xhbkZsdXNoQWxsUXVldWVkQnVmZmVycyh6ZGV2X3QqIGRldik7CisKKy8qIGNvaWQuYyAqLworZXh0ZXJuIHZvaWQgemZpV2xhblF1ZXJ5TWFjQWRkcmVzcyh6ZGV2X3QqIGRldiwgdThfdCogYWRkcik7CisKK2V4dGVybiB1MTZfdCB6ZmlHbG9iYWxEYXRhU2l6ZSh6ZGV2X3QqIGRldik7CisKK2V4dGVybiB2b2lkIHpmaUhlYXJ0QmVhdCh6ZGV2X3QqIGRldik7CisKK2V4dGVybiB2b2lkIHpmaVdsYW5TZXRXbGFuTW9kZSh6ZGV2X3QqIGRldiwgdThfdCB3bGFuTW9kZSk7CitleHRlcm4gdm9pZCB6ZmlXbGFuU2V0QXV0aGVudGljYXRpb25Nb2RlKHpkZXZfdCogZGV2LCB1OF90IGF1dGhNb2RlKTsKK2V4dGVybiB2b2lkIHpmaVdsYW5TZXRXZXBTdGF0dXMoemRldl90KiBkZXYsIHU4X3Qgd2VwU3RhdHVzKTsKK2V4dGVybiB2b2lkIHpmaVdsYW5TZXRTU0lEKHpkZXZfdCogZGV2LCB1OF90KiBzc2lkLCB1OF90IHNzaWRMZW5ndGgpOworZXh0ZXJuIHZvaWQgemZpV2xhblNldEZyYWdUaHJlc2hvbGQoemRldl90KiBkZXYsIHUxNl90IGZyYWdUaHJlc2hvbGQpOworZXh0ZXJuIHZvaWQgemZpV2xhblNldFJ0c1RocmVzaG9sZCh6ZGV2X3QqIGRldiwgdTE2X3QgcnRzVGhyZXNob2xkKTsKK2V4dGVybiB2b2lkIHpmaVdsYW5TZXRGcmVxdWVuY3koemRldl90KiBkZXYsIHUzMl90IGZyZXF1ZW5jeSwgdThfdCBiSW1tZWRpYXRlKTsKK2V4dGVybiB2b2lkIHpmaVdsYW5TZXRCc3NpZCh6ZGV2X3QqIGRldiwgdThfdCogYnNzaWQpOworZXh0ZXJuIHZvaWQgemZpV2xhblNldEJlYWNvbkludGVydmFsKHpkZXZfdCogZGV2LCB1MTZfdCBiZWFjb25JbnRlcnZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHU4X3QgYkltbWVkaWF0ZSk7CitleHRlcm4gdm9pZCB6ZmlXbGFuU2V0RHRpbUNvdW50KHpkZXZfdCogZGV2LCB1OF90ICBkdGltKTsKK2V4dGVybiB2b2lkIHpmaVdsYW5TZXRBdGltV2luZG93KHpkZXZfdCogZGV2LCB1MTZfdCBhdGltV2luZG93LCB1OF90IGJJbW1lZGlhdGUpOworZXh0ZXJuIHZvaWQgemZpV2xhblNldEVuY3J5TW9kZSh6ZGV2X3QqIGRldiwgdThfdCBlbmNyeU1vZGUpOworZXh0ZXJuIHU4X3QgemZpV2xhblNldEtleSh6ZGV2X3QqIGRldiwgc3RydWN0IHpzS2V5SW5mbyBrZXlJbmZvKTsKK2V4dGVybiB1OF90IHpmaVdsYW5QU0VVRE9TZXRLZXkoemRldl90KiBkZXYsIHN0cnVjdCB6c0tleUluZm8ga2V5SW5mbyk7CitleHRlcm4gdm9pZCB6ZmlXbGFuU2V0UG93ZXJTYXZlTW9kZSh6ZGV2X3QqIGRldiwgdThfdCBtb2RlKTsKK2V4dGVybiB2b2lkIHpmaVdsYW5RdWVyeUJzc0xpc3RWMSh6ZGV2X3QqIGRldiwgc3RydWN0IHpzQnNzTGlzdFYxKiBic3NMaXN0VjEpOworZXh0ZXJuIHZvaWQgemZpV2xhblF1ZXJ5QnNzTGlzdCh6ZGV2X3QqIGRldiwgc3RydWN0IHpzQnNzTGlzdCogcEJzc0xpc3QpOworZXh0ZXJuIHZvaWQgemZpV2xhblNldFByb3RlY3Rpb25Nb2RlKHpkZXZfdCogZGV2LCB1OF90IG1vZGUpOworZXh0ZXJuIHZvaWQgemZpV2xhbkZsdXNoQnNzTGlzdCh6ZGV2X3QqIGRldik7CisKK3ZvaWQgemZpV2xhbkRpc2FibGVEZnNDaGFubmVsKHpkZXZfdCogZGV2LCB1OF90IGRpc2FibGVGbGFnKTsKKworZXh0ZXJuIHU4X3QgemZpV2xhblF1ZXJ5V2xhbk1vZGUoemRldl90KiBkZXYpOworZXh0ZXJuIHUxNl90IHpmaVdsYW5DaGFubmVsVG9GcmVxdWVuY3koemRldl90KiBkZXYsIHU4X3QgY2hhbm5lbCk7CitleHRlcm4gdThfdCB6ZmlXbGFuRnJlcXVlbmN5VG9DaGFubmVsKHpkZXZfdCogZGV2LCB1MTZfdCBmcmVxKTsKKworI2RlZmluZSBaTV9XTEFOX1NUQVRFX09QRU5FRCAgICAgICAgMAorI2RlZmluZSBaTV9XTEFOX1NUQVRFX0VOQUJMRUQgICAgICAgMQorI2RlZmluZSBaTV9XTEFOX1NUQVRFX0RJU0FCTEVEICAgICAgMgorI2RlZmluZSBaTV9XTEFOX1NUQVRFX0NMT1NFREVEICAgICAgMworZXh0ZXJuIHU4X3QgemZpV2xhblF1ZXJ5QWRhcHRlclN0YXRlKHpkZXZfdCogZGV2KTsKK2V4dGVybiB1OF90IHpmaVdsYW5RdWVyeUF1dGhlbnRpY2F0aW9uTW9kZSh6ZGV2X3QqIGRldiwgdThfdCBiV3JhcHBlcik7CitleHRlcm4gdThfdCB6ZmlXbGFuUXVlcnlXZXBTdGF0dXMoemRldl90KiBkZXYsIHU4X3QgYldyYXBwZXIpOworZXh0ZXJuIHZvaWQgemZpV2xhblF1ZXJ5U1NJRCh6ZGV2X3QqIGRldiwgdThfdCogc3NpZCwgdThfdCogcFNzaWRMZW5ndGgpOworZXh0ZXJuIHUxNl90IHpmaVdsYW5RdWVyeUZyYWdUaHJlc2hvbGQoemRldl90KiBkZXYpOworZXh0ZXJuIHUxNl90IHpmaVdsYW5RdWVyeVJ0c1RocmVzaG9sZCh6ZGV2X3QqIGRldik7CitleHRlcm4gdTMyX3QgemZpV2xhblF1ZXJ5RnJlcXVlbmN5KHpkZXZfdCogZGV2KTsKK2V4dGVybiB1MzJfdCB6ZmlXbGFuUXVlcnlDdXJyZW50RnJlcXVlbmN5KHpkZXZfdCogZGV2LCB1OF90IHFtb2RlKTsKK2V4dGVybiB1MzJfdCB6ZmlXbGFuUXVlcnlGcmVxdWVuY3lBdHRyaWJ1dGUoemRldl90KiBkZXYsIHUzMl90IGZyZXF1ZW5jeSk7CitleHRlcm4gdm9pZCB6ZmlXbGFuUXVlcnlGcmVxdWVuY3lIVCh6ZGV2X3QqIGRldiwgdTMyX3QgKmJhbmRXaWR0aCwgdTMyX3QgKmV4dE9mZnNldCk7CitleHRlcm4gdThfdCB6ZmlXbGFuUXVlcnlDV01vZGUoemRldl90KiBkZXYpOworZXh0ZXJuIHUzMl90IHpmaVdsYW5RdWVyeUNXRW5hYmxlKHpkZXZfdCogZGV2KTsKK2V4dGVybiB2b2lkIHpmaVdsYW5RdWVyeUJzc2lkKHpkZXZfdCogZGV2LCB1OF90KiBic3NpZCk7CitleHRlcm4gdTE2X3QgemZpV2xhblF1ZXJ5QmVhY29uSW50ZXJ2YWwoemRldl90KiBkZXYpOworZXh0ZXJuIHUzMl90IHpmaVdsYW5RdWVyeVJ4QmVhY29uVG90YWwoemRldl90KiBkZXYpOworZXh0ZXJuIHUxNl90IHpmaVdsYW5RdWVyeUF0aW1XaW5kb3coemRldl90KiBkZXYpOworZXh0ZXJuIHU4X3QgemZpV2xhblF1ZXJ5RW5jcnlNb2RlKHpkZXZfdCogZGV2KTsKK2V4dGVybiB1MTZfdCB6ZmlXbGFuUXVlcnlDYXBhYmlsaXR5KHpkZXZfdCogZGV2KTsKK2V4dGVybiB1MTZfdCB6ZmlXbGFuUXVlcnlBaWQoemRldl90KiBkZXYpOworZXh0ZXJuIHZvaWQgemZpV2xhblF1ZXJ5U3VwcG9ydFJhdGUoemRldl90KiBkZXYsIHU4X3QqIHJhdGVBcnJheSwgdThfdCogcExlbmd0aCk7CitleHRlcm4gdm9pZCB6ZmlXbGFuUXVlcnlFeHRTdXBwb3J0UmF0ZSh6ZGV2X3QqIGRldiwgdThfdCogcmF0ZUFycmF5LCB1OF90KiBwTGVuZ3RoKTsKK2V4dGVybiB2b2lkIHpmaVdsYW5RdWVyeVJzbkllKHpkZXZfdCogZGV2LCB1OF90KiBpZSwgdThfdCogcExlbmd0aCk7CitleHRlcm4gdm9pZCB6ZmlXbGFuUXVlcnlXcGFJZSh6ZGV2X3QqIGRldiwgdThfdCogaWUsIHU4X3QqIHBMZW5ndGgpOworZXh0ZXJuIHU4X3QgemZpV2xhblF1ZXJ5SFRNb2RlKHpkZXZfdCogZGV2KTsKK2V4dGVybiB1OF90IHpmaVdsYW5RdWVyeUJhbmRXaWR0aDQwKHpkZXZfdCogZGV2KTsKK2V4dGVybiB1OF90IHpmaVdsYW5RdWVyeU11bHRpY2FzdENpcGhlckFsZ28oemRldl90ICpkZXYpOworZXh0ZXJuIHUxNl90IHpmaVdsYW5RdWVyeVJlZ2lvbkNvZGUoemRldl90KiBkZXYpOworZXh0ZXJuIHZvaWQgemZpV2xhblNldFdwYUllKHpkZXZfdCogZGV2LCB1OF90KiBpZSwgdThfdCBMZW5ndGgpOworZXh0ZXJuIHZvaWQgemZpV2xhblNldFdwYVN1cHBvcnQoemRldl90KiBkZXYsIHU4X3QgV3BhU3VwcG9ydCk7CitleHRlcm4gdm9pZCB6ZmlXbGFuQ2hlY2tTdGFXcGFJZSh6ZGV2X3QqIGRldik7CitleHRlcm4gdm9pZCB6ZmlXbGFuU2V0QmFzaWNSYXRlKHpkZXZfdCogZGV2LCB1OF90IGJSYXRlU2V0LCB1OF90IGdSYXRlU2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl90IG5SYXRlU2V0KTsKK2V4dGVybiB2b2lkIHpmaVdsYW5TZXRCR01vZGUoemRldl90KiBkZXYsIHU4X3QgbW9kZSk7CitleHRlcm4gdm9pZCB6ZmlXbGFuU2V0cHJlYW1ibGVUeXBlKHpkZXZfdCogZGV2LCB1OF90IHR5cGUpOworZXh0ZXJuIHU4X3QgemZpV2xhblF1ZXJ5cHJlYW1ibGVUeXBlKHpkZXZfdCogZGV2KTsKK2V4dGVybiB1OF90IHpmaVdsYW5RdWVyeVBvd2VyU2F2ZU1vZGUoemRldl90KiBkZXYpOworZXh0ZXJuIHZvaWQgemZpV2xhblNldE1hY0FkZHJlc3MoemRldl90KiBkZXYsIHUxNl90KiBtYWMpOworZXh0ZXJuIHUxNl90IHpmaVdsYW5TZXRUeFJhdGUoemRldl90KiBkZXYsIHUxNl90IHJhdGUpOworZXh0ZXJuIHUzMl90IHpmaVdsYW5RdWVyeVR4UmF0ZSh6ZGV2X3QqIGRldik7CitleHRlcm4gdm9pZCB6ZldsYW5VcGRhdGVSeFJhdGUoemRldl90KiBkZXYsIHN0cnVjdCB6c0FkZGl0aW9uSW5mbyogYWRkSW5mbyk7CitleHRlcm4gdTMyX3QgemZpV2xhblF1ZXJ5UnhSYXRlKHpkZXZfdCogZGV2KTsKK2V4dGVybiB1OF90IHpmaVdsYW5TZXRQbWtpZEluZm8oemRldl90KiBkZXYsIHUxNl90KiBic3NpZCwgdThfdCogcG1raWQpOworZXh0ZXJuIHUzMl90IHpmaVdsYW5RdWVyeVBta2lkSW5mbyh6ZGV2X3QqIGRldiwgdThfdCogYnVmLCB1MzJfdCBsZW4pOworZXh0ZXJuIHZvaWQgemZpV2xhblNldEFsbE11bHRpY2FzdCh6ZGV2X3QqIGRldiwgdTMyX3Qgc2V0dGluZyk7CitleHRlcm4gdm9pZCB6ZmlXbGFuU2V0SFRDdHJsKHpkZXZfdCogZGV2LCB1MzJfdCAqc2V0dGluZywgdTMyX3QgZm9yY2VUeFRQQyk7CitleHRlcm4gdm9pZCB6ZmlXbGFuUXVlcnlIVEN0cmwoemRldl90KiBkZXYsIHUzMl90ICpzZXR0aW5nLCB1MzJfdCAqZm9yY2VUeFRQQyk7CitleHRlcm4gdm9pZCB6ZmlXbGFuRGJnKHpkZXZfdCogZGV2LCB1OF90IHNldHRpbmcpOworCitleHRlcm4gdm9pZCB6ZmlXbGFuUmVzZXRUYWxseSh6ZGV2X3QqIGRldik7CitleHRlcm4gdm9pZCB6ZmlXbGFuUXVlcnlUYWxseSh6ZGV2X3QqIGRldiwgc3RydWN0IHpzQ29tbVRhbGx5ICp0YWxseSk7CitleHRlcm4gdm9pZCB6ZmlXbGFuUXVlcnlUcmFmVGFsbHkoemRldl90KiBkZXYsIHN0cnVjdCB6c1RyYWZUYWxseSAqdGFsbHkpOworZXh0ZXJuIHZvaWQgemZpV2xhblF1ZXJ5TW9uSGFsUnhJbmZvKHpkZXZfdCogZGV2LCBzdHJ1Y3QgenNNb25IYWxSeEluZm8gKmhhbFJ4SW5mbyk7CisKK2V4dGVybiB1MzJfdCB6ZmlGV0NvbmZpZyh6ZGV2X3QqIGRldiwgdTMyX3Qgc2l6ZSk7CisKK2V4dGVybiB2b2lkIHpmaURLRW5hYmxlKHpkZXZfdCogZGV2LCB1MzJfdCBlbmFibGUpOworCitleHRlcm4gdm9pZCB6ZmlXbGFuU2V0TXVsdGljYXN0TGlzdCh6ZGV2X3QqIGRldiwgdThfdCBzaXplLCB1OF90KiBwTGlzdCk7CitleHRlcm4gdm9pZCB6ZmlXbGFuUmVtb3ZlS2V5KHpkZXZfdCogZGV2LCB1OF90IGtleVR5cGUsIHU4X3Qga2V5SWQpOworZXh0ZXJuIHU4X3QgemZpV2xhblF1ZXJ5SXNQS0luc3RhbGxlZCh6ZGV2X3QgKmRldiwgdThfdCAqc3RhTWFjQWRkcik7CitleHRlcm4gdTMyX3QgemZpV2xhblF1ZXJ5UGFja2V0VHlwZVByb21pc2N1b3VzKHpkZXZfdCogZGV2KTsKK2V4dGVybiB2b2lkIHpmaVdsYW5TZXRQYWNrZXRUeXBlUHJvbWlzY3VvdXMoemRldl90KiBkZXYsIHUzMl90IHNldFZhbHVlKTsKK2V4dGVybiB2b2lkIHpmaVNldENoYW5uZWxNYW5hZ2VtZW50KHpkZXZfdCogZGV2LCB1MzJfdCBzZXR0aW5nKTsKK2V4dGVybiB2b2lkIHpmaVNldFJpZnMoemRldl90KiBkZXYsIHUxNl90IHNldHRpbmcpOworZXh0ZXJuIHZvaWQgemZpQ2hlY2tSaWZzKHpkZXZfdCogZGV2KTsKK2V4dGVybiB2b2lkIHpmaVNldFJlb3JkZXIoemRldl90KiBkZXYsIHUxNl90IHZhbHVlKTsKK2V4dGVybiB2b2lkIHpmaVNldFNlcURlYnVnKHpkZXZfdCogZGV2LCB1MTZfdCB2YWx1ZSk7CisKK2V4dGVybiB1MTZfdCB6ZmlDb25maWdXZHNQb3J0KHpkZXZfdCogZGV2LCB1OF90IHdkc1BvcnRJZCwgdTE2X3QgZmxhZywgdTE2X3QqIHdkc0FkZHIsCisgICAgICAgIHUxNl90IGVuY1R5cGUsIHUzMl90KiB3ZHNLZXkpOworZXh0ZXJuIHZvaWQgemZpV2xhblF1ZXJ5UmVndWxhdGlvblRhYmxlKHpkZXZfdCogZGV2LCBzdHJ1Y3QgenNSZWd1bGF0aW9uVGFibGUqIHBFbnRyeSk7CitleHRlcm4gdm9pZCB6ZmlXbGFuU2V0U2NhblRpbWVyUGVyQ2hhbm5lbCh6ZGV2X3QqIGRldiwgdTE2X3QgdGltZSk7CitleHRlcm4gdm9pZCB6ZmlXbGFuU2V0QXV0b1JlY29ubmVjdCh6ZGV2X3QqIGRldiwgdThfdCBlbmFibGUpOworZXh0ZXJuIHUzMl90IHpmaURlYnVnQ21kKHpkZXZfdCogZGV2LCB1MzJfdCBjbWQsIHUzMl90IHZhbHVlKTsKK2V4dGVybiB2b2lkIHpmaVdsYW5TZXRQcm9iaW5nSGlkZGVuU3NpZCh6ZGV2X3QqIGRldiwgdThfdCogc3NpZCwgdThfdCBzc2lkTGVuLAorICAgIHUxNl90IGVudHJ5KTsKK2V4dGVybiB2b2lkIHpmaVdsYW5TZXREcm9wVW5lbmNyeXB0ZWRQYWNrZXRzKHpkZXZfdCogZGV2LCB1OF90IGVuYWJsZSk7CitleHRlcm4gdm9pZCB6ZmlXbGFuU2V0SUJTU0pvaW5Pbmx5KHpkZXZfdCogZGV2LCB1OF90IGpvaW5Pbmx5KTsKK2V4dGVybiB2b2lkIHpmaVdsYW5TZXREZWZhdWx0S2V5SWQoemRldl90KiBkZXYsIHU4X3Qga2V5SWQpOworZXh0ZXJuIHZvaWQgemZpV2xhblNldERpc2FibGVQcm9iaW5nV2l0aFNzaWQoemRldl90KiBkZXYsIHU4X3QgbW9kZSk7CitleHRlcm4gdm9pZCB6ZmlXbGFuUXVlcnlHU04oemRldl90KiBkZXYsIHU4X3QgKmdzbiwgdTE2X3QgdmFwSWQpOworZXh0ZXJuIHUxNl90IHpmaVN0YUFkZEllV3BhUnNuKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3Qgb2Zmc2V0LCB1OF90IGZyYW1lVHlwZSk7CitleHRlcm4gdThfdCB6ZmlXbGFuU2V0RG90MTFETW9kZSh6ZGV2X3QqIGRldiwgdThfdCBtb2RlKTsKK2V4dGVybiB1OF90IHpmaVdsYW5TZXREb3QxMUhERlNNb2RlKHpkZXZfdCogZGV2LCB1OF90IG1vZGUpOworZXh0ZXJuIHU4X3QgemZpV2xhblNldERvdDExSFRQQ01vZGUoemRldl90KiBkZXYsIHU4X3QgbW9kZSk7CitleHRlcm4gdThfdCB6ZmlXbGFuU2V0QW5pTW9kZSh6ZGV2X3QqIGRldiwgdThfdCBtb2RlKTsKK2V4dGVybiB2b2lkIHpmaVdsYW5TZXRTdGFXbWUoemRldl90KiBkZXYsIHU4X3QgZW5hYmxlLCB1OF90IHVhcHNkSW5mbyk7CitleHRlcm4gdm9pZCB6ZmlXbGFuU2V0QXBXbWUoemRldl90KiBkZXYsIHU4X3QgZW5hYmxlKTsKK2V4dGVybiB1OF90IHpmaVdsYW5RdWVyeXdtZUVuYWJsZSh6ZGV2X3QqIGRldik7CisjaWZkZWYgWk1fT1NfTElOVVhfRlVOQworZXh0ZXJuIHZvaWQgemZpV2xhblNob3dUYWxseSh6ZGV2X3QqIGRldik7CisjZW5kaWYKKyNpZmRlZiBaTV9FTkFCTEVfQ0VOQworLyogQ0VOQyAqLworZXh0ZXJuIHU4X3QgemZpV2xhblNldENlbmNQYWlyd2lzZUtleSh6ZGV2X3QqIGRldiwgdThfdCBrZXlpZCwgdTMyX3QgKnR4aXYsIHUzMl90ICpyeGl2LAorICAgICAgICB1OF90ICprZXksIHU4X3QgKm1pYyk7CitleHRlcm4gdThfdCB6ZmlXbGFuU2V0Q2VuY0dyb3VwS2V5KHpkZXZfdCogZGV2LCB1OF90IGtleWlkLCB1MzJfdCAqcnhpdiwKKyAgICAgICAgdThfdCAqa2V5LCB1OF90ICptaWMpOworI2VuZGlmIC8vWk1fRU5BQkxFX0NFTkMKK2V4dGVybiB2b2lkIHpmaVdsYW5RdWVyeVNpZ25hbEluZm8oemRldl90KiBkZXYsIHU4X3QgKmJ1ZmZlcik7CitleHRlcm4gdm9pZCB6ZmlXbGFuUXVlcnlBZEhvY0NyZWF0ZWRCc3NEZXNjKHpkZXZfdCogZGV2LCBzdHJ1Y3QgenNCc3NJbmZvICpwQnNzSW5mbyk7CitleHRlcm4gdThfdCB6ZmlXbGFuUXVlcnlBZEhvY0lzQ3JlYXRvcih6ZGV2X3QqIGRldik7CitleHRlcm4gdTMyX3QgemZpV2xhblF1ZXJ5U3VwcG9ydE1vZGUoemRldl90KiBkZXYpOworZXh0ZXJuIHUzMl90IHpmaVdsYW5RdWVyeVRyYW5zbWl0UG93ZXIoemRldl90KiBkZXYpOworZXh0ZXJuIHZvaWQgemZpV2xhbkVuYWJsZUxlYXBDb25maWcoemRldl90KiBkZXYsIHU4X3QgbGVhcEVuYWJsZWQpOworCisvKiByZXR1cm5lZCBidWZmZXIgYWxsb2NhdGVkIGJ5IGRyaXZlciBjb3JlICovCitleHRlcm4gdm9pZCB6ZmlSZWN2RXRoQ29tcGxldGUoemRldl90KiBkZXYsIHpidWZfdCogYnVmKTsKKworZXh0ZXJuIHZvaWQgemZpUmVjdjgwMjExKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1Ziwgc3RydWN0IHpzQWRkaXRpb25JbmZvKiBhZGRJbmZvKTsKKworZXh0ZXJuIHZvaWQgemZpV2xhblNldE1heFR4UG93ZXIoemRldl90KiBkZXYsIHU4X3QgcG93ZXIyLCB1OF90IHBvd2VyNSk7CitleHRlcm4gdm9pZCB6ZmlXbGFuUXVlcnlNYXhUeFBvd2VyKHpkZXZfdCogZGV2LCB1OF90ICpwb3dlcjIsIHU4X3QgKnBvd2VyNSk7CitleHRlcm4gdm9pZCB6ZmlXbGFuU2V0Q29ubmVjdE1vZGUoemRldl90KiBkZXYsIHU4X3QgbW9kZSk7CitleHRlcm4gdm9pZCB6ZmlXbGFuU2V0U3VwcG9ydE1vZGUoemRldl90KiBkZXYsIHUzMl90IG1vZGUpOworZXh0ZXJuIHZvaWQgemZpV2xhblNldEFkaG9jTW9kZSh6ZGV2X3QqIGRldiwgdTMyX3QgbW9kZSk7CitleHRlcm4gdTMyX3QgemZpV2xhblF1ZXJ5QWRob2NNb2RlKHpkZXZfdCogZGV2LCB1OF90IGJXcmFwcGVyKTsKK2V4dGVybiB1OF90IHpmaVdsYW5TZXRDb3VudHJ5SXNvTmFtZSh6ZGV2X3QqIGRldiwgdThfdCAqY291bnRyeUlzb05hbWUsIHU4X3QgbGVuZ3RoKTsKK2V4dGVybiBjb25zdCBjaGFyKiB6ZmlXbGFuUXVlcnlDb3VudHJ5SXNvTmFtZSh6ZGV2X3QqIGRldik7CitleHRlcm4gdThfdCB6ZmlXbGFuUXVlcnlyZWd1bGF0b3J5RG9tYWluKHpkZXZfdCogZGV2KTsKK2V4dGVybiB1OF90IHpmaVdsYW5RdWVyeUNDUyh6ZGV2X3QqIGRldik7CitleHRlcm4gdm9pZCB6ZmlXbGFuU2V0Q0NTKHpkZXZfdCogZGV2LCB1OF90IG1vZGUpOworZXh0ZXJuIHZvaWQgemZpV2xhblNldFJlZ3VsYXRvcnkoemRldl90KiBkZXYsIHU4X3QgQ0NTLCB1MTZfdCBDb2RlLCB1OF90IGJmaXJzdENoYW5uZWwpOworZXh0ZXJuIGNvbnN0IGNoYXIqIHpmaUhwR2V0aXNvTmFtZWZyb21yZWdpb25Db2RlKHpkZXZfdCogZGV2LCB1MTZfdCByZWdpb25Db2RlKTsKK2V4dGVybiB2b2lkICB6ZmlXbGFuU2V0TEVEQ3RybFBhcmFtKHpkZXZfdCogZGV2LCB1OF90IHR5cGUsIHU4X3QgZmxhZyk7CitleHRlcm4gdTMyX3QgemZpV2xhblF1ZXJ5UmVjZWl2ZWRQYWNrZXQoemRldl90KiBkZXYpOworZXh0ZXJuIHZvaWQgemZpV2xhbkNoZWNrU1dFbmNyeXB0aW9uKHpkZXZfdCogZGV2KTsKK2V4dGVybiB1MTZfdCB6ZmlXbGFuUXVlcnlBbGxvd0NoYW5uZWxzKHpkZXZfdCAqZGV2LCB1MTZfdCAqY2hhbm5lbHMpOworZXh0ZXJuIHUxNl90IHpmaVdsYW5HZXRNdWx0aWNhc3RBZGRyZXNzQ291bnQoemRldl90KiBkZXYpOworZXh0ZXJuIHZvaWQgemZpV2xhbkdldE11bHRpY2FzdExpc3QoemRldl90KiBkZXYsIHU4X3QqIHBNQ0xpc3QpOworZXh0ZXJuIHZvaWQgemZpV2xhblNldFBhY2tldEZpbHRlcih6ZGV2X3QqIGRldiwgdTMyX3QgUGFja2V0RmlsdGVyKTsKK2V4dGVybiB1OF90IHpmaUNvbXBhcmVXaXRoTXVsdGljYXN0TGlzdEFkZHJlc3MoemRldl90KiBkZXYsIHUxNl90KiBkc3RNYWNBZGRyKTsKK2V4dGVybiB2b2lkIHpmaVdsYW5TZXRTYWZlTW9kZUVuYWJsZWQoemRldl90KiBkZXYsIHU4X3Qgc2FmZU1vZGUpOworZXh0ZXJuIHZvaWQgemZpV2xhblNldElCU1NBZGRpdGlvbmFsSUVMZW5ndGgoemRldl90KiBkZXYsIHUzMl90IGlic3NBZGRpdGlvbmFsSUVTaXplLCAgdThfdCogaWJzc0FkZGl0aW9uYWxJRSk7CitleHRlcm4gdm9pZCB6ZmlXbGFuU2V0WExpbmtNb2RlKHpkZXZfdCogZGV2LCB1MzJfdCBzZXRWYWx1ZSk7CisKKy8qIGhwcncuYyAqLworZXh0ZXJuIHUzMl90IHpmaURiZ1dyaXRlRmxhc2goemRldl90KiBkZXYsIHUzMl90IGFkZHIsIHUzMl90IHZhbCk7CitleHRlcm4gdTMyX3QgemZpRGJnV3JpdGVSZWcoemRldl90KiBkZXYsIHUzMl90IGFkZHIsIHUzMl90IHZhbCk7CitleHRlcm4gdTMyX3QgemZpRGJnUmVhZFJlZyh6ZGV2X3QqIGRldiwgdTMyX3QgYWRkcik7CisKK2V4dGVybiB1MzJfdCB6ZmlEYmdXcml0ZUVlcHJvbSh6ZGV2X3QqIGRldiwgdTMyX3QgYWRkciwgdTMyX3QgdmFsKTsKK2V4dGVybiB1MzJfdCB6ZmlEYmdCbG9ja1dyaXRlRWVwcm9tKHpkZXZfdCogZGV2LCB1MzJfdCBhZGRyLCB1MzJfdCogYnVmKTsKK2V4dGVybiB1MzJfdCB6ZmlEYmdCbG9ja1dyaXRlRWVwcm9tX3YyKHpkZXZfdCogZGV2LCB1MzJfdCBhZGRyLCB1MzJfdCogYnVmLCB1MzJfdCB3cmxlbik7CisKK2V4dGVybiB1MTZfdCB6ZmlEYmdDaGlwRXJhc2VGbGFzaCh6ZGV2X3QgKmRldik7CitleHRlcm4gdTE2X3QgemZpRGJnUHJvZ3JhbUZsYXNoKHpkZXZfdCAqZGV2LCB1MzJfdCBvZmZzZXQsIHUzMl90IGxlbiwgdTMyX3QgKmRhdGEpOworZXh0ZXJuIHUzMl90IHpmaURiZ0dldEZsYXNoQ2hlY2tTdW0oemRldl90ICpkZXYsIHUzMl90IGFkZHIsIHUzMl90IGxlbik7CitleHRlcm4gdTMyX3QgemZpRGJnUmVhZEZsYXNoKHpkZXZfdCAqZGV2LCB1MzJfdCBhZGRyLCB1MzJfdCBsZW4pOworZXh0ZXJuIHUzMl90IHpmaURvd25sb2FkRndTZXQoemRldl90ICpkZXYpOworCitleHRlcm4gdTMyX3QgemZpRGJnRGVsYXlXcml0ZVJlZyh6ZGV2X3QqIGRldiwgdTMyX3QgYWRkciwgdTMyX3QgdmFsKTsKK2V4dGVybiB1MzJfdCB6ZmlEYmdGbHVzaERlbGF5V3JpdGUoemRldl90KiBkZXYpOworCitleHRlcm4gdTMyX3QgemZpRGJnU2V0SUZTeW50aGVzaXplcih6ZGV2X3QqIGRldiwgdTMyX3QgdmFsdWUpOworZXh0ZXJuIHUzMl90IHpmaURiZ1JlYWRUYWxseSh6ZGV2X3QqIGRldik7CisKK2V4dGVybiB1MzJfdCB6ZmlEYmdRdWVyeUh3VHhCdXN5KHpkZXZfdCogZGV2KTsKKworZXh0ZXJuIHU4X3QgemZpV2xhbkdldERlc3RBZGRyRnJvbUJ1Zih6ZGV2X3QgKmRldiwgemJ1Zl90ICpidWYsIHUxNl90ICptYWNBZGRyKTsKKworZXh0ZXJuIHUzMl90IHpmaVdsYW5RdWVyeUh3Q2FwYWJpbGl0eSh6ZGV2X3QqIGRldik7CisKK2V4dGVybiB2b2lkIHpmaVdsYW5TZXREeW5hbWljU0lGU1BhcmFtKHpkZXZfdCogZGV2LCB1OF90IHZhbCk7CisKKy8qKioqKiBFbmQgb2Ygc2VjdGlvbiAyICoqKioqLworCisvKioqKiogc2VjdGlvbiAzIHBlcmZvcm1hY2UgZXZhbHVhdGlvbiAqKioqKi8KKyNpZmRlZiBaTV9FTkFCTEVfUEVSRk9STUFOQ0VfRVZBTFVBVElPTgorZXh0ZXJuIHZvaWQgemZpVHhQZXJmb3JtYW5jZU1TRFUoemRldl90KiBkZXYsIHUzMl90IHRpY2spOworZXh0ZXJuIHZvaWQgemZpUnhQZXJmb3JtYW5jZU1QRFUoemRldl90KiBkZXYsIHpidWZfdCogYnVmKTsKK2V4dGVybiB2b2lkIHpmaVJ4UGVyZm9ybWFuY2VSZWcoemRldl90KiBkZXYsIHUzMl90IHJlZywgdTMyX3QgcnNwKTsKKyNkZWZpbmUgWk1fUEVSRk9STUFOQ0VfSU5JVChkZXYpICAgICAgICAgICAgICAgIHpmaVBlcmZvcm1hbmNlSW5pdChkZXYpOworI2RlZmluZSBaTV9QRVJGT1JNQU5DRV9UWF9NU0RVKGRldiwgdGljaykgICAgICAgemZpVHhQZXJmb3JtYW5jZU1TRFUoZGV2LCB0aWNrKTsKKyNkZWZpbmUgWk1fUEVSRk9STUFOQ0VfUlhfTVNEVShkZXYsIHRpY2spICAgICAgIHpmaVJ4UGVyZm9ybWFuY2VNU0RVKGRldiwgdGljayk7CisjZGVmaW5lIFpNX1BFUkZPUk1BTkNFX1RYX01QRFUoZGV2LCB0aWNrKSAgICAgICB6ZmlUeFBlcmZvcm1hbmNlTVBEVShkZXYsIHRpY2spOworI2RlZmluZSBaTV9QRVJGT1JNQU5DRV9SWF9NUERVKGRldiwgYnVmKSAgICAgICAgemZpUnhQZXJmb3JtYW5jZU1QRFUoZGV2LCBidWYpOworI2RlZmluZSBaTV9QRVJGT1JNQU5DRV9SWF9TRVEoZGV2LCBidWYpICAgICAgICAgemZpUnhQZXJmb3JtYW5jZVNlcShkZXYsIGJ1Zik7CisjZGVmaW5lIFpNX1BFUkZPUk1BTkNFX1JFRyhkZXYsIHJlZywgcnNwKSAgICB7aWYoY21kWzFdID09IHJlZykgemZpUnhQZXJmb3JtYW5jZVJlZyhkZXYsIHJlZywgcnNwKTt9CisjZGVmaW5lIFpNX1BFUkZPUk1BTkNFX0RVUChkZXYsIGJ1ZjEsIGJ1ZjIpICAgICB6ZmlSeFBlcmZvcm1hbmNlRHVwKGRldiwgYnVmMSwgYnVmMik7CisjZGVmaW5lIFpNX1BFUkZPUk1BTkNFX0ZSRUUoZGV2LCBidWYpICAgICAgICAgICB6ZmlSeFBlcmZvcm1hbmNlRnJlZShkZXYsIGJ1Zik7CisjZGVmaW5lIFpNX1BFUkZPUk1BTkNFX1JYX0FNU0RVKGRldiwgYnVmLCBsZW4pICB6ZmlSeFBlcmZvcm1hbmNlQU1TRFUoZGV2LCBidWYsIGxlbik7CisjZGVmaW5lIFpNX1BFUkZPUk1BTkNFX1JYX0ZMVVNIKGRldikgICAgICAgICAgICB6ZmlSeFBlcmZvcm1hbmNlRmx1c2goZGV2KTsKKyNkZWZpbmUgWk1fUEVSRk9STUFOQ0VfUlhfQ0xFQVIoZGV2KSAgICAgICAgICAgIHpmaVJ4UGVyZm9ybWFuY2VDbGVhcihkZXYpOworI2RlZmluZSBaTV9TRVFfREVCVUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdkLT5zZXFfZGVidWcpIERiZ1ByaW50CisjZGVmaW5lIFpNX1BFUkZPUk1BTkNFX1JYX1JFT1JERVIoZGV2KSAgICAgICAgICB6ZmlSeFBlcmZvcm1hbmNlUmVvcmRlcihkZXYpOworI2Vsc2UKKyNkZWZpbmUgWk1fUEVSRk9STUFOQ0VfSU5JVChkZXYpCisjZGVmaW5lIFpNX1BFUkZPUk1BTkNFX1RYX01TRFUoZGV2LCB0aWNrKQorI2RlZmluZSBaTV9QRVJGT1JNQU5DRV9SWF9NU0RVKGRldiwgdGljaykKKyNkZWZpbmUgWk1fUEVSRk9STUFOQ0VfVFhfTVBEVShkZXYsIHRpY2spCisjZGVmaW5lIFpNX1BFUkZPUk1BTkNFX1JYX01QRFUoZGV2LCBidWYpCisjZGVmaW5lIFpNX1BFUkZPUk1BTkNFX1JYX1NFUShkZXYsIGJ1ZikKKyNkZWZpbmUgWk1fUEVSRk9STUFOQ0VfUkVHKGRldiwgcmVnLCByc3ApCisjZGVmaW5lIFpNX1BFUkZPUk1BTkNFX0RVUChkZXYsIGJ1ZjEsIGJ1ZjIpCisjZGVmaW5lIFpNX1BFUkZPUk1BTkNFX0ZSRUUoZGV2LCBidWYpCisjZGVmaW5lIFpNX1BFUkZPUk1BTkNFX1JYX0FNU0RVKGRldiwgYnVmLCBsZW4pCisjZGVmaW5lIFpNX1BFUkZPUk1BTkNFX1JYX0ZMVVNIKGRldikKKyNkZWZpbmUgWk1fUEVSRk9STUFOQ0VfUlhfQ0xFQVIoZGV2KQorI2RlZmluZSBaTV9TRVFfREVCVUcKKyNkZWZpbmUgWk1fUEVSRk9STUFOQ0VfUlhfUkVPUkRFUihkZXYpCisjZW5kaWYKKy8qKioqKiBFbmQgb2Ygc2VjdGlvbiAzICoqKioqLworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvcHViX3pmdy5oIGIvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL3B1Yl96ZncuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDc0YmI3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL3B1Yl96ZncuaApAQCAtMCwwICsxLDkzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggQXRoZXJvcyBDb21tdW5pY2F0aW9ucyBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworI2lmbmRlZiBfUFVCX1pGV19ICisjZGVmaW5lIF9QVUJfWkZXX0gKKworI2luY2x1ZGUgIi4uL29hbF9kdC5oIgorCisKKy8qIEJ1ZmZlciBtYW5hZ2VtZW50ICovCisjaWZkZWYgWk1fRU5BQkxFX0JVRkZFUl9ERUJVRworZXh0ZXJuIHpidWZfdCogemZ3QnVmQWxsb2NhdGVXaXRoQ29udGV4dCh6ZGV2X3QqIGRldiwgdTE2X3QgbGVuLCB1OF90ICpmdW5jdGlvbk5hbWUsIFVMT05HIGxpbmUpOworI2RlZmluZSB6ZndCdWZBbGxvY2F0ZShkZXYsIGxlbikgIHpmd0J1ZkFsbG9jYXRlV2l0aENvbnRleHQoZGV2LCBsZW4sICh1OF90ICopX19mdW5jX18sIF9fTElORV9fKQorI2Vsc2UKK2V4dGVybiB6YnVmX3QqIHpmd0J1ZkFsbG9jYXRlKHpkZXZfdCogZGV2LCB1MTZfdCBsZW4pOworI2VuZGlmCitleHRlcm4gdm9pZCB6ZndCdWZGcmVlKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3QgZXJyQ29kZSk7CitleHRlcm4gdTE2X3QgemZ3QnVmQ2hhaW4oemRldl90KiBkZXYsIHpidWZfdCoqIGhlYWQsIHpidWZfdCogdGFpbCk7CitleHRlcm4gdTE2X3QgemZ3QnVmQ29weSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBkc3QsIHpidWZfdCogc3JjKTsKK2V4dGVybiB1MTZfdCB6ZndCdWZTZXRTaXplKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3Qgc2l6ZSk7CitleHRlcm4gdTE2X3QgemZ3QnVmUmVtb3ZlSGVhZCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IHNpemUpOworZXh0ZXJuIHUxNl90IHpmd0J1ZkdldFNpemUoemRldl90KiBkZXYsIHpidWZfdCogYnVmKTsKK2V4dGVybiB2b2lkICB6ZndDb3B5QnVmQ29udGV4dCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBzb3VyY2UsIHpidWZfdCogZGVzdCk7CisKKy8qIE1lbW9yeSBtYW5hZ2VtZW50ICovCitleHRlcm4gdm9pZCogemZ3TWVtQWxsb2NhdGUoemRldl90KiBkZXYsIHUzMl90IHNpemUpOworZXh0ZXJuIHZvaWQgemZ3TWVtRnJlZSh6ZGV2X3QqIGRldiwgdm9pZCogbWVtLCB1MzJfdCBzaXplKTsKK2V4dGVybiB2b2lkIHpmd01lbW9yeUNvcHkodThfdCogZHN0LCB1OF90KiBzcmMsIHUxNl90IGxlbmd0aCk7CitleHRlcm4gdm9pZCB6ZndNZW1vcnlNb3ZlKHU4X3QqIGRzdCwgdThfdCogc3JjLCB1MTZfdCBsZW5ndGgpOworZXh0ZXJuIHZvaWQgemZ3WmVyb01lbW9yeSh1OF90KiB2YSwgdTE2X3QgbGVuZ3RoKTsKK2V4dGVybiB1OF90IHpmd01lbW9yeUlzRXF1YWwodThfdCogbTEsIHU4X3QqIG0yLCB1MTZfdCBsZW5ndGgpOworCisvKiBPdGhlcnMgKi8KK2V4dGVybiB2b2lkIHpmd1NsZWVwKHpkZXZfdCogZGV2LCB1MzJfdCBtcyk7CitleHRlcm4gdTE2X3QgemZ3R2V0VmFwSWQoemRldl90KiBkZXYpOworZXh0ZXJuIHUxNl90IHpmd1N0YUFkZEllV3BhUnNuKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3Qgb2Zmc2V0LCB1OF90IGZyYW1lVHlwZSk7CitleHRlcm4gdTMyX3QgemZ3V2FpdEZvckV2ZW50KHpkZXZfdCAqZGV2LCB1MzJfdCBldmVudCwgdTMyX3QgdGltZW91dCk7CitleHRlcm4gdm9pZCB6ZndTZW5kRXZlbnQoemRldl90KiBkZXYpOworZXh0ZXJuIHZvaWQgemZ3R2V0QWN0aXZlU2NhbkR1cih6ZGV2X3QqIGRldiwgdThfdCogRHVyICk7CitleHRlcm4gdm9pZCB6ZndHZXRTaG93WmVyb0xlbmd0aFNTSUQoemRldl90KiBkZXYsIHU4X3QqIER1ciApOworLyogRm9yIGRlYnVnZ2luZyAqLworZXh0ZXJuIHZvaWQgemZ3RHVtcEJ1Zih6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpOworZXh0ZXJuIHZvaWQgemZ3RGJnUmVhZFJlZ0RvbmUoemRldl90KiBkZXYsIHUzMl90IGFkZHIsIHUzMl90IHZhbCk7CisvKiBGb3IgRXZsICovCitleHRlcm4gdm9pZCB6ZndEYmdEb3dubG9hZEZ3SW5pdERvbmUoemRldl90KiBkZXYpOworZXh0ZXJuIHZvaWQgemZ3RGJnUmVhZEZsYXNoRG9uZSh6ZGV2X3QqIGRldiwgdTMyX3QgYWRkciwgdTMyX3QqIHJzcGRhdGEsIHUzMl90IGRhdGFsZW4pOworZXh0ZXJuIHZvaWQgemZ3RGJnR2V0Rmxhc2hDaGtTdW1Eb25lKHpkZXZfdCogZGV2LCB1MzJfdCogcnNwZGF0YSk7CitleHRlcm4gdm9pZCB6ZndEYmdQcm9ncmFtZUZsYXNoRG9uZSh6ZGV2X3QqIGRldik7CitleHRlcm4gdm9pZCB6ZndEYmdQcm9ncmFtZUZsYXNoQ2hrRG9uZSh6ZGV2X3QqIGRldik7CitleHRlcm4gdm9pZCB6ZndEYmdXcml0ZVJlZ0RvbmUoemRldl90KiBkZXYsIHUzMl90IGFkZHIsIHUzMl90IHZhbCk7CitleHRlcm4gdm9pZCB6ZndEYmdXcml0ZUVlcHJvbURvbmUoemRldl90KiBkZXYsIHUzMl90IGFkZHIsIHUzMl90IHZhbCk7CitleHRlcm4gdm9pZCB6ZndEYmdSZWFkVGFsbHlEb25lKHpkZXZfdCogZGV2KTsKK2V4dGVybiB2b2lkIHpmd1dsYW5SZWFkUmVnRG9uZSh6ZGV2X3QqIGRldiwgdTMyX3QgYWRkciwgdTMyX3QgdmFsKTsKK2V4dGVybiB2b2lkIHpmd1dsYW5Xcml0ZVJlZ0RvbmUoemRldl90KiBkZXYsIHUzMl90IGFkZHIsIHUzMl90IHZhbCk7CitleHRlcm4gdm9pZCB6ZndXbGFuUmVhZFRhbGx5RG9uZSh6ZGV2X3QqIGRldik7CitleHRlcm4gdm9pZCB6ZndEYmdRdWVyeUh3VHhCdXN5RG9uZSh6ZGV2X3QqIGRldiwgdTMyX3QgdmFsKTsKK2V4dGVybiB1MzJfdCB6ZndSZWFkUmVnKHpkZXZfdCogZGV2LCB1MzJfdCBvZmZzZXQpOworZXh0ZXJuIHUzMl90IHpmd1JlYWRFZXByb20oemRldl90KiBkZXYsIHUzMl90IGFkZHIpOworCisvKiBSZXNlcnZlZCBmb3IgVmlzdGEsIHBsZWFzZSByZXR1cm4gMCAqLworZXh0ZXJuIHU4X3QgemZ3R2V0UGt0RW5jRXhlbXB0aW9uQWN0aW9uVHlwZSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpOworCisjaWZkZWYgWk1fRU5BQkxFX0NFTkMKKy8qIFJlc2VydmVkIGZvciBDRU5DLCBwbGVhc2UgcmV0dXJuIDAgKi8KK2V4dGVybiB1OF90IHpmd0NlbmNIYW5kbGVCZWFjb25Qcm9icmVzcG9uKHpkZXZfdCogZGV2LCB1OF90ICpwV0lFYywKKyAgICAgICAgdThfdCAqcFBlZXJTU0lEYywgdThfdCAqcFBlZXJBZGRyYyk7CisjZW5kaWYgLy9aTV9FTkFCTEVfQ0VOQworCisjaWZkZWYgWk1fSEFMUExVU19MT0NLCitleHRlcm4gYXNtbGlua2FnZSBzdHJ1Y3QgenNXbGFuRGV2ICp6ZndHZXRXbGFuRGV2KHpkZXZfdCogZGV2KTsKK2V4dGVybiBhc21saW5rYWdlIHZvaWQgemZ3RW50ZXJDcml0aWNhbFNlY3Rpb24oemRldl90KiBkZXYpOworZXh0ZXJuIGFzbWxpbmthZ2Ugdm9pZCB6ZndMZWF2ZUNyaXRpY2FsU2VjdGlvbih6ZGV2X3QqIGRldik7CitleHRlcm4gYXNtbGlua2FnZSB1OF90IHpmd0J1ZlJlYWRCeXRlKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3Qgb2Zmc2V0KTsKK2V4dGVybiBhc21saW5rYWdlIHUxNl90IHpmd0J1ZlJlYWRIYWxmV29yZCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IG9mZnNldCk7CitleHRlcm4gYXNtbGlua2FnZSB2b2lkIHpmd0J1ZldyaXRlQnl0ZSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IG9mZnNldCwgdThfdCB2YWx1ZSk7CitleHRlcm4gYXNtbGlua2FnZSB2b2lkIHpmd0J1ZldyaXRlSGFsZldvcmQoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCBvZmZzZXQsIHUxNl90IHZhbHVlKTsKK2V4dGVybiBhc21saW5rYWdlIHU4X3QgKnpmd0dldEJ1ZmZlcih6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpOworI2VuZGlmCisKKyNlbmRpZiAvL19QVUJfWkZXX0gKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9xdWV1ZS5jIGIvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL3F1ZXVlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDI5NDgzMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9xdWV1ZS5jCkBAIC0wLDAgKzEsMzAzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggQXRoZXJvcyBDb21tdW5pY2F0aW9ucyBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kdWxlIE5hbWUgOiBxdWV1ZS5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBBYnN0cmFjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFRoaXMgbW9kdWxlIGNvbnRhaW5zIHF1ZXVlIG1hbmFnZW1lbnQgZnVuY3Rpb25zLiAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBOT1RFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIE5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSAiY3ByZWNvbXAuaCIKKyNpbmNsdWRlICJxdWV1ZS5oIgorCisKK3N0cnVjdCB6c1F1ZXVlKiB6ZlF1ZXVlQ3JlYXRlKHpkZXZfdCogZGV2LCB1MTZfdCBzaXplKQoreworICAgIHN0cnVjdCB6c1F1ZXVlKiBxOworCisgICAgaWYgKChxID0gKHN0cnVjdCB6c1F1ZXVlKil6ZndNZW1BbGxvY2F0ZShkZXYsIHNpemVvZihzdHJ1Y3QgenNRdWV1ZSkKKyAgICAgICAgICAgICsgKHNpemVvZihzdHJ1Y3QgenNRdWV1ZUNlbGwpKihzaXplLTEpKSkpICE9IE5VTEwpCisgICAgeworICAgICAgICBxLT5zaXplID0gc2l6ZTsKKyAgICAgICAgcS0+c2l6ZU1hc2sgPSBzaXplLTE7CisgICAgICAgIHEtPmhlYWQgPSAwOworICAgICAgICBxLT50YWlsID0gMDsKKyAgICB9CisgICAgcmV0dXJuIHE7Cit9CisKK3ZvaWQgemZRdWV1ZURlc3Ryb3koemRldl90KiBkZXYsIHN0cnVjdCB6c1F1ZXVlKiBxKQoreworICAgIHUxNl90IHNpemUgPSBzaXplb2Yoc3RydWN0IHpzUXVldWUpICsgKHNpemVvZihzdHJ1Y3QgenNRdWV1ZUNlbGwpKihxLT5zaXplLTEpKTsKKworICAgIHpmUXVldWVGbHVzaChkZXYsIHEpOworICAgIHpmd01lbUZyZWUoZGV2LCBxLCBzaXplKTsKKworICAgIHJldHVybjsKK30KKwordTE2X3QgemZRdWV1ZVB1dE5jcyh6ZGV2X3QqIGRldiwgc3RydWN0IHpzUXVldWUqIHEsIHpidWZfdCogYnVmLCB1MzJfdCB0aWNrKQoreworICAgIHUxNl90IHJldCA9IFpNX0VSUl9RVUVVRV9GVUxMOworCisgICAgem1fbXNnMF9tbShaTV9MVl8xLCAiemZRdWV1ZVB1dE5jcygpIik7CisKKyAgICBpZiAoKChxLT50YWlsKzEpJnEtPnNpemVNYXNrKSAhPSBxLT5oZWFkKQorICAgIHsKKyAgICAgICAgcS0+Y2VsbFtxLT50YWlsXS5idWYgPSBidWY7CisgICAgICAgIHEtPmNlbGxbcS0+dGFpbF0udGljayA9IHRpY2s7CisgICAgICAgIHEtPnRhaWwgPSAocS0+dGFpbCsxKSAmIHEtPnNpemVNYXNrOworICAgICAgICByZXQgPSBaTV9TVUNDRVNTOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK3UxNl90IHpmUXVldWVQdXQoemRldl90KiBkZXYsIHN0cnVjdCB6c1F1ZXVlKiBxLCB6YnVmX3QqIGJ1ZiwgdTMyX3QgdGljaykKK3sKKyAgICB1MTZfdCByZXQ7CisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICByZXQgPSB6ZlF1ZXVlUHV0TmNzKGRldiwgcSwgYnVmLCB0aWNrKTsKKworICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICByZXR1cm4gcmV0OworfQorCit6YnVmX3QqIHpmUXVldWVHZXQoemRldl90KiBkZXYsIHN0cnVjdCB6c1F1ZXVlKiBxKQoreworICAgIHpidWZfdCogYnVmID0gTlVMTDsKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIGlmIChxLT5oZWFkICE9IHEtPnRhaWwpCisgICAgeworICAgICAgICBidWYgPSBxLT5jZWxsW3EtPmhlYWRdLmJ1ZjsKKyAgICAgICAgcS0+aGVhZCA9IChxLT5oZWFkKzEpICYgcS0+c2l6ZU1hc2s7CisgICAgfQorCisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIHJldHVybiBidWY7Cit9CisKK3UxNl90IHpmQ29tcGFyZURzdHdpdGhCdWYoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1OF90KiBhZGRyKQoreworICAgIHUxNl90IGk7CisgICAgdThfdCBkc3RbNl07CisKKyAgICBmb3IgKGk9MDsgaTw2OyBpKyspCisgICAgeworICAgICAgICBkc3RbaV0gPSB6bXdfYnVmX3JlYWRiKGRldiwgYnVmLCBpKTsKKyAgICAgICAgaWYgKGRzdFtpXSAhPSBhZGRyW2ldKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gMStpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKworemJ1Zl90KiB6ZlF1ZXVlR2V0V2l0aE1hYyh6ZGV2X3QqIGRldiwgc3RydWN0IHpzUXVldWUqIHEsIHU4X3QqIGFkZHIsIHU4X3QqIG1iKQoreworICAgIHpidWZfdCogYnVmOworICAgIHpidWZfdCogcmV0QnVmID0gTlVMTDsKKyAgICB1MTZfdCBpbmRleCwgbmV4dDsKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgKm1iID0gMDsKKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICBpbmRleCA9IHEtPmhlYWQ7CisKKyAgICB3aGlsZSAoMSkKKyAgICB7CisgICAgICAgIGlmIChpbmRleCAhPSBxLT50YWlsKQorICAgICAgICB7CisgICAgICAgICAgICBidWYgPSBxLT5jZWxsW2luZGV4XS5idWY7CisKKyAgICAgICAgICAgIC8vaWYgYnVmJ3MgZGV0aW5hdGlvbiBhZGRyZXNzID09IGlucHV0IGFkZHIKKyAgICAgICAgICAgIGlmICh6ZkNvbXBhcmVEc3R3aXRoQnVmKGRldiwgYnVmLCBhZGRyKSA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldEJ1ZiA9IGJ1ZjsKKyAgICAgICAgICAgICAgICAvL0dldCBpdCwgYW5kIHRyYWNlIHRoZSB3aG9sZSBxdWV1ZSB0byBjYWxjdWxhdGUgbW9yZSBiaXQKKyAgICAgICAgICAgICAgICB3aGlsZSAoKG5leHQgPSgoaW5kZXgrMSkmcS0+c2l6ZU1hc2spKSAhPSBxLT50YWlsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcS0+Y2VsbFtpbmRleF0uYnVmID0gcS0+Y2VsbFtuZXh0XS5idWY7CisgICAgICAgICAgICAgICAgICAgIHEtPmNlbGxbaW5kZXhdLnRpY2sgPSBxLT5jZWxsW25leHRdLnRpY2s7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCgqbWIgPT0gMCkgJiYgKHpmQ29tcGFyZURzdHdpdGhCdWYoZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHEtPmNlbGxbbmV4dF0uYnVmLCBhZGRyKSA9PSAwKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgKm1iID0gMTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGluZGV4ID0gbmV4dDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcS0+dGFpbCA9IChxLT50YWlsLTEpICYgcS0+c2l6ZU1hc2s7CisKKyAgICAgICAgICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICAgICAgICAgIHJldHVybiByZXRCdWY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbmRleCA9IChpbmRleCArIDEpICYgcS0+c2l6ZU1hc2s7CisgICAgICAgIH0gLy9pZiAoaW5kZXggIT0gcS0+dGFpbCkKKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICByZXR1cm4gcmV0QnVmOworCit9CisKK3ZvaWQgemZRdWV1ZUZsdXNoKHpkZXZfdCogZGV2LCBzdHJ1Y3QgenNRdWV1ZSogcSkKK3sKKyAgICB6YnVmX3QqIGJ1ZjsKKworICAgIHdoaWxlICgoYnVmID0gemZRdWV1ZUdldChkZXYsIHEpKSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgemZ3QnVmRnJlZShkZXYsIGJ1ZiwgMCk7CisgICAgfQorCisgICAgcmV0dXJuOworfQorCit2b2lkIHpmUXVldWVBZ2UoemRldl90KiBkZXYsIHN0cnVjdCB6c1F1ZXVlKiBxLCB1MzJfdCB0aWNrLCB1MzJfdCBtc0FnZSkKK3sKKyAgICB6YnVmX3QqIGJ1ZjsKKyAgICB1MzJfdCAgIGJ1ZnRpY2s7CisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHdoaWxlICgxKQorICAgIHsKKyAgICAgICAgYnVmID0gTlVMTDsKKyAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgICAgICBpZiAocS0+aGVhZCAhPSBxLT50YWlsKQorICAgICAgICB7CisgICAgICAgICAgICBidWZ0aWNrID0gcS0+Y2VsbFtxLT5oZWFkXS50aWNrOworICAgICAgICAgICAgaWYgKCgodGljayAtIGJ1ZnRpY2spKlpNX01TX1BFUl9USUNLKSA+IG1zQWdlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJ1ZiA9IHEtPmNlbGxbcS0+aGVhZF0uYnVmOworICAgICAgICAgICAgICAgIHEtPmhlYWQgPSAocS0+aGVhZCsxKSAmIHEtPnNpemVNYXNrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgICAgICBpZiAoYnVmICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHptX21zZzBfbW0oWk1fTFZfMCwgIkFnZSBmcmFtZSBpbiBxdWV1ZSEiKTsKKyAgICAgICAgICAgIHpmd0J1ZkZyZWUoZGV2LCBidWYsIDApOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuOworfQorCisKK3U4X3QgemZRdWV1ZVJlbW92ZXdpdGhJbmRleCh6ZGV2X3QqIGRldiwgc3RydWN0IHpzUXVldWUqIHEsIHUxNl90IGluZGV4LCB1OF90KiBhZGRyKQoreworICAgIHUxNl90IG5leHQ7CisgICAgdThfdCBtYiA9IDA7CisKKyAgICAvL3RyYWNlIHRoZSB3aG9sZSBxdWV1ZSB0byBjYWxjdWxhdGUgbW9yZSBiaXQKKyAgICB3aGlsZSAoKG5leHQgPSgoaW5kZXgrMSkmcS0+c2l6ZU1hc2spKSAhPSBxLT50YWlsKQorICAgIHsKKyAgICAgICAgcS0+Y2VsbFtpbmRleF0uYnVmID0gcS0+Y2VsbFtuZXh0XS5idWY7CisgICAgICAgIHEtPmNlbGxbaW5kZXhdLnRpY2sgPSBxLT5jZWxsW25leHRdLnRpY2s7CisKKyAgICAgICAgaWYgKChtYiA9PSAwKSAmJiAoemZDb21wYXJlRHN0d2l0aEJ1ZihkZXYsCisgICAgICAgICAgICAgICAgcS0+Y2VsbFtuZXh0XS5idWYsIGFkZHIpID09IDApKQorICAgICAgICB7CisgICAgICAgICAgICBtYiA9IDE7CisgICAgICAgIH0KKworICAgICAgICBpbmRleCA9IG5leHQ7CisgICAgfQorICAgIHEtPnRhaWwgPSAocS0+dGFpbC0xKSAmIHEtPnNpemVNYXNrOworCisgICAgcmV0dXJuIG1iOworCit9CisKK3ZvaWQgemZRdWV1ZUdlbmVyYXRlVWFwc2RUaW0oemRldl90KiBkZXYsIHN0cnVjdCB6c1F1ZXVlKiBxLAorICAgICAgICB1OF90KiB1bmlCaXRNYXAsIHUxNl90KiBoaWdoZXN0Qnl0ZSkKK3sKKyAgICB6YnVmX3QqIHBzQnVmOworICAgIHU4X3QgZHN0WzZdOworICAgIHUxNl90IGlkLCBhaWQsIGluZGV4LCBpOworICAgIHUxNl90IGJpdFBvc2l0aW9uOworICAgIHUxNl90IGJ5dGVQb3NpdGlvbjsKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICBpbmRleCA9IHEtPmhlYWQ7CisKKyAgICB3aGlsZSAoaW5kZXggIT0gcS0+dGFpbCkKKyAgICB7CisgICAgICAgIHBzQnVmID0gcS0+Y2VsbFtpbmRleF0uYnVmOworICAgICAgICBmb3IgKGk9MDsgaTw2OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGRzdFtpXSA9IHptd19idWZfcmVhZGIoZGV2LCBwc0J1ZiwgaSk7CisgICAgICAgIH0KKyAgICAgICAgLyogVE9ETyA6IHVzZSB1OF90KiBmb3QgTUFDIGFkZHJlc3MgKi8KKyAgICAgICAgaWYgKCgoaWQgPSB6ZkFwRmluZFN0YShkZXYsICh1MTZfdCopZHN0KSkgIT0gMHhmZmZmKQorICAgICAgICAgICAgICAgICYmICh3ZC0+YXAuc3RhVGFibGVbaWRdLnBzTW9kZSAhPSAwKSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogQ2FsY3VsYXRlIFBWQiBvbmx5IHdoZW4gYWxsIEFDIGFyZSBkZWxpdmVyeS1lbmFibGVkICovCisgICAgICAgICAgICBpZiAoKHdkLT5hcC5zdGFUYWJsZVtpZF0ucW9zSW5mbyAmIDB4ZikgPT0gMHhmKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFpZCA9IGlkICsgMTsKKyAgICAgICAgICAgICAgICBiaXRQb3NpdGlvbiA9ICgxIDw8IChhaWQgJiAweDcpKTsKKyAgICAgICAgICAgICAgICBieXRlUG9zaXRpb24gPSAoYWlkID4+IDMpOworICAgICAgICAgICAgICAgIHVuaUJpdE1hcFtieXRlUG9zaXRpb25dIHw9IGJpdFBvc2l0aW9uOworCisgICAgICAgICAgICAgICAgaWYgKGJ5dGVQb3NpdGlvbj4qaGlnaGVzdEJ5dGUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAqaGlnaGVzdEJ5dGUgPSBieXRlUG9zaXRpb247CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaW5kZXggPSAoaW5kZXgrMSkgJiBxLT5zaXplTWFzazsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIEZyZWUgZ2FyYmFnZSBVQVBTRCBmcmFtZSAqLworICAgICAgICAgICAgemZRdWV1ZVJlbW92ZXdpdGhJbmRleChkZXYsIHEsIGluZGV4LCBkc3QpOworICAgICAgICAgICAgemZ3QnVmRnJlZShkZXYsIHBzQnVmLCAwKTsKKyAgICAgICAgfQorICAgIH0KKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgcmV0dXJuOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL3F1ZXVlLmggYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvcXVldWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTI2Yjg4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL3F1ZXVlLmgKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNy0yMDA4IEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKyNpZm5kZWYgX1FVRVVFX0gKKyNkZWZpbmUgX1FVRVVFX0gKKworI2luY2x1ZGUgIi4uL29hbF9kdC5oIgorCitzdHJ1Y3QgenNRdWV1ZUNlbGwKK3sKKyAgICB1MzJfdCAgIHRpY2s7CisgICAgemJ1Zl90KiBidWY7Cit9OworCitzdHJ1Y3QgenNRdWV1ZQoreworICAgIHUxNl90ICAgc2l6ZTsKKyAgICB1MTZfdCAgIHNpemVNYXNrOworICAgIHUxNl90ICAgaGVhZDsKKyAgICB1MTZfdCAgIHRhaWw7CisgICAgc3RydWN0IHpzUXVldWVDZWxsIGNlbGxbMV07Cit9OworCisjZW5kaWYgLy8jaWZuZGVmIF9RVUVVRV9ICmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvcmF0ZWN0cmwuYyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9yYXRlY3RybC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0MzEwNGMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvcmF0ZWN0cmwuYwpAQCAtMCwwICsxLDg3NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNy0yMDA4IEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlICJjcHJlY29tcC5oIgorI2luY2x1ZGUgInJhdGVjdHJsLmgiCisKK2NvbnN0IHUzMl90IHpjUmF0ZVRvUGh5Q3RybFtdID0KKyAgICB7CisgICAgICAgIC8qIDFNLCAgICAgICAgMk0sICAgICAgICAgNU0sICAgICAgICAxMU0gLCAgMCAgMSAgMiAgMyovCisgICAgICAgIDB4MDAwMDAsICAgIDB4MTAwMDAsICAgIDB4MjAwMDAsICAgIDB4MzAwMDAsCisgICAgICAgIC8qIDZNICAgICAgICAgOU0gICAgICAgICAgMTJNICAgICAgICAxOE0gLCAgNCAgNSAgNiAgNyovCisgICAgICAgIDB4YjAwMDEsICAgIDB4ZjAwMDEsICAgIDB4YTAwMDEsICAgIDB4ZTAwMDEsCisgICAgICAgIC8qIDI0TSAgICAgICAgIDM2TSAgICAgICAgNDhNICAgICAgICA1NE0gLCAgOCAgOSAgMTAgMTEqLworICAgICAgICAweDkwMDAxLCAgICAweGQwMDAxLCAgICAweDgwMDAxLCAgICAweGMwMDAxLAorICAgICAgICAvKiBNQ1MwICAgICAgTUNTMSAgICAgICAgTUNTMiAgICAgICAgTUNTMywgIDEyIDEzIDE0IDE1Ki8KKyAgICAgICAgMHgwMDAwMiwgICAgMHgxMDAwMiwgICAgMHgyMDAwMiwgICAgMHgzMDAwMiwKKyAgICAgICAgLyogTUNTNCAgICAgIE1DUzUgICAgICAgIE1DUzYgICAgICAgIE1DUzcsICAxNiAxNyAxOCAxOSovCisgICAgICAgIDB4NDAwMDIsICAgIDB4NTAwMDIsICAgIDB4NjAwMDIsICAgIDB4NzAwMDIsCisgICAgICAgIC8qIE1DUzggICAgICBNQ1M5ICAgICAgICBNQ1MxMCAgICAgICBNQ1MxMSwgMjAgMjEgMjIgMjMqLworICAgICAgICAweDgwMDAyLCAgICAweDkwMDAyLCAgICAweGEwMDAyLCAgICAweGIwMDAyLAorICAgICAgICAvKiBNQ1MxMiAgICAgTUNTMTMgICAgICAgTUNTMTQgICAgICAgTUNTMTUsIDI0IDI1IDI2IDI3Ki8KKyAgICAgICAgMHhjMDAwMiwgICAgMHhkMDAwMiwgICAgMHhlMDAwMiwgICAgMHhmMDAwMiwKKyAgICAgICAgLyogTUNTMTRTRywgIE1DUzE1U0cgICAgIE1DUzdTRyAgICAgICAgICAgLCAyOCAyOSwgMzAqLworICAgICAgICAweDgwMGUwMDAyLCAweDgwMGYwMDAyLCAweDgwMDcwMDAyCisgICAgfTsKKworCitjb25zdCB1OF90IHpjSHRSYXRlVGFibGVbMTVdWzRdID0KKyAgICB7IC8qWzVHIDIwTUh6XSAgWzVHIDQwTUh6XSBbMi40RyAyME1Iel0gIFsyLjRHIDQwTUh6XSovCisgICAgICAgIHsgIDQsICAgICAgICAgIDQsICAgICAgICAgIDAsICAgICAgICAgIDB9LCAgIC8qT0ZETTZNIE9GRE02TSAgQ0NLMU0gIENDSzFNICAqLworICAgICAgICB7ICA1LCAgICAgICAgICA1LCAgICAgICAgICAxLCAgICAgICAgICAxfSwgICAvKk9GRE05TSBPRkRNOU0gIENDSzJNICBDQ0syTSAgKi8KKyAgICAgICAgeyAgMTMsICAgICAgICAgMTIsICAgICAgICAgMiwgICAgICAgICAgMn0sICAgLypNQ1MxICAgTUNTMCAgICBDQ0s1TSAgQ0NLNU0gICovCisgICAgICAgIHsgIDE0LCAgICAgICAgIDEzLCAgICAgICAgIDMsICAgICAgICAgIDN9LCAgIC8qTUNTMiAgIE1DUzEgICAgQ0NLMTFNIENDSzExTSAqLworICAgICAgICB7ICAxNSwgICAgICAgICAxNCwgICAgICAgICAxMywgICAgICAgICAxMn0sICAvKk1DUzMgICBNQ1MyICAgIE1DUzEgICBNQ1MwICAgKi8KKyAgICAgICAgeyAgMTYsICAgICAgICAgMTUsICAgICAgICAgMTQsICAgICAgICAgMTN9LCAgLypNQ1M0ICAgTUNTMyAgICBNQ1MyICAgTUNTMSAgICovCisgICAgICAgIHsgIDIzLCAgICAgICAgIDE2LCAgICAgICAgIDE1LCAgICAgICAgIDE0fSwgIC8qTUNTMTEgIE1DUzQgICAgTUNTMyAgIE1DUzIgICAqLworICAgICAgICB7ICAyNCwgICAgICAgICAyMywgICAgICAgICAxNiwgICAgICAgICAxNX0sICAvKk1DUzEyICBNQ1MxMSAgIE1DUzQgICBNQ1MzICAgKi8KKyAgICAgICAgeyAgMjUsICAgICAgICAgMjQsICAgICAgICAgMjMsICAgICAgICAgMTZ9LCAgLypNQ1MxMyAgTUNTMTIgICBNQ1MxMSAgTUNTNCAgICovCisgICAgICAgIHsgIDI2LCAgICAgICAgIDI1LCAgICAgICAgIDI0LCAgICAgICAgIDIzfSwgIC8qTUNTMTQgIE1DUzEzICAgTUNTMTIgIE1DUzExICAqLworICAgICAgICB7ICAyNywgICAgICAgICAyNiwgICAgICAgICAyNSwgICAgICAgICAyNH0sICAvKk1DUzE1ICBNQ1MxNCAgIE1DUzEzICBNQ1MxMiAgKi8KKyAgICAgICAgeyAgMCwgICAgICAgICAgMjcsICAgICAgICAgMjYsICAgICAgICAgMjV9LCAgLyowICAgICAgTUNTMTUgICBNQ1MxNCAgTUNTMTMgICovCisgICAgICAgIHsgIDAsICAgICAgICAgIDI5LCAgICAgICAgIDI3LCAgICAgICAgIDI2fSwgIC8qMCAgICAgIE1DUzE1U0cgTUNTMTUgIE1DUzE0ICAqLworICAgICAgICB7ICAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgICAyOH0sICAvKjAgICAgICAwICAgICAgIDAgICAgICBNQ1MxNFNHKi8KKyAgICAgICAgeyAgMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgICAgMjl9ICAgLyowICAgICAgMCAgICAgICAwICAgICAgTUNTMTVTRyovCisgICAgfTsKKworY29uc3QgdThfdCB6Y0h0T25lVHhTdHJlYW1SYXRlVGFibGVbMTVdWzRdID0KKyAgICB7IC8qWzVHIDIwTUh6XSAgWzVHIDQwTUh6XSBbMi40RyAyME1Iel0gIFsyLjRHIDQwTUh6XSovCisgICAgICAgIHsgIDQsICAgICAgICAgIDQsICAgICAgICAgIDAsICAgICAgICAgIDB9LCAgIC8qT0ZETTZNIE9GRE02TSAgQ0NLMU0gIENDSzFNICAqLworICAgICAgICB7ICA1LCAgICAgICAgICA1LCAgICAgICAgICAxLCAgICAgICAgICAxfSwgICAvKk9GRE05TSBPRkRNOU0gIENDSzJNICBDQ0syTSAgKi8KKyAgICAgICAgeyAgMTMsICAgICAgICAgMTIsICAgICAgICAgMiwgICAgICAgICAgMn0sICAgLypNQ1MxICAgTUNTMCAgICBDQ0s1TSAgQ0NLNU0gICovCisgICAgICAgIHsgIDE0LCAgICAgICAgIDEzLCAgICAgICAgIDMsICAgICAgICAgIDN9LCAgIC8qTUNTMiAgIE1DUzEgICAgQ0NLMTFNIENDSzExTSAqLworICAgICAgICB7ICAxNSwgICAgICAgICAxNCwgICAgICAgICAxMywgICAgICAgICAxMn0sICAvKk1DUzMgICBNQ1MyICAgIE1DUzEgICBNQ1MwICAgKi8KKyAgICAgICAgeyAgMTYsICAgICAgICAgMTUsICAgICAgICAgMTQsICAgICAgICAgMTN9LCAgLypNQ1M0ICAgTUNTMyAgICBNQ1MyICAgTUNTMSAgICovCisgICAgICAgIHsgIDE3LCAgICAgICAgIDE2LCAgICAgICAgIDE1LCAgICAgICAgIDE0fSwgIC8qTUNTNSAgIE1DUzQgICAgTUNTMyAgIE1DUzIgICAqLworICAgICAgICB7ICAxOCwgICAgICAgICAxNywgICAgICAgICAxNiwgICAgICAgICAxNX0sICAvKk1DUzYgICBNQ1M1ICAgIE1DUzQgICBNQ1MzICAgKi8KKyAgICAgICAgeyAgMTksICAgICAgICAgMTgsICAgICAgICAgMTcsICAgICAgICAgMTZ9LCAgLypNQ1M3ICAgTUNTNiAgICBNQ1M1ICAgTUNTNCAgICovCisgICAgICAgIHsgIDAsICAgICAgICAgIDE5LCAgICAgICAgIDE4LCAgICAgICAgIDE3fSwgIC8qMCAgICAgIE1DUzcgICAgTUNTNiAgIE1DUzUgICAqLworICAgICAgICB7ICAwLCAgICAgICAgICAzMCwgICAgICAgICAxOSwgICAgICAgICAxOH0sICAvKjAgICAgICBNQ1M3U0cgIE1DUzcgICBNQ1M2ICAgKi8KKyAgICAgICAgeyAgMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgICAgMTl9LCAgLyowICAgICAgMCAgICAgICAwICAgICAgTUNTNyAgICovCisgICAgICAgIHsgIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAgIDMwfSwgIC8qMCAgICAgIDAgICAgICAgMCAgICAgIE1DUzdTRyAqLworICAgICAgICB7ICAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgICAwIH0sICAvKjAgICAgICAwICAgICAgIDAgICAgICAwICAgICAgKi8KKyAgICAgICAgeyAgMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgICAgMCB9ICAgLyowICAgICAgMCAgICAgICAwICAgICAgMCAgICAgICovCisgICAgfTsKKworY29uc3QgdTE2X3QgemNSYXRlW10gPQorICAgIHsKKyAgICAgICAgMSwgMiwgNSwgMTEsICAgICAgICAgICAgICAgICAgLyogMU0sIDJNLCA1TSwgMTFNICAgICAgICAgICwgIDAgIDEgIDIgIDMqLworICAgICAgICA2LCA5LCAxMiwgMTgsICAgICAgICAgICAgICAgICAvKiA2TSAgOU0gIDEyTSAgMThNICAgICAgICAgLCAgNCAgNSAgNiAgNyovCisgICAgICAgIDI0LCAzNiwgNDgsIDU0LCAgICAgICAgICAgICAgIC8qIDI0TSAgMzZNICA0OE0gIDU0TSAgICAgICAsICA4ICA5IDEwIDExKi8KKyAgICAgICAgMTMsIDI3LCA0MCwgNTQsICAgICAgICAgICAgICAgLyogTUNTMCBNQ1MxIE1DUzIgTUNTMyAgICAgICwgMTIgMTMgMTQgMTUqLworICAgICAgICA4MSwgMTA4LCAxMjEsIDEzNSwgICAgICAgICAgICAvKiBNQ1M0IE1DUzUgTUNTNiBNQ1M3ICAgICAgLCAxNiAxNyAxOCAxOSovCisgICAgICAgIDI3LCA1NCwgODEsIDEwOCwgICAgICAgICAgICAgIC8qIE1DUzggTUNTOSBNQ1MxMCBNQ1MxMSAgICAsIDIwIDIxIDIyIDIzKi8KKyAgICAgICAgMTYyLCAyMTYsIDI0MywgMjcwLCAgICAgICAgICAgLyogTUNTMTIgTUNTMTMgTUNTMTQgTUNTMTUgICwgMjQgMjUgMjYgMjcqLworICAgICAgICAyNzAsIDMwMCwgMTUwICAgICAgICAgICAgICAgICAvKiBNQ1MxNFNHLCBNQ1MxNVNHLCBNQ1M3U0cgLCAyOCAyOSAzMCovCisgICAgfTsKKworY29uc3QgdTE2X3QgUEVSVGhyZXNob2xkW10gPQorICAgIHsKKyAgICAgICAgMTAwLCA1MCwgNTAsIDUwLCAgICAvKiAxTSwgMk0sIDVNLCAxMU0gICAgICAgICAgLCAgMCAgMSAgMiAgMyovCisgICAgICAgIDUwLCA1MCwgMzAsIDMwLCAgICAgLyogNk0gIDlNICAxMk0gIDE4TSAgICAgICAgICwgIDQgIDUgIDYgIDcqLworICAgICAgICAyNSwgMjUsIDI1LCAyMCwgICAgIC8qIDI0TSAgMzZNICA0OE0gIDU0TSAgICAgICAsICA4ICA5IDEwIDExKi8KKyAgICAgICAgNTAsIDUwLCA1MCwgNDAsICAgIC8qIE1DUzAgTUNTMSBNQ1MyIE1DUzMgICAgICAsIDEyIDEzIDE0IDE1Ki8KKyAgICAgICAgMzAsIDMwLCAzMCwgMzAsICAgIC8qIE1DUzQgTUNTNSBNQ1M2IE1DUzcgICAgICAsIDE2IDE3IDE4IDE5Ki8KKyAgICAgICAgMzAsIDMwLCAyNSwgMjUsICAgIC8qIE1DUzggTUNTOSBNQ1MxMCBNQ1MxMSAgICAsIDIwIDIxIDIyIDIzKi8KKyAgICAgICAgMjUsIDI1LCAxNSwgMTUsICAgICAvKiBNQ1MxMiBNQ1MxMyBNQ1MxNCBNQ1MxNSAgLCAyNCAyNSAyNiAyNyovCisgICAgICAgIDE1LCAxNSwgMTAgICAgICAgICAgLyogTUNTMTRTRywgTUNTMTVTRyAgICAgICAgICwgMjggMjkqLworICAgIH07CisKK2NvbnN0IHUxNl90IEZhaWxEaWZmW10gPQorICAgIHsKKyAgICAgICAgNDAsIDQ2LCA0MCwgMCwgICAgICAgICAgLyogMU0sIDJNLCA1TSwgMTFNICAgICAgICAgICwgIDAgIDEgIDIgIDMqLworICAgICAgICAyNCwgMTcsIDIyLCAxNiwgICAgICAgICAvKiA2TSAgOU0gIDEyTSAgMThNICAgICAgICAgLCAgNCAgNSAgNiAgNyovCisgICAgICAgIDE5LCAxMywgNSwgMCwgICAgICAgICAgIC8qIDI0TSAgMzZNICA0OE0gIDU0TSAgICAgICAsICA4ICA5IDEwIDExKi8KKyAgICAgICAgMzYsIDIyLCAxNSwgMTksICAgICAgICAgLyogTUNTMCBNQ1MxIE1DUzIgTUNTMyAgICAgICwgMTIgMTMgMTQgMTUqLworICAgICAgICAxMiwgNSwgNCwgNywgICAgICAgICAgICAvKiBNQ1M0IE1DUzUgTUNTNiBNQ1M3ICAgICAgLCAxNiAxNyAxOCAxOSovCisgICAgICAgIDAsIDAsIDAsIDAsICAgICAgICAgICAgIC8qIE1DUzggTUNTOSBNQ1MxMCBNQ1MxMSAgICAsIDIwIDIxIDIyIDIzKi8KKyAgICAgICAgOSwgNCwgMywgMywgICAgICAgICAgICAgLyogTUNTMTIgTUNTMTMgTUNTMTQgTUNTMTUgICwgMjQgMjUgMjYgMjcqLworICAgICAgICAzLCAwLCAwICAgICAgICAgICAgICAgICAvKiBNQ1MxNFNHLCBNQ1MxNVNHICAgICAgICAgLCAyOCAyOSovCisgICAgfTsKKworCisjaWZkZWYgWk1fRU5BQkxFX0JBX1JBVEVDVFJMCit1MzJfdCBUeE1QRFVbMjldOwordTMyX3QgQkFGYWlsWzI5XTsKK3UzMl90IEJBUEVSWzI5XTsKK2NvbnN0IHUxNl90IEJBRGlmZltdID0KKyAgICB7CisgICAgICAgIDAsIDAsIDAsIDAsCisgICAgICAgIDAsIDAsIDAsIDAsCisgICAgICAgIDAsIDAsIDAsIDAsCisgICAgICAgIDM2MSwgMjIwLCAxNTEsIDE4NywKKyAgICAgICAgMTIyLCA0OCwgNDEsIDY1LAorICAgICAgICAwLCAwLCAwLCAwLAorICAgICAgICA4OCwgMzMsIDI3LCAyNSwKKyAgICAgICAgMAorICAgIH07CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmUmF0ZUN0cmxJbml0Q2VsbCAgICAgICAgICAqLworLyogICAgICBJbml0aWFsaXplIHJhdGUgY29udHJvbCBjZWxsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgdHlwZSA6IDA9PjExYiwgMT0+MTFhL2csIDI9PjExbiwgMz0+MTFuIG9uZSBUeCBzdHJlYW0gICAgICAgICAgICovCisvKiAgICAgIGdCYW5kIDogMT0+Mi40RywgMD0+NUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIE5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFN0ZXBoZW4gQ2hlbiAgICAgICAgQXRoZXJvcyBDb21tdW5pY2F0aW9ucywgSU5DLiAgICAyMDA3LjIgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHpmUmF0ZUN0cmxJbml0Q2VsbCh6ZGV2X3QqIGRldiwgc3RydWN0IHpzUmNDZWxsKiByY0NlbGwsIHU4X3QgdHlwZSwKKyAgICAgICAgdThfdCBnQmFuZCwgdThfdCBTRzQwKQoreworICAgIHU4X3QgaTsKKyAgICB1OF90IG1heHJhdGU7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgaWYgKFNHNDApIFNHNDAgPSAxOworCisgICAgaWYgKGdCYW5kICE9IDApCisgICAgeworICAgICAgICBpZiAodHlwZSA9PSAxKSAvLzExZworICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGk9MDsgaTw0OyBpKyspIC8vMU0gMk0gNU0gMTFNCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmNDZWxsLT5vcGVyYXRpb25SYXRlU2V0W2ldID0gKHU4X3QpaTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoaT00OyBpPDEwOyBpKyspIC8vMTJNIDE4TSAyNE0gMzZNIDQ4TSA1NE0KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByY0NlbGwtPm9wZXJhdGlvblJhdGVTZXRbaV0gPSAyK2k7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByY0NlbGwtPm9wZXJhdGlvblJhdGVDb3VudCA9IDEwOworICAgICAgICAgICAgcmNDZWxsLT5jdXJyZW50UmF0ZUluZGV4ID0gNTsgLy8xOE0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICh0eXBlID09IDIpIC8vMTFuZworICAgICAgICB7CisgICAgICAgICAgICBpZiAod2QtPndsYW5Nb2RlID09IFpNX01PREVfQVApIC8vQVAgMTFuZyA0ME0KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaTwxNTsgaSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmNDZWxsLT5vcGVyYXRpb25SYXRlU2V0W2ldID0gemNIdFJhdGVUYWJsZVtpXVszXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYoIVNHNDApIHJjQ2VsbC0+b3BlcmF0aW9uUmF0ZVNldFsxM10gPSAyNzsKKyAgICAgICAgICAgICAgICByY0NlbGwtPm9wZXJhdGlvblJhdGVDb3VudCA9IDE0K1NHNDA7CisgICAgICAgICAgICAgICAgcmNDZWxsLT5jdXJyZW50UmF0ZUluZGV4ID0gMTA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIC8vU1RBCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHdkLT5zdGEuaHRDdHJsQmFuZHdpZHRoID09IFpNX0JBTkRXSURUSF80ME1IWikgLy8xMW5nIDQwTQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpPTA7IGk8MTU7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmNDZWxsLT5vcGVyYXRpb25SYXRlU2V0W2ldID0gemNIdFJhdGVUYWJsZVtpXVszXTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZighU0c0MCkgcmNDZWxsLT5vcGVyYXRpb25SYXRlU2V0WzEzXSA9IDI3OworICAgICAgICAgICAgICAgICAgICByY0NlbGwtPm9wZXJhdGlvblJhdGVDb3VudCA9IDE0K1NHNDA7CisgICAgICAgICAgICAgICAgICAgIHJjQ2VsbC0+Y3VycmVudFJhdGVJbmRleCA9IDEwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlICAgIC8vMTFuZyAyME0KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpPDEzOyBpKyspCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJjQ2VsbC0+b3BlcmF0aW9uUmF0ZVNldFtpXSA9IHpjSHRSYXRlVGFibGVbaV1bMl07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmNDZWxsLT5vcGVyYXRpb25SYXRlQ291bnQgPSAxMzsKKyAgICAgICAgICAgICAgICAgICAgcmNDZWxsLT5jdXJyZW50UmF0ZUluZGV4ID0gOTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAodHlwZSA9PSAzKSAvLzExbmcgb25lIFR4IHN0cmVhbQorICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHdkLT5zdGEuaHRDdHJsQmFuZHdpZHRoID09IFpNX0JBTkRXSURUSF80ME1IWikgLy8xMW5nIDQwTSBvbmUgVHggc3RyZWFtCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZihTRzQwICE9IDApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1heHJhdGUgPSAxMzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1heHJhdGUgPSAxMjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaTxtYXhyYXRlOyBpKyspCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJjQ2VsbC0+b3BlcmF0aW9uUmF0ZVNldFtpXSA9IHpjSHRPbmVUeFN0cmVhbVJhdGVUYWJsZVtpXVszXTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByY0NlbGwtPm9wZXJhdGlvblJhdGVDb3VudCA9IGk7CisgICAgICAgICAgICAgICAgICAgIHJjQ2VsbC0+Y3VycmVudFJhdGVJbmRleCA9ICgoaSsxKSozKS80OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlICAgIC8vMTFuZyAyME0KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpPDExOyBpKyspCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJjQ2VsbC0+b3BlcmF0aW9uUmF0ZVNldFtpXSA9IHpjSHRPbmVUeFN0cmVhbVJhdGVUYWJsZVtpXVsyXTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByY0NlbGwtPm9wZXJhdGlvblJhdGVDb3VudCA9IGk7CisgICAgICAgICAgICAgICAgICAgIHJjQ2VsbC0+Y3VycmVudFJhdGVJbmRleCA9ICgoaSsxKSozKS80OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIC8vaWYgKHR5cGUgPT0gMCkgLy8xMWIKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChpPTA7IGk8NDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJjQ2VsbC0+b3BlcmF0aW9uUmF0ZVNldFtpXSA9ICh1OF90KWk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByY0NlbGwtPm9wZXJhdGlvblJhdGVDb3VudCA9IDQ7CisgICAgICAgICAgICByY0NlbGwtPmN1cnJlbnRSYXRlSW5kZXggPSByY0NlbGwtPm9wZXJhdGlvblJhdGVDb3VudC0xOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmICh0eXBlID09IDIpIC8vMTFuYQorICAgICAgICB7CisgICAgICAgICAgICBpZiAod2QtPndsYW5Nb2RlID09IFpNX01PREVfQVApIC8vQVAgMTFuYSA0ME0KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaTwoMTIrU0c0MCk7IGkrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJjQ2VsbC0+b3BlcmF0aW9uUmF0ZVNldFtpXSA9IHpjSHRSYXRlVGFibGVbaV1bMV07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJjQ2VsbC0+b3BlcmF0aW9uUmF0ZUNvdW50ID0gMTIrU0c0MDsKKyAgICAgICAgICAgICAgICByY0NlbGwtPmN1cnJlbnRSYXRlSW5kZXggPSA4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSAvL1NUQQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICh3ZC0+c3RhLmh0Q3RybEJhbmR3aWR0aCA9PSBaTV9CQU5EV0lEVEhfNDBNSFopIC8vMTFuYSA0ME0KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpPCgxMitTRzQwKTsgaSsrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByY0NlbGwtPm9wZXJhdGlvblJhdGVTZXRbaV0gPSB6Y0h0UmF0ZVRhYmxlW2ldWzFdOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJjQ2VsbC0+b3BlcmF0aW9uUmF0ZUNvdW50ID0gMTIrU0c0MDsKKyAgICAgICAgICAgICAgICAgICAgcmNDZWxsLT5jdXJyZW50UmF0ZUluZGV4ID0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSAgICAvLzExbmEgMjBNCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaTwxMTsgaSsrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByY0NlbGwtPm9wZXJhdGlvblJhdGVTZXRbaV0gPSB6Y0h0UmF0ZVRhYmxlW2ldWzBdOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJjQ2VsbC0+b3BlcmF0aW9uUmF0ZUNvdW50ID0gMTE7CisgICAgICAgICAgICAgICAgICAgIHJjQ2VsbC0+Y3VycmVudFJhdGVJbmRleCA9IDc7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHR5cGUgPT0gMykgLy8xMW5hIG9uZSBUeCBzdHJlYW0KKyAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICh3ZC0+c3RhLmh0Q3RybEJhbmR3aWR0aCA9PSBaTV9CQU5EV0lEVEhfNDBNSFopIC8vMTFuYSA0ME0gb25lIFR4IHN0cmVhbQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoU0c0MCAhPSAwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBtYXhyYXRlID0gMTE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBtYXhyYXRlID0gMTA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZm9yIChpPTA7IGk8bWF4cmF0ZTsgaSsrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByY0NlbGwtPm9wZXJhdGlvblJhdGVTZXRbaV0gPSB6Y0h0T25lVHhTdHJlYW1SYXRlVGFibGVbaV1bMV07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmNDZWxsLT5vcGVyYXRpb25SYXRlQ291bnQgPSBpOworICAgICAgICAgICAgICAgICAgICByY0NlbGwtPmN1cnJlbnRSYXRlSW5kZXggPSAoKGkrMSkqMykvNDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSAgICAvLzExbmcgMjBNCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaTw5OyBpKyspCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJjQ2VsbC0+b3BlcmF0aW9uUmF0ZVNldFtpXSA9IHpjSHRPbmVUeFN0cmVhbVJhdGVUYWJsZVtpXVswXTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByY0NlbGwtPm9wZXJhdGlvblJhdGVDb3VudCA9IGk7CisgICAgICAgICAgICAgICAgICAgIHJjQ2VsbC0+Y3VycmVudFJhdGVJbmRleCA9ICgoaSsxKSozKS80OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIC8vaWYgKHR5cGUgPT0gMSkgLy8xMWEKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChpPTA7IGk8ODsgaSsrKSAvLzZNIDlNIDEyTSAxOE0gMjRNIDM2TSA0OE0gNTRNCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmNDZWxsLT5vcGVyYXRpb25SYXRlU2V0W2ldID0gaSs0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmNDZWxsLT5vcGVyYXRpb25SYXRlQ291bnQgPSA4OworICAgICAgICAgICAgcmNDZWxsLT5jdXJyZW50UmF0ZUluZGV4ID0gNDsgIC8vMjRNCisgICAgICAgIH0KKyAgICB9CisKKyAgICByY0NlbGwtPmZsYWcgPSAwOworICAgIHJjQ2VsbC0+dHhDb3VudCA9IDA7CisgICAgcmNDZWxsLT5mYWlsQ291bnQgPSAwOworICAgIHJjQ2VsbC0+Y3VycmVudFJhdGUgPSByY0NlbGwtPm9wZXJhdGlvblJhdGVTZXRbcmNDZWxsLT5jdXJyZW50UmF0ZUluZGV4XTsKKyAgICByY0NlbGwtPmxhc3R0eENvdW50ID0gMDsKKyAgICByY0NlbGwtPmxhc3RUaW1lICAgID0gd2QtPnRpY2s7CisgICAgcmNDZWxsLT5wcm9iaW5nVGltZSA9IHdkLT50aWNrOworICAgIGZvciAoaT0wOyBpPFpNX1JBVEVfVEFCTEVfU0laRTsgaSsrKSB7CisgICAgICAgIHdkLT5QRVJbaV0gPSAwOworICAgICAgICB3ZC0+dHhNUERVW2ldID0gd2QtPnR4RmFpbFtpXSA9IDA7CisgICAgfQorICAgIHdkLT5wcm9iZUNvdW50ID0gMDsKKyAgICB3ZC0+cHJvYmVJbnRlcnZhbCA9IDA7CisjaWZkZWYgWk1fRU5BQkxFX0JBX1JBVEVDVFJMCisgICAgZm9yIChpPTA7IGk8Mjk7IGkrKykgeworICAgICAgICBUeE1QRFVbaV09MDsKKyAgICAgICAgQkFGYWlsW2ldPTA7CisgICAgICAgIEJBUEVSW2ldPTA7CisgICAgfQorI2VuZGlmCisgICAgcmV0dXJuOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZlJhdGVDdHJsR2V0SGlnaGVyUmF0ZSAgICAgKi8KKy8qICAgICAgR2V0IGEgaGlnaGVyIHJhdGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgcmNDZWxsIDogcmF0ZSBjb250cm9sIGNlbGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgcmF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiBDaGVuICAgICAgICBBdGhlcm9zIENvbW11bmljYXRpb25zLCBJTkMuICAgIDIwMDcuMiAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3U4X3QgemZSYXRlQ3RybEdldEhpZ2hlclJhdGUoc3RydWN0IHpzUmNDZWxsKiByY0NlbGwpCit7CisgICAgdThfdCByYXRlSW5kZXg7CisKKyAgICByYXRlSW5kZXggPSByY0NlbGwtPmN1cnJlbnRSYXRlSW5kZXgKKyAgICAgICAgICAgICsgKCgocmNDZWxsLT5jdXJyZW50UmF0ZUluZGV4KzEpIDwgcmNDZWxsLT5vcGVyYXRpb25SYXRlQ291bnQpPzE6MCk7CisgICAgcmV0dXJuIHJjQ2VsbC0+b3BlcmF0aW9uUmF0ZVNldFtyYXRlSW5kZXhdOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZlJhdGVDdHJsTmV4dExvd2VyUmF0ZSAgICAgKi8KKy8qICAgICAgR2V0IGEgbG93ZXIgcmF0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgcmNDZWxsIDogcmF0ZSBjb250cm9sIGNlbGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgcmF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiBDaGVuICAgICAgICBBdGhlcm9zIENvbW11bmljYXRpb25zLCBJTkMuICAgIDIwMDcuMiAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3U4X3QgemZSYXRlQ3RybE5leHRMb3dlclJhdGUoemRldl90KiBkZXYsIHN0cnVjdCB6c1JjQ2VsbCogcmNDZWxsKQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICBpZiAocmNDZWxsLT5jdXJyZW50UmF0ZUluZGV4ID4gMCkKKyAgICB7CisgICAgICAgIHJjQ2VsbC0+Y3VycmVudFJhdGVJbmRleC0tOworICAgICAgICByY0NlbGwtPmN1cnJlbnRSYXRlID0gcmNDZWxsLT5vcGVyYXRpb25SYXRlU2V0W3JjQ2VsbC0+Y3VycmVudFJhdGVJbmRleF07CisgICAgfQorICAgIHptX21zZzFfdHgoWk1fTFZfMCwgIkxvd2VyIFR4IFJhdGU9IiwgcmNDZWxsLT5jdXJyZW50UmF0ZSk7CisgICAgLy9EYmdQcmludCgiTG93ZXIgVHggUmF0ZT0lZCIsIHJjQ2VsbC0+Y3VycmVudFJhdGUpOworICAgIHJjQ2VsbC0+ZmFpbENvdW50ID0gcmNDZWxsLT50eENvdW50ID0gMDsKKyAgICByY0NlbGwtPmxhc3R0eENvdW50ID0gMDsKKyAgICByY0NlbGwtPmxhc3RUaW1lICA9IHdkLT50aWNrOworICAgIHJldHVybiByY0NlbGwtPmN1cnJlbnRSYXRlOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZlJhdGVDdHJsUmF0ZURpZmYgICAgICAgICAgKi8KKy8qICAgICAgUmF0ZSBkaWZmZXJlbmNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgcmNDZWxsIDogcmF0ZSBjb250cm9sIGNlbGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIHJldHJ5UmF0ZSA6IHJldHJ5IHJhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIHJhdGUgZGlmZmVyZW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFN0ZXBoZW4gQ2hlbiAgICAgICAgQXRoZXJvcyBDb21tdW5pY2F0aW9ucywgSU5DLiAgICAyMDA3LjIgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1OF90IHpmUmF0ZUN0cmxSYXRlRGlmZihzdHJ1Y3QgenNSY0NlbGwqIHJjQ2VsbCwgdThfdCByZXRyeVJhdGUpCit7CisgICAgdTE2X3QgaTsKKworICAgIC8qIEZpbmQgcmV0cnlSYXRlIGluIG9wZXJhdGlvblJhdGVTZXRbXSAqLworICAgIGZvciAoaT0wOyBpPHJjQ2VsbC0+b3BlcmF0aW9uUmF0ZUNvdW50OyBpKyspCisgICAgeworICAgICAgICBpZiAocmV0cnlSYXRlID09IHJjQ2VsbC0+b3BlcmF0aW9uUmF0ZVNldFtpXSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGkgPCByY0NlbGwtPmN1cnJlbnRSYXRlSW5kZXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuICgocmNDZWxsLT5jdXJyZW50UmF0ZUluZGV4IC0gaSkrMSk+PjE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChpID09IHJjQ2VsbC0+Y3VycmVudFJhdGVJbmRleCA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIC8qIFRPRE8gOiByZXRyeSByYXRlIG5vdCBpbiBvcGVyYXRpb24gcmF0ZSBzZXQgKi8KKyAgICB6bV9tc2cxX3R4KFpNX0xWXzAsICJOb3QgaW4gb3BlcmF0aW9uIHJhdGUgc2V0OiIsIHJldHJ5UmF0ZSk7CisgICAgcmV0dXJuIDE7CisKK30KKwordTMyX3QgemZSYXRlQ3RybFVEUFRQKHpkZXZfdCogZGV2LCB1MTZfdCBSYXRlLCB1MzJfdCBQRVIpIHsKKyAgICBpZiAoKFBFUiA8IDEwMCkgJiYgKFJhdGUgPiAwKSAmJiBQRVIpCisgICAgICAgIHJldHVybiAxMTY4MDAwLygoKDEyMzA0L1JhdGUpKzE5NykqKDEwMCsxMDAqUEVSLygxMDAtUEVSKSkpOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKK3U4X3QgemZSYXRlQ3RybEZpbmRNYXhVRFBUUCh6ZGV2X3QqIGRldiwgc3RydWN0IHpzUmNDZWxsKiByY0NlbGwpIHsKKyAgICB1OF90IGksIG1heEluZGV4PTAsIHJhdGVJbmRleDsKKyAgICB1MzJfdCBtYXg9MCwgVURQVGhyb3VnaHB1dDsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHJhdGVJbmRleCA9IHptX2FnZ19taW4ocmNDZWxsLT5jdXJyZW50UmF0ZUluZGV4KzMsIHJjQ2VsbC0+b3BlcmF0aW9uUmF0ZUNvdW50LTEpOworICAgIGZvciAoaT1yY0NlbGwtPmN1cnJlbnRSYXRlSW5kZXg7IGkgPCByYXRlSW5kZXg7IGkrKykgeworICAgICAgICBVRFBUaHJvdWdocHV0ID0gemZSYXRlQ3RybFVEUFRQKGRldiwgemNSYXRlW3JjQ2VsbC0+b3BlcmF0aW9uUmF0ZVNldFtpXV0sCisgICAgICAgICAgICB3ZC0+UEVSW3JjQ2VsbC0+b3BlcmF0aW9uUmF0ZVNldFtpXV0pOworICAgICAgICBpZiAobWF4IDwgVURQVGhyb3VnaHB1dCkgeworICAgICAgICAgICAgbWF4ID0gVURQVGhyb3VnaHB1dDsKKyAgICAgICAgICAgIG1heEluZGV4ID0gaTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiByY0NlbGwtPm9wZXJhdGlvblJhdGVTZXRbbWF4SW5kZXhdOworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmUmF0ZUN0cmxHZXRUeFJhdGUgICAgICAgICAqLworLyogICAgICBHZXQgdHJhbnNtaXNzaW9uIHJhdGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgcmNDZWxsIDogcmF0ZSBjb250cm9sIGNlbGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIHByb2JpbmcgOiByYXRlIHByb2JpbmcgZmxhZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFR4IHJhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFN0ZXBoZW4gQ2hlbiAgICAgICAgQXRoZXJvcyBDb21tdW5pY2F0aW9ucywgSU5DLiAgICAyMDA3LjIgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MTZfdCB6ZlJhdGVDdHJsR2V0VHhSYXRlKHpkZXZfdCogZGV2LCBzdHJ1Y3QgenNSY0NlbGwqIHJjQ2VsbCwgdTE2X3QqIHByb2JpbmcpCit7CisgICAgdThfdCBuZXdSYXRlLCBoaWdoUmF0ZTsKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bV9tc2cxX3R4KFpNX0xWXzMsICJ0eENvdW50PSIsIHJjQ2VsbC0+dHhDb3VudCk7CisgICAgem1fbXNnMV90eChaTV9MVl8zLCAicHJvYmluZ1RpbWU9IiwgcmNDZWxsLT5wcm9iaW5nVGltZSk7CisgICAgem1fbXNnMV90eChaTV9MVl8zLCAidGljaz0iLCB3ZC0+dGljayk7CisgICAgKnByb2JpbmcgPSAwOworICAgIG5ld1JhdGUgPSByY0NlbGwtPmN1cnJlbnRSYXRlOworCisgICAgaWYgKHdkLT5wcm9iZUNvdW50ICYmICh3ZC0+cHJvYmVDb3VudCA8IHdkLT5zdWNjZXNzX3Byb2JpbmcpKQorICAgIHsKKyAgICAgICAgaWYgKHdkLT5wcm9iZUludGVydmFsIDwgNTApCisgICAgICAgIHsKKyAgICAgICAgICAgIHdkLT5wcm9iZUludGVydmFsKys7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB3ZC0+cHJvYmVJbnRlcnZhbCsrOworICAgICAgICAgICAgaWYgKHdkLT5wcm9iZUludGVydmFsID4gNTIpIC8vcHJvYmUgNTEsIDUyLCA1MyB0aHJlZSBwYWNrZXRzIGV2ZXJ5IDUwIHBhY2tldHMKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3ZC0+cHJvYmVJbnRlcnZhbCA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBuZXdSYXRlPXpmUmF0ZUN0cmxHZXRIaWdoZXJSYXRlKHJjQ2VsbCk7CisgICAgICAgICAgICAqcHJvYmluZyA9IDE7CisgICAgICAgICAgICB3ZC0+cHJvYmVDb3VudCsrOworICAgICAgICAgICAgcmNDZWxsLT5wcm9iaW5nVGltZSA9IHdkLT50aWNrOworICAgICAgICB9CisgICAgfQorICAgIC8qIEFjY3VtdWxhdGUgYXQgbGVhc3QgMTAwMG1zIGFuZCA4IHBhY2tldHMgb3IgQWNjdW11bGF0ZSBvdmVyIDFLIHBhY2tldHMgKi8KKyAgICBlbHNlIGlmICgoKCh3ZC0+dGljayAtIHJjQ2VsbC0+cHJvYmluZ1RpbWUpID4gKFpNX1JBVEVfQ1RSTF9QUk9CSU5HX0lOVEVSVkFMX01TL1pNX01TX1BFUl9USUNLKSkKKyAgICAgICAgICAgICAgICAmJiAocmNDZWxsLT50eENvdW50ID49IFpNX1JBVEVfQ1RSTF9NSU5fUFJPQklOR19QQUNLRVQpKQorICAgICAgICB8fCAocmNDZWxsLT50eENvdW50ID49IDEwMDApKQorICAgIHsKKyNpZm5kZWYgWk1fRElTQUJMRV9SQVRFX0NUUkwKKyAgICAgICAgLyogUEVSID0gZmFpbC90b3RhbCAqLworICAgICAgICB3ZC0+cHJvYmVDb3VudCA9IDA7CisgICAgICAgIHdkLT5wcm9iZVN1Y2Nlc3NDb3VudCA9IDA7CisgICAgICAgIGlmICh3ZC0+dHhNUERVW3JjQ2VsbC0+Y3VycmVudFJhdGVdICE9IDApIHsKKyAgICAgICAgICAgIHdkLT5QRVJbcmNDZWxsLT5jdXJyZW50UmF0ZV0gPSB6bV9hZ2dfbWluKDEwMCwKKyAgICAgICAgICAgICAgICAod2QtPnR4RmFpbFtyY0NlbGwtPmN1cnJlbnRSYXRlXSoxMDApL3dkLT50eE1QRFVbcmNDZWxsLT5jdXJyZW50UmF0ZV0pOworICAgICAgICAgICAgaWYgKCF3ZC0+UEVSW3JjQ2VsbC0+Y3VycmVudFJhdGVdKSB3ZC0+UEVSW3JjQ2VsbC0+Y3VycmVudFJhdGVdICsrOworICAgICAgICB9CisKKyAgICAgICAgLyogaWYgUEVSIDwgdGhyZXNob2xkLCBkbyByYXRlIHByb2JpbmcsIHJldHVybiBwcm9iaW5nIHJhdGUgKi8KKyAgICAgICAgaWYgKCh3ZC0+UEVSW3JjQ2VsbC0+Y3VycmVudFJhdGVdIDw9IChaTV9SQVRFX1BST0JJTkdfVEhSRVNIT0xEKzE1KSkgfHwKKyAgICAgICAgICAgICgocmNDZWxsLT5jdXJyZW50UmF0ZSA8PSAxNikgJiYKKyAgICAgICAgICAgICgod2QtPlBFUltyY0NlbGwtPmN1cnJlbnRSYXRlXS8yKSA8PSBaTV9SQVRFX1BST0JJTkdfVEhSRVNIT0xEKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgobmV3UmF0ZT16ZlJhdGVDdHJsR2V0SGlnaGVyUmF0ZShyY0NlbGwpKSAhPSByY0NlbGwtPmN1cnJlbnRSYXRlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICpwcm9iaW5nID0gMTsKKyAgICAgICAgICAgICAgICB3ZC0+cHJvYmVDb3VudCsrOworICAgICAgICAgICAgICAgIHdkLT5wcm9iZUludGVydmFsID0gMDsKKyAgICAgICAgICAgICAgICB3ZC0+c3VjY2Vzc19wcm9iaW5nID0KKyAgICAgICAgICAgICAgICAgICAgKHJjQ2VsbC0+Y3VycmVudFJhdGUgPD0gMTYpPyAoWk1fUkFURV9TVUNDRVNTX1BST0JJTkcvMikgOiBaTV9SQVRFX1NVQ0NFU1NfUFJPQklORzsKKyAgICAgICAgICAgICAgICAvL0RiZ1ByaW50KCJTdGFydCBQcm9iaW5nIik7CisgICAgICAgICAgICAgICAgem1fbXNnMV90eChaTV9MVl8wLCAiUHJvYmluZyBSYXRlPSIsIG5ld1JhdGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisjZW5kaWYKKworICAgICAgICB6bV9tc2cwX3R4KFpNX0xWXzEsICJEaW1pbmlzaCBjb3VudGVyIik7CisgICAgICAgIHJjQ2VsbC0+ZmFpbENvdW50ID0gcmNDZWxsLT5mYWlsQ291bnQ+PjE7CisgICAgICAgIHJjQ2VsbC0+dHhDb3VudCA9IHJjQ2VsbC0+dHhDb3VudD4+MTsKKyAgICAgICAgd2QtPnR4RmFpbFtyY0NlbGwtPmN1cnJlbnRSYXRlXSA9IHdkLT50eEZhaWxbcmNDZWxsLT5jdXJyZW50UmF0ZV0gPj4gMTsKKyAgICAgICAgd2QtPnR4TVBEVVtyY0NlbGwtPmN1cnJlbnRSYXRlXSA9IHdkLT50eE1QRFVbcmNDZWxsLT5jdXJyZW50UmF0ZV0gPj4gMTsKKworCisgICAgICAgIGlmIChyY0NlbGwtPmN1cnJlbnRSYXRlID4gMTUpIHsKKyAgICAgICAgICAgIGhpZ2hSYXRlID0gemZSYXRlQ3RybEdldEhpZ2hlclJhdGUocmNDZWxsKTsKKyAgICAgICAgICAgIGlmICgoaGlnaFJhdGUgIT0gcmNDZWxsLT5jdXJyZW50UmF0ZSkgJiYgd2QtPlBFUltoaWdoUmF0ZV0gJiYKKyAgICAgICAgICAgICAgICAoKHdkLT5QRVJbcmNDZWxsLT5jdXJyZW50UmF0ZV0gKyBGYWlsRGlmZltyY0NlbGwtPmN1cnJlbnRSYXRlXSkgPgorICAgICAgICAgICAgICAgIHdkLT5QRVJbaGlnaFJhdGVdKSkgeworICAgICAgICAgICAgICAgIC8vRGJnUHJpbnQoIlBFUiBjb21wYXJlIGZvcmNlIHJhaXNlIHJhdGUgdG8gJWQiLCBoaWdoUmF0ZSk7CisgICAgICAgICAgICAgICAgd2QtPnByb2JlU3VjY2Vzc0NvdW50ID0gd2QtPnByb2JlQ291bnQgPSBaTV9SQVRFX1NVQ0NFU1NfUFJPQklORzsKKyAgICAgICAgICAgICAgICB6ZlJhdGVDdHJsVHhTdWNjZXNzRXZlbnQoZGV2LCByY0NlbGwsIGhpZ2hSYXRlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGhpZ2hSYXRlID0gemZSYXRlQ3RybEZpbmRNYXhVRFBUUChkZXYsIHJjQ2VsbCk7CisgICAgICAgICAgICBpZiAocmNDZWxsLT5jdXJyZW50UmF0ZSA8IGhpZ2hSYXRlKSB7CisgICAgICAgICAgICAgICAgLy9EYmdQcmludCgiVURQIFRocm91Z2hwdXQgY29tcGFyZSBmb3JjZSByYWlzZSByYXRlIHRvICVkIiwgaGlnaFJhdGUpOworICAgICAgICAgICAgICAgIHdkLT5wcm9iZVN1Y2Nlc3NDb3VudCA9IHdkLT5wcm9iZUNvdW50ID0gWk1fUkFURV9TVUNDRVNTX1BST0JJTkc7CisgICAgICAgICAgICAgICAgemZSYXRlQ3RybFR4U3VjY2Vzc0V2ZW50KGRldiwgcmNDZWxsLCBoaWdoUmF0ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmNDZWxsLT5wcm9iaW5nVGltZSA9IHdkLT50aWNrOworICAgIH0KKworICAgIGlmKCAod2QtPnRpY2sgPiAxMDAwKQorICAgICAgICAmJiAoKHdkLT50aWNrIC0gcmNDZWxsLT5sYXN0VGltZSkgPiAzODQwKSApCisgICAgeworICAgICAgICBpZiAocmNDZWxsLT5sYXN0dHhDb3VudCA8IDcwKQorICAgICAgICB7CisgICAgICAgICAgICByY0NlbGwtPmZhaWxDb3VudCA9IHJjQ2VsbC0+ZmFpbENvdW50Pj4xOworICAgICAgICAgICAgcmNDZWxsLT50eENvdW50ID0gcmNDZWxsLT50eENvdW50Pj4xOworICAgICAgICAgICAgd2QtPnR4RmFpbFtyY0NlbGwtPmN1cnJlbnRSYXRlXSA9IHdkLT50eEZhaWxbcmNDZWxsLT5jdXJyZW50UmF0ZV0gPj4gMTsKKyAgICAgICAgICAgIHdkLT50eE1QRFVbcmNDZWxsLT5jdXJyZW50UmF0ZV0gPSB3ZC0+dHhNUERVW3JjQ2VsbC0+Y3VycmVudFJhdGVdID4+IDE7CisKKyAgICAgICAgICAgIHJjQ2VsbC0+ZmFpbENvdW50ID0gKHJjQ2VsbC0+ZmFpbENvdW50IDwgcmNDZWxsLT50eENvdW50KT8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmNDZWxsLT5mYWlsQ291bnQgOiByY0NlbGwtPnR4Q291bnQ7CisgICAgICAgICAgICB3ZC0+dHhGYWlsW3JjQ2VsbC0+Y3VycmVudFJhdGVdID0gKHdkLT50eEZhaWxbcmNDZWxsLT5jdXJyZW50UmF0ZV0gPCB3ZC0+dHhNUERVW3JjQ2VsbC0+Y3VycmVudFJhdGVdKT8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+dHhGYWlsW3JjQ2VsbC0+Y3VycmVudFJhdGVdIDogd2QtPnR4TVBEVVtyY0NlbGwtPmN1cnJlbnRSYXRlXTsKKyAgICAgICAgfQorCisgICAgICAgIHJjQ2VsbC0+bGFzdFRpbWUgICAgPSB3ZC0+dGljazsKKyAgICAgICAgcmNDZWxsLT5sYXN0dHhDb3VudCA9IDA7CisgICAgfQorCisgICAgcmNDZWxsLT50eENvdW50Kys7CisgICAgcmNDZWxsLT5sYXN0dHhDb3VudCsrOworICAgIHdkLT50eE1QRFVbcmNDZWxsLT5jdXJyZW50UmF0ZV0rKzsKKyAgICB6bV9tc2cxX3R4KFpNX0xWXzEsICJHZXQgVHggUmF0ZT0iLCBuZXdSYXRlKTsKKyAgICByZXR1cm4gbmV3UmF0ZTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZSYXRlQ3RybFR4RmFpbEV2ZW50ICAgICAgICovCisvKiAgICAgIFR4IGZhaWwgZXZlbnQuIENhbGN1bGF0ZSBQRVIgYW5kIGxvd2VyIFR4IHJhdGUgaWYgdW5kZXIgICAgICAgICAqLworLyogICAgICBQRVIgdW5kZXIgdGhyZXNob2xkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICByY0NlbGwgOiByYXRlIGNvbnRyb2wgY2VsbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgcmV0cnlSYXRlIDogcmV0cnkgcmF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiBDaGVuICAgICAgICBBdGhlcm9zIENvbW11bmljYXRpb25zLCBJTkMuICAgIDIwMDcuMiAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgemZSYXRlQ3RybFR4RmFpbEV2ZW50KHpkZXZfdCogZGV2LCBzdHJ1Y3QgenNSY0NlbGwqIHJjQ2VsbCwgdThfdCBhZ2dSYXRlLCB1MzJfdCByZXRyeVJhdGUpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworI2lmbmRlZiBaTV9ESVNBQkxFX1JBVEVfQ1RSTAorICAgIC8vRGJnUHJpbnQoImFnZ1JhdGU9JWQsIHJldHJ5UmF0ZT0lZCIsIGFnZ1JhdGUsIHJldHJ5UmF0ZSk7CisgICAgaWYgKGFnZ1JhdGUgJiYgKGFnZ1JhdGUgIT0gcmNDZWxsLT5jdXJyZW50UmF0ZSkpIHsKKyAgICAgICAgd2QtPnR4RmFpbFthZ2dSYXRlXSArPSByZXRyeVJhdGU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoIWFnZ1JhdGUpIHsKKyAgICAgICAgcmV0cnlSYXRlID0gKHpmUmF0ZUN0cmxSYXRlRGlmZihyY0NlbGwsICh1OF90KXJldHJ5UmF0ZSkrMSk+PjE7CisgICAgICAgIGlmIChyY0NlbGwtPmN1cnJlbnRSYXRlIDwxMikgLy9sZWdhY3kgcmF0ZQorICAgICAgICB7CisgICAgICAgICAgICByZXRyeVJhdGUqPTI7CisgICAgICAgIH0KKyAgICB9CisgICAgcmNDZWxsLT5mYWlsQ291bnQgKz0gcmV0cnlSYXRlOworICAgIHdkLT50eEZhaWxbcmNDZWxsLT5jdXJyZW50UmF0ZV0gKz0gcmV0cnlSYXRlOworCisgICAgLy9EYmdQcmludCgiZmFpbENvdW50PSVkIiwgcmNDZWxsLT5mYWlsQ291bnQpOworICAgIGlmIChyY0NlbGwtPmZhaWxDb3VudCA+IFpNX01JTl9SQVRFX0ZBSUxfQ09VTlQpCisgICAgeworICAgICAgICBpZiAod2QtPnR4TVBEVVtyY0NlbGwtPmN1cnJlbnRSYXRlXSAhPSAwKSB7CisgICAgICAgICAgICB3ZC0+UEVSW3JjQ2VsbC0+Y3VycmVudFJhdGVdID0gem1fYWdnX21pbigxMDAsCisgICAgICAgICAgICAgICAgKHdkLT50eEZhaWxbcmNDZWxsLT5jdXJyZW50UmF0ZV0qMTAwKS93ZC0+dHhNUERVW3JjQ2VsbC0+Y3VycmVudFJhdGVdKTsKKyAgICAgICAgICAgIGlmICghd2QtPlBFUltyY0NlbGwtPmN1cnJlbnRSYXRlXSkgd2QtPlBFUltyY0NlbGwtPmN1cnJlbnRSYXRlXSArKzsKKyAgICAgICAgfQorICAgICAgICAvL3ptX21zZzFfdHgoWk1fTFZfMSwgIlBFUj0iLCBwZXIpOworICAgICAgICAvL0RiZ1ByaW50KCJQRVI9JWQsIHR4RmFpbD0lZCwgdHhNUERVPSVkIiwgd2QtPlBFUltyY0NlbGwtPmN1cnJlbnRSYXRlXSwgd2QtPnR4RmFpbFtyY0NlbGwtPmN1cnJlbnRSYXRlXSwgd2QtPnR4TVBEVVtyY0NlbGwtPmN1cnJlbnRSYXRlXSk7CisgICAgICAgIGlmICh3ZC0+UEVSW3JjQ2VsbC0+Y3VycmVudFJhdGVdID4gUEVSVGhyZXNob2xkW3JjQ2VsbC0+Y3VycmVudFJhdGVdKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBMb3dlciBUeCBSYXRlIGlmIFBFUiA8IFRIUkVTSE9MRCAqLworICAgICAgICAgICAgemZSYXRlQ3RybE5leHRMb3dlclJhdGUoZGV2LCByY0NlbGwpOworICAgICAgICAgICAgcmNDZWxsLT5mbGFnIHw9IFpNX1JDX1RSQUlORURfQklUOworCisgICAgICAgICAgICAvLyBSZXNvbHZlIGNvbXBhdGliaWxpdHkgcHJvYmxlbSB3aXRoIE1hcnZlbGwKKyAgICAgICAgICAgIGlmKHJjQ2VsbC0+Y3VycmVudFJhdGUgPT0gMTUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgICAgICB6ZkhwU2V0QWdnUGt0TnVtKGRldiwgOCk7CisgICAgICAgICAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgd2QtPnR4RmFpbFtyY0NlbGwtPmN1cnJlbnRSYXRlXSA9IHdkLT50eEZhaWxbcmNDZWxsLT5jdXJyZW50UmF0ZV0gPj4gMTsKKyAgICAgICAgICAgIHdkLT50eE1QRFVbcmNDZWxsLT5jdXJyZW50UmF0ZV0gPSB3ZC0+dHhNUERVW3JjQ2VsbC0+Y3VycmVudFJhdGVdID4+IDE7CisKKyAgICAgICAgICAgIHdkLT5wcm9iZUNvdW50ID0gd2QtPnByb2JlU3VjY2Vzc0NvdW50ID0gMDsKKyAgICAgICAgfQorICAgIH0KKworI2VuZGlmCisgICAgcmV0dXJuOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZlJhdGVDdHJsVHhTdWNjZXNzRXZlbnQgICAgKi8KKy8qICAgICAgVHggc3VjY2VzcyBldmVudC4gUmFpc2UgVHggcmF0ZSBiZWNhdXNlIHJhdGUgcHJvYmluZyBzdWNjZXNzLiAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgcmNDZWxsIDogcmF0ZSBjb250cm9sIGNlbGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIHN1Y2Nlc3NSYXRlIDogc3VjY2VzcyByYXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIE5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFN0ZXBoZW4gQ2hlbiAgICAgICAgQXRoZXJvcyBDb21tdW5pY2F0aW9ucywgSU5DLiAgICAyMDA3LjIgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHpmUmF0ZUN0cmxUeFN1Y2Nlc3NFdmVudCh6ZGV2X3QqIGRldiwgc3RydWN0IHpzUmNDZWxsKiByY0NlbGwsIHU4X3Qgc3VjY2Vzc1JhdGUpCit7CisgICAgLyogUmFpc2UgVHggUmF0ZSAqLworICAgIHUxNl90IGksIFBFUlByb2JlOworICAgIHUxNl90IHBjb3VudDsKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgLy9EYmdQcmludCgiUHJvYmluZyBzdWNjZXNzUmF0ZT0lZCIsIHN1Y2Nlc3NSYXRlKTsKKyAgICAvKiBGaW5kIHN1Y2Nlc3NSYXRlIGluIG9wZXJhdGlvblJhdGVTZXRbXSAqLworICAgIHdkLT5wcm9iZVN1Y2Nlc3NDb3VudCsrOworICAgIGlmICh3ZC0+cHJvYmVDb3VudCA8IHdkLT5zdWNjZXNzX3Byb2JpbmcpCisgICAgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgcGNvdW50ID0gd2QtPnByb2JlQ291bnQ7CisgICAgaWYgKHBjb3VudCAhPSAwKQorICAgIHsKKyAgICAgICAgUEVSUHJvYmUgPSB3ZC0+cHJvYmVTdWNjZXNzQ291bnQgKiAxMDAgLyBwY291bnQ7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIFBFUlByb2JlID0gMTsKKyAgICB9CisKKyAgICBpZiAoUEVSUHJvYmUgPCAoKHJjQ2VsbC0+Y3VycmVudFJhdGUgPCAxNik/IDgwOjEwMCkpCisgICAgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIC8vRGJnUHJpbnQoIndkLT5wcm9iZUNvdW50PSVkLCB3ZC0+cHJvYmVTdWNjZXNzQ291bnQ9JWQiLCB3ZC0+cHJvYmVDb3VudCwgd2QtPnByb2JlU3VjY2Vzc0NvdW50KTsKKyAgICB3ZC0+cHJvYmVDb3VudCA9IHdkLT5wcm9iZVN1Y2Nlc3NDb3VudCA9IDA7CisgICAgZm9yIChpPTA7IGk8cmNDZWxsLT5vcGVyYXRpb25SYXRlQ291bnQ7IGkrKykKKyAgICB7CisgICAgICAgIGlmIChzdWNjZXNzUmF0ZSA9PSByY0NlbGwtPm9wZXJhdGlvblJhdGVTZXRbaV0pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChpID4gcmNDZWxsLT5jdXJyZW50UmF0ZUluZGV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIFJhaXNlIGN1cnJlbnQgVHggcmF0ZSAqLworICAgICAgICAgICAgICAgIHptX21zZzFfdHgoWk1fTFZfMCwgIlJhaXNlIFR4IFJhdGU9Iiwgc3VjY2Vzc1JhdGUpOworICAgICAgICAgICAgICAgIC8vRGJnUHJpbnQoIlJhaXNlIFR4IFJhdGU9JWQiLCBzdWNjZXNzUmF0ZSk7CisKKyAgICAgICAgICAgICAgICAvLyBSZXNvbHZlIGNvbXBhdGliaWxpdHkgcHJvYmxlbSB3aXRoIE1hcnZlbGwKKyAgICAgICAgICAgICAgICBpZigocmNDZWxsLT5jdXJyZW50UmF0ZSA8PSAxNSkgJiYgKHN1Y2Nlc3NSYXRlID4gMTUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgICAgICAgICAgemZIcFNldEFnZ1BrdE51bShkZXYsIDE2KTsKKyAgICAgICAgICAgICAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByY0NlbGwtPmN1cnJlbnRSYXRlID0gc3VjY2Vzc1JhdGU7CisgICAgICAgICAgICAgICAgcmNDZWxsLT5jdXJyZW50UmF0ZUluZGV4ID0gKHU4X3QpaTsKKyAgICAgICAgICAgICAgICByY0NlbGwtPmZhaWxDb3VudCA9IHJjQ2VsbC0+dHhDb3VudCA9IDA7CisgICAgICAgICAgICAgICAgcmNDZWxsLT5sYXN0dHhDb3VudCA9IDA7CisgICAgICAgICAgICAgICAgcmNDZWxsLT5sYXN0VGltZSAgPSB3ZC0+dGljazsKKyAgICAgICAgICAgICAgICB3ZC0+dHhGYWlsW3JjQ2VsbC0+Y3VycmVudFJhdGVdID0gd2QtPnR4RmFpbFtyY0NlbGwtPmN1cnJlbnRSYXRlXSA+PiAxOworICAgICAgICAgICAgICAgIHdkLT50eE1QRFVbcmNDZWxsLT5jdXJyZW50UmF0ZV0gPSB3ZC0+dHhNUERVW3JjQ2VsbC0+Y3VycmVudFJhdGVdID4+IDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm47Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmUmF0ZUN0cmxSeFJzc2lFdmVudCAgICAgICAqLworLyogICAgICBSeCBSU1NJIGV2ZW50LiBDYWxjdWxhdGUgUlNTSSBtb3ZpbmcgYXZlcmFnZSwgYWNjZWxhcmF0ZSAgICAgICAgKi8KKy8qICAgICAgcmF0ZSBwcm9iaW5nIGlmIFJTU0kgdmFyaWF0aW9uIG92ZXIgdGhyZXNob2xkLiAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgcmNDZWxsIDogcmF0ZSBjb250cm9sIGNlbGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIHN1Y2Nlc3NSYXRlIDogc3VjY2VzcyByYXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIE5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFN0ZXBoZW4gQ2hlbiAgICAgICAgQXRoZXJvcyBDb21tdW5pY2F0aW9ucywgSU5DLiAgICAyMDA3LjIgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHpmUmF0ZUN0cmxSeFJzc2lFdmVudChzdHJ1Y3QgenNSY0NlbGwqIHJjQ2VsbCwgdTE2X3QgcnhSc3NpKQoreworICAgIC8qIGlmIGRlbHRhKHJjQ2VsbC0+cnhSc3NpLCByeFJzc2kpID4gWk1fUkFURV9DVFJMX1JTU0lfVkFSSUFUSU9OICovCisgICAgaWYgKChyY0NlbGwtPnJ4UnNzaSAtIHJ4UnNzaSkgPiBaTV9SQVRFX0NUUkxfUlNTSV9WQVJJQVRJT04pCisgICAgeworICAgICAgICAvKiBBY2NlbGVyYXRlIHJhdGUgcHJvYmluZyB2aWEgZGVjcmVhaW5nIHJjQ2VsbC0+cHJvYmluZ1RpbWUgKi8KKyAgICAgICAgcmNDZWxsLT5wcm9iaW5nVGltZSAtPSBaTV9SQVRFX0NUUkxfUFJPQklOR19JTlRFUlZBTF9NUy9aTV9NU19QRVJfVElDSzsKKyAgICB9CisKKyAgICAvKiBVcGRhdGUgUlNTSSBtb3ZpbmcgYXZlcmFnZSAqLworICAgIHJjQ2VsbC0+cnhSc3NpID0gKCgocmNDZWxsLT5yeFJzc2kqNykgKyByeFJzc2kpKzQpID4+IDM7CisgICAgcmV0dXJuOworfQorCisKKyNpZmRlZiBaTV9FTkFCTEVfQkFfUkFURUNUUkwKK3U4X3QgSGlnaGVyUmF0ZSh1OF90IFJhdGUpIHsKKyAgICBpZiAoUmF0ZSA8IDI4KSBSYXRlKys7IC8vMjg9TUNTMTVTRywgMjc9TUNTMTUsIDI2PU1DUzE0LCAyNT1NQ1MxMworICAgIGlmIChSYXRlID4gMjgpIFJhdGUgPSAyODsKKyAgICB3aGlsZSAoKFJhdGUgPj0gMjApICYmIChSYXRlIDw9IDIzKSkgeworICAgICAgICBSYXRlICsrOworICAgIH0KKyAgICByZXR1cm4gUmF0ZTsKK30KKwordThfdCBMb3dlclJhdGUodThfdCBSYXRlKSB7CisgICAgaWYgKFJhdGUgPiAxKSBSYXRlLS07CisgICAgd2hpbGUgKChSYXRlID49IDIwKSAmJiAoUmF0ZSA8PSAyMykpIHsKKyAgICAgICAgUmF0ZSAtLTsKKyAgICB9CisgICAgcmV0dXJuIFJhdGU7Cit9CisKK3U4X3QgUmF0ZU1hcFRvUmF0ZUluZGV4KHU4X3QgUmF0ZSwgc3RydWN0IHpzUmNDZWxsKiByY0NlbGwpIHsKKyAgICB1OF90IGk7CisgICAgZm9yIChpPTA7IGk8cmNDZWxsLT5vcGVyYXRpb25SYXRlQ291bnQ7IGkrKykgeworICAgICAgICBpZiAoUmF0ZSA9PSByY0NlbGwtPm9wZXJhdGlvblJhdGVTZXRbaV0pIHsKKyAgICAgICAgICAgIHJldHVybiBpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQorCit2b2lkIHpmUmF0ZUN0cmxBZ2dyU3RhKHpkZXZfdCogZGV2KSB7CisgICAgdThfdCBSYXRlSW5kZXgsIFJhdGU7CisgICAgdThfdCBIUmF0ZTsKKyAgICB1OF90IExSYXRlOworICAgIHUzMl90IFJhdGVDdHJsVHhNUERVLCBSYXRlQ3RybEJBRmFpbDsKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBSYXRlSW5kZXggPSB3ZC0+c3RhLm9wcG9zaXRlSW5mb1swXS5yY0NlbGwuY3VycmVudFJhdGVJbmRleDsKKyAgICBSYXRlID0gd2QtPnN0YS5vcHBvc2l0ZUluZm9bMF0ucmNDZWxsLm9wZXJhdGlvblJhdGVTZXRbUmF0ZUluZGV4XTsKKworICAgIFR4TVBEVVtSYXRlXSA9IChUeE1QRFVbUmF0ZV0gLyA1KSArICh3ZC0+Y29tbVRhbGx5LlJhdGVDdHJsVHhNUERVICogNCAvIDUpOworICAgIEJBRmFpbFtSYXRlXSA9IChCQUZhaWxbUmF0ZV0gLyA1KSArICh3ZC0+Y29tbVRhbGx5LlJhdGVDdHJsQkFGYWlsICogNCAvIDUpOworICAgIFJhdGVDdHJsVHhNUERVID0gd2QtPmNvbW1UYWxseS5SYXRlQ3RybFR4TVBEVTsKKyAgICBSYXRlQ3RybEJBRmFpbCA9IHdkLT5jb21tVGFsbHkuUmF0ZUN0cmxCQUZhaWw7CisgICAgd2QtPmNvbW1UYWxseS5SYXRlQ3RybFR4TVBEVSA9IDA7CisgICAgd2QtPmNvbW1UYWxseS5SYXRlQ3RybEJBRmFpbCA9IDA7CisgICAgaWYgKFR4TVBEVVtSYXRlXSA+IDApIHsKKyAgICAgICAgQkFQRVJbUmF0ZV0gPSBCQUZhaWxbUmF0ZV0gKiAxMDAwIC8gVHhNUERVW1JhdGVdOyAvL1BFUioxMDAwCisgICAgICAgIEJBUEVSW1JhdGVdID0gKEJBUEVSW1JhdGVdPjApPyBCQVBFUltSYXRlXToxOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEhSYXRlID0gSGlnaGVyUmF0ZShSYXRlKTsKKyAgICBMUmF0ZSA9IExvd2VyUmF0ZShSYXRlKTsKKyAgICBpZiAoQkFQRVJbUmF0ZV0+MjAwKSB7CisgICAgICAgIGlmICgoUmF0ZUN0cmxUeE1QRFUgPiAxMDApICYmIChCQVBFUltSYXRlXTwzMDApICYmIChIUmF0ZSAhPSBSYXRlKSAmJiBCQVBFUltIUmF0ZV0gJiYKKyAgICAgICAgICAgIChCQVBFUltIUmF0ZV0gPCBCQVBFUltSYXRlXSArIEJBRGlmZltSYXRlXSkpIHsKKyAgICAgICAgICAgIFJhdGUgPSBIUmF0ZTsKKyAgICAgICAgICAgIC8vRGJnUHJpbnQoIlJhdGUgaW1wcm92ZWQgdG8gJWQiLCBSYXRlKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIFJhdGUgPSBMUmF0ZTsKKyAgICAgICAgICAgIC8vRGJnUHJpbnQoIlJhdGUgZGVjcmVhc2VkIHRvICVkIiwgUmF0ZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoQkFQRVJbUmF0ZV0gJiYgQkFQRVJbUmF0ZV08MTAwKSB7CisgICAgICAgIGlmIChSYXRlQ3RybFR4TVBEVSA+IDEwMCkgeworICAgICAgICAgICAgUmF0ZSA9IEhSYXRlOworICAgICAgICAgICAgLy9EYmdQcmludCgiUmF0ZSBpbXByb3ZlZCB0byAlZCIsIFJhdGUpOworICAgICAgICB9CisgICAgfQorICAgIHdkLT5zdGEub3Bwb3NpdGVJbmZvWzBdLnJjQ2VsbC5jdXJyZW50UmF0ZSA9IFJhdGU7CisgICAgd2QtPnN0YS5vcHBvc2l0ZUluZm9bMF0ucmNDZWxsLmN1cnJlbnRSYXRlSW5kZXggPSBSYXRlTWFwVG9SYXRlSW5kZXgoUmF0ZSwgJndkLT5zdGEub3Bwb3NpdGVJbmZvWzBdLnJjQ2VsbCk7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9yYXRlY3RybC5oIGIvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL3JhdGVjdHJsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTI0MTFkNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9yYXRlY3RybC5oCkBAIC0wLDAgKzEsMzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBBdGhlcm9zIENvbW11bmljYXRpb25zIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisjaWZuZGVmIF9SQVRFQ1RSTF9ICisjZGVmaW5lIF9SQVRFQ1RSTF9ICisKKyNkZWZpbmUgWk1fUkFURV9DVFJMX1BST0JJTkdfSU5URVJWQUxfTVMgICAgMTAwMCAvLzEwMDBtcworI2RlZmluZSBaTV9SQVRFX0NUUkxfTUlOX1BST0JJTkdfUEFDS0VUICAgICA4CisKKyNkZWZpbmUgWk1fTUlOX1JBVEVfRkFJTF9DT1VOVCAgICAgICAgICAgICAgMjAKKworI2RlZmluZSBaTV9SQVRFX1BST0JJTkdfVEhSRVNIT0xEICAgICAgICAgICAxNSAgLy82JQorI2RlZmluZSBaTV9SQVRFX1NVQ0NFU1NfUFJPQklORyAgICAgICAgICAgICAxMAorCisjZGVmaW5lIFpNX1JBVEVfQ1RSTF9SU1NJX1ZBUklBVElPTiAgICAgICAgIDUgIC8vVEJECisKK2V4dGVybiBjb25zdCB1MzJfdCB6Y1JhdGVUb1BoeUN0cmxbXTsKKworZXh0ZXJuIHZvaWQgemZSYXRlQ3RybEluaXRDZWxsKHpkZXZfdCogZGV2LCBzdHJ1Y3QgenNSY0NlbGwqIHJjQ2VsbCwgdThfdCB0eXBlLCB1OF90IGdCYW5kLCB1OF90IFNHNDApOworZXh0ZXJuIHUxNl90IHpmUmF0ZUN0cmxHZXRUeFJhdGUoemRldl90KiBkZXYsIHN0cnVjdCB6c1JjQ2VsbCogcmNDZWxsLCB1MTZfdCogcHJvYmluZyk7CitleHRlcm4gdm9pZCB6ZlJhdGVDdHJsVHhGYWlsRXZlbnQoemRldl90KiBkZXYsIHN0cnVjdCB6c1JjQ2VsbCogcmNDZWxsLCB1OF90IGFnZ1JhdGUsIHUzMl90IHJldHJ5UmF0ZSk7CitleHRlcm4gdm9pZCB6ZlJhdGVDdHJsVHhTdWNjZXNzRXZlbnQoemRldl90KiBkZXYsIHN0cnVjdCB6c1JjQ2VsbCogcmNDZWxsLCB1OF90IHN1Y2Nlc3NSYXRlKTsKK2V4dGVybiB2b2lkIHpmUmF0ZUN0cmxBZ2dyU3RhKHpkZXZfdCogZGV2KTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL3N0cnVjdC5oIGIvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL3N0cnVjdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3YjVjZTMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvc3RydWN0LmgKQEAgLTAsMCArMSwxMzE1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggQXRoZXJvcyBDb21tdW5pY2F0aW9ucyBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworI2lmbmRlZiBfU1RSVUNUX0gKKyNkZWZpbmUgX1NUUlVDVF9ICisKKyNpbmNsdWRlICIuLi9vYWxfbWFyYy5oIgorCisjZGVmaW5lIFpNX1NXX0xPT1BfQkFDSyAgICAgICAgICAgICAgICAgICAgIDAgLyogMT0+ZW5hYmxlLCAwPT5kaXNhYmxlICovCisjZGVmaW5lIFpNX1BDSV9MT09QX0JBQ0sgICAgICAgICAgICAgICAgICAgIDAgLyogMT0+ZW5hYmxlLCAwPT5kaXNhYmxlICovCisjZGVmaW5lIFpNX1BST1RPQ09MX1JFU1BPTlNFX1NJTVVMQVRJT04gICAgIDAKKworI2RlZmluZSBaTV9SWF9GUkFNRV9TSVpFICAgICAgICAgICAgICAgMTYwMAorCitleHRlcm4gY29uc3QgdThfdCB6ZzExYlJhdGVUYmxbNF07CitleHRlcm4gY29uc3QgdThfdCB6ZzExZ1JhdGVUYmxbOF07CisKKyNkZWZpbmUgWk1fRFJJVkVSX0NPUkVfTUFKT1JfVkVSU0lPTiAgICAgICAgMQorI2RlZmluZSBaTV9EUklWRVJfQ09SRV9NSU5PUl9WRVJTSU9OICAgICAgICAxCisjZGVmaW5lIFpNX0RSSVZFUl9DT1JFX0JSQU5DSF9NQUpPUl9WRVJTSU9OIDMKKyNkZWZpbmUgWk1fRFJJVkVSX0NPUkVfQlJBTkNIX01JTk9SX1ZFUlNJT04gMzkKKworI2lmbmRlZiBaTV9WVFhRX1NJWkUKKyNkZWZpbmUgWk1fVlRYUV9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgMTAyNCAvLzJeTgorI2VuZGlmCisKKyNkZWZpbmUgWk1fVlRYUV9TSVpFX01BU0sgICAgICAgICAgICAgICAgICAgKFpNX1ZUWFFfU0laRS0xKQorI2RlZmluZSBaTV9WTU1RX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICA4IC8vMl5OCisjZGVmaW5lIFpNX1ZNTVFfU0laRV9NQVNLICAgICAgICAgICAgICAgICAgIChaTV9WTU1RX1NJWkUtMSkKKworI2luY2x1ZGUgImNhZ2cuaCIKKworI2RlZmluZSBaTV9BR0dfUE9PTF9TSVpFICAgICAgICAgICAgICAgICAgICAyMAorI2RlZmluZSBaTV9SQVRFX1RBQkxFX1NJWkUgICAgICAgICAgICAgICAgICAzMgorCisjZGVmaW5lIFpNX01BWF9CVUZfRElTQ1JFVEVfTlVNQkVSICAgICAgICAgIDUKKworCisKKworCisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogSUJTUyBtYWNyb3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgWk1fSUJTU19QRUVSX0FMSVZFX0NPVU5URVIgICAgIDQKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBCSVQgbWFwcGluZyByZWxhdGVkIG1hY3JvcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIFpNX0JJVF8wICAgICAgIDB4MQorI2RlZmluZSBaTV9CSVRfMSAgICAgICAweDIKKyNkZWZpbmUgWk1fQklUXzIgICAgICAgMHg0CisjZGVmaW5lIFpNX0JJVF8zICAgICAgIDB4OAorI2RlZmluZSBaTV9CSVRfNCAgICAgICAweDEwCisjZGVmaW5lIFpNX0JJVF81ICAgICAgIDB4MjAKKyNkZWZpbmUgWk1fQklUXzYgICAgICAgMHg0MAorI2RlZmluZSBaTV9CSVRfNyAgICAgICAweDgwCisjZGVmaW5lIFpNX0JJVF84ICAgICAgIDB4MTAwCisjZGVmaW5lIFpNX0JJVF85ICAgICAgIDB4MjAwCisjZGVmaW5lIFpNX0JJVF8xMCAgICAgIDB4NDAwCisjZGVmaW5lIFpNX0JJVF8xMSAgICAgIDB4ODAwCisjZGVmaW5lIFpNX0JJVF8xMiAgICAgIDB4MTAwMAorI2RlZmluZSBaTV9CSVRfMTMgICAgICAweDIwMDAKKyNkZWZpbmUgWk1fQklUXzE0ICAgICAgMHg0MDAwCisjZGVmaW5lIFpNX0JJVF8xNSAgICAgIDB4ODAwMAorI2RlZmluZSBaTV9CSVRfMTYgICAgICAweDEwMDAwCisjZGVmaW5lIFpNX0JJVF8xNyAgICAgIDB4MjAwMDAKKyNkZWZpbmUgWk1fQklUXzE4ICAgICAgMHg0MDAwMAorI2RlZmluZSBaTV9CSVRfMTkgICAgICAweDgwMDAwCisjZGVmaW5lIFpNX0JJVF8yMCAgICAgIDB4MTAwMDAwCisjZGVmaW5lIFpNX0JJVF8yMSAgICAgIDB4MjAwMDAwCisjZGVmaW5lIFpNX0JJVF8yMiAgICAgIDB4NDAwMDAwCisjZGVmaW5lIFpNX0JJVF8yMyAgICAgIDB4ODAwMDAwCisjZGVmaW5lIFpNX0JJVF8yNCAgICAgIDB4MTAwMDAwMAorI2RlZmluZSBaTV9CSVRfMjUgICAgICAweDIwMDAwMDAKKyNkZWZpbmUgWk1fQklUXzI2ICAgICAgMHg0MDAwMDAwCisjZGVmaW5lIFpNX0JJVF8yNyAgICAgIDB4ODAwMDAwMAorI2RlZmluZSBaTV9CSVRfMjggICAgICAweDEwMDAwMDAwCisjZGVmaW5lIFpNX0JJVF8yOSAgICAgIDB4MjAwMDAwMDAgICAvL1dQQSBzdXBwb3J0CisjZGVmaW5lIFpNX0JJVF8zMCAgICAgIDB4NDAwMDAwMDAKKyNkZWZpbmUgWk1fQklUXzMxICAgICAgMHg4MDAwMDAwMAorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogTUFDIGFkZHJlc3MgcmVsYXRlZCBtYWNyb3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgWk1fTUFDX0JZVEVfVE9fV09SRChtYWNiLCBtYWN3KSAgIG1hY3dbMF0gPSBtYWNiWzBdICsgKG1hY2JbMV0gPDwgOCk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hY3dbMV0gPSBtYWNiWzJdICsgKG1hY2JbM10gPDwgOCk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hY3dbMl0gPSBtYWNiWzRdICsgKG1hY2JbNV0gPDwgOCk7CisKKyNkZWZpbmUgWk1fTUFDX1dPUkRfVE9fQllURShtYWN3LCBtYWNiKSAgIG1hY2JbMF0gPSAodThfdCkgKG1hY3dbMF0gJiAweGZmKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFjYlsxXSA9ICh1OF90KSAobWFjd1swXSA+PiA4KTsgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWNiWzJdID0gKHU4X3QpIChtYWN3WzFdICYgMHhmZik7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hY2JbM10gPSAodThfdCkgKG1hY3dbMV0gPj4gOCk7ICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFjYls0XSA9ICh1OF90KSAobWFjd1syXSAmIDB4ZmYpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWNiWzVdID0gKHU4X3QpIChtYWN3WzJdID4+IDgpOworCisjZGVmaW5lIFpNX01BQ18wKG1hY3cpICAgKCh1OF90KShtYWN3WzBdICYgMHhmZikpCisjZGVmaW5lIFpNX01BQ18xKG1hY3cpICAgKCh1OF90KShtYWN3WzBdID4+IDgpKQorI2RlZmluZSBaTV9NQUNfMihtYWN3KSAgICgodThfdCkobWFjd1sxXSAmIDB4ZmYpKQorI2RlZmluZSBaTV9NQUNfMyhtYWN3KSAgICgodThfdCkobWFjd1sxXSA+PiA4KSkKKyNkZWZpbmUgWk1fTUFDXzQobWFjdykgICAoKHU4X3QpKG1hY3dbMl0gJiAweGZmKSkKKyNkZWZpbmUgWk1fTUFDXzUobWFjdykgICAoKHU4X3QpKG1hY3dbMl0gPj4gOCkpCisKKyNkZWZpbmUgWk1fSVNfTVVMVElDQVNUX09SX0JST0FEQ0FTVChtYWMpIChtYWNbMF0gJiAweDAxKQorI2RlZmluZSBaTV9JU19NVUxUSUNBU1QobWFjKSAoKG1hY1swXSAmIDB4MDEpICYmICgoKHU4X3QpbWFjWzBdKSAhPSAweEZGKSkKKworI2RlZmluZSBaTV9NQUNfRVFVQUwobWFjMSwgbWFjMikgICAoKG1hYzFbMF09PW1hYzJbMF0pJiYobWFjMVsxXT09bWFjMlsxXSkmJihtYWMxWzJdPT1tYWMyWzJdKSkKKyNkZWZpbmUgWk1fTUFDX05PVF9FUVVBTChtYWMxLCBtYWMyKSAgICgobWFjMVswXSE9bWFjMlswXSl8fChtYWMxWzFdIT1tYWMyWzFdKXx8KG1hYzFbMl0hPW1hYzJbMl0pKQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBNQUMgYWRkcmVzcyByZWxhdGVkIG1hYydyb3MgKGVuZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgWk1fQllURV9UT19XT1JEKEEsIEIpICAgKChBPDw4KStCKQorI2RlZmluZSBaTV9ST0wzMiggQSwgbiApIFwKKyAgICAgICAgKCAoKEEpIDw8IChuKSkgfCAoICgoQSk+PigzMi0obikpKSAgJiAoICgxVUwgPDwgKG4pKSAtIDEgKSApICkKKyNkZWZpbmUgWk1fUk9SMzIoIEEsIG4gKSBaTV9ST0wzMiggKEEpLCAzMi0obikgKQorI2RlZmluZSBaTV9MTzgodjE2KSAgKCh1OF90KSgodjE2KSAmIDB4RkYpKQorI2RlZmluZSBaTV9ISTgodjE2KSAgKCh1OF90KSgoKHYxNik+PjgpJjB4RkYpKQorCisjaWZkZWYgWk1fRU5BQkxFX0JVRkZFUl9UUkFDRQorZXh0ZXJuIHZvaWQgemZ3QnVmVHJhY2UoemRldl90KiBkZXYsIHpidWZfdCAqYnVmLCB1OF90ICpmdW5jdGlvbk5hbWUpOworI2RlZmluZSBaTV9CVUZGRVJfVFJBQ0UoZGV2LCBidWYpICAgICAgIHpmd0J1ZlRyYWNlKGRldiwgYnVmLCBfX2Z1bmNfXyk7CisjZWxzZQorI2RlZmluZSBaTV9CVUZGRVJfVFJBQ0UoZGV2LCBidWYpCisjZW5kaWYKKworLyogbm90aWZpY2F0aW9uIGV2ZW50cyB0byBoZWFydCBiZWF0IGZ1bmN0aW9uICovCisjZGVmaW5lIFpNX0JTU0lEX0xJU1RfU0NBTiAgICAgICAgIDB4MDEKKworLyogQ0FNIG1vZGUgKi8KKyNkZWZpbmUgWk1fQ0FNX0FQICAgICAgICAgICAgICAgICAgICAgICAweDEKKyNkZWZpbmUgWk1fQ0FNX1NUQSAgICAgICAgICAgICAgICAgICAgICAweDIKKyNkZWZpbmUgWk1fQ0FNX0hPU1QgICAgICAgICAgICAgICAgICAgICAweDQKKworLyogZmluaXRlIHN0YXRlIG1hY2hpbmUgZm9yIGFkYXB0ZXIgKi8KKyNkZWZpbmUgWk1fU1RBX1NUQVRFX0RJU0NPTk5FQ1QgICAgICAgICAgIDEKKyNkZWZpbmUgWk1fU1RBX1NUQVRFX0NPTk5FQ1RJTkcgICAgICAgICAgIDIKKyNkZWZpbmUgWk1fU1RBX1NUQVRFX0NPTk5FQ1RFRCAgICAgICAgICAgIDMKKworLyogRXZlbnQgZGVmaW5pdGlvbnMgZm9yICBmaW5pdGUgc3RhdGUgbWFjaGluZSAqLworI2RlZmluZSBaTV9FVkVOVF9USU1FT1VUX1NDQU4gICAgICAgICAgICAgMHgwMDAwCisjZGVmaW5lIFpNX0VWRU5UX1RJTUVPVVRfQkdfU0NBTiAgICAgICAgICAweDAwMDEKKyNkZWZpbmUgWk5fRVZFTlRfVElNRU9VVF9SRUNPTk5FQ1QgICAgICAgIDB4MDAwMgorI2RlZmluZSBaTV9FVkVOVF9USU1FT1VUX0lOSVRfU0NBTiAgICAgICAgMHgwMDAzCisjZGVmaW5lIFpNX0VWRU5UX1RJTUVPVVRfQVVUSCAgICAgICAgICAgICAweDAwMDQKKyNkZWZpbmUgWk1fRVZFTlRfVElNRU9VVF9BU1NPICAgICAgICAgICAgIDB4MDAwNQorI2RlZmluZSBaTV9FVkVOVF9USU1FT1VUX0FVVE9fU0NBTiAgICAgICAgMHgwMDA2CisjZGVmaW5lIFpNX0VWRU5UX1RJTUVPVVRfTUlDX0ZBSUwgICAgICAgICAweDAwMDcKKyNkZWZpbmUgWk1fRVZFTlRfVElNRU9VVF9DSEVDS19BUCAgICAgICAgIDB4MDAwOAorI2RlZmluZSBaTV9FVkVOVF9DT05ORUNUICAgICAgICAgICAgICAgICAgMHgwMDA5CisjZGVmaW5lIFpNX0VWRU5UX0lOSVRfU0NBTiAgICAgICAgICAgICAgICAweDAwMGEKKyNkZWZpbmUgWk1fRVZFTlRfU0NBTiAgICAgICAgICAgICAgICAgICAgIDB4MDAwYgorI2RlZmluZSBaTV9FVkVOVF9CR19TQ0FOICAgICAgICAgICAgICAgICAgMHgwMDBjCisjZGVmaW5lIFpNX0VWRU5UX0RJU0NPTk5FQ1QgICAgICAgICAgICAgICAweDAwMGQKKyNkZWZpbmUgWk1fRVZFTlRfV1BBX01JQ19GQUlMICAgICAgICAgICAgIDB4MDAwZQorI2RlZmluZSBaTV9FVkVOVF9BUF9BTElWRSAgICAgICAgICAgICAgICAgMHgwMDBmCisjZGVmaW5lIFpNX0VWRU5UX0NIQU5HRV9UT19BUCAgICAgICAgICAgICAweDAwMTAKKyNkZWZpbmUgWk1fRVZFTlRfQ0hBTkdFX1RPX1NUQSAgICAgICAgICAgIDB4MDAxMQorI2RlZmluZSBaTV9FVkVOVF9JRExFICAgICAgICAgICAgICAgICAgICAgMHgwMDEyCisjZGVmaW5lIFpNX0VWRU5UX0FVVEggICAgICAgICAgICAgICAgICAgICAweDAwMTMKKyNkZWZpbmUgWk1fRVZFTlRfQVNTT19SU1AgICAgICAgICAgICAgICAgIDB4MDAxNAorI2RlZmluZSBaTV9FVkVOVF9XUEFfUEtfT0sgICAgICAgICAgICAgICAgMHgwMDE1CisjZGVmaW5lIFpNX0VWRU5UX1dQQV9HS19PSyAgICAgICAgICAgICAgICAweDAwMTYKKyNkZWZpbmUgWk1fRVZFTlRfUkNWX0JFQUNPTiAgICAgICAgICAgICAgIDB4MDAxNworI2RlZmluZSBaTV9FVkVOVF9SQ1ZfUFJPQkVfUlNQICAgICAgICAgICAgMHgwMDE4CisjZGVmaW5lIFpNX0VWRU5UX1NFTkRfREFUQSAgICAgICAgICAgICAgICAweDAwMTkKKyNkZWZpbmUgWk1fRVZFTlRfQVVUT19TQ0FOICAgICAgICAgICAgICAgIDB4MDAxYQorI2RlZmluZSBaTV9FVkVOVF9NSUNfRkFJTDEgICAgICAgICAgICAgICAgMHgwMDFkCisjZGVmaW5lIFpNX0VWRU5UX01JQ19GQUlMMiAgICAgICAgICAgICAgICAweDAwMWUKKyNkZWZpbmUgWk1fRVZFTlRfSUJTU19NT05JVE9SICAgICAgICAgICAgIDB4MDAxZgorI2RlZmluZSBaTV9FVkVOVF9JTl9TQ0FOICAgICAgICAgICAgICAgICAgMHgwMDIwCisjZGVmaW5lIFpNX0VWRU5UX0NNX1RJTUVSICAgICAgICAgICAgICAgICAweDAwMjEKKyNkZWZpbmUgWk1fRVZFTlRfQ01fRElTQ09OTkVDVCAgICAgICAgICAgIDB4MDAyMgorI2RlZmluZSBaTV9FVkVOVF9DTV9CTE9DS19USU1FUiAgICAgICAgICAgMHgwMDIzCisjZGVmaW5lIFpNX0VWRU5UX1RJTUVPVVRfQUREQkEgICAgICAgICAgICAweDAwMjQKKyNkZWZpbmUgWk1fRVZFTlRfVElNRU9VVF9QRVJGT1JNQU5DRSAgICAgIDB4MDAyNQorI2RlZmluZSBaTV9FVkVOVF9TS0lQX0NPVU5URVJNRUFTVVJFCSAgMHgwMDI2CisjZGVmaW5lIFpNX0VWRU5UX05PTkUgICAgICAgICAgICAgICAgICAgICAweGZmZmYKKworLyogQWN0aW9ucyBhZnRlciBjYWxsIGZpbml0ZSBzdGF0ZSBtYWNoaW5lICovCisjZGVmaW5lIFpNX0FDVElPTl9OT05FICAgICAgICAgICAgICAgICAgICAweDAwMDAKKyNkZWZpbmUgWk1fQUNUSU9OX1FVRVVFX0RBVEEgICAgICAgICAgICAgIDB4MDAwMQorI2RlZmluZSBaTV9BQ1RJT05fRFJPUF9EQVRBICAgICAgICAgICAgICAgMHgwMDAyCisKKy8qIFRpbWVycyBmb3IgZmluaXRlIHN0YXRlIG1hY2hpbmUgKi8KKyNkZWZpbmUgWk1fVElDS19aRVJPICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgWk1fVElDS19JTklUX1NDQU5fRU5EICAgICAgICAgICAgIDgKKyNkZWZpbmUgWk1fVElDS19ORVhUX0JHX1NDQU4gICAgICAgICAgICAgIDUwCisjZGVmaW5lIFpNX1RJQ0tfQkdfU0NBTl9FTkQgICAgICAgICAgICAgICA4CisjZGVmaW5lIFpNX1RJQ0tfQVVUSF9USU1FT1VUICAgICAgICAgICAgICA0CisjZGVmaW5lIFpNX1RJQ0tfQVNTT19USU1FT1VUICAgICAgICAgICAgICA0CisjZGVmaW5lIFpNX1RJQ0tfQVVUT19TQ0FOICAgICAgICAgICAgICAgICAzMDAKKyNkZWZpbmUgWk1fVElDS19NSUNfRkFJTF9USU1FT1VUICAgICAgICAgIDYwMDAKKyNkZWZpbmUgWk1fVElDS19DSEVDS19BUDEgICAgICAgICAgICAgICAgIDE1MAorI2RlZmluZSBaTV9USUNLX0NIRUNLX0FQMiAgICAgICAgICAgICAgICAgMzUwCisjZGVmaW5lIFpNX1RJQ0tfQ0hFQ0tfQVAzICAgICAgICAgICAgICAgICAyNTAKKyNkZWZpbmUgWk1fVElDS19JQlNTX01PTklUT1IgICAgICAgICAgICAgIDE2MAorI2RlZmluZSBaTV9USUNLX0lOX1NDQU4gICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBaTV9USUNLX0NNX1RJTUVPVVQgICAgICAgICAgICAgICAgNjAwMAorI2RlZmluZSBaTV9USUNLX0NNX0RJU0NPTk5FQ1QgICAgICAgICAgICAgMjAwCisjZGVmaW5lIFpNX1RJQ0tfQ01fQkxPQ0tfVElNRU9VVCAgICAgICAgICA2MDAwCisKKy8qIEZpeCBidWcjMzMzMzggQ291bnRlciBNZWFzdXJlIElzc3VyICovCisjaWZkZWYgTkRJU19DTV9GT1JfWFAKKyNkZWZpbmUgWk1fVElDS19DTV9USU1FT1VUX09GRlNFVCAgICAgICAgMjE2MAorI2RlZmluZSBaTV9USUNLX0NNX0RJU0NPTk5FQ1RfT0ZGU0VUICAgICA3MgorI2RlZmluZSBaTV9USUNLX0NNX0JMT0NLX1RJTUVPVVRfT0ZGU0VUICAyMTYwCisjZWxzZQorI2RlZmluZSBaTV9USUNLX0NNX1RJTUVPVVRfT0ZGU0VUICAgICAgICAwCisjZGVmaW5lIFpNX1RJQ0tfQ01fRElTQ09OTkVDVF9PRkZTRVQgICAgIDAKKyNkZWZpbmUgWk1fVElDS19DTV9CTE9DS19USU1FT1VUX09GRlNFVCAgMAorI2VuZGlmCisKKyNkZWZpbmUgWk1fVElNRV9BQ1RJVkVfU0NBTiAgICAgICAgICAgICAgIDMwIC8vbXMKKyNkZWZpbmUgWk1fVElNRV9QQVNTSVZFX1NDQU4gICAgICAgICAgICAgIDExMCAvL21zCisKKy8qIGZpbml0ZSBzdGF0ZSBtYWNoaW5lIGZvciBCU1MgY29ubmVjdCAqLworI2RlZmluZSBaTV9TVEFfQ09OTl9TVEFURV9OT05FICAgICAgICAgICAgMAorI2RlZmluZSBaTV9TVEFfQ09OTl9TVEFURV9BVVRIX09QRU4gICAgICAgMQorI2RlZmluZSBaTV9TVEFfQ09OTl9TVEFURV9BVVRIX1NIQVJFXzEgICAgMgorI2RlZmluZSBaTV9TVEFfQ09OTl9TVEFURV9BVVRIX1NIQVJFXzIgICAgMworI2RlZmluZSBaTV9TVEFfQ09OTl9TVEFURV9BU1NPQ0lBVEUgICAgICAgNAorI2RlZmluZSBaTV9TVEFfQ09OTl9TVEFURV9TU0lEX05PVF9GT1VORCAgNQorI2RlZmluZSBaTV9TVEFfQ09OTl9TVEFURV9BVVRIX0NPTVBMRVRFRCAgNgorCisvKiBmaW5pdGUgc3RhdGUgbWFjaGluZSBmb3IgV1BBIGhhbmRzaGFraW5nICovCisjZGVmaW5lIFpNX1NUQV9XUEFfU1RBVEVfSU5JVCAgICAgICAgICAgICAwCisjZGVmaW5lIFpNX1NUQV9XUEFfU1RBVEVfUEtfT0sgICAgICAgICAgICAxCisjZGVmaW5lIFpNX1NUQV9XUEFfU1RBVEVfR0tfT0sgICAgICAgICAgICAyCisKKy8qIHZhcmlvdXMgdGltZXJzICovCisjZGVmaW5lIFpNX0lOVEVSVkFMX0NPTk5FQ1RfVElNRU9VVCAgICAgICAgICAyMCAgIC8qIDIwMCBtaWxpc2Vjb25kICovCisKKy8qIElCU1MgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgWk1fSUJTU19QQVJUTkVSX0xPU1QgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgWk1fSUJTU19QQVJUTkVSX0FMSVZFICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgWk1fSUJTU19QQVJUTkVSX0NIRUNLICAgICAgICAgICAgICAgIDIKKworI2RlZmluZSBaTV9CQ01DX0FSUkFZX1NJWkUgICAgICAgICAgICAgICAgICAxNiAvKiBNdXN0IGJlIDJeTiAqLworI2RlZmluZSBaTV9VTklfQVJSQVlfU0laRSAgICAgICAgICAgICAgICAgICAxNiAvKiBNdXN0IGJlIDJeTiAqLworCisjZGVmaW5lIFpNX01BWF9ERUZSQUdfRU5UUklFUyAgICAgICAgICAgICAgIDQgIC8qIDJeTiAqLworI2RlZmluZSBaTV9ERUZSQUdfQUdJTkdfVElNRV9TRUMgICAgICAgICAgICA1ICAvKiA1IHNlY29uZHMgKi8KKworI2RlZmluZSBaTV9NQVhfV1BBSUVfU0laRSAgICAgICAgICAgICAgICAgICAxMjgKKy8qIFdFUCByZWxhdGVkIGRlZmluaXRpb25zICovCisjZGVmaW5lIFpNX1VTRVJfS0VZX0RFRkFVTFQgICAgICAgICAgICAgICAgIDY0CisjZGVmaW5lIFpNX1VTRVJfS0VZX1BLICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAgICAgICAgLyogUGFpcndpc2UgS2V5ICovCisjZGVmaW5lIFpNX1VTRVJfS0VZX0dLICAgICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgLyogR3JvdXAgS2V5ICovCisvKiBBUCBXTEFOIFR5cGUgKi8KKyNkZWZpbmUgWk1fV0xBTl9UWVBFX1BVUkVfQiAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBaTV9XTEFOX1RZUEVfUFVSRV9HICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFpNX1dMQU5fVFlQRV9NSVhFRCAgICAgICAgICAgICAgICAgIDAKKworLyogSEFMIFN0YXRlICovCisjZGVmaW5lIFpNX0hBTF9TVEFURV9JTklUICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgWk1fSEFMX1NUQVRFX1JVTk5JTkcgICAgICAgICAgICAgICAgMQorCisvKiBBUCBDYXBhYmlsaXR5ICovCisjZGVmaW5lIFpNX0FsbDExTl9BUCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgWk1fWFJfQVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMgorI2RlZmluZSBaTV9TdXBlckdfQVAgICAgICAgICAgICAgICAgICAgICAgICAweDA0CisKKy8qIE1QRFUgRGVuc2l0eSAqLworI2RlZmluZSBaTV9NUERVX0RFTlNJVFlfTk9ORSAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFpNX01QRFVfREVOU0lUWV8xXzhVUyAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgWk1fTVBEVV9ERU5TSVRZXzFfNFVTICAgICAgICAgICAgICAgMgorI2RlZmluZSBaTV9NUERVX0RFTlNJVFlfMV8yVVMgICAgICAgICAgICAgICAzCisjZGVmaW5lIFpNX01QRFVfREVOU0lUWV8xVVMgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgWk1fTVBEVV9ERU5TSVRZXzJVUyAgICAgICAgICAgICAgICAgNQorI2RlZmluZSBaTV9NUERVX0RFTlNJVFlfNFVTICAgICAgICAgICAgICAgICA2CisjZGVmaW5lIFpNX01QRFVfREVOU0lUWV84VVMgICAgICAgICAgICAgICAgIDcKKworLyogU29mdHdhcmUgRW5jcnlwdGlvbiAqLworI2RlZmluZSBaTV9TV19US0lQX0VOQ1JZX0VOICAgICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgWk1fU1dfVEtJUF9ERUNSWV9FTiAgICAgICAgICAgICAgICAweDAyCisjZGVmaW5lIFpNX1NXX1dFUF9FTkNSWV9FTiAgICAgICAgICAgICAgICAgMHgwNAorI2RlZmluZSBaTV9TV19XRVBfREVDUllfRU4gICAgICAgICAgICAgICAgIDB4MDgKKworLyogRGVmYXVsdCBTdXBwb3J0IFJhdGUgKi8KKyNkZWZpbmUgWk1fREVGQVVMVF9TVVBQT1JUX1JBVEVfWkVSTyAgICAgICAweDAKKyNkZWZpbmUgWk1fREVGQVVMVF9TVVBQT1JUX1JBVEVfRElTQ09OTkVDVCAweDEKKyNkZWZpbmUgWk1fREVGQVVMVF9TVVBQT1JUX1JBVEVfSUJTU19CICAgICAweDIKKyNkZWZpbmUgWk1fREVGQVVMVF9TVVBQT1JUX1JBVEVfSUJTU19BRyAgICAweDMKKworLyogc2VjdXJpdHkgcmVsYXRlZCBkZWZpbml0aW9ucyAqLworc3RydWN0IHpzVGtpcFNlZWQKK3sKKyAgICB1OF90ICAgdGtbMzJdOyAgICAgLyoga2V5ICovCisgICAgdThfdCAgIHRhWzZdOworICAgIHUxNl90ICB0dGFrWzVdOworICAgIHUxNl90ICBwcGtbNl07CisgICAgdTE2X3QgIGl2MTYsaXYxNnRtcDsKKyAgICB1MzJfdCAgaXYzMixpdjMydG1wOworfTsKKworc3RydWN0IHpzTWljVmFyCit7CisgICAgdTMyX3QgIGswLCBrMTsgICAgICAgIC8vIEtleQorICAgIHUzMl90ICBsZWZ0LCByaWdodDsgICAvLyBDdXJyZW50IHN0YXRlCisgICAgdTMyX3QgIG07ICAgICAgICAgICAgIC8vIE1lc3NhZ2UgYWNjdW11bGF0b3IgKHNpbmdsZSB3b3JkKQorICAgIHUxNl90ICBuQnl0ZXM7ICAgICAgICAvLyAjIGJ5dGVzIGluIE0KK307CisKK3N0cnVjdCB6c0RlZnJhZ0VudHJ5Cit7CisgICAgdThfdCAgICBmcmFnQ291bnQ7CisgICAgdThfdCAgICBhZGRyWzZdOworICAgIHUxNl90ICAgc2VxTnVtOworICAgIHpidWZfdCogZnJhZ21lbnRbOF07CisgICAgdTMyX3QgICB0aWNrOworfTsKKworc3RydWN0IHpzRGVmcmFnTGlzdAoreworICAgIHN0cnVjdCB6c0RlZnJhZ0VudHJ5ICAgZGVmcmFnRW50cnlbWk1fTUFYX0RFRlJBR19FTlRSSUVTXTsKKyAgICB1OF90ICAgICAgICAgICAgICAgICAgIHJlcGxhY2VOdW07Cit9OworCisjZGVmaW5lIFpNX01BWF9PUFBPU0lURV9DT1VOVCAgICAgIDE2CisjZGVmaW5lIFpNX01BWF9UWF9TQU1QTEVTICAgICAgICAgIDE1CisjZGVmaW5lIFpNX1RYX1JBVEVfRE9XTl9DUklURVJJQSAgIDgwCisjZGVmaW5lIFpNX1RYX1JBVEVfVVBfQ1JJVEVSSUEgICAgMjAwCisKKworI2RlZmluZSBaTV9NQVhfUFJPQkVfSElEREVOX1NTSURfU0laRSAyCitzdHJ1Y3QgenNTc2lkTGlzdAoreworICAgIHU4X3QgICAgICAgICAgICBzc2lkWzMyXTsKKyAgICB1OF90ICAgICAgICAgICAgc3NpZExlbjsKK307CisKK3N0cnVjdCB6c1dyYXBwZXJTZXR0aW5nCit7CisgICAgdThfdCAgICAgICAgICAgIGJEZXNpcmVkQnNzaWQ7CisgICAgdThfdCAgICAgICAgICAgIGRlc2lyZWRCc3NpZFs2XTsKKyAgICB1MTZfdCAgICAgICAgICAgYnNzaWRbM107CisgICAgdThfdCAgICAgICAgICAgIHNzaWRbMzJdOworICAgIHU4X3QgICAgICAgICAgICBzc2lkTGVuOworICAgIHU4X3QgICAgICAgICAgICBhdXRoTW9kZTsKKyAgICB1OF90ICAgICAgICAgICAgd2VwU3RhdHVzOworICAgIHU4X3QgICAgICAgICAgICBlbmNyeU1vZGU7CisgICAgdThfdCAgICAgICAgICAgIHdsYW5Nb2RlOworICAgIHUxNl90ICAgICAgICAgICBmcmVxdWVuY3k7CisgICAgdTE2X3QgICAgICAgICAgIGJlYWNvbkludGVydmFsOworICAgIHU4X3QgICAgICAgICAgICBkdGltOworICAgIHU4X3QgICAgICAgICAgICBwcmVhbWJsZVR5cGU7CisgICAgdTE2X3QgICAgICAgICAgIGF0aW1XaW5kb3c7CisKKyAgICBzdHJ1Y3QgenNTc2lkTGlzdCBwcm9iaW5nU3NpZExpc3RbWk1fTUFYX1BST0JFX0hJRERFTl9TU0lEX1NJWkVdOworCisgICAgdThfdCAgICAgICAgICAgIGRyb3BVbmVuY3J5cHRlZFBrdHM7CisgICAgdThfdCAgICAgICAgICAgIGlic3NKb2luT25seTsKKyAgICB1MzJfdCAgICAgICAgICAgYWRob2NNb2RlOworICAgIHU4X3QgICAgICAgICAgICBjb3VudHJ5SXNvTmFtZVs0XTsKKyAgICB1MTZfdCAgICAgICAgICAgYXV0b1NldEZyZXF1ZW5jeTsKKworICAgIC8qIEFQICovCisgICAgdThfdCAgICAgICAgICAgIGJSYXRlQmFzaWM7CisgICAgdThfdCAgICAgICAgICAgIGdSYXRlQmFzaWM7CisgICAgdTMyX3QgICAgICAgICAgIG5SYXRlQmFzaWM7CisgICAgdThfdCAgICAgICAgICAgIGJnTW9kZTsKKworICAgIC8qIENvbW1vbiAqLworICAgIHU4X3QgICAgICAgICAgICBzdGFXbWVFbmFibGVkOworICAgIHU4X3QgICAgICAgICAgICBzdGFXbWVRb3NJbmZvOworICAgIHU4X3QgICAgICAgICAgICBhcFdtZUVuYWJsZWQ7CisKKworICAgIC8qIHJhdGUgaW5mb3JtYXRpb246IGFkZGVkIGluIHRoZSBmdXR1cmUgKi8KK307CisKK3N0cnVjdCB6c1dyYXBwZXJGZWF0dXJlQ3RybAoreworICAgIHU4X3QgICAgICAgICAgIGJJYnNzR01vZGU7Cit9OworCisjZGVmaW5lICBaTV9NQVhfUFNfU1RBICAgICAgICAgICAgMTYKKyNkZWZpbmUgIFpNX1BTX1FVRVVFX1NJWkUgICAgICAgICAzMgorCitzdHJ1Y3QgenNTdGFQU0VudGl0eQoreworICAgIHU4X3QgICAgICAgICAgIGJVc2VkOworICAgIHU4X3QgICAgICAgICAgIG1hY0FkZHJbNl07CisgICAgdThfdCAgICAgICAgICAgYkRhdGFRdWV1ZWQ7Cit9OworCitzdHJ1Y3QgenNTdGFQU0xpc3QKK3sKKyAgICB1OF90ICAgICAgICAgICBjb3VudDsKKyAgICBzdHJ1Y3QgenNTdGFQU0VudGl0eSAgICBlbnRpdHlbWk1fTUFYX1BTX1NUQV07Cit9OworCisjZGVmaW5lIFpNX01BWF9USU1FUl9DT1VOVCAgIDMyCisKKy8qIGRvdWJsZSBsaW5rZWQgbGlzdCAqLworc3RydWN0IHpzVGltZXJFbnRyeQoreworICAgIHUxNl90ICAgZXZlbnQ7CisgICAgdTMyX3QgICB0aW1lcjsKKyAgICBzdHJ1Y3QgenNUaW1lckVudHJ5ICpwcmU7CisgICAgc3RydWN0IHpzVGltZXJFbnRyeSAqbmV4dDsKK307CisKK3N0cnVjdCB6c1RpbWVyTGlzdAoreworICAgIHU4X3QgICBmcmVlQ291bnQ7CisgICAgc3RydWN0IHpzVGltZXJFbnRyeSBsaXN0W1pNX01BWF9USU1FUl9DT1VOVF07CisgICAgc3RydWN0IHpzVGltZXJFbnRyeSAqaGVhZDsKKyAgICBzdHJ1Y3QgenNUaW1lckVudHJ5ICp0YWlsOworfTsKKworLyogTXVsdGljYXN0IGxpc3QgKi8KKyNkZWZpbmUgWk1fTUFYX01VTFRJQ0FTVF9MSVNUX1NJWkUgICAgIDY0CisKK3N0cnVjdCB6c011bHRpY2FzdEFkZHIKK3sKKyAgICB1OF90IGFkZHJbNl07Cit9OworCitzdHJ1Y3QgenNNdWx0aWNhc3RMaXN0Cit7CisgICAgdThfdCAgIHNpemU7CisgICAgc3RydWN0IHpzTXVsdGljYXN0QWRkciBtYWNBZGRyW1pNX01BWF9NVUxUSUNBU1RfTElTVF9TSVpFXTsKK307CisKK2VudW0gaWVlZTgwMjExX2N3bV9tb2RlIHsKKyAgICBDV01fTU9ERTIwLAorICAgIENXTV9NT0RFMjA0MCwKKyAgICBDV01fTU9ERTQwLAorICAgIENXTV9NT0RFTUFYCisKK307CisKK2VudW0gaWVlZTgwMjExX2N3bV9leHRwcm90c3BhY2luZyB7CisgICAgQ1dNX0VYVFBST1RTUEFDSU5HMjAsCisgICAgQ1dNX0VYVFBST1RTUEFDSU5HMjUsCisgICAgQ1dNX0VYVFBST1RTUEFDSU5HTUFYCit9OworCitlbnVtIGllZWU4MDIxMV9jd21fd2lkdGggeworICAgIENXTV9XSURUSDIwLAorICAgIENXTV9XSURUSDQwCit9OworCitlbnVtIGllZWU4MDIxMV9jd21fZXh0cHJvdG1vZGUgeworICAgIENXTV9FWFRQUk9UTk9ORSwgIC8qIG5vIHByb3RlY3Rpb24gKi8KKyAgICBDV01fRVhUUFJPVENUU09OTFksICAgLyogQ1RTIHRvIHNlbGYgKi8KKyAgICBDV01fRVhUUFJPVFJUU0NUUywgICAgLyogUlRTLUNUUyAqLworICAgIENXTV9FWFRQUk9UTUFYCit9OworCitzdHJ1Y3QgaWVlZTgwMjExX2N3bSB7CisKKyAgICAvKiBDb25maWd1cmF0aW9uICovCisgICAgZW51bSBpZWVlODAyMTFfY3dtX21vZGUgICAgICAgICBjd19tb2RlOyAgICAgICAgICAgIC8qIENXTSBtb2RlICovCisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBjd19leHRvZmZzZXQ7ICAgICAgIC8qIENXTSBFeHRlbnNpb24gQ2hhbm5lbCBPZmZzZXQgKi8KKyAgICBlbnVtIGllZWU4MDIxMV9jd21fZXh0cHJvdG1vZGUgIGN3X2V4dHByb3Rtb2RlOyAgICAgLyogQ1dNIEV4dGVuc2lvbiBDaGFubmVsIFByb3RlY3Rpb24gTW9kZSAqLworICAgIGVudW0gaWVlZTgwMjExX2N3bV9leHRwcm90c3BhY2luZyBjd19leHRwcm90c3BhY2luZzsvKiBDV00gRXh0ZW5zaW9uIENoYW5uZWwgUHJvdGVjdGlvbiBTcGFjaW5nICovCisgICAgdTMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICBjd19lbmFibGU7ICAgICAgICAgIC8qIENXTSBTdGF0ZSBNYWNoaW5lIEVuYWJsZWQgKi8KKyAgICB1MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgIGN3X2V4dGJ1c3l0aHJlc2hvbGQ7LyogQ1dNIEV4dGVuc2lvbiBDaGFubmVsIEJ1c3kgVGhyZXNob2xkICovCisKKyAgICAvKiBTdGF0ZSAqLworICAgIGVudW0gaWVlZTgwMjExX2N3bV93aWR0aCAgICAgICAgY3dfd2lkdGg7ICAgICAgICAgICAvKiBDV00gY2hhbm5lbCB3aWR0aCAqLworfTsKKworCisvKiBBUCA6IFNUQSBkYXRhYmFzZSBzdHJ1Y3R1cmUgKi8KK3N0cnVjdCB6c1N0YVRhYmxlCit7CisgICAgdTMyX3QgdGltZTsgICAgIC8qIHRpY2sgdGltZSAqLworICAgIC8vdTMyX3QgcGh5Q3RybDsgICAvKiBUeCBQSFkgQ1RSTCAqLworICAgIHUxNl90IGFkZHJbM107ICAvKiBTVEEgTUFDIGFkZHJlc3MgKi8KKyAgICB1MTZfdCBzdGF0ZTsgICAgLyogYXV0L2Fzb2MgKi8KKyAgICAvL3UxNl90IHJldHJ5OyAgICAvKiBSZXRyeSBjb3VudCAqLworICAgIHN0cnVjdCB6c1JjQ2VsbCByY0NlbGw7CisKKyAgICB1OF90IHZhbGlkOyAgICAgLyogVmFsaWQgZmxhZyA6IDE9PnZhbGlkICovCisgICAgdThfdCBwc01vZGU7ICAgIC8qIFNUQSBwb3dlciBzYXZpbmcgbW9kZSAqLworICAgIHU4X3Qgc3RhVHlwZTsgICAvKiAwPT4xMWIsIDE9PjExZywgMj0+MTFuICovCisgICAgdThfdCBxb3NUeXBlOyAgIC8qIDA9PkxlZ2FjeSwgMT0+V01FICovCisgICAgdThfdCBxb3NJbmZvOyAgIC8qIFdNRSBRb1MgaW5mbyAqLworICAgIHU4X3QgdmFwOyAgICAgICAvKiBWaXJ0dWFsIEFQIElEICovCisgICAgdThfdCBlbmNyeU1vZGU7IC8qIEVuY3J5cHRpb24gdHlwZSBmb3IgdGhpcyBTVEEgKi8KKyAgICB1OF90IGtleUlkeDsKKyAgICBzdHJ1Y3QgenNNaWNWYXIgICAgIHR4TWljS2V5OworICAgIHN0cnVjdCB6c01pY1ZhciAgICAgcnhNaWNLZXk7CisgICAgdTE2X3QgaXYxNjsKKyAgICB1MzJfdCBpdjMyOworI2lmZGVmIFpNX0VOQUJMRV9DRU5DCisgICAgLyogQ0VOQyAqLworICAgIHU4X3QgY2VuY0tleUlkeDsKKyAgICB1MzJfdCB0eGl2WzRdOworICAgIHUzMl90IHJ4aXZbNF07CisjZW5kaWYgLy9aTV9FTkFCTEVfQ0VOQworfTsKKworc3RydWN0IHpkU3RydWN0V2RzCit7CisgICAgdThfdCAgICB3ZHNCaXRtYXA7ICAgICAgICAgICAgICAgICAgICAgIC8qIFNldCBiaXQtTiB0byAxIHRvIGVuYWJsZSBXRFMgKi8KKyAgICB1OF90ICAgIGVuY3J5TW9kZVtaTV9NQVhfV0RTX1NVUFBPUlRdOyAgLyogV0RTIGVuY3J5cHRpb24gbW9kZSAqLworICAgIHUxNl90ICAgbWFjQWRkcltaTV9NQVhfV0RTX1NVUFBPUlRdWzNdOyAvKiBXRFMgbmVpZ2hib3IgTUFDIGFkZHJlc3MgKi8KK307CisKKyAgICAvLyBodGNhcGluZm8gMTZiaXRzCisjZGVmaW5lIEhUQ0FQX0FkdkNvZGluZ0NhcCAgICAgICAgICAweDAwMDEKKyNkZWZpbmUgSFRDQVBfU3VwQ2hhbm5lbFdpZHRoU2V0ICAgIDB4MDAwMgorI2RlZmluZSBIVENBUF9EeW5hbWljU01QUyAgICAgICAgICAgMHgwMDA0CisjZGVmaW5lIEhUQ0FQX1NNRW5hYmxlZCAgICAgICAgICAgICAweDAwMEMKKyNkZWZpbmUgSFRDQVBfR3JlZW5GaWVsZCAgICAgICAgICAgIDB4MDAxMAorI2RlZmluZSBIVENBUF9TaG9ydEdJZm9yMjBNSHogICAgICAgMHgwMDIwCisjZGVmaW5lIEhUQ0FQX1Nob3J0R0lmb3I0ME1IeiAgICAgICAweDAwNDAKKyNkZWZpbmUgSFRDQVBfVHhTVEJDICAgICAgICAgICAgICAgIDB4MDA4MAorI2RlZmluZSBIVENBUF9SeE9uZVN0cmVhbSAgICAgICAgICAgMHgwMTAwCisjZGVmaW5lIEhUQ0FQX1J4VHdvU3RyZWFtICAgICAgICAgICAweDAyMDAKKyNkZWZpbmUgSFRDQVBfUnhUaHJlZVN0cmVhbSAgICAgICAgIDB4MDMwMAorI2RlZmluZSBIVENBUF9EZWxheWVkQmxvY2tBQ0sgICAgICAgMHgwNDAwCisjZGVmaW5lIEhUQ0FQX01heEFNU0RVTGVuZ3RoICAgICAgICAweDA4MDAKKyNkZWZpbmUgSFRDQVBfRFNTU2FuZENDS2luNDBNSHogICAgIDB4MTAwMAorI2RlZmluZSBIVENBUF9QU01QU3VwICAgICAgICAgICAgICAgMHgyMDAwCisjZGVmaW5lIEhUQ0FQX1NUQkNDb250cm9sRnJhbWVTdXAgICAweDQwMDAKKyNkZWZpbmUgSFRDQVBfTFNJR1RYT1BQcm90ZWN0aW9uU1VQIDB4ODAwMAorICAgIC8vIEFtcGR1IEhUIFBhcmFtZXRlciBJbmZvIDhiaXRzCisjZGVmaW5lIEhUQ0FQX01heFJ4QU1QRFUwICAgICAgICAgICAweDAwCisjZGVmaW5lIEhUQ0FQX01heFJ4QU1QRFUxICAgICAgICAgICAweDAxCisjZGVmaW5lIEhUQ0FQX01heFJ4QU1QRFUyICAgICAgICAgICAweDAyCisjZGVmaW5lIEhUQ0FQX01heFJ4QU1QRFUzICAgICAgICAgICAweDAzCisgICAgLy8gUENPIDhiaXRzCisjZGVmaW5lIEhUQ0FQX1BDTyAgICAgICAgICAgICAgICAgICAweDAxCisjZGVmaW5lIEhUQ0FQX1RyYW5zbWlzc2lvblRpbWUxICAgICAweDAyCisjZGVmaW5lIEhUQ0FQX1RyYW5zbWlzc2lvblRpbWUyICAgICAweDA0CisjZGVmaW5lIEhUQ0FQX1RyYW5zbWlzc2lvblRpbWUzICAgICAweDA2CisgICAgLy8gTUNTIEZlZWRCYWNrIDhiaXRzCisjZGVmaW5lIEhUQ0FQX1BsdXNIVENTdXBwb3J0ICAgICAgICAweDA0CisjZGVmaW5lIEhUQ0FQX1JEUmVzcG9uZGVyICAgICAgICAgICAweDA4CisgICAgLy8gVFggQmVhbWZvcm1pbmcgMCA4Yml0cworI2RlZmluZSBIVENBUF9UeEJGQ2FwYWJsZSAgICAgICAgICAgMHgwMQorI2RlZmluZSBIVENBUF9SeFN0YWdnZXJlZFNvdW5kQ2FwICAgMHgwMgorI2RlZmluZSBIVENBUF9UeFN0YWdnZXJlZFNvdW5kQ2FwICAgMHgwNAorI2RlZmluZSBIVENBUF9SeFpMRkNhcGFibGUgICAgICAgICAgMHgwOAorI2RlZmluZSBIVENBUF9UeFpMRkNhcGFibGUgICAgICAgICAgMHgxMAorI2RlZmluZSBIVENBUF9JbXBsaWNpdFR4QkZDYXBhYmxlICAgMHgyMAorICAgIC8vIFR4IEJlYW1mb3JtaW5nIDEgOGJpdHMKKyNkZWZpbmUgSFRDQVBfRXhwbGljaXRDU0lUeEJGQ2FwICAgIDB4MDEKKyNkZWZpbmUgSFRDQVBfRXhwVW5jb21wU3RlZXJNYXRyQ2FwIDB4MDIKKyAgICAvLyBBbnRlbm5hIFNlbGVjdGlvbiBDYXBhYmlsaXRpZXMgOGJpdHMKKyNkZWZpbmUgSFRDQVBfQW50ZW5uYVNlbGVjdGlvbkNhcCAgICAgICAweDAxCisjZGVmaW5lIEhUQ0FQX0V4cGxpY2l0Q1NJVHhBU0NhcCAgICAgICAgMHgwMgorI2RlZmluZSBIVENBUF9BbnRlbm5hSW5kRmVlVHhBU0NhcCAgICAgIDB4MDQKKyNkZWZpbmUgSFRDQVBfRXhwbGljaXRDU0lGZWVkYmFja0NhcCAgICAweDA4CisjZGVmaW5lIEhUQ0FQX0FudGVubmFJbmRGZWVkYmFja0NhcCAgICAgMHgxMAorI2RlZmluZSBIVENBUF9SeEFTQ2FwICAgICAgICAgICAgICAgICAgIDB4MjAKKyNkZWZpbmUgSFRDQVBfVHhTb3VuZFBQRFVzQ2FwICAgICAgICAgICAweDQwCisKKworCitzdHJ1Y3QgenNIVENhcGFiaWxpdHkKK3sKKyAgICB1OF90IEVsZW1lbnRJRDsKKyAgICB1OF90IExlbmd0aDsKKyAgICAvLyBIVCBDYXBhYmlsaXR5IEluZm8KKyAgICB1MTZfdCBIdENhcEluZm87CisgICAgdThfdCBBTVBEVVBhcmFtOworICAgIHU4X3QgTUNTU2V0WzE2XTsgICAgLy8xNiBieXRlcworICAgIC8vIEV4dGVuZGVkIEhUIENhcGFiaWxpdHkgSW5mbworICAgIHU4X3QgUENPOworICAgIHU4X3QgTUNTRmVlZEJhY2s7CisKKyAgICB1OF90IFR4QkZDYXBbNF07CisgICAgdThfdCBBc2VsQ2FwOworfTsKKwordW5pb24genVIVENhcGFiaWxpdHkKK3sKKyAgICBzdHJ1Y3QgenNIVENhcGFiaWxpdHkgRGF0YTsKKyAgICB1OF90IEJ5dGVbMjhdOworfTsKKworICAgIC8vY2hhbm5lbGluZm8gOGJpdHMKKyNkZWZpbmUgRXh0SHRDYXBfRXh0Q2hhbm5lbE9mZnNldEFib3ZlICAweDAxCisjZGVmaW5lIEV4dEh0Q2FwX0V4dENoYW5uZWxPZmZzZXRCZWxvdyAgMHgwMworI2RlZmluZSBFeHRIdENhcF9SZWNvbVR4V2lkdGhTZXQgICAgICAgIDB4MDQKKyNkZWZpbmUgRXh0SHRDYXBfUklGU01vZGUgICAgICAgICAgICAgICAweDA4CisjZGVmaW5lIEV4dEh0Q2FwX0NvbnRyb2xBY2Nlc3NPbmx5ICAgICAgMHgxMAorICAgIC8vb3BlcmF0aW5naW5mbyAxNmJpdHMKKyNkZWZpbmUgRXh0SHRDYXBfTm9uR0ZEZXZpY2VQcmVzZW50ICAgICAweDAwMDQKKyAgICAvL2JlYWNvbmluZm8gMTZiaXRzCisjZGVmaW5lIEV4dEh0Q2FwX0R1YWxCZWFjb24gICAgICAgICAgICAgMHgwMDQwCisjZGVmaW5lIEV4dEh0Q2FwX0R1YWxTVEJDUHJvdGVjdGlvbiAgICAgMHgwMDgwCisjZGVmaW5lIEV4dEh0Q2FwX1NlY29uZGFyeUJlYWNvbiAgICAgICAgMHgwMTAwCisjZGVmaW5lIEV4dEh0Q2FwX0xTSUdUWE9QUHJvdGVjdEZ1bGxTdXAgMHgwMjAwCisjZGVmaW5lIEV4dEh0Q2FwX1BDT0FjdGl2ZSAgICAgICAgICAgICAgMHgwNDAwCisjZGVmaW5lIEV4dEh0Q2FwX1BDT1BoYXNlICAgICAgICAgICAgICAgMHgwODAwCisKKworc3RydWN0IHpzRXh0SFRDYXBhYmlsaXR5Cit7CisgICAgdThfdCAgICBFbGVtZW50SUQ7CisgICAgdThfdCAgICBMZW5ndGg7CisgICAgdThfdCAgICBDb250cm9sQ2hhbm5lbDsKKyAgICB1OF90ICAgIENoYW5uZWxJbmZvOworICAgIHUxNl90ICAgT3BlcmF0aW5nSW5mbzsKKyAgICB1MTZfdCAgIEJlYWNvbkluZm87CisgICAgLy8gU3VwcG9ydGVkIE1DUyBTZXQKKyAgICB1OF90ICAgIE1DU1NldFsxNl07Cit9OworCit1bmlvbiB6dUV4dEhUQ2FwYWJpbGl0eQoreworICAgIHN0cnVjdCB6c0V4dEhUQ2FwYWJpbGl0eSBEYXRhOworICAgIHU4X3QgQnl0ZVsyNF07Cit9OworCitzdHJ1Y3QgSW5mb3JtYXRpb25FbGVtZW50U3RhIHsKKyAgICBzdHJ1Y3QgenNIVENhcGFiaWxpdHkgICAgICAgSHRDYXA7CisgICAgc3RydWN0IHpzRXh0SFRDYXBhYmlsaXR5ICAgIEh0SW5mbzsKK307CisKK3N0cnVjdCBJbmZvcm1hdGlvbkVsZW1lbnRBcCB7CisgICAgc3RydWN0IHpzSFRDYXBhYmlsaXR5ICAgICAgIEh0Q2FwOworfTsKKworI2RlZmluZSBaTV9NQVhfRlJFUV9SRVFfUVVFVUUgIDMyCit0eXBlZGVmIHZvaWQgKCp6ZnBGcmVxQ2hhbmdlQ29tcGxldGVDYikoemRldl90KiBkZXYpOworCitzdHJ1Y3QgenNXbGFuRGV2RnJlcUNvbnRyb2wKK3sKKyAgICB1MTZfdCAgICAgICAgICAgICAgICAgICAgIGZyZXFSZXFRdWV1ZVtaTV9NQVhfRlJFUV9SRVFfUVVFVUVdOworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgICBmcmVxUmVxQnc0MFtaTV9NQVhfRlJFUV9SRVFfUVVFVUVdOworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgICBmcmVxUmVxRXh0T2Zmc2V0W1pNX01BWF9GUkVRX1JFUV9RVUVVRV07CisgICAgemZwRnJlcUNoYW5nZUNvbXBsZXRlQ2IgICBmcmVxQ2hhbmdlQ29tcENiW1pNX01BWF9GUkVRX1JFUV9RVUVVRV07CisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgICBmcmVxUmVxUXVldWVIZWFkOworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgICAgZnJlcVJlcVF1ZXVlVGFpbDsKK307CisKK3N0cnVjdCB6c1dsYW5EZXZBcAoreworICAgIHUxNl90ICAgcHJvdGVjdGVkT2JzczsgICAgLyogcHJvdGVjdGVkIG92ZXJsYXAgQlNTICovCisgICAgdTE2X3QgICBzdGFBZ2luZ1RpbWVTZWM7ICAvKiBpbiBzZWNvbmQsIFNUQSB3aWxsIGJlIGRlYXRoZWQgaWYgaXQgZG9lcyBub3QgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFjdGl2ZSBmb3IgdGhpcyBsb25nIHRpbWUgICAgICAgICAgICAgICAgICAgICAqLworICAgIHUxNl90ICAgc3RhUHJvYmluZ1RpbWVTZWM7LyogaW4gc2Vjb25kLCBTVEEgd2lsbCBiZSBwcm9iZWQgaWYgaXQgZG9lcyBub3QgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhY3RpdmUgZm9yIHRoaXMgbG9uZyB0aW1lICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICB1OF90ICAgIGF1dGhTaGFyaW5nOyAgICAgIC8qIGF1dGhlbnRpY2F0aW9uIG9uIGdvaW5nKi8KKyAgICB1OF90ICAgIGJTdGFBc3NvY2lhdGVkOyAgIC8qIDExYiBTVEEgYXNzb2NpYXRlZCAqLworICAgIHU4X3QgICAgZ1N0YUFzc29jaWF0ZWQ7ICAgLyogMTFnIFNUQSBhc3NvY2lhdGVkICovCisgICAgdThfdCAgICBuU3RhQXNzb2NpYXRlZDsgICAvKiAxMW4gU1RBIGFzc29jaWF0ZWQgKi8KKyAgICB1MTZfdCAgIHByb3RlY3Rpb25Nb2RlOyAgIC8qIEFQIHByb3RlY3Rpb24gbW9kZSBmbGFnICovCisgICAgdTE2X3QgICBzdGFQb3dlclNhdmluZzsgICAvKiBTZXQgYXNzb2NpYXRlZCBwb3dlciBzYXZpbmcgU1RBIGNvdW50ICovCisKKworCisgICAgemJ1Zl90KiAgdW5pQXJyYXlbWk1fVU5JX0FSUkFZX1NJWkVdOyAvKiBhcnJheSB0byBzdG9yZSB1bmljYXN0IGZyYW1lcyAqLworICAgIHUxNl90ICAgdW5pSGVhZDsKKyAgICB1MTZfdCAgIHVuaVRhaWw7CisKKyAgICAvKiBIVCBDYXBhYmlsaXR5IEluZm8gKi8KKyAgICB1bmlvbiB6dUhUQ2FwYWJpbGl0eSBIVENhcDsgLy9DV1lhbmcoKykKKworICAgIC8qIEV4dGVuZGVkIEhUIENhcGFiaWxpdHkgSW5mbyAqLworICAgIHVuaW9uIHp1RXh0SFRDYXBhYmlsaXR5IEV4dEhUQ2FwOyAvL0NXWWFuZygrKQorCisgICAgLyogU1RBIHRhYmxlICovCisgICAgc3RydWN0IHpzU3RhVGFibGUgc3RhVGFibGVbWk1fTUFYX1NUQV9TVVBQT1JUXTsKKworICAgIC8qIFdEUyAqLworICAgIHN0cnVjdCB6ZFN0cnVjdFdkcyB3ZHM7CisgICAgLyogV1BBICovCisgICAgdThfdCB3cGFJZVtaTV9NQVhfQVBfU1VQUE9SVF1bWk1fTUFYX1dQQUlFX1NJWkVdOworICAgIHU4X3Qgd3BhTGVuW1pNX01BWF9BUF9TVVBQT1JUXTsKKyAgICB1OF90IHN0YXdwYUllW1pNX01BWF9BUF9TVVBQT1JUXVtaTV9NQVhfV1BBSUVfU0laRV07CisgICAgdThfdCBzdGF3cGFMZW5bWk1fTUFYX0FQX1NVUFBPUlRdOworICAgIHU4X3Qgd3BhU3VwcG9ydFtaTV9NQVhfQVBfU1VQUE9SVF07CisKKyAgICAvL3N0cnVjdCB6c1RraXBTZWVkICAgYmNTZWVkOworICAgIHU4X3QgYmNLZXlJbmRleFtaTV9NQVhfQVBfU1VQUE9SVF07CisgICAgdThfdCBiY0hhbEtleUlkeFtaTV9NQVhfQVBfU1VQUE9SVF07CisgICAgc3RydWN0IHpzTWljVmFyICAgICBiY01pY0tleVtaTV9NQVhfQVBfU1VQUE9SVF07CisgICAgdTE2X3QgaXYxNltaTV9NQVhfQVBfU1VQUE9SVF07CisgICAgdTMyX3QgaXYzMltaTV9NQVhfQVBfU1VQUE9SVF07CisKKyNpZmRlZiBaTV9FTkFCTEVfQ0VOQworICAgIC8qIENFTkMgKi8KKyAgICB1MzJfdCB0eGl2W1pNX01BWF9BUF9TVVBQT1JUXVs0XTsKKyNlbmRpZiAvL1pNX0VOQUJMRV9DRU5DCisKKyAgICAvKiBWaXJ0dWFsIEFQICovCisgICAgdThfdCAgICBiZWFjb25Db3VudGVyOworICAgIHU4X3QgICAgdmFwTnVtYmVyOworICAgIHU4X3QgICAgYXBCaXRtYXA7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNldCBiaXQtTiB0byAxIHRvIGVuYWJsZSBWQVAgKi8KKyAgICB1OF90ICAgIGhpZGVTc2lkW1pNX01BWF9BUF9TVVBQT1JUXTsKKyAgICB1OF90ICAgIGF1dGhBbGdvW1pNX01BWF9BUF9TVVBQT1JUXTsKKyAgICB1OF90ICAgIHNzaWRbWk1fTUFYX0FQX1NVUFBPUlRdWzMyXTsgICAgICAvKiBTU0lEICovCisgICAgdThfdCAgICBzc2lkTGVuW1pNX01BWF9BUF9TVVBQT1JUXTsgICAgICAgLyogU1NJRCBsZW5ndGggKi8KKyAgICB1OF90ICAgIGVuY3J5TW9kZVtaTV9NQVhfQVBfU1VQUE9SVF07CisgICAgdThfdCAgICB3ZXBTdGF0dXNbWk1fTUFYX0FQX1NVUFBPUlRdOworICAgIHUxNl90ICAgY2FwYWJbWk1fTUFYX0FQX1NVUFBPUlRdOyAgICAgICAgIC8qIENhcGFiaWxpdHkgKi8KKyAgICB1OF90ICAgIHRpbUJjbWNCaXRbWk1fTUFYX0FQX1NVUFBPUlRdOyAgICAvKiBCTUNNIGJpdCBvZiBUSU0gKi8KKyAgICB1OF90ICAgIHdsYW5UeXBlW1pNX01BWF9BUF9TVVBQT1JUXTsKKworICAgIC8qIEFycmF5IHRvIHN0b3JlIEJDIG9yIE1DIGZyYW1lcyAqLworICAgIHpidWZfdCogIGJjbWNBcnJheVtaTV9NQVhfQVBfU1VQUE9SVF1bWk1fQkNNQ19BUlJBWV9TSVpFXTsKKyAgICB1MTZfdCAgIGJjbWNIZWFkW1pNX01BWF9BUF9TVVBQT1JUXTsKKyAgICB1MTZfdCAgIGJjbWNUYWlsW1pNX01BWF9BUF9TVVBQT1JUXTsKKworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIHFvc01vZGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxPT5XTUUgKi8KKyAgICB1OF90ICAgICAgICAgICAgICAgICAgICB1YXBzZEVuYWJsZWQ7CisgICAgc3RydWN0IHpzUXVldWUqICAgICAgICAgdWFwc2RROworCisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgY2hhbGxlbmdlVGV4dFsxMjhdOworCisgICAgc3RydWN0IEluZm9ybWF0aW9uRWxlbWVudEFwIGllW1pNX01BWF9TVEFfU1VQUE9SVF07CisKKworfTsKKworI2RlZmluZSBaTV9NQVhfQkxPQ0tJTkdfQVBfTElTVF9TSVpFICAgIDQgLyogMl5OICovCitzdHJ1Y3QgenNCbG9ja2luZ0FwCit7CisgICAgdThfdCBhZGRyWzZdOworICAgIHU4X3Qgd2VpZ2h0OworfTsKKworI2RlZmluZSBaTV9TQ0FOX01HUl9TQ0FOX05PTkUgICAgICAgICAgIDAKKyNkZWZpbmUgWk1fU0NBTl9NR1JfU0NBTl9JTlRFUk5BTCAgICAgICAxCisjZGVmaW5lIFpNX1NDQU5fTUdSX1NDQU5fRVhURVJOQUwgICAgICAgMgorCitzdHJ1Y3QgenNXbGFuRGV2U3RhU2Nhbk1ncgoreworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIHNjYW5SZXFzWzJdOworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIGN1cnJTY2FuVHlwZTsKKyAgICB1OF90ICAgICAgICAgICAgICAgICAgICBzY2FuU3RhcnREZWxheTsKK307CisKKyNkZWZpbmUgWk1fUFNfTVNHX1NUQVRFX0FDVElWRSAgICAgICAgICAwCisjZGVmaW5lIFpNX1BTX01TR19TVEFURV9TTEVFUCAgICAgICAgICAgMQorI2RlZmluZSBaTV9QU19NU0dfU1RBVEVfVDEgICAgICAgICAgICAgIDIKKyNkZWZpbmUgWk1fUFNfTVNHX1NUQVRFX1QyICAgICAgICAgICAgICAzCisjZGVmaW5lIFpNX1BTX01TR19TVEFURV9TMSAgICAgICAgICAgICAgNAorCisjZGVmaW5lIFpNX1BTX01BWF9TTEVFUF9QRVJJT0RTICAgICAgICAgMyAgICAgICAvLyBUaGUgbnVtYmVyIG9mIGJlYWNvbiBwZXJpb2RzCisKK3N0cnVjdCB6c1dsYW5EZXZTdGFQU01ncgoreworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIHN0YXRlOworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIGlzU2xlZXBBbGxvd2VkOworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIG1heFNsZWVwUGVyaW9kczsKKyAgICB1OF90ICAgICAgICAgICAgICAgICAgICB0aWNrczsKKyAgICB1MzJfdCAgICAgICAgICAgICAgICAgICBsYXN0VHhVbmljYXN0RnJtOworICAgIHUzMl90ICAgICAgICAgICAgICAgICAgIGxhc3RUeE11bHRpY2FzdEZybTsKKyAgICB1MzJfdCAgICAgICAgICAgICAgICAgICBsYXN0VHhCcm9hZGNhc3RGcm07CisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgdGVtcFdha2VVcDsgLyplbmFibGUgd2hlbiB3YWtlIHVwIGJ1dCBzdGlsbCBpbiBwcyBtb2RlICovCisgICAgdTE2X3QgICAgICAgICAgICAgICAgICAgc2xlZXBBbGxvd2VkdGljazsKK307CisKK3N0cnVjdCB6c1dsYW5EZXZTdGEKK3sKKyAgICB1MzJfdCAgICAgICAgICAgICAgICAgICBiZWFjb25UeENudDsgIC8qIFRyYW5zbWl0dGVkIGJlYWNvbiBjb3VudGVyIChpbiBJQlNTKSAqLworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIHR4QmVhY29uSW5kOyAgLyogSW4gSUJTUyBtb2RlLCB0cnVlIG1lYW5zIHRoYXQgd2UganVzdCB0cmFuc21pdCBhIGJlYWNvbiBkdXJpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3QgYmVhY29uIHBlcmlvZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIHUxNl90ICAgICAgICAgICAgICAgICAgIGJlYWNvbkNudDsgICAgLyogcmVjZWl2ZSBiZWFjb24gY291bnQsIHdpbGwgYmUgcGVyb2RpY2FsbHkgcmVzZXQgKi8KKyAgICB1MTZfdCAgICAgICAgICAgICAgICAgICBic3NpZFszXTsgICAgIC8qIEJTU0lEIG9mIGNvbm5lY3RlZCBBUCAqLworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIHNzaWRbMzJdOyAgICAgLyogU1NJRCAqLworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIHNzaWRMZW47ICAgICAgLyogU1NJRCBsZW5ndGggKi8KKyAgICB1OF90ICAgICAgICAgICAgICAgICAgICBtVHhSYXRlOyAgICAgIC8qIFR4IHJhdGUgZm9yIG11bHRpY2FzdCAqLworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIHVUeFJhdGU7ICAgICAgLyogVHggcmF0ZSBmb3IgdW5pY2FzdCAqLworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIG1tVHhSYXRlOyAgICAgLyogVHggcmF0ZSBmb3IgbWFuYWdlbWVudCBmcmFtZSAqLworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIGJDaGFubmVsU2NhbjsKKyAgICB1OF90ICAgICAgICAgICAgICAgICAgICBiU2NoZWR1bGVTY2FuOworCisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgSW50ZXJuYWxTY2FuUmVxOworICAgIHUxNl90ICAgICAgICAgICAgICAgICAgIGFjdGl2ZXNjYW5UaWNrUGVyQ2hhbm5lbDsKKyAgICB1MTZfdCAgICAgICAgICAgICAgICAgICBwYXNzaXZlU2NhblRpY2tQZXJDaGFubmVsOworICAgIHUxNl90ICAgICAgICAgICAgICAgICAgIHNjYW5GcmVxdWVuY3k7CisgICAgdTMyX3QgICAgICAgICAgICAgICAgICAgY29ublBvd2VySW5IYWxmRGJtOworCisgICAgdTE2X3QgICAgICAgICAgICAgICAgICAgY3VycmVudEZyZXF1ZW5jeTsKKyAgICB1MTZfdCAgICAgICAgICAgICAgICAgICBjdXJyZW50Qnc0MDsKKyAgICB1MTZfdCAgICAgICAgICAgICAgICAgICBjdXJyZW50RXh0T2Zmc2V0OworCisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgYlBhc3NpdmVTY2FuOworCisgICAgc3RydWN0IHpzQmxvY2tpbmdBcCAgICAgYmxvY2tpbmdBcExpc3RbWk1fTUFYX0JMT0NLSU5HX0FQX0xJU1RfU0laRV07CisKKyAgICAvL3N0cnVjdCB6c0Jzc0luZm8gICAgICAgIGJzc0luZm9Qb29sW1pNX01BWF9CU1NdOworICAgIHN0cnVjdCB6c0Jzc0luZm8qICAgICAgIGJzc0luZm9BcnJheVtaTV9NQVhfQlNTXTsKKyAgICBzdHJ1Y3QgenNCc3NMaXN0ICAgICAgICBic3NMaXN0OworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIGJzc0luZm9BcnJheUhlYWQ7CisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgYnNzSW5mb0FycmF5VGFpbDsKKyAgICB1OF90ICAgICAgICAgICAgICAgICAgICBic3NJbmZvRnJlZUNvdW50OworCisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgYXV0aE1vZGU7CisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgY3VycmVudEF1dGhNb2RlOworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIHdlcFN0YXR1czsKKyAgICB1OF90ICAgICAgICAgICAgICAgICAgICBlbmNyeU1vZGU7CisgICAgdThfdCAgICAgICAgICAgICAgICAgICAga2V5SWQ7CisjaWZkZWYgWk1fRU5BQkxFX0lCU1NfV1BBMlBTSworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIGlic3NXcGEyUHNrOworI2VuZGlmCisjaWZkZWYgWk1fRU5BQkxFX0NFTkMKKyAgICB1OF90ICAgICAgICAgICAgICAgICAgICBjZW5jS2V5SWQ7IC8vQ0VOQworI2VuZGlmIC8vWk1fRU5BQkxFX0NFTkMKKyAgICB1OF90ICAgICAgICAgICAgICAgICAgICBkcm9wVW5lbmNyeXB0ZWRQa3RzOworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIGlic3NKb2luT25seTsKKyAgICB1OF90ICAgICAgICAgICAgICAgICAgICBhZGFwdGVyU3RhdGU7CisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgb2xkQWRhcHRlclN0YXRlOworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIGNvbm5lY3RTdGF0ZTsKKyAgICB1OF90ICAgICAgICAgICAgICAgICAgICBjb25uZWN0UmV0cnk7CisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgd3BhU3RhdGU7CisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgd3BhSWVbWk1fTUFYX0lFX1NJWkUgKyAyXTsKKyAgICB1OF90ICAgICAgICAgICAgICAgICAgICByc25JZVtaTV9NQVhfSUVfU0laRSArIDJdOworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIGNoYWxsZW5nZVRleHRbMjU1KzJdOworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIGNhcGFiaWxpdHlbMl07CisgICAgLy91OF90ICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW5nSGlkZGVuQVA7CisgICAgLy91OF90ICAgICAgICAgICAgICAgICAgICBzY2FuV2l0aFNTSUQ7CisgICAgdTE2X3QgICAgICAgICAgICAgICAgICAgYWlkOworICAgIHUzMl90ICAgICAgICAgICAgICAgICAgIG1ndEZyYW1lQ291bnQ7CisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgYlByb3RlY3Rpb25Nb2RlOworCXUzMl90CQkJCQlOb25OQVBjb3VudDsKKwl1OF90CQkJCQlSVFNJbkFHR01vZGU7CisgICAgdTMyX3QgICAgICAgICAgICAgICAgICAgY29ubmVjdFRpbWVyOworICAgIHUxNl90ICAgICAgICAgICAgICAgICAgIGF0aW1XaW5kb3c7CisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgZGVzaXJlZEJzc2lkWzZdOworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIGJEZXNpcmVkQnNzaWQ7CisgICAgc3RydWN0IHpzVGtpcFNlZWQgICAgICAgdHhTZWVkOworICAgIHN0cnVjdCB6c1RraXBTZWVkICAgICAgIHJ4U2VlZFs0XTsKKyAgICBzdHJ1Y3QgenNNaWNWYXIgICAgICAgICB0eE1pY0tleTsKKyAgICBzdHJ1Y3QgenNNaWNWYXIgICAgICAgICByeE1pY0tleVs0XTsKKyAgICB1MTZfdCAgICAgICAgICAgICAgICAgICBpdjE2OworICAgIHUzMl90ICAgICAgICAgICAgICAgICAgIGl2MzI7CisgICAgc3RydWN0IHpzT3Bwb3NpdGVJbmZvICAgb3Bwb3NpdGVJbmZvW1pNX01BWF9PUFBPU0lURV9DT1VOVF07CisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgb3Bwb3NpdGVDb3VudDsKKyAgICB1OF90ICAgICAgICAgICAgICAgICAgICBic3NOb3RGb3VuZENvdW50OyAgICAgLyogc2l0ZXN1cnZleSBmb3Igc2VhcmNoIGRlc2lyZWQgSVNCQiB0aHJlc2hvbGQgKi8KKyAgICB1MTZfdCAgICAgICAgICAgICAgICAgICByeEJlYWNvbkNvdW50OworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIGJlYWNvbk1pc3NTdGF0ZTsKKyAgICB1MzJfdCAgICAgICAgICAgICAgICAgICByeEJlYWNvblRvdGFsOworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIGJJc1NoYXJlZEtleTsKKyAgICB1OF90ICAgICAgICAgICAgICAgICAgICBjb25uZWN0VGltZW91dENvdW50OworCisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgcmVjdkF0aW07CisKKyAgICAvKiBTY2FuTWdyIENvbnRyb2wgYmxvY2sgKi8KKyAgICBzdHJ1Y3QgenNXbGFuRGV2U3RhU2Nhbk1nciBzY2FuTWdyOworICAgIHN0cnVjdCB6c1dsYW5EZXZTdGFQU01nciAgIHBzTWdyOworCisgICAgLy8gVGhlIGNhbGxiYWNrIHdvdWxkIGJlIGNhbGxlZCBpZiByZWNlaXZpbmcgYW4gdW5lbmNyeXB0ZWQgcGFja2V0cyBidXQKKyAgICAvLyB0aGUgc3RhdGlvbiBpcyBpbiBlbmNyeXB0ZWQgbW9kZS4gVGhlIHdyYXBwZXIgY291bGQgZGVjaWRlIHdoZXRoZXIKKyAgICAvLyB0byBkcm9wIHRoZSBwYWNrZXQgYnkgaXRzIE9TIHNldHRpbmcuCisgICAgemZwU3RhUnhTZWN1cml0eUNoZWNrQ2IgcFN0YVJ4U2VjdXJpdHlDaGVja0NiOworCisgICAgLyogV01FICovCisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgYXBXbWVDYXBhYmlsaXR5OyAvL2JpdC0wID0+IGEgV01FIEFQCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2JpdC03ID0+IGEgVUFQU0QgQVAKKyAgICB1OF90ICAgICAgICAgICAgICAgICAgICB3bWVQYXJhbWV0ZXJTZXRDb3VudDsKKworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIHdtZUVuYWJsZWQ7CisgICAgI2RlZmluZSBaTV9TVEFfV01FX0VOQUJMRV9CSVQgICAgICAgMHgxCisgICAgI2RlZmluZSBaTV9TVEFfVUFQU0RfRU5BQkxFX0JJVCAgICAgMHgyCisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgd21lUW9zSW5mbzsKKworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIHdtZUNvbm5lY3RlZDsKKyAgICB1OF90ICAgICAgICAgICAgICAgICAgICBxb3NJbmZvOworICAgIHN0cnVjdCB6c1F1ZXVlKiAgICAgICAgIHVhcHNkUTsKKworICAgIC8qIGNvdW50ZXJtZWFzdXJlcyAqLworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIGNtTWljRmFpbHVyZUNvdW50OworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIGNtRGlzYWxsb3dTc2lkTGVuZ3RoOworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIGNtRGlzYWxsb3dTc2lkWzMyXTsKKworICAgIC8qIHBvd2VyLXNhdmluZyBtb2RlICovCisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgcG93ZXJTYXZlTW9kZTsKKyAgICB6YnVmX3QqICAgICAgICAgICAgICAgICBzdGFQU0RhdGFRdWV1ZVtaTV9QU19RVUVVRV9TSVpFXTsKKyAgICB1OF90ICAgICAgICAgICAgICAgICAgICBzdGFQU0RhdGFDb3VudDsKKworICAgIC8qIElCU1MgcG93ZXItc2F2aW5nIG1vZGUgKi8KKyAgICAvKiByZWNvcmQgdGhlIFNUQSB3aGljaCBoYXMgZW50ZXJlZCB0aGUgUFMgbW9kZSAqLworICAgIHN0cnVjdCB6c1N0YVBTTGlzdCAgICAgIHN0YVBTTGlzdDsKKyAgICAvKiBxdWV1ZSB0aGUgZGF0YSBvZiB0aGUgUFMgU1RBcyAqLworICAgIHpidWZfdCogICAgICAgICAgICAgICAgICBpYnNzUFNEYXRhUXVldWVbWk1fUFNfUVVFVUVfU0laRV07CisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgaWJzc1BTRGF0YUNvdW50OworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIGlic3NQcmV2UFNEYXRhQ291bnQ7CisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgYklic3NQU0VuYWJsZTsKKyAgICAvKiBCSVRfMTU6IE9OL09GRiwgQklUXzB+MTQ6IEF0aW0gVGltZXIgKi8KKyAgICB1MTZfdCAgICAgICAgICAgICAgICAgICBpYnNzQXRpbVRpbWVyOworCisgICAgLyogV1BBMiAqLworICAgIHN0cnVjdCB6c1Bta2lkSW5mbyAgICAgIHBta2lkSW5mbzsKKworICAgIC8qIE11bHRpY2FzdCBsaXN0IHJlbGF0ZWQgb2JqZWN0cyAqLworICAgIHN0cnVjdCB6c011bHRpY2FzdExpc3QgIG11bHRpY2FzdExpc3Q7CisKKyAgICAvKiBYUCBwYWNrZXQgZmlsdGVyIGZlYXR1cmUgOiAqLworICAgIC8qIDE9PmVuYWJsZTogQWxsIG11bHRpY2FzdCBhZGRyZXNzIHBhY2tldHMsIG5vdCBqdXN0IHRoZSBvbmVzIGVudW1lcmF0ZWQgaW4gdGhlIG11bHRpY2FzdCBhZGRyZXNzIGxpc3QuICovCisgICAgLyogMD0+ZGlzYWJsZSAqLworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIGJBbGxNdWx0aWNhc3Q7CisKKyAgICAvKiByZWFzc29jaWF0aW9uIGZsYWcgKi8KKyAgICB1OF90ICAgICAgICAgICAgICAgICAgICBjb25uZWN0QnlSZWFzc287CisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgZmFpbENudE9mUmVhc3NvOworCisJLyogZm9yIEhUIGNvbmZpZ3VyZSBjb250cm9sIHNldHRpbmcgKi8KKyAgICB1OF90ICAgICAgICAgICAgICAgICAgICBwcmVhbWJsZVR5cGVIVDsgIC8qIEhUOiAwIE1peGVkIG1vZGUgICAgMSBHcmVlbiBmaWVsZCAqLworCXU4X3QgICAgICAgICAgICAgICAgICAgIGh0Q3RybEJhbmR3aWR0aDsKKwl1OF90ICAgICAgICAgICAgICAgICAgICBodEN0cmxTVEJDOworCXU4X3QgICAgICAgICAgICAgICAgICAgIGh0Q3RybFNHOworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRUQTsKKworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25fMTFiOworCisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgRW5hYmxlSFQ7CisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgU0c0MDsKKyAgICB1OF90ICAgICAgICAgICAgICAgICAgICBIVDIwNDA7CisgICAgLyogZm9yIFdQQSBzZXR0aW5nICovCisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgd3BhU3VwcG9ydDsKKyAgICB1OF90ICAgICAgICAgICAgICAgICAgICB3cGFMZW47CisKKyAgICAvKiBJQlNTIHJlbGF0ZWQgb2JqZWN0cyAqLworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIGlic3NEZWxheWVkSW5kOworICAgIHN0cnVjdCB6c1BhcnRuZXJOb3RpZnlFdmVudCBpYnNzRGVsYXllZEluZEV2ZW50OworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIGlic3NQYXJ0bmVyU3RhdHVzOworCisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgYkF1dG9SZWNvbm5lY3Q7CisKKyAgICB1OF90ICAgICAgICAgICAgICAgICAgICBmbGFnRnJlcUNoYW5naW5nOworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIGZsYWdLZXlDaGFuZ2luZzsKKyAgICBzdHJ1Y3QgenNCc3NJbmZvICAgICAgICBpYnNzQnNzRGVzYzsKKyAgICB1OF90ICAgICAgICAgICAgICAgICAgICBpYnNzQnNzSXNDcmVhdG9yOworICAgIHUxNl90ICAgICAgICAgICAgICAgICAgIGlic3NSZWNlaXZlQmVhY29uQ291bnQ7CisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgaWJzc1NpdGVTdXJ2ZXlTdGF0dXM7CisKKyAgICB1OF90ICAgICAgICAgICAgICAgICAgICBkaXNhYmxlUHJvYmluZ1dpdGhTc2lkOworI2lmZGVmIFpNX0VOQUJMRV9DRU5DCisgICAgLyogQ0VOQyAqLworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIGNlbmNJZVtaTV9NQVhfSUVfU0laRSArIDJdOworI2VuZGlmIC8vWk1fRU5BQkxFX0NFTkMKKyAgICB1MzJfdCB0eGl2WzRdOyAgLy9UeCBQTiBTZXF1ZW5jZQorICAgIHUzMl90IHJ4aXZbNF07ICAvL1J4IFBOIFNlcXVlbmNlCisgICAgdTMyX3QgcnhpdkdLWzRdOy8vQnJvYWRjYXN0IFJ4IFBOIFNlcXVlbmNlCisgICAgdThfdCAgd2VwS2V5WzRdWzMyXTsgICAgLy8gRm9yIFNvZnR3YXJlIFdFUAorCXU4X3QgIFNXRW5jcnlNb2RlWzRdOworCisgICAgLyogODAyLjExZCAqLworICAgIHU4X3QgYjgwMl8xMUQ7CisKKyAgICAvKiA4MDIuMTFoICovCisgICAgdThfdCBUUENFbmFibGU7CisgICAgdThfdCBERlNFbmFibGU7CisgICAgdThfdCBERlNEaXNhYmxlVHg7CisKKyAgICAvKiBPd2wgQVAgKi8KKyAgICB1OF90IGF0aE93bEFwOworCisgICAgLyogRW5hYmxlIEJBIHJlc3BvbnNlIGluIGRyaXZlciAqLworICAgIHU4X3QgZW5hYmxlRHJ2QkE7CisKKyAgICAvKiBIVCBDYXBhYmlsaXR5IEluZm8gKi8KKyAgICB1bmlvbiB6dUhUQ2FwYWJpbGl0eSBIVENhcDsgLy9DV1lhbmcoKykKKworICAgIC8qIEV4dGVuZGVkIEhUIENhcGFiaWxpdHkgSW5mbyAqLworICAgIHVuaW9uIHp1RXh0SFRDYXBhYmlsaXR5IEV4dEhUQ2FwOyAvL0NXWWFuZygrKQorCisgICAgc3RydWN0IEluZm9ybWF0aW9uRWxlbWVudFN0YSAgIGllOworCisjZGVmaW5lIFpNX0NBQ0hFRF9GUkFNRUJPRFlfU0laRSAgIDIwMAorICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIGFzb2NSZXFGcmFtZUJvZHlbWk1fQ0FDSEVEX0ZSQU1FQk9EWV9TSVpFXTsKKyAgICB1MTZfdCAgICAgICAgICAgICAgICAgICBhc29jUmVxRnJhbWVCb2R5U2l6ZTsKKyAgICB1OF90ICAgICAgICAgICAgICAgICAgICBhc29jUnNwRnJhbWVCb2R5W1pNX0NBQ0hFRF9GUkFNRUJPRFlfU0laRV07CisgICAgdTE2X3QgICAgICAgICAgICAgICAgICAgYXNvY1JzcEZyYW1lQm9keVNpemU7CisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgYmVhY29uRnJhbWVCb2R5W1pNX0NBQ0hFRF9GUkFNRUJPRFlfU0laRV07CisgICAgdTE2X3QgICAgICAgICAgICAgICAgICAgYmVhY29uRnJhbWVCb2R5U2l6ZTsKKworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIGFjMFByaW9yaXR5SGlnaGVyVGhhbkFjMjsKKyAgICB1OF90ICAgICAgICAgICAgICAgICAgICBTV0VuY3J5cHRFbmFibGU7CisKKyAgICB1OF90ICAgICAgICAgICAgICAgICAgICBsZWFwRW5hYmxlZDsKKworICAgIHUzMl90ICAgICAgICAgICAgICAgICAgICBUb3RhbE51bWJlck9mUmVjZWl2ZVBhY2tldHM7CisgICAgdTMyX3QgICAgICAgICAgICAgICAgICAgIFRvdGFsTnVtYmVyT2ZSZWNlaXZlQnl0ZXM7CisgICAgdTMyX3QgICAgICAgICAgICAgICAgICAgIGF2Z1NpemVPZlJlY2VpdmVQYWNrZXRzOworCisgICAgdTMyX3QgICAgICAgICAgICAgICAgICAgIFJlY2VpdmVkUGFja2V0UmF0ZUNvdW50ZXI7CisgICAgdTMyX3QgICAgICAgICAgICAgICAgICAgIFJlY2VpdmVkUGt0UmF0ZVBlclNlY29uZDsKKworICAgIC8qICMyIFJlY29yZCB0aGUgc2VxdWVuY2UgbnVtYmVyIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSB1bmljYXN0IGZyYW1lIGlzIHNlcGFyYXRlZCBieSBSSUZTIG9yIG5vdCAqLworI2RlZmluZSAgICBaTV9SSUZTX1NUQVRFX0RFVEVDVElORyAgICAwCisjZGVmaW5lICAgIFpNX1JJRlNfU1RBVEVfREVURUNURUQgICAgIDEKKyNkZWZpbmUgICAgWk1fUklGU19USU1FUl9USU1FT1VUICAgICAgNDQ4MCAgICAgICAgICAvLyA8RHJpdmVyIHRpbWU+NDQ4MG1zIDxSZWFsIHRpbWU+N3MKKyAgICB1OF90ICAgICAgICAgICAgICAgICAgICByaWZzU3RhdGU7CisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgcmlmc0xpa2VGcmFtZUNudDsKKyAgICB1MTZfdCAgICAgICAgICAgICAgICAgICByaWZzTGlrZUZyYW1lU2VxdWVuY2VbM107CisgICAgdTMyX3QgICAgICAgICAgICAgICAgICAgcmlmc1RpbWVyOworICAgIHUzMl90ICAgICAgICAgICAgICAgICAgIHJpZnNDb3VudDsKKworICAgIC8qIFJYIGZpbHRlciBkZXNpcmVkIGJ5IHVwcGVyIGxheWVycy4gIE5vdGUgdGhpcyBjb250YWlucyBzb21lIGJpdHMgd2hpY2ggbXVzdCBiZSBmaWx0ZXJlZAorICAgICAgIGJ5IHN3IHNpbmNlIHRoZSBodyBzdXBwb3J0cyBvbmx5IGEgc3Vic2V0IG9mIHBvc3NpYmxlIGZpbHRlciBhY3Rpb25zLj0gKi8KKyAgICB1MzJfdCAgb3NSeEZpbHRlcjsKKworICAgIHU4X3QgICBiU2FmZU1vZGU7CisKKyAgICB1MzJfdCAgaWJzc0FkZGl0aW9uYWxJRVNpemU7CisgICAgdThfdCAgIGlic3NBZGRpdGlvbmFsSUVbMjU2XTsKK307IC8vc3RydWN0IHpzV2xhbkRldlN0YQorCisjZGVmaW5lIFpNX0NNRF9RVUVVRV9TSVpFICAgICAgICAgICAgICAgICAgIDI1NiAgLy9Sb2dlciBDaGVjaywgdGVzdCA2NCB3aGVuIHJlYWR5CisKKyNkZWZpbmUgWk1fT0lEX1JFQUQgICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBaTV9PSURfV1JJVEUgICAgICAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIFpNX09JRF9JTlRFUk5BTF9XUklURSAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgWk1fQ01EX1NFVF9GUkVRVUVOQ1kgICAgICAgICAgICAgICAgNAorI2RlZmluZSBaTV9DTURfU0VUX0tFWSAgICAgICAgICAgICAgICAgICAgICA1CisjZGVmaW5lIFpNX0NXTV9SRUFEICAgICAgICAgICAgICAgICAgICAgICAgIDYKKyNkZWZpbmUgWk1fTUFDX1JFQUQgICAgICAgICAgICAgICAgICAgICAgICAgNworI2RlZmluZSBaTV9BTklfUkVBRCAgICAgICAgICAgICAgICAgICAgICAgICA4CisjZGVmaW5lIFpNX0VFUFJPTV9SRUFEICAgICAgICAgICAgICAgICAgICAgIDkKKyNkZWZpbmUgWk1fRUVQUk9NX1dSSVRFICAgICAgICAgICAgICAgICAgICAgMHgwQQorI2RlZmluZSBaTV9PSURfQ0hBTgkJCQkJCQkweDMwCisjZGVmaW5lIFpNX09JRF9TWU5USAkJCQkJCTB4MzIKKyNkZWZpbmUgWk1fT0lEX1RBTExZCQkJCQkJMHg4MQorI2RlZmluZSBaTV9PSURfVEFMTFlfQVBECQkJCQkweDgyCisKKyNkZWZpbmUgWk1fT0lEX0RLVFhfU1RBVFVTICAgICAgICAgICAgICAgICAgMHg5MgorI2RlZmluZSBaTV9PSURfRkxBU0hfQ0hLU1VNICAgICAgICAgICAgICAgICAweEQwCisjZGVmaW5lIFpNX09JRF9GTEFTSF9SRUFEICAgICAgICAgICAgICAgICAgIDB4RDEKKyNkZWZpbmUgWk1fT0lEX0ZMQVNIX1BST0dSQU0gICAgICAgICAgICAgICAgMHhEMgorI2RlZmluZSBaTV9PSURfRldfRExfSU5JVCAgICAgICAgICAgICAgICAgICAweEQzCisKKy8qIERyaXZlciB0byBGaXJtd2FyZSBPSUQgKi8KKyNkZWZpbmUgWk1fQ01EX0VDSE8gICAgICAgICAweDgwCisjZGVmaW5lIFpNX0NNRF9UQUxMWSAgICAgICAgMHg4MQorI2RlZmluZSBaTV9DTURfVEFMTFlfQVBEICAgIDB4ODIKKyNkZWZpbmUgWk1fQ01EX0NPTkZJRyAgICAgICAweDgzCisjZGVmaW5lIFpNX0NNRF9SUkVHICAgICAgICAgMHgwMAorI2RlZmluZSBaTV9DTURfV1JFRyAgICAgICAgIDB4MDEKKyNkZWZpbmUgWk1fQ01EX1JNRU0gICAgICAgICAweDAyCisjZGVmaW5lIFpNX0NNRF9XTUVNICAgICAgICAgMHgwMworI2RlZmluZSBaTV9DTURfQklUQU5EICAgICAgIDB4MDQKKyNkZWZpbmUgWk1fQ01EX0JJVE9SICAgICAgICAweDA1CisjZGVmaW5lIFpNX0NNRF9FS0VZICAgICAgICAgMHgyOAorI2RlZmluZSBaTV9DTURfREtFWSAgICAgICAgIDB4MjkKKyNkZWZpbmUgWk1fQ01EX0ZSRVFVRU5DWSAgICAweDMwCisjZGVmaW5lIFpNX0NNRF9SRl9JTklUICAgICAgMHgzMQorI2RlZmluZSBaTV9DTURfU1lOVEggICAgICAgIDB4MzIKKyNkZWZpbmUgWk1fQ01EX0ZSRVFfU1RSQVQgICAweDMzCisjZGVmaW5lIFpNX0NNRF9SRVNFVCAgICAgICAgMHg5MAorI2RlZmluZSBaTV9DTURfREtSRVNFVCAgICAgIDB4OTEKKyNkZWZpbmUgWk1fQ01EX0RLVFhfU1RBVFVTICAweDkyCisjZGVmaW5lIFpNX0NNRF9GREMgICAgICAgICAgMHhBMAorI2RlZmluZSBaTV9DTURfV1JFRVBST00gICAgIDB4QjAKKyNkZWZpbmUgWk1fQ01EX1dGTEFTSCAgICAgICAweEIwCisjZGVmaW5lIFpNX0NNRF9GTEFTSF9FUkFTRSAgMHhCMQorI2RlZmluZSBaTV9DTURfRkxBU0hfUFJPRyAgIDB4QjIKKyNkZWZpbmUgWk1fQ01EX0ZMQVNIX0NIS1NVTSAweEIzCisjZGVmaW5lIFpNX0NNRF9GTEFTSF9SRUFEICAgMHhCNAorI2RlZmluZSBaTV9DTURfRldfRExfSU5JVCAgIDB4QjUKKyNkZWZpbmUgWk1fQ01EX01FTV9XUkVFUFJPTSAweEJCCisKKworLyogZHVwbGljYXRlIGZpbHRlciB0YWJsZSBjb2x1bW4gKi8KKyNkZWZpbmUgWk1fRklMVEVSX1RBQkxFX0NPTCAgICAgICAgICAgICAgICAgMiAvKiAyXm4gKi8KKy8qIGR1cGxpY2F0ZSBmaWx0ZXIgdGFibGUgUm93ICovCisjZGVmaW5lIFpNX0ZJTFRFUl9UQUJMRV9ST1cgICAgICAgICAgICAgICAgIDggLyogMl5uICovCisKKy8qIGR1cGxpY2F0ZSBmaWx0ZXIgdGFibGUgc3RydWN0dXJlICovCitzdHJ1Y3QgenNSeEZpbHRlcgoreworICAgIHUxNl90IGFkZHJbM107CisgICAgdTE2X3Qgc2VxOworICAgIHU4X3QgdXA7Cit9OworCitzdHJ1Y3QgenNXbGFuRGV2Cit7CisgICAgLyogQVAgZ2xvYmFsIHZhcmlhYmxlcyAqLworICAgIHN0cnVjdCB6c1dsYW5EZXZBcCBhcDsKKyAgICAvKiBTVEEgZ2xvYmFsIHZhcmlhYmxlcyAqLworICAgIHN0cnVjdCB6c1dsYW5EZXZTdGEgc3RhOworICAgIC8qIHNhdmUgd3JhcHBlciBzZXR0aW5nICovCisgICAgc3RydWN0IHpzV3JhcHBlclNldHRpbmcgd3M7CisgICAgLyogZmVhdHVyZXMgZGV0ZXJtaW5lZCBieSB3cmFwcGVyICh2ZW5kb3IpICovCisgICAgc3RydWN0IHpzV3JhcHBlckZlYXR1cmVDdHJsIHdmYzsKKyAgICAvKiBUcmFmZmljIE1vbml0b3IgdGFsbHkgKi8KKyAgICBzdHJ1Y3QgenNUcmFmVGFsbHkgdHJhZlRhbGx5OworICAgIC8qIENvbW11bmljYXRpb24gdGFsbHkgKi8KKyAgICBzdHJ1Y3QgenNDb21tVGFsbHkgY29tbVRhbGx5OworICAgIC8qIER1cGxpY2F0ZSBmcmFtZSBmaWx0ZXIgdGFibGUgKi8KKyAgICBzdHJ1Y3QgenNSeEZpbHRlciByeEZpbHRlclRibFtaTV9GSUxURVJfVEFCTEVfQ09MXVtaTV9GSUxURVJfVEFCTEVfUk9XXTsKKyAgICAvKiBSZWd1bGF0b3J5IHRhYmxlICovCisgICAgc3RydWN0IHpzUmVndWxhdGlvblRhYmxlICByZWd1bGF0aW9uVGFibGU7CisKKyAgICAvKiAqLworICAgIHN0cnVjdCB6c1dsYW5EZXZGcmVxQ29udHJvbCBmcmVxQ3RybDsKKworICAgIGVudW0gZGV2U3RhdGUgc3RhdGU7CisKKyAgICB1OF90ICBoYWxTdGF0ZTsKKyAgICB1OF90ICB3bGFuTW9kZTsgICAgICAgICAvKiBBUC9JTkZSQVNUUlVDVFVSRS9JQlNTL1BTRVVETyAqLworICAgIHUxNl90IG1hY0FkZHJbM107ICAgICAgIC8qIE1BQyBhZGRyZXNzICovCisgICAgdTE2X3QgYmVhY29uSW50ZXJ2YWw7ICAgLyogYmVhY29uIEludGVydmFsICovCisgICAgdThfdCBkdGltOyAgICAgICAgICAgICAgLyogRFRJTSBwZXJpb2QgKi8KKyAgICB1OF90ICAgICAgICAgICAgQ3VycmVudER0aW1Db3VudDsKKyAgICB1OF90ICBwcmVhbWJsZVR5cGU7CisgICAgdThfdCAgcHJlYW1ibGVUeXBlSW5Vc2VkOworICAgIHU4X3QgIG1heFR4UG93ZXIyOwkgICAgLyogMi40IEdIeiBNYXggVHggcG93ZXIgKFVuaXQ6IDAuNSBkQm0pICovCisgICAgdThfdCAgbWF4VHhQb3dlcjU7CSAgICAvKiA1IEdIeiBNYXggVHggcG93ZXIgKFVuaXQ6IDAuNSBkQm0pICovCisgICAgdThfdCAgY29ubmVjdE1vZGU7CisgICAgdTMyX3Qgc3VwcG9ydE1vZGU7CisKKyAgICB1OF90IGJSYXRlOyAgICAgICAgICAgICAvKiAxMWIgU3VwcG9ydCBSYXRlIGJpdCBtYXAgKi8KKyAgICB1OF90IGJSYXRlQmFzaWM7ICAgICAgICAvKiAxMWIgQmFzaWMgUmF0ZSBiaXQgbWFwICovCisgICAgdThfdCBnUmF0ZTsgICAgICAgICAgICAgLyogMTFnIFN1cHBvcnQgUmF0ZSBiaXQgbWFwICovCisgICAgdThfdCBnUmF0ZUJhc2ljOyAgICAgICAgLyogMTFnIEJhc2ljIFJhdGUgYml0IG1hcCAqLworICAgIC8qIGNoYW5uZWwgaW5kZXggcG9pbnQgdG8gdGhlIGl0ZW0gaW4gcmVndWxhdGlvbiB0YWJsZSAqLworICAgIHU4X3QgY2hhbm5lbEluZGV4OworCisgICAgLyogY2hhbm5lbCBtYW5hZ2VtZW50ICovCisgICAgdThfdCAgICBCYW5kV2lkdGg0MDsKKyAgICB1OF90ICAgIEV4dE9mZnNldDsgICAgICAvLzEgYWJvdmUsIDMgYmVsb3csIDAgbm90IHByZXNlbnQKKyAgICB1MTZfdCAgIGZyZXF1ZW5jeTsgICAgICAvKiBvcGVyYXRpb24gZnJlcXVlbmN5ICovCisKKyAgICB1OF90IGVycEVsZW1lbnQ7ICAgICAgICAvKiBFUlAgaW5mb3JtYXRpb24gZWxlbWVudCBkYXRhICovCisKKyAgICB1OF90IGRpc2FibGVTZWxmQ3RzOyAgICAvKiBzZXQgdG8gMSB0byBkaXNhYmxlIFNlbGYtQ1RTICovCisgICAgdThfdCBiZ01vZGU7CisKKwkvKiBwcml2YXRlIHRlc3QgZmxhZyAqLworICAgIHUzMl90IGVuYWJsZVByb3RlY3Rpb25Nb2RlOyAgIC8qIGZvcmNlIGVuYWJsZS9kaXNhYmxlIHNlbGYgY3RzICovCisJdTMyX3QgY2hlY2tzdW1UZXN0OyAgICAgLyogT1RVUyBjaGVja3N1bSB0ZXN0IDE9Pnplcm8gY2hlY2tzdW0gMD0+bm9ybWFsICovCisJdTMyX3QgcnhQYWNrZXREdW1wOyAgICAgLyogcnggcGFja2V0IGR1bXAgKi8KKworICAgIHU4X3QgZW5hYmxlQWdncmVnYXRpb247IC8qIGZvcmNlIGVuYWJsZS9kaXNhYmxlIEEtTVNQVSAqLworICAgIHU4X3QgZW5hYmxlV0RTOyAgICAgICAgIC8qIGZvcmNlIGVuYWJsZS9kaXNhYmxlIFdEUyB0ZXN0aW5nICovCisJdThfdCBlbmFibGVUeFBhdGhNb2RlOyAgLyogT1RVUyBzcGVjaWFsIHRlc3RpbmcgbW9kZSAxPT5kaWFibGUsIDA9PmVuYWJsZTogWk1fU1lTVEVNX1RFU1RfTU9ERSAqLworICAgIHU4X3QgZW5hYmxlSEFMRGJnSW5mbzsgIC8qICAqLworCisgICAgdTMyX3QgZm9yY2VUeFRQQzsgICAgICAgLyogZm9yY2UgdHggcGFja2V0IHNlbmQgVFBDICovCisKKyAgICB1MTZfdCBzZXFbNF07CisgICAgdTE2X3QgbW1zZXE7CisKKyAgICAvKiBkcml2ZXIgY29yZSB0aW1lIHRpY2sgKi8KKyAgICB1MzJfdCB0aWNrOworICAgIHUxNl90IHRpY2tJYnNzU2VuZEJlYWNvbjsKKyAgICB1MTZfdCB0aWNrSWJzc1JlY2VpdmVCZWFjb247CisKKyAgICAvKiBSVFMgdGhyZXNob2xkICovCisgICAgdTE2X3QgcnRzVGhyZXNob2xkOworCisgICAgLyogZnJhZ21lbnRhdGlvbiB0aHJlc2hvbGQsICAyNTYgPD0gdmFsdWUgPD0gMjM0NiwgMD1kaXNhYmxlZCAqLworICAgIHUxNl90IGZyYWdUaHJlc2hvbGQ7CisKKyAgICAvKiBUeCBSYXRlICovCisgICAgdTE2X3QgdHhNQ1M7CisgICAgdTE2X3QgdHhNVDsKKyAgICB1MzJfdCBDdXJyZW50VHhSYXRlS2JwczsgLy9DV1lhbmcoKykKKyAgICAvKiBSeCBSYXRlICovCisgICAgdTMyX3QgQ3VycmVudFJ4UmF0ZUticHM7IC8vSmFuZXQoKykKKyAgICB1OF90IEN1cnJlbnRSeFJhdGVVcGRhdGVkOworICAgIHU4X3QgbW9kdWxhdGlvblR5cGU7CisgICAgdThfdCByeEluZm87CisgICAgdTE2X3QgcmF0ZUZpZWxkOworCisgICAgLyogdGltZXIgcmVsYXRlZCBvYmplY3RzICovCisgICAgc3RydWN0IHpzVGltZXJMaXN0ICB0aW1lckxpc3Q7CisgICAgdThfdCAgICAgICAgICAgICAgICBiVGltZXJSZWFkeTsKKworICAgIC8qIGZvciBkZWZyYWdtZW50YXRpb24gKi8KKyAgICBzdHJ1Y3QgenNEZWZyYWdMaXN0IGRlZnJhZ1RhYmxlOworCisgICAgLyogRGF0YSBzdHJ1Y3QgZm9yIEludGVyZmFjZSBEZXBlbmRlbnQgTGF5ZXIgKi8KKyAgICAvL3N0cnVjdCB6c0lkbFN0cnVjdCBpZGxTdHJ1Y3Q7CisKKyAgICAvKiBTaWduYWwgU3RyZW5ndGgvUXVhbGl0eSBSZWxhdGVkIFBhcmFtZXRlcnMgKi8KKyAgICB1OF90IFNpZ25hbFN0cmVuZ3RoOyAvL0NXWWFuZygrKQorICAgIHU4X3QgU2lnbmFsUXVhbGl0eTsgIC8vQ1dZYW5nKCspCisKKworCisgICAgLyogUW9TICovCisgICAgemJ1Zl90KiB2dHhxWzRdW1pNX1ZUWFFfU0laRV07CisgICAgdTE2X3QgdnR4cUhlYWRbNF07CisgICAgdTE2X3QgdnR4cVRhaWxbNF07CisgICAgdTE2X3QgcW9zRHJvcElwRnJhZ1s0XTsKKworICAgIC8qIE1hbmFnZW1lbnQgVHggcXVldWUgKi8KKyAgICB6YnVmX3QqIHZtbXFbWk1fVk1NUV9TSVpFXTsKKyAgICB1MTZfdCB2bW1xSGVhZDsKKyAgICB1MTZfdCB2bW1xVGFpbDsKKworICAgIHU4X3QgICAgICAgICAgICAgICAgdnR4cVB1c2hpbmc7CisKKyAgICAvKgorICAgICAqIGFkZCBieSBob25kYQorICAgICAqIDEuIEFnZ3JlZ2F0ZSBxdWV1ZXMKKyAgICAgKiAyLiBTVEEncyBhc3NvY2lhdGVkIGluZm9ybWF0aW9uIGFuZCBxdWV1ZSBudW1iZXIKKyAgICAgKiAzLiByeCBhZ2dyZWdhdGlvbiByZS1vcmRlcmluZyBxdWV1ZQorICAgICAqLworICAgIHN0cnVjdCBhZ2dRdWV1ZSAgICAqYWdnUVBvb2xbWk1fQUdHX1BPT0xfU0laRV07CisgICAgdThfdCAgICAgICAgICAgICAgICBhZ2dJbml0aWF0ZWQ7CisgICAgdThfdCAgICAgICAgICAgICAgICBhZGRiYUNvbXBsZXRlOworICAgIHU4X3QgICAgICAgICAgICAgICAgYWRkYmFDb3VudDsKKyAgICB1OF90ICAgICAgICAgICAgICAgIGFnZ1N0YXRlOworICAgIHU4X3QgICAgICAgICAgICAgICAgZGVzdExvY2s7CisgICAgc3RydWN0IGFnZ1N0YSAgICAgICBhZ2dTdGFbWk1fTUFYX1NUQV9TVVBQT1JUXTsKKyAgICBzdHJ1Y3QgYWdnX3RpZF9yeCAgKnRpZF9yeFtaTV9BR0dfUE9PTF9TSVpFXTsKKyAgICBzdHJ1Y3QgYWdnVGFsbHkgICAgIGFnZ190YWw7CisgICAgc3RydWN0IGRlc3RRICAgICAgICBkZXN0UTsKKyAgICBzdHJ1Y3QgYmF3X2VuYWJsZXIgKmJhd19lbmFibGVyOworICAgIHN0cnVjdCBpZWVlODAyMTFfY3dtICAgIGN3bTsKKyAgICB1MTZfdCAgICAgICAgICAgICAgIHJlb3JkZXI7CisgICAgdTE2X3QgICAgICAgICAgICAgICBzZXFfZGVidWc7CisgICAgLyogcmF0ZSBjb250cm9sICovCisgICAgdTMyX3QgdHhNUERVW1pNX1JBVEVfVEFCTEVfU0laRV07CisgICAgdTMyX3QgdHhGYWlsW1pNX1JBVEVfVEFCTEVfU0laRV07CisgICAgdTMyX3QgUEVSW1pNX1JBVEVfVEFCTEVfU0laRV07CisgICAgdTE2X3QgcHJvYmVDb3VudDsKKyAgICB1MTZfdCBwcm9iZVN1Y2Nlc3NDb3VudDsKKyAgICB1MTZfdCBwcm9iZUludGVydmFsOworICAgIHUxNl90IHN1Y2Nlc3NfcHJvYmluZzsKKyAgICAvKgorICAgICAqIGVuZCBvZiBhZGQgYnkgaG9uZGEKKyAgICAgKi8KKworICAgIC8qIGFpcm9wZWVrIHNuaWZmZXIgbW9kZSBmb3IgdXBwZXIgc3cgKi8KKyAgICB1MzJfdCAgICAgICAgICAgICAgIHN3U25pZmZlcjsgICAvKiB3aW5kb3c6IGFpcm9QZWVrICovCisgICAgdTMyX3QgICAgICAgICAgICAgICBYTGlua01vZGU7CisKKyAgICAvKiBNREsgbW9kZSAqLworICAgIC8qIGluaXQgYnkgMD0+bm9ybWFsIGRyaXZlciAxPT5NREsgZHJpdmVyICovCisgICAgdTMyX3QgICAgICAgICAgICAgICBtb2RlTURLRW5hYmxlOworCisgICAgdTMyX3QgICAgICAgICAgICAgICBoZWFydEJlYXROb3RpZmljYXRpb247CisKKyAgICAvKiBwb2ludGVyIGZvciBIQUwgUGx1cyBwcml2YXRlIG1lbW9yeSAqLworICAgIHZvaWQqIGhwUHJpdmF0ZTsKKworICAgIC8qIGZvciBXUEEgc2V0dGluZyAqLworICAgIC8vdThfdCAgICAgICAgICAgICAgICAgICAgd3BhU3VwcG9ydFtaTV9NQVhfQVBfU1VQUE9SVF07CisgICAgLy91OF90ICAgICAgICAgICAgICAgICAgICB3cGFMZW5bWk1fTUFYX0FQX1NVUFBPUlRdOworICAgIC8vdThfdCAgICAgICAgICAgICAgICAgICAgd3BhSWVbWk1fTUFYX0FQX1NVUFBPUlRdW1pNX01BWF9JRV9TSVpFXTsKKworICAgIHN0cnVjdCB6c0xlZFN0cnVjdCAgICAgIGxlZFN0cnVjdDsKKworICAgIC8qIGFuaSBmbGFnICovCisgICAgdThfdCBhbmlFbmFibGU7CisgICAgdTE2X3QgdHhxX3RocmVzaG9sZDsKKworCS8vU2tpcCBNaWMgRXJyb3IgQ2hlY2sKKwl1OF90CVRLSVBfR3JvdXBfS2V5Q2hhbmdpbmc7CisKKwl1OF90ICAgIGR5bmFtaWNTSUZTRW5hYmxlOworCisJdThfdCAgICBxdWV1ZUZsdXNoZWQ7CisKKyAgICB1MTZfdCAoKnpmY2JBdXRoTm90aWZ5KSh6ZGV2X3QqIGRldiwgdTE2X3QqIG1hY0FkZHIpOworICAgIHUxNl90ICgqemZjYkFzb2NOb3RpZnkpKHpkZXZfdCogZGV2LCB1MTZfdCogbWFjQWRkciwgdThfdCogYm9keSwgdTE2X3QgYm9keVNpemUsIHUxNl90IHBvcnQpOworICAgIHUxNl90ICgqemZjYkRpc0Fzb2NOb3RpZnkpKHpkZXZfdCogZGV2LCB1OF90KiBtYWNBZGRyLCB1MTZfdCBwb3J0KTsKKyAgICB1MTZfdCAoKnpmY2JBcENvbm5lY3ROb3RpZnkpKHpkZXZfdCogZGV2LCB1OF90KiBtYWNBZGRyLCB1MTZfdCBwb3J0KTsKKyAgICB2b2lkICgqemZjYkNvbm5lY3ROb3RpZnkpKHpkZXZfdCogZGV2LCB1MTZfdCBzdGF0dXMsIHUxNl90KiBic3NpZCk7CisgICAgdm9pZCAoKnpmY2JTY2FuTm90aWZ5KSh6ZGV2X3QqIGRldiwgc3RydWN0IHpzU2NhblJlc3VsdCogcmVzdWx0KTsKKyAgICB2b2lkICgqemZjYk1pY0ZhaWx1cmVOb3RpZnkpKHpkZXZfdCogZGV2LCB1MTZfdCogYWRkciwgdTE2X3Qgc3RhdHVzKTsKKyAgICB2b2lkICgqemZjYkFwTWljRmFpbHVyZU5vdGlmeSkoemRldl90KiBkZXYsIHU4X3QqIGFkZHIsIHpidWZfdCogYnVmKTsKKyAgICB2b2lkICgqemZjYklic3NQYXJ0bmVyTm90aWZ5KSh6ZGV2X3QqIGRldiwgdTE2X3Qgc3RhdHVzLCBzdHJ1Y3QgenNQYXJ0bmVyTm90aWZ5RXZlbnQgKmV2ZW50KTsKKyAgICB2b2lkICgqemZjYk1hY0FkZHJlc3NOb3RpZnkpKHpkZXZfdCogZGV2LCB1OF90KiBhZGRyKTsKKyAgICB2b2lkICgqemZjYlNlbmRDb21wbGV0ZUluZGljYXRpb24pKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1Zik7CisgICAgdm9pZCAoKnpmY2JSZWN2RXRoKSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IHBvcnQpOworICAgIHZvaWQgKCp6ZmNiUmVjdjgwMjExKSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHN0cnVjdCB6c0FkZGl0aW9uSW5mbyogYWRkSW5mbyk7CisgICAgdm9pZCAoKnpmY2JSZXN0b3JlQnVmRGF0YSkoemRldl90KiBkZXYsIHpidWZfdCogYnVmKTsKKyNpZmRlZiBaTV9FTkFCTEVfQ0VOQworICAgIHUxNl90ICgqemZjYkNlbmNBc29jTm90aWZ5KSh6ZGV2X3QqIGRldiwgdTE2X3QqIG1hY0FkZHIsIHU4X3QqIGJvZHksCisgICAgICAgICAgICB1MTZfdCBib2R5U2l6ZSwgdTE2X3QgcG9ydCk7CisjZW5kaWYgLy9aTV9FTkFCTEVfQ0VOQworICAgIHU4X3QgKCp6ZmNiQ2xhc3NpZnlUeFBhY2tldCkoemRldl90KiBkZXYsIHpidWZfdCogYnVmKTsKKyAgICB2b2lkICgqemZjYkh3V2F0Y2hEb2dOb3RpZnkpKHpkZXZfdCogZGV2KTsKK307CisKKworc3RydWN0IHpzV2xhbktleQoreworICAgIHU4X3Qga2V5OworfTsKKworCisvKiBUaGVzZSBtYWNyb3MgYXJlIGRlZmluZWQgaGVyZSBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSAqLworLyogUGxlYXNlIGxlYXZlIHRoZW0gYWxvbmUgKi8KKy8qIEZvciBUeCBwYWNrZXQgYWxsb2NhdGVkIGluIHVwcGVyIGxheWVyIGxheWVyICovCisjZGVmaW5lIHptd190eF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCkgem13X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KQorI2RlZmluZSB6bXdfdHhfYnVmX3JlYWRoKGRldiwgYnVmLCBvZmZzZXQpIHptd19idWZfcmVhZGgoZGV2LCBidWYsIG9mZnNldCkKKyNkZWZpbmUgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCwgdmFsdWUpIHptd19idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQsIHZhbHVlKQorI2RlZmluZSB6bXdfdHhfYnVmX3dyaXRlaChkZXYsIGJ1Ziwgb2Zmc2V0LCB2YWx1ZSkgem13X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCwgdmFsdWUpCisKKy8qIEZvciBSeCBwYWNrZXQgYWxsb2NhdGVkIGluIGRyaXZlciAqLworI2RlZmluZSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQpIHptd19idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCkKKyNkZWZpbmUgem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1Ziwgb2Zmc2V0KSB6bXdfYnVmX3JlYWRoKGRldiwgYnVmLCBvZmZzZXQpCisjZGVmaW5lIHptd19yeF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQsIHZhbHVlKSB6bXdfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0LCB2YWx1ZSkKKyNkZWZpbmUgem13X3J4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCwgdmFsdWUpIHptd19idWZfd3JpdGVoKGRldiwgYnVmLCBvZmZzZXQsIHZhbHVlKQorCisjZW5kaWYgLyogI2lmbmRlZiBfU1RSVUNUX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS93bGFuLmggYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvd2xhbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2YzE4YjgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvd2xhbi5oCkBAIC0wLDAgKzEsNTk1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggQXRoZXJvcyBDb21tdW5pY2F0aW9ucyBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kdWxlIE5hbWUgOiB3bGFuX2RlZnMuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBBYnN0cmFjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFRoaXMgbW9kdWxlIGNvbnRhaW5zIFdMQU4gZGVmaW5pdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBOT1RFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIE5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX1dMQU5fSAorI2RlZmluZSBfV0xBTl9ICisKKworI2RlZmluZSBaTV9FWFRFUk5BTF9BTExPQ19CVUYgICAgICAgICAgICAgICAwCisjZGVmaW5lIFpNX0lOVEVSTkFMX0FMTE9DX0JVRiAgICAgICAgICAgICAgIDEKKworI2RlZmluZSBaTV9TSVpFX09GX0NUUkxfU0VUICAgICAgICAgICAgICAgICA4CisjZGVmaW5lIFpNX1NJWkVfT0ZfSVYgICAgICAgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgWk1fU0laRV9PRl9FWFRfSVYgICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBaTV9TSVpFX09GX01JQyAgICAgICAgICAgICAgICAgICAgICA4CisjZGVmaW5lIFpNX1NJWkVfT0ZfQ0NYX01JQyAgICAgICAgICAgICAgICAgIDgKKyNkZWZpbmUgWk1fU0laRV9PRl9XTEFOX0RBVEFfSEVBREVSICAgICAgICAgMjQKKyNkZWZpbmUgWk1fU0laRV9PRl9RT1NfQ1RSTCAgICAgICAgICAgICAgICAgMgorCisvKiBIZWFkZXIgZGVmaW5pdGlvbiAqLworI2RlZmluZSBaTV9TSVpFX09GX1dMQU5fV0RTX0hFQURFUiAgICAgICAgICAzMgorI2RlZmluZSBaTV9TSVpFX09GX1NOQVBfSEVBREVSICAgICAgICAgICAgICA4CisKKyNkZWZpbmUgWk1fV0xBTl9IRUFERVJfQTFfT0ZGU0VUICAgICAgICAgICAgNAorI2RlZmluZSBaTV9XTEFOX0hFQURFUl9BMl9PRkZTRVQgICAgICAgICAgICAxMAorI2RlZmluZSBaTV9XTEFOX0hFQURFUl9BM19PRkZTRVQgICAgICAgICAgICAxNgorI2RlZmluZSBaTV9XTEFOX0hFQURFUl9BNF9PRkZTRVQgICAgICAgICAgICAyNAorI2RlZmluZSBaTV9XTEFOX0hFQURFUl9JVl9PRkZTRVQgICAgICAgICAgICAyNAorI2RlZmluZSBaTV9TSVpFX09GX1dMQU5fREFUQV9IRUFERVIgICAgICAgICAyNAorCisvKiBQb3J0IGRlZmluaXRpb24gKi8KKyNkZWZpbmUgWk1fUE9SVF9ESVNBQkxFRCAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBaTV9QT1JUX0VOQUJMRUQgICAgICAgICAgICAgICAgICAgICAxCisKKy8qIEZyYW1lIFR5cGUgKi8KKyNkZWZpbmUgWk1fV0xBTl9NQU5BR0VNRU5UX0ZSQU1FICAgICAgICAgICAgMHgwCisjZGVmaW5lIFpNX1dMQU5fQ09OVFJPTF9GUkFNRSAgICAgICAgICAgICAgIDB4NAorI2RlZmluZSBaTV9XTEFOX0RBVEFfRlJBTUUgICAgICAgICAgICAgICAgICAweDgKKworLyogRnJhbWUgU3VidHlwZSAqLworI2RlZmluZSBaTV9XTEFOX0ZSQU1FX1RZUEVfQVNPQ1JFUSAgICAgICAgICAweDAwCisjZGVmaW5lIFpNX1dMQU5fRlJBTUVfVFlQRV9BU09DUlNQICAgICAgICAgIDB4MTAKKyNkZWZpbmUgWk1fV0xBTl9GUkFNRV9UWVBFX1JFQVNPQ1JFUSAgICAgICAgMHgyMAorI2RlZmluZSBaTV9XTEFOX0ZSQU1FX1RZUEVfUkVBU09DUlNQICAgICAgICAweDMwCisjZGVmaW5lIFpNX1dMQU5fRlJBTUVfVFlQRV9QUk9CRVJFUSAgICAgICAgIDB4NDAKKyNkZWZpbmUgWk1fV0xBTl9GUkFNRV9UWVBFX1BST0JFUlNQICAgICAgICAgMHg1MAorLyogMHg2MCwgMHg3MCA9PiBSZXNlcnZlZCAqLworI2RlZmluZSBaTV9XTEFOX0ZSQU1FX1RZUEVfQkVBQ09OICAgICAgICAgICAweDgwCisjZGVmaW5lIFpNX1dMQU5fRlJBTUVfVFlQRV9BVElNICAgICAgICAgICAgIDB4OTAKKyNkZWZpbmUgWk1fV0xBTl9GUkFNRV9UWVBFX0RJU0FTT0MgICAgICAgICAgMHhBMAorI2RlZmluZSBaTV9XTEFOX0ZSQU1FX1RZUEVfQVVUSCAgICAgICAgICAgICAweEIwCisjZGVmaW5lIFpNX1dMQU5fRlJBTUVfVFlQRV9ERUFVVEggICAgICAgICAgIDB4QzAKKyNkZWZpbmUgWk1fV0xBTl9GUkFNRV9UWVBFX0FDVElPTgkJCTB4RDAKKworLyogRnJhbWUgdHlwZSBhbmQgc3VidHlwZSAqLworI2RlZmluZSBaTV9XTEFOX0ZSQU1FX1RZUEVfTlVMTCAgICAgICAgICAgICAweDQ4CisjZGVmaW5lIFpNX1dMQU5fRlJBTUVfVFlQRV9CQVIgICAgICAgICAgICAgIDB4ODQKKyNkZWZpbmUgWk1fV0xBTl9GUkFNRV9UWVBFX0JBICAgICAgICAgICAgICAgMHg5NAorI2RlZmluZSBaTV9XTEFOX0ZSQU1FX1RZUEVfUFNQT0xMICAgICAgICAgICAweEE0CisjZGVmaW5lIFpNX1dMQU5fRlJBTUVfVFlQRV9SVFMgICAgICAgICAgICAgIDB4QjQKKyNkZWZpbmUgWk1fV0xBTl9GUkFNRV9UWVBFX0NUUyAgICAgICAgICAgICAgMHhDNAorI2RlZmluZSBaTV9XTEFOX0ZSQU1FX1RZUEVfUU9TX05VTEwgICAgICAgICAweEM4CisKKy8qIGFjdGlvbiBmcmFtZSAqLworI2RlZmluZSBaTV9XTEFOX1NQRUNUUlVNX01BTkFHRU1FTlRfQUNUSU9OX0ZSQU1FICAgIDAKKyNkZWZpbmUgWk1fV0xBTl9RT1NfQUNUSU9OX0ZSQU1FICAgICAgICAgICAgMQorI2RlZmluZSBaTV9XTEFOX0RMU19BQ1RJT05fRlJBTUUgICAgICAgICAgICAyCisjZGVmaW5lIFpNX1dMQU5fQkxPQ0tfQUNLX0FDVElPTl9GUkFNRSAgICAgIDMKKy8qIGJsb2NrIGFjayBhY3Rpb24gZnJhbWUqLworI2RlZmluZSBaTV9XTEFOX0FEREJBX1JFUVVFU1RfRlJBTUUgICAgICAgICAwCisjZGVmaW5lIFpNX1dMQU5fQUREQkFfUkVTUE9OU0VfRlJBTUUgICAgICAgIDEKKyNkZWZpbmUgWk1fV0xBTl9ERUxCQV9GUkFNRSAgICAgICAgICAgICAgICAgMgorCisvKiBFbGVtZW50IElEICovCisjZGVmaW5lIFpNX1dMQU5fRUlEX1NTSUQgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgWk1fV0xBTl9FSURfU1VQUE9SVF9SQVRFICAgICAgICAgICAgMQorI2RlZmluZSBaTV9XTEFOX0VJRF9GSCAgICAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIFpNX1dMQU5fRUlEX0RTICAgICAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgWk1fV0xBTl9FSURfQ0ZTICAgICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBaTV9XTEFOX0VJRF9USU0gICAgICAgICAgICAgICAgICAgICA1CisjZGVmaW5lIFpNX1dMQU5fRUlEX0lCU1MgICAgICAgICAgICAgICAgICAgIDYKKyNkZWZpbmUgWk1fV0xBTl9FSURfQ09VTlRSWSAgICAgICAgICAgICAgICAgNworLyogcmVzZXJ2ZWQgOC0xNSAqLworI2RlZmluZSBaTV9XTEFOX0VJRF9DSEFMTEVOR0UgICAgICAgICAgICAgICAxNgorLyogcmVzZXJ2ZWQgMTctMzEgKi8KKyNkZWZpbmUgWk1fV0xBTl9FSURfUE9XRVJfQ09OU1RSQUlOVCAgICAgICAgMzIKKyNkZWZpbmUgWk1fV0xBTl9FSURfUE9XRVJfQ0FQQUJJTElUWSAgICAgICAgMzMKKyNkZWZpbmUgWk1fV0xBTl9FSURfVFBDX1JFUVVFU1QgICAgICAgICAgICAgMzQKKyNkZWZpbmUgWk1fV0xBTl9FSURfVFBDX1JFUE9SVCAgICAgICAgICAgICAgMzUKKyNkZWZpbmUgWk1fV0xBTl9FSURfU1VQUE9SVEVEX0NIQU5ORUxTICAgICAgMzYKKyNkZWZpbmUgWk1fV0xBTl9FSURfQ0hBTk5FTF9TV0lUQ0hfQU5OT1VOQ0UgMzcKKyNkZWZpbmUgWk1fV0xBTl9FSURfTUVBU1VSRU1FTlRfUkVRVUVTVCAgICAgMzgKKyNkZWZpbmUgWk1fV0xBTl9FSURfTUVBU1VSRU1FTlRfUkVQT1JUICAgICAgMzkKKyNkZWZpbmUgWk1fV0xBTl9FSURfUVVJRVQgICAgICAgICAgICAgICAgICAgNDAKKyNkZWZpbmUgWk1fV0xBTl9FSURfSUJTU19ERlMgICAgICAgICAgICAgICAgNDEKKyNkZWZpbmUgWk1fV0xBTl9FSURfRVJQICAgICAgICAgICAgICAgICAgICAgNDIKKyNkZWZpbmUgWk1fV0xBTl9QUkVOMl9FSURfSFRDQVBBQklMSVRZICAgICAgNDUKKyNkZWZpbmUgWk1fV0xBTl9FSURfUlNOX0lFICAgICAgICAgICAgICAgICAgNDgKKyNkZWZpbmUgWk1fV0xBTl9FSURfRVhURU5ERURfUkFURSAgICAgICAgICAgNTAKKyNkZWZpbmUgWk1fV0xBTl9FSURfSFRfQ0FQQUJJTElUWSAgICAgICAgICAgNTEKKyNkZWZpbmUgWk1fV0xBTl9FSURfRVhURU5ERURfSFRfQ0FQQUJJTElUWSAgNTIKKyNkZWZpbmUgWk1fV0xBTl9FSURfTkVXX0VYVF9DSEFOTkVMX09GRlNFVCAgNTMKKyNkZWZpbmUgWk1fV0xBTl9QUkVOMl9FSURfSFRJTkZPUk1BVElPTiAgICAgNjEKKyNkZWZpbmUgWk1fV0xBTl9QUkVOMl9FSURfU0VDT05EQ0hPRkZTRVQgICAgNjIKKyNpZmRlZiBaTV9FTkFCTEVfQ0VOQworI2RlZmluZSBaTV9XTEFOX0VJRF9DRU5DX0lFICAgICAgICAgICAgICAgICA2OAorI2VuZGlmIC8vWk1fRU5BQkxFX0NFTkMKKyNkZWZpbmUgWk1fV0xBTl9FSURfVkVORE9SX1BSSVZBVEUgICAgICAgICAgMjIxICAgICAvKiBWZW5kb3IgcHJpdmF0ZSBzcGFjZTsgbXVzdCBkZW11eCBPVUkgKi8KKyNkZWZpbmUgWk1fV0xBTl9FSURfV1BBX0lFICAgICAgICAgICAgICAgICAgMjIxCisjZGVmaW5lIFpNX1dMQU5fRUlEX1dQU19JRSAgICAgICAgICAgICAgICAgIDIyMQorI2RlZmluZSBaTV9XTEFOX0VJRF9XSUZJX0lFICAgICAgICAgICAgICAgICAyMjEKKworLyogRVJQIGluZm9ybWF0aW9uIGVsZW1lbnQgKi8KKyNkZWZpbmUgWk1fV0xBTl9OT05fRVJQX1BSRVNFTlRfQklUICAgICAgICAgMHgxCisjZGVmaW5lIFpNX1dMQU5fVVNFX1BST1RFQ1RJT05fQklUICAgICAgICAgIDB4MgorI2RlZmluZSBaTV9XTEFOX0JBUktFUl9QUkVBTUJMRV9NT0RFX0JJVCAgICAweDQKKworLyogQ2hhbm5lbCBmcmVxdWVuY3ksIGluIE1IeiAqLworI2RlZmluZSBaTV9DSF9HXzEgICAgICAgICAgICAgICAgICAgICAgICAgIDI0MTIKKyNkZWZpbmUgWk1fQ0hfR18yICAgICAgICAgICAgICAgICAgICAgICAgICAyNDE3CisjZGVmaW5lIFpNX0NIX0dfMyAgICAgICAgICAgICAgICAgICAgICAgICAgMjQyMgorI2RlZmluZSBaTV9DSF9HXzQgICAgICAgICAgICAgICAgICAgICAgICAgIDI0MjcKKyNkZWZpbmUgWk1fQ0hfR181ICAgICAgICAgICAgICAgICAgICAgICAgICAyNDMyCisjZGVmaW5lIFpNX0NIX0dfNiAgICAgICAgICAgICAgICAgICAgICAgICAgMjQzNworI2RlZmluZSBaTV9DSF9HXzcgICAgICAgICAgICAgICAgICAgICAgICAgIDI0NDIKKyNkZWZpbmUgWk1fQ0hfR184ICAgICAgICAgICAgICAgICAgICAgICAgICAyNDQ3CisjZGVmaW5lIFpNX0NIX0dfOSAgICAgICAgICAgICAgICAgICAgICAgICAgMjQ1MgorI2RlZmluZSBaTV9DSF9HXzEwICAgICAgICAgICAgICAgICAgICAgICAgIDI0NTcKKyNkZWZpbmUgWk1fQ0hfR18xMSAgICAgICAgICAgICAgICAgICAgICAgICAyNDYyCisjZGVmaW5lIFpNX0NIX0dfMTIgICAgICAgICAgICAgICAgICAgICAgICAgMjQ2NworI2RlZmluZSBaTV9DSF9HXzEzICAgICAgICAgICAgICAgICAgICAgICAgIDI0NzIKKyNkZWZpbmUgWk1fQ0hfR18xNCAgICAgICAgICAgICAgICAgICAgICAgICAyNDg0CisjZGVmaW5lIFpNX0NIX0FfMTg0ICAgICAgICAgICAgICAgICAgICAgICAgNDkyMAorI2RlZmluZSBaTV9DSF9BXzE4OCAgICAgICAgICAgICAgICAgICAgICAgIDQ5NDAKKyNkZWZpbmUgWk1fQ0hfQV8xOTIgICAgICAgICAgICAgICAgICAgICAgICA0OTYwCisjZGVmaW5lIFpNX0NIX0FfMTk2ICAgICAgICAgICAgICAgICAgICAgICAgNDk4MAorI2RlZmluZSBaTV9DSF9BXzggICAgICAgICAgICAgICAgICAgICAgICAgIDUwNDAKKyNkZWZpbmUgWk1fQ0hfQV8xMiAgICAgICAgICAgICAgICAgICAgICAgICA1MDYwCisjZGVmaW5lIFpNX0NIX0FfMTYgICAgICAgICAgICAgICAgICAgICAgICAgNTA4MAorI2RlZmluZSBaTV9DSF9BXzM2ICAgICAgICAgICAgICAgICAgICAgICAgIDUxODAKKyNkZWZpbmUgWk1fQ0hfQV80MCAgICAgICAgICAgICAgICAgICAgICAgICA1MjAwCisjZGVmaW5lIFpNX0NIX0FfNDQgICAgICAgICAgICAgICAgICAgICAgICAgNTIyMAorI2RlZmluZSBaTV9DSF9BXzQ4ICAgICAgICAgICAgICAgICAgICAgICAgIDUyNDAKKyNkZWZpbmUgWk1fQ0hfQV81MiAgICAgICAgICAgICAgICAgICAgICAgICA1MjYwCisjZGVmaW5lIFpNX0NIX0FfNTYgICAgICAgICAgICAgICAgICAgICAgICAgNTI4MAorI2RlZmluZSBaTV9DSF9BXzYwICAgICAgICAgICAgICAgICAgICAgICAgIDUzMDAKKyNkZWZpbmUgWk1fQ0hfQV82NCAgICAgICAgICAgICAgICAgICAgICAgICA1MzIwCisjZGVmaW5lIFpNX0NIX0FfMTAwICAgICAgICAgICAgICAgICAgICAgICAgNTUwMAorI2RlZmluZSBaTV9DSF9BXzEwNCAgICAgICAgICAgICAgICAgICAgICAgIDU1MjAKKyNkZWZpbmUgWk1fQ0hfQV8xMDggICAgICAgICAgICAgICAgICAgICAgICA1NTQwCisjZGVmaW5lIFpNX0NIX0FfMTEyICAgICAgICAgICAgICAgICAgICAgICAgNTU2MAorI2RlZmluZSBaTV9DSF9BXzExNiAgICAgICAgICAgICAgICAgICAgICAgIDU1ODAKKyNkZWZpbmUgWk1fQ0hfQV8xMjAgICAgICAgICAgICAgICAgICAgICAgICA1NjAwCisjZGVmaW5lIFpNX0NIX0FfMTI0ICAgICAgICAgICAgICAgICAgICAgICAgNTYyMAorI2RlZmluZSBaTV9DSF9BXzEyOCAgICAgICAgICAgICAgICAgICAgICAgIDU2NDAKKyNkZWZpbmUgWk1fQ0hfQV8xMzIgICAgICAgICAgICAgICAgICAgICAgICA1NjYwCisjZGVmaW5lIFpNX0NIX0FfMTM2ICAgICAgICAgICAgICAgICAgICAgICAgNTY4MAorI2RlZmluZSBaTV9DSF9BXzE0MCAgICAgICAgICAgICAgICAgICAgICAgIDU3MDAKKyNkZWZpbmUgWk1fQ0hfQV8xNDkgICAgICAgICAgICAgICAgICAgICAgICA1NzQ1CisjZGVmaW5lIFpNX0NIX0FfMTUzICAgICAgICAgICAgICAgICAgICAgICAgNTc2NQorI2RlZmluZSBaTV9DSF9BXzE1NyAgICAgICAgICAgICAgICAgICAgICAgIDU3ODUKKyNkZWZpbmUgWk1fQ0hfQV8xNjEgICAgICAgICAgICAgICAgICAgICAgICA1ODA1CisjZGVmaW5lIFpNX0NIX0FfMTY1ICAgICAgICAgICAgICAgICAgICAgICAgNTgyNQorCisKKy8qIEFQIDogU1RBIHRhYmxlID0+IFNUQSBUeXBlICovCisjZGVmaW5lIFpNXzExQl9TVEEgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MAorI2RlZmluZSBaTV8xMUdfU1RBICAgICAgICAgICAgICAgICAgICAgICAgICAweDIKKyNkZWZpbmUgWk1fMTFOX1NUQSAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0CisKKy8qIEFQIDogdGltZW91dCAqLworI2RlZmluZSBaTV9NU19QRVJfVElDSyAgICAgICAgICAgICAgICAgICAgICAxMAorI2RlZmluZSBaTV9USUNLX1BFUl9TRUNPTkQgICAgICAgICAgICAgICAgICAoMTAwMC9aTV9NU19QRVJfVElDSykKKyNkZWZpbmUgWk1fVElDS19QRVJfTUlOVVRFICAgICAgICAgICAgICAgICAgKDYwKjEwMDAvWk1fTVNfUEVSX1RJQ0spCisjZGVmaW5lIFpNX1BSRUFVVEhfVElNRU9VVF9NUyAgICAgICAgICAgICAgIDEwMDAgLyogMSBzZWMgKi8KKyNkZWZpbmUgWk1fQVVUSF9USU1FT1VUX01TICAgICAgICAgICAgICAgICAgMTAwMCAvKiAxIHNlYyAqLworCisvKiBFcnJvciBjb2RlICovCisjZGVmaW5lIFpNX1NVQ0NFU1MgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgWk1fRVJSX1RYX1BPUlRfRElTQUJMRUQgICAgICAgICAgICAgMQorI2RlZmluZSBaTV9FUlJfQlVGRkVSX0RNQV9BRERSICAgICAgICAgICAgICAyCisjZGVmaW5lIFpNX0VSUl9GUkVFX1RYRF9FWEhBVVNURUQgICAgICAgICAgIDMKKyNkZWZpbmUgWk1fRVJSX1RYX0JVRkZFUl9VTkFWQUlMQUJMRSAgICAgICAgNAorI2RlZmluZSBaTV9FUlJfQkNNQ19QU19CVUZGRVJfVU5BVkFJTEFCTEUgICA1CisjZGVmaW5lIFpNX0VSUl9VTklfUFNfQlVGRkVSX1VOQVZBSUxBQkxFICAgIDYKKyNkZWZpbmUgWk1fRVJSX0VYQ0VFRF9QUklPUklUWV9USFJFU0hPTEQgICAgNworI2RlZmluZSBaTV9FUlJfVk1NUV9GVUxMICAgICAgICAgICAgICAgICAgICA4CisjZGVmaW5lIFpNX0VSUl9GTFVTSF9QU19RVUVVRSAgICAgICAgICAgICAgIDkKKyNkZWZpbmUgWk1fRVJSX0NNRF9JTlRfTUlTU0VEICAgICAgICAgICAgICAgMTUgLyogUG9sbGluZyBjbWQgaW50IHRpbWVvdXQqLworLyogUnggKi8KKyNkZWZpbmUgWk1fRVJSX1JYX0ZSQU1FX1RZUEUgICAgICAgICAgICAgICAgMjAKKyNkZWZpbmUgWk1fRVJSX01JTl9SWF9FTkNSWVBUX0ZSQU1FX0xFTkdUSCAgMjEKKyNkZWZpbmUgWk1fRVJSX01JTl9SWF9GUkFNRV9MRU5HVEggICAgICAgICAgMjIKKyNkZWZpbmUgWk1fRVJSX01BWF9SWF9GUkFNRV9MRU5HVEggICAgICAgICAgMjMKKyNkZWZpbmUgWk1fRVJSX1JYX0RVUExJQ0FURSAgICAgICAgICAgICAgICAgMjQKKyNkZWZpbmUgWk1fRVJSX1JYX1NSQ19BRERSX0lTX09XTl9NQUMgICAgICAgMjUKKyNkZWZpbmUgWk1fRVJSX01JTl9SWF9QUk9UT0NPTF9WRVJTSU9OICAgICAgMjYKKyNkZWZpbmUgWk1fRVJSX1dQQV9HS19OT1RfSU5TVEFMTEVEICAgICAgICAgMjcKKyNkZWZpbmUgWk1fRVJSX1NUQV9OT1RfQVNTT0NJQVRFRCAgICAgICAgICAgMjgKKyNkZWZpbmUgWk1fRVJSX0RBVEFfQkVGT1JFX0NPTk5FQ1RFRCAgICAgICAgMjkKKyNkZWZpbmUgWk1fRVJSX0RBVEFfTk9UX0VOQ1JZUFRFRCAgICAgICAgICAgMzAKKyNkZWZpbmUgWk1fRVJSX0RBVEFfQlNTSURfTk9UX01BVENIRUQgICAgICAgMzEKKyNkZWZpbmUgWk1fRVJSX1JYX0JBUl9GUkFNRSAgICAgICAgICAgICAgICAgMzIKKyNkZWZpbmUgWk1fRVJSX09VVF9PRl9PUkRFUl9OVUxMX0RBVEEgICAgICAgMzMKKworLyogWkZJICovCisjZGVmaW5lIFpNX0VSUl9JTlZBTElEX1RYX1JBVEUgICAgICAgICAgICAgIDQwCisjZGVmaW5lIFpNX0VSUl9XRFNfUE9SVF9JRCAgICAgICAgICAgICAgICAgIDQxCisKKy8qIFFVRVVFICovCisjZGVmaW5lIFpNX0VSUl9RVUVVRV9GVUxMICAgICAgICAgICAgICAgICAgIDUwCisjZGVmaW5lIFpNX0VSUl9TVEFfVUFQU0RfUVVFVUVfRlVMTCAgICAgICAgIDUxCisjZGVmaW5lIFpNX0VSUl9BUF9VQVBTRF9RVUVVRV9GVUxMICAgICAgICAgIDUyCisKKy8qIE1heGltdW0gUnggZnJhbWUgbGVuZ3RoICovCisjaWYgWk1fTEFSR0VQQVlMT0FEX1RFU1QgPT0gMQorI2RlZmluZSBaTV9XTEFOX01BWF9SWF9TSVpFICAgICAgICAgICAgICAgICAxNjM4NAorI2Vsc2UKKyNkZWZpbmUgWk1fV0xBTl9NQVhfUlhfU0laRSAgICAgICAgICAgICAgICAgODE5MgorI2VuZGlmCisKKy8qIFBDSSBETUEgdGVzdCBlcnJvciBjb2RlICovCisjZGVmaW5lIFpNX0VSUl9JTlRFUlJVUFRfTUlTU0VEICAgICAgICAgICAgIDEwMAorI2RlZmluZSBaTV9FUlJfT1dOX0JJVF9OT1RfQ0xFQVJFRCAgICAgICAgICAxMDEKKyNkZWZpbmUgWk1fRVJSX1JYX1NFUV9OVU1CRVIgICAgICAgICAgICAgICAgMTAyCisjZGVmaW5lIFpNX0VSUl9SWF9MRU5HVEggICAgICAgICAgICAgICAgICAgIDEwMworI2RlZmluZSBaTV9FUlJfUlhfREFUQSAgICAgICAgICAgICAgICAgICAgICAxMDQKKyNkZWZpbmUgWk1fRVJSX1JYX0RFU0NSSVBUT1JfTlVNICAgICAgICAgICAgMTA1CisvKiBDb21tb24gcmVnaXN0ZXIgdGVzdCBlcnJvciBjb2RlICovCisjZGVmaW5lIFpNX0VSUl9SRUdJU1RFUl9BQ0NFU1MgICAgICAgICAgICAgIDExMCAvKiBSZWdpc3RlciBSL1cgdGVzdCBmYWlsKi8KKyNkZWZpbmUgWk1fRVJSX0NMRUFSX0lOVEVSUlVQVF9GTEFHICAgICAgICAgMTExCisjZGVmaW5lIFpNX0VSUl9DT01NQU5EX1JFU1BPTlNFICAgICAgICAgICAgIDExMgorI2RlZmluZSBaTV9FUlJfSU5URVJSVVBUX0dFTkVSQVRFICAgICAgICAgICAxMTMKKyNkZWZpbmUgWk1fRVJSX0lOVEVSUlVQVF9BQ0sgICAgICAgICAgICAgICAgMTE0CisjZGVmaW5lIFpNX0VSUl9TQ1JBVENIX0FDQ0VTUyAgICAgICAgICAgICAgIDExNQorI2RlZmluZSBaTV9FUlJfSU5URVJSVVBUX01BU0tfQUNDRVNTICAgICAgICAxMTYKKyNkZWZpbmUgWk1fRVJSX1NIQVJFX01FTU9SWV9QQ0lfQUNDRVNTICAgICAgMTE3CisjZGVmaW5lIFpNX0VSUl9TSEFSRV9NRU1PUllfRldfQUNDRVNTICAgICAgIDExOAorI2RlZmluZSBaTV9FUlJfU0hBUkVfTUVNT1JZX0RJU0FCTEUgICAgICAgICAxMTkKKyNkZWZpbmUgWk1fRVJSX1NIQVJFX01FTU9SWV9URVNUX1JFU1BPTlNFICAgMTIwCisKKy8qIEZpcm13YXJlIERvd25sb2FkIGVycm9yIGNvZGUgKi8KKyNkZWZpbmUgWk1fRVJSX0ZJUk1XQVJFX0RPV05MT0FEX1RJTUVPVVQgICAgMTUwCisjZGVmaW5lIFpNX0VSUl9GSVJNV0FSRV9ET1dOTE9BRF9JTlRfRkxBRyAgIDE1MQorI2RlZmluZSBaTV9FUlJfRklSTVdBUkVfUkVBRFlfVElNRU9VVCAgICAgICAxNTIKKyNkZWZpbmUgWk1fRVJSX0ZJUk1XQVJFX1dST05HX1RZUEUgICAgICAgICAgMTUzCisKKy8qIERlYnVnICovCisjZGVmaW5lIFpNX0xWXzAgICAgIDAvL0RlYnVnIGxldmVsIDAsIERpc2FibGUgZGVidWcgbWVzc2FnZQorI2RlZmluZSBaTV9MVl8xICAgICAxLy9EZWJ1ZyBsZXZlbCAxLCBTaG93IG1pbmltdW0gaW5mb3JtYXRpb24KKyNkZWZpbmUgWk1fTFZfMiAgICAgMi8vRGVidWcgbGV2ZWwgMiwgU2hvdyBtZWRpdW0gbWVzc2FnZQorI2RlZmluZSBaTV9MVl8zICAgICAzLy9EZWJ1ZyBsZXZlbCAzLCBTaG93IGFsbAorCisjZGVmaW5lIFpNX1NDQU5NU0dfTEVWICBaTV9MVl8xCisjZGVmaW5lIFpNX1RYTVNHX0xFViAgICBaTV9MVl8wLy9aTV9MVl8wCisjZGVmaW5lIFpNX1JYTVNHX0xFViAgICBaTV9MVl8wCisjZGVmaW5lIFpNX01NTVNHX0xFViAgICBaTV9MVl8wCisjZGVmaW5lIFpNX0RFU01TR19MRVYgICBaTV9MVl8wLy9aTV9MVl8wCisjZGVmaW5lIFpNX0JVRk1TR19MRVYgICBaTV9MVl8wLy9aTV9MVl8xCisjZGVmaW5lIFpNX0lOSVRNU0dfTEVWICBaTV9MVl8wCisKKyNkZWZpbmUgem1fbXNnMF9zY2FuKGx2LCBtc2cpIGlmIChaTV9TQ0FOTVNHX0xFViA+PSBsdikgXAorICAgICAgICB7em1fZGVidWdfbXNnMChtc2cpO30KKyNkZWZpbmUgem1fbXNnMV9zY2FuKGx2LCBtc2csIHZhbCkgaWYgKFpNX1NDQU5NU0dfTEVWID49IGx2KSBcCisgICAgICAgIHt6bV9kZWJ1Z19tc2cxKG1zZywgdmFsKTt9CisjZGVmaW5lIHptX21zZzJfc2NhbihsdiwgbXNnLCB2YWwpIGlmIChaTV9TQ0FOTVNHX0xFViA+PSBsdikgXAorICAgICAgICB7em1fZGVidWdfbXNnMihtc2csIHZhbCk7fQorCisjZGVmaW5lIHptX21zZzBfdHgobHYsIG1zZykgaWYgKFpNX1RYTVNHX0xFViA+PSBsdikgXAorICAgICAgICB7em1fZGVidWdfbXNnMChtc2cpO30KKyNkZWZpbmUgem1fbXNnMV90eChsdiwgbXNnLCB2YWwpIGlmIChaTV9UWE1TR19MRVYgPj0gbHYpIFwKKyAgICAgICAge3ptX2RlYnVnX21zZzEobXNnLCB2YWwpO30KKyNkZWZpbmUgem1fbXNnMl90eChsdiwgbXNnLCB2YWwpIGlmIChaTV9UWE1TR19MRVYgPj0gbHYpIFwKKyAgICAgICAge3ptX2RlYnVnX21zZzIobXNnLCB2YWwpO30KKworI2RlZmluZSB6bV9tc2cwX3J4KGx2LCBtc2cpIGlmIChaTV9SWE1TR19MRVYgPj0gbHYpIFwKKyAgICAgICAge3ptX2RlYnVnX21zZzAobXNnKTt9CisjZGVmaW5lIHptX21zZzFfcngobHYsIG1zZywgdmFsKSBpZiAoWk1fUlhNU0dfTEVWID49IGx2KSBcCisgICAgICAgIHt6bV9kZWJ1Z19tc2cxKG1zZywgdmFsKTt9CisjZGVmaW5lIHptX21zZzJfcngobHYsIG1zZywgdmFsKSBpZiAoWk1fUlhNU0dfTEVWID49IGx2KSBcCisgICAgICAgIHt6bV9kZWJ1Z19tc2cyKG1zZywgdmFsKTt9CisKKyNkZWZpbmUgem1fbXNnMF9tbShsdiwgbXNnKSBpZiAoWk1fTU1NU0dfTEVWID49IGx2KSBcCisgICAgICAgIHt6bV9kZWJ1Z19tc2cwKG1zZyk7fQorI2RlZmluZSB6bV9tc2cxX21tKGx2LCBtc2csIHZhbCkgaWYgKFpNX01NTVNHX0xFViA+PSBsdikgXAorICAgICAgICB7em1fZGVidWdfbXNnMShtc2csIHZhbCk7fQorI2RlZmluZSB6bV9tc2cyX21tKGx2LCBtc2csIHZhbCkgaWYgKFpNX01NTVNHX0xFViA+PSBsdikgXAorICAgICAgICB7em1fZGVidWdfbXNnMihtc2csIHZhbCk7fQorCisjZGVmaW5lIHptX21zZzBfZGVzKGx2LCBtc2cpIGlmIChaTV9ERVNNU0dfTEVWID49IGx2KSBcCisgICAgICAgIHt6bV9kZWJ1Z19tc2cwKG1zZyk7fQorI2RlZmluZSB6bV9tc2cxX2RlcyhsdiwgbXNnLCB2YWwpIGlmIChaTV9ERVNNU0dfTEVWID49IGx2KSBcCisgICAgICAgIHt6bV9kZWJ1Z19tc2cxKG1zZywgdmFsKTt9CisjZGVmaW5lIHptX21zZzJfZGVzKGx2LCBtc2csIHZhbCkgaWYgKFpNX0RFU01TR19MRVYgPj0gbHYpIFwKKyAgICAgICAge3ptX2RlYnVnX21zZzIobXNnLCB2YWwpO30KKworI2RlZmluZSB6bV9tc2cwX2J1ZihsdiwgbXNnKSBpZiAoWk1fQlVGTVNHX0xFViA+PSBsdikgXAorICAgICAgICB7em1fZGVidWdfbXNnMChtc2cpO30KKyNkZWZpbmUgem1fbXNnMV9idWYobHYsIG1zZywgdmFsKSBpZiAoWk1fQlVGTVNHX0xFViA+PSBsdikgXAorICAgICAgICB7em1fZGVidWdfbXNnMShtc2csIHZhbCk7fQorI2RlZmluZSB6bV9tc2cyX2J1ZihsdiwgbXNnLCB2YWwpIGlmIChaTV9CVUZNU0dfTEVWID49IGx2KSBcCisgICAgICAgIHt6bV9kZWJ1Z19tc2cyKG1zZywgdmFsKTt9CisKKyNkZWZpbmUgem1fbXNnMF9pbml0KGx2LCBtc2cpIGlmIChaTV9JTklUTVNHX0xFViA+PSBsdikgXAorICAgICAgICB7em1fZGVidWdfbXNnMChtc2cpO30KKyNkZWZpbmUgem1fbXNnMV9pbml0KGx2LCBtc2csIHZhbCkgaWYgKFpNX0lOSVRNU0dfTEVWID49IGx2KSBcCisgICAgICAgIHt6bV9kZWJ1Z19tc2cxKG1zZywgdmFsKTt9CisjZGVmaW5lIHptX21zZzJfaW5pdChsdiwgbXNnLCB2YWwpIGlmIChaTV9JTklUTVNHX0xFViA+PSBsdikgXAorICAgICAgICB7em1fZGVidWdfbXNnMihtc2csIHZhbCk7fQorCisjZGVmaW5lIFpNX01BWF9BUF9TVVBQT1JUICAgICAgICAgICAgICAgICAgIDIgIC8qIE11c3QgPD0gOCAqLworI2RlZmluZSBaTV9NQVhfV0RTX1NVUFBPUlQgICAgICAgICAgICAgICAgICA2ICAvKiBNdXN0IDw9IDYgKi8KKyNkZWZpbmUgWk1fTUFYX1NUQV9TVVBQT1JUICAgICAgICAgICAgICAgICAgMTYgLyogTXVzdCA8PSA2NCAqLworCisvKiBTVEEgdGFibGUgc3RhdGUgKi8KKyNkZWZpbmUgWk1fU1RBVEVfQVVUSCAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBaTV9TVEFURV9QUkVBVVRIICAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIFpNX1NUQVRFX0FTT0MgICAgICAgICAgICAgICAgICAgICAgIDMKKworLyogUmF0ZSBzZXQgKi8KKyNkZWZpbmUgWk1fUkFURV9TRVRfQ0NLICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBaTV9SQVRFX1NFVF9PRkRNICAgICAgICAgICAgICAgICAgICAxCisKKy8qIEhUIFBUICovCisjZGVmaW5lIFpNX1BSRUFNQkxFX1RZUEVfTUlYRURfTU9ERSAgICAgICAgIDAKKyNkZWZpbmUgWk1fUFJFQU1CTEVfVFlQRV9HUkVFTl9GSUVMRCAgICAgICAgMQorCisvKiBIVCBiYW5kd2lkdGggKi8KKyNkZWZpbmUgWk1fQkFORFdJRFRIXzIwTUhaICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBaTV9CQU5EV0lEVEhfNDBNSFogICAgICAgICAgICAgICAgICAxCisKKy8qIE1JQyBzdGF0dXMgKi8KKyNkZWZpbmUgWk1fTUlDX1NVQ0NFU1MgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBaTV9NSUNfRkFJTFVSRSAgICAgICAgICAgICAgICAgICAgICAxCisKKy8qIElDViBzdGF0dXMgKi8KKyNkZWZpbmUgWk1fSUNWX1NVQ0NFU1MgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBaTV9JQ1ZfRkFJTFVSRSAgICAgICAgICAgICAgICAgICAgICAxCisKKy8qIGRlZmluaXRpb24gY2hlY2sgKi8KKyNpZiAoWk1fTUFYX0FQX1NVUFBPUlQgPiA4KQorZGVmaW5pdGlvbiBlcnJvciwgWk1fTUFYX0FQX1NVUFBPUlQgPiA4CisjZW5kaWYKKyNpZiAoWk1fTUFYX0FQX1NVUFBPUlQgPiA2NCkKK2RlZmluaXRpb24gZXJyb3IsIFpNX01BWF9TVEFfU1VQUE9SVCA+IDY0CisjZW5kaWYKKworLyogIFRyYW5zbWlzc2lvbiBSYXRlIGluZm9ybWF0aW9uICovCisKKy8qIFdMQU4gZnJhbWUgZm9ybWF0ICovCisjZGVmaW5lIFpNX1BMQ1BfSEVBREVSX1NJWkUgICAgICAgICAgNQorI2RlZmluZSBaTV9FVEhFUk5FVF9BRERSRVNTX0xFTkdUSCAgIDYKKyNkZWZpbmUgWk1fVElNRVNUQU1QX09GRlNFVCAgICAgICAgICAwCisjZGVmaW5lIFpNX0JFQUNPTl9JTlRFUlZBTF9PRkZTRVQgICAgOAorI2RlZmluZSBaTV9DQVBBQklMSVRZX09GRlNFVCAgICAgICAgMTAKKworLyogUmVhc29uIENvZGUgKi8KKy8qIEFuIHVuc29saWNpdGVkIG5vdGlmaWNhdGlvbiBtYW5hZ2VtZW50IGZyYW1lIG9mICAgICAgICovCisvKiB0eXBlIERpc2Fzc29jYXRpb24gb3IgRGVhdXRoZW50aWNhdGlvbiB3YXMgZ2VuZXJhdGVkLiAqLworI2lmZGVmIFpNX1JFQVNPTl9DT0RFCisjZGVmaW5lIFpNX1dMQU5fUkVBU09OX0NPREVfVU5TUEVDSUZJRUQgICAxCisjZGVmaW5lIFpNX1dMQU5fRlJBTUVfRElTQVNPQ19ERUFVVEhfUkVBU09OX0NPREUgIDI0CisjZW5kaWYKKworc3RydWN0IHpzV2xhbk1hbmFnZW1lbnRGcmFtZUhlYWRlcgoreworICAgIC8vdThfdCAgICAgIHBsY3BIZHJbWk1fUExDUF9IRUFERVJfU0laRV07CisgICAgdThfdCAgICAgICAgZnJhbWVDdHJsWzJdOworICAgIHU4X3QgICAgICAgIGR1cmF0aW9uWzJdOworICAgIHU4X3QgICAgICAgIGRhW1pNX0VUSEVSTkVUX0FERFJFU1NfTEVOR1RIXTsKKyAgICB1OF90ICAgICAgICBzYVtaTV9FVEhFUk5FVF9BRERSRVNTX0xFTkdUSF07CisgICAgdThfdCAgICAgICAgYnNzaWRbWk1fRVRIRVJORVRfQUREUkVTU19MRU5HVEhdOworICAgIHU4X3QgICAgICAgIHNlcUN0cmxbMl07CisgICAgdThfdCAgICAgICAgYm9keVsxXTsKK307CisKK3N0cnVjdCB6c1dsYW5Qcm9iZVJzcEZyYW1lSGVhZGVyCit7CisgICAgLy91OF90ICAgICAgcGxjcEhkcltaTV9QTENQX0hFQURFUl9TSVpFXTsKKyAgICB1OF90ICAgICAgICBmcmFtZUN0cmxbMl07CisgICAgdThfdCAgICAgICAgZHVyYXRpb25bMl07CisgICAgdThfdCAgICAgICAgZGFbWk1fRVRIRVJORVRfQUREUkVTU19MRU5HVEhdOworICAgIHU4X3QgICAgICAgIHNhW1pNX0VUSEVSTkVUX0FERFJFU1NfTEVOR1RIXTsKKyAgICB1OF90ICAgICAgICBic3NpZFtaTV9FVEhFUk5FVF9BRERSRVNTX0xFTkdUSF07CisgICAgdThfdCAgICAgICAgc2VxQ3RybFsyXTsKKyAgICB1OF90ICAgICAgICB0aW1lU3RhbXBbOF07CisgICAgdThfdCAgICAgICAgYmVhY29uSW50ZXJ2YWxbMl07CisgICAgdThfdCAgICAgICAgY2FwYWJpbGl0eVsyXTsKKyAgICB1OF90ICAgICAgICBzc2lkW1pNX01BWF9TU0lEX0xFTkdUSCArIDJdOyAgIC8vIEVJRCgxKSArIExlbmd0aCgxKSArIFNTSUQoMzIpCit9IDsKKworI2RlZmluZSB6c1dsYW5CZWFjb25GcmFtZUhlYWRlciB6c1dsYW5Qcm9iZVJzcEZyYW1lSGVhZGVyCisKK3N0cnVjdCB6c1dsYW5BdXRoRnJhbWVIZWFkZXIKK3sKKyAgICAvL3U4X3QgICAgICBwbGNwSGRyW1pNX1BMQ1BfSEVBREVSX1NJWkVdOworICAgIHU4X3QgICAgICAgIGZyYW1lQ3RybFsyXTsKKyAgICB1OF90ICAgICAgICBkdXJhdGlvblsyXTsKKyAgICB1OF90ICAgICAgICBhZGRyZXNzMVtaTV9FVEhFUk5FVF9BRERSRVNTX0xFTkdUSF07CisgICAgdThfdCAgICAgICAgYWRkcmVzczJbWk1fRVRIRVJORVRfQUREUkVTU19MRU5HVEhdOworICAgIHU4X3QgICAgICAgIGFkZHJlc3MzW1pNX0VUSEVSTkVUX0FERFJFU1NfTEVOR1RIXTsKKyAgICB1OF90ICAgICAgICBzZXFDdHJsWzJdOworICAgIHUxNl90ICAgICAgIGFsZ287CisgICAgdTE2X3QgICAgICAgc2VxOworICAgIHUxNl90ICAgICAgIHN0YXR1czsKKyAgICB1OF90ICAgICAgICBjaGFsbGVuZ2VUZXh0WzI1NV07IC8vIHRoZSBmaXJzdCAyIGJ5dGVzIGFyZSBpbmZvcm1hdGlvbiBJRCwgbGVuZ3RoCit9OworCitzdHJ1Y3QgenNXbGFuQXNzb0ZyYW1lSGVhZGVyCit7CisgICAgLy91OF90ICAgICAgcGxjcEhkcltQTENQX0hFQURFUl9TSVpFXTsKKyAgICB1OF90ICAgICAgICBmcmFtZUN0cmxbMl07CisgICAgdThfdCAgICAgICAgZHVyYXRpb25bMl07CisgICAgdThfdCAgICAgICAgYWRkcmVzczFbWk1fRVRIRVJORVRfQUREUkVTU19MRU5HVEhdOworICAgIHU4X3QgICAgICAgIGFkZHJlc3MyW1pNX0VUSEVSTkVUX0FERFJFU1NfTEVOR1RIXTsKKyAgICB1OF90ICAgICAgICBhZGRyZXNzM1taTV9FVEhFUk5FVF9BRERSRVNTX0xFTkdUSF07CisgICAgdThfdCAgICAgICAgc2VxQ3RybFsyXTsKKyAgICB1OF90ICAgICAgICBjYXBhYmlsaXR5WzJdOworICAgIHUxNl90ICAgICAgIHN0YXR1czsKKyAgICB1MTZfdCAgICAgICBhaWQ7CisgICAgLy91OF90ICAgICAgICBzdXBwb3J0ZWRSYXRlc1sxMF07Cit9OworCitzdHJ1Y3QgenNGcmFnCit7CisgICAgemJ1Zl90KiBidWZbMTZdOworICAgIHUxNl90IGJ1ZlR5cGVbMTZdOworICAgIHUxNl90IHNlcVsxNl07CisgICAgdThfdCBmbGFnWzE2XTsKKworfTsKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gSGFyZHdhcmUgcmVsYXRlZCBkZWZpbml0aW9ucworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorI2RlZmluZSBaTV9NQUNfUkVHX0JBU0UgICAgICAgICAgICAgICAgICAgICAgICAgMHgxYzMwMDAKKworI2RlZmluZSBaTV9NQUNfUkVHX0FUSU1fV0lORE9XICAgICAgICAgICAgICAgICAgKFpNX01BQ19SRUdfQkFTRSArIDB4NTFDKQorI2RlZmluZSBaTV9NQUNfUkVHX0JDTl9QRVJJT0QgICAgICAgICAgICAgICAgICAgKFpNX01BQ19SRUdfQkFTRSArIDB4NTIwKQorI2RlZmluZSBaTV9NQUNfUkVHX1BSRVRCVFQgICAgICAgICAgICAgICAgICAgICAgKFpNX01BQ19SRUdfQkFTRSArIDB4NTI0KQorCisjZGVmaW5lIFpNX01BQ19SRUdfTUFDX0FERFJfTCAgICAgICAgICAgICAgICAgICAoWk1fTUFDX1JFR19CQVNFICsgMHg2MTApCisjZGVmaW5lIFpNX01BQ19SRUdfTUFDX0FERFJfSCAgICAgICAgICAgICAgICAgICAoWk1fTUFDX1JFR19CQVNFICsgMHg2MTQpCisKKyNkZWZpbmUgWk1fTUFDX1JFR19HUk9VUF9IQVNIX1RCTF9MICAgICAgICAgICAgIChaTV9NQUNfUkVHX0JBU0UgKyAweDYyNCkKKyNkZWZpbmUgWk1fTUFDX1JFR19HUk9VUF9IQVNIX1RCTF9IICAgICAgICAgICAgIChaTV9NQUNfUkVHX0JBU0UgKyAweDYyOCkKKworI2RlZmluZSBaTV9NQUNfUkVHX0JBU0lDX1JBVEUgICAgICAgICAgICAgICAgICAgKFpNX01BQ19SRUdfQkFTRSArIDB4NjMwKQorI2RlZmluZSBaTV9NQUNfUkVHX01BTkRBVE9SWV9SQVRFICAgICAgICAgICAgICAgKFpNX01BQ19SRUdfQkFTRSArIDB4NjM0KQorI2RlZmluZSBaTV9NQUNfUkVHX1JUU19DVFNfUkFURSAgICAgICAgICAgICAgICAgKFpNX01BQ19SRUdfQkFTRSArIDB4NjM4KQorI2RlZmluZSBaTV9NQUNfUkVHX0JBQ0tPRkZfUFJPVEVDVCAgICAgICAgICAgICAgKFpNX01BQ19SRUdfQkFTRSArIDB4NjNjKQorI2RlZmluZSBaTV9NQUNfUkVHX1JYX1RIUkVTSE9MRCAgICAgICAgICAgICAgICAgKFpNX01BQ19SRUdfQkFTRSArIDB4NjQwKQorI2RlZmluZSBaTV9NQUNfUkVHX1JYX1BFX0RFTEFZICAgICAgICAgICAgICAgICAgKFpNX01BQ19SRUdfQkFTRSArIDB4NjRDKQorCisjZGVmaW5lIFpNX01BQ19SRUdfRFlOQU1JQ19TSUZTX0FDSyAgICAgICAgICAgICAoWk1fTUFDX1JFR19CQVNFICsgMHg2NTgpCisjZGVmaW5lIFpNX01BQ19SRUdfU05JRkZFUiAgICAgICAgICAgICAgICAgICAgICAoWk1fTUFDX1JFR19CQVNFICsgMHg2NzQpCisjZGVmaW5lIFpNX01BQ19SRUdfVFhfVU5ERVJSVU4JCSAgICAgICAgICAgIChaTV9NQUNfUkVHX0JBU0UgKyAweDY4OCkKKyNkZWZpbmUgWk1fTUFDX1JFR19SWF9UT1RBTAkJCSAgICAgICAgICAgIChaTV9NQUNfUkVHX0JBU0UgKyAweDZBMCkKKyNkZWZpbmUgWk1fTUFDX1JFR19SWF9DUkMzMgkJCSAgICAgICAgICAgIChaTV9NQUNfUkVHX0JBU0UgKyAweDZBNCkKKyNkZWZpbmUgWk1fTUFDX1JFR19SWF9DUkMxNgkJCSAgICAgICAgICAgIChaTV9NQUNfUkVHX0JBU0UgKyAweDZBOCkKKyNkZWZpbmUgWk1fTUFDX1JFR19SWF9FUlJfVU5JCQkgICAgICAgICAgICAoWk1fTUFDX1JFR19CQVNFICsgMHg2QUMpCisjZGVmaW5lIFpNX01BQ19SRUdfUlhfT1ZFUlJVTgkJICAgICAgICAgICAgKFpNX01BQ19SRUdfQkFTRSArIDB4NkIwKQorI2RlZmluZSBaTV9NQUNfUkVHX1JYX0VSUl9NVUwJCSAgICAgICAgICAgIChaTV9NQUNfUkVHX0JBU0UgKyAweDZCQykKKyNkZWZpbmUgWk1fTUFDX1JFR19UWF9SRVRSWQkJCSAgICAgICAgICAgIChaTV9NQUNfUkVHX0JBU0UgKyAweDZDQykKKyNkZWZpbmUgWk1fTUFDX1JFR19UWF9UT1RBTAkJCSAgICAgICAgICAgIChaTV9NQUNfUkVHX0JBU0UgKyAweDZGNCkKKworCisjZGVmaW5lIFpNX01BQ19SRUdfQUNLX0VYVEVOU0lPTiAgICAgICAgICAgICAgICAoWk1fTUFDX1JFR19CQVNFICsgMHg2OTApCisjZGVmaW5lIFpNX01BQ19SRUdfRUlGU19BTkRfU0lGUyAgICAgICAgICAgICAgICAoWk1fTUFDX1JFR19CQVNFICsgMHg2OTgpCisKKyNkZWZpbmUgWk1fTUFDX1JFR19TTE9UX1RJTUUgICAgICAgICAgICAgICAgICAgIChaTV9NQUNfUkVHX0JBU0UgKyAweDZGMCkKKworI2RlZmluZSBaTV9NQUNfUkVHX1JPTExfQ0FMTF9UQkxfTCAgICAgICAgICAgICAgKFpNX01BQ19SRUdfQkFTRSArIDB4NzA0KQorI2RlZmluZSBaTV9NQUNfUkVHX1JPTExfQ0FMTF9UQkxfSCAgICAgICAgICAgICAgKFpNX01BQ19SRUdfQkFTRSArIDB4NzA4KQorCisjZGVmaW5lIFpNX01BQ19SRUdfQUMwX0NXICAgICAgICAgICAgICAgICAgICAgICAoWk1fTUFDX1JFR19CQVNFICsgMHhCMDApCisjZGVmaW5lIFpNX01BQ19SRUdfQUMxX0NXICAgICAgICAgICAgICAgICAgICAgICAoWk1fTUFDX1JFR19CQVNFICsgMHhCMDQpCisjZGVmaW5lIFpNX01BQ19SRUdfQUMyX0NXICAgICAgICAgICAgICAgICAgICAgICAoWk1fTUFDX1JFR19CQVNFICsgMHhCMDgpCisjZGVmaW5lIFpNX01BQ19SRUdfQUMzX0NXICAgICAgICAgICAgICAgICAgICAgICAoWk1fTUFDX1JFR19CQVNFICsgMHhCMEMpCisjZGVmaW5lIFpNX01BQ19SRUdfQUM0X0NXICAgICAgICAgICAgICAgICAgICAgICAoWk1fTUFDX1JFR19CQVNFICsgMHhCMTApCisjZGVmaW5lIFpNX01BQ19SRUdfQUMxX0FDMF9BSUZTICAgICAgICAgICAgICAgICAoWk1fTUFDX1JFR19CQVNFICsgMHhCMTQpCisjZGVmaW5lIFpNX01BQ19SRUdfQUMzX0FDMl9BSUZTICAgICAgICAgICAgICAgICAoWk1fTUFDX1JFR19CQVNFICsgMHhCMTgpCisKKyNkZWZpbmUgWk1fTUFDX1JFR19SRVRSWV9NQVggICAgICAgICAgICAgICAgICAgIChaTV9NQUNfUkVHX0JBU0UgKyAweEIyOCkKKworI2RlZmluZSBaTV9NQUNfUkVHX1RYT1BfTk9UX0VOT1VHSF9JTkRJQ0FUSU9OICAgKFpNX01BQ19SRUdfQkFTRSArIDB4QjMwKQorCisjZGVmaW5lIFpNX01BQ19SRUdfQUMxX0FDMF9UWE9QICAgICAgICAgICAgICAgICAoWk1fTUFDX1JFR19CQVNFICsgMHhCNDQpCisjZGVmaW5lIFpNX01BQ19SRUdfQUMzX0FDMl9UWE9QICAgICAgICAgICAgICAgICAoWk1fTUFDX1JFR19CQVNFICsgMHhCNDgpCisKKyNkZWZpbmUgWk1fTUFDX1JFR19BQ0tfVEFCTEUgICAgICAgICAgICAgICAgICAgIChaTV9NQUNfUkVHX0JBU0UgKyAweEMwMCkKKworI2RlZmluZSBaTV9NQUNfUkVHX0JDTl9BRERSICAgICAgICAgICAgICAgICAgICAgKFpNX01BQ19SRUdfQkFTRSArIDB4RDg0KQorI2RlZmluZSBaTV9NQUNfUkVHX0JDTl9MRU5HVEggICAgICAgICAgICAgICAgICAgKFpNX01BQ19SRUdfQkFTRSArIDB4RDg4KQorCisjZGVmaW5lIFpNX01BQ19SRUdfQkNOX1BMQ1AgICAgICAgICAgICAgICAgICAgICAoWk1fTUFDX1JFR19CQVNFICsgMHhEOTApCisjZGVmaW5lIFpNX01BQ19SRUdfQkNOX0NUUkwgICAgICAgICAgICAgICAgICAgICAoWk1fTUFDX1JFR19CQVNFICsgMHhEOTQpCisKKyNkZWZpbmUgWk1fTUFDX1JFR19CQ05fSFQxICAgICAgICAgICAgICAgICAgICAgIChaTV9NQUNfUkVHX0JBU0UgKyAweERBMCkKKyNkZWZpbmUgWk1fTUFDX1JFR19CQ05fSFQyICAgICAgICAgICAgICAgICAgICAgIChaTV9NQUNfUkVHX0JBU0UgKyAweERBNCkKKworCisjZGVmaW5lIFpNX1JYX1NUQVRVU19JU19NSUNfRkFJTChyeFN0YXR1cykgcnhTdGF0dXMtPlRhaWwuRGF0YS5FcnJvckluZGljYXRpb24gJiBaTV9CSVRfNgorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyNpZmRlZiBaTV9FTkFCTEVfTkFUSVZFX1dJRkkKKyNkZWZpbmUgWk1fODAyMTFfRlJBTUVfSEVBREVSX0xFTiAgICAgICAgICAgMjQKKyNkZWZpbmUgWk1fODAyMTFfRlJBTUVfVFlQRV9PRkZTRVQgICAgICAgICAgMzAgICAgLy8gWk1fODAyMTFfRlJBTUVfSEVBREVSX0xFTiArIFNOQVAKKyNkZWZpbmUgWk1fODAyMTFfRlJBTUVfSVBfT0ZGU0VUICAgICAgICAgICAgMzIgICAgLy8gWk1fODAyMTFfRlJBTUVfSEVBREVSX0xFTiArIFNOQVAgKyBUWVBFCisjZWxzZQorI2RlZmluZSBaTV84MDIxMV9GUkFNRV9IRUFERVJfTEVOICAgICAgICAgICAxNAorI2RlZmluZSBaTV84MDIxMV9GUkFNRV9UWVBFX09GRlNFVCAgICAgICAgICAxMiAgICAvLyBaTV84MDIxMV9GUkFNRV9IRUFERVJfTEVOICsgU05BUAorI2RlZmluZSBaTV84MDIxMV9GUkFNRV9JUF9PRkZTRVQgICAgICAgICAgICAxNCAgICAvLyBaTV84MDIxMV9GUkFNRV9IRUFERVJfTEVOICsgU05BUCArIFRZUEUKKyNlbmRpZgorCisjZGVmaW5lIFpNX0JTU19JTkZPX1ZBTElEX0JJVCAgICAgIDB4MDEKKyNkZWZpbmUgWk1fQlNTX0lORk9fVVBEQVRFRF9CSVQgICAgMHgwMgorCisKKworCisKKyNkZWZpbmUgWk1fRVJST1JfSU5ESUNBVElPTl9SWF9USU1FT1VUICAgICAgMHgwMQorI2RlZmluZSBaTV9FUlJPUl9JTkRJQ0FUSU9OX09WRVJSVU4gICAgICAgICAweDAyCisjZGVmaW5lIFpNX0VSUk9SX0lORElDQVRJT05fREVDUllQVF9FUlJPUiAgIDB4MDQKKyNkZWZpbmUgWk1fRVJST1JfSU5ESUNBVElPTl9DUkMzMl9FUlJPUiAgICAgMHgwOAorI2RlZmluZSBaTV9FUlJPUl9JTkRJQ0FUSU9OX0FERFJfTk9UX01BVENIICAweDEwCisjZGVmaW5lIFpNX0VSUk9SX0lORElDQVRJT05fQ1JDMTZfRVJST1IgICAgIDB4MjAKKyNkZWZpbmUgWk1fRVJST1JfSU5ESUNBVElPTl9NSUNfRVJST1IgICAgICAgMHg0MAorCisjZGVmaW5lIFpNX1JYTUFDX1NUQVRVU19NT0RfVFlQRV9DQ0sgICAgICAgIDB4MDAKKyNkZWZpbmUgWk1fUlhNQUNfU1RBVFVTX01PRF9UWVBFX09GRE0gICAgICAgMHgwMQorI2RlZmluZSBaTV9SWE1BQ19TVEFUVVNfTU9EX1RZUEVfSFRfT0ZETSAgICAweDAyCisjZGVmaW5lIFpNX1JYTUFDX1NUQVRVU19NT0RfVFlQRV9ETF9PRkRNICAgIDB4MDMKKyNkZWZpbmUgWk1fUlhNQUNfU1RBVFVTX1RPVEFMX0VSUk9SICAgICAgICAgMHg4MAorCisKKworCisKKyNkZWZpbmUgWk1fTUFYX0xFRF9OVU1CRVIgICAgICAgMgorCisjZGVmaW5lIFpNX0xFRF9ESVNBQkxFX01PREUgICAgIDB4MAorI2RlZmluZSBaTV9MRURfTElOS19NT0RFICAgICAgICAweDEKKyNkZWZpbmUgWk1fTEVEX0xJTktfVFJfTU9ERSAgICAgMHgyCisjZGVmaW5lIFpNX0xFRF9UUl9PTl9NT0RFICAgICAgIDB4MworI2RlZmluZSBaTV9MRURfVFJfT0ZGX01PREUgICAgICAweDQKKworI2RlZmluZSBaTV9MRURfQ1RSTF9GTEFHX0FMUEhBICAgICAgMHgxCisKK3N0cnVjdCB6c0xlZFN0cnVjdAoreworICAgIHUzMl90ICAgY291bnRlcjsKKyAgICB1MzJfdCAgIGNvdW50ZXIxMDBtczsKKyAgICB1MTZfdCAgIGxlZExpbmtTdGF0ZTsKKyAgICB1MTZfdCAgIGxlZE1vZGVbWk1fTUFYX0xFRF9OVU1CRVJdOworICAgIHUzMl90ICAgdHhUcmFmZmljOworICAgIHUzMl90ICAgcnhUcmFmZmljOworICAgIHU4X3QgICAgTEVEQ3RybFR5cGU7CisgICAgdThfdCAgICBMRURDdHJsRmxhZzsgICAgICAgICAvLyBDb250cm9sIEZsYWcgZm9yIHZlbmRvcnMKKyAgICB1OF90ICAgIExFREN0cmxGbGFnRnJvbVJlZzsgIC8vIENvbnRyb2wgRmxhZyBmb3IgdmVuZG9ycyBpbiByZWdpc3RyeQorfTsKKworCisvL0hBTCsgY2FwYWJpbGl0eSBiaXRzIGRlZmluaXRpb24KKyNkZWZpbmUgWk1fSFBfQ0FQXzExTiAgICAgICAgICAgICAgICAgICAweDEKKyNkZWZpbmUgWk1fSFBfQ0FQXzExTl9PTkVfVFhfU1RSRUFNICAgICAweDIKKyNkZWZpbmUgWk1fSFBfQ0FQXzJHICAgICAgICAgICAgICAgICAgICAweDQKKyNkZWZpbmUgWk1fSFBfQ0FQXzVHICAgICAgICAgICAgICAgICAgICAweDgKKworI2VuZGlmIC8qICNpZm5kZWYgX1dMQU5fSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDU0OWQwOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL0tjb25maWcKQEAgLTAsMCArMSwzMiBAQAorY29uZmlnIE9UVVMKKwl0cmlzdGF0ZSAiQXRoZXJvcyBPVFVTIDgwMi4xMW4gVVNCIHdpcmVsZXNzIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBVU0IgJiYgV0xBTl84MDIxMSAmJiBNQUM4MDIxMQorCWRlZmF1bHQgTgorCS0tLWhlbHAtLS0KKwkgIEVuYWJsZSBzdXBwb3J0IGZvciBBdGhlcm9zIDgwMi4xMW4gVVNCIGhhcmR3YXJlOgorCSAgICAqIFVCODEgLSAyeDIgMi40IEdIegorCSAgICAqIFVCODIgLSAyeDIgMi40IEdIeiBhbmQgNSBHSHoKKwkgICAgKiBVQjgzIC0gMXgyIDIuNCBHSHoKKworCSAgVGhpcyBpbmNsdWRlcyB0aGUgZm9sbG93aW5nIGRldmljZXMgY3VycmVudGx5IG9uIHRoZSBtYXJrZXQ6CisJICBEbGluayBEV0EtMTYwQTEsIE5ldGdlYXIgV05EQTMxMDAgYW5kIFdOMTExdjIsIFRQLUxpbmsKKwkgIFRMLVdOODIxTiwgYW5kIEFWTSBGUklUWiFXTEFOIE4gVVNCIFN0aWNrLgorCisJICBUaGlzIGRyaXZlciByZXF1aXJlcyBpdHMgb3duIHN1cHBsaWNhbnQgZHJpdmVyIGZvcgorCSAgd3BhX3N1cHBsaWNhbnQgMC40LjguIEZvciB5b3VyIGNvbnZlbmllbmNlIHlvdSBjYW4gZmluZCB0aGUKKwkgIHRhcmJhbGwgaGVyZToKKworCSAgaHR0cDovL3d3dy5rZXJuZWwub3JnL3B1Yi9saW51eC9rZXJuZWwvcGVvcGxlL21jZ3JvZi9vdHVzL3dwYV9zdXBwbGljYW50LTAuNC44X290dXMudGFyLmJ6MgorCisJICBCZWZvcmUgY29tcGlsaW5nIHdwYV9zdXBwbGljYW50LCBlbnN1cmUgeW91ciAuY29uZmlnIGhhcyBhdAorCSAgbGVhc3QgdGhlIGZvbGxvd2luZzoKKwkJQ09ORklHX1dJUkVMRVNTX0VYVEVOU0lPTj15CisJCUNPTkZJR19FQVBfV1NDPXkKKwkJQ09ORklHX1dTQ19JRT15CisJCUNPTkZJR19EUklWRVJfV0VYVD15CisJCUNPTkZJR19EUklWRVJfT1RVUz15CisKKwkgIEFmdGVyIGEgc3VjY2Vzc2Z1bCBjb21waWxlLCB5b3UgY2FuIHVzZSB0aGUgQXRoZXJvcyBkZXZpY2UgYXMKKwkgIHNob3duIGluIHRoZSBleGFtcGxlOgorCSAgJCB3cGFfc3VwcGxpY2FudCAtRG90dXMgLWkgPGF0aGVyb3MgZGV2aWNlIGZyb20gaWZjb25maWc+IC1jIC9wYXRoL3RvL3dwYV9zdXBwbGljYW50LmNvbmYgLWQKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZWJjYzVjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvTWFrZWZpbGUKQEAgLTAsMCArMSw2NyBAQAorb2JqLSQoQ09ORklHX09UVVMpCSs9IGFydXNiX2xueC5vCisKK0VYVFJBX0NGTEFHUyArPSAtREFNQUMKK0VYVFJBX0NGTEFHUyArPSAtREdDQ0sKK0VYVFJBX0NGTEFHUyArPSAtRE9GRE0KK0VYVFJBX0NGTEFHUyArPSAtRFRYUV9JTl9JU1IKK0VYVFJBX0NGTEFHUyArPSAtRFdMQU5fSE9TVElGPTAgIzA6VVNCLCAxOlBDSQorCisjVGVzdCBNb2RlCitFWFRSQV9DRkxBR1MgKz0gLURaTV9VU0JfU1RSRUFNX01PREU9MQorRVhUUkFfQ0ZMQUdTICs9IC1EWk1fVVNCX1RYX1NUUkVBTV9NT0RFPTAKK0VYVFJBX0NGTEFHUyArPSAtRFpNX1BDSV9ETUFfVEVTVD0wCitFWFRSQV9DRkxBR1MgKz0gLURaTV9MQVJHRVBBWUxPQURfVEVTVD0wCitFWFRSQV9DRkxBR1MgKz0gLURaTV9GV19MT09QX0JBQ0s9MAorRVhUUkFfQ0ZMQUdTICs9IC1EWk1fTElOVVhfVFBDPTEKKyNFWFRSQV9DRkxBR1MgKz0gLURaTV9ET05UX0NPUFlfUlhfQlVGRkVSCisKK0VYVFJBX0NGTEFHUyArPSAtRFpNX0hPU1RBUERfU1VQUE9SVAorI0VYVFJBX0NGTEFHUyArPSAtRGZUWF9HQUlOX09GRE09MAorI0VYVFJBX0NGTEFHUyArPSAtRFpNX0NPTkZJR19CSUdfRU5ESUFOIC1EQklHX0VORElBTgorRVhUUkFfQ0ZMQUdTICs9IC1EWk1fSEFMUExVU19MT0NLCitFWFRSQV9DRkxBR1MgKz0gLURaTV9PVFVTX0xJTlVYX1BIQVNFXzIKKworYXJ1c2JfbG54LW9ianMgOj0gXAorCXVzYmRydi5vIFwKKwl6ZHVzYi5vIFwKKwlpb2N0bC5vIFwKKwl3cmFwX2J1Zi5vIFwKKwl3cmFwX21lbS5vIFwKKwl3cmFwX2V2Lm8gXAorCXdyYXBfdXNiLm8gXAorCXdyYXBfcGt0Lm8gXAorCXdyYXBfZGJnLm8gXAorCXdyYXBfbWlzLm8gXAorCXdyYXBfc2VjLm8gXAorCXd3cmFwLm8gXAorCTgwMjExY29yZS9jY21kLm8gXAorCTgwMjExY29yZS9jaGIubyBcCisJODAyMTFjb3JlL2Npbml0Lm8gXAorCTgwMjExY29yZS9jbW0ubyBcCisJODAyMTFjb3JlL2NtbWFwLm8gXAorCTgwMjExY29yZS9jbW1zdGEubyBcCisJODAyMTFjb3JlL2NmdW5jLm8gXAorCTgwMjExY29yZS9jb2lkLm8gXAorCTgwMjExY29yZS9jdGtpcC5vIFwKKwk4MDIxMWNvcmUvY3R4cngubyBcCisJODAyMTFjb3JlL2NpYy5vIFwKKwk4MDIxMWNvcmUvY3BzbWdyLm8gXAorCTgwMjExY29yZS9jc2Nhbm1nci5vIFwKKwk4MDIxMWNvcmUvcmF0ZWN0cmwubyBcCisJODAyMTFjb3JlL2xlZG1nci5vIFwKKwk4MDIxMWNvcmUvYW1zZHUubyBcCisJODAyMTFjb3JlL2N3bS5vIFwKKwk4MDIxMWNvcmUvY2FnZy5vIFwKKwk4MDIxMWNvcmUvcXVldWUubyBcCisJODAyMTFjb3JlL2ZyZXFjdHJsLm8gXAorCTgwMjExY29yZS9jd2VwLm8gXAorCWhhbC9ocHJ3Lm8gXAorCWhhbC9ocG1haW4ubyBcCisJaGFsL2hwdXNiLm8gXAorCWhhbC9ocHJlZy5vIFwKKwloYWwvaHBmd3Vpbml0Lm8gXAorCWhhbC9ocGZ3YnUubyBcCisJaGFsL2hwZncyLm8gXAorCWhhbC9ocERLZnd1Lm8gXAorCWhhbC9ocGZ3c3BpdS5vIFwKKwloYWwvaHBhbmkubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvVE9ETyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL1RPRE8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTkxMjI5MwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL1RPRE8KQEAgLTAsMCArMSw5IEBACitUT0RPOgorCS0gY2hlY2twYXRjaC5wbCBjbGVhbnVwcworCS0gc3BhcnNlIGNsZWFudXBzCisJLSBwb3J0IHRvIGluLWtlcm5lbCA4MDIxMSBzdGFjaworCS0gcHJvcGVyIG5ldHdvcmsgZGV2ZWxvcGVyIG1haW50YWluZXIKKworUGxlYXNlIHNlbmQgYW55IHBhdGNoZXMgdG8gR3JlZyBLcm9haC1IYXJ0bWFuIDxncmVnQGtyb2FoLmNvbT4gYW5kCitMdWlzIFJvZHJpZ3VleiA8THVpcy5Sb2RyaWd1ZXpAQXRoZXJvcy5jb20+IGFuZCB0aGUKK290dXMtZGV2ZWxAbGlzdHMubWFkd2lmaS1wcm9qZWN0Lm9yZyBtYWlsaW5nIGxpc3QuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb3R1cy9hcGRiZy5jIGIvZHJpdmVycy9zdGFnaW5nL290dXMvYXBkYmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kM2UyZjYyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvYXBkYmcuYwpAQCAtMCwwICsxLDQ1NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNy0yMDA4IEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZHVsZSBOYW1lIDogYXBkYmcuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQWJzdHJhY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBEZWJ1ZyB0b29scyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTk9URVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBOb25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPG5ldC9pZi5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKworI2luY2x1ZGUgPGxpbnV4L3NvY2tpb3MuaD4KKworI2RlZmluZSBaTV9JT0NUTF9SRUdfUkVBRCAgICAgICAgICAgMHgwMQorI2RlZmluZSBaTV9JT0NUTF9SRUdfV1JJVEUgICAgICAgICAgMHgwMgorI2RlZmluZSBaTV9JT0NUTF9NRU1fRFVNUCAgICAgICAgICAgMHgwMworI2RlZmluZSBaTV9JT0NUTF9SRUdfRFVNUCAgICAgICAgICAgMHgwNQorI2RlZmluZSBaTV9JT0NUTF9UWERfRFVNUCAgICAgICAgICAgMHgwNgorI2RlZmluZSBaTV9JT0NUTF9SWERfRFVNUCAgICAgICAgICAgMHgwNworI2RlZmluZSBaTV9JT0NUTF9NRU1fUkVBRCAgICAgICAgICAgMHgwQgorI2RlZmluZSBaTV9JT0NUTF9NRU1fV1JJVEUgICAgICAgICAgMHgwQworI2RlZmluZSBaTV9JT0NUTF9ETUFfVEVTVCAgICAgICAgICAgMHgxMAorI2RlZmluZSBaTV9JT0NUTF9SRUdfVEVTVCAgICAgICAgICAgMHgxMQorI2RlZmluZSBaTV9JT0NUTF9URVNUICAgICAgICAgICAgICAgMHg4MAorI2RlZmluZSBaTV9JT0NUTF9UQUxMWSAgICAgICAgICAgICAgMHg4MSAvL0NXWWFuZygrKQorI2RlZmluZSBaTV9JT0NUTF9SVFMgICAgICAgICAgICAgICAgMHhBMAorI2RlZmluZSBaTV9JT0NUTF9NSVhfTU9ERSAgICAgICAgICAgMHhBMQorI2RlZmluZSBaTV9JT0NUTF9GUkFHICAgICAgICAgICAgICAgMHhBMgorI2RlZmluZSBaTV9JT0NUTF9TQ0FOICAgICAgICAgICAgICAgMHhBMworI2RlZmluZSBaTV9JT0NUTF9LRVkgICAgICAgICAgICAgICAgMHhBNAorI2RlZmluZSBaTV9JT0NUTF9SQVRFICAgICAgICAgICAgICAgMHhBNQorI2RlZmluZSBaTV9JT0NUTF9FTkNSWVBUSU9OX01PREUgICAgMHhBNgorI2RlZmluZSBaTV9JT0NUTF9HRVRfVFhDTlQgICAgICAgICAgMHhBNworI2RlZmluZSBaTV9JT0NUTF9HRVRfREVBR0dfQ05UICAgICAgMHhBOAorI2RlZmluZSBaTV9JT0NUTF9EVVJBVElPTl9NT0RFICAgICAgMHhBOQorI2RlZmluZSBaTV9JT0NUTF9TRVRfQUVTX0tFWSAgICAgICAgMHhBQQorI2RlZmluZSBaTV9JT0NUTF9TRVRfQUVTX01PREUgICAgICAgMHhBQgorI2RlZmluZSBaTV9JT0NUTF9TSUdOQUxfU1RSRU5HVEggICAgMHhBQyAvL0NXWWFuZygrKQorI2RlZmluZSBaTV9JT0NUTF9TSUdOQUxfUVVBTElUWSAgICAgMHhBRCAvL0NXWWFuZygrKQorI2RlZmluZSBaTV9JT0NUTF9TRVRfUElCU1NfTU9ERSAgICAgMHhBRQorI2RlZmluZQlaREFQSU9DVEwgICAgICAgICAgICAgICAgICAgU0lPQ0RFVlBSSVZBVEUKKworc3RydWN0IHpkYXBfaW9jdGwgeworCXVuc2lnbmVkIHNob3J0IGNtZDsgICAgICAgICAgICAgICAgLyogQ29tbWFuZCB0byBydW4gKi8KKwl1bnNpZ25lZCBpbnQgICBhZGRyOyAgICAgICAgICAgICAgICAvKiBMZW5ndGggb2YgdGhlIGRhdGEgYnVmZmVyICovCisJdW5zaWduZWQgaW50ICAgdmFsdWU7ICAgICAgICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgZGF0YSBidWZmZXIgKi8KKwl1bnNpZ25lZCBjaGFyIGRhdGFbMHgxMDBdOworfTsKKworLyogRGVjbGFyYXRpb24gb2YgbWFjcm8gYW5kIGZ1bmN0aW9uIGZvciBoYW5kbGluZyBXRVAgS2V5cyAqLworCisjaWYgMAorCisjZGVmaW5lIFNLSVBfRUxFTSB7IFwKKyAgICB3aGlsZShpc3hkaWdpdCgqcCkpIFwKKyAgICAgICAgcCsrOyBcCit9CisKKyNkZWZpbmUgU0tJUF9ERUxJTUVURVIgeyBcCisgICAgaWYoKnAgPT0gJzonIHx8ICpwID09ICcgJykgXAorICAgICAgICBwKys7IFwKK30KKworI2VuZGlmCisKK2NoYXIgaGV4KGNoYXIpOwordW5zaWduZWQgY2hhciBhc2N0b2hleChjaGFyICpzdHIpOworCitjaGFyICpwcmduYW1lOworCitpbnQgc2V0X2lvY3RsKGludCBzb2NrLCBzdHJ1Y3QgaWZyZXEgKnJlcSkKK3sKKyAgICBpZiAoaW9jdGwoc29jaywgWkRBUElPQ1RMLCByZXEpIDwgMCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBpb2N0bChTSU9DR0lGTUFQKTogJXNcbiIsCisgICAgICAgICAgICAgICAgcHJnbmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCisKK2ludCByZWFkX3JlZyhpbnQgc29jaywgc3RydWN0IGlmcmVxICpyZXEpCit7CisgICAgc3RydWN0IHpkYXBfaW9jdGwgKnpkcmVxID0gMDsKKworICAgIGlmICghc2V0X2lvY3RsKHNvY2ssIHJlcSkpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIC8vemRyZXEgPSAoc3RydWN0IHpkYXBfaW9jdGwgKilyZXEtPmlmcl9kYXRhOworICAgIC8vcHJpbnRmKCAicmVnID0gJTR4LCB2YWx1ZSA9ICU0eFxuIiwgemRyZXEtPmFkZHIsIHpkcmVxLT52YWx1ZSk7CisKKyAgICByZXR1cm4gMDsKK30KKworCitpbnQgcmVhZF9tZW0oaW50IHNvY2ssIHN0cnVjdCBpZnJlcSAqcmVxKQoreworICAgIHN0cnVjdCB6ZGFwX2lvY3RsICp6ZHJlcSA9IDA7CisgICAgaW50IGk7CisKKyAgICBpZiAoIXNldF9pb2N0bChzb2NrLCByZXEpKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICAvKnpkcmVxID0gKHN0cnVjdCB6ZGFwX2lvY3RsICopcmVxLT5pZnJfZGF0YTsKKyAgICBwcmludGYoICJkdW1wIG1lbSBmcm9tICV4LCBsZW5ndGggPSAleFxuIiwgemRyZXEtPmFkZHIsIHpkcmVxLT52YWx1ZSk7CisKKyAgICBmb3IgKGk9MDsgaTx6ZHJlcS0+dmFsdWU7IGkrKykgeworICAgICAgICBwcmludGYoIiUwMngiLCB6ZHJlcS0+ZGF0YVtpXSk7CisgICAgICAgIHByaW50ZigiICIpOworCisgICAgICAgIGlmICgoaT4wKSAmJiAoKGkrMSklMTYgPT0gMCkpCisgICAgICAgICAgICBwcmludGYoIlxuIik7CisgICAgfSovCisKKyAgICByZXR1cm4gMDsKK30KKworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgICAgaW50IHNvY2s7CisgICAgaW50IGFkZHIsIHZhbHVlOworICAgIHN0cnVjdCBpZnJlcSByZXE7CisgICAgY2hhciAqYWN0aW9uID0gTlVMTDsKKyAgICBzdHJ1Y3QgemRhcF9pb2N0bCB6ZHJlcTsKKworICAgIHByZ25hbWUgPSBhcmd2WzBdOworCisgICAgaWYgKGFyZ2MgPCAzKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCIlczogdXNhZ2UgaXMgXCIlcyA8aWZuYW1lPiA8b3BlcmF0aW9uPiBbPGFkZHJlc3M+XSBbPHZhbHVlPl1cIlxuIiwKKyAgICAgICAgICAgICAgICBwcmduYW1lLCBwcmduYW1lKTsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsInZhbGlkIG9wZXJhdGlvbjogcmVhZCwgd3JpdGUsIG1lbSwgcmVnLFxuIik7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCIgICAgICAgICAgICAgICA6IHR4ZCwgcnhkLCBybWVtLCB3bWVtXG4iKTsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsIiAgICAgICAgICAgICAgIDogZG1hdCwgcmVndCwgdGVzdFxuIik7CisKKyAgICAgICAgZnByaW50ZihzdGRlcnIsIiAgICBzY2FuLCBDaGFubmVsIFNjYW5cbiIpOworICAgICAgICBmcHJpbnRmKHN0ZGVyciwiICAgIHJ0cyA8ZGVjaW1hbD4sIFNldCBSVFMgVGhyZXNob2xkXG4iKTsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsIiAgICBmcmFnIDxkZWNpbWFsPiwgU2V0IEZyYWdtZW50IFRocmVzaG9sZFxuIik7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCIgICAgcmF0ZSA8MC0yOD4sIDA6QVVUTywgMS00OkNDSywgNS0xMjpPRkRNLCAxMy0yODpIVFxuIik7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCIgICAgVEJEIG1peCA8MCBvciAxPiwgU2V0IDEgdG8gZW5hYmxlIG1peGVkIG1vZGVcbiIpOworICAgICAgICBmcHJpbnRmKHN0ZGVyciwiICAgIGVuYywgPDAtMz4sIDA9Pk9QRU4sIDE9PldFUDY0LCAyPT5XRVAxMjgsIDM9PldFUDI1NlxuIik7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCIgICAgc2tleSA8a2V5PiwgU2V0IFdFUCBrZXlcbiIpOworICAgICAgICBmcHJpbnRmKHN0ZGVyciwiICAgIHR4Y250LCBHZXQgVHhRIENudFxuIik7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCIgICAgZGFnY250LCBHZXQgRGVhZ2dyZWdhdGUgQ250XG4iKTsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsIiAgICBkdXJtb2RlIDxtb2RlPiwgU2V0IER1cmF0aW9uIE1vZGUgMD0+SFcsIDE9PlNXXG4iKTsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsIiAgICBhZXNrZXkgPHVzZXI+IDxrZXk+XG4iKTsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsIiAgICBhZXNtb2RlIDxtb2RlPlxuIik7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCIgICAgd2xhbm1vZGUgPDAsMT4gMDpTdGF0aW9uIG1vZGUsIDE6UElCU1MgbW9kZVxuIik7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCIgICAgdGFsIDwwLDE+LCBHZXQgQ3VycmVudCBUYWxseSBJbmZvLCAwPT5yZWFkLCAxPT5yZWFkIGFuZCByZXNldFxuIik7CisKKyAgICAgICAgZXhpdCgxKTsKKyAgICB9CisKKyAgICBzdHJjcHkocmVxLmlmcl9uYW1lLCBhcmd2WzFdKTsKKyAgICB6ZHJlcS5hZGRyID0gMDsKKyAgICB6ZHJlcS52YWx1ZSA9IDA7CisKKyAgICAvKiBhIHNpbGx5IHJhdyBzb2NrZXQganVzdCBmb3IgaW9jdGwoKWxpbmcgaXQgKi8KKyAgICBzb2NrID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfUkFXLCBJUFBST1RPX1JBVyk7CisgICAgaWYgKHNvY2sgPCAwKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IHNvY2tldCgpOiAlc1xuIiwgYXJndlswXSwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICB9CisKKyAgICBpZiAoYXJnYyA+PSA0KQorICAgIHsKKyAgICAgICAgc3NjYW5mKGFyZ3ZbM10sICIleCIsICZhZGRyKTsKKyAgICB9CisKKyAgICBpZiAoYXJnYyA+PSA1KQorICAgIHsKKyAgICAgICAgc3NjYW5mKGFyZ3ZbNF0sICIleCIsICZ2YWx1ZSk7CisgICAgfQorCisgICAgemRyZXEuYWRkciA9IGFkZHI7CisgICAgemRyZXEudmFsdWUgPSB2YWx1ZTsKKworICAgIGlmICghc3RyY21wKGFyZ3ZbMl0sICJyZWFkIikpCisgICAgeworICAgICAgICB6ZHJlcS5jbWQgPSBaTV9JT0NUTF9SRUdfUkVBRDsKKyAgICB9CisgICAgZWxzZSBpZiAoIXN0cmNtcChhcmd2WzJdLCAibWVtIikpCisgICAgeworICAgICAgICB6ZHJlcS5jbWQgPSBaTV9JT0NUTF9NRU1fRFVNUDsKKyAgICB9CisgICAgZWxzZSBpZiAoIXN0cmNtcChhcmd2WzJdLCAid3JpdGUiKSkKKyAgICB7CisgICAgICAgIHpkcmVxLmNtZCA9IFpNX0lPQ1RMX1JFR19XUklURTsKKyAgICB9CisgICAgZWxzZSBpZiAoIXN0cmNtcChhcmd2WzJdLCAicmVnIikpCisgICAgeworICAgICAgICB6ZHJlcS5jbWQgPSBaTV9JT0NUTF9SRUdfRFVNUDsKKyAgICB9CisgICAgZWxzZSBpZiAoIXN0cmNtcChhcmd2WzJdLCAidHhkIikpCisgICAgeworICAgICAgICB6ZHJlcS5jbWQgPSBaTV9JT0NUTF9UWERfRFVNUDsKKyAgICB9CisgICAgZWxzZSBpZiAoIXN0cmNtcChhcmd2WzJdLCAicnhkIikpCisgICAgeworICAgICAgICB6ZHJlcS5jbWQgPSBaTV9JT0NUTF9SWERfRFVNUDsKKyAgICB9CisgICAgZWxzZSBpZiAoIXN0cmNtcChhcmd2WzJdLCAicm1lbSIpKQorICAgIHsKKyAgICAgICAgemRyZXEuY21kID0gWk1fSU9DVExfTUVNX1JFQUQ7CisgICAgfQorICAgIGVsc2UgaWYgKCFzdHJjbXAoYXJndlsyXSwgIndtZW0iKSkKKyAgICB7CisgICAgICAgIHpkcmVxLmNtZCA9IFpNX0lPQ1RMX01FTV9XUklURTsKKyAgICB9CisgICAgZWxzZSBpZiAoIXN0cmNtcChhcmd2WzJdLCAiZG1hdCIpKQorICAgIHsKKyAgICAgICAgemRyZXEuY21kID0gWk1fSU9DVExfRE1BX1RFU1Q7CisgICAgfQorICAgIGVsc2UgaWYgKCFzdHJjbXAoYXJndlsyXSwgInJlZ3QiKSkKKyAgICB7CisgICAgICAgIHpkcmVxLmNtZCA9IFpNX0lPQ1RMX1JFR19URVNUOworICAgIH0KKyAgICBlbHNlIGlmICghc3RyY21wKGFyZ3ZbMl0sICJ0ZXN0IikpCisgICAgeworICAgICAgICB6ZHJlcS5jbWQgPSBaTV9JT0NUTF9URVNUOworICAgIH0KKyAgICBlbHNlIGlmICghc3RyY21wKGFyZ3ZbMl0sICJ0YWwiKSkKKyAgICB7CisgICAgICAgIHNzY2FuZihhcmd2WzNdLCAiJWQiLCAmYWRkcik7CisgICAgICAgIHpkcmVxLmFkZHIgPSBhZGRyOworICAgICAgICB6ZHJlcS5jbWQgPSBaTV9JT0NUTF9UQUxMWTsKKyAgICB9CisgICAgZWxzZSBpZiAoIXN0cmNtcChhcmd2WzJdLCAicnRzIikpCisgICAgeworICAgICAgICBzc2NhbmYoYXJndlszXSwgIiVkIiwgJmFkZHIpOworICAgICAgICB6ZHJlcS5hZGRyID0gYWRkcjsKKyAgICAgICAgemRyZXEuY21kID0gWk1fSU9DVExfUlRTOworICAgIH0KKyAgICBlbHNlIGlmICghc3RyY21wKGFyZ3ZbMl0sICJtaXgiKSkKKyAgICB7CisgICAgICAgIHpkcmVxLmNtZCA9IFpNX0lPQ1RMX01JWF9NT0RFOworICAgIH0KKyAgICBlbHNlIGlmICghc3RyY21wKGFyZ3ZbMl0sICJmcmFnIikpCisgICAgeworICAgICAgICBzc2NhbmYoYXJndlszXSwgIiVkIiwgJmFkZHIpOworICAgICAgICB6ZHJlcS5hZGRyID0gYWRkcjsKKyAgICAgICAgemRyZXEuY21kID0gWk1fSU9DVExfRlJBRzsKKyAgICB9CisgICAgZWxzZSBpZiAoIXN0cmNtcChhcmd2WzJdLCAic2NhbiIpKQorICAgIHsKKyAgICAgICAgemRyZXEuY21kID0gWk1fSU9DVExfU0NBTjsKKyAgICB9CisgICAgZWxzZSBpZiAoIXN0cmNtcChhcmd2WzJdLCAic2tleSIpKQorICAgIHsKKyAgICAgICAgemRyZXEuY21kID0gWk1fSU9DVExfS0VZOworCisgICAgICAgIGlmIChhcmdjID49IDQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgdGVtcFsyOV07CisgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgIGludCBrZXlMZW47CisgICAgICAgICAgICBpbnQgZW5jVHlwZTsKKworICAgICAgICAgICAga2V5TGVuID0gc3RybGVuKGFyZ3ZbM10pOworCisgICAgICAgICAgICBpZiAoa2V5TGVuID09IDEwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNzY2FuZihhcmd2WzNdLCAiJTAyeCUwMnglMDJ4JTAyeCUwMngiLCAmdGVtcFswXSwgJnRlbXBbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAmdGVtcFsyXSwgJnRlbXBbM10sICZ0ZW1wWzRdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGtleUxlbiA9PSAyNikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzc2NhbmYoYXJndlszXSwgIiUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMngiLAorICAgICAgICAgICAgICAgICAgICAgICAgJnRlbXBbMF0sICZ0ZW1wWzFdLCAmdGVtcFsyXSwgJnRlbXBbM10sICZ0ZW1wWzRdLAorICAgICAgICAgICAgICAgICAgICAgICAgJnRlbXBbNV0sICZ0ZW1wWzZdLCAmdGVtcFs3XSwgJnRlbXBbOF0sICZ0ZW1wWzldLAorICAgICAgICAgICAgICAgICAgICAgICAgICZ0ZW1wWzEwXSwgJnRlbXBbMTFdLCAmdGVtcFsxMl0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoa2V5TGVuID09IDU4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNzY2FuZihhcmd2WzNdLCAiJTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMngiLAorICAgICAgICAgICAgICAgICAgICAgICAgJnRlbXBbMF0sICZ0ZW1wWzFdLCAmdGVtcFsyXSwgJnRlbXBbM10sICZ0ZW1wWzRdLAorICAgICAgICAgICAgICAgICAgICAgICAgJnRlbXBbNV0sICZ0ZW1wWzZdLCAmdGVtcFs3XSwgJnRlbXBbOF0sICZ0ZW1wWzldLAorICAgICAgICAgICAgICAgICAgICAgICAgJnRlbXBbMTBdLCAmdGVtcFsxMV0sICZ0ZW1wWzEyXSwgJnRlbXBbMTNdLCAmdGVtcFsxNF0sCisgICAgICAgICAgICAgICAgICAgICAgICAmdGVtcFsxNV0sICZ0ZW1wWzE2XSwgJnRlbXBbMTddLCAmdGVtcFsxOF0sICZ0ZW1wWzE5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICZ0ZW1wWzIwXSwgJnRlbXBbMjFdLCAmdGVtcFsyMl0sICZ0ZW1wWzIzXSwgJnRlbXBbMjRdLAorICAgICAgICAgICAgICAgICAgICAgICAgJnRlbXBbMjVdLCAmdGVtcFsyNl0sICZ0ZW1wWzI3XSwgJnRlbXBbMjhdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkludmFsaWQga2V5IGxlbmd0aFxuIik7CisgICAgICAgICAgICAgICAgZXhpdCgxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHpkcmVxLmFkZHIgPSBrZXlMZW4vMjsKKworICAgICAgICAgICAgZm9yKGk9MDsgaTx6ZHJlcS5hZGRyOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgemRyZXEuZGF0YVtpXSA9IHRlbXBbaV07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwcmludGYoIkVycm9yIDogS2V5IHJlcXVpcmVkIVxuIik7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoIXN0cmNtcChhcmd2WzJdLCAicmF0ZSIpKQorICAgIHsKKyAgICAgICAgc3NjYW5mKGFyZ3ZbM10sICIlZCIsICZhZGRyKTsKKworICAgICAgICBpZiAoYWRkciA+IDI4KQorICAgICAgICB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkludmFsaWQgcmF0ZSwgcmFuZ2U6MH4yOFxuIik7CisgICAgICAgICAgICBleGl0KDEpOworICAgICAgICB9CisgICAgICAgIHpkcmVxLmFkZHIgPSBhZGRyOworICAgICAgICB6ZHJlcS5jbWQgPSBaTV9JT0NUTF9SQVRFOworICAgIH0KKyAgICBlbHNlIGlmICghc3RyY21wKGFyZ3ZbMl0sICJlbmMiKSkKKyAgICB7CisgICAgICAgIHNzY2FuZihhcmd2WzNdLCAiJWQiLCAmYWRkcik7CisKKyAgICAgICAgaWYgKGFkZHIgPiAzKQorICAgICAgICB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkludmFsaWQgZW5jcnlwdGlvbiBtb2RlLCByYW5nZTowfjNcbiIpOworICAgICAgICAgICAgZXhpdCgxKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChhZGRyID09IDIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFkZHIgPSA1OworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGFkZHIgPT0gMykKKyAgICAgICAgeworICAgICAgICAgICAgYWRkciA9IDY7CisgICAgICAgIH0KKworICAgICAgICB6ZHJlcS5hZGRyID0gYWRkcjsKKyAgICAgICAgemRyZXEuY21kID0gWk1fSU9DVExfRU5DUllQVElPTl9NT0RFOworICAgIH0KKyAgICBlbHNlIGlmICghc3RyY21wKGFyZ3ZbMl0sICJ0eGNudCIpKQorICAgIHsKKyAgICAgICAgemRyZXEuY21kID0gWk1fSU9DVExfR0VUX1RYQ05UOworICAgIH0KKyAgICBlbHNlIGlmICghc3RyY21wKGFyZ3ZbMl0sICJkYWdjbnQiKSkKKyAgICB7CisgICAgICAgIHNzY2FuZihhcmd2WzNdLCAiJWQiLCAmYWRkcik7CisKKyAgICAgICAgaWYgKGFkZHIgIT0gMCAmJiBhZGRyICE9IDEpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiVGhlIHZhbHVlIHNob3VsZCBiZSAwIG9yIDFcbiIpOworICAgICAgICAgICAgZXhpdCgwKTsKKyAgICAgICAgfQorCisgICAgICAgIHpkcmVxLmFkZHIgPSBhZGRyOworICAgICAgICB6ZHJlcS5jbWQgPSBaTV9JT0NUTF9HRVRfREVBR0dfQ05UOworICAgIH0KKyAgICBlbHNlIGlmICghc3RyY21wKGFyZ3ZbMl0sICJkdXJtb2RlIikpCisgICAgeworICAgICAgICBzc2NhbmYoYXJndlszXSwgIiVkIiwgJmFkZHIpOworCisgICAgICAgIGlmIChhZGRyICE9IDAgJiYgYWRkciAhPSAxKQorICAgICAgICB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlRoZSBEdXJhdGlvbiBtb2RlIHNob3VsZCBiZSAwIG9yIDFcbiIpOworICAgICAgICAgICAgZXhpdCgwKTsKKyAgICAgICAgfQorCisgICAgICAgIHpkcmVxLmFkZHIgPSBhZGRyOworICAgICAgICB6ZHJlcS5jbWQgPSBaTV9JT0NUTF9EVVJBVElPTl9NT0RFOworICAgIH0KKyAgICBlbHNlIGlmICghc3RyY21wKGFyZ3ZbMl0sICJhZXNrZXkiKSkKKyAgICB7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgdGVtcFsxNl07CisgICAgICAgIGludCBpOworCisgICAgICAgIHNzY2FuZihhcmd2WzNdLCAiJWQiLCAmYWRkcik7CisKKyAgICAgICAgc3NjYW5mKGFyZ3ZbNF0sICIlMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4IiwgJnRlbXBbMF0sICZ0ZW1wWzFdLCAmdGVtcFsyXSwgJnRlbXBbM10sICZ0ZW1wWzRdLCAmdGVtcFs1XSwgJnRlbXBbNl0sICZ0ZW1wWzddLCAmdGVtcFs4XSwgJnRlbXBbOV0sICZ0ZW1wWzEwXSwgJnRlbXBbMTFdLCAmdGVtcFsxMl0sICZ0ZW1wWzEzXSwgJnRlbXBbMTRdLCAmdGVtcFsxNV0pOworCisgICAgICAgIGZvcihpID0gMDsgaSA8IDE2OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHpkcmVxLmRhdGFbaV0gPSB0ZW1wW2ldOworICAgICAgICB9CisKKyAgICAgICAgemRyZXEuYWRkciA9IGFkZHI7CisgICAgICAgIHpkcmVxLmNtZCA9IFpNX0lPQ1RMX1NFVF9BRVNfS0VZOworICAgIH0KKyAgICBlbHNlIGlmICghc3RyY21wKGFyZ3ZbMl0sICJhZXNtb2RlIikpCisgICAgeworICAgICAgICBzc2NhbmYoYXJndlszXSwgIiVkIiwgJmFkZHIpOworCisgICAgICAgIHpkcmVxLmFkZHIgPSBhZGRyOworICAgICAgICB6ZHJlcS5jbWQgPSBaTV9JT0NUTF9TRVRfQUVTX01PREU7CisgICAgfQorICAgIGVsc2UgaWYgKCFzdHJjbXAoYXJndlsyXSwgIndsYW5tb2RlIikpCisgICAgeworICAgICAgICBzc2NhbmYoYXJndlszXSwgIiVkIiwgJmFkZHIpOworCisgICAgICAgIHpkcmVxLmFkZHIgPSBhZGRyOworICAgICAgICB6ZHJlcS5jbWQgPSBaTV9JT0NUTF9TRVRfUElCU1NfTU9ERTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwkgICAgZnByaW50ZihzdGRlcnIsICJlcnJvciBhY3Rpb25cbiIpOworICAgICAgICBleGl0KDEpOworICAgIH0KKworICAgIHJlcS5pZnJfZGF0YSA9IChjaGFyICopJnpkcmVxOworICAgIHNldF9pb2N0bChzb2NrLCAmcmVxKTsKKworZmFpbDoKKyAgICBleGl0KDApOworfQorCit1bnNpZ25lZCBjaGFyIGFzY3RvaGV4KGNoYXIgKnN0cikKK3sKKyAgICB1bnNpZ25lZCBjaGFyIHZhbHVlOworCisgICAgdmFsdWUgPSBoZXgoKnN0cikgJiAweDBmOworICAgIHZhbHVlID0gdmFsdWUgPDwgNDsKKyAgICBzdHIrKzsKKyAgICB2YWx1ZSB8PSBoZXgoKnN0cikgJiAweDBmOworCisgICAgcmV0dXJuIHZhbHVlOworfQorCitjaGFyIGhleChjaGFyIHYpCit7CisgICAgaWYoaXNkaWdpdCh2KSkKKyAgICAgICAgcmV0dXJuIHYgLSAnMCc7CisgICAgZWxzZSBpZihpc3hkaWdpdCh2KSkKKyAgICAgICAgcmV0dXJuICh0b2xvd2VyKHYpIC0gJ2EnICsgMTApOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzL2F0aHJfY29tbW9uLmggYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy9hdGhyX2NvbW1vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyMGY3OGEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy9hdGhyX2NvbW1vbi5oCkBAIC0wLDAgKzEsMTQxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggQXRoZXJvcyBDb21tdW5pY2F0aW9ucyBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKy8qICBNb2R1bGUgTmFtZSA6IGF0aHJfY29tbW9uLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEFic3RyYWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgV1BBIHJlbGF0ZWQgZnVuY3Rpb24gYW5kIGRhdGEgc3RydWN0dXJlIGRlZmluaXRpb25zLiAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE5PVEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgUGxhdGZvcm0gZGVwZW5kZW50LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfQVRIUl9DT01NT05fSAorI2RlZmluZSBfQVRIUl9DT01NT05fSAorCisjZGVmaW5lIFpEX0lPQ1RMX1dQQQkJCShTSU9DREVWUFJJVkFURSArIDEpCisjZGVmaW5lIFpEX0lPQ1RMX1BBUkFNCQkJKFNJT0NERVZQUklWQVRFICsgMikKKyNkZWZpbmUgWkRfSU9DVExfR0VUV1BBSUUJCShTSU9DREVWUFJJVkFURSArIDMpCisjZGVmaW5lIFpEX1BBUkFNX1JPQU1JTkcJCTB4MDAwMQorI2RlZmluZSBaRF9QQVJBTV9QUklWQUNZCQkweDAwMDIKKyNkZWZpbmUgWkRfUEFSQU1fV1BBCQkJMHgwMDAzCisjZGVmaW5lIFpEX1BBUkFNX0NPVU5URVJNRUFTVVJFUwkweDAwMDQKKyNkZWZpbmUgWkRfUEFSQU1fRFJPUFVORU5DUllQVEVECTB4MDAwNQorI2RlZmluZSBaRF9QQVJBTV9BVVRIX0FMR1MJCTB4MDAwNgorCisjZGVmaW5lIFpEX0NNRF9TRVRfRU5DUllQVF9LRVkJCTB4MDAwMQorI2RlZmluZSBaRF9DTURfU0VUX01MTUUJCQkweDAwMDIKKyNkZWZpbmUgWkRfQ01EX1NDQU5fUkVRCQkJMHgwMDAzCisjZGVmaW5lIFpEX0NNRF9TRVRfR0VORVJJQ19FTEVNRU5UCTB4MDAwNAorI2RlZmluZSBaRF9DTURfR0VUX1RTQwkJCTB4MDAwNQorCisjZGVmaW5lIFpEX0ZMQUdfU0VUX1RYX0tFWSAgICAgICAgICAgICAgMHgwMDAxCisKKyNkZWZpbmUgWkRfR0VORVJJQ19FTEVNRU5UX0hEUl9MRU4gXAorKChpbnQpICgmKChzdHJ1Y3QgYXRocl93bGFuX3BhcmFtICopIDApLT51LmdlbmVyaWNfZWxlbS5kYXRhKSkKKworI2RlZmluZSBaRF9DUllQVF9BTEdfTkFNRV9MRU4JCTE2CisjZGVmaW5lIFpEX01BWF9LRVlfU0laRQkJCTMyCisjZGVmaW5lIFpEX01BWF9HRU5FUklDX1NJWkUJCTY0CisKKyNkZWZpbmUgSUVFRTgwMjExX0FERFJfTEVOCQk2CisjZGVmaW5lIElFRUU4MDIxMV9NQVhfSUVfU0laRQkJMjU2CisKKyNpZmRlZiBaTV9FTkFMQkVfV0FQSQorI2RlZmluZSBaTV9DTURfV0FQSV9TRVRXQVBJICAgICAgICAgICAgIDB4MDAwMQorI2RlZmluZSBaTV9DTURfV0FQSV9HRVRXQVBJICAgICAgICAgICAgIDB4MDAwMgorI2RlZmluZSBaTV9DTURfV0FQSV9TRVRLRVkgICAgICAgICAgICAgIDB4MDAwMworI2RlZmluZSBaTV9DTURfV0FQSV9HRVRLRVkgICAgICAgICAgICAgIDB4MDAwNAorI2RlZmluZSBaTV9DTURfV0FQSV9SRUtFWSAgICAgICAgICAgICAgIDB4MDAwNQorCisjZGVmaW5lIFpNX1dBUElfV0FJX1JFUVVFU1QgICAgICAgICAgICAgMHgwMGYxCisjZGVmaW5lIFpNX1dBUElfVU5JQ0FTVF9SRUtFWSAgICAgICAgICAgMHgwMGYyCisjZGVmaW5lIFpNX1dBUElfU1RBX0FHSU5HICAgICAgICAgICAgICAgMHgwMGYzCisjZGVmaW5lIFpNX1dBUElfTVVMVElfUkVLRVkgICAgICAgICAgICAgMHgwMGY0CisKKyNkZWZpbmUgWk1fV0FQSV9LRVlfU0laRSAgICAgICAgICAgICAgICAzMgorI2RlZmluZSBaTV9XQVBJX0lWX0xFTiAgICAgICAgICAgICAgICAgIDE2CisjZW5kaWYgLy9aTV9FTkFMQkVfV0FQSQorLyogc3RydWN0dXJlIGRlZmluaXRpb24gKi8KKworc3RydWN0IGF0aHJfd2xhbl9wYXJhbSB7CisJdTMyIGNtZDsKKwl1OCBzdGFfYWRkcltFVEhfQUxFTl07CisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJdTggYWxnW1pEX0NSWVBUX0FMR19OQU1FX0xFTl07CisJCQl1MzIgZmxhZ3M7CisJCQl1MzIgZXJyOworCQkJdTggaWR4OworCQkJdTggc2VxWzhdOyAvKiBzZXF1ZW5jZSBjb3VudGVyIChzZXQ6IFJYLCBnZXQ6IFRYKSAqLworCQkJdTE2IGtleV9sZW47CisJCQl1OCBrZXlbWkRfTUFYX0tFWV9TSVpFXTsKKwkJfSBjcnlwdDsKKwkJc3RydWN0IHsKKwkJCXUzMiBmbGFnc19hbmQ7CisJCQl1MzIgZmxhZ3Nfb3I7CisJCX0gc2V0X2ZsYWdzX3N0YTsKKwkJc3RydWN0IHsKKwkJCXU4IGxlbjsKKwkJCXU4IGRhdGFbWkRfTUFYX0dFTkVSSUNfU0laRV07CisJCX0gZ2VuZXJpY19lbGVtOworCQlzdHJ1Y3QgeworI2RlZmluZSBNTE1FX1NUQV9ERUFVVEggMAorI2RlZmluZSBNTE1FX1NUQV9ESVNBU1NPQyAxCisJCQl1MTYgY21kOworCQkJdTE2IHJlYXNvbl9jb2RlOworCQl9IG1sbWU7CisJCXN0cnVjdCB7CisJCQl1OCBzc2lkX2xlbjsKKwkJCXU4IHNzaWRbMzJdOworCQl9IHNjYW5fcmVxOworCX0gdTsKK307CisKK3N0cnVjdCBpZWVlODAyMTFyZXFfd3BhaWUgeworCXU4IHdwYV9tYWNhZGRyW0lFRUU4MDIxMV9BRERSX0xFTl07CisJdTggd3BhX2llW0lFRUU4MDIxMV9NQVhfSUVfU0laRV07Cit9OworCisjaWZkZWYgWk1fRU5BTEJFX1dBUEkKK3N0cnVjdCBhdGhyX3dhcGlfcGFyYW0geworCXUxNiBjbWQ7CisJdTE2IGxlbjsKKworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCXU4IHN0YV9hZGRyW0VUSF9BTEVOXTsKKwkJCXU4IHJlc2VydmVkOworCQkJdTgga2V5aWQ7CisJCQl1OCBrZXlbWk1fV0FQSV9LRVlfU0laRV07CisJCX0gY3J5cHQ7CisJCXN0cnVjdCB7CisgICAgICAgICAgICAgICAgICAgICAgICB1OCB3YXBpX3BvbGljeTsKKwkJfSBpbmZvOworCX0gdTsKK307CisKK3N0cnVjdCBhdGhyX3dhcGlfc3RhX2luZm8KK3sKKwl1MTYJbXNnX3R5cGU7CisJdTE2CWRhdGFsZW47CisgICAgCXU4CXN0YV9tYWNbRVRIX0FMRU5dOworCXU4CXJlc2VydmVfZGF0YVsyXTsKKyAgICAJdTgJZ3NuW1pNX1dBUElfSVZfTEVOXTsKKwl1OAl3aWVbMjU2XTsKK307CisjZW5kaWYgLy9aTV9FTkFMQkVfV0FQSQorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb3R1cy9oYWwvaHBES2Z3dS5jIGIvZHJpdmVycy9zdGFnaW5nL290dXMvaGFsL2hwREtmd3UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDRjNjJkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvaGFsL2hwREtmd3UuYwpAQCAtMCwwICsxLDgzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNy0yMDA4IEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisjaW5jbHVkZSAiLi4vODAyMTFjb3JlL2NwcmVjb21wLmgiCisKK2NvbnN0IHUzMl90IHpjREtGd0ltYWdlW10gPSB7CisweDAwMDkwMDBCLCAweDRGMjIyRkU2LCAweERFM0U3RkZDLCAweEUxMTRENzNFLAorMHgxRTEzRDQzRSwgMHgxRTRDNDcwQiwgMHgwMDA5QjAxNywgMHg5NTZFRTYwMCwKKzB4Qzg0MDYwRTIsIDB4MkYwMjhGMDMsIDB4OEZGOTM2NTIsIDB4RDQzODc2MDEsCisweDRFMEJERTM4LCAweEQ0MzgwMDA5LCAweDAwMDk0RTBCLCAweDRFMEJENDM3LAorMHg3RjA0MDAwOSwgMHhBMDM2NEYyNiwgMHg0RjIyNkVGNiwgMHg0MTBCRDEzNCwKKzB4RDQzNDAwMDksIDB4MDAwOTQ0MEIsIDB4NDUwQkQ1MzMsIDB4RDczMzAwMDksCisweEQyMzNFMUZGLCAweDI3MTI2MTFELCAweEQ0MzI1MDI5LCAweEUxRkZDQjAxLAorMHgxMjA5RTUwMSwgMHgxMjExMjIxMiwgMHhENTJGMjQ1MiwgMHhEMjJGOTc0MCwKKzB4RTcwMDI1NzIsIDB4RDQyRkQxMkUsIDB4MjI3MEQ2MkYsIDB4MjE3MkUyMDEsCisweDI2MjAyNDIwLCAweEU0RkZENjJELCAweEU2MDAyNjQxLCAweEUxMDRENTJDLAorMHg2MDYzNjY2RCwgMHg2MjZENzYwMSwgMHgzMjEyNDAwMCwgMHgwNTQ1OEZGOCwKKzB4MDAwQjRGMjYsIDB4RUFDODAwMDksIDB4REIyNjZBQUMsIDB4REQyN0RDMjYsCisweEQ4MjhERTI3LCAweDRDMEJFOTAxLCAweDREMEIwMDA5LCAweDRFMEIwMDA5LAorMHg2MEIyMDAwOSwgMHg4OTA3ODgwMSwgMHg2MjQyRDQyMywgMHg4OTAzMzJBNiwKKzB4NjA1MEQ1MjIsIDB4OEJFRTg4MDEsIDB4MkI5MkQ0MUYsIDB4MjY2ODY2NDIsCisweDQ4MEI4OUU5LCAweEQ1MUQwMDA5LCAweEFGRTRFMjAwLCAweDI3MTAyNTIwLAorMHgwMDAwMEZBMCwgMHgwMDFDMDAxQywgMHgwMDIwMEVENCwgMHgwMDAwQjM4RSwKKzB4MDAyMDJGOTAsIDB4MDAyMDEzNTYsIDB4MDAyMDJGOUMsIDB4MDAyMDJGQjQsCisweDAwMjAxMzE0LCAweDAwMjAxNDEyLCAweDAwMjAwRUY4LCAweDAwMUMzNTEwLAorMHgwMDFDMzYyNCwgMHgwMDFFMjEyQywgMHgwMDIwMkYwMCwgMHgwMDIwMkE5QywKKzB4MDAyMDJGMDgsIDB4MDAyMDJGMTQsIDB4MDAyMDJGMjAsIDB4MDAyMDJGMjIsCisweDAwMjAyRjI2LCAweDAwMUMxMDI4LCAweDAwMjAxMjIwLCAweDAwMjAyOTRDLAorMHgwMDIwMUQxMCwgMHgwMDIwMUVDOCwgMHgwMDIwMzIyMCwgMHgwMDIwMkYyNCwKKzB4MkZCNjJGOTYsIDB4MkZENjJGQzYsIDB4NEYyMjJGRTYsIDB4REU5NDdGODAsCisweDYxRTBFMDI0LCAweDBGMTRENDkzLCAweDcxMDE2MUUzLCAweEQ3OTI2MjEwLAorMHg0NzBCRTAyOCwgMHhENTkxMEYyNCwgMHgwMDA5NDUwQiwgMHg2RDAzMjAwOCwKKzB4MUYwQjhGMTEsIDB4RDQ4RkRDOEUsIDB4REQ4RjY3QzAsIDB4NjU3QzREMEIsCisweEREOEZEMThFLCAweDZCOUM2OTEwLCAweDQyMDg2MkIzLCAweDMyQjg0MjA4LAorMHgzRDJDNDIwOCwgMHhFMDI4MUZEQiwgMHhFNTgwMDRGQywgMHg2MDRDNjZFMiwKKzB4MzA1MDY1NUMsIDB4MkQ2MjhGMTMsIDB4MDFGQ0UwMjQsIDB4NjQxQ0U1MDAsCisweDYyNURERTg0LCAweDhCMDEzMjQzLCAweDAwMDlBMzlFLCAweDY3NTM2NTVELAorMHg2MDcwMzdFQywgMHgzOURDNjk1MywgMHhBRkYyNzUwMSwgMHgyMDA4ODA5NCwKKzB4RTAyNDhCMTMsIDB4RTUwMDAxRkMsIDB4QTAwOURFN0EsIDB4NjU1RDY0MUMsCisweDMyRUM2MjUzLCAweDZDNTM2QjIyLCAweDNDREM2N0IyLCAweDc1MDQxQzcxLAorMHgzMjQzNjI1RCwgMHhBMzdGOEJGMywgMHg4ODAxMkQxMCwgMHhFMDI0OEIxNiwKKzB4RTQwMDAxRkMsIDB4NjcxQzJENDAsIDB4NjI0RERFNkUsIDB4OEIwMTMyNzMsCisweDAwMDlBMzcyLCAweDZDRTM2NDRELCAweDdDMDQ2OTQzLCAweDM5RUM2QjQzLAorMHg2NTkyM0JDQywgMHg3NDA4NkRCMiwgMHgyNUQyQUZFRiwgMHg4QjE5ODgwNCwKKzB4MDFGQ0UwMjQsIDB4MkQ3MEU3MDAsIDB4MUZEODZEMUMsIDB4NjI3RERFNjEsCisweDhCMDEzMkQzLCAweDAwMDlBMzU4LCAweDZCNzM2NzdELCAweDNCRUM2MUUzLAorMHg3MTA0NjRCMiwgMHgzQzFDNkM3MywgMHg2OTQyNjVDMiwgMHgyOTU5NzcwOCwKKzB4MjQ5MkFGRUQsIDB4OEIxODg4MDUsIDB4MDFGQ0UwMjQsIDB4MkQ0MEU0MDAsCisweERFNTQ2NzFDLCAweDMyNzM2MjRELCAweEEzM0Q4QjAxLCAweDY0NEQwMDA5LAorMHg2QkUzNkQ0MywgMHg2NUQyM0RFQywgMHg2MTQzN0IwNCwgMHg2QzEyMzFCQywKKzB4NzQwODY5NTIsIDB4QUZFRDI5Q0IsIDB4ODgzMTI1OTIsIDB4REU0QThCMjAsCisweDY1RTZEQjRBLCAweDYxRTZEQzRBLCAweDY3RTJEOTRBLCAweDYyRTI3RTA0LAorMHgxRkVDN0VFOCwgMHg3RTA0NjRFMiwgMHg2RUUyMUZFRCwgMHg1QkZEMkJFMCwKKzB4NjBCMjdCMDQsIDB4QzkwMTFGQkUsIDB4NkJCMjJDMDAsIDB4MjlCMDRCMDksCisweERDNDEyRjI2LCAweDY2MTM0QzBCLCAweEUyMDA3RjA0LCAweDJEMjBBMzBDLAorMHg4QjIxODgzMCwgMHhEOTM5REUzOCwgMHhFMDY0NjVFNiwgMHg3MjA0NjJFMywKKzB4NjcyNjY2RTIsIDB4NkUyM0RDMzYsIDB4NjIyMjdFRTgsIDB4NkJFMjYxRTYsCisweDI5QjAxRkVGLCAweDdFMDQwRjE2LCAweEM5MDE2MEUyLCAweDZFRTIyQzAwLAorMHg0RTA5REMzMCwgMHgyRjI2MkNFMCwgMHhEMTMwRTA2OCwgMHgwNEZFNDEwQiwKKzB4RTIwMDdGMDQsIDB4MkQyMEEyRTgsIDB4OEIwNTg4MzMsIDB4NEUwQkRFMkMsCisweEUxMDAwMDA5LCAweDJEMTBBMkUwLCAweDg5MDE4ODI4LCAweDAwMDlBMTA2LAorMHhFMTQzREUyMCwgMHhFMDQwNjJFMSwgMHgzMjE3NjIyRCwgMHgwRkU2OEYwNCwKKzB4NjAyM0UyNDAsIDB4MjYyMTA2RkUsIDB4OEIwMTMyMTcsIDB4MDAwOUEwRUYsCisweDAyRkVFMDQwLCAweDg1MjFFNDAxLCAweDhCMDEzMDQ2LCAweDAwMDlBMEU3LAorMHhFNTAxRTA0MCwgMHgyRDUwMDdGRSwgMHg2NDcxQjJDNywgMHgwOUZFRTA0MCwKKzB4NjI5MUUxNDMsIDB4NjUyREUwNjgsIDB4OEQ2QjM1MTcsIDB4RTY0MDBGNTYsCisweDhCMjczNTYzLCAweEUwNDhFNjAwLCAweEUxMUEwRjY1LCAweDcyQzBBMDMxLAorMHgwMDExNzgwMCwgMHgwMDIwMkZCOCwgMHgwMDIwMTM1NiwgMHgwMDIwMjQ4MCwKKzB4MDAyMDJGMUEsIDB4MDAyMDJGQkMsIDB4MDAyMDEzQTIsIDB4MDAyMDJGMTksCisweDAwMjAyQjQwLCAweDAwMTE3ODA0LCAweDAwMTE3ODEwLCAweDAwMjAyRjE1LAorMHgwMDIwMkYxNiwgMHgwMDIwMkYxNywgMHgwMDIwMEI4NCwgMHgwMDIwMEJEOCwKKzB4MDAyMDBCRDQsIDB4NDEyMTYxNTMsIDB4NDEyMTQxMjEsIDB4NDEyMTQxMjEsCisweDQ1MjE0NTIxLCAweDYwNTM0NTIxLCAweDY2MDNDOTAzLCAweDBGNjVFMDQ4LAorMHhFMDA3NzExOCwgMHhFMDQ0MjIwOSwgMHg2NDFEMEYyNSwgMHg2NUYzRTA0QywKKzB4MEY0NkIzMTQsIDB4MDRGREUwNDgsIDB4MEJGREUwNDQsIDB4NjFCRDY3NEQsCisweDQxMDg0NzA4LCAweDBGMTZFMDUwLCAweEQyOTM2MDczLCAweDQyMEIwOUZFLAorMHg2QzA3RTAwRiwgMHg2MDczMjlDOSwgMHhFMDQwMEY5NiwgMHg2NUYzMEVGRSwKKzB4NkQwRDg1RTIsIDB4MDFGRUUwNTAsIDB4NjBEMzQyMEIsIDB4NjA3MzI5MEIsCisweEUwNEMwRjk2LCAweDA0RkVCMkQ5LCAweDA2RkVFMDQwLCAweDYyNjFFMDY4LAorMHgwRjU2NjUyRCwgMHgzNTYzRTY0MCwgMHhFMDAwODk0RSwgMHg2MDIzODFGOCwKKzB4NDAwOEM5MDMsIDB4NkIwMzQwMDAsIDB4RTA1NDYxMDMsIDB4RTA1ODBGQjYsCisweEVDRkZERDdELCAweDZDQ0MwRkY2LCAweDBGRDZFMDZDLCAweDREMEI2MEMzLAorMHg0MjIxNjI1MywgMHg0MjIxNDIyMSwgMHg2NDIzNDIyMSwgMHgzMjRDNDIwMCwKKzB4RTA1QzZFMDcsIDB4NDUyMTQyMDAsIDB4RTA0MDBGRTYsIDB4MEJGRTQ1MjEsCisweEM5MDM2MDUzLCAweDMwRkM0MDA4LCAweDZEMDM3QjA2LCAweDg1RjgxRjA1LAorMHg2QzJEMUZCNywgMHgxRkM2NkUwMywgMHgwRkM2RTA2MCwgMHgwNUZFRTA1OCwKKzB4NjRDM0IyQjQsIDB4MzNGQ0UzNTQsIDB4NTYzMjYyRDIsIDB4MjI2OTYxMzIsCisweDY3QjQyRDIyLCAweDQ5MEI1OTM2LCAweDIyMEI2MDdDLCAweDA1RkVFMDU4LAorMHg2NEMzMkQyMiwgMHg3RTAxQjI4OSwgMHhFNzA2NjJFRCwgMHg4RkUzMzI3MywKKzB4RTA0MDdDMDEsIDB4NjI2MTA2RkUsIDB4MDZGRUUwNDAsIDB4ODU2MTQyMDAsCisweDMwMkM3NjBDLCAweDYxMDM3MDFCLCAweDY0RjNFNTAwLCAweDc1MDFFNzA0LAorMHg2QjVENjk2NiwgMHgyNDkyM0I3MywgMHg3NDA0OEZGOSwgMHhCMjZDNjVGMywKKzB4RTA0MDY0MUQsIDB4QjIwNTA2RkUsIDB4QTFERDY0NjEsIDB4RDQ0RjAwMDksCisweEUyMDFENzRGLCAweDJEMjA0NzBCLCAweDAwMDlBMUQ2LCAweDhCMDc4ODI5LAorMHhFQzAwREU0QywgMHg2MUUyMkRDMCwgMHg2NDFEQjFENywgMHgwMDA5QTFDQywKKzB4NjIyQ0UyODEsIDB4OEIwMTMwMjAsIDB4MDAwOUExMTgsIDB4MDZGQ0UwMjgsCisweEU2ODI2MjZDLCAweDMyNjA2NjZDLCAweEEwRUU4QjAxLCAweEU2ODMwMDA5LAorMHgzMjYwNjY2QywgMHhBMERDOEIwMSwgMHhFNjkwMDAwOSwgMHgzMjYwNjY2QywKKzB4QTBEMDhCMDEsIDB4RTY5MTAwMDksIDB4MzI2MDY2NkMsIDB4QTBCOThCMDEsCisweEU2QjAwMDA5LCAweDMyNjA2NjZDLCAweEEwN0Y4QjAxLCAweEU2QkIwMDA5LAorMHgzMjYwNjY2QywgMHhFNjkyODkyMCwgMHgzMjYwNjY2QywgMHhFNDAwOEIxNCwKKzB4RUIwNEQ1MzEsIDB4NTI1MTY2NTIsIDB4OEIwNzM2MjAsIDB4NjI0RDc0MDEsCisweDhGRjczMkI3LCAweEU2MDA3NTA4LCAweDUyRkJBMDAyLCAweEU2MDE1MkZCLAorMHhFNjA0MTI2MSwgMHgyMjYwQTE4OCwgMHhEMjI5RDQyOCwgMHhENDI5NjU0MiwKKzB4MDAwOTQyMEIsIDB4MDAwOUExODAsIDB4RTEwMEU2NzAsIDB4NjAxMzM2RkMsCisweEUwMjQ4MTYyLCAweDBCRkNEMjFGLCAweDZCQkM2NzIyLCAweDI2NzI3QkZDLAorMHhFQjA0MTZCMiwgMHgwNkZFRTA3OCwgMHgzMjYzNjIxRCwgMHhBMTZCOEIwMSwKKzB4REUxRDAwMDksIDB4MzFFQzYxMUQsIDB4RDQxQzZFMTIsIDB4NDEwQkQxMTQsCisweEUwNzAwMDA5LCAweDQ1MEJENTFBLCAweEQ0MUEwNEZFLCAweDQyMEJEMjEwLAorMHhEMjE3MDAwOSwgMHg2NEUzNDIwQiwgMHhENjBERDQxNywgMHgwMDA5NDYwQiwKKzB4MDVGRUUwNzAsIDB4MDFGREUwNzQsIDB4NjExREU2MDAsIDB4NjI1MzM1MUMsCisweDMyNkM2NjZELCAweDIyRTA3NjAxLCAweDMyQjM2MjZELCAweDRFMTk4RkY3LAorMHhFMDc0NzEwNCwgMHgwRjE1QUZDRSwgMHgwMDIwMjlGOCwgMHgwMDIwMkZEQywKKzB4MDAyMDEzNTYsIDB4MDAxMTc4MDQsIDB4MDAyMDJCMTAsIDB4MDAxMTc4MDAsCisweDAwMjAxM0EyLCAweDAwMjAzMDE0LCAweDAwMTE3ODA4LCAweDAwMjAyRkY0LAorMHgwMDIwMTM5QSwgMHgwMDIwMzAwOCwgMHgwMDIwMzAxMCwgMHgwMkZDRTAyNCwKKzB4NjcyQ0UwN0MsIDB4RUMwMDBGNzYsIDB4RTA3Q0VCMDQsIDB4NjJDRDA3RkUsCisweDhCMDEzMjczLCAweDAwMDlBMTE4LCAweDZDQ0REN0I5LCAweDM1N0M2NUMzLAorMHg2MkMzNzcwNCwgMHhENEI3MzI3QywgMHg2RDUyRDdCNywgMHg2RTIyNDcwQiwKKzB4NDcwQkQ3QjYsIDB4RDRCNjY0RDMsIDB4NDIwQkQyQjMsIDB4RDJCMzAwMDksCisweDY0RTM0MjBCLCAweEQ2QjBENEIzLCAweDAwMDk0NjBCLCAweDY3RDNFNjAwLAorMHgzNzZDNjY2RCwgMHg2MjZENzYwMSwgMHgyN0UwMzJCMywgMHg0RTE5OEZGNywKKzB4N0MwOEFGRDMsIDB4NjIxMkQxQTYsIDB4MjIyODYyMkMsIDB4RDJBQThCMDQsCisweDAwMDk0MjBCLCAweDAwMDlBMDAzLCAweDQyMEJEMkE4LCAweDU2RkIwMDA5LAorMHhBMEUxRTIwMCwgMHhCMUE2MjYyMCwgMHg1NkZCMDAwOSwgMHhBMERCRTIwMCwKKzB4NTJGQjI2MjAsIDB4RTUwMEQ2OUEsIDB4NjU2MjIyNTAsIDB4NzYwNEQyQTAsCisweDYyNjIyMjUyLCAweEEwQ0ZENjlGLCAweDU2RkIyNjIwLCAweDI2MTBFMTI0LAorMHg1MjE3RDE5RCwgMHg1MjE4MTYyMSwgMHg1MjE5MTYyMiwgMHg1MjFBMTYyMywKKzB4NTUxQjE2MjQsIDB4MTY1NUUyMDAsIDB4MTY1NjU1MUMsIDB4MTY1NzU1MUQsCisweDE2NTg1NTFFLCAweDE2NTk1NTFGLCAweDExMjgxMTI3LCAweDExMkExMTI5LAorMHgxMTJDMTEyQiwgMHgxMTJFMTEyRCwgMHgxMTJGQTBBRSwgMHhENjhGRDE4RSwKKzB4NjI2MkUwNDAsIDB4NzYwNDY1MTIsIDB4MjE1MjM1MkMsIDB4NTUxMTYyNjYsCisweDExNTEzNTJDLCAweDYyNjI2NTYzLCAweDc1MDg1NjEyLCAweDExNjIzNjJDLAorMHg1NjEzNjI1MiwgMHgzNjJDNzVFQywgMHg2MjUyMTE2MywgMHg3NTEwNTYxNCwKKzB4MTE2NDM2MkMsIDB4NjI1MjY2NTMsIDB4NzYxMDU1MTUsIDB4MTE1NTM1MkMsCisweDU2MTY2MjYyLCAweDM2MkNENTdFLCAweDYyNTYxMTY2LCAweDM2MkM1NjE3LAorMHg2NjUzMTE2NywgMHg1NTE4NjI1MiwgMHgzNTJDNzYwNCwgMHg2MjY2MTE1OCwKKzB4MzUyQzU1MTksIDB4NjU2MzExNTksIDB4NTYxQTYyNjIsIDB4MzYyQzc1MDQsCisweDYyNTIxMTZBLCAweDc1MDQ1NjFCLCAweDExNkIzNjJDLCAweDU2MUM2MjU2LAorMHgxMTZDMzYyQywgMHg1NjFENjI1NiwgMHgxMTZEMzYyQywgMHg2MjUyNjY1MywKKzB4NzYwNDU1MUUsIDB4MTE1RTM1MkMsIDB4NTYxRjYyNjIsIDB4MzYyQ0Q1NjksCisweDYyNTIxMTZGLCAweDc1OTQwNjFFLCAweDAxNjYzNjJDLCAweDY2NTNFMDQ0LAorMHgwNTFFNjI1MiwgMHgzNTJDNzY0NCwgMHhFMDQ4MDE1NiwgMHgwNjFFNjI2MiwKKzB4MDE2NjM2MkMsIDB4RTA1NEQ2NjAsIDB4MDUxRTYyNjIsIDB4MzUyQzQyMjksCisweDc2MDQwMTU2LCAweEUwNTg2MjYyLCAweDQyMjkwNjFFLCAweDAxNjYzNjJDLAorMHhFMjM4NTZGQiwgMHhFMDQ0MjYyMCwgMHhFMDQ4MDIxRSwgMHg2MjEyMTYyMSwKKzB4NTUxMTE2MjIsIDB4MTY1M0UyMDAsIDB4MTY1NDU1MTIsIDB4MTY1NTU1MTUsCisweDE2NTY1NTEzLCAweDE2NTc1NTE2LCAweEUwNDAwNTFFLCAweDA1MUUxNjU4LAorMHgxNjU5RTA1MCwgMHgxNjVBNTUxNCwgMHhFMDRDMDUxRSwgMHgwNTFFMTY1QiwKKzB4MTY1Q0UwNTQsIDB4RTA1ODA1MUUsIDB4MDUxRTE2NUQsIDB4MTY1RUUwNDQsCisweEUwNDgwMTI2LCAweDExMjEyMTIyLCAweDExMjUxMTIyLCAweDExMjYxMTIzLAorMHhFMDQwMDEyNiwgMHhFMDUwMDEyNiwgMHgwMTI2MTEyNCwgMHgwMTI2RTA0QywKKzB4MDEyNkUwNTQsIDB4MDEyNkUwNTgsIDB4M0YzQzkzNTgsIDB4NkVGNjRGMjYsCisweDZDRjY2REY2LCAweDAwMEI2QkY2LCAweDRGMjI2OUY2LCAweEUyNDA2MTRELAorMHg4OTE0MzEyMywgMHgzMTI3RTIxRiwgMHg4QjA5RDczNCwgMHhENDM0NjE0RCwKKzB4RTAwMTcxRTAsIDB4NTY3MTQ0MEIsIDB4MjY1OTY1MDcsIDB4MTc2MUEwMDcsCisweEUwMDFENDJGLCAweDY2NzI0NDBCLCAweDI2NTk2NTA3LCAweDRGMjYyNzYyLAorMHgwMDA5MDAwQiwgMHg2MTRENEYyMiwgMHgzMTIzRTI0MCwgMHhFMjFGODkxMiwKKzB4RDcyNjMxMjcsIDB4NjE0RDhCMDgsIDB4NTY3MUQyMjUsIDB4NDIwQjcxRTAsCisweDI2MEJFMDAxLCAweDE3NjFBMDA2LCAweDY2NzJEMjIxLCAweEUwMDE0MjBCLAorMHgyNzYyMjYwQiwgMHgwMDBCNEYyNiwgMHhFNjQwMDAwOSwgMHg0NjI4NDYxOCwKKzB4NjI1MkQ1MUMsIDB4ODlGQzIyNjgsIDB4MDAwOTAwMEIsIDB4NDYxOEU2ODAsCisweEQ1MTg0NjI4LCAweDIyNjg2MjUyLCAweDAwMEI4OUZDLCAweEEwMDEwMDA5LAorMHg3MjAxRTIwMCwgMHg4QkZDMzI0MiwgMHgwMDA5MDAwQiwgMHgwMDAwMDA4MCwKKzB4MDAxMTc4MDQsIDB4MDAyMDJGRjQsIDB4MDAyMDEzNTYsIDB4MDAyMDEzOUEsCisweDAwMjAzMDA4LCAweDAwMjAzMDEwLCAweDAwMjAwQzM4LCAweDAwMjAwQzEyLAorMHgwMDIwMkYwMCwgMHgwMDIwMkYxNCwgMHgwMDIwMkFBNCwgMHgwMDFDMzZBMCwKKzB4MDAxQzNDQTAsIDB4MDAxQzM2RjQsIDB4MDAxQzNCODgsIDB4MDAxQzM3MDQsCisweDAwMjAyOUY4LCAweDAwMUMzNzNDLCAweDQ2MThFNjgwLCAweEQ1MkY0NjI4LAorMHgyMjY4NjI1MiwgMHgwMDBCOEJGQywgMHgyRkU2MDAwOSwgMHg3RkZDNEYyMiwKKzB4QkZGMTZFNTMsIDB4NjFFMjJGNDIsIDB4RTI4MEQ2MjksIDB4NTRFMTE2MTUsCisweDE2NDY0MjE4LCAweDQyMjg1NUUyLCAweDU3RTMxNjU3LCAweDE2Nzg2RUYyLAorMHgyNkUyMkUyQiwgMHg0RjI2N0YwNCwgMHg2RUY2QUZBOCwgMHgyRkQ2MkZDNiwKKzB4NEYyMjJGRTYsIDB4NkM1M0REMUUsIDB4NkU0M0JGRDYsIDB4MkRFMkJGOTUsCisweDAwMDlCRkQyLCAweDJDMTI1MUQ1LCAweDFDNDE1NEQ2LCAweDFDNTI1NUQ3LAorMHgxQzYzNTZEOCwgMHg2RUY2NEYyNiwgMHgwMDBCNkRGNiwgMHg2MTYzNkNGNiwKKzB4QTAwNEU2MDAsIDB4NjI1NjQxMDksIDB4MjQyMjc2MDEsIDB4MzYxMjc0MDQsCisweDAwMEI4QkY5LCAweDRGMjIwMDA5LCAweEQxMEZENDBFLCAweDAwMDk0MTBCLAorMHhENDBGRDIwRSwgMHhFNTA1NjAyMiwgMHgyMjAyQ0IyMCwgMHhENTBEMjQ1MiwKKzB4NDUwQkU3MDAsIDB4RDcwQzI0NzIsIDB4MDAwOTQ3MEIsIDB4RTYwMUQxMEIsCisweDIxNjJEMjBCLCAweDRGMjY0NjE4LCAweDIyNjIwMDBCLCAweDAwMUMzNzAwLAorMHgwMDFDMzcwQywgMHgwMDIwMzAyOCwgMHgwMDIwMTM1NiwgMHgwMDFDMzUwMCwKKzB4MDAxRDQwMDQsIDB4MDAyMDEzQ0MsIDB4MDAyMDBFRjgsIDB4MDAxRTIxMkMsCisweDAwMUMzRDMwLCAweDAwMDlBMUE5LCAweDJGRTYyRkQ2LCAweEREOEY0RjIyLAorMHhBMDA0OUVBNywgMHhENDhFMDAwOSwgMHg0MjBCRDI4RSwgMHg2MkQyNjVEMiwKKzB4OEJGODIyRTgsIDB4MDAwOUEwMDQsIDB4RDI4QUQ0OEIsIDB4NTVEMTQyMEIsCisweDIyRTg1MkQxLCAweEEwMDQ4QkY4LCAweEQ0ODgwMDA5LCAweDQyMEJEMjg1LAorMHg1MkQyNTVEMiwgMHg4QkY4MjJFOCwgMHgwMDA5QTAwNCwgMHhEMjgxRDQ4NCwKKzB4NTVEMzQyMEIsIDB4MjJFODUyRDMsIDB4QTAwNDhCRjgsIDB4RDQ4MTAwMDksCisweDQyMEJEMjdDLCAweDUyRDQ1NUQ0LCAweDhCRjgyMkU4LCAweDZFRjY0RjI2LAorMHg2REY2MDAwQiwgMHgyRkQ2MkZDNiwgMHg0RjIyMkZFNiwgMHg2RTYzNkQ3MywKKzB4NkM1M0IwMTgsIDB4NjRDMzU3RjQsIDB4QjA1NDY1RTMsIDB4QjA2QTY2RDMsCisweEIwOUEwMDA5LCAweEIwOUUwMDA5LCAweEIwQTIwMDA5LCAweEIwQkUwMDA5LAorMHhCMEMxMDAwOSwgMHhCMTI0MDAwOSwgMHg0RjI2MDAwOSwgMHg2REY2NkVGNiwKKzB4NkNGNkEwMjMsIDB4MzQxMkQxNkMsIDB4RDY2QzA1MjksIDB4MjY1MEQ3NkMsCisweDI3NDIwMDBCLCAweDAwMDlBMDE0LCAweDJGRDYyRkM2LCAweDRGMjIyRkU2LAorMHg2RTYzNkQ3MywgMHg2QzUzQkZFRSwgMHg2NEMzNTdGNCwgMHhCMDJBNjVFMywKKzB4QjEwNjY2RDMsIDB4NEYyNjAwMDksIDB4NkRGNjZFRjYsIDB4NkNGNkEwMDUsCisweEU2MDNEMjYwLCAweDAwMEI0NjE4LCAweEQyNUUyMjYyLCAweDAwMEJFNjAwLAorMHg0RjIyMjI2MiwgMHhFNDBBQkY3RSwgMHgwMDA5QkY3RSwgMHhFMTA0RDI1QSwKKzB4RTUwMDQxMTgsIDB4MjIxMkU0MEEsIDB4MjI1MkJGNzQsIDB4NjA3MkQ3NTcsCisweDRGMjZDQjIwLCAweDI3MDIwMDBCLCAweEQxNTU0RjIyLCAweEU0MDA0MTBCLAorMHg0NTJCRDU1NCwgMHgyRkU2NEYyNiwgMHg2RTYzRDE1MywgMHg0NDE4NjYxMiwKKzB4NDUyODkyMTAsIDB4MjYyOTQ0MDgsIDB4NDQwODQ1MDAsIDB4NDQwMDI2NUIsCisweDQ3MDgyNjRCLCAweDQ3MDgyMTYyLCAweDI3RUJEMTRDLCAweDAwMEIyMTcyLAorMHgwM0YwNkVGNiwgMHgyRkU2MUZGRiwgMHhERTQ5NEYyMiwgMHhFNDBBRTEwMSwKKzB4MkUxMkJGNDgsIDB4NzI2QzYyRTMsIDB4RTQwMUUxMDAsIDB4MjIxMjIyMTIsCisweDIyMTIyMjEyLCAweDIyMTIyMjEyLCAweEU3MzAyMjQyLCAweEU0MEFFNTAzLAorMHgyMjEyMjIxMiwgMHgyMjEyMjIxMiwgMHgyMjEyMjIxMiwgMHgyMjEyMjIxMiwKKzB4MjIxMjIyMTIsIDB4MjIxMjIyMTIsIDB4MjI1MjIyNzIsIDB4MjIxMjIyMTIsCisweDIyMTIyMjEyLCAweDIyMTIyMjEyLCAweDIyMTIyMjEyLCAweDEyMUFCRjIyLAorMHgyRTYyRTYwMCwgMHgwMDBCNEYyNiwgMHhEMjMyNkVGNiwgMHhFNDQxRTEwMSwKKzB4MDAwQjIyMTIsIDB4RDEzMDIyNDIsIDB4RTYwNUQ0MzAsIDB4MDAwQjIxNjIsCisweEQ1MkYyNDYyLCAweDYwNTBEMjJGLCAweDhCMEU4ODAxLCAweDYwNDBENDJFLAorMHg4QjA3ODgwMSwgMHg5NjI2RDUyRCwgMHg4ODAxNjA1MCwgMHg5NjIzOEIwQywKKzB4MDAwOUEwMEEsIDB4QTAwNzk2MjEsIDB4RTYwMDAwMDksIDB4MjI2MkQ0MjYsCisweDg4MDE2MDQwLCAweEU2MDQ4QjAwLCAweEFFRjNFNDBBLCAweEQyMjQyMjYyLAorMHhFNDBBRTYwMSwgMHgyMjYyQUVFRSwgMHgyRkM2MkZCNiwgMHgyRkU2MkZENiwKKzB4REMyMDRGMjIsIDB4NjBDMkVEMDAsIDB4Q0IwMUVCNjQsIDB4NjBDMjJDMDIsCisweEEwNDFDOTAxLCAweDAzQzQ2RTAzLCAweDAzNDAwM0Q0LCAweDAwMUMzQjg4LAorMHgwMDIwMzAyQywgMHgwMDIwMTNBMiwgMHgwMDIwMzAzNCwgMHgwMDIwMzAzQywKKzB4MDAyMDMwNDQsIDB4MDAyMDMwNEMsIDB4MDAyNUU3MjAsIDB4MDAyMDMyMUMsCisweDAwMjAyRjA0LCAweDAwMUM1OTY4LCAweDAwMUQ0MDA0LCAweDAwMUMzNTAwLAorMHgwMDIwMTE1NCwgMHgwMDIwMTE4MCwgMHgwMDFDNTgxNCwgMHgwMDFDNTlEMCwKKzB4MDAxQzU4MzAsIDB4MDAxQzYyNjgsIDB4MDAxQzU5QTQsIDB4MDAxQzYzOUMsCisweDAwMjAyRjE2LCAweDAwMUM1ODA0LCAweDAwMjAyRjE1LCAweDAwMjAyRjE3LAorMHgwMDFDNTgxQywgMHgwMDFDNTg2MCwgMHg4OTA3M0RCMiwgMHhFNDBBNjBDMiwKKzB4QkU5RkM5MDEsIDB4N0QwMTZFMDMsIDB4OEJGNTJFRTgsIDB4OEIwMzNEQjIsCisweEQyM0VENDNELCAweDAwMDk0MjBCLCAweDRGMjZFNDBBLCAweDZERjY2RUY2LAorMHhBRThGNkNGNiwgMHg0NDExNkJGNiwgMHg2MDRCOEYwMSwgMHgwMDBCNjA0MywKKzB4MkZCNjAwMDksIDB4MkZENjJGQzYsIDB4NEYyMjJGRTYsIDB4REMzNDdGRkMsCisweDYwQzJFRDAwLCAweENCMDJFQjY0LCAweDYwQzIyQzAyLCAweEM5MDIyRjAyLAorMHg2RTAzQTAwOSwgMHg4OTA4M0RCMywgMHhFNDBBNjBDMiwgMHhDOTAyMkYwMiwKKzB4NkUwM0JFNzAsIDB4MkVFODdEMDEsIDB4M0RCMzhCRjQsIDB4RDQyOThCMDgsCisweDdGMDREMjI2LCAweDZFRjY0RjI2LCAweDZDRjY2REY2LCAweDZCRjY0MjJCLAorMHg0RjI2N0YwNCwgMHg2REY2NkVGNiwgMHgwMDBCNkNGNiwgMHhENTIyNkJGNiwKKzB4NjA1MjU2NTEsIDB4MDAwQjQ2MjgsIDB4MkZCNjMwNkMsIDB4MkZENjJGQzYsCisweDRGMjIyRkU2LCAweDRGMDI0RjEyLCAweDZFNDNCRkYxLCAweERDMUI2QjAzLAorMHhCRkVDREQxQiwgMHgzMEI4MDAwOSwgMHgwNjBBM0MwNSwgMHg0NjA5NDYwOSwKKzB4M0Q2NTQ2MDEsIDB4NDIwOTAyMEEsIDB4NDIwOTQyMDksIDB4OEJGMDMyRTIsCisweDRGMTY0RjA2LCAweDZFRjY0RjI2LCAweDZDRjY2REY2LCAweDZCRjYwMDBCLAorMHg0RjIyMkZFNiwgMHhFMTAyREUwRiwgMHhFNDAzRTUwMCwgMHhCRkQ0MkUxMiwKKzB4RTYwNjJFNTIsIDB4RTcwMDQ2MTgsIDB4MkU2MkU0MDMsIDB4NEYyNjJFNzIsCisweDZFRjZBRkNCLCAweDAwMDkwMDBCLCAweDAwMjAzMDU0LCAweDAwMjAxMzU2LAorMHgwMDFDNTg2MCwgMHgwMDIwMzA2QywgMHgwMDFDMTA0MCwgMHhDQ0NDQ0NDRCwKKzB4MTA2MjRERDMsIDB4MDAxRDQwMDQsIDB4MkY5NjJGODYsIDB4MkZCNjJGQTYsCisweDJGRDYyRkM2LCAweDRGMjIyRkU2LCAweEU1MDA3RkRDLCAweDY0NTNFMTEwLAorMHg2QzUzNDEyOCwgMHhFRDA5NkU1MywgMHg2NjUzNjU1RCwgMHgzNjVDNDYwOCwKKzB4NzUwMTQ2MDgsIDB4NjA0MzM2MUMsIDB4MEY2NjY3NUQsIDB4RUIwMDYwQzMsCisweDI2QzEzN0QzLCAweDgxNjI4MTYxLCAweDE2QjI4MTYzLCAweDE2QjQxNkUzLAorMHg3NDA0OEZFQSwgMHhEOUE2NjhGMiwgMHgxOTgxREFBNiwgMHg1OUYxMjk4MiwKKzB4MUE5MUQxQTUsIDB4NUFGMjJBOTIsIDB4NURGNDVCRjMsIDB4NTRGNjVFRjUsCisweDIxQTIxMUExLCAweDExQjIxMUIzLCAweDExRDQxMUQ1LCAweDExRTYxMUU3LAorMHgxMTQ4MTE0OSwgMHg1NUY3RUUwMCwgMHg1N0Y4REQ5QywgMHg2NEUzRDI5QywKKzB4REI5REQ5OUMsIDB4RTg0NUVBQjgsIDB4MkQ1MjFENTEsIDB4NkFBQzIyNzIsCisweDZFRUQ0ODA4LCAweDREMDg2REUzLCAweDNERUM2NUUzLCAweDREMDg0NTA4LAorMHgzRDlDMzVFQywgMHg0NTA4NjBDMywgMHg4MUQxMkRDMSwgMHg0NTA4RTA1MCwKKzB4NDUwODQwMDgsIDB4NjBDMzgxRDIsIDB4RTYwMDM1QkMsIDB4ODFEMzM0QTIsCisweDFENTMxREQyLCAweDhEMDFENDg5LCAweEQ0ODYxRDY0LCAweEIwNUM2NUQzLAorMHg2NEVEN0UwMSwgMHg4QkRDMzQ4MiwgMHhEQjg4RDE4MiwgMHhEMjgwNjgxMiwKKzB4MUI4MTQ4MjksIDB4MkZEMjY0MTIsIDB4MkI5MjY5NEQsIDB4RDk3RjY3MjIsCisweDFCNzM0NzI5LCAweEQ3N0M2ODIyLCAweDFCQTI2QThELCAweEQyODA2QjcyLAorMHgyMkIyRDU3QiwgMHhFMDAzNUQ3MiwgMHg1RTc0MTJEMiwgMHgxMkU0NDAxOCwKKzB4RDY3QzUxNzYsIDB4NTQ3ODEyMTYsIDB4MTI0OEUxMDMsIDB4RDQ3OTY3OTIsCisweDY4NTIxMjdBLCAweDI4QzFFN0ZGLCAweDgxOTE2OTUyLCAweDZBNTJFMDUwLAorMHg4MUEyNDAwOCwgMHg2MEMzNkI1MiwgMHg2QzUyODFCMywgMHg2RTUyMUNDMiwKKzB4NjI1MjFFNjMsIDB4MTI2NEU2MDAsIDB4NDYwODY1NjMsIDB4NzUwMTM2NEMsCisweDY2NUQyNjcyLCAweDhCRjgzNjEzLCAweDRGMjY3RjI0LCAweDZERjY2RUY2LAorMHg2QkY2NkNGNiwgMHg2OUY2NkFGNiwgMHg2OEY2MDAwQiwgMHg2MDYxNjY0MiwKKzB4OEQwNEM4MDMsIDB4NjA2MUU1MDAsIDB4ODgwMkM5MDMsIDB4NTI2MjhCMDMsCisweDUxMjQ2NTYzLCAweDAwMEIyNDEyLCAweDJGRDY2MDUzLCAweDRGMjIyRkU2LAorMHg2RTUzN0ZFQywgMHhFNTUwNjI1MywgMHhFNDAwNkQ0MywgMHhBMDAxNDUwOCwKKzB4NTIyNEUxMDEsIDB4MjIxMTYwNDMsIDB4ODEyMzgxMjEsIDB4ODEyMjYwNTMsCisweDM2MjA1NkUyLCAweEQyNTQ4QkY1LCAweDY0RjMxNkU0LCAweDQyMEJFNjE0LAorMHg2NUUxNjVFMywgMHgyNTQ5RTRGQywgMHg2MUYxMkU1MSwgMHgyMTQ5NjVGMywKKzB4NTREMTJGMTEsIDB4NDEwQkQxNEMsIDB4NTdEMUU2MTQsIDB4Q0IwMTYwNzEsCisweDFERTEyNzAxLCAweDRGMjY3RjE0LCAweDAwMEI2RUY2LCAweDJGRDY2REY2LAorMHg0RjIyMkZFNiwgMHg2RTUzN0ZFQywgMHhFNUZDNjY1MywgMHg2MDYxNkQ0MywKKzB4Q0IwMTIwNTksIDB4NTJFMjI2MDEsIDB4OEIwNjMyNjAsIDB4NTFFMjEyRTQsCisweDhCMDQzMUUwLCAweEEwMDI1MkQxLCAweEFGRjAxRTIyLCAweEQyM0E1NjY0LAorMHhFNjE0NjRGMywgMHg2NUUzNDIwQiwgMHhFMUZDNjdFMSwgMHgyRTcxMjcxOSwKKzB4NTREMTY3RjEsIDB4RDEzNDI3MTksIDB4RTYxNDY1RjMsIDB4MkY3MTQxMEIsCisweDYwMjE1MkQxLCAweDIyMDFDQjAxLCAweDdGMTQxREUxLCAweDZFRjY0RjI2LAorMHg2REY2MDAwQiwgMHg0RjIyMkZFNiwgMHhERTIzNjI0QywgMHg0MjAwNDIwOCwKKzB4M0UyQ0EwMDUsIDB4RDQxRjUyNTIsIDB4QkY4RTU2MjQsIDB4NjVFMjJFNjIsCisweDM1MjA1MkUxLCAweEQ2MjI4QkY2LCAweDRGMjYyNjIyLCAweDZFRjYwMDBCLAorMHgyRkM2MkZCNiwgMHgyRkU2MkZENiwgMHhEQzE4NEYyMiwgMHg1MkMxREIxRiwKKzB4MzYyMDY2QzIsIDB4NjA2MTg5MUMsIDB4ODgwMUM5MDMsIDB4REUxMzg5MTgsCisweEJGNjNERDFCLCAweDY1MDM2NEUzLCAweDY2QjI4NTAzLCAweDMyNjI2MjBELAorMHhENDBCODkwNywgMHgwMDA5QkY5QiwgMHg0RDBCRDQxNiwgMHhBRkU2MDAwOSwKKzB4QkY2MjAwMDksIDB4RDQxNDY0RTMsIDB4MDAwOTREMEIsIDB4MDAwOUFGREYsCisweDIyNjJEMjEyLCAweDZFRjY0RjI2LCAweDZDRjY2REY2LCAweDZCRjYwMDBCLAorMHgwMDIwMkIwMCwgMHgwMDIwMkIwOCwgMHgwMDIwMkIxMCwgMHgwMDIwMkIzOCwKKzB4MDAyMDJGMUMsIDB4MDAxMDAwQjQsIDB4MDAxMDE2ODAsIDB4MDAxRTIxMDgsCisweDAwMUMzRDAwLCAweDAwMTE3ODgwLCAweDAwMjAwQTlFLCAweDAwMjAyRjAwLAorMHgwMDIwMTM1NiwgMHgwMDIwMzA4OCwgMHgwMDIwMzA4QywgMHgwMDFDM0QyOCwKKzB4MkZDNjJGQjYsIDB4MkZFNjJGRDYsIDB4N0ZGQzRGMjIsIDB4NjAyMkQyMkIsCisweDhENDFDODAzLCAweERFMkEyRjAxLCAweERCMkJEQzJBLCAweEVEMDFBMDE3LAorMHhDOTAzNjA1MSwgMHg4OTE2ODgwMSwgMHhEMTI4RDQyNiwgMHgwMDA5NDEwQiwKKzB4NjEwMzU1MDMsIDB4QzgyMDg1NTEsIDB4RTA1MDg5MDMsIDB4NzIwMTAyQkUsCisweEQyMjMwQjI2LCAweDQyMEI2NEUzLCAweEQ2MjI2NTEzLCAweDUyQzEyNkQyLAorMHgzNTIwNjVDMiwgMHhERTIwOEJFNCwgMHhEQjIxREQyMCwgMHg1MkQxREMyMSwKKzB4MzUyMDY1RDIsIDB4NjA1MTg5MTgsIDB4ODgwMUM5MDMsIDB4RDQxQjg5MTQsCisweDQ2MEJENjE2LCAweDU3MDMwMDA5LCAweDhGMDQzN0UwLCAweEUyMDE2NTAzLAorMHhBRkVDMkIyMCwgMHhENDE4MkM1MiwgMHg0MjBCRDIxOCwgMHhENjExMDAwOSwKKzB4NDExOEUxMDEsIDB4MjYxMkFGRTMsIDB4QzgwNDYwRjEsIDB4RDIxNDg5MDcsCisweDRGMjY3RjA0LCAweDZERjY2RUY2LCAweDQyMkI2Q0Y2LCAweDdGMDQ2QkY2LAorMHg2RUY2NEYyNiwgMHg2Q0Y2NkRGNiwgMHg2QkY2MDAwQiwgMHgwMDFFMjEwMCwKKzB4MDAyMDJCMTAsIDB4MDAyMDJCMDgsIDB4MDAyMDJBQTQsIDB4MDAyMDEwNkMsCisweDAwMjAxMEVFLCAweDAwMUMzRDMwLCAweDAwMTE3ODgwLCAweDAwMjAyQjAwLAorMHgwMDIwMkYyMCwgMHgwMDIwMkYxQywgMHgwMDIwMkIzOCwgMHgwMDIwMTA4QSwKKzB4MDAyMDAxNzAsIDB4RTYwMUQyMDMsIDB4MTI2NUQ1MDMsIDB4MDAwQjIyNTIsCisweDAwMDAxMjY2LCAweDAwMUMxMDEwLCAweDAwMDBDMzRGLCAweDAwMDkwMDBCLAorMHgyRkQ2MkZDNiwgMHg0RjIyMkZFNiwgMHg2RDQzNkM1MywgMHhFRTAwQTAwNCwKKzB4N0UwMTY0RDQsIDB4NjQ0Q0JGRjIsIDB4OEJGOTNFQzIsIDB4NkVGNjRGMjYsCisweDAwMEI2REY2LCAweEU1MDA2Q0Y2LCAweDY2NDNBMDAyLCAweDc2MDE3NTAxLAorMHgyMjI4NjI2MCwgMHhBRkUzOEJGQSwgMHgyRkU2MDAwOSwgMHg3NTA3NjI1MywKKzB4RTEwODY3NTMsIDB4NjA0M0VFMEEsIDB4NDQwOUM5MEYsIDB4NjUwMzMwRTIsCisweDhEMDE0NDA5LCAweEU2MzBFNjM3LCAweDQxMTAzNjVDLCAweDhGRjIyNzYwLAorMHhFMDAwNzdGRiwgMHgwMDBCODAyOCwgMHgwMDBCNkVGNiwgMHgwMDBCRTAwMCwKKzB4MkZFNkUwMDAsIDB4N0ZFQzRGMjIsIDB4NkU0MzYyNTMsIDB4QkZEQzY1RjMsCisweEJGRDA2NDIzLCAweEJGQ0U2NEUzLCAweEQ0MDM2NEYzLCAweDAwMDlCRkNCLAorMHg0RjI2N0YxNCwgMHg2RUY2MDAwQiwgMHgwMDIwMzA5MCwgMHhFNEZERDU5QSwKKzB4RDY5QTYxNTIsIDB4MjUxMjIxNDksIDB4NzQwMTYwNTIsIDB4MjUwMkNCMDEsCisweEQxOTc2NzUyLCAweDI1NzIyNzQ5LCAweEM4NDA2MDEwLCAweDYwNjI4OTAyLAorMHgyNjAyQ0IwNCwgMHhFNTAxNjA2MiwgMHgyNjAyQ0IwOCwgMHhFNDAyNjA2MiwKKzB4MjYwMkM5Q0YsIDB4NDUxODYwNjIsIDB4MjYwMkNCMDMsIDB4MDAwQjE2NDIsCisweEQ1OEMxNjUzLCAweEQyOERENzhDLCAweEUxMDBENDhELCAweDI1MTFFNjAwLAorMHgyMjEwMjcxMSwgMHgyNDYxQUZEMiwgMHhEMjhBNjY0QywgMHgzNjJDNDYwMCwKKzB4Q0IxMDYwNjAsIDB4MjYwMDAwMEIsIDB4RDI4NjY1NEMsIDB4MzUyQzQ1MDAsCisweEUxRUY2NjUwLCAweDAwMEIyNjE5LCAweDY2NEMyNTYwLCAweDQ2MDBEMjgyLAorMHg2MDYwMzYyQywgMHgwMDBCQ0IxMCwgMHg2NTRDMjYwMCwgMHg0NTAwRDI3RSwKKzB4NjY1MDM1MkMsIDB4MjYxOUUxRUYsIDB4MjU2MDAwMEIsIDB4RDI3OTY2NEMsCisweDM2MkM0NjAwLCAweENCMDg2MDYwLCAweDI2MDAwMDBCLCAweEQyNzU2NTRDLAorMHgzNTJDNDUwMCwgMHhFMUY3NjY1MCwgMHgwMDBCMjYxOSwgMHg2NjRDMjU2MCwKKzB4NDYwMEQyNzEsIDB4NjA2MDM2MkMsIDB4MDAwQkNCMDgsIDB4NjU0QzI2MDAsCisweDQ1MDBEMjZELCAweDY2NTAzNTJDLCAweDI2MTlFMUY3LCAweDI1NjAwMDBCLAorMHhENjY4NjI0QywgMHgzMjZDNDIwMCwgMHhDOTA4NjAyMCwgMHg0MDIxNDAyMSwKKzB4MDAwQjQwMjEsIDB4NjI0QzYwMEMsIDB4NDIwMEQ2NjMsIDB4NjAyMDMyNkMsCisweDQwMjFDOTA4LCAweDQwMjE0MDIxLCAweDYwMEMwMDBCLCAweDY0NENEMTVGLAorMHg2MjQwMzQxQywgMHg2MDJDMDAwQiwgMHg2NDRDRDE1RCwgMHg2MjQwMzQxQywKKzB4NjAyQzAwMEIsIDB4NEYyMjJGRTYsIDB4NjQ1QzZFNDMsIDB4MzQ2N0U2MEEsCisweEJGRUI4OTE0LCAweDY0MEMwMDA5LCAweDg4MDE2MEVDLCAweEUwMEY4QjAyLAorMHgyNDA5QTAwMiwgMHg0NDA5NDQwOSwgMHhFNjBBNjI0QywgMHg4OTA1MzI2MywKKzB4NjQ0Q0JGRTIsIDB4NjAyMzYyMEMsIDB4OEIwMEM4ODAsIDB4NjAyM0UyMDAsCisweDAwMEI0RjI2LCAweDRGMjI2RUY2LCAweDYwNjJENjRBLCAweDhCMDM4ODAxLAorMHgwMDA5QjI0NiwgMHgwMDA5QTAwMywgMHhFNjQwRDI0NywgMHhENjQ3MjI2MCwKKzB4NEYyNkUyMDAsIDB4MjYyMjAwMEIsIDB4RDY0MjRGMjIsIDB4ODgwMjYwNjIsCisweEIyOEY4QjAxLCAweEQ2NDEwMDA5LCAweDRGMjZFMjAwLCAweDI2MjIwMDBCLAorMHhENDNERDUzQywgMHhFNzAxRTEwMCwgMHgwMDBCMjUxMiwgMHhEMjNBMjQ3MCwKKzB4MDAwQkU2MDQsIDB4NEYyMjIyNjAsIDB4RDEzQUQ0MzksIDB4MDAwOTQxMEIsCisweEUxRkRENTM5LCAweEQyMzk2NjUwLCAweEU3MDAyNjE5LCAweDRGMjYyNTYwLAorMHgyMjcwMDAwQiwgMHhENDM2NEYyMiwgMHg0MTBCRDEzMiwgMHhENTMyMDAwOSwKKzB4NjY1MEU3RkIsIDB4NEYyNjI2NzksIDB4MjU2MDAwMEIsIDB4RDQzMTRGMjIsCisweDQxMEJEMTJDLCAweEQ1MkMwMDA5LCAweDY2NTBFN0Y3LCAweDRGMjYyNjc5LAorMHgyNTYwMDAwQiwgMHg5NDJERDUyOCwgMHgyMjQ5NjI1MCwgMHgyNTIwMDAwQiwKKzB4RTRCRkQ1MjUsIDB4MjI0OTYyNTAsIDB4MjUyMDAwMEIsIDB4RDIyNjRGMjIsCisweDYwMEQ4NTIyLCAweDg5MTEyMDA4LCAweDg5MTM4ODAxLCAweDg5MTU4ODAzLAorMHg4OTQzODgwNSwgMHg4OTQ5ODgwNiwgMHg4OTRGODgwOCwgMHg4OTU1ODgwOSwKKzB4ODk1Qjg4MEEsIDB4ODk2MTg4MEIsIDB4MDAwOUEwNjgsIDB4MDAwOUIwNkEsCisweDYwMENBMDY1LCAweDAwMDlCMDc4LCAweDYwMENBMDYxLCAweDAwMDlCMDgxLAorMHg2MDBDQTA1RCwgMHgwMDAwRkY3RiwgMHgwMDFFMjE0OCwgMHgwMDFFMTEwOCwKKzB4MDAxRTEwMDAsIDB4MDAyMDJGNjAsIDB4MDAyMDJGNjIsIDB4MDAyMDJGODEsCisweDAwMjAyRjQ0LCAweDAwMUUxMDNGLCAweDAwMUUxMDVGLCAweDAwMUUxMDJGLAorMHgwMDFFMTA5MCwgMHgwMDIwMkY2OCwgMHgwMDFFMTAwQiwgMHgwMDIwMkY2NCwKKzB4MDAyMDMwOTQsIDB4MDAyMDEzNTYsIDB4MDAxRTEwMjgsIDB4MDAyMDJGODAsCisweDAwMjAzMEEwLCAweDAwMjAzMEIwLCAweDAwMjAyRjM4LCAweDYyNjBENjg0LAorMHg4QjJCMjIyOCwgMHgwMDA5QjA2MSwgMHg2MDBDQTAyOSwgMHg2MjYwRDY4MCwKKzB4OEIyMzIyMjgsIDB4MDAwOUIwNjksIDB4NjAwQ0EwMjEsIDB4NjI2MEQ2N0MsCisweDhCMUIyMjI4LCAweDAwMDlCMEM3LCAweDYwMENBMDE5LCAweDYyNjBENjc4LAorMHg4QjEzMjIyOCwgMHgwMDA5QjBDRCwgMHg2MDBDQTAxMSwgMHg2MjYwRDY3NCwKKzB4OEIwQjIyMjgsIDB4MDAwOUIxMjUsIDB4NjAwQ0EwMDksIDB4NjI2MEQ2NzAsCisweDhCMDMyMjI4LCAweDAwMDlCMTNELCAweDYwMENBMDAxLCAweDRGMjZFMDAwLAorMHgwMDA5MDAwQiwgMHhEMjZDRDE2QiwgMHhENTZDODQxMiwgMHg0MDAwQzkwRiwKKzB4RDc2QjAxMkQsIDB4RTQwM0Q2NkIsIDB4RTIwRjYxMUMsIDB4MjU0MEUwMDEsCisweDI1MjAyNzEyLCAweDI2MDIwMDBCLCAweEU2MDFEMjYyLCAweDMwNjY4NTIzLAorMHhFMDAwOEQwNSwgMHhENjYzRDI2MCwgMHhFMDAxODEyMiwgMHgwMDBCMjYwMiwKKzB4RDI1QzAwMDksIDB4NjAwRDg1MjMsIDB4ODkwNTIwMDgsIDB4OEIwQTg4MDEsCisweDYwNjBENjVELCAweDI2MDBDQjAxLCAweEQ0NTdENjVBLCAweEUwMDFFMTAxLAorMHgwMDBCMjYxMiwgMHgwMDBCODE0MiwgMHhEMTUyRTAwMCwgMHg4NTEzRTUwMSwKKzB4NjQwRDQ1MTgsIDB4NjYwMzM0NTMsIDB4RTAwMDhEMDUsIDB4RDU1MUQyNTMsCisweDIyNjBFMDAxLCAweDAwMEIyNTAyLCAweDRGMjIwMDA5LCAweDg1MTNEMTQ5LAorMHg2NDUzNjUwRCwgMHg2MjQ5NDQxOSwgMHgyMjdENjcyRSwgMHg4ODAxNjAyQywKKzB4ODgwMjg5MDksIDB4ODgwMzg5MTAsIDB4ODgwNjg5MUEsIDB4ODgwNzg5MzUsCisweEEwNEM4OTNCLCAweEQ1NDYwMDA5LCAweDY2NTJENzQ2LCAweDI3NjJENDQ2LAorMHg2MjJDNjI2MSwgMHgyNDIxQTAzOCwgMHgyMjI4NjI1QywgMHhENDQzOEIzRiwKKzB4NjY0MkQ1NDAsIDB4MjU2MkQ0NDAsIDB4MjQwMTg1NjEsIDB4NjIwM0EwMkMsCisweDIwMDg2MDVDLCAweDg4MTA4OTA3LCAweDg4MjA4OTA4LCAweDg4MzA4OTA5LAorMHhBMDJDODkwQSwgMHhEMjNBMDAwOSwgMHg2MjIyQTAwOCwgMHhBMDA1RDIzOSwKKzB4RDIzOTYyMjIsIDB4NjIyMkEwMDIsIDB4NjI2MkQ2MzgsIDB4RDQzMkQ1MzEsCisweDY2MjEyNTIyLCAweEEwMEY2MjZDLCAweEQ2MzUyNDIxLCAweDYyNjFENTJELAorMHg2MjJDRDQyRCwgMHhBMDA3MjU2MiwgMHhENjMyMjQyMSwgMHg4NTYxRDUyOSwKKzB4MjU2MkQ0MjksIDB4NjIwMzI0MDEsIDB4NjYyRDg1MTUsIDB4MzYxNzYxMEQsCisweDY1MDM4RjAxLCAweEIwQ0IyNDUxLCAweEEwMDEwMDA5LCAweEUwMDBFMDAxLAorMHgwMDBCNEYyNiwgMHhENjE5MDAwOSwgMHhENDI3RTEwMSwgMHg2NTQxMjYxMCwKKzB4RDExOEQ3MTcsIDB4RTIwRjY1NUQsIDB4Mjc1MkUwMDEsIDB4MDAwQjI2MjAsCisweDJGRTYyMTAyLCAweEQyMEY0RjIyLCAweDY0MEM4NTIzLCAweDhCMDgyNDQ4LAorMHhENTExRDYxRCwgMHgyNjIxRTIwMCwgMHg5NDBGODQ1MSwgMHhBMDQ4MjA0OSwKKzB4REUwRDgwNTEsIDB4Qzg0MDYwRTAsIDB4RTIwMThEMzIsIDB4ODk0NDM0MjcsCisweEQyMTZENjE1LCAweDI2NDE0MjBCLCAweDAwMDlBMDMwLCAweDAwMDBGRjdGLAorMHgwMDIwMkY4MSwgMHgwMDIwMkYzOCwgMHgwMDIwMkY0NCwgMHgwMDFFMTEwMCwKKzB4MDAxRTEwMEMsIDB4MDAyMDJGNjQsIDB4MDAxRTEwMDAsIDB4MDAxRTEwMDEsCisweDAwMjAyRjZDLCAweDAwMjAyRjRDLCAweDAwMjAyRjUwLCAweDAwMjAyRjU0LAorMHgwMDIwMkY3MCwgMHgwMDIwMkY3NCwgMHgwMDIwMkY3OCwgMHgwMDIwMkY3QywKKzB4MDAyMDMyODAsIDB4MDAyMDMyOEEsIDB4MDAyMDJGNUUsIDB4MDAyMDIyNUEsCisweDg5MTIzNDI3LCAweEQyOTRENjkzLCAweDI2NDE0MjBCLCAweENCODA4NEUxLAorMHg4MEUxQjBGNSwgMHhENjkxNjBFMCwgMHgyRTAwQ0IwNCwgMHhDOTNGNjA2MCwKKzB4RDY4RjI2MDAsIDB4QTAwMUUwMDEsIDB4RTAwMDI2MDIsIDB4MDAwQjRGMjYsCisweEQ2OEM2RUY2LCAweEM4ODA2MDYwLCAweEQyODY4OTE5LCAweDg4MDE2MDIxLAorMHhEMjg5OEIxNSwgMHg4NTI0RTUwMSwgMHg4OTEwMzA1NiwgMHhFMjAzRDE4NywKKzB4MjEyMEQ0ODcsIDB4RTAwQjY1NDEsIDB4MDY1NjY1NUQsIDB4RTQwRkQ1ODUsCisweDIxNDBFNzAyLCAweEQ3N0UyNTcxLCAweDAwMEJFMDAxLCAweDAwMEIyNzAyLAorMHgyRkU2RTAwMCwgMHhERTgwNEYyMiwgMHhDODgwODRFMSwgMHhENTdBODkyQywKKzB4MjAwODg1NTQsIDB4NjEwMzhGMjgsIDB4ODU1M0Q3N0MsIDB4NjQwMzY2NzIsCisweDg1NjY2NTBDLCAweDM1MjA2MjBDLCAweEQ2Nzk4QjFFLCAweDY1MUNENzc0LAorMHgyNjUxNjQ0QywgMHg2MEUwMjc0MSwgMHg4OTA0Qzg0MCwgMHg0MjBCRDI3NSwKKzB4QTAwMzAwMDksIDB4RDI2ODAwMDksIDB4MDAwOTQyMEIsIDB4MDAwOUIwOUYsCisweEUyMDFEMTY3LCAweDYwRTAyMTIyLCAweENCMDRENDY0LCAweDYwNDAyRTAwLAorMHgyNDAwQzkzRiwgMHg2MDIzQTAwMSwgMHg0RjI2RTAwMCwgMHg2RUY2MDAwQiwKKzB4MkZCNjJGQTYsIDB4MkZENjJGQzYsIDB4REE2MjJGRTYsIDB4NjZBMUUyNDAsCisweDM2MjJEQzVFLCAweDYyNjM4OTAwLCAweDZFRDM2RDJDLCAweDRFMjEzNkQ4LAorMHg0RTIxMkE2MSwgMHhEQjYxRDQ2MCwgMHhFNzAwQTAwRiwgMHg3NzAxNjJCMiwKKzB4NzEwMjYxMjMsIDB4NjYyMTJCMTIsIDB4NzEwMjYyMTMsIDB4NjEyMTJCMTIsCisweDY1MUQ2NjZELCAweDM1NkM0NTI4LCAweDYyN0MyNDUyLCAweDhCRUQzMkUzLAorMHhDOTAzNjBEMywgMHg4QjEwODgwMywgMHg2MTczNjdCMiwgMHgyQjEyNzEwMiwKKzB4NzEwMjZFMTMsIDB4MkIxMjY1NzEsIDB4NjU1RDZERTEsIDB4NDIyODYyREQsCisweDMyNUNFMTA3LCAweEEwMEMyQzEwLCAweDg4MDIyNDIyLCAweEEwMDM4QjAxLAorMHg4ODAxRTIwMywgMHhFMjAxOEIwNSwgMHg2NkIyMkMyMCwgMHg2NTVENjU2MSwKKzB4RTYwRjI0NTIsIDB4NjdBMTJDNjAsIDB4OEIwNTI3NzgsIDB4REQzOERDNDQsCisweEVCMDFFQTAwLCAweDJEQjIyQ0EyLCAweDZERjY2RUY2LCAweDZCRjY2Q0Y2LAorMHg2QUY2MDAwQiwgMHgyRkU2MkZENiwgMHhFMjQwREQzNiwgMHgzNjIyNjZEMSwKKzB4NjI2Mzg5MDAsIDB4MzY3ODY3MkMsIDB4NzcwM0RFMzgsIDB4NDcyMTJENjEsCisweDY0RTJENjM1LCAweEEwMEU0NzIxLCAweDY1NjJFMTAwLCAweDYyNTM3MTAxLAorMHg3NDAxMjQ1MCwgMHgyNDIwNDIxOSwgMHg0NTI5NzQwMSwgMHg3NDAxMjQ1MCwKKzB4MjQ1MDQ1MTksIDB4NjIxQzc0MDEsIDB4OEJFRTMyNzMsIDB4NjZFMjQyMDAsCisweDQyMDA2MUQxLCAweDIxMTgzNjJDLCAweDJFNjI4RjA2LCAweEREMUNENzI4LAorMHhFNTAxRTQwMCwgMHgyRDUyMjc0MiwgMHgwMDBCNkVGNiwgMHgyRkQ2NkRGNiwKKzB4NEYyMjJGRTYsIDB4RUQwQUVFMDEsIDB4NjRFM0JDOTYsIDB4QkM5QjY0RTMsCisweDYyRUM3RTAxLCAweDhCRjczMkQ3LCAweEJDOUVFRTAxLCAweDY0RTM2NEUzLAorMHg3RTAxQkNBMywgMHgzMkQ3NjJFQywgMHg0RjI2OEJGNywgMHgwMDBCNkVGNiwKKzB4RDExODZERjYsIDB4RDQxODkyMEQsIDB4NzIxMjIxMjIsIDB4MjQyMkQ2MTcsCisweEQ3MTc3MjA0LCAweDcyMjAyNjIyLCAweDI3MjJEMTE2LCAweDAwMEI3MjMwLAorMHgxMzdBMjEyMiwgMHgwMDIwMkY1RSwgMHgwMDIwMjM2NiwgMHgwMDFFMTAxNSwKKzB4MDAyMDJGNjQsIDB4MDAxRTEwMDEsIDB4MDAyMDJGMzgsIDB4MDAxRTExMDAsCisweDAwMjAyRjYyLCAweDAwMjAyRjUwLCAweDAwMUUxMDAwLCAweDAwMjAyRjU0LAorMHgwMDIwMkY2MCwgMHgwMDIwMjI1QSwgMHgwMDFFMTAwQywgMHgwMDIwMkY0QywKKzB4MDAyMDJGNjgsIDB4MDAyMDJGNkMsIDB4MDAyMDJGNzAsIDB4MDAyMDJGNzQsCisweDAwMjAyRjc4LCAweDAwMjAyRjdDLCAweDRGMjIyRkU2LCAweEQ2NTA3RkZDLAorMHg4ODAxNjA2MCwgMHhFMjAxODk1MSwgMHgyNjIwQkZCQiwgMHhENTRFRDE0RCwKKzB4REU0RTYwMTAsIDB4NjRFMzY1NTIsIDB4NzQwMkM4NDAsIDB4OEQyMkQxNEMsCisweEQyNEM3NTAyLCAweEU2MDFENzRDLCAweEU3MDQyNzIyLCAweDc2MDE2MjU1LAorMHg2MjZDMjQyMSwgMHg4RkY5MzI3MywgMHhENDQzNzQwMiwgMHg2MjQyRTYwMSwKKzB4NjQwRDg1MjgsIDB4Njc0OTQ0MTksIDB4Mjc1RDY1N0UsIDB4ODFFNDYwN0MsCisweEU0MTdENTQyLCAweDY3NTU3NjAxLCAweDMyNDM2MjZDLCAweDhGRjkyMTcxLAorMHhBMDIwNzEwMiwgMHhEMjNFMDAwOSwgMHhFNjAxRDczQiwgMHhFNzA0MjcyMiwKKzB4NzYwMTYyNTUsIDB4NjI2QzI0MjEsIDB4OEZGOTMyNzMsIDB4RDQzMjc0MDIsCisweDYyNDJFNjAxLCAweDY0MEQ4NTI4LCAweDY3NDk0NDE5LCAweDI3NUQ2NTdFLAorMHg4MUU0NjA3QywgMHhFNDE3RDUzMywgMHg2NzU1NzYwMSwgMHgzMjQzNjI2QywKKzB4OEZGOTIxNzEsIDB4OTI0QTcxMDIsIDB4RDIyNjJFMjEsIDB4NUUyM0Q3MkUsCisweDY0RjIyRkUyLCAweDYwNDM2NUYyLCAweDI3MDBDOTgwLCAweEM5NjA2MDQzLAorMHg4MDcxNjEwMywgMHhDOTAzNjA0MywgMHg4MDcyNDUxOSwgMHg2NUYyNjA1QywKKzB4ODE3MjY2RjIsIDB4NDYxOTQ2MjksIDB4NjA2QzQ1MjksIDB4NDAxODY0NUMsCisweDgxNzMzMDRDLCAweDIxMTg1RTIzLCAweDY0RjIyRkUyLCAweDZFNEM2MkYyLAorMHg2MDJDNDIxOSwgMHg2NkYyNjJGMiwgMHg0NjI5NDAxOCwgMHg0NjE5MzBFQywKKzB4NDIyOTgxNzQsIDB4NjUyQzYwNkMsIDB4MzA1QzQwMTgsIDB4ODE3NThGMDcsCisweDAwMDlCQzlDLCAweDIyMjg2MjBDLCAweEEwMEE4OTA4LCAweDYwMTMwMDA5LAorMHg4QjAzODg0MCwgMHgwMDA5QjAwOSwgMHgwMDA5QTAwMywgMHhFMjAyRDYwRiwKKzB4N0YwNDI2MjIsIDB4MDAwQjRGMjYsIDB4MDAwQjZFRjYsIDB4MDYwQTAwMDksCisweDAwMjAyRjgwLCAweDAwMUUxMDAwLCAweDAwMjAyRjZDLCAweDAwMjAzMjgwLAorMHgwMDIwMzI4QywgMHgwMDIwMzIyNCwgMHgwMDIwMkY1NCwgMHgwMDIwMzI1NCwKKzB4MDAyMDMyNTIsIDB4MDAyMDMyMjYsIDB4MDAyMDJGMzgsIDB4MDAyMDJGNjQsCisweDRGMjIyRkU2LCAweERFOTM3RkZDLCAweDIwMDg4NEU5LCAweDJGMDA4RDA2LAorMHhENjkyRDQ5MSwgMHgwMDA5NDYwQiwgMHg2NEYwQjE5NCwgMHg2NjIwRDI5MCwKKzB4ODkwMjI2NjgsIDB4QzlCRjYwRTAsIDB4N0YwNDJFMDAsIDB4MDAwQjRGMjYsCisweDAwMEI2RUY2LCAweDJGRTYwMDA5LCAweERFOEE0RjIyLCAweDYwRTBENjhBLAorMHhDQkMwRDQ4QSwgMHg2MjYwMkUwMCwgMHhDODAzNjAyQywgMHg0MDIxODkwNCwKKzB4NzAwMTQwMjEsIDB4NjYwM0EwMDIsIDB4NjYwMzQwMDksIDB4RDY4NDYxNkQsCisweEU1MDBBMDA0LCAweDc1MDE2MjYyLCAweDc0MDQyNDIyLCAweDMyMTM2MjVELAorMHhEMjgwOEJGOCwgMHgwMDA5NDIwQiwgMHhDOUJGODRFMiwgMHg0RjI2ODBFMiwKKzB4NkVGNjAwMEIsIDB4MkZFNjJGRDYsIDB4N0ZGQzRGMjIsIDB4NjI2MEQ2N0EsCisweDg5NDQyMjI4LCAweEQ1NkZFMTAwLCAweDYwNTAyNjEwLCAweENCNDBENDc3LAorMHgyNTAwNDQwQiwgMHg4RDA1MjAwOCwgMHg2MkUwNkUwMywgMHg3MTA0NjEyQywKKzB4MkYxMUEwMDYsIDB4RDQ3MkQ2NkEsIDB4REQ3MjY3NjAsIDB4NjU3QzREMEIsCisweEUyM0M2RDFELCAweDhCMDMzRDI3LCAweEQyNjRENDZGLCAweDAwMDk0MjBCLAorMHg0RDIxNEQyMSwgMHhBMDA1RDc2RCwgMHg2NkU2RTQwMCwgMHgzNTdDNDUwOCwKKzB4NzQwMTI1NjIsIDB4MzVEMzY1NEQsIDB4RDc2OThCRjcsIDB4NjE3MkUwMDMsCisweDgxMTE0MDE4LCAweDZFNzI2MEYxLCAweDgxRTI3MDBDLCAweEQ0NjU2MTcyLAorMHhERDY1ODExMywgMHg0RDBCREU2NSwgMHhFMjAxNjU3MiwgMHhENDY0MkUyMiwKKzB4NDIwQkQyNTIsIDB4RDY1MzAwMDksIDB4QzkzRjYwNjAsIDB4N0YwNDI2MDAsCisweDZFRjY0RjI2LCAweDZERjYwMDBCLCAweDJGQzYyRkI2LCAweDJGRTYyRkQ2LAorMHhEMjVDNEYyMiwgMHg2QjQzNkU3MywgMHg0MjBCNkM1MywgMHgyMDA4NkQ2MywKKzB4NjEwMzhGMDgsIDB4RDI0NUQ0NTgsIDB4NkVGNjRGMjYsIDB4NkNGNjZERjYsCisweDZCRjY0MjJCLCAweDIxQjA2MEMzLCAweDYwRDM4MDExLCAweEU1MDA4MTExLAorMHg2NEJDQTAwNywgMHg2MDUzNjU1RCwgMHg2NjUzMDBFQywgMHg3NTAxMzYxQywKKzB4NjI1RDgwNjQsIDB4OEJGNTMyNDMsIDB4NjA2MEQ2MzYsIDB4MjYwMEM5QkYsCisweDZFRjY0RjI2LCAweDZDRjY2REY2LCAweDZCRjYwMDBCLCAweDdGQzQ0RjIyLAorMHg3MjAyNjJGMywgMHgyMjUxMkY0MSwgMHg0NTI5NzIwMiwgMHg2MDYzMjI1MSwKKzB4RTVDNEU2ODIsIDB4NjdGMzgxMjEsIDB4NjU1QzY2NkMsIDB4RTQwOEJGQkMsCisweDRGMjY3RjNDLCAweDAwMDkwMDBCLCAweDJGOTYyRjg2LCAweDJGQjYyRkE2LAorMHgyRkQ2MkZDNiwgMHg0RjIyMkZFNiwgMHhFMTAwN0ZDNCwgMHg2NTEzRUNGRiwKKzB4NkIxMzZDQ0QsIDB4REUzNkQ3MzUsIDB4RURGRjY0RjMsIDB4RDgzNUVBMDQsCisweDYwNTM2NTVDLCAweDAyN0Q0MDAwLCAweDMyQzA2MjJELCAweDY2MDM4RDBELAorMHgwOUVENjA2MywgMHgyNDkxMDI3RCwgMHgyNDIxNzQwMiwgMHg2OTgyMDJFRCwKKzB4MzkyODYyMkQsIDB4NzQwMjI4OTIsIDB4NzUwMTcxMDQsIDB4NjA2MzYyNUMsCisweDA3RDUzMkEyLCAweDBFQjU4RkU0LCAweDI0NDg2NDFDLCAweEU2ODA4OTA1LAorMHg2N0YzRTVDNSwgMHhCRjdGNjY2QywgMHg3RjNDNjU1QywgMHg2RUY2NEYyNiwKKzB4NkNGNjZERjYsIDB4NkFGNjZCRjYsIDB4MDAwQjY5RjYsIDB4RDExRTY4RjYsCisweDYwMTJEMjFFLCAweENCMjBFNDA1LCAweDIxMDJFNTAwLCAweDAwMEIyMjQyLAorMHgwMDAwMjI1MiwgMHgwMDFFMTAxNywgMHgwMDIwMzBCQywgMHgwMDIwMTM1NiwKKzB4MDAyMDJGMUEsIDB4MDAxRTEwMTUsIDB4MDAxRTEwQkYsIDB4MDAxMTc4MDAsCisweDAwMUUxMEZDLCAweDAwMjAwMTcwLCAweDAwMjAyRjIwLCAweDAwMjAyNEJFLAorMHgwMDIwMzBDMCwgMHgwMDIwMTNBMiwgMHgwMDIwMzBEQywgMHgwMDExNzg4QywKKzB4MDAyMDJGMUMsIDB4MDAyMDJCMDAsIDB4MDAyMDEwRUUsIDB4MDAxRTIxMzAsCisweDAwMjAzMEU0LCAweDAwMjAyNDgwLCAweDAwMjAzMEU4LCAweDAwMjAyRjI2LAorMHgwMDIwMkYyRSwgMHgwMDIwMzIyMCwgMHgwMDFDMzUwMCwgMHgwMDFENDAwNCwKKzB4RDU2NUQxNjQsIDB4RTQwMEQ3NjUsIDB4MjE0MkUyMEYsIDB4MTc0MTExNTQsCisweEQ1NjMyNzIyLCAweDk2NjlENzYzLCAweDE1NDEyNTcyLCAweDk2NjYxNTYyLAorMHhFNjAxMTU2NSwgMHhENTYwMTE2NSwgMHg2NjZDRTZGOCwgMHgyNTQyMjU0MiwKKzB4MjU0MjI1NDIsIDB4MjU0MjI1NDIsIDB4MjU2MjI1NDIsIDB4NzYwMUU3MjcsCisweDY3NjMyNTcyLCAweDI1NjI3Nzk3LCAweEU3MDQyNTcyLCAweDI1NzJFMjQ4LAorMHhFMjE5MjUyMiwgMHhFMjcwMjUyMiwgMHgyNTQyMjU0MiwgMHgyNTQyMjU0MiwKKzB4MjUyMjI1NDIsIDB4MjUyMkUyMEMsIDB4MjU0MjI1NDIsIDB4MjU0MjI1NDIsCisweDI1NDIyNTQyLCAweDI1NDIyNTQyLCAweDAwMEIxNTRBLCAweEUyMDgxMTQ1LAorMHgwMDA5NDIyQiwgMHgyRkU2MkZENiwgMHg3RkZDNEYyMiwgMHhDODIwNjA0MywKKzB4NkU0MzhEMDIsIDB4MDAwOUJFNkQsIDB4QzgxMDYwRTMsIDB4QkU2QTg5MDEsCisweDYwRTMwMDA5LCAweDg5MDFDODQwLCAweDAwMDlCRThDLCAweEM4MDE2MEUzLAorMHhERDNFODkzOCwgMHhDODAyNjBEMCwgMHgyRjAwOEQwMywgMHg0NjBCRDYzQywKKzB4NjBGMDAwMDksIDB4ODkwMkM4MDQsIDB4NDYwQkQ2M0EsIDB4NjJGMDAwMDksCisweEM4ODA2MDIzLCAweDYwRDA4OTAyLCAweDJEMDBDOTdGLCAweEM4MDE2MDIzLAorMHhENjM1ODkwNiwgMHgwMDA5NDYwQiwgMHgwMDA5QTAwNywgMHg1MTYzMDYwMSwKKzB4ODkwMkM4MDgsIDB4NDYwQkQ2MzEsIDB4NjBGMDAwMDksIDB4ODkwMkM4MTAsCisweDQyMEJEMjJGLCAweEQ1MkYwMDA5LCAweDg4MDI2MDUyLCAweEQyMkU4QjAzLAorMHhBMDA1RTYwNCwgMHg4ODAxMjI2MCwgMHhEMjJCOEIwMiwgMHgyMjYwRTYwMSwKKzB4MjUyMkUyMDAsIDB4Qzg4MDYwRTMsIDB4RDYyODg5MkUsIDB4NjBFMzZFNjAsCisweDg5MDJDODgwLCAweDQyMEJEMjI2LCAweDYwRTMwMDA5LCAweDg5MDJDODQwLAorMHg0MjBCRDIyNCwgMHg2MEUzMDAwOSwgMHg4OTAyQzgwMiwgMHg0MjBCRDIyMiwKKzB4NjBFMzAwMDksIDB4ODkwRUM4MDQsIDB4NDEwQkQxMjAsIDB4QkYwRTAwMDksCisweEJGNEQwMDA5LCAweEQ1MUUwMDA5LCAweDYwNTBENDFFLCAweEM5MDhENzFFLAorMHhCRjg0MjUwMCwgMHg2MEUzMjQ3MiwgMHg4OTA1QzgwOCwgMHg3RjA0RDIxQiwKKzB4NkVGNjRGMjYsIDB4NkRGNjQyMkIsIDB4NEYyNjdGMDQsIDB4MDAwQjZFRjYsCisweDAwMDA2REY2LCAweDAwMUM1ODFDLCAweEEwMDBBMDAwLCAweDAwMUQwMTAwLAorMHgwMDFENDAwMCwgMHgwMDA0MDAyMSwgMHgwMDFDNTg5QywgMHgwMDFFMTAyMSwKKzB4MDAyMDE1MzYsIDB4MDAyMDE1NTgsIDB4MDAyMDFCOTgsIDB4MDAyMDE1NzAsCisweDAwMjAxNTdFLCAweDAwMjAyRjY0LCAweDAwMUUxMDBCLCAweDAwMUUxMDI4LAorMHgwMDIwMTVENCwgMHgwMDIwMTVFMCwgMHgwMDIwMTU4NiwgMHgwMDIwMTVBNCwKKzB4MDAxRTEwMDAsIDB4MDAxMEYxMDAsIDB4MTIzNDU2NzgsIDB4MDAyMDE1QkMsCisweDY0NENENkE3LCAweDAwMEIzNDZDLCAweEQ2QTYyNDUwLCAweDM0NkM2NDRDLAorMHgyNDUwMDAwQiwgMHg2NDRDRDZBNCwgMHgwMDBCMzQ2QywgMHg2MjVDMjQ1MCwKKzB4NDIwODYxNkQsIDB4NDIwODQxMTksIDB4NDIwMDYwMTksIDB4NjcwRTYxNEMsCisweEQ0OUUzMjFDLCAweDQyMDAyMDdELCAweDMyNENDOTBGLCAweDIyMDAwMDBCLAorMHg0MjA4NjI1QywgMHg0MjAwNDIwOCwgMHgzMjRDNjQ0QywgMHg0MjAwRDQ5OCwKKzB4MDAwQjMyNEMsIDB4MkZFNjIyNjAsIDB4NjE0QzRGMTIsIDB4NDEwMEQ0OTMsCisweDY3MTAzMTRDLCAweEUyOUY2NjZELCAweDI3Mjk0NjE5LCAweDZFNTM2MjY5LAorMHg2NzJFNjU3MywgMHg0MjIxMjI3RCwgMHg0MjIxNDIyMSwgMHg3NjAxNjYyQywKKzB4RTQwMTQ2MDgsIDB4MzRFODQ2MDgsIDB4NjQ0QzQ2MDAsIDB4MDcxQTA0NjcsCisweDIxNTAyNTdCLCAweDAwMEI0RjE2LCAweDRGMjI2RUY2LCAweEQyODU3RkU4LAorMHg4ODAxNjAyMSwgMHhEMjg0OEI3QiwgMHgyNjY4NjYyMSwgMHhEMjgzOEI3NywKKzB4MjY2ODY2MjEsIDB4RTUwRjhCNzMsIDB4RTQwMUJGQTIsIDB4QkZBNEU1MDEsCisweEU1ODZFNDAwLCAweEU0MDA2NTVDLCAweDJGNTBCRkE0LCAweEJGQTFFNDAxLAorMHhFNjAyRTUwNiwgMHg2MDYzNDYxOCwgMHg4MUYyRTQwMSwgMHg2NTQzQkY5RiwKKzB4RTQwMTg1RjIsIDB4QkZBQjY1NDMsIDB4ODVGMjY2MDMsIDB4NjU0M0U0MDEsCisweDY2MDNCRkIxLCAweEU0MDI2NUYwLCAweDYwNTM3NTZDLCAweDgwRjhCRjgwLAorMHhCRjgyRTQwMiwgMHg4NEY4RTUxMiwgMHg3MDkwRTQwMiwgMHg2NTAzQkY4MiwKKzB4NDYxOEU2MDIsIDB4ODFGNjYwNjMsIDB4QkY4MEU0MDIsIDB4ODVGNkU1MDAsCisweDY2MDNFNDAyLCAweEU1MDBCRjhDLCAweEU0MDI4NUY2LCAweEJGOTI2NjAzLAorMHhFNUZFRTUwMCwgMHhFMDEwNjU1QywgMHhCRjYxRTQwMywgMHhFNTEzMEY1NCwKKzB4RTQwRUJGNjMsIDB4MDVGQ0UwMTAsIDB4QkY2M0U0MEUsIDB4RTUwMDc1ODUsCisweEJGNjRFNDAzLCAweEU1MDBFNjQwLCAweEJGNzFFNDAzLCAweEU1MDBFNjQwLAorMHhCRjc4RTQwMywgMHhFNUZGRTY0MCwgMHhFMDE0NjU1QywgMHhCRjQ3RTQwNCwKKzB4RTQwRjBGNTQsIDB4RTUwNEJGNDksIDB4MDVGQ0UwMTQsIDB4QkY0OUU0MEYsCisweEU1MDE3NTg0LCAweEJGNEFFNjQwLCAweEU1MDFFNDA0LCAweEJGNTdFNjQwLAorMHhFNTAxRTQwNCwgMHhFNDA0RTY0MCwgMHhBRjVDN0YxOCwgMHg3RjE4NEYyNiwKKzB4MDAwQjRGMjYsIDB4NEYyMjAwMDksIDB4RDI0MjdGRjAsIDB4ODgwMTYwMjEsCisweEQyNDE4QjcxLCAweDI2Njg2NjIxLCAweEQyNDA4QjZELCAweDI2Njg2NjIxLAorMHhFNTBGOEI2OSwgMHhFNDAxQkYxQywgMHhCRjFFRTUwMSwgMHhFNTg2RTQwMCwKKzB4RTQwMDY1NUMsIDB4MkY1MEJGMUUsIDB4QkYxQkU0MDEsIDB4RTQwMUU1MDYsCisweEJGMUM2NTQzLCAweEU0MDFFNjQwLCAweEJGMjk2NTQzLCAweEU0MDFFNjQwLAorMHhCRjMwNjU0MywgMHg2NUYwRTY0MCwgMHg3NTZDRTQwMiwgMHhCRUZGNjA1MywKKzB4RTQwMjgwRjQsIDB4RTUxMkJGMDEsIDB4RTQwMjg0RjQsIDB4QkYwMTcwOTAsCisweEU2NDA2NTAzLCAweEJGMDJFNDAyLCAweEU2NDBFNTAwLCAweEJGMEZFNDAyLAorMHhFNjQwRTUwMCwgMHhCRjE2RTQwMiwgMHhFNUZFRTUwMCwgMHg2MDUzNjU1QywKKzB4QkVFNUU0MDMsIDB4RTUxMzgwRjgsIDB4RTQwRUJFRTcsIDB4RTQwRTg0RjgsCisweEJFRTc3MDg1LCAweEU1MDA2NTAzLCAweEJFRThFNjQwLCAweEU1MDBFNDAzLAorMHhCRUY1RTY0MCwgMHhFNTAwRTQwMywgMHhCRUZDRTY0MCwgMHhFNUZGRTQwMywKKzB4NjA1MzY1NUMsIDB4QkVDQkU0MDQsIDB4RTQwRjgwRkMsIDB4RTUwNEJFQ0QsCisweEU0MEY4NEZDLCAweEJFQ0Q3MDgzLCAweEU1MDE2NTAzLCAweEJFQ0VFNjQwLAorMHhFNTAxRTQwNCwgMHhCRURCRTY0MCwgMHhFNTAxRTQwNCwgMHhFNDA0RTY0MCwKKzB4QUVFMDdGMTAsIDB4N0YxMDRGMjYsIDB4MDAwQjRGMjYsIDB4MDAwMDAwMDksCisweDAwMUUxMDJGLCAweDAwMUUxMDgwLCAweDAwMUUxMDkwLCAweDAwMUUxMDNGLAorMHgwMDFFMTAzRSwgMHgwMDIwMkY1RSwgMHgwMDIwMkY2MCwgMHgwMDIwMkY2MiwKKzB4RDIxREQxMUMsIDB4NjYyMDYwMTAsIDB4Njc2QzcwMDEsIDB4MzcwMEM5MEYsCisweEU1MDA4RDEzLCAweDY3MTA2MjEwLCAweDc3MDE2MjJDLCAweDY0MjMyMTcwLAorMHhENjE2NjAxMCwgMHg0NDA4NDQwOCwgMHgzNDI4QzkwRiwgMHg2MjYwMjEwMCwKKzB4NzIwMUQ1MTMsIDB4NDQwODI2MjAsIDB4MDAwQjM1NEMsIDB4RDEwRjYwNTMsCisweDI1NTg2NTEwLCAweEU2MDA4RDEzLCAweEQ2MERENDBCLCAweDY1NUM2NTQwLAorMHg0NzA4Njc1MywgMHgzNzU4NDcwOCwgMHg0NzA4NjU0MCwgMHgyNDUwNzUwMSwKKzB4MzY3QzYwNDAsIDB4MjQwMEM5MEYsIDB4NzJGRjYyMTAsIDB4MDAwQjIxMjAsCisweDAwMDA2MDYzLCAweDAwMjAyRjE5LCAweDAwMjAyRjE4LCAweDAwMjAyRjFBLAorMHgwMDIwMkI0MCwgMHg3RkZDNEYyMiwgMHhFNjgwRDFBOCwgMHg2NjZDNjIxMiwKKzB4RDJBNzJGMjIsIDB4NjdGMzY1NjMsIDB4NDIwQjc1NDIsIDB4N0YwNEU0MDQsCisweDAwMEI0RjI2LCAweEU2ODAwMDA5LCAweEQyQTE2NjZDLCAweEU3MDA2NTYzLAorMHg0MjJCNzU0MCwgMHhFNjgwNjQ3MywgMHhEMjlENjY2QywgMHhFNzAwNjU2MywKKzB4NDIyQjc1NDMsIDB4MkZCNjY0NzMsIDB4MkZENjJGQzYsIDB4NEYyMjJGRTYsCisweDREMThFRDAxLCAweERCOThEQzk3LCAweDY1QzI1MkMxLCAweDg5MjAzNTIwLAorMHhDOTAzNjA1MSwgMHg4OTFDODgwMSwgMHhEMTk0REU5MiwgMHg2NEUzNDEwQiwKKzB4ODUwMzY1MDMsIDB4NjcwRDY2QjIsIDB4ODkwNzM3NjIsIDB4RDI5MUQ0OTAsCisweDAwMDk0MjBCLCAweEU3MDFEMTkwLCAweDIxNzJBRkU2LCAweERFOEY2NEUzLAorMHgwMDA5NEUwQiwgMHhENDhGRDY4RSwgMHg0MTBCRDE4RiwgMHhBRkRCMjZEMiwKKzB4NEYyNjAwMDksIDB4NkRGNjZFRjYsIDB4MDAwQjZDRjYsIDB4NEYyMjZCRjYsCisweDg1NDY3RkY0LCAweDJGMDFFNjgxLCAweDY2NkM4NTQ3LCAweDg1NDg4MUYxLAorMHg4MUYyRDI3QiwgMHg2N0YzODU0MiwgMHg4NTQzODFGMywgMHg4MUY0RTQwQywKKzB4NjU2MzYwNTMsIDB4NDIwQjgxRjUsIDB4N0YwQzc1NDAsIDB4MDAwQjRGMjYsCisweDJGODYwMDA5LCAweDJGQTYyRjk2LCAweDJGQzYyRkI2LCAweDJGRTYyRkQ2LAorMHg3RkVDNEYyMiwgMHhFMDAwRDE3NiwgMHhENDc4MkYxMiwgMHg4MUYyNjEwMywKKzB4REM3NzFGNDIsIDB4RDY3NzZCMTMsIDB4RTAwMTRCMDgsIDB4NDYwQkRFNzYsCisweDNCRUM0QjAwLCAweDY2QzIxRjAzLCAweDM2MjA1MkMxLCAweEExODE4QjAxLAorMHg2MDYxMDAwOSwgMHg4ODAxQzkwMywgMHhBMTdCOEIwMSwgMHg4NTYxMDAwOSwKKzB4OEIwMUM4MDEsIDB4MDAwOUEwODAsIDB4ODVEMjVENjMsIDB4QzkwMzY2MDMsCisweDg1RDM2NDAzLCAweDYwNTM2NTBELCAweDQwMjE0MDIxLCAweDQ1MDBDOTNGLAorMHgzMjJBNjEwMywgMHg2MDUzMjUyRCwgMHhDOTAxRTUxMCwgMHhEOTVFMzE1MywKKzB4NkUwMzhEMjEsIDB4NDQwOEQ3NjEsIDB4NDQwODY4NzAsIDB4NDQwMDYyMTMsCisweDI4ODg0MjAwLCAweDM0MkM4RjBFLCAweDYwNDNEMjVELCAweDYwRTMwNzJELAorMHg0QTE5NkE3RCwgMHg2NThFNjhBOSwgMHgyODVEODgwMSwgMHg2QTdDOEYwQiwKKzB4NkExM0EwMDksIDB4NjA0M0QyNTcsIDB4NjFFRDBFMkQsIDB4NjgxOTQxMTksCisweDI4N0Q2NzhFLCAweEQxNTQ2QUVDLCAweDIyMjg2MjEwLCAweEVBRkY4OTAxLAorMHhFRUZGNkFBQywgMHg2RUVDNjVBRCwgMHg4QjBGMzVFMCwgMHg0RDBCREQzRiwKKzB4NTQwMzY0QzMsIDB4QkY3MkU1MDIsIDB4RDQ0QzZEMDMsIDB4NDEwQkQxM0YsCisweEQ3NEI2NUQzLCAweEQ0NEJFRTAxLCAweDI3RTJBMDI1LCAweDI2NzlFN0ZDLAorMHg4MUQyNjA2MywgMHg5NDYwODVEMywgMHg2MTAzMjA0OSwgMHg0NTA4MjY4QiwKKzB4MjUxQjYwNjMsIDB4NjA1MzgxRDIsIDB4ODVENDgxRDMsIDB4NDExOEUxMDgsCisweDgxRDQyMDFCLCAweEVFMDI2MkMyLCAweDIwNzk4NTIxLCAweDY0QzI4MTIxLAorMHg2MDQxNjc4RCwgMHhDQjAxMzdFMywgMHgyNDAxOEQwNCwgMHhFRUU3ODVEMiwKKzB4ODFEMjIwRTksIDB4NDkwQkQ0MzgsIDB4NjBDMjAwMDksIDB4NTJGMzY2RjIsCisweDJCMDJDQjAxLCAweDI2MjJBRjZGLCAweEQyMjA4NTYxLCAweDhGMDJDODAyLAorMHhBMEQyNjRDMywgMHg0MjBCMDAwOSwgMHhEOTMwMDAwOSwgMHg1RTAzNjUwMywKKzB4MDc5RUUwNEMsIDB4NzcwMUREMkUsIDB4NjlEMjA5NzYsIDB4NzkwMUQ2MjYsCisweDZENjAyRDkyLCAweDg5MDYyREQ4LCAweEQyMThENDI0LCAweEVEMDE0MjBCLAorMHhBMEIzRDcyMywgMHg2MjUxMjdEMiwgMHg0MTE4RTEwRiwgMHgyMjE5RTQwMiwKKzB4MzI0MDQ0MTgsIDB4ODU1MThCNDYsIDB4MjBEOUVERkMsIDB4NjA1MTgxNTEsCisweENCMDE3REUzLCAweDg1RTEyNTAxLCAweDIwRDlENjBBLCAweDQ2MEI4MUUxLAorMHg2OUYyNjRDMywgMHhBMDk5NTdGMywgMHg3RTAzMjk3MiwgMHgwMDFDM0Q5QywKKzB4MDAyMDFFMzgsIDB4MDAyMDJCMzgsIDB4MDAyMDJGMDAsIDB4MDAyMDEwNkMsCisweDAwMjAyQjAwLCAweDAwMjAxMEVFLCAweDAwMUUyMTMwLCAweDAwMjAxMDhBLAorMHgwMDFDM0QzMCwgMHgwMDIwMzIwMCwgMHgwMDIwMTM1NiwgMHgwMDIwMzIwQywKKzB4MDAyMDJCMTAsIDB4MDAyMDI5RjgsIDB4MDAxQzNEMDAsIDB4MDAyMDMyMUMsCisweDAwMjAzMTAwLCAweDAwMjAzMTgwLCAweDAwMjAyRjE0LCAweDAwMjAyQjA4LAorMHgwMDFFMjEyQywgMHgwMDIwMzIwNCwgMHgwMDIwMzIwOCwgMHgwMDIwMkFBNCwKKzB4MDAyMDMyMjAsIDB4NkRERDZENTEsIDB4NkREOTREMTksIDB4MkQ2RDY2REUsCisweDYwREM3RDAxLCAweDQxMTg2MTAzLCAweDhGNDU4ODAxLCAweEQ2NUIyNTExLAorMHg3NDAxNjQ2MiwgMHg4NUUzMjY0MiwgMHg2MDYzNjYwRCwgMHg0MDIxNDAyMSwKKzB4NDYwMEM5M0YsIDB4MzIyQTZEMDMsIDB4NjA2MzI2MkQsIDB4RDE1NEM4MDEsCisweDg5MDFEOTU0LCAweDJENkI5NkExLCAweEUwMTBFNjAwLCAweDY0REQwRjY0LAorMHgwN0ZDRTAxMCwgMHg0MDAwNjA3QywgMHg2MjJEMDIxRCwgMHg4RDEyMzI0MCwKKzB4NjA2MzY2MDMsIDB4RTdGRjAyMUQsIDB4OEIwMTMyNzAsIDB4MDFENUEwMEIsCisweDAyRkNFMDEwLCAweDcyMDFFNjA0LCAweDYyMkMwRjI0LCAweDhCRTczMjYyLAorMHg2NjZDMDZGQywgMHg2MDYzNDYwMCwgMHg3MTAxMDE5RCwgMHhEMTQyMDkxNSwKKzB4Njk3RDY3MTEsIDB4ODkwNzM5NDAsIDB4NjAyRDYyMTEsIDB4ODkwMzg4RkYsCisweEREM0UyMUQxLCAweDJEMjBFMjAxLCAweEVERkM4NTUxLCAweDgxNTEyMEQ5LAorMHhEMjNCNjA1MSwgMHg2NEMzQ0IwMSwgMHgyNTAxNDIwQiwgMHgwMkZDRTAxMCwKKzB4NjEyQ0Q0MzgsIDB4NDQwQkUwMDEsIDB4MjcwMjY3RjIsIDB4RDIzNjg1RUYsCisweDQyMEI1NEYyLCAweEFFOTY2NTBELCAweDQyMEIwMDA5LCAweDU0MDMwMDA5LAorMHg4NTQ0NkUwMywgMHg0RDE4RUQwOCwgMHgzMEQwMjBEOSwgMHhCRTU2OEIwMywKKzB4QTAwN0U1MDEsIDB4ODU0MTAwMDksIDB4NjIwREREMkMsIDB4ODkwMTIyRDgsCisweEU1MDBCRTRELCAweEQyMkJENDJBLCAweDY1RTM0MjBCLCAweEVEMDFENzJBLAorMHgyN0QyQUU3OSwgMHhFRTA0ODVGMiwgMHg2MTBENzAwMSwgMHg4MUYyMzFFNywKKzB4N0MwODhEMDIsIDB4MDAwOUFFNjYsIDB4NEYyNjdGMTQsIDB4NkRGNjZFRjYsCisweDZCRjY2Q0Y2LCAweDY5RjY2QUY2LCAweDY4RjYwMDBCLCAweDRGMjIyRkU2LAorMHg2RTIyRDIxRSwgMHhDODQwNjBFMywgMHgyMkUyOEQwMiwgMHgwMDA5QkREMiwKKzB4NDIxOEUyNDAsIDB4ODkwMTJFMjgsIDB4MDAwOUJEREQsIDB4QzgxMDYwRTMsCisweEQ0MTc4OTA1LCAweDQyMEJEMjE3LCAweEJEREMwMDA5LCAweDYwRTMwMDA5LAorMHg4OTAxQzgwNSwgMHgwMDA5QkUyRCwgMHhDODAyNjBFMywgMHg0RjI2ODkwMiwKKzB4NkVGNkFERDksIDB4MDAwQjRGMjYsIDB4ODAwMDZFRjYsIDB4MDAyMDMyMjAsCisweDAwMjAyRjI2LCAweDAwMjAyRjJFLCAweDAwMjAyRjIyLCAweDAwMjAyRjI0LAorMHgwMDIwMTBFRSwgMHgwMDIwMjlGOCwgMHgwMDIwMTNBMiwgMHgwMDAwODAwMCwKKzB4MDAyMDJCMDgsIDB4MDAyMDEwOEEsIDB4MDAxRTIxMkMsIDB4MDAxQzM1MTAsCisweDAwMjAzMjE0LCAweDAwMjAxMzU2LCAweDA4MEEwQzBFLCAweDAwMDIwNDA2LAorMHgxQTFDMUUyMCwgMHgxMjE0MTYxOCwgMHgyRTMwMzIzNCwgMHgyNjI4MkEyQywKKzB4M0EzQzNFNDAsIDB4NkM2MjU2NDgsIDB4NDExMTJGMjYsIDB4RTIyMDhGMTgsCisweDg5MEIzMTIzLCAweDMyMUNEMjA0LCAweEQxMDI2MjIwLCAweDQxMkIzMTJDLAorMHgwMDA5MDAwOSwgMHgwMDIwMkEyMiwgMHgwMDIwMjlEOCwgMHgwMDBCRTAwMCwKKzB4NDAwMDYyRjYsIDB4NDAwMDQwMDAsIDB4NDAwMDQwMDAsIDB4NDAwMDQwMDAsCisweDYyRjYwMDBCLCAweDQwMDA0MDAwLCAweDQwMDA0MDAwLCAweDQwMDA0MDAwLAorMHg0MDE4NDAwMCwgMHg2MkY2MDAwQiwgMHg0MDAwNDAwMCwgMHg0MDAwNDAwMCwKKzB4NDAwMDQwMDAsIDB4NDAyODQwMDAsIDB4NjJGNjAwMEIsIDB4NDAwMDQwMDAsCisweDQwMTg0MDAwLCAweDAwMEI0MDI4LCAweEM5MEY2MkY2LCAweDQwMDU0MDA1LAorMHg0MDA1NDAwNSwgMHg2MkY2MDAwQiwgMHg0MDA1QzkwNywgMHg0MDA1NDAwNSwKKzB4NjJGNjAwMEIsIDB4NDAwNUM5MDMsIDB4MDAwQjQwMDUsIDB4QzkwMTYyRjYsCisweDAwMEI0MDA1LCAweDAwMDA2MkY2LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4NTQ0RjBEMEEsIDB4NDYyMDUzNTUsIDB4MDAwMDNBNTcsIDB4MjA2MzY1NDQsCisweDMyMjAzMjMxLCAweDIwMzczMDMwLCAweDMzM0EzMTMyLCAweDM0MzIzQTM2LAorMHgwMDAwMDAwMCwgMHgwMDAwMEQwQSwgMHgwMDAwMDA0MywgMHg0MjcwNzM3MiwKKzB4M0QyMDY2NzUsIDB4NTU0RTIwM0QsIDB4MjAyQzRDNEMsIDB4NkU0OTY3N0EsCisweDRFNDk3Mjc0LCAweDZENzU0RTUxLCAweDAwMDAwMDNELCAweDYxNzY2RTQ5LAorMHgyMDY0Njk2QywgMHg3MjY1NzM3NSwgMHgyMDcyNkYyMCwgMHgyMDc5NjU2QiwKKzB4MDAyMTQ0NDksIDB4NTI1MDQ1NDUsIDB4NTcyMDRENEYsIDB4NjU3NDY5NzIsCisweDY0NjEyMDJDLCAweDAwM0Q3MjY0LCAweDZDNjE3NjIwLCAweDAwMDAwMDNELAorMHgwMDAwMEEwRCwgMHg2RTZCNkU1NSwgMHgyMDZFNzc2RiwgMHg2RDZENkY2MywKKzB4M0Q2NDZFNjEsIDB4MDAwMDAwMDAsIDB4MDAwQTBENTIsIDB4MjAzQTMwNTEsCisweDAwMDAwMDIwLCAweDIwM0EzMTUxLCAweDAwMDAwMDIwLCAweDIwM0EzMjUxLAorMHgwMDAwMDAyMCwgMHgyMDNBMzM1MSwgMHgwMDAwMDAyMCwgMHgyMDNBMzQ1MSwKKzB4MDAwMDAwMjAsIDB4NjE0Mzc3NDgsIDB4NzI2MjY5NkMsIDB4NkY2OTc0NjEsCisweDY2MjAyMDZFLCAweDBBNkM2OTYxLCAweDAwMDAwMDBELCAweDczNjk2RjRFLAorMHg2MTQzMjA2NSwgMHg3MjYyNjk2QywgMHg2RjY5NzQ2MSwgMHg2MTY2MjA2RSwKKzB4MjEyMTZDNjksIDB4MDAwMDBEMEEsIDB4MDAwMDAwNzIsIDB4MDAyMDUyMjAsCisweDAwMDAwRDBBLCAweDYyNzM1NTc2LCAweDc0NzM3MjVGLCAweDAwMDAwQTBELAorMHg2MjczNTU3NiwgMHg3Mzc1NzM1RiwgMHg2NDZFNjU3MCwgMHgwMDAwMEEwRCwKKzB4NjI3MzU1NzYsIDB4NzM2NTcyNUYsIDB4MDAwQTBENkQsIDB4MDAwMDAwNDIsCisweDcyNzQ2RTQ5LCAweDZENjUyMDUxLCAweDJDNzk3NDcwLCAweDQ5Njc3QTIwLAorMHg0OTcyNzQ2RSwgMHg3NTRFNTE0RSwgMHgwMDAwM0Q2RCwgMHg2NTRDNzI0NSwKKzB4MDAwMDAwNkUsIDB4MDAwMDAwNDksIDB4MjA3NDZGNEUsIDB4NzU2RjZFNjUsCisweDQ5MjA2ODY3LCAweDQyMjA1MTRFLCAweDBBMEQ2Njc1LCAweDAwMDAwMDAwLAorMHgwMDAwMDBGRiwgMHgwMDAyMDAwMSwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMTBFMDEwRCwgMHgwMDAyMDAwMywgMHgwMTA5MDEwOCwgMHgwMDAyMDEwQSwKKzB4MDIwMDAwMDMsIDB4MDIwMjAyMDEsIDB4MDIwNDAyMDMsIDB4MDIwNjAyMDUsCisweDAyMDIwMjAwLCAweDAyMDQwMjAzLCAweDAyMEMwMjA3LCAweDAyMEUwMjBELAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAxMEUwMTBELCAweDAwRkYwMTBGLCAweDAxMDkwMTA4LCAweDAxMEIwMTBBLAorMHgwMjAwMDBGRiwgMHgwMjAyMDIwMSwgMHgwMjA0MDIwMywgMHgwMjA2MDIwNSwKKzB4MDIwMjAyMDAsIDB4MDIwNDAyMDMsIDB4MDIwQzAyMEIsIDB4MDIwRTAyMEQsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDAyMDUyMjAsIDB4MDAwMDAwNDYsIDB4MDAwMDAwNTksIDB4NzMyMDQxNDIsCisweDAwM0Q3MTY1LCAweDQ5NTQ0MTIwLCAweDAwMDAyMDRELCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDJFMDIwOSwgMHg4MDAwMDEwMSwgMHgwMDA0MDlGQSwKKzB4MDBGRjA0MDAsIDB4MDUwNzAwMDAsIDB4MDIwMDAyMDEsIDB4ODIwNTA3MDAsCisweDAwMDIwMDAyLCAweDAzODMwNTA3LCAweDA3MDEwMDQwLCAweDQwMDIwNDA1LAorMHgwMjA5MDAwMCwgMHgwMTAxMDAyRSwgMHgwOUZBODAwMCwgMHgwNDAwMDAwNCwKKzB4MDAwMDAwRkYsIDB4MDIwMTA1MDcsIDB4MDcwMDAwNDAsIDB4NDAwMjgyMDUsCisweDA1MDcwMDAwLCAweDAwNDAwMzgzLCAweDA0MDUwNzAxLCAweDAwMDA0MDAyLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwNzA5MDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgfTsKKworY29uc3QgdTMyX3QgemNES0Z3SW1hZ2VTaXplPTEyOTg4OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvaGFsL2hwYW5pLmMgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy9oYWwvaHBhbmkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTk1YjVkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvaGFsL2hwYW5pLmMKQEAgLTAsMCArMSw3MzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBBdGhlcm9zIENvbW11bmljYXRpb25zIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworI2luY2x1ZGUgIi4uLzgwMjExY29yZS9jcHJlY29tcC5oIgorI2luY2x1ZGUgImhwYW5pLmgiCisjaW5jbHVkZSAiaHB1c2IuaCIKKworCitleHRlcm4gdTE2X3QgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoemRldl90KiBkZXYsIHUzMl90IGFkZHIsIHUzMl90IHZhbCk7CitleHRlcm4gdTE2X3QgemZGbHVzaERlbGF5V3JpdGUoemRldl90KiBkZXYpOworCisvKgorICogQW50aSBub2lzZSBpbW11bml0eSBzdXBwb3J0LiAgV2UgdHJhY2sgcGh5IGVycm9ycyBhbmQgcmVhY3QKKyAqIHRvIGV4Y2Vzc2l2ZSBlcnJvcnMgYnkgYWRqdXN0aW5nIHRoZSBub2lzZSBpbW11bml0eSBwYXJhbWV0ZXJzLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBOZXcgQW5pIEFsZ29yaXRobSBmb3IgU3RhdGlvbiBzaWRlIG9ubHkKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgWk1fSEFMX05PSVNFX0lNTVVORV9NQVggICAgIDQgICAvKiBNYXggbm9pc2UgaW1tdW5pdHkgbGV2ZWwgKi8KKyNkZWZpbmUgWk1fSEFMX1NQVVJfSU1NVU5FX01BWCAgICAgIDcgICAvKiBNYXggc3B1ciBpbW11bml0eSBsZXZlbCAqLworI2RlZmluZSBaTV9IQUxfRklSU1RfU1RFUF9NQVggICAgICAgMiAgIC8qIE1heCBmaXJzdCBzdGVwIGxldmVsICovCisKKyNkZWZpbmUgWk1fSEFMX0FOSV9PRkRNX1RSSUdfSElHSCAgICAgICA1MDAKKyNkZWZpbmUgWk1fSEFMX0FOSV9PRkRNX1RSSUdfTE9XICAgICAgICAyMDAKKyNkZWZpbmUgWk1fSEFMX0FOSV9DQ0tfVFJJR19ISUdIICAgICAgICAyMDAKKyNkZWZpbmUgWk1fSEFMX0FOSV9DQ0tfVFJJR19MT1cgICAgICAgICAxMDAKKyNkZWZpbmUgWk1fSEFMX0FOSV9OT0lTRV9JTU1VTkVfTFZMICAgICA0CisjZGVmaW5lIFpNX0hBTF9BTklfVVNFX09GRE1fV0VBS19TSUcgICAgVFJVRQorI2RlZmluZSBaTV9IQUxfQU5JX0NDS19XRUFLX1NJR19USFIgICAgIEZBTFNFCisjZGVmaW5lIFpNX0hBTF9BTklfU1BVUl9JTU1VTkVfTFZMICAgICAgNworI2RlZmluZSBaTV9IQUxfQU5JX0ZJUlNURVBfTFZMICAgICAgICAgIDAKKyNkZWZpbmUgWk1fSEFMX0FOSV9SU1NJX1RIUl9ISUdIICAgICAgICA0MAorI2RlZmluZSBaTV9IQUxfQU5JX1JTU0lfVEhSX0xPVyAgICAgICAgIDcKKyNkZWZpbmUgWk1fSEFMX0FOSV9QRVJJT0QgICAgICAgICAgICAgICAxMDAKKworI2RlZmluZSBaTV9IQUxfRVBfUk5EKHgsIG11bCkgXAorICAgICgoKCh4KSUobXVsKSkgPj0gKChtdWwpLzIpKSA/ICgoeCkgKyAoKG11bCkgLSAxKSkgLyAobXVsKSA6ICh4KS8obXVsKSkKKworczMyX3QgQkVBQ09OX1JTU0koemRldl90KiBkZXYpCit7CisgICAgczMyX3QgcnNzaTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHN0cnVjdCB6c0hwUHJpdiAqSHBQcml2ID0gKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZTsKKworICAgIHJzc2kgPSBaTV9IQUxfRVBfUk5EKEhwUHJpdi0+c3RhdHMuYXN0X25vZGVzdGF0cy5uc19hdmdicnNzaSwgWk1fSEFMX1JTU0lfRVBfTVVMVElQTElFUik7CisKKyAgICByZXR1cm4gcnNzaTsKK30KKworLyoKKyAqIFNldHVwIEFOSSBoYW5kbGluZy4gIFNldHMgYWxsIHRocmVzaG9sZHMgYW5kIGxldmVscyB0byBkZWZhdWx0IGxldmVsIEFORAorICogcmVzZXRzIHRoZSBjaGFubmVsIHN0YXRpc3RpY3MKKyAqLworCit2b2lkIHpmSHBBbmlBdHRhY2goemRldl90KiBkZXYpCit7CisjZGVmaW5lIE4oYSkgICAgIChzaXplb2YoYSkgLyBzaXplb2YoYVswXSkpCisgICAgdTMyX3QgaTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHN0cnVjdCB6c0hwUHJpdiAqSHBQcml2ID0gKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZTsKKworICAgIGNvbnN0IGludCB0b3RhbFNpemVEZXNpcmVkW10gPSB7IC01NSwgLTU1LCAtNTUsIC01NSwgLTYyIH07CisgICAgY29uc3QgaW50IGNvYXJzZUhpZ2hbXSAgICAgICA9IHsgLTE0LCAtMTQsIC0xNCwgLTE0LCAtMTIgfTsKKyAgICBjb25zdCBpbnQgY29hcnNlTG93W10gICAgICAgID0geyAtNjQsIC02NCwgLTY0LCAtNjQsIC03MCB9OworICAgIGNvbnN0IGludCBmaXJwd3JbXSAgICAgICAgICAgPSB7IC03OCwgLTc4LCAtNzgsIC03OCwgLTgwIH07CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKQorICAgIHsKKyAgICAgICAgSHBQcml2LT50b3RhbFNpemVEZXNpcmVkW2ldID0gdG90YWxTaXplRGVzaXJlZFtpXTsKKyAgICAgICAgSHBQcml2LT5jb2Fyc2VIaWdoW2ldID0gY29hcnNlSGlnaFtpXTsKKyAgICAgICAgSHBQcml2LT5jb2Fyc2VMb3dbaV0gPSBjb2Fyc2VMb3dbaV07CisgICAgICAgIEhwUHJpdi0+ZmlycHdyW2ldID0gZmlycHdyW2ldOworICAgIH0KKworICAgIC8qIG93bCBoYXMgcGh5IGNvdW50ZXJzICovCisgICAgSHBQcml2LT5oYXNId1BoeUNvdW50ZXJzID0gMTsKKworICAgIG1lbXNldCgoY2hhciAqKSZIcFByaXYtPmFuaSwgMCwgc2l6ZW9mKEhwUHJpdi0+YW5pKSk7CisgICAgZm9yIChpID0gMDsgaSA8IE4od2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWwpOyBpKyspCisgICAgeworICAgICAgICAvKiBOZXcgQU5JIHN0dWZmICovCisgICAgICAgIEhwUHJpdi0+YW5pW2ldLm9mZG1UcmlnSGlnaCA9IFpNX0hBTF9BTklfT0ZETV9UUklHX0hJR0g7CisgICAgICAgIEhwUHJpdi0+YW5pW2ldLm9mZG1UcmlnTG93ID0gWk1fSEFMX0FOSV9PRkRNX1RSSUdfTE9XOworICAgICAgICBIcFByaXYtPmFuaVtpXS5jY2tUcmlnSGlnaCA9IFpNX0hBTF9BTklfQ0NLX1RSSUdfSElHSDsKKyAgICAgICAgSHBQcml2LT5hbmlbaV0uY2NrVHJpZ0xvdyA9IFpNX0hBTF9BTklfQ0NLX1RSSUdfTE9XOworICAgICAgICBIcFByaXYtPmFuaVtpXS5yc3NpVGhySGlnaCA9IFpNX0hBTF9BTklfUlNTSV9USFJfSElHSDsKKyAgICAgICAgSHBQcml2LT5hbmlbaV0ucnNzaVRockxvdyA9IFpNX0hBTF9BTklfUlNTSV9USFJfTE9XOworICAgICAgICBIcFByaXYtPmFuaVtpXS5vZmRtV2Vha1NpZ0RldGVjdE9mZiA9ICFaTV9IQUxfQU5JX1VTRV9PRkRNX1dFQUtfU0lHOworICAgICAgICBIcFByaXYtPmFuaVtpXS5jY2tXZWFrU2lnVGhyZXNob2xkID0gWk1fSEFMX0FOSV9DQ0tfV0VBS19TSUdfVEhSOworICAgICAgICBIcFByaXYtPmFuaVtpXS5zcHVySW1tdW5pdHlMZXZlbCA9IFpNX0hBTF9BTklfU1BVUl9JTU1VTkVfTFZMOworICAgICAgICBIcFByaXYtPmFuaVtpXS5maXJzdGVwTGV2ZWwgPSBaTV9IQUxfQU5JX0ZJUlNURVBfTFZMOworICAgICAgICBpZiAoSHBQcml2LT5oYXNId1BoeUNvdW50ZXJzKQorICAgICAgICB7CisgICAgICAgICAgICBIcFByaXYtPmFuaVtpXS5vZmRtUGh5RXJyQmFzZSA9IDA7Ly9BUl9QSFlfQ09VTlRNQVggLSBaTV9IQUxfQU5JX09GRE1fVFJJR19ISUdIOworICAgICAgICAgICAgSHBQcml2LT5hbmlbaV0uY2NrUGh5RXJyQmFzZSA9IDA7Ly9BUl9QSFlfQ09VTlRNQVggLSBaTV9IQUxfQU5JX0NDS19UUklHX0hJR0g7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKEhwUHJpdi0+aGFzSHdQaHlDb3VudGVycykKKyAgICB7CisgICAgICAgIC8vem1fZGVidWdfbXNnMigiU2V0dGluZyBPZmRtRXJyQmFzZSA9IDB4IiwgSHBQcml2LT5hbmlbMF0ub2ZkbVBoeUVyckJhc2UpOworICAgICAgICAvL3ptX2RlYnVnX21zZzIoIlNldHRpbmcgY2NrRXJyQmFzZSA9IDB4IiwgSHBQcml2LT5hbmlbMF0uY2NrUGh5RXJyQmFzZSk7CisgICAgICAgIC8vT1NfUkVHX1dSSVRFKGFoLCBBUl9QSFlfRVJSXzEsIEhwUHJpdi0+YW5pWzBdLm9mZG1QaHlFcnJCYXNlKTsKKyAgICAgICAgLy9PU19SRUdfV1JJVEUoYWgsIEFSX1BIWV9FUlJfMiwgSHBQcml2LT5hbmlbMF0uY2NrUGh5RXJyQmFzZSk7CisgICAgfQorICAgIEhwUHJpdi0+YW5pUGVyaW9kID0gWk1fSEFMX0FOSV9QRVJJT0Q7CisgICAgLy9pZiAoYXRoX2hhbF9lbmFibGVBTkkpCisgICAgSHBQcml2LT5wcm9jUGh5RXJyIHw9IFpNX0hBTF9QUk9DRVNTX0FOSTsKKworICAgIEhwUHJpdi0+c3RhdHMuYXN0X25vZGVzdGF0cy5uc19hdmdicnNzaSA9IFpNX1JTU0lfRFVNTVlfTUFSS0VSOworICAgIEhwUHJpdi0+c3RhdHMuYXN0X25vZGVzdGF0cy5uc19hdmdyc3NpID0gWk1fUlNTSV9EVU1NWV9NQVJLRVI7CisgICAgSHBQcml2LT5zdGF0cy5hc3Rfbm9kZXN0YXRzLm5zX2F2Z3R4cnNzaSA9IFpNX1JTU0lfRFVNTVlfTUFSS0VSOworI3VuZGVmIE4KK30KKworLyoKKyAqIENvbnRyb2wgQWRhcHRpdmUgTm9pc2UgSW1tdW5pdHkgUGFyYW1ldGVycworICovCit1OF90IHpmSHBBbmlDb250cm9sKHpkZXZfdCogZGV2LCBaTV9IQUxfQU5JX0NNRCBjbWQsIGludCBwYXJhbSkKK3sKKyNkZWZpbmUgTihhKSAoc2l6ZW9mKGEpL3NpemVvZihhWzBdKSkKKyAgICB0eXBlZGVmIHMzMl90IFRBQkxFW107CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBzdHJ1Y3QgenNIcFByaXYgKkhwUHJpdiA9IChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGU7CisKKyAgICBzdHJ1Y3QgenNBbmlTdGF0ZSAqYW5pU3RhdGUgPSBIcFByaXYtPmN1cmFuaTsKKworICAgIHN3aXRjaCAoY21kKQorICAgIHsKKyAgICBjYXNlIFpNX0hBTF9BTklfTk9JU0VfSU1NVU5JVFlfTEVWRUw6CisgICAgeworICAgICAgICB1MzJfdCBsZXZlbCA9IHBhcmFtOworCisgICAgICAgIGlmIChsZXZlbCA+PSBOKEhwUHJpdi0+dG90YWxTaXplRGVzaXJlZCkpCisgICAgICAgIHsKKyAgICAgICAgICB6bV9kZWJ1Z19tc2cxKCJsZXZlbCBvdXQgb2YgcmFuZ2UsIGRlc2lyZWQgbGV2ZWwgOiAiLCBsZXZlbCk7CisgICAgICAgICAgem1fZGVidWdfbXNnMSgibWF4IGxldmVsIDogIiwgTihIcFByaXYtPnRvdGFsU2l6ZURlc2lyZWQpKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIEFSX1BIWV9ERVNJUkVEX1NaLAorICAgICAgICAgICAgICAgIChIcFByaXYtPnJlZ1BIWURlc2lyZWRTWiAmIH5BUl9QSFlfREVTSVJFRF9TWl9UT1RfREVTKQorICAgICAgICAgICAgICAgIHwgKChIcFByaXYtPnRvdGFsU2l6ZURlc2lyZWRbbGV2ZWxdIDw8IEFSX1BIWV9ERVNJUkVEX1NaX1RPVF9ERVNfUykKKyAgICAgICAgICAgICAgICAmIEFSX1BIWV9ERVNJUkVEX1NaX1RPVF9ERVMpKTsKKyAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBBUl9QSFlfQUdDX0NUTDEsCisgICAgICAgICAgICAgICAgKEhwUHJpdi0+cmVnUEhZQWdjQ3RsMSAmIH5BUl9QSFlfQUdDX0NUTDFfQ09BUlNFX0xPVykKKyAgICAgICAgICAgICAgICB8ICgoSHBQcml2LT5jb2Fyc2VMb3dbbGV2ZWxdIDw8IEFSX1BIWV9BR0NfQ1RMMV9DT0FSU0VfTE9XX1MpCisgICAgICAgICAgICAgICAgJiBBUl9QSFlfQUdDX0NUTDFfQ09BUlNFX0xPVykpOworICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIEFSX1BIWV9BR0NfQ1RMMSwKKyAgICAgICAgICAgICAgICAoSHBQcml2LT5yZWdQSFlBZ2NDdGwxICYgfkFSX1BIWV9BR0NfQ1RMMV9DT0FSU0VfSElHSCkKKyAgICAgICAgICAgICAgICB8ICgoSHBQcml2LT5jb2Fyc2VIaWdoW2xldmVsXSA8PCBBUl9QSFlfQUdDX0NUTDFfQ09BUlNFX0hJR0hfUykKKyAgICAgICAgICAgICAgICAmIEFSX1BIWV9BR0NfQ1RMMV9DT0FSU0VfSElHSCkpOworICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIEFSX1BIWV9GSU5EX1NJRywKKyAgICAgICAgICAgICAgICAoSHBQcml2LT5yZWdQSFlGaW5kU2lnICYgfkFSX1BIWV9GSU5EX1NJR19GSVJQV1IpCisgICAgICAgICAgICAgICAgfCAoKEhwUHJpdi0+ZmlycHdyW2xldmVsXSA8PCBBUl9QSFlfRklORF9TSUdfRklSUFdSX1MpCisgICAgICAgICAgICAgICAgJiBBUl9QSFlfRklORF9TSUdfRklSUFdSKSk7CisgICAgICAgIHpmRmx1c2hEZWxheVdyaXRlKGRldik7CisKKyAgICAgICAgaWYgKGxldmVsID4gYW5pU3RhdGUtPm5vaXNlSW1tdW5pdHlMZXZlbCkKKyAgICAgICAgICAgIEhwUHJpdi0+c3RhdHMuYXN0X2FuaV9uaXVwKys7CisgICAgICAgIGVsc2UgaWYgKGxldmVsIDwgYW5pU3RhdGUtPm5vaXNlSW1tdW5pdHlMZXZlbCkKKyAgICAgICAgICAgIEhwUHJpdi0+c3RhdHMuYXN0X2FuaV9uaWRvd24rKzsKKyAgICAgICAgYW5pU3RhdGUtPm5vaXNlSW1tdW5pdHlMZXZlbCA9ICh1OF90KWxldmVsOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBaTV9IQUxfQU5JX09GRE1fV0VBS19TSUdOQUxfREVURUNUSU9OOgorICAgIHsKKyAgICAgICAgY29uc3QgVEFCTEUgbTFUaHJlc2hMb3cgICA9IHsgMTI3LCAgIDUwIH07CisgICAgICAgIGNvbnN0IFRBQkxFIG0yVGhyZXNoTG93ICAgPSB7IDEyNywgICA0MCB9OworICAgICAgICBjb25zdCBUQUJMRSBtMVRocmVzaCAgICAgID0geyAxMjcsIDB4NGQgfTsKKyAgICAgICAgY29uc3QgVEFCTEUgbTJUaHJlc2ggICAgICA9IHsgMTI3LCAweDQwIH07CisgICAgICAgIGNvbnN0IFRBQkxFIG0yQ291bnRUaHIgICAgPSB7ICAzMSwgICAxNiB9OworICAgICAgICBjb25zdCBUQUJMRSBtMkNvdW50VGhyTG93ID0geyAgNjMsICAgNDggfTsKKyAgICAgICAgdTMyX3Qgb24gPSBwYXJhbSA/IDEgOiAwOworCisgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgQVJfUEhZX1NGQ09SUl9MT1csCisgICAgICAgICAgICAgICAgKEhwUHJpdi0+cmVnUEhZU2Zjb3JyTG93ICYgfkFSX1BIWV9TRkNPUlJfTE9XX00xX1RIUkVTSF9MT1cpCisgICAgICAgICAgICAgICAgfCAoKG0xVGhyZXNoTG93W29uXSA8PCBBUl9QSFlfU0ZDT1JSX0xPV19NMV9USFJFU0hfTE9XX1MpCisgICAgICAgICAgICAgICAgJiBBUl9QSFlfU0ZDT1JSX0xPV19NMV9USFJFU0hfTE9XKSk7CisgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgQVJfUEhZX1NGQ09SUl9MT1csCisgICAgICAgICAgICAgICAgKEhwUHJpdi0+cmVnUEhZU2Zjb3JyTG93ICYgfkFSX1BIWV9TRkNPUlJfTE9XX00yX1RIUkVTSF9MT1cpCisgICAgICAgICAgICAgICAgfCAoKG0yVGhyZXNoTG93W29uXSA8PCBBUl9QSFlfU0ZDT1JSX0xPV19NMl9USFJFU0hfTE9XX1MpCisgICAgICAgICAgICAgICAgJiBBUl9QSFlfU0ZDT1JSX0xPV19NMl9USFJFU0hfTE9XKSk7CisgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgQVJfUEhZX1NGQ09SUiwKKyAgICAgICAgICAgICAgICAoSHBQcml2LT5yZWdQSFlTZmNvcnIgJiB+QVJfUEhZX1NGQ09SUl9NMV9USFJFU0gpCisgICAgICAgICAgICAgICAgfCAoKG0xVGhyZXNoW29uXSA8PCBBUl9QSFlfU0ZDT1JSX00xX1RIUkVTSF9TKQorICAgICAgICAgICAgICAgICYgQVJfUEhZX1NGQ09SUl9NMV9USFJFU0gpKTsKKyAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBBUl9QSFlfU0ZDT1JSLAorICAgICAgICAgICAgICAgIChIcFByaXYtPnJlZ1BIWVNmY29yciAmIH5BUl9QSFlfU0ZDT1JSX00yX1RIUkVTSCkKKyAgICAgICAgICAgICAgICB8ICgobTJUaHJlc2hbb25dIDw8IEFSX1BIWV9TRkNPUlJfTTJfVEhSRVNIX1MpCisgICAgICAgICAgICAgICAgJiBBUl9QSFlfU0ZDT1JSX00yX1RIUkVTSCkpOworICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIEFSX1BIWV9TRkNPUlIsCisgICAgICAgICAgICAgICAgKEhwUHJpdi0+cmVnUEhZU2Zjb3JyICYgfkFSX1BIWV9TRkNPUlJfTTJDT1VOVF9USFIpCisgICAgICAgICAgICAgICAgfCAoKG0yQ291bnRUaHJbb25dIDw8IEFSX1BIWV9TRkNPUlJfTTJDT1VOVF9USFJfUykKKyAgICAgICAgICAgICAgICAmIEFSX1BIWV9TRkNPUlJfTTJDT1VOVF9USFIpKTsKKyAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBBUl9QSFlfU0ZDT1JSX0xPVywKKyAgICAgICAgICAgICAgICAoSHBQcml2LT5yZWdQSFlTZmNvcnJMb3cgJiB+QVJfUEhZX1NGQ09SUl9MT1dfTTJDT1VOVF9USFJfTE9XKQorICAgICAgICAgICAgICAgIHwgKChtMkNvdW50VGhyTG93W29uXSA8PCBBUl9QSFlfU0ZDT1JSX0xPV19NMkNPVU5UX1RIUl9MT1dfUykKKyAgICAgICAgICAgICAgICAmIEFSX1BIWV9TRkNPUlJfTE9XX00yQ09VTlRfVEhSX0xPVykpOworCisgICAgICAgIGlmIChvbikKKyAgICAgICAgeworICAgICAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBBUl9QSFlfU0ZDT1JSX0xPVywKKyAgICAgICAgICAgICAgICAgICAgSHBQcml2LT5yZWdQSFlTZmNvcnJMb3cgfCBBUl9QSFlfU0ZDT1JSX0xPV19VU0VfU0VMRl9DT1JSX0xPVyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIEFSX1BIWV9TRkNPUlJfTE9XLAorICAgICAgICAgICAgICAgICAgICBIcFByaXYtPnJlZ1BIWVNmY29yckxvdyAmIH5BUl9QSFlfU0ZDT1JSX0xPV19VU0VfU0VMRl9DT1JSX0xPVyk7CisgICAgICAgIH0KKyAgICAgICAgemZGbHVzaERlbGF5V3JpdGUoZGV2KTsKKyAgICAgICAgaWYgKCFvbiAhPSBhbmlTdGF0ZS0+b2ZkbVdlYWtTaWdEZXRlY3RPZmYpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChvbikKKyAgICAgICAgICAgICAgICBIcFByaXYtPnN0YXRzLmFzdF9hbmlfb2ZkbW9uKys7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgSHBQcml2LT5zdGF0cy5hc3RfYW5pX29mZG1vZmYrKzsKKyAgICAgICAgICAgIGFuaVN0YXRlLT5vZmRtV2Vha1NpZ0RldGVjdE9mZiA9ICFvbjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBaTV9IQUxfQU5JX0NDS19XRUFLX1NJR05BTF9USFI6CisgICAgeworICAgICAgICBjb25zdCBUQUJMRSB3ZWFrU2lnVGhyQ2NrID0geyA4LCA2IH07CisgICAgICAgIHUzMl90IGhpZ2ggPSBwYXJhbSA/IDEgOiAwOworCisgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgQVJfUEhZX0NDS19ERVRFQ1QsCisgICAgICAgICAgICAgICAgKEhwUHJpdi0+cmVnUEhZQ2NrRGV0ZWN0ICYgfkFSX1BIWV9DQ0tfREVURUNUX1dFQUtfU0lHX1RIUl9DQ0spCisgICAgICAgICAgICAgICAgfCAoKHdlYWtTaWdUaHJDY2tbaGlnaF0gPDwgQVJfUEhZX0NDS19ERVRFQ1RfV0VBS19TSUdfVEhSX0NDS19TKQorICAgICAgICAgICAgICAgICYgQVJfUEhZX0NDS19ERVRFQ1RfV0VBS19TSUdfVEhSX0NDSykpOworICAgICAgICB6ZkZsdXNoRGVsYXlXcml0ZShkZXYpOworICAgICAgICBpZiAoaGlnaCAhPSBhbmlTdGF0ZS0+Y2NrV2Vha1NpZ1RocmVzaG9sZCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGhpZ2gpCisgICAgICAgICAgICAgICAgSHBQcml2LT5zdGF0cy5hc3RfYW5pX2Nja2hpZ2grKzsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBIcFByaXYtPnN0YXRzLmFzdF9hbmlfY2NrbG93Kys7CisgICAgICAgICAgICBhbmlTdGF0ZS0+Y2NrV2Vha1NpZ1RocmVzaG9sZCA9ICh1OF90KWhpZ2g7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgWk1fSEFMX0FOSV9GSVJTVEVQX0xFVkVMOgorICAgIHsKKyAgICAgICAgY29uc3QgVEFCTEUgZmlyc3RlcCA9IHsgMCwgNCwgOCB9OworICAgICAgICB1MzJfdCBsZXZlbCA9IHBhcmFtOworCisgICAgICAgIGlmIChsZXZlbCA+PSBOKGZpcnN0ZXApKQorICAgICAgICB7CisgICAgICAgICAgICB6bV9kZWJ1Z19tc2cxKCJsZXZlbCBvdXQgb2YgcmFuZ2UsIGRlc2lyZWQgbGV2ZWwgOiAiLCBsZXZlbCk7CisgICAgICAgICAgICB6bV9kZWJ1Z19tc2cxKCJtYXggbGV2ZWwgOiAiLCBOKGZpcnN0ZXApKTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIEFSX1BIWV9GSU5EX1NJRywKKyAgICAgICAgICAgICAgICAoSHBQcml2LT5yZWdQSFlGaW5kU2lnICYgfkFSX1BIWV9GSU5EX1NJR19GSVJTVEVQKQorICAgICAgICAgICAgICAgIHwgKChmaXJzdGVwW2xldmVsXSA8PCBBUl9QSFlfRklORF9TSUdfRklSU1RFUF9TKQorICAgICAgICAgICAgICAgICYgQVJfUEhZX0ZJTkRfU0lHX0ZJUlNURVApKTsKKyAgICAgICAgemZGbHVzaERlbGF5V3JpdGUoZGV2KTsKKyAgICAgICAgaWYgKGxldmVsID4gYW5pU3RhdGUtPmZpcnN0ZXBMZXZlbCkKKyAgICAgICAgICAgIEhwUHJpdi0+c3RhdHMuYXN0X2FuaV9zdGVwdXArKzsKKyAgICAgICAgZWxzZSBpZiAobGV2ZWwgPCBhbmlTdGF0ZS0+Zmlyc3RlcExldmVsKQorICAgICAgICAgICAgSHBQcml2LT5zdGF0cy5hc3RfYW5pX3N0ZXBkb3duKys7CisgICAgICAgIGFuaVN0YXRlLT5maXJzdGVwTGV2ZWwgPSAodThfdClsZXZlbDsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgWk1fSEFMX0FOSV9TUFVSX0lNTVVOSVRZX0xFVkVMOgorICAgIHsKKyAgICAgICAgY29uc3QgVEFCTEUgY3ljcHdyVGhyMSA9IHsgMiwgNCwgNiwgOCwgMTAsIDEyLCAxNCwgMTYgfTsKKyAgICAgICAgdTMyX3QgbGV2ZWwgPSBwYXJhbTsKKworICAgICAgICBpZiAobGV2ZWwgPj0gTihjeWNwd3JUaHIxKSkKKyAgICAgICAgeworICAgICAgICAgICAgem1fZGVidWdfbXNnMSgibGV2ZWwgb3V0IG9mIHJhbmdlLCBkZXNpcmVkIGxldmVsIDogIiwgbGV2ZWwpOworICAgICAgICAgICAgem1fZGVidWdfbXNnMSgibWF4IGxldmVsIDogIiwgTihjeWNwd3JUaHIxKSk7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBBUl9QSFlfVElNSU5HNSwKKyAgICAgICAgICAgICAgICAoSHBQcml2LT5yZWdQSFlUaW1pbmc1ICYgfkFSX1BIWV9USU1JTkc1X0NZQ1BXUl9USFIxKQorICAgICAgICAgICAgICAgIHwgKChjeWNwd3JUaHIxW2xldmVsXSA8PCBBUl9QSFlfVElNSU5HNV9DWUNQV1JfVEhSMV9TKQorICAgICAgICAgICAgICAgICYgQVJfUEhZX1RJTUlORzVfQ1lDUFdSX1RIUjEpKTsKKyAgICAgICAgemZGbHVzaERlbGF5V3JpdGUoZGV2KTsKKyAgICAgICAgaWYgKGxldmVsID4gYW5pU3RhdGUtPnNwdXJJbW11bml0eUxldmVsKQorICAgICAgICAgICAgSHBQcml2LT5zdGF0cy5hc3RfYW5pX3NwdXJ1cCsrOworICAgICAgICBlbHNlIGlmIChsZXZlbCA8IGFuaVN0YXRlLT5zcHVySW1tdW5pdHlMZXZlbCkKKyAgICAgICAgICAgIEhwUHJpdi0+c3RhdHMuYXN0X2FuaV9zcHVyZG93bisrOworICAgICAgICBhbmlTdGF0ZS0+c3B1ckltbXVuaXR5TGV2ZWwgPSAodThfdClsZXZlbDsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgWk1fSEFMX0FOSV9QUkVTRU5UOgorICAgICAgICBicmVhazsKKyNpZmRlZiBBSF9QUklWQVRFX0RJQUcKKyAgICBjYXNlIFpNX0hBTF9BTklfTU9ERToKKyAgICAgICAgaWYgKHBhcmFtID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIEhwUHJpdi0+cHJvY1BoeUVyciAmPSB+Wk1fSEFMX1BST0NFU1NfQU5JOworICAgICAgICAgICAgLyogVHVybiBvZmYgSFcgY291bnRlcnMgaWYgd2UgaGF2ZSB0aGVtICovCisgICAgICAgICAgICB6ZkhwQW5pRGV0YWNoKGRldik7CisgICAgICAgICAgICAvL3pmSHBTZXRSeEZpbHRlcihkZXYsIHpmSHBHZXRSeEZpbHRlcihkZXYpICZ+IEhBTF9SWF9GSUxURVJfUEhZRVJSKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsgICAgICAgICAgIC8qIG5vcm1hbC9hdXRvIG1vZGUgKi8KKyAgICAgICAgICAgIEhwUHJpdi0+cHJvY1BoeUVyciB8PSBaTV9IQUxfUFJPQ0VTU19BTkk7CisgICAgICAgICAgICBpZiAoSHBQcml2LT5oYXNId1BoeUNvdW50ZXJzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vemZIcFNldFJ4RmlsdGVyKGRldiwgemZIcEdldFJ4RmlsdGVyKGRldikgJn4gSEFMX1JYX0ZJTFRFUl9QSFlFUlIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vemZIcFNldFJ4RmlsdGVyKGRldiwgemZIcEdldFJ4RmlsdGVyKGRldikgfCBIQUxfUlhfRklMVEVSX1BIWUVSUik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBaTV9IQUxfQU5JX1BIWUVSUl9SRVNFVDoKKyAgICAgICAgSHBQcml2LT5zdGF0cy5hc3RfYW5pX29mZG1lcnJzID0gMDsKKyAgICAgICAgSHBQcml2LT5zdGF0cy5hc3RfYW5pX2Nja2VycnMgPSAwOworICAgICAgICBicmVhazsKKyNlbmRpZiAvKiBBSF9QUklWQVRFX0RJQUcgKi8KKyAgICBkZWZhdWx0OgorICAgICAgICB6bV9kZWJ1Z19tc2cxKCJpbnZhbGlkIGNtZCAiLCBjbWQpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIHJldHVybiBUUlVFOworI3VuZGVmICBOCit9CisKK3ZvaWQgemZIcEFuaVJlc3RhcnQoemRldl90KiBkZXYpCit7CisgICAgc3RydWN0IHpzQW5pU3RhdGUgKmFuaVN0YXRlOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgc3RydWN0IHpzSHBQcml2ICpIcFByaXYgPSAoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlOworCisgICAgYW5pU3RhdGUgPSBIcFByaXYtPmN1cmFuaTsKKworICAgIGFuaVN0YXRlLT5saXN0ZW5UaW1lID0gMDsKKyAgICBpZiAoSHBQcml2LT5oYXNId1BoeUNvdW50ZXJzKQorICAgIHsKKyAgICAgICAgLy9pZiAoYW5pU3RhdGUtPm9mZG1UcmlnSGlnaCA+IEFSX1BIWV9DT1VOVE1BWCkKKyAgICAgICAgLy97CisgICAgICAgIC8vICAgIGFuaVN0YXRlLT5vZmRtUGh5RXJyQmFzZSA9IDA7CisgICAgICAgIC8vICAgIHptX2RlYnVnX21zZzAoIk9GRE0gVHJpZ2dlciBpcyB0b28gaGlnaCBmb3IgaHcgY291bnRlcnMiKTsKKyAgICAgICAgLy99CisgICAgICAgIC8vZWxzZQorICAgICAgICAvLyAgICBhbmlTdGF0ZS0+b2ZkbVBoeUVyckJhc2UgPSBBUl9QSFlfQ09VTlRNQVggLSBhbmlTdGF0ZS0+b2ZkbVRyaWdIaWdoOworICAgICAgICAvL2lmIChhbmlTdGF0ZS0+Y2NrVHJpZ0hpZ2ggPiBBUl9QSFlfQ09VTlRNQVgpCisgICAgICAgIC8veworICAgICAgICAvLyAgICBhbmlTdGF0ZS0+Y2NrUGh5RXJyQmFzZSA9IDA7CisgICAgICAgIC8vICAgIHptX2RlYnVnX21zZzAoIkNDSyBUcmlnZ2VyIGlzIHRvbyBoaWdoIGZvciBodyBjb3VudGVycyIpOworICAgICAgICAvL30KKyAgICAgICAgLy9lbHNlCisgICAgICAgIC8vICAgIGFuaVN0YXRlLT5jY2tQaHlFcnJCYXNlID0gQVJfUEhZX0NPVU5UTUFYIC0gYW5pU3RhdGUtPmNja1RyaWdIaWdoOworICAgICAgICAvL3ptX2RlYnVnX21zZzIoIldyaXRpbmcgb2ZkbWJhc2UgPSAweCIsIGFuaVN0YXRlLT5vZmRtUGh5RXJyQmFzZSk7CisgICAgICAgIC8vem1fZGVidWdfbXNnMigiV3JpdGluZyBjY2tiYXNlID0gMHgiLCBhbmlTdGF0ZS0+Y2NrUGh5RXJyQmFzZSk7CisgICAgICAgIC8vT1NfUkVHX1dSSVRFKGFoLCBBUl9QSFlfRVJSXzEsIGFuaVN0YXRlLT5vZmRtUGh5RXJyQmFzZSk7CisgICAgICAgIC8vT1NfUkVHX1dSSVRFKGFoLCBBUl9QSFlfRVJSXzIsIGFuaVN0YXRlLT5jY2tQaHlFcnJCYXNlKTsKKyAgICAgICAgLy9PU19SRUdfV1JJVEUoYWgsIEFSX1BIWV9FUlJfTUFTS18xLCBBUl9QSFlfRVJSX09GRE1fVElNSU5HKTsKKyAgICAgICAgLy9PU19SRUdfV1JJVEUoYWgsIEFSX1BIWV9FUlJfTUFTS18yLCBBUl9QSFlfRVJSX0NDS19USU1JTkcpOworICAgICAgICBhbmlTdGF0ZS0+b2ZkbVBoeUVyckJhc2UgPSAwOworICAgICAgICBhbmlTdGF0ZS0+Y2NrUGh5RXJyQmFzZSA9IDA7CisgICAgfQorICAgIGFuaVN0YXRlLT5vZmRtUGh5RXJyQ291bnQgPSAwOworICAgIGFuaVN0YXRlLT5jY2tQaHlFcnJDb3VudCA9IDA7Cit9CisKK3ZvaWQgemZIcEFuaU9mZG1FcnJUcmlnZ2VyKHpkZXZfdCogZGV2KQoreworICAgIHN0cnVjdCB6c0FuaVN0YXRlICphbmlTdGF0ZTsKKyAgICBzMzJfdCByc3NpOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgc3RydWN0IHpzSHBQcml2ICpIcFByaXYgPSAoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlOworCisgICAgLy9IQUxBU1NFUlQoY2hhbiAhPSBOVUxMKTsKKworICAgIGlmICgoSHBQcml2LT5wcm9jUGh5RXJyICYgWk1fSEFMX1BST0NFU1NfQU5JKSA9PSAwKQorICAgICAgICByZXR1cm47CisKKyAgICBhbmlTdGF0ZSA9IEhwUHJpdi0+Y3VyYW5pOworICAgIC8qIEZpcnN0LCByYWlzZSBub2lzZSBpbW11bml0eSBsZXZlbCwgdXAgdG8gbWF4ICovCisgICAgaWYgKGFuaVN0YXRlLT5ub2lzZUltbXVuaXR5TGV2ZWwgPCBaTV9IQUxfTk9JU0VfSU1NVU5FX01BWCkKKyAgICB7CisgICAgICAgIHpmSHBBbmlDb250cm9sKGRldiwgWk1fSEFMX0FOSV9OT0lTRV9JTU1VTklUWV9MRVZFTCwgYW5pU3RhdGUtPm5vaXNlSW1tdW5pdHlMZXZlbCArIDEpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIC8qIHRoZW4sIHJhaXNlIHNwdXIgaW1tdW5pdHkgbGV2ZWwsIHVwIHRvIG1heCAqLworICAgIGlmIChhbmlTdGF0ZS0+c3B1ckltbXVuaXR5TGV2ZWwgPCBaTV9IQUxfU1BVUl9JTU1VTkVfTUFYKQorICAgIHsKKyAgICAgICAgemZIcEFuaUNvbnRyb2woZGV2LCBaTV9IQUxfQU5JX1NQVVJfSU1NVU5JVFlfTEVWRUwsIGFuaVN0YXRlLT5zcHVySW1tdW5pdHlMZXZlbCArIDEpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHJzc2kgPSBCRUFDT05fUlNTSShkZXYpOworICAgIGlmIChyc3NpID4gYW5pU3RhdGUtPnJzc2lUaHJIaWdoKQorICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogQmVhY29uIHJzc2kgaXMgaGlnaCwgY2FuIHR1cm4gb2ZmIG9mZG0gd2VhayBzaWcgZGV0ZWN0LgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKCFhbmlTdGF0ZS0+b2ZkbVdlYWtTaWdEZXRlY3RPZmYpCisgICAgICAgIHsKKyAgICAgICAgICAgIHpmSHBBbmlDb250cm9sKGRldiwgWk1fSEFMX0FOSV9PRkRNX1dFQUtfU0lHTkFMX0RFVEVDVElPTiwgRkFMU0UpOworICAgICAgICAgICAgemZIcEFuaUNvbnRyb2woZGV2LCBaTV9IQUxfQU5JX1NQVVJfSU1NVU5JVFlfTEVWRUwsIDApOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIC8qCisgICAgICAgICAqIElmIHdlYWsgc2lnIGRldGVjdCBpcyBhbHJlYWR5IG9mZiwgYXMgbGFzdCByZXNvcnQsIHJhaXNlCisgICAgICAgICAqIGZpcnN0IHN0ZXAgbGV2ZWwKKyAgICAgICAgICovCisgICAgICAgIGlmIChhbmlTdGF0ZS0+Zmlyc3RlcExldmVsIDwgWk1fSEFMX0ZJUlNUX1NURVBfTUFYKQorICAgICAgICB7CisgICAgICAgICAgICB6ZkhwQW5pQ29udHJvbChkZXYsIFpNX0hBTF9BTklfRklSU1RFUF9MRVZFTCwgYW5pU3RhdGUtPmZpcnN0ZXBMZXZlbCArIDEpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKHJzc2kgPiBhbmlTdGF0ZS0+cnNzaVRockxvdykKKyAgICB7CisgICAgICAgIC8qCisgICAgICAgICAqIEJlYWNvbiByc3NpIGluIG1pZCByYW5nZSwgbmVlZCBvZmRtIHdlYWsgc2lnbmFsIGRldGVjdCwKKyAgICAgICAgICogYnV0IHdlIGNhbiByYWlzZSBmaXJzdHN0ZXBMZXZlbAorICAgICAgICAgKi8KKyAgICAgICAgaWYgKGFuaVN0YXRlLT5vZmRtV2Vha1NpZ0RldGVjdE9mZikKKyAgICAgICAgICAgIHpmSHBBbmlDb250cm9sKGRldiwgWk1fSEFMX0FOSV9PRkRNX1dFQUtfU0lHTkFMX0RFVEVDVElPTiwgVFJVRSk7CisgICAgICAgIGlmIChhbmlTdGF0ZS0+Zmlyc3RlcExldmVsIDwgWk1fSEFMX0ZJUlNUX1NURVBfTUFYKQorICAgICAgICAgICAgemZIcEFuaUNvbnRyb2woZGV2LCBaTV9IQUxfQU5JX0ZJUlNURVBfTEVWRUwsIGFuaVN0YXRlLT5maXJzdGVwTGV2ZWwgKyAxKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKgorICAgICAgICAgKiBCZWFjb24gcnNzaSBpcyBsb3csIGlmIGluIDExYi9nIG1vZGUsIHR1cm4gb2ZmIG9mZG0KKyAgICAgICAgICogd2VhayBzaWduIGRldGN0aW9uIGFuZCB6ZXJvIGZpcnN0ZXBMZXZlbCB0byBtYXhpbWl6ZQorICAgICAgICAgKiBDQ0sgc2Vuc2l0aXZpdHkKKyAgICAgICAgICovCisgICAgICAgIGlmICh3ZC0+ZnJlcXVlbmN5IDwgMzAwMCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFhbmlTdGF0ZS0+b2ZkbVdlYWtTaWdEZXRlY3RPZmYpCisgICAgICAgICAgICAgICAgemZIcEFuaUNvbnRyb2woZGV2LCBaTV9IQUxfQU5JX09GRE1fV0VBS19TSUdOQUxfREVURUNUSU9OLCBGQUxTRSk7CisgICAgICAgICAgICBpZiAoYW5pU3RhdGUtPmZpcnN0ZXBMZXZlbCA+IDApCisgICAgICAgICAgICAgICAgemZIcEFuaUNvbnRyb2woZGV2LCBaTV9IQUxfQU5JX0ZJUlNURVBfTEVWRUwsIDApOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIHpmSHBBbmlDY2tFcnJUcmlnZ2VyKHpkZXZfdCogZGV2KQoreworICAgIHN0cnVjdCB6c0FuaVN0YXRlICphbmlTdGF0ZTsKKyAgICBzMzJfdCByc3NpOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgc3RydWN0IHpzSHBQcml2ICpIcFByaXYgPSAoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlOworCisgICAgLy9IQUxBU1NFUlQoY2hhbiAhPSBOVUxMKTsKKworICAgIGlmICgoSHBQcml2LT5wcm9jUGh5RXJyICYgWk1fSEFMX1BST0NFU1NfQU5JKSA9PSAwKQorICAgICAgICByZXR1cm47CisKKyAgICAvKiBmaXJzdCwgcmFpc2Ugbm9pc2UgaW1tdW5pdHkgbGV2ZWwsIHVwIHRvIG1heCAqLworICAgIGFuaVN0YXRlID0gSHBQcml2LT5jdXJhbmk7CisgICAgaWYgKGFuaVN0YXRlLT5ub2lzZUltbXVuaXR5TGV2ZWwgPCBaTV9IQUxfTk9JU0VfSU1NVU5FX01BWCkKKyAgICB7CisgICAgICAgIHpmSHBBbmlDb250cm9sKGRldiwgWk1fSEFMX0FOSV9OT0lTRV9JTU1VTklUWV9MRVZFTCwKKyAgICAgICAgICAgICAgICAgYW5pU3RhdGUtPm5vaXNlSW1tdW5pdHlMZXZlbCArIDEpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHJzc2kgPSBCRUFDT05fUlNTSShkZXYpOworICAgIGlmIChyc3NpID4gIGFuaVN0YXRlLT5yc3NpVGhyTG93KQorICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogQmVhY29uIHNpZ25hbCBpbiBtaWQgYW5kIGhpZ2ggcmFuZ2UsIHJhaXNlIGZpcnN0ZXBsZXZlbC4KKyAgICAgICAgICovCisgICAgICAgIGlmIChhbmlTdGF0ZS0+Zmlyc3RlcExldmVsIDwgWk1fSEFMX0ZJUlNUX1NURVBfTUFYKQorICAgICAgICAgICAgemZIcEFuaUNvbnRyb2woZGV2LCBaTV9IQUxfQU5JX0ZJUlNURVBfTEVWRUwsIGFuaVN0YXRlLT5maXJzdGVwTGV2ZWwgKyAxKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogQmVhY29uIHJzc2kgaXMgbG93LCB6ZXJvIGZpcnN0ZXBMZXZlbCB0byBtYXhpbWl6ZQorICAgICAgICAgKiBDQ0sgc2Vuc2l0aXZpdHkuCisgICAgICAgICAqLworICAgICAgICBpZiAod2QtPmZyZXF1ZW5jeSA8IDMwMDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChhbmlTdGF0ZS0+Zmlyc3RlcExldmVsID4gMCkKKyAgICAgICAgICAgICAgICB6ZkhwQW5pQ29udHJvbChkZXYsIFpNX0hBTF9BTklfRklSU1RFUF9MRVZFTCwgMCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgemZIcEFuaUxvd2VySW1tdW5pdHkoemRldl90KiBkZXYpCit7CisgICAgc3RydWN0IHpzQW5pU3RhdGUgKmFuaVN0YXRlOworICAgIHMzMl90IHJzc2k7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBzdHJ1Y3QgenNIcFByaXYgKkhwUHJpdiA9IChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGU7CisKKyAgICBhbmlTdGF0ZSA9IEhwUHJpdi0+Y3VyYW5pOworCisgICAgcnNzaSA9IEJFQUNPTl9SU1NJKGRldik7CisgICAgaWYgKHJzc2kgPiBhbmlTdGF0ZS0+cnNzaVRockhpZ2gpCisgICAgeworICAgICAgICAvKgorICAgICAgICAgKiBCZWFjb24gc2lnbmFsIGlzIGhpZ2gsIGxlYXZlIG9mZG0gd2VhayBzaWduYWwgZGV0ZWN0aW9uIG9mZgorICAgICAgICAgKiBvciBpdCBtYXkgb3NjaWxsYXRlLiBMZXQgaXQgZmFsbCB0aHJvdWdoLgorICAgICAgICAgKi8KKyAgICB9CisgICAgZWxzZSBpZiAocnNzaSA+IGFuaVN0YXRlLT5yc3NpVGhyTG93KQorICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogQmVhY29uIHJzc2kgaW4gbWlkIHJhbmdlLCB0dXJuIG9uIG9mZG0gd2VhayBzaWduYWwKKyAgICAgICAgICogZGV0ZWN0aW9uIG9yIGxvd2VyIGZpcnN0IHN0ZXAgbGV2ZWwuCisgICAgICAgICAqLworICAgICAgICBpZiAoYW5pU3RhdGUtPm9mZG1XZWFrU2lnRGV0ZWN0T2ZmKQorICAgICAgICB7CisgICAgICAgICAgICB6ZkhwQW5pQ29udHJvbChkZXYsIFpNX0hBTF9BTklfT0ZETV9XRUFLX1NJR05BTF9ERVRFQ1RJT04sIFRSVUUpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmIChhbmlTdGF0ZS0+Zmlyc3RlcExldmVsID4gMCkKKyAgICAgICAgeworICAgICAgICAgICAgemZIcEFuaUNvbnRyb2woZGV2LCBaTV9IQUxfQU5JX0ZJUlNURVBfTEVWRUwsIGFuaVN0YXRlLT5maXJzdGVwTGV2ZWwgLSAxKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKgorICAgICAgICAgKiBCZWFjb24gcnNzaSBpcyBsb3csIHJlZHVjZSBmaXJzdCBzdGVwIGxldmVsLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKGFuaVN0YXRlLT5maXJzdGVwTGV2ZWwgPiAwKQorICAgICAgICB7CisgICAgICAgICAgICB6ZkhwQW5pQ29udHJvbChkZXYsIFpNX0hBTF9BTklfRklSU1RFUF9MRVZFTCwgYW5pU3RhdGUtPmZpcnN0ZXBMZXZlbCAtIDEpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorICAgIC8qIHRoZW4gbG93ZXIgc3B1ciBpbW11bml0eSBsZXZlbCwgZG93biB0byB6ZXJvICovCisgICAgaWYgKGFuaVN0YXRlLT5zcHVySW1tdW5pdHlMZXZlbCA+IDApCisgICAgeworICAgICAgICB6ZkhwQW5pQ29udHJvbChkZXYsIFpNX0hBTF9BTklfU1BVUl9JTU1VTklUWV9MRVZFTCwgYW5pU3RhdGUtPnNwdXJJbW11bml0eUxldmVsIC0gMSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgLyoKKyAgICAgKiBpZiBhbGwgZWxzZSBmYWlscywgbG93ZXIgbm9pc2UgaW1tdW5pdHkgbGV2ZWwgZG93biB0byBhIG1pbiB2YWx1ZQorICAgICAqIHplcm8gZm9yIG5vdworICAgICAqLworICAgIGlmIChhbmlTdGF0ZS0+bm9pc2VJbW11bml0eUxldmVsID4gMCkKKyAgICB7CisgICAgICAgIHpmSHBBbmlDb250cm9sKGRldiwgWk1fSEFMX0FOSV9OT0lTRV9JTU1VTklUWV9MRVZFTCwgYW5pU3RhdGUtPm5vaXNlSW1tdW5pdHlMZXZlbCAtIDEpOworICAgICAgICByZXR1cm47CisgICAgfQorfQorCisjZGVmaW5lIENMT0NLX1JBVEUgNDQwMDAgICAgLyogWFhYIHVzZSBtYWNfdXNlYyBvciBzaW1pbGFyICovCisvKiBjb252ZXJ0IEhXIGNvdW50ZXIgdmFsdWVzIHRvIG1zIHVzaW5nIDExZyBjbG9jayByYXRlLCBnb285ZCBlbm91Z2gKKyAgIGZvciAxMWEgYW5kIFR1cmJvICovCisKKy8qCisgKiBSZXR1cm4gYW4gYXBwcm94aW1hdGlvbiBvZiB0aGUgdGltZSBzcGVudCBgYGxpc3RlbmluZycnIGJ5CisgKiBkZWR1Y3RpbmcgdGhlIGN5Y2xlcyBzcGVudCB0eCdpbmcgYW5kIHJ4J2luZyBmcm9tIHRoZSB0b3RhbAorICogY3ljbGUgY291bnQgc2luY2Ugb3VyIGxhc3QgY2FsbC4gIEEgcmV0dXJuIHZhbHVlIDwwIGluZGljYXRlcworICogYW4gaW52YWxpZC9pbmNvbnNpc3RlbnQgdGltZS4KKyAqLworczMyX3QgemZIcEFuaUdldExpc3RlblRpbWUoemRldl90KiBkZXYpCit7CisgICAgc3RydWN0IHpzQW5pU3RhdGUgKmFuaVN0YXRlOworICAgIHUzMl90IHR4RnJhbWVDb3VudCwgcnhGcmFtZUNvdW50LCBjeWNsZUNvdW50OworICAgIHMzMl90IGxpc3RlblRpbWU7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBzdHJ1Y3QgenNIcFByaXYgKkhwUHJpdiA9IChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGU7CisKKyAgICB0eEZyYW1lQ291bnQgPSAwOy8vT1NfUkVHX1JFQUQoYWgsIEFSX1RGQ05UKTsKKyAgICByeEZyYW1lQ291bnQgPSAwOy8vT1NfUkVHX1JFQUQoYWgsIEFSX1JGQ05UKTsKKyAgICBjeWNsZUNvdW50ID0gMDsvL09TX1JFR19SRUFEKGFoLCBBUl9DQ0NOVCk7CisKKyAgICBhbmlTdGF0ZSA9IEhwUHJpdi0+Y3VyYW5pOworICAgIGlmIChhbmlTdGF0ZS0+Y3ljbGVDb3VudCA9PSAwIHx8IGFuaVN0YXRlLT5jeWNsZUNvdW50ID4gY3ljbGVDb3VudCkKKyAgICB7CisgICAgICAgIC8qCisgICAgICAgICAqIEN5Y2xlIGNvdW50ZXIgd3JhcCAob3IgaW5pdGlhbCBjYWxsKTsgaXQncyBub3QgcG9zc2libGUKKyAgICAgICAgICogdG8gYWNjdXJhdGVseSBjYWxjdWxhdGUgYSB2YWx1ZSBiZWNhdXNlIHRoZSByZWdpc3RlcnMKKyAgICAgICAgICogcmlnaHQgc2hpZnQgcmF0aGVyIHRoYW4gd3JhcC0tc28gcHVudCBhbmQgcmV0dXJuIDAuCisgICAgICAgICAqLworICAgICAgICBsaXN0ZW5UaW1lID0gMDsKKyAgICAgICAgSHBQcml2LT5zdGF0cy5hc3RfYW5pX2x6ZXJvKys7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHMzMl90IGNjZGVsdGEgPSBjeWNsZUNvdW50IC0gYW5pU3RhdGUtPmN5Y2xlQ291bnQ7CisgICAgICAgIHMzMl90IHJmZGVsdGEgPSByeEZyYW1lQ291bnQgLSBhbmlTdGF0ZS0+cnhGcmFtZUNvdW50OworICAgICAgICBzMzJfdCB0ZmRlbHRhID0gdHhGcmFtZUNvdW50IC0gYW5pU3RhdGUtPnR4RnJhbWVDb3VudDsKKyAgICAgICAgbGlzdGVuVGltZSA9IChjY2RlbHRhIC0gcmZkZWx0YSAtIHRmZGVsdGEpIC8gQ0xPQ0tfUkFURTsKKyAgICB9CisgICAgYW5pU3RhdGUtPmN5Y2xlQ291bnQgPSBjeWNsZUNvdW50OworICAgIGFuaVN0YXRlLT50eEZyYW1lQ291bnQgPSB0eEZyYW1lQ291bnQ7CisgICAgYW5pU3RhdGUtPnJ4RnJhbWVDb3VudCA9IHJ4RnJhbWVDb3VudDsKKyAgICByZXR1cm4gbGlzdGVuVGltZTsKK30KKworLyoKKyAqIERvIHBlcmlvZGljIHByb2Nlc3NpbmcuICBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGZyb20gdGhlCisgKiBkcml2ZXIncyByeCBpbnRlcnJ1cHQgaGFuZGxlciBhZnRlciBwcm9jZXNzaW5nIGZyYW1lcy4KKyAqLwordm9pZCB6ZkhwQW5pQXJQb2xsKHpkZXZfdCogZGV2LCB1MzJfdCBsaXN0ZW5UaW1lLCB1MzJfdCBwaHlDbnQxLCB1MzJfdCBwaHlDbnQyKQoreworICAgIHN0cnVjdCB6c0FuaVN0YXRlICphbmlTdGF0ZTsKKyAgICAvL3MzMl90IGxpc3RlblRpbWU7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBzdHJ1Y3QgenNIcFByaXYgKkhwUHJpdiA9IChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGU7CisKKyAgICAvKgorICAgICAqIFNpbmNlIHdlJ3JlIGNhbGxlZCBmcm9tIGVuZCBvZiByeCB0YXNrbGV0LCB3ZSBhbHNvIGNoZWNrIGZvcgorICAgICAqIEFSIHByb2Nlc3Npbmcgbm93CisgICAgICovCisKKyAgICBhbmlTdGF0ZSA9IEhwUHJpdi0+Y3VyYW5pOworICAgIC8vSHBQcml2LT5zdGF0cy5hc3Rfbm9kZXN0YXRzID0gKnN0YXRzOyAgICAgICAvKiBYWFggb3B0aW1pemU/ICovCisKKyAgICAvL2xpc3RlblRpbWUgPSB6ZkhwQW5pR2V0TGlzdGVuVGltZShkZXYpOworICAgIC8vaWYgKGxpc3RlblRpbWUgPCAwKQorICAgIC8veworICAgIC8vICAgIEhwUHJpdi0+c3RhdHMuYXN0X2FuaV9sbmVnKys7CisgICAgLy8gICAgLyogcmVzdGFydCBBTkkgcGVyaW9kIGlmIGxpc3RlblRpbWUgaXMgaW52YWxpZCAqLworICAgIC8vICAgIHpmSHBBbmlSZXN0YXJ0KGRldik7CisgICAgLy8gICAgcmV0dXJuOworICAgIC8vfQorICAgIC8qIFhYWCBiZXdhcmUgb2Ygb3ZlcmZsb3c/ICovCisgICAgYW5pU3RhdGUtPmxpc3RlblRpbWUgKz0gbGlzdGVuVGltZTsKKworICAgIGlmIChIcFByaXYtPmhhc0h3UGh5Q291bnRlcnMpCisgICAgeworICAgICAgICAvL3UzMl90IHBoeUNudDEsIHBoeUNudDI7CisgICAgICAgIHUzMl90IG9mZG1QaHlFcnJDbnQsIGNja1BoeUVyckNudDsKKworICAgICAgICAvKiBOQjogdGhlc2UgYXJlIG5vdCByZXNldC1vbi1yZWFkICovCisgICAgICAgIC8vcGh5Q250MSA9IDA7Ly9PU19SRUdfUkVBRChhaCwgQVJfUEhZX0VSUl8xKTsKKyAgICAgICAgLy9waHlDbnQyID0gMDsvL09TX1JFR19SRUFEKGFoLCBBUl9QSFlfRVJSXzIpOworICAgICAgICAvKiBYWFggc29tZXRpbWVzIHplcm8sIHdoeT8gKi8KKyAgICAgICAgLy9pZiAocGh5Q250MSA8IGFuaVN0YXRlLT5vZmRtUGh5RXJyQmFzZSB8fAorICAgICAgICAvLyAgICBwaHlDbnQyIDwgYW5pU3RhdGUtPmNja1BoeUVyckJhc2UpCisgICAgICAgIC8veworICAgICAgICAvLyAgICBpZiAocGh5Q250MSA8IGFuaVN0YXRlLT5vZmRtUGh5RXJyQmFzZSkKKyAgICAgICAgLy8gICAgeworICAgICAgICAvLyAgICAgICAgem1fZGVidWdfbXNnMigicGh5Q250MSA9IDB4IiwgcGh5Q250MSk7CisgICAgICAgIC8vICAgICAgICB6bV9kZWJ1Z19tc2cyKCJyZXNldHRpbmcgY291bnRlciB2YWx1ZSB0byAweCIsIGFuaVN0YXRlLT5vZmRtUGh5RXJyQmFzZSk7CisgICAgICAgIC8vICAgICAgICAvL09TX1JFR19XUklURShhaCwgQVJfUEhZX0VSUl8xLCBhbmlTdGF0ZS0+b2ZkbVBoeUVyckJhc2UpOworICAgICAgICAvLyAgICAgICAgLy9PU19SRUdfV1JJVEUoYWgsIEFSX1BIWV9FUlJfTUFTS18xLCBBUl9QSFlfRVJSX09GRE1fVElNSU5HKTsKKyAgICAgICAgLy8gICAgfQorICAgICAgICAvLyAgICBpZiAocGh5Q250MiA8IGFuaVN0YXRlLT5jY2tQaHlFcnJCYXNlKQorICAgICAgICAvLyAgICB7CisgICAgICAgIC8vICAgICAgICB6bV9kZWJ1Z19tc2cyKCJwaHlDbnQyID0gMHgiLCBwaHlDbnQyKTsKKyAgICAgICAgLy8gICAgICAgIHptX2RlYnVnX21zZzIoInJlc2V0dGluZyBjb3VudGVyIHZhbHVlIHRvIDB4IiwgYW5pU3RhdGUtPmNja1BoeUVyckJhc2UpOworICAgICAgICAvLyAgICAgICAgLy9PU19SRUdfV1JJVEUoYWgsIEFSX1BIWV9FUlJfMiwgYW5pU3RhdGUtPmNja1BoeUVyckJhc2UpOworICAgICAgICAvLyAgICAgICAgLy9PU19SRUdfV1JJVEUoYWgsIEFSX1BIWV9FUlJfTUFTS18yLCBBUl9QSFlfRVJSX0NDS19USU1JTkcpOworICAgICAgICAvLyAgICB9CisgICAgICAgIC8vICAgIHJldHVybjsgICAgIC8qIFhYWCAqLworICAgICAgICAvL30KKyAgICAgICAgLyogTkI6IG9ubHkgdXNlIGFzdF9hbmlfKmVycnMgd2l0aCBBSF9QUklWQVRFX0RJQUcgKi8KKyAgICAgICAgLy9vZmRtUGh5RXJyQ250ID0gcGh5Q250MSAtIGFuaVN0YXRlLT5vZmRtUGh5RXJyQmFzZTsKKyAgICAgICAgLy9IcFByaXYtPnN0YXRzLmFzdF9hbmlfb2ZkbWVycnMgKz0gb2ZkbVBoeUVyckNudCAtIGFuaVN0YXRlLT5vZmRtUGh5RXJyQ291bnQ7CisgICAgICAgIC8vYW5pU3RhdGUtPm9mZG1QaHlFcnJDb3VudCA9IG9mZG1QaHlFcnJDbnQ7CisgICAgICAgIG9mZG1QaHlFcnJDbnQgPSBwaHlDbnQxOworICAgICAgICBIcFByaXYtPnN0YXRzLmFzdF9hbmlfb2ZkbWVycnMgKz0gb2ZkbVBoeUVyckNudDsKKyAgICAgICAgYW5pU3RhdGUtPm9mZG1QaHlFcnJDb3VudCArPSBvZmRtUGh5RXJyQ250OworCisgICAgICAgIC8vY2NrUGh5RXJyQ250ID0gcGh5Q250MiAtIGFuaVN0YXRlLT5jY2tQaHlFcnJCYXNlOworICAgICAgICAvL0hwUHJpdi0+c3RhdHMuYXN0X2FuaV9jY2tlcnJzICs9IGNja1BoeUVyckNudCAtIGFuaVN0YXRlLT5jY2tQaHlFcnJDb3VudDsKKyAgICAgICAgLy9hbmlTdGF0ZS0+Y2NrUGh5RXJyQ291bnQgPSBjY2tQaHlFcnJDbnQ7CisgICAgICAgIGNja1BoeUVyckNudCA9IHBoeUNudDI7CisgICAgICAgIEhwUHJpdi0+c3RhdHMuYXN0X2FuaV9jY2tlcnJzICs9IGNja1BoeUVyckNudDsKKyAgICAgICAgYW5pU3RhdGUtPmNja1BoeUVyckNvdW50ICs9IGNja1BoeUVyckNudDsKKyAgICB9CisgICAgLyoKKyAgICAgKiBJZiBhbmkgaXMgbm90IGVuYWJsZWQsIHJldHVybiBhZnRlciB3ZSd2ZSBjb2xsZWN0ZWQKKyAgICAgKiBzdGF0aXN0aWNzCisgICAgICovCisgICAgaWYgKChIcFByaXYtPnByb2NQaHlFcnIgJiBaTV9IQUxfUFJPQ0VTU19BTkkpID09IDApCisgICAgICAgIHJldHVybjsKKyAgICBpZiAoYW5pU3RhdGUtPmxpc3RlblRpbWUgPiA1ICogSHBQcml2LT5hbmlQZXJpb2QpCisgICAgeworICAgICAgICAvKgorICAgICAgICAgKiBDaGVjayB0byBzZWUgaWYgbmVlZCB0byBsb3dlciBpbW11bml0eSBpZgorICAgICAgICAgKiA1IGFuaVBlcmlvZHMgaGF2ZSBwYXNzZWQKKyAgICAgICAgICovCisgICAgICAgIGlmIChhbmlTdGF0ZS0+b2ZkbVBoeUVyckNvdW50IDw9IGFuaVN0YXRlLT5saXN0ZW5UaW1lICoKKyAgICAgICAgICAgICBhbmlTdGF0ZS0+b2ZkbVRyaWdMb3cvMTAwMCAmJgorICAgICAgICAgICAgYW5pU3RhdGUtPmNja1BoeUVyckNvdW50IDw9IGFuaVN0YXRlLT5saXN0ZW5UaW1lICoKKyAgICAgICAgICAgICBhbmlTdGF0ZS0+Y2NrVHJpZ0xvdy8xMDAwKQorICAgICAgICAgICAgemZIcEFuaUxvd2VySW1tdW5pdHkoZGV2KTsKKyAgICAgICAgemZIcEFuaVJlc3RhcnQoZGV2KTsKKyAgICB9CisgICAgZWxzZSBpZiAoYW5pU3RhdGUtPmxpc3RlblRpbWUgPiBIcFByaXYtPmFuaVBlcmlvZCkKKyAgICB7CisgICAgICAgIC8qIGNoZWNrIHRvIHNlZSBpZiBuZWVkIHRvIHJhaXNlIGltbXVuaXR5ICovCisgICAgICAgIGlmIChhbmlTdGF0ZS0+b2ZkbVBoeUVyckNvdW50ID4gYW5pU3RhdGUtPmxpc3RlblRpbWUgKgorICAgICAgICAgICAgYW5pU3RhdGUtPm9mZG1UcmlnSGlnaCAvIDEwMDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHpmSHBBbmlPZmRtRXJyVHJpZ2dlcihkZXYpOworICAgICAgICAgICAgemZIcEFuaVJlc3RhcnQoZGV2KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChhbmlTdGF0ZS0+Y2NrUGh5RXJyQ291bnQgPiBhbmlTdGF0ZS0+bGlzdGVuVGltZSAqCisgICAgICAgICAgICAgICBhbmlTdGF0ZS0+Y2NrVHJpZ0hpZ2ggLyAxMDAwKQorICAgICAgICB7CisgICAgICAgICAgICB6ZkhwQW5pQ2NrRXJyVHJpZ2dlcihkZXYpOworICAgICAgICAgICAgemZIcEFuaVJlc3RhcnQoZGV2KTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzL2hhbC9ocGFuaS5oIGIvZHJpdmVycy9zdGFnaW5nL290dXMvaGFsL2hwYW5pLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTZlNjlhZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL2hhbC9ocGFuaS5oCkBAIC0wLDAgKzEsNDIwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggQXRoZXJvcyBDb21tdW5pY2F0aW9ucyBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKyNpbmNsdWRlICIuLi84MDIxMWNvcmUvY3ByZWNvbXAuaCIKKwordHlwZWRlZiBzdHJ1Y3QgeworCXUzMl90CWFja3Jjdl9iYWQ7CisJdTMyX3QJcnRzX2JhZDsKKwl1MzJfdAlydHNfZ29vZDsKKwl1MzJfdAlmY3NfYmFkOworCXUzMl90CWJlYWNvbnM7Cit9IFpNX0hBTF9NSUJfU1RBVFM7CisKKy8qCisgKiBQZXItbm9kZSBzdGF0aXN0aWNzIG1haW50YWluZWQgYnkgdGhlIGRyaXZlciBmb3IgdXNlIGluCisgKiBvcHRpbWl6aW5nIHNpZ25hbCBxdWFsaXR5IGFuZCBvdGhlciBvcGVyYXRpb25hbCBhc3BlY3RzLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisJdTMyX3QJbnNfYXZnYnJzc2k7CS8qIGF2ZXJhZ2UgYmVhY29uIHJzc2kgKi8KKwl1MzJfdAluc19hdmdyc3NpOwkgICAgLyogYXZlcmFnZSBkYXRhIHJzc2kgKi8KKwl1MzJfdAluc19hdmd0eHJzc2k7CS8qIGF2ZXJhZ2UgdHggcnNzaSAqLworfSBaTV9IQUxfTk9ERV9TVEFUUzsKKworI2RlZmluZQlaTV9IQUxfUlNTSV9FUF9NVUxUSVBMSUVSCSgxPDw3KQkvKiBwb3cyIHRvIG9wdGltaXplIG91dCAqIGFuZCAvICovCisKK3N0cnVjdCB6c0FuaVN0YXRzIHsKKyAgICB1MzJfdCAgIGFzdF9hbmlfbml1cDsgICAvKiBBTkkgaW5jcmVhc2VkIG5vaXNlIGltbXVuaXR5ICovCisgICAgdTMyX3QgICBhc3RfYW5pX25pZG93bjsgLyogQU5JIGRlY3JlYXNlZCBub2lzZSBpbW11bml0eSAqLworICAgIHUzMl90ICAgYXN0X2FuaV9zcHVydXA7IC8qIEFOSSBpbmNyZWFzZWQgc3B1ciBpbW11bml0eSAqLworICAgIHUzMl90ICAgYXN0X2FuaV9zcHVyZG93bjsvKiBBTkkgZGVzY3JlYXNlZCBzcHVyIGltbXVuaXR5ICovCisgICAgdTMyX3QgICBhc3RfYW5pX29mZG1vbjsgLyogQU5JIE9GRE0gd2VhayBzaWduYWwgZGV0ZWN0IG9uICovCisgICAgdTMyX3QgICBhc3RfYW5pX29mZG1vZmY7LyogQU5JIE9GRE0gd2VhayBzaWduYWwgZGV0ZWN0IG9mZiAqLworICAgIHUzMl90ICAgYXN0X2FuaV9jY2toaWdoOy8qIEFOSSBDQ0sgd2VhayBzaWduYWwgdGhyZXNob2xkIGhpZ2ggKi8KKyAgICB1MzJfdCAgIGFzdF9hbmlfY2NrbG93OyAvKiBBTkkgQ0NLIHdlYWsgc2lnbmFsIHRocmVzaG9sZCBsb3cgKi8KKyAgICB1MzJfdCAgIGFzdF9hbmlfc3RlcHVwOyAvKiBBTkkgaW5jcmVhc2VkIGZpcnN0IHN0ZXAgbGV2ZWwgKi8KKyAgICB1MzJfdCAgIGFzdF9hbmlfc3RlcGRvd247LyogQU5JIGRlY3JlYXNlZCBmaXJzdCBzdGVwIGxldmVsICovCisgICAgdTMyX3QgICBhc3RfYW5pX29mZG1lcnJzOy8qIEFOSSBjdW11bGF0aXZlIG9mZG0gcGh5IGVyciBjb3VudCAqLworICAgIHUzMl90ICAgYXN0X2FuaV9jY2tlcnJzOy8qIEFOSSBjdW11bGF0aXZlIGNjayBwaHkgZXJyIGNvdW50ICovCisgICAgdTMyX3QgICBhc3RfYW5pX3Jlc2V0OyAgLyogQU5JIHBhcmFtZXRlcnMgemVybydkIGZvciBub24tU1RBICovCisgICAgdTMyX3QgICBhc3RfYW5pX2x6ZXJvOyAgLyogQU5JIGxpc3RlbiB0aW1lIGZvcmNlZCB0byB6ZXJvICovCisgICAgdTMyX3QgICBhc3RfYW5pX2xuZWc7ICAgLyogQU5JIGxpc3RlbiB0aW1lIGNhbGN1bGF0ZWQgPCAwICovCisgICAgWk1fSEFMX01JQl9TVEFUUyAgIGFzdF9taWJzdGF0czsgICAvKiBNSUIgY291bnRlciBzdGF0cyAqLworICAgIFpNX0hBTF9OT0RFX1NUQVRTICBhc3Rfbm9kZXN0YXRzOyAgLyogTGF0ZXN0IHJzc2kgc3RhdHMgZnJvbSBkcml2ZXIgKi8KK307CisKKy8qCisgKiBQZXItY2hhbm5lbCBBTkkgc3RhdGUgcHJpdmF0ZSB0byB0aGUgZHJpdmVyLgorICovCitzdHJ1Y3QgenNBbmlTdGF0ZSB7CisgICAgWk1fSEFMX0NIQU5ORUwgYzsKKyAgICB1OF90ICAgIG5vaXNlSW1tdW5pdHlMZXZlbDsKKyAgICB1OF90ICAgIHNwdXJJbW11bml0eUxldmVsOworICAgIHU4X3QgICAgZmlyc3RlcExldmVsOworICAgIHU4X3QgICAgb2ZkbVdlYWtTaWdEZXRlY3RPZmY7CisgICAgdThfdCAgICBjY2tXZWFrU2lnVGhyZXNob2xkOworCisgICAgLyogVGhyZXNob2xkcyAqLworICAgIHUzMl90ICAgbGlzdGVuVGltZTsKKyAgICB1MzJfdCAgIG9mZG1UcmlnSGlnaDsKKyAgICB1MzJfdCAgIG9mZG1UcmlnTG93OworICAgIHMzMl90ICAgY2NrVHJpZ0hpZ2g7CisgICAgczMyX3QgICBjY2tUcmlnTG93OworICAgIHMzMl90ICAgcnNzaVRockxvdzsKKyAgICBzMzJfdCAgIHJzc2lUaHJIaWdoOworCisgICAgdTMyX3QgICBub2lzZUZsb29yOyAvKiBUaGUgY3VycmVudCBub2lzZSBmbG9vciAqLworICAgIHUzMl90ICAgdHhGcmFtZUNvdW50OyAgIC8qIExhc3QgdHhGcmFtZUNvdW50ICovCisgICAgdTMyX3QgICByeEZyYW1lQ291bnQ7ICAgLyogTGFzdCByeCBGcmFtZSBjb3VudCAqLworICAgIHUzMl90ICAgY3ljbGVDb3VudDsgLyogTGFzdCBjeWNsZUNvdW50IChjYW4gZGV0ZWN0IHdyYXAtYXJvdW5kKSAqLworICAgIHUzMl90ICAgb2ZkbVBoeUVyckNvdW50Oy8qIE9GRE0gZXJyIGNvdW50IHNpbmNlIGxhc3QgcmVzZXQgKi8KKyAgICB1MzJfdCAgIGNja1BoeUVyckNvdW50OyAvKiBDQ0sgZXJyIGNvdW50IHNpbmNlIGxhc3QgcmVzZXQgKi8KKyAgICB1MzJfdCAgIG9mZG1QaHlFcnJCYXNlOyAvKiBCYXNlIHZhbHVlIGZvciBvZmRtIGVyciBjb3VudGVyICovCisgICAgdTMyX3QgICBjY2tQaHlFcnJCYXNlOyAgLyogQmFzZSB2YWx1ZSBmb3IgY2NrIGVyciBjb3VudGVycyAqLworICAgIHMxNl90ICAgcGt0UnNzaVsyXTsgLyogQXZlcmFnZSByc3NpIG9mIHBrdHMgZm9yIDIgYW50ZW5uYXMgKi8KKyAgICBzMTZfdCAgIG9mZG1FcnJSc3NpWzJdOyAvKiBBdmVyYWdlIHJzc2kgb2Ygb2ZkbSBwaHkgZXJycyBmb3IgMiBhbnQgKi8KKyAgICBzMTZfdCAgIGNja0VyclJzc2lbMl07ICAvKiBBdmVyYWdlIHJzc2kgb2YgY2NrIHBoeSBlcnJzIGZvciAyIGFudCAqLworfTsKKwordHlwZWRlZiBlbnVtIHsKKwlaTV9IQUxfQU5JX1BSRVNFTlQsCQkJLyogaXMgQU5JIHN1cHBvcnQgcHJlc2VudCAqLworCVpNX0hBTF9BTklfTk9JU0VfSU1NVU5JVFlfTEVWRUwsCQkvKiBzZXQgbGV2ZWwgKi8KKwlaTV9IQUxfQU5JX09GRE1fV0VBS19TSUdOQUxfREVURUNUSU9OLAkvKiBlbmFibGUvZGlzYWJsZSAqLworCVpNX0hBTF9BTklfQ0NLX1dFQUtfU0lHTkFMX1RIUiwJCS8qIGVuYWJsZS9kaXNhYmxlICovCisJWk1fSEFMX0FOSV9GSVJTVEVQX0xFVkVMLAkJCS8qIHNldCBsZXZlbCAqLworCVpNX0hBTF9BTklfU1BVUl9JTU1VTklUWV9MRVZFTCwJCS8qIHNldCBsZXZlbCAqLworCVpNX0hBTF9BTklfTU9ERSwJCQkJLyogMCA9PiBtYW51YWwsIDEgPT4gYXV0byAqLworCVpNX0hBTF9BTklfUEhZRVJSX1JFU0VULAkJCS8qIHJlc2V0IHBoeSBlcnJvciBzdGF0cyAqLworfSBaTV9IQUxfQU5JX0NNRDsKKworI2RlZmluZSBBUl9QSFlfQ09VTlRNQVggICAgICAgICgzIDw8IDIyKSAgICAgICAgIC8vIE1heCBjb3VudGVkIGJlZm9yZSBpbnRyCisjZGVmaW5lIFpNX0hBTF9QUk9DRVNTX0FOSSAgICAgMHgwMDAwMDAwMSAgLyogQU5JIHN0YXRlIHNldHVwICovCisjZGVmaW5lIFpNX1JTU0lfRFVNTVlfTUFSS0VSCTB4MTI3CisKKy8qIFBIWSByZWdpc3RlcnMgaW4gYXI1NDE2LCByZWxhdGVkIGJhc2UgYW5kIHJlZ2lzdGVyIG9mZnNldHMKKyAgIG1heSBuZWVkIHRvIGJlIGNoYW5nZWQgaW4gb3R1cyBCQiAqLworI2RlZmluZSBBUl9QSFlfQkFTRSAgICAgMHgxQzU4MDAgICAgICAvKiBiYXNlIGFkZHJlc3Mgb2YgcGh5IHJlZ3MgKi8KKyNkZWZpbmUgQVJfUEhZKF9uKSAgICAgIChBUl9QSFlfQkFTRSArICgoX24pPDwyKSkKKworI2RlZmluZSBBUl9QSFlfVEVTVCAgICAgICAgICAgICAweDFDNTgwMCAgICAgICAgICAvKiBQSFkgdGVzdCBjb250cm9sICovCisjZGVmaW5lIFBIWV9BR0NfQ0xSICAgICAgICAgICAgIDB4MTAwMDAwMDAgICAgICAvKiBkaXNhYmxlIEFHQyB0byBBMiAqLworI2RlZmluZSBSRlNJTEVOVF9CQiAgICAgICAgICAgICAweDAwMDAyMDAwICAgICAgLyogc2h1c2ggYmIgKi8KKworI2RlZmluZSBBUl9QSFlfVFVSQk8gICAgICAgIDB4MUM1ODA0ICAgICAgLyogZnJhbWUgY29udHJvbCByZWdpc3RlciAqLworI2RlZmluZSBBUl9QSFlfRkNfVFVSQk9fTU9ERSAgICAgICAgMHgwMDAwMDAwMSAgLyogU2V0IHR1cmJvIG1vZGUgYml0cyAqLworI2RlZmluZSBBUl9QSFlfRkNfVFVSQk9fU0hPUlQgICAgICAgMHgwMDAwMDAwMiAgLyogU2V0IHNob3J0IHN5bWJvbHMgdG8gdHVyYm8gbW9kZSBzZXR0aW5nICovCisjZGVmaW5lIEFSX1BIWV9GQ19EWU4yMDQwX0VOICAgICAgICAweDAwMDAwMDA0ICAgICAgLyogRW5hYmxlIGR5biAyMC80MCBtb2RlICovCisjZGVmaW5lIEFSX1BIWV9GQ19EWU4yMDQwX1BSSV9PTkxZICAgICAgMHgwMDAwMDAwOCAgICAgIC8qIGR5biAyMC80MCAtIHByaW1hcnkgb25seSAqLworI2RlZmluZSBBUl9QSFlfRkNfRFlOMjA0MF9QUklfQ0ggICAgMHgwMDAwMDAxMCAgICAgIC8qIGR5biAyMC80MCAtIHByaW1hcnkgY2ggb2Zmc2V0ICgwPSsxME1IeiwgMT0tMTBNSHopKi8KKyNkZWZpbmUgQVJfUEhZX0ZDX0RZTjIwNDBfRVhUX0NIICAgICAgICAweDAwMDAwMDIwICAgICAgLyogZHluIDIwLzQwIC0gZXh0IGNoIHNwYWNpbmcgKDA9MjBNSHovIDE9MjVNSHopICovCisjZGVmaW5lIEFSX1BIWV9GQ19IVF9FTiAgICAgICAgICAgICAweDAwMDAwMDQwICAgICAgLyogaHQgZW5hYmxlICovCisjZGVmaW5lIEFSX1BIWV9GQ19TSE9SVF9HSV80MCAgICAgICAweDAwMDAwMDgwICAgICAgLyogYWxsb3cgc2hvcnQgR0kgZm9yIEhUIDQwICovCisjZGVmaW5lIEFSX1BIWV9GQ19XQUxTSCAgICAgICAgICAgICAweDAwMDAwMTAwICAgICAgLyogd2Fsc2ggc3BhdGlhbCBzcHJlYWRpbmcgZm9yIDIgY2hhaW5zLDIgc3RyZWFtcyBUWCAqLworI2RlZmluZSBBUl9QSFlfRkNfU0lOR0xFX0hUX0xURjEgICAgICAgIDB4MDAwMDAyMDAgICAgICAvKiBzaW5nbGUgbGVuZ3RoICg0dXMpIDFzdCBIVCBsb25nIHRyYWluaW5nIHN5bWJvbCAqLworCisjZGVmaW5lIEFSX1BIWV9USU1JTkcyICAgICAgMHgxQzU4MTAgICAgICAvKiBUaW1pbmcgQ29udHJvbCAyICovCisjZGVmaW5lIEFSX1BIWV9USU1JTkcyX1VTRV9GT1JDRSAgICAweDAwMDAxMDAwCisjZGVmaW5lIEFSX1BIWV9USU1JTkcyX0ZPUkNFX1ZBTCAgICAweDAwMDAwZmZmCisKKyNkZWZpbmUgQVJfUEhZX1RJTUlORzMgICAgICAweDFDNTgxNCAgICAgIC8qIFRpbWluZyBjb250cm9sIDMgKi8KKyNkZWZpbmUgQVJfUEhZX1RJTUlORzNfRFNDX01BTiAgMHhGRkZFMDAwMAorI2RlZmluZSBBUl9QSFlfVElNSU5HM19EU0NfTUFOX1MgICAgMTcKKyNkZWZpbmUgQVJfUEhZX1RJTUlORzNfRFNDX0VYUCAgMHgwMDAxRTAwMAorI2RlZmluZSBBUl9QSFlfVElNSU5HM19EU0NfRVhQX1MgICAgMTMKKworI2RlZmluZSBBUl9QSFlfQ0hJUF9JRCAgICAgICAgICAweDFDNTgxOCAgICAgIC8qIFBIWSBjaGlwIHJldmlzaW9uIElEICovCisjZGVmaW5lIEFSX1BIWV9DSElQX0lEX1JFVl8wICAgIDB4ODAgICAgICAgIC8qIDU0MTYgUmV2IDAgKG93bCAxLjApIEJCICovCisjZGVmaW5lIEFSX1BIWV9DSElQX0lEX1JFVl8xICAgIDB4ODEgICAgICAgIC8qIDU0MTYgUmV2IDEgKG93bCAyLjApIEJCICovCisKKyNkZWZpbmUgQVJfUEhZX0FDVElWRSAgICAgICAweDFDNTgxQyAgICAgIC8qIGFjdGl2YXRpb24gcmVnaXN0ZXIgKi8KKyNkZWZpbmUgQVJfUEhZX0FDVElWRV9FTiAgICAweDAwMDAwMDAxICAvKiBBY3RpdmF0ZSBQSFkgY2hpcHMgKi8KKyNkZWZpbmUgQVJfUEhZX0FDVElWRV9ESVMgICAweDAwMDAwMDAwICAvKiBEZWFjdGl2YXRlIFBIWSBjaGlwcyAqLworCisjZGVmaW5lIEFSX1BIWV9SRl9DVEwyICAgICAgICAgICAgICAgICAgICAgIDB4MUM1ODI0CisjZGVmaW5lIEFSX1BIWV9UWF9FTkRfREFUQV9TVEFSVCAgMHgwMDAwMDBGRgorI2RlZmluZSBBUl9QSFlfVFhfRU5EX0RBVEFfU1RBUlRfUyAgMAorI2RlZmluZSBBUl9QSFlfVFhfRU5EX1BBX09OICAgICAgIDB4MDAwMEZGMDAKKyNkZWZpbmUgQVJfUEhZX1RYX0VORF9QQV9PTl9TICAgICAgIDgKKworCisjZGVmaW5lIEFSX1BIWV9SRl9DVEwzICAgICAgICAgICAgICAgICAgMHgxQzU4MjgKKyNkZWZpbmUgQVJfUEhZX1RYX0VORF9UT19BMl9SWF9PTiAgICAgICAweDAwRkYwMDAwCisjZGVmaW5lIEFSX1BIWV9UWF9FTkRfVE9fQTJfUlhfT05fUyAgICAgMTYKKworI2RlZmluZSBBUl9QSFlfQURDX0NUTCAgICAgIDB4MUM1ODJDCisjZGVmaW5lIEFSX1BIWV9BRENfQ1RMX09GRl9JTkJVRkdBSU4gICAgMHgwMDAwMDAwMworI2RlZmluZSBBUl9QSFlfQURDX0NUTF9PRkZfSU5CVUZHQUlOX1MgIDAKKyNkZWZpbmUgQVJfUEhZX0FEQ19DVExfT0ZGX1BXRERBQyAgIDB4MDAwMDIwMDAKKyNkZWZpbmUgQVJfUEhZX0FEQ19DVExfT0ZGX1BXREJBTkRHQVAgICAweDAwMDA0MDAwIC8qIEJCIFJldiA0LjIrIG9ubHkgKi8KKyNkZWZpbmUgQVJfUEhZX0FEQ19DVExfT0ZGX1BXREFEQyAgIDB4MDAwMDgwMDAgLyogQkIgUmV2IDQuMisgb25seSAqLworI2RlZmluZSBBUl9QSFlfQURDX0NUTF9PTl9JTkJVRkdBSU4gMHgwMDAzMDAwMAorI2RlZmluZSBBUl9QSFlfQURDX0NUTF9PTl9JTkJVRkdBSU5fUyAgIDE2CisKKyNkZWZpbmUgQVJfUEhZX0FEQ19TRVJJQUxfQ1RMICAgICAgIDB4MUM1ODMwCisjZGVmaW5lIEFSX1BIWV9TRUxfSU5URVJOQUxfQUREQUMgICAweDAwMDAwMDAwCisjZGVmaW5lIEFSX1BIWV9TRUxfRVhURVJOQUxfUkFESU8gICAweDAwMDAwMDAxCisKKyNkZWZpbmUgQVJfUEhZX1JGX0NUTDQgICAgICAgICAgICAgICAgICAgIDB4MUM1ODM0CisjZGVmaW5lIEFSX1BIWV9SRl9DVEw0X1RYX0VORF9YUEFCX09GRiAgICAweEZGMDAwMDAwCisjZGVmaW5lIEFSX1BIWV9SRl9DVEw0X1RYX0VORF9YUEFCX09GRl9TICAyNAorI2RlZmluZSBBUl9QSFlfUkZfQ1RMNF9UWF9FTkRfWFBBQV9PRkYgICAgMHgwMEZGMDAwMAorI2RlZmluZSBBUl9QSFlfUkZfQ1RMNF9UWF9FTkRfWFBBQV9PRkZfUyAgMTYKKyNkZWZpbmUgQVJfUEhZX1JGX0NUTDRfRlJBTUVfWFBBQl9PTiAgICAgIDB4MDAwMEZGMDAKKyNkZWZpbmUgQVJfUEhZX1JGX0NUTDRfRlJBTUVfWFBBQl9PTl9TICAgIDgKKyNkZWZpbmUgQVJfUEhZX1JGX0NUTDRfRlJBTUVfWFBBQV9PTiAgICAgIDB4MDAwMDAwRkYKKyNkZWZpbmUgQVJfUEhZX1JGX0NUTDRfRlJBTUVfWFBBQV9PTl9TICAgIDAKKworI2RlZmluZSBBUl9QSFlfU0VUVExJTkcgICAgIDB4MUM1ODQ0CisjZGVmaW5lIEFSX1BIWV9TRVRUTElOR19TV0lUQ0ggIDB4MDAwMDNGODAKKyNkZWZpbmUgQVJfUEhZX1NFVFRMSU5HX1NXSVRDSF9TICAgIDcKKworI2RlZmluZSBBUl9QSFlfUlhHQUlOICAgICAgIDB4MUM1ODQ4CisjZGVmaW5lIEFSX1BIWV9SWEdBSU5fVFhSWF9BVFRFTiAgICAweDAwMDNGMDAwCisjZGVmaW5lIEFSX1BIWV9SWEdBSU5fVFhSWF9BVFRFTl9TICAxMgorI2RlZmluZSBBUl9QSFlfUlhHQUlOX1RYUlhfUkZfTUFYICAgMHgwMDdDMDAwMAorI2RlZmluZSBBUl9QSFlfUlhHQUlOX1RYUlhfUkZfTUFYX1MgMTgKKworI2RlZmluZSBBUl9QSFlfREVTSVJFRF9TWiAgIDB4MUM1ODUwCisjZGVmaW5lIEFSX1BIWV9ERVNJUkVEX1NaX0FEQyAgICAgICAweDAwMDAwMEZGCisjZGVmaW5lIEFSX1BIWV9ERVNJUkVEX1NaX0FEQ19TICAgICAwCisjZGVmaW5lIEFSX1BIWV9ERVNJUkVEX1NaX1BHQSAgICAgICAweDAwMDBGRjAwCisjZGVmaW5lIEFSX1BIWV9ERVNJUkVEX1NaX1BHQV9TICAgICA4CisjZGVmaW5lIEFSX1BIWV9ERVNJUkVEX1NaX1RPVF9ERVMgICAweDBGRjAwMDAwCisjZGVmaW5lIEFSX1BIWV9ERVNJUkVEX1NaX1RPVF9ERVNfUyAyMAorCisjZGVmaW5lIEFSX1BIWV9GSU5EX1NJRyAgICAgIDB4MUM1ODU4CisjZGVmaW5lIEFSX1BIWV9GSU5EX1NJR19GSVJTVEVQICAweDAwMDNGMDAwCisjZGVmaW5lIEFSX1BIWV9GSU5EX1NJR19GSVJTVEVQX1MgICAgICAgIDEyCisjZGVmaW5lIEFSX1BIWV9GSU5EX1NJR19GSVJQV1IgICAweDAzRkMwMDAwCisjZGVmaW5lIEFSX1BIWV9GSU5EX1NJR19GSVJQV1JfUyAgICAgICAgIDE4CisKKyNkZWZpbmUgQVJfUEhZX0FHQ19DVEwxICAgICAgMHgxQzU4NUMKKyNkZWZpbmUgQVJfUEhZX0FHQ19DVEwxX0NPQVJTRV9MT1cgICAgICAgMHgwMDAwN0Y4MAorI2RlZmluZSBBUl9QSFlfQUdDX0NUTDFfQ09BUlNFX0xPV19TICAgICAgICAgNworI2RlZmluZSBBUl9QSFlfQUdDX0NUTDFfQ09BUlNFX0hJR0ggICAgICAweDAwM0Y4MDAwCisjZGVmaW5lIEFSX1BIWV9BR0NfQ1RMMV9DT0FSU0VfSElHSF9TICAgICAgICAxNQorCisjZGVmaW5lIEFSX1BIWV9BR0NfQ09OVFJPTCAgMHgxQzU4NjAgICAgICAvKiBjaGlwIGNhbGlicmF0aW9uIGFuZCBub2lzZSBmbG9vciBzZXR0aW5nICovCisjZGVmaW5lIEFSX1BIWV9BR0NfQ09OVFJPTF9DQUwgIDB4MDAwMDAwMDEgIC8qIGRvIGludGVybmFsIGNhbGlicmF0aW9uICovCisjZGVmaW5lIEFSX1BIWV9BR0NfQ09OVFJPTF9ORiAgIDB4MDAwMDAwMDIgIC8qIGRvIG5vaXNlLWZsb29yIGNhbGN1bGF0aW9uICovCisKKyNkZWZpbmUgQVJfUEhZX0NDQSAgICAgICAgICAgICAgMHgxQzU4NjQKKyNkZWZpbmUgQVJfUEhZX01JTkNDQV9QV1IgICAgICAgMHgxRkYwMDAwMAorI2RlZmluZSBBUl9QSFlfTUlOQ0NBX1BXUl9TICAgICAxOQorI2RlZmluZSBBUl9QSFlfQ0NBX1RIUkVTSDYyICAgICAweDAwMDdGMDAwCisjZGVmaW5lIEFSX1BIWV9DQ0FfVEhSRVNINjJfUyAgIDEyCisKKyNkZWZpbmUgQVJfUEhZX1NGQ09SUl9MT1cgICAgMHgxQzU4NkMKKyNkZWZpbmUgQVJfUEhZX1NGQ09SUl9MT1dfVVNFX1NFTEZfQ09SUl9MT1cgIDB4MDAwMDAwMDEKKyNkZWZpbmUgQVJfUEhZX1NGQ09SUl9MT1dfTTJDT1VOVF9USFJfTE9XICAgIDB4MDAwMDNGMDAKKyNkZWZpbmUgQVJfUEhZX1NGQ09SUl9MT1dfTTJDT1VOVF9USFJfTE9XX1MgIDgKKyNkZWZpbmUgQVJfUEhZX1NGQ09SUl9MT1dfTTFfVEhSRVNIX0xPVyAgMHgwMDFGQzAwMAorI2RlZmluZSBBUl9QSFlfU0ZDT1JSX0xPV19NMV9USFJFU0hfTE9XX1MgICAgMTQKKyNkZWZpbmUgQVJfUEhZX1NGQ09SUl9MT1dfTTJfVEhSRVNIX0xPVyAgMHgwRkUwMDAwMAorI2RlZmluZSBBUl9QSFlfU0ZDT1JSX0xPV19NMl9USFJFU0hfTE9XX1MgICAgMjEKKworI2RlZmluZSBBUl9QSFlfU0ZDT1JSICAgICAgIDB4MUM1ODY4CisjZGVmaW5lIEFSX1BIWV9TRkNPUlJfTTJDT1VOVF9USFIgICAgMHgwMDAwMDAxRgorI2RlZmluZSBBUl9QSFlfU0ZDT1JSX00yQ09VTlRfVEhSX1MgIDAKKyNkZWZpbmUgQVJfUEhZX1NGQ09SUl9NMV9USFJFU0ggIDB4MDBGRTAwMDAKKyNkZWZpbmUgQVJfUEhZX1NGQ09SUl9NMV9USFJFU0hfUyAgICAxNworI2RlZmluZSBBUl9QSFlfU0ZDT1JSX00yX1RIUkVTSCAgMHg3RjAwMDAwMAorI2RlZmluZSBBUl9QSFlfU0ZDT1JSX00yX1RIUkVTSF9TICAgIDI0CisKKyNkZWZpbmUgQVJfUEhZX1NMRUVQX0NUUl9DT05UUk9MICAgIDB4MUM1ODcwCisjZGVmaW5lIEFSX1BIWV9TTEVFUF9DVFJfTElNSVQgICAgICAweDFDNTg3NAorI2RlZmluZSBBUl9QSFlfU0xFRVBfU0NBTCAgICAgICAweDFDNTg3OAorCisjZGVmaW5lIEFSX1BIWV9QTExfQ1RMICAgICAgICAgIDB4MUM1ODdjICAgICAgLyogUExMIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgQVJfUEhZX1BMTF9DVExfNDAgICAgICAgMHhhYSAgICAgICAgLyogNDAgTUh6ICovCisjZGVmaW5lIEFSX1BIWV9QTExfQ1RMXzQwXzU0MTMgIDB4MDQKKyNkZWZpbmUgQVJfUEhZX1BMTF9DVExfNDQgICAgICAgMHhhYiAgICAgICAgLyogNDQgTUh6IGZvciAxMWIsIDExZyAqLworI2RlZmluZSBBUl9QSFlfUExMX0NUTF80NF8yMTMzICAweGViICAgICAgICAvKiA0NCBNSHogZm9yIDExYiwgMTFnICovCisjZGVmaW5lIEFSX1BIWV9QTExfQ1RMXzQwXzIxMzMgIDB4ZWEgICAgICAgIC8qIDQwIE1IeiBmb3IgMTFhLCB0dXJib3MgKi8KKworI2RlZmluZSBBUl9QSFlfUlhfREVMQVkgICAgIDB4MUM1OTE0ICAgICAgLyogYW5hbG9nIHBvdy1vbiB0aW1lICgxMDBucykgKi8KKyNkZWZpbmUgQVJfUEhZX1JYX0RFTEFZX0RFTEFZICAgMHgwMDAwM0ZGRiAgLyogZGVsYXkgZnJvbSB3YWtldXAgdG8gcnggZW5hICovCisKKyNkZWZpbmUgQVJfUEhZX1RJTUlOR19DVFJMNCAgICAgMHgxQzU5MjAgICAgICAvKiB0aW1pbmcgY29udHJvbCAqLworI2RlZmluZSBBUl9QSFlfVElNSU5HX0NUUkw0X0lRQ09SUl9RX1FfQ09GRiAweDAxRiAgIC8qIE1hc2sgZm9yIGtjb3NfdGhldGEtMSBmb3IgcSBjb3JyZWN0aW9uICovCisjZGVmaW5lIEFSX1BIWV9USU1JTkdfQ1RSTDRfSVFDT1JSX1FfUV9DT0ZGX1MgICAwICAgLyogc2hpZnQgZm9yIFFfQ09GRiAqLworI2RlZmluZSBBUl9QSFlfVElNSU5HX0NUUkw0X0lRQ09SUl9RX0lfQ09GRiAweDdFMCAgIC8qIE1hc2sgZm9yIHNpbl90aGV0YSBmb3IgaSBjb3JyZWN0aW9uICovCisjZGVmaW5lIEFSX1BIWV9USU1JTkdfQ1RSTDRfSVFDT1JSX1FfSV9DT0ZGX1MgICA1ICAgLyogU2hpZnQgZm9yIHNpbl90aGV0YSBmb3IgaSBjb3JyZWN0aW9uICovCisjZGVmaW5lIEFSX1BIWV9USU1JTkdfQ1RSTDRfSVFDT1JSX0VOQUJMRSAgIDB4ODAwICAgLyogZW5hYmxlIElRIGNvcnJlY3Rpb24gKi8KKyNkZWZpbmUgQVJfUEhZX1RJTUlOR19DVFJMNF9JUUNBTF9MT0dfQ09VTlRfTUFYIDB4RjAwMCAgLyogTWFzayBmb3IgbWF4IG51bWJlciBvZiBzYW1wbGVzIChsb2dhcml0aG1pYykgKi8KKyNkZWZpbmUgQVJfUEhZX1RJTUlOR19DVFJMNF9JUUNBTF9MT0dfQ09VTlRfTUFYX1MgICAxMiAgLyogU2hpZnQgZm9yIG1heCBudW1iZXIgb2Ygc2FtcGxlcyAqLworI2RlZmluZSBBUl9QSFlfVElNSU5HX0NUUkw0X0RPX0lRQ0FMICAgIDB4MTAwMDAgICAgIC8qIHBlcmZvcm0gSVEgY2FsaWJyYXRpb24gKi8KKworI2RlZmluZSBBUl9QSFlfVElNSU5HNSAgICAgIDB4MUM1OTI0CisjZGVmaW5lIEFSX1BIWV9USU1JTkc1X0NZQ1BXUl9USFIxICAweDAwMDAwMEZFCisjZGVmaW5lIEFSX1BIWV9USU1JTkc1X0NZQ1BXUl9USFIxX1MgICAgMQorCisjZGVmaW5lIEFSX1BIWV9QT1dFUl9UWF9SQVRFMSAgIDB4MUM1OTM0CisjZGVmaW5lIEFSX1BIWV9QT1dFUl9UWF9SQVRFMiAgIDB4MUM1OTM4CisjZGVmaW5lIEFSX1BIWV9QT1dFUl9UWF9SQVRFX01BWCAgICAweDFDNTkzYworI2RlZmluZSBBUl9QSFlfUE9XRVJfVFhfUkFURV9NQVhfVFBDX0VOQUJMRSAweDAwMDAwMDQwCisKKyNkZWZpbmUgQVJfUEhZX0ZSQU1FX0NUTCAgICAweDFDNTk0NAorI2RlZmluZSBBUl9QSFlfRlJBTUVfQ1RMX1RYX0NMSVAgICAgMHgwMDAwMDAzOAorI2RlZmluZSBBUl9QSFlfRlJBTUVfQ1RMX1RYX0NMSVBfUyAgMworCisjZGVmaW5lIEFSX1BIWV9UWFBXUkFESiAgICAgMHgxQzU5NEMgICAgICAvKiBCQiBSZXYgNC4yKyBvbmx5ICovCisjZGVmaW5lIEFSX1BIWV9UWFBXUkFESl9DQ0tfR0FJTl9ERUxUQSAgMHgwMDAwMEZDMAorI2RlZmluZSBBUl9QSFlfVFhQV1JBREpfQ0NLX0dBSU5fREVMVEFfUyAgICA2CisjZGVmaW5lIEFSX1BIWV9UWFBXUkFESl9DQ0tfUENEQUNfSU5ERVggMHgwMEZDMDAwMAorI2RlZmluZSBBUl9QSFlfVFhQV1JBREpfQ0NLX1BDREFDX0lOREVYX1MgICAxOAorCisjZGVmaW5lIEFSX1BIWV9SQURBUl8wICAgICAgMHgxQzU5NTQgICAgICAvKiByYWRhciBkZXRlY3Rpb24gc2V0dGluZ3MgKi8KKyNkZWZpbmUgQVJfUEhZX1JBREFSXzBfRU5BICAweDAwMDAwMDAxICAvKiBFbmFibGUgcmFkYXIgZGV0ZWN0aW9uICovCisjZGVmaW5lIEFSX1BIWV9SQURBUl8wX0lOQkFORCAgIDB4MDAwMDAwM2UgIC8qIEluYmFuZCBwdWxzZSB0aHJlc2hvbGQgKi8KKyNkZWZpbmUgQVJfUEhZX1JBREFSXzBfSU5CQU5EX1MgMQorI2RlZmluZSBBUl9QSFlfUkFEQVJfMF9QUlNTSSAgICAweDAwMDAwRkMwICAvKiBQdWxzZSByc3NpIHRocmVzaG9sZCAqLworI2RlZmluZSBBUl9QSFlfUkFEQVJfMF9QUlNTSV9TICA2CisjZGVmaW5lIEFSX1BIWV9SQURBUl8wX0hFSUdIVCAgIDB4MDAwM0YwMDAgIC8qIFB1bHNlIGhlaWdodCB0aHJlc2hvbGQgKi8KKyNkZWZpbmUgQVJfUEhZX1JBREFSXzBfSEVJR0hUX1MgMTIKKyNkZWZpbmUgQVJfUEhZX1JBREFSXzBfUlJTU0kgICAgMHgwMEZDMDAwMCAgLyogUmFkYXIgcnNzaSB0aHJlc2hvbGQgKi8KKyNkZWZpbmUgQVJfUEhZX1JBREFSXzBfUlJTU0lfUyAgMTgKKyNkZWZpbmUgQVJfUEhZX1JBREFSXzBfRklSUFdSICAgMHg3RjAwMDAwMCAgLyogUmFkYXIgZmlycHdyIHRocmVzaG9sZCAqLworI2RlZmluZSBBUl9QSFlfUkFEQVJfMF9GSVJQV1JfUyAyNAorCisjZGVmaW5lIEFSX1BIWV9TV0lUQ0hfQ0hBSU5fMCAgICAgMHgxQzU5NjAKKyNkZWZpbmUgQVJfUEhZX1NXSVRDSF9DT00gICAgICAgICAweDFDNTk2NAorCisjZGVmaW5lIEFSX1BIWV9TSUdNQV9ERUxUQSAgMHgxQzU5NkMgICAgICAvKiBBUjUzMTIgb25seSAqLworI2RlZmluZSBBUl9QSFlfU0lHTUFfREVMVEFfQURDX1NFTCAgMHgwMDAwMDAwMworI2RlZmluZSBBUl9QSFlfU0lHTUFfREVMVEFfQURDX1NFTF9TICAgIDAKKyNkZWZpbmUgQVJfUEhZX1NJR01BX0RFTFRBX0ZJTFQyICAgIDB4MDAwMDAwRjgKKyNkZWZpbmUgQVJfUEhZX1NJR01BX0RFTFRBX0ZJTFQyX1MgIDMKKyNkZWZpbmUgQVJfUEhZX1NJR01BX0RFTFRBX0ZJTFQxICAgIDB4MDAwMDFGMDAKKyNkZWZpbmUgQVJfUEhZX1NJR01BX0RFTFRBX0ZJTFQxX1MgIDgKKyNkZWZpbmUgQVJfUEhZX1NJR01BX0RFTFRBX0FEQ19DTElQIDB4MDFGRkUwMDAKKyNkZWZpbmUgQVJfUEhZX1NJR01BX0RFTFRBX0FEQ19DTElQX1MgICAxMworCisjZGVmaW5lIEFSX1BIWV9SRVNUQVJUICAgICAgMHgxQzU5NzAgICAgICAvKiByZXN0YXJ0ICovCisjZGVmaW5lIEFSX1BIWV9SRVNUQVJUX0RJVl9HQyAgIDB4MDAxQzAwMDAgIC8qIGJiX2FudF9mYXN0X2Rpdl9nY19saW1pdCAqLworI2RlZmluZSBBUl9QSFlfUkVTVEFSVF9ESVZfR0NfUyAxOAorCisjZGVmaW5lIEFSX1BIWV9SRkJVU19SRVEgICAgICAgIDB4MUM1OTdDCisjZGVmaW5lIEFSX1BIWV9SRkJVU19SRVFfRU4gICAgIDB4MDAwMDAwMDEKKworI2RlZmluZSBBUl9QSFlfUlhfQ0hBSU5NQVNLICAgICAweDFDNTlhNAorCisjZGVmaW5lIEFSX1BIWV9FWFRfQ0NBICAgICAgICAgIDB4MUM1OWJjCisjZGVmaW5lIEFSX1BIWV9FWFRfTUlOQ0NBX1BXUiAgIDB4RkY4MDAwMDAKKyNkZWZpbmUgQVJfUEhZX0VYVF9NSU5DQ0FfUFdSX1MgMjMKKworI2RlZmluZSBBUl9QSFlfSEFMRkdJICAgICAgICAgICAweDFDNTlEMCAgICAgIC8qIFRpbWluZyBjb250cm9sIDMgKi8KKyNkZWZpbmUgQVJfUEhZX0hBTEZHSV9EU0NfTUFOICAgMHgwMDA3RkZGMAorI2RlZmluZSBBUl9QSFlfSEFMRkdJX0RTQ19NQU5fUyA0CisjZGVmaW5lIEFSX1BIWV9IQUxGR0lfRFNDX0VYUCAgIDB4MDAwMDAwMEYKKyNkZWZpbmUgQVJfUEhZX0hBTEZHSV9EU0NfRVhQX1MgMAorCisjZGVmaW5lIEFSX1BIWV9IRUFWWV9DTElQX0VOQUJMRSAgICAweDFDNTlFMAorCisjZGVmaW5lIEFSX1BIWV9NX1NMRUVQICAgICAgMHgxQzU5ZjAgICAgICAvKiBzbGVlcCBjb250cm9sIHJlZ2lzdGVycyAqLworI2RlZmluZSBBUl9QSFlfUkVGQ0xLRExZICAgIDB4MUM1OWY0CisjZGVmaW5lIEFSX1BIWV9SRUZDTEtQRCAgICAgMHgxQzU5ZjgKKworLyogUEhZIElRIGNhbGlicmF0aW9uIHJlc3VsdHMgKi8KKyNkZWZpbmUgQVJfUEhZX0lRQ0FMX1JFU19QV1JfTUVBU19JIDB4MUM1QzEwICAvKiBwb3dlciBtZWFzdXJlbWVudCBmb3IgSSAqLworI2RlZmluZSBBUl9QSFlfSVFDQUxfUkVTX1BXUl9NRUFTX1EgMHgxQzVDMTQgIC8qIHBvd2VyIG1lYXN1cmVtZW50IGZvciBRICovCisjZGVmaW5lIEFSX1BIWV9JUUNBTF9SRVNfSVFfQ09SUl9NRUFTICAgMHgxQzVDMTggIC8qIElRIGNvcnJlbGF0aW9uIG1lYXN1cmVtZW50ICovCisKKyNkZWZpbmUgQVJfUEhZX0NVUlJFTlRfUlNTSSAweDFDNUMxYyAgICAgIC8qIHJzc2kgb2YgY3VycmVudCBmcmFtZSByeCdkICovCisKKyNkZWZpbmUgQVJfUEhZX1JGQlVTX0dSQU5UICAgICAgIDB4MUM1QzIwCisjZGVmaW5lIEFSX1BIWV9SRkJVU19HUkFOVF9FTiAgICAweDAwMDAwMDAxCisKKyNkZWZpbmUgQVJfUEhZX01PREUgICAgIDB4MUM2MjAwICAvKiBNb2RlIHJlZ2lzdGVyICovCisjZGVmaW5lIEFSX1BIWV9NT0RFX0FSMjEzMyAgMHgwOCAgICAvKiBBUjIxMzMgKi8KKyNkZWZpbmUgQVJfUEhZX01PREVfQVI1MTExICAweDAwICAgIC8qIEFSNTExMS9BUjIxMTEgKi8KKyNkZWZpbmUgQVJfUEhZX01PREVfQVI1MTEyICAweDA4ICAgIC8qIEFSNTExMiovCisjZGVmaW5lIEFSX1BIWV9NT0RFX0RZTkFNSUMgMHgwNCAgICAvKiBkeW5hbWljIENDSy9PRkRNIG1vZGUgKi8KKyNkZWZpbmUgQVJfUEhZX01PREVfUkYyR0haICAweDAyICAgIC8qIDIuNCBHSHogKi8KKyNkZWZpbmUgQVJfUEhZX01PREVfUkY1R0haICAweDAwICAgIC8qIDUgR0h6ICovCisjZGVmaW5lIEFSX1BIWV9NT0RFX0NDSyAgICAgMHgwMSAgICAvKiBDQ0sgKi8KKyNkZWZpbmUgQVJfUEhZX01PREVfT0ZETSAgICAweDAwICAgIC8qIE9GRE0gKi8KKworI2RlZmluZSBBUl9QSFlfQ0NLX1RYX0NUUkwgIDB4MUM2MjA0CisjZGVmaW5lIEFSX1BIWV9DQ0tfVFhfQ1RSTF9KQVBBTiAgICAweDAwMDAwMDEwCisKKyNkZWZpbmUgQVJfUEhZX0NDS19ERVRFQ1QgICAgICAgICAgICAgICAgICAgICAgICAgICAweDFDNjIwOAorI2RlZmluZSBBUl9QSFlfQ0NLX0RFVEVDVF9XRUFLX1NJR19USFJfQ0NLICAgICAgICAgIDB4MDAwMDAwM0YKKyNkZWZpbmUgQVJfUEhZX0NDS19ERVRFQ1RfV0VBS19TSUdfVEhSX0NDS19TICAgICAgICAwCisjZGVmaW5lIEFSX1BIWV9DQ0tfREVURUNUX0FOVF9TV0lUQ0hfVElNRSAgICAgICAgICAgMHgwMDAwMUZDMCAvLyBbMTI6Nl0gc2V0dGxpbmcgdGltZSBmb3IgYW50ZW5uYSBzd2l0Y2gKKyNkZWZpbmUgQVJfUEhZX0NDS19ERVRFQ1RfQU5UX1NXSVRDSF9USU1FX1MgICAgICAgICA2CisjZGVmaW5lIEFSX1BIWV9DQ0tfREVURUNUX0JCX0VOQUJMRV9BTlRfRkFTVF9ESVYgICAgMHgyMDAwCisKKyNkZWZpbmUgQVJfUEhZX0dBSU5fMkdIWiAgICAweDFDNjIwQworI2RlZmluZSBBUl9QSFlfR0FJTl8yR0haX1JYVFhfTUFSR0lOICAgIDB4MDBGQzAwMDAKKyNkZWZpbmUgQVJfUEhZX0dBSU5fMkdIWl9SWFRYX01BUkdJTl9TICAxOAorI2RlZmluZSBBUl9QSFlfR0FJTl8yR0haX0JTV19NQVJHSU4gICAgIDB4MDAwMDNDMDAKKyNkZWZpbmUgQVJfUEhZX0dBSU5fMkdIWl9CU1dfTUFSR0lOX1MgICAxMAorI2RlZmluZSBBUl9QSFlfR0FJTl8yR0haX0JTV19BVFRFTiAgICAgIDB4MDAwMDAwMUYKKyNkZWZpbmUgQVJfUEhZX0dBSU5fMkdIWl9CU1dfQVRURU5fUyAgICAwCisKKyNkZWZpbmUgQVJfUEhZX0NDS19SWENUUkw0ICAweDFDNjIxQworI2RlZmluZSBBUl9QSFlfQ0NLX1JYQ1RSTDRfRlJFUV9FU1RfU0hPUlQgICAweDAxRjgwMDAwCisjZGVmaW5lIEFSX1BIWV9DQ0tfUlhDVFJMNF9GUkVRX0VTVF9TSE9SVF9TIDE5CisKKyNkZWZpbmUgQVJfUEhZX0RBR19DVFJMQ0NLICAweDFDNjIyOAorI2RlZmluZSBBUl9QSFlfREFHX0NUUkxDQ0tfRU5fUlNTSV9USFIgIDB4MDAwMDAyMDAgLyogQkIgUmV2IDQuMisgb25seSAqLworI2RlZmluZSBBUl9QSFlfREFHX0NUUkxDQ0tfUlNTSV9USFIgMHgwMDAxRkMwMCAvKiBCQiBSZXYgNC4yKyBvbmx5ICovCisjZGVmaW5lIEFSX1BIWV9EQUdfQ1RSTENDS19SU1NJX1RIUl9TICAgMTAgICAgIC8qIEJCIFJldiA0LjIrIG9ubHkgKi8KKworI2RlZmluZSBBUl9QSFlfUE9XRVJfVFhfUkFURTMgICAweDFDNjIzNAorI2RlZmluZSBBUl9QSFlfUE9XRVJfVFhfUkFURTQgICAweDFDNjIzOAorCisjZGVmaW5lIEFSX1BIWV9TQ1JNX1NFUV9YUiAgMHgxQzYyM0MKKyNkZWZpbmUgQVJfUEhZX0hFQURFUl9ERVRFQ1RfWFIgMHgxQzYyNDAKKyNkZWZpbmUgQVJfUEhZX0NISVJQX0RFVEVDVEVEX1hSICAgIDB4MUM2MjQ0CisjZGVmaW5lIEFSX1BIWV9CTFVFVE9PVEggICAgMHgxQzYyNTQKKworI2RlZmluZSBBUl9QSFlfVFBDUkcxICAgMHgxQzYyNTggIC8qIGFyMjQxMyBwb3dlciBjb250cm9sICovCisjZGVmaW5lIEFSX1BIWV9UUENSRzFfTlVNX1BEX0dBSU4gICAweDAwMDBjMDAwCisjZGVmaW5lIEFSX1BIWV9UUENSRzFfTlVNX1BEX0dBSU5fUyAxNAorCisjZGVmaW5lIEFSX1BIWV9UUENSRzFfUERfR0FJTl8xICAgIDB4MDAwMzAwMDAKKyNkZWZpbmUgQVJfUEhZX1RQQ1JHMV9QRF9HQUlOXzFfUyAgMTYKKyNkZWZpbmUgQVJfUEhZX1RQQ1JHMV9QRF9HQUlOXzIgICAgMHgwMDBDMDAwMAorI2RlZmluZSBBUl9QSFlfVFBDUkcxX1BEX0dBSU5fMl9TICAxOAorI2RlZmluZSBBUl9QSFlfVFBDUkcxX1BEX0dBSU5fMyAgICAweDAwMzAwMDAwCisjZGVmaW5lIEFSX1BIWV9UUENSRzFfUERfR0FJTl8zX1MgIDIwCisvLworCisjZGVmaW5lIEFSX1BIWV9BTkFMT0dfU1dBUCAgICAgIDB4YTI2OAorI2RlZmluZSBBUl9QSFlfU1dBUF9BTFRfQ0hBSU4gICAweDAwMDAwMDQwCisKKyNkZWZpbmUgQVJfUEhZX1RQQ1JHNSAgIDB4MUM2MjZDIC8qIGFyMjQxMyBwb3dlciBjb250cm9sICovCisjZGVmaW5lIEFSX1BIWV9UUENSRzVfUERfR0FJTl9PVkVSTEFQICAgMHgwMDAwMDAwRgorI2RlZmluZSBBUl9QSFlfVFBDUkc1X1BEX0dBSU5fT1ZFUkxBUF9TICAgICAwCisjZGVmaW5lIEFSX1BIWV9UUENSRzVfUERfR0FJTl9CT1VOREFSWV8xICAgIDB4MDAwMDAzRjAKKyNkZWZpbmUgQVJfUEhZX1RQQ1JHNV9QRF9HQUlOX0JPVU5EQVJZXzFfUyAgNAorI2RlZmluZSBBUl9QSFlfVFBDUkc1X1BEX0dBSU5fQk9VTkRBUllfMiAgICAweDAwMDBGQzAwCisjZGVmaW5lIEFSX1BIWV9UUENSRzVfUERfR0FJTl9CT1VOREFSWV8yX1MgIDEwCisjZGVmaW5lIEFSX1BIWV9UUENSRzVfUERfR0FJTl9CT1VOREFSWV8zICAgIDB4MDAzRjAwMDAKKyNkZWZpbmUgQVJfUEhZX1RQQ1JHNV9QRF9HQUlOX0JPVU5EQVJZXzNfUyAgMTYKKyNkZWZpbmUgQVJfUEhZX1RQQ1JHNV9QRF9HQUlOX0JPVU5EQVJZXzQgICAgMHgwRkMwMDAwMAorI2RlZmluZSBBUl9QSFlfVFBDUkc1X1BEX0dBSU5fQk9VTkRBUllfNF9TICAyMgorCisjZGVmaW5lIEFSX1BIWV9QT1dFUl9UWF9SQVRFNSAgIDB4MUM2MzhDCisjZGVmaW5lIEFSX1BIWV9QT1dFUl9UWF9SQVRFNiAgIDB4MUM2MzkwCisKKyNkZWZpbmUgQVJfUEhZX0NBTF9DSEFJTk1BU0sgICAgMHgxQzYzOUMKKworI2RlZmluZSBBUl9QSFlfUE9XRVJfVFhfU1VCICAgICAweDFDNjNDOAorI2RlZmluZSBBUl9QSFlfUE9XRVJfVFhfUkFURTcgICAweDFDNjNDQworI2RlZmluZSBBUl9QSFlfUE9XRVJfVFhfUkFURTggICAweDFDNjNEMAorI2RlZmluZSBBUl9QSFlfUE9XRVJfVFhfUkFURTkgICAweDFDNjNENApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvaGFsL2hwZncyLmMgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy9oYWwvaHBmdzIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYWNlYjAyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvaGFsL2hwZncyLmMKQEAgLTAsMCArMSwxMDE4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggQXRoZXJvcyBDb21tdW5pY2F0aW9ucyBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKyNpbmNsdWRlICIuLi84MDIxMWNvcmUvY3ByZWNvbXAuaCIKKworY29uc3QgdTMyX3QgemNQMkZ3SW1hZ2VbXSA9IHsKKzB4MDAwOTAwMEIsIDB4NEYyMjJGRTYsIDB4REU5NDdGRkMsIDB4RTExNEQ1OTQsCisweDFFMTNENDk0LCAweDY3NTIxRTRDLCAweEQ0OTRENjkzLCAweDM3NDAyNzY5LAorMHg2MjUyOEYwNiwgMHg3MjAxRDY5MiwgMHg2MDYwMjUyMiwgMHgyNjAwQzkzRiwKKzB4RDc5MDYxNTIsIDB4MjUxMjYxMUQsIDB4MjY0QjY2NTIsIDB4MjU2MjQ3MEIsCisweDAwMDlCMDBELCAweEU2MDA5NUFDLCAweEM4NDA2MEUyLCAweDJGMDI4RjAzLAorMHg4RkY5MzY1MiwgMHg3RjA0NzYwMSwgMHhBMDVBNEYyNiwgMHg0RjIyNkVGNiwKKzB4NDEwQkQxODUsIDB4RDQ4NTAwMDksIDB4MDAwOTQ0MEIsIDB4NDUwQkQ1ODQsCisweEQ3ODQwMDA5LCAweEQyODRFMUZGLCAweDI3MTI2MTFELCAweEQ0ODM1MDI5LAorMHhFMUZGQ0IwMSwgMHgxMjA5RTUwMSwgMHgxMjExMjIxMiwgMHhFNzIwMjQ1MiwKKzB4NDcxOEQ1N0YsIDB4MjU3MkQyN0YsIDB4RDE3RkU3MDAsIDB4RDY4MEQ0N0YsCisweEUyMDEyMjcwLCAweDI0NzAyMTcyLCAweEQ2N0UyNjIwLCAweDI2NDFFNEZGLAorMHhENTdERTYwMCwgMHg2NjZERTEwNCwgMHg3NjAxNjA2MywgMHg0MDAwNjI2RCwKKzB4OEZGODMyMTIsIDB4RDU3OTA1NDUsIDB4MjUyMEUyMDEsIDB4RDI3OUQ3NzgsCisweDI3MTBFMTAwLCAweEU1ODAyMjEyLCAweDY1NUM2NjEzLCAweDY2NkRENDc2LAorMHg3NjA0Njc2MywgMHgzNzRDNjI2RCwgMHg4RkY4MzI1MywgMHhENDczMjcxMiwKKzB4RDU3M0UxMDEsIDB4RDY3MzI0MTAsIDB4MjU0MkU0MDAsIDB4RTAzQUU1MDEsCisweEQyNzJENzcxLCAweEUwMzkwNjU0LCAweDI3MTEwNjU0LCAweDAwMEI0RjI2LAorMHg3RkM4MjIxMSwgMHhENzZGRDE2RSwgMHhEQzcwREI2RiwgMHhEMjcxREU3MCwKKzB4RDU3MkQ0NzEsIDB4MUYxMkQ2NzIsIDB4MUY3NjcxMEMsIDB4MUZCODc3RkMsCisweDFGRUExRkM5LCAweDcyMDQxRjJCLCAweERFNkZEQzZFLCAweDFGMTNFQjEwLAorMHgxRjUxMUY0NCwgMHgxRjc3MUY2NSwgMHhEODZDMUYyQywgMHhERDZERDk2QywKKzB4RDI2REVBMDAsIDB4ODkwMDNBMjIsIDB4RDE1ODdBMDEsIDB4ODgwMTYwMTAsCisweDU2Rjk4QjAzLCAweDQyMThFMjAxLCAweEQxNjgyNjIyLCAweDAwMDk0MTBCLAorMHg0NDBCRDQ2NywgMHhENTY3MDAwOSwgMHgwMDA5NDUwQiwgMHg2MDEwRDE0QywKKzB4OEIxMDg4MDEsIDB4RTY1MEQxNEIsIDB4NDYxODYyMTIsIDB4OEIwODMyNjYsCisweDU2RkFEMTQ3LCAweDIxMjBFMjAwLCAweENCMDE2MDYyLCAweDI2MDJBMDAzLAorMHg3MjAxMjcxMCwgMHg2MDgyMjEyMiwgMHg4OTA5ODgwMSwgMHhFMkM4RDE1QSwKKzB4NjIyQzY2MTIsIDB4ODkwMzM2MjYsIDB4NjAxMEQxNTgsIDB4OEJDODg4MDEsCisweDUxRjc2NzkyLCAweDIxNzI1MkY2LCAweEQ2NTU1MTkxLCAweDU1RkIyMjEyLAorMHg1MkZDNjQ2MiwgMHg1NTYxMjU0MiwgMHgyMjUyRTQwMCwgMHg2MTQzNjY0MywKKzB4MDVERTYwMTMsIDB4MzZDQzQ2MDgsIDB4MDJERTI2NTIsIDB4QzkwMzYwMjEsCisweDhCMDI4ODAxLCAweDcyMDE2MkUyLCAweDc0MDEyRTIyLCAweDM2QjM2NjRDLAorMHg3MTA0OEZFRSwgMHg2NkMyRDE0NywgMHg0NTI4NjUxMiwgMHgyNjVCNDUxOCwKKzB4NjA4MjJDNjIsIDB4ODkwMTg4MDEsIDB4MDAwOUExNjgsIDB4NjI3MkQ3NDIsCisweDhCMTMyMjI4LCAweEQ3MjZENTQxLCAweDY1NTJENDQxLCAweDUxNDM2NjcyLAorMHgzMTZDMzY1QywgMHgyNzYyMjY2OCwgMHgxNDEzOEQwNSwgMHg2MjYyRDYzRCwKKzB4QjFBNTcyMDEsIDB4RDYxRTI2MjIsIDB4MjYyMkUyMDAsIDB4NTI5MTY2OTIsCisweDhCMDEzNjIwLCAweDAwMDlBMTQ0LCAweDYwNjFBMDZFLCAweDAwMUMwMDFDLAorMHgwMDFENDAyMCwgMHgwMDAwQjM4RSwgMHhGRkZGMDAwMCwgMHgxMjM0MDAwMCwKKzB4MDAxRTEwMTUsIDB4MDAyMDEyNzgsIDB4MDAyMDE4QTAsIDB4MDAyMDE5MjIsCisweDAwMjAxMjhDLCAweDAwMUMzNTEwLCAweDAwMUMzNjI0LCAweDAwMUUyMTJDLAorMHgwMDIwMzk3QywgMHgwMDIwMzUxNCwgMHgwMDIwMzk4NCwgMHgwMDIwMzk5MCwKKzB4MDAyMDM5OUMsIDB4MDAyMDM5RjgsIDB4MDAyMDM5RkMsIDB4MDAyMDM5QTQsCisweDAwMjAzOUE1LCAweDAwMjAzOUE4LCAweDAwMTE3NzAwLCAweDAwMjAzQTEyLAorMHgwMDIwMzU3OCwgMHgwMDExNDJEOCwgMHgwMDIwM0ExNCwgMHgwMDIwM0ExNiwKKzB4MDAxQzNEMzAsIDB4MDAxMTc3MTgsIDB4MDAxQzNEMDAsIDB4MDAxQzEwMDAsCisweDAwMUMzNkY4LCAweDAwMTE3NzM0LCAweDAwMUMzNjg0LCAweDAwMTE3NzEwLAorMHgwMDFDMzUyMCwgMHgwMDExNzYwMCwgMHgwMDExNzc0MCwgMHgwMDFDMTAyOCwKKzB4MDAyMDM1OEMsIDB4MDAyMDM5QUMsIDB4N0ZGRkZGRkYsIDB4MDAyMDE3MzQsCisweDAwMjAzMkJFLCAweDAwMjAyMkU4LCAweDAwMjAzREMwLCAweDAwMjAzOUZBLAorMHgwMDIwMzU4NCwgMHgwMDIwMzlFQywgMHgwMDFDM0QyQywgMHgwMDFDMzZCMCwKKzB4MDAyMDM1MUMsIDB4MDAxMTc3NUMsIDB4ODgwMUM5MEYsIDB4QTBDRjg5MDEsCisweEQxN0MwMDA5LCAweDM2MjA2MjEyLCAweEQ0N0I4OTA0LCAweDI0MjFFMjAwLAorMHgyMTYyQTBDQywgMHg2MjExRDE3OSwgMHg4OTAxMjIyOCwgMHgwMDA5QTBDMywKKzB4RTIwMkQ3NzUsIDB4NzUwMTY1NzEsIDB4MzEyMzYxNUQsIDB4Mjc1MThEMDIsCisweDAwMDlBMEJDLCAweEQyNzI1NUYyLCAweDYyMjI2MDUyLCAweDQwMDk0MDE5LAorMHhDOTBGNDAwOSwgMHg4RjE5ODgwQSwgMHg1MkYzMUYyRCwgMHg0MDE5NjAyMiwKKzB4NDAwOTQwMDksIDB4ODgwOEM5MEYsIDB4QTBBNzg5MDEsIDB4NjA2MzAwMDksCisweDUxRjI1NUY4LCAweEU3MDFDQjAxLCAweDI1MDJEMjYzLCAweEUxMDAyMTcyLAorMHgyMjExRDU2NCwgMHg3NDAxNjQ1MiwgMHgyNTQyQTA5OCwgMHg4QjNGODgwNSwKKzB4NjAyMjUyRjMsIDB4NDAwOTQwMTksIDB4QzkwRjQwMDksIDB4OEIxNjg4MDIsCisweEU1RkZENDVELCAweDY1NUQ2NzQyLCAweDhCMTAyNzU4LCAweDYyNzJENzVCLAorMHg4QjBDMzI2MCwgMHg1NUYyNTdGOCwgMHgyNzYyRTEwMSwgMHhENTUyMjUxMiwKKzB4RDc1N0U0MDAsIDB4NjI3MjI1NDEsIDB4QTA3NzcyMDEsIDB4NTJGMzI3MjIsCisweDQwMTk2MDIyLCAweDQwMDk0MDA5LCAweDg4MDVDOTBGLCAweDMxQjM4QjZFLAorMHhENTUwOEI2QywgMHg2MTUyNTdGNCwgMHg3MTAxRTI0MCwgMHg2NDcyMjUxMiwKKzB4MUY0REQxNEQsIDB4NDIxODI0MTksIDB4OEIwMzM0MjAsIDB4NjI2MkQ2NEIsCisweDI2MjI3MjAxLCAweEUyMDBENjQwLCAweDI2MjFCMEFBLCAweDAwMDlBMDU2LAorMHgzMTIzRTIyMCwgMHg4ODAzOEI1MiwgMHg1MkYzOEIxRSwgMHg0MDE5NjAyMiwKKzB4NDAwOTQwMDksIDB4ODgwM0M5MEYsIDB4RDc0MThCMTYsIDB4NjQ3MjUxRjQsCisweDc0MDFEMjNELCAweDY1MTIyNzQyLCAweDFGNURFNjQwLCAweDQ2MTgyNTI5LAorMHg4QjAzMzU2MCwgMHg2MjYyRDYzQiwgMHgyNjIyNzIwMSwgMHhFMjAwRDYyRSwKKzB4MjYyMUIwODYsIDB4MDAwOUEwMTAsIDB4RDczOEQxMzcsIDB4RDIyQTY0MTIsCisweEU1MDA3NDAxLCAweDIxNDIzQTc2LCAweDIyNTE4RjA2LCAweEVBMDBENjM0LAorMHg3MjAxNjI2MiwgMHgyNjIyQjA3NCwgMHgyRkIyRDUzMiwgMHg5NTQwNjY1MiwKKzB4RDQzMDVCRjEsIDB4MzYyMDUyNDEsIDB4NjA2MTg5MTAsIDB4OEIwMUM4MDMsCisweDJCMjJFMjAxLCAweDhGRjU0NTEwLCAweDU3RjE1NjY0LCAweDYyNzJFMUYwLAorMHg0MTI4NDExOCwgMHgyNzIyMjIxQiwgMHg2QkYyQTAwOCwgMHg2QkYyQTAwNiwKKzB4RTIwMEQ2MTUsIDB4RDExNTI2MjEsIDB4MjEyMUUyMDAsIDB4RTIwMjU2RjUsCisweDQyMTg2NjYyLCAweDI2Mjg0MjI4LCAweDFGNkQ4RDBDLCAweEQ2MUZEMTFFLAorMHg0NjBCNjUxMSwgMHgyMDA4NjQ1RCwgMHg1N0Y1ODkwNCwgMHg2MjcyRDExQywKKzB4MjcyMjIyMTksIDB4RDExQkUyMDEsIDB4NjYxMjI4MjIsIDB4OEIwMTI2NjgsCisweDAwMDlBRTE3LCAweDQ1MEJENTE4LCAweEQxMTgwMDA5LCAweEFFMTBFNjAwLAorMHgwN0QxMjE2MCwgMHgwMDIwM0EwQywgMHgwMDIwM0ExMCwgMHgwMDIwM0ExOCwKKzB4MDAxQzNEQzAsIDB4MDAxMTc3MkMsIDB4MDAxQzNCODgsIDB4MDAyMDM5RjQsCisweDAwMTE3NzNDLCAweDAwMTE3NzQ0LCAweDAwMDBGMDAwLCAweDAwMTE3NzY0LAorMHgwMDExNzc0OCwgMHgwMDExNzc2OCwgMHgwMDExNzc2QywgMHgwMUZGRkZGRiwKKzB4MDAxMTc3NEMsIDB4MDAyMDM1ODQsIDB4MDAxMTQyRDgsIDB4MDAxMTQ3NzQsCisweEZERkZGRkZGLCAweDAwMjAzREMwLCAweDAwMjAyNDZDLCAweDAwMjAzOUZBLAorMHgyRjk2MkY4NiwgMHgyRkI2MkZBNiwgMHgyRkQ2MkZDNiwgMHg0RjIyMkZFNiwKKzB4RDExRjdGRjQsIDB4NjIxMkRFMUYsIDB4NjdFMjU0MTEsIDB4RDQxRTFGNDEsCisweDFGNzIyRjIyLCAweDY3NDNENTFELCAweDc3OTREMjFELCAweDVBNDI1ODQxLAorMHg2QzcyNjk0MiwgMHg2RDIyNUIxNiwgMHhFNjAwNjA1MiwgMHgyNTAyQ0IyMCwKKzB4NzYwMUU1NDAsIDB4MzI1MzYyNkQsIDB4NjJGMjhCRkIsIDB4MjEyMjU1RjEsCisweDU1RjIxMTUxLCAweDJFNTJENjEzLCAweDE0QTIxNDgxLCAweEQ0MTIyNDkyLAorMHgxMUI2MjdDMiwgMHg2NzQyMjZEMiwgMHhEOTExREExMCwgMHgyQTcyRTgwMSwKKzB4MUE4QzQ5MEIsIDB4NDIxOEUyMDEsIDB4N0YwQzFBMkMsIDB4NkVGNjRGMjYsCisweDZDRjY2REY2LCAweDZBRjY2QkY2LCAweDAwMEI2OUY2LCAweDAwMDA2OEY2LAorMHgwMDFDM0I5QywgMHgwMDFDM0Q5OCwgMHgwMDFDMzcwMCwgMHgwMDFDMzUwMCwKKzB4MDAxQzU5NjAsIDB4MDAxQzg5NjAsIDB4MDAyMDM1OEMsIDB4MDAxQzNEMDAsCisweDAwMjAxNjEwLCAweDJGOTYyRjg2LCAweDJGQzYyRkE2LCAweDJGRTYyRkQ2LAorMHg0RjEyNEYyMiwgMHg3Rjg4NEYwMiwgMHhFMDE4REVCMiwgMHhENEIyNjFFMCwKKzB4NjFFMzBGMTQsIDB4NjIxMDcxMDEsIDB4NDQwQkUwMUMsIDB4MjAwODBGMjQsCisweDhGMTI2RDAzLCAweEQ0QUQxRjA4LCAweDY3NDBEREFELCAweDY1N0NENEFELAorMHg0NzBCRDdBRCwgMHhEMkFEMDAwOSwgMHg2MjFDNjEyMCwgMHg0NjA4NjYyMywKKzB4MzYyODQ2MDgsIDB4M0Q2QzQ2MDgsIDB4RTAxQzFGRDgsIDB4RTU4MDA0RkMsCisweDYwNEM2NkUyLCAweDMwNTA2NTVDLCAweDJENjI4RjE3LCAweDAxRkNFMDE4LAorMHhERUEzRTUwMCwgMHg2NDFDQTAwOCwgMHg2NzUzNjU1RCwgMHg2MDcwMzdFQywKKzB4MzFEQzYxNTMsIDB4ODAxNDc1MDEsIDB4MzI0MzYyNUQsIDB4RDQ5RDhCRjQsCisweEUyMDBENTlELCAweEEyN0YyNDIxLCAweDIwMDgyNTIxLCAweEUwMTg4QjEzLAorMHhFNTAwMDFGQywgMHhBMDA5REU5NiwgMHg2NTVENjQxQywgMHgzMkVDNjI1MywKKzB4NjI1MzY3MjIsIDB4MzJEQzY2NzIsIDB4NzUwNDEyNjEsIDB4MzI0MzYyNUQsCisweEEyNjk4QkYzLCAweDg4MDEyRDEwLCAweEUwMTg4QjE2LCAweEU0MDAwMUZDLAorMHg2NzFDMkQ0MCwgMHg2MjREREU4QSwgMHg4QjAxMzI3MywgMHgwMDA5QTI1QywKKzB4NkRFMzY0NEQsIDB4N0QwNDYyNDMsIDB4MzJFQzY2NDMsIDB4NjUyMjM2REMsCisweDc0MDg2MTYyLCAweDI1MTJBRkVGLCAweDhCMTk4ODA0LCAweDAxRkNFMDE4LAorMHgyRDcwRTcwMCwgMHgxRkQ1NkQxQywgMHg2MjdEREU3RCwgMHg4QjAxMzJEMywKKzB4MDAwOUEyNDIsIDB4NjE3MzY3N0QsIDB4MzFFQzY1RTMsIDB4NzUwNDY0MTIsCisweDM2NUM2NjczLCAweDYxNDI2MjYyLCAweDIxMjk3NzA4LCAweDI0MTJBRkVELAorMHg4QjE5ODgwNSwgMHgwMUZDRTAxOCwgMHgyRDcwRTcwMCwgMHgxRkQ0NkQxQywKKzB4NjI3RERFNkYsIDB4OEIwMTMyRDMsIDB4MDAwOUEyMjYsIDB4NjE3MzY3N0QsCisweDMxRUM2NUUzLCAweDc1MDQ2NDEyLCAweDM2NUM2NjczLCAweDYxNDI2MjYyLAorMHgyMTJCNzcwOCwgMHgyNDEyQUZFRCwgMHg4QjU5ODgzMSwgMHg2MUU2REU2NywKKzB4NjFFMzFGMTksIDB4NjRFMjcxMDQsIDB4MUY0QTYyMTYsIDB4MUYyQjY0MTYsCisweDc1RTQ2NTEzLCAweDY2NTM2NzEyLCAweDFGNEM3NjA0LCAweDY0NTIxRjdELAorMHhENzVGNkU2NiwgMHgyN0UwRDI1RiwgMHhERTVGNjA2MiwgMHhDOTAxMzI0NSwKKzB4NjU2MjJFMDAsIDB4NDYwOTA2MEEsIDB4NDYwOUQxNUMsIDB4NDYwOTQ1MDksCisweDIxNTAxRjRFLCAweEIyQjA2NDZELCAweDYyMEQxRjZGLCAweDhCMDEyMjI4LAorMHgwMDA5QTFFQSwgMHhENzU2REU1NSwgMHg2NjFDNjFFMCwgMHg2NDEwRDE1MCwKKzB4NDcwQjY1NEMsIDB4N0ZGQzU0RkYsIDB4MkZFMjVFRkUsIDB4NTFGRTdGRkMsCisweDJGMTJFMDQwLCAweDU1RkJEMTRGLCAweDU3RkQ1NkZDLCAweDA0RkU0MTBCLAorMHhEMjREN0YwOCwgMHhFMTFDNjQwRCwgMHgxRDQxMkQxMCwgMHhENDRCNjUyMiwKKzB4Njc0MjFENTIsIDB4MUQ3M0RFNEEsIDB4RDI0QTY1RTIsIDB4NjcyMjFENTQsCisweDFENzVEMjQ5LCAweEQyNDk2RTIyLCAweDY2MjIxREU2LCAweDFENjdBMUJDLAorMHg4OTAxODgzMCwgMHgwMDA5QTA4RSwgMHhFMzQwRDUzOCwgMHgzM0ZDNjE1NiwKKzB4MjMxMjY0NTYsIDB4NzEwNDYxNTMsIDB4Njc1MjEzNDEsIDB4MTM3MjY0MTYsCisweDdFRTQ2RTEzLCAweDY1RTY2MjEyLCAweDY2RTNENzMxLCAweDEzMjQ2RUUyLAorMHg3NjA0MjdFMCwgMHg2MDYyRDIyRiwgMHgzMjU1REUyRiwgMHgyRTAwQzkwMSwKKzB4MDYwQTZFNjIsIDB4RDEyRDQ2MDksIDB4NEUwOTQ2MDksIDB4MTM0MzQ2MDksCisweDY0NkQyMUUwLCAweEIyNTAxRjVFLCAweDYyMEQxRjZGLCAweDhCMDEyMjI4LAorMHgwMDA5QTE4QSwgMHhERTI1RDUyMiwgMHg2MUUwNjQ1MCwgMHhENzI0NjU0QywKKzB4NDcwQjU0RkYsIDB4N0ZGQzY2MUMsIDB4MDZGRUUwNTQsIDB4N0ZGQzJGNjIsCisweEVFNDAwMUZFLCAweDJGMTIzRUZDLCAweDU1RTJEMTI1LCAweDU3RTQ1NkUzLAorMHg2NEUyNDEwQiwgMHhEMjFDN0YwOCwgMHhFMTFDNjQwRCwgMHgxRDQxMkQxMCwKKzB4RDYxQTY1MjIsIDB4Njc2MjFENTIsIDB4MUQ3M0RFMTksIDB4RDIxOTZFRTIsCisweDYyMjIxREU0LCAweEQyMTgxRDI1LCAweDFEMjY2MjIyLCAweDYyMjJEMjE3LAorMHgxRDI3QTE1QSwgMHgwMDExNzgwMCwgMHgwMDIwMkExOCwgMHgwMDIwMzk5NiwKKzB4MDAyMDM1QkMsIDB4MDAyMDNBN0MsIDB4MDAyMDE4RDAsIDB4MDAyMDM5OTUsCisweDAwMTE3ODA0LCAweDAwMjAzQTE0LCAweDAwMjAzQTE2LCAweDAwMTE3ODEwLAorMHgwMDIwMzk5MSwgMHgxMDYyNEREMywgMHgwMDIwMzk5MiwgMHgwMDIwMzk5MywKKzB4MDAxMTRBQTQsIDB4MDAyMDBGNjgsIDB4MDAxQzU4NjQsIDB4MDAxQzY4NjQsCisweDAwMUM3ODY0LCAweDAwMUM1OUJDLCAweDAwMUM2OUJDLCAweDAwMUM3OUJDLAorMHgwMDIwMEZDMCwgMHg4QjA0ODgzMywgMHg0NzBCRDdBMiwgMHhBMTIzRUUwMCwKKzB4ODgyODJERTAsIDB4QTBEMzg5MDEsIDB4REU5RjAwMDksIDB4NjJFMUUxNDMsCisweDMyMTZFMDU0LCAweDBGRTY4RjAyLCAweDJFMjFFMjQwLCAweDYyMkQ2MkUxLAorMHg4QjAxMzIxNywgMHgwMDA5QTBCQywgMHhFNTAxODVFMSwgMHg4QjAxMzA1NiwKKzB4MDAwOUEwQjYsIDB4MkQxMEUxMDEsIDB4NjRFMUIxMTEsIDB4MDZGRUUwNTQsCisweDYyNjFFMTQzLCAweDM1MTc2NTJELCAweEU2NDA4OTQ1LCAweDhCMEMzNTYzLAorMHhFMDU4RTQxQSwgMHhFNTAwMEY0NSwgMHg3MkMwRTA1QywgMHg2MDIzMEY1NSwKKzB4NjcwM0M5MDcsIDB4QTAxNEUwNjAsIDB4NjY1MzBGNzUsIDB4NDYyMTQ2MjEsCisweDQ2MjE0NjIxLCAweDQ1MjE0NjIxLCAweEUwNTg3NjE4LCAweDBGNjU0NTIxLAorMHhFMDAzNDUyMSwgMHhFMDVDMjUwOSwgMHhFMDA3MEY1NSwgMHhFMDYwMjIwOSwKKzB4RTg1NDBGMjUsIDB4ODU4MjM4RkMsIDB4NjQwRDY1RjMsIDB4MTg0NEIxNzAsCisweEREN0E4NTg0LCAweDg1ODY2QzBELCAweDYxMEQ0QzA4LCAweDQxMDg2MEMzLAorMHhFMDBGMEVGRSwgMHgxODE1NEQwQiwgMHgyRTI5NjIwNywgMHg2NjgyNjBDMywKKzB4ODU2MjBGRTYsIDB4NEQwQjUxODUsIDB4MkUwQjYwMEQsIDB4NTQ4NDYwQzMsCisweEIxM0MwRkU2LCAweEUwNTQ2NUYzLCAweEU1NDAwRUZFLCAweEUwNkM2MkUxLAorMHgzNjUzNjYyRCwgMHgwRjY2OEQ0MSwgMHhDOTAzNjAyMywgMHg0MDAwNDAwOCwKKzB4NjEwMzY0MDMsIDB4RDk2NUUwNzAsIDB4MEY0NkU1RkYsIDB4RTA3NDY1NUMsCisweDYwNTMwRjk2LCAweDYyNjM0OTBCLCAweDQyMjE0MjIxLCAweDQyMjE0MjIxLAorMHg0MjAwNjcyMywgMHg0MjAwMzI3QywgMHg2QzA3NDYyMSwgMHg0NjIxRTA1NCwKKzB4NjA2MzA5RkUsIDB4NDAwOEM5MDMsIDB4NzkwNjMwRkMsIDB4NkEwMzZEMkQsCisweDY1RjNFODAwLCAweDY0RDNCMTI0LCAweEUwNzA2RUEyLCAweDJBRTIyRUM5LAorMHgwMUZFNjY5NCwgMHg2NjZDRTA3NCwgMHg0NzBCMDdGRSwgMHgyRTBCNjA2MywKKzB4NjVGMzJBRTIsIDB4QjBGQTY0RDMsIDB4NjI4RDc4MDEsIDB4MzJFM0VFMDYsCisweDdEMDE4RkU3LCAweDBFRkVFMDU0LCAweEUwNTQ2MkUxLCAweDQyMDAwNkZFLAorMHg3NjBDODU2MSwgMHg3MDFCMzAyQywgMHhFNDAwNjEwMywgMHhFNzA0NjVGMywKKzB4Njg2Njc0MDEsIDB4Mzk3MzY5NEQsIDB4OEZGOTI1ODIsIDB4NjVGMzc1MDQsCisweDY0MURCMERELCAweDBFRkVFMDU0LCAweDY0RTFCMDlDLCAweDAwMDlBMDU0LAorMHhENDNCNTZGOCwgMHhFQTAxRDIzQiwgMHgyNkEwNDIwQiwgMHgwMDA5QTA0QywKKzB4MDZGQ0UwMUMsIDB4ODgyOTYwNkMsIDB4NUNGODhCMDgsIDB4RTIwMEQ2MzYsCisweDUyNjEyQzIwLCAweDY0MkRCMDRCLCAweDAwMDlBMDNFLCAweDY2NkNFNjgxLAorMHg4QjA0MzA2MCwgMHg0MjBCRDIzMSwgMHhBMDM1NTRGOCwgMHhFNjgyMDAwOSwKKzB4MzA2MDY2NkMsIDB4RDIyRThCMDQsIDB4NTRGODQyMEIsIDB4MDAwOUEwMkMsCisweDY2NkNFNjgzLCAweDhCMEEzMDYwLCAweERBMjc1NUY4LCAweDI1OTBFOTAwLAorMHhEODI4NTVBMSwgMHgyODUyRDYyOCwgMHhBMDFENTJBMiwgMHhFNjkyMjYyMCwKKzB4MzA2MDY2NkMsIDB4RDIyMDhCMDgsIDB4NUMyMUQ4MjQsIDB4NkNDQzUyRjgsCisweDI4QzFFNjAwLCAweDIyNjBBMDEwLCAweDY2NkNFNjkzLCAweDhCMDYzMDYwLAorMHhENjFGNTlGOCwgMHhFMjAxRUEwMCwgMHhBMDA1MjlBMCwgMHhENjE2MjYyMSwKKzB4RDIxREQ0MUMsIDB4NjU2MjQyMEIsIDB4NEYwNjdGNzgsIDB4NEYyNjRGMTYsCisweDZERjY2RUY2LCAweDZBRjY2Q0Y2LCAweDAwMEI2OUY2LCAweDRGMjI2OEY2LAorMHhFMjQwNjE0RCwgMHg4OTMyMzEyMywgMHgzMTI3RTIxRiwgMHg4QjI3RDcxMywKKzB4RDQwNjYxNEQsIDB4RTAwMTcxRTAsIDB4NTY3MTQ0MEIsIDB4MjY1OTY1MDcsCisweDE3NjFBMDI1LCAweDAwMjAwRkJDLCAweDAwMTE3ODA0LCAweDAwMjAzNDcwLAorMHgwMDIwM0E5QywgMHgwMDIwMThDMCwgMHgwMDExNzgwMCwgMHgwMDExNUYwMCwKKzB4MDAxMTYwNTgsIDB4MDAyMDM5N0MsIDB4MDAyMDM5OTAsIDB4MDAyMDNBMUEsCisweDAwMjAzQTE2LCAweDAwMjAzQUI0LCAweDAwMjAxOEQwLCAweDAwMUMzNzA0LAorMHhFMDAxRDQ5MCwgMHg2NjcyNDQwQiwgMHgyNjU5NjUwNywgMHg0RjI2Mjc2MiwKKzB4MDAwOTAwMEIsIDB4NjE0RDRGMjIsIDB4MzEyM0UyNDAsIDB4RTIxRjg5MTIsCisweEQ3ODkzMTI3LCAweDYxNEQ4QjA4LCAweDU2NzFEMjg2LCAweDQyMEI3MUUwLAorMHgyNjBCRTAwMSwgMHgxNzYxQTAwNiwgMHg2NjcyRDI4MiwgMHhFMDAxNDIwQiwKKzB4Mjc2MjI2MEIsIDB4MDAwQjRGMjYsIDB4RTY0MDAwMDksIDB4NDYyODQ2MTgsCisweDYyNTJENTdFLCAweDg5RkMyMjY4LCAweDAwMDkwMDBCLCAweDQ2MThFNjgwLAorMHhENTdBNDYyOCwgMHgyMjY4NjI1MiwgMHgwMDBCODlGQywgMHhBMDAxMDAwOSwKKzB4NzIwMUUyMDAsIDB4OEJGQzMyNDIsIDB4MDAwOTAwMEIsIDB4NDYxOEU2ODAsCisweEQ1NzM0NjI4LCAweDIyNjg2MjUyLCAweDAwMEI4QkZDLCAweDJGRTYwMDA5LAorMHg3RkZDNEYyMiwgMHhCRkYxNkU1MywgMHg2MUUyMkY0MiwgMHhFMjgwRDY2RCwKKzB4NTRFMTE2MTUsIDB4MTY0NjQyMTgsIDB4NDIyODU1RTIsIDB4NTdFMzE2NTcsCisweDE2Nzg2RUYyLCAweDI2RTIyRTJCLCAweDRGMjY3RjA0LCAweDZFRjZBRkNFLAorMHgyRkQ2MkZDNiwgMHg0RjIyMkZFNiwgMHg2QzUzREQ2MiwgMHg2RTQzQkZENiwKKzB4MkRFMkJGQkIsIDB4MDAwOUJGRDIsIDB4MkMxMjUxRDUsIDB4MUM0MTU0RDYsCisweDFDNTI1NUQ3LCAweDFDNjM1NkQ4LCAweDZFRjY0RjI2LCAweDAwMEI2REY2LAorMHg2MTYzNkNGNiwgMHhBMDA0RTYwMCwgMHg2MjU2NDEwOSwgMHgyNDIyNzYwMSwKKzB4MzYxMjc0MDQsIDB4MDAwQjhCRjksIDB4RDY1MzAwMDksIDB4ODU2MkU1MDAsCisweEEwMEI2NzRELCAweDY1NUQ2MTBELCAweDQwMDA2MDUzLCAweDMwNUNENDRGLAorMHgwMjRENDAwOCwgMHgzMjcwNjIyRCwgMHg3NTAxODkwNSwgMHgzMjEzNjI1RCwKKzB4MDAwQjhCRjEsIDB4MDAwQkUwMDAsIDB4MkZFNkUwMDEsIDB4NTQ0MTY3NDMsCisweDRFMDhFRTdGLCAweDRFMjhEMjQ2LCAweDI1RTk2NTQzLCAweDYwNDM2RTIxLAorMHg5RTc1NjJFRCwgMHg0NTI5QzkwMywgMHhFNjAwMzJFMywgMHg4RDQ1NjEwMywKKzB4MjExODQ1MDksIDB4RDIzRjhCMDUsIDB4MDAyQzYwNTMsIDB4QTA4QUM5M0YsCisweDYwMTM2NjAzLCAweDhCMjY4ODAxLCAweDg4MEM2MDUzLCAweEQ1M0E4QjA0LAorMHhDOTNGODQ1MywgMHg2NjAzQTA3RiwgMHg4QjA0ODgwOCwgMHg4NEUyREUzNiwKKzB4QTA3OEM5M0YsIDB4ODgwRDY2MDMsIDB4OEIwM0Q2MzMsIDB4QzkzRjg0NjEsCisweDY2MDNBMDcxLCAweDg4MDk2MjYwLCAweDYyMkM4RjA5LCAweEUwMTRERTJDLAorMHg2NTVDMDVFQywgMHg2MDIzMzI1OCwgMHhBMDY0QzkzRiwgMHg2MDIzNjYwMywKKzB4QTA2MEM5M0YsIDB4ODgwMjY2MDMsIDB4RTAwNzhCNUQsIDB4NjA0MzI1MDksCisweDg5MDVDODEwLCAweDYwNTNEMjI1LCAweEM5M0YwMDJDLCAweDY2MDNBMDUzLAorMHg2MDUzREUyMywgMHhDOTNGMDBFQywgMHg2NjAzQTA0RCwgMHg4ODAxNjAxMywKKzB4NjA1MzhCMTksIDB4OEIwNDg4MEMsIDB4ODQyM0QyMUUsIDB4QTA0MkM5M0YsCisweDg4MDg2NjAzLCAweEQ1MUI4QjA0LCAweEM5M0Y4NDUyLCAweDY2MDNBMDNCLAorMHhENjE4ODgwRCwgMHg4NDYxOEIwMywgMHhBMDM0QzkzRiwgMHg2MDYwNjYwMywKKzB4QTAzMEM5M0YsIDB4ODgwMjY2MDMsIDB4RTAwNzhCMkQsIDB4NjA0MzI1MDksCisweDg5MjNDODEwLCAweDYwNTNERTEwLCAweEM5M0YwMEVDLCAweDY2MDNBMDIzLAorMHgwMDAwMEJCOCwgMHgwMDIwMzQ3MCwgMHgwMDFDMzcwNCwgMHgwMDFDMzczQywKKzB4MDAxQzM3MDAsIDB4MDAxQzM3MEMsIDB4MDAxMTQwMDAsIDB4MDAxMTQwMDgsCisweDAwMTE0MkQ4LCAweDAwMTE0MkU0LCAweDAwMTE0MkU4LCAweDAwMTE0MkY1LAorMHgwMDExNDJFRCwgMHgwMDExNDJGRCwgMHgwMDExNDMwOSwgMHg2MDUzRDIwOSwKKzB4QzkzRjAwMkMsIDB4NjAxMzY2MDMsIDB4OEIwMzg4MDIsIDB4QzgxMDYwNDMsCisweDc2MDI4OTAwLCAweEM5M0Y2MDYzLCAweDQwMDA0MDE4LCAweDE3NDEyNDBCLAorMHg2RUY2MDAwQiwgMHgwMDExNDMwMSwgMHgwMDA5QTE2RSwgMHgyRkU2MkZENiwKKzB4REQ5NDRGMjIsIDB4QTAwNDlFQjIsIDB4RDQ5MzAwMDksIDB4NDIwQkQyOTMsCisweDYyRDI2NUQyLCAweDhCRjgyMkU4LCAweDAwMDlBMDA0LCAweEQyOEZENDkwLAorMHg1NUQxNDIwQiwgMHgyMkU4NTJEMSwgMHhBMDA0OEJGOCwgMHhENDhEMDAwOSwKKzB4NDIwQkQyOEEsIDB4NTJEMjU1RDIsIDB4OEJGODIyRTgsIDB4MDAwOUEwMDQsCisweEQyODZENDg5LCAweDU1RDM0MjBCLCAweDIyRTg1MkQzLCAweEEwMDQ4QkY4LAorMHhENDg2MDAwOSwgMHg0MjBCRDI4MSwgMHg1MkQ0NTVENCwgMHg4QkY4MjJFOCwKKzB4NkVGNjRGMjYsIDB4NkRGNjAwMEIsIDB4MkZENjJGQzYsIDB4NEYyMjJGRTYsCisweDZFNjM2QzczLCAweDZENTNCMDFBLCAweDY0RDM1N0Y0LCAweEIwNUY2NUUzLAorMHhCMDc1NjZDMywgMHhCMEE0MDAwOSwgMHhCMEE4MDAwOSwgMHhCMEFDMDAwOSwKKzB4QjBBQzAwMDksIDB4QjBBRjAwMDksIDB4QjAzMTU0RjUsIDB4NkNDRDZDMDMsCisweDRGMjY2MEMzLCAweDZERjY2RUY2LCAweDZDRjYwMDBCLCAweDM0MTJEMTcwLAorMHhENjcwMDUyOSwgMHgyNjUwRDc3MCwgMHgyNzQyMDAwQiwgMHgwMDA5QTAxOCwKKzB4MkZENjJGQzYsIDB4NEYyMjJGRTYsIDB4NkU2MzZDNzMsIDB4NkQ1M0JGRUUsCisweDY0RDM1N0Y0LCAweEIwMzM2NUUzLCAweEIwOEQ2NkMzLCAweEIwMEY1NEY1LAorMHg2Q0NENkMwMywgMHg0RjI2NjBDMywgMHg2REY2NkVGNiwgMHg2Q0Y2MDAwQiwKKzB4RTUwM0QxNjIsIDB4RDc2M0Q0NjIsIDB4MjE1MjQ1MTgsIDB4MjQ3MjAwMEIsCisweEQ0NUZEMTVFLCAweDIxNjJFNjAwLCAweDI0NjIwMDBCLCAweEJGNzM0RjIyLAorMHhCRjczRTQwQSwgMHhEMjVDMDAwOSwgMHg0MTE4RTEwNCwgMHhFNDBBRTUwMCwKKzB4QkY2OTIyMTIsIDB4RDc1OTIyNTIsIDB4Q0IyMDYwNzIsIDB4MDAwQjRGMjYsCisweDRGMjIyNzAyLCAweDQxMEJEMTU2LCAweEQ1NTZFNDAwLCAweDRGMjY0NTJCLAorMHhEMTU1MkZFNiwgMHg2NjEyNkU2MywgMHg5MjEwNDQxOCwgMHg0NDA4NDUyOCwKKzB4NDUwMDI2MjksIDB4MjY1QjQ0MDgsIDB4MjY0QjQ0MDAsIDB4MjE2MjQ3MDgsCisweEQxNEU0NzA4LCAweDIxNzIyN0VCLCAweDZFRjYwMDBCLCAweDFGRkYwM0YwLAorMHg0RjIyMkZFNiwgMHhFMTAxREU0QSwgMHhCRjNERTQwQSwgMHg2N0UzMkUxMiwKKzB4RTUwMDc3NkMsIDB4RTIwNEUxMzAsIDB4Mjc1MkU0MEEsIDB4Mjc1MjI3NTIsCisweDI3NTIyNzUyLCAweDI3NTIyNzUyLCAweDI3NTIyNzUyLCAweDI3NTIyNzUyLAorMHgyNzUyMjc1MiwgMHgyNzUyMjc1MiwgMHgyNzUyMjc1MiwgMHgyNzUyMjc1MiwKKzB4MjcyMjI3MTIsIDB4Mjc1MjI3NTIsIDB4Mjc1MjI3NTIsIDB4Mjc1MjI3NTIsCisweDI3NTIyNzUyLCAweDE3NUFCRjE4LCAweDJFNjJFNjAwLCAweDAwMEI0RjI2LAorMHhEMjM0NkVGNiwgMHhFNDQxRTEwMSwgMHgwMDBCMjIxMiwgMHhEMTMyMjI0MiwKKzB4RTYwNUQ0MzIsIDB4MDAwQjIxNjIsIDB4MDAwQjI0NjIsIDB4RDIzMDAwMDksCisweEU0MEFFNjAxLCAweDIyNjJBRjAwLCAweDJGQzYyRkI2LCAweDJGRTYyRkQ2LAorMHg3RkZDNEYyMiwgMHg2QzQzREIyQiwgMHhFRDAwNjBCMiwgMHgyQjAyQ0IwMywKKzB4QzkwMzYwQjIsIDB4NkUwM0EwMDgsIDB4ODkwNzNEQzIsIDB4RTQ2NDYwQjIsCisweEIwN0NDOTAzLCAweDdEMDE2RTAzLCAweDhCRjUyRUU4LCAweDhGMDQzREMyLAorMHhENDIxMkZFMSwgMHg0NjBCRDYyMSwgMHg2MkYxMDAwOSwgMHg2MDIzNjIyRCwKKzB4ODlGRkM4MDEsIDB4N0YwNDYwMjMsIDB4NkVGNjRGMjYsIDB4NkNGNjZERjYsCisweDZCRjYwMDBCLCAweDAwMUMzQjg4LCAweDAwMjAzQUM4LCAweDAwMjAxOEQwLAorMHgwMDIwM0FEMCwgMHgwMDIwM0FEOCwgMHgwMDIwM0FFMCwgMHgwMDIwM0FFOCwKKzB4MDAyNUU3MjAsIDB4MDAyMDNEQkMsIDB4MDAyMDM5ODAsIDB4MDAxQzU5NjgsCisweDAwMUMzQjQwLCAweDAwMEY4MDAwLCAweDAwMUQ0MDA0LCAweDAwMUMzNTAwLAorMHgwMDIwMTVFNCwgMHgwMDIwMTYxMCwgMHgwMDFDNTgxNCwgMHgwMDFDNTlEMCwKKzB4MDAxQzU4MzAsIDB4MDAxQzYyNjgsIDB4MDAxQzU5QTQsIDB4MDAxQzYzOUMsCisweDAwMUM1ODFDLCAweDAwMUM1ODYwLCAweDAwMjAzQUYwLCAweDAwMjAxOEMwLAorMHg4RjAxNDQxMSwgMHg2MDQzNjA0QiwgMHgwMDA5MDAwQiwgMHg1NjUxRDUyQiwKKzB4NDYyODYwNTIsIDB4MzA2QzAwMEIsIDB4MkZDNjJGQjYsIDB4MkZFNjJGRDYsCisweDRGMTI0RjIyLCAweEJGRjE0RjAyLCAweDZCMDM2RTQzLCAweEREMjVEQzI0LAorMHgwMDA5QkZFQywgMHgzQzA1MzBCOCwgMHg0NjA5MDYwQSwgMHg0NjAxNDYwOSwKKzB4MDIwQTNENjUsIDB4NDIwOTQyMDksIDB4MzJFMjQyMDksIDB4NEYwNjhCRjAsCisweDRGMjY0RjE2LCAweDZERjY2RUY2LCAweDAwMEI2Q0Y2LCAweDJGQzY2QkY2LAorMHgyRkU2MkZENiwgMHg0RjEyNEYyMiwgMHhCRkNGNEYwMiwgMHg2QzAzNkU0MywKKzB4QkZDQkREMTMsIDB4MzBDODAwMDksIDB4MDYwQTNEMDUsIDB4NDYwOTQ2MDksCisweDM2RTI0NjAxLCAweDRGMDY4QkY1LCAweDRGMjY0RjE2LCAweDZERjY2RUY2LAorMHg2Q0Y2MDAwQiwgMHg0RjIyMkZFNiwgMHhFMTAyREUwQiwgMHhFNDAzRTUwMCwKKzB4QkZCOTJFMTIsIDB4RTYwNjJFNTIsIDB4RTcwMDQ2MTgsIDB4MkU2MkU0MDMsCisweDRGMjYyRTcyLCAweDZFRjZBRkIwLCAweDAwMDkwMDBCLCAweDAwMUMxMDQwLAorMHhDQ0NDQ0NDRCwgMHgxMDYyNEREMywgMHgwMDFENDAwNCwgMHgyRjk2MkY4NiwKKzB4MkZCNjJGQTYsIDB4MkZENjJGQzYsIDB4NEYyMjJGRTYsIDB4RTUwMDdGOTgsCisweDY0NTNFNzEwLCAweDZCNTM0NzI4LCAweEVFMUFEQ0JDLCAweDYxNTM2NTVELAorMHgzMTVDNDEwOCwgMHg3NTAxNDEwOCwgMHg2MDQzMzE3QywgMHgwRjE2NjY1RCwKKzB4RUQwMDYwQjMsIDB4MjFCMTM2RTMsIDB4ODExMjgxMTEsIDB4MTFEMjgxMTMsCisweDExRDQxMUQzLCAweDc0MDQ4RkVBLCAweEQ4QjE2N0YyLCAweDE4NzFEOUIxLAorMHg1OEYxMjg3MiwgMHgxOTgxRDFCMCwgMHg1OUYyMjk4MiwgMHg1REY0NUFGMywKKzB4NTRGNjVFRjUsIDB4MjE5MjExOTEsIDB4MTFBMjExQTMsIDB4MTFENDExRDUsCisweDExRTYxMUU3LCAweDExNDgxMTQ5LCAweERBQTg1NUY3LCAweDU3RjhFRTAwLAorMHg1MkY5RERBNywgMHg2NEUzRDZBNywgMHgyQTUyMUE1MSwgMHhEOEE3RDlBNiwKKzB4MkQ3MkVBRUYsIDB4NkFBQzI2MjIsIDB4NkRFMzZFRUQsIDB4NjFFMzREMDgsCisweDQxMDgzREVDLCAweDMxRUM0RDA4LCAweDYwQjMzRDlDLCAweDJEQjE0MTA4LAorMHhFMDUwODFEMSwgMHhFNzlGNDEwOCwgMHg0MTA4NDAwOCwgMHg4MUQyNjc3QywKKzB4MzE4QzYwQjMsIDB4MzQ3MkUyMDAsIDB4MUREMjgxRDMsIDB4RDQ5MzFEMTMsCisweDFEMjQ4RDAxLCAweDY1RDNENDhGLCAweDdFMDFCMEIyLCAweDM0QTI2NEVELAorMHhEQThDOEJEQSwgMHg2OEEyMkZEMiwgMHg0ODI5REQ5MSwgMHg2NEEyMkQ4MiwKKzB4Njk0RDdERkMsIDB4MkQ5MkQyODYsIDB4NEUyOTZFMjIsIDB4MkRFMjdEMEMsCisweDZBRDM2ODIyLCAweEQ3ODQ2MThELCAweDZENzIyQTE2LCAweEQ1ODNENDg5LAorMHg1RTcyMjREMiwgMHgxNEUyRDY4OCwgMHhFRTAwNTE3NCwgMHg1ODc2MTQxNCwKKzB4MTQ4NkQxODYsIDB4RTcxMDU5NzgsIDB4NjI1MjE0OTgsIDB4MTQyQTY1RTMsCisweDY0RTMyNkUyLCAweDY0NERFNjAwLCAweDQ4MDg2ODQzLCAweDQ4MDgzODRDLAorMHg2MDUzMzgxQywgMHgyOEIxMEM4NiwgMHg2MEIzMDlDRSwgMHg2MDUzODE5MSwKKzB4NjA0MzBBQ0UsIDB4NjA1MzgxQTIsIDB4NjBCMzBEQ0UsIDB4NjA1MzgxRDMsCisweDc0MDEwOENFLCAweDA5Q0UxODgyLCAweDE5RTM2MjRELCAweDMyNzMwQUNFLAorMHg4RkUwMUE2NCwgMHhEOTZBNzUwNCwgMHg2QzkyRTAwMywgMHgyQ0IxNDAxOCwKKzB4REE2RjZEOTIsIDB4RTA1MDgxRDEsIDB4NDAwODZFOTIsIDB4NjE5MjgxRTIsCisweDgxMTM2MEIzLCAweEU2MDA2NDkyLCAweDY3OTIxNDQyLCAweDE3QTNENDY4LAorMHhFMUZGNjg5MiwgMHhFNzAzMTg2NCwgMHg0NjA4NjU2MywgMHg3NTAxMzY0QywKKzB4NjY1RDI2MTIsIDB4OEJGODM2NzMsIDB4RTAwM0RDNUEsIDB4NDAxODZEQzIsCisweDZFQzIyREIxLCAweDgxRTFEMjVGLCAweEVFMDA2MUMyLCAweDY0QzIxMTEyLAorMHgxNDIzRTAyNCwgMHhENDVCNjVDMiwgMHg2N0MyMTVFNCwgMHg4MTcyRTU4MCwKKzB4NjZFMzY4QzIsIDB4NjU1QzgxODMsIDB4Njk2MzY2NkQsIDB4NkE2RDc2MDQsCisweDNBNTMzOTRDLCAweDI5RTI4RkY4LCAweERDNTREQjUzLCAweDc0MDQyNEIyLAorMHg3RjY4MjRDMiwgMHg2RUY2NEYyNiwgMHg2Q0Y2NkRGNiwgMHg2QUY2NkJGNiwKKzB4MDAwQjY5RjYsIDB4NjE0MjY4RjYsIDB4QzgwMzYwMTEsIDB4RTUwMDhGMDMsCisweDM0MjBEMjNDLCAweDYwMTE4QjA2LCAweDg4MDJDOTAzLCAweEQyMzk4QjA2LAorMHg4QjAzMzQyMCwgMHg2NTEzNTYxMiwgMHgyNDIyNTI2NCwgMHg2MDUzMDAwQiwKKzB4MkZFNjJGRDYsIDB4N0ZFQzRGMjIsIDB4NjI1MzZFNTMsIDB4NkQ0M0U1NTAsCisweDQ1MDhFNDAwLCAweEUxMDFBMDAxLCAweDYwNDM1MjI0LCAweDgxMjEyMjExLAorMHg2MDUzODEyMywgMHg1NkUyODEyMiwgMHg4QkY1MzYyMCwgMHgxNkU0RDIzOCwKKzB4RTYxNDY0RjMsIDB4NjVFMzQyMEIsIDB4RTRGQzY1RTEsIDB4MkU1MTI1NDksCisweDY1RjM2MUYxLCAweDJGMTEyMTQ5LCAweEQxMzE1NEQxLCAweEU2MTQ0MTBCLAorMHg2MDcxNTdEMSwgMHgyNzAxQ0IwMSwgMHg3RjE0MURFMSwgMHg2RUY2NEYyNiwKKzB4NkRGNjAwMEIsIDB4MkZFNjJGRDYsIDB4N0ZFQzRGMjIsIDB4NjY1MzZFNTMsCisweDZENDNFNUZDLCAweDIwNTk2MDYxLCAweDI2MDFDQjAxLCAweDMyNjA1MkUyLAorMHgxMkU0OEIwNiwgMHgzMUUwNTFFMiwgMHg1MkQxOEIwNCwgMHgxRTIyQTAwMiwKKzB4NTY2NEFGRjAsIDB4NjRGM0QyMUUsIDB4NDIwQkU2MTQsIDB4NjdFMTY1RTMsCisweDI3MTlFMUZDLCAweDY3RjEyRTcxLCAweDI3MTk1NEQxLCAweDY1RjNEMTE4LAorMHg0MTBCRTYxNCwgMHg1MkQxMkY3MSwgMHhDQjAxNjAyMSwgMHgxREUxMjIwMSwKKzB4NEYyNjdGMTQsIDB4MDAwQjZFRjYsIDB4MDAwMDZERjYsIDB4MDAyMDM5QUMsCisweDAwMjAzNTdDLCAweDAwMjAzNTg0LCAweDAwMjAzNThDLCAweDAwMjAzNUI0LAorMHgwMDIwMzk5OCwgMHgwMDIwMzlBMCwgMHgwMDEwMDIwOCwgMHgwMDEwMTRDMCwKKzB4MDAxRTIxMEMsIDB4MDAxQzNEMDAsIDB4MDAyMDM5RUMsIDB4MDAxMDAwQzgsCisweDAwMTE3ODgwLCAweDAwMTE3NzgwLCAweDAwMDQwMDIwLCAweDAwMjZDNDAxLAorMHgwMDIwMEQ0MiwgMHg0RjIyMkZFNiwgMHhERTQyNjI0QywgMHg0MjAwNDIwOCwKKzB4M0UyQ0EwMDUsIDB4RDQ0MDUyNTIsIDB4QkY2OTU2MjQsIDB4NjVFMjJFNjIsCisweDM1MjA1MkUxLCAweEQ2M0Q4QkY2LCAweDRGMjYyNjIyLCAweDZFRjYwMDBCLAorMHgyRkM2MkZCNiwgMHgyRkU2MkZENiwgMHhEQzM5NEYyMiwgMHg1MkMxREIzOSwKKzB4MzYyMDY2QzIsIDB4NjA2MTg5MUMsIDB4ODgwMUM5MDMsIDB4REUzNDg5MTgsCisweEJGMzhERDM1LCAweDY1MDM2NEUzLCAweDY2QjI4NTAzLCAweDMyNjI2MjBELAorMHhENDMyODkwNywgMHgwMDA5QkY3NiwgMHg0RDBCRDQzMSwgMHhBRkU2MDAwOSwKKzB4QkYzRDAwMDksIDB4RDQyRjY0RTMsIDB4MDAwOTREMEIsIDB4MDAwOUFGREYsCisweDIyNjJEMjJELCAweDZFRjY0RjI2LCAweDZDRjY2REY2LCAweDZCRjYwMDBCLAorMHgyRkQ2MkZDNiwgMHg0RjIyMkZFNiwgMHhERDI5REMyOCwgMHg2RTQzNjBDMiwKKzB4MDRERTQwMDgsIDB4RTYxNEQxMjcsIDB4NjVFMzQxMEIsIDB4RDEyN0Q3MjYsCisweDU1RTIyN0UyLCAweDM1RTA1MjU0LCAweDIxMjI4RjA0LCAweDQwMDg2MEMyLAorMHgxMjIyMDJERSwgMHg2MDUzNjVDMiwgMHg3NTAxNDAwOCwgMHgwREU2MDZERSwKKzB4QzkwRjYwNTMsIDB4NjA2MzJDMDIsIDB4NkVGNjRGMjYsIDB4MDAwQjZERjYsCisweDg1NDM2Q0Y2LCAweDY1MEQ1NjQzLCAweDYyMkQ2MjYyLCAweDM1Mjc3MjA0LAorMHhFMTAwOEYwQywgMHgyMjY4OTYwQywgMHhENjE1OEIwMywgMHg3MjAxNTI2MSwKKzB4RDYxMzE2MjEsIDB4NjI2MkUxMDEsIDB4MjYyMjcyMDEsIDB4NjAxMzAwMEIsCisweDAwMDAwMUZGLCAweDAwMjAzNThDLCAweDAwMjAzNTg0LCAweDAwMUMzRDAwLAorMHgwMDIwMzVCNCwgMHgwMDIwMzk3QywgMHgwMDIwMThDMCwgMHgwMDIwMzU3QywKKzB4MDAyMDNCMTgsIDB4MDAyMDNCMUMsIDB4MDAxQzNEMjgsIDB4MDAyMDM5RUMsCisweDAwMjAzOUFDLCAweDAwMjAwRDQyLCAweDAwMjAzOUYwLCAweDAwMjAzOUY0LAorMHgwMDExNzc1NCwgMHgyRkE2MkY5NiwgMHgyRkM2MkZCNiwgMHgyRkU2MkZENiwKKzB4N0ZGODRGMjIsIDB4NkMyMkQyNDEsIDB4QzgwMzYwQzMsIDB4REU0MDg5NkUsCisweERBNDFEQjQwLCAweDUyQjFEOTQxLCAweDM2MjA2NkIyLCAweDYwNjE4OTQ1LAorMHg4ODAxQzkwMywgMHhERDNCODk0MSwgMHg0MjBCRDIzRCwgMHg2NTAzNjREMywKKzB4NjBBMTJGMDIsIDB4ODkzMjg4MDEsIDB4ODUxNDUxNTMsIDB4ODg0MDYwMEMsCisweDFGMTE4RjBDLCAweEQ1Mzc2MTkxLCAweDY0MUQ0NTBCLCAweDhCMjYyMDA4LAorMHhENzM1NjY5MSwgMHg2NDZENDcwQiwgMHg4QjIwMjAwOCwgMHg0MjBCRDIzMywKKzB4NTFGMTU0RjEsIDB4QzgyMDg1MTEsIDB4RDEzMTg5MDQsIDB4MDIxRUUwNTAsCisweDAxMjY3MjAxLCAweDQyMEJEMjJGLCAweDIwMDg2NEYyLCAweDY0RDM4OTA3LAorMHg0RDBCREQyRCwgMHhEMTJENjVGMiwgMHhBRkM0RTYwMSwgMHhEMjJDMjE2MiwKKzB4NDIwQjY1RjIsIDB4RDcyQjY0RTMsIDB4QUZCQ0U2MDEsIDB4RDIyNjI3NjIsCisweDQyMEI2NUYyLCAweEFGQjY2NEQzLCAweERFMjcwMDA5LCAweERBMjhERDI3LAorMHg1MkQxREIyOCwgMHgzNjIwNjZEMiwgMHg2MDYxODkxOCwgMHg4ODAxQzkwMywKKzB4RDQyMjg5MTQsIDB4NDUwQkQ1MTYsIDB4NTYwMzAwMDksIDB4OEYwNDM2RTAsCisweEUyMDE2NTAzLCAweEFGRUMyQTIwLCAweEQ0MUYyQjUyLCAweDQyMEJEMjE2LAorMHhENzE4MDAwOSwgMHg0MTE4RTEwMSwgMHgyNzEyQUZFMywgMHhDODA0NjBDMywKKzB4RDIxQTg5MDIsIDB4MDAwOTQyMEIsIDB4NEYyNjdGMDgsIDB4NkRGNjZFRjYsCisweDZCRjY2Q0Y2LCAweDAwMEI2QUY2LCAweDAwMDA2OUY2LCAweDAwMUUyMTAwLAorMHgwMDIwMzU4QywgMHgwMDIwMzU4NCwgMHgwMDIwM0ExNCwgMHgwMDExNDJEOCwKKzB4MDAyMDE0QTYsIDB4MDAxMTVFQTIsIDB4MDAxMTQ3NzQsIDB4MDAyMDBEOEEsCisweDAwMjAzNTFDLCAweDAwMjAxNkMyLCAweDAwMjAxNEQwLCAweDAwMUUyMTJDLAorMHgwMDIwMTUzNCwgMHgwMDFDM0QzMCwgMHgwMDExNzg4MCwgMHgwMDIwMzU3QywKKzB4MDAyMDM5OUMsIDB4MDAyMDM5OTgsIDB4MDAyMDM1QjQsIDB4MDAyMDA2NDQsCisweEU2MDFEMjAzLCAweDEyNjVENTAzLCAweDAwMEIyMjUyLCAweDAwMDAxMjY2LAorMHgwMDFDMTAxMCwgMHgwMDAwQzM0RiwgMHgwMDA5MDAwQiwgMHgwMDA5MDAwQiwKKzB4MDAwOTAwMEIsIDB4MDAwOTAwMEIsIDB4RTAwMDAwMEIsIDB4RTAwMDAwMEIsCisweDAwMDkwMDBCLCAweEU0RkRENTlELCAweEQ2OUQ2MTUyLCAweDI1MTIyMTQ5LAorMHg3NDAxNjA1MiwgMHgyNTAyQ0IwMSwgMHhEMTlBNjc1MiwgMHgyNTcyMjc0OSwKKzB4Qzg0MDYwMTAsIDB4NjA2Mjg5MDIsIDB4MjYwMkNCMDQsIDB4RTFGNzY0NjIsCisweDI2NDIyNDE5LCAweEU3MDE2MDYyLCAweDI2MDJDOUNGLCAweEU1MDI2MDYyLAorMHgyNjAyQ0IxMCwgMHg0NzE4NjA2MiwgMHgyNjAyQ0IwMywgMHgwMDBCMTY1MiwKKzB4RDU4RDE2NzMsIDB4RDI4RUQ3OEQsIDB4RTEwMEQ0OEUsIDB4MjUxMUU2MDAsCisweDIyMTAyNzExLCAweDI0NjFBRkNFLCAweEQyOEI2NjRDLCAweDM2MkM0NjAwLAorMHhDQjEwNjA2MCwgMHgyNjAwMDAwQiwgMHhEMjg3NjU0QywgMHgzNTJDNDUwMCwKKzB4RTFFRjY2NTAsIDB4MDAwQjI2MTksIDB4NjY0QzI1NjAsIDB4NDYwMEQyODMsCisweDYwNjAzNjJDLCAweDAwMEJDQjEwLCAweDY1NEMyNjAwLCAweDQ1MDBEMjdGLAorMHg2NjUwMzUyQywgMHgyNjE5RTFFRiwgMHgyNTYwMDAwQiwgMHhEMjdBNjY0QywKKzB4MzYyQzQ2MDAsIDB4Q0IwODYwNjAsIDB4MjYwMDAwMEIsIDB4RDI3NjY1NEMsCisweDM1MkM0NTAwLCAweEUxRjc2NjUwLCAweDAwMEIyNjE5LCAweDY2NEMyNTYwLAorMHg0NjAwRDI3MiwgMHg2MDYwMzYyQywgMHgwMDBCQ0IwOCwgMHg2NTRDMjYwMCwKKzB4NDUwMEQyNkUsIDB4NjY1MDM1MkMsIDB4MjYxOUUxRjcsIDB4MjU2MDAwMEIsCisweEQ2Njk2MjRDLCAweDMyNkM0MjAwLCAweEM5MDg2MDIwLCAweDQwMjE0MDIxLAorMHgwMDBCNDAyMSwgMHg2MjRDNjAwQywgMHg0MjAwRDY2NCwgMHg2MDIwMzI2QywKKzB4NDAyMUM5MDgsIDB4NDAyMTQwMjEsIDB4NjAwQzAwMEIsIDB4NjQ0Q0QxNjAsCisweDYyNDAzNDFDLCAweDYwMkMwMDBCLCAweDY0NENEMTVFLCAweDYyNDAzNDFDLAorMHg2MDJDMDAwQiwgMHg0RjIyMkZFNiwgMHg2NDVDNkU0MywgMHgzNDY3RTYwQSwKKzB4QkZFQjg5MTQsIDB4NjQwQzAwMDksIDB4ODgwMTYwRUMsIDB4RTAwRjhCMDIsCisweDI0MDlBMDAyLCAweDQ0MDk0NDA5LCAweEU2MEE2MjRDLCAweDg5MDUzMjYzLAorMHg2NDRDQkZFMiwgMHg2MDIzNjIwQywgMHg4QjAwQzg4MCwgMHg2MDIzRTIwMCwKKzB4MDAwQjRGMjYsIDB4NEYyMjZFRjYsIDB4NjA2MkQ2NEIsIDB4OEIwMzg4MDEsCisweDAwMDlCMjU2LCAweDAwMDlBMDAzLCAweEU2NDBEMjQ4LCAweEQ2NDgyMjYwLAorMHg0RjI2RTIwMCwgMHgyNjIyMDAwQiwgMHhENjQzNEYyMiwgMHg4ODAyNjA2MiwKKzB4QjI5RjhCMDEsIDB4RDY0MjAwMDksIDB4NEYyNkUyMDAsIDB4MjYyMjAwMEIsCisweEQ0M0VENTNELCAweEU3MDFFMTAwLCAweDAwMEIyNTEyLCAweEQyM0IyNDcwLAorMHgwMDBCRTYwNCwgMHg0RjIyMjI2MCwgMHhEMTNCRDQzQSwgMHgwMDA5NDEwQiwKKzB4RTFGREQ1M0EsIDB4RDIzQTY2NTAsIDB4RTcwMDI2MTksIDB4NEYyNjI1NjAsCisweDIyNzAwMDBCLCAweEQ1Mzc0RjIyLCAweDYxNTJEMjM3LCAweDYxMURENzM3LAorMHg2NDUyMjUxMiwgMHgyNDJCRTZGRiwgMHhENDM1MjU0MiwgMHg2NjZERDIyRSwKKzB4Mjc2MjQyMEIsIDB4RTFGQkQ1MkQsIDB4MjcxOTY3NTAsIDB4MDAwQjRGMjYsCisweDRGMjIyNTcwLCAweEQxMjhENDJGLCAweDAwMDk0MTBCLCAweEU3RjdENTI3LAorMHgyNjc5NjY1MCwgMHgwMDBCNEYyNiwgMHhENTI0MjU2MCwgMHg2MjUwOTQyNSwKKzB4MDAwQjIyNDksIDB4RDUyMTI1MjAsIDB4NjI1MEU0QkYsIDB4MDAwQjIyNDksCisweDRGMjIyNTIwLCAweDg1MjJEMjI0LCAweDIwMDg2MDBELCAweDg4MDE4OTExLAorMHg4ODAzODk0NCwgMHg4ODA1ODk0NiwgMHg4ODA2ODk0OCwgMHg4ODA4ODk0RSwKKzB4ODgwOTg5NTQsIDB4ODgwQTg5NUEsIDB4ODgwQjg5NjAsIDB4QTA2RDg5NjYsCisweEIwNkYwMDA5LCAweEEwNkEwMDA5LCAweEZGN0Y2MDBDLCAweDAwMUUyMTQ4LAorMHgwMDFFMTEwOCwgMHgwMDFFMTAwMCwgMHgwMDIwM0E0QywgMHgwMDIwM0E0RSwKKzB4MDAyMDNBNkQsIDB4MDAyMDNBMzAsIDB4MDAxRTEwM0YsIDB4MDAxRTEwNUYsCisweDAwMUUxMDJGLCAweDAwMUUxMDkwLCAweDAwMjAzQTU0LCAweDAwMUUxMDBCLAorMHgwMDIwM0E1MCwgMHgwMDIwM0IyMCwgMHgwMDIwMThDMCwgMHgwMDFFMTAyOCwKKzB4MDAyMDNBNkMsIDB4MDAxRDQwMjAsIDB4OTg3NjAwMDAsIDB4MDAxQzEwMDAsCisweDAwMjAzQjJDLCAweDAwMjAzQjNDLCAweDAwMjAzQTI0LCAweDAwMDlCMDRDLAorMHg2MDBDQTAzNSwgMHgwMDA5QjA1NSwgMHg2MDBDQTAzMSwgMHg2MjYwRDY4NCwKKzB4OEIyQjIyMjgsIDB4MDAwOUIwNjEsIDB4NjAwQ0EwMjksIDB4NjI2MEQ2ODAsCisweDhCMjMyMjI4LCAweDAwMDlCMDY5LCAweDYwMENBMDIxLCAweDYyNjBENjdDLAorMHg4QjFCMjIyOCwgMHgwMDA5QjBDNywgMHg2MDBDQTAxOSwgMHg2MjYwRDY3OCwKKzB4OEIxMzIyMjgsIDB4MDAwOUIwQ0QsIDB4NjAwQ0EwMTEsIDB4NjI2MEQ2NzQsCisweDhCMEIyMjI4LCAweDAwMDlCMTI1LCAweDYwMENBMDA5LCAweDYyNjBENjcwLAorMHg4QjAzMjIyOCwgMHgwMDA5QjEzRCwgMHg2MDBDQTAwMSwgMHg0RjI2RTAwMCwKKzB4MDAwOTAwMEIsIDB4RDI2Q0QxNkIsIDB4RDU2Qzg0MTIsIDB4NDAwMEM5MEYsCisweEQ3NkIwMTJELCAweEU0MDNENjZCLCAweEUyMEY2MTFDLCAweDI1NDBFMDAxLAorMHgyNTIwMjcxMiwgMHgyNjAyMDAwQiwgMHhFNjAxRDI2MiwgMHgzMDY2ODUyMywKKzB4RTAwMDhEMDUsIDB4RDY2M0QyNjAsIDB4RTAwMTgxMjIsIDB4MDAwQjI2MDIsCisweEQyNUMwMDA5LCAweDYwMEQ4NTIzLCAweDg5MDUyMDA4LCAweDhCMEE4ODAxLAorMHg2MDYwRDY1RCwgMHgyNjAwQ0IwMSwgMHhENDU3RDY1QSwgMHhFMDAxRTEwMSwKKzB4MDAwQjI2MTIsIDB4MDAwQjgxNDIsIDB4RDE1MkUwMDAsIDB4ODUxM0U1MDEsCisweDY0MEQ0NTE4LCAweDY2MDMzNDUzLCAweEUwMDA4RDA1LCAweEQ1NTFEMjUzLAorMHgyMjYwRTAwMSwgMHgwMDBCMjUwMiwgMHg0RjIyMDAwOSwgMHg4NTEzRDE0OSwKKzB4NjQ1MzY1MEQsIDB4NjI0OTQ0MTksIDB4MjI3RDY3MkUsIDB4ODgwMTYwMkMsCisweDg4MDI4OTA5LCAweDg4MDM4OTEwLCAweDg4MDY4OTFBLCAweDg4MDc4OTM1LAorMHhBMDRDODkzQiwgMHhENTQ2MDAwOSwgMHg2NjUyRDc0NiwgMHgyNzYyRDQ0NiwKKzB4NjIyQzYyNjEsIDB4MjQyMUEwMzgsIDB4MjIyODYyNUMsIDB4RDQ0MzhCM0YsCisweDY2NDJENTQwLCAweDI1NjJENDQwLCAweDI0MDE4NTYxLCAweDYyMDNBMDJDLAorMHgyMDA4NjA1QywgMHg4ODEwODkwNywgMHg4ODIwODkwOCwgMHg4ODMwODkwOSwKKzB4QTAyQzg5MEEsIDB4RDIzQTAwMDksIDB4NjIyMkEwMDgsIDB4QTAwNUQyMzksCisweEQyMzk2MjIyLCAweDYyMjJBMDAyLCAweDYyNjJENjM4LCAweEQ0MzJENTMxLAorMHg2NjIxMjUyMiwgMHhBMDBGNjI2QywgMHhENjM1MjQyMSwgMHg2MjYxRDUyRCwKKzB4NjIyQ0Q0MkQsIDB4QTAwNzI1NjIsIDB4RDYzMjI0MjEsIDB4ODU2MUQ1MjksCisweDI1NjJENDI5LCAweDYyMDMyNDAxLCAweDY2MkQ4NTE1LCAweDM2MTc2MTBELAorMHg2NTAzOEYwMSwgMHhCMENCMjQ1MSwgMHhBMDAxMDAwOSwgMHhFMDAwRTAwMSwKKzB4MDAwQjRGMjYsIDB4RDYxOTAwMDksIDB4RDQyN0UxMDEsIDB4NjU0MTI2MTAsCisweEQxMThENzE3LCAweEUyMEY2NTVELCAweDI3NTJFMDAxLCAweDAwMEIyNjIwLAorMHgyRkU2MjEwMiwgMHhEMjBGNEYyMiwgMHg2NDBDODUyMywgMHg4QjA4MjQ0OCwKKzB4RDUxMUQ2MUQsIDB4MjYyMUUyMDAsIDB4OTQwRjg0NTEsIDB4QTA0ODIwNDksCisweERFMEQ4MDUxLCAweEM4NDA2MEUwLCAweEUyMDE4RDMyLCAweDg5NDQzNDI3LAorMHhEMjE2RDYxNSwgMHgyNjQxNDIwQiwgMHgwMDA5QTAzMCwgMHgwMDAwRkY3RiwKKzB4MDAyMDNBNkQsIDB4MDAyMDNBMjQsIDB4MDAyMDNBMzAsIDB4MDAxRTExMDAsCisweDAwMUUxMDBDLCAweDAwMjAzQTUwLCAweDAwMUUxMDAwLCAweDAwMUUxMDAxLAorMHgwMDIwM0E1OCwgMHgwMDIwM0EzOCwgMHgwMDIwM0EzQywgMHgwMDIwM0E0MCwKKzB4MDAyMDNBNUMsIDB4MDAyMDNBNjAsIDB4MDAyMDNBNjQsIDB4MDAyMDNBNjgsCisweDAwMjAzRTIwLCAweDAwMjAzRTJBLCAweDAwMjAzQTRBLCAweDAwMjAyN0YyLAorMHg4OTEyMzQyNywgMHhEMjk0RDY5MywgMHgyNjQxNDIwQiwgMHhDQjgwODRFMSwKKzB4ODBFMUIwRjUsIDB4RDY5MTYwRTAsIDB4MkUwMENCMDQsIDB4QzkzRjYwNjAsCisweEQ2OEYyNjAwLCAweEEwMDFFMDAxLCAweEUwMDAyNjAyLCAweDAwMEI0RjI2LAorMHhENjhDNkVGNiwgMHhDODgwNjA2MCwgMHhEMjg2ODkxOSwgMHg4ODAxNjAyMSwKKzB4RDI4OThCMTUsIDB4ODUyNEU1MDEsIDB4ODkxMDMwNTYsIDB4RTIwM0QxODcsCisweDIxMjBENDg3LCAweEUwMEI2NTQxLCAweDA2NTY2NTVELCAweEU0MEZENTg1LAorMHgyMTQwRTcwMiwgMHhENzdFMjU3MSwgMHgwMDBCRTAwMSwgMHgwMDBCMjcwMiwKKzB4MkZFNkUwMDAsIDB4REU4MDRGMjIsIDB4Qzg4MDg0RTEsIDB4RDU3QTg5MkMsCisweDIwMDg4NTU0LCAweDYxMDM4RjI4LCAweDg1NTNENzdDLCAweDY0MDM2NjcyLAorMHg4NTY2NjUwQywgMHgzNTIwNjIwQywgMHhENjc5OEIxRSwgMHg2NTFDRDc3NCwKKzB4MjY1MTY0NEMsIDB4NjBFMDI3NDEsIDB4ODkwNEM4NDAsIDB4NDIwQkQyNzUsCisweEEwMDMwMDA5LCAweEQyNjgwMDA5LCAweDAwMDk0MjBCLCAweDAwMDlCMDlGLAorMHhFMjAxRDE2NywgMHg2MEUwMjEyMiwgMHhDQjA0RDQ2NCwgMHg2MDQwMkUwMCwKKzB4MjQwMEM5M0YsIDB4NjAyM0EwMDEsIDB4NEYyNkUwMDAsIDB4NkVGNjAwMEIsCisweDJGQjYyRkE2LCAweDJGRDYyRkM2LCAweERBNjIyRkU2LCAweDY2QTFFMjQwLAorMHgzNjIyREM1RSwgMHg2MjYzODkwMCwgMHg2RUQzNkQyQywgMHg0RTIxMzZEOCwKKzB4NEUyMTJBNjEsIDB4REI2MUQ0NjAsIDB4RTcwMEEwMEYsIDB4NzcwMTYyQjIsCisweDcxMDI2MTIzLCAweDY2MjEyQjEyLCAweDcxMDI2MjEzLCAweDYxMjEyQjEyLAorMHg2NTFENjY2RCwgMHgzNTZDNDUyOCwgMHg2MjdDMjQ1MiwgMHg4QkVEMzJFMywKKzB4QzkwMzYwRDMsIDB4OEIxMDg4MDMsIDB4NjE3MzY3QjIsIDB4MkIxMjcxMDIsCisweDcxMDI2RTEzLCAweDJCMTI2NTcxLCAweDY1NUQ2REUxLCAweDQyMjg2MkRELAorMHgzMjVDRTEwNywgMHhBMDBDMkMxMCwgMHg4ODAyMjQyMiwgMHhBMDAzOEIwMSwKKzB4ODgwMUUyMDMsIDB4RTIwMThCMDUsIDB4NjZCMjJDMjAsIDB4NjU1RDY1NjEsCisweEU2MEYyNDUyLCAweDY3QTEyQzYwLCAweDhCMDUyNzc4LCAweEREMzhEQzQ0LAorMHhFQjAxRUEwMCwgMHgyREIyMkNBMiwgMHg2REY2NkVGNiwgMHg2QkY2NkNGNiwKKzB4NkFGNjAwMEIsIDB4MkZFNjJGRDYsIDB4RTI0MEREMzYsIDB4MzYyMjY2RDEsCisweDYyNjM4OTAwLCAweDM2Nzg2NzJDLCAweDc3MDNERTM4LCAweDQ3MjEyRDYxLAorMHg2NEUyRDYzNSwgMHhBMDBFNDcyMSwgMHg2NTYyRTEwMCwgMHg2MjUzNzEwMSwKKzB4NzQwMTI0NTAsIDB4MjQyMDQyMTksIDB4NDUyOTc0MDEsIDB4NzQwMTI0NTAsCisweDI0NTA0NTE5LCAweDYyMUM3NDAxLCAweDhCRUUzMjczLCAweDY2RTI0MjAwLAorMHg0MjAwNjFEMSwgMHgyMTE4MzYyQywgMHgyRTYyOEYwNiwgMHhERDFDRDcyOCwKKzB4RTUwMUU0MDAsIDB4MkQ1MjI3NDIsIDB4MDAwQjZFRjYsIDB4MkZENjZERjYsCisweDRGMjIyRkU2LCAweEVEMEFFRTAxLCAweDY0RTNCQzg2LCAweEJDOEI2NEUzLAorMHg2MkVDN0UwMSwgMHg4QkY3MzJENywgMHhCQzhFRUUwMSwgMHg2NEUzNjRFMywKKzB4N0UwMUJDOTMsIDB4MzJENzYyRUMsIDB4NEYyNjhCRjcsIDB4MDAwQjZFRjYsCisweEQxMTg2REY2LCAweEQ0MTg5MjBELCAweDcyMTIyMTIyLCAweDI0MjJENjE3LAorMHhENzE3NzIwNCwgMHg3MjIwMjYyMiwgMHgyNzIyRDExNiwgMHgwMDBCNzIzMCwKKzB4MTM3QTIxMjIsIDB4MDAyMDNBNEEsIDB4MDAyMDI4RkUsIDB4MDAxRTEwMTUsCisweDAwMjAzQTUwLCAweDAwMUUxMDAxLCAweDAwMjAzQTI0LCAweDAwMUUxMTAwLAorMHgwMDIwM0E0RSwgMHgwMDIwM0EzQywgMHgwMDFFMTAwMCwgMHgwMDIwM0E0MCwKKzB4MDAyMDNBNEMsIDB4MDAyMDI3RjIsIDB4MDAxRTEwMEMsIDB4MDAyMDNBMzgsCisweDAwMjAzQTU0LCAweDAwMjAzQTU4LCAweDAwMjAzQTVDLCAweDAwMjAzQTYwLAorMHgwMDIwM0E2NCwgMHgwMDIwM0E2OCwgMHg0RjIyMkZFNiwgMHhENjcwN0ZGQywKKzB4ODgwMTYwNjAsIDB4RTIwMTg5NTEsIDB4MjYyMEJGQkIsIDB4RDU2RUQxNkQsCisweERFNkU2MDEwLCAweDY0RTM2NTUyLCAweDc0MDJDODQwLCAweDhEMjJEMTZDLAorMHhEMjZDNzUwMiwgMHhFNjAxRDc2QywgMHhFNzA0MjcyMiwgMHg3NjAxNjI1NSwKKzB4NjI2QzI0MjEsIDB4OEZGOTMyNzMsIDB4RDQ2Mzc0MDIsIDB4NjI0MkU2MDEsCisweDY0MEQ4NTI4LCAweDY3NDk0NDE5LCAweDI3NUQ2NTdFLCAweDgxRTQ2MDdDLAorMHhFNDE3RDU2MiwgMHg2NzU1NzYwMSwgMHgzMjQzNjI2QywgMHg4RkY5MjE3MSwKKzB4QTAyMDcxMDIsIDB4RDI1RTAwMDksIDB4RTYwMUQ3NUIsIDB4RTcwNDI3MjIsCisweDc2MDE2MjU1LCAweDYyNkMyNDIxLCAweDhGRjkzMjczLCAweEQ0NTI3NDAyLAorMHg2MjQyRTYwMSwgMHg2NDBEODUyOCwgMHg2NzQ5NDQxOSwgMHgyNzVENjU3RSwKKzB4ODFFNDYwN0MsIDB4RTQxN0Q1NTMsIDB4Njc1NTc2MDEsIDB4MzI0MzYyNkMsCisweDhGRjkyMTcxLCAweDkyODk3MTAyLCAweEQyNDYyRTIxLCAweDVFMjNENzRFLAorMHg2NEYyMkZFMiwgMHg2MDQzNjVGMiwgMHgyNzAwQzk4MCwgMHhDOTYwNjA0MywKKzB4ODA3MTYxMDMsIDB4QzkwMzYwNDMsIDB4ODA3MjQ1MTksIDB4NjVGMjYwNUMsCisweDgxNzI2NkYyLCAweDQ2MTk0NjI5LCAweDYwNkM0NTI5LCAweDQwMTg2NDVDLAorMHg4MTczMzA0QywgMHgyMTE4NUUyMywgMHg2NEYyMkZFMiwgMHg2RTRDNjJGMiwKKzB4NjAyQzQyMTksIDB4NjZGMjYyRjIsIDB4NDYyOTQwMTgsIDB4NDYxOTMwRUMsCisweDQyMjk4MTc0LCAweDY1MkM2MDZDLCAweDMwNUM0MDE4LCAweDgxNzU4RjA3LAorMHgwMDA5QkM5NywgMHgyMjI4NjIwQywgMHhBMDBBODkwOCwgMHg2MDEzMDAwOSwKKzB4OEIwMzg4NDAsIDB4MDAwOUIwMDksIDB4MDAwOUEwMDMsIDB4RTIwMkQ2MkYsCisweDdGMDQyNjIyLCAweDAwMEI0RjI2LCAweDRGMjI2RUY2LCAweDg1NTJENTJBLAorMHg4ODMwNjAwRCwgMHg4ODMxODkwMywgMHhBMDM0ODkyMywgMHg4NTU1MDAwOSwKKzB4RDQyOEQ3MjcsIDB4ODU1MzI3MDEsIDB4NjEwREQ2MjcsIDB4MjQxMjQxMTgsCisweDQ2MEJENDI2LCAweEQ3MjMwMDA5LCAweEQyMjZENDI1LCAweDY1NzI0MjBCLAorMHhFMjMwRDEyMCwgMHg0MjI4NjcxMiwgMHgyNzI5RTYyMCwgMHgzNzYwNDYyOCwKKzB4RDYyMThCMDMsIDB4QTAxNkUyMDAsIDB4RDYxRjI2MjIsIDB4QTAxMkUyMDIsCisweEQxMTgyNjIyLCAweDYyMTJFNTMwLCAweEU2MjA0NTI4LCAweDQ2MjgyMjU5LAorMHg4OTA4MzI2MCwgMHhENDFBRDExOSwgMHhFNjAxRDUxMywgMHgyMTYwNDUwQiwKKzB4NDcyQkQ3MTgsIDB4NEYyNjRGMjYsIDB4MDAwOTAwMEIsIDB4MDAwMDA2MEEsCisweDAwMjAzQTZDLCAweDAwMUUxMDAwLCAweDAwMjAzQTU4LCAweDAwMjAzRTIwLAorMHgwMDIwM0UyQywgMHgwMDIwM0RDNCwgMHgwMDIwM0E0MCwgMHgwMDIwM0RGNCwKKzB4MDAyMDNERjIsIDB4MDAyMDNEQzYsIDB4MDAyMDNBMjQsIDB4MDAyMDNBNTAsCisweDAwMjAzQTNDLCAweDAwMjAzQTM4LCAweDAwMjAxOEMwLCAweDAwMjAzQjQ4LAorMHgwMDIwM0I0QywgMHgwMDIwMThEMCwgMHgwMDIwM0E1NCwgMHgwMDFFMTAwQiwKKzB4MDAyMDNCNjAsIDB4MDAxMTQwMDQsIDB4NEYyMjJGRTYsIDB4ODRFOURFODYsCisweDI0NDg2NDBDLCAweEIxN0I4OTAxLCAweEQyODQwMDA5LCAweDI2Njg2NjIwLAorMHg2MEUwODkwMiwgMHgyRTAwQzlCRiwgMHgwMDBCNEYyNiwgMHgwMDBCNkVGNiwKKzB4MkZFNjAwMDksIDB4REU3RTRGMjIsIDB4NjBFMEQ2N0UsIDB4Q0JDMEQ0N0UsCisweDYyNjAyRTAwLCAweEM4MDM2MDJDLCAweDQwMjE4OTA0LCAweDcwMDE0MDIxLAorMHg2NjAzQTAwMiwgMHg2NjAzNDAwOSwgMHhENjc4NjE2RCwgMHhFNTAwQTAwNCwKKzB4NzUwMTYyNjIsIDB4NzQwNDI0MjIsIDB4MzIxMzYyNUQsIDB4RDI3NDhCRjgsCisweDAwMDk0MjBCLCAweEM5QkY4NEUyLCAweDRGMjY4MEUyLCAweDZFRjYwMDBCLAorMHgyRkU2MkZENiwgMHg3RkZDNEYyMiwgMHg2MjYwRDY2RSwgMHg4OTQwMjIyOCwKKzB4RDU2NUUxMDAsIDB4NjA1MDI2MTAsIDB4Q0I0MEQ0NkIsIDB4MjUwMDQ0MEIsCisweDhEMDUyMDA4LCAweDYyRTA2RTAzLCAweDcxMDQ2MTJDLCAweDJGMTFBMDA2LAorMHhENDY2RDY1RSwgMHhERDY2Njc2MCwgMHg2NTdDNEQwQiwgMHhFMjNDNkQxRCwKKzB4OEIwMzNEMjcsIDB4RDI2NEQ0NjMsIDB4MDAwOTQyMEIsIDB4NEQyMTREMjEsCisweEEwMDVENzYyLCAweDY2RTZFNDAwLCAweDM1N0M0NTA4LCAweDc0MDEyNTYyLAorMHgzNUQzNjU0RCwgMHhENzVFOEJGNywgMHg2RTcyRTAwMywgMHg4MUUxNDAxOCwKKzB4NkU3MjYwRjEsIDB4ODFFMjcwMEMsIDB4RDQ1QTYxNzIsIDB4REQ1QTgxMTMsCisweDY1NzI0RDBCLCAweEQ2NEFEMjU5LCAweDIyMTJFMTAxLCAweEM5M0Y2MDYwLAorMHg3RjA0MjYwMCwgMHg2RUY2NEYyNiwgMHg2REY2MDAwQiwgMHgyRkM2MkZCNiwKKzB4MkZFNjJGRDYsIDB4RDI1MjRGMjIsIDB4NkI0MzZFNzMsIDB4NDIwQjZDNTMsCisweDIwMDg2RDYzLCAweDY0MDM4RDFDLCAweEU1MEVEMTNDLCAweDMyNTI2MjEwLAorMHg2MEMzODkxNiwgMHg4MDQxMjRCMCwgMHg4MTQxNjBEMywgMHhBMDA3RTUwMCwKKzB4NjU1RDYxQkMsIDB4MDBFQzYwNTMsIDB4MzY0QzY2NTMsIDB4ODA2NDc1MDEsCisweDMyMTM2MjVELCAweEQ2MzA4QkY1LCAweEM5QkY2MDYwLCAweDI2MDBBMDA4LAorMHhEMjM5RDQ0MCwgMHg2RUY2NEYyNiwgMHg2Q0Y2NkRGNiwgMHg2QkY2NDIyQiwKKzB4NkVGNjRGMjYsIDB4NkNGNjZERjYsIDB4NkJGNjAwMEIsIDB4MkY5NjJGODYsCisweDJGQjYyRkE2LCAweDJGRDYyRkM2LCAweDRGMjIyRkU2LCAweEUxMDA3RkM0LAorMHg2NTEzRUNGRiwgMHg2QjEzNkNDRCwgMHhERTM0RDczMywgMHhFREZGNjRGMywKKzB4RDgzM0VBMDQsIDB4NjA1MzY1NUMsIDB4MDI3RDQwMDAsIDB4MzJDMDYyMkQsCisweDY2MDM4RDBELCAweDA5RUQ2MDYzLCAweDI0OTEwMjdELCAweDI0MjE3NDAyLAorMHg2OTgyMDJFRCwgMHgzOTI4NjIyRCwgMHg3NDAyMjg5MiwgMHg3NTAxNzEwNCwKKzB4NjA2MzYyNUMsIDB4MDdENTMyQTIsIDB4MEVCNThGRTQsIDB4MjQ0ODY0MUMsCisweEU2ODA4OTA1LCAweDY3RjNFNUM1LCAweEJGOEY2NjZDLCAweDdGM0M2NTVDLAorMHg2RUY2NEYyNiwgMHg2Q0Y2NkRGNiwgMHg2QUY2NkJGNiwgMHgwMDBCNjlGNiwKKzB4RDExQzY4RjYsIDB4NjAxMkQyMUMsIDB4Q0IyMEU0MDUsIDB4MjEwMkU1MDAsCisweDAwMEIyMjQyLCAweDAwMDAyMjUyLCAweDAwMUUxMDE3LCAweDAwMjAzOTk2LAorMHgwMDFFMTAxNSwgMHgwMDFFMTBCRiwgMHgwMDExNzgwMCwgMHgwMDFFMTBGQywKKzB4MDAyMDA2NDQsIDB4MDAyMDM5OUMsIDB4MDAyMDJBNTYsIDB4MDAyMDNCNjQsCisweDAwMjAxOEQwLCAweDAwMjAzQjgwLCAweDAwMjAxOEMwLCAweDAwMTE3ODhDLAorMHgwMDIwMzk5OCwgMHgwMDIwMzU3QywgMHgwMDIwMTUzNCwgMHgwMDFFMjEzMCwKKzB4MDAyMDJBMTgsIDB4MDAyMDNCODgsIDB4MDAyMDM5RkMsIDB4MDAyMDNBMDQsCisweDAwMjAzREMwLCAweDAwMUMzNTAwLCAweDAwMUQ0MDA0LCAweEQ1NjREMTYzLAorMHhFNDAwRDc2NCwgMHgyMTQyRTIwRiwgMHgxNzQxMTE1NCwgMHhENTYyMjcyMiwKKzB4OTY2OUQ3NjIsIDB4MTU0MTI1NzIsIDB4OTY2NjE1NjIsIDB4RTYwMTE1NjUsCisweEQ1NUYxMTY1LCAweDY2NkNFNkY4LCAweDI1NDIyNTQyLCAweDI1NDIyNTQyLAorMHgyNTQyMjU0MiwgMHgyNTYyMjU0MiwgMHg3NjAxRTcyNywgMHg2NzYzMjU3MiwKKzB4MjU2Mjc3OTcsIDB4RTcwNDI1NzIsIDB4MjU3MkUyNDgsIDB4RTIxOTI1MjIsCisweEUyNzAyNTIyLCAweDI1NDIyNTQyLCAweDI1NDIyNTQyLCAweDI1MjIyNTQyLAorMHgyNTIyRTIwQywgMHgyNTQyMjU0MiwgMHgyNTQyMjU0MiwgMHgyNTQyMjU0MiwKKzB4MjU0MjI1NDIsIDB4MDAwQjE1NEEsIDB4RTIwODExNDUsIDB4MDAwOTQyMkIsCisweDJGRTYyRkQ2LCAweDdGRkM0RjIyLCAweEM4MjA2MDQzLCAweDZFNDM4RDAyLAorMHgwMDA5QkU4NSwgMHhDODEwNjBFMywgMHhCRTgyODkwMSwgMHg2MEUzMDAwOSwKKzB4ODkwMUM4NDAsIDB4MDAwOUJFQTQsIDB4QzgwMTYwRTMsIDB4REQzRDg5MzgsCisweEM4MDI2MEQwLCAweDJGMDA4RDAzLCAweDQ2MEJENjNCLCAweDYwRjAwMDA5LAorMHg4OTAyQzgwNCwgMHg0NjBCRDYzOSwgMHg2MkYwMDAwOSwgMHhDODgwNjAyMywKKzB4NjBEMDg5MDIsIDB4MkQwMEM5N0YsIDB4QzgwMTYwMjMsIDB4RDYzNDg5MDYsCisweDAwMDk0NjBCLCAweDAwMDlBMDA3LCAweDUxNjMwNjAxLCAweDg5MDJDODA4LAorMHg0NjBCRDYzMCwgMHg2MEYwMDAwOSwgMHg4OTAyQzgxMCwgMHg0MjBCRDIyRSwKKzB4RDUyRTAwMDksIDB4ODgwMjYwNTIsIDB4RDIyRDhCMDMsIDB4QTAwNUU2MDQsCisweDg4MDEyMjYwLCAweEQyMkE4QjAyLCAweDIyNjBFNjAxLCAweDI1MjJFMjAwLAorMHhDODgwNjBFMywgMHhEMjI3ODkyRCwgMHg2MEUzNkUyMCwgMHg4OTAyQzg4MCwKKzB4NDIwQkQyMjUsIDB4NjBFMzAwMDksIDB4ODkwMkM4NDAsIDB4NDIwQkQyMjMsCisweDYwRTMwMDA5LCAweDg5MDJDODAyLCAweDQyMEJEMjIxLCAweDYwRTMwMDA5LAorMHg4OTBEQzgwNCwgMHhERDIwRDExRiwgMHgwMDA5NDEwQiwgMHgwMDA5QkYxMSwKKzB4MDAwOUJGNEMsIDB4RDUxRUQ0MUQsIDB4MjQ3MEU3MDgsIDB4MjVEMkJGODUsCisweEM4MDg2MEUzLCAweEQyMUI4OTA1LCAweDRGMjY3RjA0LCAweDQyMkI2RUY2LAorMHg3RjA0NkRGNiwgMHg2RUY2NEYyNiwgMHg2REY2MDAwQiwgMHgwMDFDNTgxQywKKzB4QTAwMEEwMDAsIDB4MDAxRDAxMDAsIDB4MDAxRDQwMDAsIDB4MDAwNDAwMjEsCisweDAwMUM1ODlDLCAweDAwMUUxMDIxLCAweDAwMjAxQTQ2LCAweDAwMjAxQTY4LAorMHgwMDIwMjBDOCwgMHgwMDIwMUE4MCwgMHgwMDIwMUE4RSwgMHgwMDIwM0E1MCwKKzB4MDAxRTEwMEIsIDB4MDAxRTEwMjgsIDB4MDAyMDFBRkEsIDB4MDAyMDFCMDYsCisweDAwMjAxQTk2LCAweDAwMjAxQUI0LCAweDEyMzQ1Njc4LCAweDAwMUUxMDAwLAorMHgwMDEwRjEwMCwgMHgwMDIwMUFFMiwgMHg2NDRDRDZBNywgMHgwMDBCMzQ2QywKKzB4RDZBNjI0NTAsIDB4MzQ2QzY0NEMsIDB4MjQ1MDAwMEIsIDB4NjQ0Q0Q2QTQsCisweDAwMEIzNDZDLCAweDYyNUMyNDUwLCAweDQyMDg2MTZELCAweDQyMDg0MTE5LAorMHg0MjAwNjAxOSwgMHg2NzBFNjE0QywgMHhENDlFMzIxQywgMHg0MjAwMjA3RCwKKzB4MzI0Q0M5MEYsIDB4MjIwMDAwMEIsIDB4NDIwODYyNUMsIDB4NDIwMDQyMDgsCisweDMyNEM2NDRDLCAweDQyMDBENDk4LCAweDAwMEIzMjRDLCAweDJGRTYyMjYwLAorMHg2MTRDNEYxMiwgMHg0MTAwRDQ5MywgMHg2NzEwMzE0QywgMHhFMjlGNjY2RCwKKzB4MjcyOTQ2MTksIDB4NkU1MzYyNjksIDB4NjcyRTY1NzMsIDB4NDIyMTIyN0QsCisweDQyMjE0MjIxLCAweDc2MDE2NjJDLCAweEU0MDE0NjA4LCAweDM0RTg0NjA4LAorMHg2NDRDNDYwMCwgMHgwNzFBMDQ2NywgMHgyMTUwMjU3QiwgMHgwMDBCNEYxNiwKKzB4NEYyMjZFRjYsIDB4RDI4NTdGRTgsIDB4ODgwMTYwMjEsIDB4RDI4NDhCN0IsCisweDI2Njg2NjIxLCAweEQyODM4Qjc3LCAweDI2Njg2NjIxLCAweEU1MEY4QjczLAorMHhFNDAxQkZBMiwgMHhCRkE0RTUwMSwgMHhFNTg2RTQwMCwgMHhFNDAwNjU1QywKKzB4MkY1MEJGQTQsIDB4QkZBMUU0MDEsIDB4RTYwMkU1MDYsIDB4NjA2MzQ2MTgsCisweDgxRjJFNDAxLCAweDY1NDNCRjlGLCAweEU0MDE4NUYyLCAweEJGQUI2NTQzLAorMHg4NUYyNjYwMywgMHg2NTQzRTQwMSwgMHg2NjAzQkZCMSwgMHhFNDAyNjVGMCwKKzB4NjA1Mzc1NkMsIDB4ODBGOEJGODAsIDB4QkY4MkU0MDIsIDB4ODRGOEU1MTIsCisweDcwOTBFNDAyLCAweDY1MDNCRjgyLCAweDQ2MThFNjAyLCAweDgxRjY2MDYzLAorMHhCRjgwRTQwMiwgMHg4NUY2RTUwMCwgMHg2NjAzRTQwMiwgMHhFNTAwQkY4QywKKzB4RTQwMjg1RjYsIDB4QkY5MjY2MDMsIDB4RTVGRUU1MDAsIDB4RTAxMDY1NUMsCisweEJGNjFFNDAzLCAweEU1MTMwRjU0LCAweEU0MEVCRjYzLCAweDA1RkNFMDEwLAorMHhCRjYzRTQwRSwgMHhFNTAwNzU4NSwgMHhCRjY0RTQwMywgMHhFNTAwRTY0MCwKKzB4QkY3MUU0MDMsIDB4RTUwMEU2NDAsIDB4QkY3OEU0MDMsIDB4RTVGRkU2NDAsCisweEUwMTQ2NTVDLCAweEJGNDdFNDA0LCAweEU0MEYwRjU0LCAweEU1MDRCRjQ5LAorMHgwNUZDRTAxNCwgMHhCRjQ5RTQwRiwgMHhFNTAxNzU4NCwgMHhCRjRBRTY0MCwKKzB4RTUwMUU0MDQsIDB4QkY1N0U2NDAsIDB4RTUwMUU0MDQsIDB4RTQwNEU2NDAsCisweEFGNUM3RjE4LCAweDdGMTg0RjI2LCAweDAwMEI0RjI2LCAweDRGMjIwMDA5LAorMHhEMjQyN0ZGMCwgMHg4ODAxNjAyMSwgMHhEMjQxOEI3MSwgMHgyNjY4NjYyMSwKKzB4RDI0MDhCNkQsIDB4MjY2ODY2MjEsIDB4RTUwRjhCNjksIDB4RTQwMUJGMUMsCisweEJGMUVFNTAxLCAweEU1ODZFNDAwLCAweEU0MDA2NTVDLCAweDJGNTBCRjFFLAorMHhCRjFCRTQwMSwgMHhFNDAxRTUwNiwgMHhCRjFDNjU0MywgMHhFNDAxRTY0MCwKKzB4QkYyOTY1NDMsIDB4RTQwMUU2NDAsIDB4QkYzMDY1NDMsIDB4NjVGMEU2NDAsCisweDc1NkNFNDAyLCAweEJFRkY2MDUzLCAweEU0MDI4MEY0LCAweEU1MTJCRjAxLAorMHhFNDAyODRGNCwgMHhCRjAxNzA5MCwgMHhFNjQwNjUwMywgMHhCRjAyRTQwMiwKKzB4RTY0MEU1MDAsIDB4QkYwRkU0MDIsIDB4RTY0MEU1MDAsIDB4QkYxNkU0MDIsCisweEU1RkVFNTAwLCAweDYwNTM2NTVDLCAweEJFRTVFNDAzLCAweEU1MTM4MEY4LAorMHhFNDBFQkVFNywgMHhFNDBFODRGOCwgMHhCRUU3NzA4NSwgMHhFNTAwNjUwMywKKzB4QkVFOEU2NDAsIDB4RTUwMEU0MDMsIDB4QkVGNUU2NDAsIDB4RTUwMEU0MDMsCisweEJFRkNFNjQwLCAweEU1RkZFNDAzLCAweDYwNTM2NTVDLCAweEJFQ0JFNDA0LAorMHhFNDBGODBGQywgMHhFNTA0QkVDRCwgMHhFNDBGODRGQywgMHhCRUNENzA4MywKKzB4RTUwMTY1MDMsIDB4QkVDRUU2NDAsIDB4RTUwMUU0MDQsIDB4QkVEQkU2NDAsCisweEU1MDFFNDA0LCAweEU0MDRFNjQwLCAweEFFRTA3RjEwLCAweDdGMTA0RjI2LAorMHgwMDBCNEYyNiwgMHgwMDAwMDAwOSwgMHgwMDFFMTAyRiwgMHgwMDFFMTA4MCwKKzB4MDAxRTEwOTAsIDB4MDAxRTEwM0YsIDB4MDAxRTEwM0UsIDB4MDAyMDNBNEEsCisweDAwMjAzQTRDLCAweDAwMjAzQTRFLCAweEQyMUREMTFDLCAweDY2MjA2MDEwLAorMHg2NzZDNzAwMSwgMHgzNzAwQzkwRiwgMHhFNTAwOEQxMywgMHg2NzEwNjIxMCwKKzB4NzcwMTYyMkMsIDB4NjQyMzIxNzAsIDB4RDYxNjYwMTAsIDB4NDQwODQ0MDgsCisweDM0MjhDOTBGLCAweDYyNjAyMTAwLCAweDcyMDFENTEzLCAweDQ0MDgyNjIwLAorMHgwMDBCMzU0QywgMHhEMTBGNjA1MywgMHgyNTU4NjUxMCwgMHhFNjAwOEQxMywKKzB4RDYwREQ0MEIsIDB4NjU1QzY1NDAsIDB4NDcwODY3NTMsIDB4Mzc1ODQ3MDgsCisweDQ3MDg2NTQwLCAweDI0NTA3NTAxLCAweDM2N0M2MDQwLCAweDI0MDBDOTBGLAorMHg3MkZGNjIxMCwgMHgwMDBCMjEyMCwgMHgwMDAwNjA2MywgMHgwMDIwMzk5NSwKKzB4MDAyMDM5OTQsIDB4MDAyMDM5OTYsIDB4MDAyMDM1QkMsIDB4N0ZGQzRGMjIsCisweEU2ODBEMUE4LCAweDY2NkM2MjEyLCAweEQyQTcyRjIyLCAweDY3RjM2NTYzLAorMHg0MjBCNzU0MiwgMHg3RjA0RTQwNCwgMHgwMDBCNEYyNiwgMHhFNjgwMDAwOSwKKzB4RDJBMTY2NkMsIDB4RTcwMDY1NjMsIDB4NDIyQjc1NDAsIDB4RTY4MDY0NzMsCisweEQyOUQ2NjZDLCAweEU3MDA2NTYzLCAweDQyMkI3NTQzLCAweDJGODY2NDczLAorMHgyRkE2MkY5NiwgMHgyRkM2MkZCNiwgMHgyRkU2MkZENiwgMHg3RkMwNEYyMiwKKzB4REI5N0QyOTYsIDB4NzIwMTJGMjIsIDB4RDE5NjFGMjEsIDB4NjYxMjUyMTEsCisweDhCMDEzNjIwLCAweDAwMDlBMEY5LCAweEM5MDM2MDYxLCAweDhCMDE4ODAxLAorMHgwMDA5QTBGMywgMHhEMjkwREM4RiwgMHg2NEMzNDIwQiwgMHg2NTAzRDE4RiwKKzB4NjAxMTFGMDIsIDB4OEIwNDg4MDEsIDB4NDIwQkQyOEQsIDB4QUZFNDY0QzMsCisweDU0NTMwMDA5LCAweDg0NENFRTg0LCAweDg5MDEzMEUwLCAweDAwMDlBMEMzLAorMHg2NjEwRDE4OCwgMHg2MDIzNjI2QywgMHg4QjcxODgwMSwgMHg2MjEwRDE4NiwKKzB4ODk2NjIyMjgsIDB4REE4NkQyODUsIDB4RTAwMzYxMjIsIDB4NjQyMjExMTIsCisweDQwMThEODgxLCAweEREODNFNTAwLCAweDgxNDE2N0EzLCAweDc3MDQyODUwLAorMHg2NDcyNjZBMiwgMHg2RUQzRDU4MCwgMHgxRjQ1N0UwNCwgMHg2NTUyMUY1NiwKKzB4NjRFMzY4RDIsIDB4MUY4ODc0RjgsIDB4Njg0MzY5RTIsIDB4MUY2Mzc4OTQsCisweDFGOTkxRjc0LCAweDYyODI2MTQyLCAweEQ3NzlEOTc4LCAweDFGMkJENjc5LAorMHg2NzcyNjI5MiwgMHgxRjFBNjA2MiwgMHgyNjAyQ0IyMCwgMHhEMTc2RTYwMCwKKzB4RTU0MDFGNTcsIDB4MUY3RDFGMkMsIDB4NzYwMTFGMUUsIDB4MzI1MzYyNkQsCisweDUxRjM4QkZCLCAweDUyRjU1NUY0LCAweDI1MjIyQTEyLCAweDU1Rjc1N0Y2LAorMHgyNzUyNUFGOCwgMHg1REY5MkRBMiwgMHgyRUQyNTFGQiwgMHhENTZCNUVGQSwKKzB4NTRGQzI0RTIsIDB4MjgxMjU3RkQsIDB4RDE2MEQ4NjksIDB4MjU3MjI5NDIsCisweDY5MTI2NzgyLCAweDE5NzREODY2LCAweERENjY2QTEyLCAweDU2RkU2MEExLAorMHgyQTAxQ0IwMSwgMHhEQTY0NjQxMiwgMHhFOTAxMjg0MiwgMHg0QTBCMkQ0MiwKKzB4NTJGRTI2OTIsIDB4RDY2MUVFMDEsIDB4MjJFMjRFMTgsIDB4NzIwMTYyNjIsCisweDYwQjIyNjIyLCAweENCMDFEMTRGLCAweDJCMDJFMjAyLCAweDIxMjBBMDNGLAorMHg4QjNDMjIyOCwgMHhFNjAxRDU1QSwgMHgyMTYwRTcwMCwgMHhFMDFDMjU3MiwKKzB4QzgwMTAwNEMsIDB4RDg1NzhCMEMsIDB4MUY4RkQyNTcsIDB4RTYwMDI4MjIsCisweDc2MDFFNTdELCAweDMyNTM2MjZDLCAweDU2RkY4QkZCLCAweDI2MjJEMjUzLAorMHhFMkZFNjlCMiwgMHgyQjkyMjkyOSwgMHgwQTRDRTAxRSwgMHhFMDFGNjVGMiwKKzB4MDE0QzI1QTAsIDB4NzQxMDU3RjEsIDB4RUEwNjI3MTAsIDB4REQ0Q0U2MDAsCisweDg0NDZERTRDLCAweDJEMDA3NjAxLCAweDY5NkM2ODQ0LCAweDJFODAzOUEzLAorMHg4RkY2N0UwMSwgMHhERTQ4N0QwMSwgMHgyRUEwRUE5NCwgMHhFMTAwN0UwMSwKKzB4N0UwRjJFMTAsIDB4RDEyRkUyMDUsIDB4NjQxMDJFMjAsIDB4NjAyMzYyNEMsCisweDg5MDg4ODAxLCAweDU1RjJEMjJBLCAweDY0QzM0MjBCLCAweEVFMDFEMTMyLAorMHhBRjFBNEUxOCwgMHg1NUYyMjFFMiwgMHg4NTUzRDEzQywgMHg2MjBENjYxMiwKKzB4ODkwNjMyNjIsIDB4RDYzQkQ0M0EsIDB4RTgwMTQ2MEIsIDB4QUYwQ0Q3M0EsCisweEQ5MUYyNzgyLCAweDY0QzM0OTBCLCAweEVFMDFEMTI3LCAweERBMzhENDM3LAorMHg0QTBCNEUxOCwgMHhBRjAwMjFFMiwgMHg3RjQwMDAwOSwgMHg2RUY2NEYyNiwKKzB4NkNGNjZERjYsIDB4NkFGNjZCRjYsIDB4MDAwQjY5RjYsIDB4NEYyMjY4RjYsCisweDg1NDY3RkY0LCAweDJGMDFFNjgxLCAweDY2NkM4NTQ3LCAweDg1NDg4MUYxLAorMHg4MUYyRDIwOSwgMHg2N0YzODU0MiwgMHg4NTQzODFGMywgMHg4MUY0RTQwQywKKzB4NjU2MzYwNTMsIDB4NDIwQjgxRjUsIDB4N0YwQzc1NDAsIDB4MDAwQjRGMjYsCisweDAwMDAwMDA5LCAweDAwMUMzRDlDLCAweDAwMjAyM0ZDLCAweDAwMTE3NzlBLAorMHgwMDFDMzZGOCwgMHgwMDIwMzVCNCwgMHgwMDIwMTRBNiwgMHgwMDIwM0ExNiwKKzB4MDAyMDE0RDAsIDB4MDAyMDM5QTUsIDB4MDAyMDM5QTQsIDB4MDAyMDM5QTAsCisweDAwMUMzQjlDLCAweDAwMUMzNzA0LCAweDAwMUMzRDk4LCAweDAwMUMzQkI0LAorMHgwMDFDNTk2MCwgMHgwMDFDMzUwMCwgMHgwMDFDM0QzMCwgMHgwMDFDODk2MCwKKzB4MDAyMDM1OEMsIDB4MDAxQzNEMDAsIDB4MDAyMDE2MTAsIDB4MDAxMTc3MzAsCisweDAwMjAzOUE4LCAweDAwMUM1ODJDLCAweDIwMDBBMDAwLCAweDAwMDBBMDAwLAorMHgwMDExNzc4QywgMHgwMDExNzc5MiwgMHgwMDExNzc4OCwgMHgwMDIwMzk3QywKKzB4MDAyMDM1N0MsIDB4MDAyMDE1MzQsIDB4MDAxRTIxMzAsIDB4MDAyMDNEQTAsCisweDAwMjAxOEMwLCAweDJGOTYyRjg2LCAweDJGQjYyRkE2LCAweDJGRDYyRkM2LAorMHg0RjIyMkZFNiwgMHhEMTlCN0ZFQywgMHgyRjEyRTAwMCwgMHg2MTAzRDQ5QSwKKzB4MUY0MjgxRjIsIDB4REQ5QURBOTksIDB4RDY5QTY4MTMsIDB4RTAwMTQ4MDgsCisweDQ2MEJERTk5LCAweDM4RUM0ODAwLCAweDY1QTIxRjAzLCAweDM1MjA1MkExLAorMHhBMjNFOEIwMSwgMHg2MDUxMDAwOSwgMHg4ODAxQzkwMywgMHhBMjM4OEIwMSwKKzB4NTI1MzAwMDksIDB4MzJFMERFOTEsIDB4RDk5MThCMTAsIDB4NjRBMzQ5MEIsCisweDRCMEJEQjkwLCAweERFOTA2NDAzLCAweEQ3OTFENjkwLCAweEVDMDFENTkxLAorMHgyRTAyRTEwMCwgMHgyNzEwMjZDMCwgMHgyNTAyQUZERiwgMHhDODAxODU1MSwKKzB4QTE1NzhCMDEsIDB4NjI1MTAwMDksIDB4NDIwMDYyMkQsIDB4NUU1MzM2NkEsCisweDg1RTIyMjZELCAweEM5MDM2NDJDLCAweDg1RTM2NjAzLCAweDYwNTM2NTBELAorMHg0MDIxNDAyMSwgMHg0NTAwQzkzRiwgMHgzMjJBNjcwMywgMHg2MDUzMjUyRCwKKzB4QzkwMUQxN0YsIDB4NjAxMDZDMDMsIDB4ODgwMUQ5N0YsIDB4REI3RjhCMDUsCisweDIxMjBFMjAwLCAweENCMDE2MEIyLCAweEQxN0QyQjAyLCAweDg4MDE2MDExLAorMHg2NUEyOEIwQSwgMHg4RDA0MjQ0OCwgMHg5QjlFNjI1MSwgMHhBMDAzMjJCOSwKKzB4OTE5QjI1MjEsIDB4MjUyMTIyMUIsIDB4MzdCM0VCMTAsIDB4MjQ0ODg5NUUsCisweEQ0NzM4QjA3LCAweDIyMjg2MjQxLCAweDYwNjM4OTAzLCAweEEwNTc4MUY4LAorMHhENTcwNjQ3MywgMHg0NjA4NDYwOCwgMHg4NUUyNjI3MywgMHg0NjAwNkI1MCwKKzB4MzYyQzQyMDAsIDB4MkJCOEM5MTAsIDB4OEYxRjY0NjMsIDB4MjY2ODY2MDMsCisweEQyNjk4OTExLCAweDA2MkQ2MDQzLCAweDQxMTk2MTZELCAweDZCMEU2MDE5LAorMHg4MUY4MjBCRCwgMHg4ODAxNjBDMywgMHg2NDZDOEYyQywgMHg4ODBGNjA3MywKKzB4QTAyNzhCMUIsIDB4RDI2MTAwMDksIDB4MDUyRDYwNDMsIDB4NDExOTYxNUQsCisweDY3MEU2MDE5LCAweDY0NUMyMDdELCAweDgxRjhBMDFDLCAweDg5MEYyNjY4LAorMHg2MDQzRDI1QiwgMHg2QjVEMDUyRCwgMHg2MEI5NEIxOSwgMHgyMDFENjEwRSwKKzB4NjBDMzgxRjgsIDB4OEYwRDg4MDEsIDB4NjQ3MzY0NUMsIDB4RUMwMEEwMEEsCisweDYwNDNEMjU0LCAweDYyNUQwNTJELCAweDYwMjk0MjE5LCAweDIwN0Q2NzBFLAorMHg4MUY4NjQ1QywgMHg4ODAyODVGOCwgMHg4NUUxODkwQSwgMHg4RDA3QzgyMCwKKzB4RTZEQzYyMDMsIDB4NjAyMzIyNjksIDB4ODFFMUEwMDIsIDB4NjQ0Q0U0RkYsCisweDYyMTBEMTQ5LCAweDg5MDEyMjI4LCAweDY0NENFNEZGLCAweDY1NERFQkZGLAorMHgzNUIwNkJCQywgMHhEQjM2OEIyQiwgMHg2NEEzNEIwQiwgMHg0MTBCRDEzNSwKKzB4NTQwMzY0MDMsIDB4ODU0NDZFMDMsIDB4Qzk0OERCNDAsIDB4REM0MDg4MDgsCisweEJFQUM4QjAxLCAweDY0QjNFNTAyLCAweDY1RTM0QzBCLCAweERCM0RFQzAxLAorMHhEMTNEMkRDMiwgMHg2MjEyNjBCMiwgMHg3MjAxNzAwMSwgMHgyMTIyODgwNSwKKzB4MkIwMjhGMDgsIDB4NjY2Q0U2ODAsIDB4NjU2M0QyMzgsIDB4NzU0OUU3MDAsCisweDY0NzM0MjBCLCAweEEwMzBENDM2LCAweDdGRkYwMDA5LCAweDg1RTI4MDAwLAorMHgyMEI5RUJGQywgMHg2MTAzODFFMiwgMHg5NDJBODVFMywgMHg2MjAzMjA0OSwKKzB4NDUwODg1RjgsIDB4ODFFMjIwMUIsIDB4QzkwMTYwQzMsIDB4NDAwODQwMTgsCisweDQwMDg0MDA4LCAweDQwMDAyMjVCLCAweDYwMjMyMjBCLCAweDg1RTQ4MUUzLAorMHg0MTE4RTEwOCwgMHg4MUU0MjAxQiwgMHhFNDAyNjJBMiwgMHgyMEI5ODUyMSwKKzB4NjdBMjgxMjEsIDB4Q0IwMTYwNzEsIDB4ODVGODI3MDEsIDB4ODkwMzMwNDIsCisweEVDRTc4NUUyLCAweDgxRTIyMEM5LCAweDQ5MEJENDFFLCAweEEwM0IwMDA5LAorMHg3RTAzMDAwOSwgMHgwMDFDM0QzMCwgMHgwMDIwM0RBQywgMHgwMDIwMzU4QywKKzB4MDAxRTIxMkMsIDB4MDAyMDM0NzAsIDB4MDAxQzNEMDAsIDB4MDAxMTc3ODAsCisweDAwMjAxNEE2LCAweDAwMjAxNjcwLCAweDAwMTE3NzBDLCAweDAwMjAzOUE0LAorMHgwMDIwMzlBNSwgMHgwMDIwMzlBMCwgMHgwMDIwMThDMCwgMHgwMDFDMzZGOCwKKzB4MDAyMDNBMUEsIDB4MDAyMDNEQkMsIDB4MDAyMDNCQTAsIDB4MDAyMDNDMjAsCisweDAwMjAzQ0EwLCAweDAwMjAzRDIwLCAweDAwMjAzOTkwLCAweDAwMjAzNTg0LAorMHgwMDIwMTREMCwgMHgwMDIwM0ExQywgMHgwMDIwM0EyMCwgMHgwMDIwMjNGQywKKzB4MDAyMDNEQTQsIDB4MDAyMDNEQTgsIDB4NjAyMjYyRjIsIDB4NDAwOTQwMTksCisweEM5MEY0MDA5LCAweDhCMEI4ODBBLCAweDYwRTJERThDLCAweDQwMDk0MDE5LAorMHhDOTBGNDAwOSwgMHg4QjAzODgwOCwgMHhDQjAxNjBBMiwgMHgyODAyQTAwNiwKKzB4NjVFMkRFODcsIDB4MkU1Mjc1MDEsIDB4Mjg2MjY2QTIsIDB4NTJGMzY2RjIsCisweDI2MjJBRTgzLCAweEQyODM4NTUxLCAweERFODNDODAyLCAweEEwOTU4QjAxLAorMHg0MjBCMDAwOSwgMHg0RTBCNjRBMywgMHg1RTAzNjQwMywgMHg4NUU0NjUwMywKKzB4NDkxOEU5MDgsIDB4RDc3RDIwOUIsIDB4RTA0QzgxRTQsIDB4REM3QzBCN0UsCisweDdCMDFEOTdDLCAweDYxQzIwN0I2LCAweDcxMDE2NjkwLCAweDhEMDYyNjY4LAorMHhENDc5MkMxMiwgMHg0MjBCRDI3OSwgMHhBMDcwRUIwMSwgMHg2MjUxMkRCMiwKKzB4NEIxOEVCMEYsIDB4MjJCOUUxMDIsIDB4MzIxMDQxMTgsIDB4ODU1MThCMEYsCisweDIwMjlFMkZDLCAweDYwNTE4MTUxLCAweENCMDE3MkUwLCAweDg1RTEyNTAxLAorMHgyMDI5OTRBMywgMHg4NUU0ODFFMSwgMHhBMDUyMjA0OSwgMHg2NzUxODFFNCwKKzB4NDcxOTY3N0QsIDB4NjY3RTY3NzksIDB4NzcwMTI3NkQsIDB4NjkwMzYwN0MsCisweDg4MDE0OTE4LCAweDI1OTE4RjNFLCAweDZCMTJEMTYxLCAweDIxQjI3QjAxLAorMHg2NjBEODVFMywgMHg0MDIxNjA2MywgMHhDOTNGNDAyMSwgMHg2QzAzNDYwMCwKKzB4MjYyRDMyMkEsIDB4QzgwMTYwNjMsIDB4REI1RUQxNUQsIDB4OTY3RDg5MDEsCisweEU2MDAyQzZCLCAweDY2NkM2N0NELCAweDQwMDA2MDYzLCAweDYyMkQwMjFELAorMHg4RDBFMzI3MCwgMHg2MDQzNjQwMywgMHhFOUZGMDIxRCwgMHg4QjAxMzI5MCwKKzB4MDFDNUEwMDcsIDB4NjI2Qzc2MDEsIDB4MzI5MkU5MDQsIDB4NjQ2QzhCRUIsCisweDYwNDM0NDAwLCAweEQxNTAwNEJELCAweDBCNDU3NDAxLCAweDY2OUQ2OTExLAorMHg4OTA3MzY3MCwgMHg2MDJENjIxMSwgMHg4OTAzODhGRiwgMHhFMjAxREI0QiwKKzB4MkIyMDIxQzEsIDB4RUNGQzg1NTEsIDB4ODE1MTIwQzksIDB4Q0IwMTYwNTEsCisweERDNDcyNTAxLCAweDY0QTM0QzBCLCAweDUxRjM2NkYyLCAweDg1RUYyNjEyLAorMHg1NEYyRDI0NCwgMHg2NTBENDIwQiwgMHgwMDA5QURFNywgMHhFNTAwREM0MiwKKzB4NDIwQjJDNTIsIDB4NEUwQjY0QTMsIDB4NTQwMzY0MDMsIDB4ODU0NDZFMDMsCisweDY3MDNFOTA4LCAweDY1MDM0OTE4LCAweDI3OTk4NTQxLCAweERCMzIzNzkwLAorMHg4RjBCRDkzMiwgMHg2MDEzNjEwRCwgMHg4QjA3QzgyMCwgMHhDOTQ4NjA1MywKKzB4OEIwMzg4MDgsIDB4RTUwMUJENEIsIDB4MDAwOUEwMDUsIDB4MjEyOEQyMzMsCisweEJENDQ4OTAxLCAweDY0QjNFNTAwLCAweDQ5MEI2NUUzLCAweEFEQkNFQzAxLAorMHg4NUYyMkRDMiwgMHg3MDAxRUUwNCwgMHgzMUU3NjEwRCwgMHg4RDAyODFGMiwKKzB4QURBOTdBMDgsIDB4N0YxNDAwMDksIDB4NkVGNjRGMjYsIDB4NkNGNjZERjYsCisweDZBRjY2QkY2LCAweDAwMEI2OUY2LCAweEY3RkY2OEY2LCAweDJGRTY4MDAwLAorMHhEMjIzNEYyMiwgMHg2MEUzNkUyMiwgMHg4RDAyQzg0MCwgMHhCQkU1MjJFMiwKKzB4RTI0MDAwMDksIDB4MkUyODQyMTgsIDB4QkJGMDg5MDEsIDB4NjBFMzAwMDksCisweDg5MDVDODEwLCAweEQyMUNENDFCLCAweDAwMDk0MjBCLCAweDAwMDlCQkVGLAorMHhDODA1NjBFMywgMHhCRDZEODkwMSwgMHg2MEUzMDAwOSwgMHg4OTAyQzgwMiwKKzB4QUJFQzRGMjYsIDB4NEYyNjZFRjYsIDB4NkVGNjAwMEIsIDB4MDAxQzNEM0MsCisweDAwMTE3NzYwLCAweDAwMjAxNEE2LCAweDAwMjAxNjcwLCAweDAwMjAzNTFDLAorMHgwMDIwM0RDMCwgMHgwMDIwMzk5MCwgMHgwMDIwMzU4NCwgMHgwMDIwMTREMCwKKzB4MDAyMDM5RkMsIDB4MDAyMDNBMDQsIDB4MDAyMDM5RjgsIDB4MDAyMDM5RkEsCisweDAwMjAxNTM0LCAweDAwMjAxOEQwLCAweDAwMjAzQTFDLCAweDAwMDA4MDAwLAorMHgwMDFDMzUxMCwgMHgwMDIwM0RCNCwgMHgwMDIwMThDMCwgMHg4OTAxNEYyMiwKKzB4NjExQjYwMEIsIDB4NjExQkIwMEEsIDB4MDAwQjRGMjYsIDB4NjAwQjYwMEIsCisweDYxMUJBMDA0LCAweDhERjEyMTA3LCAweDhCRjg0MDExLCAweDYyMEQyRjI2LAorMHg4RjNFMzAyMCwgMHg0MDE4MDAxOSwgMHg4QjBCMzAxNiwgMHgzMTA0MzEwNCwKKzB4MzEwNDMxMDQsIDB4MzEwNDMxMDQsIDB4MzEwNDMxMDQsIDB4NDEyNDYyRjYsCisweDYwMUMwMDBCLCAweDQxMjk2MjE5LCAweDIwMDg0MDE4LCAweDMxMDQ4OTI2LAorMHgzMTA0MzEwNCwgMHgzMTA0MzEwNCwgMHgzMTA0MzEwNCwgMHgzMTA0MzEwNCwKKzB4MzEwNDMxMDQsIDB4MzEwNDMxMDQsIDB4MzEwNDMxMDQsIDB4NjExOTMxMDQsCisweDMyMDQyMjFELCAweDMyMDQzMjA0LCAweDMyMDQzMjA0LCAweDMyMDQzMjA0LAorMHgzMjA0MzIwNCwgMHgzMjA0MzIwNCwgMHgzMjA0MzIwNCwgMHgzMjA0MzIwNCwKKzB4MjEyRDMyMDQsIDB4NjAxOTYyRjYsIDB4NDAyNDAwMEIsIDB4MDAwQkUwMDAsCisweDYyMTM2MkY2LCAweDQxMjk0MjI4LCAweDMxMDQ0MjI0LCAweDMxMDQ0MjI0LAorMHgzMTA0NDIyNCwgMHgzMTA0NDIyNCwgMHgzMTA0NDIyNCwgMHgzMTA0NDIyNCwKKzB4MzEwNDQyMjQsIDB4MzEwNDQyMjQsIDB4MzEwNDQyMjQsIDB4MzEwNDQyMjQsCisweDMxMDQ0MjI0LCAweDMxMDQ0MjI0LCAweDMxMDQ0MjI0LCAweDMxMDQ0MjI0LAorMHgzMTA0NDIyNCwgMHgzMTA0NDIyNCwgMHg2MDJENDIyNCwgMHg2MkY2MDAwQiwKKzB4MDgwQTBDMEUsIDB4MDAwMjA0MDYsIDB4MUExQzFFMjAsIDB4MTIxNDE2MTgsCisweDJFMzAzMjM0LCAweDI2MjgyQTJDLCAweDNBM0MzRTQwLCAweDZDNjI1NjQ4LAorMHg0MTExMkYyNiwgMHhFMjIwOEYxOCwgMHg4OTBCMzEyMywgMHgzMjFDRDIwNCwKKzB4RDEwMjYyMjAsIDB4NDEyQjMxMkMsIDB4MDAwOTAwMDksIDB4MDAyMDM0OUEsCisweDAwMjAzNDUwLCAweDAwMEJFMDAwLCAweDQwMDA2MkY2LCAweDQwMDA0MDAwLAorMHg0MDAwNDAwMCwgMHg0MDAwNDAwMCwgMHg2MkY2MDAwQiwgMHg0MDAwNDAwMCwKKzB4NDAwMDQwMDAsIDB4NDAwMDQwMDAsIDB4NDAxODQwMDAsIDB4NjJGNjAwMEIsCisweDQwMDA0MDAwLCAweDQwMDA0MDAwLCAweDQwMDA0MDAwLCAweDQwMjg0MDAwLAorMHg2MkY2MDAwQiwgMHg0MDAwNDAwMCwgMHg0MDE4NDAwMCwgMHgwMDBCNDAyOCwKKzB4QzkwRjYyRjYsIDB4NDAwNTQwMDUsIDB4NDAwNTQwMDUsIDB4NjJGNjAwMEIsCisweDQwMDVDOTA3LCAweDQwMDU0MDA1LCAweDYyRjYwMDBCLCAweDQwMDVDOTAzLAorMHgwMDBCNDAwNSwgMHhDOTAxNjJGNiwgMHgwMDBCNDAwNSwgMHgwMDAwNjJGNiwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHg0MjcwNzM3MiwKKzB4M0QyMDY2NzUsIDB4NTU0RTIwM0QsIDB4MjAyQzRDNEMsIDB4NkU0OTY3N0EsCisweDRFNDk3Mjc0LCAweDZENzU0RTUxLCAweDAwMDAwMDNELCAweDYxNzY2RTQ5LAorMHgyMDY0Njk2QywgMHg3MjY1NzM3NSwgMHgyMDcyNkYyMCwgMHgyMDc5NjU2QiwKKzB4MDAyMTQ0NDksIDB4NkU2QjZFNTUsIDB4MjA2RTc3NkYsIDB4NkQ2RDZGNjMsCisweDNENjQ2RTYxLCAweDAwMDAwMDAwLCAweDIwM0EzMDUxLCAweDAwMDAwMDIwLAorMHgyMDNBMzE1MSwgMHgwMDAwMDAyMCwgMHgyMDNBMzI1MSwgMHgwMDAwMDAyMCwKKzB4MjAzQTMzNTEsIDB4MDAwMDAwMjAsIDB4MjAzQTM0NTEsIDB4MDAwMDAwMjAsCisweDJCNDM0NzQxLCAweDczNjk2RjRFLCAweDYxNDMyMDY1LCAweDcyNjI2OTZDLAorMHg2RjY5NzQ2MSwgMHg2MTY2MjA2RSwgMHg2RjIwNkM2OSwgMHg2OTc0MjA2RSwKKzB4MEQwQTY1NkQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwNzIsIDB4MDAyMDUyMjAsCisweDYyNzM1NTc2LCAweDc0NzM3MjVGLCAweDAwMDAwQTBELCAweDYyNzM1NTc2LAorMHg3Mzc1NzM1RiwgMHg2NDZFNjU3MCwgMHgwMDAwMEEwRCwgMHg2MjczNTU3NiwKKzB4NzM2NTcyNUYsIDB4MDAwQTBENkQsIDB4MDAwMDAwNDQsIDB4NDQzODc1NzAsCisweDcyNjM3MzY1LCAweDZGNzQ3MDY5LCAweDNENTg0NTcyLCAweDAwMDAwMDAwLAorMHgwMDAwMDA0NywgMHg3Mjc0NkU0OSwgMHg2RDY1MjA1MSwgMHgyQzc5NzQ3MCwKKzB4NDk2NzdBMjAsIDB4NDk3Mjc0NkUsIDB4NzU0RTUxNEUsIDB4MDAwMDNENkQsCisweDY1NEM3MjQ1LCAweDAwMDAwMDZFLCAweDIwNzQ2RjRFLCAweDc1NkY2RTY1LAorMHg0OTIwNjg2NywgMHg0MjIwNTE0RSwgMHgwQTBENjY3NSwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwRkYsIDB4MDAwMjAwMDEsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDEwRTAxMEQsIDB4MDAwMjAwMDMsIDB4MDEwOTAxMDgsIDB4MDAwMjAxMEEsCisweDAyMDAwMDAzLCAweDAyMDIwMjAxLCAweDAyMDQwMjAzLCAweDAyMDYwMjA1LAorMHgwMjAyMDIwMCwgMHgwMjA0MDIwMywgMHgwMjBDMDIwQiwgMHgwMjBFMDIwRCwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMDAwMDBGRiwgMHgwMDAyMDAwMSwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMTBFMDEwRCwgMHgwMDAyMDAwMywgMHgwMTA5MDEwOCwgMHgwMDAyMDEwQSwKKzB4MDAwMzAwMDMsIDB4MDIwMjAyMDEsIDB4MDIwNDAyMDMsIDB4MDIwNjAyMDUsCisweDAyMDIwMjAwLCAweDAyMDQwMjAzLCAweDAyMEMwMjBCLCAweDAyMEUwMjBELAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAxMEUwMTBELCAweDAwRkYwMTBGLCAweDAxMDkwMTA4LCAweDAxMEIwMTBBLAorMHgwMjAwMDEwRiwgMHgwMjAyMDIwMSwgMHgwMjA0MDIwMywgMHgwMjA2MDIwNSwKKzB4MDIwMjAyMDAsIDB4MDIwNDAyMDMsIDB4MDIwQzAyMEIsIDB4MDIwRTAyMEQsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDEwRTAxMEQsIDB4MDBGRjAxMEYsIDB4MDEwOTAxMDgsIDB4MDEwQjAxMEEsCisweDAxMEYwMTBGLCAweDAyMDIwMjAxLCAweDAyMDQwMjAzLCAweDAyMDYwMjA1LAorMHgwMjAyMDIwMCwgMHgwMjA0MDIwMywgMHgwMjBDMDIwQiwgMHgwMjBFMDIwRCwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMDIwNTIyMCwgMHgwMDAwMDA0NiwgMHgwMDAwMDA1OSwgMHg3MzIwNDE0MiwKKzB4MDAzRDcxNjUsIDB4NDk1NDQxMjAsIDB4MDAwMDIwNEQsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMkUwMjA5LCAweDgwMDAwMTAxLCAweDAwMDQwOUZBLAorMHgwMEZGMDQwMCwgMHgwNTA3MDAwMCwgMHgwMjAwMDIwMSwgMHg4MjA1MDcwMCwKKzB4MDAwMjAwMDIsIDB4MDM4MzA1MDcsIDB4MDcwMTAwNDAsIDB4NDAwMzA0MDUsCisweDAyMDkwMTAwLCAweDAxMDEwMDJFLCAweDA5RkE4MDAwLCAweDA0MDAwMDA0LAorMHgwMDAwMDBGRiwgMHgwMjAxMDUwNywgMHgwNzAwMDA0MCwgMHg0MDAyODIwNSwKKzB4MDUwNzAwMDAsIDB4MDA0MDAzODMsIDB4MDQwNTA3MDEsIDB4MDAwMDQwMDIsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDA3MDkwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCB9OworCitjb25zdCB1MzJfdCB6Y1AyRndJbWFnZVNpemU9MTU5NjQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb3R1cy9oYWwvaHBmd2J1LmMgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy9oYWwvaHBmd2J1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjYwZjU3ZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL2hhbC9ocGZ3YnUuYwpAQCAtMCwwICsxLDUyNjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBBdGhlcm9zIENvbW11bmljYXRpb25zIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworI2luY2x1ZGUgIi4uLzgwMjExY29yZS9jcHJlY29tcC5oIgorCitjb25zdCB1MzJfdCB6Y0Z3QnVmSW1hZ2VbXSA9IHsKKzB4M0E0QkNGMTgsIDB4RjQ0QzA3NkUsIDB4RjU5NDUyRUEsIDB4NDUxQkE3NTUsCisweDE0MEFDODdBLCAweEMwN0VFOTQyLCAweDNFRjk3OEFCLCAweEY1QjAzREM2LAorMHhCNzAwODBGMCwgMHhBODkwNjRFQSwgMHg1NEUyQzFENiwgMHhFQjA0N0RGNCwKKzB4MTc5ODM5MEMsIDB4MDAzNTA2MjQsIDB4MzVCM0VDRjAsIDB4NTlGMkZBQkYsCisweEFGOUQyNDhFLCAweEY5QkRCOUYwLCAweEQwNUM4QjQ3LCAweEMwOEI1QTE2LAorMHg5OTAwOTNDNywgMHhEMzM1QTE2MCwgMHgxQzA0OTQyQywgMHhCRjZFN0E4OCwKKzB4RkQyMzJCMEYsIDB4NUMyMjQzODcsIDB4QkYxRTE1NkMsIDB4RjI0RjJBMjcsCisweEZGNTY0MjFELCAweEIyMTMwMzdDLCAweDJCQTY3QkEwLCAweDQ5NTBDRjhBLAorMHgwNUYwMEYyNSwgMHhBNUU4MjA4NSwgMHg3NDE2OEEwQywgMHgyRjJBQjMwQiwKKzB4QzgwQzU3RUUsIDB4QjZCREY1NzAsIDB4ODlCQzVBOTksIDB4N0YzQjVBNjcsCisweEY2Qzk0M0I4LCAweDBDOUM5MjAxLCAweEU4MzgzNzQ3LCAweDBDOUE3MkQ2LAorMHhFMDUyMDcwNCwgMHhBNjZEN0YzMCwgMHhFNDQ0QTQzNCwgMHhFMEM5NEFCNywKKzB4OERENzc1MUMsIDB4MUE2NTk0NjQsIDB4NkM5QUJBNEYsIDB4NzkyRjJEMkQsCisweDU5MzZGNjZCLCAweDA2MUU1ODBFLCAweDU5OTAzRjZDLCAweDFGQkZCOEEwLAorMHhDQzgyMkVGRSwgMHg0QjAzMENBRiwgMHhCNjI0NTdDOSwgMHgyN0U5QkYxNSwKKzB4QjExM0E0ODcsIDB4RkEwRkM5MTUsIDB4NDQ3QjE4NEEsIDB4NTMzMENENTEsCisweDAwQkNDNjIyLCAweEYzMERFMTQ5LCAweEZGNzE4RTFDLCAweDdCNUQyODYxLAorMHhEQkNBNTczRSwgMHhGQjBEN0JGOSwgMHhFMUNGQkFBQywgMHhGOTlENDU4MywKKzB4NEJBNzQ5OEEsIDB4N0NBRUE3RUIsIDB4QkE5NThFMzIsIDB4MzZDNTMwRkYsCisweDhGODhDQTk5LCAweEY5M0NBQkMyLCAweDhFNDdFRjExLCAweEZCMEVFRDZGLAorMHg1QjM2NjhBMSwgMHg5RDYzQURERSwgMHhBMEVFQUI4QywgMHgwODQ5MTVGMSwKKzB4RkFDQUFBMjcsIDB4MjA5NjM4RkUsIDB4MUNFRDlFRkYsIDB4RUVCRDIzMzUsCisweDM4QzZGNDI0LCAweDJEMUYzRDdFLCAweDk3NkU4MTA2LCAweEJFMDg3QUQyLAorMHgzMjE5NDg0NSwgMHg3NTYwNjZEQiwgMHhDNzBFMzE2NSwgMHhDNTY4RENCMSwKKzB4MzIxMkU0RTEsIDB4QjVEOTkxQUQsIDB4MDdDM0NFRjgsIDB4REI0QUJCMzgsCisweDE1NzRDMjMyLCAweEY4Qzc5MkJDLCAweDE0RTYyREJFLCAweDVBNDhFN0RDLAorMHhFRkRDNTQwNywgMHhDNDVCNDAxNywgMHgzQjgxNEU4OSwgMHhGMDkzNjQ2NiwKKzB4ODk0OTFCMkIsIDB4OUEzNTlBNDEsIDB4ODIyODc2NzUsIDB4QTBGMzM4RDMsCisweDUyM0ZERDNDLCAweDRFNDBCNzk1LCAweDQ1OEFEQUE0LCAweEVEODEyOTU3LAorMHg3QURDNzNCQywgMHg2RkQ3REI3OCwgMHgyNzQwRkMwNCwgMHg2MzkyQUVBMywKKzB4MTg1QUJDRUEsIDB4NkI1MEFCQzMsIDB4MzY4MUYwN0YsIDB4Qzg0MEY4Q0UsCisweDU3MzNFN0VDLCAweDA4MDVGQTcxLCAweDBCMzQ1MzBBLCAweDhDQjNEMDMzLAorMHg4MTQ1MTU1MSwgMHg1M0IwQjRFQywgMHg5MDg2NDZEMCwgMHgxMEEzRTY0MiwKKzB4RjM1OERDMzQsIDB4QzFGQTU3MEMsIDB4MkIxMjg0QjAsIDB4NTkyMzIyQkIsCisweDlENTg3NzgzLCAweEU3RDc3OTg4LCAweEUxQkU1RDdCLCAweDQ0QjkzRTIzLAorMHhGOEJFOTRBMiwgMHg1MDZEQzcyMywgMHg2RTBBN0QwOSwgMHgzRkIxMDQ2RiwKKzB4REIzQTE2NkYsIDB4OUNCN0Q2QTAsIDB4RTI3OERFNkQsIDB4ODg0NTkzMzQsCisweEI1MkJBM0M5LCAweDI4NDc0MEEyLCAweDA0RDMwNzkyLCAweDk0NEQ3OUNBLAorMHgxRDA1MEVBOSwgMHhBNDA0REIxQiwgMHg5OTUyNjAyMywgMHhCQUNFMjRFNywKKzB4QjlGMjA3MDQsIDB4Mjg0RTY0MzIsIDB4NDdBNTkzRDEsIDB4OTVGOERGQ0IsCisweDIyMEM5MTY3LCAweDhGQUFCQkJDLCAweDkzRDM0RThDLCAweENFMDc3MTM4LAorMHg0RkMxODA4MSwgMHhFNzZERDdFNSwgMHg2NzQ2NUY2QywgMHg3QTQ3OUQ3NywKKzB4NzRENjFGODIsIDB4MDA1NTkyMTQsIDB4MkY2NkU0MkUsIDB4ODc0MkE5NkIsCisweDYyMDYzOTUwLCAweEEyREJGQUU1LCAweDM2OEI5NjZGLCAweEFCNUZDQ0UxLAorMHhDQjQwMjNCMSwgMHgxRTdBRjU0MiwgMHgwNTk1M0UzMCwgMHg4Q0E1MUNGQywKKzB4MjIxNjU0N0QsIDB4MjlENTYyRDQsIDB4RTlDOUY4RUUsIDB4QTkwNTA1QzksCisweDA4OEQwRUVCLCAweEQ3QTI5MEZBLCAweDk1RTVCNTY3LCAweDUzRkFEM0MwLAorMHhCODlGQzYyNSwgMHg2OUE3NTE5QiwgMHgzNjg3QzdFRiwgMHg3MTg4Q0I1NSwKKzB4Q0U1REI5N0UsIDB4QTI2MDU3NEEsIDB4RDQ1M0QxNzMsIDB4MTQ1RDk3MEIsCisweDEyMTEyQ0M2LCAweDM5OTgzOUUwLCAweDI5QzU1QkVCLCAweEU0NjdDNzFGLAorMHgxMEIzQzlENCwgMHg4RjFDOTY2MiwgMHhGMjA3QTgyNiwgMHhFMDI0NTYwMCwKKzB4Njg4QjE4MTIsIDB4NUE0ODMwMzEsIDB4NzA0ODM4MEEsIDB4NzhFM0Q1QkIsCisweDE5NTE1MzNELCAweDhGQTVEOEUzLCAweEM1QkU1MDBELCAweDcxREI1QjJCLAorMHhBMTdBQTAwMCwgMHg0MDhDOUJFOCwgMHgxNjFFMTJGNSwgMHhCMUMzOEM0NSwKKzB4MjJBODhGMDUsIDB4REUzRjQ0MDUsIDB4NTA3OEFEQkIsIDB4Q0UxQkYxQTYsCisweEI3QTc1QjA0LCAweDZCODM2NEU4LCAweDBDRTMyRTNFLCAweDlCRjY1NTA0LAorMHgyOEMxODE1NywgMHg3ODM1OUFDNiwgMHg2MTdCRjIwMiwgMHgxRTc2RkEwOSwKKzB4MEY4RTYxQTgsIDB4NkQwMkYwRDUsIDB4ODAzNTY0NTksIDB4NzlDRUZBRTcsCisweDdEMDBGMTU1LCAweDVDMUMwMTI4LCAweEM3NUNBMDczLCAweDMyODE2MDkwLAorMHg5RkY3OERGQywgMHg4NDhEMjY5QywgMHhGODExQjMxNCwgMHhBODY5MjBGQywKKzB4NkY4ODVEMDEsIDB4QUNGRTY1MjUsIDB4QzcyNjA3NEQsIDB4RkVENjg1OTksCisweEYxRDVDNzZBLCAweDg3OTlFNUY1LCAweEY4NUY1MTcxLCAweEQ4REUyRDNCLAorMHhFN0REOEU3NSwgMHg0M0Y4NjE0QSwgMHgwNjg0RkM4RCwgMHg5NjgzQjhDOCwKKzB4NzRCRTc4NkIsIDB4MjUxNDc2MkQsIDB4N0Q4NjY2ODIsIDB4RTcxMUZFMUYsCisweDBERTlFMjczLCAweDEyRjUzMTY3LCAweDRGQTNBN0ZFLCAweDJBMDBFQjYxLAorMHhCMzk4NEEyOCwgMHg0MzE5RjJCMCwgMHg0MkJBMENBMiwgMHg4NDg3NzFCNiwKKzB4OTk1RTk0NUUsIDB4RDQxMTE1RjUsIDB4NDNEOTgzNEIsIDB4NTRFRURDMzYsCisweDVDM0M1NDA3LCAweDY3MUI1NDBFLCAweERDRjE4OTQ4LCAweDE1MEVEOTczLAorMHgyRDQ5MjJERSwgMHhGOTNDQTE3RCwgMHhCMjRBNzZFNSwgMHhEMUMwMUMyMiwKKzB4RjI5NjNERDYsIDB4M0I4NjAwNjYsIDB4MDhFRjBFQTQsIDB4NjA5QjYwQ0MsCisweEUyRTkwMUZBLCAweDI1QkU5QjkzLCAweERGOTZEOUJDLCAweDg2RDQxNURGLAorMHg3NUNDRjZCQiwgMHg4ODJENTRCMiwgMHg3OTc2RTlBRiwgMHg4OEEwQjE3OCwKKzB4NUFERTVBNTUsIDB4OEE4QzAxMTIsIDB4RDg5Njc1NUEsIDB4Q0I2Nzg5QjMsCisweDhCNjNBRTJGLCAweDI1NDUwMzZDLCAweEU0NjU1Qjk0LCAweDIwOTU5OTc3LAorMHgyOURGQjREMSwgMHhDREFBRUJGNCwgMHgxQzA3RUMwNSwgMHg1QTZGNjA3RCwKKzB4ODhBOUIzMUQsIDB4MTE4Qzc0RDIsIDB4MDAwQkIwNjUsIDB4NzVDNDY3MTIsCisweEVGMUE1OEJELCAweDUwRUNBMjYyLCAweENDRTM5M0I5LCAweDZFREI5MkU4LAorMHg3MDBFRjUxNywgMHhCRjZDRjRBRCwgMHg1NzQ1NkRDMCwgMHhGNjI5NTE3QywKKzB4NDAzMzFGOEIsIDB4QzEwQTQ1NEQsIDB4NkNDQjAyQ0YsIDB4OUJGMTFCMUMsCisweEUwODcxNDM3LCAweDIzNjIzNTg1LCAweEY1MTlGMDlDLCAweDREQjJBRkM4LAorMHg4OEZDQkQ3QiwgMHhCNTEyRkU4RCwgMHhERTQ0NTg5NCwgMHgwNzhBRDAzQywKKzB4NDQzNzVGQjAsIDB4MEJBQkVEQjEsIDB4NDBENUU4RTEsIDB4MTNGMjBBODYsCisweEYxNDA2MzAzLCAweDcyMDVDMzIyLCAweDNGQzQzNzc5LCAweDdBNjBENTEwLAorMHgxNDQ2OUUwNCwgMHhGNEU3Nzg3MywgMHgyRUFEN0VDRSwgMHhBMTM1RDZFQSwKKzB4M0Y0QzRCMzAsIDB4MjE0ODgwNzcsIDB4NjlGNjRGMUMsIDB4RUVGNDg3NkUsCisweDYzNjEwQzBCLCAweEI3QjI0QzVDLCAweDMyNEE3NkZFLCAweDBDRjY1MUQzLAorMHg5NDYwRjBCMSwgMHg4MUE4MzIzMCwgMHgwODM5Q0ZGOSwgMHg3MDcyMkYwNCwKKzB4QzI3OEZCM0IsIDB4NUREMUJEQTQsIDB4MUU0QjNEQkEsIDB4QUUxNjFBOTMsCisweDlFMTAzM0MzLCAweEQ5MzhGQ0VDLCAweERBMkIyRjkzLCAweDI4Q0Q4MkVBLAorMHgxNEFEMUZBRiwgMHhFNEVDOUNCOCwgMHhFNzcwQUZERiwgMHhFRkIxMjg5OCwKKzB4NTAwQkUxODEsIDB4NjAyNjI1QzUsIDB4RjE2MDYzMUIsIDB4NzhEMzY0M0YsCisweDRFMTNFRDM3LCAweDY0N0JCMjIzLCAweENGMThENzVDLCAweEY0NzdGOTRDLAorMHg3ODZFQ0I4OSwgMHhCM0VEMjFGOCwgMHgxQkVGMzkxNiwgMHgyNDBGQjM1QSwKKzB4NUM2OUI3RDksIDB4OEU5NjI5MEEsIDB4RDQwREM5OEMsIDB4RDEzNzAyOTEsCisweDU4NzAwMjFFLCAweDNGN0NGMjNGLCAweEZENEE2QURBLCAweDM2NDgyNDU3LAorMHg5MjY2MDBBRiwgMHhEQzg2MThCQywgMHg2N0QzNzc5RiwgMHgzNDIyODMwQywKKzB4ODdBNDFGQkEsIDB4Q0EwQUZGNTMsIDB4NjNCQzQ1RjMsIDB4NTIwQkJCQUUsCisweEVERTJFMDMxLCAweEI2RkE5NDUwLCAweDI1OENBNzEyLCAweEQ3MDlDNEU0LAorMHg2MTc3MDlCMiwgMHhBQUNFMEI0MSwgMHgzNjNEQkY1NSwgMHg3MDFENjU4MywKKzB4MzlGM0M4ODUsIDB4N0NENjI5N0IsIDB4MDc4RkUxM0IsIDB4QTM5OERBQkYsCisweERCOTdDNTE0LCAweDAzOTEwMkUzLCAweDVDQTU0NUFGLCAweDkyOThCQTE4LAorMHhEMThEQUY4NiwgMHgzRDcwRUVBMiwgMHg1MjY2QUQ2OCwgMHhCMDQ5NDVCNSwKKzB4NDAyRERBNUIsIDB4MDFEQzZDRDEsIDB4OTNBQzUwNTMsIDB4MDhERjlFQTksCisweDQ4NUVCRTk3LCAweEE1RDA1ODUzLCAweDZDQkVFOTEwLCAweEQ0ODVGNEUyLAorMHg4RjIwMUQwNywgMHhFRkMzODRBMywgMHg3MjcyQUZCRSwgMHhDMEI0MUZENywKKzB4OEU1NEE5NzEsIDB4QTdGOUUwRjcsIDB4QzIxNzAwQjQsIDB4QzI0QTRFRDAsCisweDU0MTlFQUNGLCAweEJDMkQ4RkIxLCAweDJDNUI1QUZGLCAweDAzNDUyNzRDLAorMHhDNDFERjQ3QSwgMHgzNzY1OEFGRiwgMHgyNENGM0JFNywgMHhBMzA4NjI0OCwKKzB4RjgyQjU5MjgsIDB4QjQ5QTlCMDQsIDB4RDQxMDVBRUYsIDB4NDQ0RUJFOEQsCisweDM0ODM2OERGLCAweERDNzdBN0EwLCAweDY4RDM3RTBELCAweEQyRUI1NEVFLAorMHhEREFDOEMzMywgMHhFNUM5M0M3OSwgMHhFNDcwNkFCRiwgMHgxNzUzNkVGRCwKKzB4NkMyQjJCMTYsIDB4MDM4QUE4MDYsIDB4REFENDI0NTgsIDB4QUUxRDc2QTEsCisweENDOERFOTVDLCAweDFCQTIwNjQ3LCAweDA1MjEwNjhDLCAweDMwNkZCRTQ0LAorMHg0RTI5RDg4MSwgMHhEMkExNEQ1MywgMHhBMTU1ODUzRSwgMHg0NDUwMENDNCwKKzB4RkM0NDY2QjcsIDB4NUFBQ0Q1MUQsIDB4NTA2RDNBNzMsIDB4M0Y2MUUwRkUsCisweDU4RjExRjlELCAweEM5MkEyQ0FELCAweEQ5QTRGODZCLCAweDFGQTc0N0IxLAorMHg3N0RFQzVEMiwgMHhERkFCMzY5QSwgMHhENDcxRUEwMSwgMHg3MjQ1MDJEQSwKKzB4NjE4Q0UyMUEsIDB4NTIzODhCRUIsIDB4MkU4QTRDQzUsIDB4NTgzMzIyMTEsCisweDNGQ0M0NkUxLCAweDUwMTIxMEUyLCAweEU5RDUxRDFBLCAweDM3MjM3QjU1LAorMHg4Q0UzRTJGMSwgMHg2QjJFOThDQywgMHhCNTZBMTFFNSwgMHg4ODE5MDM2QiwKKzB4QTZBQTJGMjcsIDB4QjAxMjRBMEUsIDB4OTJGMTczNjQsIDB4RDRBODkyMzgsCisweDA1MDdFMzM3LCAweDhFRDk1REVDLCAweDlDMDE0QkE4LCAweEJBNUIxMUM2LAorMHg5QzE1RDM4QywgMHg1MjU5NkM5OCwgMHg5MzMwREQzRCwgMHhENjE0NzU3MCwKKzB4MjE3MDFGMUIsIDB4NUEyMzg1RjEsIDB4RTJGMzhDNkMsIDB4QjNFOTQ2OTgsCisweDJGOUM2M0ZBLCAweDdFMDIzNEQ4LCAweDRDREQzMjg4LCAweEUxOTY5QjVGLAorMHg4NTNCM0MxRCwgMHhGNjE0NjVBNywgMHhGMjgxQzQxOSwgMHg0NkM1RjA3MiwKKzB4OUYxNzIyREQsIDB4NjRGMkE5OTQsIDB4ODZBRUU4QTgsIDB4NTU4OTVFMTcsCisweDYwNDdEMUFDLCAweDMzNzVBOTM0LCAweDMzNkJFQUNBLCAweDkwNzkxMTc0LAorMHg0REFDQzREMiwgMHgyNDI1Mzg2MCwgMHgyQTc4NzZGQiwgMHg5REJERjk4RCwKKzB4RDVCQ0UxODIsIDB4NjdFQjVGNzAsIDB4Q0MwNkJBMzgsIDB4RThGNzg3MTUsCisweEZFQjBFQjQ0LCAweEU5Nzc2RTAzLCAweDg5MkEwODk4LCAweDdBMDcwNjUwLAorMHg2RDA0RERDNCwgMHg5OUE1QjdFQSwgMHgzQjQxNkJCNiwgMHhEQURDRTgzNCwKKzB4QjNCMDMyNzgsIDB4REI3M0I3MEUsIDB4QjBGMDIyNEUsIDB4NTM4QTRBRjksCisweEQyNUQ2QTM3LCAweDhGNjI3RkIwLCAweDExRUQ5Mzg3LCAweEI4Qzg4NDU3LAorMHgwQ0YzMjBDQSwgMHhBMjBFNjJBMiwgMHgxREFDREQ0QSwgMHhBQjg0NTc1RCwKKzB4NzQwREFGNzUsIDB4QUI5REI5NTUsIDB4RkY3ODczMTQsIDB4QTY4MEI4RTMsCisweEM5NzZEMzhFLCAweDFGRDM4RjRELCAweDBBRUI2NjMzLCAweEI2OUEwM0RGLAorMHhCNkNBODYxMCwgMHgxMDYzNTRDMiwgMHhDMzdENDhDOCwgMHgzRTVFRUQ1NCwKKzB4NTM0Q0M5QkEsIDB4RTM3REZGQUQsIDB4OUY2OUVCMDUsIDB4RjY3MjE3RUUsCisweDUwMTgwQjNELCAweENDNjFDMTI3LCAweEMzNTk4RDczLCAweEU1QzAwRjAxLAorMHhGRkU5QjExMSwgMHg1RTIzRUEyRiwgMHhGNkM0NURDRSwgMHg0NDU4NUUzOSwKKzB4QjAyQzYwMDQsIDB4MzcyMzM5MDIsIDB4NEYzNzRDMEQsIDB4MzQyODg4OTgsCisweEUyNzQ5MzdELCAweEM4MUQ0NzJDLCAweDE3QTQzMTUxLCAweDI2MzhGN0QzLAorMHg1MzA0RTVCNSwgMHhENUNFNUVERSwgMHgzNTdGQTdCMywgMHhGQkUyNzk4NiwKKzB4NjRFNjVEMUYsIDB4QzI4RDEyMzcsIDB4QTczRDlBQjMsIDB4MTI0Q0E2QzgsCisweDc3MEQ3NDE1LCAweDU3ODhDMzJDLCAweDE4REVGQzAwLCAweEIzQjJCMDZBLAorMHg1NUNDODZBMCwgMHg4RDkyOTMwOSwgMHg4NEFCMzgxQSwgMHg5REVGRThERCwKKzB4MjZDNzQyQzgsIDB4OTUyQkFDMzQsIDB4MEEzQjE0MEYsIDB4ODJBOTMwNEIsCisweDUyQ0VDOUY0LCAweDQ3REY0RDA4LCAweDE1QTExNkQ4LCAweDdCODkwQjE4LAorMHhDODdCRUYxQSwgMHhCNTk2MDFCNiwgMHhEMzdCRkIyOCwgMHg1RDlGNTY0RCwKKzB4RkIwMDJGOEQsIDB4RTc2MDJFNTcsIDB4RTQyOUM4NTIsIDB4OUMwQThDNzUsCisweEUwMjYxMURDLCAweDhBMUM5ODYxLCAweDc0OTVENkRFLCAweENBMDU5NzEwLAorMHhBRTU5NjlCOCwgMHhFNUIyQ0JEQywgMHhBNDlGNkVDMSwgMHg4NUQyQTU1MywKKzB4RTQ3MTlCMEYsIDB4NDBGNjhCQkMsIDB4MDkyRTI0QjUsIDB4N0IxMzI2NzgsCisweEQ3MEMxN0UxLCAweDMwOUU2QUExLCAweEUwMDk2NTdGLCAweEE3MjM4QzdBLAorMHhFMDU3NUQ3OCwgMHgxRDY5ODBFNywgMHhFRkNERDM2OCwgMHgxOUYwOEQ5MywKKzB4RkFDMDNCODUsIDB4NTFCQURBOEYsIDB4MDM3REY4MzksIDB4OEY0RDI5RjQsCisweDFEQzhBOTEzLCAweDUwQzU1NDAyLCAweERFRTU3OEYwLCAweDJCQTFDMDkxLAorMHg5QUNBNTY3RSwgMHhBOEZGRUNGQSwgMHhBM0MwNUQxMiwgMHhGMThDNjI4MywKKzB4RUFBRTY2NjIsIDB4QjREQzZBNzksIDB4Q0VDNUU3ODIsIDB4OTNBMkUzODQsCisweDhGOEE1RTZGLCAweENBODM3OUQ1LCAweDgxQkNENDlFLCAweDVGQ0UxNzRCLAorMHhEMTU0M0E1QiwgMHg4NDVENjM1RiwgMHhENTMxMjVCOSwgMHgzQjIxMjFBRSwKKzB4RjhFQ0REMDEsIDB4Rjg0RDJEMTEsIDB4NjU3OUJDMjEsIDB4NUMyREMyMjAsCisweDlFQzFBNjg4LCAweDExNDhEODMxLCAweDZDMDg3Nzk5LCAweDU4OTQ0MzU3LAorMHg1NkY3OUZDNiwgMHg2QjY4OUI1NSwgMHg3NDBCNUZEMSwgMHg5RjdCRkI1RiwKKzB4NkIyRjNFMkQsIDB4MTBFMDkyNzMsIDB4MkU5RTMyMTMsIDB4RjM0MzZBQTAsCisweDE0QTlGNjgxLCAweDkwODdEM0NFLCAweDY4RDA0MzBCLCAweDlGQUZFM0VGLAorMHhENDVCOEM2MSwgMHhCOTgyNzI0QSwgMHgwNDQ0OEQ3RiwgMHg4NzEyRTQ3QSwKKzB4MkMxODhEMTUsIDB4OUMzRjA2Q0MsIDB4NjM0M0IxMzAsIDB4NTZDNjc2NUMsCisweEY2NTdCQzlBLCAweDE1RjFFOTczLCAweDQ3RTcxMTgxLCAweDg2MzlGNUQ3LAorMHhDMUYzRkRENSwgMHhEQzUyMjQ0MSwgMHg1NkJCMjkwOCwgMHhBQTQ4QUVDNiwKKzB4RUMwNDA4N0EsIDB4OEQzNzU4NzUsIDB4RTI5NDFGODgsIDB4RUQzMUNDNzIsCisweDA5QkQ4Nzk0LCAweDRDODFENUMxLCAweDFDQzk2RDlDLCAweDk4QTg5MDIyLAorMHhBQTM2MkM1NywgMHg5MjRENTgzRCwgMHgyNzA0MzBFNiwgMHgwRkQ0MDQwQSwKKzB4QUY1NjExNTUsIDB4MzhEQ0QxQ0YsIDB4RTg2MUQyQUMsIDB4MjRBMkVGM0MsCisweDJCN0UzODY4LCAweDEzREE2QzEyLCAweDY5MjAyRUI2LCAweDRBNUZFQzY2LAorMHgxODU0MTdBOSwgMHgzQzkyRUZGNCwgMHg5NDk4NDJFNiwgMHgwMjExNUQ5MywKKzB4QUQxNzI2RkYsIDB4NEUwOTNEN0QsIDB4QzNFNDFCOUMsIDB4MjdCQkMxQzEsCisweDRGRkE0OUM3LCAweDZDNjNEMjRDLCAweDg0MjU1NDQ0LCAweDI4MkMzQkEyLAorMHgzRDY3OUQ4NiwgMHgwM0I0MTBCMSwgMHg2NERCNDU0QywgMHg1MzU0OTlENCwKKzB4MjVCNDIxQTEsIDB4N0U2OEM4RkUsIDB4MDQ3N0UzQjksIDB4Q0VGQjA4N0QsCisweDlFNTlCODlDLCAweEJCNzg3NTU5LCAweDFBNTUwRUU0LCAweDA3OEI0OEFCLAorMHg3M0E4NjVGRSwgMHhENzIyNzQ3MSwgMHgzQTg2NDA0OSwgMHhFNUVFM0ExRCwKKzB4MjAxQkMxOUQsIDB4RUI4REFFMkMsIDB4MEUyQUIzMUQsIDB4Q0RBQzJENzksCisweERBQUIwOEIxLCAweDYzRUNENEYyLCAweEMwMEY5NzE2LCAweEQ0MTVDNkJCLAorMHg4QzIwQzM5RiwgMHhERUQ4RjVBMiwgMHgxRDZBNDE5MCwgMHgzRDMxOTE2NywKKzB4NTZCM0EyNkIsIDB4MDU0N0JGNTIsIDB4QTA1NjkyNEYsIDB4NERBQTUzOUEsCisweDU1NzI0MUQxLCAweDQyQzkxMjRFLCAweDE4NzIzMzIzLCAweDZBRDZFN0VDLAorMHg4RTAzOTMzNywgMHhGNkZEREQ2NSwgMHg1RjM1MjVGOSwgMHhDMEFEOTcwNCwKKzB4ODEwRUYwNDksIDB4Q0UwMjJFRTAsIDB4NDFDRTdFNTIsIDB4OEUxNzJBNDQsCisweDY0ODgwOEUyLCAweEM3RkY2ODk2LCAweDJBRDA5ODVDLCAweDMwNEI5NjMxLAorMHhEMjFFQTM5QiwgMHgyNzlGNTA4OSwgMHhDREI1QzM5MCwgMHgyMTcxNkE0MCwKKzB4NUUzNEIyNzgsIDB4Mzk0NzVENzIsIDB4QkE0RjREQjEsIDB4OEIyNTgxOEYsCisweEU2RTQ2NkY0LCAweEM0QTA5REY4LCAweDU5RjE4QUM3LCAweDg4N0FCNUZFLAorMHhFRUE0QkE0MiwgMHgxNzM3MURBOCwgMHhBODIxOTNEMSwgMHg2REMzMEVGNywKKzB4REVCOUQzNDksIDB4MkIzMjcxRDQsIDB4MUZFODM4MzYsIDB4RUM3NTVBMjksCisweDA1RjA3RkNELCAweEMzMzFEM0FFLCAweEM2MjA4Qjc2LCAweDQ5N0ZGMjgwLAorMHg0QzU3OUM1QSwgMHgyMkI3MUY5NCwgMHgzMEZENjIwQiwgMHgzMUI3MUFFMywKKzB4REY3RDFBNDEsIDB4RjA0MUFDQTUsIDB4OTUzMzI2MUIsIDB4MzI2MkQyOTEsCisweDA2MEU5NjcyLCAweDdEMTkxQTU1LCAweDZEMEYwOTQ1LCAweEY4Qzc3NzdDLAorMHgxQzE3MzgwOCwgMHg3ODMwOEU3NywgMHhDMUVFQUQzQiwgMHgwNTlDQ0Q5RCwKKzB4QThGREJFMTksIDB4RTQ3NjMwRkEsIDB4ODhBNDlERTUsIDB4MDMzNDdEQUIsCisweDRGMzFGOTY5LCAweEY5QzYyQjEyLCAweDkzQUIxMjZGLCAweDhBN0EzQkZCLAorMHg4MjU5MTU0NSwgMHgyQTFBMjEzMSwgMHgxREVCQjEzNCwgMHg0NDlFMjhERCwKKzB4RkE3RTAyNDgsIDB4QzFFM0E1QkMsIDB4MTc0N0UwOTcsIDB4NEM2OUFBNUMsCisweDFGRDcxQjRCLCAweEFDNjRDQTZDLCAweDU1NDVGOUY5LCAweDVFNTg4NkYyLAorMHgyNDNEQkE2QywgMHg0OTVCRTE2MywgMHg0RUNGNUE2QywgMHg0MzBDOTAxOSwKKzB4ODlBOTgwRkEsIDB4NTI4OTQ1QUUsIDB4MDBDRTY5MzYsIDB4OUY5QTczQjIsCisweDlFNTlEQzZCLCAweEQ1Nzc0MENELCAweDBFMENCNzM1LCAweEIxMjAyQkUzLAorMHhBQTI2QzJBOSwgMHgyNjdBNzdBNiwgMHgzRkExMkNGMCwgMHg0NTg3QzBBRiwKKzB4MzU0RUQ4MzEsIDB4RkZEOEJEOEUsIDB4NTZDQzBGMjYsIDB4NzU3MTdBRTMsCisweDUxQjEwNjc0LCAweDNFMzNFQzI2LCAweDI2Q0U4MERCLCAweDVDNEE5MTQwLAorMHgwMTdGNkMyRiwgMHhGOTAzOEQ5QSwgMHgwQTIyQzI5RiwgMHhCQTFGN0M4RCwKKzB4MTI1Q0M5MzQsIDB4NkNGNjZCRkYsIDB4NDhDMTNEQ0QsIDB4NjNGQzNEODEsCisweDI1OEMxODFELCAweDFBNEMzRERELCAweDJFMjRCRUNDLCAweDdDODZBOUVELAorMHg1QkQxOTg5QywgMHg1N0NFNTk1QywgMHhERjI5MUFGRSwgMHhFQUYwMDg4NywKKzB4RDhERDQyNTksIDB4REY2NzMzMUUsIDB4NTBEMENFODgsIDB4MUZEMDkwQUUsCisweDYzMkRBNUYwLCAweDk1MjcyQTVCLCAweDMxMTcyRjI1LCAweDU0N0ZEN0RGLAorMHhBRkJFMTFEOSwgMHg5NzE4OURGQywgMHhDNDg4MTE5MSwgMHgxQzkyMzY1RCwKKzB4ODQzREVGREUsIDB4Q0YwQTM5OUIsIDB4Q0YzMjdDQUYsIDB4RERBRjBCQ0UsCisweDAzQUE3QTJFLCAweDQxMUE4NjY0LCAweDZDQ0Y3Q0Q5LCAweDYxMDk3RUY1LAorMHgwN0YzOTQxRSwgMHg1QkMzRUI3NSwgMHgyNzkxOTQ1RiwgMHhCRUJCNTI2RSwKKzB4MTg2MzFBMzQsIDB4MjVGRUJGMTAsIDB4NDE5ODM0Q0YsIDB4RjY0MkQxNzYsCisweDM3MkZGRjEwLCAweDJBMUJFQTFCLCAweDQwMEZGMzQ1LCAweDI1N0EyMzRBLAorMHg5RjE1RTk5RCwgMHhFMDZBQTFEQiwgMHgzQTBEQjMxNSwgMHgyQkEzMEQ5OSwKKzB4MEU5RTgzMUUsIDB4MUIyNUVFNDEsIDB4OERCMzBFNzAsIDB4OUZCQTZENjQsCisweEFCOEFBNUUzLCAweDVBOTYxNzdBLCAweDZCRTAzNTM1LCAweDk3RTM3RENFLAorMHhBQ0EyNEYyNiwgMHg1RjAwOTZGNywgMHg1RDAyNzIyRiwgMHhBRjhGM0VDNywKKzB4QTY4MjQxNTEsIDB4NzBGQUQ0MDYsIDB4REVCQTg1MTMsIDB4OTlDNjNFMzQsCisweDFDQzRBM0RGLCAweDdGNzU2NTA4LCAweEI3Mzg2NTI3LCAweDY0N0M3RkI4LAorMHg0M0YxRjRERiwgMHhDN0U0RUMxOCwgMHgzMDJCQTEwOSwgMHhENUU5MTc1QiwKKzB4ODI4NTZGNzcsIDB4MEY2RDQ1RDksIDB4OTVBRTI4QjksIDB4RTYzMzg1QzMsCisweDhGQjI2NjE5LCAweEJEOTlGMjk4LCAweEM4ODRCOTQ4LCAweDBCNTk2RkYxLAorMHhFMDYxQzNGOSwgMHhCQzJGOUE4MSwgMHhDNDg4Q0Q5MSwgMHgzNzJFRjU5MCwKKzB4M0RBMUJGRTUsIDB4MTBERTAzN0IsIDB4NzIxMEI0REMsIDB4NzRFNEVGRjgsCisweDYzNjVBRkQyLCAweDhDRUFCQzg1LCAweDFEOEZGRDQzLCAweDRERTI0M0Y4LAorMHhFQzk3NkZEOSwgMHhBRDgyNzc2NSwgMHhDNjc5RjE1RCwgMHhDMTI1RUMzMSwKKzB4OTVEMzQ4MUMsIDB4QzRFQTZFQUMsIDB4QzhGQzAxNEYsIDB4MTM1MkVCNjYsCisweDlDNDAwRUI1LCAweDIyN0JGQUI5LCAweEIxMkJGOTU4LCAweDg1QjZENzgyLAorMHg3OEI2RTQ0RCwgMHhFMjIzMkVFRSwgMHg0RjEwMTcxMSwgMHg5QUJFQkY2OSwKKzB4NjZBQ0M2ODIsIDB4MDRBRDVGNTUsIDB4RTRGQzYyMzgsIDB4QkEzRDIyNjYsCisweEEyQkEzMTcwLCAweDA4M0YzOUFCLCAweEZGMjA3NUM0LCAweDk0NUM0QjA1LAorMHg0MUU4QzExMywgMHhFQzdDQUQ2NywgMHgzNjUzNzMzRSwgMHgwMzUxMEMzQiwKKzB4MUU5NzMxNTgsIDB4RkJFNTA3RjMsIDB4MkNDRDhEOUEsIDB4NkVBOTQ0MkYsCisweDBENDhERTk1LCAweEM1MTdCRkFFLCAweDA0RUJCNUM5LCAweEVGQUIxODIzLAorMHhENUZCRkMwQSwgMHg2ODkwRjIxMiwgMHhBMUMwMENDRCwgMHg2REQ1NjFFNiwKKzB4MjBEMzlCMUMsIDB4NTYxMTNGQkEsIDB4Q0YzQTdGRDcsIDB4M0FCNUEwREIsCisweDM2NTY1NzJFLCAweDdCQzQ4Q0QzLCAweDg5MDJBRTM2LCAweEQzRTk0QUZGLAorMHhDMDZFQjQ0NywgMHhDQzUxM0MwQywgMHgyNTQ0QjdERCwgMHg2RjE2ODg3NywKKzB4NTMxNjI2MDcsIDB4NDYxRENFRjAsIDB4RjQ3QUYyQkIsIDB4OEFGOUYzQ0MsCisweDFFRUZGOUU2LCAweDU3Q0ZCNkI2LCAweDdGNzEyNDM5LCAweEFCMjBDOTNELAorMHgwNDNGOTAwMywgMHg2MEM4MDhCQywgMHg4NkMyMTM3QywgMHg0NkFEQjQ3NCwKKzB4ODQ4QjY1RjIsIDB4NTU0NDc4OUIsIDB4MThFOUFFQzcsIDB4Qzg4OTkxM0UsCisweEZFQjc5QjJGLCAweEEzRkJFNTE4LCAweDY3OTIyNDYzLCAweDkzNzQ2Mzk4LAorMHg5NjhFMTYwRiwgMHg4Q0E4NTZBNCwgMHhBMDQwMjAyRSwgMHg2NjBDMDBDNiwKKzB4OEYwQThFNjIsIDB4RTJCQTU0REUsIDB4NEJEMEMxMTcsIDB4MUExQTMwOTIsCisweDA4NkNBQTNBLCAweDJCQkE1Njc2LCAweDg5NjEwMTc2LCAweDAwRUQyRjk3LAorMHhDNzIxMzBDNywgMHg1QTA1Mzg4MCwgMHg3Mjk4RTU1MywgMHhENjc5NzFFQSwKKzB4MEQ0MUU0NzcsIDB4MkZBODI4NUYsIDB4Qjg1NkExOTAsIDB4MTMyREI5MTYsCisweENERkZERDExLCAweEI1NTE5QTgxLCAweDFCQzcwMDFCLCAweDk3QzgyNERDLAorMHhCQjRDNzA3RiwgMHg5MDE2NkRDMiwgMHg0MkRGQUI3QSwgMHg5MEUzMzE4NCwKKzB4NkM2Qjk0MEMsIDB4REM1NTM4MTQsIDB4QzRGNUU3QUEsIDB4OTk0MzRBRTksCisweDgyQkIwOUQ0LCAweENCMEE3REEzLCAweDNBODAzM0FFLCAweDA1NEQzNDgxLAorMHhFMjBBRjc2MSwgMHgyNUY1RjI1NCwgMHg3QUQzQUYzQSwgMHgyM0EzNEMyOSwKKzB4QTE5QzU3QkMsIDB4MzlCNTdBRDksIDB4NTVFMUVDNTksIDB4NUVDQTQxOTgsCisweERCOTA4QkNELCAweDQ4NzFDM0Y0LCAweEU3MDkxMzI4LCAweDY0QTlCNkVDLAorMHgxQ0NBQjJGMywgMHhFREIyMjQyMywgMHhGRkI2QTcxNywgMHg2RkExMzU0OCwKKzB4MzYxRkY3MTEsIDB4MjQ2NjQwMTcsIDB4Q0JCRjk5NzAsIDB4ODNBN0I3REUsCisweDlCNzA0NjkwLCAweDAxQTBCODc3LCAweDk1MDQxQjYwLCAweEMwNDhGM0UxLAorMHhBMzE2MjVGMiwgMHhFM0RGQkUyNywgMHhGNjU3Mjk1QiwgMHgxRjVDM0FGNSwKKzB4NjBFRTE2MzcsIDB4NTc1RURGQUMsIDB4NzI1ODQ0RkIsIDB4MjQyNzIzRDAsCisweDA0RkE0NkZDLCAweDFBOEMzRjQ0LCAweDBFMDNBNUZFLCAweDg3NzgwNzlGLAorMHg2MDZFNEUxQSwgMHg3QzBBRjNENSwgMHg5NTc4QjI2NiwgMHg2M0JDRTc2NSwKKzB4QThFRDY2RDksIDB4OTI0MjM3N0EsIDB4ODE3QTVENUUsIDB4RDA5ODFBOTgsCisweEMwN0YyRTdGLCAweDBFNjZGODRBLCAweDM2MzVGODU0LCAweEQ3QUQ4MzU5LAorMHhEQ0YyMzIzMCwgMHhDMUI5MDg0QywgMHhBNzk4N0ZFNSwgMHhDM0IyN0VCNCwKKzB4MUY3NDcwNjEsIDB4RkQyNzg2MDEsIDB4QjZFRDNCNUEsIDB4OUNFRjhBQTAsCisweEE1MDIzQzQ2LCAweEI0OTgzMkFGLCAweEIxMjA1NUZELCAweEQ4NTMxMEUxLAorMHgyQzE5QURFNiwgMHhFRkJCMTdBOCwgMHhDMjQ2QTRDNywgMHhCRTRCMjY2NiwKKzB4MTNDMkQ3RjksIDB4NTAwNjNCQTEsIDB4OUIwMEUwMkQsIDB4MzM1QjlERjgsCisweEQ0MjRBRjI1LCAweEJBRTQwQzkyLCAweEU4N0JENkI3LCAweDM4NEQxRUIxLAorMHg4QjkxRThGNCwgMHg5RTNGQzZENSwgMHg2QkIxQTUxRSwgMHgyMUFFNTUzMywKKzB4RkNCOEU3MTMsIDB4MTg4QjY2QjEsIDB4NjU3MkU5RUQsIDB4OTg4MjkxNzgsCisweDdCQUU4Q0JGLCAweEUwMEMzMkI0LCAweERBRkMxNEQ1LCAweEVBOEZDNzQ2LAorMHgyQzhENzEyRSwgMHg4OUEwNUZDOSwgMHg5QTI3NDY0MSwgMHhBQzI0NTBBRCwKKzB4MjQzNzc4NEYsIDB4M0IxQjgwRjAsIDB4MEI0QTMxRkQsIDB4Mjc3QzAyMzIsCisweEZEREM2ODI5LCAweDNGM0M2MDZDLCAweDBFRjYyMzUyLCAweDNEMDdEMDRBLAorMHg0RTA5MzlFOCwgMHhENTlCRjExNSwgMHhBMDI3NTJFNywgMHg0MkJGNzEzMywKKzB4OUZBMDkzOUUsIDB4NjQ3NjQxMDksIDB4RDVEMDNFQkEsIDB4M0Q0NDMzQTMsCisweDE3NDlCNDM3LCAweDEzNzI5OEIxLCAweDY3N0JFMzQ0LCAweEE4M0NFRjdFLAorMHgxNzgxM0EzOSwgMHhCQzcxODIzRiwgMHgyMDcwRTlBNywgMHgzODczQUVGOCwKKzB4NUFGMUUyMUIsIDB4MUYwQ0M2OTIsIDB4QjhFRkIwNEQsIDB4MUExQ0M1MTQsCisweEFERUQ2QzNELCAweERGMzVBOEQ3LCAweDZEOTMyNzVFLCAweDlDMzYyNTQ1LAorMHg2MkJGNzU4MywgMHhGQzU2RDk5MCwgMHgwQ0Q2QTMyNCwgMHhGMTJBNzkzOSwKKzB4NTI1ODcwMjksIDB4RDAwRDVGMTYsIDB4NTE2MjI1NTUsIDB4MTE3OEU4ODcsCisweDgxRTdCQ0M4LCAweDkyQkIxQzExLCAweDA5NzMzMEU0LCAweENGOEM1Q0FGLAorMHhEMDc2RDZCQywgMHhCQTI5MjkxOCwgMHhGODM1QTgyOSwgMHg0MjgwQTUxRSwKKzB4MDlDRDc4MjcsIDB4MTE1ODM0ODcsIDB4QjhCQTJDRUYsIDB4RDU5OEFFOTMsCisweDk5RjRGRDc3LCAweEVCMTUxMTEwLCAweDE1NzFCMDc2LCAweDYzRjIxMDNBLAorMHg1NkM2QkY0NCwgMHg5RTYzQjU1NiwgMHhGQjk4MTIzOCwgMHg1RDhDOTc4QiwKKzB4OTUwMUQ5MzYsIDB4ODJBMUU5NzEsIDB4RTVBNEY3RTIsIDB4QzZFMzcyN0EsCisweDAzMzI5RjA3LCAweDI0OEFDREQ2LCAweDQzN0U5MTdCLCAweDIzQjAyQjIwLAorMHg3M0Y3NkFBMCwgMHg3NUVBMDZDNSwgMHhEN0M2NjJCMywgMHgyNjc3NzdGOCwKKzB4REM5NkJGMDYsIDB4NTQwMjAzNDYsIDB4Q0JERjA2OUIsIDB4MDMwMTMzRUMsCisweEE3RUYxQzJFLCAweDU2ODk1OUFCLCAweDRGQzMxREUwLCAweDNBMjI4OTBFLAorMHgyODBGODY1MiwgMHgxQkQ4Q0IyNCwgMHg5QThEOTJDOSwgMHg1MjcxOERFMSwKKzB4MTIwMzNGQzcsIDB4RDQ4NDkwQ0MsIDB4NjgxQURFRTIsIDB4RjkxQkY3QjgsCisweEI4NjA5QjM4LCAweDM0Q0Y0QkNBLCAweDhGMTIzMjkwLCAweDBEMEY0RkNELAorMHhDNEY0MzMyMywgMHgyRkMwNEYxQywgMHg0NjY5Qjg5MCwgMHgxRThEMkE3RiwKKzB4MDY1OENBRTYsIDB4NTQ4OUYzQTMsIDB4OUNEMzYyRkUsIDB4QkE1MTkwQjEsCisweDA2QTU4ODIwLCAweDdBOUFGNzU5LCAweERDOTRFNjcyLCAweEVCMjg0Qjg1LAorMHhGOEVGQTAyMiwgMHgzODM3QzM3OSwgMHg3QzlFOUEyQSwgMHhEMkVEOTZCQywKKzB4NUQxRTRDN0UsIDB4OTdGMjE2OUYsIDB4RkMzQzM3QzIsIDB4RTAzOUVERjEsCisweERCRTkzOTA5LCAweDgxRkVBQzZCLCAweEZDRDM4M0ZDLCAweDE3MEI5MUZCLAorMHgwNUJBMzI0MywgMHg4RkIyQURFMSwgMHg1MkFGQjk4NCwgMHhFODI2MkU5QSwKKzB4MUU3MDQ2MzgsIDB4ODlCOERGRDgsIDB4MThDMEM2NDEsIDB4Mjc2MEM3RTYsCisweEQzQUZGM0M5LCAweEM0RTM1NDNCLCAweDBDMEI3OTEwLCAweDFERUY3NzkyLAorMHg0ODNENzE5NCwgMHg5QUFGNTg2NCwgMHgwODYwNzk0NywgMHg2MjZGMENGMywKKzB4QzBGNkE0ODYsIDB4RUI0NTI1Q0UsIDB4QThCQkE4RjgsIDB4RTQ1MERBMTQsCisweDJEQzREMTE0LCAweEJDQTUyN0M5LCAweDY2ODJBQTRELCAweENCQjQ4QTVGLAorMHgxQjQ3NEM5OSwgMHg3RjVCNTI2QywgMHhFQzQzNUMwQywgMHg5RThEM0UxQSwKKzB4NjdEMkVBMjksIDB4QTNCN0FEQ0QsIDB4ODMyODU5MEUsIDB4NzM0NTYwN0IsCisweEI2MDU3NTg4LCAweDFBOEIwMzRDLCAweDVDOENBNTM0LCAweDgxMTVEQzVGLAorMHgxODlDMkFCRSwgMHhGMUI5MjkyNywgMHg3OEEzQjYyRiwgMHg0QjYyMUQ0OSwKKzB4REMxNzZBNjgsIDB4Q0JEM0MxREMsIDB4RDgyMzQ4QkIsIDB4RUVGMDVGQTcsCisweEMwREQzRDgzLCAweEMxRjJBN0JGLCAweEIyMDc5RDAwLCAweDE0QjU3MzBFLAorMHg3MzIwM0NENywgMHhBODY3MjQzMywgMHhBMTcxRkZFRCwgMHg5RjE4MTIwMCwKKzB4NEUxNkE1QzgsIDB4NTZEOEFDMzEsIDB4NzM4MDNEODYsIDB4RDQ2ODVDQTQsCisweEU4REU5RkUyLCAweEEzNUQyQ0U4LCAweDgwOENGM0UyLCAweDE5ODcwMEFFLAorMHgwMDM0MTYzRiwgMHg1N0JDNzZGRSwgMHgyNzFBQ0Y5MywgMHhBQTNBRjZEMCwKKzB4MzcwMDNBN0UsIDB4NDUwQjc0RjQsIDB4MTU3NDAxQ0IsIDB4Qjc5REREQTgsCisweEQ2MEFCN0E0LCAweDNBNEM4Nzc5LCAweEI2OTkwRkM4LCAweEExNjY4RDVBLAorMHgwNUI3OTY1RiwgMHg3ODE0Mzc2RCwgMHhGQTBEMkQ4QSwgMHhEOTdBMTE0MiwKKzB4RTgwNERFM0QsIDB4NDkzOTA4OUUsIDB4NzhENDBDQUMsIDB4MDFERUY1RUEsCisweDNERDFDQURBLCAweDk2NDY1OTU2LCAweDYzNThDRkI2LCAweEFDRTAyREU1LAorMHhCNEM5RjZDRSwgMHhFOUM5NUFGRiwgMHg3MEVBRDI4RSwgMHg1ODgwMzY5MywKKzB4ODlFRjk5NzIsIDB4NThGMDI3M0YsIDB4REIxN0EyNzcsIDB4MEIwODJCOTgsCisweEFBQjEzQUJELCAweEU4NjM4MUVDLCAweEMxODkyNEQ0LCAweEUyOEQ0MzQ4LAorMHhDMjE4OTVBQiwgMHhFMTcwNzNBRCwgMHg5NDE3NTM5QiwgMHhBMDQzRTVGNSwKKzB4ODhGRkQwMjYsIDB4RDk3MkYwMTcsIDB4RDBDOEI4RDMsIDB4QjM0RjNENjcsCisweEM1MjVFNEI1LCAweDAxODlBNUExLCAweDU5MjI0QTM1LCAweEFBMThGMkQ1LAorMHhGQzlFMTcwQywgMHgxNkQzNzk1QSwgMHgzNURCMDlGQSwgMHgxNjI0REIxRCwKKzB4NEE2RTA1OUYsIDB4QzVDODhBOTMsIDB4OTA1MUQzNzMsIDB4NEIxMkIwOUMsCisweDQwODhBRjM5LCAweDcwNTM5NEY2LCAweDM2MEYyQkFDLCAweDhBMUYyNDIwLAorMHg2NDFENEZBNSwgMHhBNzhCNzhGOSwgMHhBNUE1MzAyRSwgMHg2OTFEMjEwOCwKKzB4N0NGQjU3RkQsIDB4MTgxMkZFNjgsIDB4OEEyQkI1RTAsIDB4RjE4MUNBMTQsCisweDE4NDY4NDhFLCAweERDMDQ0RjY3LCAweDE3RkNDQTI4LCAweDIxRDdDNUFDLAorMHg0QzQzNDMyRiwgMHhDNDU3RTI2RSwgMHhCMEM5QUREMiwgMHg3OTFFRTJCNCwKKzB4NjIwRjI3QkUsIDB4MjI5RTBCMUUsIDB4NzQ2QjRGRkMsIDB4MDIwMzg3MzgsCisweDFDN0I5NzFCLCAweDA1MTkzNDMwLCAweDg2NDVEQkQ3LCAweDU4Njc4Rjk4LAorMHgxNDFFOTEyRCwgMHhEODlDNTg3RSwgMHg5RkQ3QjQzRiwgMHgyMTg1MUQ1NiwKKzB4NzI1MzExQTcsIDB4MDYwNUIxQjIsIDB4QzE4QkYyQjcsIDB4QzZGNzlFQTksCisweEJEODRBMDFCLCAweEM5QjdGMkRBLCAweDA0RTQ3RUU4LCAweDFDMUExNEY1LAorMHhCRDVCNEZGMSwgMHhFMTVGQkMyRSwgMHhDNEQ0M0YwMSwgMHg1RDM5QUQ0QSwKKzB4QkQzQkQ5ODMsIDB4QjIzMTRBNEIsIDB4OERBQkE2N0UsIDB4QjUyNjNCNUEsCisweDk5MTJGMjYyLCAweDgyNjU5QzgwLCAweEMzNjEwMTgxLCAweDNGMjI5MDE0LAorMHgyNjg1NTMyRiwgMHhDRTRFQzIxMCwgMHhGNDZBQjA5QSwgMHhGQUZBNjlDOCwKKzB4RDEyOTI5NDQsIDB4MkVGODgwRDksIDB4RDAzQUFFQUIsIDB4MEU4M0M0MzUsCisweDg0MkM0ODJDLCAweEE3MDk1MUExLCAweDBFNEVBMDdELCAweEUwMzMyRDBDLAorMHgzRUEyN0U1NSwgMHgwNDcyMTQyNSwgMHg3QzhCNTZEQywgMHg5NjM5MTMxMiwKKzB4RjYwMEQ3OEMsIDB4Qzg1MDUxN0MsIDB4QjNGOUYyQUUsIDB4NTlBOTkzNTEsCisweDhENkFBODM4LCAweEY1ODY2NzJFLCAweEQ4MUZFNTI1LCAweDNDRUYzMURGLAorMHhBQkRDNzA3OSwgMHg2RTFCQjhGNiwgMHg2QjQ1Qjg3QiwgMHg5RkQyQ0FDNCwKKzB4NjQ4RTM1N0EsIDB4NkM1N0QzMEIsIDB4MjM3NjZCNjQsIDB4OEM4QkQ5QzEsCisweDlBMjkwMDFBLCAweDIwNkY0N0UzLCAweDVGNDIzRDc1LCAweDI5M0EzMkM0LAorMHhEQ0M2NDMyQiwgMHhBNDI4MDk1NCwgMHg0NTc3OTBCOCwgMHgxMUU4NENFRiwKKzB4QUIxMUQwQkYsIDB4RDA0MjU4RTMsIDB4RkI0NEMwQ0UsIDB4RUQ4MjMxQjIsCisweDAyNzdBNkIyLCAweEQ4RTVDNTE3LCAweENFREY0QzhCLCAweDE5RDkwMTcwLAorMHgyMDU1NTUzMiwgMHhGQ0I2MTBCOSwgMHg4OEQ1RjVBOSwgMHhEMzVEQzc3RSwKKzB4RUY1RUE2ODYsIDB4RDg2Njk1OUMsIDB4RjA4ODZCNTYsIDB4MDA1Q0ZCOTAsCisweDU4MkFEMjU1LCAweDczODEyODlGLCAweEMxOENFRDRELCAweDQ0NEYwQTZCLAorMHg5OTE3QUU1NiwgMHg1MDVBN0JDRCwgMHhDQkRDOTAzQiwgMHg1MUVGMEYzQywKKzB4QzRFNkFGNUEsIDB4QjE0OEFEMkYsIDB4NjA5QTEyNEEsIDB4QjVEQTg5RTQsCisweDNBNjhDN0Q0LCAweDk4Njk0RjAyLCAweEU4NUIxNzY2LCAweDc1NEJBNUZGLAorMHgxMjk2QTU4RSwgMHgyNzczNjg0MywgMHg5QjYyODBCRCwgMHgyNjg2MDMyRCwKKzB4QjQyOEFDMDQsIDB4QjA2REJBNUMsIDB4NjI1RkUwMzQsIDB4RDRCQ0IyNUUsCisweEM5MUM1QjNDLCAweDczQkI3MEU1LCAweEEyNkE0NzlBLCAweDczMTczMjI5LAorMHgzQUExMjM1QywgMHhFMTYxNzFEMSwgMHg0MkQwRDQyRiwgMHhGQzYyNDc1MiwKKzB4RjFGNURDQzIsIDB4MUI2RjIwQTksIDB4RkY5RDYyNkQsIDB4REJGMDUyQzAsCisweDkwRTM4RDIzLCAweEZCNzJDQzVFLCAweDkxODY1MTlDLCAweEYyMzMwMDkzLAorMHhFNTI1MTM4NSwgMHhBMDA5NDk3NywgMHhFODNGQTA2NiwgMHgyRTM4OUNFMiwKKzB4RDNBNjJFNzIsIDB4QTk0MjJBOEIsIDB4QzYxQ0ZENUIsIDB4MUIzQTUxNkEsCisweDU4MDg3ODAwLCAweDNBNDc0NjJDLCAweDU1N0RERDhCLCAweDk0RkQyMUQ0LAorMHhFMUFFQTk0MiwgMHg0QjJDQzUzMiwgMHhCMjE4NUIzNiwgMHhEQ0ExNTI1OSwKKzB4MUQwNDREN0QsIDB4NzgxMzE3QjgsIDB4NDlDQjEzRTcsIDB4REFBRkZCQzYsCisweDMwQTA1NjQ0LCAweDc3QjA1RjM3LCAweDA2NUE1NjdDLCAweDk0NzIxQzc5LAorMHg0NzMxNkM2MCwgMHg1OEFBQzdDOSwgMHg0MTAwODFBQiwgMHg3RDRBMzZGQSwKKzB4Q0RGMjM0NTUsIDB4MTg3M0VGODcsIDB4MTg2OTgyQjUsIDB4N0M3OEQ5REEsCisweDM1NjdEOTY2LCAweDEwRkY1RThFLCAweERCODhFNUIzLCAweEZGMUQzOUExLAorMHhCOEEzNDVBMywgMHg3QTcyNThGMywgMHg5NzA2QjNDRSwgMHhCNUFEQ0MyNiwKKzB4NDU2MUVGNUIsIDB4QjAwMkZCRjYsIDB4RjNGNEM2RkEsIDB4NTdFQzc1QUQsCisweEJDRjM3OTI0LCAweEJDMDVCMEFELCAweDJBQjE5REFBLCAweDBFQkQyNUVBLAorMHhGMzM1RDA4QywgMHhERkY3OUUxOSwgMHhERDg2RDQxOCwgMHhFQ0UxMTk1MSwKKzB4QzA2RjRENTAsIDB4RkQ2OThERjgsIDB4QkE2MTkyRUYsIDB4MzY1QTI4Q0UsCisweDc0REVDMEI3LCAweEU5NzFGNjdCLCAweEJGODlERDQyLCAweDFFNjgzMzk5LAorMHgxNjRBNzE1OCwgMHhBMUU0ODQ3NSwgMHhCRTEzOUU4RSwgMHhCREVCQTdGRSwKKzB4NzRFMDNBRUMsIDB4ODhFQTk2MTgsIDB4OUIwMDQ4QzIsIDB4NjhDMUREMjAsCisweDhEQzlGQzg1LCAweDI0QjU1RTNCLCAweDUxQzM4QkRBLCAweDJFQ0Q3QjEzLAorMHg1NEQ2NkM4OSwgMHg2OUEzRUJDMSwgMHg0QjRFNEYxMywgMHhBRDM3QjdERiwKKzB4MDMwQTFEOEIsIDB4ODVBMTE0RDksIDB4NDAzQkU0OTUsIDB4QjVFNDAzMzEsCisweDMxNkU3MzEwLCAweEIzNkFBNDk0LCAweERCRkZDQjlBLCAweDVDMEU1REE1LAorMHgwOTlCQTlFOCwgMHg2NjgyNkU5RCwgMHgwQkM1ODQ5QiwgMHgxQTIwQ0JBQiwKKzB4MDc0NEZCRTYsIDB4MkNCNTIwNDAsIDB4OEI4ODUzM0YsIDB4QThBNDRCRjEsCisweDYyRkVCNEE4LCAweERCMkFCQzRELCAweDQ2RjBCNjc2LCAweENCRDA2NDcwLAorMHhEQjZENzFFRiwgMHg1REMzNTUxQSwgMHg3MUIzMUE1QiwgMHgwNDZENEM3RiwKKzB4QzA1MUE5OTgsIDB4MUVDMTlGRjksIDB4QTlFMjFGOUYsIDB4Nzk1MUUwODEsCisweDc4QkNCQTYyLCAweDkxQjYyM0YyLCAweDhFRjZBODFELCAweDEwMjM3NTVFLAorMHhDRTQ3RjVBQSwgMHgwRUYyNzUyNywgMHhFOUU0ODhENSwgMHhENTNFNEEyOSwKKzB4NzhBMjc2RTEsIDB4QjIxMDA1ODUsIDB4MDEyMDhFM0MsIDB4QTM4QkNBRkYsCisweDM2MjIxRkI3LCAweEIzQzkxOTRFLCAweDUxQkQ3NUQ0LCAweDlDOEM3M0FDLAorMHg3QUNBOTk2NCwgMHgxNzg5MEM5NCwgMHg5RkRBNTFGNCwgMHhDNEZERjY4OCwKKzB4MkM4MjQ0QjIsIDB4MEQ4MzRDNzQsIDB4MjkwOTczRDMsIDB4N0YxMzQ1NTMsCisweDI5NkQyRkMyLCAweDRFMDhFRDI3LCAweDFDNTFFNTNELCAweDNEODkyRjQ5LAorMHg5NDVGNzZDQywgMHgyRTUzMUU2MywgMHg3MUVFMzdFMCwgMHg5QzQ3RjM0NiwKKzB4MkQ4RDkyMEMsIDB4QzNFNDY1QkEsIDB4M0E3MkQxNDIsIDB4NUI2QUI4MEQsCisweDM2NEMyQUU3LCAweDNCMTgzODlCLCAweEI5NDQyNDg0LCAweDVENjg3QkI1LAorMHg5N0M2NUE0RiwgMHhDN0RCRThCRSwgMHgwRjg0MDA2MSwgMHg1QTczRUE4OSwKKzB4Q0JCREQ5NTQsIDB4QUZFOUNBQkQsIDB4MDZBQkRGOTUsIDB4RjEzOTMwMkQsCisweDM4MDRGRUE4LCAweDdDRTY1NDJGLCAweERFNDdCOEVELCAweEQzNEJFNTA5LAorMHg1RUI5QzlFMSwgMHhEQzU4MjUzNCwgMHhFNzdEN0ZDOCwgMHgyQkVGRUQ3RSwKKzB4NEVBMjZERkQsIDB4NTQ2NzBCODEsIDB4NjY1QzQ1MzEsIDB4NUI3QTcwMjMsCisweEEwNUQ5QTJFLCAweDcxQkREQjJFLCAweDlENTFEOEMyLCAweEQ4QTY2NUNDLAorMHhBOUI4N0EyMiwgMHg1ODFEMjhCRiwgMHhGOUQ0MDM3MywgMHhFMDREOEY2MywKKzB4MTE3Qjk4NDIsIDB4ODg2OEI5QkUsIDB4ODM5N0ZBQjksIDB4RUY1Q0VENzUsCisweEY3MEY5MEQ4LCAweEQzREZEM0E2LCAweDE3NzlGNTc2LCAweDMwNTk1MjBELAorMHhDMzhGNEFBOSwgMHg2QjdBNkQwQSwgMHg0RTczMTEyQSwgMHg0RkY5RENFRCwKKzB4QUVBMTM4M0EsIDB4QkFCMEFBOTMsIDB4NDFEQkNCRUQsIDB4MjY2Nzc1QTYsCisweDhFRTBENUQ1LCAweEI1MjJDQjlFLCAweEM2RTVEMEQzLCAweDg2RTRDOEZELAorMHhBODk0NjQyRiwgMHhGNjk4MjFBOSwgMHg4OEI0MTc5OCwgMHg0NTg1QTE4OCwKKzB4OUQyMTMwRkMsIDB4QzVCMThFMEQsIDB4NkI5MkM5RUUsIDB4M0M5Mjg5RkIsCisweDFGMDJDQkI2LCAweDMxRkE4NkRFLCAweDFCMjI5NUNELCAweDVCNERBMTlDLAorMHgzMTM0RDhGQywgMHhFNUVBQkM0NCwgMHhERjhDNTA5NSwgMHhGNjU3MTg4MSwKKzB4MUYyRkJENjIsIDB4RTU4NUZFNjEsIDB4MDIwQ0VERjYsIDB4RDcwQUJDODMsCisweDVGMzc3NDZBLCAweDZGREEzQkY3LCAweDU0MzRFNTAzLCAweDQ0Q0Y2OTE1LAorMHg1NjFCMjM5MywgMHhFQTRBMjI1MSwgMHhBOTg4QzA4MCwgMHhFNDdCMTc5MSwKKzB4RDMzNUNGQkUsIDB4RURBOURFRTIsIDB4NEY3MEZCMjIsIDB4ODNBMkMyOUYsCisweEY0NEZBMDAyLCAweDA2OUQyNUVDLCAweDRENTA0M0Y1LCAweDg4NzQ2NENBLAorMHg2NjFEMUU5RiwgMHg5OEI4NTZBRCwgMHg4MUEyM0ZCMCwgMHgzNjkzQkQ0MiwKKzB4Q0UwQUVCMEIsIDB4MUY2RTgzMjIsIDB4Q0JERjU3MUIsIDB4OTM2ODg5MDksCisweEZBMTZBNzc0LCAweDI1ODM0NDM3LCAweEVFNzdGQTk4LCAweDhEQzY4QzYwLAorMHgxNTVBODc2MCwgMHgyMkI4RkNBMywgMHgxQjFCQjA1NCwgMHhDQTNBRkZDQSwKKzB4QzhFQUNFQTQsIDB4Qzg2QkFERDksIDB4NDczNzcwQUIsIDB4NDFENkUzOTgsCisweDU2OEIzOTdELCAweDA2NUMwQkU1LCAweDUxRDM4QTBELCAweDNCQjNBMEUxLAorMHhCQzM4NkRDQiwgMHg3RENCQTZCMCwgMHgxOTAwNzI1NCwgMHgzRjRGQzcyNiwKKzB4RjI3REFFODUsIDB4RjdGREE3MkEsIDB4NkQwQjVDMDcsIDB4NjRBMEVEMTIsCisweEUyNkQ4ODc4LCAweDIxMEU0RjZCLCAweDY1RjkyQzBELCAweDRFNEUyQ0E2LAorMHg1RTQ3OUQ0OSwgMHg3QjI4NzA1MCwgMHhFOUE0ODM2QywgMHhDM0ExMTFBMiwKKzB4OUI5MEQ2RkQsIDB4QTVGMzYyRTAsIDB4QURDOTUyNkIsIDB4NzlCNzM2RTksCisweDcyQTlBNTdCLCAweDE4MUI0RTcwLCAweDUyMzZGMzJBLCAweDU1NjdFM0M5LAorMHgyM0VGRDA2MywgMHg4NzExMzE2MywgMHhDREY2RDRGNCwgMHhGNTNBODcyMiwKKzB4QjcwQ0Y5NDEsIDB4NzU3RjQwQzgsIDB4NkE2NTJCRTcsIDB4RDcxREE1QUEsCisweEY4N0Q1MUMyLCAweEI0QTY4RTE2LCAweDc2M0Q4RkVCLCAweEI2REU1NDM2LAorMHgxMjE4NERDRCwgMHgzOEQxREU5MCwgMHhCMzlFNTIwOSwgMHgxNjAwNDkyQSwKKzB4MDczQUU4RjUsIDB4MDM2NkFDMEUsIDB4MUFENTAxNEYsIDB4Mzk4RTA4NzMsCisweEQ2NTM5MjhFLCAweDMwQjVCNERFLCAweEFDNjhBMDZFLCAweDhEQUVGNEQzLAorMHg3NkE4ODBEOCwgMHhGM0IzQkNDNSwgMHgyQjYzMUY1OCwgMHgzNDA5MTREQiwKKzB4QjQ3NzFEQ0MsIDB4N0M5RDRBNDMsIDB4QUZEQjExMzgsIDB4MDE0QjVBODMsCisweDBENDQxODVELCAweDIwQzg5NTc2LCAweDk5NEI0MzY3LCAweEE4NEJENzkyLAorMHhCMkUxN0NCMSwgMHgwMENFNTIxNCwgMHhGQjkzRTU0RiwgMHgwM0NDQTdGMSwKKzB4OTU2QTgyRTYsIDB4MjIzMjlBNzEsIDB4MkE2MzQzNzQsIDB4RjE4QjdBRDksCisweDFGMTY4QkM0LCAweEMyQ0IxRURDLCAweDhFMEFGNkNELCAweDIxMUFGMjJBLAorMHhBQjVEQTM3NCwgMHg2M0YxRjI1RSwgMHhFQzU4RDRDQywgMHg0OEM2NUM0NiwKKzB4NUE3Rjc1NzQsIDB4N0JBNjAwNDcsIDB4Mjc5RUYyOTksIDB4RTBCNzdGNDgsCisweDY0N0EwM0MzLCAweEFFN0M0RDhGLCAweEY2NTE0OUQwLCAweEFDOUVGMjI4LAorMHhDRDkwQjFDRCwgMHhDRUVEQTU0QywgMHhEOEZEMEE2QSwgMHg4RDdDMjI5MSwKKzB4QjM4RUY2QzEsIDB4N0YzOEU2NzYsIDB4REFERDBBOEYsIDB4MTEyNTcxM0MsCisweEFBNzhBMjk5LCAweDU0MDMzRjIwLCAweDE5OUM3NkM1LCAweENBRjgyQTE3LAorMHgxNkYyRUU4QiwgMHgyMDA3MUQwRiwgMHgyQ0EwMDBGOCwgMHgwMTc4QTI0QiwKKzB4MDAyOUVFNDYsIDB4QTlEOEM3MzgsIDB4MTIzRDJCQkQsIDB4RUY3Q0FDNTIsCisweEJEMjQxODY5LCAweDQzNUY4RkY3LCAweEI1NzNBMTkwLCAweDQwMkJGQjJGLAorMHhGREEzMDk3QywgMHhGMzc2NTg4OSwgMHg2OEUyQzdENSwgMHg0QzI2Rjg1OCwKKzB4RDY4MTREMUYsIDB4NkIwNDNDN0IsIDB4MTczREIwOTEsIDB4OTUxMjZDN0MsCisweDBGRThFMUJFLCAweEZERUIyMzNDLCAweEI5NzlCMENCLCAweDAwRTAwNjU5LAorMHgxOTk1MkU1MiwgMHhBMDk3NkY3RSwgMHgwMkZCNDYyQywgMHg3OTg4MTVDOCwKKzB4QTI1MDRFRkUsIDB4MEY0ODExQUQsIDB4QkE4RjEyMkUsIDB4NUVFNTg2NEYsCisweEQzOUI2Nzk5LCAweDUzMTlGNkEzLCAweEY2QTY2Njg1LCAweDk4OEQxMDZGLAorMHg3QUJBNTIyMCwgMHgwMzIwMzg0QiwgMHg0REU0OEM3OSwgMHhGNUNCMzZFNiwKKzB4MkIzMzI3MEYsIDB4RkY0RTY5NjUsIDB4RDREODQzRDUsIDB4N0VFRTg2MUMsCisweEE5NkFFNUVFLCAweDMxMEU1MjE1LCAweDZEMjAwNjhFLCAweEIxNDlBRThCLAorMHgwOTk3RDlFRiwgMHg1MDQzRkZGQSwgMHgwNTE2RTJCNiwgMHgzRkNDREEzMiwKKzB4OEU2MDRBMDQsIDB4MjMwMTI3NzgsIDB4OTQ0NEE0NzQsIDB4QjdGNURDMjQsCisweDNBNThFNkZCLCAweDE3Qjc1OUZCLCAweEYyOUMxRUU3LCAweDg4OTNEMkQxLAorMHhDNkNEMjM1QiwgMHhBQUIwQ0JDRSwgMHgyRDg0NDc0QywgMHg4QTBCRTAyNywKKzB4RkRCODdGQjUsIDB4RTZCNTA3QkQsIDB4MTlCNDE5MjcsIDB4NzgzRkY0REEsCisweDQ4NUExRDVELCAweDhFRDI4NUMyLCAweDI1QUZDNEM1LCAweEJGMEQ2NjJCLAorMHhDNDIzODUzMiwgMHg0MzM5RkNDRiwgMHgxNEE3ODRCNiwgMHg3MTY2NTgxOSwKKzB4RUQ3NkU0NzMsIDB4NUYxQkFFOUUsIDB4RDBBRUMxN0IsIDB4NENFNzg4MTQsCisweEQzNjA5RjYxLCAweEQ0RTQ5RUIwLCAweEU0RTNFRkRBLCAweDlCN0NBRDFELAorMHhFRjAxQUJCNywgMHhEMTM3QkVFOSwgMHhFRTg3QTgxRCwgMHhENEIyMDRGRiwKKzB4MDBCMjU3MzcsIDB4Mjc3MEZCRDEsIDB4MTc0QUZGN0YsIDB4MEE3N0EyMUMsCisweEYxQjM3MEU3LCAweDlDMDkzQ0IwLCAweDA4MEMxRkZBLCAweDgzQ0U5MkQ5LAorMHgxNzA3NDcwQywgMHgzMzAzNDc5RiwgMHgyNUYxQjZBRiwgMHhGNDBFRUI3RiwKKzB4Qjk4QTE2NzcsIDB4QTU0QTFCQTIsIDB4NDNCNDE0NEEsIDB4MkYwOTJBMzUsCisweDMzMjg2QTc3LCAweEEwQUI5QzkzLCAweDRGOEQ3MERDLCAweDNBNDdCRjZGLAorMHhCNjIwOUFCNSwgMHhBNEM5NDU1NywgMHg1RTc1NzA1NSwgMHg3MDZFQUQ5RiwKKzB4NDY3QkMwMkEsIDB4NjQ3MkE4NTcsIDB4NDIwNTVDNTcsIDB4NjZGMkJBNjAsCisweDMzQzA1MzZGLCAweDMyNDBCRkJELCAweDNERDc0RTZCLCAweDFGNThBNTUyLAorMHg4MjJFOTU3NywgMHhGNDlCRkU3NywgMHg1NDkwREM2RCwgMHgxRDMyQkJBMCwKKzB4MUMzMEIwNzIsIDB4NzhBNEE1QzAsIDB4MUVFODhBNTcsIDB4OTdDQUMzQzgsCisweDk5MTI4NjFGLCAweEM5MTZCQkFGLCAweEZDM0E3RjBFLCAweENBNUUxRjNBLAorMHg2MzBGMDlDRCwgMHhGNkM4QzIxMCwgMHhGMEExMkE3MiwgMHhGMzE0ODYxOSwKKzB4REYxNjcyRTEsIDB4RkNFNUMzOTAsIDB4MjlDQUU1NTQsIDB4RTk4NEE0NUMsCisweDhBMUYwQTNBLCAweDZBMDJDNzA3LCAweDhDRkIzRUQ2LCAweEMwQTc0MUJELAorMHg3QTg3MUZFNSwgMHg5MTAyMUE2OSwgMHg1MDVGQjA1QSwgMHg4Rjg1MjI3QiwKKzB4QzMwMEFDRjEsIDB4MEExQjIwMUIsIDB4MjI0NjE0QjIsIDB4NTRBMjM1NzYsCisweDUzNjBBNUJBLCAweERDRDIzQTMxLCAweEY5OERGNjM4LCAweDc5RkY3OUQ3LAorMHhFQUM4RUFDMywgMHg0RDIyQzY1RCwgMHhERkZCRjFEOSwgMHg1NUZEODg0OCwKKzB4NEJGRDIzNDcsIDB4RTJBMDgyODcsIDB4RTZBNDg4MjQsIDB4ODA2MjVFQTksCisweDcxQUIzRjdFLCAweDk5Qjg0REU1LCAweDY1MTJBREJFLCAweEZCRjI0QzQ3LAorMHgzRUVGMjU2NCwgMHgyM0RGOUYxQiwgMHgyNEJFNTE5OSwgMHhERURENzJENSwKKzB4QTJGRTA2M0IsIDB4NEZFNTIwQjEsIDB4OUU0RTdCQkUsIDB4RDYxNUJEQkUsCisweEMxNEU4MTg0LCAweDQwRjg2RkIxLCAweEQ0MDNBNjVBLCAweEM1QUY2Mzg2LAorMHg0MTJGODQzNCwgMHg2RDYwMTJCMCwgMHg0RUM1NzEwNywgMHgzRjc2QUYxOSwKKzB4NTRBMzA1QkQsIDB4RUE5QzRFQjIsIDB4NTg0RTAxNzYsIDB4MjA3NTk4MDUsCisweDFBMTZDODRBLCAweDUwQkIxMERCLCAweEU2MTBBRjQ1LCAweDk4Q0YxRUEwLAorMHgzRjhDNzc1NiwgMHhGOTA1NkJFMCwgMHhCQUE2NkI3RCwgMHhGNzA3NkRDRiwKKzB4NjdGMTk5NEQsIDB4OTJCRkVCNjIsIDB4ODZGQkRFMTcsIDB4Mzg5REIzMTEsCisweDJBMTcxRjVBLCAweEUxNDg5OEIxLCAweDREMTE3MjNGLCAweDI5ODg5MDYyLAorMHhDQkYzREQ3OSwgMHgyQjc0NjhGQywgMHg0RkI5Mzc3MCwgMHhDNUZDRUZFOCwKKzB4OEZFRTY2NzgsIDB4OUY0QUJBOUMsIDB4NkE2QjIzRTEsIDB4RkVBNzA3N0YsCisweEM4MzVGNzM0LCAweENBNjc4MDdDLCAweDFCRkJFQjQ5LCAweEI4QjFFODQyLAorMHg2QTg1MDYyMywgMHgwMDFDMUU4RCwgMHg3ODJBQzAxRSwgMHhBMjhBNzJEOCwKKzB4NkNENjZGQzEsIDB4NzdFRjZGMTMsIDB4RkY0MEQ3Q0YsIDB4NEExNjNERkIsCisweERCMjFBQTg5LCAweDI5RDAzQTlFLCAweDNBNEQxRDU3LCAweDdBODlDREM5LAorMHhDNTYyM0UxMCwgMHg4QTQ0NDc5OSwgMHgxRjYyMERGNCwgMHhGRjg3Njc1OCwKKzB4QzlERUVGMkUsIDB4N0Y4NjkxMUUsIDB4RTMxOTYwOTMsIDB4QTAwRUI0MjIsCisweENEQjE3NDNGLCAweDRBQUQxOTg4LCAweDcwMTY3NzAwLCAweDcwNTk1QzVGLAorMHg4RTY0ODAxMywgMHg0MDFEODc3MCwgMHhDNzYyRjBFNywgMHhEQjc3NjkyNiwKKzB4MkJEQzU1QjMsIDB4OEY0QUQyQzEsIDB4MUEyRUVCNTAsIDB4QkQ0QkYyQTQsCisweEE0M0ZGRTkwLCAweDc1MjkzNUU3LCAweEIwMkM3ODAxLCAweERENENEM0RCLAorMHgzODE1QzM5NCwgMHhBRjQyNzY5NSwgMHg3NDU1QThGOSwgMHhDNDQ0QzdFQywKKzB4OUJDOUIyQzUsIDB4MDg0MjNCQTcsIDB4NUQ5MUFERDgsIDB4NTlEODY2REIsCisweDBBRDMyMjU4LCAweDdCQzM5N0Y2LCAweDBFRjdEQjU5LCAweEMxMDM0MzIwLAorMHg3OTA3MzQwNiwgMHg5OTFBMTJCOSwgMHg5RDY3NzZBMCwgMHg2MzQ4QTVFQiwKKzB4QkQ5OENEQzQsIDB4ODFBNkM1QzUsIDB4NzZBM0FCQTYsIDB4RkE5Q0RGNzcsCisweDk3NzcyQjU5LCAweEQ5ODdFNDJCLCAweEE0Qjg5M0Q0LCAweDYxRjc4RTM4LAorMHg4MjU2NzY5MSwgMHhDQjkxQ0Q1OCwgMHhFRUZBNjlBRSwgMHhGN0Q1MTE3OCwKKzB4QTQzNkM1NzgsIDB4OTlFODZFMDgsIDB4QThDM0IxNkIsIDB4RDYwOTA1NEYsCisweDFFMEFEQ0U4LCAweDVERjZFRjIwLCAweEVCM0NDNDVCLCAweDlGQUVBMjRGLAorMHg5N0Y1N0YxOSwgMHg2NkUyNzEzRiwgMHg0MkE0MjNDMywgMHgyQTIxQjE3QywKKzB4NkE0QzZCNDAsIDB4RkEwRjRGMkIsIDB4RDFGM0Y2NEEsIDB4RDBBQUZBNTAsCisweDc2N0QzQUMyLCAweDgzN0U2MjZELCAweDNCMjEyNzlDLCAweENBRTE4ODU1LAorMHhGQThDQTM4NSwgMHhBOTFCREU0NSwgMHgxQTk1MzMyNywgMHg3MzM5NDhDQywKKzB4MTU4QjhDRDIsIDB4OTA0QUM0M0QsIDB4QTZCQzhGODIsIDB4NTVGMDI3REEsCisweDk1QjZCQjMyLCAweDkyNjVGRjgwLCAweDhFRUYwRDI0LCAweDI4RjY3OTZFLAorMHgxRDczNjcwMCwgMHhCNjIxRDRENiwgMHhBQjJGMUE0QSwgMHhFQ0Q3REI4MywKKzB4MzVDQUQ0MTksIDB4NjA2MDQ5MTcsIDB4NURFNTEzMzUsIDB4QTNEN0UxMjIsCisweDY4NUQwNEQ0LCAweDQ5NDczOUQ0LCAweDAwNjA3MjJDLCAweDU5MTQ5NzE4LAorMHgwM0M5RjE0NCwgMHg0MzMyODgxOCwgMHhCQjFBRTE4OSwgMHhDQTdCOTI1MCwKKzB4QzgzNTY2NkQsIDB4ODM5NTAyMjAsIDB4RDc3NDQwNUYsIDB4RjZGNEZDQ0UsCisweDBFMzg3OTRELCAweEFGMTg0QTdFLCAweEVGNjZFMTVCLCAweEEwQzJBNzRGLAorMHg4NzYxMTJENSwgMHg3RDY4QzlDRiwgMHg4OTAyMDExQywgMHg2QUIwRTEyOCwKKzB4MkE1MTU1MjAsIDB4QTk5RDFEQTAsIDB4OUVBQ0VCNEQsIDB4QjY2OUFBOEYsCisweDZGOTZEQ0UyLCAweENGRUI1Q0RGLCAweDQ2RUIzNkJELCAweEVEREY4MzE3LAorMHg0RkEzMEMzRSwgMHg5NTQxQThBMSwgMHhBNUY3NTUzMywgMHhFRkUxRkVGNiwKKzB4N0YyMUI0ODEsIDB4REExMUQ1RUEsIDB4NjQ2NDIwNjksIDB4MDgzRDIxMzcsCisweERGNTA4NzI2LCAweDhGNkNDQzRCLCAweEM1NDEyRDBBLCAweDZBOUY2QkVBLAorMHgzRTNDQzU0RiwgMHgwNzhCQkIxRSwgMHhBNjA0NzQ2OCwgMHhGMUZBMzlDMiwKKzB4MjYxNDM0MzUsIDB4OTAxMzJFQjMsIDB4NDIxNjU4MEMsIDB4RjY3NzNCOEMsCisweEE2QjE4OEJGLCAweEUzQjQ5NTIzLCAweDg5RTQ1NjNGLCAweEQwQjE2NTM4LAorMHgyRDkwNzlGRCwgMHg2OUFCREUzNiwgMHg2NjlBQzVFQiwgMHhEMDYxOEREOSwKKzB4NTA4MEJGRUYsIDB4QURDMDU2RDYsIDB4NzI0MDJDOUMsIDB4MEFFNzlFMDcsCisweDhENkRGNDhFLCAweDA1MDI4MzdFLCAweDc5QkExN0FELCAweEU0ODcxQzg5LAorMHhDNDU1NENENSwgMHgyM0ZDQjJBNCwgMHg2NDZGQTk5OSwgMHgyMTJBOURCOCwKKzB4QkQyM0RGMEEsIDB4ODkwQjVGRTYsIDB4QjVEMDMyOTIsIDB4OUZBM0ZENTksCisweEQ2MTJGOEIxLCAweDYxMTM2NUZCLCAweDdFN0M5RkFCLCAweDAyNDE5NEQyLAorMHg0NkMyQzYxNywgMHhBRUIwRkFEOSwgMHhBRTVEM0E3RSwgMHhFQThCMEFCQiwKKzB4NzYwNzMwQTQsIDB4NTA0NDNFNzYsIDB4RUNBNjQzNDEsIDB4NTM4RTUyNTYsCisweDhBODUwNUY1LCAweEUwRTREQzI5LCAweDEwNURDNTY0LCAweEM3M0Q5M0Q5LAorMHhFM0YyN0M5MCwgMHg4Q0MwMUZDOCwgMHg0MDBEMEY3NiwgMHhEQ0QwMTEzMCwKKzB4MUUzNDE2RDQsIDB4NEM2MTJFMDMsIDB4MEJGRTdBNUMsIDB4RkRCMTUzMzQsCisweDUzMjZBNzdGLCAweDk5NTQ5QkRBLCAweERERTkwQkFCLCAweDkyMEJEODcyLAorMHhDNEI0RjVERiwgMHg3QjM5QkFDMiwgMHg3NzdDNjY5NCwgMHhCNDk3MTEwMywKKzB4OUU3ODA2QTEsIDB4RDMxNDFGMkQsIDB4MkI0MEJBRDAsIDB4NzRBRjI0OEYsCisweEQxQUVFRDQzLCAweDJGNDUzNzM2LCAweDE4ODAxMDRFLCAweEY5Q0Q1MDJGLAorMHg3NjkxRkU1OSwgMHgzOUMzRkVDNywgMHg3MkVBN0JGMiwgMHgwQzk0QkFCNSwKKzB4MzVENkY1MDksIDB4QUU4NkFDOTYsIDB4MDYyNEMxODEsIDB4QTY5REY2OTksCisweDU5OTFGQ0UzLCAweEFCMjBENEYxLCAweEYzMEYxQkM5LCAweEIwOTRDRjYyLAorMHhBM0I1QTczMiwgMHgzQkM4QzMyRiwgMHhFNzcxMDM3MCwgMHg0MjlBOEQ5NiwKKzB4RDg5MTNBNDIsIDB4Q0ZCRDBFNEYsIDB4NzEwQjcwNzgsIDB4QzY1MDFFOTMsCisweDI0MTIyNEFGLCAweDk3OEQyMzIwLCAweDhFRjEwNjRCLCAweDI3M0ZBRTA3LAorMHgzMTZFQzAyQywgMHhCM0MxNkMwQiwgMHg4MjQ5QzI0NSwgMHgyMUFEMTFDQiwKKzB4NjI2NUZFNTcsIDB4QTlGMUQ1RkMsIDB4MEI1MkYxQ0QsIDB4MDM4MUQ5ODMsCisweDI5MzFENkIxLCAweEQxMjZDRDk0LCAweDY5RDk1MTk3LCAweDdDRkI2QUQwLAorMHg0NkU2RDUwRCwgMHhFNjBCQ0JEMiwgMHg3MkZCQjQzNiwgMHhDOTcxQTRDQSwKKzB4QTU4MEI5QjksIDB4QkM4MjM1MTQsIDB4NUQxNUE4NDAsIDB4ODdBOTE2MjIsCisweDYzNDkwRDEzLCAweDI3NzE4OUE4LCAweDIyQ0EyRURDLCAweDFDNTY0NTZELAorMHgxQjVFQjgzNiwgMHhEOEJCRjJFQiwgMHgyMEY1NkRGQiwgMHg5OTMyMUU0QiwKKzB4OTIzOEI3ODMsIDB4RTVFNUQwODUsIDB4QzgxREFBMTEsIDB4RUY4REQwMzIsCisweENFQzI4NjQ1LCAweEZDNDBBQUE1LCAweEJGQTVGQzY4LCAweDFDMkNGN0M3LAorMHhDMERGRDE5NCwgMHg1QUI3MzBEQSwgMHhFM0ZCNTZBOSwgMHhBMEFEMDBFOSwKKzB4QjdCQTJFMkUsIDB4NTc5Qzg3MjIsIDB4MDRBQTA3RkQsIDB4RjU1QzZDNUMsCisweEU1NkNENkRELCAweEE3REE1MTAwLCAweDJBNkJBMUU1LCAweDlCN0U1MTA0LAorMHg4MTQxMDQyMCwgMHhEQzYxMzBBOCwgMHgzRUM4OTM1QiwgMHhDQzJFQzc4MiwKKzB4MTQyMzQ0RUYsIDB4RjAxNkUwQ0EsIDB4QTNBQ0ZBOEUsIDB4MDE5QTcwMDksCisweEEwREFFQzVELCAweEZBNTAzNTY1LCAweEM5MDc3OTRFLCAweDc3QUE0RTY5LAorMHhCNDVCN0U1NCwgMHg5MjlBMDU2QSwgMHg0NkFBNEFFMSwgMHg1NUU1NkVERiwKKzB4RkREOUQ3MjYsIDB4MzU3NDRENUMsIDB4RDY4NTQ3MDAsIDB4OUE2RTFFRUUsCisweDBCMDBGNkZCLCAweDZCRTY1QkZCLCAweDlDRjk4REUwLCAweEQ4MEFDRTY2LAorMHgxRTUzMDBFNCwgMHg3NDUzMzhERCwgMHg0Q0I5MjVERSwgMHhCMzY5QjBENCwKKzB4N0E1M0E2MDYsIDB4RDJCOTZFNTQsIDB4ODhGOTZCMzAsIDB4QjcyQzNFMTksCisweEMyQTQxMTc3LCAweDYyMDZGODc5LCAweEMxRjZDRDc4LCAweDg3OURBNzRGLAorMHg3NjNGOTQxNywgMHhEMTA5Qjc3OSwgMHg2QTU4QjM0QywgMHhEQ0Q3QzIxQSwKKzB4MUIwQTAxNTQsIDB4NDVFRTNBOUMsIDB4NjJDNjAxNjEsIDB4NzlFNDcwMjAsCisweDQyMjUwQTM5LCAweDlFMkMyQzU5LCAweENFNEY2MjA2LCAweEMyOTcwMzg2LAorMHg5ODNDQzJDMywgMHgwREFGMEE4NSwgMHgzODg2MjZEQSwgMHgwNkE1NkQyNywKKzB4OTIyMzIwM0EsIDB4OTZFMDE0OEMsIDB4MjJGMEQwNTIsIDB4RDVGMUFBODgsCisweDM5NEJDOEI5LCAweDAzQ0Y1OEZBLCAweEMwQjEwNzNDLCAweEMxNkIzNUM3LAorMHg3QjdDRjlGOCwgMHgyRTNBMjRBNSwgMHhBMTkwODlDOSwgMHg0MjIzRkFFOSwKKzB4Nzc1MUQ5NzcsIDB4ODAyRTcwNjIsIDB4NkQzNjUxRUYsIDB4MzlFOUI1MkUsCisweDk0NkQwN0Y4LCAweDhFMkVBRUI3LCAweEY5Mjc5QTY1LCAweDE0REVFOTExLAorMHg4QjkyQTE0OSwgMHg5NjExNzU2RSwgMHgwNjdERDIyRCwgMHg1OTkwNzk2NywKKzB4QjM0MTdFM0MsIDB4M0I3MkFCN0EsIDB4ODI1RDg3QzcsIDB4Q0U1RkE4NTIsCisweDVEODhDNUY4LCAweEU3OTJCRjY2LCAweDI4REIzQTRBLCAweDExOENBM0EyLAorMHhDQzg2Mjg0RSwgMHhBMEFDNEFFOCwgMHgzMzM5NEI3MCwgMHg5NzRGOTZDMiwKKzB4ODZBREQzQjUsIDB4Qzg3Mjk1QjksIDB4MTQ0N0QyNkYsIDB4QzlFQ0FFODAsCisweDEwQ0EwMUQ3LCAweEUwNEVDQzY4LCAweEFFNTY1OTdFLCAweEFBQTEyNDhDLAorMHg4MUMzNTQ2MCwgMHgwMDg3Q0E5MywgMHg5NDNBQUJBMiwgMHgwQUZDQkZBQSwKKzB4RUE3N0Q1QUIsIDB4MDIwRDM2RDYsIDB4RjFDQ0JCQjYsIDB4OERGMTQyNkYsCisweEFFNzI2RDk2LCAweEE2RTRDOTE1LCAweDU4RjE1RjkxLCAweDVCNjk2RDZGLAorMHgwMDA0MkIzMCwgMHhDNkFDOTBDMywgMHhCRDhFMDE4NywgMHhFNzNFRDJFMiwKKzB4Q0VFNjRDRjYsIDB4NDhCNTY0MzYsIDB4QTMzOTk0Q0EsIDB4QjNFM0I3QUIsCisweDA2MEQ1RTE0LCAweEMxQjE3NkM2LCAweDRBNzZDMzkxLCAweEQ3QzhEQjFELAorMHgzMzNFNDk5OCwgMHhDMjBCQUM0RiwgMHg1MjNCRTNFMCwgMHgyMzdFODdCQywKKzB4RTZDREJFQzAsIDB4QzUwNkYxOUMsIDB4MjYyQzAwMzksIDB4N0Y4NUE0QUMsCisweDQ2MTYwNjkzLCAweDJFQTFCQzM2LCAweDRDQUMwREYyLCAweDAwNjZCODNGLAorMHhCQ0JDNzc4RCwgMHg3RjRBQjUwNywgMHg5OUNBREIyRiwgMHhDOTU1MjBEMCwKKzB4QzVDQkYwNjcsIDB4OTAzRUNENjgsIDB4RjVEN0IwRkMsIDB4MDgxOThDOEYsCisweEExNzg3OUVDLCAweDE4QzI3MjNELCAweDVBNEQ2RDM3LCAweDA4MDE5OEI2LAorMHgzNTI1MTg2QywgMHhFRjhCRTE0NCwgMHg0NEIwNTg1MSwgMHgyOEI1MDI1QSwKKzB4MEZERjA4NUQsIDB4REVCMUYyNDksIDB4QTdDMDBGNDIsIDB4NzYxNEE3MzUsCisweDNCRUJGNDY3LCAweDc4NzFEMzA1LCAweEQ0RjYzODA5LCAweDlEMDQ0MDc5LAorMHhFNTg1RDNENiwgMHhBODk5NTJGMywgMHhGNDJDMkI4RSwgMHgwNDE3OURBNCwKKzB4MDBBNkNFODcsIDB4OTZDQTkyQjgsIDB4OURGMkIxNTYsIDB4M0VDRjE4QkMsCisweERFMjUwOUNGLCAweDVDRDg1RkNBLCAweEY4QTdDRUVGLCAweENCN0RDMjVFLAorMHhGMjg0NzQ3NCwgMHgzNUI1MDFEMSwgMHgxMzdCQkIzRSwgMHg0NTFFMUJCOSwKKzB4RDM2MEQ4MTEsIDB4NzkyQjM0NjQsIDB4NEJGODlBODEsIDB4QTdFOUM0NTAsCisweDYyOEJDQjBDLCAweDJBRjcwMzdELCAweEE0NUY2MjhFLCAweEYwRUM4NzVELAorMHg5Q0UzNjc3RCwgMHgyQ0QwRUE1OSwgMHhBNTBBMDIxNywgMHg4QkE0NURENywKKzB4MTczNUFDRjEsIDB4NTgwNEM0RDksIDB4RTYxOUIzNTIsIDB4OTQ4RjQ0QTgsCisweEE5QkY1QzdGLCAweDYxNEQ0RjZDLCAweDZEOUZDQTc5LCAweDI5NzE3QjBDLAorMHg1MEJGMkQ1QywgMHhENTg0N0I1MiwgMHgwRDRGQUFBNSwgMHgxQUFCQ0E1RCwKKzB4Nzc5Mzk5RTAsIDB4NThBOTBDRDYsIDB4MzdFQzI2MTUsIDB4NjFCNjhDMDcsCisweEM0OUY0QUVFLCAweEZBQzREODk3LCAweDlDNjhDQzZELCAweEJCMzM1MkY2LAorMHhGOTMzNDM2RCwgMHhEMzEwMDc4RSwgMHgyRkJGQTE3QSwgMHgzRDgzOUM0QywKKzB4MTg2RTY5RUYsIDB4Q0JFN0NDNkEsIDB4NzQzNDIzMUEsIDB4ODBGODEzMEIsCisweDU4Q0Q3RUEyLCAweDJFNDZENzE0LCAweDM2NzI4NkUyLCAweEE2RTIwNDRELAorMHhDMkFCQzUwQSwgMHg2RkVEQzlDNCwgMHhFMkYyNkYwMywgMHgzQjAzMEQ1MiwKKzB4MzY3NEQ4RTcsIDB4OTA5NkRGNzgsIDB4OTA5MDI4OTIsIDB4NDRBMzIxOTAsCisweEQwOEQyNjQ5LCAweEVGRTBFRDBBLCAweENFMUJGNEU5LCAweDYyQzE5NzUzLAorMHhGQkYzRDFBOCwgMHhENEFBNTM5MCwgMHg0QjMyRTc3RiwgMHg5ODk0RjA1RSwKKzB4NDFCOURCQkUsIDB4RTlCMDk1NjEsIDB4NDZDODgzQTAsIDB4QURENUQ2MEYsCisweDY5Q0U1QkJFLCAweEZEMjlDQ0YxLCAweDJGMjA5MzcxLCAweDRDNjcxNkU5LAorMHgzMUU5QTA5RiwgMHgwNDA4OTc5NSwgMHhCOUVGOTAyNSwgMHg5N0M2MjY3RCwKKzB4NjM4MjMxNTAsIDB4M0FCMzQ2QkEsIDB4RUQzRTA1NzksIDB4ODVGQzcwNjIsCisweDM3QjM1NzYxLCAweDRBMzJCNkNELCAweEMzOEVCNDc5LCAweDIwMzY0MkNDLAorMHg1NjhGQ0FENywgMHg2N0Q5MkI1RCwgMHhFNTFCOEMzRSwgMHgwMjEwNDA3OCwKKzB4MDI2QkM2MDcsIDB4NUEwNkNEQTcsIDB4RTI3NDM1RDAsIDB4QzdDMjBDRTcsCisweEZFQTc0MDIyLCAweDc3MzEwMDc2LCAweDM1QzZGOTUzLCAweEUxQjE5OUM1LAorMHgyNjJGMTM5QiwgMHhGRDJGRTJDNywgMHgzRUVFMDJFQiwgMHg5MTVBODczRiwKKzB4MkRFNEFCOEUsIDB4MjQyMURDMTUsIDB4RDFERDBEOUUsIDB4REUwMkI1QUQsCisweDE1MUM3NkNGLCAweDc5OEI5MEI3LCAweDgyRURERjRDLCAweDc5NUUxOENGLAorMHhGMDlDRUM1QSwgMHgwNzBBREY4RiwgMHhDRENGNTIzMiwgMHhENDk4RDQzQywKKzB4QjRGQzI2NjIsIDB4MjU2NzhFNTQsIDB4NUQyMDA0ODIsIDB4QzMxRjIxQzksCisweDM1RTVBRjI5LCAweDhDQzBFNjAzLCAweDk5NTM1MUFELCAweEQ4RUI1NEY2LAorMHg1NjRFMzVEOSwgMHgwQzEzRTMyMSwgMHgzNENGQTMzRCwgMHgzM0QxRTVGOSwKKzB4MkVBQzk3NDgsIDB4RkZCOTUwRDYsIDB4MjAzMjIwNkYsIDB4NEY4NzFBRTMsCisweEJENDY0QzYxLCAweDA2MzU2RUEwLCAweEExNUEyOTBELCAweEE3ODQ1NkQwLAorMHhEMkY0RUU4OCwgMHg0RDgzNTkwOCwgMHgxNURDODdCMywgMHg3OUVEQjZDMywKKzB4QUVBRjBGOUUsIDB4NUMzRTdFRjksIDB4NjM5QTA5OUUsIDB4RDM3NUQ4REEsCisweEI3MTg1MTBCLCAweDA5MERGOTY1LCAweDlDOEEzNjJFLCAweDI1QUQxMEJCLAorMHhGOUE0MkJFOSwgMHg4QURFM0RGMCwgMHg1NTI3NDI0RSwgMHgzMDFGMEQwRiwKKzB4MkY2OTFDOUEsIDB4NTM0RkUxRkMsIDB4N0Q0MDYwMTYsIDB4Rjk4ODIwQTIsCisweDREMjA0ODcxLCAweEVEMTQ1MTczLCAweEQ2N0VDRTlBLCAweDM1RjlGOTkwLAorMHg4RUQ0RDc4NywgMHgxRjNGNDZFMSwgMHg1QTY4RjE3MSwgMHg5QTlEMjhCMCwKKzB4RTcyNkJENUMsIDB4ODExOTIyOEQsIDB4MEFEQkE0RDIsIDB4RUEyNDMyMDQsCisweEU1MjNDMEQ2LCAweDI2MUUzNjY0LCAweEIyRDEyMTFDLCAweEI0RDkyOTNBLAorMHg5Qzg5RDkyNCwgMHgxNUE2QTNBOSwgMHgwRDhDNkM2NiwgMHhFQzA0QUQzNiwKKzB4MENERjBGOTgsIDB4OTI2MkM3REYsIDB4OEVFMEUwOUIsIDB4NkI5MjlFRTksCisweERDQzcxM0JDLCAweDc1RkQzNEZGLCAweDI3ODRFNjk0LCAweDIzQzIzMDQ0LAorMHhCN0IwNEYwOSwgMHhGMTBCNzUzRSwgMHgyRUM3NzREQSwgMHg0NzBCRTcyRSwKKzB4MDU0NTEwRTksIDB4OUM3RERGMTAsIDB4MTQ2NkMyNzcsIDB4OUY1MkY0OTMsCisweDdGMjk4NjA4LCAweEYxQkExMEQzLCAweDg4NDdBMzE5LCAweEVFOEE2M0NBLAorMHg4RTY0QjM0RSwgMHhFQkI2NjkzMywgMHg1NzVBREIyNCwgMHgwNDFCRkQ3NiwKKzB4NzI3RUQzNjQsIDB4MDBGNEEwMDgsIDB4OEY1RURBOTIsIDB4MjE0Nzc2MzcsCisweDBCMzYwNjE3LCAweDU2REM4OTc4LCAweDI3Rjg4OTQ0LCAweDY5Qjc5OUVGLAorMHhFQTFFOTQzQiwgMHg2RkRENjBCMCwgMHhDRTJBRDg5RiwgMHhCOThDQ0Y0MywKKzB4MkEzNzk2QkYsIDB4NEREMDI1MzUsIDB4QzZCNTI0RUEsIDB4NkIxNzMzNDEsCisweERDRTBBNDU3LCAweDkxNzcwNjQ2LCAweDU3QThEMTM4LCAweEZDMjE4MzMxLAorMHhEQzZCNzEyRCwgMHgxNEMwQjNCOSwgMHgzMENBMDlBRCwgMHg3NTlFQjk0MiwKKzB4QkM5NjM0QUIsIDB4OEY5MkE3RTUsIDB4RjdGODVCNTMsIDB4NkM4MzFCM0IsCisweDU2QTc1QjE4LCAweDQzREI5RjFDLCAweEY4MUZDMjEyLCAweEI4RUI5MDI2LAorMHg3OEE3NEI1MSwgMHg4NzA2NTVFMywgMHhBMTdCNTM2RCwgMHhCREU4NjZDRiwKKzB4RkM2MDlGMTEsIDB4RjM0QTcwMTYsIDB4N0M0RkQ0REQsIDB4MjM2MzEyRjYsCisweEI1MDUyMEE4LCAweDRCRUVBMkMzLCAweDJCNjkwQkEzLCAweDE4NzAxNjY3LAorMHhCRDc5MUZBOSwgMHgyMzZEMzZDRiwgMHg0OUU1NzZDQywgMHgzMTZBNzdFMSwKKzB4OTNFOUIwQkYsIDB4NTI3MTU2MDMsIDB4ODNCOUFBRjIsIDB4MEY4RjJBODAsCisweEE4N0Y3NjRBLCAweEQyMDc5QkVCLCAweDQ4QTI0QUI2LCAweEFDMzcwOTUwLAorMHgzMDc3RkIyRiwgMHg0QkFGRjNGNSwgMHgxQTc5OTI2RCwgMHg4QjM2OTk1NiwKKzB4QUQ3OEY3MzksIDB4RUQ4OENFNDIsIDB4Qjk2QTdDMTUsIDB4QTdCQkEyRUUsCisweDQ3Q0MzMjMzLCAweDgwNERFOTYyLCAweEUwQjQzMUEzLCAweDRBODI1N0I4LAorMHhBNEIwRThFMiwgMHgyRkZDNDlCOCwgMHhGMENERjVFNSwgMHhGMDg5QzMyQSwKKzB4NDYzMjgyODgsIDB4RUFDQkMwNTQsIDB4QTQ4Q0I1Q0MsIDB4Nzc5OTY1MzAsCisweDgzQTRFMTg0LCAweDNDMkY0N0Q5LCAweDUxMDYxNzdDLCAweDMzRjFBNzg3LAorMHhBMjI2NkU3QSwgMHhFQkM0MjZDOCwgMHhEN0U4QUREMywgMHgyREY0MDQ3NywKKzB4RjlFOEQ3QkQsIDB4ODBCRDhFQUIsIDB4RTYxQ0U1NUYsIDB4RjZBN0VGNkYsCisweDVDNjdFMUMwLCAweEZCRDAwODhBLCAweDdFRDM3QjI0LCAweEY1QkZENThFLAorMHhDMjlDRkIwRiwgMHg2MUVDRTA4QiwgMHhBNzc2Q0ZEOCwgMHg5RTBGM0EwNSwKKzB4OEZDOEIwMkYsIDB4RkRGODI3MDIsIDB4MDI4QzJGMkMsIDB4MTY5RDMwOTQsCisweEU0QUEzMjI4LCAweEYyQ0QxNDJELCAweDlDNzA1NzRFLCAweDA1N0JGRTc4LAorMHg3ODJCOTAzOSwgMHgwRDAxMzExRiwgMHg5NzU1MjA1MCwgMHg2QTA5N0YyRiwKKzB4MUIzMjQyQjgsIDB4RjQzRjMyRkIsIDB4OTYwMDQyODcsIDB4QzNEQzA5MzksCisweDQyMTVBMEUxLCAweEFDRDFBMjhBLCAweDE4OTkzMkVDLCAweDlCQkEwNDc1LAorMHhGQTE1NEU1QiwgMHg0QjRFOEQwMSwgMHg0RDZCMThCMSwgMHgzMTU0NUIzQywKKzB4Qzg0OUM1MkQsIDB4NjA5NThCOUIsIDB4RTkyQ0YwOTAsIDB4QUMzRTFCNTgsCisweDI1MUQwMkEzLCAweEZBRUU0RjhCLCAweEIxQ0Y2Q0NDLCAweEMyQTBEOEIwLAorMHgwNTAxREY0NiwgMHhEMDM2OUQ5NCwgMHhGM0UxMTQ3OSwgMHgzOTc1OTlGOCwKKzB4QjkwMDY0RDIsIDB4MzQxRjZENTcsIDB4MzFGMDE0MUEsIDB4MkY4OTkwMjksCisweEJDOUVGNkU4LCAweDEzQjQ3MzQ3LCAweEI5M0Q1OUJCLCAweDU1NkU5OTBGLAorMHg1NzI3QkRGQywgMHhCQTlGNTEyMSwgMHhENjdCRTdDQSwgMHhCMTY3RTg0RCwKKzB4MkMwRUQwRkYsIDB4MjUxRkZENEEsIDB4Qzk4NzE5RjIsIDB4RDM3OUQ5NzYsCisweDhCM0EwQTlCLCAweDQwQkE1RjY2LCAweEU0MEE5M0U4LCAweDJGODlGQzA0LAorMHhGQ0JBRkRENCwgMHhGMjQyNDI3MCwgMHgxQkRCREQxNSwgMHg3RjE0NTlCMCwKKzB4NUFDQjZDNkEsIDB4RkEyMDcxOUYsIDB4MkYxNkZGQjQsIDB4ODIwRERFNTAsCisweDQ2OEFBQzE1LCAweDc4MTYxMzRDLCAweDk3OEQ5NTcwLCAweDY3NDVDRDZELAorMHhDMUU3NjhDMSwgMHgxNUUyNDNCNSwgMHhCQTMwQUQ2MSwgMHg0ODNGQjZGRSwKKzB4Q0FBMTdEMEYsIDB4MkY4RjA5NzQsIDB4MzRBQjY4QjQsIDB4QjNFODY0QjAsCisweEMxREEzODI4LCAweDVEQUQ0M0IwLCAweDcyRDEzQjgxLCAweDAxRjI3NEFCLAorMHg5QzA2NTFBRCwgMHgwRkMzMEMxMCwgMHgwRTdBQTNDQiwgMHhEQkU2QjlEOSwKKzB4RjQyM0I5QTcsIDB4NDU3QjRFMzIsIDB4NDBFOEUyNjksIDB4OTFEQTA0MkEsCisweDlEQkY0MUU5LCAweDMwOEMwRjJFLCAweENBQkZBQzBELCAweDBFMkM4NkIyLAorMHgxMTdCQzNDNiwgMHhFRUE1MzhGOCwgMHhGMzE1ODVERiwgMHgwREY1MDI4MSwKKzB4RUFBOTYwMUUsIDB4OEY0MDhBRkEsIDB4RjExNDRGOUEsIDB4QTJBQjJFQ0QsCisweEFDQjg4Njg1LCAweDZGNEVGRkJELCAweDgxRUVGODg2LCAweDQ2QjAyMjQwLAorMHgzQzA5RDkxNiwgMHg0RjBEQUY2OCwgMHg4MzM3QjNFMywgMHg5QTAxMUJBNiwKKzB4NEM2M0FDNjYsIDB4MkZDQzY2OUUsIDB4MEM3RDE1QkIsIDB4NTEyNzlEOUYsCisweEMxMzU0Nzc5LCAweEVGRjk0MEFGLCAweEE5NTZDQjM3LCAweDBEQjc5N0UyLAorMHhFNjY1RUU1NSwgMHg3OUFGODc5RCwgMHgyMUJCQzkwMiwgMHgzMEIyNjRCRiwKKzB4NDExQ0RDOTgsIDB4RTQ1MzM4OUYsIDB4NDdDMkMxOTcsIDB4M0U2MDE1RjgsCisweEY5RTdBQTJCLCAweEE5MzAyNDc0LCAweDA0QzY4ODhGLCAweDREMTE4QkY5LAorMHgwREI3QUFDMCwgMHg1MkEzOEVEQiwgMHg0REFCMjJGMiwgMHg3REJCNkVBQiwKKzB4RDREMTc4NTEsIDB4RkQ5NDQzMTQsIDB4NDBDNTgzOEMsIDB4QkE2RUIwRUYsCisweDlBQTI4N0E1LCAweEY2RDIzNkYwLCAweDQxRDlFMkJBLCAweDY5NjhENzc2LAorMHgzMUIxRDEyOSwgMHg0MkMzRjk2MywgMHgyN0NDQUQzMCwgMHhDRDYxQkY0RSwKKzB4MkM3REFCQUIsIDB4QTc4QTlDQzMsIDB4N0Y4NTZCNkYsIDB4QjZENDQ0QTUsCisweDkwQ0JCMzEyLCAweDk1NjExNzgxLCAweDQ5MTZENTMxLCAweEM0OTZDMzBFLAorMHg3MDZEMENCNywgMHgzNUQwMDY0QiwgMHhGRTI2QzM2QSwgMHg2MjExRjE0QiwKKzB4MkMyMzQwQkEsIDB4NTg2MzM1NjcsIDB4MDZCNkJBOEUsIDB4QTdFQzNEOEQsCisweDEwNzFCMENELCAweDM4OEVFRkE4LCAweDYwRDhGQjFDLCAweDVGOTlEMTQ3LAorMHg1MkNBNkVCRiwgMHhGQTczNjAyRSwgMHgwMzc2QzE1QywgMHgzQzkxQjU3RCwKKzB4OTM4NkFGMTcsIDB4MTRBMzVBMUEsIDB4QkRCNDJBMzksIDB4MEU4M0MyNTcsCisweEQ0QzVDNzc1LCAweEE2MDdGQTQ2LCAweDkxQjlBRDQwLCAweDc2MjNDNUQ2LAorMHhFM0Q1M0U2QSwgMHhBM0M2NjNFNywgMHg1QUQzOUJDRSwgMHgwM0I1ODM5NCwKKzB4Mzg4NjJDN0EsIDB4MDFENTBCOUYsIDB4RUFBQjM4RUMsIDB4QUIzREZCOEIsCisweDA2Nzk1Mzg1LCAweEIxN0Y0ODVFLCAweEUyRjU3OTE0LCAweEI3OUEzQkFBLAorMHgxM0RBNzg4NiwgMHg3MTM2QzdFQiwgMHg1RTc0OEFGNywgMHhEMzRGMTZGQywKKzB4OTY4RjY3MDEsIDB4OTlDNUQ3QkUsIDB4NTMwRjdGQUMsIDB4Q0RGNUQ1NjcsCisweEUzMURFMEQzLCAweENGOTNCQzY4LCAweDM0QzU3OEFBLCAweEEyMDFGNzYxLAorMHg1Q0I4REMwMCwgMHhDQTI0REI5OCwgMHhGOEFEN0U0RiwgMHg4MDhFQzQ3NiwKKzB4NjAzQkE3NTEsIDB4NDg5NTU1QzYsIDB4RjJBMDNGRjAsIDB4RDI0NjFFOUEsCisweDEwMkMzM0JFLCAweDc2NzM5MzNDLCAweEMxMUEyNDI0LCAweDZBMjNDOEM2LAorMHg2OTQ5OTgxMiwgMHgxOUFBODUxMCwgMHhDOENEQTc1RiwgMHgzNEI1MjE2QSwKKzB4RDg3Rjc0MjAsIDB4QzhDRURCNTMsIDB4OERGMTFCQTIsIDB4QjEwOTExQzYsCisweDNGMUU1OTU1LCAweEYwNzVGNEVCLCAweDE3ODc0RkM1LCAweDBENTU2ODVCLAorMHg1RUU1MjFFNSwgMHg0NkM3MjkyNCwgMHhGODU0MDIxMCwgMHg1RDVFNEM1QywKKzB4RTg3QTEzM0MsIDB4OTE2MzNEQzksIDB4MzZCNTRENUQsIDB4QThCNUQ0NDAsCisweDdEQjdENkM0LCAweDVGQTgyQzE3LCAweEFENjc5MDM5LCAweDg2QjNCODM5LAorMHhERjUxMjFCNywgMHhDMDhCNzY4QSwgMHgzMzhBNTEyRiwgMHhDRjlBNEY5QSwKKzB4NURFRkJCNUIsIDB4NEM5MzAxQjIsIDB4MDgwMjM3MDIsIDB4NUIxRDdFMjgsCisweEVDODAwNTA1LCAweDNBODY5RTgwLCAweDRDNTBDOEFFLCAweEIxQUU5MDY0LAorMHhBRkZBMzRFQiwgMHhGMkYwMDZCOSwgMHhEOEE5QTNEMSwgMHgyQzZDMjEzNCwKKzB4Njc3RUU2NDgsIDB4QkI2QjZENUMsIDB4QTI4NTEzNkMsIDB4NkM0N0JGNEMsCisweEFGMTU4REMxLCAweDBFRjc1RTJCLCAweDVCOUM3NEQ1LCAweDlCOEQ0QkUzLAorMHhFNDk1QkUxOSwgMHg1OTQwQjIyOCwgMHg1NUU2MjY1NiwgMHgzMjQ3RTA2MCwKKzB4QkY3MDk0Q0QsIDB4MUMxQUIzODAsIDB4RUNFQTIyNzUsIDB4QjZERDgyNTEsCisweENDQTM5REQyLCAweEFCODVEOTkyLCAweDI3ODE5N0QyLCAweEZCNkM5RkQwLAorMHhCRDUzQjQ1OCwgMHg4OUVGRTBFQywgMHg1MkEzREZGRCwgMHhBNkI3RkY3QiwKKzB4RkIwNDM2NDksIDB4OTNDOTNGNzksIDB4QUVCNENENkQsIDB4NzFEQjVDOTAsCisweDlFOERGRTkyLCAweDBGMUE1QjkxLCAweDU1QzVDRjVELCAweDFBMTg0N0FDLAorMHg4RDI1Q0Y2QywgMHg5MTRGRDMxNiwgMHgzOUZDRkUyMCwgMHhEOEY2NkEwNywKKzB4MkNERDNEQzYsIDB4RTQxNUFDNzIsIDB4M0QxQkQwOUIsIDB4QTgzMjJDNTksCisweEJEM0E4MjZBLCAweDJBOTg4QTQwLCAweEVCRDhCMURELCAweDlGNTNFRUVGLAorMHhERjU3MTgxNiwgMHhENEZDQ0RBRSwgMHhCODVBMUU1MCwgMHhCRTFBNTcxRiwKKzB4MEVEMDc1MzQsIDB4NEMxRTQ3MUEsIDB4OEI0RDM2RjYsIDB4MEUzODhGQzYsCisweDlFRDJCQzRELCAweDNFMkQ3RjcyLCAweDc1MkFDQTE1LCAweDg5NjBCNDhFLAorMHg1ODkyQjNENywgMHg3MEY2RjNDRCwgMHgyNkM0ODVFRiwgMHhDODM4MzlCOSwKKzB4RkU2QzIyNEIsIDB4MzU0NzIwM0YsIDB4RjczQUNBODQsIDB4MDY1RENEQkMsCisweDg5ODZFQkRDLCAweENENTlFQTE0LCAweEMwRUY1OEE4LCAweEM1NTg3MjI5LAorMHg0ODRGQkNFRiwgMHg5QjhCRjI0RCwgMHgzNTFDRjk0NiwgMHhFMTBBQTk3MywKKzB4MTc5MTk2NDAsIDB4OTVGRjdCMUMsIDB4ODJBQjY1RTUsIDB4MDcwQkNDOTgsCisweDBFN0NEQjhELCAweDM4REIyN0RFLCAweENBNTQzQzJCLCAweDAxMzFFQjQxLAorMHg4MzAwOTk2QiwgMHg4OEI2M0Q2NiwgMHgwM0FEQUMxRCwgMHhCMjA1QTg3QiwKKzB4RDhCREMwQzYsIDB4NDQzRjYwNzEsIDB4MkNFNjlEMkEsIDB4NkUxRTVBNTMsCisweDRFRkY5M0FDLCAweDcwMzIyNjU3LCAweDVDQ0REMTQ2LCAweDA0QzQzNUI2LAorMHg1QkYzQ0Q2OSwgMHg1MUUwOTExNSwgMHgyNTQ1REZCMiwgMHhBNTJFRjQ0OCwKKzB4OEQzODcwNDYsIDB4N0M0RjFGMjUsIDB4MkVGRkQ4QUEsIDB4RkQ2NDIyQjAsCisweEI4MkUyNkE3LCAweENGMDFDQzQ1LCAweDg4ODk5RUJFLCAweERCNjIxOTY2LAorMHhCQkExODIyRiwgMHhCMjY0QUFFQiwgMHgxMDc2RUFBNSwgMHhDMjRCMENENSwKKzB4NTRENTU0QjAsIDB4NEVDQTdDMDUsIDB4QzhDOUIwNTMsIDB4NzBBODZEOTcsCisweDRFMzI2NUNBLCAweEVBMjRGODEwLCAweDg3M0IxNzJELCAweDc5QTc0RDE4LAorMHhFQzNGNDlENSwgMHhEMTc5OTYwMiwgMHhBMjFBMjhCNiwgMHgzRkI5OUFEMSwKKzB4QzJEQjM1QjMsIDB4NjNFQzJFNTEsIDB4MTdFNDQ4OUYsIDB4RThFMTkxNjQsCisweDc5QUREODE5LCAweDEwRDY2MTU3LCAweDVGNjIxQTczLCAweDFDRDA2M0JBLAorMHg2NjY1ODE1RiwgMHhGQTBCNzA4MSwgMHg2RTBGQTQ3MywgMHgwQ0UzNTcxRSwKKzB4QjVFQUVGNDYsIDB4QUEwNENGNTQsIDB4MzM2NjgwQ0EsIDB4REFCQkZGMTEsCisweDIyNTlFNzk3LCAweEI1N0I0NDcwLCAweDExMUVCNEJGLCAweEMxNzFENDJCLAorMHg1ODg5QTdBNCwgMHg0MTlDQ0IzRSwgMHhCRUExRjM2NiwgMHg0MUZFNDE0QiwKKzB4QTY1Q0I4OTgsIDB4NkMyODM2M0EsIDB4OEY4MkZDODQsIDB4REJFRDVBOUMsCisweDREQkYzNTI2LCAweEYyRjM0RTY2LCAweDlEMkM5QjExLCAweDBDMEQ0REZCLAorMHg0REJGNzlENCwgMHhBMjU2RTg2RCwgMHg2NDA3Mzc2QywgMHgzRjNFOEFGRiwKKzB4NDc0QjM1OTMsIDB4RTU1OTY1QzgsIDB4Q0IyMEQzNTgsIDB4MEM2NzFBOUIsCisweDE2OUY4MzQyLCAweEQyRTFDOUU3LCAweEJEREJBQUVCLCAweDkzREYwQzc1LAorMHhGMjc3MDdGNywgMHg1MTA4MzA1QiwgMHg0RkYyQzA2MCwgMHhFQjlDMDhERSwKKzB4REYxMTAyMEUsIDB4RDIyNzEwNDYsIDB4NkQxQkZEMjcsIDB4RUQwMjBDREMsCisweDJDMjI2NTlCLCAweDY5MjA1MEQ5LCAweEQxNEJFMjkxLCAweDNFQkY4RTg2LAorMHg4MzQ0QjYyNSwgMHg3ODQwQjkxQywgMHhCNzAyQkQ1RiwgMHg0OTM1RDMxOCwKKzB4MDFBMjIwMTMsIDB4RjJBMjBCMDgsIDB4NjUxQTFDMzgsIDB4MDA0RkU2MzMsCisweEU1MURDQzA2LCAweEY1Qjg2MTM4LCAweDlGQkZGMTE4LCAweDZGN0IzQ0Q0LAorMHgwMjg5MzhCNCwgMHgwNzFFOTZBRSwgMHhERjMzREM5RSwgMHg3OTAwMUFDNywKKzB4N0I1RDIwRkMsIDB4M0YxMzc3OTQsIDB4ODExNjVCMDQsIDB4OTczRjhGRDQsCisweDBBRTRDQkY1LCAweDdDNDgxODBCLCAweDRBOTZCQzg5LCAweDU4MDY2RTc0LAorMHg4NjY2OURDNiwgMHhEQzU1QTIxOCwgMHg4NThDMzEzMCwgMHg5OUFFQUM5MSwKKzB4MjY5ODNGQzQsIDB4RUU0RDRGMDYsIDB4RDhENkQ2NTcsIDB4MThFRjI2MkIsCisweDM3NEE2MjBGLCAweDg1OTk1RjlDLCAweENDODE0QUMxLCAweDM5RjQ4N0UwLAorMHhDNjI4MTc3QiwgMHgyRkFFMkMzOSwgMHg2NDI1MjVBMiwgMHhDMTQ3NEYyRCwKKzB4QkM3Q0Q0OUUsIDB4RTgxRTEzRjcsIDB4ODNGNDJCREIsIDB4OEFCN0Q5OUEsCisweEE4MDQwQjExLCAweEQ4QUE2OEVDLCAweDk4M0IzNzM5LCAweEVFNDJFQ0RCLAorMHhDOTUxMzQ5OCwgMHhDQUEwNkExNCwgMHhFNDc4NDA5NCwgMHhFNkJFQkI5RSwKKzB4MTNCRTgwMTgsIDB4NTlFM0Q1RDQsIDB4MENGMTcyOEYsIDB4OTYzNDEzQkUsCisweDMxOTUzM0I3LCAweDE0NjYyQUJFLCAweDMzNjNCNDVELCAweDU5QTk5Njg3LAorMHhCQkIwRkRBNCwgMHhDREJCOEIyMSwgMHgwMjQwRjNCMSwgMHgyMjZEQUMzQiwKKzB4MzBFMUM0OUUsIDB4NzZFMDc2RDcsIDB4NEI5MUM1OTgsIDB4QjNDNDZFMkYsCisweDRBNjU3Q0M3LCAweDY2QzM4NzVBLCAweENCQzZGQzU0LCAweEY4MzJFQkU4LAorMHhERDFFQUQzRCwgMHhGRUZEQUY4NSwgMHg4REU1MUI4OCwgMHhBRUFGRDVEMywKKzB4M0U0Q0VBODIsIDB4NTVGNDc5MzQsIDB4OUY4MzE0Q0EsIDB4RDAyMjBCQzAsCisweDVBQ0VGODFGLCAweDcxRkREOEU5LCAweDEzQTE0RUQ4LCAweDZGMUZDMUU0LAorMHg3NTA0NkEwNCwgMHhDNkM0RkRBRiwgMHg0RkZGRjcyNCwgMHhGNDRGRURENiwKKzB4N0UxQzVDQkMsIDB4Nzg0QzZCNEMsIDB4OEQ4NUYyMjAsIDB4MzhCNjVDM0UsCisweDhDOTkyMDUwLCAweDJERTM0QzEzLCAweDlGMkE0NTQ3LCAweDQ4RTU4RjY1LAorMHhBMjgwQjY4OSwgMHg2RjU0MEQ4QSwgMHgxMEI2MUIzOSwgMHgxQzhBMjg0OSwKKzB4QTczMTYzNTgsIDB4REJGQjc4NjIsIDB4MTgyQzU1M0QsIDB4OTJGMDQzODksCisweDFGRTdCQURELCAweDZBNzI0Q0JBLCAweDk3MEJFMDIwLCAweDkzNzYwMDU4LAorMHgyREY5RTBBRCwgMHhDRkYxRjhCMSwgMHgxNzBEODEwQSwgMHg0NUY0RTZBMiwKKzB4MzdBMEU4RkQsIDB4ODZEMTFDNkQsIDB4NEYzQzZBM0EsIDB4NEIxNDQ0NTIsCisweENFOUI4N0ExLCAweDdDMDhDMzBELCAweDlDQjlCMEFCLCAweEQ1NUYyQ0M1LAorMHhGRjk1MTgwRiwgMHhGMzU1MDVCRCwgMHhFRDVCREI5NiwgMHg4NUNBMkU0MSwKKzB4ODcwOEIyNjQsIDB4RDYwNzk3MzQsIDB4Q0E3NkFCM0QsIDB4RkQ2Q0RGNEYsCisweDlBQUI4NDBCLCAweDkyRDNBNUY3LCAweDkzQTkyQzM4LCAweDA0MTlBQTdBLAorMHgxRDUwMDA2RSwgMHgxMjZGNDhGRiwgMHhBQ0RBNDEyQywgMHgwMTEzOTQ1NCwKKzB4OEUyM0M0ODYsIDB4MDFENDRGNTEsIDB4N0E1RjZGMTAsIDB4Mzc3RDRENUUsCisweEI3ODRFNzJGLCAweEE5QUM5MjVGLCAweEI5QzY2Qzc5LCAweDA1NzMzMUU2LAorMHhDRkYwNDBFNCwgMHg3N0U4QTk2MCwgMHgzNUUzMUVFQywgMHhFQjgwN0E0NCwKKzB4ODU5NEZGRkMsIDB4RDI3NjI5QjcsIDB4NURERjUyNkUsIDB4QkNGMkY0ODQsCisweDg4ODA1MDEzLCAweDQxMDQ3ODUwLCAweEI4NTc0RUNELCAweDNFMTUwODJGLAorMHgzMDlDMTZEQywgMHgyOTdCNjkwNCwgMHgzMEMzOUVDQiwgMHhEMjBCNjFBRiwKKzB4NTFBNTc4QUYsIDB4NEUwRDI0QTksIDB4QzYxRkJFNUYsIDB4N0E4OUY0QzYsCisweDk0MzIyOTlELCAweEZFMjYxQjk1LCAweEREMUZDNENBLCAweDA0NEJGQjkyLAorMHg0MUJFNTZDQSwgMHgwQTJCNjgzMSwgMHhFMTM1RDc1RCwgMHhBQjJEMDBBMCwKKzB4QjQzNzQwODAsIDB4RkFBNkRCRDAsIDB4QTcwNEM0QTksIDB4RDgxMzg1QTQsCisweDUxNTMzMzEyLCAweEVENUVEQUY3LCAweEU0RURGQUVCLCAweDc0QjdEQUZFLAorMHg5RDgxMEFBNywgMHg0MEI5MTgyNywgMHg2NTIxOUJDQiwgMHg3NTQzMUMxNiwKKzB4OTREOTIzRDMsIDB4MDBCN0FBNEUsIDB4QjhBODhGREEsIDB4OTI3Mjc4RDcsCisweDdBMjM3Njk3LCAweDQ1QjE0MDk3LCAweDJFM0E1NjJGLCAweDkzMDAzMzIyLAorMHgwQjg4QTVGRiwgMHhEMTNENEFERCwgMHg2RDdCNzU3OSwgMHg3MkQ4MzRDNCwKKzB4MEJDQUEzNjEsIDB4QzAyRTAwQjgsIDB4MTUwMjM1NTEsIDB4NDgxQzVFOTMsCisweDAyRTgxQTE2LCAweDhBODQ2QTMzLCAweDEyMzlBOTcxLCAweDk5NDgxOEI0LAorMHhGQzNEQkI2RCwgMHg0M0M4RDJGMiwgMHhFM0FFNTQ4QywgMHg0MDgwMzJGMSwKKzB4MDJCMDU2MzYsIDB4RTM2MUE2MEMsIDB4RkUyQ0EyOTIsIDB4MDYxRDIzNzQsCisweERCMjg1NTU2LCAweDcwNjI3RUE0LCAweDdGQzY0QUYwLCAweEZFMTAwQjZELAorMHg3MUFFQjNGMiwgMHhBNTY1QTQxMiwgMHhBNjk4NzMxRiwgMHg0OUREOTc2NywKKzB4QzM2MjdFQkMsIDB4NzVGQjJEQkYsIDB4RkRDMEU5NzEsIDB4RjZFRDEyQTYsCisweEEyM0RDMDBGLCAweDg5N0U5MTdCLCAweDdGMjAzMUUwLCAweDE3RENFNTY4LAorMHhERjY5Q0FEMywgMHhDNkZCNUI2RCwgMHgwOTcyNjhCMCwgMHhFMTEwMjQ0NCwKKzB4ODZERjkzODMsIDB4QkQ3QjlDQzIsIDB4QkFBRjdEQ0YsIDB4OTg1QjQ1RDEsCisweDQyMThFOTVBLCAweEIyNDU1RUY0LCAweERCMDE1RjlCLCAweDU0Q0NDRTc2LAorMHg1NkVERjU2MSwgMHg2RjY2Rjk1RSwgMHhGOEIxRUJEMCwgMHhGN0EzOUFFMCwKKzB4RjY2RDgzNDYsIDB4QTQ2NzcwMDcsIDB4MDJDNEIzRUIsIDB4ODI5OTg3QjAsCisweDdDMEUxOTE5LCAweDUxRjcwNjBCLCAweDRCMzBGMUQ2LCAweDg1QTRFMENBLAorMHhFQzA0OUZBMCwgMHgxN0NCRjFFNCwgMHg3QTFBQUQ5NSwgMHhFQkE0QzUxMywKKzB4RTg0NjJFNzgsIDB4NTRDRERBMEMsIDB4RUU3QjgzNzgsIDB4OTg1OEM4QzEsCisweEJBMzM1ODdDLCAweDRENkYxQjE0LCAweDdBMkMwNTI1LCAweDdFNkVFNEQyLAorMHhBQ0ExODY5MiwgMHhERDE4NjgyMCwgMHg0MTE5OEIwMywgMHg4QUM4NUFCNywKKzB4QkQ4NjkwMEIsIDB4MzZFMkMzNTQsIDB4RTY1RjkxMTUsIDB4QjEwNjQ1REEsCisweDc5NzFEMjMwLCAweEM4M0QzNTgzLCAweDhDNjBDODFELCAweDk0REI1NzQxLAorMHg0RkNCODkzNCwgMHg5QTUyMEZFMiwgMHhDRTQ5NDQ2RCwgMHg4ODY0RTY0MSwKKzB4RjVFRjI1QTUsIDB4QzFERUVEMEEsIDB4QzgwNTdGMzcsIDB4RkIzMDVDNzMsCisweDM5MkU2NzBELCAweEE0RDAwRDJBLCAweDM1NkE0NkYwLCAweDJGNjc1NTY3LAorMHhCNzk5N0NGMCwgMHg4OEFGM0E0RSwgMHg1NkM5RDUxRSwgMHhERDc0NkVDRCwKKzB4NDBDRkE0NTMsIDB4NUVBNzQwQ0QsIDB4RTRERDZCQjEsIDB4Q0NCMzE0MjksCisweEEyMjI3RjNGLCAweDE4QTFFQUYwLCAweEMxNTU0MTdCLCAweDQxRkU3MzVGLAorMHgxNkQ0MEIwMCwgMHhDOUY3MkFGQywgMHg4NkIxRDYyRCwgMHg2QTk5QTgyQSwKKzB4MDlEMzMyNDgsIDB4RUM0NDYzOUMsIDB4OUIwQUIyQjIsIDB4Njk2OTE2NEMsCisweEVGNjAyQkIxLCAweDAyMDhGQzZGLCAweEMxMTA5NTc4LCAweDI5OTdBQjg3LAorMHhFNTYyNkIxNCwgMHhDREFGNDhFMSwgMHgyMDc4MTYzMywgMHgyRUJFMEE0MSwKKzB4NzM3OTI2MUUsIDB4RjIxNkY3QTEsIDB4NzE0RDgyNTgsIDB4OTM2RkU2OEYsCisweDE2MDg1NkY5LCAweDJBNEQxNDE2LCAweEI1NThFNDEyLCAweDdEQjE5NkRGLAorMHhEQzg4Q0NCMiwgMHhGMzdBQjYxMiwgMHg3NDIzRjIxNCwgMHhEM0IwNkE0MywKKzB4MjVBODAxMkQsIDB4QzFDNjlGRkEsIDB4OTM2RjJDMTgsIDB4NTZENzdDMTksCisweDc3NEJGQzY5LCAweEY1RTg1RTI0LCAweEQ3OTE1OEM5LCAweEE2N0MzRTE1LAorMHhCOTU4ODE5RSwgMHg2OUY4MTI3OCwgMHhGMkIzNTEwNywgMHhCRjJGNDA4NSwKKzB4MUM5OTdBMDYsIDB4NkMyMzhDM0IsIDB4Qzc1NkQ1NkUsIDB4RDE1QzExNDksCisweDM1MUU2RUM0LCAweDIzMTEzMDNGLCAweDA2MjE2MDJDLCAweEIxMUI2REQxLAorMHhCRThFNTBCNSwgMHgzNEE1RjU4OSwgMHhFNEQzMDhBRSwgMHg0MzQ0QjI5NywKKzB4QTMzQUU5OEQsIDB4MEEzMDNDREIsIDB4Mzg4RUExN0IsIDB4MDEwN0I1QTUsCisweDM4QjM5MDQyLCAweEZFNjc4OTk1LCAweEI0MjZGRTY5LCAweDIyMUZDRjA2LAorMHhDNDU5MjZBQiwgMHgyMUE0MzBGOSwgMHg2RDE5MkQyRSwgMHg0MTY4QzEwQiwKKzB4NUJBNkIxMzIsIDB4MDUxOUVDQTcsIDB4MjExMjc1ODIsIDB4RjZDNDQ3RTAsCisweDBDNzJGQzMxLCAweDA5NDFCM0YwLCAweDc2RjIzODc3LCAweDg2Q0YwNjc3LAorMHhFNzc4NTEwNSwgMHhBNDYzNzg2NCwgMHg5NEM4MkI0NSwgMHhGNjBGRDZBMCwKKzB4NDY5NDFDMjcsIDB4N0EzM0E2OTgsIDB4RTFERjhCRkIsIDB4NTI0OTk3MEIsCisweERGRTY1RTFDLCAweEY0QTRGQjIyLCAweDU5OTYzOUY0LCAweEZFMEU5NzIyLAorMHg3QkI0OEY1OCwgMHg1MzM0NjVFMywgMHg5RTg4NEIzNSwgMHgyNjIwNDI5QywKKzB4Mjg3NUZGQzEsIDB4RjExRUMwQ0EsIDB4NjYzQUY1RjAsIDB4QjJDNTlDMzgsCisweDAzNTU2RUQ5LCAweDI3MUU5RTM5LCAweDg1NTZFMDYyLCAweDA4MjA3NjgyLAorMHhFNTc5N0YwMCwgMHg2NkEzNjJCNSwgMHg3RUQ4Mzk0RCwgMHgyOTIyQzM3NCwKKzB4MjcxNjU3QkUsIDB4QUMxNTA3MUIsIDB4RTI5NjY5MUUsIDB4MEZFMkM3NDAsCisweDE5MTIwRkI1LCAweDlBQkQ4ODhBLCAweEEyMDA3NjJDLCAweDc4MzdGNDFDLAorMHhDNkY0RUExOSwgMHhGMjg2QUJGNCwgMHhGQ0E4OTk4RiwgMHg5N0IwRTdENSwKKzB4MTMzOUM3OUYsIDB4RkVEMDVENDMsIDB4QjMzOTJFNzEsIDB4RkMyQTAxRUIsCisweEI3MjBDQkVELCAweDRGQTcxMzU4LCAweDA0QTU3RjYyLCAweDNENTU4QjBBLAorMHgxREVCNEQ0MCwgMHhDOUM4MjNGMSwgMHg0NzBGNjMwQSwgMHgwOEYyMjk3NSwKKzB4MkJEODUxMDcsIDB4MzI4OEE2MjgsIDB4QjBDODk2NzUsIDB4MzJEOTU3QzEsCisweDgwQjc4NDI2LCAweDk4QTQ2OTUzLCAweEE0OTNBRjYwLCAweEMyQjg0QUM0LAorMHg0ODZENjU4RiwgMHhGRTExOUZGOSwgMHhCMkZFNTY1RiwgMHhFQURCNThDRCwKKzB4MUY0NUY5QjQsIDB4Q0VBRTYyQjYsIDB4NjhFQzcwMkQsIDB4RjUyQURERjcsCisweDBGRkMwNzE1LCAweDQxMjlFNDJDLCAweDk1NkFDNEQ5LCAweDAwMzVDRDlDLAorMHhGOEZFQkFBMSwgMHgyOUM1ODM5NywgMHg3QzJFMkU0MSwgMHg3QkU3NERBRiwKKzB4Mjc5MUQzNEQsIDB4QjZENjdCMEQsIDB4OEY1NTc1MjgsIDB4OURERUVENUIsCisweEIzQUE0QkI3LCAweDA1RTIyRTQzLCAweDRDREE2MDBELCAweDQzMkUyRDMyLAorMHg0MDVEQTVCRCwgMHhBRjIzODE4QywgMHgyRjczRkUwOSwgMHhENDYyNDYyNiwKKzB4NjUzRUZDQjMsIDB4NzdENjVEM0YsIDB4NTFBM0RDQjMsIDB4NzY3RjQwN0MsCisweEM2NjQ1MkUzLCAweDEwQjY4NDJFLCAweDkzQTA4NDBFLCAweEU0NTNBRDEwLAorMHhERTU4RkMzRCwgMHg2QzIyNzIxNSwgMHgxRUUxMzBFQSwgMHhCMEJGNjRCRSwKKzB4QTExRTVEMzgsIDB4MDEzMUI3NTUsIDB4MTkxRjcwRDAsIDB4REI0ODM5NTksCisweEFBOEQyRjlFLCAweDVBMDAyQUEwLCAweEY1QTI5OTZELCAweEZEMEY5NUY5LAorMHhENkExMjg2NCwgMHgzQUE0OEI3NCwgMHg1MEY2Njc5RiwgMHgwQURGNUM0OSwKKzB4RTJGOENFNjgsIDB4QkYyMTNFNjcsIDB4NUU5QUNFRUEsIDB4Q0FDRDBFQkUsCisweDZERjc2NkE1LCAweDMzQzBBMTU2LCAweDcyMDg2OEVBLCAweDMxMTJBMERDLAorMHhCMzgyMzUwQSwgMHgzNjlEOUM1MCwgMHhFOEY4OTBEMCwgMHgwQTEyMTM5OSwKKzB4MkFCNDU4RUEsIDB4NTFDODIzM0QsIDB4QkY0NjQwM0MsIDB4MDcyOENENTUsCisweDIzRjY3NzRCLCAweDJGQjU5REIwLCAweEZBMkNGNzI0LCAweEI0OUZBODQ4LAorMHg1RkZGQTEyNSwgMHhERTJDMEQxNSwgMHg3NkI3OEM0MSwgMHgxOTJCQTYyQywKKzB4NEM5NTYzRTIsIDB4OEY3NDI1MDcsIDB4ODgyMTA0RTAsIDB4MzU3QUQwNzgsCisweDc5OUUyNUEyLCAweEVGM0VEMDIxLCAweDY5RDU0QjQ2LCAweDVFQzU3ODcwLAorMHgwRkY0MThFMCwgMHgwN0M1QUM3RiwgMHhDMUFDQkY5QSwgMHg4MEE4MzBEOSwKKzB4ODM3QzdDNUEsIDB4MDRDMTFEODYsIDB4QzE0QzhCQzcsIDB4OTJCQTY1MEIsCisweDk0RDM0RkE4LCAweERCREQ1RURDLCAweDlFRDJBMDhGLCAweEExRkFFNDg1LAorMHg1RkQ2NkMzRCwgMHg0Q0NCNkY5RiwgMHhCN0FBNTZCMCwgMHgwRkIzQzczQSwKKzB4MDNBRjk2RTYsIDB4REIyRDM4RjksIDB4N0FGMjBENjAsIDB4QjU3Q0JFOTAsCisweDIwRUIyRDZFLCAweENGOTM0NDUyLCAweDgyRUMyNkY2LCAweDg0QjM3MzdBLAorMHgwOTcyRjFCNywgMHgzOUI2REI0RCwgMHgxM0U1M0NDMCwgMHg2N0M0MUQ3MiwKKzB4OTRCQUFDNzgsIDB4NjYzQTlDNkMsIDB4MzY5Mjc0NDgsIDB4Q0ZCQzI2MTAsCisweDk4MEY1M0JBLCAweDdFNTZDOTZBLCAweDA0QzYyREZCLCAweEE0NzFENTc5LAorMHhERjlCMkVFMSwgMHhFMTJERUJCNywgMHgyREI5QjA0MiwgMHhGMEM3NEI5NiwKKzB4NkEzNzYyRTksIDB4RjREQzM5RDksIDB4NzYxQTU4ODQsIDB4RkEzNjNEM0IsCisweDkyNzY2NzU5LCAweEYzRUFENDQxLCAweDg3ODI2OUVELCAweDFBRkZBRkU1LAorMHhDQjQzMjc2NCwgMHhGRTE5NDc1QywgMHhDRjg3NzZEQSwgMHgxRjBBRDkwNiwKKzB4N0Q5OUFDMjAsIDB4QzI3MzE3RkIsIDB4NDM5OTQ0QTQsIDB4NjVEMTRDMkQsCisweDQzRTQ1MjYyLCAweENERTZCM0JELCAweEUyNUM2N0NELCAweDMyMUFBMkU2LAorMHgzNTJBMjc2NCwgMHg1NTY5RUY0MiwgMHgwMDVDMzcwRCwgMHgyOTA4MDFFMCwKKzB4NjE4ODMwMzUsIDB4MkEyREJDNDgsIDB4RTJENTU5RkYsIDB4MDFGNURGMTMsCisweDY5QjYxNTU4LCAweEU5NEJGMzY0LCAweDNDQTc2RkNBLCAweDJFMDE2NDgzLAorMHhEQjY3NUY5QywgMHg0RkE1QjZEQywgMHg1OUE2QzNFQywgMHg1NkM2RTZDRiwKKzB4MjRDRDU5RjUsIDB4NDY5MTE4MzQsIDB4NjgzQjlFMzksIDB4QjVBRjYxNzQsCisweDVDMzFFMjY5LCAweDY3OUM5QTEyLCAweDM3ODdEM0U2LCAweEYxNzI3RUU2LAorMHhCMDcwODgyRiwgMHhGQzM3RUFDQSwgMHhCRUUwNzgzRiwgMHhGNjIxODM2OSwKKzB4MTkzNzI5NDAsIDB4M0ZGN0Q4OTAsIDB4Njk3MzY5MTksIDB4REQ5NjFDQjksCisweDg4MzAxMEYxLCAweDZFNDcyRDVCLCAweDI0NDdFMDBELCAweEYzOUUxRjBFLAorMHgxREJENDQyRiwgMHhCRTE5NzdFMCwgMHhDODY1NUY0MiwgMHgzN0M4NDI1MywKKzB4MzQ4MERBQzQsIDB4NENGRTFEQzgsIDB4RjE1MjFBRDUsIDB4QTQ1QzRGOEMsCisweDg3RkJBRUUwLCAweDNFNDFFOUUyLCAweEY0Nzc3MUU1LCAweDE2Qzc0Q0RGLAorMHhBMzNENDAzNSwgMHgzODUxM0ExMCwgMHhBQkYzMjY0RCwgMHhCOEQ4MERGNiwKKzB4RDlBRDcyNTYsIDB4Rjc4Mzc1QjgsIDB4RDc2NjFDRjcsIDB4MUMzNjNBRjksCisweEQ0MjVGQTMyLCAweDAwMUQ3Qjk4LCAweERCOTZBMUNDLCAweEEwOTJFNjgzLAorMHg2NUNGNTMxNiwgMHg1RjI4MjY4OSwgMHg5RjUyRjkxMiwgMHg4OTU4QTFCNywKKzB4NjQ1N0EzRjcsIDB4QUI0M0ZBREQsIDB4MDYxMzI4QzcsIDB4OUQzMUI1RTMsCisweDc1QTc3RjZELCAweDRBNzY0RDRBLCAweDQ4OENFODNFLCAweDI5ODg3MjE4LAorMHg5QTA0QkREMCwgMHhFRjMzMTA3MCwgMHhCQ0QyRjg4NCwgMHg2QkY2NkE2RiwKKzB4Qjg1MTQzQ0IsIDB4RkE1MjkyNzgsIDB4OUVBM0EzNTQsIDB4NEE3M0JEQUYsCisweDBDQkI3NTYzLCAweEQwMUFFMzVGLCAweEQyQUMzREFBLCAweEZDODI0M0I3LAorMHhEODA1RDk3QiwgMHhDMTYyQTc1RiwgMHgxRDQ5QUM2NywgMHg5RTFCQzM4QywKKzB4MUQwNkFBRTgsIDB4RUFGODBDRDgsIDB4Q0U4MjVERDQsIDB4QUNBM0YwNkEsCisweDgzRDA5MkVFLCAweDNGMkJBQUJDLCAweDI0ODJEMTIwLCAweEYzMDE2ODBDLAorMHg3REFDMzczRiwgMHhGNUQ2MTc4RCwgMHhCN0U5MjE3RiwgMHhDQ0ZFOEMxMywKKzB4OTc2MDI0RTAsIDB4QTJGMzlGOEMsIDB4QjZDNjU3MzQsIDB4MTBBRTUxNEEsCisweDY5NjU4NENGLCAweDI1NDIxMTNDLCAweDQ3OUNCMjBGLCAweDhEM0EyMkUzLAorMHhGN0M0Qjg4QywgMHhGNEY3RkJFMiwgMHgyRjU1MzMwOCwgMHg5RUE3MUUzQSwKKzB4N0I5NThGNDgsIDB4MDkyN0RBQUIsIDB4RjA4OTQ5QjcsIDB4N0NENDZDMEUsCisweDdBODkyQkJDLCAweDg4MkYzMkNFLCAweDM0QzQ5MEM4LCAweDg0ODNFRDA0LAorMHgwN0VCNEVGQywgMHg0QkVCQ0Q4MiwgMHg4M0IxNUVFOCwgMHg4RjNCNzhBQywKKzB4Rjk1RUZEQTksIDB4ODE2QkVCRjksIDB4MjY5QkRBNTgsIDB4RUUzNzMzNDIsCisweEUwOUZEQTlGLCAweEM3NjUxQUFCLCAweEI4RDM5OEIyLCAweEM3RjQ0OUIyLAorMHgwMzEzMTBGNSwgMHhDODY5NzA2RiwgMHhEQTIyRjEyNywgMHg4QzY4REY5MSwKKzB4RTY3NjA2OEEsIDB4Qjg1QUFBQzcsIDB4RDMyRjM1QkMsIDB4RTIyREYwMzEsCisweEZFMTQyQkQ5LCAweEQ0RkIyNzAwLCAweDJEMTk3NzA3LCAweEEzQTQzQTY0LAorMHgwQzAyQjA1MCwgMHhFOTQ1QUQ1NiwgMHg3REVFMEE1RCwgMHgxMDc1REUzRSwKKzB4RDk5QUQ5MUMsIDB4NkE3QkI3MUQsIDB4MTc3NEIzQjgsIDB4MjIyOEIxMTIsCisweDBERUVFODQ0LCAweDM4MDc0RUJFLCAweDZEQUNGNTdCLCAweDdFMDA5NEI3LAorMHhDRTQ2RjhFQywgMHg0REFGMzRGNCwgMHg1Qjk2MTkwNywgMHhDODIzNkZGNywKKzB4RkQzODBBQTcsIDB4NjFFQkE4NEEsIDB4QUU0ODkyRUIsIDB4MEYxQjYzNjUsCisweEIwQzRDOUEwLCAweDA0RTYwMTJELCAweEE1RjkwRDAxLCAweEQ2Qzg4ODJFLAorMHhCQ0I5QzFFQiwgMHgwRTVFMEZFQywgMHg1M0E0Njg4OSwgMHhBMkMwRkE1MSwKKzB4NTIwREE0NTksIDB4M0ZEOTVGQTIsIDB4NkUxRDZGRTgsIDB4QkMwOTMyMjAsCisweEFCMTYzOTBBLCAweDE2M0UzRDZELCAweDBBNjM1MTdDLCAweDNCRjM4RjNELAorMHg4OEExRjY2RCwgMHg5NjI2MzUzNiwgMHg0MTJERjAwOCwgMHgxMkZCMTI2RCwKKzB4NDQ0NDFEN0EsIDB4MzFDOUY3MjYsIDB4RjY2RjYwQ0YsIDB4QUUxNDUzRDQsCisweERBRUFENzFCLCAweDU0RUFFRTBGLCAweDk0OEI3M0JCLCAweDMxRUEzRTc0LAorMHgzNTVENEZEQywgMHgyQTFGM0E5RSwgMHg1ODZEMDhERiwgMHgxMjNBQzJFOCwKKzB4RjVBQzAwNjUsIDB4ODg3NEFDQUIsIDB4MDVCMDNENjMsIDB4MDFCRDZBNEMsCisweDdBNkE5ODgwLCAweDJCQzE2RjkzLCAweEM0MTEyRjBDLCAweDgyODdCNDBELAorMHg0OEVBQkYwOCwgMHgyOUU1Njg2MCwgMHgwRjUwNUM4NCwgMHg0NDdEQzA4QiwKKzB4MTY2NTExOUMsIDB4MDAzNDdFMzcsIDB4NDgyRUYwM0UsIDB4MDFCMTVENDQsCisweEU2QzFCOUZGLCAweEIxNjVFNDM2LCAweDBDRjY5MEY3LCAweDdGQzVCRDAxLAorMHhCNzg0QzdGNCwgMHg5QkUwNEVCQiwgMHg5RjYxNDQzMSwgMHg2QzM3QTVBOSwKKzB4MkQwREI4N0QsIDB4RjY1MTEzNjksIDB4RTExNTA3M0EsIDB4Rjk2QzZBQjYsCisweDA0QTEzQzNDLCAweEJGMzBCMkRBLCAweDkzRDE4RkM2LCAweEY2N0QyRTQ3LAorMHhDQTA4OTE1MSwgMHg1MUE2QkMzOSwgMHg4QzFGQ0E5MywgMHhGQkYyRjJCQiwKKzB4QUQwQTNGMzMsIDB4ODJBQTI3NjcsIDB4ODFCRjIzMTMsIDB4NzU4QTgyQjgsCisweEUxMDM3ODhFLCAweEMwMEM0QjVDLCAweDVGNTJGRjU4LCAweEFCQUQzOEY3LAorMHhEQTY4RUU5QSwgMHg5QjZENDA1RCwgMHg4MDM0NDlEOSwgMHg2MTc4QjM0NSwKKzB4M0M3ODVGQjQsIDB4RkVCQUJFNTUsIDB4MEUyNDU4QUIsIDB4MDIxRjBENzEsCisweDM5MjAxRUQxLCAweDc0MUIxQTdELCAweEUwQjBBRkY0LCAweDQ1NjUyQ0ZGLAorMHg5MDdEQTY3OCwgMHgzMTNBOTNCNCwgMHgwQjBENkIwRCwgMHg0MkM5NkU0MywKKzB4RUVFM0U3RTEsIDB4RTgzQzgzRTksIDB4OTA1MkI4NjcsIDB4Rjk1MTQyNDMsCisweDYxRjIwQ0IyLCAweDU3RTFBQzY0LCAweEMyNDQzMTIzLCAweDQzMkM5NkQ0LAorMHg2MTZBODI0RiwgMHgzQzhEMUUwNiwgMHg4RTY0MjIyQSwgMHg2NUMxQTIxRCwKKzB4ODY4NjMwOEEsIDB4MkE1NzZBMkYsIDB4MUNBMEZGMjAsIDB4MkM4RjlEM0EsCisweEM5OEM5QzY5LCAweDM1MzIyQTI5LCAweERGRDMzQzkzLCAweDk2MzRGNDExLAorMHgwQjRGOEZGQywgMHgzQUVENEIwMSwgMHhFQkJDNzAxMiwgMHhFRDIzODdFQSwKKzB4NDhCRjQyQUYsIDB4RDYwMzk5RDYsIDB4N0E5QjhDQTksIDB4NTM4ODYzMzcsCisweDJEQkI5NDI5LCAweDBBNkFGNzY0LCAweERFNEQ4Rjc4LCAweDFFREVDRUU0LAorMHg0RjhFRTk5RSwgMHhBRjIzRUFGRCwgMHg5Mjk1NTBCMSwgMHgyQ0JEODYyMSwKKzB4MjJBOEZBQTIsIDB4QkUyQTBBOEQsIDB4MDZGN0U3OTQsIDB4MTZFMUYzRUMsCisweDA5M0FBRUFBLCAweDkyRDQyOUY4LCAweEJCNzlBN0U3LCAweDQzRUY4OUJCLAorMHgwRTA5NzUxMSwgMHg3NDhFNjhCMCwgMHgzMjJDMDBBQywgMHhBNjJFRjQyQSwKKzB4RDAzQkI4QkMsIDB4OUZGNjc4MTAsIDB4REUyNEJGMDMsIDB4MTQwQ0E2RkQsCisweDY4RjE2QjQxLCAweDFCN0M2OEM3LCAweDMyNjQ2MzQyLCAweEM1RTcxNEY4LAorMHhFRkZGRDJCOCwgMHgyNzg0MzYyOCwgMHhGODQ0NUY1MSwgMHhCOUU4NTE5QiwKKzB4OEVCMDFEMDQsIDB4MzU2RkJGMkYsIDB4MzJFOTZCQUQsIDB4NkE2MjlCREUsCisweDUyMDYzMzEzLCAweDIwMDA2OUIwLCAweEUxNjFDRjcxLCAweDg0RkI3QTEyLAorMHgxODA1QURDMCwgMHg4MEY3NTAxMiwgMHhGRTlFNjI5RSwgMHg5MzM5NUMzMywKKzB4RkYwNzVBOTEsIDB4QjYxRTQ2QjgsIDB4Q0E5RkU3QzgsIDB4OTdEQ0NCQ0EsCisweENFRkZCNkY4LCAweDMwRUU3OTg1LCAweDFGQUJDODI5LCAweDIwQjNGNTdCLAorMHgyNzA0MkIwNywgMHhFMTJDNTE1MSwgMHgyMzQ4MkI4QSwgMHg3QjlCOEVCMiwKKzB4Qzk5N0ZFQjMsIDB4NzZBQjI0OTcsIDB4RDVDREE1OTAsIDB4OUVCRTkwRkQsCisweEUzNzMyQjE4LCAweEZGMjhDRUM5LCAweEM2NTgyMzIwLCAweDZFRjEwNkZBLAorMHg4RUQ3NDAyMywgMHgxQTBCNjlFNSwgMHg0QTk1REQ5MSwgMHhCNDFBRjgyQywKKzB4ODNERjY5RDMsIDB4QzU0ODg2MUMsIDB4MkY2MEJBOTMsIDB4RkM4MTU5ODQsCisweDFBODQ4QjY3LCAweDFFQUU4N0M0LCAweEY3NDc5MTAzLCAweDhFMTZEQjUxLAorMHgwNDBCOTVCOSwgMHgyQTlEQjgxMiwgMHg5ODdBRkNEMSwgMHg4NjZERjQxMywKKzB4QkY5NTU4RUQsIDB4QUNGMUFGMkYsIDB4QTY1MzA1Q0MsIDB4MTY4MzM2RjMsCisweDFFNTlCOTdGLCAweDNGOUY0NDdDLCAweDNENTRCMzBELCAweEU5MzlENTk4LAorMHgzNkE0MDg4NSwgMHgwMjM5Njc5NCwgMHhFQjBGMEE2NywgMHhDRUFFQTEyRiwKKzB4QzU4QjRBQzgsIDB4RTZENDk3NjAsIDB4MEY4RjI3NzYsIDB4NjZBOEY0MzYsCisweDMxQkFDRDdELCAweDM3Njk5M0RFLCAweDMyQkQwNDMxLCAweDY4QkRDNzI4LAorMHg2M0VBNjc0OCwgMHhFNkIwMEUyOSwgMHg3NDQ4Q0FCQywgMHg0MkE2NTE3RCwKKzB4QkIxMzEzQzQsIDB4QTA0REM4RkYsIDB4M0Q0MDIyMzcsIDB4QTM4MjY0NUYsCisweDUyRUQ1NUQ2LCAweDkyRDdEN0I3LCAweDU0MTIzMEZGLCAweDdBRkMwNDIwLAorMHgzREM0NjI0RiwgMHhEOUIyMTkzRCwgMHhBNzNCOTcwNCwgMHhCQkRFMEZGMSwKKzB4OUVCNTY2MTUsIDB4OEFCMDgwQjYsIDB4M0M0RDhFMTQsIDB4NTAwMUI0M0QsCisweDFFQkZBQTIzLCAweEQ0QUFDRDI3LCAweENGQUFCNEJCLCAweDZGRkVFNjFGLAorMHhBRTVBNzQyNiwgMHhEQjk0Mjk0OSwgMHg0NTJDMEIxNiwgMHg3MzhFMDYzNywKKzB4MzZBNTEyMkQsIDB4RkYxRjdBNEUsIDB4NzQzRDM1Q0YsIDB4ODQ3RDU0QTksCisweDQyQzNFQUJBLCAweEQ0NjcyOEM1LCAweDMwQjI3MDhELCAweDRGNkJFMEJDLAorMHgzQzI2NzkwRCwgMHhCMEI2N0M4QSwgMHhFRTA3RUZEQywgMHg5RTM4MDYxMSwKKzB4RUFENjgwNEMsIDB4NEVGNjYwMjQsIDB4ODQ1OUFFMzgsIDB4MURFQUFGRkIsCisweEY3NjU3M0FFLCAweDZDQjFDOEYwLCAweEZGQ0MyNjdFLCAweDI2QTIxNUY3LAorMHgwQjFBMDU3QywgMHg3REFCOUNCNywgMHhENDBCQ0JBOSwgMHhFNTYxRjlGRSwKKzB4QTQ0MDEzQTYsIDB4N0IyMkMwQjksIDB4OTk4QTkyMUYsIDB4QkQyNTI0NEIsCisweDE1RTA3RkVELCAweEYxNUIyRTMxLCAweDU0RTgwMDE2LCAweEExMkJDRTdGLAorMHg2NThBMjA5MywgMHhCNjQyQzQ3QiwgMHhENzMxRkMwMCwgMHhDMDBFMzAyRCwKKzB4NTVCMjUxREMsIDB4MzQyOTM5RUIsIDB4NkVBREIyRjcsIDB4MENGOTMzMTgsCisweDYxRUJEODVBLCAweDk5QjcxNUVGLCAweDY3OUM4RDNBLCAweDlDQzFCODAzLAorMHhBQkVGOTU1RSwgMHhCOENGRjlENCwgMHg3MDdBODM5RiwgMHhGNUQwMkE3RSwKKzB4NTlFMEQ5MDMsIDB4NUE0MjVFM0IsIDB4QkI2MTE2M0MsIDB4OTZFQ0U5QUEsCisweDc5N0I4MkFBLCAweEE5RkE2QkI2LCAweDc5N0MwMERDLCAweEMxQzFGQzRDLAorMHg4RjdGREE2NiwgMHg3NzkwMjUxNCwgMHg2RDFCODQzRCwgMHg0Rjg4MUZBNCwKKzB4QzI0QUQ2MjUsIDB4QkMyMzdBNDUsIDB4OUEyRTBGNDQsIDB4ODJGQUEzRjMsCisweEQ3MEUzNDg5LCAweDRGMkIzNDE3LCAweDY1Q0Y2NUU0LCAweEVBQUU2QTkzLAorMHg0QkVBRUMyQywgMHg0OTE4NzIzRCwgMHg3RDhGMzBCNCwgMHg3NzA2RjU5QSwKKzB4Q0IyQTc0NTIsIDB4NTA4M0QyRDYsIDB4NDcyNEI0MjYsIDB4ODRFQjE1REMsCisweEJBQTJDNkNGLCAweDcxRkE5ODRBLCAweERERjdBM0RGLCAweEIxMTVCRjFBLAorMHgyNThBRjBFMywgMHhBMTYzN0Q4NywgMHgwMzU4NURGOCwgMHg1RUE0QjgwRCwKKzB4ODY0MUYzMTgsIDB4NjZFRTJGMjQsIDB4QzgxRTUwNUUsIDB4NUU2NDA2MzksCisweERCNzczOUI4LCAweDFBM0I4NjFGLCAweDBGNUVDQzUxLCAweEIyMUMwMERELAorMHg2ODBGRjMwQiwgMHhERTY5NzQ2OCwgMHg1N0E0M0IzMywgMHhEN0VGNkIzQiwKKzB4NEJGQzdEMjUsIDB4NzEwRjA3NTIsIDB4QUJBQTk3NTIsIDB4Q0ZDRkQ4NEQsCisweDNCQ0MxQ0RDLCAweDIzODFDNTI0LCAweEI2MENBRDkyLCAweEUwNUJDMUFBLAorMHgyQjg4N0Q4OCwgMHhDRDQ1NjZDNSwgMHgwRDI5NzZFNywgMHhDQjAwMEEyQywKKzB4NjY3QkVDRjYsIDB4RUZDN0YyMjEsIDB4N0E3NTg0RDEsIDB4QzQxRDhCMkUsCisweEQ5QkI3RDNGLCAweDdDRUI1NjI2LCAweDdEODE2NUEwLCAweEVFMTc4Rjk5LAorMHgzRThBOENCNywgMHg2OTNENDUwMSwgMHhCMEUyMjhBNSwgMHhENTVCNzNDMSwKKzB4QUY5MDQzQkYsIDB4NkM2MjdBMkMsIDB4N0I5RjQ5MEMsIDB4N0VBNjE4OTksCisweDkyQjk4MEFGLCAweDZEMTNDNzU4LCAweDJDMDA3QzczLCAweDc0MzM2RTBELAorMHhBMzlGMTNBQywgMHg1MzNGMDVENywgMHg3NTUzNkNGQiwgMHg5NzA4REUyNywKKzB4RTJBMTRFODcsIDB4MzY2NzNGRUYsIDB4NzFCQTY1NEYsIDB4Qjk4Q0QyRkMsCisweDI3RjI5QTZFLCAweDgyNDc4MTcxLCAweDFDMjgxNUYwLCAweDhBOEY0NTQ5LAorMHgwNDhBOEQ5QiwgMHg3Q0VFNTFGMiwgMHhBMTY0OEFDMywgMHgwMDRGOEI4RiwKKzB4QjZGRThFRjAsIDB4NkQxMEEwQTEsIDB4QUQ3QTI0RDgsIDB4NzUwMzk3MTcsCisweDk3ODQ3Nzg2LCAweDI3OTFDQzA1LCAweDY5MzdGRDZGLCAweDYwRjk4MTE1LAorMHg1RkFCNkQzNSwgMHhDMDU1MEE3MCwgMHhDMEY0RDgxNywgMHg3QjVCRkREQiwKKzB4RUY2M0I0RDIsIDB4NkM4N0M2QzUsIDB4OTU2RDZCODcsIDB4NjkxNzkyNTcsCisweDEwOTczQzkwLCAweDhDREJFODYwLCAweEM3Qzc2MUVFLCAweEY4MjNFMzRFLAorMHg2RkEyQ0YzQiwgMHhBOTAzQUJDQiwgMHhDODJDOUIwMSwgMHg2MEZFOTZFNiwKKzB4RTVFQzMzQzAsIDB4NzNBMzAxMUMsIDB4MkExQjkwNTQsIDB4Q0YxNkY5MkQsCisweDRGQUY2Q0M4LCAweEQ5REQ3NEZFLCAweEIzQzYzOUVELCAweDNGNDdBRjYzLAorMHhDOEU5OUQxMiwgMHg5MkQ5NTk4NiwgMHg4MzVBQ0E2RiwgMHhENTI5MzBBMiwKKzB4QzdERDU0QTUsIDB4NjE3RkREMTUsIDB4RTlBNkQyOTUsIDB4RjU2QzYwODcsCisweDc4MTNCNjYyLCAweDFGOEVBMjQ0LCAweDFDREUzQkFELCAweDU4RkMwRjdCLAorMHgwMkUzMUE1QSwgMHhBNzhFQUM3NCwgMHgxMEMwNjEwNywgMHgyMkJBM0M2MywKKzB4Rjg0QUQyMjQsIDB4NkE4QkY2NkMsIDB4MkE1Q0FBQzUsIDB4OEFEQzNGQjUsCisweDk2ODM0NTFBLCAweDFCNTJGQ0I0LCAweDk1NDkxQkE1LCAweEZFNkMzNzEzLAorMHhFOTA5OENFRiwgMHg3M0MwMUVGOSwgMHg2RTg1RUYxQSwgMHhFRTE4OTc0MywKKzB4MkU5RTUyODYsIDB4QzFGQUE2NjUsIDB4RDg2MUUzODQsIDB4NzAxQzgzNEQsCisweERDNUNBNUNDLCAweDUyQTNBNkM0LCAweEYyQUYyQzQzLCAweEMzN0M2NDY1LAorMHg2RTk0QUQ2OSwgMHg5ODgwOEFGNCwgMHhFRDhBOTlGMiwgMHgzNzcyNTdEMywKKzB4RTYwRjIwOTYsIDB4NjE1RUZDQjgsIDB4NjdBMkJCM0EsIDB4QjREREQ0MEYsCisweDFENDdGOTE4LCAweDg2Rjc3RDZFLCAweEZEMDVEMkI4LCAweEUxOEMzMzBDLAorMHhBNDgyNjBBNCwgMHg1NjE1QjgzQiwgMHhCQ0Q3RDg1NSwgMHhGODA3MzIxOSwKKzB4ODYyMkJCODksIDB4RDM1Q0UwNUIsIDB4MTcxNjI0ODMsIDB4MTM3QkRCNjksCisweEVDRDBGMjI2LCAweDYxRjg5ODJBLCAweDNDMTBBQkQ0LCAweDJGMzNBQkY0LAorMHg5MzU4QjU0NywgMHg1OEIyNzdBNywgMHg5MjQ1NkE3QywgMHg0Mzg0QjQ5QSwKKzB4NUYxRkYwRUMsIDB4QTE1M0VBNEQsIDB4QThFNDkxMDAsIDB4RDNBNzU3MjMsCisweEQxQURDNjA2LCAweDc2QzMxNEI3LCAweEJDNkFCMjI3LCAweDI1NzMxMkFGLAorMHg4QjZBQTFFMywgMHhEODdGRjVFOCwgMHgyQkFFRDM3MywgMHhDODQ4QUI2MywKKzB4QjcyQjFFNUUsIDB4NzMwQTczRDgsIDB4NDkxNUU1QjYsIDB4REY3RDc3QUQsCisweEVBRTI0N0Q3LCAweDk1NTZEREE4LCAweERFMEM5QzQ3LCAweEE0RTMyOTZFLAorMHgzMUY1QkM5NCwgMHgwNTI1OEIyNCwgMHgyODM3Mzc0RiwgMHhDN0U0QzgxQiwKKzB4NUExQUM4MTksIDB4MDY4MDc0QUUsIDB4REY4NzY3MzIsIDB4QzAxOTJFRjksCisweDdGRkQ4NEQ4LCAweEZGMUNFMTQ4LCAweDgyMUI0QUEzLCAweDU2Njc0ODM4LAorMHhGOUExNDdGNCwgMHgxODJFRjU4QiwgMHgxNkUxNzE3NCwgMHhERTI3MDI5RSwKKzB4OEJFQzU1QUQsIDB4NDA2NDZGODksIDB4REJGRjkyRkMsIDB4OUYyNEMwMTcsCisweDcxMUVBRDE4LCAweEE2NjNFMUVGLCAweEVGOTJGNjg0LCAweDRCRDA1RTY3LAorMHg3RTA4OUIxMywgMHhDQkY2MTlCRSwgMHhDRUJFRjIzMSwgMHhDOTQ3NTg2QywKKzB4MEY1MjZDNDcsIDB4NjY3MjYwMEYsIDB4REFBQjYzREQsIDB4OTUwRDRGRDAsCisweDE5OUMzRUMyLCAweDBGMjAxQzlELCAweDA2QkNDOEQzLCAweEE3NjcyQzZELAorMHhCMzlDN0QwQywgMHhDNzRCMDgwNSwgMHhDOUJCRDI0OSwgMHhBQ0RENTM5NiwKKzB4QUI3QkRGOEUsIDB4MTIwMTJCOEUsIDB4NjcyMzYwNDcsIDB4MEFFMDc0MUIsCisweDFENzQ3RTU2LCAweDdFQzZDMDBDLCAweEQwOEU4MzQxLCAweEIwQUJEQUQ2LAorMHg0RkE0QkRGNiwgMHg5MENFOEQwRSwgMHg2RTczNDExNywgMHgzRUY5MTkyRSwKKzB4QUNBMzJEQTIsIDB4RkRCOUM1OEUsIDB4MjU2NjI2QjUsIDB4NUVBOTYxQjMsCisweEZCQzE1Nzc2LCAweDM2NjAyQjVGLCAweEY4RDA4NjQ0LCAweDVCNjkzQzIzLAorMHhDNjJFQTNCMSwgMHhDNjY0QzdDMywgMHg3M0JFODg1OSwgMHgxN0Y0NEU4RiwKKzB4RjlCOEQ5MjMsIDB4RDE2OEEzQTUsIDB4NkNDRDExMEMsIDB4RDM1MzE4MUYsCisweEMwRTc3NEVDLCAweDVGOUUxMjdDLCAweDZDODI0NTExLCAweEZEQTEzNDk0LAorMHhDQjU4OEJBNiwgMHg0NzE0ODY5NCwgMHhBQjg3N0U4NywgMHhFOTdGNzU3QiwKKzB4RjU0RDBBMkEsIDB4MEZFMTE4OTEsIDB4NUQ4NzQ3RkIsIDB4RTc4MDBDN0UsCisweEVGOTYyOThGLCAweDQwMEY0NThBLCAweEUyRDA0NTE4LCAweDRCNEU2RUZDLAorMHg5QjE1MDAyQywgMHgzQ0UxQjUzNywgMHhGNUFDQjlCOCwgMHg2NzAzMDY0NywKKzB4NDc1RkQxNDgsIDB4MUUwM0E0MEEsIDB4ODk2QzdDMDUsIDB4ODVGNzBCNjgsCisweEM1OTBDQTg0LCAweDUzQjU0NDBFLCAweDE0MDBGNzhGLCAweDNBQkU3RjhBLAorMHgxOUNBNjdGRiwgMHg2OEI1NEEzNCwgMHg1NTU5ODhBQywgMHg0QUIxNkI0QSwKKzB4NzUxMUZBNjMsIDB4MjQ4RUM5RUMsIDB4QzI1QUZFNEYsIDB4MTlGNTc4RTEsCisweEU5MkFGMDNELCAweEFGOURFMThGLCAweDI3OThDN0E3LCAweDZCNDY5OTBGLAorMHg0MUQ0NTg5NCwgMHg3NDY5NkEwQSwgMHhDNkFBRjVGOCwgMHg3MkNDMTBFMCwKKzB4REI5Q0EyODMsIDB4RDZCQkQwRjMsIDB4NThFQTRDMDYsIDB4REVBNUU4QjksCisweDE5MDhFQkRCLCAweDk1RDMzREQ1LCAweDIwRDcwMTNDLCAweEU3MjVDMjgyLAorMHhGRDQ4QzkyRiwgMHhEQkJBN0QxOSwgMHhDN0JFQkVBOSwgMHhCMTg2Qjc5OSwKKzB4REQwREQxN0IsIDB4RDgwOTBBNDEsIDB4Rjk4QkMyMEIsIDB4REQ3RTRCOUQsCisweEVCQUU0MjQ3LCAweDQzNzZGREM0LCAweDdGM0VGQUM2LCAweEE5QjlBOTUxLAorMHg0QUUzOTBDNCwgMHg2NTE4NjNBRiwgMHgyQ0Q0MkRCQywgMHhDMkExMzk2MiwKKzB4RUYwRkM0NDMsIDB4QUVFNjMyNDYsIDB4MDlCODNFMTksIDB4QzNDOTQwQUIsCisweDAwQjEyODI2LCAweEMwQTMwNDEyLCAweEZDRjZBQkNDLCAweDNDRkU3MjFBLAorMHg2MkMxRjRDNiwgMHhFOTYzQTM1OSwgMHhBRTExRjNENiwgMHhFNDkwRDEyQSwKKzB4QzQ1QzkyOEIsIDB4MDVDQ0E3OEEsIDB4MTk4MkU5M0YsIDB4NTc3RjgxQ0EsCisweDY2RDUwRDZFLCAweEI0QzcwMzBGLCAweDkzMDkyQzNFLCAweDExOEIwOEZGLAorMHgxNzg1NDVCNywgMHhFRUQ3NDgzOCwgMHhGN0QyQ0U0OCwgMHgyMzg5NjlCQywKKzB4QjhFRkFFQUUsIDB4NzU3MjZBM0IsIDB4QjFFMDIyMEYsIDB4QzRENjBFQjYsCisweDBFQkMwMjQzLCAweDVGRTBENkNBLCAweDM1NDU2QjQ1LCAweDFGNjRBQzJBLAorMHg1ODQ4NEExRiwgMHgyQTExNDU1RCwgMHgzM0JDNDQwMywgMHg1NkU0RTYyRCwKKzB4NjBCNDFFMkIsIDB4REI2NUQzRjgsIDB4N0VDMThEMzQsIDB4RjU3NURDODUsCisweDZFMEI5OTk1LCAweDFDMTRDOTFFLCAweEIyQTk0NzE4LCAweEFFQzRBODIzLAorMHg5OTNEMzc0RSwgMHhGMUU0MjEwQiwgMHg4Q0ZDQzAzQSwgMHg5OUJEMUMyOCwKKzB4QTkyOEUzRjksIDB4QkI5NTdEMEUsIDB4NzdDODY1RUYsIDB4N0ZGNTBBNDUsCisweDQyNzlBNjM4LCAweEU2MjhGRkExLCAweEJDQ0ExNzFFLCAweDI4NEM5Q0VDLAorMHhBNDc2RTM0NiwgMHg3RTJGOUMwOCwgMHhCRjY1MDQ0RiwgMHg1QjdDM0Q1QiwKKzB4NkU2MEVFNUQsIDB4RjVDOTk1MDksIDB4RkEzNTJCN0UsIDB4NkZERThFOEEsCisweEYyMzQwRkUxLCAweERGNTQyQjZDLCAweDUxMENCMzBCLCAweDM2N0U3MDE2LAorMHgxOThBMEE5NSwgMHhBNERGNTA4RSwgMHg1OTNDMjMzOCwgMHhCMTJCQ0RFMSwKKzB4NTU0QUQzQzAsIDB4NEREQUIxQzEsIDB4RDJCRDE4NTAsIDB4RjZFMTI2Q0EsCisweEY4NzI4OUM3LCAweDg2RUM5MkE1LCAweDRFMDMzOTA2LCAweDUyREM1RjNGLAorMHhDQzZFMkU1OSwgMHhGRjc1MTc1MywgMHhERjhCOEJBMiwgMHhEQkY1OTU0QSwKKzB4QkQzNjc0ODgsIDB4NkEwQ0RGMUYsIDB4NDEwMzEzOUMsIDB4REU0OURCQjAsCisweDVBODQyOEY0LCAweEEyNjg3MkIxLCAweDk2QkY3MjAzLCAweDk5RDVFNzhFLAorMHgyNDM4NTBBNiwgMHgzODlEQUQ4MCwgMHg2MzM1RDMzRiwgMHhFQzY3QjBBNSwKKzB4MDI5QzBDQTksIDB4RjVGNkY2QzksIDB4REY1NzRDMTUsIDB4RTZEM0VDMjksCisweDFBQTM0OUJBLCAweDQ1M0U3MjU4LCAweDdEQjc5QkUzLCAweDUxRkNBN0Y2LAorMHgyQjQyRkNBNSwgMHhCRjBFNDg3MSwgMHg1ODA2M0M0MCwgMHgxOTM1ODBFMiwKKzB4MjU2MDUzMjIsIDB4QkM0OUM0NzksIDB4MEVENzBGQzQsIDB4QTc4QjU5QTAsCisweEU2Q0UzRThDLCAweDkyRUU2NTdBLCAweDYzRDEyNTI5LCAweEY5NURBRjQ1LAorMHhGOTJDM0JGMywgMHg3RDUxNDIwMCwgMHg2OTRERjg0QSwgMHhFRjE3N0UyRCwKKzB4NEUxMTlDQ0YsIDB4QTAyNUM1NUQsIDB4Rjk2OTc0RDYsIDB4MjZEMTNFN0YsCisweDc5OUFEQzI3LCAweEQ3OTI1RUMxLCAweDhBRTYwQkY3LCAweEY5RUYxQTJFLAorMHg4OUVBREQzQSwgMHg5QzI4Q0FDRiwgMHg2MzM3N0VCNywgMHg2RDFFRjdFNSwKKzB4NjU4NUIxNkMsIDB4OTk3MkQxMTUsIDB4NjVGOEY1RTYsIDB4RjkzREVDQjQsCisweDZENzE2MDVELCAweEM2RkRCQ0I4LCAweEQ5MzdCQTMxLCAweENFRDcyN0VFLAorMHhDMzRDNTYwNSwgMHgyNUZBNzBCNiwgMHg1QzBCN0ZCMCwgMHg4RjkzNDBGNSwKKzB4QTMzNzY2OTMsIDB4NDQ5OEI2NkEsIDB4MkQyMUYzNzcsIDB4QzBBNEM2RUEsCisweDA3ODA3MzZCLCAweEY0MkQ3RjA3LCAweEU1NkQ0N0U1LCAweEI0OEMyNUQ2LAorMHhBNDhEQTBEQSwgMHhGRTY5NjkzRiwgMHhGMDFFMTlDQSwgMHg4QTBDNUM4RiwKKzB4REY3MDJDMjMsIDB4RTE4QTkzRjAsIDB4RDRENUM5MUUsIDB4RDJBNzA2RjcsCisweDY3NEY5RTI4LCAweEFGMEY4MEM3LCAweDY0OEQ0OUU4LCAweDZCRTg2NDBGLAorMHhGNUZDRkZENSwgMHg4RURDMzkxRSwgMHhFNTgzRDhCQywgMHg4NDI2QzA5MCwKKzB4RjQ1NkEyN0QsIDB4MDcyNDlCRjQsIDB4MDU0QTJGNDUsIDB4QUM0NkI3M0IsCisweEI4OUVFREZCLCAweDQ4RUFGODY3LCAweDY5QjJEN0NDLCAweENBMENBMEYxLAorMHgzOENEMDQyOCwgMHgwMjk4MDhDRiwgMHg4NkVFNzVEQywgMHhGNEZFRTlGMCwKKzB4Njk4N0Q1RTksIDB4NTZBQjU1MzcsIDB4M0RERDA5NDAsIDB4NDc0MkZGODksCisweDJDM0IxNzlFLCAweEQwNUI1Q0IxLCAweDNDNEU5MDMzLCAweDZCQ0YwMTQxLAorMHhGMkY2RDNFMiwgMHhBRDI5N0IxRiwgMHhCMUNDMjNENCwgMHg1NDUyMDM4QiwKKzB4MTc1MUZDQkUsIDB4MjRBQTQ2NUYsIDB4OTRDNjJEMTgsIDB4RjQ5QjJFQzgsCisweDk3QUM0N0RGLCAweEQ2NkMxOUI1LCAweDA5QUFCMjk3LCAweDg5OTM2MTQ0LAorMHhEMTVDMDI2QiwgMHg0Q0VDODc3OCwgMHg5NDA1MEQ2MSwgMHhEODEyRTk2RiwKKzB4QjZCRDdCMTIsIDB4QTVGOUJFNzcsIDB4NTMxQTVDN0EsIDB4MzYwNUJBNzEsCisweEQ1MDBDRTU0LCAweEUzMjU5NjRDLCAweDMyMzQzMkZFLCAweDU4MEE5REM4LAorMHhEMjVBMzEzNSwgMHgwODlENkM5QywgMHg1ODg1NkY3MywgMHg3REZDRUUzMCwKKzB4N0RFMjU4MEYsIDB4RjRFNDQ4OEIsIDB4NzE4MjFEREYsIDB4RDE5NEY1REMsCisweDdEMDcwMzk0LCAweEJBMjhCRjc2LCAweEFBRjBBMzhFLCAweEQ0RjYyNzVFLAorMHgxQjc0MkU2NiwgMHhEOUU2OEVBOSwgMHg2OEIwRjkzOSwgMHg1MkFGOUQ3QiwKKzB4NTRBMzk3MDUsIDB4MjBGODQ0QzEsIDB4RTY5ODFEREMsIDB4ODAzMjJFNjIsCisweDUzNjIzNUI5LCAweDdBNTdGNEZDLCAweDE0RUJGMzc2LCAweDY0QkUyRTVBLAorMHg3MEExODkxMCwgMHgwRkUwOTU4NywgMHgxMEU5Q0E3OCwgMHg4RjkwRDNEMiwKKzB4QUU3NDcxN0QsIDB4QTU0NEVBRUQsIDB4Njc0NkFGM0UsIDB4NDMwQ0IzRkMsCisweEJDMTg1NTc2LCAweEVBQTM1REMzLCAweERBNjMwOUQyLCAweDQwNjQzRjg3LAorMHg2ODg1OTExNywgMHhBMTdBQzg0RCwgMHhENzkyMkNBOCwgMHhFRjdDMEJFRiwKKzB4ODMzMzczNDgsIDB4OUI0QjE3OTAsIDB4ODg3NkE3N0UsIDB4RjI5M0M5QzcsCisweDIwRDM5OUNELCAweEE3ODIyNEJBLCAweEZEMTI3OUM4LCAweDhCNzgzN0MxLAorMHgwRjFERDQxNSwgMHhBRTNGQkQyRSwgMHhDNEY3N0I1MiwgMHg1MUU3OUZCMywKKzB4N0E4NTZEOUQsIDB4MTRCRkRBRDcsIDB4OTkzRkI2MjUsIDB4NjY3QzY1RUYsCisweDMyRjgzMzM4LCAweEFBMDZFRENFLCAweEFDRTdBMDk5LCAweEQyNkRBRTg5LAorMHhEQzY4OTFDRSwgMHhDRDJGNkYwNCwgMHgyNzQyNUZCOCwgMHg3QzMwMUQ4RCwKKzB4MUVERUJFMUEsIDB4QkU1NDBBRjgsIDB4MUQzNTZDNkEsIDB4OTYzRTg2MzksCisweDk5MjBDQTU1LCAweERFRkU1RjQ0LCAweDEwN0Q1NTQ1LCAweDNEMDc5QkU0LAorMHhFRjY3M0Y2NiwgMHhEQjNDMjk1NCwgMHhERDc2RDY2NiwgMHgxREZCRUY1OSwKKzB4OEYzODRCMzQsIDB4QkU2Rjc3M0MsIDB4MDc5REQxODcsIDB4MjMxNEFDOEIsCisweDVGRUIwMTE0LCAweDU5RTg1Q0YzLCAweDlCRkU5MTkwLCAweEIzNjBBMzFCLAorMHg0RjdFRjk2NywgMHhGRUIwRDU2MSwgMHhCRkU3NzlGMiwgMHhGMzM3MDJCMywKKzB4QkIyNjM0MTcsIDB4MDk2MDdDNjUsIDB4QTg3N0YxMDksIDB4QkI0M0NGRjEsCisweDRBMTkwREIyLCAweDlCN0JEMzhGLCAweEFFQjdDNDQ5LCAweDNEQjNBNDYwLAorMHg3RDkyODUyMiwgMHhEMThBQzk2NiwgMHgxODdGRTc2NiwgMHg5NzYyOTc5MiwKKzB4RjU5RDUwNkUsIDB4NkZCQTIwMkMsIDB4NzcwMzVGRjMsIDB4REEwNjhDREUsCisweEUxOTU3NzlBLCAweEFFQjkyMjk4LCAweEQyQTQ0RURELCAweDEyNTc3RDg1LAorMHhBM0I0N0I5RSwgMHg1QkQwN0NCNywgMHg0QjZBRTNGQywgMHhCRTM1QjZFMiwKKzB4OUQ3RjdBRjIsIDB4OUEzOEVBNzUsIDB4RDg3RkIwNTUsIDB4MzMzOUYyQTMsCisweEQ3Q0I4MkI0LCAweDM1NzcyMUU0LCAweEJFRjQ2NTUzLCAweDlERTI4Q0EzLAorMHgxQjFFQzJERiwgMHhFMjlCOUNDMCwgMHhFRkFFMzQ3RSwgMHhFNTg2NDkxNywKKzB4QTA5N0I3MTIsIDB4NkI2NzA0MUUsIDB4NUIyOTU0MkYsIDB4MDFEOTZFRUQsCisweEY5QTZEQzA3LCAweEMwQjVFM0YwLCAweDIxRTE4OTlDLCAweEU5MzczQTg2LAorMHhGMzE3NjUwOSwgMHg5NTA4NDRBMiwgMHg3RDI0RkZFQiwgMHg1REMwQkNBMCwKKzB4QzQ0MkI3QzEsIDB4MzdEQzZFQzEsIDB4QzY1QzhCQTUsIDB4MThGMEZBODUsCisweDJBRDgwRDJELCAweEM2OENEQ0JCLCAweDZBRTVFQzkzLCAweEUzOTU1REJELAorMHgzRTgwQzRCMywgMHg1MEZFRDEyNywgMHg3NDNDQUJDMCwgMHhEMEU5MTcwNywKKzB4OUJGN0VCNEIsIDB4N0E2MzI3NTUsIDB4OUExOTI0ODIsIDB4OEY5MjNFOUUsCisweEUyRTcwRkU1LCAweDVGNTBBQTE2LCAweDBFQzQ5NkQxLCAweEM2RUM0ODYyLAorMHgwNDBBMDI3NCwgMHgyRkM5NTFDMiwgMHhGNjVEM0E4MCwgMHg4RDU4NTE2MywKKzB4QzZCNTI5RDEsIDB4RDJDQUVFNkUsIDB4RTNFMTEyQjcsIDB4MzI0NDMxMkYsCisweDFCMzkzRTU4LCAweDI0NDRENTM4LCAweEJFNjlBQzIxLCAweEM5MkEwNTA2LAorMHhEMUE3NDQzNCwgMHg0OUMzRUEwNSwgMHgwRTUzQjMxOSwgMHgzODQzQ0UwMywKKzB4OERCODQxNUUsIDB4NzY2QjZGQzcsIDB4NTE1QjlFN0EsIDB4M0JBMDVCMzIsCisweEJGQUZDNDQ5LCAweDMxMzAyQTU3LCAweDE5NjBBMjExLCAweDY2QTA5N0UwLAorMHhCQzY1QTlCNCwgMHg4OUU4MzA2NSwgMHgzNkZEQkYyQywgMHhEQ0Q0NjY0QSwKKzB4MEVENkNGQkYsIDB4REQ0REM2REMsIDB4RDc2RDJGMDAsIDB4QjZEQTY1NDAsCisweDlBMzk2NDQ0LCAweDI4RjE4NURFLCAweEEwRkVGQTFELCAweEY0NzZFMEVELAorMHhFRjE1NTA1QSwgMHgxODMzNjVCRiwgMHg0ODFGRkQ5MCwgMHgyOUFCRUU3NSwKKzB4MUVDOTBCMDcsIDB4QzEwQjI2NTcsIDB4MERCRjZEREIsIDB4NTJBRDAyQjcsCisweEU4N0REQjU0LCAweEQzNzA0MTA2LCAweEQ0RTJDNTkyLCAweDBDQjJERDA1LAorMHg0QkFBMkZGQiwgMHgwMjYxMTM2OCwgMHhENTBGOEYxQywgMHg0MTZGRjI1QywKKzB4OUE2OTc4MkQsIDB4MjY4QzY0NzQsIDB4MkVDRDRENjQsIDB4MTk2REUyRjUsCisweDQ3QTg1NjFDLCAweDhDN0NFNkM5LCAweEQyQjFFMkQyLCAweEEwMzhDMTY1LAorMHgzQUI4ODQ0QiwgMHg0QTY5OTgzMCwgMHgwRkZDMEIxNywgMHg4OUI2ODVBQSwKKzB4REEyNzZEODUsIDB4RTkzNEM0Q0QsIDB4RjUxMTIyNkYsIDB4OUNERDJCMUYsCisweDk0Rjc1NDkyLCAweDU1RUNFQjQyLCAweDQyRjBBM0QzLCAweEQ3RUI0ODJDLAorMHhBNzhEMDM3MywgMHg2MkYwODhBNiwgMHg3RUNGNDYwMiwgMHg3QTM0MDRCNiwKKzB4NDBCMzY0OTUsIDB4NjA0NDFERjQsIDB4NjcyMkY1MzksIDB4Q0ZFNzZDNDgsCisweEI2Qjk0QzlGLCAweDlBREI0QjZBLCAweDFFQkJBNjVGLCAweDVCNTA4MUFGLAorMHhCNzY0NDIzQywgMHhCNkY5MTBFMywgMHgxNEFDNEI2RiwgMHg1QzgxMUU4MiwKKzB4QUEzNkU1RjEsIDB4MjRFQzgyQUYsIDB4QTJGMUMwNTAsIDB4MDUwNDMyNEMsCisweDMwNENFRDBGLCAweDAxRTMxREQ5LCAweEM4MkVDN0U2LCAweEQ1NUFGRkY5LAorMHhGRkIzMDQ3QiwgMHgzMDA2RjJFOSwgMHhDNzI1QkNEMSwgMHg3RENDMTA4MiwKKzB4QTlBMjJDRjgsIDB4NjRENUFGOUQsIDB4Mzg5QzM0QUQsIDB4N0RGRjM3QzYsCisweDQxRjE1MDlELCAweDE4NDVCM0ZFLCAweDA1NUMyM0YwLCAweEM2MjkxRjVGLAorMHhDREQzQzdERCwgMHg1RjAzNTZCNCwgMHg3RkQyQzM4NywgMHg0OTRBMDkxRSwKKzB4NTBDNjlEM0UsIDB4RkU3NjlBNUEsIDB4NjM5MDQ3MDEsIDB4ODk2MEFCRjIsCisweEU2OEVERjNBLCAweDBBQjU3QzhFLCAweDBCOUQwQTZDLCAweDUxODg4MTQ4LAorMHg1MEM1RDUzMywgMHhDNjkwMzhGQSwgMHgzQUNCRTY2MSwgMHgwQ0FFQjYwMSwKKzB4OEMxNEFCNkMsIDB4QkE4NkQ5NEYsIDB4MDcyNDA1NkIsIDB4MEZFRkZDQkEsCisweDEyNDQ5RERCLCAweEFCRkZFQ0NFLCAweEIxMkEyQkQ3LCAweDcyNjBBMEU4LAorMHhCRTE4NEE0OCwgMHhDRkQzQ0EzRiwgMHhERjA4ODY2MCwgMHg3OEVFOUI2NywKKzB4QTlFREIxMTMsIDB4NEZENUQzNTMsIDB4OEUzNDhDQzYsIDB4RDU3OEMzMzcsCisweEYwNDkzQkU5LCAweENDRkI1NEVDLCAweDlDRUVGODVDLCAweDBDQUFFMTVFLAorMHgzNzFBRDEyRiwgMHg5QzVCOTI3MCwgMHgyNDk1RjBERSwgMHgwNkRFMkRCQiwKKzB4OTExQUU3RUMsIDB4RUVERTMzNjMsIDB4NkREMzhENkMsIDB4MkFGN0YzRDksCisweDUxQzhEMTE4LCAweEYyMzgxOEE3LCAweDk1NDM4QUVBLCAweDNBOEE3OThGLAorMHgyMzBEMkJFRiwgMHgzRDE2MjczQywgMHg5QzM2RkY4MywgMHg3ODVDOTUzNywKKzB4M0U0MkFGMkYsIDB4MTJBMTY3NDEsIDB4RTU4RDBEQzQsIDB4MzNFQkVGRjksCisweDZGMTk3MkRBLCAweDEyOEM5QkFBLCAweDg1OEQ2MDMyLCAweERBRjE4NUUxLAorMHhBRTM1NTA2NSwgMHhERTAwODZGMywgMHgwRjY2MUE2NSwgMHhGNDMzNDE2OSwKKzB4QjE1NTlCQTYsIDB4Mzg5MjEwOUEsIDB4RTkwM0JBMDAsIDB4QUUwQ0JENTgsCisweDA3M0MyMUEwLCAweEZDQURCMjk5LCAweEI0RTM5QUYxLCAweDc4NDc1NDU5LAorMHhCNDZEQzg0NywgMHhEQkE5NzY2MSwgMHgxNUQxMThGNSwgMHgwMUVENDhEMCwKKzB4OTlGNjU4QkMsIDB4Mzk5RkRDOEUsIDB4NDRENEE5MTksIDB4N0MyQ0U0QjksCisweENBMDM2N0NDLCAweENDMkI5ODI4LCAweDE2QUFDQUE2LCAweDdBQTVCNkJBLAorMHhGRUM3N0M2NiwgMHgyMzFCMjJGOSwgMHhDOEJFMEQwNCwgMHg2RkYyNzg4QywKKzB4NUY5Q0VCQjUsIDB4OTAxRUFBNUQsIDB4REU2ODJCQkYsIDB4OTk4RTcwRDQsCisweEJEOUNDQ0RBLCAweDY5OTU0NDFFLCAweDU3MDJGMzYwLCAweEJDMDM1RUVELAorMHgyMEY2MEI1MSwgMHhENTczNjFEOCwgMHhDMDcxMTEzQiwgMHg3M0NFNkNFNCwKKzB4QzY1NjlEQzksIDB4RDI0Qjg5RUQsIDB4QTYwNTIyNzYsIDB4OENFRTIwMjYsCisweEZCRjVCNThFLCAweEY2OTJERjgxLCAweDZCN0NERDdDLCAweEY1QjZDMDRDLAorMHhFQzFCQkEyOSwgMHhENkFDOENERCwgMHgzMjA0OTFGOCwgMHgxRDgxMkFDNywKKzB4NjMxQjAwNTEsIDB4RDA4QTREMkEsIDB4NTY5NzQ2REQsIDB4QUE2NTNGQ0YsCisweEE5MkU4RTcwLCAweEM1OUE2NzA1LCAweDI3OEVBMUZGLCAweDYzRTVGQTE3LAorMHgxQzIwRTgyRCwgMHg1NTBGN0NFMywgMHg1NUNFRDQxNSwgMHg1RjlDNEM0QSwKKzB4N0Q3NDYzMTEsIDB4NUIwNzk3NkEsIDB4MTI0NzdFMzEsIDB4QUI4MTEzQUEsCisweDc5NkVEQ0VBLCAweDRBOTBFNEI0LCAweEIzNkU2MTg4LCAweEVFN0Q1RTBGLAorMHgxNUNFQTA2MCwgMHhCODFBQjJDQSwgMHgyOTZEMjJCMCwgMHhGQTA3NTNFMiwKKzB4MEQwRDE1QkIsIDB4RDRBRjhCRDcsIDB4OTUxRkE1NzUsIDB4Q0JFQkQ1OEEsCisweDBBRjVDMzYyLCAweDlFRjQzRkIwLCAweEQ5N0U1MTg0LCAweEExNDQ2OUJDLAorMHhDQUU1RDU1RSwgMHg5M0Q0Q0RGOSwgMHg5NUIwMTNBOCwgMHg2OTk4RjM1QywKKzB4RjFEREMwQjEsIDB4NDc2RjlGQzcsIDB4QjY0NzJCNzAsIDB4MUQ1NUFDNUMsCisweEYwRTBDMEM4LCAweDk1MzcyQkY1LCAweDc1Q0NDREJFLCAweDlGOUQyMDAzLAorMHhDQUFEMEQ1MSwgMHhFRTU0Q0MyRSwgMHhFNUVCREJGMCwgMHg5QjI0OEJCMywKKzB4NEJGMDdEMTksIDB4NTQyOTk3RTksIDB4MTc0NDdDNEIsIDB4Q0YyQjI3NjgsCisweDg2MTE4QTVCLCAweDU3NTc5RjEyLCAweEM1Q0Q5RTc0LCAweDk3RUQ1NzI0LAorMHgwMUJEMkVFNCwgMHgyQTA0MDNBNiwgMHgwMTgzMzc0MSwgMHhBMUU4RDM2NCwKKzB4NEQxQTJFRUEsIDB4NjI3NjAzNzcsIDB4QTEwRDY4NjEsIDB4MDlDNjhFMkYsCisweEFCNDgyODUwLCAweEFDRDI0Qjc0LCAweDUwMzhDOENBLCAweDcxREUzQTkzLAorMHg2NzFEMjVFNCwgMHg5RUE3QUMxQSwgMHgzRTcyODdGNSwgMHg5RkM5NjNDRiwKKzB4NzNGOTBBQjYsIDB4Qzc3NUQ4NDAsIDB4MDBCODY4RDksIDB4RjZBOUJFM0QsCisweDE3RkZCNDcyLCAweDVEMjM4OUUzLCAweDBENDJBMTQ5LCAweDJGQUIxMjM1LAorMHg5MEE3OTk4RSwgMHhEODk1RjZFRSwgMHgxOTkyMTAxMywgMHhFRTQyRUE0OCwKKzB4QzVEMTlBMTcsIDB4NTUwNzg5MEEsIDB4OUY4OTNCMjksIDB4NEZGMzlGMTksCisweEQ2RUY4NUFELCAweDNGRkIxNTk5LCAweEYxNzYxMDE3LCAweEZDNTFCOTBELAorMHg4RjZDNTY2QiwgMHg0NEJBQzdBNCwgMHgyQjJFMzc1NSwgMHhBQkVDQjhEQiwKKzB4NUM0QTE2MjksIDB4ODM3Q0M0RjcsIDB4M0U3MzJCMEEsIDB4ODAzQ0UzMDMsCisweDcxODY1RDhELCAweDM0NjY2NUFCLCAweDU4QkY4MDlCLCAweDEwMDYyNkFBLAorMHg5NDQ2QUIxMywgMHhENTNBRENEQSwgMHg3NUMwQkZDRCwgMHg5NTg1MzMwNCwKKzB4RjQ3NThFODcsIDB4RDZCNjQ1MTcsIDB4MTMyOTNEMEQsIDB4RUM5MzY4RkIsCisweEQ0NDlBMkNDLCAweEFBMTdCMEJFLCAweDlEMEI4NUMwLCAweDc3QkVFRDE2LAorMHg3Njk5Q0FFNywgMHhDNzc2RDEwRCwgMHg5NjJENDhDRSwgMHg4MzhEMDBCRSwKKzB4Mjc5QUVCRjksIDB4MjJFRjgzN0IsIDB4NThFNDZEQUQsIDB4QjU2QjYzMDUsCisweDMyMzJENThCLCAweDE2Nzk2OURCLCAweDVCNjNGNUI1LCAweDdFODJCMTc1LAorMHgwNUREQjQwMiwgMHg1QUIyOUJCQSwgMHhGM0I2MjdENSwgMHg5NzE2OEM4NSwKKzB4QUQ5RUUwMjIsIDB4NDhGMENFRUEsIDB4ODQxMDRDMjIsIDB4NjkwRkNDMTksCisweENBMkYyNDc0LCAweDc2Rjk1NTM5LCAweDlGRDJCOTg3LCAweDc5RUZDNTU3LAorMHhDRUU1REE0RCwgMHgyN0VCOThGNiwgMHhBMDYyODkxNiwgMHg4RTA1NjE0RiwKKzB4OEFDODkwMjYsIDB4NzcwNTEzNUUsIDB4M0Y3RTQyQjgsIDB4N0JDRDc3M0IsCisweEY5OEI5NzQxLCAweENCOEE1MTRFLCAweDkyOTgyMjBELCAweDU2NjVGQTNBLAorMHhFNjZBMUZGNywgMHhBQzRFQ0I3MSwgMHhBN0U1NkZFRiwgMHg5RDFFRjdGOCwKKzB4MjM1NjZCNjQsIDB4QjRGRTgyMkUsIDB4MUFBNTMyMDgsIDB4RjQ1NDVFNUQsCisweEVBODZDODc5LCAweDE4RjZCN0MyLCAweEUxMEExN0FDLCAweEJEMzcwMTFGLAorMHhGQkRGODFCOCwgMHhBOTc4QTRFQiwgMHhENDI0MzdBNywgMHg0NzRFNkE0MSwKKzB4Rjg4ODUyNDgsIDB4Rjc1MEJBQTksIDB4RDIzOEVBNjIsIDB4RDY5QkE3NEQsCisweDI2NkVDNkJGLCAweEU3RURFMDc3LCAweEU4RjBBMzAzLCAweDhCNTZBOTZELAorMHg0MTM4MDk4MCwgMHhEREYwQjE2QywgMHgwMEU4MzU5NCwgMHhBNTAzRUJGNSwKKzB4OTYwQTI1OEUsIDB4NDk5ODI3QkQsIDB4NkM4RTZGN0IsIDB4MTY2Qzg0NUQsCisweEM4NDJDOTM0LCAweEJBRUZDNjk5LCAweEQ5ODQ2MjEzLCAweDgzMkVDMTlCLAorMHgxRUFENzU5OSwgMHgyMjFFN0VFOSwgMHg4MTc2QTMxMywgMHhCMjhEOEUzOSwKKzB4QkFDMjlBOTYsIDB4Qjk2NEY5MUYsIDB4M0YyNjgxNTAsIDB4RDRCQjcwMTEsCisweDM0N0VDNDQ1LCAweDdGREM5RTgyLCAweEVCNzBGNEM5LCAweEE2RjM4RUJGLAorMHgzOThDRjEzNywgMHhEN0Y4OENGNSwgMHhDQkREQ0IzRiwgMHhBMERBRkE3NCwKKzB4RDI5RDMwQUQsIDB4ODIyQjY5MTksIDB4Q0UwNTk5NDksIDB4M0E5NDYxODMsCisweERFNEM1NzJELCAweEQxRTZEODQ0LCAweEM0M0M3REFDLCAweERCQkVFREQwLAorMHhBNjU2REY2RCwgMHg0NTRDMjJBOSwgMHg5RkE0ODc5MCwgMHg2OUIwNDUzMSwKKzB4OTlCQjMwNUYsIDB4ODA1MDBGNzEsIDB4RkUyMzYzQzIsIDB4QjY3RjUzOEYsCisweDMwMkVDMEMzLCAweDRBNkUzNDU4LCAweDU3RTRDRkQ0LCAweEU2NUNEQUVCLAorMHhGMzFBQkIzMSwgMHg2MkRGOThBQywgMHg4OTRBRTc4MSwgMHhCMTU4OEFCMSwKKzB4NDVENUNDM0UsIDB4MzUyMEY1QjAsIDB4QzcyRDBDQjcsIDB4QTFENkNCRjksCisweDc0MkZGQTYzLCAweEEwQTUyMjRGLCAweDVFQTFDODVBLCAweEI4MUU5Rjc3LAorMHgzMUQ3NkM0RiwgMHg1MjUyNTdGNSwgMHhCRkY4NTAwOSwgMHgyMTI1QjI3MCwKKzB4MTZFNDdFNkUsIDB4OTEyOEI5ODEsIDB4MEQ1RkJFMzksIDB4RjY3QTQxOEMsCisweENGM0M3MUNCLCAweEFDMDRBQkUxLCAweDlCNTUwQUFGLCAweEI1MDc3RjE4LAorMHhGQjdDNUVDMCwgMHg2NDc4NERCNCwgMHgxRTY2OEI0OCwgMHg4NDY1OTgzNiwKKzB4NjA0NDU3QkYsIDB4RjZGNjlDOEQsIDB4Mzk0MzAxREMsIDB4RUQwMjExQkQsCisweDhCQUMxQTNBLCAweEJCNzUyRkQyLCAweDc4QjhDMDM2LCAweEJDQjk4RThBLAorMHgzM0M1OTVERSwgMHhCM0YzQzVGOCwgMHg2OTg2NjZBQywgMHhBMUY0MkQ3QSwKKzB4NTc1MUFDQzgsIDB4QzA2OTU3NUIsIDB4MzVENTBGOTksIDB4QjI5NEJGMzgsCisweDgyQTRBMzMxLCAweDA1MTQ3NzUxLCAweENBRTE4QzEyLCAweDlFODlBQUYxLAorMHgzNTMxQzM3MiwgMHhCMjExNEE4OCwgMHg0MTc5NzIwMSwgMHhERERERUMxMCwKKzB4MDExODVGMkEsIDB4REVENTBDREMsIDB4NzIxNTZCQUQsIDB4ODhGM0RCOTQsCisweDUwNDUwRERGLCAweDZCMUU3QUJGLCAweDNEMzE3NzA4LCAweEZERkY1QTE1LAorMHhEQzhCMTY5NywgMHhDQzIyNDhGRCwgMHhEOTE5NjI3MiwgMHg0NDQ1MTk1RCwKKzB4NTREOTAyODEsIDB4N0E4OTFDOUQsIDB4NjlGRjk4RDUsIDB4QURFNkQ3NEIsCisweDI2RDI3OTczLCAweDBGMTQ3MzRGLCAweDNGOTU3RkM4LCAweDgxMkFDODc0LAorMHhFREMwRjlCNCwgMHhEMzFENkQ3NSwgMHg3QTI2MDhDMywgMHhEODk5ODRCMSwKKzB4RjU4MTA4MUEsIDB4RURCOURGNkYsIDB4MTZFQ0MxOTEsIDB4NkI5NDU3MjQsCisweDFCQ0U4MjY5LCAweDAyRTZEQjY4LCAweDU2MzYyNTQxLCAweDlEMjQ3Q0Y0LAorMHhBNTI2NUU3MiwgMHgyQzhCOTQxMywgMHgxMTU3REI0QiwgMHgzMTQ1Q0ZCMiwKKzB4RkJERUJDRjUsIDB4MTA0MkIxMTcsIDB4Mjg0REFFMTgsIDB4MTA1NzVDMjEsCisweDFEREU1NzhFLCAweDgwRjU5RURFLCAweENBQjUxQzA0LCAweEI1OTRCREE4LAorMHgwOEFDRUY4NSwgMHgwOEM4RDRDNywgMHg3MzA0RDQzMywgMHhFODdEM0E4OCwKKzB4MzFDQ0ZFRDgsIDB4MUQ4RTcxRTUsIDB4QzVBMkYwMkMsIDB4QUNCRjNCNUUsCisweEFBMTYxQkNBLCAweEExMEJFNTc3LCAweEY5Q0U0MUQyLCAweDJCODZGMDMxLAorMHgzRDRBOEQyMywgMHhFRDkyNkRFNCwgMHgzODQ0RTIxRiwgMHhGRTU3QkNEMCwKKzB4MzZEQzMwOUQsIDB4MTcxMzc0MDksIDB4OUY2QTg1MDcsIDB4MTRDRjEyRUIsCisweEE3NzBBRkI1LCAweDdDNkRBMkU0LCAweDg1NkI0OEI4LCAweDJFQTIzNURGLAorMHg1NUJEMTE2NCwgMHg1QkQ5RkYwQywgMHg1MjI4QzU1MiwgMHg5RTcxOUFGQSwKKzB4M0VDMzcwM0IsIDB4RTA2QTk0RjMsIDB4Mjk2RkYwRDksIDB4RTQ2OEQ5QzksCisweEQyQTE1Q0RDLCAweDZDNEVBQUEyLCAweDJBRjNCOEJGLCAweDZCNkVEQzc4LAorMHg0MkI3ODk3MiwgMHg0Qzk3QTY2QywgMHgxNjFDMzBCRiwgMHhDRDI4MTZEQywKKzB4NDMxQkRBMTcsIDB4RDk2NTMwMjIsIDB4NjdEOTVFMzksIDB4QkNCMTgzNDIsCisweDIyNzk4MkU3LCAweDIzQzVCMTFCLCAweDUxNDQyMEFCLCAweDA4OUYzQTVDLAorMHgyQjJGODI0NCwgMHgyRjJBODBDOCwgMHhCMEE5MDU1OCwgMHg3NUJBQTI0MywKKzB4RTJGQzRGNjIsIDB4RUIwQTYxMDQsIDB4QjdGMjIxQjIsIDB4NEVDRDc5REYsCisweEIzRTA4QjhCLCAweEJBMjVFMUNCLCAweEQzOUYzNDMxLCAweEI1MDIwMkZFLAorMHg3OEYxNUVDRSwgMHhFRkY2MUVDRiwgMHhCM0NEREQ1MCwgMHgzRkQwNjRBOCwKKzB4OTZCMDI4QkMsIDB4QjI5REQ0RTEsIDB4N0U5RUM2MjksIDB4QzQwN0Y0RDEsCisweDhDMjE3ODVCLCAweEUxMTc2N0JBLCAweENGRTZERTI2LCAweDBEQTk4RTIyLAorMHgzM0FDNTY3MCwgMHgwRkRCQzE3NSwgMHhGMTFGOEVGNSwgMHg2MDYzODg0MywKKzB4OEI2N0U1NUEsIDB4M0YyN0Y3NUIsIDB4NjY5MUZCOTgsIDB4NjM1QTM1QTksCisweEIzMTc0NTlDLCAweEU3NDE5QzAxLCAweDhCQUIyOEQ3LCAweEUzNDdENzkxLAorMHhFRkMwMTlBMCwgMHg0NTAwOTA0MSwgMHhBNkRFQjNFOCwgMHg2RjczNzlGRiwKKzB4MEZGNTAzOTAsIDB4ODEwQkVFNzgsIDB4QUQxMzcxNkIsIDB4QTdEQkQ3QUIsCisweEVGNDM5RDRCLCAweEREQTc0NEE1LCAweDMxRURERThELCAweEE4NUI3MUYyLAorMHhERjQzOUM3MCwgMHhBN0UzREE5NCwgMHg1MjVFRDQ1MywgMHgzRDkxM0MzMiwKKzB4RDEwNENFNjEsIDB4NDJGNUZGRUQsIDB4MTRDNzYyNUEsIDB4NEU1QjMxNEIsCisweEE3RUFEMUVELCAweEZBMDFENTk1LCAweEU2N0JDRjA2LCAweEU2MzY4NUUyLAorMHgzQTMyRTlEMywgMHgzNzRDMjVGMCwgMHhBOEU4QTQxRCwgMHhBNDAzQUVGNSwKKzB4OTAxQTE5NEMsIDB4MTc2MDVCQzksIDB4ODUyMkREMTIsIDB4MjcwOTZCQUEsCisweDAxNzQzNEI3LCAweDk5QzhEMkRBLCAweDdGOTZCMDY4LCAweDg1MjFDRDA5LAorMHg1MjlCNDZENiwgMHg0Nzg1MjgxMCwgMHgwMjFCQzhCRiwgMHg5M0M5ODMyOSwKKzB4NkZFNzNBNzgsIDB4NDREQjY5QTksIDB4QzgzOUQ0OTAsIDB4Q0FDNDJBRkUsCisweENGMUVDQ0Y0LCAweDZGMkU1RjQ0LCAweDc5NUM4MjE5LCAweEEwNkM2NjdCLAorMHg4MDQxMUYzMSwgMHhCMDk5MjZFMSwgMHhDNjJCNkMxOCwgMHg3N0M2RTZERCwKKzB4NzYyMkZDMDcsIDB4MDIxNjJEQjIsIDB4M0VBMzEzMzQsIDB4NkNDMDJCNEEsCisweEFBNkI4MUMzLCAweDQ0MjRBOUE1LCAweDI2QkQyRUYzLCAweDMzNDg5NkQ2LAorMHhBREREMjcxMSwgMHg3NjAzNTc1NywgMHg4MEFBMzI4RSwgMHgyRjM5QzA2RSwKKzB4MzU3NTIwQ0IsIDB4RjYyQkRGNDYsIDB4QzU5MzQzQzQsIDB4N0NBNENBRTIsCisweDg5QjAzRUYzLCAweDI1MUE3ODVCLCAweEE0NzU1QkI5LCAweDI2MkQ0NzhELAorMHg0NjJFNjI1MiwgMHg2QjVGNkJFRCwgMHhDQTQ2RTc3QiwgMHhBMkNGMDhBRCwKKzB4NTYxRTE5RUEsIDB4QkYzMUFBMTUsIDB4RDM3NkY0NEMsIDB4Q0MzMzIxNTAsCisweDhDMEFFRTQyLCAweEMwNkQ1RjkxLCAweERBREY4NjEzLCAweEJFMEZBMjJDLAorMHhGNTBBRTQ4MiwgMHhFMzYxNTUwMSwgMHhFQ0M4RDVBQSwgMHg1OEE3RkQzRSwKKzB4RDU5QjhDQzksIDB4MDlEQjA5ODcsIDB4RjFEOTc1M0QsIDB4OUM3OUUyMEUsCisweDlBMjIyQUVBLCAweEM0RTU4OTE0LCAweDY3MTJFMEEyLCAweDhDRDVDODBFLAorMHhFQUI4QUE1NiwgMHhEQkZBOEQ5QywgMHgzNTE1QkQyMSwgMHhCNjVCOUUwQywKKzB4RjBEMjdGRUUsIDB4RTMzODcxQzEsIDB4RUU4RkU1MkYsIDB4MDJBQ0NCM0YsCisweEU5MTk3Mjc3LCAweEI3QjcwNzcwLCAweEEyNkUzNTgxLCAweDgyNDgxRTdGLAorMHgwMDVBRjk5RiwgMHg4Qjk3MEI0QiwgMHhFQzc0QjY2MiwgMHgyRjIxQzVBMywKKzB4MDQ5REJBODMsIDB4NDk1QjNFMUIsIDB4MTEyMjM0QjgsIDB4OTVCNDJBNUYsCisweDJDOEZBODMzLCAweDZENzA2RTMwLCAweDJBQUFFQzA5LCAweERFN0MzMzc3LAorMHgwNkNFOUQ0NiwgMHg3NTc0RUFBQiwgMHhGQ0IxQTA4RCwgMHg0NjJBRkI2QywKKzB4MTkyODQ3QjIsIDB4Q0MxNDlBQzMsIDB4NDI3ODM0Q0UsIDB4RTkwMTgwQTAsCisweDk0NkU1MjZFLCAweDYwMThCRTRFLCAweDIwNDQyRjUyLCAweDFEMzlGQTA1LAorMHgzNUY2OTBBRCwgMHgyOURCM0E1MywgMHg2MzYwMTU4QywgMHgzRUM4MTVGOCwKKzB4REVENjUwQUYsIDB4RkExNjhCMzcsIDB4MjMzRjhBM0QsIDB4MjQ1MDA5Q0YsCisweDcxQkIyMjM3LCAweDQ5ODlBMDFDLCAweEQ1OEFFNEYxLCAweDYyQzk5RUEwLAorMHg0OEU5MDU2RSwgMHg3RTFBNzg2RCwgMHhCRjZDQkFBQiwgMHgyMjY2OUE2QiwKKzB4NTc4NTc1OTAsIDB4RTQ1NThDRTMsIDB4QkM2QzYzRUMsIDB4NkFFMDJBNjEsCisweEEyQUJGQkJCLCAweEQyQjJGRTkwLCAweERGOEJEQjQzLCAweEVDMkQ1OUFDLAorMHg3QjZBRkRDMywgMHg2QjAwMUQ1RiwgMHgzREZFRTA4RiwgMHhCOUE1OTdENiwKKzB4MDlERUFDNjgsIDB4RTQyRDlFNzMsIDB4MkUzMzUwN0MsIDB4NjUyNUYwNTEsCisweDBENzE0M0M2LCAweDAxREQxMTVCLCAweDk0MTgwMjc5LCAweDI4RkM2MEQ3LAorMHhDMDkwMDYwMywgMHhFRDRGQkU1MywgMHhGQzA2NzdCRCwgMHg3REEyQTg3OCwKKzB4QThEMEVDNzMsIDB4RjZBMDlCMkEsIDB4MjRBMTI5RUUsIDB4MTY5QkNBMkYsCisweEUwQkFFNTI2LCAweDVDOEUyRkNCLCAweEEyMThFRkZBLCAweDg0MkI2MUZCLAorMHg4N0I4NjBDRCwgMHgxMDZFOUI4NiwgMHg5MzA2ODVGMCwgMHhDNUE3MjEwOSwKKzB4RkI5NzdCRDUsIDB4OUQzQjRBQzYsIDB4REEzNzhGRTAsIDB4MEFBRjc0N0IsCisweDA0MDhENTBELCAweDQ4ODc4NUI5LCAweDgxQUU5NzFELCAweDEyQURGRUYzLAorMHhGMEI2NDEyOCwgMHgzRDRDOTBCQiwgMHhDOTk0QUFBMSwgMHhCODU0NDAwRSwKKzB4OTAxQUUzREQsIDB4N0E0QTBERTcsIDB4MThFMDc0NTYsIDB4MjBDMzhCQ0QsCisweDk0NDQxOTc2LCAweEUyRTQxOUMyLCAweERCRDNDOTJGLCAweDRERDYzODQxLAorMHhFMjk5NDk1OSwgMHhGNDFGMTk2RCwgMHgwODM1NDMxQSwgMHg5M0EyRTlDRiwKKzB4QjAxRkFCRUQsIDB4RDAxMzU1MzUsIDB4RUJDRUExOEQsIDB4QzRGODNBMUIsCisweDVENzI4NDVDLCAweDA0MzM1RTNBLCAweDY4QzRDOTg3LCAweDc3MTc4NzEwLAorMHhDNTI5M0E5QSwgMHg0NEU0MEFFMSwgMHhDRTQ1NEZERSwgMHg3MURFODlCNywKKzB4QTM3M0Q5RDMsIDB4NkQxOUU0ODMsIDB4ODEyODk2RDYsIDB4QzMyMzFDMTQsCisweEU5NjBBQkE0LCAweEI3RkI2RjgzLCAweDFGN0M0RUI4LCAweEQxMERCRTY5LAorMHg4NTc1Q0Y2RSwgMHhDMDNCMTVENSwgMHg0RDdGNEVGMywgMHhGMDYxNUYzMSwKKzB4MzRFMjE3NjIsIDB4MjJENUE3QTEsIDB4NzI5RkEzRjgsIDB4MkUxMDUwRkIsCisweDhBOUY0NkRDLCAweDUzNUVCNUE3LCAweEQxNDM1NjBFLCAweEY4RUMzQTRCLAorMHgyMjQ5RkQwNiwgMHhFOEUyQUIwOCwgMHgxRTczNDEyNywgMHhCQTVCNjM1QSwKKzB4RDhGNDE5REIsIDB4MEI1MjAwRDAsIDB4ODExMDMwNEYsIDB4MzQ5N0RBODAsCisweDM1Q0E3MUNELCAweDBGRDgyMjdFLCAweDA4NkM3NEUyLCAweEFCNjhBMUFGLAorMHhFM0JENTdFQywgMHg4M0I0MkQyOSwgMHgzQzJENjcyRCwgMHgwNUQ4NUNFRCwKKzB4NjRGMDQ5MjYsIDB4OTEzNjRBMTIsIDB4N0ZDNzMzNDksIDB4RUJBMUZDNzcsCisweEVDRTBEMjBELCAweEIxREREQjlCLCAweEVCNkI0OTJCLCAweDBGQzAyQkI2LAorMHg1NjIwMUQ3NiwgMHhFRDIwRjc5RSwgMHhGQzYwMzRGQiwgMHg2QTUzOUYxRCwKKzB4NTIwRkVDQkYsIDB4NEUzQUVDRjYsIDB4NzZCMDFDNzQsIDB4RUZDNDIxRDQsCisweDgyQUM5ODlBLCAweDQwN0E3N0NELCAweDZEMjg3QkZFLCAweDI2NjE3NDI1LAorMHhFQTIzMTZDMywgMHg4NjE2NTU0RSwgMHg5RjRDNDUzNSwgMHg4OEMwQzZDMSwKKzB4RUFDNEYwRjcsIDB4MzJDN0REOTMsIDB4NDFEOUMzN0UsIDB4MkE5Q0JCMkUsCisweDA1OTFCQUVGLCAweDJCRTQzRjIxLCAweDVFMDZFRTRELCAweEREREY1NTI1LAorMHhFQzEzN0RCRSwgMHhGMEFBMjk1QywgMHhGMkM5RkRFMiwgMHg1REY5RDY5MywKKzB4MTBBNkNBQzAsIDB4QzY4NDZEMDksIDB4RjFEREFCRjMsIDB4RDU2RjhCQkMsCisweEFBNURDRTlELCAweDZGNTkwMDRGLCAweEI4QTAzNUJDLCAweDYxRjQ3MjgyLAorMHhDODlEQUM5RSwgMHhGQzdFNUIzRCwgMHg0QzU0MDZERCwgMHg1NENGRDE0NywKKzB4QkI0NEFCMkEsIDB4NzkxMjY5QzAsIDB4OENGNjZCNEQsIDB4RDAxQTMxOTAsCisweDYzNkY0NUNBLCAweEIzMkZDMjA5LCAweENCOEI5RjQ5LCAweEY0NkQ3NEI5LAorMHg1QUZDOUJEMCwgMHhDNEM3MTZDMSwgMHhGOThDNTRGMywgMHgzNkFGRjAxMywKKzB4QjRENkQ5MEIsIDB4NUYxMjk5QjYsIDB4QTNCRkNGQTQsIDB4RUEzMzZBQUQsCisweENDRDQ0M0RBLCAweDc0Q0E0MEI0LCAweDMxRUYxNjE0LCAweDM2RDNGRkVFLAorMHg4NzZBRTI1MiwgMHhDOEQ2MkU5RiwgMHg2NDI0RjM5NywgMHgxRjczMEYyRCwKKzB4QjIwRkRBNTMsIDB4RkNGRUU2MEYsIDB4Njc2QTYxQzMsIDB4MjZDNUUxNDMsCisweEMyMDE1NzNFLCAweDRBOEM0NkJFLCAweEVGODdEMEE5LCAweEUwN0U4MEI0LAorMHgzNEYyMDEwOSwgMHg4QjkzNkE3MCwgMHg5RjhFMDMwNSwgMHhGMzI5N0NBMCwKKzB4NEU3QkYwRTksIDB4MEYzNzRCQjksIDB4Q0U3OEEwMUUsIDB4NUZFMjZERDgsCisweEEzODI2QUNGLCAweDMyMUY2OUFCLCAweDQ0MUFGMTRFLCAweDhBQzE5Q0Y3LAorMHg0QkZEMUFENiwgMHg1OTUxQUJEMSwgMHgwOThDMTdGMCwgMHhBOUI3NUY3NiwKKzB4QTQ2MjU1MUIsIDB4NkI3MDNBMTIsIDB4RURDQjU3QjIsIDB4OENENEM5MzMsCisweEQzMzhEM0Q4LCAweEUzNDNGQzI0LCAweDlDREQ1MkVCLCAweDE3QTQxOTQyLAorMHg2M0E4RUY1MCwgMHgyMTVCQjExQSwgMHhFMUUyNUNCNiwgMHhCNjJDMEE4OCwKKzB4RTU4Q0RFQzMsIDB4QzBFNjM4OUEsIDB4MkI3QkVFNTUsIDB4QTNGQ0JEMDcsCisweDdDRDQ1MUZFLCAweEIwNkY2NzI0LCAweDU2NzVBN0VBLCAweDE0MUQ1MkZDLAorMHgwNUU4NkU5QiwgMHg1M0Q3NUMzQSwgMHhFNzk5QUEyQSwgMHhFNDc0Mzg0QywKKzB4OEM4NUU2RTYsIDB4QTQ3N0E4RDcsIDB4QTFFNkFCMEMsIDB4OTAzM0U3Q0QsCisweDJGNTVENTA0LCAweDREQUU4MUZCLCAweEJEMjI5QTY0LCAweDg2Mjc2NUM5LAorMHg1QjZBODVGMCwgMHg5NUEzOTMyOCwgMHgzODgyNkNGQiwgMHhCRjdERUJBNCwKKzB4NDJFRkFCNjIsIDB4MkQwQkJBNjAsIDB4QjA2NzMxQUYsIDB4MTZENEM0QjAsCisweENBNEI5MjY0LCAweDNERjI0QUUyLCAweEZFRDkzODQ4LCAweDdDQjMzQjA4LAorMHhBQzlDQUU5RiwgMHhBMEY4MEI2MSwgMHhBNjZDRjcxMywgMHg5MzY0ODY1RiwKKzB4REZBMUUwQjMsIDB4RkU2REYzM0YsIDB4ODAzOUE2MTIsIDB4MTE5RjYwQkYsCisweENFRURFMzA5LCAweEQyODMxNkE4LCAweENENjFEMkY1LCAweDNDQkVCMDE1LAorMHg4NUMwQkY1MSwgMHg2RURCQkMxNSwgMHg3OUYzRDIwNywgMHg0ODVFRTRGQSwKKzB4Q0VDMzAyRUEsIDB4NTlEOEI5MkQsIDB4NTFDMUZCMzYsIDB4RjRGRThCNzEsCisweDJEQkQ1NzE4LCAweDg0MDI0MDQwLCAweEZERDY1OTBGLCAweEExQ0U5Q0M5LAorMHhDNEFFQUI3MiwgMHgwQTJGRThCRiwgMHgyOEMzMzYxOCwgMHhCQTRFMTVGQiwKKzB4QTlDNzI4MTksIDB4QTNFRTQ1RDcsIDB4RDJEQzUyRjEsIDB4M0ZDODRBMkUsCisweDFDOURGNzNFLCAweDYzMkY5QkRFLCAweDdFOUZCRDIwLCAweDBENjg5Qjc5LAorMHg5MUU4RDVDMCwgMHg2RUU3OTUyQywgMHg5MDVGMTkyRSwgMHgyRDc5RTcxMiwKKzB4ODY3MEE3QTIsIDB4MURCRkM0RDksIDB4NjQ2MzQ0MjksIDB4RTYzNjA0M0IsCisweDY0M0M2QjBGLCAweDUwQUYzMjdCLCAweDBFNzM0RDYxLCAweDJEN0Q2RTQ2LAorMHhCODc3RENENiwgMHg3Q0NGNEYxQSwgMHhERjREOENGOCwgMHgwRTdGQTc4RSwKKzB4MENCQzRFQzIsIDB4QUU5QjRBMjIsIDB4NEYwMkQ0OUMsIDB4NDhGMDlDNDMsCisweDUwMzFCMUEwLCAweERDQjhBMUZDLCAweDkxQzczNTk5LCAweENGMDBBNjRELAorMHhERkNFNTYxRSwgMHg4QjE4MTU3RCwgMHhFMUVENkE4MSwgMHhDRjk0RUYzNiwKKzB4QjQxMkNFMUEsIDB4NjAyRTIwNzYsIDB4NzE2QjBGM0YsIDB4QURFQjMyQzAsCisweEQ0RTE2MDk0LCAweEVDOTVENDFGLCAweDc1ODU4NzY3LCAweDQzOEFEMUExLAorMHhFNjFDNTUyNywgMHgwRDcxRkJCMiwgMHgyQTk5RDA3MCwgMHg1QzAxODgyNiwKKzB4Q0NDQzI3RkQsIDB4MDUzODgzRDksIDB4RjFEMzBFRjUsIDB4Njc2QUQzOEEsCisweERGODFBQjI4LCAweDIyNTdGQjlELCAweDM3MzMxM0FFLCAweDY3RTFGRThBLAorMHhGNEY2NkIwMiwgMHhBRkY4QzdGQSwgMHgzQjYwRDk0RCwgMHhENDREMEZFMiwKKzB4NUZDREZFNEIsIDB4QzYzMDEwQjYsIDB4MDZDRkNDRjQsIDB4MDlEOEREODUsCisweEFCNzlGMkJFLCAweEQ1QzBDNDk4LCAweDczNjRFNEZELCAweEIyOTVDRURGLAorMHhEQjg5QTA2OCwgMHg1OUE2QTBDNywgMHgwQzgyMzIwNywgMHg3MzgwRkNGRSwKKzB4NkUzM0M0QjksIDB4MDc0NEU0RjIsIDB4RjY2M0JCMzMsIDB4OUVFNTEyQ0UsCisweDg3MEVEMzVCLCAweEI0NTAyNjU0LCAweDM2N0NENEZELCAweDVENDIzOEQ5LAorMHhFQUIyQjg2RSwgMHg2RThBRERBQSwgMHhGMDgwRURENiwgMHgxREM5MEY0NiwKKzB4QjFGQzkxMjcsIDB4NjM3NzEzOTIsIDB4OTY3MjlCRjYsIDB4RDE4RTE0MTMsCisweDVEODU5MzhELCAweEI4Q0VEMzQ5LCAweEY5Qjg4NkMxLCAweENBNDg2NTYyLAorMHhCQUE5RUQ3QSwgMHgwNDk3MThEOCwgMHg3Q0Y4RTY3QSwgMHgxNzAyODQzQywKKzB4NkRDREMzNEUsIDB4OTNDNTFGODMsIDB4MjQxNUE0RjMsIDB4QThENzdCM0EsCisweDBGQjgyM0U4LCAweDQyNEYwM0MzLCAweDlDQUE1MDNDLCAweDdBQTU0MzNGLAorMHgzQkRENzRGRSwgMHg5OUQzMzMyRSwgMHgxRTYyMjMxQiwgMHg5MEE0RTU5NSwKKzB4N0VEQTk3NEQsIDB4NDNFMkNEMTQsIDB4MjdEQjlEOUYsIDB4NTYxRjVDQzYsCisweEE3N0VBQkE2LCAweDk3ODY3QjQ4LCAweEFENjUzM0NFLCAweEVCNzI2Q0Y0LAorMHg1ODU3QjIxNywgMHgyRDdEQTEwQiwgMHhEOTM5QzIwRSwgMHg4MUYxRjA3MywKKzB4RjQyREVBRjIsIDB4M0FENzc4MEUsIDB4ODhDNzc2NjEsIDB4RDJFODE5QjIsCisweEY4NzJGNTgxLCAweDk5OUYwQzVBLCAweDM4ODdBQkE0LCAweDI3Rjk1QjZELAorMHg5OTFEOTQ1OCwgMHg5RDFCQjEzMSwgMHg2RUNDNTI5OCwgMHg5RTlBN0IyNiwKKzB4NkU2NUYyNzEsIDB4RTkwRkEwNEMsIDB4N0I2OTJBQTAsIDB4ODc4OTQzRDUsCisweDkyNDg5NUU1LCAweDA0MUJDNzNBLCAweDQ0OEUyOEIyLCAweDYxRDIyRDFGLAorMHhFNzk2OTc3MywgMHhCQzhFNTk4MCwgMHg5QTE5ODg1MiwgMHhCOTQ0MTVDOSwKKzB4QTAyMzc0QkEsIDB4MzQwQkQ1RjMsIDB4MjdGMkEwRkYsIDB4MzlCREIzM0YsCisweENDMDQyQkNGLCAweDgzRDZDMTM1LCAweDlDN0E4RDhFLCAweDA1ODIzQzIzLAorMHgyRDdBM0Y5MSwgMHhFNzkyQkNDQSwgMHhBMkQ4MjE3NywgMHg3M0M4MkU3RSwKKzB4QkVCQzk2MTMsIDB4OUY1OTZDQjAsIDB4NkU3ODRBQTcsIDB4MUI3QkRBOUYsCisweDg0NjM5MUY3LCAweDg1MkFEMDcwLCAweEY4MzFFOENBLCAweDE2QTc4MjIzLAorMHhGNjhGNTI1MCwgMHhFMjU1NDQ5MywgMHhEMzhGMkFGQiwgMHg3NjRCQTdBOCwKKzB4M0NBRUZDNTUsIDB4NkU5QjkwMzcsIDB4RDg3RDQ4NkUsIDB4NzM1MkFFQTksCisweDExOTg3RUUwLCAweERGN0U4NERBLCAweDI4MzhFNzM2LCAweEE4QzdCQUMyLAorMHhGNDlFMjFFRSwgMHhGQUQxMDZFOSwgMHg3MzYzQUM2RiwgMHg1RTk5NzRDQiwKKzB4QkEwMDhCQjAsIDB4QUY1REIzRkMsIDB4N0FDM0NGRDcsIDB4MkQ1NUVEQzYsCisweDJDMUM5QUQ3LCAweDZBM0FBNDk0LCAweDVGMEUwQTNBLCAweDM3NDIyQkZBLAorMHg4M0I0RDU5NCwgMHhCN0VDQ0Y2NiwgMHg4MkZDQ0REMCwgMHg4RUNCRkQ3OSwKKzB4NjY0QjkzNDEsIDB4MDJGMTc4QTIsIDB4MjA5NUM4RTAsIDB4RkM1RjE3QjcsCisweDE4MTBCQTlCLCAweDk2NEU0Q0QxLCAweEZCQUVEODA4LCAweERFRTg3Nzk2LAorMHg2M0RFNEY2OSwgMHhDOTkyNzVERCwgMHg2NTI0MjMwNCwgMHg3QUI1QzI4QiwKKzB4MDFCQjdBM0IsIDB4Qzg1RDc3MTYsIDB4MzJBRkI5QTMsIDB4MkVEMkNCQjEsCisweEIxOTQyMThGLCAweDIxRkU1NjBELCAweENCNDUwM0E1LCAweDVDRTA0NjRELAorMHhDNEFFOUEzQywgMHgwNjE1MzBDQiwgMHhFREEzOEU2QiwgMHg0MDI5RDNFNiwKKzB4QjBDMjAzMzYsIDB4QTM3ODI1QzAsIDB4QzY4RjhCMzcsIDB4OTQwNUFEM0IsCisweDhCMUE4Rjk5LCAweEE3NjFERThCLCAweDY4M0IzMjU5LCAweEExNTRDNTU0LAorMHg2QkQ4MzVDOSwgMHg2REVBRTM1QSwgMHhCRUFFNkQ0OSwgMHgyMUQ4QjA3NCwKKzB4NDZDMDFCMzEsIDB4QkU5QjNBMTYsIDB4MUQ2MTFFQUEsIDB4NDIzQUI3NEMsCisweDkzMUY1QUY1LCAweEJCOUUyODlBLCAweEE0MTAxMTMyLCAweDRBOEJFMEQ3LAorMHgzMzA3RTRCMiwgMHhERTc4REI1RSwgMHgzNDdFQjVDRSwgMHgxM0VFRTk5OSwKKzB4MkMyRDc5NTUsIDB4QkE4OTNFQkEsIDB4NURGQzJFQzEsIDB4RTdERDdBNUYsCisweDVFMUM2NEQ4LCAweDQ1NTJFNDQ3LCAweDE4MzdEOEU0LCAweDk3MTE4MzZCLAorMHgzMjE5Rjg5MywgMHgwNDM5MkM4NCwgMHgzRTk0ODQ4QywgMHgxNUU1RjQ4MSwKKzB4MEVDNTg4MTksIDB4NzM0MUQ0NTgsIDB4NEFFNjM3MTEsIDB4ODVDMUZEMUYsCisweDk3QjU4QkQ3LCAweEIwNTUwRUJFLCAweEI5MTA4NzQzLCAweDZGNTNCMzg2LAorMHg3QTczRjMxQiwgMHhFMDdDRjhCOSwgMHg2MUZGMjdDOCwgMHgwNkE5QThCNCwKKzB4RUIwRjJCQjksIDB4NDZEMjc1RkIsIDB4Q0YzOUI0NzQsIDB4QzM0RjNCNkQsCisweDUyRjJGMTE5LCAweEQ4Nzk2M0JGLCAweEM2MEJGMTZDLCAweDc3OTdEMEFELAorMHg3RUE0REJGMCwgMHhEMjE0MDlDNywgMHhGNjc4QTkyNywgMHg2MzhFNjdDRCwKKzB4OTMyNjFBRUQsIDB4RUE5QjI1RkUsIDB4MUVCQ0FGREMsIDB4NTgwQ0M4MjksCisweDU4RDFEQTFBLCAweDY1ODg4MUY4LCAweEM0OERCNjgyLCAweEQ0MkU4Q0I0LAorMHgxREYzM0Q3NCwgMHgzMUMwNEY2OCwgMHg3RDg3MUUyOSwgMHhBRTExRkQ3MiwKKzB4RDdFOEY4RjYsIDB4NTMwRDlEOUMsIDB4NTgwQTA3MTUsIDB4MEYxN0IxQTMsCisweEI4NjNGNDJGLCAweEE2QTREQzA4LCAweDgyNzczRTc2LCAweDkzNTRCMzA5LAorMHhFMTdEMDc3MCwgMHgwNEU0REU1QiwgMHg3MTJFQTM5NiwgMHg0OUQzN0I1NSwKKzB4QUU0MTA5QkEsIDB4MDM4NjJEQzksIDB4N0JDRjYxRDIsIDB4NDNDQTIwMTcsCisweDIzQkRENTBGLCAweDc0NTc3NDU5LCAweDRFOEY0RTIzLCAweEJGOTI0QzFBLAorMHhFNEVDNzBDRSwgMHgzN0ZCRUM2NiwgMHhBNkRBODkzNSwgMHhFMTFGNDA5MCwKKzB4NUM4RjlFRTMsIDB4MTlEMTY3RUMsIDB4OUVFNEYyQzUsIDB4NjRBODFFNkMsCisweEIzNTY0MkJCLCAweDgyMDgzQTAxLCAweDAwMUNBMUY2LCAweEFBNjlDN0U4LAorMHg2ODVGMjREOSwgMHhFNjg2OEUzMSwgMHgzOEFERDhGMCwgMHhBMkZERDQ0RSwKKzB4RUUwQzQ5MUQsIDB4QzYwQjFFOUEsIDB4RjdBODkyNjgsIDB4RkQ3ODRGMzUsCisweEM2QjczMzVDLCAweDc1RUZDRUMxLCAweEUyRDlGN0NGLCAweEUxQzM2NEY4LAorMHg3Q0M2M0IyQywgMHhDMTc5RTJBRCwgMHg1NkMxOTNBNSwgMHg1MTM0RkI2OSwKKzB4MzUwNThCQjUsIDB4MzZGNEJDRDUsIDB4REY0QTA4QzIsIDB4MTRBQTIzMzAsCisweDc2MEM4Q0Q4LCAweDJDNTYyMzk0LCAweDBCRUI2NjlCLCAweDIzMDE5NzNBLAorMHhBRjVDNEZGMiwgMHgxQzc3MEFBQiwgMHgyNUREMjA4NywgMHg3MzJBQURDNCwKKzB4NTkwNTQ5NTgsIDB4NTlERENCRTQsIDB4NzRDRkM4QTgsIDB4N0MwMTUwMTYsCisweDMyQTAyNzZFLCAweDhGMUMyRTkzLCAweDBDRTkxRjcxLCAweDA1NUMzMDdBLAorMHg0MzVEOTY3RSwgMHhGNEMzMzcwNCwgMHg1QkRGMkFENywgMHg4ODU1MDk5QywKKzB4MzA3QjI3MzYsIDB4QkI2QjE5Q0IsIDB4NjI2MzQ5RDMsIDB4OEY1MkFCRkEsCisweDI1MUExRUQ2LCAweEUwNTg3QkMwLCAweDEyODMxNDA4LCAweERBODNDQUJGLAorMHhBQjJDN0RGRCwgMHg2QkNGMDI3MSwgMHg3MjA1OERGMCwgMHgxN0FGQzFERCwKKzB4RkZDNTJDMzAsIDB4NTUxNDAxRTAsIDB4OUVFRDU0REYsIDB4MTRFOTUxRTQsCisweDE0NjI0QjNGLCAweDRDMjQ2NTBCLCAweDVBNjVGODZCLCAweEU5NEY2MTQzLAorMHhEQzdDRTlDRiwgMHg5NEQ1RDhGMywgMHgwOTNCMEEwNCwgMHgyMjA5OEQwMSwKKzB4RURGMDlFN0MsIDB4MTY1RURCMEYsIDB4RDA5Q0E3NzQsIDB4Qjk2QUExNDEsCisweEI1NzQ1OTc4LCAweDlEODIwNDM0LCAweDQyQjBFMDI2LCAweDk2OTM4QTI1LAorMHg3MkU4NjM0QiwgMHhCRTM2RUMwMiwgMHg0MkYzRjc0QiwgMHgzNThGQTYyMSwKKzB4QkQ0NTE0ODQsIDB4QjQzQTc1RDEsIDB4QjBBNTdGOTEsIDB4NzAxQTdDODIsCisweDQ4NEIzRjQ2LCAweDA0N0Y3OEFELCAweDY1RjczNzFDLCAweEVBQzhBOTU0LAorMHhFNTlGNjM1NCwgMHgzRUVFRkI0RSwgMHhGMTMxOTU0QiwgMHgxQzAwQkFDMiwKKzB4RTM4OTc2MzcsIDB4NUZFQzgzQUIsIDB4NThDRkEyQzQsIDB4MUY0QzBBNkEsCisweDk3OTU2QkM2LCAweDYzRDExRDdELCAweEI0NjE3OUQwLCAweDExMDM5QTc1LAorMHgxQjUwRTA4OCwgMHg2OEU5NDc2QiwgMHhBQTY4REI1NSwgMHg4QTRBMDUxRSwKKzB4RUZBMERERjUsIDB4MDVBMkE2NzQsIDB4RkZFMDNFNzIsIDB4QzVBMDI5NUMsCisweDZGRDREODM0LCAweDhFNDJCQjk0LCAweEYzREZEODhFLCAweEJBNjkxQUQyLAorMHgzNDU4NDczRSwgMHg2MjY5QTM0OCwgMHg3Mjk2MkZCNiwgMHg4NkQ1MDY0QiwKKzB4OEExNTM3NDAsIDB4NTRBQzk3RDgsIDB4RUQyQ0UwNTcsIDB4NjgyMDA0NzQsCisweEJCQThFMTlELCAweEJGREQwOEYzLCAweEIwREY3NkQxLCAweDYyRjI5NjQ5LAorMHg1QUI3NzAzMCwgMHgxRUU5QTAwRSwgMHg3REFCMUM5MCwgMHhBQjYwOEZGRCwKKzB4ODUwNkE4NTMsIDB4NzVCOTMzOUIsIDB4MUFFMENDQkEsIDB4RkI2MEJCNzksCisweDg2NTBGOTJGLCAweDQ4MTlFMUY3LCAweDBBNzA0NUE4LCAweEI1QkNFNUYxLAorMHg3N0E5OEIyNywgMHgwM0RFMjFFNCwgMHgzRkUzRjEzMiwgMHgxMDY4MjdFQywKKzB4RDREQzE0NjksIDB4QUFDODJGOUIsIDB4MUQ1OTUzQTEsIDB4ODAzNEIzNjksCisweEQ0NDEyQjZGLCAweDkwRkI5RjI1LCAweDE0Mjc5MDcwLCAweDZEOThBRjFDLAorMHgzRDI4NkYzNywgMHg4MzI0QTczMiwgMHg1ODEyM0U0RSwgMHhFQjA1MTAzMiwKKzB4QzE1Q0Q1NTcsIDB4RUI4MkRFOTksIDB4NjIxMzQzNEUsIDB4MzlGMEZDOUMsCisweDVFQkZFMUM1LCAweDhDRUJGNDcwLCAweEZGN0Q4RDhBLCAweDc0MEE2QTNFLAorMHg3MjBEMDgwQywgMHhCNzNCNzRGQSwgMHg1MTczRjk2RSwgMHg5RkMwMTc5NCwKKzB4REFCRjFDODEsIDB4Q0E4MTMyOTUsIDB4QkVBMkRCOEQsIDB4NEM3RTBDRTQsCisweDgwNTFCQTY3LCAweEU2MzM5OUUyLCAweDgzQTE1RUU0LCAweDQ3RjRBNzE4LAorMHhEODI0NkU2QSwgMHgwQjRGODdCRSwgMHgwMzE2NDhCOCwgMHg5OUUzRTNFNiwKKzB4NEFCQ0M2NEYsIDB4NTI3NjgxODEsIDB4RTcwODM3MkIsIDB4MkQwQjFEMkMsCisweDRERjUyNDAyLCAweDM4OUJFOUY2LCAweERFMkYzMjMyLCAweDVENDNENzRFLAorMHhEMzdCQjg5OCwgMHhFNzI3MjY0NSwgMHg5QjU0MzJEQSwgMHg5RDdBOTQ3MywKKzB4QTY5NjI4QTUsIDB4NTgzNTU1QTcsIDB4MjU1QjA4QkQsIDB4QUQ2OEVBRTMsCisweDFBNzk5ODJELCAweEFDRTA5NzI2LCAweDE1RTU3NkFELCAweDI2MEVCNDA2LAorMHhBNzQ0MEI0NiwgMHg2NkI2RDMxNywgMHhCRTZFQ0EzQiwgMHgzQURFQTFDMSwKKzB4RDgwMzk5QzMsIDB4MEVGMTk4RDAsIDB4RkFFRTIwMTAsIDB4RUYyRThFNTYsCisweDVCNkNDNDAyLCAweDNGRDI3QkUyLCAweDk3MEFBQjVGLCAweDYxOEMxN0M2LAorMHg3RjUwMjJGQiwgMHg1NTJGQzFGQSwgMHg1REQ4Mjk4NCwgMHgwOTc2OTUzOSwKKzB4OTg4MTJEMUYsIDB4QkQ4QjI1MzksIDB4RDc4QUQ5QTYsIDB4MUNFNDFEMDcsCisweDI3MkEwQUI3LCAweDVDQjdFMTAxLCAweDZGNDJENTZBLCAweDAwMUQ5MzBFLAorMHgzQzE3QzMwNSwgMHgzMEFBRTM1NCwgMHgyQTRBQUJFMCwgMHg5MjJCQ0I5NCwKKzB4NzNGMzRDMUMsIDB4RTA3RTE1MDEsIDB4Q0I1NUEzRTEsIDB4MENEQzM2NjksCisweEQ5QzA3REU3LCAweDJEQUI4MkJGLCAweDk2M0VBQ0FBLCAweDlCMDVFMEYxLAorMHhFMkRBMEVGQSwgMHgwNjEzQkZFNSwgMHhERkI2MDVFOSwgMHg1RENDQThGRCwKKzB4NkQ0MzM4NzMsIDB4ODFBOUI0QzUsIDB4RDFEMUNCMTQsIDB4OUI2QTk5MDYsCisweEMxMDQ3NjdDLCAweDMwMTAxRDM3LCAweDE4NkZCQjc5LCAweDhGOTVENDg4LAorMHhBMzA5NEY0MywgMHg3RjE3Qzk4MSwgMHhGRDkyQjNGRSwgMHhBREFCM0FCNSwKKzB4MjBEMTQwNkMsIDB4OTQ2MkM4RTcsIDB4NUQ2NDgxOUQsIDB4QjNFODUxOTYsCisweDY3Qjg1NEZFLCAweDdEMDM5RkM2LCAweEFEOThBODVFLCAweEY2NzJFMDQxLAorMHgzMEZBMTlBOSwgMHg0QTI3NkVCOCwgMHhCNzA0MUQyRSwgMHg1N0JCMjFFMiwKKzB4NEUyNTE2NjcsIDB4MTVDNTQwMUUsIDB4REFCNTk0MzEsIDB4RDZDNkZEMUYsCisweDE3MjZFQjcwLCAweDkwMEY0RTg0LCAweEQzMjdERTMzLCAweDdBMEFFMDRCLAorMHg3NkIxMTc0RSwgMHhGRDU0N0I5NCwgMHgzNzA4MzJEQywgMHhEREU2NUNERCwKKzB4NzQ2NzJDMDIsIDB4MTY0NzAzRkUsIDB4MzRDQUQzMUYsIDB4M0U2OTJERUQsCisweDRCQzM4RkE1LCAweDE0M0Y5OUU1LCAweDYxQkI2NDBFLCAweEI5NTdCQzhELAorMHhDOUREOUUzNSwgMHgyQjVDQjMxMCwgMHhBREQ2RUFEMCwgMHg5MTk4MUQ0NiwKKzB4RUQ4MDNENTcsIDB4NjFENzczN0MsIDB4OTJEM0FDM0UsIDB4MzZBMDM0Q0IsCisweEUxMzk1REM1LCAweDVGMjA3MEY4LCAweEM1RUU5RjhBLCAweDcwNTQ2Qjg4LAorMHhDOUVBMjMwQywgMHg1OERDMzA3MywgMHg1N0NCQkVCNywgMHhBMEI3OENGRSwKKzB4MEIzRkU3NUIsIDB4MDdBREFDQ0QsIDB4QzI5MkMzMzgsIDB4RDcwQ0Q3RTUsCisweDcyOUQ4RjRFLCAweDIxOEZBMDQxLCAweDEwRUMxMTk5LCAweEFDMUVDNTFELAorMHg1REVDQzhEMSwgMHhCQTM2MjMwQSwgMHhCQzQxRjVBNSwgMHg3NTg2NDg5NiwKKzB4QjQ0MDNENEEsIDB4RkVFRThGNDQsIDB4OEQ5NEEyNTYsIDB4NjJCQTAxMTUsCisweDNBNTcwQzYxLCAweDkyMjFDNTgzLCAweEQyOTgxQTZCLCAweEZEOEFBRjVBLAorMHgyQTEwMkQ1OSwgMHg2NDA4M0JERCwgMHhCRDFBQURFNiwgMHg3RTZEMUU5OSwKKzB4MjA1NjhBNkQsIDB4OERGQTcwNEIsIDB4ODdEMjcxMjIsIDB4MkVGREFCN0QsCisweEYzQUY5RDM5LCAweEQ4REVEMEIyLCAweDJENEIzNEI5LCAweDEyRjNFMzJDLAorMHhBNkJDQkU2NSwgMHg2ODAwMjlBMSwgMHgwOTRCMDdCMywgMHhEQTU5MThFRCwKKzB4RjdEMEE4NkQsIDB4MUE3RTE4QzgsIDB4OTI4NUE5N0YsIDB4MjA0MDI4MkMsCisweDVCMTMzNTMxLCAweEE0ODIzN0FDLCAweDM1NTdCQzFCLCAweDdFNkVENzdCLAorMHg0MzYyMzRDNywgMHg5QjIwOTRERSwgMHg1RDk2NzU5MywgMHg4ODY3RDFDNCwKKzB4ODhFQzM5NDgsIDB4RTdGODRBRDQsIDB4MTg3MUIzRTYsIDB4RThFOTkyQzYsCisweEExNkRDMkY4LCAweDBERkRGNTkwLCAweDlCNTYyMzhELCAweDMyOTAxN0Y1LAorMHhCRjlCRDQwOSwgMHg2OEJEOUIxQywgMHg0MDM2QzRGRiwgMHgzQkY2RDkzQywKKzB4QUUxMDA2MDIsIDB4OTBCNDM1MDgsIDB4QTg1QjQwMTMsIDB4MkM2NkVBNTQsCisweDIyN0QzMkQ3LCAweDBCQTUyNkQxLCAweDA3NTIxM0I4LCAweDFBM0RFRDA3LAorMHhENDU4REZGRCwgMHhEQzhBQ0Q0MywgMHhBQzc4MDlBQiwgMHgyRDI1NDA4QSwKKzB4RDhGMEM4ODcsIDB4QUQ4Q0QzMEQsIDB4NDA1NEY2MUUsIDB4QTlGMENDQTMsCisweEJGRUJEMzFELCAweDZEMkJBQjFFLCAweEY4RTQyRDhCLCAweDZDOTRBNEU0LAorMHgxMTU4RDJBMywgMHg5M0Y0NEVGRSwgMHg4QUQwNUEyNSwgMHg4QzIyOUQzMiwKKzB4QjIxM0Q3NkUsIDB4REZFNjM4MjIsIDB4NTYxOTg2RUMsIDB4ODA2Q0EwODIsCisweDZEQjNCRjhELCAweDFFODUwRDMwLCAweDhGN0E0NEMwLCAweDc1QkIzMzI4LAorMHg4NkM3QkUxMiwgMHhERTVDNDRCRCwgMHhERjREMDQ4RSwgMHg5Njg3MTJDMywKKzB4QjFCNDFDRjgsIDB4Q0MxOTRGRTksIDB4REEyRTFBOEQsIDB4NzJBMDg2NjIsCisweDVBQkEyNTM2LCAweDIyM0UyMDEzLCAweEE1QTkyM0E1LCAweDc1NjVCNURELAorMHhCQ0EwQTJCMCwgMHgwQzI5ODY0QiwgMHhBQUQ4Q0I4NywgMHhFNEM3RTU1OSwKKzB4NzdFMTlFNTEsIDB4MTk0RTU0RUQsIDB4NTRERDFCNTQsIDB4MEZBRDM3QTcsCisweDBFRjZCMEUzLCAweDBFM0EyRkM4LCAweEEwMDYzOTk1LCAweEUxN0FFMjBFLAorMHhEQzExQjdGOCwgMHg4NUYxQTc2RCwgMHhEOTc4NThENCwgMHhCNzYzRTQ5QywKKzB4QjVCRTdFQzQsIDB4M0NFOTI0QzQsIDB4NDI0NjAxOUQsIDB4RDMzREJCMjcsCisweDczNzg2M0E3LCAweDMyQzI2QkRELCAweDcxNDg5N0EzLCAweDM2MDkxMDE4LAorMHhGMjZCQzk5MCwgMHhEREI2NDBCMCwgMHg0NDhGNUIxMiwgMHhEN0E1RUI0QiwKKzB4NTYxNEVFQTQsIDB4Q0E0OTEyRkIsIDB4MDExRjlENkMsIDB4QTRGQzkwQUIsCisweDlGQjQ5ODJELCAweDIwQUQxNDZGLCAweDRCN0FCNzRFLCAweDEwN0E5NDExLAorMHg3MURCQTkwQSwgMHhENTEwRTNEMiwgMHgyNDhEMEQzNSwgMHhCNjY2MjI5RSwKKzB4NjFFRTFFRUEsIDB4NzAyMDMxQjUsIDB4MzY5OTJBN0IsIDB4QzkwQzA4Q0IsCisweDY0Nzg5OTVBLCAweEU2QzJCQTdBLCAweDhBOTE3OUFDLCAweEM4RUUyOTU2LAorMHgyN0IwNDJDOCwgMHg0OERCODFEOSwgMHhBQTM5RjJDQiwgMHg1RTRENUYzQywKKzB4MjRGRkQ2QjksIDB4NUI1NjJDMkYsIDB4MDBGRDMzQjYsIDB4NDM1RjVGNTIsCisweEYzOTJGRkMxLCAweDBFOTI3QzQwLCAweDU1MDhDQkFCLCAweDk3NkFBNTY3LAorMHhBMTNFN0M1MiwgMHg1MzIxMDlFOSwgMHgxNkI5MDIxRiwgMHg2MEM2MTVBMSwKKzB4MUQyM0MyNTgsIDB4RkQ3ODMxNDcsIDB4NjM2MDBGQjEsIDB4QUFBMjQ1RjAsCisweDlCM0RDMUUxLCAweDdCMjcwRDBELCAweDVCMTYzMkNFLCAweDhCODcxRjdGLAorMHhDNTM1RUZGOCwgMHg3MzEwOUM2QSwgMHhFQjgzRDAyRCwgMHhGN0FFNzZGQiwKKzB4MkUzOUU1MDIsIDB4QTQxMjgyMTYsIDB4RjkwRDU3RTUsIDB4RkYwQzQ2NUUsCisweDAyMDA4MDI5LCAweEU1Q0JCQTFGLCAweDQyODBGQTNDLCAweENEQkQ3NUM4LAorMHhDQjRBRjM0MiwgMHgxNzY5NUE0RSwgMHhBQTYxNjJCNSwgMHg4NjYwQTY3OSwKKzB4RDFBODcwMUMsIDB4NDc2OTRDQTcsIDB4REE4RDQzRkQsIDB4NDRBNEJDMUIsCisweEFCMzRCOUFBLCAweEU1NTU2M0RELCAweDA4RDQxNDJCLCAweDgxMTk3QUM4LAorMHg5OTdCMURDMiwgMHgyRTdDQzUwQSwgMHg3QTMyNkEyMSwgMHhBNzY0MTlEQiwKKzB4RUE4QjU0MjgsIDB4NjU3MjkxNDAsIDB4MDUxREFGNjYsIDB4ODg3MUJDQTksCisweEExNzVFNUJGLCAweDYwMzEwQzk4LCAweEI3REU4OTI5LCAweDM1RTI0NTlFLAorMHgwOEVCNDU0NywgMHg5MDREN0IyQiwgMHgyOTM4MkNDNCwgMHhDRUM4NjY0RSwKKzB4MUU4QzlDMkMsIDB4M0I5NDIxMzQsIDB4OUNFQzVENTUsIDB4REE1NDgzNzYsCisweDJFNEVGRDYxLCAweDI2RjY1RjA5LCAweDVBM0REN0NBLCAweDJGRDRFNThELAorMHg2QjcxQjhDMiwgMHgxMzE4OTExNSwgMHgyQjU1NDJCQSwgMHgxQ0U4NUMyQywKKzB4NUI5RkUwOUQsIDB4Njg3MDRCRkUsIDB4QjE1MzEzQjksIDB4M0VGMjcyOUUsCisweDU4M0VDQzMxLCAweEEzREVEOENBLCAweEZDRDI3QzNELCAweDkwNERBQjM5LAorMHhGRTEwNjlBNCwgMHhFOTlBNTdCQSwgMHgxMTJFQjgwQywgMHhFMTQ4M0M3NCwKKzB4OEEyN0IwRDcsIDB4QTU4RjczMjUsIDB4N0NEMDUwQTEsIDB4NjI2RDRGM0UsCisweDUxNjQzNjU3LCAweEE5NjdGQzU5LCAweDVCQUNCQzBCLCAweDJDRjNFNDU5LAorMHg3RDg5ODhEOSwgMHg1MzkxM0RGOCwgMHgyMzgxQTZGQywgMHg2NEQ2RDQ0MSwKKzB4NDhBRTkxMDEsIDB4MTg1RDk1MzksIDB4MUIwNDRBRUMsIDB4QjVBQkNFREQsCisweEZBOEVDQTUyLCAweDhDQ0REMTQyLCAweDk2RkQ0NDQyLCAweEQ4NjVGRURGLAorMHhDRTRFRTJGQSwgMHhBNTE2MEFFOSwgMHhDOTFCMkIzQSwgMHhGOTkzRjQ1RiwKKzB4MTUwOTEzMkMsIDB4OTIwRUNDNUYsIDB4RDgxM0REQzEsIDB4ODM0QjY4RTQsCisweEQ1RTg3NkEwLCAweDYxREUwRTQxLCAweDRDMTQzOTEzLCAweEM3MjkzOTg1LAorMHgxN0UyMjZFNywgMHgzODgzMDkyNywgMHhEQzYwNERGMiwgMHg3OTlEMTQzMCwKKzB4ODQ2NTg1QUIsIDB4RTVEMjFFMzgsIDB4NjM4MUQxMzYsIDB4MUI2MDYzM0IsCisweDIzQjdBRTE0LCAweDU1NEU1M0NDLCAweDU4MDdBMjEwLCAweDMwNTYwODY2LAorMHgxMkY3OUU2MiwgMHhFMjdCNUQ0NSwgMHgzODg5QzFFNSwgMHg0N0Y4NDVGRiwKKzB4RkZEOURFOTgsIDB4QjEwRTA5RDIsIDB4NEExODRBNzIsIDB4MDgzRDI5NzEsCisweDhBQjc0NzhELCAweDkyMzgwMzc3LCAweDU3QTcyNEVDLCAweEJCQkQ1Q0E2LAorMHhFMkZCOUQzMiwgMHhBQjZBREZDNiwgMHgzOTE2REVENCwgMHg0RTE5NDM4RiwKKzB4RTIxRTE1Q0YsIDB4NkFGNEJDQzksIDB4OEQwODkyNEEsIDB4MTY2MkJBQTksCisweDMwNjRBRDI3LCAweEI4NkQ3RUU0LCAweDg4NjI0QzYyLCAweDFBMEJGM0U3LAorMHhGM0U0QTI4NywgMHg2Nzg3RjAwNiwgMHgwMTM3NUQ0QiwgMHg5OThCQjM4RiwKKzB4NkQ2NjlBMjksIDB4RDc2MEIwOTMsIDB4QzQ3Njg4NTMsIDB4RjA0MTEwMEYsCisweDM1REUxMERELCAweEUwNkM4QkI4LCAweDJDNzlBOTAyLCAweDYwNjAwREFELAorMHg2RTExQ0Y1QywgMHgxODc3ODc3NywgMHg3Q0NFNDA2QywgMHhFNTRBRjJFQSwKKzB4NzQ3MkM0NzUsIDB4NzNEQkVFN0UsIDB4RTUzM0RDNDAsIDB4QjA3NDA3REQsCisweEY2QUNBOEQzLCAweEU3MUJEN0QxLCAweDRCRDM1MTRELCAweEM1QzM2MkNBLAorMHgwNjkwRTVBMSwgMHgwRkZEQzhEOCwgMHg1ODE4ODY0NSwgMHg4NjM2NDEzQywKKzB4MzQxMkEwMzMsIDB4QUY0RkMzNDAsIDB4QTVERkVBQjgsIDB4Qjg3MjcyRTMsCisweEE0QTkyMTlGLCAweDI5Njk2RTkwLCAweDM1RDJGNjI3LCAweDg3OTREQkQ3LAorMHg1RDJEODdGOCwgMHhGQTczNTU5RCwgMHg3RDIyRjQ0MCwgMHhGNTAxOTdFOSwKKzB4RUI3NEI4MjksIDB4OEY5NjQ5Q0YsIDB4MTZGNDdEMzAsIDB4NUM3RDk4NzAsCisweDM2RkY2QzBCLCAweDMxM0E5MkVELCAweDMwM0IzNjU0LCAweEUzRTMzQ0NBLAorMHgwMkMyNkVDQywgMHgyNjk0OTkyMCwgMHg0NDQ1REYyMCwgMHgwMUZEQkM5OCwKKzB4NDkxMzhDNkYsIDB4MUI1NTU1RTIsIDB4MTIyQjQ1RDIsIDB4NEIyRTAyMDIsCisweDdCNjAxNEQ0LCAweEZBRTBDRDA5LCAweDc3RTE2NUEwLCAweEZCRTc2OTgwLAorMHhGNTgwOEJEMywgMHhGRDExMEU1RSwgMHg5NzQ1MEUxMSwgMHgyOTdGOUIxRiwKKzB4NjA3QTJDNDEsIDB4RTM4NERGQzksIDB4MjVEOUE4REMsIDB4RjkxOUQ5NTUsCisweDVFMDI1OTkzLCAweENDMzE4ODQ3LCAweDk3MTdEMkQ1LCAweDQ4RjBERDFGLAorMHg2Q0M0QThFQiwgMHg5QkQwRjRFMSwgMHg1MDZGMkE5MywgMHgxOEI4NzQ4RSwKKzB4MTZGRkJBNDgsIDB4NTUyRTQ5NTUsIDB4Qjk2M0Y2NEYsIDB4QTFBMzRBQzgsCisweDYyRTk1Q0M3LCAweDREODdFQTg5LCAweDIxRThDMDMxLCAweEMxRjBFRDA3LAorMHgyOEI3QkIyMiwgMHgwQjgzOEQwNCwgMHg2MzYxQjQ0MCwgMHhBNjUzNTIxQywKKzB4OTJEQTNGNzgsIDB4NDI0MUNGRUQsIDB4RkFGQ0JENDEsIDB4M0VGQUI2QkMsCisweDI1RjMwNjA3LCAweDQxQkI3MERBLCAweDlGRjM0NDBBLCAweDI1MDIwMzlFLAorMHgzODEzRUM4MiwgMHhDNkE0RkQ2QiwgMHhGODUzN0M4QywgMHgwOThFRDQ5RiwKKzB4RTBBMEJENkUsIDB4NkJBMkYyQjMsIDB4QzM1QzlEOUQsIDB4MTI1NkU2NkEsCisweDc5MEIyNDkwLCAweEQ1QzY5ODg5LCAweDM5RTcxMkZFLCAweENGNzNERTBCLAorMHg0MUIzQjYxNCwgMHg3NDVBQkQ3MywgMHg2NTRDNzlEOCwgMHg1QjE1OTIzRCwKKzB4OEMxNUYyMTgsIDB4NTg1Q0NDRjAsIDB4NjI0RjdCNDQsIDB4NzZCRERGREIsCisweDk2RjI2QjUyLCAweEUxMzA1OEExLCAweDA4NkM5NTBFLCAweDI5NTE5REVBLAorMHhBNDJDRkUwNCwgMHgwRDdBMTkwQiwgMHhEMDY3OEM2QSwgMHhBQkI3ODY3OSwKKzB4QkE0OEEyRTQsIDB4NUYzREExMEEsIDB4MTFGMDQxODMsIDB4QUM3MjBBM0YsCisweDZBODA3NzgxLCAweDZGMTQ2QkZCLCAweEU4QTY3OTM0LCAweDU0NTc4ODM0LAorMHhBQTYwQzhGMCwgMHgyMDYxQTFFNiwgMHg5RTg3Nzk5QiwgMHg2OEQ5MUY4NiwKKzB4ODk3NEY1NDAsIDB4QjFDM0YxMDEsIDB4OTlDMjFFNTYsIDB4QjU3QkE3M0YsCisweDhCMkRBQTNFLCAweEYxRTJEMjRFLCAweDQ4RjdENEVFLCAweDcwMzlGREIzLAorMHhDNjY2RUVEQywgMHgyNTFGOTcyRSwgMHg0RDUzRjZCRiwgMHg2Q0M3M0VFNywKKzB4Q0IwN0Y3QjksIDB4NjlFQ0I4Q0EsIDB4MzYzRkQ4MEMsIDB4M0I1ODdBQjMsCisweDczOEMxRTVDLCAweDVDOUMxRDkyLCAweEU3QjUyMzk2LCAweEVERTYzMjRCLAorMHhGRTVCNTA0NSwgMHhDOTBEOEIzRSwgMHgzNzFBMDEyOCwgMHhGMkM4RENGOCwKKzB4NUI2NDhDQjUsIDB4MTJGOEU4RkYsIDB4NUZFNEJBNzEsIDB4QjkyNUNGQkUsCisweDc0MTZFMTRGLCAweDc2NDg5RkZFLCAweDFGNERFMzY3LCAweEE0MDBGMDM5LAorMHg2NjM5MEU4MywgMHgxQUU3OUNFQywgMHhEQjU3M0U5OCwgMHhCNjAyMUYyOSwKKzB4RDAxNjE1RTUsIDB4MDJBMjI4MUYsIDB4RTg1MDE5QzEsIDB4MDI3QkI0MUYsCisweDhEOTE3N0MzLCAweDc5MDI2RTc4LCAweEYxNThCNjIzLCAweEJFRkY1ODU4LAorMHg3QjYzNTE4RSwgMHg4RjQyQzA4QywgMHhCMzg4MjI3RCwgMHg5NDBENjA3QSwKKzB4QTRDNzk1NDEsIDB4OTgwMENDOTEsIDB4QTM1NkI1MzUsIDB4Mjg1QkFCQjksCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHhFNDExRTUyMCwgMHhBMDAyNDUyOCwgMHg0NDJCNDQyOCwgMHg5NjA3MDAwOSwKKzB4NDYxMDYyNDYsIDB4OEZGQjI1MjIsIDB4RDQwMjc1MDQsIDB4MDAwOUFGRjUsCisweDAwMDAwRkIzLCAweDAwMjAwMDA0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgxNkQ0OTM1NywKKzB4MDAwOTAwMEIsIDB4NEYyMjJGRTYsIDB4REU5NDdGRkMsIDB4RTExNEQ1OTQsCisweDFFMTNENDk0LCAweDY3NTIxRTRDLCAweEQ0OTRENjkzLCAweDM3NDAyNzY5LAorMHg2MjUyOEYwNiwgMHg3MjAxRDY5MiwgMHg2MDYwMjUyMiwgMHgyNjAwQzkzRiwKKzB4RDc5MDYxNTIsIDB4MjUxMjYxMUQsIDB4MjY0QjY2NTIsIDB4MjU2MjQ3MEIsCisweDAwMDlCMDBELCAweEU2MDA5NUFDLCAweEM4NDA2MEUyLCAweDJGMDI4RjAzLAorMHg4RkY5MzY1MiwgMHg3RjA0NzYwMSwgMHhBMDVBNEYyNiwgMHg0RjIyNkVGNiwKKzB4NDEwQkQxODUsIDB4RDQ4NTAwMDksIDB4MDAwOTQ0MEIsIDB4NDUwQkQ1ODQsCisweEQ3ODQwMDA5LCAweEQyODRFMUZGLCAweDI3MTI2MTFELCAweEQ0ODM1MDI5LAorMHhFMUZGQ0IwMSwgMHgxMjA5RTUwMSwgMHgxMjExMjIxMiwgMHhFNzIwMjQ1MiwKKzB4NDcxOEQ1N0YsIDB4MjU3MkQyN0YsIDB4RDE3RkU3MDAsIDB4RDY4MEQ0N0YsCisweEUyMDEyMjcwLCAweDI0NzAyMTcyLCAweEQ2N0UyNjIwLCAweDI2NDFFNEZGLAorMHhENTdERTYwMCwgMHg2NjZERTEwNCwgMHg3NjAxNjA2MywgMHg0MDAwNjI2RCwKKzB4OEZGODMyMTIsIDB4RDU3OTA1NDUsIDB4MjUyMEUyMDEsIDB4RDI3OUQ3NzgsCisweDI3MTBFMTAwLCAweEU1ODAyMjEyLCAweDY1NUM2NjEzLCAweDY2NkRENDc2LAorMHg3NjA0Njc2MywgMHgzNzRDNjI2RCwgMHg4RkY4MzI1MywgMHhENDczMjcxMiwKKzB4RDU3M0UxMDEsIDB4RDY3MzI0MTAsIDB4MjU0MkU0MDAsIDB4RTAzQUU1MDEsCisweEQyNzJENzcxLCAweEUwMzkwNjU0LCAweDI3MTEwNjU0LCAweDAwMEI0RjI2LAorMHg3RkM4MjIxMSwgMHhENzZGRDE2RSwgMHhEQzcwREI2RiwgMHhEMjcxREU3MCwKKzB4RDU3MkQ0NzEsIDB4MUYxMkQ2NzIsIDB4MUY3NjcxMEMsIDB4MUZCODc3RkMsCisweDFGRUExRkM5LCAweDcyMDQxRjJCLCAweERFNkZEQzZFLCAweDFGMTNFQjEwLAorMHgxRjUxMUY0NCwgMHgxRjc3MUY2NSwgMHhEODZDMUYyQywgMHhERDZERDk2QywKKzB4RDI2REVBMDAsIDB4ODkwMDNBMjIsIDB4RDE1ODdBMDEsIDB4ODgwMTYwMTAsCisweDU2Rjk4QjAzLCAweDQyMThFMjAxLCAweEQxNjgyNjIyLCAweDAwMDk0MTBCLAorMHg0NDBCRDQ2NywgMHhENTY3MDAwOSwgMHgwMDA5NDUwQiwgMHg2MDEwRDE0QywKKzB4OEIxMDg4MDEsIDB4RTY1MEQxNEIsIDB4NDYxODYyMTIsIDB4OEIwODMyNjYsCisweDU2RkFEMTQ3LCAweDIxMjBFMjAwLCAweENCMDE2MDYyLCAweDI2MDJBMDAzLAorMHg3MjAxMjcxMCwgMHg2MDgyMjEyMiwgMHg4OTA5ODgwMSwgMHhFMkM4RDE1QSwKKzB4NjIyQzY2MTIsIDB4ODkwMzM2MjYsIDB4NjAxMEQxNTgsIDB4OEJDODg4MDEsCisweDUxRjc2NzkyLCAweDIxNzI1MkY2LCAweEQ2NTU1MTkxLCAweDU1RkIyMjEyLAorMHg1MkZDNjQ2MiwgMHg1NTYxMjU0MiwgMHgyMjUyRTQwMCwgMHg2MTQzNjY0MywKKzB4MDVERTYwMTMsIDB4MzZDQzQ2MDgsIDB4MDJERTI2NTIsIDB4QzkwMzYwMjEsCisweDhCMDI4ODAxLCAweDcyMDE2MkUyLCAweDc0MDEyRTIyLCAweDM2QjM2NjRDLAorMHg3MTA0OEZFRSwgMHg2NkMyRDE0NywgMHg0NTI4NjUxMiwgMHgyNjVCNDUxOCwKKzB4NjA4MjJDNjIsIDB4ODkwMTg4MDEsIDB4MDAwOUExNjgsIDB4NjI3MkQ3NDIsCisweDhCMTMyMjI4LCAweEQ3MjZENTQxLCAweDY1NTJENDQxLCAweDUxNDM2NjcyLAorMHgzMTZDMzY1QywgMHgyNzYyMjY2OCwgMHgxNDEzOEQwNSwgMHg2MjYyRDYzRCwKKzB4QjFBNTcyMDEsIDB4RDYxRTI2MjIsIDB4MjYyMkUyMDAsIDB4NTI5MTY2OTIsCisweDhCMDEzNjIwLCAweDAwMDlBMTQ0LCAweDYwNjFBMDZFLCAweDAwMUMwMDFDLAorMHgwMDFENDAyMCwgMHgwMDAwQjM4RSwgMHhGRkZGMDAwMCwgMHgxMjM0MDAwMCwKKzB4MDAxRTEwMTUsIDB4MDAyMDEyNzgsIDB4MDAyMDE4QTAsIDB4MDAyMDE5MjIsCisweDAwMjAxMjhDLCAweDAwMUMzNTEwLCAweDAwMUMzNjI0LCAweDAwMUUyMTJDLAorMHgwMDIwMzk3QywgMHgwMDIwMzUxNCwgMHgwMDIwMzk4NCwgMHgwMDIwMzk5MCwKKzB4MDAyMDM5OUMsIDB4MDAyMDM5RjgsIDB4MDAyMDM5RkMsIDB4MDAyMDM5QTQsCisweDAwMjAzOUE1LCAweDAwMjAzOUE4LCAweDAwMTE3NzAwLCAweDAwMjAzQTEyLAorMHgwMDIwMzU3OCwgMHgwMDExNDJEOCwgMHgwMDIwM0ExNCwgMHgwMDIwM0ExNiwKKzB4MDAxQzNEMzAsIDB4MDAxMTc3MTgsIDB4MDAxQzNEMDAsIDB4MDAxQzEwMDAsCisweDAwMUMzNkY4LCAweDAwMTE3NzM0LCAweDAwMUMzNjg0LCAweDAwMTE3NzEwLAorMHgwMDFDMzUyMCwgMHgwMDExNzYwMCwgMHgwMDExNzc0MCwgMHgwMDFDMTAyOCwKKzB4MDAyMDM1OEMsIDB4MDAyMDM5QUMsIDB4N0ZGRkZGRkYsIDB4MDAyMDE3MzQsCisweDAwMjAzMkJFLCAweDAwMjAyMkU4LCAweDAwMjAzREMwLCAweDAwMjAzOUZBLAorMHgwMDIwMzU4NCwgMHgwMDIwMzlFQywgMHgwMDFDM0QyQywgMHgwMDFDMzZCMCwKKzB4MDAyMDM1MUMsIDB4MDAxMTc3NUMsIDB4ODgwMUM5MEYsIDB4QTBDRjg5MDEsCisweEQxN0MwMDA5LCAweDM2MjA2MjEyLCAweEQ0N0I4OTA0LCAweDI0MjFFMjAwLAorMHgyMTYyQTBDQywgMHg2MjExRDE3OSwgMHg4OTAxMjIyOCwgMHgwMDA5QTBDMywKKzB4RTIwMkQ3NzUsIDB4NzUwMTY1NzEsIDB4MzEyMzYxNUQsIDB4Mjc1MThEMDIsCisweDAwMDlBMEJDLCAweEQyNzI1NUYyLCAweDYyMjI2MDUyLCAweDQwMDk0MDE5LAorMHhDOTBGNDAwOSwgMHg4RjE5ODgwQSwgMHg1MkYzMUYyRCwgMHg0MDE5NjAyMiwKKzB4NDAwOTQwMDksIDB4ODgwOEM5MEYsIDB4QTBBNzg5MDEsIDB4NjA2MzAwMDksCisweDUxRjI1NUY4LCAweEU3MDFDQjAxLCAweDI1MDJEMjYzLCAweEUxMDAyMTcyLAorMHgyMjExRDU2NCwgMHg3NDAxNjQ1MiwgMHgyNTQyQTA5OCwgMHg4QjNGODgwNSwKKzB4NjAyMjUyRjMsIDB4NDAwOTQwMTksIDB4QzkwRjQwMDksIDB4OEIxNjg4MDIsCisweEU1RkZENDVELCAweDY1NUQ2NzQyLCAweDhCMTAyNzU4LCAweDYyNzJENzVCLAorMHg4QjBDMzI2MCwgMHg1NUYyNTdGOCwgMHgyNzYyRTEwMSwgMHhENTUyMjUxMiwKKzB4RDc1N0U0MDAsIDB4NjI3MjI1NDEsIDB4QTA3NzcyMDEsIDB4NTJGMzI3MjIsCisweDQwMTk2MDIyLCAweDQwMDk0MDA5LCAweDg4MDVDOTBGLCAweDMxQjM4QjZFLAorMHhENTUwOEI2QywgMHg2MTUyNTdGNCwgMHg3MTAxRTI0MCwgMHg2NDcyMjUxMiwKKzB4MUY0REQxNEQsIDB4NDIxODI0MTksIDB4OEIwMzM0MjAsIDB4NjI2MkQ2NEIsCisweDI2MjI3MjAxLCAweEUyMDBENjQwLCAweDI2MjFCMEFBLCAweDAwMDlBMDU2LAorMHgzMTIzRTIyMCwgMHg4ODAzOEI1MiwgMHg1MkYzOEIxRSwgMHg0MDE5NjAyMiwKKzB4NDAwOTQwMDksIDB4ODgwM0M5MEYsIDB4RDc0MThCMTYsIDB4NjQ3MjUxRjQsCisweDc0MDFEMjNELCAweDY1MTIyNzQyLCAweDFGNURFNjQwLCAweDQ2MTgyNTI5LAorMHg4QjAzMzU2MCwgMHg2MjYyRDYzQiwgMHgyNjIyNzIwMSwgMHhFMjAwRDYyRSwKKzB4MjYyMUIwODYsIDB4MDAwOUEwMTAsIDB4RDczOEQxMzcsIDB4RDIyQTY0MTIsCisweEU1MDA3NDAxLCAweDIxNDIzQTc2LCAweDIyNTE4RjA2LCAweEVBMDBENjM0LAorMHg3MjAxNjI2MiwgMHgyNjIyQjA3NCwgMHgyRkIyRDUzMiwgMHg5NTQwNjY1MiwKKzB4RDQzMDVCRjEsIDB4MzYyMDUyNDEsIDB4NjA2MTg5MTAsIDB4OEIwMUM4MDMsCisweDJCMjJFMjAxLCAweDhGRjU0NTEwLCAweDU3RjE1NjY0LCAweDYyNzJFMUYwLAorMHg0MTI4NDExOCwgMHgyNzIyMjIxQiwgMHg2QkYyQTAwOCwgMHg2QkYyQTAwNiwKKzB4RTIwMEQ2MTUsIDB4RDExNTI2MjEsIDB4MjEyMUUyMDAsIDB4RTIwMjU2RjUsCisweDQyMTg2NjYyLCAweDI2Mjg0MjI4LCAweDFGNkQ4RDBDLCAweEQ2MUZEMTFFLAorMHg0NjBCNjUxMSwgMHgyMDA4NjQ1RCwgMHg1N0Y1ODkwNCwgMHg2MjcyRDExQywKKzB4MjcyMjIyMTksIDB4RDExQkUyMDEsIDB4NjYxMjI4MjIsIDB4OEIwMTI2NjgsCisweDAwMDlBRTE3LCAweDQ1MEJENTE4LCAweEQxMTgwMDA5LCAweEFFMTBFNjAwLAorMHgwN0QxMjE2MCwgMHgwMDIwM0EwQywgMHgwMDIwM0ExMCwgMHgwMDIwM0ExOCwKKzB4MDAxQzNEQzAsIDB4MDAxMTc3MkMsIDB4MDAxQzNCODgsIDB4MDAyMDM5RjQsCisweDAwMTE3NzNDLCAweDAwMTE3NzQ0LCAweDAwMDBGMDAwLCAweDAwMTE3NzY0LAorMHgwMDExNzc0OCwgMHgwMDExNzc2OCwgMHgwMDExNzc2QywgMHgwMUZGRkZGRiwKKzB4MDAxMTc3NEMsIDB4MDAyMDM1ODQsIDB4MDAxMTQyRDgsIDB4MDAxMTQ3NzQsCisweEZERkZGRkZGLCAweDAwMjAzREMwLCAweDAwMjAyNDZDLCAweDAwMjAzOUZBLAorMHgyRjk2MkY4NiwgMHgyRkI2MkZBNiwgMHgyRkQ2MkZDNiwgMHg0RjIyMkZFNiwKKzB4RDExRjdGRjQsIDB4NjIxMkRFMUYsIDB4NjdFMjU0MTEsIDB4RDQxRTFGNDEsCisweDFGNzIyRjIyLCAweDY3NDNENTFELCAweDc3OTREMjFELCAweDVBNDI1ODQxLAorMHg2QzcyNjk0MiwgMHg2RDIyNUIxNiwgMHhFNjAwNjA1MiwgMHgyNTAyQ0IyMCwKKzB4NzYwMUU1NDAsIDB4MzI1MzYyNkQsIDB4NjJGMjhCRkIsIDB4MjEyMjU1RjEsCisweDU1RjIxMTUxLCAweDJFNTJENjEzLCAweDE0QTIxNDgxLCAweEQ0MTIyNDkyLAorMHgxMUI2MjdDMiwgMHg2NzQyMjZEMiwgMHhEOTExREExMCwgMHgyQTcyRTgwMSwKKzB4MUE4QzQ5MEIsIDB4NDIxOEUyMDEsIDB4N0YwQzFBMkMsIDB4NkVGNjRGMjYsCisweDZDRjY2REY2LCAweDZBRjY2QkY2LCAweDAwMEI2OUY2LCAweDAwMDA2OEY2LAorMHgwMDFDM0I5QywgMHgwMDFDM0Q5OCwgMHgwMDFDMzcwMCwgMHgwMDFDMzUwMCwKKzB4MDAxQzU5NjAsIDB4MDAxQzg5NjAsIDB4MDAyMDM1OEMsIDB4MDAxQzNEMDAsCisweDAwMjAxNjEwLCAweDJGOTYyRjg2LCAweDJGQzYyRkE2LCAweDJGRTYyRkQ2LAorMHg0RjEyNEYyMiwgMHg3Rjg4NEYwMiwgMHhFMDE4REVCMiwgMHhENEIyNjFFMCwKKzB4NjFFMzBGMTQsIDB4NjIxMDcxMDEsIDB4NDQwQkUwMUMsIDB4MjAwODBGMjQsCisweDhGMTI2RDAzLCAweEQ0QUQxRjA4LCAweDY3NDBEREFELCAweDY1N0NENEFELAorMHg0NzBCRDdBRCwgMHhEMkFEMDAwOSwgMHg2MjFDNjEyMCwgMHg0NjA4NjYyMywKKzB4MzYyODQ2MDgsIDB4M0Q2QzQ2MDgsIDB4RTAxQzFGRDgsIDB4RTU4MDA0RkMsCisweDYwNEM2NkUyLCAweDMwNTA2NTVDLCAweDJENjI4RjE3LCAweDAxRkNFMDE4LAorMHhERUEzRTUwMCwgMHg2NDFDQTAwOCwgMHg2NzUzNjU1RCwgMHg2MDcwMzdFQywKKzB4MzFEQzYxNTMsIDB4ODAxNDc1MDEsIDB4MzI0MzYyNUQsIDB4RDQ5RDhCRjQsCisweEUyMDBENTlELCAweEEyN0YyNDIxLCAweDIwMDgyNTIxLCAweEUwMTg4QjEzLAorMHhFNTAwMDFGQywgMHhBMDA5REU5NiwgMHg2NTVENjQxQywgMHgzMkVDNjI1MywKKzB4NjI1MzY3MjIsIDB4MzJEQzY2NzIsIDB4NzUwNDEyNjEsIDB4MzI0MzYyNUQsCisweEEyNjk4QkYzLCAweDg4MDEyRDEwLCAweEUwMTg4QjE2LCAweEU0MDAwMUZDLAorMHg2NzFDMkQ0MCwgMHg2MjREREU4QSwgMHg4QjAxMzI3MywgMHgwMDA5QTI1QywKKzB4NkRFMzY0NEQsIDB4N0QwNDYyNDMsIDB4MzJFQzY2NDMsIDB4NjUyMjM2REMsCisweDc0MDg2MTYyLCAweDI1MTJBRkVGLCAweDhCMTk4ODA0LCAweDAxRkNFMDE4LAorMHgyRDcwRTcwMCwgMHgxRkQ1NkQxQywgMHg2MjdEREU3RCwgMHg4QjAxMzJEMywKKzB4MDAwOUEyNDIsIDB4NjE3MzY3N0QsIDB4MzFFQzY1RTMsIDB4NzUwNDY0MTIsCisweDM2NUM2NjczLCAweDYxNDI2MjYyLCAweDIxMjk3NzA4LCAweDI0MTJBRkVELAorMHg4QjE5ODgwNSwgMHgwMUZDRTAxOCwgMHgyRDcwRTcwMCwgMHgxRkQ0NkQxQywKKzB4NjI3RERFNkYsIDB4OEIwMTMyRDMsIDB4MDAwOUEyMjYsIDB4NjE3MzY3N0QsCisweDMxRUM2NUUzLCAweDc1MDQ2NDEyLCAweDM2NUM2NjczLCAweDYxNDI2MjYyLAorMHgyMTJCNzcwOCwgMHgyNDEyQUZFRCwgMHg4QjU5ODgzMSwgMHg2MUU2REU2NywKKzB4NjFFMzFGMTksIDB4NjRFMjcxMDQsIDB4MUY0QTYyMTYsIDB4MUYyQjY0MTYsCisweDc1RTQ2NTEzLCAweDY2NTM2NzEyLCAweDFGNEM3NjA0LCAweDY0NTIxRjdELAorMHhENzVGNkU2NiwgMHgyN0UwRDI1RiwgMHhERTVGNjA2MiwgMHhDOTAxMzI0NSwKKzB4NjU2MjJFMDAsIDB4NDYwOTA2MEEsIDB4NDYwOUQxNUMsIDB4NDYwOTQ1MDksCisweDIxNTAxRjRFLCAweEIyQjA2NDZELCAweDYyMEQxRjZGLCAweDhCMDEyMjI4LAorMHgwMDA5QTFFQSwgMHhENzU2REU1NSwgMHg2NjFDNjFFMCwgMHg2NDEwRDE1MCwKKzB4NDcwQjY1NEMsIDB4N0ZGQzU0RkYsIDB4MkZFMjVFRkUsIDB4NTFGRTdGRkMsCisweDJGMTJFMDQwLCAweDU1RkJEMTRGLCAweDU3RkQ1NkZDLCAweDA0RkU0MTBCLAorMHhEMjREN0YwOCwgMHhFMTFDNjQwRCwgMHgxRDQxMkQxMCwgMHhENDRCNjUyMiwKKzB4Njc0MjFENTIsIDB4MUQ3M0RFNEEsIDB4RDI0QTY1RTIsIDB4NjcyMjFENTQsCisweDFENzVEMjQ5LCAweEQyNDk2RTIyLCAweDY2MjIxREU2LCAweDFENjdBMUJDLAorMHg4OTAxODgzMCwgMHgwMDA5QTA4RSwgMHhFMzQwRDUzOCwgMHgzM0ZDNjE1NiwKKzB4MjMxMjY0NTYsIDB4NzEwNDYxNTMsIDB4Njc1MjEzNDEsIDB4MTM3MjY0MTYsCisweDdFRTQ2RTEzLCAweDY1RTY2MjEyLCAweDY2RTNENzMxLCAweDEzMjQ2RUUyLAorMHg3NjA0MjdFMCwgMHg2MDYyRDIyRiwgMHgzMjU1REUyRiwgMHgyRTAwQzkwMSwKKzB4MDYwQTZFNjIsIDB4RDEyRDQ2MDksIDB4NEUwOTQ2MDksIDB4MTM0MzQ2MDksCisweDY0NkQyMUUwLCAweEIyNTAxRjVFLCAweDYyMEQxRjZGLCAweDhCMDEyMjI4LAorMHgwMDA5QTE4QSwgMHhERTI1RDUyMiwgMHg2MUUwNjQ1MCwgMHhENzI0NjU0QywKKzB4NDcwQjU0RkYsIDB4N0ZGQzY2MUMsIDB4MDZGRUUwNTQsIDB4N0ZGQzJGNjIsCisweEVFNDAwMUZFLCAweDJGMTIzRUZDLCAweDU1RTJEMTI1LCAweDU3RTQ1NkUzLAorMHg2NEUyNDEwQiwgMHhEMjFDN0YwOCwgMHhFMTFDNjQwRCwgMHgxRDQxMkQxMCwKKzB4RDYxQTY1MjIsIDB4Njc2MjFENTIsIDB4MUQ3M0RFMTksIDB4RDIxOTZFRTIsCisweDYyMjIxREU0LCAweEQyMTgxRDI1LCAweDFEMjY2MjIyLCAweDYyMjJEMjE3LAorMHgxRDI3QTE1QSwgMHgwMDExNzgwMCwgMHgwMDIwMkExOCwgMHgwMDIwMzk5NiwKKzB4MDAyMDM1QkMsIDB4MDAyMDNBN0MsIDB4MDAyMDE4RDAsIDB4MDAyMDM5OTUsCisweDAwMTE3ODA0LCAweDAwMjAzQTE0LCAweDAwMjAzQTE2LCAweDAwMTE3ODEwLAorMHgwMDIwMzk5MSwgMHgxMDYyNEREMywgMHgwMDIwMzk5MiwgMHgwMDIwMzk5MywKKzB4MDAxMTRBQTQsIDB4MDAyMDBGNjgsIDB4MDAxQzU4NjQsIDB4MDAxQzY4NjQsCisweDAwMUM3ODY0LCAweDAwMUM1OUJDLCAweDAwMUM2OUJDLCAweDAwMUM3OUJDLAorMHgwMDIwMEZDMCwgMHg4QjA0ODgzMywgMHg0NzBCRDdBMiwgMHhBMTIzRUUwMCwKKzB4ODgyODJERTAsIDB4QTBEMzg5MDEsIDB4REU5RjAwMDksIDB4NjJFMUUxNDMsCisweDMyMTZFMDU0LCAweDBGRTY4RjAyLCAweDJFMjFFMjQwLCAweDYyMkQ2MkUxLAorMHg4QjAxMzIxNywgMHgwMDA5QTBCQywgMHhFNTAxODVFMSwgMHg4QjAxMzA1NiwKKzB4MDAwOUEwQjYsIDB4MkQxMEUxMDEsIDB4NjRFMUIxMTEsIDB4MDZGRUUwNTQsCisweDYyNjFFMTQzLCAweDM1MTc2NTJELCAweEU2NDA4OTQ1LCAweDhCMEMzNTYzLAorMHhFMDU4RTQxQSwgMHhFNTAwMEY0NSwgMHg3MkMwRTA1QywgMHg2MDIzMEY1NSwKKzB4NjcwM0M5MDcsIDB4QTAxNEUwNjAsIDB4NjY1MzBGNzUsIDB4NDYyMTQ2MjEsCisweDQ2MjE0NjIxLCAweDQ1MjE0NjIxLCAweEUwNTg3NjE4LCAweDBGNjU0NTIxLAorMHhFMDAzNDUyMSwgMHhFMDVDMjUwOSwgMHhFMDA3MEY1NSwgMHhFMDYwMjIwOSwKKzB4RTg1NDBGMjUsIDB4ODU4MjM4RkMsIDB4NjQwRDY1RjMsIDB4MTg0NEIxNzAsCisweEREN0E4NTg0LCAweDg1ODY2QzBELCAweDYxMEQ0QzA4LCAweDQxMDg2MEMzLAorMHhFMDBGMEVGRSwgMHgxODE1NEQwQiwgMHgyRTI5NjIwNywgMHg2NjgyNjBDMywKKzB4ODU2MjBGRTYsIDB4NEQwQjUxODUsIDB4MkUwQjYwMEQsIDB4NTQ4NDYwQzMsCisweEIxM0MwRkU2LCAweEUwNTQ2NUYzLCAweEU1NDAwRUZFLCAweEUwNkM2MkUxLAorMHgzNjUzNjYyRCwgMHgwRjY2OEQ0MSwgMHhDOTAzNjAyMywgMHg0MDAwNDAwOCwKKzB4NjEwMzY0MDMsIDB4RDk2NUUwNzAsIDB4MEY0NkU1RkYsIDB4RTA3NDY1NUMsCisweDYwNTMwRjk2LCAweDYyNjM0OTBCLCAweDQyMjE0MjIxLCAweDQyMjE0MjIxLAorMHg0MjAwNjcyMywgMHg0MjAwMzI3QywgMHg2QzA3NDYyMSwgMHg0NjIxRTA1NCwKKzB4NjA2MzA5RkUsIDB4NDAwOEM5MDMsIDB4NzkwNjMwRkMsIDB4NkEwMzZEMkQsCisweDY1RjNFODAwLCAweDY0RDNCMTI0LCAweEUwNzA2RUEyLCAweDJBRTIyRUM5LAorMHgwMUZFNjY5NCwgMHg2NjZDRTA3NCwgMHg0NzBCMDdGRSwgMHgyRTBCNjA2MywKKzB4NjVGMzJBRTIsIDB4QjBGQTY0RDMsIDB4NjI4RDc4MDEsIDB4MzJFM0VFMDYsCisweDdEMDE4RkU3LCAweDBFRkVFMDU0LCAweEUwNTQ2MkUxLCAweDQyMDAwNkZFLAorMHg3NjBDODU2MSwgMHg3MDFCMzAyQywgMHhFNDAwNjEwMywgMHhFNzA0NjVGMywKKzB4Njg2Njc0MDEsIDB4Mzk3MzY5NEQsIDB4OEZGOTI1ODIsIDB4NjVGMzc1MDQsCisweDY0MURCMERELCAweDBFRkVFMDU0LCAweDY0RTFCMDlDLCAweDAwMDlBMDU0LAorMHhENDNCNTZGOCwgMHhFQTAxRDIzQiwgMHgyNkEwNDIwQiwgMHgwMDA5QTA0QywKKzB4MDZGQ0UwMUMsIDB4ODgyOTYwNkMsIDB4NUNGODhCMDgsIDB4RTIwMEQ2MzYsCisweDUyNjEyQzIwLCAweDY0MkRCMDRCLCAweDAwMDlBMDNFLCAweDY2NkNFNjgxLAorMHg4QjA0MzA2MCwgMHg0MjBCRDIzMSwgMHhBMDM1NTRGOCwgMHhFNjgyMDAwOSwKKzB4MzA2MDY2NkMsIDB4RDIyRThCMDQsIDB4NTRGODQyMEIsIDB4MDAwOUEwMkMsCisweDY2NkNFNjgzLCAweDhCMEEzMDYwLCAweERBMjc1NUY4LCAweDI1OTBFOTAwLAorMHhEODI4NTVBMSwgMHgyODUyRDYyOCwgMHhBMDFENTJBMiwgMHhFNjkyMjYyMCwKKzB4MzA2MDY2NkMsIDB4RDIyMDhCMDgsIDB4NUMyMUQ4MjQsIDB4NkNDQzUyRjgsCisweDI4QzFFNjAwLCAweDIyNjBBMDEwLCAweDY2NkNFNjkzLCAweDhCMDYzMDYwLAorMHhENjFGNTlGOCwgMHhFMjAxRUEwMCwgMHhBMDA1MjlBMCwgMHhENjE2MjYyMSwKKzB4RDIxREQ0MUMsIDB4NjU2MjQyMEIsIDB4NEYwNjdGNzgsIDB4NEYyNjRGMTYsCisweDZERjY2RUY2LCAweDZBRjY2Q0Y2LCAweDAwMEI2OUY2LCAweDRGMjI2OEY2LAorMHhFMjQwNjE0RCwgMHg4OTMyMzEyMywgMHgzMTI3RTIxRiwgMHg4QjI3RDcxMywKKzB4RDQwNjYxNEQsIDB4RTAwMTcxRTAsIDB4NTY3MTQ0MEIsIDB4MjY1OTY1MDcsCisweDE3NjFBMDI1LCAweDAwMjAwRkJDLCAweDAwMTE3ODA0LCAweDAwMjAzNDcwLAorMHgwMDIwM0E5QywgMHgwMDIwMThDMCwgMHgwMDExNzgwMCwgMHgwMDExNUYwMCwKKzB4MDAxMTYwNTgsIDB4MDAyMDM5N0MsIDB4MDAyMDM5OTAsIDB4MDAyMDNBMUEsCisweDAwMjAzQTE2LCAweDAwMjAzQUI0LCAweDAwMjAxOEQwLCAweDAwMUMzNzA0LAorMHhFMDAxRDQ5MCwgMHg2NjcyNDQwQiwgMHgyNjU5NjUwNywgMHg0RjI2Mjc2MiwKKzB4MDAwOTAwMEIsIDB4NjE0RDRGMjIsIDB4MzEyM0UyNDAsIDB4RTIxRjg5MTIsCisweEQ3ODkzMTI3LCAweDYxNEQ4QjA4LCAweDU2NzFEMjg2LCAweDQyMEI3MUUwLAorMHgyNjBCRTAwMSwgMHgxNzYxQTAwNiwgMHg2NjcyRDI4MiwgMHhFMDAxNDIwQiwKKzB4Mjc2MjI2MEIsIDB4MDAwQjRGMjYsIDB4RTY0MDAwMDksIDB4NDYyODQ2MTgsCisweDYyNTJENTdFLCAweDg5RkMyMjY4LCAweDAwMDkwMDBCLCAweDQ2MThFNjgwLAorMHhENTdBNDYyOCwgMHgyMjY4NjI1MiwgMHgwMDBCODlGQywgMHhBMDAxMDAwOSwKKzB4NzIwMUUyMDAsIDB4OEJGQzMyNDIsIDB4MDAwOTAwMEIsIDB4NDYxOEU2ODAsCisweEQ1NzM0NjI4LCAweDIyNjg2MjUyLCAweDAwMEI4QkZDLCAweDJGRTYwMDA5LAorMHg3RkZDNEYyMiwgMHhCRkYxNkU1MywgMHg2MUUyMkY0MiwgMHhFMjgwRDY2RCwKKzB4NTRFMTE2MTUsIDB4MTY0NjQyMTgsIDB4NDIyODU1RTIsIDB4NTdFMzE2NTcsCisweDE2Nzg2RUYyLCAweDI2RTIyRTJCLCAweDRGMjY3RjA0LCAweDZFRjZBRkNFLAorMHgyRkQ2MkZDNiwgMHg0RjIyMkZFNiwgMHg2QzUzREQ2MiwgMHg2RTQzQkZENiwKKzB4MkRFMkJGQkIsIDB4MDAwOUJGRDIsIDB4MkMxMjUxRDUsIDB4MUM0MTU0RDYsCisweDFDNTI1NUQ3LCAweDFDNjM1NkQ4LCAweDZFRjY0RjI2LCAweDAwMEI2REY2LAorMHg2MTYzNkNGNiwgMHhBMDA0RTYwMCwgMHg2MjU2NDEwOSwgMHgyNDIyNzYwMSwKKzB4MzYxMjc0MDQsIDB4MDAwQjhCRjksIDB4RDY1MzAwMDksIDB4ODU2MkU1MDAsCisweEEwMEI2NzRELCAweDY1NUQ2MTBELCAweDQwMDA2MDUzLCAweDMwNUNENDRGLAorMHgwMjRENDAwOCwgMHgzMjcwNjIyRCwgMHg3NTAxODkwNSwgMHgzMjEzNjI1RCwKKzB4MDAwQjhCRjEsIDB4MDAwQkUwMDAsIDB4MkZFNkUwMDEsIDB4NTQ0MTY3NDMsCisweDRFMDhFRTdGLCAweDRFMjhEMjQ2LCAweDI1RTk2NTQzLCAweDYwNDM2RTIxLAorMHg5RTc1NjJFRCwgMHg0NTI5QzkwMywgMHhFNjAwMzJFMywgMHg4RDQ1NjEwMywKKzB4MjExODQ1MDksIDB4RDIzRjhCMDUsIDB4MDAyQzYwNTMsIDB4QTA4QUM5M0YsCisweDYwMTM2NjAzLCAweDhCMjY4ODAxLCAweDg4MEM2MDUzLCAweEQ1M0E4QjA0LAorMHhDOTNGODQ1MywgMHg2NjAzQTA3RiwgMHg4QjA0ODgwOCwgMHg4NEUyREUzNiwKKzB4QTA3OEM5M0YsIDB4ODgwRDY2MDMsIDB4OEIwM0Q2MzMsIDB4QzkzRjg0NjEsCisweDY2MDNBMDcxLCAweDg4MDk2MjYwLCAweDYyMkM4RjA5LCAweEUwMTRERTJDLAorMHg2NTVDMDVFQywgMHg2MDIzMzI1OCwgMHhBMDY0QzkzRiwgMHg2MDIzNjYwMywKKzB4QTA2MEM5M0YsIDB4ODgwMjY2MDMsIDB4RTAwNzhCNUQsIDB4NjA0MzI1MDksCisweDg5MDVDODEwLCAweDYwNTNEMjI1LCAweEM5M0YwMDJDLCAweDY2MDNBMDUzLAorMHg2MDUzREUyMywgMHhDOTNGMDBFQywgMHg2NjAzQTA0RCwgMHg4ODAxNjAxMywKKzB4NjA1MzhCMTksIDB4OEIwNDg4MEMsIDB4ODQyM0QyMUUsIDB4QTA0MkM5M0YsCisweDg4MDg2NjAzLCAweEQ1MUI4QjA0LCAweEM5M0Y4NDUyLCAweDY2MDNBMDNCLAorMHhENjE4ODgwRCwgMHg4NDYxOEIwMywgMHhBMDM0QzkzRiwgMHg2MDYwNjYwMywKKzB4QTAzMEM5M0YsIDB4ODgwMjY2MDMsIDB4RTAwNzhCMkQsIDB4NjA0MzI1MDksCisweDg5MjNDODEwLCAweDYwNTNERTEwLCAweEM5M0YwMEVDLCAweDY2MDNBMDIzLAorMHgwMDAwMEJCOCwgMHgwMDIwMzQ3MCwgMHgwMDFDMzcwNCwgMHgwMDFDMzczQywKKzB4MDAxQzM3MDAsIDB4MDAxQzM3MEMsIDB4MDAxMTQwMDAsIDB4MDAxMTQwMDgsCisweDAwMTE0MkQ4LCAweDAwMTE0MkU0LCAweDAwMTE0MkU4LCAweDAwMTE0MkY1LAorMHgwMDExNDJFRCwgMHgwMDExNDJGRCwgMHgwMDExNDMwOSwgMHg2MDUzRDIwOSwKKzB4QzkzRjAwMkMsIDB4NjAxMzY2MDMsIDB4OEIwMzg4MDIsIDB4QzgxMDYwNDMsCisweDc2MDI4OTAwLCAweEM5M0Y2MDYzLCAweDQwMDA0MDE4LCAweDE3NDEyNDBCLAorMHg2RUY2MDAwQiwgMHgwMDExNDMwMSwgMHgwMDA5QTE2RSwgMHgyRkU2MkZENiwKKzB4REQ5NDRGMjIsIDB4QTAwNDlFQjIsIDB4RDQ5MzAwMDksIDB4NDIwQkQyOTMsCisweDYyRDI2NUQyLCAweDhCRjgyMkU4LCAweDAwMDlBMDA0LCAweEQyOEZENDkwLAorMHg1NUQxNDIwQiwgMHgyMkU4NTJEMSwgMHhBMDA0OEJGOCwgMHhENDhEMDAwOSwKKzB4NDIwQkQyOEEsIDB4NTJEMjU1RDIsIDB4OEJGODIyRTgsIDB4MDAwOUEwMDQsCisweEQyODZENDg5LCAweDU1RDM0MjBCLCAweDIyRTg1MkQzLCAweEEwMDQ4QkY4LAorMHhENDg2MDAwOSwgMHg0MjBCRDI4MSwgMHg1MkQ0NTVENCwgMHg4QkY4MjJFOCwKKzB4NkVGNjRGMjYsIDB4NkRGNjAwMEIsIDB4MkZENjJGQzYsIDB4NEYyMjJGRTYsCisweDZFNjM2QzczLCAweDZENTNCMDFBLCAweDY0RDM1N0Y0LCAweEIwNUY2NUUzLAorMHhCMDc1NjZDMywgMHhCMEE0MDAwOSwgMHhCMEE4MDAwOSwgMHhCMEFDMDAwOSwKKzB4QjBBQzAwMDksIDB4QjBBRjAwMDksIDB4QjAzMTU0RjUsIDB4NkNDRDZDMDMsCisweDRGMjY2MEMzLCAweDZERjY2RUY2LCAweDZDRjYwMDBCLCAweDM0MTJEMTcwLAorMHhENjcwMDUyOSwgMHgyNjUwRDc3MCwgMHgyNzQyMDAwQiwgMHgwMDA5QTAxOCwKKzB4MkZENjJGQzYsIDB4NEYyMjJGRTYsIDB4NkU2MzZDNzMsIDB4NkQ1M0JGRUUsCisweDY0RDM1N0Y0LCAweEIwMzM2NUUzLCAweEIwOEQ2NkMzLCAweEIwMEY1NEY1LAorMHg2Q0NENkMwMywgMHg0RjI2NjBDMywgMHg2REY2NkVGNiwgMHg2Q0Y2MDAwQiwKKzB4RTUwM0QxNjIsIDB4RDc2M0Q0NjIsIDB4MjE1MjQ1MTgsIDB4MjQ3MjAwMEIsCisweEQ0NUZEMTVFLCAweDIxNjJFNjAwLCAweDI0NjIwMDBCLCAweEJGNzM0RjIyLAorMHhCRjczRTQwQSwgMHhEMjVDMDAwOSwgMHg0MTE4RTEwNCwgMHhFNDBBRTUwMCwKKzB4QkY2OTIyMTIsIDB4RDc1OTIyNTIsIDB4Q0IyMDYwNzIsIDB4MDAwQjRGMjYsCisweDRGMjIyNzAyLCAweDQxMEJEMTU2LCAweEQ1NTZFNDAwLCAweDRGMjY0NTJCLAorMHhEMTU1MkZFNiwgMHg2NjEyNkU2MywgMHg5MjEwNDQxOCwgMHg0NDA4NDUyOCwKKzB4NDUwMDI2MjksIDB4MjY1QjQ0MDgsIDB4MjY0QjQ0MDAsIDB4MjE2MjQ3MDgsCisweEQxNEU0NzA4LCAweDIxNzIyN0VCLCAweDZFRjYwMDBCLCAweDFGRkYwM0YwLAorMHg0RjIyMkZFNiwgMHhFMTAxREU0QSwgMHhCRjNERTQwQSwgMHg2N0UzMkUxMiwKKzB4RTUwMDc3NkMsIDB4RTIwNEUxMzAsIDB4Mjc1MkU0MEEsIDB4Mjc1MjI3NTIsCisweDI3NTIyNzUyLCAweDI3NTIyNzUyLCAweDI3NTIyNzUyLCAweDI3NTIyNzUyLAorMHgyNzUyMjc1MiwgMHgyNzUyMjc1MiwgMHgyNzUyMjc1MiwgMHgyNzUyMjc1MiwKKzB4MjcyMjI3MTIsIDB4Mjc1MjI3NTIsIDB4Mjc1MjI3NTIsIDB4Mjc1MjI3NTIsCisweDI3NTIyNzUyLCAweDE3NUFCRjE4LCAweDJFNjJFNjAwLCAweDAwMEI0RjI2LAorMHhEMjM0NkVGNiwgMHhFNDQxRTEwMSwgMHgwMDBCMjIxMiwgMHhEMTMyMjI0MiwKKzB4RTYwNUQ0MzIsIDB4MDAwQjIxNjIsIDB4MDAwQjI0NjIsIDB4RDIzMDAwMDksCisweEU0MEFFNjAxLCAweDIyNjJBRjAwLCAweDJGQzYyRkI2LCAweDJGRTYyRkQ2LAorMHg3RkZDNEYyMiwgMHg2QzQzREIyQiwgMHhFRDAwNjBCMiwgMHgyQjAyQ0IwMywKKzB4QzkwMzYwQjIsIDB4NkUwM0EwMDgsIDB4ODkwNzNEQzIsIDB4RTQ2NDYwQjIsCisweEIwN0NDOTAzLCAweDdEMDE2RTAzLCAweDhCRjUyRUU4LCAweDhGMDQzREMyLAorMHhENDIxMkZFMSwgMHg0NjBCRDYyMSwgMHg2MkYxMDAwOSwgMHg2MDIzNjIyRCwKKzB4ODlGRkM4MDEsIDB4N0YwNDYwMjMsIDB4NkVGNjRGMjYsIDB4NkNGNjZERjYsCisweDZCRjYwMDBCLCAweDAwMUMzQjg4LCAweDAwMjAzQUM4LCAweDAwMjAxOEQwLAorMHgwMDIwM0FEMCwgMHgwMDIwM0FEOCwgMHgwMDIwM0FFMCwgMHgwMDIwM0FFOCwKKzB4MDAyNUU3MjAsIDB4MDAyMDNEQkMsIDB4MDAyMDM5ODAsIDB4MDAxQzU5NjgsCisweDAwMUMzQjQwLCAweDAwMEY4MDAwLCAweDAwMUQ0MDA0LCAweDAwMUMzNTAwLAorMHgwMDIwMTVFNCwgMHgwMDIwMTYxMCwgMHgwMDFDNTgxNCwgMHgwMDFDNTlEMCwKKzB4MDAxQzU4MzAsIDB4MDAxQzYyNjgsIDB4MDAxQzU5QTQsIDB4MDAxQzYzOUMsCisweDAwMUM1ODFDLCAweDAwMUM1ODYwLCAweDAwMjAzQUYwLCAweDAwMjAxOEMwLAorMHg4RjAxNDQxMSwgMHg2MDQzNjA0QiwgMHgwMDA5MDAwQiwgMHg1NjUxRDUyQiwKKzB4NDYyODYwNTIsIDB4MzA2QzAwMEIsIDB4MkZDNjJGQjYsIDB4MkZFNjJGRDYsCisweDRGMTI0RjIyLCAweEJGRjE0RjAyLCAweDZCMDM2RTQzLCAweEREMjVEQzI0LAorMHgwMDA5QkZFQywgMHgzQzA1MzBCOCwgMHg0NjA5MDYwQSwgMHg0NjAxNDYwOSwKKzB4MDIwQTNENjUsIDB4NDIwOTQyMDksIDB4MzJFMjQyMDksIDB4NEYwNjhCRjAsCisweDRGMjY0RjE2LCAweDZERjY2RUY2LCAweDAwMEI2Q0Y2LCAweDJGQzY2QkY2LAorMHgyRkU2MkZENiwgMHg0RjEyNEYyMiwgMHhCRkNGNEYwMiwgMHg2QzAzNkU0MywKKzB4QkZDQkREMTMsIDB4MzBDODAwMDksIDB4MDYwQTNEMDUsIDB4NDYwOTQ2MDksCisweDM2RTI0NjAxLCAweDRGMDY4QkY1LCAweDRGMjY0RjE2LCAweDZERjY2RUY2LAorMHg2Q0Y2MDAwQiwgMHg0RjIyMkZFNiwgMHhFMTAyREUwQiwgMHhFNDAzRTUwMCwKKzB4QkZCOTJFMTIsIDB4RTYwNjJFNTIsIDB4RTcwMDQ2MTgsIDB4MkU2MkU0MDMsCisweDRGMjYyRTcyLCAweDZFRjZBRkIwLCAweDAwMDkwMDBCLCAweDAwMUMxMDQwLAorMHhDQ0NDQ0NDRCwgMHgxMDYyNEREMywgMHgwMDFENDAwNCwgMHgyRjk2MkY4NiwKKzB4MkZCNjJGQTYsIDB4MkZENjJGQzYsIDB4NEYyMjJGRTYsIDB4RTUwMDdGOTgsCisweDY0NTNFNzEwLCAweDZCNTM0NzI4LCAweEVFMUFEQ0JDLCAweDYxNTM2NTVELAorMHgzMTVDNDEwOCwgMHg3NTAxNDEwOCwgMHg2MDQzMzE3QywgMHgwRjE2NjY1RCwKKzB4RUQwMDYwQjMsIDB4MjFCMTM2RTMsIDB4ODExMjgxMTEsIDB4MTFEMjgxMTMsCisweDExRDQxMUQzLCAweDc0MDQ4RkVBLCAweEQ4QjE2N0YyLCAweDE4NzFEOUIxLAorMHg1OEYxMjg3MiwgMHgxOTgxRDFCMCwgMHg1OUYyMjk4MiwgMHg1REY0NUFGMywKKzB4NTRGNjVFRjUsIDB4MjE5MjExOTEsIDB4MTFBMjExQTMsIDB4MTFENDExRDUsCisweDExRTYxMUU3LCAweDExNDgxMTQ5LCAweERBQTg1NUY3LCAweDU3RjhFRTAwLAorMHg1MkY5RERBNywgMHg2NEUzRDZBNywgMHgyQTUyMUE1MSwgMHhEOEE3RDlBNiwKKzB4MkQ3MkVBRUYsIDB4NkFBQzI2MjIsIDB4NkRFMzZFRUQsIDB4NjFFMzREMDgsCisweDQxMDgzREVDLCAweDMxRUM0RDA4LCAweDYwQjMzRDlDLCAweDJEQjE0MTA4LAorMHhFMDUwODFEMSwgMHhFNzlGNDEwOCwgMHg0MTA4NDAwOCwgMHg4MUQyNjc3QywKKzB4MzE4QzYwQjMsIDB4MzQ3MkUyMDAsIDB4MUREMjgxRDMsIDB4RDQ5MzFEMTMsCisweDFEMjQ4RDAxLCAweDY1RDNENDhGLCAweDdFMDFCMEIyLCAweDM0QTI2NEVELAorMHhEQThDOEJEQSwgMHg2OEEyMkZEMiwgMHg0ODI5REQ5MSwgMHg2NEEyMkQ4MiwKKzB4Njk0RDdERkMsIDB4MkQ5MkQyODYsIDB4NEUyOTZFMjIsIDB4MkRFMjdEMEMsCisweDZBRDM2ODIyLCAweEQ3ODQ2MThELCAweDZENzIyQTE2LCAweEQ1ODNENDg5LAorMHg1RTcyMjREMiwgMHgxNEUyRDY4OCwgMHhFRTAwNTE3NCwgMHg1ODc2MTQxNCwKKzB4MTQ4NkQxODYsIDB4RTcxMDU5NzgsIDB4NjI1MjE0OTgsIDB4MTQyQTY1RTMsCisweDY0RTMyNkUyLCAweDY0NERFNjAwLCAweDQ4MDg2ODQzLCAweDQ4MDgzODRDLAorMHg2MDUzMzgxQywgMHgyOEIxMEM4NiwgMHg2MEIzMDlDRSwgMHg2MDUzODE5MSwKKzB4NjA0MzBBQ0UsIDB4NjA1MzgxQTIsIDB4NjBCMzBEQ0UsIDB4NjA1MzgxRDMsCisweDc0MDEwOENFLCAweDA5Q0UxODgyLCAweDE5RTM2MjRELCAweDMyNzMwQUNFLAorMHg4RkUwMUE2NCwgMHhEOTZBNzUwNCwgMHg2QzkyRTAwMywgMHgyQ0IxNDAxOCwKKzB4REE2RjZEOTIsIDB4RTA1MDgxRDEsIDB4NDAwODZFOTIsIDB4NjE5MjgxRTIsCisweDgxMTM2MEIzLCAweEU2MDA2NDkyLCAweDY3OTIxNDQyLCAweDE3QTNENDY4LAorMHhFMUZGNjg5MiwgMHhFNzAzMTg2NCwgMHg0NjA4NjU2MywgMHg3NTAxMzY0QywKKzB4NjY1RDI2MTIsIDB4OEJGODM2NzMsIDB4RTAwM0RDNUEsIDB4NDAxODZEQzIsCisweDZFQzIyREIxLCAweDgxRTFEMjVGLCAweEVFMDA2MUMyLCAweDY0QzIxMTEyLAorMHgxNDIzRTAyNCwgMHhENDVCNjVDMiwgMHg2N0MyMTVFNCwgMHg4MTcyRTU4MCwKKzB4NjZFMzY4QzIsIDB4NjU1QzgxODMsIDB4Njk2MzY2NkQsIDB4NkE2RDc2MDQsCisweDNBNTMzOTRDLCAweDI5RTI4RkY4LCAweERDNTREQjUzLCAweDc0MDQyNEIyLAorMHg3RjY4MjRDMiwgMHg2RUY2NEYyNiwgMHg2Q0Y2NkRGNiwgMHg2QUY2NkJGNiwKKzB4MDAwQjY5RjYsIDB4NjE0MjY4RjYsIDB4QzgwMzYwMTEsIDB4RTUwMDhGMDMsCisweDM0MjBEMjNDLCAweDYwMTE4QjA2LCAweDg4MDJDOTAzLCAweEQyMzk4QjA2LAorMHg4QjAzMzQyMCwgMHg2NTEzNTYxMiwgMHgyNDIyNTI2NCwgMHg2MDUzMDAwQiwKKzB4MkZFNjJGRDYsIDB4N0ZFQzRGMjIsIDB4NjI1MzZFNTMsIDB4NkQ0M0U1NTAsCisweDQ1MDhFNDAwLCAweEUxMDFBMDAxLCAweDYwNDM1MjI0LCAweDgxMjEyMjExLAorMHg2MDUzODEyMywgMHg1NkUyODEyMiwgMHg4QkY1MzYyMCwgMHgxNkU0RDIzOCwKKzB4RTYxNDY0RjMsIDB4NjVFMzQyMEIsIDB4RTRGQzY1RTEsIDB4MkU1MTI1NDksCisweDY1RjM2MUYxLCAweDJGMTEyMTQ5LCAweEQxMzE1NEQxLCAweEU2MTQ0MTBCLAorMHg2MDcxNTdEMSwgMHgyNzAxQ0IwMSwgMHg3RjE0MURFMSwgMHg2RUY2NEYyNiwKKzB4NkRGNjAwMEIsIDB4MkZFNjJGRDYsIDB4N0ZFQzRGMjIsIDB4NjY1MzZFNTMsCisweDZENDNFNUZDLCAweDIwNTk2MDYxLCAweDI2MDFDQjAxLCAweDMyNjA1MkUyLAorMHgxMkU0OEIwNiwgMHgzMUUwNTFFMiwgMHg1MkQxOEIwNCwgMHgxRTIyQTAwMiwKKzB4NTY2NEFGRjAsIDB4NjRGM0QyMUUsIDB4NDIwQkU2MTQsIDB4NjdFMTY1RTMsCisweDI3MTlFMUZDLCAweDY3RjEyRTcxLCAweDI3MTk1NEQxLCAweDY1RjNEMTE4LAorMHg0MTBCRTYxNCwgMHg1MkQxMkY3MSwgMHhDQjAxNjAyMSwgMHgxREUxMjIwMSwKKzB4NEYyNjdGMTQsIDB4MDAwQjZFRjYsIDB4MDAwMDZERjYsIDB4MDAyMDM5QUMsCisweDAwMjAzNTdDLCAweDAwMjAzNTg0LCAweDAwMjAzNThDLCAweDAwMjAzNUI0LAorMHgwMDIwMzk5OCwgMHgwMDIwMzlBMCwgMHgwMDEwMDIwOCwgMHgwMDEwMTRDMCwKKzB4MDAxRTIxMEMsIDB4MDAxQzNEMDAsIDB4MDAyMDM5RUMsIDB4MDAxMDAwQzgsCisweDAwMTE3ODgwLCAweDAwMTE3NzgwLCAweDAwMDQwMDIwLCAweDAwMjZDNDAxLAorMHgwMDIwMEQ0MiwgMHg0RjIyMkZFNiwgMHhERTQyNjI0QywgMHg0MjAwNDIwOCwKKzB4M0UyQ0EwMDUsIDB4RDQ0MDUyNTIsIDB4QkY2OTU2MjQsIDB4NjVFMjJFNjIsCisweDM1MjA1MkUxLCAweEQ2M0Q4QkY2LCAweDRGMjYyNjIyLCAweDZFRjYwMDBCLAorMHgyRkM2MkZCNiwgMHgyRkU2MkZENiwgMHhEQzM5NEYyMiwgMHg1MkMxREIzOSwKKzB4MzYyMDY2QzIsIDB4NjA2MTg5MUMsIDB4ODgwMUM5MDMsIDB4REUzNDg5MTgsCisweEJGMzhERDM1LCAweDY1MDM2NEUzLCAweDY2QjI4NTAzLCAweDMyNjI2MjBELAorMHhENDMyODkwNywgMHgwMDA5QkY3NiwgMHg0RDBCRDQzMSwgMHhBRkU2MDAwOSwKKzB4QkYzRDAwMDksIDB4RDQyRjY0RTMsIDB4MDAwOTREMEIsIDB4MDAwOUFGREYsCisweDIyNjJEMjJELCAweDZFRjY0RjI2LCAweDZDRjY2REY2LCAweDZCRjYwMDBCLAorMHgyRkQ2MkZDNiwgMHg0RjIyMkZFNiwgMHhERDI5REMyOCwgMHg2RTQzNjBDMiwKKzB4MDRERTQwMDgsIDB4RTYxNEQxMjcsIDB4NjVFMzQxMEIsIDB4RDEyN0Q3MjYsCisweDU1RTIyN0UyLCAweDM1RTA1MjU0LCAweDIxMjI4RjA0LCAweDQwMDg2MEMyLAorMHgxMjIyMDJERSwgMHg2MDUzNjVDMiwgMHg3NTAxNDAwOCwgMHgwREU2MDZERSwKKzB4QzkwRjYwNTMsIDB4NjA2MzJDMDIsIDB4NkVGNjRGMjYsIDB4MDAwQjZERjYsCisweDg1NDM2Q0Y2LCAweDY1MEQ1NjQzLCAweDYyMkQ2MjYyLCAweDM1Mjc3MjA0LAorMHhFMTAwOEYwQywgMHgyMjY4OTYwQywgMHhENjE1OEIwMywgMHg3MjAxNTI2MSwKKzB4RDYxMzE2MjEsIDB4NjI2MkUxMDEsIDB4MjYyMjcyMDEsIDB4NjAxMzAwMEIsCisweDAwMDAwMUZGLCAweDAwMjAzNThDLCAweDAwMjAzNTg0LCAweDAwMUMzRDAwLAorMHgwMDIwMzVCNCwgMHgwMDIwMzk3QywgMHgwMDIwMThDMCwgMHgwMDIwMzU3QywKKzB4MDAyMDNCMTgsIDB4MDAyMDNCMUMsIDB4MDAxQzNEMjgsIDB4MDAyMDM5RUMsCisweDAwMjAzOUFDLCAweDAwMjAwRDQyLCAweDAwMjAzOUYwLCAweDAwMjAzOUY0LAorMHgwMDExNzc1NCwgMHgyRkE2MkY5NiwgMHgyRkM2MkZCNiwgMHgyRkU2MkZENiwKKzB4N0ZGODRGMjIsIDB4NkMyMkQyNDEsIDB4QzgwMzYwQzMsIDB4REU0MDg5NkUsCisweERBNDFEQjQwLCAweDUyQjFEOTQxLCAweDM2MjA2NkIyLCAweDYwNjE4OTQ1LAorMHg4ODAxQzkwMywgMHhERDNCODk0MSwgMHg0MjBCRDIzRCwgMHg2NTAzNjREMywKKzB4NjBBMTJGMDIsIDB4ODkzMjg4MDEsIDB4ODUxNDUxNTMsIDB4ODg0MDYwMEMsCisweDFGMTE4RjBDLCAweEQ1Mzc2MTkxLCAweDY0MUQ0NTBCLCAweDhCMjYyMDA4LAorMHhENzM1NjY5MSwgMHg2NDZENDcwQiwgMHg4QjIwMjAwOCwgMHg0MjBCRDIzMywKKzB4NTFGMTU0RjEsIDB4QzgyMDg1MTEsIDB4RDEzMTg5MDQsIDB4MDIxRUUwNTAsCisweDAxMjY3MjAxLCAweDQyMEJEMjJGLCAweDIwMDg2NEYyLCAweDY0RDM4OTA3LAorMHg0RDBCREQyRCwgMHhEMTJENjVGMiwgMHhBRkM0RTYwMSwgMHhEMjJDMjE2MiwKKzB4NDIwQjY1RjIsIDB4RDcyQjY0RTMsIDB4QUZCQ0U2MDEsIDB4RDIyNjI3NjIsCisweDQyMEI2NUYyLCAweEFGQjY2NEQzLCAweERFMjcwMDA5LCAweERBMjhERDI3LAorMHg1MkQxREIyOCwgMHgzNjIwNjZEMiwgMHg2MDYxODkxOCwgMHg4ODAxQzkwMywKKzB4RDQyMjg5MTQsIDB4NDUwQkQ1MTYsIDB4NTYwMzAwMDksIDB4OEYwNDM2RTAsCisweEUyMDE2NTAzLCAweEFGRUMyQTIwLCAweEQ0MUYyQjUyLCAweDQyMEJEMjE2LAorMHhENzE4MDAwOSwgMHg0MTE4RTEwMSwgMHgyNzEyQUZFMywgMHhDODA0NjBDMywKKzB4RDIxQTg5MDIsIDB4MDAwOTQyMEIsIDB4NEYyNjdGMDgsIDB4NkRGNjZFRjYsCisweDZCRjY2Q0Y2LCAweDAwMEI2QUY2LCAweDAwMDA2OUY2LCAweDAwMUUyMTAwLAorMHgwMDIwMzU4QywgMHgwMDIwMzU4NCwgMHgwMDIwM0ExNCwgMHgwMDExNDJEOCwKKzB4MDAyMDE0QTYsIDB4MDAxMTVFQTIsIDB4MDAxMTQ3NzQsIDB4MDAyMDBEOEEsCisweDAwMjAzNTFDLCAweDAwMjAxNkMyLCAweDAwMjAxNEQwLCAweDAwMUUyMTJDLAorMHgwMDIwMTUzNCwgMHgwMDFDM0QzMCwgMHgwMDExNzg4MCwgMHgwMDIwMzU3QywKKzB4MDAyMDM5OUMsIDB4MDAyMDM5OTgsIDB4MDAyMDM1QjQsIDB4MDAyMDA2NDQsCisweEU2MDFEMjAzLCAweDEyNjVENTAzLCAweDAwMEIyMjUyLCAweDAwMDAxMjY2LAorMHgwMDFDMTAxMCwgMHgwMDAwQzM0RiwgMHgwMDA5MDAwQiwgMHgwMDA5MDAwQiwKKzB4MDAwOTAwMEIsIDB4MDAwOTAwMEIsIDB4RTAwMDAwMEIsIDB4RTAwMDAwMEIsCisweDAwMDkwMDBCLCAweEU0RkRENTlELCAweEQ2OUQ2MTUyLCAweDI1MTIyMTQ5LAorMHg3NDAxNjA1MiwgMHgyNTAyQ0IwMSwgMHhEMTlBNjc1MiwgMHgyNTcyMjc0OSwKKzB4Qzg0MDYwMTAsIDB4NjA2Mjg5MDIsIDB4MjYwMkNCMDQsIDB4RTFGNzY0NjIsCisweDI2NDIyNDE5LCAweEU3MDE2MDYyLCAweDI2MDJDOUNGLCAweEU1MDI2MDYyLAorMHgyNjAyQ0IxMCwgMHg0NzE4NjA2MiwgMHgyNjAyQ0IwMywgMHgwMDBCMTY1MiwKKzB4RDU4RDE2NzMsIDB4RDI4RUQ3OEQsIDB4RTEwMEQ0OEUsIDB4MjUxMUU2MDAsCisweDIyMTAyNzExLCAweDI0NjFBRkNFLCAweEQyOEI2NjRDLCAweDM2MkM0NjAwLAorMHhDQjEwNjA2MCwgMHgyNjAwMDAwQiwgMHhEMjg3NjU0QywgMHgzNTJDNDUwMCwKKzB4RTFFRjY2NTAsIDB4MDAwQjI2MTksIDB4NjY0QzI1NjAsIDB4NDYwMEQyODMsCisweDYwNjAzNjJDLCAweDAwMEJDQjEwLCAweDY1NEMyNjAwLCAweDQ1MDBEMjdGLAorMHg2NjUwMzUyQywgMHgyNjE5RTFFRiwgMHgyNTYwMDAwQiwgMHhEMjdBNjY0QywKKzB4MzYyQzQ2MDAsIDB4Q0IwODYwNjAsIDB4MjYwMDAwMEIsIDB4RDI3NjY1NEMsCisweDM1MkM0NTAwLCAweEUxRjc2NjUwLCAweDAwMEIyNjE5LCAweDY2NEMyNTYwLAorMHg0NjAwRDI3MiwgMHg2MDYwMzYyQywgMHgwMDBCQ0IwOCwgMHg2NTRDMjYwMCwKKzB4NDUwMEQyNkUsIDB4NjY1MDM1MkMsIDB4MjYxOUUxRjcsIDB4MjU2MDAwMEIsCisweEQ2Njk2MjRDLCAweDMyNkM0MjAwLCAweEM5MDg2MDIwLCAweDQwMjE0MDIxLAorMHgwMDBCNDAyMSwgMHg2MjRDNjAwQywgMHg0MjAwRDY2NCwgMHg2MDIwMzI2QywKKzB4NDAyMUM5MDgsIDB4NDAyMTQwMjEsIDB4NjAwQzAwMEIsIDB4NjQ0Q0QxNjAsCisweDYyNDAzNDFDLCAweDYwMkMwMDBCLCAweDY0NENEMTVFLCAweDYyNDAzNDFDLAorMHg2MDJDMDAwQiwgMHg0RjIyMkZFNiwgMHg2NDVDNkU0MywgMHgzNDY3RTYwQSwKKzB4QkZFQjg5MTQsIDB4NjQwQzAwMDksIDB4ODgwMTYwRUMsIDB4RTAwRjhCMDIsCisweDI0MDlBMDAyLCAweDQ0MDk0NDA5LCAweEU2MEE2MjRDLCAweDg5MDUzMjYzLAorMHg2NDRDQkZFMiwgMHg2MDIzNjIwQywgMHg4QjAwQzg4MCwgMHg2MDIzRTIwMCwKKzB4MDAwQjRGMjYsIDB4NEYyMjZFRjYsIDB4NjA2MkQ2NEIsIDB4OEIwMzg4MDEsCisweDAwMDlCMjU2LCAweDAwMDlBMDAzLCAweEU2NDBEMjQ4LCAweEQ2NDgyMjYwLAorMHg0RjI2RTIwMCwgMHgyNjIyMDAwQiwgMHhENjQzNEYyMiwgMHg4ODAyNjA2MiwKKzB4QjI5RjhCMDEsIDB4RDY0MjAwMDksIDB4NEYyNkUyMDAsIDB4MjYyMjAwMEIsCisweEQ0M0VENTNELCAweEU3MDFFMTAwLCAweDAwMEIyNTEyLCAweEQyM0IyNDcwLAorMHgwMDBCRTYwNCwgMHg0RjIyMjI2MCwgMHhEMTNCRDQzQSwgMHgwMDA5NDEwQiwKKzB4RTFGREQ1M0EsIDB4RDIzQTY2NTAsIDB4RTcwMDI2MTksIDB4NEYyNjI1NjAsCisweDIyNzAwMDBCLCAweEQ1Mzc0RjIyLCAweDYxNTJEMjM3LCAweDYxMURENzM3LAorMHg2NDUyMjUxMiwgMHgyNDJCRTZGRiwgMHhENDM1MjU0MiwgMHg2NjZERDIyRSwKKzB4Mjc2MjQyMEIsIDB4RTFGQkQ1MkQsIDB4MjcxOTY3NTAsIDB4MDAwQjRGMjYsCisweDRGMjIyNTcwLCAweEQxMjhENDJGLCAweDAwMDk0MTBCLCAweEU3RjdENTI3LAorMHgyNjc5NjY1MCwgMHgwMDBCNEYyNiwgMHhENTI0MjU2MCwgMHg2MjUwOTQyNSwKKzB4MDAwQjIyNDksIDB4RDUyMTI1MjAsIDB4NjI1MEU0QkYsIDB4MDAwQjIyNDksCisweDRGMjIyNTIwLCAweDg1MjJEMjI0LCAweDIwMDg2MDBELCAweDg4MDE4OTExLAorMHg4ODAzODk0NCwgMHg4ODA1ODk0NiwgMHg4ODA2ODk0OCwgMHg4ODA4ODk0RSwKKzB4ODgwOTg5NTQsIDB4ODgwQTg5NUEsIDB4ODgwQjg5NjAsIDB4QTA2RDg5NjYsCisweEIwNkYwMDA5LCAweEEwNkEwMDA5LCAweEZGN0Y2MDBDLCAweDAwMUUyMTQ4LAorMHgwMDFFMTEwOCwgMHgwMDFFMTAwMCwgMHgwMDIwM0E0QywgMHgwMDIwM0E0RSwKKzB4MDAyMDNBNkQsIDB4MDAyMDNBMzAsIDB4MDAxRTEwM0YsIDB4MDAxRTEwNUYsCisweDAwMUUxMDJGLCAweDAwMUUxMDkwLCAweDAwMjAzQTU0LCAweDAwMUUxMDBCLAorMHgwMDIwM0E1MCwgMHgwMDIwM0IyMCwgMHgwMDIwMThDMCwgMHgwMDFFMTAyOCwKKzB4MDAyMDNBNkMsIDB4MDAxRDQwMjAsIDB4OTg3NjAwMDAsIDB4MDAxQzEwMDAsCisweDAwMjAzQjJDLCAweDAwMjAzQjNDLCAweDAwMjAzQTI0LCAweDAwMDlCMDRDLAorMHg2MDBDQTAzNSwgMHgwMDA5QjA1NSwgMHg2MDBDQTAzMSwgMHg2MjYwRDY4NCwKKzB4OEIyQjIyMjgsIDB4MDAwOUIwNjEsIDB4NjAwQ0EwMjksIDB4NjI2MEQ2ODAsCisweDhCMjMyMjI4LCAweDAwMDlCMDY5LCAweDYwMENBMDIxLCAweDYyNjBENjdDLAorMHg4QjFCMjIyOCwgMHgwMDA5QjBDNywgMHg2MDBDQTAxOSwgMHg2MjYwRDY3OCwKKzB4OEIxMzIyMjgsIDB4MDAwOUIwQ0QsIDB4NjAwQ0EwMTEsIDB4NjI2MEQ2NzQsCisweDhCMEIyMjI4LCAweDAwMDlCMTI1LCAweDYwMENBMDA5LCAweDYyNjBENjcwLAorMHg4QjAzMjIyOCwgMHgwMDA5QjEzRCwgMHg2MDBDQTAwMSwgMHg0RjI2RTAwMCwKKzB4MDAwOTAwMEIsIDB4RDI2Q0QxNkIsIDB4RDU2Qzg0MTIsIDB4NDAwMEM5MEYsCisweEQ3NkIwMTJELCAweEU0MDNENjZCLCAweEUyMEY2MTFDLCAweDI1NDBFMDAxLAorMHgyNTIwMjcxMiwgMHgyNjAyMDAwQiwgMHhFNjAxRDI2MiwgMHgzMDY2ODUyMywKKzB4RTAwMDhEMDUsIDB4RDY2M0QyNjAsIDB4RTAwMTgxMjIsIDB4MDAwQjI2MDIsCisweEQyNUMwMDA5LCAweDYwMEQ4NTIzLCAweDg5MDUyMDA4LCAweDhCMEE4ODAxLAorMHg2MDYwRDY1RCwgMHgyNjAwQ0IwMSwgMHhENDU3RDY1QSwgMHhFMDAxRTEwMSwKKzB4MDAwQjI2MTIsIDB4MDAwQjgxNDIsIDB4RDE1MkUwMDAsIDB4ODUxM0U1MDEsCisweDY0MEQ0NTE4LCAweDY2MDMzNDUzLCAweEUwMDA4RDA1LCAweEQ1NTFEMjUzLAorMHgyMjYwRTAwMSwgMHgwMDBCMjUwMiwgMHg0RjIyMDAwOSwgMHg4NTEzRDE0OSwKKzB4NjQ1MzY1MEQsIDB4NjI0OTQ0MTksIDB4MjI3RDY3MkUsIDB4ODgwMTYwMkMsCisweDg4MDI4OTA5LCAweDg4MDM4OTEwLCAweDg4MDY4OTFBLCAweDg4MDc4OTM1LAorMHhBMDRDODkzQiwgMHhENTQ2MDAwOSwgMHg2NjUyRDc0NiwgMHgyNzYyRDQ0NiwKKzB4NjIyQzYyNjEsIDB4MjQyMUEwMzgsIDB4MjIyODYyNUMsIDB4RDQ0MzhCM0YsCisweDY2NDJENTQwLCAweDI1NjJENDQwLCAweDI0MDE4NTYxLCAweDYyMDNBMDJDLAorMHgyMDA4NjA1QywgMHg4ODEwODkwNywgMHg4ODIwODkwOCwgMHg4ODMwODkwOSwKKzB4QTAyQzg5MEEsIDB4RDIzQTAwMDksIDB4NjIyMkEwMDgsIDB4QTAwNUQyMzksCisweEQyMzk2MjIyLCAweDYyMjJBMDAyLCAweDYyNjJENjM4LCAweEQ0MzJENTMxLAorMHg2NjIxMjUyMiwgMHhBMDBGNjI2QywgMHhENjM1MjQyMSwgMHg2MjYxRDUyRCwKKzB4NjIyQ0Q0MkQsIDB4QTAwNzI1NjIsIDB4RDYzMjI0MjEsIDB4ODU2MUQ1MjksCisweDI1NjJENDI5LCAweDYyMDMyNDAxLCAweDY2MkQ4NTE1LCAweDM2MTc2MTBELAorMHg2NTAzOEYwMSwgMHhCMENCMjQ1MSwgMHhBMDAxMDAwOSwgMHhFMDAwRTAwMSwKKzB4MDAwQjRGMjYsIDB4RDYxOTAwMDksIDB4RDQyN0UxMDEsIDB4NjU0MTI2MTAsCisweEQxMThENzE3LCAweEUyMEY2NTVELCAweDI3NTJFMDAxLCAweDAwMEIyNjIwLAorMHgyRkU2MjEwMiwgMHhEMjBGNEYyMiwgMHg2NDBDODUyMywgMHg4QjA4MjQ0OCwKKzB4RDUxMUQ2MUQsIDB4MjYyMUUyMDAsIDB4OTQwRjg0NTEsIDB4QTA0ODIwNDksCisweERFMEQ4MDUxLCAweEM4NDA2MEUwLCAweEUyMDE4RDMyLCAweDg5NDQzNDI3LAorMHhEMjE2RDYxNSwgMHgyNjQxNDIwQiwgMHgwMDA5QTAzMCwgMHgwMDAwRkY3RiwKKzB4MDAyMDNBNkQsIDB4MDAyMDNBMjQsIDB4MDAyMDNBMzAsIDB4MDAxRTExMDAsCisweDAwMUUxMDBDLCAweDAwMjAzQTUwLCAweDAwMUUxMDAwLCAweDAwMUUxMDAxLAorMHgwMDIwM0E1OCwgMHgwMDIwM0EzOCwgMHgwMDIwM0EzQywgMHgwMDIwM0E0MCwKKzB4MDAyMDNBNUMsIDB4MDAyMDNBNjAsIDB4MDAyMDNBNjQsIDB4MDAyMDNBNjgsCisweDAwMjAzRTIwLCAweDAwMjAzRTJBLCAweDAwMjAzQTRBLCAweDAwMjAyN0YyLAorMHg4OTEyMzQyNywgMHhEMjk0RDY5MywgMHgyNjQxNDIwQiwgMHhDQjgwODRFMSwKKzB4ODBFMUIwRjUsIDB4RDY5MTYwRTAsIDB4MkUwMENCMDQsIDB4QzkzRjYwNjAsCisweEQ2OEYyNjAwLCAweEEwMDFFMDAxLCAweEUwMDAyNjAyLCAweDAwMEI0RjI2LAorMHhENjhDNkVGNiwgMHhDODgwNjA2MCwgMHhEMjg2ODkxOSwgMHg4ODAxNjAyMSwKKzB4RDI4OThCMTUsIDB4ODUyNEU1MDEsIDB4ODkxMDMwNTYsIDB4RTIwM0QxODcsCisweDIxMjBENDg3LCAweEUwMEI2NTQxLCAweDA2NTY2NTVELCAweEU0MEZENTg1LAorMHgyMTQwRTcwMiwgMHhENzdFMjU3MSwgMHgwMDBCRTAwMSwgMHgwMDBCMjcwMiwKKzB4MkZFNkUwMDAsIDB4REU4MDRGMjIsIDB4Qzg4MDg0RTEsIDB4RDU3QTg5MkMsCisweDIwMDg4NTU0LCAweDYxMDM4RjI4LCAweDg1NTNENzdDLCAweDY0MDM2NjcyLAorMHg4NTY2NjUwQywgMHgzNTIwNjIwQywgMHhENjc5OEIxRSwgMHg2NTFDRDc3NCwKKzB4MjY1MTY0NEMsIDB4NjBFMDI3NDEsIDB4ODkwNEM4NDAsIDB4NDIwQkQyNzUsCisweEEwMDMwMDA5LCAweEQyNjgwMDA5LCAweDAwMDk0MjBCLCAweDAwMDlCMDlGLAorMHhFMjAxRDE2NywgMHg2MEUwMjEyMiwgMHhDQjA0RDQ2NCwgMHg2MDQwMkUwMCwKKzB4MjQwMEM5M0YsIDB4NjAyM0EwMDEsIDB4NEYyNkUwMDAsIDB4NkVGNjAwMEIsCisweDJGQjYyRkE2LCAweDJGRDYyRkM2LCAweERBNjIyRkU2LCAweDY2QTFFMjQwLAorMHgzNjIyREM1RSwgMHg2MjYzODkwMCwgMHg2RUQzNkQyQywgMHg0RTIxMzZEOCwKKzB4NEUyMTJBNjEsIDB4REI2MUQ0NjAsIDB4RTcwMEEwMEYsIDB4NzcwMTYyQjIsCisweDcxMDI2MTIzLCAweDY2MjEyQjEyLCAweDcxMDI2MjEzLCAweDYxMjEyQjEyLAorMHg2NTFENjY2RCwgMHgzNTZDNDUyOCwgMHg2MjdDMjQ1MiwgMHg4QkVEMzJFMywKKzB4QzkwMzYwRDMsIDB4OEIxMDg4MDMsIDB4NjE3MzY3QjIsIDB4MkIxMjcxMDIsCisweDcxMDI2RTEzLCAweDJCMTI2NTcxLCAweDY1NUQ2REUxLCAweDQyMjg2MkRELAorMHgzMjVDRTEwNywgMHhBMDBDMkMxMCwgMHg4ODAyMjQyMiwgMHhBMDAzOEIwMSwKKzB4ODgwMUUyMDMsIDB4RTIwMThCMDUsIDB4NjZCMjJDMjAsIDB4NjU1RDY1NjEsCisweEU2MEYyNDUyLCAweDY3QTEyQzYwLCAweDhCMDUyNzc4LCAweEREMzhEQzQ0LAorMHhFQjAxRUEwMCwgMHgyREIyMkNBMiwgMHg2REY2NkVGNiwgMHg2QkY2NkNGNiwKKzB4NkFGNjAwMEIsIDB4MkZFNjJGRDYsIDB4RTI0MEREMzYsIDB4MzYyMjY2RDEsCisweDYyNjM4OTAwLCAweDM2Nzg2NzJDLCAweDc3MDNERTM4LCAweDQ3MjEyRDYxLAorMHg2NEUyRDYzNSwgMHhBMDBFNDcyMSwgMHg2NTYyRTEwMCwgMHg2MjUzNzEwMSwKKzB4NzQwMTI0NTAsIDB4MjQyMDQyMTksIDB4NDUyOTc0MDEsIDB4NzQwMTI0NTAsCisweDI0NTA0NTE5LCAweDYyMUM3NDAxLCAweDhCRUUzMjczLCAweDY2RTI0MjAwLAorMHg0MjAwNjFEMSwgMHgyMTE4MzYyQywgMHgyRTYyOEYwNiwgMHhERDFDRDcyOCwKKzB4RTUwMUU0MDAsIDB4MkQ1MjI3NDIsIDB4MDAwQjZFRjYsIDB4MkZENjZERjYsCisweDRGMjIyRkU2LCAweEVEMEFFRTAxLCAweDY0RTNCQzg2LCAweEJDOEI2NEUzLAorMHg2MkVDN0UwMSwgMHg4QkY3MzJENywgMHhCQzhFRUUwMSwgMHg2NEUzNjRFMywKKzB4N0UwMUJDOTMsIDB4MzJENzYyRUMsIDB4NEYyNjhCRjcsIDB4MDAwQjZFRjYsCisweEQxMTg2REY2LCAweEQ0MTg5MjBELCAweDcyMTIyMTIyLCAweDI0MjJENjE3LAorMHhENzE3NzIwNCwgMHg3MjIwMjYyMiwgMHgyNzIyRDExNiwgMHgwMDBCNzIzMCwKKzB4MTM3QTIxMjIsIDB4MDAyMDNBNEEsIDB4MDAyMDI4RkUsIDB4MDAxRTEwMTUsCisweDAwMjAzQTUwLCAweDAwMUUxMDAxLCAweDAwMjAzQTI0LCAweDAwMUUxMTAwLAorMHgwMDIwM0E0RSwgMHgwMDIwM0EzQywgMHgwMDFFMTAwMCwgMHgwMDIwM0E0MCwKKzB4MDAyMDNBNEMsIDB4MDAyMDI3RjIsIDB4MDAxRTEwMEMsIDB4MDAyMDNBMzgsCisweDAwMjAzQTU0LCAweDAwMjAzQTU4LCAweDAwMjAzQTVDLCAweDAwMjAzQTYwLAorMHgwMDIwM0E2NCwgMHgwMDIwM0E2OCwgMHg0RjIyMkZFNiwgMHhENjcwN0ZGQywKKzB4ODgwMTYwNjAsIDB4RTIwMTg5NTEsIDB4MjYyMEJGQkIsIDB4RDU2RUQxNkQsCisweERFNkU2MDEwLCAweDY0RTM2NTUyLCAweDc0MDJDODQwLCAweDhEMjJEMTZDLAorMHhEMjZDNzUwMiwgMHhFNjAxRDc2QywgMHhFNzA0MjcyMiwgMHg3NjAxNjI1NSwKKzB4NjI2QzI0MjEsIDB4OEZGOTMyNzMsIDB4RDQ2Mzc0MDIsIDB4NjI0MkU2MDEsCisweDY0MEQ4NTI4LCAweDY3NDk0NDE5LCAweDI3NUQ2NTdFLCAweDgxRTQ2MDdDLAorMHhFNDE3RDU2MiwgMHg2NzU1NzYwMSwgMHgzMjQzNjI2QywgMHg4RkY5MjE3MSwKKzB4QTAyMDcxMDIsIDB4RDI1RTAwMDksIDB4RTYwMUQ3NUIsIDB4RTcwNDI3MjIsCisweDc2MDE2MjU1LCAweDYyNkMyNDIxLCAweDhGRjkzMjczLCAweEQ0NTI3NDAyLAorMHg2MjQyRTYwMSwgMHg2NDBEODUyOCwgMHg2NzQ5NDQxOSwgMHgyNzVENjU3RSwKKzB4ODFFNDYwN0MsIDB4RTQxN0Q1NTMsIDB4Njc1NTc2MDEsIDB4MzI0MzYyNkMsCisweDhGRjkyMTcxLCAweDkyODk3MTAyLCAweEQyNDYyRTIxLCAweDVFMjNENzRFLAorMHg2NEYyMkZFMiwgMHg2MDQzNjVGMiwgMHgyNzAwQzk4MCwgMHhDOTYwNjA0MywKKzB4ODA3MTYxMDMsIDB4QzkwMzYwNDMsIDB4ODA3MjQ1MTksIDB4NjVGMjYwNUMsCisweDgxNzI2NkYyLCAweDQ2MTk0NjI5LCAweDYwNkM0NTI5LCAweDQwMTg2NDVDLAorMHg4MTczMzA0QywgMHgyMTE4NUUyMywgMHg2NEYyMkZFMiwgMHg2RTRDNjJGMiwKKzB4NjAyQzQyMTksIDB4NjZGMjYyRjIsIDB4NDYyOTQwMTgsIDB4NDYxOTMwRUMsCisweDQyMjk4MTc0LCAweDY1MkM2MDZDLCAweDMwNUM0MDE4LCAweDgxNzU4RjA3LAorMHgwMDA5QkM5NywgMHgyMjI4NjIwQywgMHhBMDBBODkwOCwgMHg2MDEzMDAwOSwKKzB4OEIwMzg4NDAsIDB4MDAwOUIwMDksIDB4MDAwOUEwMDMsIDB4RTIwMkQ2MkYsCisweDdGMDQyNjIyLCAweDAwMEI0RjI2LCAweDRGMjI2RUY2LCAweDg1NTJENTJBLAorMHg4ODMwNjAwRCwgMHg4ODMxODkwMywgMHhBMDM0ODkyMywgMHg4NTU1MDAwOSwKKzB4RDQyOEQ3MjcsIDB4ODU1MzI3MDEsIDB4NjEwREQ2MjcsIDB4MjQxMjQxMTgsCisweDQ2MEJENDI2LCAweEQ3MjMwMDA5LCAweEQyMjZENDI1LCAweDY1NzI0MjBCLAorMHhFMjMwRDEyMCwgMHg0MjI4NjcxMiwgMHgyNzI5RTYyMCwgMHgzNzYwNDYyOCwKKzB4RDYyMThCMDMsIDB4QTAxNkUyMDAsIDB4RDYxRjI2MjIsIDB4QTAxMkUyMDIsCisweEQxMTgyNjIyLCAweDYyMTJFNTMwLCAweEU2MjA0NTI4LCAweDQ2MjgyMjU5LAorMHg4OTA4MzI2MCwgMHhENDFBRDExOSwgMHhFNjAxRDUxMywgMHgyMTYwNDUwQiwKKzB4NDcyQkQ3MTgsIDB4NEYyNjRGMjYsIDB4MDAwOTAwMEIsIDB4MDAwMDA2MEEsCisweDAwMjAzQTZDLCAweDAwMUUxMDAwLCAweDAwMjAzQTU4LCAweDAwMjAzRTIwLAorMHgwMDIwM0UyQywgMHgwMDIwM0RDNCwgMHgwMDIwM0E0MCwgMHgwMDIwM0RGNCwKKzB4MDAyMDNERjIsIDB4MDAyMDNEQzYsIDB4MDAyMDNBMjQsIDB4MDAyMDNBNTAsCisweDAwMjAzQTNDLCAweDAwMjAzQTM4LCAweDAwMjAxOEMwLCAweDAwMjAzQjQ4LAorMHgwMDIwM0I0QywgMHgwMDIwMThEMCwgMHgwMDIwM0E1NCwgMHgwMDFFMTAwQiwKKzB4MDAyMDNCNjAsIDB4MDAxMTQwMDQsIDB4NEYyMjJGRTYsIDB4ODRFOURFODYsCisweDI0NDg2NDBDLCAweEIxN0I4OTAxLCAweEQyODQwMDA5LCAweDI2Njg2NjIwLAorMHg2MEUwODkwMiwgMHgyRTAwQzlCRiwgMHgwMDBCNEYyNiwgMHgwMDBCNkVGNiwKKzB4MkZFNjAwMDksIDB4REU3RTRGMjIsIDB4NjBFMEQ2N0UsIDB4Q0JDMEQ0N0UsCisweDYyNjAyRTAwLCAweEM4MDM2MDJDLCAweDQwMjE4OTA0LCAweDcwMDE0MDIxLAorMHg2NjAzQTAwMiwgMHg2NjAzNDAwOSwgMHhENjc4NjE2RCwgMHhFNTAwQTAwNCwKKzB4NzUwMTYyNjIsIDB4NzQwNDI0MjIsIDB4MzIxMzYyNUQsIDB4RDI3NDhCRjgsCisweDAwMDk0MjBCLCAweEM5QkY4NEUyLCAweDRGMjY4MEUyLCAweDZFRjYwMDBCLAorMHgyRkU2MkZENiwgMHg3RkZDNEYyMiwgMHg2MjYwRDY2RSwgMHg4OTQwMjIyOCwKKzB4RDU2NUUxMDAsIDB4NjA1MDI2MTAsIDB4Q0I0MEQ0NkIsIDB4MjUwMDQ0MEIsCisweDhEMDUyMDA4LCAweDYyRTA2RTAzLCAweDcxMDQ2MTJDLCAweDJGMTFBMDA2LAorMHhENDY2RDY1RSwgMHhERDY2Njc2MCwgMHg2NTdDNEQwQiwgMHhFMjNDNkQxRCwKKzB4OEIwMzNEMjcsIDB4RDI2NEQ0NjMsIDB4MDAwOTQyMEIsIDB4NEQyMTREMjEsCisweEEwMDVENzYyLCAweDY2RTZFNDAwLCAweDM1N0M0NTA4LCAweDc0MDEyNTYyLAorMHgzNUQzNjU0RCwgMHhENzVFOEJGNywgMHg2RTcyRTAwMywgMHg4MUUxNDAxOCwKKzB4NkU3MjYwRjEsIDB4ODFFMjcwMEMsIDB4RDQ1QTYxNzIsIDB4REQ1QTgxMTMsCisweDY1NzI0RDBCLCAweEQ2NEFEMjU5LCAweDIyMTJFMTAxLCAweEM5M0Y2MDYwLAorMHg3RjA0MjYwMCwgMHg2RUY2NEYyNiwgMHg2REY2MDAwQiwgMHgyRkM2MkZCNiwKKzB4MkZFNjJGRDYsIDB4RDI1MjRGMjIsIDB4NkI0MzZFNzMsIDB4NDIwQjZDNTMsCisweDIwMDg2RDYzLCAweDY0MDM4RDFDLCAweEU1MEVEMTNDLCAweDMyNTI2MjEwLAorMHg2MEMzODkxNiwgMHg4MDQxMjRCMCwgMHg4MTQxNjBEMywgMHhBMDA3RTUwMCwKKzB4NjU1RDYxQkMsIDB4MDBFQzYwNTMsIDB4MzY0QzY2NTMsIDB4ODA2NDc1MDEsCisweDMyMTM2MjVELCAweEQ2MzA4QkY1LCAweEM5QkY2MDYwLCAweDI2MDBBMDA4LAorMHhEMjM5RDQ0MCwgMHg2RUY2NEYyNiwgMHg2Q0Y2NkRGNiwgMHg2QkY2NDIyQiwKKzB4NkVGNjRGMjYsIDB4NkNGNjZERjYsIDB4NkJGNjAwMEIsIDB4MkY5NjJGODYsCisweDJGQjYyRkE2LCAweDJGRDYyRkM2LCAweDRGMjIyRkU2LCAweEUxMDA3RkM0LAorMHg2NTEzRUNGRiwgMHg2QjEzNkNDRCwgMHhERTM0RDczMywgMHhFREZGNjRGMywKKzB4RDgzM0VBMDQsIDB4NjA1MzY1NUMsIDB4MDI3RDQwMDAsIDB4MzJDMDYyMkQsCisweDY2MDM4RDBELCAweDA5RUQ2MDYzLCAweDI0OTEwMjdELCAweDI0MjE3NDAyLAorMHg2OTgyMDJFRCwgMHgzOTI4NjIyRCwgMHg3NDAyMjg5MiwgMHg3NTAxNzEwNCwKKzB4NjA2MzYyNUMsIDB4MDdENTMyQTIsIDB4MEVCNThGRTQsIDB4MjQ0ODY0MUMsCisweEU2ODA4OTA1LCAweDY3RjNFNUM1LCAweEJGOEY2NjZDLCAweDdGM0M2NTVDLAorMHg2RUY2NEYyNiwgMHg2Q0Y2NkRGNiwgMHg2QUY2NkJGNiwgMHgwMDBCNjlGNiwKKzB4RDExQzY4RjYsIDB4NjAxMkQyMUMsIDB4Q0IyMEU0MDUsIDB4MjEwMkU1MDAsCisweDAwMEIyMjQyLCAweDAwMDAyMjUyLCAweDAwMUUxMDE3LCAweDAwMjAzOTk2LAorMHgwMDFFMTAxNSwgMHgwMDFFMTBCRiwgMHgwMDExNzgwMCwgMHgwMDFFMTBGQywKKzB4MDAyMDA2NDQsIDB4MDAyMDM5OUMsIDB4MDAyMDJBNTYsIDB4MDAyMDNCNjQsCisweDAwMjAxOEQwLCAweDAwMjAzQjgwLCAweDAwMjAxOEMwLCAweDAwMTE3ODhDLAorMHgwMDIwMzk5OCwgMHgwMDIwMzU3QywgMHgwMDIwMTUzNCwgMHgwMDFFMjEzMCwKKzB4MDAyMDJBMTgsIDB4MDAyMDNCODgsIDB4MDAyMDM5RkMsIDB4MDAyMDNBMDQsCisweDAwMjAzREMwLCAweDAwMUMzNTAwLCAweDAwMUQ0MDA0LCAweEQ1NjREMTYzLAorMHhFNDAwRDc2NCwgMHgyMTQyRTIwRiwgMHgxNzQxMTE1NCwgMHhENTYyMjcyMiwKKzB4OTY2OUQ3NjIsIDB4MTU0MTI1NzIsIDB4OTY2NjE1NjIsIDB4RTYwMTE1NjUsCisweEQ1NUYxMTY1LCAweDY2NkNFNkY4LCAweDI1NDIyNTQyLCAweDI1NDIyNTQyLAorMHgyNTQyMjU0MiwgMHgyNTYyMjU0MiwgMHg3NjAxRTcyNywgMHg2NzYzMjU3MiwKKzB4MjU2Mjc3OTcsIDB4RTcwNDI1NzIsIDB4MjU3MkUyNDgsIDB4RTIxOTI1MjIsCisweEUyNzAyNTIyLCAweDI1NDIyNTQyLCAweDI1NDIyNTQyLCAweDI1MjIyNTQyLAorMHgyNTIyRTIwQywgMHgyNTQyMjU0MiwgMHgyNTQyMjU0MiwgMHgyNTQyMjU0MiwKKzB4MjU0MjI1NDIsIDB4MDAwQjE1NEEsIDB4RTIwODExNDUsIDB4MDAwOTQyMkIsCisweDJGRTYyRkQ2LCAweDdGRkM0RjIyLCAweEM4MjA2MDQzLCAweDZFNDM4RDAyLAorMHgwMDA5QkU4NSwgMHhDODEwNjBFMywgMHhCRTgyODkwMSwgMHg2MEUzMDAwOSwKKzB4ODkwMUM4NDAsIDB4MDAwOUJFQTQsIDB4QzgwMTYwRTMsIDB4REQzRDg5MzgsCisweEM4MDI2MEQwLCAweDJGMDA4RDAzLCAweDQ2MEJENjNCLCAweDYwRjAwMDA5LAorMHg4OTAyQzgwNCwgMHg0NjBCRDYzOSwgMHg2MkYwMDAwOSwgMHhDODgwNjAyMywKKzB4NjBEMDg5MDIsIDB4MkQwMEM5N0YsIDB4QzgwMTYwMjMsIDB4RDYzNDg5MDYsCisweDAwMDk0NjBCLCAweDAwMDlBMDA3LCAweDUxNjMwNjAxLCAweDg5MDJDODA4LAorMHg0NjBCRDYzMCwgMHg2MEYwMDAwOSwgMHg4OTAyQzgxMCwgMHg0MjBCRDIyRSwKKzB4RDUyRTAwMDksIDB4ODgwMjYwNTIsIDB4RDIyRDhCMDMsIDB4QTAwNUU2MDQsCisweDg4MDEyMjYwLCAweEQyMkE4QjAyLCAweDIyNjBFNjAxLCAweDI1MjJFMjAwLAorMHhDODgwNjBFMywgMHhEMjI3ODkyRCwgMHg2MEUzNkUyMCwgMHg4OTAyQzg4MCwKKzB4NDIwQkQyMjUsIDB4NjBFMzAwMDksIDB4ODkwMkM4NDAsIDB4NDIwQkQyMjMsCisweDYwRTMwMDA5LCAweDg5MDJDODAyLCAweDQyMEJEMjIxLCAweDYwRTMwMDA5LAorMHg4OTBEQzgwNCwgMHhERDIwRDExRiwgMHgwMDA5NDEwQiwgMHgwMDA5QkYxMSwKKzB4MDAwOUJGNEMsIDB4RDUxRUQ0MUQsIDB4MjQ3MEU3MDgsIDB4MjVEMkJGODUsCisweEM4MDg2MEUzLCAweEQyMUI4OTA1LCAweDRGMjY3RjA0LCAweDQyMkI2RUY2LAorMHg3RjA0NkRGNiwgMHg2RUY2NEYyNiwgMHg2REY2MDAwQiwgMHgwMDFDNTgxQywKKzB4QTAwMEEwMDAsIDB4MDAxRDAxMDAsIDB4MDAxRDQwMDAsIDB4MDAwNDAwMjEsCisweDAwMUM1ODlDLCAweDAwMUUxMDIxLCAweDAwMjAxQTQ2LCAweDAwMjAxQTY4LAorMHgwMDIwMjBDOCwgMHgwMDIwMUE4MCwgMHgwMDIwMUE4RSwgMHgwMDIwM0E1MCwKKzB4MDAxRTEwMEIsIDB4MDAxRTEwMjgsIDB4MDAyMDFBRkEsIDB4MDAyMDFCMDYsCisweDAwMjAxQTk2LCAweDAwMjAxQUI0LCAweDEyMzQ1Njc4LCAweDAwMUUxMDAwLAorMHgwMDEwRjEwMCwgMHgwMDIwMUFFMiwgMHg2NDRDRDZBNywgMHgwMDBCMzQ2QywKKzB4RDZBNjI0NTAsIDB4MzQ2QzY0NEMsIDB4MjQ1MDAwMEIsIDB4NjQ0Q0Q2QTQsCisweDAwMEIzNDZDLCAweDYyNUMyNDUwLCAweDQyMDg2MTZELCAweDQyMDg0MTE5LAorMHg0MjAwNjAxOSwgMHg2NzBFNjE0QywgMHhENDlFMzIxQywgMHg0MjAwMjA3RCwKKzB4MzI0Q0M5MEYsIDB4MjIwMDAwMEIsIDB4NDIwODYyNUMsIDB4NDIwMDQyMDgsCisweDMyNEM2NDRDLCAweDQyMDBENDk4LCAweDAwMEIzMjRDLCAweDJGRTYyMjYwLAorMHg2MTRDNEYxMiwgMHg0MTAwRDQ5MywgMHg2NzEwMzE0QywgMHhFMjlGNjY2RCwKKzB4MjcyOTQ2MTksIDB4NkU1MzYyNjksIDB4NjcyRTY1NzMsIDB4NDIyMTIyN0QsCisweDQyMjE0MjIxLCAweDc2MDE2NjJDLCAweEU0MDE0NjA4LCAweDM0RTg0NjA4LAorMHg2NDRDNDYwMCwgMHgwNzFBMDQ2NywgMHgyMTUwMjU3QiwgMHgwMDBCNEYxNiwKKzB4NEYyMjZFRjYsIDB4RDI4NTdGRTgsIDB4ODgwMTYwMjEsIDB4RDI4NDhCN0IsCisweDI2Njg2NjIxLCAweEQyODM4Qjc3LCAweDI2Njg2NjIxLCAweEU1MEY4QjczLAorMHhFNDAxQkZBMiwgMHhCRkE0RTUwMSwgMHhFNTg2RTQwMCwgMHhFNDAwNjU1QywKKzB4MkY1MEJGQTQsIDB4QkZBMUU0MDEsIDB4RTYwMkU1MDYsIDB4NjA2MzQ2MTgsCisweDgxRjJFNDAxLCAweDY1NDNCRjlGLCAweEU0MDE4NUYyLCAweEJGQUI2NTQzLAorMHg4NUYyNjYwMywgMHg2NTQzRTQwMSwgMHg2NjAzQkZCMSwgMHhFNDAyNjVGMCwKKzB4NjA1Mzc1NkMsIDB4ODBGOEJGODAsIDB4QkY4MkU0MDIsIDB4ODRGOEU1MTIsCisweDcwOTBFNDAyLCAweDY1MDNCRjgyLCAweDQ2MThFNjAyLCAweDgxRjY2MDYzLAorMHhCRjgwRTQwMiwgMHg4NUY2RTUwMCwgMHg2NjAzRTQwMiwgMHhFNTAwQkY4QywKKzB4RTQwMjg1RjYsIDB4QkY5MjY2MDMsIDB4RTVGRUU1MDAsIDB4RTAxMDY1NUMsCisweEJGNjFFNDAzLCAweEU1MTMwRjU0LCAweEU0MEVCRjYzLCAweDA1RkNFMDEwLAorMHhCRjYzRTQwRSwgMHhFNTAwNzU4NSwgMHhCRjY0RTQwMywgMHhFNTAwRTY0MCwKKzB4QkY3MUU0MDMsIDB4RTUwMEU2NDAsIDB4QkY3OEU0MDMsIDB4RTVGRkU2NDAsCisweEUwMTQ2NTVDLCAweEJGNDdFNDA0LCAweEU0MEYwRjU0LCAweEU1MDRCRjQ5LAorMHgwNUZDRTAxNCwgMHhCRjQ5RTQwRiwgMHhFNTAxNzU4NCwgMHhCRjRBRTY0MCwKKzB4RTUwMUU0MDQsIDB4QkY1N0U2NDAsIDB4RTUwMUU0MDQsIDB4RTQwNEU2NDAsCisweEFGNUM3RjE4LCAweDdGMTg0RjI2LCAweDAwMEI0RjI2LCAweDRGMjIwMDA5LAorMHhEMjQyN0ZGMCwgMHg4ODAxNjAyMSwgMHhEMjQxOEI3MSwgMHgyNjY4NjYyMSwKKzB4RDI0MDhCNkQsIDB4MjY2ODY2MjEsIDB4RTUwRjhCNjksIDB4RTQwMUJGMUMsCisweEJGMUVFNTAxLCAweEU1ODZFNDAwLCAweEU0MDA2NTVDLCAweDJGNTBCRjFFLAorMHhCRjFCRTQwMSwgMHhFNDAxRTUwNiwgMHhCRjFDNjU0MywgMHhFNDAxRTY0MCwKKzB4QkYyOTY1NDMsIDB4RTQwMUU2NDAsIDB4QkYzMDY1NDMsIDB4NjVGMEU2NDAsCisweDc1NkNFNDAyLCAweEJFRkY2MDUzLCAweEU0MDI4MEY0LCAweEU1MTJCRjAxLAorMHhFNDAyODRGNCwgMHhCRjAxNzA5MCwgMHhFNjQwNjUwMywgMHhCRjAyRTQwMiwKKzB4RTY0MEU1MDAsIDB4QkYwRkU0MDIsIDB4RTY0MEU1MDAsIDB4QkYxNkU0MDIsCisweEU1RkVFNTAwLCAweDYwNTM2NTVDLCAweEJFRTVFNDAzLCAweEU1MTM4MEY4LAorMHhFNDBFQkVFNywgMHhFNDBFODRGOCwgMHhCRUU3NzA4NSwgMHhFNTAwNjUwMywKKzB4QkVFOEU2NDAsIDB4RTUwMEU0MDMsIDB4QkVGNUU2NDAsIDB4RTUwMEU0MDMsCisweEJFRkNFNjQwLCAweEU1RkZFNDAzLCAweDYwNTM2NTVDLCAweEJFQ0JFNDA0LAorMHhFNDBGODBGQywgMHhFNTA0QkVDRCwgMHhFNDBGODRGQywgMHhCRUNENzA4MywKKzB4RTUwMTY1MDMsIDB4QkVDRUU2NDAsIDB4RTUwMUU0MDQsIDB4QkVEQkU2NDAsCisweEU1MDFFNDA0LCAweEU0MDRFNjQwLCAweEFFRTA3RjEwLCAweDdGMTA0RjI2LAorMHgwMDBCNEYyNiwgMHgwMDAwMDAwOSwgMHgwMDFFMTAyRiwgMHgwMDFFMTA4MCwKKzB4MDAxRTEwOTAsIDB4MDAxRTEwM0YsIDB4MDAxRTEwM0UsIDB4MDAyMDNBNEEsCisweDAwMjAzQTRDLCAweDAwMjAzQTRFLCAweEQyMUREMTFDLCAweDY2MjA2MDEwLAorMHg2NzZDNzAwMSwgMHgzNzAwQzkwRiwgMHhFNTAwOEQxMywgMHg2NzEwNjIxMCwKKzB4NzcwMTYyMkMsIDB4NjQyMzIxNzAsIDB4RDYxNjYwMTAsIDB4NDQwODQ0MDgsCisweDM0MjhDOTBGLCAweDYyNjAyMTAwLCAweDcyMDFENTEzLCAweDQ0MDgyNjIwLAorMHgwMDBCMzU0QywgMHhEMTBGNjA1MywgMHgyNTU4NjUxMCwgMHhFNjAwOEQxMywKKzB4RDYwREQ0MEIsIDB4NjU1QzY1NDAsIDB4NDcwODY3NTMsIDB4Mzc1ODQ3MDgsCisweDQ3MDg2NTQwLCAweDI0NTA3NTAxLCAweDM2N0M2MDQwLCAweDI0MDBDOTBGLAorMHg3MkZGNjIxMCwgMHgwMDBCMjEyMCwgMHgwMDAwNjA2MywgMHgwMDIwMzk5NSwKKzB4MDAyMDM5OTQsIDB4MDAyMDM5OTYsIDB4MDAyMDM1QkMsIDB4N0ZGQzRGMjIsCisweEU2ODBEMUE4LCAweDY2NkM2MjEyLCAweEQyQTcyRjIyLCAweDY3RjM2NTYzLAorMHg0MjBCNzU0MiwgMHg3RjA0RTQwNCwgMHgwMDBCNEYyNiwgMHhFNjgwMDAwOSwKKzB4RDJBMTY2NkMsIDB4RTcwMDY1NjMsIDB4NDIyQjc1NDAsIDB4RTY4MDY0NzMsCisweEQyOUQ2NjZDLCAweEU3MDA2NTYzLCAweDQyMkI3NTQzLCAweDJGODY2NDczLAorMHgyRkE2MkY5NiwgMHgyRkM2MkZCNiwgMHgyRkU2MkZENiwgMHg3RkMwNEYyMiwKKzB4REI5N0QyOTYsIDB4NzIwMTJGMjIsIDB4RDE5NjFGMjEsIDB4NjYxMjUyMTEsCisweDhCMDEzNjIwLCAweDAwMDlBMEY5LCAweEM5MDM2MDYxLCAweDhCMDE4ODAxLAorMHgwMDA5QTBGMywgMHhEMjkwREM4RiwgMHg2NEMzNDIwQiwgMHg2NTAzRDE4RiwKKzB4NjAxMTFGMDIsIDB4OEIwNDg4MDEsIDB4NDIwQkQyOEQsIDB4QUZFNDY0QzMsCisweDU0NTMwMDA5LCAweDg0NENFRTg0LCAweDg5MDEzMEUwLCAweDAwMDlBMEMzLAorMHg2NjEwRDE4OCwgMHg2MDIzNjI2QywgMHg4QjcxODgwMSwgMHg2MjEwRDE4NiwKKzB4ODk2NjIyMjgsIDB4REE4NkQyODUsIDB4RTAwMzYxMjIsIDB4NjQyMjExMTIsCisweDQwMThEODgxLCAweEREODNFNTAwLCAweDgxNDE2N0EzLCAweDc3MDQyODUwLAorMHg2NDcyNjZBMiwgMHg2RUQzRDU4MCwgMHgxRjQ1N0UwNCwgMHg2NTUyMUY1NiwKKzB4NjRFMzY4RDIsIDB4MUY4ODc0RjgsIDB4Njg0MzY5RTIsIDB4MUY2Mzc4OTQsCisweDFGOTkxRjc0LCAweDYyODI2MTQyLCAweEQ3NzlEOTc4LCAweDFGMkJENjc5LAorMHg2NzcyNjI5MiwgMHgxRjFBNjA2MiwgMHgyNjAyQ0IyMCwgMHhEMTc2RTYwMCwKKzB4RTU0MDFGNTcsIDB4MUY3RDFGMkMsIDB4NzYwMTFGMUUsIDB4MzI1MzYyNkQsCisweDUxRjM4QkZCLCAweDUyRjU1NUY0LCAweDI1MjIyQTEyLCAweDU1Rjc1N0Y2LAorMHgyNzUyNUFGOCwgMHg1REY5MkRBMiwgMHgyRUQyNTFGQiwgMHhENTZCNUVGQSwKKzB4NTRGQzI0RTIsIDB4MjgxMjU3RkQsIDB4RDE2MEQ4NjksIDB4MjU3MjI5NDIsCisweDY5MTI2NzgyLCAweDE5NzREODY2LCAweERENjY2QTEyLCAweDU2RkU2MEExLAorMHgyQTAxQ0IwMSwgMHhEQTY0NjQxMiwgMHhFOTAxMjg0MiwgMHg0QTBCMkQ0MiwKKzB4NTJGRTI2OTIsIDB4RDY2MUVFMDEsIDB4MjJFMjRFMTgsIDB4NzIwMTYyNjIsCisweDYwQjIyNjIyLCAweENCMDFEMTRGLCAweDJCMDJFMjAyLCAweDIxMjBBMDNGLAorMHg4QjNDMjIyOCwgMHhFNjAxRDU1QSwgMHgyMTYwRTcwMCwgMHhFMDFDMjU3MiwKKzB4QzgwMTAwNEMsIDB4RDg1NzhCMEMsIDB4MUY4RkQyNTcsIDB4RTYwMDI4MjIsCisweDc2MDFFNTdELCAweDMyNTM2MjZDLCAweDU2RkY4QkZCLCAweDI2MjJEMjUzLAorMHhFMkZFNjlCMiwgMHgyQjkyMjkyOSwgMHgwQTRDRTAxRSwgMHhFMDFGNjVGMiwKKzB4MDE0QzI1QTAsIDB4NzQxMDU3RjEsIDB4RUEwNjI3MTAsIDB4REQ0Q0U2MDAsCisweDg0NDZERTRDLCAweDJEMDA3NjAxLCAweDY5NkM2ODQ0LCAweDJFODAzOUEzLAorMHg4RkY2N0UwMSwgMHhERTQ4N0QwMSwgMHgyRUEwRUE5NCwgMHhFMTAwN0UwMSwKKzB4N0UwRjJFMTAsIDB4RDEyRkUyMDUsIDB4NjQxMDJFMjAsIDB4NjAyMzYyNEMsCisweDg5MDg4ODAxLCAweDU1RjJEMjJBLCAweDY0QzM0MjBCLCAweEVFMDFEMTMyLAorMHhBRjFBNEUxOCwgMHg1NUYyMjFFMiwgMHg4NTUzRDEzQywgMHg2MjBENjYxMiwKKzB4ODkwNjMyNjIsIDB4RDYzQkQ0M0EsIDB4RTgwMTQ2MEIsIDB4QUYwQ0Q3M0EsCisweEQ5MUYyNzgyLCAweDY0QzM0OTBCLCAweEVFMDFEMTI3LCAweERBMzhENDM3LAorMHg0QTBCNEUxOCwgMHhBRjAwMjFFMiwgMHg3RjQwMDAwOSwgMHg2RUY2NEYyNiwKKzB4NkNGNjZERjYsIDB4NkFGNjZCRjYsIDB4MDAwQjY5RjYsIDB4NEYyMjY4RjYsCisweDg1NDY3RkY0LCAweDJGMDFFNjgxLCAweDY2NkM4NTQ3LCAweDg1NDg4MUYxLAorMHg4MUYyRDIwOSwgMHg2N0YzODU0MiwgMHg4NTQzODFGMywgMHg4MUY0RTQwQywKKzB4NjU2MzYwNTMsIDB4NDIwQjgxRjUsIDB4N0YwQzc1NDAsIDB4MDAwQjRGMjYsCisweDAwMDAwMDA5LCAweDAwMUMzRDlDLCAweDAwMjAyM0ZDLCAweDAwMTE3NzlBLAorMHgwMDFDMzZGOCwgMHgwMDIwMzVCNCwgMHgwMDIwMTRBNiwgMHgwMDIwM0ExNiwKKzB4MDAyMDE0RDAsIDB4MDAyMDM5QTUsIDB4MDAyMDM5QTQsIDB4MDAyMDM5QTAsCisweDAwMUMzQjlDLCAweDAwMUMzNzA0LCAweDAwMUMzRDk4LCAweDAwMUMzQkI0LAorMHgwMDFDNTk2MCwgMHgwMDFDMzUwMCwgMHgwMDFDM0QzMCwgMHgwMDFDODk2MCwKKzB4MDAyMDM1OEMsIDB4MDAxQzNEMDAsIDB4MDAyMDE2MTAsIDB4MDAxMTc3MzAsCisweDAwMjAzOUE4LCAweDAwMUM1ODJDLCAweDIwMDBBMDAwLCAweDAwMDBBMDAwLAorMHgwMDExNzc4QywgMHgwMDExNzc5MiwgMHgwMDExNzc4OCwgMHgwMDIwMzk3QywKKzB4MDAyMDM1N0MsIDB4MDAyMDE1MzQsIDB4MDAxRTIxMzAsIDB4MDAyMDNEQTAsCisweDAwMjAxOEMwLCAweDJGOTYyRjg2LCAweDJGQjYyRkE2LCAweDJGRDYyRkM2LAorMHg0RjIyMkZFNiwgMHhEMTlCN0ZFQywgMHgyRjEyRTAwMCwgMHg2MTAzRDQ5QSwKKzB4MUY0MjgxRjIsIDB4REQ5QURBOTksIDB4RDY5QTY4MTMsIDB4RTAwMTQ4MDgsCisweDQ2MEJERTk5LCAweDM4RUM0ODAwLCAweDY1QTIxRjAzLCAweDM1MjA1MkExLAorMHhBMjNFOEIwMSwgMHg2MDUxMDAwOSwgMHg4ODAxQzkwMywgMHhBMjM4OEIwMSwKKzB4NTI1MzAwMDksIDB4MzJFMERFOTEsIDB4RDk5MThCMTAsIDB4NjRBMzQ5MEIsCisweDRCMEJEQjkwLCAweERFOTA2NDAzLCAweEQ3OTFENjkwLCAweEVDMDFENTkxLAorMHgyRTAyRTEwMCwgMHgyNzEwMjZDMCwgMHgyNTAyQUZERiwgMHhDODAxODU1MSwKKzB4QTE1NzhCMDEsIDB4NjI1MTAwMDksIDB4NDIwMDYyMkQsIDB4NUU1MzM2NkEsCisweDg1RTIyMjZELCAweEM5MDM2NDJDLCAweDg1RTM2NjAzLCAweDYwNTM2NTBELAorMHg0MDIxNDAyMSwgMHg0NTAwQzkzRiwgMHgzMjJBNjcwMywgMHg2MDUzMjUyRCwKKzB4QzkwMUQxN0YsIDB4NjAxMDZDMDMsIDB4ODgwMUQ5N0YsIDB4REI3RjhCMDUsCisweDIxMjBFMjAwLCAweENCMDE2MEIyLCAweEQxN0QyQjAyLCAweDg4MDE2MDExLAorMHg2NUEyOEIwQSwgMHg4RDA0MjQ0OCwgMHg5QjlFNjI1MSwgMHhBMDAzMjJCOSwKKzB4OTE5QjI1MjEsIDB4MjUyMTIyMUIsIDB4MzdCM0VCMTAsIDB4MjQ0ODg5NUUsCisweEQ0NzM4QjA3LCAweDIyMjg2MjQxLCAweDYwNjM4OTAzLCAweEEwNTc4MUY4LAorMHhENTcwNjQ3MywgMHg0NjA4NDYwOCwgMHg4NUUyNjI3MywgMHg0NjAwNkI1MCwKKzB4MzYyQzQyMDAsIDB4MkJCOEM5MTAsIDB4OEYxRjY0NjMsIDB4MjY2ODY2MDMsCisweEQyNjk4OTExLCAweDA2MkQ2MDQzLCAweDQxMTk2MTZELCAweDZCMEU2MDE5LAorMHg4MUY4MjBCRCwgMHg4ODAxNjBDMywgMHg2NDZDOEYyQywgMHg4ODBGNjA3MywKKzB4QTAyNzhCMUIsIDB4RDI2MTAwMDksIDB4MDUyRDYwNDMsIDB4NDExOTYxNUQsCisweDY3MEU2MDE5LCAweDY0NUMyMDdELCAweDgxRjhBMDFDLCAweDg5MEYyNjY4LAorMHg2MDQzRDI1QiwgMHg2QjVEMDUyRCwgMHg2MEI5NEIxOSwgMHgyMDFENjEwRSwKKzB4NjBDMzgxRjgsIDB4OEYwRDg4MDEsIDB4NjQ3MzY0NUMsIDB4RUMwMEEwMEEsCisweDYwNDNEMjU0LCAweDYyNUQwNTJELCAweDYwMjk0MjE5LCAweDIwN0Q2NzBFLAorMHg4MUY4NjQ1QywgMHg4ODAyODVGOCwgMHg4NUUxODkwQSwgMHg4RDA3QzgyMCwKKzB4RTZEQzYyMDMsIDB4NjAyMzIyNjksIDB4ODFFMUEwMDIsIDB4NjQ0Q0U0RkYsCisweDYyMTBEMTQ5LCAweDg5MDEyMjI4LCAweDY0NENFNEZGLCAweDY1NERFQkZGLAorMHgzNUIwNkJCQywgMHhEQjM2OEIyQiwgMHg2NEEzNEIwQiwgMHg0MTBCRDEzNSwKKzB4NTQwMzY0MDMsIDB4ODU0NDZFMDMsIDB4Qzk0OERCNDAsIDB4REM0MDg4MDgsCisweEJFQUM4QjAxLCAweDY0QjNFNTAyLCAweDY1RTM0QzBCLCAweERCM0RFQzAxLAorMHhEMTNEMkRDMiwgMHg2MjEyNjBCMiwgMHg3MjAxNzAwMSwgMHgyMTIyODgwNSwKKzB4MkIwMjhGMDgsIDB4NjY2Q0U2ODAsIDB4NjU2M0QyMzgsIDB4NzU0OUU3MDAsCisweDY0NzM0MjBCLCAweEEwMzBENDM2LCAweDdGRkYwMDA5LCAweDg1RTI4MDAwLAorMHgyMEI5RUJGQywgMHg2MTAzODFFMiwgMHg5NDJBODVFMywgMHg2MjAzMjA0OSwKKzB4NDUwODg1RjgsIDB4ODFFMjIwMUIsIDB4QzkwMTYwQzMsIDB4NDAwODQwMTgsCisweDQwMDg0MDA4LCAweDQwMDAyMjVCLCAweDYwMjMyMjBCLCAweDg1RTQ4MUUzLAorMHg0MTE4RTEwOCwgMHg4MUU0MjAxQiwgMHhFNDAyNjJBMiwgMHgyMEI5ODUyMSwKKzB4NjdBMjgxMjEsIDB4Q0IwMTYwNzEsIDB4ODVGODI3MDEsIDB4ODkwMzMwNDIsCisweEVDRTc4NUUyLCAweDgxRTIyMEM5LCAweDQ5MEJENDFFLCAweEEwM0IwMDA5LAorMHg3RTAzMDAwOSwgMHgwMDFDM0QzMCwgMHgwMDIwM0RBQywgMHgwMDIwMzU4QywKKzB4MDAxRTIxMkMsIDB4MDAyMDM0NzAsIDB4MDAxQzNEMDAsIDB4MDAxMTc3ODAsCisweDAwMjAxNEE2LCAweDAwMjAxNjcwLCAweDAwMTE3NzBDLCAweDAwMjAzOUE0LAorMHgwMDIwMzlBNSwgMHgwMDIwMzlBMCwgMHgwMDIwMThDMCwgMHgwMDFDMzZGOCwKKzB4MDAyMDNBMUEsIDB4MDAyMDNEQkMsIDB4MDAyMDNCQTAsIDB4MDAyMDNDMjAsCisweDAwMjAzQ0EwLCAweDAwMjAzRDIwLCAweDAwMjAzOTkwLCAweDAwMjAzNTg0LAorMHgwMDIwMTREMCwgMHgwMDIwM0ExQywgMHgwMDIwM0EyMCwgMHgwMDIwMjNGQywKKzB4MDAyMDNEQTQsIDB4MDAyMDNEQTgsIDB4NjAyMjYyRjIsIDB4NDAwOTQwMTksCisweEM5MEY0MDA5LCAweDhCMEI4ODBBLCAweDYwRTJERThDLCAweDQwMDk0MDE5LAorMHhDOTBGNDAwOSwgMHg4QjAzODgwOCwgMHhDQjAxNjBBMiwgMHgyODAyQTAwNiwKKzB4NjVFMkRFODcsIDB4MkU1Mjc1MDEsIDB4Mjg2MjY2QTIsIDB4NTJGMzY2RjIsCisweDI2MjJBRTgzLCAweEQyODM4NTUxLCAweERFODNDODAyLCAweEEwOTU4QjAxLAorMHg0MjBCMDAwOSwgMHg0RTBCNjRBMywgMHg1RTAzNjQwMywgMHg4NUU0NjUwMywKKzB4NDkxOEU5MDgsIDB4RDc3RDIwOUIsIDB4RTA0QzgxRTQsIDB4REM3QzBCN0UsCisweDdCMDFEOTdDLCAweDYxQzIwN0I2LCAweDcxMDE2NjkwLCAweDhEMDYyNjY4LAorMHhENDc5MkMxMiwgMHg0MjBCRDI3OSwgMHhBMDcwRUIwMSwgMHg2MjUxMkRCMiwKKzB4NEIxOEVCMEYsIDB4MjJCOUUxMDIsIDB4MzIxMDQxMTgsIDB4ODU1MThCMEYsCisweDIwMjlFMkZDLCAweDYwNTE4MTUxLCAweENCMDE3MkUwLCAweDg1RTEyNTAxLAorMHgyMDI5OTRBMywgMHg4NUU0ODFFMSwgMHhBMDUyMjA0OSwgMHg2NzUxODFFNCwKKzB4NDcxOTY3N0QsIDB4NjY3RTY3NzksIDB4NzcwMTI3NkQsIDB4NjkwMzYwN0MsCisweDg4MDE0OTE4LCAweDI1OTE4RjNFLCAweDZCMTJEMTYxLCAweDIxQjI3QjAxLAorMHg2NjBEODVFMywgMHg0MDIxNjA2MywgMHhDOTNGNDAyMSwgMHg2QzAzNDYwMCwKKzB4MjYyRDMyMkEsIDB4QzgwMTYwNjMsIDB4REI1RUQxNUQsIDB4OTY3RDg5MDEsCisweEU2MDAyQzZCLCAweDY2NkM2N0NELCAweDQwMDA2MDYzLCAweDYyMkQwMjFELAorMHg4RDBFMzI3MCwgMHg2MDQzNjQwMywgMHhFOUZGMDIxRCwgMHg4QjAxMzI5MCwKKzB4MDFDNUEwMDcsIDB4NjI2Qzc2MDEsIDB4MzI5MkU5MDQsIDB4NjQ2QzhCRUIsCisweDYwNDM0NDAwLCAweEQxNTAwNEJELCAweDBCNDU3NDAxLCAweDY2OUQ2OTExLAorMHg4OTA3MzY3MCwgMHg2MDJENjIxMSwgMHg4OTAzODhGRiwgMHhFMjAxREI0QiwKKzB4MkIyMDIxQzEsIDB4RUNGQzg1NTEsIDB4ODE1MTIwQzksIDB4Q0IwMTYwNTEsCisweERDNDcyNTAxLCAweDY0QTM0QzBCLCAweDUxRjM2NkYyLCAweDg1RUYyNjEyLAorMHg1NEYyRDI0NCwgMHg2NTBENDIwQiwgMHgwMDA5QURFNywgMHhFNTAwREM0MiwKKzB4NDIwQjJDNTIsIDB4NEUwQjY0QTMsIDB4NTQwMzY0MDMsIDB4ODU0NDZFMDMsCisweDY3MDNFOTA4LCAweDY1MDM0OTE4LCAweDI3OTk4NTQxLCAweERCMzIzNzkwLAorMHg4RjBCRDkzMiwgMHg2MDEzNjEwRCwgMHg4QjA3QzgyMCwgMHhDOTQ4NjA1MywKKzB4OEIwMzg4MDgsIDB4RTUwMUJENEIsIDB4MDAwOUEwMDUsIDB4MjEyOEQyMzMsCisweEJENDQ4OTAxLCAweDY0QjNFNTAwLCAweDQ5MEI2NUUzLCAweEFEQkNFQzAxLAorMHg4NUYyMkRDMiwgMHg3MDAxRUUwNCwgMHgzMUU3NjEwRCwgMHg4RDAyODFGMiwKKzB4QURBOTdBMDgsIDB4N0YxNDAwMDksIDB4NkVGNjRGMjYsIDB4NkNGNjZERjYsCisweDZBRjY2QkY2LCAweDAwMEI2OUY2LCAweEY3RkY2OEY2LCAweDJGRTY4MDAwLAorMHhEMjIzNEYyMiwgMHg2MEUzNkUyMiwgMHg4RDAyQzg0MCwgMHhCQkU1MjJFMiwKKzB4RTI0MDAwMDksIDB4MkUyODQyMTgsIDB4QkJGMDg5MDEsIDB4NjBFMzAwMDksCisweDg5MDVDODEwLCAweEQyMUNENDFCLCAweDAwMDk0MjBCLCAweDAwMDlCQkVGLAorMHhDODA1NjBFMywgMHhCRDZEODkwMSwgMHg2MEUzMDAwOSwgMHg4OTAyQzgwMiwKKzB4QUJFQzRGMjYsIDB4NEYyNjZFRjYsIDB4NkVGNjAwMEIsIDB4MDAxQzNEM0MsCisweDAwMTE3NzYwLCAweDAwMjAxNEE2LCAweDAwMjAxNjcwLCAweDAwMjAzNTFDLAorMHgwMDIwM0RDMCwgMHgwMDIwMzk5MCwgMHgwMDIwMzU4NCwgMHgwMDIwMTREMCwKKzB4MDAyMDM5RkMsIDB4MDAyMDNBMDQsIDB4MDAyMDM5RjgsIDB4MDAyMDM5RkEsCisweDAwMjAxNTM0LCAweDAwMjAxOEQwLCAweDAwMjAzQTFDLCAweDAwMDA4MDAwLAorMHgwMDFDMzUxMCwgMHgwMDIwM0RCNCwgMHgwMDIwMThDMCwgMHg4OTAxNEYyMiwKKzB4NjExQjYwMEIsIDB4NjExQkIwMEEsIDB4MDAwQjRGMjYsIDB4NjAwQjYwMEIsCisweDYxMUJBMDA0LCAweDhERjEyMTA3LCAweDhCRjg0MDExLCAweDYyMEQyRjI2LAorMHg4RjNFMzAyMCwgMHg0MDE4MDAxOSwgMHg4QjBCMzAxNiwgMHgzMTA0MzEwNCwKKzB4MzEwNDMxMDQsIDB4MzEwNDMxMDQsIDB4MzEwNDMxMDQsIDB4NDEyNDYyRjYsCisweDYwMUMwMDBCLCAweDQxMjk2MjE5LCAweDIwMDg0MDE4LCAweDMxMDQ4OTI2LAorMHgzMTA0MzEwNCwgMHgzMTA0MzEwNCwgMHgzMTA0MzEwNCwgMHgzMTA0MzEwNCwKKzB4MzEwNDMxMDQsIDB4MzEwNDMxMDQsIDB4MzEwNDMxMDQsIDB4NjExOTMxMDQsCisweDMyMDQyMjFELCAweDMyMDQzMjA0LCAweDMyMDQzMjA0LCAweDMyMDQzMjA0LAorMHgzMjA0MzIwNCwgMHgzMjA0MzIwNCwgMHgzMjA0MzIwNCwgMHgzMjA0MzIwNCwKKzB4MjEyRDMyMDQsIDB4NjAxOTYyRjYsIDB4NDAyNDAwMEIsIDB4MDAwQkUwMDAsCisweDYyMTM2MkY2LCAweDQxMjk0MjI4LCAweDMxMDQ0MjI0LCAweDMxMDQ0MjI0LAorMHgzMTA0NDIyNCwgMHgzMTA0NDIyNCwgMHgzMTA0NDIyNCwgMHgzMTA0NDIyNCwKKzB4MzEwNDQyMjQsIDB4MzEwNDQyMjQsIDB4MzEwNDQyMjQsIDB4MzEwNDQyMjQsCisweDMxMDQ0MjI0LCAweDMxMDQ0MjI0LCAweDMxMDQ0MjI0LCAweDMxMDQ0MjI0LAorMHgzMTA0NDIyNCwgMHgzMTA0NDIyNCwgMHg2MDJENDIyNCwgMHg2MkY2MDAwQiwKKzB4MDgwQTBDMEUsIDB4MDAwMjA0MDYsIDB4MUExQzFFMjAsIDB4MTIxNDE2MTgsCisweDJFMzAzMjM0LCAweDI2MjgyQTJDLCAweDNBM0MzRTQwLCAweDZDNjI1NjQ4LAorMHg0MTExMkYyNiwgMHhFMjIwOEYxOCwgMHg4OTBCMzEyMywgMHgzMjFDRDIwNCwKKzB4RDEwMjYyMjAsIDB4NDEyQjMxMkMsIDB4MDAwOTAwMDksIDB4MDAyMDM0OUEsCisweDAwMjAzNDUwLCAweDAwMEJFMDAwLCAweDQwMDA2MkY2LCAweDQwMDA0MDAwLAorMHg0MDAwNDAwMCwgMHg0MDAwNDAwMCwgMHg2MkY2MDAwQiwgMHg0MDAwNDAwMCwKKzB4NDAwMDQwMDAsIDB4NDAwMDQwMDAsIDB4NDAxODQwMDAsIDB4NjJGNjAwMEIsCisweDQwMDA0MDAwLCAweDQwMDA0MDAwLCAweDQwMDA0MDAwLCAweDQwMjg0MDAwLAorMHg2MkY2MDAwQiwgMHg0MDAwNDAwMCwgMHg0MDE4NDAwMCwgMHgwMDBCNDAyOCwKKzB4QzkwRjYyRjYsIDB4NDAwNTQwMDUsIDB4NDAwNTQwMDUsIDB4NjJGNjAwMEIsCisweDQwMDVDOTA3LCAweDQwMDU0MDA1LCAweDYyRjYwMDBCLCAweDQwMDVDOTAzLAorMHgwMDBCNDAwNSwgMHhDOTAxNjJGNiwgMHgwMDBCNDAwNSwgMHgwMDAwNjJGNiwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHg0MjcwNzM3MiwKKzB4M0QyMDY2NzUsIDB4NTU0RTIwM0QsIDB4MjAyQzRDNEMsIDB4NkU0OTY3N0EsCisweDRFNDk3Mjc0LCAweDZENzU0RTUxLCAweDAwMDAwMDNELCAweDYxNzY2RTQ5LAorMHgyMDY0Njk2QywgMHg3MjY1NzM3NSwgMHgyMDcyNkYyMCwgMHgyMDc5NjU2QiwKKzB4MDAyMTQ0NDksIDB4NkU2QjZFNTUsIDB4MjA2RTc3NkYsIDB4NkQ2RDZGNjMsCisweDNENjQ2RTYxLCAweDAwMDAwMDAwLCAweDIwM0EzMDUxLCAweDAwMDAwMDIwLAorMHgyMDNBMzE1MSwgMHgwMDAwMDAyMCwgMHgyMDNBMzI1MSwgMHgwMDAwMDAyMCwKKzB4MjAzQTMzNTEsIDB4MDAwMDAwMjAsIDB4MjAzQTM0NTEsIDB4MDAwMDAwMjAsCisweDJCNDM0NzQxLCAweDczNjk2RjRFLCAweDYxNDMyMDY1LCAweDcyNjI2OTZDLAorMHg2RjY5NzQ2MSwgMHg2MTY2MjA2RSwgMHg2RjIwNkM2OSwgMHg2OTc0MjA2RSwKKzB4MEQwQTY1NkQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwNzIsIDB4MDAyMDUyMjAsCisweDYyNzM1NTc2LCAweDc0NzM3MjVGLCAweDAwMDAwQTBELCAweDYyNzM1NTc2LAorMHg3Mzc1NzM1RiwgMHg2NDZFNjU3MCwgMHgwMDAwMEEwRCwgMHg2MjczNTU3NiwKKzB4NzM2NTcyNUYsIDB4MDAwQTBENkQsIDB4MDAwMDAwNDQsIDB4NDQzODc1NzAsCisweDcyNjM3MzY1LCAweDZGNzQ3MDY5LCAweDNENTg0NTcyLCAweDAwMDAwMDAwLAorMHgwMDAwMDA0NywgMHg3Mjc0NkU0OSwgMHg2RDY1MjA1MSwgMHgyQzc5NzQ3MCwKKzB4NDk2NzdBMjAsIDB4NDk3Mjc0NkUsIDB4NzU0RTUxNEUsIDB4MDAwMDNENkQsCisweDY1NEM3MjQ1LCAweDAwMDAwMDZFLCAweDIwNzQ2RjRFLCAweDc1NkY2RTY1LAorMHg0OTIwNjg2NywgMHg0MjIwNTE0RSwgMHgwQTBENjY3NSwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwRkYsIDB4MDAwMjAwMDEsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDEwRTAxMEQsIDB4MDAwMjAwMDMsIDB4MDEwOTAxMDgsIDB4MDAwMjAxMEEsCisweDAyMDAwMDAzLCAweDAyMDIwMjAxLCAweDAyMDQwMjAzLCAweDAyMDYwMjA1LAorMHgwMjAyMDIwMCwgMHgwMjA0MDIwMywgMHgwMjBDMDIwQiwgMHgwMjBFMDIwRCwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMDAwMDBGRiwgMHgwMDAyMDAwMSwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMTBFMDEwRCwgMHgwMDAyMDAwMywgMHgwMTA5MDEwOCwgMHgwMDAyMDEwQSwKKzB4MDAwMzAwMDMsIDB4MDIwMjAyMDEsIDB4MDIwNDAyMDMsIDB4MDIwNjAyMDUsCisweDAyMDIwMjAwLCAweDAyMDQwMjAzLCAweDAyMEMwMjBCLCAweDAyMEUwMjBELAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAxMEUwMTBELCAweDAwRkYwMTBGLCAweDAxMDkwMTA4LCAweDAxMEIwMTBBLAorMHgwMjAwMDEwRiwgMHgwMjAyMDIwMSwgMHgwMjA0MDIwMywgMHgwMjA2MDIwNSwKKzB4MDIwMjAyMDAsIDB4MDIwNDAyMDMsIDB4MDIwQzAyMEIsIDB4MDIwRTAyMEQsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDEwRTAxMEQsIDB4MDBGRjAxMEYsIDB4MDEwOTAxMDgsIDB4MDEwQjAxMEEsCisweDAxMEYwMTBGLCAweDAyMDIwMjAxLCAweDAyMDQwMjAzLCAweDAyMDYwMjA1LAorMHgwMjAyMDIwMCwgMHgwMjA0MDIwMywgMHgwMjBDMDIwQiwgMHgwMjBFMDIwRCwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMDIwNTIyMCwgMHgwMDAwMDA0NiwgMHgwMDAwMDA1OSwgMHg3MzIwNDE0MiwKKzB4MDAzRDcxNjUsIDB4NDk1NDQxMjAsIDB4MDAwMDIwNEQsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMkUwMjA5LCAweDgwMDAwMTAxLCAweDAwMDQwOUZBLAorMHgwMEZGMDQwMCwgMHgwNTA3MDAwMCwgMHgwMjAwMDIwMSwgMHg4MjA1MDcwMCwKKzB4MDAwMjAwMDIsIDB4MDM4MzA1MDcsIDB4MDcwMTAwNDAsIDB4NDAwMzA0MDUsCisweDAyMDkwMTAwLCAweDAxMDEwMDJFLCAweDA5RkE4MDAwLCAweDA0MDAwMDA0LAorMHgwMDAwMDBGRiwgMHgwMjAxMDUwNywgMHgwNzAwMDA0MCwgMHg0MDAyODIwNSwKKzB4MDUwNzAwMDAsIDB4MDA0MDAzODMsIDB4MDQwNTA3MDEsIDB4MDAwMDQwMDIsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDA3MDkwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHg2NjIxRDJBOCwgMHgyMDA4NjA2RCwgMHhBMUIxOEIwMSwgMHg4ODEwMDAwOSwKKzB4ODgxMTg5MjIsIDB4ODgxMjg5MjAsIDB4ODgxMzg5MUUsIDB4ODgyMTg5MUMsCisweDg4MjI4OTFBLCAweDg4M0E4OTE4LCAweDg4M0I4OTE2LCAweEU2NDQ4OTE0LAorMHgzMDYwNDYwOCwgMHhFNjQ4ODkxMCwgMHgzMDYwNDYwOCwgMHhFNjU4ODkwQywKKzB4MzA2MDQ2MDgsIDB4OTYzRDg5MDgsIDB4ODkwNTMwNjAsIDB4MzA2MDk2M0IsCisweDk2Mzk4OTAyLCAweDhCMDEzMDYwLCAweEUwMTAwMDBCLCAweDhCMDE4ODIwLAorMHhFMDIwMDAwQiwgMHg4OTJCODgzNywgMHg4OTI5ODgzMiwgMHg4OTI3ODgzNSwKKzB4ODkyNTg4MzYsIDB4ODkyMzg4MzAsIDB4ODkyMTg4MzgsIDB4ODkxRjg4MzksCisweDg5MUQ4ODM0LCAweDg5MUI4ODMzLCAweDQ2MDhFNjRDLCAweDg5MTczMDYwLAorMHgzMDYwOTYxQiwgMHg5NjE5ODkxNCwgMHg4OTExMzA2MCwgMHgzMDYwOTYxNywKKzB4OTYxNTg5MEUsIDB4ODkwQjMwNjAsIDB4MzA2MDk2MTMsIDB4OTYxMTg5MDgsCisweDg5MDUzMDYwLCAweDMwNjA5NjBGLCAweDk2MEQ4OTAyLCAweDhCMEMzMDYwLAorMHhFMDMwMDAwQiwgMHgwNTEwMDE2NSwgMHgwMjMwMEExMCwgMHgwNDMwMDMzMCwKKzB4MDYzMDA1MzAsIDB4MEIzMDBBMzAsIDB4ODg0MDBDMzAsIDB4QTE0MjhCMDEsCisweDg4NDEwMDA5LCAweEExM0U4QjAxLCAweDg4NDMwMDA5LCAweEExM0E4QjAxLAorMHg4ODQ4MDAwOSwgMHhBMTM2OEIwMSwgMHg4ODRBMDAwOSwgMHhBMTMyOEIwMSwKKzB4ODg0QjAwMDksIDB4QTEyRThCMDEsIDB4ODg0QzAwMDksIDB4QTEyQThCMDEsCisweEU2ODAwMDA5LCAweDMwNjA2NjZDLCAweEExMjQ4QjAxLCAweEU2ODEwMDA5LAorMHgzMDYwNjY2QywgMHhBMTFFOEIwMSwgMHhFNjgyMDAwOSwgMHgzMDYwNjY2QywKKzB4QTExODhCMDEsIDB4RTY4MzAwMDksIDB4MzA2MDY2NkMsIDB4QTExMjhCMDEsCisweEU2ODQwMDA5LCAweDMwNjA2NjZDLCAweEExMEM4QjAxLCAweEU2ODUwMDA5LAorMHgzMDYwNjY2QywgMHhBMTA2OEIwMSwgMHhFNjg2MDAwOSwgMHgzMDYwNjY2QywKKzB4QTEwMDhCMDEsIDB4RTY4NzAwMDksIDB4MzA2MDY2NkMsIDB4QTBGQThCMDEsCisweEU2ODgwMDA5LCAweDMwNjA2NjZDLCAweEEwRjQ4QjAxLCAweEU2ODkwMDA5LAorMHgzMDYwNjY2QywgMHhBMEVFOEIwMSwgMHhFNjhBMDAwOSwgMHgzMDYwNjY2QywKKzB4QTBFODhCMDEsIDB4RTY4QjAwMDksIDB4MzA2MDY2NkMsIDB4QTBFMjhCMDEsCisweEU2OEMwMDA5LCAweDMwNjA2NjZDLCAweEEwREM4QjAxLCAweEU2OEQwMDA5LAorMHgzMDYwNjY2QywgMHhBMEQ2OEIwMSwgMHhFNjhFMDAwOSwgMHgzMDYwNjY2QywKKzB4QTBEMDhCMDEsIDB4RTY4RjAwMDksIDB4MzA2MDY2NkMsIDB4QTBDQThCMDEsCisweEU2OTAwMDA5LCAweDMwNjA2NjZDLCAweEEwQzQ4QjAxLCAweEU2OTEwMDA5LAorMHgzMDYwNjY2QywgMHhBMEJFOEIwMSwgMHhFNkY4MDAwOSwgMHgzMDYwNjY2QywKKzB4QTBCODhCMDEsIDB4RTZGOTAwMDksIDB4MzA2MDY2NkMsIDB4QTBCMjhCMDEsCisweEU2RkEwMDA5LCAweDMwNjA2NjZDLCAweEEwQUM4QjAxLCAweEU2RkIwMDA5LAorMHgzMDYwNjY2QywgMHhBMEE2OEIwMSwgMHhFNkZDMDAwOSwgMHgzMDYwNjY2QywKKzB4QTBBMDhCMDEsIDB4RTZGRDAwMDksIDB4MzA2MDY2NkMsIDB4QTA5QThCMDEsCisweEU2RkUwMDA5LCAweDMwNjA2NjZDLCAweEEwOTQ4QjAxLCAweEU2RkYwMDA5LAorMHgzMDYwNjY2QywgMHhBMDhFOEIwMSwgMHhFNkQwMDAwOSwgMHgzMDYwNjY2QywKKzB4QTA4ODhCMDEsIDB4RTZEMTAwMDksIDB4MzA2MDY2NkMsIDB4QTA4MjhCMDEsCisweEU2RDIwMDA5LCAweDMwNjA2NjZDLCAweEEwN0M4QjAxLCAweEU2RDMwMDA5LAorMHgzMDYwNjY2QywgMHhFNkQ0ODk3NywgMHgzMDYwNjY2QywgMHhFNkQ1ODk3MywKKzB4MzA2MDY2NkMsIDB4RTZENjg5NkYsIDB4MzA2MDY2NkMsIDB4RTZENzg5NkIsCisweDMwNjA2NjZDLCAweEU2RDg4OTY3LCAweDMwNjA2NjZDLCAweEEwMDM4OTYzLAorMHgwMDAwMDAwOSwgMHgwMDExNDAwMCwgMHg2NjZDRTZEOSwgMHg4OTVBMzA2MCwKKzB4NjY2Q0U2REEsIDB4ODk1NjMwNjAsIDB4NjY2Q0U2REIsIDB4ODk1MjMwNjAsCisweDY2NkNFNkRDLCAweDg5NEUzMDYwLCAweDY2NkNFNkRELCAweDg5NEEzMDYwLAorMHg2NjZDRTZGMCwgMHg4OTQ2MzA2MCwgMHg2NjZDRTZGMSwgMHg4OTQyMzA2MCwKKzB4NjY2Q0U2RjIsIDB4ODkzRTMwNjAsIDB4NjY2Q0U2RjMsIDB4ODkzQTMwNjAsCisweDY2NkNFNkY0LCAweDg5MzYzMDYwLCAweDY2NkNFNkY1LCAweDg5MzIzMDYwLAorMHg2NjZDRTZGNiwgMHg4OTJFMzA2MCwgMHg2NjZDRTZGNywgMHg4OTJBMzA2MCwKKzB4NDYwOEU2NTAsIDB4ODkyNjMwNjAsIDB4MzA2MDk2OUEsIDB4OTY5ODg5MjMsCisweDg5MjAzMDYwLCAweDMwNjA5Njk2LCAweDk2OTQ4OTFELCAweDg5MUEzMDYwLAorMHgzMDYwOTY5MiwgMHg5NjkwODkxNywgMHg4OTE0MzA2MCwgMHgzMDYwOTY4RSwKKzB4OTY4Qzg5MTEsIDB4ODkwRTMwNjAsIDB4MzA2MDk2OEEsIDB4OTY4ODg5MEIsCisweDg5MDgzMDYwLCAweDMwNjA5Njg2LCAweDk2ODQ4OTA1LCAweDg5MDIzMDYwLAorMHgzMDYwOTY4MiwgMHgwMDBCOEIwMSwgMHhFMEZGRTA0MCwgMHg2MDBDMDAwQiwKKzB4RTAwMDAwMEIsIDB4NjI0M0QxNTcsIDB4RTQwMjg1MTIsIDB4NjYyRDY3MEQsCisweEU1MDBBMDBFLCAweDYwNTM2NTVELCAweDMwNUM0MDAwLCAweDQwMDhEMTUyLAorMHg2MjJEMDIxRCwgMHg4QjAyMzI2MCwgMHhBMDA0NzEwOCwgMHg3NTAxMDQxQywKKzB4MzI3MzYyNUQsIDB4NjA0MzhCRUUsIDB4QzkwQTAwMEIsIDB4Njc0Qzc2RkUsCisweDAyNUM2MDZDLCAweDM3MjM2MjJDLCAweDIwMDg4OTA2LCAweDcwRkY4OTAyLAorMHg2NjAzQUZGNiwgMHhFMDAwMDAwQiwgMHgwMDA5MDAwQiwgMHg0RjEyNEYyMiwKKzB4MzI2MDUyRjIsIDB4MzQ1MDg5MTAsIDB4MzQ3MDg5MEUsIDB4Mzc1MDg5MEQsCisweDMyNjg4OTBBLCAweDA0MjczNDU4LCAweDYwNzMzNzU4LCAweDQ0MEJENDNCLAorMHgzMDZDMDExQSwgMHg2MjAzQTAwMSwgMHg0RjE2NjI2MywgMHgwMDBCNEYyNiwKKzB4MkZFNjYwMjMsIDB4NEYxMjRGMjIsIDB4NkU0MzRGMDIsIDB4NjE0QzU0RjQsCisweDJGMTY0MTE4LCAweDY2NkM2NzdDLCAweDY0RUM2NTVDLCAweDQ2MTg0NzE4LAorMHhCRkQzNDUxOCwgMHg2NTAzNDQxOCwgMHg2MDUzN0YwNCwgMHhDOTgwRTcwMiwKKzB4NkUwMzQ3MTgsIDB4MzdFRDQ3MjgsIDB4NjI1OTQ1MTksIDB4MDEwQTY1MkUsCisweDMxMkMyMjVELCAweDRGMDY2MDFDLCAweDRGMjY0RjE2LCAweDZFRjYwMDBCLAorMHgwMzQwMDI0MCwgMHgwNTQwMDQ0MCwgMHgwNzQwMDY0MCwgMHgwOTQwMDg0MCwKKzB4MTE0MDBCNDAsIDB4MEE0MDEyNDAsIDB4NEYyMjBBNTAsIDB4NjE0Qzg0NTEsCisweDMxMjc2MjBDLCAweEEwMEM4OTAxLCAweDg0NTJFNDAwLCAweDMxMjc2MjBDLAorMHhBMDA2ODkwMSwgMHg4NDUzRTQwMSwgMHgzMTI3NjIwQywgMHhFNDAzOEQwMSwKKzB4NjI2M0U0MDIsIDB4NjA0MzcyMDEsIDB4Njc3QzA3MkMsIDB4NjI1MzJGNzYsCisweDA3MkM3MjAxLCAweDA1NUMwNjZDLCAweDY2NkM2NzdDLCAweEJGQTg2NTVDLAorMHg3RjA0NjQxMywgMHgwMDBCNEYyNiwgMHg2MDVDNjAwQywgMHg4RjA2ODgwMSwKKzB4NjA2QzYyNDMsIDB4OEIwMTg4MDEsIDB4NzIwQUEwMDEsIDB4MDAwQjcyRjYsCisweDAwMDA2MDIzLCAweDAwMTE0MDAwLCAweDAwMTE0MDA4LCAweDAwMjAzMzc0LAorMHhFMDQwRDY5MCwgMHgwNTZFNjE0QywgMHg5Mjc0RDc4RiwgMHgzNTJDMzU3QywKKzB4RTQwMEU3MTgsIDB4NjI2QzY2NTAsIDB4ODkwNDMxMjAsIDB4NjI0Qzc0MDEsCisweDhGRjczMjczLCAweDAwMEI3NTAxLCAweEUyRkY2MDQzLCAweDYyMkM2NDRDLAorMHg4OTBEMzQyMCwgMHg4ODAxNjA1QywgMHg5NjVEOEIwMywgMHhBMDA1MzQ2QywKKzB4NjI0MzYyNDMsIDB4MzI0QzQyMDgsIDB4MzI2Qzk2NTcsIDB4NjAyMzAwMEIsCisweDYwNDMwMDBCLCAweDJGOTYyRjg2LCAweDJGQjYyRkE2LCAweDJGRDYyRkM2LAorMHg0RjIyMkZFNiwgMHg5MjQ5N0ZGNCwgMHg2QjUzMzUyNiwgMHgwMDI5Njk0MywKKzB4RTEzRkNBMDEsIDB4NkUwM0VBRkYsIDB4NkFBQzJGMTAsIDB4NkQ0M0VDMDAsCisweDYyRDBFODA4LCAweDM0QTA2NDJDLCAweEJGQ0U4OTM5LCAweDNCMDA2NUUzLAorMHg2Q0NDOEYwQSwgMHg0MjAwNjJDMywgMHgzNjJDNjY5MywgMHgxRkMxODQ2MSwKKzB4NDEwOTYxMEMsIDB4MkYxMEEwMkQsIDB4ODkxQzJDQzgsIDB4NjVFMzY0RDAsCisweDY0NENCRkJCLCAweDg5MTYzQjAyLCAweDcwRkY2MEMzLCAweDA0OUM0MDAwLAorMHg2NDRDNjVFMywgMHgxRjAyQkZCMSwgMHg4RDFBMzBCMiwgMHg1NkYyMUZDMSwKKzB4MzU2QzY1OTMsIDB4QzkwMzg0NTEsIDB4ODkxMjIwMDgsIDB4NjYwQzg0NTEsCisweEEwMEU0NjA5LCAweDdDMDEyRjYwLCAweDMyODM2MkNDLCAweDhGQzg3RDAyLAorMHhBMDA2MUYyMSwgMHgwNjI1MDAwOSwgMHgxMkMwMDhGQywgMHg2MkNDMDlCNCwKKzB4NTBGMTFGMjEsIDB4OEIxMjg4MDgsIDB4N0NGRjZDQ0MsIDB4NjBDMzRDMDAsCisweDY1RTMwNDlDLCAweDY0NENCRjg5LCAweDhCMDgzQjA2LCAweDg0OTEzOUNDLAorMHgyMDA4QzkwMywgMHg4NDkxODkwMywgMHg0MjA5NjIwQywgMHg2MEYwMkYyMCwKKzB4NEYyNjdGMEMsIDB4NkRGNjZFRjYsIDB4NkJGNjZDRjYsIDB4NjlGNjZBRjYsCisweDY4RjYwMDBCLCAweDJGOTYyRjg2LCAweDJGQjYyRkE2LCAweDJGRDYyRkM2LAorMHg0RjIyMkZFNiwgMHg5MjcyN0ZGQywgMHgzNDI2RTEwMCwgMHg2QjQzNjk1MywKKzB4MkYxMjY2NkMsIDB4Q0EwMTAwMjksIDB4OEQwMzI2NjgsIDB4RTJGMDZFMDMsCisweDJGMjI2MjJDLCAweDZBQUNFQUZGLCAweDZDOTNFRDAwLCAweDY2QzBFODA4LAorMHgzNEEwNjQ2QywgMHhCRjUwODkxMywgMHgzQjAwNjVFMywgMHg2RERDOEIwQSwKKzB4MzlEQzREMDAsIDB4QzkwMzg0OTEsIDB4OEIwODIwMDgsIDB4Q0IwRjYwRjIsCisweDJGMDJBMDA1LCAweDYyREM3RDAxLCAweDhGRTgzMjgzLCAweDYwRjI3QzAyLAorMHg0RjI2N0YwNCwgMHg2REY2NkVGNiwgMHg2QkY2NkNGNiwgMHg2OUY2NkFGNiwKKzB4NjhGNjAwMEIsIDB4MkY5NjJGODYsIDB4MkZCNjJGQTYsIDB4MkZENjJGQzYsCisweDRGMjIyRkU2LCAweDRGMDI0RjEyLCAweDNGM0M5MzMyLCAweDQzMDhFMzVCLAorMHg2MDUzMzNGQywgMHg4MDM0MTM1MSwgMHhFNzYwNjA2MywgMHg4MDM4MTM2MiwKKzB4NDcwOEUwMTIsIDB4RTAzRjgxMzYsIDB4RDExMjM3RkMsIDB4MjcwMDgxMzgsCisweDgwNzg4MDc0LCAweEU5MTY2MDUzLCAweDYwNjM4MDEyLCAweDIxNDE0OTE4LAorMHg2QjkzODAxMywgMHhFREZGNkFCNCwgMHg2QUFDNjFCMCwgMHg2QzFDNEExOCwKKzB4NjhDODJDQUIsIDB4NkRERDY4OEQsIDB4MjM0MjM4RDAsIDB4OEIxMzEzOTgsCisweEQyMDdENDA2LCAweDAwMDk0MjBCLCAweDQzMkJEMzA2LCAweDA5QjQwMDA5LAorMHgwMDAwRkUxMCwgMHgwMDExNDJEOCwgMHgwMDBEREQwMCwgMHgwMDExNjBCMCwKKzB4MDAyMDE4QzAsIDB4MDAxMTVFODgsIDB4MzQyMjkyRTMsIDB4OEYwMkUxMDAsCisweEExNjE2NTkzLCAweDkyREQwMDA5LCAweDM1MkNFN0ZGLCAweEVFMDQ2NzdDLAorMHg2MjJDNjI1MCwgMHg4OTA0MzI3MCwgMHg2MjFDNzEwMSwgMHg4RkY3MzJFMywKKzB4RThGQzc1MDEsIDB4MzQ4ODY4OEMsIDB4OUFDQkUwNjQsIDB4NDAwODY4OTMsCisweDBGNDQzOEFDLCAweDY2MUM2NTgzLCAweDY0NENCRTE4LCAweDY0RTM2RTBDLAorMHg2NUUzNzQwMSwgMHg0NTA4NjY0MywgMHgzNUVDNDYwOCwgMHg0NTA4MzY0QywKKzB4NDUwMDQ2MDgsIDB4MzY5QzQ2MDAsIDB4NjFBMzlBQjUsIDB4RTA2NTY3NjMsCisweDQwMDgzN0FDLCAweDYyNjM3MTE0LCAweDMyMUMwRjc2LCAweDk0QUI3MDA0LAorMHg2MTQzMEYyNiwgMHgzNTlDNjI2MywgMHg3MDA0MzI0QywgMHgwRjI2NzExNCwKKzB4NzAwNDM2MUMsIDB4MEY2NjY3NTMsIDB4NzAwNDM3QUMsIDB4N0ExNDBGNzYsCisweDM3QUM2NzUzLCAweDY2NTM3MDA0LCAweDM2NEMwRjc2LCAweDc0MTQ3MDA0LAorMHgzNTRDMEY2NiwgMHgwRjU2NzAwNCwgMHgzOTVDOTU4RiwgMHhFRDAwNkE5MywKKzB4NkJEM0U5NTYsIDB4RUMwNTQ5MDgsIDB4NDAwOEUwNjUsIDB4NjBCMzAyRkUsCisweDY0NEMwNDJDLCAweDYwRTMyRjQ2LCAweEUwNkEwN0FDLCAweDAxRkU0MDA4LAorMHgwNjFDNjBCMywgMHgwNThDNjBFMywgMHg0MDA4RTA2NSwgMHg2NzdDMDFGQywKKzB4NjU1QzY2NkMsIDB4NjQxQ0JERUQsIDB4N0YwNDY0MDMsIDB4NjBEMzZEREMsCisweEUwNjYwRjQ0LCAweDA0RkU0MDA4LCAweDA1NEM2MEIzLCAweDJGNTY2NTVDLAorMHgwN0FDNjBFMywgMHg0MDA4RTA2QiwgMHg2MEIzMDFGRSwgMHg2MEUzMDYxQywKKzB4RTA2NTA1OEMsIDB4MDFGQzQwMDgsIDB4NjY2QzY3N0MsIDB4QkREMDY1NUMsCisweDY0MDM2NDFDLCAweDY1RjM3RjA0LCAweDYwRDM3NTEwLCAweEUwNjUwNTQ0LAorMHgwN0ZFNDAwOCwgMHgwNTdDNjBDMywgMHgyRjU2NjU1QywgMHgwN0FDNjBFMywKKzB4NDAwOEUwNkEsIDB4NjBDMzAxRkUsIDB4NjBFMzA2MUMsIDB4RTA2NTA1OEMsCisweDAxRkM0MDA4LCAweDY2NkM2NzdDLCAweEJEQjI2NTVDLCAweDY0MDM2NDFDLAorMHg2MUYzN0YwNCwgMHg2MEQzNzEyMCwgMHhFMDY2MDE0NCwgMHgwMkZFNDAwOCwKKzB4MDUyQzYwQzMsIDB4MkY1NjY1NUMsIDB4MDdBQzYwRTMsIDB4NDAwOEUwNkIsCisweDYwQzMwMUZFLCAweDYwRTMwNjFDLCAweEUwNjUwNThDLCAweDAxRkM0MDA4LAorMHg2NjZDNjc3QywgMHhCRDk0NjU1QywgMHg2NTAzNjQxQywgMHg2NEYzN0YwNCwKKzB4NjBEMzM0OUMsIDB4RTA2NzA0NTQsIDB4MDdGRTQwMDgsIDB4MDU3QzYwQjMsCisweDJGNTY2NTVDLCAweDA3QUM2MEUzLCAweDQwMDhFMDZDLCAweEEwMDUwMUZFLAorMHgwQkI4NjBCMywgMHgwM0MyMDEzRSwgMHgwMTNGMDQ2MiwgMHg2MEUzMDYxQywKKzB4RTA2NTA1OEMsIDB4MDFGQzQwMDgsIDB4NjY2QzY3N0MsIDB4QkQ3MDY1NUMsCisweDYyMDM2NDFDLCAweEUxQjg3RjA0LCAweDY0RjM2MTFDLCAweDYwRDMzNDFDLAorMHhFMDY4MDQyNCwgMHgwNUZFNDAwOCwgMHgwNzVDNjBCMywgMHgyRjc2Njc3QywKKzB4MDdBQzYwRTMsIDB4NDAwOEUwNkQsIDB4NjBCMzAxRkUsIDB4NjBFMzA2MUMsCisweEUwNjUwNThDLCAweDAyRkM0MDA4LCAweDY2NkM2NzdDLCAweEJENTA2NTVDLAorMHg2NzAzNjQyQywgMHhFMkMwN0YwNCwgMHg2NkYzNjIyQywgMHg2MEQzMzYyQywKKzB4RTA2NzA2NzQsIDB4MDdGRTQwMDgsIDB4MDI3QzYwQzMsIDB4MkYyNjYyMkMsCisweDA3QUM2MEUzLCAweDQwMDhFMDZDLCAweDYwQzMwMkZFLCAweDYwRTMwNjJDLAorMHhFMDY1MDU4QywgMHgwMkZDNDAwOCwgMHg2NjZDNjc3QywgMHhCRDMwNjU1QywKKzB4NjIwMzY0MkMsIDB4RTdDODdGMDQsIDB4NjZGMzY3N0MsIDB4NjBEMzM2N0MsCisweEUwNjgwNjI0LCAweDA2RkU0MDA4LCAweDAyNkM2MEMzLCAweDJGMjY2MjJDLAorMHgwN0FDNjBFMywgMHg0MDA4RTA2RCwgMHg2MEMzMDJGRSwgMHg2MEUzMDYyQywKKzB4RTA2NTA1OEMsIDB4MDJGQzQwMDgsIDB4NjY2QzY3N0MsIDB4QkQxMDY1NUMsCisweDYxMDM2NDJDLCAweDY2OTM3RjA0LCAweDYyRjM3NjA4LCAweDYwRDMzMjZDLAorMHgwMjE0N0QwMSwgMHhFNjA1NjJEQywgMHg3QzAxMzI2MywgMHg3QjAxOEQwMiwKKzB4MDAwOUFFRkEsIDB4MDAwOUExN0IsIDB4RTdGRjlCRDUsIDB4Njc3QzM1QkMsCisweDYyNTBFRTA4LCAweDMyNzA2MjJDLCAweDcxMDE4OTA0LCAweDMyRTM2MjFDLAorMHg3NTAxOEZGNywgMHhEREQ4OUNDOCwgMHgzRDQ1MzRDOCwgMHg0MDA4RTA2NCwKKzB4NEUwOTBFMEEsIDB4MEZFNDY1OTMsIDB4NzAyNDM1QkMsIDB4NjRFQzY2MUMsCisweDBGNTZCQ0I0LCAweDY0RTM2RTBDLCAweDY1RTM3NDAxLCAweDQ1MDg2MjQzLAorMHgzNUVDNDIwOCwgMHg0NTA4MzI0QywgMHg0NTAwNDIwOCwgMHgzMjlDNDIwMCwKKzB4NjFCMzdCMEMsIDB4MzhCQzY4MjMsIDB4NzExNEUwNkUsIDB4NDAwODZCMjMsCisweDkxQTIzQjFDLCAweDcwMDQwRjg2LCAweDY4MjM2NDEzLCAweDBGQjYzNTlDLAorMHg3MDA0MzgxQywgMHgwRjg2NzQxNCwgMHg3MDA0MzQyQywgMHg2NzUzOTg5NiwKKzB4MEY0NjYyNTMsIDB4NzAwNDM3OEMsIDB4NkI1Mzc4MTQsIDB4NzExNDMyMUMsCisweDNCOEMwRjc2LCAweDM1MUM3MDA0LCAweDBGQjY5Nzg5LCAweDM5N0M3MDA0LAorMHg3MDA0MEYyNiwgMHhFRDAwNjg5MywgMHgwRjU2RUMwNSwgMHg2QUQzRTk1NiwKKzB4RTA2RTQ5MDgsIDB4MDJGRTQwMDgsIDB4MDEyQzYwQTMsIDB4MkYxNjYxMUMsCisweDA3OEM2MEUzLCAweDQwMDhFMDczLCAweDYwQTMwNEZFLCAweEUwNkUwNjRDLAorMHgwQkZFNDAwOCwgMHgwNUJDNjBFMywgMHg0MDA4RTA2NSwgMHg2NzdDMDFGQywKKzB4NjU1QzY2NkMsIDB4NjQxQ0JDODUsIDB4N0YwNDY0MDMsIDB4NjBEMzZEREMsCisweEUwNkYwRjQ0LCAweDA0RkU0MDA4LCAweDA1NEM2MEEzLCAweDJGNTY2NTVDLAorMHgwNzhDNjBFMywgMHg0MDA4RTA3NCwgMHg2MEEzMEJGRSwgMHhFMDZFMDZCQywKKzB4MEJGRTQwMDgsIDB4MDVCQzYwRTMsIDB4NDAwOEUwNjUsIDB4Njc3QzAxRkMsCisweDY1NUM2NjZDLCAweDY0MUNCQzY1LCAweDdGMDQ2NDAzLCAweDc1MTA2NUYzLAorMHgwNTQ0NjBEMywgMHg0MDA4RTA2RSwgMHg2MEMzMDdGRSwgMHg2NTVDMDU3QywKKzB4NjBFMzJGNTYsIDB4RTA3MzA3OEMsIDB4MEJGRTQwMDgsIDB4MDZCQzYwQzMsCisweDQwMDhFMDZFLCAweDYwRTMwMUZFLCAweEUwNjUwNTFDLCAweDBCRkM0MDA4LAorMHg2NjZDNjc3QywgMHhCQzQ0NjU1QywgMHg2MTAzNjRCQywgMHg2QkYzN0YwNCwKKzB4NjBEMzdCMjAsIDB4RTA2RjBCMTQsIDB4MDFGRTQwMDgsIDB4MDQxQzYwQzMsCisweDJGNDY2NDRDLCAweDA3OEM2MEUzLCAweDQwMDhFMDc0LCAweDYwQzMwMUZFLAorMHhFMDZFMDYxQywgMHgwQkZFNDAwOCwgMHgwNUJDNjBFMywgMHg0MDA4RTA2NSwKKzB4QTAwNTAxRkMsIDB4MDEzNjY3N0MsIDB4MDI4MjEyQzAsIDB4MDEzNzAxNDIsCisweDY1NUM2NjZDLCAweDY0MUNCQzFELCAweDdGMDQ2MjAzLCAweDM0OUM2NEYzLAorMHgwNDI0NjBEMywgMHg0MDA4RTA3MCwgMHg2MEEzMDRGRSwgMHg2NTVDMDU0QywKKzB4NjBFMzJGNTYsIDB4RTA3NTA3OEMsIDB4MEJGRTQwMDgsIDB4MDZCQzYwQTMsCisweDQwMDhFMDZFLCAweDYwRTMwMUZFLCAweEUwNjUwNTFDLCAweDBCRkM0MDA4LAorMHg2NjZDNjc3QywgMHhCQkZDNjU1QywgMHg2MTAzNjRCQywgMHhFQkI4N0YwNCwKKzB4NjVGMzZCQkMsIDB4NjBEMzM1QkMsIDB4RTA3MTA1MTQsIDB4MDdGRTQwMDgsCisweDA0N0M2MEEzLCAweDJGNDY2NDRDLCAweDA3OEM2MEUzLCAweDQwMDhFMDc2LAorMHg2MEEzMEJGRSwgMHhFMDZFMDZCQywgMHgwMUZFNDAwOCwgMHgwNTFDNjBFMywKKzB4NDAwOEUwNjUsIDB4Njc3QzBCRkMsIDB4NjU1QzY2NkMsIDB4NjRCQ0JCRDksCisweDdGMDQ2MTAzLCAweDYyMkNFMkMwLCAweDNCMkM2QkYzLCAweDBCMTQ2MEQzLAorMHg0MDA4RTA3MCwgMHg2MEMzMDJGRSwgMHg2NzdDMDcyQywgMHg2MEUzMkY3NiwKKzB4RTA3NTA3OEMsIDB4MDJGRTQwMDgsIDB4MDYyQzYwQzMsIDB4NDAwOEUwNkUsCisweDYwRTMwMkZFLCAweEUwNjUwNTJDLCAweDAyRkM0MDA4LCAweDY2NkM2NzdDLAorMHhCQkI2NjU1QywgMHg2NzAzNjQyQywgMHhFQkM4N0YwNCwgMHg2NkYzNkJCQywKKzB4NjBEMzM2QkMsIDB4RTA3MTA2NzQsIDB4MDZGRTQwMDgsIDB4MDI2QzYwQzMsCisweDJGMjY2MjJDLCAweDA3OEM2MEUzLCAweDQwMDhFMDc2LCAweDYwQzMwMkZFLAorMHhFMDZFMDYyQywgMHgwMkZFNDAwOCwgMHgwNTJDNjBFMywgMHg0MDA4RTA2NSwKKzB4Njc3QzAyRkMsIDB4NjU1QzY2NkMsIDB4NjQyQ0JCOTMsIDB4N0YwNDYxMDMsCisweDcyMDg2MjkzLCAweDM2MkM2NkYzLCAweDdEMDE2MEQzLCAweDYyREMwNjE0LAorMHgzMjYzRTYwNSwgMHg4RDAyN0MwMSwgMHhBRUUyN0EwMSwgMHg2RUYzMDAwOSwKKzB4RTJCMDY4RjMsIDB4NkFGM0UwNUEsIDB4Mzg5QzdFMTgsIDB4NjlGMzYyMkMsCisweDdBMDg0MDA4LCAweDY3RjM2REYzLCAweDM5MkM2MUYzLCAweDZDQTMwRkU2LAorMHg3NzIwN0QxMCwgMHhFNDAwNzEyOCwgMHhFQjA1NjVGMywgMHg2MDRDNjY1NCwKKzB4NjZENDYyNkMsIDB4MkU2MDQyMjEsIDB4MDQ4QzY2NzQsIDB4NjI2QzJDMjAsCisweDA5NDQ0MjIxLCAweDIxMjA3MDAxLCAweDMyQjM2MjBDLCAweDcxMDE2NDAzLAorMHg4RkVCN0UwMSwgMHhFMDVBN0MwMSwgMHg2RUYzNDAwOCwgMHg3RTMwMEJGRSwKKzB4RUMxOUVEMDAsIDB4NjZCMzY1QTMsIDB4QkI3RTY0REMsIDB4NjJEQzdEMDEsCisweDJFMDAzMkMzLCAweDdFMDE4RkY2LCAweDY2NkNFNkIwLCAweDZCRjM2RUYzLAorMHg3QjI4M0U2QywgMHhFQzRDQTAxMCwgMHhDQ0NDQ0NDRCwgMHg2NEQzNkREQywKKzB4NjQ0Qzc0RjQsIDB4QkI2ODY1QjMsIDB4NjdGMzY2RTMsIDB4NzczMDY1MDMsCisweDA3NTQ2MEQzLCAweDYyREM3RDAxLCAweDhCRUYzMkMzLCAweDdCMzA2QkYzLAorMHg2MUIzNjdCMywgMHhFRDgwNjRCMywgMHg3MTAyNzcwMSwgMHg2RERDNzQwMywKKzB4REMzN0U1MDAsIDB4NjA1Q0RFMzcsIDB4MDkxQzA4NEMsIDB4MEE3QzY2OEMsCisweDY5OUM0NjI4LCAweDQ5Mjg0NjE4LCAweDA1QkM2QUFDLCAweDRBMTgyNjlCLAorMHg3MDA0NjgwMywgMHg2NTVDMjZBQiwgMHg2MjBDMzhDQywgMHgzOEVDMjY1QiwKKzB4Mjg2MjMyRDMsIDB4NjUwMzhGRTcsIDB4NjQ0Q0U0QjgsIDB4M0M0QzZDRjMsCisweDZFRjM3NDA4LCAweEUyQjBFNjU4LCAweDNFNEM2QUYzLCAweDc0MDg2QkYzLAorMHg0NjA4NjFGMywgMHg2MjJDNjhGMywgMHg3QTA4NjlGMywgMHgzMTRDN0IxOCwKKzB4Mzg2QzY0RjMsIDB4NkRBMzM5MkMsIDB4NzQyODY3QjMsIDB4NjZDNEU1MDAsCisweDYyNkM2MDVDLCAweDQyMjE2NkU0LCAweDY2MTQyNzYwLCAweDJEMjAwNThDLAorMHg0MjIxNjI2QywgMHg3MDAxMDk1NCwgMHg2MjBDMjQyMCwgMHgzMjYzRTYwNSwKKzB4NzQwMTY1MDMsIDB4OEZFQTc3MDEsIDB4RTA1RTdEMDEsIDB4MDJGRDQwMDgsCisweDZEMkRFOUQwLCAweDY5OUM3RDA3LCAweEVFMDBBMDBCLCAweDY2QjM2NUEzLAorMHg2NEVDQkFGQiwgMHg2MjAzNjdGMywgMHg2MEVDMzc5QywgMHg3MDAxMDcyNCwKKzB4NjJFQzZFMDMsIDB4OEJGMTMyRDMsIDB4NDAwOEUwNUYsIDB4RUFCMDA4RkQsCisweDZERjM2QUFDLCAweDZCRjM2QzhELCAweDdDMEQzREFDLCAweDdCMjhBMDEyLAorMHgwMDAwQTI4MCwgMHgwMDFCQzAwMCwgMHg2NEUzNkVFQywgMHg2NDRDNzRGNCwKKzB4QkFEQTY1QjMsIDB4NjJGMzY2RDMsIDB4MzI5QzYxMDMsIDB4N0UwMTYwRTMsCisweDYyRUMwMjE0LCAweDhCRUYzMkMzLCAweDNEOUM2REYzLCAweDY3RDM2RUQzLAorMHhFQzgwNjFEMywgMHg3NzAyN0UwMSwgMHg2Q0NDNzEwMywgMHhEQkI5RTQwMCwKKzB4NjA0Q0RBQjksIDB4MDY3QzA0MUMsIDB4MDhFQzY1NEMsIDB4NjY2QzQ1MjgsCisweDQ2Mjg0NTE4LCAweDA5REM2ODhDLCAweDQ4MTgyNTZCLCAweDcwMDQ2NjAzLAorMHg2OTlDMjU4QiwgMHg2MjBDMzZCQywgMHgzNkFDMjU5QiwgMHgyNjUyMzJDMywKKzB4NjQwMzhGRTcsIDB4NDAwOEUwNjQsIDB4NzBFMDA3RkMsIDB4NzA2QzBDRkMsCisweDBGODY2OENDLCAweDBERkM3MDk4LCAweDZBREM3MDZDLCAweDcwOEMwRkE2LAorMHg5QkJGMEVGRSwgMHhFMjU0M0VCMiwgMHg2OTdDRTEwMCwgMHg0MjA4OEYwMiwKKzB4MDAwOUExNjMsIDB4NDAwOEUwNjMsIDB4NkVGMzA1RkUsIDB4M0UyQzk2QjMsCisweDY0RTMzNTZDLCAweEVERkZFNzAzLCAweDMyRDA2MjUwLCAweDYyMkM4RDA3LAorMHg2ODFDNzEwMSwgMHgyNDIwMzg3MywgMHg4RkY1NzUwNSwgMHhFMDY0NzQwMSwKKzB4MEFGQzQwMDgsIDB4NjRBQzY1RTMsIDB4NjYxQ0JBMTgsIDB4RTA2MzY3MEMsCisweDYyNzM0MDA4LCAweDQyMDgwQkZFLCAweDc3MDEzMjdDLCAweDNBMkM2QUIzLAorMHg0ODA4Njg3MywgMHg5NDhGNkVBMywgMHgzRTRDMzg3QywgMHgzQjhDNzRGRiwKKzB4MzgyODNBNEMsIDB4RUMwMDNCNEMsIDB4NjA4M0REODgsIDB4NjU1QzA1RUMsCisweEUwNjUyRjU2LCAweDY3QjA0MDA4LCAweDY1QTA2NkU0LCAweDY3N0MwMUZDLAorMHg2NTVDNjY2QywgMHg2NDFDQkExRCwgMHg3QzAxN0YwNCwgMHhFNDA0NjJDQywKKzB4MkQwMDMyNDMsIDB4N0QwMThGRTksIDB4RTA2M0U1NTQsIDB4NjdGMzQ1MDgsCisweDM3NUM0MDA4LCAweDk2NjgwNUZFLCAweDM1NkNFREZGLCAweDZEREM2NDczLAorMHhFRTA0RTEwMCwgMHg2NjZDNjY1MCwgMHg4OTA2MzZEMCwgMHg2MjFDNzEwMSwKKzB4MjQ2MDMyRTMsIDB4OEZGNTc1MDUsIDB4RTA2NDc0MDEsIDB4MDJGQzQwMDgsCisweDY0MkM2NTczLCAweDY2MUNCOUNBLCAweDZFMjM2MjBDLCAweEUwNjM0RTA4LAorMHg3MjAxM0UyQywgMHgwQkZFNDAwOCwgMHg0NzA4NjcyMywgMHg2QUIzMzcyQywKKzB4Njg3MzNBRUMsIDB4NkVBMzM4RTgsIDB4M0UxQzkxNDAsIDB4M0I3QzcxRkYsCisweDNCMUMzQTFDLCAweDBGOTY3MDRDLCAweEVDMDBFOTA0LCAweDYwODNERDYwLAorMHg2NDRDMDRFQywgMHhFMDY1MkY0NiwgMHg2N0IwNDAwOCwgMHg2NUEwNjZFNCwKKzB4Njc3QzAxRkMsIDB4NjU1QzY2NkMsIDB4NjQxQ0I5Q0IsIDB4N0MwMTdGMDQsCisweDMyOTM2MkNDLCAweDhGRUEyRDAwLCAweEUwNzY3RDAxLCAweDA5RkU0MDA4LAorMHg3MEI0RTQ1NCwgMHg2N0YzNDQwOCwgMHgzNzRDMDVGRSwgMHhFREZGOTYxNywKKzB4MzU2QzY0NzMsIDB4RTEwMDZEREMsIDB4NjY1MEVFMDQsIDB4MzZEMDY2NkMsCisweDcxMDE4OTA2LCAweDMyRTM2MjFDLCAweDc1MDkyNDYwLCAweDc0MDE4RkY1LAorMHhFMDY0QTAwNiwgMHgwNUJBMEJCOCwgMHgwNUM5MDVCQiwgMHgwNUREMDVDQSwKKzB4NjU3MzQwMDgsIDB4NjYxQzA3RkMsIDB4NjQ3Q0I5NzAsIDB4NjYyMzYyMEMsCisweDQ2MDhFMDYzLCAweDQ2MDA0MDA4LCAweDM2MkMwQkZFLCAweDY4MjM3MjAxLAorMHgzQTZDNkFCMywgMHg0ODAwNDgwOCwgMHg5MTY3NkVBMywgMHgzRTFDMzgyQywKKzB4M0I4QzcxRkYsIDB4Mzg2ODNBMUMsIDB4RUMwMDNCMUMsIDB4NjA4M0REMzUsCisweDY0NEMwNEVDLCAweEUwNjUyRjQ2LCAweDY3QjA0MDA4LCAweDY1QTA2NkU0LAorMHg2NzdDMDFGQywgMHg2NTVDNjY2QywgMHg2NDFDQjk3MywgMHg3QzAxN0YwNCwKKzB4RTUwODYyQ0MsIDB4MkQwMDMyNTMsIDB4N0QwMThGRTksIDB4NDAwOEUwNjMsCisweDA1RkVFNjU0LCAweDY0RjM0NjA4LCAweEVDRkY5NzQxLCAweDM1N0MzNDZDLAorMHhFRTAwNkNDQywgMHg2MjUwRUQwNCwgMHgzMkMwNjIyQywgMHg3RTAxODkwNiwKKzB4MzhEMzY4RUMsIDB4NzUwOTI0MjAsIDB4NzQwMThGRjUsIDB4NDAwOEUwNzcsCisweDcwMDQwNUZFLCAweDY0OTMwNkZFLCAweEVBNTRCOUE3LCAweDY1RjM0QTA4LAorMHg2NDBDMzVBQywgMHg2NkVDQjkxQSwgMHg2NjEzNjEwQywgMHg0NjA4RTA2MywKKzB4NDYwMDQwMDgsIDB4MzYxQzBCRkUsIDB4NjgxMzcxMDEsIDB4M0E2QzZBQjMsCisweDQ4MDA0ODA4LCAweDkyMTM2RUEzLCAweDNFMkMzODFDLCAweDNCOEM3MkZGLAorMHgzODY4M0EyQywgMHhFQzAwM0IyQywgMHhFMDc3REQwQiwgMHgwNUZFNDAwOCwKKzB4MDZGRTcwMDQsIDB4NjQ5M0I5ODEsIDB4MDAwOUEwMTAsIDB4MDYwMTA1REUsCisweDAwMDAwNjAyLCAweDAwMDBCMjgwLCAweDAwMUJDMDAwLCAweDAwMTE0MkU0LAorMHgwMDExNDJFOCwgMHgwMDExNDJFRCwgMHgwMDExNDJGNSwgMHg2MDgzNjQwMywKKzB4Njc3QzA3RUMsIDB4NjdCMDJGNzYsIDB4NjVBMDY2RTQsIDB4NjY2QzY3N0MsCisweEI5MDY2NTVDLCAweDdGMDQ2NDRDLCAweDYxQ0M3QzAxLCAweDMxMjNFMjA4LAorMHg4RkQyMkQwMCwgMHhBMEZDN0QwMSwgMHhFMDYzMDAwOSwgMHgwNUZFNDAwOCwKKzB4OTZEMDY3RjMsIDB4MzU2QzM3MkMsIDB4RUVGRjY0NzMsIDB4MzJFMDYyNTAsCisweDYyMkM4RDA4LCAweDY4MUM3MTAxLCAweDM4NjNFNjA4LCAweDc1MDUyNDIwLAorMHg3NDAxOEZGNCwgMHg0MDA4RTA2NCwgMHg2NTczMDJGQywgMHhCOEI1NjQyQywKKzB4NjUwQzY2MUMsIDB4NDAwOEUwNjMsIDB4MEJGRTYyNTMsIDB4MzI1QzQyMDgsCisweDZBQjM3NTAxLCAweDY4NTMzQTJDLCAweDZFQTM0ODA4LCAweDM4NUM5NEFDLAorMHg3NEZGM0U0QywgMHgzQTRDM0I4QywgMHgzQjRDMzgyOCwgMHhERDk2RUMwMCwKKzB4MDZFQzYwODMsIDB4MkY2NjY2NkMsIDB4NDAwOEUwNjUsIDB4NjZFNDY3QjAsCisweDAxRkM2NUEwLCAweDY2NkM2NzdDLCAweEI4QkE2NTVDLCAweDdGMDQ2NDFDLAorMHg2MkNDN0MwMSwgMHgzMjQzRTQwNCwgMHg4RkU5MkQwMCwgMHhFNTU0N0QwMSwKKzB4NDUwOEUwNjMsIDB4NDAwODY3RjMsIDB4MDVGRTM3NUMsIDB4RUVGRjk2ODUsCisweDY0NzMzNTZDLCAweEUxMDA2RUVDLCAweDY2NkM2NjUwLCAweDg5MDczNkUwLAorMHg2MjFDNzEwMSwgMHgzMjgzRTgwOCwgMHg3NTA5MjQ2MCwgMHg3NDAxOEZGNCwKKzB4NDAwOEUwNjQsIDB4NjU3MzBBRkMsIDB4Qjg2NzY0QUMsIDB4NjIwQzY2MUMsCisweEUwNjM2NjIzLCAweDQwMDg0NjA4LCAweDBCRkU0NjAwLCAweDcyMDEzNjJDLAorMHg2QUIzNjgyMywgMHg0ODA4M0E2QywgMHg2RUEzNDgwMCwgMHgzODJDOTE1RSwKKzB4NzFGRjNFMUMsIDB4M0ExQzNCOEMsIDB4M0IxQzM4NjgsIDB4REQ2RkVDMDAsCisweDA0RUM2MDgzLCAweDJGNDY2NDRDLCAweDQwMDhFMDY1LCAweDY2RTQ2N0IwLAorMHgwMUZDNjVBMCwgMHg2NjZDNjc3QywgMHhCODZBNjU1QywgMHg3RjA0NjQxQywKKzB4NjJDQzdDMDEsIDB4MzI1M0U1MDgsIDB4OEZFOTJEMDAsIDB4RTA2MzdEMDEsCisweEU2NTQ0MDA4LCAweDQ2MDgwNUZFLCAweDk3Mzg2NEYzLCAweDM0NkNFQ0ZGLAorMHg2Q0NDMzU3QywgMHhFRDA4RUUwMCwgMHg2NjZDNjY1MCwgMHg4OTA2MzZDMCwKKzB4NjJFQzdFMDEsIDB4MjQ2MDMyRDMsIDB4OEZGNTc1MDksIDB4RTA3Nzc0MDEsCisweDA1RkU0MDA4LCAweDA2RkU3MDA0LCAweEI4OUU2NDkzLCAweDQ4MDhFODU0LAorMHgzNThDNjVGMywgMHhCODExNjQwQywgMHg2MTBDNjZFQywgMHhFMDYzNjYxMywKKzB4NDAwODQ2MDgsIDB4MEJGRTQ2MDAsIDB4NzEwMTM2MUMsIDB4NkFCMzY4MTMsCisweDQ4MDgzQTZDLCAweDZFQTM0ODAwLCAweDM4MUM5MjBBLCAweDcyRkYzRTJDLAorMHhBMDA2M0I4QywgMHgwNTAyM0EyQywgMHgwNTJBMDUwMywgMHgwNTcyMDUyQiwKKzB4Mzg2ODA1NzMsIDB4RUMwMDNCMkMsIDB4RTA3N0RENDEsIDB4MDVGRTQwMDgsCisweDA2RkU3MDA0LCAweDY0OTNCODcxLCAweDYwODM2NDAzLCAweDY3N0MwN0VDLAorMHg2N0IwMkY3NiwgMHg2NUEwNjZFNCwgMHg2NjZDNjc3QywgMHhCODA4NjU1QywKKzB4N0YwNDY0NEMsIDB4NjFDQzdDMDEsIDB4MzEyM0UyMDgsIDB4OEZFNDJEMDAsCisweEQzMzQ3RDAxLCAweDAwMDk0MzBCLCAweEUwNzk2MjBDLCAweDBGMjQ0MDA4LAorMHg4ODMwNjAyMywgMHhBMjREOEIwMSwgMHg4ODQwMDAwOSwgMHhBMjQ5OEIwMSwKKzB4MjIyODAwMDksIDB4QTI0NThCMDEsIDB4RTVGRjAwMDksIDB4NjU1Q0Q0MkEsCisweEUwM0FFNjAxLCAweDhGMDQzMjUwLCAweEUwNzkwNDY0LCAweDQwMDhFMjEwLAorMHhFMDVCMEYyNCwgMHgwNUZFNDAwOCwgMHgzNTY2OTYzQiwgMHhBMTQ5OEIwMSwKKzB4NjAyMzAwMDksIDB4NjQwQ0NCMDEsIDB4NkUyM0I4NDIsIDB4RTExODY2MEMsCisweDg5MEYzNjEzLCAweDQwMDhFMDYzLCAweDA0RkU0NjA4LCAweDk3Mjk0NjA4LAorMHg0NjAwNzBFMCwgMHgwNUZFMzQ3QywgMHgzNDZDQjg1QywgMHhFMDYwNjIwMywKKzB4MEYyNDQwMDgsIDB4Q0IwMjYwRTMsIDB4NjQwQ0I4MkEsIDB4RTExODY2MEMsCisweDg5MEYzNjEzLCAweDQwMDhFMDYzLCAweDA0RkU0NjA4LCAweDkxMTE0NjA4LAorMHg0NjAwNzBFMCwgMHgwNUZFMzQxQywgMHgzNDZDQjg0NCwgMHhFMDYxNjIwMywKKzB4MEYyNDQwMDgsIDB4Q0IwNTYwRTMsIDB4NjQwQ0I4MTIsIDB4QTAwRDY2MEMsCisweDA5QjRFMDdBLCAweDAwMDAwNjRELCAweDAwMTE0MkZELCAweDAwMTE0MzAxLAorMHgwMDExNDMwOSwgMHgwMDExNDQwMCwgMHgwMDExNDJEOCwgMHg0MDA4RTExOCwKKzB4OEYwNDM2MTMsIDB4RTA2MTBGNjQsIDB4QTAxMDQwMDgsIDB4RTA3QTBERkMsCisweDA2RkM0MDA4LCAweDYyNkM3MEE0LCAweDA0RkU0MjA4LCAweDk3QjQ0MjA4LAorMHg0MjAwNzBFMCwgMHgwNUZFMzQ3QywgMHgzNDJDQjgxNCwgMHhFMDc5NkQwMywKKzB4MDBGQzQwMDgsIDB4Q0IwN0RCOEUsIDB4NDMwQkQzOEUsIDB4NjEwQzY0MEMsCisweDQwMDhFMDdBLCAweDcwOUMwRjE0LCAweEU2MTgwMkZDLCAweDhEMUMzMTYzLAorMHhFMDVENjgyQywgMHgwMUZDNDAwOCwgMHgwOUZDNzBGQywgMHgwNEZFNzBGQywKKzB4RDM4NTY2MUMsIDB4NjU5QzQzMEIsIDB4RTA3QTY1MDMsIDB4MDFGQzQwMDgsCisweDYxMUM3MEE0LCAweDA0RkU0MTA4LCAweDk3ODY0MTA4LCAweDM0N0M0MTAwLAorMHg0MzBCRDM3RSwgMHhBMDAzMzQxQywgMHhFMDYxNkMwMywgMHgwQ0ZDNDAwOCwKKzB4RTUwMEQ2N0IsIDB4NjQwRDg1NjIsIDB4NDAwOEUwNUIsIDB4MEFGRUEwMzYsCisweDYwNTM2NTVDLCAweDMwNUM0MDAwLCAweDQwMDhENjc2LCAweDYyMkQwMjZELAorMHg4RjJBMzJBMCwgMHhEMzc0NkUwMywgMHg2NEFENDMwQiwgMHgyMjI4NjIwRCwKKzB4RDY3Mjg5MjcsIDB4MDY2QzYwRTMsIDB4NDAwOEUwNjAsIDB4NDYwMDAyRkMsCisweDNFNjc2RTJDLCAweDYyNjM4QjAwLCAweDQwMDhFMDYwLCAweDBGMjQzODY3LAorMHg2MjYzOEQwMywgMHg0MDA4RTA2MSwgMHhFMDYxMDJGQywgMHg0MDA4NjFEQywKKzB4MEYyNDMxNjcsIDB4OEYwMTY4MkMsIDB4NjI2MzYyRDMsIDB4MzQ2NzY0Q0MsCisweDZEMjM4RDAxLCAweEEwMDQ2NkMzLCAweDc1MDE2QzYzLCAweDMyNDM2MjVDLAorMHhFMDYwOEJDNiwgMHgwN0ZDNDAwOCwgMHg2MTdDRTQwMCwgMHhFOTA0RDU1QywKKzB4NjY2QzY2NTAsIDB4OEIwMTM2MTcsIDB4NjY3MzY3N0MsIDB4NjI0Qzc0MDEsCisweDI1NjAzMjkzLCAweDc1MDE4RkY0LCAweEUwM0FENjU2LCAweEU0MDAwNTZDLAorMHg4RDAxMjU1OCwgMHhFMjAyNjI0MywgMHg0MDA4RTA2MSwgMHg2NzgzMEVGQywKKzB4M0UyODM4MjgsIDB4OTExOUU1MDAsIDB4NjA1MzY1NUMsIDB4M0ExMDAyQkMsCisweDYyMkM4RDBCLCAweDNBNjA5NjEzLCAweDMyNzc4OTA3LCAweEUwNjE4QjAyLAorMHgwMkZDNDAwOCwgMHhBMDFENjA1MywgMHgyNTU4MEIyNCwgMHgzMjg3ODkwOCwKKzB4NjI4MzhCMDAsIDB4QTAxNTYwNTMsIDB4MDY0RDBCMjQsIDB4MDk5RTA5NkMsCisweDhGMDgzMjc3LCAweEUwN0I2NjIzLCAweDBGMTY0MDA4LCAweDAyRkM3MDk4LAorMHgwMUZFNzA2OCwgMHg2MjZDNjYyQywgMHgzMjg3NjA1MywgMHgwQjY0OEYwMiwKKzB4NjQ2MzM2RTgsIDB4NjI1Qzc1MDEsIDB4OEJDRDMyOTMsIDB4RTAxNEQ2MzUsCisweEU0MDAwNjQ0LCAweEQ1MzQ2MURDLCAweDYyNTBFNzA4LCAweDMyMTc2MjJDLAorMHg2RERDOEIwMSwgMHg3NDAxNjJEMywgMHgzNjczNjY0QywgMHg4RkY0MjUyMCwKKzB4RTQwMDc1MDEsIDB4RDUyRDYxQ0MsIDB4NjIyQzYyNTAsIDB4OEIwMTMyMTcsCisweDYyQzM2Q0NDLCAweDY2NEM3NDAxLCAweDI1MjAzNjczLCAweDc1MDE4RkY0LAorMHgwMDA5QTBFQywgMHg0MDA4RTA3OSwgMHg2NDJDMDJGQywgMHg0MzBCRDMxOSwKKzB4NjYwQzZFNDMsIDB4MzY1M0U1MTgsIDB4RTA2Mzg5MTAsIDB4NDYwODQwMDgsCisweDQ2MDgwNEZFLCAweDcwRTA5NzIyLCAweDM0N0M0NjAwLCAweEQzMTMwNUZFLAorMHgzNDZDNDMwQiwgMHhFMDYyNjIwMywgMHgwRjI0NDAwOCwgMHhDQjA2NjBFMywKKzB4NDMwQkQzMEMsIDB4NjYwQzY0MDMsIDB4MzY1M0U1MTgsIDB4RTA2Mzg5MjgsCisweDQ2MDg0MDA4LCAweDQ2MDgwNEZFLCAweDcwRTA5NzA4LCAweDM0N0M0NjAwLAorMHhEMzA2MDVGRSwgMHgzNDZDNDMwQiwgMHg2QzAzQTAxRCwgMHgwMDAwMDY0RCwKKzB4MDAxMTQyRTgsIDB4MDAxMTQ4RTAsIDB4MDAxMTQ4QkEsIDB4MDAxMTQ5MzQsCisweDAwMTE0MDAwLCAweDAwMTE0MDA4LCAweDAwMTE0Nzc0LCAweDAwMTE0MDExLAorMHgwMDExNDJFNCwgMHgwMDExNDJEOCwgMHgwMDExNDJFRCwgMHgwMDExNDJGNSwKKzB4NDAwOEUwNjIsIDB4NjBFMzBDRkMsIDB4RDM5Q0NCMDgsIDB4NjQwMzQzMEIsCisweEUwN0E2MTBDLCAweDQwMDhFNjE4LCAweDhEMUMzMTYzLCAweEUwNUQwRjE0LAorMHgwN0ZDNDAwOCwgMHgwOUZDNzBGQywgMHgwNEZFNzBGQywgMHhEMzk0NjY3QywKKzB4NjU5QzQzMEIsIDB4RTA3QTY1MDMsIDB4MDFGQzQwMDgsIDB4NjExQzcwQTQsCisweDA0RkU0MTA4LCAweDlENzQ0MTA4LCAweDM0REM0MTAwLCAweDQzMEJEMzhELAorMHhBMDAzMzQxQywgMHhFMDYyNkQwMywgMHgwREZDNDAwOCwgMHhFNTAwRDY4QSwKKzB4NjQwRDg1NjIsIDB4NDAwOEUwNUIsIDB4MDFGRUEwMkMsIDB4NjA1MzY1NUMsCisweDMwNUM0MDAwLCAweDQwMDhENjg1LCAweDYyMkQwMjZELCAweDhGMjAzMjEwLAorMHhEMzgzNkUwMywgMHg2NDFENDMwQiwgMHgyMjI4NjIwRCwgMHhENjgxODkxRCwKKzB4MDY2QzYwRTMsIDB4NDAwOEUwNjIsIDB4NDYwMDAyRkMsIDB4MzE2NzYxMkMsCisweDYyNjM4QjAwLCAweDY0Q0NFMDYyLCAweDM0Njc0MDA4LCAweDhGMDEwRjI0LAorMHg2MjYzNjJDMywgMHgzNTY3NjVEQywgMHg2QzIzOEQwMSwgMHhBMDA0NjZEMywKKzB4NzUwMTZENjMsIDB4MzI0MzYyNUMsIDB4RTA2MjhCRDAsIDB4MDdGQzQwMDgsCisweDYxN0NFNDAwLCAweEU5MDRENTcwLCAweDYyMkM2MjUwLCAweDhCMDEzMjE3LAorMHg2MjczNjc3QywgMHg2NjRDNzQwMSwgMHgyNTIwMzY5MywgMHg3NTAxOEZGNCwKKzB4NjFDQ0U0MDAsIDB4RTcwOEQ1NjksIDB4NjY2QzY2NTAsIDB4OEIwMTM2MTcsCisweDY2QzM2Q0NDLCAweDYyNEM3NDAxLCAweDI1NjAzMjczLCAweDc1MDE4RkY0LAorMHg2MURDRTQwMCwgMHg2NjUwRDU2MiwgMHgzNjE3NjY2QywgMHg2RERDOEIwMSwKKzB4NzQwMTY2RDMsIDB4MzI3MzYyNEMsIDB4OEZGNDI1NjAsIDB4QTAwNTc1MDEsCisweDA2NEQwMDA5LCAweEUyMDBENjVCLCAweDA2MjRFMDNBLCAweEUwM0FENjU5LAorMHgyMjI4MDI2QywgMHhFMDM5ODk0QiwgMHgyMjI4MDI2QywgMHhFMDVCODk0NywKKzB4MEVGRTQwMDgsIDB4M0U2Njk2OTAsIDB4RTA3OTg5NDEsIDB4MDBGQzQwMDgsCisweDhEMDIzRTY2LCAweENCMDI2NDBDLCAweEQzNDQ2NDBDLCAweDAwMDk0MzBCLAorMHhFMDVDNjYwQywgMHgwN0ZDNDAwOCwgMHg0NjA4NzAxQywgMHg2MTdDMDVGRSwKKzB4OTc3QTQ2MDgsIDB4MzU3QzQ2MDAsIDB4NjYxMzM1NkMsIDB4NDMwQkQzNDYsCisweEQ1NDQ2NEUzLCAweDYyMDMyMDA4LCAweDAwMjkxNTBGLCAweDY2MDNDQTAxLAorMHgyNjY4RTAzQiwgMHgwNTY0OEQyMCwgMHhDOEYwNjAyMywgMHhENTNGODkwOSwKKzB4NzZGRjY2NTAsIDB4ODQ1MTI1NjAsIDB4ODA1MTcwRkYsIDB4NzBGRjg0NTIsCisweDYwMjM4MDUyLCAweDg5MEZDODBGLCAweDYyNjBENjM5LCAweDI2MjA3MjAxLAorMHg3MDAxODQ2MSwgMHg4NDYyODA2MSwgMHhBMDA1NzAwMSwgMHhENjMxODA2MiwKKzB4RTAzQkUyMDAsIDB4MTYyRjA2MjQsIDB4NDAwOEUwNUIsIDB4OTY0MzAyRkUsCisweDhCNjUzMjY2LCAweEQ3MkJENDI4LCAweEQ1MkU2MDQwLCAweDQwMjhDOTNGLAorMHg0MDA4NDAwOCwgMHg1MDcyNjIwMywgMHhDODAyRDEyQiwgMHhFNjA0ODkxQSwKKzB4NDYyODQ2MTgsIDB4MjUyMjIyNkIsIDB4RTIwODYwNDAsIDB4NjUwM0M5M0YsCisweDY2MDM0NTA4LCAweDQ1MDA0NTA4LCAweDQ2Mjg0MjE4LCAweDYyNjMyNTJCLAorMHg0MjA4NDIwOCwgMHgyNTJCNDIwMCwgMHg0MjE4RTIwOCwgMHgyNTJCNDIyOCwKKzB4MjE1MkEwNjIsIDB4NDYxOEU2MTQsIDB4MjI2QjQ2MjgsIDB4NjA0MDI1MjIsCisweEM5M0ZFNDI4LCAweDQ1MDg2NTAzLCAweDQ1MDg0MDI4LCAweDQ1MDA0MDA4LAorMHg0MDA4NDQxOCwgMHgyNTRCRTcyOCwgMHg0NzE4NDAwMCwgMHg0NzI4MjUwQiwKKzB4RDQxMjI1N0IsIDB4MjE1MkEwNDQsIDB4MDY0RDA5QjQsIDB4MDAxMTQ4RTAsCisweDAwMTE0OEJBLCAweDAwMTE0OTM0LCAweDAwMTE0MDAwLCAweDAwMTE0MDA4LAorMHgwMDExNDc3NCwgMHgwMDExNDAxMSwgMHgwMDExNDJGRCwgMHgwMDExNDMwMSwKKzB4MDAxMTQzMDksIDB4MDAxMTQyRDgsIDB4MDAxMTRBMjQsIDB4MDAxMTQyRjUsCisweDAwMTE0MkVELCAweDAwMUMzNjk0LCAweDAwMUMzQkI0LCAweDAwMTE0MkU4LAorMHhFMjE0RDQyOSwgMHg0MjE4NjA0MCwgMHg0MDI4QzkzRiwgMHg0MDA4NDAwOCwKKzB4RDYyNjQyMjgsIDB4MjYwMjIwMkIsIDB4RTcyODYwNDAsIDB4NjUwM0M5M0YsCisweDQ1MDg0NTA4LCAweDQ1MDA0MDI4LCAweDQwMDg0NzE4LCAweDQwMDgyNTdCLAorMHg0MDAwRTcyOCwgMHgyNTBCNDcxOCwgMHhEMjFENDcyOCwgMHgyMjUyMjU3QiwKKzB4RDcxQzYyNDAsIDB4MDcyNEUwNDQsIDB4M0YzQzkzMkMsIDB4NEYxNjRGMDYsCisweDZFRjY0RjI2LCAweDZDRjY2REY2LCAweDZBRjY2QkY2LCAweDAwMEI2OUY2LAorMHgyRkU2NjhGNiwgMHg2MjQzRDExNCwgMHhFNDAyODUxMiwgMHg2RTJENjcwRCwKKzB4RTUwMEEwMEYsIDB4NjA1MzY1NUQsIDB4MzA1QzQwMDAsIDB4NDAwOEQxMEYsCisweDYyMkQwMjFELCAweDhCMDMzMkUwLCAweDA0MUM3MTA4LCAweDY0NENBMDA0LAorMHg2MjVENzUwMSwgMHg4QkVEMzI3MywgMHg0NjE4RTYwMiwgMHg2MDREMjQ2OSwKKzB4NkVGNjAwMEIsIDB4MDAwMDAxRjAsIDB4MDAxMTQyRTgsIDB4MDAxQzM2OTQsCisweDAwMUMzQkI0LCAweDAwMTE0MkQ4LCAweDAwMTE0MDAwLCAweDAwMTE0MDA4LAorMHhENzY2RDU2NSwgMHg2MjcyNTE1MSwgMHgzMjFDRTM0MCwgMHg1MTUyMjcyMiwKKzB4MzM3QzUyNzEsIDB4MTcyMTMyMUMsIDB4NTI3MjUxNTMsIDB4MzIxQzY0NEMsCisweDE3MjJEMTVGLCAweDY2MTI1MjU1LCAweDIxNjIzNjJDLCAweDMxNkM1MTczLAorMHg2MTUyMTcxMywgMHhENjVCNTI3NCwgMHgxNzI0MzIxQywgMHg1Mjc1NTE1NCwKKzB4MTcyNTMyMUMsIDB4NTI3NjUxNTgsIDB4MTcyNjMyMUMsIDB4NTE3NzYyNjIsCisweDE3MTczMTJDLCAweDUxNzg1MjYxLCAweDE3MTgzMTJDLCAweDUxNzk1MjYyLAorMHgxNzE5MzEyQywgMHg1MTdBNTI2MywgMHgxNzFBMzEyQywgMHg1MTdCNTI2NCwKKzB4MTcxQjMxMkMsIDB4NTE3QzUyNjUsIDB4MTcxQzMxMkMsIDB4NTE3RDUyNjYsCisweDE3MUQzMTJDLCAweDUxN0U1MjY3LCAweDE3MUUzMTJDLCAweDUyN0Y1MTY4LAorMHgzMjFDRDY0NSwgMHg2MjYyMTcyRiwgMHg3Njk0NjEzMiwgMHgyMzEyMzEyQywKKzB4NTIzMTYxNjIsIDB4MzIxQ0Q2NDEsIDB4NTE1QzEzMjEsIDB4MzUxQzU1MzIsCisweDYxNjIxMzUyLCAweDQxMjk1MjM1LCAweDEzMjUzMjFDLCAweDU2MzY1NTYxLAorMHgzNjVDNDUyOSwgMHgxMzY2RTUzOCwgMHg1NTMxMjQ1MCwgMHg3MTA0NjE0MywKKzB4NjY3MjIxNTIsIDB4NzUwODY1NDMsIDB4NTY3MTI1NjIsIDB4NzUwQzY1NDMsCisweDU2NzIyNTYyLCAweDc1MTA2NTQzLCAweDU2NzUyNTYyLCAweDc1MTQ2NTQzLAorMHg1NjczMjU2MiwgMHg3NTE4NjU0MywgMHg1Njc2MjU2MiwgMHg3NTFDNjU0MywKKzB4NTYzMjI1NjIsIDB4NzUyMDY1NDMsIDB4NjYzMjI1NjIsIDB4NzUyNDY1NDMsCisweDU2NzQyNTYyLCAweDc1Mjg2NTQzLCAweDU2MzQyNTYyLCAweDc1MkM2NTQzLAorMHg1NTMzMjU2MiwgMHg3MjMwNjI0MywgMHg1NTM1MjI1MiwgMHg3MjM0NjI0MywKKzB4NTYzNjIyNTIsIDB4MjQ2Mjc0MzgsIDB4MTM0MUU0MDAsIDB4MTc0MTI3NDIsCisweDE3NDUxNzQyLCAweDE3NDYxNzQzLCAweDIzNDIxMzQyLCAweDEzNDQxNzQ0LAorMHgxMzQ1MTM0MywgMHgxMzQ2MDAwQiwgMHhENTEwRTEyNCwgMHg1MTU3MjQxMCwKKzB4NTI1ODE0MTEsIDB4NTc1OTE0MjIsIDB4NTE1QTE0NzMsIDB4NTI1QjE0MTQsCisweDU3NUMxNDI1LCAweDUyNUQxNDc2LCAweDE0MjdFNzAwLCAweDE0Njg1NjVFLAorMHgxNDY5NTY1RiwgMHgxNTc4MTU3NywgMHgxNTdBMTU3OSwgMHgxNTdDMTU3QiwKKzB4MTU3RTE1N0QsIDB4MTU3RjAwMEIsIDB4MDAxQzM2OUMsIDB4MDAyMDM1MUMsCisweDAwMjAzNTc4LCAweDAwMUMzQ0EwLCAweDAwMUMzNkY0LCAweDAwMUMzQjg4LAorMHg2RTcyNjE1NywgMHgyMTY3NkU2OSwgMHg2OTY4NTQyMCwgMHg2RjY0MjA3MywKKzB4NjU2QzY3NkUsIDB4NzQ2RjZFMjAsIDB4NjU2NTYyMjAsIDB4NjE2MzIwNkUsCisweDcyNjI2OTZDLCAweDY0NjU3NDYxLCAweDAwMDAwMDBBLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCit9OworCitjb25zdCB1MzJfdCB6Y0Z3QnVmSW1hZ2VTaXplPTgzOTY4OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvaGFsL2hwZndzcGl1LmMgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy9oYWwvaHBmd3NwaXUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZGE3ZmY1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvaGFsL2hwZndzcGl1LmMKQEAgLTAsMCArMSw2NTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBBdGhlcm9zIENvbW11bmljYXRpb25zIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworI2luY2x1ZGUgIi4uLzgwMjExY29yZS9jcHJlY29tcC5oIgorCitjb25zdCB1MzJfdCB6Y0Z3SW1hZ2VTUElbXT17CisweDAwMDkwMDBCLCAweDRGMjIyRkU2LCAweEIwMTg3RkZDLCAweEU2MDAwMDA5LAorMHg5NDNERDUyMCwgMHhDODQwNjA1MiwgMHgyRjAyOEYwMywgMHg4RkY5MzY0MiwKKzB4RDQxRDc2MDEsIDB4NEUwQkRFMUQsIDB4RDQxRDAwMDksIDB4MDAwOTRFMEIsCisweDRFMEJENDFDLCAweDdGMDQwMDA5LCAweEEwMjE0RjI2LCAweDRGMjI2RUY2LAorMHhFMjA1RDExOSwgMHgyMTIyRTQwMCwgMHg5MjIyMjE0MiwgMHg4QkZENDIxMCwKKzB4NDUwQkQ1MTYsIDB4RDYxNjAwMDksIDB4MDAwOTQ2MEIsIDB4RTVGRkQ3MTUsCisweDI3NTI2NTVELCAweEUxRkZENzE0LCAweEQ0MTQ1MDc5LCAweDE3MDlDQjAxLAorMHgxNzExMjcxMiwgMHgyNDEyRTEwMSwgMHg0RjI2RDQxMSwgMHgyNDEwMDAwQiwKKzB4REUxMUREMTAsIDB4MDAwOTREMEIsIDB4MDAwOTRFMEIsIDB4MDAwOUFGRkEsCisweDAzRTgyNzEwLCAweDAwMUMwMDFDLCAweDAwMTE2NTk0LCAweDAwMTE0RUJFLAorMHgwMDExNjVBNCwgMHgwMDExNjVCQywgMHgwMDFENDAwNCwgMHgwMDExNEZBMCwKKzB4MDAxMTQzNzgsIDB4MDAxQzM1MTAsIDB4MDAxQzM2MjQsIDB4MDAxRTIxMkMsCisweDAwMTE2NEZDLCAweDAwMTE0NzAwLCAweDAwMTE1ODlDLCAweDJGQTYyRjk2LAorMHgyRkM2MkZCNiwgMHgyRkU2MkZENiwgMHg3RkM4NEYyMiwgMHhEMjhEREQ4QywKKzB4NjFEMzYwRDAsIDB4ODBGNDcxMDEsIDB4NDIwQjYwMTAsIDB4MjAwODgwRjgsCisweDZFMDM4RjEwLCAweERCODlENDg4LCAweEQ0ODk2QTQwLCAweDRCMEJEQzg5LAorMHg2N0MwNjVBQywgMHg2OTdDREU4OCwgMHg0MTA4NjE5MywgMHgzMTk4NDEwOCwKKzB4M0UxQzQxMDgsIDB4NjZEMjg0RjgsIDB4MjAwODYwMEMsIDB4MkU2MjhGMTMsCisweEU0MDA4NEY0LCAweERBODE2NzBDLCAweDMyNzM2MjRELCAweEEwRDM4QjAxLAorMHg2NDREMDAwOSwgMHgzNUFDNjU0MywgMHg2OTQzNjY1MiwgMHgzOUVDNkI2MiwKKzB4QUZGMTE5QjEsIDB4ODgwMTc0MDQsIDB4ODRGNDhCMTUsIDB4MkU3MEU3MDAsCisweERBNzY2RTBDLCAweDMyRTM2MjdELCAweEEwQzQ4QjAxLCAweDY3N0QwMDA5LAorMHg2QzczNjZBMywgMHg2NTczNzYwNCwgMHgzNTZDM0NBQywgMHg2RDUyNjRDMiwKKzB4QUZFRjc3MDgsIDB4RTJCMDI0RDIsIDB4MzAyMDYyMkMsIDB4ODRGNDhCMzAsCisweDY1MENFQzAwLCAweERBNjkxRjUzLCAweDU1RjNFOTA0LCAweDMyNTM2MkNELAorMHhBMEE4OEIwMSwgMHg2Q0NEMDAwOSwgMHg2N0MzNkVBMywgMHg2QkMzN0UwNCwKKzB4M0JFQzM3QUMsIDB4NkVCMjZENzIsIDB4REI2MkQ0NjEsIDB4MDAwOTRCMEIsCisweDQxMEJEMTYxLCAweEQ0NjE2NEQzLCAweDAwMDk0QjBCLCAweDQ1MEJENTVFLAorMHhENDVGNjRFMywgMHgwMDA5NEIwQiwgMHg2MUQzRTYwMCwgMHgzMTZDNjY2RCwKKzB4NjQ2RDc2MDEsIDB4MjFFMDM0OTMsIDB4NEUxOThGRjcsIDB4N0MwOEFGRDUsCisweDYyMkNFMkIxLCAweDhCMTEzMDIwLCAweEQ1NTJENDU2LCAweERBNTZEQzRGLAorMHgwMDA5NDUwQiwgMHg0QTBCRTQwMCwgMHhENzU0NjdDMiwgMHg0NzBCREI1MiwKKzB4NEIwQjAwMDksIDB4RTkwMEU0MDMsIDB4MkU5MEEwNkQsIDB4NjIyQ0UyQjIsCisweDg5NjgzMDIwLCAweDYyMkNFMkIzLCAweDhCMUQzMDIwLCAweERBNDVENDRDLAorMHg0QTBCRDk0MiwgMHg2NTk2MDAwOSwgMHg2NzkyRDQ0QSwgMHgxRjc0REQzQiwKKzB4MUY1RDREMEIsIDB4RDYzOUQ0NDgsIDB4NDYwQkRCNDgsIDB4NTVGNDU1RjQsCisweDRCMEJEOTM2LCAweEQ0NDY1NEZELCAweDQ5MEI2NTAzLCAweDVERjUxRjA1LAorMHgxRUQxRUMwNCwgMHgyRUMwQTA0NywgMHg2MjJDRTJCNCwgMHg4QjNFMzAyMCwKKzB4REEzNEQ0NDAsIDB4NEEwQkREMzEsIDB4ODRGNDAwMDksIDB4NjAwQzZDRDIsCisweDFGMDcyRjAyLCAweDFGQzZDOTAzLCAweEU2MDAxRjA4LCAweEQ3M0FFMDMwLAorMHg2Q0YyREIzQSwgMHgxRjc5MEY2NSwgMHhBMDIxMUZCQSwgMHg1MUY2RTkwNCwKKzB4NkQ2MzY2NkQsIDB4NEMxNTM2RUMsIDB4RDIzNTNEMUMsIDB4MUY2QjhGMDUsCisweDg5MDIzQzkzLCAweEEwMDI2NEQzLCAweEU1MDQ1NUY4LCAweDQyMEI2NEQzLAorMHg1QkZCMDAwOSwgMHhENjE5NTRGQSwgMHg0NjBCNjVEMywgMHg1NEY5MUIwMSwKKzB4REExNjU1QjEsIDB4N0NGQzRBMEIsIDB4MDZGREUwMzAsIDB4MEY2NTc2MDQsCisweDYyNkQ1NUY3LCAweDhCREEzMjUzLCAweEEwMDQ4NEY0LCAweEQ0MjUyRTAwLAorMHg0MjBCRDIwRSwgMHg3RjM4NjVEMiwgMHg2RUY2NEYyNiwgMHg2Q0Y2NkRGNiwKKzB4NkFGNjZCRjYsIDB4NjlGNjAwMEIsIDB4RTYwMDYxNjMsIDB4NDEwOUEwMDQsCisweDc2MDE2MjU2LCAweDc0MDQyNDIyLCAweDhCRjkzNjEyLCAweDAwMDkwMDBCLAorMHgwMDExNzgwMCwgMHgwMDExNUZGMCwgMHgwMDExNjRGNiwgMHgwMDExNEYyQywKKzB4MDAxMTY1QzAsIDB4MDAxMTY0RjUsIDB4MDAxMTYxMUMsIDB4MDAxMTc4MDQsCisweDAwMTE2NUUwLCAweDAwMTE0RUJFLCAweDAwMTE0RjAyLCAweDAwMTE2NUY0LAorMHgwMDExNjVGQywgMHgwMDExNjYwMCwgMHgwMDExNEJGMCwgMHgwMDExNDhGQywKKzB4MDAxMTY2MTgsIDB4MDAxMTY2MzQsIDB4MDAxMTY2NDAsIDB4MDAxMTRFNTYsCisweDAwMTE2NjRDLCAweDAwMTE2NjU4LCAweDAwMTE2NjdDLCAweDAwMTE2NjcwLAorMHgwMDExNEJDNCwgMHgwMDExNjY4OCwgMHgyRjk2MkY4NiwgMHgyRkI2MkZBNiwKKzB4MkZENjJGQzYsIDB4NEYyMjJGRTYsIDB4RTUwMDdGRDgsIDB4NjQ1M0UxMTAsCisweDZDNTM0MTI4LCAweDY1NURFRTBBLCAweDQ2MDg2NjUzLCAweDQ2MDgzNjVDLAorMHgzNjFDNzUwMSwgMHg2NzVENjA0MywgMHg2MEMzMEY2NiwgMHgzN0UzRUQwMCwKKzB4ODE2MTI2QzEsIDB4ODE2MzgxNjIsIDB4MTZEMzE2RDIsIDB4OEZFQTE2RDQsCisweDY4RjI3NDA0LCAweERBQjNEOUIyLCAweDI5ODIxOTgxLCAweEQxQjI1OUYxLAorMHgyQTkyMUE5MSwgMHg1QkYzNUFGMiwgMHg1RUY1NURGNCwgMHgxMUExNTRGNiwKKzB4MTFCMzIxQTIsIDB4MTFENTExQjIsIDB4MTFFNzExRDQsIDB4MTE0OTExRTYsCisweDU1RjcxMTQ4LCAweEVFMDBEQkE5LCAweEREQTk1N0Y4LCAweEQ2QTk1MkY5LAorMHgxQjUxNjRFMywgMHhEQkE4MkI1MiwgMHhFQUI4RDhBOCwgMHgyRDcyRTk0NSwKKzB4NkFBQzI2MjIsIDB4NkVFRDQ5MDgsIDB4NEQwODZERTMsIDB4M0RFQzYxRTMsCisweDREMDg0MTA4LCAweDNEQkMzMUVDLCAweDQxMDg2MEMzLCAweDgxRDEyREMxLAorMHg0MTA4RTA1MCwgMHg0MTA4NDAwOCwgMHg2MEMzODFEMiwgMHhFNTAwMzE4QywKKzB4ODFEMzM0QTIsIDB4MUQxMzFERDIsIDB4OEQwMUQ0OTQsIDB4RDQ5MTFENTQsCisweEIwODE2NUQzLCAweDY0RUQ3RTAxLCAweDhCREMzNDkyLCAweERCOTREMThELAorMHhEMjhCNjgxMiwgMHgxQjgxNDgyOSwgMHgyRkQyNjQxMiwgMHgyQjkyNjk0RCwKKzB4RDk4QTY3MjIsIDB4MUI3MzQ3MjksIDB4RDc4NzY4MjIsIDB4MUJBMjZBOEQsCisweEQyOEM2QjcyLCAweDIyQjJENTg2LCAweEUwMDM1RDcyLCAweDVFNzQxMkQyLAorMHgxMkU0NDAxOCwgMHhENjg4NTE3NiwgMHg1NDc4MTIxNiwgMHgxMjQ4RTFGRiwKKzB4RDQ4NTY3OTIsIDB4Njg1MjEyN0EsIDB4MjhDMUU3MDMsIDB4ODE5MTY5NTIsCisweDZBNTJFMDUwLCAweDgxQTI0MDA4LCAweDYwQzM2QjUyLCAweDZENTI4MUIzLAorMHg2RTUyMUREMiwgMHg2MjUyMUU2MywgMHgxMjY0RTYwMCwgMHg0NjA4NjU2MywKKzB4NzUwMTM2NEMsIDB4NjY1RDI2MTIsIDB4OEJGODM2NzMsIDB4RTAwM0Q0NzEsCisweDQwMTg2NTQyLCAweDY3NDIyNUMxLCAweDgxNzFEMjc0LCAweEVFMDA2ODQyLAorMHg2OTQyMTg4MiwgMHgxOTIzRTAyNCwgMHhFNTgwNkE0MiwgMHg2QjQyMUFFNCwKKzB4ODFCMjY2RTMsIDB4RDQ2RDZDNDIsIDB4NjU1QzgxQzMsIDB4NkQ2MzY2NkQsCisweDYxNkQ3NjA0LCAweDMxNTMzRDRDLCAweDJERTI4RkY4LCAweEQ1NjlEMjY4LAorMHg3NDA0MjQyMiwgMHg3RjI4MjQ1MiwgMHg2RUY2NEYyNiwgMHg2Q0Y2NkRGNiwKKzB4NkFGNjZCRjYsIDB4MDAwQjY5RjYsIDB4NjY0MjY4RjYsIDB4QzgwMzYwNjEsCisweEU1MDA4RDA0LCAweEM5MDM2MDYxLCAweDhCMDM4ODAyLCAweDY1NjM1MjYyLAorMHgyNDEyNTEyNCwgMHg2MDUzMDAwQiwgMHgyRkU2MkZENiwgMHg3RkVDNEYyMiwKKzB4NjI1MzZFNTMsIDB4NkQ0M0U1NTAsIDB4NDUwOEU0MDAsIDB4RTEwMUEwMDEsCisweDYwNDM1MjI0LCAweDgxMjEyMjExLCAweDYwNTM4MTIzLCAweDU2RTI4MTIyLAorMHg4QkY1MzYyMCwgMHgxNkU0RDI1MCwgMHhFNjE0NjRGMywgMHg2NUUzNDIwQiwKKzB4RTRGQzY1RTEsIDB4MkU1MTI1NDksIDB4NjVGMzYxRjEsIDB4MkYxMTIxNDksCisweEQxNDk1NEQxLCAweEU2MTQ0MTBCLCAweDYwNzE1N0QxLCAweDI3MDFDQjAxLAorMHg3RjE0MURFMSwgMHg2RUY2NEYyNiwgMHg2REY2MDAwQiwgMHgyRkU2MkZENiwKKzB4N0ZFQzRGMjIsIDB4NjY1MzZFNTMsIDB4NkQ0M0U1RkMsIDB4MjA1OTYwNjEsCisweDI2MDFDQjAxLCAweDMyNjA1MkUyLCAweDEyRTQ4QjA2LCAweDMxRTA1MUUyLAorMHg1MkQxOEIwNCwgMHgxRTIyQTAwMiwgMHg1NjY0QUZGMCwgMHg2NEYzRDIzNiwKKzB4NDIwQkU2MTQsIDB4NjdFMTY1RTMsIDB4MjcxOUUxRkMsIDB4NjdGMTJFNzEsCisweDI3MTk1NEQxLCAweDY1RjNEMTMwLCAweDQxMEJFNjE0LCAweDUyRDEyRjcxLAorMHhDQjAxNjAyMSwgMHgxREUxMjIwMSwgMHg0RjI2N0YxNCwgMHgwMDBCNkVGNiwKKzB4MkZFNjZERjYsIDB4NjI0QzRGMjIsIDB4NDIwOERFMUIsIDB4QTAwNTQyMDAsCisweDUyNTIzRTJDLCAweDU2MjRENDE3LCAweDJFNjJCRjhFLCAweDUyRTE2NUUyLAorMHg4QkY2MzUyMCwgMHgyNjIyRDYxQiwgMHgwMDBCNEYyNiwgMHgyRkI2NkVGNiwKKzB4MkZENjJGQzYsIDB4NEYyMjJGRTYsIDB4REIxQ0RDMTAsIDB4NjZDMjUyQzEsCisweDg5NDAzNjIwLCAweEM5MDM2MDYxLCAweDg5M0M4ODAxLCAweEREMThERTBCLAorMHg2NEUzQkY2MywgMHg4NTAzNjUwMywgMHg2MjBENjZCMiwgMHg4OTJCMzI2MiwKKzB4QkY5QkQ0MDMsIDB4RDQxMzAwMDksIDB4MDAwOTREMEIsIDB4MDAwOUFGRTYsCisweDAwMTE2MERDLCAweDAwMTE2MEU0LCAweDAwMTE2MEVDLCAweDAwMTE2MTE0LAorMHgwMDExNjRGOCwgMHgwMDExNjUwMCwgMHgwMDEwMDBDOCwgMHgwMDEwMTY4MCwKKzB4MDAxRTIxMDgsIDB4MDAxQzNEMDAsIDB4MDAxMTc4ODAsIDB4MDAxMTc3ODAsCisweDAwMDQwMDIwLCAweDAwMjZDNDAxLCAweDAwMTE0MkY4LCAweDAwMTE2NERDLAorMHgwMDExNEVCRSwgMHgwMDExNjY5QywgMHg2NEUzQkYzRSwgMHg0RDBCRDQwNiwKKzB4QUZCQjAwMDksIDB4RDIwNTAwMDksIDB4NEYyNjIyNjIsIDB4NkRGNjZFRjYsCisweDAwMEI2Q0Y2LCAweDAwMDA2QkY2LCAweDAwMTE2NkEwLCAweDAwMUMzRDI4LAorMHgyRjk2MkY4NiwgMHgyRkI2MkZBNiwgMHgyRkQ2MkZDNiwgMHg0RjIyMkZFNiwKKzB4RDIzQzdGRkMsIDB4QzgwMzYwMjIsIDB4MkYwMThGM0QsIDB4MDAwOUEwNjEsCisweEM5MDM2MDYxLCAweDg5M0I4ODAxLCAweEQyMzhEODM3LCAweDQyMEJEOTM4LAorMHhFNDAwNjQ4MywgMHg2QTAzNkQwMywgMHg1QzAyNDkwQiwgMHhEMjM2REIzNSwKKzB4NTZEMzg1RDIsIDB4NjUwRDY0MjIsIDB4NEIwQkU3NDAsIDB4RDEzMjZFMDMsCisweDY0MTI2RUVELCAweDIxNDIzNEVDLCAweDNEQzA1REQ0LCAweDg1RDI4QkVGLAorMHg3MEZGNTZEMywgMHhFNzQwNjUwRCwgMHg2QzAzNEIwQiwgMHg0OTBCREIyQSwKKzB4NjZCMkU0MDMsIDB4MzZDQzZDQ0QsIDB4RTcwMEQ5MjgsIDB4MkI2MkU1QzgsCisweDY0NzNFNjUwLCAweDQ5MEJEQzI2LCAweDY0ODM2NTVDLCAweDY1QTM0QzBCLAorMHhFRTAxRDEyNCwgMHhEMTFDMjFFMiwgMHg2NjEyNTIxMSwgMHg4QkJGMzYyMCwKKzB4REQyMkRFMjEsIDB4REMyM0RCMjIsIDB4NjVEMjUyRDEsIDB4ODkxODM1MjAsCisweEM5MDM2MDUxLCAweDg5MTQ4ODAxLCAweEQxMTRENDFDLCAweDAwMDk0MTBCLAorMHgzNkUwNTYwMywgMHg2NTAzOEYwNCwgMHgyQjIwRTIwMSwgMHgyQzUyQUZFQywKKzB4RDIxM0Q0MTksIDB4MDAwOTQyMEIsIDB4RTEwMUQ2MTgsIDB4QUZFMzQxMTgsCisweDYwRjEyNjEyLCAweDg5MDJDODA0LCAweDQyMEJEMjE1LCAweDdGMDQwMDA5LAorMHg2RUY2NEYyNiwgMHg2Q0Y2NkRGNiwgMHg2QUY2NkJGNiwgMHgwMDBCNjlGNiwKKzB4MDAwMDY4RjYsIDB4MDAxRTIxMDAsIDB4MDAxMTYwRTQsIDB4MDAxMTQ1M0EsCisweDAwMTE0QkYwLCAweDAwMTE0RTBDLCAweDAwMTE2NzE0LCAweDAwMTE1OUIwLAorMHgwMDExNDU1OCwgMHgwMDFFMjEyQywgMHgwMDExNzg4MCwgMHgwMDExNjBEQywKKzB4MDAxMTY0RkMsIDB4MDAxMTY0RjgsIDB4MDAxMTYxMTQsIDB4MDAxQzNEMzAsCisweDAwMTE0MENDLCAweEQ2QzJENUMxLCAweDI2MjI2MjUyLCAweEM4MDE2MDYwLAorMHgwMDBCOEJGQSwgMHgyRkU2MDAwOSwgMHhCRkYzNEYyMiwgMHhEMkJEMDAwOSwKKzB4RTQwNUUxMDAsIDB4MjI0MDIyMTIsIDB4NjQyMkRFQjgsIDB4RTcwMEQ1QjgsCisweDI1NzIxRTQyLCAweEM5OEY4NDUxLCAweEM5RjBDQjEwLCAweDgwNTFDQjAyLAorMHhDQjAyNjA1MCwgMHg2MjUyMjUwMCwgMHgyRTIyQkZEQywgMHhENkIyNTBFNCwKKzB4NEYyNjI2MDIsIDB4NkVGNjAwMEIsIDB4NEYyMjJGRDYsIDB4MDAwOUJGREIsCisweDYyMENEREFFLCAweDYwRDAyRDIyLCAweDg5MDZDODAxLCAweDAwMDlCRkQzLAorMHgyRDIyNjIwQywgMHhDODAxNjBEMCwgMHg0RjI2OEJGOCwgMHg2REY2MDAwQiwKKzB4NEYyMjJGRTYsIDB4NkU0M0JGRTgsIDB4RTEwMEQyQTIsIDB4MjJFMDIyMTIsCisweDY0MjJENTlFLCAweEU2MDBERTlFLCAweDJFNjIxNTQyLCAweEM5RjA4NEUxLAorMHg4MEUxQ0IwMSwgMHhDQjAyNjBFMCwgMHg2N0UyMkUwMCwgMHg0RjI2MjU3MiwKKzB4NkVGNkFGQTgsIDB4RTQwNkFGRTQsIDB4RTQwNEFGRTIsIDB4QkZGOTRGMjIsCisweEU0QzcwMDA5LCAweDY0NENCRkRDLCAweDRGMjZBRkY2LCAweEU0MDZBRkQ4LAorMHhFNDA0QUZENiwgMHg0RjIyMkZFNiwgMHg2RTQzQkZGOCwgMHhENThERDI4RCwKKzB4RTQwMUUxMDAsIDB4MjIxMjYwRTMsIDB4ODA1MTIyNDAsIDB4NjYyMkQxODcsCisweEU3MDBERTg3LCAweDJFNzIxMTYyLCAweEM5RjA4NEUxLCAweDgwRTFDQjAyLAorMHhDQjAyNjBFMCwgMHg2MkUyMkUwMCwgMHgyMTIyQkY3QywgMHhBRkRGNEYyNiwKKzB4MkZENjZFRjYsIDB4NEYyMjJGRTYsIDB4QkZDQjZENTMsIDB4QkY5QjZFNDMsCisweEQyN0MwMDA5LCAweDIyRTA2MUQzLCAweDYwMjJERTdELCAweDQxMTgyMUU5LAorMHgyMDFCQzlGRiwgMHgyMjAyRDU3NywgMHhENjc2ODQ1MywgMHg2MEQzODA1MSwKKzB4RDQ3MjgwNTMsIDB4RDE3MjY3NjIsIDB4MTQ3MkVEMDAsIDB4ODQxMTIxRDIsCisweENCMDRDOUYwLCAweDYwMTA4MDExLCAweDIxMDBDQjAyLCAweEJGNTE2MjEyLAorMHg0RjI2MjQyMiwgMHhBRkE3NkVGNiwgMHg2NTQzNkRGNiwgMHhBRkQwRTREOCwKKzB4NjU0MzY0NEMsIDB4QUZDQ0U0RDgsIDB4MkZDNjY0NEMsIDB4MkZFNjJGRDYsCisweDZFNTM0RjIyLCAweEJGNjc2RDQzLCAweEQ3NjI2QzYzLCAweDI3RDBEMjY0LAorMHg2MUUzNjA3MiwgMHg0MTE4MjEyOSwgMHgyMDFCQzlGRiwgMHgyNzAyRDQ1RCwKKzB4RDE1Qjg0NDMsIDB4NjBFMzgwNDEsIDB4REU1ODgwNDMsIDB4RTYwMDY0NzIsCisweDIxNjIxRTQyLCAweDY1REM4NDExLCAweDYwQzM2MjAzLCAweDQwMDhDOTA3LAorMHg2NzAzNDAwOCwgMHhFMjlGNjAyMywgMHg2MjJDQzk4RiwgMHgzNTIwMjA3QiwKKzB4ODAxMThEMTgsIDB4N0MwNDg0MTEsIDB4NjBDMzY2MDMsIDB4NjIwM0M5MEYsCisweEM5RjA2MDYzLCAweDgwMTEyMDJCLCAweDg4MEI2MDUzLCAweDg0MTE4QjE0LAorMHhDOTBGNjYwMywgMHhDOTBGNzAwMSwgMHg2MDYzNjIwMywgMHgyMDJCQzlGMCwKKzB4ODAxMUEwMEEsIDB4N0MwMTg0MTEsIDB4NjBDMzY2MDMsIDB4NjIwM0M5MEYsCisweEM5RjA2MDYzLCAweDgwMTEyMDJCLCAweENCMDI2MDEwLCAweDYyMTIyMTAwLAorMHgyRTIyQkVGMCwgMHhENjNDNTBFNCwgMHg0RjI2MjYwMiwgMHg2REY2NkVGNiwKKzB4NkNGNjAwMEIsIDB4MkZDNjJGQjYsIDB4MkZFNjJGRDYsIDB4NkM2MzRGMjIsCisweDZFNDM2RDUzLCAweDZCNzNCRjM2LCAweDAwMDlCRjA2LCAweDYxRDNEMjMxLAorMHhERTMzMjJFMCwgMHgyMUU5NjAyMiwgMHhDOUZGNDExOCwgMHhENDJEMjAxQiwKKzB4ODQ0MzIyMDIsIDB4ODA0MUQ3MkYsIDB4ODA0MzYwRDMsIDB4NjYyMkQ0MjcsCisweDE0NjJEMTI3LCAweDE0QzMyN0MyLCAweDIxQzJFQzAwLCAweDdCMDQ4NDExLAorMHg2MEIzNkQwMywgMHg2NTAzQzkwRiwgMHhDOUYwNjBEMywgMHg4MDExMjA1QiwKKzB4Q0IwMjYwMTAsIDB4NjIxMjIxMDAsIDB4NEYyNjI0MjIsIDB4NkRGNjZFRjYsCisweEFFQUY2Q0Y2LCAweDJGQjY2QkY2LCAweDJGRDYyRkM2LCAweDRGMjIyRkU2LAorMHg2QzUzNkQ2MywgMHhCRUZENkU0MywgMHhCRUNENkI3MywgMHhEMjE1MDAwOSwKKzB4MjJFMDYxQzMsIDB4NjAyMkRFMTYsIDB4NDExODIxRTksIDB4MjAxQkM5RkYsCisweDIyMDJEMTEwLCAweEQ2MEY4NDEzLCAweDYwQzM4MDExLCAweERFMEI4MDEzLAorMHhENDBCNjc2MiwgMHhFQzAwNkJCRCwgMHgxRUI1MUU3MiwgMHg4NDQxMjRDMiwKKzB4QzlGMDRCMjEsIDB4ODA0MUNCMDQsIDB4RTE0MDYwNDAsIDB4MjQwMENCMDYsCisweEU1MDA2MjQyLCAweDRCMjEyRTIyLCAweDQxMjhBMDE0LCAweDAwMUQxMjAwLAorMHgwMDExNjUyOCwgMHgwMDExNjUzMCwgMHgwMDExNjUzOCwgMHgwMDExNjU0NCwKKzB4MDBGRkZGRkYsIDB4MDAxMTY1MzQsIDB4NjA1MzY1NUQsIDB4MDZERTQwMDgsCisweDIxNjI3NTAxLCAweDMyQjM2MjVELCAweDRGMjY4QkY2LCAweDZERjY2RUY2LAorMHhBRTVGNkNGNiwgMHg0RjIyNkJGNiwgMHhCRjczNjc3QywgMHhBRUIzNjQ0QywKKzB4NEYyMjRGMjYsIDB4QkZBNjY3N0QsIDB4QUVBRDY0NEMsIDB4NEYyMjRGMjYsCisweEU1MDBFNDlGLCAweEJGMDhFNjAzLCAweDRGMjY2NDRDLCAweDYwMEMwMDBCLAorMHhFNDlGNEYyMiwgMHhFNjAzRTUwMCwgMHg2NDRDQkVGRiwgMHg0RjI2NDAxOSwKKzB4NjAwRDAwMEIsIDB4NjU0MzY2NUMsIDB4RTQwM0FFRjcsIDB4NjU0MzY2NUMsCisweEU0MEJBRUYzLCAweEQxNzVENjc0LCAweDYwNDM2MjYyLCAweEM4MDEyMTIyLAorMHg4RjAxNjAxMCwgMHhDOUVGQ0IxMCwgMHg2MjEyMjEwMCwgMHgyNjIyMDAwQiwKKzB4NEYyMjJGRTYsIDB4RTAwMDRGMTMsIDB4QkUyQzQwMUUsIDB4RDU2QzZFNDMsCisweDI1MjI2MjBDLCAweEU0MDFCRkU2LCAweDYwNjNENjY5LCAweDYwRUNDRjgwLAorMHg4OTA3MjAwOCwgMHg4OTA5ODgwMSwgMHg4OTBEODgwMiwgMHg4OTExODgwMywKKzB4MDAwOUEwMTMsIDB4QzlFMzYwNjAsIDB4MjYwMEEwMEYsIDB4Q0IxMDYwNjAsCisweENCMDRDOUY3LCAweDI2MDBBMDA5LCAweENCMTA2MDYwLCAweENCMDhDOUZCLAorMHgyNjAwQTAwMywgMHhDQjFDNjA2MCwgMHhENTU5MjYwMCwgMHhCRTYxNjI1MiwKKzB4RTQwMDY0MkMsIDB4NEYyNjRGMTcsIDB4NkVGNkFGQkMsIDB4MkY5NjJGODYsCisweDJGQjYyRkE2LCAweDJGRDYyRkM2LCAweDRGMjIyRkU2LCAweDYwQzM2QzdDLAorMHg2QTYzODgwMiwgMHg2OTUzOEYwOSwgMHg2NTQzNjI5MCwgMHg2NjJDRTRBRiwKKzB4QkVGN0U3MDEsIDB4QTAwQTY0NEMsIDB4MkNDODAwMDksIDB4ODgwMTg5MDEsCisweDY1NDM4QjA1LCAweEU2MDBFNEFGLCAweEJFRUJFNzAxLCAweEJERDE2NDRDLAorMHhFRDAxMDAwOSwgMHhERTQzRUJBRiwgMHhFODAwQTAyQywgMHgwMDA5QkRGNCwKKzB4NjBDM0QxNDEsIDB4ODgwMkUyMDAsIDB4RDU0MDIxMjIsIDB4MjFCMDhEMDYsCisweDg5MDgyQ0M4LCAweDg5MEE4ODAxLCAweDAwMDlBMDBDLCAweDAwOUM2MEQzLAorMHhBMDA3RDYzOSwgMHhEMjM4ODA2MSwgMHhBMDAzNjA4MywgMHhEMjM2ODAyMSwKKzB4ODAyMTYwRDMsIDB4RDEzNTY0MTIsIDB4MUU0MkU2MDAsIDB4ODQ1MTIxNjIsCisweEM5RjA3RDAxLCAweDgwNTFDQjAyLCAweENCMDI2MDUwLCAweDY3MTIyNTAwLAorMHgyRTcyQkRBMCwgMHg4QkQxM0RBMiwgMHgwMDA5QkRGNiwgMHgwMDA5QkRBMywKKzB4NjIwQ0Q2MjcsIDB4NEYyNjI2MjIsIDB4NkRGNjZFRjYsIDB4NkJGNjZDRjYsCisweDY5RjY2QUY2LCAweDY4RjYwMDBCLCAweEU3MDJBRjk4LCAweDJGOTYyRjg2LAorMHgyRkI2MkZBNiwgMHgyRkQ2MkZDNiwgMHg0RjIyMkZFNiwgMHgzRjNDOTMzMSwKKzB4MEY1NjkwMzAsIDB4RThGRjcwRkMsIDB4Njg4QzBGNDYsIDB4RTkwMEEwNDksCisweDQwMThFMDEwLCAweEU1MDQwNEZFLCAweEJGMzMzNDlDLCAweDg4RkY2QTQzLAorMHg5MDFGODkzRSwgMHhFMTEwMENGRSwgMHg0MTE4M0M5OCwgMHg4QjAzM0MxNiwKKzB4NjRBM0JFMUIsIDB4MDAwOUEwMzEsIDB4NDAxOEUwMTAsIDB4RUQwMDBCRkUsCisweEEwMDczQkNDLCAweDY0RDM2RUYzLCAweEJGMUYzNEJDLCAweDJFMDBFNTAxLAorMHg3RTAxN0QwMSwgMHg4QkY2M0RDMiwgMHg2NEEzQkUwNywgMHhBMDFBRUQwMCwKKzB4RUZGODZFRjMsIDB4MDAwMDEwMDQsIDB4MDAxRDEyMDQsIDB4MDAxMTY1MkMsCisweDAwMTE2NTQ0LCAweDAwMUQxMjAwLCAweDAwMTE2NTMwLCAweDAwMTE2NTI4LAorMHg2NjZDNjZFMCwgMHg4OTA0MzY4MCwgMHgzNUJDNjVEMywgMHhCRTUxRTcwMSwKKzB4N0QwMUU0MDIsIDB4M0RDMjdFMDEsIDB4RTExMDhCRjIsIDB4MzkxQzQxMTgsCisweDkwNTQ3OTA0LCAweDM5MTIwMUZFLCAweDkzNTE4QkIyLCAweDRGMjYzRjNDLAorMHg2REY2NkVGNiwgMHg2QkY2NkNGNiwgMHg2OUY2NkFGNiwgMHg2OEY2MDAwQiwKKzB4Njc2RDYyNTMsIDB4NjYyMzY1NDMsIDB4RTQwMkFFQzMsIDB4MkZBNjJGOTYsCisweDJGQzYyRkI2LCAweDJGRTYyRkQ2LCAweDY5N0Q0RjIyLCAweDRBMjE2QTkzLAorMHg0QTA4NEEyMSwgMHg2QzQzNkQ2MywgMHhBMDA4NkI3MywgMHg2NEMzNkU1MywKKzB4NjY5MzY1RDMsIDB4NkJCREJGRTQsIDB4M0RBQzNDQkMsIDB4NkVFRjNFQjgsCisweDhCRjQyRUU4LCAweDRGMjZFMDAwLCAweDZERjY2RUY2LCAweDZCRjY2Q0Y2LAorMHgwMDBCNkFGNiwgMHgyRkE2NjlGNiwgMHgyRkM2MkZCNiwgMHgyRkU2MkZENiwKKzB4RUMwMDRGMjIsIDB4NkI1MzZFQzMsIDB4QTAwNjZENDMsIDB4NjREM0VBMDEsCisweDY1QTNCRUE4LCAweDdEMDEzQzBDLCAweDNFQjI3RTAxLCAweDYwQzM4QkY3LAorMHg2RUY2NEYyNiwgMHg2Q0Y2NkRGNiwgMHgwMDBCNkJGNiwgMHgxMDA0NkFGNiwKKzB4MDAwMDEwMDgsIDB4MDAwOTAwMEIsIDB4MkZENjJGQzYsIDB4NEYyMjJGRTYsCisweDZENDM2QzUzLCAweEVFMDBBMDA0LCAweDdFMDE2NEQ0LCAweDY0NENCRkYyLAorMHg4QkY5M0VDMiwgMHg2RUY2NEYyNiwgMHgwMDBCNkRGNiwgMHhFNTAwNkNGNiwKKzB4NjY0M0EwMDIsIDB4NzYwMTc1MDEsIDB4MjIyODYyNjAsIDB4QUZFMzhCRkEsCisweDJGRTYwMDA5LCAweDc1MDc2MjUzLCAweEUxMDg2NzUzLCAweDYwNDNFRTBBLAorMHg0NDA5QzkwRiwgMHg2NTAzMzBFMiwgMHg4RDAxNDQwOSwgMHhFNjMwRTYzNywKKzB4NDExMDM2NUMsIDB4OEZGMjI3NjAsIDB4RTAwMDc3RkYsIDB4MDAwQjgwMjgsCisweDRGMjI2RUY2LCAweEJGRTQ3RkVDLCAweEJGRDg2NUYzLCAweDdGMTQ2NEYzLAorMHgwMDBCNEYyNiwgMHg0RjIyRTAwMCwgMHhCRkRBN0ZFQywgMHg2NEYzNjVGMywKKzB4NzQwNkJGQ0QsIDB4NEYyNjdGMTQsIDB4RTAwMDAwMEIsIDB4NEYyMjJGRTYsCisweDYyNTM3RkVDLCAweDY1RjM2RTQzLCAweDY0MjNCRkNCLCAweDY0RTNCRkJGLAorMHg2NEYzQkZCRCwgMHhCRkJBRDQwMywgMHg3RjE0MDAwOSwgMHgwMDBCNEYyNiwKKzB4MDAwMDZFRjYsIDB4MDAxMTY2QTQsIDB4RTRGREQyOUEsIDB4RDc5QTYxMjIsCisweDIyMTIyMTQ5LCAweDc0MDE2MDIyLCAweDIyMDJDQjAxLCAweEQ1OTc2NjIyLAorMHgyMjYyMjY0OSwgMHhDODQwNjA3MCwgMHg2MDUyODkwMiwgMHgyNTAyQ0IwNCwKKzB4RTFGNzY0NTIsIDB4MjU0MjI0MTksIDB4RTcwMTYwNTIsIDB4MjUwMkM5Q0YsCisweEU2MDI2MDUyLCAweDI1MDJDQjAzLCAweDE1NjI0NzE4LCAweDE1NzMwMDBCLAorMHhENzhDRDU4QiwgMHhENDhERDI4QywgMHhFNjAwRTEwMCwgMHgyNzExMjUxMSwKKzB4QUZEMTIyMTAsIDB4NjY0QzI0NjEsIDB4NDYwMEQyODksIDB4NjA2MDM2MkMsCisweDAwMEJDQjEwLCAweDY1NEMyNjAwLCAweDQ1MDBEMjg1LCAweDY2NTAzNTJDLAorMHgyNjE5RTFFRiwgMHgyNTYwMDAwQiwgMHhEMjgyNjY0QywgMHgzNjJDNDYwMCwKKzB4Q0IxMDYwNjAsIDB4MjYwMDAwMEIsIDB4RDI3RTY1NEMsIDB4MzUyQzQ1MDAsCisweEUxRUY2NjUwLCAweDAwMEIyNjE5LCAweDY2NEMyNTYwLCAweDQ2MDBEMjc4LAorMHg2MDYwMzYyQywgMHgwMDBCQ0IwOCwgMHg2NTRDMjYwMCwgMHg0NTAwRDI3NCwKKzB4NjY1MDM1MkMsIDB4MjYxOUUxRjcsIDB4MjU2MDAwMEIsIDB4RDI3MTY2NEMsCisweDM2MkM0NjAwLCAweENCMDg2MDYwLCAweDI2MDAwMDBCLCAweEQyNkQ2NTRDLAorMHgzNTJDNDUwMCwgMHhFMUY3NjY1MCwgMHgwMDBCMjYxOSwgMHg2MjRDMjU2MCwKKzB4NDIwMEQ2NjcsIDB4NjAyMDMyNkMsIDB4NDAyMUM5MDgsIDB4NDAyMTQwMjEsCisweDYwMEMwMDBCLCAweEQ2NjM2MjRDLCAweDMyNkM0MjAwLCAweEM5MDg2MDIwLAorMHg0MDIxNDAyMSwgMHgwMDBCNDAyMSwgMHhEMTVGNjAwQywgMHgzNDFDNjQ0QywKKzB4MDAwQjYyNDAsIDB4RDE1RDYwMkMsIDB4MzQxQzY0NEMsIDB4MDAwQjYyNDAsCisweDJGRTY2MDJDLCAweDZFNDM0RjIyLCAweEU2MEE2NDVDLCAweDg5MTQzNDY3LAorMHgwMDA5QkZFQiwgMHg2MEVDNjQwQywgMHg4QjAyODgwMSwgMHhBMDAyRTAwRiwKKzB4NDQwOTI0MDksIDB4NjI0QzQ0MDksIDB4MzI2M0U2MEEsIDB4QkZFMjg5MDUsCisweDYyMEM2NDRDLCAweEM4ODA2MDIzLCAweEUyMDA4QjAwLCAweDRGMjY2MDIzLAorMHg2RUY2MDAwQiwgMHhENjRBNEYyMiwgMHg4ODAxNjA2MiwgMHhCMjQ1OEIwMywKKzB4QTAwMzAwMDksIDB4RDI0NzAwMDksIDB4MjI2MEU2NDAsIDB4RTIwMEQ2NDYsCisweDAwMEI0RjI2LCAweDRGMjIyNjIyLCAweDYwNjJENjQxLCAweDhCMDE4ODAyLAorMHgwMDA5QjI4RSwgMHhFMjAwRDY0MCwgMHgwMDBCNEYyNiwgMHhENTNDMjYyMiwKKzB4RTEwMEQ0M0MsIDB4MjUxMkU3MDEsIDB4MjQ3MDAwMEIsIDB4RTYwNEQyMzksCisweDIyNjAwMDBCLCAweEQ0Mzk0RjIyLCAweDQxMEJEMTM5LCAweEQ1MzkwMDA5LAorMHg2NjUwRTFGRCwgMHgyNjE5RDIzOCwgMHgyNTYwRTcwMCwgMHgwMDBCNEYyNiwKKzB4NEYyMjIyNzAsIDB4RDEzMkQ0MzUsIDB4MDAwOTQxMEIsIDB4RTdGQkQ1MzEsCisweDI2Nzk2NjUwLCAweDAwMEI0RjI2LCAweDRGMjIyNTYwLCAweEQxMkNENDMwLAorMHgwMDA5NDEwQiwgMHhFN0Y3RDUyQiwgMHgyNjc5NjY1MCwgMHgwMDBCNEYyNiwKKzB4RDUyODI1NjAsIDB4NjI1MDk0MkQsIDB4MDAwQjIyNDksIDB4RDUyNTI1MjAsCisweDYyNTBFNEJGLCAweDAwMEIyMjQ5LCAweDRGMjIyNTIwLCAweDg1MjJEMjI1LAorMHgyMDA4NjAwRCwgMHg4ODAxODkxMSwgMHg4ODAzODkxMywgMHg4ODA1ODkxNSwKKzB4ODgwNjg5NDIsIDB4ODgwODg5NDgsIDB4ODgwOTg5NEUsIDB4ODgwQTg5NTQsCisweDg4MEI4OTVBLCAweEEwNjc4OTYwLCAweEIwNjkwMDA5LCAweEEwNjQwMDA5LAorMHhCMDc3NjAwQywgMHhBMDYwMDAwOSwgMHhCMDgwNjAwQywgMHhBMDVDMDAwOSwKKzB4RkY3RjYwMEMsIDB4MDAxRTIxNDgsIDB4MDAxRTEwMDAsIDB4MDAxRTExMDgsCisweDAwMTE2NTcwLCAweDAwMTE2NTcyLCAweDAwMTE2NTkxLCAweDAwMTE2NTU0LAorMHgwMDFFMTAzRiwgMHgwMDFFMTA1RiwgMHgwMDFFMTAyRiwgMHgwMDFFMTA5MCwKKzB4MDAxMTY1NzgsIDB4MDAxRTEwMEIsIDB4MDAxMTY1NzQsIDB4MDAxMTY2QTgsCisweDAwMTE0RUJFLCAweDAwMUUxMDI4LCAweDAwMTE2NTkwLCAweDAwMTE2NkI0LAorMHgwMDExNjZDNCwgMHgwMDExNjU0OCwgMHg2MjYwRDY4NCwgMHg4QjJCMjIyOCwKKzB4MDAwOUIwNjEsIDB4NjAwQ0EwMjksIDB4NjI2MEQ2ODAsIDB4OEIyMzIyMjgsCisweDAwMDlCMDY5LCAweDYwMENBMDIxLCAweDYyNjBENjdDLCAweDhCMUIyMjI4LAorMHgwMDA5QjBDNywgMHg2MDBDQTAxOSwgMHg2MjYwRDY3OCwgMHg4QjEzMjIyOCwKKzB4MDAwOUIwQ0QsIDB4NjAwQ0EwMTEsIDB4NjI2MEQ2NzQsIDB4OEIwQjIyMjgsCisweDAwMDlCMTI1LCAweDYwMENBMDA5LCAweDYyNjBENjcwLCAweDhCMDMyMjI4LAorMHgwMDA5QjEzRCwgMHg2MDBDQTAwMSwgMHg0RjI2RTAwMCwgMHgwMDA5MDAwQiwKKzB4RDI2Q0QxNkIsIDB4RDU2Qzg0MTIsIDB4NDAwMEM5MEYsIDB4RDc2QjAxMkQsCisweEU0MDNENjZCLCAweEUyMEY2MTFDLCAweDI1NDBFMDAxLCAweDI1MjAyNzEyLAorMHgyNjAyMDAwQiwgMHhFNjAxRDI2MiwgMHgzMDY2ODUyMywgMHhFMDAwOEQwNSwKKzB4RDY2M0QyNjAsIDB4RTAwMTgxMjIsIDB4MDAwQjI2MDIsIDB4RDI1QzAwMDksCisweDYwMEQ4NTIzLCAweDg5MDUyMDA4LCAweDhCMEE4ODAxLCAweDYwNjBENjVELAorMHgyNjAwQ0IwMSwgMHhENDU3RDY1QSwgMHhFMDAxRTEwMSwgMHgwMDBCMjYxMiwKKzB4MDAwQjgxNDIsIDB4RDE1MkUwMDAsIDB4ODUxM0U1MDEsIDB4NjQwRDQ1MTgsCisweDY2MDMzNDUzLCAweEUwMDA4RDA1LCAweEQ1NTFEMjUzLCAweDIyNjBFMDAxLAorMHgwMDBCMjUwMiwgMHg0RjIyMDAwOSwgMHg4NTEzRDE0OSwgMHg2NDUzNjUwRCwKKzB4NjI0OTQ0MTksIDB4MjI3RDY3MkUsIDB4ODgwMTYwMkMsIDB4ODgwMjg5MDksCisweDg4MDM4OTEwLCAweDg4MDY4OTFBLCAweDg4MDc4OTM1LCAweEEwNEM4OTNCLAorMHhENTQ2MDAwOSwgMHg2NjUyRDc0NiwgMHgyNzYyRDQ0NiwgMHg2MjJDNjI2MSwKKzB4MjQyMUEwMzgsIDB4MjIyODYyNUMsIDB4RDQ0MzhCM0YsIDB4NjY0MkQ1NDAsCisweDI1NjJENDQwLCAweDI0MDE4NTYxLCAweDYyMDNBMDJDLCAweDIwMDg2MDVDLAorMHg4ODEwODkwNywgMHg4ODIwODkwOCwgMHg4ODMwODkwOSwgMHhBMDJDODkwQSwKKzB4RDIzQTAwMDksIDB4NjIyMkEwMDgsIDB4QTAwNUQyMzksIDB4RDIzOTYyMjIsCisweDYyMjJBMDAyLCAweDYyNjJENjM4LCAweEQ0MzJENTMxLCAweDY2MjEyNTIyLAorMHhBMDBGNjI2QywgMHhENjM1MjQyMSwgMHg2MjYxRDUyRCwgMHg2MjJDRDQyRCwKKzB4QTAwNzI1NjIsIDB4RDYzMjI0MjEsIDB4ODU2MUQ1MjksIDB4MjU2MkQ0MjksCisweDYyMDMyNDAxLCAweDY2MkQ4NTE1LCAweDM2MTc2MTBELCAweDY1MDM4RjAxLAorMHhCMENCMjQ1MSwgMHhBMDAxMDAwOSwgMHhFMDAwRTAwMSwgMHgwMDBCNEYyNiwKKzB4RDYxOTAwMDksIDB4RDQyN0UxMDEsIDB4NjU0MTI2MTAsIDB4RDExOEQ3MTcsCisweEUyMEY2NTVELCAweDI3NTJFMDAxLCAweDAwMEIyNjIwLCAweDJGRTYyMTAyLAorMHhEMjBGNEYyMiwgMHg2NDBDODUyMywgMHg4QjA4MjQ0OCwgMHhENTExRDYxRCwKKzB4MjYyMUUyMDAsIDB4OTQwRjg0NTEsIDB4QTA0ODIwNDksIDB4REUwRDgwNTEsCisweEM4NDA2MEUwLCAweEUyMDE4RDMyLCAweDg5NDQzNDI3LCAweEQyMTZENjE1LAorMHgyNjQxNDIwQiwgMHgwMDA5QTAzMCwgMHgwMDAwRkY3RiwgMHgwMDExNjU5MSwKKzB4MDAxMTY1NDgsIDB4MDAxMTY1NTQsIDB4MDAxRTExMDAsIDB4MDAxRTEwMEMsCisweDAwMTE2NTc0LCAweDAwMUUxMDAwLCAweDAwMUUxMDAxLCAweDAwMTE2NTdDLAorMHgwMDExNjU1QywgMHgwMDExNjU2MCwgMHgwMDExNjU2NCwgMHgwMDExNjU4MCwKKzB4MDAxMTY1ODQsIDB4MDAxMTY1ODgsIDB4MDAxMTY1OEMsIDB4MDAxMTY3NzQsCisweDAwMTE2NzdFLCAweDAwMTE2NTZFLCAweDAwMTE1RENBLCAweDg5MTIzNDI3LAorMHhEMjk0RDY5MywgMHgyNjQxNDIwQiwgMHhDQjgwODRFMSwgMHg4MEUxQjBGNSwKKzB4RDY5MTYwRTAsIDB4MkUwMENCMDQsIDB4QzkzRjYwNjAsIDB4RDY4RjI2MDAsCisweEEwMDFFMDAxLCAweEUwMDAyNjAyLCAweDAwMEI0RjI2LCAweEQ2OEM2RUY2LAorMHhDODgwNjA2MCwgMHhEMjg2ODkxOSwgMHg4ODAxNjAyMSwgMHhEMjg5OEIxNSwKKzB4ODUyNEU1MDEsIDB4ODkxMDMwNTYsIDB4RTIwM0QxODcsIDB4MjEyMEQ0ODcsCisweEUwMEI2NTQxLCAweDA2NTY2NTVELCAweEU0MEZENTg1LCAweDIxNDBFNzAyLAorMHhENzdFMjU3MSwgMHgwMDBCRTAwMSwgMHgwMDBCMjcwMiwgMHgyRkU2RTAwMCwKKzB4REU4MDRGMjIsIDB4Qzg4MDg0RTEsIDB4RDU3QTg5MkMsIDB4MjAwODg1NTQsCisweDYxMDM4RjI4LCAweDg1NTNENzdDLCAweDY0MDM2NjcyLCAweDg1NjY2NTBDLAorMHgzNTIwNjIwQywgMHhENjc5OEIxRSwgMHg2NTFDRDc3NCwgMHgyNjUxNjQ0QywKKzB4NjBFMDI3NDEsIDB4ODkwNEM4NDAsIDB4NDIwQkQyNzUsIDB4QTAwMzAwMDksCisweEQyNjgwMDA5LCAweDAwMDk0MjBCLCAweDAwMDlCMDlGLCAweEUyMDFEMTY3LAorMHg2MEUwMjEyMiwgMHhDQjA0RDQ2NCwgMHg2MDQwMkUwMCwgMHgyNDAwQzkzRiwKKzB4NjAyM0EwMDEsIDB4NEYyNkUwMDAsIDB4NkVGNjAwMEIsIDB4MkZCNjJGQTYsCisweDJGRDYyRkM2LCAweERBNjIyRkU2LCAweDY2QTFFMjQwLCAweDM2MjJEQzVFLAorMHg2MjYzODkwMCwgMHg2RUQzNkQyQywgMHg0RTIxMzZEOCwgMHg0RTIxMkE2MSwKKzB4REI2MUQ0NjAsIDB4RTcwMEEwMEYsIDB4NzcwMTYyQjIsIDB4NzEwMjYxMjMsCisweDY2MjEyQjEyLCAweDcxMDI2MjEzLCAweDYxMjEyQjEyLCAweDY1MUQ2NjZELAorMHgzNTZDNDUyOCwgMHg2MjdDMjQ1MiwgMHg4QkVEMzJFMywgMHhDOTAzNjBEMywKKzB4OEIxMDg4MDMsIDB4NjE3MzY3QjIsIDB4MkIxMjcxMDIsIDB4NzEwMjZFMTMsCisweDJCMTI2NTcxLCAweDY1NUQ2REUxLCAweDQyMjg2MkRELCAweDMyNUNFMTA3LAorMHhBMDBDMkMxMCwgMHg4ODAyMjQyMiwgMHhBMDAzOEIwMSwgMHg4ODAxRTIwMywKKzB4RTIwMThCMDUsIDB4NjZCMjJDMjAsIDB4NjU1RDY1NjEsIDB4RTYwRjI0NTIsCisweDY3QTEyQzYwLCAweDhCMDUyNzc4LCAweEREMzhEQzQ0LCAweEVCMDFFQTAwLAorMHgyREIyMkNBMiwgMHg2REY2NkVGNiwgMHg2QkY2NkNGNiwgMHg2QUY2MDAwQiwKKzB4MkZFNjJGRDYsIDB4RTI0MEREMzYsIDB4MzYyMjY2RDEsIDB4NjI2Mzg5MDAsCisweDM2Nzg2NzJDLCAweDc3MDNERTM4LCAweDQ3MjEyRDYxLCAweDY0RTJENjM1LAorMHhBMDBFNDcyMSwgMHg2NTYyRTEwMCwgMHg2MjUzNzEwMSwgMHg3NDAxMjQ1MCwKKzB4MjQyMDQyMTksIDB4NDUyOTc0MDEsIDB4NzQwMTI0NTAsIDB4MjQ1MDQ1MTksCisweDYyMUM3NDAxLCAweDhCRUUzMjczLCAweDY2RTI0MjAwLCAweDQyMDA2MUQxLAorMHgyMTE4MzYyQywgMHgyRTYyOEYwNiwgMHhERDFDRDcyOCwgMHhFNTAxRTQwMCwKKzB4MkQ1MjI3NDIsIDB4MDAwQjZFRjYsIDB4MkZENjZERjYsIDB4NEYyMjJGRTYsCisweEVEMEFFRTAxLCAweDY0RTNCQzk3LCAweEJDOUM2NEUzLCAweDYyRUM3RTAxLAorMHg4QkY3MzJENywgMHhCQzlGRUUwMSwgMHg2NEUzNjRFMywgMHg3RTAxQkNBNCwKKzB4MzJENzYyRUMsIDB4NEYyNjhCRjcsIDB4MDAwQjZFRjYsIDB4RDExODZERjYsCisweEQ0MTg5MjBELCAweDcyMTIyMTIyLCAweDI0MjJENjE3LCAweEQ3MTc3MjA0LAorMHg3MjIwMjYyMiwgMHgyNzIyRDExNiwgMHgwMDBCNzIzMCwgMHgxMzdBMjEyMiwKKzB4MDAxMTY1NkUsIDB4MDAxMTVFRDYsIDB4MDAxRTEwMTUsIDB4MDAxMTY1NzQsCisweDAwMUUxMDAxLCAweDAwMTE2NTQ4LCAweDAwMUUxMTAwLCAweDAwMTE2NTcyLAorMHgwMDExNjU2MCwgMHgwMDFFMTAwMCwgMHgwMDExNjU2NCwgMHgwMDExNjU3MCwKKzB4MDAxMTVEQ0EsIDB4MDAxRTEwMEMsIDB4MDAxMTY1NUMsIDB4MDAxMTY1NzgsCisweDAwMTE2NTdDLCAweDAwMTE2NTgwLCAweDAwMTE2NTg0LCAweDAwMTE2NTg4LAorMHgwMDExNjU4QywgMHg0RjIyMkZFNiwgMHhENjUwN0ZGQywgMHg4ODAxNjA2MCwKKzB4RTIwMTg5NTEsIDB4MjYyMEJGQkIsIDB4RDU0RUQxNEQsIDB4REU0RTYwMTAsCisweDY0RTM2NTUyLCAweDc0MDJDODQwLCAweDhEMjJEMTRDLCAweEQyNEM3NTAyLAorMHhFNjAxRDc0QywgMHhFNzA0MjcyMiwgMHg3NjAxNjI1NSwgMHg2MjZDMjQyMSwKKzB4OEZGOTMyNzMsIDB4RDQ0Mzc0MDIsIDB4NjI0MkU2MDEsIDB4NjQwRDg1MjgsCisweDY3NDk0NDE5LCAweDI3NUQ2NTdFLCAweDgxRTQ2MDdDLCAweEU0MTdENTQyLAorMHg2NzU1NzYwMSwgMHgzMjQzNjI2QywgMHg4RkY5MjE3MSwgMHhBMDIwNzEwMiwKKzB4RDIzRTAwMDksIDB4RTYwMUQ3M0IsIDB4RTcwNDI3MjIsIDB4NzYwMTYyNTUsCisweDYyNkMyNDIxLCAweDhGRjkzMjczLCAweEQ0MzI3NDAyLCAweDYyNDJFNjAxLAorMHg2NDBEODUyOCwgMHg2NzQ5NDQxOSwgMHgyNzVENjU3RSwgMHg4MUU0NjA3QywKKzB4RTQxN0Q1MzMsIDB4Njc1NTc2MDEsIDB4MzI0MzYyNkMsIDB4OEZGOTIxNzEsCisweDkyNEE3MTAyLCAweEQyMjYyRTIxLCAweDVFMjNENzJFLCAweDY0RjIyRkUyLAorMHg2MDQzNjVGMiwgMHgyNzAwQzk4MCwgMHhDOTYwNjA0MywgMHg4MDcxNjEwMywKKzB4QzkwMzYwNDMsIDB4ODA3MjQ1MTksIDB4NjVGMjYwNUMsIDB4ODE3MjY2RjIsCisweDQ2MTk0NjI5LCAweDYwNkM0NTI5LCAweDQwMTg2NDVDLCAweDgxNzMzMDRDLAorMHgyMTE4NUUyMywgMHg2NEYyMkZFMiwgMHg2RTRDNjJGMiwgMHg2MDJDNDIxOSwKKzB4NjZGMjYyRjIsIDB4NDYyOTQwMTgsIDB4NDYxOTMwRUMsIDB4NDIyOTgxNzQsCisweDY1MkM2MDZDLCAweDMwNUM0MDE4LCAweDgxNzU4RjA3LCAweDAwMDlCQzlELAorMHgyMjI4NjIwQywgMHhBMDBBODkwOCwgMHg2MDEzMDAwOSwgMHg4QjAzODg0MCwKKzB4MDAwOUIwMDksIDB4MDAwOUEwMDMsIDB4RTIwMkQ2MEYsIDB4N0YwNDI2MjIsCisweDAwMEI0RjI2LCAweDAwMEI2RUY2LCAweDA2MEEwMDA5LCAweDAwMTE2NTkwLAorMHgwMDFFMTAwMCwgMHgwMDExNjU3QywgMHgwMDExNjc3NCwgMHgwMDExNjc4MCwKKzB4MDAxMTY3MTgsIDB4MDAxMTY1NjQsIDB4MDAxMTY3NDgsIDB4MDAxMTY3NDYsCisweDAwMTE2NzFBLCAweDAwMTE2NTQ4LCAweDAwMTE2NTc0LCAweDRGMjIyRkU2LAorMHg4NEU5REU4RSwgMHgyNDQ4NjQwQywgMHhCMThCODkwMSwgMHhEMjhDMDAwOSwKKzB4MjY2ODY2MjAsIDB4NjBFMDg5MDIsIDB4MkUwMEM5QkYsIDB4MDAwQjRGMjYsCisweDAwMEI2RUY2LCAweDJGRTYwMDA5LCAweERFODY0RjIyLCAweDYwRTBENjg2LAorMHhDQkMwRDQ4NiwgMHg2MjYwMkUwMCwgMHhDODAzNjAyQywgMHg0MDIxODkwNCwKKzB4NzAwMTQwMjEsIDB4NjYwM0EwMDIsIDB4NjYwMzQwMDksIDB4RDY4MDYxNkQsCisweEU1MDBBMDA0LCAweDc1MDE2MjYyLCAweDc0MDQyNDIyLCAweDMyMTM2MjVELAorMHhEMjdDOEJGOCwgMHgwMDA5NDIwQiwgMHhDOUJGODRFMiwgMHg0RjI2ODBFMiwKKzB4NkVGNjAwMEIsIDB4MkZFNjJGRDYsIDB4N0ZGQzRGMjIsIDB4NjI2MEQ2NzYsCisweDg5NDAyMjI4LCAweEQ1NkRFMTAwLCAweDYwNTAyNjEwLCAweENCNDBENDczLAorMHgyNTAwNDQwQiwgMHg4RDA1MjAwOCwgMHg2MkUwNkUwMywgMHg3MTA0NjEyQywKKzB4MkYxMUEwMDYsIDB4RDQ2RUQ2NjYsIDB4REQ2RTY3NjAsIDB4NjU3QzREMEIsCisweEUyM0M2RDFELCAweDhCMDMzRDI3LCAweEQyNkNENDZCLCAweDAwMDk0MjBCLAorMHg0RDIxNEQyMSwgMHhBMDA1RDc2QSwgMHg2NkU2RTQwMCwgMHgzNTdDNDUwOCwKKzB4NzQwMTI1NjIsIDB4MzVEMzY1NEQsIDB4RDc2NjhCRjcsIDB4NkU3MkUwMDMsCisweDgxRTE0MDE4LCAweDZFNzI2MEYxLCAweDgxRTI3MDBDLCAweEQ0NjI2MTcyLAorMHhERDYyODExMywgMHg2NTcyNEQwQiwgMHhENjUyRDI2MSwgMHgyMjEyRTEwMSwKKzB4QzkzRjYwNjAsIDB4N0YwNDI2MDAsIDB4NkVGNjRGMjYsIDB4NkRGNjAwMEIsCisweDJGQzYyRkI2LCAweDJGRTYyRkQ2LCAweEQyNUE0RjIyLCAweDZCNDM2RTczLAorMHg0MjBCNkM1MywgMHgyMDA4NkQ2MywgMHg2MTAzOEYwOCwgMHhEMjRGRDQ1NiwKKzB4NkVGNjRGMjYsIDB4NkNGNjZERjYsIDB4NkJGNjQyMkIsIDB4MjFCMDYwQzMsCisweDYwRDM4MDExLCAweEU1MDA4MTExLCAweDY0QkNBMDA3LCAweDYwNTM2NTVELAorMHg2NjUzMDBFQywgMHg3NTAxMzYxQywgMHg2MjVEODA2NCwgMHg4QkY1MzI0MywKKzB4NjA2MEQ2MzYsIDB4MjYwMEM5QkYsIDB4NkVGNjRGMjYsIDB4NkNGNjZERjYsCisweDZCRjYwMDBCLCAweDdGQzQ0RjIyLCAweDcyMDI2MkYzLCAweDIyNTEyRjQxLAorMHg0NTI5NzIwMiwgMHg2MDYzMjI1MSwgMHhFNUM0RTY4MiwgMHg2N0YzODEyMSwKKzB4NjU1QzY2NkMsIDB4RTQwOEJGQkMsIDB4NEYyNjdGM0MsIDB4MDAwOTAwMEIsCisweDJGOTYyRjg2LCAweDJGQjYyRkE2LCAweDJGRDYyRkM2LCAweDRGMjIyRkU2LAorMHhFMTAwN0ZDNCwgMHg2NTEzRUNGRiwgMHg2QjEzNkNDRCwgMHhERTM0RDczMywKKzB4RURGRjY0RjMsIDB4RDgzM0VBMDQsIDB4NjA1MzY1NUMsIDB4MDI3RDQwMDAsCisweDMyQzA2MjJELCAweDY2MDM4RDBELCAweDA5RUQ2MDYzLCAweDI0OTEwMjdELAorMHgyNDIxNzQwMiwgMHg2OTgyMDJFRCwgMHgzOTI4NjIyRCwgMHg3NDAyMjg5MiwKKzB4NzUwMTcxMDQsIDB4NjA2MzYyNUMsIDB4MDdENTMyQTIsIDB4MEVCNThGRTQsCisweDI0NDg2NDFDLCAweEU2ODA4OTA1LCAweDY3RjNFNUM1LCAweEJGN0Y2NjZDLAorMHg3RjNDNjU1QywgMHg2RUY2NEYyNiwgMHg2Q0Y2NkRGNiwgMHg2QUY2NkJGNiwKKzB4MDAwQjY5RjYsIDB4RDExQzY4RjYsIDB4NjAxMkQyMUMsIDB4Q0IyMEU0MDUsCisweDIxMDJFNTAwLCAweDAwMEIyMjQyLCAweDAwMDAyMjUyLCAweDAwMUUxMDE3LAorMHgwMDExNjRGNiwgMHgwMDFFMTAxNSwgMHgwMDFFMTBCRiwgMHgwMDExNzgwMCwKKzB4MDAxRTEwRkMsIDB4MDAxMTQwQ0MsIDB4MDAxMTY0RkMsIDB4MDAxMTYwMkUsCisweDAwMTE2NkQwLCAweDAwMTE0RjJDLCAweDAwMTE2NkVDLCAweDAwMTE0RUJFLAorMHgwMDExNzg4QywgMHgwMDExNjRGOCwgMHgwMDExNjBEQywgMHgwMDExNDVCQywKKzB4MDAxRTIxMzAsIDB4MDAxMTVGRjAsIDB4MDAxMTY2RjQsIDB4MDAxMTY1MTAsCisweDAwMTE2NTE4LCAweDAwMTE2NzEwLCAweDAwMUMzNTAwLCAweDAwMUQ0MDA0LAorMHhENTY1RDE2NCwgMHhFNDAwRDc2NSwgMHgyMTQyRTIwRiwgMHgxNzQxMTE1NCwKKzB4RDU2MzI3MjIsIDB4OTY2OUQ3NjMsIDB4MTU0MTI1NzIsIDB4OTY2NjE1NjIsCisweEU2MDExNTY1LCAweEQ1NjAxMTY1LCAweDY2NkNFNkY4LCAweDI1NDIyNTQyLAorMHgyNTQyMjU0MiwgMHgyNTQyMjU0MiwgMHgyNTYyMjU0MiwgMHg3NjAxRTcyNywKKzB4Njc2MzI1NzIsIDB4MjU2Mjc3OTcsIDB4RTcwNDI1NzIsIDB4MjU3MkUyNDgsCisweEUyMTkyNTIyLCAweEUyNzAyNTIyLCAweDI1NDIyNTQyLCAweDI1NDIyNTQyLAorMHgyNTIyMjU0MiwgMHgyNTIyRTIwQywgMHgyNTQyMjU0MiwgMHgyNTQyMjU0MiwKKzB4MjU0MjI1NDIsIDB4MjU0MjI1NDIsIDB4MDAwQjE1NEEsIDB4RTIwODExNDUsCisweDAwMDk0MjJCLCAweDJGRTYyRkQ2LCAweDdGRkM0RjIyLCAweEM4MjA2MDQzLAorMHg2RTQzOEQwMiwgMHgwMDA5QkU3NSwgMHhDODEwNjBFMywgMHhCRTcyODkwMSwKKzB4NjBFMzAwMDksIDB4ODkwMUM4NDAsIDB4MDAwOUJFOTQsIDB4QzgwMTYwRTMsCisweEREM0U4OTM4LCAweEM4MDI2MEQwLCAweDJGMDA4RDAzLCAweDQ2MEJENjNDLAorMHg2MEYwMDAwOSwgMHg4OTAyQzgwNCwgMHg0NjBCRDYzQSwgMHg2MkYwMDAwOSwKKzB4Qzg4MDYwMjMsIDB4NjBEMDg5MDIsIDB4MkQwMEM5N0YsIDB4QzgwMTYwMjMsCisweEQ2MzU4OTA2LCAweDAwMDk0NjBCLCAweDAwMDlBMDA3LCAweDUxNjMwNjAxLAorMHg4OTAyQzgwOCwgMHg0NjBCRDYzMSwgMHg2MEYwMDAwOSwgMHg4OTAyQzgxMCwKKzB4NDIwQkQyMkYsIDB4RDUyRjAwMDksIDB4ODgwMjYwNTIsIDB4RDIyRThCMDMsCisweEEwMDVFNjA0LCAweDg4MDEyMjYwLCAweEQyMkI4QjAyLCAweDIyNjBFNjAxLAorMHgyNTIyRTIwMCwgMHhDODgwNjBFMywgMHhENjI4ODkyRSwgMHg2MEUzNkU2MCwKKzB4ODkwMkM4ODAsIDB4NDIwQkQyMjYsIDB4NjBFMzAwMDksIDB4ODkwMkM4NDAsCisweDQyMEJEMjI0LCAweDYwRTMwMDA5LCAweDg5MDJDODAyLCAweDQyMEJEMjIyLAorMHg2MEUzMDAwOSwgMHg4OTBFQzgwNCwgMHg0MTBCRDEyMCwgMHhCRjEyMDAwOSwKKzB4QkY0RDAwMDksIDB4RDUxRTAwMDksIDB4NjA1MEQ0MUUsIDB4QzkwOEQ3MUUsCisweEJGODQyNTAwLCAweDYwRTMyNDcyLCAweDg5MDVDODA4LCAweDdGMDREMjFCLAorMHg2RUY2NEYyNiwgMHg2REY2NDIyQiwgMHg0RjI2N0YwNCwgMHgwMDBCNkVGNiwKKzB4MDAwMDZERjYsIDB4MDAxQzU4MUMsIDB4QTAwMEEwMDAsIDB4MDAxRDAxMDAsCisweDAwMUQ0MDAwLCAweDAwMDQwMDIxLCAweDAwMUM1ODlDLCAweDAwMUUxMDIxLAorMHgwMDExNTBDNCwgMHgwMDExNTBFNiwgMHgwMDExNTcyNCwgMHgwMDExNTBGRSwKKzB4MDAxMTUxMEMsIDB4MDAxMTY1NzQsIDB4MDAxRTEwMEIsIDB4MDAxRTEwMjgsCisweDAwMTE1MTYyLCAweDAwMTE1MTZFLCAweDAwMTE1MTE0LCAweDAwMTE1MTMyLAorMHgwMDFFMTAwMCwgMHgwMDEwRjEwMCwgMHgxMjM0NTY3OCwgMHgwMDExNTE0QSwKKzB4NjQ0Q0Q2QTcsIDB4MDAwQjM0NkMsIDB4RDZBNjI0NTAsIDB4MzQ2QzY0NEMsCisweDI0NTAwMDBCLCAweDY0NENENkE0LCAweDAwMEIzNDZDLCAweDYyNUMyNDUwLAorMHg0MjA4NjE2RCwgMHg0MjA4NDExOSwgMHg0MjAwNjAxOSwgMHg2NzBFNjE0QywKKzB4RDQ5RTMyMUMsIDB4NDIwMDIwN0QsIDB4MzI0Q0M5MEYsIDB4MjIwMDAwMEIsCisweDQyMDg2MjVDLCAweDQyMDA0MjA4LCAweDMyNEM2NDRDLCAweDQyMDBENDk4LAorMHgwMDBCMzI0QywgMHgyRkU2MjI2MCwgMHg2MTRDNEYxMiwgMHg0MTAwRDQ5MywKKzB4NjcxMDMxNEMsIDB4RTI5RjY2NkQsIDB4MjcyOTQ2MTksIDB4NkU1MzYyNjksCisweDY3MkU2NTczLCAweDQyMjEyMjdELCAweDQyMjE0MjIxLCAweDc2MDE2NjJDLAorMHhFNDAxNDYwOCwgMHgzNEU4NDYwOCwgMHg2NDRDNDYwMCwgMHgwNzFBMDQ2NywKKzB4MjE1MDI1N0IsIDB4MDAwQjRGMTYsIDB4NEYyMjZFRjYsIDB4RDI4NTdGRTgsCisweDg4MDE2MDIxLCAweEQyODQ4QjdCLCAweDI2Njg2NjIxLCAweEQyODM4Qjc3LAorMHgyNjY4NjYyMSwgMHhFNTBGOEI3MywgMHhFNDAxQkZBMiwgMHhCRkE0RTUwMSwKKzB4RTU4NkU0MDAsIDB4RTQwMDY1NUMsIDB4MkY1MEJGQTQsIDB4QkZBMUU0MDEsCisweEU2MDJFNTA2LCAweDYwNjM0NjE4LCAweDgxRjJFNDAxLCAweDY1NDNCRjlGLAorMHhFNDAxODVGMiwgMHhCRkFCNjU0MywgMHg4NUYyNjYwMywgMHg2NTQzRTQwMSwKKzB4NjYwM0JGQjEsIDB4RTQwMjY1RjAsIDB4NjA1Mzc1NkMsIDB4ODBGOEJGODAsCisweEJGODJFNDAyLCAweDg0RjhFNTEyLCAweDcwOTBFNDAyLCAweDY1MDNCRjgyLAorMHg0NjE4RTYwMiwgMHg4MUY2NjA2MywgMHhCRjgwRTQwMiwgMHg4NUY2RTUwMCwKKzB4NjYwM0U0MDIsIDB4RTUwMEJGOEMsIDB4RTQwMjg1RjYsIDB4QkY5MjY2MDMsCisweEU1RkVFNTAwLCAweEUwMTA2NTVDLCAweEJGNjFFNDAzLCAweEU1MTMwRjU0LAorMHhFNDBFQkY2MywgMHgwNUZDRTAxMCwgMHhCRjYzRTQwRSwgMHhFNTAwNzU4NSwKKzB4QkY2NEU0MDMsIDB4RTUwMEU2NDAsIDB4QkY3MUU0MDMsIDB4RTUwMEU2NDAsCisweEJGNzhFNDAzLCAweEU1RkZFNjQwLCAweEUwMTQ2NTVDLCAweEJGNDdFNDA0LAorMHhFNDBGMEY1NCwgMHhFNTA0QkY0OSwgMHgwNUZDRTAxNCwgMHhCRjQ5RTQwRiwKKzB4RTUwMTc1ODQsIDB4QkY0QUU2NDAsIDB4RTUwMUU0MDQsIDB4QkY1N0U2NDAsCisweEU1MDFFNDA0LCAweEU0MDRFNjQwLCAweEFGNUM3RjE4LCAweDdGMTg0RjI2LAorMHgwMDBCNEYyNiwgMHg0RjIyMDAwOSwgMHhEMjQyN0ZGMCwgMHg4ODAxNjAyMSwKKzB4RDI0MThCNzEsIDB4MjY2ODY2MjEsIDB4RDI0MDhCNkQsIDB4MjY2ODY2MjEsCisweEU1MEY4QjY5LCAweEU0MDFCRjFDLCAweEJGMUVFNTAxLCAweEU1ODZFNDAwLAorMHhFNDAwNjU1QywgMHgyRjUwQkYxRSwgMHhCRjFCRTQwMSwgMHhFNDAxRTUwNiwKKzB4QkYxQzY1NDMsIDB4RTQwMUU2NDAsIDB4QkYyOTY1NDMsIDB4RTQwMUU2NDAsCisweEJGMzA2NTQzLCAweDY1RjBFNjQwLCAweDc1NkNFNDAyLCAweEJFRkY2MDUzLAorMHhFNDAyODBGNCwgMHhFNTEyQkYwMSwgMHhFNDAyODRGNCwgMHhCRjAxNzA5MCwKKzB4RTY0MDY1MDMsIDB4QkYwMkU0MDIsIDB4RTY0MEU1MDAsIDB4QkYwRkU0MDIsCisweEU2NDBFNTAwLCAweEJGMTZFNDAyLCAweEU1RkVFNTAwLCAweDYwNTM2NTVDLAorMHhCRUU1RTQwMywgMHhFNTEzODBGOCwgMHhFNDBFQkVFNywgMHhFNDBFODRGOCwKKzB4QkVFNzcwODUsIDB4RTUwMDY1MDMsIDB4QkVFOEU2NDAsIDB4RTUwMEU0MDMsCisweEJFRjVFNjQwLCAweEU1MDBFNDAzLCAweEJFRkNFNjQwLCAweEU1RkZFNDAzLAorMHg2MDUzNjU1QywgMHhCRUNCRTQwNCwgMHhFNDBGODBGQywgMHhFNTA0QkVDRCwKKzB4RTQwRjg0RkMsIDB4QkVDRDcwODMsIDB4RTUwMTY1MDMsIDB4QkVDRUU2NDAsCisweEU1MDFFNDA0LCAweEJFREJFNjQwLCAweEU1MDFFNDA0LCAweEU0MDRFNjQwLAorMHhBRUUwN0YxMCwgMHg3RjEwNEYyNiwgMHgwMDBCNEYyNiwgMHgwMDAwMDAwOSwKKzB4MDAxRTEwMkYsIDB4MDAxRTEwODAsIDB4MDAxRTEwOTAsIDB4MDAxRTEwM0YsCisweDAwMUUxMDNFLCAweDAwMTE2NTZFLCAweDAwMTE2NTcwLCAweDAwMTE2NTcyLAorMHhEMjFERDExQywgMHg2NjIwNjAxMCwgMHg2NzZDNzAwMSwgMHgzNzAwQzkwRiwKKzB4RTUwMDhEMTMsIDB4NjcxMDYyMTAsIDB4NzcwMTYyMkMsIDB4NjQyMzIxNzAsCisweEQ2MTY2MDEwLCAweDQ0MDg0NDA4LCAweDM0MjhDOTBGLCAweDYyNjAyMTAwLAorMHg3MjAxRDUxMywgMHg0NDA4MjYyMCwgMHgwMDBCMzU0QywgMHhEMTBGNjA1MywKKzB4MjU1ODY1MTAsIDB4RTYwMDhEMTMsIDB4RDYwREQ0MEIsIDB4NjU1QzY1NDAsCisweDQ3MDg2NzUzLCAweDM3NTg0NzA4LCAweDQ3MDg2NTQwLCAweDI0NTA3NTAxLAorMHgzNjdDNjA0MCwgMHgyNDAwQzkwRiwgMHg3MkZGNjIxMCwgMHgwMDBCMjEyMCwKKzB4MDAwMDYwNjMsIDB4MDAxMTY0RjUsIDB4MDAxMTY0RjQsIDB4MDAxMTY0RjYsCisweDAwMTE2MTFDLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHg1NDRGMEQwQSwgMHg1MzIwNTM1NSwgMHg0NjIwNDk1MCwKKzB4MDAwMDNBNTcsIDB4MjA3NDYzNEYsIDB4MzIyMDMyMjAsIDB4MjAzNzMwMzAsCisweDMzM0EzODMxLCAweDM2MzQzQTMyLCAweDAwMDAwMDAwLCAweDAwMDAwRDBBLAorMHg0MjcwNzM3MiwgMHgzRDIwNjY3NSwgMHg1NTRFMjAzRCwgMHgyMDJDNEM0QywKKzB4NkU0OTY3N0EsIDB4NEU0OTcyNzQsIDB4NkQ3NTRFNTEsIDB4MDAwMDAwM0QsCisweDUyNTA0NTQ1LCAweDU3MjA0RDRGLCAweDY1NzQ2OTcyLCAweDY0NjEyMDJDLAorMHgwMDNENzI2NCwgMHg2QzYxNzYyMCwgMHgwMDAwMDAzRCwgMHgwMDAwMEEwRCwKKzB4NUEyMDU3NDYsIDB4NEQ0MzVGNEQsIDB4NEM0NjVGNDQsIDB4NUY0ODUzNDEsCisweDUzNDE1MjQ1LCAweDAwMEEwRDQ1LCAweDVBMjA1NzQ2LCAweDRENDM1RjRELAorMHg0QzQ2NUY0NCwgMHg1RjQ4NTM0MSwgMHg1MzRCNDg0MywgMHgwQTBENEQ1NSwKKzB4MDAwMDAwMDAsIDB4MkQ0OTUwNTMsIDB4NzI2NDY0NjEsIDB4MDAwMDAwM0QsCisweDJENDk1MDUzLCAweDY3NkU2NTZDLCAweDAwM0Q2ODc0LCAweDJENDk1MDUzLAorMHg3MzZCNjg2MywgMHgwMDNENkQ3NSwgMHg1QTIwNTc0NiwgMHg0RDQzNUY0RCwKKzB4NEM0NjVGNDQsIDB4NUY0ODUzNDEsIDB4NDQ0MTQ1NTIsIDB4MDAwMDBBMEQsCisweDYxMjAyMDcyLCAweDNENzI2NDY0LCAweDAwMDAwMDAwLCAweDcyMjAyMDIwLAorMHg3NTQyNzA3MywgMHgwMDAwM0Q2NiwgMHg2RTZCNkU1NSwgMHgyMDZFNzc2RiwKKzB4NkQ2RDZGNjMsIDB4M0Q2NDZFNjEsIDB4MDAwMDAwMDAsIDB4MDAwMDAwNzIsCisweDAwMjA1MjIwLCAweDAwMDAwRDBBLCAweDYyNzM1NTc2LCAweDc0NzM3MjVGLAorMHgwMDAwMEEwRCwgMHg2MjczNTU3NiwgMHg3Mzc1NzM1RiwgMHg2NDZFNjU3MCwKKzB4MDAwMDBBMEQsIDB4NjI3MzU1NzYsIDB4NzM2NTcyNUYsIDB4MDAwQTBENkQsCisweDcyNzQ2RTQ5LCAweDZENjUyMDUxLCAweDJDNzk3NDcwLCAweDQ5Njc3QTIwLAorMHg0OTcyNzQ2RSwgMHg3NTRFNTE0RSwgMHgwMDAwM0Q2RCwgMHg2NTRDNzI0NSwKKzB4MDAwMDAwNkUsIDB4MjA3NDZGNEUsIDB4NzU2RjZFNjUsIDB4NDkyMDY4NjcsCisweDQyMjA1MTRFLCAweDBBMEQ2Njc1LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDJFMDIwOSwgMHg4MDAwMDEwMSwKKzB4MDAwNDA5RkEsIDB4MDBGRjA0MDAsIDB4MDUwNzAwMDAsIDB4MDIwMDAyMDEsCisweDgyMDUwNzAwLCAweDAwMDIwMDAyLCAweDAzODMwNTA3LCAweDA3MDEwMDQwLAorMHg0MDAyMDQwNSwgMHgwMjA5MDAwMCwgMHgwMTAxMDAyRSwgMHgwOUZBODAwMCwKKzB4MDQwMDAwMDQsIDB4MDAwMDAwRkYsIDB4MDIwMTA1MDcsIDB4MDcwMDAwNDAsCisweDQwMDI4MjA1LCAweDA1MDcwMDAwLCAweDAwNDAwMzgzLCAweDA0MDUwNzAxLAorMHgwMDAwNDAwMiwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwNzA5MDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgfTsKKworY29uc3QgdTMyX3QgemNGd0ltYWdlU1BJU2l6ZT0xMDE1NjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzL2hhbC9ocGZ3dS5jIGIvZHJpdmVycy9zdGFnaW5nL290dXMvaGFsL2hwZnd1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmI3N2NiYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL2hhbC9ocGZ3dS5jCkBAIC0wLDAgKzEsMTAxNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNy0yMDA4IEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisjaW5jbHVkZSAiY3ByZWNvbXAuaCIKKworY29uc3QgdTMyX3QgemNGd0ltYWdlW10gPSB7CisweDAwMDkwMDBCLCAweDRGMjIyRkU2LCAweERFOTQ3RkZDLCAweEUxMTRENTk0LAorMHgxRTEzRDQ5NCwgMHg2NzUyMUU0QywgMHhENDk0RDY5MywgMHgzNzQwMjc2OSwKKzB4NjI1MjhGMDYsIDB4NzIwMUQ2OTIsIDB4NjA2MDI1MjIsIDB4MjYwMEM5M0YsCisweEQ3OTA2MTUyLCAweDI1MTI2MTFELCAweDI2NEI2NjUyLCAweDI1NjI0NzBCLAorMHgwMDA5QjAxNywgMHhFNjAwOTVBQywgMHhDODQwNjBFMiwgMHgyRjAyOEYwMywKKzB4OEZGOTM2NTIsIDB4RDQ4ODc2MDEsIDB4NEUwQkRFODgsIDB4RDQ4ODAwMDksCisweDAwMDk0RTBCLCAweDRFMEJENDg3LCAweDdGMDQwMDA5LCAweEEwNTI0RjI2LAorMHg0RjIyNkVGNiwgMHg0MTBCRDE4NCwgMHhENDg0MDAwOSwgMHgwMDA5NDQwQiwKKzB4NDUwQkQ1ODMsIDB4RDc4MzAwMDksIDB4RDI4M0UxRkYsIDB4MjcxMjYxMUQsCisweEQ0ODI1MDI5LCAweEUxRkZDQjAxLCAweDEyMDlFNTAxLCAweDEyMTEyMjEyLAorMHhFNzIwMjQ1MiwgMHg0NzE4RDU3RSwgMHgyNTcyRDI3RSwgMHhEMTdFRTcwMCwKKzB4RDY3RkQ0N0UsIDB4RTIwMTIyNzAsIDB4MjQ3MDIxNzIsIDB4RDY3RDI2MjAsCisweDI2NDFFNEZGLCAweEQ1N0NFNjAwLCAweDY2NkRFMTA0LCAweDc2MDE2MDYzLAorMHg0MDAwNjI2RCwgMHg4RkY4MzIxMiwgMHhENTc4MDU0NSwgMHgyNTIwRTIwMSwKKzB4RDI3OEQ3NzcsIDB4RTQ4MEUxMDAsIDB4MjIxMjI3MTAsIDB4NjYxM0Q1NzYsCisweDY2NkQ2NDRDLCAweDc2MDQ2NzYzLCAweDM3NUM2MjZELCAweDhGRjgzMjQzLAorMHhENTcyMjcxMiwgMHhEMjczRDc3MiwgMHhFNDAwRTEwMSwgMHgyNzEwMjUxMSwKKzB4MDAwQjRGMjYsIDB4N0ZDQzIyNDIsIDB4RDE3MEQ1NkYsIDB4RDI3MURCNzAsCisweDFGNTFENDcxLCAweEQ2NzE3NTA4LCAweDFGMTJENzcxLCAweDFGNTU3MTBDLAorMHgxRkI5NzVGQywgMHg3MjA0MUYyQSwgMHgxRjEzRUIxMCwgMHgxRjU2MUY0NCwKKzB4MUY3ODFGNjcsIDB4RDg2QjFGMkIsIDB4REQ2Q0Q5NkIsIDB4REM2Q0VBMDAsCisweEQyNkRERTZDLCAweDg5MDAzQTIyLCAweEQxNUQ3QTAxLCAweDg4MDE2MDEwLAorMHg1NkY4OEIwMywgMHg0MjE4RTIwMSwgMHhEMTY4MjYyMiwgMHgwMDA5NDEwQiwKKzB4NDQwQkQ0NjcsIDB4RDU2NzAwMDksIDB4MDAwOTQ1MEIsIDB4NjAxMEQxNTAsCisweDhCMTA4ODAxLCAweEU2NTBEMTRGLCAweDQ2MTg2MjEyLCAweDhCMDgzMjY2LAorMHg1NkY5RDE0QiwgMHgyMTIwRTIwMCwgMHhDQjAxNjA2MiwgMHgyNjAyQTAwMywKKzB4NzIwMTI3MTAsIDB4NjA4MjIxMjIsIDB4ODkwOTg4MDEsIDB4RTJDOEQxNUEsCisweDYyMkM2NjEyLCAweDg5MDMzNjI2LCAweDYwMTBEMTU4LCAweDhCQzg4ODAxLAorMHg1MUY2Njc5MiwgMHgyMTcyNTJGNSwgMHhENjU1NTE5MSwgMHg1NUZBMjIxMiwKKzB4NTJGQjY0NjIsIDB4NTU2MTI1NDIsIDB4MjI1MkU0MDAsIDB4NjE0MzY2NDMsCisweDA1REU2MDEzLCAweDM2Q0M0NjA4LCAweDA3REUyNjUyLCAweEM5MDM2MDcxLAorMHg4QjAyODgwMSwgMHg3MjAxNjJFMiwgMHg3NDAxMkUyMiwgMHgzNkIzNjY0QywKKzB4NzEwNDhGRUUsIDB4NjZDMkQxNDcsIDB4NDUyODY1MTIsIDB4MjY1QjQ1MTgsCisweDYwODIyQzYyLCAweDg5MDE4ODAxLCAweDAwMDlBMTY4LCAweDYyNzJENzQyLAorMHg4QjEzMjIyOCwgMHhENDJCRDc0MSwgMHg2NzcyRDU0MSwgMHg1MTUzNjI0MiwKKzB4MzEyQzMyN0MsIDB4MjQyMjIyMjgsIDB4MTUxMzhEMDUsIDB4NjI2MkQ2M0QsCisweEIxNjI3MjAxLCAweEQ2MjMyNjIyLCAweDI2MjJFMjAwLCAweDUyOTE2NjkyLAorMHg4QjAxMzYyMCwgMHgwMDA5QTE0NCwgMHg2MDYxQTA2RSwgMHgwMDFDMDAxQywKKzB4MDAxRDQwMjAsIDB4MDAwMEIzOEUsIDB4RkZGRjAwMDAsIDB4MTIzNDAwMDAsCisweDAwMUUxMDE1LCAweDAwMjAxMjc0LCAweDAwMjAzOUY0LCAweDAwMjAxOEEyLAorMHgwMDIwM0EwMCwgMHgwMDIwM0ExOCwgMHgwMDIwMTg2MCwgMHgwMDIwMTk2QywKKzB4MDAyMDEyODgsIDB4MDAxQzM1MTAsIDB4MDAxQzM2MjQsIDB4MDAxRTIxMkMsCisweDAwMjAzOEY0LCAweDAwMjAzNDhDLCAweDAwMjAzOEZDLCAweDAwMjAzOTA4LAorMHgwMDIwMzkxNCwgMHgwMDIwMzk3MCwgMHgwMDIwMzk3NCwgMHgwMDIwMzkxQywKKzB4MDAyMDM5MUQsIDB4MDAyMDM5MjAsIDB4MDAxMTc3MDAsIDB4MDAyMDM5OEMsCisweDAwMjAzOThBLCAweDAwMjAzNEYwLCAweDAwMTE3NzEwLCAweDAwMUMzRDMwLAorMHgwMDFDMzZGOCwgMHgwMDExNzczNCwgMHgwMDFDMzY4NCwgMHgwMDFDM0QwMCwKKzB4MDAxQzEwMDAsIDB4MDAxQzEwMjgsIDB4MDAyMDM1MDQsIDB4MDAyMDM5MjQsCisweDAwMTE3NjAwLCAweDAwMTE3NzQwLCAweDdGRkZGRkZGLCAweDAwMjAxNzMwLAorMHgwMDIwMzMyQSwgMHgwMDIwMjMzNCwgMHgwMDIwM0RBNCwgMHgwMDIwMzk3MiwKKzB4MDAyMDM0RkMsIDB4MDAyMDM5NjQsIDB4MDAxQzNEMkMsIDB4MDAxQzM2QjAsCisweDAwMjAzNDk0LCAweDAwMTE3NzVDLCAweDg4MDFDOTBGLCAweEEwQ0Y4OTAxLAorMHhEMTk2MDAwOSwgMHgzNjIwNjIxMiwgMHhENDk1ODkwNCwgMHgyNDIxRTIwMCwKKzB4MjE2MkEwQ0MsIDB4NjIxMUQxOTMsIDB4ODkwMTIyMjgsIDB4MDAwOUEwQzMsCisweEUyMDJENzhGLCAweDc1MDE2NTcxLCAweDMxMjM2MTVELCAweDI3NTE4RDAyLAorMHgwMDA5QTBCQywgMHhEMjhDNTdGMiwgMHg2MjIyNjA3MiwgMHg0MDA5NDAxOSwKKzB4QzkwRjQwMDksIDB4OEYxOTg4MEEsIDB4NTJGMzFGMkMsIDB4NDAxOTYwMjIsCisweDQwMDk0MDA5LCAweDg4MDhDOTBGLCAweEEwQTc4OTAxLCAweDYwNjMwMDA5LAorMHhDQjAxNTRGNywgMHhEMjdFNTVGMiwgMHhFNzAxMjQwMiwgMHhENDdGRTEwMCwKKzB4MjIxMTI1NzIsIDB4NzIwMTYyNDIsIDB4MjQyMkEwOTgsIDB4OEIzRjg4MDUsCisweDYwMjI1MkYzLCAweDQwMDk0MDE5LCAweEM5MEY0MDA5LCAweDhCMTY4ODAyLAorMHhFNEZGRDU3NywgMHg2NDRENjc1MiwgMHg4QjEwMjc0OCwgMHg2MjcyRDc3NSwKKzB4OEIwQzMyNjAsIDB4NTFGMjU1RjcsIDB4RDI2REU3MDEsIDB4MjE3MjI1NjIsCisweEQ1NzFFMTAwLCAweDY0NTIyMjExLCAweEEwNzc3NDAxLCAweDUyRjMyNTQyLAorMHg0MDE5NjAyMiwgMHg0MDA5NDAwOSwgMHg4ODA1QzkwRiwgMHgzMUIzOEI2RSwKKzB4RDI2QThCNkMsIDB4NjcyMjU0RjQsIDB4NzcwMUQ1NjksIDB4NjE0MjIyNzIsCisweDFGMUNFNjQwLCAweDQ2MTgyMTU5LCAweDhCMDMzMTYwLCAweDYyNjJENjY1LAorMHgyNjIyNzIwMSwgMHhFMjAwRDY1QSwgMHgyNjIxQjA2NywgMHgwMDA5QTA1NiwKKzB4MzEyM0UyMjAsIDB4ODgwMzhCNTIsIDB4NTJGMzhCMUUsIDB4NDAxOTYwMjIsCisweDQwMDk0MDA5LCAweDg4MDNDOTBGLCAweEQyNUI4QjE2LCAweDY3MjI1NEY0LAorMHg3NzAxRDU1NywgMHg2MTQyMjI3MiwgMHgxRjFDRTY0MCwgMHg0NjE4MjE1OSwKKzB4OEIwMzMxNjAsIDB4NjI2MkQ2NTUsIDB4MjYyMjcyMDEsIDB4RTIwMEQ2NDgsCisweDI2MjFCMDQzLCAweDAwMDlBMDEwLCAweEQ0NTJENTUxLCAweEQyNDQ2NzUyLAorMHhFMTAwNzcwMSwgMHgyNTcyM0E0NiwgMHgyMjExOEYwNiwgMHhFQTAwRDY0RSwKKzB4NzIwMTYyNjIsIDB4MjYyMkIwMzEsIDB4MkZCMkQ1NEMsIDB4OTU3MzY2NTIsCisweEQ0NEE1QkYxLCAweDM2MjA1MjQxLCAweDYwNjE4OTEwLCAweDhCMDFDODAzLAorMHgyQjIyRTIwMSwgMHg4RkY1NDUxMCwgMHg1N0YxNTY2NCwgMHg2MjcyRTFGMCwKKzB4NDEyODQxMTgsIDB4MjcyMjIyMUIsIDB4NkJGMkEwMDgsIDB4NkJGMkEwMDYsCisweEUyMDBENjJGLCAweEQxMkYyNjIxLCAweDIxMjFFMjAwLCAweEQxM0NFMjAxLAorMHg2NjEyMjgyMiwgMHg4QjAxMjY2OCwgMHgwMDA5QUUyQiwgMHg0NTBCRDUzOSwKKzB4RDEzOTAwMDksIDB4QUUyNEU2MDAsIDB4MkY4NjIxNjAsIDB4MkZBNjJGOTYsCisweDJGQzYyRkI2LCAweDJGRTYyRkQ2LCAweDdGRjQ0RjIyLCAweERFMzREMTMzLAorMHg1NDExNjIxMiwgMHgxRjQxNjdFMiwgMHgyRjIyRDQzMiwgMHhENTMyMUY3MiwKKzB4RDIzMjY3NDMsIDB4NTg0MTc3OTQsIDB4Njk0MjVBNDIsIDB4NUIxNjZDNzIsCisweDYwNTI2RDIyLCAweENCMjBFNjAwLCAweEU1NDAyNTAyLCAweDYyNkQ3NjAxLAorMHg4QkZCMzI1MywgMHg1NUYxNjJGMiwgMHgxMTUxMjEyMiwgMHhENjI4NTVGMiwKKzB4MTQ4MTJFNTIsIDB4MjQ5MjE0QTIsIDB4MjdDMkQ0MjYsIDB4MjZEMjExQjYsCisweERBMjU2NzQyLCAweEU4MDFEOTI1LCAweDQ5MEIyQTcyLCAweEUyMDExQThDLAorMHgxQTJDNDIxOCwgMHg0RjI2N0YwQywgMHg2REY2NkVGNiwgMHg2QkY2NkNGNiwKKzB4NjlGNjZBRjYsIDB4NjhGNjAwMEIsIDB4MDAwMDA3RDEsIDB4MDAyMDM5ODQsCisweDAwMjAzOTg4LCAweDAwMjAzOThFLCAweDAwMUMzREMwLCAweDAwMTE3NzJDLAorMHgwMDFDM0I4OCwgMHgwMDIwMzk2QywgMHgwMDExNzczQywgMHgwMDExNzc0NCwKKzB4MDAwMEYwMDAsIDB4MDAxMTc3NjQsIDB4MDAxMTc3NDgsIDB4MDAxMTc3NjgsCisweDAwMTE3NzZDLCAweDAxRkZGRkZGLCAweDAwMTE3NzRDLCAweDAwMjAzNEZDLAorMHgwMDIwM0RBNCwgMHgwMDIwMjRGOCwgMHgwMDIwMzk3MiwgMHgwMDFDM0I5QywKKzB4MDAxQzNEOTgsIDB4MDAxQzM3MDAsIDB4MDAxQzM1MDAsIDB4MDAxQzU5NjAsCisweDAwMUM4OTYwLCAweDAwMjAzNTA0LCAweDAwMUMzRDAwLCAweDAwMjAxNjBDLAorMHgyRjk2MkY4NiwgMHgyRkI2MkZBNiwgMHgyRkQ2MkZDNiwgMHg0RjIyMkZFNiwKKzB4REU5NTdGQUMsIDB4NjFFMEUwMTQsIDB4MEYxNEQ0OTQsIDB4NzEwMTYxRTMsCisweEUwMTg2MjEwLCAweEQyOTIwRjI0LCAweDAwMDk0MjBCLCAweDQ1MEJENTkxLAorMHgyMDA4MDAwOSwgMHg4RjEyNkQwMywgMHhEMjhGMUYwNywgMHg2NzIwRDQ4RiwKKzB4NjU3Q0REOEYsIDB4NDcwQkQ3OEYsIDB4RDE4RjAwMDksIDB4NjE5QzY5MTAsCisweDQ2MDg2NjEzLCAweDM2MTg0NjA4LCAweDNENkM0NjA4LCAweEUwMTgxRkQ3LAorMHhFNTgwMDRGQywgMHg2MDRDNjZFMiwgMHgzMDUwNjU1QywgMHgyRDYyOEYxNSwKKzB4MDFGQ0UwMTQsIDB4REU4NUU1MDAsIDB4NjQxQ0EwMDgsIDB4Njc1MzY1NUQsCisweDYwNzAzN0VDLCAweDM5REM2OTUzLCAweDgwOTQ3NTAxLCAweDMyNDM2MjVELAorMHhENjdGOEJGNCwgMHhBMzRFRTIwMCwgMHgyMDA4MjYyMSwgMHhFMDE0OEIxMywKKzB4RTQwMDAxRkMsIDB4QTAwOURFNzksIDB4NjQ0RDY3MUMsIDB4MzVFQzY1NDMsCisweDY5NDM2NjUyLCAweDM5REM2MjYyLCAweDc0MDQxOTIxLCAweDMyNzM2MjRELAorMHhBMzM4OEJGMywgMHg4ODAxMkQxMCwgMHhFMDE0OEIxNywgMHhFNzAwMDFGQywKKzB4NkQxQzJENzAsIDB4REU2RDFGRDQsIDB4MzJEMzYyN0QsIDB4QTMyQThCMDEsCisweDY3N0QwMDA5LCAweDY2NzM2NUUzLCAweDYxNzM3NTA0LCAweDMxNUMzNkVDLAorMHg2OTEyNjQ2MiwgMHhBRkVGNzcwOCwgMHg4ODA0MjQ5MiwgMHhFMDE0OEIxOCwKKzB4RTQwMDAxRkMsIDB4NjcxQzJENDAsIDB4NjI0RERFNjAsIDB4OEIwMTMyNzMsCisweDAwMDlBMzExLCAweDY5NDM2NDRELCAweDM5RUM2MkUzLCAweDcyMDQ2NTkyLAorMHgzRDJDNkQ0MywgMHg2MTUyNjZEMiwgMHgyMTY5NzQwOCwgMHgyNTEyQUZFRCwKKzB4OEIxODg4MDUsIDB4MDFGQ0UwMTQsIDB4MkQ0MEU0MDAsIDB4REU1MzY3MUMsCisweDMyNzM2MjRELCAweEEyRjY4QjAxLCAweDY0NEQwMDA5LCAweDYyRTM2OTQzLAorMHg2NTkyMzlFQywgMHg2RDQzNzIwNCwgMHg2NkQyM0QyQywgMHg3NDA4NjE1MiwKKzB4QUZFRDIxNkIsIDB4ODgzMTI1MTIsIDB4RDQ0QThCM0EsIDB4NjE0NkQ5NEEsCisweDc1MDQ2NTQzLCAweDY3NTY2NDQyLCAweDZFNTMxRjQ4LCAweDY1NTI3RTA0LAorMHg3RUU0NjJFMiwgMHg3RTA0NjRFMiwgMHg2RUUyMUZFOSwgMHg1RUY5MjlFMCwKKzB4N0UwNEQ5NDIsIDB4MUZFQTYwRTIsIDB4MjkwMEM5MDEsIDB4RDk0MDZFRTIsCisweDI5RTA0RTA5LCAweDJGNTYyRjI2LCAweDU2RkFEOTNFLCAweDY1MTM0OTBCLAorMHhEMTNEN0YwOCwgMHhFNzFDNkUwRCwgMHgxREUxMkQ3MCwgMHhERTNCNjkxMiwKKzB4NjRFMjFEOTIsIDB4MUQ0M0QxM0EsIDB4RDIzQTY1MTIsIDB4NjcyMjFENTQsCisweDFENzVEMjM5LCAweDFENjY2NjIyLCAweDYyNjJENjM4LCAweDFEMjdBMkFCLAorMHg4QjM5ODgzMCwgMHg2NTk2RDkyQiwgMHg2NzkyNjY5NiwgMHg2MTk2NzkwNCwKKzB4NzRFNDY0OTMsIDB4NkU0MzY5OTIsIDB4MUY5QjdFMDQsIDB4MUZFQzY0NDIsCisweEQ5MjU2RUUyLCAweDVFRkMyOUUwLCAweDdFMDREOTI0LCAweDFGRUQ2MEUyLAorMHgyOTAwQzkwMSwgMHhEOTIyNkVFMiwgMHgyOUUwNEUwOSwgMHg1OUZDN0ZGQywKKzB4REUyNzJGOTIsIDB4MkYxNjRFMEIsIDB4RDQxRjdGMDgsIDB4RTIxQzYxMEQsCisweDFEMTEyRDIwLCAweEQyMjA2NDQyLCAweEQ0MUMxRDQyLCAweDFENTM2NTQyLAorMHg2NzUyRDUxQiwgMHhENzFCMUQ3NCwgMHgxRDE1NjE3MiwgMHgxRDY2NjYyMiwKKzB4NjI2MkQ2MUEsIDB4MUQyN0EyNkYsIDB4OEIzNTg4MzMsIDB4NDkwQkQ5MTksCisweEEyNjhFRTAwLCAweDAwMDAyREUwLCAweDAwMTE3ODAwLCAweDAwMjAzQTFDLAorMHgwMDIwMThBMiwgMHgwMDIwMkFBQywgMHgwMDIwMzkwRSwgMHgwMDIwM0EyMCwKKzB4MDAyMDM1MzQsIDB4MDAyMDE4RUUsIDB4MDAyMDM5MEQsIDB4MDAxMTc4MDQsCisweDAwMjAzOThDLCAweDAwMTE3ODEwLCAweDAwMjAzOTA5LCAweDAwMjAzOTBBLAorMHgwMDIwMzkwQiwgMHgwMDIwMEY2NCwgMHgwMDFDNTg2NCwgMHgwMDFDNjg2NCwKKzB4MDAxQzc4NjQsIDB4MDAxQzU5QkMsIDB4MDAxQzY5QkMsIDB4MDAxQzc5QkMsCisweDAwMjAwRkJDLCAweDAwMjAwRkI4LCAweDg5MDE4ODI4LCAweDAwMDlBMEMwLAorMHhFNjQzREVCNSwgMHgzMjY2NjJFMSwgMHgxRkVFOEYwMiwgMHgyRTIxRTI0MCwKKzB4NjIyRDYyRTEsIDB4OEIwMTMyNjcsIDB4MDAwOUEwQUEsIDB4RTUwMTg1RTEsCisweDhCMDEzMDU2LCAweDAwMDlBMEE0LCAweDJEMTBFMTAxLCAweDY0RTFCMjI1LAorMHhFNjQzNTdGRSwgMHg2NTJENjI3MSwgMHg4OTQ0MzU2NywgMHgzNTYzRTY0MCwKKzB4RTYwMDhCMDUsIDB4MEY2NUUwNDAsIDB4QTAwRkUxMUEsIDB4NjE1MzcyQzAsCisweDQxMjE0MTIxLCAweDQxMjE0MTIxLCAweDQ1MjE0MTIxLCAweDQ1MjE0NTIxLAorMHhDOTAzNjA1MywgMHhFMDQwNjYwMywgMHg3MTE4MEY2NSwgMHgyMjA5RTAwNywKKzB4MEYyNUUwM0MsIDB4RTA0NDY0MUQsIDB4QjJBMzY1RjMsIDB4RTMzQzBGNDYsCisweDg1MzIzM0ZDLCAweDYyMERERTk1LCAweDQyMDg2MDMxLCAweDYwMjM2MTBELAorMHgxMzIzRTk0NCwgMHgwNkZFNDEwOCwgMHhFMDBGMzlGQywgMHgxMzE0NEUwQiwKKzB4NjcwNzVEOTEsIDB4NjBEMzI2NzksIDB4MEY2NjU0RkUsIDB4NTE5Mjg1NDIsCisweDYwMEQ0RTBCLCAweDYwRDMyNjBCLCAweDBGNjY2NDkyLCAweDY1RjNCMjM3LAorMHg2OTYxNTZGRSwgMHhFNjQwNjU5RCwgMHg4OTM4MzU2MywgMHhENzgzNTlGRSwKKzB4NzkwNjY1OTEsIDB4QzkwMzYwNTMsIDB4NDAwMDQwMDgsIDB4NjEwMzYyMDMsCisweDBGMjZFMDUwLCAweDQ3MEJFMEZGLCAweDZDMDc2MDBDLCAweDY2MDM2MDVELAorMHg0NjIxNDYyMSwgMHg0NjIxNDYyMSwgMHg0MjAwNjI2MywgMHg0MjAwMzI2QywKKzB4NDAyMTQwMjEsIDB4NDAwOEM5MDMsIDB4NkQyRDMwRkMsIDB4RTgwMDZBMDMsCisweEIyNTc2NUYzLCAweDZFQTI2NEQzLCAweDJFQzlFMDUwLCAweDY2OTQyQUUyLAorMHhENzZFMDFGRSwgMHg2MDZDNDcwQiwgMHgyQUUyMkUwQiwgMHg2NEQzNjVGMywKKzB4NzgwMUIxRkQsIDB4RUUwNjYyOEQsIDB4OEZFOTMyRTMsIDB4NUVGRTdEMDEsCisweDYxRTFFNDAwLCAweDQxMDA4NUUxLCAweDY2RTMzMTBDLCAweDc2MEM3MTFCLAorMHhFNzA0NjVGMywgMHg2ODY2NzQwMSwgMHgzQTczNkE0RCwgMHg4RkY5MjU4MiwKKzB4NjVGMzc1MDQsIDB4NjQxREIxRTMsIDB4NjRFMUIxQTQsIDB4MDAwOUExN0IsCisweEQ0NUI1NkY3LCAweEVDMDFEMjVCLCAweDI2QzA0MjBCLCAweDAwMDlBMTczLAorMHgwNkZDRTAxOCwgMHg4ODI5NjA2QywgMHg1OEY3OEIwOCwgMHhFNDAwRDI1MiwKKzB4NjYyMjI4NDAsIDB4NjQ2REIxNzEsIDB4MDAwOUExNjUsIDB4NjY2Q0U2ODEsCisweDg5MDEzMDYwLCAweDAwMDlBMEFDLCAweEQ1NTBEMTRGLCAweDYyMTI2QTU2LAorMHgyMTIyMzJBQywgMHg1NDExNkM1NiwgMHgzNENDNjI1MywgMHg2NDUyMTE0MSwKKzB4NzIwODU4MTIsIDB4RDQ0QTM4NEMsIDB4NjgyMjExODIsIDB4NUExMzZDNDIsCisweDNBQ0MzQzhDLCAweDExQTMyNEMyLCAweDZDMjI3MkVDLCAweDcyMTA1ODE0LAorMHgxMTg0MzhDQywgMHg1QTE1NjgyMiwgMHgxMUE1M0E4QywgMHg2QTIyNzIxMCwKKzB4RDY0MDU4MTYsIDB4MTE4NjM4QUMsIDB4NTIxNzZDNjIsIDB4MTEyNzMyQ0MsCisweDVBMTg1ODYxLCAweDExQTgzQThDLCAweDVDMTk1QTYyLCAweDExQzkzQ0FDLAorMHg1MjFBNUM2MywgMHgxMTJBMzJDQywgMHg1QTFCNTg2NCwgMHgxMUFCM0E4QywKKzB4NUMxQzVBNjUsIDB4MTFDQzNDQUMsIDB4NTIxRDVDNjYsIDB4MTEyRDMyQ0MsCisweDVBMUU1ODY3LCAweDExQUUzQThDLCAweDU2MUY1QTY4LCAweDM2QUNFODQwLAorMHgxMTZGREEyRCwgMHg2Q0EyMzgxQywgMHg3QTk0NjY4MiwgMHgyODYyMzZDQywKKzB4NUM4MTYyQTIsIDB4MThDMTNDMkMsIDB4NjJBMjdBNDQsIDB4MzYyQzU2ODIsCisweEQ2MjYxODYyLCAweDVBODU2MjYyLCAweDNBMkM0MjI5LCAweDc2MDQxOEE1LAorMHg1Njg2NjI2MiwgMHgzNjJDNDIyOSwgMHg1NkY3MTg2NiwgMHgyNjIwRTIzOCwKKzB4MTZDMTVDODEsIDB4MTYyMjYyMTIsIDB4RTIwMDVDMTEsIDB4NTUxMjE2QzMsCisweDU1MTUxNjU0LCAweDU1MTMxNjU1LCAweDU1MTYxNjU2LCAweDU1ODIxNjU3LAorMHg2NTgyMTY1OCwgMHg1NTE0MTY1OSwgMHg1NTg0MTY1QSwgMHg1NTgzMTY1QiwKKzB4NTU4NTE2NUMsIDB4NTU4NjE2NUQsIDB4MTgyMTE2NUUsIDB4MTEyMTIxMjIsCisweDExMjUxMTIyLCAweDExMjYxMTIzLCAweDI4MjIxODIyLCAweDE4MjQxMTI0LAorMHgxODI1MTgyMywgMHgxODI2QTBDNywgMHgwMDExNzgwNCwgMHgwMDIwMzNFOCwKKzB4MDAyMDNBNDAsIDB4MDAyMDE4QTIsIDB4MDAyMDM0OTQsIDB4MDAxQzM2QTAsCisweDAwMjAzNEYwLCAweDAwMUMzQ0EwLCAweDAwMUMzNkY0LCAweDAwMUMzQjg4LAorMHg2NjZDRTY4MiwgMHg4QjIwMzA2MCwgMHhFQTI0NTZGNywgMHgyNkEwRDE5NCwKKzB4MTZDMTVDMTcsIDB4MTYyMjUyMTgsIDB4MTY4MzU4MTksIDB4MTZBNDVBMUEsCisweDE2QzU1QzFCLCAweDE2MjY1MjFDLCAweEUyMDA1ODFELCAweDU1MUUxNjg3LAorMHg1NTFGMTY1OCwgMHgxMTI3MTY1OSwgMHgxMTI5MTEyOCwgMHgxMTJCMTEyQSwKKzB4MTEyRDExMkMsIDB4QTA4RTExMkUsIDB4RTY4MzExMkYsIDB4MzA2MDY2NkMsCisweDUyRjc4QjBCLCAweEVBMDBEODgzLCAweDY1ODIyMkEwLCAweDc4MDREQzgyLAorMHg2MjgyMkM1MiwgMHhBMDdFRDY4MSwgMHhFNjkwMjYyMCwgMHgzMDYwNjY2QywKKzB4REE3RjhCMDYsIDB4MDAwOTRBMEIsIDB4RTIwMDU2RjcsIDB4MjYyMEEwNzMsCisweDY2NkNFNjkxLCAweDhCMTAzMDYwLCAweDYyMjJEMjc2LCAweDIyMjg2MjJDLAorMHhEMjc4ODkwNCwgMHgwMDA5NDIwQiwgMHgwMDA5QTAwMywgMHg0MjBCRDI3NiwKKzB4NTZGNzAwMDksIDB4QTA1RUUyMDAsIDB4RTY5MjI2MjAsIDB4MzA2MDY2NkMsCisweEUwMTg4OTUxLCAweEU2QjAwQkZDLCAweDY2NkM2MkJDLCAweDhCMkEzMjYwLAorMHgwMkZDRTAxNCwgMHg2ODJDRUEwMCwgMHg2MkFERTkwNCwgMHg4OTRBMzI4MywKKzB4NkFBRERENjQsIDB4M0NEQzZDQTMsIDB4N0QwNDZFQzIsIDB4REI2OEQ0NjcsCisweDMyREM2MkEzLCAweDRCMEJEQzY3LCAweDRDMEI2RDIyLCAweEQ0NjY2NEUzLAorMHgwMDA5NEIwQiwgMHg2NEQzNEMwQiwgMHg0QjBCRDQ2NCwgMHhFNjAwMDAwOSwKKzB4NjY2RDZCRTMsIDB4NzYwMTNCNkMsIDB4MzI5MzYyNkQsIDB4OEZGNzJCRDAsCisweEFGREE0RDE5LCAweEU2QjU3QTA4LCAweDMyNjA2NjZDLCAweEQ0NUM4QjEzLAorMHg0QjBCREI1NywgMHhEMjVCMDAwOSwgMHg2MDIyREI1QiwgMHhDQjIwRTZGRiwKKzB4MjIwMjY2NkQsIDB4REI1OTJCNjIsIDB4RTAxNEUyMDAsIDB4NTZGNzJCMjAsCisweEEwMTAwMkZDLCAweEQ0NTYyNjIwLCAweDY1NDJEMjU2LCAweDQyMEJENDU2LAorMHhBMDA4MDAwOSwgMHhEQjUyMDAwOSwgMHg1MkIxRTYwMCwgMHg2MjJDREI1MywKKzB4NTJGNzJCMjEsIDB4N0Y1NDIyNjAsIDB4NkVGNjRGMjYsIDB4NkNGNjZERjYsCisweDZBRjY2QkY2LCAweDAwMEI2OUY2LCAweDRGMjI2OEY2LCAweEUyNDA2MTRELAorMHg4OTE0MzEyMywgMHgzMTI3RTIxRiwgMHg4QjA5RDc0OSwgMHhENDQ5NjE0RCwKKzB4RTAwMTcxRTAsIDB4NTY3MTQ0MEIsIDB4MjY1OTY1MDcsIDB4MTc2MUEwMDcsCisweEUwMDFENDQ0LCAweDY2NzI0NDBCLCAweDI2NTk2NTA3LCAweDRGMjYyNzYyLAorMHgwMDA5MDAwQiwgMHg2MTRENEYyMiwgMHgzMTIzRTI0MCwgMHhFMjFGODkxMiwKKzB4RDczQjMxMjcsIDB4NjE0RDhCMDgsIDB4NTY3MUQyM0EsIDB4NDIwQjcxRTAsCisweDI2MEJFMDAxLCAweDE3NjFBMDA2LCAweDY2NzJEMjM2LCAweEUwMDE0MjBCLAorMHgyNzYyMjYwQiwgMHgwMDBCNEYyNiwgMHhFNjQwMDAwOSwgMHg0NjI4NDYxOCwKKzB4NjI1MkQ1MzEsIDB4ODlGQzIyNjgsIDB4MDAwOTAwMEIsIDB4NDYxOEU2ODAsCisweEQ1MkQ0NjI4LCAweDIyNjg2MjUyLCAweDAwMEI4OUZDLCAweEEwMDEwMDA5LAorMHg3MjAxRTIwMCwgMHg4QkZDMzI0MiwgMHgwMDA5MDAwQiwgMHg0NjE4RTY4MCwKKzB4RDUyNjQ2MjgsIDB4MjI2ODYyNTIsIDB4MDAwQjhCRkMsIDB4MkZFNjAwMDksCisweDdGRkM0RjIyLCAweEJGRjE2RTUzLCAweDYxRTIyRjQyLCAweEUyODBENjIwLAorMHg1NEUxMTYxNSwgMHgxNjQ2NDIxOCwgMHg0MjI4NTVFMiwgMHg1N0UzMTY1NywKKzB4MTY3ODZFRjIsIDB4MjZFMjJFMkIsIDB4NEYyNjdGMDQsIDB4NkVGNkFGQ0UsCisweDAwMjAzNDk0LCAweDAwMTE3ODA0LCAweDAwMjAzOEY0LCAweDAwMjAzOTA4LAorMHgwMDIwMDUwQSwgMHgwMDIwMTAwOCwgMHgwMDIwMTAyRSwgMHgwMDIwM0E1OCwKKzB4MDAyMDE4QTIsIDB4MDAyMDE4RTYsIDB4MDAyMDNBNkMsIDB4MDAyMDNBNzQsCisweDAwMjAzQTc4LCAweDAwMUMzNTAwLCAweDAwMUMxMDAwLCAweDAwMjAzOThBLAorMHgwMDExNzgwMCwgMHgwMDIwMThFRSwgMHgwMDIwM0E4QywgMHgwMDIwMzk5MCwKKzB4MDAxQzM3MDQsIDB4MDAyMDMzRTgsIDB4MDAxQzM3M0MsIDB4MDAxQzM3MDAsCisweDAwMUMzNzBDLCAweDJGRDYyRkM2LCAweDRGMjIyRkU2LCAweDZDNTNERDEwLAorMHg2RTQzQkZBNCwgMHgyREUyQkY4OSwgMHgwMDA5QkZBMCwgMHgyQzEyNTFENSwKKzB4MUM0MTU0RDYsIDB4MUM1MjU1RDcsIDB4MUM2MzU2RDgsIDB4NkVGNjRGMjYsCisweDAwMEI2REY2LCAweDYxNjM2Q0Y2LCAweEEwMDRFNjAwLCAweDYyNTY0MTA5LAorMHgyNDIyNzYwMSwgMHgzNjEyNzQwNCwgMHgwMDBCOEJGOSwgMHgwMDAwMDAwOSwKKzB4MDAxQzM3MEMsIDB4MDAwOUExNkUsIDB4MkZFNjJGRDYsIDB4REQ5NDRGMjIsCisweEEwMDQ5RUIyLCAweEQ0OTMwMDA5LCAweDQyMEJEMjkzLCAweDYyRDI2NUQyLAorMHg4QkY4MjJFOCwgMHgwMDA5QTAwNCwgMHhEMjhGRDQ5MCwgMHg1NUQxNDIwQiwKKzB4MjJFODUyRDEsIDB4QTAwNDhCRjgsIDB4RDQ4RDAwMDksIDB4NDIwQkQyOEEsCisweDUyRDI1NUQyLCAweDhCRjgyMkU4LCAweDAwMDlBMDA0LCAweEQyODZENDg5LAorMHg1NUQzNDIwQiwgMHgyMkU4NTJEMywgMHhBMDA0OEJGOCwgMHhENDg2MDAwOSwKKzB4NDIwQkQyODEsIDB4NTJENDU1RDQsIDB4OEJGODIyRTgsIDB4NkVGNjRGMjYsCisweDZERjYwMDBCLCAweDJGRDYyRkM2LCAweDRGMjIyRkU2LCAweDZFNjM2QzczLAorMHg2RDUzQjAxQSwgMHg2NEQzNTdGNCwgMHhCMDVGNjVFMywgMHhCMDc1NjZDMywKKzB4QjBBNDAwMDksIDB4QjBBODAwMDksIDB4QjBBQzAwMDksIDB4QjBBQzAwMDksCisweEIwQUYwMDA5LCAweEIwMzE1NEY1LCAweDZDQ0Q2QzAzLCAweDRGMjY2MEMzLAorMHg2REY2NkVGNiwgMHg2Q0Y2MDAwQiwgMHgzNDEyRDE3MCwgMHhENjcwMDUyOSwKKzB4MjY1MEQ3NzAsIDB4Mjc0MjAwMEIsIDB4MDAwOUEwMTgsIDB4MkZENjJGQzYsCisweDRGMjIyRkU2LCAweDZFNjM2QzczLCAweDZENTNCRkVFLCAweDY0RDM1N0Y0LAorMHhCMDMzNjVFMywgMHhCMDhENjZDMywgMHhCMDBGNTRGNSwgMHg2Q0NENkMwMywKKzB4NEYyNjYwQzMsIDB4NkRGNjZFRjYsIDB4NkNGNjAwMEIsIDB4RTUwM0QxNjIsCisweEQ3NjNENDYyLCAweDIxNTI0NTE4LCAweDI0NzIwMDBCLCAweEQ0NUZEMTVFLAorMHgyMTYyRTYwMCwgMHgyNDYyMDAwQiwgMHhCRjczNEYyMiwgMHhCRjczRTQwQSwKKzB4RDI1QzAwMDksIDB4NDExOEUxMDQsIDB4RTQwQUU1MDAsIDB4QkY2OTIyMTIsCisweEQ3NTkyMjUyLCAweENCMjA2MDcyLCAweDAwMEI0RjI2LCAweDRGMjIyNzAyLAorMHg0MTBCRDE1NiwgMHhENTU2RTQwMCwgMHg0RjI2NDUyQiwgMHhEMTU1MkZFNiwKKzB4NjYxMjZFNjMsIDB4OTIxMDQ0MTgsIDB4NDQwODQ1MjgsIDB4NDUwMDI2MjksCisweDI2NUI0NDA4LCAweDI2NEI0NDAwLCAweDIxNjI0NzA4LCAweEQxNEU0NzA4LAorMHgyMTcyMjdFQiwgMHg2RUY2MDAwQiwgMHgxRkZGMDNGMCwgMHg0RjIyMkZFNiwKKzB4RTEwMURFNEEsIDB4QkYzREU0MEEsIDB4NjdFMzJFMTIsIDB4RTUwMDc3NkMsCisweEUyMDRFMTMwLCAweDI3NTJFNDBBLCAweDI3NTIyNzUyLCAweDI3NTIyNzUyLAorMHgyNzUyMjc1MiwgMHgyNzUyMjc1MiwgMHgyNzUyMjc1MiwgMHgyNzUyMjc1MiwKKzB4Mjc1MjI3NTIsIDB4Mjc1MjI3NTIsIDB4Mjc1MjI3NTIsIDB4MjcyMjI3MTIsCisweDI3NTIyNzUyLCAweDI3NTIyNzUyLCAweDI3NTIyNzUyLCAweDI3NTIyNzUyLAorMHgxNzVBQkYxOCwgMHgyRTYyRTYwMCwgMHgwMDBCNEYyNiwgMHhEMjM0NkVGNiwKKzB4RTQ0MUUxMDEsIDB4MDAwQjIyMTIsIDB4RDEzMjIyNDIsIDB4RTYwNUQ0MzIsCisweDAwMEIyMTYyLCAweDAwMEIyNDYyLCAweEQyMzAwMDA5LCAweEU0MEFFNjAxLAorMHgyMjYyQUYwMCwgMHgyRkM2MkZCNiwgMHgyRkU2MkZENiwgMHg3RkZDNEYyMiwKKzB4NkM0M0RCMkIsIDB4RUQwMDYwQjIsIDB4MkIwMkNCMDMsIDB4QzkwMzYwQjIsCisweDZFMDNBMDA4LCAweDg5MDczREMyLCAweEU0NjQ2MEIyLCAweEIwN0NDOTAzLAorMHg3RDAxNkUwMywgMHg4QkY1MkVFOCwgMHg4RjA0M0RDMiwgMHhENDIxMkZFMSwKKzB4NDYwQkQ2MjEsIDB4NjJGMTAwMDksIDB4NjAyMzYyMkQsIDB4ODlGRkM4MDEsCisweDdGMDQ2MDIzLCAweDZFRjY0RjI2LCAweDZDRjY2REY2LCAweDZCRjYwMDBCLAorMHgwMDFDM0I4OCwgMHgwMDIwM0FBMCwgMHgwMDIwMThFRSwgMHgwMDIwM0FBOCwKKzB4MDAyMDNBQjAsIDB4MDAyMDNBQjgsIDB4MDAyMDNBQzAsIDB4MDAyNUU3MjAsCisweDAwMjAzREEwLCAweDAwMjAzOEY4LCAweDAwMUM1OTY4LCAweDAwMUMzQjQwLAorMHgwMDBGODAwMCwgMHgwMDFENDAwNCwgMHgwMDFDMzUwMCwgMHgwMDIwMTVFMCwKKzB4MDAyMDE2MEMsIDB4MDAxQzU4MTQsIDB4MDAxQzU5RDAsIDB4MDAxQzU4MzAsCisweDAwMUM2MjY4LCAweDAwMUM1OUE0LCAweDAwMUM2MzlDLCAweDAwMUM1ODFDLAorMHgwMDFDNTg2MCwgMHgwMDIwM0FDOCwgMHgwMDIwMThBMiwgMHg4RjAxNDQxMSwKKzB4NjA0MzYwNEIsIDB4MDAwOTAwMEIsIDB4NTY1MUQ1MkIsIDB4NDYyODYwNTIsCisweDMwNkMwMDBCLCAweDJGQzYyRkI2LCAweDJGRTYyRkQ2LCAweDRGMTI0RjIyLAorMHhCRkYxNEYwMiwgMHg2QjAzNkU0MywgMHhERDI1REMyNCwgMHgwMDA5QkZFQywKKzB4M0MwNTMwQjgsIDB4NDYwOTA2MEEsIDB4NDYwMTQ2MDksIDB4MDIwQTNENjUsCisweDQyMDk0MjA5LCAweDMyRTI0MjA5LCAweDRGMDY4QkYwLCAweDRGMjY0RjE2LAorMHg2REY2NkVGNiwgMHgwMDBCNkNGNiwgMHgyRkM2NkJGNiwgMHgyRkU2MkZENiwKKzB4NEYxMjRGMjIsIDB4QkZDRjRGMDIsIDB4NkMwMzZFNDMsIDB4QkZDQkREMTMsCisweDMwQzgwMDA5LCAweDA2MEEzRDA1LCAweDQ2MDk0NjA5LCAweDM2RTI0NjAxLAorMHg0RjA2OEJGNSwgMHg0RjI2NEYxNiwgMHg2REY2NkVGNiwgMHg2Q0Y2MDAwQiwKKzB4NEYyMjJGRTYsIDB4RTEwMkRFMEIsIDB4RTQwM0U1MDAsIDB4QkZCOTJFMTIsCisweEU2MDYyRTUyLCAweEU3MDA0NjE4LCAweDJFNjJFNDAzLCAweDRGMjYyRTcyLAorMHg2RUY2QUZCMCwgMHgwMDA5MDAwQiwgMHgwMDFDMTA0MCwgMHhDQ0NDQ0NDRCwKKzB4MTA2MjRERDMsIDB4MDAxRDQwMDQsIDB4MkY5NjJGODYsIDB4MkZCNjJGQTYsCisweDJGRDYyRkM2LCAweDRGMjIyRkU2LCAweEU1MDA3Rjk4LCAweDY0NTNFNzEwLAorMHg2QjUzNDcyOCwgMHhFRTFBRENCQywgMHg2MTUzNjU1RCwgMHgzMTVDNDEwOCwKKzB4NzUwMTQxMDgsIDB4NjA0MzMxN0MsIDB4MEYxNjY2NUQsIDB4RUQwMDYwQjMsCisweDIxQjEzNkUzLCAweDgxMTI4MTExLCAweDExRDI4MTEzLCAweDExRDQxMUQzLAorMHg3NDA0OEZFQSwgMHhEOEIxNjdGMiwgMHgxODcxRDlCMSwgMHg1OEYxMjg3MiwKKzB4MTk4MUQxQjAsIDB4NTlGMjI5ODIsIDB4NURGNDVBRjMsIDB4NTRGNjVFRjUsCisweDIxOTIxMTkxLCAweDExQTIxMUEzLCAweDExRDQxMUQ1LCAweDExRTYxMUU3LAorMHgxMTQ4MTE0OSwgMHhEQUE4NTVGNywgMHg1N0Y4RUUwMCwgMHg1MkY5RERBNywKKzB4NjRFM0Q2QTcsIDB4MkE1MjFBNTEsIDB4RDhBN0Q5QTYsIDB4MkQ3MjlBRDUsCisweDZFRUQyNjIyLCAweDREMDg2REUzLCAweDNERUM2MUUzLCAweDREMDg0MTA4LAorMHgzRDlDMzFFQywgMHg0MTA4NjBCMywgMHg4MUQxMkRCMSwgMHg0MTA4RTA1MCwKKzB4NDAwOEU3QjcsIDB4Njc3QzQxMDgsIDB4NjBCMzgxRDIsIDB4RTIwMDMxOEMsCisweDgxRDMzNDcyLCAweDFEMTMxREQyLCAweDhEMDFENDkzLCAweEQ0OTAxRDI0LAorMHhCMEIzNjVEMywgMHg2NEVEN0UwMSwgMHg4QkRBMzRBMiwgMHgyRkQyREE4QywKKzB4REQ5MjY4QTIsIDB4MkQ4MjQ4MjksIDB4N0RGQzY0QTIsIDB4RDI4NzY5NEQsCisweDZFMjIyRDkyLCAweDdEMEM0RTI5LCAweDY4MjIyREUyLCAweDYxOEQ2QUQzLAorMHgyQTE2RDc4NCwgMHhENDhBNkQ3MiwgMHgyNEQyRDU4MywgMHhENjg5NUU3MiwKKzB4NTE3NDE0RTIsIDB4MTQxNEVFMDAsIDB4RDE4NzU4NzYsIDB4NTk3ODE0ODYsCisweDE0OThFNzEwLCAweDY1RTM2MjUyLCAweDI2RTIxNDJBLCAweEU2MDA2NEUzLAorMHg2ODQzNjQ0RCwgMHgzODRDNDgwOCwgMHgzODFDNDgwOCwgMHgwQzg2NjA1MywKKzB4MDlDRTI4QjEsIDB4ODE5MTYwQjMsIDB4MEFDRTYwNTMsIDB4ODFBMjYwNDMsCisweDBEQ0U2MDUzLCAweDgxRDM2MEIzLCAweDA4Q0U2MDUzLCAweDE4ODI3NDAxLAorMHg2MjREMDlDRSwgMHgwQUNFMTlFMywgMHgxQTY0MzI3MywgMHg3NTA0OEZFMCwKKzB4RTAwM0Q5NkEsIDB4NDAxODZDOTIsIDB4NkQ5MjJDQjEsIDB4ODFEMURBNkYsCisweDZFOTJFMDUwLCAweDgxRTI0MDA4LCAweDYwQjM2MTkyLCAweDY0OTI4MTEzLAorMHgxNDQyRTYwMCwgMHhENDY5Njc5MiwgMHg2ODkyMTdBMywgMHgxODY0RTFGRiwKKzB4NjU2M0U3MDMsIDB4MzY0QzQ2MDgsIDB4MjYxMjc1MDEsIDB4MzY3MzY2NUQsCisweERDNUI4QkY4LCAweDZEQzJFMDAzLCAweDJEQjE0MDE4LCAweEQyNjA2RUMyLAorMHg2MUMyODFFMSwgMHgxMTEyRUUwMCwgMHhFMDI0NjRDMiwgMHg2NUMyMTQyMywKKzB4MTVFNEQ0NUIsIDB4RTU4MDY3QzIsIDB4NjhDMjgxNzIsIDB4ODE4MzY2RTMsCisweDY2NkQ2NTVDLCAweDc2MDQ2OTYzLCAweDM5NEM2QTZELCAweDhGRjgzQTUzLAorMHhEQjU0MjlFMiwgMHgyNEIyREM1NCwgMHgyNEMyNzQwNCwgMHg0RjI2N0Y2OCwKKzB4NkRGNjZFRjYsIDB4NkJGNjZDRjYsIDB4NjlGNjZBRjYsIDB4NjhGNjAwMEIsCisweDYwMTE2MTQyLCAweDhGMDNDODAzLCAweEQyM0RFNTAwLCAweDhCMDYzNDIwLAorMHhDOTAzNjAxMSwgMHg4QjA2ODgwMiwgMHgzNDIwRDIzOSwgMHg1NjEyOEIwMywKKzB4NTI2NDY1MTMsIDB4MDAwQjI0MjIsIDB4MDExMzYwNTMsIDB4MkZFNjJGRDYsCisweDdGRUM0RjIyLCAweDYyNTM2RTUzLCAweDZENDNFNTUwLCAweDQ1MDhFNDAwLAorMHhFMTAxQTAwMSwgMHg2MDQzNTIyNCwgMHg4MTIxMjIxMSwgMHg2MDUzODEyMywKKzB4NTZFMjgxMjIsIDB4OEJGNTM2MjAsIDB4MTZFNEQyMzgsIDB4RTYxNDY0RjMsCisweDY1RTM0MjBCLCAweEU0RkM2NUUxLCAweDJFNTEyNTQ5LCAweDY1RjM2MUYxLAorMHgyRjExMjE0OSwgMHhEMTMxNTREMSwgMHhFNjE0NDEwQiwgMHg2MDcxNTdEMSwKKzB4MjcwMUNCMDEsIDB4N0YxNDFERTEsIDB4NkVGNjRGMjYsIDB4NkRGNjAwMEIsCisweDJGRTYyRkQ2LCAweDdGRUM0RjIyLCAweDY2NTM2RTUzLCAweDZENDNFNUZDLAorMHgyMDU5NjA2MSwgMHgyNjAxQ0IwMSwgMHgzMjYwNTJFMiwgMHgxMkU0OEIwNiwKKzB4MzFFMDUxRTIsIDB4NTJEMThCMDQsIDB4MUUyMkEwMDIsIDB4NTY2NEFGRjAsCisweDY0RjNEMjFFLCAweDQyMEJFNjE0LCAweDY3RTE2NUUzLCAweDI3MTlFMUZDLAorMHg2N0YxMkU3MSwgMHgyNzE5NTREMSwgMHg2NUYzRDExOCwgMHg0MTBCRTYxNCwKKzB4NTJEMTJGNzEsIDB4Q0IwMTYwMjEsIDB4MURFMTIyMDEsIDB4NEYyNjdGMTQsCisweDAwMEI2RUY2LCAweDAwMDA2REY2LCAweDAwMjAzOTI0LCAweDAwMjAzNEY0LAorMHgwMDIwMzRGQywgMHgwMDIwMzUwNCwgMHgwMDIwMzUyQywgMHgwMDIwMzkxMCwKKzB4MDAyMDM5MTgsIDB4MDAxMDAyMDgsIDB4MDAxMDE3QzAsIDB4MDAxRTIxMEMsCisweDAwMUMzRDAwLCAweDAwMjAzOTY0LCAweDAwMTAwMEM4LCAweDAwMTE3ODgwLAorMHgwMDExNzc4MCwgMHgwMDA0MDAyMCwgMHgwMDI2QzQwMSwgMHgwMDIwMEVENiwKKzB4NEYyMjJGRTYsIDB4REU0MjYyNEMsIDB4NDIwMDQyMDgsIDB4M0UyQ0EwMDUsCisweEQ0NDA1MjUyLCAweEJGNjk1NjI0LCAweDY1RTIyRTYyLCAweDM1MjA1MkUxLAorMHhENjNEOEJGNiwgMHg0RjI2MjYyMiwgMHg2RUY2MDAwQiwgMHgyRkM2MkZCNiwKKzB4MkZFNjJGRDYsIDB4REMzOTRGMjIsIDB4NTJDMURCMzksIDB4MzYyMDY2QzIsCisweDYwNjE4OTFDLCAweDg4MDFDOTAzLCAweERFMzQ4OTE4LCAweEJGMzdERDM1LAorMHg2NTAzNjRFMywgMHg2NkIyODUwMywgMHgzMjYyNjIwRCwgMHhENDMyODkwNywKKzB4MDAwOUJGNzYsIDB4NEQwQkQ0MzEsIDB4QUZFNjAwMDksIDB4QkYzRDAwMDksCisweEQ0MkY2NEUzLCAweDAwMDk0RDBCLCAweDAwMDlBRkRGLCAweDIyNjJEMjJELAorMHg2RUY2NEYyNiwgMHg2Q0Y2NkRGNiwgMHg2QkY2MDAwQiwgMHgyRkQ2MkZDNiwKKzB4NEYyMjJGRTYsIDB4REQyOURDMjgsIDB4NkU0MzYwQzIsIDB4MDRERTQwMDgsCisweEU2MTREMTI3LCAweDY1RTM0MTBCLCAweEQxMjdENzI2LCAweDU1RTIyN0UyLAorMHgzNUUwNTI1NCwgMHgyMTIyOEYwNCwgMHg0MDA4NjBDMiwgMHgxMjIyMDJERSwKKzB4NjA1MzY1QzIsIDB4NzUwMTQwMDgsIDB4MERFNjA2REUsIDB4QzkwRjYwNTMsCisweDYwNjMyQzAyLCAweDZFRjY0RjI2LCAweDAwMEI2REY2LCAweDg1NDM2Q0Y2LAorMHg2NTBENTY0MywgMHg2MjJENjI2MiwgMHgzNTI3NzIwNCwgMHhFMTAwOEYwQywKKzB4MjI2ODk2MEMsIDB4RDYxNThCMDMsIDB4NzIwMTUyNjEsIDB4RDYxMzE2MjEsCisweDYyNjJFMTAxLCAweDI2MjI3MjAxLCAweDYwMTMwMDBCLCAweDAwMDAwMUZGLAorMHgwMDIwMzUwNCwgMHgwMDIwMzRGQywgMHgwMDFDM0QwMCwgMHgwMDIwMzUyQywKKzB4MDAyMDM4RjQsIDB4MDAyMDE4QTIsIDB4MDAyMDM0RjQsIDB4MDAyMDNBRjAsCisweDAwMjAzQUY0LCAweDAwMUMzRDI4LCAweDAwMjAzOTY0LCAweDAwMjAzOTI0LAorMHgwMDIwMEVENiwgMHgwMDIwMzk2OCwgMHgwMDIwMzk2QywgMHgwMDExNzc1NCwKKzB4MkZDNjJGQjYsIDB4MkZFNjJGRDYsIDB4N0ZGODRGMjIsIDB4NjAyMkQyMzcsCisweDhENThDODAzLCAweERFMzYyRjAxLCAweERCMzdEQzM2LCAweDY2QzI1MkMxLAorMHg4OTJGMzYyMCwgMHhDOTAzNjA2MSwgMHg4OTJCODgwMSwgMHhEMjMzREQzMSwKKzB4NjREMzQyMEIsIDB4MUYwMTY1MDMsIDB4ODgwMTYwQjEsIDB4RDIzMDhCMDQsCisweDY0RDM0MjBCLCAweDAwMDlBRkVBLCAweDg1NjE1NjUzLCAweDg5MDRDODIwLAorMHhFMDUwRDcyQywgMHg3MjAxMDI3RSwgMHhEMjJCMDcyNiwgMHg2NDUzNDIwQiwKKzB4ODkwNzIwMDgsIDB4NTVGMUQxMjYsIDB4NjREMzQxMEIsIDB4RTYwMUQ3MjcsCisweDI3NjJBRkQ0LCAweDU1RjFEMjI2LCAweDY0RTM0MjBCLCAweEU2MDFEMTI1LAorMHgyMTYyQUZDQywgMHhERDI1REUyNCwgMHhEQzI2REIyNSwgMHg2NkQyNTJEMSwKKzB4ODkxODM2MjAsIDB4QzkwMzYwNjEsIDB4ODkxNDg4MDEsIDB4RDExN0Q0MUYsCisweDAwMDk0MTBCLCAweDM2RTA1NjAzLCAweDY1MDM4RjA0LCAweDJCMjBFMjAxLAorMHgyQzUyQUZFQywgMHhENzEyRDQxQywgMHgwMDA5NDcwQiwgMHhFNjAxRDExNSwKKzB4QUZFMzQ2MTgsIDB4NjBGMTIxNjIsIDB4ODkwN0M4MDQsIDB4N0YwOEQyMTcsCisweDZFRjY0RjI2LCAweDZDRjY2REY2LCAweDZCRjY0MjJCLCAweDRGMjY3RjA4LAorMHg2REY2NkVGNiwgMHgwMDBCNkNGNiwgMHgwMDAwNkJGNiwgMHgwMDFFMjEwMCwKKzB4MDAyMDM1MDQsIDB4MDAyMDM0RkMsIDB4MDAyMDM5OEMsIDB4MDAyMDE0QTAsCisweDAwMjAxNENDLCAweDAwMjAzNDk0LCAweDAwMjAxNkJFLCAweDAwMUUyMTJDLAorMHgwMDIwMTUzMCwgMHgwMDFDM0QzMCwgMHgwMDExNzg4MCwgMHgwMDIwMzRGNCwKKzB4MDAyMDM5MTQsIDB4MDAyMDM5MTAsIDB4MDAyMDM1MkMsIDB4MDAyMDA2MTAsCisweEU2MDFEMjAzLCAweDEyNjVENTAzLCAweDAwMEIyMjUyLCAweDAwMDAxMjY2LAorMHgwMDFDMTAxMCwgMHgwMDAwQzM0RiwgMHgwMDA5MDAwQiwgMHgyRkQ2MkZDNiwKKzB4NEYyMjJGRTYsIDB4NkQ0MzZDNTMsIDB4RUUwMEEwMDQsIDB4N0UwMTY0RDQsCisweDY0NENCRkYyLCAweDhCRjkzRUMyLCAweDZFRjY0RjI2LCAweDAwMEI2REY2LAorMHhFNTAwNkNGNiwgMHg2NjQzQTAwMiwgMHg3NjAxNzUwMSwgMHgyMjI4NjI2MCwKKzB4QUZFMzhCRkEsIDB4MkZFNjAwMDksIDB4NzUwNzYyNTMsIDB4RTEwODY3NTMsCisweDYwNDNFRTBBLCAweDQ0MDlDOTBGLCAweDY1MDMzMEUyLCAweDhEMDE0NDA5LAorMHhFNjMwRTYzNywgMHg0MTEwMzY1QywgMHg4RkYyMjc2MCwgMHhFMDAwNzdGRiwKKzB4MDAwQjgwMjgsIDB4MDAwQjZFRjYsIDB4MDAwQkUwMDAsIDB4MkZFNkUwMDAsCisweDdGRUM0RjIyLCAweDZFNDM2MjUzLCAweEJGREM2NUYzLCAweEJGRDA2NDIzLAorMHhCRkNFNjRFMywgMHhENDAzNjRGMywgMHgwMDA5QkZDQiwgMHg0RjI2N0YxNCwKKzB4NkVGNjAwMEIsIDB4MDAyMDNBRjgsIDB4RTRGREQyOUYsIDB4RDc5RjYxMjIsCisweDIyMTIyMTQ5LCAweDc0MDE2MDIyLCAweDIyMDJDQjAxLCAweEQ1OUM2NjIyLAorMHgyMjYyMjY0OSwgMHhDODQwNjA3MCwgMHg2MDUyODkwMiwgMHgyNTAyQ0IwNCwKKzB4RTFGNzY0NTIsIDB4MjU0MjI0MTksIDB4RTcwMTYwNTIsIDB4MjUwMkNCNDAsCisweEU2MDI2MDUyLCAweDI1MDJDOUNGLCAweDQ3MTg2MDUyLCAweDI1MDJDQjEwLAorMHhDQjAzNjA1MiwgMHgxNTYyMjUwMiwgMHgxNTczMDAwQiwgMHhENzhFRDU4RCwKKzB4RDQ4RkQyOEUsIDB4RTYwMEUxMDAsIDB4MjcxMTI1MTEsIDB4QUZDQjIyMTAsCisweDY2NEMyNDYxLCAweDQ2MDBEMjhCLCAweDYwNjAzNjJDLCAweDAwMEJDQjEwLAorMHg2NTRDMjYwMCwgMHg0NTAwRDI4NywgMHg2NjUwMzUyQywgMHgyNjE5RTFFRiwKKzB4MjU2MDAwMEIsIDB4RDI4NDY2NEMsIDB4MzYyQzQ2MDAsIDB4Q0IxMDYwNjAsCisweDI2MDAwMDBCLCAweEQyODA2NTRDLCAweDM1MkM0NTAwLCAweEUxRUY2NjUwLAorMHgwMDBCMjYxOSwgMHg2NjRDMjU2MCwgMHg0NjAwRDI3QSwgMHg2MDYwMzYyQywKKzB4MDAwQkNCMDgsIDB4NjU0QzI2MDAsIDB4NDUwMEQyNzYsIDB4NjY1MDM1MkMsCisweDI2MTlFMUY3LCAweDI1NjAwMDBCLCAweEQyNzM2NjRDLCAweDM2MkM0NjAwLAorMHhDQjA4NjA2MCwgMHgyNjAwMDAwQiwgMHhEMjZGNjU0QywgMHgzNTJDNDUwMCwKKzB4RTFGNzY2NTAsIDB4MDAwQjI2MTksIDB4NjI0QzI1NjAsIDB4NDIwMEQ2NjksCisweDYwMjAzMjZDLCAweDQwMjFDOTA4LCAweDQwMjE0MDIxLCAweDYwMEMwMDBCLAorMHhENjY1NjI0QywgMHgzMjZDNDIwMCwgMHhDOTA4NjAyMCwgMHg0MDIxNDAyMSwKKzB4MDAwQjQwMjEsIDB4RDE2MTYwMEMsIDB4MzQxQzY0NEMsIDB4MDAwQjYyNDAsCisweEQxNUY2MDJDLCAweDM0MUM2NDRDLCAweDAwMEI2MjQwLCAweDJGRTY2MDJDLAorMHg2RTQzNEYyMiwgMHhFNjBBNjQ1QywgMHg4OTE0MzQ2NywgMHgwMDA5QkZFQiwKKzB4NjBFQzY0MEMsIDB4OEIwMjg4MDEsIDB4QTAwMkUwMEYsIDB4NDQwOTI0MDksCisweDYyNEM0NDA5LCAweDMyNjNFNjBBLCAweEJGRTI4OTA1LCAweDYyMEM2NDRDLAorMHhDODgwNjAyMywgMHhFMjAwOEIwMCwgMHg0RjI2NjAyMywgMHg2RUY2MDAwQiwKKzB4RDY0QzRGMjIsIDB4ODgwMTYwNjIsIDB4QjI1NzhCMDMsIDB4QTAwMzAwMDksCisweEQyNDkwMDA5LCAweDIyNjBFNjQwLCAweEUyMDBENjQ4LCAweDAwMEI0RjI2LAorMHg0RjIyMjYyMiwgMHg2MDYyRDY0MywgMHg4QjAxODgwMiwgMHgwMDA5QjJBMCwKKzB4RTIwMEQ2NDIsIDB4MDAwQjRGMjYsIDB4RDUzRTI2MjIsIDB4RTEwMEQ0M0UsCisweDI1MTJFNzAxLCAweDI0NzAwMDBCLCAweEU2MDREMjNCLCAweDIyNjAwMDBCLAorMHhENDNCNEYyMiwgMHg0MTBCRDEzQiwgMHhENTNCMDAwOSwgMHg2NjUwRTFGRCwKKzB4MjYxOUQyM0EsIDB4MjU2MEU3MDAsIDB4MDAwQjRGMjYsIDB4NEYyMjIyNzAsCisweEQyMzhENTM3LCAweEQ3Mzg2MTUyLCAweDI1MTI2MTFELCAweEU2RkY2NDUyLAorMHgyNTQyMjQyQiwgMHhEMjJGRDQzNSwgMHg0MjBCNjY2RCwgMHhENTJFMjc2MiwKKzB4Njc1MEUxRkIsIDB4NEYyNjI3MTksIDB4MjU3MDAwMEIsIDB4RDQzMDRGMjIsCisweDQxMEJEMTI4LCAweEQ1MjgwMDA5LCAweDY2NTBFN0Y3LCAweDRGMjYyNjc5LAorMHgyNTYwMDAwQiwgMHg5NDI1RDUyNCwgMHgyMjQ5NjI1MCwgMHgyNTIwMDAwQiwKKzB4RTRCRkQ1MjEsIDB4MjI0OTYyNTAsIDB4MjUyMDAwMEIsIDB4RDIyNTRGMjIsCisweDYwMEQ4NTIyLCAweDg5MTEyMDA4LCAweDg5NDU4ODAxLCAweDg5NDc4ODAzLAorMHg4OTQ5ODgwNSwgMHg4OTRGODgwNiwgMHg4OTU1ODgwOCwgMHg4OTVCODgwOSwKKzB4ODk2MTg4MEEsIDB4ODk2Nzg4MEIsIDB4MDAwOUEwNkUsIDB4MDAwOUIwNzAsCisweDYwMENBMDZCLCAweDAwMDBGRjdGLCAweDAwMUUyMTQ4LCAweDAwMUUxMDAwLAorMHgwMDFFMTEwOCwgMHgwMDIwMzlDNCwgMHgwMDIwMzlDNiwgMHgwMDIwMzlFNSwKKzB4MDAyMDM5QTgsIDB4MDAxRTEwM0YsIDB4MDAxRTEwNUYsIDB4MDAxRTEwMkYsCisweDAwMUUxMDkwLCAweDAwMjAzOUNDLCAweDAwMUUxMDBCLCAweDAwMjAzOUM4LAorMHgwMDIwM0FGQywgMHgwMDIwMThBMiwgMHgwMDFFMTAyOCwgMHgwMDIwMzlFNCwKKzB4MDAxRDQwMjAsIDB4OTg3NjAwMDAsIDB4MDAxQzEwMDAsIDB4MDAyMDNCMDgsCisweDAwMjAzQjE4LCAweDAwMjAzOTlDLCAweDAwMDlCMDRDLCAweDYwMENBMDM1LAorMHgwMDA5QjA1NSwgMHg2MDBDQTAzMSwgMHg2MjYwRDY4NCwgMHg4QjJCMjIyOCwKKzB4MDAwOUIwNjEsIDB4NjAwQ0EwMjksIDB4NjI2MEQ2ODAsIDB4OEIyMzIyMjgsCisweDAwMDlCMDY5LCAweDYwMENBMDIxLCAweDYyNjBENjdDLCAweDhCMUIyMjI4LAorMHgwMDA5QjBDNywgMHg2MDBDQTAxOSwgMHg2MjYwRDY3OCwgMHg4QjEzMjIyOCwKKzB4MDAwOUIwQ0QsIDB4NjAwQ0EwMTEsIDB4NjI2MEQ2NzQsIDB4OEIwQjIyMjgsCisweDAwMDlCMTI1LCAweDYwMENBMDA5LCAweDYyNjBENjcwLCAweDhCMDMyMjI4LAorMHgwMDA5QjEzRCwgMHg2MDBDQTAwMSwgMHg0RjI2RTAwMCwgMHgwMDA5MDAwQiwKKzB4RDI2Q0QxNkIsIDB4RDU2Qzg0MTIsIDB4NDAwMEM5MEYsIDB4RDc2QjAxMkQsCisweEU0MDNENjZCLCAweEUyMEY2MTFDLCAweDI1NDBFMDAxLCAweDI1MjAyNzEyLAorMHgyNjAyMDAwQiwgMHhFNjAxRDI2MiwgMHgzMDY2ODUyMywgMHhFMDAwOEQwNSwKKzB4RDY2M0QyNjAsIDB4RTAwMTgxMjIsIDB4MDAwQjI2MDIsIDB4RDI1QzAwMDksCisweDYwMEQ4NTIzLCAweDg5MDUyMDA4LCAweDhCMEE4ODAxLCAweDYwNjBENjVELAorMHgyNjAwQ0IwMSwgMHhENDU3RDY1QSwgMHhFMDAxRTEwMSwgMHgwMDBCMjYxMiwKKzB4MDAwQjgxNDIsIDB4RDE1MkUwMDAsIDB4ODUxM0U1MDEsIDB4NjQwRDQ1MTgsCisweDY2MDMzNDUzLCAweEUwMDA4RDA1LCAweEQ1NTFEMjUzLCAweDIyNjBFMDAxLAorMHgwMDBCMjUwMiwgMHg0RjIyMDAwOSwgMHg4NTEzRDE0OSwgMHg2NDUzNjUwRCwKKzB4NjI0OTQ0MTksIDB4MjI3RDY3MkUsIDB4ODgwMTYwMkMsIDB4ODgwMjg5MDksCisweDg4MDM4OTEwLCAweDg4MDY4OTFBLCAweDg4MDc4OTM1LCAweEEwNEM4OTNCLAorMHhENTQ2MDAwOSwgMHg2NjUyRDc0NiwgMHgyNzYyRDQ0NiwgMHg2MjJDNjI2MSwKKzB4MjQyMUEwMzgsIDB4MjIyODYyNUMsIDB4RDQ0MzhCM0YsIDB4NjY0MkQ1NDAsCisweDI1NjJENDQwLCAweDI0MDE4NTYxLCAweDYyMDNBMDJDLCAweDIwMDg2MDVDLAorMHg4ODEwODkwNywgMHg4ODIwODkwOCwgMHg4ODMwODkwOSwgMHhBMDJDODkwQSwKKzB4RDIzQTAwMDksIDB4NjIyMkEwMDgsIDB4QTAwNUQyMzksIDB4RDIzOTYyMjIsCisweDYyMjJBMDAyLCAweDYyNjJENjM4LCAweEQ0MzJENTMxLCAweDY2MjEyNTIyLAorMHhBMDBGNjI2QywgMHhENjM1MjQyMSwgMHg2MjYxRDUyRCwgMHg2MjJDRDQyRCwKKzB4QTAwNzI1NjIsIDB4RDYzMjI0MjEsIDB4ODU2MUQ1MjksIDB4MjU2MkQ0MjksCisweDYyMDMyNDAxLCAweDY2MkQ4NTE1LCAweDM2MTc2MTBELCAweDY1MDM4RjAxLAorMHhCMENCMjQ1MSwgMHhBMDAxMDAwOSwgMHhFMDAwRTAwMSwgMHgwMDBCNEYyNiwKKzB4RDYxOTAwMDksIDB4RDQyN0UxMDEsIDB4NjU0MTI2MTAsIDB4RDExOEQ3MTcsCisweEUyMEY2NTVELCAweDI3NTJFMDAxLCAweDAwMEIyNjIwLCAweDJGRTYyMTAyLAorMHhEMjBGNEYyMiwgMHg2NDBDODUyMywgMHg4QjA4MjQ0OCwgMHhENTExRDYxRCwKKzB4MjYyMUUyMDAsIDB4OTQwRjg0NTEsIDB4QTA0ODIwNDksIDB4REUwRDgwNTEsCisweEM4NDA2MEUwLCAweEUyMDE4RDMyLCAweDg5NDQzNDI3LCAweEQyMTZENjE1LAorMHgyNjQxNDIwQiwgMHgwMDA5QTAzMCwgMHgwMDAwRkY3RiwgMHgwMDIwMzlFNSwKKzB4MDAyMDM5OUMsIDB4MDAyMDM5QTgsIDB4MDAxRTExMDAsIDB4MDAxRTEwMEMsCisweDAwMjAzOUM4LCAweDAwMUUxMDAwLCAweDAwMUUxMDAxLCAweDAwMjAzOUQwLAorMHgwMDIwMzlCMCwgMHgwMDIwMzlCNCwgMHgwMDIwMzlCOCwgMHgwMDIwMzlENCwKKzB4MDAyMDM5RDgsIDB4MDAyMDM5REMsIDB4MDAyMDM5RTAsIDB4MDAyMDNFMDQsCisweDAwMjAzRTBFLCAweDAwMjAzOUMyLCAweDAwMjAyODg2LCAweDg5MTIzNDI3LAorMHhEMjk0RDY5MywgMHgyNjQxNDIwQiwgMHhDQjgwODRFMSwgMHg4MEUxQjBGNSwKKzB4RDY5MTYwRTAsIDB4MkUwMENCMDQsIDB4QzkzRjYwNjAsIDB4RDY4RjI2MDAsCisweEEwMDFFMDAxLCAweEUwMDAyNjAyLCAweDAwMEI0RjI2LCAweEQ2OEM2RUY2LAorMHhDODgwNjA2MCwgMHhEMjg2ODkxOSwgMHg4ODAxNjAyMSwgMHhEMjg5OEIxNSwKKzB4ODUyNEU1MDEsIDB4ODkxMDMwNTYsIDB4RTIwM0QxODcsIDB4MjEyMEQ0ODcsCisweEUwMEI2NTQxLCAweDA2NTY2NTVELCAweEU0MEZENTg1LCAweDIxNDBFNzAyLAorMHhENzdFMjU3MSwgMHgwMDBCRTAwMSwgMHgwMDBCMjcwMiwgMHgyRkU2RTAwMCwKKzB4REU4MDRGMjIsIDB4Qzg4MDg0RTEsIDB4RDU3QTg5MkMsIDB4MjAwODg1NTQsCisweDYxMDM4RjI4LCAweDg1NTNENzdDLCAweDY0MDM2NjcyLCAweDg1NjY2NTBDLAorMHgzNTIwNjIwQywgMHhENjc5OEIxRSwgMHg2NTFDRDc3NCwgMHgyNjUxNjQ0QywKKzB4NjBFMDI3NDEsIDB4ODkwNEM4NDAsIDB4NDIwQkQyNzUsIDB4QTAwMzAwMDksCisweEQyNjgwMDA5LCAweDAwMDk0MjBCLCAweDAwMDlCMDlGLCAweEUyMDFEMTY3LAorMHg2MEUwMjEyMiwgMHhDQjA0RDQ2NCwgMHg2MDQwMkUwMCwgMHgyNDAwQzkzRiwKKzB4NjAyM0EwMDEsIDB4NEYyNkUwMDAsIDB4NkVGNjAwMEIsIDB4MkZCNjJGQTYsCisweDJGRDYyRkM2LCAweERBNjIyRkU2LCAweDY2QTFFMjQwLCAweDM2MjJEQzVFLAorMHg2MjYzODkwMCwgMHg2RUQzNkQyQywgMHg0RTIxMzZEOCwgMHg0RTIxMkE2MSwKKzB4REI2MUQ0NjAsIDB4RTcwMEEwMEYsIDB4NzcwMTYyQjIsIDB4NzEwMjYxMjMsCisweDY2MjEyQjEyLCAweDcxMDI2MjEzLCAweDYxMjEyQjEyLCAweDY1MUQ2NjZELAorMHgzNTZDNDUyOCwgMHg2MjdDMjQ1MiwgMHg4QkVEMzJFMywgMHhDOTAzNjBEMywKKzB4OEIxMDg4MDMsIDB4NjE3MzY3QjIsIDB4MkIxMjcxMDIsIDB4NzEwMjZFMTMsCisweDJCMTI2NTcxLCAweDY1NUQ2REUxLCAweDQyMjg2MkRELCAweDMyNUNFMTA3LAorMHhBMDBDMkMxMCwgMHg4ODAyMjQyMiwgMHhBMDAzOEIwMSwgMHg4ODAxRTIwMywKKzB4RTIwMThCMDUsIDB4NjZCMjJDMjAsIDB4NjU1RDY1NjEsIDB4RTYwRjI0NTIsCisweDY3QTEyQzYwLCAweDhCMDUyNzc4LCAweEREMzhEQzQ0LCAweEVCMDFFQTAwLAorMHgyREIyMkNBMiwgMHg2REY2NkVGNiwgMHg2QkY2NkNGNiwgMHg2QUY2MDAwQiwKKzB4MkZFNjJGRDYsIDB4RTI0MEREMzYsIDB4MzYyMjY2RDEsIDB4NjI2Mzg5MDAsCisweDM2Nzg2NzJDLCAweDc3MDNERTM4LCAweDQ3MjEyRDYxLCAweDY0RTJENjM1LAorMHhBMDBFNDcyMSwgMHg2NTYyRTEwMCwgMHg2MjUzNzEwMSwgMHg3NDAxMjQ1MCwKKzB4MjQyMDQyMTksIDB4NDUyOTc0MDEsIDB4NzQwMTI0NTAsIDB4MjQ1MDQ1MTksCisweDYyMUM3NDAxLCAweDhCRUUzMjczLCAweDY2RTI0MjAwLCAweDQyMDA2MUQxLAorMHgyMTE4MzYyQywgMHgyRTYyOEYwNiwgMHhERDFDRDcyOCwgMHhFNTAxRTQwMCwKKzB4MkQ1MjI3NDIsIDB4MDAwQjZFRjYsIDB4MkZENjZERjYsIDB4NEYyMjJGRTYsCisweEVEMEFFRTAxLCAweDY0RTNCQzg1LCAweEJDOEE2NEUzLCAweDYyRUM3RTAxLAorMHg4QkY3MzJENywgMHhCQzhERUUwMSwgMHg2NEUzNjRFMywgMHg3RTAxQkM5MiwKKzB4MzJENzYyRUMsIDB4NEYyNjhCRjcsIDB4MDAwQjZFRjYsIDB4RDExODZERjYsCisweEQ0MTg5MjBELCAweDcyMTIyMTIyLCAweDI0MjJENjE3LCAweEQ3MTc3MjA0LAorMHg3MjIwMjYyMiwgMHgyNzIyRDExNiwgMHgwMDBCNzIzMCwgMHgxMzdBMjEyMiwKKzB4MDAyMDM5QzIsIDB4MDAyMDI5OTIsIDB4MDAxRTEwMTUsIDB4MDAyMDM5QzgsCisweDAwMUUxMDAxLCAweDAwMjAzOTlDLCAweDAwMUUxMTAwLCAweDAwMjAzOUM2LAorMHgwMDIwMzlCNCwgMHgwMDFFMTAwMCwgMHgwMDIwMzlCOCwgMHgwMDIwMzlDNCwKKzB4MDAyMDI4ODYsIDB4MDAxRTEwMEMsIDB4MDAyMDM5QjAsIDB4MDAyMDM5Q0MsCisweDAwMjAzOUQwLCAweDAwMjAzOUQ0LCAweDAwMjAzOUQ4LCAweDAwMjAzOURDLAorMHgwMDIwMzlFMCwgMHg0RjIyMkZFNiwgMHhENjcwN0ZGQywgMHg4ODAxNjA2MCwKKzB4RTIwMTg5NTEsIDB4MjYyMEJGQkIsIDB4RDU2RUQxNkQsIDB4REU2RTYwMTAsCisweDY0RTM2NTUyLCAweDc0MDJDODQwLCAweDhEMjJEMTZDLCAweEQyNkM3NTAyLAorMHhFNjAxRDc2QywgMHhFNzA0MjcyMiwgMHg3NjAxNjI1NSwgMHg2MjZDMjQyMSwKKzB4OEZGOTMyNzMsIDB4RDQ2Mzc0MDIsIDB4NjI0MkU2MDEsIDB4NjQwRDg1MjgsCisweDY3NDk0NDE5LCAweDI3NUQ2NTdFLCAweDgxRTQ2MDdDLCAweEU0MTdENTYyLAorMHg2NzU1NzYwMSwgMHgzMjQzNjI2QywgMHg4RkY5MjE3MSwgMHhBMDIwNzEwMiwKKzB4RDI1RTAwMDksIDB4RTYwMUQ3NUIsIDB4RTcwNDI3MjIsIDB4NzYwMTYyNTUsCisweDYyNkMyNDIxLCAweDhGRjkzMjczLCAweEQ0NTI3NDAyLCAweDYyNDJFNjAxLAorMHg2NDBEODUyOCwgMHg2NzQ5NDQxOSwgMHgyNzVENjU3RSwgMHg4MUU0NjA3QywKKzB4RTQxN0Q1NTMsIDB4Njc1NTc2MDEsIDB4MzI0MzYyNkMsIDB4OEZGOTIxNzEsCisweDkyODk3MTAyLCAweEQyNDYyRTIxLCAweDVFMjNENzRFLCAweDY0RjIyRkUyLAorMHg2MDQzNjVGMiwgMHgyNzAwQzk4MCwgMHhDOTYwNjA0MywgMHg4MDcxNjEwMywKKzB4QzkwMzYwNDMsIDB4ODA3MjQ1MTksIDB4NjVGMjYwNUMsIDB4ODE3MjY2RjIsCisweDQ2MTk0NjI5LCAweDYwNkM0NTI5LCAweDQwMTg2NDVDLCAweDgxNzMzMDRDLAorMHgyMTE4NUUyMywgMHg2NEYyMkZFMiwgMHg2RTRDNjJGMiwgMHg2MDJDNDIxOSwKKzB4NjZGMjYyRjIsIDB4NDYyOTQwMTgsIDB4NDYxOTMwRUMsIDB4NDIyOTgxNzQsCisweDY1MkM2MDZDLCAweDMwNUM0MDE4LCAweDgxNzU4RjA3LCAweDAwMDlCQzk2LAorMHgyMjI4NjIwQywgMHhBMDBBODkwOCwgMHg2MDEzMDAwOSwgMHg4QjAzODg0MCwKKzB4MDAwOUIwMDksIDB4MDAwOUEwMDMsIDB4RTIwMkQ2MkYsIDB4N0YwNDI2MjIsCisweDAwMEI0RjI2LCAweDRGMjI2RUY2LCAweDg1NTJENTJBLCAweDg4MzA2MDBELAorMHg4ODMxODkwMywgMHhBMDM0ODkyMywgMHg4NTU1MDAwOSwgMHhENDI4RDcyNywKKzB4ODU1MzI3MDEsIDB4NjEwREQ2MjcsIDB4MjQxMjQxMTgsIDB4NDYwQkQ0MjYsCisweEQ3MjMwMDA5LCAweEQyMjZENDI1LCAweDY1NzI0MjBCLCAweEUyMzBEMTIwLAorMHg0MjI4NjcxMiwgMHgyNzI5RTYyMCwgMHgzNzYwNDYyOCwgMHhENjIxOEIwMywKKzB4QTAxNkUyMDAsIDB4RDYxRjI2MjIsIDB4QTAxMkUyMDIsIDB4RDExODI2MjIsCisweDYyMTJFNTMwLCAweEU2MjA0NTI4LCAweDQ2MjgyMjU5LCAweDg5MDgzMjYwLAorMHhENDFBRDExOSwgMHhFNjAxRDUxMywgMHgyMTYwNDUwQiwgMHg0NzJCRDcxOCwKKzB4NEYyNjRGMjYsIDB4MDAwOTAwMEIsIDB4MDAwMDA2MEEsIDB4MDAyMDM5RTQsCisweDAwMUUxMDAwLCAweDAwMjAzOUQwLCAweDAwMjAzRTA0LCAweDAwMjAzRTEwLAorMHgwMDIwM0RBOCwgMHgwMDIwMzlCOCwgMHgwMDIwM0REOCwgMHgwMDIwM0RENiwKKzB4MDAyMDNEQUEsIDB4MDAyMDM5OUMsIDB4MDAyMDM5QzgsIDB4MDAyMDM5QjQsCisweDAwMjAzOUIwLCAweDAwMjAxOEEyLCAweDAwMjAzQjI0LCAweDAwMjAzQjI4LAorMHgwMDIwMThFRSwgMHgwMDIwMzlDQywgMHgwMDFFMTAwQiwgMHgwMDIwM0IzQywKKzB4MDAxMTQwMDQsIDB4NEYyMjJGRTYsIDB4REU5NjdGRkMsIDB4MjAwODg0RTksCisweDJGMDA4RDA2LCAweEQ2OTVENDk0LCAweDAwMDk0NjBCLCAweDY0RjBCMTlBLAorMHg2NjIwRDI5MywgMHg4OTAyMjY2OCwgMHhDOUJGNjBFMCwgMHg3RjA0MkUwMCwKKzB4MDAwQjRGMjYsIDB4MDAwQjZFRjYsIDB4MkZFNjAwMDksIDB4REU4RDRGMjIsCisweDYwRTBENjhELCAweENCQzBENDhELCAweDYyNjAyRTAwLCAweEM4MDM2MDJDLAorMHg0MDIxODkwNCwgMHg3MDAxNDAyMSwgMHg2NjAzQTAwMiwgMHg2NjAzNDAwOSwKKzB4RDY4NzYxNkQsIDB4RTUwMEEwMDQsIDB4NzUwMTYyNjIsIDB4NzQwNDI0MjIsCisweDMyMTM2MjVELCAweEQyODM4QkY4LCAweDAwMDk0MjBCLCAweEM5QkY4NEUyLAorMHg0RjI2ODBFMiwgMHg2RUY2MDAwQiwgMHgyRkU2MkZENiwgMHg3RkZDNEYyMiwKKzB4NjI2MEQ2N0QsIDB4ODk0NDIyMjgsIDB4RDU3MkUxMDAsIDB4NjA1MDI2MTAsCisweENCNDBENDdBLCAweDI1MDA0NDBCLCAweDhEMDUyMDA4LCAweDYyRTA2RTAzLAorMHg3MTA0NjEyQywgMHgyRjExQTAwNiwgMHhENDc1RDY2RCwgMHhERDc1Njc2MCwKKzB4NjU3QzREMEIsIDB4RTIzQzZEMUQsIDB4OEIwMzNEMjcsIDB4RDI2N0Q0NzIsCisweDAwMDk0MjBCLCAweDREMjE0RDIxLCAweEEwMDVENzcwLCAweDY2RTZFNDAwLAorMHgzNTdDNDUwOCwgMHg3NDAxMjU2MiwgMHgzNUQzNjU0RCwgMHhENzZDOEJGNywKKzB4NjE3MkUwMDMsIDB4ODExMTQwMTgsIDB4NkU3MjYwRjEsIDB4ODFFMjcwMEMsCisweEQ0Njg2MTcyLCAweERENjg4MTEzLCAweDREMEJERTY4LCAweEUyMDE2NTcyLAorMHhENDY3MkUyMiwgMHg0MjBCRDI1NSwgMHhENjU2MDAwOSwgMHhDOTNGNjA2MCwKKzB4N0YwNDI2MDAsIDB4NkVGNjRGMjYsIDB4NkRGNjAwMEIsIDB4MkZDNjJGQjYsCisweDJGRTYyRkQ2LCAweEQyNUY0RjIyLCAweDZCNDM2RTczLCAweDQyMEI2QzUzLAorMHgyMDA4NkQ2MywgMHg2NDAzOEQxQywgMHhFNTBFRDE0OSwgMHgzMjUyNjIxMCwKKzB4NjBDMzg5MTYsIDB4ODA0MTI0QjAsIDB4ODE0MTYwRDMsIDB4QTAwN0U1MDAsCisweDY1NUQ2MUJDLCAweDAwRUM2MDUzLCAweDM2NEM2NjUzLCAweDgwNjQ3NTAxLAorMHgzMjEzNjI1RCwgMHhENjNCOEJGNSwgMHhDOUJGNjA2MCwgMHgyNjAwQTAwOCwKKzB4RDIzQUQ0NEQsIDB4NkVGNjRGMjYsIDB4NkNGNjZERjYsIDB4NkJGNjQyMkIsCisweDZFRjY0RjI2LCAweDZDRjY2REY2LCAweDZCRjYwMDBCLCAweDdGQzQ0RjIyLAorMHg3MjAyNjJGMywgMHgyMjUxMkY0MSwgMHg0NTI5NzIwMiwgMHg2MDYzMjI1MSwKKzB4RTVDNEU2ODIsIDB4NjdGMzgxMjEsIDB4NjU1QzY2NkMsIDB4RTQwOEJGQjYsCisweDRGMjY3RjNDLCAweDAwMDkwMDBCLCAweDJGOTYyRjg2LCAweDJGQjYyRkE2LAorMHgyRkQ2MkZDNiwgMHg0RjIyMkZFNiwgMHhFMTAwN0ZDNCwgMHg2NTEzRUNGRiwKKzB4NkIxMzZDQ0QsIDB4REUzNkQ3MzUsIDB4RURGRjY0RjMsIDB4RDgzNUVBMDQsCisweDYwNTM2NTVDLCAweDAyN0Q0MDAwLCAweDMyQzA2MjJELCAweDY2MDM4RDBELAorMHgwOUVENjA2MywgMHgyNDkxMDI3RCwgMHgyNDIxNzQwMiwgMHg2OTgyMDJFRCwKKzB4MzkyODYyMkQsIDB4NzQwMjI4OTIsIDB4NzUwMTcxMDQsIDB4NjA2MzYyNUMsCisweDA3RDUzMkEyLCAweDBFQjU4RkU0LCAweDI0NDg2NDFDLCAweEU2ODA4OTA1LAorMHg2N0YzRTVDNSwgMHhCRjc5NjY2QywgMHg3RjNDNjU1QywgMHg2RUY2NEYyNiwKKzB4NkNGNjZERjYsIDB4NkFGNjZCRjYsIDB4MDAwQjY5RjYsIDB4RDExRTY4RjYsCisweDYwMTJEMjFFLCAweENCMjBFNDA1LCAweDIxMDJFNTAwLCAweDAwMEIyMjQyLAorMHgwMDAwMjI1MiwgMHgwMDFFMTAxNywgMHgwMDIwM0I0MCwgMHgwMDIwMThBMiwKKzB4MDAyMDM5MEUsIDB4MDAxRTEwMTUsIDB4MDAxRTEwQkYsIDB4MDAxMTc4MDAsCisweDAwMUUxMEZDLCAweDAwMjAwNjEwLCAweDAwMjAzOTE0LCAweDAwMjAyQUVBLAorMHgwMDIwM0I0NCwgMHgwMDIwMThFRSwgMHgwMDIwM0I2MCwgMHgwMDExNzg4QywKKzB4MDAyMDM5MTAsIDB4MDAyMDM0RjQsIDB4MDAyMDE1MzAsIDB4MDAxRTIxMzAsCisweDAwMjAzQjY4LCAweDAwMjAyQUFDLCAweDAwMjAzQjZDLCAweDAwMjAzOTc0LAorMHgwMDIwMzk3QywgMHgwMDIwM0RBNCwgMHgwMDFDMzUwMCwgMHgwMDFENDAwNCwKKzB4RDU2NEQxNjMsIDB4RTQwMEQ3NjQsIDB4MjE0MkUyMEYsIDB4MTc0MTExNTQsCisweEQ1NjIyNzIyLCAweDk2NjlENzYyLCAweDE1NDEyNTcyLCAweDk2NjYxNTYyLAorMHhFNjAxMTU2NSwgMHhENTVGMTE2NSwgMHg2NjZDRTZGOCwgMHgyNTQyMjU0MiwKKzB4MjU0MjI1NDIsIDB4MjU0MjI1NDIsIDB4MjU2MjI1NDIsIDB4NzYwMUU3MjcsCisweDY3NjMyNTcyLCAweDI1NjI3Nzk3LCAweEU3MDQyNTcyLCAweDI1NzJFMjQ4LAorMHhFMjE5MjUyMiwgMHhFMjcwMjUyMiwgMHgyNTQyMjU0MiwgMHgyNTQyMjU0MiwKKzB4MjUyMjI1NDIsIDB4MjUyMkUyMEMsIDB4MjU0MjI1NDIsIDB4MjU0MjI1NDIsCisweDI1NDIyNTQyLCAweDI1NDIyNTQyLCAweDAwMEIxNTRBLCAweEUyMDgxMTQ1LAorMHgwMDA5NDIyQiwgMHgyRkU2MkZENiwgMHg3RkZDNEYyMiwgMHhDODIwNjA0MywKKzB4NkU0MzhEMDIsIDB4MDAwOUJFNjcsIDB4QzgxMDYwRTMsIDB4QkU2NDg5MDEsCisweDYwRTMwMDA5LCAweDg5MDFDODQwLCAweDAwMDlCRTg2LCAweEM4MDE2MEUzLAorMHhERDNEODkzOCwgMHhDODAyNjBEMCwgMHgyRjAwOEQwMywgMHg0NjBCRDYzQiwKKzB4NjBGMDAwMDksIDB4ODkwMkM4MDQsIDB4NDYwQkQ2MzksIDB4NjJGMDAwMDksCisweEM4ODA2MDIzLCAweDYwRDA4OTAyLCAweDJEMDBDOTdGLCAweEM4MDE2MDIzLAorMHhENjM0ODkwNiwgMHgwMDA5NDYwQiwgMHgwMDA5QTAwNywgMHg1MTYzMDYwMSwKKzB4ODkwMkM4MDgsIDB4NDYwQkQ2MzAsIDB4NjBGMDAwMDksIDB4ODkwMkM4MTAsCisweDQyMEJEMjJFLCAweEQ1MkUwMDA5LCAweDg4MDI2MDUyLCAweEQyMkQ4QjAzLAorMHhBMDA1RTYwNCwgMHg4ODAxMjI2MCwgMHhEMjJBOEIwMiwgMHgyMjYwRTYwMSwKKzB4MjUyMkUyMDAsIDB4Qzg4MDYwRTMsIDB4RDIyNzg5MkQsIDB4NjBFMzZFMjAsCisweDg5MDJDODgwLCAweDQyMEJEMjI1LCAweDYwRTMwMDA5LCAweDg5MDJDODQwLAorMHg0MjBCRDIyMywgMHg2MEUzMDAwOSwgMHg4OTAyQzgwMiwgMHg0MjBCRDIyMSwKKzB4NjBFMzAwMDksIDB4ODkwREM4MDQsIDB4REQyMEQxMUYsIDB4MDAwOTQxMEIsCisweDAwMDlCRjBELCAweDAwMDlCRjRDLCAweEQ1MUVENDFELCAweDI0NzBFNzA4LAorMHgyNUQyQkY4NSwgMHhDODA4NjBFMywgMHhEMjFCODkwNSwgMHg0RjI2N0YwNCwKKzB4NDIyQjZFRjYsIDB4N0YwNDZERjYsIDB4NkVGNjRGMjYsIDB4NkRGNjAwMEIsCisweDAwMUM1ODFDLCAweEEwMDBBMDAwLCAweDAwMUQwMTAwLCAweDAwMUQ0MDAwLAorMHgwMDA0MDAyMSwgMHgwMDFDNTg5QywgMHgwMDFFMTAyMSwgMHgwMDIwMUE5MCwKKzB4MDAyMDFBQjIsIDB4MDAyMDIxMTQsIDB4MDAyMDFBQ0EsIDB4MDAyMDFBRDgsCisweDAwMjAzOUM4LCAweDAwMUUxMDBCLCAweDAwMUUxMDI4LCAweDAwMjAxQjQ0LAorMHgwMDIwMUI1MCwgMHgwMDIwMUFFMCwgMHgwMDIwMUFGRSwgMHgxMjM0NTY3OCwKKzB4MDAxRTEwMDAsIDB4MDAxMEYxMDAsIDB4MDAyMDFCMkMsIDB4NjQ0Q0Q2QTcsCisweDAwMEIzNDZDLCAweEQ2QTYyNDUwLCAweDM0NkM2NDRDLCAweDI0NTAwMDBCLAorMHg2NDRDRDZBNCwgMHgwMDBCMzQ2QywgMHg2MjVDMjQ1MCwgMHg0MjA4NjE2RCwKKzB4NDIwODQxMTksIDB4NDIwMDYwMTksIDB4NjcwRTYxNEMsIDB4RDQ5RTMyMUMsCisweDQyMDAyMDdELCAweDMyNENDOTBGLCAweDIyMDAwMDBCLCAweDQyMDg2MjVDLAorMHg0MjAwNDIwOCwgMHgzMjRDNjQ0QywgMHg0MjAwRDQ5OCwgMHgwMDBCMzI0QywKKzB4MkZFNjIyNjAsIDB4NjE0QzRGMTIsIDB4NDEwMEQ0OTMsIDB4NjcxMDMxNEMsCisweEUyOUY2NjZELCAweDI3Mjk0NjE5LCAweDZFNTM2MjY5LCAweDY3MkU2NTczLAorMHg0MjIxMjI3RCwgMHg0MjIxNDIyMSwgMHg3NjAxNjYyQywgMHhFNDAxNDYwOCwKKzB4MzRFODQ2MDgsIDB4NjQ0QzQ2MDAsIDB4MDcxQTA0NjcsIDB4MjE1MDI1N0IsCisweDAwMEI0RjE2LCAweDRGMjI2RUY2LCAweEQyODU3RkU4LCAweDg4MDE2MDIxLAorMHhEMjg0OEI3QiwgMHgyNjY4NjYyMSwgMHhEMjgzOEI3NywgMHgyNjY4NjYyMSwKKzB4RTUwRjhCNzMsIDB4RTQwMUJGQTIsIDB4QkZBNEU1MDEsIDB4RTU4NkU0MDAsCisweEU0MDA2NTVDLCAweDJGNTBCRkE0LCAweEJGQTFFNDAxLCAweEU2MDJFNTA2LAorMHg2MDYzNDYxOCwgMHg4MUYyRTQwMSwgMHg2NTQzQkY5RiwgMHhFNDAxODVGMiwKKzB4QkZBQjY1NDMsIDB4ODVGMjY2MDMsIDB4NjU0M0U0MDEsIDB4NjYwM0JGQjEsCisweEU0MDI2NUYwLCAweDYwNTM3NTZDLCAweDgwRjhCRjgwLCAweEJGODJFNDAyLAorMHg4NEY4RTUxMiwgMHg3MDkwRTQwMiwgMHg2NTAzQkY4MiwgMHg0NjE4RTYwMiwKKzB4ODFGNjYwNjMsIDB4QkY4MEU0MDIsIDB4ODVGNkU1MDAsIDB4NjYwM0U0MDIsCisweEU1MDBCRjhDLCAweEU0MDI4NUY2LCAweEJGOTI2NjAzLCAweEU1RkVFNTAwLAorMHhFMDEwNjU1QywgMHhCRjYxRTQwMywgMHhFNTEzMEY1NCwgMHhFNDBFQkY2MywKKzB4MDVGQ0UwMTAsIDB4QkY2M0U0MEUsIDB4RTUwMDc1ODUsIDB4QkY2NEU0MDMsCisweEU1MDBFNjQwLCAweEJGNzFFNDAzLCAweEU1MDBFNjQwLCAweEJGNzhFNDAzLAorMHhFNUZGRTY0MCwgMHhFMDE0NjU1QywgMHhCRjQ3RTQwNCwgMHhFNDBGMEY1NCwKKzB4RTUwNEJGNDksIDB4MDVGQ0UwMTQsIDB4QkY0OUU0MEYsIDB4RTUwMTc1ODQsCisweEJGNEFFNjQwLCAweEU1MDFFNDA0LCAweEJGNTdFNjQwLCAweEU1MDFFNDA0LAorMHhFNDA0RTY0MCwgMHhBRjVDN0YxOCwgMHg3RjE4NEYyNiwgMHgwMDBCNEYyNiwKKzB4NEYyMjAwMDksIDB4RDI0MjdGRjAsIDB4ODgwMTYwMjEsIDB4RDI0MThCNzEsCisweDI2Njg2NjIxLCAweEQyNDA4QjZELCAweDI2Njg2NjIxLCAweEU1MEY4QjY5LAorMHhFNDAxQkYxQywgMHhCRjFFRTUwMSwgMHhFNTg2RTQwMCwgMHhFNDAwNjU1QywKKzB4MkY1MEJGMUUsIDB4QkYxQkU0MDEsIDB4RTQwMUU1MDYsIDB4QkYxQzY1NDMsCisweEU0MDFFNjQwLCAweEJGMjk2NTQzLCAweEU0MDFFNjQwLCAweEJGMzA2NTQzLAorMHg2NUYwRTY0MCwgMHg3NTZDRTQwMiwgMHhCRUZGNjA1MywgMHhFNDAyODBGNCwKKzB4RTUxMkJGMDEsIDB4RTQwMjg0RjQsIDB4QkYwMTcwOTAsIDB4RTY0MDY1MDMsCisweEJGMDJFNDAyLCAweEU2NDBFNTAwLCAweEJGMEZFNDAyLCAweEU2NDBFNTAwLAorMHhCRjE2RTQwMiwgMHhFNUZFRTUwMCwgMHg2MDUzNjU1QywgMHhCRUU1RTQwMywKKzB4RTUxMzgwRjgsIDB4RTQwRUJFRTcsIDB4RTQwRTg0RjgsIDB4QkVFNzcwODUsCisweEU1MDA2NTAzLCAweEJFRThFNjQwLCAweEU1MDBFNDAzLCAweEJFRjVFNjQwLAorMHhFNTAwRTQwMywgMHhCRUZDRTY0MCwgMHhFNUZGRTQwMywgMHg2MDUzNjU1QywKKzB4QkVDQkU0MDQsIDB4RTQwRjgwRkMsIDB4RTUwNEJFQ0QsIDB4RTQwRjg0RkMsCisweEJFQ0Q3MDgzLCAweEU1MDE2NTAzLCAweEJFQ0VFNjQwLCAweEU1MDFFNDA0LAorMHhCRURCRTY0MCwgMHhFNTAxRTQwNCwgMHhFNDA0RTY0MCwgMHhBRUUwN0YxMCwKKzB4N0YxMDRGMjYsIDB4MDAwQjRGMjYsIDB4MDAwMDAwMDksIDB4MDAxRTEwMkYsCisweDAwMUUxMDgwLCAweDAwMUUxMDkwLCAweDAwMUUxMDNGLCAweDAwMUUxMDNFLAorMHgwMDIwMzlDMiwgMHgwMDIwMzlDNCwgMHgwMDIwMzlDNiwgMHhEMjFERDExQywKKzB4NjYyMDYwMTAsIDB4Njc2QzcwMDEsIDB4MzcwMEM5MEYsIDB4RTUwMDhEMTMsCisweDY3MTA2MjEwLCAweDc3MDE2MjJDLCAweDY0MjMyMTcwLCAweEQ2MTY2MDEwLAorMHg0NDA4NDQwOCwgMHgzNDI4QzkwRiwgMHg2MjYwMjEwMCwgMHg3MjAxRDUxMywKKzB4NDQwODI2MjAsIDB4MDAwQjM1NEMsIDB4RDEwRjYwNTMsIDB4MjU1ODY1MTAsCisweEU2MDA4RDEzLCAweEQ2MERENDBCLCAweDY1NUM2NTQwLCAweDQ3MDg2NzUzLAorMHgzNzU4NDcwOCwgMHg0NzA4NjU0MCwgMHgyNDUwNzUwMSwgMHgzNjdDNjA0MCwKKzB4MjQwMEM5MEYsIDB4NzJGRjYyMTAsIDB4MDAwQjIxMjAsIDB4MDAwMDYwNjMsCisweDAwMjAzOTBELCAweDAwMjAzOTBDLCAweDAwMjAzOTBFLCAweDAwMjAzNTM0LAorMHg3RkZDNEYyMiwgMHhFNjgwRDE5RiwgMHg2NjZDNjIxMiwgMHhEMjlFMkYyMiwKKzB4NjdGMzY1NjMsIDB4NDIwQjc1NDIsIDB4N0YwNEU0MDQsIDB4MDAwQjRGMjYsCisweEU2ODAwMDA5LCAweEQyOTg2NjZDLCAweEU3MDA2NTYzLCAweDQyMkI3NTQwLAorMHhFNjgwNjQ3MywgMHhEMjk0NjY2QywgMHhFNzAwNjU2MywgMHg0MjJCNzU0MywKKzB4MkY4NjY0NzMsIDB4MkZBNjJGOTYsIDB4MkZDNjJGQjYsIDB4MkZFNjJGRDYsCisweDdGQ0M0RjIyLCAweERDOEVEMjhELCAweDcyMDExRjIxLCAweERCOEQxRjIyLAorMHhEMThFREU4RCwgMHg2NjEyNTIxMSwgMHg4QjAxMzYyMCwgMHgwMDA5QTBFNSwKKzB4QzkwMzYwNjEsIDB4OEIwMTg4MDEsIDB4MDAwOUEwREYsIDB4RDI4OEQ0ODcsCisweEVEODQ0MjBCLCAweDJGMDI1NTAzLCAweDMwRDA4NDVDLCAweEEwQjg4OTAxLAorMHhEMTg0MDAwOSwgMHg2MjZDNjYxMCwgMHg4ODAxNjAyMywgMHhEMTgyOEI2OCwKKzB4NjIxMDFGQzMsIDB4ODk1QjIyMjgsIDB4RTAwM0Q0ODAsIDB4NDAxODY3NDIsCisweDY4NDIxNzcyLCAweEQ1N0VFOTAwLCAweDgxODE2REIzLCAweDdEMDQyMTkwLAorMHg2N0QyNkFCMiwgMHg2NEUyNjg1MiwgMHgxRjQ5MUY1NywgMHg3NDA0NjRFMywKKzB4MUZBNDY1NDIsIDB4NjU0MzFGNUEsIDB4NjI1Mjc1RjgsIDB4MUY3NjFGRDUsCisweDZENTMxRjJCLCAweERBNzRENzczLCAweDdEOTREMjc0LCAweDY4RDIxRjg4LAorMHg2QUEyNjk3MiwgMHhEMTcyNjAyMiwgMHgyMjAyQ0IyMCwgMHhFMTQwMUYxQywKKzB4NzYwMUU2MDAsIDB4MzIxMzYyNkQsIDB4NTZGNDhCRkIsIDB4NTJGNjUxRjUsCisweDIxMjIyQjYyLCAweDUyRjg1MUY3LCAweDIxMjI1NkY5LCAweDJFNjI1MUZBLAorMHg1MUZCMjQxMiwgMHgyRDgyMjUxMiwgMHhEOTY2Mjc5MiwgMHgyOUEyREQ1RiwKKzB4NkFEMkQ5NjUsIDB4RDk2NDY4OTIsIDB4NjhEMjFBODQsIDB4NjA4MURBNjMsCisweDI4MDFDQjAxLCAweEQ4NjI2NkQyLCAweDJBNjIyOTYyLCAweEVEMDE1QUZDLAorMHgyQUQyNDgwQiwgMHgyQUQyNEQxOCwgMHg2MkQyREQ1RSwgMHgyRDIyNzIwMSwKKzB4RDE1MDU2RjMsIDB4RTIwMjYwNjIsIDB4MjYwMkNCMDEsIDB4MjEyMEEwM0QsCisweDhCM0EyMjI4LCAweEU0MDFERDU4LCAweDIxNDBFNjAwLCAweEUwMUMyRDYyLAorMHhDODAxMDA1QywgMHhENDU1OEIwQSwgMHhFNjAwRDc1NSwgMHhFRDdEMjQ3MiwKKzB4NjI2Qzc2MDEsIDB4OEJGQjMyRDMsIDB4MjREMkRENTIsIDB4RTJGRTY4QzIsCisweDJDODIyODI5LCAweDA5NUNFMDFFLCAweEUwMUY1REYxLCAweDBBNUMyRDkwLAorMHg3NTEwNTFGMiwgMHhFRDA2MjFBMCwgMHhENzRCRTYwMCwgMHg4NDU2RDQ0QiwKKzB4MjcwMDc2MDEsIDB4Njk2QzY4NTQsIDB4MjQ4MDM5RDMsIDB4OEZGNjc0MDEsCisweERBNDc3NzAxLCAweDJBMTBFMTk0LCAweEUyMDA3QTAxLCAweDdBMEYyQTIwLAorMHhEMTMwRTgwNSwgMHg2NjEwMkE4MCwgMHg2MDIzNjI2QywgMHg4OTA4ODgwMSwKKzB4RDI0MEQ0MkEsIDB4NDIwQjY1RjIsIDB4RDEzMUVEMDEsIDB4QUYzMDREMTgsCisweDY1RjIyMUQyLCAweDg1NTNENDNDLCAweDYyMEQ2NjQyLCAweDg5MDczMjYyLAorMHhEMTNCRDQzQSwgMHgwMDA5NDEwQiwgMHhFNjAxRDczQSwgMHgyNzYyQUYxQSwKKzB4RDEzNEQ0MUUsIDB4NDEwQjY1RjIsIDB4RDEyNUVEMDEsIDB4RDYzN0Q0MzYsCisweDQ2MEI0RDE4LCAweEFGMEQyMUQyLCAweDdGMzQwMDA5LCAweDZFRjY0RjI2LAorMHg2Q0Y2NkRGNiwgMHg2QUY2NkJGNiwgMHgwMDBCNjlGNiwgMHg0RjIyNjhGNiwKKzB4ODU0NjdGRjQsIDB4MkYwMUU2ODEsIDB4NjY2Qzg1NDcsIDB4ODU0ODgxRjEsCisweDgxRjJEMjA5LCAweDY3RjM4NTQyLCAweDg1NDM4MUYzLCAweDgxRjRFNDBDLAorMHg2NTYzNjA1MywgMHg0MjBCODFGNSwgMHg3RjBDNzU0MCwgMHgwMDBCNEYyNiwKKzB4MDAwMDAwMDksIDB4MDAxQzNEOUMsIDB4MDAyMDI0NUMsIDB4MDAxMTc3OUEsCisweDAwMUMzNkY4LCAweDAwMUMzQjlDLCAweDAwMUMzNzA0LCAweDAwMjAzNTJDLAorMHgwMDIwMTRBMCwgMHgwMDIwMzkxRCwgMHgwMDIwMzkxQywgMHgwMDIwMzkxOCwKKzB4MDAxQzNEOTgsIDB4MDAxQzNCQjQsIDB4MDAxQzU5NjAsIDB4MDAxQzM1MDAsCisweDAwMUMzRDMwLCAweDAwMUM4OTYwLCAweDAwMjAzNTA0LCAweDAwMUMzRDAwLAorMHgwMDIwMTYwQywgMHgwMDExNzczMCwgMHgwMDIwMzkyMCwgMHgwMDFDNTgyQywKKzB4MjAwMEEwMDAsIDB4MDAwMEEwMDAsIDB4MDAxMTc3OEMsIDB4MDAxMTc3OTIsCisweDAwMTE3Nzg4LCAweDAwMjAxNENDLCAweDAwMjAzOEY0LCAweDAwMjAzNEY0LAorMHgwMDIwMTUzMCwgMHgwMDFFMjEzMCwgMHgwMDIwM0Q4NCwgMHgwMDIwMThBMiwKKzB4MkY5NjJGODYsIDB4MkZCNjJGQTYsIDB4MkZENjJGQzYsIDB4NEYyMjJGRTYsCisweEQxOUI3RkVDLCAweDJGMTJFMDAwLCAweDYxMDNENDlBLCAweDFGNDI4MUYyLAorMHhERDlBREE5OSwgMHhENjlBNjgxMywgMHhFMDAxNDgwOCwgMHg0NjBCREU5OSwKKzB4MzhFQzQ4MDAsIDB4NjVBMjFGMDMsIDB4MzUyMDUyQTEsIDB4QTIzRThCMDEsCisweDYwNTEwMDA5LCAweDg4MDFDOTAzLCAweEEyMzg4QjAxLCAweDUyNTMwMDA5LAorMHgzMkUwREU5MSwgMHhEOTkxOEIxMCwgMHg2NEEzNDkwQiwgMHg0QjBCREI5MCwKKzB4REU5MDY0MDMsIDB4RDc5MUQ2OTAsIDB4RUMwMUQ1OTEsIDB4MkUwMkUxMDAsCisweDI3MTAyNkMwLCAweDI1MDJBRkRGLCAweEM4MDE4NTUxLCAweEExNTc4QjAxLAorMHg2MjUxMDAwOSwgMHg0MjAwNjIyRCwgMHg1RTUzMzY2QSwgMHg4NUUyMjI2RCwKKzB4QzkwMzY0MkMsIDB4ODVFMzY2MDMsIDB4NjA1MzY1MEQsIDB4NDAyMTQwMjEsCisweDQ1MDBDOTNGLCAweDMyMkE2NzAzLCAweDYwNTMyNTJELCAweEM5MDFEMTdGLAorMHg2MDEwNkMwMywgMHg4ODAxRDk3RiwgMHhEQjdGOEIwNSwgMHgyMTIwRTIwMCwKKzB4Q0IwMTYwQjIsIDB4RDE3RDJCMDIsIDB4ODgwMTYwMTEsIDB4NjVBMjhCMEEsCisweDhEMDQyNDQ4LCAweDlCOUU2MjUxLCAweEEwMDMyMkI5LCAweDkxOUIyNTIxLAorMHgyNTIxMjIxQiwgMHgzN0IzRUIxMCwgMHgyNDQ4ODk1RSwgMHhENDczOEIwNywKKzB4MjIyODYyNDEsIDB4NjA2Mzg5MDMsIDB4QTA1NzgxRjgsIDB4RDU3MDY0NzMsCisweDQ2MDg0NjA4LCAweDg1RTI2MjczLCAweDQ2MDA2QjUwLCAweDM2MkM0MjAwLAorMHgyQkI4QzkxMCwgMHg4RjFGNjQ2MywgMHgyNjY4NjYwMywgMHhEMjY5ODkxMSwKKzB4MDYyRDYwNDMsIDB4NDExOTYxNkQsIDB4NkIwRTYwMTksIDB4ODFGODIwQkQsCisweDg4MDE2MEMzLCAweDY0NkM4RjJDLCAweDg4MEY2MDczLCAweEEwMjc4QjFCLAorMHhEMjYxMDAwOSwgMHgwNTJENjA0MywgMHg0MTE5NjE1RCwgMHg2NzBFNjAxOSwKKzB4NjQ1QzIwN0QsIDB4ODFGOEEwMUMsIDB4ODkwRjI2NjgsIDB4NjA0M0QyNUIsCisweDZCNUQwNTJELCAweDYwQjk0QjE5LCAweDIwMUQ2MTBFLCAweDYwQzM4MUY4LAorMHg4RjBEODgwMSwgMHg2NDczNjQ1QywgMHhFQzAwQTAwQSwgMHg2MDQzRDI1NCwKKzB4NjI1RDA1MkQsIDB4NjAyOTQyMTksIDB4MjA3RDY3MEUsIDB4ODFGODY0NUMsCisweDg4MDI4NUY4LCAweDg1RTE4OTBBLCAweDhEMDdDODIwLCAweEU2REM2MjAzLAorMHg2MDIzMjI2OSwgMHg4MUUxQTAwMiwgMHg2NDRDRTRGRiwgMHg2MjEwRDE0OSwKKzB4ODkwMTIyMjgsIDB4NjQ0Q0U0RkYsIDB4NjU0REVCRkYsIDB4MzVCMDZCQkMsCisweERCMzY4QjJCLCAweDY0QTM0QjBCLCAweDQxMEJEMTM1LCAweDU0MDM2NDAzLAorMHg4NTQ0NkUwMywgMHhDOTQ4REI0MCwgMHhEQzQwODgwOCwgMHhCRUFFOEIwMSwKKzB4NjRCM0U1MDIsIDB4NjVFMzRDMEIsIDB4REIzREVDMDEsIDB4RDEzRDJEQzIsCisweDYyMTI2MEIyLCAweDcyMDE3MDAxLCAweDIxMjI4ODA1LCAweDJCMDI4RjA4LAorMHg2NjZDRTY4MCwgMHg2NTYzRDIzOCwgMHg3NTQ5RTcwMCwgMHg2NDczNDIwQiwKKzB4QTAzMEQ0MzYsIDB4N0ZGRjAwMDksIDB4ODVFMjgwMDAsIDB4MjBCOUVCRkMsCisweDYxMDM4MUUyLCAweDk0MkE4NUUzLCAweDYyMDMyMDQ5LCAweDQ1MDg4NUY4LAorMHg4MUUyMjAxQiwgMHhDOTAxNjBDMywgMHg0MDA4NDAxOCwgMHg0MDA4NDAwOCwKKzB4NDAwMDIyNUIsIDB4NjAyMzIyMEIsIDB4ODVFNDgxRTMsIDB4NDExOEUxMDgsCisweDgxRTQyMDFCLCAweEU0MDI2MkEyLCAweDIwQjk4NTIxLCAweDY3QTI4MTIxLAorMHhDQjAxNjA3MSwgMHg4NUY4MjcwMSwgMHg4OTAzMzA0MiwgMHhFQ0U3ODVFMiwKKzB4ODFFMjIwQzksIDB4NDkwQkQ0MUUsIDB4QTAzQjAwMDksIDB4N0UwMzAwMDksCisweDAwMUMzRDMwLCAweDAwMjAzRDkwLCAweDAwMjAzNTA0LCAweDAwMUUyMTJDLAorMHgwMDIwMzNFOCwgMHgwMDFDM0QwMCwgMHgwMDExNzc4MCwgMHgwMDIwMTRBMCwKKzB4MDAyMDE2NkMsIDB4MDAxMTc3MEMsIDB4MDAyMDM5MUMsIDB4MDAyMDM5MUQsCisweDAwMjAzOTE4LCAweDAwMjAxOEEyLCAweDAwMUMzNkY4LCAweDAwMjAzOTkwLAorMHgwMDIwM0RBMCwgMHgwMDIwM0I4NCwgMHgwMDIwM0MwNCwgMHgwMDIwM0M4NCwKKzB4MDAyMDNEMDQsIDB4MDAyMDM5MDgsIDB4MDAyMDM0RkMsIDB4MDAyMDE0Q0MsCisweDAwMjAzOTk0LCAweDAwMjAzOTk4LCAweDAwMjAyNDVDLCAweDAwMjAzRDg4LAorMHgwMDIwM0Q4QywgMHg2MDIyNjJGMiwgMHg0MDA5NDAxOSwgMHhDOTBGNDAwOSwKKzB4OEIwQjg4MEEsIDB4NjBFMkRFOEMsIDB4NDAwOTQwMTksIDB4QzkwRjQwMDksCisweDhCMDM4ODA4LCAweENCMDE2MEEyLCAweDI4MDJBMDA2LCAweDY1RTJERTg3LAorMHgyRTUyNzUwMSwgMHgyODYyNjZBMiwgMHg1MkYzNjZGMiwgMHgyNjIyQUU4MywKKzB4RDI4Mzg1NTEsIDB4REU4M0M4MDIsIDB4QTA5NThCMDEsIDB4NDIwQjAwMDksCisweDRFMEI2NEEzLCAweDVFMDM2NDAzLCAweDg1RTQ2NTAzLCAweDQ5MThFOTA4LAorMHhENzdEMjA5QiwgMHhFMDRDODFFNCwgMHhEQzdDMEI3RSwgMHg3QjAxRDk3QywKKzB4NjFDMjA3QjYsIDB4NzEwMTY2OTAsIDB4OEQwNjI2NjgsIDB4RDQ3OTJDMTIsCisweDQyMEJEMjc5LCAweEEwNzBFQjAxLCAweDYyNTEyREIyLCAweDRCMThFQjBGLAorMHgyMkI5RTEwMiwgMHgzMjEwNDExOCwgMHg4NTUxOEIwRiwgMHgyMDI5RTJGQywKKzB4NjA1MTgxNTEsIDB4Q0IwMTcyRTAsIDB4ODVFMTI1MDEsIDB4MjAyOTk0QTMsCisweDg1RTQ4MUUxLCAweEEwNTIyMDQ5LCAweDY3NTE4MUU0LCAweDQ3MTk2NzdELAorMHg2NjdFNjc3OSwgMHg3NzAxMjc2RCwgMHg2OTAzNjA3QywgMHg4ODAxNDkxOCwKKzB4MjU5MThGM0UsIDB4NkIxMkQxNjEsIDB4MjFCMjdCMDEsIDB4NjYwRDg1RTMsCisweDQwMjE2MDYzLCAweEM5M0Y0MDIxLCAweDZDMDM0NjAwLCAweDI2MkQzMjJBLAorMHhDODAxNjA2MywgMHhEQjVFRDE1RCwgMHg5NjdEODkwMSwgMHhFNjAwMkM2QiwKKzB4NjY2QzY3Q0QsIDB4NDAwMDYwNjMsIDB4NjIyRDAyMUQsIDB4OEQwRTMyNzAsCisweDYwNDM2NDAzLCAweEU5RkYwMjFELCAweDhCMDEzMjkwLCAweDAxQzVBMDA3LAorMHg2MjZDNzYwMSwgMHgzMjkyRTkwNCwgMHg2NDZDOEJFQiwgMHg2MDQzNDQwMCwKKzB4RDE1MDA0QkQsIDB4MEI0NTc0MDEsIDB4NjY5RDY5MTEsIDB4ODkwNzM2NzAsCisweDYwMkQ2MjExLCAweDg5MDM4OEZGLCAweEUyMDFEQjRCLCAweDJCMjAyMUMxLAorMHhFQ0ZDODU1MSwgMHg4MTUxMjBDOSwgMHhDQjAxNjA1MSwgMHhEQzQ3MjUwMSwKKzB4NjRBMzRDMEIsIDB4NTFGMzY2RjIsIDB4ODVFRjI2MTIsIDB4NTRGMkQyNDQsCisweDY1MEQ0MjBCLCAweDAwMDlBREU3LCAweEU1MDBEQzQyLCAweDQyMEIyQzUyLAorMHg0RTBCNjRBMywgMHg1NDAzNjQwMywgMHg4NTQ0NkUwMywgMHg2NzAzRTkwOCwKKzB4NjUwMzQ5MTgsIDB4Mjc5OTg1NDEsIDB4REIzMjM3OTAsIDB4OEYwQkQ5MzIsCisweDYwMTM2MTBELCAweDhCMDdDODIwLCAweEM5NDg2MDUzLCAweDhCMDM4ODA4LAorMHhFNTAxQkQ0RCwgMHgwMDA5QTAwNSwgMHgyMTI4RDIzMywgMHhCRDQ2ODkwMSwKKzB4NjRCM0U1MDAsIDB4NDkwQjY1RTMsIDB4QURCQ0VDMDEsIDB4ODVGMjJEQzIsCisweDcwMDFFRTA0LCAweDMxRTc2MTBELCAweDhEMDI4MUYyLCAweEFEQTk3QTA4LAorMHg3RjE0MDAwOSwgMHg2RUY2NEYyNiwgMHg2Q0Y2NkRGNiwgMHg2QUY2NkJGNiwKKzB4MDAwQjY5RjYsIDB4RjdGRjY4RjYsIDB4MkZFNjgwMDAsIDB4RDIyMzRGMjIsCisweDYwRTM2RTIyLCAweDhEMDJDODQwLCAweEJCRjkyMkUyLCAweEUyNDAwMDA5LAorMHgyRTI4NDIxOCwgMHhCQzA0ODkwMSwgMHg2MEUzMDAwOSwgMHg4OTA1QzgxMCwKKzB4RDIxQ0Q0MUIsIDB4MDAwOTQyMEIsIDB4MDAwOUJDMDMsIDB4QzgwNTYwRTMsCisweEJENkQ4OTAxLCAweDYwRTMwMDA5LCAweDg5MDJDODAyLCAweEFDMDA0RjI2LAorMHg0RjI2NkVGNiwgMHg2RUY2MDAwQiwgMHgwMDFDM0QzQywgMHgwMDExNzc2MCwKKzB4MDAyMDE0QTAsIDB4MDAyMDE2NkMsIDB4MDAyMDM0OTQsIDB4MDAyMDNEQTQsCisweDAwMjAzOTA4LCAweDAwMjAzNEZDLCAweDAwMjAxNENDLCAweDAwMjAzOTc0LAorMHgwMDIwMzk3QywgMHgwMDIwMzk3MCwgMHgwMDIwMzk3MiwgMHgwMDIwMTUzMCwKKzB4MDAyMDE4RUUsIDB4MDAyMDM5OTQsIDB4MDAwMDgwMDAsIDB4MDAxQzM1MTAsCisweDAwMjAzRDk4LCAweDAwMjAxOEEyLCAweDA4MEEwQzBFLCAweDAwMDIwNDA2LAorMHgxQTFDMUUyMCwgMHgxMjE0MTYxOCwgMHgyRTMwMzIzNCwgMHgyNjI4MkEyQywKKzB4M0EzQzNFNDAsIDB4NkM2MjU2NDgsIDB4NDExMTJGMjYsIDB4RTIyMDhGMTgsCisweDg5MEIzMTIzLCAweDMyMUNEMjA0LCAweEQxMDI2MjIwLCAweDQxMkIzMTJDLAorMHgwMDA5MDAwOSwgMHgwMDIwMzQxMiwgMHgwMDIwMzNDOCwgMHgwMDBCRTAwMCwKKzB4NDAwMDYyRjYsIDB4NDAwMDQwMDAsIDB4NDAwMDQwMDAsIDB4NDAwMDQwMDAsCisweDYyRjYwMDBCLCAweDQwMDA0MDAwLCAweDQwMDA0MDAwLCAweDQwMDA0MDAwLAorMHg0MDE4NDAwMCwgMHg2MkY2MDAwQiwgMHg0MDAwNDAwMCwgMHg0MDAwNDAwMCwKKzB4NDAwMDQwMDAsIDB4NDAyODQwMDAsIDB4NjJGNjAwMEIsIDB4NDAwMDQwMDAsCisweDQwMTg0MDAwLCAweDAwMEI0MDI4LCAweEM5MEY2MkY2LCAweDQwMDU0MDA1LAorMHg0MDA1NDAwNSwgMHg2MkY2MDAwQiwgMHg0MDA1QzkwNywgMHg0MDA1NDAwNSwKKzB4NjJGNjAwMEIsIDB4NDAwNUM5MDMsIDB4MDAwQjQwMDUsIDB4QzkwMTYyRjYsCisweDAwMEI0MDA1LCAweDAwMDA2MkY2LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDU0NEYwRDBBLCAweDQ2MjA1MzU1LCAweDAwMDAzQTU3LAorMHgyMDZDNzU0QSwgMHgzMjIwMzEyMCwgMHgyMDM4MzAzMCwgMHgzMjNBMzEzMiwKKzB4MzQzMzNBMzgsIDB4MDAwMDAwMDAsIDB4MDAwMDBEMEEsIDB4MDAwMDAwNDMsCisweDQyNzA3MzcyLCAweDNEMjA2Njc1LCAweDU1NEUyMDNELCAweDIwMkM0QzRDLAorMHg2RTQ5Njc3QSwgMHg0RTQ5NzI3NCwgMHg2RDc1NEU1MSwgMHgwMDAwMDAzRCwKKzB4NjE3NjZFNDksIDB4MjA2NDY5NkMsIDB4NzI2NTczNzUsIDB4MjA3MjZGMjAsCisweDIwNzk2NTZCLCAweDAwMjE0NDQ5LCAweDUyNTA0NTQ1LCAweDU3MjA0RDRGLAorMHg2NTc0Njk3MiwgMHg2NDYxMjAyQywgMHgwMDNENzI2NCwgMHg2QzYxNzYyMCwKKzB4MDAwMDAwM0QsIDB4MDAwMDBBMEQsIDB4NDM1RjRENUEsIDB4NDY1RjQ0NEQsCisweDRDNDQ1RjU3LCAweDQ5NEU0OTVGLCAweDAwMDAwMDU0LCAweDZFNkI2RTU1LAorMHgyMDZFNzc2RiwgMHg2RDZENkY2MywgMHgzRDY0NkU2MSwgMHgwMDAwMDAwMCwKKzB4MjAzQTMwNTEsIDB4MDAwMDAwMjAsIDB4MjAzQTMxNTEsIDB4MDAwMDAwMjAsCisweDIwM0EzMjUxLCAweDAwMDAwMDIwLCAweDIwM0EzMzUxLCAweDAwMDAwMDIwLAorMHgyMDNBMzQ1MSwgMHgwMDAwMDAyMCwgMHgyQjQzNDc0MSwgMHg3MzY5NkY0RSwKKzB4NjE0MzIwNjUsIDB4NzI2MjY5NkMsIDB4NkY2OTc0NjEsIDB4NjE2NjIwNkUsCisweDZGMjA2QzY5LCAweDY5NzQyMDZFLCAweDBEMEE2NTZELCAweDAwMDAwMDAwLAorMHgwMDAwMDA3MiwgMHgwMDIwNTIyMCwgMHgwMDAwMEQwQSwgMHg2MjczNTU3NiwKKzB4NzQ3MzcyNUYsIDB4MDAwMDBBMEQsIDB4NjI3MzU1NzYsIDB4NzM3NTczNUYsCisweDY0NkU2NTcwLCAweDAwMDAwQTBELCAweDYyNzM1NTc2LCAweDczNjU3MjVGLAorMHgwMDBBMEQ2RCwgMHgwMDAwMDA0NCwgMHg0NDM4NzU3MCwgMHg3MjYzNzM2NSwKKzB4NkY3NDcwNjksIDB4M0Q1ODQ1NzIsIDB4MDAwMDAwMDAsIDB4MDAwMDAwNDcsCisweDAwMDAwMDQyLCAweDcyNzQ2RTQ5LCAweDZENjUyMDUxLCAweDJDNzk3NDcwLAorMHg0OTY3N0EyMCwgMHg0OTcyNzQ2RSwgMHg3NTRFNTE0RSwgMHgwMDAwM0Q2RCwKKzB4NjU0QzcyNDUsIDB4MDAwMDAwNkUsIDB4MDAwMDAwNDksIDB4MjA3NDZGNEUsCisweDc1NkY2RTY1LCAweDQ5MjA2ODY3LCAweDQyMjA1MTRFLCAweDBBMEQ2Njc1LAorMHgwMDAwMDAwMCwgMHgwMDAwMDBGRiwgMHgwMDAyMDAwMSwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMTBFMDEwRCwgMHgwMDAyMDAwMywgMHgwMTA5MDEwOCwKKzB4MDAwMjAxMEEsIDB4MDIwMDAwMDMsIDB4MDIwMjAyMDEsIDB4MDIwNDAyMDMsCisweDAyMDYwMjA1LCAweDAyMDIwMjAwLCAweDAyMDQwMjAzLCAweDAyMEMwMjBCLAorMHgwMjBFMDIwRCwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwMDAwMEZGLCAweDAwMDIwMDAxLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAxMEUwMTBELCAweDAwMDIwMDAzLCAweDAxMDkwMTA4LAorMHgwMDAyMDEwQSwgMHgwMDAzMDAwMywgMHgwMjAyMDIwMSwgMHgwMjA0MDIwMywKKzB4MDIwNjAyMDUsIDB4MDIwMjAyMDAsIDB4MDIwNDAyMDMsIDB4MDIwQzAyMEIsCisweDAyMEUwMjBELCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDEwRTAxMEQsIDB4MDBGRjAxMEYsIDB4MDEwOTAxMDgsCisweDAxMEIwMTBBLCAweDAyMDAwMTBGLCAweDAyMDIwMjAxLCAweDAyMDQwMjAzLAorMHgwMjA2MDIwNSwgMHgwMjAyMDIwMCwgMHgwMjA0MDIwMywgMHgwMjBDMDIwQiwKKzB4MDIwRTAyMEQsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMTBFMDEwRCwgMHgwMEZGMDEwRiwgMHgwMTA5MDEwOCwKKzB4MDEwQjAxMEEsIDB4MDEwRjAxMEYsIDB4MDIwMjAyMDEsIDB4MDIwNDAyMDMsCisweDAyMDYwMjA1LCAweDAyMDIwMjAwLCAweDAyMDQwMjAzLCAweDAyMEMwMjBCLAorMHgwMjBFMDIwRCwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwMjA1MjIwLCAweDAwMDAwMDQ2LCAweDAwMDAwMDU5LAorMHg3MzIwNDE0MiwgMHgwMDNENzE2NSwgMHg0OTU0NDEyMCwgMHgwMDAwMjA0RCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAyRTAyMDksIDB4ODAwMDAxMDEsCisweDAwMDQwOUZBLCAweDAwRkYwNDAwLCAweDA1MDcwMDAwLCAweDAyMDAwMjAxLAorMHg4MjA1MDcwMCwgMHgwMDAyMDAwMiwgMHgwMzgzMDUwNywgMHgwNzAxMDA0MCwKKzB4NDAwMzA0MDUsIDB4MDIwOTAxMDAsIDB4MDEwMTAwMkUsIDB4MDlGQTgwMDAsCisweDA0MDAwMDA0LCAweDAwMDAwMEZGLCAweDAyMDEwNTA3LCAweDA3MDAwMDQwLAorMHg0MDAyODIwNSwgMHgwNTA3MDAwMCwgMHgwMDQwMDM4MywgMHgwNDA1MDcwMSwKKzB4MDAwMDQwMDIsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDcwOTAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCit9OworCitjb25zdCB1MzJfdCB6Y0Z3SW1hZ2VTaXplPTE1OTM2OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvaGFsL2hwZnd1LmMuZHJ2X2JhX3Jlc2VuZCBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL2hhbC9ocGZ3dS5jLmRydl9iYV9yZXNlbmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Y1YmNmZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL2hhbC9ocGZ3dS5jLmRydl9iYV9yZXNlbmQKQEAgLTAsMCArMSw3NDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBBdGhlcm9zIENvbW11bmljYXRpb25zIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworI2luY2x1ZGUgImNwcmVjb21wLmgiCisKK2NvbnN0IHUzMl90IHpjRndJbWFnZVtdID0geworMHgwMDA5MDAwQiwgMHg0RjIyMkZFNiwgMHhERTI5N0ZGQywgMHhFMTE0RDcyOSwKKzB4MUUxM0Q0MjksIDB4MUU0QzQ3MEIsIDB4MDAwOUIwMTgsIDB4QTAwMzk1NDUsCisweDM2NTJFNjAwLCAweDc2MDE4RDA0LCAweEM4NDA2MEUyLCAweDJGMDI4REY5LAorMHhERTIzRDQyMiwgMHgwMDA5NEUwQiwgMHg0RTBCRDQyMiwgMHhENDIyMDAwOSwKKzB4MDAwOTRFMEIsIDB4NEYyNjdGMDQsIDB4NkVGNkEwMjQsIDB4RDExRjRGMjIsCisweDAwMDk0MTBCLCAweDQ0MEJENDFFLCAweEQ1MUUwMDA5LCAweDAwMDk0NTBCLAorMHhFMUZGRDcxRCwgMHhEMjFENjExRCwgMHg1MDI5MjcxMiwgMHhDQjAxRDQxQywKKzB4RTUwMUUxRkYsIDB4MjIxMjEyMDksIDB4MjQ1MjEyMTEsIDB4RDYxQUQ1MTksCisweEUyMDA5NzE0LCAweEQ0MTkyNTcyLCAweEQ2MTkyNjIwLCAweDRGMjYyNDIyLAorMHgyNjIyMDAwQiwgMHhERDE4REMxNywgMHg0QzBCREUxOCwgMHg0RDBCMDAwOSwKKzB4NEUwQjAwMDksIDB4QUZGODAwMDksIDB4MjcxMDAwMDksIDB4MDAwMDA2NDAsCisweDAwMUMwMDFDLCAweDAwMjAwQkM0LCAweDAwMDBCMzhFLCAweDAwMjAyOUY4LAorMHgwMDIwMEY3MiwgMHgwMDIwMkEwNCwgMHgwMDIwMkExQywgMHgwMDIwMEYyMCwKKzB4MDAyMDEwNTYsIDB4MDAyMDBDMUMsIDB4MDAxQzM1MTAsIDB4MDAxQzM2MjQsCisweDAwMUUyMTJDLCAweDAwMjAyOTk0LCAweDAwMjAyNTMwLCAweDAwMjAyOTlDLAorMHgwMDIwMjlBOCwgMHgwMDIwMEU1MCwgMHgwMDIwMjNFNiwgMHgwMDIwMTkyMCwKKzB4MkZDNjJGOTYsIDB4MkZFNjJGRDYsIDB4N0Y5MDRGMjIsIDB4RTAyMERFOEQsCisweEQ0OEQ2MUUwLCAweDYxRTMwRjE0LCAweDYyMTA3MTAxLCAweEUwMjRENzhCLAorMHgwRjI0NDcwQiwgMHg0NTBCRDU4QSwgMHgyMDA4MDAwOSwgMHg4RjExNkQwMywKKzB4REQ4ODFGMEEsIDB4NjdEMEQ0ODgsIDB4NDEwQkQxODgsIDB4RDI4ODY1N0MsCisweDY5MjBERDg4LCAweDY2QzM2QzlDLCAweDQ2MDg0NjA4LCAweDQ2MDgzNkM4LAorMHgxRkRBM0Q2QywgMHgwNEZDRTAyNCwgMHg2NkUyRTU4MCwgMHg2NTVDNjA0QywKKzB4OEYxNjMwNTAsIDB4RTAyMDJENjIsIDB4RTUwMDAxRkMsIDB4REU3RTY0MUMsCisweDMyNDM2MjVELCAweEEzMkM4QjAxLCAweDY1NUQwMDA5LCAweDM2RUM2NjUzLAorMHhFMDJDNjc2MCwgMHg2OTUzMEY3NCwgMHgzOURDNjA3RSwgMHhBRkVGODA5NCwKKzB4MjAwODc1MDEsIDB4RTAyMDhCMTQsIDB4RTUwMDAxRkMsIDB4QTAwQURFNzIsCisweDY1NUQ2NDFDLCAweDM5RUM2OTUzLCAweDY3NTM2QzkyLCAweDM3REM2MkMyLAorMHg3NTA0MTcyMSwgMHg2MjVEMUYyQywgMHg4QkYyMzI0MywgMHgyRDEwQTMwOSwKKzB4OEIxNzg4MDEsIDB4MDFGQ0UwMjAsIDB4MkQ3MEU3MDAsIDB4MUZENzZEMUMsCisweDYyN0RERTY1LCAweDhCMDEzMkQzLCAweDAwMDlBMkZCLCAweDY1RTM2NzdELAorMHg3NTA0NjY3MywgMHgzNkVDNkM3MywgMHg2NDYyM0M1QywgMHg3NzA4NjlDMiwKKzB4MjQ5MkFGRUYsIDB4OEIxODg4MDQsIDB4MDFGQ0UwMjAsIDB4MkQ0MEU0MDAsCisweERFNTk2NzFDLCAweDMyNzM2MjRELCAweEEyRTI4QjAxLCAweDY0NEQwMDA5LAorMHg2Q0UzNkQ0MywgMHg2NUQyM0RFQywgMHg2MTQzN0MwNCwgMHg2MjEyMzFDQywKKzB4NzQwODY5NTIsIDB4QUZFRDI5MjksIDB4ODgwNTI1OTIsIDB4RTAyMDhCMTgsCisweEU0MDAwMUZDLCAweDY3MUMyRDQwLCAweDYyNERERTRCLCAweDhCMDEzMjczLAorMHgwMDA5QTJDNywgMHg2OTQzNjQ0RCwgMHgzOUVDNjFFMywgMHg3MTA0NjU5MiwKKzB4M0MxQzZDNDMsIDB4NkQ1MjYyQzIsIDB4MkQyQjc0MDgsIDB4MjVEMkFGRUQsCisweDhCMUI4ODMxLCAweEQ5NDJEMjQxLCAweDcyMDQ2NDIyLCAweDcyMDQ2NjIyLAorMHg3MjA0NjcyMiwgMHg3MkU4NkMyMiwgMHgxRjJFMUY0RCwgMHg3MjA0NjQyMiwKKzB4NzIwNDZFMjIsIDB4NjUyMjI5RTAsIDB4Mjk1MEQ5M0EsIDB4REUzQTJGQzYsCisweDU1RkU0RTBCLCAweEUyMDA3RjA0LCAweDJEMjBBMjlCLCAweDhCMUQ4ODMwLAorMHhERTMzRDIzMiwgMHg3MjA0NjUyMiwgMHg3MjA0NjEyMiwgMHg3MjA0NjcyMiwKKzB4NzJFODY5MjIsIDB4NzIwNDY0MjIsIDB4NzIwNDZDMjIsIDB4NkUyMjJFQzAsCisweDFGOUZENjJDLCAweDdGRkMyNkUwLCAweDA5RkVFMDQwLCAweDJGOTJEQzJCLAorMHg2NjEzNEMwQiwgMHhFMjAwN0YwNCwgMHgyRDIwQTI3QiwgMHg4OTAxODgyOCwKKzB4MDAwOUExMDksIDB4RTE0M0RFMjAsIDB4RTA0MDYyRTEsIDB4MzYxNzY2MkQsCisweDBGRTY4RjAzLCAweDY2MDMwMkZFLCAweDM2MTcyMjAxLCAweEEwRjM4QjAxLAorMHhFMDQwMDAwOSwgMHhFNTAxMDRGRSwgMHgzMDU2ODU0MSwgMHhBMEVCOEIwMSwKKzB4RTA0MDAwMDksIDB4MDlGRUU3MDEsIDB4QjI2MTJENzAsIDB4RTA0MDY0OTEsCisweEUxNDMwQ0ZFLCAweEUwNjg2MkMxLCAweDM1MTc2NTJELCAweDBGNTY4RDY4LAorMHgzNTYzRTY0MCwgMHhFNjAwOEIyNCwgMHgwRjY1RTA0OCwgMHhBMDJFRTExQSwKKzB4MDAwMDcyQzAsIDB4MDAxMTc4MDAsIDB4MDAyMDJBMjAsIDB4MDAyMDBGNzIsCisweDAwMjAxRkRDLCAweDAwMjAyOUIwLCAweDAwMjAyQTI0LCAweDAwMjAwRkJDLAorMHgwMDIwMjlBRiwgMHgwMDIwMjVENCwgMHgwMDExNzgwNCwgMHgwMDExNzgxMCwKKzB4MDAyMDI5QUMsIDB4MDAyMDI5QUQsIDB4MDAyMDA5NDgsIDB4MDAyMDA5OTQsCisweDQxMjE2MTUzLCAweDQxMjE0MTIxLCAweDQxMjE0MTIxLCAweDQ1MjE0NTIxLAorMHg2MDUzNDUyMSwgMHg2NjAzQzkwMywgMHgwRjY1RTA0OCwgMHhFMDA3NzExOCwKKzB4RTA0NDIyMDksIDB4NjQxRDBGMjUsIDB4NjVGM0UwNEMsIDB4MEY0NkIyOTEsCisweDBFRkRFMDQ4LCAweDBERkRFMDQ0LCAweDYxREQ2N0VELCAweDQxMDg0NzA4LAorMHgwRjE2RTA1MCwgMHhERDk0NjA3MywgMHg0RDBCMDZGRSwgMHg2RTA3RTAwRiwKKzB4NjA3MzI2RTksIDB4RTA0MDBGNjYsIDB4NjVGMzBDRkUsIDB4NjkwRDg1QzIsCisweDAxRkVFMDUwLCAweDYwOTM0RDBCLCAweDYwNzMyNjBCLCAweEUwNEMwRjY2LAorMHgwNEZFQjI1NiwgMHgwN0ZFRTA0MCwgMHg2MjcxRTA2OCwgMHgwRjU2NjUyRCwKKzB4MzU2M0U2NDAsIDB4RUQwMDg5NTQsIDB4MEZENUUwNjQsIDB4QzkwMzYwMjMsCisweDQwMDA0MDA4LCAweDYxMDM2OTAzLCAweDBGOTZFMDU0LCAweERFN0VFMDU4LAorMHgwRkY2RUNGRiwgMHhFMDZDNkNDQywgMHg2MEMzMEZFNiwgMHg2MjUzNEUwQiwKKzB4NDIyMTQyMjEsIDB4NDIyMTQyMjEsIDB4NDIwMDY3MjMsIDB4NjEwNzMyN0MsCisweDQyMDBFMDVDLCAweDBGMTY0NTIxLCAweDQ1MjFFMDQwLCAweDYwNTMwQ0ZFLAorMHg0MDA4QzkwMywgMHg3QzA2MzBGQywgMHg2RTAzMUZDNiwgMHgxRkQ1NkQyRCwKKzB4MUYwNEEwMUUsIDB4MEZENkUwNjAsIDB4MDVGRUUwNTgsIDB4NjREM0IyMzEsCisweDYyRTJFMDVDLCAweEUwNTQwOUZFLCAweDJFMjIyMjk5LCAweDY0RDM2MUM0LAorMHgwMUZFNjYxQywgMHgwN0ZFRTA2QywgMHg2MDYzNDcwQiwgMHhFMDU4MjIwQiwKKzB4QjIwNTA1RkUsIDB4RTA2NDJFMjIsIDB4N0QwMTAyRkQsIDB4MEYyNTcyMDEsCisweDAyRkRFMDY0LCAweDMyNjJFNjA2LCAweEUwNDA4QkRDLCAweDYyNjEwNkZFLAorMHgwNUZFRTA0MCwgMHg4NTUxNDIwMCwgMHgzMDJDNzUwQywgMHg2MTAzNzAxQiwKKzB4NjRGM0U2MDAsIDB4RTcwNEEwMDQsIDB4NzYwMTYyNTYsIDB4NzQwNDI0MjIsCisweDMyNzM2MjZELCAweDY1RjM4QkY4LCAweDY0MURCMUUyLCAweDA2RkVFMDQwLAorMHg2NDYxQjE5RSwgMHgwMDA5QTE3NSwgMHhENzRERDQ0QywgMHg0NzBCRTIwMSwKKzB4QTE2RTJEMjAsIDB4ODgyOTAwMDksIDB4REU0QThCMDcsIDB4MkQyMEUyMDAsCisweEIxNkQ2NkUyLCAweEExNjQ2NDZELCAweEUyODEwMDA5LCAweDMwMjA2MjJDLAorMHhBMEE3OEIwMSwgMHhFMDI0MDAwOSwgMHg2MjZDMDZGQywgMHg2NjZDRTY4MiwKKzB4OEIyMTMyNjAsIDB4RTQyNDUyRkEsIDB4RDQzRjIyNDAsIDB4MTI2MTU2NDcsCisweDEyNjI1NjQ4LCAweDEyNjM1NjQ5LCAweDEyNjQ1NjRBLCAweDEyNjU1NjRCLAorMHgxMjY2NTY0QywgMHgxMjY3NTY0RCwgMHgxMjY4NTY0RSwgMHgxMjY5NTY0RiwKKzB4MTQyN0UyMDAsIDB4MTQyOTE0MjgsIDB4MTQyQjE0MkEsIDB4MTQyRDE0MkMsCisweDE0MkYxNDJFLCAweDFGNkNBMTM1LCAweDY2NkNFNjgzLCAweDhCMDczMjYwLAorMHhFNjAwNTJGQSwgMHhEMjJCMjI2MCwgMHg2MjIyRDYyQywgMHgyNjIyQTEyOSwKKzB4NjY2Q0U2OTAsIDB4OEIxODMyNjAsIDB4RTYwMDUyRkEsIDB4RDIyODIyNjAsCisweDYwMjJFNjA1LCAweDIyMDJDQjIwLCAweDIyNjJEMjI2LCAweDIyNjJFNjAwLAorMHg0NjBCRDYyNSwgMHhEMjI1MDAwOSwgMHgwMDA5NDIwQiwgMHhFNjAxRDIyNCwKKzB4RDIyNDIyNjIsIDB4QTEwQzQ2MTgsIDB4RTZCMDIyNjIsIDB4MzI2MDY2NkMsCisweEQ1MTg4QjIyLCAweEQyMTZENDIwLCAweDc1MDQ2RDUyLCAweDZFNTI0MjBCLAorMHg0MjBCRDIxRSwgMHhENDFFNjREMywgMHg0NTBCRDUxMSwgMHhEMjFCMDAwOSwKKzB4NjRFMzQyMEIsIDB4RDYwRUQ0MUIsIDB4MDAwOTQ2MEIsIDB4RTYwMEU1MDQsCisweDMyNTM2MjZELCAweEEwRUM4QjAxLCAweDY2NkQwMDA5LCAweDMyNkM2MkQzLAorMHgyMkUwNzYwMSwgMHg0RTE5QUZGNCwgMHhEMjE0RDQxMywgMHhENDE0NjU0MiwKKzB4MDAwOTQyMEIsIDB4MDAwOUEwREQsIDB4MDAyMDI0OEMsIDB4MDAyMDJBNDQsCisweDAwMjAwRjcyLCAweDAwMTE3ODA0LCAweDAwMjAyNTM4LCAweDAwMjAyOTk0LAorMHgwMDFDMzUwMCwgMHgwMDFENDAwNCwgMHgwMDIwMTA1NiwgMHgwMDIwMEMxQywKKzB4MDAxRTIxMkMsIDB4MDAxQzNEMzAsIDB4MDAyMDJBNUMsIDB4MDAyMDBGQjQsCisweDAwMjAyQTcwLCAweDAwMjAyQTc4LCAweDAwMTE3ODAwLCAweDAwMjAwRkJDLAorMHgwMDIwMkE3QywgMHhENkFFRDRBRCwgMHg2MjYyRTA0MCwgMHg3NjA0NjU0MiwKKzB4MjQ1MjM1MkMsIDB4NjI2MjY1NjMsIDB4NzUwNDU2NDEsIDB4MTQ2MTM2MkMsCisweDYyNTI2NjUzLCAweDc2MDg1NTQyLCAweDE0NTIzNTJDLCAweDU1NDM2MjYyLAorMHgzNTJDNzZFQywgMHg2NTYzMTQ1MywgMHg1NjQ0NjI2MiwgMHgzNjJDNzUxMCwKKzB4NjY1MzE0NjQsIDB4NTU0NTYyNTIsIDB4MzUyQzc2MTAsIDB4NjU2MjE0NTUsCisweEQ2OUM1MjQ2LCAweDE0MjYzMjVDLCAweDU1NDc2MjYyLCAweDM1MkM3NjA0LAorMHg2MjYyMTQ1NywgMHg3NjA0NTU0OCwgMHgxNDU4MzUyQywgMHg2MjYyNjU2MywKKzB4NzUwNDU2NDksIDB4MTQ2OTM2MkMsIDB4NTY0QTYyNTIsIDB4MzYyQzc1MDQsCisweDY2NTMxNDZBLCAweDU1NEI2MjUyLCAweDM1MkM3NjA0LCAweDYyNjIxNDVCLAorMHg3NjA0NTU0QywgMHgxNDVDMzUyQywgMHg2MjYyNjU2MywgMHg3NTA0NTY0RCwKKzB4MTQ2RDM2MkMsIDB4NjI1MjY2NTMsIDB4NzYwNDU1NEUsIDB4MTQ1RTM1MkMsCisweDUyNEY2NTYyLCAweDMyNUNENjg0LCAweDYyNjIxNDJGLCAweDc2OTQwNTRFLAorMHgwNDU2MzUyQywgMHg2MjYzRTA0NCwgMHgwNTRFNjY2MiwgMHgzNTZDNzI0NCwKKzB4RTA0ODA0NTYsIDB4MDU0RTY2MjIsIDB4RDY3QzM1NkMsIDB4NjI2MjA0NTYsCisweDA1NEVFMDU0LCAweDM1MkM0MjI5LCAweDc2MDQwNDU2LCAweEUwNTg2MjYyLAorMHg0MjI5MDY0RSwgMHg1MkZBMzYyQywgMHhFNjM4MDQ2NiwgMHhFMDQ0MjI2MCwKKzB4RTA0ODA2NEUsIDB4NjY0MjEyNjEsIDB4NTY0MTEyNjIsIDB4NTY0MjEyNjMsCisweDU2NDUxMjY0LCAweDU2NDMxMjY1LCAweDU2NDYxMjY2LCAweDA2NEUxMjY3LAorMHgxMjY4RTA0MCwgMHhFMDUwMDY0RSwgMHg1NjQ0MTI2OSwgMHgwNjRFMTI2QSwKKzB4MTI2QkUwNEMsIDB4RTA1NDA2NEUsIDB4MDY0RTEyNkMsIDB4MTI2REUwNTgsCisweEUwNDQwNjRFLCAweEUyMDAxMjZFLCAweEUwNDgwNDI2LCAweDE0MjEyNDIyLAorMHgxNDI1MTQyMiwgMHgxNDI2MTQyMywgMHhFMDQwMDQyNiwgMHhFMDUwMDQyNiwKKzB4MDQyNjE0MjQsIDB4MDQyNkUwNEMsIDB4MDQyNkUwNTQsIDB4MDQyNkUwNTgsCisweDdGNzAxRjZDLCAweDZFRjY0RjI2LCAweDZDRjY2REY2LCAweDY5RjYwMDBCLAorMHg2MTRENEYyMiwgMHgzMTIzRTI0MCwgMHhFMjFGODkxNywgMHg4OTA4MzEyNywKKzB4RDU1MEQ0NEYsIDB4NDUwQkUwMDEsIDB4NjcwNzY2NDIsIDB4QTAwQzI2NzksCisweEUyM0YyNDYyLCAweDg5MDgzMTI3LCAweEQ2NEFENzQ5LCAweEUwMDE3MUUwLAorMHg1NTcxNDYwQiwgMHgyNTI5NjIwNywgMHg0RjI2MTc1MSwgMHgwMDA5MDAwQiwKKzB4NjE0RDRGMjIsIDB4MzEyM0UyNDAsIDB4RTIxRjg5MTUsIDB4ODkwNzMxMjcsCisweEQyNDBENDNGLCAweDQyMEI2NjQyLCAweDI2MEJFMDAxLCAweDI0NjJBMDBCLAorMHgzMTI3RTIzRiwgMHhENzNBODkwNywgMHg1NTcxRDYzQSwgMHg0NjBCNzFFMCwKKzB4MjUwQkUwMDEsIDB4NEYyNjE3NTEsIDB4MDAwOTAwMEIsIDB4NDYxOEU2NDAsCisweEQ1MzU0NjI4LCAweDIyNjg2MjUyLCAweDAwMEI4OUZDLCAweEU2ODAwMDA5LAorMHg0NjI4NDYxOCwgMHg2MjUyRDUzMCwgMHg4OUZDMjI2OCwgMHgwMDA5MDAwQiwKKzB4RTIwMEEwMDEsIDB4MzI0MjcyMDEsIDB4MDAwQjhCRkMsIDB4RTY4MDAwMDksCisweDQ2Mjg0NjE4LCAweDYyNTJENTI5LCAweDhCRkMyMjY4LCAweDAwMDkwMDBCLAorMHg0RjIyMkZFNiwgMHg2RTUzN0ZGQywgMHgyRjQyQkZGMSwgMHhENjI0NjFFMiwKKzB4MTYxNUUyODAsIDB4NDIxODU0RTEsIDB4NTVFMjE2NDYsIDB4MTY1NzQyMjgsCisweDZFRjI1N0UzLCAweDJFMkIxNjc4LCAweDdGMDQyNkUyLCAweEFGQ0U0RjI2LAorMHgyRkM2NkVGNiwgMHgyRkU2MkZENiwgMHhERDE5NEYyMiwgMHhCRkQ2NkM1MywKKzB4QkZCQjZFNDMsIDB4QkZEMjJERTIsIDB4NTFENTAwMDksIDB4NTRENjJDMTIsCisweDU1RDcxQzQxLCAweDU2RDgxQzUyLCAweDRGMjYxQzYzLCAweDZERjY2RUY2LAorMHg2Q0Y2MDAwQiwgMHhFNjAwNjE2MywgMHg0MTA5QTAwNCwgMHg3NjAxNjI1NiwKKzB4NzQwNDI0MjIsIDB4OEJGOTM2MTIsIDB4MDAwOTAwMEIsIDB4MDAyMDI1MzgsCisweDAwMUMzNkEwLCAweDAwMUMzQ0EwLCAweDAwMUMzNkY0LCAweDAwMUMzQjg4LAorMHgwMDFDMzcwNCwgMHgwMDIwMjQ4QywgMHgwMDFDMzczQywgMHgwMDFDMzcwMCwKKzB4MDAxQzM3MEMsIDB4MDAwOUExMDksIDB4MkZENjJGQzYsIDB4NEYyMjJGRTYsCisweDZFNjM2RDczLCAweDZDNTNCMDE2LCAweDY0QzM1N0Y0LCAweEIwMjk2NUUzLAorMHhCMDNENjZEMywgMHhCMDZEMDAwOSwgMHhCMDcxMDAwOSwgMHhCMDc1MDAwOSwKKzB4QjA4QTAwMDksIDB4QjA4RDAwMDksIDB4NEYyNjAwMDksIDB4NkRGNjZFRjYsCisweDZDRjZBMEI0LCAweDM0MTJEMTkwLCAweEQ2OTAwNTI5LCAweDI2NTBENzkwLAorMHgyNzQyMDAwQiwgMHgyRkQ2MkZDNiwgMHg0RjIyMkZFNiwgMHg2RTYzNkQ3MywKKzB4NkM1M0JGRjAsIDB4NjRDMzU3RjQsIDB4NjZEMzY1RTMsIDB4NkVGNjRGMjYsCisweDZDRjY2REY2LCAweEQxODcyRkU2LCAweDY2MTI2RTYzLCAweDkyQkM0NDE4LAorMHg0NDA4NDUyOCwgMHg0NTAwMjYyOSwgMHgyNjVCNDQwOCwgMHgyNjRCNDQwMCwKKzB4MjE2MjQ3MDgsIDB4RDE4MDQ3MDgsIDB4MjE3MjI3RUIsIDB4NkVGNjAwMEIsCisweDRGMjIyRkU2LCAweEUxMDFERTdELCAweEJGQUJFNDBBLCAweDYyRTMyRTEyLAorMHhFMTAwNzI2QywgMHgyMjEyRTQwMSwgMHgyMjEyMjIxMiwgMHgyMjEyMjIxMiwKKzB4MjI0MjIyMTIsIDB4RTUwM0U3MzAsIDB4MjIxMkU0MEEsIDB4MjIxMjIyMTIsCisweDIyMTIyMjEyLCAweDIyMTIyMjEyLCAweDIyMTIyMjEyLCAweDIyMTIyMjEyLAorMHgyMjcyMjIxMiwgMHgyMjEyMjI1MiwgMHgyMjEyMjIxMiwgMHgyMjEyMjIxMiwKKzB4MjIxMjIyMTIsIDB4QkY4NTIyMTIsIDB4RTYwMDEyMUEsIDB4NEYyNjJFNjIsCisweDZFRjYwMDBCLCAweEUxMDFEMjY2LCAweDIyMTJFNDQxLCAweDIyNDIwMDBCLAorMHhENDY1RDE2NCwgMHgyMTYyRTYwNSwgMHgyNDYyMDAwQiwgMHhEMjY0RDU2MywKKzB4ODgwMTYwNTAsIDB4RDQ2MzhCMDcsIDB4NjA0MDk2NjgsIDB4OEIwOTg4MDEsCisweEEwMDc5NjY1LCAweEU2MDAwMDA5LCAweDIyNjJENDVFLCAweDg4MDE2MDQwLAorMHhFNjA0OEIwMCwgMHhBRjVERTQwQSwgMHhEMjVCMjI2MiwgMHhFNDBBRTYwMSwKKzB4MjI2MkFGNTgsIDB4MkZDNjJGQjYsIDB4MkZFNjJGRDYsIDB4REM1NzRGMjIsCisweDYwQzJFRDAwLCAweENCMDFFQjY0LCAweDYwQzIyQzAyLCAweEEwMDhDOTAxLAorMHgzREIyNkUwMywgMHg2MEMyODkwNywgMHhDOTAxRTQwQSwgMHg2RTAzQkY0MiwKKzB4MkVFODdEMDEsIDB4M0RCMjhCRjUsIDB4RDQ0RDhCMDMsIDB4NDIwQkQyNEQsCisweEU0MEEwMDA5LCAweDZFRjY0RjI2LCAweDZDRjY2REY2LCAweDZCRjZBRjMyLAorMHg4RjAxNDQxMSwgMHg2MDQzNjA0QiwgMHgwMDA5MDAwQiwgMHgyRkM2MkZCNiwKKzB4MkZFNjJGRDYsIDB4N0ZGQzRGMjIsIDB4RUQwMERDNDAsIDB4RUI2NDYwQzIsCisweDJDMDJDQjAyLCAweDJGMDI2MEMyLCAweEEwMDlDOTAyLCAweDNEQjM2RTAzLAorMHg2MEMyODkwOCwgMHgyRjAyRTQwQSwgMHhCRjEzQzkwMiwgMHg3RDAxNkUwMywKKzB4OEJGNDJFRTgsIDB4OEIwQjNEQjMsIDB4RDIzNkQ0MzcsIDB4NEYyNjdGMDQsCisweDZERjY2RUY2LCAweDQyMkI2Q0Y2LCAweDFGRkY2QkY2LCAweDAzQzQwMzQwLAorMHg0RjI2N0YwNCwgMHg2REY2NkVGNiwgMHgwMDBCNkNGNiwgMHhENTJGNkJGNiwKKzB4NjA1MjU2NTEsIDB4MDAwQjQ2MjgsIDB4MkZCNjMwNkMsIDB4MkZENjJGQzYsCisweDRGMjIyRkU2LCAweDRGMDI0RjEyLCAweDZFNDNCRkYxLCAweERDMjg2QjAzLAorMHhCRkVDREQyOCwgMHgzMEI4MDAwOSwgMHgwNjBBM0MwNSwgMHg0NjA5NDYwOSwKKzB4M0Q2NTQ2MDEsIDB4NDIwOTAyMEEsIDB4NDIwOTQyMDksIDB4OEJGMDMyRTIsCisweDRGMTY0RjA2LCAweDZFRjY0RjI2LCAweDZDRjY2REY2LCAweDZCRjYwMDBCLAorMHg0RjIyMkZFNiwgMHhFMTAyREUxQywgMHhFNDAzRTUwMCwgMHhCRkQ0MkUxMiwKKzB4RTYwNjJFNTIsIDB4RTcwMDQ2MTgsIDB4MkU2MkU0MDMsIDB4NEYyNjJFNzIsCisweDZFRjZBRkNCLCAweDAwMDkwMDBCLCAweDAwMjVFNzIwLCAweDAwMjAyQzNDLAorMHgwMDIwMjk5OCwgMHgwMDFDNTgxNCwgMHgwMDFDNTlEMCwgMHgwMDFDNTgzMCwKKzB4MDAxQzYyNjgsIDB4MDAxQzU5QTQsIDB4MDAxQzYzOUMsIDB4MDAyMDI5QUQsCisweDAwMUM1ODA0LCAweDAwMjAyOUFDLCAweDAwMUM1ODFDLCAweDAwMUM1ODYwLAorMHgwMDIwMkE5MCwgMHgwMDIwMEY3MiwgMHgwMDIwMkFBOCwgMHgwMDFDMTA0MCwKKzB4Q0NDQ0NDQ0QsIDB4MTA2MjRERDMsIDB4MDAxRDQwMDQsIDB4MkY5NjJGODYsCisweDJGQjYyRkE2LCAweDJGRDYyRkM2LCAweDRGMjIyRkU2LCAweEU0MDA3RkUwLAorMHg0NTI4RTUxMCwgMHg2NzQzNkM0MywgMHhFMTA4QTAwRiwgMHg2MDQzNjQ0RCwKKzB4MEY1NjQwMDgsIDB4RUUwMDYwQzMsIDB4ODE1MTI1QzEsIDB4ODE1MzgxNTIsCisweDE1NzMxNUUyLCAweDc1MTQxNUU0LCAweDYyNEQ3NDAxLCAweDhCRUQzMjEzLAorMHhEQTcyNTFGMSwgMHgxQTExNTRGMiwgMHhEMTcxMkExMiwgMHg1NkY0NTVGMywKKzB4NThGNjU3RjUsIDB4MjE0MjExNDEsIDB4MTE1MjExNTMsIDB4MTE2NDExNjUsCisweDExNzYxMTc3LCAweDExODgxMTg5LCAweEQ5NkE2REYyLCAweERCNkE1MkY3LAorMHgyOUQyMTlEMSwgMHgyQjIyMUIyMSwgMHhEODY4RUI0NSwgMHhFOUI4RUE1MCwKKzB4NEEwODRCMDgsIDB4QTAyMDY5OUMsIDB4NkVFREVFMDAsIDB4NjFFMzZERTMsCisweDQxMDg0RDA4LCAweDMxRUMzREVDLCAweDQxMDg0RDA4LCAweDYwQzMzRDhDLAorMHhENzVGNDEwOCwgMHg4MUQxMkRDMSwgMHg0MTA4NjBBMywgMHg2MEMzODFEMiwKKzB4RTIwMDMxN0MsIDB4ODFEMzM0OTIsIDB4MUQxMzFERDIsIDB4OEQwMUQ0NTYsCisweEQ0NTIxRDI0LCAweDY1RDNCMDNDLCAweDY0RUQ3RTAxLCAweDhCREMzNEIyLAorMHhEQjU0RDE0RSwgMHhEMjRGNjUxMiwgMHgxQjUxNDUyOSwgMHhEMTRDNjQxMiwKKzB4MkI3MjY3NEQsIDB4RDY1MDY3MjIsIDB4MUI3MzQ3MjksIDB4MkZEMjY5MjIsCisweDFCODI2ODlELCAweDI2OTI2OTEyLCAweDE2QTI1QTEyLCAweERBNDY1QjE0LAorMHg1QzE2MTZCNCwgMHg1RDE4MTZDNiwgMHg2RUEyMTZEOCwgMHg3RjIwMTZFQSwKKzB4NkVGNjRGMjYsIDB4NkNGNjZERjYsIDB4NkFGNjZCRjYsIDB4MDAwQjY5RjYsCisweDY2NDI2OEY2LCAweEM4MDM2MDYxLCAweEU1MDA4RDA0LCAweEM5MDM2MDYxLAorMHg4QjAzODgwMiwgMHg2NTYzNTI2MiwgMHgyNDEyNTEyNCwgMHg2MDUzMDAwQiwKKzB4MkZFNjJGRDYsIDB4N0ZFQzRGMjIsIDB4NjI1MzZFNTMsIDB4NkQ0M0U1NTAsCisweDQ1MDhFNDAwLCAweEUxMDFBMDAxLCAweDYwNDM1MjI0LCAweDgxMjEyMjExLAorMHg2MDUzODEyMywgMHg1NkUyODEyMiwgMHg4QkY1MzYyMCwgMHgxNkU0RDIyRiwKKzB4RTYxNDY0RjMsIDB4NjVFMzQyMEIsIDB4RTRGQzY1RTEsIDB4MkU1MTI1NDksCisweDY1RjM2MUYxLCAweDJGMTEyMTQ5LCAweEQxMjg1NEQxLCAweEU2MTQ0MTBCLAorMHg2MDcxNTdEMSwgMHgyNzAxQ0IwMSwgMHg3RjE0MURFMSwgMHg2RUY2NEYyNiwKKzB4NkRGNjAwMEIsIDB4MkZFNjJGRDYsIDB4N0ZFQzRGMjIsIDB4NjY1MzZFNTMsCisweDZENDNFNUZDLCAweDIwNTk2MDYxLCAweDI2MDFDQjAxLCAweDMyNjA1MkUyLAorMHgxMkU0OEIwNiwgMHgzMUUwNTFFMiwgMHg1MkQxOEIwNCwgMHgxRTIyQTAwMiwKKzB4NTY2NEFGRjAsIDB4NjRGM0QyMTUsIDB4NDIwQkU2MTQsIDB4NjdFMTY1RTMsCisweDI3MTlFMUZDLCAweDY3RjEyRTcxLCAweDI3MTk1NEQxLCAweDY1RjNEMTBGLAorMHg0MTBCRTYxNCwgMHg1MkQxMkY3MSwgMHhDQjAxNjAyMSwgMHgxREUxMjIwMSwKKzB4NEYyNjdGMTQsIDB4MDAwQjZFRjYsIDB4MDAwMDZERjYsIDB4MDAyMDI1OUMsCisweDAwMjAyNUE0LCAweDAwMjAyNTk0LCAweDAwMjAyNUNDLCAweDAwMTAwMEEwLAorMHgwMDEwMTY0MCwgMHgwMDFFMjEwOCwgMHgwMDFDM0QwMCwgMHgwMDIwMDkwNCwKKzB4MkZDNjJGQjYsIDB4MkZFNjJGRDYsIDB4N0ZGQzRGMjIsIDB4NjAyMkQyMjUsCisweDhEMzVDODAzLCAweERFMjQyRjAxLCAweERCMjVEQzI0LCAweEVEMDFBMDE2LAorMHhDOTAzNjA2MSwgMHg4OTE1ODgwMSwgMHhEMTIyRDQyMCwgMHgwMDA5NDEwQiwKKzB4NjUwMzU2MDMsIDB4QzgyMDg1NjEsIDB4RTA1MDg5MDMsIDB4NzIwMTAyQkUsCisweEQyMUQwQjI2LCAweDY0RTM0MjBCLCAweDIxRDJEMTFDLCAweDY2QzI1MkMxLAorMHg4QkU1MzYyMCwgMHhERDFBRUUwMSwgMHg0RTE4QTAwRSwgMHhDOTAzNjA2MSwKKzB4ODkwRDg4MDEsIDB4RDcxM0Q0MTYsIDB4NDcwQkRCMTYsIDB4RDQxNjAwMDksCisweDY1MDM0QjBCLCAweDIxRTJEMTExLCAweDY2RDI1MkQxLCAweDhCRUQzNjIwLAorMHhDODA0NjBGMSwgMHhEMjExODkwNywgMHg0RjI2N0YwNCwgMHg2REY2NkVGNiwKKzB4NDIyQjZDRjYsIDB4N0YwNDZCRjYsIDB4NkVGNjRGMjYsIDB4NkNGNjZERjYsCisweDZCRjYwMDBCLCAweDAwMUUyMTAwLCAweDAwMjAyNUE0LCAweDAwMjAyNTlDLAorMHgwMDIwMjUzOCwgMHgwMDIwMEQ0MiwgMHgwMDIwMERDNCwgMHgwMDFDM0QzMCwKKzB4MDAyMDI1OTQsIDB4MDAyMDBENjAsIDB4MDAyMDI1Q0MsIDB4MDAyMDAxMDAsCisweEU2MDFEMjAzLCAweDEyNjVENTAzLCAweDAwMEIyMjUyLCAweDAwMDAxMjY2LAorMHgwMDFDMTAxMCwgMHgwMDAwQzM0RiwgMHhENjJBN0ZGQywgMHgyNjQyNjQ0QywKKzB4QzgyMDUwNjYsIDB4MkYwMjhERkMsIDB4N0YwNDAwMEIsIDB4MkZENjJGQzYsCisweDRGMjIyRkU2LCAweDZENDM2QzUzLCAweEVFMDBBMDA0LCAweDdFMDE2NEQ0LAorMHg2NDRDQkZFQSwgMHg4QkY5M0VDMiwgMHg2RUY2NEYyNiwgMHgwMDBCNkRGNiwKKzB4QTAwMTZDRjYsIDB4NzYwMTY2NDMsIDB4MjIyODYyNjAsIDB4MzY0ODhCRkIsCisweDY1NjNBRkU0LCAweDYyNTMyRkU2LCAweDY3NTM3NTA3LCAweEVFMEFFMTA4LAorMHhDOTBGNjA0MywgMHgzMEUyNDQwOSwgMHg0NDA5NjUwMywgMHhFNjM3OEQwMSwKKzB4MzY1Q0U2MzAsIDB4Mjc2MDQxMTAsIDB4NzdGRjhGRjIsIDB4ODAyOEUwMDAsCisweDZFRjYwMDBCLCAweEUwMDAwMDBCLCAweEUwMDAwMDBCLCAweDRGMjIyRkU2LAorMHg2MjUzN0ZFQywgMHg2NUYzNkU0MywgMHg2NDIzQkZEQywgMHg2NEUzQkZEMSwKKzB4NjRGM0JGQ0YsIDB4QkZDQ0Q0MDQsIDB4N0YxNDAwMDksIDB4MDAwQjRGMjYsCisweDAwMDA2RUY2LCAweDAwMUMwMDA0LCAweDAwMjAyQUM0LCAweEUxMTBENUExLAorMHhFNjQwNjA1MCwgMHgyNTAwQzlGRCwgMHhFMEZGNzVFOSwgMHg4MDUxNjQ1MywKKzB4ODA1MzgwNTIsIDB4ODA1NjgwNTUsIDB4MjUxMDc1RUYsIDB4RTFFRjYyNTAsCisweDIyMTlFMDAxLCAweEU3MjAyNTIwLCAweDI0NjA4MDUyLCAweDI1NzAwMDBCLAorMHhFNEZERDU5NSwgMHhFNzAyNjE1MiwgMHgyNTEyMjE0OSwgMHg3NDAxNjA1MiwKKzB4MjUwMkNCMDEsIDB4RDE5MTY2NTIsIDB4MjU2MjI2NDksIDB4OTJDNDYwMTIsCisweDIxMDJDQjA4LCAweEM5Q0Y2MDEyLCAweDYwMTIyMTAyLCAweDIxMDJDQjAzLAorMHgwMDBCMTE3MiwgMHg0RjIyMTEyMywgMHhENzhBRDU4OSwgMHhENDhCRDI4QSwKKzB4RTYwMEUxMDAsIDB4MjcxMTI1MTEsIDB4QkZCRjIyMTAsIDB4QUZENzI0NjEsCisweDY2NEM0RjI2LCAweDQ2MDBEMjg2LCAweDYwNjAzNjJDLCAweDAwMEJDQjEwLAorMHg2NTRDMjYwMCwgMHg0NTAwRDI4MiwgMHg2NjUwMzUyQywgMHgyNjE5RTFFRiwKKzB4MjU2MDAwMEIsIDB4RDI3RjY2NEMsIDB4MzYyQzQ2MDAsIDB4Q0IxMDYwNjAsCisweDI2MDAwMDBCLCAweEQyN0I2NTRDLCAweDM1MkM0NTAwLCAweEUxRUY2NjUwLAorMHgwMDBCMjYxOSwgMHg2NjRDMjU2MCwgMHg0NjAwRDI3NSwgMHg2MDYwMzYyQywKKzB4MDAwQkNCMDgsIDB4NjU0QzI2MDAsIDB4NDUwMEQyNzEsIDB4NjY1MDM1MkMsCisweDI2MTlFMUY3LCAweDI1NjAwMDBCLCAweEQyNkU2NjRDLCAweDM2MkM0NjAwLAorMHhDQjA4NjA2MCwgMHgyNjAwMDAwQiwgMHhEMjZBNjU0QywgMHgzNTJDNDUwMCwKKzB4RTFGNzY2NTAsIDB4MDAwQjI2MTksIDB4NjI0QzI1NjAsIDB4NDIwMEQ2NjQsCisweDYwMjAzMjZDLCAweDQwMjFDOTA4LCAweDQwMjE0MDIxLCAweDYwMEMwMDBCLAorMHhENjYwNjI0QywgMHgzMjZDNDIwMCwgMHhDOTA4NjAyMCwgMHg0MDIxNDAyMSwKKzB4MDAwQjQwMjEsIDB4NjQ0QzYwMEMsIDB4NzRGRkQxNUIsIDB4NjI0MDM0MUMsCisweDYwMkMwMDBCLCAweDY0NENEMTU5LCAweDYyNDAzNDFDLCAweDYwMkMwMDBCLAorMHg0RjIyMkZFNiwgMHhFNjBBNjU1QywgMHg4RDE1MzU2NywgMHhCRkVBNkU0MywKKzB4NjQwQzY0NTMsIDB4ODgwMTYwRUMsIDB4RTAwRjhCMDIsIDB4MjQwOUEwMDIsCisweDQ0MDk0NDA5LCAweEU2MEE2MjRDLCAweDg5MDUzMjYzLCAweDY0NENCRkUyLAorMHg2MDIzNjIwQywgMHg4QjAwQzg4MCwgMHg2MDIzRTIwMCwgMHgwMDBCNEYyNiwKKzB4NEYyMjZFRjYsIDB4NjA2MkQ2NDYsIDB4OEIwMzg4MDEsIDB4MDAwOUIyNDEsCisweDAwMDlBMDAzLCAweEU2NDBEMjQzLCAweEQ2NDMyMjYwLCAweDRGMjZFMjAwLAorMHgyNjIyMDAwQiwgMHhENjNFNEYyMiwgMHg4ODAyNjA2MiwgMHhCMjhCOEIwMSwKKzB4RDYzRDAwMDksIDB4NEYyNkUyMDAsIDB4MjYyMjAwMEIsIDB4RDQzOUQ1MzgsCisweEU3MDFFMTAwLCAweDAwMEIyNTEyLCAweDBGRkYyNDcwLCAweEU2MDREMjM1LAorMHgyMjYwMDAwQiwgMHhENDM1NEYyMiwgMHg0MTBCRDEzNSwgMHhENTI1MDAwOSwKKzB4NjY1MEUxRkQsIDB4MjYxOUQyMzMsIDB4MjU2MEU3MDAsIDB4MDAwQjRGMjYsCisweDRGMjIyMjcwLCAweEQxMkVENDMwLCAweDAwMDk0MTBCLCAweEU3RkJENTFELAorMHgyNjc5NjY1MCwgMHgwMDBCNEYyNiwgMHg0RjIyMjU2MCwgMHhEMTI4RDQyQiwKKzB4MDAwOTQxMEIsIDB4RTdGN0Q1MTcsIDB4MjY3OTY2NTAsIDB4MDAwQjRGMjYsCisweEQ1MTQyNTYwLCAweDYyNTA5NDI1LCAweDAwMEIyMjQ5LCAweEQ1MTEyNTIwLAorMHg2MjUwRTRCRiwgMHgwMDBCMjI0OSwgMHg0RjIyMjUyMCwgMHg4NTIyRDIyMCwKKzB4MjAwODYwMEQsIDB4ODgwMTg5MTEsIDB4ODgwMzg5M0MsIDB4ODgwNTg5M0UsCisweDg4MDY4OTQwLCAweDg4MDg4OTQ2LCAweDg4MDk4OTRDLCAweDg4MEE4OTUyLAorMHg4ODBCODk1OCwgMHhBMDY1ODk1RSwgMHhCMDY3MDAwOSwgMHhBMDYyMDAwOSwKKzB4RkY3RjYwMEMsIDB4MDAxRTEwMjgsIDB4MDAxRTIxNDgsIDB4MDAxRTExMDgsCisweDAwMjAyOURDLCAweDAwMjAyOURFLCAweDAwMjAyOUU5LCAweDAwMjAyOUMwLAorMHgwMDFFMTAzRiwgMHgwMDFFMTA1RiwgMHgwMDFFMTAzMCwgMHgwMDFFMTA5MCwKKzB4MDAyMDI5RTQsIDB4MDAxRTEwMEIsIDB4MDAyMDI5RTAsIDB4MDAyMDJBQzgsCisweDAwMjAwRjcyLCAweDAwMjAyOUU4LCAweDAwMjAyQUQ0LCAweDAwMjAyQUU0LAorMHgwMDIwMjlCNCwgMHgwMDA5QjA0QywgMHg2MDBDQTAzNSwgMHgwMDA5QjA1NiwKKzB4NjAwQ0EwMzEsIDB4NjI2MEQ2N0MsIDB4OEIyQjIyMjgsIDB4MDAwOUIwNjIsCisweDYwMENBMDI5LCAweDYyNjBENjc4LCAweDhCMjMyMjI4LCAweDAwMDlCMDZBLAorMHg2MDBDQTAyMSwgMHg2MjYwRDY3NCwgMHg4QjFCMjIyOCwgMHgwMDA5QjBCNCwKKzB4NjAwQ0EwMTksIDB4NjI2MEQ2NzAsIDB4OEIxMzIyMjgsIDB4MDAwOUIwQkEsCisweDYwMENBMDExLCAweDYyNjBENjZDLCAweDhCMEIyMjI4LCAweDAwMDlCMTFBLAorMHg2MDBDQTAwOSwgMHg2MjYwRDY2OCwgMHg4QjAzMjIyOCwgMHgwMDA5QjEzMiwKKzB4NjAwQ0EwMDEsIDB4NEYyNkUwMDAsIDB4MDAwOTAwMEIsIDB4RDI2NEQxNjMsCisweEQ1NjQ4NDEyLCAweDQwMDBDOTBGLCAweEQ3NjMwMTJELCAweDYxMUNFNDAzLAorMHhENjYyRTIwRiwgMHgyNzEyMjU0MCwgMHhFMDAxMjUyMCwgMHgyNjAyMDAwQiwKKzB4RTYwMUQyNUEsIDB4MzA2Njg1MjMsIDB4RTAwMDhEMDYsIDB4RTAwMEQyNTgsCisweDgxMjJENjVBLCAweDI2MDJFMDAxLCAweDAwMDkwMDBCLCAweDg1MjNEMjUzLAorMHgyMDA4NjAwRCwgMHg4ODAxODkwNSwgMHhENjU1OEIwQSwgMHhDQjAxNjA2MCwKKzB4RDY1MjI2MDAsIDB4RTEwMUQ0NEUsIDB4MjYxMkUwMDEsIDB4ODE0MjAwMEIsCisweEUwMDAwMDBCLCAweEU1MDFEMTQ5LCAweDQ1MTg4NTEzLCAweDM0NTM2NDBELAorMHg4RDA1NjYwMywgMHhEMjRCRTAwMCwgMHhFMDAxRDU0OCwgMHgyNTAyMjI2MCwKKzB4MDAwOTAwMEIsIDB4RDE0MTRGMjIsIDB4NjUwRDg1MTMsIDB4NDQxOTY0NTMsCisweDY3MkU2MjQ5LCAweDYwMkMyMjdELCAweDg5MDk4ODAxLCAweDg5MEM4ODAyLAorMHg4OTEwODgwMywgMHg4OTI2ODgwNiwgMHg4OTI5ODgwNywgMHgwMDA5QTAzOCwKKzB4RDYzRUQ1M0QsIDB4QTAyN0UyMTIsIDB4NjI1QzI2NTIsIDB4OEIyRjIyMjgsCisweEEwMUVENjNCLCAweDYwNUM2MjYyLCAweDg5MDUyMDA4LCAweDg5MDg4ODEwLAorMHg4OTBCODgyMCwgMHgwMDA5QTAyNCwgMHhENjM0RDQzNiwgMHhBMDEzRTIwNCwKKzB4RDczNTI2NDIsIDB4RTIwQ0Q2MzEsIDB4MjY3MkEwMEUsIDB4RDYyRkQ1MzMsCisweEEwMDlFMjE4LCAweEQ0MzIyNjUyLCAweEUyMEFENjJDLCAweDI2NDJBMDA0LAorMHhENjJBRDIzMCwgMHhFMjJFMjYyMiwgMHhENDJGODUxNSwgMHgzMjc3NjcwRCwKKzB4OEYwMTI0MjEsIDB4MjQ1MTY1MDMsIDB4MDAwOUIwREIsIDB4RTAwMUEwMDEsCisweDRGMjZFMDAwLCAweDAwMDkwMDBCLCAweEUxMDFENjFBLCAweDI2MTBENDI3LAorMHhENzE5NjU0MSwgMHg2NTVERDExOSwgMHhFMDAxRTIwRiwgMHgyNjIwMjc1MiwKKzB4MjEwMjAwMEIsIDB4NEYyMjJGRTYsIDB4ODUyM0QyMTAsIDB4MjQ0ODY0MEMsCisweEQ2MUU4QjA4LCAweEUyMDBENTEyLCAweDg0NTEyNjIxLCAweDIwNDk5NDEyLAorMHg4MDUxQTA1MCwgMHg2MEUwREUwRSwgMHg4RDM1Qzg0MCwgMHgzNDI3RTIwMSwKKzB4RDExNjg5NEMsIDB4NDIwQkQyMTYsIDB4RDUxNjIxNDEsIDB4Q0IwNDYwNTIsCisweDI1MDJBMDM1LCAweDAwMDBGRjdGLCAweDAwMjAyOUU5LCAweDAwMjAyOUI0LAorMHgwMDIwMjlDMCwgMHgwMDFFMTEwMCwgMHgwMDFFMTAwQywgMHgwMDIwMjlFMCwKKzB4MDAxRTEwMDAsIDB4MDAxRTEwMDEsIDB4MDAyMDJDNDAsIDB4MDAyMDI5QzgsCisweDAwMjAyOUQwLCAweDAwMjAyQ0FFLCAweDAwMjAyQ0IyLCAweDAwMjAyQ0JFLAorMHgwMDIwMkNENiwgMHgwMDIwMkNFMCwgMHgwMDIwMjlDQywgMHgwMDIwMjlEQSwKKzB4MDAyMDFEQjYsIDB4MDAxRTExMDgsIDB4ODkxNzM0MjcsIDB4RDc5NEQyOTMsCisweDIyNDE0NzBCLCAweEU1RkJENjkzLCAweDIxNTk2MTYyLCAweDg0RTEyNjEyLAorMHhCMEZGQ0I4MCwgMHg2MEUwODBFMSwgMHhDQjA0RDY4RiwgMHg2MDYwMkUwMCwKKzB4MjYwMEM5M0YsIDB4RTAwMUQ2OEQsIDB4MjYwMkEwMDEsIDB4NEYyNkUwMDAsCisweDZFRjYwMDBCLCAweDYwNjBENjhBLCAweDg5MTlDODgwLCAweDYwMjFEMjgzLAorMHg4QjE1ODgwMSwgMHhFNTAxRDI4NywgMHgzMDU2ODUyNCwgMHhEMTg2ODkxMCwKKzB4RDQ4NkUyMDMsIDB4NjU0MTIxMjAsIDB4NjU1REUwMEIsIDB4RDU4NDA2NTYsCisweEU3MDJFNDBGLCAweDI1NzEyMTQwLCAweEUwMDFENzdDLCAweDI3MDIwMDBCLAorMHhFMDAwMDAwQiwgMHg0RjIyMkZFNiwgMHg4NEUxREU3RSwgMHg4OTM0Qzg4MCwKKzB4ODU1NEQ1NzgsIDB4OEYzMDIwMDgsIDB4RDc3QjYxMDMsIDB4NjY3Mjg1NTMsCisweDY1MEM2NDAzLCAweDYyMEM4NTY2LCAweDhCMjYzNTIwLCAweEQ3NzNENjc3LAorMHg2NDRDNjUxQywgMHgyNzQxMjY1MSwgMHhDODQwNjBFMCwgMHhEMjc0ODkwNywKKzB4MDAwOTQyMEIsIDB4NjA2MkQ2NjcsIDB4QTAwOENCMDQsIDB4RDE2NDI2MDIsCisweDAwMDk0MTBCLCAweEU1RkJENjYzLCAweDI0NTk2NDYyLCAweEIwQTEyNjQyLAorMHhENTYyMDAwOSwgMHgyNTIyRTIwMSwgMHhENzVGNjBFMCwgMHgyRTAwQ0IwNCwKKzB4QzkzRjYwNzAsIDB4QTAwMTI3MDAsIDB4RTAwMDYwMjMsIDB4MDAwQjRGMjYsCisweDJGQTY2RUY2LCAweDJGQzYyRkI2LCAweDJGRTYyRkQ2LCAweEUyNDBEQTVDLAorMHhEQzU5NjZBMSwgMHgzMTIzNjE2RCwgMHg2MjYzODkwMCwgMHg2RUQzNkQyQywKKzB4NEUyMTM2RDgsIDB4NEUyMTJBNjEsIDB4REI1QkQ0NUEsIDB4RTcwMEEwMEYsCisweDc3MDE2NkIyLCAweDcxMDI2MTYzLCAweDY1NjEyQjEyLCAweDcxMDI2NjEzLAorMHg2MjYxMkIxMiwgMHg2MjJENjU1RCwgMHgzMjVDNDIyOCwgMHg2MjdDMjQyMiwKKzB4OEJFRDMyRTMsIDB4QzkwMzYwRDMsIDB4OEIxMDg4MDMsIDB4RUQwNzZFQjIsCisweDcxMDI2MUUzLCAweDY3MTMyQjEyLCAweDYyRTE3MTAyLCAweDY1NzEyQjEyLAorMHg2NTVENjIyRCwgMHgzNTJDNDUyOCwgMHhBMDBDMkNEMCwgMHg4ODAyMjQ1MiwKKzB4QTAwMzhCMDEsIDB4ODgwMUUyMDMsIDB4RTIwMThCMDUsIDB4NjZCMjJDMjAsCisweDY3N0Q2NzYxLCAweEVCMEYyNDcyLCAweDZEQTEyQ0IwLCAweDhCMDUyREQ4LAorMHhENDMyRDIzRSwgMHhFMTAxRUUwMCwgMHgyNDEyMjJFMiwgMHg2REY2NkVGNiwKKzB4NkJGNjZDRjYsIDB4NkFGNjAwMEIsIDB4MkZFNjJGRDYsIDB4RTI0MEREMzAsCisweDYxNkQ2NkQxLCAweDg5MDAzMTIzLCAweDY3MkM2MjYzLCAweERFMzIzNjc4LAorMHgyRDYxNzcwMywgMHhENjJGNDcyMSwgMHg0NzIxNjRFMiwgMHhFMTAwQTAwRSwKKzB4NzEwMTY1NjIsIDB4MjQ1MDYyNTMsIDB4NDIxOTc0MDEsIDB4NzQwMTI0MjAsCisweDI0NTA0NTI5LCAweDQ1MTk3NDAxLCAweDc0MDEyNDUwLCAweDMyNzM2MjFDLAorMHg0MjAwOEJFRSwgMHg2NEQxNjZFMiwgMHgzNjJDNDIwMCwgMHg4RjA2MjQ0OCwKKzB4REQyMjJFNjIsIDB4RTUwMERFMTUsIDB4MkQ1MkU3MDEsIDB4NkVGNjJFNzIsCisweDZERjYwMDBCLCAweDJGRTYyRkQ2LCAweEVFMDE0RjIyLCAweEVEMEFBMDA1LAorMHg2NEUzQkM5NywgMHg2NEUzQkM5RCwgMHg2MkVDN0UwMSwgMHg4QkY3MzJENywKKzB4RUUwMUEwMDUsIDB4NjRFM0JDOUUsIDB4NjRFM0JDQTQsIDB4NjJFQzdFMDEsCisweDhCRjczMkQ3LCAweDZFRjY0RjI2LCAweDZERjYwMDBCLCAweDAwMjAyOURBLAorMHgwMDIwMUVDMiwgMHgwMDFFMTEwOCwgMHgwMDFFMTAxNSwgMHgwMDIwMjlFMCwKKzB4MDAxRTEwMDEsIDB4MDAyMDI5QjQsIDB4MDAxRTExMDAsIDB4MDAyMDI5REUsCisweDAwMjAyOUNDLCAweDAwMUUxMDAwLCAweDAwMjAyOUQwLCAweDAwMjAyOURDLAorMHgwMDIwMURCNiwgMHgwMDFFMTAwQywgMHgwMDIwMjlDOCwgMHgwMDIwMjlFNCwKKzB4MkZFNjJGRDYsIDB4N0ZGQzRGMjIsIDB4NjA2MEQ2NEMsIDB4ODk0ODg4MDEsCisweEUxMDFENDRCLCAweEQ3NEI4NTQ4LCAweDY1MEQyNjEwLCAweDQ1MTk2MDcwLAorMHg2NjU5REQ0OSwgMHg2MUQzNjI2RSwgMHhDODQwMjYyRCwgMHg3NDAyNzEwMiwKKzB4OEQxQUQ3NDYsIDB4RDI0NjY2NkMsIDB4RTUwMURFNDYsIDB4QTAwNDJFMjIsCisweDYyNDVFRTA0LCAweDIxMjE3NTAxLCAweDYyNUM3MTAyLCAweDhCRjgzMkUzLAorMHg4MUQ0NjA2MywgMHhENTQwRTYwMSwgMHg2MjZDRTQxNywgMHg4OTFFMzI0MywKKzB4NzYwMTYyNTUsIDB4QUZGODI3MjEsIDB4RDIzQzc3MDIsIDB4RTUwMURFMzksCisweEEwMDQyRTIyLCAweDYyNDVFRTA0LCAweDIxMjE3NTAxLCAweDYyNUM3MTAyLAorMHg4QkY4MzJFMywgMHg4MUQ0NjA2MywgMHhENTM1RTYwMSwgMHhFNDE3QTAwNCwKKzB4NzYwMTYyNTUsIDB4NzcwMjI3MjEsIDB4MzI0MzYyNkMsIDB4OTI0QjhCRjgsCisweEQ0MzAyRDIxLCAweDYxNDJENzMwLCAweDY1RjIyRjEyLCAweDYwNTM2REYyLAorMHgyNzAwQzk4MCwgMHhDOTYwNjA1MywgMHg4MDcxNjEwMywgMHg2RUYyNjA1MywKKzB4QzkwMzY1RjIsIDB4NDUyOTREMTksIDB4NjBEQzgwNzIsIDB4ODE3MjQ1MTksCisweDYwNUM0RTI5LCAweDQwMTg2MkVDLCAweDgxNzMzMDJDLCAweDIxMTg2RDQyLAorMHg2RUYyMkZEMiwgMHg2NkYyNjJGMiwgMHg0NjI5NDIxOSwgMHg2NkYyNjU2QywKKzB4NjRFQzYwMkMsIDB4NDYyOTQwMTgsIDB4NDYxOTMwNEMsIDB4NjA2QzgxNzQsCisweDMwNUM0MDE4LCAweDgxNzU4RjA3LCAweDAwMDlCQ0JGLCAweDIyMjg2MjBDLAorMHhBMDBBODkwOCwgMHg2MDEzMDAwOSwgMHg4QjAzODg0MCwgMHgwMDA5QjAwQSwKKzB4MDAwOUEwMDMsIDB4RTIwMkQ2MTEsIDB4N0YwNDI2MjIsIDB4NkVGNjRGMjYsCisweDZERjYwMDBCLCAweDAwMDkwMDBCLCAweDAwMDAwNjBBLCAweDAwMjAyOUU4LAorMHgwMDIwMkM0MCwgMHgwMDFFMTAwMCwgMHgwMDIwMkNENiwgMHgwMDIwMkNFMiwKKzB4MDAyMDJDNTIsIDB4MDAyMDI5RDAsIDB4MDAyMDJDODIsIDB4MDAyMDJDODAsCisweDAwMjAyQzU0LCAweDAwMUUxMDBDLCAweDAwMjAyOUI0LCAweDAwMjAyOUUwLAorMHg0RjIyMkZFNiwgMHhERTkwN0ZGQywgMHgyMDA4ODRFOSwgMHgyRjAwOEQwNiwKKzB4RDY4RkQ0OEUsIDB4MDAwOTQ2MEIsIDB4NjRGMEIxNDYsIDB4NjYyMEQyOEQsCisweDg5MDIyNjY4LCAweEM5QkY2MEUwLCAweDdGMDQyRTAwLCAweDAwMEI0RjI2LAorMHgwMDBCNkVGNiwgMHgyRkU2MDAwOSwgMHhERTg3NEYyMiwgMHg2MEUwRDY4NywKKzB4Q0JDMEQ0ODcsIDB4NjI2MDJFMDAsIDB4QzgwMzYwMkMsIDB4NDAyMTg5MDQsCisweDcwMDE0MDIxLCAweDY2MDNBMDAyLCAweDY2MDM0MDA5LCAweEQ2ODE2MTZELAorMHhFNTAwQTAwNCwgMHg3NTAxNjI2MiwgMHg3NDA0MjQyMiwgMHgzMjEzNjI1RCwKKzB4RDI3RDhCRjgsIDB4MDAwOTQyMEIsIDB4QzlCRjg0RTIsIDB4NEYyNjgwRTIsCisweDZFRjYwMDBCLCAweDJGRDYyRkM2LCAweDRGMjIyRkU2LCAweERDNzI3RkZDLAorMHg4NEMyRDI3NiwgMHhDQjQwREQ3NiwgMHg4MEMyNDIwQiwgMHg4RDA0MjAwOCwKKzB4NjJFMDZFMDMsIDB4QTAwNjY0MkMsIDB4RDY2QTc0MDQsIDB4NjE2MEQ0NzEsCisweDQ3MEJENzcxLCAweDY0NEQ2NTFDLCAweDQ1MjE2NTQzLCAweEEwMDQ0NTIxLAorMHg2MkU2RTYwMCwgMHgyRjIyNzYwMSwgMHg2MjZEMkQyMiwgMHg4QkY4MzI1MywKKzB4QzkwMzYwNDMsIDB4ODkxMjIwMDgsIDB4ODkwNTg4MDMsIDB4ODkwNjg4MDIsCisweDg5MDc4ODAxLCAweDAwMDlBMDA4LCAweEEwMDVFMDA3LCAweEUwMDM4MEQ4LAorMHg4MEQ4QTAwMiwgMHg4MEQ4RTAwMSwgMHgyRjIyNjJFMiwgMHhFMDBGMkQyMiwKKzB4ODBEOEQ2NUUsIDB4Q0IwODYwNjAsIDB4NjBDMDI2MDAsIDB4MkMwMEM5M0YsCisweDRGMjY3RjA0LCAweDZERjY2RUY2LCAweDZDRjYwMDBCLCAweDJGQzYyRkI2LAorMHgyRkU2MkZENiwgMHhEMjU2NEYyMiwgMHg2RTQzNkQ3MywgMHg0MjBCNkI1MywKKzB4MjAwODZDNjMsIDB4NjQwMzhGMDgsIDB4RDI0NUQ0NTIsIDB4NkVGNjRGMjYsCisweDZDRjY2REY2LCAweDZCRjY0MjJCLCAweDI0RTA2MEIzLCAweDYwQzM4MDQxLAorMHhBMDA3ODE0MSwgMHg2NTVERTUwMCwgMHgwMERDNjA1MywgMHgzMjRDNjI1MywKKzB4ODAyNDc1MDEsIDB4NkVFQzYyNUQsIDB4OEJGNDMyRTMsIDB4NjA2MEQ2MzYsCisweDI2MDBDOUJGLCAweDZFRjY0RjI2LCAweDZDRjY2REY2LCAweDZCRjYwMDBCLAorMHg3RkM0NEYyMiwgMHg3MjAyNjJGMywgMHgyMjUxMkY0MSwgMHg0NTI5NzIwMiwKKzB4NjA2MzIyNTEsIDB4RTVDNEU2ODIsIDB4NjdGMzgxMjEsIDB4NjU1QzY2NkMsCisweEU0MDhCRkJDLCAweDRGMjY3RjNDLCAweDAwMDkwMDBCLCAweEQyMzdEMTM2LAorMHhFNDA1NjAxMiwgMHhFNTAwQ0IyMCwgMHgyMjQyMjEwMiwgMHgyMjUyMDAwQiwKKzB4RDUzNEQxMzMsIDB4RTQwMEQ3MzQsIDB4MjE0MkUyMEYsIDB4MTc0MTExNTQsCisweEQ1MzIyNzIyLCAweDk2MzVENzMyLCAweDE1NDEyNTcyLCAweDk2MzIxNTYyLAorMHhFNjAxMTU2NSwgMHhENTJGMTE2NSwgMHg2NjZDRTZGOCwgMHgyNTQyMjU0MiwKKzB4MjU0MjI1NDIsIDB4MjU0MjI1NDIsIDB4MjU2MjI1NDIsIDB4NzYwMUU3MjcsCisweDY3NjMyNTcyLCAweDI1NjI3Nzk3LCAweEU3MDQyNTcyLCAweDI1NzJFMjQ4LAorMHhFMjE5MjUyMiwgMHhFMjcwMjUyMiwgMHgyNTQyMjU0MiwgMHgyNTQyMjU0MiwKKzB4MjUyMjI1NDIsIDB4MjUyMkUyMEMsIDB4MjU0MjI1NDIsIDB4MjU0MjI1NDIsCisweDI1NDIyNTQyLCAweDI1NDIyNTQyLCAweDAwMEIxNTRBLCAweEUyMDgxMTQ1LAorMHgwMDA5NDIyQiwgMHg1MTYzMDYwMSwgMHgwMDFFMTAxNywgMHgwMDIwMkFGMCwKKzB4MDAyMDBGNzIsIDB4MDAyMDI5QjAsIDB4MDAxRTEwMTUsIDB4MDAxRTEwQkYsCisweDAwMTE3ODAwLCAweDAwMUUxMEZDLCAweDAwMjAwMTAwLCAweDAwMjAyMDFBLAorMHgwMDFFMTBGOCwgMHgwMDIwMkFGNCwgMHgwMDIwMEZCQywgMHgwMDFFMTBBRSwKKzB4MDAyMDFGREMsIDB4MDAyMDJCMTAsIDB4MDAxQzM1MDAsIDB4MDAxRDQwMDQsCisweDAwMUM1ODFDLCAweEEwMDBBMDAwLCAweDAwMUQwMTAwLCAweDAwMUQ0MDAwLAorMHgwMDA0MDAyMSwgMHgwMDFDNTg5QywgMHgyRkU2MkZENiwgMHg3RkZDNEYyMiwKKzB4QzgyMDYwNDMsIDB4NkU0MzhEMDIsIDB4MDAwOUJFQkIsIDB4QzgxMDYwRTMsCisweEJFQjg4OTAxLCAweDYwRTMwMDA5LCAweDg5MDFDODQwLCAweDAwMDlCRURBLAorMHhDODAxNjBFMywgMHhERDM3ODkzNiwgMHhDODAyNjBEMCwgMHgyRjAwOEQwMywKKzB4NDYwQkQ2MzUsIDB4NjBGMDAwMDksIDB4ODkwMkM4MDQsIDB4NDYwQkQ2MzMsCisweDYyRjAwMDA5LCAweEM4ODA2MDIzLCAweDYwRDA4OTAyLCAweDJEMDBDOTdGLAorMHhDODAxNjAyMywgMHhENjJFODkwNCwgMHgwMDA5NDYwQiwgMHgwMDA5QTAwNSwKKzB4ODkwMkM4MDgsIDB4NDYwQkQ2MkIsIDB4NjBGMDAwMDksIDB4ODkwMkM4MTAsCisweDQyMEJEMjI5LCAweEQ1MjkwMDA5LCAweDg4MDI2MDUyLCAweEQyMjg4QjAzLAorMHhBMDA1RTYwNCwgMHg4ODAxMjI2MCwgMHhEMjI1OEIwMiwgMHgyMjYwRTYwMSwKKzB4MjUyMkUyMDAsIDB4Qzg4MDYwRTMsIDB4RDYyMjg5MkUsIDB4NjBFMzZFNjAsCisweDg5MDJDODgwLCAweDQyMEJEMjIwLCAweDYwRTMwMDA5LCAweDg5MDJDODQwLAorMHg0MjBCRDIxRSwgMHg2MEUzMDAwOSwgMHg4OTAyQzgwMiwgMHg0MjBCRDIxQywKKzB4NjBFMzAwMDksIDB4ODkwRUM4MDQsIDB4NDEwQkQxMUEsIDB4QkYxNTAwMDksCisweEJGMUQwMDA5LCAweEQ1MTgwMDA5LCAweDYwNTBENDE4LCAweEM5MDhENzE4LAorMHhCRjU0MjUwMCwgMHg2MEUzMjQ3MiwgMHg4OTA1QzgwOCwgMHg3RjA0RDIxNSwKKzB4NkVGNjRGMjYsIDB4NkRGNjQyMkIsIDB4NEYyNjdGMDQsIDB4MDAwQjZFRjYsCisweDAwMDA2REY2LCAweDAwMUUxMDIxLCAweDAwMjAxMTgyLCAweDAwMjAxMUE0LAorMHgwMDIwMTdCMCwgMHgwMDIwMTFCQywgMHgwMDIwMTFDQywgMHgwMDIwMjlFMCwKKzB4MDAxRTEwMEIsIDB4MDAxRTEwMjgsIDB4MDAyMDEyMjIsIDB4MDAyMDEyMkUsCisweDAwMjAxMUQ0LCAweDAwMjAxMUYyLCAweDAwMUUxMDAwLCAweDAwMTBGMTAwLAorMHgxMjM0NTY3OCwgMHgwMDIwMTIwQSwgMHhENkE4NjQ0QywgMHgzNDZDNzRGRiwKKzB4MjQ1MDAwMEIsIDB4NjQ0Q0Q2QTYsIDB4MDAwQjM0NkMsIDB4RDZBNTI0NTAsCisweDM0NkM2NDRDLCAweDI0NTAwMDBCLCAweDYxNkQ2MjVDLCAweDQxMTk0MjA4LAorMHg2MDE5NDIwOCwgMHg2NDRDNDIwMCwgMHgzMjRDNjcwRSwgMHgyMDdERDE5RSwKKzB4QzkwRjQyMDAsIDB4MDAwQjMyMUMsIDB4Njc2MzIyMDAsIDB4NDIwODYyNUMsCisweDQyMDA0MjA4LCAweDMyNEM2NDRDLCAweDQyMDBEMTk4LCAweDAwMEIzMjFDLAorMHgyRkU2MjI3MCwgMHg2MTRDNEYxMiwgMHg0MTAwRDQ5MywgMHg2NzEwMzE0QywKKzB4MjcyOUUyOUYsIDB4NjU3MzZFNTMsIDB4NDcxOTY3NkQsIDB4NjcyRTYyNzksCisweDQyMjEyMjdELCAweDQyMjE0MjIxLCAweDc2MDE2NjJDLCAweEU0MDE0NjA4LAorMHgzNEU4NDYwOCwgMHg2NDRDNDYwMCwgMHgwRTFBMDQ2NywgMHgyMTUwMjVFQiwKKzB4MDAwQjRGMTYsIDB4NEYyMjZFRjYsIDB4RDI4NTdGRTgsIDB4ODgwMTYwMjEsCisweEQyODQ4QjdCLCAweDI2Njg2NjIxLCAweEQyODM4Qjc3LCAweDI2Njg2NjIxLAorMHhFNTBGOEI3MywgMHhFNDAxQkZBMCwgMHhCRkEzRTUwMSwgMHhFNTg2RTQwMCwKKzB4RTQwMDY1NUMsIDB4MkY1MEJGQTMsIDB4QkZBMEU0MDEsIDB4RTYwMkU1MDYsCisweDYwNjM0NjE4LCAweDgxRjJFNDAxLCAweDY1NDNCRjlFLCAweEU0MDE4NUYyLAorMHhCRkFBNjU0MywgMHg4NUYyNjYwMywgMHg2NTQzRTQwMSwgMHg2NjAzQkZCMSwKKzB4RTQwMjY1RjAsIDB4NjA1Mzc1NkMsIDB4ODBGOEJGN0UsIDB4QkY4MUU0MDIsCisweDg0RjhFNTEyLCAweDcwOTBFNDAyLCAweDY1MDNCRjgxLCAweDQ2MThFNjAyLAorMHg4MUY2NjA2MywgMHhCRjdGRTQwMiwgMHg4NUY2RTUwMCwgMHg2NjAzRTQwMiwKKzB4RTUwMEJGOEIsIDB4RTQwMjg1RjYsIDB4QkY5MjY2MDMsIDB4RTVGRUU1MDAsCisweEUwMTA2NTVDLCAweEJGNUZFNDAzLCAweEU1MTMwRjU0LCAweEU0MEVCRjYyLAorMHgwNUZDRTAxMCwgMHhCRjYyRTQwRSwgMHhFNTAwNzU4NSwgMHhCRjYzRTQwMywKKzB4RTUwMEU2NDAsIDB4QkY3MEU0MDMsIDB4RTUwMEU2NDAsIDB4QkY3OEU0MDMsCisweEU1RkZFNjQwLCAweEUwMTQ2NTVDLCAweEJGNDVFNDA0LCAweEU0MEYwRjU0LAorMHhFNTA0QkY0OCwgMHgwNUZDRTAxNCwgMHhCRjQ4RTQwRiwgMHhFNTAxNzU4NCwKKzB4QkY0OUU2NDAsIDB4RTUwMUU0MDQsIDB4QkY1NkU2NDAsIDB4RTUwMUU0MDQsCisweEU0MDRFNjQwLCAweEFGNUM3RjE4LCAweDdGMTg0RjI2LCAweDAwMEI0RjI2LAorMHg0RjIyMDAwOSwgMHhEMjQyN0ZGMCwgMHg4ODAxNjAyMSwgMHhEMjQxOEI3MSwKKzB4MjY2ODY2MjEsIDB4RDI0MDhCNkQsIDB4MjY2ODY2MjEsIDB4RTUwRjhCNjksCisweEU0MDFCRjFBLCAweEJGMURFNTAxLCAweEU1ODZFNDAwLCAweEU0MDA2NTVDLAorMHgyRjUwQkYxRCwgMHhCRjFBRTQwMSwgMHhFNDAxRTUwNiwgMHhCRjFCNjU0MywKKzB4RTQwMUU2NDAsIDB4QkYyODY1NDMsIDB4RTQwMUU2NDAsIDB4QkYzMDY1NDMsCisweDY1RjBFNjQwLCAweDc1NkNFNDAyLCAweEJFRkQ2MDUzLCAweEU0MDI4MEY0LAorMHhFNTEyQkYwMCwgMHhFNDAyODRGNCwgMHhCRjAwNzA5MCwgMHhFNjQwNjUwMywKKzB4QkYwMUU0MDIsIDB4RTY0MEU1MDAsIDB4QkYwRUU0MDIsIDB4RTY0MEU1MDAsCisweEJGMTZFNDAyLCAweEU1RkVFNTAwLCAweDYwNTM2NTVDLCAweEJFRTNFNDAzLAorMHhFNTEzODBGOCwgMHhFNDBFQkVFNiwgMHhFNDBFODRGOCwgMHhCRUU2NzA4NSwKKzB4RTUwMDY1MDMsIDB4QkVFN0U2NDAsIDB4RTUwMEU0MDMsIDB4QkVGNEU2NDAsCisweEU1MDBFNDAzLCAweEJFRkNFNjQwLCAweEU1RkZFNDAzLCAweDYwNTM2NTVDLAorMHhCRUM5RTQwNCwgMHhFNDBGODBGQywgMHhFNTA0QkVDQywgMHhFNDBGODRGQywKKzB4QkVDQzcwODMsIDB4RTUwMTY1MDMsIDB4QkVDREU2NDAsIDB4RTUwMUU0MDQsCisweEJFREFFNjQwLCAweEU1MDFFNDA0LCAweEU0MDRFNjQwLCAweEFFRTA3RjEwLAorMHg3RjEwNEYyNiwgMHgwMDBCNEYyNiwgMHgwMDAwMDAwOSwgMHgwMDFFMTAzMCwKKzB4MDAxRTEwODAsIDB4MDAxRTEwOTAsIDB4MDAxRTEwM0YsIDB4MDAxRTEwM0UsCisweDAwMjAyOURBLCAweDAwMjAyOURDLCAweDAwMjAyOURFLCAweEQyMUREMTFDLAorMHg2NjIwNjAxMCwgMHg2NzZDNzAwMSwgMHgzNzAwQzkwRiwgMHhFNTAwOEQxMywKKzB4NjcxMDYyMTAsIDB4NzcwMTYyMkMsIDB4NjQyMzIxNzAsIDB4RDYxNjYwMTAsCisweDQ0MDg0NDA4LCAweDM0MjhDOTBGLCAweDYyNjAyMTAwLCAweDcyMDFENTEzLAorMHg0NDA4MjYyMCwgMHgwMDBCMzU0QywgMHhEMTBGNjA1MywgMHgyNTU4NjUxMCwKKzB4RTYwMDhEMTMsIDB4RDYwREQ0MEIsIDB4NjU1QzY1NDAsIDB4NDcwODY3NTMsCisweDM3NTg0NzA4LCAweDQ3MDg2NTQwLCAweDI0NTA3NTAxLCAweDM2N0M2MDQwLAorMHgyNDAwQzkwRiwgMHg3MkZGNjIxMCwgMHgwMDBCMjEyMCwgMHgwMDAwNjA2MywKKzB4MDAyMDI5QUYsIDB4MDAyMDI5QUUsIDB4MDAyMDI5QjAsIDB4MDAyMDI1RDQsCisweDdGRkM0RjIyLCAweEU2ODBEMTlELCAweDY2NkM2MjEyLCAweEQyOUMyRjIyLAorMHg2N0YzNjU2MywgMHg0MjBCNzU0MiwgMHg3RjA0RTQwNCwgMHgwMDBCNEYyNiwKKzB4RTY4MDAwMDksIDB4RDI5NjY2NkMsIDB4RTcwMDY1NjMsIDB4NDIyQjc1NDAsCisweEU2ODA2NDczLCAweEQyOTI2NjZDLCAweEU3MDA2NTYzLCAweDQyMkI3NTQzLAorMHgyRkI2NjQ3MywgMHgyRkQ2MkZDNiwgMHg0RjIyMkZFNiwgMHg0RDE4RUQwMSwKKzB4REI4RERDOEMsIDB4NjVDMjUyQzEsIDB4ODkyMDM1MjAsIDB4QzkwMzYwNTEsCisweDg5MUM4ODAxLCAweEQxODlERTg3LCAweDY0RTM0MTBCLCAweDg1MDM2NTAzLAorMHg2NzBENjZCMiwgMHg4OTA3Mzc2MiwgMHhEMjg2RDQ4NSwgMHgwMDA5NDIwQiwKKzB4RTcwMUQxODUsIDB4MjE3MkFGRTYsIDB4REU4NDY0RTMsIDB4MDAwOTRFMEIsCisweEQ0ODRENjgzLCAweDQxMEJEMTg0LCAweEFGREIyNkQyLCAweDRGMjYwMDA5LAorMHg2REY2NkVGNiwgMHgwMDBCNkNGNiwgMHg0RjIyNkJGNiwgMHg4NTQ2N0ZGNCwKKzB4MkYwMUU2ODEsIDB4NjY2Qzg1NDcsIDB4ODU0ODgxRjEsIDB4ODFGMkQyNzAsCisweDY3RjM4NTQyLCAweDg1NDM4MUYzLCAweDgxRjRFNDBDLCAweDY1NjM2MDUzLAorMHg0MjBCODFGNSwgMHg3RjBDNzU0MCwgMHgwMDBCNEYyNiwgMHgyRjg2MDAwOSwKKzB4MkZBNjJGOTYsIDB4MkZDNjJGQjYsIDB4MkZFNjJGRDYsIDB4N0ZGNDRGMjIsCisweERDNkVFMjAwLCAweDJGMjFBMTM2LCAweERENkQ2QTEzLCAweEUwMDE0QTA4LAorMHg0RDBCRDk2QywgMHgzQTlDNEEwMCwgMHgxRjkxNzkzMCwgMHg2NkMyMUYwMiwKKzB4MzYyMDUyQzEsIDB4QTEyMThCMDEsIDB4NjA2MTAwMDksIDB4ODgwMUM5MDMsCisweEExMUI4QjAxLCAweDg1NjEwMDA5LCAweDg5NzdDODAxLCAweDg1RDI1RDYzLAorMHhDOTAzNjYwMywgMHg4NUQzNjQwMywgMHg2MDUzNjUwRCwgMHg0MDIxNDAyMSwKKzB4NDUwMEM5M0YsIDB4MzIyQTYxMDMsIDB4NjA1MzI1MkQsIDB4QzkwMUUyMTAsCisweEQ5NTUzMTIzLCAweDZFMDM4RDIxLCAweDQ0MDhENzU3LCAweDQ0MDg2NTcwLAorMHg0NDAwNjIxMywgMHgyNTU4NDIwMCwgMHgzNDJDOEYwRSwgMHg2MDQzRDI1MywKKzB4NjBFMzA3MkQsIDB4NEIxOTZCN0QsIDB4NjU4RTY4QjksIDB4Mjg1RDg4MDEsCisweDZCN0M4RjBCLCAweDZCMTNBMDA5LCAweDYwNDNEMjRELCAweDYxRUQwRTJELAorMHg2ODE5NDExOSwgMHgyODdENjc4RSwgMHhEMTRBNkJFQywgMHgyMjI4NjIxMiwKKzB4RUJGRjg5MDEsIDB4RUVGRjZCQkMsIDB4NkVFQzY1QkQsIDB4OEIwRjM1RTAsCisweDREMEJERDM2LCAweDU0MDM2NEMzLCAweEJGNzZFNTAyLCAweEQ0NDI2RDAzLAorMHg0MTBCRDEzNiwgMHhENzQxNjVEMywgMHhENDQxRUUwMSwgMHgyN0UyQTAxRCwKKzB4MjZFOUVFRkMsIDB4ODFEMjYwNjMsIDB4OTE0RTg1RDMsIDB4ODFEMzIwMTksCisweDQ1MDg4NUQyLCAweDgxRDIyMDhCLCAweEUyMDg4NUQzLCAweDgxRDMyMDVCLAorMHg0MjE4ODVENCwgMHg4MUQ0MjAyQiwgMHg4NTQxNjRDMiwgMHg4MTQxMjBFOSwKKzB4RDQzNDY1QzIsIDB4Q0IwMTYwNTEsIDB4NDkwQjI1MDEsIDB4NjBDMjAwMDksCisweDUyRjI1NkYxLCAweDJBMDJDQjAxLCAweDI2MjJBRjc5LCAweDQyMEJEMjFCLAorMHg1RTAzNjRDMywgMHg4NUUxNkQwMywgMHg2MDUzNjUwRCwgMHg4OTdCQzgyMCwKKzB4NjIxMEQxMjksIDB4OEIxMTIyMjgsIDB4RDcyNzg1RUYsIDB4NDIyMTYyMEQsCisweDQyMjE0MjIxLCAweEU1MDFENjI1LCAweDI3NTA0MjIxLCAweEQ3MjVEOTI0LAorMHgyNjIxRDQyNSwgMHgyOTYwRTYwMCwgMHgyNDYxMjc2MiwgMHg4NTIxNjJDMiwKKzB4OEI0M0M4MDIsIDB4RDkxMkQ3MUUsIDB4RTAwMTYyNzAsIDB4NjEyQzQ5MEIsCisweDY2OTJEOTFDLCAweEEwM0UyNjBCLCAweDdFMDMyOTYyLCAweDAwMUMzRDlDLAorMHgwMDIwMUEzQywgMHgwMDIwMjVDQywgMHgwMDIwMjk5NCwgMHgwMDIwMEQ0MiwKKzB4MDAyMDI1OTQsIDB4MDAyMDBEQzQsIDB4MDAxRTIxMzAsIDB4MDAyMDBENjAsCisweDAwMUMzRDMwLCAweDAwMjAyQzI4LCAweDAwMjAwRjcyLCAweDAwMjAyNUE0LAorMHgwMDIwMjQ4QywgMHgwMDFDM0QwMCwgMHgwMDIwMkMzQywgMHgwMDIwMkIyOCwKKzB4MDAyMDJCQTgsIDB4MDAyMDI5QTgsIDB4MDAyMDI1OUMsIDB4MDAxRTIxMkMsCisweDAwMjAyQzJDLCAweDAwMjAyQzMwLCAweDAwMjAyRDEwLCAweDAwMjAyOUVFLAorMHgwMDIwMjlFQywgMHgwMDIwMjlGMCwgMHgwMDIwMjlGNCwgMHhFMDRDRDEzOSwKKzB4NzIwMTAyMUUsIDB4RDkzODAxMjYsIDB4NjI5MEQ0MzgsIDB4NzIwMTY1NDEsCisweDI5MjA3NTAxLCAweDg1RTEyNDUxLCAweDQ2MThFNjQwLCAweDg5MUQyMDY4LAorMHhEOTM0RDczMywgMHg2NjVENjE3MSwgMHg2NTkyRDczMywgMHg2NDFENDcwQiwKKzB4RTIwMERFMzIsIDB4MkUyMEEwMTIsIDB4RTkwODg1RTQsIDB4NDkxODYyMDMsCisweDMyOTAyMjk5LCAweEU1MDE4QjA0LCAweDY0RTNCRUI3LCAweDAwMDlBMDA2LAorMHgyNTk4RDkyQiwgMHhFNTAwODkwMiwgMHg2NEUzQkVBRiwgMHhEMjJBRDQyOSwKKzB4NjVEMzQyMEIsIDB4RUUwMUQ3MjksIDB4MjdFMkFFRDksIDB4N0MwODYyRjEsCisweDJGMjE3MjAxLCAweEVFMDQ2MkYxLCAweDMxRTc2MTJELCAweEFFQzM4OTAxLAorMHg3RjBDMDAwOSwgMHg2RUY2NEYyNiwgMHg2Q0Y2NkRGNiwgMHg2QUY2NkJGNiwKKzB4MDAwQjY5RjYsIDB4MkZFNjY4RjYsIDB4RDIxRDRGMjIsIDB4NjBFMzZFMjIsCisweDhEMDJDODQwLCAweEJFMzMyMkUyLCAweEUyNDAwMDA5LCAweDJFMjg0MjE4LAorMHhCRTNFODkwMSwgMHg2MEUzMDAwOSwgMHg4OTA1QzgxMCwgMHhEMjE2RDQxNSwKKzB4MDAwOTQyMEIsIDB4MDAwOUJFM0QsIDB4QzgwNTYwRTMsIDB4QkU4RTg5MDEsCisweDYwRTMwMDA5LCAweDg5MDJDODAyLCAweEFFM0E0RjI2LCAweDRGMjY2RUY2LAorMHg2RUY2MDAwQiwgMHgwMDIwMjUzOCwgMHgwMDIwMjlFQywgMHgwMDIwMjlGNCwKKzB4MDAyMDI5RUUsIDB4MDAyMDI5RjAsIDB4MDAyMDFBQTAsIDB4MDAyMDJEMTAsCisweDAwMDA4MDAwLCAweDAwMjAyNTlDLCAweDAwMjAwRDYwLCAweDAwMUUyMTJDLAorMHgwMDFDMzUxMCwgMHgwMDIwMkMzNCwgMHgwMDIwMEY3MiwgMHgwODBBMEMwRSwKKzB4MDAwMjA0MDYsIDB4MUExQzFFMjAsIDB4MTIxNDE2MTgsIDB4MkUzMDMyMzQsCisweDI2MjgyQTJDLCAweDNBM0MzRTQwLCAweDZDNjI1NjQ4LCAweDQxMTEyRjI2LAorMHhFMjIwOEYxOCwgMHg4OTBCMzEyMywgMHgzMjFDRDIwNCwgMHhEMTAyNjIyMCwKKzB4NDEyQjMxMkMsIDB4MDAwOTAwMDksIDB4MDAyMDI0QjYsIDB4MDAyMDI0NkMsCisweDAwMEJFMDAwLCAweDQwMDA2MkY2LCAweDQwMDA0MDAwLCAweDQwMDA0MDAwLAorMHg0MDAwNDAwMCwgMHg2MkY2MDAwQiwgMHg0MDAwNDAwMCwgMHg0MDAwNDAwMCwKKzB4NDAwMDQwMDAsIDB4NDAxODQwMDAsIDB4NjJGNjAwMEIsIDB4NDAwMDQwMDAsCisweDQwMDA0MDAwLCAweDQwMDA0MDAwLCAweDQwMjg0MDAwLCAweDYyRjYwMDBCLAorMHg0MDAwNDAwMCwgMHg0MDE4NDAwMCwgMHgwMDBCNDAyOCwgMHhDOTBGNjJGNiwKKzB4NDAwNTQwMDUsIDB4NDAwNTQwMDUsIDB4NjJGNjAwMEIsIDB4NDAwNUM5MDcsCisweDQwMDU0MDA1LCAweDYyRjYwMDBCLCAweDQwMDVDOTAzLCAweDAwMEI0MDA1LAorMHhDOTAxNjJGNiwgMHgwMDBCNDAwNSwgMHgwMDAwNjJGNiwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDU0NEYwRDBBLCAweDQ2MjA1MzU1LAorMHgwMDAwM0E1NywgMHgyMDc5NjE0RCwgMHgzMjIwMzAzMywgMHgyMDM3MzAzMCwKKzB4MzMzQTMyMzEsIDB4MzgzMTNBMzcsIDB4MDAwMDAwMDAsIDB4MDAwMDBEMEEsCisweDAwMDAwMDQzLCAweDQyNzA3MzcyLCAweDNEMjA2Njc1LCAweDU1NEUyMDNELAorMHgyMDJDNEM0QywgMHg2RTQ5Njc3QSwgMHg0RTQ5NzI3NCwgMHg2RDc1NEU1MSwKKzB4MDAwMDAwM0QsIDB4NjE3NjZFNDksIDB4MjA2NDY5NkMsIDB4NzI2NTczNzUsCisweDIwNzI2RjIwLCAweDIwNzk2NTZCLCAweDAwMjE0NDQ5LCAweDUyNTA0NTQ1LAorMHg1NzIwNEQ0RiwgMHg2NTc0Njk3MiwgMHg2NDYxMjAyQywgMHgwMDNENzI2NCwKKzB4NkM2MTc2MjAsIDB4MDAwMDAwM0QsIDB4MDAwMDBBMEQsIDB4NkU2QjZFNTUsCisweDIwNkU3NzZGLCAweDZENkQ2RjYzLCAweDNENjQ2RTYxLCAweDAwMDAwMDAwLAorMHg2MTQzNzc0OCwgMHg3MjYyNjk2QywgMHg2RjY5NzQ2MSwgMHg2NjIwMjA2RSwKKzB4MEE2QzY5NjEsIDB4MDAwMDAwMEQsIDB4NzM2OTZGNEUsIDB4NjE0MzIwNjUsCisweDcyNjI2OTZDLCAweDZGNjk3NDYxLCAweDYxNjYyMDZFLCAweDIxMjE2QzY5LAorMHgwMDAwMEQwQSwgMHgwMDAwMEQwQSwgMHg2MjczNTU3NiwgMHg3NDczNzI1RiwKKzB4MDAwMDBBMEQsIDB4NjI3MzU1NzYsIDB4NzM3NTczNUYsIDB4NjQ2RTY1NzAsCisweDAwMDAwQTBELCAweDYyNzM1NTc2LCAweDczNjU3MjVGLCAweDAwMEEwRDZELAorMHgwMDAwMDA0MiwgMHg3Mjc0NkU0OSwgMHg2RDY1MjA1MSwgMHgyQzc5NzQ3MCwKKzB4NDk2NzdBMjAsIDB4NDk3Mjc0NkUsIDB4NzU0RTUxNEUsIDB4MDAwMDNENkQsCisweDIwNzQ2RjRFLCAweDc1NkY2RTY1LCAweDQ5MjA2ODY3LCAweDQyMjA1MTRFLAorMHgwQTBENjY3NSwgMHgwMDAwMDAwMCwgMHgwMDAwMDBGRiwgMHgwMDAyMDAwMSwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMTBFMDEwRCwgMHgwMDAyMDAwMywKKzB4MDEwOTAxMDgsIDB4MDAwMjAxMEEsIDB4MDAwMzAwMDIsIDB4MDIwMjAyMDEsCisweDAyMDQwMjAzLCAweDAyMDYwMjA1LCAweDAyMDgwMjA3LCAweDAyMEEwMjA5LAorMHgwMjBDMDIwQiwgMHgwMjBFMDIwRCwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAxMEUwMTBELCAweDAwRkYwMTBGLAorMHgwMTA5MDEwOCwgMHgwMTBCMDEwQSwgMHgwMDAzMDAwMiwgMHgwMjAyMDIwMSwKKzB4MDIwNDAyMDMsIDB4MDIwNjAyMDUsIDB4MDIwODAyMDcsIDB4MDIwQTAyMDksCisweDAyMEMwMjBCLCAweDAyMEUwMjBELCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDAyMDUyMjAsIDB4MDAwMDAwNDYsCisweDAwMDAwMDU5LCAweDQ5NTQ0MTIwLCAweDAwMDAyMDRELCAweDAwMDAwMDAwLAorMHgwMjAwMDExMiwgMHg0MEZGRkZGRiwgMHg5MTcwMENGMywgMHgyMDEwNDg5MCwKKzB4MDIwOTAxMDAsIDB4MDEwMTAwMkUsIDB4MDlGQTgwMDAsIDB4MDQwMDAwMDQsCisweDAwMDAwMEZGLCAweDAyMDEwNTA3LCAweDA3MDAwMjAwLCAweDAwMDI4MjA1LAorMHgwNTA3MDAwMiwgMHgwMDQwMDM4MywgMHgwNDA1MDcwMSwgMHgwMTAwNDAwMywKKzB4MDAyRTAyMDksIDB4ODAwMDAxMDEsIDB4MDAwNDA5RkEsIDB4MDBGRjA0MDAsCisweDA1MDcwMDAwLCAweDAwNDAwMjAxLCAweDgyMDUwNzAwLCAweDAwMDA0MDAyLAorMHgwMzgzMDUwNywgMHgwNzAxMDA0MCwgMHg0MDAzMDQwNSwgMHgwMzA0MDEwMCwKKzB4MDMwQzA0MDksIDB4MDA3OTAwNUEsIDB4MDA0MTAwNDQsIDB4MDMxODAwNTMsCisweDAwNTMwMDU1LCAweDAwMzIwMDQyLCAweDAwMzAwMDJFLCAweDAwNTcwMDIwLAorMHgwMDQxMDA0QywgMHgwMDAwMDA0RSwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDA3MDksIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIH07CisKK2NvbnN0IHUzMl90IHpjRndJbWFnZVNpemU9MTE1NDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb3R1cy9oYWwvaHBmd3VfMmsuYyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL2hhbC9ocGZ3dV8yay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0ZTJjYWMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy9oYWwvaHBmd3VfMmsuYwpAQCAtMCwwICsxLDEwMTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBBdGhlcm9zIENvbW11bmljYXRpb25zIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworI2luY2x1ZGUgImNwcmVjb21wLmgiCisKK2NvbnN0IHUzMl90IHpjRndJbWFnZVtdID0geworMHgwMDA5MDAwQiwgMHg0RjIyMkZFNiwgMHhERTk0N0ZGQywgMHhFMTE0RDU5NCwKKzB4MUUxM0Q0OTQsIDB4Njc1MjFFNEMsIDB4RDQ5NEQ2OTMsIDB4Mzc0MDI3NjksCisweDYyNTI4RjA2LCAweDcyMDFENjkyLCAweDYwNjAyNTIyLCAweDI2MDBDOTNGLAorMHhENzkwNjE1MiwgMHgyNTEyNjExRCwgMHgyNjRCNjY1MiwgMHgyNTYyNDcwQiwKKzB4MDAwOUIwMTcsIDB4RTYwMDk1QUMsIDB4Qzg0MDYwRTIsIDB4MkYwMjhGMDMsCisweDhGRjkzNjUyLCAweEQ0ODg3NjAxLCAweDRFMEJERTg4LCAweEQ0ODgwMDA5LAorMHgwMDA5NEUwQiwgMHg0RTBCRDQ4NywgMHg3RjA0MDAwOSwgMHhBMDUyNEYyNiwKKzB4NEYyMjZFRjYsIDB4NDEwQkQxODQsIDB4RDQ4NDAwMDksIDB4MDAwOTQ0MEIsCisweDQ1MEJENTgzLCAweEQ3ODMwMDA5LCAweEQyODNFMUZGLCAweDI3MTI2MTFELAorMHhENDgyNTAyOSwgMHhFMUZGQ0IwMSwgMHgxMjA5RTUwMSwgMHgxMjExMjIxMiwKKzB4RTcyMDI0NTIsIDB4NDcxOEQ1N0UsIDB4MjU3MkQyN0UsIDB4RDE3RUU3MDAsCisweEQ2N0ZENDdFLCAweEUyMDEyMjcwLCAweDI0NzAyMTcyLCAweEQ2N0QyNjIwLAorMHgyNjQxRTRGRiwgMHhENTdDRTYwMCwgMHg2NjZERTEwNCwgMHg3NjAxNjA2MywKKzB4NDAwMDYyNkQsIDB4OEZGODMyMTIsIDB4RDU3ODA1NDUsIDB4MjUyMEUyMDEsCisweEQyNzhENzc3LCAweEU0ODBFMTAwLCAweDIyMTIyNzEwLCAweDY2MTNENTc2LAorMHg2NjZENjQ0QywgMHg3NjA0Njc2MywgMHgzNzVDNjI2RCwgMHg4RkY4MzI0MywKKzB4RDU3MjI3MTIsIDB4RDI3M0Q3NzIsIDB4RTQwMEUxMDEsIDB4MjcxMDI1MTEsCisweDAwMEI0RjI2LCAweDdGQ0MyMjQyLCAweEQxNzBENTZGLCAweEQyNzFEQjcwLAorMHgxRjUxRDQ3MSwgMHhENjcxNzUwOCwgMHgxRjEyRDc3MSwgMHgxRjU1NzEwQywKKzB4MUZCOTc1RkMsIDB4NzIwNDFGMkEsIDB4MUYxM0VCMTAsIDB4MUY1NjFGNDQsCisweDFGNzgxRjY3LCAweEQ4NkIxRjJCLCAweERENkNEOTZCLCAweERDNkNFQTAwLAorMHhEMjZEREU2QywgMHg4OTAwM0EyMiwgMHhEMTVEN0EwMSwgMHg4ODAxNjAxMCwKKzB4NTZGODhCMDMsIDB4NDIxOEUyMDEsIDB4RDE2ODI2MjIsIDB4MDAwOTQxMEIsCisweDQ0MEJENDY3LCAweEQ1NjcwMDA5LCAweDAwMDk0NTBCLCAweDYwMTBEMTUwLAorMHg4QjEwODgwMSwgMHhFNjUwRDE0RiwgMHg0NjE4NjIxMiwgMHg4QjA4MzI2NiwKKzB4NTZGOUQxNEIsIDB4MjEyMEUyMDAsIDB4Q0IwMTYwNjIsIDB4MjYwMkEwMDMsCisweDcyMDEyNzEwLCAweDYwODIyMTIyLCAweDg5MDk4ODAxLCAweEUyQzhEMTVBLAorMHg2MjJDNjYxMiwgMHg4OTAzMzYyNiwgMHg2MDEwRDE1OCwgMHg4QkM4ODgwMSwKKzB4NTFGNjY3OTIsIDB4MjE3MjUyRjUsIDB4RDY1NTUxOTEsIDB4NTVGQTIyMTIsCisweDUyRkI2NDYyLCAweDU1NjEyNTQyLCAweDIyNTJFNDAwLCAweDYxNDM2NjQzLAorMHgwNURFNjAxMywgMHgzNkNDNDYwOCwgMHgwN0RFMjY1MiwgMHhDOTAzNjA3MSwKKzB4OEIwMjg4MDEsIDB4NzIwMTYyRTIsIDB4NzQwMTJFMjIsIDB4MzZCMzY2NEMsCisweDcxMDQ4RkVFLCAweDY2QzJEMTQ3LCAweDQ1Mjg2NTEyLCAweDI2NUI0NTE4LAorMHg2MDgyMkM2MiwgMHg4OTAxODgwMSwgMHgwMDA5QTE2OCwgMHg2MjcyRDc0MiwKKzB4OEIxMzIyMjgsIDB4RDQyQkQ3NDEsIDB4Njc3MkQ1NDEsIDB4NTE1MzYyNDIsCisweDMxMkMzMjdDLCAweDI0MjIyMjI4LCAweDE1MTM4RDA1LCAweDYyNjJENjNELAorMHhCMTYyNzIwMSwgMHhENjIzMjYyMiwgMHgyNjIyRTIwMCwgMHg1MjkxNjY5MiwKKzB4OEIwMTM2MjAsIDB4MDAwOUExNDQsIDB4NjA2MUEwNkUsIDB4MDAxQzAwMUMsCisweDAwMUQ0MDIwLCAweDAwMDBCMzhFLCAweEZGRkYwMDAwLCAweDEyMzQwMDAwLAorMHgwMDFFMTAxNSwgMHgwMDIwMTI3NCwgMHgwMDIwMzlFQywgMHgwMDIwMThBMiwKKzB4MDAyMDM5RjgsIDB4MDAyMDNBMTAsIDB4MDAyMDE4NjAsIDB4MDAyMDE5NjQsCisweDAwMjAxMjg4LCAweDAwMUMzNTEwLCAweDAwMUMzNjI0LCAweDAwMUUyMTJDLAorMHgwMDIwMzhFQywgMHgwMDIwMzQ4NCwgMHgwMDIwMzhGNCwgMHgwMDIwMzkwMCwKKzB4MDAyMDM5MEMsIDB4MDAyMDM5NjgsIDB4MDAyMDM5NkMsIDB4MDAyMDM5MTQsCisweDAwMjAzOTE1LCAweDAwMjAzOTE4LCAweDAwMTE3NzAwLCAweDAwMjAzOTg0LAorMHgwMDIwMzk4MiwgMHgwMDIwMzRFOCwgMHgwMDExNzcxMCwgMHgwMDFDM0QzMCwKKzB4MDAxQzM2RjgsIDB4MDAxMTc3MzQsIDB4MDAxQzM2ODQsIDB4MDAxQzNEMDAsCisweDAwMUMxMDAwLCAweDAwMUMxMDI4LCAweDAwMjAzNEZDLCAweDAwMjAzOTFDLAorMHgwMDExNzYwMCwgMHgwMDExNzc0MCwgMHg3RkZGRkZGRiwgMHgwMDIwMTczMCwKKzB4MDAyMDMzMjIsIDB4MDAyMDIzMkMsIDB4MDAyMDNEOUMsIDB4MDAyMDM5NkEsCisweDAwMjAzNEY0LCAweDAwMjAzOTVDLCAweDAwMUMzRDJDLCAweDAwMUMzNkIwLAorMHgwMDIwMzQ4QywgMHgwMDExNzc1QywgMHg4ODAxQzkwRiwgMHhBMENGODkwMSwKKzB4RDE5NjAwMDksIDB4MzYyMDYyMTIsIDB4RDQ5NTg5MDQsIDB4MjQyMUUyMDAsCisweDIxNjJBMENDLCAweDYyMTFEMTkzLCAweDg5MDEyMjI4LCAweDAwMDlBMEMzLAorMHhFMjAyRDc4RiwgMHg3NTAxNjU3MSwgMHgzMTIzNjE1RCwgMHgyNzUxOEQwMiwKKzB4MDAwOUEwQkMsIDB4RDI4QzU3RjIsIDB4NjIyMjYwNzIsIDB4NDAwOTQwMTksCisweEM5MEY0MDA5LCAweDhGMTk4ODBBLCAweDUyRjMxRjJDLCAweDQwMTk2MDIyLAorMHg0MDA5NDAwOSwgMHg4ODA4QzkwRiwgMHhBMEE3ODkwMSwgMHg2MDYzMDAwOSwKKzB4Q0IwMTU0RjcsIDB4RDI3RTU1RjIsIDB4RTcwMTI0MDIsIDB4RDQ3RkUxMDAsCisweDIyMTEyNTcyLCAweDcyMDE2MjQyLCAweDI0MjJBMDk4LCAweDhCM0Y4ODA1LAorMHg2MDIyNTJGMywgMHg0MDA5NDAxOSwgMHhDOTBGNDAwOSwgMHg4QjE2ODgwMiwKKzB4RTRGRkQ1NzcsIDB4NjQ0RDY3NTIsIDB4OEIxMDI3NDgsIDB4NjI3MkQ3NzUsCisweDhCMEMzMjYwLCAweDUxRjI1NUY3LCAweEQyNkRFNzAxLCAweDIxNzIyNTYyLAorMHhENTcxRTEwMCwgMHg2NDUyMjIxMSwgMHhBMDc3NzQwMSwgMHg1MkYzMjU0MiwKKzB4NDAxOTYwMjIsIDB4NDAwOTQwMDksIDB4ODgwNUM5MEYsIDB4MzFCMzhCNkUsCisweEQyNkE4QjZDLCAweDY3MjI1NEY0LCAweDc3MDFENTY5LCAweDYxNDIyMjcyLAorMHgxRjFDRTY0MCwgMHg0NjE4MjE1OSwgMHg4QjAzMzE2MCwgMHg2MjYyRDY2NSwKKzB4MjYyMjcyMDEsIDB4RTIwMEQ2NUEsIDB4MjYyMUIwNjcsIDB4MDAwOUEwNTYsCisweDMxMjNFMjIwLCAweDg4MDM4QjUyLCAweDUyRjM4QjFFLCAweDQwMTk2MDIyLAorMHg0MDA5NDAwOSwgMHg4ODAzQzkwRiwgMHhEMjVCOEIxNiwgMHg2NzIyNTRGNCwKKzB4NzcwMUQ1NTcsIDB4NjE0MjIyNzIsIDB4MUYxQ0U2NDAsIDB4NDYxODIxNTksCisweDhCMDMzMTYwLCAweDYyNjJENjU1LCAweDI2MjI3MjAxLCAweEUyMDBENjQ4LAorMHgyNjIxQjA0MywgMHgwMDA5QTAxMCwgMHhENDUyRDU1MSwgMHhEMjQ0Njc1MiwKKzB4RTEwMDc3MDEsIDB4MjU3MjNBNDYsIDB4MjIxMThGMDYsIDB4RUEwMEQ2NEUsCisweDcyMDE2MjYyLCAweDI2MjJCMDMxLCAweDJGQjJENTRDLCAweDk1NzM2NjUyLAorMHhENDRBNUJGMSwgMHgzNjIwNTI0MSwgMHg2MDYxODkxMCwgMHg4QjAxQzgwMywKKzB4MkIyMkUyMDEsIDB4OEZGNTQ1MTAsIDB4NTdGMTU2NjQsIDB4NjI3MkUxRjAsCisweDQxMjg0MTE4LCAweDI3MjIyMjFCLCAweDZCRjJBMDA4LCAweDZCRjJBMDA2LAorMHhFMjAwRDYyRiwgMHhEMTJGMjYyMSwgMHgyMTIxRTIwMCwgMHhEMTNDRTIwMSwKKzB4NjYxMjI4MjIsIDB4OEIwMTI2NjgsIDB4MDAwOUFFMkIsIDB4NDUwQkQ1MzksCisweEQxMzkwMDA5LCAweEFFMjRFNjAwLCAweDJGODYyMTYwLCAweDJGQTYyRjk2LAorMHgyRkM2MkZCNiwgMHgyRkU2MkZENiwgMHg3RkY0NEYyMiwgMHhERTM0RDEzMywKKzB4NTQxMTYyMTIsIDB4MUY0MTY3RTIsIDB4MkYyMkQ0MzIsIDB4RDUzMjFGNzIsCisweEQyMzI2NzQzLCAweDU4NDE3Nzk0LCAweDY5NDI1QTQyLCAweDVCMTY2QzcyLAorMHg2MDUyNkQyMiwgMHhDQjIwRTYwMCwgMHhFNTQwMjUwMiwgMHg2MjZENzYwMSwKKzB4OEJGQjMyNTMsIDB4NTVGMTYyRjIsIDB4MTE1MTIxMjIsIDB4RDYyODU1RjIsCisweDE0ODEyRTUyLCAweDI0OTIxNEEyLCAweDI3QzJENDI2LCAweDI2RDIxMUI2LAorMHhEQTI1Njc0MiwgMHhFODAxRDkyNSwgMHg0OTBCMkE3MiwgMHhFMjAxMUE4QywKKzB4MUEyQzQyMTgsIDB4NEYyNjdGMEMsIDB4NkRGNjZFRjYsIDB4NkJGNjZDRjYsCisweDY5RjY2QUY2LCAweDY4RjYwMDBCLCAweDAwMDAwN0QxLCAweDAwMjAzOTdDLAorMHgwMDIwMzk4MCwgMHgwMDIwMzk4NiwgMHgwMDFDM0RDMCwgMHgwMDExNzcyQywKKzB4MDAxQzNCODgsIDB4MDAyMDM5NjQsIDB4MDAxMTc3M0MsIDB4MDAxMTc3NDQsCisweDAwMDBGMDAwLCAweDAwMTE3NzY0LCAweDAwMTE3NzQ4LCAweDAwMTE3NzY4LAorMHgwMDExNzc2QywgMHgwMUZGRkZGRiwgMHgwMDExNzc0QywgMHgwMDIwMzRGNCwKKzB4MDAyMDNEOUMsIDB4MDAyMDI0RjAsIDB4MDAyMDM5NkEsIDB4MDAxQzNCOUMsCisweDAwMUMzRDk4LCAweDAwMUMzNzAwLCAweDAwMUMzNTAwLCAweDAwMUM1OTYwLAorMHgwMDFDODk2MCwgMHgwMDIwMzRGQywgMHgwMDFDM0QwMCwgMHgwMDIwMTYwQywKKzB4MkY5NjJGODYsIDB4MkZCNjJGQTYsIDB4MkZENjJGQzYsIDB4NEYyMjJGRTYsCisweERFOTU3RkFDLCAweDYxRTBFMDE0LCAweDBGMTRENDk0LCAweDcxMDE2MUUzLAorMHhFMDE4NjIxMCwgMHhEMjkyMEYyNCwgMHgwMDA5NDIwQiwgMHg0NTBCRDU5MSwKKzB4MjAwODAwMDksIDB4OEYxMjZEMDMsIDB4RDI4RjFGMDcsIDB4NjcyMEQ0OEYsCisweDY1N0NERDhGLCAweDQ3MEJENzhGLCAweEQxOEYwMDA5LCAweDYxOUM2OTEwLAorMHg0NjA4NjYxMywgMHgzNjE4NDYwOCwgMHgzRDZDNDYwOCwgMHhFMDE4MUZENywKKzB4RTU4MDA0RkMsIDB4NjA0QzY2RTIsIDB4MzA1MDY1NUMsIDB4MkQ2MjhGMTUsCisweDAxRkNFMDE0LCAweERFODVFNTAwLCAweDY0MUNBMDA4LCAweDY3NTM2NTVELAorMHg2MDcwMzdFQywgMHgzOURDNjk1MywgMHg4MDk0NzUwMSwgMHgzMjQzNjI1RCwKKzB4RDY3RjhCRjQsIDB4QTM0RUUyMDAsIDB4MjAwODI2MjEsIDB4RTAxNDhCMTMsCisweEU0MDAwMUZDLCAweEEwMDlERTc5LCAweDY0NEQ2NzFDLCAweDM1RUM2NTQzLAorMHg2OTQzNjY1MiwgMHgzOURDNjI2MiwgMHg3NDA0MTkyMSwgMHgzMjczNjI0RCwKKzB4QTMzODhCRjMsIDB4ODgwMTJEMTAsIDB4RTAxNDhCMTcsIDB4RTcwMDAxRkMsCisweDZEMUMyRDcwLCAweERFNkQxRkQ0LCAweDMyRDM2MjdELCAweEEzMkE4QjAxLAorMHg2NzdEMDAwOSwgMHg2NjczNjVFMywgMHg2MTczNzUwNCwgMHgzMTVDMzZFQywKKzB4NjkxMjY0NjIsIDB4QUZFRjc3MDgsIDB4ODgwNDI0OTIsIDB4RTAxNDhCMTgsCisweEU0MDAwMUZDLCAweDY3MUMyRDQwLCAweDYyNERERTYwLCAweDhCMDEzMjczLAorMHgwMDA5QTMxMSwgMHg2OTQzNjQ0RCwgMHgzOUVDNjJFMywgMHg3MjA0NjU5MiwKKzB4M0QyQzZENDMsIDB4NjE1MjY2RDIsIDB4MjE2OTc0MDgsIDB4MjUxMkFGRUQsCisweDhCMTg4ODA1LCAweDAxRkNFMDE0LCAweDJENDBFNDAwLCAweERFNTM2NzFDLAorMHgzMjczNjI0RCwgMHhBMkY2OEIwMSwgMHg2NDREMDAwOSwgMHg2MkUzNjk0MywKKzB4NjU5MjM5RUMsIDB4NkQ0MzcyMDQsIDB4NjZEMjNEMkMsIDB4NzQwODYxNTIsCisweEFGRUQyMTZCLCAweDg4MzEyNTEyLCAweEQ0NEE4QjNBLCAweDYxNDZEOTRBLAorMHg3NTA0NjU0MywgMHg2NzU2NjQ0MiwgMHg2RTUzMUY0OCwgMHg2NTUyN0UwNCwKKzB4N0VFNDYyRTIsIDB4N0UwNDY0RTIsIDB4NkVFMjFGRTksIDB4NUVGOTI5RTAsCisweDdFMDREOTQyLCAweDFGRUE2MEUyLCAweDI5MDBDOTAxLCAweEQ5NDA2RUUyLAorMHgyOUUwNEUwOSwgMHgyRjU2MkYyNiwgMHg1NkZBRDkzRSwgMHg2NTEzNDkwQiwKKzB4RDEzRDdGMDgsIDB4RTcxQzZFMEQsIDB4MURFMTJENzAsIDB4REUzQjY5MTIsCisweDY0RTIxRDkyLCAweDFENDNEMTNBLCAweEQyM0E2NTEyLCAweDY3MjIxRDU0LAorMHgxRDc1RDIzOSwgMHgxRDY2NjYyMiwgMHg2MjYyRDYzOCwgMHgxRDI3QTJBQiwKKzB4OEIzOTg4MzAsIDB4NjU5NkQ5MkIsIDB4Njc5MjY2OTYsIDB4NjE5Njc5MDQsCisweDc0RTQ2NDkzLCAweDZFNDM2OTkyLCAweDFGOUI3RTA0LCAweDFGRUM2NDQyLAorMHhEOTI1NkVFMiwgMHg1RUZDMjlFMCwgMHg3RTA0RDkyNCwgMHgxRkVENjBFMiwKKzB4MjkwMEM5MDEsIDB4RDkyMjZFRTIsIDB4MjlFMDRFMDksIDB4NTlGQzdGRkMsCisweERFMjcyRjkyLCAweDJGMTY0RTBCLCAweEQ0MUY3RjA4LCAweEUyMUM2MTBELAorMHgxRDExMkQyMCwgMHhEMjIwNjQ0MiwgMHhENDFDMUQ0MiwgMHgxRDUzNjU0MiwKKzB4Njc1MkQ1MUIsIDB4RDcxQjFENzQsIDB4MUQxNTYxNzIsIDB4MUQ2NjY2MjIsCisweDYyNjJENjFBLCAweDFEMjdBMjZGLCAweDhCMzU4ODMzLCAweDQ5MEJEOTE5LAorMHhBMjY4RUUwMCwgMHgwMDAwMkRFMCwgMHgwMDExNzgwMCwgMHgwMDIwM0ExNCwKKzB4MDAyMDE4QTIsIDB4MDAyMDJBQTQsIDB4MDAyMDM5MDYsIDB4MDAyMDNBMTgsCisweDAwMjAzNTJDLCAweDAwMjAxOEVFLCAweDAwMjAzOTA1LCAweDAwMTE3ODA0LAorMHgwMDIwMzk4NCwgMHgwMDExNzgxMCwgMHgwMDIwMzkwMSwgMHgwMDIwMzkwMiwKKzB4MDAyMDM5MDMsIDB4MDAyMDBGNjQsIDB4MDAxQzU4NjQsIDB4MDAxQzY4NjQsCisweDAwMUM3ODY0LCAweDAwMUM1OUJDLCAweDAwMUM2OUJDLCAweDAwMUM3OUJDLAorMHgwMDIwMEZCQywgMHgwMDIwMEZCOCwgMHg4OTAxODgyOCwgMHgwMDA5QTBDMCwKKzB4RTY0M0RFQjUsIDB4MzI2NjYyRTEsIDB4MUZFRThGMDIsIDB4MkUyMUUyNDAsCisweDYyMkQ2MkUxLCAweDhCMDEzMjY3LCAweDAwMDlBMEFBLCAweEU1MDE4NUUxLAorMHg4QjAxMzA1NiwgMHgwMDA5QTBBNCwgMHgyRDEwRTEwMSwgMHg2NEUxQjIyNSwKKzB4RTY0MzU3RkUsIDB4NjUyRDYyNzEsIDB4ODk0NDM1NjcsIDB4MzU2M0U2NDAsCisweEU2MDA4QjA1LCAweDBGNjVFMDQwLCAweEEwMEZFMTFBLCAweDYxNTM3MkMwLAorMHg0MTIxNDEyMSwgMHg0MTIxNDEyMSwgMHg0NTIxNDEyMSwgMHg0NTIxNDUyMSwKKzB4QzkwMzYwNTMsIDB4RTA0MDY2MDMsIDB4NzExODBGNjUsIDB4MjIwOUUwMDcsCisweDBGMjVFMDNDLCAweEUwNDQ2NDFELCAweEIyQTM2NUYzLCAweEUzM0MwRjQ2LAorMHg4NTMyMzNGQywgMHg2MjBEREU5NSwgMHg0MjA4NjAzMSwgMHg2MDIzNjEwRCwKKzB4MTMyM0U5NDQsIDB4MDZGRTQxMDgsIDB4RTAwRjM5RkMsIDB4MTMxNDRFMEIsCisweDY3MDc1RDkxLCAweDYwRDMyNjc5LCAweDBGNjY1NEZFLCAweDUxOTI4NTQyLAorMHg2MDBENEUwQiwgMHg2MEQzMjYwQiwgMHgwRjY2NjQ5MiwgMHg2NUYzQjIzNywKKzB4Njk2MTU2RkUsIDB4RTY0MDY1OUQsIDB4ODkzODM1NjMsIDB4RDc4MzU5RkUsCisweDc5MDY2NTkxLCAweEM5MDM2MDUzLCAweDQwMDA0MDA4LCAweDYxMDM2MjAzLAorMHgwRjI2RTA1MCwgMHg0NzBCRTBGRiwgMHg2QzA3NjAwQywgMHg2NjAzNjA1RCwKKzB4NDYyMTQ2MjEsIDB4NDYyMTQ2MjEsIDB4NDIwMDYyNjMsIDB4NDIwMDMyNkMsCisweDQwMjE0MDIxLCAweDQwMDhDOTAzLCAweDZEMkQzMEZDLCAweEU4MDA2QTAzLAorMHhCMjU3NjVGMywgMHg2RUEyNjREMywgMHgyRUM5RTA1MCwgMHg2Njk0MkFFMiwKKzB4RDc2RTAxRkUsIDB4NjA2QzQ3MEIsIDB4MkFFMjJFMEIsIDB4NjREMzY1RjMsCisweDc4MDFCMUZELCAweEVFMDY2MjhELCAweDhGRTkzMkUzLCAweDVFRkU3RDAxLAorMHg2MUUxRTQwMCwgMHg0MTAwODVFMSwgMHg2NkUzMzEwQywgMHg3NjBDNzExQiwKKzB4RTcwNDY1RjMsIDB4Njg2Njc0MDEsIDB4M0E3MzZBNEQsIDB4OEZGOTI1ODIsCisweDY1RjM3NTA0LCAweDY0MURCMUUzLCAweDY0RTFCMUE0LCAweDAwMDlBMTdCLAorMHhENDVCNTZGNywgMHhFQzAxRDI1QiwgMHgyNkMwNDIwQiwgMHgwMDA5QTE3MywKKzB4MDZGQ0UwMTgsIDB4ODgyOTYwNkMsIDB4NThGNzhCMDgsIDB4RTQwMEQyNTIsCisweDY2MjIyODQwLCAweDY0NkRCMTcxLCAweDAwMDlBMTY1LCAweDY2NkNFNjgxLAorMHg4OTAxMzA2MCwgMHgwMDA5QTBBQywgMHhENTUwRDE0RiwgMHg2MjEyNkE1NiwKKzB4MjEyMjMyQUMsIDB4NTQxMTZDNTYsIDB4MzRDQzYyNTMsIDB4NjQ1MjExNDEsCisweDcyMDg1ODEyLCAweEQ0NEEzODRDLCAweDY4MjIxMTgyLCAweDVBMTM2QzQyLAorMHgzQUNDM0M4QywgMHgxMUEzMjRDMiwgMHg2QzIyNzJFQywgMHg3MjEwNTgxNCwKKzB4MTE4NDM4Q0MsIDB4NUExNTY4MjIsIDB4MTFBNTNBOEMsIDB4NkEyMjcyMTAsCisweEQ2NDA1ODE2LCAweDExODYzOEFDLCAweDUyMTc2QzYyLCAweDExMjczMkNDLAorMHg1QTE4NTg2MSwgMHgxMUE4M0E4QywgMHg1QzE5NUE2MiwgMHgxMUM5M0NBQywKKzB4NTIxQTVDNjMsIDB4MTEyQTMyQ0MsIDB4NUExQjU4NjQsIDB4MTFBQjNBOEMsCisweDVDMUM1QTY1LCAweDExQ0MzQ0FDLCAweDUyMUQ1QzY2LCAweDExMkQzMkNDLAorMHg1QTFFNTg2NywgMHgxMUFFM0E4QywgMHg1NjFGNUE2OCwgMHgzNkFDRTg0MCwKKzB4MTE2RkRBMkQsIDB4NkNBMjM4MUMsIDB4N0E5NDY2ODIsIDB4Mjg2MjM2Q0MsCisweDVDODE2MkEyLCAweDE4QzEzQzJDLCAweDYyQTI3QTQ0LCAweDM2MkM1NjgyLAorMHhENjI2MTg2MiwgMHg1QTg1NjI2MiwgMHgzQTJDNDIyOSwgMHg3NjA0MThBNSwKKzB4NTY4NjYyNjIsIDB4MzYyQzQyMjksIDB4NTZGNzE4NjYsIDB4MjYyMEUyMzgsCisweDE2QzE1QzgxLCAweDE2MjI2MjEyLCAweEUyMDA1QzExLCAweDU1MTIxNkMzLAorMHg1NTE1MTY1NCwgMHg1NTEzMTY1NSwgMHg1NTE2MTY1NiwgMHg1NTgyMTY1NywKKzB4NjU4MjE2NTgsIDB4NTUxNDE2NTksIDB4NTU4NDE2NUEsIDB4NTU4MzE2NUIsCisweDU1ODUxNjVDLCAweDU1ODYxNjVELCAweDE4MjExNjVFLCAweDExMjEyMTIyLAorMHgxMTI1MTEyMiwgMHgxMTI2MTEyMywgMHgyODIyMTgyMiwgMHgxODI0MTEyNCwKKzB4MTgyNTE4MjMsIDB4MTgyNkEwQzcsIDB4MDAxMTc4MDQsIDB4MDAyMDMzRTAsCisweDAwMjAzQTM4LCAweDAwMjAxOEEyLCAweDAwMjAzNDhDLCAweDAwMUMzNkEwLAorMHgwMDIwMzRFOCwgMHgwMDFDM0NBMCwgMHgwMDFDMzZGNCwgMHgwMDFDM0I4OCwKKzB4NjY2Q0U2ODIsIDB4OEIyMDMwNjAsIDB4RUEyNDU2RjcsIDB4MjZBMEQxOTQsCisweDE2QzE1QzE3LCAweDE2MjI1MjE4LCAweDE2ODM1ODE5LCAweDE2QTQ1QTFBLAorMHgxNkM1NUMxQiwgMHgxNjI2NTIxQywgMHhFMjAwNTgxRCwgMHg1NTFFMTY4NywKKzB4NTUxRjE2NTgsIDB4MTEyNzE2NTksIDB4MTEyOTExMjgsIDB4MTEyQjExMkEsCisweDExMkQxMTJDLCAweEEwOEUxMTJFLCAweEU2ODMxMTJGLCAweDMwNjA2NjZDLAorMHg1MkY3OEIwQiwgMHhFQTAwRDg4MywgMHg2NTgyMjJBMCwgMHg3ODA0REM4MiwKKzB4NjI4MjJDNTIsIDB4QTA3RUQ2ODEsIDB4RTY5MDI2MjAsIDB4MzA2MDY2NkMsCisweERBN0Y4QjA2LCAweDAwMDk0QTBCLCAweEUyMDA1NkY3LCAweDI2MjBBMDczLAorMHg2NjZDRTY5MSwgMHg4QjEwMzA2MCwgMHg2MjIyRDI3NiwgMHgyMjI4NjIyQywKKzB4RDI3ODg5MDQsIDB4MDAwOTQyMEIsIDB4MDAwOUEwMDMsIDB4NDIwQkQyNzYsCisweDU2RjcwMDA5LCAweEEwNUVFMjAwLCAweEU2OTIyNjIwLCAweDMwNjA2NjZDLAorMHhFMDE4ODk1MSwgMHhFNkIwMEJGQywgMHg2NjZDNjJCQywgMHg4QjJBMzI2MCwKKzB4MDJGQ0UwMTQsIDB4NjgyQ0VBMDAsIDB4NjJBREU5MDQsIDB4ODk0QTMyODMsCisweDZBQURERDY0LCAweDNDREM2Q0EzLCAweDdEMDQ2RUMyLCAweERCNjhENDY3LAorMHgzMkRDNjJBMywgMHg0QjBCREM2NywgMHg0QzBCNkQyMiwgMHhENDY2NjRFMywKKzB4MDAwOTRCMEIsIDB4NjREMzRDMEIsIDB4NEIwQkQ0NjQsIDB4RTYwMDAwMDksCisweDY2NkQ2QkUzLCAweDc2MDEzQjZDLCAweDMyOTM2MjZELCAweDhGRjcyQkQwLAorMHhBRkRBNEQxOSwgMHhFNkI1N0EwOCwgMHgzMjYwNjY2QywgMHhENDVDOEIxMywKKzB4NEIwQkRCNTcsIDB4RDI1QjAwMDksIDB4NjAyMkRCNUIsIDB4Q0IyMEU2RkYsCisweDIyMDI2NjZELCAweERCNTkyQjYyLCAweEUwMTRFMjAwLCAweDU2RjcyQjIwLAorMHhBMDEwMDJGQywgMHhENDU2MjYyMCwgMHg2NTQyRDI1NiwgMHg0MjBCRDQ1NiwKKzB4QTAwODAwMDksIDB4REI1MjAwMDksIDB4NTJCMUU2MDAsIDB4NjIyQ0RCNTMsCisweDUyRjcyQjIxLCAweDdGNTQyMjYwLCAweDZFRjY0RjI2LCAweDZDRjY2REY2LAorMHg2QUY2NkJGNiwgMHgwMDBCNjlGNiwgMHg0RjIyNjhGNiwgMHhFMjQwNjE0RCwKKzB4ODkxNDMxMjMsIDB4MzEyN0UyMUYsIDB4OEIwOUQ3NDksIDB4RDQ0OTYxNEQsCisweEUwMDE3MUUwLCAweDU2NzE0NDBCLCAweDI2NTk2NTA3LCAweDE3NjFBMDA3LAorMHhFMDAxRDQ0NCwgMHg2NjcyNDQwQiwgMHgyNjU5NjUwNywgMHg0RjI2Mjc2MiwKKzB4MDAwOTAwMEIsIDB4NjE0RDRGMjIsIDB4MzEyM0UyNDAsIDB4RTIxRjg5MTIsCisweEQ3M0IzMTI3LCAweDYxNEQ4QjA4LCAweDU2NzFEMjNBLCAweDQyMEI3MUUwLAorMHgyNjBCRTAwMSwgMHgxNzYxQTAwNiwgMHg2NjcyRDIzNiwgMHhFMDAxNDIwQiwKKzB4Mjc2MjI2MEIsIDB4MDAwQjRGMjYsIDB4RTY0MDAwMDksIDB4NDYyODQ2MTgsCisweDYyNTJENTMxLCAweDg5RkMyMjY4LCAweDAwMDkwMDBCLCAweDQ2MThFNjgwLAorMHhENTJENDYyOCwgMHgyMjY4NjI1MiwgMHgwMDBCODlGQywgMHhBMDAxMDAwOSwKKzB4NzIwMUUyMDAsIDB4OEJGQzMyNDIsIDB4MDAwOTAwMEIsIDB4NDYxOEU2ODAsCisweEQ1MjY0NjI4LCAweDIyNjg2MjUyLCAweDAwMEI4QkZDLCAweDJGRTYwMDA5LAorMHg3RkZDNEYyMiwgMHhCRkYxNkU1MywgMHg2MUUyMkY0MiwgMHhFMjgwRDYyMCwKKzB4NTRFMTE2MTUsIDB4MTY0NjQyMTgsIDB4NDIyODU1RTIsIDB4NTdFMzE2NTcsCisweDE2Nzg2RUYyLCAweDI2RTIyRTJCLCAweDRGMjY3RjA0LCAweDZFRjZBRkNFLAorMHgwMDIwMzQ4QywgMHgwMDExNzgwNCwgMHgwMDIwMzhFQywgMHgwMDIwMzkwMCwKKzB4MDAyMDA1MEEsIDB4MDAyMDEwMDgsIDB4MDAyMDEwMkUsIDB4MDAyMDNBNTAsCisweDAwMjAxOEEyLCAweDAwMjAxOEU2LCAweDAwMjAzQTY0LCAweDAwMjAzQTZDLAorMHgwMDIwM0E3MCwgMHgwMDFDMzUwMCwgMHgwMDFDMTAwMCwgMHgwMDIwMzk4MiwKKzB4MDAxMTc4MDAsIDB4MDAyMDE4RUUsIDB4MDAyMDNBODQsIDB4MDAyMDM5ODgsCisweDAwMUMzNzA0LCAweDAwMjAzM0UwLCAweDAwMUMzNzNDLCAweDAwMUMzNzAwLAorMHgwMDFDMzcwQywgMHgyRkQ2MkZDNiwgMHg0RjIyMkZFNiwgMHg2QzUzREQxMCwKKzB4NkU0M0JGQTQsIDB4MkRFMkJGODksIDB4MDAwOUJGQTAsIDB4MkMxMjUxRDUsCisweDFDNDE1NEQ2LCAweDFDNTI1NUQ3LCAweDFDNjM1NkQ4LCAweDZFRjY0RjI2LAorMHgwMDBCNkRGNiwgMHg2MTYzNkNGNiwgMHhBMDA0RTYwMCwgMHg2MjU2NDEwOSwKKzB4MjQyMjc2MDEsIDB4MzYxMjc0MDQsIDB4MDAwQjhCRjksIDB4MDAwMDAwMDksCisweDAwMUMzNzBDLCAweDAwMDlBMTZFLCAweDJGRTYyRkQ2LCAweEREOTQ0RjIyLAorMHhBMDA0OUVCMiwgMHhENDkzMDAwOSwgMHg0MjBCRDI5MywgMHg2MkQyNjVEMiwKKzB4OEJGODIyRTgsIDB4MDAwOUEwMDQsIDB4RDI4RkQ0OTAsIDB4NTVEMTQyMEIsCisweDIyRTg1MkQxLCAweEEwMDQ4QkY4LCAweEQ0OEQwMDA5LCAweDQyMEJEMjhBLAorMHg1MkQyNTVEMiwgMHg4QkY4MjJFOCwgMHgwMDA5QTAwNCwgMHhEMjg2RDQ4OSwKKzB4NTVEMzQyMEIsIDB4MjJFODUyRDMsIDB4QTAwNDhCRjgsIDB4RDQ4NjAwMDksCisweDQyMEJEMjgxLCAweDUyRDQ1NUQ0LCAweDhCRjgyMkU4LCAweDZFRjY0RjI2LAorMHg2REY2MDAwQiwgMHgyRkQ2MkZDNiwgMHg0RjIyMkZFNiwgMHg2RTYzNkM3MywKKzB4NkQ1M0IwMUEsIDB4NjREMzU3RjQsIDB4QjA1RjY1RTMsIDB4QjA3NTY2QzMsCisweEIwQTQwMDA5LCAweEIwQTgwMDA5LCAweEIwQUMwMDA5LCAweEIwQUMwMDA5LAorMHhCMEFGMDAwOSwgMHhCMDMxNTRGNSwgMHg2Q0NENkMwMywgMHg0RjI2NjBDMywKKzB4NkRGNjZFRjYsIDB4NkNGNjAwMEIsIDB4MzQxMkQxNzAsIDB4RDY3MDA1MjksCisweDI2NTBENzcwLCAweDI3NDIwMDBCLCAweDAwMDlBMDE4LCAweDJGRDYyRkM2LAorMHg0RjIyMkZFNiwgMHg2RTYzNkM3MywgMHg2RDUzQkZFRSwgMHg2NEQzNTdGNCwKKzB4QjAzMzY1RTMsIDB4QjA4RDY2QzMsIDB4QjAwRjU0RjUsIDB4NkNDRDZDMDMsCisweDRGMjY2MEMzLCAweDZERjY2RUY2LCAweDZDRjYwMDBCLCAweEU1MDNEMTYyLAorMHhENzYzRDQ2MiwgMHgyMTUyNDUxOCwgMHgyNDcyMDAwQiwgMHhENDVGRDE1RSwKKzB4MjE2MkU2MDAsIDB4MjQ2MjAwMEIsIDB4QkY3MzRGMjIsIDB4QkY3M0U0MEEsCisweEQyNUMwMDA5LCAweDQxMThFMTA0LCAweEU0MEFFNTAwLCAweEJGNjkyMjEyLAorMHhENzU5MjI1MiwgMHhDQjIwNjA3MiwgMHgwMDBCNEYyNiwgMHg0RjIyMjcwMiwKKzB4NDEwQkQxNTYsIDB4RDU1NkU0MDAsIDB4NEYyNjQ1MkIsIDB4RDE1NTJGRTYsCisweDY2MTI2RTYzLCAweDkyMTA0NDE4LCAweDQ0MDg0NTI4LCAweDQ1MDAyNjI5LAorMHgyNjVCNDQwOCwgMHgyNjRCNDQwMCwgMHgyMTYyNDcwOCwgMHhEMTRFNDcwOCwKKzB4MjE3MjI3RUIsIDB4NkVGNjAwMEIsIDB4MUZGRjAzRjAsIDB4NEYyMjJGRTYsCisweEUxMDFERTRBLCAweEJGM0RFNDBBLCAweDY3RTMyRTEyLCAweEU1MDA3NzZDLAorMHhFMjA0RTEzMCwgMHgyNzUyRTQwQSwgMHgyNzUyMjc1MiwgMHgyNzUyMjc1MiwKKzB4Mjc1MjI3NTIsIDB4Mjc1MjI3NTIsIDB4Mjc1MjI3NTIsIDB4Mjc1MjI3NTIsCisweDI3NTIyNzUyLCAweDI3NTIyNzUyLCAweDI3NTIyNzUyLCAweDI3MjIyNzEyLAorMHgyNzUyMjc1MiwgMHgyNzUyMjc1MiwgMHgyNzUyMjc1MiwgMHgyNzUyMjc1MiwKKzB4MTc1QUJGMTgsIDB4MkU2MkU2MDAsIDB4MDAwQjRGMjYsIDB4RDIzNDZFRjYsCisweEU0NDFFMTAxLCAweDAwMEIyMjEyLCAweEQxMzIyMjQyLCAweEU2MDVENDMyLAorMHgwMDBCMjE2MiwgMHgwMDBCMjQ2MiwgMHhEMjMwMDAwOSwgMHhFNDBBRTYwMSwKKzB4MjI2MkFGMDAsIDB4MkZDNjJGQjYsIDB4MkZFNjJGRDYsIDB4N0ZGQzRGMjIsCisweDZDNDNEQjJCLCAweEVEMDA2MEIyLCAweDJCMDJDQjAzLCAweEM5MDM2MEIyLAorMHg2RTAzQTAwOCwgMHg4OTA3M0RDMiwgMHhFNDY0NjBCMiwgMHhCMDdDQzkwMywKKzB4N0QwMTZFMDMsIDB4OEJGNTJFRTgsIDB4OEYwNDNEQzIsIDB4RDQyMTJGRTEsCisweDQ2MEJENjIxLCAweDYyRjEwMDA5LCAweDYwMjM2MjJELCAweDg5RkZDODAxLAorMHg3RjA0NjAyMywgMHg2RUY2NEYyNiwgMHg2Q0Y2NkRGNiwgMHg2QkY2MDAwQiwKKzB4MDAxQzNCODgsIDB4MDAyMDNBOTgsIDB4MDAyMDE4RUUsIDB4MDAyMDNBQTAsCisweDAwMjAzQUE4LCAweDAwMjAzQUIwLCAweDAwMjAzQUI4LCAweDAwMjVFNzIwLAorMHgwMDIwM0Q5OCwgMHgwMDIwMzhGMCwgMHgwMDFDNTk2OCwgMHgwMDFDM0I0MCwKKzB4MDAwRjgwMDAsIDB4MDAxRDQwMDQsIDB4MDAxQzM1MDAsIDB4MDAyMDE1RTAsCisweDAwMjAxNjBDLCAweDAwMUM1ODE0LCAweDAwMUM1OUQwLCAweDAwMUM1ODMwLAorMHgwMDFDNjI2OCwgMHgwMDFDNTlBNCwgMHgwMDFDNjM5QywgMHgwMDFDNTgxQywKKzB4MDAxQzU4NjAsIDB4MDAyMDNBQzAsIDB4MDAyMDE4QTIsIDB4OEYwMTQ0MTEsCisweDYwNDM2MDRCLCAweDAwMDkwMDBCLCAweDU2NTFENTJCLCAweDQ2Mjg2MDUyLAorMHgzMDZDMDAwQiwgMHgyRkM2MkZCNiwgMHgyRkU2MkZENiwgMHg0RjEyNEYyMiwKKzB4QkZGMTRGMDIsIDB4NkIwMzZFNDMsIDB4REQyNURDMjQsIDB4MDAwOUJGRUMsCisweDNDMDUzMEI4LCAweDQ2MDkwNjBBLCAweDQ2MDE0NjA5LCAweDAyMEEzRDY1LAorMHg0MjA5NDIwOSwgMHgzMkUyNDIwOSwgMHg0RjA2OEJGMCwgMHg0RjI2NEYxNiwKKzB4NkRGNjZFRjYsIDB4MDAwQjZDRjYsIDB4MkZDNjZCRjYsIDB4MkZFNjJGRDYsCisweDRGMTI0RjIyLCAweEJGQ0Y0RjAyLCAweDZDMDM2RTQzLCAweEJGQ0JERDEzLAorMHgzMEM4MDAwOSwgMHgwNjBBM0QwNSwgMHg0NjA5NDYwOSwgMHgzNkUyNDYwMSwKKzB4NEYwNjhCRjUsIDB4NEYyNjRGMTYsIDB4NkRGNjZFRjYsIDB4NkNGNjAwMEIsCisweDRGMjIyRkU2LCAweEUxMDJERTBCLCAweEU0MDNFNTAwLCAweEJGQjkyRTEyLAorMHhFNjA2MkU1MiwgMHhFNzAwNDYxOCwgMHgyRTYyRTQwMywgMHg0RjI2MkU3MiwKKzB4NkVGNkFGQjAsIDB4MDAwOTAwMEIsIDB4MDAxQzEwNDAsIDB4Q0NDQ0NDQ0QsCisweDEwNjI0REQzLCAweDAwMUQ0MDA0LCAweDJGOTYyRjg2LCAweDJGQjYyRkE2LAorMHgyRkQ2MkZDNiwgMHg0RjIyMkZFNiwgMHhFNTAwN0Y5OCwgMHg2NDUzRTcxMCwKKzB4NkI1MzQ3MjgsIDB4RUUxQURDQkMsIDB4NjE1MzY1NUQsIDB4MzE1QzQxMDgsCisweDc1MDE0MTA4LCAweDYwNDMzMTdDLCAweDBGMTY2NjVELCAweEVEMDA2MEIzLAorMHgyMUIxMzZFMywgMHg4MTEyODExMSwgMHgxMUQyODExMywgMHgxMUQ0MTFEMywKKzB4NzQwNDhGRUEsIDB4RDhCMTY3RjIsIDB4MTg3MUQ5QjEsIDB4NThGMTI4NzIsCisweDE5ODFEMUIwLCAweDU5RjIyOTgyLCAweDVERjQ1QUYzLCAweDU0RjY1RUY1LAorMHgyMTkyMTE5MSwgMHgxMUEyMTFBMywgMHgxMUQ0MTFENSwgMHgxMUU2MTFFNywKKzB4MTE0ODExNDksIDB4REFBODU1RjcsIDB4NTdGOEVFMDAsIDB4NTJGOUREQTcsCisweDY0RTNENkE3LCAweDJBNTIxQTUxLCAweEQ4QTdEOUE2LCAweDJENzI5QUQ1LAorMHg2RUVEMjYyMiwgMHg0RDA4NkRFMywgMHgzREVDNjFFMywgMHg0RDA4NDEwOCwKKzB4M0Q5QzMxRUMsIDB4NDEwODYwQjMsIDB4ODFEMTJEQjEsIDB4NDEwOEUwNTAsCisweDQwMDhFN0I3LCAweDY3N0M0MTA4LCAweDYwQjM4MUQyLCAweEUyMDAzMThDLAorMHg4MUQzMzQ3MiwgMHgxRDEzMUREMiwgMHg4RDAxRDQ5MywgMHhENDkwMUQyNCwKKzB4QjBCMzY1RDMsIDB4NjRFRDdFMDEsIDB4OEJEQTM0QTIsIDB4MkZEMkRBOEMsCisweEREOTI2OEEyLCAweDJEODI0ODI5LCAweDdERkM2NEEyLCAweEQyODc2OTRELAorMHg2RTIyMkQ5MiwgMHg3RDBDNEUyOSwgMHg2ODIyMkRFMiwgMHg2MThENkFEMywKKzB4MkExNkQ3ODQsIDB4RDQ4QTZENzIsIDB4MjREMkQ1ODMsIDB4RDY4OTVFNzIsCisweDUxNzQxNEUyLCAweDE0MTRFRTAwLCAweEQxODc1ODc2LCAweDU5NzgxNDg2LAorMHgxNDk4RTcxMCwgMHg2NUUzNjI1MiwgMHgyNkUyMTQyQSwgMHhFNjAwNjRFMywKKzB4Njg0MzY0NEQsIDB4Mzg0QzQ4MDgsIDB4MzgxQzQ4MDgsIDB4MEM4NjYwNTMsCisweDA5Q0UyOEIxLCAweDgxOTE2MEIzLCAweDBBQ0U2MDUzLCAweDgxQTI2MDQzLAorMHgwRENFNjA1MywgMHg4MUQzNjBCMywgMHgwOENFNjA1MywgMHgxODgyNzQwMSwKKzB4NjI0RDA5Q0UsIDB4MEFDRTE5RTMsIDB4MUE2NDMyNzMsIDB4NzUwNDhGRTAsCisweEUwMDNEOTZBLCAweDQwMTg2QzkyLCAweDZEOTIyQ0IxLCAweDgxRDFEQTZGLAorMHg2RTkyRTA1MCwgMHg4MUUyNDAwOCwgMHg2MEIzNjE5MiwgMHg2NDkyODExMywKKzB4MTQ0MkU2MDAsIDB4RDQ2OTY3OTIsIDB4Njg5MjE3QTMsIDB4MTg2NEUxRkYsCisweDY1NjNFNzAzLCAweDM2NEM0NjA4LCAweDI2MTI3NTAxLCAweDM2NzM2NjVELAorMHhEQzVCOEJGOCwgMHg2REMyRTAwMywgMHgyREIxNDAxOCwgMHhEMjYwNkVDMiwKKzB4NjFDMjgxRTEsIDB4MTExMkVFMDAsIDB4RTAyNDY0QzIsIDB4NjVDMjE0MjMsCisweDE1RTRENDVCLCAweEU1ODA2N0MyLCAweDY4QzI4MTcyLCAweDgxODM2NkUzLAorMHg2NjZENjU1QywgMHg3NjA0Njk2MywgMHgzOTRDNkE2RCwgMHg4RkY4M0E1MywKKzB4REI1NDI5RTIsIDB4MjRCMkRDNTQsIDB4MjRDMjc0MDQsIDB4NEYyNjdGNjgsCisweDZERjY2RUY2LCAweDZCRjY2Q0Y2LCAweDY5RjY2QUY2LCAweDY4RjYwMDBCLAorMHg2MDExNjE0MiwgMHg4RjAzQzgwMywgMHhEMjNERTUwMCwgMHg4QjA2MzQyMCwKKzB4QzkwMzYwMTEsIDB4OEIwNjg4MDIsIDB4MzQyMEQyMzksIDB4NTYxMjhCMDMsCisweDUyNjQ2NTEzLCAweDAwMEIyNDIyLCAweDAxMTM2MDUzLCAweDJGRTYyRkQ2LAorMHg3RkVDNEYyMiwgMHg2MjUzNkU1MywgMHg2RDQzRTU1MCwgMHg0NTA4RTQwMCwKKzB4RTEwMUEwMDEsIDB4NjA0MzUyMjQsIDB4ODEyMTIyMTEsIDB4NjA1MzgxMjMsCisweDU2RTI4MTIyLCAweDhCRjUzNjIwLCAweDE2RTREMjM4LCAweEU2MTQ2NEYzLAorMHg2NUUzNDIwQiwgMHhFNEZDNjVFMSwgMHgyRTUxMjU0OSwgMHg2NUYzNjFGMSwKKzB4MkYxMTIxNDksIDB4RDEzMTU0RDEsIDB4RTYxNDQxMEIsIDB4NjA3MTU3RDEsCisweDI3MDFDQjAxLCAweDdGMTQxREUxLCAweDZFRjY0RjI2LCAweDZERjYwMDBCLAorMHgyRkU2MkZENiwgMHg3RkVDNEYyMiwgMHg2NjUzNkU1MywgMHg2RDQzRTVGQywKKzB4MjA1OTYwNjEsIDB4MjYwMUNCMDEsIDB4MzI2MDUyRTIsIDB4MTJFNDhCMDYsCisweDMxRTA1MUUyLCAweDUyRDE4QjA0LCAweDFFMjJBMDAyLCAweDU2NjRBRkYwLAorMHg2NEYzRDIxRSwgMHg0MjBCRTYxNCwgMHg2N0UxNjVFMywgMHgyNzE5RTFGQywKKzB4NjdGMTJFNzEsIDB4MjcxOTU0RDEsIDB4NjVGM0QxMTgsIDB4NDEwQkU2MTQsCisweDUyRDEyRjcxLCAweENCMDE2MDIxLCAweDFERTEyMjAxLCAweDRGMjY3RjE0LAorMHgwMDBCNkVGNiwgMHgwMDAwNkRGNiwgMHgwMDIwMzkxQywgMHgwMDIwMzRFQywKKzB4MDAyMDM0RjQsIDB4MDAyMDM0RkMsIDB4MDAyMDM1MjQsIDB4MDAyMDM5MDgsCisweDAwMjAzOTEwLCAweDAwMTAwMjA4LCAweDAwMTAxN0MwLCAweDAwMUUyMTBDLAorMHgwMDFDM0QwMCwgMHgwMDIwMzk1QywgMHgwMDEwMDBDOCwgMHgwMDExNzg4MCwKKzB4MDAxMTc3ODAsIDB4MDAwNDAwMjAsIDB4MDAyNkM0MDEsIDB4MDAyMDBFRDYsCisweDRGMjIyRkU2LCAweERFNDI2MjRDLCAweDQyMDA0MjA4LCAweDNFMkNBMDA1LAorMHhENDQwNTI1MiwgMHhCRjY5NTYyNCwgMHg2NUUyMkU2MiwgMHgzNTIwNTJFMSwKKzB4RDYzRDhCRjYsIDB4NEYyNjI2MjIsIDB4NkVGNjAwMEIsIDB4MkZDNjJGQjYsCisweDJGRTYyRkQ2LCAweERDMzk0RjIyLCAweDUyQzFEQjM5LCAweDM2MjA2NkMyLAorMHg2MDYxODkxQywgMHg4ODAxQzkwMywgMHhERTM0ODkxOCwgMHhCRjM3REQzNSwKKzB4NjUwMzY0RTMsIDB4NjZCMjg1MDMsIDB4MzI2MjYyMEQsIDB4RDQzMjg5MDcsCisweDAwMDlCRjc2LCAweDREMEJENDMxLCAweEFGRTYwMDA5LCAweEJGM0QwMDA5LAorMHhENDJGNjRFMywgMHgwMDA5NEQwQiwgMHgwMDA5QUZERiwgMHgyMjYyRDIyRCwKKzB4NkVGNjRGMjYsIDB4NkNGNjZERjYsIDB4NkJGNjAwMEIsIDB4MkZENjJGQzYsCisweDRGMjIyRkU2LCAweEREMjlEQzI4LCAweDZFNDM2MEMyLCAweDA0REU0MDA4LAorMHhFNjE0RDEyNywgMHg2NUUzNDEwQiwgMHhEMTI3RDcyNiwgMHg1NUUyMjdFMiwKKzB4MzVFMDUyNTQsIDB4MjEyMjhGMDQsIDB4NDAwODYwQzIsIDB4MTIyMjAyREUsCisweDYwNTM2NUMyLCAweDc1MDE0MDA4LCAweDBERTYwNkRFLCAweEM5MEY2MDUzLAorMHg2MDYzMkMwMiwgMHg2RUY2NEYyNiwgMHgwMDBCNkRGNiwgMHg4NTQzNkNGNiwKKzB4NjUwRDU2NDMsIDB4NjIyRDYyNjIsIDB4MzUyNzcyMDQsIDB4RTEwMDhGMEMsCisweDIyNjg5NjBDLCAweEQ2MTU4QjAzLCAweDcyMDE1MjYxLCAweEQ2MTMxNjIxLAorMHg2MjYyRTEwMSwgMHgyNjIyNzIwMSwgMHg2MDEzMDAwQiwgMHgwMDAwMDFGRiwKKzB4MDAyMDM0RkMsIDB4MDAyMDM0RjQsIDB4MDAxQzNEMDAsIDB4MDAyMDM1MjQsCisweDAwMjAzOEVDLCAweDAwMjAxOEEyLCAweDAwMjAzNEVDLCAweDAwMjAzQUU4LAorMHgwMDIwM0FFQywgMHgwMDFDM0QyOCwgMHgwMDIwMzk1QywgMHgwMDIwMzkxQywKKzB4MDAyMDBFRDYsIDB4MDAyMDM5NjAsIDB4MDAyMDM5NjQsIDB4MDAxMTc3NTQsCisweDJGQzYyRkI2LCAweDJGRTYyRkQ2LCAweDdGRjg0RjIyLCAweDYwMjJEMjM3LAorMHg4RDU4QzgwMywgMHhERTM2MkYwMSwgMHhEQjM3REMzNiwgMHg2NkMyNTJDMSwKKzB4ODkyRjM2MjAsIDB4QzkwMzYwNjEsIDB4ODkyQjg4MDEsIDB4RDIzM0REMzEsCisweDY0RDM0MjBCLCAweDFGMDE2NTAzLCAweDg4MDE2MEIxLCAweEQyMzA4QjA0LAorMHg2NEQzNDIwQiwgMHgwMDA5QUZFQSwgMHg4NTYxNTY1MywgMHg4OTA0QzgyMCwKKzB4RTA1MEQ3MkMsIDB4NzIwMTAyN0UsIDB4RDIyQjA3MjYsIDB4NjQ1MzQyMEIsCisweDg5MDcyMDA4LCAweDU1RjFEMTI2LCAweDY0RDM0MTBCLCAweEU2MDFENzI3LAorMHgyNzYyQUZENCwgMHg1NUYxRDIyNiwgMHg2NEUzNDIwQiwgMHhFNjAxRDEyNSwKKzB4MjE2MkFGQ0MsIDB4REQyNURFMjQsIDB4REMyNkRCMjUsIDB4NjZEMjUyRDEsCisweDg5MTgzNjIwLCAweEM5MDM2MDYxLCAweDg5MTQ4ODAxLCAweEQxMTdENDFGLAorMHgwMDA5NDEwQiwgMHgzNkUwNTYwMywgMHg2NTAzOEYwNCwgMHgyQjIwRTIwMSwKKzB4MkM1MkFGRUMsIDB4RDcxMkQ0MUMsIDB4MDAwOTQ3MEIsIDB4RTYwMUQxMTUsCisweEFGRTM0NjE4LCAweDYwRjEyMTYyLCAweDg5MDdDODA0LCAweDdGMDhEMjE3LAorMHg2RUY2NEYyNiwgMHg2Q0Y2NkRGNiwgMHg2QkY2NDIyQiwgMHg0RjI2N0YwOCwKKzB4NkRGNjZFRjYsIDB4MDAwQjZDRjYsIDB4MDAwMDZCRjYsIDB4MDAxRTIxMDAsCisweDAwMjAzNEZDLCAweDAwMjAzNEY0LCAweDAwMjAzOTg0LCAweDAwMjAxNEEwLAorMHgwMDIwMTRDQywgMHgwMDIwMzQ4QywgMHgwMDIwMTZCRSwgMHgwMDFFMjEyQywKKzB4MDAyMDE1MzAsIDB4MDAxQzNEMzAsIDB4MDAxMTc4ODAsIDB4MDAyMDM0RUMsCisweDAwMjAzOTBDLCAweDAwMjAzOTA4LCAweDAwMjAzNTI0LCAweDAwMjAwNjEwLAorMHhFNjAxRDIwMywgMHgxMjY1RDUwMywgMHgwMDBCMjI1MiwgMHgwMDAwMTI2NiwKKzB4MDAxQzEwMTAsIDB4MDAwMEMzNEYsIDB4MDAwOTAwMEIsIDB4MkZENjJGQzYsCisweDRGMjIyRkU2LCAweDZENDM2QzUzLCAweEVFMDBBMDA0LCAweDdFMDE2NEQ0LAorMHg2NDRDQkZGMiwgMHg4QkY5M0VDMiwgMHg2RUY2NEYyNiwgMHgwMDBCNkRGNiwKKzB4RTUwMDZDRjYsIDB4NjY0M0EwMDIsIDB4NzYwMTc1MDEsIDB4MjIyODYyNjAsCisweEFGRTM4QkZBLCAweDJGRTYwMDA5LCAweDc1MDc2MjUzLCAweEUxMDg2NzUzLAorMHg2MDQzRUUwQSwgMHg0NDA5QzkwRiwgMHg2NTAzMzBFMiwgMHg4RDAxNDQwOSwKKzB4RTYzMEU2MzcsIDB4NDExMDM2NUMsIDB4OEZGMjI3NjAsIDB4RTAwMDc3RkYsCisweDAwMEI4MDI4LCAweDAwMEI2RUY2LCAweDAwMEJFMDAwLCAweDJGRTZFMDAwLAorMHg3RkVDNEYyMiwgMHg2RTQzNjI1MywgMHhCRkRDNjVGMywgMHhCRkQwNjQyMywKKzB4QkZDRTY0RTMsIDB4RDQwMzY0RjMsIDB4MDAwOUJGQ0IsIDB4NEYyNjdGMTQsCisweDZFRjYwMDBCLCAweDAwMjAzQUYwLCAweEU0RkREMjlELCAweEQ3OUQ2MTIyLAorMHgyMjEyMjE0OSwgMHg3NDAxNjAyMiwgMHgyMjAyQ0IwMSwgMHhENTlBNjYyMiwKKzB4MjI2MjI2NDksIDB4Qzg0MDYwNzAsIDB4NjA1Mjg5MDIsIDB4MjUwMkNCMDQsCisweEU2MDE2MDUyLCAweDI1MDJDQjA4LCAweEU0MDI2MDUyLCAweDI1MDJDOUNGLAorMHg0NjE4NjA1MiwgMHgyNTAyQ0IxMCwgMHhDQjAzNjA1MiwgMHgxNTQyMjUwMiwKKzB4MTU2MzAwMEIsIDB4RDc4RUQ1OEQsIDB4RDQ4RkQyOEUsIDB4RTYwMEUxMDAsCisweDI3MTEyNTExLCAweEFGQ0YyMjEwLCAweDY2NEMyNDYxLCAweDQ2MDBEMjhCLAorMHg2MDYwMzYyQywgMHgwMDBCQ0IxMCwgMHg2NTRDMjYwMCwgMHg0NTAwRDI4NywKKzB4NjY1MDM1MkMsIDB4MjYxOUUxRUYsIDB4MjU2MDAwMEIsIDB4RDI4NDY2NEMsCisweDM2MkM0NjAwLCAweENCMTA2MDYwLCAweDI2MDAwMDBCLCAweEQyODA2NTRDLAorMHgzNTJDNDUwMCwgMHhFMUVGNjY1MCwgMHgwMDBCMjYxOSwgMHg2NjRDMjU2MCwKKzB4NDYwMEQyN0EsIDB4NjA2MDM2MkMsIDB4MDAwQkNCMDgsIDB4NjU0QzI2MDAsCisweDQ1MDBEMjc2LCAweDY2NTAzNTJDLCAweDI2MTlFMUY3LCAweDI1NjAwMDBCLAorMHhEMjczNjY0QywgMHgzNjJDNDYwMCwgMHhDQjA4NjA2MCwgMHgyNjAwMDAwQiwKKzB4RDI2RjY1NEMsIDB4MzUyQzQ1MDAsIDB4RTFGNzY2NTAsIDB4MDAwQjI2MTksCisweDYyNEMyNTYwLCAweDQyMDBENjY5LCAweDYwMjAzMjZDLCAweDQwMjFDOTA4LAorMHg0MDIxNDAyMSwgMHg2MDBDMDAwQiwgMHhENjY1NjI0QywgMHgzMjZDNDIwMCwKKzB4QzkwODYwMjAsIDB4NDAyMTQwMjEsIDB4MDAwQjQwMjEsIDB4RDE2MTYwMEMsCisweDM0MUM2NDRDLCAweDAwMEI2MjQwLCAweEQxNUY2MDJDLCAweDM0MUM2NDRDLAorMHgwMDBCNjI0MCwgMHgyRkU2NjAyQywgMHg2RTQzNEYyMiwgMHhFNjBBNjQ1QywKKzB4ODkxNDM0NjcsIDB4MDAwOUJGRUIsIDB4NjBFQzY0MEMsIDB4OEIwMjg4MDEsCisweEEwMDJFMDBGLCAweDQ0MDkyNDA5LCAweDYyNEM0NDA5LCAweDMyNjNFNjBBLAorMHhCRkUyODkwNSwgMHg2MjBDNjQ0QywgMHhDODgwNjAyMywgMHhFMjAwOEIwMCwKKzB4NEYyNjYwMjMsIDB4NkVGNjAwMEIsIDB4RDY0QzRGMjIsIDB4ODgwMTYwNjIsCisweEIyNTc4QjAzLCAweEEwMDMwMDA5LCAweEQyNDkwMDA5LCAweDIyNjBFNjQwLAorMHhFMjAwRDY0OCwgMHgwMDBCNEYyNiwgMHg0RjIyMjYyMiwgMHg2MDYyRDY0MywKKzB4OEIwMTg4MDIsIDB4MDAwOUIyQTAsIDB4RTIwMEQ2NDIsIDB4MDAwQjRGMjYsCisweEQ1M0UyNjIyLCAweEUxMDBENDNFLCAweDI1MTJFNzAxLCAweDI0NzAwMDBCLAorMHhFNjA0RDIzQiwgMHgyMjYwMDAwQiwgMHhENDNCNEYyMiwgMHg0MTBCRDEzQiwKKzB4RDUzQjAwMDksIDB4NjY1MEUxRkQsIDB4MjYxOUQyM0EsIDB4MjU2MEU3MDAsCisweDAwMEI0RjI2LCAweDRGMjIyMjcwLCAweEQyMzhENTM3LCAweEQ3Mzg2MTUyLAorMHgyNTEyNjExRCwgMHhFNkZGNjQ1MiwgMHgyNTQyMjQyQiwgMHhEMjJGRDQzNSwKKzB4NDIwQjY2NkQsIDB4RDUyRTI3NjIsIDB4Njc1MEUxRkIsIDB4NEYyNjI3MTksCisweDI1NzAwMDBCLCAweEQ0MzA0RjIyLCAweDQxMEJEMTI4LCAweEQ1MjgwMDA5LAorMHg2NjUwRTdGNywgMHg0RjI2MjY3OSwgMHgyNTYwMDAwQiwgMHg5NDI1RDUyNCwKKzB4MjI0OTYyNTAsIDB4MjUyMDAwMEIsIDB4RTRCRkQ1MjEsIDB4MjI0OTYyNTAsCisweDI1MjAwMDBCLCAweEQyMjU0RjIyLCAweDYwMEQ4NTIyLCAweDg5MTEyMDA4LAorMHg4OTQ1ODgwMSwgMHg4OTQ3ODgwMywgMHg4OTQ5ODgwNSwgMHg4OTRGODgwNiwKKzB4ODk1NTg4MDgsIDB4ODk1Qjg4MDksIDB4ODk2MTg4MEEsIDB4ODk2Nzg4MEIsCisweDAwMDlBMDZFLCAweDAwMDlCMDcwLCAweDYwMENBMDZCLCAweDAwMDBGRjdGLAorMHgwMDFFMjE0OCwgMHgwMDFFMTAwMCwgMHgwMDFFMTEwOCwgMHgwMDIwMzlCQywKKzB4MDAyMDM5QkUsIDB4MDAyMDM5REQsIDB4MDAyMDM5QTAsIDB4MDAxRTEwM0YsCisweDAwMUUxMDVGLCAweDAwMUUxMDJGLCAweDAwMUUxMDkwLCAweDAwMjAzOUM0LAorMHgwMDFFMTAwQiwgMHgwMDIwMzlDMCwgMHgwMDIwM0FGNCwgMHgwMDIwMThBMiwKKzB4MDAxRTEwMjgsIDB4MDAyMDM5REMsIDB4MDAxRDQwMjAsIDB4OTg3NjAwMDAsCisweDAwMUMxMDAwLCAweDAwMjAzQjAwLCAweDAwMjAzQjEwLCAweDAwMjAzOTk0LAorMHgwMDA5QjA0QywgMHg2MDBDQTAzNSwgMHgwMDA5QjA1NSwgMHg2MDBDQTAzMSwKKzB4NjI2MEQ2ODQsIDB4OEIyQjIyMjgsIDB4MDAwOUIwNjEsIDB4NjAwQ0EwMjksCisweDYyNjBENjgwLCAweDhCMjMyMjI4LCAweDAwMDlCMDY5LCAweDYwMENBMDIxLAorMHg2MjYwRDY3QywgMHg4QjFCMjIyOCwgMHgwMDA5QjBDNywgMHg2MDBDQTAxOSwKKzB4NjI2MEQ2NzgsIDB4OEIxMzIyMjgsIDB4MDAwOUIwQ0QsIDB4NjAwQ0EwMTEsCisweDYyNjBENjc0LCAweDhCMEIyMjI4LCAweDAwMDlCMTI1LCAweDYwMENBMDA5LAorMHg2MjYwRDY3MCwgMHg4QjAzMjIyOCwgMHgwMDA5QjEzRCwgMHg2MDBDQTAwMSwKKzB4NEYyNkUwMDAsIDB4MDAwOTAwMEIsIDB4RDI2Q0QxNkIsIDB4RDU2Qzg0MTIsCisweDQwMDBDOTBGLCAweEQ3NkIwMTJELCAweEU0MDNENjZCLCAweEUyMEY2MTFDLAorMHgyNTQwRTAwMSwgMHgyNTIwMjcxMiwgMHgyNjAyMDAwQiwgMHhFNjAxRDI2MiwKKzB4MzA2Njg1MjMsIDB4RTAwMDhEMDUsIDB4RDY2M0QyNjAsIDB4RTAwMTgxMjIsCisweDAwMEIyNjAyLCAweEQyNUMwMDA5LCAweDYwMEQ4NTIzLCAweDg5MDUyMDA4LAorMHg4QjBBODgwMSwgMHg2MDYwRDY1RCwgMHgyNjAwQ0IwMSwgMHhENDU3RDY1QSwKKzB4RTAwMUUxMDEsIDB4MDAwQjI2MTIsIDB4MDAwQjgxNDIsIDB4RDE1MkUwMDAsCisweDg1MTNFNTAxLCAweDY0MEQ0NTE4LCAweDY2MDMzNDUzLCAweEUwMDA4RDA1LAorMHhENTUxRDI1MywgMHgyMjYwRTAwMSwgMHgwMDBCMjUwMiwgMHg0RjIyMDAwOSwKKzB4ODUxM0QxNDksIDB4NjQ1MzY1MEQsIDB4NjI0OTQ0MTksIDB4MjI3RDY3MkUsCisweDg4MDE2MDJDLCAweDg4MDI4OTA5LCAweDg4MDM4OTEwLCAweDg4MDY4OTFBLAorMHg4ODA3ODkzNSwgMHhBMDRDODkzQiwgMHhENTQ2MDAwOSwgMHg2NjUyRDc0NiwKKzB4Mjc2MkQ0NDYsIDB4NjIyQzYyNjEsIDB4MjQyMUEwMzgsIDB4MjIyODYyNUMsCisweEQ0NDM4QjNGLCAweDY2NDJENTQwLCAweDI1NjJENDQwLCAweDI0MDE4NTYxLAorMHg2MjAzQTAyQywgMHgyMDA4NjA1QywgMHg4ODEwODkwNywgMHg4ODIwODkwOCwKKzB4ODgzMDg5MDksIDB4QTAyQzg5MEEsIDB4RDIzQTAwMDksIDB4NjIyMkEwMDgsCisweEEwMDVEMjM5LCAweEQyMzk2MjIyLCAweDYyMjJBMDAyLCAweDYyNjJENjM4LAorMHhENDMyRDUzMSwgMHg2NjIxMjUyMiwgMHhBMDBGNjI2QywgMHhENjM1MjQyMSwKKzB4NjI2MUQ1MkQsIDB4NjIyQ0Q0MkQsIDB4QTAwNzI1NjIsIDB4RDYzMjI0MjEsCisweDg1NjFENTI5LCAweDI1NjJENDI5LCAweDYyMDMyNDAxLCAweDY2MkQ4NTE1LAorMHgzNjE3NjEwRCwgMHg2NTAzOEYwMSwgMHhCMENCMjQ1MSwgMHhBMDAxMDAwOSwKKzB4RTAwMEUwMDEsIDB4MDAwQjRGMjYsIDB4RDYxOTAwMDksIDB4RDQyN0UxMDEsCisweDY1NDEyNjEwLCAweEQxMThENzE3LCAweEUyMEY2NTVELCAweDI3NTJFMDAxLAorMHgwMDBCMjYyMCwgMHgyRkU2MjEwMiwgMHhEMjBGNEYyMiwgMHg2NDBDODUyMywKKzB4OEIwODI0NDgsIDB4RDUxMUQ2MUQsIDB4MjYyMUUyMDAsIDB4OTQwRjg0NTEsCisweEEwNDgyMDQ5LCAweERFMEQ4MDUxLCAweEM4NDA2MEUwLCAweEUyMDE4RDMyLAorMHg4OTQ0MzQyNywgMHhEMjE2RDYxNSwgMHgyNjQxNDIwQiwgMHgwMDA5QTAzMCwKKzB4MDAwMEZGN0YsIDB4MDAyMDM5REQsIDB4MDAyMDM5OTQsIDB4MDAyMDM5QTAsCisweDAwMUUxMTAwLCAweDAwMUUxMDBDLCAweDAwMjAzOUMwLCAweDAwMUUxMDAwLAorMHgwMDFFMTAwMSwgMHgwMDIwMzlDOCwgMHgwMDIwMzlBOCwgMHgwMDIwMzlBQywKKzB4MDAyMDM5QjAsIDB4MDAyMDM5Q0MsIDB4MDAyMDM5RDAsIDB4MDAyMDM5RDQsCisweDAwMjAzOUQ4LCAweDAwMjAzREZDLCAweDAwMjAzRTA2LCAweDAwMjAzOUJBLAorMHgwMDIwMjg3RSwgMHg4OTEyMzQyNywgMHhEMjk0RDY5MywgMHgyNjQxNDIwQiwKKzB4Q0I4MDg0RTEsIDB4ODBFMUIwRjUsIDB4RDY5MTYwRTAsIDB4MkUwMENCMDQsCisweEM5M0Y2MDYwLCAweEQ2OEYyNjAwLCAweEEwMDFFMDAxLCAweEUwMDAyNjAyLAorMHgwMDBCNEYyNiwgMHhENjhDNkVGNiwgMHhDODgwNjA2MCwgMHhEMjg2ODkxOSwKKzB4ODgwMTYwMjEsIDB4RDI4OThCMTUsIDB4ODUyNEU1MDEsIDB4ODkxMDMwNTYsCisweEUyMDNEMTg3LCAweDIxMjBENDg3LCAweEUwMEI2NTQxLCAweDA2NTY2NTVELAorMHhFNDBGRDU4NSwgMHgyMTQwRTcwMiwgMHhENzdFMjU3MSwgMHgwMDBCRTAwMSwKKzB4MDAwQjI3MDIsIDB4MkZFNkUwMDAsIDB4REU4MDRGMjIsIDB4Qzg4MDg0RTEsCisweEQ1N0E4OTJDLCAweDIwMDg4NTU0LCAweDYxMDM4RjI4LCAweDg1NTNENzdDLAorMHg2NDAzNjY3MiwgMHg4NTY2NjUwQywgMHgzNTIwNjIwQywgMHhENjc5OEIxRSwKKzB4NjUxQ0Q3NzQsIDB4MjY1MTY0NEMsIDB4NjBFMDI3NDEsIDB4ODkwNEM4NDAsCisweDQyMEJEMjc1LCAweEEwMDMwMDA5LCAweEQyNjgwMDA5LCAweDAwMDk0MjBCLAorMHgwMDA5QjA5RiwgMHhFMjAxRDE2NywgMHg2MEUwMjEyMiwgMHhDQjA0RDQ2NCwKKzB4NjA0MDJFMDAsIDB4MjQwMEM5M0YsIDB4NjAyM0EwMDEsIDB4NEYyNkUwMDAsCisweDZFRjYwMDBCLCAweDJGQjYyRkE2LCAweDJGRDYyRkM2LCAweERBNjIyRkU2LAorMHg2NkExRTI0MCwgMHgzNjIyREM1RSwgMHg2MjYzODkwMCwgMHg2RUQzNkQyQywKKzB4NEUyMTM2RDgsIDB4NEUyMTJBNjEsIDB4REI2MUQ0NjAsIDB4RTcwMEEwMEYsCisweDc3MDE2MkIyLCAweDcxMDI2MTIzLCAweDY2MjEyQjEyLCAweDcxMDI2MjEzLAorMHg2MTIxMkIxMiwgMHg2NTFENjY2RCwgMHgzNTZDNDUyOCwgMHg2MjdDMjQ1MiwKKzB4OEJFRDMyRTMsIDB4QzkwMzYwRDMsIDB4OEIxMDg4MDMsIDB4NjE3MzY3QjIsCisweDJCMTI3MTAyLCAweDcxMDI2RTEzLCAweDJCMTI2NTcxLCAweDY1NUQ2REUxLAorMHg0MjI4NjJERCwgMHgzMjVDRTEwNywgMHhBMDBDMkMxMCwgMHg4ODAyMjQyMiwKKzB4QTAwMzhCMDEsIDB4ODgwMUUyMDMsIDB4RTIwMThCMDUsIDB4NjZCMjJDMjAsCisweDY1NUQ2NTYxLCAweEU2MEYyNDUyLCAweDY3QTEyQzYwLCAweDhCMDUyNzc4LAorMHhERDM4REM0NCwgMHhFQjAxRUEwMCwgMHgyREIyMkNBMiwgMHg2REY2NkVGNiwKKzB4NkJGNjZDRjYsIDB4NkFGNjAwMEIsIDB4MkZFNjJGRDYsIDB4RTI0MEREMzYsCisweDM2MjI2NkQxLCAweDYyNjM4OTAwLCAweDM2Nzg2NzJDLCAweDc3MDNERTM4LAorMHg0NzIxMkQ2MSwgMHg2NEUyRDYzNSwgMHhBMDBFNDcyMSwgMHg2NTYyRTEwMCwKKzB4NjI1MzcxMDEsIDB4NzQwMTI0NTAsIDB4MjQyMDQyMTksIDB4NDUyOTc0MDEsCisweDc0MDEyNDUwLCAweDI0NTA0NTE5LCAweDYyMUM3NDAxLCAweDhCRUUzMjczLAorMHg2NkUyNDIwMCwgMHg0MjAwNjFEMSwgMHgyMTE4MzYyQywgMHgyRTYyOEYwNiwKKzB4REQxQ0Q3MjgsIDB4RTUwMUU0MDAsIDB4MkQ1MjI3NDIsIDB4MDAwQjZFRjYsCisweDJGRDY2REY2LCAweDRGMjIyRkU2LCAweEVEMEFFRTAxLCAweDY0RTNCQzg1LAorMHhCQzhBNjRFMywgMHg2MkVDN0UwMSwgMHg4QkY3MzJENywgMHhCQzhERUUwMSwKKzB4NjRFMzY0RTMsIDB4N0UwMUJDOTIsIDB4MzJENzYyRUMsIDB4NEYyNjhCRjcsCisweDAwMEI2RUY2LCAweEQxMTg2REY2LCAweEQ0MTg5MjBELCAweDcyMTIyMTIyLAorMHgyNDIyRDYxNywgMHhENzE3NzIwNCwgMHg3MjIwMjYyMiwgMHgyNzIyRDExNiwKKzB4MDAwQjcyMzAsIDB4MTM3QTIxMjIsIDB4MDAyMDM5QkEsIDB4MDAyMDI5OEEsCisweDAwMUUxMDE1LCAweDAwMjAzOUMwLCAweDAwMUUxMDAxLCAweDAwMjAzOTk0LAorMHgwMDFFMTEwMCwgMHgwMDIwMzlCRSwgMHgwMDIwMzlBQywgMHgwMDFFMTAwMCwKKzB4MDAyMDM5QjAsIDB4MDAyMDM5QkMsIDB4MDAyMDI4N0UsIDB4MDAxRTEwMEMsCisweDAwMjAzOUE4LCAweDAwMjAzOUM0LCAweDAwMjAzOUM4LCAweDAwMjAzOUNDLAorMHgwMDIwMzlEMCwgMHgwMDIwMzlENCwgMHgwMDIwMzlEOCwgMHg0RjIyMkZFNiwKKzB4RDY3MDdGRkMsIDB4ODgwMTYwNjAsIDB4RTIwMTg5NTEsIDB4MjYyMEJGQkIsCisweEQ1NkVEMTZELCAweERFNkU2MDEwLCAweDY0RTM2NTUyLCAweDc0MDJDODQwLAorMHg4RDIyRDE2QywgMHhEMjZDNzUwMiwgMHhFNjAxRDc2QywgMHhFNzA0MjcyMiwKKzB4NzYwMTYyNTUsIDB4NjI2QzI0MjEsIDB4OEZGOTMyNzMsIDB4RDQ2Mzc0MDIsCisweDYyNDJFNjAxLCAweDY0MEQ4NTI4LCAweDY3NDk0NDE5LCAweDI3NUQ2NTdFLAorMHg4MUU0NjA3QywgMHhFNDE3RDU2MiwgMHg2NzU1NzYwMSwgMHgzMjQzNjI2QywKKzB4OEZGOTIxNzEsIDB4QTAyMDcxMDIsIDB4RDI1RTAwMDksIDB4RTYwMUQ3NUIsCisweEU3MDQyNzIyLCAweDc2MDE2MjU1LCAweDYyNkMyNDIxLCAweDhGRjkzMjczLAorMHhENDUyNzQwMiwgMHg2MjQyRTYwMSwgMHg2NDBEODUyOCwgMHg2NzQ5NDQxOSwKKzB4Mjc1RDY1N0UsIDB4ODFFNDYwN0MsIDB4RTQxN0Q1NTMsIDB4Njc1NTc2MDEsCisweDMyNDM2MjZDLCAweDhGRjkyMTcxLCAweDkyODk3MTAyLCAweEQyNDYyRTIxLAorMHg1RTIzRDc0RSwgMHg2NEYyMkZFMiwgMHg2MDQzNjVGMiwgMHgyNzAwQzk4MCwKKzB4Qzk2MDYwNDMsIDB4ODA3MTYxMDMsIDB4QzkwMzYwNDMsIDB4ODA3MjQ1MTksCisweDY1RjI2MDVDLCAweDgxNzI2NkYyLCAweDQ2MTk0NjI5LCAweDYwNkM0NTI5LAorMHg0MDE4NjQ1QywgMHg4MTczMzA0QywgMHgyMTE4NUUyMywgMHg2NEYyMkZFMiwKKzB4NkU0QzYyRjIsIDB4NjAyQzQyMTksIDB4NjZGMjYyRjIsIDB4NDYyOTQwMTgsCisweDQ2MTkzMEVDLCAweDQyMjk4MTc0LCAweDY1MkM2MDZDLCAweDMwNUM0MDE4LAorMHg4MTc1OEYwNywgMHgwMDA5QkM5NiwgMHgyMjI4NjIwQywgMHhBMDBBODkwOCwKKzB4NjAxMzAwMDksIDB4OEIwMzg4NDAsIDB4MDAwOUIwMDksIDB4MDAwOUEwMDMsCisweEUyMDJENjJGLCAweDdGMDQyNjIyLCAweDAwMEI0RjI2LCAweDRGMjI2RUY2LAorMHg4NTUyRDUyQSwgMHg4ODMwNjAwRCwgMHg4ODMxODkwMywgMHhBMDM0ODkyMywKKzB4ODU1NTAwMDksIDB4RDQyOEQ3MjcsIDB4ODU1MzI3MDEsIDB4NjEwREQ2MjcsCisweDI0MTI0MTE4LCAweDQ2MEJENDI2LCAweEQ3MjMwMDA5LCAweEQyMjZENDI1LAorMHg2NTcyNDIwQiwgMHhFMjMwRDEyMCwgMHg0MjI4NjcxMiwgMHgyNzI5RTYyMCwKKzB4Mzc2MDQ2MjgsIDB4RDYyMThCMDMsIDB4QTAxNkUyMDAsIDB4RDYxRjI2MjIsCisweEEwMTJFMjAyLCAweEQxMTgyNjIyLCAweDYyMTJFNTMwLCAweEU2MjA0NTI4LAorMHg0NjI4MjI1OSwgMHg4OTA4MzI2MCwgMHhENDFBRDExOSwgMHhFNjAxRDUxMywKKzB4MjE2MDQ1MEIsIDB4NDcyQkQ3MTgsIDB4NEYyNjRGMjYsIDB4MDAwOTAwMEIsCisweDAwMDAwNjBBLCAweDAwMjAzOURDLCAweDAwMUUxMDAwLCAweDAwMjAzOUM4LAorMHgwMDIwM0RGQywgMHgwMDIwM0UwOCwgMHgwMDIwM0RBMCwgMHgwMDIwMzlCMCwKKzB4MDAyMDNERDAsIDB4MDAyMDNEQ0UsIDB4MDAyMDNEQTIsIDB4MDAyMDM5OTQsCisweDAwMjAzOUMwLCAweDAwMjAzOUFDLCAweDAwMjAzOUE4LCAweDAwMjAxOEEyLAorMHgwMDIwM0IxQywgMHgwMDIwM0IyMCwgMHgwMDIwMThFRSwgMHgwMDIwMzlDNCwKKzB4MDAxRTEwMEIsIDB4MDAyMDNCMzQsIDB4MDAxMTQwMDQsIDB4NEYyMjJGRTYsCisweERFOTY3RkZDLCAweDIwMDg4NEU5LCAweDJGMDA4RDA2LCAweEQ2OTVENDk0LAorMHgwMDA5NDYwQiwgMHg2NEYwQjE5QSwgMHg2NjIwRDI5MywgMHg4OTAyMjY2OCwKKzB4QzlCRjYwRTAsIDB4N0YwNDJFMDAsIDB4MDAwQjRGMjYsIDB4MDAwQjZFRjYsCisweDJGRTYwMDA5LCAweERFOEQ0RjIyLCAweDYwRTBENjhELCAweENCQzBENDhELAorMHg2MjYwMkUwMCwgMHhDODAzNjAyQywgMHg0MDIxODkwNCwgMHg3MDAxNDAyMSwKKzB4NjYwM0EwMDIsIDB4NjYwMzQwMDksIDB4RDY4NzYxNkQsIDB4RTUwMEEwMDQsCisweDc1MDE2MjYyLCAweDc0MDQyNDIyLCAweDMyMTM2MjVELCAweEQyODM4QkY4LAorMHgwMDA5NDIwQiwgMHhDOUJGODRFMiwgMHg0RjI2ODBFMiwgMHg2RUY2MDAwQiwKKzB4MkZFNjJGRDYsIDB4N0ZGQzRGMjIsIDB4NjI2MEQ2N0QsIDB4ODk0NDIyMjgsCisweEQ1NzJFMTAwLCAweDYwNTAyNjEwLCAweENCNDBENDdBLCAweDI1MDA0NDBCLAorMHg4RDA1MjAwOCwgMHg2MkUwNkUwMywgMHg3MTA0NjEyQywgMHgyRjExQTAwNiwKKzB4RDQ3NUQ2NkQsIDB4REQ3NTY3NjAsIDB4NjU3QzREMEIsIDB4RTIzQzZEMUQsCisweDhCMDMzRDI3LCAweEQyNjdENDcyLCAweDAwMDk0MjBCLCAweDREMjE0RDIxLAorMHhBMDA1RDc3MCwgMHg2NkU2RTQwMCwgMHgzNTdDNDUwOCwgMHg3NDAxMjU2MiwKKzB4MzVEMzY1NEQsIDB4RDc2QzhCRjcsIDB4NjE3MkUwMDMsIDB4ODExMTQwMTgsCisweDZFNzI2MEYxLCAweDgxRTI3MDBDLCAweEQ0Njg2MTcyLCAweERENjg4MTEzLAorMHg0RDBCREU2OCwgMHhFMjAxNjU3MiwgMHhENDY3MkUyMiwgMHg0MjBCRDI1NSwKKzB4RDY1NjAwMDksIDB4QzkzRjYwNjAsIDB4N0YwNDI2MDAsIDB4NkVGNjRGMjYsCisweDZERjYwMDBCLCAweDJGQzYyRkI2LCAweDJGRTYyRkQ2LCAweEQyNUY0RjIyLAorMHg2QjQzNkU3MywgMHg0MjBCNkM1MywgMHgyMDA4NkQ2MywgMHg2NDAzOEQxQywKKzB4RTUwRUQxNDksIDB4MzI1MjYyMTAsIDB4NjBDMzg5MTYsIDB4ODA0MTI0QjAsCisweDgxNDE2MEQzLCAweEEwMDdFNTAwLCAweDY1NUQ2MUJDLCAweDAwRUM2MDUzLAorMHgzNjRDNjY1MywgMHg4MDY0NzUwMSwgMHgzMjEzNjI1RCwgMHhENjNCOEJGNSwKKzB4QzlCRjYwNjAsIDB4MjYwMEEwMDgsIDB4RDIzQUQ0NEQsIDB4NkVGNjRGMjYsCisweDZDRjY2REY2LCAweDZCRjY0MjJCLCAweDZFRjY0RjI2LCAweDZDRjY2REY2LAorMHg2QkY2MDAwQiwgMHg3RkM0NEYyMiwgMHg3MjAyNjJGMywgMHgyMjUxMkY0MSwKKzB4NDUyOTcyMDIsIDB4NjA2MzIyNTEsIDB4RTVDNEU2ODIsIDB4NjdGMzgxMjEsCisweDY1NUM2NjZDLCAweEU0MDhCRkI2LCAweDRGMjY3RjNDLCAweDAwMDkwMDBCLAorMHgyRjk2MkY4NiwgMHgyRkI2MkZBNiwgMHgyRkQ2MkZDNiwgMHg0RjIyMkZFNiwKKzB4RTEwMDdGQzQsIDB4NjUxM0VDRkYsIDB4NkIxMzZDQ0QsIDB4REUzNkQ3MzUsCisweEVERkY2NEYzLCAweEQ4MzVFQTA0LCAweDYwNTM2NTVDLCAweDAyN0Q0MDAwLAorMHgzMkMwNjIyRCwgMHg2NjAzOEQwRCwgMHgwOUVENjA2MywgMHgyNDkxMDI3RCwKKzB4MjQyMTc0MDIsIDB4Njk4MjAyRUQsIDB4MzkyODYyMkQsIDB4NzQwMjI4OTIsCisweDc1MDE3MTA0LCAweDYwNjM2MjVDLCAweDA3RDUzMkEyLCAweDBFQjU4RkU0LAorMHgyNDQ4NjQxQywgMHhFNjgwODkwNSwgMHg2N0YzRTVDNSwgMHhCRjc5NjY2QywKKzB4N0YzQzY1NUMsIDB4NkVGNjRGMjYsIDB4NkNGNjZERjYsIDB4NkFGNjZCRjYsCisweDAwMEI2OUY2LCAweEQxMUU2OEY2LCAweDYwMTJEMjFFLCAweENCMjBFNDA1LAorMHgyMTAyRTUwMCwgMHgwMDBCMjI0MiwgMHgwMDAwMjI1MiwgMHgwMDFFMTAxNywKKzB4MDAyMDNCMzgsIDB4MDAyMDE4QTIsIDB4MDAyMDM5MDYsIDB4MDAxRTEwMTUsCisweDAwMUUxMEJGLCAweDAwMTE3ODAwLCAweDAwMUUxMEZDLCAweDAwMjAwNjEwLAorMHgwMDIwMzkwQywgMHgwMDIwMkFFMiwgMHgwMDIwM0IzQywgMHgwMDIwMThFRSwKKzB4MDAyMDNCNTgsIDB4MDAxMTc4OEMsIDB4MDAyMDM5MDgsIDB4MDAyMDM0RUMsCisweDAwMjAxNTMwLCAweDAwMUUyMTMwLCAweDAwMjAzQjYwLCAweDAwMjAyQUE0LAorMHgwMDIwM0I2NCwgMHgwMDIwMzk2QywgMHgwMDIwMzk3NCwgMHgwMDIwM0Q5QywKKzB4MDAxQzM1MDAsIDB4MDAxRDQwMDQsIDB4RDU2NEQxNjMsIDB4RTQwMEQ3NjQsCisweDIxNDJFMjBGLCAweDE3NDExMTU0LCAweEQ1NjIyNzIyLCAweDk2NjlENzYyLAorMHgxNTQxMjU3MiwgMHg5NjY2MTU2MiwgMHhFNjAxMTU2NSwgMHhENTVGMTE2NSwKKzB4NjY2Q0U2RjgsIDB4MjU0MjI1NDIsIDB4MjU0MjI1NDIsIDB4MjU0MjI1NDIsCisweDI1NjIyNTQyLCAweDc2MDFFNzI3LCAweDY3NjMyNTcyLCAweDI1NjI3Nzk3LAorMHhFNzA0MjU3MiwgMHgyNTcyRTI0OCwgMHhFMjE5MjUyMiwgMHhFMjcwMjUyMiwKKzB4MjU0MjI1NDIsIDB4MjU0MjI1NDIsIDB4MjUyMjI1NDIsIDB4MjUyMkUyMEMsCisweDI1NDIyNTQyLCAweDI1NDIyNTQyLCAweDI1NDIyNTQyLCAweDI1NDIyNTQyLAorMHgwMDBCMTU0QSwgMHhFMjA4MTE0NSwgMHgwMDA5NDIyQiwgMHgyRkU2MkZENiwKKzB4N0ZGQzRGMjIsIDB4QzgyMDYwNDMsIDB4NkU0MzhEMDIsIDB4MDAwOUJFNjcsCisweEM4MTA2MEUzLCAweEJFNjQ4OTAxLCAweDYwRTMwMDA5LCAweDg5MDFDODQwLAorMHgwMDA5QkU4NiwgMHhDODAxNjBFMywgMHhERDNEODkzOCwgMHhDODAyNjBEMCwKKzB4MkYwMDhEMDMsIDB4NDYwQkQ2M0IsIDB4NjBGMDAwMDksIDB4ODkwMkM4MDQsCisweDQ2MEJENjM5LCAweDYyRjAwMDA5LCAweEM4ODA2MDIzLCAweDYwRDA4OTAyLAorMHgyRDAwQzk3RiwgMHhDODAxNjAyMywgMHhENjM0ODkwNiwgMHgwMDA5NDYwQiwKKzB4MDAwOUEwMDcsIDB4NTE2MzA2MDEsIDB4ODkwMkM4MDgsIDB4NDYwQkQ2MzAsCisweDYwRjAwMDA5LCAweDg5MDJDODEwLCAweDQyMEJEMjJFLCAweEQ1MkUwMDA5LAorMHg4ODAyNjA1MiwgMHhEMjJEOEIwMywgMHhBMDA1RTYwNCwgMHg4ODAxMjI2MCwKKzB4RDIyQThCMDIsIDB4MjI2MEU2MDEsIDB4MjUyMkUyMDAsIDB4Qzg4MDYwRTMsCisweEQyMjc4OTJELCAweDYwRTM2RTIwLCAweDg5MDJDODgwLCAweDQyMEJEMjI1LAorMHg2MEUzMDAwOSwgMHg4OTAyQzg0MCwgMHg0MjBCRDIyMywgMHg2MEUzMDAwOSwKKzB4ODkwMkM4MDIsIDB4NDIwQkQyMjEsIDB4NjBFMzAwMDksIDB4ODkwREM4MDQsCisweEREMjBEMTFGLCAweDAwMDk0MTBCLCAweDAwMDlCRjBELCAweDAwMDlCRjRDLAorMHhENTFFRDQxRCwgMHgyNDcwRTcwOCwgMHgyNUQyQkY4NSwgMHhDODA4NjBFMywKKzB4RDIxQjg5MDUsIDB4NEYyNjdGMDQsIDB4NDIyQjZFRjYsIDB4N0YwNDZERjYsCisweDZFRjY0RjI2LCAweDZERjYwMDBCLCAweDAwMUM1ODFDLCAweEEwMDBBMDAwLAorMHgwMDFEMDEwMCwgMHgwMDFENDAwMCwgMHgwMDA0MDAyMSwgMHgwMDFDNTg5QywKKzB4MDAxRTEwMjEsIDB4MDAyMDFBODgsIDB4MDAyMDFBQUEsIDB4MDAyMDIxMEMsCisweDAwMjAxQUMyLCAweDAwMjAxQUQwLCAweDAwMjAzOUMwLCAweDAwMUUxMDBCLAorMHgwMDFFMTAyOCwgMHgwMDIwMUIzQywgMHgwMDIwMUI0OCwgMHgwMDIwMUFEOCwKKzB4MDAyMDFBRjYsIDB4MTIzNDU2NzgsIDB4MDAxRTEwMDAsIDB4MDAxMEYxMDAsCisweDAwMjAxQjI0LCAweDY0NENENkE3LCAweDAwMEIzNDZDLCAweEQ2QTYyNDUwLAorMHgzNDZDNjQ0QywgMHgyNDUwMDAwQiwgMHg2NDRDRDZBNCwgMHgwMDBCMzQ2QywKKzB4NjI1QzI0NTAsIDB4NDIwODYxNkQsIDB4NDIwODQxMTksIDB4NDIwMDYwMTksCisweDY3MEU2MTRDLCAweEQ0OUUzMjFDLCAweDQyMDAyMDdELCAweDMyNENDOTBGLAorMHgyMjAwMDAwQiwgMHg0MjA4NjI1QywgMHg0MjAwNDIwOCwgMHgzMjRDNjQ0QywKKzB4NDIwMEQ0OTgsIDB4MDAwQjMyNEMsIDB4MkZFNjIyNjAsIDB4NjE0QzRGMTIsCisweDQxMDBENDkzLCAweDY3MTAzMTRDLCAweEUyOUY2NjZELCAweDI3Mjk0NjE5LAorMHg2RTUzNjI2OSwgMHg2NzJFNjU3MywgMHg0MjIxMjI3RCwgMHg0MjIxNDIyMSwKKzB4NzYwMTY2MkMsIDB4RTQwMTQ2MDgsIDB4MzRFODQ2MDgsIDB4NjQ0QzQ2MDAsCisweDA3MUEwNDY3LCAweDIxNTAyNTdCLCAweDAwMEI0RjE2LCAweDRGMjI2RUY2LAorMHhEMjg1N0ZFOCwgMHg4ODAxNjAyMSwgMHhEMjg0OEI3QiwgMHgyNjY4NjYyMSwKKzB4RDI4MzhCNzcsIDB4MjY2ODY2MjEsIDB4RTUwRjhCNzMsIDB4RTQwMUJGQTIsCisweEJGQTRFNTAxLCAweEU1ODZFNDAwLCAweEU0MDA2NTVDLCAweDJGNTBCRkE0LAorMHhCRkExRTQwMSwgMHhFNjAyRTUwNiwgMHg2MDYzNDYxOCwgMHg4MUYyRTQwMSwKKzB4NjU0M0JGOUYsIDB4RTQwMTg1RjIsIDB4QkZBQjY1NDMsIDB4ODVGMjY2MDMsCisweDY1NDNFNDAxLCAweDY2MDNCRkIxLCAweEU0MDI2NUYwLCAweDYwNTM3NTZDLAorMHg4MEY4QkY4MCwgMHhCRjgyRTQwMiwgMHg4NEY4RTUxMiwgMHg3MDkwRTQwMiwKKzB4NjUwM0JGODIsIDB4NDYxOEU2MDIsIDB4ODFGNjYwNjMsIDB4QkY4MEU0MDIsCisweDg1RjZFNTAwLCAweDY2MDNFNDAyLCAweEU1MDBCRjhDLCAweEU0MDI4NUY2LAorMHhCRjkyNjYwMywgMHhFNUZFRTUwMCwgMHhFMDEwNjU1QywgMHhCRjYxRTQwMywKKzB4RTUxMzBGNTQsIDB4RTQwRUJGNjMsIDB4MDVGQ0UwMTAsIDB4QkY2M0U0MEUsCisweEU1MDA3NTg1LCAweEJGNjRFNDAzLCAweEU1MDBFNjQwLCAweEJGNzFFNDAzLAorMHhFNTAwRTY0MCwgMHhCRjc4RTQwMywgMHhFNUZGRTY0MCwgMHhFMDE0NjU1QywKKzB4QkY0N0U0MDQsIDB4RTQwRjBGNTQsIDB4RTUwNEJGNDksIDB4MDVGQ0UwMTQsCisweEJGNDlFNDBGLCAweEU1MDE3NTg0LCAweEJGNEFFNjQwLCAweEU1MDFFNDA0LAorMHhCRjU3RTY0MCwgMHhFNTAxRTQwNCwgMHhFNDA0RTY0MCwgMHhBRjVDN0YxOCwKKzB4N0YxODRGMjYsIDB4MDAwQjRGMjYsIDB4NEYyMjAwMDksIDB4RDI0MjdGRjAsCisweDg4MDE2MDIxLCAweEQyNDE4QjcxLCAweDI2Njg2NjIxLCAweEQyNDA4QjZELAorMHgyNjY4NjYyMSwgMHhFNTBGOEI2OSwgMHhFNDAxQkYxQywgMHhCRjFFRTUwMSwKKzB4RTU4NkU0MDAsIDB4RTQwMDY1NUMsIDB4MkY1MEJGMUUsIDB4QkYxQkU0MDEsCisweEU0MDFFNTA2LCAweEJGMUM2NTQzLCAweEU0MDFFNjQwLCAweEJGMjk2NTQzLAorMHhFNDAxRTY0MCwgMHhCRjMwNjU0MywgMHg2NUYwRTY0MCwgMHg3NTZDRTQwMiwKKzB4QkVGRjYwNTMsIDB4RTQwMjgwRjQsIDB4RTUxMkJGMDEsIDB4RTQwMjg0RjQsCisweEJGMDE3MDkwLCAweEU2NDA2NTAzLCAweEJGMDJFNDAyLCAweEU2NDBFNTAwLAorMHhCRjBGRTQwMiwgMHhFNjQwRTUwMCwgMHhCRjE2RTQwMiwgMHhFNUZFRTUwMCwKKzB4NjA1MzY1NUMsIDB4QkVFNUU0MDMsIDB4RTUxMzgwRjgsIDB4RTQwRUJFRTcsCisweEU0MEU4NEY4LCAweEJFRTc3MDg1LCAweEU1MDA2NTAzLCAweEJFRThFNjQwLAorMHhFNTAwRTQwMywgMHhCRUY1RTY0MCwgMHhFNTAwRTQwMywgMHhCRUZDRTY0MCwKKzB4RTVGRkU0MDMsIDB4NjA1MzY1NUMsIDB4QkVDQkU0MDQsIDB4RTQwRjgwRkMsCisweEU1MDRCRUNELCAweEU0MEY4NEZDLCAweEJFQ0Q3MDgzLCAweEU1MDE2NTAzLAorMHhCRUNFRTY0MCwgMHhFNTAxRTQwNCwgMHhCRURCRTY0MCwgMHhFNTAxRTQwNCwKKzB4RTQwNEU2NDAsIDB4QUVFMDdGMTAsIDB4N0YxMDRGMjYsIDB4MDAwQjRGMjYsCisweDAwMDAwMDA5LCAweDAwMUUxMDJGLCAweDAwMUUxMDgwLCAweDAwMUUxMDkwLAorMHgwMDFFMTAzRiwgMHgwMDFFMTAzRSwgMHgwMDIwMzlCQSwgMHgwMDIwMzlCQywKKzB4MDAyMDM5QkUsIDB4RDIxREQxMUMsIDB4NjYyMDYwMTAsIDB4Njc2QzcwMDEsCisweDM3MDBDOTBGLCAweEU1MDA4RDEzLCAweDY3MTA2MjEwLCAweDc3MDE2MjJDLAorMHg2NDIzMjE3MCwgMHhENjE2NjAxMCwgMHg0NDA4NDQwOCwgMHgzNDI4QzkwRiwKKzB4NjI2MDIxMDAsIDB4NzIwMUQ1MTMsIDB4NDQwODI2MjAsIDB4MDAwQjM1NEMsCisweEQxMEY2MDUzLCAweDI1NTg2NTEwLCAweEU2MDA4RDEzLCAweEQ2MERENDBCLAorMHg2NTVDNjU0MCwgMHg0NzA4Njc1MywgMHgzNzU4NDcwOCwgMHg0NzA4NjU0MCwKKzB4MjQ1MDc1MDEsIDB4MzY3QzYwNDAsIDB4MjQwMEM5MEYsIDB4NzJGRjYyMTAsCisweDAwMEIyMTIwLCAweDAwMDA2MDYzLCAweDAwMjAzOTA1LCAweDAwMjAzOTA0LAorMHgwMDIwMzkwNiwgMHgwMDIwMzUyQywgMHg3RkZDNEYyMiwgMHhFNjgwRDE5RiwKKzB4NjY2QzYyMTIsIDB4RDI5RTJGMjIsIDB4NjdGMzY1NjMsIDB4NDIwQjc1NDIsCisweDdGMDRFNDA0LCAweDAwMEI0RjI2LCAweEU2ODAwMDA5LCAweEQyOTg2NjZDLAorMHhFNzAwNjU2MywgMHg0MjJCNzU0MCwgMHhFNjgwNjQ3MywgMHhEMjk0NjY2QywKKzB4RTcwMDY1NjMsIDB4NDIyQjc1NDMsIDB4MkY4NjY0NzMsIDB4MkZBNjJGOTYsCisweDJGQzYyRkI2LCAweDJGRTYyRkQ2LCAweDdGQ0M0RjIyLCAweERDOEVEMjhELAorMHg3MjAxMUYyMSwgMHhEQjhEMUYyMiwgMHhEMThFREU4RCwgMHg2NjEyNTIxMSwKKzB4OEIwMTM2MjAsIDB4MDAwOUEwRTUsIDB4QzkwMzYwNjEsIDB4OEIwMTg4MDEsCisweDAwMDlBMERGLCAweEQyODhENDg3LCAweEVEODQ0MjBCLCAweDJGMDI1NTAzLAorMHgzMEQwODQ1QywgMHhBMEI4ODkwMSwgMHhEMTg0MDAwOSwgMHg2MjZDNjYxMCwKKzB4ODgwMTYwMjMsIDB4RDE4MjhCNjgsIDB4NjIxMDFGQzMsIDB4ODk1QjIyMjgsCisweEUwMDNENDgwLCAweDQwMTg2NzQyLCAweDY4NDIxNzcyLCAweEQ1N0VFOTAwLAorMHg4MTgxNkRCMywgMHg3RDA0MjE5MCwgMHg2N0QyNkFCMiwgMHg2NEUyNjg1MiwKKzB4MUY0OTFGNTcsIDB4NzQwNDY0RTMsIDB4MUZBNDY1NDIsIDB4NjU0MzFGNUEsCisweDYyNTI3NUY4LCAweDFGNzYxRkQ1LCAweDZENTMxRjJCLCAweERBNzRENzczLAorMHg3RDk0RDI3NCwgMHg2OEQyMUY4OCwgMHg2QUEyNjk3MiwgMHhEMTcyNjAyMiwKKzB4MjIwMkNCMjAsIDB4RTE0MDFGMUMsIDB4NzYwMUU2MDAsIDB4MzIxMzYyNkQsCisweDU2RjQ4QkZCLCAweDUyRjY1MUY1LCAweDIxMjIyQjYyLCAweDUyRjg1MUY3LAorMHgyMTIyNTZGOSwgMHgyRTYyNTFGQSwgMHg1MUZCMjQxMiwgMHgyRDgyMjUxMiwKKzB4RDk2NjI3OTIsIDB4MjlBMkRENUYsIDB4NkFEMkQ5NjUsIDB4RDk2NDY4OTIsCisweDY4RDIxQTg0LCAweDYwODFEQTYzLCAweDI4MDFDQjAxLCAweEQ4NjI2NkQyLAorMHgyQTYyMjk2MiwgMHhFRDAxNUFGQywgMHgyQUQyNDgwQiwgMHgyQUQyNEQxOCwKKzB4NjJEMkRENUUsIDB4MkQyMjcyMDEsIDB4RDE1MDU2RjMsIDB4RTIwMjYwNjIsCisweDI2MDJDQjAxLCAweDIxMjBBMDNELCAweDhCM0EyMjI4LCAweEU0MDFERDU4LAorMHgyMTQwRTYwMCwgMHhFMDFDMkQ2MiwgMHhDODAxMDA1QywgMHhENDU1OEIwQSwKKzB4RTYwMEQ3NTUsIDB4RUQ3RDI0NzIsIDB4NjI2Qzc2MDEsIDB4OEJGQjMyRDMsCisweDI0RDJERDUyLCAweEUyRkU2OEMyLCAweDJDODIyODI5LCAweDA5NUNFMDFFLAorMHhFMDFGNURGMSwgMHgwQTVDMkQ5MCwgMHg3NTEwNTFGMiwgMHhFRDA2MjFBMCwKKzB4RDc0QkU2MDAsIDB4ODQ1NkQ0NEIsIDB4MjcwMDc2MDEsIDB4Njk2QzY4NTQsCisweDI0ODAzOUQzLCAweDhGRjY3NDAxLCAweERBNDc3NzAxLCAweDJBMTBFMTk0LAorMHhFMjAwN0EwMSwgMHg3QTBGMkEyMCwgMHhEMTMwRTgwNSwgMHg2NjEwMkE4MCwKKzB4NjAyMzYyNkMsIDB4ODkwODg4MDEsIDB4RDI0MEQ0MkEsIDB4NDIwQjY1RjIsCisweEQxMzFFRDAxLCAweEFGMzA0RDE4LCAweDY1RjIyMUQyLCAweDg1NTNENDNDLAorMHg2MjBENjY0MiwgMHg4OTA3MzI2MiwgMHhEMTNCRDQzQSwgMHgwMDA5NDEwQiwKKzB4RTYwMUQ3M0EsIDB4Mjc2MkFGMUEsIDB4RDEzNEQ0MUUsIDB4NDEwQjY1RjIsCisweEQxMjVFRDAxLCAweEQ2MzdENDM2LCAweDQ2MEI0RDE4LCAweEFGMEQyMUQyLAorMHg3RjM0MDAwOSwgMHg2RUY2NEYyNiwgMHg2Q0Y2NkRGNiwgMHg2QUY2NkJGNiwKKzB4MDAwQjY5RjYsIDB4NEYyMjY4RjYsIDB4ODU0NjdGRjQsIDB4MkYwMUU2ODEsCisweDY2NkM4NTQ3LCAweDg1NDg4MUYxLCAweDgxRjJEMjA5LCAweDY3RjM4NTQyLAorMHg4NTQzODFGMywgMHg4MUY0RTQwQywgMHg2NTYzNjA1MywgMHg0MjBCODFGNSwKKzB4N0YwQzc1NDAsIDB4MDAwQjRGMjYsIDB4MDAwMDAwMDksIDB4MDAxQzNEOUMsCisweDAwMjAyNDU0LCAweDAwMTE3NzlBLCAweDAwMUMzNkY4LCAweDAwMUMzQjlDLAorMHgwMDFDMzcwNCwgMHgwMDIwMzUyNCwgMHgwMDIwMTRBMCwgMHgwMDIwMzkxNSwKKzB4MDAyMDM5MTQsIDB4MDAyMDM5MTAsIDB4MDAxQzNEOTgsIDB4MDAxQzNCQjQsCisweDAwMUM1OTYwLCAweDAwMUMzNTAwLCAweDAwMUMzRDMwLCAweDAwMUM4OTYwLAorMHgwMDIwMzRGQywgMHgwMDFDM0QwMCwgMHgwMDIwMTYwQywgMHgwMDExNzczMCwKKzB4MDAyMDM5MTgsIDB4MDAxQzU4MkMsIDB4MjAwMEEwMDAsIDB4MDAwMEEwMDAsCisweDAwMTE3NzhDLCAweDAwMTE3NzkyLCAweDAwMTE3Nzg4LCAweDAwMjAxNENDLAorMHgwMDIwMzhFQywgMHgwMDIwMzRFQywgMHgwMDIwMTUzMCwgMHgwMDFFMjEzMCwKKzB4MDAyMDNEN0MsIDB4MDAyMDE4QTIsIDB4MkY5NjJGODYsIDB4MkZCNjJGQTYsCisweDJGRDYyRkM2LCAweDRGMjIyRkU2LCAweEQxOUI3RkVDLCAweDJGMTJFMDAwLAorMHg2MTAzRDQ5QSwgMHgxRjQyODFGMiwgMHhERDlBREE5OSwgMHhENjlBNjgxMywKKzB4RTAwMTQ4MDgsIDB4NDYwQkRFOTksIDB4MzhFQzQ4MDAsIDB4NjVBMjFGMDMsCisweDM1MjA1MkExLCAweEEyM0U4QjAxLCAweDYwNTEwMDA5LCAweDg4MDFDOTAzLAorMHhBMjM4OEIwMSwgMHg1MjUzMDAwOSwgMHgzMkUwREU5MSwgMHhEOTkxOEIxMCwKKzB4NjRBMzQ5MEIsIDB4NEIwQkRCOTAsIDB4REU5MDY0MDMsIDB4RDc5MUQ2OTAsCisweEVDMDFENTkxLCAweDJFMDJFMTAwLCAweDI3MTAyNkMwLCAweDI1MDJBRkRGLAorMHhDODAxODU1MSwgMHhBMTU3OEIwMSwgMHg2MjUxMDAwOSwgMHg0MjAwNjIyRCwKKzB4NUU1MzM2NkEsIDB4ODVFMjIyNkQsIDB4QzkwMzY0MkMsIDB4ODVFMzY2MDMsCisweDYwNTM2NTBELCAweDQwMjE0MDIxLCAweDQ1MDBDOTNGLCAweDMyMkE2NzAzLAorMHg2MDUzMjUyRCwgMHhDOTAxRDE3RiwgMHg2MDEwNkMwMywgMHg4ODAxRDk3RiwKKzB4REI3RjhCMDUsIDB4MjEyMEUyMDAsIDB4Q0IwMTYwQjIsIDB4RDE3RDJCMDIsCisweDg4MDE2MDExLCAweDY1QTI4QjBBLCAweDhEMDQyNDQ4LCAweDlCOUU2MjUxLAorMHhBMDAzMjJCOSwgMHg5MTlCMjUyMSwgMHgyNTIxMjIxQiwgMHgzN0IzRUIxMCwKKzB4MjQ0ODg5NUUsIDB4RDQ3MzhCMDcsIDB4MjIyODYyNDEsIDB4NjA2Mzg5MDMsCisweEEwNTc4MUY4LCAweEQ1NzA2NDczLCAweDQ2MDg0NjA4LCAweDg1RTI2MjczLAorMHg0NjAwNkI1MCwgMHgzNjJDNDIwMCwgMHgyQkI4QzkxMCwgMHg4RjFGNjQ2MywKKzB4MjY2ODY2MDMsIDB4RDI2OTg5MTEsIDB4MDYyRDYwNDMsIDB4NDExOTYxNkQsCisweDZCMEU2MDE5LCAweDgxRjgyMEJELCAweDg4MDE2MEMzLCAweDY0NkM4RjJDLAorMHg4ODBGNjA3MywgMHhBMDI3OEIxQiwgMHhEMjYxMDAwOSwgMHgwNTJENjA0MywKKzB4NDExOTYxNUQsIDB4NjcwRTYwMTksIDB4NjQ1QzIwN0QsIDB4ODFGOEEwMUMsCisweDg5MEYyNjY4LCAweDYwNDNEMjVCLCAweDZCNUQwNTJELCAweDYwQjk0QjE5LAorMHgyMDFENjEwRSwgMHg2MEMzODFGOCwgMHg4RjBEODgwMSwgMHg2NDczNjQ1QywKKzB4RUMwMEEwMEEsIDB4NjA0M0QyNTQsIDB4NjI1RDA1MkQsIDB4NjAyOTQyMTksCisweDIwN0Q2NzBFLCAweDgxRjg2NDVDLCAweDg4MDI4NUY4LCAweDg1RTE4OTBBLAorMHg4RDA3QzgyMCwgMHhFNkRDNjIwMywgMHg2MDIzMjI2OSwgMHg4MUUxQTAwMiwKKzB4NjQ0Q0U0RkYsIDB4NjIxMEQxNDksIDB4ODkwMTIyMjgsIDB4NjQ0Q0U0RkYsCisweDY1NERFQkZGLCAweDM1QjA2QkJDLCAweERCMzY4QjJCLCAweDY0QTM0QjBCLAorMHg0MTBCRDEzNSwgMHg1NDAzNjQwMywgMHg4NTQ0NkUwMywgMHhDOTQ4REI0MCwKKzB4REM0MDg4MDgsIDB4QkVBRThCMDEsIDB4NjRCM0U1MDIsIDB4NjVFMzRDMEIsCisweERCM0RFQzAxLCAweEQxM0QyREMyLCAweDYyMTI2MEIyLCAweDcyMDE3MDAxLAorMHgyMTIyODgwNSwgMHgyQjAyOEYwOCwgMHg2NjZDRTY4MCwgMHg2NTYzRDIzOCwKKzB4NzU0OUU3MDAsIDB4NjQ3MzQyMEIsIDB4QTAzMEQ0MzYsIDB4N0ZGRjAwMDksCisweDg1RTI4MDAwLCAweDIwQjlFQkZDLCAweDYxMDM4MUUyLCAweDk0MkE4NUUzLAorMHg2MjAzMjA0OSwgMHg0NTA4ODVGOCwgMHg4MUUyMjAxQiwgMHhDOTAxNjBDMywKKzB4NDAwODQwMTgsIDB4NDAwODQwMDgsIDB4NDAwMDIyNUIsIDB4NjAyMzIyMEIsCisweDg1RTQ4MUUzLCAweDQxMThFMTA4LCAweDgxRTQyMDFCLCAweEU0MDI2MkEyLAorMHgyMEI5ODUyMSwgMHg2N0EyODEyMSwgMHhDQjAxNjA3MSwgMHg4NUY4MjcwMSwKKzB4ODkwMzMwNDIsIDB4RUNFNzg1RTIsIDB4ODFFMjIwQzksIDB4NDkwQkQ0MUUsCisweEEwM0IwMDA5LCAweDdFMDMwMDA5LCAweDAwMUMzRDMwLCAweDAwMjAzRDg4LAorMHgwMDIwMzRGQywgMHgwMDFFMjEyQywgMHgwMDIwMzNFMCwgMHgwMDFDM0QwMCwKKzB4MDAxMTc3ODAsIDB4MDAyMDE0QTAsIDB4MDAyMDE2NkMsIDB4MDAxMTc3MEMsCisweDAwMjAzOTE0LCAweDAwMjAzOTE1LCAweDAwMjAzOTEwLCAweDAwMjAxOEEyLAorMHgwMDFDMzZGOCwgMHgwMDIwMzk4OCwgMHgwMDIwM0Q5OCwgMHgwMDIwM0I3QywKKzB4MDAyMDNCRkMsIDB4MDAyMDNDN0MsIDB4MDAyMDNDRkMsIDB4MDAyMDM5MDAsCisweDAwMjAzNEY0LCAweDAwMjAxNENDLCAweDAwMjAzOThDLCAweDAwMjAzOTkwLAorMHgwMDIwMjQ1NCwgMHgwMDIwM0Q4MCwgMHgwMDIwM0Q4NCwgMHg2MDIyNjJGMiwKKzB4NDAwOTQwMTksIDB4QzkwRjQwMDksIDB4OEIwQjg4MEEsIDB4NjBFMkRFOEMsCisweDQwMDk0MDE5LCAweEM5MEY0MDA5LCAweDhCMDM4ODA4LCAweENCMDE2MEEyLAorMHgyODAyQTAwNiwgMHg2NUUyREU4NywgMHgyRTUyNzUwMSwgMHgyODYyNjZBMiwKKzB4NTJGMzY2RjIsIDB4MjYyMkFFODMsIDB4RDI4Mzg1NTEsIDB4REU4M0M4MDIsCisweEEwOTU4QjAxLCAweDQyMEIwMDA5LCAweDRFMEI2NEEzLCAweDVFMDM2NDAzLAorMHg4NUU0NjUwMywgMHg0OTE4RTkwOCwgMHhENzdEMjA5QiwgMHhFMDRDODFFNCwKKzB4REM3QzBCN0UsIDB4N0IwMUQ5N0MsIDB4NjFDMjA3QjYsIDB4NzEwMTY2OTAsCisweDhEMDYyNjY4LCAweEQ0NzkyQzEyLCAweDQyMEJEMjc5LCAweEEwNzBFQjAxLAorMHg2MjUxMkRCMiwgMHg0QjE4RUIwRiwgMHgyMkI5RTEwMiwgMHgzMjEwNDExOCwKKzB4ODU1MThCMEYsIDB4MjAyOUUyRkMsIDB4NjA1MTgxNTEsIDB4Q0IwMTcyRTAsCisweDg1RTEyNTAxLCAweDIwMjk5NEEzLCAweDg1RTQ4MUUxLCAweEEwNTIyMDQ5LAorMHg2NzUxODFFNCwgMHg0NzE5Njc3RCwgMHg2NjdFNjc3OSwgMHg3NzAxMjc2RCwKKzB4NjkwMzYwN0MsIDB4ODgwMTQ5MTgsIDB4MjU5MThGM0UsIDB4NkIxMkQxNjEsCisweDIxQjI3QjAxLCAweDY2MEQ4NUUzLCAweDQwMjE2MDYzLCAweEM5M0Y0MDIxLAorMHg2QzAzNDYwMCwgMHgyNjJEMzIyQSwgMHhDODAxNjA2MywgMHhEQjVFRDE1RCwKKzB4OTY3RDg5MDEsIDB4RTYwMDJDNkIsIDB4NjY2QzY3Q0QsIDB4NDAwMDYwNjMsCisweDYyMkQwMjFELCAweDhEMEUzMjcwLCAweDYwNDM2NDAzLCAweEU5RkYwMjFELAorMHg4QjAxMzI5MCwgMHgwMUM1QTAwNywgMHg2MjZDNzYwMSwgMHgzMjkyRTkwNCwKKzB4NjQ2QzhCRUIsIDB4NjA0MzQ0MDAsIDB4RDE1MDA0QkQsIDB4MEI0NTc0MDEsCisweDY2OUQ2OTExLCAweDg5MDczNjcwLCAweDYwMkQ2MjExLCAweDg5MDM4OEZGLAorMHhFMjAxREI0QiwgMHgyQjIwMjFDMSwgMHhFQ0ZDODU1MSwgMHg4MTUxMjBDOSwKKzB4Q0IwMTYwNTEsIDB4REM0NzI1MDEsIDB4NjRBMzRDMEIsIDB4NTFGMzY2RjIsCisweDg1RUYyNjEyLCAweDU0RjJEMjQ0LCAweDY1MEQ0MjBCLCAweDAwMDlBREU3LAorMHhFNTAwREM0MiwgMHg0MjBCMkM1MiwgMHg0RTBCNjRBMywgMHg1NDAzNjQwMywKKzB4ODU0NDZFMDMsIDB4NjcwM0U5MDgsIDB4NjUwMzQ5MTgsIDB4Mjc5OTg1NDEsCisweERCMzIzNzkwLCAweDhGMEJEOTMyLCAweDYwMTM2MTBELCAweDhCMDdDODIwLAorMHhDOTQ4NjA1MywgMHg4QjAzODgwOCwgMHhFNTAxQkQ0RCwgMHgwMDA5QTAwNSwKKzB4MjEyOEQyMzMsIDB4QkQ0Njg5MDEsIDB4NjRCM0U1MDAsIDB4NDkwQjY1RTMsCisweEFEQkNFQzAxLCAweDg1RjIyREMyLCAweDcwMDFFRTA0LCAweDMxRTc2MTBELAorMHg4RDAyODFGMiwgMHhBREE5N0EwOCwgMHg3RjE0MDAwOSwgMHg2RUY2NEYyNiwKKzB4NkNGNjZERjYsIDB4NkFGNjZCRjYsIDB4MDAwQjY5RjYsIDB4RjdGRjY4RjYsCisweDJGRTY4MDAwLCAweEQyMjM0RjIyLCAweDYwRTM2RTIyLCAweDhEMDJDODQwLAorMHhCQkY5MjJFMiwgMHhFMjQwMDAwOSwgMHgyRTI4NDIxOCwgMHhCQzA0ODkwMSwKKzB4NjBFMzAwMDksIDB4ODkwNUM4MTAsIDB4RDIxQ0Q0MUIsIDB4MDAwOTQyMEIsCisweDAwMDlCQzAzLCAweEM4MDU2MEUzLCAweEJENkQ4OTAxLCAweDYwRTMwMDA5LAorMHg4OTAyQzgwMiwgMHhBQzAwNEYyNiwgMHg0RjI2NkVGNiwgMHg2RUY2MDAwQiwKKzB4MDAxQzNEM0MsIDB4MDAxMTc3NjAsIDB4MDAyMDE0QTAsIDB4MDAyMDE2NkMsCisweDAwMjAzNDhDLCAweDAwMjAzRDlDLCAweDAwMjAzOTAwLCAweDAwMjAzNEY0LAorMHgwMDIwMTRDQywgMHgwMDIwMzk2QywgMHgwMDIwMzk3NCwgMHgwMDIwMzk2OCwKKzB4MDAyMDM5NkEsIDB4MDAyMDE1MzAsIDB4MDAyMDE4RUUsIDB4MDAyMDM5OEMsCisweDAwMDA4MDAwLCAweDAwMUMzNTEwLCAweDAwMjAzRDkwLCAweDAwMjAxOEEyLAorMHgwODBBMEMwRSwgMHgwMDAyMDQwNiwgMHgxQTFDMUUyMCwgMHgxMjE0MTYxOCwKKzB4MkUzMDMyMzQsIDB4MjYyODJBMkMsIDB4M0EzQzNFNDAsIDB4NkM2MjU2NDgsCisweDQxMTEyRjI2LCAweEUyMjA4RjE4LCAweDg5MEIzMTIzLCAweDMyMUNEMjA0LAorMHhEMTAyNjIyMCwgMHg0MTJCMzEyQywgMHgwMDA5MDAwOSwgMHgwMDIwMzQwQSwKKzB4MDAyMDMzQzAsIDB4MDAwQkUwMDAsIDB4NDAwMDYyRjYsIDB4NDAwMDQwMDAsCisweDQwMDA0MDAwLCAweDQwMDA0MDAwLCAweDYyRjYwMDBCLCAweDQwMDA0MDAwLAorMHg0MDAwNDAwMCwgMHg0MDAwNDAwMCwgMHg0MDE4NDAwMCwgMHg2MkY2MDAwQiwKKzB4NDAwMDQwMDAsIDB4NDAwMDQwMDAsIDB4NDAwMDQwMDAsIDB4NDAyODQwMDAsCisweDYyRjYwMDBCLCAweDQwMDA0MDAwLCAweDQwMTg0MDAwLCAweDAwMEI0MDI4LAorMHhDOTBGNjJGNiwgMHg0MDA1NDAwNSwgMHg0MDA1NDAwNSwgMHg2MkY2MDAwQiwKKzB4NDAwNUM5MDcsIDB4NDAwNTQwMDUsIDB4NjJGNjAwMEIsIDB4NDAwNUM5MDMsCisweDAwMEI0MDA1LCAweEM5MDE2MkY2LCAweDAwMEI0MDA1LCAweDAwMDA2MkY2LAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDU0NEYwRDBBLAorMHg0NjIwNTM1NSwgMHgwMDAwM0E1NywgMHgyMDZDNzU0QSwgMHgzMjIwMzEyMCwKKzB4MjAzODMwMzAsIDB4MzIzQTMxMzIsIDB4MzIzMTNBMzcsIDB4MDAwMDAwMDAsCisweDAwMDAwRDBBLCAweDAwMDAwMDQzLCAweDQyNzA3MzcyLCAweDNEMjA2Njc1LAorMHg1NTRFMjAzRCwgMHgyMDJDNEM0QywgMHg2RTQ5Njc3QSwgMHg0RTQ5NzI3NCwKKzB4NkQ3NTRFNTEsIDB4MDAwMDAwM0QsIDB4NjE3NjZFNDksIDB4MjA2NDY5NkMsCisweDcyNjU3Mzc1LCAweDIwNzI2RjIwLCAweDIwNzk2NTZCLCAweDAwMjE0NDQ5LAorMHg1MjUwNDU0NSwgMHg1NzIwNEQ0RiwgMHg2NTc0Njk3MiwgMHg2NDYxMjAyQywKKzB4MDAzRDcyNjQsIDB4NkM2MTc2MjAsIDB4MDAwMDAwM0QsIDB4MDAwMDBBMEQsCisweDQzNUY0RDVBLCAweDQ2NUY0NDRELCAweDRDNDQ1RjU3LCAweDQ5NEU0OTVGLAorMHgwMDAwMDA1NCwgMHg2RTZCNkU1NSwgMHgyMDZFNzc2RiwgMHg2RDZENkY2MywKKzB4M0Q2NDZFNjEsIDB4MDAwMDAwMDAsIDB4MjAzQTMwNTEsIDB4MDAwMDAwMjAsCisweDIwM0EzMTUxLCAweDAwMDAwMDIwLCAweDIwM0EzMjUxLCAweDAwMDAwMDIwLAorMHgyMDNBMzM1MSwgMHgwMDAwMDAyMCwgMHgyMDNBMzQ1MSwgMHgwMDAwMDAyMCwKKzB4MkI0MzQ3NDEsIDB4NzM2OTZGNEUsIDB4NjE0MzIwNjUsIDB4NzI2MjY5NkMsCisweDZGNjk3NDYxLCAweDYxNjYyMDZFLCAweDZGMjA2QzY5LCAweDY5NzQyMDZFLAorMHgwRDBBNjU2RCwgMHgwMDAwMDAwMCwgMHgwMDAwMDA3MiwgMHgwMDIwNTIyMCwKKzB4MDAwMDBEMEEsIDB4NjI3MzU1NzYsIDB4NzQ3MzcyNUYsIDB4MDAwMDBBMEQsCisweDYyNzM1NTc2LCAweDczNzU3MzVGLCAweDY0NkU2NTcwLCAweDAwMDAwQTBELAorMHg2MjczNTU3NiwgMHg3MzY1NzI1RiwgMHgwMDBBMEQ2RCwgMHgwMDAwMDA0NCwKKzB4NDQzODc1NzAsIDB4NzI2MzczNjUsIDB4NkY3NDcwNjksIDB4M0Q1ODQ1NzIsCisweDAwMDAwMDAwLCAweDAwMDAwMDQ3LCAweDAwMDAwMDQyLCAweDcyNzQ2RTQ5LAorMHg2RDY1MjA1MSwgMHgyQzc5NzQ3MCwgMHg0OTY3N0EyMCwgMHg0OTcyNzQ2RSwKKzB4NzU0RTUxNEUsIDB4MDAwMDNENkQsIDB4NjU0QzcyNDUsIDB4MDAwMDAwNkUsCisweDAwMDAwMDQ5LCAweDIwNzQ2RjRFLCAweDc1NkY2RTY1LCAweDQ5MjA2ODY3LAorMHg0MjIwNTE0RSwgMHgwQTBENjY3NSwgMHgwMDAwMDAwMCwgMHgwMDAwMDBGRiwKKzB4MDAwMjAwMDEsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMTBFMDEwRCwKKzB4MDAwMjAwMDMsIDB4MDEwOTAxMDgsIDB4MDAwMjAxMEEsIDB4MDIwMDAwMDMsCisweDAyMDIwMjAxLCAweDAyMDQwMjAzLCAweDAyMDYwMjA1LCAweDAyMDIwMjAwLAorMHgwMjA0MDIwMywgMHgwMjBDMDIwQiwgMHgwMjBFMDIwRCwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwMDAwMEZGLAorMHgwMDAyMDAwMSwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAxMEUwMTBELAorMHgwMDAyMDAwMywgMHgwMTA5MDEwOCwgMHgwMDAyMDEwQSwgMHgwMDAzMDAwMywKKzB4MDIwMjAyMDEsIDB4MDIwNDAyMDMsIDB4MDIwNjAyMDUsIDB4MDIwMjAyMDAsCisweDAyMDQwMjAzLCAweDAyMEMwMjBCLCAweDAyMEUwMjBELCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDEwRTAxMEQsCisweDAwRkYwMTBGLCAweDAxMDkwMTA4LCAweDAxMEIwMTBBLCAweDAyMDAwMTBGLAorMHgwMjAyMDIwMSwgMHgwMjA0MDIwMywgMHgwMjA2MDIwNSwgMHgwMjAyMDIwMCwKKzB4MDIwNDAyMDMsIDB4MDIwQzAyMEIsIDB4MDIwRTAyMEQsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMTBFMDEwRCwKKzB4MDBGRjAxMEYsIDB4MDEwOTAxMDgsIDB4MDEwQjAxMEEsIDB4MDEwRjAxMEYsCisweDAyMDIwMjAxLCAweDAyMDQwMjAzLCAweDAyMDYwMjA1LCAweDAyMDIwMjAwLAorMHgwMjA0MDIwMywgMHgwMjBDMDIwQiwgMHgwMjBFMDIwRCwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwMjA1MjIwLAorMHgwMDAwMDA0NiwgMHgwMDAwMDA1OSwgMHg3MzIwNDE0MiwgMHgwMDNENzE2NSwKKzB4NDk1NDQxMjAsIDB4MDAwMDIwNEQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMkUwMjA5LCAweDgwMDAwMTAxLCAweDAwMDQwOUZBLCAweDAwRkYwNDAwLAorMHgwNTA3MDAwMCwgMHgwMjAwMDIwMSwgMHg4MjA1MDcwMCwgMHgwMDAyMDAwMiwKKzB4MDM4MzA1MDcsIDB4MDcwMTAwNDAsIDB4NDAwMzA0MDUsIDB4MDIwOTAxMDAsCisweDAxMDEwMDJFLCAweDA5RkE4MDAwLCAweDA0MDAwMDA0LCAweDAwMDAwMEZGLAorMHgwMjAxMDUwNywgMHgwNzAwMDA0MCwgMHg0MDAyODIwNSwgMHgwNTA3MDAwMCwKKzB4MDA0MDAzODMsIDB4MDQwNTA3MDEsIDB4MDAwMDQwMDIsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDA3MDkwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCB9OworCitjb25zdCB1MzJfdCB6Y0Z3SW1hZ2VTaXplPTE1OTI4OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvaGFsL2hwZnd1X0JBLmMgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy9oYWwvaHBmd3VfQkEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzc0MTU3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvaGFsL2hwZnd1X0JBLmMKQEAgLTAsMCArMSw4NzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBBdGhlcm9zIENvbW11bmljYXRpb25zIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworI2luY2x1ZGUgImNwcmVjb21wLmgiCisKK2NvbnN0IHUzMl90IHpjRndJbWFnZVtdID0geworMHgwMDA5MDAwQiwgMHg0RjIyMkZFNiwgMHhERTkxN0ZGQywgMHhFMTE0RDc5MSwKKzB4MUUxM0Q0OTEsIDB4MUU0QzQ3MEIsIDB4MDAwOUIwMTcsIDB4OTVDMkU2MDAsCisweEM4NDA2MEUyLCAweDJGMDI4RjAzLCAweDhGRjkzNjUyLCAweEQ0OEI3NjAxLAorMHg0RTBCREU4QiwgMHhENDhCMDAwOSwgMHgwMDA5NEUwQiwgMHg0RTBCRDQ4QSwKKzB4N0YwNDAwMDksIDB4QTA0NzRGMjYsIDB4NEYyMjZFRjYsIDB4NDEwQkQxODcsCisweEQ0ODcwMDA5LCAweDAwMDk0NDBCLCAweDQ1MEJENTg2LCAweEQ3ODYwMDA5LAorMHg2MTFERTFGRiwgMHhEMTg1MjcxMiwgMHg2MDEyRTJGRiwgMHhDQjAxRDQ4NCwKKzB4NzFEQzIxMDIsIDB4NzEwNDIxMjIsIDB4MjEyMkU1MDEsIDB4RDU4MTI0NTIsCisweEQyODE5NzkyLCAweEU3MDAyNTcyLCAweEQ0ODFEMTgwLCAweDIyNzBENjgxLAorMHgyMTcyRTIwMSwgMHgyNjIwMjQ3MCwgMHhFNEZGRDY3RiwgMHhFNjAwMjY0MSwKKzB4RTEwNEQ1N0UsIDB4NjA2MzY2NkQsIDB4NjI2RDc2MDEsIDB4MzIxMjQwMDAsCisweDA1NDU4RkY4LCAweEU1MDFEMjdBLCAweEQxN0EyMjUwLCAweEQ1N0JENDdBLAorMHhFNzAwRTYwMCwgMHgyNTcyMjQ3MCwgMHgxMTYyMjE2MiwgMHgxMTY5MTE2NiwKKzB4NEYyNjExNkEsIDB4MTE2RTAwMEIsIDB4RDE3NTdGQzQsIDB4MkYxMkQ4NzUsCisweEQ0NzZEMTc1LCAweEQ1NzdENjc2LCAweDFGODdENzc3LCAweEQ5Nzc3OEZDLAorMHgxRjFCRDI3NywgMHgxRjQxNzEwNCwgMHgxRjY0NzQwNCwgMHgxRjg4NzYwNCwKKzB4NzFGNDFGMUMsIDB4MUY0MkU4QzgsIDB4MUY2NTFGNTMsIDB4MUY5OTFGNzYsCisweDFGMUQxRjJBLCAweERENkY2ODhDLCAweERBNzBERTZGLCAweERDNzFEQjcwLAorMHgwMDA5NEEwQiwgMHgwMDA5NEIwQiwgMHgwMDA5NEMwQiwgMHg2MDEwRDE1RSwKKzB4OEIwRjg4MDEsIDB4RTk1MEQxNUQsIDB4NDkxODYyMTIsIDB4OEIwNzMyOTYsCisweDU2RkFEMTU5LCAweDIxMjBFMjAwLCAweENCMDE2MDYyLCAweDI2MDJBMDAyLAorMHgyMTIyNzIwMSwgMHg4ODAxNjBEMiwgMHhEMTYzODkwNywgMHgzMjg2NjIxMiwKKzB4RDE2Mjg5MDMsIDB4ODgwMTYwMTAsIDB4NjRFMjhCREEsIDB4NTJGNzUxRjgsCisweDU1RTEyMTQyLCAweDIyNTJEMTVFLCAweDY2MTI1NEZCLCAweDI0NjI1OUZDLAorMHgyOTcyNTcxMSwgMHg4ODAxNjBEMiwgMHg2NkUyOEI1MywgMHgzNjIwNTJFMSwKKzB4NjA2MTg5NEMsIDB4ODgwMUM5MEYsIDB4RDE1NjhCNDgsIDB4MzYyMDYyMTIsCisweEEwNDM4OTAzLCAweDI3MTAyMTYyLCAweEQ1NTMwRkEwLCAweDY2NTFFNzEwLAorMHg2MjZENzYwMSwgMHg4RjNDMzI3MywgMHg2NUYyMjU2MSwgMHg2OTUyNTFGMiwKKzB4NTRGMzU5RjEsIDB4Njc5MjUyRjQsIDB4NjE0MjY1MTIsIDB4NTZGNjY5MjIsCisweDY0MjI1MkY1LCAweENCMjA2MDYyLCAweEU2MDAyNjAyLCAweDc2MDExRjFFLAorMHg2MjZERTExMCwgMHgzMjEzNDExOCwgMHg1MUZFOEZGOCwgMHgyNjcyNTZGMSwKKzB4NTZGNDU3RjIsIDB4NTVGMzI3NTIsIDB4MjUxMjU3RjUsIDB4Mjc0MjI2OTIsCisweDUxRjk2OUUyLCAweDIxOTJENDNELCAweEU5MDE2MUYyLCAweDIxOTI0NDBCLAorMHg0OTE4NjVGMiwgMHhEOTM4MjU5MiwgMHhFMjAwRDUzOSwgMHg2MjUxMjkyMSwKKzB4NzIwMTU0RkQsIDB4NjIyRDI1MjEsIDB4MjQyMkEwMDMsIDB4RTIwMEQ5MzIsCisweEU5MDEyOTIxLCAweDJEOTJEMTJDLCAweDI2Njg2NjEyLCAweEFGNkY4QjAxLAorMHhENjMwMDAwOSwgMHgwMDA5NDYwQiwgMHhFNzAwRDEyOCwgMHgyMTcwQUY2OCwKKzB4MDAxQzAwMUMsIDB4MDAyMDBGN0MsIDB4MDAwMEIzOEUsIDB4MDAyMDMyMkMsCisweDAwMjAxNDVFLCAweDAwMjAzMjM4LCAweDAwMjAzMjUwLCAweDAwMjAxNDFDLAorMHgwMDIwMTUxQywgMHgwMDIwMEZBMCwgMHgwMDFDMzUxMCwgMHgwMDFDMzY0OCwKKzB4MDAxRTIxMkMsIDB4MDAyMDMxODgsIDB4MDAyMDJEMjQsIDB4MDAyMDMxOTAsCisweDAwMjAzMTlDLCAweDAwMjAzMUE4LCAweDAwMjAzMUI4LCAweDAwMjAzMUJDLAorMHgwMDIwMzFCMCwgMHgwMDExNzcwOCwgMHgwMDIwMzFCMSwgMHgwMDIwMzFCNCwKKzB4MDAxQzNEMzAsIDB4MDAxMTc3MTgsIDB4MDAxMTc3MzQsIDB4MDAxQzNCOUMsCisweDAwMUMzNzA0LCAweDAwMUMzRDk4LCAweDAwMUMzNTAwLCAweDAwMUMzRDAwLAorMHgwMDFDMzZGOCwgMHgwMDFDMTAyOCwgMHgwMDIwMkQ5OCwgMHgwMDIwMTMyOCwKKzB4MDAyMDJDMDQsIDB4MDAyMDFFMTgsIDB4MDAyMDM0QkMsIDB4MDAyMDMxQkEsCisweDAwMjAyRDkwLCAweDAwMjAzMUNDLCAweDAwMjAzMUQwLCAweDAwMjAxMjc2LAorMHgwMDIwMzFEMiwgMHgwMDIwMUZEMCwgMHgyRkI2MkY5NiwgMHgyRkQ2MkZDNiwKKzB4NEYyMjJGRTYsIDB4REU5NDdGOEMsIDB4NjFFMEUwMjQsIDB4MEYxNEQ0OTMsCisweDcxMDE2MUUzLCAweEQ3OTI2MjEwLCAweDQ3MEJFMDI4LCAweEQ1OTEwRjI0LAorMHgwMDA5NDUwQiwgMHg2RDAzMjAwOCwgMHgxRjBCOEYxMSwgMHhENDhGREM4RSwKKzB4REQ4RjY3QzAsIDB4NjU3QzREMEIsIDB4REQ4RkQxOEUsIDB4NkI5QzY5MTAsCisweDQyMDg2MkIzLCAweDMyQjg0MjA4LCAweDNEMkM0MjA4LCAweEUwMjgxRkRCLAorMHhFNTgwMDRGQywgMHg2MDRDNjZFMiwgMHgzMDUwNjU1QywgMHgyRDYyOEYxMywKKzB4MDFGQ0UwMjQsIDB4NjQxQ0U1MDAsIDB4NjI1RERFODQsIDB4OEIwMTMyNDMsCisweDAwMDlBMzNELCAweDY3NTM2NTVELCAweDYwNzAzN0VDLCAweDM5REM2OTUzLAorMHhBRkYyNzUwMSwgMHgyMDA4ODA5NCwgMHhFMDI0OEIxMywgMHhFNTAwMDFGQywKKzB4QTAwOURFN0EsIDB4NjU1RDY0MUMsIDB4MzJFQzYyNTMsIDB4NkM1MzZCMjIsCisweDNDREM2N0IyLCAweDc1MDQxQzcxLCAweDMyNDM2MjVELCAweEEzMUU4QkYzLAorMHg4ODAxMkQxMCwgMHhFMDI0OEIxNiwgMHhFNDAwMDFGQywgMHg2NzFDMkQ0MCwKKzB4NjI0RERFNkUsIDB4OEIwMTMyNzMsIDB4MDAwOUEzMTEsIDB4NkNFMzY0NEQsCisweDdDMDQ2OTQzLCAweDM5RUM2QjQzLCAweDY1OTIzQkNDLCAweDc0MDg2REIyLAorMHgyNUQyQUZFRiwgMHg4QjE5ODgwNCwgMHgwMUZDRTAyNCwgMHgyRDcwRTcwMCwKKzB4MUZEODZEMUMsIDB4NjI3RERFNjEsIDB4OEIwMTMyRDMsIDB4MDAwOUEyRjcsCisweDZCNzM2NzdELCAweDNCRUM2MUUzLCAweDcxMDQ2NEIyLCAweDNDMUM2QzczLAorMHg2OTQyNjVDMiwgMHgyOTU5NzcwOCwgMHgyNDkyQUZFRCwgMHg4QjE4ODgwNSwKKzB4MDFGQ0UwMjQsIDB4MkQ0MEU0MDAsIDB4REU1NDY3MUMsIDB4MzI3MzYyNEQsCisweEEyREM4QjAxLCAweDY0NEQwMDA5LCAweDZCRTM2RDQzLCAweDY1RDIzREVDLAorMHg2MTQzN0IwNCwgMHg2QzEyMzFCQywgMHg3NDA4Njk1MiwgMHhBRkVEMjlDQiwKKzB4ODgzMTI1OTIsIDB4REU0QThCMjAsIDB4NjVFNkRCNEEsIDB4NjFFNkRDNEEsCisweDY3RTJEOTRBLCAweDYyRTI3RTA0LCAweDFGRUM3RUU4LCAweDdFMDQ2NEUyLAorMHg2RUUyMUZFRCwgMHg1QkZEMkJFMCwgMHg2MEIyN0IwNCwgMHhDOTAxMUZCRSwKKzB4NkJCMjJDMDAsIDB4MjlCMDRCMDksIDB4REM0MTJGMjYsIDB4NjYxMzRDMEIsCisweEUyMDA3RjA0LCAweDJEMjBBMkFCLCAweDhCMjE4ODMwLCAweEQ5MzlERTM4LAorMHhFMDY0NjVFNiwgMHg3MjA0NjJFMywgMHg2NzI2NjZFMiwgMHg2RTIzREMzNiwKKzB4NjIyMjdFRTgsIDB4NkJFMjYxRTYsIDB4MjlCMDFGRUYsIDB4N0UwNDBGMTYsCisweEM5MDE2MEUyLCAweDZFRTIyQzAwLCAweDRFMDlEQzMwLCAweDJGMjYyQ0UwLAorMHhEMTMwRTA2OCwgMHgwNEZFNDEwQiwgMHhFMjAwN0YwNCwgMHgyRDIwQTI4NywKKzB4OEIwNTg4MzMsIDB4NEUwQkRFMkMsIDB4RTEwMDAwMDksIDB4MkQxMEEyN0YsCisweDg5MDE4ODI4LCAweDAwMDlBMTA2LCAweEUxNDNERTIwLCAweEUwNDA2MkUxLAorMHgzMjE3NjIyRCwgMHgwRkU2OEYwNCwgMHg2MDIzRTI0MCwgMHgyNjIxMDZGRSwKKzB4OEIwMTMyMTcsIDB4MDAwOUEwRUYsIDB4MDJGRUUwNDAsIDB4ODUyMUU0MDEsCisweDhCMDEzMDQ2LCAweDAwMDlBMEU3LCAweEU1MDFFMDQwLCAweDJENTAwN0ZFLAorMHg2NDcxQjI2NSwgMHgwOUZFRTA0MCwgMHg2MjkxRTE0MywgMHg2NTJERTA2OCwKKzB4OEQ2QjM1MTcsIDB4RTY0MDBGNTYsIDB4OEIyNzM1NjMsIDB4RTA0OEU2MDAsCisweEUxMUEwRjY1LCAweDcyQzBBMDMxLCAweDAwMTE3ODAwLCAweDAwMjAzMjU0LAorMHgwMDIwMTQ1RSwgMHgwMDIwMjU4OCwgMHgwMDIwMzFBMiwgMHgwMDIwMzI1OCwKKzB4MDAyMDE0QUEsIDB4MDAyMDMxQTEsIDB4MDAyMDJEQzgsIDB4MDAxMTc4MDQsCisweDAwMTE3ODEwLCAweDAwMjAzMTlELCAweDAwMjAzMTlFLCAweDAwMjAzMTlGLAorMHgwMDIwMEMyQywgMHgwMDIwMEM4MCwgMHgwMDIwMEM3QywgMHg0MTIxNjE1MywKKzB4NDEyMTQxMjEsIDB4NDEyMTQxMjEsIDB4NDUyMTQ1MjEsIDB4NjA1MzQ1MjEsCisweDY2MDNDOTAzLCAweDBGNjVFMDQ4LCAweEUwMDc3MTE4LCAweEUwNDQyMjA5LAorMHg2NDFEMEYyNSwgMHg2NUYzRTA0QywgMHgwRjQ2QjI4QywgMHgwNEZERTA0OCwKKzB4MEJGREUwNDQsIDB4NjFCRDY3NEQsIDB4NDEwODQ3MDgsIDB4MEYxNkUwNTAsCisweEQyOUI2MDczLCAweDQyMEIwOUZFLCAweDZDMDdFMDBGLCAweDYwNzMyOUM5LAorMHhFMDQwMEY5NiwgMHg2NUYzMEVGRSwgMHg2RDBEODVFMiwgMHgwMUZFRTA1MCwKKzB4NjBEMzQyMEIsIDB4NjA3MzI5MEIsIDB4RTA0QzBGOTYsIDB4MDRGRUIyNTEsCisweDA2RkVFMDQwLCAweDYyNjFFMDY4LCAweDBGNTY2NTJELCAweDM1NjNFNjQwLAorMHhFMDAwODk0RSwgMHg2MDIzODFGOCwgMHg0MDA4QzkwMywgMHg2QjAzNDAwMCwKKzB4RTA1NDYxMDMsIDB4RTA1ODBGQjYsIDB4RUNGRkREODUsIDB4NkNDQzBGRjYsCisweDBGRDZFMDZDLCAweDREMEI2MEMzLCAweDQyMjE2MjUzLCAweDQyMjE0MjIxLAorMHg2NDIzNDIyMSwgMHgzMjRDNDIwMCwgMHhFMDVDNkUwNywgMHg0NTIxNDIwMCwKKzB4RTA0MDBGRTYsIDB4MEJGRTQ1MjEsIDB4QzkwMzYwNTMsIDB4MzBGQzQwMDgsCisweDZEMDM3QjA2LCAweDg1RjgxRjA1LCAweDZDMkQxRkI3LCAweDFGQzY2RTAzLAorMHgwRkM2RTA2MCwgMHgwNUZFRTA1OCwgMHg2NEMzQjIyQywgMHgzM0ZDRTM1NCwKKzB4NTYzMjYyRDIsIDB4MjI2OTYxMzIsIDB4NjdCNDJEMjIsIDB4NDkwQjU5MzYsCisweDIyMEI2MDdDLCAweDA1RkVFMDU4LCAweDY0QzMyRDIyLCAweDdFMDFCMjAxLAorMHhFNzA2NjJFRCwgMHg4RkUzMzI3MywgMHhFMDQwN0MwMSwgMHg2MjYxMDZGRSwKKzB4MDZGRUUwNDAsIDB4ODU2MTQyMDAsIDB4MzAyQzc2MEMsIDB4NjEwMzcwMUIsCisweDY0RjNFNTAwLCAweDc1MDFFNzA0LCAweDZCNUQ2OTY2LCAweDI0OTIzQjczLAorMHg3NDA0OEZGOSwgMHhCMUU0NjVGMywgMHhFMDQwNjQxRCwgMHhCMUEzMDZGRSwKKzB4QTE3QzY0NjEsIDB4RDQ1NzAwMDksIDB4RTIwMUQ3NTcsIDB4MkQyMDQ3MEIsCisweDAwMDlBMTc1LCAweDhCMDc4ODI5LCAweEVDMDBERTU0LCAweDYxRTIyREMwLAorMHg2NDFEQjE3NSwgMHgwMDA5QTE2QiwgMHg2MjJDRTI4MSwgMHg4QjAxMzAyMCwKKzB4MDAwOUEwQjYsIDB4MDZGQ0UwMjgsIDB4RTY4MjYyNkMsIDB4MzI2MDY2NkMsCisweDU2RkI4QjIwLCAweDI2MTBFMTI0LCAweDUyMTdEMTQ5LCAweDUyMTgxNjIxLAorMHg1MjE5MTYyMiwgMHg1MjFBMTYyMywgMHg1NTFCMTYyNCwgMHgxNjU1RTIwMCwKKzB4MTY1NjU1MUMsIDB4MTY1NzU1MUQsIDB4MTY1ODU1MUUsIDB4MTY1OTU1MUYsCisweDExMjgxMTI3LCAweDExMkExMTI5LCAweDExMkMxMTJCLCAweDExMkUxMTJELAorMHgxMTJGQTEzRCwgMHg2NjZDRTY4MywgMHg4QjBCMzI2MCwgMHhENjM3NTJGQiwKKzB4MjI1MEU1MDAsIDB4RDIzNzY1NjIsIDB4MjI1Mjc2MDQsIDB4RDYzNjYyNjIsCisweDI2MjBBMTJELCAweDY2NkNFNjkwLCAweDhCMDMzMjYwLCAweDAwMDlCMUM3LAorMHgwMDA5QTAxMSwgMHg2NjZDRTY5MSwgMHg4QjEwMzI2MCwgMHg2MjUyRDUyQiwKKzB4MjIyODYyMkMsIDB4RDIyRDg5MDQsIDB4MDAwOTQyMEIsIDB4MDAwOUEwMDMsCisweDQyMEJEMjJCLCAweDU2RkIwMDA5LCAweEExMTBFMjAwLCAweEU2QjAyNjIwLAorMHgzMjYwNjY2QywgMHhFMDI0OEIzNCwgMHhFMDcwMDJGQywgMHgwRjE2NjEyQywKKzB4RUIwNEVDMDAsIDB4MDFGRUUwNzAsIDB4MzIxMzYyQ0QsIDB4QTBGRThCMDEsCisweEQyMUEwMDA5LCAweDZEQzM2Q0NELCAweDcyMDQzRDJDLCAweDMxMkM2MUMzLAorMHg2RDEyNkVEMiwgMHhEMTE0RDQxQiwgMHgwMDA5NDEwQiwgMHg0MTBCRDExQSwKKzB4RDQxQTY0RTMsIDB4NDIwQkQyMTAsIDB4RDIxNzAwMDksIDB4NjREMzQyMEIsCisweEQ2MERENDE3LCAweDAwMDk0NjBCLCAweDYxRTNFNjAwLCAweDMxNkM2NjZELAorMHg2MjZENzYwMSwgMHgyMUQwMzJCMywgMHg0RDE5OEZGNywgMHg3QzA4QUZEMiwKKzB4RDIxMUQ0MTAsIDB4RDQxMTY1NDIsIDB4MDAwOTQyMEIsIDB4MDAwOUEwQ0YsCisweDAwMjAyQzgwLCAweDAwMjAzMjc4LCAweDAwMjAxNDVFLCAweDAwMTE3ODA0LAorMHgwMDIwMkQyQywgMHgwMDIwMzE4OCwgMHgwMDIwMzE5QywgMHgwMDIwMENCQSwKKzB4MDAyMDBDRTAsIDB4MDAyMDMyOTAsIDB4MDAyMDE0QTIsIDB4MDAyMDMyQTQsCisweDAwMjAzMkFDLCAweDAwMTE3ODAwLCAweDAwMjAxNEFBLCAweDAwMjAzMkIwLAorMHhENUI1RDFCNCwgMHg2MjUyRTA0MCwgMHg3NTA0NjYxMiwgMHgyMTYyMzYyQywKKzB4NTYxMTYyNTYsIDB4MTE2MTM2MkMsIDB4NjI1MjY2NTMsIDB4NzYwODU1MTIsCisweDExNTIzNTJDLCAweDU1MTM2MjYyLCAweDM1MkM3NkVDLCAweDY1NjMxMTUzLAorMHg1NjE0NjI2MiwgMHgzNjJDNzUxMCwgMHg2NjUzMTE2NCwgMHg1NTE1NjI1MiwKKzB4MzUyQzc2MTAsIDB4NjI2MjExNTUsIDB4MzYyQzU2MTYsIDB4RDZBMzExNjYsCisweDU1MTc2MjYyLCAweDM1MkM3NjA0LCAweDYyNjYxMTU3LCAweDM1MkM1NTE4LAorMHg2NTYzMTE1OCwgMHg1NjE5NjI2MiwgMHgzNjJDNzUwNCwgMHg2MjU2MTE2OSwKKzB4MzYyQzU2MUEsIDB4NjI1NjExNkEsIDB4MzYyQzU2MUIsIDB4NjY1MzExNkIsCisweDU1MUM2MjUyLCAweDM1MkM3NjA0LCAweDYyNjYxMTVDLCAweDM1MkM1NTFELAorMHg2MjYzMTE1RCwgMHg1NTFFNjY2MiwgMHgzNTZDNzIwNCwgMHg2NjIyMTE1RSwKKzB4RDU4RjUyMUYsIDB4MTEyRjMyNkMsIDB4MDYxRTYyNTIsIDB4MzYyQzc1OTQsCisweEUwNDQwMTY2LCAweDYyNTI2NjUzLCAweDc2NDQwNTFFLCAweDAxNTYzNTJDLAorMHg2MjYyRTA0OCwgMHgzNjJDMDYxRSwgMHhENjg2MDE2NiwgMHg2MjYyRTA1NCwKKzB4NDIyOTA1MUUsIDB4MDE1NjM1MkMsIDB4NjI2Mjc2MDQsIDB4MDYxRUUwNTgsCisweDM2MkM0MjI5LCAweDU2RkIwMTY2LCAweDI2MjBFMjM4LCAweDAyMUVFMDQ0LAorMHgxNjIxRTA0OCwgMHgxNjIyNjIxMiwgMHgxNjIzNTIxMSwgMHhFMjAwNTUxMiwKKzB4NTUxNTE2NTQsIDB4NTUxMzE2NTUsIDB4NTUxNjE2NTYsIDB4MDUxRTE2NTcsCisweDE2NThFMDQwLCAweEUwNTAwNTFFLCAweDU1MTQxNjU5LCAweDA1MUUxNjVBLAorMHgxNjVCRTA0QywgMHhFMDU0MDUxRSwgMHgwNTFFMTY1QywgMHgxNjVERTA1OCwKKzB4RTA0NDA1MUUsIDB4MDEyNjE2NUUsIDB4MjEyMkUwNDgsIDB4MTEyMjExMjEsCisweDExMjMxMTI1LCAweDAxMjYxMTI2LCAweDAxMjZFMDQwLCAweDExMjRFMDUwLAorMHhFMDRDMDEyNiwgMHhFMDU0MDEyNiwgMHhFMDU4MDEyNiwgMHg3Rjc0MDEyNiwKKzB4NkVGNjRGMjYsIDB4NkNGNjZERjYsIDB4MDAwQjZCRjYsIDB4NEYyMjY5RjYsCisweEUyNDA2MTRELCAweDg5MTQzMTIzLCAweDMxMjdFMjFGLCAweDhCMDlENzVBLAorMHhENDVBNjE0RCwgMHhFMDAxNzFFMCwgMHg1NjcxNDQwQiwgMHgyNjU5NjUwNywKKzB4MTc2MUEwMDcsIDB4RTAwMUQ0NTUsIDB4NjY3MjQ0MEIsIDB4MjY1OTY1MDcsCisweDRGMjYyNzYyLCAweDAwMDkwMDBCLCAweDYxNEQ0RjIyLCAweDMxMjNFMjQwLAorMHhFMjFGODkxMiwgMHhENzRDMzEyNywgMHg2MTREOEIwOCwgMHg1NjcxRDI0QiwKKzB4NDIwQjcxRTAsIDB4MjYwQkUwMDEsIDB4MTc2MUEwMDYsIDB4NjY3MkQyNDcsCisweEUwMDE0MjBCLCAweDI3NjIyNjBCLCAweDAwMEI0RjI2LCAweEU2NDAwMDA5LAorMHg0NjI4NDYxOCwgMHg2MjUyRDU0MiwgMHg4OUZDMjI2OCwgMHgwMDA5MDAwQiwKKzB4NDYxOEU2ODAsIDB4RDUzRTQ2MjgsIDB4MjI2ODYyNTIsIDB4MDAwQjg5RkMsCisweEEwMDEwMDA5LCAweDcyMDFFMjAwLCAweDhCRkMzMjQyLCAweDAwMDkwMDBCLAorMHg0NjE4RTY4MCwgMHhENTM3NDYyOCwgMHgyMjY4NjI1MiwgMHgwMDBCOEJGQywKKzB4MkZFNjAwMDksIDB4N0ZGQzRGMjIsIDB4QkZGMTZFNTMsIDB4NjFFMjJGNDIsCisweEUyODBENjMxLCAweDU0RTExNjE1LCAweDE2NDY0MjE4LCAweDQyMjg1NUUyLAorMHg1N0UzMTY1NywgMHgxNjc4NkVGMiwgMHgyNkUyMkUyQiwgMHg0RjI2N0YwNCwKKzB4NkVGNkFGQ0UsIDB4MkZENjJGQzYsIDB4NEYyMjJGRTYsIDB4NkM1M0REMjYsCisweDZFNDNCRkQ2LCAweDJERTJCRkJCLCAweDAwMDlCRkQyLCAweDJDMTI1MUQ1LAorMHgxQzQxNTRENiwgMHgxQzUyNTVENywgMHgxQzYzNTZEOCwgMHg2RUY2NEYyNiwKKzB4MDAwQjZERjYsIDB4NjE2MzZDRjYsIDB4QTAwNEU2MDAsIDB4NjI1NjQxMDksCisweDI0MjI3NjAxLCAweDM2MTI3NDA0LCAweDAwMEI4QkY5LCAweDRGMjIwMDA5LAorMHhEMTE3RDQxNiwgMHgwMDA5NDEwQiwgMHhENDE3RDIxNiwgMHhFNTA1NjAyMiwKKzB4MjIwMkNCMjAsIDB4RDUxNTI0NTIsIDB4NDUwQkU3MDAsIDB4RDcxNDI0NzIsCisweDAwMDk0NzBCLCAweEU2MDFEMTEzLCAweDIxNjJEMjEzLCAweDRGMjY0NjE4LAorMHgyMjYyMDAwQiwgMHgwMDIwMkQyQywgMHgwMDFDMzZBMCwgMHgwMDFDM0NBMCwKKzB4MDAxQzM2RjQsIDB4MDAxQzNCODgsIDB4MDAxQzM3MDQsIDB4MDAyMDJDODAsCisweDAwMUMzNzNDLCAweDAwMUMzNzAwLCAweDAwMUMzNzBDLCAweDAwMjAzMkM0LAorMHgwMDIwMTQ1RSwgMHgwMDFDMzUwMCwgMHgwMDFENDAwNCwgMHgwMDIwMTRENCwKKzB4MDAyMDBGQTAsIDB4MDAxRTIxMkMsIDB4MDAxQzNEMzAsIDB4MDAwOUExQTksCisweDJGRTYyRkQ2LCAweEREOEY0RjIyLCAweEEwMDQ5RUE3LCAweEQ0OEUwMDA5LAorMHg0MjBCRDI4RSwgMHg2MkQyNjVEMiwgMHg4QkY4MjJFOCwgMHgwMDA5QTAwNCwKKzB4RDI4QUQ0OEIsIDB4NTVEMTQyMEIsIDB4MjJFODUyRDEsIDB4QTAwNDhCRjgsCisweEQ0ODgwMDA5LCAweDQyMEJEMjg1LCAweDUyRDI1NUQyLCAweDhCRjgyMkU4LAorMHgwMDA5QTAwNCwgMHhEMjgxRDQ4NCwgMHg1NUQzNDIwQiwgMHgyMkU4NTJEMywKKzB4QTAwNDhCRjgsIDB4RDQ4MTAwMDksIDB4NDIwQkQyN0MsIDB4NTJENDU1RDQsCisweDhCRjgyMkU4LCAweDZFRjY0RjI2LCAweDZERjYwMDBCLCAweDJGRDYyRkM2LAorMHg0RjIyMkZFNiwgMHg2RTYzNkQ3MywgMHg2QzUzQjAxOCwgMHg2NEMzNTdGNCwKKzB4QjA1NDY1RTMsIDB4QjA2QTY2RDMsIDB4QjA5QTAwMDksIDB4QjA5RTAwMDksCisweEIwQTIwMDA5LCAweEIwQkUwMDA5LCAweEIwQzEwMDA5LCAweEIxMjQwMDA5LAorMHg0RjI2MDAwOSwgMHg2REY2NkVGNiwgMHg2Q0Y2QTAyMywgMHgzNDEyRDE2QywKKzB4RDY2QzA1MjksIDB4MjY1MEQ3NkMsIDB4Mjc0MjAwMEIsIDB4MDAwOUEwMTQsCisweDJGRDYyRkM2LCAweDRGMjIyRkU2LCAweDZFNjM2RDczLCAweDZDNTNCRkVFLAorMHg2NEMzNTdGNCwgMHhCMDJBNjVFMywgMHhCMTA2NjZEMywgMHg0RjI2MDAwOSwKKzB4NkRGNjZFRjYsIDB4NkNGNkEwMDUsIDB4RTYwM0QyNjAsIDB4MDAwQjQ2MTgsCisweEQyNUUyMjYyLCAweDAwMEJFNjAwLCAweDRGMjIyMjYyLCAweEU0MEFCRjdFLAorMHgwMDA5QkY3RSwgMHhFMTA0RDI1QSwgMHhFNTAwNDExOCwgMHgyMjEyRTQwQSwKKzB4MjI1MkJGNzQsIDB4NjA3MkQ3NTcsIDB4NEYyNkNCMjAsIDB4MjcwMjAwMEIsCisweEQxNTU0RjIyLCAweEU0MDA0MTBCLCAweDQ1MkJENTU0LCAweDJGRTY0RjI2LAorMHg2RTYzRDE1MywgMHg0NDE4NjYxMiwgMHg0NTI4OTIxMCwgMHgyNjI5NDQwOCwKKzB4NDQwODQ1MDAsIDB4NDQwMDI2NUIsIDB4NDcwODI2NEIsIDB4NDcwODIxNjIsCisweDI3RUJEMTRDLCAweDAwMEIyMTcyLCAweDAzRjA2RUY2LCAweDJGRTYxRkZGLAorMHhERTQ5NEYyMiwgMHhFNDBBRTEwMSwgMHgyRTEyQkY0OCwgMHg3MjZDNjJFMywKKzB4RTQwMUUxMDAsIDB4MjIxMjIyMTIsIDB4MjIxMjIyMTIsIDB4MjIxMjIyMTIsCisweEU3MzAyMjQyLCAweEU0MEFFNTAzLCAweDIyMTIyMjEyLCAweDIyMTIyMjEyLAorMHgyMjEyMjIxMiwgMHgyMjEyMjIxMiwgMHgyMjEyMjIxMiwgMHgyMjEyMjIxMiwKKzB4MjI1MjIyNzIsIDB4MjIxMjIyMTIsIDB4MjIxMjIyMTIsIDB4MjIxMjIyMTIsCisweDIyMTIyMjEyLCAweDEyMUFCRjIyLCAweDJFNjJFNjAwLCAweDAwMEI0RjI2LAorMHhEMjMyNkVGNiwgMHhFNDQxRTEwMSwgMHgwMDBCMjIxMiwgMHhEMTMwMjI0MiwKKzB4RTYwNUQ0MzAsIDB4MDAwQjIxNjIsIDB4RDUyRjI0NjIsIDB4NjA1MEQyMkYsCisweDhCMEU4ODAxLCAweDYwNDBENDJFLCAweDhCMDc4ODAxLCAweDk2MjZENTJELAorMHg4ODAxNjA1MCwgMHg5NjIzOEIwQywgMHgwMDA5QTAwQSwgMHhBMDA3OTYyMSwKKzB4RTYwMDAwMDksIDB4MjI2MkQ0MjYsIDB4ODgwMTYwNDAsIDB4RTYwNDhCMDAsCisweEFFRjNFNDBBLCAweEQyMjQyMjYyLCAweEU0MEFFNjAxLCAweDIyNjJBRUVFLAorMHgyRkM2MkZCNiwgMHgyRkU2MkZENiwgMHhEQzIwNEYyMiwgMHg2MEMyRUQwMCwKKzB4Q0IwMUVCNjQsIDB4NjBDMjJDMDIsIDB4QTA0MUM5MDEsIDB4MDNDNDZFMDMsCisweDAzNDAwM0Q0LCAweDAwMUMzQjg4LCAweDAwMjAzMkM4LCAweDAwMjAxNEFBLAorMHgwMDIwMzJEMCwgMHgwMDIwMzJEOCwgMHgwMDIwMzJFMCwgMHgwMDIwMzJFOCwKKzB4MDAyNUU3MjAsIDB4MDAyMDM0QjgsIDB4MDAyMDMxOEMsIDB4MDAxQzU5NjgsCisweDAwMUQ0MDA0LCAweDAwMUMzNTAwLCAweDAwMjAxMjRBLCAweDAwMjAxMjc2LAorMHgwMDFDNTgxNCwgMHgwMDFDNTlEMCwgMHgwMDFDNTgzMCwgMHgwMDFDNjI2OCwKKzB4MDAxQzU5QTQsIDB4MDAxQzYzOUMsIDB4MDAyMDMxOUUsIDB4MDAxQzU4MDQsCisweDAwMjAzMTlELCAweDAwMjAzMTlGLCAweDAwMUM1ODFDLCAweDAwMUM1ODYwLAorMHg4OTA3M0RCMiwgMHhFNDBBNjBDMiwgMHhCRTlGQzkwMSwgMHg3RDAxNkUwMywKKzB4OEJGNTJFRTgsIDB4OEIwMzNEQjIsIDB4RDIzRUQ0M0QsIDB4MDAwOTQyMEIsCisweDRGMjZFNDBBLCAweDZERjY2RUY2LCAweEFFOEY2Q0Y2LCAweDQ0MTE2QkY2LAorMHg2MDRCOEYwMSwgMHgwMDBCNjA0MywgMHgyRkI2MDAwOSwgMHgyRkQ2MkZDNiwKKzB4NEYyMjJGRTYsIDB4REMzNDdGRkMsIDB4NjBDMkVEMDAsIDB4Q0IwMkVCNjQsCisweDYwQzIyQzAyLCAweEM5MDIyRjAyLCAweDZFMDNBMDA5LCAweDg5MDgzREIzLAorMHhFNDBBNjBDMiwgMHhDOTAyMkYwMiwgMHg2RTAzQkU3MCwgMHgyRUU4N0QwMSwKKzB4M0RCMzhCRjQsIDB4RDQyOThCMDgsIDB4N0YwNEQyMjYsIDB4NkVGNjRGMjYsCisweDZDRjY2REY2LCAweDZCRjY0MjJCLCAweDRGMjY3RjA0LCAweDZERjY2RUY2LAorMHgwMDBCNkNGNiwgMHhENTIyNkJGNiwgMHg2MDUyNTY1MSwgMHgwMDBCNDYyOCwKKzB4MkZCNjMwNkMsIDB4MkZENjJGQzYsIDB4NEYyMjJGRTYsIDB4NEYwMjRGMTIsCisweDZFNDNCRkYxLCAweERDMUI2QjAzLCAweEJGRUNERDFCLCAweDMwQjgwMDA5LAorMHgwNjBBM0MwNSwgMHg0NjA5NDYwOSwgMHgzRDY1NDYwMSwgMHg0MjA5MDIwQSwKKzB4NDIwOTQyMDksIDB4OEJGMDMyRTIsIDB4NEYxNjRGMDYsIDB4NkVGNjRGMjYsCisweDZDRjY2REY2LCAweDZCRjYwMDBCLCAweDRGMjIyRkU2LCAweEUxMDJERTBGLAorMHhFNDAzRTUwMCwgMHhCRkQ0MkUxMiwgMHhFNjA2MkU1MiwgMHhFNzAwNDYxOCwKKzB4MkU2MkU0MDMsIDB4NEYyNjJFNzIsIDB4NkVGNkFGQ0IsIDB4MDAwOTAwMEIsCisweDAwMjAzMkYwLCAweDAwMjAxNDVFLCAweDAwMUM1ODYwLCAweDAwMjAzMzA4LAorMHgwMDFDMTA0MCwgMHhDQ0NDQ0NDRCwgMHgxMDYyNEREMywgMHgwMDFENDAwNCwKKzB4MkY5NjJGODYsIDB4MkZCNjJGQTYsIDB4MkZENjJGQzYsIDB4NEYyMjJGRTYsCisweEU1MDA3RkQ4LCAweDY0NTNFMTEwLCAweDZDNTM0MTI4LCAweDY1NURFRTBBLAorMHg0NjA4NjY1MywgMHg0NjA4MzY1QywgMHgzNjFDNzUwMSwgMHg2NzVENjA0MywKKzB4NjBDMzBGNjYsIDB4MzdFM0VEMDAsIDB4ODE2MTI2QzEsIDB4ODE2MzgxNjIsCisweDE2RDMxNkQyLCAweDhGRUExNkQ0LCAweDY4RjI3NDA0LCAweERBQjNEOUIyLAorMHgyOTgyMTk4MSwgMHhEMUIyNTlGMSwgMHgyQTkyMUE5MSwgMHg1QkYzNUFGMiwKKzB4NUVGNTVERjQsIDB4MTFBMTU0RjYsIDB4MTFCMzIxQTIsIDB4MTFENTExQjIsCisweDExRTcxMUQ0LCAweDExNDkxMUU2LCAweDU1RjcxMTQ4LCAweEVFMDBEQkE5LAorMHhEREE5NTdGOCwgMHhENkE5NTJGOSwgMHgxQjUxNjRFMywgMHhEQkE4MkI1MiwKKzB4RUFCOEQ4QTgsIDB4MkQ3MkU5NDUsIDB4NkFBQzI2MjIsIDB4NkVFRDQ5MDgsCisweDREMDg2REUzLCAweDNERUM2MUUzLCAweDREMDg0MTA4LCAweDNEQkMzMUVDLAorMHg0MTA4NjBDMywgMHg4MUQxMkRDMSwgMHg0MTA4RTA1MCwgMHg0MTA4NDAwOCwKKzB4NjBDMzgxRDIsIDB4RTUwMDMxOEMsIDB4ODFEMzM0QTIsIDB4MUQxMzFERDIsCisweDhEMDFENDk0LCAweEQ0OTExRDU0LCAweEIwODE2NUQzLCAweDY0RUQ3RTAxLAorMHg4QkRDMzQ5MiwgMHhEQjk0RDE4RCwgMHhEMjhCNjgxMiwgMHgxQjgxNDgyOSwKKzB4MkZEMjY0MTIsIDB4MkI5MjY5NEQsIDB4RDk4QTY3MjIsIDB4MUI3MzQ3MjksCisweEQ3ODc2ODIyLCAweDFCQTI2QThELCAweEQyOEM2QjcyLCAweDIyQjJENTg2LAorMHhFMDAzNUQ3MiwgMHg1RTc0MTJEMiwgMHgxMkU0NDAxOCwgMHhENjg4NTE3NiwKKzB4NTQ3ODEyMTYsIDB4MTI0OEUxRkYsIDB4RDQ4NTY3OTIsIDB4Njg1MjEyN0EsCisweDI4QzFFNzAzLCAweDgxOTE2OTUyLCAweDZBNTJFMDUwLCAweDgxQTI0MDA4LAorMHg2MEMzNkI1MiwgMHg2RDUyODFCMywgMHg2RTUyMUREMiwgMHg2MjUyMUU2MywKKzB4MTI2NEU2MDAsIDB4NDYwODY1NjMsIDB4NzUwMTM2NEMsIDB4NjY1RDI2MTIsCisweDhCRjgzNjczLCAweEUwMDNENDcxLCAweDQwMTg2NTQyLCAweDY3NDIyNUMxLAorMHg4MTcxRDI3NCwgMHhFRTAwNjg0MiwgMHg2OTQyMTg4MiwgMHgxOTIzRTAyNCwKKzB4RTU4MDZBNDIsIDB4NkI0MjFBRTQsIDB4ODFCMjY2RTMsIDB4RDQ2RDZDNDIsCisweDY1NUM4MUMzLCAweDZENjM2NjZELCAweDYxNkQ3NjA0LCAweDMxNTMzRDRDLAorMHgyREUyOEZGOCwgMHhENTY5RDI2OCwgMHg3NDA0MjQyMiwgMHg3RjI4MjQ1MiwKKzB4NkVGNjRGMjYsIDB4NkNGNjZERjYsIDB4NkFGNjZCRjYsIDB4MDAwQjY5RjYsCisweDY2NDI2OEY2LCAweEM4MDM2MDYxLCAweEU1MDA4RDA0LCAweEM5MDM2MDYxLAorMHg4QjAzODgwMiwgMHg2NTYzNTI2MiwgMHgyNDEyNTEyNCwgMHg2MDUzMDAwQiwKKzB4MkZFNjJGRDYsIDB4N0ZFQzRGMjIsIDB4NjI1MzZFNTMsIDB4NkQ0M0U1NTAsCisweDQ1MDhFNDAwLCAweEUxMDFBMDAxLCAweDYwNDM1MjI0LCAweDgxMjEyMjExLAorMHg2MDUzODEyMywgMHg1NkUyODEyMiwgMHg4QkY1MzYyMCwgMHgxNkU0RDI1MCwKKzB4RTYxNDY0RjMsIDB4NjVFMzQyMEIsIDB4RTRGQzY1RTEsIDB4MkU1MTI1NDksCisweDY1RjM2MUYxLCAweDJGMTEyMTQ5LCAweEQxNDk1NEQxLCAweEU2MTQ0MTBCLAorMHg2MDcxNTdEMSwgMHgyNzAxQ0IwMSwgMHg3RjE0MURFMSwgMHg2RUY2NEYyNiwKKzB4NkRGNjAwMEIsIDB4MkZFNjJGRDYsIDB4N0ZFQzRGMjIsIDB4NjY1MzZFNTMsCisweDZENDNFNUZDLCAweDIwNTk2MDYxLCAweDI2MDFDQjAxLCAweDMyNjA1MkUyLAorMHgxMkU0OEIwNiwgMHgzMUUwNTFFMiwgMHg1MkQxOEIwNCwgMHgxRTIyQTAwMiwKKzB4NTY2NEFGRjAsIDB4NjRGM0QyMzYsIDB4NDIwQkU2MTQsIDB4NjdFMTY1RTMsCisweDI3MTlFMUZDLCAweDY3RjEyRTcxLCAweDI3MTk1NEQxLCAweDY1RjNEMTMwLAorMHg0MTBCRTYxNCwgMHg1MkQxMkY3MSwgMHhDQjAxNjAyMSwgMHgxREUxMjIwMSwKKzB4NEYyNjdGMTQsIDB4MDAwQjZFRjYsIDB4MkZFNjZERjYsIDB4NjI0QzRGMjIsCisweDQyMDhERTFCLCAweEEwMDU0MjAwLCAweDUyNTIzRTJDLCAweDU2MjRENDE3LAorMHgyRTYyQkY4RSwgMHg1MkUxNjVFMiwgMHg4QkY2MzUyMCwgMHgyNjIyRDYxQiwKKzB4MDAwQjRGMjYsIDB4MkZCNjZFRjYsIDB4MkZENjJGQzYsIDB4NEYyMjJGRTYsCisweERCMUNEQzEwLCAweDY2QzI1MkMxLCAweDg5NDAzNjIwLCAweEM5MDM2MDYxLAorMHg4OTNDODgwMSwgMHhERDE4REUwQiwgMHg2NEUzQkY2MywgMHg4NTAzNjUwMywKKzB4NjIwRDY2QjIsIDB4ODkyQjMyNjIsIDB4QkY5QkQ0MDMsIDB4RDQxMzAwMDksCisweDAwMDk0RDBCLCAweDAwMDlBRkU2LCAweDAwMjAyRDg4LCAweDAwMjAyRDkwLAorMHgwMDIwMkQ5OCwgMHgwMDIwMkRDMCwgMHgwMDIwMzFBNCwgMHgwMDIwMzFBQywKKzB4MDAxMDAwQzgsIDB4MDAxMDE2ODAsIDB4MDAxRTIxMDgsIDB4MDAxQzNEMDAsCisweDAwMTE3ODgwLCAweDAwMTE3NzgwLCAweDAwMDQwMDIwLCAweDAwMjZDNDAxLAorMHgwMDIwMEIyNiwgMHgwMDIwMzE4OCwgMHgwMDIwMTQ1RSwgMHgwMDIwMzMyNCwKKzB4NjRFM0JGM0UsIDB4NEQwQkQ0MDYsIDB4QUZCQjAwMDksIDB4RDIwNTAwMDksCisweDRGMjYyMjYyLCAweDZERjY2RUY2LCAweDAwMEI2Q0Y2LCAweDAwMDA2QkY2LAorMHgwMDIwMzMyOCwgMHgwMDFDM0QyOCwgMHgyRkM2MkZCNiwgMHgyRkU2MkZENiwKKzB4N0ZGQzRGMjIsIDB4NjAyMkQyMkIsIDB4OEQ0MUM4MDMsIDB4REUyQTJGMDEsCisweERCMkJEQzJBLCAweEVEMDFBMDE3LCAweEM5MDM2MDUxLCAweDg5MTY4ODAxLAorMHhEMTI4RDQyNiwgMHgwMDA5NDEwQiwgMHg2MTAzNTUwMywgMHhDODIwODU1MSwKKzB4RTA1MDg5MDMsIDB4NzIwMTAyQkUsIDB4RDIyMzBCMjYsIDB4NDIwQjY0RTMsCisweEQ2MjI2NTEzLCAweDUyQzEyNkQyLCAweDM1MjA2NUMyLCAweERFMjA4QkU0LAorMHhEQjIxREQyMCwgMHg1MkQxREMyMSwgMHgzNTIwNjVEMiwgMHg2MDUxODkxOCwKKzB4ODgwMUM5MDMsIDB4RDQxQjg5MTQsIDB4NDYwQkQ2MTYsIDB4NTcwMzAwMDksCisweDhGMDQzN0UwLCAweEUyMDE2NTAzLCAweEFGRUMyQjIwLCAweEQ0MTgyQzUyLAorMHg0MjBCRDIxOCwgMHhENjExMDAwOSwgMHg0MTE4RTEwMSwgMHgyNjEyQUZFMywKKzB4QzgwNDYwRjEsIDB4RDIxNDg5MDcsIDB4NEYyNjdGMDQsIDB4NkRGNjZFRjYsCisweDQyMkI2Q0Y2LCAweDdGMDQ2QkY2LCAweDZFRjY0RjI2LCAweDZDRjY2REY2LAorMHg2QkY2MDAwQiwgMHgwMDFFMjEwMCwgMHgwMDIwMkQ5OCwgMHgwMDIwMkQ5MCwKKzB4MDAyMDJEMkMsIDB4MDAyMDExNjIsIDB4MDAyMDExRTQsIDB4MDAxQzNEMzAsCisweDAwMTE3ODgwLCAweDAwMjAyRDg4LCAweDAwMjAzMUE4LCAweDAwMjAzMUE0LAorMHgwMDIwMkRDMCwgMHgwMDIwMTE4MCwgMHgwMDIwMDMwOCwgMHhFNjAxRDIwMywKKzB4MTI2NUQ1MDMsIDB4MDAwQjIyNTIsIDB4MDAwMDEyNjYsIDB4MDAxQzEwMTAsCisweDAwMDBDMzRGLCAweDAwMDkwMDBCLCAweDJGRDYyRkM2LCAweDRGMjIyRkU2LAorMHg2RDQzNkM1MywgMHhFRTAwQTAwNCwgMHg3RTAxNjRENCwgMHg2NDRDQkZGMiwKKzB4OEJGOTNFQzIsIDB4NkVGNjRGMjYsIDB4MDAwQjZERjYsIDB4RTUwMDZDRjYsCisweDY2NDNBMDAyLCAweDc2MDE3NTAxLCAweDIyMjg2MjYwLCAweEFGRTM4QkZBLAorMHgyRkU2MDAwOSwgMHg3NTA3NjI1MywgMHhFMTA4Njc1MywgMHg2MDQzRUUwQSwKKzB4NDQwOUM5MEYsIDB4NjUwMzMwRTIsIDB4OEQwMTQ0MDksIDB4RTYzMEU2MzcsCisweDQxMTAzNjVDLCAweDhGRjIyNzYwLCAweEUwMDA3N0ZGLCAweDAwMEI4MDI4LAorMHgwMDBCNkVGNiwgMHgwMDBCRTAwMCwgMHgyRkU2RTAwMCwgMHg3RkVDNEYyMiwKKzB4NkU0MzYyNTMsIDB4QkZEQzY1RjMsIDB4QkZEMDY0MjMsIDB4QkZDRTY0RTMsCisweEQ0MDM2NEYzLCAweDAwMDlCRkNCLCAweDRGMjY3RjE0LCAweDZFRjYwMDBCLAorMHgwMDIwMzMyQywgMHhFNEZERDI5QSwgMHhENzlBNjEyMiwgMHgyMjEyMjE0OSwKKzB4NzQwMTYwMjIsIDB4MjIwMkNCMDEsIDB4RDU5NzY2MjIsIDB4MjI2MjI2NDksCisweEM4NDA2MDcwLCAweDYwNTI4OTAyLCAweDI1MDJDQjA0LCAweEUxRjc2NDUyLAorMHgyNTQyMjQxOSwgMHhFNzAxNjA1MiwgMHgyNTAyQzlDRiwgMHhFNjAyNjA1MiwKKzB4MjUwMkNCMDMsIDB4MTU2MjQ3MTgsIDB4MTU3MzAwMEIsIDB4RDc4Q0Q1OEIsCisweEQ0OEREMjhDLCAweEU2MDBFMTAwLCAweDI3MTEyNTExLCAweEFGRDEyMjEwLAorMHg2NjRDMjQ2MSwgMHg0NjAwRDI4OSwgMHg2MDYwMzYyQywgMHgwMDBCQ0IxMCwKKzB4NjU0QzI2MDAsIDB4NDUwMEQyODUsIDB4NjY1MDM1MkMsIDB4MjYxOUUxRUYsCisweDI1NjAwMDBCLCAweEQyODI2NjRDLCAweDM2MkM0NjAwLCAweENCMTA2MDYwLAorMHgyNjAwMDAwQiwgMHhEMjdFNjU0QywgMHgzNTJDNDUwMCwgMHhFMUVGNjY1MCwKKzB4MDAwQjI2MTksIDB4NjY0QzI1NjAsIDB4NDYwMEQyNzgsIDB4NjA2MDM2MkMsCisweDAwMEJDQjA4LCAweDY1NEMyNjAwLCAweDQ1MDBEMjc0LCAweDY2NTAzNTJDLAorMHgyNjE5RTFGNywgMHgyNTYwMDAwQiwgMHhEMjcxNjY0QywgMHgzNjJDNDYwMCwKKzB4Q0IwODYwNjAsIDB4MjYwMDAwMEIsIDB4RDI2RDY1NEMsIDB4MzUyQzQ1MDAsCisweEUxRjc2NjUwLCAweDAwMEIyNjE5LCAweDYyNEMyNTYwLCAweDQyMDBENjY3LAorMHg2MDIwMzI2QywgMHg0MDIxQzkwOCwgMHg0MDIxNDAyMSwgMHg2MDBDMDAwQiwKKzB4RDY2MzYyNEMsIDB4MzI2QzQyMDAsIDB4QzkwODYwMjAsIDB4NDAyMTQwMjEsCisweDAwMEI0MDIxLCAweEQxNUY2MDBDLCAweDM0MUM2NDRDLCAweDAwMEI2MjQwLAorMHhEMTVENjAyQywgMHgzNDFDNjQ0QywgMHgwMDBCNjI0MCwgMHgyRkU2NjAyQywKKzB4NkU0MzRGMjIsIDB4RTYwQTY0NUMsIDB4ODkxNDM0NjcsIDB4MDAwOUJGRUIsCisweDYwRUM2NDBDLCAweDhCMDI4ODAxLCAweEEwMDJFMDBGLCAweDQ0MDkyNDA5LAorMHg2MjRDNDQwOSwgMHgzMjYzRTYwQSwgMHhCRkUyODkwNSwgMHg2MjBDNjQ0QywKKzB4Qzg4MDYwMjMsIDB4RTIwMDhCMDAsIDB4NEYyNjYwMjMsIDB4NkVGNjAwMEIsCisweEQ2NEE0RjIyLCAweDg4MDE2MDYyLCAweEIyNDU4QjAzLCAweEEwMDMwMDA5LAorMHhEMjQ3MDAwOSwgMHgyMjYwRTY0MCwgMHhFMjAwRDY0NiwgMHgwMDBCNEYyNiwKKzB4NEYyMjI2MjIsIDB4NjA2MkQ2NDEsIDB4OEIwMTg4MDIsIDB4MDAwOUIyOEUsCisweEUyMDBENjQwLCAweDAwMEI0RjI2LCAweEQ1M0MyNjIyLCAweEUxMDBENDNDLAorMHgyNTEyRTcwMSwgMHgyNDcwMDAwQiwgMHhFNjA0RDIzOSwgMHgyMjYwMDAwQiwKKzB4RDQzOTRGMjIsIDB4NDEwQkQxMzksIDB4RDUzOTAwMDksIDB4NjY1MEUxRkQsCisweDI2MTlEMjM4LCAweDI1NjBFNzAwLCAweDAwMEI0RjI2LCAweDRGMjIyMjcwLAorMHhEMTMyRDQzNSwgMHgwMDA5NDEwQiwgMHhFN0ZCRDUzMSwgMHgyNjc5NjY1MCwKKzB4MDAwQjRGMjYsIDB4NEYyMjI1NjAsIDB4RDEyQ0Q0MzAsIDB4MDAwOTQxMEIsCisweEU3RjdENTJCLCAweDI2Nzk2NjUwLCAweDAwMEI0RjI2LCAweEQ1MjgyNTYwLAorMHg2MjUwOTQyRCwgMHgwMDBCMjI0OSwgMHhENTI1MjUyMCwgMHg2MjUwRTRCRiwKKzB4MDAwQjIyNDksIDB4NEYyMjI1MjAsIDB4ODUyMkQyMjUsIDB4MjAwODYwMEQsCisweDg4MDE4OTExLCAweDg4MDM4OTEzLCAweDg4MDU4OTE1LCAweDg4MDY4OTQyLAorMHg4ODA4ODk0OCwgMHg4ODA5ODk0RSwgMHg4ODBBODk1NCwgMHg4ODBCODk1QSwKKzB4QTA2Nzg5NjAsIDB4QjA2OTAwMDksIDB4QTA2NDAwMDksIDB4QjA3NzYwMEMsCisweEEwNjAwMDA5LCAweEIwODA2MDBDLCAweEEwNUMwMDA5LCAweEZGN0Y2MDBDLAorMHgwMDFFMjE0OCwgMHgwMDFFMTAwMCwgMHgwMDFFMTEwOCwgMHgwMDIwMzFGQywKKzB4MDAyMDMxRkUsIDB4MDAyMDMyMUQsIDB4MDAyMDMxRTAsIDB4MDAxRTEwM0YsCisweDAwMUUxMDVGLCAweDAwMUUxMDJGLCAweDAwMUUxMDkwLCAweDAwMjAzMjA0LAorMHgwMDFFMTAwQiwgMHgwMDIwMzIwMCwgMHgwMDIwMzMzMCwgMHgwMDIwMTQ1RSwKKzB4MDAxRTEwMjgsIDB4MDAyMDMyMUMsIDB4MDAyMDMzM0MsIDB4MDAyMDMzNEMsCisweDAwMjAzMUQ0LCAweDYyNjBENjg0LCAweDhCMkIyMjI4LCAweDAwMDlCMDYxLAorMHg2MDBDQTAyOSwgMHg2MjYwRDY4MCwgMHg4QjIzMjIyOCwgMHgwMDA5QjA2OSwKKzB4NjAwQ0EwMjEsIDB4NjI2MEQ2N0MsIDB4OEIxQjIyMjgsIDB4MDAwOUIwQzcsCisweDYwMENBMDE5LCAweDYyNjBENjc4LCAweDhCMTMyMjI4LCAweDAwMDlCMENELAorMHg2MDBDQTAxMSwgMHg2MjYwRDY3NCwgMHg4QjBCMjIyOCwgMHgwMDA5QjEyNSwKKzB4NjAwQ0EwMDksIDB4NjI2MEQ2NzAsIDB4OEIwMzIyMjgsIDB4MDAwOUIxM0QsCisweDYwMENBMDAxLCAweDRGMjZFMDAwLCAweDAwMDkwMDBCLCAweEQyNkNEMTZCLAorMHhENTZDODQxMiwgMHg0MDAwQzkwRiwgMHhENzZCMDEyRCwgMHhFNDAzRDY2QiwKKzB4RTIwRjYxMUMsIDB4MjU0MEUwMDEsIDB4MjUyMDI3MTIsIDB4MjYwMjAwMEIsCisweEU2MDFEMjYyLCAweDMwNjY4NTIzLCAweEUwMDA4RDA1LCAweEQ2NjNEMjYwLAorMHhFMDAxODEyMiwgMHgwMDBCMjYwMiwgMHhEMjVDMDAwOSwgMHg2MDBEODUyMywKKzB4ODkwNTIwMDgsIDB4OEIwQTg4MDEsIDB4NjA2MEQ2NUQsIDB4MjYwMENCMDEsCisweEQ0NTdENjVBLCAweEUwMDFFMTAxLCAweDAwMEIyNjEyLCAweDAwMEI4MTQyLAorMHhEMTUyRTAwMCwgMHg4NTEzRTUwMSwgMHg2NDBENDUxOCwgMHg2NjAzMzQ1MywKKzB4RTAwMDhEMDUsIDB4RDU1MUQyNTMsIDB4MjI2MEUwMDEsIDB4MDAwQjI1MDIsCisweDRGMjIwMDA5LCAweDg1MTNEMTQ5LCAweDY0NTM2NTBELCAweDYyNDk0NDE5LAorMHgyMjdENjcyRSwgMHg4ODAxNjAyQywgMHg4ODAyODkwOSwgMHg4ODAzODkxMCwKKzB4ODgwNjg5MUEsIDB4ODgwNzg5MzUsIDB4QTA0Qzg5M0IsIDB4RDU0NjAwMDksCisweDY2NTJENzQ2LCAweDI3NjJENDQ2LCAweDYyMkM2MjYxLCAweDI0MjFBMDM4LAorMHgyMjI4NjI1QywgMHhENDQzOEIzRiwgMHg2NjQyRDU0MCwgMHgyNTYyRDQ0MCwKKzB4MjQwMTg1NjEsIDB4NjIwM0EwMkMsIDB4MjAwODYwNUMsIDB4ODgxMDg5MDcsCisweDg4MjA4OTA4LCAweDg4MzA4OTA5LCAweEEwMkM4OTBBLCAweEQyM0EwMDA5LAorMHg2MjIyQTAwOCwgMHhBMDA1RDIzOSwgMHhEMjM5NjIyMiwgMHg2MjIyQTAwMiwKKzB4NjI2MkQ2MzgsIDB4RDQzMkQ1MzEsIDB4NjYyMTI1MjIsIDB4QTAwRjYyNkMsCisweEQ2MzUyNDIxLCAweDYyNjFENTJELCAweDYyMkNENDJELCAweEEwMDcyNTYyLAorMHhENjMyMjQyMSwgMHg4NTYxRDUyOSwgMHgyNTYyRDQyOSwgMHg2MjAzMjQwMSwKKzB4NjYyRDg1MTUsIDB4MzYxNzYxMEQsIDB4NjUwMzhGMDEsIDB4QjBDQjI0NTEsCisweEEwMDEwMDA5LCAweEUwMDBFMDAxLCAweDAwMEI0RjI2LCAweEQ2MTkwMDA5LAorMHhENDI3RTEwMSwgMHg2NTQxMjYxMCwgMHhEMTE4RDcxNywgMHhFMjBGNjU1RCwKKzB4Mjc1MkUwMDEsIDB4MDAwQjI2MjAsIDB4MkZFNjIxMDIsIDB4RDIwRjRGMjIsCisweDY0MEM4NTIzLCAweDhCMDgyNDQ4LCAweEQ1MTFENjFELCAweDI2MjFFMjAwLAorMHg5NDBGODQ1MSwgMHhBMDQ4MjA0OSwgMHhERTBEODA1MSwgMHhDODQwNjBFMCwKKzB4RTIwMThEMzIsIDB4ODk0NDM0MjcsIDB4RDIxNkQ2MTUsIDB4MjY0MTQyMEIsCisweDAwMDlBMDMwLCAweDAwMDBGRjdGLCAweDAwMjAzMjFELCAweDAwMjAzMUQ0LAorMHgwMDIwMzFFMCwgMHgwMDFFMTEwMCwgMHgwMDFFMTAwQywgMHgwMDIwMzIwMCwKKzB4MDAxRTEwMDAsIDB4MDAxRTEwMDEsIDB4MDAyMDMyMDgsIDB4MDAyMDMxRTgsCisweDAwMjAzMUVDLCAweDAwMjAzMUYwLCAweDAwMjAzMjBDLCAweDAwMjAzMjEwLAorMHgwMDIwMzIxNCwgMHgwMDIwMzIxOCwgMHgwMDIwMzUxQywgMHgwMDIwMzUyNiwKKzB4MDAyMDMxRkEsIDB4MDAyMDIzNjIsIDB4ODkxMjM0MjcsIDB4RDI5NEQ2OTMsCisweDI2NDE0MjBCLCAweENCODA4NEUxLCAweDgwRTFCMEY1LCAweEQ2OTE2MEUwLAorMHgyRTAwQ0IwNCwgMHhDOTNGNjA2MCwgMHhENjhGMjYwMCwgMHhBMDAxRTAwMSwKKzB4RTAwMDI2MDIsIDB4MDAwQjRGMjYsIDB4RDY4QzZFRjYsIDB4Qzg4MDYwNjAsCisweEQyODY4OTE5LCAweDg4MDE2MDIxLCAweEQyODk4QjE1LCAweDg1MjRFNTAxLAorMHg4OTEwMzA1NiwgMHhFMjAzRDE4NywgMHgyMTIwRDQ4NywgMHhFMDBCNjU0MSwKKzB4MDY1NjY1NUQsIDB4RTQwRkQ1ODUsIDB4MjE0MEU3MDIsIDB4RDc3RTI1NzEsCisweDAwMEJFMDAxLCAweDAwMEIyNzAyLCAweDJGRTZFMDAwLCAweERFODA0RjIyLAorMHhDODgwODRFMSwgMHhENTdBODkyQywgMHgyMDA4ODU1NCwgMHg2MTAzOEYyOCwKKzB4ODU1M0Q3N0MsIDB4NjQwMzY2NzIsIDB4ODU2NjY1MEMsIDB4MzUyMDYyMEMsCisweEQ2Nzk4QjFFLCAweDY1MUNENzc0LCAweDI2NTE2NDRDLCAweDYwRTAyNzQxLAorMHg4OTA0Qzg0MCwgMHg0MjBCRDI3NSwgMHhBMDAzMDAwOSwgMHhEMjY4MDAwOSwKKzB4MDAwOTQyMEIsIDB4MDAwOUIwOUYsIDB4RTIwMUQxNjcsIDB4NjBFMDIxMjIsCisweENCMDRENDY0LCAweDYwNDAyRTAwLCAweDI0MDBDOTNGLCAweDYwMjNBMDAxLAorMHg0RjI2RTAwMCwgMHg2RUY2MDAwQiwgMHgyRkI2MkZBNiwgMHgyRkQ2MkZDNiwKKzB4REE2MjJGRTYsIDB4NjZBMUUyNDAsIDB4MzYyMkRDNUUsIDB4NjI2Mzg5MDAsCisweDZFRDM2RDJDLCAweDRFMjEzNkQ4LCAweDRFMjEyQTYxLCAweERCNjFENDYwLAorMHhFNzAwQTAwRiwgMHg3NzAxNjJCMiwgMHg3MTAyNjEyMywgMHg2NjIxMkIxMiwKKzB4NzEwMjYyMTMsIDB4NjEyMTJCMTIsIDB4NjUxRDY2NkQsIDB4MzU2QzQ1MjgsCisweDYyN0MyNDUyLCAweDhCRUQzMkUzLCAweEM5MDM2MEQzLCAweDhCMTA4ODAzLAorMHg2MTczNjdCMiwgMHgyQjEyNzEwMiwgMHg3MTAyNkUxMywgMHgyQjEyNjU3MSwKKzB4NjU1RDZERTEsIDB4NDIyODYyREQsIDB4MzI1Q0UxMDcsIDB4QTAwQzJDMTAsCisweDg4MDIyNDIyLCAweEEwMDM4QjAxLCAweDg4MDFFMjAzLCAweEUyMDE4QjA1LAorMHg2NkIyMkMyMCwgMHg2NTVENjU2MSwgMHhFNjBGMjQ1MiwgMHg2N0ExMkM2MCwKKzB4OEIwNTI3NzgsIDB4REQzOERDNDQsIDB4RUIwMUVBMDAsIDB4MkRCMjJDQTIsCisweDZERjY2RUY2LCAweDZCRjY2Q0Y2LCAweDZBRjYwMDBCLCAweDJGRTYyRkQ2LAorMHhFMjQwREQzNiwgMHgzNjIyNjZEMSwgMHg2MjYzODkwMCwgMHgzNjc4NjcyQywKKzB4NzcwM0RFMzgsIDB4NDcyMTJENjEsIDB4NjRFMkQ2MzUsIDB4QTAwRTQ3MjEsCisweDY1NjJFMTAwLCAweDYyNTM3MTAxLCAweDc0MDEyNDUwLCAweDI0MjA0MjE5LAorMHg0NTI5NzQwMSwgMHg3NDAxMjQ1MCwgMHgyNDUwNDUxOSwgMHg2MjFDNzQwMSwKKzB4OEJFRTMyNzMsIDB4NjZFMjQyMDAsIDB4NDIwMDYxRDEsIDB4MjExODM2MkMsCisweDJFNjI4RjA2LCAweEREMUNENzI4LCAweEU1MDFFNDAwLCAweDJENTIyNzQyLAorMHgwMDBCNkVGNiwgMHgyRkQ2NkRGNiwgMHg0RjIyMkZFNiwgMHhFRDBBRUUwMSwKKzB4NjRFM0JDOTcsIDB4QkM5QzY0RTMsIDB4NjJFQzdFMDEsIDB4OEJGNzMyRDcsCisweEJDOUZFRTAxLCAweDY0RTM2NEUzLCAweDdFMDFCQ0E0LCAweDMyRDc2MkVDLAorMHg0RjI2OEJGNywgMHgwMDBCNkVGNiwgMHhEMTE4NkRGNiwgMHhENDE4OTIwRCwKKzB4NzIxMjIxMjIsIDB4MjQyMkQ2MTcsIDB4RDcxNzcyMDQsIDB4NzIyMDI2MjIsCisweDI3MjJEMTE2LCAweDAwMEI3MjMwLCAweDEzN0EyMTIyLCAweDAwMjAzMUZBLAorMHgwMDIwMjQ2RSwgMHgwMDFFMTAxNSwgMHgwMDIwMzIwMCwgMHgwMDFFMTAwMSwKKzB4MDAyMDMxRDQsIDB4MDAxRTExMDAsIDB4MDAyMDMxRkUsIDB4MDAyMDMxRUMsCisweDAwMUUxMDAwLCAweDAwMjAzMUYwLCAweDAwMjAzMUZDLCAweDAwMjAyMzYyLAorMHgwMDFFMTAwQywgMHgwMDIwMzFFOCwgMHgwMDIwMzIwNCwgMHgwMDIwMzIwOCwKKzB4MDAyMDMyMEMsIDB4MDAyMDMyMTAsIDB4MDAyMDMyMTQsIDB4MDAyMDMyMTgsCisweDRGMjIyRkU2LCAweEQ2NTA3RkZDLCAweDg4MDE2MDYwLCAweEUyMDE4OTUxLAorMHgyNjIwQkZCQiwgMHhENTRFRDE0RCwgMHhERTRFNjAxMCwgMHg2NEUzNjU1MiwKKzB4NzQwMkM4NDAsIDB4OEQyMkQxNEMsIDB4RDI0Qzc1MDIsIDB4RTYwMUQ3NEMsCisweEU3MDQyNzIyLCAweDc2MDE2MjU1LCAweDYyNkMyNDIxLCAweDhGRjkzMjczLAorMHhENDQzNzQwMiwgMHg2MjQyRTYwMSwgMHg2NDBEODUyOCwgMHg2NzQ5NDQxOSwKKzB4Mjc1RDY1N0UsIDB4ODFFNDYwN0MsIDB4RTQxN0Q1NDIsIDB4Njc1NTc2MDEsCisweDMyNDM2MjZDLCAweDhGRjkyMTcxLCAweEEwMjA3MTAyLCAweEQyM0UwMDA5LAorMHhFNjAxRDczQiwgMHhFNzA0MjcyMiwgMHg3NjAxNjI1NSwgMHg2MjZDMjQyMSwKKzB4OEZGOTMyNzMsIDB4RDQzMjc0MDIsIDB4NjI0MkU2MDEsIDB4NjQwRDg1MjgsCisweDY3NDk0NDE5LCAweDI3NUQ2NTdFLCAweDgxRTQ2MDdDLCAweEU0MTdENTMzLAorMHg2NzU1NzYwMSwgMHgzMjQzNjI2QywgMHg4RkY5MjE3MSwgMHg5MjRBNzEwMiwKKzB4RDIyNjJFMjEsIDB4NUUyM0Q3MkUsIDB4NjRGMjJGRTIsIDB4NjA0MzY1RjIsCisweDI3MDBDOTgwLCAweEM5NjA2MDQzLCAweDgwNzE2MTAzLCAweEM5MDM2MDQzLAorMHg4MDcyNDUxOSwgMHg2NUYyNjA1QywgMHg4MTcyNjZGMiwgMHg0NjE5NDYyOSwKKzB4NjA2QzQ1MjksIDB4NDAxODY0NUMsIDB4ODE3MzMwNEMsIDB4MjExODVFMjMsCisweDY0RjIyRkUyLCAweDZFNEM2MkYyLCAweDYwMkM0MjE5LCAweDY2RjI2MkYyLAorMHg0NjI5NDAxOCwgMHg0NjE5MzBFQywgMHg0MjI5ODE3NCwgMHg2NTJDNjA2QywKKzB4MzA1QzQwMTgsIDB4ODE3NThGMDcsIDB4MDAwOUJDOUQsIDB4MjIyODYyMEMsCisweEEwMEE4OTA4LCAweDYwMTMwMDA5LCAweDhCMDM4ODQwLCAweDAwMDlCMDA5LAorMHgwMDA5QTAwMywgMHhFMjAyRDYwRiwgMHg3RjA0MjYyMiwgMHgwMDBCNEYyNiwKKzB4MDAwQjZFRjYsIDB4MDYwQTAwMDksIDB4MDAyMDMyMUMsIDB4MDAxRTEwMDAsCisweDAwMjAzMjA4LCAweDAwMjAzNTFDLCAweDAwMjAzNTI4LCAweDAwMjAzNEMwLAorMHgwMDIwMzFGMCwgMHgwMDIwMzRGMCwgMHgwMDIwMzRFRSwgMHgwMDIwMzRDMiwKKzB4MDAyMDMxRDQsIDB4MDAyMDMyMDAsIDB4NEYyMjJGRTYsIDB4REU5MzdGRkMsCisweDIwMDg4NEU5LCAweDJGMDA4RDA2LCAweEQ2OTJENDkxLCAweDAwMDk0NjBCLAorMHg2NEYwQjE5NCwgMHg2NjIwRDI5MCwgMHg4OTAyMjY2OCwgMHhDOUJGNjBFMCwKKzB4N0YwNDJFMDAsIDB4MDAwQjRGMjYsIDB4MDAwQjZFRjYsIDB4MkZFNjAwMDksCisweERFOEE0RjIyLCAweDYwRTBENjhBLCAweENCQzBENDhBLCAweDYyNjAyRTAwLAorMHhDODAzNjAyQywgMHg0MDIxODkwNCwgMHg3MDAxNDAyMSwgMHg2NjAzQTAwMiwKKzB4NjYwMzQwMDksIDB4RDY4NDYxNkQsIDB4RTUwMEEwMDQsIDB4NzUwMTYyNjIsCisweDc0MDQyNDIyLCAweDMyMTM2MjVELCAweEQyODA4QkY4LCAweDAwMDk0MjBCLAorMHhDOUJGODRFMiwgMHg0RjI2ODBFMiwgMHg2RUY2MDAwQiwgMHgyRkU2MkZENiwKKzB4N0ZGQzRGMjIsIDB4NjI2MEQ2N0EsIDB4ODk0NDIyMjgsIDB4RDU2RkUxMDAsCisweDYwNTAyNjEwLCAweENCNDBENDc3LCAweDI1MDA0NDBCLCAweDhEMDUyMDA4LAorMHg2MkUwNkUwMywgMHg3MTA0NjEyQywgMHgyRjExQTAwNiwgMHhENDcyRDY2QSwKKzB4REQ3MjY3NjAsIDB4NjU3QzREMEIsIDB4RTIzQzZEMUQsIDB4OEIwMzNEMjcsCisweEQyNjRENDZGLCAweDAwMDk0MjBCLCAweDREMjE0RDIxLCAweEEwMDVENzZELAorMHg2NkU2RTQwMCwgMHgzNTdDNDUwOCwgMHg3NDAxMjU2MiwgMHgzNUQzNjU0RCwKKzB4RDc2OThCRjcsIDB4NjE3MkUwMDMsIDB4ODExMTQwMTgsIDB4NkU3MjYwRjEsCisweDgxRTI3MDBDLCAweEQ0NjU2MTcyLCAweERENjU4MTEzLCAweDREMEJERTY1LAorMHhFMjAxNjU3MiwgMHhENDY0MkUyMiwgMHg0MjBCRDI1MiwgMHhENjUzMDAwOSwKKzB4QzkzRjYwNjAsIDB4N0YwNDI2MDAsIDB4NkVGNjRGMjYsIDB4NkRGNjAwMEIsCisweDJGQzYyRkI2LCAweDJGRTYyRkQ2LCAweEQyNUM0RjIyLCAweDZCNDM2RTczLAorMHg0MjBCNkM1MywgMHgyMDA4NkQ2MywgMHg2MTAzOEYwOCwgMHhEMjQ1RDQ1OCwKKzB4NkVGNjRGMjYsIDB4NkNGNjZERjYsIDB4NkJGNjQyMkIsIDB4MjFCMDYwQzMsCisweDYwRDM4MDExLCAweEU1MDA4MTExLCAweDY0QkNBMDA3LCAweDYwNTM2NTVELAorMHg2NjUzMDBFQywgMHg3NTAxMzYxQywgMHg2MjVEODA2NCwgMHg4QkY1MzI0MywKKzB4NjA2MEQ2MzYsIDB4MjYwMEM5QkYsIDB4NkVGNjRGMjYsIDB4NkNGNjZERjYsCisweDZCRjYwMDBCLCAweDdGQzQ0RjIyLCAweDcyMDI2MkYzLCAweDIyNTEyRjQxLAorMHg0NTI5NzIwMiwgMHg2MDYzMjI1MSwgMHhFNUM0RTY4MiwgMHg2N0YzODEyMSwKKzB4NjU1QzY2NkMsIDB4RTQwOEJGQkMsIDB4NEYyNjdGM0MsIDB4MDAwOTAwMEIsCisweDJGOTYyRjg2LCAweDJGQjYyRkE2LCAweDJGRDYyRkM2LCAweDRGMjIyRkU2LAorMHhFMTAwN0ZDNCwgMHg2NTEzRUNGRiwgMHg2QjEzNkNDRCwgMHhERTM2RDczNSwKKzB4RURGRjY0RjMsIDB4RDgzNUVBMDQsIDB4NjA1MzY1NUMsIDB4MDI3RDQwMDAsCisweDMyQzA2MjJELCAweDY2MDM4RDBELCAweDA5RUQ2MDYzLCAweDI0OTEwMjdELAorMHgyNDIxNzQwMiwgMHg2OTgyMDJFRCwgMHgzOTI4NjIyRCwgMHg3NDAyMjg5MiwKKzB4NzUwMTcxMDQsIDB4NjA2MzYyNUMsIDB4MDdENTMyQTIsIDB4MEVCNThGRTQsCisweDI0NDg2NDFDLCAweEU2ODA4OTA1LCAweDY3RjNFNUM1LCAweEJGN0Y2NjZDLAorMHg3RjNDNjU1QywgMHg2RUY2NEYyNiwgMHg2Q0Y2NkRGNiwgMHg2QUY2NkJGNiwKKzB4MDAwQjY5RjYsIDB4RDExRTY4RjYsIDB4NjAxMkQyMUUsIDB4Q0IyMEU0MDUsCisweDIxMDJFNTAwLCAweDAwMEIyMjQyLCAweDAwMDAyMjUyLCAweDAwMUUxMDE3LAorMHgwMDIwMzM1OCwgMHgwMDIwMTQ1RSwgMHgwMDIwMzFBMiwgMHgwMDFFMTAxNSwKKzB4MDAxRTEwQkYsIDB4MDAxMTc4MDAsIDB4MDAxRTEwRkMsIDB4MDAyMDAzMDgsCisweDAwMjAzMUE4LCAweDAwMjAyNUM2LCAweDAwMjAzMzVDLCAweDAwMjAxNEFBLAorMHgwMDIwMzM3OCwgMHgwMDExNzg4QywgMHgwMDIwMzFBNCwgMHgwMDIwMkQ4OCwKKzB4MDAyMDExRTQsIDB4MDAxRTIxMzAsIDB4MDAyMDMzODAsIDB4MDAyMDI1ODgsCisweDAwMjAzMzg0LCAweDAwMjAzMUJDLCAweDAwMjAzMUM0LCAweDAwMjAzNEJDLAorMHgwMDFDMzUwMCwgMHgwMDFENDAwNCwgMHhENTY1RDE2NCwgMHhFNDAwRDc2NSwKKzB4MjE0MkUyMEYsIDB4MTc0MTExNTQsIDB4RDU2MzI3MjIsIDB4OTY2OUQ3NjMsCisweDE1NDEyNTcyLCAweDk2NjYxNTYyLCAweEU2MDExNTY1LCAweEQ1NjAxMTY1LAorMHg2NjZDRTZGOCwgMHgyNTQyMjU0MiwgMHgyNTQyMjU0MiwgMHgyNTQyMjU0MiwKKzB4MjU2MjI1NDIsIDB4NzYwMUU3MjcsIDB4Njc2MzI1NzIsIDB4MjU2Mjc3OTcsCisweEU3MDQyNTcyLCAweDI1NzJFMjQ4LCAweEUyMTkyNTIyLCAweEUyNzAyNTIyLAorMHgyNTQyMjU0MiwgMHgyNTQyMjU0MiwgMHgyNTIyMjU0MiwgMHgyNTIyRTIwQywKKzB4MjU0MjI1NDIsIDB4MjU0MjI1NDIsIDB4MjU0MjI1NDIsIDB4MjU0MjI1NDIsCisweDAwMEIxNTRBLCAweEUyMDgxMTQ1LCAweDAwMDk0MjJCLCAweDJGRTYyRkQ2LAorMHg3RkZDNEYyMiwgMHhDODIwNjA0MywgMHg2RTQzOEQwMiwgMHgwMDA5QkU2RCwKKzB4QzgxMDYwRTMsIDB4QkU2QTg5MDEsIDB4NjBFMzAwMDksIDB4ODkwMUM4NDAsCisweDAwMDlCRThDLCAweEM4MDE2MEUzLCAweEREM0U4OTM4LCAweEM4MDI2MEQwLAorMHgyRjAwOEQwMywgMHg0NjBCRDYzQywgMHg2MEYwMDAwOSwgMHg4OTAyQzgwNCwKKzB4NDYwQkQ2M0EsIDB4NjJGMDAwMDksIDB4Qzg4MDYwMjMsIDB4NjBEMDg5MDIsCisweDJEMDBDOTdGLCAweEM4MDE2MDIzLCAweEQ2MzU4OTA2LCAweDAwMDk0NjBCLAorMHgwMDA5QTAwNywgMHg1MTYzMDYwMSwgMHg4OTAyQzgwOCwgMHg0NjBCRDYzMSwKKzB4NjBGMDAwMDksIDB4ODkwMkM4MTAsIDB4NDIwQkQyMkYsIDB4RDUyRjAwMDksCisweDg4MDI2MDUyLCAweEQyMkU4QjAzLCAweEEwMDVFNjA0LCAweDg4MDEyMjYwLAorMHhEMjJCOEIwMiwgMHgyMjYwRTYwMSwgMHgyNTIyRTIwMCwgMHhDODgwNjBFMywKKzB4RDYyODg5MkUsIDB4NjBFMzZFNjAsIDB4ODkwMkM4ODAsIDB4NDIwQkQyMjYsCisweDYwRTMwMDA5LCAweDg5MDJDODQwLCAweDQyMEJEMjI0LCAweDYwRTMwMDA5LAorMHg4OTAyQzgwMiwgMHg0MjBCRDIyMiwgMHg2MEUzMDAwOSwgMHg4OTBFQzgwNCwKKzB4NDEwQkQxMjAsIDB4QkYwRTAwMDksIDB4QkY0RDAwMDksIDB4RDUxRTAwMDksCisweDYwNTBENDFFLCAweEM5MDhENzFFLCAweEJGODQyNTAwLCAweDYwRTMyNDcyLAorMHg4OTA1QzgwOCwgMHg3RjA0RDIxQiwgMHg2RUY2NEYyNiwgMHg2REY2NDIyQiwKKzB4NEYyNjdGMDQsIDB4MDAwQjZFRjYsIDB4MDAwMDZERjYsIDB4MDAxQzU4MUMsCisweEEwMDBBMDAwLCAweDAwMUQwMTAwLCAweDAwMUQ0MDAwLCAweDAwMDQwMDIxLAorMHgwMDFDNTg5QywgMHgwMDFFMTAyMSwgMHgwMDIwMTY0MCwgMHgwMDIwMTY2MiwKKzB4MDAyMDFDQTAsIDB4MDAyMDE2N0EsIDB4MDAyMDE2ODgsIDB4MDAyMDMyMDAsCisweDAwMUUxMDBCLCAweDAwMUUxMDI4LCAweDAwMjAxNkRFLCAweDAwMjAxNkVBLAorMHgwMDIwMTY5MCwgMHgwMDIwMTZBRSwgMHgwMDFFMTAwMCwgMHgwMDEwRjEwMCwKKzB4MTIzNDU2NzgsIDB4MDAyMDE2QzYsIDB4NjQ0Q0Q2QTcsIDB4MDAwQjM0NkMsCisweEQ2QTYyNDUwLCAweDM0NkM2NDRDLCAweDI0NTAwMDBCLCAweDY0NENENkE0LAorMHgwMDBCMzQ2QywgMHg2MjVDMjQ1MCwgMHg0MjA4NjE2RCwgMHg0MjA4NDExOSwKKzB4NDIwMDYwMTksIDB4NjcwRTYxNEMsIDB4RDQ5RTMyMUMsIDB4NDIwMDIwN0QsCisweDMyNENDOTBGLCAweDIyMDAwMDBCLCAweDQyMDg2MjVDLCAweDQyMDA0MjA4LAorMHgzMjRDNjQ0QywgMHg0MjAwRDQ5OCwgMHgwMDBCMzI0QywgMHgyRkU2MjI2MCwKKzB4NjE0QzRGMTIsIDB4NDEwMEQ0OTMsIDB4NjcxMDMxNEMsIDB4RTI5RjY2NkQsCisweDI3Mjk0NjE5LCAweDZFNTM2MjY5LCAweDY3MkU2NTczLCAweDQyMjEyMjdELAorMHg0MjIxNDIyMSwgMHg3NjAxNjYyQywgMHhFNDAxNDYwOCwgMHgzNEU4NDYwOCwKKzB4NjQ0QzQ2MDAsIDB4MDcxQTA0NjcsIDB4MjE1MDI1N0IsIDB4MDAwQjRGMTYsCisweDRGMjI2RUY2LCAweEQyODU3RkU4LCAweDg4MDE2MDIxLCAweEQyODQ4QjdCLAorMHgyNjY4NjYyMSwgMHhEMjgzOEI3NywgMHgyNjY4NjYyMSwgMHhFNTBGOEI3MywKKzB4RTQwMUJGQTIsIDB4QkZBNEU1MDEsIDB4RTU4NkU0MDAsIDB4RTQwMDY1NUMsCisweDJGNTBCRkE0LCAweEJGQTFFNDAxLCAweEU2MDJFNTA2LCAweDYwNjM0NjE4LAorMHg4MUYyRTQwMSwgMHg2NTQzQkY5RiwgMHhFNDAxODVGMiwgMHhCRkFCNjU0MywKKzB4ODVGMjY2MDMsIDB4NjU0M0U0MDEsIDB4NjYwM0JGQjEsIDB4RTQwMjY1RjAsCisweDYwNTM3NTZDLCAweDgwRjhCRjgwLCAweEJGODJFNDAyLCAweDg0RjhFNTEyLAorMHg3MDkwRTQwMiwgMHg2NTAzQkY4MiwgMHg0NjE4RTYwMiwgMHg4MUY2NjA2MywKKzB4QkY4MEU0MDIsIDB4ODVGNkU1MDAsIDB4NjYwM0U0MDIsIDB4RTUwMEJGOEMsCisweEU0MDI4NUY2LCAweEJGOTI2NjAzLCAweEU1RkVFNTAwLCAweEUwMTA2NTVDLAorMHhCRjYxRTQwMywgMHhFNTEzMEY1NCwgMHhFNDBFQkY2MywgMHgwNUZDRTAxMCwKKzB4QkY2M0U0MEUsIDB4RTUwMDc1ODUsIDB4QkY2NEU0MDMsIDB4RTUwMEU2NDAsCisweEJGNzFFNDAzLCAweEU1MDBFNjQwLCAweEJGNzhFNDAzLCAweEU1RkZFNjQwLAorMHhFMDE0NjU1QywgMHhCRjQ3RTQwNCwgMHhFNDBGMEY1NCwgMHhFNTA0QkY0OSwKKzB4MDVGQ0UwMTQsIDB4QkY0OUU0MEYsIDB4RTUwMTc1ODQsIDB4QkY0QUU2NDAsCisweEU1MDFFNDA0LCAweEJGNTdFNjQwLCAweEU1MDFFNDA0LCAweEU0MDRFNjQwLAorMHhBRjVDN0YxOCwgMHg3RjE4NEYyNiwgMHgwMDBCNEYyNiwgMHg0RjIyMDAwOSwKKzB4RDI0MjdGRjAsIDB4ODgwMTYwMjEsIDB4RDI0MThCNzEsIDB4MjY2ODY2MjEsCisweEQyNDA4QjZELCAweDI2Njg2NjIxLCAweEU1MEY4QjY5LCAweEU0MDFCRjFDLAorMHhCRjFFRTUwMSwgMHhFNTg2RTQwMCwgMHhFNDAwNjU1QywgMHgyRjUwQkYxRSwKKzB4QkYxQkU0MDEsIDB4RTQwMUU1MDYsIDB4QkYxQzY1NDMsIDB4RTQwMUU2NDAsCisweEJGMjk2NTQzLCAweEU0MDFFNjQwLCAweEJGMzA2NTQzLCAweDY1RjBFNjQwLAorMHg3NTZDRTQwMiwgMHhCRUZGNjA1MywgMHhFNDAyODBGNCwgMHhFNTEyQkYwMSwKKzB4RTQwMjg0RjQsIDB4QkYwMTcwOTAsIDB4RTY0MDY1MDMsIDB4QkYwMkU0MDIsCisweEU2NDBFNTAwLCAweEJGMEZFNDAyLCAweEU2NDBFNTAwLCAweEJGMTZFNDAyLAorMHhFNUZFRTUwMCwgMHg2MDUzNjU1QywgMHhCRUU1RTQwMywgMHhFNTEzODBGOCwKKzB4RTQwRUJFRTcsIDB4RTQwRTg0RjgsIDB4QkVFNzcwODUsIDB4RTUwMDY1MDMsCisweEJFRThFNjQwLCAweEU1MDBFNDAzLCAweEJFRjVFNjQwLCAweEU1MDBFNDAzLAorMHhCRUZDRTY0MCwgMHhFNUZGRTQwMywgMHg2MDUzNjU1QywgMHhCRUNCRTQwNCwKKzB4RTQwRjgwRkMsIDB4RTUwNEJFQ0QsIDB4RTQwRjg0RkMsIDB4QkVDRDcwODMsCisweEU1MDE2NTAzLCAweEJFQ0VFNjQwLCAweEU1MDFFNDA0LCAweEJFREJFNjQwLAorMHhFNTAxRTQwNCwgMHhFNDA0RTY0MCwgMHhBRUUwN0YxMCwgMHg3RjEwNEYyNiwKKzB4MDAwQjRGMjYsIDB4MDAwMDAwMDksIDB4MDAxRTEwMkYsIDB4MDAxRTEwODAsCisweDAwMUUxMDkwLCAweDAwMUUxMDNGLCAweDAwMUUxMDNFLCAweDAwMjAzMUZBLAorMHgwMDIwMzFGQywgMHgwMDIwMzFGRSwgMHhEMjFERDExQywgMHg2NjIwNjAxMCwKKzB4Njc2QzcwMDEsIDB4MzcwMEM5MEYsIDB4RTUwMDhEMTMsIDB4NjcxMDYyMTAsCisweDc3MDE2MjJDLCAweDY0MjMyMTcwLCAweEQ2MTY2MDEwLCAweDQ0MDg0NDA4LAorMHgzNDI4QzkwRiwgMHg2MjYwMjEwMCwgMHg3MjAxRDUxMywgMHg0NDA4MjYyMCwKKzB4MDAwQjM1NEMsIDB4RDEwRjYwNTMsIDB4MjU1ODY1MTAsIDB4RTYwMDhEMTMsCisweEQ2MERENDBCLCAweDY1NUM2NTQwLCAweDQ3MDg2NzUzLCAweDM3NTg0NzA4LAorMHg0NzA4NjU0MCwgMHgyNDUwNzUwMSwgMHgzNjdDNjA0MCwgMHgyNDAwQzkwRiwKKzB4NzJGRjYyMTAsIDB4MDAwQjIxMjAsIDB4MDAwMDYwNjMsIDB4MDAyMDMxQTEsCisweDAwMjAzMUEwLCAweDAwMjAzMUEyLCAweDAwMjAyREM4LCAweDdGRkM0RjIyLAorMHhFNjgwRDE5RCwgMHg2NjZDNjIxMiwgMHhEMjlDMkYyMiwgMHg2N0YzNjU2MywKKzB4NDIwQjc1NDIsIDB4N0YwNEU0MDQsIDB4MDAwQjRGMjYsIDB4RTY4MDAwMDksCisweEQyOTY2NjZDLCAweEU3MDA2NTYzLCAweDQyMkI3NTQwLCAweEU2ODA2NDczLAorMHhEMjkyNjY2QywgMHhFNzAwNjU2MywgMHg0MjJCNzU0MywgMHgyRjg2NjQ3MywKKzB4MkZBNjJGOTYsIDB4MkZDNjJGQjYsIDB4MkZFNjJGRDYsIDB4N0ZGNDRGMjIsCisweEREOENEMjhCLCAweDcyMDExRjIxLCAweERCOEIxRjIyLCAweDZBRjJFODQwLAorMHg1MjExRDE4QSwgMHgzNjIwNjYxMiwgMHhBMEE3OEIwMSwgMHg2MDYxMDAwOSwKKzB4ODgwMUM5MDMsIDB4QTBBMThCMDEsIDB4RDk4NDAwMDksIDB4NDIwQkQyODQsCisweDU1MDM2NDkzLCAweDg0NUM2QTAzLCAweDMwRTBFRTg0LCAweEQxODE4Qjc5LAorMHg2MDZDNjYxMCwgMHg4QjNEODgwMSwgMHg2MjEwRDE3RiwgMHg4OTJGMjIyOCwKKzB4RDU3RUU3MDEsIDB4NjQ1MjJCNzIsIDB4MTQ0MkUwMDMsIDB4RDU3QzYyNTIsCisweEU2MDA0MDE4LCAweDIxNjA4MTIxLCAweEQxN0E2NDUzLCAweDZFNTI3NDA0LAorMHg2MDEyNjc0MiwgMHhDQjIwREM3OCwgMHg3NjAxMjEwMiwgMHgzMjgzNjI2RCwKKzB4MjVFMjhCRkIsIDB4MjQ3MkRFNzEsIDB4NjJFMjY3QzIsIDB4MTI3NEQxNzMsCisweDYwNDE2NEUyLCAweDI0MDFDQjAxLCAweEVFMDA2NkUyLCAweERDNzAyQzYyLAorMHhFQzAxMkM2MiwgMHgyREMyNDEwQiwgMHg0QzE4RUMwMSwgMHgyQkUyMkRDMiwKKzB4RDc2NERFNkMsIDB4RDE2QzYwRTIsIDB4Q0IwMUUyMDIsIDB4MjcyMDJFMDIsCisweDIxMjJBMDJGLCAweDhCMkMyMDA4LCAweEU3MDFERTY4LCAweEQ0NjZFQzAwLAorMHgyMTcwRDI2NCwgMHhFRTAxMkVDMiwgMHg2MTIyMjRFMiwgMHgyMTY5RTZGRSwKKzB4RTAxRTIyMTIsIDB4NTRGMTBDNUMsIDB4MjRDMEUwMUYsIDB4NTZGMjAyNUMsCisweDI2MjA3NTEwLCAweEQ3NUVFNjAwLCAweEVFMDZENDVFLCAweDc2MDE4NDU2LAorMHg2QzU0MjcwMCwgMHgzMUUzNjE2QywgMHg3NDAxMjRDMCwgMHg3NzAxOEZGNiwKKzB4RTQ5NEQyNTksIDB4NzIwMTIyNDAsIDB4MjI1MEU1MDAsIDB4RTYwNTcyMEYsCisweEQyNTYyMjYwLCAweDY1QTM2NDkzLCAweEVFMDE0MjBCLCAweEFGNkY0RTE4LAorMHgyRkEyMkRFMiwgMHhENDUyNjVGMiwgMHg2NjQyODU1MywgMHgzMjYyNjIwRCwKKzB4RDQ1MDg5MDcsIDB4NDEwQkQxNTAsIDB4RDc1MDAwMDksIDB4QUY1N0U2MDEsCisweEQ0M0EyNzYyLCAweEREMzdEMTQ5LCAweDY1RjI0MTBCLCAweEQ0NENFRTAxLAorMHg0RTE4RDY0QywgMHgyREUyNDYwQiwgMHgwMDA5QUY0QSwgMHg3RjBDMkZBMiwKKzB4NkVGNjRGMjYsIDB4NkNGNjZERjYsIDB4NkFGNjZCRjYsIDB4MDAwQjY5RjYsCisweDRGMjI2OEY2LCAweDg1NDY3RkY0LCAweDJGMDFFNjgxLCAweDY2NkM4NTQ3LAorMHg4NTQ4ODFGMSwgMHg4MUYyRDIyNSwgMHg2N0YzODU0MiwgMHg4NTQzODFGMywKKzB4ODFGNEU0MEMsIDB4NjU2MzYwNTMsIDB4NDIwQjgxRjUsIDB4N0YwQzc1NDAsCisweDAwMEI0RjI2LCAweDJGODYwMDA5LCAweDJGQTYyRjk2LCAweDJGQzYyRkI2LAorMHgyRkU2MkZENiwgMHg3RkVDNEYyMiwgMHhFODAwRDExQSwgMHhENDMyMkYxMiwKKzB4MUY0MTYxODMsIDB4NkExM0RCMjAsIDB4NEEwOEQ2MzAsIDB4REUyMEUwMDEsCisweDRBMDA0NjBCLCAweDFGMDIzQUVDLCAweDUyQjE2NkIyLCAweDhCMDEzNjIwLAorMHgwMDA5QTE5QiwgMHhDOTAzNjA2MSwgMHg4QjAxODgwMSwgMHgwMDA5QTE5NSwKKzB4REUyNzUyNjMsIDB4OEI0RjMyRTAsIDB4NDIwQkQyMEQsIDB4REUyNTY0QjMsCisweEQ3MERENTBFLCAweEVEMDFEQzBCLCAweDJFMDJFMTAwLCAweDI3RDAyNTAyLAorMHhBRkUxMkMxMCwgMHgwMDAwMkUxNiwgMHgwMDFDM0Q5QywgMHgwMDIwMUY0MCwKKzB4MDAxMTc3OUEsIDB4MDAxQzNEMzAsIDB4MDAxRDAxMDQsIDB4MDAyMDJEQzAsCisweDAwMjAxMTYyLCAweDAwMjAzMUIxLCAweDAwMjAzMUIwLCAweDAwMjAzMUFDLAorMHgwMDFDM0I5QywgMHgwMDFDMzUwMCwgMHgwMDIwMkQ5OCwgMHgwMDIwMTI3NiwKKzB4MDAxQzNEMDAsIDB4MDAxQzM2RjgsIDB4MDAxMTc3MDgsIDB4MDAyMDMxQjQsCisweDAwMTE3NzhDLCAweDAwMTE3NzkyLCAweDAwMTE3Nzg4LCAweDAwMjAxMTgwLAorMHgwMDIwMzE4OCwgMHgwMDIwMkQ4OCwgMHgwMDIwMTFFNCwgMHgwMDFFMjEzMCwKKzB4MDAyMDM0OUMsIDB4MDAyMDE0NUUsIDB4MDAyMDM0QTgsIDB4MDAyMDJDODAsCisweDAwMTE3NzgwLCAweDAwMTE3NzBDLCAweEM4MDE4NTYxLCAweDVDNjM4OTdBLAorMHg2NjAzODVDMiwgMHg2NDAzQzkwMywgMHg2NTBEODVDMywgMHg0MDIxNjA1MywKKzB4QzkzRjQwMjEsIDB4NkUwMzQ1MDAsIDB4MjUyRDMyMkEsIDB4RTIxMDYwNTMsCisweDNFMjNDOTAxLCAweDZEMDM4RDIzLCAweDQ0MDhENzlELCAweDQ0MDg2NTcwLAorMHg0NDAwNjJFMywgMHgyNTU4NDIwMCwgMHgzNDJDOEYwRiwgMHg2MDQzRDI5OSwKKzB4Njk3RDA3MkQsIDB4NjA5OTQ5MTksIDB4MjAxRDYxMEUsIDB4NjBEMzgxRjYsCisweDhGMEM4ODAxLCAweEEwMEE2OTdDLCAweEQyOTM2OUUzLCAweDA1MkQ2MDQzLAorMHg0MjE5NjI1RCwgMHg2NzBFNjAyOSwgMHg4MUY2MjA3RCwgMHhEMThGNjk1QywKKzB4MjIyODYyMTAsIDB4RTlGRjg5MDEsIDB4RUVGRjY5OUMsIDB4NkVFQzY1OUQsCisweDhCMEYzNUUwLCAweDRDMEJEQzhBLCAweDU0MDM2NEIzLCAweEJGMjBFNTAyLAorMHhENDg4NkUwMywgMHg0MTBCRDE4OCwgMHhENzg4NjVFMywgMHhENDg4RUQwMSwKKzB4MjdEMkEwMUUsIDB4MjZFOUVFRkMsIDB4ODFDMjYwNjMsIDB4OTdDNTg1QzMsCisweDYyMDMyMDc5LCAweDQ1MDg4NUY2LCAweDYwNjMyNjBCLCAweDgxQzIyNTJCLAorMHg4MUMzNjA1MywgMHhFMTA4ODVDNCwgMHgyMDFCNDExOCwgMHg2MkIyODFDNCwKKzB4MjBFOTg1MjEsIDB4NjRCMjgxMjEsIDB4Q0IwMTYwNDEsIDB4RDQ3OTI0MDEsCisweDQ1MEJENTc5LCAweDYwQjIwMDA5LCAweDU3RjI2NkYyLCAweDJBMDJDQjAxLAorMHgyNjcyQUYyMiwgMHhEMjZFODU2MSwgMHg4RjAyQzgwMiwgMHhBMDlGNjRCMywKKzB4NDIwQjAwMDksIDB4REM3MTAwMDksIDB4NUUwMzY1MDMsIDB4MDdDRUUwNEMsCisweDc3MDFERDZGLCAweDZDRDIwQzc2LCAweDdDMDFENjY0LCAweDZENjAyREMyLAorMHg4OTA2MkREOCwgMHhEMjY0RDQ2MywgMHhFRDAxNDIwQiwgMHhBMDdFRDc2MywKKzB4NjI1MTI3RDIsIDB4NDExOEUxMEYsIDB4MjIxOUU0MDIsIDB4MzI0MDQ0MTgsCisweDg1NTE4QjExLCAweDIwRDlFREZDLCAweDYwNTE4MTUxLCAweENCMDE3REUzLAorMHg4NUUxMjUwMSwgMHgyMEQ5RDY1RiwgMHg0NjBCODFFMSwgMHg2Q0YyNjRCMywKKzB4QTA2NDU3RjIsIDB4NkQ1MTJDNzIsIDB4NEQxOTZEREQsIDB4NjZERTZERDksCisweDdEMDEyRDZELCAweDYxMDM2MERDLCAweDg4MDE0MTE4LCAweDI1MTE4RjQ1LAorMHg2NDYyRDY1MywgMHgyNjQyNzQwMSwgMHg2NjBEODVFMywgMHg0MDIxNjA2MywKKzB4QzkzRjQwMjEsIDB4NkQwMzQ2MDAsIDB4MjYyRDMyMkEsIDB4QzgwMTYwNjMsCisweERDNEVEMTRELCAweDk2NEE4OTAxLCAweEU2MDAyRDZCLCAweDBGNjRFMDEwLAorMHhFMDEwNjRERCwgMHg2MDdDMDdGQywgMHgwMjFENDAwMCwgMHgzMjQwNjIyRCwKKzB4NjYwMzhEMTIsIDB4MDIxRDYwNjMsIDB4MzI3MEU3RkYsIDB4QTAwQjhCMDEsCisweEUwMTAwMUQ1LCAweEU2MDQwMkZDLCAweDBGMjQ3MjAxLCAweDMyNjI2MjJDLAorMHgwNkZDOEJFNywgMHg0NjAwNjY2QywgMHgwMUNENjA2MywgMHgwQzE1NzEwMSwKKzB4NjcxMUQxM0IsIDB4M0M0MDZDN0QsIDB4NjIxMTg5MDcsIDB4ODhGRjYwMkQsCisweDIxRDE4OTAzLCAweEUyMDFERDM3LCAweDg1NTEyRDIwLCAweDIwRDlFREZDLAorMHg2MDUxODE1MSwgMHhDQjAxRDIyRiwgMHg0MjBCNjRCMywgMHhFMDEwMjUwMSwKKzB4RDQzMTAyRkMsIDB4RTAwMTYxMkMsIDB4NjdGMjQ0MEIsIDB4ODVFRjI3MDIsCisweDU0RjFEMjJFLCAweDY1MEQ0MjBCLCAweDAwMDlBRTdFLCAweDgwMDA3RTAzLAorMHgwMDA5NDIwQiwgMHg2RTAzNTQwMywgMHhFRDA4ODU0NCwgMHgyMEQ5NEQxOCwKKzB4OEIwMzMwRDAsIDB4RTUwMUJFM0QsIDB4MDAwOUEwMDcsIDB4REQyNDg1NDEsCisweDIyRDg2MjBELCAweEJFMzQ4OTAxLCAweEQ0MTJFNTAwLCAweDQyMEJEMjEyLAorMHhENzEyNjVFMywgMHhBRTVGRUQwMSwgMHg3ODAxMjdEMiwgMHhFRTA0NjE4RCwKKzB4OEQwMjMxRTcsIDB4QUU0RTdCMDgsIDB4N0YxNDAwMDksIDB4NkVGNjRGMjYsCisweDZDRjY2REY2LCAweDZBRjY2QkY2LCAweDAwMEI2OUY2LCAweDAwMDA2OEY2LAorMHgwMDIwMzRCOCwgMHgwMDIwMzM5QywgMHgwMDIwMzQxQywgMHgwMDIwMzE5QywKKzB4MDAyMDExNjIsIDB4MDAyMDJEOTAsIDB4MDAyMDExODAsIDB4MDAxRTIxMkMsCisweDAwMjAzNEEwLCAweDAwMjAzNEE0LCAweDAwMjAxNDVFLCAweDAwMjAyRDJDLAorMHgwMDIwMzRCQywgMHgwMDIwMTFFNCwgMHgwMDIwMzFCQywgMHgwMDIwMzFDNCwKKzB4MDAyMDMxQjgsIDB4MDAyMDMxQkEsIDB4MDAyMDJDODAsIDB4MDAyMDE0QUEsCisweDAwMDA4MDAwLCAweDRGMjIyRkU2LCAweDZFMjJEMjEyLCAweEM4NDA2MEUzLAorMHgyMkUyOEQwMiwgMHgwMDA5QkNGQSwgMHg0MjE4RTI0MCwgMHg4OTAxMkUyOCwKKzB4MDAwOUJEMDUsIDB4QzgxMDYwRTMsIDB4RDQwQjg5MDUsIDB4NDIwQkQyMEIsCisweEJEMDQwMDA5LCAweDYwRTMwMDA5LCAweDg5MDFDODA1LCAweDAwMDlCREVCLAorMHhDODAyNjBFMywgMHg0RjI2ODkwMiwgMHg2RUY2QUQwMSwgMHgwMDBCNEYyNiwKKzB4MDAwMDZFRjYsIDB4MDAxQzM1MTAsIDB4MDAyMDM0QjAsIDB4MDAyMDE0NUUsCisweDA4MEEwQzBFLCAweDAwMDIwNDA2LCAweDFBMUMxRTIwLCAweDEyMTQxNjE4LAorMHgyRTMwMzIzNCwgMHgyNjI4MkEyQywgMHgzQTNDM0U0MCwgMHg2QzYyNTY0OCwKKzB4NDExMTJGMjYsIDB4RTIyMDhGMTgsIDB4ODkwQjMxMjMsIDB4MzIxQ0QyMDQsCisweEQxMDI2MjIwLCAweDQxMkIzMTJDLCAweDAwMDkwMDA5LCAweDAwMjAyQ0FBLAorMHgwMDIwMkM2MCwgMHgwMDBCRTAwMCwgMHg0MDAwNjJGNiwgMHg0MDAwNDAwMCwKKzB4NDAwMDQwMDAsIDB4NDAwMDQwMDAsIDB4NjJGNjAwMEIsIDB4NDAwMDQwMDAsCisweDQwMDA0MDAwLCAweDQwMDA0MDAwLCAweDQwMTg0MDAwLCAweDYyRjYwMDBCLAorMHg0MDAwNDAwMCwgMHg0MDAwNDAwMCwgMHg0MDAwNDAwMCwgMHg0MDI4NDAwMCwKKzB4NjJGNjAwMEIsIDB4NDAwMDQwMDAsIDB4NDAxODQwMDAsIDB4MDAwQjQwMjgsCisweEM5MEY2MkY2LCAweDQwMDU0MDA1LCAweDQwMDU0MDA1LCAweDYyRjYwMDBCLAorMHg0MDA1QzkwNywgMHg0MDA1NDAwNSwgMHg2MkY2MDAwQiwgMHg0MDA1QzkwMywKKzB4MDAwQjQwMDUsIDB4QzkwMTYyRjYsIDB4MDAwQjQwMDUsIDB4MDAwMDYyRjYsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4NTQ0RjBEMEEsCisweDQ2MjA1MzU1LCAweDAwMDAzQTU3LCAweDIwNkM3NTRBLCAweDMyMjAzNTMyLAorMHgyMDM3MzAzMCwgMHgzMTNBMzEzMiwgMHgzNzMyM0EzMiwgMHgwMDAwMDAwMCwKKzB4MDAwMDBEMEEsIDB4MDAwMDAwNDMsIDB4NDI3MDczNzIsIDB4M0QyMDY2NzUsCisweDU1NEUyMDNELCAweDIwMkM0QzRDLCAweDZFNDk2NzdBLCAweDRFNDk3Mjc0LAorMHg2RDc1NEU1MSwgMHgwMDAwMDAzRCwgMHg2MTc2NkU0OSwgMHgyMDY0Njk2QywKKzB4NzI2NTczNzUsIDB4MjA3MjZGMjAsIDB4MjA3OTY1NkIsIDB4MDAyMTQ0NDksCisweDUyNTA0NTQ1LCAweDU3MjA0RDRGLCAweDY1NzQ2OTcyLCAweDY0NjEyMDJDLAorMHgwMDNENzI2NCwgMHg2QzYxNzYyMCwgMHgwMDAwMDAzRCwgMHgwMDAwMEEwRCwKKzB4NkU2QjZFNTUsIDB4MjA2RTc3NkYsIDB4NkQ2RDZGNjMsIDB4M0Q2NDZFNjEsCisweDAwMDAwMDAwLCAweDAwMEEwRDUyLCAweDIwM0EzMDUxLCAweDAwMDAwMDIwLAorMHgyMDNBMzE1MSwgMHgwMDAwMDAyMCwgMHgyMDNBMzI1MSwgMHgwMDAwMDAyMCwKKzB4MjAzQTMzNTEsIDB4MDAwMDAwMjAsIDB4MjAzQTM0NTEsIDB4MDAwMDAwMjAsCisweDYxNDM3NzQ4LCAweDcyNjI2OTZDLCAweDZGNjk3NDYxLCAweDY2MjAyMDZFLAorMHgwQTZDNjk2MSwgMHgwMDAwMDAwRCwgMHg3MzY5NkY0RSwgMHg2MTQzMjA2NSwKKzB4NzI2MjY5NkMsIDB4NkY2OTc0NjEsIDB4NjE2NjIwNkUsIDB4MjEyMTZDNjksCisweDAwMDAwRDBBLCAweDAwMDAwMDcyLCAweDAwMjA1MjIwLCAweDAwMDAwRDBBLAorMHg2MjczNTU3NiwgMHg3NDczNzI1RiwgMHgwMDAwMEEwRCwgMHg2MjczNTU3NiwKKzB4NzM3NTczNUYsIDB4NjQ2RTY1NzAsIDB4MDAwMDBBMEQsIDB4NjI3MzU1NzYsCisweDczNjU3MjVGLCAweDAwMEEwRDZELCAweDAwMDAwMDQyLCAweDcyNzQ2RTQ5LAorMHg2RDY1MjA1MSwgMHgyQzc5NzQ3MCwgMHg0OTY3N0EyMCwgMHg0OTcyNzQ2RSwKKzB4NzU0RTUxNEUsIDB4MDAwMDNENkQsIDB4NjU0QzcyNDUsIDB4MDAwMDAwNkUsCisweDAwMDAwMDQ5LCAweDIwNzQ2RjRFLCAweDc1NkY2RTY1LCAweDQ5MjA2ODY3LAorMHg0MjIwNTE0RSwgMHgwQTBENjY3NSwgMHgwMDAwMDAwMCwgMHgwMDAwMDBGRiwKKzB4MDAwMjAwMDEsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMTBFMDEwRCwKKzB4MDAwMjAwMDMsIDB4MDEwOTAxMDgsIDB4MDAwMjAxMEEsIDB4MDIwMDAwMDMsCisweDAyMDIwMjAxLCAweDAyMDQwMjAzLCAweDAyMDYwMjA1LCAweDAyMDIwMjAwLAorMHgwMjA0MDIwMywgMHgwMjBDMDIwNywgMHgwMjBFMDIwRCwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAxMEUwMTBELAorMHgwMEZGMDEwRiwgMHgwMTA5MDEwOCwgMHgwMTBCMDEwQSwgMHgwMjAwMDBGRiwKKzB4MDIwMjAyMDEsIDB4MDIwNDAyMDMsIDB4MDIwNjAyMDUsIDB4MDIwMjAyMDAsCisweDAyMDQwMjAzLCAweDAyMEMwMjBCLCAweDAyMEUwMjBELCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDAyMDUyMjAsCisweDAwMDAwMDQ2LCAweDAwMDAwMDU5LCAweDczMjA0MTQyLCAweDAwM0Q3MTY1LAorMHg0OTU0NDEyMCwgMHgwMDAwMjA0RCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAyRTAyMDksIDB4ODAwMDAxMDEsIDB4MDAwNDA5RkEsIDB4MDBGRjA0MDAsCisweDA1MDcwMDAwLCAweDAyMDAwMjAxLCAweDgyMDUwNzAwLCAweDAwMDIwMDAyLAorMHgwMzgzMDUwNywgMHgwNzAxMDA0MCwgMHg0MDAyMDQwNSwgMHgwMjA5MDAwMCwKKzB4MDEwMTAwMkUsIDB4MDlGQTgwMDAsIDB4MDQwMDAwMDQsIDB4MDAwMDAwRkYsCisweDAyMDEwNTA3LCAweDA3MDAwMDQwLCAweDQwMDI4MjA1LCAweDA1MDcwMDAwLAorMHgwMDQwMDM4MywgMHgwNDA1MDcwMSwgMHgwMDAwNDAwMiwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDcwOTAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIH07CisKK2NvbnN0IHUzMl90IHpjRndJbWFnZVNpemU9MTM2NTY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb3R1cy9oYWwvaHBmd3VfRkI1MF9tZGsuYyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL2hhbC9ocGZ3dV9GQjUwX21kay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkMTczNmYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy9oYWwvaHBmd3VfRkI1MF9tZGsuYwpAQCAtMCwwICsxLDcyMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNy0yMDA4IEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisjaW5jbHVkZSAiY3ByZWNvbXAuaCIKKworY29uc3QgdTMyX3QgemNGd0ltYWdlW10gPSB7CisweDAwMDkwMDBCLCAweDRGMjIyRkU2LCAweEQyMjg3RkZDLCAweDAwMDk0MjBCLAorMHgwMDA5QjAxOSwgMHg5NDQ2RDUyNiwgMHhFNjAwQTAwMywgMHg4RDA0MzY0MiwKKzB4NjA1Mjc2MDEsIDB4OERGOUM4NDAsIDB4RDQyMjJGMDIsIDB4NEUwQkRFMjIsCisweEQ0MjIwMDA5LCAweDAwMDk0RTBCLCAweDRFMEJENDIxLCAweDdGMDQwMDA5LAorMHhBMDI1NEYyNiwgMHg0RjIyNkVGNiwgMHg0MTBCRDExRSwgMHhENDFFMDAwOSwKKzB4MDAwOTQ0MEIsIDB4NDUwQkQ1MUQsIDB4RDcxRDAwMDksIDB4NjExREUxRkYsCisweDI3MTJEMjFDLCAweEQ0MUM1MDI5LCAweEUxRkZDQjAxLCAweDEyMDlFNTAxLAorMHgxMjExMjIxMiwgMHhENTE5MjQ1MiwgMHhENjE5OTcxNiwgMHhFNzAwMjU3MiwKKzB4MjY3MEQyMTgsIDB4MjI3MkQ2MTgsIDB4NEYyNkUyMDEsIDB4MjYyMjAwMEIsCisweEREMTdEQzE2LCAweDRDMEJERTE3LCAweDREMEIwMDA5LCAweDRFMEIwMDA5LAorMHhBRkY4MDAwOSwgMHgyNzEwMDAwOSwgMHgwMDAwMDY0MCwgMHgwMDIwMDk1QSwKKzB4MDAxQzAwMUMsIDB4MDAyMDI5NDAsIDB4MDAyMDBFMkEsIDB4MDAyMDI5NEMsCisweDAwMjAyOTY0LCAweDAwMjAwQ0YwLCAweDAwMjAwRjI2LCAweDAwMjAwOUM0LAorMHgwMDFDMzUxMCwgMHgwMDFDMzYyNCwgMHgwMDFFMjEyQywgMHgwMDIwMjhFQywKKzB4MDAyMDI4NTAsIDB4MDAyMDI4RjQsIDB4MDAyMDI5MDAsIDB4MDAyMDBCRUMsCisweDAwMjAxRkQ0LCAweDAwMjAxN0I4LCAweDJGRDYyRkM2LCAweDRGMjIyRkU2LAorMHhERUExN0ZBNCwgMHg2MUUwRTAxQywgMHg3RDAxNkRFMywgMHg2MUQwMEYxNCwKKzB4RDU5RkQ0OUUsIDB4NDUwQkUwMjAsIDB4RTAyMDBGMTQsIDB4RTc4MDA0RkMsCisweDYwNEM2NkUyLCAweDdEN0Y2NzdDLCAweDFGNjkzMDcwLCAweDJENjI4RjE3LAorMHgwMUZDRTAxQywgMHg2NDFDRTUwMCwgMHhENzk3REU5NiwgMHgzMjQzNjI1RCwKKzB4QTIxQThCMDEsIDB4NjU1RDAwMDksIDB4MzFFQzYxNTMsIDB4RTAyODZDMTAsCisweDZENTMwRkM0LCAweDNEN0M2MkNFLCAweEFGRUYyRDIwLCAweDIwMDg3NTAxLAorMHhFMDFDOEIxNSwgMHhFNTAwMDFGQywgMHhENzhCREU4QSwgMHg2NDFDQTAwQSwKKzB4NkM1MzY1NUQsIDB4NjZDMjNDRUMsIDB4NjY2MjYyNTMsIDB4MjI2MjMyN0MsCisweDFGNjk3NTA0LCAweDMyNDM2MjVELCAweEExRjY4QkYyLCAweDg4MDEyRDEwLAorMHhFMDFDOEIxNiwgMHhFNDAwMDFGQywgMHg2NzFDMkQ0MCwgMHg2MjREREU3RCwKKzB4OEIwMTMyNzMsIDB4MDAwOUExRTksIDB4NjJFMzY0NEQsIDB4NzIwNDZENDMsCisweDNERUM2MTQzLCAweDY1RDIzMTJDLCAweDc0MDg2QzEyLCAweDI1QzJBRkVGLAorMHg4QjE4ODgwNCwgMHgwMUZDRTAxQywgMHgyRDQwRTQwMCwgMHhERTcxNjcxQywKKzB4MzI3MzYyNEQsIDB4QTFEMDhCMDEsIDB4NjQ0RDAwMDksIDB4NjJFMzZENDMsCisweDY1RDIzREVDLCAweDYxNDM3MjA0LCAweDY2MTIzMTJDLCAweDc0MDg2QzUyLAorMHhBRkVEMkM2OSwgMHg4ODA1MjVDMiwgMHhFMDFDOEIxOCwgMHhFNDAwMDFGQywKKzB4NjcxQzJENDAsIDB4NjI0RERFNjMsIDB4OEIwMTMyNzMsIDB4MDAwOUExQjUsCisweDZDNDM2NDRELCAweDNDRUM2MkUzLCAweDcyMDQ2NUMyLCAweDNEMkM2RDQzLAorMHg2MTUyNjZEMiwgMHgyMTZCNzQwOCwgMHgyNTEyQUZFRCwgMHg4QjEzODgzMCwKKzB4RTIwMERFNTgsIDB4NjRFMjJEMjAsIDB4OEIwNDI0NDgsIDB4NDIwQkQyNTcsCisweEExOUEwMDA5LCAweDU1RTEwMDA5LCAweDU3RTM1NkUyLCAweERENTQ1Q0U0LAorMHgyRkM2NEQwQiwgMHg3RjA0QTE5MSwgMHg4OTAxODgyOCwgMHgwMDA5QTBFQSwKKzB4RTE0M0RFNEMsIDB4NjIyRDYyRTEsIDB4OEYwMzMyMTcsIDB4NTZGQjFGRUIsCisweDI2MjFFMjQwLCAweDhCMDEzMjE3LCAweDAwMDlBMEQ1LCAweEUxMDE1RUZCLAorMHgzMDE2ODVFMSwgMHhBMENFOEIwMSwgMHhFNDAxMDAwOSwgMHgyRDQwNTVGQiwKKzB4NjQ1MUIxNzksIDB4RTE0MzU3RkIsIDB4RTA1NDYyNzEsIDB4MzUxNzY1MkQsCisweDBGNTY4RDQxLCAweDM1NjNFNjQwLCAweEU2MDA4QjA1LCAweDBGNjVFMDM0LAorMHhBMDBGRTExQSwgMHg2MTUzNzJDMCwgMHg0MTIxNDEyMSwgMHg0MTIxNDEyMSwKKzB4NDUyMTQxMjEsIDB4NDUyMTQ1MjEsIDB4QzkwMzYwNTMsIDB4RTAzNDY2MDMsCisweDcxMTgwRjY1LCAweDIyMDlFMDA3LCAweDY0MURFMDMwLCAweDBGMjU2NUYzLAorMHgxRjRFQjFGMSwgMHgwNEZERTAzNCwgMHg2NzRERTAzMCwgMHg0NzA4MENGRCwKKzB4NjA3MzYxQ0QsIDB4NDEwOEQyMkIsIDB4RTAwRjBDRkUsIDB4MUYxRjQyMEIsCisweDJDRDk2RDA3LCAweDVFRkI2MDczLCAweDg1RTIwRkM2LCAweDQyMEI1MUZGLAorMHgyQzBCNjAwRCwgMHg1NEZFNjA3MywgMHhCMUJCMEZDNiwgMHhFMDU0NjVGMywKKzB4NjUyRDYyRTEsIDB4RTY0MDBGNTYsIDB4ODk2MjM1NjMsIDB4RTA1MEUxMDAsCisweDYwMjMwRjE1LCAweDQwMDhDOTAzLCAweDZEMDM0MDAwLCAweEUwNDA2MTAzLAorMHhFMDQ0MEZENiwgMHhEMjE3RUVGRiwgMHg2RUVDMEZGNiwgMHgwRjI2RTA1OCwKKzB4NjBFMzQyMEIsIDB4NDIyMTYyNTMsIDB4NDIyMTQyMjEsIDB4NjYyMzQyMjEsCisweDMyNkM0MjAwLCAweDQ1MjE0MjAwLCAweEUwNDg2NzA3LCAweDBGNzY0NTIxLAorMHhDOTAzNjA1MywgMHg0MDA4NUNGQiwgMHg3QzA2MzBGQywgMHg2RTAzNkQyRCwKKzB4MUZENTFGQzYsIDB4MUYwNEEwMkUsIDB4MDAxMTdEMDAsIDB4MDAyMDI5NjgsCisweDAwMjAwRTJBLCAweDAwMTE3RDA0LCAweDAwMTE3RDg0LCAweDAwMjAwNzAwLAorMHgwMDIwMDc0QywgMHgwMDIwMjAzNCwgMHgwRkQ2RTA0QywgMHgwNUZFRTA0NCwKKzB4NjREM0IxODksIDB4NjRFMkUwNDgsIDB4RTA0MDA2RkUsIDB4MkU0MjI0NjksCisweDAxRkU2N0M0LCAweDY2N0NFMDU4LCAweDQyMEIwMkZFLCAweDI0MEI2MDYzLAorMHgwNUZFRTA0NCwgMHhCMTVEMkU0MiwgMHhFMDUwNjREMywgMHg3RDAxMDFGRCwKKzB4MEYxNTcxMDEsIDB4MDJGREUwNTAsIDB4MzI2MkU2MDYsIDB4NTZGQjhCREMsCisweDU1RkI2MjYxLCAweDg1NTE0MjAwLCAweDMwMkM3NTBDLCAweDYxMDM3MDFCLAorMHg2NEYzRTYwMCwgMHhFNzA0QTAwNCwgMHg3NjAxNjI1NiwgMHg3NDA0MjQyMiwKKzB4MzI3MzYyNkQsIDB4NjVGMzhCRjgsIDB4NjQxREIxM0MsIDB4QjBEMjU2RkIsCisweEEwQUE2NDYxLCAweEQ0ODgwMDA5LCAweEUyMDFENTg4LCAweDJEMjA0NTBCLAorMHgwMDA5QTBBMywgMHg4QjA3ODgyOSwgMHhFMjAwREU4NSwgMHg2NkUyMkQyMCwKKzB4NjQ2REIwQTEsIDB4MDAwOUEwOTksIDB4NjIyQ0UyODEsIDB4OEIzRDMwMjAsCisweEQ2ODBFNzM4LCAweEUwNDQyRDcwLCAweEUwNDgwQzZFLCAweDZFNjIxREMxLAorMHg1MTYxMURFMiwgMHg1NDYyMUQxMywgMHg1NTY1MUQ0NCwgMHg1NzYzMUQ1NSwKKzB4NUM2NjFENzYsIDB4MEU2RTFEQzcsIDB4MURFOEUwNDAsIDB4RTA1MDAxNkUsCisweDU0NjQxRDE5LCAweDA1NkUxRDRBLCAweDFENUJFMDRDLCAweEUwNTQwNzZFLAorMHgwQzZFMUQ3QywgMHgxRENERTA1OCwgMHhFMDQ0MDI2RSwgMHhFRDAwMUQyRSwKKzB4RTA0ODA2RDYsIDB4MTZEMTI2RDIsIDB4MTZENTE2RDIsIDB4MTZENjE2RDMsCisweEUwNDAwNkQ2LCAweEUwNTAwNkQ2LCAweDA2RDYxNkQ0LCAweDA2RDZFMDRDLAorMHgwNkQ2RTA1NCwgMHgwNkQ2RTA1OCwgMHgxRjI5QTA1NywgMHg2MjJDRTI4MiwKKzB4ODkzMTMwMjAsIDB4MDVGQ0UwMjAsIDB4NjI1Q0U2ODMsIDB4MzI2MDY2NkMsCisweEQ2NUQ4QjA3LCAweDI2NTBFNTAwLCAweDUyNjE3NjgwLCAweEEwNDRENjVCLAorMHhFNjkwMjYyMiwgMHgzMjYwNjY2QywgMHhEMjU3OEIxNiwgMHhFNTAwRDY1OCwKKzB4NjA2MjIyNTAsIDB4Q0IyMEQyNTcsIDB4RTYwNTI2MDIsIDB4RDY1NjIyNjIsCisweDIyNTI0NjBCLCAweDQyMEJEMjU1LCAweEQyNTUwMDA5LCAweDIyNjJFNjAxLAorMHg0NjE4RDI1NCwgMHgyMjYyQTAyOSwgMHhEMjU0RDQ1MywgMHhENDU0NjU0MiwKKzB4MDAwOTQyMEIsIDB4MDAwOUEwMjEsIDB4RTUyNEQ2NDcsIDB4RDU0NTI2NTAsCisweDE2MjE1MjU3LCAweDE2MjI1MjU4LCAweDE2MjM1MjU5LCAweDE2MjQ1MjVBLAorMHgxNjI1NTI1QiwgMHgxNjI2NTI1QywgMHgxNjI3NTI1RCwgMHgxNjI4NTI1RSwKKzB4MUYyOTUyNUYsIDB4RTIwMDE2MjksIDB4MTUyODE1MjcsIDB4MTUyQTE1MjksCisweDE1MkMxNTJCLCAweDE1MkUxNTJELCAweDdGNUMxNTJGLCAweDZFRjY0RjI2LAorMHgwMDBCNkRGNiwgMHg0RjIyNkNGNiwgMHhFMjQwNjE0RCwgMHg4OTE3MzEyMywKKzB4MzEyN0UyMUYsIDB4RDQzQjg5MDgsIDB4RTAwMUQ1M0IsIDB4NjY0MjQ1MEIsCisweDI2Nzk2NzA3LCAweDI0NjJBMDBDLCAweDMxMjdFMjNGLCAweEQ3MzU4OTA4LAorMHg3MUUwRDYzNSwgMHg0NjBCRTAwMSwgMHg2MjA3NTU3MSwgMHgxNzUxMjUyOSwKKzB4MDAwQjRGMjYsIDB4NEYyMjAwMDksIDB4RTI0MDYxNEQsIDB4ODkxNTMxMjMsCisweDMxMjdFMjFGLCAweEQ0MkI4OTA3LCAweDY2NDJEMjJCLCAweEUwMDE0MjBCLAorMHhBMDBCMjYwQiwgMHhFMjNGMjQ2MiwgMHg4OTA3MzEyNywgMHhENjI2RDcyNSwKKzB4NzFFMDU1NzEsIDB4RTAwMTQ2MEIsIDB4MTc1MTI1MEIsIDB4MDAwQjRGMjYsCisweEU2NDAwMDA5LCAweDQ2Mjg0NjE4LCAweDYyNTJENTIwLCAweDg5RkMyMjY4LAorMHgwMDA5MDAwQiwgMHg0NjE4RTY4MCwgMHhENTFDNDYyOCwgMHgyMjY4NjI1MiwKKzB4MDAwQjg5RkMsIDB4QTAwMTAwMDksIDB4NzIwMUUyMDAsIDB4OEJGQzMyNDIsCisweDAwMDkwMDBCLCAweDQ2MThFNjgwLCAweEQ1MTU0NjI4LCAweDIyNjg2MjUyLAorMHgwMDBCOEJGQywgMHgwMDAwMDAwOSwgMHgwMDIwMjk2QywgMHgwMDIwMEUyQSwKKzB4MDAxMTdEMDQsIDB4MDAyMDI4NTgsIDB4MDAxMTdEODAsIDB4MDAyMDI4RUMsCisweDAwMUMzNTAwLCAweDAwMUQ0MDA0LCAweDAwMjAwRjI2LCAweDAwMjAwOUM0LAorMHgwMDFFMjEyQywgMHgwMDFDM0QyOCwgMHgwMDExN0QwMCwgMHgwMDIwMEU4QSwKKzB4MDAyMDI5ODQsIDB4MDAxQzM3MDQsIDB4MDAyMDIwMzQsIDB4MDAxQzM3M0MsCisweDAwMUMzNzAwLCAweDRGMjIyRkU2LCAweDZFNTM3RkZDLCAweDJGNDJCRkNBLAorMHhENjE1NjFFMiwgMHgxNjE1RTI4MCwgMHg0MjE4NTRFMSwgMHg1NUUyMTY0NiwKKzB4MTY1NzQyMjgsIDB4NkVGMjU3RTMsIDB4MkUyQjE2NzgsIDB4N0YwNDI2RTIsCisweEFGQTc0RjI2LCAweDJGQzY2RUY2LCAweDJGRTYyRkQ2LCAweEREMEE0RjIyLAorMHhCRkFGNkM1MywgMHhCRjk0NkU0MywgMHhCRkFCMkRFMiwgMHg1MUQ1MDAwOSwKKzB4NTRENjJDMTIsIDB4NTVENzFDNDEsIDB4NTZEODFDNTIsIDB4NEYyNjFDNjMsCisweDZERjY2RUY2LCAweDZDRjYwMDBCLCAweDAwMUMzNzBDLCAweDAwMDlBMEY4LAorMHhEMTlCNEYyMiwgMHhENDlCOTI5OSwgMHgyMTIyQjAwRCwgMHg5Nzk1RTYwNSwKKzB4QjAyMjk1OTUsIDB4QjAzNjY0NjMsIDB4QjAzQTAwMDksIDB4QjAzRDAwMDksCisweEEwNkMwMDA5LCAweDRGMTI0RjI2LCAweEQxOTM0RjAyLCAweDk0ODczMTQ1LAorMHg0NjA5MDYwQSwgMHg0NjA5NDYwOSwgMHgwMDI5MzY0NiwgMHhENzhDRDU4RiwKKzB4MjUwMENBMDEsIDB4NEYwNjI3NjIsIDB4NEYxNjAwMEIsIDB4QkZFQTRGMjIsCisweEIwMjMwMDA5LCAweEEwNTIwMDA5LCAweDJGRTY0RjI2LCAweDZFNjNEMTg4LAorMHg0NDE4NjYxMiwgMHg0NTI4OTI2RCwgMHgyNjI5NDQwOCwgMHg0NDA4NDUwMCwKKzB4NDQwMDI2NUIsIDB4NDcwODI2NEIsIDB4NDcwODIxNjIsIDB4MjdFQkQxODEsCisweDAwMEIyMTcyLCAweEQxODA2RUY2LCAweEU2MDNENDgwLCAweDAwMEIyMTYyLAorMHhEMjdGMjQ2MiwgMHhFNDBBOTY1NiwgMHgyMjYyQUZCMCwgMHgyRkM2MkZCNiwKKzB4MkZFNjJGRDYsIDB4REM3QjRGMjIsIDB4MkMyMkUyMDEsIDB4QkZBNUU0MEEsCisweDYwQzI3QzQ0LCAweENCMDFFRDAwLCAweDYwQzIyQzAyLCAweEM5MDFFQjY0LAorMHg2RTAzQTAwOCwgMHg4OTA3M0RCMiwgMHhFNDAxNjBDMiwgMHhCRjk1QzkwMSwKKzB4N0QwMTZFMDMsIDB4OEJGNTJFRTgsIDB4OEIwMzNEQjIsIDB4RDI2RkQ0NkUsCisweDAwMDk0MjBCLCAweDRGMjZFNDBBLCAweDZERjY2RUY2LCAweEFGODU2Q0Y2LAorMHg0NDExNkJGNiwgMHg2MDRCOEYwMSwgMHgwMDBCNjA0MywgMHgyRjg2MDAwOSwKKzB4MkZBNjJGOTYsIDB4MkZDNjJGQjYsIDB4MkZFNjJGRDYsIDB4N0ZGQzRGMjIsCisweDZEQTNFQTAwLCAweERDNjI2QkEzLCAweDk5MTRFODY0LCAweDhCNEUyQkI4LAorMHgzQUUzRUUwQSwgMHg2MEMyODk0QiwgMHhDQjAyRUQwMCwgMHg2MkMyMkMwMiwKKzB4MkYwMjYwQzIsIDB4QTAxMEM5MDIsIDB4MDk2QzZFMDMsIDB4NUJCNDUyODgsCisweDFGRkYwOUI0LCAweDAxRkYwM0M0LCAweDg5MDgzRDgzLCAweEU0NjQ2MEMyLAorMHhDOTAyMkYwMiwgMHg2RTAzQkY1MiwgMHgyRUU4N0QwMSwgMHhEMTUxOEJGNCwKKzB4NTRDMUQ1NTEsIDB4NjY1MjY0MTIsIDB4NjI2OUVFMDEsIDB4NDIyMDYyMkYsCisweDYyMkY0MjE5LCAweDRFMTgyMjk5LCAweDhEMDMyMkU4LCAweEU0RkY2NDIzLAorMHgzNDI4MjI5QSwgMHg2NTcyRDc0OSwgMHg2MjJGNjI1OSwgMHg0MjE5NDIyMCwKKzB4MjI5OTYyMkYsIDB4OEQwMzIyRTgsIDB4RTZGRjY2MjMsIDB4MzYyODIyOUEsCisweDM0NjhCRkE3LCAweDMwRTJFRTAyLCAweEFGQjc4OTAxLCAweEQyNDBFQjAxLAorMHg2RUVDRUVFNiwgMHhCRjIxRTQwQSwgMHhBRkFGMjJFMiwgMHhFRTBBN0EwMSwKKzB4ODkwMTNBRTMsIDB4OEIwMzNEODMsIDB4RDIzNEQ0M0EsIDB4MDAwOTQyMEIsCisweDRGMjY3RjA0LCAweDZERjY2RUY2LCAweDZCRjY2Q0Y2LCAweDY5RjY2QUY2LAorMHg2OEY2MDAwQiwgMHg1NjUxRDUzNCwgMHg0NjI4NjA1MiwgMHgzMDZDMDAwQiwKKzB4MkZDNjJGQjYsIDB4MkZFNjJGRDYsIDB4NEYxMjRGMjIsIDB4QkZGMTRGMDIsCisweDZCMDM2RTQzLCAweEREMUNEQzJELCAweDAwMDlCRkVDLCAweDNDMDUzMEI4LAorMHg0NjA5MDYwQSwgMHg0NjAxNDYwOSwgMHgwMjBBM0Q2NSwgMHg0MjA5NDIwOSwKKzB4MzJFMjQyMDksIDB4NEYwNjhCRjAsIDB4NEYyNjRGMTYsIDB4NkRGNjZFRjYsCisweDAwMEI2Q0Y2LCAweDJGRTY2QkY2LCAweERFMjE0RjIyLCAweEU1MDBFMTAyLAorMHgyRTEyRTQwMywgMHgyRTUyQkZENCwgMHg0NjE4RTYwNiwgMHhFNDAzRTcwMCwKKzB4MkU3MjJFNjIsIDB4QUZDQjRGMjYsIDB4NEYyMjZFRjYsIDB4MDAwOUJGRUIsCisweEU2RTZEMjEzLCAweEU0MEE2NjZDLCAweDIyNjJCRkMyLCAweDRGMjZBRkUzLAorMHgwMDIwMjhGMCwgMHgwMDI0Q0RFMCwgMHgxMDYyNEREMywgMHgwMDIwMkFGMCwKKzB4MDAxQzU4MTQsIDB4MDAxQzU5RDAsIDB4MDAxQzU5QTQsIDB4MDAxQzYzOUMsCisweDAwMUM1ODA0LCAweDAwMUM1ODFDLCAweDAwMjAyOTk4LCAweDAwMjAwRTJBLAorMHgwMDFDNTg2MCwgMHgwMDFDNjg2NCwgMHgwMDFDNTlCQywgMHgwMDFDNjlCQywKKzB4MDAxQzk0N0MsIDB4MDAyMDI5QjAsIDB4MDAxQzEwNDAsIDB4Q0NDQ0NDQ0QsCisweDAwMUQ0MDA0LCAweDJGOTYyRjg2LCAweDJGQjYyRkE2LCAweDJGRDYyRkM2LAorMHg0RjIyMkZFNiwgMHhFNDAwN0ZFNCwgMHg0NTI4RTUxMCwgMHg2NzQzNkM0MywKKzB4RTEwN0EwMEYsIDB4NjA0MzY0NEQsIDB4MEY1NjQwMDgsIDB4RUUwMDYwQzMsCisweDgxNTEyNUMxLCAweDgxNTM4MTUyLCAweDE1NzMxNUUyLCAweDc1MTQxNUU0LAorMHg2MjRENzQwMSwgMHg4QkVEMzIxMywgMHhEQTZGNTFGMSwgMHgxQTExNTRGMiwKKzB4RDE2RTJBMTIsIDB4NTdGNDU1RjMsIDB4NkRGMjU4RjUsIDB4MTE0MUQ5NkMsCisweDExNTMyMTQyLCAweDExNzUxMTUyLCAweDExODcxMTc0LCAweDUyRjYxMTg2LAorMHgxOUQxRDY2OCwgMHhEODY4MjlEMiwgMHhEQTY4RTk1MCwgMHgxNjIxRUJCNCwKKzB4NkJCQzI2MjIsIDB4QTAyMTQ5MDgsIDB4NkVFREVFMDAsIDB4NjFFMzZERTMsCisweDQxMDg0RDA4LCAweDMxRUMzREVDLCAweDQxMDg0RDA4LCAweDYwQzMzRDhDLAorMHhFNzkwNDEwOCwgMHg4MUQxMkRDMSwgMHg0MTA4NjA5MywgMHg4MUQyNjc3QywKKzB4MzFBQzYwQzMsIDB4MzQ3MkUyMDAsIDB4MUREMjgxRDMsIDB4RDQ1NTFEMTMsCisweDFEMjQ4RDAxLCAweEIwM0FENDUwLCAweDdFMDE2NUQzLCAweDM0QjI2NEVELAorMHhEMTREOEJEQiwgMHg2NTEyREI1MiwgMHg0NTI5RDI0RCwgMHg2NDEyMUI1MSwKKzB4Njc0REQxNEEsIDB4NjcyMjJCNzIsIDB4NDcyOUQ2NEUsIDB4NjkyMjFCNzMsCisweDY4OUQyRkQyLCAweDY5MTIxQjgyLCAweDVBMTIyNjkyLCAweDVCMTQxNkEyLAorMHgxNkI0REE0NCwgMHgxNkM2NUMxNiwgMHgxNkVBNkVBMiwgMHg0RjI2N0YxQywKKzB4NkRGNjZFRjYsIDB4NkJGNjZDRjYsIDB4NjlGNjZBRjYsIDB4NjhGNjAwMEIsCisweDYwNjE2NjQyLCAweDhEMDRDODAzLCAweDYwNjFFNTAwLCAweDg4MDJDOTAzLAorMHg1MjYyOEIwMywgMHg1MTI0NjU2MywgMHgwMDBCMjQxMiwgMHgyRkQ2NjA1MywKKzB4NEYyMjJGRTYsIDB4NkU1MzdGRUMsIDB4RTU1MDYyNTMsIDB4RTQwMDZENDMsCisweEEwMDE0NTA4LCAweDUyMjRFMTAxLCAweDIyMTE2MDQzLCAweDgxMjM4MTIxLAorMHg4MTIyNjA1MywgMHgzNjIwNTZFMiwgMHhEMjJGOEJGNSwgMHg2NEYzMTZFNCwKKzB4NDIwQkU2MTQsIDB4NjVFMTY1RTMsIDB4MjU0OUU0RkMsIDB4NjFGMTJFNTEsCisweDIxNDk2NUYzLCAweDU0RDEyRjExLCAweDQxMEJEMTI3LCAweDU3RDFFNjE0LAorMHhDQjAxNjA3MSwgMHgxREUxMjcwMSwgMHg0RjI2N0YxNCwgMHgwMDBCNkVGNiwKKzB4MkZENjZERjYsIDB4NEYyMjJGRTYsIDB4NkU1MzdGRUMsIDB4RTVGQzY2NTMsCisweDYwNjE2RDQzLCAweENCMDEyMDU5LCAweDUyRTIyNjAxLCAweDhCMDYzMjYwLAorMHg1MUUyMTJFNCwgMHg4QjA0MzFFMCwgMHhBMDAyNTJEMSwgMHhBRkYwMUUyMiwKKzB4RDIxNTU2NjQsIDB4RTYxNDY0RjMsIDB4NjVFMzQyMEIsIDB4RTFGQzY3RTEsCisweDJFNzEyNzE5LCAweDU0RDE2N0YxLCAweEQxMEYyNzE5LCAweEU2MTQ2NUYzLAorMHgyRjcxNDEwQiwgMHg2MDIxNTJEMSwgMHgyMjAxQ0IwMSwgMHg3RjE0MURFMSwKKzB4NkVGNjRGMjYsIDB4NkRGNjAwMEIsIDB4MDAyMDI4QkMsIDB4MDAyMDI4QzQsCisweDAwMjAyOEI0LCAweDAwMjAyOEU0LCAweDAwMTAwMDhDLCAweDAwMTAwRUMwLAorMHgwMDFFMjEwOCwgMHgwMDFDM0QwMCwgMHgwMDIwMjE5NCwgMHgyRkM2MkZCNiwKKzB4MkZFNjJGRDYsIDB4RDYzMTRGMjIsIDB4NjBEMzZENjIsIDB4ODk0REM4MDMsCisweERCMzBEQzJGLCAweDAwMDlBMDJDLCAweEM5MDM2MDYxLCAweDg5MkI4ODAxLAorMHhEMjJERDQyQiwgMHgwMDA5NDIwQiwgMHg2NTAzNTYwMywgMHhDODIwODU2MSwKKzB4RTA1MDg5MDMsIDB4NzIwMTAyQkUsIDB4ODU2MjBCMjYsIDB4NDAwMDYwMEQsCisweDQwMDAzNjZBLCAweDQwMDA0NjI0LCAweDIwNkQ0NjI0LCAweEQ0MjNDOTAzLAorMHg0MDA4NkUwMywgMHhEMTIyNDAwMCwgMHgzNDBDNDEwQiwgMHg2MUUzRDUyMSwKKzB4RDcyMUUwMDEsIDB4NDUwQkQyMjEsIDB4NjRFMzdFMzAsIDB4MjcwMjQyMEIsCisweDY2QzI1MkMxLCAweDhCQ0YzNjIwLCAweDRFMThFRTAxLCAweEEwMTFEQjFDLAorMHg2MDYxRUM3NSwgMHg4ODAxQzkwMywgMHhENDE5ODkxMCwgMHg0NjBCRDYxMiwKKzB4RDQxODAwMDksIDB4NDcwQkQ3MTgsIDB4RDIxMzY1MDMsIDB4NjRDM0QxMTMsCisweDIyRTI0MTBCLCAweDY2QjI1MkIxLCAweDhCRUEzNjIwLCAweEM4MDQ2MEQzLAorMHhEMjEyODkwNiwgMHg2RUY2NEYyNiwgMHg2Q0Y2NkRGNiwgMHg2QkY2NDIyQiwKKzB4NkVGNjRGMjYsIDB4NkNGNjZERjYsIDB4NkJGNjAwMEIsIDB4MDAxRTIxMDAsCisweDAwMjAyOEJDLCAweDAwMjAyODU4LCAweDAwMjAwQUUwLCAweDAwMjAyOEM0LAorMHgwMDIwMEI2MiwgMHgwMDIwMjAzNCwgMHgwMDFDM0QzMCwgMHgwMDIwMERGMCwKKzB4MDAyMDI4QjQsIDB4MDAyMDI4RTQsIDB4MDAyMDBBRkUsIDB4MDAyMDAwRjgsCisweEU2MDFEMjM3LCAweDEyNjVENTM3LCAweDAwMEIyMjUyLCAweEQ2MzYxMjY2LAorMHg4ODAxNjA2MiwgMHhFMTAxOEI2MiwgMHhENTM0MjYxMiwgMHg1NDUxRDEzNCwKKzB4RTA0MDYyMTIsIDB4MjEyMjMyNEMsIDB4NTQxMTU3NTIsIDB4MTE0MTM0N0MsCisweDU3MTI1NDUzLCAweDExNzIzNzRDLCAweDUyMTM1NzU1LCAweDExMjMzMjdDLAorMHg1NjE0NjQ1MiwgMHgxMTY0MzY0QywgMHg1NDE1NTc1NCwgMHgxMTQ1MzQ3QywKKzB4NTYxNjU0NTgsIDB4MTE2NjM2NEMsIDB4Njc2MkQ2MjYsIDB4MzI3QzUyMTcsCisweDU3NjExMTI3LCAweDMyN0M1MjE4LCAweDU3NjIxMTI4LCAweDMyN0M1MjE5LAorMHg1NzYzMTEyOSwgMHgzNDdDNTQxQSwgMHg1NzY0MTE0QSwgMHgzNDdDNTQxQiwKKzB4NTc2NTExNEIsIDB4MzQ3QzU0MUMsIDB4NTI2NjExNEMsIDB4MzcyQzU3MUQsCisweDUyNjcxMTdELCAweDM0MkM1NDFFLCAweDUyNjgxMTRFLCAweDM2MkM1NjFGLAorMHhENjE1MTE2RiwgMHgwNDFFNjI2MiwgMHgzNDJDNzY5NCwgMHhFMDQ0MDE0NiwKKzB4MDYxRTYyNjIsIDB4MDE2NjM2MkMsIDB4NTI1Q0UwNDgsIDB4RDYwRjA1MUUsCisweDAxNTYzNTJDLCAweEUwNTQ2MjYyLCAweDQyMjkwNTFFLCAweDAxNTYzNTJDLAorMHhFMDU4NTU2MSwgMHg0NTI5MDYxRSwgMHgwMTY2MzY1QywgMHgwMDA5MDAwQiwKKzB4MDAxQzEwMTAsIDB4MDAwMEMzNEYsIDB4MDAxQzEwMjgsIDB4MDAxQzM2OUMsCisweDAwMjAyODU4LCAweDAwMUMzQ0EwLCAweDAwMUMzNkY0LCAweDAwMUMzQjg4LAorMHhENjJGN0ZGQywgMHgyNjQyNjQ0QywgMHhDODIwNTA2NiwgMHgyRjAyOERGQywKKzB4N0YwNDAwMEIsIDB4MkZENjJGQzYsIDB4NEYyMjJGRTYsIDB4NkQ0MzZDNTMsCisweEVFMDBBMDA0LCAweDdFMDE2NEQ0LCAweDY0NENCRkVBLCAweDhCRjkzRUMyLAorMHg2RUY2NEYyNiwgMHgwMDBCNkRGNiwgMHhBMDAxNkNGNiwgMHg3NjAxNjY0MywKKzB4MjIyODYyNjAsIDB4MzY0ODhCRkIsIDB4NjU2M0FGRTQsIDB4MkZCNjJGOTYsCisweDJGRDYyRkM2LCAweDRGMjIyRkU2LCAweEVDMUNFRDA4LCAweERCMTk2RTUzLAorMHg2MUMzRTkwQSwgMHg2MDQzNEIwQiwgMHgzMDkyQzkwRiwgMHg2NjAzOEQwMiwKKzB4NzYzMEEwMDEsIDB4NEQxMDc2MzcsIDB4N0UwMTJFNjAsIDB4N0NGQzhGRjEsCisweDgwNThFMDAwLCAweDZFRjY0RjI2LCAweDZDRjY2REY2LCAweDAwMEI2QkY2LAorMHgwMDBCNjlGNiwgMHgwMDBCRTAwMCwgMHgyRkU2RTAwMCwgMHg3RkVDNEYyMiwKKzB4NkU0MzYyNTMsIDB4QkZEMTY1RjMsIDB4QkZDNjY0MjMsIDB4QkZDNDY0RTMsCisweEQ0MDU2NEYzLCAweDAwMDlCRkMxLCAweDRGMjY3RjE0LCAweDZFRjYwMDBCLAorMHgwMDFDMDAwNCwgMHgwMDIwMjBGNCwgMHgwMDIwMjlDQywgMHhFMTEwRDU5QywKKzB4RTY0MDYwNTAsIDB4MjUwMEM5RkQsIDB4RTBGRjc1RTksIDB4ODA1MTY0NTMsCisweDgwNTM4MDUyLCAweDgwNTY4MDU1LCAweDI1MTA3NUVGLCAweEUxRUY2MjUwLAorMHgyMjE5RTAwMSwgMHhFNzIwMjUyMCwgMHgyNDYwODA1MiwgMHgyNTcwMDAwQiwKKzB4RTRGREQ1OTAsIDB4RTcwMjYxNTIsIDB4MjUxMjIxNDksIDB4NzQwMTYwNTIsCisweDI1MDJDQjAxLCAweEQxOEM2NjUyLCAweDI1NjIyNjQ5LCAweDkyQzI2MDEyLAorMHgyMTAyQ0IwOCwgMHhDOUNGNjAxMiwgMHg2MDEyMjEwMiwgMHgyMTAyQ0IwMywKKzB4MDAwQjExNzIsIDB4NEYyMjExMjMsIDB4RTEwMEQ0ODQsIDB4RDI4NUQ3ODQsCisweEQ1ODUyNDEwLCAweDI3MTFENDg1LCAweDIyMTFFNzAwLCAweEJGQkQyNTExLAorMHhENTgzMjQ3MSwgMHgyNTYwRTYwMCwgMHg0RjI2QUZEMiwgMHhEMjgxNjY0QywKKzB4MzYyQzQ2MDAsIDB4Q0IxMDYwNjAsIDB4MjYwMDAwMEIsIDB4RDI3RDY1NEMsCisweDM1MkM0NTAwLCAweEUxRUY2NjUwLCAweDAwMEIyNjE5LCAweDY2NEMyNTYwLAorMHg0NjAwRDI3OSwgMHg2MDYwMzYyQywgMHgwMDBCQ0IxMCwgMHg2NTRDMjYwMCwKKzB4NDUwMEQyNzUsIDB4NjY1MDM1MkMsIDB4MjYxOUUxRUYsIDB4MjU2MDAwMEIsCisweEQyNzA2NjRDLCAweDM2MkM0NjAwLCAweENCMDg2MDYwLCAweDI2MDAwMDBCLAorMHhEMjZDNjU0QywgMHgzNTJDNDUwMCwgMHhFMUY3NjY1MCwgMHgwMDBCMjYxOSwKKzB4NjY0QzI1NjAsIDB4NDYwMEQyNjgsIDB4NjA2MDM2MkMsIDB4MDAwQkNCMDgsCisweDY1NEMyNjAwLCAweDQ1MDBEMjY0LCAweDY2NTAzNTJDLCAweDI2MTlFMUY3LAorMHgyNTYwMDAwQiwgMHhENjVGNjI0QywgMHgzMjZDNDIwMCwgMHhDOTA4NjAyMCwKKzB4NDAyMTQwMjEsIDB4MDAwQjQwMjEsIDB4NjI0QzYwMEMsIDB4NDIwMEQ2NUEsCisweDYwMjAzMjZDLCAweDQwMjFDOTA4LCAweDQwMjE0MDIxLCAweDYwMEMwMDBCLAorMHhEMTU2NjQ0QywgMHgzNDFDNzRGRiwgMHgwMDBCNjI0MCwgMHhEMTU0NjAyQywKKzB4MzQxQzY0NEMsIDB4MDAwQjYyNDAsIDB4MkZFNjYwMkMsIDB4NjU1QzRGMjIsCisweDM1NjdFNjBBLCAweDZFNDM4RDE1LCAweDY0NTNCRkVBLCAweDYwRUM2NDBDLAorMHg4QjAyODgwMSwgMHhBMDAyRTAwRiwgMHg0NDA5MjQwOSwgMHg2MjRDNDQwOSwKKzB4MzI2M0U2MEEsIDB4QkZFMjg5MDUsIDB4NjIwQzY0NEMsIDB4Qzg4MDYwMjMsCisweEUyMDA4QjAwLCAweDRGMjY2MDIzLCAweDZFRjYwMDBCLCAweEQ2NDE0RjIyLAorMHg4ODAxNjA2MiwgMHhCMjIyOEIwMywgMHhBMDAzMDAwOSwgMHhEMjNFMDAwOSwKKzB4MjI2MEU2NDAsIDB4RTIwMEQ2M0QsIDB4MDAwQjRGMjYsIDB4NEYyMjI2MjIsCisweDYwNjJENjM4LCAweDhCMDE4ODAyLCAweDAwMDlCMjZDLCAweEUyMDBENjM3LAorMHgwMDBCNEYyNiwgMHgwRkZGMjYyMiwgMHhENDMzRDUzMiwgMHhFNzAxRTEwMCwKKzB4MDAwQjI1MTIsIDB4RDIzMDI0NzAsIDB4MDAwQkU2MDQsIDB4RDUyMDIyNjAsCisweDYxNTBFNEZELCAweDIxNDlENjJFLCAweDI1MTBFNzAwLCAweDI2NzAwMDBCLAorMHhFNEZCRDUxQiwgMHgyMjQ5NjI1MCwgMHgyNTIwMDAwQiwgMHhFNEY3RDUxOCwKKzB4MjI0OTYyNTAsIDB4MjUyMDAwMEIsIDB4RDIyNjRGMjIsIDB4NjAwRDg1MjIsCisweDg5MTEyMDA4LCAweDg5MTM4ODAxLCAweDg5MTU4ODAzLCAweDg5MTc4ODA1LAorMHg4OTQxODgwNiwgMHg4OTQ3ODgwOCwgMHg4OTREODgwOSwgMHg4OTUzODgwQSwKKzB4ODk1OTg4MEIsIDB4MDAwOUEwNjAsIDB4MDAwOUIwNjIsIDB4NjAwQ0EwNUQsCisweDAwMDlCMDcwLCAweDYwMENBMDU5LCAweDAwMDlCMDdBLCAweDYwMENBMDU1LAorMHg2MjYwRDYwNiwgMHg4QjRGMjIyOCwgMHgwMDA5QjA4NiwgMHg2MDBDQTA0RCwKKzB4MDAxRTEwMjgsIDB4MDAxRTIxNDgsIDB4MDAxRTExMDgsIDB4MDAyMDI5M0QsCisweDAwMjAyOTJDLCAweDAwMjAyOTJFLCAweDAwMjAyOTMwLCAweDAwMjAyOTEwLAorMHgwMDFFMTAwOCwgMHgwMDFFMTAzRiwgMHgwMDFFMTA1RiwgMHgwMDFFMTAzMCwKKzB4MDAxRTEwOTAsIDB4MDAyMDI5MzgsIDB4MDAxRTEwMEIsIDB4MDAyMDI5MzQsCisweDAwMjAyOTNDLCAweDAwMjAyOTA0LCAweDYyNjBENjg3LCAweDhCMjMyMjI4LAorMHgwMDA5QjA2QSwgMHg2MDBDQTAyMSwgMHg2MjYwRDY4MywgMHg4QjFCMjIyOCwKKzB4MDAwOUIwQjQsIDB4NjAwQ0EwMTksIDB4NjI2MEQ2N0YsIDB4OEIxMzIyMjgsCisweDAwMDlCMEJBLCAweDYwMENBMDExLCAweDYyNjBENjdCLCAweDhCMEIyMjI4LAorMHgwMDA5QjExRSwgMHg2MDBDQTAwOSwgMHg2MjYwRDY3NywgMHg4QjAzMjIyOCwKKzB4MDAwOUIxMzYsIDB4NjAwQ0EwMDEsIDB4NEYyNkUwMDAsIDB4MDAwOTAwMEIsCisweEQyNzNEMTcyLCAweEQ1NzM4NDEyLCAweDQwMDBDOTBGLCAweEQ3NzIwMTJELAorMHg2MTFDRTQwMywgMHhENjcxRTIwRiwgMHgyNzEyMjU0MCwgMHhFMDAxMjUyMCwKKzB4MjYwMjAwMEIsIDB4RTYwMUQyNjksIDB4MzA2Njg1MjMsIDB4RTAwMDhEMDYsCisweEUwMDBEMjY3LCAweDgxMjJENjY5LCAweDI2MDJFMDAxLCAweDAwMDkwMDBCLAorMHg4NTIzRDI2MiwgMHgyMDA4NjAwRCwgMHg4ODAxODkwNSwgMHhENjY0OEIwQSwKKzB4Q0IwMTYwNjAsIDB4RDY2MTI2MDAsIDB4RTEwMUQ0NUQsIDB4MjYxMkUwMDEsCisweDgxNDIwMDBCLCAweEUwMDAwMDBCLCAweEU1MDFEMTU4LCAweDQ1MTg4NTEzLAorMHgzNDUzNjQwRCwgMHg4RDA1NjYwMywgMHhEMjVBRTAwMCwgMHhFMDAxRDU1NywKKzB4MjUwMjIyNjAsIDB4MDAwOTAwMEIsIDB4RDE1MDRGMjIsIDB4NjUwRDg1MTMsCisweDQ0MTk2NDUzLCAweDY3MkU2MjQ5LCAweDYwMkMyMjdELCAweDg5MDk4ODAxLAorMHg4OTBDODgwMiwgMHg4OTEwODgwMywgMHg4OTI2ODgwNiwgMHg4OTI5ODgwNywKKzB4MDAwOUEwMzgsIDB4RDY0REQ1NEMsIDB4QTAyN0UyMTIsIDB4NjI1QzI2NTIsCisweDhCMkYyMjI4LCAweEEwMUVENjRBLCAweDYwNUM2MjYyLCAweDg5MDUyMDA4LAorMHg4OTA4ODgxMCwgMHg4OTBCODgyMCwgMHgwMDA5QTAyNCwgMHhENjQzRDQ0NSwKKzB4QTAxM0UyMDQsIDB4RDc0NDI2NDIsIDB4RTIwQ0Q2NDAsIDB4MjY3MkEwMEUsCisweEQ2M0VENTQyLCAweEEwMDlFMjE4LCAweEQ0NDEyNjUyLCAweEUyMEFENjNCLAorMHgyNjQyQTAwNCwgMHhENjM5RDIzRiwgMHhFMjJFMjYyMiwgMHhENDNFODUxNSwKKzB4MzI3NzY3MEQsIDB4OEYwMTI0MjEsIDB4MjQ1MTY1MDMsIDB4MDAwOUIwREYsCisweEUwMDFBMDAxLCAweDRGMjZFMDAwLCAweDAwMDkwMDBCLCAweEUxMDFENjI5LAorMHgyNjEwRDQzNiwgMHhENzI4NjU0MSwgMHg2NTVERDEyOCwgMHhFMDAxRTIwRiwKKzB4MjYyMDI3NTIsIDB4MjEwMjAwMEIsIDB4NEYyMjJGRTYsIDB4ODUyM0QyMUYsCisweDI0NDg2NDBDLCAweEQ2MkQ4QjA4LCAweEUyMDBENTIxLCAweDg0NTEyNjIxLAorMHgyMDQ5OTQzMCwgMHg4MDUxQTAyNiwgMHg2MEUwREUxRCwgMHg4RDBCQzg0MCwKKzB4MzQyN0UyMDEsIDB4RDEyNTg5MjIsIDB4NDIwQkQyMjUsIDB4RDUyNTIxNDEsCisweENCMDQ2MDUyLCAweDI1MDJBMDBCLCAweDg5MTczNDI3LCAweEQ3MjJEMjFGLAorMHgyMjQxNDcwQiwgMHhFNUZCRDYxRiwgMHgyMTU5NjE2MiwgMHg4NEUxMjYxMiwKKzB4QjEyRENCODAsIDB4NjBFMDgwRTEsIDB4Q0IwNEQ2MUMsIDB4NjA2MDJFMDAsCisweDI2MDBDOTNGLCAweEUwMDFENjA5LCAweDI2MDJBMDAxLCAweDRGMjZFMDAwLAorMHg2RUY2MDAwQiwgMHgwMDAwRkY3RiwgMHgwMDIwMjkzRCwgMHgwMDIwMjkwNCwKKzB4MDAyMDI5MTAsIDB4MDAxRTExMDAsIDB4MDAxRTEwMEMsIDB4MDAyMDI5MzQsCisweDAwMUUxMDAwLCAweDAwMUUxMDAxLCAweDAwMjAyQUY0LCAweDAwMjAyOTE4LAorMHgwMDIwMjkyMCwgMHgwMDIwMkI2MiwgMHgwMDIwMkI2NiwgMHgwMDIwMkI3MiwKKzB4MDAyMDJCOEEsIDB4MDAyMDJCOTQsIDB4MDAyMDI5MUMsIDB4MDAyMDI5MkEsCisweDAwMjAxQUI2LCAweDAwMUUxMTA4LCAweDAwMjAxQkMyLCAweDAwMUUxMDE1LAorMHg2MDYwRDY5NiwgMHg4OTE5Qzg4MCwgMHg2MDIxRDI5NSwgMHg4QjE1ODgwMSwKKzB4RTUwMUQyOTQsIDB4MzA1Njg1MjQsIDB4RDE5Mzg5MTAsIDB4RDQ5M0UyMDMsCisweDY1NDEyMTIwLCAweDY1NURFMDBCLCAweEQ1OTEwNjU2LCAweEU3MDJFNDBGLAorMHgyNTcxMjE0MCwgMHhFMDAxRDc4RiwgMHgyNzAyMDAwQiwgMHhFMDAwMDAwQiwKKzB4NEYyMjJGRTYsIDB4ODRFMURFOEMsIDB4ODkzNEM4ODAsIDB4ODU1NEQ1ODUsCisweDhGMzAyMDA4LCAweEQ3ODk2MTAzLCAweDY2NzI4NTUzLCAweDY1MEM2NDAzLAorMHg2MjBDODU2NiwgMHg4QjI2MzUyMCwgMHhENzgwRDY4NSwgMHg2NDRDNjUxQywKKzB4Mjc0MTI2NTEsIDB4Qzg0MDYwRTAsIDB4RDI4Mjg5MDcsIDB4MDAwOTQyMEIsCisweDYwNjJENjgxLCAweEEwMDhDQjA0LCAweEQxODAyNjAyLCAweDAwMDk0MTBCLAorMHhFNUZCRDY3RCwgMHgyNDU5NjQ2MiwgMHhCMEExMjY0MiwgMHhENTc1MDAwOSwKKzB4MjUyMkUyMDEsIDB4RDc3QTYwRTAsIDB4MkUwMENCMDQsIDB4QzkzRjYwNzAsCisweEEwMDEyNzAwLCAweEUwMDA2MDIzLCAweDAwMEI0RjI2LCAweDJGQTY2RUY2LAorMHgyRkM2MkZCNiwgMHgyRkU2MkZENiwgMHhFMjQwREE2OSwgMHhEQzY2NjZBMSwKKzB4MzEyMzYxNkQsIDB4NjI2Mzg5MDAsIDB4NkVEMzZEMkMsIDB4NEUyMTM2RDgsCisweDRFMjEyQTYxLCAweERCNkNENDZCLCAweEU3MDBBMDBGLCAweDc3MDE2NkIyLAorMHg3MTAyNjE2MywgMHg2NTYxMkIxMiwgMHg3MTAyNjYxMywgMHg2MjYxMkIxMiwKKzB4NjIyRDY1NUQsIDB4MzI1QzQyMjgsIDB4NjI3QzI0MjIsIDB4OEJFRDMyRTMsCisweEM5MDM2MEQzLCAweDhCMTA4ODAzLCAweEVEMDc2RUIyLCAweDcxMDI2MUUzLAorMHg2NzEzMkIxMiwgMHg2MkUxNzEwMiwgMHg2NTcxMkIxMiwgMHg2NTVENjIyRCwKKzB4MzUyQzQ1MjgsIDB4QTAwQzJDRDAsIDB4ODgwMjI0NTIsIDB4QTAwMzhCMDEsCisweDg4MDFFMjAzLCAweEUyMDE4QjA1LCAweDY2QjIyQzIwLCAweDY3N0Q2NzYxLAorMHhFQjBGMjQ3MiwgMHg2REExMkNCMCwgMHg4QjA1MkREOCwgMHhENDQ1RDI0RiwKKzB4RTEwMUVFMDAsIDB4MjQxMjIyRTIsIDB4NkRGNjZFRjYsIDB4NkJGNjZDRjYsCisweDZBRjYwMDBCLCAweDJGRTYyRkQ2LCAweEUyNDBERDNELCAweDYxNkQ2NkQxLAorMHg4OTAwMzEyMywgMHg2NzJDNjI2MywgMHhERTQzMzY3OCwgMHgyRDYxNzcwMywKKzB4RDY0MDQ3MjEsIDB4NDcyMTY0RTIsIDB4RTEwMEEwMEUsIDB4NzEwMTY1NjIsCisweDI0NTA2MjUzLCAweDQyMTk3NDAxLCAweDc0MDEyNDIwLCAweDI0NTA0NTI5LAorMHg0NTE5NzQwMSwgMHg3NDAxMjQ1MCwgMHgzMjczNjIxQywgMHg0MjAwOEJFRSwKKzB4NjREMTY2RTIsIDB4MzYyQzQyMDAsIDB4OEYwNjI0NDgsIDB4REQzMzJFNjIsCisweEU1MDBERTI4LCAweDJENTJFNzAxLCAweDZFRjYyRTcyLCAweDZERjYwMDBCLAorMHgyRkU2MkZENiwgMHhFRTAxNEYyMiwgMHhFRDBBQTAwNSwgMHg2NEUzQkNCNiwKKzB4NjRFM0JDQkMsIDB4NjJFQzdFMDEsIDB4OEJGNzMyRDcsIDB4RUUwMUEwMDUsCisweDY0RTNCQ0JELCAweDY0RTNCQ0MzLCAweDYyRUM3RTAxLCAweDhCRjczMkQ3LAorMHg2RUY2NEYyNiwgMHg2REY2MDAwQiwgMHgyRkU2MkZENiwgMHg3RkZDNEYyMiwKKzB4NjA2MEQ2MUYsIDB4ODk3NTg4MDEsIDB4RTEwMUQ0MUUsIDB4RDcxMjg1NDgsCisweDY1MEQyNjEwLCAweDQ1MTk2MDcwLCAweDY2NTlERDFCLCAweDYxRDM2MjZFLAorMHhDODQwMjYyRCwgMHg3NDAyNzEwMiwgMHg4RDQ3RDcxOCwgMHhEMjE4NjY2QywKKzB4RTUwMURFMEEsIDB4QTAzMTJFMjIsIDB4MDAwMEVFMDQsIDB4MDAxRTEwMDEsCisweDAwMjAyOTJBLCAweDAwMjAyOTA0LCAweDAwMUUxMTAwLCAweDAwMjAyOTJFLAorMHgwMDIwMjkxQywgMHgwMDIwMjkzNCwgMHgwMDFFMTAwMCwgMHgwMDIwMjkyMCwKKzB4MDAyMDI5MkMsIDB4MDAyMDFBQjYsIDB4MDAxRTExMDgsIDB4MDAyMDFCQzIsCisweDAwMUUxMDE1LCAweDAwMUUxMDBDLCAweDAwMjAyOTE4LCAweDAwMjAyOTM4LAorMHgwMDIwMjkzQywgMHgwMDIwMkFGNCwgMHgwMDIwMkI4QSwgMHgwMDIwMkI5NiwKKzB4MDAyMDJCMDYsIDB4NzUwMTYyNDUsIDB4NzEwMjIxMjEsIDB4MzJFMzYyNUMsCisweDYwNjM4QkY4LCAweEU2MDE4MUQ0LCAweEU0MTdENTM4LCAweDMyNDM2MjZDLAorMHg2MjU1ODkxRSwgMHgyNzIxNzYwMSwgMHg3NzAyQUZGOCwgMHhERTM1RDIzNCwKKzB4MkUyMkU1MDEsIDB4RUUwNEEwMDQsIDB4NzUwMTYyNDUsIDB4NzEwMjIxMjEsCisweDMyRTM2MjVDLCAweDYwNjM4QkY4LCAweEU2MDE4MUQ0LCAweEEwMDRENTJFLAorMHg2MjU1RTQxNywgMHgyNzIxNzYwMSwgMHg2MjZDNzcwMiwgMHg4QkY4MzI0MywKKzB4MkQyMTkyNEIsIDB4RDcyQUQ0MjksIDB4MkYxMjYxNDIsIDB4NkRGMjY1RjIsCisweEM5ODA2MDUzLCAweDYwNTMyNzAwLCAweDYxMDNDOTYwLCAweDYwNTM4MDcxLAorMHg2NUYyNkVGMiwgMHg0RDE5QzkwMywgMHg4MDcyNDUyOSwgMHg0NTE5NjBEQywKKzB4NEUyOTgxNzIsIDB4NjJFQzYwNUMsIDB4MzAyQzQwMTgsIDB4NkQ0MjgxNzMsCisweDJGRDIyMTE4LCAweDYyRjI2RUYyLCAweDQyMTk2NkYyLCAweDY1NkM0NjI5LAorMHg2MDJDNjZGMiwgMHg0MDE4NjRFQywgMHgzMDRDNDYyOSwgMHg4MTc0NDYxOSwKKzB4NDAxODYwNkMsIDB4OEYwNzMwNUMsIDB4QkNCNTgxNzUsIDB4NjIwQzAwMDksCisweDg5MDgyMjI4LCAweDAwMDlBMDBBLCAweDg4NDA2MDEzLCAweEIwMEE4QjAzLAorMHhBMDAzMDAwOSwgMHhENjBCMDAwOSwgMHgyNjIyRTIwMiwgMHg0RjI2N0YwNCwKKzB4MDAwQjZFRjYsIDB4MDAwQjZERjYsIDB4MDYwQTAwMDksIDB4MDAyMDJCMzYsCisweDAwMjAyQjM0LCAweDAwMjAyOTIwLCAweDAwMjAyQjA4LCAweDAwMUUxMDBDLAorMHgwMDIwMjkwNCwgMHgwMDIwMjkzNCwgMHg3RkZDNEYyMiwgMHg2NjIwRDI3RSwKKzB4OEQwODI2NjgsIDB4RDQ3RDJGNjAsIDB4NDIwQkQyN0QsIDB4NjRGMDAwMDksCisweEEwOTA3RjA0LCAweDdGMDQ0RjI2LCAweDAwMEI0RjI2LCAweDAwMEIwMDA5LAorMHgyRkU2MDAwOSwgMHhERTc3NEYyMiwgMHg2MEUwRDY3NywgMHhDQkMwRDQ3NywKKzB4NjI2MDJFMDAsIDB4QzgwMzYwMkMsIDB4NDAyMTg5MDQsIDB4NzAwMTQwMjEsCisweDY2MDNBMDAyLCAweDY2MDM0MDA5LCAweEQ2NzE2MTZELCAweEU1MDBBMDA0LAorMHg3NTAxNjI2MiwgMHg3NDA0MjQyMiwgMHgzMjEzNjI1RCwgMHhEMTZEOEJGOCwKKzB4MDAwOTQxMEIsIDB4RTQwMUQ2NkMsIDB4ODRFMjI2NDEsIDB4ODBFMkM5QkYsCisweDAwMEI0RjI2LCAweDJGRTY2RUY2LCAweEQ1Njg3RkZDLCAweDYyNTBERTYxLAorMHg2NDJDODRFMiwgMHhDQjQwNzQwNCwgMHg4MEUyNjE0RCwgMHg0NDIxNjQxMywKKzB4RDc2MzQ0MjEsIDB4RTYwMEEwMDQsIDB4NzYwMTYyNTYsIDB4MjcyMjJGMjIsCisweDMyNDM2MjZELCAweDYwMTM4QkY4LCAweDIwMDhDOTAzLCAweDg4MDM4OTEyLAorMHg4ODAyODkwNSwgMHg4ODAxODkwNiwgMHhBMDA4ODkwNywgMHhFMDA3MDAwOSwKKzB4ODA3OEEwMDUsIDB4QTAwMkUwMDMsIDB4RTAwMTgwNzgsIDB4NjI1MjgwNzgsCisweDI3MjIyRjIyLCAweEQ2NTBFMDBGLCAweDYwNjE4MDc4LCAweDhCMDE4ODAxLAorMHgyNjIxRTIwMCwgMHg2MDYwRDY0RiwgMHgyNjAwQ0IwOCwgMHhDOTNGNjBFMCwKKzB4N0YwNDJFMDAsIDB4NkVGNjAwMEIsIDB4NjAyMUQyNDcsIDB4OEQxODg4MDEsCisweEQyNDY2MTQzLCAweDIyMTA2MDUzLCAweDYwNjM4MDIxLCAweEQ0NDY4MTIxLAorMHhFNTAwQTAwNywgMHgwMjdDNjA1RCwgMHgzNjRDNjYwMywgMHgyNjIwNzAwMSwKKzB4NjI1RDY1MDMsIDB4MzIxMzYxMUMsIDB4RDY0MDhCRjQsIDB4QzlCRjYwNjAsCisweDAwMEIyNjAwLCAweDJGRDYwMDA5LCAweDRGMjIyRkU2LCAweDYwNDM3RkZDLAorMHg4RDAyQzgyMCwgMHhCRjZBNkU0MywgMHg2MEUzMDAwOSwgMHg4OTAxQzgxMCwKKzB4MDAwOUJGNjcsIDB4Qzg0MDYwRTMsIDB4QkY4Qzg5MDEsIDB4NjBFMzAwMDksCisweDg5MjlDODAxLCAweDYwRDBERDMyLCAweDhEMDNDODAyLCAweEQ2MzEyRjAwLAorMHgwMDA5NDYwQiwgMHhDODA0NjBGMCwgMHhENjJGODkwMiwgMHgwMDA5NDYwQiwKKzB4NjAyMzYyRjAsIDB4ODkwMkM4ODAsIDB4Qzk3RjYwRDAsIDB4NjAyMzJEMDAsCisweDg5MDJDODAxLCAweDQyMEJEMjI5LCAweEQ1MjkwMDA5LCAweDg4MDI2MDUyLAorMHhEMjI4OEIwMywgMHhBMDA1RTYwNCwgMHg4ODAxMjI2MCwgMHhEMjI1OEIwMiwKKzB4MjI2MEU2MDEsIDB4MjUyMkUyMDAsIDB4Qzg4MDYwRTMsIDB4RDIyMjg5MTYsCisweDYwRTM2RTIwLCAweDg5MDJDODAyLCAweDQyMEJEMjIwLCAweDYwRTMwMDA5LAorMHg4OTAyQzgwNCwgMHg0MjBCRDIxRSwgMHg2MEUzMDAwOSwgMHg4OTA1QzgwOCwKKzB4N0YwNEQyMUMsIDB4NkVGNjRGMjYsIDB4NkRGNjQyMkIsIDB4NEYyNjdGMDQsCisweDAwMEI2RUY2LCAweDAwMDA2REY2LCAweDAwMUUxMDIwLCAweDAwMjAyOUQwLAorMHgwMDIwMEUyQSwgMHgwMDFFMTAxNSwgMHgwMDFFMTBCRiwgMHgwMDExN0QwMCwKKzB4MDAxRTEwRkMsIDB4MDAyMDAwRjgsIDB4MDAyMDI5MzAsIDB4MDAxMTdEODAsCisweDAwMUUxMEY4LCAweDAwMUUxMEFFLCAweDAwMTE3RDg0LCAweDAwMUUxMDE3LAorMHgwMDFFMTAyMSwgMHgwMDIwMTA1QywgMHgwMDIwMTA3RSwgMHgwMDIwMTYwOCwKKzB4MDAyMDI5MzQsIDB4MDAxRTEwMEIsIDB4MDAxRTEwMjgsIDB4MDAyMDEwQUUsCisweDAwMjAxMEMwLCAweDAwMjAxMENDLCAweEQ2QTg2NDRDLCAweDM0NkM3NEZGLAorMHgyNDUwMDAwQiwgMHg2NDRDRDZBNiwgMHgwMDBCMzQ2QywgMHhENkE1MjQ1MCwKKzB4MzQ2QzY0NEMsIDB4MjQ1MDAwMEIsIDB4NjE2RDYyNUMsIDB4NDExOTQyMDgsCisweDYwMTk0MjA4LCAweDY0NEM0MjAwLCAweDMyNEM2NzBFLCAweDIwN0REMTlFLAorMHhDOTBGNDIwMCwgMHgwMDBCMzIxQywgMHg2NzYzMjIwMCwgMHg0MjA4NjI1QywKKzB4NDIwMDQyMDgsIDB4MzI0QzY0NEMsIDB4NDIwMEQxOTgsIDB4MDAwQjMyMUMsCisweDJGRTYyMjcwLCAweDYxNEM0RjEyLCAweDQxMDBENDkzLCAweDY3MTAzMTRDLAorMHgyNzI5RTI5RiwgMHg2NTczNkU1MywgMHg0NzE5Njc2RCwgMHg2NzJFNjI3OSwKKzB4NDIyMTIyN0QsIDB4NDIyMTQyMjEsIDB4NzYwMTY2MkMsIDB4RTQwMTQ2MDgsCisweDM0RTg0NjA4LCAweDY0NEM0NjAwLCAweDBFMUEwNDY3LCAweDIxNTAyNUVCLAorMHgwMDBCNEYxNiwgMHg0RjIyNkVGNiwgMHhEMjg1N0ZFOCwgMHg4ODAxNjAyMSwKKzB4RDI4NDhCN0IsIDB4MjY2ODY2MjEsIDB4RDI4MzhCNzcsIDB4MjY2ODY2MjEsCisweEU1MEY4QjczLCAweEU0MDFCRkEwLCAweEJGQTNFNTAxLCAweEU1ODZFNDAwLAorMHhFNDAwNjU1QywgMHgyRjUwQkZBMywgMHhCRkEwRTQwMSwgMHhFNjAyRTUwNiwKKzB4NjA2MzQ2MTgsIDB4ODFGMkU0MDEsIDB4NjU0M0JGOUUsIDB4RTQwMTg1RjIsCisweEJGQUE2NTQzLCAweDg1RjI2NjAzLCAweDY1NDNFNDAxLCAweDY2MDNCRkIxLAorMHhFNDAyNjVGMCwgMHg2MDUzNzU2QywgMHg4MEY4QkY3RSwgMHhCRjgxRTQwMiwKKzB4ODRGOEU1MTIsIDB4NzA5MEU0MDIsIDB4NjUwM0JGODEsIDB4NDYxOEU2MDIsCisweDgxRjY2MDYzLCAweEJGN0ZFNDAyLCAweDg1RjZFNTAwLCAweDY2MDNFNDAyLAorMHhFNTAwQkY4QiwgMHhFNDAyODVGNiwgMHhCRjkyNjYwMywgMHhFNUZFRTUwMCwKKzB4RTAxMDY1NUMsIDB4QkY1RkU0MDMsIDB4RTUxMzBGNTQsIDB4RTQwRUJGNjIsCisweDA1RkNFMDEwLCAweEJGNjJFNDBFLCAweEU1MDA3NTg1LCAweEJGNjNFNDAzLAorMHhFNTAwRTY0MCwgMHhCRjcwRTQwMywgMHhFNTAwRTY0MCwgMHhCRjc4RTQwMywKKzB4RTVGRkU2NDAsIDB4RTAxNDY1NUMsIDB4QkY0NUU0MDQsIDB4RTQwRjBGNTQsCisweEU1MDRCRjQ4LCAweDA1RkNFMDE0LCAweEJGNDhFNDBGLCAweEU1MDE3NTg0LAorMHhCRjQ5RTY0MCwgMHhFNTAxRTQwNCwgMHhCRjU2RTY0MCwgMHhFNTAxRTQwNCwKKzB4RTQwNEU2NDAsIDB4QUY1QzdGMTgsIDB4N0YxODRGMjYsIDB4MDAwQjRGMjYsCisweDRGMjIwMDA5LCAweEQyNDI3RkYwLCAweDg4MDE2MDIxLCAweEQyNDE4QjcxLAorMHgyNjY4NjYyMSwgMHhEMjQwOEI2RCwgMHgyNjY4NjYyMSwgMHhFNTBGOEI2OSwKKzB4RTQwMUJGMUEsIDB4QkYxREU1MDEsIDB4RTU4NkU0MDAsIDB4RTQwMDY1NUMsCisweDJGNTBCRjFELCAweEJGMUFFNDAxLCAweEU0MDFFNTA2LCAweEJGMUI2NTQzLAorMHhFNDAxRTY0MCwgMHhCRjI4NjU0MywgMHhFNDAxRTY0MCwgMHhCRjMwNjU0MywKKzB4NjVGMEU2NDAsIDB4NzU2Q0U0MDIsIDB4QkVGRDYwNTMsIDB4RTQwMjgwRjQsCisweEU1MTJCRjAwLCAweEU0MDI4NEY0LCAweEJGMDA3MDkwLCAweEU2NDA2NTAzLAorMHhCRjAxRTQwMiwgMHhFNjQwRTUwMCwgMHhCRjBFRTQwMiwgMHhFNjQwRTUwMCwKKzB4QkYxNkU0MDIsIDB4RTVGRUU1MDAsIDB4NjA1MzY1NUMsIDB4QkVFM0U0MDMsCisweEU1MTM4MEY4LCAweEU0MEVCRUU2LCAweEU0MEU4NEY4LCAweEJFRTY3MDg1LAorMHhFNTAwNjUwMywgMHhCRUU3RTY0MCwgMHhFNTAwRTQwMywgMHhCRUY0RTY0MCwKKzB4RTUwMEU0MDMsIDB4QkVGQ0U2NDAsIDB4RTVGRkU0MDMsIDB4NjA1MzY1NUMsCisweEJFQzlFNDA0LCAweEU0MEY4MEZDLCAweEU1MDRCRUNDLCAweEU0MEY4NEZDLAorMHhCRUNDNzA4MywgMHhFNTAxNjUwMywgMHhCRUNERTY0MCwgMHhFNTAxRTQwNCwKKzB4QkVEQUU2NDAsIDB4RTUwMUU0MDQsIDB4RTQwNEU2NDAsIDB4QUVFMDdGMTAsCisweDdGMTA0RjI2LCAweDAwMEI0RjI2LCAweDAwMDAwMDA5LCAweDAwMUUxMDMwLAorMHgwMDFFMTA4MCwgMHgwMDFFMTA5MCwgMHgwMDFFMTAzRiwgMHgwMDFFMTAzRSwKKzB4MDAyMDI5MkEsIDB4MDAyMDI5MkMsIDB4MDAyMDI5MkUsIDB4MDAwOTAwMEIsCisweDY2NkNFNjgwLCAweDY1NjNEMkEwLCAweDc1NDBFNzAwLCAweDY0NzM0MjJCLAorMHgyRkI2MkZBNiwgMHgyRkQ2MkZDNiwgMHg0RjIyMkZFNiwgMHg0QzE4RUMwMSwKKzB4REE5QkRCOUEsIDB4NjVCMjUyQjEsIDB4ODkyMjM1MjAsIDB4QzkwMzYwNTEsCisweDg5MUU4ODAxLCAweEQxOTdERTk1LCAweDY0RTM0MTBCLCAweDg1MDM2NTAzLAorMHg2NzBENjZBMiwgMHhERDk0Mzc2MiwgMHhENDk0ODkwQSwgMHg0MjBCRDI5NCwKKzB4RDE5NDAwMDksIDB4RTcwMUQ0OTQsIDB4MjE3MjREMEIsIDB4MDAwOUFGRTIsCisweDQyMEJEMjkyLCAweEQ2OTI2NEUzLCAweDREMEJENDkyLCAweEFGRDkyNkMyLAorMHg0RjI2MDAwOSwgMHg2REY2NkVGNiwgMHg2QkY2NkNGNiwgMHg2QUY2MDAwQiwKKzB4N0ZGNDRGMjIsIDB4RTY4MTg1NDYsIDB4ODU0NzJGMDEsIDB4ODFGMTY2NkMsCisweEQyN0Q4NTQ4LCAweDg1NDI4MUYyLCAweDgxRjM2N0YzLCAweEU0MEM4NTQzLAorMHg2MDUzODFGNCwgMHg4MUY1NjU2MywgMHg3NTQwNDIwQiwgMHg0RjI2N0YwQywKKzB4MDAwOTAwMEIsIDB4MkY5NjJGODYsIDB4MkZCNjJGQTYsIDB4MkZENjJGQzYsCisweDRGMjIyRkU2LCAweEUyMDA3RkVDLCAweEEwQ0JEQjdCLCAweDZBMTMyRjIxLAorMHg0QTA4RDI3QSwgMHhERTdBRTAwMSwgMHg0QTAwNDIwQiwgMHg3RTMwM0FFQywKKzB4MUYwMjFGRTEsIDB4NjZCMkRENzcsIDB4MzYyMDUyQjEsIDB4QTBCNThCMDEsCisweDYwNjEwMDA5LCAweDg4MDFDOTAzLCAweEEwQUY4QjAxLCAweDg1NjEwMDA5LAorMHg4OTc0QzgwMSwgMHhFRTEwNTE2MywgMHhEQzYzODUxMiwgMHhDOTAzNjYwMywKKzB4ODUxMzY0MDMsIDB4NDAyMTYwMEQsIDB4QzkzRjQwMjEsIDB4OEQyMDMwRTMsCisweEQ3Njk2NTAzLCAweDYyNzA0NDA4LCAweDQ0MDA0NDA4LCAweDIyMjg0NTAwLAorMHgzNDVDOEYwQywgMHg2MDQzRDI2NSwgMHg2MjVEMDUyRCwgMHg2MDI5NDIxOSwKKzB4MjA3RDY3MEUsIDB4NjA1QzgxRjYsIDB4ODFGOEEwMEIsIDB4NjA0M0QyNjAsCisweDY4NUQwNTJELCAweDYwODk0ODE5LCAweDIwOUQ2OTBFLCAweDYwNUM4MUY2LAorMHhENzVDODFGOCwgMHgyMjI4NjI3MiwgMHhFMEZGODkwMiwgMHg4MUY4NjAwQywKKzB4RUVGRjg1RjgsIDB4NkVFQzY1MEQsIDB4OEIwRjM1RTAsIDB4NEUwQkRFNDUsCisweDU0MDM2NEIzLCAweEJGN0JFNTAyLCAweEQ0NTM2ODAzLCAweDQxMEJEMTQ3LAorMHhENzUyNjU4MywgMHhENDUyRTkwMSwgMHgyNzkyQTAyMCwgMHgyNkU5RUVGQywKKzB4ODExMjYwNjMsIDB4OTQ2RTg1MTMsIDB4ODExMzIwNDksIDB4NDUwODg1MTIsCisweDYyMDM2OTUzLCAweEU1MDg4NUY2LCAweDgxMTIyMDJCLCAweDQ1MTg4NTEzLAorMHg4MTEzMjA5QiwgMHhENDQ3ODUxNCwgMHg4MTE0MjA1QiwgMHg4NTExNjFCMiwKKzB4ODExMTIwRTksIDB4NjAyMTYyQjIsIDB4MjIwMUNCMDEsIDB4MDAwOTRDMEIsCisweDU2RjE2MEIyLCAweENCMDE1MkYyLCAweEFGN0MyQTAyLCAweDg1NjEyNjIyLAorMHhDODAyREMzQSwgMHhEOTM4RDIyNywgMHg4RDBGRDgyQywgMHg0MjBCNjRCMywKKzB4NjUwMzAwMDksIDB4NDgwQjY0OTMsIDB4RTgwMTVFMDMsIDB4ODVFRjJDODIsCisweDY1MERENjM1LCAweDY0RDM0NjBCLCAweDAwMDlBRjY1LCAweDAwMDk0MjBCLAorMHg2RTAzNTQwMywgMHhFNTA4ODU0NCwgMHg0NTE4NjEwMywgMHgzMTUwMjE1OSwKKzB4QkYyNThCMDMsIDB4QTAwN0U1MDEsIDB4ODU0MTAwMDksIDB4NjIwREQ1MkIsCisweDg5MDEyMjU4LCAweEU1MDBCRjFDLCAweDQ4MEI2NDkzLCAweEQ0Mjg2NUUzLAorMHhFODAxRDYxMSwgMHgyQzgyNDYwQiwgMHgwMDA5QUY0NSwgMHg3QjA4NjJGMSwKKzB4MkYyMTcyMDEsIDB4RUUwMzYyRjEsIDB4MzFFNzYxMkQsIDB4QUYyRTg5MDEsCisweDdGMTQwMDA5LCAweDZFRjY0RjI2LCAweDZDRjY2REY2LCAweDZBRjY2QkY2LAorMHgwMDBCNjlGNiwgMHhGRTAzNjhGNiwgMHgwMDIwMThCOCwgMHgwMDIwMjhFNCwKKzB4MDAyMDI4RUMsIDB4MDAyMDBBRTAsIDB4MDAyMDBFMkEsIDB4MDAyMDI4QjQsCisweDAwMjAwQjYyLCAweDAwMUUyMTMwLCAweDAwMjAyQUQ0LCAweDAwMjAwQUZFLAorMHgwMDFDM0QzMCwgMHgwMDIwMkFEOCwgMHgwMDIwMjhDNCwgMHgwMDIwMjAzNCwKKzB4MDAxQzNEMDAsIDB4MDAyMDJBRTQsIDB4MDAyMDJBRjAsIDB4MDAyMDI5RDQsCisweDAwMjAyQTU0LCAweDAwMjAyOTAwLCAweDAwMjAyOEJDLCAweDAwMUUyMTJDLAorMHgwMDIwMkFEQywgMHgwMDIwMkFFMCwgMHgwMDIwMEU4QSwgMHgwMDAwODAwMCwKKzB4MDAyMDJBRUMsIDB4NEYyMjJGRTYsIDB4NkUyMkQyMEQsIDB4Qzg0MDYwRTMsCisweDIyRTI4RDAyLCAweDAwMDlCRTdBLCAweDQyMThFMjQwLCAweDg5MDEyRTI4LAorMHgwMDA5QkU3NiwgMHhDODA1NjBFMywgMHhCRUNCODkwMSwgMHg2MEUzMDAwOSwKKzB4ODkwMkM4MDIsIDB4QUU3MzRGMjYsIDB4NEYyNjZFRjYsIDB4NkVGNjAwMEIsCisweDAwMUMzNTEwLCAweDA4MEEwQzBFLCAweDAwMDIwNDA2LCAweDFBMUMxRTIwLAorMHgxMjE0MTYxOCwgMHgyRTMwMzIzNCwgMHgyNjI4MkEyQywgMHgzQTNDM0U0MCwKKzB4NkM2MjU2NDgsIDB4NDExMTJGMjYsIDB4RTIyMDhGMTgsIDB4ODkwQjMxMjMsCisweDMyMUNEMjA0LCAweEQxMDI2MjIwLCAweDQxMkIzMTJDLCAweDAwMDkwMDA5LAorMHgwMDIwMjA1RSwgMHgwMDIwMjAxNCwgMHgwMDBCRTAwMCwgMHg0MDAwNjJGNiwKKzB4NDAwMDQwMDAsIDB4NDAwMDQwMDAsIDB4NDAwMDQwMDAsIDB4NjJGNjAwMEIsCisweDQwMDA0MDAwLCAweDQwMDA0MDAwLCAweDQwMDA0MDAwLCAweDQwMTg0MDAwLAorMHg2MkY2MDAwQiwgMHg0MDAwNDAwMCwgMHg0MDAwNDAwMCwgMHg0MDAwNDAwMCwKKzB4NDAyODQwMDAsIDB4NjJGNjAwMEIsIDB4NDAwMDQwMDAsIDB4NDAxODQwMDAsCisweDAwMEI0MDI4LCAweEM5MEY2MkY2LCAweDQwMDU0MDA1LCAweDQwMDU0MDA1LAorMHg2MkY2MDAwQiwgMHg0MDA1QzkwNywgMHg0MDA1NDAwNSwgMHg2MkY2MDAwQiwKKzB4NDAwNUM5MDMsIDB4MDAwQjQwMDUsIDB4QzkwMTYyRjYsIDB4MDAwQjQwMDUsCisweDAwMDA2MkY2LCAweDA4MEEwQzBFLCAweDAwMDIwNDA2LCAweDFBMUMxRTIwLAorMHgxMjE0MTYxOCwgMHgyRTMwMzIzNCwgMHgyNjI4MkEyQywgMHgzQTNDM0U0MCwKKzB4NkM2MjU2NDgsIDB4NDExMTJGMjYsIDB4RTIyMDhGMTgsIDB4ODkwQjMxMjMsCisweDMyMUNEMjA0LCAweEQxMDI2MjIwLCAweDQxMkIzMTJDLCAweDAwMDkwMDA5LAorMHgwMDIwMjExRSwgMHgwMDIwMjBENCwgMHgwMDBCRTAwMCwgMHg0MDAxNjJGNiwKKzB4NDAwMTQwMDEsIDB4NDAwMTQwMDEsIDB4NDAwMTQwMDEsIDB4NjJGNjAwMEIsCisweDQwMDE0MDAxLCAweDQwMDE0MDAxLCAweDQwMDE0MDAxLCAweDQwMTk0MDAxLAorMHg2MkY2MDAwQiwgMHg0MDAxNDAwMSwgMHg0MDAxNDAwMSwgMHg0MDAxNDAwMSwKKzB4NDAyOTQwMDEsIDB4NjJGNjAwMEIsIDB4NDAwMTQwMDEsIDB4NDAxOTQwMDEsCisweDAwMEI0MDI5LCAweDQwMDQ2MkY2LCAweDQwMDQ0MDA0LCAweEM5MEY0MDA0LAorMHg2MkY2MDAwQiwgMHg0MDA0NDAwNCwgMHhDOTA3NDAwNCwgMHg2MkY2MDAwQiwKKzB4NDAwNDQwMDQsIDB4MDAwQkM5MDMsIDB4NDAwNDYyRjYsIDB4MDAwQkM5MDEsCisweDAwMDA2MkY2LCAweDM2MjJFMjE4LCAweDY3NDM4RjEyLCAweDAwMDlBMDA0LAorMHg3NkZGNjI1NCwgMHg3NDAxMjQyMCwgMHhDODAzNjA1MywgMHg2MDQzOEJGOCwKKzB4ODkwMkM4MDMsIDB4NDIyQkQyMkIsIDB4RDIyQjAwMDksIDB4MDAwOTQyMkIsCisweDJGRTY2NDczLCAweDhENEEzNDUwLCAweDI3Nzg2NzYzLCAweDYyNDM4OTQ3LAorMHgyMjdCMjI1QiwgMHhDOTAxNjAyMywgMHg4RDIwMzQ1MiwgMHgyRUU4NkUwMywKKzB4NjAyMzhCMTUsIDB4OEIwOEM4MDMsIDB4NDcwOTY2NDMsIDB4NDcxMDYyNTYsCisweDhGRkIyNjIyLCAweEEwMzI3NjA0LCAweDQ3MDEwMDA5LCAweDYxNDM2NjczLAorMHg0NjEwNjI1NSwgMHg4RkZCMjEyMSwgMHhBMDI4NzEwMiwgMHg2NjQzMDAwOSwKKzB4NDcxMDYyNTQsIDB4OEZGQjI2MjAsIDB4QTAyMDc2MDEsIDB4NjE0MzAwMDksCisweDJFRTgzNTdDLCAweDhGMTUzMTdDLCAweDYwMjM2NjUzLCAweDhCMDdDODAzLAorMHg3NkZDNDcwOSwgMHg0NzEwNjI2MiwgMHgyMTI2OEZGQiwgMHgwMDA5QTAwRiwKKzB4NjU2MzQ3MDEsIDB4NzVGRTY2NzMsIDB4NDYxMDYyNTEsIDB4MjEyNThGRkIsCisweDAwMDlBMDA1LCAweDYyNjA3NkZGLCAweDhGRkI0NzEwLCAweDYwNDMyMTI0LAorMHg2RUY2MDAwQiwgMHgwMDIwMjMwNiwgMHgwMDIwMjdCMiwgMHhFMjFFMkZFNiwKKzB4Njc2MzM2MjYsIDB4OEQxQjYxNTMsIDB4M0UxMDZFNDMsIDB4M0UxMjg5MTYsCisweDY1RTM4OTA4LCAweDM2NzJFNjAwLCAweDYyMTQ4OTEwLCAweDI1MjA3NjAxLAorMHg3NTAxQUZGOSwgMHgzMTdDNjRFMywgMHg2NTEzMzQ3QywgMHhFNjAwQTAwNCwKKzB4NjI1MDc1RkYsIDB4MjQyNDc2MDEsIDB4OEJGOTM2NzIsIDB4NjBFM0EwMTEsCisweDg5MDgzMUUyLCAweDMyN0M2MjEzLCAweDhCMDQzMkU2LCAweDY1MTM2NEUzLAorMHhBMDA4NjY3MywgMHhEMjhGNkVGNiwgMHg2NTEzNjRFMywgMHg0MjJCNjY3MywKKzB4MDAwQjZFRjYsIDB4RTIwNDZFRjYsIDB4Njc0MzM2MjIsIDB4OEYxMDM1NkMsCisweEEwMDQzNDZDLCAweDc1RkYwMDA5LCAweDc2RkY2MjUwLCAweDYwNTMyNDI0LAorMHg4QkY4QzgwMywgMHhDODAzNjA0MywgMHhBMTA1ODkwMSwgMHhBMjc3MDAwOSwKKzB4QTI5OTAwMDksIDB4MkZCNjAwMDksIDB4MkZENjJGQzYsIDB4N0ZFNDJGRTYsCisweDZDNjM2MDQzLCAweDY2NTIxRjYyLCAweEM5MDM3NTA0LCAweDFGNTE2RTUzLAorMHg0NTA4NjUwMywgMHhFMUZDNkQ0MywgMHgyRDE5NDUwMCwgMHgxRjczMjU1OCwKKzB4MUY2NTFGNDQsIDB4MkZEMjhEMEIsIDB4ODgwODYwNTMsIDB4ODgxMDg5MjMsCisweDg4MTg4OTVCLCAweEEwODk4QjAxLCAweEEwQkQwMDA5LCAweDYyNjMwMDA5LAorMHgyRDIyRTYwMCwgMHg3Q0ZDN0QwNCwgMHhFQjEwQTAwRCwgMHhFNjAwNjRFNiwKKzB4N0NGMDY1RTYsIDB4NjJFMjYxRTYsIDB4MUQ1MTJENDIsIDB4MUQyMzFEMTIsCisweDdFMDQ3RDEwLCAweDNDQjIxRkUxLCAweDFGNjU4OUYwLCAweDJGRDIxRkMyLAorMHhBMEExMUZFNiwgMHg2NEQyMUZENCwgMHg0NDI4NjI2MywgMHg0NDI5NDQxOCwKKzB4NDIxODQ0MTksIDB4NDYyOTI0MkIsIDB4MkQ0MjQ2MTksIDB4NjU2MzdEMDQsCisweEEwMjE3Q0ZELCAweDY3RTZFQjEwLCAweDYyRTY3Q0YwLCAweDY0RTY2NjczLAorMHgyNTZCNDYxOCwgMHgyRDUyNjFFMiwgMHg2NTIzNDcyOSwgMHg0NTE4NDcxOSwKKzB4NDIyOTI3NUIsIDB4NDIxOTFENzEsIDB4NDcxODY3NDMsIDB4NDQyOTIyN0IsCisweDQ0MTk2NzEzLCAweDI0N0I0NzE4LCAweDFENDMxRDIyLCAweDQxMTk0MTI5LAorMHg2NTEzN0QxMCwgMHgxRkUxN0UwNCwgMHg4OURDM0NCMiwgMHgxRkU2N0VGRiwKKzB4MUZDMjFGNTUsIDB4QTA2NzJGRDIsIDB4NkNGMjFGRDQsIDB4NjZDMjU3RjUsCisweDQ2Mjg2MjczLCAweDQyMjg0NjI5LCAweDJDNjIyNjJCLCAweDdDMDQ1REYyLAorMHg3REZFNDcyOSwgMHhBMDFDRUIxMCwgMHg2NUU2NUVGMSwgMHg2NkU2NjI3MywKKzB4NDcyODY3NTMsIDB4Njc2MzIyN0IsIDB4NDUyOTYxRTYsIDB4MjU3QjQ3MjgsCisweDJDMjI2NEU2LCAweDY1MTMxQzUxLCAweDQ1Mjg0NjI5LCAweDFDNjIyNjVCLAorMHg0MTI5NjY0MywgMHgyMTZCNDYyOCwgMHg0NDI5MUMxMywgMHg2NzQzN0MxMCwKKzB4M0RCMjdERjAsIDB4MUZEMjg5RTEsIDB4N0VGRUEwMzQsIDB4NTFGNTZDRjIsCisweDYyMTM2NkMyLCAweDQyMjg0NjE4LCAweDQyMTg0NjE5LCAweDJDNjIyNjJCLAorMHg3QzA0NURGMiwgMHg3REZGNDExOSwgMHhBMDFGRUIxMCwgMHg2NUU2NUVGMSwKKzB4NjRFNjdERjAsIDB4NDIyODYyNTMsIDB4NDIxODY3RTYsIDB4NjZFNjIxMkIsCisweDYxNDMyQzEyLCAweDQ1MTk0MTI4LCAweDI1MUI0MTE4LCAweDY1NzMxQzUxLAorMHg0NDE5NDUyOCwgMHgyNDVCNDUxOCwgMHg2NDYzMUM0MiwgMHg0NzE5NDQyOCwKKzB4Mjc0QjQ0MTgsIDB4NDYxOTFDNzMsIDB4NjE2MzdDMTAsIDB4ODlERTNEQjIsCisweDdFRkQxRkQyLCAweDFGQzQxRkU2LCAweDVERjJFNzA0LCAweEEwMEQ1RUY2LAorMHg2MkU0NTFGNCwgMHg2NkU0N0RGQywgMHg2NUU0NjRFNCwgMHg3MTAxMjEyMCwKKzB4NzEwMTIxNjAsIDB4NzEwMTIxNDAsIDB4NzEwMTIxNTAsIDB4ODlGMDNENzIsCisweDY2RDM1N0YzLCAweDY0MTM2NUUzLCAweDZFRjY3RjFDLCAweDZDRjY2REY2LAorMHg2QkY2QTE5MCwgMHgwMDIwMjE5NCwgMHgyRkM2MkZCNiwgMHgyRkU2MkZENiwKKzB4NjA0MzdGRTQsIDB4NkM2M0M5MDMsIDB4NjYwMzFGNjIsIDB4NDYwODc1RkMsCisweDYxNTI2RTQzLCAweDQ2MDBFMkZDLCAweDI2NjgyRTI5LCAweDFGNDQxRjczLAorMHgxRjUxNkQ1MywgMHg4RDBCMUYxNSwgMHg2MDYzMkZFMiwgMHg4OTFGODgwOCwKKzB4ODk1Mzg4MTAsIDB4OEIwMTg4MTgsIDB4MDAwOUEwODEsIDB4MDAwOUEwQjksCisweEVCMTBBMDBELCAweDUyRDM3REYwLCAweDU0RDE1NkQyLCAweDJFMTY2NUQyLAorMHgyRTY2MkUyNiwgMHgyRTQyN0VGQywgMHgxRkQxNjE1MywgMHgzQ0IyN0NGMCwKKzB4N0QwNDg5RjAsIDB4MUYxNTFGRDYsIDB4MkZFMjFGQzIsIDB4MUZFNEEwQTEsCisweDYyMTM2NkUyLCAweDQyMjk0NjE5LCAweDQyMTk0NjE4LCAweDJFNjIyNjJCLAorMHg3Q0ZGNDExOCwgMHhFQjEwQTAyMSwgMHg1NEQzN0RGMCwgMHg2MjQzNTdEMiwKKzB4NDIxOTQyMjksIDB4NTVEMTIxMkIsIDB4MkUxNjY2RDIsIDB4NDEyOTYxNzMsCisweDQxMTk0NDE4LCAweDJFNDYyNDFCLCAweDQ0Mjk2NDUzLCAweDQ0MTk0NzE4LAorMHgyRTc2Mjc0QiwgMHg0NzI5Njc2MywgMHg0NzE5NDUxOCwgMHgyNTdCN0VGQywKKzB4NDYxODJFNTIsIDB4MUZEMTYxNjMsIDB4M0NCMjdDRjAsIDB4N0QwMzg5REMsCisweDFGMTUxRkQ2LCAweDJGRTIxRkMyLCAweDFGRTRBMDZCLCAweDU3RjU2RUYyLAorMHg2MjczNjZFMiwgMHg0NjI4NDYyOSwgMHgyNjJCNDIyOSwgMHgyRTYyNUNGMiwKKzB4N0NGRTQ3MjgsIDB4QTAxQkVCMTAsIDB4N0RGMDVERjEsIDB4NTVEMjUxRDMsCisweDQ2Mjk2NjEzLCAweDU0RDEyNzZCLCAweDJFNzY2MkQyLCAweDQxMjg2NzUzLAorMHgyMTdCNDcyOSwgMHg2MTQzMkUxNiwgMHg0MTI5NDUyOCwgMHgyRTU2MjUxQiwKKzB4NDQyODY1MjMsIDB4MjQ1QjQ1MjksIDB4NDIyODJFNDYsIDB4N0NGMDY3MjMsCisweDg5RTIzQ0IyLCAweDFGRDY3RDAyLCAweEEwM0ExRkMyLCAweDY3RjIxRkU0LAorMHg2NTcyNTFGNSwgMHg0NTI5NjIxMywgMHg0NTI4NDUxOSwgMHg0MjE5NDUxOCwKKzB4NUNGMjI1MkIsIDB4NDEyODI3NTIsIDB4N0NGRDQxMTgsIDB4QTAyMkVCMTAsCisweDdERjA1REYxLCAweDU0RDI1NkQzLCAweDQ1MTk2NTYzLCAweDUyRDE0NjI4LAorMHg0NjE4MjE1QiwgMHg2RUQyNjU0MywgMHg0NTE5MjcxNiwgMHgyNjVCNDQyOCwKKzB4NjU0MzYxNjMsIDB4NDUxODY0MjMsIDB4NDIyODQ0MTksIDB4NDIxODI1NEIsCisweDI3MTY2NEUzLCAweDQ0MTk2NjIzLCAweDI2NEIyNzU2LCAweDRFMjgyNzY2LAorMHg2MUUzNEUxOCwgMHgzQ0IyN0NGMCwgMHg3RDAxODlEQiwgMHgxRkMyMUZENiwKKzB4RTcwNDFGNzQsIDB4NTFGNDVERjIsIDB4NUVGNkEwMEQsIDB4ODRFMjdFRkMsCisweDYyMDM2NEUwLCAweDdERkM4NEUxLCAweDg0RTM2NTAzLCAweDIxNjQ2NjAzLAorMHgyMTU0MjEyNCwgMHgzRDcyMjE0NCwgMHg1N0YzODlGMCwgMHg2NDEzNjZEMywKKzB4N0YxQzY1RTMsIDB4NkRGNjZFRjYsIDB4QTA5RDZDRjYsIDB4MkY4NjZCRjYsCisweDJGQTYyRjk2LCAweDJGQzYyRkI2LCAweDJGRTYyRkQ2LCAweDYxNDM3NEUwLAorMHg2QTYzNjg3MywgMHg2QjU2RTkyMCwgMHg2QzU2N0FFMCwgMHg2RDU2NzEyMCwKKzB4NkU1NjNBOTIsIDB4NjQ1NjY3NTYsIDB4NjI1NjY2NTYsIDB4MTFDMTIxQjIsCisweDExRTMxMUQyLCAweDExNDUxMTc0LCAweDhERUMxMTY2LCAweDcxMjAxMTI3LAorMHg2NjEzQTAwNCwgMHg3QUZGNjI1NCwgMHg3NjAxMjYyMCwgMHg4QkY5MkFBOCwKKzB4NkVGNjYwODMsIDB4NkNGNjZERjYsIDB4NkFGNjZCRjYsIDB4MDAwQjY5RjYsCisweDJGODY2OEY2LCAweDJGQTYyRjk2LCAweDJGQzYyRkI2LCAweDJGRTYyRkQ2LAorMHg2QTYzNjg3MywgMHg3NUUwRTkyMCwgMHg1NjU2NTI1NywgMHg1NzU0NTE1NSwKKzB4NUQ1MjVFNTMsIDB4NkI1MjVDNTEsIDB4MjQ2NjI0MjYsIDB4MjQ3NjI0MTYsCisweDdBRTAyNEU2LCAweDI0QzYyNEQ2LCAweDhERUMzQTkyLCAweDY2QTMyNEI2LAorMHg2RUY2Njc4MywgMHg2Q0Y2NkRGNiwgMHg2QUY2NkJGNiwgMHhBMDQzNjlGNiwKKzB4MkZFNjY4RjYsIDB4QzgwNDYwNjMsIDB4OEQwNDZFNjMsIDB4NjIxNjYxNTMsCisweDI0MjI3RUZDLCAweDYwRTM3NDA0LCAweDg5MDhDODE4LCAweDcxMDQ2NTEzLAorMHg2MjUyNjYxNiwgMHgyNDIyN0VGOCwgMHhBRkY0MTQ2MSwgMHhFMjA0NzQwOCwKKzB4NjUxMzNFMjIsIDB4NjZFMzhEMDIsIDB4NkVGNkEwMUMsIDB4NkVGNkFGODcsCisweEM4MDQ2MDYzLCAweDYxNjM4RDA0LCAweDYyNTI3NUZDLCAweDI0MjY3MUZDLAorMHhDODE4NjAxMywgMHg3NUY4ODkwNiwgMHg2NjUyNTI1MSwgMHgyNDY2MjQyNiwKKzB4NzFGOEFGRjYsIDB4MzEyMkUyMDQsIDB4NjYxMzhGMDIsIDB4MDAwOUFGQTEsCisweDAwMDlBMDBBLCAweDAwMDlBMDA0LCAweDc2RkY2MjU0LCAweDc0MDEyNDIwLAorMHg4QkY5MjY2OCwgMHg2MDczMDAwQiwgMHgwMDA5QTAwNCwgMHg2MjUwNzVGRiwKKzB4MjQyNDc2RkYsIDB4OEJGOTI2NjgsIDB4NjA3MzAwMEIsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDU0NEYwRDBBLCAweDQ2MjA1MzU1LCAweDAwMDAzQTU3LCAweDIwNzI2MTRELAorMHgzMjIwMzIzMiwgMHgyMDM3MzAzMCwgMHgzNTNBMzczMSwgMHgzNzMzM0EzMiwKKzB4MDAwMDAwMDAsIDB4MDAwMDBEMEEsIDB4MDAwMDAwNDMsIDB4NjE3NjZFNDksCisweDIwNjQ2OTZDLCAweDcyNjU3Mzc1LCAweDIwNzI2RjIwLCAweDIwNzk2NTZCLAorMHgwMDIxNDQ0OSwgMHg2RTZCNkU1NSwgMHgyMDZFNzc2RiwgMHg2RDZENkY2MywKKzB4M0Q2NDZFNjEsIDB4MDAwMDAwMDAsIDB4NjE0Mzc3NDgsIDB4NzI2MjY5NkMsCisweDZGNjk3NDYxLCAweDY2MjAyMDZFLCAweDBBNkM2OTYxLCAweDAwMDAwMDBELAorMHg3MzY5NkY0RSwgMHg2MTQzMjA2NSwgMHg3MjYyNjk2QywgMHg2RjY5NzQ2MSwKKzB4NjE2NjIwNkUsIDB4MjEyMTZDNjksIDB4MDAwMDBEMEEsIDB4MDAwMDBEMEEsCisweDAwMDAwMDQyLCAweDAwMDAwMEZGLCAweDAwMDIwMDAxLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAxMEUwMTBELCAweDAwMDIwMDAzLCAweDAxMDkwMTA4LAorMHgwMDAyMDEwQSwgMHgwMDAzMDAwMiwgMHgwMjAyMDIwMSwgMHgwMjA0MDIwMywKKzB4MDIwNjAyMDUsIDB4MDIwODAyMDcsIDB4MDIwQTAyMDksIDB4MDIwQzAyMEIsCisweDAyMEUwMjBELCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDEwRTAxMEQsIDB4MDBGRjAxMEYsIDB4MDEwOTAxMDgsCisweDAxMEIwMTBBLCAweDAwMDMwMDAyLCAweDAyMDIwMjAxLCAweDAyMDQwMjAzLAorMHgwMjA2MDIwNSwgMHgwMjA4MDIwNywgMHgwMjBBMDIwOSwgMHgwMjBDMDIwQiwKKzB4MDIwRTAyMEQsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMDAwMDA3MiwgMHgwMDIwNTIyMCwgMHgwMDAwMDA0NiwKKzB4MDAwMDAwNTksIDB4NzMyMDQxNDIsIDB4MDAzRDcxNjUsIDB4MDAwMDAwNzQsCisweDAwMDAwMDAwLCAweDAyMDAwMTEyLCAweDQwRkZGRkZGLCAweDEyMjEwQUNFLAorMHgyMDEwNDg5MCwgMHgwMjA5MDEwMCwgMHgwMTAxMDAyRSwgMHgwOUZBODAwMCwKKzB4MDQwMDAwMDQsIDB4MDAwMDAwRkYsIDB4MDIwMTA1MDcsIDB4MDcwMDAyMDAsCisweDAwMDI4MjA1LCAweDA1MDcwMDAyLCAweDAwNDAwMzgzLCAweDA0MDUwNzAxLAorMHgwMTAwNDAwMywgMHgwMDJFMDIwOSwgMHg4MDAwMDEwMSwgMHgwMDA0MDlGQSwKKzB4MDBGRjA0MDAsIDB4MDUwNzAwMDAsIDB4MDA0MDAyMDEsIDB4ODIwNTA3MDAsCisweDAwMDA0MDAyLCAweDAzODMwNTA3LCAweDA3MDEwMDQwLCAweDQwMDMwNDA1LAorMHgwMzA0MDEwMCwgMHgwMzBDMDQwOSwgMHgwMDc5MDA1QSwgMHgwMDQxMDA0NCwKKzB4MDMxODAwNTMsIDB4MDA1MzAwNTUsIDB4MDAzMjAwNDIsIDB4MDAzMDAwMkUsCisweDAwNTcwMDIwLCAweDAwNDEwMDRDLCAweDAwMDAwMDRFLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDcwOSwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgfTsKKworY29uc3QgdTMyX3QgemNGd0ltYWdlU2l6ZT0xMTIwNDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzL2hhbC9ocGZ3dV9PVFVTX1JDLmMgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy9oYWwvaHBmd3VfT1RVU19SQy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4OWQzZTAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy9oYWwvaHBmd3VfT1RVU19SQy5jCkBAIC0wLDAgKzEsNzE1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggQXRoZXJvcyBDb21tdW5pY2F0aW9ucyBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKyNpbmNsdWRlICJjcHJlY29tcC5oIgorCitjb25zdCB1MzJfdCB6Y0Z3SW1hZ2VbXSA9IHsKKzB4MDAwOTAwMEIsIDB4NEYyMjJGRTYsIDB4REUyODdGRkMsIDB4RTExNEQ3MjgsCisweDFFMTNENDI4LCAweDFFNEM0NzBCLCAweDAwMDlCMDE4LCAweEEwMDM5NTQzLAorMHgzNjUyRTYwMCwgMHg3NjAxOEQwNCwgMHhDODQwNjBFMiwgMHgyRjAyOERGOSwKKzB4REUyMkQ0MjEsIDB4MDAwOTRFMEIsIDB4NEUwQkQ0MjEsIDB4RDQyMTAwMDksCisweDAwMDk0RTBCLCAweDRGMjY3RjA0LCAweDZFRjZBMDIyLCAweEQxMUU0RjIyLAorMHgwMDA5NDEwQiwgMHg0NDBCRDQxRCwgMHhENTFEMDAwOSwgMHgwMDA5NDUwQiwKKzB4RTFGRkQ3MUMsIDB4RDIxQzYxMUQsIDB4NTAyOTI3MTIsIDB4Q0IwMUUxRkYsCisweEQ2MUJENDFBLCAweDIyMTIxMjA5LCAweEU1MDExMjExLCAweDI0NTJFMjAwLAorMHhENTE4MjYyMiwgMHg5NzBGRDYxOCwgMHg0RjI2MjU3MiwgMHgyNjIwMDAwQiwKKzB4REQxN0RDMTYsIDB4NEMwQkRFMTcsIDB4NEQwQjAwMDksIDB4NEUwQjAwMDksCisweEFGRjgwMDA5LCAweDI3MTAwMDA5LCAweDAwMDAwNjQwLCAweDAwMUMwMDFDLAorMHgwMDIwMDhFQSwgMHgwMDAwQjM4RSwgMHgwMDIwMjhEQywgMHgwMDIwMERBNiwKKzB4MDAyMDI4RTgsIDB4MDAyMDI5MDAsIDB4MDAyMDBDNkMsIDB4MDAyMDBFQTIsCisweDAwMjAwOTQwLCAweDAwMUMzNTEwLCAweDAwMUMzNjI0LCAweDAwMUUyMTJDLAorMHgwMDIwMjg5NCwgMHgwMDIwMjg4QywgMHgwMDIwMjdGMCwgMHgwMDIwMEI2OCwKKzB4MDAyMDFGNzQsIDB4MDAyMDE3MzQsIDB4MkZENjJGQzYsIDB4NEYyMjJGRTYsCisweERFQTE3RkE0LCAweDYxRTBFMDFDLCAweDdEMDE2REUzLCAweDYxRDAwRjE0LAorMHhENTlGRDQ5RSwgMHg0NTBCRTAyMCwgMHhFMDIwMEYxNCwgMHhFNzgwMDRGQywKKzB4NjA0QzY2RTIsIDB4N0Q3RjY3N0MsIDB4MUY2OTMwNzAsIDB4MkQ2MjhGMTcsCisweDAxRkNFMDFDLCAweDY0MUNFNTAwLCAweEQ3OTdERTk2LCAweDMyNDM2MjVELAorMHhBMjFBOEIwMSwgMHg2NTVEMDAwOSwgMHgzMUVDNjE1MywgMHhFMDI4NkMxMCwKKzB4NkQ1MzBGQzQsIDB4M0Q3QzYyQ0UsIDB4QUZFRjJEMjAsIDB4MjAwODc1MDEsCisweEUwMUM4QjE1LCAweEU1MDAwMUZDLCAweEQ3OEJERThBLCAweDY0MUNBMDBBLAorMHg2QzUzNjU1RCwgMHg2NkMyM0NFQywgMHg2NjYyNjI1MywgMHgyMjYyMzI3QywKKzB4MUY2OTc1MDQsIDB4MzI0MzYyNUQsIDB4QTFGNjhCRjIsIDB4ODgwMTJEMTAsCisweEUwMUM4QjE2LCAweEU0MDAwMUZDLCAweDY3MUMyRDQwLCAweDYyNERERTdELAorMHg4QjAxMzI3MywgMHgwMDA5QTFFOSwgMHg2MkUzNjQ0RCwgMHg3MjA0NkQ0MywKKzB4M0RFQzYxNDMsIDB4NjVEMjMxMkMsIDB4NzQwODZDMTIsIDB4MjVDMkFGRUYsCisweDhCMTg4ODA0LCAweDAxRkNFMDFDLCAweDJENDBFNDAwLCAweERFNzE2NzFDLAorMHgzMjczNjI0RCwgMHhBMUQwOEIwMSwgMHg2NDREMDAwOSwgMHg2MkUzNkQ0MywKKzB4NjVEMjNERUMsIDB4NjE0MzcyMDQsIDB4NjYxMjMxMkMsIDB4NzQwODZDNTIsCisweEFGRUQyQzY5LCAweDg4MDUyNUMyLCAweEUwMUM4QjE4LCAweEU0MDAwMUZDLAorMHg2NzFDMkQ0MCwgMHg2MjREREU2MywgMHg4QjAxMzI3MywgMHgwMDA5QTFCNSwKKzB4NkM0MzY0NEQsIDB4M0NFQzYyRTMsIDB4NzIwNDY1QzIsIDB4M0QyQzZENDMsCisweDYxNTI2NkQyLCAweDIxNkI3NDA4LCAweDI1MTJBRkVELCAweDhCMTM4ODMwLAorMHhFMjAwREU1OCwgMHg2NEUyMkQyMCwgMHg4QjA0MjQ0OCwgMHg0MjBCRDI1NywKKzB4QTE5QTAwMDksIDB4NTVFMTAwMDksIDB4NTdFMzU2RTIsIDB4REQ1NDVDRTQsCisweDJGQzY0RDBCLCAweDdGMDRBMTkxLCAweDg5MDE4ODI4LCAweDAwMDlBMEVBLAorMHhFMTQzREU0QywgMHg2MjJENjJFMSwgMHg4RjAzMzIxNywgMHg1NkZCMUZFQiwKKzB4MjYyMUUyNDAsIDB4OEIwMTMyMTcsIDB4MDAwOUEwRDUsIDB4RTEwMTVFRkIsCisweDMwMTY4NUUxLCAweEEwQ0U4QjAxLCAweEU0MDEwMDA5LCAweDJENDA1NUZCLAorMHg2NDUxQjE3OSwgMHhFMTQzNTdGQiwgMHhFMDU0NjI3MSwgMHgzNTE3NjUyRCwKKzB4MEY1NjhENDEsIDB4MzU2M0U2NDAsIDB4RTYwMDhCMDUsIDB4MEY2NUUwMzQsCisweEEwMEZFMTFBLCAweDYxNTM3MkMwLCAweDQxMjE0MTIxLCAweDQxMjE0MTIxLAorMHg0NTIxNDEyMSwgMHg0NTIxNDUyMSwgMHhDOTAzNjA1MywgMHhFMDM0NjYwMywKKzB4NzExODBGNjUsIDB4MjIwOUUwMDcsIDB4NjQxREUwMzAsIDB4MEYyNTY1RjMsCisweDFGNEVCMUYxLCAweDA0RkRFMDM0LCAweDY3NERFMDMwLCAweDQ3MDgwQ0ZELAorMHg2MDczNjFDRCwgMHg0MTA4RDIyQiwgMHhFMDBGMENGRSwgMHgxRjFGNDIwQiwKKzB4MkNEOTZEMDcsIDB4NUVGQjYwNzMsIDB4ODVFMjBGQzYsIDB4NDIwQjUxRkYsCisweDJDMEI2MDBELCAweDU0RkU2MDczLCAweEIxQkIwRkM2LCAweEUwNTQ2NUYzLAorMHg2NTJENjJFMSwgMHhFNjQwMEY1NiwgMHg4OTYyMzU2MywgMHhFMDUwRTEwMCwKKzB4NjAyMzBGMTUsIDB4NDAwOEM5MDMsIDB4NkQwMzQwMDAsIDB4RTA0MDYxMDMsCisweEUwNDQwRkQ2LCAweEQyMTdFRUZGLCAweDZFRUMwRkY2LCAweDBGMjZFMDU4LAorMHg2MEUzNDIwQiwgMHg0MjIxNjI1MywgMHg0MjIxNDIyMSwgMHg2NjIzNDIyMSwKKzB4MzI2QzQyMDAsIDB4NDUyMTQyMDAsIDB4RTA0ODY3MDcsIDB4MEY3NjQ1MjEsCisweEM5MDM2MDUzLCAweDQwMDg1Q0ZCLCAweDdDMDYzMEZDLCAweDZFMDM2RDJELAorMHgxRkQ1MUZDNiwgMHgxRjA0QTAyRSwgMHgwMDExN0QwMCwgMHgwMDIwMjkwNCwKKzB4MDAyMDBEQTYsIDB4MDAxMTdEMDQsIDB4MDAxMTdEODQsIDB4MDAyMDA3MDAsCisweDAwMjAwNzRDLCAweDAwMjAxRkQ0LCAweDBGRDZFMDRDLCAweDA1RkVFMDQ0LAorMHg2NEQzQjE4OSwgMHg2NEUyRTA0OCwgMHhFMDQwMDZGRSwgMHgyRTQyMjQ2OSwKKzB4MDFGRTY3QzQsIDB4NjY3Q0UwNTgsIDB4NDIwQjAyRkUsIDB4MjQwQjYwNjMsCisweDA1RkVFMDQ0LCAweEIxNUQyRTQyLCAweEUwNTA2NEQzLCAweDdEMDEwMUZELAorMHgwRjE1NzEwMSwgMHgwMkZERTA1MCwgMHgzMjYyRTYwNiwgMHg1NkZCOEJEQywKKzB4NTVGQjYyNjEsIDB4ODU1MTQyMDAsIDB4MzAyQzc1MEMsIDB4NjEwMzcwMUIsCisweDY0RjNFNjAwLCAweEU3MDRBMDA0LCAweDc2MDE2MjU2LCAweDc0MDQyNDIyLAorMHgzMjczNjI2RCwgMHg2NUYzOEJGOCwgMHg2NDFEQjEzQywgMHhCMEQyNTZGQiwKKzB4QTBBQTY0NjEsIDB4RDQ4ODAwMDksIDB4RTIwMUQ1ODgsIDB4MkQyMDQ1MEIsCisweDAwMDlBMEEzLCAweDhCMDc4ODI5LCAweEUyMDBERTg1LCAweDY2RTIyRDIwLAorMHg2NDZEQjBBMSwgMHgwMDA5QTA5OSwgMHg2MjJDRTI4MSwgMHg4QjNEMzAyMCwKKzB4RDY4MEU3MzgsIDB4RTA0NDJENzAsIDB4RTA0ODBDNkUsIDB4NkU2MjFEQzEsCisweDUxNjExREUyLCAweDU0NjIxRDEzLCAweDU1NjUxRDQ0LCAweDU3NjMxRDU1LAorMHg1QzY2MUQ3NiwgMHgwRTZFMURDNywgMHgxREU4RTA0MCwgMHhFMDUwMDE2RSwKKzB4NTQ2NDFEMTksIDB4MDU2RTFENEEsIDB4MUQ1QkUwNEMsIDB4RTA1NDA3NkUsCisweDBDNkUxRDdDLCAweDFEQ0RFMDU4LCAweEUwNDQwMjZFLCAweEVEMDAxRDJFLAorMHhFMDQ4MDZENiwgMHgxNkQxMjZEMiwgMHgxNkQ1MTZEMiwgMHgxNkQ2MTZEMywKKzB4RTA0MDA2RDYsIDB4RTA1MDA2RDYsIDB4MDZENjE2RDQsIDB4MDZENkUwNEMsCisweDA2RDZFMDU0LCAweDA2RDZFMDU4LCAweDFGMjlBMDU3LCAweDYyMkNFMjgyLAorMHg4OTMxMzAyMCwgMHgwNUZDRTAyMCwgMHg2MjVDRTY4MywgMHgzMjYwNjY2QywKKzB4RDY1RDhCMDcsIDB4MjY1MEU1MDAsIDB4NTI2MTc2ODAsIDB4QTA0NEQ2NUIsCisweEU2OTAyNjIyLCAweDMyNjA2NjZDLCAweEQyNTc4QjE2LCAweEU1MDBENjU4LAorMHg2MDYyMjI1MCwgMHhDQjIwRDI1NywgMHhFNjA1MjYwMiwgMHhENjU2MjI2MiwKKzB4MjI1MjQ2MEIsIDB4NDIwQkQyNTUsIDB4RDI1NTAwMDksIDB4MjI2MkU2MDEsCisweDQ2MThEMjU0LCAweDIyNjJBMDI5LCAweEQyNTRENDUzLCAweEQ0NTQ2NTQyLAorMHgwMDA5NDIwQiwgMHgwMDA5QTAyMSwgMHhFNTI0RDY0NywgMHhENTQ1MjY1MCwKKzB4MTYyMTUyNTcsIDB4MTYyMjUyNTgsIDB4MTYyMzUyNTksIDB4MTYyNDUyNUEsCisweDE2MjU1MjVCLCAweDE2MjY1MjVDLCAweDE2Mjc1MjVELCAweDE2Mjg1MjVFLAorMHgxRjI5NTI1RiwgMHhFMjAwMTYyOSwgMHgxNTI4MTUyNywgMHgxNTJBMTUyOSwKKzB4MTUyQzE1MkIsIDB4MTUyRTE1MkQsIDB4N0Y1QzE1MkYsIDB4NkVGNjRGMjYsCisweDAwMEI2REY2LCAweDRGMjI2Q0Y2LCAweEUyNDA2MTRELCAweDg5MTczMTIzLAorMHgzMTI3RTIxRiwgMHhENDNCODkwOCwgMHhFMDAxRDUzQiwgMHg2NjQyNDUwQiwKKzB4MjY3OTY3MDcsIDB4MjQ2MkEwMEMsIDB4MzEyN0UyM0YsIDB4RDczNTg5MDgsCisweDcxRTBENjM1LCAweDQ2MEJFMDAxLCAweDYyMDc1NTcxLCAweDE3NTEyNTI5LAorMHgwMDBCNEYyNiwgMHg0RjIyMDAwOSwgMHhFMjQwNjE0RCwgMHg4OTE1MzEyMywKKzB4MzEyN0UyMUYsIDB4RDQyQjg5MDcsIDB4NjY0MkQyMkIsIDB4RTAwMTQyMEIsCisweEEwMEIyNjBCLCAweEUyM0YyNDYyLCAweDg5MDczMTI3LCAweEQ2MjZENzI1LAorMHg3MUUwNTU3MSwgMHhFMDAxNDYwQiwgMHgxNzUxMjUwQiwgMHgwMDBCNEYyNiwKKzB4RTY0MDAwMDksIDB4NDYyODQ2MTgsIDB4NjI1MkQ1MjAsIDB4ODlGQzIyNjgsCisweDAwMDkwMDBCLCAweDQ2MThFNjgwLCAweEQ1MUM0NjI4LCAweDIyNjg2MjUyLAorMHgwMDBCODlGQywgMHhBMDAxMDAwOSwgMHg3MjAxRTIwMCwgMHg4QkZDMzI0MiwKKzB4MDAwOTAwMEIsIDB4NDYxOEU2ODAsIDB4RDUxNTQ2MjgsIDB4MjI2ODYyNTIsCisweDAwMEI4QkZDLCAweDAwMDAwMDA5LCAweDAwMjAyOTA4LCAweDAwMjAwREE2LAorMHgwMDExN0QwNCwgMHgwMDIwMjdGOCwgMHgwMDExN0Q4MCwgMHgwMDIwMjg4QywKKzB4MDAxQzM1MDAsIDB4MDAxRDQwMDQsIDB4MDAyMDBFQTIsIDB4MDAyMDA5NDAsCisweDAwMUUyMTJDLCAweDAwMUMzRDI4LCAweDAwMTE3RDAwLCAweDAwMjAwRTA2LAorMHgwMDIwMjkyMCwgMHgwMDFDMzcwNCwgMHgwMDIwMUZENCwgMHgwMDFDMzczQywKKzB4MDAxQzM3MDAsIDB4NEYyMjJGRTYsIDB4NkU1MzdGRkMsIDB4MkY0MkJGQ0EsCisweEQ2MTU2MUUyLCAweDE2MTVFMjgwLCAweDQyMTg1NEUxLCAweDU1RTIxNjQ2LAorMHgxNjU3NDIyOCwgMHg2RUYyNTdFMywgMHgyRTJCMTY3OCwgMHg3RjA0MjZFMiwKKzB4QUZBNzRGMjYsIDB4MkZDNjZFRjYsIDB4MkZFNjJGRDYsIDB4REQwQTRGMjIsCisweEJGQUY2QzUzLCAweEJGOTQ2RTQzLCAweEJGQUIyREUyLCAweDUxRDUwMDA5LAorMHg1NEQ2MkMxMiwgMHg1NUQ3MUM0MSwgMHg1NkQ4MUM1MiwgMHg0RjI2MUM2MywKKzB4NkRGNjZFRjYsIDB4NkNGNjAwMEIsIDB4MDAxQzM3MEMsIDB4MDAwOUEwQzAsCisweEQxN0I0RjIyLCAweEQ0N0I5MkI2LCAweDIxMjJCMDBELCAweDk3QjJFNjA1LAorMHhCMDIyOTVCMiwgMHhCMDM2NjQ2MywgMHhCMDM2MDAwOSwgMHhCMDM5MDAwOSwKKzB4QTA2ODAwMDksIDB4NEYxMjRGMjYsIDB4RDE3MzRGMDIsIDB4OTRBNDMxNDUsCisweDQ2MDkwNjBBLCAweDQ2MDk0NjA5LCAweDAwMjkzNjQ2LCAweEQ3NkNENTZGLAorMHgyNTAwQ0EwMSwgMHg0RjA2Mjc2MiwgMHg0RjE2MDAwQiwgMHhCRkVBNEYyMiwKKzB4QjAxRjAwMDksIDB4QTA0RTAwMDksIDB4MkZFNjRGMjYsIDB4NkU2M0QxNjgsCisweDQ0MTg2NjEyLCAweDQ1Mjg5MjhBLCAweDI2Mjk0NDA4LCAweDQ0MDg0NTAwLAorMHg0NDAwMjY1QiwgMHg0NzA4MjY0QiwgMHg0NzA4MjE2MiwgMHgyN0VCRDE2MSwKKzB4MDAwQjIxNzIsIDB4MDAwQjZFRjYsIDB4RDI1RjAwMDksIDB4RTQwQTk2NzcsCisweDIyNjJBRkI0LCAweDJGQzYyRkI2LCAweDJGRTYyRkQ2LCAweERDNUI0RjIyLAorMHgyQzIyRTIwMSwgMHhCRkE5RTQwQSwgMHg2MEMyN0M0NCwgMHhDQjAxRUQwMCwKKzB4NjBDMjJDMDIsIDB4QzkwMUVCNjQsIDB4NkUwM0EwMDgsIDB4ODkwNzNEQjIsCisweEU0MDE2MEMyLCAweEJGOTlDOTAxLCAweDdEMDE2RTAzLCAweDhCRjUyRUU4LAorMHg4QjAzM0RCMiwgMHhEMjRGRDQ0RSwgMHgwMDA5NDIwQiwgMHg0RjI2RTQwQSwKKzB4NkRGNjZFRjYsIDB4QUY4OTZDRjYsIDB4NDQxMTZCRjYsIDB4NjA0QjhGMDEsCisweDAwMEI2MDQzLCAweDJGQjYwMDA5LCAweDJGRDYyRkM2LCAweDRGMjIyRkU2LAorMHhEQzQ1N0ZGQywgMHg2MEMyRUQwMCwgMHhDQjAyRUI2NCwgMHg2MEMyMkMwMiwKKzB4QzkwMjJGMDIsIDB4NkUwM0EwMDksIDB4ODkwODNEQjMsIDB4RTQ2NDYwQzIsCisweEM5MDIyRjAyLCAweDZFMDNCRjZBLCAweDJFRTg3RDAxLCAweEQ3M0I4QkY0LAorMHg2MTcyNTFDMSwgMHhERTNCREMzQSwgMHhEMjNDRDEzQiwgMHg2NEMyM0RCMywKKzB4NjUxMjY0RTIsIDB4NjUyMjhGMDksIDB4RDIzMkQ0MzksIDB4NEYyNjdGMDQsCisweDZERjY2RUY2LCAweDQyMkI2Q0Y2LCAweDdGMDQ2QkY2LCAweDZFRjY0RjI2LAorMHg2Q0Y2NkRGNiwgMHg2QkY2MDAwQiwgMHg1NjUxRDUzMiwgMHg0NjI4NjA1MiwKKzB4MzA2QzAwMEIsIDB4NTI4ODA5NkMsIDB4MDlCNDVCQjQsIDB4MDNDNDFGRkYsCisweDJGQzYyRkI2LCAweDJGRTYyRkQ2LCAweDRGMTI0RjIyLCAweEJGRUI0RjAyLAorMHg2QjAzNkU0MywgMHhERDE4REMyOCwgMHgwMDA5QkZFNiwgMHgzQzA1MzBCOCwKKzB4NDYwOTA2MEEsIDB4NDYwMTQ2MDksIDB4MDIwQTNENjUsIDB4NDIwOTQyMDksCisweDMyRTI0MjA5LCAweDRGMDY4QkYwLCAweDRGMjY0RjE2LCAweDZERjY2RUY2LAorMHgwMDBCNkNGNiwgMHgyRkU2NkJGNiwgMHhERTFDNEYyMiwgMHhFNTAwRTEwMiwKKzB4MkUxMkU0MDMsIDB4MkU1MkJGRDQsIDB4NDYxOEU2MDYsIDB4RTQwM0U3MDAsCisweDJFNzIyRTYyLCAweEFGQ0I0RjI2LCAweDAwMEI2RUY2LCAweDAwMDAwMDA5LAorMHgwMDIwMjg5MCwgMHgwMDI0Q0RFMCwgMHgxMDYyNEREMywgMHgwMDIwMkE4QywKKzB4MDAxQzU4MTQsIDB4MDAxQzU5RDAsIDB4MDAxQzU4MDQsIDB4MDAxQzU4MUMsCisweDAwMjAyOTM0LCAweDAwMjAwREE2LCAweDAwMUM1ODYwLCAweDAwMUM2ODY0LAorMHgwMDFDNzg2NCwgMHgwMDFDNTlCQywgMHgwMDFDNjlCQywgMHgwMDFDNzlCQywKKzB4MDAyMDI5NEMsIDB4MDAxQzEwNDAsIDB4Q0NDQ0NDQ0QsIDB4MDAxRDQwMDQsCisweDJGOTYyRjg2LCAweDJGQjYyRkE2LCAweDJGRDYyRkM2LCAweDRGMjIyRkU2LAorMHhFNDAwN0ZFNCwgMHg0NTI4RTUxMCwgMHg2NzQzNkM0MywgMHhFMTA3QTAwRiwKKzB4NjA0MzY0NEQsIDB4MEY1NjQwMDgsIDB4RUUwMDYwQzMsIDB4ODE1MTI1QzEsCisweDgxNTM4MTUyLCAweDE1NzMxNUUyLCAweDc1MTQxNUU0LCAweDYyNEQ3NDAxLAorMHg4QkVEMzIxMywgMHhEQTZGNTFGMSwgMHgxQTExNTRGMiwgMHhEMTZFMkExMiwKKzB4NTdGNDU1RjMsIDB4NkRGMjU4RjUsIDB4MTE0MUQ5NkMsIDB4MTE1MzIxNDIsCisweDExNzUxMTUyLCAweDExODcxMTc0LCAweDUyRjYxMTg2LCAweDE5RDFENjY4LAorMHhEODY4MjlEMiwgMHhEQTY4RTk1MCwgMHgxNjIxRUJCNCwgMHg2QkJDMjYyMiwKKzB4QTAyMTQ5MDgsIDB4NkVFREVFMDAsIDB4NjFFMzZERTMsIDB4NDEwODREMDgsCisweDMxRUMzREVDLCAweDQxMDg0RDA4LCAweDYwQzMzRDhDLCAweEU3OTA0MTA4LAorMHg4MUQxMkRDMSwgMHg0MTA4NjA5MywgMHg4MUQyNjc3QywgMHgzMUFDNjBDMywKKzB4MzQ3MkUyMDAsIDB4MUREMjgxRDMsIDB4RDQ1NTFEMTMsIDB4MUQyNDhEMDEsCisweEIwM0FENDUwLCAweDdFMDE2NUQzLCAweDM0QjI2NEVELCAweEQxNEQ4QkRCLAorMHg2NTEyREI1MiwgMHg0NTI5RDI0RCwgMHg2NDEyMUI1MSwgMHg2NzRERDE0QSwKKzB4NjcyMjJCNzIsIDB4NDcyOUQ2NEUsIDB4NjkyMjFCNzMsIDB4Njg5RDJGRDIsCisweDY5MTIxQjgyLCAweDVBMTIyNjkyLCAweDVCMTQxNkEyLCAweDE2QjREQTQ0LAorMHgxNkM2NUMxNiwgMHgxNkVBNkVBMiwgMHg0RjI2N0YxQywgMHg2REY2NkVGNiwKKzB4NkJGNjZDRjYsIDB4NjlGNjZBRjYsIDB4NjhGNjAwMEIsIDB4NjA2MTY2NDIsCisweDhEMDRDODAzLCAweDYwNjFFNTAwLCAweDg4MDJDOTAzLCAweDUyNjI4QjAzLAorMHg1MTI0NjU2MywgMHgwMDBCMjQxMiwgMHgyRkQ2NjA1MywgMHg0RjIyMkZFNiwKKzB4NkU1MzdGRUMsIDB4RTU1MDYyNTMsIDB4RTQwMDZENDMsIDB4QTAwMTQ1MDgsCisweDUyMjRFMTAxLCAweDIyMTE2MDQzLCAweDgxMjM4MTIxLCAweDgxMjI2MDUzLAorMHgzNjIwNTZFMiwgMHhEMjJGOEJGNSwgMHg2NEYzMTZFNCwgMHg0MjBCRTYxNCwKKzB4NjVFMTY1RTMsIDB4MjU0OUU0RkMsIDB4NjFGMTJFNTEsIDB4MjE0OTY1RjMsCisweDU0RDEyRjExLCAweDQxMEJEMTI3LCAweDU3RDFFNjE0LCAweENCMDE2MDcxLAorMHgxREUxMjcwMSwgMHg0RjI2N0YxNCwgMHgwMDBCNkVGNiwgMHgyRkQ2NkRGNiwKKzB4NEYyMjJGRTYsIDB4NkU1MzdGRUMsIDB4RTVGQzY2NTMsIDB4NjA2MTZENDMsCisweENCMDEyMDU5LCAweDUyRTIyNjAxLCAweDhCMDYzMjYwLCAweDUxRTIxMkU0LAorMHg4QjA0MzFFMCwgMHhBMDAyNTJEMSwgMHhBRkYwMUUyMiwgMHhEMjE1NTY2NCwKKzB4RTYxNDY0RjMsIDB4NjVFMzQyMEIsIDB4RTFGQzY3RTEsIDB4MkU3MTI3MTksCisweDU0RDE2N0YxLCAweEQxMEYyNzE5LCAweEU2MTQ2NUYzLCAweDJGNzE0MTBCLAorMHg2MDIxNTJEMSwgMHgyMjAxQ0IwMSwgMHg3RjE0MURFMSwgMHg2RUY2NEYyNiwKKzB4NkRGNjAwMEIsIDB4MDAyMDI4NUMsIDB4MDAyMDI4NjQsIDB4MDAyMDI4NTQsCisweDAwMjAyODg0LCAweDAwMTAwMDhDLCAweDAwMTAwRUMwLCAweDAwMUUyMTA4LAorMHgwMDFDM0QwMCwgMHgwMDIwMjEzNCwgMHgyRkM2MkZCNiwgMHgyRkU2MkZENiwKKzB4RDYzMTRGMjIsIDB4NjBEMzZENjIsIDB4ODk0REM4MDMsIDB4REIzMERDMkYsCisweDAwMDlBMDJDLCAweEM5MDM2MDYxLCAweDg5MkI4ODAxLCAweEQyMkRENDJCLAorMHgwMDA5NDIwQiwgMHg2NTAzNTYwMywgMHhDODIwODU2MSwgMHhFMDUwODkwMywKKzB4NzIwMTAyQkUsIDB4ODU2MjBCMjYsIDB4NDAwMDYwMEQsIDB4NDAwMDM2NkEsCisweDQwMDA0NjI0LCAweDIwNkQ0NjI0LCAweEQ0MjNDOTAzLCAweDQwMDg2RTAzLAorMHhEMTIyNDAwMCwgMHgzNDBDNDEwQiwgMHg2MUUzRDUyMSwgMHhENzIxRTAwMSwKKzB4NDUwQkQyMjEsIDB4NjRFMzdFMzAsIDB4MjcwMjQyMEIsIDB4NjZDMjUyQzEsCisweDhCQ0YzNjIwLCAweDRFMThFRTAxLCAweEEwMTFEQjFDLCAweDYwNjFFQzc1LAorMHg4ODAxQzkwMywgMHhENDE5ODkxMCwgMHg0NjBCRDYxMiwgMHhENDE4MDAwOSwKKzB4NDcwQkQ3MTgsIDB4RDIxMzY1MDMsIDB4NjRDM0QxMTMsIDB4MjJFMjQxMEIsCisweDY2QjI1MkIxLCAweDhCRUEzNjIwLCAweEM4MDQ2MEQzLCAweEQyMTI4OTA2LAorMHg2RUY2NEYyNiwgMHg2Q0Y2NkRGNiwgMHg2QkY2NDIyQiwgMHg2RUY2NEYyNiwKKzB4NkNGNjZERjYsIDB4NkJGNjAwMEIsIDB4MDAxRTIxMDAsIDB4MDAyMDI4NUMsCisweDAwMjAyN0Y4LCAweDAwMjAwQTVDLCAweDAwMjAyODY0LCAweDAwMjAwQURFLAorMHgwMDIwMUZENCwgMHgwMDFDM0QzMCwgMHgwMDIwMEQ2QywgMHgwMDIwMjg1NCwKKzB4MDAyMDI4ODQsIDB4MDAyMDBBN0EsIDB4MDAyMDAwRjgsIDB4RTYwMUQyMzcsCisweDEyNjVENTM3LCAweDAwMEIyMjUyLCAweEQ2MzYxMjY2LCAweDg4MDE2MDYyLAorMHhFMTAxOEI2MiwgMHhENTM0MjYxMiwgMHg1NDUxRDEzNCwgMHhFMDQwNjIxMiwKKzB4MjEyMjMyNEMsIDB4NTQxMTU3NTIsIDB4MTE0MTM0N0MsIDB4NTcxMjU0NTMsCisweDExNzIzNzRDLCAweDUyMTM1NzU1LCAweDExMjMzMjdDLCAweDU2MTQ2NDUyLAorMHgxMTY0MzY0QywgMHg1NDE1NTc1NCwgMHgxMTQ1MzQ3QywgMHg1NjE2NTQ1OCwKKzB4MTE2NjM2NEMsIDB4Njc2MkQ2MjYsIDB4MzI3QzUyMTcsIDB4NTc2MTExMjcsCisweDMyN0M1MjE4LCAweDU3NjIxMTI4LCAweDMyN0M1MjE5LCAweDU3NjMxMTI5LAorMHgzNDdDNTQxQSwgMHg1NzY0MTE0QSwgMHgzNDdDNTQxQiwgMHg1NzY1MTE0QiwKKzB4MzQ3QzU0MUMsIDB4NTI2NjExNEMsIDB4MzcyQzU3MUQsIDB4NTI2NzExN0QsCisweDM0MkM1NDFFLCAweDUyNjgxMTRFLCAweDM2MkM1NjFGLCAweEQ2MTUxMTZGLAorMHgwNDFFNjI2MiwgMHgzNDJDNzY5NCwgMHhFMDQ0MDE0NiwgMHgwNjFFNjI2MiwKKzB4MDE2NjM2MkMsIDB4NTI1Q0UwNDgsIDB4RDYwRjA1MUUsIDB4MDE1NjM1MkMsCisweEUwNTQ2MjYyLCAweDQyMjkwNTFFLCAweDAxNTYzNTJDLCAweEUwNTg1NTYxLAorMHg0NTI5MDYxRSwgMHgwMTY2MzY1QywgMHgwMDA5MDAwQiwgMHgwMDFDMTAxMCwKKzB4MDAwMEMzNEYsIDB4MDAxQzEwMjgsIDB4MDAxQzM2OUMsIDB4MDAyMDI3RjgsCisweDAwMUMzQ0EwLCAweDAwMUMzNkY0LCAweDAwMUMzQjg4LCAweEQ2MkY3RkZDLAorMHgyNjQyNjQ0QywgMHhDODIwNTA2NiwgMHgyRjAyOERGQywgMHg3RjA0MDAwQiwKKzB4MkZENjJGQzYsIDB4NEYyMjJGRTYsIDB4NkQ0MzZDNTMsIDB4RUUwMEEwMDQsCisweDdFMDE2NEQ0LCAweDY0NENCRkVBLCAweDhCRjkzRUMyLCAweDZFRjY0RjI2LAorMHgwMDBCNkRGNiwgMHhBMDAxNkNGNiwgMHg3NjAxNjY0MywgMHgyMjI4NjI2MCwKKzB4MzY0ODhCRkIsIDB4NjU2M0FGRTQsIDB4MkZCNjJGOTYsIDB4MkZENjJGQzYsCisweDRGMjIyRkU2LCAweEVDMUNFRDA4LCAweERCMTk2RTUzLCAweDYxQzNFOTBBLAorMHg2MDQzNEIwQiwgMHgzMDkyQzkwRiwgMHg2NjAzOEQwMiwgMHg3NjMwQTAwMSwKKzB4NEQxMDc2MzcsIDB4N0UwMTJFNjAsIDB4N0NGQzhGRjEsIDB4ODA1OEUwMDAsCisweDZFRjY0RjI2LCAweDZDRjY2REY2LCAweDAwMEI2QkY2LCAweDAwMEI2OUY2LAorMHgwMDBCRTAwMCwgMHgyRkU2RTAwMCwgMHg3RkVDNEYyMiwgMHg2RTQzNjI1MywKKzB4QkZEMTY1RjMsIDB4QkZDNjY0MjMsIDB4QkZDNDY0RTMsIDB4RDQwNTY0RjMsCisweDAwMDlCRkMxLCAweDRGMjY3RjE0LCAweDZFRjYwMDBCLCAweDAwMUMwMDA0LAorMHgwMDIwMjA5NCwgMHgwMDIwMjk2OCwgMHhFMTEwRDU5QywgMHhFNjQwNjA1MCwKKzB4MjUwMEM5RkQsIDB4RTBGRjc1RTksIDB4ODA1MTY0NTMsIDB4ODA1MzgwNTIsCisweDgwNTY4MDU1LCAweDI1MTA3NUVGLCAweEUxRUY2MjUwLCAweDIyMTlFMDAxLAorMHhFNzIwMjUyMCwgMHgyNDYwODA1MiwgMHgyNTcwMDAwQiwgMHhFNEZERDU5MCwKKzB4RTcwMjYxNTIsIDB4MjUxMjIxNDksIDB4NzQwMTYwNTIsIDB4MjUwMkNCMDEsCisweEQxOEM2NjUyLCAweDI1NjIyNjQ5LCAweDkyQzI2MDEyLCAweDIxMDJDQjA4LAorMHhDOUNGNjAxMiwgMHg2MDEyMjEwMiwgMHgyMTAyQ0IwMywgMHgwMDBCMTE3MiwKKzB4NEYyMjExMjMsIDB4RTEwMEQ0ODQsIDB4RDI4NUQ3ODQsIDB4RDU4NTI0MTAsCisweDI3MTFENDg1LCAweDIyMTFFNzAwLCAweEJGQkQyNTExLCAweEQ1ODMyNDcxLAorMHgyNTYwRTYwMCwgMHg0RjI2QUZEMiwgMHhEMjgxNjY0QywgMHgzNjJDNDYwMCwKKzB4Q0IxMDYwNjAsIDB4MjYwMDAwMEIsIDB4RDI3RDY1NEMsIDB4MzUyQzQ1MDAsCisweEUxRUY2NjUwLCAweDAwMEIyNjE5LCAweDY2NEMyNTYwLCAweDQ2MDBEMjc5LAorMHg2MDYwMzYyQywgMHgwMDBCQ0IxMCwgMHg2NTRDMjYwMCwgMHg0NTAwRDI3NSwKKzB4NjY1MDM1MkMsIDB4MjYxOUUxRUYsIDB4MjU2MDAwMEIsIDB4RDI3MDY2NEMsCisweDM2MkM0NjAwLCAweENCMDg2MDYwLCAweDI2MDAwMDBCLCAweEQyNkM2NTRDLAorMHgzNTJDNDUwMCwgMHhFMUY3NjY1MCwgMHgwMDBCMjYxOSwgMHg2NjRDMjU2MCwKKzB4NDYwMEQyNjgsIDB4NjA2MDM2MkMsIDB4MDAwQkNCMDgsIDB4NjU0QzI2MDAsCisweDQ1MDBEMjY0LCAweDY2NTAzNTJDLCAweDI2MTlFMUY3LCAweDI1NjAwMDBCLAorMHhENjVGNjI0QywgMHgzMjZDNDIwMCwgMHhDOTA4NjAyMCwgMHg0MDIxNDAyMSwKKzB4MDAwQjQwMjEsIDB4NjI0QzYwMEMsIDB4NDIwMEQ2NUEsIDB4NjAyMDMyNkMsCisweDQwMjFDOTA4LCAweDQwMjE0MDIxLCAweDYwMEMwMDBCLCAweEQxNTY2NDRDLAorMHgzNDFDNzRGRiwgMHgwMDBCNjI0MCwgMHhEMTU0NjAyQywgMHgzNDFDNjQ0QywKKzB4MDAwQjYyNDAsIDB4MkZFNjYwMkMsIDB4NjU1QzRGMjIsIDB4MzU2N0U2MEEsCisweDZFNDM4RDE1LCAweDY0NTNCRkVBLCAweDYwRUM2NDBDLCAweDhCMDI4ODAxLAorMHhBMDAyRTAwRiwgMHg0NDA5MjQwOSwgMHg2MjRDNDQwOSwgMHgzMjYzRTYwQSwKKzB4QkZFMjg5MDUsIDB4NjIwQzY0NEMsIDB4Qzg4MDYwMjMsIDB4RTIwMDhCMDAsCisweDRGMjY2MDIzLCAweDZFRjYwMDBCLCAweEQ2NDE0RjIyLCAweDg4MDE2MDYyLAorMHhCMjIyOEIwMywgMHhBMDAzMDAwOSwgMHhEMjNFMDAwOSwgMHgyMjYwRTY0MCwKKzB4RTIwMEQ2M0QsIDB4MDAwQjRGMjYsIDB4NEYyMjI2MjIsIDB4NjA2MkQ2MzgsCisweDhCMDE4ODAyLCAweDAwMDlCMjZDLCAweEUyMDBENjM3LCAweDAwMEI0RjI2LAorMHgwRkZGMjYyMiwgMHhENDMzRDUzMiwgMHhFNzAxRTEwMCwgMHgwMDBCMjUxMiwKKzB4RDIzMDI0NzAsIDB4MDAwQkU2MDQsIDB4RDUyMDIyNjAsIDB4NjE1MEU0RkQsCisweDIxNDlENjJFLCAweDI1MTBFNzAwLCAweDI2NzAwMDBCLCAweEU0RkJENTFCLAorMHgyMjQ5NjI1MCwgMHgyNTIwMDAwQiwgMHhFNEY3RDUxOCwgMHgyMjQ5NjI1MCwKKzB4MjUyMDAwMEIsIDB4RDIyNjRGMjIsIDB4NjAwRDg1MjIsIDB4ODkxMTIwMDgsCisweDg5MTM4ODAxLCAweDg5MTU4ODAzLCAweDg5MTc4ODA1LCAweDg5NDE4ODA2LAorMHg4OTQ3ODgwOCwgMHg4OTREODgwOSwgMHg4OTUzODgwQSwgMHg4OTU5ODgwQiwKKzB4MDAwOUEwNjAsIDB4MDAwOUIwNjIsIDB4NjAwQ0EwNUQsIDB4MDAwOUIwNzAsCisweDYwMENBMDU5LCAweDAwMDlCMDdBLCAweDYwMENBMDU1LCAweDYyNjBENjA2LAorMHg4QjRGMjIyOCwgMHgwMDA5QjA4NiwgMHg2MDBDQTA0RCwgMHgwMDFFMTAyOCwKKzB4MDAxRTIxNDgsIDB4MDAxRTExMDgsIDB4MDAyMDI4RDksIDB4MDAyMDI4QzgsCisweDAwMjAyOENBLCAweDAwMjAyOENDLCAweDAwMjAyOEFDLCAweDAwMUUxMDA4LAorMHgwMDFFMTAzRiwgMHgwMDFFMTA1RiwgMHgwMDFFMTAzMCwgMHgwMDFFMTA5MCwKKzB4MDAyMDI4RDQsIDB4MDAxRTEwMEIsIDB4MDAyMDI4RDAsIDB4MDAyMDI4RDgsCisweDAwMjAyOEEwLCAweDYyNjBENjg3LCAweDhCMjMyMjI4LCAweDAwMDlCMDZBLAorMHg2MDBDQTAyMSwgMHg2MjYwRDY4MywgMHg4QjFCMjIyOCwgMHgwMDA5QjBCNCwKKzB4NjAwQ0EwMTksIDB4NjI2MEQ2N0YsIDB4OEIxMzIyMjgsIDB4MDAwOUIwQkEsCisweDYwMENBMDExLCAweDYyNjBENjdCLCAweDhCMEIyMjI4LCAweDAwMDlCMTFFLAorMHg2MDBDQTAwOSwgMHg2MjYwRDY3NywgMHg4QjAzMjIyOCwgMHgwMDA5QjEzNiwKKzB4NjAwQ0EwMDEsIDB4NEYyNkUwMDAsIDB4MDAwOTAwMEIsIDB4RDI3M0QxNzIsCisweEQ1NzM4NDEyLCAweDQwMDBDOTBGLCAweEQ3NzIwMTJELCAweDYxMUNFNDAzLAorMHhENjcxRTIwRiwgMHgyNzEyMjU0MCwgMHhFMDAxMjUyMCwgMHgyNjAyMDAwQiwKKzB4RTYwMUQyNjksIDB4MzA2Njg1MjMsIDB4RTAwMDhEMDYsIDB4RTAwMEQyNjcsCisweDgxMjJENjY5LCAweDI2MDJFMDAxLCAweDAwMDkwMDBCLCAweDg1MjNEMjYyLAorMHgyMDA4NjAwRCwgMHg4ODAxODkwNSwgMHhENjY0OEIwQSwgMHhDQjAxNjA2MCwKKzB4RDY2MTI2MDAsIDB4RTEwMUQ0NUQsIDB4MjYxMkUwMDEsIDB4ODE0MjAwMEIsCisweEUwMDAwMDBCLCAweEU1MDFEMTU4LCAweDQ1MTg4NTEzLCAweDM0NTM2NDBELAorMHg4RDA1NjYwMywgMHhEMjVBRTAwMCwgMHhFMDAxRDU1NywgMHgyNTAyMjI2MCwKKzB4MDAwOTAwMEIsIDB4RDE1MDRGMjIsIDB4NjUwRDg1MTMsIDB4NDQxOTY0NTMsCisweDY3MkU2MjQ5LCAweDYwMkMyMjdELCAweDg5MDk4ODAxLCAweDg5MEM4ODAyLAorMHg4OTEwODgwMywgMHg4OTI2ODgwNiwgMHg4OTI5ODgwNywgMHgwMDA5QTAzOCwKKzB4RDY0REQ1NEMsIDB4QTAyN0UyMTIsIDB4NjI1QzI2NTIsIDB4OEIyRjIyMjgsCisweEEwMUVENjRBLCAweDYwNUM2MjYyLCAweDg5MDUyMDA4LCAweDg5MDg4ODEwLAorMHg4OTBCODgyMCwgMHgwMDA5QTAyNCwgMHhENjQzRDQ0NSwgMHhBMDEzRTIwNCwKKzB4RDc0NDI2NDIsIDB4RTIwQ0Q2NDAsIDB4MjY3MkEwMEUsIDB4RDYzRUQ1NDIsCisweEEwMDlFMjE4LCAweEQ0NDEyNjUyLCAweEUyMEFENjNCLCAweDI2NDJBMDA0LAorMHhENjM5RDIzRiwgMHhFMjJFMjYyMiwgMHhENDNFODUxNSwgMHgzMjc3NjcwRCwKKzB4OEYwMTI0MjEsIDB4MjQ1MTY1MDMsIDB4MDAwOUIwREYsIDB4RTAwMUEwMDEsCisweDRGMjZFMDAwLCAweDAwMDkwMDBCLCAweEUxMDFENjI5LCAweDI2MTBENDM2LAorMHhENzI4NjU0MSwgMHg2NTVERDEyOCwgMHhFMDAxRTIwRiwgMHgyNjIwMjc1MiwKKzB4MjEwMjAwMEIsIDB4NEYyMjJGRTYsIDB4ODUyM0QyMUYsIDB4MjQ0ODY0MEMsCisweEQ2MkQ4QjA4LCAweEUyMDBENTIxLCAweDg0NTEyNjIxLCAweDIwNDk5NDMwLAorMHg4MDUxQTAyNiwgMHg2MEUwREUxRCwgMHg4RDBCQzg0MCwgMHgzNDI3RTIwMSwKKzB4RDEyNTg5MjIsIDB4NDIwQkQyMjUsIDB4RDUyNTIxNDEsIDB4Q0IwNDYwNTIsCisweDI1MDJBMDBCLCAweDg5MTczNDI3LCAweEQ3MjJEMjFGLCAweDIyNDE0NzBCLAorMHhFNUZCRDYxRiwgMHgyMTU5NjE2MiwgMHg4NEUxMjYxMiwgMHhCMTJEQ0I4MCwKKzB4NjBFMDgwRTEsIDB4Q0IwNEQ2MUMsIDB4NjA2MDJFMDAsIDB4MjYwMEM5M0YsCisweEUwMDFENjA5LCAweDI2MDJBMDAxLCAweDRGMjZFMDAwLCAweDZFRjYwMDBCLAorMHgwMDAwRkY3RiwgMHgwMDIwMjhEOSwgMHgwMDIwMjhBMCwgMHgwMDIwMjhBQywKKzB4MDAxRTExMDAsIDB4MDAxRTEwMEMsIDB4MDAyMDI4RDAsIDB4MDAxRTEwMDAsCisweDAwMUUxMDAxLCAweDAwMjAyQTkwLCAweDAwMjAyOEI0LCAweDAwMjAyOEJDLAorMHgwMDIwMkFGRSwgMHgwMDIwMkIwMiwgMHgwMDIwMkIwRSwgMHgwMDIwMkIyNiwKKzB4MDAyMDJCMzAsIDB4MDAyMDI4QjgsIDB4MDAyMDI4QzYsIDB4MDAyMDFBMzIsCisweDAwMUUxMTA4LCAweDAwMjAxQjNFLCAweDAwMUUxMDE1LCAweDYwNjBENjk2LAorMHg4OTE5Qzg4MCwgMHg2MDIxRDI5NSwgMHg4QjE1ODgwMSwgMHhFNTAxRDI5NCwKKzB4MzA1Njg1MjQsIDB4RDE5Mzg5MTAsIDB4RDQ5M0UyMDMsIDB4NjU0MTIxMjAsCisweDY1NURFMDBCLCAweEQ1OTEwNjU2LCAweEU3MDJFNDBGLCAweDI1NzEyMTQwLAorMHhFMDAxRDc4RiwgMHgyNzAyMDAwQiwgMHhFMDAwMDAwQiwgMHg0RjIyMkZFNiwKKzB4ODRFMURFOEMsIDB4ODkzNEM4ODAsIDB4ODU1NEQ1ODUsIDB4OEYzMDIwMDgsCisweEQ3ODk2MTAzLCAweDY2NzI4NTUzLCAweDY1MEM2NDAzLCAweDYyMEM4NTY2LAorMHg4QjI2MzUyMCwgMHhENzgwRDY4NSwgMHg2NDRDNjUxQywgMHgyNzQxMjY1MSwKKzB4Qzg0MDYwRTAsIDB4RDI4Mjg5MDcsIDB4MDAwOTQyMEIsIDB4NjA2MkQ2ODEsCisweEEwMDhDQjA0LCAweEQxODAyNjAyLCAweDAwMDk0MTBCLCAweEU1RkJENjdELAorMHgyNDU5NjQ2MiwgMHhCMEExMjY0MiwgMHhENTc1MDAwOSwgMHgyNTIyRTIwMSwKKzB4RDc3QTYwRTAsIDB4MkUwMENCMDQsIDB4QzkzRjYwNzAsIDB4QTAwMTI3MDAsCisweEUwMDA2MDIzLCAweDAwMEI0RjI2LCAweDJGQTY2RUY2LCAweDJGQzYyRkI2LAorMHgyRkU2MkZENiwgMHhFMjQwREE2OSwgMHhEQzY2NjZBMSwgMHgzMTIzNjE2RCwKKzB4NjI2Mzg5MDAsIDB4NkVEMzZEMkMsIDB4NEUyMTM2RDgsIDB4NEUyMTJBNjEsCisweERCNkNENDZCLCAweEU3MDBBMDBGLCAweDc3MDE2NkIyLCAweDcxMDI2MTYzLAorMHg2NTYxMkIxMiwgMHg3MTAyNjYxMywgMHg2MjYxMkIxMiwgMHg2MjJENjU1RCwKKzB4MzI1QzQyMjgsIDB4NjI3QzI0MjIsIDB4OEJFRDMyRTMsIDB4QzkwMzYwRDMsCisweDhCMTA4ODAzLCAweEVEMDc2RUIyLCAweDcxMDI2MUUzLCAweDY3MTMyQjEyLAorMHg2MkUxNzEwMiwgMHg2NTcxMkIxMiwgMHg2NTVENjIyRCwgMHgzNTJDNDUyOCwKKzB4QTAwQzJDRDAsIDB4ODgwMjI0NTIsIDB4QTAwMzhCMDEsIDB4ODgwMUUyMDMsCisweEUyMDE4QjA1LCAweDY2QjIyQzIwLCAweDY3N0Q2NzYxLCAweEVCMEYyNDcyLAorMHg2REExMkNCMCwgMHg4QjA1MkREOCwgMHhENDQ1RDI0RiwgMHhFMTAxRUUwMCwKKzB4MjQxMjIyRTIsIDB4NkRGNjZFRjYsIDB4NkJGNjZDRjYsIDB4NkFGNjAwMEIsCisweDJGRTYyRkQ2LCAweEUyNDBERDNELCAweDYxNkQ2NkQxLCAweDg5MDAzMTIzLAorMHg2NzJDNjI2MywgMHhERTQzMzY3OCwgMHgyRDYxNzcwMywgMHhENjQwNDcyMSwKKzB4NDcyMTY0RTIsIDB4RTEwMEEwMEUsIDB4NzEwMTY1NjIsIDB4MjQ1MDYyNTMsCisweDQyMTk3NDAxLCAweDc0MDEyNDIwLCAweDI0NTA0NTI5LCAweDQ1MTk3NDAxLAorMHg3NDAxMjQ1MCwgMHgzMjczNjIxQywgMHg0MjAwOEJFRSwgMHg2NEQxNjZFMiwKKzB4MzYyQzQyMDAsIDB4OEYwNjI0NDgsIDB4REQzMzJFNjIsIDB4RTUwMERFMjgsCisweDJENTJFNzAxLCAweDZFRjYyRTcyLCAweDZERjYwMDBCLCAweDJGRTYyRkQ2LAorMHhFRTAxNEYyMiwgMHhFRDBBQTAwNSwgMHg2NEUzQkNCNiwgMHg2NEUzQkNCQywKKzB4NjJFQzdFMDEsIDB4OEJGNzMyRDcsIDB4RUUwMUEwMDUsIDB4NjRFM0JDQkQsCisweDY0RTNCQ0MzLCAweDYyRUM3RTAxLCAweDhCRjczMkQ3LCAweDZFRjY0RjI2LAorMHg2REY2MDAwQiwgMHgyRkU2MkZENiwgMHg3RkZDNEYyMiwgMHg2MDYwRDYxRiwKKzB4ODk3NTg4MDEsIDB4RTEwMUQ0MUUsIDB4RDcxMjg1NDgsIDB4NjUwRDI2MTAsCisweDQ1MTk2MDcwLCAweDY2NTlERDFCLCAweDYxRDM2MjZFLCAweEM4NDAyNjJELAorMHg3NDAyNzEwMiwgMHg4RDQ3RDcxOCwgMHhEMjE4NjY2QywgMHhFNTAxREUwQSwKKzB4QTAzMTJFMjIsIDB4MDAwMEVFMDQsIDB4MDAxRTEwMDEsIDB4MDAyMDI4QzYsCisweDAwMjAyOEEwLCAweDAwMUUxMTAwLCAweDAwMjAyOENBLCAweDAwMjAyOEI4LAorMHgwMDIwMjhEMCwgMHgwMDFFMTAwMCwgMHgwMDIwMjhCQywgMHgwMDIwMjhDOCwKKzB4MDAyMDFBMzIsIDB4MDAxRTExMDgsIDB4MDAyMDFCM0UsIDB4MDAxRTEwMTUsCisweDAwMUUxMDBDLCAweDAwMjAyOEI0LCAweDAwMjAyOEQ0LCAweDAwMjAyOEQ4LAorMHgwMDIwMkE5MCwgMHgwMDIwMkIyNiwgMHgwMDIwMkIzMiwgMHgwMDIwMkFBMiwKKzB4NzUwMTYyNDUsIDB4NzEwMjIxMjEsIDB4MzJFMzYyNUMsIDB4NjA2MzhCRjgsCisweEU2MDE4MUQ0LCAweEU0MTdENTM4LCAweDMyNDM2MjZDLCAweDYyNTU4OTFFLAorMHgyNzIxNzYwMSwgMHg3NzAyQUZGOCwgMHhERTM1RDIzNCwgMHgyRTIyRTUwMSwKKzB4RUUwNEEwMDQsIDB4NzUwMTYyNDUsIDB4NzEwMjIxMjEsIDB4MzJFMzYyNUMsCisweDYwNjM4QkY4LCAweEU2MDE4MUQ0LCAweEEwMDRENTJFLCAweDYyNTVFNDE3LAorMHgyNzIxNzYwMSwgMHg2MjZDNzcwMiwgMHg4QkY4MzI0MywgMHgyRDIxOTI0QiwKKzB4RDcyQUQ0MjksIDB4MkYxMjYxNDIsIDB4NkRGMjY1RjIsIDB4Qzk4MDYwNTMsCisweDYwNTMyNzAwLCAweDYxMDNDOTYwLCAweDYwNTM4MDcxLCAweDY1RjI2RUYyLAorMHg0RDE5QzkwMywgMHg4MDcyNDUyOSwgMHg0NTE5NjBEQywgMHg0RTI5ODE3MiwKKzB4NjJFQzYwNUMsIDB4MzAyQzQwMTgsIDB4NkQ0MjgxNzMsIDB4MkZEMjIxMTgsCisweDYyRjI2RUYyLCAweDQyMTk2NkYyLCAweDY1NkM0NjI5LCAweDYwMkM2NkYyLAorMHg0MDE4NjRFQywgMHgzMDRDNDYyOSwgMHg4MTc0NDYxOSwgMHg0MDE4NjA2QywKKzB4OEYwNzMwNUMsIDB4QkNCNTgxNzUsIDB4NjIwQzAwMDksIDB4ODkwODIyMjgsCisweDAwMDlBMDBBLCAweDg4NDA2MDEzLCAweEIwMEE4QjAzLCAweEEwMDMwMDA5LAorMHhENjBCMDAwOSwgMHgyNjIyRTIwMiwgMHg0RjI2N0YwNCwgMHgwMDBCNkVGNiwKKzB4MDAwQjZERjYsIDB4MDYwQTAwMDksIDB4MDAyMDJBRDIsIDB4MDAyMDJBRDAsCisweDAwMjAyOEJDLCAweDAwMjAyQUE0LCAweDAwMUUxMDBDLCAweDAwMjAyOEEwLAorMHgwMDIwMjhEMCwgMHg3RkZDNEYyMiwgMHg2NjIwRDI3RSwgMHg4RDA4MjY2OCwKKzB4RDQ3RDJGNjAsIDB4NDIwQkQyN0QsIDB4NjRGMDAwMDksIDB4QTA5MDdGMDQsCisweDdGMDQ0RjI2LCAweDAwMEI0RjI2LCAweDAwMEIwMDA5LCAweDJGRTYwMDA5LAorMHhERTc3NEYyMiwgMHg2MEUwRDY3NywgMHhDQkMwRDQ3NywgMHg2MjYwMkUwMCwKKzB4QzgwMzYwMkMsIDB4NDAyMTg5MDQsIDB4NzAwMTQwMjEsIDB4NjYwM0EwMDIsCisweDY2MDM0MDA5LCAweEQ2NzE2MTZELCAweEU1MDBBMDA0LCAweDc1MDE2MjYyLAorMHg3NDA0MjQyMiwgMHgzMjEzNjI1RCwgMHhEMTZEOEJGOCwgMHgwMDA5NDEwQiwKKzB4RTQwMUQ2NkMsIDB4ODRFMjI2NDEsIDB4ODBFMkM5QkYsIDB4MDAwQjRGMjYsCisweDJGRTY2RUY2LCAweEQ1Njg3RkZDLCAweDYyNTBERTYxLCAweDY0MkM4NEUyLAorMHhDQjQwNzQwNCwgMHg4MEUyNjE0RCwgMHg0NDIxNjQxMywgMHhENzYzNDQyMSwKKzB4RTYwMEEwMDQsIDB4NzYwMTYyNTYsIDB4MjcyMjJGMjIsIDB4MzI0MzYyNkQsCisweDYwMTM4QkY4LCAweDIwMDhDOTAzLCAweDg4MDM4OTEyLCAweDg4MDI4OTA1LAorMHg4ODAxODkwNiwgMHhBMDA4ODkwNywgMHhFMDA3MDAwOSwgMHg4MDc4QTAwNSwKKzB4QTAwMkUwMDMsIDB4RTAwMTgwNzgsIDB4NjI1MjgwNzgsIDB4MjcyMjJGMjIsCisweEQ2NTBFMDBGLCAweDYwNjE4MDc4LCAweDhCMDE4ODAxLCAweDI2MjFFMjAwLAorMHg2MDYwRDY0RiwgMHgyNjAwQ0IwOCwgMHhDOTNGNjBFMCwgMHg3RjA0MkUwMCwKKzB4NkVGNjAwMEIsIDB4NjAyMUQyNDcsIDB4OEQxODg4MDEsIDB4RDI0NjYxNDMsCisweDIyMTA2MDUzLCAweDYwNjM4MDIxLCAweEQ0NDY4MTIxLCAweEU1MDBBMDA3LAorMHgwMjdDNjA1RCwgMHgzNjRDNjYwMywgMHgyNjIwNzAwMSwgMHg2MjVENjUwMywKKzB4MzIxMzYxMUMsIDB4RDY0MDhCRjQsIDB4QzlCRjYwNjAsIDB4MDAwQjI2MDAsCisweDJGRDYwMDA5LCAweDRGMjIyRkU2LCAweDYwNDM3RkZDLCAweDhEMDJDODIwLAorMHhCRjZBNkU0MywgMHg2MEUzMDAwOSwgMHg4OTAxQzgxMCwgMHgwMDA5QkY2NywKKzB4Qzg0MDYwRTMsIDB4QkY4Qzg5MDEsIDB4NjBFMzAwMDksIDB4ODkyOUM4MDEsCisweDYwRDBERDMyLCAweDhEMDNDODAyLCAweEQ2MzEyRjAwLCAweDAwMDk0NjBCLAorMHhDODA0NjBGMCwgMHhENjJGODkwMiwgMHgwMDA5NDYwQiwgMHg2MDIzNjJGMCwKKzB4ODkwMkM4ODAsIDB4Qzk3RjYwRDAsIDB4NjAyMzJEMDAsIDB4ODkwMkM4MDEsCisweDQyMEJEMjI5LCAweEQ1MjkwMDA5LCAweDg4MDI2MDUyLCAweEQyMjg4QjAzLAorMHhBMDA1RTYwNCwgMHg4ODAxMjI2MCwgMHhEMjI1OEIwMiwgMHgyMjYwRTYwMSwKKzB4MjUyMkUyMDAsIDB4Qzg4MDYwRTMsIDB4RDIyMjg5MTYsIDB4NjBFMzZFMjAsCisweDg5MDJDODAyLCAweDQyMEJEMjIwLCAweDYwRTMwMDA5LCAweDg5MDJDODA0LAorMHg0MjBCRDIxRSwgMHg2MEUzMDAwOSwgMHg4OTA1QzgwOCwgMHg3RjA0RDIxQywKKzB4NkVGNjRGMjYsIDB4NkRGNjQyMkIsIDB4NEYyNjdGMDQsIDB4MDAwQjZFRjYsCisweDAwMDA2REY2LCAweDAwMUUxMDIwLCAweDAwMjAyOTZDLCAweDAwMjAwREE2LAorMHgwMDFFMTAxNSwgMHgwMDFFMTBCRiwgMHgwMDExN0QwMCwgMHgwMDFFMTBGQywKKzB4MDAyMDAwRjgsIDB4MDAyMDI4Q0MsIDB4MDAxMTdEODAsIDB4MDAxRTEwRjgsCisweDAwMUUxMEFFLCAweDAwMTE3RDg0LCAweDAwMUUxMDE3LCAweDAwMUUxMDIxLAorMHgwMDIwMEZEOCwgMHgwMDIwMEZGQSwgMHgwMDIwMTU4NCwgMHgwMDIwMjhEMCwKKzB4MDAxRTEwMEIsIDB4MDAxRTEwMjgsIDB4MDAyMDEwMkEsIDB4MDAyMDEwM0MsCisweDAwMjAxMDQ4LCAweEQ2QTg2NDRDLCAweDM0NkM3NEZGLCAweDI0NTAwMDBCLAorMHg2NDRDRDZBNiwgMHgwMDBCMzQ2QywgMHhENkE1MjQ1MCwgMHgzNDZDNjQ0QywKKzB4MjQ1MDAwMEIsIDB4NjE2RDYyNUMsIDB4NDExOTQyMDgsIDB4NjAxOTQyMDgsCisweDY0NEM0MjAwLCAweDMyNEM2NzBFLCAweDIwN0REMTlFLCAweEM5MEY0MjAwLAorMHgwMDBCMzIxQywgMHg2NzYzMjIwMCwgMHg0MjA4NjI1QywgMHg0MjAwNDIwOCwKKzB4MzI0QzY0NEMsIDB4NDIwMEQxOTgsIDB4MDAwQjMyMUMsIDB4MkZFNjIyNzAsCisweDYxNEM0RjEyLCAweDQxMDBENDkzLCAweDY3MTAzMTRDLCAweDI3MjlFMjlGLAorMHg2NTczNkU1MywgMHg0NzE5Njc2RCwgMHg2NzJFNjI3OSwgMHg0MjIxMjI3RCwKKzB4NDIyMTQyMjEsIDB4NzYwMTY2MkMsIDB4RTQwMTQ2MDgsIDB4MzRFODQ2MDgsCisweDY0NEM0NjAwLCAweDBFMUEwNDY3LCAweDIxNTAyNUVCLCAweDAwMEI0RjE2LAorMHg0RjIyNkVGNiwgMHhEMjg1N0ZFOCwgMHg4ODAxNjAyMSwgMHhEMjg0OEI3QiwKKzB4MjY2ODY2MjEsIDB4RDI4MzhCNzcsIDB4MjY2ODY2MjEsIDB4RTUwRjhCNzMsCisweEU0MDFCRkEwLCAweEJGQTNFNTAxLCAweEU1ODZFNDAwLCAweEU0MDA2NTVDLAorMHgyRjUwQkZBMywgMHhCRkEwRTQwMSwgMHhFNjAyRTUwNiwgMHg2MDYzNDYxOCwKKzB4ODFGMkU0MDEsIDB4NjU0M0JGOUUsIDB4RTQwMTg1RjIsIDB4QkZBQTY1NDMsCisweDg1RjI2NjAzLCAweDY1NDNFNDAxLCAweDY2MDNCRkIxLCAweEU0MDI2NUYwLAorMHg2MDUzNzU2QywgMHg4MEY4QkY3RSwgMHhCRjgxRTQwMiwgMHg4NEY4RTUxMiwKKzB4NzA5MEU0MDIsIDB4NjUwM0JGODEsIDB4NDYxOEU2MDIsIDB4ODFGNjYwNjMsCisweEJGN0ZFNDAyLCAweDg1RjZFNTAwLCAweDY2MDNFNDAyLCAweEU1MDBCRjhCLAorMHhFNDAyODVGNiwgMHhCRjkyNjYwMywgMHhFNUZFRTUwMCwgMHhFMDEwNjU1QywKKzB4QkY1RkU0MDMsIDB4RTUxMzBGNTQsIDB4RTQwRUJGNjIsIDB4MDVGQ0UwMTAsCisweEJGNjJFNDBFLCAweEU1MDA3NTg1LCAweEJGNjNFNDAzLCAweEU1MDBFNjQwLAorMHhCRjcwRTQwMywgMHhFNTAwRTY0MCwgMHhCRjc4RTQwMywgMHhFNUZGRTY0MCwKKzB4RTAxNDY1NUMsIDB4QkY0NUU0MDQsIDB4RTQwRjBGNTQsIDB4RTUwNEJGNDgsCisweDA1RkNFMDE0LCAweEJGNDhFNDBGLCAweEU1MDE3NTg0LCAweEJGNDlFNjQwLAorMHhFNTAxRTQwNCwgMHhCRjU2RTY0MCwgMHhFNTAxRTQwNCwgMHhFNDA0RTY0MCwKKzB4QUY1QzdGMTgsIDB4N0YxODRGMjYsIDB4MDAwQjRGMjYsIDB4NEYyMjAwMDksCisweEQyNDI3RkYwLCAweDg4MDE2MDIxLCAweEQyNDE4QjcxLCAweDI2Njg2NjIxLAorMHhEMjQwOEI2RCwgMHgyNjY4NjYyMSwgMHhFNTBGOEI2OSwgMHhFNDAxQkYxQSwKKzB4QkYxREU1MDEsIDB4RTU4NkU0MDAsIDB4RTQwMDY1NUMsIDB4MkY1MEJGMUQsCisweEJGMUFFNDAxLCAweEU0MDFFNTA2LCAweEJGMUI2NTQzLCAweEU0MDFFNjQwLAorMHhCRjI4NjU0MywgMHhFNDAxRTY0MCwgMHhCRjMwNjU0MywgMHg2NUYwRTY0MCwKKzB4NzU2Q0U0MDIsIDB4QkVGRDYwNTMsIDB4RTQwMjgwRjQsIDB4RTUxMkJGMDAsCisweEU0MDI4NEY0LCAweEJGMDA3MDkwLCAweEU2NDA2NTAzLCAweEJGMDFFNDAyLAorMHhFNjQwRTUwMCwgMHhCRjBFRTQwMiwgMHhFNjQwRTUwMCwgMHhCRjE2RTQwMiwKKzB4RTVGRUU1MDAsIDB4NjA1MzY1NUMsIDB4QkVFM0U0MDMsIDB4RTUxMzgwRjgsCisweEU0MEVCRUU2LCAweEU0MEU4NEY4LCAweEJFRTY3MDg1LCAweEU1MDA2NTAzLAorMHhCRUU3RTY0MCwgMHhFNTAwRTQwMywgMHhCRUY0RTY0MCwgMHhFNTAwRTQwMywKKzB4QkVGQ0U2NDAsIDB4RTVGRkU0MDMsIDB4NjA1MzY1NUMsIDB4QkVDOUU0MDQsCisweEU0MEY4MEZDLCAweEU1MDRCRUNDLCAweEU0MEY4NEZDLCAweEJFQ0M3MDgzLAorMHhFNTAxNjUwMywgMHhCRUNERTY0MCwgMHhFNTAxRTQwNCwgMHhCRURBRTY0MCwKKzB4RTUwMUU0MDQsIDB4RTQwNEU2NDAsIDB4QUVFMDdGMTAsIDB4N0YxMDRGMjYsCisweDAwMEI0RjI2LCAweDAwMDAwMDA5LCAweDAwMUUxMDMwLCAweDAwMUUxMDgwLAorMHgwMDFFMTA5MCwgMHgwMDFFMTAzRiwgMHgwMDFFMTAzRSwgMHgwMDIwMjhDNiwKKzB4MDAyMDI4QzgsIDB4MDAyMDI4Q0EsIDB4MDAwOTAwMEIsIDB4NjY2Q0U2ODAsCisweDY1NjNEMkE4LCAweDc1NDBFNzAwLCAweDY0NzM0MjJCLCAweDJGQjYyRkE2LAorMHgyRkQ2MkZDNiwgMHg0RjIyMkZFNiwgMHg0QzE4RUMwMSwgMHhEQUEzREJBMiwKKzB4NjVCMjUyQjEsIDB4ODkyMjM1MjAsIDB4QzkwMzYwNTEsIDB4ODkxRTg4MDEsCisweEQxOUZERTlELCAweDY0RTM0MTBCLCAweDg1MDM2NTAzLCAweDY3MEQ2NkEyLAorMHhERDlDMzc2MiwgMHhENDlDODkwQSwgMHg0MjBCRDI5QywgMHhEMTlDMDAwOSwKKzB4RTcwMUQ0OUMsIDB4MjE3MjREMEIsIDB4MDAwOUFGRTIsIDB4NDIwQkQyOUEsCisweEQ2OUE2NEUzLCAweDREMEJENDlBLCAweEFGRDkyNkMyLCAweDRGMjYwMDA5LAorMHg2REY2NkVGNiwgMHg2QkY2NkNGNiwgMHg2QUY2MDAwQiwgMHg3RkY0NEYyMiwKKzB4RTY4MTg1NDYsIDB4ODU0NzJGMDEsIDB4ODFGMTY2NkMsIDB4RDI4NTg1NDgsCisweDg1NDI4MUYyLCAweDgxRjM2N0YzLCAweEU0MEM4NTQzLCAweDYwNTM4MUY0LAorMHg4MUY1NjU2MywgMHg3NTQwNDIwQiwgMHg0RjI2N0YwQywgMHgwMDA5MDAwQiwKKzB4MkY5NjJGODYsIDB4MkZCNjJGQTYsIDB4MkZENjJGQzYsIDB4NEYyMjJGRTYsCisweERDODQ3RkYwLCAweEU4MDBBMERELCAweEQyODM2QjEzLCAweEUwMDE0QjA4LAorMHg0QjAwNDIwQiwgMHgxRjAzREU4MSwgMHgzQkVDODVGMiwgMHgyRjgyN0UzMCwKKzB4MUZFMjY4MDMsIDB4NjZDMkREN0UsIDB4MzYyMDUyQzEsIDB4QTBDMzhCMDEsCisweDYwNjEwMDA5LCAweDg4MDFDOTAzLCAweEEwQkQ4QjAxLCAweDg1NjEwMDA5LAorMHg4OTY1QzgwMSwgMHhFRTEwNTE2MywgMHhEQTZBODUxMiwgMHhDOTAzNjYwMywKKzB4ODUxMzY0MDMsIDB4NDAyMTYwMEQsIDB4QzkzRjQwMjEsIDB4OEQxQzMwRTMsCisweEQ3NzA2NTAzLCAweDYyNzA0NDA4LCAweDQ0MDA0NDA4LCAweDIyMjg0NTAwLAorMHgzNDVDOEYwQSwgMHg2MDQzRDI2QywgMHg2OTdEMDcyRCwgMHg2ODk5NDkxOSwKKzB4Njk3QzZFOEUsIDB4MjhFREEwMDksIDB4NjA0M0QyNjgsIDB4Njk3RDA3MkQsCisweDY4OTk0OTE5LCAweDY5N0M2RThFLCAweEVFRkYyOEVELCAweDZFRUM2MjlELAorMHg4QjBGMzJFMCwgMHg0MTBCRDE1MiwgMHg1NDAzNjRDMywgMHhCRjg1RTUwMiwKKzB4RDQ1RjZFMDMsIDB4NDYwQkQ2NTQsIDB4RDc1RTY1RTMsIDB4RDQ1RUVFMDEsCisweDI3RTJBMDFELCAweDI2RTlFRUZDLCAweDgxMTI2MDYzLCAweDk3ODg4NTEzLAorMHgyMDc5NDIwOCwgMHg4NTEyODExMywgMHg4MTEyMjA4QiwgMHgyMDJCODUxMywKKzB4ODUxNDgxMTMsIDB4NDIxOEUyMDgsIDB4ODExNDIwMkIsIDB4ODU0MTY0QzIsCisweDgxNDEyMEU5LCAweEQ0NTE2NUMyLCAweENCMDE2MDUxLCAweDRBMEIyNTAxLAorMHg2MEMyMDAwOSwgMHg1MkYzNTZGMiwgMHgyQjAyQ0IwMSwgMHgyNjIyQUY4QiwKKzB4RDIzNzg1NjEsIDB4OEQyRUM4MDIsIDB4NDIwQjY0QzMsIDB4RDY0ODAwMDksCisweDVFMDM2NTAzLCAweDA3NkVFMDRDLCAweDc3MDFEMTQ2LCAweDYwMTIwNjc2LAorMHg4QjA1ODgwMSwgMHhFQTBDODVFMSwgMHgyMEFCNEExOCwgMHg4MUUxQTAwNywKKzB4ODgwMjYwMTIsIDB4ODVFMThCMDMsIDB4MjBBOUVBREYsIDB4ODU1MTgxRTEsCisweDIwQTlFQUZDLCAweDYwNTE4MTUxLCAweENCMDFEQTI4LCAweDRBMEI2NEMzLAorMHg1NkYyMjUwMSwgMHhENzM4NTFGMywgMHg4NUVGMjYxMiwgMHg0NzBCNjREMywKKzB4QUY1ODY1MEQsIDB4NDIwQjAwMDksIDB4NTQwMzAwMDksIDB4ODU0NDZFMDMsCisweDRBMThFQTA4LCAweDMwQTAyMEE5LCAweDhCMDNEQTFBLCAweEU1MDFCRjE2LAorMHgwMDA5QTAwNywgMHhENjJEODU0MSwgMHgyMjY4NjIwRCwgMHhCRjBEODkwMSwKKzB4RDQyM0U1MDAsIDB4NDIwQkQyMTgsIDB4RDcyMjY1RTMsIDB4RUUwMUQ0MjgsCisweDI3RTI0QTBCLCAweDAwMDlBRjM3LCAweDY4RjI2MDgzLCAweDc4MDE4MUYyLAorMHg2MThEN0MwOCwgMHgzMUU3RUUwMywgMHhBRjFEODkwMSwgMHg3RjEwMDAwOSwKKzB4NkVGNjRGMjYsIDB4NkNGNjZERjYsIDB4NkFGNjZCRjYsIDB4MDAwQjY5RjYsCisweEZFMDM2OEY2LCAweDAwMjAxODM0LCAweDAwMjAyODg0LCAweDAwMjAyODhDLAorMHgwMDIwMEE1QywgMHgwMDIwMERBNiwgMHgwMDIwMjg1NCwgMHgwMDIwMEFERSwKKzB4MDAxRTIxMzAsIDB4MDAyMDJBNzAsIDB4MDAyMDBBN0EsIDB4MDAxQzNEMzAsCisweDAwMjAyQTc0LCAweDAwMjAyODY0LCAweDAwMjAxRkQ0LCAweDAwMUMzRDAwLAorMHgwMDIwMkE4MCwgMHgwMDIwMkE4QywgMHgwMDIwMjk3MCwgMHgwMDIwMjlGMCwKKzB4MDAyMDI4NUMsIDB4MDAxRTIxMkMsIDB4MDAyMDJBNzgsIDB4MDAyMDJBN0MsCisweDAwMjAyN0Y4LCAweDAwMjAyN0Y0LCAweDAwMjAwRTA2LCAweDAwMDA4MDAwLAorMHgwMDIwMkE4OCwgMHg0RjIyMkZFNiwgMHg2RTIyRDIwRCwgMHhDODQwNjBFMywKKzB4MjJFMjhEMDIsIDB4MDAwOUJFNjgsIDB4NDIxOEUyNDAsIDB4ODkwMTJFMjgsCisweDAwMDlCRTY0LCAweEM4MDU2MEUzLCAweEJFQjk4OTAxLCAweDYwRTMwMDA5LAorMHg4OTAyQzgwMiwgMHhBRTYxNEYyNiwgMHg0RjI2NkVGNiwgMHg2RUY2MDAwQiwKKzB4MDAxQzM1MTAsIDB4MDgwQTBDMEUsIDB4MDAwMjA0MDYsIDB4MUExQzFFMjAsCisweDEyMTQxNjE4LCAweDJFMzAzMjM0LCAweDI2MjgyQTJDLCAweDNBM0MzRTQwLAorMHg2QzYyNTY0OCwgMHg0MTExMkYyNiwgMHhFMjIwOEYxOCwgMHg4OTBCMzEyMywKKzB4MzIxQ0QyMDQsIDB4RDEwMjYyMjAsIDB4NDEyQjMxMkMsIDB4MDAwOTAwMDksCisweDAwMjAxRkZFLCAweDAwMjAxRkI0LCAweDAwMEJFMDAwLCAweDQwMDA2MkY2LAorMHg0MDAwNDAwMCwgMHg0MDAwNDAwMCwgMHg0MDAwNDAwMCwgMHg2MkY2MDAwQiwKKzB4NDAwMDQwMDAsIDB4NDAwMDQwMDAsIDB4NDAwMDQwMDAsIDB4NDAxODQwMDAsCisweDYyRjYwMDBCLCAweDQwMDA0MDAwLCAweDQwMDA0MDAwLCAweDQwMDA0MDAwLAorMHg0MDI4NDAwMCwgMHg2MkY2MDAwQiwgMHg0MDAwNDAwMCwgMHg0MDE4NDAwMCwKKzB4MDAwQjQwMjgsIDB4QzkwRjYyRjYsIDB4NDAwNTQwMDUsIDB4NDAwNTQwMDUsCisweDYyRjYwMDBCLCAweDQwMDVDOTA3LCAweDQwMDU0MDA1LCAweDYyRjYwMDBCLAorMHg0MDA1QzkwMywgMHgwMDBCNDAwNSwgMHhDOTAxNjJGNiwgMHgwMDBCNDAwNSwKKzB4MDAwMDYyRjYsIDB4MDgwQTBDMEUsIDB4MDAwMjA0MDYsIDB4MUExQzFFMjAsCisweDEyMTQxNjE4LCAweDJFMzAzMjM0LCAweDI2MjgyQTJDLCAweDNBM0MzRTQwLAorMHg2QzYyNTY0OCwgMHg0MTExMkYyNiwgMHhFMjIwOEYxOCwgMHg4OTBCMzEyMywKKzB4MzIxQ0QyMDQsIDB4RDEwMjYyMjAsIDB4NDEyQjMxMkMsIDB4MDAwOTAwMDksCisweDAwMjAyMEJFLCAweDAwMjAyMDc0LCAweDAwMEJFMDAwLCAweDQwMDE2MkY2LAorMHg0MDAxNDAwMSwgMHg0MDAxNDAwMSwgMHg0MDAxNDAwMSwgMHg2MkY2MDAwQiwKKzB4NDAwMTQwMDEsIDB4NDAwMTQwMDEsIDB4NDAwMTQwMDEsIDB4NDAxOTQwMDEsCisweDYyRjYwMDBCLCAweDQwMDE0MDAxLCAweDQwMDE0MDAxLCAweDQwMDE0MDAxLAorMHg0MDI5NDAwMSwgMHg2MkY2MDAwQiwgMHg0MDAxNDAwMSwgMHg0MDE5NDAwMSwKKzB4MDAwQjQwMjksIDB4NDAwNDYyRjYsIDB4NDAwNDQwMDQsIDB4QzkwRjQwMDQsCisweDYyRjYwMDBCLCAweDQwMDQ0MDA0LCAweEM5MDc0MDA0LCAweDYyRjYwMDBCLAorMHg0MDA0NDAwNCwgMHgwMDBCQzkwMywgMHg0MDA0NjJGNiwgMHgwMDBCQzkwMSwKKzB4MDAwMDYyRjYsIDB4MzYyMkUyMTgsIDB4Njc0MzhGMTIsIDB4MDAwOUEwMDQsCisweDc2RkY2MjU0LCAweDc0MDEyNDIwLCAweEM4MDM2MDUzLCAweDYwNDM4QkY4LAorMHg4OTAyQzgwMywgMHg0MjJCRDIyQiwgMHhEMjJCMDAwOSwgMHgwMDA5NDIyQiwKKzB4MkZFNjY0NzMsIDB4OEQ0QTM0NTAsIDB4Mjc3ODY3NjMsIDB4NjI0Mzg5NDcsCisweDIyN0IyMjVCLCAweEM5MDE2MDIzLCAweDhEMjAzNDUyLCAweDJFRTg2RTAzLAorMHg2MDIzOEIxNSwgMHg4QjA4QzgwMywgMHg0NzA5NjY0MywgMHg0NzEwNjI1NiwKKzB4OEZGQjI2MjIsIDB4QTAzMjc2MDQsIDB4NDcwMTAwMDksIDB4NjE0MzY2NzMsCisweDQ2MTA2MjU1LCAweDhGRkIyMTIxLCAweEEwMjg3MTAyLCAweDY2NDMwMDA5LAorMHg0NzEwNjI1NCwgMHg4RkZCMjYyMCwgMHhBMDIwNzYwMSwgMHg2MTQzMDAwOSwKKzB4MkVFODM1N0MsIDB4OEYxNTMxN0MsIDB4NjAyMzY2NTMsIDB4OEIwN0M4MDMsCisweDc2RkM0NzA5LCAweDQ3MTA2MjYyLCAweDIxMjY4RkZCLCAweDAwMDlBMDBGLAorMHg2NTYzNDcwMSwgMHg3NUZFNjY3MywgMHg0NjEwNjI1MSwgMHgyMTI1OEZGQiwKKzB4MDAwOUEwMDUsIDB4NjI2MDc2RkYsIDB4OEZGQjQ3MTAsIDB4NjA0MzIxMjQsCisweDZFRjYwMDBCLCAweDAwMjAyMkE2LCAweDAwMjAyNzUyLCAweEUyMUUyRkU2LAorMHg2NzYzMzYyNiwgMHg4RDFCNjE1MywgMHgzRTEwNkU0MywgMHgzRTEyODkxNiwKKzB4NjVFMzg5MDgsIDB4MzY3MkU2MDAsIDB4NjIxNDg5MTAsIDB4MjUyMDc2MDEsCisweDc1MDFBRkY5LCAweDMxN0M2NEUzLCAweDY1MTMzNDdDLCAweEU2MDBBMDA0LAorMHg2MjUwNzVGRiwgMHgyNDI0NzYwMSwgMHg4QkY5MzY3MiwgMHg2MEUzQTAxMSwKKzB4ODkwODMxRTIsIDB4MzI3QzYyMTMsIDB4OEIwNDMyRTYsIDB4NjUxMzY0RTMsCisweEEwMDg2NjczLCAweEQyOEY2RUY2LCAweDY1MTM2NEUzLCAweDQyMkI2NjczLAorMHgwMDBCNkVGNiwgMHhFMjA0NkVGNiwgMHg2NzQzMzYyMiwgMHg4RjEwMzU2QywKKzB4QTAwNDM0NkMsIDB4NzVGRjAwMDksIDB4NzZGRjYyNTAsIDB4NjA1MzI0MjQsCisweDhCRjhDODAzLCAweEM4MDM2MDQzLCAweEExMDU4OTAxLCAweEEyNzcwMDA5LAorMHhBMjk5MDAwOSwgMHgyRkI2MDAwOSwgMHgyRkQ2MkZDNiwgMHg3RkU0MkZFNiwKKzB4NkM2MzYwNDMsIDB4NjY1MjFGNjIsIDB4QzkwMzc1MDQsIDB4MUY1MTZFNTMsCisweDQ1MDg2NTAzLCAweEUxRkM2RDQzLCAweDJEMTk0NTAwLCAweDFGNzMyNTU4LAorMHgxRjY1MUY0NCwgMHgyRkQyOEQwQiwgMHg4ODA4NjA1MywgMHg4ODEwODkyMywKKzB4ODgxODg5NUIsIDB4QTA4OThCMDEsIDB4QTBCRDAwMDksIDB4NjI2MzAwMDksCisweDJEMjJFNjAwLCAweDdDRkM3RDA0LCAweEVCMTBBMDBELCAweEU2MDA2NEU2LAorMHg3Q0YwNjVFNiwgMHg2MkUyNjFFNiwgMHgxRDUxMkQ0MiwgMHgxRDIzMUQxMiwKKzB4N0UwNDdEMTAsIDB4M0NCMjFGRTEsIDB4MUY2NTg5RjAsIDB4MkZEMjFGQzIsCisweEEwQTExRkU2LCAweDY0RDIxRkQ0LCAweDQ0Mjg2MjYzLCAweDQ0Mjk0NDE4LAorMHg0MjE4NDQxOSwgMHg0NjI5MjQyQiwgMHgyRDQyNDYxOSwgMHg2NTYzN0QwNCwKKzB4QTAyMTdDRkQsIDB4NjdFNkVCMTAsIDB4NjJFNjdDRjAsIDB4NjRFNjY2NzMsCisweDI1NkI0NjE4LCAweDJENTI2MUUyLCAweDY1MjM0NzI5LCAweDQ1MTg0NzE5LAorMHg0MjI5Mjc1QiwgMHg0MjE5MUQ3MSwgMHg0NzE4Njc0MywgMHg0NDI5MjI3QiwKKzB4NDQxOTY3MTMsIDB4MjQ3QjQ3MTgsIDB4MUQ0MzFEMjIsIDB4NDExOTQxMjksCisweDY1MTM3RDEwLCAweDFGRTE3RTA0LCAweDg5REMzQ0IyLCAweDFGRTY3RUZGLAorMHgxRkMyMUY1NSwgMHhBMDY3MkZEMiwgMHg2Q0YyMUZENCwgMHg2NkMyNTdGNSwKKzB4NDYyODYyNzMsIDB4NDIyODQ2MjksIDB4MkM2MjI2MkIsIDB4N0MwNDVERjIsCisweDdERkU0NzI5LCAweEEwMUNFQjEwLCAweDY1RTY1RUYxLCAweDY2RTY2MjczLAorMHg0NzI4Njc1MywgMHg2NzYzMjI3QiwgMHg0NTI5NjFFNiwgMHgyNTdCNDcyOCwKKzB4MkMyMjY0RTYsIDB4NjUxMzFDNTEsIDB4NDUyODQ2MjksIDB4MUM2MjI2NUIsCisweDQxMjk2NjQzLCAweDIxNkI0NjI4LCAweDQ0MjkxQzEzLCAweDY3NDM3QzEwLAorMHgzREIyN0RGMCwgMHgxRkQyODlFMSwgMHg3RUZFQTAzNCwgMHg1MUY1NkNGMiwKKzB4NjIxMzY2QzIsIDB4NDIyODQ2MTgsIDB4NDIxODQ2MTksIDB4MkM2MjI2MkIsCisweDdDMDQ1REYyLCAweDdERkY0MTE5LCAweEEwMUZFQjEwLCAweDY1RTY1RUYxLAorMHg2NEU2N0RGMCwgMHg0MjI4NjI1MywgMHg0MjE4NjdFNiwgMHg2NkU2MjEyQiwKKzB4NjE0MzJDMTIsIDB4NDUxOTQxMjgsIDB4MjUxQjQxMTgsIDB4NjU3MzFDNTEsCisweDQ0MTk0NTI4LCAweDI0NUI0NTE4LCAweDY0NjMxQzQyLCAweDQ3MTk0NDI4LAorMHgyNzRCNDQxOCwgMHg0NjE5MUM3MywgMHg2MTYzN0MxMCwgMHg4OURFM0RCMiwKKzB4N0VGRDFGRDIsIDB4MUZDNDFGRTYsIDB4NURGMkU3MDQsIDB4QTAwRDVFRjYsCisweDYyRTQ1MUY0LCAweDY2RTQ3REZDLCAweDY1RTQ2NEU0LCAweDcxMDEyMTIwLAorMHg3MTAxMjE2MCwgMHg3MTAxMjE0MCwgMHg3MTAxMjE1MCwgMHg4OUYwM0Q3MiwKKzB4NjZEMzU3RjMsIDB4NjQxMzY1RTMsIDB4NkVGNjdGMUMsIDB4NkNGNjZERjYsCisweDZCRjZBMTkwLCAweDAwMjAyMTM0LCAweDJGQzYyRkI2LCAweDJGRTYyRkQ2LAorMHg2MDQzN0ZFNCwgMHg2QzYzQzkwMywgMHg2NjAzMUY2MiwgMHg0NjA4NzVGQywKKzB4NjE1MjZFNDMsIDB4NDYwMEUyRkMsIDB4MjY2ODJFMjksIDB4MUY0NDFGNzMsCisweDFGNTE2RDUzLCAweDhEMEIxRjE1LCAweDYwNjMyRkUyLCAweDg5MUY4ODA4LAorMHg4OTUzODgxMCwgMHg4QjAxODgxOCwgMHgwMDA5QTA4MSwgMHgwMDA5QTBCOSwKKzB4RUIxMEEwMEQsIDB4NTJEMzdERjAsIDB4NTREMTU2RDIsIDB4MkUxNjY1RDIsCisweDJFNjYyRTI2LCAweDJFNDI3RUZDLCAweDFGRDE2MTUzLCAweDNDQjI3Q0YwLAorMHg3RDA0ODlGMCwgMHgxRjE1MUZENiwgMHgyRkUyMUZDMiwgMHgxRkU0QTBBMSwKKzB4NjIxMzY2RTIsIDB4NDIyOTQ2MTksIDB4NDIxOTQ2MTgsIDB4MkU2MjI2MkIsCisweDdDRkY0MTE4LCAweEVCMTBBMDIxLCAweDU0RDM3REYwLCAweDYyNDM1N0QyLAorMHg0MjE5NDIyOSwgMHg1NUQxMjEyQiwgMHgyRTE2NjZEMiwgMHg0MTI5NjE3MywKKzB4NDExOTQ0MTgsIDB4MkU0NjI0MUIsIDB4NDQyOTY0NTMsIDB4NDQxOTQ3MTgsCisweDJFNzYyNzRCLCAweDQ3Mjk2NzYzLCAweDQ3MTk0NTE4LCAweDI1N0I3RUZDLAorMHg0NjE4MkU1MiwgMHgxRkQxNjE2MywgMHgzQ0IyN0NGMCwgMHg3RDAzODlEQywKKzB4MUYxNTFGRDYsIDB4MkZFMjFGQzIsIDB4MUZFNEEwNkIsIDB4NTdGNTZFRjIsCisweDYyNzM2NkUyLCAweDQ2Mjg0NjI5LCAweDI2MkI0MjI5LCAweDJFNjI1Q0YyLAorMHg3Q0ZFNDcyOCwgMHhBMDFCRUIxMCwgMHg3REYwNURGMSwgMHg1NUQyNTFEMywKKzB4NDYyOTY2MTMsIDB4NTREMTI3NkIsIDB4MkU3NjYyRDIsIDB4NDEyODY3NTMsCisweDIxN0I0NzI5LCAweDYxNDMyRTE2LCAweDQxMjk0NTI4LCAweDJFNTYyNTFCLAorMHg0NDI4NjUyMywgMHgyNDVCNDUyOSwgMHg0MjI4MkU0NiwgMHg3Q0YwNjcyMywKKzB4ODlFMjNDQjIsIDB4MUZENjdEMDIsIDB4QTAzQTFGQzIsIDB4NjdGMjFGRTQsCisweDY1NzI1MUY1LCAweDQ1Mjk2MjEzLCAweDQ1Mjg0NTE5LCAweDQyMTk0NTE4LAorMHg1Q0YyMjUyQiwgMHg0MTI4Mjc1MiwgMHg3Q0ZENDExOCwgMHhBMDIyRUIxMCwKKzB4N0RGMDVERjEsIDB4NTREMjU2RDMsIDB4NDUxOTY1NjMsIDB4NTJEMTQ2MjgsCisweDQ2MTgyMTVCLCAweDZFRDI2NTQzLCAweDQ1MTkyNzE2LCAweDI2NUI0NDI4LAorMHg2NTQzNjE2MywgMHg0NTE4NjQyMywgMHg0MjI4NDQxOSwgMHg0MjE4MjU0QiwKKzB4MjcxNjY0RTMsIDB4NDQxOTY2MjMsIDB4MjY0QjI3NTYsIDB4NEUyODI3NjYsCisweDYxRTM0RTE4LCAweDNDQjI3Q0YwLCAweDdEMDE4OURCLCAweDFGQzIxRkQ2LAorMHhFNzA0MUY3NCwgMHg1MUY0NURGMiwgMHg1RUY2QTAwRCwgMHg4NEUyN0VGQywKKzB4NjIwMzY0RTAsIDB4N0RGQzg0RTEsIDB4ODRFMzY1MDMsIDB4MjE2NDY2MDMsCisweDIxNTQyMTI0LCAweDNENzIyMTQ0LCAweDU3RjM4OUYwLCAweDY0MTM2NkQzLAorMHg3RjFDNjVFMywgMHg2REY2NkVGNiwgMHhBMDlENkNGNiwgMHgyRjg2NkJGNiwKKzB4MkZBNjJGOTYsIDB4MkZDNjJGQjYsIDB4MkZFNjJGRDYsIDB4NjE0Mzc0RTAsCisweDZBNjM2ODczLCAweDZCNTZFOTIwLCAweDZDNTY3QUUwLCAweDZENTY3MTIwLAorMHg2RTU2M0E5MiwgMHg2NDU2Njc1NiwgMHg2MjU2NjY1NiwgMHgxMUMxMjFCMiwKKzB4MTFFMzExRDIsIDB4MTE0NTExNzQsIDB4OERFQzExNjYsIDB4NzEyMDExMjcsCisweDY2MTNBMDA0LCAweDdBRkY2MjU0LCAweDc2MDEyNjIwLCAweDhCRjkyQUE4LAorMHg2RUY2NjA4MywgMHg2Q0Y2NkRGNiwgMHg2QUY2NkJGNiwgMHgwMDBCNjlGNiwKKzB4MkY4NjY4RjYsIDB4MkZBNjJGOTYsIDB4MkZDNjJGQjYsIDB4MkZFNjJGRDYsCisweDZBNjM2ODczLCAweDc1RTBFOTIwLCAweDU2NTY1MjU3LCAweDU3NTQ1MTU1LAorMHg1RDUyNUU1MywgMHg2QjUyNUM1MSwgMHgyNDY2MjQyNiwgMHgyNDc2MjQxNiwKKzB4N0FFMDI0RTYsIDB4MjRDNjI0RDYsIDB4OERFQzNBOTIsIDB4NjZBMzI0QjYsCisweDZFRjY2NzgzLCAweDZDRjY2REY2LCAweDZBRjY2QkY2LCAweEEwNDM2OUY2LAorMHgyRkU2NjhGNiwgMHhDODA0NjA2MywgMHg4RDA0NkU2MywgMHg2MjE2NjE1MywKKzB4MjQyMjdFRkMsIDB4NjBFMzc0MDQsIDB4ODkwOEM4MTgsIDB4NzEwNDY1MTMsCisweDYyNTI2NjE2LCAweDI0MjI3RUY4LCAweEFGRjQxNDYxLCAweEUyMDQ3NDA4LAorMHg2NTEzM0UyMiwgMHg2NkUzOEQwMiwgMHg2RUY2QTAxQywgMHg2RUY2QUY4NywKKzB4QzgwNDYwNjMsIDB4NjE2MzhEMDQsIDB4NjI1Mjc1RkMsIDB4MjQyNjcxRkMsCisweEM4MTg2MDEzLCAweDc1Rjg4OTA2LCAweDY2NTI1MjUxLCAweDI0NjYyNDI2LAorMHg3MUY4QUZGNiwgMHgzMTIyRTIwNCwgMHg2NjEzOEYwMiwgMHgwMDA5QUZBMSwKKzB4MDAwOUEwMEEsIDB4MDAwOUEwMDQsIDB4NzZGRjYyNTQsIDB4NzQwMTI0MjAsCisweDhCRjkyNjY4LCAweDYwNzMwMDBCLCAweDAwMDlBMDA0LCAweDYyNTA3NUZGLAorMHgyNDI0NzZGRiwgMHg4QkY5MjY2OCwgMHg2MDczMDAwQiwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHg1NDRGMEQwQSwKKzB4NDYyMDUzNTUsIDB4MDAwMDNBNTcsIDB4MjA3MjYxNEQsIDB4MzIyMDMyMzIsCisweDIwMzczMDMwLCAweDM1M0EzNDMxLCAweDMzMzUzQTM0LCAweDAwMDAwMDAwLAorMHgwMDAwMEQwQSwgMHgwMDAwMDA0MywgMHg2MTc2NkU0OSwgMHgyMDY0Njk2QywKKzB4NzI2NTczNzUsIDB4MjA3MjZGMjAsIDB4MjA3OTY1NkIsIDB4MDAyMTQ0NDksCisweDZFNkI2RTU1LCAweDIwNkU3NzZGLCAweDZENkQ2RjYzLCAweDNENjQ2RTYxLAorMHgwMDAwMDAwMCwgMHg2MTQzNzc0OCwgMHg3MjYyNjk2QywgMHg2RjY5NzQ2MSwKKzB4NjYyMDIwNkUsIDB4MEE2QzY5NjEsIDB4MDAwMDAwMEQsIDB4NzM2OTZGNEUsCisweDYxNDMyMDY1LCAweDcyNjI2OTZDLCAweDZGNjk3NDYxLCAweDYxNjYyMDZFLAorMHgyMTIxNkM2OSwgMHgwMDAwMEQwQSwgMHgwMDAwMEQwQSwgMHgwMDAwMDA0MiwKKzB4MDAwMDAwRkYsIDB4MDAwMjAwMDEsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDEwRTAxMEQsIDB4MDAwMjAwMDMsIDB4MDEwOTAxMDgsIDB4MDAwMjAxMEEsCisweDAwMDMwMDAyLCAweDAyMDIwMjAxLCAweDAyMDQwMjAzLCAweDAyMDYwMjA1LAorMHgwMjA4MDIwNywgMHgwMjBBMDIwOSwgMHgwMjBDMDIwQiwgMHgwMjBFMDIwRCwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMTBFMDEwRCwgMHgwMEZGMDEwRiwgMHgwMTA5MDEwOCwgMHgwMTBCMDEwQSwKKzB4MDAwMzAwMDIsIDB4MDIwMjAyMDEsIDB4MDIwNDAyMDMsIDB4MDIwNjAyMDUsCisweDAyMDgwMjA3LCAweDAyMEEwMjA5LCAweDAyMEMwMjBCLCAweDAyMEUwMjBELAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwMDAwMDcyLCAweDAwMjA1MjIwLCAweDAwMDAwMDQ2LCAweDAwMDAwMDU5LAorMHg3MzIwNDE0MiwgMHgwMDNENzE2NSwgMHgwMDAwMDA3NCwgMHgwMDAwMDAwMCwKKzB4MDIwMDAxMTIsIDB4NDBGRkZGRkYsIDB4MTIyMTBBQ0UsIDB4MjAxMDQ4OTAsCisweDAyMDkwMTAwLCAweDAxMDEwMDJFLCAweDA5RkE4MDAwLCAweDA0MDAwMDA0LAorMHgwMDAwMDBGRiwgMHgwMjAxMDUwNywgMHgwNzAwMDIwMCwgMHgwMDAyODIwNSwKKzB4MDUwNzAwMDIsIDB4MDA0MDAzODMsIDB4MDQwNTA3MDEsIDB4MDEwMDQwMDMsCisweDAwMkUwMjA5LCAweDgwMDAwMTAxLCAweDAwMDQwOUZBLCAweDAwRkYwNDAwLAorMHgwNTA3MDAwMCwgMHgwMDQwMDIwMSwgMHg4MjA1MDcwMCwgMHgwMDAwNDAwMiwKKzB4MDM4MzA1MDcsIDB4MDcwMTAwNDAsIDB4NDAwMzA0MDUsIDB4MDMwNDAxMDAsCisweDAzMEMwNDA5LCAweDAwNzkwMDVBLCAweDAwNDEwMDQ0LCAweDAzMTgwMDUzLAorMHgwMDUzMDA1NSwgMHgwMDMyMDA0MiwgMHgwMDMwMDAyRSwgMHgwMDU3MDAyMCwKKzB4MDA0MTAwNEMsIDB4MDAwMDAwNEUsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwNzA5LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCit9OworCitjb25zdCB1MzJfdCB6Y0Z3SW1hZ2VTaXplPTExMTA0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvaGFsL2hwZnd1X3R4c3RyZWFtLmMgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy9oYWwvaHBmd3VfdHhzdHJlYW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjc3Y2JhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvaGFsL2hwZnd1X3R4c3RyZWFtLmMKQEAgLTAsMCArMSwxMDE3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggQXRoZXJvcyBDb21tdW5pY2F0aW9ucyBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKyNpbmNsdWRlICJjcHJlY29tcC5oIgorCitjb25zdCB1MzJfdCB6Y0Z3SW1hZ2VbXSA9IHsKKzB4MDAwOTAwMEIsIDB4NEYyMjJGRTYsIDB4REU5NDdGRkMsIDB4RTExNEQ1OTQsCisweDFFMTNENDk0LCAweDY3NTIxRTRDLCAweEQ0OTRENjkzLCAweDM3NDAyNzY5LAorMHg2MjUyOEYwNiwgMHg3MjAxRDY5MiwgMHg2MDYwMjUyMiwgMHgyNjAwQzkzRiwKKzB4RDc5MDYxNTIsIDB4MjUxMjYxMUQsIDB4MjY0QjY2NTIsIDB4MjU2MjQ3MEIsCisweDAwMDlCMDE3LCAweEU2MDA5NUFDLCAweEM4NDA2MEUyLCAweDJGMDI4RjAzLAorMHg4RkY5MzY1MiwgMHhENDg4NzYwMSwgMHg0RTBCREU4OCwgMHhENDg4MDAwOSwKKzB4MDAwOTRFMEIsIDB4NEUwQkQ0ODcsIDB4N0YwNDAwMDksIDB4QTA1MjRGMjYsCisweDRGMjI2RUY2LCAweDQxMEJEMTg0LCAweEQ0ODQwMDA5LCAweDAwMDk0NDBCLAorMHg0NTBCRDU4MywgMHhENzgzMDAwOSwgMHhEMjgzRTFGRiwgMHgyNzEyNjExRCwKKzB4RDQ4MjUwMjksIDB4RTFGRkNCMDEsIDB4MTIwOUU1MDEsIDB4MTIxMTIyMTIsCisweEU3MjAyNDUyLCAweDQ3MThENTdFLCAweDI1NzJEMjdFLCAweEQxN0VFNzAwLAorMHhENjdGRDQ3RSwgMHhFMjAxMjI3MCwgMHgyNDcwMjE3MiwgMHhENjdEMjYyMCwKKzB4MjY0MUU0RkYsIDB4RDU3Q0U2MDAsIDB4NjY2REUxMDQsIDB4NzYwMTYwNjMsCisweDQwMDA2MjZELCAweDhGRjgzMjEyLCAweEQ1NzgwNTQ1LCAweDI1MjBFMjAxLAorMHhEMjc4RDc3NywgMHhFNDgwRTEwMCwgMHgyMjEyMjcxMCwgMHg2NjEzRDU3NiwKKzB4NjY2RDY0NEMsIDB4NzYwNDY3NjMsIDB4Mzc1QzYyNkQsIDB4OEZGODMyNDMsCisweEQ1NzIyNzEyLCAweEQyNzNENzcyLCAweEU0MDBFMTAxLCAweDI3MTAyNTExLAorMHgwMDBCNEYyNiwgMHg3RkNDMjI0MiwgMHhEMTcwRDU2RiwgMHhEMjcxREI3MCwKKzB4MUY1MUQ0NzEsIDB4RDY3MTc1MDgsIDB4MUYxMkQ3NzEsIDB4MUY1NTcxMEMsCisweDFGQjk3NUZDLCAweDcyMDQxRjJBLCAweDFGMTNFQjEwLCAweDFGNTYxRjQ0LAorMHgxRjc4MUY2NywgMHhEODZCMUYyQiwgMHhERDZDRDk2QiwgMHhEQzZDRUEwMCwKKzB4RDI2RERFNkMsIDB4ODkwMDNBMjIsIDB4RDE1RDdBMDEsIDB4ODgwMTYwMTAsCisweDU2Rjg4QjAzLCAweDQyMThFMjAxLCAweEQxNjgyNjIyLCAweDAwMDk0MTBCLAorMHg0NDBCRDQ2NywgMHhENTY3MDAwOSwgMHgwMDA5NDUwQiwgMHg2MDEwRDE1MCwKKzB4OEIxMDg4MDEsIDB4RTY1MEQxNEYsIDB4NDYxODYyMTIsIDB4OEIwODMyNjYsCisweDU2RjlEMTRCLCAweDIxMjBFMjAwLCAweENCMDE2MDYyLCAweDI2MDJBMDAzLAorMHg3MjAxMjcxMCwgMHg2MDgyMjEyMiwgMHg4OTA5ODgwMSwgMHhFMkM4RDE1QSwKKzB4NjIyQzY2MTIsIDB4ODkwMzM2MjYsIDB4NjAxMEQxNTgsIDB4OEJDODg4MDEsCisweDUxRjY2NzkyLCAweDIxNzI1MkY1LCAweEQ2NTU1MTkxLCAweDU1RkEyMjEyLAorMHg1MkZCNjQ2MiwgMHg1NTYxMjU0MiwgMHgyMjUyRTQwMCwgMHg2MTQzNjY0MywKKzB4MDVERTYwMTMsIDB4MzZDQzQ2MDgsIDB4MDdERTI2NTIsIDB4QzkwMzYwNzEsCisweDhCMDI4ODAxLCAweDcyMDE2MkUyLCAweDc0MDEyRTIyLCAweDM2QjM2NjRDLAorMHg3MTA0OEZFRSwgMHg2NkMyRDE0NywgMHg0NTI4NjUxMiwgMHgyNjVCNDUxOCwKKzB4NjA4MjJDNjIsIDB4ODkwMTg4MDEsIDB4MDAwOUExNjgsIDB4NjI3MkQ3NDIsCisweDhCMTMyMjI4LCAweEQ0MkJENzQxLCAweDY3NzJENTQxLCAweDUxNTM2MjQyLAorMHgzMTJDMzI3QywgMHgyNDIyMjIyOCwgMHgxNTEzOEQwNSwgMHg2MjYyRDYzRCwKKzB4QjE2MjcyMDEsIDB4RDYyMzI2MjIsIDB4MjYyMkUyMDAsIDB4NTI5MTY2OTIsCisweDhCMDEzNjIwLCAweDAwMDlBMTQ0LCAweDYwNjFBMDZFLCAweDAwMUMwMDFDLAorMHgwMDFENDAyMCwgMHgwMDAwQjM4RSwgMHhGRkZGMDAwMCwgMHgxMjM0MDAwMCwKKzB4MDAxRTEwMTUsIDB4MDAyMDEyNzQsIDB4MDAyMDM5RjQsIDB4MDAyMDE4QTIsCisweDAwMjAzQTAwLCAweDAwMjAzQTE4LCAweDAwMjAxODYwLCAweDAwMjAxOTZDLAorMHgwMDIwMTI4OCwgMHgwMDFDMzUxMCwgMHgwMDFDMzYyNCwgMHgwMDFFMjEyQywKKzB4MDAyMDM4RjQsIDB4MDAyMDM0OEMsIDB4MDAyMDM4RkMsIDB4MDAyMDM5MDgsCisweDAwMjAzOTE0LCAweDAwMjAzOTcwLCAweDAwMjAzOTc0LCAweDAwMjAzOTFDLAorMHgwMDIwMzkxRCwgMHgwMDIwMzkyMCwgMHgwMDExNzcwMCwgMHgwMDIwMzk4QywKKzB4MDAyMDM5OEEsIDB4MDAyMDM0RjAsIDB4MDAxMTc3MTAsIDB4MDAxQzNEMzAsCisweDAwMUMzNkY4LCAweDAwMTE3NzM0LCAweDAwMUMzNjg0LCAweDAwMUMzRDAwLAorMHgwMDFDMTAwMCwgMHgwMDFDMTAyOCwgMHgwMDIwMzUwNCwgMHgwMDIwMzkyNCwKKzB4MDAxMTc2MDAsIDB4MDAxMTc3NDAsIDB4N0ZGRkZGRkYsIDB4MDAyMDE3MzAsCisweDAwMjAzMzJBLCAweDAwMjAyMzM0LCAweDAwMjAzREE0LCAweDAwMjAzOTcyLAorMHgwMDIwMzRGQywgMHgwMDIwMzk2NCwgMHgwMDFDM0QyQywgMHgwMDFDMzZCMCwKKzB4MDAyMDM0OTQsIDB4MDAxMTc3NUMsIDB4ODgwMUM5MEYsIDB4QTBDRjg5MDEsCisweEQxOTYwMDA5LCAweDM2MjA2MjEyLCAweEQ0OTU4OTA0LCAweDI0MjFFMjAwLAorMHgyMTYyQTBDQywgMHg2MjExRDE5MywgMHg4OTAxMjIyOCwgMHgwMDA5QTBDMywKKzB4RTIwMkQ3OEYsIDB4NzUwMTY1NzEsIDB4MzEyMzYxNUQsIDB4Mjc1MThEMDIsCisweDAwMDlBMEJDLCAweEQyOEM1N0YyLCAweDYyMjI2MDcyLCAweDQwMDk0MDE5LAorMHhDOTBGNDAwOSwgMHg4RjE5ODgwQSwgMHg1MkYzMUYyQywgMHg0MDE5NjAyMiwKKzB4NDAwOTQwMDksIDB4ODgwOEM5MEYsIDB4QTBBNzg5MDEsIDB4NjA2MzAwMDksCisweENCMDE1NEY3LCAweEQyN0U1NUYyLCAweEU3MDEyNDAyLCAweEQ0N0ZFMTAwLAorMHgyMjExMjU3MiwgMHg3MjAxNjI0MiwgMHgyNDIyQTA5OCwgMHg4QjNGODgwNSwKKzB4NjAyMjUyRjMsIDB4NDAwOTQwMTksIDB4QzkwRjQwMDksIDB4OEIxNjg4MDIsCisweEU0RkZENTc3LCAweDY0NEQ2NzUyLCAweDhCMTAyNzQ4LCAweDYyNzJENzc1LAorMHg4QjBDMzI2MCwgMHg1MUYyNTVGNywgMHhEMjZERTcwMSwgMHgyMTcyMjU2MiwKKzB4RDU3MUUxMDAsIDB4NjQ1MjIyMTEsIDB4QTA3Nzc0MDEsIDB4NTJGMzI1NDIsCisweDQwMTk2MDIyLCAweDQwMDk0MDA5LCAweDg4MDVDOTBGLCAweDMxQjM4QjZFLAorMHhEMjZBOEI2QywgMHg2NzIyNTRGNCwgMHg3NzAxRDU2OSwgMHg2MTQyMjI3MiwKKzB4MUYxQ0U2NDAsIDB4NDYxODIxNTksIDB4OEIwMzMxNjAsIDB4NjI2MkQ2NjUsCisweDI2MjI3MjAxLCAweEUyMDBENjVBLCAweDI2MjFCMDY3LCAweDAwMDlBMDU2LAorMHgzMTIzRTIyMCwgMHg4ODAzOEI1MiwgMHg1MkYzOEIxRSwgMHg0MDE5NjAyMiwKKzB4NDAwOTQwMDksIDB4ODgwM0M5MEYsIDB4RDI1QjhCMTYsIDB4NjcyMjU0RjQsCisweDc3MDFENTU3LCAweDYxNDIyMjcyLCAweDFGMUNFNjQwLCAweDQ2MTgyMTU5LAorMHg4QjAzMzE2MCwgMHg2MjYyRDY1NSwgMHgyNjIyNzIwMSwgMHhFMjAwRDY0OCwKKzB4MjYyMUIwNDMsIDB4MDAwOUEwMTAsIDB4RDQ1MkQ1NTEsIDB4RDI0NDY3NTIsCisweEUxMDA3NzAxLCAweDI1NzIzQTQ2LCAweDIyMTE4RjA2LCAweEVBMDBENjRFLAorMHg3MjAxNjI2MiwgMHgyNjIyQjAzMSwgMHgyRkIyRDU0QywgMHg5NTczNjY1MiwKKzB4RDQ0QTVCRjEsIDB4MzYyMDUyNDEsIDB4NjA2MTg5MTAsIDB4OEIwMUM4MDMsCisweDJCMjJFMjAxLCAweDhGRjU0NTEwLCAweDU3RjE1NjY0LCAweDYyNzJFMUYwLAorMHg0MTI4NDExOCwgMHgyNzIyMjIxQiwgMHg2QkYyQTAwOCwgMHg2QkYyQTAwNiwKKzB4RTIwMEQ2MkYsIDB4RDEyRjI2MjEsIDB4MjEyMUUyMDAsIDB4RDEzQ0UyMDEsCisweDY2MTIyODIyLCAweDhCMDEyNjY4LCAweDAwMDlBRTJCLCAweDQ1MEJENTM5LAorMHhEMTM5MDAwOSwgMHhBRTI0RTYwMCwgMHgyRjg2MjE2MCwgMHgyRkE2MkY5NiwKKzB4MkZDNjJGQjYsIDB4MkZFNjJGRDYsIDB4N0ZGNDRGMjIsIDB4REUzNEQxMzMsCisweDU0MTE2MjEyLCAweDFGNDE2N0UyLCAweDJGMjJENDMyLCAweEQ1MzIxRjcyLAorMHhEMjMyNjc0MywgMHg1ODQxNzc5NCwgMHg2OTQyNUE0MiwgMHg1QjE2NkM3MiwKKzB4NjA1MjZEMjIsIDB4Q0IyMEU2MDAsIDB4RTU0MDI1MDIsIDB4NjI2RDc2MDEsCisweDhCRkIzMjUzLCAweDU1RjE2MkYyLCAweDExNTEyMTIyLCAweEQ2Mjg1NUYyLAorMHgxNDgxMkU1MiwgMHgyNDkyMTRBMiwgMHgyN0MyRDQyNiwgMHgyNkQyMTFCNiwKKzB4REEyNTY3NDIsIDB4RTgwMUQ5MjUsIDB4NDkwQjJBNzIsIDB4RTIwMTFBOEMsCisweDFBMkM0MjE4LCAweDRGMjY3RjBDLCAweDZERjY2RUY2LCAweDZCRjY2Q0Y2LAorMHg2OUY2NkFGNiwgMHg2OEY2MDAwQiwgMHgwMDAwMDdEMSwgMHgwMDIwMzk4NCwKKzB4MDAyMDM5ODgsIDB4MDAyMDM5OEUsIDB4MDAxQzNEQzAsIDB4MDAxMTc3MkMsCisweDAwMUMzQjg4LCAweDAwMjAzOTZDLCAweDAwMTE3NzNDLCAweDAwMTE3NzQ0LAorMHgwMDAwRjAwMCwgMHgwMDExNzc2NCwgMHgwMDExNzc0OCwgMHgwMDExNzc2OCwKKzB4MDAxMTc3NkMsIDB4MDFGRkZGRkYsIDB4MDAxMTc3NEMsIDB4MDAyMDM0RkMsCisweDAwMjAzREE0LCAweDAwMjAyNEY4LCAweDAwMjAzOTcyLCAweDAwMUMzQjlDLAorMHgwMDFDM0Q5OCwgMHgwMDFDMzcwMCwgMHgwMDFDMzUwMCwgMHgwMDFDNTk2MCwKKzB4MDAxQzg5NjAsIDB4MDAyMDM1MDQsIDB4MDAxQzNEMDAsIDB4MDAyMDE2MEMsCisweDJGOTYyRjg2LCAweDJGQjYyRkE2LCAweDJGRDYyRkM2LCAweDRGMjIyRkU2LAorMHhERTk1N0ZBQywgMHg2MUUwRTAxNCwgMHgwRjE0RDQ5NCwgMHg3MTAxNjFFMywKKzB4RTAxODYyMTAsIDB4RDI5MjBGMjQsIDB4MDAwOTQyMEIsIDB4NDUwQkQ1OTEsCisweDIwMDgwMDA5LCAweDhGMTI2RDAzLCAweEQyOEYxRjA3LCAweDY3MjBENDhGLAorMHg2NTdDREQ4RiwgMHg0NzBCRDc4RiwgMHhEMThGMDAwOSwgMHg2MTlDNjkxMCwKKzB4NDYwODY2MTMsIDB4MzYxODQ2MDgsIDB4M0Q2QzQ2MDgsIDB4RTAxODFGRDcsCisweEU1ODAwNEZDLCAweDYwNEM2NkUyLCAweDMwNTA2NTVDLCAweDJENjI4RjE1LAorMHgwMUZDRTAxNCwgMHhERTg1RTUwMCwgMHg2NDFDQTAwOCwgMHg2NzUzNjU1RCwKKzB4NjA3MDM3RUMsIDB4MzlEQzY5NTMsIDB4ODA5NDc1MDEsIDB4MzI0MzYyNUQsCisweEQ2N0Y4QkY0LCAweEEzNEVFMjAwLCAweDIwMDgyNjIxLCAweEUwMTQ4QjEzLAorMHhFNDAwMDFGQywgMHhBMDA5REU3OSwgMHg2NDRENjcxQywgMHgzNUVDNjU0MywKKzB4Njk0MzY2NTIsIDB4MzlEQzYyNjIsIDB4NzQwNDE5MjEsIDB4MzI3MzYyNEQsCisweEEzMzg4QkYzLCAweDg4MDEyRDEwLCAweEUwMTQ4QjE3LCAweEU3MDAwMUZDLAorMHg2RDFDMkQ3MCwgMHhERTZEMUZENCwgMHgzMkQzNjI3RCwgMHhBMzJBOEIwMSwKKzB4Njc3RDAwMDksIDB4NjY3MzY1RTMsIDB4NjE3Mzc1MDQsIDB4MzE1QzM2RUMsCisweDY5MTI2NDYyLCAweEFGRUY3NzA4LCAweDg4MDQyNDkyLCAweEUwMTQ4QjE4LAorMHhFNDAwMDFGQywgMHg2NzFDMkQ0MCwgMHg2MjREREU2MCwgMHg4QjAxMzI3MywKKzB4MDAwOUEzMTEsIDB4Njk0MzY0NEQsIDB4MzlFQzYyRTMsIDB4NzIwNDY1OTIsCisweDNEMkM2RDQzLCAweDYxNTI2NkQyLCAweDIxNjk3NDA4LCAweDI1MTJBRkVELAorMHg4QjE4ODgwNSwgMHgwMUZDRTAxNCwgMHgyRDQwRTQwMCwgMHhERTUzNjcxQywKKzB4MzI3MzYyNEQsIDB4QTJGNjhCMDEsIDB4NjQ0RDAwMDksIDB4NjJFMzY5NDMsCisweDY1OTIzOUVDLCAweDZENDM3MjA0LCAweDY2RDIzRDJDLCAweDc0MDg2MTUyLAorMHhBRkVEMjE2QiwgMHg4ODMxMjUxMiwgMHhENDRBOEIzQSwgMHg2MTQ2RDk0QSwKKzB4NzUwNDY1NDMsIDB4Njc1NjY0NDIsIDB4NkU1MzFGNDgsIDB4NjU1MjdFMDQsCisweDdFRTQ2MkUyLCAweDdFMDQ2NEUyLCAweDZFRTIxRkU5LCAweDVFRjkyOUUwLAorMHg3RTA0RDk0MiwgMHgxRkVBNjBFMiwgMHgyOTAwQzkwMSwgMHhEOTQwNkVFMiwKKzB4MjlFMDRFMDksIDB4MkY1NjJGMjYsIDB4NTZGQUQ5M0UsIDB4NjUxMzQ5MEIsCisweEQxM0Q3RjA4LCAweEU3MUM2RTBELCAweDFERTEyRDcwLCAweERFM0I2OTEyLAorMHg2NEUyMUQ5MiwgMHgxRDQzRDEzQSwgMHhEMjNBNjUxMiwgMHg2NzIyMUQ1NCwKKzB4MUQ3NUQyMzksIDB4MUQ2NjY2MjIsIDB4NjI2MkQ2MzgsIDB4MUQyN0EyQUIsCisweDhCMzk4ODMwLCAweDY1OTZEOTJCLCAweDY3OTI2Njk2LCAweDYxOTY3OTA0LAorMHg3NEU0NjQ5MywgMHg2RTQzNjk5MiwgMHgxRjlCN0UwNCwgMHgxRkVDNjQ0MiwKKzB4RDkyNTZFRTIsIDB4NUVGQzI5RTAsIDB4N0UwNEQ5MjQsIDB4MUZFRDYwRTIsCisweDI5MDBDOTAxLCAweEQ5MjI2RUUyLCAweDI5RTA0RTA5LCAweDU5RkM3RkZDLAorMHhERTI3MkY5MiwgMHgyRjE2NEUwQiwgMHhENDFGN0YwOCwgMHhFMjFDNjEwRCwKKzB4MUQxMTJEMjAsIDB4RDIyMDY0NDIsIDB4RDQxQzFENDIsIDB4MUQ1MzY1NDIsCisweDY3NTJENTFCLCAweEQ3MUIxRDc0LCAweDFEMTU2MTcyLCAweDFENjY2NjIyLAorMHg2MjYyRDYxQSwgMHgxRDI3QTI2RiwgMHg4QjM1ODgzMywgMHg0OTBCRDkxOSwKKzB4QTI2OEVFMDAsIDB4MDAwMDJERTAsIDB4MDAxMTc4MDAsIDB4MDAyMDNBMUMsCisweDAwMjAxOEEyLCAweDAwMjAyQUFDLCAweDAwMjAzOTBFLCAweDAwMjAzQTIwLAorMHgwMDIwMzUzNCwgMHgwMDIwMThFRSwgMHgwMDIwMzkwRCwgMHgwMDExNzgwNCwKKzB4MDAyMDM5OEMsIDB4MDAxMTc4MTAsIDB4MDAyMDM5MDksIDB4MDAyMDM5MEEsCisweDAwMjAzOTBCLCAweDAwMjAwRjY0LCAweDAwMUM1ODY0LCAweDAwMUM2ODY0LAorMHgwMDFDNzg2NCwgMHgwMDFDNTlCQywgMHgwMDFDNjlCQywgMHgwMDFDNzlCQywKKzB4MDAyMDBGQkMsIDB4MDAyMDBGQjgsIDB4ODkwMTg4MjgsIDB4MDAwOUEwQzAsCisweEU2NDNERUI1LCAweDMyNjY2MkUxLCAweDFGRUU4RjAyLCAweDJFMjFFMjQwLAorMHg2MjJENjJFMSwgMHg4QjAxMzI2NywgMHgwMDA5QTBBQSwgMHhFNTAxODVFMSwKKzB4OEIwMTMwNTYsIDB4MDAwOUEwQTQsIDB4MkQxMEUxMDEsIDB4NjRFMUIyMjUsCisweEU2NDM1N0ZFLCAweDY1MkQ2MjcxLCAweDg5NDQzNTY3LCAweDM1NjNFNjQwLAorMHhFNjAwOEIwNSwgMHgwRjY1RTA0MCwgMHhBMDBGRTExQSwgMHg2MTUzNzJDMCwKKzB4NDEyMTQxMjEsIDB4NDEyMTQxMjEsIDB4NDUyMTQxMjEsIDB4NDUyMTQ1MjEsCisweEM5MDM2MDUzLCAweEUwNDA2NjAzLCAweDcxMTgwRjY1LCAweDIyMDlFMDA3LAorMHgwRjI1RTAzQywgMHhFMDQ0NjQxRCwgMHhCMkEzNjVGMywgMHhFMzNDMEY0NiwKKzB4ODUzMjMzRkMsIDB4NjIwRERFOTUsIDB4NDIwODYwMzEsIDB4NjAyMzYxMEQsCisweDEzMjNFOTQ0LCAweDA2RkU0MTA4LCAweEUwMEYzOUZDLCAweDEzMTQ0RTBCLAorMHg2NzA3NUQ5MSwgMHg2MEQzMjY3OSwgMHgwRjY2NTRGRSwgMHg1MTkyODU0MiwKKzB4NjAwRDRFMEIsIDB4NjBEMzI2MEIsIDB4MEY2NjY0OTIsIDB4NjVGM0IyMzcsCisweDY5NjE1NkZFLCAweEU2NDA2NTlELCAweDg5MzgzNTYzLCAweEQ3ODM1OUZFLAorMHg3OTA2NjU5MSwgMHhDOTAzNjA1MywgMHg0MDAwNDAwOCwgMHg2MTAzNjIwMywKKzB4MEYyNkUwNTAsIDB4NDcwQkUwRkYsIDB4NkMwNzYwMEMsIDB4NjYwMzYwNUQsCisweDQ2MjE0NjIxLCAweDQ2MjE0NjIxLCAweDQyMDA2MjYzLCAweDQyMDAzMjZDLAorMHg0MDIxNDAyMSwgMHg0MDA4QzkwMywgMHg2RDJEMzBGQywgMHhFODAwNkEwMywKKzB4QjI1NzY1RjMsIDB4NkVBMjY0RDMsIDB4MkVDOUUwNTAsIDB4NjY5NDJBRTIsCisweEQ3NkUwMUZFLCAweDYwNkM0NzBCLCAweDJBRTIyRTBCLCAweDY0RDM2NUYzLAorMHg3ODAxQjFGRCwgMHhFRTA2NjI4RCwgMHg4RkU5MzJFMywgMHg1RUZFN0QwMSwKKzB4NjFFMUU0MDAsIDB4NDEwMDg1RTEsIDB4NjZFMzMxMEMsIDB4NzYwQzcxMUIsCisweEU3MDQ2NUYzLCAweDY4NjY3NDAxLCAweDNBNzM2QTRELCAweDhGRjkyNTgyLAorMHg2NUYzNzUwNCwgMHg2NDFEQjFFMywgMHg2NEUxQjFBNCwgMHgwMDA5QTE3QiwKKzB4RDQ1QjU2RjcsIDB4RUMwMUQyNUIsIDB4MjZDMDQyMEIsIDB4MDAwOUExNzMsCisweDA2RkNFMDE4LCAweDg4Mjk2MDZDLCAweDU4Rjc4QjA4LCAweEU0MDBEMjUyLAorMHg2NjIyMjg0MCwgMHg2NDZEQjE3MSwgMHgwMDA5QTE2NSwgMHg2NjZDRTY4MSwKKzB4ODkwMTMwNjAsIDB4MDAwOUEwQUMsIDB4RDU1MEQxNEYsIDB4NjIxMjZBNTYsCisweDIxMjIzMkFDLCAweDU0MTE2QzU2LCAweDM0Q0M2MjUzLCAweDY0NTIxMTQxLAorMHg3MjA4NTgxMiwgMHhENDRBMzg0QywgMHg2ODIyMTE4MiwgMHg1QTEzNkM0MiwKKzB4M0FDQzNDOEMsIDB4MTFBMzI0QzIsIDB4NkMyMjcyRUMsIDB4NzIxMDU4MTQsCisweDExODQzOENDLCAweDVBMTU2ODIyLCAweDExQTUzQThDLCAweDZBMjI3MjEwLAorMHhENjQwNTgxNiwgMHgxMTg2MzhBQywgMHg1MjE3NkM2MiwgMHgxMTI3MzJDQywKKzB4NUExODU4NjEsIDB4MTFBODNBOEMsIDB4NUMxOTVBNjIsIDB4MTFDOTNDQUMsCisweDUyMUE1QzYzLCAweDExMkEzMkNDLCAweDVBMUI1ODY0LCAweDExQUIzQThDLAorMHg1QzFDNUE2NSwgMHgxMUNDM0NBQywgMHg1MjFENUM2NiwgMHgxMTJEMzJDQywKKzB4NUExRTU4NjcsIDB4MTFBRTNBOEMsIDB4NTYxRjVBNjgsIDB4MzZBQ0U4NDAsCisweDExNkZEQTJELCAweDZDQTIzODFDLCAweDdBOTQ2NjgyLCAweDI4NjIzNkNDLAorMHg1QzgxNjJBMiwgMHgxOEMxM0MyQywgMHg2MkEyN0E0NCwgMHgzNjJDNTY4MiwKKzB4RDYyNjE4NjIsIDB4NUE4NTYyNjIsIDB4M0EyQzQyMjksIDB4NzYwNDE4QTUsCisweDU2ODY2MjYyLCAweDM2MkM0MjI5LCAweDU2RjcxODY2LCAweDI2MjBFMjM4LAorMHgxNkMxNUM4MSwgMHgxNjIyNjIxMiwgMHhFMjAwNUMxMSwgMHg1NTEyMTZDMywKKzB4NTUxNTE2NTQsIDB4NTUxMzE2NTUsIDB4NTUxNjE2NTYsIDB4NTU4MjE2NTcsCisweDY1ODIxNjU4LCAweDU1MTQxNjU5LCAweDU1ODQxNjVBLCAweDU1ODMxNjVCLAorMHg1NTg1MTY1QywgMHg1NTg2MTY1RCwgMHgxODIxMTY1RSwgMHgxMTIxMjEyMiwKKzB4MTEyNTExMjIsIDB4MTEyNjExMjMsIDB4MjgyMjE4MjIsIDB4MTgyNDExMjQsCisweDE4MjUxODIzLCAweDE4MjZBMEM3LCAweDAwMTE3ODA0LCAweDAwMjAzM0U4LAorMHgwMDIwM0E0MCwgMHgwMDIwMThBMiwgMHgwMDIwMzQ5NCwgMHgwMDFDMzZBMCwKKzB4MDAyMDM0RjAsIDB4MDAxQzNDQTAsIDB4MDAxQzM2RjQsIDB4MDAxQzNCODgsCisweDY2NkNFNjgyLCAweDhCMjAzMDYwLCAweEVBMjQ1NkY3LCAweDI2QTBEMTk0LAorMHgxNkMxNUMxNywgMHgxNjIyNTIxOCwgMHgxNjgzNTgxOSwgMHgxNkE0NUExQSwKKzB4MTZDNTVDMUIsIDB4MTYyNjUyMUMsIDB4RTIwMDU4MUQsIDB4NTUxRTE2ODcsCisweDU1MUYxNjU4LCAweDExMjcxNjU5LCAweDExMjkxMTI4LCAweDExMkIxMTJBLAorMHgxMTJEMTEyQywgMHhBMDhFMTEyRSwgMHhFNjgzMTEyRiwgMHgzMDYwNjY2QywKKzB4NTJGNzhCMEIsIDB4RUEwMEQ4ODMsIDB4NjU4MjIyQTAsIDB4NzgwNERDODIsCisweDYyODIyQzUyLCAweEEwN0VENjgxLCAweEU2OTAyNjIwLCAweDMwNjA2NjZDLAorMHhEQTdGOEIwNiwgMHgwMDA5NEEwQiwgMHhFMjAwNTZGNywgMHgyNjIwQTA3MywKKzB4NjY2Q0U2OTEsIDB4OEIxMDMwNjAsIDB4NjIyMkQyNzYsIDB4MjIyODYyMkMsCisweEQyNzg4OTA0LCAweDAwMDk0MjBCLCAweDAwMDlBMDAzLCAweDQyMEJEMjc2LAorMHg1NkY3MDAwOSwgMHhBMDVFRTIwMCwgMHhFNjkyMjYyMCwgMHgzMDYwNjY2QywKKzB4RTAxODg5NTEsIDB4RTZCMDBCRkMsIDB4NjY2QzYyQkMsIDB4OEIyQTMyNjAsCisweDAyRkNFMDE0LCAweDY4MkNFQTAwLCAweDYyQURFOTA0LCAweDg5NEEzMjgzLAorMHg2QUFEREQ2NCwgMHgzQ0RDNkNBMywgMHg3RDA0NkVDMiwgMHhEQjY4RDQ2NywKKzB4MzJEQzYyQTMsIDB4NEIwQkRDNjcsIDB4NEMwQjZEMjIsIDB4RDQ2NjY0RTMsCisweDAwMDk0QjBCLCAweDY0RDM0QzBCLCAweDRCMEJENDY0LCAweEU2MDAwMDA5LAorMHg2NjZENkJFMywgMHg3NjAxM0I2QywgMHgzMjkzNjI2RCwgMHg4RkY3MkJEMCwKKzB4QUZEQTREMTksIDB4RTZCNTdBMDgsIDB4MzI2MDY2NkMsIDB4RDQ1QzhCMTMsCisweDRCMEJEQjU3LCAweEQyNUIwMDA5LCAweDYwMjJEQjVCLCAweENCMjBFNkZGLAorMHgyMjAyNjY2RCwgMHhEQjU5MkI2MiwgMHhFMDE0RTIwMCwgMHg1NkY3MkIyMCwKKzB4QTAxMDAyRkMsIDB4RDQ1NjI2MjAsIDB4NjU0MkQyNTYsIDB4NDIwQkQ0NTYsCisweEEwMDgwMDA5LCAweERCNTIwMDA5LCAweDUyQjFFNjAwLCAweDYyMkNEQjUzLAorMHg1MkY3MkIyMSwgMHg3RjU0MjI2MCwgMHg2RUY2NEYyNiwgMHg2Q0Y2NkRGNiwKKzB4NkFGNjZCRjYsIDB4MDAwQjY5RjYsIDB4NEYyMjY4RjYsIDB4RTI0MDYxNEQsCisweDg5MTQzMTIzLCAweDMxMjdFMjFGLCAweDhCMDlENzQ5LCAweEQ0NDk2MTRELAorMHhFMDAxNzFFMCwgMHg1NjcxNDQwQiwgMHgyNjU5NjUwNywgMHgxNzYxQTAwNywKKzB4RTAwMUQ0NDQsIDB4NjY3MjQ0MEIsIDB4MjY1OTY1MDcsIDB4NEYyNjI3NjIsCisweDAwMDkwMDBCLCAweDYxNEQ0RjIyLCAweDMxMjNFMjQwLCAweEUyMUY4OTEyLAorMHhENzNCMzEyNywgMHg2MTREOEIwOCwgMHg1NjcxRDIzQSwgMHg0MjBCNzFFMCwKKzB4MjYwQkUwMDEsIDB4MTc2MUEwMDYsIDB4NjY3MkQyMzYsIDB4RTAwMTQyMEIsCisweDI3NjIyNjBCLCAweDAwMEI0RjI2LCAweEU2NDAwMDA5LCAweDQ2Mjg0NjE4LAorMHg2MjUyRDUzMSwgMHg4OUZDMjI2OCwgMHgwMDA5MDAwQiwgMHg0NjE4RTY4MCwKKzB4RDUyRDQ2MjgsIDB4MjI2ODYyNTIsIDB4MDAwQjg5RkMsIDB4QTAwMTAwMDksCisweDcyMDFFMjAwLCAweDhCRkMzMjQyLCAweDAwMDkwMDBCLCAweDQ2MThFNjgwLAorMHhENTI2NDYyOCwgMHgyMjY4NjI1MiwgMHgwMDBCOEJGQywgMHgyRkU2MDAwOSwKKzB4N0ZGQzRGMjIsIDB4QkZGMTZFNTMsIDB4NjFFMjJGNDIsIDB4RTI4MEQ2MjAsCisweDU0RTExNjE1LCAweDE2NDY0MjE4LCAweDQyMjg1NUUyLCAweDU3RTMxNjU3LAorMHgxNjc4NkVGMiwgMHgyNkUyMkUyQiwgMHg0RjI2N0YwNCwgMHg2RUY2QUZDRSwKKzB4MDAyMDM0OTQsIDB4MDAxMTc4MDQsIDB4MDAyMDM4RjQsIDB4MDAyMDM5MDgsCisweDAwMjAwNTBBLCAweDAwMjAxMDA4LCAweDAwMjAxMDJFLCAweDAwMjAzQTU4LAorMHgwMDIwMThBMiwgMHgwMDIwMThFNiwgMHgwMDIwM0E2QywgMHgwMDIwM0E3NCwKKzB4MDAyMDNBNzgsIDB4MDAxQzM1MDAsIDB4MDAxQzEwMDAsIDB4MDAyMDM5OEEsCisweDAwMTE3ODAwLCAweDAwMjAxOEVFLCAweDAwMjAzQThDLCAweDAwMjAzOTkwLAorMHgwMDFDMzcwNCwgMHgwMDIwMzNFOCwgMHgwMDFDMzczQywgMHgwMDFDMzcwMCwKKzB4MDAxQzM3MEMsIDB4MkZENjJGQzYsIDB4NEYyMjJGRTYsIDB4NkM1M0REMTAsCisweDZFNDNCRkE0LCAweDJERTJCRjg5LCAweDAwMDlCRkEwLCAweDJDMTI1MUQ1LAorMHgxQzQxNTRENiwgMHgxQzUyNTVENywgMHgxQzYzNTZEOCwgMHg2RUY2NEYyNiwKKzB4MDAwQjZERjYsIDB4NjE2MzZDRjYsIDB4QTAwNEU2MDAsIDB4NjI1NjQxMDksCisweDI0MjI3NjAxLCAweDM2MTI3NDA0LCAweDAwMEI4QkY5LCAweDAwMDAwMDA5LAorMHgwMDFDMzcwQywgMHgwMDA5QTE2RSwgMHgyRkU2MkZENiwgMHhERDk0NEYyMiwKKzB4QTAwNDlFQjIsIDB4RDQ5MzAwMDksIDB4NDIwQkQyOTMsIDB4NjJEMjY1RDIsCisweDhCRjgyMkU4LCAweDAwMDlBMDA0LCAweEQyOEZENDkwLCAweDU1RDE0MjBCLAorMHgyMkU4NTJEMSwgMHhBMDA0OEJGOCwgMHhENDhEMDAwOSwgMHg0MjBCRDI4QSwKKzB4NTJEMjU1RDIsIDB4OEJGODIyRTgsIDB4MDAwOUEwMDQsIDB4RDI4NkQ0ODksCisweDU1RDM0MjBCLCAweDIyRTg1MkQzLCAweEEwMDQ4QkY4LCAweEQ0ODYwMDA5LAorMHg0MjBCRDI4MSwgMHg1MkQ0NTVENCwgMHg4QkY4MjJFOCwgMHg2RUY2NEYyNiwKKzB4NkRGNjAwMEIsIDB4MkZENjJGQzYsIDB4NEYyMjJGRTYsIDB4NkU2MzZDNzMsCisweDZENTNCMDFBLCAweDY0RDM1N0Y0LCAweEIwNUY2NUUzLCAweEIwNzU2NkMzLAorMHhCMEE0MDAwOSwgMHhCMEE4MDAwOSwgMHhCMEFDMDAwOSwgMHhCMEFDMDAwOSwKKzB4QjBBRjAwMDksIDB4QjAzMTU0RjUsIDB4NkNDRDZDMDMsIDB4NEYyNjYwQzMsCisweDZERjY2RUY2LCAweDZDRjYwMDBCLCAweDM0MTJEMTcwLCAweEQ2NzAwNTI5LAorMHgyNjUwRDc3MCwgMHgyNzQyMDAwQiwgMHgwMDA5QTAxOCwgMHgyRkQ2MkZDNiwKKzB4NEYyMjJGRTYsIDB4NkU2MzZDNzMsIDB4NkQ1M0JGRUUsIDB4NjREMzU3RjQsCisweEIwMzM2NUUzLCAweEIwOEQ2NkMzLCAweEIwMEY1NEY1LCAweDZDQ0Q2QzAzLAorMHg0RjI2NjBDMywgMHg2REY2NkVGNiwgMHg2Q0Y2MDAwQiwgMHhFNTAzRDE2MiwKKzB4RDc2M0Q0NjIsIDB4MjE1MjQ1MTgsIDB4MjQ3MjAwMEIsIDB4RDQ1RkQxNUUsCisweDIxNjJFNjAwLCAweDI0NjIwMDBCLCAweEJGNzM0RjIyLCAweEJGNzNFNDBBLAorMHhEMjVDMDAwOSwgMHg0MTE4RTEwNCwgMHhFNDBBRTUwMCwgMHhCRjY5MjIxMiwKKzB4RDc1OTIyNTIsIDB4Q0IyMDYwNzIsIDB4MDAwQjRGMjYsIDB4NEYyMjI3MDIsCisweDQxMEJEMTU2LCAweEQ1NTZFNDAwLCAweDRGMjY0NTJCLCAweEQxNTUyRkU2LAorMHg2NjEyNkU2MywgMHg5MjEwNDQxOCwgMHg0NDA4NDUyOCwgMHg0NTAwMjYyOSwKKzB4MjY1QjQ0MDgsIDB4MjY0QjQ0MDAsIDB4MjE2MjQ3MDgsIDB4RDE0RTQ3MDgsCisweDIxNzIyN0VCLCAweDZFRjYwMDBCLCAweDFGRkYwM0YwLCAweDRGMjIyRkU2LAorMHhFMTAxREU0QSwgMHhCRjNERTQwQSwgMHg2N0UzMkUxMiwgMHhFNTAwNzc2QywKKzB4RTIwNEUxMzAsIDB4Mjc1MkU0MEEsIDB4Mjc1MjI3NTIsIDB4Mjc1MjI3NTIsCisweDI3NTIyNzUyLCAweDI3NTIyNzUyLCAweDI3NTIyNzUyLCAweDI3NTIyNzUyLAorMHgyNzUyMjc1MiwgMHgyNzUyMjc1MiwgMHgyNzUyMjc1MiwgMHgyNzIyMjcxMiwKKzB4Mjc1MjI3NTIsIDB4Mjc1MjI3NTIsIDB4Mjc1MjI3NTIsIDB4Mjc1MjI3NTIsCisweDE3NUFCRjE4LCAweDJFNjJFNjAwLCAweDAwMEI0RjI2LCAweEQyMzQ2RUY2LAorMHhFNDQxRTEwMSwgMHgwMDBCMjIxMiwgMHhEMTMyMjI0MiwgMHhFNjA1RDQzMiwKKzB4MDAwQjIxNjIsIDB4MDAwQjI0NjIsIDB4RDIzMDAwMDksIDB4RTQwQUU2MDEsCisweDIyNjJBRjAwLCAweDJGQzYyRkI2LCAweDJGRTYyRkQ2LCAweDdGRkM0RjIyLAorMHg2QzQzREIyQiwgMHhFRDAwNjBCMiwgMHgyQjAyQ0IwMywgMHhDOTAzNjBCMiwKKzB4NkUwM0EwMDgsIDB4ODkwNzNEQzIsIDB4RTQ2NDYwQjIsIDB4QjA3Q0M5MDMsCisweDdEMDE2RTAzLCAweDhCRjUyRUU4LCAweDhGMDQzREMyLCAweEQ0MjEyRkUxLAorMHg0NjBCRDYyMSwgMHg2MkYxMDAwOSwgMHg2MDIzNjIyRCwgMHg4OUZGQzgwMSwKKzB4N0YwNDYwMjMsIDB4NkVGNjRGMjYsIDB4NkNGNjZERjYsIDB4NkJGNjAwMEIsCisweDAwMUMzQjg4LCAweDAwMjAzQUEwLCAweDAwMjAxOEVFLCAweDAwMjAzQUE4LAorMHgwMDIwM0FCMCwgMHgwMDIwM0FCOCwgMHgwMDIwM0FDMCwgMHgwMDI1RTcyMCwKKzB4MDAyMDNEQTAsIDB4MDAyMDM4RjgsIDB4MDAxQzU5NjgsIDB4MDAxQzNCNDAsCisweDAwMEY4MDAwLCAweDAwMUQ0MDA0LCAweDAwMUMzNTAwLCAweDAwMjAxNUUwLAorMHgwMDIwMTYwQywgMHgwMDFDNTgxNCwgMHgwMDFDNTlEMCwgMHgwMDFDNTgzMCwKKzB4MDAxQzYyNjgsIDB4MDAxQzU5QTQsIDB4MDAxQzYzOUMsIDB4MDAxQzU4MUMsCisweDAwMUM1ODYwLCAweDAwMjAzQUM4LCAweDAwMjAxOEEyLCAweDhGMDE0NDExLAorMHg2MDQzNjA0QiwgMHgwMDA5MDAwQiwgMHg1NjUxRDUyQiwgMHg0NjI4NjA1MiwKKzB4MzA2QzAwMEIsIDB4MkZDNjJGQjYsIDB4MkZFNjJGRDYsIDB4NEYxMjRGMjIsCisweEJGRjE0RjAyLCAweDZCMDM2RTQzLCAweEREMjVEQzI0LCAweDAwMDlCRkVDLAorMHgzQzA1MzBCOCwgMHg0NjA5MDYwQSwgMHg0NjAxNDYwOSwgMHgwMjBBM0Q2NSwKKzB4NDIwOTQyMDksIDB4MzJFMjQyMDksIDB4NEYwNjhCRjAsIDB4NEYyNjRGMTYsCisweDZERjY2RUY2LCAweDAwMEI2Q0Y2LCAweDJGQzY2QkY2LCAweDJGRTYyRkQ2LAorMHg0RjEyNEYyMiwgMHhCRkNGNEYwMiwgMHg2QzAzNkU0MywgMHhCRkNCREQxMywKKzB4MzBDODAwMDksIDB4MDYwQTNEMDUsIDB4NDYwOTQ2MDksIDB4MzZFMjQ2MDEsCisweDRGMDY4QkY1LCAweDRGMjY0RjE2LCAweDZERjY2RUY2LCAweDZDRjYwMDBCLAorMHg0RjIyMkZFNiwgMHhFMTAyREUwQiwgMHhFNDAzRTUwMCwgMHhCRkI5MkUxMiwKKzB4RTYwNjJFNTIsIDB4RTcwMDQ2MTgsIDB4MkU2MkU0MDMsIDB4NEYyNjJFNzIsCisweDZFRjZBRkIwLCAweDAwMDkwMDBCLCAweDAwMUMxMDQwLCAweENDQ0NDQ0NELAorMHgxMDYyNEREMywgMHgwMDFENDAwNCwgMHgyRjk2MkY4NiwgMHgyRkI2MkZBNiwKKzB4MkZENjJGQzYsIDB4NEYyMjJGRTYsIDB4RTUwMDdGOTgsIDB4NjQ1M0U3MTAsCisweDZCNTM0NzI4LCAweEVFMUFEQ0JDLCAweDYxNTM2NTVELCAweDMxNUM0MTA4LAorMHg3NTAxNDEwOCwgMHg2MDQzMzE3QywgMHgwRjE2NjY1RCwgMHhFRDAwNjBCMywKKzB4MjFCMTM2RTMsIDB4ODExMjgxMTEsIDB4MTFEMjgxMTMsIDB4MTFENDExRDMsCisweDc0MDQ4RkVBLCAweEQ4QjE2N0YyLCAweDE4NzFEOUIxLCAweDU4RjEyODcyLAorMHgxOTgxRDFCMCwgMHg1OUYyMjk4MiwgMHg1REY0NUFGMywgMHg1NEY2NUVGNSwKKzB4MjE5MjExOTEsIDB4MTFBMjExQTMsIDB4MTFENDExRDUsIDB4MTFFNjExRTcsCisweDExNDgxMTQ5LCAweERBQTg1NUY3LCAweDU3RjhFRTAwLCAweDUyRjlEREE3LAorMHg2NEUzRDZBNywgMHgyQTUyMUE1MSwgMHhEOEE3RDlBNiwgMHgyRDcyOUFENSwKKzB4NkVFRDI2MjIsIDB4NEQwODZERTMsIDB4M0RFQzYxRTMsIDB4NEQwODQxMDgsCisweDNEOUMzMUVDLCAweDQxMDg2MEIzLCAweDgxRDEyREIxLCAweDQxMDhFMDUwLAorMHg0MDA4RTdCNywgMHg2NzdDNDEwOCwgMHg2MEIzODFEMiwgMHhFMjAwMzE4QywKKzB4ODFEMzM0NzIsIDB4MUQxMzFERDIsIDB4OEQwMUQ0OTMsIDB4RDQ5MDFEMjQsCisweEIwQjM2NUQzLCAweDY0RUQ3RTAxLCAweDhCREEzNEEyLCAweDJGRDJEQThDLAorMHhERDkyNjhBMiwgMHgyRDgyNDgyOSwgMHg3REZDNjRBMiwgMHhEMjg3Njk0RCwKKzB4NkUyMjJEOTIsIDB4N0QwQzRFMjksIDB4NjgyMjJERTIsIDB4NjE4RDZBRDMsCisweDJBMTZENzg0LCAweEQ0OEE2RDcyLCAweDI0RDJENTgzLCAweEQ2ODk1RTcyLAorMHg1MTc0MTRFMiwgMHgxNDE0RUUwMCwgMHhEMTg3NTg3NiwgMHg1OTc4MTQ4NiwKKzB4MTQ5OEU3MTAsIDB4NjVFMzYyNTIsIDB4MjZFMjE0MkEsIDB4RTYwMDY0RTMsCisweDY4NDM2NDRELCAweDM4NEM0ODA4LCAweDM4MUM0ODA4LCAweDBDODY2MDUzLAorMHgwOUNFMjhCMSwgMHg4MTkxNjBCMywgMHgwQUNFNjA1MywgMHg4MUEyNjA0MywKKzB4MERDRTYwNTMsIDB4ODFEMzYwQjMsIDB4MDhDRTYwNTMsIDB4MTg4Mjc0MDEsCisweDYyNEQwOUNFLCAweDBBQ0UxOUUzLCAweDFBNjQzMjczLCAweDc1MDQ4RkUwLAorMHhFMDAzRDk2QSwgMHg0MDE4NkM5MiwgMHg2RDkyMkNCMSwgMHg4MUQxREE2RiwKKzB4NkU5MkUwNTAsIDB4ODFFMjQwMDgsIDB4NjBCMzYxOTIsIDB4NjQ5MjgxMTMsCisweDE0NDJFNjAwLCAweEQ0Njk2NzkyLCAweDY4OTIxN0EzLCAweDE4NjRFMUZGLAorMHg2NTYzRTcwMywgMHgzNjRDNDYwOCwgMHgyNjEyNzUwMSwgMHgzNjczNjY1RCwKKzB4REM1QjhCRjgsIDB4NkRDMkUwMDMsIDB4MkRCMTQwMTgsIDB4RDI2MDZFQzIsCisweDYxQzI4MUUxLCAweDExMTJFRTAwLCAweEUwMjQ2NEMyLCAweDY1QzIxNDIzLAorMHgxNUU0RDQ1QiwgMHhFNTgwNjdDMiwgMHg2OEMyODE3MiwgMHg4MTgzNjZFMywKKzB4NjY2RDY1NUMsIDB4NzYwNDY5NjMsIDB4Mzk0QzZBNkQsIDB4OEZGODNBNTMsCisweERCNTQyOUUyLCAweDI0QjJEQzU0LCAweDI0QzI3NDA0LCAweDRGMjY3RjY4LAorMHg2REY2NkVGNiwgMHg2QkY2NkNGNiwgMHg2OUY2NkFGNiwgMHg2OEY2MDAwQiwKKzB4NjAxMTYxNDIsIDB4OEYwM0M4MDMsIDB4RDIzREU1MDAsIDB4OEIwNjM0MjAsCisweEM5MDM2MDExLCAweDhCMDY4ODAyLCAweDM0MjBEMjM5LCAweDU2MTI4QjAzLAorMHg1MjY0NjUxMywgMHgwMDBCMjQyMiwgMHgwMTEzNjA1MywgMHgyRkU2MkZENiwKKzB4N0ZFQzRGMjIsIDB4NjI1MzZFNTMsIDB4NkQ0M0U1NTAsIDB4NDUwOEU0MDAsCisweEUxMDFBMDAxLCAweDYwNDM1MjI0LCAweDgxMjEyMjExLCAweDYwNTM4MTIzLAorMHg1NkUyODEyMiwgMHg4QkY1MzYyMCwgMHgxNkU0RDIzOCwgMHhFNjE0NjRGMywKKzB4NjVFMzQyMEIsIDB4RTRGQzY1RTEsIDB4MkU1MTI1NDksIDB4NjVGMzYxRjEsCisweDJGMTEyMTQ5LCAweEQxMzE1NEQxLCAweEU2MTQ0MTBCLCAweDYwNzE1N0QxLAorMHgyNzAxQ0IwMSwgMHg3RjE0MURFMSwgMHg2RUY2NEYyNiwgMHg2REY2MDAwQiwKKzB4MkZFNjJGRDYsIDB4N0ZFQzRGMjIsIDB4NjY1MzZFNTMsIDB4NkQ0M0U1RkMsCisweDIwNTk2MDYxLCAweDI2MDFDQjAxLCAweDMyNjA1MkUyLCAweDEyRTQ4QjA2LAorMHgzMUUwNTFFMiwgMHg1MkQxOEIwNCwgMHgxRTIyQTAwMiwgMHg1NjY0QUZGMCwKKzB4NjRGM0QyMUUsIDB4NDIwQkU2MTQsIDB4NjdFMTY1RTMsIDB4MjcxOUUxRkMsCisweDY3RjEyRTcxLCAweDI3MTk1NEQxLCAweDY1RjNEMTE4LCAweDQxMEJFNjE0LAorMHg1MkQxMkY3MSwgMHhDQjAxNjAyMSwgMHgxREUxMjIwMSwgMHg0RjI2N0YxNCwKKzB4MDAwQjZFRjYsIDB4MDAwMDZERjYsIDB4MDAyMDM5MjQsIDB4MDAyMDM0RjQsCisweDAwMjAzNEZDLCAweDAwMjAzNTA0LCAweDAwMjAzNTJDLCAweDAwMjAzOTEwLAorMHgwMDIwMzkxOCwgMHgwMDEwMDIwOCwgMHgwMDEwMTdDMCwgMHgwMDFFMjEwQywKKzB4MDAxQzNEMDAsIDB4MDAyMDM5NjQsIDB4MDAxMDAwQzgsIDB4MDAxMTc4ODAsCisweDAwMTE3NzgwLCAweDAwMDQwMDIwLCAweDAwMjZDNDAxLCAweDAwMjAwRUQ2LAorMHg0RjIyMkZFNiwgMHhERTQyNjI0QywgMHg0MjAwNDIwOCwgMHgzRTJDQTAwNSwKKzB4RDQ0MDUyNTIsIDB4QkY2OTU2MjQsIDB4NjVFMjJFNjIsIDB4MzUyMDUyRTEsCisweEQ2M0Q4QkY2LCAweDRGMjYyNjIyLCAweDZFRjYwMDBCLCAweDJGQzYyRkI2LAorMHgyRkU2MkZENiwgMHhEQzM5NEYyMiwgMHg1MkMxREIzOSwgMHgzNjIwNjZDMiwKKzB4NjA2MTg5MUMsIDB4ODgwMUM5MDMsIDB4REUzNDg5MTgsIDB4QkYzN0REMzUsCisweDY1MDM2NEUzLCAweDY2QjI4NTAzLCAweDMyNjI2MjBELCAweEQ0MzI4OTA3LAorMHgwMDA5QkY3NiwgMHg0RDBCRDQzMSwgMHhBRkU2MDAwOSwgMHhCRjNEMDAwOSwKKzB4RDQyRjY0RTMsIDB4MDAwOTREMEIsIDB4MDAwOUFGREYsIDB4MjI2MkQyMkQsCisweDZFRjY0RjI2LCAweDZDRjY2REY2LCAweDZCRjYwMDBCLCAweDJGRDYyRkM2LAorMHg0RjIyMkZFNiwgMHhERDI5REMyOCwgMHg2RTQzNjBDMiwgMHgwNERFNDAwOCwKKzB4RTYxNEQxMjcsIDB4NjVFMzQxMEIsIDB4RDEyN0Q3MjYsIDB4NTVFMjI3RTIsCisweDM1RTA1MjU0LCAweDIxMjI4RjA0LCAweDQwMDg2MEMyLCAweDEyMjIwMkRFLAorMHg2MDUzNjVDMiwgMHg3NTAxNDAwOCwgMHgwREU2MDZERSwgMHhDOTBGNjA1MywKKzB4NjA2MzJDMDIsIDB4NkVGNjRGMjYsIDB4MDAwQjZERjYsIDB4ODU0MzZDRjYsCisweDY1MEQ1NjQzLCAweDYyMkQ2MjYyLCAweDM1Mjc3MjA0LCAweEUxMDA4RjBDLAorMHgyMjY4OTYwQywgMHhENjE1OEIwMywgMHg3MjAxNTI2MSwgMHhENjEzMTYyMSwKKzB4NjI2MkUxMDEsIDB4MjYyMjcyMDEsIDB4NjAxMzAwMEIsIDB4MDAwMDAxRkYsCisweDAwMjAzNTA0LCAweDAwMjAzNEZDLCAweDAwMUMzRDAwLCAweDAwMjAzNTJDLAorMHgwMDIwMzhGNCwgMHgwMDIwMThBMiwgMHgwMDIwMzRGNCwgMHgwMDIwM0FGMCwKKzB4MDAyMDNBRjQsIDB4MDAxQzNEMjgsIDB4MDAyMDM5NjQsIDB4MDAyMDM5MjQsCisweDAwMjAwRUQ2LCAweDAwMjAzOTY4LCAweDAwMjAzOTZDLCAweDAwMTE3NzU0LAorMHgyRkM2MkZCNiwgMHgyRkU2MkZENiwgMHg3RkY4NEYyMiwgMHg2MDIyRDIzNywKKzB4OEQ1OEM4MDMsIDB4REUzNjJGMDEsIDB4REIzN0RDMzYsIDB4NjZDMjUyQzEsCisweDg5MkYzNjIwLCAweEM5MDM2MDYxLCAweDg5MkI4ODAxLCAweEQyMzNERDMxLAorMHg2NEQzNDIwQiwgMHgxRjAxNjUwMywgMHg4ODAxNjBCMSwgMHhEMjMwOEIwNCwKKzB4NjREMzQyMEIsIDB4MDAwOUFGRUEsIDB4ODU2MTU2NTMsIDB4ODkwNEM4MjAsCisweEUwNTBENzJDLCAweDcyMDEwMjdFLCAweEQyMkIwNzI2LCAweDY0NTM0MjBCLAorMHg4OTA3MjAwOCwgMHg1NUYxRDEyNiwgMHg2NEQzNDEwQiwgMHhFNjAxRDcyNywKKzB4Mjc2MkFGRDQsIDB4NTVGMUQyMjYsIDB4NjRFMzQyMEIsIDB4RTYwMUQxMjUsCisweDIxNjJBRkNDLCAweEREMjVERTI0LCAweERDMjZEQjI1LCAweDY2RDI1MkQxLAorMHg4OTE4MzYyMCwgMHhDOTAzNjA2MSwgMHg4OTE0ODgwMSwgMHhEMTE3RDQxRiwKKzB4MDAwOTQxMEIsIDB4MzZFMDU2MDMsIDB4NjUwMzhGMDQsIDB4MkIyMEUyMDEsCisweDJDNTJBRkVDLCAweEQ3MTJENDFDLCAweDAwMDk0NzBCLCAweEU2MDFEMTE1LAorMHhBRkUzNDYxOCwgMHg2MEYxMjE2MiwgMHg4OTA3QzgwNCwgMHg3RjA4RDIxNywKKzB4NkVGNjRGMjYsIDB4NkNGNjZERjYsIDB4NkJGNjQyMkIsIDB4NEYyNjdGMDgsCisweDZERjY2RUY2LCAweDAwMEI2Q0Y2LCAweDAwMDA2QkY2LCAweDAwMUUyMTAwLAorMHgwMDIwMzUwNCwgMHgwMDIwMzRGQywgMHgwMDIwMzk4QywgMHgwMDIwMTRBMCwKKzB4MDAyMDE0Q0MsIDB4MDAyMDM0OTQsIDB4MDAyMDE2QkUsIDB4MDAxRTIxMkMsCisweDAwMjAxNTMwLCAweDAwMUMzRDMwLCAweDAwMTE3ODgwLCAweDAwMjAzNEY0LAorMHgwMDIwMzkxNCwgMHgwMDIwMzkxMCwgMHgwMDIwMzUyQywgMHgwMDIwMDYxMCwKKzB4RTYwMUQyMDMsIDB4MTI2NUQ1MDMsIDB4MDAwQjIyNTIsIDB4MDAwMDEyNjYsCisweDAwMUMxMDEwLCAweDAwMDBDMzRGLCAweDAwMDkwMDBCLCAweDJGRDYyRkM2LAorMHg0RjIyMkZFNiwgMHg2RDQzNkM1MywgMHhFRTAwQTAwNCwgMHg3RTAxNjRENCwKKzB4NjQ0Q0JGRjIsIDB4OEJGOTNFQzIsIDB4NkVGNjRGMjYsIDB4MDAwQjZERjYsCisweEU1MDA2Q0Y2LCAweDY2NDNBMDAyLCAweDc2MDE3NTAxLCAweDIyMjg2MjYwLAorMHhBRkUzOEJGQSwgMHgyRkU2MDAwOSwgMHg3NTA3NjI1MywgMHhFMTA4Njc1MywKKzB4NjA0M0VFMEEsIDB4NDQwOUM5MEYsIDB4NjUwMzMwRTIsIDB4OEQwMTQ0MDksCisweEU2MzBFNjM3LCAweDQxMTAzNjVDLCAweDhGRjIyNzYwLCAweEUwMDA3N0ZGLAorMHgwMDBCODAyOCwgMHgwMDBCNkVGNiwgMHgwMDBCRTAwMCwgMHgyRkU2RTAwMCwKKzB4N0ZFQzRGMjIsIDB4NkU0MzYyNTMsIDB4QkZEQzY1RjMsIDB4QkZEMDY0MjMsCisweEJGQ0U2NEUzLCAweEQ0MDM2NEYzLCAweDAwMDlCRkNCLCAweDRGMjY3RjE0LAorMHg2RUY2MDAwQiwgMHgwMDIwM0FGOCwgMHhFNEZERDI5RiwgMHhENzlGNjEyMiwKKzB4MjIxMjIxNDksIDB4NzQwMTYwMjIsIDB4MjIwMkNCMDEsIDB4RDU5QzY2MjIsCisweDIyNjIyNjQ5LCAweEM4NDA2MDcwLCAweDYwNTI4OTAyLCAweDI1MDJDQjA0LAorMHhFMUY3NjQ1MiwgMHgyNTQyMjQxOSwgMHhFNzAxNjA1MiwgMHgyNTAyQ0I0MCwKKzB4RTYwMjYwNTIsIDB4MjUwMkM5Q0YsIDB4NDcxODYwNTIsIDB4MjUwMkNCMTAsCisweENCMDM2MDUyLCAweDE1NjIyNTAyLCAweDE1NzMwMDBCLCAweEQ3OEVENThELAorMHhENDhGRDI4RSwgMHhFNjAwRTEwMCwgMHgyNzExMjUxMSwgMHhBRkNCMjIxMCwKKzB4NjY0QzI0NjEsIDB4NDYwMEQyOEIsIDB4NjA2MDM2MkMsIDB4MDAwQkNCMTAsCisweDY1NEMyNjAwLCAweDQ1MDBEMjg3LCAweDY2NTAzNTJDLCAweDI2MTlFMUVGLAorMHgyNTYwMDAwQiwgMHhEMjg0NjY0QywgMHgzNjJDNDYwMCwgMHhDQjEwNjA2MCwKKzB4MjYwMDAwMEIsIDB4RDI4MDY1NEMsIDB4MzUyQzQ1MDAsIDB4RTFFRjY2NTAsCisweDAwMEIyNjE5LCAweDY2NEMyNTYwLCAweDQ2MDBEMjdBLCAweDYwNjAzNjJDLAorMHgwMDBCQ0IwOCwgMHg2NTRDMjYwMCwgMHg0NTAwRDI3NiwgMHg2NjUwMzUyQywKKzB4MjYxOUUxRjcsIDB4MjU2MDAwMEIsIDB4RDI3MzY2NEMsIDB4MzYyQzQ2MDAsCisweENCMDg2MDYwLCAweDI2MDAwMDBCLCAweEQyNkY2NTRDLCAweDM1MkM0NTAwLAorMHhFMUY3NjY1MCwgMHgwMDBCMjYxOSwgMHg2MjRDMjU2MCwgMHg0MjAwRDY2OSwKKzB4NjAyMDMyNkMsIDB4NDAyMUM5MDgsIDB4NDAyMTQwMjEsIDB4NjAwQzAwMEIsCisweEQ2NjU2MjRDLCAweDMyNkM0MjAwLCAweEM5MDg2MDIwLCAweDQwMjE0MDIxLAorMHgwMDBCNDAyMSwgMHhEMTYxNjAwQywgMHgzNDFDNjQ0QywgMHgwMDBCNjI0MCwKKzB4RDE1RjYwMkMsIDB4MzQxQzY0NEMsIDB4MDAwQjYyNDAsIDB4MkZFNjYwMkMsCisweDZFNDM0RjIyLCAweEU2MEE2NDVDLCAweDg5MTQzNDY3LCAweDAwMDlCRkVCLAorMHg2MEVDNjQwQywgMHg4QjAyODgwMSwgMHhBMDAyRTAwRiwgMHg0NDA5MjQwOSwKKzB4NjI0QzQ0MDksIDB4MzI2M0U2MEEsIDB4QkZFMjg5MDUsIDB4NjIwQzY0NEMsCisweEM4ODA2MDIzLCAweEUyMDA4QjAwLCAweDRGMjY2MDIzLCAweDZFRjYwMDBCLAorMHhENjRDNEYyMiwgMHg4ODAxNjA2MiwgMHhCMjU3OEIwMywgMHhBMDAzMDAwOSwKKzB4RDI0OTAwMDksIDB4MjI2MEU2NDAsIDB4RTIwMEQ2NDgsIDB4MDAwQjRGMjYsCisweDRGMjIyNjIyLCAweDYwNjJENjQzLCAweDhCMDE4ODAyLCAweDAwMDlCMkEwLAorMHhFMjAwRDY0MiwgMHgwMDBCNEYyNiwgMHhENTNFMjYyMiwgMHhFMTAwRDQzRSwKKzB4MjUxMkU3MDEsIDB4MjQ3MDAwMEIsIDB4RTYwNEQyM0IsIDB4MjI2MDAwMEIsCisweEQ0M0I0RjIyLCAweDQxMEJEMTNCLCAweEQ1M0IwMDA5LCAweDY2NTBFMUZELAorMHgyNjE5RDIzQSwgMHgyNTYwRTcwMCwgMHgwMDBCNEYyNiwgMHg0RjIyMjI3MCwKKzB4RDIzOEQ1MzcsIDB4RDczODYxNTIsIDB4MjUxMjYxMUQsIDB4RTZGRjY0NTIsCisweDI1NDIyNDJCLCAweEQyMkZENDM1LCAweDQyMEI2NjZELCAweEQ1MkUyNzYyLAorMHg2NzUwRTFGQiwgMHg0RjI2MjcxOSwgMHgyNTcwMDAwQiwgMHhENDMwNEYyMiwKKzB4NDEwQkQxMjgsIDB4RDUyODAwMDksIDB4NjY1MEU3RjcsIDB4NEYyNjI2NzksCisweDI1NjAwMDBCLCAweDk0MjVENTI0LCAweDIyNDk2MjUwLCAweDI1MjAwMDBCLAorMHhFNEJGRDUyMSwgMHgyMjQ5NjI1MCwgMHgyNTIwMDAwQiwgMHhEMjI1NEYyMiwKKzB4NjAwRDg1MjIsIDB4ODkxMTIwMDgsIDB4ODk0NTg4MDEsIDB4ODk0Nzg4MDMsCisweDg5NDk4ODA1LCAweDg5NEY4ODA2LCAweDg5NTU4ODA4LCAweDg5NUI4ODA5LAorMHg4OTYxODgwQSwgMHg4OTY3ODgwQiwgMHgwMDA5QTA2RSwgMHgwMDA5QjA3MCwKKzB4NjAwQ0EwNkIsIDB4MDAwMEZGN0YsIDB4MDAxRTIxNDgsIDB4MDAxRTEwMDAsCisweDAwMUUxMTA4LCAweDAwMjAzOUM0LCAweDAwMjAzOUM2LCAweDAwMjAzOUU1LAorMHgwMDIwMzlBOCwgMHgwMDFFMTAzRiwgMHgwMDFFMTA1RiwgMHgwMDFFMTAyRiwKKzB4MDAxRTEwOTAsIDB4MDAyMDM5Q0MsIDB4MDAxRTEwMEIsIDB4MDAyMDM5QzgsCisweDAwMjAzQUZDLCAweDAwMjAxOEEyLCAweDAwMUUxMDI4LCAweDAwMjAzOUU0LAorMHgwMDFENDAyMCwgMHg5ODc2MDAwMCwgMHgwMDFDMTAwMCwgMHgwMDIwM0IwOCwKKzB4MDAyMDNCMTgsIDB4MDAyMDM5OUMsIDB4MDAwOUIwNEMsIDB4NjAwQ0EwMzUsCisweDAwMDlCMDU1LCAweDYwMENBMDMxLCAweDYyNjBENjg0LCAweDhCMkIyMjI4LAorMHgwMDA5QjA2MSwgMHg2MDBDQTAyOSwgMHg2MjYwRDY4MCwgMHg4QjIzMjIyOCwKKzB4MDAwOUIwNjksIDB4NjAwQ0EwMjEsIDB4NjI2MEQ2N0MsIDB4OEIxQjIyMjgsCisweDAwMDlCMEM3LCAweDYwMENBMDE5LCAweDYyNjBENjc4LCAweDhCMTMyMjI4LAorMHgwMDA5QjBDRCwgMHg2MDBDQTAxMSwgMHg2MjYwRDY3NCwgMHg4QjBCMjIyOCwKKzB4MDAwOUIxMjUsIDB4NjAwQ0EwMDksIDB4NjI2MEQ2NzAsIDB4OEIwMzIyMjgsCisweDAwMDlCMTNELCAweDYwMENBMDAxLCAweDRGMjZFMDAwLCAweDAwMDkwMDBCLAorMHhEMjZDRDE2QiwgMHhENTZDODQxMiwgMHg0MDAwQzkwRiwgMHhENzZCMDEyRCwKKzB4RTQwM0Q2NkIsIDB4RTIwRjYxMUMsIDB4MjU0MEUwMDEsIDB4MjUyMDI3MTIsCisweDI2MDIwMDBCLCAweEU2MDFEMjYyLCAweDMwNjY4NTIzLCAweEUwMDA4RDA1LAorMHhENjYzRDI2MCwgMHhFMDAxODEyMiwgMHgwMDBCMjYwMiwgMHhEMjVDMDAwOSwKKzB4NjAwRDg1MjMsIDB4ODkwNTIwMDgsIDB4OEIwQTg4MDEsIDB4NjA2MEQ2NUQsCisweDI2MDBDQjAxLCAweEQ0NTdENjVBLCAweEUwMDFFMTAxLCAweDAwMEIyNjEyLAorMHgwMDBCODE0MiwgMHhEMTUyRTAwMCwgMHg4NTEzRTUwMSwgMHg2NDBENDUxOCwKKzB4NjYwMzM0NTMsIDB4RTAwMDhEMDUsIDB4RDU1MUQyNTMsIDB4MjI2MEUwMDEsCisweDAwMEIyNTAyLCAweDRGMjIwMDA5LCAweDg1MTNEMTQ5LCAweDY0NTM2NTBELAorMHg2MjQ5NDQxOSwgMHgyMjdENjcyRSwgMHg4ODAxNjAyQywgMHg4ODAyODkwOSwKKzB4ODgwMzg5MTAsIDB4ODgwNjg5MUEsIDB4ODgwNzg5MzUsIDB4QTA0Qzg5M0IsCisweEQ1NDYwMDA5LCAweDY2NTJENzQ2LCAweDI3NjJENDQ2LCAweDYyMkM2MjYxLAorMHgyNDIxQTAzOCwgMHgyMjI4NjI1QywgMHhENDQzOEIzRiwgMHg2NjQyRDU0MCwKKzB4MjU2MkQ0NDAsIDB4MjQwMTg1NjEsIDB4NjIwM0EwMkMsIDB4MjAwODYwNUMsCisweDg4MTA4OTA3LCAweDg4MjA4OTA4LCAweDg4MzA4OTA5LCAweEEwMkM4OTBBLAorMHhEMjNBMDAwOSwgMHg2MjIyQTAwOCwgMHhBMDA1RDIzOSwgMHhEMjM5NjIyMiwKKzB4NjIyMkEwMDIsIDB4NjI2MkQ2MzgsIDB4RDQzMkQ1MzEsIDB4NjYyMTI1MjIsCisweEEwMEY2MjZDLCAweEQ2MzUyNDIxLCAweDYyNjFENTJELCAweDYyMkNENDJELAorMHhBMDA3MjU2MiwgMHhENjMyMjQyMSwgMHg4NTYxRDUyOSwgMHgyNTYyRDQyOSwKKzB4NjIwMzI0MDEsIDB4NjYyRDg1MTUsIDB4MzYxNzYxMEQsIDB4NjUwMzhGMDEsCisweEIwQ0IyNDUxLCAweEEwMDEwMDA5LCAweEUwMDBFMDAxLCAweDAwMEI0RjI2LAorMHhENjE5MDAwOSwgMHhENDI3RTEwMSwgMHg2NTQxMjYxMCwgMHhEMTE4RDcxNywKKzB4RTIwRjY1NUQsIDB4Mjc1MkUwMDEsIDB4MDAwQjI2MjAsIDB4MkZFNjIxMDIsCisweEQyMEY0RjIyLCAweDY0MEM4NTIzLCAweDhCMDgyNDQ4LCAweEQ1MTFENjFELAorMHgyNjIxRTIwMCwgMHg5NDBGODQ1MSwgMHhBMDQ4MjA0OSwgMHhERTBEODA1MSwKKzB4Qzg0MDYwRTAsIDB4RTIwMThEMzIsIDB4ODk0NDM0MjcsIDB4RDIxNkQ2MTUsCisweDI2NDE0MjBCLCAweDAwMDlBMDMwLCAweDAwMDBGRjdGLCAweDAwMjAzOUU1LAorMHgwMDIwMzk5QywgMHgwMDIwMzlBOCwgMHgwMDFFMTEwMCwgMHgwMDFFMTAwQywKKzB4MDAyMDM5QzgsIDB4MDAxRTEwMDAsIDB4MDAxRTEwMDEsIDB4MDAyMDM5RDAsCisweDAwMjAzOUIwLCAweDAwMjAzOUI0LCAweDAwMjAzOUI4LCAweDAwMjAzOUQ0LAorMHgwMDIwMzlEOCwgMHgwMDIwMzlEQywgMHgwMDIwMzlFMCwgMHgwMDIwM0UwNCwKKzB4MDAyMDNFMEUsIDB4MDAyMDM5QzIsIDB4MDAyMDI4ODYsIDB4ODkxMjM0MjcsCisweEQyOTRENjkzLCAweDI2NDE0MjBCLCAweENCODA4NEUxLCAweDgwRTFCMEY1LAorMHhENjkxNjBFMCwgMHgyRTAwQ0IwNCwgMHhDOTNGNjA2MCwgMHhENjhGMjYwMCwKKzB4QTAwMUUwMDEsIDB4RTAwMDI2MDIsIDB4MDAwQjRGMjYsIDB4RDY4QzZFRjYsCisweEM4ODA2MDYwLCAweEQyODY4OTE5LCAweDg4MDE2MDIxLCAweEQyODk4QjE1LAorMHg4NTI0RTUwMSwgMHg4OTEwMzA1NiwgMHhFMjAzRDE4NywgMHgyMTIwRDQ4NywKKzB4RTAwQjY1NDEsIDB4MDY1NjY1NUQsIDB4RTQwRkQ1ODUsIDB4MjE0MEU3MDIsCisweEQ3N0UyNTcxLCAweDAwMEJFMDAxLCAweDAwMEIyNzAyLCAweDJGRTZFMDAwLAorMHhERTgwNEYyMiwgMHhDODgwODRFMSwgMHhENTdBODkyQywgMHgyMDA4ODU1NCwKKzB4NjEwMzhGMjgsIDB4ODU1M0Q3N0MsIDB4NjQwMzY2NzIsIDB4ODU2NjY1MEMsCisweDM1MjA2MjBDLCAweEQ2Nzk4QjFFLCAweDY1MUNENzc0LCAweDI2NTE2NDRDLAorMHg2MEUwMjc0MSwgMHg4OTA0Qzg0MCwgMHg0MjBCRDI3NSwgMHhBMDAzMDAwOSwKKzB4RDI2ODAwMDksIDB4MDAwOTQyMEIsIDB4MDAwOUIwOUYsIDB4RTIwMUQxNjcsCisweDYwRTAyMTIyLCAweENCMDRENDY0LCAweDYwNDAyRTAwLCAweDI0MDBDOTNGLAorMHg2MDIzQTAwMSwgMHg0RjI2RTAwMCwgMHg2RUY2MDAwQiwgMHgyRkI2MkZBNiwKKzB4MkZENjJGQzYsIDB4REE2MjJGRTYsIDB4NjZBMUUyNDAsIDB4MzYyMkRDNUUsCisweDYyNjM4OTAwLCAweDZFRDM2RDJDLCAweDRFMjEzNkQ4LCAweDRFMjEyQTYxLAorMHhEQjYxRDQ2MCwgMHhFNzAwQTAwRiwgMHg3NzAxNjJCMiwgMHg3MTAyNjEyMywKKzB4NjYyMTJCMTIsIDB4NzEwMjYyMTMsIDB4NjEyMTJCMTIsIDB4NjUxRDY2NkQsCisweDM1NkM0NTI4LCAweDYyN0MyNDUyLCAweDhCRUQzMkUzLCAweEM5MDM2MEQzLAorMHg4QjEwODgwMywgMHg2MTczNjdCMiwgMHgyQjEyNzEwMiwgMHg3MTAyNkUxMywKKzB4MkIxMjY1NzEsIDB4NjU1RDZERTEsIDB4NDIyODYyREQsIDB4MzI1Q0UxMDcsCisweEEwMEMyQzEwLCAweDg4MDIyNDIyLCAweEEwMDM4QjAxLCAweDg4MDFFMjAzLAorMHhFMjAxOEIwNSwgMHg2NkIyMkMyMCwgMHg2NTVENjU2MSwgMHhFNjBGMjQ1MiwKKzB4NjdBMTJDNjAsIDB4OEIwNTI3NzgsIDB4REQzOERDNDQsIDB4RUIwMUVBMDAsCisweDJEQjIyQ0EyLCAweDZERjY2RUY2LCAweDZCRjY2Q0Y2LCAweDZBRjYwMDBCLAorMHgyRkU2MkZENiwgMHhFMjQwREQzNiwgMHgzNjIyNjZEMSwgMHg2MjYzODkwMCwKKzB4MzY3ODY3MkMsIDB4NzcwM0RFMzgsIDB4NDcyMTJENjEsIDB4NjRFMkQ2MzUsCisweEEwMEU0NzIxLCAweDY1NjJFMTAwLCAweDYyNTM3MTAxLCAweDc0MDEyNDUwLAorMHgyNDIwNDIxOSwgMHg0NTI5NzQwMSwgMHg3NDAxMjQ1MCwgMHgyNDUwNDUxOSwKKzB4NjIxQzc0MDEsIDB4OEJFRTMyNzMsIDB4NjZFMjQyMDAsIDB4NDIwMDYxRDEsCisweDIxMTgzNjJDLCAweDJFNjI4RjA2LCAweEREMUNENzI4LCAweEU1MDFFNDAwLAorMHgyRDUyMjc0MiwgMHgwMDBCNkVGNiwgMHgyRkQ2NkRGNiwgMHg0RjIyMkZFNiwKKzB4RUQwQUVFMDEsIDB4NjRFM0JDODUsIDB4QkM4QTY0RTMsIDB4NjJFQzdFMDEsCisweDhCRjczMkQ3LCAweEJDOERFRTAxLCAweDY0RTM2NEUzLCAweDdFMDFCQzkyLAorMHgzMkQ3NjJFQywgMHg0RjI2OEJGNywgMHgwMDBCNkVGNiwgMHhEMTE4NkRGNiwKKzB4RDQxODkyMEQsIDB4NzIxMjIxMjIsIDB4MjQyMkQ2MTcsIDB4RDcxNzcyMDQsCisweDcyMjAyNjIyLCAweDI3MjJEMTE2LCAweDAwMEI3MjMwLCAweDEzN0EyMTIyLAorMHgwMDIwMzlDMiwgMHgwMDIwMjk5MiwgMHgwMDFFMTAxNSwgMHgwMDIwMzlDOCwKKzB4MDAxRTEwMDEsIDB4MDAyMDM5OUMsIDB4MDAxRTExMDAsIDB4MDAyMDM5QzYsCisweDAwMjAzOUI0LCAweDAwMUUxMDAwLCAweDAwMjAzOUI4LCAweDAwMjAzOUM0LAorMHgwMDIwMjg4NiwgMHgwMDFFMTAwQywgMHgwMDIwMzlCMCwgMHgwMDIwMzlDQywKKzB4MDAyMDM5RDAsIDB4MDAyMDM5RDQsIDB4MDAyMDM5RDgsIDB4MDAyMDM5REMsCisweDAwMjAzOUUwLCAweDRGMjIyRkU2LCAweEQ2NzA3RkZDLCAweDg4MDE2MDYwLAorMHhFMjAxODk1MSwgMHgyNjIwQkZCQiwgMHhENTZFRDE2RCwgMHhERTZFNjAxMCwKKzB4NjRFMzY1NTIsIDB4NzQwMkM4NDAsIDB4OEQyMkQxNkMsIDB4RDI2Qzc1MDIsCisweEU2MDFENzZDLCAweEU3MDQyNzIyLCAweDc2MDE2MjU1LCAweDYyNkMyNDIxLAorMHg4RkY5MzI3MywgMHhENDYzNzQwMiwgMHg2MjQyRTYwMSwgMHg2NDBEODUyOCwKKzB4Njc0OTQ0MTksIDB4Mjc1RDY1N0UsIDB4ODFFNDYwN0MsIDB4RTQxN0Q1NjIsCisweDY3NTU3NjAxLCAweDMyNDM2MjZDLCAweDhGRjkyMTcxLCAweEEwMjA3MTAyLAorMHhEMjVFMDAwOSwgMHhFNjAxRDc1QiwgMHhFNzA0MjcyMiwgMHg3NjAxNjI1NSwKKzB4NjI2QzI0MjEsIDB4OEZGOTMyNzMsIDB4RDQ1Mjc0MDIsIDB4NjI0MkU2MDEsCisweDY0MEQ4NTI4LCAweDY3NDk0NDE5LCAweDI3NUQ2NTdFLCAweDgxRTQ2MDdDLAorMHhFNDE3RDU1MywgMHg2NzU1NzYwMSwgMHgzMjQzNjI2QywgMHg4RkY5MjE3MSwKKzB4OTI4OTcxMDIsIDB4RDI0NjJFMjEsIDB4NUUyM0Q3NEUsIDB4NjRGMjJGRTIsCisweDYwNDM2NUYyLCAweDI3MDBDOTgwLCAweEM5NjA2MDQzLCAweDgwNzE2MTAzLAorMHhDOTAzNjA0MywgMHg4MDcyNDUxOSwgMHg2NUYyNjA1QywgMHg4MTcyNjZGMiwKKzB4NDYxOTQ2MjksIDB4NjA2QzQ1MjksIDB4NDAxODY0NUMsIDB4ODE3MzMwNEMsCisweDIxMTg1RTIzLCAweDY0RjIyRkUyLCAweDZFNEM2MkYyLCAweDYwMkM0MjE5LAorMHg2NkYyNjJGMiwgMHg0NjI5NDAxOCwgMHg0NjE5MzBFQywgMHg0MjI5ODE3NCwKKzB4NjUyQzYwNkMsIDB4MzA1QzQwMTgsIDB4ODE3NThGMDcsIDB4MDAwOUJDOTYsCisweDIyMjg2MjBDLCAweEEwMEE4OTA4LCAweDYwMTMwMDA5LCAweDhCMDM4ODQwLAorMHgwMDA5QjAwOSwgMHgwMDA5QTAwMywgMHhFMjAyRDYyRiwgMHg3RjA0MjYyMiwKKzB4MDAwQjRGMjYsIDB4NEYyMjZFRjYsIDB4ODU1MkQ1MkEsIDB4ODgzMDYwMEQsCisweDg4MzE4OTAzLCAweEEwMzQ4OTIzLCAweDg1NTUwMDA5LCAweEQ0MjhENzI3LAorMHg4NTUzMjcwMSwgMHg2MTBERDYyNywgMHgyNDEyNDExOCwgMHg0NjBCRDQyNiwKKzB4RDcyMzAwMDksIDB4RDIyNkQ0MjUsIDB4NjU3MjQyMEIsIDB4RTIzMEQxMjAsCisweDQyMjg2NzEyLCAweDI3MjlFNjIwLCAweDM3NjA0NjI4LCAweEQ2MjE4QjAzLAorMHhBMDE2RTIwMCwgMHhENjFGMjYyMiwgMHhBMDEyRTIwMiwgMHhEMTE4MjYyMiwKKzB4NjIxMkU1MzAsIDB4RTYyMDQ1MjgsIDB4NDYyODIyNTksIDB4ODkwODMyNjAsCisweEQ0MUFEMTE5LCAweEU2MDFENTEzLCAweDIxNjA0NTBCLCAweDQ3MkJENzE4LAorMHg0RjI2NEYyNiwgMHgwMDA5MDAwQiwgMHgwMDAwMDYwQSwgMHgwMDIwMzlFNCwKKzB4MDAxRTEwMDAsIDB4MDAyMDM5RDAsIDB4MDAyMDNFMDQsIDB4MDAyMDNFMTAsCisweDAwMjAzREE4LCAweDAwMjAzOUI4LCAweDAwMjAzREQ4LCAweDAwMjAzREQ2LAorMHgwMDIwM0RBQSwgMHgwMDIwMzk5QywgMHgwMDIwMzlDOCwgMHgwMDIwMzlCNCwKKzB4MDAyMDM5QjAsIDB4MDAyMDE4QTIsIDB4MDAyMDNCMjQsIDB4MDAyMDNCMjgsCisweDAwMjAxOEVFLCAweDAwMjAzOUNDLCAweDAwMUUxMDBCLCAweDAwMjAzQjNDLAorMHgwMDExNDAwNCwgMHg0RjIyMkZFNiwgMHhERTk2N0ZGQywgMHgyMDA4ODRFOSwKKzB4MkYwMDhEMDYsIDB4RDY5NUQ0OTQsIDB4MDAwOTQ2MEIsIDB4NjRGMEIxOUEsCisweDY2MjBEMjkzLCAweDg5MDIyNjY4LCAweEM5QkY2MEUwLCAweDdGMDQyRTAwLAorMHgwMDBCNEYyNiwgMHgwMDBCNkVGNiwgMHgyRkU2MDAwOSwgMHhERThENEYyMiwKKzB4NjBFMEQ2OEQsIDB4Q0JDMEQ0OEQsIDB4NjI2MDJFMDAsIDB4QzgwMzYwMkMsCisweDQwMjE4OTA0LCAweDcwMDE0MDIxLCAweDY2MDNBMDAyLCAweDY2MDM0MDA5LAorMHhENjg3NjE2RCwgMHhFNTAwQTAwNCwgMHg3NTAxNjI2MiwgMHg3NDA0MjQyMiwKKzB4MzIxMzYyNUQsIDB4RDI4MzhCRjgsIDB4MDAwOTQyMEIsIDB4QzlCRjg0RTIsCisweDRGMjY4MEUyLCAweDZFRjYwMDBCLCAweDJGRTYyRkQ2LCAweDdGRkM0RjIyLAorMHg2MjYwRDY3RCwgMHg4OTQ0MjIyOCwgMHhENTcyRTEwMCwgMHg2MDUwMjYxMCwKKzB4Q0I0MEQ0N0EsIDB4MjUwMDQ0MEIsIDB4OEQwNTIwMDgsIDB4NjJFMDZFMDMsCisweDcxMDQ2MTJDLCAweDJGMTFBMDA2LCAweEQ0NzVENjZELCAweERENzU2NzYwLAorMHg2NTdDNEQwQiwgMHhFMjNDNkQxRCwgMHg4QjAzM0QyNywgMHhEMjY3RDQ3MiwKKzB4MDAwOTQyMEIsIDB4NEQyMTREMjEsIDB4QTAwNUQ3NzAsIDB4NjZFNkU0MDAsCisweDM1N0M0NTA4LCAweDc0MDEyNTYyLCAweDM1RDM2NTRELCAweEQ3NkM4QkY3LAorMHg2MTcyRTAwMywgMHg4MTExNDAxOCwgMHg2RTcyNjBGMSwgMHg4MUUyNzAwQywKKzB4RDQ2ODYxNzIsIDB4REQ2ODgxMTMsIDB4NEQwQkRFNjgsIDB4RTIwMTY1NzIsCisweEQ0NjcyRTIyLCAweDQyMEJEMjU1LCAweEQ2NTYwMDA5LCAweEM5M0Y2MDYwLAorMHg3RjA0MjYwMCwgMHg2RUY2NEYyNiwgMHg2REY2MDAwQiwgMHgyRkM2MkZCNiwKKzB4MkZFNjJGRDYsIDB4RDI1RjRGMjIsIDB4NkI0MzZFNzMsIDB4NDIwQjZDNTMsCisweDIwMDg2RDYzLCAweDY0MDM4RDFDLCAweEU1MEVEMTQ5LCAweDMyNTI2MjEwLAorMHg2MEMzODkxNiwgMHg4MDQxMjRCMCwgMHg4MTQxNjBEMywgMHhBMDA3RTUwMCwKKzB4NjU1RDYxQkMsIDB4MDBFQzYwNTMsIDB4MzY0QzY2NTMsIDB4ODA2NDc1MDEsCisweDMyMTM2MjVELCAweEQ2M0I4QkY1LCAweEM5QkY2MDYwLCAweDI2MDBBMDA4LAorMHhEMjNBRDQ0RCwgMHg2RUY2NEYyNiwgMHg2Q0Y2NkRGNiwgMHg2QkY2NDIyQiwKKzB4NkVGNjRGMjYsIDB4NkNGNjZERjYsIDB4NkJGNjAwMEIsIDB4N0ZDNDRGMjIsCisweDcyMDI2MkYzLCAweDIyNTEyRjQxLCAweDQ1Mjk3MjAyLCAweDYwNjMyMjUxLAorMHhFNUM0RTY4MiwgMHg2N0YzODEyMSwgMHg2NTVDNjY2QywgMHhFNDA4QkZCNiwKKzB4NEYyNjdGM0MsIDB4MDAwOTAwMEIsIDB4MkY5NjJGODYsIDB4MkZCNjJGQTYsCisweDJGRDYyRkM2LCAweDRGMjIyRkU2LCAweEUxMDA3RkM0LCAweDY1MTNFQ0ZGLAorMHg2QjEzNkNDRCwgMHhERTM2RDczNSwgMHhFREZGNjRGMywgMHhEODM1RUEwNCwKKzB4NjA1MzY1NUMsIDB4MDI3RDQwMDAsIDB4MzJDMDYyMkQsIDB4NjYwMzhEMEQsCisweDA5RUQ2MDYzLCAweDI0OTEwMjdELCAweDI0MjE3NDAyLCAweDY5ODIwMkVELAorMHgzOTI4NjIyRCwgMHg3NDAyMjg5MiwgMHg3NTAxNzEwNCwgMHg2MDYzNjI1QywKKzB4MDdENTMyQTIsIDB4MEVCNThGRTQsIDB4MjQ0ODY0MUMsIDB4RTY4MDg5MDUsCisweDY3RjNFNUM1LCAweEJGNzk2NjZDLCAweDdGM0M2NTVDLCAweDZFRjY0RjI2LAorMHg2Q0Y2NkRGNiwgMHg2QUY2NkJGNiwgMHgwMDBCNjlGNiwgMHhEMTFFNjhGNiwKKzB4NjAxMkQyMUUsIDB4Q0IyMEU0MDUsIDB4MjEwMkU1MDAsIDB4MDAwQjIyNDIsCisweDAwMDAyMjUyLCAweDAwMUUxMDE3LCAweDAwMjAzQjQwLCAweDAwMjAxOEEyLAorMHgwMDIwMzkwRSwgMHgwMDFFMTAxNSwgMHgwMDFFMTBCRiwgMHgwMDExNzgwMCwKKzB4MDAxRTEwRkMsIDB4MDAyMDA2MTAsIDB4MDAyMDM5MTQsIDB4MDAyMDJBRUEsCisweDAwMjAzQjQ0LCAweDAwMjAxOEVFLCAweDAwMjAzQjYwLCAweDAwMTE3ODhDLAorMHgwMDIwMzkxMCwgMHgwMDIwMzRGNCwgMHgwMDIwMTUzMCwgMHgwMDFFMjEzMCwKKzB4MDAyMDNCNjgsIDB4MDAyMDJBQUMsIDB4MDAyMDNCNkMsIDB4MDAyMDM5NzQsCisweDAwMjAzOTdDLCAweDAwMjAzREE0LCAweDAwMUMzNTAwLCAweDAwMUQ0MDA0LAorMHhENTY0RDE2MywgMHhFNDAwRDc2NCwgMHgyMTQyRTIwRiwgMHgxNzQxMTE1NCwKKzB4RDU2MjI3MjIsIDB4OTY2OUQ3NjIsIDB4MTU0MTI1NzIsIDB4OTY2NjE1NjIsCisweEU2MDExNTY1LCAweEQ1NUYxMTY1LCAweDY2NkNFNkY4LCAweDI1NDIyNTQyLAorMHgyNTQyMjU0MiwgMHgyNTQyMjU0MiwgMHgyNTYyMjU0MiwgMHg3NjAxRTcyNywKKzB4Njc2MzI1NzIsIDB4MjU2Mjc3OTcsIDB4RTcwNDI1NzIsIDB4MjU3MkUyNDgsCisweEUyMTkyNTIyLCAweEUyNzAyNTIyLCAweDI1NDIyNTQyLCAweDI1NDIyNTQyLAorMHgyNTIyMjU0MiwgMHgyNTIyRTIwQywgMHgyNTQyMjU0MiwgMHgyNTQyMjU0MiwKKzB4MjU0MjI1NDIsIDB4MjU0MjI1NDIsIDB4MDAwQjE1NEEsIDB4RTIwODExNDUsCisweDAwMDk0MjJCLCAweDJGRTYyRkQ2LCAweDdGRkM0RjIyLCAweEM4MjA2MDQzLAorMHg2RTQzOEQwMiwgMHgwMDA5QkU2NywgMHhDODEwNjBFMywgMHhCRTY0ODkwMSwKKzB4NjBFMzAwMDksIDB4ODkwMUM4NDAsIDB4MDAwOUJFODYsIDB4QzgwMTYwRTMsCisweEREM0Q4OTM4LCAweEM4MDI2MEQwLCAweDJGMDA4RDAzLCAweDQ2MEJENjNCLAorMHg2MEYwMDAwOSwgMHg4OTAyQzgwNCwgMHg0NjBCRDYzOSwgMHg2MkYwMDAwOSwKKzB4Qzg4MDYwMjMsIDB4NjBEMDg5MDIsIDB4MkQwMEM5N0YsIDB4QzgwMTYwMjMsCisweEQ2MzQ4OTA2LCAweDAwMDk0NjBCLCAweDAwMDlBMDA3LCAweDUxNjMwNjAxLAorMHg4OTAyQzgwOCwgMHg0NjBCRDYzMCwgMHg2MEYwMDAwOSwgMHg4OTAyQzgxMCwKKzB4NDIwQkQyMkUsIDB4RDUyRTAwMDksIDB4ODgwMjYwNTIsIDB4RDIyRDhCMDMsCisweEEwMDVFNjA0LCAweDg4MDEyMjYwLCAweEQyMkE4QjAyLCAweDIyNjBFNjAxLAorMHgyNTIyRTIwMCwgMHhDODgwNjBFMywgMHhEMjI3ODkyRCwgMHg2MEUzNkUyMCwKKzB4ODkwMkM4ODAsIDB4NDIwQkQyMjUsIDB4NjBFMzAwMDksIDB4ODkwMkM4NDAsCisweDQyMEJEMjIzLCAweDYwRTMwMDA5LCAweDg5MDJDODAyLCAweDQyMEJEMjIxLAorMHg2MEUzMDAwOSwgMHg4OTBEQzgwNCwgMHhERDIwRDExRiwgMHgwMDA5NDEwQiwKKzB4MDAwOUJGMEQsIDB4MDAwOUJGNEMsIDB4RDUxRUQ0MUQsIDB4MjQ3MEU3MDgsCisweDI1RDJCRjg1LCAweEM4MDg2MEUzLCAweEQyMUI4OTA1LCAweDRGMjY3RjA0LAorMHg0MjJCNkVGNiwgMHg3RjA0NkRGNiwgMHg2RUY2NEYyNiwgMHg2REY2MDAwQiwKKzB4MDAxQzU4MUMsIDB4QTAwMEEwMDAsIDB4MDAxRDAxMDAsIDB4MDAxRDQwMDAsCisweDAwMDQwMDIxLCAweDAwMUM1ODlDLCAweDAwMUUxMDIxLCAweDAwMjAxQTkwLAorMHgwMDIwMUFCMiwgMHgwMDIwMjExNCwgMHgwMDIwMUFDQSwgMHgwMDIwMUFEOCwKKzB4MDAyMDM5QzgsIDB4MDAxRTEwMEIsIDB4MDAxRTEwMjgsIDB4MDAyMDFCNDQsCisweDAwMjAxQjUwLCAweDAwMjAxQUUwLCAweDAwMjAxQUZFLCAweDEyMzQ1Njc4LAorMHgwMDFFMTAwMCwgMHgwMDEwRjEwMCwgMHgwMDIwMUIyQywgMHg2NDRDRDZBNywKKzB4MDAwQjM0NkMsIDB4RDZBNjI0NTAsIDB4MzQ2QzY0NEMsIDB4MjQ1MDAwMEIsCisweDY0NENENkE0LCAweDAwMEIzNDZDLCAweDYyNUMyNDUwLCAweDQyMDg2MTZELAorMHg0MjA4NDExOSwgMHg0MjAwNjAxOSwgMHg2NzBFNjE0QywgMHhENDlFMzIxQywKKzB4NDIwMDIwN0QsIDB4MzI0Q0M5MEYsIDB4MjIwMDAwMEIsIDB4NDIwODYyNUMsCisweDQyMDA0MjA4LCAweDMyNEM2NDRDLCAweDQyMDBENDk4LCAweDAwMEIzMjRDLAorMHgyRkU2MjI2MCwgMHg2MTRDNEYxMiwgMHg0MTAwRDQ5MywgMHg2NzEwMzE0QywKKzB4RTI5RjY2NkQsIDB4MjcyOTQ2MTksIDB4NkU1MzYyNjksIDB4NjcyRTY1NzMsCisweDQyMjEyMjdELCAweDQyMjE0MjIxLCAweDc2MDE2NjJDLCAweEU0MDE0NjA4LAorMHgzNEU4NDYwOCwgMHg2NDRDNDYwMCwgMHgwNzFBMDQ2NywgMHgyMTUwMjU3QiwKKzB4MDAwQjRGMTYsIDB4NEYyMjZFRjYsIDB4RDI4NTdGRTgsIDB4ODgwMTYwMjEsCisweEQyODQ4QjdCLCAweDI2Njg2NjIxLCAweEQyODM4Qjc3LCAweDI2Njg2NjIxLAorMHhFNTBGOEI3MywgMHhFNDAxQkZBMiwgMHhCRkE0RTUwMSwgMHhFNTg2RTQwMCwKKzB4RTQwMDY1NUMsIDB4MkY1MEJGQTQsIDB4QkZBMUU0MDEsIDB4RTYwMkU1MDYsCisweDYwNjM0NjE4LCAweDgxRjJFNDAxLCAweDY1NDNCRjlGLCAweEU0MDE4NUYyLAorMHhCRkFCNjU0MywgMHg4NUYyNjYwMywgMHg2NTQzRTQwMSwgMHg2NjAzQkZCMSwKKzB4RTQwMjY1RjAsIDB4NjA1Mzc1NkMsIDB4ODBGOEJGODAsIDB4QkY4MkU0MDIsCisweDg0RjhFNTEyLCAweDcwOTBFNDAyLCAweDY1MDNCRjgyLCAweDQ2MThFNjAyLAorMHg4MUY2NjA2MywgMHhCRjgwRTQwMiwgMHg4NUY2RTUwMCwgMHg2NjAzRTQwMiwKKzB4RTUwMEJGOEMsIDB4RTQwMjg1RjYsIDB4QkY5MjY2MDMsIDB4RTVGRUU1MDAsCisweEUwMTA2NTVDLCAweEJGNjFFNDAzLCAweEU1MTMwRjU0LCAweEU0MEVCRjYzLAorMHgwNUZDRTAxMCwgMHhCRjYzRTQwRSwgMHhFNTAwNzU4NSwgMHhCRjY0RTQwMywKKzB4RTUwMEU2NDAsIDB4QkY3MUU0MDMsIDB4RTUwMEU2NDAsIDB4QkY3OEU0MDMsCisweEU1RkZFNjQwLCAweEUwMTQ2NTVDLCAweEJGNDdFNDA0LCAweEU0MEYwRjU0LAorMHhFNTA0QkY0OSwgMHgwNUZDRTAxNCwgMHhCRjQ5RTQwRiwgMHhFNTAxNzU4NCwKKzB4QkY0QUU2NDAsIDB4RTUwMUU0MDQsIDB4QkY1N0U2NDAsIDB4RTUwMUU0MDQsCisweEU0MDRFNjQwLCAweEFGNUM3RjE4LCAweDdGMTg0RjI2LCAweDAwMEI0RjI2LAorMHg0RjIyMDAwOSwgMHhEMjQyN0ZGMCwgMHg4ODAxNjAyMSwgMHhEMjQxOEI3MSwKKzB4MjY2ODY2MjEsIDB4RDI0MDhCNkQsIDB4MjY2ODY2MjEsIDB4RTUwRjhCNjksCisweEU0MDFCRjFDLCAweEJGMUVFNTAxLCAweEU1ODZFNDAwLCAweEU0MDA2NTVDLAorMHgyRjUwQkYxRSwgMHhCRjFCRTQwMSwgMHhFNDAxRTUwNiwgMHhCRjFDNjU0MywKKzB4RTQwMUU2NDAsIDB4QkYyOTY1NDMsIDB4RTQwMUU2NDAsIDB4QkYzMDY1NDMsCisweDY1RjBFNjQwLCAweDc1NkNFNDAyLCAweEJFRkY2MDUzLCAweEU0MDI4MEY0LAorMHhFNTEyQkYwMSwgMHhFNDAyODRGNCwgMHhCRjAxNzA5MCwgMHhFNjQwNjUwMywKKzB4QkYwMkU0MDIsIDB4RTY0MEU1MDAsIDB4QkYwRkU0MDIsIDB4RTY0MEU1MDAsCisweEJGMTZFNDAyLCAweEU1RkVFNTAwLCAweDYwNTM2NTVDLCAweEJFRTVFNDAzLAorMHhFNTEzODBGOCwgMHhFNDBFQkVFNywgMHhFNDBFODRGOCwgMHhCRUU3NzA4NSwKKzB4RTUwMDY1MDMsIDB4QkVFOEU2NDAsIDB4RTUwMEU0MDMsIDB4QkVGNUU2NDAsCisweEU1MDBFNDAzLCAweEJFRkNFNjQwLCAweEU1RkZFNDAzLCAweDYwNTM2NTVDLAorMHhCRUNCRTQwNCwgMHhFNDBGODBGQywgMHhFNTA0QkVDRCwgMHhFNDBGODRGQywKKzB4QkVDRDcwODMsIDB4RTUwMTY1MDMsIDB4QkVDRUU2NDAsIDB4RTUwMUU0MDQsCisweEJFREJFNjQwLCAweEU1MDFFNDA0LCAweEU0MDRFNjQwLCAweEFFRTA3RjEwLAorMHg3RjEwNEYyNiwgMHgwMDBCNEYyNiwgMHgwMDAwMDAwOSwgMHgwMDFFMTAyRiwKKzB4MDAxRTEwODAsIDB4MDAxRTEwOTAsIDB4MDAxRTEwM0YsIDB4MDAxRTEwM0UsCisweDAwMjAzOUMyLCAweDAwMjAzOUM0LCAweDAwMjAzOUM2LCAweEQyMUREMTFDLAorMHg2NjIwNjAxMCwgMHg2NzZDNzAwMSwgMHgzNzAwQzkwRiwgMHhFNTAwOEQxMywKKzB4NjcxMDYyMTAsIDB4NzcwMTYyMkMsIDB4NjQyMzIxNzAsIDB4RDYxNjYwMTAsCisweDQ0MDg0NDA4LCAweDM0MjhDOTBGLCAweDYyNjAyMTAwLCAweDcyMDFENTEzLAorMHg0NDA4MjYyMCwgMHgwMDBCMzU0QywgMHhEMTBGNjA1MywgMHgyNTU4NjUxMCwKKzB4RTYwMDhEMTMsIDB4RDYwREQ0MEIsIDB4NjU1QzY1NDAsIDB4NDcwODY3NTMsCisweDM3NTg0NzA4LCAweDQ3MDg2NTQwLCAweDI0NTA3NTAxLCAweDM2N0M2MDQwLAorMHgyNDAwQzkwRiwgMHg3MkZGNjIxMCwgMHgwMDBCMjEyMCwgMHgwMDAwNjA2MywKKzB4MDAyMDM5MEQsIDB4MDAyMDM5MEMsIDB4MDAyMDM5MEUsIDB4MDAyMDM1MzQsCisweDdGRkM0RjIyLCAweEU2ODBEMTlGLCAweDY2NkM2MjEyLCAweEQyOUUyRjIyLAorMHg2N0YzNjU2MywgMHg0MjBCNzU0MiwgMHg3RjA0RTQwNCwgMHgwMDBCNEYyNiwKKzB4RTY4MDAwMDksIDB4RDI5ODY2NkMsIDB4RTcwMDY1NjMsIDB4NDIyQjc1NDAsCisweEU2ODA2NDczLCAweEQyOTQ2NjZDLCAweEU3MDA2NTYzLCAweDQyMkI3NTQzLAorMHgyRjg2NjQ3MywgMHgyRkE2MkY5NiwgMHgyRkM2MkZCNiwgMHgyRkU2MkZENiwKKzB4N0ZDQzRGMjIsIDB4REM4RUQyOEQsIDB4NzIwMTFGMjEsIDB4REI4RDFGMjIsCisweEQxOEVERThELCAweDY2MTI1MjExLCAweDhCMDEzNjIwLCAweDAwMDlBMEU1LAorMHhDOTAzNjA2MSwgMHg4QjAxODgwMSwgMHgwMDA5QTBERiwgMHhEMjg4RDQ4NywKKzB4RUQ4NDQyMEIsIDB4MkYwMjU1MDMsIDB4MzBEMDg0NUMsIDB4QTBCODg5MDEsCisweEQxODQwMDA5LCAweDYyNkM2NjEwLCAweDg4MDE2MDIzLCAweEQxODI4QjY4LAorMHg2MjEwMUZDMywgMHg4OTVCMjIyOCwgMHhFMDAzRDQ4MCwgMHg0MDE4Njc0MiwKKzB4Njg0MjE3NzIsIDB4RDU3RUU5MDAsIDB4ODE4MTZEQjMsIDB4N0QwNDIxOTAsCisweDY3RDI2QUIyLCAweDY0RTI2ODUyLCAweDFGNDkxRjU3LCAweDc0MDQ2NEUzLAorMHgxRkE0NjU0MiwgMHg2NTQzMUY1QSwgMHg2MjUyNzVGOCwgMHgxRjc2MUZENSwKKzB4NkQ1MzFGMkIsIDB4REE3NEQ3NzMsIDB4N0Q5NEQyNzQsIDB4NjhEMjFGODgsCisweDZBQTI2OTcyLCAweEQxNzI2MDIyLCAweDIyMDJDQjIwLCAweEUxNDAxRjFDLAorMHg3NjAxRTYwMCwgMHgzMjEzNjI2RCwgMHg1NkY0OEJGQiwgMHg1MkY2NTFGNSwKKzB4MjEyMjJCNjIsIDB4NTJGODUxRjcsIDB4MjEyMjU2RjksIDB4MkU2MjUxRkEsCisweDUxRkIyNDEyLCAweDJEODIyNTEyLCAweEQ5NjYyNzkyLCAweDI5QTJERDVGLAorMHg2QUQyRDk2NSwgMHhEOTY0Njg5MiwgMHg2OEQyMUE4NCwgMHg2MDgxREE2MywKKzB4MjgwMUNCMDEsIDB4RDg2MjY2RDIsIDB4MkE2MjI5NjIsIDB4RUQwMTVBRkMsCisweDJBRDI0ODBCLCAweDJBRDI0RDE4LCAweDYyRDJERDVFLCAweDJEMjI3MjAxLAorMHhEMTUwNTZGMywgMHhFMjAyNjA2MiwgMHgyNjAyQ0IwMSwgMHgyMTIwQTAzRCwKKzB4OEIzQTIyMjgsIDB4RTQwMURENTgsIDB4MjE0MEU2MDAsIDB4RTAxQzJENjIsCisweEM4MDEwMDVDLCAweEQ0NTU4QjBBLCAweEU2MDBENzU1LCAweEVEN0QyNDcyLAorMHg2MjZDNzYwMSwgMHg4QkZCMzJEMywgMHgyNEQyREQ1MiwgMHhFMkZFNjhDMiwKKzB4MkM4MjI4MjksIDB4MDk1Q0UwMUUsIDB4RTAxRjVERjEsIDB4MEE1QzJEOTAsCisweDc1MTA1MUYyLCAweEVEMDYyMUEwLCAweEQ3NEJFNjAwLCAweDg0NTZENDRCLAorMHgyNzAwNzYwMSwgMHg2OTZDNjg1NCwgMHgyNDgwMzlEMywgMHg4RkY2NzQwMSwKKzB4REE0Nzc3MDEsIDB4MkExMEUxOTQsIDB4RTIwMDdBMDEsIDB4N0EwRjJBMjAsCisweEQxMzBFODA1LCAweDY2MTAyQTgwLCAweDYwMjM2MjZDLCAweDg5MDg4ODAxLAorMHhEMjQwRDQyQSwgMHg0MjBCNjVGMiwgMHhEMTMxRUQwMSwgMHhBRjMwNEQxOCwKKzB4NjVGMjIxRDIsIDB4ODU1M0Q0M0MsIDB4NjIwRDY2NDIsIDB4ODkwNzMyNjIsCisweEQxM0JENDNBLCAweDAwMDk0MTBCLCAweEU2MDFENzNBLCAweDI3NjJBRjFBLAorMHhEMTM0RDQxRSwgMHg0MTBCNjVGMiwgMHhEMTI1RUQwMSwgMHhENjM3RDQzNiwKKzB4NDYwQjREMTgsIDB4QUYwRDIxRDIsIDB4N0YzNDAwMDksIDB4NkVGNjRGMjYsCisweDZDRjY2REY2LCAweDZBRjY2QkY2LCAweDAwMEI2OUY2LCAweDRGMjI2OEY2LAorMHg4NTQ2N0ZGNCwgMHgyRjAxRTY4MSwgMHg2NjZDODU0NywgMHg4NTQ4ODFGMSwKKzB4ODFGMkQyMDksIDB4NjdGMzg1NDIsIDB4ODU0MzgxRjMsIDB4ODFGNEU0MEMsCisweDY1NjM2MDUzLCAweDQyMEI4MUY1LCAweDdGMEM3NTQwLCAweDAwMEI0RjI2LAorMHgwMDAwMDAwOSwgMHgwMDFDM0Q5QywgMHgwMDIwMjQ1QywgMHgwMDExNzc5QSwKKzB4MDAxQzM2RjgsIDB4MDAxQzNCOUMsIDB4MDAxQzM3MDQsIDB4MDAyMDM1MkMsCisweDAwMjAxNEEwLCAweDAwMjAzOTFELCAweDAwMjAzOTFDLCAweDAwMjAzOTE4LAorMHgwMDFDM0Q5OCwgMHgwMDFDM0JCNCwgMHgwMDFDNTk2MCwgMHgwMDFDMzUwMCwKKzB4MDAxQzNEMzAsIDB4MDAxQzg5NjAsIDB4MDAyMDM1MDQsIDB4MDAxQzNEMDAsCisweDAwMjAxNjBDLCAweDAwMTE3NzMwLCAweDAwMjAzOTIwLCAweDAwMUM1ODJDLAorMHgyMDAwQTAwMCwgMHgwMDAwQTAwMCwgMHgwMDExNzc4QywgMHgwMDExNzc5MiwKKzB4MDAxMTc3ODgsIDB4MDAyMDE0Q0MsIDB4MDAyMDM4RjQsIDB4MDAyMDM0RjQsCisweDAwMjAxNTMwLCAweDAwMUUyMTMwLCAweDAwMjAzRDg0LCAweDAwMjAxOEEyLAorMHgyRjk2MkY4NiwgMHgyRkI2MkZBNiwgMHgyRkQ2MkZDNiwgMHg0RjIyMkZFNiwKKzB4RDE5QjdGRUMsIDB4MkYxMkUwMDAsIDB4NjEwM0Q0OUEsIDB4MUY0MjgxRjIsCisweEREOUFEQTk5LCAweEQ2OUE2ODEzLCAweEUwMDE0ODA4LCAweDQ2MEJERTk5LAorMHgzOEVDNDgwMCwgMHg2NUEyMUYwMywgMHgzNTIwNTJBMSwgMHhBMjNFOEIwMSwKKzB4NjA1MTAwMDksIDB4ODgwMUM5MDMsIDB4QTIzODhCMDEsIDB4NTI1MzAwMDksCisweDMyRTBERTkxLCAweEQ5OTE4QjEwLCAweDY0QTM0OTBCLCAweDRCMEJEQjkwLAorMHhERTkwNjQwMywgMHhENzkxRDY5MCwgMHhFQzAxRDU5MSwgMHgyRTAyRTEwMCwKKzB4MjcxMDI2QzAsIDB4MjUwMkFGREYsIDB4QzgwMTg1NTEsIDB4QTE1NzhCMDEsCisweDYyNTEwMDA5LCAweDQyMDA2MjJELCAweDVFNTMzNjZBLCAweDg1RTIyMjZELAorMHhDOTAzNjQyQywgMHg4NUUzNjYwMywgMHg2MDUzNjUwRCwgMHg0MDIxNDAyMSwKKzB4NDUwMEM5M0YsIDB4MzIyQTY3MDMsIDB4NjA1MzI1MkQsIDB4QzkwMUQxN0YsCisweDYwMTA2QzAzLCAweDg4MDFEOTdGLCAweERCN0Y4QjA1LCAweDIxMjBFMjAwLAorMHhDQjAxNjBCMiwgMHhEMTdEMkIwMiwgMHg4ODAxNjAxMSwgMHg2NUEyOEIwQSwKKzB4OEQwNDI0NDgsIDB4OUI5RTYyNTEsIDB4QTAwMzIyQjksIDB4OTE5QjI1MjEsCisweDI1MjEyMjFCLCAweDM3QjNFQjEwLCAweDI0NDg4OTVFLCAweEQ0NzM4QjA3LAorMHgyMjI4NjI0MSwgMHg2MDYzODkwMywgMHhBMDU3ODFGOCwgMHhENTcwNjQ3MywKKzB4NDYwODQ2MDgsIDB4ODVFMjYyNzMsIDB4NDYwMDZCNTAsIDB4MzYyQzQyMDAsCisweDJCQjhDOTEwLCAweDhGMUY2NDYzLCAweDI2Njg2NjAzLCAweEQyNjk4OTExLAorMHgwNjJENjA0MywgMHg0MTE5NjE2RCwgMHg2QjBFNjAxOSwgMHg4MUY4MjBCRCwKKzB4ODgwMTYwQzMsIDB4NjQ2QzhGMkMsIDB4ODgwRjYwNzMsIDB4QTAyNzhCMUIsCisweEQyNjEwMDA5LCAweDA1MkQ2MDQzLCAweDQxMTk2MTVELCAweDY3MEU2MDE5LAorMHg2NDVDMjA3RCwgMHg4MUY4QTAxQywgMHg4OTBGMjY2OCwgMHg2MDQzRDI1QiwKKzB4NkI1RDA1MkQsIDB4NjBCOTRCMTksIDB4MjAxRDYxMEUsIDB4NjBDMzgxRjgsCisweDhGMEQ4ODAxLCAweDY0NzM2NDVDLCAweEVDMDBBMDBBLCAweDYwNDNEMjU0LAorMHg2MjVEMDUyRCwgMHg2MDI5NDIxOSwgMHgyMDdENjcwRSwgMHg4MUY4NjQ1QywKKzB4ODgwMjg1RjgsIDB4ODVFMTg5MEEsIDB4OEQwN0M4MjAsIDB4RTZEQzYyMDMsCisweDYwMjMyMjY5LCAweDgxRTFBMDAyLCAweDY0NENFNEZGLCAweDYyMTBEMTQ5LAorMHg4OTAxMjIyOCwgMHg2NDRDRTRGRiwgMHg2NTRERUJGRiwgMHgzNUIwNkJCQywKKzB4REIzNjhCMkIsIDB4NjRBMzRCMEIsIDB4NDEwQkQxMzUsIDB4NTQwMzY0MDMsCisweDg1NDQ2RTAzLCAweEM5NDhEQjQwLCAweERDNDA4ODA4LCAweEJFQUU4QjAxLAorMHg2NEIzRTUwMiwgMHg2NUUzNEMwQiwgMHhEQjNERUMwMSwgMHhEMTNEMkRDMiwKKzB4NjIxMjYwQjIsIDB4NzIwMTcwMDEsIDB4MjEyMjg4MDUsIDB4MkIwMjhGMDgsCisweDY2NkNFNjgwLCAweDY1NjNEMjM4LCAweDc1NDlFNzAwLCAweDY0NzM0MjBCLAorMHhBMDMwRDQzNiwgMHg3RkZGMDAwOSwgMHg4NUUyODAwMCwgMHgyMEI5RUJGQywKKzB4NjEwMzgxRTIsIDB4OTQyQTg1RTMsIDB4NjIwMzIwNDksIDB4NDUwODg1RjgsCisweDgxRTIyMDFCLCAweEM5MDE2MEMzLCAweDQwMDg0MDE4LCAweDQwMDg0MDA4LAorMHg0MDAwMjI1QiwgMHg2MDIzMjIwQiwgMHg4NUU0ODFFMywgMHg0MTE4RTEwOCwKKzB4ODFFNDIwMUIsIDB4RTQwMjYyQTIsIDB4MjBCOTg1MjEsIDB4NjdBMjgxMjEsCisweENCMDE2MDcxLCAweDg1RjgyNzAxLCAweDg5MDMzMDQyLCAweEVDRTc4NUUyLAorMHg4MUUyMjBDOSwgMHg0OTBCRDQxRSwgMHhBMDNCMDAwOSwgMHg3RTAzMDAwOSwKKzB4MDAxQzNEMzAsIDB4MDAyMDNEOTAsIDB4MDAyMDM1MDQsIDB4MDAxRTIxMkMsCisweDAwMjAzM0U4LCAweDAwMUMzRDAwLCAweDAwMTE3NzgwLCAweDAwMjAxNEEwLAorMHgwMDIwMTY2QywgMHgwMDExNzcwQywgMHgwMDIwMzkxQywgMHgwMDIwMzkxRCwKKzB4MDAyMDM5MTgsIDB4MDAyMDE4QTIsIDB4MDAxQzM2RjgsIDB4MDAyMDM5OTAsCisweDAwMjAzREEwLCAweDAwMjAzQjg0LCAweDAwMjAzQzA0LCAweDAwMjAzQzg0LAorMHgwMDIwM0QwNCwgMHgwMDIwMzkwOCwgMHgwMDIwMzRGQywgMHgwMDIwMTRDQywKKzB4MDAyMDM5OTQsIDB4MDAyMDM5OTgsIDB4MDAyMDI0NUMsIDB4MDAyMDNEODgsCisweDAwMjAzRDhDLCAweDYwMjI2MkYyLCAweDQwMDk0MDE5LCAweEM5MEY0MDA5LAorMHg4QjBCODgwQSwgMHg2MEUyREU4QywgMHg0MDA5NDAxOSwgMHhDOTBGNDAwOSwKKzB4OEIwMzg4MDgsIDB4Q0IwMTYwQTIsIDB4MjgwMkEwMDYsIDB4NjVFMkRFODcsCisweDJFNTI3NTAxLCAweDI4NjI2NkEyLCAweDUyRjM2NkYyLCAweDI2MjJBRTgzLAorMHhEMjgzODU1MSwgMHhERTgzQzgwMiwgMHhBMDk1OEIwMSwgMHg0MjBCMDAwOSwKKzB4NEUwQjY0QTMsIDB4NUUwMzY0MDMsIDB4ODVFNDY1MDMsIDB4NDkxOEU5MDgsCisweEQ3N0QyMDlCLCAweEUwNEM4MUU0LCAweERDN0MwQjdFLCAweDdCMDFEOTdDLAorMHg2MUMyMDdCNiwgMHg3MTAxNjY5MCwgMHg4RDA2MjY2OCwgMHhENDc5MkMxMiwKKzB4NDIwQkQyNzksIDB4QTA3MEVCMDEsIDB4NjI1MTJEQjIsIDB4NEIxOEVCMEYsCisweDIyQjlFMTAyLCAweDMyMTA0MTE4LCAweDg1NTE4QjBGLCAweDIwMjlFMkZDLAorMHg2MDUxODE1MSwgMHhDQjAxNzJFMCwgMHg4NUUxMjUwMSwgMHgyMDI5OTRBMywKKzB4ODVFNDgxRTEsIDB4QTA1MjIwNDksIDB4Njc1MTgxRTQsIDB4NDcxOTY3N0QsCisweDY2N0U2Nzc5LCAweDc3MDEyNzZELCAweDY5MDM2MDdDLCAweDg4MDE0OTE4LAorMHgyNTkxOEYzRSwgMHg2QjEyRDE2MSwgMHgyMUIyN0IwMSwgMHg2NjBEODVFMywKKzB4NDAyMTYwNjMsIDB4QzkzRjQwMjEsIDB4NkMwMzQ2MDAsIDB4MjYyRDMyMkEsCisweEM4MDE2MDYzLCAweERCNUVEMTVELCAweDk2N0Q4OTAxLCAweEU2MDAyQzZCLAorMHg2NjZDNjdDRCwgMHg0MDAwNjA2MywgMHg2MjJEMDIxRCwgMHg4RDBFMzI3MCwKKzB4NjA0MzY0MDMsIDB4RTlGRjAyMUQsIDB4OEIwMTMyOTAsIDB4MDFDNUEwMDcsCisweDYyNkM3NjAxLCAweDMyOTJFOTA0LCAweDY0NkM4QkVCLCAweDYwNDM0NDAwLAorMHhEMTUwMDRCRCwgMHgwQjQ1NzQwMSwgMHg2NjlENjkxMSwgMHg4OTA3MzY3MCwKKzB4NjAyRDYyMTEsIDB4ODkwMzg4RkYsIDB4RTIwMURCNEIsIDB4MkIyMDIxQzEsCisweEVDRkM4NTUxLCAweDgxNTEyMEM5LCAweENCMDE2MDUxLCAweERDNDcyNTAxLAorMHg2NEEzNEMwQiwgMHg1MUYzNjZGMiwgMHg4NUVGMjYxMiwgMHg1NEYyRDI0NCwKKzB4NjUwRDQyMEIsIDB4MDAwOUFERTcsIDB4RTUwMERDNDIsIDB4NDIwQjJDNTIsCisweDRFMEI2NEEzLCAweDU0MDM2NDAzLCAweDg1NDQ2RTAzLCAweDY3MDNFOTA4LAorMHg2NTAzNDkxOCwgMHgyNzk5ODU0MSwgMHhEQjMyMzc5MCwgMHg4RjBCRDkzMiwKKzB4NjAxMzYxMEQsIDB4OEIwN0M4MjAsIDB4Qzk0ODYwNTMsIDB4OEIwMzg4MDgsCisweEU1MDFCRDRELCAweDAwMDlBMDA1LCAweDIxMjhEMjMzLCAweEJENDY4OTAxLAorMHg2NEIzRTUwMCwgMHg0OTBCNjVFMywgMHhBREJDRUMwMSwgMHg4NUYyMkRDMiwKKzB4NzAwMUVFMDQsIDB4MzFFNzYxMEQsIDB4OEQwMjgxRjIsIDB4QURBOTdBMDgsCisweDdGMTQwMDA5LCAweDZFRjY0RjI2LCAweDZDRjY2REY2LCAweDZBRjY2QkY2LAorMHgwMDBCNjlGNiwgMHhGN0ZGNjhGNiwgMHgyRkU2ODAwMCwgMHhEMjIzNEYyMiwKKzB4NjBFMzZFMjIsIDB4OEQwMkM4NDAsIDB4QkJGOTIyRTIsIDB4RTI0MDAwMDksCisweDJFMjg0MjE4LCAweEJDMDQ4OTAxLCAweDYwRTMwMDA5LCAweDg5MDVDODEwLAorMHhEMjFDRDQxQiwgMHgwMDA5NDIwQiwgMHgwMDA5QkMwMywgMHhDODA1NjBFMywKKzB4QkQ2RDg5MDEsIDB4NjBFMzAwMDksIDB4ODkwMkM4MDIsIDB4QUMwMDRGMjYsCisweDRGMjY2RUY2LCAweDZFRjYwMDBCLCAweDAwMUMzRDNDLCAweDAwMTE3NzYwLAorMHgwMDIwMTRBMCwgMHgwMDIwMTY2QywgMHgwMDIwMzQ5NCwgMHgwMDIwM0RBNCwKKzB4MDAyMDM5MDgsIDB4MDAyMDM0RkMsIDB4MDAyMDE0Q0MsIDB4MDAyMDM5NzQsCisweDAwMjAzOTdDLCAweDAwMjAzOTcwLCAweDAwMjAzOTcyLCAweDAwMjAxNTMwLAorMHgwMDIwMThFRSwgMHgwMDIwMzk5NCwgMHgwMDAwODAwMCwgMHgwMDFDMzUxMCwKKzB4MDAyMDNEOTgsIDB4MDAyMDE4QTIsIDB4MDgwQTBDMEUsIDB4MDAwMjA0MDYsCisweDFBMUMxRTIwLCAweDEyMTQxNjE4LCAweDJFMzAzMjM0LCAweDI2MjgyQTJDLAorMHgzQTNDM0U0MCwgMHg2QzYyNTY0OCwgMHg0MTExMkYyNiwgMHhFMjIwOEYxOCwKKzB4ODkwQjMxMjMsIDB4MzIxQ0QyMDQsIDB4RDEwMjYyMjAsIDB4NDEyQjMxMkMsCisweDAwMDkwMDA5LCAweDAwMjAzNDEyLCAweDAwMjAzM0M4LCAweDAwMEJFMDAwLAorMHg0MDAwNjJGNiwgMHg0MDAwNDAwMCwgMHg0MDAwNDAwMCwgMHg0MDAwNDAwMCwKKzB4NjJGNjAwMEIsIDB4NDAwMDQwMDAsIDB4NDAwMDQwMDAsIDB4NDAwMDQwMDAsCisweDQwMTg0MDAwLCAweDYyRjYwMDBCLCAweDQwMDA0MDAwLCAweDQwMDA0MDAwLAorMHg0MDAwNDAwMCwgMHg0MDI4NDAwMCwgMHg2MkY2MDAwQiwgMHg0MDAwNDAwMCwKKzB4NDAxODQwMDAsIDB4MDAwQjQwMjgsIDB4QzkwRjYyRjYsIDB4NDAwNTQwMDUsCisweDQwMDU0MDA1LCAweDYyRjYwMDBCLCAweDQwMDVDOTA3LCAweDQwMDU0MDA1LAorMHg2MkY2MDAwQiwgMHg0MDA1QzkwMywgMHgwMDBCNDAwNSwgMHhDOTAxNjJGNiwKKzB4MDAwQjQwMDUsIDB4MDAwMDYyRjYsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4NTQ0RjBEMEEsIDB4NDYyMDUzNTUsIDB4MDAwMDNBNTcsCisweDIwNkM3NTRBLCAweDMyMjAzMTIwLCAweDIwMzgzMDMwLCAweDMyM0EzMTMyLAorMHgzNDMzM0EzOCwgMHgwMDAwMDAwMCwgMHgwMDAwMEQwQSwgMHgwMDAwMDA0MywKKzB4NDI3MDczNzIsIDB4M0QyMDY2NzUsIDB4NTU0RTIwM0QsIDB4MjAyQzRDNEMsCisweDZFNDk2NzdBLCAweDRFNDk3Mjc0LCAweDZENzU0RTUxLCAweDAwMDAwMDNELAorMHg2MTc2NkU0OSwgMHgyMDY0Njk2QywgMHg3MjY1NzM3NSwgMHgyMDcyNkYyMCwKKzB4MjA3OTY1NkIsIDB4MDAyMTQ0NDksIDB4NTI1MDQ1NDUsIDB4NTcyMDRENEYsCisweDY1NzQ2OTcyLCAweDY0NjEyMDJDLCAweDAwM0Q3MjY0LCAweDZDNjE3NjIwLAorMHgwMDAwMDAzRCwgMHgwMDAwMEEwRCwgMHg0MzVGNEQ1QSwgMHg0NjVGNDQ0RCwKKzB4NEM0NDVGNTcsIDB4NDk0RTQ5NUYsIDB4MDAwMDAwNTQsIDB4NkU2QjZFNTUsCisweDIwNkU3NzZGLCAweDZENkQ2RjYzLCAweDNENjQ2RTYxLCAweDAwMDAwMDAwLAorMHgyMDNBMzA1MSwgMHgwMDAwMDAyMCwgMHgyMDNBMzE1MSwgMHgwMDAwMDAyMCwKKzB4MjAzQTMyNTEsIDB4MDAwMDAwMjAsIDB4MjAzQTMzNTEsIDB4MDAwMDAwMjAsCisweDIwM0EzNDUxLCAweDAwMDAwMDIwLCAweDJCNDM0NzQxLCAweDczNjk2RjRFLAorMHg2MTQzMjA2NSwgMHg3MjYyNjk2QywgMHg2RjY5NzQ2MSwgMHg2MTY2MjA2RSwKKzB4NkYyMDZDNjksIDB4Njk3NDIwNkUsIDB4MEQwQTY1NkQsIDB4MDAwMDAwMDAsCisweDAwMDAwMDcyLCAweDAwMjA1MjIwLCAweDAwMDAwRDBBLCAweDYyNzM1NTc2LAorMHg3NDczNzI1RiwgMHgwMDAwMEEwRCwgMHg2MjczNTU3NiwgMHg3Mzc1NzM1RiwKKzB4NjQ2RTY1NzAsIDB4MDAwMDBBMEQsIDB4NjI3MzU1NzYsIDB4NzM2NTcyNUYsCisweDAwMEEwRDZELCAweDAwMDAwMDQ0LCAweDQ0Mzg3NTcwLCAweDcyNjM3MzY1LAorMHg2Rjc0NzA2OSwgMHgzRDU4NDU3MiwgMHgwMDAwMDAwMCwgMHgwMDAwMDA0NywKKzB4MDAwMDAwNDIsIDB4NzI3NDZFNDksIDB4NkQ2NTIwNTEsIDB4MkM3OTc0NzAsCisweDQ5Njc3QTIwLCAweDQ5NzI3NDZFLCAweDc1NEU1MTRFLCAweDAwMDAzRDZELAorMHg2NTRDNzI0NSwgMHgwMDAwMDA2RSwgMHgwMDAwMDA0OSwgMHgyMDc0NkY0RSwKKzB4NzU2RjZFNjUsIDB4NDkyMDY4NjcsIDB4NDIyMDUxNEUsIDB4MEEwRDY2NzUsCisweDAwMDAwMDAwLCAweDAwMDAwMEZGLCAweDAwMDIwMDAxLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAxMEUwMTBELCAweDAwMDIwMDAzLCAweDAxMDkwMTA4LAorMHgwMDAyMDEwQSwgMHgwMjAwMDAwMywgMHgwMjAyMDIwMSwgMHgwMjA0MDIwMywKKzB4MDIwNjAyMDUsIDB4MDIwMjAyMDAsIDB4MDIwNDAyMDMsIDB4MDIwQzAyMEIsCisweDAyMEUwMjBELCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDAwMDAwRkYsIDB4MDAwMjAwMDEsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDEwRTAxMEQsIDB4MDAwMjAwMDMsIDB4MDEwOTAxMDgsCisweDAwMDIwMTBBLCAweDAwMDMwMDAzLCAweDAyMDIwMjAxLCAweDAyMDQwMjAzLAorMHgwMjA2MDIwNSwgMHgwMjAyMDIwMCwgMHgwMjA0MDIwMywgMHgwMjBDMDIwQiwKKzB4MDIwRTAyMEQsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMTBFMDEwRCwgMHgwMEZGMDEwRiwgMHgwMTA5MDEwOCwKKzB4MDEwQjAxMEEsIDB4MDIwMDAxMEYsIDB4MDIwMjAyMDEsIDB4MDIwNDAyMDMsCisweDAyMDYwMjA1LCAweDAyMDIwMjAwLCAweDAyMDQwMjAzLCAweDAyMEMwMjBCLAorMHgwMjBFMDIwRCwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAxMEUwMTBELCAweDAwRkYwMTBGLCAweDAxMDkwMTA4LAorMHgwMTBCMDEwQSwgMHgwMTBGMDEwRiwgMHgwMjAyMDIwMSwgMHgwMjA0MDIwMywKKzB4MDIwNjAyMDUsIDB4MDIwMjAyMDAsIDB4MDIwNDAyMDMsIDB4MDIwQzAyMEIsCisweDAyMEUwMjBELCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDAyMDUyMjAsIDB4MDAwMDAwNDYsIDB4MDAwMDAwNTksCisweDczMjA0MTQyLCAweDAwM0Q3MTY1LCAweDQ5NTQ0MTIwLCAweDAwMDAyMDRELAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDJFMDIwOSwgMHg4MDAwMDEwMSwKKzB4MDAwNDA5RkEsIDB4MDBGRjA0MDAsIDB4MDUwNzAwMDAsIDB4MDIwMDAyMDEsCisweDgyMDUwNzAwLCAweDAwMDIwMDAyLCAweDAzODMwNTA3LCAweDA3MDEwMDQwLAorMHg0MDAzMDQwNSwgMHgwMjA5MDEwMCwgMHgwMTAxMDAyRSwgMHgwOUZBODAwMCwKKzB4MDQwMDAwMDQsIDB4MDAwMDAwRkYsIDB4MDIwMTA1MDcsIDB4MDcwMDAwNDAsCisweDQwMDI4MjA1LCAweDA1MDcwMDAwLCAweDAwNDAwMzgzLCAweDA0MDUwNzAxLAorMHgwMDAwNDAwMiwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwNzA5MDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKK307CisKK2NvbnN0IHUzMl90IHpjRndJbWFnZVNpemU9MTU5MzY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb3R1cy9oYWwvaHBmd3Vpbml0LmMgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy9oYWwvaHBmd3Vpbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ4MGZmYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL2hhbC9ocGZ3dWluaXQuYwpAQCAtMCwwICsxLDI0MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNy0yMDA4IEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisjaW5jbHVkZSAiLi4vODAyMTFjb3JlL2NwcmVjb21wLmgiCisKK2NvbnN0IHUzMl90IHpjRndJbWFnZVtdID0geworMHgwMDA5MDAwQiwgMHg3RkZDNEYyMiwgMHhENjk1RDQ5NCwgMHgwMDA5NDYwQiwKKzB4RDQ5NEU1NzAsIDB4NDUxOEIwMUUsIDB4ODkwNDIwMDgsIDB4RDY5MEQ0OTIsCisweDQ2MkI3RjA0LCAweEIwMTI0RjI2LCAweEQyOTAwMDA5LCAweDQyMEJENDkwLAorMHhFNjAwMDAwOSwgMHg5NDlBRDU4RiwgMHhDODQwNjA1MiwgMHgyRjAyOEYwMywKKzB4OEZGOTM2NDIsIDB4N0YwNDc2MDEsIDB4MDAwQjRGMjYsIDB4RDI4QTAwMDksCisweDAwMDk0MjJCLCAweDJGRDYyRkM2LCAweDRGMjIyRkU2LCAweEQ2ODc3RkVDLAorMHg2MjYwNjFGMywgMHgyRjIwODQ2MSwgMHg4NDYyODBGMSwgMHg4MEYyNzExMCwKKzB4NkQ0Mzg0NjMsIDB4ODQ2NDgwRjMsIDB4ODBGNDY0MTMsIDB4NkM1Mzg0NjUsCisweDg0NjY4MEY1LCAweDgwRjZFNTAwLCAweEQ3N0Q4NDY3LCAweDg0Njg4MEY3LAorMHg4MEY4RUUwNCwgMHg4MEY5ODQ2OSwgMHg4MEZBODQ2QSwgMHg4MEZCODQ2QiwKKzB4ODBGQzg0NkMsIDB4ODBGRDg0NkQsIDB4ODBGRTg0NkUsIDB4ODBGRjg0NkYsCisweDY2NTM2NTVDLCAweDc1MDEzNjdDLCAweDY2NUM2MjYwLCAweDI0MjAzNkUzLAorMHg3NDAxOEZGNiwgMHg2NkYzMkYxNiwgMHhFNzEwNzYwNCwgMHhCMDBENjVDMywKKzB4NkUwMzY0RDMsIDB4RDQ2QjdGMDQsIDB4NDIwQkQyNkIsIDB4NjBFMzY1MDMsCisweDRGMjY3RjE0LCAweDZERjY2RUY2LCAweDZDRjYwMDBCLCAweDJGQjYyRkE2LAorMHgyRkQ2MkZDNiwgMHg0RjIyMkZFNiwgMHgzRjNDOTMzQSwgMHg0MTA4RTE0MSwKKzB4MzFGQ0UyMDAsIDB4MTE3MzM1MjYsIDB4MjE1MjExNjIsIDB4MTE0MThEMDIsCisweEUwRkZBMDk4LCAweDRBMThFQTAxLCAweDI2MjA2NkYzLCAweDMyQTI3MjAxLAorMHg3NjAxOEZGQiwgMHg2QkUzRUUwMCwgMHhFMDQ0NkNGMywgMHgwMEZFNDAwOCwKKzB4NDUwQkQ1NTYsIDB4NjYwMzYxQjMsIDB4NDAwOEUwNDMsIDB4NkRDMDA0RkUsCisweDAxNEM2MDYzLCAweDMxRUMzRURDLCAweDYwRTM2RTFDLCAweDdCMDEwN0ZDLAorMHgyQzcwM0JBMiwgMHg4RkU4MEZENCwgMHhFMDQyN0MwMSwgMHhFQjAwNDAwOCwKKzB4NzBGQzA3RkUsIDB4NkVCMzZDQjMsIDB4QTAyMDBBRkUsIDB4MjcxMEVERkYsCisweDdDMDFGRUUwLCAweDYwQzM2Q0NDLCAweDY1NzAwMkZDLCAweDZCQkMzQjJDLAorMHgwMUZDNjBCMywgMHgwRjE0NjBDMywgMHgwRjI0NjBCMywgMHgwNEZDNjBDMywKKzB4MzQyQzdFMDEsIDB4MDFGQzYwNEMsIDB4MjUxQTYyRDMsIDB4RDQzQzIyNUEsCisweDI3NTA2MDJDLCAweDA2NEU0MDA4LCAweDJENkE0RDE5LCAweDNFQTI3NzAxLAorMHg2NkQ3OEJERiwgMHg0MDE4RTAwMSwgMHgwRjY0NjU2MywgMHg3MDAxNDUxOSwKKzB4MEY1NDQ2MjksIDB4MEY2NDcwMDEsIDB4NzAwMTQ2MTksIDB4OTA0MjBGNjQsCisweEUwNDUwRUZFLCAweEVBMDE0MDA4LCAweEUwNDYwRkY2LCAweDRBMTg0MDA4LAorMHhFRDAwNjdGMywgMHgwRkY2MzdBQywgMHgwRkY2NzAwNCwgMHhFMzQ1RTEwNCwKKzB4N0MwMTQzMDgsIDB4NkNDQzMzRkMsIDB4NjBDMzY0MzIsIDB4NTUzMTAyNEMsCisweDZCQkMzQjJDLCAweDA0NUM2MEIzLCAweDYwQzM1QTMyLCAweDYwQjMwQTQ0LAorMHg2MEMzMEYyNCwgMHg2QTcwMDZGQywgMHg2MDZDMzYyQywgMHg2NkUwMDVGQywKKzB4NkE1QzY0QUMsIDB4NjI2QzI0QUEsIDB4ODkwNTM0MjAsIDB4NEQwODREMDgsCisweENCMDQ2MEQzLCAweDYwMEJBMDA2LCAweDdEMDE0MTEwLCAweDhGRDY3NzAxLAorMHhFMDAwN0UwMSwgMHgzRjNDOTMwOCwgMHg2RUY2NEYyNiwgMHg2Q0Y2NkRGNiwKKzB4MDAwQjZCRjYsIDB4MDEzODZBRjYsIDB4MDAwMDAxMjAsIDB4MDAyMDBENTQsCisweDAwMjAwMkJFLCAweDAwMTAyODAwLCAweDAwMjAwRDY0LCAweDAwMTBGMDBBLAorMHgwMDEwRjAwMCwgMHgwMDFDMDAxQywgMHgwMDEwMzI1MiwgMHgwMDIwMERBMCwKKzB4MDAxMEZGRkMsIDB4MDAyMDBEN0MsIDB4MDAyMDAzMkMsIDB4MDAyMDAzNzAsCisweDAwMjAwOTU0LCAweDAwMDkwMDBCLCAweDJGRDYyRkM2LCAweDRGMjIyRkU2LAorMHg2RDQzNkM1MywgMHhFRTAwQTAwNCwgMHg3RTAxNjRENCwgMHg2NDRDQkZGMiwKKzB4OEJGOTNFQzIsIDB4NkVGNjRGMjYsIDB4MDAwQjZERjYsIDB4RTUwMDZDRjYsCisweDY2NDNBMDAyLCAweDc2MDE3NTAxLCAweDIyMjg2MjYwLCAweEFGRTM4QkZBLAorMHgyRkU2MDAwOSwgMHg3NTA3NjI1MywgMHhFMTA4Njc1MywgMHg2MDQzRUUwQSwKKzB4NDQwOUM5MEYsIDB4NjUwMzMwRTIsIDB4OEQwMTQ0MDksIDB4RTYzMEU2MzcsCisweDQxMTAzNjVDLCAweDhGRjIyNzYwLCAweEUwMDA3N0ZGLCAweDAwMEI4MDI4LAorMHg0RjIyNkVGNiwgMHhCRkU0N0ZFQywgMHhCRkQ4NjVGMywgMHg3RjE0NjRGMywKKzB4MDAwQjRGMjYsIDB4NEYyMkUwMDAsIDB4QkZEQTdGRUMsIDB4NjRGMzY1RjMsCisweDc0MDZCRkNELCAweDRGMjY3RjE0LCAweEUwMDAwMDBCLCAweDRGMjIyRkU2LAorMHg2MjUzN0ZFQywgMHg2NUYzNkU0MywgMHg2NDIzQkZDQiwgMHg2NEUzQkZCRiwKKzB4NjRGM0JGQkQsIDB4QkZCQUQ0MDMsIDB4N0YxNDAwMDksIDB4MDAwQjRGMjYsCisweDAwMDA2RUY2LCAweDAwMjAwREIwLCAweDg5MDA0MDExLCAweDQxMTE2MDBCLAorMHg0RjIyODkwNiwgMHg2MTFCQjAwNCwgMHgwMDBCNEYyNiwgMHgwMDA5NjAwQiwKKzB4NjIwRDJGMjYsIDB4OEY0MTMwMjAsIDB4NDAxODAwMTksIDB4OEIwRDMwMTYsCisweDMxMDQzMTA0LCAweDMxMDQzMTA0LCAweDMxMDQzMTA0LCAweDMxMDQzMTA0LAorMHg4OTAwNjJGNiwgMHg0MTE5MzEwQywgMHg2MDEzMDAwQiwgMHg0MTI5NjIxOSwKKzB4MjAwODQwMTgsIDB4MzEwNDg5MjcsIDB4MzEwNDMxMDQsIDB4MzEwNDMxMDQsCisweDMxMDQzMTA0LCAweDMxMDQzMTA0LCAweDMxMDQzMTA0LCAweDMxMDQzMTA0LAorMHgzMTA0MzEwNCwgMHg2MTE5MzEwNCwgMHgzMjA0MjIxRCwgMHgzMjA0MzIwNCwKKzB4MzIwNDMyMDQsIDB4MzIwNDMyMDQsIDB4MzIwNDMyMDQsIDB4MzIwNDMyMDQsCisweDMyMDQzMjA0LCAweDMyMDQzMjA0LCAweDg5MDAzMjA0LCAweDQyMjkzMjBDLAorMHgwMDBCNjAyMywgMHhFMDAwNjJGNiwgMHg2MkY2MDAwQiwgMHg0MjI4NjIxMywKKzB4NDIyNDQxMjksIDB4NDIyNDMxMDQsIDB4NDIyNDMxMDQsIDB4NDIyNDMxMDQsCisweDQyMjQzMTA0LCAweDQyMjQzMTA0LCAweDQyMjQzMTA0LCAweDQyMjQzMTA0LAorMHg0MjI0MzEwNCwgMHg0MjI0MzEwNCwgMHg0MjI0MzEwNCwgMHg0MjI0MzEwNCwKKzB4NDIyNDMxMDQsIDB4NDIyNDMxMDQsIDB4NDIyNDMxMDQsIDB4NDIyNDMxMDQsCisweDg5MDAzMTA0LCAweDYwMTMzMTBDLCAweDYyRjYwMDBCLCAweDJGMjYyRjE2LAorMHg1MUY1NTJGMywgMHg1MkYyMjEyOSwgMHg1MkY0MTIxMCwgMHgyMTI5NTFGNiwKKzB4MTIxMTUyRjIsIDB4MDAwQjYyRjYsIDB4MDAwMDYxRjYsIDB4NTFGMzJGMTYsCisweDMxMDA1MEYxLCAweDUxRjQ4QjAyLCAweDMxMDA1MEYyLCAweDAwMEIwMDI5LAorMHgwMDAwNjFGNiwgMHg1MUYzMkYxNiwgMHgzMTAwNTBGMSwgMHg1MUY0OEIwNiwKKzB4MzEwMDUwRjIsIDB4Q0EwMTAwMjksIDB4NjFGNjAwMEIsIDB4MDAwQkUwMDEsCisweDAwMDA2MUY2LCAweDUwRjAwMDBCLCAweDJGMjYyRjE2LCAweEUxMDA1MkYyLAorMHgxMjAwMTIxMSwgMHgwMDBCNjJGNiwgMHgwMDAwNjFGNiwgMHgyRjE2MkYwNiwKKzB4OEIyNjQxMTUsIDB4MzEwM0UwNDAsIDB4MkYyNjg5MkIsIDB4NTJGNjJGMzYsCisweEUwMjA1M0Y1LCAweDhCMDUzMTAzLCAweEUzMDA2MjMzLCAweDg5MDkzMTAwLAorMHgzMTA4QTAwMiwgMHg4QjBGMjMzOCwgMHhEMDA2NEYyMiwgMHg2MDIzNDAwQiwKKzB4NEYyNjYyMDMsIDB4MTEyMTUxRjQsIDB4NjNGNjExMzAsIDB4NjFGNjYyRjYsCisweDYwRjYwMDBCLCAweDAwMjAwN0Y0LCAweDQxMDBDNzA5LCAweDAxMjMwMTFELAorMHg1MUYyMDAwOSwgMHgxMTAxNTBGNCwgMHgxMTAwNTBGMywgMHgwMDBCNjFGNiwKKzB4NTFGMjYwRjYsIDB4MTEwMUUwMDAsIDB4NjFGNjExMDAsIDB4NjBGNjAwMEIsCisweDAxMzAwMDAwLCAweDAxMjgwMTJDLCAweDAxMjAwMTI0LCAweDAxMTgwMTFDLAorMHgwMTA2MDEwQSwgMHgwMEZFMDEwMiwgMHgwMEUyMDBFNiwgMHgwMERBMDBERSwKKzB4MDBDQzAwRDAsIDB4MDBDNDAwQzgsIDB4MDBBODAwQUMsIDB4MDBBMDAwQTQsCisweDAwOEMwMDkwLCAweDAwODQwMDg4LCAweDAwNjYwMDZBLCAweDAwNUUwMDYyLAorMHg0MjI0NDMwMCwgMHg0MjI0NDMwMCwgMHg0MjI0NDMwMCwgMHg0MzI4NjEzMywKKzB4NDMwODQzMTgsIDB4NDIyODQzMDgsIDB4NDIwODQyMTgsIDB4NDEwOTQyMDgsCisweEFGQUY0MTA5LCAweDQzMDAyMjFCLCAweDQzMDA0MjI0LCAweDQzMDA0MjI0LAorMHg2MTMzNDIyNCwgMHg0MzE4NDMyOCwgMHg0MjE4NDIyOCwgMHhBRkExNDExOSwKKzB4NDMwMDIyMUIsIDB4NDMwMDQyMjQsIDB4NDMwMDQyMjQsIDB4NjEzMzQyMjQsCisweDQzMDg0MzI4LCAweDQyMjg0MzA4LCAweDQyMDg0MjA4LCAweDQxMDk0MTE5LAorMHhBRjhGNDEwOSwgMHg0MzAwMjIxQiwgMHg0MzAwNDIyNCwgMHg0MzAwNDIyNCwKKzB4NjEzMzQyMjQsIDB4MjEyRDQzMjgsIDB4NjIxM0FGODQsIDB4NDIyNDQzMDAsCisweDQyMjQ0MzAwLCAweDQyMjQ0MzAwLCAweDQzMTg2MTMzLCAweDQzMDg0MzA4LAorMHg0MjA4NDIxOCwgMHg0MTI5NDIwOCwgMHg0MTA5NDEwOSwgMHgyMjFCQUY3MiwKKzB4NDIyNDQzMDAsIDB4NDIyNDQzMDAsIDB4NDIyNDQzMDAsIDB4NDMxODYxMzMsCisweDQxMjk0MjE4LCAweEFGNjU0MTE5LCAweDQzMDAyMjFCLCAweDQzMDA0MjI0LAorMHg0MzAwNDIyNCwgMHg0MzAwNDIyNCwgMHg0MzAwNDIyNCwgMHg0MzAwNDIyNCwKKzB4NDMwMDQyMjQsIDB4NDIyNEFGNTYsIDB4MkYxNjJGMDYsIDB4OEIyNjQxMTUsCisweDMxMDNFMDQwLCAweDJGMjY4OTJCLCAweDUyRjYyRjM2LCAweEUwMjA1M0Y1LAorMHg4QjA1MzEwMywgMHhFMjAwNjMyMywgMHg4OTA5MzEwMCwgMHgzMTA4QTAwMiwKKzB4OEIwRjIyMjgsIDB4RDAwNjRGMjIsIDB4NjAzMzQwMEIsIDB4NEYyNjYzMDMsCisweDExMjE1MUY0LCAweDYzRjYxMTMwLCAweDYxRjY2MkY2LCAweDYwRjYwMDBCLAorMHgwMDIwMDhCNCwgMHg0MTAwQzcwOSwgMHgwMTIzMDExRCwgMHg1MUYyMDAwOSwKKzB4MTEwMTUwRjQsIDB4MTEwMDUwRjMsIDB4MDAwQjYxRjYsIDB4NTFGMjYwRjYsCisweDExMDFFMDAwLCAweDYxRjYxMTAwLCAweDYwRjYwMDBCLCAweDAxMkUwMDAwLAorMHgwMTI2MDEyQSwgMHgwMTFFMDEyMiwgMHgwMTE2MDExQSwgMHgwMTA0MDEwOCwKKzB4MDBGQzAxMDAsIDB4MDBFMDAwRTQsIDB4MDBEODAwREMsIDB4MDBDQzAwRDAsCisweDAwQzQwMEM4LCAweDAwQTgwMEFDLCAweDAwQTAwMEE0LCAweDAwOEMwMDkwLAorMHgwMDg0MDA4OCwgMHgwMDY2MDA2QSwgMHgwMDVFMDA2MiwgMHg0MzI1NDIwMSwKKzB4NDMyNTQyMDEsIDB4NDMyNTQyMDEsIDB4NDIyOTYxMjMsIDB4NDIwOTQyMTksCisweDQzMjk0MjA5LCAweDQzMDk0MzE5LCAweDQxMDg0MzA5LCAweEFGQUY0MTA4LAorMHg0MjAxMjMxQiwgMHg0MjAxNDMyNSwgMHg0MjAxNDMyNSwgMHg2MTIzNDMyNSwKKzB4NDIxOTQyMjksIDB4NDMxOTQzMjksIDB4QUZBMTQxMTgsIDB4NDIwMTIzMUIsCisweDQyMDE0MzI1LCAweDQyMDE0MzI1LCAweDYxMjM0MzI1LCAweDQyMDk0MjI5LAorMHg0MzI5NDIwOSwgMHg0MzA5NDMwOSwgMHg0MTA4NDExOCwgMHhBRjhGNDEwOCwKKzB4NDIwMTIzMUIsIDB4NDIwMTQzMjUsIDB4NDIwMTQzMjUsIDB4NjEyMzQzMjUsCisweEFGODU0MjI5LCAweDQyMDEyMzFELCAweDQyMDE0MzI1LCAweDQyMDE0MzI1LAorMHg2MTIzNDMyNSwgMHg0MjA5NDIxOSwgMHg0MzE5NDIwOSwgMHg0MzA5NDMwOSwKKzB4NDEwODQxMjgsIDB4QUY3MzQxMDgsIDB4NDIwMTIzMUIsIDB4NDIwMTQzMjUsCisweDQyMDE0MzI1LCAweDYxMjM0MzI1LCAweDQzMTk0MjE5LCAweDQxMTg0MTI4LAorMHgyMzFCQUY2NiwgMHg0MzI1NDIwMSwgMHg0MzI1NDIwMSwgMHg0MzI1NDIwMSwKKzB4NDMyNTQyMDEsIDB4NDMyNTQyMDEsIDB4NDMyNTQyMDEsIDB4QUY1NzQyMDEsCisweDAwMDA0MzI1LCAweDA4MEEwQzBFLCAweDAwMDIwNDA2LCAweDFBMUMxRTIwLAorMHgxMjE0MTYxOCwgMHgyRTMwMzIzNCwgMHgyNjI4MkEyQywgMHgzQTNDM0U0MCwKKzB4NkM2MjU2NDgsIDB4NDExMTJGMjYsIDB4RTIyMDhGMTgsIDB4ODkwQjMxMjMsCisweDMyMUNEMjA0LCAweEQxMDI2MjIwLCAweDQxMkIzMTJDLCAweDAwMDkwMDA5LAorMHgwMDIwMDgxRSwgMHgwMDIwMDdENCwgMHgwMDBCRTAwMCwgMHg0MDAwNjJGNiwKKzB4NDAwMDQwMDAsIDB4NDAwMDQwMDAsIDB4NDAwMDQwMDAsIDB4NjJGNjAwMEIsCisweDQwMDA0MDAwLCAweDQwMDA0MDAwLCAweDQwMDA0MDAwLCAweDQwMTg0MDAwLAorMHg2MkY2MDAwQiwgMHg0MDAwNDAwMCwgMHg0MDAwNDAwMCwgMHg0MDAwNDAwMCwKKzB4NDAyODQwMDAsIDB4NjJGNjAwMEIsIDB4NDAwMDQwMDAsIDB4NDAxODQwMDAsCisweDAwMEI0MDI4LCAweEM5MEY2MkY2LCAweDQwMDU0MDA1LCAweDQwMDU0MDA1LAorMHg2MkY2MDAwQiwgMHg0MDA1QzkwNywgMHg0MDA1NDAwNSwgMHg2MkY2MDAwQiwKKzB4NDAwNUM5MDMsIDB4MDAwQjQwMDUsIDB4QzkwMTYyRjYsIDB4MDAwQjQwMDUsCisweDAwMDA2MkY2LCAweDA4MEEwQzBFLCAweDAwMDIwNDA2LCAweDFBMUMxRTIwLAorMHgxMjE0MTYxOCwgMHgyRTMwMzIzNCwgMHgyNjI4MkEyQywgMHgzQTNDM0U0MCwKKzB4NkM2MjU2NDgsIDB4NDExMTJGMjYsIDB4RTIyMDhGMTgsIDB4ODkwQjMxMjMsCisweDMyMUNEMjA0LCAweEQxMDI2MjIwLCAweDQxMkIzMTJDLCAweDAwMDkwMDA5LAorMHgwMDIwMDhERSwgMHgwMDIwMDg5NCwgMHgwMDBCRTAwMCwgMHg0MDAxNjJGNiwKKzB4NDAwMTQwMDEsIDB4NDAwMTQwMDEsIDB4NDAwMTQwMDEsIDB4NjJGNjAwMEIsCisweDQwMDE0MDAxLCAweDQwMDE0MDAxLCAweDQwMDE0MDAxLCAweDQwMTk0MDAxLAorMHg2MkY2MDAwQiwgMHg0MDAxNDAwMSwgMHg0MDAxNDAwMSwgMHg0MDAxNDAwMSwKKzB4NDAyOTQwMDEsIDB4NjJGNjAwMEIsIDB4NDAwMTQwMDEsIDB4NDAxOTQwMDEsCisweDAwMEI0MDI5LCAweDQwMDQ2MkY2LCAweDQwMDQ0MDA0LCAweEM5MEY0MDA0LAorMHg2MkY2MDAwQiwgMHg0MDA0NDAwNCwgMHhDOTA3NDAwNCwgMHg2MkY2MDAwQiwKKzB4NDAwNDQwMDQsIDB4MDAwQkM5MDMsIDB4NDAwNDYyRjYsIDB4MDAwQkM5MDEsCisweDAwMDA2MkY2LCAweDAwMDAwMDAwLCAweDc3MDczMDk2LCAweEVFMEU2MTJDLAorMHg5OTA5NTFCQSwgMHgwNzZEQzQxOSwgMHg3MDZBRjQ4RiwgMHhFOTYzQTUzNSwKKzB4OUU2NDk1QTMsIDB4MEVEQjg4MzIsIDB4NzlEQ0I4QTQsIDB4RTBENUU5MUUsCisweDk3RDJEOTg4LCAweDA5QjY0QzJCLCAweDdFQjE3Q0JELCAweEU3QjgyRDA3LAorMHg5MEJGMUQ5MSwgMHgxREI3MTA2NCwgMHg2QUIwMjBGMiwgMHhGM0I5NzE0OCwKKzB4ODRCRTQxREUsIDB4MUFEQUQ0N0QsIDB4NkREREU0RUIsIDB4RjRENEI1NTEsCisweDgzRDM4NUM3LCAweDEzNkM5ODU2LCAweDY0NkJBOEMwLCAweEZENjJGOTdBLAorMHg4QTY1QzlFQywgMHgxNDAxNUM0RiwgMHg2MzA2NkNEOSwgMHhGQTBGM0Q2MywKKzB4OEQwODBERjUsIDB4M0I2RTIwQzgsIDB4NEM2OTEwNUUsIDB4RDU2MDQxRTQsCisweEEyNjc3MTcyLCAweDNDMDNFNEQxLCAweDRCMDRENDQ3LCAweEQyMEQ4NUZELAorMHhBNTBBQjU2QiwgMHgzNUI1QThGQSwgMHg0MkIyOTg2QywgMHhEQkJCQzlENiwKKzB4QUNCQ0Y5NDAsIDB4MzJEODZDRTMsIDB4NDVERjVDNzUsIDB4RENENjBEQ0YsCisweEFCRDEzRDU5LCAweDI2RDkzMEFDLCAweDUxREUwMDNBLCAweEM4RDc1MTgwLAorMHhCRkQwNjExNiwgMHgyMUI0RjRCNSwgMHg1NkIzQzQyMywgMHhDRkJBOTU5OSwKKzB4QjhCREE1MEYsIDB4MjgwMkI4OUUsIDB4NUYwNTg4MDgsIDB4QzYwQ0Q5QjIsCisweEIxMEJFOTI0LCAweDJGNkY3Qzg3LCAweDU4Njg0QzExLCAweEMxNjExREFCLAorMHhCNjY2MkQzRCwgMHg3NkRDNDE5MCwgMHgwMURCNzEwNiwgMHg5OEQyMjBCQywKKzB4RUZENTEwMkEsIDB4NzFCMTg1ODksIDB4MDZCNkI1MUYsIDB4OUZCRkU0QTUsCisweEU4QjhENDMzLCAweDc4MDdDOUEyLCAweDBGMDBGOTM0LCAweDk2MDlBODhFLAorMHhFMTBFOTgxOCwgMHg3RjZBMERCQiwgMHgwODZEM0QyRCwgMHg5MTY0NkM5NywKKzB4RTY2MzVDMDEsIDB4NkI2QjUxRjQsIDB4MUM2QzYxNjIsIDB4ODU2NTMwRDgsCisweEYyNjIwMDRFLCAweDZDMDY5NUVELCAweDFCMDFBNTdCLCAweDgyMDhGNEMxLAorMHhGNTBGQzQ1NywgMHg2NUIwRDlDNiwgMHgxMkI3RTk1MCwgMHg4QkJFQjhFQSwKKzB4RkNCOTg4N0MsIDB4NjJERDFEREYsIDB4MTVEQTJENDksIDB4OENEMzdDRjMsCisweEZCRDQ0QzY1LCAweDREQjI2MTU4LCAweDNBQjU1MUNFLCAweEEzQkMwMDc0LAorMHhENEJCMzBFMiwgMHg0QURGQTU0MSwgMHgzREQ4OTVENywgMHhBNEQxQzQ2RCwKKzB4RDNENkY0RkIsIDB4NDM2OUU5NkEsIDB4MzQ2RUQ5RkMsIDB4QUQ2Nzg4NDYsCisweERBNjBCOEQwLCAweDQ0MDQyRDczLCAweDMzMDMxREU1LCAweEFBMEE0QzVGLAorMHhERDBEN0NDOSwgMHg1MDA1NzEzQywgMHgyNzAyNDFBQSwgMHhCRTBCMTAxMCwKKzB4QzkwQzIwODYsIDB4NTc2OEI1MjUsIDB4MjA2Rjg1QjMsIDB4Qjk2NkQ0MDksCisweENFNjFFNDlGLCAweDVFREVGOTBFLCAweDI5RDlDOTk4LCAweEIwRDA5ODIyLAorMHhDN0Q3QThCNCwgMHg1OUIzM0QxNywgMHgyRUI0MEQ4MSwgMHhCN0JENUMzQiwKKzB4QzBCQTZDQUQsIDB4RURCODgzMjAsIDB4OUFCRkIzQjYsIDB4MDNCNkUyMEMsCisweDc0QjFEMjlBLCAweEVBRDU0NzM5LCAweDlERDI3N0FGLCAweDA0REIyNjE1LAorMHg3M0RDMTY4MywgMHhFMzYzMEIxMiwgMHg5NDY0M0I4NCwgMHgwRDZENkEzRSwKKzB4N0E2QTVBQTgsIDB4RTQwRUNGMEIsIDB4OTMwOUZGOUQsIDB4MEEwMEFFMjcsCisweDdEMDc5RUIxLCAweEYwMEY5MzQ0LCAweDg3MDhBM0QyLCAweDFFMDFGMjY4LAorMHg2OTA2QzJGRSwgMHhGNzYyNTc1RCwgMHg4MDY1NjdDQiwgMHgxOTZDMzY3MSwKKzB4NkU2QjA2RTcsIDB4RkVENDFCNzYsIDB4ODlEMzJCRTAsIDB4MTBEQTdBNUEsCisweDY3REQ0QUNDLCAweEY5QjlERjZGLCAweDhFQkVFRkY5LCAweDE3QjdCRTQzLAorMHg2MEIwOEVENSwgMHhENkQ2QTNFOCwgMHhBMUQxOTM3RSwgMHgzOEQ4QzJDNCwKKzB4NEZERkYyNTIsIDB4RDFCQjY3RjEsIDB4QTZCQzU3NjcsIDB4M0ZCNTA2REQsCisweDQ4QjIzNjRCLCAweEQ4MEQyQkRBLCAweEFGMEExQjRDLCAweDM2MDM0QUY2LAorMHg0MTA0N0E2MCwgMHhERjYwRUZDMywgMHhBODY3REY1NSwgMHgzMTZFOEVFRiwKKzB4NDY2OUJFNzksIDB4Q0I2MUIzOEMsIDB4QkM2NjgzMUEsIDB4MjU2RkQyQTAsCisweDUyNjhFMjM2LCAweENDMEM3Nzk1LCAweEJCMEI0NzAzLCAweDIyMDIxNkI5LAorMHg1NTA1MjYyRiwgMHhDNUJBM0JCRSwgMHhCMkJEMEIyOCwgMHgyQkI0NUE5MiwKKzB4NUNCMzZBMDQsIDB4QzJEN0ZGQTcsIDB4QjVEMENGMzEsIDB4MkNEOTlFOEIsCisweDVCREVBRTFELCAweDlCNjRDMkIwLCAweEVDNjNGMjI2LCAweDc1NkFBMzlDLAorMHgwMjZEOTMwQSwgMHg5QzA5MDZBOSwgMHhFQjBFMzYzRiwgMHg3MjA3Njc4NSwKKzB4MDUwMDU3MTMsIDB4OTVCRjRBODIsIDB4RTJCODdBMTQsIDB4N0JCMTJCQUUsCisweDBDQjYxQjM4LCAweDkyRDI4RTlCLCAweEU1RDVCRTBELCAweDdDRENFRkI3LAorMHgwQkRCREYyMSwgMHg4NkQzRDJENCwgMHhGMUQ0RTI0MiwgMHg2OEREQjNGOCwKKzB4MUZEQTgzNkUsIDB4ODFCRTE2Q0QsIDB4RjZCOTI2NUIsIDB4NkZCMDc3RTEsCisweDE4Qjc0Nzc3LCAweDg4MDg1QUU2LCAweEZGMEY2QTcwLCAweDY2MDYzQkNBLAorMHgxMTAxMEI1QywgMHg4RjY1OUVGRiwgMHhGODYyQUU2OSwgMHg2MTZCRkZEMywKKzB4MTY2Q0NGNDUsIDB4QTAwQUUyNzgsIDB4RDcwREQyRUUsIDB4NEUwNDgzNTQsCisweDM5MDNCM0MyLCAweEE3NjcyNjYxLCAweEQwNjAxNkY3LCAweDQ5Njk0NzRELAorMHgzRTZFNzdEQiwgMHhBRUQxNkE0QSwgMHhEOUQ2NUFEQywgMHg0MERGMEI2NiwKKzB4MzdEODNCRjAsIDB4QTlCQ0FFNTMsIDB4REVCQjlFQzUsIDB4NDdCMkNGN0YsCisweDMwQjVGRkU5LCAweEJEQkRGMjFDLCAweENBQkFDMjhBLCAweDUzQjM5MzMwLAorMHgyNEI0QTNBNiwgMHhCQUQwMzYwNSwgMHhDREQ3MDY5MywgMHg1NERFNTcyOSwKKzB4MjNEOTY3QkYsIDB4QjM2NjdBMkUsIDB4QzQ2MTRBQjgsIDB4NUQ2ODFCMDIsCisweDJBNkYyQjk0LCAweEI0MEJCRTM3LCAweEMzMEM4RUExLCAweDVBMDVERjFCLAorMHgyRDAyRUY4RCwgMHg1NDRGMEQwQSwgMHg1MDIwNTM1NSwgMHgyMDMxMkQ0OCwKKzB4MDAzQTU3NDYsIDB4NzI2MzY1NjQsIDB4Njk3NDcwNzksIDB4NjUyMDZFNkYsCisweDcyNkY3MjcyLCAweDBBMEQyMTIxLCAweDAwMDAwMDAwLCAweDY1NjQ2NjdBLAorMHg3MDc5NzI2MywgMHg2NTcyNUY3NCwgMHg2MTZDNzU2NywgMHg3OTcyNkY3NCwKKzB4NjI2MTc0NUYsIDB4NzIyMDY1NkMsIDB4MjAzRDc0NjUsIDB4MDAwMDAwMDAsCisweDQ1NDg1NDQxLCAweDM4NzMxNjUyLCAweDg5QUNGRjkxLCAweEVFNTVEMTc4LAorMHhFRTAwMEQwQSwgfTsKKworY29uc3QgdTMyX3QgemNGd0ltYWdlU2l6ZT0zNTA4OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvaGFsL2hwbWFpbi5jIGIvZHJpdmVycy9zdGFnaW5nL290dXMvaGFsL2hwbWFpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlNjVjNDYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy9oYWwvaHBtYWluLmMKQEAgLTAsMCArMSw0NjQzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggQXRoZXJvcyBDb21tdW5pY2F0aW9ucyBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKyNpbmNsdWRlICIuLi84MDIxMWNvcmUvY3ByZWNvbXAuaCIKKyNpbmNsdWRlICJocGFuaS5oIgorI2luY2x1ZGUgImhwdXNiLmgiCisjaW5jbHVkZSAib3R1cy5pbmkiCisKK2V4dGVybiBjb25zdCB1MzJfdCB6Y0Z3SW1hZ2VbXTsKK2V4dGVybiBjb25zdCB1MzJfdCB6Y0Z3SW1hZ2VTaXplOworZXh0ZXJuIGNvbnN0IHUzMl90IHpjREtGd0ltYWdlW107CitleHRlcm4gY29uc3QgdTMyX3QgemNES0Z3SW1hZ2VTaXplOworZXh0ZXJuIGNvbnN0IHUzMl90IHpjRndJbWFnZVNQSVtdOworZXh0ZXJuIGNvbnN0IHUzMl90IHpjRndJbWFnZVNQSVNpemU7CisKKyNpZmRlZiBaTV9PVFVTX0xJTlVYX1BIQVNFXzIKK2V4dGVybiBjb25zdCB1MzJfdCB6Y0Z3QnVmSW1hZ2VbXTsKK2V4dGVybiBjb25zdCB1MzJfdCB6Y0Z3QnVmSW1hZ2VTaXplOworZXh0ZXJuIGNvbnN0IHUzMl90IHpjUDJGd0ltYWdlW107CitleHRlcm4gY29uc3QgdTMyX3QgemNQMkZ3SW1hZ2VTaXplOworI2VuZGlmCitleHRlcm4gdm9pZCB6ZkluaXRDbWRRdWV1ZSh6ZGV2X3QqIGRldik7CitleHRlcm4gdTE2X3QgemZJc3N1ZUNtZCh6ZGV2X3QqIGRldiwgdTMyX3QqIGNtZCwgdTE2X3QgY21kTGVuLAorICAgICAgICB1MTZfdCBzcmMsIHU4X3QqIGJ1Zik7CitleHRlcm4gdm9pZCB6ZklkbFJzcCh6ZGV2X3QqIGRldiwgdTMyX3QqIHJzcCwgdTE2X3QgcnNwTGVuKTsKK2V4dGVybiB1MTZfdCB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyh6ZGV2X3QqIGRldiwgdTMyX3QgYWRkciwgdTMyX3QgdmFsKTsKK2V4dGVybiB1MTZfdCB6ZkZsdXNoRGVsYXlXcml0ZSh6ZGV2X3QqIGRldik7CitleHRlcm4gdm9pZCB6ZlVzYkluaXQoemRldl90KiBkZXYpOworZXh0ZXJuIHUxNl90IHpmRmlybXdhcmVEb3dubG9hZCh6ZGV2X3QqIGRldiwgdTMyX3QqIGZ3LCB1MzJfdCBsZW4sIHUzMl90IG9mZnNldCk7CitleHRlcm4gdTE2X3QgemZGaXJtd2FyZURvd25sb2FkTm90SnVtcCh6ZGV2X3QqIGRldiwgdTMyX3QqIGZ3LCB1MzJfdCBsZW4sIHUzMl90IG9mZnNldCk7CitleHRlcm4gdm9pZCB6ZlVzYkZyZWUoemRldl90KiBkZXYpOworZXh0ZXJuIHUxNl90IHpmQ3dtSXNFeHRDaGFuQnVzeSh1MzJfdCBjdGxCdXN5LCB1MzJfdCBleHRCdXN5KTsKK2V4dGVybiB2b2lkIHpmQ29yZUN3bUJ1c3koemRldl90KiBkZXYsIHUxNl90IGJ1c3kpOworCisvKiBQcm90b3R5cGVzICovCit2b2lkIHpmSW5pdFJmKHpkZXZfdCogZGV2LCB1MzJfdCBmcmVxdWVuY3kpOwordm9pZCB6ZkluaXRQaHkoemRldl90KiBkZXYsIHUzMl90IGZyZXF1ZW5jeSwgdThfdCBidzQwKTsKK3ZvaWQgemZJbml0TWFjKHpkZXZfdCogZGV2KTsKKwordm9pZCB6ZlNldFBvd2VyQ2FsVGFibGUoemRldl90KiBkZXYsIHUzMl90IGZyZXF1ZW5jeSwgdThfdCBidzQwLCB1OF90IGV4dE9mZnNldCk7Cit2b2lkIHpmSW5pdFBvd2VyQ2FsKHpkZXZfdCogZGV2KTsKKworI2lmZGVmIFpNX0RSVl9JTklUX1VTQl9NT0RFCit2b2lkIHpmSW5pdFVzYk1vZGUoemRldl90KiBkZXYpOwordTE2X3QgemZIcFVzYlJlc2V0KHpkZXZfdCogZGV2KTsKKyNlbmRpZgorCisvKiBCYW5rIDAgMSAyIDMgNSA2IDcgKi8KK3ZvaWQgemZTZXRSZlJlZ3MoemRldl90KiBkZXYsIHUzMl90IGZyZXF1ZW5jeSk7CisvKiBCYW5rIDQgKi8KK3ZvaWQgemZTZXRCYW5rNEFuZFBvd2VyVGFibGUoemRldl90KiBkZXYsIHUzMl90IGZyZXF1ZW5jeSwgdThfdCBidzQwLAorICAgICAgICB1OF90IGV4dE9mZnNldCk7CisvKiBHZXQgcGFyYW0gZm9yIHR1cm5vZmZkeW4gKi8KK3ZvaWQgemZHZXRId1R1cm5PZmZkeW5QYXJhbSh6ZGV2X3QqIGRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfdCBmcmVxdWVuY3ksIHU4X3QgYnc0MCwgdThfdCBleHRPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBkZWx0YV9zbG9wZV9jb2VmZl9leHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBkZWx0YV9zbG9wZV9jb2VmZl9tYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBkZWx0YV9zbG9wZV9jb2VmZl9leHBfc2hnaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGRlbHRhX3Nsb3BlX2NvZWZmX21hbl9zaGdpKTsKKwordm9pZCB6ZlNlbEFkY0Nsayh6ZGV2X3QqIGRldiwgdThfdCBidzQwLCB1MzJfdCBmcmVxdWVuY3kpOwordTMyX3QgemZIcEVjaG9Db21tYW5kKHpkZXZfdCogZGV2LCB1MzJfdCB2YWx1ZSk7CisKKworCisjZGVmaW5lIHptX2hwX3ByaXYoeCkgKCgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+eCkKK3N0cnVjdCB6c0hwUHJpdiB6Z0hwUHJpdjsKKworI2RlZmluZSBaTV9GSVJNV0FSRV9XTEFOX0FERFIgICAgICAgICAgIDB4MjAwMDAwCisjZGVmaW5lIFpNX0ZJUk1XQVJFX1NQSV9BRERSICAgICAgMHgxMTQwMDAKKy8qIDA6IHJlYWwgY2hpcCAgICAgMTogRlBHQSB0ZXN0ICovCisjZGVmaW5lIFpNX0ZQR0FfUEhZICAwCisKKyNkZWZpbmUgcmVnX3dyaXRlKGFkZHIsIHZhbCkgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBhZGRyKzB4MWJjMDAwLCB2YWwpCisjZGVmaW5lIHptX21pbihBLCBCKSAoKEE+Qik/IEI6QSkKKworCisvKioqKioqKioqKioqKioqKioqKiogSW50aWFsaXphdGlvbiAqKioqKioqKioqKioqKioqKioqKi8KK3UxNl90IHpmSHBJbml0KHpkZXZfdCogZGV2LCB1MzJfdCBmcmVxdWVuY3kpCit7CisgICAgdTE2X3QgcmV0OworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIC8qIEluaXRpYWxpemEgSEFMIFBsdXMgcHJpdmF0ZSB2YXJpYWJsZXMgKi8KKyAgICB3ZC0+aHBQcml2YXRlID0gJnpnSHBQcml2OworCisgICAgKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5oYWxDYXBhYmlsaXR5ID0gWk1fSFBfQ0FQXzExTjsKKworICAgICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+aHdGcmVxdWVuY3kgPSAwOworICAgICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+aHdCdzQwID0gMDsKKyAgICAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmh3RXh0T2Zmc2V0ID0gMDsKKworICAgICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+ZGlzYWJsZURmc0NoID0gMDsKKworICAgICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+bGVkTW9kZVswXSA9IDE7CisgICAgKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5sZWRNb2RlWzFdID0gMTsKKyAgICAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPnN0cm9uZ1JTU0kgPSAwOworICAgICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+cnhTdHJvbmdSU1NJID0gMDsKKworICAgICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+c2xvdFR5cGUgPSAxOworICAgICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+YWdnUGt0TnVtID0gMHgxMDAwMGE7CisKKyAgICAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmVlcHJvbUltYWdlSW5kZXggPSAwOworCisKKyAgICAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmVlcHJvbUltYWdlUmRSZXEgICAgID0gMDsKKyNpZmRlZiBaTV9PVFVTX1JYX1NUUkVBTV9NT0RFCisgICAgKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5yZW1haW5CdWYgPSBOVUxMOworICAgICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+dXNiUnhSZW1haW5MZW4gPSAwOworICAgICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+dXNiUnhQa3RMZW4gPSAwOworICAgICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+dXNiUnhQYWRMZW4gPSAwOworICAgICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+dXNiUnhUcmFuc2ZlckxlbiA9IDA7CisjZW5kaWYKKworICAgICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+ZW5hYmxlQkJIZWF2eUNsaXAgPSAxOworICAgICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+aHdCQkhlYXZ5Q2xpcCAgICAgPSAxOyAvLyBmb3JjZSBlbmFibGUgODEwNworICAgICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+ZG9CQkhlYXZ5Q2xpcCAgICAgPSAwOworICAgICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+c2V0VmFsdWVIZWF2eUNsaXAgPSAwOworCisKKyAgICAvKiBJbml0aWFsaXplIGRyaXZlciBjb3JlICovCisgICAgemZJbml0Q21kUXVldWUoZGV2KTsKKworICAgIC8qIEluaXRpYWxpemUgVVNCICovCisgICAgemZVc2JJbml0KGRldik7CisKKyNpZiBaTV9TV19MT09QX0JBQ0sgIT0gMQorCisgICAgLyogVE9ETyA6IFtEb3dubG9hZCBGV10gKi8KKyAgICBpZiAod2QtPm1vZGVNREtFbmFibGUpCisgICAgeworICAgICAgICAvKiBkb3dubG9hZCB0aGUgTURLIGZpcm13YXJlICovCisgICAgICAgIGlmICgocmV0ID0gemZGaXJtd2FyZURvd25sb2FkKGRldiwgKHUzMl90Kil6Y0RLRndJbWFnZSwKKyAgICAgICAgICAgICAgICAodTMyX3QpemNES0Z3SW1hZ2VTaXplLCBaTV9GSVJNV0FSRV9XTEFOX0FERFIpKSAhPSBaTV9TVUNDRVNTKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBUT0RPIDogZXhjZXB0aW9uIGhhbmRsaW5nICovCisgICAgICAgICAgICAvL3JldHVybiAxOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgI2lmbmRlZiBaTV9PVFVTX0xJTlVYX1BIQVNFXzIKKyAgICAgICAgLyogZG9ud2xvYWQgdGhlIG5vcm1hbCBmcmltd2FyZSAqLworICAgICAgICBpZiAoKHJldCA9IHpmRmlybXdhcmVEb3dubG9hZChkZXYsICh1MzJfdCopemNGd0ltYWdlLAorICAgICAgICAgICAgICAgICh1MzJfdCl6Y0Z3SW1hZ2VTaXplLCBaTV9GSVJNV0FSRV9XTEFOX0FERFIpKSAhPSBaTV9TVUNDRVNTKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBUT0RPIDogZXhjZXB0aW9uIGhhbmRsaW5nICovCisgICAgICAgICAgICAvL3JldHVybiAxOworICAgICAgICB9CisgICAgI2Vsc2UKKworICAgICAgICAvLyAxLVBIIGZ3OiBSZWFkTWFjKCkgc3RvcmUgc29tZSBnbG9iYWwgdmFyaWFibGUKKyAgICAgICAgaWYgKChyZXQgPSB6ZkZpcm13YXJlRG93bmxvYWROb3RKdW1wKGRldiwgKHUzMl90Kil6Y0Z3QnVmSW1hZ2UsCisgICAgICAgICAgICAgICAgKHUzMl90KXpjRndCdWZJbWFnZVNpemUsIDB4MTAyODAwKSkgIT0gWk1fU1VDQ0VTUykKKyAgICAgICAgeworICAgICAgICAgICAgRGJnUHJpbnQoIkRsIHpjRndCdWZJbWFnZSBmYWlsZWQhIik7CisgICAgICAgIH0KKworICAgICAgICB6ZndTbGVlcChkZXYsIDEwMDApOworCisgICAgICAgIGlmICgocmV0ID0gemZGaXJtd2FyZURvd25sb2FkKGRldiwgKHUzMl90Kil6Y0Z3SW1hZ2UsCisgICAgICAgICAgICAgICAgKHUzMl90KXpjRndJbWFnZVNpemUsIFpNX0ZJUk1XQVJFX1dMQU5fQUREUikpICE9IFpNX1NVQ0NFU1MpCisgICAgICAgIHsKKyAgICAgICAgICAgIERiZ1ByaW50KCJEbCB6Y0Z3QnVmSW1hZ2UgZmFpbGVkISIpOworICAgICAgICB9CisgICAgI2VuZGlmCisgICAgfQorI2VuZGlmCisKKyNpZmRlZiBaTV9EUlZfSU5JVF9VU0JfTU9ERQorICAgIC8qIEluaXQgVVNCIE1vZGUgKi8KKyAgICB6ZkluaXRVc2JNb2RlKGRldik7CisKKyAgICAvKiBEbyB0aGUgVVNCIFJlc2V0ICovCisgICAgemZIcFVzYlJlc2V0KGRldik7CisjZW5kaWYKKworLyogUmVnaXN0ZXIgc2V0dGluZyAqLworLyogWk1fRFJJVkVSX01PREVMX1RZUEVfTURLCisgKiAgMT0+Zm9yIE1ESywgZGlzYWJsZSBpbml0IFJGLCBQSFksIGFuZCBNQUMsCisgKiAgMD0+bm9ybWFsIGluaXQKKyAqLworLy8jaWYgKChaTV9TV19MT09QX0JBQ0sgIT0gMSkgJiYgKFpNX0RSSVZFUl9NT0RFTF9UWVBFX01ESyAhPTEpKQorI2lmIFpNX1NXX0xPT1BfQkFDSyAhPSAxCisgICAgaWYoIXdkLT5tb2RlTURLRW5hYmxlKQorICAgIHsKKyAgICAgICAgLyogSW5pdCBNQUMgKi8KKyAgICAgICAgemZJbml0TWFjKGRldik7CisKKyAgICAjaWYgWk1fRldfTE9PUF9CQUNLICE9IDEKKyAgICAgICAgLyogSW5pdCBQSFkgKi8KKyAgICAgICAgemZJbml0UGh5KGRldiwgZnJlcXVlbmN5LCAwKTsKKworICAgICAgICAvKiBJbml0IFJGICovCisgICAgICAgIHpmSW5pdFJmKGRldiwgZnJlcXVlbmN5KTsKKworICAgICAgICAjaWYgWk1fRlBHQV9QSFkgPT0gMAorICAgICAgICAvKiBCcmluZ1VwIGlzc3VlICovCisgICAgICAgIC8vemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDk4MDArMHgxYmMwMDAsIDB4MTAwMDAwMDcpOworICAgICAgICAvL3pmRmx1c2hEZWxheVdyaXRlKGRldik7CisgICAgICAgICNlbmRpZgorCisgICAgI2VuZGlmIC8qIGVuZCBvZiBaTV9GV19MT09QX0JBQ0sgIT0gMSAqLworICAgIH0KKyNlbmRpZiAvKiBlbmQgb2YgKChaTV9TV19MT09QX0JBQ0sgIT0gMSkgJiYgKFpNX0RSSVZFUl9NT0RFTF9UWVBFX01ESyAhPTEpKSAqLworCisgICAgemZIcEVjaG9Db21tYW5kKGRldiwgMHhBQUJCQ0NERCk7CisKKyAgICByZXR1cm4gMDsKK30KKworCit1MTZfdCB6ZkhwUmVpbml0KHpkZXZfdCogZGV2LCB1MzJfdCBmcmVxdWVuY3kpCit7CisgICAgdTE2X3QgcmV0OworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+aGFsUmVJbml0ID0gMTsKKworICAgICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+c3Ryb25nUlNTSSA9IDA7CisgICAgKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5yeFN0cm9uZ1JTU0kgPSAwOworCisjaWZkZWYgWk1fT1RVU19SWF9TVFJFQU1fTU9ERQorICAgIGlmICgoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPnJlbWFpbkJ1ZiAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgemZ3QnVmRnJlZShkZXYsICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+cmVtYWluQnVmLCAwKTsKKyAgICB9CisgICAgKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5yZW1haW5CdWYgPSBOVUxMOworICAgICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+dXNiUnhSZW1haW5MZW4gPSAwOworICAgICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+dXNiUnhQa3RMZW4gPSAwOworICAgICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+dXNiUnhQYWRMZW4gPSAwOworICAgICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+dXNiUnhUcmFuc2ZlckxlbiA9IDA7CisjZW5kaWYKKworICAgIHpmSW5pdENtZFF1ZXVlKGRldik7CisgICAgemZDb3JlUmVpbml0KGRldik7CisKKyAgICAjaWZuZGVmIFpNX09UVVNfTElOVVhfUEhBU0VfMgorICAgIC8qIERvd25sb2FkIGZpcm13YXJlICovCisgICAgaWYgKChyZXQgPSB6ZkZpcm13YXJlRG93bmxvYWQoZGV2LCAodTMyX3QqKXpjRndJbWFnZSwKKyAgICAgICAgICAgICh1MzJfdCl6Y0Z3SW1hZ2VTaXplLCBaTV9GSVJNV0FSRV9XTEFOX0FERFIpKSAhPSBaTV9TVUNDRVNTKQorICAgIHsKKyAgICAgICAgLyogVE9ETyA6IGV4Y2VwdGlvbiBoYW5kbGluZyAqLworICAgICAgICAvL3JldHVybiAxOworICAgIH0KKyAgICAjZWxzZQorICAgIGlmICgocmV0ID0gemZGaXJtd2FyZURvd25sb2FkKGRldiwgKHUzMl90Kil6Y1AyRndJbWFnZSwKKyAgICAgICAgICAgICh1MzJfdCl6Y1AyRndJbWFnZVNpemUsIFpNX0ZJUk1XQVJFX1dMQU5fQUREUikpICE9IFpNX1NVQ0NFU1MpCisgICAgeworICAgICAgICAvKiBUT0RPIDogZXhjZXB0aW9uIGhhbmRsaW5nICovCisgICAgICAgIC8vcmV0dXJuIDE7CisgICAgfQorICAgICNlbmRpZgorCisjaWZkZWYgWk1fRFJWX0lOSVRfVVNCX01PREUKKyAgICAvKiBJbml0IFVTQiBNb2RlICovCisgICAgemZJbml0VXNiTW9kZShkZXYpOworCisgICAgLyogRG8gdGhlIFVTQiBSZXNldCAqLworICAgIHpmSHBVc2JSZXNldChkZXYpOworI2VuZGlmCisKKyAgICAvKiBJbml0IE1BQyAqLworICAgIHpmSW5pdE1hYyhkZXYpOworCisgICAgLyogSW5pdCBQSFkgKi8KKyAgICB6ZkluaXRQaHkoZGV2LCBmcmVxdWVuY3ksIDApOworICAgIC8qIEluaXQgUkYgKi8KKyAgICB6ZkluaXRSZihkZXYsIGZyZXF1ZW5jeSk7CisKKyAgICAjaWYgWk1fRlBHQV9QSFkgPT0gMAorICAgIC8qIEJyaW5nVXAgaXNzdWUgKi8KKyAgICAvL3pmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHg5ODAwKzB4MWJjMDAwLCAweDEwMDAwMDA3KTsKKyAgICAvL3pmRmx1c2hEZWxheVdyaXRlKGRldik7CisgICAgI2VuZGlmCisKKyAgICB6ZkhwRWNob0NvbW1hbmQoZGV2LCAweEFBQkJDQ0REKTsKKworICAgIHJldHVybiAwOworfQorCisKK3UxNl90IHpmSHBSZWxlYXNlKHpkZXZfdCogZGV2KQoreworICAgIC8qIEZyZWUgVVNCIHJlc291cmNlICovCisgICAgemZVc2JGcmVlKGRldik7CisKKyAgICByZXR1cm4gMDsKK30KKworLyogTURLIG1vZGUgc2V0dGluZyBmb3IgZG9udFJldHJhbnNtaXQgKi8KK3ZvaWQgemZIcENvbmZpZ0ZNKHpkZXZfdCogZGV2LCB1MzJfdCBSeE1heFNpemUsIHUzMl90IERvbnRSZXRyYW5zbWl0KQoreworICAgIHUzMl90IGNtZFszXTsKKyAgICB1MTZfdCByZXQ7CisKKyAgICBjbWRbMF0gPSA4IHwgKFpNX0NNRF9DT05GSUcgPDwgOCk7CisgICAgY21kWzFdID0gUnhNYXhTaXplOyAgICAgICAgICAvKiB6Z1J4TWF4U2l6ZSAqLworICAgIGNtZFsyXSA9IERvbnRSZXRyYW5zbWl0OyAgICAgLyogemdEb250UmV0cmFuc21pdCAqLworCisgICAgcmV0ID0gemZJc3N1ZUNtZChkZXYsIGNtZCwgMTIsIFpNX09JRF9JTlRFUk5BTF9XUklURSwgMCk7Cit9CisKK2NvbnN0IHU4X3QgemNYcGRUb1BkWzE2XSA9Cit7CisgLyogMHgwLCAweDEsIDB4MiwgMHgzLCAweDQsIDB4NSwgMHg2LCAweDcsIDB4OCwgMHg5LCAweEEsIDB4QiwgMHhDLCAweEQsIDB4RSwgMHhGICovCisgICAgMHgyLCAweDIsIDB4MiwgMHgxLCAweDIsIDB4MiwgMHg2LCAweDIsIDB4MiwgMHgzLCAweDcsIDB4MiwgMHhCLCAweDIsIDB4MiwgMHgyCit9OworCisvKioqKioqKioqKioqKioqKioqKiogUkYgYW5kIFBIWSAqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCB6ZkluaXRQaHkoemRldl90KiBkZXYsICB1MzJfdCBmcmVxdWVuY3ksIHU4X3QgYnc0MCkKK3sKKyAgICB1MTZfdCBpLCBqLCBrOworICAgIHUxNl90IGVudHJpZXM7CisgICAgdTE2X3QgbW9kZXNJbmRleCA9IDA7CisgICAgdTE2X3QgZnJlcUluZGV4ID0gMDsKKyAgICB1MzJfdCB0bXAsIHRtcDE7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworICAgIHN0cnVjdCB6c0hwUHJpdiogaHBQcml2PXdkLT5ocFByaXZhdGU7CisgICAgdTMyX3QgZWVwcm9tQm9hcmREYXRhWzE1XVs2XSA9IHsKKyAgICAvKiBSZWdpc3RlciAgIEEtMjAgICAgICAgIEEtMjAvNDAgICAgIEctMjAvNDAgICAgIEctMjAgICAgICAgIEctVHVyYm8gICAgKi8KKyAgICAgICAgezB4OTk2NCwgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwfSwKKyAgICAgICAgezB4OTk2MCwgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwfSwKKyAgICAgICAgezB4Yjk2MCwgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwfSwKKyAgICAgICAgezB4OTg0NCwgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwfSwKKyAgICAgICAgezB4OTg1MCwgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwfSwKKyAgICAgICAgezB4OTgzNCwgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwfSwKKyAgICAgICAgezB4OTgyOCwgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwfSwKKyAgICAgICAgezB4Yzg2NCwgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwfSwKKyAgICAgICAgezB4OTg0OCwgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwfSwKKyAgICAgICAgezB4Yjg0OCwgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwfSwKKyAgICAgICAgezB4YTIwYywgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwfSwKKyAgICAgICAgezB4YzIwYywgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwfSwKKyAgICAgICAgezB4OTkyMCwgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwfSwKKyAgICAgICAgezB4YjkyMCwgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwfSwKKyAgICAgICAgezB4YTI1OCwgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwfSwKKyAgICB9OworCisgICAgLyogIzEgU2F2ZSB0aGUgaW5pdGlhbCB2YWx1ZSBvZiB0aGUgcmVsYXRlZCBSSUZTIHJlZ2lzdGVyIHNldHRpbmdzICovCisgICAgLy8oKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmlzSW5pdGlhbFBoeSsrOworCisgICAgLyoKKyAgICAgKiBTZXR1cCB0aGUgaW5kaWNlcyBmb3IgdGhlIG5leHQgc2V0IG9mIHJlZ2lzdGVyIGFycmF5IHdyaXRlcworICAgICAqIFBIWSBtb2RlIGlzIHN0YXRpYzIwIC8gMjA0MAorICAgICAqIEZyZXF1ZW5jeSBpcyAyLjRHSHogKEIpIC8gNUdIeiAoQSkKKyAgICAgKi8KKyAgICBpZiAoIGZyZXF1ZW5jeSA+IFpNX0NIX0dfMTQgKQorICAgIHsKKyAgICAgICAgLyogNUdIeiAqLworICAgICAgICBmcmVxSW5kZXggID0gMTsKKyAgICAgICAgaWYgKGJ3NDApCisgICAgICAgIHsKKyAgICAgICAgICAgIG1vZGVzSW5kZXggPSAyOworICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiaW5pdCBhcjU0MTZNb2RlcyBpbiAyOiBBLTIwLzQwIik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBtb2Rlc0luZGV4ID0gMTsKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzAoImluaXQgYXI1NDE2TW9kZXMgaW4gMTogQS0yMCIpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qIDIuNEdIeiAqLworICAgICAgICBmcmVxSW5kZXggID0gMjsKKyAgICAgICAgaWYgKGJ3NDApCisgICAgICAgIHsKKyAgICAgICAgICAgIG1vZGVzSW5kZXggPSAzOworICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiaW5pdCBhcjU0MTZNb2RlcyBpbiAzOiBHLTIwLzQwIik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBtb2Rlc0luZGV4ID0gNDsKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzAoImluaXQgYXI1NDE2TW9kZXMgaW4gNDogRy0yMCIpOworICAgICAgICB9CisgICAgfQorCisKKyNpZiBaTV9GUEdBX1BIWSA9PSAxCisgICAgLyogU3RhcnRpbmcgRXh0ZXJuYWwgSGFpbmFuIFJlZ2lzdGVyIEluaXRpYWxpemF0aW9uICovCisgICAgLyogVE9ETzogKi8KKworICAgIHpmd1NsZWVwKGRldiwgMTApOworI2VuZGlmCisKKyAgICAvKgorICAgICAqU2V0IGNvcnJlY3QgQmFzZWJhbmQgdG8gYW5hbG9nIHNoaWZ0IHNldHRpbmcgdG8gYWNjZXNzIGFuYWxvZyBjaGlwcy4KKyAgICAgKi8KKyAgICAvL3JlZ193cml0ZShQSFlfQkFTRSwgMHgwMDAwMDAwNyk7CisvLyAgICByZWdfd3JpdGUoMHg5ODAwLCAweDAwMDAwMDA3KTsKKworICAgIC8qCisgICAgICogV3JpdGUgYWRkYWMgc2hpZnRzCisgICAgICovCisgICAgIC8vIGRvIHRoaXMgaW4gZmlybXdhcmUKKworCisKKyAgICAvKiBaZXJvaXplIGJvYXJkIGRhdGEgKi8KKyAgICBmb3IgKGo9MDsgajwxNTsgaisrKQorICAgIHsKKyAgICAgICAgZm9yIChrPTE7IGs8PTQ7IGsrKykKKyAgICAgICAgeworICAgICAgICAgICAgZWVwcm9tQm9hcmREYXRhW2pdW2tdID0gMDsKKyAgICAgICAgfQorICAgIH0KKyAgICAgLyoKKyAgICAgKiBSZWdpc3RlciBzZXR0aW5nIGJ5IG1vZGUKKyAgICAgKi8KKworICAgIGVudHJpZXMgPSBzaXplb2YoYXI1NDE2TW9kZXMpIC8gc2l6ZW9mKCphcjU0MTZNb2Rlcyk7CisgICAgem1fbXNnMV9zY2FuKFpNX0xWXzIsICJNb2RlcyByZWdpc3RlciBzZXR0aW5nIGVudHJpZXM9IiwgZW50cmllcyk7CisgICAgZm9yIChpPTA7IGk8ZW50cmllczsgaSsrKQorICAgIHsKKyNpZiAwCisgICAgICAgIGlmICggKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5od05vdEZpcnN0SW5pdCAmJiAoYXI1NDE2TW9kZXNbaV1bMF0gPT0gMHhhMjdjKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIEZvcmNlIGRpc2FibGUgQ1I2NzEgYml0MjAgLyA3ODIzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgLyogVGhlIGJ1ZyBoYXMgdG8gZG8gd2l0aCB0aGUgcG9sYXJpdHkgb2YgdGhlIHBkYWRjIG9mZnNldCBjYWxpYnJhdGlvbi4gIFRoZXJlICovCisgICAgICAgICAgICAvKiBpcyBhbiBpbml0aWFsIGNhbGlicmF0aW9uIHRoYXQgaXMgT0ssIGFuZCB0aGVyZSBpcyBhIGNvbnRpbnVvdXMgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIC8qIGNhbGlicmF0aW9uIHRoYXQgdXBkYXRlcyB0aGUgcGRkYWMgd2l0aCB0aGUgd3JvbmcgcG9sYXJpdHkuICBGb3J0dW5hdGVseSAgICAqLworICAgICAgICAgICAgLyogdGhlIHNlY29uZCBsb29wIGNhbiBiZSBkaXNhYmxlZCB3aXRoIGEgYml0IGNhbGxlZCBlbl9wZF9kY19vZmZzZXRfdGhyLiAgICAgICovCisKKyAgICAgICAgICAgIHJlZ193cml0ZShhcjU0MTZNb2Rlc1tpXVswXSwgKGFyNTQxNk1vZGVzW2ldW21vZGVzSW5kZXhdJiAweGZmZWZmZmZmKSApOworICAgICAgICAgICAgKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5od05vdEZpcnN0SW5pdCA9IDE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisjZW5kaWYKKyAgICAgICAgICAgIC8qIEZpcnN0VGltZSBJbml0IG9yIG5vdCAweGEyN2MoQ1I2NzEpICovCisgICAgICAgICAgICByZWdfd3JpdGUoYXI1NDE2TW9kZXNbaV1bMF0sIGFyNTQxNk1vZGVzW2ldW21vZGVzSW5kZXhdKTsKKy8vICAgICAgICB9CisgICAgICAgIC8qIEluaXRpYWxpemUgYm9hcmQgZGF0YSAqLworICAgICAgICBmb3IgKGo9MDsgajwxNTsgaisrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoYXI1NDE2TW9kZXNbaV1bMF0gPT0gZWVwcm9tQm9hcmREYXRhW2pdWzBdKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvciAoaz0xOyBrPD00OyBrKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBlZXByb21Cb2FyZERhdGFbal1ba10gPSBhcjU0MTZNb2Rlc1tpXVtrXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLyogIzEgU2F2ZSB0aGUgaW5pdGlhbCB2YWx1ZSBvZiB0aGUgcmVsYXRlZCBSSUZTIHJlZ2lzdGVyIHNldHRpbmdzICovCisgICAgICAgIC8vaWYoICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+aXNJbml0aWFsUGh5ID09IDEgKQorICAgICAgICB7CisgICAgICAgICAgICBzd2l0Y2goYXI1NDE2TW9kZXNbaV1bMF0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSAweDk4NTAgOgorICAgICAgICAgICAgICAgICAgICAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmluaXREZXNpcmVkU2lnU2l6ZSAgICAgICAgICAgPSBhcjU0MTZNb2Rlc1tpXVttb2Rlc0luZGV4XTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAweDk4NWMgOgorICAgICAgICAgICAgICAgICAgICAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmluaXRBR0MgICAgICAgICAgICAgICAgICAgICAgPSBhcjU0MTZNb2Rlc1tpXVttb2Rlc0luZGV4XTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAweDk4NjAgOgorICAgICAgICAgICAgICAgICAgICAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmluaXRBZ2NDb250cm9sICAgICAgICAgICAgICAgPSBhcjU0MTZNb2Rlc1tpXVttb2Rlc0luZGV4XTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAweDk5MTggOgorICAgICAgICAgICAgICAgICAgICAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmluaXRTZWFyY2hTdGFydERlbGF5ICAgICAgICAgPSBhcjU0MTZNb2Rlc1tpXVttb2Rlc0luZGV4XTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAweDk5ZWMgOgorICAgICAgICAgICAgICAgICAgICAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmluaXRSSUZTU2VhcmNoUGFyYW1zICAgICAgICAgPSBhcjU0MTZNb2Rlc1tpXVttb2Rlc0luZGV4XTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAweGEzODggOgorICAgICAgICAgICAgICAgICAgICAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmluaXRGYXN0Q2hhbm5lbENoYW5nZUNvbnRyb2wgPSBhcjU0MTZNb2Rlc1tpXVttb2Rlc0luZGV4XTsKKyAgICAgICAgICAgICAgICBkZWZhdWx0IDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisjaWYgMAorICAgIHpmRmx1c2hEZWxheVdyaXRlKGRldik7CisKKyAgICAvKgorICAgICAqIENvbW1vbiBSZWdpc3RlciBzZXR0aW5nCisgICAgICovCisgICAgZW50cmllcyA9IHNpemVvZihhcjU0MTZDb21tb24pIC8gc2l6ZW9mKCphcjU0MTZDb21tb24pOworICAgIGZvciAoaT0wOyBpPGVudHJpZXM7IGkrKykKKyAgICB7CisgICAgICAgIHJlZ193cml0ZShhcjU0MTZDb21tb25baV1bMF0sIGFyNTQxNkNvbW1vbltpXVsxXSk7CisgICAgfQorICAgIHpmRmx1c2hEZWxheVdyaXRlKGRldik7CisKKyAgICAvKgorICAgICAqIFJGIEdhaW4gc2V0dGluZyBieSBmcmVxSW5kZXgKKyAgICAgKi8KKyAgICBlbnRyaWVzID0gc2l6ZW9mKGFyNTQxNkJCX1JmR2FpbikgLyBzaXplb2YoKmFyNTQxNkJCX1JmR2Fpbik7CisgICAgZm9yIChpPTA7IGk8ZW50cmllczsgaSsrKQorICAgIHsKKyAgICAgICAgcmVnX3dyaXRlKGFyNTQxNkJCX1JmR2FpbltpXVswXSwgYXI1NDE2QkJfUmZHYWluW2ldW2ZyZXFJbmRleF0pOworICAgIH0KKyAgICB6ZkZsdXNoRGVsYXlXcml0ZShkZXYpOworCisgICAgLyoKKyAgICAgKiBNb3ZlZCBhcjU0MTZJbml0Q2hhaW5NYXNrKCkgaGVyZSB0byBlbnN1cmUgdGhlIHN3YXAgYml0IGlzIHNldCBiZWZvcmUKKyAgICAgKiB0aGUgcGRhZGMgdGFibGUgaXMgd3JpdHRlbi4gIFN3YXAgbXVzdCBvY2N1ciBiZWZvcmUgYW55IHJhZGlvIGRlcGVuZGVudAorICAgICAqIHJlcGxpY2F0ZWQgcmVnaXN0ZXIgYWNjZXNzLiAgVGhlIHBkYWRjIGN1cnZlIGFkZHJlc3NpbmcgaW4gcGFydGljdWxhcgorICAgICAqIGRlcGVuZHMgb24gdGhlIGNvbnNpc3RlbnQgc2V0dGluZyBvZiB0aGUgc3dhcCBiaXQuCisgICAgICovCisgICAgLy9hcjU0MTZJbml0Q2hhaW5NYXNrKHBEZXYpOworCisgICAgLyogU2V0dXAgdGhlIHRyYW5zbWl0IHBvd2VyIHZhbHVlcy4gKi8KKyAgICAvLyBUT0RPCisjZW5kaWYKKworICAgIC8qIFVwZGF0ZSA1RyBib2FyZCBkYXRhICovCisgICAgLy9BbnQgY29udHJvbCBjb21tb24KKyAgICB0bXAgPSBocFByaXYtPmVlcHJvbUltYWdlWzB4MTAwKzB4MTQ0KjIvNF07CisgICAgZWVwcm9tQm9hcmREYXRhWzBdWzFdID0gdG1wOworICAgIGVlcHJvbUJvYXJkRGF0YVswXVsyXSA9IHRtcDsKKyAgICAvL0FudCBjb250cm9sIGNoYWluIDAKKyAgICB0bXAgPSBocFByaXYtPmVlcHJvbUltYWdlWzB4MTAwKzB4MTQwKjIvNF07CisgICAgZWVwcm9tQm9hcmREYXRhWzFdWzFdID0gdG1wOworICAgIGVlcHJvbUJvYXJkRGF0YVsxXVsyXSA9IHRtcDsKKyAgICAvL0FudCBjb250cm9sIGNoYWluIDIKKyAgICB0bXAgPSBocFByaXYtPmVlcHJvbUltYWdlWzB4MTAwKzB4MTQyKjIvNF07CisgICAgZWVwcm9tQm9hcmREYXRhWzJdWzFdID0gdG1wOworICAgIGVlcHJvbUJvYXJkRGF0YVsyXVsyXSA9IHRtcDsKKyAgICAvL1N3U2V0dGxlCisgICAgdG1wID0gaHBQcml2LT5lZXByb21JbWFnZVsweDEwMCsweDE0NioyLzRdOworICAgIHRtcCA9ICh0bXAgPj4gMTYpICYgMHg3ZjsKKyAgICBlZXByb21Cb2FyZERhdGFbM11bMV0gJj0gKH4oKHUzMl90KTB4M2Y4MCkpOworICAgIGVlcHJvbUJvYXJkRGF0YVszXVsxXSB8PSAodG1wIDw8IDcpOworI2lmIDAKKyAgICAvL3N3U2V0dGxlSHQ0MAorICAgIHRtcCA9IGhwUHJpdi0+ZWVwcm9tSW1hZ2VbMHgxMDArMHgxNTgqMi80XTsKKyAgICB0bXAgPSAodG1wKSAmIDB4N2Y7CisgICAgZWVwcm9tQm9hcmREYXRhWzNdWzJdICY9ICh+KCh1MzJfdCkweDNmODApKTsKKyAgICBlZXByb21Cb2FyZERhdGFbM11bMl0gfD0gKHRtcCA8PCA3KTsKKyNlbmRpZgorICAgIC8vYWRjRGVzaXJlZCwgcGRhRGVzaXJlZAorICAgIHRtcCA9IGhwUHJpdi0+ZWVwcm9tSW1hZ2VbMHgxMDArMHgxNDgqMi80XTsKKyAgICB0bXAgPSAodG1wID4+IDI0KTsKKyAgICB0bXAxID0gaHBQcml2LT5lZXByb21JbWFnZVsweDEwMCsweDE0YSoyLzRdOworICAgIHRtcDEgPSB0bXAxICYgMHhmZjsKKyAgICB0bXAgPSB0bXAgKyAodG1wMTw8OCk7CisgICAgZWVwcm9tQm9hcmREYXRhWzRdWzFdICY9ICh+KCh1MzJfdCkweGZmZmYpKTsKKyAgICBlZXByb21Cb2FyZERhdGFbNF1bMV0gfD0gdG1wOworICAgIGVlcHJvbUJvYXJkRGF0YVs0XVsyXSAmPSAofigodTMyX3QpMHhmZmZmKSk7CisgICAgZWVwcm9tQm9hcmREYXRhWzRdWzJdIHw9IHRtcDsKKyAgICAvL1R4RW5kVG9YcGFPZmYsIFR4RnJhbWVUb1hwYU9uCisgICAgdG1wID0gaHBQcml2LT5lZXByb21JbWFnZVsweDEwMCsweDE0YSoyLzRdOworICAgIHRtcCA9ICh0bXAgPj4gMjQpICYgMHhmZjsKKyAgICB0bXAxID0gaHBQcml2LT5lZXByb21JbWFnZVsweDEwMCsweDE0YyoyLzRdOworICAgIHRtcDEgPSAodG1wMSA+PiA4KSAmIDB4ZmY7CisgICAgdG1wID0gKHRtcDw8MjQpICsgKHRtcDw8MTYpICsgKHRtcDE8PDgpICsgdG1wMTsKKyAgICBlZXByb21Cb2FyZERhdGFbNV1bMV0gPSB0bXA7CisgICAgZWVwcm9tQm9hcmREYXRhWzVdWzJdID0gdG1wOworICAgIC8vVHhFbmFUb1J4T20KKyAgICB0bXAgPSBocFByaXYtPmVlcHJvbUltYWdlWzB4MTAwKzB4MTRjKjIvNF0gJiAweGZmOworICAgIGVlcHJvbUJvYXJkRGF0YVs2XVsxXSAmPSAofigodTMyX3QpMHhmZjAwMDApKTsKKyAgICBlZXByb21Cb2FyZERhdGFbNl1bMV0gfD0gKHRtcDw8MTYpOworICAgIGVlcHJvbUJvYXJkRGF0YVs2XVsyXSAmPSAofigodTMyX3QpMHhmZjAwMDApKTsKKyAgICBlZXByb21Cb2FyZERhdGFbNl1bMl0gfD0gKHRtcDw8MTYpOworICAgIC8vVGhyZXNoNjIKKyAgICB0bXAgPSBocFByaXYtPmVlcHJvbUltYWdlWzB4MTAwKzB4MTRjKjIvNF07CisgICAgdG1wID0gKHRtcCA+PiAxNikgJiAweDdmOworICAgIGVlcHJvbUJvYXJkRGF0YVs3XVsxXSAmPSAofigodTMyX3QpMHg3ZjAwMCkpOworICAgIGVlcHJvbUJvYXJkRGF0YVs3XVsxXSB8PSAodG1wPDwxMik7CisgICAgZWVwcm9tQm9hcmREYXRhWzddWzJdICY9ICh+KCh1MzJfdCkweDdmMDAwKSk7CisgICAgZWVwcm9tQm9hcmREYXRhWzddWzJdIHw9ICh0bXA8PDEyKTsKKyAgICAvL1R4UnhBdHRlbiBjaGFpbl8wCisgICAgdG1wID0gaHBQcml2LT5lZXByb21JbWFnZVsweDEwMCsweDE0NioyLzRdOworICAgIHRtcCA9ICh0bXAgPj4gMjQpICYgMHgzZjsKKyAgICBlZXByb21Cb2FyZERhdGFbOF1bMV0gJj0gKH4oKHUzMl90KTB4M2YwMDApKTsKKyAgICBlZXByb21Cb2FyZERhdGFbOF1bMV0gfD0gKHRtcDw8MTIpOworICAgIGVlcHJvbUJvYXJkRGF0YVs4XVsyXSAmPSAofigodTMyX3QpMHgzZjAwMCkpOworICAgIGVlcHJvbUJvYXJkRGF0YVs4XVsyXSB8PSAodG1wPDwxMik7CisgICAgLy9UeFJ4QXR0ZW4gY2hhaW5fMgorICAgIHRtcCA9IGhwUHJpdi0+ZWVwcm9tSW1hZ2VbMHgxMDArMHgxNDgqMi80XSAmIDB4M2Y7CisgICAgZWVwcm9tQm9hcmREYXRhWzldWzFdICY9ICh+KCh1MzJfdCkweDNmMDAwKSk7CisgICAgZWVwcm9tQm9hcmREYXRhWzldWzFdIHw9ICh0bXA8PDEyKTsKKyAgICBlZXByb21Cb2FyZERhdGFbOV1bMl0gJj0gKH4oKHUzMl90KTB4M2YwMDApKTsKKyAgICBlZXByb21Cb2FyZERhdGFbOV1bMl0gfD0gKHRtcDw8MTIpOworICAgIC8vVHhSeE1hcmdpbiBjaGFpbl8wCisgICAgdG1wID0gaHBQcml2LT5lZXByb21JbWFnZVsweDEwMCsweDE0OCoyLzRdOworICAgIHRtcCA9ICh0bXAgPj4gOCkgJiAweDNmOworICAgIGVlcHJvbUJvYXJkRGF0YVsxMF1bMV0gJj0gKH4oKHUzMl90KTB4ZmMwMDAwKSk7CisgICAgZWVwcm9tQm9hcmREYXRhWzEwXVsxXSB8PSAodG1wPDwxOCk7CisgICAgZWVwcm9tQm9hcmREYXRhWzEwXVsyXSAmPSAofigodTMyX3QpMHhmYzAwMDApKTsKKyAgICBlZXByb21Cb2FyZERhdGFbMTBdWzJdIHw9ICh0bXA8PDE4KTsKKyAgICAvL1R4UnhNYXJnaW4gY2hhaW5fMgorICAgIHRtcCA9IGhwUHJpdi0+ZWVwcm9tSW1hZ2VbMHgxMDArMHgxNDgqMi80XTsKKyAgICB0bXAgPSAodG1wID4+IDE2KSAmIDB4M2Y7CisgICAgZWVwcm9tQm9hcmREYXRhWzExXVsxXSAmPSAofigodTMyX3QpMHhmYzAwMDApKTsKKyAgICBlZXByb21Cb2FyZERhdGFbMTFdWzFdIHw9ICh0bXA8PDE4KTsKKyAgICBlZXByb21Cb2FyZERhdGFbMTFdWzJdICY9ICh+KCh1MzJfdCkweGZjMDAwMCkpOworICAgIGVlcHJvbUJvYXJkRGF0YVsxMV1bMl0gfD0gKHRtcDw8MTgpOworICAgIC8vaXFDYWxsIGNoYWluXzAsIGlxQ2FsbFEgY2hhaW5fMAorICAgIHRtcCA9IGhwUHJpdi0+ZWVwcm9tSW1hZ2VbMHgxMDArMHgxNGUqMi80XTsKKyAgICB0bXAgPSAodG1wID4+IDI0KSAmIDB4M2Y7CisgICAgdG1wMSA9IGhwUHJpdi0+ZWVwcm9tSW1hZ2VbMHgxMDArMHgxNTAqMi80XTsKKyAgICB0bXAxID0gKHRtcDEgPj4gOCkgJiAweDFmOworICAgIHRtcCAgPSAodG1wPDw1KSArIHRtcDE7CisgICAgZWVwcm9tQm9hcmREYXRhWzEyXVsxXSAmPSAofigodTMyX3QpMHg3ZmYpKTsKKyAgICBlZXByb21Cb2FyZERhdGFbMTJdWzFdIHw9ICh0bXApOworICAgIGVlcHJvbUJvYXJkRGF0YVsxMl1bMl0gJj0gKH4oKHUzMl90KTB4N2ZmKSk7CisgICAgZWVwcm9tQm9hcmREYXRhWzEyXVsyXSB8PSAodG1wKTsKKyAgICAvL2lxQ2FsbCBjaGFpbl8yLCBpcUNhbGxRIGNoYWluXzIKKyAgICB0bXAgPSBocFByaXYtPmVlcHJvbUltYWdlWzB4MTAwKzB4MTUwKjIvNF07CisgICAgdG1wID0gdG1wICYgMHgzZjsKKyAgICB0bXAxID0gaHBQcml2LT5lZXByb21JbWFnZVsweDEwMCsweDE1MCoyLzRdOworICAgIHRtcDEgPSAodG1wMSA+PiAxNikgJiAweDFmOworICAgIHRtcCAgPSAodG1wPDw1KSArIHRtcDE7CisgICAgZWVwcm9tQm9hcmREYXRhWzEzXVsxXSAmPSAofigodTMyX3QpMHg3ZmYpKTsKKyAgICBlZXByb21Cb2FyZERhdGFbMTNdWzFdIHw9ICh0bXApOworICAgIGVlcHJvbUJvYXJkRGF0YVsxM11bMl0gJj0gKH4oKHUzMl90KTB4N2ZmKSk7CisgICAgZWVwcm9tQm9hcmREYXRhWzEzXVsyXSB8PSAodG1wKTsKKyAgICAvL2Jzd19NYXJnaW4gY2hhaW5fMAorICAgIHRtcCA9IGhwUHJpdi0+ZWVwcm9tSW1hZ2VbMHgxMDArMHgxNTYqMi80XTsKKyAgICB0bXAgPSAodG1wID4+IDE2KSAmIDB4ZjsKKyAgICBlZXByb21Cb2FyZERhdGFbMTBdWzFdICY9ICh+KCh1MzJfdCkweDNjMDApKTsKKyAgICBlZXByb21Cb2FyZERhdGFbMTBdWzFdIHw9ICh0bXAgPDwgMTApOworICAgIGVlcHJvbUJvYXJkRGF0YVsxMF1bMl0gJj0gKH4oKHUzMl90KTB4M2MwMCkpOworICAgIGVlcHJvbUJvYXJkRGF0YVsxMF1bMl0gfD0gKHRtcCA8PCAxMCk7CisgICAgLy94cGQgZ2FpbiBtYXNrCisgICAgdG1wID0gaHBQcml2LT5lZXByb21JbWFnZVsweDEwMCsweDE0ZSoyLzRdOworICAgIHRtcCA9ICh0bXAgPj4gOCkgJiAweGY7CisgICAgZWVwcm9tQm9hcmREYXRhWzE0XVsxXSAmPSAofigodTMyX3QpMHhmMDAwMCkpOworICAgIGVlcHJvbUJvYXJkRGF0YVsxNF1bMV0gfD0gKHpjWHBkVG9QZFt0bXBdIDw8IDE2KTsKKyAgICBlZXByb21Cb2FyZERhdGFbMTRdWzJdICY9ICh+KCh1MzJfdCkweGYwMDAwKSk7CisgICAgZWVwcm9tQm9hcmREYXRhWzE0XVsyXSB8PSAoemNYcGRUb1BkW3RtcF0gPDwgMTYpOworI2lmIDAKKyAgICAvL2Jzd19BdHRlbiBjaGFpbl8wCisgICAgdG1wID0gaHBQcml2LT5lZXByb21JbWFnZVsweDEwMCsweDE1NioyLzRdOworICAgIHRtcCA9ICh0bXApICYgMHgxZjsKKyAgICBlZXByb21Cb2FyZERhdGFbMTBdWzFdICY9ICh+KCh1MzJfdCkweDFmKSk7CisgICAgZWVwcm9tQm9hcmREYXRhWzEwXVsxXSB8PSAodG1wKTsKKyAgICBlZXByb21Cb2FyZERhdGFbMTBdWzJdICY9ICh+KCh1MzJfdCkweDFmKSk7CisgICAgZWVwcm9tQm9hcmREYXRhWzEwXVsyXSB8PSAodG1wKTsKKyAgICAvL2Jzd19NYXJnaW4gY2hhaW5fMgorICAgIHRtcCA9IGhwUHJpdi0+ZWVwcm9tSW1hZ2VbMHgxMDArMHgxNTYqMi80XTsKKyAgICB0bXAgPSAodG1wID4+IDI0KSAmIDB4ZjsKKyAgICBlZXByb21Cb2FyZERhdGFbMTFdWzFdICY9ICh+KCh1MzJfdCkweDNjMDApKTsKKyAgICBlZXByb21Cb2FyZERhdGFbMTFdWzFdIHw9ICh0bXAgPDwgMTApOworICAgIGVlcHJvbUJvYXJkRGF0YVsxMV1bMl0gJj0gKH4oKHUzMl90KTB4M2MwMCkpOworICAgIGVlcHJvbUJvYXJkRGF0YVsxMV1bMl0gfD0gKHRtcCA8PCAxMCk7CisgICAgLy9ic3dfQXR0ZW4gY2hhaW5fMgorICAgIHRtcCA9IGhwUHJpdi0+ZWVwcm9tSW1hZ2VbMHgxMDArMHgxNTYqMi80XTsKKyAgICB0bXAgPSAodG1wID4+IDgpICYgMHgxZjsKKyAgICBlZXByb21Cb2FyZERhdGFbMTFdWzFdICY9ICh+KCh1MzJfdCkweDFmKSk7CisgICAgZWVwcm9tQm9hcmREYXRhWzExXVsxXSB8PSAodG1wKTsKKyAgICBlZXByb21Cb2FyZERhdGFbMTFdWzJdICY9ICh+KCh1MzJfdCkweDFmKSk7CisgICAgZWVwcm9tQm9hcmREYXRhWzExXVsyXSB8PSAodG1wKTsKKyNlbmRpZgorCisgICAgLyogVXBkYXRlIDIuNEcgYm9hcmQgZGF0YSAqLworICAgIC8vQW50IGNvbnRyb2wgY29tbW9uCisgICAgdG1wID0gaHBQcml2LT5lZXByb21JbWFnZVsweDEwMCsweDE3MCoyLzRdOworICAgIHRtcCA9IHRtcCA+PiAyNDsKKyAgICB0bXAxID0gaHBQcml2LT5lZXByb21JbWFnZVsweDEwMCsweDE3MioyLzRdOworICAgIHRtcCA9IHRtcCArICh0bXAxIDw8IDgpOworICAgIGVlcHJvbUJvYXJkRGF0YVswXVszXSA9IHRtcDsKKyAgICBlZXByb21Cb2FyZERhdGFbMF1bNF0gPSB0bXA7CisgICAgLy9BbnQgY29udHJvbCBjaGFpbiAwCisgICAgdG1wID0gaHBQcml2LT5lZXByb21JbWFnZVsweDEwMCsweDE2YyoyLzRdOworICAgIHRtcCA9IHRtcCA+PiAyNDsKKyAgICB0bXAxID0gaHBQcml2LT5lZXByb21JbWFnZVsweDEwMCsweDE2ZSoyLzRdOworICAgIHRtcCA9IHRtcCArICh0bXAxIDw8IDgpOworICAgIGVlcHJvbUJvYXJkRGF0YVsxXVszXSA9IHRtcDsKKyAgICBlZXByb21Cb2FyZERhdGFbMV1bNF0gPSB0bXA7CisgICAgLy9BbnQgY29udHJvbCBjaGFpbiAyCisgICAgdG1wID0gaHBQcml2LT5lZXByb21JbWFnZVsweDEwMCsweDE2ZSoyLzRdOworICAgIHRtcCA9IHRtcCA+PiAyNDsKKyAgICB0bXAxID0gaHBQcml2LT5lZXByb21JbWFnZVsweDEwMCsweDE3MCoyLzRdOworICAgIHRtcCA9IHRtcCArICh0bXAxIDw8IDgpOworICAgIGVlcHJvbUJvYXJkRGF0YVsyXVszXSA9IHRtcDsKKyAgICBlZXByb21Cb2FyZERhdGFbMl1bNF0gPSB0bXA7CisgICAgLy9Td1NldHRsZQorICAgIHRtcCA9IGhwUHJpdi0+ZWVwcm9tSW1hZ2VbMHgxMDArMHgxNzQqMi80XTsKKyAgICB0bXAgPSAodG1wID4+IDgpICYgMHg3ZjsKKyAgICBlZXByb21Cb2FyZERhdGFbM11bNF0gJj0gKH4oKHUzMl90KTB4M2Y4MCkpOworICAgIGVlcHJvbUJvYXJkRGF0YVszXVs0XSB8PSAodG1wIDw8IDcpOworI2lmIDAKKyAgICAvL3N3U2V0dGxlSHQ0MAorICAgIHRtcCA9IGhwUHJpdi0+ZWVwcm9tSW1hZ2VbMHgxMDArMHgxODQqMi80XTsKKyAgICB0bXAgPSAodG1wID4+IDI0KSAmIDB4N2Y7CisgICAgZWVwcm9tQm9hcmREYXRhWzNdWzNdICY9ICh+KCh1MzJfdCkweDNmODApKTsKKyAgICBlZXByb21Cb2FyZERhdGFbM11bM10gfD0gKHRtcCA8PCA3KTsKKyNlbmRpZgorICAgIC8vYWRjRGVzaXJlZCwgcGRhRGVzaXJlZAorICAgIHRtcCA9IGhwUHJpdi0+ZWVwcm9tSW1hZ2VbMHgxMDArMHgxNzYqMi80XTsKKyAgICB0bXAgPSAodG1wID4+IDE2KSAmIDB4ZmY7CisgICAgdG1wMSA9IGhwUHJpdi0+ZWVwcm9tSW1hZ2VbMHgxMDArMHgxNzYqMi80XTsKKyAgICB0bXAxID0gdG1wMSA+PiAyNDsKKyAgICB0bXAgPSB0bXAgKyAodG1wMTw8OCk7CisgICAgZWVwcm9tQm9hcmREYXRhWzRdWzNdICY9ICh+KCh1MzJfdCkweGZmZmYpKTsKKyAgICBlZXByb21Cb2FyZERhdGFbNF1bM10gfD0gdG1wOworICAgIGVlcHJvbUJvYXJkRGF0YVs0XVs0XSAmPSAofigodTMyX3QpMHhmZmZmKSk7CisgICAgZWVwcm9tQm9hcmREYXRhWzRdWzRdIHw9IHRtcDsKKyAgICAvL1R4RW5kVG9YcGFPZmYsIFR4RnJhbWVUb1hwYU9uCisgICAgdG1wID0gaHBQcml2LT5lZXByb21JbWFnZVsweDEwMCsweDE3OCoyLzRdOworICAgIHRtcCA9ICh0bXAgPj4gMTYpICYgMHhmZjsKKyAgICB0bXAxID0gaHBQcml2LT5lZXByb21JbWFnZVsweDEwMCsweDE3YSoyLzRdOworICAgIHRtcDEgPSB0bXAxICYgMHhmZjsKKyAgICB0bXAgPSAodG1wIDw8IDI0KSArICh0bXAgPDwgMTYpICsgKHRtcDEgPDwgOCkgKyB0bXAxOworICAgIGVlcHJvbUJvYXJkRGF0YVs1XVszXSA9IHRtcDsKKyAgICBlZXByb21Cb2FyZERhdGFbNV1bNF0gPSB0bXA7CisgICAgLy9UeEVuYVRvUnhPbQorICAgIHRtcCA9IGhwUHJpdi0+ZWVwcm9tSW1hZ2VbMHgxMDArMHgxNzgqMi80XTsKKyAgICB0bXAgPSAodG1wID4+IDI0KTsKKyAgICBlZXByb21Cb2FyZERhdGFbNl1bM10gJj0gKH4oKHUzMl90KTB4ZmYwMDAwKSk7CisgICAgZWVwcm9tQm9hcmREYXRhWzZdWzNdIHw9ICh0bXA8PDE2KTsKKyAgICBlZXByb21Cb2FyZERhdGFbNl1bNF0gJj0gKH4oKHUzMl90KTB4ZmYwMDAwKSk7CisgICAgZWVwcm9tQm9hcmREYXRhWzZdWzRdIHw9ICh0bXA8PDE2KTsKKyAgICAvL1RocmVzaDYyCisgICAgdG1wID0gaHBQcml2LT5lZXByb21JbWFnZVsweDEwMCsweDE3YSoyLzRdOworICAgIHRtcCA9ICh0bXAgPj4gOCkgJiAweDdmOworICAgIGVlcHJvbUJvYXJkRGF0YVs3XVszXSAmPSAofigodTMyX3QpMHg3ZjAwMCkpOworICAgIGVlcHJvbUJvYXJkRGF0YVs3XVszXSB8PSAodG1wPDwxMik7CisgICAgZWVwcm9tQm9hcmREYXRhWzddWzRdICY9ICh+KCh1MzJfdCkweDdmMDAwKSk7CisgICAgZWVwcm9tQm9hcmREYXRhWzddWzRdIHw9ICh0bXA8PDEyKTsKKyAgICAvL1R4UnhBdHRlbiBjaGFpbl8wCisgICAgdG1wID0gaHBQcml2LT5lZXByb21JbWFnZVsweDEwMCsweDE3NCoyLzRdOworICAgIHRtcCA9ICh0bXAgPj4gMTYpICYgMHgzZjsKKyAgICBlZXByb21Cb2FyZERhdGFbOF1bM10gJj0gKH4oKHUzMl90KTB4M2YwMDApKTsKKyAgICBlZXByb21Cb2FyZERhdGFbOF1bM10gfD0gKHRtcDw8MTIpOworICAgIGVlcHJvbUJvYXJkRGF0YVs4XVs0XSAmPSAofigodTMyX3QpMHgzZjAwMCkpOworICAgIGVlcHJvbUJvYXJkRGF0YVs4XVs0XSB8PSAodG1wPDwxMik7CisgICAgLy9UeFJ4QXR0ZW4gY2hhaW5fMgorICAgIHRtcCA9IGhwUHJpdi0+ZWVwcm9tSW1hZ2VbMHgxMDArMHgxNzQqMi80XTsKKyAgICB0bXAgPSAodG1wID4+IDI0KSAmIDB4M2Y7CisgICAgZWVwcm9tQm9hcmREYXRhWzldWzNdICY9ICh+KCh1MzJfdCkweDNmMDAwKSk7CisgICAgZWVwcm9tQm9hcmREYXRhWzldWzNdIHw9ICh0bXA8PDEyKTsKKyAgICBlZXByb21Cb2FyZERhdGFbOV1bNF0gJj0gKH4oKHUzMl90KTB4M2YwMDApKTsKKyAgICBlZXByb21Cb2FyZERhdGFbOV1bNF0gfD0gKHRtcDw8MTIpOworICAgIC8vVHhSeE1hcmdpbiBjaGFpbl8wCisgICAgdG1wID0gaHBQcml2LT5lZXByb21JbWFnZVsweDEwMCsweDE3NioyLzRdOworICAgIHRtcCA9ICh0bXApICYgMHgzZjsKKyAgICBlZXByb21Cb2FyZERhdGFbMTBdWzNdICY9ICh+KCh1MzJfdCkweGZjMDAwMCkpOworICAgIGVlcHJvbUJvYXJkRGF0YVsxMF1bM10gfD0gKHRtcDw8MTgpOworICAgIGVlcHJvbUJvYXJkRGF0YVsxMF1bNF0gJj0gKH4oKHUzMl90KTB4ZmMwMDAwKSk7CisgICAgZWVwcm9tQm9hcmREYXRhWzEwXVs0XSB8PSAodG1wPDwxOCk7CisgICAgLy9UeFJ4TWFyZ2luIGNoYWluXzIKKyAgICB0bXAgPSBocFByaXYtPmVlcHJvbUltYWdlWzB4MTAwKzB4MTc2KjIvNF07CisgICAgdG1wID0gKHRtcCA+PiA4KSAmIDB4M2Y7CisgICAgZWVwcm9tQm9hcmREYXRhWzExXVszXSAmPSAofigodTMyX3QpMHhmYzAwMDApKTsKKyAgICBlZXByb21Cb2FyZERhdGFbMTFdWzNdIHw9ICh0bXA8PDE4KTsKKyAgICBlZXByb21Cb2FyZERhdGFbMTFdWzRdICY9ICh+KCh1MzJfdCkweGZjMDAwMCkpOworICAgIGVlcHJvbUJvYXJkRGF0YVsxMV1bNF0gfD0gKHRtcDw8MTgpOworICAgIC8vaXFDYWxsIGNoYWluXzAsIGlxQ2FsbFEgY2hhaW5fMAorICAgIHRtcCA9IGhwUHJpdi0+ZWVwcm9tSW1hZ2VbMHgxMDArMHgxN2MqMi80XTsKKyAgICB0bXAgPSAodG1wID4+IDE2KSAmIDB4M2Y7CisgICAgdG1wMSA9IGhwUHJpdi0+ZWVwcm9tSW1hZ2VbMHgxMDArMHgxN2UqMi80XTsKKyAgICB0bXAxID0gKHRtcDEpICYgMHgxZjsKKyAgICB0bXAgID0gKHRtcDw8NSkgKyB0bXAxOworICAgIGVlcHJvbUJvYXJkRGF0YVsxMl1bM10gJj0gKH4oKHUzMl90KTB4N2ZmKSk7CisgICAgZWVwcm9tQm9hcmREYXRhWzEyXVszXSB8PSAodG1wKTsKKyAgICBlZXByb21Cb2FyZERhdGFbMTJdWzRdICY9ICh+KCh1MzJfdCkweDdmZikpOworICAgIGVlcHJvbUJvYXJkRGF0YVsxMl1bNF0gfD0gKHRtcCk7CisgICAgLy9pcUNhbGwgY2hhaW5fMiwgaXFDYWxsUSBjaGFpbl8yCisgICAgdG1wID0gaHBQcml2LT5lZXByb21JbWFnZVsweDEwMCsweDE3YyoyLzRdOworICAgIHRtcCA9ICh0bXA+PjI0KSAmIDB4M2Y7CisgICAgdG1wMSA9IGhwUHJpdi0+ZWVwcm9tSW1hZ2VbMHgxMDArMHgxN2UqMi80XTsKKyAgICB0bXAxID0gKHRtcDEgPj4gOCkgJiAweDFmOworICAgIHRtcCAgPSAodG1wPDw1KSArIHRtcDE7CisgICAgZWVwcm9tQm9hcmREYXRhWzEzXVszXSAmPSAofigodTMyX3QpMHg3ZmYpKTsKKyAgICBlZXByb21Cb2FyZERhdGFbMTNdWzNdIHw9ICh0bXApOworICAgIGVlcHJvbUJvYXJkRGF0YVsxM11bNF0gJj0gKH4oKHUzMl90KTB4N2ZmKSk7CisgICAgZWVwcm9tQm9hcmREYXRhWzEzXVs0XSB8PSAodG1wKTsKKyAgICAvL3hwZCBnYWluIG1hc2sKKyAgICB0bXAgPSBocFByaXYtPmVlcHJvbUltYWdlWzB4MTAwKzB4MTdjKjIvNF07CisgICAgdG1wID0gdG1wICYgMHhmOworICAgIERiZ1ByaW50KCJ4cGQ9MHgleCwgcGQ9MHgleFxuIiwgdG1wLCB6Y1hwZFRvUGRbdG1wXSk7CisgICAgZWVwcm9tQm9hcmREYXRhWzE0XVszXSAmPSAofigodTMyX3QpMHhmMDAwMCkpOworICAgIGVlcHJvbUJvYXJkRGF0YVsxNF1bM10gfD0gKHpjWHBkVG9QZFt0bXBdIDw8IDE2KTsKKyAgICBlZXByb21Cb2FyZERhdGFbMTRdWzRdICY9ICh+KCh1MzJfdCkweGYwMDAwKSk7CisgICAgZWVwcm9tQm9hcmREYXRhWzE0XVs0XSB8PSAoemNYcGRUb1BkW3RtcF0gPDwgMTYpOworI2lmIDAKKyAgICAvL2Jzd19NYXJnaW4gY2hhaW5fMAorICAgIHRtcCA9IGhwUHJpdi0+ZWVwcm9tSW1hZ2VbMHgxMDArMHgxODQqMi80XTsKKyAgICB0bXAgPSAodG1wID4+IDgpICYgMHhmOworICAgIGVlcHJvbUJvYXJkRGF0YVsxMF1bM10gJj0gKH4oKHUzMl90KTB4M2MwMCkpOworICAgIGVlcHJvbUJvYXJkRGF0YVsxMF1bM10gfD0gKHRtcCA8PCAxMCk7CisgICAgZWVwcm9tQm9hcmREYXRhWzEwXVs0XSAmPSAofigodTMyX3QpMHgzYzAwKSk7CisgICAgZWVwcm9tQm9hcmREYXRhWzEwXVs0XSB8PSAodG1wIDw8IDEwKTsKKyAgICAvL2Jzd19BdHRlbiBjaGFpbl8wCisgICAgdG1wID0gaHBQcml2LT5lZXByb21JbWFnZVsweDEwMCsweDE4MioyLzRdOworICAgIHRtcCA9ICh0bXA+PjI0KSAmIDB4MWY7CisgICAgZWVwcm9tQm9hcmREYXRhWzEwXVszXSAmPSAofigodTMyX3QpMHgxZikpOworICAgIGVlcHJvbUJvYXJkRGF0YVsxMF1bM10gfD0gKHRtcCk7CisgICAgZWVwcm9tQm9hcmREYXRhWzEwXVs0XSAmPSAofigodTMyX3QpMHgxZikpOworICAgIGVlcHJvbUJvYXJkRGF0YVsxMF1bNF0gfD0gKHRtcCk7CisgICAgLy9ic3dfTWFyZ2luIGNoYWluXzIKKyAgICB0bXAgPSBocFByaXYtPmVlcHJvbUltYWdlWzB4MTAwKzB4MTg0KjIvNF07CisgICAgdG1wID0gKHRtcCA+PiAxNikgJiAweGY7CisgICAgZWVwcm9tQm9hcmREYXRhWzExXVszXSAmPSAofigodTMyX3QpMHgzYzAwKSk7CisgICAgZWVwcm9tQm9hcmREYXRhWzExXVszXSB8PSAodG1wIDw8IDEwKTsKKyAgICBlZXByb21Cb2FyZERhdGFbMTFdWzRdICY9ICh+KCh1MzJfdCkweDNjMDApKTsKKyAgICBlZXByb21Cb2FyZERhdGFbMTFdWzRdIHw9ICh0bXAgPDwgMTApOworICAgIC8vYnN3X0F0dGVuIGNoYWluXzIKKyAgICB0bXAgPSBocFByaXYtPmVlcHJvbUltYWdlWzB4MTAwKzB4MTg0KjIvNF07CisgICAgdG1wID0gKHRtcCkgJiAweDFmOworICAgIGVlcHJvbUJvYXJkRGF0YVsxMV1bM10gJj0gKH4oKHUzMl90KTB4MWYpKTsKKyAgICBlZXByb21Cb2FyZERhdGFbMTFdWzNdIHw9ICh0bXApOworICAgIGVlcHJvbUJvYXJkRGF0YVsxMV1bNF0gJj0gKH4oKHUzMl90KTB4MWYpKTsKKyAgICBlZXByb21Cb2FyZERhdGFbMTFdWzRdIHw9ICh0bXApOworI2VuZGlmCisKKyNpZiAwCisgICAgZm9yIChqPTA7IGo8MTQ7IGorKykKKyAgICB7CisgICAgICAgIERiZ1ByaW50KCIlMDR4LCAlMDh4LCAlMDh4LCAlMDh4LCAlMDh4XG4iLCBlZXByb21Cb2FyZERhdGFbal1bMF0sIGVlcHJvbUJvYXJkRGF0YVtqXVsxXSwgZWVwcm9tQm9hcmREYXRhW2pdWzJdLCBlZXByb21Cb2FyZERhdGFbal1bM10sIGVlcHJvbUJvYXJkRGF0YVtqXVs0XSk7CisgICAgfQorI2VuZGlmCisKKyAgICBpZiAoKGhwUHJpdi0+ZWVwcm9tSW1hZ2VbMHgxMDArMHgxMTAqMi80XSYweGZmKSA9PSAweDgwKSAvL0ZFTSBUWVBFCisgICAgeworICAgICAgICAvKiBVcGRhdGUgYm9hcmQgZGF0YSB0byByZWdpc3RlcnMgKi8KKyAgICAgICAgZm9yIChqPTA7IGo8MTU7IGorKykKKyAgICAgICAgeworICAgICAgICAgICAgcmVnX3dyaXRlKGVlcHJvbUJvYXJkRGF0YVtqXVswXSwgZWVwcm9tQm9hcmREYXRhW2pdW21vZGVzSW5kZXhdKTsKKworICAgICAgICAgICAgLyogIzEgU2F2ZSB0aGUgaW5pdGlhbCB2YWx1ZSBvZiB0aGUgcmVsYXRlZCBSSUZTIHJlZ2lzdGVyIHNldHRpbmdzICovCisgICAgICAgICAgICAvL2lmKCAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmlzSW5pdGlhbFBoeSA9PSAxICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2goZWVwcm9tQm9hcmREYXRhW2pdWzBdKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAweDk4NTAgOgorICAgICAgICAgICAgICAgICAgICAgICAgKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5pbml0RGVzaXJlZFNpZ1NpemUgICAgICAgICAgID0gZWVwcm9tQm9hcmREYXRhW2pdW21vZGVzSW5kZXhdOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMHg5ODVjIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+aW5pdEFHQyAgICAgICAgICAgICAgICAgICAgICA9IGVlcHJvbUJvYXJkRGF0YVtqXVttb2Rlc0luZGV4XTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDB4OTg2MCA6CisgICAgICAgICAgICAgICAgICAgICAgICAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmluaXRBZ2NDb250cm9sICAgICAgICAgICAgICAgPSBlZXByb21Cb2FyZERhdGFbal1bbW9kZXNJbmRleF07CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAweDk5MTggOgorICAgICAgICAgICAgICAgICAgICAgICAgKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5pbml0U2VhcmNoU3RhcnREZWxheSAgICAgICAgID0gZWVwcm9tQm9hcmREYXRhW2pdW21vZGVzSW5kZXhdOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMHg5OWVjIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+aW5pdFJJRlNTZWFyY2hQYXJhbXMgICAgICAgICA9IGVlcHJvbUJvYXJkRGF0YVtqXVttb2Rlc0luZGV4XTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDB4YTM4OCA6CisgICAgICAgICAgICAgICAgICAgICAgICAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmluaXRGYXN0Q2hhbm5lbENoYW5nZUNvbnRyb2wgPSBlZXByb21Cb2FyZERhdGFbal1bbW9kZXNJbmRleF07CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQgOgorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSAvKiBpZiAoKGhwUHJpdi0+ZWVwcm9tSW1hZ2VbMHgxMDArMHgxMTAqMi80XSYweGZmKSA9PSAweDgwKSAvL0ZFTSBUWVBFICovCisKKworICAgIC8qIEJyaW5ndXAgaXNzdWUgOiBmb3JjZSB0eCBnYWluICovCisgICAgLy9yZWdfd3JpdGUoMHhhMjU4LCAweDBjYzY1MzgxKTsKKyAgICAvL3JlZ193cml0ZSgweGEyNzQsIDB4MGExYTdjMTUpOworICAgIHpmSW5pdFBvd2VyQ2FsKGRldik7CisKKyAgICBpZihmcmVxdWVuY3kgPiBaTV9DSF9HXzE0KQorICAgIHsKKyAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFkNDAxNCwgMHg1MTQzKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFkNDAxNCwgMHg1MTYzKTsKKyAgICB9CisKKyAgICB6ZkZsdXNoRGVsYXlXcml0ZShkZXYpOworfQorCisKK3ZvaWQgemZJbml0UmYoemRldl90KiBkZXYsIHUzMl90IGZyZXF1ZW5jeSkKK3sKKyAgICB1MzJfdCBjbWRbOF07CisgICAgdTE2X3QgcmV0OworICAgIGludCBkZWx0YV9zbG9wZV9jb2VmZl9leHA7CisgICAgaW50IGRlbHRhX3Nsb3BlX2NvZWZmX21hbjsKKyAgICBpbnQgZGVsdGFfc2xvcGVfY29lZmZfZXhwX3NoZ2k7CisgICAgaW50IGRlbHRhX3Nsb3BlX2NvZWZmX21hbl9zaGdpOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem1fZGVidWdfbXNnMSgiIGluaXRSZiBmcmVxdWVuY3kgPSAiLCBmcmVxdWVuY3kpOworCisgICAgaWYgKGZyZXF1ZW5jeSA9PSAwKQorICAgIHsKKyAgICAgICAgZnJlcXVlbmN5ID0gMjQxMjsKKyAgICB9CisKKyAgICAvKiBCYW5rIDAgMSAyIDMgNSA2IDcgKi8KKyAgICB6ZlNldFJmUmVncyhkZXYsIGZyZXF1ZW5jeSk7CisgICAgLyogQmFuayA0ICovCisgICAgemZTZXRCYW5rNEFuZFBvd2VyVGFibGUoZGV2LCBmcmVxdWVuY3ksIDAsIDApOworCisgICAgLyogc3Ryb2UgZnJlcXVlbmN5ICovCisgICAgKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5od0ZyZXF1ZW5jeSA9ICh1MTZfdClmcmVxdWVuY3k7CisKKyAgICB6ZkdldEh3VHVybk9mZmR5blBhcmFtKGRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZXF1ZW5jeSwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZWx0YV9zbG9wZV9jb2VmZl9leHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVsdGFfc2xvcGVfY29lZmZfbWFuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlbHRhX3Nsb3BlX2NvZWZmX2V4cF9zaGdpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlbHRhX3Nsb3BlX2NvZWZmX21hbl9zaGdpKTsKKworICAgIC8qIHJlbGF0ZWQgZnVuY3Rpb25zICovCisgICAgZnJlcXVlbmN5ID0gZnJlcXVlbmN5KjEwMDA7CisgICAgY21kWzBdID0gMjggfCAoWk1fQ01EX1JGX0lOSVQgPDwgOCk7CisgICAgY21kWzFdID0gZnJlcXVlbmN5OworICAgIGNtZFsyXSA9IDA7Ly8oKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmh3X0RZTkFNSUNfSFQyMDQwX0VOOworICAgIGNtZFszXSA9IDE7Ly8oKHdkLT5FeHRPZmZzZXQgPDwgMikgfCAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmh3X0hUX0VOQUJMRSk7CisgICAgY21kWzRdID0gZGVsdGFfc2xvcGVfY29lZmZfZXhwOworICAgIGNtZFs1XSA9IGRlbHRhX3Nsb3BlX2NvZWZmX21hbjsKKyAgICBjbWRbNl0gPSBkZWx0YV9zbG9wZV9jb2VmZl9leHBfc2hnaTsKKyAgICBjbWRbN10gPSBkZWx0YV9zbG9wZV9jb2VmZl9tYW5fc2hnaTsKKworICAgIHJldCA9IHpmSXNzdWVDbWQoZGV2LCBjbWQsIDMyLCBaTV9PSURfSU5URVJOQUxfV1JJVEUsIDApOworCisgICAgLy8gZGVsYXkgdGVtcG9yYXJpbHksIHdhaXQgZm9yIG5ldyBQSFkgYW5kIFJGCisgICAgemZ3U2xlZXAoZGV2LCAxMDAwKTsKK30KKworaW50IHRuKGludCBleHApCit7CisgICAgaW50IGk7CisJaW50IHRtcCA9IDE7CisgICAgZm9yKGk9MDsgaTxleHA7IGkrKykKKyAgICAgICAgdG1wID0gdG1wKjI7CisKKyAgICByZXR1cm4gdG1wOworfQorCisvKmludCB6ZkZsb29yKGRvdWJsZSBpbmRhdGEpCit7CisgICBpZihpbmRhdGE8MCkKKwkgICByZXR1cm4gKGludClpbmRhdGEtMTsKKyAgIGVsc2UKKwkgICByZXR1cm4gKGludClpbmRhdGE7Cit9CisqLwordTMyX3QgcmV2ZXJzZV9iaXRzKHUzMl90IGNoYW5fc2VsKQoreworCS8qIHJldmVyc2VfYml0cyAqLworICAgIHUzMl90IGNoYW5zZWwgPSAwOworCXU4X3QgaTsKKworCWZvciAoaT0wOyBpPDg7IGkrKykKKyAgICAgICAgY2hhbnNlbCB8PSAoKGNoYW5fc2VsPj4oNy1pKSAmIDB4MSkgPDwgaSk7CisJcmV0dXJuIGNoYW5zZWw7Cit9CisKKy8qIEJhbmsgMCAxIDIgMyA1IDYgNyAqLwordm9pZCB6ZlNldFJmUmVncyh6ZGV2X3QqIGRldiwgdTMyX3QgZnJlcXVlbmN5KQoreworICAgIHUxNl90IGVudHJpZXM7CisgICAgdTE2X3QgZnJlcUluZGV4ID0gMDsKKyAgICB1MTZfdCBpOworCisgICAgLy96bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBpZiAoIGZyZXF1ZW5jeSA+IFpNX0NIX0dfMTQgKQorICAgIHsKKyAgICAgICAgLyogNUcgKi8KKyAgICAgICAgZnJlcUluZGV4ID0gMTsKKyAgICAgICAgem1fbXNnMF9zY2FuKFpNX0xWXzIsICJTZXQgdG8gNUdIeiIpOworCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qIDIuNEcgKi8KKyAgICAgICAgZnJlcUluZGV4ID0gMjsKKyAgICAgICAgem1fbXNnMF9zY2FuKFpNX0xWXzIsICJTZXQgdG8gMi40R0h6Iik7CisgICAgfQorCisjaWYgMQorICAgIGVudHJpZXMgPSBzaXplb2Yob3R1c0JhbmspIC8gc2l6ZW9mKCpvdHVzQmFuayk7CisgICAgZm9yIChpPTA7IGk8ZW50cmllczsgaSsrKQorICAgIHsKKyAgICAgICAgcmVnX3dyaXRlKG90dXNCYW5rW2ldWzBdLCBvdHVzQmFua1tpXVtmcmVxSW5kZXhdKTsKKyAgICB9CisjZWxzZQorICAgIC8qIEJhbmswICovCisgICAgZW50cmllcyA9IHNpemVvZihhcjU0MTZCYW5rMCkgLyBzaXplb2YoKmFyNTQxNkJhbmswKTsKKyAgICBmb3IgKGk9MDsgaTxlbnRyaWVzOyBpKyspCisgICAgeworICAgICAgICByZWdfd3JpdGUoYXI1NDE2QmFuazBbaV1bMF0sIGFyNTQxNkJhbmswW2ldWzFdKTsKKyAgICB9CisgICAgLyogQmFuazEgKi8KKyAgICBlbnRyaWVzID0gc2l6ZW9mKGFyNTQxNkJhbmsxKSAvIHNpemVvZigqYXI1NDE2QmFuazEpOworICAgIGZvciAoaT0wOyBpPGVudHJpZXM7IGkrKykKKyAgICB7CisgICAgICAgIHJlZ193cml0ZShhcjU0MTZCYW5rMVtpXVswXSwgYXI1NDE2QmFuazFbaV1bMV0pOworICAgIH0KKyAgICAvKiBCYW5rMiAqLworICAgIGVudHJpZXMgPSBzaXplb2YoYXI1NDE2QmFuazIpIC8gc2l6ZW9mKCphcjU0MTZCYW5rMik7CisgICAgZm9yIChpPTA7IGk8ZW50cmllczsgaSsrKQorICAgIHsKKyAgICAgICAgcmVnX3dyaXRlKGFyNTQxNkJhbmsyW2ldWzBdLCBhcjU0MTZCYW5rMltpXVsxXSk7CisgICAgfQorICAgIC8qIEJhbmszICovCisgICAgZW50cmllcyA9IHNpemVvZihhcjU0MTZCYW5rMykgLyBzaXplb2YoKmFyNTQxNkJhbmszKTsKKyAgICBmb3IgKGk9MDsgaTxlbnRyaWVzOyBpKyspCisgICAgeworICAgICAgICByZWdfd3JpdGUoYXI1NDE2QmFuazNbaV1bMF0sIGFyNTQxNkJhbmszW2ldW2ZyZXFJbmRleF0pOworICAgIH0KKyAgICAvKiBCYW5rNSAqLworICAgIHJlZ193cml0ZSAoMHg5OGIwLCAgMHgwMDAwMDAxMyk7CisgICAgcmVnX3dyaXRlICgweDk4ZTQsICAweDAwMDAwMDAyKTsKKyAgICAvKiBCYW5rNiAqLworICAgIGVudHJpZXMgPSBzaXplb2YoYXI1NDE2QmFuazYpIC8gc2l6ZW9mKCphcjU0MTZCYW5rNik7CisgICAgZm9yIChpPTA7IGk8ZW50cmllczsgaSsrKQorICAgIHsKKyAgICAgICAgcmVnX3dyaXRlKGFyNTQxNkJhbms2W2ldWzBdLCBhcjU0MTZCYW5rNltpXVtmcmVxSW5kZXhdKTsKKyAgICB9CisgICAgLyogQmFuazcgKi8KKyAgICBlbnRyaWVzID0gc2l6ZW9mKGFyNTQxNkJhbms3KSAvIHNpemVvZigqYXI1NDE2QmFuazcpOworICAgIGZvciAoaT0wOyBpPGVudHJpZXM7IGkrKykKKyAgICB7CisgICAgICAgIHJlZ193cml0ZShhcjU0MTZCYW5rN1tpXVswXSwgYXI1NDE2QmFuazdbaV1bMV0pOworICAgIH0KKyNlbmRpZgorCisgICAgemZGbHVzaERlbGF5V3JpdGUoZGV2KTsKK30KKworLyogQmFuayA0ICovCit2b2lkIHpmU2V0QmFuazRBbmRQb3dlclRhYmxlKHpkZXZfdCogZGV2LCB1MzJfdCBmcmVxdWVuY3ksIHU4X3QgYnc0MCwKKyAgICAgICAgdThfdCBleHRPZmZzZXQpCit7CisgICAgdTMyX3QgY2h1cCA9IDE7CisJdTMyX3QgYm1vZGVfTEZfc3ludGhfZnJlcSA9IDA7CisJdTMyX3QgYW1vZGVfcmVmc2VsXzEgPSAwOworCXUzMl90IGFtb2RlX3JlZnNlbF8wID0gMTsKKwl1MzJfdCBhZGRyMiA9IDE7CisJdTMyX3QgYWRkcjEgPSAwOworCXUzMl90IGFkZHIwID0gMDsKKworCXUzMl90IGQxOworCXUzMl90IGQwOworCXUzMl90IHRtcF8wOworCXUzMl90IHRtcF8xOworCXUzMl90IGRhdGEwOworCXUzMl90IGRhdGExOworCisJdThfdCBjaGFuc2VsOworCXU4X3QgY2hhbl9zZWw7CisJdTMyX3QgdGVtcF9jaGFuX3NlbDsKKworICAgIHUxNl90IGk7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKworICAgIC8qIGlmIGVuYWJsZSA4MDIuMTFoLCBuZWVkIHRvIHJlY29yZCBjdXJlbnQgY2hhbm5lbCBpbmRleCBpbiBjaGFubmVsIGFycmF5ICovCisgICAgaWYgKHdkLT5zdGEuREZTRW5hYmxlKQorICAgIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsQ250OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbFtpXS5jaGFubmVsID09IGZyZXF1ZW5jeSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICB3ZC0+cmVndWxhdGlvblRhYmxlLkN1ckNoSW5kZXggPSBpOworICAgIH0KKworCWlmIChidzQwID09IDEpCisJeworICAgICAgICBpZiAoZXh0T2Zmc2V0ID09IDEpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZyZXF1ZW5jeSArPSAxMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGZyZXF1ZW5jeSAtPSAxMDsKKyAgICAgICAgfQorCisJfQorCisKKwlpZiAoIGZyZXF1ZW5jeSA+IDMwMDAgKQorCXsKKwkgICAgaWYgKCBmcmVxdWVuY3kgJSAxMCApCisJICAgIHsKKwkgICAgICAgIC8qIDVNICovCisgICAgICAgICAgICBjaGFuX3NlbCA9ICh1OF90KSgoZnJlcXVlbmN5IC0gNDgwMCkvNSk7CisgICAgICAgICAgICBjaGFuX3NlbCA9ICh1OF90KShjaGFuX3NlbCAmIDB4ZmYpOworICAgICAgICAgICAgY2hhbnNlbCAgPSAodThfdClyZXZlcnNlX2JpdHMoY2hhbl9zZWwpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLyogMTBNIDogaW1wcm92ZSBUeCBFVk0gKi8KKyAgICAgICAgICAgIGNoYW5fc2VsID0gKHU4X3QpKChmcmVxdWVuY3kgLSA0ODAwKS8xMCk7CisgICAgICAgICAgICBjaGFuX3NlbCA9ICh1OF90KShjaGFuX3NlbCAmIDB4ZmYpPDwxOworICAgICAgICAgICAgY2hhbnNlbCAgPSAodThfdClyZXZlcnNlX2JpdHMoY2hhbl9zZWwpOworCisJICAgICAgICBhbW9kZV9yZWZzZWxfMSA9IDE7CisJICAgICAgICBhbW9kZV9yZWZzZWxfMCA9IDA7CisgICAgICAgIH0KKwl9CisJZWxzZQorCXsKKyAgICAgICAgLy90ZW1wX2NoYW5fc2VsID0gKCgoZnJlcXVlbmN5IC0gNjcyKSoyKSAtIDMwNDApLzEwOworICAgICAgICBpZiAoZnJlcXVlbmN5ID09IDI0ODQpCisgICAgICAgIHsKKyAgIAkgICAgICAgIHRlbXBfY2hhbl9zZWwgPSAxMCArIChmcmVxdWVuY3kgLSAyMjc0KS81IDsKKyAgIAkgICAgICAgIGJtb2RlX0xGX3N5bnRoX2ZyZXEgPSAxOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgdGVtcF9jaGFuX3NlbCA9IDE2ICsgKGZyZXF1ZW5jeSAtIDIyNzIpLzUgOworICAgICAgICAgICAgYm1vZGVfTEZfc3ludGhfZnJlcSA9IDA7CisgICAgICAgIH0KKyAgICAgICAgY2hhbl9zZWwgPSAodThfdCkodGVtcF9jaGFuX3NlbCA8PCAyKSAmIDB4ZmY7CisgICAgICAgIGNoYW5zZWwgID0gKHU4X3QpcmV2ZXJzZV9iaXRzKGNoYW5fc2VsKTsKKwl9CisKKwlkMSAgID0gY2hhbnNlbDsgICAvLyMgOCBiaXRzIG9mIGNoYW4KKwlkMCAgID0gYWRkcjA8PDcgfCBhZGRyMTw8NiB8IGFkZHIyPDw1CisJCQl8IGFtb2RlX3JlZnNlbF8wPDwzIHwgYW1vZGVfcmVmc2VsXzE8PDIKKwkJCXwgYm1vZGVfTEZfc3ludGhfZnJlcTw8MSB8IGNodXA7CisKKyAgICB0bXBfMCA9IGQwICYgMHgxZjsgIC8vIyA1LTEKKyAgICB0bXBfMSA9IGQxICYgMHgxZjsgIC8vIyA1LTEKKyAgICBkYXRhMCA9IHRtcF8xPDw1IHwgdG1wXzA7CisKKyAgICB0bXBfMCA9IGQwPj41ICYgMHg3OyAgLy8jIDgtNgorICAgIHRtcF8xID0gZDE+PjUgJiAweDc7ICAvLyMgOC02CisgICAgZGF0YTEgPSB0bXBfMTw8NSB8IHRtcF8wOworCisgICAgLyogQmFuazQgKi8KKwlyZWdfd3JpdGUgKDB4OTgwMCsoMHgyYzw8MiksIGRhdGEwKTsKKwlyZWdfd3JpdGUgKDB4OTgwMCsoMHgzYTw8MiksIGRhdGExKTsKKwkvL3ptX2RlYnVnX21zZzEoIjB4OTgwMCsoMHgyYzw8MiA9ICAiLCBkYXRhMCk7CisJLy96bV9kZWJ1Z19tc2cxKCIweDk4MDArKDB4M2E8PDIgPSAgIiwgZGF0YTEpOworCisKKyAgICB6ZkZsdXNoRGVsYXlXcml0ZShkZXYpOworCisgICAgemZ3U2xlZXAoZGV2LCAxMCk7CisKKyAgICByZXR1cm47Cit9CisKKworc3RydWN0IHpzUGh5RnJlcVBhcmEKK3sKKyAgICB1MzJfdCBjb2VmZl9leHA7CisgICAgdTMyX3QgY29lZmZfbWFuOworICAgIHUzMl90IGNvZWZmX2V4cF9zaGdpOworICAgIHUzMl90IGNvZWZmX21hbl9zaGdpOworfTsKKworc3RydWN0IHpzUGh5RnJlcVRhYmxlCit7CisgICAgdTMyX3QgZnJlcXVlbmN5OworICAgIHN0cnVjdCB6c1BoeUZyZXFQYXJhIEZwZ2FEeW5hbWljSFQ7CisgICAgc3RydWN0IHpzUGh5RnJlcVBhcmEgRnBnYVN0YXRpY0hUOworICAgIHN0cnVjdCB6c1BoeUZyZXFQYXJhIENoaXBTVDIwTWh6OworICAgIHN0cnVjdCB6c1BoeUZyZXFQYXJhIENoaXAyMDQwTWh6OworICAgIHN0cnVjdCB6c1BoeUZyZXFQYXJhIENoaXAyMDQwRXh0QWJvdmU7Cit9OworCitjb25zdCBzdHJ1Y3QgenNQaHlGcmVxVGFibGUgemdQaHlGcmVxQ29lZmZbXSA9Cit7CisvKkluZGV4ICAgZnJlcSAgRlBHQSBEWU5BTUlDX0hUMjA0MF9FTiAgRlBHQSBTVEFUSUNfSFQyMCAgICBSZWFsIENoaXAgc3RhdGljMjBNSHogICAgIFJlYWwgQ2hpcCAyMDQwTUh6ICAgUmVhbCBDaGlwIDIwNDBNaHogICovCisgICAgICAgLyogZmNsayA9ICAgICAgICAgMTAuOCAgICAgICAgICAgICAgICAyMS42ICAgICAgICAgICAgICAgICAgNDAgICAgICAgICAgICAgICAgICBleHQgYmVsb3cgNDAgICAgICAgZXh0IGFib3ZlIDQwICAgICAgICovCisvKiAgMCAqLyB7MjQxMiwgezUsIDIzNDc2LCA1LCAyMTEyOH0sIHs0LCAyMzQ3NiwgNCwgMjExMjh9LCB7MywgMjE3MzcsIDMsIDE5NTYzfSwgezMsIDIxODI3LCAzLCAxOTY0NH0sIHszLCAyMTY0NywgMywgMTk0ODJ9fSwKKy8qICAxICovIHsyNDE3LCB7NSwgMjM0MjcsIDUsIDIxMDg0fSwgezQsIDIzNDI3LCA0LCAyMTA4NH0sIHszLCAyMTY5MiwgMywgMTk1MjN9LCB7MywgMjE3ODIsIDMsIDE5NjA0fSwgezMsIDIxNjAyLCAzLCAxOTQ0Mn19LAorLyogIDIgKi8gezI0MjIsIHs1LCAyMzM3OSwgNSwgMjEwNDF9LCB7NCwgMjMzNzksIDQsIDIxMDQxfSwgezMsIDIxNjQ3LCAzLCAxOTQ4Mn0sIHszLCAyMTczNywgMywgMTk1NjN9LCB7MywgMjE1NTgsIDMsIDE5NDAyfX0sCisvKiAgMyAqLyB7MjQyNywgezUsIDIzMzMwLCA1LCAyMDk5N30sIHs0LCAyMzMzMCwgNCwgMjA5OTd9LCB7MywgMjE2MDIsIDMsIDE5NDQyfSwgezMsIDIxNjkyLCAzLCAxOTUyM30sIHszLCAyMTUxNCwgMywgMTkzNjJ9fSwKKy8qICA0ICovIHsyNDMyLCB7NSwgMjMyODMsIDUsIDIwOTU0fSwgezQsIDIzMjgzLCA0LCAyMDk1NH0sIHszLCAyMTU1OCwgMywgMTk0MDJ9LCB7MywgMjE2NDcsIDMsIDE5NDgyfSwgezMsIDIxNDcwLCAzLCAxOTMyM319LAorLyogIDUgKi8gezI0MzcsIHs1LCAyMzIzNSwgNSwgMjA5MTF9LCB7NCwgMjMyMzUsIDQsIDIwOTExfSwgezMsIDIxNTE0LCAzLCAxOTM2Mn0sIHszLCAyMTYwMiwgMywgMTk0NDJ9LCB7MywgMjE0MjYsIDMsIDE5MjgzfX0sCisvKiAgNiAqLyB7MjQ0MiwgezUsIDIzMTg3LCA1LCAyMDg2OH0sIHs0LCAyMzE4NywgNCwgMjA4Njh9LCB7MywgMjE0NzAsIDMsIDE5MzIzfSwgezMsIDIxNTU4LCAzLCAxOTQwMn0sIHszLCAyMTM4MiwgMywgMTkyNDR9fSwKKy8qICA3ICovIHsyNDQ3LCB7NSwgMjMxNDAsIDUsIDIwODI2fSwgezQsIDIzMTQwLCA0LCAyMDgyNn0sIHszLCAyMTQyNiwgMywgMTkyODN9LCB7MywgMjE1MTQsIDMsIDE5MzYyfSwgezMsIDIxMzM5LCAzLCAxOTIwNX19LAorLyogIDggKi8gezI0NTIsIHs1LCAyMzA5MywgNSwgMjA3ODN9LCB7NCwgMjMwOTMsIDQsIDIwNzgzfSwgezMsIDIxMzgyLCAzLCAxOTI0NH0sIHszLCAyMTQ3MCwgMywgMTkzMjN9LCB7MywgMjEyOTUsIDMsIDE5MTY2fX0sCisvKiAgOSAqLyB7MjQ1NywgezUsIDIzMDQ2LCA1LCAyMDc0MX0sIHs0LCAyMzA0NiwgNCwgMjA3NDF9LCB7MywgMjEzMzksIDMsIDE5MjA1fSwgezMsIDIxNDI2LCAzLCAxOTI4M30sIHszLCAyMTI1MiwgMywgMTkxMjd9fSwKKy8qIDEwICovIHsyNDYyLCB7NSwgMjI5OTksIDUsIDIwNjk5fSwgezQsIDIyOTk5LCA0LCAyMDY5OX0sIHszLCAyMTI5NSwgMywgMTkxNjZ9LCB7MywgMjEzODIsIDMsIDE5MjQ0fSwgezMsIDIxMjA5LCAzLCAxOTA4OH19LAorLyogMTEgKi8gezI0NjcsIHs1LCAyMjk1MiwgNSwgMjA2NTd9LCB7NCwgMjI5NTIsIDQsIDIwNjU3fSwgezMsIDIxMjUyLCAzLCAxOTEyN30sIHszLCAyMTMzOSwgMywgMTkyMDV9LCB7MywgMjExNjYsIDMsIDE5MDUwfX0sCisvKiAxMiAqLyB7MjQ3MiwgezUsIDIyOTA2LCA1LCAyMDYxNX0sIHs0LCAyMjkwNiwgNCwgMjA2MTV9LCB7MywgMjEyMDksIDMsIDE5MDg4fSwgezMsIDIxMjk1LCAzLCAxOTE2Nn0sIHszLCAyMTEyNCwgMywgMTkwMTF9fSwKKy8qIDEzICovIHsyNDg0LCB7NSwgMjI3OTUsIDUsIDIwNTE2fSwgezQsIDIyNzk1LCA0LCAyMDUxNn0sIHszLCAyMTEwNywgMywgMTg5OTZ9LCB7MywgMjExOTIsIDMsIDE5MDczfSwgezMsIDIxMDIyLCAzLCAxODkyMH19LAorLyogMTQgKi8gezQ5MjAsIHs2LCAyMzAxOCwgNiwgMjA3MTZ9LCB7NSwgMjMwMTgsIDUsIDIwNzE2fSwgezQsIDIxMzEzLCA0LCAxOTE4MX0sIHs0LCAyMTM1NiwgNCwgMTkyMjB9LCB7NCwgMjEyNjksIDQsIDE5MTQyfX0sCisvKiAxNSAqLyB7NDk0MCwgezYsIDIyOTI0LCA2LCAyMDYzMn0sIHs1LCAyMjkyNCwgNSwgMjA2MzJ9LCB7NCwgMjEyMjYsIDQsIDE5MTA0fSwgezQsIDIxMjY5LCA0LCAxOTE0Mn0sIHs0LCAyMTE4MywgNCwgMTkwNjV9fSwKKy8qIDE2ICovIHs0OTYwLCB7NiwgMjI4MzIsIDYsIDIwNTQ5fSwgezUsIDIyODMyLCA1LCAyMDU0OX0sIHs0LCAyMTE0MSwgNCwgMTkwMjd9LCB7NCwgMjExODMsIDQsIDE5MDY1fSwgezQsIDIxMDk4LCA0LCAxODk4OH19LAorLyogMTcgKi8gezQ5ODAsIHs2LCAyMjc0MCwgNiwgMjA0NjZ9LCB7NSwgMjI3NDAsIDUsIDIwNDY2fSwgezQsIDIxMDU2LCA0LCAxODk1MH0sIHs0LCAyMTA5OCwgNCwgMTg5ODh9LCB7NCwgMjEwMTQsIDQsIDE4OTEyfX0sCisvKiAxOCAqLyB7NTA0MCwgezYsIDIyNDY5LCA2LCAyMDIyM30sIHs1LCAyMjQ2OSwgNSwgMjAyMjN9LCB7NCwgMjA4MDUsIDQsIDE4NzI1fSwgezQsIDIwODQ2LCA0LCAxODc2Mn0sIHs0LCAyMDc2NCwgNCwgMTg2ODd9fSwKKy8qIDE5ICovIHs1MDYwLCB7NiwgMjIzODEsIDYsIDIwMTQzfSwgezUsIDIyMzgxLCA1LCAyMDE0M30sIHs0LCAyMDcyMywgNCwgMTg2NTF9LCB7NCwgMjA3NjQsIDQsIDE4Njg3fSwgezQsIDIwNjgyLCA0LCAxODYxNH19LAorLyogMjAgKi8gezUwODAsIHs2LCAyMjI5MywgNiwgMjAwNjN9LCB7NSwgMjIyOTMsIDUsIDIwMDYzfSwgezQsIDIwNjQxLCA0LCAxODU3N30sIHs0LCAyMDY4MiwgNCwgMTg2MTR9LCB7NCwgMjA2MDEsIDQsIDE4NTQxfX0sCisvKiAyMSAqLyB7NTE4MCwgezYsIDIxODYyLCA2LCAxOTY3Nn0sIHs1LCAyMTg2MiwgNSwgMTk2NzZ9LCB7NCwgMjAyNDMsIDQsIDE4MjE5fSwgezQsIDIwMjgyLCA0LCAxODI1NH0sIHs0LCAyMDIwNCwgNCwgMTgxODN9fSwKKy8qIDIyICovIHs1MjAwLCB7NiwgMjE3NzgsIDYsIDE5NjAwfSwgezUsIDIxNzc4LCA1LCAxOTYwMH0sIHs0LCAyMDE2NSwgNCwgMTgxNDh9LCB7NCwgMjAyMDQsIDQsIDE4MTgzfSwgezQsIDIwMTI2LCA0LCAxODExNH19LAorLyogMjMgKi8gezUyMjAsIHs2LCAyMTY5NSwgNiwgMTk1MjV9LCB7NSwgMjE2OTUsIDUsIDE5NTI1fSwgezQsIDIwMDg4LCA0LCAxODA3OX0sIHs0LCAyMDEyNiwgNCwgMTgxMTR9LCB7NCwgMjAwNDksIDQsIDE4MDQ0fX0sCisvKiAyNCAqLyB7NTI0MCwgezYsIDIxNjEyLCA2LCAxOTQ1MX0sIHs1LCAyMTYxMiwgNSwgMTk0NTF9LCB7NCwgMjAwMTEsIDQsIDE4MDEwfSwgezQsIDIwMDQ5LCA0LCAxODA0NH0sIHs0LCAxOTk3MywgNCwgMTc5NzZ9fSwKKy8qIDI1ICovIHs1MjYwLCB7NiwgMjE1MzAsIDYsIDE5Mzc3fSwgezUsIDIxNTMwLCA1LCAxOTM3N30sIHs0LCAxOTkzNSwgNCwgMTc5NDF9LCB7NCwgMTk5NzMsIDQsIDE3OTc2fSwgezQsIDE5ODk3LCA0LCAxNzkwN319LAorLyogMjYgKi8gezUyODAsIHs2LCAyMTQ0OCwgNiwgMTkzMDN9LCB7NSwgMjE0NDgsIDUsIDE5MzAzfSwgezQsIDE5ODU5LCA0LCAxNzg3M30sIHs0LCAxOTg5NywgNCwgMTc5MDd9LCB7NCwgMTk4MjIsIDQsIDE3ODQwfX0sCisvKiAyNyAqLyB7NTMwMCwgezYsIDIxMzY3LCA2LCAxOTIzMH0sIHs1LCAyMTM2NywgNSwgMTkyMzB9LCB7NCwgMTk3ODQsIDQsIDE3ODA2fSwgezQsIDE5ODIyLCA0LCAxNzg0MH0sIHs0LCAxOTc0NywgNCwgMTc3NzJ9fSwKKy8qIDI4ICovIHs1MzIwLCB7NiwgMjEyODcsIDYsIDE5MTU4fSwgezUsIDIxMjg3LCA1LCAxOTE1OH0sIHs0LCAxOTcxMCwgNCwgMTc3Mzl9LCB7NCwgMTk3NDcsIDQsIDE3NzcyfSwgezQsIDE5NjczLCA0LCAxNzcwNn19LAorLyogMjkgKi8gezU1MDAsIHs2LCAyMDU5MCwgNiwgMTg1MzF9LCB7NSwgMjA1OTAsIDUsIDE4NTMxfSwgezQsIDE5MDY1LCA0LCAxNzE1OX0sIHs0LCAxOTEwMCwgNCwgMTcxOTB9LCB7NCwgMTkwMzAsIDQsIDE3MTI3fX0sCisvKiAzMCAqLyB7NTUyMCwgezYsIDIwNTE2LCA2LCAxODQ2NH0sIHs1LCAyMDUxNiwgNSwgMTg0NjR9LCB7NCwgMTg5OTYsIDQsIDE3MDk2fSwgezQsIDE5MDMwLCA0LCAxNzEyN30sIHs0LCAxODk2MiwgNCwgMTcwNjV9fSwKKy8qIDMxICovIHs1NTQwLCB7NiwgMjA0NDIsIDYsIDE4Mzk3fSwgezUsIDIwNDQyLCA1LCAxODM5N30sIHs0LCAxODkyNywgNCwgMTcwMzV9LCB7NCwgMTg5NjIsIDQsIDE3MDY1fSwgezQsIDE4ODkzLCA0LCAxNzAwNH19LAorLyogMzIgKi8gezU1NjAsIHs2LCAyMDM2OCwgNiwgMTgzMzF9LCB7NSwgMjAzNjgsIDUsIDE4MzMxfSwgezQsIDE4ODU5LCA0LCAxNjk3M30sIHs0LCAxODg5MywgNCwgMTcwMDR9LCB7NCwgMTg4MjUsIDQsIDE2OTQzfX0sCisvKiAzMyAqLyB7NTU4MCwgezYsIDIwMjk1LCA2LCAxODI2Nn0sIHs1LCAyMDI5NSwgNSwgMTgyNjZ9LCB7NCwgMTg3OTIsIDQsIDE2OTEzfSwgezQsIDE4ODI1LCA0LCAxNjk0M30sIHs0LCAxODc1OCwgNCwgMTY4ODJ9fSwKKy8qIDM0ICovIHs1NjAwLCB7NiwgMjAyMjMsIDYsIDE4MjAwfSwgezUsIDIwMjIzLCA1LCAxODIwMH0sIHs0LCAxODcyNSwgNCwgMTY4NTJ9LCB7NCwgMTg3NTgsIDQsIDE2ODgyfSwgezQsIDE4NjkxLCA0LCAxNjgyMn19LAorLyogMzUgKi8gezU2MjAsIHs2LCAyMDE1MSwgNiwgMTgxMzZ9LCB7NSwgMjAxNTEsIDUsIDE4MTM2fSwgezQsIDE4NjU4LCA0LCAxNjc5Mn0sIHs0LCAxODY5MSwgNCwgMTY4MjJ9LCB7NCwgMTg2MjUsIDQsIDE2NzYyfX0sCisvKiAzNiAqLyB7NTY0MCwgezYsIDIwMDc5LCA2LCAxODA3MX0sIHs1LCAyMDA3OSwgNSwgMTgwNzF9LCB7NCwgMTg1OTIsIDQsIDE2NzMzfSwgezQsIDE4NjI1LCA0LCAxNjc2Mn0sIHs0LCAxODU1OSwgNCwgMTY3MDN9fSwKKy8qIDM3ICovIHs1NjYwLCB7NiwgMjAwMDgsIDYsIDE4MDA3fSwgezUsIDIwMDA4LCA1LCAxODAwN30sIHs0LCAxODUyNiwgNCwgMTY2NzN9LCB7NCwgMTg1NTksIDQsIDE2NzAzfSwgezQsIDE4NDkzLCA0LCAxNjY0NH19LAorLyogMzggKi8gezU2ODAsIHs2LCAxOTkzOCwgNiwgMTc5NDR9LCB7NSwgMTk5MzgsIDUsIDE3OTQ0fSwgezQsIDE4NDYxLCA0LCAxNjYxNX0sIHs0LCAxODQ5MywgNCwgMTY2NDR9LCB7NCwgMTg0MjgsIDQsIDE2NTg2fX0sCisvKiAzOSAqLyB7NTcwMCwgezYsIDE5ODY4LCA2LCAxNzg4MX0sIHs1LCAxOTg2OCwgNSwgMTc4ODF9LCB7NCwgMTgzOTYsIDQsIDE2NTU2fSwgezQsIDE4NDI4LCA0LCAxNjU4Nn0sIHs0LCAxODM2NCwgNCwgMTY1Mjd9fSwKKy8qIDQwICovIHs1NzQ1LCB7NiwgMTk3MTIsIDYsIDE3NzQxfSwgezUsIDE5NzEyLCA1LCAxNzc0MX0sIHs0LCAxODI1MiwgNCwgMTY0Mjd9LCB7NCwgMTgyODQsIDQsIDE2NDU1fSwgezQsIDE4MjIwLCA0LCAxNjM5OH19LAorLyogNDEgKi8gezU3NjUsIHs2LCAxOTY0NCwgNiwgMTc2Nzl9LCB7NSwgMTk2NDQsIDUsIDE3Njc5fSwgezQsIDE4MTg5LCA1LCAzMjc0MH0sIHs0LCAxODIyMCwgNCwgMTYzOTh9LCB7NCwgMTgxNTcsIDUsIDMyNjgzfX0sCisvKiA0MiAqLyB7NTc4NSwgezYsIDE5NTc2LCA2LCAxNzYxOH0sIHs1LCAxOTU3NiwgNSwgMTc2MTh9LCB7NCwgMTgxMjYsIDUsIDMyNjI2fSwgezQsIDE4MTU3LCA1LCAzMjY4M30sIHs0LCAxODA5NCwgNSwgMzI1NzB9fSwKKy8qIDQzICovIHs1ODA1LCB7NiwgMTk1MDgsIDYsIDE3NTU4fSwgezUsIDE5NTA4LCA1LCAxNzU1OH0sIHs0LCAxODA2MywgNSwgMzI1MTR9LCB7NCwgMTgwOTQsIDUsIDMyNTcwfSwgezQsIDE4MDMyLCA1LCAzMjQ1OH19LAorLyogNDQgKi8gezU4MjUsIHs2LCAxOTQ0MSwgNiwgMTc0OTd9LCB7NSwgMTk0NDEsIDUsIDE3NDk3fSwgezQsIDE4MDAxLCA1LCAzMjQwMn0sIHs0LCAxODAzMiwgNSwgMzI0NTh9LCB7NCwgMTc5NzAsIDUsIDMyMzQ3fX0sCisvKiA0NSAqLyB7NTE3MCwgezYsIDIxOTA0LCA2LCAxOTcxNH0sIHs1LCAyMTkwNCwgNSwgMTk3MTR9LCB7NCwgMjAyODIsIDQsIDE4MjU0fSwgezQsIDIwMzIxLCA0LCAxODI4OX0sIHs0LCAyMDI0MywgNCwgMTgyMTl9fSwKKy8qIDQ2ICovIHs1MTkwLCB7NiwgMjE4MjAsIDYsIDE5NjM4fSwgezUsIDIxODIwLCA1LCAxOTYzOH0sIHs0LCAyMDIwNCwgNCwgMTgxODN9LCB7NCwgMjAyNDMsIDQsIDE4MjE5fSwgezQsIDIwMTY1LCA0LCAxODE0OH19LAorLyogNDcgKi8gezUyMTAsIHs2LCAyMTczNiwgNiwgMTk1NjN9LCB7NSwgMjE3MzYsIDUsIDE5NTYzfSwgezQsIDIwMTI2LCA0LCAxODExNH0sIHs0LCAyMDE2NSwgNCwgMTgxNDh9LCB7NCwgMjAwODgsIDQsIDE4MDc5fX0sCisvKiA0OCAqLyB7NTIzMCwgezYsIDIxNjUzLCA2LCAxOTQ4OH0sIHs1LCAyMTY1MywgNSwgMTk0ODh9LCB7NCwgMjAwNDksIDQsIDE4MDQ0fSwgezQsIDIwMDg4LCA0LCAxODA3OX0sIHs0LCAyMDAxMSwgNCwgMTgwMTB9fQorfTsKKy8qIHRvIHJlZHVjZSBzZWFyY2ggdGltZSwgcGxlYXNlIG1vZGlmeSB0aGlzIGRlZmluZSBpZiB5b3UgYWRkIG9yIGRlbGV0ZSBjaGFubmVsIGluIHRhYmxlICovCisjZGVmaW5lIEZpcnN0NUdDaGFubmVsSW5kZXggMTQKKwordm9pZCB6ZkdldEh3VHVybk9mZmR5blBhcmFtKHpkZXZfdCogZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl90IGZyZXF1ZW5jeSwgdThfdCBidzQwLCB1OF90IGV4dE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGRlbHRhX3Nsb3BlX2NvZWZmX2V4cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGRlbHRhX3Nsb3BlX2NvZWZmX21hbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGRlbHRhX3Nsb3BlX2NvZWZmX2V4cF9zaGdpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogZGVsdGFfc2xvcGVfY29lZmZfbWFuX3NoZ2kpCit7CisgICAgLyogR2V0IHBhcmFtIGZvciB0dXJub2ZmZHluICovCisgICAgdTE2X3QgaSwgYXJyYXlTaXplOworCisgICAgLy96bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBhcnJheVNpemUgPSBzaXplb2YoemdQaHlGcmVxQ29lZmYpL3NpemVvZihzdHJ1Y3QgenNQaHlGcmVxVGFibGUpOworICAgIGlmIChmcmVxdWVuY3kgPCAzMDAwKQorICAgIHsKKyAgICAgICAgLyogMi40R0h6IENoYW5uZWwgKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IEZpcnN0NUdDaGFubmVsSW5kZXg7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGZyZXF1ZW5jeSA9PSB6Z1BoeUZyZXFDb2VmZltpXS5mcmVxdWVuY3kpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaSA8IEZpcnN0NUdDaGFubmVsSW5kZXgpCisgICAgICAgIHsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHptX21zZzFfc2NhbihaTV9MVl8wLCAiVW5zdXBwb3J0ZWQgMi40RyBmcmVxdWVuY3kgPSAiLCBmcmVxdWVuY3kpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qIDVHSHogQ2hhbm5lbCAqLworICAgICAgICBmb3IgKGkgPSBGaXJzdDVHQ2hhbm5lbEluZGV4OyBpIDwgYXJyYXlTaXplOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChmcmVxdWVuY3kgPT0gemdQaHlGcmVxQ29lZmZbaV0uZnJlcXVlbmN5KQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGkgPCBhcnJheVNpemUpCisgICAgICAgIHsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHptX21zZzFfc2NhbihaTV9MVl8wLCAiVW5zdXBwb3J0ZWQgNUcgZnJlcXVlbmN5ID0gIiwgZnJlcXVlbmN5KTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIEZQR0EgRFlOQU1JQ19IVDIwNDBfRU4gICAgICAgIGZjbGsgPSAxMC44ICAqLworICAgIC8qIEZQR0EgU1RBVElDX0hUMjBfICAgICAgICAgICAgIGZjbGsgPSAyMS42ICAqLworICAgIC8qIFJlYWwgQ2hpcCAgICAgICAgICAgICAgICAgICAgIGZjbGsgPSA0MCAgICAqLworICAgICNpZiBaTV9GUEdBX1BIWSA9PSAxCisgICAgLy9mY2xrID0gMTAuODsKKyAgICAqZGVsdGFfc2xvcGVfY29lZmZfZXhwID0gemdQaHlGcmVxQ29lZmZbaV0uRnBnYUR5bmFtaWNIVC5jb2VmZl9leHA7CisgICAgKmRlbHRhX3Nsb3BlX2NvZWZmX21hbiA9IHpnUGh5RnJlcUNvZWZmW2ldLkZwZ2FEeW5hbWljSFQuY29lZmZfbWFuOworICAgICpkZWx0YV9zbG9wZV9jb2VmZl9leHBfc2hnaSA9IHpnUGh5RnJlcUNvZWZmW2ldLkZwZ2FEeW5hbWljSFQuY29lZmZfZXhwX3NoZ2k7CisgICAgKmRlbHRhX3Nsb3BlX2NvZWZmX21hbl9zaGdpID0gemdQaHlGcmVxQ29lZmZbaV0uRnBnYUR5bmFtaWNIVC5jb2VmZl9tYW5fc2hnaTsKKyAgICAjZWxzZQorICAgIC8vZmNsayA9IDQwOworICAgIGlmIChidzQwKQorICAgIHsKKyAgICAgICAgLyogaHQyMDQwICovCisgICAgICAgIGlmIChleHRPZmZzZXQgPT0gMSkgeworICAgICAgICAgICAgKmRlbHRhX3Nsb3BlX2NvZWZmX2V4cCA9IHpnUGh5RnJlcUNvZWZmW2ldLkNoaXAyMDQwRXh0QWJvdmUuY29lZmZfZXhwOworICAgICAgICAgICAgKmRlbHRhX3Nsb3BlX2NvZWZmX21hbiA9IHpnUGh5RnJlcUNvZWZmW2ldLkNoaXAyMDQwRXh0QWJvdmUuY29lZmZfbWFuOworICAgICAgICAgICAgKmRlbHRhX3Nsb3BlX2NvZWZmX2V4cF9zaGdpID0gemdQaHlGcmVxQ29lZmZbaV0uQ2hpcDIwNDBFeHRBYm92ZS5jb2VmZl9leHBfc2hnaTsKKyAgICAgICAgICAgICpkZWx0YV9zbG9wZV9jb2VmZl9tYW5fc2hnaSA9IHpnUGh5RnJlcUNvZWZmW2ldLkNoaXAyMDQwRXh0QWJvdmUuY29lZmZfbWFuX3NoZ2k7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAqZGVsdGFfc2xvcGVfY29lZmZfZXhwID0gemdQaHlGcmVxQ29lZmZbaV0uQ2hpcDIwNDBNaHouY29lZmZfZXhwOworICAgICAgICAgICAgKmRlbHRhX3Nsb3BlX2NvZWZmX21hbiA9IHpnUGh5RnJlcUNvZWZmW2ldLkNoaXAyMDQwTWh6LmNvZWZmX21hbjsKKyAgICAgICAgICAgICpkZWx0YV9zbG9wZV9jb2VmZl9leHBfc2hnaSA9IHpnUGh5RnJlcUNvZWZmW2ldLkNoaXAyMDQwTWh6LmNvZWZmX2V4cF9zaGdpOworICAgICAgICAgICAgKmRlbHRhX3Nsb3BlX2NvZWZmX21hbl9zaGdpID0gemdQaHlGcmVxQ29lZmZbaV0uQ2hpcDIwNDBNaHouY29lZmZfbWFuX3NoZ2k7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogc3RhdGljIDIwICovCisgICAgICAgICpkZWx0YV9zbG9wZV9jb2VmZl9leHAgPSB6Z1BoeUZyZXFDb2VmZltpXS5DaGlwU1QyME1oei5jb2VmZl9leHA7CisgICAgICAgICpkZWx0YV9zbG9wZV9jb2VmZl9tYW4gPSB6Z1BoeUZyZXFDb2VmZltpXS5DaGlwU1QyME1oei5jb2VmZl9tYW47CisgICAgICAgICpkZWx0YV9zbG9wZV9jb2VmZl9leHBfc2hnaSA9IHpnUGh5RnJlcUNvZWZmW2ldLkNoaXBTVDIwTWh6LmNvZWZmX2V4cF9zaGdpOworICAgICAgICAqZGVsdGFfc2xvcGVfY29lZmZfbWFuX3NoZ2kgPSB6Z1BoeUZyZXFDb2VmZltpXS5DaGlwU1QyME1oei5jb2VmZl9tYW5fc2hnaTsKKyAgICB9CisgICAgI2VuZGlmCit9CisKKy8qIE1haW4gcm91dGluIGZyZXF1ZW5jeSBzZXR0aW5nIGZ1bmN0aW9uICovCisvKiBJZiAyLjRHLzVHIHN3aXRjaCwgUEhZIG5lZWQgcmVzZXR0aW5nIEJCIGFuZCBSRiBmb3IgYmFuZCBzd2l0Y2ggKi8KKy8qIERvIHRoZSBzZXR0aW5nIHN3aXRjaCBpbiB6ZlNlbmRGcmVxdWVuY3lDbWQoKSAqLwordm9pZCB6ZkhwU2V0RnJlcXVlbmN5RXgoemRldl90KiBkZXYsIHUzMl90IGZyZXF1ZW5jeSwgdThfdCBidzQwLAorICAgICAgICB1OF90IGV4dE9mZnNldCwgdThfdCBpbml0UkYpCit7CisgICAgdTMyX3QgY21kWzldOworICAgIHUzMl90IGNtZEJbM107CisgICAgdTE2X3QgcmV0OworICAgIHU4X3Qgb2xkX2JhbmQ7CisgICAgdThfdCBuZXdfYmFuZDsKKyAgICB1MzJfdCBjaGVja0xvb3BDb3VudDsKKyAgICB1MzJfdCB0bXBWYWx1ZTsKKworICAgIGludCBkZWx0YV9zbG9wZV9jb2VmZl9leHA7CisgICAgaW50IGRlbHRhX3Nsb3BlX2NvZWZmX21hbjsKKyAgICBpbnQgZGVsdGFfc2xvcGVfY29lZmZfZXhwX3NoZ2k7CisgICAgaW50IGRlbHRhX3Nsb3BlX2NvZWZmX21hbl9zaGdpOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworICAgIHN0cnVjdCB6c0hwUHJpdiogaHBQcml2ID0gd2QtPmhwUHJpdmF0ZTsKKworICAgIHptX21zZzFfc2NhbihaTV9MVl8xLCAiRnJlcXVlbmN5ID0gIiwgZnJlcXVlbmN5KTsKKyAgICB6bV9tc2cxX3NjYW4oWk1fTFZfMSwgImJ3NDAgPSAiLCBidzQwKTsKKyAgICB6bV9tc2cxX3NjYW4oWk1fTFZfMSwgImV4dE9mZnNldCA9ICIsIGV4dE9mZnNldCk7CisKKyAgICBpZiAoIGhwUHJpdi0+Y29sZFJlc2V0TmVlZEZyZXEgKQorICAgIHsKKyAgICAgICAgaHBQcml2LT5jb2xkUmVzZXROZWVkRnJlcSA9IDA7CisgICAgICAgIGluaXRSRiA9IDI7CisgICAgICAgIHptX2RlYnVnX21zZzAoInpmSHBTZXRGcmVxdWVuY3lFeDogRG8gQ29sZFJlc2V0ICIpOworICAgIH0KKyAgICBpZiAoIGhwUHJpdi0+aXNTaXRlU3VydmV5ID09IDIgKQorICAgIHsKKyAgICAgICAgLyogd2FpdCB0aW1lIGZvciBBR0MgYW5kIG5vaXNlIGNhbGlicmF0aW9uIDogbm90IGluIHNpdGVzdXJ2ZXkgYW5kIGNvbm5lY3RlZCAqLworICAgICAgICBjaGVja0xvb3BDb3VudCA9IDIwMDA7IC8qIDIwMDAqMTAwID0gMjAwbXMgKi8KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogd2FpdCB0aW1lIGZvciBBR0MgYW5kIG5vaXNlIGNhbGlicmF0aW9uIDogaW4gc2l0ZXN1cnZleSAqLworICAgICAgICBjaGVja0xvb3BDb3VudCA9IDEwMDA7IC8qIDEwMDAqMTAwID0gMTAwbXMgKi8KKyAgICB9CisKKyAgICBocFByaXYtPmxhdGVzdEZyZXF1ZW5jeSA9IGZyZXF1ZW5jeTsKKyAgICBocFByaXYtPmxhdGVzdEJ3NDAgPSBidzQwOworICAgIGhwUHJpdi0+bGF0ZXN0RXh0T2Zmc2V0ID0gZXh0T2Zmc2V0OworCisgICAgaWYgKChocFByaXYtPmRvdDExTW9kZSA9PSBaTV9IQUxfODAyMTFfTU9ERV9JQlNTX0dFTkVSQUwpIHx8CisgICAgICAgIChocFByaXYtPmRvdDExTW9kZSA9PSBaTV9IQUxfODAyMTFfTU9ERV9JQlNTX1dQQTJQU0spKQorICAgIHsKKyAgICAgICAgaWYgKCBmcmVxdWVuY3kgPD0gWk1fQ0hfR18xNCApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIHdvcmthcm91bmQgZm9yIDExZyBBZCBIb2MgYmVhY29uIGRpc3RyaWJ1dGlvbiAqLworICAgICAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBaTV9NQUNfUkVHX0FDMF9DVywgMHg3ZjAwMDcpOworICAgICAgICAgICAgLy96ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIFpNX01BQ19SRUdfQUMxX0FDMF9BSUZTLCAweDFjMDQ5MDFjKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIEFIQiwgREFDLCBBREMgY2xvY2sgc2VsZWN0aW9uIGJ5IHN0YXRpYzIwL2h0MjA0MCAqLworICAgIHpmU2VsQWRjQ2xrKGRldiwgYnc0MCwgZnJlcXVlbmN5KTsKKworICAgIC8qIGNsZWFyIGJiX2hlYXZ5X2NsaXBfZW5hYmxlICovCisgICAgcmVnX3dyaXRlKDB4OTllMCwgMHgyMDApOworICAgIHpmRmx1c2hEZWxheVdyaXRlKGRldik7CisKKyAgICAvKiBTZXQgQ1RTL1JUUyByYXRlICovCisgICAgaWYgKCBmcmVxdWVuY3kgPiBaTV9DSF9HXzE0ICkKKyAgICB7CisgICAgICAgIC8vemZIcFNldFJUU0NUU1JhdGUoZGV2LCAweDEwYjAxMGIpOyAgLyogT0ZETSA2TSAqLworCSAgICBuZXdfYmFuZCA9IDE7CisJfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8vemZIcFNldFJUU0NUU1JhdGUoZGV2LCAweDMwMDAzKTsgIC8qIENDSyAxMU0gKi8KKyAgICAgICAgbmV3X2JhbmQgPSAwOworICAgIH0KKworICAgIGlmICgoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmh3RnJlcXVlbmN5ID4gWk1fQ0hfR18xNCkKKyAgICAgICAgb2xkX2JhbmQgPSAxOworICAgIGVsc2UKKyAgICAgICAgb2xkX2JhbmQgPSAwOworCisgICAgLy9Xb3JrYXJvdW5kIGZvciAyLjRHSHogb25seSBkZXZpY2UKKyAgICBpZiAoKGhwUHJpdi0+T3BGbGFncyAmIDB4MSkgPT0gMCkKKyAgICB7CisgICAgICAgIGlmICgoKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5od0ZyZXF1ZW5jeSA9PSBaTV9DSF9HXzEpICYmIChmcmVxdWVuY3kgPT0gWk1fQ0hfR18yKSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogRm9yY2UgdG8gZG8gYmFuZCBzd2l0Y2hpbmcgKi8KKyAgICAgICAgICAgIG9sZF9iYW5kID0gMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIE5vdGlmeSBjaGFubmVsIHN3aXRjaCB0byBmaXJtd2FyZSAqLworICAgIC8qIFRYL1JYIG11c3QgYmUgc3RvcHBlZCBieSBub3cgKi8KKyAgICBjbWRbMF0gPSAwIHwgKFpNX0NNRF9GUkVRX1NUUkFUIDw8IDgpOworICAgIHJldCA9IHpmSXNzdWVDbWQoZGV2LCBjbWQsIDgsIFpNX09JRF9JTlRFUk5BTF9XUklURSwgMCk7CisKKyAgICBpZiAoKGluaXRSRiAhPSAwKSB8fCAobmV3X2JhbmQgIT0gb2xkX2JhbmQpCisgICAgICAgICAgICB8fCAoKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5od0J3NDAgIT0gYnc0MCkpCisgICAgeworICAgICAgICAvKiBiYW5kIHN3aXRjaCAqLworICAgICAgICB6bV9tc2cwX3NjYW4oWk1fTFZfMSwgIj09PT09YmFuZCBzd2l0Y2g9PT09PSIpOworCisgICAgICAgIGlmIChpbml0UkYgPT0gMiApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vQ29sZCByZXNldCBCQi9BRERBCisgICAgICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIDB4MWQ0MDA0LCAweDgwMCk7CisgICAgICAgICAgICB6ZkZsdXNoRGVsYXlXcml0ZShkZXYpOworICAgICAgICAgICAgem1fbXNnMF9zY2FuKFpNX0xWXzEsICJEbyBjb2xkIHJlc2V0IEJCL0FEREEiKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vV2FybSByZXNldCBCQi9BRERBCisgICAgICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIDB4MWQ0MDA0LCAweDQwMCk7CisgICAgICAgICAgICB6ZkZsdXNoRGVsYXlXcml0ZShkZXYpOworICAgICAgICB9CisKKyAgICAgICAgLyogcmVzZXQgd29ya2Fyb3VuZCBzdGF0ZSB0byBkZWZhdWx0ICovCisgICAgICAgIGhwUHJpdi0+cnhTdHJvbmdSU1NJID0gMDsKKyAgICAgICAgaHBQcml2LT5zdHJvbmdSU1NJID0gMDsKKworICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIDB4MWQ0MDA0LCAweDApOworICAgICAgICB6ZkZsdXNoRGVsYXlXcml0ZShkZXYpOworCisgICAgICAgIHpmSW5pdFBoeShkZXYsIGZyZXF1ZW5jeSwgYnc0MCk7CisKKy8vICAgICAgICB6ZmlDaGVja1JpZnMoZGV2KTsKKworICAgICAgICAvKiBCYW5rIDAgMSAyIDMgNSA2IDcgKi8KKyAgICAgICAgemZTZXRSZlJlZ3MoZGV2LCBmcmVxdWVuY3kpOworICAgICAgICAvKiBCYW5rIDQgKi8KKyAgICAgICAgemZTZXRCYW5rNEFuZFBvd2VyVGFibGUoZGV2LCBmcmVxdWVuY3ksIGJ3NDAsIGV4dE9mZnNldCk7CisKKyAgICAgICAgY21kWzBdID0gMzIgfCAoWk1fQ01EX1JGX0lOSVQgPDwgOCk7CisgICAgfQorICAgIGVsc2UgLy8oKG5ld19iYW5kID09IG9sZF9iYW5kKSAmJiAhaW5pdFJGKQorICAgIHsKKyAgICAgICAvKiBzYW1lIGJhbmQgKi8KKworICAgICAgIC8qIEZvcmNlIGRpc2FibGUgQ1I2NzEgYml0MjAgLyA3ODIzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgIC8qIFRoZSBidWcgaGFzIHRvIGRvIHdpdGggdGhlIHBvbGFyaXR5IG9mIHRoZSBwZGFkYyBvZmZzZXQgY2FsaWJyYXRpb24uICBUaGVyZSAqLworICAgICAgIC8qIGlzIGFuIGluaXRpYWwgY2FsaWJyYXRpb24gdGhhdCBpcyBPSywgYW5kIHRoZXJlIGlzIGEgY29udGludW91cyAgICAgICAgICAgICAqLworICAgICAgIC8qIGNhbGlicmF0aW9uIHRoYXQgdXBkYXRlcyB0aGUgcGRkYWMgd2l0aCB0aGUgd3JvbmcgcG9sYXJpdHkuICBGb3J0dW5hdGVseSAgICAqLworICAgICAgIC8qIHRoZSBzZWNvbmQgbG9vcCBjYW4gYmUgZGlzYWJsZWQgd2l0aCBhIGJpdCBjYWxsZWQgZW5fcGRfZGNfb2Zmc2V0X3Roci4gICAgICAqLworI2lmIDAKKyAgICAgICAgY21kQlswXSA9IDggfCAoWk1fQ01EX0JJVEFORCA8PCA4KTs7CisgICAgICAgIGNtZEJbMV0gPSAoMHhhMjdjICsgMHgxYmMwMDApOworICAgICAgICBjbWRCWzJdID0gMHhmZmVmZmZmZjsKKyAgICAgICAgcmV0ID0gemZJc3N1ZUNtZChkZXYsIGNtZEIsIDEyLCBaTV9PSURfSU5URVJOQUxfV1JJVEUsIDApOworI2VuZGlmCisKKyAgICAgICAvKiBCYW5rIDQgKi8KKyAgICAgICB6ZlNldEJhbms0QW5kUG93ZXJUYWJsZShkZXYsIGZyZXF1ZW5jeSwgYnc0MCwgZXh0T2Zmc2V0KTsKKworCisgICAgICAgIGNtZFswXSA9IDMyIHwgKFpNX0NNRF9GUkVRVUVOQ1kgPDwgOCk7CisgICAgfQorCisgICAgLyogQ29tcGF0aWJpbGl0eSBmb3IgbmV3IGxheW91dCBVQjgzICovCisgICAgLyogU2V0dGluZyBjb2RlIGF0IENSMSBoZXJlIG1vdmUgZnJvbSB0aGUgZnVuYzp6Zkh3SFRFbmFibGUoKSBpbiBmaXJtd2FyZSAqLworICAgIGlmICgoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmhhbENhcGFiaWxpdHkgJiBaTV9IUF9DQVBfMTFOX09ORV9UWF9TVFJFQU0pCisgICAgeworICAgICAgICAvKiBVQjgzIDogb25lIHN0cmVhbSAqLworICAgICAgICB0bXBWYWx1ZSA9IDA7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qIFVCODEsIFVCODIgOiB0d28gc3RyZWFtICovCisgICAgICAgIHRtcFZhbHVlID0gMHgxMDA7CisgICAgfQorCisgICAgaWYgKDEpIC8vaWYgKCgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+aHdfSFRfRU5BQkxFID09IDEpCisJeworICAgICAgICBpZiAoYnc0MCA9PSAxKQorCQl7CisJCQlpZiAoZXh0T2Zmc2V0ID09IDEpIHsKKyAgICAgICAgICAgIAlyZWdfd3JpdGUoMHg5ODA0LCB0bXBWYWx1ZSB8IDB4MmQ0KTsgLy8zZDQgZm9yIHJlYWwKKwkJCX0KKwkJCWVsc2UgeworCQkJCXJlZ193cml0ZSgweDk4MDQsIHRtcFZhbHVlIHwgMHgyYzQpOyAgIC8vM2M0IGZvciByZWFsCisJCQl9CisJCQkvLyMgRHluIEhUMjA0MC5SZWZlciB0byBSZWcgMS4KKyAgICAgICAgICAgIC8vI1szXTpzaW5nbGUgbGVuZ3RoICg0dXMpIDFzdCBIVCBsb25nIHRyYWluaW5nIHN5bWJvbDsgdXNlIFdhbHNoIHNwYXRpYWwgc3ByZWFkaW5nIGZvciAyIGNoYWlucyAyIHN0cmVhbXMgVFgKKyAgICAgICAgICAgIC8vI1tjXTphbGxvdyBzaG9ydCBHSSBmb3IgSFQ0MCBwYWNrZXRzOyBlbmFibGUgSFQgZGV0ZWN0aW9uLgorICAgICAgICAgICAgLy8jWzRdOmVuYWJsZSAyMC80MCBNSHogY2hhbm5lbCBkZXRlY3Rpb24uCisgICAgICAgIH0KKyAgICAgICAgZWxzZQorCSAgICB7CisgICAgICAgICAgICByZWdfd3JpdGUoMHg5ODA0LCB0bXBWYWx1ZSB8IDB4MjQwKTsKKwkJICAgIC8vIyBTdGF0aWMgSFQyMAorICAgICAgICAgICAgLy8jWzNdOnNpbmdsZSBsZW5ndGggKDR1cykgMXN0IEhUIGxvbmcgdHJhaW5pbmcgc3ltYm9sOyB1c2UgV2Fsc2ggc3BhdGlhbCBzcHJlYWRpbmcgZm9yIDIgY2hhaW5zIDIgc3RyZWFtcyBUWAorICAgICAgICAgICAgLy8jWzRdOk90dXMgZG9uJ3QgYWxsb3cgc2hvcnQgR0kgZm9yIEhUMjAgcGFja2V0cyB5ZXQ7IGVuYWJsZSBIVCBkZXRlY3Rpb24uCisgICAgICAgICAgICAvLyNbMF06ZGlzYWJsZSAyMC80MCBNSHogY2hhbm5lbCBkZXRlY3Rpb24uCisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorCXsKKyAgICAgICAgcmVnX3dyaXRlKDB4OTgwNCwgMHgwKTsKKwkJLy8jIExlZ2FjeTsjIERpcmVjdCBNYXBwaW5nIGZvciBlYWNoIGNoYWluLgorICAgICAgICAvLyNCZSBtb2RpZmllZCBieSBPbGlnbyB0byBhZGQgZHluYW5pYyBmb3IgbGVnYWN5LgorICAgICAgICBpZiAoYnc0MCA9PSAxKQorCQl7CisgICAgICAgICAgICByZWdfd3JpdGUoMHg5ODA0LCAweDQpOyAgICAgLy8jIER5biBMZWdhY3kgLlJlZmVyIHRvIHJlZyAxLgorICAgICAgICB9CisgICAgICAgIGVsc2UKKwkJeworICAgICAgICAgICAgcmVnX3dyaXRlKDB4OTgwNCwgMHgwKTsgICAgLy8jIFN0YXRpYyBMZWdhY3kKKyAgICAgICAgfQorCX0KKwl6ZkZsdXNoRGVsYXlXcml0ZShkZXYpOworCS8qIGVuZCBvZiB1YjgzIGNvbXBhdGliaWxpdHkgKi8KKworICAgIC8qIFNldCBQb3dlciwgVFBDLCBHYWluIHRhYmxlLi4uICovCisJemZTZXRQb3dlckNhbFRhYmxlKGRldiwgZnJlcXVlbmN5LCBidzQwLCBleHRPZmZzZXQpOworCisKKyAgICAvKiBzdG9yZSBmcmVxdWVuY3kgKi8KKyAgICAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmh3RnJlcXVlbmN5ID0gKHUxNl90KWZyZXF1ZW5jeTsKKyAgICAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmh3Qnc0MCA9IGJ3NDA7CisgICAgKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5od0V4dE9mZnNldCA9IGV4dE9mZnNldDsKKworICAgIHpmR2V0SHdUdXJuT2ZmZHluUGFyYW0oZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlcXVlbmN5LCBidzQwLCBleHRPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVsdGFfc2xvcGVfY29lZmZfZXhwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlbHRhX3Nsb3BlX2NvZWZmX21hbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZWx0YV9zbG9wZV9jb2VmZl9leHBfc2hnaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZWx0YV9zbG9wZV9jb2VmZl9tYW5fc2hnaSk7CisKKyAgICAvKiByZWxhdGVkIGZ1bmN0aW9ucyAqLworICAgIGZyZXF1ZW5jeSA9IGZyZXF1ZW5jeSoxMDAwOworICAgIC8qIGxlblszNl0gOiB0eXBlWzB4MzBdIDogc2VxWz9dICovCisvLyAgICBjbWRbMF0gPSAyOCB8IChaTV9DTURfRlJFUVVFTkNZIDw8IDgpOworICAgIGNtZFsxXSA9IGZyZXF1ZW5jeTsKKyAgICBjbWRbMl0gPSBidzQwOy8vKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5od19EWU5BTUlDX0hUMjA0MF9FTjsKKyAgICBjbWRbM10gPSAoZXh0T2Zmc2V0PDwyKXwweDE7Ly8oKHdkLT5FeHRPZmZzZXQgPDwgMikgfCAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmh3X0hUX0VOQUJMRSk7CisgICAgY21kWzRdID0gZGVsdGFfc2xvcGVfY29lZmZfZXhwOworICAgIGNtZFs1XSA9IGRlbHRhX3Nsb3BlX2NvZWZmX21hbjsKKyAgICBjbWRbNl0gPSBkZWx0YV9zbG9wZV9jb2VmZl9leHBfc2hnaTsKKyAgICBjbWRbN10gPSBkZWx0YV9zbG9wZV9jb2VmZl9tYW5fc2hnaTsKKyAgICBjbWRbOF0gPSBjaGVja0xvb3BDb3VudDsKKworICAgIHJldCA9IHpmSXNzdWVDbWQoZGV2LCBjbWQsIDM2LCBaTV9DTURfU0VUX0ZSRVFVRU5DWSwgMCk7CisKKyAgICAvLyBkZWxheSB0ZW1wb3JhcmlseSwgd2FpdCBmb3IgbmV3IFBIWSBhbmQgUkYKKyAgICAvL3pmd1NsZWVwKGRldiwgMTAwMCk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqIEtleSAqKioqKioqKioqKioqKioqKioqKi8KKwordTE2X3QgemZIcFJlc2V0S2V5Q2FjaGUoemRldl90KiBkZXYpCit7CisgICAgdThfdCBpOworICAgIHUzMl90IGtleVs0XSA9IHswLCAwLCAwLCAwfTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICBzdHJ1Y3QgenNIcFByaXYqIGhwUHJpdj13ZC0+aHBQcml2YXRlOworCisgICAgZm9yKGk9MDtpPDQ7aSsrKQorICAgIHsKKyAgICAgICAgemZIcFNldERlZmF1bHRLZXkoZGV2LCBpLCBaTV9XRVA2NCwga2V5LCBOVUxMKTsKKyAgICB9CisgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBaTV9NQUNfUkVHX1JPTExfQ0FMTF9UQkxfTCwgMHgwMCk7CisgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBaTV9NQUNfUkVHX1JPTExfQ0FMTF9UQkxfSCwgMHgwMCk7CisgICAgemZGbHVzaERlbGF5V3JpdGUoZGV2KTsKKworICAgIGhwUHJpdi0+Y2FtUm9sbENhbGxUYWJsZSA9ICh1NjRfdCkgMDsKKworICAgIHJldHVybiAwOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZlNldEtleSAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU2V0IGtleS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgMCA6IHN1Y2Nlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIG90aGVyIDogZmFpbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFN0ZXBoZW4gQ2hlbiAgICAgICAgWnlEQVMgVGVjaG5vbG9neSBDb3Jwb3JhdGlvbiAgICAyMDA2LjEgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAhIHBsZWFzZSB1c2UgemZDb3JlU2V0S2V5KCkgaW4gODAyMTFDb3JlIGZvciBTZXRLZXkgKi8KK3UzMl90IHpmSHBTZXRLZXkoemRldl90KiBkZXYsIHU4X3QgdXNlciwgdThfdCBrZXlJZCwgdThfdCB0eXBlLAorICAgICAgICB1MTZfdCogbWFjLCB1MzJfdCoga2V5KQoreworICAgIHUzMl90IGNtZFsoWk1fTUFYX0NNRF9TSVpFLzQpXTsKKyAgICB1MTZfdCByZXQ7CisgICAgdTE2X3QgaTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICBzdHJ1Y3QgenNIcFByaXYqIGhwUHJpdj13ZC0+aHBQcml2YXRlOworCisjaWYgMCAgIC8qIHJlbW92ZSB0byB6ZkNvcmVTZXRLZXkoKSAqLworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIHdkLT5zdGEuZmxhZ0tleUNoYW5naW5nKys7CisgICAgem1fZGVidWdfbXNnMSgiICAgemZIcFNldEtleSsrKysgIiwgd2QtPnN0YS5mbGFnS2V5Q2hhbmdpbmcpOworICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisjZW5kaWYKKworICAgIGNtZFswXSA9IDB4MDAwMDI4MUM7CisgICAgY21kWzFdID0gKCh1MzJfdClrZXlJZDw8MTYpICsgKHUzMl90KXVzZXI7CisgICAgY21kWzJdID0gKCh1MzJfdCltYWNbMF08PDE2KSArICh1MzJfdCl0eXBlOworICAgIGNtZFszXSA9ICgodTMyX3QpbWFjWzJdPDwxNikgKyAoKHUzMl90KW1hY1sxXSk7CisKKyAgICBmb3IgKGk9MDsgaTw0OyBpKyspCisgICAgeworICAgICAgICBjbWRbNCtpXSA9IGtleVtpXTsKKyAgICB9CisKKyAgICBpZiAodXNlciA8IDY0KQorICAgIHsKKyAgICAgICAgaHBQcml2LT5jYW1Sb2xsQ2FsbFRhYmxlIHw9ICgodTY0X3QpIDEpIDw8IHVzZXI7CisgICAgfQorCisgICAgLy9yZXQgPSB6Zklzc3VlQ21kKGRldiwgY21kLCAzMiwgWk1fT0lEX0lOVEVSTkFMX1dSSVRFLCBOVUxMKTsKKyAgICByZXQgPSB6Zklzc3VlQ21kKGRldiwgY21kLCAzMiwgWk1fQ01EX1NFVF9LRVksIE5VTEwpOworICAgIHJldHVybiByZXQ7Cit9CisKKwordTMyX3QgemZIcFNldEFwUGFpcndpc2VLZXkoemRldl90KiBkZXYsIHUxNl90KiBzdGFNYWNBZGRyLCB1OF90IHR5cGUsCisgICAgICAgIHUzMl90KiBrZXksIHUzMl90KiBtaWNLZXksIHUxNl90IHN0YUFpZCkKK3sKKyAgICBpZiAoKHN0YUFpZCE9MCkgJiYgKHN0YUFpZDw2NCkpCisgICAgeworICAgICAgICB6ZkhwU2V0S2V5KGRldiwgKHN0YUFpZC0xKSwgMCwgdHlwZSwgc3RhTWFjQWRkciwga2V5KTsKKyAgICAgICAgICAgICAgICBpZiAoKHR5cGUgPT0gWk1fVEtJUCkKKyNpZmRlZiBaTV9FTkFCTEVfQ0VOQworICAgICAgICAgfHwgKHR5cGUgPT0gWk1fQ0VOQykKKyNlbmRpZiAvL1pNX0VOQUJMRV9DRU5DCisgICAgICAgICAgICkKKyAgICAgICAgICAgIHpmSHBTZXRLZXkoZGV2LCAoc3RhQWlkLTEpLCAxLCB0eXBlLCBzdGFNYWNBZGRyLCBtaWNLZXkpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIDE7Cit9CisKK3UzMl90IHpmSHBTZXRBcEdyb3VwS2V5KHpkZXZfdCogZGV2LCB1MTZfdCogYXBNYWNBZGRyLCB1OF90IHR5cGUsCisgICAgICAgIHUzMl90KiBrZXksIHUzMl90KiBtaWNLZXksIHUxNl90IHZhcElkKQoreworICAgIHpmSHBTZXRLZXkoZGV2LCBaTV9VU0VSX0tFWV9ERUZBVUxUIC0gMSAtIHZhcElkLCAwLCB0eXBlLCBhcE1hY0FkZHIsIGtleSk7CS8vIDZEMTggbW9kaWZ5IGZyb20gMCB0byAxID8/CisgICAgICAgICAgICBpZiAoKHR5cGUgPT0gWk1fVEtJUCkKKyNpZmRlZiBaTV9FTkFCTEVfQ0VOQworICAgICAgICAgfHwgKHR5cGUgPT0gWk1fQ0VOQykKKyNlbmRpZiAvL1pNX0VOQUJMRV9DRU5DCisgICAgICAgICAgICkKKyAgICAgICAgemZIcFNldEtleShkZXYsIFpNX1VTRVJfS0VZX0RFRkFVTFQgLSAxIC0gdmFwSWQsIDEsIHR5cGUsIGFwTWFjQWRkciwgbWljS2V5KTsKKyAgICByZXR1cm4gMDsKK30KKwordTMyX3QgemZIcFNldERlZmF1bHRLZXkoemRldl90KiBkZXYsIHU4X3Qga2V5SWQsIHU4X3QgdHlwZSwgdTMyX3QqIGtleSwgdTMyX3QqIG1pY0tleSkKK3sKKyAgICB1MTZfdCBtYWNBZGRyWzNdID0gezAsIDAsIDB9OworCisgICAgI2lmZGVmIFpNX0VOQUJMRV9JQlNTX1dQQTJQU0sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisgICAgc3RydWN0IHpzSHBQcml2KiBocFByaXYgPSB3ZC0+aHBQcml2YXRlOworCisgICAgaWYgKCBocFByaXYtPmRvdDExTW9kZSA9PSBaTV9IQUxfODAyMTFfTU9ERV9JQlNTX1dQQTJQU0sgKQorICAgIHsgLyogSWYgbm90IHdwYTJwc2sgLCB1c2UgdHJhZGl0aW9uYWwgKi8KKyAgICAgIC8qIEJlY2F1c2UgdGhlIGJ1ZyBvZiBjaGlwICwgZGVmYXVsdGtleSBzaG91bGQgZm9sbG93IHRoZSBrZXkgbWFwIHJ1bGUgaW4gcmVnaXN0ZXIgNzAwICovCisgICAgICAgIGlmICgga2V5SWQgPT0gMCApCisgICAgICAgICAgICB6ZkhwU2V0S2V5KGRldiwgWk1fVVNFUl9LRVlfREVGQVVMVCtrZXlJZCwgMCwgdHlwZSwgbWFjQWRkciwga2V5KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgemZIcFNldEtleShkZXYsIFpNX1VTRVJfS0VZX0RFRkFVTFQra2V5SWQsIDEsIHR5cGUsIG1hY0FkZHIsIGtleSk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgemZIcFNldEtleShkZXYsIFpNX1VTRVJfS0VZX0RFRkFVTFQra2V5SWQsIDAsIHR5cGUsIG1hY0FkZHIsIGtleSk7CisgICAgI2Vsc2UKKyAgICAgICAgemZIcFNldEtleShkZXYsIFpNX1VTRVJfS0VZX0RFRkFVTFQra2V5SWQsIDAsIHR5cGUsIG1hY0FkZHIsIGtleSk7CisgICAgI2VuZGlmCisgICAgICAgICAgICBpZiAoKHR5cGUgPT0gWk1fVEtJUCkKKworI2lmZGVmIFpNX0VOQUJMRV9DRU5DCisgICAgICAgICB8fCAodHlwZSA9PSBaTV9DRU5DKQorI2VuZGlmIC8vWk1fRU5BQkxFX0NFTkMKKyAgICAgICAgICAgKQorICAgIHsKKyAgICAgICAgemZIcFNldEtleShkZXYsIFpNX1VTRVJfS0VZX0RFRkFVTFQra2V5SWQsIDEsIHR5cGUsIG1hY0FkZHIsIG1pY0tleSk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3UzMl90IHpmSHBTZXRQZXJVc2VyS2V5KHpkZXZfdCogZGV2LCB1OF90IHVzZXIsIHU4X3Qga2V5SWQsIHU4X3QqIG1hYywgdThfdCB0eXBlLCB1MzJfdCoga2V5LCB1MzJfdCogbWljS2V5KQoreworI2lmZGVmIFpNX0VOQUJMRV9JQlNTX1dQQTJQU0sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisgICAgc3RydWN0IHpzSHBQcml2KiBocFByaXYgPSB3ZC0+aHBQcml2YXRlOworCisgICAgaWYgKCBocFByaXYtPmRvdDExTW9kZSA9PSBaTV9IQUxfODAyMTFfTU9ERV9JQlNTX1dQQTJQU0sgKQorICAgIHsgLyogSWYgbm90IHdwYTJwc2sgLCB1c2UgdHJhZGl0aW9uYWwgKi8KKyAgICAgICAgaWYoa2V5SWQpCisgICAgICAgIHsgIC8qIFNldCBHcm91cCBLZXkgKi8KKyAgICAgICAgICAgIHpmSHBTZXRLZXkoZGV2LCB1c2VyLCAxLCB0eXBlLCAodTE2X3QgKiltYWMsIGtleSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZihrZXlJZCA9PSAwKQorICAgICAgICB7ICAvKiBTZXQgUGFpcndpc2UgS2V5ICovCisgICAgICAgICAgICB6ZkhwU2V0S2V5KGRldiwgdXNlciwgMCwgdHlwZSwgKHUxNl90ICopbWFjLCBrZXkpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHpmSHBTZXRLZXkoZGV2LCB1c2VyLCBrZXlJZCwgdHlwZSwgKHUxNl90ICopbWFjLCBrZXkpOworICAgIH0KKyNlbHNlCisgICAgemZIcFNldEtleShkZXYsIHVzZXIsIGtleUlkLCB0eXBlLCAodTE2X3QgKiltYWMsIGtleSk7CisjZW5kaWYKKworICAgICAgICAgICAgaWYgKCh0eXBlID09IFpNX1RLSVApCisjaWZkZWYgWk1fRU5BQkxFX0NFTkMKKyAgICAgICAgIHx8ICh0eXBlID09IFpNX0NFTkMpCisjZW5kaWYgLy9aTV9FTkFCTEVfQ0VOQworICAgICAgICAgICApCisgICAgeworICAgICAgICB6ZkhwU2V0S2V5KGRldiwgdXNlciwga2V5SWQgKyAxLCB0eXBlLCAodTE2X3QgKiltYWMsIG1pY0tleSk7CisgICAgfQorICAgIHJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZIcFJlbW92ZUtleSAgICAgICAgICAgICAgICovCisvKiAgICAgIFJlbW92ZSBrZXkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGRldiA6IGRldmljZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIDAgOiBzdWNjZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBvdGhlciA6IGZhaWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBZdWFuLUd1IFdlaSAgICAgICAgIFp5REFTIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24gICAgMjAwNi42ICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTE2X3QgemZIcFJlbW92ZUtleSh6ZGV2X3QqIGRldiwgdTE2X3QgdXNlcikKK3sKKyAgICB1MzJfdCBjbWRbKFpNX01BWF9DTURfU0laRS80KV07CisgICAgdTE2X3QgcmV0ID0gMDsKKworICAgIGNtZFswXSA9IDB4MDAwMDI5MDQ7CisgICAgY21kWzFdID0gKHUzMl90KXVzZXI7CisKKyAgICByZXQgPSB6Zklzc3VlQ21kKGRldiwgY21kLCA4LCBaTV9PSURfSU5URVJOQUxfV1JJVEUsIE5VTEwpOworICAgIHJldHVybiByZXQ7Cit9CisKKworCisvKioqKioqKioqKioqKioqKioqKiogRE1BICoqKioqKioqKioqKioqKioqKioqLwordTE2X3QgemZIcFN0YXJ0UmVjdih6ZGV2X3QqIGRldikKK3sKKyAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIDB4MWMzZDMwLCAweDEwMCk7CisgICAgemZGbHVzaERlbGF5V3JpdGUoZGV2KTsKKworICAgIHJldHVybiAwOworfQorCit1MTZfdCB6ZkhwU3RvcFJlY3YoemRldl90KiBkZXYpCit7CisgICAgcmV0dXJuIDA7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqIE1BQyAqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgemZJbml0TWFjKHpkZXZfdCogZGV2KQoreworICAgIC8qIEFDSyBleHRlbnNpb24gcmVnaXN0ZXIgKi8KKyAgICAvLyBqaGxlZSB0ZW1wIDogY2hhbmdlIHZhbHVlIDB4MmMgLT4gMHg0MAorICAgIC8vIGhvbmRhIHJlc29sdmUgc2hvcnQgcHJlYW1ibGUgcHJvYmxlbSA6IDB4NDAgLT4gMHg3NQorICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgWk1fTUFDX1JFR19BQ0tfRVhURU5TSU9OLCAweDQwKTsgLy8gMHgyOCAtPiAweDJjIDY1MjI6eWZsZWUKKworICAgIC8qIFR4UTAvMS8yLzMgUmV0cnkgTUFYPTIgPT4gdHJhbnNtaXQgMyB0aW1lcyBhbmQgZGVncmFkZSByYXRlIGZvciByZXRyeSAqLworICAgIC8qIFBCNDIgQVAgY3Jhc2ggaXNzdWU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qIFdvcmthcm91bmQgdGhlIGNyYXNoIGlzc3VlIGJ5IENUUy9SVFMsIHNldCByZXRyeSBtYXggdG8gemVybyBmb3IgICAgICAqLworICAgIC8qICAgd29ya2Fyb3VuZCB0eCB1bmRlcnJ1biB3aGljaCBlbmFibGUgQ1RTL1JUUyAqLworICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgWk1fTUFDX1JFR19SRVRSWV9NQVgsIDApOyAvLyAweDExMTExID0+IDAKKworICAgIC8qIHVzZSBoYXJkd2FyZSBNSUMgY2hlY2sgKi8KKyAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIFpNX01BQ19SRUdfU05JRkZFUiwgMHgyMDAwMDAwKTsKKworICAgIC8qIFNldCBSeCB0aHJlc2hvbGQgdG8gMTYwMCAqLworI2lmIFpNX0xBUkdFUEFZTE9BRF9URVNUID09IDEKKyAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIFpNX01BQ19SRUdfUlhfVEhSRVNIT0xELCAweGM0MDAwKTsKKyNlbHNlCisgICAgI2lmbmRlZiBaTV9ESVNBQkxFX0FNU0RVOEtfU1VQUE9SVAorICAgIC8qIFRoZSBtYXhpbXVtIEEtTVNEVSBsZW5ndGggaXMgMzgzOS83OTM1ICovCisgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBaTV9NQUNfUkVHX1JYX1RIUkVTSE9MRCwgMHhjMWY4MCk7CisgICAgI2Vsc2UKKyAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIFpNX01BQ19SRUdfUlhfVEhSRVNIT0xELCAweGMwZjgwKTsKKyAgICAjZW5kaWYKKyNlbmRpZgorCisgICAgLy96ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIFpNX01BQ19SRUdfRFlOQU1JQ19TSUZTX0FDSywgMHgxMEEpOworICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgWk1fTUFDX1JFR19SWF9QRV9ERUxBWSwgMHg3MCk7CisgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBaTV9NQUNfUkVHX0VJRlNfQU5EX1NJRlMsIDB4YTE0NDAwMCk7CisgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBaTV9NQUNfUkVHX1NMT1RfVElNRSwgOTw8MTApOworCisgICAgLyogQ0YtRU5EIG1vZGUgKi8KKyAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIDB4MWMzYjJjLCAweDE5MDAwMDAwKTsKKworICAgIC8vTkFWIHByb3RlY3RzIEFDSyBvbmx5IChpbiBUWE9QKQorICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxYzNiMzgsIDB4MjAxKTsKKworCisgICAgLyogU2V0IEJlYWNvbiBQSFkgQ1RSTCdzIFRQQyB0byAweDcsIFRBMT0xICovCisgICAgLyogT1RVUyBzZXQgQU0gdG8gMHgxICovCisgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBaTV9NQUNfUkVHX0JDTl9IVDEsIDB4ODAwMDE3MCk7CisKKyAgICAvKiBUT0RPIDogd2VwIGJhY2tvZmYgcHJvdGVjdGlvbiAweDYzYyAqLworICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgWk1fTUFDX1JFR19CQUNLT0ZGX1BST1RFQ1QsIDB4MTA1KTsKKworICAgIC8qIEFHRyB0ZXN0IGNvZGUqLworICAgIC8qIEFnZ3JlZ2F0aW9uIE1BWCBudW1iZXIgYW5kIHRpbWVvdXQgKi8KKyAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIDB4MWMzYjljLCAweDEwMDAwYSk7CisgICAgLyogRmlsdGVyIGFueSBjb250cm9sIGZyYW1lcywgQkFSIGlzIGJpdCAyNCAqLworICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxYzM2OGMsIDB4MDUwMGZmZmYpOworICAgIC8qIEVuYWJsZSBkZWFnZ3JlZ2F0b3IgKi8KKyAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIDB4MWMzYzQwLCAweDEpOworCisgICAgLyogQmFzaWMgcmF0ZSAqLworICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgWk1fTUFDX1JFR19CQVNJQ19SQVRFLCAweDE1MGYpOworICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgWk1fTUFDX1JFR19NQU5EQVRPUllfUkFURSwgMHgxNTBmKTsKKyAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIFpNX01BQ19SRUdfUlRTX0NUU19SQVRFLCAweDEwYjAxYmIpOworCisgICAgLyogTUlNTyByZXNwb3NuZSBjb250cm9sICovCisgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFjMzY5NCwgMHg0MDAzQzFFKTsvKiBiaXQgMjZ+MjggIG90dXMtQU0gKi8KKworICAgIC8qIEVuYWJsZSBMRUQwIGFuZCBMRUQxICovCisgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFkMDEwMCwgMHgzKTsKKyAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIDB4MWQwMTA0LCAweDMpOworCisgICAgLyogc3dpdGNoIE1BQyB0byBPVFVTIGludGVyZmFjZSAqLworICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxYzM2MDAsIDB4Myk7CisKKyAgICAvKiBSWE1BQyBBLU1QRFUgbGVuZ3RoIHRocmVzaG9sZCAqLworICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxYzNjNTAsIDB4ZmZmZik7CisKKwkvKiBQaHkgcmVnaXN0ZXIgcmVhZCB0aW1lb3V0ICovCisJemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFjMzY4MCwgMHhmMDAwMDgpOworCisJLyogRGlzYWJsZSBSeCBUaW1lT3V0IDogd29ya2Fyb3VuZCBmb3IgQkIuCisJICogIE9UVVMgd291bGQgaW50ZXJydXB0IHRoZSByeCBmcmFtZSB0aGF0IHNlbnQgYnkgT1dMIFR4VW5kZXJSdW4KKwkgKiAgYmVjYXVzZSBPVFVTIHJ4IHRpbWVvdXQgYmVoYXZpb3IsIHRoZW4gT1RVUyB3b3VsZCBub3QgYWNrIHRoZSBCQSBmb3IKKwkgKiAgdGhpcyBBTVBEVSBmcm9tIE9XTC4KKwkgKiAgRml4IGJ5IFBlcnJ5IEh3YW5nLiAgMjAwNy8wNS8xMC4KKwkgKiAgMHgxYzM2MmMgOiBSeCB0aW1lb3V0IHZhbHVlIDogYml0IDI3fjE2CisJICovCisJemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFjMzYyYywgMHgwKTsKKworICAgIC8vU2V0IFVTQiBSeCBzdHJlYW0gbW9kZSBNQVggcGFja2V0IG51bWJlciB0byAyCisgICAgLy8gICAgTWF4IHBhY2tldCBudW1iZXIgPSAqMHgxZTExMTAgKyAxCisgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFlMTExMCwgMHg0KTsKKyAgICAvL1NldCBVU0IgUnggc3RyZWFtIG1vZGUgdGltZW91dCB0byAxMHVzCisgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFlMTExNCwgMHg4MCk7CisKKyAgICAvL1NldCBDUFUgY2xvY2sgZnJlcXVlbmN5IHRvIDg4LzgwTUh6CisgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFENDAwOCwgMHg3Myk7CisKKyAgICAvL1NldCBXTEFOIERNQSBpbnRlcnJ1cHQgbW9kZSA6IGdlbmVyYXRlIGludCBwZXIgcGFja2V0CisgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFjM2Q3YywgMHgxMTAwMTEpOworCisgICAgLyogNzgwNyAqLworICAgIC8qIGVuYWJsZSBmdW5jIDogUmVzZXQgRklGTzEgYW5kIEZJRk8yIHdoZW4gcXVldWUtZ250IGlzIGxvdyAqLworICAgIC8qIDB4MWMzYmIwIEJpdDIgKi8KKyAgICAvKiBEaXNhYmxlIFN3UmVzZXQgaW4gZmlybXdhcmUgZm9yIFR4SGFuZywgZW5hYmxlIHJlc2V0IEZJRk8gZnVuYy4gKi8KKyAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIDB4MWMzYmIwLCAweDQpOworCisgICAgLyogRGlzYWJsZXMgdGhlIENGX0VORCBmcmFtZSAqLworICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgWk1fTUFDX1JFR19UWE9QX05PVF9FTk9VR0hfSU5ESUNBVElPTiwgMHgxNDFFMEY0OCk7CisKKwkvKiBEaXNhYmxlIHRoZSBTVyBEZWNyeXB0Ki8KKwl6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIDB4MWMzNjc4LCAweDcwKTsKKyAgICB6ZkZsdXNoRGVsYXlXcml0ZShkZXYpOworICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAvKiBTZXQgVHhRcyBDV01JTiwgQ1dNQVgsIEFJRlMgYW5kIFRYTyB0byBXTUUgU1RBIGRlZmF1bHQuICovCisgICAgemZVcGRhdGVEZWZhdWx0UW9zUGFyYW1ldGVyKGRldiwgMCk7CisKKyAgICAvL3pmU2VsQWRjQ2xrKGRldiwgMCk7CisKKyAgICByZXR1cm47Cit9CisKKwordTE2X3QgemZIcFNldFNuaWZmZXJNb2RlKHpkZXZfdCogZGV2LCB1MTZfdCBvbikKK3sKKyAgICBpZiAob24gIT0gMCkKKyAgICB7CisgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgWk1fTUFDX1JFR19TTklGRkVSLCAweDIwMDAwMDEpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIFpNX01BQ19SRUdfU05JRkZFUiwgMHgyMDAwMDAwKTsKKyAgICB9CisgICAgemZGbHVzaERlbGF5V3JpdGUoZGV2KTsKKyAgICByZXR1cm4gMDsKK30KKworCit1MTZfdCB6ZkhwU2V0QXBTdGFNb2RlKHpkZXZfdCogZGV2LCB1OF90IG1vZGUpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgc3RydWN0IHpzSHBQcml2KiBocFByaXYgPSB3ZC0+aHBQcml2YXRlOworICAgIGhwUHJpdi0+ZG90MTFNb2RlID0gbW9kZTsKKworICAgIHN3aXRjaChtb2RlKQorICAgIHsKKyAgICAgICAgY2FzZSBaTV9IQUxfODAyMTFfTU9ERV9BUDoKKyAgICAgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxYzM3MDAsIDB4MGYwMDAwYTEpOworICAgICAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFjM2M0MCwgMHgxKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgWk1fSEFMXzgwMjExX01PREVfU1RBOgorICAgICAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFjMzcwMCwgMHgwZjAwMDAwMik7CisgICAgICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIDB4MWMzYzQwLCAweDEpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBaTV9IQUxfODAyMTFfTU9ERV9JQlNTX0dFTkVSQUw6CisgICAgICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIDB4MWMzNzAwLCAweDBmMDAwMDAwKTsKKyAgICAgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxYzNjNDAsIDB4MSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFpNX0hBTF84MDIxMV9NT0RFX0lCU1NfV1BBMlBTSzoKKyAgICAgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxYzM3MDAsIDB4MGYwMDAwZTApOworICAgICAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFjM2M0MCwgMHg0MSk7ICAgICAgIC8vIGZvciBtdWx0aXBsZSAoID4gMiApIHN0YXRpb25zIElCU1MgbmV0d29yaworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGdvdG8gc2tpcDsKKyAgICB9CisKKyAgICB6ZkZsdXNoRGVsYXlXcml0ZShkZXYpOworCitza2lwOgorICAgIHJldHVybiAwOworfQorCisKK3UxNl90IHpmSHBTZXRCc3NpZCh6ZGV2X3QqIGRldiwgdThfdCogYnNzaWRTcmMpCit7CisgICAgdTMyX3QgIGFkZHJlc3M7CisgICAgdTE2X3QgKmJzc2lkID0gKHUxNl90ICopYnNzaWRTcmM7CisKKyAgICBhZGRyZXNzID0gYnNzaWRbMF0gKyAoKCh1MzJfdClic3NpZFsxXSkgPDwgMTYpOworICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxYzM2MTgsIGFkZHJlc3MpOworCisgICAgYWRkcmVzcyA9ICh1MzJfdClic3NpZFsyXTsKKyAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIDB4MWMzNjFDLCBhZGRyZXNzKTsKKyAgICB6ZkZsdXNoRGVsYXlXcml0ZShkZXYpOworICAgIHJldHVybiAwOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZkhwVXBkYXRlUW9zUGFyYW1ldGVyICAgICAgKi8KKy8qICAgICAgVXBkYXRlIFR4UXMgQ1dNSU4sIENXTUFYLCBBSUZTIGFuZCBUWE9QLiAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGN3bWluVGJsIDogQ1dNSU4gcGFyYW1ldGVyIGZvciBUeFFzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBjd21heFRibCA6IENXTUFYIHBhcmFtZXRlciBmb3IgVHhRcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYWlmc1RibDogQUlGUyBwYXJhbWV0ZXIgZm9yIFR4UXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIHR4b3BUYmwgOiBUWE9QIHBhcmFtZXRlciBmb3IgVHhRcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIG5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFN0ZXBoZW4gICAgICAgICAgICAgWnlEQVMgVGVjaG5vbG9neSBDb3Jwb3JhdGlvbiAgICAyMDA2LjYgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1OF90IHpmSHBVcGRhdGVRb3NQYXJhbWV0ZXIoemRldl90KiBkZXYsIHUxNl90KiBjd21pblRibCwgdTE2X3QqIGN3bWF4VGJsLAorICAgICAgICB1MTZfdCogYWlmc1RibCwgdTE2X3QqIHR4b3BUYmwpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworICAgIHN0cnVjdCB6c0hwUHJpdiogaHBQcml2ID0gd2QtPmhwUHJpdmF0ZTsKKworICAgIHptX21zZzBfbW0oWk1fTFZfMCwgInpmSGFsVXBkYXRlUW9zUGFyYW1ldGVyKCkiKTsKKworICAgIC8qIE5vdGUgOiBEbyBub3QgY2hhbmdlIGN3bWluIGZvciBRMCBpbiBBZCBIb2MgbW9kZSAgICAgICAgICAgICAgKi8KKyAgICAvKiAgICAgICAgb3RoZXJ3aXNlIGRyaXZlciB3aWxsIGZhaWwgaW4gV2lmaSBiZWFjb24gZGlzdHJpYnV0aW9uICovCisgICAgaWYgKGhwUHJpdi0+ZG90MTFNb2RlID09IFpNX0hBTF84MDIxMV9NT0RFX1NUQSkKKyAgICB7CisjaWYgMCAvL1Jlc3RvcmUgQ1dtaW4gdG8gaW1wcm92ZSBkb3duIGxpbmsgdGhyb3VnaHB1dAorICAgICAgICAvL2NoZWF0aW5nIGluIEJFIHRyYWZmaWMKKyAgICAgICAgaWYgKHdkLT5zdGEuRW5hYmxlSFQgPT0gMSkKKyAgICAgICAgeworICAgICAgICAgICAgLy9jaGVhdGluZyBpbiBCRSB0cmFmZmljCisgICAgICAgICAgICBjd21pblRibFswXSA9IDc7Ly8xNTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgICAgIGN3bWF4VGJsWzBdID0gMTI3Oy8vMTAyMzsKKyAgICAgICAgYWlmc1RibFswXSA9IDIqOSsxMDsvLzMgKiA5ICsgMTA7CisgICAgfQorCisgICAgLyogQ1dNSU4gYW5kIENXTUFYICovCisgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBaTV9NQUNfUkVHX0FDMF9DVywgY3dtaW5UYmxbMF0KKyAgICAgICAgICAgICsgKCh1MzJfdCljd21heFRibFswXTw8MTYpKTsKKyAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIFpNX01BQ19SRUdfQUMxX0NXLCBjd21pblRibFsxXQorICAgICAgICAgICAgKyAoKHUzMl90KWN3bWF4VGJsWzFdPDwxNikpOworICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgWk1fTUFDX1JFR19BQzJfQ1csIGN3bWluVGJsWzJdCisgICAgICAgICAgICArICgodTMyX3QpY3dtYXhUYmxbMl08PDE2KSk7CisgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBaTV9NQUNfUkVHX0FDM19DVywgY3dtaW5UYmxbM10KKyAgICAgICAgICAgICsgKCh1MzJfdCljd21heFRibFszXTw8MTYpKTsKKyAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIFpNX01BQ19SRUdfQUM0X0NXLCBjd21pblRibFs0XQorICAgICAgICAgICAgKyAoKHUzMl90KWN3bWF4VGJsWzRdPDwxNikpOworCisgICAgLyogQUlGUyAqLworICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgWk1fTUFDX1JFR19BQzFfQUMwX0FJRlMsIGFpZnNUYmxbMF0KKyAgICAgICAgICAgICsoKHUzMl90KWFpZnNUYmxbMF08PDEyKSsoKHUzMl90KWFpZnNUYmxbMF08PDI0KSk7CisgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBaTV9NQUNfUkVHX0FDM19BQzJfQUlGUywgKGFpZnNUYmxbMF0+PjgpCisgICAgICAgICAgICArKCh1MzJfdClhaWZzVGJsWzBdPDw0KSsoKHUzMl90KWFpZnNUYmxbMF08PDE2KSk7CisKKyAgICAvKiBUWE9QICovCisgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBaTV9NQUNfUkVHX0FDMV9BQzBfVFhPUCwgdHhvcFRibFswXQorICAgICAgICAgICAgKyAoKHUzMl90KXR4b3BUYmxbMV08PDE2KSk7CisgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBaTV9NQUNfUkVHX0FDM19BQzJfVFhPUCwgdHhvcFRibFsyXQorICAgICAgICAgICAgKyAoKHUzMl90KXR4b3BUYmxbM108PDE2KSk7CisKKyAgICB6ZkZsdXNoRGVsYXlXcml0ZShkZXYpOworCisgICAgaHBQcml2LT50eG9wWzBdID0gdHhvcFRibFswXTsKKyAgICBocFByaXYtPnR4b3BbMV0gPSB0eG9wVGJsWzFdOworICAgIGhwUHJpdi0+dHhvcFsyXSA9IHR4b3BUYmxbMl07CisgICAgaHBQcml2LT50eG9wWzNdID0gdHhvcFRibFszXTsKKyAgICBocFByaXYtPmN3bWluWzBdID0gY3dtaW5UYmxbMF07CisgICAgaHBQcml2LT5jd21heFswXSA9IGN3bWF4VGJsWzBdOworICAgIGhwUHJpdi0+Y3dtaW5bMV0gPSBjd21pblRibFsxXTsKKyAgICBocFByaXYtPmN3bWF4WzFdID0gY3dtYXhUYmxbMV07CisKKyAgICByZXR1cm4gMDsKK30KKworCit2b2lkIHpmSHBTZXRBdGltV2luZG93KHpkZXZfdCogZGV2LCB1MTZfdCBhdGltV2luKQoreworICAgIHptX21zZzFfbW0oWk1fTFZfMCwgIlNldCBBVElNIHdpbmRvdyB0byAiLCBhdGltV2luKTsKKyAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIFpNX01BQ19SRUdfQVRJTV9XSU5ET1csIGF0aW1XaW4pOworICAgIHpmRmx1c2hEZWxheVdyaXRlKGRldik7Cit9CisKKwordm9pZCB6ZkhwU2V0QmFzaWNSYXRlU2V0KHpkZXZfdCogZGV2LCB1MTZfdCBiUmF0ZUJhc2ljLCB1MTZfdCBnUmF0ZUJhc2ljKQoreworICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgWk1fTUFDX1JFR19CQVNJQ19SQVRFLCBiUmF0ZUJhc2ljCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoKHUxNl90KWdSYXRlQmFzaWM8PDgpKTsKKyAgICB6ZkZsdXNoRGVsYXlXcml0ZShkZXYpOworfQorCisKKy8qIEhUNDAgc2VuZCBieSBPRkRNIDZNICAgICovCisvKiBvdGhlcndpc2UgdXNlIHJlZyAweDYzOCAqLwordm9pZCB6ZkhwU2V0UlRTQ1RTUmF0ZSh6ZGV2X3QqIGRldiwgdTMyX3QgcmF0ZSkKK3sKKyAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIFpNX01BQ19SRUdfUlRTX0NUU19SQVRFLCByYXRlKTsKKyAgICB6ZkZsdXNoRGVsYXlXcml0ZShkZXYpOworfQorCit2b2lkIHpmSHBTZXRNYWNBZGRyZXNzKHpkZXZfdCogZGV2LCB1MTZfdCogbWFjQWRkciwgdTE2X3QgbWFjQWRkcklkKQoreworICAgIGlmIChtYWNBZGRySWQgPT0gMCkKKyAgICB7CisgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgWk1fTUFDX1JFR19NQUNfQUREUl9MLAorICAgICAgICAgICAgICAgICgoKHUzMl90KW1hY0FkZHJbMV0pPDwxNikgfCBtYWNBZGRyWzBdKTsKKyAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBaTV9NQUNfUkVHX01BQ19BRERSX0gsIG1hY0FkZHJbMl0pOworICAgIH0KKyAgICBlbHNlIGlmIChtYWNBZGRySWQgPD0gNykKKyAgICB7CisgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgWk1fTUFDX1JFR19BQ0tfVEFCTEUrKChtYWNBZGRySWQtMSkqOCksCisgICAgICAgICAgICAgICAgbWFjQWRkclswXSArICgodTMyX3QpbWFjQWRkclsxXTw8MTYpKTsKKyAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBaTV9NQUNfUkVHX0FDS19UQUJMRSsoKG1hY0FkZHJJZC0xKSo4KSs0LAorICAgICAgICAgICAgICAgIG1hY0FkZHJbMl0pOworICAgIH0KKyAgICB6ZkZsdXNoRGVsYXlXcml0ZShkZXYpOworfQorCit2b2lkIHpmSHBTZXRNdWx0aWNhc3RMaXN0KHpkZXZfdCogZGV2LCB1OF90IHNpemUsIHU4X3QqIHBMaXN0LCB1OF90IGJBbGxNdWx0aWNhc3QpCit7CisgICAgc3RydWN0IHpzTXVsdGljYXN0QWRkciogcE1hY0xpc3QgPSAoc3RydWN0IHpzTXVsdGljYXN0QWRkciopIHBMaXN0OworICAgIHU4X3QgICBpOworICAgIHUzMl90ICB2YWx1ZTsKKyAgICB1MzJfdCAgc3dSZWdNdWxIYXNoVmFsdWVILCBzd1JlZ011bEhhc2hWYWx1ZUw7CisKKyAgICBzd1JlZ011bEhhc2hWYWx1ZUggPSAweDgwMDAwMDAwOworICAgIHN3UmVnTXVsSGFzaFZhbHVlTCA9IDA7CisKKyAgICBpZiAoIGJBbGxNdWx0aWNhc3QgKQorICAgIHsKKyAgICAgICAgc3dSZWdNdWxIYXNoVmFsdWVIID0gc3dSZWdNdWxIYXNoVmFsdWVMID0gfjA7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGZvcihpPTA7IGk8c2l6ZTsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICB2YWx1ZSA9IHBNYWNMaXN0W2ldLmFkZHJbNV0gPj4gMjsKKworICAgICAgICAgICAgaWYgKCB2YWx1ZSA8IDMyICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzd1JlZ011bEhhc2hWYWx1ZUwgfD0gKDEgPDwgdmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN3UmVnTXVsSGFzaFZhbHVlSCB8PSAoMSA8PCAodmFsdWUtMzIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgWk1fTUFDX1JFR19HUk9VUF9IQVNIX1RCTF9MLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3UmVnTXVsSGFzaFZhbHVlTCk7CisgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBaTV9NQUNfUkVHX0dST1VQX0hBU0hfVEJMX0gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dSZWdNdWxIYXNoVmFsdWVIKTsKKyAgICB6ZkZsdXNoRGVsYXlXcml0ZShkZXYpOworICAgIHJldHVybjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqIEJlYWNvbiAqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgemZIcEVuYWJsZUJlYWNvbih6ZGV2X3QqIGRldiwgdTE2X3QgbW9kZSwgdTE2X3QgYmNuSW50ZXJ2YWwsIHUxNl90IGR0aW0sIHU4X3QgZW5hYmxlQXRpbSkKK3sKKyAgICB1MzJfdCAgdmFsdWU7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICAvKiBCZWFjb24gUmVhZHkgKi8KKyAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIFpNX01BQ19SRUdfQkNOX0NUUkwsIDApOworICAgIC8qIEJlYWNvbiBETUEgYnVmZmVyIGFkZHJlc3MgKi8KKyAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIFpNX01BQ19SRUdfQkNOX0FERFIsIFpNX0JFQUNPTl9CVUZGRVJfQUREUkVTUyk7CisKKyAgICB2YWx1ZSA9IGJjbkludGVydmFsOworCisgICAgdmFsdWUgfD0gKCgodTMyX3QpIGR0aW0pIDw8IDE2KTsKKworICAgIGlmIChtb2RlID09IFpNX01PREVfQVApCisgICAgeworCisgICAgICAgIHZhbHVlIHw9IDB4MTAwMDAwMDsKKyAgICB9CisgICAgZWxzZSBpZiAobW9kZSA9PSBaTV9NT0RFX0lCU1MpCisgICAgeworICAgICAgICB2YWx1ZSB8PSAweDIwMDAwMDA7CisKKwkJaWYgKCBlbmFibGVBdGltICkKKwkJeworCQkJdmFsdWUgfD0gMHg0MDAwMDAwOworCQl9CisJCSgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+aWJzc0JjbkVuYWJsZWQgPSAxOworICAgICAgICAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmlic3NCY25JbnRlcnZhbCA9IHZhbHVlOworICAgIH0KKyAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIFpNX01BQ19SRUdfUFJFVEJUVCwgKGJjbkludGVydmFsLTYpPDwxNik7CisKKyAgICAvKiBCZWFjb24gcGVyaW9kIGFuZCBiZWFjb24gZW5hYmxlICovCisgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBaTV9NQUNfUkVHX0JDTl9QRVJJT0QsIHZhbHVlKTsKKyAgICB6ZkZsdXNoRGVsYXlXcml0ZShkZXYpOworfQorCit2b2lkIHpmSHBEaXNhYmxlQmVhY29uKHpkZXZfdCogZGV2KQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+aWJzc0JjbkVuYWJsZWQgPSAwOworCisgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBaTV9NQUNfUkVHX0JDTl9QRVJJT0QsIDApOworICAgIHpmRmx1c2hEZWxheVdyaXRlKGRldik7Cit9CisKK3ZvaWQgemZIcExlZEN0cmwoemRldl90KiBkZXYsIHUxNl90IGxlZElkLCB1OF90IG1vZGUpCit7CisgICAgdTE2X3Qgc3RhdGU7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgLy96bV9kZWJ1Z19tc2cxKCJMRUQgSUQ9IiwgbGVkSWQpOworICAgIC8vem1fZGVidWdfbXNnMSgiTEVEIG1vZGU9IiwgbW9kZSk7CisgICAgaWYgKGxlZElkIDwgMikKKyAgICB7CisgICAgICAgIGlmICgoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmxlZE1vZGVbbGVkSWRdICE9IG1vZGUpCisgICAgICAgIHsKKyAgICAgICAgICAgICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+bGVkTW9kZVtsZWRJZF0gPSBtb2RlOworCisgICAgICAgICAgICBzdGF0ZSA9ICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+bGVkTW9kZVswXQorICAgICAgICAgICAgICAgICAgICB8ICgoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmxlZE1vZGVbMV08PDEpOworICAgICAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFkMDEwNCwgc3RhdGUpOworICAgICAgICAgICAgemZGbHVzaERlbGF5V3JpdGUoZGV2KTsKKyAgICAgICAgICAgIC8vem1fZGVidWdfbXNnMCgiVXBkYXRlIExFRCIpOworICAgICAgICB9CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZIcFJlc2V0VHhSeCAgICAgICAgICAgICAgICovCisvKiAgICAgIFJlc2V0IFR4IGFuZCBSeCBEZXNjLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGRldiA6IGRldmljZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIDAgOiBzdWNjZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBvdGhlciA6IGZhaWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBDaGFvLVdlbiBZYW5nICAgICAgICAgWnlEQVMgVGVjaG5vbG9neSBDb3Jwb3JhdGlvbiAgICAyMDA3LjMgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTE2X3QgemZIcFVzYlJlc2V0KHpkZXZfdCogZGV2KQoreworICAgIHUzMl90IGNtZFsoWk1fTUFYX0NNRF9TSVpFLzQpXTsKKyAgICB1MTZfdCByZXQgPSAwOworCisgICAgLy96bV9kZWJ1Z19tc2cwKCJDV1kgLSBSZXNldCBUeCBhbmQgUngiKTsKKworICAgIGNtZFswXSA9ICAwIHwgKFpNX0NNRF9SRVNFVCA8PCA4KTsKKworICAgIHJldCA9IHpmSXNzdWVDbWQoZGV2LCBjbWQsIDQsIFpNX09JRF9JTlRFUk5BTF9XUklURSwgTlVMTCk7CisgICAgcmV0dXJuIHJldDsKK30KKwordTE2X3QgemZIcERLUmVzZXQoemRldl90KiBkZXYsIHU4X3QgZmxhZykKK3sKKyAgICB1MzJfdCBjbWRbKFpNX01BWF9DTURfU0laRS80KV07CisgICAgdTE2X3QgcmV0ID0gMDsKKworICAgIC8vem1fZGVidWdfbXNnMCgiQ1dZIC0gUmVzZXQgVHggYW5kIFJ4Iik7CisKKyAgICBjbWRbMF0gPSAgNCB8IChaTV9DTURfREtSRVNFVCA8PCA4KTsKKyAgICBjbWRbMV0gPSBmbGFnOworCisgICAgcmV0ID0gemZJc3N1ZUNtZChkZXYsIGNtZCwgOCwgWk1fT0lEX0lOVEVSTkFMX1dSSVRFLCBOVUxMKTsKKyAgICByZXR1cm4gcmV0OworfQorCit1MzJfdCB6ZkhwQ3dtVXBkYXRlKHpkZXZfdCogZGV2KQoreworICAgIC8vdTMyX3QgY21kWzNdOworICAgIC8vdTE2X3QgcmV0OworICAgIC8vCisgICAgLy9jbWRbMF0gPSAweDAwMDAwMDA4OworICAgIC8vY21kWzFdID0gMHgxYzM2ZTg7CisgICAgLy9jbWRbMl0gPSAweDFjMzZlYzsKKyAgICAvLworICAgIC8vcmV0ID0gemZJc3N1ZUNtZChkZXYsIGNtZCwgMTIsIFpNX0NXTV9SRUFELCAwKTsKKyAgICAvL3JldHVybiByZXQ7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgc3RydWN0IHpzSHBQcml2KiBocFByaXY9d2QtPmhwUHJpdmF0ZTsKKworICAgIHpmQ29yZUN3bUJ1c3koZGV2LCB6ZkN3bUlzRXh0Q2hhbkJ1c3koaHBQcml2LT5jdGxCdXN5LCBocFByaXYtPmV4dEJ1c3kpKTsKKworICAgIGhwUHJpdi0+Y3RsQnVzeSA9IDA7CisgICAgaHBQcml2LT5leHRCdXN5ID0gMDsKKworICAgIHJldHVybiAwOworfQorCit1MzJfdCB6ZkhwQW5pVXBkYXRlKHpkZXZfdCogZGV2KQoreworICAgIHUzMl90IGNtZFs1XTsKKyAgICB1MTZfdCByZXQ7CisKKyAgICBjbWRbMF0gPSAweDAwMDAwMDEwOworICAgIGNtZFsxXSA9IDB4MWMzNmU4OworICAgIGNtZFsyXSA9IDB4MWMzNmVjOworICAgIGNtZFszXSA9IDB4MWMzY2I0OworICAgIGNtZFs0XSA9IDB4MWMzY2I4OworCisgICAgcmV0ID0gemZJc3N1ZUNtZChkZXYsIGNtZCwgMjAsIFpNX0FOSV9SRUFELCAwKTsKKyAgICByZXR1cm4gcmV0OworfQorCisvKgorICogVXBkYXRlIEJlYWNvbiBSU1NJIGluIEFOSQorICovCit1MzJfdCB6ZkhwQW5pVXBkYXRlUnNzaSh6ZGV2X3QqIGRldiwgdThfdCByc3NpKQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHN0cnVjdCB6c0hwUHJpdiogaHBQcml2PXdkLT5ocFByaXZhdGU7CisKKyAgICBocFByaXYtPnN0YXRzLmFzdF9ub2Rlc3RhdHMubnNfYXZnYnJzc2kgPSByc3NpOworCisgICAgcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgWk1fU0VFUFJPTV9NQUNfQUREUkVTU19PRkZTRVQgICAoMHgxNDAwICsgKDB4MTA2PDwxKSkKKyNkZWZpbmUgWk1fU0VFUFJPTV9SRUdET01BSU5fT0ZGU0VUICAgKDB4MTQwMCArICgweDEwNDw8MSkpCisjZGVmaW5lIFpNX1NFRVBST01fVkVSSVNPTl9PRkZTRVQgICAoMHgxNDAwICsgKDB4MTAyPDwxKSkKKyNkZWZpbmUgWk1fU0VFUFJPTV9IQVJEV0FSRV9UWVBFX09GRlNFVCAgICgweDEzNzQpCisjZGVmaW5lIFpNX1NFRVBST01fSFdfSEVBVllfQ0xJUCAgICAgICAgICAoMHgxNjFjKQorCit1MzJfdCB6ZkhwR2V0TWFjQWRkcmVzcyh6ZGV2X3QqIGRldikKK3sKKyAgICB1MzJfdCBjbWRbN107CisgICAgdTE2X3QgcmV0OworCisgICAgY21kWzBdID0gMHgwMDAwMDAwMCB8IDI0OworICAgIGNtZFsxXSA9IFpNX1NFRVBST01fTUFDX0FERFJFU1NfT0ZGU0VUOworICAgIGNtZFsyXSA9IFpNX1NFRVBST01fTUFDX0FERFJFU1NfT0ZGU0VUKzQ7CisgICAgY21kWzNdID0gWk1fU0VFUFJPTV9SRUdET01BSU5fT0ZGU0VUOworICAgIGNtZFs0XSA9IFpNX1NFRVBST01fVkVSSVNPTl9PRkZTRVQ7CisgICAgY21kWzVdID0gWk1fU0VFUFJPTV9IQVJEV0FSRV9UWVBFX09GRlNFVDsKKyAgICBjbWRbNl0gPSBaTV9TRUVQUk9NX0hXX0hFQVZZX0NMSVA7CisKKyAgICByZXQgPSB6Zklzc3VlQ21kKGRldiwgY21kLCAyOCwgWk1fTUFDX1JFQUQsIDApOworICAgIHJldHVybiByZXQ7Cit9CisKK3UzMl90IHpmSHBHZXRUcmFuc21pdFBvd2VyKHpkZXZfdCogZGV2KQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHN0cnVjdCB6c0hwUHJpdiogICAgaHBQcml2ICA9IHdkLT5ocFByaXZhdGU7CisgICAgdTE2X3QgICAgICAgICAgICAgICB0cGMgICAgID0gMDsKKworICAgIGlmIChocFByaXYtPmh3RnJlcXVlbmN5IDwgMzAwMCkgeworICAgICAgICB0cGMgPSBocFByaXYtPnRQb3cyeDJnWzBdICYgMHgzZjsKKyAgICAgICAgd2QtPm1heFR4UG93ZXIyICY9IDB4M2Y7CisgICAgICAgIHRwYyA9ICh0cGMgPiB3ZC0+bWF4VHhQb3dlcjIpPyB3ZC0+bWF4VHhQb3dlcjIgOiB0cGM7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdHBjID0gaHBQcml2LT50UG93Mng1Z1swXSAmIDB4M2Y7CisgICAgICAgIHdkLT5tYXhUeFBvd2VyNSAmPSAweDNmOworICAgICAgICB0cGMgPSAodHBjID4gd2QtPm1heFR4UG93ZXI1KT8gd2QtPm1heFR4UG93ZXI1IDogdHBjOworICAgIH0KKworICAgIHJldHVybiB0cGM7Cit9CisKK3U4X3QgemZIcEdldE1pblR4UG93ZXIoemRldl90KiBkZXYpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgc3RydWN0IHpzSHBQcml2KiAgICBocFByaXYgID0gd2QtPmhwUHJpdmF0ZTsKKyAgICB1OF90ICAgICAgICAgICAgICAgdHBjICAgICA9IDA7CisKKyAgICBpZiAoaHBQcml2LT5od0ZyZXF1ZW5jeSA8IDMwMDApCisgICAgeworICAgICAgICBpZih3ZC0+QmFuZFdpZHRoNDApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vNDBNCisgICAgICAgICAgICB0cGMgPSAoaHBQcml2LT50UG93MngyZ0h0NDBbN10mMHgzZik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvLzIwTQorICAgICAgICAgICAgdHBjID0gKGhwUHJpdi0+dFBvdzJ4MmdIdDIwWzddJjB4M2YpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmKHdkLT5CYW5kV2lkdGg0MCkKKyAgICAgICAgeworICAgICAgICAgICAgLy80ME0KKyAgICAgICAgICAgIHRwYyA9IChocFByaXYtPnRQb3cyeDVnSHQ0MFs3XSYweDNmKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vMjBNCisgICAgICAgICAgICB0cGMgPSAoaHBQcml2LT50UG93Mng1Z0h0MjBbN10mMHgzZik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gdHBjOworfQorCit1OF90IHpmSHBHZXRNYXhUeFBvd2VyKHpkZXZfdCogZGV2KQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHN0cnVjdCB6c0hwUHJpdiogICAgaHBQcml2ICA9IHdkLT5ocFByaXZhdGU7CisgICAgdThfdCAgICAgICAgICAgICAgIHRwYyAgICAgPSAwOworCisgICAgaWYgKGhwUHJpdi0+aHdGcmVxdWVuY3kgPCAzMDAwKQorICAgIHsKKyAgICAgICAgdHBjID0gKGhwUHJpdi0+dFBvdzJ4Q2NrWzBdJjB4M2YpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB0cGMgPShocFByaXYtPnRQb3cyeDVnWzBdJjB4M2YpOworICAgIH0KKworICAgIHJldHVybiB0cGM7Cit9CisKK3UzMl90IHpmSHBMb2FkRUVQUk9NRnJvbUZXKHpkZXZfdCogZGV2KQoreworICAgIHUzMl90IGNtZFsxNl07CisgICAgdTMyX3QgcmV0PTAsIGksIGo7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgaSA9ICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+ZWVwcm9tSW1hZ2VSZFJlcTsKKworICAgIGNtZFswXSA9IFpNX0hBTF9NQVhfRUVQUk9NX1BSUSo0OworCisgICAgZm9yIChqPTA7IGo8Wk1fSEFMX01BWF9FRVBST01fUFJROyBqKyspCisgICAgeworICAgICAgICBjbWRbaisxXSA9IDB4MTAwMCArICgoKGkqWk1fSEFMX01BWF9FRVBST01fUFJRKSArIGopKjQpOworICAgIH0KKworICAgIHJldCA9IHpmSXNzdWVDbWQoZGV2LCBjbWQsIChaTV9IQUxfTUFYX0VFUFJPTV9QUlErMSkqNCwgWk1fRUVQUk9NX1JFQUQsIDApOworCisgICAgcmV0dXJuIHJldDsKK30KKwordm9pZCB6ZkhwSGVhcnRCZWF0KHpkZXZfdCogZGV2KQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICBzdHJ1Y3QgenNIcFByaXYqIGhwUHJpdj13ZC0+aHBQcml2YXRlOworICAgIHU4X3QgcG9sbHV0ZWQgPSAwOworICAgIHU4X3QgYWNrVHBjOworCisgICAgLyogV29ya2Fyb3VuZCA6IE1ha2UgT1RVUyBmaXJlIG1vcmUgYmVhY29uIGluIGFkIGhvYyBtb2RlIGluIDIuNEdIeiAqLworICAgIGlmIChocFByaXYtPmlic3NCY25FbmFibGVkICE9IDApCisgICAgeworICAgICAgICBpZiAoaHBQcml2LT5od0ZyZXF1ZW5jeSA8PSBaTV9DSF9HXzE0KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoKHdkLT50aWNrICUgMTApID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCh3ZC0+dGljayAlIDQwKSA9PSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBaTV9NQUNfUkVHX0JDTl9QRVJJT0QsIGhwUHJpdi0+aWJzc0JjbkludGVydmFsLTEpOworICAgICAgICAgICAgICAgICAgICBwb2xsdXRlZCA9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgWk1fTUFDX1JFR19CQ05fUEVSSU9ELCBocFByaXYtPmlic3NCY25JbnRlcnZhbCk7CisgICAgICAgICAgICAgICAgICAgIHBvbGx1dGVkID0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKHdkLT50aWNrICYgMHgzZikgPT0gMHgyNSkKKyAgICB7CisgICAgICAgIC8qIFdvcmthcm91bmQgZm9yIGJlYWNvbiBzdHVjayBhZnRlciBTVyByZXNldCAqLworICAgICAgICBpZiAoaHBQcml2LT5pYnNzQmNuRW5hYmxlZCAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIFpNX01BQ19SRUdfQkNOX0FERFIsIFpNX0JFQUNPTl9CVUZGRVJfQUREUkVTUyk7CisgICAgICAgICAgICBwb2xsdXRlZCA9IDE7CisgICAgICAgIH0KKworICAgICAgICAvL0RiZ1ByaW50KCJocFByaXYtPmFnZ01heER1cmF0aW9uQkU9JWQiLCBocFByaXYtPmFnZ01heER1cmF0aW9uQkUpOworICAgICAgICAvL0RiZ1ByaW50KCJ3ZC0+c3RhLmF2Z1NpemVPZlJlY2VpdmVQYWNrZXRzPSVkIiwgd2QtPnN0YS5hdmdTaXplT2ZSZWNlaXZlUGFja2V0cyk7CisgICAgICAgIGlmICgoIHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0lORlJBU1RSVUNUVVJFICkKKyAgICAgICAgICAgICYmICh6ZlN0YUlzQ29ubmVjdGVkKGRldikpCisgICAgICAgICAgICAmJiAod2QtPnN0YS5FbmFibGVIVCA9PSAxKSAvLzExbiBtb2RlCisgICAgICAgICAgICAmJiAod2QtPkJhbmRXaWR0aDQwID09IDEpIC8vNDBNSHogbW9kZQorICAgICAgICAgICAgJiYgKHdkLT5zdGEuZW5hYmxlRHJ2QkEgPT0wKSAvL01hcnZlbCBBUAorICAgICAgICAgICAgJiYgKGhwUHJpdi0+YWdnTWF4RHVyYXRpb25CRSA+IDIwMDApIC8vQkUgVFhPUCA+IDJtcworICAgICAgICAgICAgJiYgKHdkLT5zdGEuYXZnU2l6ZU9mUmVjZWl2ZVBhY2tldHMgPiAxNDIwKSkKKyAgICAgICAgeworICAgICAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFjM2I5YywgMHg4MDAwYSk7CisgICAgICAgICAgICBwb2xsdXRlZCA9IDE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIDB4MWMzYjljLCBocFByaXYtPmFnZ1BrdE51bSk7CisgICAgICAgICAgICBwb2xsdXRlZCA9IDE7CisgICAgICAgIH0KKworICAgICAgICBpZiAod2QtPmR5bmFtaWNTSUZTRW5hYmxlID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgoIHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0lORlJBU1RSVUNUVVJFICkKKyAgICAgICAgICAgICAgICAmJiAoemZTdGFJc0Nvbm5lY3RlZChkZXYpKQorICAgICAgICAgICAgICAgICYmICh3ZC0+c3RhLkVuYWJsZUhUID09IDEpIC8vMTFuIG1vZGUKKyAgICAgICAgICAgICAgICAmJiAod2QtPkJhbmRXaWR0aDQwID09IDApIC8vMjBNSHogbW9kZQorICAgICAgICAgICAgICAgICYmICh3ZC0+c3RhLmVuYWJsZURydkJBID09MCkpIC8vTWFydmVsIEFQCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFjMzY5OCwgMHg1MTQ0MDAwKTsKKyAgICAgICAgICAgICAgICBwb2xsdXRlZCA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFjMzY5OCwgMHhBMTQ0MDAwKTsKKyAgICAgICAgICAgICAgICBwb2xsdXRlZCA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoKCB3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9JTkZSQVNUUlVDVFVSRSApCisgICAgICAgICAgICAgICAgJiYgKHpmU3RhSXNDb25uZWN0ZWQoZGV2KSkKKyAgICAgICAgICAgICAgICAmJiAod2QtPnN0YS5FbmFibGVIVCA9PSAxKSAvLzExbiBtb2RlCisgICAgICAgICAgICAgICAgJiYgKHdkLT5zdGEuYXRoT3dsQXAgPT0gMSkpIC8vQXRoZXJvcyBBUAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChocFByaXYtPnJldHJhbnNtaXNzaW9uRXZlbnQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzd2l0Y2goaHBQcml2LT5sYXRlc3RTSUZTKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGhwUHJpdi0+bGF0ZXN0U0lGUyA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIFpNX01BQ19SRUdfRUlGU19BTkRfU0lGUywgMHg4MTQ0MDAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgICAgICBocFByaXYtPmxhdGVzdFNJRlMgPSAyOworICAgICAgICAgICAgICAgICAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBaTV9NQUNfUkVHX0VJRlNfQU5EX1NJRlMsIDB4YTE0NDAwMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICAgICAgaHBQcml2LT5sYXRlc3RTSUZTID0gMzsKKyAgICAgICAgICAgICAgICAgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgWk1fTUFDX1JFR19FSUZTX0FORF9TSUZTLCAweGMxNDQwMDApOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGhwUHJpdi0+bGF0ZXN0U0lGUyA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIFpNX01BQ19SRUdfRUlGU19BTkRfU0lGUywgMHhhMTQ0MDAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgaHBQcml2LT5sYXRlc3RTSUZTID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgWk1fTUFDX1JFR19FSUZTX0FORF9TSUZTLCAweGExNDQwMDApOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcG9sbHV0ZWQgPSAxOworICAgICAgICAgICAgICAgICAgICB6bV9kZWJ1Z19tc2cxKCIjIyMjIyBDb3JyZWN0IFR4IHJldHJhbnNtaXNzaW9uIGlzc3VlICMjIyMjLCAiLCBocFByaXYtPmxhdGVzdFNJRlMpOworICAgICAgICAgICAgICAgICAgICBocFByaXYtPnJldHJhbnNtaXNzaW9uRXZlbnQgPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBocFByaXYtPmxhdGVzdFNJRlMgPSAwOworICAgICAgICAgICAgICAgIGhwUHJpdi0+cmV0cmFuc21pc3Npb25FdmVudCA9IDA7CisgICAgICAgICAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFjMzY5OCwgMHhBMTQ0MDAwKTsKKyAgICAgICAgICAgICAgICBwb2xsdXRlZCA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoKHdkLT5zdGEuYlNjaGVkdWxlU2NhbiA9PSBGQUxTRSkgJiYgKHdkLT5zdGEuYkNoYW5uZWxTY2FuID09IEZBTFNFKSkKKyAgICAgICAgeworI2RlZmluZSBaTV9TSUdOQUxfVEhSRVNIT0xEICA2NgorICAgICAgICBpZiAoKCB3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9JTkZSQVNUUlVDVFVSRSApCisgICAgICAgICAgICAmJiAoemZTdGFJc0Nvbm5lY3RlZChkZXYpKQorICAgICAgICAgICAgJiYgKHdkLT5TaWduYWxTdHJlbmd0aCA+IFpNX1NJR05BTF9USFJFU0hPTEQpKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogcmVtb3ZlIHN0YXRlIGhhbmRsZSwgYWx3YXlzIHJld3JpdGUgcmVnaXN0ZXIgc2V0dGluZyAqLworICAgICAgICAgICAgICAgIC8vaWYgKGhwUHJpdi0+c3Ryb25nUlNTSSA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGhwUHJpdi0+c3Ryb25nUlNTSSA9IDE7CisgICAgICAgICAgICAgICAgLyogU3Ryb25nIFJTU0ksIHNldCBBQ0sgdG8gb25lIFR4IHN0cmVhbSBhbmQgbG93ZXIgVHggcG93ZXIgN2RibSAqLworICAgICAgICAgICAgICAgIGlmIChocFByaXYtPmN1cnJlbnRBY2tSdHNUcGMgPiAoMTQrMTApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYWNrVHBjID0gaHBQcml2LT5jdXJyZW50QWNrUnRzVHBjIC0gMTQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFja1RwYyA9IDEwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIDB4MWMzNjk0LCAoKGFja1RwYykgPDwgMjApIHwgKDB4MTw8MjYpKTsKKyAgICAgICAgICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIDB4MWMzYmI0LCAoKGFja1RwYykgPDwgNSApIHwgKDB4MTw8MTEpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGFja1RwYykgPDwgMjEpIHwgKDB4MTw8MjcpICApOworICAgICAgICAgICAgICAgIHBvbGx1dGVkID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiByZW1vdmUgc3RhdGUgaGFuZGxlLCBhbHdheXMgcmV3cml0ZSByZWdpc3RlciBzZXR0aW5nICovCisgICAgICAgICAgICAgICAgLy9pZiAoaHBQcml2LT5zdHJvbmdSU1NJID09IDEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaHBQcml2LT5zdHJvbmdSU1NJID0gMDsKKyAgICAgICAgICAgICAgICBpZiAoaHBQcml2LT5oYWxDYXBhYmlsaXR5ICYgWk1fSFBfQ0FQXzExTl9PTkVfVFhfU1RSRUFNKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFjMzY5NCwgKChocFByaXYtPmN1cnJlbnRBY2tSdHNUcGMmMHgzZikgPDwgMjApIHwgKDB4MTw8MjYpKTsKKyAgICAgICAgICAgICAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFjM2JiNCwgKChocFByaXYtPmN1cnJlbnRBY2tSdHNUcGMmMHgzZikgPDwgNSApIHwgKDB4MTw8MTEpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGhwUHJpdi0+Y3VycmVudEFja1J0c1RwYyYweDNmKSA8PCAyMSkgfCAoMHgxPDwyNykgICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxYzM2OTQsICgoaHBQcml2LT5jdXJyZW50QWNrUnRzVHBjJjB4M2YpIDw8IDIwKSB8ICgweDU8PDI2KSk7CisgICAgICAgICAgICAgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxYzNiYjQsICgoaHBQcml2LT5jdXJyZW50QWNrUnRzVHBjJjB4M2YpIDw8IDUgKSB8ICgweDU8PDExKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChocFByaXYtPmN1cnJlbnRBY2tSdHNUcGMmMHgzZikgPDwgMjEpIHwgKDB4NTw8MjcpICApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwb2xsdXRlZCA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyN1bmRlZiBaTV9TSUdOQUxfVEhSRVNIT0xECisgICAgICAgIH0KKworICAgICAgICBpZiAoKGhwUHJpdi0+aGFsQ2FwYWJpbGl0eSAmIFpNX0hQX0NBUF8xMU5fT05FX1RYX1NUUkVBTSkgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCh3ZC0+c3RhLmJTY2hlZHVsZVNjYW4gPT0gRkFMU0UpICYmICh3ZC0+c3RhLmJDaGFubmVsU2NhbiA9PSBGQUxTRSkpCisgICAgICAgICAgICB7CisgICAgI2RlZmluZSBaTV9SWF9TSUdOQUxfVEhSRVNIT0xEX0ggIDcxCisgICAgI2RlZmluZSBaTV9SWF9TSUdOQUxfVEhSRVNIT0xEX0wgIDY2CisgICAgICAgICAgICAgICAgdThfdCByeFNpZ25hbFRocmVzaG9sZEggPSBaTV9SWF9TSUdOQUxfVEhSRVNIT0xEX0g7CisgICAgICAgICAgICAgICAgdThfdCByeFNpZ25hbFRocmVzaG9sZEwgPSBaTV9SWF9TSUdOQUxfVEhSRVNIT0xEX0w7CisgICAgI3VuZGVmIFpNX1JYX1NJR05BTF9USFJFU0hPTERfSAorICAgICN1bmRlZiBaTV9SWF9TSUdOQUxfVEhSRVNIT0xEX0wKKworICAgICAgICAgICAgICAgIGlmICgoIHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0lORlJBU1RSVUNUVVJFICkKKyAgICAgICAgICAgICAgICAgICAgJiYgKHpmU3RhSXNDb25uZWN0ZWQoZGV2KSkKKyAgICAgICAgICAgICAgICAgICAgJiYgKHdkLT5TaWduYWxTdHJlbmd0aCA+IHJ4U2lnbmFsVGhyZXNob2xkSCkKKyAgICAgICAgICAgICAgICAgICAgKS8vJiYgKGhwUHJpdi0+cnhTdHJvbmdSU1NJID09IDApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaHBQcml2LT5yeFN0cm9uZ1JTU0kgPSAxOworICAgICAgICAgICAgICAgICAgICAvL3pmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxYzU5NjQsIDB4MTIyMCk7CisgICAgICAgICAgICAgICAgICAgIC8vemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFjNTk2MCwgMHg5MDApOworICAgICAgICAgICAgICAgICAgICAvL3pmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxYzY5NjAsIDB4OTAwKTsKKyAgICAgICAgICAgICAgICAgICAgLy96ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIDB4MWM3OTYwLCAweDkwMCk7CisgICAgICAgICAgICAgICAgICAgIGlmICgoaHBQcml2LT5lZXByb21JbWFnZVsweDEwMCsweDExMCoyLzRdJjB4ZmYpID09IDB4ODApIC8vRkVNIFRZUEUKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhwUHJpdi0+aHdGcmVxdWVuY3kgPD0gWk1fQ0hfR18xNCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIDB4MWM4OTYwLCAweDkwMCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFjODk2MCwgMHg5YjQ5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxYzg5NjAsIDB4MDkwMCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcG9sbHV0ZWQgPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmICgoIHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0lORlJBU1RSVUNUVVJFICkKKyAgICAgICAgICAgICAgICAgICAgJiYgKHpmU3RhSXNDb25uZWN0ZWQoZGV2KSkKKyAgICAgICAgICAgICAgICAgICAgJiYgKHdkLT5TaWduYWxTdHJlbmd0aCA+IHJ4U2lnbmFsVGhyZXNob2xkTCkKKyAgICAgICAgICAgICAgICAgICAgKS8vJiYgKGhwUHJpdi0+cnhTdHJvbmdSU1NJID09IDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy9EbyBub3RoaW5nIHRvIHByZXZlbnQgZnJlcXVlbnRseSBSeCBzd2l0Y2hpbmcKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyogcmVtb3ZlIHN0YXRlIGhhbmRsZSwgYWx3YXlzIHJld3JpdGUgcmVnaXN0ZXIgc2V0dGluZyAqLworICAgICAgICAgICAgICAgICAgICAvL2lmIChocFByaXYtPnJ4U3Ryb25nUlNTSSA9PSAxKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBocFByaXYtPnJ4U3Ryb25nUlNTSSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAvL3pmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxYzU5NjQsIDB4MTEyMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAvL3pmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxYzU5NjAsIDB4OWI0MCk7CisgICAgICAgICAgICAgICAgICAgICAgICAvL3pmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxYzY5NjAsIDB4OWI0MCk7CisgICAgICAgICAgICAgICAgICAgICAgICAvL3pmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxYzc5NjAsIDB4OWI0MCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGhwUHJpdi0+ZWVwcm9tSW1hZ2VbMHgxMDArMHgxMTAqMi80XSYweGZmKSA9PSAweDgwKSAvL0ZFTSBUWVBFCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhwUHJpdi0+aHdGcmVxdWVuY3kgPD0gWk1fQ0hfR18xNCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxYzg5NjAsIDB4OWI0OSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxYzg5NjAsIDB4MDkwMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxYzg5NjAsIDB4OWI0MCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBwb2xsdXRlZCA9IDE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChocFByaXYtPnVzYkFjU2VuZEJ5dGVzWzNdID4gKGhwUHJpdi0+dXNiQWNTZW5kQnl0ZXNbMF0qMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgWk1fTUFDX1JFR19BQzFfQUMwX1RYT1AsIGhwUHJpdi0+dHhvcFszXSk7CisgICAgICAgICAgICBwb2xsdXRlZCA9IDE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoaHBQcml2LT51c2JBY1NlbmRCeXRlc1syXSA+IChocFByaXYtPnVzYkFjU2VuZEJ5dGVzWzBdKjIpKQorICAgICAgICB7CisgICAgICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIFpNX01BQ19SRUdfQUMxX0FDMF9UWE9QLCBocFByaXYtPnR4b3BbMl0pOworICAgICAgICAgICAgcG9sbHV0ZWQgPSAxOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGhwUHJpdi0+dXNiQWNTZW5kQnl0ZXNbMV0gPiAoaHBQcml2LT51c2JBY1NlbmRCeXRlc1swXSoyKSkKKyAgICAgICAgeworICAgICAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBaTV9NQUNfUkVHX0FDMF9DVywgaHBQcml2LT5jd21pblsxXSsoKHUzMl90KWhwUHJpdi0+Y3dtYXhbMV08PDE2KSk7CisgICAgICAgICAgICBwb2xsdXRlZCA9IDE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoaHBQcml2LT5zbG90VHlwZSA9PSAxKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgod2QtPnN0YS5lbmFibGVEcnZCQSA9PTApIC8vTWFydmVsIEFQCisgICAgICAgICAgICAgICAgICAgJiYgKGhwUHJpdi0+YWdnTWF4RHVyYXRpb25CRSA+IDIwMDApKSAvL0JFIFRYT1AgPiAybXMKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgWk1fTUFDX1JFR19BQzBfQ1csIChocFByaXYtPmN3bWluWzBdLzIpKygodTMyX3QpaHBQcml2LT5jd21heFswXTw8MTYpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBaTV9NQUNfUkVHX0FDMF9DVywgaHBQcml2LT5jd21pblswXSsoKHUzMl90KWhwUHJpdi0+Y3dtYXhbMF08PDE2KSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBvbGx1dGVkID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBDb21wZW5zYXRpb24gZm9yIDIwdXMgc2xvdCB0aW1lICovCisgICAgICAgICAgICAgICAgLy96ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIFpNX01BQ19SRUdfQUMwX0NXLCA1OCsoKHUzMl90KWhwUHJpdi0+Y3dtYXhbMF08PDE2KSk7CisgICAgICAgICAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBaTV9NQUNfUkVHX0FDMF9DVywgaHBQcml2LT5jd21pblswXSsoKHUzMl90KWhwUHJpdi0+Y3dtYXhbMF08PDE2KSk7CisgICAgICAgICAgICAgICAgcG9sbHV0ZWQgPSAxOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoKHdkLT5zdGEuU1dFbmNyeXB0RW5hYmxlICYgKFpNX1NXX1RLSVBfRU5DUllfRU58Wk1fU1dfV0VQX0VOQ1JZX0VOKSkgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIFpNX01BQ19SRUdfQUMxX0FDMF9UWE9QLCBocFByaXYtPnR4b3BbMF0pOworICAgICAgICAgICAgICAgIHBvbGx1dGVkID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIFpNX01BQ19SRUdfQUMxX0FDMF9UWE9QLCAweDMwKTsKKyAgICAgICAgICAgICAgICBwb2xsdXRlZCA9IDE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBocFByaXYtPnVzYkFjU2VuZEJ5dGVzWzNdID0gMDsKKyAgICAgICAgaHBQcml2LT51c2JBY1NlbmRCeXRlc1syXSA9IDA7CisgICAgICAgIGhwUHJpdi0+dXNiQWNTZW5kQnl0ZXNbMV0gPSAwOworICAgICAgICBocFByaXYtPnVzYkFjU2VuZEJ5dGVzWzBdID0gMDsKKyAgICB9CisKKyAgICBpZiAocG9sbHV0ZWQgPT0gMSkKKyAgICB7CisgICAgICAgIHpmRmx1c2hEZWxheVdyaXRlKGRldik7CisgICAgfQorCisgICAgcmV0dXJuOworfQorCisvKgorICogIDB4MWQ0MDA4IDogQUhCLCBEQUMsIEFEQyBjbG9jayBzZWxlY3Rpb24KKyAqICAgICAgICAgICAgIGJpdDF+MCAgQUhCX0NMSyA6IEFIQiBjbG9jayBzZWxlY3Rpb24sCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwMCA6IE9TQyA0ME1IejsKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAxIDogMjBNSHogaW4gQSBtb2RlLCAyMk1IeiBpbiBHIG1vZGU7CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMCA6IDQwTUh6IGluIEEgbW9kZSwgNDRNSHogaW4gRyBtb2RlOworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEgOiA4ME1IeiBpbiBBIG1vZGUsIDg4TUh6IGluIEcgbW9kZS4KKyAqICAgICAgICAgICAgIGJpdDN+MiAgQ0xLX1NFTCA6IFNlbGVjdCB0aGUgY2xvY2sgc291cmNlIG9mIGNsazE2MCBpbiBBRERBQy4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAwIDogUExMIGRpdmlkZXIncyBvdXRwdXQ7CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwMSA6IFBMTCBkaXZpZGVyJ3Mgb3V0cHV0IGRpdmlkZWQgYnkgMjsKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwIDogUExMIGRpdmlkZXIncyBvdXRwdXQgZGl2aWRlZCBieSA0OworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEgOiBSRUZDTEsgZnJvbSBYVEFMT1NDUEFELgorICovCit2b2lkIHpmU2VsQWRjQ2xrKHpkZXZfdCogZGV2LCB1OF90IGJ3NDAsIHUzMl90IGZyZXF1ZW5jeSkKK3sKKyAgICBpZihidzQwID09IDEpCisgICAgeworICAgICAgICAvL3pmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxRDQwMDgsIDB4NzMpOworICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIFpNX01BQ19SRUdfRFlOQU1JQ19TSUZTX0FDSywgMHgxMEEpOworICAgICAgICB6ZkZsdXNoRGVsYXlXcml0ZShkZXYpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvL3pmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxRDQwMDgsIDB4NzApOworICAgICAgICBpZiAoIGZyZXF1ZW5jeSA8PSBaTV9DSF9HXzE0ICkKKyAgICAgICAgeworICAgICAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBaTV9NQUNfUkVHX0RZTkFNSUNfU0lGU19BQ0ssIDB4MTA1KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgWk1fTUFDX1JFR19EWU5BTUlDX1NJRlNfQUNLLCAweDEwNCk7CisgICAgICAgIH0KKyAgICAgICAgemZGbHVzaERlbGF5V3JpdGUoZGV2KTsKKyAgICB9Cit9CisKK3UzMl90IHpmSHBFY2hvQ29tbWFuZCh6ZGV2X3QqIGRldiwgdTMyX3QgdmFsdWUpCit7CisgICAgdTMyX3QgY21kWzJdOworICAgIHUxNl90IHJldDsKKworICAgIGNtZFswXSA9IDB4MDAwMDgwMDQ7CisgICAgY21kWzFdID0gdmFsdWU7CisKKyAgICByZXQgPSB6Zklzc3VlQ21kKGRldiwgY21kLCA4LCBaTV9DTURfRUNITywgTlVMTCk7CisgICAgcmV0dXJuIHJldDsKK30KKworI2lmZGVmIFpNX0RSVl9JTklUX1VTQl9NT0RFCisKKyNkZWZpbmUgWk1fVVNCX1VTX1NUUkVBTV9NT0RFICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBaTV9VU0JfVVNfUEFDS0VUX01PREUgICAgICAgICAgICAgICAweDAwMDAwMDA4CisjZGVmaW5lIFpNX1VTQl9EU19FTkFCTEUgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgWk1fVVNCX1VTX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgorCisjZGVmaW5lIFpNX1VTQl9SWF9TVFJFQU1fNEsgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgWk1fVVNCX1JYX1NUUkVBTV84SyAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMAorI2RlZmluZSBaTV9VU0JfUlhfU1RSRUFNXzE2SyAgICAgICAgICAgICAgICAweDAwMDAwMDIwCisjZGVmaW5lIFpNX1VTQl9SWF9TVFJFQU1fMzJLICAgICAgICAgICAgICAgIDB4MDAwMDAwMzAKKworI2RlZmluZSBaTV9VU0JfVFhfU1RSRUFNX01PREUgICAgICAgICAgICAgICAweDAwMDAwMDQwCisKKyNkZWZpbmUgWk1fVVNCX01PREVfQ1RSTF9SRUcgICAgICAgICAgICAgICAgMHgwMDFFMTEwOAorCit2b2lkIHpmSW5pdFVzYk1vZGUoemRldl90KiBkZXYpCit7CisgICAgdTMyX3QgbW9kZTsKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICAvKiBUT0RPOiBTZXQgVVNCIG1vZGUgYnkgcmVhZGluZyByZWdpc3RlcnkgKi8KKyAgICBtb2RlID0gWk1fVVNCX0RTX0VOQUJMRSB8IFpNX1VTQl9VU19FTkFCTEUgfCBaTV9VU0JfVVNfUEFDS0VUX01PREU7CisKKyAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIFpNX1VTQl9NT0RFX0NUUkxfUkVHLCBtb2RlKTsKKyAgICB6ZkZsdXNoRGVsYXlXcml0ZShkZXYpOworfQorI2VuZGlmCisKK3ZvaWQgemZEdW1wRWVwQmFuZEVkZ2VzKHN0cnVjdCBhcjU0MTZFZXByb20qIGVlcHJvbUltYWdlKTsKK3ZvaWQgemZQcmludFRhcmdldFBvd2VyMkcodThfdCogdFBvdzJ4Q2NrLCB1OF90KiB0UG93MngyZywgdThfdCogdFBvdzJ4MmdIdDIwLCB1OF90KiB0UG93MngyZ0h0NDApOwordm9pZCB6ZlByaW50VGFyZ2V0UG93ZXI1Ryh1OF90KiB0UG93Mng1ZywgdThfdCogdFBvdzJ4NWdIdDIwLCB1OF90KiB0UG93Mng1Z0h0NDApOworCisKK3MzMl90IHpmSW50ZXJwb2xhdGVGdW5jKHMzMl90IHgsIHMzMl90IHgxLCBzMzJfdCB5MSwgczMyX3QgeDIsIHMzMl90IHkyKQoreworICAgIHMzMl90IHk7CisKKyAgICBpZiAoeTIgPT0geTEpCisgICAgeworICAgICAgICB5ID0geTE7CisgICAgfQorICAgIGVsc2UgaWYgKHggPT0geDEpCisgICAgeworICAgICAgICB5ID0geTE7CisgICAgfQorICAgIGVsc2UgaWYgKHggPT0geDIpCisgICAgeworICAgICAgICB5ID0geTI7CisgICAgfQorICAgIGVsc2UgaWYgKHgyICE9IHgxKQorICAgIHsKKyAgICAgICAgeSA9IHkxICsgKCgoeTIteTEpICogKHgteDEpKS8oeDIteDEpKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgeSA9IHkxOworICAgIH0KKworICAgIHJldHVybiB5OworfQorCisvLyNkZWZpbmUgWk1fRU5BQkxFX1RQQ19XSU5ET1dTX0RFQlVHCisvLyNkZWZpbmUgWk1fRU5BQkxFX0JBTkRFREdFU19XSU5ET1dTX0RFQlVHCisKKy8qIHRoZSB0eCBwb3dlciBvZmZzZXQgd29ya2Fyb3VuZCBmb3IgQVJUIHZzIE5ESVMvTURLICovCisjZGVmaW5lIEhBTFRYX1BPV0VSX09GRlNFVCAgICAgIDAKKwordThfdCB6ZkludGVycG9sYXRlRnVuY1godThfdCB4LCB1OF90IHgxLCB1OF90IHkxLCB1OF90IHgyLCB1OF90IHkyKQoreworICAgIHMzMl90IHk7CisgICAgczMyX3QgaW5jOworCisgICAgI2RlZmluZSBaTV9NVUxUSVBMSUVSICAgOAorICAgIHkgPSB6ZkludGVycG9sYXRlRnVuYygoczMyX3QpeDw8Wk1fTVVMVElQTElFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKHMzMl90KXgxPDxaTV9NVUxUSVBMSUVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoczMyX3QpeTE8PFpNX01VTFRJUExJRVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIChzMzJfdCl4Mjw8Wk1fTVVMVElQTElFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKHMzMl90KXkyPDxaTV9NVUxUSVBMSUVSKTsKKworICAgIGluYyA9ICh5ICYgKDE8PChaTV9NVUxUSVBMSUVSLTEpKSkgPj4gKFpNX01VTFRJUExJRVItMSk7CisgICAgeSA9ICh5ID4+IFpNX01VTFRJUExJRVIpICsgaW5jOworICAgICN1bmRlZiBaTV9NVUxUSVBMSUVSCisKKyAgICByZXR1cm4gKHU4X3QpeTsKK30KKwordThfdCB6ZkdldEludGVycG9sYXRlZFZhbHVlKHU4X3QgeCwgdThfdCogeF9hcnJheSwgdThfdCogeV9hcnJheSkKK3sKKyAgICBzMzJfdCB5OworICAgIHUxNl90IHhJbmRleDsKKworICAgIGlmICh4IDw9IHhfYXJyYXlbMV0pCisgICAgeworICAgICAgICB4SW5kZXggPSAwOworICAgIH0KKyAgICBlbHNlIGlmICh4IDw9IHhfYXJyYXlbMl0pCisgICAgeworICAgICAgICB4SW5kZXggPSAxOworICAgIH0KKyAgICBlbHNlIGlmICh4IDw9IHhfYXJyYXlbM10pCisgICAgeworICAgICAgICB4SW5kZXggPSAyOworICAgIH0KKyAgICBlbHNlIC8vKHggPiB4X2FycmF5WzNdKQorICAgIHsKKyAgICAgICAgeEluZGV4ID0gMzsKKyAgICB9CisKKyAgICB5ID0gemZJbnRlcnBvbGF0ZUZ1bmNYKHgsCisgICAgICAgICAgICB4X2FycmF5W3hJbmRleF0sCisgICAgICAgICAgICB5X2FycmF5W3hJbmRleF0sCisgICAgICAgICAgICB4X2FycmF5W3hJbmRleCsxXSwKKyAgICAgICAgICAgIHlfYXJyYXlbeEluZGV4KzFdKTsKKworICAgIHJldHVybiAodThfdCl5OworfQorCit1OF90IHpmRmluZEZyZXFJbmRleCh1OF90IGYsIHU4X3QqIGZBcnJheSwgdThfdCBmQXJyYXlTaXplKQoreworICAgIHU4X3QgaTsKKyNpZmRlZiBaTV9FTkFCTEVfVFBDX1dJTkRPV1NfREVCVUcKKyAgICBEYmdQcmludCgiZj0lZCAiLCBmKTsKKyAgICBmb3IgKGk9MDsgaTxmQXJyYXlTaXplOyBpKyspCisgICAgeworICAgICAgICBEYmdQcmludCgiJWQgIiwgZkFycmF5W2ldKTsKKyAgICB9CisgICAgRGJnUHJpbnQoIlxuIik7CisjZW5kaWYKKyAgICBpPWZBcnJheVNpemUtMjsKKyAgICB3aGlsZSgxKQorICAgIHsKKyAgICAgICAgaWYgKGYgPj0gZkFycmF5W2ldKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gaTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaSE9MCkKKyAgICAgICAgeworICAgICAgICAgICAgaS0tOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9Cit9CisKKworCisKK3ZvaWQgemZJbml0UG93ZXJDYWwoemRldl90KiBkZXYpCit7CisgICAgLy9Qcm9ncmFtIFBIWSBUeCBwb3dlciByZWxhdGl2ZXMgcmVnaXN0ZXJzCisjZGVmaW5lIHptX3dyaXRlX3BoeV9yZWcoY3IsIHZhbCkgcmVnX3dyaXRlKChjcio0KSsweDk4MDAsIHZhbCkKKworICAgIHptX3dyaXRlX3BoeV9yZWcoNzksIDB4N2YpOworICAgIHptX3dyaXRlX3BoeV9yZWcoNzcsIDB4M2YzZjNmM2YpOworICAgIHptX3dyaXRlX3BoeV9yZWcoNzgsIDB4M2YzZjNmM2YpOworICAgIHptX3dyaXRlX3BoeV9yZWcoNjUzLCAweDNmM2YzZjNmKTsKKyAgICB6bV93cml0ZV9waHlfcmVnKDY1NCwgMHgzZjNmM2YzZik7CisgICAgem1fd3JpdGVfcGh5X3JlZyg3MzksIDB4M2YzZjNmM2YpOworICAgIHptX3dyaXRlX3BoeV9yZWcoNzQwLCAweDNmM2YzZjNmKTsKKyAgICB6bV93cml0ZV9waHlfcmVnKDc1NSwgMHgzZjNmM2YzZik7CisgICAgem1fd3JpdGVfcGh5X3JlZyg3NTYsIDB4M2YzZjNmM2YpOworICAgIHptX3dyaXRlX3BoeV9yZWcoNzU3LCAweDNmM2YzZjNmKTsKKworI3VuZGVmIHptX3dyaXRlX3BoeV9yZWcKK30KKworCisKK3ZvaWQgemZQcmludFRwKHU4X3QqIHB3cjAsIHU4X3QqIHZwZDAsIHU4X3QqIHB3cjEsIHU4X3QqIHZwZDEpCit7CisgICAgI2lmZGVmIFpNX0VOQUJMRV9UUENfV0lORE9XU19ERUJVRworICAgIERiZ1ByaW50KCJwd3IwIDogJWQsICVkLCAlZCwgJWQgLCVkXG4iLCBwd3IwWzBdLCBwd3IwWzFdLCBwd3IwWzJdLCBwd3IwWzNdLCBwd3IwWzRdKTsKKyAgICBEYmdQcmludCgidnBkMCA6ICVkLCAlZCwgJWQsICVkICwlZFxuIiwgdnBkMFswXSwgdnBkMFsxXSwgdnBkMFsyXSwgdnBkMFszXSwgdnBkMFs0XSk7CisgICAgRGJnUHJpbnQoInB3cjEgOiAlZCwgJWQsICVkLCAlZCAsJWRcbiIsIHB3cjFbMF0sIHB3cjFbMV0sIHB3cjFbMl0sIHB3cjFbM10sIHB3cjFbNF0pOworICAgIERiZ1ByaW50KCJ2cGQxIDogJWQsICVkLCAlZCwgJWQgLCVkXG4iLCB2cGQxWzBdLCB2cGQxWzFdLCB2cGQxWzJdLCB2cGQxWzNdLCB2cGQxWzRdKTsKKyAgICAjZW5kaWYKK30KKworCisvKgorICogVG8gZmluZCBDVEwgaW5kZXgoMH4yMykKKyAqIHJldHVybiAyNChBUjU0MTZfTlVNX0NUTFMpPT5ubyBkZXNpcmVkIGluZGV4IGZvdW5kCisgKi8KK3U4X3QgemZGaW5kQ3RsRWRnZXNJbmRleCh6ZGV2X3QqIGRldiwgdThfdCBkZXNpcmVkX0N0bEluZGV4KQoreworICAgIHU4X3QgaTsKKyAgICBzdHJ1Y3QgenNIcFByaXYqIGhwUHJpdjsKKyAgICBzdHJ1Y3QgYXI1NDE2RWVwcm9tKiBlZXByb21JbWFnZTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIGhwUHJpdiA9IHdkLT5ocFByaXZhdGU7CisKKyAgICBlZXByb21JbWFnZSA9IChzdHJ1Y3QgYXI1NDE2RWVwcm9tKikmKGhwUHJpdi0+ZWVwcm9tSW1hZ2VbKDEwMjQrNTEyKS80XSk7CisKKyAgICAvL2ZvciAoaSA9IDA7IChpIDwgQVI1NDE2X05VTV9DVExTKSAmJiBlZXByb21JbWFnZS0+Y3RsSW5kZXhbaV07IGkrKykKKyAgICBmb3IgKGkgPSAwOyBpIDwgQVI1NDE2X05VTV9DVExTOyBpKyspCisgICAgeworICAgICAgICBpZihkZXNpcmVkX0N0bEluZGV4ID09IGVlcHJvbUltYWdlLT5jdGxJbmRleFtpXSkKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gaTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBmYmluMmZyZXEKKyAqCisgKiBHZXQgY2hhbm5lbCB2YWx1ZSBmcm9tIGJpbmFyeSByZXByZXNlbnRhdGlvbiBoZWxkIGluIGVlcHJvbQorICogUkVUVVJOUzogdGhlIGZyZXF1ZW5jeSBpbiBNSHoKKyAqLwordTMyX3QKK2ZiaW4yZnJlcSh1OF90IGZiaW4sIHU4X3QgaXMyR0h6KQoreworICAgIC8qCisgICAgICogUmVzZXJ2ZWQgdmFsdWUgMHhGRiBwcm92aWRlcyBhbiBlbXB0eSBkZWZpbml0aW9uIGJvdGggYXMKKyAgICAgKiBhbiBmYmluIGFuZCBhcyBhIGZyZXF1ZW5jeSAtIGRvIG5vdCBjb252ZXJ0CisgICAgICovCisgICAgaWYgKGZiaW4gPT0gQVI1NDE2X0JDSEFOX1VOVVNFRCkgeworICAgICAgICByZXR1cm4gZmJpbjsKKyAgICB9CisKKyAgICByZXR1cm4gKHUzMl90KSgoaXMyR0h6PT0xKSA/ICgyMzAwICsgZmJpbikgOiAoNDgwMCArIDUgKiBmYmluKSk7Cit9CisKKwordThfdCB6ZkdldE1heEVkZ2VQb3dlcih6ZGV2X3QqIGRldiwgQ0FMX0NUTF9FREdFUyAqcEN0bEVkZ2VzLCB1MzJfdCBmcmVxKQoreworICAgIHU4X3QgaTsKKyAgICB1OF90IG1heEVkZ2VQb3dlcjsKKyAgICB1OF90IGlzMkdIejsKKyAgICBzdHJ1Y3QgenNIcFByaXYqIGhwUHJpdjsKKyAgICBzdHJ1Y3QgYXI1NDE2RWVwcm9tKiBlZXByb21JbWFnZTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIGhwUHJpdiA9IHdkLT5ocFByaXZhdGU7CisKKyAgICBlZXByb21JbWFnZSA9IChzdHJ1Y3QgYXI1NDE2RWVwcm9tKikmKGhwUHJpdi0+ZWVwcm9tSW1hZ2VbKDEwMjQrNTEyKS80XSk7CisKKyAgICBpZihmcmVxID4gWk1fQ0hfR18xNCkKKyAgICAgICAgaXMyR0h6ID0gMDsKKyAgICBlbHNlCisgICAgICAgIGlzMkdIeiA9IDE7CisKKyAgICBtYXhFZGdlUG93ZXIgPSBBUjU0MTZfTUFYX1JBVEVfUE9XRVI7CisKKyAgICAvKiBHZXQgdGhlIGVkZ2UgcG93ZXIgKi8KKyAgICBmb3IgKGkgPSAwOyAoaSA8IEFSNTQxNl9OVU1fQkFORF9FREdFUykgJiYgKHBDdGxFZGdlc1tpXS5iQ2hhbm5lbCAhPSBBUjU0MTZfQkNIQU5fVU5VU0VEKSA7IGkrKykKKyAgICB7CisgICAgICAgIC8qCisgICAgICAgICAqIElmIHRoZXJlJ3MgYW4gZXhhY3QgY2hhbm5lbCBtYXRjaCBvciBhbiBpbmJhbmQgZmxhZyBzZXQKKyAgICAgICAgICogb24gdGhlIGxvd2VyIGNoYW5uZWwgdXNlIHRoZSBnaXZlbiByZEVkZ2VQb3dlcgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKGZyZXEgPT0gZmJpbjJmcmVxKHBDdGxFZGdlc1tpXS5iQ2hhbm5lbCwgaXMyR0h6KSkKKyAgICAgICAgeworICAgICAgICAgICAgbWF4RWRnZVBvd2VyID0gcEN0bEVkZ2VzW2ldLnRQb3dlcjsKKyAgICAgICAgICAgICNpZmRlZiBaTV9FTkFCTEVfQkFOREVER0VTX1dJTkRPV1NfREVCVUcKKyAgICAgICAgICAgIHptX2RiZygoInpmR2V0TWF4RWRnZVBvd2VyIGluZGV4IGkgPSAlZCBcbiIsIGkpKTsKKyAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoKGkgPiAwKSAmJiAoZnJlcSA8IGZiaW4yZnJlcShwQ3RsRWRnZXNbaV0uYkNoYW5uZWwsIGlzMkdIeikpKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZmJpbjJmcmVxKHBDdGxFZGdlc1tpIC0gMV0uYkNoYW5uZWwsIGlzMkdIeikgPCBmcmVxICYmIHBDdGxFZGdlc1tpIC0gMV0uZmxhZykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtYXhFZGdlUG93ZXIgPSBwQ3RsRWRnZXNbaSAtIDFdLnRQb3dlcjsKKyAgICAgICAgICAgICAgICAjaWZkZWYgWk1fRU5BQkxFX0JBTkRFREdFU19XSU5ET1dTX0RFQlVHCisgICAgICAgICAgICAgICAgem1fZGJnKCgiemZHZXRNYXhFZGdlUG93ZXIgaW5kZXggaS0xID0gJWQgXG4iLCBpLTEpKTsKKyAgICAgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIExlYXZlIGxvb3AgLSBubyBtb3JlIGFmZmVjdGluZyBlZGdlcyBwb3NzaWJsZSBpbiB0aGlzIG1vbm90b25pYyBpbmNyZWFzaW5nIGxpc3QgKi8KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBpZiggaSA9PSBBUjU0MTZfTlVNX0JBTkRfRURHRVMgKQorICAgIHsKKyAgICAgICAgaWYgKGZyZXEgPiBmYmluMmZyZXEocEN0bEVkZ2VzW2kgLSAxXS5iQ2hhbm5lbCwgaXMyR0h6KSAmJiBwQ3RsRWRnZXNbaSAtIDFdLmZsYWcpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1heEVkZ2VQb3dlciA9IHBDdGxFZGdlc1tpIC0gMV0udFBvd2VyOworICAgICAgICAgICAgI2lmZGVmIFpNX0VOQUJMRV9CQU5ERURHRVNfV0lORE9XU19ERUJVRworICAgICAgICAgICAgem1fZGJnKCgiemZHZXRNYXhFZGdlUG93ZXIgaW5kZXg9PmktMSA9ICVkIFxuIiwgaS0xKSk7CisgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgfQorICAgIH0KKworICAgIHptX2Fzc2VydChtYXhFZGdlUG93ZXIgPiAwKTsKKworICAjaWZkZWYgWk1fRU5BQkxFX0JBTkRFREdFU19XSU5ET1dTX0RFQlVHCisgICAgaWYgKCBtYXhFZGdlUG93ZXIgPT0gQVI1NDE2X01BWF9SQVRFX1BPV0VSICkKKyAgICB7CisgICAgICAgIHptX2RiZygoInpmR2V0TWF4RWRnZVBvd2VyID0gJWQgISEhXG4iLCBBUjU0MTZfTUFYX1JBVEVfUE9XRVIpKTsKKyAgICB9CisgICNlbmRpZgorICAgIHJldHVybiBtYXhFZGdlUG93ZXI7Cit9CisKK3UzMl90IHpmQWRqdXN0SFQ0MEZyZXFPZmZzZXQoemRldl90KiBkZXYsIHUzMl90IGZyZXF1ZW5jeSwgdThfdCBidzQwLCB1OF90IGV4dE9mZnNldCkKK3sKKyAgICB1MzJfdCBuZXdGcmVxID0gZnJlcXVlbmN5OworCisJaWYgKGJ3NDAgPT0gMSkKKwl7CisgICAgICAgIGlmIChleHRPZmZzZXQgPT0gMSkKKyAgICAgICAgeworICAgICAgICAgICAgbmV3RnJlcSArPSAxMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIG5ld0ZyZXEgLT0gMTA7CisgICAgICAgIH0KKwl9CisJcmV0dXJuIG5ld0ZyZXE7Cit9CisKK3UzMl90IHpmSHBDaGVja0RvSGVhdnlDbGlwKHpkZXZfdCogZGV2LCB1MzJfdCBmcmVxLCBDQUxfQ1RMX0VER0VTICpwQ3RsRWRnZXMsIHU4X3QgYnc0MCkKK3sKKyAgICB1MzJfdCByZXQgPSAwOworICAgIHU4X3QgaTsKKyAgICB1OF90IGlzMkdIejsKKyAgICBzdHJ1Y3QgenNIcFByaXYqIGhwUHJpdjsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIGhwUHJpdiA9IHdkLT5ocFByaXZhdGU7CisKKyAgICBpZihmcmVxID4gWk1fQ0hfR18xNCkKKyAgICAgICAgaXMyR0h6ID0gMDsKKyAgICBlbHNlCisgICAgICAgIGlzMkdIeiA9IDE7CisKKyAgICAvKiBIVDQwIGZvcmNlIGVuYWJsZSBoZWF2eSBjbGlwICovCisgICAgaWYgKGJ3NDApCisgICAgeworICAgICAgICByZXQgfD0gMHhmMDsKKyAgICB9CisjaWYgMQorICAgIC8qIEhUMjAgOiBmcmVxdWVuY3kgYmFuZGVkZ2UgKi8KKyAgICBmb3IgKGkgPSAwOyAoaSA8IEFSNTQxNl9OVU1fQkFORF9FREdFUykgJiYgKHBDdGxFZGdlc1tpXS5iQ2hhbm5lbCAhPSBBUjU0MTZfQkNIQU5fVU5VU0VEKSA7IGkrKykKKyAgICB7CisgICAgICAgIGlmIChmcmVxID09IGZiaW4yZnJlcShwQ3RsRWRnZXNbaV0uYkNoYW5uZWwsIGlzMkdIeikpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChwQ3RsRWRnZXNbaV0uZmxhZyA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldCB8PSAweGY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgorCisgICAgcmV0dXJuIHJldDsKK30KKworCit2b2lkIHpmU2V0UG93ZXJDYWxUYWJsZSh6ZGV2X3QqIGRldiwgdTMyX3QgZnJlcXVlbmN5LCB1OF90IGJ3NDAsIHU4X3QgZXh0T2Zmc2V0KQoreworICAgIHN0cnVjdCBhcjU0MTZFZXByb20qIGVlcHJvbUltYWdlOworICAgIHU4X3QgcHdyMFs1XTsKKyAgICB1OF90IHB3cjFbNV07CisgICAgdThfdCB2cGQwWzVdOworICAgIHU4X3QgdnBkMVs1XTsKKyAgICB1OF90IHZwZF9jaGFpbjFbMTI4XTsKKyAgICB1OF90IHZwZF9jaGFpbjNbMTI4XTsKKyAgICB1MTZfdCBib3VuZGFyeTEgPSAxODsgLy9DUiA2NjcKKyAgICB1MTZfdCBwb3dlclR4TWF4ID0gNjM7IC8vQ1IgNzkKKyAgICB1OF90IGk7CisgICAgc3RydWN0IHpzSHBQcml2KiBocFByaXY7CisgICAgdThfdCBmYmluOworICAgIHU4X3QgaW5kZXgsIG1heDJnSW5kZXgsIG1heDVnSW5kZXg7CisgICAgdThfdCBjaGFpbjBwd3JQZGcwWzVdOworICAgIHU4X3QgY2hhaW4wdnBkUGRnMFs1XTsKKyAgICB1OF90IGNoYWluMHB3clBkZzFbNV07CisgICAgdThfdCBjaGFpbjB2cGRQZGcxWzVdOworICAgIHU4X3QgY2hhaW4ycHdyUGRnMFs1XTsKKyAgICB1OF90IGNoYWluMnZwZFBkZzBbNV07CisgICAgdThfdCBjaGFpbjJwd3JQZGcxWzVdOworICAgIHU4X3QgY2hhaW4ydnBkUGRnMVs1XTsKKyAgICB1OF90IGZiaW5BcnJheVs4XTsKKworICAgIC8qIDQgQ1RMICovCisgICAgdThfdCBjdGxfaTsKKyAgICB1OF90IGRlc2lyZWRfQ3RsSW5kZXg7CisKKyAgICB1OF90IGN0bEVkZ2VzTWF4UG93ZXJDQ0sgPSBBUjU0MTZfTUFYX1JBVEVfUE9XRVI7CisgICAgdThfdCBjdGxFZGdlc01heFBvd2VyMkcgPSBBUjU0MTZfTUFYX1JBVEVfUE9XRVI7CisgICAgdThfdCBjdGxFZGdlc01heFBvd2VyMkdIVDIwID0gQVI1NDE2X01BWF9SQVRFX1BPV0VSOworICAgIHU4X3QgY3RsRWRnZXNNYXhQb3dlcjJHSFQ0MCA9IEFSNTQxNl9NQVhfUkFURV9QT1dFUjsKKyAgICB1OF90IGN0bEVkZ2VzTWF4UG93ZXI1RyA9IEFSNTQxNl9NQVhfUkFURV9QT1dFUjsKKyAgICB1OF90IGN0bEVkZ2VzTWF4UG93ZXI1R0hUMjAgPSBBUjU0MTZfTUFYX1JBVEVfUE9XRVI7CisgICAgdThfdCBjdGxFZGdlc01heFBvd2VyNUdIVDQwID0gQVI1NDE2X01BWF9SQVRFX1BPV0VSOworCisgICAgdThfdCBjdGxPZmZzZXQ7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBocFByaXYgPSB3ZC0+aHBQcml2YXRlOworCisgICAgZWVwcm9tSW1hZ2UgPSAoc3RydWN0IGFyNTQxNkVlcHJvbSopJihocFByaXYtPmVlcHJvbUltYWdlWygxMDI0KzUxMikvNF0pOworCisgICAgLy8gQ2hlY2sgdGhlIHRvdGFsIGJ5dGVzIG9mIHRoZSBFRVBST00gc3RydWN0dXJlIHRvIHNlZSB0aGUgZG9uZ2xlIGhhdmUgYmVlbiBjYWxpYnJhdGVkIG9yIG5vdC4KKyAgICBpZiAoZWVwcm9tSW1hZ2UtPmJhc2VFZXBIZWFkZXIubGVuZ3RoID09IDB4ZmZmZikKKyAgICB7CisgICAgICAgICNpZmRlZiBaTV9FTkFCTEVfQkFOREVER0VTX1dJTkRPV1NfREVCVUcKKyAgICAgICAgem1fZGJnKCgiV2FybmluZyEgVGhpcyBkb25nbGUgbm90IGJlZW4gY2FsaWJyYXRlZFxuIikpOworICAgICAgICAjZW5kaWYKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgICNpZmRlZiBaTV9FTkFCTEVfVFBDX1dJTkRPV1NfREVCVUcKKyAgICBEYmdQcmludCgiLS0tLS16ZlNldFBvd2VyQ2FsVGFibGUgOiBmcmVxdWVuY3k9JWQtLS0tLVxuIiwgZnJlcXVlbmN5KTsKKyAgICAjZW5kaWYKKyAgICAvKiBUT0RPIDogMS4gYm91bmRhcnkxIGFuZCBwb3dlclR4TWF4IHNob3VsZCBiZSByZWZlcmVkIHRvIENSNjY3IGFuZCBDUjc5ICovCisgICAgLyogICAgICAgICAgIGluIG90dXMuaW5pIGZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgICAgI2lmZGVmIFpNX0VOQUJMRV9UUENfV0lORE9XU19ERUJVRworICAgIC8qIDIuIEludGVycG9sYXRlIHB3ciBhbmQgdnBkIHRlc3QgcG9pbnRzIGZyb20gZnJlcXVlbmN5ICovCisgICAgRGJnUHJpbnQoImNhbEZyZXFQaWVyNUcgOiAlZCwgJWQsICVkLCAlZCAsJWQsICVkLCAlZCwgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxGcmVxUGllcjVHWzBdKjUrNDgwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbEZyZXFQaWVyNUdbMV0qNSs0ODAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsRnJlcVBpZXI1R1syXSo1KzQ4MDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxGcmVxUGllcjVHWzNdKjUrNDgwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbEZyZXFQaWVyNUdbNF0qNSs0ODAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsRnJlcVBpZXI1R1s1XSo1KzQ4MDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxGcmVxUGllcjVHWzZdKjUrNDgwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbEZyZXFQaWVyNUdbN10qNSs0ODAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgRGJnUHJpbnQoImNhbEZyZXFQaWVyMkcgOiAlZCwgJWQsICVkLCAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbEZyZXFQaWVyMkdbMF0rMjMwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbEZyZXFQaWVyMkdbMV0rMjMwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbEZyZXFQaWVyMkdbMl0rMjMwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbEZyZXFQaWVyMkdbM10rMjMwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICNlbmRpZgorICAgIGlmIChmcmVxdWVuY3kgPCAzMDAwKQorICAgIHsKKyAgICAgICAgZm9yIChpPTA7IGk8NDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZWVwcm9tSW1hZ2UtPmNhbEZyZXFQaWVyMkdbaV0gPT0gMHhmZikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtYXgyZ0luZGV4ID0gaTsKKyAgICAgICAgI2lmZGVmIFpNX0VOQUJMRV9UUENfV0lORE9XU19ERUJVRworICAgICAgICBEYmdQcmludCgibWF4MmdJbmRleCA6ICVkXG4iLCBtYXgyZ0luZGV4KTsKKyAgICAgICAgI2VuZGlmCisgICAgICAgIGZiaW4gPSAodThfdCkoZnJlcXVlbmN5IC0gMjMwMCk7CisgICAgICAgIGluZGV4ID0gemZGaW5kRnJlcUluZGV4KGZiaW4sIGVlcHJvbUltYWdlLT5jYWxGcmVxUGllcjJHLCBtYXgyZ0luZGV4KTsKKyAgICAgICAgI2lmZGVmIFpNX0VOQUJMRV9UUENfV0lORE9XU19ERUJVRworICAgICAgICBEYmdQcmludCgiMkcgaW5kZXggOiAlZFxuIiwgaW5kZXgpOworICAgICAgICBEYmdQcmludCgiY2hhaW4gMCBpbmRleFxuIik7CisgICAgICAgICNlbmRpZgorICAgICAgICB6ZlByaW50VHAoJmVlcHJvbUltYWdlLT5jYWxQaWVyRGF0YTJHWzBdW2luZGV4XS5wd3JQZGdbMF1bMF0sCisgICAgICAgICAgICAgICAgICAmZWVwcm9tSW1hZ2UtPmNhbFBpZXJEYXRhMkdbMF1baW5kZXhdLnZwZFBkZ1swXVswXSwKKyAgICAgICAgICAgICAgICAgICZlZXByb21JbWFnZS0+Y2FsUGllckRhdGEyR1swXVtpbmRleF0ucHdyUGRnWzFdWzBdLAorICAgICAgICAgICAgICAgICAgJmVlcHJvbUltYWdlLT5jYWxQaWVyRGF0YTJHWzBdW2luZGV4XS52cGRQZGdbMV1bMF0KKyAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICNpZmRlZiBaTV9FTkFCTEVfVFBDX1dJTkRPV1NfREVCVUcKKyAgICAgICAgRGJnUHJpbnQoImNoYWluIDAgaW5kZXgrMVxuIik7CisgICAgICAgICNlbmRpZgorICAgICAgICB6ZlByaW50VHAoJmVlcHJvbUltYWdlLT5jYWxQaWVyRGF0YTJHWzBdW2luZGV4KzFdLnB3clBkZ1swXVswXSwKKyAgICAgICAgICAgICAgICAgICZlZXByb21JbWFnZS0+Y2FsUGllckRhdGEyR1swXVtpbmRleCsxXS52cGRQZGdbMF1bMF0sCisgICAgICAgICAgICAgICAgICAmZWVwcm9tSW1hZ2UtPmNhbFBpZXJEYXRhMkdbMF1baW5kZXgrMV0ucHdyUGRnWzFdWzBdLAorICAgICAgICAgICAgICAgICAgJmVlcHJvbUltYWdlLT5jYWxQaWVyRGF0YTJHWzBdW2luZGV4KzFdLnZwZFBkZ1sxXVswXQorICAgICAgICAgICAgICAgICAgKTsKKworICAgICAgICBmb3IgKGk9MDsgaTw1OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGNoYWluMHB3clBkZzBbaV0gPSB6ZkludGVycG9sYXRlRnVuY1goZmJpbiwKKyAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbEZyZXFQaWVyMkdbaW5kZXhdLAorICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsUGllckRhdGEyR1swXVtpbmRleF0ucHdyUGRnWzBdW2ldLAorICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsRnJlcVBpZXIyR1tpbmRleCsxXSwKKyAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbFBpZXJEYXRhMkdbMF1baW5kZXgrMV0ucHdyUGRnWzBdW2ldCisgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICBjaGFpbjB2cGRQZGcwW2ldID0gemZJbnRlcnBvbGF0ZUZ1bmNYKGZiaW4sCisgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxGcmVxUGllcjJHW2luZGV4XSwKKyAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbFBpZXJEYXRhMkdbMF1baW5kZXhdLnZwZFBkZ1swXVtpXSwKKyAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbEZyZXFQaWVyMkdbaW5kZXgrMV0sCisgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxQaWVyRGF0YTJHWzBdW2luZGV4KzFdLnZwZFBkZ1swXVtpXQorICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgY2hhaW4wcHdyUGRnMVtpXSA9IHpmSW50ZXJwb2xhdGVGdW5jWChmYmluLAorICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsRnJlcVBpZXIyR1tpbmRleF0sCisgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxQaWVyRGF0YTJHWzBdW2luZGV4XS5wd3JQZGdbMV1baV0sCisgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxGcmVxUGllcjJHW2luZGV4KzFdLAorICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsUGllckRhdGEyR1swXVtpbmRleCsxXS5wd3JQZGdbMV1baV0KKyAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIGNoYWluMHZwZFBkZzFbaV0gPSB6ZkludGVycG9sYXRlRnVuY1goZmJpbiwKKyAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbEZyZXFQaWVyMkdbaW5kZXhdLAorICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsUGllckRhdGEyR1swXVtpbmRleF0udnBkUGRnWzFdW2ldLAorICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsRnJlcVBpZXIyR1tpbmRleCsxXSwKKyAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbFBpZXJEYXRhMkdbMF1baW5kZXgrMV0udnBkUGRnWzFdW2ldCisgICAgICAgICAgICAgICAgICAgICk7CisKKyAgICAgICAgICAgIGNoYWluMnB3clBkZzBbaV0gPSB6ZkludGVycG9sYXRlRnVuY1goZmJpbiwKKyAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbEZyZXFQaWVyMkdbaW5kZXhdLAorICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsUGllckRhdGEyR1sxXVtpbmRleF0ucHdyUGRnWzBdW2ldLAorICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsRnJlcVBpZXIyR1tpbmRleCsxXSwKKyAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbFBpZXJEYXRhMkdbMV1baW5kZXgrMV0ucHdyUGRnWzBdW2ldCisgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICBjaGFpbjJ2cGRQZGcwW2ldID0gemZJbnRlcnBvbGF0ZUZ1bmNYKGZiaW4sCisgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxGcmVxUGllcjJHW2luZGV4XSwKKyAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbFBpZXJEYXRhMkdbMV1baW5kZXhdLnZwZFBkZ1swXVtpXSwKKyAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbEZyZXFQaWVyMkdbaW5kZXgrMV0sCisgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxQaWVyRGF0YTJHWzFdW2luZGV4KzFdLnZwZFBkZ1swXVtpXQorICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgY2hhaW4ycHdyUGRnMVtpXSA9IHpmSW50ZXJwb2xhdGVGdW5jWChmYmluLAorICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsRnJlcVBpZXIyR1tpbmRleF0sCisgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxQaWVyRGF0YTJHWzFdW2luZGV4XS5wd3JQZGdbMV1baV0sCisgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxGcmVxUGllcjJHW2luZGV4KzFdLAorICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsUGllckRhdGEyR1sxXVtpbmRleCsxXS5wd3JQZGdbMV1baV0KKyAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIGNoYWluMnZwZFBkZzFbaV0gPSB6ZkludGVycG9sYXRlRnVuY1goZmJpbiwKKyAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbEZyZXFQaWVyMkdbaW5kZXhdLAorICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsUGllckRhdGEyR1sxXVtpbmRleF0udnBkUGRnWzFdW2ldLAorICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsRnJlcVBpZXIyR1tpbmRleCsxXSwKKyAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbFBpZXJEYXRhMkdbMV1baW5kZXgrMV0udnBkUGRnWzFdW2ldCisgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZm9yIChpPTA7IGk8ODsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZWVwcm9tSW1hZ2UtPmNhbEZyZXFQaWVyNUdbaV0gPT0gMHhmZikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtYXg1Z0luZGV4ID0gaTsKKyAgICAgICAgI2lmZGVmIFpNX0VOQUJMRV9UUENfV0lORE9XU19ERUJVRworICAgICAgICBEYmdQcmludCgibWF4NWdJbmRleCA6ICVkXG4iLCBtYXg1Z0luZGV4KTsKKyAgICAgICAgI2VuZGlmCisgICAgICAgIGZiaW4gPSAodThfdCkoKGZyZXF1ZW5jeSAtIDQ4MDApLzUpOworICAgICAgICBpbmRleCA9IHpmRmluZEZyZXFJbmRleChmYmluLCBlZXByb21JbWFnZS0+Y2FsRnJlcVBpZXI1RywgbWF4NWdJbmRleCk7CisgICAgICAgICNpZmRlZiBaTV9FTkFCTEVfVFBDX1dJTkRPV1NfREVCVUcKKyAgICAgICAgRGJnUHJpbnQoIjVHIGluZGV4IDogJWRcbiIsIGluZGV4KTsKKyAgICAgICAgI2VuZGlmCisKKyAgICAgICAgZm9yIChpPTA7IGk8NTsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBjaGFpbjBwd3JQZGcwW2ldID0gemZJbnRlcnBvbGF0ZUZ1bmNYKGZiaW4sCisgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxGcmVxUGllcjVHW2luZGV4XSwKKyAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbFBpZXJEYXRhNUdbMF1baW5kZXhdLnB3clBkZ1swXVtpXSwKKyAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbEZyZXFQaWVyNUdbaW5kZXgrMV0sCisgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxQaWVyRGF0YTVHWzBdW2luZGV4KzFdLnB3clBkZ1swXVtpXQorICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgY2hhaW4wdnBkUGRnMFtpXSA9IHpmSW50ZXJwb2xhdGVGdW5jWChmYmluLAorICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsRnJlcVBpZXI1R1tpbmRleF0sCisgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxQaWVyRGF0YTVHWzBdW2luZGV4XS52cGRQZGdbMF1baV0sCisgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxGcmVxUGllcjVHW2luZGV4KzFdLAorICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsUGllckRhdGE1R1swXVtpbmRleCsxXS52cGRQZGdbMF1baV0KKyAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIGNoYWluMHB3clBkZzFbaV0gPSB6ZkludGVycG9sYXRlRnVuY1goZmJpbiwKKyAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbEZyZXFQaWVyNUdbaW5kZXhdLAorICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsUGllckRhdGE1R1swXVtpbmRleF0ucHdyUGRnWzFdW2ldLAorICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsRnJlcVBpZXI1R1tpbmRleCsxXSwKKyAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbFBpZXJEYXRhNUdbMF1baW5kZXgrMV0ucHdyUGRnWzFdW2ldCisgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICBjaGFpbjB2cGRQZGcxW2ldID0gemZJbnRlcnBvbGF0ZUZ1bmNYKGZiaW4sCisgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxGcmVxUGllcjVHW2luZGV4XSwKKyAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbFBpZXJEYXRhNUdbMF1baW5kZXhdLnZwZFBkZ1sxXVtpXSwKKyAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbEZyZXFQaWVyNUdbaW5kZXgrMV0sCisgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxQaWVyRGF0YTVHWzBdW2luZGV4KzFdLnZwZFBkZ1sxXVtpXQorICAgICAgICAgICAgICAgICAgICApOworCisgICAgICAgICAgICBjaGFpbjJwd3JQZGcwW2ldID0gemZJbnRlcnBvbGF0ZUZ1bmNYKGZiaW4sCisgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxGcmVxUGllcjVHW2luZGV4XSwKKyAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbFBpZXJEYXRhNUdbMV1baW5kZXhdLnB3clBkZ1swXVtpXSwKKyAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbEZyZXFQaWVyNUdbaW5kZXgrMV0sCisgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxQaWVyRGF0YTVHWzFdW2luZGV4KzFdLnB3clBkZ1swXVtpXQorICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgY2hhaW4ydnBkUGRnMFtpXSA9IHpmSW50ZXJwb2xhdGVGdW5jWChmYmluLAorICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsRnJlcVBpZXI1R1tpbmRleF0sCisgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxQaWVyRGF0YTVHWzFdW2luZGV4XS52cGRQZGdbMF1baV0sCisgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxGcmVxUGllcjVHW2luZGV4KzFdLAorICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsUGllckRhdGE1R1sxXVtpbmRleCsxXS52cGRQZGdbMF1baV0KKyAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIGNoYWluMnB3clBkZzFbaV0gPSB6ZkludGVycG9sYXRlRnVuY1goZmJpbiwKKyAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbEZyZXFQaWVyNUdbaW5kZXhdLAorICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsUGllckRhdGE1R1sxXVtpbmRleF0ucHdyUGRnWzFdW2ldLAorICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsRnJlcVBpZXI1R1tpbmRleCsxXSwKKyAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbFBpZXJEYXRhNUdbMV1baW5kZXgrMV0ucHdyUGRnWzFdW2ldCisgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICBjaGFpbjJ2cGRQZGcxW2ldID0gemZJbnRlcnBvbGF0ZUZ1bmNYKGZiaW4sCisgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxGcmVxUGllcjVHW2luZGV4XSwKKyAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbFBpZXJEYXRhNUdbMV1baW5kZXhdLnZwZFBkZ1sxXVtpXSwKKyAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbEZyZXFQaWVyNUdbaW5kZXgrMV0sCisgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxQaWVyRGF0YTVHWzFdW2luZGV4KzFdLnZwZFBkZ1sxXVtpXQorICAgICAgICAgICAgICAgICAgICApOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qIENoYWluIDEgKi8KKyAgICAvKiBHZXQgcHdyIGFuZCB2cGQgdGVzdCBwb2ludHMgZnJvbSBmcmVxdWVuY3kgKi8KKyAgICBmb3IgKGk9MDsgaTw1OyBpKyspCisgICAgeworICAgICAgICBwd3IwW2ldID0gY2hhaW4wcHdyUGRnMFtpXT4+MTsKKyAgICAgICAgdnBkMFtpXSA9IGNoYWluMHZwZFBkZzBbaV07CisgICAgICAgIHB3cjFbaV0gPSBjaGFpbjBwd3JQZGcxW2ldPj4xOworICAgICAgICB2cGQxW2ldID0gY2hhaW4wdnBkUGRnMVtpXTsKKyAgICB9CisgICAgI2lmZGVmIFpNX0VOQUJMRV9UUENfV0lORE9XU19ERUJVRworICAgIERiZ1ByaW50KCJUZXN0IFBvaW50c1xuIik7CisgICAgRGJnUHJpbnQoInB3cjAgOiAlZCwgJWQsICVkLCAlZCAsJWRcbiIsIHB3cjBbMF0sIHB3cjBbMV0sIHB3cjBbMl0sIHB3cjBbM10sIHB3cjBbNF0pOworICAgIERiZ1ByaW50KCJ2cGQwIDogJWQsICVkLCAlZCwgJWQgLCVkXG4iLCB2cGQwWzBdLCB2cGQwWzFdLCB2cGQwWzJdLCB2cGQwWzNdLCB2cGQwWzRdKTsKKyAgICBEYmdQcmludCgicHdyMSA6ICVkLCAlZCwgJWQsICVkICwlZFxuIiwgcHdyMVswXSwgcHdyMVsxXSwgcHdyMVsyXSwgcHdyMVszXSwgcHdyMVs0XSk7CisgICAgRGJnUHJpbnQoInZwZDEgOiAlZCwgJWQsICVkLCAlZCAsJWRcbiIsIHZwZDFbMF0sIHZwZDFbMV0sIHZwZDFbMl0sIHZwZDFbM10sIHZwZDFbNF0pOworICAgICNlbmRpZgorICAgIC8qIEdlbmVyYXRlIHRoZSB2cGQgYXJyYXlzICovCisgICAgZm9yIChpPTA7IGk8Ym91bmRhcnkxKzErNjsgaSsrKQorICAgIHsKKyAgICAgICAgdnBkX2NoYWluMVtpXSA9IHpmR2V0SW50ZXJwb2xhdGVkVmFsdWUoaSwgJnB3cjBbMF0sICZ2cGQwWzBdKTsKKyAgICB9CisgICAgZm9yICg7IGk8cG93ZXJUeE1heCsxKzYrNjsgaSsrKQorICAgIHsKKyAgICAgICAgdnBkX2NoYWluMVtpXSA9IHpmR2V0SW50ZXJwb2xhdGVkVmFsdWUoaS02LTYsICZwd3IxWzBdLCAmdnBkMVswXSk7CisgICAgfQorICAgICNpZmRlZiBaTV9FTkFCTEVfVFBDX1dJTkRPV1NfREVCVUcKKyAgICBEYmdQcmludCgidnBkX2NoYWluMVxuIik7CisgICAgZm9yIChpPTA7IGk8cG93ZXJUeE1heCsxKzYrNjsgaSs9MTApCisgICAgeworICAgICAgICBEYmdQcmludCgiJWQsICVkLCAlZCwgJWQgLCVkLCAlZCwgJWQsICVkLCAlZCwgJWRcbiIsCisgICAgICAgICAgICAgICAgdnBkX2NoYWluMVtpKzBdLCB2cGRfY2hhaW4xW2krMV0sIHZwZF9jaGFpbjFbaSsyXSwgdnBkX2NoYWluMVtpKzNdLCB2cGRfY2hhaW4xW2krNF0sCisgICAgICAgICAgICAgICAgdnBkX2NoYWluMVtpKzVdLCB2cGRfY2hhaW4xW2krNl0sIHZwZF9jaGFpbjFbaSs3XSwgdnBkX2NoYWluMVtpKzhdLCB2cGRfY2hhaW4xW2krOV0pOworICAgIH0KKyAgICAjZW5kaWYKKyAgICAvKiBXcml0ZSBQSFkgcmVncyA2NzItNzAzICovCisgICAgZm9yIChpPTA7IGk8MTI4OyBpKz00KQorICAgIHsKKyAgICAgICAgdTMyX3QgcmVnQWRkciA9IDB4OTgwMCArICg2NzIgKiA0KTsKKyAgICAgICAgdTMyX3QgdmFsOworCisgICAgICAgIHZhbCA9ICgodTMyX3QpdnBkX2NoYWluMVtpKzNdPDwyNCkgfAorICAgICAgICAgICAgICAgICgodTMyX3QpdnBkX2NoYWluMVtpKzJdPDwxNikgfAorICAgICAgICAgICAgICAgICgodTMyX3QpdnBkX2NoYWluMVtpKzFdPDw4KSB8CisgICAgICAgICAgICAgICAgKCh1MzJfdCl2cGRfY2hhaW4xW2ldKTsKKworICAgICAgICAjaWZuZGVmIFpNX09UVVNfTElOVVhfUEhBU0VfMgorICAgICAgICByZWdfd3JpdGUocmVnQWRkciArIGksIHZhbCk7ICAvKiBDUjY3MiAqLworICAgICAgICAjZW5kaWYKKyAgICB9CisKKyAgICAvKiBDaGFpbiAyICovCisgICAgLyogR2V0IHB3ciBhbmQgdnBkIHRlc3QgcG9pbnRzIGZyb20gZnJlcXVlbmN5ICovCisgICAgZm9yIChpPTA7IGk8NTsgaSsrKQorICAgIHsKKyAgICAgICAgcHdyMFtpXSA9IGNoYWluMnB3clBkZzBbaV0+PjE7CisgICAgICAgIHZwZDBbaV0gPSBjaGFpbjJ2cGRQZGcwW2ldOworICAgICAgICBwd3IxW2ldID0gY2hhaW4ycHdyUGRnMVtpXT4+MTsKKyAgICAgICAgdnBkMVtpXSA9IGNoYWluMnZwZFBkZzFbaV07CisgICAgfQorICAgICNpZmRlZiBaTV9FTkFCTEVfVFBDX1dJTkRPV1NfREVCVUcKKyAgICBEYmdQcmludCgiVGVzdCBQb2ludHNcbiIpOworICAgIERiZ1ByaW50KCJwd3IwIDogJWQsICVkLCAlZCwgJWQgLCVkXG4iLCBwd3IwWzBdLCBwd3IwWzFdLCBwd3IwWzJdLCBwd3IwWzNdLCBwd3IwWzRdKTsKKyAgICBEYmdQcmludCgidnBkMCA6ICVkLCAlZCwgJWQsICVkICwlZFxuIiwgdnBkMFswXSwgdnBkMFsxXSwgdnBkMFsyXSwgdnBkMFszXSwgdnBkMFs0XSk7CisgICAgRGJnUHJpbnQoInB3cjEgOiAlZCwgJWQsICVkLCAlZCAsJWRcbiIsIHB3cjFbMF0sIHB3cjFbMV0sIHB3cjFbMl0sIHB3cjFbM10sIHB3cjFbNF0pOworICAgIERiZ1ByaW50KCJ2cGQxIDogJWQsICVkLCAlZCwgJWQgLCVkXG4iLCB2cGQxWzBdLCB2cGQxWzFdLCB2cGQxWzJdLCB2cGQxWzNdLCB2cGQxWzRdKTsKKyAgICAjZW5kaWYKKyAgICAvKiBHZW5lcmF0ZSB0aGUgdnBkIGFycmF5cyAqLworICAgIGZvciAoaT0wOyBpPGJvdW5kYXJ5MSsxKzY7IGkrKykKKyAgICB7CisgICAgICAgIHZwZF9jaGFpbjNbaV0gPSB6ZkdldEludGVycG9sYXRlZFZhbHVlKGksICZwd3IwWzBdLCAmdnBkMFswXSk7CisgICAgfQorICAgIGZvciAoOyBpPHBvd2VyVHhNYXgrMSs2KzY7IGkrKykKKyAgICB7CisgICAgICAgIHZwZF9jaGFpbjNbaV0gPSB6ZkdldEludGVycG9sYXRlZFZhbHVlKGktNi02LCAmcHdyMVswXSwgJnZwZDFbMF0pOworICAgIH0KKyAgICAjaWZkZWYgWk1fRU5BQkxFX1RQQ19XSU5ET1dTX0RFQlVHCisgICAgRGJnUHJpbnQoInZwZF9jaGFpbjNcbiIpOworICAgIGZvciAoaT0wOyBpPHBvd2VyVHhNYXgrMSs2KzY7IGkrPTEwKQorICAgIHsKKyAgICAgICAgRGJnUHJpbnQoIiVkLCAlZCwgJWQsICVkICwlZCwgJWQsICVkLCAlZCwgJWQsICVkXG4iLAorICAgICAgICAgICAgICAgIHZwZF9jaGFpbjNbaSswXSwgdnBkX2NoYWluM1tpKzFdLCB2cGRfY2hhaW4zW2krMl0sIHZwZF9jaGFpbjNbaSszXSwgdnBkX2NoYWluM1tpKzRdLAorICAgICAgICAgICAgICAgIHZwZF9jaGFpbjNbaSs1XSwgdnBkX2NoYWluM1tpKzZdLCB2cGRfY2hhaW4zW2krN10sIHZwZF9jaGFpbjNbaSs4XSwgdnBkX2NoYWluM1tpKzldKTsKKyAgICB9CisgICAgI2VuZGlmCisKKyAgICAvKiBXcml0ZSBQSFkgcmVncyA2NzItNzAzICsgMHgxMDAwICovCisgICAgZm9yIChpPTA7IGk8MTI4OyBpKz00KQorICAgIHsKKyAgICAgICAgdTMyX3QgcmVnQWRkciA9IDB4OTgwMCArICg2NzIgKiA0KSArIDB4MTAwMDsKKyAgICAgICAgdTMyX3QgdmFsOworCisgICAgICAgIHZhbCA9ICgodTMyX3QpdnBkX2NoYWluM1tpKzNdPDwyNCkgfAorICAgICAgICAgICAgICAgICgodTMyX3QpdnBkX2NoYWluM1tpKzJdPDwxNikgfAorICAgICAgICAgICAgICAgICgodTMyX3QpdnBkX2NoYWluM1tpKzFdPDw4KSB8CisgICAgICAgICAgICAgICAgKCh1MzJfdCl2cGRfY2hhaW4zW2ldKTsKKworICAgICAgICAjaWZuZGVmIFpNX09UVVNfTElOVVhfUEhBU0VfMgorICAgICAgICByZWdfd3JpdGUocmVnQWRkciArIGksIHZhbCk7ICAvKiBDUjY3MiAqLworICAgICAgICAjZW5kaWYKKyAgICB9CisKKyAgICB6ZkZsdXNoRGVsYXlXcml0ZShkZXYpOworCisgICAgLyogMy4gR2VuZXJhdGUgdGFyZ2V0IHBvd2VyIHRhYmxlICovCisgICAgaWYgKGZyZXF1ZW5jeSA8IDMwMDApCisgICAgeworICAgICAgICBmb3IgKGk9MDsgaTwzOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChlZXByb21JbWFnZS0+Y2FsVGFyZ2V0UG93ZXJDY2tbaV0uYkNoYW5uZWwgIT0gMHhmZikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmYmluQXJyYXlbaV0gPSBlZXByb21JbWFnZS0+Y2FsVGFyZ2V0UG93ZXJDY2tbaV0uYkNoYW5uZWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBpbmRleCA9IHpmRmluZEZyZXFJbmRleChmYmluLCBmYmluQXJyYXksIGkpOworICAgICAgICAjaWZkZWYgWk1fRU5BQkxFX1RQQ19XSU5ET1dTX0RFQlVHCisgICAgICAgIERiZ1ByaW50KCJDQ0sgaW5kZXg9JWRcbiIsIGluZGV4KTsKKyAgICAgICAgI2VuZGlmCisgICAgICAgIGZvciAoaT0wOyBpPDQ7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaHBQcml2LT50UG93MnhDY2tbaV0gPSB6ZkludGVycG9sYXRlRnVuY1goZmJpbiwKKyAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbFRhcmdldFBvd2VyQ2NrW2luZGV4XS5iQ2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbFRhcmdldFBvd2VyQ2NrW2luZGV4XS50UG93MnhbaV0sCisgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxUYXJnZXRQb3dlckNja1tpbmRleCsxXS5iQ2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbFRhcmdldFBvd2VyQ2NrW2luZGV4KzFdLnRQb3cyeFtpXQorICAgICAgICAgICAgICAgICAgICApOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChpPTA7IGk8NDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZWVwcm9tSW1hZ2UtPmNhbFRhcmdldFBvd2VyMkdbaV0uYkNoYW5uZWwgIT0gMHhmZikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmYmluQXJyYXlbaV0gPSBlZXByb21JbWFnZS0+Y2FsVGFyZ2V0UG93ZXIyR1tpXS5iQ2hhbm5lbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGluZGV4ID0gemZGaW5kRnJlcUluZGV4KGZiaW4sIGZiaW5BcnJheSwgaSk7CisgICAgICAgICNpZmRlZiBaTV9FTkFCTEVfVFBDX1dJTkRPV1NfREVCVUcKKyAgICAgICAgRGJnUHJpbnQoIjJHIGluZGV4PSVkXG4iLCBpbmRleCk7CisgICAgICAgICNlbmRpZgorICAgICAgICBmb3IgKGk9MDsgaTw0OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGhwUHJpdi0+dFBvdzJ4MmdbaV0gPSB6ZkludGVycG9sYXRlRnVuY1goZmJpbiwKKyAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbFRhcmdldFBvd2VyMkdbaW5kZXhdLmJDaGFubmVsLAorICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsVGFyZ2V0UG93ZXIyR1tpbmRleF0udFBvdzJ4W2ldLAorICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsVGFyZ2V0UG93ZXIyR1tpbmRleCsxXS5iQ2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbFRhcmdldFBvd2VyMkdbaW5kZXgrMV0udFBvdzJ4W2ldCisgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGk9MDsgaTw0OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChlZXByb21JbWFnZS0+Y2FsVGFyZ2V0UG93ZXIyR0hUMjBbaV0uYkNoYW5uZWwgIT0gMHhmZikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmYmluQXJyYXlbaV0gPSBlZXByb21JbWFnZS0+Y2FsVGFyZ2V0UG93ZXIyR0hUMjBbaV0uYkNoYW5uZWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBpbmRleCA9IHpmRmluZEZyZXFJbmRleChmYmluLCBmYmluQXJyYXksIGkpOworICAgICAgICAjaWZkZWYgWk1fRU5BQkxFX1RQQ19XSU5ET1dTX0RFQlVHCisgICAgICAgIERiZ1ByaW50KCIyRyBIVDIwIGluZGV4PSVkXG4iLCBpbmRleCk7CisgICAgICAgICNlbmRpZgorICAgICAgICBmb3IgKGk9MDsgaTw4OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGhwUHJpdi0+dFBvdzJ4MmdIdDIwW2ldID0gemZJbnRlcnBvbGF0ZUZ1bmNYKGZiaW4sCisgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxUYXJnZXRQb3dlcjJHSFQyMFtpbmRleF0uYkNoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxUYXJnZXRQb3dlcjJHSFQyMFtpbmRleF0udFBvdzJ4W2ldLAorICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsVGFyZ2V0UG93ZXIyR0hUMjBbaW5kZXgrMV0uYkNoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxUYXJnZXRQb3dlcjJHSFQyMFtpbmRleCsxXS50UG93MnhbaV0KKyAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaT0wOyBpPDQ7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGVlcHJvbUltYWdlLT5jYWxUYXJnZXRQb3dlcjJHSFQ0MFtpXS5iQ2hhbm5lbCAhPSAweGZmKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZiaW5BcnJheVtpXSA9IGVlcHJvbUltYWdlLT5jYWxUYXJnZXRQb3dlcjJHSFQ0MFtpXS5iQ2hhbm5lbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGluZGV4ID0gemZGaW5kRnJlcUluZGV4KCAodThfdCl6ZkFkanVzdEhUNDBGcmVxT2Zmc2V0KGRldiwgZmJpbiwgYnc0MCwgZXh0T2Zmc2V0KSwgZmJpbkFycmF5LCBpKTsKKyAgICAgICAgI2lmZGVmIFpNX0VOQUJMRV9UUENfV0lORE9XU19ERUJVRworICAgICAgICBEYmdQcmludCgiMkcgSFQ0MCBpbmRleD0lZFxuIiwgaW5kZXgpOworICAgICAgICAjZW5kaWYKKyAgICAgICAgZm9yIChpPTA7IGk8ODsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBocFByaXYtPnRQb3cyeDJnSHQ0MFtpXSA9IHpmSW50ZXJwb2xhdGVGdW5jWCgKKyAgICAgICAgICAgICAgICAgICAgKHU4X3QpemZBZGp1c3RIVDQwRnJlcU9mZnNldChkZXYsIGZiaW4sIGJ3NDAsIGV4dE9mZnNldCksCisgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxUYXJnZXRQb3dlcjJHSFQ0MFtpbmRleF0uYkNoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxUYXJnZXRQb3dlcjJHSFQ0MFtpbmRleF0udFBvdzJ4W2ldLAorICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsVGFyZ2V0UG93ZXIyR0hUNDBbaW5kZXgrMV0uYkNoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxUYXJnZXRQb3dlcjJHSFQ0MFtpbmRleCsxXS50UG93MnhbaV0KKyAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgfQorCisgICAgICAgIHpmUHJpbnRUYXJnZXRQb3dlcjJHKGhwUHJpdi0+dFBvdzJ4Q2NrLAorICAgICAgICAgICAgICAgIGhwUHJpdi0+dFBvdzJ4MmcsCisgICAgICAgICAgICAgICAgaHBQcml2LT50UG93MngyZ0h0MjAsCisgICAgICAgICAgICAgICAgaHBQcml2LT50UG93MngyZ0h0NDApOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKiA1RyAqLworICAgICAgICBmb3IgKGk9MDsgaTw4OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChlZXByb21JbWFnZS0+Y2FsVGFyZ2V0UG93ZXI1R1tpXS5iQ2hhbm5lbCAhPSAweGZmKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZiaW5BcnJheVtpXSA9IGVlcHJvbUltYWdlLT5jYWxUYXJnZXRQb3dlcjVHW2ldLmJDaGFubmVsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgaW5kZXggPSB6ZkZpbmRGcmVxSW5kZXgoZmJpbiwgZmJpbkFycmF5LCBpKTsKKyAgICAgICAgI2lmZGVmIFpNX0VOQUJMRV9UUENfV0lORE9XU19ERUJVRworICAgICAgICBEYmdQcmludCgiNUcgaW5kZXg9JWRcbiIsIGluZGV4KTsKKyAgICAgICAgI2VuZGlmCisgICAgICAgIGZvciAoaT0wOyBpPDQ7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaHBQcml2LT50UG93Mng1Z1tpXSA9IHpmSW50ZXJwb2xhdGVGdW5jWChmYmluLAorICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsVGFyZ2V0UG93ZXI1R1tpbmRleF0uYkNoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxUYXJnZXRQb3dlcjVHW2luZGV4XS50UG93MnhbaV0sCisgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxUYXJnZXRQb3dlcjVHW2luZGV4KzFdLmJDaGFubmVsLAorICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsVGFyZ2V0UG93ZXI1R1tpbmRleCsxXS50UG93MnhbaV0KKyAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaT0wOyBpPDg7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGVlcHJvbUltYWdlLT5jYWxUYXJnZXRQb3dlcjVHSFQyMFtpXS5iQ2hhbm5lbCAhPSAweGZmKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZiaW5BcnJheVtpXSA9IGVlcHJvbUltYWdlLT5jYWxUYXJnZXRQb3dlcjVHSFQyMFtpXS5iQ2hhbm5lbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGluZGV4ID0gemZGaW5kRnJlcUluZGV4KGZiaW4sIGZiaW5BcnJheSwgaSk7CisgICAgICAgICNpZmRlZiBaTV9FTkFCTEVfVFBDX1dJTkRPV1NfREVCVUcKKyAgICAgICAgRGJnUHJpbnQoIjVHIEhUMjAgaW5kZXg9JWRcbiIsIGluZGV4KTsKKyAgICAgICAgI2VuZGlmCisgICAgICAgIGZvciAoaT0wOyBpPDg7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaHBQcml2LT50UG93Mng1Z0h0MjBbaV0gPSB6ZkludGVycG9sYXRlRnVuY1goZmJpbiwKKyAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbFRhcmdldFBvd2VyNUdIVDIwW2luZGV4XS5iQ2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbFRhcmdldFBvd2VyNUdIVDIwW2luZGV4XS50UG93MnhbaV0sCisgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxUYXJnZXRQb3dlcjVHSFQyMFtpbmRleCsxXS5iQ2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbFRhcmdldFBvd2VyNUdIVDIwW2luZGV4KzFdLnRQb3cyeFtpXQorICAgICAgICAgICAgICAgICAgICApOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChpPTA7IGk8ODsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZWVwcm9tSW1hZ2UtPmNhbFRhcmdldFBvd2VyNUdIVDQwW2ldLmJDaGFubmVsICE9IDB4ZmYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmJpbkFycmF5W2ldID0gZWVwcm9tSW1hZ2UtPmNhbFRhcmdldFBvd2VyNUdIVDQwW2ldLmJDaGFubmVsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgaW5kZXggPSB6ZkZpbmRGcmVxSW5kZXgoKHU4X3QpemZBZGp1c3RIVDQwRnJlcU9mZnNldChkZXYsIGZiaW4sIGJ3NDAsIGV4dE9mZnNldCksIGZiaW5BcnJheSwgaSk7CisgICAgICAgICNpZmRlZiBaTV9FTkFCTEVfVFBDX1dJTkRPV1NfREVCVUcKKyAgICAgICAgRGJnUHJpbnQoIjVHIEhUNDAgaW5kZXg9JWRcbiIsIGluZGV4KTsKKyAgICAgICAgI2VuZGlmCisgICAgICAgIGZvciAoaT0wOyBpPDg7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaHBQcml2LT50UG93Mng1Z0h0NDBbaV0gPSB6ZkludGVycG9sYXRlRnVuY1goCisgICAgICAgICAgICAgICAgICAgICh1OF90KXpmQWRqdXN0SFQ0MEZyZXFPZmZzZXQoZGV2LCBmYmluLCBidzQwLCBleHRPZmZzZXQpLAorICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsVGFyZ2V0UG93ZXI1R0hUNDBbaW5kZXhdLmJDaGFubmVsLAorICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsVGFyZ2V0UG93ZXI1R0hUNDBbaW5kZXhdLnRQb3cyeFtpXSwKKyAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbFRhcmdldFBvd2VyNUdIVDQwW2luZGV4KzFdLmJDaGFubmVsLAorICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsVGFyZ2V0UG93ZXI1R0hUNDBbaW5kZXgrMV0udFBvdzJ4W2ldCisgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgIH0KKworICAgICAgICB6ZlByaW50VGFyZ2V0UG93ZXI1RygKKyAgICAgICAgICAgICAgICBocFByaXYtPnRQb3cyeDVnLAorICAgICAgICAgICAgICAgIGhwUHJpdi0+dFBvdzJ4NWdIdDIwLAorICAgICAgICAgICAgICAgIGhwUHJpdi0+dFBvdzJ4NWdIdDQwKTsKKyAgICB9CisKKworCisgICAgLyogNC4gQ1RMICovCisgICAgLyoKKyAgICAgKiA0LjEgR2V0IHRoZSBiYW5kZWRnZXMgdHggcG93ZXIgYnkgZnJlcXVlbmN5CisgICAgICogICAgICAyLjRHIHdlIGdldCBjdGxFZGdlc01heFBvd2VyQ0NLCisgICAgICogICAgICAgICAgICAgICAgICBjdGxFZGdlc01heFBvd2VyMkcKKyAgICAgKiAgICAgICAgICAgICAgICAgIGN0bEVkZ2VzTWF4UG93ZXIyR0hUMjAKKyAgICAgKiAgICAgICAgICAgICAgICAgIGN0bEVkZ2VzTWF4UG93ZXIyR0hUNDAKKyAgICAgKiAgICAgIDVHIHdlIGdldCAgIGN0bEVkZ2VzTWF4UG93ZXI1RworICAgICAqICAgICAgICAgICAgICAgICAgY3RsRWRnZXNNYXhQb3dlcjVHSFQyMAorICAgICAqICAgICAgICAgICAgICAgICAgY3RsRWRnZXNNYXhQb3dlcjVHSFQ0MAorICAgICAqIDQuMiBVcGRhdGUgKDMuKSB0YXJnZXQgcG93ZXIgdGFibGUgYnkgNC4xCisgICAgICogNC4zIFR4IHBvd2VyIG9mZnNldCBmb3IgQVJUIC0gTkRJUy9NREsKKyAgICAgKiA0LjQgV3JpdGUgTUFDIHJlZyAweDY5NCBmb3IgQUNLJ3MgVFBDCisgICAgICoKKyAgICAgKi8KKworICAgIC8vemZEdW1wRWVwQmFuZEVkZ2VzKGVlcHJvbUltYWdlKTsKKworICAgIC8qIGdldCB0aGUgY2ZnIGZyb20gRWVwcm9tOiByZWdpb25Db2RlID0+IFJlZ3VsYXRvcnlEb21haW4gOiAweDEwLUZGQyAgMHgzMC1ldSAweDQwLWphcCAqLworICAgIGRlc2lyZWRfQ3RsSW5kZXggPSB6ZkhwR2V0UmVndWxhdG9yeURvbWFpbihkZXYpOworICAgIGlmICgoZGVzaXJlZF9DdGxJbmRleCA9PSAweDMwKSB8fCAoZGVzaXJlZF9DdGxJbmRleCA9PSAweDQwKSB8fCAoZGVzaXJlZF9DdGxJbmRleCA9PSAweDApKQorICAgIHsKKyAgICAgICAgLyogc2tpcCBDVEwgYW5kIGhlYXZ5IGNsaXAgKi8KKyAgICAgICAgaHBQcml2LT5lbmFibGVCQkhlYXZ5Q2xpcCA9IDA7CisgICAgICAgICNpZmRlZiBaTV9FTkFCTEVfQkFOREVER0VTX1dJTkRPV1NfREVCVUcKKyAgICAgICAgem1fZGJnKCgiUmVndWxhdG9yeURvbWFpbiA9IDAsIHNraXAgQ1RMIGFuZCBoZWF2eSBjbGlwXG4iKSk7CisgICAgICAgICNlbmRpZgorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBocFByaXYtPmVuYWJsZUJCSGVhdnlDbGlwID0gMTsKKworICAgICAgICBpZiAoZGVzaXJlZF9DdGxJbmRleCA9PSAweGZmKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBkZXNpcmVkIGluZGV4IG5vdCBmb3VuZCAqLworICAgICAgICAgICAgZGVzaXJlZF9DdGxJbmRleCA9IDB4MTA7CisgICAgICAgIH0KKworICAgICAgICAvKiBmaXJzdCBwYXJ0IDogMi40RyAqLworICAgICAgICBpZiAoZnJlcXVlbmN5IDw9IFpNX0NIX0dfMTQpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIDIuNEcgLSBDVExfMTFCICovCisgICAgICAgICAgICBjdGxfaSA9IHpmRmluZEN0bEVkZ2VzSW5kZXgoZGV2LCBkZXNpcmVkX0N0bEluZGV4fENUTF8xMUIpOworICAgICAgICAgICAgaWYoY3RsX2k8QVI1NDE2X05VTV9DVExTKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGN0bEVkZ2VzTWF4UG93ZXJDQ0sgPSB6ZkdldE1heEVkZ2VQb3dlcihkZXYsIGVlcHJvbUltYWdlLT5jdGxEYXRhW2N0bF9pXS5jdGxFZGdlc1sxXSwgZnJlcXVlbmN5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICNpZmRlZiBaTV9FTkFCTEVfQkFOREVER0VTX1dJTkRPV1NfREVCVUcKKyAgICAgICAgICAgIHptX2RiZygoIkNUTF8xMUIgY3RsX2kgPSAlZFxuIiwgY3RsX2kpKTsKKyAgICAgICAgICAgICNlbmRpZgorCisgICAgICAgICAgICAvKiAyLjRHIC0gQ1RMXzExRyAqLworICAgICAgICAgICAgY3RsX2kgPSB6ZkZpbmRDdGxFZGdlc0luZGV4KGRldiwgZGVzaXJlZF9DdGxJbmRleHxDVExfMTFHKTsKKyAgICAgICAgICAgIGlmKGN0bF9pPEFSNTQxNl9OVU1fQ1RMUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjdGxFZGdlc01heFBvd2VyMkcgPSB6ZkdldE1heEVkZ2VQb3dlcihkZXYsIGVlcHJvbUltYWdlLT5jdGxEYXRhW2N0bF9pXS5jdGxFZGdlc1sxXSwgZnJlcXVlbmN5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICNpZmRlZiBaTV9FTkFCTEVfQkFOREVER0VTX1dJTkRPV1NfREVCVUcKKyAgICAgICAgICAgIHptX2RiZygoIkNUTF8xMUcgY3RsX2kgPSAlZFxuIiwgY3RsX2kpKTsKKyAgICAgICAgICAgICNlbmRpZgorCisgICAgICAgICAgICAvKiAyLjRHIC0gQ1RMXzJHSFQyMCAqLworICAgICAgICAgICAgY3RsX2kgPSB6ZkZpbmRDdGxFZGdlc0luZGV4KGRldiwgZGVzaXJlZF9DdGxJbmRleHxDVExfMkdIVDIwKTsKKyAgICAgICAgICAgIGlmKGN0bF9pPEFSNTQxNl9OVU1fQ1RMUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjdGxFZGdlc01heFBvd2VyMkdIVDIwID0gemZHZXRNYXhFZGdlUG93ZXIoZGV2LCBlZXByb21JbWFnZS0+Y3RsRGF0YVtjdGxfaV0uY3RsRWRnZXNbMV0sIGZyZXF1ZW5jeSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogd29ya2Fyb3VuZCBmb3Igbm8gZGF0YSBpbiBFZXByb20sIHJlcGxhY2UgYnkgbm9ybWFsIDJHICovCisgICAgICAgICAgICAgICAgY3RsRWRnZXNNYXhQb3dlcjJHSFQyMCA9IGN0bEVkZ2VzTWF4UG93ZXIyRzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICNpZmRlZiBaTV9FTkFCTEVfQkFOREVER0VTX1dJTkRPV1NfREVCVUcKKyAgICAgICAgICAgIHptX2RiZygoIkNUTF8yR0hUMjAgY3RsX2kgPSAlZFxuIiwgY3RsX2kpKTsKKyAgICAgICAgICAgICNlbmRpZgorCisgICAgICAgICAgICAvKiAyLjRHIC0gQ1RMXzJHSFQ0MCAqLworICAgICAgICAgICAgY3RsX2kgPSB6ZkZpbmRDdGxFZGdlc0luZGV4KGRldiwgZGVzaXJlZF9DdGxJbmRleHxDVExfMkdIVDQwKTsKKyAgICAgICAgICAgIGlmKGN0bF9pPEFSNTQxNl9OVU1fQ1RMUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjdGxFZGdlc01heFBvd2VyMkdIVDQwID0gemZHZXRNYXhFZGdlUG93ZXIoZGV2LCBlZXByb21JbWFnZS0+Y3RsRGF0YVtjdGxfaV0uY3RsRWRnZXNbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemZBZGp1c3RIVDQwRnJlcU9mZnNldChkZXYsIGZyZXF1ZW5jeSwgYnc0MCwgZXh0T2Zmc2V0KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogd29ya2Fyb3VuZCBmb3Igbm8gZGF0YSBpbiBFZXByb20sIHJlcGxhY2UgYnkgbm9ybWFsIDJHICovCisgICAgICAgICAgICAgICAgY3RsRWRnZXNNYXhQb3dlcjJHSFQ0MCA9IGN0bEVkZ2VzTWF4UG93ZXIyRzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICNpZmRlZiBaTV9FTkFCTEVfQkFOREVER0VTX1dJTkRPV1NfREVCVUcKKyAgICAgICAgICAgIHptX2RiZygoIkNUTF8yR0hUNDAgY3RsX2kgPSAlZFxuIiwgY3RsX2kpKTsKKyAgICAgICAgICAgICNlbmRpZgorCisKKyAgICAgICAgICAgIC8qIDdhMTcgOiAgKi8KKyAgICAgICAgICAgIC8qIE1heCBwb3dlciAoZEJtKSBmb3IgY2hhbm5lbCByYW5nZSB3aGVuIHVzaW5nIERGUyBkZWZpbmUgYnkgbWFkd2lmaSovCisgICAgICAgICAgICBmb3IgKGk9MDsgaTx3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbENudDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICh3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbFtpXS5jaGFubmVsID09IGZyZXF1ZW5jeSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICh6ZkhwSXNEZnNDaGFubmVsKGRldiwgKHUxNl90KWZyZXF1ZW5jeSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHptX2RlYnVnX21zZzEoImZyZXF1ZW5jeSB1c2UgREZTICAtLSAiLCBmcmVxdWVuY3kpOworICAgICAgICAgICAgICAgICAgICAgICAgY3RsRWRnZXNNYXhQb3dlckNDSyAgICAgPSB6bV9taW4oY3RsRWRnZXNNYXhQb3dlckNDSywgd2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxbaV0ubWF4UmVnVHhQb3dlcioyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGN0bEVkZ2VzTWF4UG93ZXIyRyAgICAgID0gem1fbWluKGN0bEVkZ2VzTWF4UG93ZXIyRywgd2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxbaV0ubWF4UmVnVHhQb3dlcioyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGN0bEVkZ2VzTWF4UG93ZXIyR0hUMjAgID0gem1fbWluKGN0bEVkZ2VzTWF4UG93ZXIyR0hUMjAsIHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsW2ldLm1heFJlZ1R4UG93ZXIqMik7CisgICAgICAgICAgICAgICAgICAgICAgICBjdGxFZGdlc01heFBvd2VyMkdIVDQwICA9IHptX21pbihjdGxFZGdlc01heFBvd2VyMkdIVDQwLCB3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbFtpXS5tYXhSZWdUeFBvd2VyKjIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogQXBwbHkgY3RsIG1vZGUgdG8gY29ycmVjdCB0YXJnZXQgcG93ZXIgc2V0ICovCisgICAgICAgICAgICAjaWZkZWYgWk1fRU5BQkxFX0JBTkRFREdFU19XSU5ET1dTX0RFQlVHCisgICAgICAgICAgICB6bV9kZWJ1Z19tc2cxKCJjdGxFZGdlc01heFBvd2VyQ0NLICAgID0gIiwgY3RsRWRnZXNNYXhQb3dlckNDSyk7CisgICAgICAgICAgICB6bV9kZWJ1Z19tc2cxKCJjdGxFZGdlc01heFBvd2VyMkcgICAgID0gIiwgY3RsRWRnZXNNYXhQb3dlcjJHKTsKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzEoImN0bEVkZ2VzTWF4UG93ZXIyR0hUMjAgPSAiLCBjdGxFZGdlc01heFBvd2VyMkdIVDIwKTsKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzEoImN0bEVkZ2VzTWF4UG93ZXIyR0hUNDAgPSAiLCBjdGxFZGdlc01heFBvd2VyMkdIVDQwKTsKKyAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgZm9yIChpPTA7IGk8NDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGhwUHJpdi0+dFBvdzJ4Q2NrW2ldID0gem1fbWluKGhwUHJpdi0+dFBvdzJ4Q2NrW2ldLCBjdGxFZGdlc01heFBvd2VyQ0NLKSArIEhBTFRYX1BPV0VSX09GRlNFVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGhwUHJpdi0+dFBvdzJ4MmcyNEhlYXZ5Q2xpcE9mZnNldCA9IDA7CisgICAgICAgICAgICBpZiAoaHBQcml2LT5lbmFibGVCQkhlYXZ5Q2xpcCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjdGxPZmZzZXQgPSAyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGN0bE9mZnNldCA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGk9MDsgaTw0OyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCgoZnJlcXVlbmN5ID09IDI0MTIpIHx8IChmcmVxdWVuY3kgPT0gMjQ2MikpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGkgIT0gMCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaHBQcml2LT50UG93MngyZ1tpXSA9IHptX21pbihocFByaXYtPnRQb3cyeDJnW2ldLCBjdGxFZGdlc01heFBvd2VyMkctY3RsT2Zmc2V0KSArIEhBTFRYX1BPV0VSX09GRlNFVDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGhwUHJpdi0+dFBvdzJ4MmdbaV0gPSB6bV9taW4oaHBQcml2LT50UG93MngyZ1tpXSwgY3RsRWRnZXNNYXhQb3dlcjJHKSArIEhBTFRYX1BPV0VSX09GRlNFVDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChocFByaXYtPnRQb3cyeDJnW2ldID4gKGN0bEVkZ2VzTWF4UG93ZXIyRy1jdGxPZmZzZXQpKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhwUHJpdi0+dFBvdzJ4MmcyNEhlYXZ5Q2xpcE9mZnNldCA9IGhwUHJpdi0+dFBvdzJ4MmdbaV0gLSAoY3RsRWRnZXNNYXhQb3dlcjJHLWN0bE9mZnNldCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaHBQcml2LT50UG93MngyZ1tpXSA9IHptX21pbihocFByaXYtPnRQb3cyeDJnW2ldLCBjdGxFZGdlc01heFBvd2VyMkcpICsgSEFMVFhfUE9XRVJfT0ZGU0VUOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoaT0wOyBpPDg7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKChmcmVxdWVuY3kgPT0gMjQxMikgfHwgKGZyZXF1ZW5jeSA9PSAyNDYyKSkgJiYgKGk+PTMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaHBQcml2LT50UG93MngyZ0h0MjBbaV0gPSB6bV9taW4oaHBQcml2LT50UG93MngyZ0h0MjBbaV0sIGN0bEVkZ2VzTWF4UG93ZXIyR0hUMjAtY3RsT2Zmc2V0KSArIEhBTFRYX1BPV0VSX09GRlNFVDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaHBQcml2LT50UG93MngyZ0h0MjBbaV0gPSB6bV9taW4oaHBQcml2LT50UG93MngyZ0h0MjBbaV0sIGN0bEVkZ2VzTWF4UG93ZXIyR0hUMjApICsgSEFMVFhfUE9XRVJfT0ZGU0VUOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoaT0wOyBpPDg7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKGZyZXF1ZW5jeSA9PSAyNDEyKSAmJiAoaT49MykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBocFByaXYtPnRQb3cyeDJnSHQ0MFtpXSA9IHptX21pbihocFByaXYtPnRQb3cyeDJnSHQ0MFtpXSwgY3RsRWRnZXNNYXhQb3dlcjJHSFQ0MC1jdGxPZmZzZXQpICsgSEFMVFhfUE9XRVJfT0ZGU0VUOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmICgoZnJlcXVlbmN5ID09IDI0NjIpICYmIChpPj0zKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGhwUHJpdi0+dFBvdzJ4MmdIdDQwW2ldID0gem1fbWluKGhwUHJpdi0+dFBvdzJ4MmdIdDQwW2ldLCBjdGxFZGdlc01heFBvd2VyMkdIVDQwLShjdGxPZmZzZXQqMikpICsgSEFMVFhfUE9XRVJfT0ZGU0VUOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBocFByaXYtPnRQb3cyeDJnSHQ0MFtpXSA9IHptX21pbihocFByaXYtPnRQb3cyeDJnSHQ0MFtpXSwgY3RsRWRnZXNNYXhQb3dlcjJHSFQ0MCkgKyBIQUxUWF9QT1dFUl9PRkZTRVQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLyogNUcgLSBDVExfMTFBICovCisgICAgICAgICAgICBjdGxfaSA9IHpmRmluZEN0bEVkZ2VzSW5kZXgoZGV2LCBkZXNpcmVkX0N0bEluZGV4fENUTF8xMUEpOworICAgICAgICAgICAgaWYoY3RsX2k8QVI1NDE2X05VTV9DVExTKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGN0bEVkZ2VzTWF4UG93ZXI1RyA9IHpmR2V0TWF4RWRnZVBvd2VyKGRldiwgZWVwcm9tSW1hZ2UtPmN0bERhdGFbY3RsX2ldLmN0bEVkZ2VzWzFdLCBmcmVxdWVuY3kpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgI2lmZGVmIFpNX0VOQUJMRV9CQU5ERURHRVNfV0lORE9XU19ERUJVRworICAgICAgICAgICAgem1fZGJnKCgiQ1RMXzExQSBjdGxfaSA9ICVkXG4iLCBjdGxfaSkpOworICAgICAgICAgICAgI2VuZGlmCisKKyAgICAgICAgICAgIC8qIDVHIC0gQ1RMXzVHSFQyMCAqLworICAgICAgICAgICAgY3RsX2kgPSB6ZkZpbmRDdGxFZGdlc0luZGV4KGRldiwgZGVzaXJlZF9DdGxJbmRleHxDVExfNUdIVDIwKTsKKyAgICAgICAgICAgIGlmKGN0bF9pPEFSNTQxNl9OVU1fQ1RMUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjdGxFZGdlc01heFBvd2VyNUdIVDIwID0gemZHZXRNYXhFZGdlUG93ZXIoZGV2LCBlZXByb21JbWFnZS0+Y3RsRGF0YVtjdGxfaV0uY3RsRWRnZXNbMV0sIGZyZXF1ZW5jeSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogd29ya2Fyb3VuZCBmb3Igbm8gZGF0YSBpbiBFZXByb20sIHJlcGxhY2UgYnkgbm9ybWFsIDVHICovCisgICAgICAgICAgICAgICAgY3RsRWRnZXNNYXhQb3dlcjVHSFQyMCA9IGN0bEVkZ2VzTWF4UG93ZXI1RzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICNpZmRlZiBaTV9FTkFCTEVfQkFOREVER0VTX1dJTkRPV1NfREVCVUcKKyAgICAgICAgICAgIHptX2RiZygoIkNUTF81R0hUMjAgY3RsX2kgPSAlZFxuIiwgY3RsX2kpKTsKKyAgICAgICAgICAgICNlbmRpZgorCisgICAgICAgICAgICAvKiA1RyAtIENUTF81R0hUNDAgKi8KKyAgICAgICAgICAgIGN0bF9pID0gemZGaW5kQ3RsRWRnZXNJbmRleChkZXYsIGRlc2lyZWRfQ3RsSW5kZXh8Q1RMXzVHSFQ0MCk7CisgICAgICAgICAgICBpZihjdGxfaTxBUjU0MTZfTlVNX0NUTFMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY3RsRWRnZXNNYXhQb3dlcjVHSFQ0MCA9IHpmR2V0TWF4RWRnZVBvd2VyKGRldiwgZWVwcm9tSW1hZ2UtPmN0bERhdGFbY3RsX2ldLmN0bEVkZ2VzWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpmQWRqdXN0SFQ0MEZyZXFPZmZzZXQoZGV2LCBmcmVxdWVuY3ksIGJ3NDAsIGV4dE9mZnNldCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIHdvcmthcm91bmQgZm9yIG5vIGRhdGEgaW4gRWVwcm9tLCByZXBsYWNlIGJ5IG5vcm1hbCA1RyAqLworICAgICAgICAgICAgICAgIGN0bEVkZ2VzTWF4UG93ZXI1R0hUNDAgPSBjdGxFZGdlc01heFBvd2VyNUc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAjaWZkZWYgWk1fRU5BQkxFX0JBTkRFREdFU19XSU5ET1dTX0RFQlVHCisgICAgICAgICAgICB6bV9kYmcoKCJDVExfNUdIVDQwIGN0bF9pID0gJWRcbiIsIGN0bF9pKSk7CisgICAgICAgICAgICAjZW5kaWYKKworICAgICAgICAgICAgLyogN2ExNyA6ICAqLworICAgICAgICAgICAgLyogTWF4IHBvd2VyIChkQm0pIGZvciBjaGFubmVsIHJhbmdlIHdoZW4gdXNpbmcgREZTIGRlZmluZSBieSBtYWR3aWZpKi8KKyAgICAgICAgICAgIGZvciAoaT0wOyBpPHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsQ250OyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsW2ldLmNoYW5uZWwgPT0gZnJlcXVlbmN5KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHpmSHBJc0Rmc0NoYW5uZWwoZGV2LCAodTE2X3QpZnJlcXVlbmN5KSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMSgiZnJlcXVlbmN5IHVzZSBERlMgIC0tICIsIGZyZXF1ZW5jeSk7CisgICAgICAgICAgICAgICAgICAgICAgICBjdGxFZGdlc01heFBvd2VyNUcgICAgICA9IHptX21pbihjdGxFZGdlc01heFBvd2VyNUcsIHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsW2ldLm1heFJlZ1R4UG93ZXIqMik7CisgICAgICAgICAgICAgICAgICAgICAgICBjdGxFZGdlc01heFBvd2VyNUdIVDIwICA9IHptX21pbihjdGxFZGdlc01heFBvd2VyNUdIVDIwLCB3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbFtpXS5tYXhSZWdUeFBvd2VyKjIpOworICAgICAgICAgICAgICAgICAgICAgICAgY3RsRWRnZXNNYXhQb3dlcjVHSFQ0MCAgPSB6bV9taW4oY3RsRWRnZXNNYXhQb3dlcjVHSFQ0MCwgd2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxbaV0ubWF4UmVnVHhQb3dlcioyKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgLyogQXBwbHkgY3RsIG1vZGUgdG8gY29ycmVjdCB0YXJnZXQgcG93ZXIgc2V0ICovCisgICAgICAgICAgICAjaWZkZWYgWk1fRU5BQkxFX0JBTkRFREdFU19XSU5ET1dTX0RFQlVHCisgICAgICAgICAgICB6bV9kZWJ1Z19tc2cxKCJjdGxFZGdlc01heFBvd2VyNUcgICAgID0gIiwgY3RsRWRnZXNNYXhQb3dlcjVHKTsKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzEoImN0bEVkZ2VzTWF4UG93ZXI1R0hUMjAgPSAiLCBjdGxFZGdlc01heFBvd2VyNUdIVDIwKTsKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzEoImN0bEVkZ2VzTWF4UG93ZXI1R0hUNDAgPSAiLCBjdGxFZGdlc01heFBvd2VyNUdIVDQwKTsKKyAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgZm9yIChpPTA7IGk8NDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGhwUHJpdi0+dFBvdzJ4NWdbaV0gPSB6bV9taW4oaHBQcml2LT50UG93Mng1Z1tpXSwgY3RsRWRnZXNNYXhQb3dlcjVHKSArIEhBTFRYX1BPV0VSX09GRlNFVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoaT0wOyBpPDg7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBocFByaXYtPnRQb3cyeDVnSHQyMFtpXSA9IHptX21pbihocFByaXYtPnRQb3cyeDVnSHQyMFtpXSwgY3RsRWRnZXNNYXhQb3dlcjVHSFQyMCkgKyBIQUxUWF9QT1dFUl9PRkZTRVQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGk9MDsgaTw4OyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaHBQcml2LT50UG93Mng1Z0h0NDBbaV0gPSB6bV9taW4oaHBQcml2LT50UG93Mng1Z0h0NDBbaV0sIGN0bEVkZ2VzTWF4UG93ZXI1R0hUNDApICsgSEFMVFhfUE9XRVJfT0ZGU0VUOworICAgICAgICAgICAgfQorCisgICAgICAgIH0vKiBlbmQgb2YgYmFuZGVkZ2VzIG9mIDVHICovCisgICAgfS8qIGVuZCBvZiAgaWYgKChkZXNpcmVkX0N0bEluZGV4ID0gemZIcEdldFJlZ3VsYXRvcnlEb21haW4oZGV2KSkgPT0gMCkgKi8KKworICAgIC8qIHdvcmthcm91bmQgKi8KKyAgICAvKiA1LiBCQiBoZWF2eSBjbGlwICovCisgICAgLyogICAgb25seSAyLjRHIGRvIGhlYXZ5IGNsaXAgKi8KKyAgICBpZiAoaHBQcml2LT5lbmFibGVCQkhlYXZ5Q2xpcCAmJiBocFByaXYtPmh3QkJIZWF2eUNsaXAgJiYgKGZyZXF1ZW5jeSA8PSBaTV9DSF9HXzE0KSkKKyAgICB7CisgICAgICAgIGlmIChmcmVxdWVuY3kgPD0gWk1fQ0hfR18xNCkKKyAgICAgICAgeworICAgICAgICAgICAgY3RsX2kgPSB6ZkZpbmRDdGxFZGdlc0luZGV4KGRldiwgZGVzaXJlZF9DdGxJbmRleHxDVExfMTFHKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGN0bF9pID0gemZGaW5kQ3RsRWRnZXNJbmRleChkZXYsIGRlc2lyZWRfQ3RsSW5kZXh8Q1RMXzExQSk7CisgICAgICAgIH0KKworICAgICAgICBocFByaXYtPnNldFZhbHVlSGVhdnlDbGlwID0gemZIcENoZWNrRG9IZWF2eUNsaXAoZGV2LCBmcmVxdWVuY3ksIGVlcHJvbUltYWdlLT5jdGxEYXRhW2N0bF9pXS5jdGxFZGdlc1sxXSwgYnc0MCk7CisKKyAgICAgICAgaWYgKGhwUHJpdi0+c2V0VmFsdWVIZWF2eUNsaXApCisgICAgICAgIHsKKyAgICAgICAgICAgIGhwUHJpdi0+ZG9CQkhlYXZ5Q2xpcCA9IDE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBocFByaXYtPmRvQkJIZWF2eUNsaXAgPSAwOworICAgICAgICB9CisgICAgICAgICNpZmRlZiBaTV9FTkFCTEVfQkFOREVER0VTX1dJTkRPV1NfREVCVUcKKyAgICAgICAgem1fZGJnKCgiemZIcENoZWNrRG9IZWF2eUNsaXAgcmV0ID0gJTAyeCwgZG9CQkhlYXZ5Q2xpcCA9ICVkXG4iLAorICAgICAgICAgICAgICAgICBocFByaXYtPnNldFZhbHVlSGVhdnlDbGlwLCBocFByaXYtPmRvQkJIZWF2eUNsaXApKTsKKyAgICAgICAgI2VuZGlmCisKKyAgICAgICAgaWYgKGhwUHJpdi0+ZG9CQkhlYXZ5Q2xpcCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGhwUHJpdi0+c2V0VmFsdWVIZWF2eUNsaXAgJiAweGYwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGhwUHJpdi0+dFBvdzJ4MmdIdDQwWzBdIC09IDE7CisgICAgICAgICAgICAgICAgaHBQcml2LT50UG93MngyZ0h0NDBbMV0gLT0gMTsKKyAgICAgICAgICAgICAgICBocFByaXYtPnRQb3cyeDJnSHQ0MFsyXSAtPSAxOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoaHBQcml2LT5zZXRWYWx1ZUhlYXZ5Q2xpcCAmIDB4ZikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBocFByaXYtPnRQb3cyeDJnSHQyMFswXSArPSAxOworICAgICAgICAgICAgICAgIGhwUHJpdi0+dFBvdzJ4MmdIdDIwWzFdICs9IDE7CisgICAgICAgICAgICAgICAgaHBQcml2LT50UG93MngyZ0h0MjBbMl0gKz0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBocFByaXYtPmRvQkJIZWF2eUNsaXAgPSAwOworICAgICAgICBocFByaXYtPnNldFZhbHVlSGVhdnlDbGlwID0gMDsKKyAgICB9CisKKyAgICAvKiBGaW5hbCA6IHdyaXRlIE1BQyByZWdpc3RlciBmb3Igc29tZSBjdHJsIGZyYW1lIFR4IHBvd2VyICovCisgICAgLyogZmlyc3QgcGFydCA6IDIuNEcgKi8KKyAgICBpZiAoZnJlcXVlbmN5IDw9IFpNX0NIX0dfMTQpCisgICAgeworICAgICAgICAvKiBXcml0ZSBNQUMgcmVnIDB4Njk0IGZvciBBQ0sncyBUUEMgKi8KKyAgICAgICAgLyogV3JpdGUgTUFDIHJlZyAweGJiNCBSVFMgYW5kIFNGLUNUUyBmcmFtZSBwb3dlciBjb250cm9sICovCisgICAgICAgIC8qIEFsd2F5cyB1c2UgdHdvIHN0cmVhbSBmb3IgbG93IGxlZ2FjeSByYXRlICovCisgICAgICAgICNpZiAwCisgICAgICAgIC8vaWYgKGhwUHJpdi0+aGFsQ2FwYWJpbGl0eSAmIFpNX0hQX0NBUF8xMU5fT05FX1RYX1NUUkVBTSkKKyAgICAgICAgLy97CisgICAgICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIDB4MWMzNjk0LCAoKGhwUHJpdi0+dFBvdzJ4MmdbMF0mMHgzZikgPDwgMjApIHwgKDB4MTw8MjYpKTsKKyAgICAgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxYzNiYjQsICgoaHBQcml2LT50UG93MngyZ1swXSYweDNmKSA8PCA1ICkgfCAoMHgxPDwxMSkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChocFByaXYtPnRQb3cyeDJnWzBdJjB4M2YpIDw8IDIxKSB8ICgweDE8PDI3KSAgKTsKKyAgICAgICAgLy99CisgICAgICAgICNlbmRpZgorICAgICAgICAjaWYgMQorICAgICAgICAvL2Vsc2UKKyAgICAgICAgeworICAgICAgICAgICAgI2lmbmRlZiBaTV9PVFVTX0xJTlVYX1BIQVNFXzIKKyAgICAgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxYzM2OTQsICgoaHBQcml2LT50UG93MngyZ1swXSYweDNmKSA8PCAyMCkgfCAoMHg1PDwyNikpOworICAgICAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFjM2JiNCwgKChocFByaXYtPnRQb3cyeDJnWzBdJjB4M2YpIDw8IDUgKSB8ICgweDU8PDExKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGhwUHJpdi0+dFBvdzJ4MmdbMF0mMHgzZikgPDwgMjEpIHwgKDB4NTw8MjcpICApOworICAgICAgICAgICAgI2VuZGlmCisgICAgICAgICAgICBocFByaXYtPmN1cnJlbnRBY2tSdHNUcGMgPSBocFByaXYtPnRQb3cyeDJnWzBdOworICAgIAl9CisgICAgICAgICNlbmRpZgorICAgICAgICB6ZkZsdXNoRGVsYXlXcml0ZShkZXYpOworCisgICAgICAgIHpmUHJpbnRUYXJnZXRQb3dlcjJHKGhwUHJpdi0+dFBvdzJ4Q2NrLAorICAgICAgICAgICAgICAgIGhwUHJpdi0+dFBvdzJ4MmcsCisgICAgICAgICAgICAgICAgaHBQcml2LT50UG93MngyZ0h0MjAsCisgICAgICAgICAgICAgICAgaHBQcml2LT50UG93MngyZ0h0NDApOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKiBXcml0ZSBNQUMgcmVnIDB4Njk0IGZvciBBQ0sncyBUUEMgKi8KKyAgICAgICAgLyogV3JpdGUgTUFDIHJlZyAweGJiNCBSVFMgYW5kIFNGLUNUUyBmcmFtZSBwb3dlciBjb250cm9sICovCisgICAgICAgIC8qIEFsd2F5cyB1c2UgdHdvIHN0cmVhbSBmb3IgbG93IGxlZ2FjeSByYXRlICovCisgICAgICAgIGlmIChocFByaXYtPmhhbENhcGFiaWxpdHkgJiBaTV9IUF9DQVBfMTFOX09ORV9UWF9TVFJFQU0pCisgICAgICAgIHsKKyAgICAgICAgICAgICNpZm5kZWYgWk1fT1RVU19MSU5VWF9QSEFTRV8yCisgICAgICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIDB4MWMzNjk0LCAoKGhwUHJpdi0+dFBvdzJ4NWdbMF0mMHgzZikgPDwgMjApIHwgKDB4MTw8MjYpKTsKKyAgICAgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxYzNiYjQsICgoaHBQcml2LT50UG93Mng1Z1swXSYweDNmKSA8PCA1ICkgfCAoMHgxPDwxMSkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChocFByaXYtPnRQb3cyeDVnWzBdJjB4M2YpIDw8IDIxKSB8ICgweDE8PDI3KSAgKTsKKyAgICAgICAgICAgICNlbmRpZgorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgI2lmbmRlZiBaTV9PVFVTX0xJTlVYX1BIQVNFXzIKKyAgICAgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxYzM2OTQsICgoaHBQcml2LT50UG93Mng1Z1swXSYweDNmKSA8PCAyMCkgfCAoMHg1PDwyNikpOworICAgICAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFjM2JiNCwgKChocFByaXYtPnRQb3cyeDVnWzBdJjB4M2YpIDw8IDUgKSB8ICgweDU8PDExKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGhwUHJpdi0+dFBvdzJ4NWdbMF0mMHgzZikgPDwgMjEpIHwgKDB4NTw8MjcpICApOworICAgICAgICAgICAgI2VuZGlmCisgICAgICAgICAgICBocFByaXYtPmN1cnJlbnRBY2tSdHNUcGMgPSBocFByaXYtPnRQb3cyeDJnWzBdOworICAgICAgICB9CisKKworICAgICAgICB6ZkZsdXNoRGVsYXlXcml0ZShkZXYpOworCisgICAgICAgIHpmUHJpbnRUYXJnZXRQb3dlcjVHKAorICAgICAgICAgICAgICAgIGhwUHJpdi0+dFBvdzJ4NWcsCisgICAgICAgICAgICAgICAgaHBQcml2LT50UG93Mng1Z0h0MjAsCisgICAgICAgICAgICAgICAgaHBQcml2LT50UG93Mng1Z0h0NDApOworICAgIH0vKiBlbmQgb2YgYmFuZGVkZ2VzIG9mIDVHICovCisKK30KKwordm9pZCB6ZkR1bXBFZXBCYW5kRWRnZXMoc3RydWN0IGFyNTQxNkVlcHJvbSogZWVwcm9tSW1hZ2UpCit7CisgICAgI2lmZGVmIFpNX0VOQUJMRV9CQU5ERURHRVNfV0lORE9XU19ERUJVRworICAgIHU4X3QgaSwgaiwgazsKKworI2lmIDAKKyAgICB6bV9kYmcoKCJcbiA9PT0gQmFuZEVkZ2VzIGluZGV4IGR1bXAgPT09PSBcbiIpKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBBUjU0MTZfTlVNX0NUTFM7IGkrKykKKyAgICB7CisgICAgICAgIHptX2RiZygoIiUwMnggIiwgZWVwcm9tSW1hZ2UtPmN0bEluZGV4W2ldKSk7CisgICAgfQorCisgICAgem1fZGJnKCgiXG4gPT09IEJhbmRFZGdlcyBkYXRhIGR1bXAgPT09PSBcbiIpKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBBUjU0MTZfTlVNX0NUTFM7IGkrKykKKyAgICB7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCAyOyBqKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvcihrID0gMDsgayA8IEFSNTQxNl9OVU1fQkFORF9FREdFUzsgaysrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHU4X3QgKnBkYXRhID0gKHU4X3QqKSYoZWVwcm9tSW1hZ2UtPmN0bERhdGFbaV0uY3RsRWRnZXNbal1ba10pOworICAgICAgICAgICAgICAgIHptX2RiZygoIiglMDJ4ICUwMngpIiwgcGRhdGFbMF0sIHBkYXRhWzFdKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB6bV9kYmcoKCJcbiIpKTsKKyAgICAgICAgfQorICAgIH0KKyNlbHNlCisgICAgem1fZGJnKCgiXG4gPT09IEJhbmRFZGdlcyBpbmRleCBkdW1wID09PT0gXG4iKSk7CisgICAgZm9yIChpID0gMDsgaSA8IDI0OyBpKz04KQorICAgIHsKKyAgICAgICAgem1fZGJnKCgiJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4IiwKKyAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jdGxJbmRleFtpKzBdLCBlZXByb21JbWFnZS0+Y3RsSW5kZXhbaSsxXSwgZWVwcm9tSW1hZ2UtPmN0bEluZGV4W2krMl0sIGVlcHJvbUltYWdlLT5jdGxJbmRleFtpKzNdLAorICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmN0bEluZGV4W2krNF0sIGVlcHJvbUltYWdlLT5jdGxJbmRleFtpKzVdLCBlZXByb21JbWFnZS0+Y3RsSW5kZXhbaSs2XSwgZWVwcm9tSW1hZ2UtPmN0bEluZGV4W2krN10KKyAgICAgICAgICAgICAgICkpOworICAgIH0KKworICAgIHptX2RiZygoIlxuID09PSBCYW5kRWRnZXMgZGF0YSBkdW1wID09PT0gXG4iKSk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgQVI1NDE2X05VTV9DVExTOyBpKyspCisgICAgeworICAgICAgICBmb3IgKGogPSAwOyBqIDwgMjsgaisrKQorICAgICAgICB7CisgICAgICAgICAgICB1OF90ICpwZGF0YSA9ICh1OF90KikmKGVlcHJvbUltYWdlLT5jdGxEYXRhW2ldLmN0bEVkZ2VzW2pdKTsKKyAgICAgICAgICAgIHptX2RiZygoIiglMDNkICUwMngpICglMDNkICUwMngpICglMDNkICUwMngpICglMDNkICUwMngpIFxuIiwKKyAgICAgICAgICAgICAgICAgICBwZGF0YVswXSwgcGRhdGFbMV0sIHBkYXRhWzJdLCBwZGF0YVszXSwKKyAgICAgICAgICAgICAgICAgICBwZGF0YVs0XSwgcGRhdGFbNV0sIHBkYXRhWzZdLCBwZGF0YVs3XQorICAgICAgICAgICAgICAgICAgICkpOworICAgICAgICAgICAgem1fZGJnKCgiKCUwM2QgJTAyeCkgKCUwM2QgJTAyeCkgKCUwM2QgJTAyeCkgKCUwM2QgJTAyeCkgXG4iLAorICAgICAgICAgICAgICAgICAgIHBkYXRhWzhdLCBwZGF0YVs5XSwgcGRhdGFbMTBdLCBwZGF0YVsxMV0sCisgICAgICAgICAgICAgICAgICAgcGRhdGFbMTJdLCBwZGF0YVsxM10sIHBkYXRhWzE0XSwgcGRhdGFbMTVdCisgICAgICAgICAgICAgICAgICAgKSk7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKyAgICAjZW5kaWYKK30KKwordm9pZCB6ZlByaW50VGFyZ2V0UG93ZXIyRyh1OF90KiB0UG93MnhDY2ssIHU4X3QqIHRQb3cyeDJnLCB1OF90KiB0UG93MngyZ0h0MjAsIHU4X3QqIHRQb3cyeDJnSHQ0MCkKK3sKKyAgICAvLyNpZmRlZiBaTV9FTkFCTEVfVFBDX1dJTkRPV1NfREVCVUcKKyAgICAjaWZkZWYgWk1fRU5BQkxFX0JBTkRFREdFU19XSU5ET1dTX0RFQlVHCisgICAgRGJnUHJpbnQoInRhcmdldFB3ciBDQ0sgOiAlZCwgJWQsICVkLCAlZFxuIiwKKyAgICAgICAgICAgIHRQb3cyeENja1swXSwKKyAgICAgICAgICAgIHRQb3cyeENja1sxXSwKKyAgICAgICAgICAgIHRQb3cyeENja1syXSwKKyAgICAgICAgICAgIHRQb3cyeENja1szXQorICAgICAgICAgICAgKTsKKyAgICBEYmdQcmludCgidGFyZ2V0UHdyIDJHIDogJWQsICVkLCAlZCwgJWRcbiIsCisgICAgICAgICAgICB0UG93MngyZ1swXSwKKyAgICAgICAgICAgIHRQb3cyeDJnWzFdLAorICAgICAgICAgICAgdFBvdzJ4MmdbMl0sCisgICAgICAgICAgICB0UG93MngyZ1szXQorICAgICAgICAgICAgKTsKKyAgICBEYmdQcmludCgidGFyZ2V0UHdyIDJHSFQyMCA6ICVkLCAlZCwgJWQsICVkLCAlZCwgJWQsICVkLCAlZFxuIiwKKyAgICAgICAgICAgIHRQb3cyeDJnSHQyMFswXSwKKyAgICAgICAgICAgIHRQb3cyeDJnSHQyMFsxXSwKKyAgICAgICAgICAgIHRQb3cyeDJnSHQyMFsyXSwKKyAgICAgICAgICAgIHRQb3cyeDJnSHQyMFszXSwKKyAgICAgICAgICAgIHRQb3cyeDJnSHQyMFs0XSwKKyAgICAgICAgICAgIHRQb3cyeDJnSHQyMFs1XSwKKyAgICAgICAgICAgIHRQb3cyeDJnSHQyMFs2XSwKKyAgICAgICAgICAgIHRQb3cyeDJnSHQyMFs3XQorICAgICAgICAgICAgKTsKKyAgICBEYmdQcmludCgidGFyZ2V0UHdyIDJHSFQ0MCA6ICVkLCAlZCwgJWQsICVkLCAlZCwgJWQsICVkLCAlZFxuIiwKKyAgICAgICAgICAgIHRQb3cyeDJnSHQ0MFswXSwKKyAgICAgICAgICAgIHRQb3cyeDJnSHQ0MFsxXSwKKyAgICAgICAgICAgIHRQb3cyeDJnSHQ0MFsyXSwKKyAgICAgICAgICAgIHRQb3cyeDJnSHQ0MFszXSwKKyAgICAgICAgICAgIHRQb3cyeDJnSHQ0MFs0XSwKKyAgICAgICAgICAgIHRQb3cyeDJnSHQ0MFs1XSwKKyAgICAgICAgICAgIHRQb3cyeDJnSHQ0MFs2XSwKKyAgICAgICAgICAgIHRQb3cyeDJnSHQ0MFs3XQorICAgICAgICAgICAgKTsKKyAgICAjZW5kaWYKKyAgICByZXR1cm47Cit9CisKK3ZvaWQgemZQcmludFRhcmdldFBvd2VyNUcodThfdCogdFBvdzJ4NWcsIHU4X3QqIHRQb3cyeDVnSHQyMCwgdThfdCogdFBvdzJ4NWdIdDQwKQoreworICAgIC8vI2lmZGVmIFpNX0VOQUJMRV9UUENfV0lORE9XU19ERUJVRworICAgICNpZmRlZiBaTV9FTkFCTEVfQkFOREVER0VTX1dJTkRPV1NfREVCVUcKKyAgICBEYmdQcmludCgidGFyZ2V0UHdyIDVHIDogJWQsICVkLCAlZCwgJWRcbiIsCisgICAgICAgICAgICB0UG93Mng1Z1swXSwKKyAgICAgICAgICAgIHRQb3cyeDVnWzFdLAorICAgICAgICAgICAgdFBvdzJ4NWdbMl0sCisgICAgICAgICAgICB0UG93Mng1Z1szXQorICAgICAgICAgICAgKTsKKyAgICBEYmdQcmludCgidGFyZ2V0UHdyIDVHSFQyMCA6ICVkLCAlZCwgJWQsICVkLCAlZCwgJWQsICVkLCAlZFxuIiwKKyAgICAgICAgICAgIHRQb3cyeDVnSHQyMFswXSwKKyAgICAgICAgICAgIHRQb3cyeDVnSHQyMFsxXSwKKyAgICAgICAgICAgIHRQb3cyeDVnSHQyMFsyXSwKKyAgICAgICAgICAgIHRQb3cyeDVnSHQyMFszXSwKKyAgICAgICAgICAgIHRQb3cyeDVnSHQyMFs0XSwKKyAgICAgICAgICAgIHRQb3cyeDVnSHQyMFs1XSwKKyAgICAgICAgICAgIHRQb3cyeDVnSHQyMFs2XSwKKyAgICAgICAgICAgIHRQb3cyeDVnSHQyMFs3XQorICAgICAgICAgICAgKTsKKyAgICBEYmdQcmludCgidGFyZ2V0UHdyIDVHSFQ0MCA6ICVkLCAlZCwgJWQsICVkLCAlZCwgJWQsICVkLCAlZFxuIiwKKyAgICAgICAgICAgIHRQb3cyeDVnSHQ0MFswXSwKKyAgICAgICAgICAgIHRQb3cyeDVnSHQ0MFsxXSwKKyAgICAgICAgICAgIHRQb3cyeDVnSHQ0MFsyXSwKKyAgICAgICAgICAgIHRQb3cyeDVnSHQ0MFszXSwKKyAgICAgICAgICAgIHRQb3cyeDVnSHQ0MFs0XSwKKyAgICAgICAgICAgIHRQb3cyeDVnSHQ0MFs1XSwKKyAgICAgICAgICAgIHRQb3cyeDVnSHQ0MFs2XSwKKyAgICAgICAgICAgIHRQb3cyeDVnSHQ0MFs3XQorICAgICAgICAgICAgKTsKKyAgICAjZW5kaWYKKyAgICByZXR1cm47Cit9CisKK3ZvaWQgemZIcFBvd2VyU2F2ZVNldE1vZGUoemRldl90KiBkZXYsIHU4X3Qgc3RhTW9kZSwgdThfdCBwc01vZGUsIHUxNl90IGJjbkludGVydmFsKQoreworICAgIGlmICggc3RhTW9kZSA9PSAwICkKKyAgICB7CisgICAgICAgIGlmICggcHNNb2RlID09IDAgKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBUdXJuIG9mZiBwcmUtVEJUVCBpbnRlcnJ1cHQKKyAgICAgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgWk1fTUFDX1JFR19QUkVUQlRULCAwKTsKKyAgICAgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgWk1fTUFDX1JFR19CQ05fUEVSSU9ELCAwKTsKKyAgICAgICAgICAgIHpmRmx1c2hEZWxheVdyaXRlKGRldik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvLyBUdXJuIG9uIHByZS1UQlRUIGludGVycnVwdAorICAgICAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBaTV9NQUNfUkVHX1BSRVRCVFQsIChiY25JbnRlcnZhbC02KTw8MTYpOworICAgICAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBaTV9NQUNfUkVHX0JDTl9QRVJJT0QsIGJjbkludGVydmFsKTsKKyAgICAgICAgICAgIHpmRmx1c2hEZWxheVdyaXRlKGRldik7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgemZIcFBvd2VyU2F2ZVNldFN0YXRlKHpkZXZfdCogZGV2LCB1OF90IHBzU3RhdGUpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworICAgIHN0cnVjdCB6c0hwUHJpdiogaHBQcml2ID0gd2QtPmhwUHJpdmF0ZTsKKworCS8vRGJnUHJpbnQoIklOVE8gemZIcFBvd2VyU2F2ZVNldFN0YXRlIik7CisKKyAgICBpZiAoIHBzU3RhdGUgPT0gMCApIC8vcG93ZXIgdXAKKyAgICB7CisgICAgICAgIC8vRGJnUHJpbnQoInpmSHBQb3dlclNhdmVTZXRTdGF0ZSBXYWtlIHVwIGZyb20gUFNcbiIpOworICAgICAgICByZWdfd3JpdGUoMHg5ODJDLCAweDAwMDBhMDAwKTsgLy93YWtlIHVwIEFEREFDCisgICAgICAgIHJlZ193cml0ZSgweDk4MDgsIDB4MCk7ICAgICAgICAvL2VuYWJsZSBhbGwgYWdjIGdhaW4gYW5kIG9mZnNldCB1cGRhdGVzIHRvIGEyCisgICAgICAgIC8vIyBiYW5rIDMKKyAgICAgICAgaWYgKCgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+aHdGcmVxdWVuY3kgPD0gWk1fQ0hfR18xNCkKKyAgICAgICAgeworICAgICAgICAgICAgLyogMTFnICovCisgICAgICAgICAgICAvL3JlZ193cml0ZSAoMHg5OGYwLCAgMHgwMWMwMDAxOCk7CisgICAgICAgICAgICByZWdfd3JpdGUgKDB4OThmMCwgIDB4MDFjMjAwOTgpOy8vc3luX29uK1JYX09OCisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvKiAxMWEgKi8KKyAgICAgICAgICAgIC8vcmVnX3dyaXRlICgweDk4ZjAsICAweDAxNDAwMDE4KTsKKyAgICAgICAgICAgIHJlZ193cml0ZSAoMHg5OGYwLCAgMHgwMTQyMDA5OCk7Ly9zeW5fb24rUlhfT04KKyAgICAgICAgfQorCisgICAgICAgIC8vLy8jYmFuayA1CisgICAgICAgIC8vcmVnX3dyaXRlKDB4OThiMCwgIDB4MDAwMDAwMTMpOworICAgICAgICAvL3JlZ193cml0ZSgweDk4ZTQsICAweDAwMDAwMDAyKTsKKworCisgICAgICAgIHpmRmx1c2hEZWxheVdyaXRlKGRldik7CisgICAgfQorICAgIGVsc2UgLy9wb3dlciBkb3duCisgICAgeworICAgICAgICAvL0RiZ1ByaW50KCJ6ZkhwUG93ZXJTYXZlU2V0U3RhdGUgR28gdG8gUFNcbiIpOworICAgICAgICAvL3JlZ193cml0ZSgweDk4MkMsIDB4YTAwMGEwMDApOworICAgICAgICByZWdfd3JpdGUoMHg5ODA4LCAweDgwMDAwMDApOyAgICAvL2Rpc2FibGUgYWxsIGFnYyBnYWluIGFuZCBvZmZzZXQgdXBkYXRlcyB0byBhMgorICAgICAgICByZWdfd3JpdGUoMHg5ODJDLCAweGEwMDBhMDAwKTsgICAvL3Bvd2VyIGRvd24gQUREQUMKKyAgICAgICAgLy8jIGJhbmsgMworICAgICAgICBpZiAoKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5od0ZyZXF1ZW5jeSA8PSBaTV9DSF9HXzE0KQorICAgICAgICB7CisgICAgICAgICAgICAvKiAxMWcgKi8KKyAgICAgICAgICAgIHJlZ193cml0ZSAoMHg5OGYwLCAgMHgwMGMwMDAxOCk7Ly9zeW5fb2ZmK1JYX29mZgorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLyogMTFhICovCisgICAgICAgICAgICByZWdfd3JpdGUgKDB4OThmMCwgIDB4MDA0MDAwMTgpOy8vc3luX29mZitSWF9vZmYKKyAgICAgICAgfQorCisgICAgICAgIC8vLy8jYmFuayA1CisgICAgICAgIC8vcmVnX3dyaXRlKDB4OThiMCwgIDB4MDAwZTAwMTMpOworICAgICAgICAvL3JlZ193cml0ZSgweDk4ZTQsICAweDAwMDE4MDAyKTsKKworCisgICAgICAgIHpmRmx1c2hEZWxheVdyaXRlKGRldik7CisgICAgfQorfQorCit2b2lkIHpmSHBTZXRBZ2dQa3ROdW0oemRldl90KiBkZXYsIHUzMl90IG51bSkKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisgICAgc3RydWN0IHpzSHBQcml2KiBocFByaXYgPSB3ZC0+aHBQcml2YXRlOworCisgICAgbnVtID0gKG51bSA8PCAxNikgfCAoMHhhKTsKKworICAgIGhwUHJpdi0+YWdnUGt0TnVtID0gbnVtOworCisgICAgLy9hZ2dyZWdhdGlvbiBudW1iZXIgd2lsbCBiZSB1cGRhdGUgaW4gSEFMIGhlYXJ0IGJlYXQKKyAgICAvL3pmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxYzNiOWMsIG51bSk7CisgICAgLy96ZkZsdXNoRGVsYXlXcml0ZShkZXYpOworfQorCit2b2lkIHpmSHBTZXRNUERVRGVuc2l0eSh6ZGV2X3QqIGRldiwgdThfdCBkZW5zaXR5KQoreworICAgIHUzMl90IHZhbHVlOworCisgICAgaWYgKGRlbnNpdHkgPiBaTV9NUERVX0RFTlNJVFlfOFVTKQorICAgIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8qIERlZmF1bHQgdmFsdWUgaW4gdGhpcyByZWdpc3RlciAqLworICAgIHZhbHVlID0gMHgxNDBBMDAgfCBkZW5zaXR5OworCisgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFjM2JhMCwgdmFsdWUpOworICAgIHpmRmx1c2hEZWxheVdyaXRlKGRldik7CisgICAgcmV0dXJuOworfQorCit2b2lkIHpmSHBTZXRTbG90VGltZSh6ZGV2X3QqIGRldiwgdThfdCB0eXBlKQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICBzdHJ1Y3QgenNIcFByaXYqIGhwUHJpdiA9IHdkLT5ocFByaXZhdGU7CisKKyAgICBpZiAodHlwZSA9PSAwKQorICAgIHsKKyAgICAgICAgLy9ub3JtYWwgc2xvdCA9IDIwdXMKKyAgICAgICAgaHBQcml2LT5zbG90VHlwZSA9IDA7CisgICAgfQorICAgIGVsc2UgLy9pZiAodHlwZSA9PSAxKQorICAgIHsKKyAgICAgICAgLy9zaG9ydCBzbG90ID0gOXVzCisgICAgICAgIGhwUHJpdi0+c2xvdFR5cGUgPSAxOworICAgIH0KKworICAgIHJldHVybjsKK30KKwordm9pZCB6ZkhwU2V0U2xvdFRpbWVSZWdpc3Rlcih6ZGV2X3QqIGRldiwgdThfdCB0eXBlKQoreworICAgIGlmKHR5cGUgPT0gMCkKKyAgICB7CisgICAgICAgIC8vbm9ybWFsIHNsb3QgPSAyMHVzCisgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgWk1fTUFDX1JFR19TTE9UX1RJTUUsIDIwPDwxMCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8vc2hvcnQgc2xvdCA9IDl1cworICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIFpNX01BQ19SRUdfU0xPVF9USU1FLCA5PDwxMCk7CisgICAgfQorfQorCit2b2lkIHpmSHBTZXRSaWZzKHpkZXZfdCogZGV2LCB1OF90IGh0X2VuYWJsZSwgdThfdCBodDIwNDAsIHU4X3QgZ19tb2RlKQoreworICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxYzYzODgsIDB4MGMwMDAwMDApOworCisgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFjNTllYywgMHgwY2M4MGNhYSk7CisKKyAgICBpZiAoaHRfZW5hYmxlKQorICAgIHsKKyAgICAgICAgaWYgKGh0MjA0MCkKKyAgICAgICAgeworICAgICAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFjNTkxOCwgNDApOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFjNTkxOCwgMjApOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGdfbW9kZSkKKyAgICB7CisgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxYzU4NTAsIDB4ZWMwOGI0ZTIpOworICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIDB4MWM1ODVjLCAweDMxM2E1ZDVlKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFjNTg1MCwgMHhlZGU4YjRlMCk7CisgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxYzU4NWMsIDB4MzEzOTYwNWUpOworICAgIH0KKworICAgIHpmRmx1c2hEZWxheVdyaXRlKGRldik7CisgICAgcmV0dXJuOworfQorCit2b2lkIHpmSHBCZWdpblNpdGVTdXJ2ZXkoemRldl90KiBkZXYsIHU4X3Qgc3RhdHVzKQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICBzdHJ1Y3QgenNIcFByaXYqIGhwUHJpdj13ZC0+aHBQcml2YXRlOworCisgICAgaWYgKCBzdGF0dXMgPT0gMSApCisgICAgeyAvLyBDb25uZWN0ZWQKKyAgICAgICAgaHBQcml2LT5pc1NpdGVTdXJ2ZXkgPSAxOworICAgIH0KKyAgICBlbHNlCisgICAgeyAvLyBOb3QgY29ubmVjdGVkCisgICAgICAgIGhwUHJpdi0+aXNTaXRlU3VydmV5ID0gMDsKKyAgICB9CisKKyAgICAvKiByZXNldCB3b3JrYXJvdW5kIHN0YXRlIHRvIGRlZmF1bHQgKi8KKy8vICAgIGlmIChocFByaXYtPnJ4U3Ryb25nUlNTSSA9PSAxKQorICAgIHsKKyAgICAgICAgaHBQcml2LT5yeFN0cm9uZ1JTU0kgPSAwOworICAgICAgICBpZiAoKGhwUHJpdi0+ZWVwcm9tSW1hZ2VbMHgxMDArMHgxMTAqMi80XSYweGZmKSA9PSAweDgwKSAvL0ZFTSBUWVBFCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChocFByaXYtPmh3RnJlcXVlbmN5IDw9IFpNX0NIX0dfMTQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFjODk2MCwgMHg5YjQ5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIDB4MWM4OTYwLCAweDA5MDApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFjODk2MCwgMHg5YjQwKTsKKyAgICAgICAgfQorICAgICAgICB6ZkZsdXNoRGVsYXlXcml0ZShkZXYpOworICAgIH0KKy8vICAgIGlmIChocFByaXYtPnN0cm9uZ1JTU0kgPT0gMSkKKyAgICB7CisgICAgICAgIGhwUHJpdi0+c3Ryb25nUlNTSSA9IDA7CisgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxYzM2OTQsICgoaHBQcml2LT5jdXJyZW50QWNrUnRzVHBjJjB4M2YpIDw8IDIwKSB8ICgweDU8PDI2KSk7CisgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxYzNiYjQsICgoaHBQcml2LT5jdXJyZW50QWNrUnRzVHBjJjB4M2YpIDw8IDUgKSB8ICgweDU8PDExKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoaHBQcml2LT5jdXJyZW50QWNrUnRzVHBjJjB4M2YpIDw8IDIxKSB8ICgweDU8PDI3KSAgKTsKKyAgICAgICAgemZGbHVzaERlbGF5V3JpdGUoZGV2KTsKKyAgICB9Cit9CisKK3ZvaWQgemZIcEZpbmlzaFNpdGVTdXJ2ZXkoemRldl90KiBkZXYsIHU4X3Qgc3RhdHVzKQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICBzdHJ1Y3QgenNIcFByaXYqIGhwUHJpdj13ZC0+aHBQcml2YXRlOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgaWYgKCBzdGF0dXMgPT0gMSApCisgICAgeworICAgICAgICBocFByaXYtPmlzU2l0ZVN1cnZleSA9IDI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGhwUHJpdi0+aXNTaXRlU3VydmV5ID0gMDsKKyAgICB9CisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKK30KKwordTE2X3QgemZGd1JldHJ5KHpkZXZfdCogZGV2LCB1OF90IGVuYWJsZSkKK3sKKyAgICB1MzJfdCBjbWRbKFpNX01BWF9DTURfU0laRS80KV07CisgICAgdTE2X3QgcmV0ID0gMDsKKworICAgIGNtZFswXSA9IDQgfCAoMHg5MiA8PCA4KTsKKyAgICBjbWRbMV0gPSAoZW5hYmxlID09IDEpID8gMHgwMSA6IDB4MDA7CisKKyAgICByZXQgPSB6Zklzc3VlQ21kKGRldiwgY21kLCA4LCBaTV9PSURfSU5URVJOQUxfV1JJVEUsIE5VTEwpOworICAgIHJldHVybiByZXQ7Cit9CisKK3UxNl90IHpmSHBFbmFibGVId1JldHJ5KHpkZXZfdCogZGV2KQoreworICAgIHUxNl90IHJldDsKKworICAgIHJldCA9IHpmRndSZXRyeShkZXYsIDApOworCisgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFjM2IyOCwgMHgzMzMzMyk7CisgICAgemZGbHVzaERlbGF5V3JpdGUoZGV2KTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK3UxNl90IHpmSHBEaXNhYmxlSHdSZXRyeSh6ZGV2X3QqIGRldikKK3sKKyAgICB1MTZfdCByZXQ7CisKKyAgICByZXQgPSB6ZkZ3UmV0cnkoZGV2LCAxKTsKKworICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxYzNiMjgsIDB4MDAwMDApOworICAgIHpmRmx1c2hEZWxheVdyaXRlKGRldik7CisKKyAgICByZXR1cm4gcmV0OworfQorCisvKiBEb3dubG9hZCBTUEkgRncgKi8KKyNkZWZpbmUgWk1fRklSTVdBUkVfV0xBTiAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFpNX0ZJUk1XQVJFX1NQSV9GTEFTSCAgICAgICAgICAgMQorCisKK3UxNl90IHpmSHBGaXJtd2FyZURvd25sb2FkKHpkZXZfdCogZGV2LCB1OF90IGZ3VHlwZSkKK3sKKyAgICB1MTZfdCByZXQgPSBaTV9TVUNDRVNTOworCisgICAgaWYgKGZ3VHlwZSA9PSBaTV9GSVJNV0FSRV9XTEFOKQorICAgIHsKKyAgICAgICAgcmV0ID0gemZGaXJtd2FyZURvd25sb2FkKGRldiwgKHUzMl90Kil6Y0Z3SW1hZ2UsCisgICAgICAgICAgICAgICAgKHUzMl90KXpjRndJbWFnZVNpemUsIFpNX0ZJUk1XQVJFX1dMQU5fQUREUik7CisgICAgfQorICAgIGVsc2UgaWYgKGZ3VHlwZSA9PSBaTV9GSVJNV0FSRV9TUElfRkxBU0gpCisgICAgeworICAgICAgICByZXQgPSB6ZkZpcm13YXJlRG93bmxvYWQoZGV2LCAodTMyX3QqKXpjRndJbWFnZVNQSSwKKyAgICAgICAgICAgICAgICAodTMyX3QpemNGd0ltYWdlU1BJU2l6ZSwgWk1fRklSTVdBUkVfU1BJX0FERFIpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB6bV9kZWJ1Z19tc2cxKCJVbmtub3duIGZpcm13YXJlIHR5cGUgPSAiLCBmd1R5cGUpOworICAgICAgICByZXQgPSBaTV9FUlJfRklSTVdBUkVfV1JPTkdfVFlQRTsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCisvKiBFbmFibGUgc29mdHdhcmUgZGVjcnlwdGlvbiAqLwordm9pZCB6ZkhwU1dEZWNyeXB0KHpkZXZfdCogZGV2LCB1OF90IGVuYWJsZSkKK3sKKyAgICB1MzJfdCB2YWx1ZSA9IDB4NzA7CisKKyAgICAvKiBCaXQgNCBmb3IgZW5hYmxlIHNvZnR3YXJlIGRlY3J5cHRpb24gKi8KKyAgICBpZiAoZW5hYmxlID09IDEpCisgICAgeworICAgICAgICB2YWx1ZSA9IDB4Nzg7CisgICAgfQorCisgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFjMzY3OCwgdmFsdWUpOworICAgIHpmRmx1c2hEZWxheVdyaXRlKGRldik7Cit9CisKKy8qIEVuYWJsZSBzb2Z0d2FyZSBlbmNyeXB0aW9uICovCit2b2lkIHpmSHBTV0VuY3J5cHQoemRldl90KiBkZXYsIHU4X3QgZW5hYmxlKQoreworICAgIC8qIEJlY2F1c2UgZW5jcnlwdGlvbiBieSBzb2Z0d2FyZSBvciBoYXJkd2FyZSBpcyBqdWRnZWQgYnkgZHJpdmVyIGluIE90dXMsCisgICAgICAgd2UgZG9uJ3QgbmVlZCB0byBkbyBhbnl0aGluZyBpbiB0aGUgSEFMIGxheWVyLgorICAgICAqLworfQorCit1MzJfdCB6ZkhwQ2FwYWJpbGl0eSh6ZGV2X3QqIGRldikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisgICAgc3RydWN0IHpzSHBQcml2KiBocFByaXY9d2QtPmhwUHJpdmF0ZTsKKworICAgIHJldHVybiBocFByaXYtPmhhbENhcGFiaWxpdHk7Cit9CisKK3ZvaWQgemZIcFNldFJvbGxDYWxsVGFibGUoemRldl90KiBkZXYpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworICAgIHN0cnVjdCB6c0hwUHJpdiogaHBQcml2PXdkLT5ocFByaXZhdGU7CisKKyAgICBpZiAoaHBQcml2LT5jYW1Sb2xsQ2FsbFRhYmxlICE9ICh1NjRfdCkgMCkKKyAgICB7CisgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgWk1fTUFDX1JFR19ST0xMX0NBTExfVEJMX0wsICh1MzJfdCkoaHBQcml2LT5jYW1Sb2xsQ2FsbFRhYmxlICYgMHhmZmZmZmZmZikpOworICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIFpNX01BQ19SRUdfUk9MTF9DQUxMX1RCTF9ILCAodTMyX3QpKChocFByaXYtPmNhbVJvbGxDYWxsVGFibGUgPj4gMzIpICYgMHhmZmZmZmZmZikpOworICAgICAgICB6ZkZsdXNoRGVsYXlXcml0ZShkZXYpOworICAgIH0KK30KKwordm9pZCB6ZkhwU2V0VFRTSUZTVGltZSh6ZGV2X3QqIGRldiwgdThfdCBzaWZzX3RpbWUpCit7CisgICAgdTMyX3QgcmVnX3ZhbHVlID0gMDsKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBzaWZzX3RpbWUgJj0gMHgzZjsKKyAgICByZWdfdmFsdWUgPSAweDE0NDAwYiB8ICgoKHUzMl90KXNpZnNfdGltZSk8PDI0KTsKKworICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgWk1fTUFDX1JFR19FSUZTX0FORF9TSUZTLCByZWdfdmFsdWUpOworICAgIHpmRmx1c2hEZWxheVdyaXRlKGRldik7Cit9CisKKy8qICMzIEVuYWJsZSBSSUZTIGZ1bmN0aW9uIGlmIHRoZSBSSUZTIHBhdHRlcm4gbWF0Y2hlZCAhICovCit2b2lkIHpmSHBFbmFibGVSaWZzKHpkZXZfdCogZGV2LCB1OF90IG1vZGUyNGcsIHU4X3QgbW9kZUh0LCB1OF90IG1vZGVIdDIwNDApCit7CisKKyAgICAvKiAjIEVuYWJsZSBSZXNldCBURE9NQUlOCisgICAgICogJHJkZGF0YSA9ICYkcGh5cmVnX3JlYWQoMHg5ODAwKyg3Mzg8PDIpKTsKKyAgICAgKiAkd3JkYXRhID0gJHJkZGF0YSB8ICgweDEgPDwgMjYpIHwgKDB4MSA8PCAyNyk7CisgICAgICogJiRwaHlyZWdfd3JpdGUoMHg5ODAwKyg3Mzg8PDIpLCAkd3JkYXRhKTsKKyAgICAgKi8KKyAgICByZWdfd3JpdGUgKDB4OTgwMCsoNzM4PDwyKSwgMHgwODAwMDAwMCB8ICgweDEgPDwgMjYpIHwgKDB4MSA8PCAyNykpOworICAgIC8vcmVnX3dyaXRlICgweDk4MDArKDczODw8MiksIDB4MDgwMDAwMDAgfCAoMHgxIDw8IDI2KSk7CisKKyAgICAvKiAjIHJlZyAxMjM6IGhlYXZ5IGNsaXAgZmFjdG9yLCB4ciAvIFJJRlMgc2VhcmNoIHBhcmFtZXRlcnMgKi8KKyAgICByZWdfd3JpdGUgKDB4OTllYywgMHgwY2M4MGNhYSk7CisKKyAgICAvKiAjIFJlZHVjZSBTZWFyY2ggU3RhcnQgRGVsYXkgZm9yIFJJRlMgICAgKi8KKyAgICBpZiAobW9kZUh0ID09IDEpIC8qICgkSFRfRU5BQkxFID09IDEpICovCisgICAgeworICAgICAgICBpZiAobW9kZUh0MjA0MCA9PSAweDEpIC8qICgkRFlOQU1JQ19IVDIwNDBfRU4gPT0gMHgxKSAqLworICAgICAgICB7CisgICAgICAgICAgICByZWdfd3JpdGUoMHg5ODAwKyg3MDw8MiksIDQwKTsvKjQwKi8KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHJlZ193cml0ZSgweDk4MDArKDcwPDwyKSwgMjApOworICAgICAgICAgICAgaWYobW9kZTI0ZyA9PSAweDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogJHJkZGF0YSA9ICYkcGh5cmVnX3JlYWQoMHg5ODAwKygyNDw8MikpOyMweDk4NjA7MHgxYzU4NjAKKyAgICAgICAgICAgICAgICAgKiR3cmRhdGEgPSAoJHJkZGF0YSAmIDB4ZmZmZmZmYzcpIHwgKDB4NCA8PCAzKTsKKyAgICAgICAgICAgICAgICAgKiAmJHBoeXJlZ193cml0ZSgweDk4MDArKDI0PDwyKSwgJHdyZGF0YSk7CisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgcmVnX3dyaXRlKDB4OTgwMCsoMjQ8PDIpLCAoMHgwMDA0ZGQxMCAmIDB4ZmZmZmZmYzcpIHwgKDB4NCA8PCAzKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobW9kZTI0ZyA9PSAweDEpCisgICAgeworICAgICAgICByZWdfd3JpdGUoMHg5ODUwLCAweGVjZThiNGU0KTsvKm9yZyovCisgICAgICAgIC8vcmVnX3dyaXRlKDB4OTg1MCwgMHhlY2U4YjRlMik7CisgICAgICAgIHJlZ193cml0ZSgweDk4NWMsIDB4MzEzYTVkNWUpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByZWdfd3JpdGUoMHg5ODUwLCAweGVkZThiNGU0KTsKKyAgICAgICAgcmVnX3dyaXRlKDB4OTg1YywgMHgzMTM5NjA1ZSk7CisgICAgfQorCisgICAgemZGbHVzaERlbGF5V3JpdGUoZGV2KTsKKworICAgIHJldHVybjsKK30KKworLyogIzQgRGlzYWJsZSBSSUZTIGZ1bmN0aW9uIGlmIHRoZSBSSUZTIHRpbWVyIGlzIHRpbWVvdXQgISAqLwordm9pZCB6ZkhwRGlzYWJsZVJpZnMoemRldl90KiBkZXYpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgLyogRGlzYWJsZSBSSUZTIGZ1bmN0aW9uIGlzIHRvIHN0b3JlIHRoZXNlIEhXIHJlZ2lzdGVyIGluaXRpYWwgdmFsdWUgd2hpbGUgdGhlIGRldmljZSBwbHVnLWluIGFuZAorICAgICAgIHJlLXdyaXRlIHRvIHRoZXNlIHJlZ2lzdGVyIGlmIHRoZSBSSUZTIGZ1bmN0aW9uIGlzIGRpc2FibGVkICAqLworCisgICAgLy8gcmVnIDogOTg1MAorICAgIHJlZ193cml0ZSgweDk4NTAsICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+aW5pdERlc2lyZWRTaWdTaXplKTsKKworICAgIC8vIHJlZyA6IDk4NWMKKyAgICByZWdfd3JpdGUoMHg5ODVjLCAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmluaXRBR0MpOworCisgICAgLy8gcmVnIDogOTg2MAorICAgIHJlZ193cml0ZSgweDk4MDArKDI0PDwyKSwgKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5pbml0QWdjQ29udHJvbCk7CisKKyAgICAvLyByZWcgOiA5OTE4CisgICAgcmVnX3dyaXRlKDB4OTgwMCsoNzA8PDIpLCAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmluaXRTZWFyY2hTdGFydERlbGF5KTsKKworICAgIC8vIHJlZyA6IDk5MWMKKyAgICByZWdfd3JpdGUgKDB4OTllYywgKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5pbml0UklGU1NlYXJjaFBhcmFtcyk7CisKKyAgICAvLyByZWcgOiBhMzg4CisgICAgcmVnX3dyaXRlICgweDk4MDArKDczODw8MiksICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+aW5pdEZhc3RDaGFubmVsQ2hhbmdlQ29udHJvbCk7CisKKyAgICB6ZkZsdXNoRGVsYXlXcml0ZShkZXYpOworCisgICAgcmV0dXJuOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvaGFsL2hwcmVnLmMgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy9oYWwvaHByZWcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zY2ZlYmE4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvaGFsL2hwcmVnLmMKQEAgLTAsMCArMSwyNDgxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDUgWnlEQVMgVGVjaG5vbG9neSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggQXRoZXJvcyBDb21tdW5pY2F0aW9ucyBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kdWxlIE5hbWUgOiBocHJlZy5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBBYnN0cmFjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFRoaXMgbW9kdWxlIGNvbnRhaW5zIFJlZ3VsYXRvcnkgVGFibGUgYW5kIHJlbGF0ZWQgZnVuY3Rpb24uICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBOT1RFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIE5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSAiLi4vODAyMTFjb3JlL2NwcmVjb21wLmgiCisjaW5jbHVkZSAiaHBhbmkuaCIKKyNpbmNsdWRlICJocHJlZy5oIgorI2luY2x1ZGUgImhwdXNiLmgiCisKKy8qIHVzZWQgdGhyb3VnaG91dCB0aGlzIGZpbGUuLi4gKi8KKyNkZWZpbmUJTihhKQkoc2l6ZW9mIChhKSAvIHNpemVvZiAoYVswXSkpCisKKyNkZWZpbmUgSEFMX01PREVfMTFBX1RVUkJPCUhBTF9NT0RFXzEwOEEKKyNkZWZpbmUgSEFMX01PREVfMTFHX1RVUkJPCUhBTF9NT0RFXzEwOEcKKworI2lmIDAKK2VudW0geworICAgIC8qIHRlc3QgZ3JvdXBzICovCisJRkNDCSAgICAgICA9IDB4MTAsCisJTUtLCSAgICAgICA9IDB4NDAsCisJRVRTSQkgICA9IDB4MzAsCisgICAgU0RfTk9fQ1RMICA9IDB4ZTAsCisJTk9fQ1RMCSAgID0gMHhmZiwKKyAgICAvKiB0ZXN0IG1vZGVzICovCisgICAgQ1RMX01PREVfTSA9IDB4MGYsCisgICAgQ1RMXzExQSAgICA9IDAsCisJQ1RMXzExQgkgICA9IDEsCisJQ1RMXzExRwkgICA9IDIsCisJQ1RMX1RVUkJPICA9IDMsCisJQ1RMXzEwOEcgICA9IDQsCisgICAgQ1RMXzJHSFQyMCA9IDUsCisgICAgQ1RMXzVHSFQyMCA9IDYsCisgICAgQ1RMXzJHSFQ0MCA9IDcsCisgICAgQ1RMXzVHSFQ0MCA9IDgKK307CisjZW5kaWYKKworLyoKKyAqIFRoZSBmb2xsb3dpbmcgYXJlIGZsYWdzIGZvciBkaWZmZXJlbnQgcmVxdWlyZW1lbnRzIHBlciByZWcgZG9tYWluLgorICogVGhlc2UgcmVxdWlyZW1lbnRzIGFyZSBlaXRoZXIgaW5oZXJldGVkIGZyb20gdGhlIHJlZyBkb21haW4gcGFpciBvcgorICogZnJvbSB0aGUgdW5pdGFyeSByZWcgZG9tYWluIGlmIHRoZSByZWcgZG9tYWluIHBhaXIgZmxhZ3MgdmFsdWUgaXMKKyAqIDAKKyAqLworCitlbnVtIHsKKwlOT19SRVEJCQk9IDB4MDAwMDAwMDAsCisJRElTQUxMT1dfQURIT0NfMTFBCT0gMHgwMDAwMDAwMSwKKwlESVNBTExPV19BREhPQ18xMUFfVFVSQgk9IDB4MDAwMDAwMDIsCisJTkVFRF9ORkMJCT0gMHgwMDAwMDAwNCwKKworCUFESE9DX1BFUl8xMUQJCT0gMHgwMDAwMDAwOCwgIC8qIFN0YXJ0IEFkLUhvYyBtb2RlICovCisJQURIT0NfTk9fMTFBCQk9IDB4MDAwMDAwMTAsCisKKwlQVUJMSUNfU0FGRVRZX0RPTUFJTgk9IDB4MDAwMDAwMjAsIAkvKiBwdWJsaWMgc2FmZXR5IGRvbWFpbiAqLworCUxJTUlUX0ZSQU1FXzRNUyAJPSAweDAwMDAwMDQwLCAJLyogNG1zZWMgbGltaXQgb24gdGhlIGZyYW1lIGxlbmd0aCAqLworfTsKKworI2RlZmluZSBNS0s1R0haX0ZMQUcxIChESVNBTExPV19BREhPQ18xMUFfVFVSQiB8IE5FRURfTkZDIHwgTElNSVRfRlJBTUVfNE1TKQorI2RlZmluZSBNS0s1R0haX0ZMQUcyIChESVNBTExPV19BREhPQ18xMUEgfCBESVNBTExPV19BREhPQ18xMUFfVFVSQiB8IE5FRURfTkZDfCBMSU1JVF9GUkFNRV80TVMpCisKK3R5cGVkZWYgZW51bSB7CisJREZTX1VOSU5JVF9ET01BSU4JPSAwLAkvKiBVbmluaXRpYWxpemVkIGRmcyBkb21haW4gKi8KKwlERlNfRkNDX0RPTUFJTgkJPSAxLAkvKiBGQ0MzIGRmcyBkb21haW4gKi8KKwlERlNfRVRTSV9ET01BSU4JCT0gMiwJLyogRVRTSSBkZnMgZG9tYWluICovCit9IEhBTF9ERlNfRE9NQUlOOworCisvKgorICogVXNlZCB0byBzZXQgdGhlIFJlZ0RvbWFpbiBiaXRtYXNrIHdoaWNoIGNob29zZXMgd2hpY2ggZnJlcXVlbmN5CisgKiBiYW5kIHNwZWNzIGFyZSB1c2VkLgorICovCisKKyNkZWZpbmUgQk1MRU4gMgkJLyogVXNlIDIgNjQgYml0IHVpbnQgZm9yIGNoYW5uZWwgYml0bWFzaworCQkJICAgTkI6IE11c3QgYWdyZWUgd2l0aCBtYWNybyBiZWxvdyAoQk0pICovCisjZGVmaW5lIEJNWkVSTyB7KHU2NF90KSAwLCAodTY0X3QpIDB9CS8qIEJNTEVOIHplcm9zICovCisKKyNpZiAwCisKKyNkZWZpbmUgQk0oX2ZhLCBfZmIsIF9mYywgX2ZkLCBfZmUsIF9mZiwgX2ZnLCBfZmgsIF9maSwgX2ZqLCBfZmssIF9mbCkgXAorICAgICAgeygoKChfZmEgPj0gMCkgJiYgKF9mYSA8IDY0KSkgPyAoKCh1NjRfdCkgMSkgPDwgX2ZhKSA6ICh1NjRfdCkgMCkgfCBcCisJKCgoX2ZiID49IDApICYmIChfZmIgPCA2NCkpID8gKCgodTY0X3QpIDEpIDw8IF9mYikgOiAodTY0X3QpIDApIHwgXAorCSgoKF9mYyA+PSAwKSAmJiAoX2ZjIDwgNjQpKSA/ICgoKHU2NF90KSAxKSA8PCBfZmMpIDogKHU2NF90KSAwKSB8IFwKKwkoKChfZmQgPj0gMCkgJiYgKF9mZCA8IDY0KSkgPyAoKCh1NjRfdCkgMSkgPDwgX2ZkKSA6ICh1NjRfdCkgMCkgfCBcCisJKCgoX2ZlID49IDApICYmIChfZmUgPCA2NCkpID8gKCgodTY0X3QpIDEpIDw8IF9mZSkgOiAodTY0X3QpIDApIHwgXAorCSgoKF9mZiA+PSAwKSAmJiAoX2ZmIDwgNjQpKSA/ICgoKHU2NF90KSAxKSA8PCBfZmYpIDogKHU2NF90KSAwKSB8IFwKKwkoKChfZmcgPj0gMCkgJiYgKF9mZyA8IDY0KSkgPyAoKCh1NjRfdCkgMSkgPDwgX2ZnKSA6ICh1NjRfdCkgMCkgfCBcCisJKCgoX2ZoID49IDApICYmIChfZmggPCA2NCkpID8gKCgodTY0X3QpIDEpIDw8IF9maCkgOiAodTY0X3QpIDApIHwgXAorCSgoKF9maSA+PSAwKSAmJiAoX2ZpIDwgNjQpKSA/ICgoKHU2NF90KSAxKSA8PCBfZmkpIDogKHU2NF90KSAwKSB8IFwKKwkoKChfZmogPj0gMCkgJiYgKF9maiA8IDY0KSkgPyAoKCh1NjRfdCkgMSkgPDwgX2ZqKSA6ICh1NjRfdCkgMCkgfCBcCisJKCgoX2ZrID49IDApICYmIChfZmsgPCA2NCkpID8gKCgodTY0X3QpIDEpIDw8IF9maykgOiAodTY0X3QpIDApIHwgXAorCSgoKF9mbCA+PSAwKSAmJiAoX2ZsIDwgNjQpKSA/ICgoKHU2NF90KSAxKSA8PCBfZmwpIDogKHU2NF90KSAwKSB8IFwKKwkgICAgICAgKCgoKF9mYSA+IDYzKSAmJiAoX2ZhIDwgMTI4KSkgPyAoKCh1NjRfdCkgMSkgPDwgKF9mYSAtIDY0KSkgOiAodTY0X3QpIDApIHwgXAorCQkoKChfZmIgPiA2MykgJiYgKF9mYiA8IDEyOCkpID8gKCgodTY0X3QpIDEpIDw8IChfZmIgLSA2NCkpIDogKHU2NF90KSAwKSB8IFwKKwkJKCgoX2ZjID4gNjMpICYmIChfZmMgPCAxMjgpKSA/ICgoKHU2NF90KSAxKSA8PCAoX2ZjIC0gNjQpKSA6ICh1NjRfdCkgMCkgfCBcCisJCSgoKF9mZCA+IDYzKSAmJiAoX2ZkIDwgMTI4KSkgPyAoKCh1NjRfdCkgMSkgPDwgKF9mZCAtIDY0KSkgOiAodTY0X3QpIDApIHwgXAorCQkoKChfZmUgPiA2MykgJiYgKF9mZSA8IDEyOCkpID8gKCgodTY0X3QpIDEpIDw8IChfZmUgLSA2NCkpIDogKHU2NF90KSAwKSB8IFwKKwkJKCgoX2ZmID4gNjMpICYmIChfZmYgPCAxMjgpKSA/ICgoKHU2NF90KSAxKSA8PCAoX2ZmIC0gNjQpKSA6ICh1NjRfdCkgMCkgfCBcCisJCSgoKF9mZyA+IDYzKSAmJiAoX2ZnIDwgMTI4KSkgPyAoKCh1NjRfdCkgMSkgPDwgKF9mZyAtIDY0KSkgOiAodTY0X3QpIDApIHwgXAorCQkoKChfZmggPiA2MykgJiYgKF9maCA8IDEyOCkpID8gKCgodTY0X3QpIDEpIDw8IChfZmggLSA2NCkpIDogKHU2NF90KSAwKSB8IFwKKwkJKCgoX2ZpID4gNjMpICYmIChfZmkgPCAxMjgpKSA/ICgoKHU2NF90KSAxKSA8PCAoX2ZpIC0gNjQpKSA6ICh1NjRfdCkgMCkgfCBcCisJCSgoKF9maiA+IDYzKSAmJiAoX2ZqIDwgMTI4KSkgPyAoKCh1NjRfdCkgMSkgPDwgKF9maiAtIDY0KSkgOiAodTY0X3QpIDApIHwgXAorCQkoKChfZmsgPiA2MykgJiYgKF9mayA8IDEyOCkpID8gKCgodTY0X3QpIDEpIDw8IChfZmsgLSA2NCkpIDogKHU2NF90KSAwKSB8IFwKKwkJKCgoX2ZsID4gNjMpICYmIChfZmwgPCAxMjgpKSA/ICgoKHU2NF90KSAxKSA8PCAoX2ZsIC0gNjQpKSA6ICh1NjRfdCkgMCkpKX0KKworI2Vsc2UKKworI2RlZmluZSBCTShfZmEsIF9mYiwgX2ZjLCBfZmQsIF9mZSwgX2ZmLCBfZmcsIF9maCwgX2ZpLCBfZmosIF9maywgX2ZsKSBcCisgICAgICB7KCgoKF9mYSA+PSAwKSAmJiAoX2ZhIDwgNjQpKSA/ICgoKHU2NF90KSAxKSA8PCAoX2ZhJjB4M2YpKSA6ICh1NjRfdCkgMCkgfCBcCisJKCgoX2ZiID49IDApICYmIChfZmIgPCA2NCkpID8gKCgodTY0X3QpIDEpIDw8IChfZmImMHgzZikpIDogKHU2NF90KSAwKSB8IFwKKwkoKChfZmMgPj0gMCkgJiYgKF9mYyA8IDY0KSkgPyAoKCh1NjRfdCkgMSkgPDwgKF9mYyYweDNmKSkgOiAodTY0X3QpIDApIHwgXAorCSgoKF9mZCA+PSAwKSAmJiAoX2ZkIDwgNjQpKSA/ICgoKHU2NF90KSAxKSA8PCAoX2ZkJjB4M2YpKSA6ICh1NjRfdCkgMCkgfCBcCisJKCgoX2ZlID49IDApICYmIChfZmUgPCA2NCkpID8gKCgodTY0X3QpIDEpIDw8IChfZmUmMHgzZikpIDogKHU2NF90KSAwKSB8IFwKKwkoKChfZmYgPj0gMCkgJiYgKF9mZiA8IDY0KSkgPyAoKCh1NjRfdCkgMSkgPDwgKF9mZiYweDNmKSkgOiAodTY0X3QpIDApIHwgXAorCSgoKF9mZyA+PSAwKSAmJiAoX2ZnIDwgNjQpKSA/ICgoKHU2NF90KSAxKSA8PCAoX2ZnJjB4M2YpKSA6ICh1NjRfdCkgMCkgfCBcCisJKCgoX2ZoID49IDApICYmIChfZmggPCA2NCkpID8gKCgodTY0X3QpIDEpIDw8IChfZmgmMHgzZikpIDogKHU2NF90KSAwKSB8IFwKKwkoKChfZmkgPj0gMCkgJiYgKF9maSA8IDY0KSkgPyAoKCh1NjRfdCkgMSkgPDwgKF9maSYweDNmKSkgOiAodTY0X3QpIDApIHwgXAorCSgoKF9maiA+PSAwKSAmJiAoX2ZqIDwgNjQpKSA/ICgoKHU2NF90KSAxKSA8PCAoX2ZqJjB4M2YpKSA6ICh1NjRfdCkgMCkgfCBcCisJKCgoX2ZrID49IDApICYmIChfZmsgPCA2NCkpID8gKCgodTY0X3QpIDEpIDw8IChfZmsmMHgzZikpIDogKHU2NF90KSAwKSB8IFwKKwkoKChfZmwgPj0gMCkgJiYgKF9mbCA8IDY0KSkgPyAoKCh1NjRfdCkgMSkgPDwgKF9mbCYweDNmKSkgOiAodTY0X3QpIDApIHwgXAorCSAgICAgICAoKCgoX2ZhID4gNjMpICYmIChfZmEgPCAxMjgpKSA/ICgoKHU2NF90KSAxKSA8PCAoKF9mYSAtIDY0KSYweDNmKSkgOiAodTY0X3QpIDApIHwgXAorCQkoKChfZmIgPiA2MykgJiYgKF9mYiA8IDEyOCkpID8gKCgodTY0X3QpIDEpIDw8ICgoX2ZiIC0gNjQpJjB4M2YpKSA6ICh1NjRfdCkgMCkgfCBcCisJCSgoKF9mYyA+IDYzKSAmJiAoX2ZjIDwgMTI4KSkgPyAoKCh1NjRfdCkgMSkgPDwgKChfZmMgLSA2NCkmMHgzZikpIDogKHU2NF90KSAwKSB8IFwKKwkJKCgoX2ZkID4gNjMpICYmIChfZmQgPCAxMjgpKSA/ICgoKHU2NF90KSAxKSA8PCAoKF9mZCAtIDY0KSYweDNmKSkgOiAodTY0X3QpIDApIHwgXAorCQkoKChfZmUgPiA2MykgJiYgKF9mZSA8IDEyOCkpID8gKCgodTY0X3QpIDEpIDw8ICgoX2ZlIC0gNjQpJjB4M2YpKSA6ICh1NjRfdCkgMCkgfCBcCisJCSgoKF9mZiA+IDYzKSAmJiAoX2ZmIDwgMTI4KSkgPyAoKCh1NjRfdCkgMSkgPDwgKChfZmYgLSA2NCkmMHgzZikpIDogKHU2NF90KSAwKSB8IFwKKwkJKCgoX2ZnID4gNjMpICYmIChfZmcgPCAxMjgpKSA/ICgoKHU2NF90KSAxKSA8PCAoKF9mZyAtIDY0KSYweDNmKSkgOiAodTY0X3QpIDApIHwgXAorCQkoKChfZmggPiA2MykgJiYgKF9maCA8IDEyOCkpID8gKCgodTY0X3QpIDEpIDw8ICgoX2ZoIC0gNjQpJjB4M2YpKSA6ICh1NjRfdCkgMCkgfCBcCisJCSgoKF9maSA+IDYzKSAmJiAoX2ZpIDwgMTI4KSkgPyAoKCh1NjRfdCkgMSkgPDwgKChfZmkgLSA2NCkmMHgzZikpIDogKHU2NF90KSAwKSB8IFwKKwkJKCgoX2ZqID4gNjMpICYmIChfZmogPCAxMjgpKSA/ICgoKHU2NF90KSAxKSA8PCAoKF9maiAtIDY0KSYweDNmKSkgOiAodTY0X3QpIDApIHwgXAorCQkoKChfZmsgPiA2MykgJiYgKF9mayA8IDEyOCkpID8gKCgodTY0X3QpIDEpIDw8ICgoX2ZrIC0gNjQpJjB4M2YpKSA6ICh1NjRfdCkgMCkgfCBcCisJCSgoKF9mbCA+IDYzKSAmJiAoX2ZsIDwgMTI4KSkgPyAoKCh1NjRfdCkgMSkgPDwgKChfZmwgLSA2NCkmMHgzZikpIDogKHU2NF90KSAwKSkpfQorCisjZW5kaWYKKworLyogTWFzayB0byBjaGVjayB3aGV0aGVyIGEgZG9tYWluIGlzIGEgbXVsdGlkb21haW4gb3IgYSBzaW5nbGUKKyAgIGRvbWFpbiAqLworCisjZGVmaW5lIE1VTFRJX0RPTUFJTl9NQVNLIDB4RkYwMAorCisKKy8qCisgKiBUaGUgZm9sbG93aW5nIGRlc2NyaWJlIHRoZSBiaXQgbWFza3MgZm9yIGRpZmZlcmVudCBwYXNzaXZlIHNjYW4KKyAqIGNhcGFiaWxpdHkvcmVxdWlyZW1lbnRzIHBlciByZWdkb21haW4uCisgKi8KKyNkZWZpbmUJTk9fUFNDQU4JMHgwVUxMCisjZGVmaW5lCVBTQ0FOX0ZDQwkweDAwMDAwMDAwMDAwMDAwMDFVTEwKKyNkZWZpbmUJUFNDQU5fRkNDX1QJMHgwMDAwMDAwMDAwMDAwMDAyVUxMCisjZGVmaW5lCVBTQ0FOX0VUU0kJMHgwMDAwMDAwMDAwMDAwMDA0VUxMCisjZGVmaW5lCVBTQ0FOX01LSzEJMHgwMDAwMDAwMDAwMDAwMDA4VUxMCisjZGVmaW5lCVBTQ0FOX01LSzIJMHgwMDAwMDAwMDAwMDAwMDEwVUxMCisjZGVmaW5lCVBTQ0FOX01LS0EJMHgwMDAwMDAwMDAwMDAwMDIwVUxMCisjZGVmaW5lCVBTQ0FOX01LS0FfRwkweDAwMDAwMDAwMDAwMDAwNDBVTEwKKyNkZWZpbmUJUFNDQU5fRVRTSUEJMHgwMDAwMDAwMDAwMDAwMDgwVUxMCisjZGVmaW5lCVBTQ0FOX0VUU0lCCTB4MDAwMDAwMDAwMDAwMDEwMFVMTAorI2RlZmluZQlQU0NBTl9FVFNJQwkweDAwMDAwMDAwMDAwMDAyMDBVTEwKKyNkZWZpbmUJUFNDQU5fV1dSCTB4MDAwMDAwMDAwMDAwMDQwMFVMTAorI2RlZmluZQlQU0NBTl9NS0tBMQkweDAwMDAwMDAwMDAwMDA4MDBVTEwKKyNkZWZpbmUJUFNDQU5fTUtLQTFfRwkweDAwMDAwMDAwMDAwMDEwMDBVTEwKKyNkZWZpbmUJUFNDQU5fTUtLQTIJMHgwMDAwMDAwMDAwMDAyMDAwVUxMCisjZGVmaW5lCVBTQ0FOX01LS0EyX0cJMHgwMDAwMDAwMDAwMDA0MDAwVUxMCisjZGVmaW5lCVBTQ0FOX01LSzMJMHgwMDAwMDAwMDAwMDA4MDAwVUxMCisjZGVmaW5lCVBTQ0FOX0RFRkVSCTB4N0ZGRkZGRkZGRkZGRkZGRlVMTAorI2RlZmluZQlJU19FQ01fQ0hBTgkweDgwMDAwMDAwMDAwMDAwMDBVTEwKKworLyoKKyAqIFRIRSBmb2xsb3dpbmcgdGFibGUgaXMgdGhlIG1hcHBpbmcgb2YgcmVnZG9tYWluIHBhaXJzIHNwZWNpZmllZCBieQorICogYW4gOCBiaXQgcmVnZG9tYWluIHZhbHVlIHRvIHRoZSBpbmRpdmlkdWFsIHVuaXRhcnkgcmVnIGRvbWFpbnMKKyAqLworCit0eXBlZGVmIHN0cnVjdCByZWdfZG1uX3BhaXJfbWFwcGluZyB7CisJdTE2X3QgcmVnRG1uRW51bTsJLyogMTYgYml0IHJlZyBkb21haW4gcGFpciAqLworCXUxNl90IHJlZ0RtbjVHSHo7CS8qIDVHSHogcmVnIGRvbWFpbiAqLworCXUxNl90IHJlZ0RtbjJHSHo7CS8qIDJHSHogcmVnIGRvbWFpbiAqLworCXUzMl90IGZsYWdzNUdIejsJCS8qIFJlcXVpcmVtZW50cyBmbGFncyAoQWRIb2MKKwkJCQkJICAgZGlzYWxsb3csIG5vaXNlIGZsb29yIGNhbCBuZWVkZWQsCisJCQkJCSAgIGV0YykgKi8KKwl1MzJfdCBmbGFnczJHSHo7CQkvKiBSZXF1aXJlbWVudHMgZmxhZ3MgKEFkSG9jCisJCQkJCSAgIGRpc2FsbG93LCBub2lzZSBmbG9vciBjYWwgbmVlZGVkLAorCQkJCQkgICBldGMpICovCisJdTY0X3QgcHNjYW5NYXNrOwkJLyogUGFzc2l2ZSBTY2FuIGZsYWdzIHdoaWNoCisJCQkJCSAgIGNhbiBvdmVycmlkZSB1bml0YXJ5IGRvbWFpbgorCQkJCQkgICBwYXNzaXZlIHNjYW4gZmxhZ3MuICBUaGlzCisJCQkJCSAgIHZhbHVlIGlzIHVzZWQgYXMgYSBtYXNrIG9uCisJCQkJCSAgIHRoZSB1bml0YXJ5IGZsYWdzKi8KKwl1MTZfdCBzaW5nbGVDQzsJCS8qIENvdW50cnkgY29kZSBvZiBzaW5nbGUgY291bnRyeSBpZgorCQkJCQkgICBhIG9uZS1vbi1vbmUgbWFwcGluZyBleGlzdHMgKi8KK30gIFJFR19ETU5fUEFJUl9NQVBQSU5HOworCitzdGF0aWMgUkVHX0RNTl9QQUlSX01BUFBJTkcgcmVnRG9tYWluUGFpcnNbXSA9IHsKKwl7Tk9fRU5VTVJELAkgICAgRkNDMiwJREVCVUdfUkVHX0RNTiwgIE5PX1JFUSwgTk9fUkVRLCBQU0NBTl9ERUZFUiwgMCB9LAorCXtOVUxMMV9XT1JMRCwJTlVMTDEsCQlXT1JMRCwJCU5PX1JFUSwgTk9fUkVRLCBQU0NBTl9ERUZFUiwgMCB9LAorCXtOVUxMMV9FVFNJQiwJTlVMTDEsCQlFVFNJQiwJCU5PX1JFUSwgTk9fUkVRLCBQU0NBTl9ERUZFUiwgMCB9LAorCXtOVUxMMV9FVFNJQywJTlVMTDEsCQlFVFNJQywJCU5PX1JFUSwgTk9fUkVRLCBQU0NBTl9ERUZFUiwgMCB9LAorCisJe0ZDQzJfRkNDQSwgICAgIEZDQzIsCQlGQ0NBLAkJTk9fUkVRLCBOT19SRVEsIFBTQ0FOX0RFRkVSLCAwIH0sCisJe0ZDQzJfV09STEQsICAgIEZDQzIsCQlXT1JMRCwJCU5PX1JFUSwgTk9fUkVRLCBQU0NBTl9ERUZFUiwgMCB9LAorCXtGQ0MyX0VUU0lDLAlGQ0MyLAkJRVRTSUMsCQlOT19SRVEsIE5PX1JFUSwgUFNDQU5fREVGRVIsIDAgfSwKKwl7RkNDM19GQ0NBLCAgICAgRkNDMywJCUZDQ0EsCQlOT19SRVEsIE5PX1JFUSwgUFNDQU5fREVGRVIsIDAgfSwKKwl7RkNDM19XT1JMRCwgICAgRkNDMywJCVdPUkxELAkJTk9fUkVRLCBOT19SRVEsIFBTQ0FOX0RFRkVSLCAwIH0sCisJe0ZDQzRfRkNDQSwgICAgIEZDQzQsCQlGQ0NBLAkJRElTQUxMT1dfQURIT0NfMTFBIHwgRElTQUxMT1dfQURIT0NfMTFBX1RVUkIsIE5PX1JFUSwgUFNDQU5fREVGRVIsIDAgfSwKKwl7RkNDNV9GQ0NBLCAgICAgRkNDNSwJCUZDQ0EsCQlESVNBTExPV19BREhPQ18xMUEgfCBESVNBTExPV19BREhPQ18xMUFfVFVSQiwgTk9fUkVRLCBQU0NBTl9ERUZFUiwgMCB9LAorCXtGQ0M2X0ZDQ0EsICAgICBGQ0M2LAkJRkNDQSwJCU5PX1JFUSwgTk9fUkVRLCBQU0NBTl9ERUZFUiwgMCB9LAorCXtGQ0M2X1dPUkxELCAgICBGQ0M2LAkJV09STEQsCQlOT19SRVEsIE5PX1JFUSwgUFNDQU5fREVGRVIsIDAgfSwKKworCXtFVFNJMV9XT1JMRCwJRVRTSTEsCQlXT1JMRCwJCURJU0FMTE9XX0FESE9DXzExQSB8IERJU0FMTE9XX0FESE9DXzExQV9UVVJCLCBOT19SRVEsIFBTQ0FOX0RFRkVSLCAwIH0sCisJe0VUU0kyX1dPUkxELAlFVFNJMiwJCVdPUkxELAkJRElTQUxMT1dfQURIT0NfMTFBIHwgRElTQUxMT1dfQURIT0NfMTFBX1RVUkIsIE5PX1JFUSwgUFNDQU5fREVGRVIsIDAgfSwKKwl7RVRTSTNfV09STEQsCUVUU0kzLAkJV09STEQsCQlESVNBTExPV19BREhPQ18xMUEgfCBESVNBTExPV19BREhPQ18xMUFfVFVSQiwgTk9fUkVRLCBQU0NBTl9ERUZFUiwgMCB9LAorCXtFVFNJNF9XT1JMRCwJRVRTSTQsCQlXT1JMRCwJCURJU0FMTE9XX0FESE9DXzExQSB8IERJU0FMTE9XX0FESE9DXzExQV9UVVJCLCBOT19SRVEsIFBTQ0FOX0RFRkVSLCAwIH0sCisJe0VUU0k1X1dPUkxELAlFVFNJNSwJCVdPUkxELAkJRElTQUxMT1dfQURIT0NfMTFBIHwgRElTQUxMT1dfQURIT0NfMTFBX1RVUkIsIE5PX1JFUSwgUFNDQU5fREVGRVIsIDAgfSwKKwl7RVRTSTZfV09STEQsCUVUU0k2LAkJV09STEQsCQlESVNBTExPV19BREhPQ18xMUEgfCBESVNBTExPV19BREhPQ18xMUFfVFVSQiwgTk9fUkVRLCBQU0NBTl9ERUZFUiwgMCB9LAorCisJe0VUU0kzX0VUU0lBLAlFVFNJMywJCVdPUkxELAkJRElTQUxMT1dfQURIT0NfMTFBIHwgRElTQUxMT1dfQURIT0NfMTFBX1RVUkIsIE5PX1JFUSwgUFNDQU5fREVGRVIsIDAgfSwKKwl7RlJBTkNFX1JFUywJRVRTSTMsCQlXT1JMRCwJCU5PX1JFUSwgTk9fUkVRLCBQU0NBTl9ERUZFUiwgMCB9LAorCisJe0ZDQzFfV09STEQsCUZDQzEsCQlXT1JMRCwJCU5PX1JFUSwgTk9fUkVRLCBQU0NBTl9ERUZFUiwgMCB9LAorCXtGQ0MxX0ZDQ0EsICAgICBGQ0MxLAkJRkNDQSwJCU5PX1JFUSwgTk9fUkVRLCBQU0NBTl9ERUZFUiwgMCB9LAorCXtBUEwxX1dPUkxELAlBUEwxLAkJV09STEQsCQlOT19SRVEsIE5PX1JFUSwgUFNDQU5fREVGRVIsIDAgfSwKKwl7QVBMMl9XT1JMRCwJQVBMMiwJCVdPUkxELAkJTk9fUkVRLCBOT19SRVEsIFBTQ0FOX0RFRkVSLCAwIH0sCisJe0FQTDNfV09STEQsCUFQTDMsCQlXT1JMRCwJCU5PX1JFUSwgTk9fUkVRLCBQU0NBTl9ERUZFUiwgMCB9LAorCXtBUEw0X1dPUkxELAlBUEw0LAkJV09STEQsCQlOT19SRVEsIE5PX1JFUSwgUFNDQU5fREVGRVIsIDAgfSwKKwl7QVBMNV9XT1JMRCwJQVBMNSwJCVdPUkxELAkJTk9fUkVRLCBOT19SRVEsIFBTQ0FOX0RFRkVSLCAwIH0sCisJe0FQTDZfV09STEQsCUFQTDYsCQlXT1JMRCwJCU5PX1JFUSwgTk9fUkVRLCBQU0NBTl9ERUZFUiwgMCB9LAorCXtBUEw4X1dPUkxELAlBUEw4LAkJV09STEQsCQlOT19SRVEsIE5PX1JFUSwgUFNDQU5fREVGRVIsIDAgfSwKKwl7QVBMOV9XT1JMRCwJQVBMOSwJCVdPUkxELAkJTk9fUkVRLCBOT19SRVEsIFBTQ0FOX0RFRkVSLCAwIH0sCisKKwl7QVBMM19GQ0NBLCAgICAgQVBMMywJCUZDQ0EsCQlOT19SRVEsIE5PX1JFUSwgUFNDQU5fREVGRVIsIDAgfSwKKwl7QVBMMV9FVFNJQywJQVBMMSwJCUVUU0lDLAkJTk9fUkVRLCBOT19SRVEsIFBTQ0FOX0RFRkVSLCAwIH0sCisJe0FQTDJfRVRTSUMsCUFQTDIsCQlFVFNJQywJCU5PX1JFUSwgTk9fUkVRLCBQU0NBTl9ERUZFUiwgMCB9LAorCXtBUEwyX0ZDQ0EsCQlBUEwyLAkJRkNDQSwJCU5PX1JFUSwgTk9fUkVRLCBQU0NBTl9ERUZFUiwgMCB9LAorCXtBUEwyX0FQTEQsICAgICBBUEwyLAkJQVBMRCwJCU5PX1JFUSwgTk9fUkVRLCBQU0NBTl9ERUZFUiwgMH0sCisJe0FQTDdfRkNDQSwJCUFQTDcsCQlGQ0NBLAkJTk9fUkVRLCBOT19SRVEsIFBTQ0FOX0RFRkVSLCAwIH0sCisKKwl7TUtLMV9NS0tBLCAgICAgTUtLMSwJCU1LS0EsCQlNS0s1R0haX0ZMQUcxLCBORUVEX05GQywgUFNDQU5fTUtLMSB8IFBTQ0FOX01LS0EsIENUUllfSkFQQU4gfSwKKwl7TUtLMV9NS0tCLCAgICAgTUtLMSwJCU1LS0EsCQlNS0s1R0haX0ZMQUcyLCBORUVEX05GQywgUFNDQU5fTUtLMSB8IFBTQ0FOX01LS0EgfCBQU0NBTl9NS0tBX0csIENUUllfSkFQQU4xIH0sCisJe01LSzFfRkNDQSwgICAgIE1LSzEsCQlGQ0NBLAkJTUtLNUdIWl9GTEFHMSwgTkVFRF9ORkMsIFBTQ0FOX01LSzEsIENUUllfSkFQQU4yIH0sCisJe01LSzFfTUtLQTEsICAgIE1LSzEsCQlNS0tBLAkJTUtLNUdIWl9GTEFHMSwgTkVFRF9ORkMsIFBTQ0FOX01LSzEgfCBQU0NBTl9NS0tBMSB8IFBTQ0FOX01LS0ExX0csIENUUllfSkFQQU40IH0sCisJe01LSzFfTUtLQTIsICAgIE1LSzEsCQlNS0tBLAkJTUtLNUdIWl9GTEFHMSwgTkVFRF9ORkMsIFBTQ0FOX01LSzEgfCBQU0NBTl9NS0tBMiB8IFBTQ0FOX01LS0EyX0csIENUUllfSkFQQU41IH0sCisJe01LSzFfTUtLQywgICAgIE1LSzEsCQlNS0tDLAkJTUtLNUdIWl9GTEFHMSwgTkVFRF9ORkMsIFBTQ0FOX01LSzEsIENUUllfSkFQQU42IH0sCisKKwkvKiBNS0syICovCisJe01LSzJfTUtLQSwgICAgIE1LSzIsCQlNS0tBLAkJTUtLNUdIWl9GTEFHMiwgTkVFRF9ORkMsIFBTQ0FOX01LSzIgfCBQU0NBTl9NS0tBIHwgUFNDQU5fTUtLQV9HLCBDVFJZX0pBUEFOMyB9LAorCisJLyogTUtLMyAqLworCXtNS0szX01LS0EsICAgICBNS0szLAkJTUtLQSwJCU1LSzVHSFpfRkxBRzEsIE5FRURfTkZDLCBOT19QU0NBTiwgQ1RSWV9KQVBBTjI1IH0sCisJe01LSzNfTUtLQiwgICAgIE1LSzMsCQlNS0tBLAkJTUtLNUdIWl9GTEFHMiwgTkVFRF9ORkMsIFBTQ0FOX01LS0EgfCBQU0NBTl9NS0tBX0csIENUUllfSkFQQU43IH0sCisJe01LSzNfTUtLQTEsICAgIE1LSzMsCQlNS0tBLAkJTUtLNUdIWl9GTEFHMSwgTkVFRF9ORkMsIFBTQ0FOX01LS0ExIHwgUFNDQU5fTUtLQTFfRywgQ1RSWV9KQVBBTjI2IH0sCisJe01LSzNfTUtLQTIsICAgIE1LSzMsCQlNS0tBLAkJTUtLNUdIWl9GTEFHMSwgTkVFRF9ORkMsIFBTQ0FOX01LS0EyIHwgUFNDQU5fTUtLQTJfRywgQ1RSWV9KQVBBTjggfSwKKwl7TUtLM19NS0tDLCAgICAgTUtLMywJCU1LS0MsCQlNS0s1R0haX0ZMQUcxLCBORUVEX05GQywgTk9fUFNDQU4sIENUUllfSkFQQU45IH0sCisJe01LSzNfRkNDQSwgICAgIE1LSzMsCQlGQ0NBLAkJTUtLNUdIWl9GTEFHMSwgTkVFRF9ORkMsIE5PX1BTQ0FOLCBDVFJZX0pBUEFOMjcgfSwKKworCS8qIE1LSzQgKi8KKwl7TUtLNF9NS0tCLCAgICAgTUtLNCwJCU1LS0EsCQlNS0s1R0haX0ZMQUcyLCBORUVEX05GQywgUFNDQU5fTUtLMyB8IFBTQ0FOX01LS0EgfCBQU0NBTl9NS0tBX0csIENUUllfSkFQQU4xMCB9LAorCXtNS0s0X01LS0ExLCAgICBNS0s0LAkJTUtLQSwJCU1LSzVHSFpfRkxBRzEsIE5FRURfTkZDLCBQU0NBTl9NS0szIHwgUFNDQU5fTUtLQTEgfCBQU0NBTl9NS0tBMV9HLCBDVFJZX0pBUEFOMjggfSwKKwl7TUtLNF9NS0tBMiwgICAgTUtLNCwJCU1LS0EsCQlNS0s1R0haX0ZMQUcxLCBORUVEX05GQywgUFNDQU5fTUtLMyB8UFNDQU5fTUtLQTIgfCBQU0NBTl9NS0tBMl9HLCBDVFJZX0pBUEFOMTEgfSwKKwl7TUtLNF9NS0tDLCAgICAgTUtLNCwJCU1LS0MsCQlNS0s1R0haX0ZMQUcxLCBORUVEX05GQywgUFNDQU5fTUtLMywgQ1RSWV9KQVBBTjEyIH0sCisJe01LSzRfRkNDQSwgICAgIE1LSzQsCQlGQ0NBLAkJTUtLNUdIWl9GTEFHMSwgTkVFRF9ORkMsIE5PX1BTQ0FOLCBDVFJZX0pBUEFOMjkgfSwKKwl7TUtLNF9NS0tBLCAgICAgTUtLNCwJCU1LS0EsCQlNS0s1R0haX0ZMQUcxLCBORUVEX05GQywgUFNDQU5fTUtLMyB8IFBTQ0FOX01LS0EsIENUUllfSkFQQU4zNiB9LAorCisJLyogTUtLNSAqLworCXtNS0s1X01LS0IsICAgICBNS0s1LAkJTUtLQSwJCU1LSzVHSFpfRkxBRzIsIE5FRURfTkZDLCBQU0NBTl9NS0szIHwgUFNDQU5fTUtLQSB8IFBTQ0FOX01LS0FfRywgQ1RSWV9KQVBBTjEzIH0sCisJe01LSzVfTUtLQTIsICAgIE1LSzUsCQlNS0tBLAkJTUtLNUdIWl9GTEFHMSwgTkVFRF9ORkMsIFBTQ0FOX01LSzMgfCBQU0NBTl9NS0tBMiB8IFBTQ0FOX01LS0EyX0csIENUUllfSkFQQU4xNCB9LAorCXtNS0s1X01LS0MsICAgICBNS0s1LAkJTUtLQywJCU1LSzVHSFpfRkxBRzEsIE5FRURfTkZDLCBQU0NBTl9NS0szLCBDVFJZX0pBUEFOMTUgfSwKKworCS8qIE1LSzYgKi8KKwl7TUtLNl9NS0tCLCAgICAgTUtLNiwJCU1LS0EsCQlNS0s1R0haX0ZMQUcyLCBORUVEX05GQywgUFNDQU5fTUtLMSB8IFBTQ0FOX01LS0EgfCBQU0NBTl9NS0tBX0csIENUUllfSkFQQU4xNiB9LAorCXtNS0s2X01LS0EyLCAgICBNS0s2LAkJTUtLQSwJCU1LSzVHSFpfRkxBRzEsIE5FRURfTkZDLCBQU0NBTl9NS0sxIHwgUFNDQU5fTUtLQTIgfCBQU0NBTl9NS0tBMl9HLCBDVFJZX0pBUEFOMTcgfSwKKwl7TUtLNl9NS0tDLCAgICAgTUtLNiwJCU1LS0MsCQlNS0s1R0haX0ZMQUcxLCBORUVEX05GQywgUFNDQU5fTUtLMSwgQ1RSWV9KQVBBTjE4IH0sCisJe01LSzZfTUtLQTEsICAgIE1LSzYsCQlNS0tBLAkJTUtLNUdIWl9GTEFHMSwgTkVFRF9ORkMsIFBTQ0FOX01LS0ExIHwgUFNDQU5fTUtLQTFfRywgQ1RSWV9KQVBBTjMwIH0sCisJe01LSzZfRkNDQSwgICAgIE1LSzYsCQlGQ0NBLAkJTUtLNUdIWl9GTEFHMSwgTkVFRF9ORkMsIE5PX1BTQ0FOLCBDVFJZX0pBUEFOMzEgfSwKKworCS8qIE1LSzcgKi8KKwl7TUtLN19NS0tCLCAgICAgTUtLNywJCU1LS0EsCQlNS0s1R0haX0ZMQUcyLCBORUVEX05GQywgUFNDQU5fTUtLMSB8IFBTQ0FOX01LSzMgfCBQU0NBTl9NS0tBIHwgUFNDQU5fTUtLQV9HLCBDVFJZX0pBUEFOMTkgfSwKKwl7TUtLN19NS0tBLCAgICAgTUtLNywJCU1LS0EsCQlNS0s1R0haX0ZMQUcxLCBORUVEX05GQywgUFNDQU5fTUtLMSB8IFBTQ0FOX01LSzMgfCBQU0NBTl9NS0tBMiB8IFBTQ0FOX01LS0EyX0csIENUUllfSkFQQU4yMCB9LAorCXtNS0s3X01LS0MsICAgICBNS0s3LAkJTUtLQywJCU1LSzVHSFpfRkxBRzEsIE5FRURfTkZDLCBQU0NBTl9NS0sxIHwgUFNDQU5fTUtLMywgQ1RSWV9KQVBBTjIxIH0sCisJe01LSzdfTUtLQTEsICAgIE1LSzcsCQlNS0tBLAkJTUtLNUdIWl9GTEFHMSwgTkVFRF9ORkMsIFBTQ0FOX01LS0ExIHwgUFNDQU5fTUtLQTFfRywgQ1RSWV9KQVBBTjMyIH0sCisJe01LSzdfRkNDQSwgICAgIE1LSzcsCQlGQ0NBLAkJTUtLNUdIWl9GTEFHMSwgTkVFRF9ORkMsIE5PX1BTQ0FOLCBDVFJZX0pBUEFOMzMgfSwKKworCS8qIE1LSzggKi8KKwl7TUtLOF9NS0tCLCAgICAgTUtLOCwJCU1LS0EsCQlNS0s1R0haX0ZMQUcyLCBORUVEX05GQywgUFNDQU5fTUtLMSB8IFBTQ0FOX01LSzMgfCBQU0NBTl9NS0tBIHwgUFNDQU5fTUtLQV9HLCBDVFJZX0pBUEFOMjIgfSwKKwl7TUtLOF9NS0tBMiwgICAgTUtLOCwJCU1LS0EsCQlNS0s1R0haX0ZMQUcxLCBORUVEX05GQywgUFNDQU5fTUtLMSB8IFBTQ0FOX01LSzMgfCBQU0NBTl9NS0tBMiB8IFBTQ0FOX01LS0EyX0csIENUUllfSkFQQU4yMyB9LAorCXtNS0s4X01LS0MsICAgICBNS0s4LAkJTUtLQywJCU1LSzVHSFpfRkxBRzEsIE5FRURfTkZDLCBQU0NBTl9NS0sxIHwgUFNDQU5fTUtLMyAsIENUUllfSkFQQU4yNCB9LAorCisgICAJLyogTUtLOSAqLworCXtNS0s5X01LS0EsICAgICBNS0s5LAkJTUtLQSwJCU1LSzVHSFpfRkxBRzEsIE5FRURfTkZDLCBOT19QU0NBTiwgQ1RSWV9KQVBBTjM0IH0sCisJe01LSzlfRkNDQSwgICAgIE1LSzksCQlGQ0NBLAkJTUtLNUdIWl9GTEFHMSwgTkVFRF9ORkMsIE5PX1BTQ0FOLCBDVFJZX0pBUEFOMzcgfSwKKwl7TUtLOV9NS0tBMSwgICAgTUtLOSwJCU1LS0EsCQlNS0s1R0haX0ZMQUcxLCBORUVEX05GQywgUFNDQU5fTUtLQTEgfCBQU0NBTl9NS0tBMV9HLCBDVFJZX0pBUEFOMzggfSwKKwl7TUtLOV9NS0tDLCAgICAgTUtLOSwJCU1LS0MsCQlNS0s1R0haX0ZMQUcxLCBORUVEX05GQywgTk9fUFNDQU4sIENUUllfSkFQQU4zOSB9LAorCXtNS0s5X01LS0EyLAlNS0s5LAkJTUtLQSwJCU1LSzVHSFpfRkxBRzEsIE5FRURfTkZDLCBQU0NBTl9NS0sxIHwgUFNDQU5fTUtLMyB8IFBTQ0FOX01LS0EyIHwgUFNDQU5fTUtLQTJfRywgQ1RSWV9KQVBBTjQwIH0sCisKKwkvKiBNS0sxMCAqLworCXtNS0sxMF9NS0tBLAlNS0sxMCwJCU1LS0EsCQlNS0s1R0haX0ZMQUcxLCBORUVEX05GQywgTk9fUFNDQU4sIENUUllfSkFQQU4zNSB9LAorCXtNS0sxMF9GQ0NBLAlNS0sxMCwJCUZDQ0EsCQlNS0s1R0haX0ZMQUcxLCBORUVEX05GQywgTk9fUFNDQU4sIENUUllfSkFQQU40MSB9LAorCXtNS0sxMF9NS0tBMSwJTUtLMTAsCQlNS0tBLAkJTUtLNUdIWl9GTEFHMSwgTkVFRF9ORkMsIFBTQ0FOX01LS0ExIHwgUFNDQU5fTUtLQTFfRywgQ1RSWV9KQVBBTjQyIH0sCisJe01LSzEwX01LS0MsCU1LSzEwLAkJTUtLQywJCU1LSzVHSFpfRkxBRzEsIE5FRURfTkZDLCBOT19QU0NBTiwgQ1RSWV9KQVBBTjQzIH0sCisJe01LSzEwX01LS0EyLAlNS0sxMCwJCU1LS0EsCQlNS0s1R0haX0ZMQUcxLCBORUVEX05GQywgUFNDQU5fTUtLMSB8IFBTQ0FOX01LSzMgfCBQU0NBTl9NS0tBMiB8IFBTQ0FOX01LS0EyX0csIENUUllfSkFQQU40NCB9LAorCisJLyogTUtLMTEgKi8KKwl7TUtLMTFfTUtLQSwJTUtLMTEsCQlNS0tBLAkJTUtLNUdIWl9GTEFHMSwgTkVFRF9ORkMsIE5PX1BTQ0FOLCBDVFJZX0pBUEFONDUgfSwKKwl7TUtLMTFfRkNDQSwJTUtLMTEsCQlGQ0NBLAkJTUtLNUdIWl9GTEFHMSwgTkVFRF9ORkMsIE5PX1BTQ0FOLCBDVFJZX0pBUEFONDYgfSwKKwl7TUtLMTFfTUtLQTEsCU1LSzExLAkJTUtLQSwJCU1LSzVHSFpfRkxBRzEsIE5FRURfTkZDLCBQU0NBTl9NS0tBMSB8IFBTQ0FOX01LS0ExX0csIENUUllfSkFQQU40NyB9LAorCXtNS0sxMV9NS0tDLAlNS0sxMSwJCU1LS0MsCQlNS0s1R0haX0ZMQUcxLCBORUVEX05GQywgTk9fUFNDQU4sIENUUllfSkFQQU40OCB9LAorCXtNS0sxMV9NS0tBMiwJTUtLMTEsCQlNS0tBLAkJTUtLNUdIWl9GTEFHMSwgTkVFRF9ORkMsIFBTQ0FOX01LSzEgfCBQU0NBTl9NS0szIHwgUFNDQU5fTUtLQTIgfCBQU0NBTl9NS0tBMl9HLCBDVFJZX0pBUEFONDkgfSwKKworCS8qIE1LSzEyICovCisJe01LSzEyX01LS0EsCU1LSzEyLAkJTUtLQSwJCU1LSzVHSFpfRkxBRzEsIE5FRURfTkZDLCBOT19QU0NBTiwgQ1RSWV9KQVBBTjUwIH0sCisJe01LSzEyX0ZDQ0EsCU1LSzEyLAkJRkNDQSwJCU1LSzVHSFpfRkxBRzEsIE5FRURfTkZDLCBOT19QU0NBTiwgQ1RSWV9KQVBBTjUxIH0sCisJe01LSzEyX01LS0ExLAlNS0sxMiwJCU1LS0EsCQlNS0s1R0haX0ZMQUcxLCBORUVEX05GQywgUFNDQU5fTUtLQTEgfCBQU0NBTl9NS0tBMV9HLCBDVFJZX0pBUEFONTIgfSwKKwl7TUtLMTJfTUtLQywJTUtLMTIsCQlNS0tDLAkJTUtLNUdIWl9GTEFHMSwgTkVFRF9ORkMsIE5PX1BTQ0FOLCBDVFJZX0pBUEFONTMgfSwKKwl7TUtLMTJfTUtLQTIsCU1LSzEyLAkJTUtLQSwJCU1LSzVHSFpfRkxBRzEsIE5FRURfTkZDLCBQU0NBTl9NS0sxIHwgUFNDQU5fTUtLMyB8IFBTQ0FOX01LS0EyIHwgUFNDQU5fTUtLQTJfRywgQ1RSWV9KQVBBTjU0IH0sCisKKworCS8qIFRoZXNlIGFyZSBzdXBlciBkb21haW5zICovCisJe1dPUjBfV09STEQsCVdPUjBfV09STEQsCVdPUjBfV09STEQsCU5PX1JFUSwgTk9fUkVRLCBQU0NBTl9ERUZFUiwgMCB9LAorCXtXT1IxX1dPUkxELAlXT1IxX1dPUkxELAlXT1IxX1dPUkxELAlESVNBTExPV19BREhPQ18xMUEgfCBESVNBTExPV19BREhPQ18xMUFfVFVSQiwgTk9fUkVRLCBQU0NBTl9ERUZFUiwgMCB9LAorCXtXT1IyX1dPUkxELAlXT1IyX1dPUkxELAlXT1IyX1dPUkxELAlESVNBTExPV19BREhPQ18xMUFfVFVSQiwgTk9fUkVRLCBQU0NBTl9ERUZFUiwgMCB9LAorCXtXT1IzX1dPUkxELAlXT1IzX1dPUkxELAlXT1IzX1dPUkxELAlOT19SRVEsIE5PX1JFUSwgUFNDQU5fREVGRVIsIDAgfSwKKwl7V09SNF9XT1JMRCwJV09SNF9XT1JMRCwJV09SNF9XT1JMRCwJRElTQUxMT1dfQURIT0NfMTFBIHwgRElTQUxMT1dfQURIT0NfMTFBX1RVUkIsIE5PX1JFUSwgUFNDQU5fREVGRVIsIDAgfSwKKwl7V09SNV9FVFNJQywJV09SNV9FVFNJQywJV09SNV9FVFNJQywJRElTQUxMT1dfQURIT0NfMTFBIHwgRElTQUxMT1dfQURIT0NfMTFBX1RVUkIsIE5PX1JFUSwgUFNDQU5fREVGRVIsIDAgfSwKKwl7V09SMDFfV09STEQsCVdPUjAxX1dPUkxELAlXT1IwMV9XT1JMRCwJTk9fUkVRLCBOT19SRVEsIFBTQ0FOX0RFRkVSLCAwIH0sCisJe1dPUjAyX1dPUkxELAlXT1IwMl9XT1JMRCwJV09SMDJfV09STEQsCU5PX1JFUSwgTk9fUkVRLCBQU0NBTl9ERUZFUiwgMCB9LAorCXtFVTFfV09STEQsCSAgICBFVTFfV09STEQsCUVVMV9XT1JMRCwJTk9fUkVRLCBOT19SRVEsIFBTQ0FOX0RFRkVSLCAwIH0sCisJe1dPUjlfV09STEQsCVdPUjlfV09STEQsCVdPUjlfV09STEQsCURJU0FMTE9XX0FESE9DXzExQSB8IERJU0FMTE9XX0FESE9DXzExQV9UVVJCLCBOT19SRVEsIFBTQ0FOX0RFRkVSLCAwIH0sCisJe1dPUkFfV09STEQsCVdPUkFfV09STEQsCVdPUkFfV09STEQsCURJU0FMTE9XX0FESE9DXzExQSB8IERJU0FMTE9XX0FESE9DXzExQV9UVVJCLCBOT19SRVEsIFBTQ0FOX0RFRkVSLCAwIH0sCit9OworCisvKgorICogVGhlIGZvbGxvd2luZyB0YWJsZSBpcyB0aGUgbWFzdGVyIGxpc3QgZm9yIGFsbCBkaWZmZXJlbnQgZnJlcWV1bmN5CisgKiBiYW5kcyB3aXRoIHRoZSBjb21wbGV0ZSBtYXRyaXggb2YgYWxsIHBvc3NpYmxlIGZsYWdzIGFuZCBzZXR0aW5ncworICogZm9yIGVhY2ggYmFuZCBpZiBpdCBpcyB1c2VkIGluIEFOWSByZWcgZG9tYWluLgorICovCisKKyNkZWZpbmUgREVGX1JFR0RNTgkJRkNDMV9GQ0NBCisjZGVmaW5lCURFRl9ETU5fNQkJRkNDMQorI2RlZmluZQlERUZfRE1OXzIJCUZDQ0EKKyNkZWZpbmUJQ09VTlRSWV9FUkRfRkxBRyAgICAgICAgMHg4MDAwCisjZGVmaW5lIFdPUkxEV0lERV9ST0FNSU5HX0ZMQUcgIDB4NDAwMAorI2RlZmluZQlTVVBFUl9ET01BSU5fTUFTSwkweDBmZmYKKyNkZWZpbmUJQ09VTlRSWV9DT0RFX01BU0sJMHgwM2ZmCisjZGVmaW5lIENGX0lOVEVSRkVSRU5DRQkJKENIQU5ORUxfQ1dfSU5UIHwgQ0hBTk5FTF9SQURBUl9JTlQpCisjZGVmaW5lIENIQU5ORUxfMTQJCSgyNDg0KQkvKiA4MDIuMTFnIG9wZXJhdGlvbiBpcyBub3QgcGVybWl0dGVkIG9uIGNoYW5uZWwgMTQgKi8KKyNkZWZpbmUgSVNfMTFHX0NIMTQoX2NoLF9jZikgXAorCSgoKF9jaCkgPT0gQ0hBTk5FTF8xNCkgJiYgKChfY2YpID09IENIQU5ORUxfRykpCisKKyNkZWZpbmUJWUVTCVRSVUUKKyNkZWZpbmUJTk8JRkFMU0UKKworZW51bSB7CisJQ1RSWV9ERUJVRwk9IDB4MWZmLAkJLyogZGVidWcgY291bnRyeSBjb2RlICovCisJQ1RSWV9ERUZBVUxUCT0gMAkJCS8qIGRlZmF1bHQgY291bnRyeSBjb2RlICovCit9OworCit0eXBlZGVmIHN0cnVjdCB7CisJSEFMX0NUUllfQ09ERQljb3VudHJ5Q29kZTsKKwlIQUxfUkVHX0RPTUFJTglyZWdEbW5FbnVtOworCWNvbnN0IGNoYXIqCQlpc29OYW1lOworCWNvbnN0IGNoYXIqCQluYW1lOworCUhBTF9CT09MCQlhbGxvdzExZzsKKwlIQUxfQk9PTAkJYWxsb3cxMWFUdXJibzsKKwlIQUxfQk9PTAkJYWxsb3cxMWdUdXJibzsKKyAgICBIQUxfQk9PTCAgICAgICAgYWxsb3cxMW5hOyAgICAgIC8qIEhULTQwIGFsbG93ZWQgaW4gNUdIej8gKi8KKyAgICBIQUxfQk9PTCAgICAgICAgYWxsb3cxMW5nOyAgICAgIC8qIEhULTQwIGFsbG93ZWQgaW4gMkdIej8gKi8KKwl1MTZfdAkJb3V0ZG9vckNoYW5TdGFydDsKK30gQ09VTlRSWV9DT0RFX1RPX0VOVU1fUkQ7CisKK3N0YXRpYyBDT1VOVFJZX0NPREVfVE9fRU5VTV9SRCBhbGxDb3VudHJpZXNbXSA9IHsKKyAgICB7Q1RSWV9ERUJVRywgICAgICAgTk9fRU5VTVJELCAgICAgIkRCIiwgIkRFQlVHIiwgICAgICAgICAgWUVTLCBZRVMsIFlFUywgWUVTLCBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9ERUZBVUxULCAgICAgREVGX1JFR0RNTiwgICAgIk5BIiwgIk5PX0NPVU5UUllfU0VUIiwgWUVTLCBZRVMsIFlFUywgWUVTLCBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9BTEJBTklBLCAgICAgTlVMTDFfV09STEQsICAgIkFMIiwgIkFMQkFOSUEiLCAgICAgICAgWUVTLCBOTywgIFlFUywgTk8sICBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9BTEdFUklBLCAgICAgTlVMTDFfV09STEQsICAgIkRaIiwgIkFMR0VSSUEiLCAgICAgICAgWUVTLCBOTywgIFlFUywgTk8sICBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9BUkdFTlRJTkEsICAgQVBMM19XT1JMRCwgICAgIkFSIiwgIkFSR0VOVElOQSIsICAgICAgWUVTLCBOTywgIE5PLCAgTk8sICBOTywgIDcwMDAgfSwKKyAgICB7Q1RSWV9BUk1FTklBLCAgICAgRVRTSTRfV09STEQsICAgIkFNIiwgIkFSTUVOSUEiLCAgICAgICAgWUVTLCBOTywgIFlFUywgTk8sICBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9BVVNUUkFMSUEsICAgRkNDNl9XT1JMRCwgICAgIkFVIiwgIkFVU1RSQUxJQSIsICAgICAgWUVTLCBZRVMsIFlFUywgWUVTLCBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9BVVNUUklBLCAgICAgRVRTSTJfV09STEQsICAgIkFUIiwgIkFVU1RSSUEiLCAgICAgICAgWUVTLCBOTywgIFlFUywgWUVTLCBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9BWkVSQkFJSkFOLCAgRVRTSTRfV09STEQsICAgIkFaIiwgIkFaRVJCQUlKQU4iLCAgICAgWUVTLCBZRVMsIFlFUywgWUVTLCBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9CQUhSQUlOLCAgICAgQVBMNl9XT1JMRCwgICAgIkJIIiwgIkJBSFJBSU4iLCAgICAgICAgWUVTLCBOTywgIFlFUywgTk8sICBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9CRUxBUlVTLCAgICAgRVRTSTFfV09STEQsICAgIkJZIiwgIkJFTEFSVVMiLCAgICAgICAgWUVTLCBOTywgIFlFUywgWUVTLCBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9CRUxHSVVNLCAgICAgRVRTSTFfV09STEQsICAgIkJFIiwgIkJFTEdJVU0iLCAgICAgICAgWUVTLCBOTywgIFlFUywgWUVTLCBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9CRUxJWkUsICAgICAgQVBMMV9FVFNJQywgICAgIkJaIiwgIkJFTElaRSIsICAgICAgICAgWUVTLCBZRVMsIFlFUywgWUVTLCBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9CT0xJVklBLCAgICAgQVBMMV9FVFNJQywgICAgIkJPIiwgIkJPTFZJQSIsICAgICAgICAgWUVTLCBZRVMsIFlFUywgWUVTLCBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9CUkFaSUwsICAgICAgRkNDM19XT1JMRCwgICAgIkJSIiwgIkJSQVpJTCIsICAgICAgICAgTk8sICBOTywgIE5PLCAgTk8sICBOTywgIDcwMDAgfSwKKyAgICB7Q1RSWV9CUlVORUlfREFSVVNTQUxBTSxBUEwxX1dPUkxELCJCTiIsICJCUlVORUkgREFSVVNTQUxBTSIsIFlFUywgWUVTLCBZRVMsICBZRVMsIFlFUywgNzAwMCB9LAorICAgIHtDVFJZX0JVTEdBUklBLCAgICBFVFNJNl9XT1JMRCwgICAiQkciLCAiQlVMR0FSSUEiLCAgICAgICBZRVMsIE5PLCAgWUVTLCBZRVMsIFlFUywgNzAwMCB9LAorICAgIHtDVFJZX0NBTkFEQSwgICAgICBGQ0M2X0ZDQ0EsICAgICAiQ0EiLCAiQ0FOQURBIiwgICAgICAgICBZRVMsIFlFUywgWUVTLCBZRVMsIFlFUywgNzAwMCB9LAorICAgIHtDVFJZX0NISUxFLCAgICAgICBBUEw2X1dPUkxELCAgICAiQ0wiLCAiQ0hJTEUiLCAgICAgICAgICBZRVMsIFlFUywgWUVTLCBZRVMsIFlFUywgNzAwMCB9LAorICAgIHtDVFJZX0NISU5BLCAgICAgICBBUEwxX1dPUkxELCAgICAiQ04iLCAiQ0hJTkEiLCAgICAgICAgICBZRVMsIFlFUywgWUVTLCBZRVMsIFlFUywgNzAwMCB9LAorICAgIHtDVFJZX0NPTE9NQklBLCAgICBGQ0MxX0ZDQ0EsICAgICAiQ08iLCAiQ09MT01CSUEiLCAgICAgICBZRVMsIE5PLCAgWUVTLCBOTywgIFlFUywgNzAwMCB9LAorICAgIHtDVFJZX0NPU1RBX1JJQ0EsICBGQ0MxX1dPUkxELCAgICAiQ1IiLCAiQ09TVEEgUklDQSIsICAgICBZRVMsIE5PLCAgWUVTLCBOTywgIFlFUywgNzAwMCB9LAorICAgIHtDVFJZX0NST0FUSUEsICAgICBFVFNJM19XT1JMRCwgICAiSFIiLCAiQ1JPQVRJQSIsICAgICAgICBZRVMsIE5PLCAgWUVTLCBOTywgIFlFUywgNzAwMCB9LAorICAgIHtDVFJZX0NZUFJVUywgICAgICBFVFNJM19XT1JMRCwgICAiQ1kiLCAiQ1lQUlVTIiwgICAgICAgICBZRVMsIFlFUywgWUVTLCBZRVMsIFlFUywgNzAwMCB9LAorICAgIHtDVFJZX0NaRUNILCAgICAgICBFVFNJM19XT1JMRCwgICAiQ1oiLCAiQ1pFQ0ggUkVQVUJMSUMiLCBZRVMsIE5PLCBZRVMsICBZRVMsIFlFUywgNzAwMCB9LAorICAgIHtDVFJZX0RFTk1BUkssICAgICBFVFNJMV9XT1JMRCwgICAiREsiLCAiREVOTUFSSyIsICAgICAgICBZRVMsIE5PLCAgWUVTLCBZRVMsIFlFUywgNzAwMCB9LAorICAgIHtDVFJZX0RPTUlOSUNBTl9SRVBVQkxJQyxGQ0MxX0ZDQ0EsIkRPIiwgIkRPTUlOSUNBTiBSRVBVQkxJQyIsIFlFUywgWUVTLCBZRVMsIFlFUywgWUVTLCA3MDAwIH0sCisgICAge0NUUllfRUNVQURPUiwgICAgIEZDQzFfV09STEQsICAgICJFQyIsICJFQ1VBRE9SIiwgICAgICAgIFlFUywgTk8sICBOTywgIE5PLCAgWUVTLCA3MDAwIH0sCisgICAge0NUUllfRUdZUFQsICAgICAgIEVUU0kzX1dPUkxELCAgICJFRyIsICJFR1lQVCIsICAgICAgICAgIFlFUywgTk8sICBZRVMsIE5PLCAgWUVTLCA3MDAwIH0sCisgICAge0NUUllfRUxfU0FMVkFET1IsIEZDQzFfV09STEQsICAgICJTViIsICJFTCBTQUxWQURPUiIsICAgIFlFUywgTk8sICBZRVMsIE5PLCAgWUVTLCA3MDAwIH0sCisgICAge0NUUllfRVNUT05JQSwgICAgIEVUU0kxX1dPUkxELCAgICJFRSIsICJFU1RPTklBIiwgICAgICAgIFlFUywgTk8sICBZRVMsIFlFUywgWUVTLCA3MDAwIH0sCisgICAge0NUUllfRklOTEFORCwgICAgIEVUU0kxX1dPUkxELCAgICJGSSIsICJGSU5MQU5EIiwgICAgICAgIFlFUywgTk8sICBZRVMsIFlFUywgWUVTLCA3MDAwIH0sCisgICAge0NUUllfRlJBTkNFLCAgICAgIEVUU0kxX1dPUkxELCAgICJGUiIsICJGUkFOQ0UiLCAgICAgICAgIFlFUywgTk8sICBZRVMsIFlFUywgWUVTLCA3MDAwIH0sCisgICAge0NUUllfRlJBTkNFMiwgICAgIEVUU0kzX1dPUkxELCAgICJGMiIsICJGUkFOQ0VfUkVTIiwgICAgIFlFUywgTk8sICBZRVMsIFlFUywgWUVTLCA3MDAwIH0sCisgICAge0NUUllfR0VPUkdJQSwgICAgIEVUU0k0X1dPUkxELCAgICJHRSIsICJHRU9SR0lBIiwgICAgICAgIFlFUywgWUVTLCBZRVMsIFlFUywgWUVTLCA3MDAwIH0sCisgICAge0NUUllfR0VSTUFOWSwgICAgIEVUU0kxX1dPUkxELCAgICJERSIsICJHRVJNQU5ZIiwgICAgICAgIFlFUywgTk8sICBZRVMsIFlFUywgWUVTLCA3MDAwIH0sCisgICAge0NUUllfR1JFRUNFLCAgICAgIEVUU0kxX1dPUkxELCAgICJHUiIsICJHUkVFQ0UiLCAgICAgICAgIFlFUywgTk8sICBZRVMsIFlFUywgWUVTLCA3MDAwIH0sCisgICAge0NUUllfR1VBVEVNQUxBLCAgIEZDQzFfRkNDQSwgICAgICJHVCIsICJHVUFURU1BTEEiLCAgICAgIFlFUywgWUVTLCBZRVMsIFlFUywgWUVTLCA3MDAwIH0sCisgICAge0NUUllfSE9ORFVSQVMsICAgIE5VTEwxX1dPUkxELCAgICJITiIsICJIT05EVVJBUyIsICAgICAgIFlFUywgTk8sICBZRVMsIE5PLCAgWUVTLCA3MDAwIH0sCisgICAge0NUUllfSE9OR19LT05HLCAgIEZDQzJfV09STEQsICAgICJISyIsICJIT05HIEtPTkciLCAgICAgIFlFUywgWUVTLCBZRVMsIFlFUywgWUVTLCA3MDAwIH0sCisgICAge0NUUllfSFVOR0FSWSwgICAgIEVUU0k0X1dPUkxELCAgICJIVSIsICJIVU5HQVJZIiwgICAgICAgIFlFUywgTk8sICBZRVMsIFlFUywgWUVTLCA3MDAwIH0sCisgICAge0NUUllfSUNFTEFORCwgICAgIEVUU0kxX1dPUkxELCAgICJJUyIsICJJQ0VMQU5EIiwgICAgICAgIFlFUywgTk8sICBZRVMsIFlFUywgWUVTLCA3MDAwIH0sCisgICAge0NUUllfSU5ESUEsICAgICAgIEFQTDZfV09STEQsICAgICJJTiIsICJJTkRJQSIsICAgICAgICAgIFlFUywgTk8sICBZRVMsIE5PLCAgWUVTLCA3MDAwIH0sCisgICAge0NUUllfSU5ET05FU0lBLCAgIEFQTDFfV09STEQsICAgICJJRCIsICJJTkRPTkVTSUEiLCAgICAgIFlFUywgTk8sICBZRVMsIE5PLCAgWUVTLCA3MDAwIH0sCisgICAge0NUUllfSVJBTiwgICAgICAgIEFQTDFfV09STEQsICAgICJJUiIsICJJUkFOIiwgICAgICAgICAgIFlFUywgWUVTLCBZRVMsIFlFUywgWUVTLCA3MDAwIH0sCisgICAge0NUUllfSVJFTEFORCwgICAgIEVUU0kxX1dPUkxELCAgICJJRSIsICJJUkVMQU5EIiwgICAgICAgIFlFUywgTk8sICBZRVMsIFlFUywgWUVTLCA3MDAwIH0sCisgICAge0NUUllfSVNSQUVMLCAgICAgIEVUU0kzX1dPUkxELCAgICJJTCIsICJJU1JBRUwiLCAgICAgICAgIFlFUywgTk8sICBZRVMsIE5PLCAgWUVTLCA3MDAwIH0sCisgICAge0NUUllfSVNSQUVMMiwgICAgIE5VTEwxX0VUU0lCLCAgICJJU1IiLCJJU1JBRUxfUkVTIiwgICAgIFlFUywgTk8sICBZRVMsIE5PLCAgWUVTLCA3MDAwIH0sCisgICAge0NUUllfSVRBTFksICAgICAgIEVUU0kxX1dPUkxELCAgICJJVCIsICJJVEFMWSIsICAgICAgICAgIFlFUywgTk8sICBZRVMsIFlFUywgWUVTLCA3MDAwIH0sCisgICAge0NUUllfSkFNQUlDQSwgICAgIEVUU0kxX1dPUkxELCAgICJKTSIsICJKQU1BSUNBIiwgICAgICAgIFlFUywgTk8sICBZRVMsIFlFUywgWUVTLCA3MDAwIH0sCisgICAge0NUUllfSkFQQU4sICAgICAgIE1LSzFfTUtLQSwgICAgICJKUCIsICJKQVBBTiIsICAgICAgICAgIFlFUywgTk8sICBOTywgIE5PLCAgTk8sICA3MDAwIH0sCisgICAge0NUUllfSkFQQU4xLCAgICAgIE1LSzFfTUtLQiwgICAgICJKMSIsICJKQVBBTjEiLCAgICAgICAgIFlFUywgTk8sICBOTywgIE5PLCAgTk8sICA3MDAwIH0sCisgICAge0NUUllfSkFQQU4yLCAgICAgIE1LSzFfRkNDQSwgICAgICJKMiIsICJKQVBBTjIiLCAgICAgICAgIFlFUywgTk8sICBOTywgIE5PLCAgTk8sICA3MDAwIH0sCisgICAge0NUUllfSkFQQU4zLCAgICAgIE1LSzJfTUtLQSwgICAgICJKMyIsICJKQVBBTjMiLCAgICAgICAgIFlFUywgTk8sICBOTywgIE5PLCAgTk8sICA3MDAwIH0sCisgICAge0NUUllfSkFQQU40LCAgICAgIE1LSzFfTUtLQTEsICAgICJKNCIsICJKQVBBTjQiLCAgICAgICAgIFlFUywgTk8sICBOTywgIE5PLCAgTk8sICA3MDAwIH0sCisgICAge0NUUllfSkFQQU41LCAgICAgIE1LSzFfTUtLQTIsICAgICJKNSIsICJKQVBBTjUiLCAgICAgICAgIFlFUywgTk8sICBOTywgIE5PLCAgTk8sICA3MDAwIH0sCisgICAge0NUUllfSkFQQU42LCAgICAgIE1LSzFfTUtLQywgICAgICJKNiIsICJKQVBBTjYiLCAgICAgICAgIFlFUywgTk8sICBOTywgIE5PLCAgTk8sICA3MDAwIH0sCisgICAge0NUUllfSkFQQU43LCAgICAgIE1LSzNfTUtLQiwgICAgICJKNyIsICJKQVBBTjciLCAgICAgICAgIFlFUywgTk8sICBOTywgIE5PLCAgTk8sICA3MDAwIH0sCisgICAge0NUUllfSkFQQU44LCAgICAgIE1LSzNfTUtLQTIsICAgICJKOCIsICJKQVBBTjgiLCAgICAgICAgIFlFUywgTk8sICBOTywgIE5PLCAgTk8sICA3MDAwIH0sCisgICAge0NUUllfSkFQQU45LCAgICAgIE1LSzNfTUtLQywgICAgICJKOSIsICJKQVBBTjkiLCAgICAgICAgIFlFUywgTk8sICBOTywgIE5PLCAgTk8sICA3MDAwIH0sCisgICAge0NUUllfSkFQQU4xMCwgICAgIE1LSzRfTUtLQiwgICAgICJKMTAiLCAiSkFQQU4xMCIsICAgICAgIFlFUywgTk8sICBOTywgIE5PLCAgTk8sICA3MDAwIH0sCisgICAge0NUUllfSkFQQU4xMSwgICAgIE1LSzRfTUtLQTIsICAgICJKMTEiLCAiSkFQQU4xMSIsICAgICAgIFlFUywgTk8sICBOTywgIE5PLCAgTk8sICA3MDAwIH0sCisgICAge0NUUllfSkFQQU4xMiwgICAgIE1LSzRfTUtLQywgICAgICJKMTIiLCAiSkFQQU4xMiIsICAgICAgIFlFUywgTk8sICBOTywgIE5PLCAgTk8sICA3MDAwIH0sCisgICAge0NUUllfSkFQQU4xMywgICAgIE1LSzVfTUtLQiwgICAgICJKMTMiLCAiSkFQQU4xMyIsICAgICAgIFlFUywgTk8sICBOTywgIE5PLCAgTk8sICA3MDAwIH0sCisgICAge0NUUllfSkFQQU4xNCwgICAgIE1LSzVfTUtLQTIsICAgICJKMTQiLCAiSkFQQU4xNCIsICAgICAgIFlFUywgTk8sICBOTywgIE5PLCAgTk8sICA3MDAwIH0sCisgICAge0NUUllfSkFQQU4xNSwgICAgIE1LSzVfTUtLQywgICAgICJKMTUiLCAiSkFQQU4xNSIsICAgICAgIFlFUywgTk8sICBOTywgIE5PLCAgTk8sICA3MDAwIH0sCisgICAge0NUUllfSkFQQU4xNiwgICAgIE1LSzZfTUtLQiwgICAgICJKMTYiLCAiSkFQQU4xNiIsICAgICAgIFlFUywgTk8sICBOTywgIE5PLCAgTk8sICA3MDAwIH0sCisgICAge0NUUllfSkFQQU4xNywgICAgIE1LSzZfTUtLQTIsICAgICJKMTciLCAiSkFQQU4xNyIsICAgICAgIFlFUywgTk8sICBOTywgIE5PLCAgTk8sICA3MDAwIH0sCisgICAge0NUUllfSkFQQU4xOCwgICAgIE1LSzZfTUtLQywgICAgICJKMTgiLCAiSkFQQU4xOCIsICAgICAgIFlFUywgTk8sICBOTywgIE5PLCAgTk8sICA3MDAwIH0sCisgICAge0NUUllfSkFQQU4xOSwgICAgIE1LSzdfTUtLQiwgICAgICJKMTkiLCAiSkFQQU4xOSIsICAgICAgIFlFUywgTk8sICBOTywgIE5PLCAgTk8sICA3MDAwIH0sCisgICAge0NUUllfSkFQQU4yMCwgICAgIE1LSzdfTUtLQSwgICAgICJKMjAiLCAiSkFQQU4yMCIsICAgICAgIFlFUywgTk8sICBOTywgIE5PLCAgTk8sICA3MDAwIH0sCisgICAge0NUUllfSkFQQU4yMSwgICAgIE1LSzdfTUtLQywgICAgICJKMjEiLCAiSkFQQU4yMSIsICAgICAgIFlFUywgTk8sICBOTywgIE5PLCAgTk8sICA3MDAwIH0sCisgICAge0NUUllfSkFQQU4yMiwgICAgIE1LSzhfTUtLQiwgICAgICJKMjIiLCAiSkFQQU4yMiIsICAgICAgIFlFUywgTk8sICBOTywgIE5PLCAgTk8sICA3MDAwIH0sCisgICAge0NUUllfSkFQQU4yMywgICAgIE1LSzhfTUtLQTIsICAgICJKMjMiLCAiSkFQQU4yMyIsICAgICAgIFlFUywgTk8sICBOTywgIE5PLCAgTk8sICA3MDAwIH0sCisgICAge0NUUllfSkFQQU4yNCwgICAgIE1LSzhfTUtLQywgICAgICJKMjQiLCAiSkFQQU4yNCIsICAgICAgIFlFUywgTk8sICBOTywgIE5PLCAgTk8sICA3MDAwIH0sCisgICAge0NUUllfSkFQQU4yNSwgICAgIE1LSzNfTUtLQSwgICAgICJKMjUiLCAiSkFQQU4yNSIsICAgICAgIFlFUywgTk8sICBOTywgIE5PLCAgTk8sICA3MDAwIH0sCisgICAge0NUUllfSkFQQU4yNiwgICAgIE1LSzNfTUtLQTEsICAgICJKMjYiLCAiSkFQQU4yNiIsICAgICAgIFlFUywgTk8sICBOTywgIE5PLCAgTk8sICA3MDAwIH0sCisgICAge0NUUllfSkFQQU4yNywgICAgIE1LSzNfRkNDQSwgICAgICJKMjciLCAiSkFQQU4yNyIsICAgICAgIFlFUywgTk8sICBOTywgIE5PLCAgTk8sICA3MDAwIH0sCisgICAge0NUUllfSkFQQU4yOCwgICAgIE1LSzRfTUtLQTEsICAgICJKMjgiLCAiSkFQQU4yOCIsICAgICAgIFlFUywgTk8sICBOTywgIE5PLCAgTk8sICA3MDAwIH0sCisgICAge0NUUllfSkFQQU4yOSwgICAgIE1LSzRfRkNDQSwgICAgICJKMjkiLCAiSkFQQU4yOSIsICAgICAgIFlFUywgTk8sICBOTywgIE5PLCAgTk8sICA3MDAwIH0sCisgICAge0NUUllfSkFQQU4zMCwgICAgIE1LSzZfTUtLQTEsICAgICJKMzAiLCAiSkFQQU4zMCIsICAgICAgIFlFUywgTk8sICBOTywgIE5PLCAgTk8sICA3MDAwIH0sCisgICAge0NUUllfSkFQQU4zMSwgICAgIE1LSzZfRkNDQSwgICAgICJKMzEiLCAiSkFQQU4zMSIsICAgICAgIFlFUywgTk8sICBOTywgIE5PLCAgTk8sICA3MDAwIH0sCisgICAge0NUUllfSkFQQU4zMiwgICAgIE1LSzdfTUtLQTEsICAgICJKMzIiLCAiSkFQQU4zMiIsICAgICAgIFlFUywgTk8sICBOTywgIE5PLCAgTk8sICA3MDAwIH0sCisgICAge0NUUllfSkFQQU4zMywgICAgIE1LSzdfRkNDQSwgICAgICJKMzMiLCAiSkFQQU4zMyIsICAgICAgIFlFUywgTk8sICBOTywgIE5PLCAgTk8sICA3MDAwIH0sCisgICAge0NUUllfSkFQQU4zNCwgICAgIE1LSzlfTUtLQSwgICAgICJKMzQiLCAiSkFQQU4zNCIsICAgICAgIFlFUywgTk8sICBOTywgIE5PLCAgTk8sICA3MDAwIH0sCisgICAge0NUUllfSkFQQU4zNSwgICAgIE1LSzEwX01LS0EsICAgICJKMzUiLCAiSkFQQU4zNSIsICAgICAgIFlFUywgTk8sICBOTywgIE5PLCAgTk8sICA3MDAwIH0sCisgICAge0NUUllfSkFQQU4zNiwgICAgIE1LSzRfTUtLQSwgICAgICJKMzYiLCAiSkFQQU4zNiIsICAgICAgIFlFUywgTk8sICBOTywgIE5PLCAgTk8sICA3MDAwIH0sCisgICAge0NUUllfSkFQQU4zNywgICAgIE1LSzlfRkNDQSwgICAgICJKMzciLCAiSkFQQU4zNyIsICAgICAgIFlFUywgTk8sICBOTywgIE5PLCAgTk8sICA3MDAwIH0sCisgICAge0NUUllfSkFQQU4zOCwgICAgIE1LSzlfTUtLQTEsICAgICJKMzgiLCAiSkFQQU4zOCIsICAgICAgIFlFUywgTk8sICBOTywgIE5PLCAgTk8sICA3MDAwIH0sCisgICAge0NUUllfSkFQQU4zOSwgICAgIE1LSzlfTUtLQywgICAgICJKMzkiLCAiSkFQQU4zOSIsICAgICAgIFlFUywgTk8sICBOTywgIE5PLCAgTk8sICA3MDAwIH0sCisgICAge0NUUllfSkFQQU40MCwgICAgIE1LSzEwX01LS0EyLCAgICJKNDAiLCAiSkFQQU40MCIsICAgICAgIFlFUywgTk8sICBOTywgIE5PLCAgTk8sICA3MDAwIH0sCisgICAge0NUUllfSkFQQU40MSwgICAgIE1LSzEwX0ZDQ0EsICAgICJKNDEiLCAiSkFQQU40MSIsICAgICAgIFlFUywgTk8sICBOTywgIE5PLCAgTk8sICA3MDAwIH0sCisgICAge0NUUllfSkFQQU40MiwgICAgIE1LSzEwX01LS0ExLCAgICJKNDIiLCAiSkFQQU40MiIsICAgICAgIFlFUywgTk8sICBOTywgIE5PLCAgTk8sICA3MDAwIH0sCisgICAge0NUUllfSkFQQU40MywgICAgIE1LSzEwX01LS0MsICAgICJKNDMiLCAiSkFQQU40MyIsICAgICAgIFlFUywgTk8sICBOTywgIE5PLCAgTk8sICA3MDAwIH0sCisgICAge0NUUllfSkFQQU40NCwgICAgIE1LSzEwX01LS0EyLCAgICJKNDQiLCAiSkFQQU40NCIsICAgICAgIFlFUywgTk8sICBOTywgIE5PLCAgTk8sICA3MDAwIH0sCisgICAge0NUUllfSkFQQU40NSwgICAgIE1LSzExX01LS0EsICAgICJKNDUiLCAiSkFQQU40NSIsICAgICAgIFlFUywgTk8sICBOTywgIE5PLCAgTk8sICA3MDAwIH0sCisgICAge0NUUllfSkFQQU40NiwgICAgIE1LSzExX0ZDQ0EsICAgICJKNDYiLCAiSkFQQU40NiIsICAgICAgIFlFUywgTk8sICBOTywgIE5PLCAgTk8sICA3MDAwIH0sCisgICAge0NUUllfSkFQQU40NywgICAgIE1LSzExX01LS0ExLCAgICJKNDciLCAiSkFQQU40NyIsICAgICAgIFlFUywgTk8sICBOTywgIE5PLCAgTk8sICA3MDAwIH0sCisgICAge0NUUllfSkFQQU40OCwgICAgIE1LSzExX01LS0MsICAgICJKNDgiLCAiSkFQQU40OCIsICAgICAgIFlFUywgTk8sICBOTywgIE5PLCAgTk8sICA3MDAwIH0sCisgICAge0NUUllfSkFQQU40OSwgICAgIE1LSzExX01LS0EyLCAgICJKNDkiLCAiSkFQQU40OSIsICAgICAgIFlFUywgTk8sICBOTywgIE5PLCAgTk8sICA3MDAwIH0sCisgICAge0NUUllfSkFQQU41MCwgICAgIE1LSzEyX01LS0EsICAgICJKNTAiLCAiSkFQQU41MCIsICAgICAgIFlFUywgTk8sICBOTywgIE5PLCAgTk8sICA3MDAwIH0sCisgICAge0NUUllfSkFQQU41MSwgICAgIE1LSzEyX0ZDQ0EsICAgICJKNTEiLCAiSkFQQU41MSIsICAgICAgIFlFUywgTk8sICBOTywgIE5PLCAgTk8sICA3MDAwIH0sCisgICAge0NUUllfSkFQQU41MiwgICAgIE1LSzEyX01LS0ExLCAgICJKNTIiLCAiSkFQQU41MiIsICAgICAgIFlFUywgTk8sICBOTywgIE5PLCAgTk8sICA3MDAwIH0sCisgICAge0NUUllfSkFQQU41MywgICAgIE1LSzEyX01LS0MsICAgICJKNTMiLCAiSkFQQU41MyIsICAgICAgIFlFUywgTk8sICBOTywgIE5PLCAgTk8sICA3MDAwIH0sCisgICAge0NUUllfSkFQQU41NCwgICAgIE1LSzEyX01LS0EyLCAgICJKNTQiLCAiSkFQQU41NCIsICAgICAgIFlFUywgTk8sICBOTywgIE5PLCAgTk8sICA3MDAwIH0sCisgICAge0NUUllfSk9SREFOLCAgICAgIEVUU0kyX1dPUkxELCAgICJKTyIsICJKT1JEQU4iLCAgICAgICAgIFlFUywgTk8sICBZRVMsIE5PLCAgWUVTLCA3MDAwIH0sCisgICAge0NUUllfS0FaQUtIU1RBTiwgIE5VTEwxX1dPUkxELCAgICJLWiIsICJLQVpBS0hTVEFOIiwgICAgIFlFUywgTk8sICBZRVMsIE5PLCAgWUVTLCA3MDAwIH0sCisgICAge0NUUllfS09SRUFfTk9SVEgsIEFQTDlfV09STEQsICAgICJLUCIsICJOT1JUSCBLT1JFQSIsICAgIFlFUywgTk8sICBOTywgIFlFUywgWUVTLCA3MDAwIH0sCisgICAge0NUUllfS09SRUFfUk9DLCAgIEFQTDlfV09STEQsICAgICJLUiIsICJLT1JFQSBSRVBVQkxJQyIsIFlFUywgTk8sICBOTywgIE5PLCAgTk8sICA3MDAwIH0sCisgICAge0NUUllfS09SRUFfUk9DMiwgIEFQTDJfQVBMRCwgICAgICJLMiIsICJLT1JFQSBSRVBVQkxJQzIiLFlFUywgTk8sICBOTywgIE5PLCAgTk8sICA3MDAwIH0sCisgICAge0NUUllfS09SRUFfUk9DMywgIEFQTDlfV09STEQsICAgICJLMyIsICJLT1JFQSBSRVBVQkxJQzMiLFlFUywgTk8sICBOTywgIE5PLCAgTk8sICA3MDAwIH0sCisgICAge0NUUllfS1VXQUlULCAgICAgIE5VTEwxX1dPUkxELCAgICJLVyIsICJLVVdBSVQiLCAgICAgICAgIFlFUywgTk8sICBZRVMsIE5PLCAgWUVTLCA3MDAwIH0sCisgICAge0NUUllfTEFUVklBLCAgICAgIEVUU0kxX1dPUkxELCAgICJMViIsICJMQVRWSUEiLCAgICAgICAgIFlFUywgTk8sICBZRVMsIFlFUywgWUVTLCA3MDAwIH0sCisgICAge0NUUllfTEVCQU5PTiwgICAgIE5VTEwxX1dPUkxELCAgICJMQiIsICJMRUJBTk9OIiwgICAgICAgIFlFUywgTk8sICBZRVMsIE5PLCAgWUVTLCA3MDAwIH0sCisgICAge0NUUllfTElFQ0hURU5TVEVJTixFVFNJMV9XT1JMRCwgICJMSSIsICJMSUVDSFRFTlNURUlOIiwgIFlFUywgTk8sICBZRVMsIFlFUywgWUVTLCA3MDAwIH0sCisgICAge0NUUllfTElUSFVBTklBLCAgIEVUU0kxX1dPUkxELCAgICJMVCIsICJMSVRIVUFOSUEiLCAgICAgIFlFUywgTk8sICBZRVMsIFlFUywgWUVTLCA3MDAwIH0sCisgICAge0NUUllfTFVYRU1CT1VSRywgIEVUU0kxX1dPUkxELCAgICJMVSIsICJMVVhFTUJPVVJHIiwgICAgIFlFUywgTk8sICBZRVMsIFlFUywgWUVTLCA3MDAwIH0sCisgICAge0NUUllfTUFDQVUsICAgICAgIEZDQzJfV09STEQsICAgICJNTyIsICJNQUNBVSIsICAgICAgICAgIFlFUywgWUVTLCBZRVMsIFlFUywgWUVTLCA3MDAwIH0sCisgICAge0NUUllfTUFDRURPTklBLCAgIE5VTEwxX1dPUkxELCAgICJNSyIsICJNQUNFRE9OSUEiLCAgICAgIFlFUywgTk8sICBZRVMsIE5PLCAgWUVTLCA3MDAwIH0sCisgICAge0NUUllfTUFMQVlTSUEsICAgIEFQTDhfV09STEQsICAgICJNWSIsICJNQUxBWVNJQSIsICAgICAgIE5PLCAgTk8sICBOTywgIE5PLCAgTk8sICA3MDAwIH0sCisgICAge0NUUllfTUFMVEEsICAgICAgIEVUU0kxX1dPUkxELCAgICJNVCIsICJNQUxUQSIsICAgICAgICAgIFlFUywgTk8sICBZRVMsIFlFUywgWUVTLCA3MDAwIH0sCisgICAge0NUUllfTUVYSUNPLCAgICAgIEZDQzFfRkNDQSwgICAgICJNWCIsICJNRVhJQ08iLCAgICAgICAgIFlFUywgWUVTLCBZRVMsIFlFUywgWUVTLCA3MDAwIH0sCisgICAge0NUUllfTU9OQUNPLCAgICAgIEVUU0k0X1dPUkxELCAgICJNQyIsICJNT05BQ08iLCAgICAgICAgIFlFUywgWUVTLCBZRVMsIFlFUywgWUVTLCA3MDAwIH0sCisgICAge0NUUllfTU9ST0NDTywgICAgIE5VTEwxX1dPUkxELCAgICJNQSIsICJNT1JPQ0NPIiwgICAgICAgIFlFUywgTk8sICBZRVMsIE5PLCAgWUVTLCA3MDAwIH0sCisgICAge0NUUllfTkVUSEVSTEFORFMsIEVUU0kxX1dPUkxELCAgICJOTCIsICJORVRIRVJMQU5EUyIsICAgIFlFUywgTk8sICBZRVMsIFlFUywgWUVTLCA3MDAwIH0sCisgICAge0NUUllfTkVUSEVSTEFORFNfQU5ULCBFVFNJMV9XT1JMRCwgIkFOIiwgIk5FVEhFUkxBTkRTLUFOVElMTEVTIiwgWUVTLCBOTywgIFlFUywgWUVTLCBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9ORVdfWkVBTEFORCwgRkNDMl9FVFNJQywgICAgIk5aIiwgIk5FVyBaRUFMQU5EIiwgICAgWUVTLCBOTywgIFlFUywgTk8sICBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9OT1JXQVksICAgICAgRVRTSTFfV09STEQsICAgIk5PIiwgIk5PUldBWSIsICAgICAgICAgWUVTLCBOTywgIFlFUywgWUVTLCBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9PTUFOLCAgICAgICAgQVBMNl9XT1JMRCwgICAgIk9NIiwgIk9NQU4iLCAgICAgICAgICAgWUVTLCBOTywgIFlFUywgTk8sICBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9QQUtJU1RBTiwgICAgTlVMTDFfV09STEQsICAgIlBLIiwgIlBBS0lTVEFOIiwgICAgICAgWUVTLCBOTywgIFlFUywgTk8sICBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9QQU5BTUEsICAgICAgRkNDMV9GQ0NBLCAgICAgIlBBIiwgIlBBTkFNQSIsICAgICAgICAgWUVTLCBZRVMsIFlFUywgWUVTLCBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9QRVJVLCAgICAgICAgQVBMMV9XT1JMRCwgICAgIlBFIiwgIlBFUlUiLCAgICAgICAgICAgWUVTLCBOTywgIFlFUywgTk8sICBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9QSElMSVBQSU5FUywgQVBMMV9XT1JMRCwgICAgIlBIIiwgIlBISUxJUFBJTkVTIiwgICAgWUVTLCBZRVMsIFlFUywgWUVTLCBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9QT0xBTkQsICAgICAgRVRTSTFfV09STEQsICAgIlBMIiwgIlBPTEFORCIsICAgICAgICAgWUVTLCBOTywgIFlFUywgWUVTLCBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9QT1JUVUdBTCwgICAgRVRTSTFfV09STEQsICAgIlBUIiwgIlBPUlRVR0FMIiwgICAgICAgWUVTLCBOTywgIFlFUywgWUVTLCBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9QVUVSVE9fUklDTywgRkNDMV9GQ0NBLCAgICAgIlBSIiwgIlBVRVJUTyBSSUNPIiwgICAgWUVTLCBZRVMsIFlFUywgWUVTLCBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9RQVRBUiwgICAgICAgTlVMTDFfV09STEQsICAgIlFBIiwgIlFBVEFSIiwgICAgICAgICAgWUVTLCBOTywgIFlFUywgTk8sICBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9ST01BTklBLCAgICAgTlVMTDFfV09STEQsICAgIlJPIiwgIlJPTUFOSUEiLCAgICAgICAgWUVTLCBOTywgIFlFUywgTk8sICBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9SVVNTSUEsICAgICAgTlVMTDFfV09STEQsICAgIlJVIiwgIlJVU1NJQSIsICAgICAgICAgWUVTLCBOTywgIFlFUywgTk8sICBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9TQVVESV9BUkFCSUEsTlVMTDFfV09STEQsICAgIlNBIiwgIlNBVURJIEFSQUJJQSIsICAgWUVTLCBOTywgIFlFUywgTk8sICBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9TRVJCSUFfTU9OVCwgRVRTSTFfV09STEQsICAgIkNTIiwgIlNFUkJJQSAmIE1PTlRFTkVHUk8iLCBZRVMsIE5PLCAgWUVTLCBZRVMsICBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9TSU5HQVBPUkUsICAgQVBMNl9XT1JMRCwgICAgIlNHIiwgIlNJTkdBUE9SRSIsICAgICAgWUVTLCBZRVMsIFlFUywgWUVTLCBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9TTE9WQUtJQSwgICAgRVRTSTFfV09STEQsICAgIlNLIiwgIlNMT1ZBSyBSRVBVQkxJQyIsWUVTLCBOTywgIFlFUywgWUVTLCBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9TTE9WRU5JQSwgICAgRVRTSTFfV09STEQsICAgIlNJIiwgIlNMT1ZFTklBIiwgICAgICAgWUVTLCBOTywgIFlFUywgWUVTLCBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9TT1VUSF9BRlJJQ0EsRkNDM19XT1JMRCwgICAgIlpBIiwgIlNPVVRIIEFGUklDQSIsICAgWUVTLCBOTywgIFlFUywgTk8sICBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9TUEFJTiwgICAgICAgRVRTSTFfV09STEQsICAgIkVTIiwgIlNQQUlOIiwgICAgICAgICAgWUVTLCBOTywgIFlFUywgWUVTLCBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9TUklMQU5LQSwgICAgRkNDM19XT1JMRCwgICAgIkxLIiwgIlNSSSBMQU5LQSIsICAgICAgWUVTLCBOTywgIFlFUywgTk8sICBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9TV0VERU4sICAgICAgRVRTSTFfV09STEQsICAgIlNFIiwgIlNXRURFTiIsICAgICAgICAgWUVTLCBOTywgIFlFUywgWUVTLCBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9TV0lUWkVSTEFORCwgRVRTSTFfV09STEQsICAgIkNIIiwgIlNXSVRaRVJMQU5EIiwgICAgWUVTLCBOTywgIFlFUywgWUVTLCBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9TWVJJQSwgICAgICAgTlVMTDFfV09STEQsICAgIlNZIiwgIlNZUklBIiwgICAgICAgICAgWUVTLCBOTywgIFlFUywgTk8sICBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9UQUlXQU4sICAgICAgQVBMM19GQ0NBLCAgICAgIlRXIiwgIlRBSVdBTiIsICAgICAgICAgWUVTLCBZRVMsIFlFUywgWUVTLCBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9USEFJTEFORCwgICAgTlVMTDFfV09STEQsICAgIlRIIiwgIlRIQUlMQU5EIiwgICAgICAgWUVTLCBOTywgIFlFUywgTk8sICBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9UUklOSURBRF9ZX1RPQkFHTyxFVFNJNF9XT1JMRCwiVFQiLCAiVFJJTklEQUQgJiBUT0JBR08iLCBZRVMsIE5PLCBZRVMsIE5PLCBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9UVU5JU0lBLCAgICAgRVRTSTNfV09STEQsICAgIlROIiwgIlRVTklTSUEiLCAgICAgICAgWUVTLCBOTywgIFlFUywgTk8sICBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9UVVJLRVksICAgICAgRVRTSTNfV09STEQsICAgIlRSIiwgIlRVUktFWSIsICAgICAgICAgWUVTLCBOTywgIFlFUywgTk8sICBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9VS1JBSU5FLCAgICAgTlVMTDFfV09STEQsICAgIlVBIiwgIlVLUkFJTkUiLCAgICAgICAgWUVTLCBOTywgIFlFUywgTk8sICBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9VQUUsICAgICAgICAgTlVMTDFfV09STEQsICAgIkFFIiwgIlVOSVRFRCBBUkFCIEVNSVJBVEVTIiwgWUVTLCBOTywgWUVTLCBOTywgWUVTLCA3MDAwIH0sCisgICAge0NUUllfVU5JVEVEX0tJTkdET00sIEVUU0kxX1dPUkxELCJHQiIsICJVTklURUQgS0lOR0RPTSIsIFlFUywgTk8sICBZRVMsIE5PLCAgWUVTLCA3MDAwIH0sCisgICAge0NUUllfVU5JVEVEX1NUQVRFUywgRkNDM19GQ0NBLCAgICJVUyIsICJVTklURUQgU1RBVEVTIiwgIFlFUywgWUVTLCBZRVMsIFlFUywgWUVTLCA1ODI1IH0sCisgICAge0NUUllfVU5JVEVEX1NUQVRFU19GQ0M0OSwgRkNDNF9GQ0NBLCAgICJQUyIsICJVTklURUQgU1RBVEVTIChQVUJMSUMgU0FGRVRZKSIsICBZRVMsIFlFUywgWUVTLCBZRVMsIFlFUywgNzAwMCB9LAorICAgIHtDVFJZX1VSVUdVQVksICAgICBGQ0MxX1dPUkxELCAgICAiVVkiLCAiVVJVR1VBWSIsICAgICAgICBZRVMsIE5PLCAgWUVTLCBOTywgIFlFUywgNzAwMCB9LAorICAgIHtDVFJZX1VaQkVLSVNUQU4sICBGQ0MzX0ZDQ0EsICAgICAiVVoiLCAiVVpCRUtJU1RBTiIsICAgICBZRVMsIFlFUywgWUVTLCBZRVMsIFlFUywgNzAwMCB9LAorICAgIHtDVFJZX1ZFTkVaVUVMQSwgICBBUEwyX0VUU0lDLCAgICAiVkUiLCAiVkVORVpVRUxBIiwgICAgICBZRVMsIE5PLCAgWUVTLCBOTywgIFlFUywgNzAwMCB9LAorICAgIHtDVFJZX1ZJRVRfTkFNLCAgICBOVUxMMV9XT1JMRCwgICAiVk4iLCAiVklFVCBOQU0iLCAgICAgICBZRVMsIE5PLCAgWUVTLCBOTywgIFlFUywgNzAwMCB9LAorICAgIHtDVFJZX1lFTUVOLCAgICAgICBOVUxMMV9XT1JMRCwgICAiWUUiLCAiWUVNRU4iLCAgICAgICAgICBZRVMsIE5PLCAgWUVTLCBOTywgIFlFUywgNzAwMCB9LAorICAgIHtDVFJZX1pJTUJBQldFLCAgICBOVUxMMV9XT1JMRCwgICAiWlciLCAiWklNQkFCV0UiLCAgICAgICBZRVMsIE5PLCAgWUVTLCBOTywgIFlFUywgNzAwMCB9Cit9OworCit0eXBlZGVmIHN0cnVjdCBSZWdEbW5GcmVxQmFuZCB7CisJdTE2X3QJbG93Q2hhbm5lbDsJLyogTG93IGNoYW5uZWwgY2VudGVyIGluIE1IeiAqLworCXUxNl90CWhpZ2hDaGFubmVsOwkvKiBIaWdoIENoYW5uZWwgY2VudGVyIGluIE1IeiAqLworCXU4X3QJcG93ZXJEZnM7CS8qIE1heCBwb3dlciAoZEJtKSBmb3IgY2hhbm5lbAorCQkJCQkgICByYW5nZSB3aGVuIHVzaW5nIERGUyAqLworCXU4X3QJYW50ZW5uYU1heDsJLyogTWF4IGFsbG93ZWQgYW50ZW5uYSBnYWluICovCisJdThfdAljaGFubmVsQlc7CS8qIEJhbmR3aWR0aCBvZiB0aGUgY2hhbm5lbCAqLworCXU4X3QJY2hhbm5lbFNlcDsJLyogQ2hhbm5lbCBzZXBhcmF0aW9uIHdpdGhpbgorCQkJCQkgICB0aGUgYmFuZCAqLworCXU2NF90CXVzZURmczsJCS8qIFVzZSBERlMgaW4gdGhlIFJlZ0RvbWFpbgorCQkJCQkgICBpZiBjb3JyZXNwb25kaW5nIGJpdCBpcyBzZXQgKi8KKwl1NjRfdAl1c2VQYXNzU2NhbjsJLyogVXNlIFBhc3NpdmUgU2NhbiBpbiB0aGUgUmVnRG9tYWluCisJCQkJCSAgIGlmIGNvcnJlc3BvbmRpbmcgYml0IGlzIHNldCAqLworCXU4X3QJcmVnQ2xhc3NJZDsJLyogUmVndWxhdG9yeSBjbGFzcyBpZCAqLworCXU4X3QJdXNlRXh0Q2hhbkRmczsJLyogUmVndWxhdG9yeSBjbGFzcyBpZCAqLworfSBSRUdfRE1OX0ZSRVFfQkFORDsKKworLyogQml0IG1hc2tzIGZvciBERlMgcGVyIHJlZ2RvbWFpbiAqLworCitlbnVtIHsKKwlOT19ERlMgICA9IDB4MDAwMDAwMDAwMDAwMDAwMFVMTCwKKwlERlNfRkNDMyA9IDB4MDAwMDAwMDAwMDAwMDAwMVVMTCwKKwlERlNfRVRTSSA9IDB4MDAwMDAwMDAwMDAwMDAwMlVMTCwKKwlERlNfTUtLNCA9IDB4MDAwMDAwMDAwMDAwMDAwNFVMTCwKK307CisKKy8qIFRoZSB0YWJsZSBvZiBmcmVxdWVuY3kgYmFuZHMgaXMgaW5kZXhlZCBieSBhIGJpdG1hc2suICBUaGUgb3JkZXJpbmcKKyAqIG11c3QgYmUgY29uc2lzdGVudCB3aXRoIHRoZSBlbnVtIGJlbG93LiAgV2hlbiBhZGRpbmcgYSBuZXcKKyAqIGZyZXF1ZW5jeSBiYW5kLCBiZSBzdXJlIHRvIG1hdGNoIHRoZSBsb2NhdGlvbiBpbiB0aGUgZW51bSB3aXRoIHRoZQorICogY29tbWVudHMKKyAqLworCisvKgorICogNUdIeiAxMUEgY2hhbm5lbCB0YWdzCisgKi8KKworZW51bSB7CisJRjFfNDkxNV80OTI1LAorCUYxXzQ5MzVfNDk0NSwKKwlGMV80OTIwXzQ5ODAsCisJRjFfNDk0Ml80OTg3LAorCUYxXzQ5NDVfNDk4NSwKKwlGMV80OTUwXzQ5ODAsCisJRjFfNTAzNV81MDQwLAorCUYxXzUwNDBfNTA4MCwKKwlGMV81MDU1XzUwNTUsCisKKwlGMV81MTIwXzUyNDAsCisKKwlGMV81MTcwXzUyMzAsCisJRjJfNTE3MF81MjMwLAorCisJRjFfNTE4MF81MjQwLAorCUYyXzUxODBfNTI0MCwKKwlGM181MTgwXzUyNDAsCisJRjRfNTE4MF81MjQwLAorCUY1XzUxODBfNTI0MCwKKwlGNl81MTgwXzUyNDAsCisJRjdfNTE4MF81MjQwLAorCisJRjFfNTE4MF81MzIwLAorCisJRjFfNTI0MF81MjgwLAorCisJRjFfNTI2MF81MjgwLAorCisJRjFfNTI2MF81MzIwLAorCUYyXzUyNjBfNTMyMCwKKwlGM181MjYwXzUzMjAsCisJRjRfNTI2MF81MzIwLAorCUY1XzUyNjBfNTMyMCwKKwlGNl81MjYwXzUzMjAsCisJRjdfNTI2MF81MzIwLAorCisJRjFfNTI2MF81NzAwLAorCisJRjFfNTI4MF81MzIwLAorCisgICAgRjFfNTUwMF81NTgwLAorCisJRjFfNTUwMF81NjIwLAorCisJRjFfNTUwMF81NzAwLAorCUYyXzU1MDBfNTcwMCwKKwlGM181NTAwXzU3MDAsCisJRjRfNTUwMF81NzAwLAorCisgICAgRjFfNTY2MF81NzAwLAorCisJRjFfNTc0NV81ODA1LAorCUYyXzU3NDVfNTgwNSwKKwlGM181NzQ1XzU4MDUsCisKKwlGMV81NzQ1XzU4MjUsCisJRjJfNTc0NV81ODI1LAorCUYzXzU3NDVfNTgyNSwKKwlGNF81NzQ1XzU4MjUsCisJRjVfNTc0NV81ODI1LAorCUY2XzU3NDVfNTgyNSwKKworCVcxXzQ5MjBfNDk4MCwKKwlXMV81MDQwXzUwODAsCisJVzFfNTE3MF81MjMwLAorCVcxXzUxODBfNTI0MCwKKwlXMV81MjYwXzUzMjAsCisJVzFfNTc0NV81ODI1LAorCVcxXzU1MDBfNTcwMCwKKwlXMl81MjYwXzUzMjAsCisgICAgICAgIFcyXzUxODBfNTI0MCwKKwlXMl81ODI1XzU4MjUsCit9OworCitzdGF0aWMgUkVHX0RNTl9GUkVRX0JBTkQgcmVnRG1uNUdoekZyZXFbXSA9IHsKKwl7IDQ5MTUsIDQ5MjUsIDIzLCAwLCAxMCwgNSwgTk9fREZTLCBQU0NBTl9NS0syLCAxNiwgMCB9LAkJLyogRjFfNDkxNV80OTI1ICovCisJeyA0OTM1LCA0OTQ1LCAyMywgMCwgMTAsIDUsIE5PX0RGUywgUFNDQU5fTUtLMiwgMTYsIDAgfSwJCS8qIEYxXzQ5MzVfNDk0NSAqLworCXsgNDkyMCwgNDk4MCwgMjMsIDAsIDIwLCAyMCwgTk9fREZTLCBQU0NBTl9NS0syLCA3LCAwIH0sCQkvKiBGMV80OTIwXzQ5ODAgKi8KKwl7IDQ5NDIsIDQ5ODcsIDI3LCA2LCA1LCAgNSwgREZTX0ZDQzMsIFBTQ0FOX0ZDQywgMCwgMCB9LAkJLyogRjFfNDk0Ml80OTg3ICovCisJeyA0OTQ1LCA0OTg1LCAzMCwgNiwgMTAsIDUsIERGU19GQ0MzLCBQU0NBTl9GQ0MsIDAsIDAgfSwJCS8qIEYxXzQ5NDVfNDk4NSAqLworCXsgNDk1MCwgNDk4MCwgMzMsIDYsIDIwLCA1LCBERlNfRkNDMywgUFNDQU5fRkNDLCAwLCAwIH0sCQkvKiBGMV80OTUwXzQ5ODAgKi8KKwl7IDUwMzUsIDUwNDAsIDIzLCAwLCAxMCwgNSwgTk9fREZTLCBQU0NBTl9NS0syLCAxMiwgMCB9LAkJLyogRjFfNTAzNV81MDQwICovCisJeyA1MDQwLCA1MDgwLCAyMywgMCwgMjAsIDIwLCBOT19ERlMsIFBTQ0FOX01LSzIsIDIsIDAgfSwJCS8qIEYxXzUwNDBfNTA4MCAqLworCXsgNTA1NSwgNTA1NSwgMjMsIDAsIDEwLCA1LCBOT19ERlMsIFBTQ0FOX01LSzIsIDEyLCAwIH0sCQkvKiBGMV81MDU1XzUwNTUgKi8KKworCXsgNTEyMCwgNTI0MCwgNSwgIDYsIDIwLCAyMCwgTk9fREZTLCBOT19QU0NBTiwgMCwgMCB9LAkJCS8qIEYxXzUxMjBfNTI0MCAqLworCisJeyA1MTcwLCA1MjMwLCAyMywgMCwgMjAsIDIwLCBOT19ERlMsIFBTQ0FOX01LSzEgfCBQU0NBTl9NS0syLCAxLCAwIH0sCS8qIEYxXzUxNzBfNTIzMCAqLworCXsgNTE3MCwgNTIzMCwgMjAsIDAsIDIwLCAyMCwgTk9fREZTLCBQU0NBTl9NS0sxIHwgUFNDQU5fTUtLMiwgMSwgMCB9LAkvKiBGMl81MTcwXzUyMzAgKi8KKworCXsgNTE4MCwgNTI0MCwgMTUsIDAsIDIwLCAyMCwgTk9fREZTLCBQU0NBTl9GQ0MgfCBQU0NBTl9FVFNJLCAwLCAwIH0sCS8qIEYxXzUxODBfNTI0MCAqLworCXsgNTE4MCwgNTI0MCwgMTcsIDYsIDIwLCAyMCwgTk9fREZTLCBQU0NBTl9GQ0MsIDEsIDAgfSwJCQkJLyogRjJfNTE4MF81MjQwICovCisJeyA1MTgwLCA1MjQwLCAxOCwgMCwgMjAsIDIwLCBOT19ERlMsIFBTQ0FOX0ZDQyB8IFBTQ0FOX0VUU0ksIDAsIDAgfSwJLyogRjNfNTE4MF81MjQwICovCisJeyA1MTgwLCA1MjQwLCAyMCwgMCwgMjAsIDIwLCBOT19ERlMsIFBTQ0FOX0ZDQyB8IFBTQ0FOX0VUU0ksIDAsIDAgfSwJLyogRjRfNTE4MF81MjQwICovCisJeyA1MTgwLCA1MjQwLCAyMywgMCwgMjAsIDIwLCBOT19ERlMsIFBTQ0FOX0ZDQyB8IFBTQ0FOX0VUU0ksIDAsIDAgfSwJLyogRjVfNTE4MF81MjQwICovCisJeyA1MTgwLCA1MjQwLCAyMywgNiwgMjAsIDIwLCBOT19ERlMsIFBTQ0FOX0ZDQywgMCwgMCB9LAkJCQkvKiBGNl81MTgwXzUyNDAgKi8KKyAgeyA1MTgwLCA1MjQwLCAyMywgNiwgMjAsIDIwLCBOT19ERlMsIE5PX1BTQ0FOLCAwIH0sICAgICAgICAgICAvKiBGN181MTgwXzUyNDAgKi8KKworCXsgNTE4MCwgNTMyMCwgMjAsIDYsIDIwLCAyMCwgREZTX0VUU0ksIFBTQ0FOX0VUU0ksIDAsIDAgfSwJCQkvKiBGMV81MTgwXzUzMjAgKi8KKworCXsgNTI0MCwgNTI4MCwgMjMsIDAsIDIwLCAyMCwgREZTX0ZDQzMsIFBTQ0FOX0ZDQyB8IFBTQ0FOX0VUU0ksIDAsIDAgfSwJLyogRjFfNTI0MF81MjgwICovCisKKwl7IDUyNjAsIDUyODAsIDIzLCAwLCAyMCwgMjAsIERGU19GQ0MzIHwgREZTX0VUU0ksIFBTQ0FOX0ZDQyB8IFBTQ0FOX0VUU0ksIDAsIDAgfSwJLyogRjFfNTI2MF81MjgwICovCisKKwl7IDUyNjAsIDUzMjAsIDE4LCAwLCAyMCwgMjAsIERGU19GQ0MzIHwgREZTX0VUU0ksIFBTQ0FOX0ZDQyB8IFBTQ0FOX0VUU0ksIDAsIDAgfSwJLyogRjFfNTI2MF81MzIwICovCisKKwl7IDUyNjAsIDUzMjAsIDIwLCAwLCAyMCwgMjAsIERGU19GQ0MzIHwgREZTX0VUU0kgfCBERlNfTUtLNCwgUFNDQU5fRkNDIHwgUFNDQU5fRVRTSSB8IFBTQ0FOX01LSzMgLCAwLCAwIH0sCisJCQkJCQkJCQkJCS8qIEYyXzUyNjBfNTMyMCAqLworCisJeyA1MjYwLCA1MzIwLCAyMCwgNiwgMjAsIDIwLCBERlNfRkNDMyB8IERGU19FVFNJLCBQU0NBTl9GQ0MsIDIsIDAgfSwJLyogRjNfNTI2MF81MzIwICovCisJeyA1MjYwLCA1MzIwLCAyMywgNiwgMjAsIDIwLCBERlNfRkNDMyB8IERGU19FVFNJLCBQU0NBTl9GQ0MsIDIsIDAgfSwJLyogRjRfNTI2MF81MzIwICovCisJeyA1MjYwLCA1MzIwLCAyMywgNiwgMjAsIDIwLCBERlNfRkNDMyB8IERGU19FVFNJLCBQU0NBTl9GQ0MsIDAsIDAgfSwJLyogRjVfNTI2MF81MzIwICovCisJeyA1MjYwLCA1MzIwLCAzMCwgMCwgMjAsIDIwLCBOT19ERlMsIE5PX1BTQ0FOLCAwLCAwIH0sCQkJCS8qIEY2XzUyNjBfNTMyMCAqLworCXsgNTI2MCwgNTMyMCwgMTcsIDYsIDIwLCAyMCwgREZTX0VUU0ksIFBTQ0FOX0VUU0ksIDAsIDAgfSwJCQkJLyogRjdfNTI2MF81MzIwICovCisKKwl7IDUyNjAsIDU3MDAsIDUsICA2LCAyMCwgMjAsIERGU19GQ0MzIHwgREZTX0VUU0ksIE5PX1BTQ0FOLCAwLCAwIH0sCQkvKiBGMV81MjYwXzU3MDAgKi8KKworCXsgNTI4MCwgNTMyMCwgMTcsIDYsIDIwLCAyMCwgREZTX0ZDQzMgfCBERlNfRVRTSSwgUFNDQU5fRkNDLCAwLCAwIH0sCS8qIEYxXzUyODBfNTMyMCAqLworCisgICAgeyA1NTAwLCA1NTgwLCAyMywgNiwgMjAsIDIwLCBERlNfRkNDMywgUFNDQU5fRkNDLCAwfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGMV81NTAwXzU1ODAgKi8KKworCXsgNTUwMCwgNTYyMCwgMzAsIDYsIDIwLCAyMCwgREZTX0VUU0ksIFBTQ0FOX0VUU0ksIDAsIDAgfSwJCQkJLyogRjFfNTUwMF81NjIwICovCisKKwl7IDU1MDAsIDU3MDAsIDIwLCA2LCAyMCwgMjAsIERGU19GQ0MzIHwgREZTX0VUU0ksIFBTQ0FOX0ZDQywgNCwgMCB9LAkJLyogRjFfNTUwMF81NzAwICovCisJeyA1NTAwLCA1NzAwLCAyNywgMCwgMjAsIDIwLCBERlNfRkNDMyB8IERGU19FVFNJLCBQU0NBTl9GQ0MgfCBQU0NBTl9FVFNJLCAwLCAwIH0sCS8qIEYyXzU1MDBfNTcwMCAqLworCXsgNTUwMCwgNTcwMCwgMzAsIDAsIDIwLCAyMCwgREZTX0ZDQzMgfCBERlNfRVRTSSwgUFNDQU5fRkNDIHwgUFNDQU5fRVRTSSwgMCwgMCB9LAkvKiBGM181NTAwXzU3MDAgKi8KKwl7IDU1MDAsIDU3MDAsIDIwLCAwLCAyMCwgMjAsIERGU19GQ0MzIHwgREZTX0VUU0kgfCBERlNfTUtLNCwgUFNDQU5fTUtLMyB8IFBTQ0FOX0ZDQywgMCwgMCB9LAorCQkJCQkJCQkJCQkvKiBGNF81NTAwXzU3MDAgKi8KKworICAgIHsgNTY2MCwgNTcwMCwgMjMsIDYsIDIwLCAyMCwgREZTX0ZDQzMsIFBTQ0FOX0ZDQywgMH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRjFfNTY2MF81NzAwICovCisKKwl7IDU3NDUsIDU4MDUsIDIzLCAwLCAyMCwgMjAsIE5PX0RGUywgTk9fUFNDQU4sIDAsIDAgfSwJCQkJLyogRjFfNTc0NV81ODA1ICovCisJeyA1NzQ1LCA1ODA1LCAzMCwgNiwgMjAsIDIwLCBOT19ERlMsIE5PX1BTQ0FOLCAwLCAwIH0sCQkJCS8qIEYyXzU3NDVfNTgwNSAqLworCXsgNTc0NSwgNTgwNSwgMzAsIDYsIDIwLCAyMCwgREZTX0VUU0ksIFBTQ0FOX0VUU0ksIDAsIDAgfSwJCQkJLyogRjNfNTc0NV81ODA1ICovCisJeyA1NzQ1LCA1ODI1LCA1LCAgNiwgMjAsIDIwLCBOT19ERlMsIE5PX1BTQ0FOLCAwLCAwIH0sCQkJCS8qIEYxXzU3NDVfNTgyNSAqLworCXsgNTc0NSwgNTgyNSwgMTcsIDAsIDIwLCAyMCwgTk9fREZTLCBOT19QU0NBTiwgMCwgMCB9LAkJCQkvKiBGMl81NzQ1XzU4MjUgKi8KKwl7IDU3NDUsIDU4MjUsIDIwLCAwLCAyMCwgMjAsIERGU19FVFNJLCBOT19QU0NBTiwgMCwgMCB9LAkJCQkvKiBGM181NzQ1XzU4MjUgKi8KKwl7IDU3NDUsIDU4MjUsIDMwLCAwLCAyMCwgMjAsIE5PX0RGUywgTk9fUFNDQU4sIDAsIDAgfSwJCQkJLyogRjRfNTc0NV81ODI1ICovCisJeyA1NzQ1LCA1ODI1LCAzMCwgNiwgMjAsIDIwLCBOT19ERlMsIE5PX1BTQ0FOLCAzLCAwIH0sCQkJLyogRjVfNTc0NV81ODI1ICovCisJeyA1NzQ1LCA1ODI1LCAzMCwgNiwgMjAsIDIwLCBOT19ERlMsIE5PX1BTQ0FOLCAwLCAwIH0sCQkJCS8qIEY2XzU3NDVfNTgyNSAqLworCisJLyoKKwkgKiBCZWxvdyBhcmUgdGhlIHdvcmxkIHJvYW1pbmcgY2hhbm5lbHMKKwkgKiBBbGwgV1dSIGRvbWFpbnMgaGF2ZSBubyBwb3dlciBsaW1pdCwgaW5zdGVhZCB1c2UgdGhlIGNhcmQncyBDVEwKKwkgKiBvciBtYXggcG93ZXIgc2V0dGluZ3MuCisJICovCisJeyA0OTIwLCA0OTgwLCAzMCwgMCwgMjAsIDIwLCBOT19ERlMsIFBTQ0FOX1dXUiwgMCwgMCB9LAkJCQkvKiBXMV80OTIwXzQ5ODAgKi8KKwl7IDUwNDAsIDUwODAsIDMwLCAwLCAyMCwgMjAsIE5PX0RGUywgUFNDQU5fV1dSLCAwIH0sCQkJCS8qIFcxXzUwNDBfNTA4MCAqLworCXsgNTE3MCwgNTIzMCwgMzAsIDAsIDIwLCAyMCwgREZTX0ZDQzMgfCBERlNfRVRTSSwgUFNDQU5fV1dSLCAwLCAwIH0sCQkvKiBXMV81MTcwXzUyMzAgKi8KKwl7IDUxODAsIDUyNDAsIDMwLCAwLCAyMCwgMjAsIERGU19GQ0MzIHwgREZTX0VUU0ksIFBTQ0FOX1dXUiwgMCwgMCB9LAkJLyogVzFfNTE4MF81MjQwICovCisJeyA1MjYwLCA1MzIwLCAzMCwgMCwgMjAsIDIwLCBERlNfRkNDMyB8IERGU19FVFNJLCBQU0NBTl9XV1IsIDAsIDAgfSwJCS8qIFcxXzUyNjBfNTMyMCAqLworCXsgNTc0NSwgNTgyNSwgMzAsIDAsIDIwLCAyMCwgTk9fREZTLCBQU0NBTl9XV1IsIDAsIDAgfSwJCQkJLyogVzFfNTc0NV81ODI1ICovCisJeyA1NTAwLCA1NzAwLCAzMCwgMCwgMjAsIDIwLCBERlNfRkNDMyB8IERGU19FVFNJLCBQU0NBTl9XV1IsIDAsIDAgfSwJCS8qIFcxXzU1MDBfNTcwMCAqLworCXsgNTI2MCwgNTMyMCwgMzAsIDAsIDIwLCAyMCwgTk9fREZTLCBOT19QU0NBTiwgIDAsIDAgfSwJCQkJLyogVzJfNTI2MF81MzIwICovCisJeyA1MTgwLCA1MjQwLCAzMCwgMCwgMjAsIDIwLCBOT19ERlMsIE5PX1BTQ0FOLCAgMCwgMCB9LAkJCQkvKiBXMl81MTgwXzUyNDAgKi8KKwl7IDU4MjUsIDU4MjUsIDMwLCAwLCAyMCwgMjAsIE5PX0RGUywgUFNDQU5fV1dSLCAwLCAwIH0sCQkJCS8qIFcyXzU4MjVfNTgyNSAqLworfTsKKy8qCisgKiA1R0h6IFR1cmJvIChkeW5hbWljICYgc3RhdGljKSB0YWdzCisgKi8KKworZW51bSB7CisJVDFfNTEzMF81MjEwLAorCVQxXzUyNTBfNTMzMCwKKwlUMV81MzcwXzU0OTAsCisJVDFfNTUzMF81NjUwLAorCisJVDFfNTE1MF81MTkwLAorCVQxXzUyMzBfNTMxMCwKKwlUMV81MzUwXzU0NzAsCisJVDFfNTUxMF81NjcwLAorCisJVDFfNTIwMF81MjQwLAorCVQyXzUyMDBfNTI0MCwKKwlUMV81MjEwXzUyMTAsCisJVDJfNTIxMF81MjEwLAorCisJVDFfNTI4MF81MjgwLAorCVQyXzUyODBfNTI4MCwKKwlUMV81MjUwXzUyNTAsCisJVDFfNTI5MF81MjkwLAorCVQxXzUyNTBfNTI5MCwKKwlUMl81MjUwXzUyOTAsCisKKwlUMV81NTQwXzU2NjAsCisJVDFfNTc2MF81ODAwLAorCVQyXzU3NjBfNTgwMCwKKworCVQxXzU3NjVfNTgwNSwKKworCVdUMV81MjEwXzUyNTAsCisJV1QxXzUyOTBfNTI5MCwKKwlXVDFfNTU0MF81NjYwLAorCVdUMV81NzYwXzU4MDAsCit9OworCitzdGF0aWMgUkVHX0RNTl9GUkVRX0JBTkQgcmVnRG1uNUdoelR1cmJvRnJlcVtdID0geworCXsgNTEzMCwgNTIxMCwgNSwgIDYsIDQwLCA0MCwgTk9fREZTLCBOT19QU0NBTiwgMCwgMH0sCS8qIFQxXzUxMzBfNTIxMCAqLworCXsgNTI1MCwgNTMzMCwgNSwgIDYsIDQwLCA0MCwgREZTX0ZDQzMsIE5PX1BTQ0FOLCAwLCAwfSwJLyogVDFfNTI1MF81MzMwICovCisJeyA1MzcwLCA1NDkwLCA1LCAgNiwgNDAsIDQwLCBOT19ERlMsIE5PX1BTQ0FOLCAwLCAwfSwJLyogVDFfNTM3MF81NDkwICovCisJeyA1NTMwLCA1NjUwLCA1LCAgNiwgNDAsIDQwLCBERlNfRkNDMywgTk9fUFNDQU4sIDAsIDB9LAkvKiBUMV81NTMwXzU2NTAgKi8KKworCXsgNTE1MCwgNTE5MCwgNSwgIDYsIDQwLCA0MCwgTk9fREZTLCBOT19QU0NBTiwgMCwgMH0sCS8qIFQxXzUxNTBfNTE5MCAqLworCXsgNTIzMCwgNTMxMCwgNSwgIDYsIDQwLCA0MCwgREZTX0ZDQzMsIE5PX1BTQ0FOLCAwLCAwfSwJLyogVDFfNTIzMF81MzEwICovCisJeyA1MzUwLCA1NDcwLCA1LCAgNiwgNDAsIDQwLCBOT19ERlMsIE5PX1BTQ0FOLCAwLCAwfSwJLyogVDFfNTM1MF81NDcwICovCisJeyA1NTEwLCA1NjcwLCA1LCAgNiwgNDAsIDQwLCBERlNfRkNDMywgTk9fUFNDQU4sIDAsIDB9LAkvKiBUMV81NTEwXzU2NzAgKi8KKworCXsgNTIwMCwgNTI0MCwgMTcsIDYsIDQwLCA0MCwgTk9fREZTLCBOT19QU0NBTiwgMCwgMH0sCS8qIFQxXzUyMDBfNTI0MCAqLworCXsgNTIwMCwgNTI0MCwgMjMsIDYsIDQwLCA0MCwgTk9fREZTLCBOT19QU0NBTiwgMCwgMH0sCS8qIFQyXzUyMDBfNTI0MCAqLworCXsgNTIxMCwgNTIxMCwgMTcsIDYsIDQwLCA0MCwgTk9fREZTLCBOT19QU0NBTiwgMCwgMH0sCS8qIFQxXzUyMTBfNTIxMCAqLworCXsgNTIxMCwgNTIxMCwgMjMsIDAsIDQwLCA0MCwgTk9fREZTLCBOT19QU0NBTiwgMCwgMH0sCS8qIFQyXzUyMTBfNTIxMCAqLworCisJeyA1MjgwLCA1MjgwLCAyMywgNiwgNDAsIDQwLCBERlNfRkNDMywgUFNDQU5fRkNDX1QsIDAsIDB9LAkvKiBUMV81MjgwXzUyODAgKi8KKwl7IDUyODAsIDUyODAsIDIwLCA2LCA0MCwgNDAsIERGU19GQ0MzLCBQU0NBTl9GQ0NfVCwgMCwgMH0sCS8qIFQyXzUyODBfNTI4MCAqLworCXsgNTI1MCwgNTI1MCwgMTcsIDAsIDQwLCA0MCwgREZTX0ZDQzMsIFBTQ0FOX0ZDQ19ULCAwLCAwfSwJLyogVDFfNTI1MF81MjUwICovCisJeyA1MjkwLCA1MjkwLCAyMCwgMCwgNDAsIDQwLCBERlNfRkNDMywgUFNDQU5fRkNDX1QsIDAsIDB9LAkvKiBUMV81MjkwXzUyOTAgKi8KKwl7IDUyNTAsIDUyOTAsIDIwLCAwLCA0MCwgNDAsIERGU19GQ0MzLCBQU0NBTl9GQ0NfVCwgMCwgMH0sCS8qIFQxXzUyNTBfNTI5MCAqLworCXsgNTI1MCwgNTI5MCwgMjMsIDYsIDQwLCA0MCwgREZTX0ZDQzMsIFBTQ0FOX0ZDQ19ULCAwLCAwfSwJLyogVDJfNTI1MF81MjkwICovCisKKwl7IDU1NDAsIDU2NjAsIDIwLCA2LCA0MCwgNDAsIERGU19GQ0MzLCBQU0NBTl9GQ0NfVCwgMCwgMH0sCS8qIFQxXzU1NDBfNTY2MCAqLworCXsgNTc2MCwgNTgwMCwgMjAsIDAsIDQwLCA0MCwgTk9fREZTLCBOT19QU0NBTiwgMCwgMH0sCS8qIFQxXzU3NjBfNTgwMCAqLworCXsgNTc2MCwgNTgwMCwgMzAsIDYsIDQwLCA0MCwgTk9fREZTLCBOT19QU0NBTiwgMCwgMH0sCS8qIFQyXzU3NjBfNTgwMCAqLworCisJeyA1NzY1LCA1ODA1LCAzMCwgNiwgNDAsIDQwLCBOT19ERlMsIE5PX1BTQ0FOLCAwLCAwfSwJLyogVDFfNTc2NV81ODA1ICovCisKKwkvKgorCSAqIEJlbG93IGFyZSB0aGUgV1dSIGZyZXF1ZW5jaWVzCisJICovCisKKwl7IDUyMTAsIDUyNTAsIDE1LCAwLCA0MCwgNDAsIERGU19GQ0MzIHwgREZTX0VUU0ksIFBTQ0FOX1dXUiwgMCwgMH0sIC8qIFdUMV81MjEwXzUyNTAgKi8KKwl7IDUyOTAsIDUyOTAsIDE4LCAwLCA0MCwgNDAsIERGU19GQ0MzIHwgREZTX0VUU0ksIFBTQ0FOX1dXUiwgMCwgMH0sIC8qIFdUMV81MjkwXzUyOTAgKi8KKwl7IDU1NDAsIDU2NjAsIDIwLCAwLCA0MCwgNDAsIERGU19GQ0MzIHwgREZTX0VUU0ksIFBTQ0FOX1dXUiwgMCwgMH0sIC8qIFdUMV81NTQwXzU2NjAgKi8KKwl7IDU3NjAsIDU4MDAsIDIwLCAwLCA0MCwgNDAsIE5PX0RGUywgUFNDQU5fV1dSLCAwLCAwfSwJLyogV1QxXzU3NjBfNTgwMCAqLworfTsKKworLyoKKyAqIDJHSHogMTFiIGNoYW5uZWwgdGFncworICovCitlbnVtIHsKKwlGMV8yMzEyXzIzNzIsCisJRjJfMjMxMl8yMzcyLAorCisJRjFfMjQxMl8yNDcyLAorCUYyXzI0MTJfMjQ3MiwKKwlGM18yNDEyXzI0NzIsCisKKwlGMV8yNDEyXzI0NjIsCisJRjJfMjQxMl8yNDYyLAorCisJRjFfMjQzMl8yNDQyLAorCisJRjFfMjQ1N18yNDcyLAorCisJRjFfMjQ2N18yNDcyLAorCisJRjFfMjQ4NF8yNDg0LAorCUYyXzI0ODRfMjQ4NCwKKworCUYxXzI1MTJfMjczMiwKKworCVcxXzIzMTJfMjM3MiwKKwlXMV8yNDEyXzI0MTIsCisJVzFfMjQxN18yNDMyLAorCVcxXzI0MzdfMjQ0MiwKKwlXMV8yNDQ3XzI0NTcsCisJVzFfMjQ2Ml8yNDYyLAorCVcxXzI0NjdfMjQ2NywKKwlXMl8yNDY3XzI0NjcsCisJVzFfMjQ3Ml8yNDcyLAorCVcyXzI0NzJfMjQ3MiwKKwlXMV8yNDg0XzI0ODQsCisJVzJfMjQ4NF8yNDg0LAorfTsKKworc3RhdGljIFJFR19ETU5fRlJFUV9CQU5EIHJlZ0RtbjJHaHpGcmVxW10gPSB7CisJeyAyMzEyLCAyMzcyLCA1LCAgNiwgMjAsIDUsIE5PX0RGUywgTk9fUFNDQU4sIDAsIDB9LAkvKiBGMV8yMzEyXzIzNzIgKi8KKwl7IDIzMTIsIDIzNzIsIDIwLCAwLCAyMCwgNSwgTk9fREZTLCBOT19QU0NBTiwgMCwgMH0sCS8qIEYyXzIzMTJfMjM3MiAqLworCisJeyAyNDEyLCAyNDcyLCA1LCAgNiwgMjAsIDUsIE5PX0RGUywgTk9fUFNDQU4sIDAsIDB9LAkvKiBGMV8yNDEyXzI0NzIgKi8KKwl7IDI0MTIsIDI0NzIsIDIwLCAwLCAyMCwgNSwgTk9fREZTLCBQU0NBTl9NS0tBLCAwLCAwfSwJLyogRjJfMjQxMl8yNDcyICovCisJeyAyNDEyLCAyNDcyLCAzMCwgMCwgMjAsIDUsIE5PX0RGUywgTk9fUFNDQU4sIDAsIDB9LAkvKiBGM18yNDEyXzI0NzIgKi8KKworCXsgMjQxMiwgMjQ2MiwgMjcsIDYsIDIwLCA1LCBOT19ERlMsIE5PX1BTQ0FOLCAwLCAwfSwJLyogRjFfMjQxMl8yNDYyICovCisJeyAyNDEyLCAyNDYyLCAyMCwgMCwgMjAsIDUsIE5PX0RGUywgUFNDQU5fTUtLQSwgMCwgMH0sCS8qIEYyXzI0MTJfMjQ2MiAqLworCXsgMjQzMiwgMjQ0MiwgMjAsIDAsIDIwLCA1LCBOT19ERlMsIE5PX1BTQ0FOLCAwLCAwfSwJLyogRjFfMjQzMl8yNDQyICovCisKKwl7IDI0NTcsIDI0NzIsIDIwLCAwLCAyMCwgNSwgTk9fREZTLCBOT19QU0NBTiwgMCwgMH0sCS8qIEYxXzI0NTdfMjQ3MiAqLworCisJeyAyNDY3LCAyNDcyLCAyMCwgMCwgMjAsIDUsIE5PX0RGUywgUFNDQU5fTUtLQTIgfCBQU0NBTl9NS0tBLCAwLCAwfSwgLyogRjFfMjQ2N18yNDcyICovCisKKwl7IDI0ODQsIDI0ODQsIDUsICA2LCAyMCwgNSwgTk9fREZTLCBOT19QU0NBTiwgMCwgMH0sCS8qIEYxXzI0ODRfMjQ4NCAqLworCXsgMjQ4NCwgMjQ4NCwgMjAsIDAsIDIwLCA1LCBOT19ERlMsIFBTQ0FOX01LS0EgfCBQU0NBTl9NS0tBMSB8IFBTQ0FOX01LS0EyLCAwLCAwfSwJLyogRjJfMjQ4NF8yNDg0ICovCisKKwl7IDI1MTIsIDI3MzIsIDUsICA2LCAyMCwgNSwgTk9fREZTLCBOT19QU0NBTiwgMCwgMH0sCS8qIEYxXzI1MTJfMjczMiAqLworCisJLyoKKwkgKiBXV1IgaGF2ZSBwb3dlcnMgb3BlbmVkIHVwIHRvIDIwZEJtLiAgTGltaXRzIHNob3VsZCBvZnRlbiBjb21lIGZyb20gQ1RML01heCBwb3dlcnMKKwkgKi8KKworCXsgMjMxMiwgMjM3MiwgMjAsIDAsIDIwLCA1LCBOT19ERlMsIE5PX1BTQ0FOLCAwLCAwfSwJLyogVzFfMjMxMl8yMzcyICovCisJeyAyNDEyLCAyNDEyLCAyMCwgMCwgMjAsIDUsIE5PX0RGUywgTk9fUFNDQU4sIDAsIDB9LAkvKiBXMV8yNDEyXzI0MTIgKi8KKwl7IDI0MTcsIDI0MzIsIDIwLCAwLCAyMCwgNSwgTk9fREZTLCBOT19QU0NBTiwgMCwgMH0sCS8qIFcxXzI0MTdfMjQzMiAqLworCXsgMjQzNywgMjQ0MiwgMjAsIDAsIDIwLCA1LCBOT19ERlMsIE5PX1BTQ0FOLCAwLCAwfSwJLyogVzFfMjQzN18yNDQyICovCisJeyAyNDQ3LCAyNDU3LCAyMCwgMCwgMjAsIDUsIE5PX0RGUywgTk9fUFNDQU4sIDAsIDB9LAkvKiBXMV8yNDQ3XzI0NTcgKi8KKwl7IDI0NjIsIDI0NjIsIDIwLCAwLCAyMCwgNSwgTk9fREZTLCBOT19QU0NBTiwgMCwgMH0sCS8qIFcxXzI0NjJfMjQ2MiAqLworCXsgMjQ2NywgMjQ2NywgMjAsIDAsIDIwLCA1LCBOT19ERlMsIFBTQ0FOX1dXUiB8IElTX0VDTV9DSEFOLCAwLCAwfSwgLyogVzFfMjQ2N18yNDY3ICovCisJeyAyNDY3LCAyNDY3LCAyMCwgMCwgMjAsIDUsIE5PX0RGUywgTk9fUFNDQU4gfCBJU19FQ01fQ0hBTiwgMCwgMH0sCS8qIFcyXzI0NjdfMjQ2NyAqLworCXsgMjQ3MiwgMjQ3MiwgMjAsIDAsIDIwLCA1LCBOT19ERlMsIFBTQ0FOX1dXUiB8IElTX0VDTV9DSEFOLCAwLCAwfSwgLyogVzFfMjQ3Ml8yNDcyICovCisJeyAyNDcyLCAyNDcyLCAyMCwgMCwgMjAsIDUsIE5PX0RGUywgTk9fUFNDQU4gfCBJU19FQ01fQ0hBTiwgMCwgMH0sCS8qIFcyXzI0NzJfMjQ3MiAqLworCXsgMjQ4NCwgMjQ4NCwgMjAsIDAsIDIwLCA1LCBOT19ERlMsIFBTQ0FOX1dXUiB8IElTX0VDTV9DSEFOLCAwLCAwfSwgLyogVzFfMjQ4NF8yNDg0ICovCisJeyAyNDg0LCAyNDg0LCAyMCwgMCwgMjAsIDUsIE5PX0RGUywgTk9fUFNDQU4gfCBJU19FQ01fQ0hBTiwgMCwgMH0sCS8qIFcyXzI0ODRfMjQ4NCAqLworfTsKKworCisvKgorICogMkdIeiAxMWcgY2hhbm5lbCB0YWdzCisgKi8KKworZW51bSB7CisJRzFfMjMxMl8yMzcyLAorCUcyXzIzMTJfMjM3MiwKKworCUcxXzI0MTJfMjQ3MiwKKwlHMl8yNDEyXzI0NzIsCisJRzNfMjQxMl8yNDcyLAorCisJRzFfMjQxMl8yNDYyLAorCUcyXzI0MTJfMjQ2MiwKKworCUcxXzI0MzJfMjQ0MiwKKworCUcxXzI0NTdfMjQ3MiwKKworCUcxXzI1MTJfMjczMiwKKworCUcxXzI0NjdfMjQ3MiAsCisKKwlXRzFfMjMxMl8yMzcyLAorCVdHMV8yNDEyXzI0MTIsCisJV0cxXzI0MTdfMjQzMiwKKwlXRzFfMjQzN18yNDQyLAorCVdHMV8yNDQ3XzI0NTcsCisJV0cxXzI0NjJfMjQ2MiwKKwlXRzFfMjQ2N18yNDY3LAorCVdHMl8yNDY3XzI0NjcsCisJV0cxXzI0NzJfMjQ3MiwKKwlXRzJfMjQ3Ml8yNDcyLAorCit9Oworc3RhdGljIFJFR19ETU5fRlJFUV9CQU5EIHJlZ0RtbjJHaHoxMWdGcmVxW10gPSB7CisJeyAyMzEyLCAyMzcyLCA1LCAgNiwgMjAsIDUsIE5PX0RGUywgTk9fUFNDQU4sIDAsIDB9LAkvKiBHMV8yMzEyXzIzNzIgKi8KKwl7IDIzMTIsIDIzNzIsIDIwLCAwLCAyMCwgNSwgTk9fREZTLCBOT19QU0NBTiwgMCwgMH0sCS8qIEcyXzIzMTJfMjM3MiAqLworCisJeyAyNDEyLCAyNDcyLCA1LCAgNiwgMjAsIDUsIE5PX0RGUywgTk9fUFNDQU4sIDAsIDB9LAkvKiBHMV8yNDEyXzI0NzIgKi8KKwl7IDI0MTIsIDI0NzIsIDIwLCAwLCAyMCwgNSwgIE5PX0RGUywgUFNDQU5fTUtLQV9HLCAwLCAwfSwJLyogRzJfMjQxMl8yNDcyICovCisJeyAyNDEyLCAyNDcyLCAzMCwgMCwgMjAsIDUsIE5PX0RGUywgTk9fUFNDQU4sIDAsIDB9LAkvKiBHM18yNDEyXzI0NzIgKi8KKworCXsgMjQxMiwgMjQ2MiwgMjcsIDYsIDIwLCA1LCBOT19ERlMsIE5PX1BTQ0FOLCAwLCAwfSwJLyogRzFfMjQxMl8yNDYyICovCisJeyAyNDEyLCAyNDYyLCAyMCwgMCwgMjAsIDUsIE5PX0RGUywgUFNDQU5fTUtLQV9HLCAwLCAwfSwJLyogRzJfMjQxMl8yNDYyICovCisJeyAyNDMyLCAyNDQyLCAyMCwgMCwgMjAsIDUsIE5PX0RGUywgTk9fUFNDQU4sIDAsIDB9LAkvKiBHMV8yNDMyXzI0NDIgKi8KKworCXsgMjQ1NywgMjQ3MiwgMjAsIDAsIDIwLCA1LCBOT19ERlMsIE5PX1BTQ0FOLCAwLCAwfSwJLyogRzFfMjQ1N18yNDcyICovCisKKwl7IDI1MTIsIDI3MzIsIDUsICA2LCAyMCwgNSwgTk9fREZTLCBOT19QU0NBTiwgMCwgMH0sCS8qIEcxXzI1MTJfMjczMiAqLworCisJeyAyNDY3LCAyNDcyLCAyMCwgMCwgMjAsIDUsIE5PX0RGUywgUFNDQU5fTUtLQTIgfCBQU0NBTl9NS0tBLCAwLCAwIH0sIC8qIEcxXzI0NjdfMjQ3MiAqLworCisJLyoKKwkgKiBXV1Igb3BlbiB1cCB0aGUgcG93ZXIgdG8gMjBkQm0KKwkgKi8KKworCXsgMjMxMiwgMjM3MiwgMjAsIDAsIDIwLCA1LCBOT19ERlMsIE5PX1BTQ0FOLCAwLCAwfSwJLyogV0cxXzIzMTJfMjM3MiAqLworCXsgMjQxMiwgMjQxMiwgMjAsIDAsIDIwLCA1LCBOT19ERlMsIE5PX1BTQ0FOLCAwLCAwfSwJLyogV0cxXzI0MTJfMjQxMiAqLworCXsgMjQxNywgMjQzMiwgMjAsIDAsIDIwLCA1LCBOT19ERlMsIE5PX1BTQ0FOLCAwLCAwfSwJLyogV0cxXzI0MTdfMjQzMiAqLworCXsgMjQzNywgMjQ0MiwgMjAsIDAsIDIwLCA1LCBOT19ERlMsIE5PX1BTQ0FOLCAwLCAwfSwJLyogV0cxXzI0MzdfMjQ0MiAqLworCXsgMjQ0NywgMjQ1NywgMjAsIDAsIDIwLCA1LCBOT19ERlMsIE5PX1BTQ0FOLCAwLCAwfSwJLyogV0cxXzI0NDdfMjQ1NyAqLworCXsgMjQ2MiwgMjQ2MiwgMjAsIDAsIDIwLCA1LCBOT19ERlMsIE5PX1BTQ0FOLCAwLCAwfSwJLyogV0cxXzI0NjJfMjQ2MiAqLworCXsgMjQ2NywgMjQ2NywgMjAsIDAsIDIwLCA1LCBOT19ERlMsIFBTQ0FOX1dXUiB8IElTX0VDTV9DSEFOLCAwLCAwfSwgLyogV0cxXzI0NjdfMjQ2NyAqLworCXsgMjQ2NywgMjQ2NywgMjAsIDAsIDIwLCA1LCBOT19ERlMsIE5PX1BTQ0FOIHwgSVNfRUNNX0NIQU4sIDAsIDB9LAkvKiBXRzJfMjQ2N18yNDY3ICovCisJeyAyNDcyLCAyNDcyLCAyMCwgMCwgMjAsIDUsIE5PX0RGUywgUFNDQU5fV1dSIHwgSVNfRUNNX0NIQU4sIDAsIDB9LCAvKiBXRzFfMjQ3Ml8yNDcyICovCisJeyAyNDcyLCAyNDcyLCAyMCwgMCwgMjAsIDUsIE5PX0RGUywgTk9fUFNDQU4gfCBJU19FQ01fQ0hBTiwgMCwgMH0sCS8qIFdHMl8yNDcyXzI0NzIgKi8KK307CisvKgorICogMkdIeiBEeW5hbWljIHR1cmJvIHRhZ3MKKyAqLworCitlbnVtIHsKKwlUMV8yMzEyXzIzNzIsCisJVDFfMjQzN18yNDM3LAorCVQyXzI0MzdfMjQzNywKKwlUM18yNDM3XzI0MzcsCisJVDFfMjUxMl8yNzMyCit9OworCitzdGF0aWMgUkVHX0RNTl9GUkVRX0JBTkQgcmVnRG1uMkdoejExZ1R1cmJvRnJlcVtdID0geworCXsgMjMxMiwgMjM3MiwgNSwgIDYsIDQwLCA0MCwgTk9fREZTLCBOT19QU0NBTiwgMCwgMH0sICAvKiBUMV8yMzEyXzIzNzIgKi8KKwl7IDI0MzcsIDI0MzcsIDUsICA2LCA0MCwgNDAsIE5PX0RGUywgTk9fUFNDQU4sIDAsIDB9LCAgLyogVDFfMjQzN18yNDM3ICovCisJeyAyNDM3LCAyNDM3LCAyMCwgNiwgNDAsIDQwLCBOT19ERlMsIE5PX1BTQ0FOLCAwLCAwfSwgIC8qIFQyXzI0MzdfMjQzNyAqLworCXsgMjQzNywgMjQzNywgMTgsIDYsIDQwLCA0MCwgTk9fREZTLCBQU0NBTl9XV1IsIDAsIDB9LCAvKiBUM18yNDM3XzI0MzcgKi8KKwl7IDI1MTIsIDI3MzIsIDUsICA2LCA0MCwgNDAsIE5PX0RGUywgTk9fUFNDQU4sIDAsIDB9LCAgLyogVDFfMjUxMl8yNzMyICovCit9OworCisKKworLyoKKyAqIDJHSHogMTFuIGZyZXF1ZW5jeSB0YWdzCisgKi8KK2VudW0geworICAgIE5HMV8yNDIyXzI0NTIsCisgICAgTkcyXzI0MjJfMjQ1MiwKKyAgICBORzNfMjQyMl8yNDUyLAorCisgICAgTkdfREVNT19BTExfQ0hBTk5FTFMsCit9OworCitzdGF0aWMgUkVHX0RNTl9GUkVRX0JBTkQgcmVnRG1uMkdoejExbmdGcmVxW10gPSB7CisgICAgeyAyNDIyLCAyNDUyLCAyMCwgMCwgNDAsIDUsIE5PX0RGUywgTk9fUFNDQU4sIDAsIDB9LCAgICAvKiBORzFfMjQyMl8yNDUyICovCisgICAgeyAyNDIyLCAyNDUyLCAyNywgMCwgNDAsIDUsIE5PX0RGUywgTk9fUFNDQU4sIDAsIDB9LCAgICAvKiBORzJfMjQyMl8yNDUyICovCisgICAgeyAyNDIyLCAyNDUyLCAzMCwgMCwgNDAsIDUsIE5PX0RGUywgTk9fUFNDQU4sIDAsIDB9LCAgICAvKiBORzNfMjQyMl8yNDUyICovCisKKwl7IDIzMTIsIDI3MzIsIDI3LCA2LCAyMCwgNSwgTk9fREZTLCBOT19QU0NBTiwgMCwgMH0sICAgIC8qIE5HX0RFTU9fQUxMX0NIQU5ORUxTICovCit9OworCisKKy8qCisgKiA1R0h6IDExbiBmcmVxdWVuY3kgdGFncworICovCitlbnVtIHsKKyAgICBOQTFfNTE5MF81MjMwLAorICAgIE5BMl81MTkwXzUyMzAsCisgICAgTkEzXzUxOTBfNTIzMCwKKyAgICBOQTRfNTE5MF81MjMwLAorICAgIE5BNV81MTkwXzUyMzAsCisKKyAgICBOQTFfNTI3MF81MjcwLAorCisgICAgTkExXzUyNzBfNTMxMCwKKyAgICBOQTJfNTI3MF81MzEwLAorICAgIE5BM181MjcwXzUzMTAsCisgICAgTkE0XzUyNzBfNTMxMCwKKworICAgIE5BMV81MzEwXzUzMTAsCisKKyAgICBOQTFfNTUxMF81NjMwLAorCisgICAgTkExXzU1MTBfNTY3MCwKKyAgICBOQTJfNTUxMF81NjcwLAorICAgIE5BM181NTEwXzU2NzAsCisKKyAgICBOQTFfNTc1NV81Nzk1LAorICAgIE5BMl81NzU1XzU3OTUsCisgICAgTkEzXzU3NTVfNTc5NSwKKyAgICBOQTRfNTc1NV81Nzk1LAorICAgIE5BNV81NzU1XzU3OTUsCisKKyAgICBOQTFfNTc5NV81Nzk1LAorCisgICAgTkFfREVNT19BTExfQ0hBTk5FTFMsCit9OworCitzdGF0aWMgUkVHX0RNTl9GUkVRX0JBTkQgcmVnRG1uNUdoejExbmFGcmVxW10gPSB7CisgICAgLyoKKyAgICAgKiBUb0RvOiBUaGlzIHRhYmxlIG5lZWRzIHRvIGJlIGNvbXBsZXRlbHkgcG9wdWxhdGVkIHdpdGggNUdIeiAxMW4gcHJvcGVydGllcworICAgICAqLworCXsgNTE5MCwgNTIzMCwgMTUsICAwLCA0MCwgNDAsIE5PX0RGUywgTk9fUFNDQU4sIDAsIDB9LAkgICAgLyogTkExXzUxOTBfNTIzMCAqLworCXsgNTE5MCwgNTIzMCwgMTcsICA2LCA0MCwgNDAsIE5PX0RGUywgTk9fUFNDQU4sIDAsIDB9LAkvKiBOQTJfNTE5MF81MjMwICovCisJeyA1MTkwLCA1MjMwLCAxOCwgIDYsIDQwLCA0MCwgTk9fREZTLCBOT19QU0NBTiwgMCwgMH0sCSAgICAvKiBOQTNfNTE5MF81MjMwICovCisJeyA1MTkwLCA1MjMwLCAyMCwgIDAsIDQwLCA0MCwgTk9fREZTLCBOT19QU0NBTiwgMCwgMH0sCS8qIE5BNF81MTkwXzUyMzAgKi8KKwl7IDUxOTAsIDUyMzAsIDIzLCAgNiwgNDAsIDQwLCBOT19ERlMsIE5PX1BTQ0FOLCAwLCAwfSwJICAgIC8qIE5BNV81MTkwXzUyMzAgKi8KKworCXsgNTI3MCwgNTI3MCwgMjMsICA2LCA0MCwgNDAsIERGU19GQ0MzfERGU19FVFNJLCBOT19QU0NBTiwgMCwgMX0sICAvKiBOQTFfNTI3MF81MjcwICovCisKKwl7IDUyNzAsIDUzMTAsIDE4LCAgNiwgNDAsIDQwLCBERlNfRkNDM3xERlNfRVRTSSwgTk9fUFNDQU4sIDAsIDF9LCAgLyogTkExXzUyNzBfNTMxMCAqLworCXsgNTI3MCwgNTMxMCwgMjAsICAwLCA0MCwgNDAsIERGU19GQ0MzfERGU19FVFNJfERGU19NS0s0LCBOT19QU0NBTiwgMCwgMX0sICAvKiBOQTJfNTI3MF81MzEwICovCisJeyA1MjcwLCA1MzEwLCAyMywgIDYsIDQwLCA0MCwgREZTX0ZDQzN8REZTX0VUU0ksIE5PX1BTQ0FOLCAwLCAxfSwgIC8qIE5BM181MjcwXzUzMTAgKi8KKwl7IDUyNzAsIDUzMTAsIDMwLCAgNiwgNDAsIDQwLCBERlNfRkNDM3xERlNfRVRTSSwgTk9fUFNDQU4sIDAsIDF9LCAgLyogTkE0XzUyNzBfNTMxMCAqLworCisJeyA1MzEwLCA1MzEwLCAxNywgIDYsIDQwLCA0MCwgREZTX0ZDQzN8REZTX0VUU0ksIE5PX1BTQ0FOLCAwLCAxfSwgIC8qIE5BMV81MzEwXzUzMTAgKi8KKworCXsgNTUxMCwgNTYzMCwgMzAsICA2LCA0MCwgNDAsIERGU19GQ0MzfERGU19FVFNJLCBOT19QU0NBTiwgMCwgMX0sICAvKiBOQTFfNTUxMF81NjMwICovCisKKwl7IDU1MTAsIDU2NzAsIDIwLCAgNiwgNDAsIDQwLCBERlNfRkNDM3xERlNfRVRTSXxERlNfTUtLNCwgTk9fUFNDQU4sIDAsIDF9LCAgLyogTkExXzU1MTBfNTY3MCAqLworCXsgNTUxMCwgNTY3MCwgMjcsICAwLCA0MCwgNDAsIERGU19GQ0MzfERGU19FVFNJLCBOT19QU0NBTiwgMCwgMX0sICAvKiBOQTJfNTUxMF81NjcwICovCisJeyA1NTEwLCA1NjcwLCAzMCwgIDYsIDQwLCA0MCwgREZTX0ZDQzMsIE5PX1BTQ0FOLCAwLCAxfSwgICAvKiBOQTNfNTUxMF81NjcwICovCisKKwl7IDU3NTUsIDU3OTUsIDE3LCAgMCwgNDAsIDQwLCBOT19ERlMsIE5PX1BTQ0FOLCAwLCAwfSwJICAgIC8qIE5BMV81NzU1XzU3OTUgKi8KKwl7IDU3NTUsIDU3OTUsIDIwLCAgNiwgNDAsIDQwLCBERlNfRVRTSSwgTk9fUFNDQU4sIDAsIDB9LAkgICAgLyogTkEyXzU3NTVfNTc5NSAqLworCXsgNTc1NSwgNTc5NSwgMjMsICAwLCA0MCwgNDAsIE5PX0RGUywgTk9fUFNDQU4sIDAsIDB9LAkgICAgLyogTkEzXzU3NTVfNTc5NSAqLworCXsgNTc1NSwgNTc5NSwgMzAsICAwLCA0MCwgNDAsIE5PX0RGUywgTk9fUFNDQU4sIDAsIDB9LAkvKiBOQTRfNTc1NV81Nzk1ICovCisJeyA1NzU1LCA1Nzk1LCAzMCwgIDYsIDQwLCA0MCwgTk9fREZTLCBOT19QU0NBTiwgMCwgMH0sCSAgICAvKiBOQTVfNTc1NV81Nzk1ICovCisKKwl7IDU3OTUsIDU3OTUsIDMwLCAgNiwgNDAsIDQwLCBOT19ERlMsIE5PX1BTQ0FOLCAwLCAwfSwJICAgIC8qIE5BMV81Nzk1XzU3OTUgKi8KKworICAgIHsgNDkyMCwgNjEwMCwgMzAsICA2LCA0MCwgNDAsIE5PX0RGUywgTk9fUFNDQU4sIDAsIDB9LAkvKiBOQV9ERU1PX0FMTF9DSEFOTkVMUyAqLworfTsKKwordHlwZWRlZiBzdHJ1Y3QgcmVnRG9tYWluIHsKKwl1MTZfdCByZWdEbW5FbnVtOwkvKiB2YWx1ZSBmcm9tIEVudW1SZCB0YWJsZSAqLworCXU4X3QgY29uZm9ybWFuY2VUZXN0TGltaXQ7CisJdTY0X3QgZGZzTWFzazsJLyogREZTIGJpdG1hc2sgZm9yIDVHaHogdGFibGVzICovCisJdTY0X3QgcHNjYW47CS8qIEJpdG1hc2sgZm9yIHBhc3NpdmUgc2NhbiAqLworCXUzMl90IGZsYWdzOwkvKiBSZXF1aXJlbWVudCBmbGFncyAoQWRIb2MgZGlzYWxsb3csIG5vaXNlCisJCQkJICAgZmxvb3IgY2FsIG5lZWRlZCwgZXRjKSAqLworCXU2NF90IGNoYW4xMWFbQk1MRU5dOy8qIDEyOCBiaXQgYml0bWFzayBmb3IgY2hhbm5lbC9iYW5kCisJCQkJICAgc2VsZWN0aW9uICovCisJdTY0X3QgY2hhbjExYV90dXJib1tCTUxFTl07LyogMTI4IGJpdCBiaXRtYXNrIGZvciBjaGFubmVsL2JhbmQKKwkJCQkgICBzZWxlY3Rpb24gKi8KKwl1NjRfdCBjaGFuMTFhX2R5bl90dXJib1tCTUxFTl07IC8qIDEyOCBiaXQgYml0bWFzayBmb3IgY2hhbm5lbC9iYW5kCisJCQkJCSAgICAgICBzZWxlY3Rpb24gKi8KKwl1NjRfdCBjaGFuMTFiW0JNTEVOXTsvKiAxMjggYml0IGJpdG1hc2sgZm9yIGNoYW5uZWwvYmFuZAorCQkJCSAgIHNlbGVjdGlvbiAqLworCXU2NF90IGNoYW4xMWdbQk1MRU5dOy8qIDEyOCBiaXQgYml0bWFzayBmb3IgY2hhbm5lbC9iYW5kCisJCQkJICAgc2VsZWN0aW9uICovCisJdTY0X3QgY2hhbjExZ190dXJib1tCTUxFTl07LyogMTI4IGJpdCBiaXRtYXNrIGZvciBjaGFubmVsL2JhbmQKKwkJCQkJICBzZWxlY3Rpb24gKi8KKwl1NjRfdCBjaGFuMTFuZ1tCTUxFTl07LyogMTI4IGJpdCBiaXRtYXNrIGZvciAxMW4gaW4gMkdIeiAqLworCXU2NF90IGNoYW4xMW5hW0JNTEVOXTsvKiAxMjggYml0IGJpdG1hc2sgZm9yIDExbiBpbiA1R0h6ICovCit9IFJFR19ET01BSU47CisKK3N0YXRpYyBSRUdfRE9NQUlOIHJlZ0RvbWFpbnNbXSA9IHsKKworCXtERUJVR19SRUdfRE1OLCBGQ0MsIE5PX0RGUywgTk9fUFNDQU4sIE5PX1JFUSwKKwkgQk0oRjFfNTEyMF81MjQwLCBGMV81MjYwXzU3MDAsIEYxXzU3NDVfNTgyNSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNKFQxXzUxMzBfNTIxMCwgVDFfNTI1MF81MzMwLCBUMV81MzcwXzU0OTAsIFQxXzU1MzBfNTY1MCwgVDFfNTE1MF81MTkwLCBUMV81MjMwXzUzMTAsIFQxXzUzNTBfNTQ3MCwgVDFfNTUxMF81NjcwLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNKFQxXzUyMDBfNTI0MCwgVDFfNTI4MF81MjgwLCBUMV81NTQwXzU2NjAsIFQxXzU3NjVfNTgwNSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk0oRjFfMjMxMl8yMzcyLCBGMV8yNDEyXzI0NzIsIEYxXzI0ODRfMjQ4NCwgRjFfMjUxMl8yNzMyLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTShHMV8yMzEyXzIzNzIsIEcxXzI0MTJfMjQ3MiwgRzFfMjUxMl8yNzMyLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk0oVDFfMjMxMl8yMzcyLCBUMV8yNDM3XzI0MzcsIFQxXzI1MTJfMjczMiwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNKE5HX0RFTU9fQUxMX0NIQU5ORUxTLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTShOQV9ERU1PX0FMTF9DSEFOTkVMUywgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKX0sCisKKwl7QVBMMSwgRVRTSSwgTk9fREZTLCBOT19QU0NBTiwgTk9fUkVRLAorCSBCTShGNF81NzQ1XzU4MjUsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNKE5BNF81NzU1XzU3OTUsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSl9LAorCisJe0FQTDIsIEVUU0ksIE5PX0RGUywgTk9fUFNDQU4sIE5PX1JFUSwKKwkgQk0oRjFfNTc0NV81ODA1LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTShOQTNfNTc1NV81Nzk1LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpfSwKKworCXtBUEwzLCBGQ0MsIE5PX0RGUywgTk9fUFNDQU4sIE5PX1JFUSwKKwkgQk0oRjFfNTI4MF81MzIwLCBGMl81NzQ1XzU4MDUsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk0oTkExXzUzMTBfNTMxMCwgTkE0XzU3NTVfNTc5NSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpfSwKKworCXtBUEw0LCBFVFNJLCBOT19ERlMsIE5PX1BTQ0FOLCBOT19SRVEsCisJIEJNKEY0XzUxODBfNTI0MCwgIEYzXzU3NDVfNTgyNSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTShOQTRfNTE5MF81MjMwLCBOQTJfNTc1NV81Nzk1LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSl9LAorCisJe0FQTDUsIEVUU0ksIE5PX0RGUywgTk9fUFNDQU4sIE5PX1JFUSwKKwkgQk0oRjJfNTc0NV81ODI1LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTShOQTFfNTc1NV81Nzk1LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpfSwKKworCXtBUEw2LCBFVFNJLCBERlNfRVRTSSwgUFNDQU5fRkNDX1QgfCBQU0NBTl9GQ0MgLCBOT19SRVEsCisJIEJNKEY0XzUxODBfNTI0MCwgRjJfNTI2MF81MzIwLCBGM181NzQ1XzU4MjUsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTShUMl81MjEwXzUyMTAsIFQxXzUyNTBfNTI5MCwgVDFfNTc2MF81ODAwLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNKE5BNF81MTkwXzUyMzAsIE5BMl81MjcwXzUzMTAsIE5BMl81NzU1XzU3OTUsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpfSwKKworCXtBUEw3LCBGQ0MsIE5PX0RGUywgUFNDQU5fRkNDX1QgfCBQU0NBTl9GQ0MgLCBOT19SRVEsCisJIEJNKEY3XzUyNjBfNTMyMCwgRjRfNTUwMF81NzAwLCBGM181NzQ1XzU4MDUsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTShOQTFfNTMxMF81MzEwLCBOQTJfNTc1NV81Nzk1LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSl9LAorCXtBUEw4LCBFVFNJLCBOT19ERlMsIE5PX1BTQ0FOLCBESVNBTExPV19BREhPQ18xMUF8RElTQUxMT1dfQURIT0NfMTFBX1RVUkIsCisJIEJNKEY2XzUyNjBfNTMyMCwgRjRfNTc0NV81ODI1LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNKE5BNF81MjcwXzUzMTAsIE5BNF81NzU1XzU3OTUsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKX0sCisKKwl7QVBMOSwgRVRTSSwgREZTX0VUU0ksIFBTQ0FOX0VUU0ksIERJU0FMTE9XX0FESE9DXzExQXxESVNBTExPV19BREhPQ18xMUFfVFVSQiwKKwkgQk0oRjFfNTE4MF81MzIwLCBGMV81NTAwXzU2MjAsIEYzXzU3NDVfNTgwNSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNKE5BNF81MTkwXzUyMzAsIE5BMl81MjcwXzUzMTAsIE5BMV81NTEwXzU2MzAsIE5BNF81NzU1XzU3OTUsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSl9LAorCisJe0VUU0kxLCBFVFNJLCBERlNfRVRTSSwgUFNDQU5fRVRTSSwgRElTQUxMT1dfQURIT0NfMTFBIHwgRElTQUxMT1dfQURIT0NfMTFBX1RVUkIsCisJIEJNKFcyXzUxODBfNTI0MCwgRjJfNTI2MF81MzIwLCBGMl81NTAwXzU3MDAsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTShOQTRfNTE5MF81MjMwLCBOQTJfNTI3MF81MzEwLCBOQTJfNTUxMF81NjcwLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKX0sCisKKwl7RVRTSTIsIEVUU0ksIERGU19FVFNJLCBQU0NBTl9FVFNJLCBESVNBTExPV19BREhPQ18xMUEgfCBESVNBTExPV19BREhPQ18xMUFfVFVSQiwKKwkgQk0oRjNfNTE4MF81MjQwLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTShOQTNfNTE5MF81MjMwLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpfSwKKworCXtFVFNJMywgRVRTSSwgREZTX0VUU0ksIFBTQ0FOX0VUU0ksIERJU0FMTE9XX0FESE9DXzExQSB8IERJU0FMTE9XX0FESE9DXzExQV9UVVJCLAorCSBCTShXMl81MTgwXzUyNDAsIEYyXzUyNjBfNTMyMCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTShOQTRfNTE5MF81MjMwLCBOQTJfNTI3MF81MzEwLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSl9LAorCisJe0VUU0k0LCBFVFNJLCBERlNfRVRTSSwgUFNDQU5fRVRTSSwgRElTQUxMT1dfQURIT0NfMTFBIHwgRElTQUxMT1dfQURIT0NfMTFBX1RVUkIsCisJIEJNKEYzXzUxODBfNTI0MCwgRjFfNTI2MF81MzIwLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNKE5BM181MTkwXzUyMzAsIE5BMV81MjcwXzUzMTAsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKX0sCisKKwl7RVRTSTUsIEVUU0ksIERGU19FVFNJLCBQU0NBTl9FVFNJLCBESVNBTExPV19BREhPQ18xMUEgfCBESVNBTExPV19BREhPQ18xMUFfVFVSQiwKKwkgQk0oRjFfNTE4MF81MjQwLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTShOQTFfNTE5MF81MjMwLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpfSwKKworCXtFVFNJNiwgRVRTSSwgREZTX0VUU0ksIFBTQ0FOX0VUU0ksIERJU0FMTE9XX0FESE9DXzExQSB8IERJU0FMTE9XX0FESE9DXzExQV9UVVJCLAorCSBCTShGNV81MTgwXzUyNDAsIEYxXzUyNjBfNTI4MCwgRjNfNTUwMF81NzAwLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk0oTkE1XzUxOTBfNTIzMCwgTkExXzUyNzBfNTI3MCwgTkEzXzU1MTBfNTY3MCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSl9LAorCisJe0ZDQzEsIEZDQywgTk9fREZTLCBOT19QU0NBTiwgTk9fUkVRLAorCSBCTShGMl81MTgwXzUyNDAsIEY0XzUyNjBfNTMyMCwgRjVfNTc0NV81ODI1LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk0oVDFfNTIxMF81MjEwLCBUMl81MjUwXzUyOTAsIFQyXzU3NjBfNTgwMCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNKFQxXzUyMDBfNTI0MCwgVDFfNTI4MF81MjgwLCBUMV81NzY1XzU4MDUsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNKE5BMl81MTkwXzUyMzAsIE5BM181MjcwXzUzMTAsIE5BNF81NzU1XzU3OTUsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpfSwKKworCXtGQ0MyLCBGQ0MsIE5PX0RGUywgTk9fUFNDQU4sIE5PX1JFUSwKKwkgQk0oRjZfNTE4MF81MjQwLCBGNV81MjYwXzUzMjAsIEY2XzU3NDVfNTgyNSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNKC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTShUMl81MjAwXzUyNDAsIFQxXzUyODBfNTI4MCwgVDFfNTc2NV81ODA1LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTShOQTVfNTE5MF81MjMwLCBOQTNfNTI3MF81MzEwLCBOQTRfNTc1NV81Nzk1LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKX0sCisKKwl7RkNDMywgRkNDLCBERlNfRkNDMywgUFNDQU5fRkNDIHwgUFNDQU5fRkNDX1QsIE5PX1JFUSwKKwkgQk0oRjJfNTE4MF81MjQwLCBGM181MjYwXzUzMjAsIEYxXzU1MDBfNTcwMCwgRjVfNTc0NV81ODI1LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTShUMV81MjEwXzUyMTAsIFQxXzUyNTBfNTI1MCwgVDFfNTI5MF81MjkwLCBUMl81NzYwXzU4MDAsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNKFQxXzUyMDBfNTI0MCwgVDJfNTI4MF81MjgwLCBUMV81NTQwXzU2NjAsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNKE5BMl81MTkwXzUyMzAsIE5BMl81MjcwXzUzMTAsIE5BM181NTEwXzU2NzAsIE5BNF81NzU1XzU3OTUsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSl9LAorCisJe0ZDQzQsIEZDQywgREZTX0ZDQzMsIFBTQ0FOX0ZDQyB8IFBTQ0FOX0ZDQ19ULCBOT19SRVEsCisJIEJNKEYxXzQ5NDJfNDk4NywgRjFfNDk0NV80OTg1LCBGMV80OTUwXzQ5ODAsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk99LAorCisJe0ZDQzUsIEZDQywgTk9fREZTLCBOT19QU0NBTiwgTk9fUkVRLAorCSBCTShGMl81MTgwXzUyNDAsIEY1XzU3NDVfNTgyNSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTShOQTJfNTE5MF81MjMwLCBOQTRfNTc1NV81Nzk1LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSl9LAorCisgICAge0ZDQzYsIEZDQywgREZTX0ZDQzMsIFBTQ0FOX0ZDQywgTk9fUkVRLAorCSBCTShGN181MTgwXzUyNDAsIEY1XzUyNjBfNTMyMCwgRjFfNTUwMF81NTgwLCBGMV81NjYwXzU3MDAsIEY2XzU3NDVfNTgyNSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTSgtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk0oVDJfNTIwMF81MjQwLCBUMV81MjgwXzUyODAsIFQxXzU3NjVfNTgwNSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNWkVSTywKKwkgQk1aRVJPLAorICAgICBCTVpFUk8sCisgICAgIEJNWkVSTywKKwkgQk0oTkE1XzUxOTBfNTIzMCwgTkE1XzU3NTVfNTc5NSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpfSwKKworCXtNS0sxLCBNS0ssIE5PX0RGUywgUFNDQU5fTUtLMSwgRElTQUxMT1dfQURIT0NfMTFBX1RVUkIsCisJIEJNKEYxXzUxNzBfNTIzMCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPfSwKKworCXtNS0syLCBNS0ssIE5PX0RGUywgUFNDQU5fTUtLMiwgRElTQUxMT1dfQURIT0NfMTFBX1RVUkIsCisJIEJNKEYxXzQ5MTVfNDkyNSwgRjFfNDkzNV80OTQ1LCBGMV80OTIwXzQ5ODAsIEYxXzUwMzVfNTA0MCwgRjFfNTA1NV81MDU1LCBGMV81MDQwXzUwODAsIEYxXzUxNzBfNTIzMCwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPfSwKKworCS8qIFVOSS0xIGV2ZW4gKi8KKwl7TUtLMywgTUtLLCBOT19ERlMsIFBTQ0FOX01LSzMsIERJU0FMTE9XX0FESE9DXzExQV9UVVJCLAorCSBCTShGNF81MTgwXzUyNDAsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNKE5BNF81MTkwXzUyMzAsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSl9LAorCisJLyogVU5JLTEgZXZlbiArIFVOSS0yICovCisJe01LSzQsIE1LSywgREZTX01LSzQsIFBTQ0FOX01LSzMsIERJU0FMTE9XX0FESE9DXzExQV9UVVJCLAorCSBCTShGNF81MTgwXzUyNDAsIEYyXzUyNjBfNTMyMCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTShOQTRfNTE5MF81MjMwLCBOQTJfNTI3MF81MzEwLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSl9LAorCisJLyogVU5JLTEgZXZlbiArIFVOSS0yICsgbWlkLWJhbmQgKi8KKwl7TUtLNSwgTUtLLCBERlNfTUtLNCwgUFNDQU5fTUtLMywgRElTQUxMT1dfQURIT0NfMTFBX1RVUkIsCisJIEJNKEY0XzUxODBfNTI0MCwgRjJfNTI2MF81MzIwLCBGNF81NTAwXzU3MDAsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTShOQTRfNTE5MF81MjMwLCBOQTJfNTI3MF81MzEwLCBOQTFfNTUxMF81NjcwLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKX0sCisKKwkvKiBVTkktMSBvZGQgKyBldmVuICovCisJe01LSzYsIE1LSywgREZTX01LSzQsIFBTQ0FOX01LSzEsIERJU0FMTE9XX0FESE9DXzExQV9UVVJCLAorCSBCTShGMl81MTcwXzUyMzAsIEY0XzUxODBfNTI0MCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTShOQTRfNTE5MF81MjMwLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpfSwKKworCS8qIFVOSS0xIG9kZCArIFVOSS0xIGV2ZW4gKyBVTkktMiAqLworCXtNS0s3LCBNS0ssIERGU19NS0s0LCBQU0NBTl9NS0sxIHwgUFNDQU5fTUtLMyAsIERJU0FMTE9XX0FESE9DXzExQV9UVVJCLAorCSBCTShGMl81MTcwXzUyMzAsIEY0XzUxODBfNTI0MCwgRjJfNTI2MF81MzIwLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk0oTkE0XzUxOTBfNTIzMCwgTkEyXzUyNzBfNTMxMCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpfSwKKworCS8qIFVOSS0xIG9kZCArIFVOSS0xIGV2ZW4gKyBVTkktMiArIG1pZC1iYW5kICovCisJe01LSzgsIE1LSywgREZTX01LSzQsIFBTQ0FOX01LSzEgfCBQU0NBTl9NS0szICwgRElTQUxMT1dfQURIT0NfMTFBX1RVUkIsCisJIEJNKEYyXzUxNzBfNTIzMCwgRjRfNTE4MF81MjQwLCBGMl81MjYwXzUzMjAsIEY0XzU1MDBfNTcwMCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk0oTkE0XzUxOTBfNTIzMCwgTkEyXzUyNzBfNTMxMCwgTkExXzU1MTBfNTY3MCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSl9LAorCisgICAgLyogVU5JLTEgZXZlbiArIDQuOSBHSFogKi8KKyAgICB7TUtLOSwgTUtLLCBOT19ERlMsIE5PX1BTQ0FOLCBESVNBTExPV19BREhPQ18xMUFfVFVSQiwKKyAgICAgQk0oRjFfNDkxNV80OTI1LCBGMV80OTM1XzQ5NDUsIEYxXzQ5MjBfNDk4MCwgRjFfNTAzNV81MDQwLCBGMV81MDU1XzUwNTUsIEYxXzUwNDBfNTA4MCwgRjRfNTE4MF81MjQwLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk99LAorCisgICAgLyogVU5JLTEgZXZlbiArIFVOSS0yICsgNC45IEdIWiAqLworCXtNS0sxMCwgTUtLLCBERlNfTUtLNCwgUFNDQU5fTUtLMywgRElTQUxMT1dfQURIT0NfMTFBX1RVUkIsCisJIEJNKEYxXzQ5MTVfNDkyNSwgRjFfNDkzNV80OTQ1LCBGMV80OTIwXzQ5ODAsIEYxXzUwMzVfNTA0MCwgRjFfNTA1NV81MDU1LCBGMV81MDQwXzUwODAsIEY0XzUxODBfNTI0MCwgRjJfNTI2MF81MzIwLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVST30sCisKKwkvKiBVTkktMSBldmVuICsgVU5JLTIgKyA0LjkgR0haICsgbWlkLWJhbmQgKi8KKwl7TUtLMTEsIE1LSywgREZTX01LSzQsIFBTQ0FOX01LSzMsIERJU0FMTE9XX0FESE9DXzExQV9UVVJCLAorCSBCTShGMV80OTE1XzQ5MjUsIEYxXzQ5MzVfNDk0NSwgRjFfNDkyMF80OTgwLCBGMV81MDM1XzUwNDAsIEYxXzUwNTVfNTA1NSwgRjFfNTA0MF81MDgwLCBGNF81MTgwXzUyNDAsIEYyXzUyNjBfNTMyMCwgRjRfNTUwMF81NzAwLCAtMSwgLTEsIC0xKSwKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPfSwKKworCS8qIFVOSS0xIGV2ZW4gKyBVTkktMSBvZGQgKyBVTkktMiArIDQuOSBHSFogKyBtaWQtYmFuZCAqLworCXtNS0sxMiwgTUtLLCBERlNfTUtLNCwgUFNDQU5fTUtLMywgRElTQUxMT1dfQURIT0NfMTFBX1RVUkIsCisJIEJNKEYxXzQ5MTVfNDkyNSwgRjFfNDkzNV80OTQ1LCBGMV80OTIwXzQ5ODAsIEYxXzUwMzVfNTA0MCwgRjFfNTA1NV81MDU1LCBGMV81MDQwXzUwODAsIEYxXzUxNzBfNTIzMCwgRjRfNTE4MF81MjQwLCBGMl81MjYwXzUzMjAsIEY0XzU1MDBfNTcwMCwgLTEsIC0xKSwKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPfSwKKworCS8qIERlZmluZWQgaGVyZSB0byB1c2Ugd2hlbiAyRyBjaGFubmVscyBhcmUgYXV0aG9yaXNlZCBmb3IgY291bnRyeSBLMiAqLworCXtBUExELCBOT19DVEwsIE5PX0RGUywgTk9fUFNDQU4sIE5PX1JFUSwKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk0oRjJfMjMxMl8yMzcyLEYyXzI0MTJfMjQ3MiwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTShHMl8yMzEyXzIzNzIsRzJfMjQxMl8yNDcyLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk99LAorCisJe0VUU0lBLCBOT19DVEwsIE5PX0RGUywgUFNDQU5fRVRTSUEsIERJU0FMTE9XX0FESE9DXzExQSB8IERJU0FMTE9XX0FESE9DXzExQV9UVVJCLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTShGMV8yNDU3XzI0NzIsLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk0oRzFfMjQ1N18yNDcyLC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNKFQyXzI0MzdfMjQzNywtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTVpFUk8sCisJIEJNWkVST30sCisKKwl7RVRTSUIsIEVUU0ksIE5PX0RGUywgUFNDQU5fRVRTSUIsIERJU0FMTE9XX0FESE9DXzExQSB8IERJU0FMTE9XX0FESE9DXzExQV9UVVJCLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTShGMV8yNDMyXzI0NDIsLTEsLTEsLTEsLTEsLTEsLTEsLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk0oRzFfMjQzMl8yNDQyLC0xLC0xLC0xLC0xLC0xLC0xLC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNKFQyXzI0MzdfMjQzNywtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTVpFUk8sCisJIEJNWkVST30sCisKKwl7RVRTSUMsIEVUU0ksIE5PX0RGUywgUFNDQU5fRVRTSUMsIERJU0FMTE9XX0FESE9DXzExQSB8IERJU0FMTE9XX0FESE9DXzExQV9UVVJCLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTShGM18yNDEyXzI0NzIsLTEsLTEsLTEsLTEsLTEsLTEsLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk0oRzNfMjQxMl8yNDcyLC0xLC0xLC0xLC0xLC0xLC0xLC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNKFQyXzI0MzdfMjQzNywtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTVpFUk8sCisJIEJNWkVST30sCisKKwl7RkNDQSwgRkNDLCBOT19ERlMsIE5PX1BTQ0FOLCBOT19SRVEsCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNKEYxXzI0MTJfMjQ2MiwtMSwtMSwtMSwtMSwtMSwtMSwtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTShHMV8yNDEyXzI0NjIsLTEsLTEsLTEsLTEsLTEsLTEsLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk0oVDJfMjQzN18yNDM3LC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNKE5HMl8yNDIyXzI0NTIsLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk1aRVJPfSwKKworCXtNS0tBLCBNS0ssIE5PX0RGUywgUFNDQU5fTUtLQSB8IFBTQ0FOX01LS0FfRyB8IFBTQ0FOX01LS0ExIHwgUFNDQU5fTUtLQTFfRyB8IFBTQ0FOX01LS0EyIHwgUFNDQU5fTUtLQTJfRywgRElTQUxMT1dfQURIT0NfMTFBX1RVUkIsCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNKEYyXzI0MTJfMjQ2MiwgRjFfMjQ2N18yNDcyLCBGMl8yNDg0XzI0ODQsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTShHMl8yNDEyXzI0NjIsIEcxXzI0NjdfMjQ3MiwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTShUMl8yNDM3XzI0MzcsLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk0oTkcxXzI0MjJfMjQ1MiwtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTVpFUk99LAorCisJe01LS0MsIE1LSywgTk9fREZTLCBOT19QU0NBTiwgTk9fUkVRLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTShGMl8yNDEyXzI0NzIsLTEsLTEsLTEsLTEsLTEsLTEsLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk0oRzJfMjQxMl8yNDcyLC0xLC0xLC0xLC0xLC0xLC0xLC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNKFQyXzI0MzdfMjQzNywtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTShORzFfMjQyMl8yNDUyLC0xLC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk1aRVJPfSwKKworCXtXT1JMRCwgRVRTSSwgTk9fREZTLCBOT19QU0NBTiwgTk9fUkVRLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTShGMl8yNDEyXzI0NzIsLTEsLTEsLTEsLTEsLTEsLTEsLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk0oRzJfMjQxMl8yNDcyLC0xLC0xLC0xLC0xLC0xLC0xLC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNKFQyXzI0MzdfMjQzNywtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTShORzFfMjQyMl8yNDUyLC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNWkVST30sCisKKwl7V09SMF9XT1JMRCwgTk9fQ1RMLCBERlNfRkNDMyB8IERGU19FVFNJLCBQU0NBTl9XV1IsIEFESE9DX1BFUl8xMUQsCisJIEJNKFcxXzUyNjBfNTMyMCwgVzFfNTE4MF81MjQwLCBXMV81MTcwXzUyMzAsIFcxXzU3NDVfNTgyNSwgVzFfNTUwMF81NzAwLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNKFdUMV81MjEwXzUyNTAsIFdUMV81MjkwXzUyOTAsIFdUMV81NzYwXzU4MDAsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTVpFUk8sCisJIEJNKFcxXzI0MTJfMjQxMixXMV8yNDM3XzI0NDIsVzFfMjQ2Ml8yNDYyLFcxXzI0NzJfMjQ3MixXMV8yNDE3XzI0MzIsIFcxXzI0NDdfMjQ1NywgVzFfMjQ2N18yNDY3LCBXMV8yNDg0XzI0ODQsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk0oV0cxXzI0MTJfMjQxMixXRzFfMjQzN18yNDQyLFdHMV8yNDYyXzI0NjIsV0cxXzI0NzJfMjQ3MixXRzFfMjQxN18yNDMyLFdHMV8yNDQ3XzI0NTcsV0cxXzI0NjdfMjQ2NywgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk0oVDNfMjQzN18yNDM3LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTVpFUk8sCisJIEJNWkVST30sCisKKwl7V09SMDFfV09STEQsIE5PX0NUTCwgREZTX0ZDQzMgfCBERlNfRVRTSSwgUFNDQU5fV1dSLCBBREhPQ19QRVJfMTFELAorCSBCTShXMV81MjYwXzUzMjAsIFcxXzUxODBfNTI0MCwgVzFfNTE3MF81MjMwLCBXMV81NzQ1XzU4MjUsIFcxXzU1MDBfNTcwMCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTShXVDFfNTIxMF81MjUwLCBXVDFfNTI5MF81MjkwLCBXVDFfNTc2MF81ODAwLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk1aRVJPLAorCSBCTShXMV8yNDEyXzI0MTIsIFcxXzI0MzdfMjQ0MiwgVzFfMjQ2Ml8yNDYyLCBXMV8yNDE3XzI0MzIsIFcxXzI0NDdfMjQ1NywgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTShXRzFfMjQxMl8yNDEyLCBXRzFfMjQzN18yNDQyLCBXRzFfMjQ2Ml8yNDYyLCBXRzFfMjQxN18yNDMyLCBXRzFfMjQ0N18yNDU3LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNKFQzXzI0MzdfMjQzNywgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk1aRVJPLAorCSBCTVpFUk99LAorCisJe1dPUjAyX1dPUkxELCBOT19DVEwsIERGU19GQ0MzIHwgREZTX0VUU0ksIFBTQ0FOX1dXUiwgQURIT0NfUEVSXzExRCwKKwkgQk0oVzFfNTI2MF81MzIwLCBXMV81MTgwXzUyNDAsVzFfNTE3MF81MjMwLFcxXzU3NDVfNTgyNSxXMV81NTAwXzU3MDAsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk0oV1QxXzUyMTBfNTI1MCwgV1QxXzUyOTBfNTI5MCwgV1QxXzU3NjBfNTgwMCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNWkVSTywKKwkgQk0oVzFfMjQxMl8yNDEyLFcxXzI0MzdfMjQ0MixXMV8yNDYyXzI0NjIsIFcxXzI0NzJfMjQ3MixXMV8yNDE3XzI0MzIsIFcxXzI0NDdfMjQ1NywgVzFfMjQ2N18yNDY3LCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTShXRzFfMjQxMl8yNDEyLFdHMV8yNDM3XzI0NDIsV0cxXzI0NjJfMjQ2MiwgV0cxXzI0NzJfMjQ3MixXRzFfMjQxN18yNDMyLCBXRzFfMjQ0N18yNDU3LCBXRzFfMjQ2N18yNDY3LCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTShUM18yNDM3XzI0MzcsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNWkVSTywKKwkgQk1aRVJPfSwKKworCXtFVTFfV09STEQsIE5PX0NUTCwgREZTX0ZDQzMgfCBERlNfRVRTSSwgUFNDQU5fV1dSLCBBREhPQ19QRVJfMTFELAorCSBCTShXMV81MjYwXzUzMjAsIFcxXzUxODBfNTI0MCxXMV81MTcwXzUyMzAsVzFfNTc0NV81ODI1LFcxXzU1MDBfNTcwMCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTShXVDFfNTIxMF81MjUwLCBXVDFfNTI5MF81MjkwLCBXVDFfNTc2MF81ODAwLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk1aRVJPLAorCSBCTShXMV8yNDEyXzI0MTIsVzFfMjQzN18yNDQyLFcxXzI0NjJfMjQ2MiwgVzJfMjQ3Ml8yNDcyLFcxXzI0MTdfMjQzMiwgVzFfMjQ0N18yNDU3LCBXMl8yNDY3XzI0NjcsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNKFdHMV8yNDEyXzI0MTIsV0cxXzI0MzdfMjQ0MixXRzFfMjQ2Ml8yNDYyLCBXRzJfMjQ3Ml8yNDcyLFdHMV8yNDE3XzI0MzIsIFdHMV8yNDQ3XzI0NTcsIFdHMl8yNDY3XzI0NjcsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNKFQzXzI0MzdfMjQzNywgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk1aRVJPLAorCSBCTVpFUk99LAorCisJe1dPUjFfV09STEQsIE5PX0NUTCwgREZTX0ZDQzMgfCBERlNfRVRTSSwgUFNDQU5fV1dSLCBBREhPQ19OT18xMUEsCisJIEJNKFcxXzUyNjBfNTMyMCwgVzFfNTE4MF81MjQwLCBXMV81MTcwXzUyMzAsIFcxXzU3NDVfNTgyNSwgVzFfNTUwMF81NzAwLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTShXMV8yNDEyXzI0MTIsVzFfMjQzN18yNDQyLFcxXzI0NjJfMjQ2MixXMV8yNDcyXzI0NzIsVzFfMjQxN18yNDMyLCBXMV8yNDQ3XzI0NTcsIFcxXzI0NjdfMjQ2NywgVzFfMjQ4NF8yNDg0LCAtMSwgLTEsIC0xLCAtMSksCisJIEJNKFdHMV8yNDEyXzI0MTIsV0cxXzI0MzdfMjQ0MixXRzFfMjQ2Ml8yNDYyLFdHMV8yNDcyXzI0NzIsV0cxXzI0MTdfMjQzMixXRzFfMjQ0N18yNDU3LFdHMV8yNDY3XzI0NjcsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNKFQzXzI0MzdfMjQzNywgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk1aRVJPLAorCSBCTVpFUk99LAorCisJe1dPUjJfV09STEQsIE5PX0NUTCwgREZTX0ZDQzMgfCBERlNfRVRTSSwgUFNDQU5fV1dSLCBBREhPQ19OT18xMUEsCisJIEJNKFcxXzUyNjBfNTMyMCwgVzFfNTE4MF81MjQwLCBXMV81MTcwXzUyMzAsIFcxXzU3NDVfNTgyNSwgVzFfNTUwMF81NzAwLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNKFdUMV81MjEwXzUyNTAsIFdUMV81MjkwXzUyOTAsIFdUMV81NzYwXzU4MDAsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTVpFUk8sCisJIEJNKFcxXzI0MTJfMjQxMixXMV8yNDM3XzI0NDIsVzFfMjQ2Ml8yNDYyLFcxXzI0NzJfMjQ3MixXMV8yNDE3XzI0MzIsIFcxXzI0NDdfMjQ1NywgVzFfMjQ2N18yNDY3LCBXMV8yNDg0XzI0ODQsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk0oV0cxXzI0MTJfMjQxMixXRzFfMjQzN18yNDQyLFdHMV8yNDYyXzI0NjIsV0cxXzI0NzJfMjQ3MixXRzFfMjQxN18yNDMyLFdHMV8yNDQ3XzI0NTcsV0cxXzI0NjdfMjQ2NywgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk0oVDNfMjQzN18yNDM3LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTVpFUk8sCisJIEJNWkVST30sCisKKwl7V09SM19XT1JMRCwgTk9fQ1RMLCBERlNfRkNDMyB8IERGU19FVFNJLCBQU0NBTl9XV1IsIEFESE9DX1BFUl8xMUQsCisJIEJNKFcxXzUyNjBfNTMyMCwgVzFfNTE4MF81MjQwLCBXMV81MTcwXzUyMzAsIFcxXzU3NDVfNTgyNSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk0oV1QxXzUyMTBfNTI1MCwgV1QxXzUyOTBfNTI5MCwgV1QxXzU3NjBfNTgwMCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNWkVSTywKKwkgQk0oVzFfMjQxMl8yNDEyLFcxXzI0MzdfMjQ0MixXMV8yNDYyXzI0NjIsVzFfMjQ3Ml8yNDcyLFcxXzI0MTdfMjQzMiwgVzFfMjQ0N18yNDU3LCBXMV8yNDY3XzI0NjcsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNKFdHMV8yNDEyXzI0MTIsV0cxXzI0MzdfMjQ0MixXRzFfMjQ2Ml8yNDYyLFdHMV8yNDcyXzI0NzIsV0cxXzI0MTdfMjQzMixXRzFfMjQ0N18yNDU3LFdHMV8yNDY3XzI0NjcsLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk0oVDNfMjQzN18yNDM3LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTVpFUk8sCisJIEJNWkVST30sCisKKwl7V09SNF9XT1JMRCwgTk9fQ1RMLCBERlNfRkNDMywgUFNDQU5fV1dSLCBBREhPQ19OT18xMUEsCisJIEJNKFcyXzUyNjBfNTMyMCwgVzJfNTE4MF81MjQwLCBGMl81NzQ1XzU4MDUsIFcyXzU4MjVfNTgyNSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk0oV1QxXzUyMTBfNTI1MCwgV1QxXzUyOTBfNTI5MCwgV1QxXzU3NjBfNTgwMCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNWkVSTywKKwkgQk0oVzFfMjQxMl8yNDEyLFcxXzI0MzdfMjQ0MixXMV8yNDYyXzI0NjIsIFcxXzI0MTdfMjQzMixXMV8yNDQ3XzI0NTcsLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTShXRzFfMjQxMl8yNDEyLFdHMV8yNDM3XzI0NDIsV0cxXzI0NjJfMjQ2MiwgV0cxXzI0MTdfMjQzMixXRzFfMjQ0N18yNDU3LC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk0oVDNfMjQzN18yNDM3LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTVpFUk8sCisJIEJNWkVST30sCisKKwl7V09SNV9FVFNJQywgTk9fQ1RMLCBERlNfRkNDMyB8IERGU19FVFNJLCBQU0NBTl9XV1IsIEFESE9DX05PXzExQSwKKwkgQk0oVzFfNTI2MF81MzIwLCBXMl81MTgwXzUyNDAsIEY2XzU3NDVfNTgyNSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTShXMV8yNDEyXzI0MTIsIFcxXzI0MzdfMjQ0MiwgVzFfMjQ2Ml8yNDYyLCBXMl8yNDcyXzI0NzIsIFcxXzI0MTdfMjQzMiwgVzFfMjQ0N18yNDU3LCBXMl8yNDY3XzI0NjcsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNKFdHMV8yNDEyXzI0MTIsIFdHMV8yNDM3XzI0NDIsIFdHMV8yNDYyXzI0NjIsIFdHMV8yNDcyXzI0NzIsIFdHMV8yNDE3XzI0MzIsIFdHMV8yNDQ3XzI0NTcsIFdHMV8yNDY3XzI0NjcsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNKFQzXzI0MzdfMjQzNywgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk1aRVJPLAorCSBCTVpFUk99LAorCisJe1dPUjlfV09STEQsIE5PX0NUTCwgREZTX0ZDQzMgfCBERlNfRVRTSSwgUFNDQU5fV1dSLCBBREhPQ19OT18xMUEsCisJIEJNKFcxXzUyNjBfNTMyMCwgVzFfNTE4MF81MjQwLCBXMV81NzQ1XzU4MjUsIFcxXzU1MDBfNTcwMCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk0oV1QxXzUyMTBfNTI1MCwgV1QxXzUyOTBfNTI5MCwgV1QxXzU3NjBfNTgwMCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNWkVSTywKKwkgQk0oVzFfMjQxMl8yNDEyLCBXMV8yNDM3XzI0NDIsIFcxXzI0NjJfMjQ2MiwgVzFfMjQxN18yNDMyLCBXMV8yNDQ3XzI0NTcsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk0oV0cxXzI0MTJfMjQxMiwgV0cxXzI0MzdfMjQ0MiwgV0cxXzI0NjJfMjQ2MiwgV0cxXzI0MTdfMjQzMiwgV0cxXzI0NDdfMjQ1NywgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTShUM18yNDM3XzI0MzcsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNWkVSTywKKwkgQk1aRVJPfSwKKworCXtXT1JBX1dPUkxELCBOT19DVEwsIERGU19GQ0MzIHwgREZTX0VUU0ksIFBTQ0FOX1dXUiwgQURIT0NfTk9fMTFBLAorCSBCTShXMV81MjYwXzUzMjAsIFcxXzUxODBfNTI0MCwgVzFfNTc0NV81ODI1LCBXMV81NTAwXzU3MDAsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTShXMV8yNDEyXzI0MTIsIFcxXzI0MzdfMjQ0MiwgVzFfMjQ2Ml8yNDYyLCBXMV8yNDcyXzI0NzIsIFcxXzI0MTdfMjQzMiwgVzFfMjQ0N18yNDU3LCBXMV8yNDY3XzI0NjcsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNKFdHMV8yNDEyXzI0MTIsIFdHMV8yNDM3XzI0NDIsIFdHMV8yNDYyXzI0NjIsIFdHMV8yNDcyXzI0NzIsIFdHMV8yNDE3XzI0MzIsIFdHMV8yNDQ3XzI0NTcsIFdHMV8yNDY3XzI0NjcsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNKFQzXzI0MzdfMjQzNywgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk1aRVJPLAorCSBCTVpFUk99LAorCisJe05VTEwxLCBOT19DVEwsIE5PX0RGUywgTk9fUFNDQU4sIE5PX1JFUSwKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk99LAorfTsKKworc3RydWN0IGNtb2RlIHsKKwl1MTZfdAltb2RlOworCXUzMl90CWZsYWdzOworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBjbW9kZSBtb2Rlc1tdID0geworCXsgSEFMX01PREVfVFVSQk8sCUNIQU5ORUxfU1R9LAkvKiBUVVJCTyBtZWFucyAxMWEgU3RhdGljIFR1cmJvICovCisJeyBIQUxfTU9ERV8xMUEsCQlDSEFOTkVMX0F9LAorCXsgSEFMX01PREVfMTFCLAkJQ0hBTk5FTF9CfSwKKwl7IEhBTF9NT0RFXzExRywJCUNIQU5ORUxfR30sCisJeyBIQUxfTU9ERV8xMUdfVFVSQk8sCUNIQU5ORUxfMTA4R30sCisJeyBIQUxfTU9ERV8xMUFfVFVSQk8sCUNIQU5ORUxfMTA4QX0sCisJeyBIQUxfTU9ERV8xMU5BLAlDSEFOTkVMX0FfSFQ0MH0sCisJeyBIQUxfTU9ERV8xMU5BLAlDSEFOTkVMX0FfSFQyMH0sCisJeyBIQUxfTU9ERV8xMU5HLAlDSEFOTkVMX0dfSFQ0MH0sCisJeyBIQUxfTU9ERV8xMU5HLAlDSEFOTkVMX0dfSFQyMH0sCit9OworCisvKgorICogUmV0dXJuIHRoZSBXaXJlbGVzcyBNb2RlIFJlZ3VsYXRvcnkgRG9tYWluIGJhc2VkCisgKiBvbiB0aGUgY291bnRyeSBjb2RlIGFuZCB0aGUgd2lyZWxlc3MgbW9kZS4KKyAqLwordThfdCBHZXRXbVJEKHUxNl90IHJlZ2lvbkNvZGUsIHUxNl90IGNoYW5uZWxGbGFnLCBSRUdfRE9NQUlOICpyZCkKK3sKKwlzMTZfdCBpLCBmb3VuZCwgcmVnRG1uOworCXU2NF90IGZsYWdzPU5PX1JFUTsKKwlSRUdfRE1OX1BBSVJfTUFQUElORyAqcmVnUGFpcj1OVUxMOworCisJZm9yIChpPTAsIGZvdW5kPTA7IChpPE4ocmVnRG9tYWluUGFpcnMpKSYmKCFmb3VuZCk7IGkrKykKKwl7CisJCWlmIChyZWdEb21haW5QYWlyc1tpXS5yZWdEbW5FbnVtID09IHJlZ2lvbkNvZGUpCisJCXsKKwkJCXJlZ1BhaXIgPSAmcmVnRG9tYWluUGFpcnNbaV07CisJCQlmb3VuZCA9IDE7CisJCX0KKwl9CisJaWYgKCFmb3VuZCkKKwl7CisJCXptX2RlYnVnX21zZzEoIkZhaWxlZCB0byBmaW5kIHJlZyBkb21haW4gcGFpciAiLCByZWdpb25Db2RlKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCWlmIChjaGFubmVsRmxhZyAmIFpNX1JFR19GTEFHX0NIQU5ORUxfMkdIWikKKwl7CisJCXJlZ0RtbiA9IHJlZ1BhaXItPnJlZ0RtbjJHSHo7CisJCWZsYWdzID0gcmVnUGFpci0+ZmxhZ3MyR0h6OworCX0KKyAgICBlbHNlCisJeworCQlyZWdEbW4gPSByZWdQYWlyLT5yZWdEbW41R0h6OworCQlmbGFncyA9IHJlZ1BhaXItPmZsYWdzNUdIejsKKwl9CisKKwkvKgorCSAqIFdlIGVpdGhlciBzdGFydGVkIHdpdGggYSB1bml0YXJ5IHJlZyBkb21haW4gb3Igd2UndmUgZm91bmQgdGhlCisJICogdW5pdGFyeSByZWcgZG9tYWluIG9mIHRoZSBwYWlyCisJICovCisKKwlmb3IgKGk9MDtpPE4ocmVnRG9tYWlucyk7IGkrKykKKwl7CisJCWlmIChyZWdEb21haW5zW2ldLnJlZ0RtbkVudW0gPT0gcmVnRG1uKQorCQl7CisJCQlpZiAocmQgIT0gTlVMTCkKKwkJCXsKKwkJCQl6Zk1lbW9yeUNvcHkoKHU4X3QgKilyZCwgKHU4X3QgKikmcmVnRG9tYWluc1tpXSwKKwkJCQkJICBzaXplb2YoUkVHX0RPTUFJTikpOworCQkJfQorCQl9CisJfQorCXJkLT5wc2NhbiAmPSByZWdQYWlyLT5wc2Nhbk1hc2s7CisgICAgcmQtPmZsYWdzID0gKHUzMl90KWZsYWdzOworCXJldHVybiBUUlVFOworfQorCisvKgorICogVGVzdCB0byBzZWUgaWYgdGhlIGJpdG1hc2sgYXJyYXkgaXMgYWxsIHplcm9zCisgKi8KK3U4X3QgaXNDaGFuQml0TWFza1plcm8odTY0X3QgKmJpdG1hc2spCit7CisJdTE2X3QgaTsKKworCWZvciAoaT0wOyBpPEJNTEVOOyBpKyspIHsKKwkJaWYgKGJpdG1hc2tbaV0gIT0gMCkKKwkJCXJldHVybiBGQUxTRTsKKwl9CisJcmV0dXJuIFRSVUU7Cit9CisKK3U4X3QgSVNfQklUX1NFVCh1MzJfdCBiaXQsIHU2NF90ICpiaXRtYXNrKQoreworCXUzMl90IGJ5dGVPZmZzZXQsIGJpdG51bTsKKwl1NjRfdCB2YWw7CisKKwlieXRlT2Zmc2V0ID0gYml0LzY0OworCWJpdG51bSA9IGJpdCAtIGJ5dGVPZmZzZXQqNjQ7CisJdmFsID0gKCh1NjRfdCkgMSkgPDwgYml0bnVtOworCWlmIChiaXRtYXNrW2J5dGVPZmZzZXRdICYgdmFsKQorCQlyZXR1cm4gVFJVRTsKKwllbHNlCisJCXJldHVybiBGQUxTRTsKK30KKworCit2b2lkIHpmSHBHZXRSZWd1bGF0aW9uVGFibGUoemRldl90KiBkZXYsIHUxNl90IHJlZ2lvbkNvZGUsIHUxNl90IGNfbG8sIHUxNl90IGNfaGkpCit7CisJUkVHX0RPTUFJTiByZDVHSHosIHJkMkdIejsKKwljb25zdCBzdHJ1Y3QgY21vZGUgKmNtOworCXMxNl90IG5leHQ9MCxiOworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICBzdHJ1Y3QgenNIcFByaXYqIGhwUHJpdj13ZC0+aHBQcml2YXRlOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworCWlmICghR2V0V21SRChyZWdpb25Db2RlLCB+Wk1fUkVHX0ZMQUdfQ0hBTk5FTF8yR0haLCAmcmQ1R0h6KSkKKwl7CisgICAgICAgIHptX2RlYnVnX21zZzEoImNvdWxkbid0IGZpbmQgdW5pdGFyeSA1R0h6IHJlZyBkb21haW4gZm9yIFJlZ2lvbiBDb2RlICIsIHJlZ2lvbkNvZGUpOworCQlyZXR1cm47CisJfQorCWlmICghR2V0V21SRChyZWdpb25Db2RlLCBaTV9SRUdfRkxBR19DSEFOTkVMXzJHSFosICZyZDJHSHopKQorCXsKKyAgICAgICAgem1fZGVidWdfbXNnMSgiY291bGRuJ3QgZmluZCB1bml0YXJ5IDJHSHogcmVnIGRvbWFpbiBmb3IgUmVnaW9uIENvZGUgIiwgcmVnaW9uQ29kZSk7CisJCXJldHVybjsKKwl9CisgICAgaWYgKHdkLT5yZWd1bGF0aW9uVGFibGUucmVnaW9uQ29kZSA9PSByZWdpb25Db2RlKQorICAgIHsKKyAgICAgICAgem1fZGVidWdfbXNnMSgiY3VycmVudCByZWdpb24gY29kZSBpcyB0aGUgc2FtZSB3aXRoIFJlZ2lvbiBDb2RlICIsIHJlZ2lvbkNvZGUpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHdkLT5yZWd1bGF0aW9uVGFibGUucmVnaW9uQ29kZSA9IHJlZ2lvbkNvZGU7CisgICAgfQorCisgICAgbmV4dCA9IDA7CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisJZm9yIChjbSA9IG1vZGVzOyBjbSA8ICZtb2Rlc1tOKG1vZGVzKV07IGNtKyspCisJeworCQl1MTZfdCBjOworCQl1NjRfdCAqY2hhbm5lbEJNPU5VTEw7CisJCVJFR19ET01BSU4gKnJkPU5VTEw7CisJCVJFR19ETU5fRlJFUV9CQU5EICpmYmFuZD1OVUxMLCpmcmVxcz1OVUxMOworCisJCXN3aXRjaCAoY20tPm1vZGUpCisJCXsKKwkJY2FzZSBIQUxfTU9ERV9UVVJCTzoKKwkJICAgIC8vd2UgZG9uJ3QgaGF2ZSB0dXJibyBtb2RlIHNvIHdlIGRpc2FibGUgaXQKKyAgICAgICAgICAgIC8vem1fZGVidWdfbXNnMCgiQ1dZIC0gSEFMX01PREVfVFVSQk8iKTsKKyAgICAgICAgICAgIGNoYW5uZWxCTSA9IE5VTEw7CisJCQkvL3JkID0gJnJkNUdIejsKKwkJCS8vY2hhbm5lbEJNID0gcmQtPmNoYW4xMWFfdHVyYm87CisJCQkvL2ZyZXFzID0gJnJlZ0RtbjVHaHpUdXJib0ZyZXFbMF07CisJCQkvL2N0bCA9IHJkLT5jb25mb3JtYW5jZVRlc3RMaW1pdCB8IENUTF9UVVJCTzsKKwkJCWJyZWFrOworCQljYXNlIEhBTF9NT0RFXzExQToKKwkJICAgIGlmICgoaHBQcml2LT5PcEZsYWdzICYgMHgxKSAhPSAwKQorCQkgICAgeworICAgIAkJCXJkID0gJnJkNUdIejsKKyAgICAJCQljaGFubmVsQk0gPSByZC0+Y2hhbjExYTsKKyAgICAJCQlmcmVxcyA9ICZyZWdEbW41R2h6RnJlcVswXTsKKyAgICAJCQljX2xvID0gNDkyMDsgLy9mcm9tIGNoYW5uZWwgMTg0CisgICAgCQkJY19oaSA9IDU4MjU7IC8vdG8gICBjaGFubmVsIDE2NQorICAgIAkJCS8vY3RsID0gcmQtPmNvbmZvcm1hbmNlVGVzdExpbWl0OworICAgICAgICAgICAgICAgIC8vem1fZGVidWdfbXNnMigiQ1dZIC0gSEFMX01PREVfMTFBLCBjaGFubmVsQk0gPSAweCIsICpjaGFubmVsQk0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy9lbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy9jaGFubmVsQk0gPSBOVUxMOworICAgICAgICAgICAgfQorCQkJYnJlYWs7CisJCWNhc2UgSEFMX01PREVfMTFCOgorCQkgICAgLy9EaXNhYmxlIDExQiBtb2RlIGJlY2F1c2UgaXQgb25seSBoYXMgZGlmZmVyZW5jZSB3aXRoIDExRyBpbiBQb3dlckRGUyBEYXRhLAorCQkgICAgLy9hbmQgd2UgZG9uJ3QgdXNlIHRoaXMgbm93LgorCQkJLy96bV9kZWJ1Z19tc2cwKCJDV1kgLSBIQUxfTU9ERV8xMUIiKTsKKwkJCWNoYW5uZWxCTSA9IE5VTEw7CisJCQkvL3JkID0gJnJkMkdIejsKKwkJCS8vY2hhbm5lbEJNID0gcmQtPmNoYW4xMWI7CisJCQkvL2ZyZXFzID0gJnJlZ0RtbjJHaHpGcmVxWzBdOworCQkJLy9jdGwgPSByZC0+Y29uZm9ybWFuY2VUZXN0TGltaXQgfCBDVExfMTFCOworICAgICAgICAgICAgLy96bV9kZWJ1Z19tc2cyKCJDV1kgLSBIQUxfTU9ERV8xMUIsIGNoYW5uZWxCTSA9IDB4IiwgKmNoYW5uZWxCTSk7CisJCQlicmVhazsKKwkJY2FzZSBIQUxfTU9ERV8xMUc6CisJCSAgICBpZiAoKGhwUHJpdi0+T3BGbGFncyAmIDB4MikgIT0gMCkKKwkJICAgIHsKKyAgICAJCQlyZCA9ICZyZDJHSHo7CisgICAgCQkJY2hhbm5lbEJNID0gcmQtPmNoYW4xMWc7CisgICAgCQkJZnJlcXMgPSAmcmVnRG1uMkdoejExZ0ZyZXFbMF07CisgICAgCQkJY19sbyA9IDI0MTI7IC8vZnJvbSBjaGFubmVsICAxCisgICAgCQkJLy9jX2hpID0gMjQ2MjsgLy90byAgIGNoYW5uZWwgMTEKKyAgICAgICAgICAgICAgICBjX2hpID0gMjQ3MjsgLy90byAgIGNoYW5uZWwgMTMKKyAgICAJCQkvL2N0bCA9IHJkLT5jb25mb3JtYW5jZVRlc3RMaW1pdCB8IENUTF8xMUc7CisgICAgICAgICAgICAgICAgLy96bV9kZWJ1Z19tc2cyKCJDV1kgLSBIQUxfTU9ERV8xMUcsIGNoYW5uZWxCTSA9IDB4IiwgKmNoYW5uZWxCTSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvL2Vsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvL2NoYW5uZWxCTSA9IE5VTEw7CisgICAgICAgICAgICB9CisJCQlicmVhazsKKwkJY2FzZSBIQUxfTU9ERV8xMUdfVFVSQk86CisJCSAgICAvL3dlIGRvbid0IGhhdmUgdHVyYm8gbW9kZSBzbyB3ZSBkaXNhYmxlIGl0CisgICAgICAgICAgICAvL3ptX2RlYnVnX21zZzAoIkNXWSAtIEhBTF9NT0RFXzExR19UVVJCTyIpOworICAgICAgICAgICAgY2hhbm5lbEJNID0gTlVMTDsKKwkJCS8vcmQgPSAmcmQyR0h6OworCQkJLy9jaGFubmVsQk0gPSByZC0+Y2hhbjExZ190dXJibzsKKwkJCS8vZnJlcXMgPSAmcmVnRG1uMkdoejExZ1R1cmJvRnJlcVswXTsKKwkJCS8vY3RsID0gcmQtPmNvbmZvcm1hbmNlVGVzdExpbWl0IHwgQ1RMXzEwOEc7CisJCQlicmVhazsKKwkJY2FzZSBIQUxfTU9ERV8xMUFfVFVSQk86CisJCSAgICAvL3dlIGRvbid0IGhhdmUgdHVyYm8gbW9kZSBzbyB3ZSBkaXNhYmxlIGl0CisgICAgICAgICAgICAvL3ptX2RlYnVnX21zZzAoIkNXWSAtIEhBTF9NT0RFXzExQV9UVVJCTyIpOworICAgICAgICAgICAgY2hhbm5lbEJNID0gTlVMTDsKKwkJCS8vcmQgPSAmcmQ1R0h6OworCQkJLy9jaGFubmVsQk0gPSByZC0+Y2hhbjExYV9keW5fdHVyYm87CisJCQkvL2ZyZXFzID0gJnJlZ0RtbjVHaHpUdXJib0ZyZXFbMF07CisJCQkvL2N0bCA9IHJkLT5jb25mb3JtYW5jZVRlc3RMaW1pdCB8IENUTF8xMDhHOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisgICAgICAgICAgICB6bV9kZWJ1Z19tc2cxKCJVbmtvbnduIEhBTCBtb2RlICIsIGNtLT5tb2RlKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChjaGFubmVsQk0gPT0gTlVMTCkKKwkJeworCQkgICAgLy96bV9kZWJ1Z19tc2cwKCJDV1kgLSBjaGFubmVsQk0gaXMgTlVMTCIpOworCQkgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlzQ2hhbkJpdE1hc2taZXJvKGNoYW5uZWxCTSkpCisgICAgICAgIHsKKwkgICAgICAgIC8vem1fZGVidWdfbXNnMCgiQ1dZIC0gQml0TWFzayBpcyBaZXJvIik7CisJICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFJBWTpJcyBpdCBvaz8/CisgICAgICAgIGlmIChmcmVxcyA9PSBOVUxMICkKKyAgICAgICAgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworCQlmb3IgKGI9MDtiPDY0KkJNTEVOOyBiKyspCisJCXsKKwkJCWlmIChJU19CSVRfU0VUKGIsY2hhbm5lbEJNKSkKKwkJCXsKKwkJCQlmYmFuZCA9ICZmcmVxc1tiXTsKKworCQkJCS8vem1fZGVidWdfbXNnMSgiQ1dZIC0gbG93Q2hhbm5lbCA9ICIsIGZiYW5kLT5sb3dDaGFubmVsKTsKKwkJCQkvL3ptX2RlYnVnX21zZzEoIkNXWSAtIGhpZ2hDaGFubmVsID0gIiwgZmJhbmQtPmhpZ2hDaGFubmVsKTsKKwkJCQkvL3ptX2RlYnVnX21zZzEoIkNXWSAtIGNoYW5uZWxTZXAgPSAiLCBmYmFuZC0+Y2hhbm5lbFNlcCk7CisJCQkJZm9yIChjPWZiYW5kLT5sb3dDaGFubmVsOyBjIDw9IGZiYW5kLT5oaWdoQ2hhbm5lbDsKKwkJCQkgICAgIGMgKz0gZmJhbmQtPmNoYW5uZWxTZXApCisJCQkJeworCQkJCQlaTV9IQUxfQ0hBTk5FTCBpY3Y7CisKKyAgICAgICAgICAgICAgICAgICAgLy9EaXNhYmxlIGFsbCBERlMgY2hhbm5lbAorICAgICAgICAgICAgICAgICAgICBpZiAoKGhwUHJpdi0+ZGlzYWJsZURmc0NoPT0wKSB8fCAoIShmYmFuZC0+dXNlRGZzICYgcmQtPmRmc01hc2spKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGZiYW5kLT5jaGFubmVsQlcgPCAyMCApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgIFRlbXBvcmFyeSBkaXNjYXJkIGNoYW5uZWwgdGhhdCBCVyA8IDIwTUh6ICg1IG9yIDEwTUh6KSAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICBPdXIgYXJjaGl0ZWN0dXJlIGRvZXMgbm90IGltcGxlbW50IGl0ICEhISAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisJCQkJCWlmICgoYyA+PSBjX2xvKSAmJiAoYyA8PSBjX2hpKSkKKwkJCQkJeworCQkJCQkgICAgaWN2LmNoYW5uZWwgPSBjOworCQkJCQkgICAgaWN2LmNoYW5uZWxGbGFncyA9IGNtLT5mbGFnczsKKwkJCQkJICAgIGljdi5tYXhSZWdUeFBvd2VyID0gZmJhbmQtPnBvd2VyRGZzOworCQkJCQkgICAgaWYgKGZiYW5kLT51c2VQYXNzU2NhbiAmIHJkLT5wc2NhbikKKwkJCQkJICAgIAlpY3YuY2hhbm5lbEZsYWdzIHw9IFpNX1JFR19GTEFHX0NIQU5ORUxfUEFTU0lWRTsKKwkJCQkJICAgIGVsc2UKKwkJCQkJICAgIAlpY3YuY2hhbm5lbEZsYWdzICY9IH5aTV9SRUdfRkxBR19DSEFOTkVMX1BBU1NJVkU7CisJCQkJCSAgICBpZiAoZmJhbmQtPnVzZURmcyAmIHJkLT5kZnNNYXNrKQorCQkJCQkgICAgCWljdi5wcml2RmxhZ3MgPSBaTV9SRUdfRkxBR19DSEFOTkVMX0RGUzsKKwkJCQkJICAgIGVsc2UKKwkJCQkJICAgIAlpY3YucHJpdkZsYWdzID0gMDsKKworCQkJCQkgICAgLyogRm9yIG5vdyBkaXNhYmxlIHJhZGFyIGZvciBGQ0MzICovCisJCQkJCSAgICBpZiAoZmJhbmQtPnVzZURmcyAmIHJkLT5kZnNNYXNrICYgREZTX0ZDQzMpCisJCQkJCSAgICB7CisJCQkJCSAgICAJaWN2LnByaXZGbGFncyAmPSB+Wk1fUkVHX0ZMQUdfQ0hBTk5FTF9ERlM7CisJCQkJCSAgICAJaWN2LnByaXZGbGFncyB8PSBaTV9SRUdfRkxBR19DSEFOTkVMX0RGU19DTEVBUjsKKwkJCQkJICAgIH0KKworCQkJCQkgICAgaWYocmQtPmZsYWdzICYgTElNSVRfRlJBTUVfNE1TKQorCQkJCQkgICAgCWljdi5wcml2RmxhZ3MgfD0gWk1fUkVHX0ZMQUdfQ0hBTk5FTF9ERlNfQ0xFQVI7CisKKwkJCQkJICAgIGljdi5taW5UeFBvd2VyID0gMDsKKwkJCQkJICAgIGljdi5tYXhUeFBvd2VyID0gMDsKKworICAgICAgICAJCQkgICAgem1fYXNzZXJ0KG5leHQgPCA2MCk7CisKKwkJCQkJICAgIHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsW25leHQrK10gPSBpY3Y7CisJCQkJICAgIH0KKwkJCQl9CisJCQl9CisJCX0KKwl9CisJfQorCXdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsQ250ID0gbmV4dDsKKworICAgICNpZiAwCisgICAgeworICAgICAgICAvKiBkZWJ1ZyBwcmludCAqLworICAgICAgICB1MzJfdCBpOworICAgICAgICBEYmdQcmludCgiXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKKyAgICAgICAgRGJnUHJpbnQoInpmSHBHZXRSZWd1bGF0aW9uVGFibGUgcHJpbnQgYWxsIGNoYW5uZWwgaW5mbyByZWdpbmNvZGUgPSAweCV4XG4iLCB3ZC0+cmVndWxhdGlvblRhYmxlLnJlZ2lvbkNvZGUpOworICAgICAgICBEYmdQcmludCgiaW5kZXggIGNoYW5uZWwgIGNoYW5uZWxGbGFncyAgIG1heFJlZ1R4UG93ZXIgIHByaXZGbGFncyAgdXNlREZTXG4iKTsKKworICAgICAgICBmb3IgKGk9MDsgaTx3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbENudDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBEYmdQcmludCgiJTAyZCAgICAgICAlZCAgICAgICAgICUwNHggICAgICAgICAgICUwMmQgICAgICAgICV4ICAgICAleFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBpLAorICAgICAgICAgICAgICAgICAgICAgIHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsW2ldLmNoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgd2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxbaV0uY2hhbm5lbEZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgIHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsW2ldLm1heFJlZ1R4UG93ZXIsCisgICAgICAgICAgICAgICAgICAgICAgd2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxbaV0ucHJpdkZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgIHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsW2ldLnByaXZGbGFncyAmIFpNX1JFR19GTEFHX0NIQU5ORUxfREZTKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAjZW5kaWYKKworICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7Cit9CisKK3ZvaWQgemZIcEdldFJlZ3VsYXRpb25UYWJsZWZyb21SZWdpb25Db2RlKHpkZXZfdCogZGV2LCB1MTZfdCByZWdpb25Db2RlKQoreworICAgIHUxNl90IGNfbG8gPSAyMDAwLCBjX2hpID0gNjAwMDsgLy9kZWZhdWx0IGNoYW5uZWwgaXMgYWxsIGVuYWJsZQorICAgIHU4X3QgaXNvTmFtZVszXSA9IHsnTicsICdBJywgMH07CisKKyAgICB6ZkNvcmVTZXRJc29OYW1lKGRldiwgaXNvTmFtZSk7CisKKyAgICB6ZkhwR2V0UmVndWxhdGlvblRhYmxlKGRldiwgcmVnaW9uQ29kZSwgY19sbywgY19oaSk7Cit9CisKK3ZvaWQgemZIcEdldFJlZ3VsYXRpb25UYWJsZWZyb21Db3VudHJ5KHpkZXZfdCogZGV2LCB1MTZfdCBDb3VudHJ5Q29kZSkKK3sKKyAgICB1MTZfdCBpOworICAgIHUxNl90IGNfbG8gPSAyMDAwLCBjX2hpID0gNjAwMDsgLy9kZWZhdWx0IGNoYW5uZWwgaXMgYWxsIGVuYWJsZQorICAgIHUxNl90IFJlZ0RvbWFpbjsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgTihhbGxDb3VudHJpZXMpOyBpKyspCisgICAgeworICAgICAgICBpZiAoQ291bnRyeUNvZGUgPT0gYWxsQ291bnRyaWVzW2ldLmNvdW50cnlDb2RlKQorICAgICAgICB7CisgICAgICAgICAgICBSZWdEb21haW4gPSBhbGxDb3VudHJpZXNbaV0ucmVnRG1uRW51bTsKKworICAgICAgICAgICAgLy8gcmVhZCB0aGUgQUNVIGNvdW50cnkgY29kZSBmcm9tIEVFUFJPTQorICAgICAgICAgICAgemZDb3JlU2V0SXNvTmFtZShkZXYsICh1OF90KilhbGxDb3VudHJpZXNbaV0uaXNvTmFtZSk7CisKKyAgICAgICAgICAgIC8vem1fZGVidWdfbXNnX3MoIkNXWSAtIENvdW50cnkgTmFtZSA9ICIsIGFsbENvdW50cmllc1tpXS5uYW1lKTsKKworICAgICAgICAgICAgaWYgKHdkLT5yZWd1bGF0aW9uVGFibGUucmVnaW9uQ29kZSAhPSBSZWdEb21haW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy96bV9kZWJ1Z19tc2cwKCJDV1kgLSBDaGFuZ2UgcmVndWxhdG9yeSB0YWJsZSIpOworCisgICAgICAgICAgICAgICAgemZIcEdldFJlZ3VsYXRpb25UYWJsZShkZXYsIFJlZ0RvbWFpbiwgY19sbywgY19oaSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisgICAgem1fZGVidWdfbXNnMSgiSW52YWxpZCBDb3VudHJ5Q29kZSA9ICIsIENvdW50cnlDb2RlKTsKK30KKwordThfdCB6ZkhwR2V0UmVndWxhdGlvblRhYmxlZnJvbUlTTyh6ZGV2X3QqIGRldiwgdThfdCAqY291bnRyeUluZm8sIHU4X3QgbGVuZ3RoKQoreworICAgIHUxNl90IGk7CisgICAgdTE2X3QgUmVnRG9tYWluOworICAgIHUxNl90IGNfbG8gPSAyMDAwLCBjX2hpID0gNjAwMDsgLy9kZWZhdWx0IGNoYW5uZWwgaXMgYWxsIGVuYWJsZQorICAgIC8vdThfdCBzdHJMZW4gPSAyOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIGlmIChjb3VudHJ5SW5mb1s0XSAhPSAweDIwKQorICAgIHsgLy8gd2l0aCAoSSluZG9vci8oTyl1dGRvb3IgaW5mbworICAgICAgICAvL3N0ckxlbiA9IDM7CisgICAgfQorICAgIC8vem1fZGVidWdfbXNnX3MoIkRlc2lyZWQgaXNvIG5hbWUgPSAiLCBpc29OYW1lKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgTihhbGxDb3VudHJpZXMpOyBpKyspCisgICAgeworICAgICAgICAvL3ptX2RlYnVnX21zZ19zKCJDdXJyZW50IGlzbyBuYW1lID0gIiwgYWxsQ291bnRyaWVzW2ldLmlzb05hbWUpOworICAgICAgICBpZiAoemZNZW1vcnlJc0VxdWFsKCh1OF90ICopYWxsQ291bnRyaWVzW2ldLmlzb05hbWUsICh1OF90ICopJmNvdW50cnlJbmZvWzJdLCBsZW5ndGgtMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vRGJnUHJpbnQoIlNldCBjdXJyZW50IGlzbyBuYW1lID0gJXNcbiIsIGFsbENvdW50cmllc1tpXS5pc29OYW1lKTsKKyAgICAgICAgICAgIC8vem1fZGVidWdfbXNnMCgiaXNvIG5hbWUgaGl0ISEiKTsKKworICAgICAgICAgICAgUmVnRG9tYWluID0gYWxsQ291bnRyaWVzW2ldLnJlZ0RtbkVudW07CisKKyAgICAgICAgICAgIGlmICh3ZC0+cmVndWxhdGlvblRhYmxlLnJlZ2lvbkNvZGUgIT0gUmVnRG9tYWluKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHpmSHBHZXRSZWd1bGF0aW9uVGFibGUoZGV2LCBSZWdEb21haW4sIGNfbG8sIGNfaGkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvL3doaWxlIChpbmRleCA8IChjb3VudHJ5SW5mb1sxXSsyKSkKKyAgICAgICAgICAgIC8veworICAgICAgICAgICAgLy8gIGlmIChjb3VudHJ5SW5mb1tpbmRleF0gPD0gMTQpCisgICAgICAgICAgICAvLyAgeworICAgICAgICAgICAgLy8gICAgICAgIC8qIGNhbGN1bGF0ZSAyLjRHSHogbG93IGJvdW5kYXJ5IGNoYW5uZWwgZnJlcXVlbmN5ICovCisgICAgICAgICAgICAvLyAgICAgICAgY2ggPSBjb3VudHJ5SW5mb1tpbmRleF07CisgICAgICAgICAgICAvLyAgICAgICAgaWYgKCBjaCA9PSAxNCApCisgICAgICAgICAgICAvLyAgICAgICAgICAgIGNfbG8gPSBaTV9DSF9HXzE0OworICAgICAgICAgICAgLy8gICAgICAgIGVsc2UKKyAgICAgICAgICAgIC8vICAgICAgICAgICAgY19sbyA9IFpNX0NIX0dfMSArIChjaCAtIDEpICogNTsKKyAgICAgICAgICAgIC8vICAgICAgICAvKiBjYWxjdWxhdGUgMi40R0h6IGhpZ2ggYm91bmRhcnkgY2hhbm5lbCBmcmVxdWVuY3kgKi8KKyAgICAgICAgICAgIC8vICAgICAgICBjaCA9IGNvdW50cnlJbmZvW2luZGV4XSArIGNvdW50cnlJbmZvW2luZGV4ICsgMV0gLSAxOworICAgICAgICAgICAgLy8gICAgICAgIGlmICggY2ggPT0gMTQgKQorICAgICAgICAgICAgLy8gICAgICAgICAgICBjX2hpID0gWk1fQ0hfR18xNDsKKyAgICAgICAgICAgIC8vICAgICAgICBlbHNlCisgICAgICAgICAgICAvLyAgICAgICAgICAgIGNfaGkgPSBaTV9DSF9HXzEgKyAoY2ggLSAxKSAqIDU7CisgICAgICAgICAgICAvLyAgfQorICAgICAgICAgICAgLy8gIGVsc2UKKyAgICAgICAgICAgIC8vICB7CisgICAgICAgICAgICAvLyAgICAgICAgLyogY2FsY3VsYXRlIDVHSHogbG93IGJvdW5kYXJ5IGNoYW5uZWwgZnJlcXVlbmN5ICovCisgICAgICAgICAgICAvLyAgICAgICAgY2ggPSBjb3VudHJ5SW5mb1tpbmRleF07CisgICAgICAgICAgICAvLyAgICAgICAgaWYgKCAoY2ggPj0gMTg0KSYmKGNoIDw9IDE5NikgKQorICAgICAgICAgICAgLy8gICAgICAgICAgICBjX2xvID0gNDAwMCArIGNoKjU7CisgICAgICAgICAgICAvLyAgICAgICAgZWxzZQorICAgICAgICAgICAgLy8gICAgICAgICAgICBjX2xvID0gNTAwMCArIGNoKjU7CisgICAgICAgICAgICAvLyAgICAgICAgLyogY2FsY3VsYXRlIDVHSHogaGlnaCBib3VuZGFyeSBjaGFubmVsIGZyZXF1ZW5jeSAqLworICAgICAgICAgICAgLy8gICAgICAgIGNoID0gY291bnRyeUluZm9baW5kZXhdICsgY291bnRyeUluZm9baW5kZXggKyAxXSAtIDE7CisgICAgICAgICAgICAvLyAgICAgICAgaWYgKCAoY2ggPj0gMTg0KSYmKGNoIDw9IDE5NikgKQorICAgICAgICAgICAgLy8gICAgICAgICAgICBjX2hpID0gNDAwMCArIGNoKjU7CisgICAgICAgICAgICAvLyAgICAgICAgZWxzZQorICAgICAgICAgICAgLy8gICAgICAgICAgICBjX2hpID0gNTAwMCArIGNoKjU7CisgICAgICAgICAgICAvLyAgfQorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vICB6ZkhwR2V0UmVndWxhdGlvblRhYmxlKGRldiwgUmVnRG9tYWluLCBjX2xvLCBjX2hpKTsKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyAgaW5kZXgrPTM7CisgICAgICAgICAgICAvL30KKworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisgICAgLy96bV9kZWJ1Z19tc2dfcygiSW52YWxpZCBpc28gbmFtZSA9ICIsICZjb3VudHJ5SW5mb1syXSk7CisgICAgcmV0dXJuIDE7Cit9CisKK2NvbnN0IGNoYXIqIHpmSHBHZXRpc29OYW1lZnJvbXJlZ2lvbkNvZGUoemRldl90KiBkZXYsIHUxNl90IHJlZ2lvbkNvZGUpCit7CisgICAgdTE2X3QgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBOKGFsbENvdW50cmllcyk7IGkrKykKKyAgICB7CisgICAgICAgIGlmIChhbGxDb3VudHJpZXNbaV0ucmVnRG1uRW51bSA9PSByZWdpb25Db2RlKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYWxsQ291bnRyaWVzW2ldLmlzb05hbWU7CisgICAgICAgIH0KKyAgICB9CisgICAgLyogbm8gbWF0Y2hpbmcgaXRlbSwgcmV0dXJuIGRlZmF1bHQgKi8KKyAgICByZXR1cm4gYWxsQ291bnRyaWVzWzBdLmlzb05hbWU7Cit9CisKK3UxNl90IHpmSHBHZXRSZWdpb25Db2RlRnJvbUlzb05hbWUoemRldl90KiBkZXYsIHU4X3QgKmNvdW50cnlJc29OYW1lKQoreworICAgIHUxNl90IGk7CisgICAgdTE2X3QgcmVnaW9uQ29kZTsKKworICAgIC8qIGlmIG5vIG1hdGNoaW5nIGl0ZW0sIHJldHVybiBkZWZhdWx0ICovCisgICAgcmVnaW9uQ29kZSA9IERFRl9SRUdETU47CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgTihhbGxDb3VudHJpZXMpOyBpKyspCisgICAgeworICAgICAgICBpZiAoemZNZW1vcnlJc0VxdWFsKCh1OF90ICopYWxsQ291bnRyaWVzW2ldLmlzb05hbWUsIGNvdW50cnlJc29OYW1lLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmVnaW9uQ29kZSA9IGFsbENvdW50cmllc1tpXS5yZWdEbW5FbnVtOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmVnaW9uQ29kZTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmSHBEZWxldGVBbGxvd0NoYW5uZWwgICAgICAqLworLyogICAgICBEZWxldGUgQWxsb3cgQ2hhbm5lbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgIDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZnJlcSA6IGZyZXF1ZW5jeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgMCA6IHN1Y2Nlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIG90aGVyIDogZmFpbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIENoYW8tV2VuIFlhbmcgICAgICAgICBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgIDIwMDcuMyAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MTZfdCB6ZkhwRGVsZXRlQWxsb3dDaGFubmVsKHpkZXZfdCogZGV2LCB1MTZfdCBmcmVxKQoreworICAgIHUxNl90IGksIGJhbmRJbmRleCA9IDA7CisgICAgdTE2X3QgZGZzNUdCYW5kW11bMl0gPSB7ezUxNTAsIDUyNDB9LCB7NTI2MCwgNTM1MH0sIHs1NDUwLCA1NzAwfSwgezU3MjUsIDU4MjV9fTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICAvKiBGaW5kIHdoaWNoIGJhbmQgZG9lcyB0aGlzIGZyZXF1ZW5jeSBiZWxvbmcgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKChmcmVxID49IGRmczVHQmFuZFtpXVswXSkgJiYgKGZyZXEgPD0gZGZzNUdCYW5kW2ldWzFdKSkKKyAgICAgICAgICAgIGJhbmRJbmRleCA9IGkgKyAxOworICAgIH0KKworICAgIGlmIChiYW5kSW5kZXggPT0gMCkKKyAgICB7CisgICAgICAgIC8qIDIuNEcsIGRvbid0IGNhcmUgKi8KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGJhbmRJbmRleC0tOworICAgIH0KKyAgICAvKiBTZXQgYWxsIGNoYW5uZWxzIGluIHRoaXMgYmFuZCB0byBwYXNzaXZlIHNjYW4gKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgd2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxDbnQ7IGkrKykKKyAgICB7CisgICAgICAgIGlmICgod2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxbaV0uY2hhbm5lbCA+PSBkZnM1R0JhbmRbYmFuZEluZGV4XVswXSkgJiYKKyAgICAgICAgICAgICh3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbFtpXS5jaGFubmVsIDw9IGRmczVHQmFuZFtiYW5kSW5kZXhdWzFdKSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogaWYgY2hhbm5lbCBpcyBub3QgcGFzc2l2ZSwgc2V0IGl0IHRvIGJlIHBhc3NpdmUgYW5kIG1hcmsgaXQgKi8KKyAgICAgICAgICAgIGlmICgod2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxbaV0uY2hhbm5lbEZsYWdzICYKKyAgICAgICAgICAgICAgICAgICAgWk1fUkVHX0ZMQUdfQ0hBTk5FTF9QQVNTSVZFKSA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsW2ldLmNoYW5uZWxGbGFncyB8PQorICAgICAgICAgICAgICAgICAgICAgICAgKFpNX1JFR19GTEFHX0NIQU5ORUxfUEFTU0lWRSB8IFpNX1JFR19GTEFHX0NIQU5ORUxfQ1NBKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCit1MTZfdCB6ZkhwQWRkQWxsb3dDaGFubmVsKHpkZXZfdCogZGV2LCB1MTZfdCBmcmVxKQoreworICAgIHUxNl90IGksIGosIGFycmF5SW5kZXg7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgd2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxDbnQ7IGkrKykKKyAgICB7CisgICAgICAgIGlmICh3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbFtpXS5jaGFubmVsID09IGZyZXEpCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoIGkgPT0gd2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxDbnQpCisgICAgeworICAgICAgICBmb3IgKGogPSAwOyBqIDwgd2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxDbnQ7IGorKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsW2pdLmNoYW5uZWwgPiBmcmVxKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLy96bV9kZWJ1Z19tc2cxKCJDV1kgLSBhZGQgZnJlcXVlbmN5ID0gIiwgZnJlcSk7CisgICAgICAgIC8vem1fZGVidWdfbXNnMSgiQ1dZIC0gY2hhbm5lbCBhcnJheSBpbmRleCA9ICIsIGopOworCisgICAgICAgIGFycmF5SW5kZXggPSBqOworCisgICAgICAgIGlmIChhcnJheUluZGV4IDwgd2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxDbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaiA9IHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsQ250OyBqID4gYXJyYXlJbmRleDsgai0tKQorICAgICAgICAgICAgICAgIHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsW2pdID0gd2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxbaiAtIDFdOworICAgICAgICB9CisgICAgICAgIHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsW2FycmF5SW5kZXhdLmNoYW5uZWwgPSBmcmVxOworCisgICAgICAgIHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsQ250Kys7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3UxNl90IHpmSHBJc0Rmc0NoYW5uZWxOQ1MoemRldl90KiBkZXYsIHUxNl90IGZyZXEpCit7CisgICAgdThfdCBmbGFnID0gWk1fUkVHX0ZMQUdfQ0hBTk5FTF9ERlM7CisgICAgdTE2X3QgaTsKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgd2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxDbnQ7IGkrKykKKyAgICB7CisgICAgICAgIC8vRGJnUHJpbnQoIkRGUzpmcmVxPSVkLCBjaGFuPSVkIiwgZnJlcSwgd2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxbaV0uY2hhbm5lbCk7CisgICAgICAgIGlmICh3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbFtpXS5jaGFubmVsID09IGZyZXEpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZsYWcgPSB3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbFtpXS5wcml2RmxhZ3M7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAoZmxhZyAmIChaTV9SRUdfRkxBR19DSEFOTkVMX0RGU3xaTV9SRUdfRkxBR19DSEFOTkVMX0RGU19DTEVBUikpOworfQorCit1MTZfdCB6ZkhwSXNEZnNDaGFubmVsKHpkZXZfdCogZGV2LCB1MTZfdCBmcmVxKQoreworICAgIHU4X3QgZmxhZyA9IFpNX1JFR19GTEFHX0NIQU5ORUxfREZTOworICAgIHUxNl90IGk7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgd2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxDbnQ7IGkrKykKKyAgICB7CisgICAgICAgIC8vRGJnUHJpbnQoIkRGUzpmcmVxPSVkLCBjaGFuPSVkIiwgZnJlcSwgd2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxbaV0uY2hhbm5lbCk7CisgICAgICAgIGlmICh3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbFtpXS5jaGFubmVsID09IGZyZXEpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZsYWcgPSB3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbFtpXS5wcml2RmxhZ3M7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICByZXR1cm4gKGZsYWcgJiAoWk1fUkVHX0ZMQUdfQ0hBTk5FTF9ERlN8Wk1fUkVHX0ZMQUdfQ0hBTk5FTF9ERlNfQ0xFQVIpKTsKK30KKwordTE2X3QgemZIcElzQWxsb3dlZENoYW5uZWwoemRldl90KiBkZXYsIHUxNl90IGZyZXEpCit7CisgICAgdTE2X3QgaTsKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgd2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxDbnQ7IGkrKykKKyAgICB7CisgICAgICAgIGlmICh3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbFtpXS5jaGFubmVsID09IGZyZXEpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3UxNl90IHpmSHBGaW5kRmlyc3ROb25EZnNDaGFubmVsKHpkZXZfdCogZGV2LCB1MTZfdCBhQmFuZCkKK3sKKyAgICB1MTZfdCBjaGFuID0gMjQxMjsKKyAgICB1MTZfdCBpOworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgZm9yIChpID0gMDsgaSA8IHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsQ250OyBpKyspCisgICAgeworICAgICAgICBpZiAoKHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsW2ldLnByaXZGbGFncyAmIFpNX1JFR19GTEFHX0NIQU5ORUxfREZTKSAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoYUJhbmQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsW2ldLmNoYW5uZWwgPiAzMDAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2hhbiA9IHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsW2ldLmNoYW5uZWw7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAod2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxbaV0uY2hhbm5lbCA8IDMwMDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjaGFuID0gd2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxbaV0uY2hhbm5lbDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIHJldHVybiBjaGFuOworfQorCisKKy8qIHBvcnRpbmcgZnJvbSBBQ1UgKi8KKy8qIHNhdmUgUmVndWxhdG9yeURvbWFpbiBpbiBocHJpdiAqLwordThfdCB6ZkhwR2V0UmVndWxhdG9yeURvbWFpbih6ZGV2X3QqIGRldikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBzd2l0Y2ggKHdkLT5yZWd1bGF0aW9uVGFibGUucmVnaW9uQ29kZSkKKyAgICB7CisgICAgICAgIGNhc2UgTk9fRU5VTVJEOgorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBGQ0MxX0ZDQ0E6CisgICAgICAgIGNhc2UgRkNDMV9XT1JMRDoKKyAgICAgICAgY2FzZSBGQ0M0X0ZDQ0E6CisgICAgICAgIGNhc2UgRkNDNV9GQ0NBOgorICAgICAgICBjYXNlIEZDQzJfV09STEQ6CisgICAgICAgIGNhc2UgRkNDMl9FVFNJQzoKKyAgICAgICAgY2FzZSBGQ0MzX0ZDQ0E6CisgICAgICAgIGNhc2UgRkNDM19XT1JMRDoKKyAgICAgICAgY2FzZSBGQ0MxOgorICAgICAgICBjYXNlIEZDQzI6CisgICAgICAgIGNhc2UgRkNDMzoKKyAgICAgICAgY2FzZSBGQ0M0OgorICAgICAgICBjYXNlIEZDQzU6CisgICAgICAgIGNhc2UgRkNDQToKKyAgICAgICAgICAgIHJldHVybiAweDEwOy8vV0dfQU1FUklDQVMgRE9UMTFfUkVHX0RPTUFJTl9GQ0MgIFVuaXRlZCBTdGF0ZXMKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgRkNDMl9GQ0NBOgorICAgICAgICAgICAgcmV0dXJuIDB4MjA7Ly9ET1QxMV9SRUdfRE9NQUlOX0RPQyAgQ2FuYWRhCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEVUU0kxX1dPUkxEOgorICAgICAgICBjYXNlIEVUU0kzX0VUU0lBOgorICAgICAgICBjYXNlIEVUU0kyX1dPUkxEOgorICAgICAgICBjYXNlIEVUU0kzX1dPUkxEOgorICAgICAgICBjYXNlIEVUU0k0X1dPUkxEOgorICAgICAgICBjYXNlIEVUU0k0X0VUU0lDOgorICAgICAgICBjYXNlIEVUU0k1X1dPUkxEOgorICAgICAgICBjYXNlIEVUU0k2X1dPUkxEOgorICAgICAgICBjYXNlIEVUU0lfUkVTRVJWRUQ6CisgICAgICAgIGNhc2UgRVRTSTE6CisgICAgICAgIGNhc2UgRVRTSTI6CisgICAgICAgIGNhc2UgRVRTSTM6CisgICAgICAgIGNhc2UgRVRTSTQ6CisgICAgICAgIGNhc2UgRVRTSTU6CisgICAgICAgIGNhc2UgRVRTSTY6CisgICAgICAgIGNhc2UgRVRTSUE6CisgICAgICAgIGNhc2UgRVRTSUI6CisgICAgICAgIGNhc2UgRVRTSUM6CisgICAgICAgICAgICByZXR1cm4gMHgzMDsvL1dHX0VNRUEgRE9UMTFfUkVHX0RPTUFJTl9FVFNJICBNb3N0IG9mIEV1cm9wZQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBNS0sxX01LS0E6CisgICAgICAgIGNhc2UgTUtLMV9NS0tCOgorICAgICAgICBjYXNlIE1LSzJfTUtLQToKKyAgICAgICAgY2FzZSBNS0sxX0ZDQ0E6CisgICAgICAgIGNhc2UgTUtLMV9NS0tBMToKKyAgICAgICAgY2FzZSBNS0sxX01LS0EyOgorICAgICAgICBjYXNlIE1LSzFfTUtLQzoKKyAgICAgICAgY2FzZSBNS0szX01LS0I6CisgICAgICAgIGNhc2UgTUtLM19NS0tBMjoKKyAgICAgICAgY2FzZSBNS0szX01LS0M6CisgICAgICAgIGNhc2UgTUtLNF9NS0tCOgorICAgICAgICBjYXNlIE1LSzRfTUtLQTI6CisgICAgICAgIGNhc2UgTUtLNF9NS0tDOgorICAgICAgICBjYXNlIE1LSzVfTUtLQjoKKyAgICAgICAgY2FzZSBNS0s1X01LS0EyOgorICAgICAgICBjYXNlIE1LSzVfTUtLQzoKKyAgICAgICAgY2FzZSBNS0s2X01LS0I6CisgICAgICAgIGNhc2UgTUtLNl9NS0tBMjoKKyAgICAgICAgY2FzZSBNS0s2X01LS0M6CisgICAgICAgIGNhc2UgTUtLN19NS0tCOgorICAgICAgICBjYXNlIE1LSzdfTUtLQToKKyAgICAgICAgY2FzZSBNS0s3X01LS0M6CisgICAgICAgIGNhc2UgTUtLOF9NS0tCOgorICAgICAgICBjYXNlIE1LSzhfTUtLQTI6CisgICAgICAgIGNhc2UgTUtLOF9NS0tDOgorICAgICAgICBjYXNlIE1LSzZfTUtLQTE6CisgICAgICAgIGNhc2UgTUtLNl9GQ0NBOgorICAgICAgICBjYXNlIE1LSzdfTUtLQTE6CisgICAgICAgIGNhc2UgTUtLN19GQ0NBOgorICAgICAgICBjYXNlIE1LSzlfRkNDQToKKyAgICAgICAgY2FzZSBNS0s5X01LS0ExOgorICAgICAgICBjYXNlIE1LSzlfTUtLQzoKKyAgICAgICAgY2FzZSBNS0s5X01LS0EyOgorICAgICAgICBjYXNlIE1LSzEwX0ZDQ0E6CisgICAgICAgIGNhc2UgTUtLMTBfTUtLQTE6CisgICAgICAgIGNhc2UgTUtLMTBfTUtLQzoKKyAgICAgICAgY2FzZSBNS0sxMF9NS0tBMjoKKyAgICAgICAgY2FzZSBNS0sxMV9NS0tBOgorICAgICAgICBjYXNlIE1LSzExX0ZDQ0E6CisgICAgICAgIGNhc2UgTUtLMTFfTUtLQTE6CisgICAgICAgIGNhc2UgTUtLMTFfTUtLQzoKKyAgICAgICAgY2FzZSBNS0sxMV9NS0tBMjoKKyAgICAgICAgY2FzZSBNS0sxMl9NS0tBOgorICAgICAgICBjYXNlIE1LSzEyX0ZDQ0E6CisgICAgICAgIGNhc2UgTUtLMTJfTUtLQTE6CisgICAgICAgIGNhc2UgTUtLMTJfTUtLQzoKKyAgICAgICAgY2FzZSBNS0sxMl9NS0tBMjoKKyAgICAgICAgY2FzZSBNS0szX01LS0E6CisgICAgICAgIGNhc2UgTUtLM19NS0tBMToKKyAgICAgICAgY2FzZSBNS0szX0ZDQ0E6CisgICAgICAgIGNhc2UgTUtLNF9NS0tBOgorICAgICAgICBjYXNlIE1LSzRfTUtLQTE6CisgICAgICAgIGNhc2UgTUtLNF9GQ0NBOgorICAgICAgICBjYXNlIE1LSzlfTUtLQToKKyAgICAgICAgY2FzZSBNS0sxMF9NS0tBOgorICAgICAgICBjYXNlIE1LSzE6CisgICAgICAgIGNhc2UgTUtLMjoKKyAgICAgICAgY2FzZSBNS0szOgorICAgICAgICBjYXNlIE1LSzQ6CisgICAgICAgIGNhc2UgTUtLNToKKyAgICAgICAgY2FzZSBNS0s2OgorICAgICAgICBjYXNlIE1LSzc6CisgICAgICAgIGNhc2UgTUtLODoKKyAgICAgICAgY2FzZSBNS0s5OgorICAgICAgICBjYXNlIE1LSzEwOgorICAgICAgICBjYXNlIE1LSzExOgorICAgICAgICBjYXNlIE1LSzEyOgorICAgICAgICBjYXNlIE1LS0E6CisgICAgICAgIGNhc2UgTUtLQzoKKyAgICAgICAgICAgIHJldHVybiAweDQwOy8vV0dfSkFQQU4gRE9UMTFfUkVHX0RPTUFJTl9NS0sgIEphcGFuCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiAweEZGOy8vIERpZG4ndCBpbnB1dCBSZWdEbW4gYnkgbWVhbiB0byBkaXN0aW5ndWlzaCBieSBjdXN0b21lcgorCit9CisKKwordm9pZCB6ZkhwRGlzYWJsZURmc0NoYW5uZWwoemRldl90KiBkZXYsIHU4X3QgZGlzYWJsZUZsYWcpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgc3RydWN0IHpzSHBQcml2KiBocFByaXY9d2QtPmhwUHJpdmF0ZTsKKyAgICBocFByaXYtPmRpc2FibGVEZnNDaCA9IGRpc2FibGVGbGFnOworICAgIHJldHVybjsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzL2hhbC9ocHJlZy5oIGIvZHJpdmVycy9zdGFnaW5nL290dXMvaGFsL2hwcmVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmY4YzczZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL2hhbC9ocHJlZy5oCkBAIC0wLDAgKzEsNTI0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDUgWnlEQVMgVGVjaG5vbG9neSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggQXRoZXJvcyBDb21tdW5pY2F0aW9ucyBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKy8qICBNb2R1bGUgTmFtZSA6IGhwcmVnLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEFic3RyYWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgVGhpcyBtb2R1bGUgY29udGFpbnMgUmVndWxhdG9yeSBUYWJsZSBkZWZpbml0aW9ucy4gICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE5PVEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfSFBSRUdfSAorI2RlZmluZSBfSFBSRUdfSAorCit0eXBlZGVmIHUxNl90IEhBTF9DVFJZX0NPREU7CQkvKiBjb3VudHJ5IGNvZGUgKi8KK3R5cGVkZWYgdTE2X3QgSEFMX1JFR19ET01BSU47CQkvKiByZWd1bGF0b3J5IGRvbWFpbiBjb2RlICovCit0eXBlZGVmIGVudW0geworCUFIX0ZBTFNFID0gMCwJCS8qIE5COiBsb3RzIG9mIGNvZGUgYXNzdW1lcyBmYWxzZSBpcyB6ZXJvICovCisJQUhfVFJVRSAgPSAxLAorfSBIQUxfQk9PTDsKKworCisvKgorICogQ291bnRyeS9SZWdpb24gQ29kZXMgZnJvbSBNUyBXSU5OTFMuSAorICogTnVtYmVyaW5nIGZyb20gSVNPIDMxNjYKKyAqLworZW51bSBDb3VudHJ5Q29kZSB7CisgICAgQ1RSWV9BTEJBTklBICAgICAgICAgICAgICA9IDgsICAgICAgIC8qIEFsYmFuaWEgKi8KKyAgICBDVFJZX0FMR0VSSUEgICAgICAgICAgICAgID0gMTIsICAgICAgLyogQWxnZXJpYSAqLworICAgIENUUllfQVJHRU5USU5BICAgICAgICAgICAgPSAzMiwgICAgICAvKiBBcmdlbnRpbmEgKi8KKyAgICBDVFJZX0FSTUVOSUEgICAgICAgICAgICAgID0gNTEsICAgICAgLyogQXJtZW5pYSAqLworICAgIENUUllfQVVTVFJBTElBICAgICAgICAgICAgPSAzNiwgICAgICAvKiBBdXN0cmFsaWEgKi8KKyAgICBDVFJZX0FVU1RSSUEgICAgICAgICAgICAgID0gNDAsICAgICAgLyogQXVzdHJpYSAqLworICAgIENUUllfQVpFUkJBSUpBTiAgICAgICAgICAgPSAzMSwgICAgICAvKiBBemVyYmFpamFuICovCisgICAgQ1RSWV9CQUhSQUlOICAgICAgICAgICAgICA9IDQ4LCAgICAgIC8qIEJhaHJhaW4gKi8KKyAgICBDVFJZX0JFTEFSVVMgICAgICAgICAgICAgID0gMTEyLCAgICAgLyogQmVsYXJ1cyAqLworICAgIENUUllfQkVMR0lVTSAgICAgICAgICAgICAgPSA1NiwgICAgICAvKiBCZWxnaXVtICovCisgICAgQ1RSWV9CRUxJWkUgICAgICAgICAgICAgICA9IDg0LCAgICAgIC8qIEJlbGl6ZSAqLworICAgIENUUllfQk9MSVZJQSAgICAgICAgICAgICAgPSA2OCwgICAgICAvKiBCb2xpdmlhICovCisgICAgQ1RSWV9CT1NOSUEgICAgICAgICAgICAgICA9IDcwLCAgICAgIC8qIEJvc25pYSAqLworICAgIENUUllfQlJBWklMICAgICAgICAgICAgICAgPSA3NiwgICAgICAvKiBCcmF6aWwgKi8KKyAgICBDVFJZX0JSVU5FSV9EQVJVU1NBTEFNICAgID0gOTYsICAgICAgLyogQnJ1bmVpIERhcnVzc2FsYW0gKi8KKyAgICBDVFJZX0JVTEdBUklBICAgICAgICAgICAgID0gMTAwLCAgICAgLyogQnVsZ2FyaWEgKi8KKyAgICBDVFJZX0NBTkFEQSAgICAgICAgICAgICAgID0gMTI0LCAgICAgLyogQ2FuYWRhICovCisgICAgQ1RSWV9DSElMRSAgICAgICAgICAgICAgICA9IDE1MiwgICAgIC8qIENoaWxlICovCisgICAgQ1RSWV9DSElOQSAgICAgICAgICAgICAgICA9IDE1NiwgICAgIC8qIFBlb3BsZSdzIFJlcHVibGljIG9mIENoaW5hICovCisgICAgQ1RSWV9DT0xPTUJJQSAgICAgICAgICAgICA9IDE3MCwgICAgIC8qIENvbG9tYmlhICovCisgICAgQ1RSWV9DT1NUQV9SSUNBICAgICAgICAgICA9IDE4OCwgICAgIC8qIENvc3RhIFJpY2EgKi8KKyAgICBDVFJZX0NST0FUSUEgICAgICAgICAgICAgID0gMTkxLCAgICAgLyogQ3JvYXRpYSAqLworICAgIENUUllfQ1lQUlVTICAgICAgICAgICAgICAgPSAxOTYsICAgICAvKiBDeXBydXMgKi8KKyAgICBDVFJZX0NaRUNIICAgICAgICAgICAgICAgID0gMjAzLCAgICAgLyogQ3plY2ggUmVwdWJsaWMgKi8KKyAgICBDVFJZX0RFTk1BUksgICAgICAgICAgICAgID0gMjA4LCAgICAgLyogRGVubWFyayAqLworICAgIENUUllfRE9NSU5JQ0FOX1JFUFVCTElDICAgPSAyMTQsICAgICAvKiBEb21pbmljYW4gUmVwdWJsaWMgKi8KKyAgICBDVFJZX0VDVUFET1IgICAgICAgICAgICAgID0gMjE4LCAgICAgLyogRWN1YWRvciAqLworICAgIENUUllfRUdZUFQgICAgICAgICAgICAgICAgPSA4MTgsICAgICAvKiBFZ3lwdCAqLworICAgIENUUllfRUxfU0FMVkFET1IgICAgICAgICAgPSAyMjIsICAgICAvKiBFbCBTYWx2YWRvciAqLworICAgIENUUllfRVNUT05JQSAgICAgICAgICAgICAgPSAyMzMsICAgICAvKiBFc3RvbmlhICovCisgICAgQ1RSWV9GQUVST0VfSVNMQU5EUyAgICAgICA9IDIzNCwgICAgIC8qIEZhZXJvZSBJc2xhbmRzICovCisgICAgQ1RSWV9GSU5MQU5EICAgICAgICAgICAgICA9IDI0NiwgICAgIC8qIEZpbmxhbmQgKi8KKyAgICBDVFJZX0ZSQU5DRSAgICAgICAgICAgICAgID0gMjUwLCAgICAgLyogRnJhbmNlICovCisgICAgQ1RSWV9GUkFOQ0UyICAgICAgICAgICAgICA9IDI1NSwgICAgIC8qIEZyYW5jZTIgKi8KKyAgICBDVFJZX0dFT1JHSUEgICAgICAgICAgICAgID0gMjY4LCAgICAgLyogR2VvcmdpYSAqLworICAgIENUUllfR0VSTUFOWSAgICAgICAgICAgICAgPSAyNzYsICAgICAvKiBHZXJtYW55ICovCisgICAgQ1RSWV9HUkVFQ0UgICAgICAgICAgICAgICA9IDMwMCwgICAgIC8qIEdyZWVjZSAqLworICAgIENUUllfR1VBVEVNQUxBICAgICAgICAgICAgPSAzMjAsICAgICAvKiBHdWF0ZW1hbGEgKi8KKyAgICBDVFJZX0hPTkRVUkFTICAgICAgICAgICAgID0gMzQwLCAgICAgLyogSG9uZHVyYXMgKi8KKyAgICBDVFJZX0hPTkdfS09ORyAgICAgICAgICAgID0gMzQ0LCAgICAgLyogSG9uZyBLb25nIFMuQS5SLiwgUC5SLkMuICovCisgICAgQ1RSWV9IVU5HQVJZICAgICAgICAgICAgICA9IDM0OCwgICAgIC8qIEh1bmdhcnkgKi8KKyAgICBDVFJZX0lDRUxBTkQgICAgICAgICAgICAgID0gMzUyLCAgICAgLyogSWNlbGFuZCAqLworICAgIENUUllfSU5ESUEgICAgICAgICAgICAgICAgPSAzNTYsICAgICAvKiBJbmRpYSAqLworICAgIENUUllfSU5ET05FU0lBICAgICAgICAgICAgPSAzNjAsICAgICAvKiBJbmRvbmVzaWEgKi8KKyAgICBDVFJZX0lSQU4gICAgICAgICAgICAgICAgID0gMzY0LCAgICAgLyogSXJhbiAqLworICAgIENUUllfSVJBUSAgICAgICAgICAgICAgICAgPSAzNjgsICAgICAvKiBJcmFxICovCisgICAgQ1RSWV9JUkVMQU5EICAgICAgICAgICAgICA9IDM3MiwgICAgIC8qIElyZWxhbmQgKi8KKyAgICBDVFJZX0lTUkFFTCAgICAgICAgICAgICAgID0gMzc2LCAgICAgLyogSXNyYWVsICovCisgICAgQ1RSWV9JU1JBRUwyICAgICAgICAgICAgICA9IDM3NywgICAgIC8qIElzcmFlbDIgKi8KKyAgICBDVFJZX0lUQUxZICAgICAgICAgICAgICAgID0gMzgwLCAgICAgLyogSXRhbHkgKi8KKyAgICBDVFJZX0pBTUFJQ0EgICAgICAgICAgICAgID0gMzg4LCAgICAgLyogSmFtYWljYSAqLworICAgIENUUllfSkFQQU4gICAgICAgICAgICAgICAgPSAzOTIsICAgICAvKiBKYXBhbiAqLworICAgIENUUllfSkFQQU4xICAgICAgICAgICAgICAgPSAzOTMsICAgICAvKiBKYXBhbiAoSlAxKSAqLworICAgIENUUllfSkFQQU4yICAgICAgICAgICAgICAgPSAzOTQsICAgICAvKiBKYXBhbiAoSlAwKSAqLworICAgIENUUllfSkFQQU4zICAgICAgICAgICAgICAgPSAzOTUsICAgICAvKiBKYXBhbiAoSlAxLTEpICovCisgICAgQ1RSWV9KQVBBTjQgICAgICAgICAgICAgICA9IDM5NiwgICAgIC8qIEphcGFuIChKRTEpICovCisgICAgQ1RSWV9KQVBBTjUgICAgICAgICAgICAgICA9IDM5NywgICAgIC8qIEphcGFuIChKRTIpICovCisgICAgQ1RSWV9KQVBBTjYgICAgICAgICAgICAgICA9IDM5OSwgICAgIC8qIEphcGFuIChKUDYpICovCisKKyAgICBDVFJZX0pBUEFONwkgICAgICAgICAgICAgID0gNDAwNywgICAgLyogSmFwYW4gKEo3KSAqLworICAgIENUUllfSkFQQU44CSAgICAgICAgICAgICAgPSA0MDA4LCAgICAvKiBKYXBhbiAoSjgpICovCisgICAgQ1RSWV9KQVBBTjkgICAgICAgICAgICAgICA9IDQwMDksICAgIC8qIEphcGFuIChKOSkgKi8KKworICAgIENUUllfSkFQQU4xMCAgICAgICAgICAgICAgPSA0MDEwLCAgICAvKiBKYXBhbiAoSjEwKSAqLworICAgIENUUllfSkFQQU4xMSAgICAgICAgICAgICAgPSA0MDExLCAgICAvKiBKYXBhbiAoSjExKSAqLworICAgIENUUllfSkFQQU4xMiAgICAgICAgICAgICAgPSA0MDEyLCAgICAvKiBKYXBhbiAoSjEyKSAqLworCisgICAgQ1RSWV9KQVBBTjEzICAgICAgICAgICAgICA9IDQwMTMsICAgIC8qIEphcGFuIChKMTMpICovCisgICAgQ1RSWV9KQVBBTjE0ICAgICAgICAgICAgICA9IDQwMTQsICAgIC8qIEphcGFuIChKMTQpICovCisgICAgQ1RSWV9KQVBBTjE1ICAgICAgICAgICAgICA9IDQwMTUsICAgIC8qIEphcGFuIChKMTUpICovCisKKyAgICBDVFJZX0pBUEFOMTYgICAgICAgICAgICAgID0gNDAxNiwgICAgLyogSmFwYW4gKEoxNikgKi8KKyAgICBDVFJZX0pBUEFOMTcgICAgICAgICAgICAgID0gNDAxNywgICAgLyogSmFwYW4gKEoxNykgKi8KKyAgICBDVFJZX0pBUEFOMTggICAgICAgICAgICAgID0gNDAxOCwgICAgLyogSmFwYW4gKEoxOCkgKi8KKworICAgIENUUllfSkFQQU4xOSAgICAgICAgICAgICAgPSA0MDE5LCAgICAvKiBKYXBhbiAoSjE5KSAqLworICAgIENUUllfSkFQQU4yMCAgICAgICAgICAgICAgPSA0MDIwLCAgICAvKiBKYXBhbiAoSjIwKSAqLworICAgIENUUllfSkFQQU4yMSAgICAgICAgICAgICAgPSA0MDIxLCAgICAvKiBKYXBhbiAoSjIxKSAqLworCisgICAgQ1RSWV9KQVBBTjIyICAgICAgICAgICAgICA9IDQwMjIsICAgIC8qIEphcGFuIChKMjIpICovCisgICAgQ1RSWV9KQVBBTjIzICAgICAgICAgICAgICA9IDQwMjMsICAgIC8qIEphcGFuIChKMjMpICovCisgICAgQ1RSWV9KQVBBTjI0ICAgICAgICAgICAgICA9IDQwMjQsICAgIC8qIEphcGFuIChKMjQpICovCisKKyAgICBDVFJZX0pBUEFOMjUgICAgICAgICAgICAgID0gNDAyNSwgICAgLyogSmFwYW4gKEoyNSkgKi8KKyAgICBDVFJZX0pBUEFOMjYgICAgICAgICAgICAgID0gNDAyNiwgICAgLyogSmFwYW4gKEoyNikgKi8KKyAgICBDVFJZX0pBUEFOMjcgICAgICAgICAgICAgID0gNDAyNywgICAgLyogSmFwYW4gKEoyNykgKi8KKworICAgIENUUllfSkFQQU4yOCAgICAgICAgICAgICAgPSA0MDI4LCAgICAvKiBKYXBhbiAoSjI4KSAqLworICAgIENUUllfSkFQQU4yOSAgICAgICAgICAgICAgPSA0MDI5LCAgICAvKiBKYXBhbiAoSjI5KSAqLworICAgIENUUllfSkFQQU4zMCAgICAgICAgICAgICAgPSA0MDMwLCAgICAvKiBKYXBhbiAoSjMwKSAqLworCisgICAgQ1RSWV9KQVBBTjMxICAgICAgICAgICAgICA9IDQwMzEsICAgIC8qIEphcGFuIChKMzEpICovCisgICAgQ1RSWV9KQVBBTjMyICAgICAgICAgICAgICA9IDQwMzIsICAgIC8qIEphcGFuIChKMzIpICovCisgICAgQ1RSWV9KQVBBTjMzICAgICAgICAgICAgICA9IDQwMzMsICAgIC8qIEphcGFuIChKMzMpICovCisKKyAgICBDVFJZX0pBUEFOMzQgICAgICAgICAgICAgID0gNDAzNCwgICAgLyogSmFwYW4gKEozNCkgKi8KKyAgICBDVFJZX0pBUEFOMzUgICAgICAgICAgICAgID0gNDAzNSwgICAgLyogSmFwYW4gKEozNSkgKi8KKyAgICBDVFJZX0pBUEFOMzYgICAgICAgICAgICAgID0gNDAzNiwgICAgLyogSmFwYW4gKEozNikgKi8KKworICAgIENUUllfSkFQQU4zNyAgICAgICAgICAgICAgPSA0MDM3LCAgICAvKiBKYXBhbiAoSjM3KSAqLworICAgIENUUllfSkFQQU4zOCAgICAgICAgICAgICAgPSA0MDM4LCAgICAvKiBKYXBhbiAoSjM4KSAqLworICAgIENUUllfSkFQQU4zOSAgICAgICAgICAgICAgPSA0MDM5LCAgICAvKiBKYXBhbiAoSjM5KSAqLworCisgICAgQ1RSWV9KQVBBTjQwICAgICAgICAgICAgICA9IDQwNDAsICAgIC8qIEphcGFuIChKNDApICovCisgICAgQ1RSWV9KQVBBTjQxICAgICAgICAgICAgICA9IDQwNDEsICAgIC8qIEphcGFuIChKNDEpICovCisgICAgQ1RSWV9KQVBBTjQyICAgICAgICAgICAgICA9IDQwNDIsICAgIC8qIEphcGFuIChKNDIpICovCisgICAgQ1RSWV9KQVBBTjQzICAgICAgICAgICAgICA9IDQwNDMsICAgIC8qIEphcGFuIChKNDMpICovCisgICAgQ1RSWV9KQVBBTjQ0ICAgICAgICAgICAgICA9IDQwNDQsICAgIC8qIEphcGFuIChKNDQpICovCisgICAgQ1RSWV9KQVBBTjQ1ICAgICAgICAgICAgICA9IDQwNDUsICAgIC8qIEphcGFuIChKNDUpICovCisgICAgQ1RSWV9KQVBBTjQ2ICAgICAgICAgICAgICA9IDQwNDYsICAgIC8qIEphcGFuIChKNDYpICovCisgICAgQ1RSWV9KQVBBTjQ3ICAgICAgICAgICAgICA9IDQwNDcsICAgIC8qIEphcGFuIChKNDcpICovCisgICAgQ1RSWV9KQVBBTjQ4ICAgICAgICAgICAgICA9IDQwNDgsICAgIC8qIEphcGFuIChKNDgpICovCisgICAgQ1RSWV9KQVBBTjQ5ICAgICAgICAgICAgICA9IDQwNDksICAgIC8qIEphcGFuIChKNDkpICovCisKKyAgICBDVFJZX0pBUEFONTAgICAgICAgICAgICAgID0gNDA1MCwgICAgLyogSmFwYW4gKEo1MCkgKi8KKyAgICBDVFJZX0pBUEFONTEgICAgICAgICAgICAgID0gNDA1MSwgICAgLyogSmFwYW4gKEo1MSkgKi8KKyAgICBDVFJZX0pBUEFONTIgICAgICAgICAgICAgID0gNDA1MiwgICAgLyogSmFwYW4gKEo1MikgKi8KKyAgICBDVFJZX0pBUEFONTMgICAgICAgICAgICAgID0gNDA1MywgICAgLyogSmFwYW4gKEo1MykgKi8KKyAgICBDVFJZX0pBUEFONTQgICAgICAgICAgICAgID0gNDA1NCwgICAgLyogSmFwYW4gKEo1NCkgKi8KKworICAgIENUUllfSk9SREFOICAgICAgICAgICAgICAgPSA0MDAsICAgICAvKiBKb3JkYW4gKi8KKyAgICBDVFJZX0tBWkFLSFNUQU4gICAgICAgICAgID0gMzk4LCAgICAgLyogS2F6YWtoc3RhbiAqLworICAgIENUUllfS0VOWUEgICAgICAgICAgICAgICAgPSA0MDQsICAgICAvKiBLZW55YSAqLworICAgIENUUllfS09SRUFfTk9SVEggICAgICAgICAgPSA0MDgsICAgICAvKiBOb3J0aCBLb3JlYSAqLworICAgIENUUllfS09SRUFfUk9DICAgICAgICAgICAgPSA0MTAsICAgICAvKiBTb3V0aCBLb3JlYSAqLworICAgIENUUllfS09SRUFfUk9DMiAgICAgICAgICAgPSA0MTEsICAgICAvKiBTb3V0aCBLb3JlYSAqLworICAgIENUUllfS09SRUFfUk9DMyAgICAgICAgICAgPSA0MTIsICAgICAvKiBTb3V0aCBLb3JlYSAqLworICAgIENUUllfS1VXQUlUICAgICAgICAgICAgICAgPSA0MTQsICAgICAvKiBLdXdhaXQgKi8KKyAgICBDVFJZX0xBVFZJQSAgICAgICAgICAgICAgID0gNDI4LCAgICAgLyogTGF0dmlhICovCisgICAgQ1RSWV9MRUJBTk9OICAgICAgICAgICAgICA9IDQyMiwgICAgIC8qIExlYmFub24gKi8KKyAgICBDVFJZX0xJQllBICAgICAgICAgICAgICAgID0gNDM0LCAgICAgLyogTGlieWEgKi8KKyAgICBDVFJZX0xJRUNIVEVOU1RFSU4gICAgICAgID0gNDM4LCAgICAgLyogTGllY2h0ZW5zdGVpbiAqLworICAgIENUUllfTElUSFVBTklBICAgICAgICAgICAgPSA0NDAsICAgICAvKiBMaXRodWFuaWEgKi8KKyAgICBDVFJZX0xVWEVNQk9VUkcgICAgICAgICAgID0gNDQyLCAgICAgLyogTHV4ZW1ib3VyZyAqLworICAgIENUUllfTUFDQVUgICAgICAgICAgICAgICAgPSA0NDYsICAgICAvKiBNYWNhdSAqLworICAgIENUUllfTUFDRURPTklBICAgICAgICAgICAgPSA4MDcsICAgICAvKiB0aGUgRm9ybWVyIFl1Z29zbGF2IFJlcHVibGljIG9mIE1hY2Vkb25pYSAqLworICAgIENUUllfTUFMQVlTSUEgICAgICAgICAgICAgPSA0NTgsICAgICAvKiBNYWxheXNpYSAqLworICAgIENUUllfTUFMVEEJICAgICAgICAgICAgICA9IDQ3MCwgICAgIC8qIE1hbHRhICovCisgICAgQ1RSWV9NRVhJQ08gICAgICAgICAgICAgICA9IDQ4NCwgICAgIC8qIE1leGljbyAqLworICAgIENUUllfTU9OQUNPICAgICAgICAgICAgICAgPSA0OTIsICAgICAvKiBQcmluY2lwYWxpdHkgb2YgTW9uYWNvICovCisgICAgQ1RSWV9NT1JPQ0NPICAgICAgICAgICAgICA9IDUwNCwgICAgIC8qIE1vcm9jY28gKi8KKyAgICBDVFJZX05FVEhFUkxBTkRTICAgICAgICAgID0gNTI4LCAgICAgLyogTmV0aGVybGFuZHMgKi8KKyAgICBDVFJZX05FVEhFUkxBTkRTX0FOVCAgICAgID0gNTMwLCAgICAgLyogTmV0aGVybGFuZHMtQW50ZWxsaXMgKi8KKyAgICBDVFJZX05FV19aRUFMQU5EICAgICAgICAgID0gNTU0LCAgICAgLyogTmV3IFplYWxhbmQgKi8KKyAgICBDVFJZX05JQ0FSQUdVQSAgICAgICAgICAgID0gNTU4LCAgICAgLyogTmljYXJhZ3VhICovCisgICAgQ1RSWV9OT1JXQVkgICAgICAgICAgICAgICA9IDU3OCwgICAgIC8qIE5vcndheSAqLworICAgIENUUllfT01BTiAgICAgICAgICAgICAgICAgPSA1MTIsICAgICAvKiBPbWFuICovCisgICAgQ1RSWV9QQUtJU1RBTiAgICAgICAgICAgICA9IDU4NiwgICAgIC8qIElzbGFtaWMgUmVwdWJsaWMgb2YgUGFraXN0YW4gKi8KKyAgICBDVFJZX1BBTkFNQSAgICAgICAgICAgICAgID0gNTkxLCAgICAgLyogUGFuYW1hICovCisgICAgQ1RSWV9QQVJBR1VBWSAgICAgICAgICAgICA9IDYwMCwgICAgIC8qIFBhcmFndWF5ICovCisgICAgQ1RSWV9QRVJVICAgICAgICAgICAgICAgICA9IDYwNCwgICAgIC8qIFBlcnUgKi8KKyAgICBDVFJZX1BISUxJUFBJTkVTICAgICAgICAgID0gNjA4LCAgICAgLyogUmVwdWJsaWMgb2YgdGhlIFBoaWxpcHBpbmVzICovCisgICAgQ1RSWV9QT0xBTkQgICAgICAgICAgICAgICA9IDYxNiwgICAgIC8qIFBvbGFuZCAqLworICAgIENUUllfUE9SVFVHQUwgICAgICAgICAgICAgPSA2MjAsICAgICAvKiBQb3J0dWdhbCAqLworICAgIENUUllfUFVFUlRPX1JJQ08gICAgICAgICAgPSA2MzAsICAgICAvKiBQdWVydG8gUmljbyAqLworICAgIENUUllfUUFUQVIgICAgICAgICAgICAgICAgPSA2MzQsICAgICAvKiBRYXRhciAqLworICAgIENUUllfUk9NQU5JQSAgICAgICAgICAgICAgPSA2NDIsICAgICAvKiBSb21hbmlhICovCisgICAgQ1RSWV9SVVNTSUEgICAgICAgICAgICAgICA9IDY0MywgICAgIC8qIFJ1c3NpYSAqLworICAgIENUUllfU0FVRElfQVJBQklBICAgICAgICAgPSA2ODIsICAgICAvKiBTYXVkaSBBcmFiaWEgKi8KKyAgICBDVFJZX1NFUkJJQV9NT05UICAgICAgICAgID0gODkxLCAgICAgLyogU2VyYmlhIGFuZCBNb250ZW5lZ3JvICovCisgICAgQ1RSWV9TSU5HQVBPUkUgICAgICAgICAgICA9IDcwMiwgICAgIC8qIFNpbmdhcG9yZSAqLworICAgIENUUllfU0xPVkFLSUEgICAgICAgICAgICAgPSA3MDMsICAgICAvKiBTbG92YWsgUmVwdWJsaWMgKi8KKyAgICBDVFJZX1NMT1ZFTklBICAgICAgICAgICAgID0gNzA1LCAgICAgLyogU2xvdmVuaWEgKi8KKyAgICBDVFJZX1NPVVRIX0FGUklDQSAgICAgICAgID0gNzEwLCAgICAgLyogU291dGggQWZyaWNhICovCisgICAgQ1RSWV9TUEFJTiAgICAgICAgICAgICAgICA9IDcyNCwgICAgIC8qIFNwYWluICovCisgICAgQ1RSWV9TUklMQU5LQSAgICAgICAgICAgICA9IDE0NCwgICAgIC8qIFNyaWxhbmthICovCisgICAgQ1RSWV9TV0VERU4gICAgICAgICAgICAgICA9IDc1MiwgICAgIC8qIFN3ZWRlbiAqLworICAgIENUUllfU1dJVFpFUkxBTkQgICAgICAgICAgPSA3NTYsICAgICAvKiBTd2l0emVybGFuZCAqLworICAgIENUUllfU1lSSUEgICAgICAgICAgICAgICAgPSA3NjAsICAgICAvKiBTeXJpYSAqLworICAgIENUUllfVEFJV0FOICAgICAgICAgICAgICAgPSAxNTgsICAgICAvKiBUYWl3YW4gKi8KKyAgICBDVFJZX1RIQUlMQU5EICAgICAgICAgICAgID0gNzY0LCAgICAgLyogVGhhaWxhbmQgKi8KKyAgICBDVFJZX1RSSU5JREFEX1lfVE9CQUdPICAgID0gNzgwLCAgICAgLyogVHJpbmlkYWQgeSBUb2JhZ28gKi8KKyAgICBDVFJZX1RVTklTSUEgICAgICAgICAgICAgID0gNzg4LCAgICAgLyogVHVuaXNpYSAqLworICAgIENUUllfVFVSS0VZICAgICAgICAgICAgICAgPSA3OTIsICAgICAvKiBUdXJrZXkgKi8KKyAgICBDVFJZX1VBRSAgICAgICAgICAgICAgICAgID0gNzg0LCAgICAgLyogVS5BLkUuICovCisgICAgQ1RSWV9VS1JBSU5FICAgICAgICAgICAgICA9IDgwNCwgICAgIC8qIFVrcmFpbmUgKi8KKyAgICBDVFJZX1VOSVRFRF9LSU5HRE9NICAgICAgID0gODI2LCAgICAgLyogVW5pdGVkIEtpbmdkb20gKi8KKyAgICBDVFJZX1VOSVRFRF9TVEFURVMgICAgICAgID0gODQwLCAgICAgLyogVW5pdGVkIFN0YXRlcyAqLworICAgIENUUllfVU5JVEVEX1NUQVRFU19GQ0M0OSAgPSA4NDIsICAgICAvKiBVbml0ZWQgU3RhdGVzIChQdWJsaWMgU2FmZXR5KSovCisgICAgQ1RSWV9VUlVHVUFZICAgICAgICAgICAgICA9IDg1OCwgICAgIC8qIFVydWd1YXkgKi8KKyAgICBDVFJZX1VaQkVLSVNUQU4gICAgICAgICAgID0gODYwLCAgICAgLyogVXpiZWtpc3RhbiAqLworICAgIENUUllfVkVORVpVRUxBICAgICAgICAgICAgPSA4NjIsICAgICAvKiBWZW5lenVlbGEgKi8KKyAgICBDVFJZX1ZJRVRfTkFNICAgICAgICAgICAgID0gNzA0LCAgICAgLyogVmlldCBOYW0gKi8KKyAgICBDVFJZX1lFTUVOICAgICAgICAgICAgICAgID0gODg3LCAgICAgLyogWWVtZW4gKi8KKyAgICBDVFJZX1pJTUJBQldFICAgICAgICAgICAgID0gNzE2ICAgICAgLyogWmltYmFid2UgKi8KK307CisKKy8qIEVudW1lcmF0ZWQgUmVndWxhdG9yeSBEb21haW4gSW5mb3JtYXRpb24gOCBiaXQgdmFsdWVzIGluZGljYXRlIHRoYXQKKyAqIHRoZSByZWdkb21haW4gaXMgcmVhbGx5IGEgcGFpciBvZiB1bml0YXJ5IHJlZ2RvbWFpbnMuICAxMiBiaXQgdmFsdWVzCisgKiBhcmUgdGhlIHJlYWwgdW5pdGFyeSByZWdkb21haW5zIGFuZCBhcmUgdGhlIG9ubHkgb25lcyB3aGljaCBoYXZlIHRoZQorICogZnJlcXVlbmN5IGJpdG1hc2tzIGFuZCBmbGFncyBzZXQuCisgKi8KK2VudW0gRW51bVJkIHsKKwkvKgorCSAqIFRoZSBmb2xsb3dpbmcgcmVndWxhdG9yeSBkb21haW4gZGVmaW5pdGlvbnMgYXJlCisJICogZm91bmQgaW4gdGhlIEVFUFJPTS4gRWFjaCByZWd1bGF0b3J5IGRvbWFpbgorCSAqIGNhbiBvcGVyYXRlIGluIGVpdGhlciBhIDVHSHogb3IgMi40R0h6IHdpcmVsZXNzIG1vZGUgb3IKKwkgKiBib3RoIDVHSHogYW5kIDIuNEdIeiB3aXJlbGVzcyBtb2Rlcy4KKwkgKiBJbiBnZW5lcmFsLCB0aGUgdmFsdWUgaG9sZHMgbm8gc3BlY2lhbAorCSAqIG1lYW5pbmcgYW5kIGlzIHVzZWQgdG8gZGVjb2RlIGludG8gZWl0aGVyIHNwZWNpZmljCisJICogMi40R0h6IG9yIDVHSHogd2lyZWxlc3MgbW9kZSBmb3IgdGhhdCBwYXJ0aWN1bGFyCisJICogcmVndWxhdG9yeSBkb21haW4uCisJICovCisJTk9fRU5VTVJECT0gMHgwMCwKKwlOVUxMMV9XT1JMRAk9IDB4MDMsCQkvKiBGb3IgMTFiLW9ubHkgY291bnRyaWVzIChubyAxMWEgYWxsb3dlZCkgKi8KKwlOVUxMMV9FVFNJQgk9IDB4MDcsCQkvKiBJc3JhZWwgKi8KKwlOVUxMMV9FVFNJQwk9IDB4MDgsCisJRkNDMV9GQ0NBCT0gMHgxMCwJCS8qIFVTQSAqLworCUZDQzFfV09STEQJPSAweDExLAkJLyogSG9uZyBLb25nICovCisJRkNDNF9GQ0NBCT0gMHgxMiwJCS8qIFVTQSAtIFB1YmxpYyBTYWZldHkgKi8KKwlGQ0M1X0ZDQ0EJPSAweDEzLAkJLyogVVNBIC0gd2l0aCBubyBERlMgKFVOSUktMSArIFVOSUktMyBvbmx5KSAqLworICBGQ0M2X0ZDQ0EgICAgICAgPSAweDE0LCAgICAgICAgIC8qIENhbmFkYSAqLworCisJRkNDMl9GQ0NBCT0gMHgyMCwJCS8qIENhbmFkYSAqLworCUZDQzJfV09STEQJPSAweDIxLAkJLyogQXVzdHJhbGlhICYgSEsgKi8KKwlGQ0MyX0VUU0lDCT0gMHgyMiwKKyAgRkNDNl9XT1JMRCAgICAgID0gMHgyMywgICAgICAgICAvKiBBdXN0cmFsaWEgKi8KKworCUZSQU5DRV9SRVMJPSAweDMxLAkJLyogTGVnYWN5IEZyYW5jZSBmb3IgT0VNICovCisJRkNDM19GQ0NBCT0gMHgzQSwJCS8qIFVTQSAmIENhbmFkYSB3LzU0NzAgYmFuZCwgMTFoLCBERlMgZW5hYmxlZCAqLworCUZDQzNfV09STEQJPSAweDNCLAkJLyogVVNBICYgQ2FuYWRhIHcvNTQ3MCBiYW5kLCAxMWgsIERGUyBlbmFibGVkICovCisKKwlFVFNJMV9XT1JMRAk9IDB4MzcsCisJRVRTSTNfRVRTSUEJPSAweDMyLAkJLyogRnJhbmNlIChvcHRpb25hbCkgKi8KKwlFVFNJMl9XT1JMRAk9IDB4MzUsCQkvKiBIdW5nYXJ5ICYgb3RoZXJzICovCisJRVRTSTNfV09STEQJPSAweDM2LAkJLyogRnJhbmNlICYgb3RoZXJzICovCisJRVRTSTRfV09STEQJPSAweDMwLAorCUVUU0k0X0VUU0lDCT0gMHgzOCwKKwlFVFNJNV9XT1JMRAk9IDB4MzksCisJRVRTSTZfV09STEQJPSAweDM0LAkJLyogQnVsZ2FyaWEgKi8KKwlFVFNJX1JFU0VSVkVECT0gMHgzMywJCS8qIFJlc2VydmVkIChEbyBub3QgdXNlZCkgKi8KKworCU1LSzFfTUtLQQk9IDB4NDAsCQkvKiBKYXBhbiAoSlAxKSAqLworCU1LSzFfTUtLQgk9IDB4NDEsCQkvKiBKYXBhbiAoSlAwKSAqLworCUFQTDRfV09STEQJPSAweDQyLAkJLyogU2luZ2Fwb3JlICovCisJTUtLMl9NS0tBCT0gMHg0MywJCS8qIEphcGFuIHdpdGggNC45RyBjaGFubmVscyAqLworCUFQTF9SRVNFUlZFRAk9IDB4NDQsCQkvKiBSZXNlcnZlZCAoRG8gbm90IHVzZWQpICAqLworCUFQTDJfV09STEQJPSAweDQ1LAkJLyogS29yZWEgKi8KKwlBUEwyX0FQTEMJPSAweDQ2LAorCUFQTDNfV09STEQJPSAweDQ3LAorCU1LSzFfRkNDQQk9IDB4NDgsCQkvKiBKYXBhbiAoSlAxLTEpICovCisJQVBMMl9BUExECT0gMHg0OSwJCS8qIEtvcmVhIHdpdGggMi4zRyBjaGFubmVscyAqLworCU1LSzFfTUtLQTEJPSAweDRBLAkJLyogSmFwYW4gKEpFMSkgKi8KKwlNS0sxX01LS0EyCT0gMHg0QiwJCS8qIEphcGFuIChKRTIpICovCisJTUtLMV9NS0tDCT0gMHg0QywJCS8qIEphcGFuIChNS0sxX01LS0EsZXhjZXB0IENoMTQpICovCisKKwlBUEwzX0ZDQ0EgICA9IDB4NTAsCisJQVBMMV9XT1JMRAk9IDB4NTIsCQkvKiBMYXRpbiBBbWVyaWNhICovCisJQVBMMV9GQ0NBCT0gMHg1MywKKwlBUEwxX0FQTEEJPSAweDU0LAorCUFQTDFfRVRTSUMJPSAweDU1LAorCUFQTDJfRVRTSUMJPSAweDU2LAkJLyogVmVuZXp1ZWxhICovCisJQVBMMl9GQ0NBICAgPSAweDU3LCAJLyogbmV3IExhdGluIEFtZXJpY2EgKi8KKwlBUEw1X1dPUkxECT0gMHg1OCwJCS8qIENoaWxlICovCisJQVBMNl9XT1JMRAk9IDB4NUIsCQkvKiBTaW5nYXBvcmUgKi8KKwlBUEw3X0ZDQ0EgICA9IDB4NUMsICAgICAvKiBUYWl3YW4gNS40NyBCYW5kICovCisJQVBMOF9XT1JMRCAgPSAweDVELCAgICAgLyogTWFsYXlzaWEgNUdIeiAqLworCUFQTDlfV09STEQgID0gMHg1RSwgICAgIC8qIEtvcmVhIDVHSHogKi8KKworCS8qCisJICogV29ybGQgbW9kZSBTS1VzCisJICovCisJV09SMF9XT1JMRAk9IDB4NjAsCQkvKiBXb3JsZDAgKFdPMCBTS1UpICovCisJV09SMV9XT1JMRAk9IDB4NjEsCQkvKiBXb3JsZDEgKFdPMSBTS1UpICovCisJV09SMl9XT1JMRAk9IDB4NjIsCQkvKiBXb3JsZDIgKFdPMiBTS1UpICovCisJV09SM19XT1JMRAk9IDB4NjMsCQkvKiBXb3JsZDMgKFdPMyBTS1UpICovCisJV09SNF9XT1JMRAk9IDB4NjQsCQkvKiBXb3JsZDQgKFdPNCBTS1UpICovCisJV09SNV9FVFNJQwk9IDB4NjUsCQkvKiBXb3JsZDUgKFdPNSBTS1UpICovCisKKwlXT1IwMV9XT1JMRAk9IDB4NjYsCQkvKiBXb3JsZDAtMSAoV1cwLTEgU0tVKSAqLworCVdPUjAyX1dPUkxECT0gMHg2NywJCS8qIFdvcmxkMC0yIChXVzAtMiBTS1UpICovCisJRVUxX1dPUkxECT0gMHg2OCwJCS8qIFNhbWUgYXMgV29ybGQwLTIgKFdXMC0yIFNLVSksIGV4Y2VwdCBhY3RpdmUgc2NhbiBjaDEtMTMuIE5vIGNoMTQgKi8KKworCVdPUjlfV09STEQJPSAweDY5LAkJLyogV29ybGQ5IChXTzkgU0tVKSAqLworCVdPUkFfV09STEQJPSAweDZBLAkJLyogV29ybGRBIChXT0EgU0tVKSAqLworCisJTUtLM19NS0tCCT0gMHg4MCwJCS8qIEphcGFuIFVOSS0xIGV2ZW4gKyBNS0tCICovCisJTUtLM19NS0tBMgk9IDB4ODEsCQkvKiBKYXBhbiBVTkktMSBldmVuICsgTUtLQTIgKi8KKwlNS0szX01LS0MJPSAweDgyLAkJLyogSmFwYW4gVU5JLTEgZXZlbiArIE1LS0MgKi8KKworCU1LSzRfTUtLQgk9IDB4ODMsCQkvKiBKYXBhbiBVTkktMSBldmVuICsgVU5JLTIgKyBNS0tCICovCisJTUtLNF9NS0tBMgk9IDB4ODQsCQkvKiBKYXBhbiBVTkktMSBldmVuICsgVU5JLTIgKyBNS0tBMiAqLworCU1LSzRfTUtLQwk9IDB4ODUsCQkvKiBKYXBhbiBVTkktMSBldmVuICsgVU5JLTIgKyBNS0tDICovCisKKwlNS0s1X01LS0IJPSAweDg2LAkJLyogSmFwYW4gVU5JLTEgZXZlbiArIFVOSS0yICsgbWlkLWJhbmQgKyBNS0tCICovCisJTUtLNV9NS0tBMgk9IDB4ODcsCQkvKiBKYXBhbiBVTkktMSBldmVuICsgVU5JLTIgKyBtaWQtYmFuZCArIE1LS0EyICovCisJTUtLNV9NS0tDCT0gMHg4OCwJCS8qIEphcGFuIFVOSS0xIGV2ZW4gKyBVTkktMiArIG1pZC1iYW5kICsgTUtLQyAqLworCisJTUtLNl9NS0tCCT0gMHg4OSwJCS8qIEphcGFuIFVOSS0xIGV2ZW4gKyBVTkktMSBvZGQgTUtLQiAqLworCU1LSzZfTUtLQTIJPSAweDhBLAkJLyogSmFwYW4gVU5JLTEgZXZlbiArIFVOSS0xIG9kZCArIE1LS0EyICovCisJTUtLNl9NS0tDCT0gMHg4QiwJCS8qIEphcGFuIFVOSS0xIGV2ZW4gKyBVTkktMSBvZGQgKyBNS0tDICovCisKKwlNS0s3X01LS0IJPSAweDhDLAkJLyogSmFwYW4gVU5JLTEgZXZlbiArIFVOSS0xIG9kZCArIFVOSS0yICsgTUtLQiAqLworCU1LSzdfTUtLQQk9IDB4OEQsCQkvKiBKYXBhbiBVTkktMSBldmVuICsgVU5JLTEgb2RkICsgVU5JLTIgKyBNS0tBMiAqLworCU1LSzdfTUtLQwk9IDB4OEUsCQkvKiBKYXBhbiBVTkktMSBldmVuICsgVU5JLTEgb2RkICsgVU5JLTIgKyBNS0tDICovCisKKwlNS0s4X01LS0IJPSAweDhGLAkJLyogSmFwYW4gVU5JLTEgZXZlbiArIFVOSS0xIG9kZCArIFVOSS0yICsgbWlkLWJhbmQgKyBNS0tCICovCisJTUtLOF9NS0tBMgk9IDB4OTAsCQkvKiBKYXBhbiBVTkktMSBldmVuICsgVU5JLTEgb2RkICsgVU5JLTIgKyBtaWQtYmFuZCArIE1LS0EyICovCisJTUtLOF9NS0tDCT0gMHg5MSwJCS8qIEphcGFuIFVOSS0xIGV2ZW4gKyBVTkktMSBvZGQgKyBVTkktMiArIG1pZC1iYW5kICsgTUtLQyAqLworCisJTUtLNl9NS0tBMSAgICAgID0gMHhGOCwgICAgICAgICAvKiBKYXBhbiBVTkktMSBldmVuICsgVU5JLTEgb2RkICsgTUtLQTEgKi8KKwlNS0s2X0ZDQ0EgICAgICAgPSAweEY5LCAgICAgICAgIC8qIEphcGFuIFVOSS0xIGV2ZW4gKyBVTkktMSBvZGQgKyBGQ0NBICovCisJTUtLN19NS0tBMSAgICAgID0gMHhGQSwgICAgICAgICAvKiBKYXBhbiBVTkktMSBldmVuICsgVU5JLTEgb2RkICsgVU5JLTIgKyBNS0tBMSAqLworCU1LSzdfRkNDQSAgICAgICA9IDB4RkIsICAgICAgICAgLyogSmFwYW4gVU5JLTEgZXZlbiArIFVOSS0xIG9kZCArIFVOSS0yICsgRkNDQSAqLworCU1LSzlfRkNDQSAgICAgICA9IDB4RkMsICAgICAgICAgLyogSmFwYW4gVU5JLTEgZXZlbiArIDQuOUdIeiArIEZDQ0EgKi8KKwlNS0s5X01LS0ExICAgICAgPSAweEZELCAgICAgICAgIC8qIEphcGFuIFVOSS0xIGV2ZW4gKyA0LjlHSHogKyBNS0tBMSAqLworCU1LSzlfTUtLQyAgICAgICA9IDB4RkUsICAgICAgICAgLyogSmFwYW4gVU5JLTEgZXZlbiArIDQuOUdIeiArIE1LS0MgKi8KKwlNS0s5X01LS0EyICAgICAgPSAweEZGLCAgICAgICAgIC8qIEphcGFuIFVOSS0xIGV2ZW4gKyA0LjlHSHogKyBNS0tBMiAqLworCisJTUtLMTBfRkNDQSAgICAgID0gMHhEMCwgICAgICAgICAvKiBKYXBhbiBVTkktMSBldmVuICsgVU5JLTIgKyA0LjlHSHogKyBGQ0NBICovCisJTUtLMTBfTUtLQTEgICAgID0gMHhEMSwgICAgICAgICAvKiBKYXBhbiBVTkktMSBldmVuICsgVU5JLTIgKyA0LjlHSHogKyBNS0tBMSAqLworCU1LSzEwX01LS0MgICAgICA9IDB4RDIsICAgICAgICAgLyogSmFwYW4gVU5JLTEgZXZlbiArIFVOSS0yICsgNC45R0h6ICsgTUtLQyAqLworCU1LSzEwX01LS0EyICAgICA9IDB4RDMsICAgICAgICAgLyogSmFwYW4gVU5JLTEgZXZlbiArIFVOSS0yICsgNC45R0h6ICsgTUtLQTIgKi8KKworCU1LSzExX01LS0EgICAgICA9IDB4RDQsICAgICAgICAgLyogSmFwYW4gVU5JLTEgZXZlbiArIFVOSS0yICsgTWlkYmFuZCArIDQuOUdIeiArIE1LS0EgKi8KKwlNS0sxMV9GQ0NBICAgICAgPSAweEQ1LCAgICAgICAgIC8qIEphcGFuIFVOSS0xIGV2ZW4gKyBVTkktMiArIE1pZGJhbmQgKyA0LjlHSHogKyBGQ0NBICovCisJTUtLMTFfTUtLQTEgICAgID0gMHhENiwgICAgICAgICAvKiBKYXBhbiBVTkktMSBldmVuICsgVU5JLTIgKyBNaWRiYW5kICsgNC45R0h6ICsgTUtLQTEgKi8KKwlNS0sxMV9NS0tDICAgICAgPSAweEQ3LCAgICAgICAgIC8qIEphcGFuIFVOSS0xIGV2ZW4gKyBVTkktMiArIE1pZGJhbmQgKyA0LjlHSHogKyBNS0tDICovCisJTUtLMTFfTUtLQTIgICAgID0gMHhEOCwgICAgICAgICAvKiBKYXBhbiBVTkktMSBldmVuICsgVU5JLTIgKyBNaWRiYW5kICsgNC45R0h6ICsgTUtLQTIgKi8KKworCU1LSzEyX01LS0EgICAgICA9IDB4RDksICAgICAgICAgLyogSmFwYW4gVU5JLTEgZXZlbiArIFVOSS0xIG9kZCArIFVOSS0yICsgTWlkYmFuZCArIDQuOUdIeiArIE1LS0EgKi8KKwlNS0sxMl9GQ0NBICAgICAgPSAweERBLCAgICAgICAgIC8qIEphcGFuIFVOSS0xIGV2ZW4gKyBVTkktMSBvZGQgKyBVTkktMiArIE1pZGJhbmQgKyA0LjlHSHogKyBGQ0NBICovCisJTUtLMTJfTUtLQTEgICAgID0gMHhEQiwgICAgICAgICAvKiBKYXBhbiBVTkktMSBldmVuICsgVU5JLTEgb2RkICsgVU5JLTIgKyBNaWRiYW5kICsgNC45R0h6ICsgTUtLQTEgKi8KKwlNS0sxMl9NS0tDICAgICAgPSAweERDLCAgICAgICAgIC8qIEphcGFuIFVOSS0xIGV2ZW4gKyBVTkktMSBvZGQgKyBVTkktMiArIE1pZGJhbmQgKyA0LjlHSHogKyBNS0tDICovCisJTUtLMTJfTUtLQTIgICAgID0gMHhERCwgICAgICAgICAvKiBKYXBhbiBVTkktMSBldmVuICsgVU5JLTEgb2RkICsgVU5JLTIgKyBNaWRiYW5kICsgNC45R0h6ICsgTUtLQTIgKi8KKworCS8qIEZvbGxvd2luZyBkZWZpbml0aW9ucyBhcmUgdXNlZCBvbmx5IGJ5IHMvdyB0byBtYXAgb2xkCisgCSAqIEphcGFuIFNLVXMuCisJICovCisJTUtLM19NS0tBICAgICAgID0gMHhGMCwgICAgICAgICAvKiBKYXBhbiBVTkktMSBldmVuICsgTUtLQSAqLworCU1LSzNfTUtLQTEgICAgICA9IDB4RjEsICAgICAgICAgLyogSmFwYW4gVU5JLTEgZXZlbiArIE1LS0ExICovCisJTUtLM19GQ0NBICAgICAgID0gMHhGMiwgICAgICAgICAvKiBKYXBhbiBVTkktMSBldmVuICsgRkNDQSAqLworCU1LSzRfTUtLQSAgICAgICA9IDB4RjMsICAgICAgICAgLyogSmFwYW4gVU5JLTEgZXZlbiArIFVOSS0yICsgTUtLQSAqLworCU1LSzRfTUtLQTEgICAgICA9IDB4RjQsICAgICAgICAgLyogSmFwYW4gVU5JLTEgZXZlbiArIFVOSS0yICsgTUtLQTEgKi8KKwlNS0s0X0ZDQ0EgICAgICAgPSAweEY1LCAgICAgICAgIC8qIEphcGFuIFVOSS0xIGV2ZW4gKyBVTkktMiArIEZDQ0EgKi8KKwlNS0s5X01LS0EgICAgICAgPSAweEY2LCAgICAgICAgIC8qIEphcGFuIFVOSS0xIGV2ZW4gKyA0LjlHSHogKyBNS0tBKi8KKwlNS0sxMF9NS0tBICAgICAgPSAweEY3LCAgICAgICAgIC8qIEphcGFuIFVOSS0xIGV2ZW4gKyBVTkktMiArIDQuOUdIeiArIE1LS0EgKi8KKworCS8qCisJICogUmVndWxhdG9yIGRvbWFpbnMgZW5kaW5nIGluIGEgbnVtYmVyIChlLmcuIEFQTDEsCisJICogTUsxLCBFVFNJNCwgZXRjKSBhcHBseSB0byA1R0h6IGNoYW5uZWwgYW5kIHBvd2VyCisJICogaW5mb3JtYXRpb24uICBSZWd1bGF0b3IgZG9tYWlucyBlbmRpbmcgaW4gYSBsZXR0ZXIKKwkgKiAoZS5nLiBBUExBLCBGQ0NBLCBldGMpIGFwcGx5IHRvIDIuNEdIeiBjaGFubmVsIGFuZAorCSAqIHBvd2VyIGluZm9ybWF0aW9uLgorCSAqLworCUFQTDEJCT0gMHgwMTUwLAkvKiBMQVQgJiBBc2lhICovCisJQVBMMgkJPSAweDAyNTAsCS8qIExBVCAmIEFzaWEgKi8KKwlBUEwzCQk9IDB4MDM1MCwJLyogVGFpd2FuICovCisJQVBMNAkJPSAweDA0NTAsCS8qIEpvcmRhbiAqLworCUFQTDUJCT0gMHgwNTUwLAkvKiBDaGlsZSAqLworCUFQTDYJCT0gMHgwNjUwLAkvKiBTaW5nYXBvcmUgKi8KKwlBUEw3CQk9IDB4MDc1MCwJLyogVGFpd2FuIE1pZGRsZSAqLworCUFQTDgJCT0gMHgwODUwLAkvKiBNYWxheXNpYSAqLworCUFQTDkJCT0gMHgwOTUwLAkvKiBLb3JlYSAoU291dGgpIFJPQyAzICovCisKKwlFVFNJMQkJPSAweDAxMzAsCS8qIEV1cm9wZSAmIG90aGVycyAqLworCUVUU0kyCQk9IDB4MDIzMCwJLyogRXVyb3BlICYgb3RoZXJzICovCisJRVRTSTMJCT0gMHgwMzMwLAkvKiBFdXJvcGUgJiBvdGhlcnMgKi8KKwlFVFNJNAkJPSAweDA0MzAsCS8qIEV1cm9wZSAmIG90aGVycyAqLworCUVUU0k1CQk9IDB4MDUzMCwJLyogRXVyb3BlICYgb3RoZXJzICovCisJRVRTSTYJCT0gMHgwNjMwLAkvKiBFdXJvcGUgJiBvdGhlcnMgKi8KKwlFVFNJQQkJPSAweDBBMzAsCS8qIEZyYW5jZSAqLworCUVUU0lCCQk9IDB4MEIzMCwJLyogSXNyYWVsICovCisJRVRTSUMJCT0gMHgwQzMwLAkvKiBMYXRpbiBBbWVyaWNhICovCisKKwlGQ0MxCQk9IDB4MDExMCwJLyogVVMgJiBvdGhlcnMgKi8KKwlGQ0MyCQk9IDB4MDEyMCwJLyogQ2FuYWRhLCBBdXN0cmFsaWEgJiBOZXcgWmVhbGFuZCAqLworCUZDQzMJCT0gMHgwMTYwLAkvKiBVUyB3L25ldyBtaWRkbGUgYmFuZCAmIERGUyAqLworCUZDQzQJCT0gMHgwMTY1LAkvKiBVUyBQdWJsaWMgU2FmZXR5ICovCisJRkNDNQkJPSAweDA1MTAsCS8qIFVTIG5vIERGUyAqLworICAgIEZDQzYgICAgPSAweDA2MTAsIC8qIENhbmFkYSAmIEF1c3RyYWxpYSAqLworCisJRkNDQQkJPSAweDBBMTAsCisKKwlBUExECQk9IDB4MEQ1MCwJLyogU291dGggS29yZWEgKi8KKworCU1LSzEJCT0gMHgwMTQwLAkvKiBKYXBhbiAoVU5JLTEgb2RkKSovCisJTUtLMgkJPSAweDAyNDAsCS8qIEphcGFuICg0LjkgR0h6ICsgVU5JLTEgb2RkKSAqLworCU1LSzMJCT0gMHgwMzQwLAkvKiBKYXBhbiAoVU5JLTEgZXZlbikgKi8KKwlNS0s0CQk9IDB4MDQ0MCwJLyogSmFwYW4gKFVOSS0xIGV2ZW4gKyBVTkktMikgKi8KKwlNS0s1CQk9IDB4MDU0MCwJLyogSmFwYW4gKFVOSS0xIGV2ZW4gKyBVTkktMiArIG1pZC1iYW5kKSAqLworCU1LSzYJCT0gMHgwNjQwLAkvKiBKYXBhbiAoVU5JLTEgb2RkICsgVU5JLTEgZXZlbikgKi8KKwlNS0s3CQk9IDB4MDc0MCwJLyogSmFwYW4gKFVOSS0xIG9kZCArIFVOSS0xIGV2ZW4gKyBVTkktMiAqLworCU1LSzgJCT0gMHgwODQwLAkvKiBKYXBhbiAoVU5JLTEgb2RkICsgVU5JLTEgZXZlbiArIFVOSS0yICsgbWlkLWJhbmQpICovCisJTUtLOQkJPSAweDA5NDAsICAgLyogSmFwYW4gKFVOSS0xIGV2ZW4gKyA0LjkgR0haKSAqLworCU1LSzEwCQk9IDB4MEI0MCwgICAvKiBKYXBhbiAoVU5JLTEgZXZlbiArIFVOSS0yICsgNC45IEdIWikgKi8KKwlNS0sxMQkJPSAweDExNDAsICAgLyogSmFwYW4gKFVOSS0xIGV2ZW4gKyBVTkktMiArIG1pZC1iYW5kICsgNC45IEdIWikgKi8KKwlNS0sxMgkJPSAweDEyNDAsICAgLyogSmFwYW4gKFVOSS0xIGV2ZW4gKyBVTkktMSBvZGQgKyBVTkktMiArIG1pZC1iYW5kICsgNC45IEdIWikgKi8KKwlNS0tBCQk9IDB4MEE0MCwJLyogSmFwYW4gKi8KKwlNS0tDCQk9IDB4MEE1MCwKKworCU5VTEwxCQk9IDB4MDE5OCwKKwlXT1JMRAkJPSAweDAxOTksCisJREVCVUdfUkVHX0RNTgk9IDB4MDFmZiwKK307CisKKy8qIGNoYW5uZWxGbGFncyAqLworI2RlZmluZQlaTV9SRUdfRkxBR19DSEFOTkVMX0NXX0lOVAkweDAwMDIJLyogQ1cgaW50ZXJmZXJlbmNlIGRldGVjdGVkIG9uIGNoYW5uZWwgKi8KKyNkZWZpbmUJWk1fUkVHX0ZMQUdfQ0hBTk5FTF9UVVJCTwkweDAwMTAJLyogVHVyYm8gQ2hhbm5lbCAqLworI2RlZmluZQlaTV9SRUdfRkxBR19DSEFOTkVMX0NDSwkgICAgMHgwMDIwCS8qIENDSyBjaGFubmVsICovCisjZGVmaW5lCVpNX1JFR19GTEFHX0NIQU5ORUxfT0ZETQkweDAwNDAJLyogT0ZETSBjaGFubmVsICovCisjZGVmaW5lCVpNX1JFR19GTEFHX0NIQU5ORUxfMkdIWgkweDAwODAJLyogMiBHSHogc3BlY3RydW0gY2hhbm5lbC4gKi8KKyNkZWZpbmUJWk1fUkVHX0ZMQUdfQ0hBTk5FTF81R0haCTB4MDEwMAkvKiA1IEdIeiBzcGVjdHJ1bSBjaGFubmVsICovCisjZGVmaW5lCVpNX1JFR19GTEFHX0NIQU5ORUxfUEFTU0lWRQkweDAyMDAJLyogT25seSBwYXNzaXZlIHNjYW4gYWxsb3dlZCBpbiB0aGUgY2hhbm5lbCAqLworI2RlZmluZQlaTV9SRUdfRkxBR19DSEFOTkVMX0RZTgkgICAgMHgwNDAwCS8qIGR5bmFtaWMgQ0NLLU9GRE0gY2hhbm5lbCAqLworI2RlZmluZQlaTV9SRUdfRkxBR19DSEFOTkVMX1hSCSAgICAweDA4MDAJLyogWFIgY2hhbm5lbCAqLworI2RlZmluZQlaTV9SRUdfRkxBR19DSEFOTkVMX0NTQSAJMHgxMDAwCS8qIENoYW5uZWwgYnkgQ1NBKENoYW5uZWwgU3dpdGNoIEFubm91bmNlbWVudCkgKi8KKyNkZWZpbmUJWk1fUkVHX0ZMQUdfQ0hBTk5FTF9TVFVSQk8JMHgyMDAwCS8qIFN0YXRpYyB0dXJibywgbm8gMTFhLW9ubHkgdXNhZ2UgKi8KKyNkZWZpbmUgWk1fUkVHX0ZMQUdfQ0hBTk5FTF9IQUxGICAgIDB4NDAwMCAJLyogSGFsZiByYXRlIGNoYW5uZWwgKi8KKyNkZWZpbmUgWk1fUkVHX0ZMQUdfQ0hBTk5FTF9RVUFSVEVSIDB4ODAwMCAJLyogUXVhcnRlciByYXRlIGNoYW5uZWwgKi8KKworLyogY2hhbm5lbEZsYWdzICovCisjZGVmaW5lIENIQU5ORUxfQ1dfSU5UICAweDAwMDIgIC8qIENXIGludGVyZmVyZW5jZSBkZXRlY3RlZCBvbiBjaGFubmVsICovCisjZGVmaW5lIENIQU5ORUxfVFVSQk8gICAweDAwMTAgIC8qIFR1cmJvIENoYW5uZWwgKi8KKyNkZWZpbmUgQ0hBTk5FTF9DQ0sgMHgwMDIwICAvKiBDQ0sgY2hhbm5lbCAqLworI2RlZmluZSBDSEFOTkVMX09GRE0gICAgMHgwMDQwICAvKiBPRkRNIGNoYW5uZWwgKi8KKyNkZWZpbmUgQ0hBTk5FTF8yR0haICAgIDB4MDA4MCAgLyogMiBHSHogc3BlY3RydW0gY2hhbm5lbC4gKi8KKyNkZWZpbmUgQ0hBTk5FTF81R0haICAgIDB4MDEwMCAgLyogNSBHSHogc3BlY3RydW0gY2hhbm5lbCAqLworI2RlZmluZSBDSEFOTkVMX1BBU1NJVkUgMHgwMjAwICAvKiBPbmx5IHBhc3NpdmUgc2NhbiBhbGxvd2VkIGluIHRoZSBjaGFubmVsICovCisjZGVmaW5lIENIQU5ORUxfRFlOIDB4MDQwMCAgLyogZHluYW1pYyBDQ0stT0ZETSBjaGFubmVsICovCisjZGVmaW5lIENIQU5ORUxfWFIgIDB4MDgwMCAgLyogWFIgY2hhbm5lbCAqLworI2RlZmluZSBDSEFOTkVMX1NUVVJCTyAgMHgyMDAwICAvKiBTdGF0aWMgdHVyYm8sIG5vIDExYS1vbmx5IHVzYWdlICovCisjZGVmaW5lIENIQU5ORUxfSEFMRiAgICAweDQwMDAgIC8qIEhhbGYgcmF0ZSBjaGFubmVsICovCisjZGVmaW5lIENIQU5ORUxfUVVBUlRFUiAweDgwMDAgIC8qIFF1YXJ0ZXIgcmF0ZSBjaGFubmVsICovCisjZGVmaW5lIENIQU5ORUxfSFQyMCAgICAweDEwMDAwIC8qIEhUMjAgY2hhbm5lbCAqLworI2RlZmluZSBDSEFOTkVMX0hUNDAgICAgMHgyMDAwMCAvKiBIVDQwIGNoYW5uZWwgKi8KKyNkZWZpbmUgQ0hBTk5FTF9IVDQwVSAJMHg0MDAwMCAvKiBjb250cm9sIGNoYW5uZWwgY2FuIGJlIHVwcGVyIGNoYW5uZWwgKi8KKyNkZWZpbmUgQ0hBTk5FTF9IVDQwTCAJMHg4MDAwMCAvKiBjb250cm9sIGNoYW5uZWwgY2FuIGJlIGxvd2VyIGNoYW5uZWwgKi8KKworLyogcHJpdkZsYWdzICovCisjZGVmaW5lIFpNX1JFR19GTEFHX0NIQU5ORUxfSU5URVJGRVJFTkNFICAgCTB4MDEgLyogU29mdHdhcmUgdXNlOiBjaGFubmVsIGludGVyZmVyZW5jZQorCQkJCSAgICAgICAgdXNlZCBmb3IgYXMgQVIgYXMgd2VsbCBhcyBSQURBUgorCQkJCSAgICAgICAgaW50ZXJmZXJlbmNlIGRldGVjdGlvbiAqLworI2RlZmluZSBaTV9SRUdfRkxBR19DSEFOTkVMX0RGUwkJMHgwMiAvKiBERlMgcmVxdWlyZWQgb24gY2hhbm5lbCAqLworI2RlZmluZSBaTV9SRUdfRkxBR19DSEFOTkVMXzRNU19MSU1JVAkweDA0IC8qIDRtc2VjIHBhY2tldCBsaW1pdCBvbiB0aGlzIGNoYW5uZWwgKi8KKyNkZWZpbmUgWk1fUkVHX0ZMQUdfQ0hBTk5FTF9ERlNfQ0xFQVIgICAgICAgMHgwOCAvKiBpZiBjaGFubmVsIGhhcyBiZWVuIGNoZWNrZWQgZm9yIERGUyAqLworCisjZGVmaW5lIENIQU5ORUxfQSAgIChDSEFOTkVMXzVHSFp8Q0hBTk5FTF9PRkRNKQorI2RlZmluZSBDSEFOTkVMX0IgICAoQ0hBTk5FTF8yR0hafENIQU5ORUxfQ0NLKQorI2RlZmluZSBDSEFOTkVMX1BVUkVHICAgKENIQU5ORUxfMkdIWnxDSEFOTkVMX09GRE0pCisjaWZkZWYgbm90ZGVmCisjZGVmaW5lIENIQU5ORUxfRyAgIChDSEFOTkVMXzJHSFp8Q0hBTk5FTF9EWU4pCisjZWxzZQorI2RlZmluZSBDSEFOTkVMX0cgICAoQ0hBTk5FTF8yR0hafENIQU5ORUxfT0ZETSkKKyNlbmRpZgorI2RlZmluZSBDSEFOTkVMX1QgICAoQ0hBTk5FTF81R0hafENIQU5ORUxfT0ZETXxDSEFOTkVMX1RVUkJPKQorI2RlZmluZSBDSEFOTkVMX1NUICAoQ0hBTk5FTF9UfENIQU5ORUxfU1RVUkJPKQorI2RlZmluZSBDSEFOTkVMXzEwOEcgICAgKENIQU5ORUxfMkdIWnxDSEFOTkVMX09GRE18Q0hBTk5FTF9UVVJCTykKKyNkZWZpbmUgQ0hBTk5FTF8xMDhBICAgIENIQU5ORUxfVAorI2RlZmluZSBDSEFOTkVMX1ggICAoQ0hBTk5FTF81R0hafENIQU5ORUxfT0ZETXxDSEFOTkVMX1hSKQorI2RlZmluZSBDSEFOTkVMX0dfSFQgICAgICAoQ0hBTk5FTF8yR0haIHwgQ0hBTk5FTF9PRkRNIHwgQ0hBTk5FTF9IVDIwKQorI2RlZmluZSBDSEFOTkVMX0FfSFQgICAgICAoQ0hBTk5FTF81R0haIHwgQ0hBTk5FTF9PRkRNIHwgQ0hBTk5FTF9IVDIwKQorCisjZGVmaW5lIENIQU5ORUxfR19IVDIwICAoQ0hBTk5FTF8yR0hafENIQU5ORUxfSFQyMCkKKyNkZWZpbmUgQ0hBTk5FTF9BX0hUMjAgIChDSEFOTkVMXzVHSFp8Q0hBTk5FTF9IVDIwKQorI2RlZmluZSBDSEFOTkVMX0dfSFQ0MCAgKENIQU5ORUxfMkdIWnxDSEFOTkVMX0hUMjB8Q0hBTk5FTF9IVDQwKQorI2RlZmluZSBDSEFOTkVMX0FfSFQ0MCAgKENIQU5ORUxfNUdIWnxDSEFOTkVMX0hUMjB8Q0hBTk5FTF9IVDQwKQorI2RlZmluZSBDSEFOTkVMX0FMTCBcCisgICAgKENIQU5ORUxfT0ZETXxDSEFOTkVMX0NDS3wgQ0hBTk5FTF8yR0haIHwgQ0hBTk5FTF81R0haIHwgQ0hBTk5FTF9UVVJCTyB8IENIQU5ORUxfSFQyMCB8IENIQU5ORUxfSFQ0MCkKKyNkZWZpbmUgQ0hBTk5FTF9BTExfTk9UVVJCTyAgICAgKENIQU5ORUxfQUxMICZ+IENIQU5ORUxfVFVSQk8pCisKK2VudW0geworICAgIEhBTF9NT0RFXzExQSAgICA9IDB4MDAxLCAgICAgICAgLyogMTFhIGNoYW5uZWxzICovCisgICAgSEFMX01PREVfVFVSQk8gID0gMHgwMDIsICAgICAgICAvKiAxMWEgdHVyYm8tb25seSBjaGFubmVscyAqLworICAgIEhBTF9NT0RFXzExQiAgICA9IDB4MDA0LCAgICAgICAgLyogMTFiIGNoYW5uZWxzICovCisgICAgSEFMX01PREVfUFVSRUcgID0gMHgwMDgsICAgICAgICAvKiAxMWcgY2hhbm5lbHMgKE9GRE0gb25seSkgKi8KKyNpZmRlZiBub3RkZWYKKyAgICBIQUxfTU9ERV8xMUcgICAgPSAweDAxMCwgICAgICAgIC8qIDExZyBjaGFubmVscyAoT0ZETS9DQ0spICovCisjZWxzZQorICAgIEhBTF9NT0RFXzExRyAgICA9IDB4MDA4LCAgICAgICAgLyogWFhYIGhpc3RvcmljYWwgKi8KKyNlbmRpZgorICAgIEhBTF9NT0RFXzEwOEcgICA9IDB4MDIwLCAgICAgICAgLyogMTFhK1R1cmJvIGNoYW5uZWxzICovCisgICAgSEFMX01PREVfMTA4QSAgID0gMHgwNDAsICAgICAgICAvKiAxMWcrVHVyYm8gY2hhbm5lbHMgKi8KKyAgICBIQUxfTU9ERV9YUiAgICAgPSAweDEwMCwgICAgICAgIC8qIFhSIGNoYW5uZWxzICovCisgICAgSEFMX01PREVfMTFBX0hBTEZfUkFURSA9IDB4MjAwLCAgICAgLyogMTFBIGhhbGYgcmF0ZSBjaGFubmVscyAqLworICAgIEhBTF9NT0RFXzExQV9RVUFSVEVSX1JBVEUgPSAweDQwMCwgIC8qIDExQSBxdWFydGVyIHJhdGUgY2hhbm5lbHMgKi8KKyAgICBIQUxfTU9ERV8xMU5HICAgPSAweDQwMDAsICAgICAgICAgICAvKiAxMW5nIGNoYW5uZWxzICovCisgICAgSEFMX01PREVfMTFOQSAgID0gMHg4MDAwLCAgICAgICAgICAgLyogMTFuYSBjaGFubmVscyAqLworICAgIEhBTF9NT0RFX0FMTCAgICA9IDB4ZmZmZgorfTsKKworI2VuZGlmIC8qICNpZm5kZWYgX0hQUkVHX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzL2hhbC9ocHJ3LmMgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy9oYWwvaHBydy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiN2Q0OTUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy9oYWwvaHBydy5jCkBAIC0wLDAgKzEsMTU1NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNy0yMDA4IEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisjaW5jbHVkZSAiLi4vODAyMTFjb3JlL2NwcmVjb21wLmgiCisjaW5jbHVkZSAiaHBhbmkuaCIKKyNpbmNsdWRlICJocHVzYi5oIgorI2luY2x1ZGUgImhwcmVnLmgiCisjaW5jbHVkZSAiLi4vODAyMTFjb3JlL3JhdGVjdHJsLmgiCisKK2V4dGVybiB2b2lkIHpmSWRsQ21kKHpkZXZfdCogZGV2LCB1MzJfdCogY21kLCB1MTZfdCBjbWRMZW4pOworCitleHRlcm4gdm9pZCB6ZkNvcmVDd21CdXN5KHpkZXZfdCogZGV2LCB1MTZfdCBidXN5KTsKK3UxNl90IHpmRGVsYXlXcml0ZUludGVybmFsUmVnKHpkZXZfdCogZGV2LCB1MzJfdCBhZGRyLCB1MzJfdCB2YWwpOwordTE2X3QgemZGbHVzaERlbGF5V3JpdGUoemRldl90KiBkZXYpOworCisvLyNkZWZpbmUgem1faHBfcHJpdih4KSBzdHJ1Y3QgenNIcFByaXYqIGhwUHJpdj16Z1dsYW5EZXYuaHBQcml2YXRlOworCit2b2lkIHpmSW5pdENtZFF1ZXVlKHpkZXZfdCogZGV2KQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICBzdHJ1Y3QgenNIcFByaXYqIGhwUHJpdiA9IChzdHJ1Y3QgenNIcFByaXYqKSh3ZC0+aHBQcml2YXRlKTsKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworI2lmZGVmIFpNX1hQX1VTQl9NVUxUQ01ECisgICAgaHBQcml2LT5jbWRUYWlsID0gaHBQcml2LT5jbWRIZWFkID0gaHBQcml2LT5jbWRTZW5kID0gMDsKKyNlbHNlCisgICAgaHBQcml2LT5jbWRUYWlsID0gaHBQcml2LT5jbWRIZWFkID0gMDsKKyNlbmRpZgorICAgIGhwUHJpdi0+Y21kUGVuZGluZyA9IDA7CisgICAgaHBQcml2LT5jbWQuZGVsYXlXY21kQ291bnQgPSAwOworICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7Cit9CisKK3UxNl90IHpmUHV0Q21kKHpkZXZfdCogZGV2LCB1MzJfdCogY21kLCB1MTZfdCBjbWRMZW4sIHUxNl90IHNyYywgdThfdCogYnVmKQoreworICAgIHUxNl90IGk7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisgICAgc3RydWN0IHpzSHBQcml2KiBocFByaXY9d2QtPmhwUHJpdmF0ZTsKKworICAgIC8qIE1ha2Ugc3VyZSBjb21tYW5kIGxlbmd0aCA8IFpNX01BWF9DTURfU0laRSAqLworICAgIHptX2Fzc2VydChjbWRMZW4gPD0gWk1fTUFYX0NNRF9TSVpFKTsKKyAgICAvKiBNYWtlIHN1cmUgY29tbWFuZCBxdWV1ZSBub3QgZnVsbCAqLworICAgIC8vem1fYXNzZXJ0KCgoaHBQcml2LT5jbWRUYWlsKzEpICYgKFpNX0NNRF9RVUVVRV9TSVpFLTEpKSAhPSBocFByaXYtPmNtZEhlYWQpOworICAgIGlmICgoKGhwUHJpdi0+Y21kVGFpbCsxKSAmIChaTV9DTURfUVVFVUVfU0laRS0xKSkgPT0gaHBQcml2LT5jbWRIZWFkICkgeworICAgICAgICB6bV9kZWJ1Z19tc2cwKCJDTUQgcXVldWUgZnVsbCEhIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGhwUHJpdi0+Y21kUVtocFByaXYtPmNtZFRhaWxdLmNtZExlbiA9IGNtZExlbjsKKyAgICBocFByaXYtPmNtZFFbaHBQcml2LT5jbWRUYWlsXS5zcmMgPSBzcmM7CisgICAgaHBQcml2LT5jbWRRW2hwUHJpdi0+Y21kVGFpbF0uYnVmID0gYnVmOworICAgIGZvciAoaT0wOyBpPChjbWRMZW4+PjIpOyBpKyspCisgICAgeworICAgICAgICBocFByaXYtPmNtZFFbaHBQcml2LT5jbWRUYWlsXS5jbWRbaV0gPSBjbWRbaV07CisgICAgfQorCisgICAgaHBQcml2LT5jbWRUYWlsID0gKGhwUHJpdi0+Y21kVGFpbCsxKSAmIChaTV9DTURfUVVFVUVfU0laRS0xKTsKKworICAgIHJldHVybiAwOworfQorCit1MTZfdCB6ZkdldENtZCh6ZGV2X3QqIGRldiwgdTMyX3QqIGNtZCwgdTE2X3QqIGNtZExlbiwgdTE2X3QqIHNyYywgdThfdCoqIGJ1ZikKK3sKKyAgICB1MTZfdCBpOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworICAgIHN0cnVjdCB6c0hwUHJpdiogaHBQcml2PXdkLT5ocFByaXZhdGU7CisKKyAgICBpZiAoaHBQcml2LT5jbWRUYWlsID09IGhwUHJpdi0+Y21kSGVhZCkKKyAgICB7CisgICAgICAgIHJldHVybiAzOworICAgIH0KKworICAgICpjbWRMZW4gPSBocFByaXYtPmNtZFFbaHBQcml2LT5jbWRIZWFkXS5jbWRMZW47CisgICAgKnNyYyA9IGhwUHJpdi0+Y21kUVtocFByaXYtPmNtZEhlYWRdLnNyYzsKKyAgICAqYnVmID0gaHBQcml2LT5jbWRRW2hwUHJpdi0+Y21kSGVhZF0uYnVmOworICAgIGZvciAoaT0wOyBpPCgoKmNtZExlbik+PjIpOyBpKyspCisgICAgeworICAgICAgICBjbWRbaV0gPSBocFByaXYtPmNtZFFbaHBQcml2LT5jbWRIZWFkXS5jbWRbaV07CisgICAgfQorCisgICAgaHBQcml2LT5jbWRIZWFkID0gKGhwUHJpdi0+Y21kSGVhZCsxKSAmIChaTV9DTURfUVVFVUVfU0laRS0xKTsKKworICAgIHJldHVybiAwOworfQorCisjaWZkZWYgWk1fWFBfVVNCX01VTFRDTUQKK3ZvaWQgemZTZW5kQ21kRXgoemRldl90KiBkZXYpCit7CisgICAgdTMyX3QgbmNtZFtaTV9NQVhfQ01EX1NJWkUvNF07CisgICAgdTE2X3QgbmNtZExlbiA9IDA7CisgICAgdTE2X3QgY21kRmxhZyA9IDA7CisgICAgdTE2X3QgaTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICBzdHJ1Y3QgenNIcFByaXYqIGhwUHJpdj13ZC0+aHBQcml2YXRlOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICBpZiAoaHBQcml2LT5jbWRQZW5kaW5nID09IDApCisgICAgeworICAgICAgICBpZiAoaHBQcml2LT5jbWRUYWlsICE9IGhwUHJpdi0+Y21kU2VuZCkKKyAgICAgICAgeworICAgICAgICAgICAgY21kRmxhZyA9IDE7CisgICAgICAgICAgICAvKiBHZXQgcXVldWVpbmcgY29tbWFuZCAqLworICAgICAgICAgICAgbmNtZExlbj0gaHBQcml2LT5jbWRRW2hwUHJpdi0+Y21kU2VuZF0uY21kTGVuOworICAgICAgICAgICAgZm9yIChpPTA7IGk8KG5jbWRMZW4+PjIpOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbmNtZFtpXSA9IGhwUHJpdi0+Y21kUVtocFByaXYtPmNtZFNlbmRdLmNtZFtpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGhwUHJpdi0+Y21kU2VuZCA9IChocFByaXYtPmNtZFNlbmQrMSkgJiAoWk1fQ01EX1FVRVVFX1NJWkUtMSk7CisKKyAgICAgICAgICAgIGhwUHJpdi0+Y21kUGVuZGluZyA9IDE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgaWYgKChjbWRGbGFnID09IDEpKQorICAgIHsKKyAgICAgICAgemZJZGxDbWQoZGV2LCBuY21kLCBuY21kTGVuKTsKKyAgICB9Cit9CisKK3ZvaWQgemZpU2VuZENtZENvbXAoemRldl90KiBkZXYpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworICAgIHN0cnVjdCB6c0hwUHJpdiogaHBQcml2PXdkLT5ocFByaXZhdGU7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICBocFByaXYtPmNtZFBlbmRpbmcgPSAwOworICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICB6ZlNlbmRDbWRFeChkZXYpOworfQorI2VuZGlmCisKK3UxNl90IHpmSXNzdWVDbWQoemRldl90KiBkZXYsIHUzMl90KiBjbWQsIHUxNl90IGNtZExlbiwgdTE2X3Qgc3JjLCB1OF90KiBidWYpCit7CisgICAgdTE2X3QgY21kRmxhZyA9IDA7CisgICAgdTE2X3QgcmV0OworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworICAgIHN0cnVjdCB6c0hwUHJpdiogaHBQcml2PXdkLT5ocFByaXZhdGU7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgem1fbXNnMl9tbShaTV9MVl8xLCAiY21kTGVuPSIsIGNtZExlbik7CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisjaWZkZWYgWk1fWFBfVVNCX01VTFRDTUQKKyAgICByZXQgPSB6ZlB1dENtZChkZXYsIGNtZCwgY21kTGVuLCBzcmMsIGJ1Zik7CisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIGlmIChyZXQgIT0gMCkKKyAgICB7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIHpmU2VuZENtZEV4KGRldik7CisjZWxzZQorICAgIGlmIChocFByaXYtPmNtZFBlbmRpbmcgPT0gMCkKKyAgICB7CisgICAgICAgIGhwUHJpdi0+Y21kUGVuZGluZyA9IDE7CisgICAgICAgIGNtZEZsYWcgPSAxOworICAgIH0KKyAgICByZXQgPSB6ZlB1dENtZChkZXYsIGNtZCwgY21kTGVuLCBzcmMsIGJ1Zik7CisKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgaWYgKHJldCAhPSAwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgaWYgKGNtZEZsYWcgPT0gMSkKKyAgICB7CisgICAgICAgIHpmSWRsQ21kKGRldiwgY21kLCBjbWRMZW4pOworICAgIH0KKyNlbmRpZgorICAgIHJldHVybiAwOworfQorCit2b2lkIHpmSWRsUnNwKHpkZXZfdCogZGV2LCB1MzJfdCogcnNwLCB1MTZfdCByc3BMZW4pCit7CisgICAgdTMyX3QgY21kW1pNX01BWF9DTURfU0laRS80XTsKKyAgICB1MTZfdCBjbWRMZW47CisgICAgdTE2X3Qgc3JjOworICAgIHU4X3QqIGJ1ZjsKKyAgICB1MzJfdCBuY21kW1pNX01BWF9DTURfU0laRS80XTsKKyAgICB1MTZfdCBuY21kTGVuID0gMDsKKyAgICB1MTZfdCByZXQ7CisgICAgdTE2X3QgY21kRmxhZyA9IDA7CisgICAgdTE2X3QgaTsKKyAgICBzMzJfdCBuZjsKKyAgICBzMzJfdCBub2lzZWZsb29yWzRdOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworICAgIHN0cnVjdCB6c0hwUHJpdiogaHBQcml2PXdkLT5ocFByaXZhdGU7CisKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgcmV0ID0gemZHZXRDbWQoZGV2LCBjbWQsICZjbWRMZW4sICZzcmMsICZidWYpOworICAgICNpZiAwCisgICAgem1fYXNzZXJ0KHJldCA9PSAwKTsKKyAgICAjZWxzZQorICAgIGlmIChyZXQgIT0gMCkKKyAgICB7CisgICAgICAgIHptX2RlYnVnX21zZzAoIkVycm9yIElkbFJzcCBiZWNhdXNlIG5vbmUgY21kISFcbiIpOworICAgICAgICAjaWZuZGVmIFpNX1hQX1VTQl9NVUxUQ01ECisgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgIHJldHVybjsKKyAgICAgICAgI2VuZGlmCisgICAgfQorICAgICNlbmRpZgorI2lmZGVmIFpNX1hQX1VTQl9NVUxUQ01ECisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyNlbHNlCisgICAgaWYgKGhwUHJpdi0+Y21kVGFpbCAhPSBocFByaXYtPmNtZEhlYWQpCisgICAgeworICAgICAgICBjbWRGbGFnID0gMTsKKyAgICAgICAgLyogR2V0IHF1ZXVlaW5nIGNvbW1hbmQgKi8KKyAgICAgICAgbmNtZExlbj0gaHBQcml2LT5jbWRRW2hwUHJpdi0+Y21kSGVhZF0uY21kTGVuOworICAgICAgICBmb3IgKGk9MDsgaTwobmNtZExlbj4+Mik7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgbmNtZFtpXSA9IGhwUHJpdi0+Y21kUVtocFByaXYtPmNtZEhlYWRdLmNtZFtpXTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBocFByaXYtPmNtZFBlbmRpbmcgPSAwOworICAgIH0KKworICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICBpZiAoY21kRmxhZyA9PSAxKQorICAgIHsKKyAgICAgICAgemZJZGxDbWQoZGV2LCBuY21kLCBuY21kTGVuKTsKKyAgICB9CisjZW5kaWYKKyAgICBpZiAoc3JjID09IFpNX09JRF9SRUFEKQorICAgIHsKKyAgICAgICAgWk1fUEVSRk9STUFOQ0VfUkVHKGRldiwgMHgxMTc3MmMsIHJzcFsxXSk7CisgICAgICAgIHpmd0RiZ1JlYWRSZWdEb25lKGRldiwgY21kWzFdLCByc3BbMV0pOworICAgIH0KKyAgICBlbHNlIGlmIChzcmMgPT0gWk1fT0lEX0ZMQVNIX0NIS1NVTSkKKyAgICB7CisgICAgICAgIHpmd0RiZ0dldEZsYXNoQ2hrU3VtRG9uZShkZXYsIHJzcCsxKTsKKyAgICB9CisgICAgZWxzZSBpZiAoc3JjID09IFpNX09JRF9GTEFTSF9SRUFEKQorICAgIHsKKyAgICAgICAgdTMyX3QgIGRhdGFsZW47CisgICAgICAgIHUxNl90IGk7CisKKyAgICAgICAgZGF0YWxlbiA9IChyc3BbMF0gJiAyNTUpOworCisgICAgICAgIHpmd0RiZ1JlYWRGbGFzaERvbmUoZGV2LCBjbWRbMV0sIHJzcCsxLCBkYXRhbGVuKTsKKyAgICB9CisgICAgZWxzZSBpZiAoc3JjID09IFpNX09JRF9GTEFTSF9QUk9HUkFNKQorICAgIHsKKyAgICAgICAgLyogTm9uIGRvICovCisgICAgfQorICAgIGVsc2UgaWYgKHNyYyA9PSBaTV9PSURfV1JJVEUpCisgICAgeworICAgICAgICB6ZndEYmdXcml0ZVJlZ0RvbmUoZGV2LCBjbWRbMV0sIGNtZFsyXSk7CisgICAgfQorICAgIGVsc2UgaWYgKHNyYyA9PSBaTV9PSURfVEFMTFkpCisgICAgeworCQl6ZkNvbGxlY3RIV1RhbGx5KGRldiwgcnNwLCAwKTsKKyAgICB9CisgICAgZWxzZSBpZiAoc3JjID09IFpNX09JRF9UQUxMWV9BUEQpCisgICAgeworCQl6ZkNvbGxlY3RIV1RhbGx5KGRldiwgcnNwLCAxKTsKKyAgICAgICAgemZ3RGJnUmVhZFRhbGx5RG9uZShkZXYpOworI2lmZGVmIFpNX0VOQUJMRV9CQV9SQVRFQ1RSTAorICAgICAgICB6ZlJhdGVDdHJsQWdnclN0YShkZXYpOworI2VuZGlmCisgICAgfQorICAgIGVsc2UgaWYgKHNyYyA9PSBaTV9PSURfREtUWF9TVEFUVVMpCisgICAgeworICAgICAgICB6bV9kZWJ1Z19tc2cwKCJzcmMgPSB6bV9PSURfREtUWF9TVEFUVVMiKTsKKyAgICAgICAgemZ3RGJnUXVlcnlId1R4QnVzeURvbmUoZGV2LCByc3BbMV0pOworICAgIH0KKyAgICBlbHNlIGlmIChzcmMgPT0gWk1fQ01EX1NFVF9GUkVRVUVOQ1kpCisgICAgeworCisvLyNpZmRlZiBaTV9PVFVTX0VOQUJMRV9SRVRSWV9GUkVRX0NIQU5HRQorI2lmIDAKKyAgICB6bV9kZWJ1Z19tc2cxKCJSZXRyeSBTZXQgRnJlcXVlbmN5ID0gIiwgcnNwWzFdKTsKKworICAgICNpZiAxCisgICAgLy8gUmVhZCB0aGUgTm9pc2UgRmxvb3IgdmFsdWUgIQorICAgIG5mID0gKChyc3BbMl0+PjE5KSAmIDB4MWZmKTsKKyAgICBpZiAoKG5mICYgMHgxMDApICE9IDB4MCkKKyAgICB7CisgICAgICAgIG5vaXNlZmxvb3JbMF0gPSAwIC0gKChuZiBeIDB4MWZmKSArIDEpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBub2lzZWZsb29yWzBdID0gbmY7CisgICAgfQorCisgICAgem1fZGVidWdfbXNnMSgiTm9pc2UgRmxvb3JbMV0gPSAiLCBub2lzZWZsb29yWzBdKTsKKworICAgIG5mID0gKChyc3BbM10+PjE5KSAmIDB4MWZmKTsKKyAgICBpZiAoKG5mICYgMHgxMDApICE9IDB4MCkKKyAgICB7CisgICAgICAgIG5vaXNlZmxvb3JbMV0gPSAwIC0gKChuZiBeIDB4MWZmKSArIDEpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBub2lzZWZsb29yWzFdID0gbmY7CisgICAgfQorCisgICAgem1fZGVidWdfbXNnMSgiTm9pc2UgRmxvb3JbMl0gPSAiLCBub2lzZWZsb29yWzFdKTsKKyAgICB6bV9kZWJ1Z19tc2cxKCJJcyBTaXRlIFN1cnZleSA9ICIsIGhwUHJpdi0+aXNTaXRlU3VydmV5KTsKKyAgICAjZW5kaWYKKworICAgICAgICBpZiAoIChyc3BbMV0gJiYgaHBQcml2LT5mcmVxUmV0cnlDb3VudGVyID09IDApIHx8CisgICAgICAgICAgICAgKCgobm9pc2VmbG9vclswXT4tNjApfHwobm9pc2VmbG9vclsxXT4tNjApKSAmJiBocFByaXYtPmZyZXFSZXRyeUNvdW50ZXI9PTApIHx8CisgICAgICAgICAgICAgKChhYnMobm9pc2VmbG9vclswXS1ub2lzZWZsb29yWzFdKT49OSkgJiYgaHBQcml2LT5mcmVxUmV0cnlDb3VudGVyPT0wKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIlJldHJ5IHRvIGlzc3VlIHRoZSBmcmVxdWVuY3kgY2hhbmdlIGNvbW1hbmQiKTsKKworICAgICAgICAgICAgaWYgKCBocFByaXYtPnJlY29yZEZyZXFSZXRyeUNvdW50ZXIgPT0gMSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiQ29sZCBSZXNldCIpOworCisgICAgICAgICAgICAgICAgemZIcFNldEZyZXF1ZW5jeUV4KGRldiwgaHBQcml2LT5sYXRlc3RGcmVxdWVuY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHBQcml2LT5sYXRlc3RCdzQwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhwUHJpdi0+bGF0ZXN0RXh0T2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIpOworCisgICAgICAgICAgICAgICAgaWYgKCBocFByaXYtPmlzU2l0ZVN1cnZleSAhPSAyICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGhwUHJpdi0+ZnJlcVJldHJ5Q291bnRlcisrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBocFByaXYtPnJlY29yZEZyZXFSZXRyeUNvdW50ZXIgPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHpmSHBTZXRGcmVxdWVuY3lFeChkZXYsIGhwUHJpdi0+bGF0ZXN0RnJlcXVlbmN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhwUHJpdi0+bGF0ZXN0Qnc0MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBocFByaXYtPmxhdGVzdEV4dE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGhwUHJpdi0+cmVjb3JkRnJlcVJldHJ5Q291bnRlcisrOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyNlbmRpZgorCisvKiByZXQ6IEJpdDA6IEFHQyBjYWxpYnJhdGlvbiAgIDA9PmZpbmlzaCAgMT0+dW5maW5pc2ggICAgICAgICAgICAgICAqLworLyogICAgICBCaXQxOiBOb2lzZSBjYWxpYnJhdGlvbiAwPT5maW5pc2ggIDE9PnVuZmluaXNoICAgICAgICAgICAgICAgKi8KKy8qICAgICAgQml0MjogTm9pc2UgY2FsaWJyYXRpb24gZmluaXNoLCBidXQgTkYgdmFsdWUgdW5leGNlcHRlZCA9PiAxICovCisgICAgICAgIGlmICggKHJzcFsxXSAmIDB4MSkgfHwgKHJzcFsxXSAmIDB4NCkgKQorICAgICAgICB7CisgICAgICAgICAgICB6bV9kZWJ1Z19tc2cxKCJTZXQgRnJlcXVlbmN5IGZhaWwgOiByZXQgPSAiLCByc3BbMV0pOworCisgICAgICAgICAgICAvKiAxLiBBR0MgQ2FsaWJyYXRpb24gZmFpbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgLyogMi4gTm9pc2UgQ2FsaWJyYXRpb24gZmluaXNoIGJ1dCBlcnJvciBOb2lzZUZsb29yIHZhbHVlICAgKi8KKyAgICAgICAgICAgIC8qICAgICAgYW5kIG5vdCBpbiBzaXRlc3VydmV5LCB0cnkgbW9yZSB0d2ljZSAgICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAoIGhwUHJpdi0+aXNTaXRlU3VydmV5ID09IDIgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICggaHBQcml2LT5yZWNvcmRGcmVxUmV0cnlDb3VudGVyIDwgMiApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKiBjb2xkIHJlc2V0ICovCisgICAgICAgICAgICAgICAgICAgIHpmSHBTZXRGcmVxdWVuY3lFeChkZXYsIGhwUHJpdi0+bGF0ZXN0RnJlcXVlbmN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBocFByaXYtPmxhdGVzdEJ3NDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhwUHJpdi0+bGF0ZXN0RXh0T2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyKTsKKyAgICAgICAgICAgICAgICAgICAgaHBQcml2LT5yZWNvcmRGcmVxUmV0cnlDb3VudGVyKys7CisgICAgICAgICAgICAgICAgICAgIHptX2RlYnVnX21zZzEoIlJldHJ5IHRvIGlzc3VlIHRoZSBmcmVxdWVuY3kgY2hhbmdlIGNvbW1hbmQoY29sZCByZXNldCkgY291bnRlciA9ICIsIGhwUHJpdi0+cmVjb3JkRnJlcVJldHJ5Q291bnRlcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qIEZhaWwgOiB3ZSB3b3VsZCBub3QgYWNjZXB0IHRoaXMgcmVzdWx0ISAqLworICAgICAgICAgICAgICAgICAgICB6bV9kZWJ1Z19tc2cwKCJcblxuXG5cbiAgRmFpbCB0d2ljZSBjb2xkIHJlc2V0IFxuXG5cblxuIik7CisgICAgICAgICAgICAgICAgICAgIGhwUHJpdi0+Y29sZFJlc2V0TmVlZEZyZXEgPSAwOworICAgICAgICAgICAgICAgICAgICBocFByaXYtPnJlY29yZEZyZXFSZXRyeUNvdW50ZXIgPSAwOworICAgICAgICAgICAgICAgICAgICB6ZkNvcmVTZXRGcmVxdWVuY3lDb21wbGV0ZShkZXYpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBpbiBzaXRlc3VydmV5LCBjb2xkcmVzZXQgaW4gbmV4dCBjaGFubmVsICovCisgICAgICAgICAgICAgICAgaHBQcml2LT5jb2xkUmVzZXROZWVkRnJlcSA9IDE7CisgICAgICAgICAgICAgICAgaHBQcml2LT5yZWNvcmRGcmVxUmV0cnlDb3VudGVyID0gMDsKKyAgICAgICAgICAgICAgICB6ZkNvcmVTZXRGcmVxdWVuY3lDb21wbGV0ZShkZXYpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHJzcFsxXSAmIDB4MikKKyAgICAgICAgeworICAgICAgICAgICAgem1fZGVidWdfbXNnMSgiU2V0IEZyZXF1ZW5jeSBmYWlsIDIgOiByZXQgPSAiLCByc3BbMV0pOworCisgICAgICAgICAgICAvKiBOb2lzZSBDYWxpYnJhdGlvbiB1bi1maW5pc2ggICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAvKiAgICAgIGFuZCBub3QgaW4gc2l0ZXN1cnZleSwgdHJ5IG1vcmUgb25jZSAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAoIGhwUHJpdi0+aXNTaXRlU3VydmV5ID09IDIgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICggaHBQcml2LT5yZWNvcmRGcmVxUmV0cnlDb3VudGVyIDwgMSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKiBjb2xkIHJlc2V0ICovCisgICAgICAgICAgICAgICAgICAgIHpmSHBTZXRGcmVxdWVuY3lFeChkZXYsIGhwUHJpdi0+bGF0ZXN0RnJlcXVlbmN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBocFByaXYtPmxhdGVzdEJ3NDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhwUHJpdi0+bGF0ZXN0RXh0T2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyKTsKKyAgICAgICAgICAgICAgICAgICAgaHBQcml2LT5yZWNvcmRGcmVxUmV0cnlDb3VudGVyKys7CisgICAgICAgICAgICAgICAgICAgIHptX2RlYnVnX21zZzEoIjIgUmV0cnkgdG8gaXNzdWUgdGhlIGZyZXF1ZW5jeSBjaGFuZ2UgY29tbWFuZChjb2xkIHJlc2V0KSBjb3VudGVyID0gIiwgaHBQcml2LT5yZWNvcmRGcmVxUmV0cnlDb3VudGVyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyogRmFpbCA6IHdlIHdvdWxkIG5vdCBhY2NlcHQgdGhpcyByZXN1bHQhICovCisgICAgICAgICAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIlxuXG5cblxuICAyIEZhaWwgdHdpY2UgY29sZCByZXNldCBcblxuXG5cbiIpOworICAgICAgICAgICAgICAgICAgICBocFByaXYtPmNvbGRSZXNldE5lZWRGcmVxID0gMDsKKyAgICAgICAgICAgICAgICAgICAgaHBQcml2LT5yZWNvcmRGcmVxUmV0cnlDb3VudGVyID0gMDsKKyAgICAgICAgICAgICAgICAgICAgemZDb3JlU2V0RnJlcXVlbmN5Q29tcGxldGUoZGV2KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogaW4gc2l0ZXN1cnZleSwgc2tpcCB0aGlzIGZyZXF1ZW5jeSAqLworICAgICAgICAgICAgICAgIGhwUHJpdi0+Y29sZFJlc2V0TmVlZEZyZXEgPSAwOworICAgICAgICAgICAgICAgIGhwUHJpdi0+cmVjb3JkRnJlcVJldHJ5Q291bnRlciA9IDA7CisgICAgICAgICAgICAgICAgemZDb3JlU2V0RnJlcXVlbmN5Q29tcGxldGUoZGV2KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvL2Vsc2UgaWYgKHJzcFsxXSAmIDB4NCkKKyAgICAgICAgLy97CisgICAgICAgIC8vICAgIHptX2RlYnVnX21zZzEoIlNldCBGcmVxdWVuY3kgZmFpbCAzIDogcmV0ID0gIiwgcnNwWzFdKTsKKyAgICAgICAgLy8gICAgaHBQcml2LT5jb2xkUmVzZXROZWVkRnJlcSA9IDA7CisgICAgICAgIC8vICAgIGhwUHJpdi0+cmVjb3JkRnJlcVJldHJ5Q291bnRlciA9IDA7CisgICAgICAgIC8vICAgIHpmQ29yZVNldEZyZXF1ZW5jeUNvbXBsZXRlKGRldik7CisgICAgICAgIC8vfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vaHBQcml2LT5mcmVxUmV0cnlDb3VudGVyID0gMDsKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzIoIiByZXR1cm4gY29tcGxldGUsIHJldCA9ICIsIHJzcFsxXSk7CisKKyAgICAgICAgICAgIC8qIHNldCBiYl9oZWF2eV9jbGlwX2VuYWJsZSAqLworICAgICAgICAgICAgaWYgKGhwUHJpdi0+ZW5hYmxlQkJIZWF2eUNsaXAgJiYgaHBQcml2LT5od0JCSGVhdnlDbGlwICYmCisgICAgICAgICAgICAgICAgaHBQcml2LT5kb0JCSGVhdnlDbGlwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHUzMl90IHNldFZhbHVlID0gMHgyMDA7CisKKyAgICAgICAgICAgICAgICBzZXRWYWx1ZSB8PSBocFByaXYtPnNldFZhbHVlSGVhdnlDbGlwOworCisgICAgICAgICAgICAgICAgLy96bV9kYmcoKCJEbyBoZWF2eSBjbGlwIHNldFZhbHVlID0gJWRcbiIsIHNldFZhbHVlKSk7CisKKyAgICAgICAgICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIDB4OTllMCsweDFiYzAwMCwgc2V0VmFsdWUpOworICAgICAgICAgICAgICAgIHpmRmx1c2hEZWxheVdyaXRlKGRldik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGhwUHJpdi0+Y29sZFJlc2V0TmVlZEZyZXEgPSAwOworICAgICAgICAgICAgaHBQcml2LT5yZWNvcmRGcmVxUmV0cnlDb3VudGVyID0gMDsKKyAgICAJICAgIHpmQ29yZVNldEZyZXF1ZW5jeUNvbXBsZXRlKGRldik7CisgICAgCX0KKworICAgICAgICAjaWYgMQorICAgICAgICAvLyBSZWFkIHRoZSBOb2lzZSBGbG9vciB2YWx1ZSAhCisgICAgICAgIG5mID0gKChyc3BbMl0+PjE5KSAmIDB4MWZmKTsKKyAgICAgICAgaWYgKChuZiAmIDB4MTAwKSAhPSAweDApCisgICAgICAgIHsKKyAgICAgICAgICAgIG5vaXNlZmxvb3JbMF0gPSAwIC0gKChuZiBeIDB4MWZmKSArIDEpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgbm9pc2VmbG9vclswXSA9IG5mOworICAgICAgICB9CisKKyAgICAgICAgLy96bV9kZWJ1Z19tc2cxKCJOb2lzZSBGbG9vclsxXSA9ICIsIG5vaXNlZmxvb3JbMF0pOworCisgICAgICAgIG5mID0gKChyc3BbM10+PjE5KSAmIDB4MWZmKTsKKyAgICAgICAgaWYgKChuZiAmIDB4MTAwKSAhPSAweDApCisgICAgICAgIHsKKyAgICAgICAgICAgIG5vaXNlZmxvb3JbMV0gPSAwIC0gKChuZiBeIDB4MWZmKSArIDEpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgbm9pc2VmbG9vclsxXSA9IG5mOworICAgICAgICB9CisKKyAgICAgICAgLy96bV9kZWJ1Z19tc2cxKCJOb2lzZSBGbG9vclsyXSA9ICIsIG5vaXNlZmxvb3JbMV0pOworCisgICAgICAgIG5mID0gKChyc3BbNV0+PjIzKSAmIDB4MWZmKTsKKyAgICAgICAgaWYgKChuZiAmIDB4MTAwKSAhPSAweDApCisgICAgICAgIHsKKyAgICAgICAgICAgIG5vaXNlZmxvb3JbMl0gPSAwIC0gKChuZiBeIDB4MWZmKSArIDEpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgbm9pc2VmbG9vclsyXSA9IG5mOworICAgICAgICB9CisKKyAgICAgICAgLy96bV9kZWJ1Z19tc2cxKCJOb2lzZSBGbG9vciBleHRbMV0gPSAiLCBub2lzZWZsb29yWzJdKTsKKworICAgICAgICBuZiA9ICgocnNwWzZdPj4yMykgJiAweDFmZik7CisgICAgICAgIGlmICgobmYgJiAweDEwMCkgIT0gMHgwKQorICAgICAgICB7CisgICAgICAgICAgICBub2lzZWZsb29yWzNdID0gMCAtICgobmYgXiAweDFmZikgKyAxKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIG5vaXNlZmxvb3JbM10gPSBuZjsKKyAgICAgICAgfQorCisgICAgICAgIC8vem1fZGVidWdfbXNnMSgiTm9pc2UgRmxvb3IgZXh0WzJdID0gIiwgbm9pc2VmbG9vclszXSk7CisKKyAgICAgICAgLy96bV9kZWJ1Z19tc2cxKCJJcyBTaXRlIFN1cnZleSA9ICIsIGhwUHJpdi0+aXNTaXRlU3VydmV5KTsKKyAgICAgICAgI2VuZGlmCisgICAgfQorICAgIGVsc2UgaWYgKHNyYyA9PSBaTV9DTURfU0VUX0tFWSkKKyAgICB7CisgICAgICAgIHpmQ29yZVNldEtleUNvbXBsZXRlKGRldik7CisgICAgfQorICAgIGVsc2UgaWYgKHNyYyA9PSBaTV9DV01fUkVBRCkKKyAgICB7CisgICAgICAgIHptX21zZzJfbW0oWk1fTFZfMCwgIkNXTSByc3BbMV09IiwgcnNwWzFdKTsKKyAgICAgICAgem1fbXNnMl9tbShaTV9MVl8wLCAiQ1dNIHJzcFsyXT0iLCByc3BbMl0pOworICAgICAgICB6ZkNvcmVDd21CdXN5KGRldiwgemZDd21Jc0V4dENoYW5CdXN5KHJzcFsxXSwgcnNwWzJdKSk7CisgICAgfQorICAgIGVsc2UgaWYgKHNyYyA9PSBaTV9NQUNfUkVBRCkKKyAgICB7CisgICAgICAgIC8qIHJzcFsxXSA9IFpNX1NFRVBST01fTUFDX0FERFJFU1NfT0ZGU0VUOyAgICovCisgICAgICAgIC8qIHJzcFsyXSA9IFpNX1NFRVBST01fTUFDX0FERFJFU1NfT0ZGU0VUKzQ7ICovCisgICAgICAgIC8qIHJzcFszXSA9IFpNX1NFRVBST01fUkVHRE9NQUlOX09GRlNFVDsgICAgICovCisgICAgICAgIC8qIHJzcFs0XSA9IFpNX1NFRVBST01fVkVSSVNPTl9PRkZTRVQ7ICAgICAgICovCisgICAgICAgIC8qIHJzcFs1XSA9IFpNX1NFRVBST01fSEFSRFdBUkVfVFlQRV9PRkZTRVQ7ICovCisgICAgICAgIC8qIHJzcFs2XSA9IFpNX1NFRVBST01fSFdfSEVBVllfQ0xJUDsgICAgICAgICovCisKKyAgICAgICAgdThfdCBhZGRyWzZdLCBDQ1MsIFdXUjsKKyAgICAgICAgdTE2X3QgQ291bnRyeURvbWFpbkNvZGU7CisKKyAgICAgICAgLyogQkIgaGVhdnkgY2xpcCAqLworICAgICAgICAvL2hwUHJpdi0+ZWVwcm9tSGVhdnlDbGlwRmxhZyA9ICh1OF90KSgocnNwWzZdPj4yNCkgJiAweGZmKTsgLy8gZm9yY2UgZW5hYmxlIDgxMDcKKyAgICAgICAgLy96bV9tc2cyX21tKFpNX0xWXzAsICJlZXByb21IZWF2eUNsaXBGbGFnIiwgaHBQcml2LT5lZXByb21IZWF2eUNsaXBGbGFnKTsKKyAgICAgICAgI2lmIDAKKyAgICAgICAgaWYgKGhwUHJpdi0+aHdCQkhlYXZ5Q2xpcCkKKyAgICAgICAgeworICAgICAgICAgICAgem1fbXNnMF9tbShaTV9MVl8wLCAiZW5hYmxlIEJCIEhlYXZ5IENsaXAiKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHptX21zZzBfbW0oWk1fTFZfMCwgIk5vdCBlbmFibGUgQkIgSGVhdnkgQ2xpcCIpOworICAgICAgICB9CisgICAgICAgICNlbmRpZgorICAgICAgICB6bV9tc2cyX21tKFpNX0xWXzAsICJNQUMgcnNwWzFdPSIsIHJzcFsxXSk7CisgICAgICAgIHptX21zZzJfbW0oWk1fTFZfMCwgIk1BQyByc3BbMl09IiwgcnNwWzJdKTsKKworICAgICAgICBhZGRyWzBdID0gKHU4X3QpKHJzcFsxXSAmIDB4ZmYpOworICAgICAgICBhZGRyWzFdID0gKHU4X3QpKChyc3BbMV0+PjgpICYgMHhmZik7CisgICAgICAgIGFkZHJbMl0gPSAodThfdCkoKHJzcFsxXT4+MTYpICYgMHhmZik7CisgICAgICAgIGFkZHJbM10gPSAodThfdCkoKHJzcFsxXT4+MjQpICYgMHhmZik7CisgICAgICAgIGFkZHJbNF0gPSAodThfdCkocnNwWzJdICYgMHhmZik7CisgICAgICAgIGFkZHJbNV0gPSAodThfdCkoKHJzcFsyXT4+OCkgJiAweGZmKTsKKy8qI2lmZGVmIFpNX0ZCNTAKKyAgICAgICAgYWRkclswXSA9ICh1OF90KSgwICYgMHhmZik7CisgICAgICAgIGFkZHJbMV0gPSAodThfdCkoMyAmIDB4ZmYpOworICAgICAgICBhZGRyWzJdID0gKHU4X3QpKDEyNyAmIDB4ZmYpOworICAgICAgICBhZGRyWzNdID0gKHU4X3QpKDAgJiAweGZmKTsKKyAgICAgICAgYWRkcls0XSA9ICh1OF90KSg5ICYgMHhmZik7CisgICAgICAgIGFkZHJbNV0gPSAodThfdCkoMTEgJiAweGZmKTsKKyNlbmRpZiovCisKKyAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBaTV9NQUNfUkVHX01BQ19BRERSX0wsCisgICAgICAgICAgICAgICAgKCgoKHUzMl90KWFkZHJbM10pPDwyNCkgfCAoKCh1MzJfdClhZGRyWzJdKTw8MTYpIHwgKCgodTMyX3QpYWRkclsxXSk8PDgpIHwgYWRkclswXSkpOworICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIFpNX01BQ19SRUdfTUFDX0FERFJfSCwKKyAgICAgICAgICAgICAgICAoKCgodTMyX3QpYWRkcls1XSk8PDgpIHwgYWRkcls0XSkpOworICAgICAgICB6ZkZsdXNoRGVsYXlXcml0ZShkZXYpOworCisgICAgICAgIHdkLT5sZWRTdHJ1Y3QubGVkTW9kZVswXSA9ICh1MTZfdCkocnNwWzVdJjB4ZmZmZik7CisgICAgICAgIHdkLT5sZWRTdHJ1Y3QubGVkTW9kZVsxXSA9ICh1MTZfdCkocnNwWzVdPj4xNik7CisgICAgICAgIHptX21zZzJfbW0oWk1fTFZfMCwgImxlZE1vZGVbMF09Iiwgd2QtPmxlZFN0cnVjdC5sZWRNb2RlWzBdKTsKKyAgICAgICAgem1fbXNnMl9tbShaTV9MVl8wLCAibGVkTW9kZVsxXT0iLCB3ZC0+bGVkU3RydWN0LmxlZE1vZGVbMV0pOworCisgICAgICAgIC8qIFJlZ3VsYXRvcnkgUmVsYXRlZCBTZXR0aW5nICovCisgICAgICAgIHptX21zZzJfbW0oWk1fTFZfMCwgIlJlZ0RvbWFpbiByc3A9IiwgcnNwWzNdKTsKKyAgICAgICAgem1fbXNnMl9tbShaTV9MVl8wLCAiT3BGbGFncytFZXBNaXNjPSIsIHJzcFs0XSk7CisgICAgICAgIGhwUHJpdi0+T3BGbGFncyA9ICh1OF90KSgocnNwWzRdPj4xNikgJiAweGZmKTsKKyAgICAgICAgaWYgKChyc3BbMl0gPj4gMjQpID09IDB4MSkgLy9UeCBtYXNrID09IDB4MQorICAgICAgICB7CisgICAgICAgICAgICB6bV9tc2cwX21tKFpNX0xWXzAsICJPVFVTIDF4MiIpOworICAgICAgICAgICAgaHBQcml2LT5oYWxDYXBhYmlsaXR5IHw9IFpNX0hQX0NBUF8xMU5fT05FX1RYX1NUUkVBTTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHptX21zZzBfbW0oWk1fTFZfMCwgIk9UVVMgMngyIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGhwUHJpdi0+T3BGbGFncyAmIDB4MSkKKyAgICAgICAgeworICAgICAgICAgICAgaHBQcml2LT5oYWxDYXBhYmlsaXR5IHw9IFpNX0hQX0NBUF81RzsKKyAgICAgICAgfQorICAgICAgICBpZiAoaHBQcml2LT5PcEZsYWdzICYgMHgyKQorICAgICAgICB7CisgICAgICAgICAgICBocFByaXYtPmhhbENhcGFiaWxpdHkgfD0gWk1fSFBfQ0FQXzJHOworICAgICAgICB9CisKKworICAgICAgICBDQ1MgPSAodThfdCkoKHJzcFszXSAmIDB4ODAwMCkgPj4gMTUpOworICAgICAgICBXV1IgPSAodThfdCkoKHJzcFszXSAmIDB4NDAwMCkgPj4gMTQpOworICAgICAgICBDb3VudHJ5RG9tYWluQ29kZSA9ICh1MTZfdCkocnNwWzNdICYgMHgzRkZGKTsKKworICAgICAgICBpZiAocnNwWzNdICE9IDB4ZmZmZmZmZmYpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChDQ1MpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy96bV9kZWJ1Z19tc2cwKCJDV1kgLSBHZXQgUmVndWxhdGlvbiBUYWJsZSBmcm9tIENvdW50cnkgQ29kZSIpOworICAgICAgICAgICAgICAgIHpmSHBHZXRSZWd1bGF0aW9uVGFibGVmcm9tQ291bnRyeShkZXYsIENvdW50cnlEb21haW5Db2RlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvL3ptX2RlYnVnX21zZzAoIkNXWSAtIEdldCBSZWd1bGF0aW9uIFRhYmxlIGZyb20gUmVnIERvbWFpbiIpOworICAgICAgICAgICAgICAgIHpmSHBHZXRSZWd1bGF0aW9uVGFibGVmcm9tUmVnaW9uQ29kZShkZXYsIENvdW50cnlEb21haW5Db2RlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChXV1IpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy96bV9kZWJ1Z19tc2cwKCJDV1kgLSBFbmFibGUgODAyLjExZCIpOworICAgICAgICAgICAgICAgIC8qIGJlbG93IGxpbmUgc2hhbGwgYmUgdW5tYXJrZWQgYWZ0ZXIgQSBiYW5kIGlzIHJlYWR5ICovCisgICAgICAgICAgICAgICAgLy96ZmlXbGFuU2V0RG90MTFETW9kZShkZXYsIDEpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgemZIcEdldFJlZ3VsYXRpb25UYWJsZWZyb21SZWdpb25Db2RlKGRldiwgTk9fRU5VTVJEKTsKKyAgICAgICAgfQorCisgICAgICAgIHpmQ29yZU1hY0FkZHJlc3NOb3RpZnkoZGV2LCBhZGRyKTsKKworICAgIH0KKyAgICBlbHNlIGlmIChzcmMgPT0gWk1fRUVQUk9NX1JFQUQpCisgICAgeworI2lmIDAKKyAgICAgICAgdThfdCBhZGRyWzZdLCBDQ1MsIFdXUjsKKyAgICAgICAgdTE2X3QgQ291bnRyeURvbWFpbkNvZGU7CisjZW5kaWYKKyAgICAgICAgZm9yIChpPTA7IGk8Wk1fSEFMX01BWF9FRVBST01fUFJROyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChocFByaXYtPmVlcHJvbUltYWdlSW5kZXggPCAxMDI0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGhwUHJpdi0+ZWVwcm9tSW1hZ2VbaHBQcml2LT5lZXByb21JbWFnZUluZGV4KytdID0gcnNwW2krMV07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoaHBQcml2LT5lZXByb21JbWFnZUluZGV4ID09IChaTV9IQUxfTUFYX0VFUFJPTV9SRVEqWk1fSEFMX01BWF9FRVBST01fUFJRKSkKKyAgICAgICAgeworICAgICAgICAgICAgI2lmIDAKKyAgICAgICAgICAgIGZvciAoaT0wOyBpPDEwMjQ7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6bV9tc2cyX21tKFpNX0xWXzAsICJpbmRleD0iLCBpKTsKKyAgICAgICAgICAgICAgICB6bV9tc2cyX21tKFpNX0xWXzAsICJlZXByb21JbWFnZT0iLCBocFByaXYtPmVlcHJvbUltYWdlW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgem1fbXNnMl9tbShaTV9MVl8wLCAiTUFDIFsxXT0iLCBocFByaXYtPmVlcHJvbUltYWdlWzB4MjBjLzRdKTsKKyAgICAgICAgICAgIHptX21zZzJfbW0oWk1fTFZfMCwgIk1BQyBbMl09IiwgaHBQcml2LT5lZXByb21JbWFnZVsweDIxMC80XSk7CisjaWYgMAorICAgICAgICAgICAgYWRkclswXSA9ICh1OF90KShocFByaXYtPmVlcHJvbUltYWdlWzB4MjBjLzRdICYgMHhmZik7CisgICAgICAgICAgICBhZGRyWzFdID0gKHU4X3QpKChocFByaXYtPmVlcHJvbUltYWdlWzB4MjBjLzRdPj44KSAmIDB4ZmYpOworICAgICAgICAgICAgYWRkclsyXSA9ICh1OF90KSgoaHBQcml2LT5lZXByb21JbWFnZVsweDIwYy80XT4+MTYpICYgMHhmZik7CisgICAgICAgICAgICBhZGRyWzNdID0gKHU4X3QpKChocFByaXYtPmVlcHJvbUltYWdlWzB4MjBjLzRdPj4yNCkgJiAweGZmKTsKKyAgICAgICAgICAgIGFkZHJbNF0gPSAodThfdCkoaHBQcml2LT5lZXByb21JbWFnZVsweDIxMC80XSAmIDB4ZmYpOworICAgICAgICAgICAgYWRkcls1XSA9ICh1OF90KSgoaHBQcml2LT5lZXByb21JbWFnZVsweDIxMC80XT4+OCkgJiAweGZmKTsKKworICAgICAgICAgICAgemZDb3JlTWFjQWRkcmVzc05vdGlmeShkZXYsIGFkZHIpOworCisgICAgICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIFpNX01BQ19SRUdfTUFDX0FERFJfTCwKKyAgICAgICAgICAgICAgICAgICAgKCgoKHUzMl90KWFkZHJbM10pPDwyNCkgfCAoKCh1MzJfdClhZGRyWzJdKTw8MTYpIHwgKCgodTMyX3QpYWRkclsxXSk8PDgpIHwgYWRkclswXSkpOworICAgICAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBaTV9NQUNfUkVHX01BQ19BRERSX0gsCisgICAgICAgICAgICAgICAgICAgICgoKCh1MzJfdClhZGRyWzVdKTw8OCkgfCBhZGRyWzRdKSk7CisgICAgICAgICAgICB6ZkZsdXNoRGVsYXlXcml0ZShkZXYpOworCisgICAgICAgICAgICAvKiBSZWd1bGF0b3J5IFJlbGF0ZWQgU2V0dGluZyAqLworICAgICAgICAgICAgem1fbXNnMl9tbShaTV9MVl8wLCAiUmVnRG9tYWluID0iLCBocFByaXYtPmVlcHJvbUltYWdlWzB4MjA4LzRdKTsKKyAgICAgICAgICAgIENDUyA9ICh1OF90KSgoaHBQcml2LT5lZXByb21JbWFnZVsweDIwOC80XSAmIDB4ODAwMCkgPj4gMTUpOworICAgICAgICAgICAgV1dSID0gKHU4X3QpKChocFByaXYtPmVlcHJvbUltYWdlWzB4MjA4LzRdICYgMHg0MDAwKSA+PiAxNCk7CisgICAgICAgICAgICAvKiBiZWxvdyBsaW5lIHNoYWxsIGJlIHVubWFya2VkIGFmdGVyIEEgYmFuZCBpcyByZWFkeSAqLworICAgICAgICAgICAgLy9Db3VudHJ5RG9tYWluQ29kZSA9ICh1MTZfdCkoaHBQcml2LT5lZXByb21JbWFnZVsweDIwOC80XSAmIDB4M0ZGRik7CisgICAgICAgICAgICBDb3VudHJ5RG9tYWluQ29kZSA9IDg7CisgICAgICAgICAgICBpZiAoQ0NTKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vem1fZGVidWdfbXNnMCgiQ1dZIC0gR2V0IFJlZ3VsYXRpb24gVGFibGUgZnJvbSBDb3VudHJ5IENvZGUiKTsKKyAgICAgICAgICAgICAgICB6ZkhwR2V0UmVndWxhdGlvblRhYmxlZnJvbUNvdW50cnkoZGV2LCBDb3VudHJ5RG9tYWluQ29kZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy96bV9kZWJ1Z19tc2cwKCJDV1kgLSBHZXQgUmVndWxhdGlvbiBUYWJsZSBmcm9tIFJlZyBEb21haW4iKTsKKyAgICAgICAgICAgICAgICB6ZkhwR2V0UmVndWxhdGlvblRhYmxlZnJvbVJlZ2lvbkNvZGUoZGV2LCBDb3VudHJ5RG9tYWluQ29kZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoV1dSKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vem1fZGVidWdfbXNnMCgiQ1dZIC0gRW5hYmxlIDgwMi4xMWQiKTsKKyAgICAgICAgICAgICAgICAvKiBiZWxvdyBsaW5lIHNoYWxsIGJlIHVubWFya2VkIGFmdGVyIEEgYmFuZCBpcyByZWFkeSAqLworICAgICAgICAgICAgICAgIC8vemZpV2xhblNldERvdDExRE1vZGUoZGV2LCAxKTsKKyAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgemZDb3JlSGFsSW5pdENvbXBsZXRlKGRldik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBocFByaXYtPmVlcHJvbUltYWdlUmRSZXErKzsKKyAgICAgICAgICAgIHpmSHBMb2FkRUVQUk9NRnJvbUZXKGRldik7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoc3JjID09IFpNX0VFUFJPTV9XUklURSkKKyAgICB7CisgICAgICAgIHpmd0RiZ1dyaXRlRWVwcm9tRG9uZShkZXYsIGNtZFsxXSwgY21kWzJdKTsKKyAgICB9CisgICAgZWxzZSBpZiAoc3JjID09IFpNX0FOSV9SRUFEKQorICAgIHsKKyAgICAgICAgdTMyX3QgY3ljbGVUaW1lLCBjdGxDbGVhcjsKKworICAgICAgICB6bV9tc2cyX21tKFpNX0xWXzAsICJBTkkgcnNwWzFdPSIsIHJzcFsxXSk7CisgICAgICAgIHptX21zZzJfbW0oWk1fTFZfMCwgIkFOSSByc3BbMl09IiwgcnNwWzJdKTsKKyAgICAgICAgem1fbXNnMl9tbShaTV9MVl8wLCAiQU5JIHJzcFszXT0iLCByc3BbM10pOworICAgICAgICB6bV9tc2cyX21tKFpNX0xWXzAsICJBTkkgcnNwWzRdPSIsIHJzcFs0XSk7CisKKyAgICAgICAgaHBQcml2LT5jdGxCdXN5ICs9IHJzcFsxXTsKKyAgICAgICAgaHBQcml2LT5leHRCdXN5ICs9IHJzcFsyXTsKKworICAgICAgICBjeWNsZVRpbWUgPSAxMDAwMDA7IC8vMTAwIG1pbmlzZWNvbmRzCisKKyAgICAgICAgaWYgKGN5Y2xlVGltZSA+IHJzcFsxXSkKKyAgICAgICAgeworICAgICAgICAgICAgY3RsQ2xlYXIgPSAoY3ljbGVUaW1lIC0gcnNwWzFdKSAvIDEwMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGN0bENsZWFyID0gMDsKKyAgICAgICAgfQorICAgICAgICBpZiAod2QtPmFuaUVuYWJsZSkKKyAgICAgICAgICAgIHpmSHBBbmlBclBvbGwoZGV2LCBjdGxDbGVhciwgcnNwWzNdLCByc3BbNF0pOworICAgIH0KKyAgICBlbHNlIGlmIChzcmMgPT0gWk1fQ01EX0VDSE8pCisgICAgeworICAgICAgICBpZiAoICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+aGFsUmVJbml0ICkKKyAgICAgICAgeworICAgICAgICAgICAgemZDb3JlSGFsSW5pdENvbXBsZXRlKGRldik7CisgICAgICAgICAgICAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmhhbFJlSW5pdCA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB6ZkhwTG9hZEVFUFJPTUZyb21GVyhkZXYpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKHNyYyA9PSBaTV9PSURfRldfRExfSU5JVCkKKyAgICB7CisgICAgICAgIHpmd0RiZ0Rvd25sb2FkRndJbml0RG9uZShkZXYpOworICAgIH0KKyAgICByZXR1cm47Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmV3JpdGVSZWdJbnRlcm5hbFJlZyAgICAgICAqLworLyogICAgICBXcml0ZSBvbiBjaGlwIGludGVybmFsIHJlZ2lzdGVyIGltbWVkaWF0ZWx5LiAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYWRkciA6IHJlZ2lzdGVyIGFkZHJlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIHZhbCA6IHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIDAgOiBzdWNjZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBvdGhlciA6IGZhaWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBTdGVwaGVuIENoZW4gICAgICAgIFp5REFTIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24gICAgMjAwNS4xMSAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyX3QgemZXcml0ZVJlZ0ludGVybmFsUmVnKHpkZXZfdCogZGV2LCB1MzJfdCBhZGRyLCB1MzJfdCB2YWwpCit7CisgICAgdTMyX3QgY21kWzNdOworICAgIHUxNl90IHJldDsKKworICAgIGNtZFswXSA9IDB4MDAwMDAxMDg7CisgICAgY21kWzFdID0gYWRkcjsKKyAgICBjbWRbMl0gPSB2YWw7CisKKyAgICByZXQgPSB6Zklzc3VlQ21kKGRldiwgY21kLCAxMiwgWk1fT0lEX0lOVEVSTkFMX1dSSVRFLCBOVUxMKTsKKyAgICByZXR1cm4gcmV0OworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyAgICAgKi8KKy8qICAgICAgV3JpdGUgb24gY2hpcCBpbnRlcm5hbCByZWdpc3Rlciwgd3JpdGUgb3BlcmF0aW9uIG1heSBiZSAgICAgICAgICovCisvKiAgICAgIHBvc3Rwb25lZCB0byBmb3JtIGEgbXVsdGlwbGUgd3JpdGUgY29tbWFuZC4gICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGRldiA6IGRldmljZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBhZGRyIDogcmVnaXN0ZXIgYWRkcmVzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgdmFsIDogdmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgMCA6IGNvbW1hbmQgYmVlbiBwb3N0cG9uZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIDEgOiBjb21tYW5kcyBiZWVuIGV4ZWN1dGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFN0ZXBoZW4gQ2hlbiAgICAgICAgWnlEQVMgVGVjaG5vbG9neSBDb3Jwb3JhdGlvbiAgICAyMDA1LjExICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MTZfdCB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyh6ZGV2X3QqIGRldiwgdTMyX3QgYWRkciwgdTMyX3QgdmFsKQoreworICAgIHUzMl90IGNtZFsoWk1fTUFYX0NNRF9TSVpFLzQpXTsKKyAgICB1MTZfdCBpOworICAgIHUxNl90IHJldDsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICBzdHJ1Y3QgenNIcFByaXYqIGhwUHJpdj13ZC0+aHBQcml2YXRlOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIC8qIGVudGVyIGNyaXRpY2FsIHNlY3Rpb24gKi8KKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgLyogU3RvcmUgY29tbWFuZCB0byBnbG9iYWwgYnVmZmVyICovCisgICAgaHBQcml2LT5jbWQuZGVsYXlXY21kQWRkcltocFByaXYtPmNtZC5kZWxheVdjbWRDb3VudF0gPSBhZGRyOworICAgIGhwUHJpdi0+Y21kLmRlbGF5V2NtZFZhbFtocFByaXYtPmNtZC5kZWxheVdjbWRDb3VudCsrXSA9IHZhbDsKKworICAgIC8qIElmIHBlbmRpbmcgY29tbWFuZCByZWFjaCBzaXplIGxpbWl0ICovCisgICAgaWYgKChocFByaXYtPmNtZC5kZWxheVdjbWRDb3VudCkgPj0gKChaTV9NQVhfQ01EX1NJWkUgLSA0KSA+PiAzKSkKKyAgICB7CisgICAgICAgIGNtZFswXSA9IDB4MDAwMDAxMDAgKyAoaHBQcml2LT5jbWQuZGVsYXlXY21kQ291bnQ8PDMpOworCisgICAgICAgIC8qIGNvcHkgY29tbWFuZCB0byBjbWQgYnVmZmVyICovCisgICAgICAgIGZvciAoaT0wOyBpPGhwUHJpdi0+Y21kLmRlbGF5V2NtZENvdW50OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGNtZFsxKyhpPDwxKV0gPSBocFByaXYtPmNtZC5kZWxheVdjbWRBZGRyW2ldOworICAgICAgICAgICAgY21kWzIrKGk8PDEpXSA9IGhwUHJpdi0+Y21kLmRlbGF5V2NtZFZhbFtpXTsKKyAgICAgICAgfQorICAgICAgICAvKiByZXNldCBwZW5kaW5nIGNvbW1hbmQgKi8KKyAgICAgICAgaHBQcml2LT5jbWQuZGVsYXlXY21kQ291bnQgPSAwOworCisgICAgICAgIC8qIGxlYXZlIGNyaXRpY2FsIHNlY3Rpb24gKi8KKyAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgICAgICAvKiBpc3N1ZSB3cml0ZSBjb21tYW5kICovCisgICAgICAgIHJldCA9IHpmSXNzdWVDbWQoZGV2LCBjbWQsIDQrKGk8PDMpLCBaTV9PSURfSU5URVJOQUxfV1JJVEUsIE5VTEwpOworCisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKiBsZWF2ZSBjcml0aWNhbCBzZWN0aW9uICovCisgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZkZsdXNoRGVsYXlXcml0ZSAgICAgICAgICAgKi8KKy8qICAgICAgRmx1c2ggcGVuZGluZyB3cml0ZSBjb21tYW5kLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgMCA6IG5vIHBlbmRpbmcgY29tbWFuZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIDEgOiBjb21tYW5kcyBiZWVuIGV4ZWN1dGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFN0ZXBoZW4gQ2hlbiAgICAgICAgWnlEQVMgVGVjaG5vbG9neSBDb3Jwb3JhdGlvbiAgICAyMDA1LjExICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MTZfdCB6ZkZsdXNoRGVsYXlXcml0ZSh6ZGV2X3QqIGRldikKK3sKKyAgICB1MzJfdCBjbWRbKFpNX01BWF9DTURfU0laRS80KV07CisgICAgdTE2X3QgaTsKKyAgICB1MTZfdCByZXQ7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworICAgIHN0cnVjdCB6c0hwUHJpdiogaHBQcml2PXdkLT5ocFByaXZhdGU7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgLyogZW50ZXIgY3JpdGljYWwgc2VjdGlvbiAqLworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICAvKiBJZiB0aGVyZSBpcyBwZW5kaW5nIGNvbW1hbmQgKi8KKyAgICBpZiAoaHBQcml2LT5jbWQuZGVsYXlXY21kQ291bnQgPiAwKQorICAgIHsKKyAgICAgICAgY21kWzBdID0gMHgwMDAwMDEwMCArIChocFByaXYtPmNtZC5kZWxheVdjbWRDb3VudDw8Myk7CisKKyAgICAgICAgLyogY29weSBjb21tYW5kIHRvIGNtZCBidWZmZXIgKi8KKyAgICAgICAgZm9yIChpPTA7IGk8aHBQcml2LT5jbWQuZGVsYXlXY21kQ291bnQ7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgY21kWzErKGk8PDEpXSA9IGhwUHJpdi0+Y21kLmRlbGF5V2NtZEFkZHJbaV07CisgICAgICAgICAgICBjbWRbMisoaTw8MSldID0gaHBQcml2LT5jbWQuZGVsYXlXY21kVmFsW2ldOworICAgICAgICB9CisgICAgICAgIC8qIHJlc2V0IHBlbmRpbmcgY29tbWFuZCAqLworICAgICAgICBocFByaXYtPmNtZC5kZWxheVdjbWRDb3VudCA9IDA7CisKKyAgICAgICAgLyogbGVhdmUgY3JpdGljYWwgc2VjdGlvbiAqLworICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgICAgIC8qIGlzc3VlIHdyaXRlIGNvbW1hbmQgKi8KKyAgICAgICAgcmV0ID0gemZJc3N1ZUNtZChkZXYsIGNtZCwgNCsoaTw8MyksIFpNX09JRF9JTlRFUk5BTF9XUklURSwgTlVMTCk7CisKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qIGxlYXZlIGNyaXRpY2FsIHNlY3Rpb24gKi8KKyAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgICAgICByZXR1cm4gMDsKKyAgICB9Cit9CisKKwordTMyX3QgemZpRGJnRGVsYXlXcml0ZVJlZyh6ZGV2X3QqIGRldiwgdTMyX3QgYWRkciwgdTMyX3QgdmFsKQoreworCXpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgYWRkciwgdmFsKTsKKwlyZXR1cm4gMDsKK30KKwordTMyX3QgemZpRGJnRmx1c2hEZWxheVdyaXRlKHpkZXZfdCogZGV2KQoreworCXpmRmx1c2hEZWxheVdyaXRlKGRldik7CisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZmlEYmdXcml0ZVJlZyAgICAgICAgICAgICAgKi8KKy8qICAgICAgV3JpdGUgcmVnaXN0ZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGFkZHIgOiByZWdpc3RlciBhZGRyZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICB2YWwgOiB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAwIDogc3VjY2VzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgb3RoZXIgOiBmYWlsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiBDaGVuICAgICAgICBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgIDIwMDUuMTAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UzMl90IHpmaURiZ1dyaXRlUmVnKHpkZXZfdCogZGV2LCB1MzJfdCBhZGRyLCB1MzJfdCB2YWwpCit7CisgICAgdTMyX3QgY21kWzNdOworICAgIHUxNl90IHJldDsKKworICAgIGNtZFswXSA9IDB4MDAwMDAxMDg7CisgICAgY21kWzFdID0gYWRkcjsKKyAgICBjbWRbMl0gPSB2YWw7CisKKyAgICByZXQgPSB6Zklzc3VlQ21kKGRldiwgY21kLCAxMiwgWk1fT0lEX1dSSVRFLCAwKTsKKyAgICByZXR1cm4gcmV0OworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmaURiZ1dyaXRlRmxhc2ggICAgICAgICAgICAqLworLyogICAgICBXcml0ZSBmbGFzaC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYWRkciA6IHJlZ2lzdGVyIGFkZHJlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIHZhbCA6IHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIDAgOiBzdWNjZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBvdGhlciA6IGZhaWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBZanN1bmcgICAgICAgIFp5REFTIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24gICAgMjAwNy4wMiAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyX3QgemZpRGJnV3JpdGVGbGFzaCh6ZGV2X3QqIGRldiwgdTMyX3QgYWRkciwgdTMyX3QgdmFsKQoreworICAgIHUzMl90IGNtZFszXTsKKyAgICB1MTZfdCByZXQ7CisKKyAgICAvL2NtZFswXSA9IDB4MDAwMEIwMDg7CisJLyogbGVuWzBdIDogdHlwZVsweEIwXSA6IHNlcVs/XSAqLworICAgIGNtZFswXSA9IDggfCAoWk1fQ01EX1dGTEFTSCA8PCA4KTsKKyAgICBjbWRbMV0gPSBhZGRyOworICAgIGNtZFsyXSA9IHZhbDsKKworICAgIHJldCA9IHpmSXNzdWVDbWQoZGV2LCBjbWQsIDEyLCBaTV9PSURfV1JJVEUsIDApOworICAgIHJldHVybiByZXQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZmlEYmdXcml0ZUVlcHJvbSAgICAgICAgICAgICovCisvKiAgICAgIFdyaXRlIEVFUFJPTS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYWRkciA6IHJlZ2lzdGVyIGFkZHJlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIHZhbCA6IHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIDAgOiBzdWNjZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBvdGhlciA6IGZhaWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBQYXVsICAgICAgICBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgIDIwMDcuMDYgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyX3QgemZpRGJnV3JpdGVFZXByb20oemRldl90KiBkZXYsIHUzMl90IGFkZHIsIHUzMl90IHZhbCkKK3sKKyAgICB1MzJfdCBjbWRbM107CisgICAgdTE2X3QgcmV0OworCisgICAgLy9jbWRbMF0gPSAweDAwMDBCMDA4OworCS8qIGxlblswXSA6IHR5cGVbMHhCMF0gOiBzZXFbP10gKi8KKyAgICBjbWRbMF0gPSA4IHwgKFpNX0NNRF9XUkVFUFJPTSA8PCA4KTsKKyAgICBjbWRbMV0gPSBhZGRyOworICAgIGNtZFsyXSA9IHZhbDsKKworICAgIHJldCA9IHpmSXNzdWVDbWQoZGV2LCBjbWQsIDEyLCBaTV9FRVBST01fV1JJVEUsIDApOworICAgIHJldHVybiByZXQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZmlEYmdCbG9ja1dyaXRlRWVwcm9tICAgICAgKi8KKy8qICAgICAgQmxvY2sgV3JpdGUgRWVwcm9tLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBwLnM6IG5vdyxpdCB3aWxsIHdyaXRlIDE2IGJ5dGVzIHJlZ2lzdGVyIGRhdGEgcGVyIGJsb2NrIChOPTQpICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYWRkciA6IHJlZ2lzdGVyIGFkZHJlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGJ1ZiA6IGlucHV0IGRhdGEgYnVmZmVyIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIDAgOiBzdWNjZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBvdGhlciA6IGZhaWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBQYXVsICAgICAgICBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgIDIwMDcuMDYgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLy8jZGVmaW5lIE4gICAgICAgYnVmbGVuLzQKKy8vI2RlZmluZSBTSVpFICAgICgyKk4rMSkKKwordTMyX3QgemZpRGJnQmxvY2tXcml0ZUVlcHJvbSh6ZGV2X3QqIGRldiwgdTMyX3QgYWRkciwgdTMyX3QqIGJ1ZikKK3sKKyAgICB1MzJfdCBjbWRbOV07ICAvLzJOKzEKKyAgICB1MTZfdCByZXQsaTsKKworICAgIC8vY21kWzBdID0gMHgwMDAwQjAwODsKKwkgIC8qIGxlblswXSA6IHR5cGVbMHhCMF0gOiBzZXFbP10gKi8KKworICAgIC8vY21kWzBdID0gKDgqTikgfCAoWk1fQ01EX1dGTEFTSCA8PCA4KTsKKyAgICBjbWRbMF0gPSAzMiB8IChaTV9DTURfV1JFRVBST00gPDwgOCk7ICAgIC8vOE4KKworICAgIGZvciAoaT0wOyBpPDQ7IGkrKykgICAvLyBpPE4KKyAgICB7CisgICAgICAgIGNtZFsoMippKSsxXSA9IGFkZHIrKDQqaSk7CisgICAgICAgIGNtZFsoMippKSsyXSA9ICooYnVmK2kpOworICAgIH0KKworICAgIHJldCA9IHpmSXNzdWVDbWQoZGV2LCBjbWQsIDM2LCBaTV9FRVBST01fV1JJVEUsIDApOyAgICAvLzhOKzQKKworICAgIC8vIGFkZGVkIGZvciBFRVBST01VcGRhdGUsIHdhaXQgYSBtb21lbnQgZm9yIHByZXZlbnQgY21kIHF1ZXVlIGZ1bGwhCisgICAgLy96ZndTbGVlcChkZXYsIDEpOworCisgICAgcmV0dXJuIHJldDsKK30KKworCisvKiB3cml0ZSBFRVBST00gd2l0aCB3cmxlbiA6IHdybGVuIG11c3QgYmUgNCpuICovCisvKiBjb21tYW5kIGZvcm1hdCA6IGNtZF9pbmZvKDQpICsgYWRkcig0KSArIGVlcHJvbSh3cmxlbikgKi8KK3UzMl90IHpmaURiZ0Jsb2NrV3JpdGVFZXByb21fdjIoemRldl90KiBkZXYsIHUzMl90IGFkZHIsIHUzMl90KiBidWYsIHUzMl90IHdybGVuKQoreworICAgIHUzMl90IGNtZFsxNl07CisgICAgdTE2X3QgcmV0LGk7CisKKwkgIC8qIGxlblswXSA6IHR5cGVbMHhCMF0gOiBzZXFbP10gKi8KKwkgIC8qIGxlbiA9IGFkZHIoNCkgKyBlZXByb21fYmxvY2sod3JsZW4pICovCisgICAgY21kWzBdID0gKHdybGVuKzQpIHwgKFpNX0NNRF9NRU1fV1JFRVBST00gPDwgOCk7CisgICAgY21kWzFdID0gYWRkcjsKKworICAgIGZvciAoaT0wOyBpPCh3cmxlbi80KTsgaSsrKSAgIC8vIGk8d3JsZW4vNAorICAgIHsKKyAgICAgICAgY21kWzIraV0gPSAqKGJ1ZitpKTsKKyAgICB9CisgICAgLyogY21kX2luZm8oNCkgKyBhZGRyKDQpICsgZWVwcm9tKHdybGVuKSAqLworICAgIHJldCA9IHpmSXNzdWVDbWQoZGV2LCBjbWQsICh1MTZfdCkod3JsZW4rOCksIFpNX0VFUFJPTV9XUklURSwgMCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZEYmdPcGVuRWVwcm9tICAgICAgICAgICAgKi8KKy8qICAgICAgT3BlbiBFRVBST00uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBQYXVsICAgICAgICAgICAgICAgIFp5REFTIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24gICAgMjAwNy4wNiAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB6ZkRiZ09wZW5FZXByb20oemRldl90KiBkZXYpCit7CisgICAgLy8gdW5sb2NrIEVFUFJPTQorICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxRDE0MDAsIDB4MTIzNDU2NzgpOworICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxRDE0MDQsIDB4NTVhYTAwZmYpOworICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxRDE0MDgsIDB4MTM1NzlhY2UpOworICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxRDE0MTQsIDB4MCk7CisgICAgemZGbHVzaERlbGF5V3JpdGUoZGV2KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmRGJnQ2xvc2VFZXByb20gICAgICAgICAgICAqLworLyogICAgICBDbG9zZSBFRVBST00uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBQYXVsICAgICAgICAgICAgICAgIFp5REFTIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24gICAgMjAwNy4wNSAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB6ZkRiZ0Nsb3NlRWVwcm9tKHpkZXZfdCogZGV2KQoreworICAgIC8vIGxvY2sgRUVQUk9NCisgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFEMTQwMCwgMHg4NzY1NDMyMSk7CisgICAgLy96ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIDB4MUQxNDA0LCAweGZmZmZmZmZmKTsKKyAgICAvL3pmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxRDE0MDgsIDB4ZmZmZmZmZmYpOworICAgIC8vemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFEMTQxNCwgMHgxMDApOworICAgIHpmRmx1c2hEZWxheVdyaXRlKGRldik7Cit9CisjaWYgMAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmaVNlcmlhbGx5V3JpdGVFZXByb20gICAgICAqLworLyogICAgICBXcml0ZSBFRVBST00gU2VyaWFsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYWRkciA6IHN0YXJ0IGFkZHJlc3Mgb2Ygd3JpdGluZyBFRVBST00gICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGJ1ZiA6IGlucHV0IGRhdGEgYnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBidWZsZW4gOiBzaXplIG9mIGlucHV0IGRhdGEgYnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgKGxlbmd0aCBvZiBkYXRhIHdyaXRlIGludG8gRUVQUk9NKSAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFBhdWwgICAgICAgICAgICAgICAgWnlEQVMgVGVjaG5vbG9neSBDb3Jwb3JhdGlvbiAgICAyMDA3LjA2ICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MzJfdCB6ZmlTZXJpYWxseVdyaXRlRWVwcm9tKHpkZXZfdCogZGV2LCB1MzJfdCBhZGRyLCB1MzJfdCogYnVmLCB1MzJfdCBidWZsZW4pCit7CisgICAgdTMyX3QgY291bnQ7CisgICAgdTE2X3QgaSxyZXQsYmxvY2tzaXplOworICAgIHU4X3QgIHRlbXBbMl07CisKKyAgICAvLyBwZXIgNCBieXRlcyA9IDEgY291bnQKKyAgICBjb3VudCA9IGJ1Zmxlbi80OworCisgICAgLy8gT3BlbiBFRVBST00KKyAgICB6ZkRiZ09wZW5FZXByb20oZGV2KTsKKworICAgIC8vIFdyaXRlIEVFUFJPTQorICAgIGZvciAoaT0wOyBpPGNvdW50OyBpKyspCisgICAgeworICAgICAgICBpZiAoemZ3V3JpdGVFZXByb20oZGV2LCAoYWRkcisoNCppKSksICooYnVmK2kpLCAwKSAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBVcGRhdGUgZmFpbGVkLCBDbG9zZSBFRVBST00KKyAgICAgICAgICAgIHptX2RlYnVnX21zZzAoInpmd1dyaXRlRWVwcm9tIGZhaWxlZCBcbiIpOworICAgICAgICAgICAgemZEYmdDbG9zZUVlcHJvbShkZXYpOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBDbG9zZSBFRVBST00KKyAgICB6ZkRiZ0Nsb3NlRWVwcm9tKGRldik7CisgICAgcmV0dXJuIDA7Cit9CisjZW5kaWYKKyNpZiAwCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZpU2VyaWFsbHlCbG9ja1dyaXRlRWVwcm9tICovCisvKiAgICAgICBCbG9jayBXcml0ZSBFRVBST00gU2VyaWFsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAoQmxvY2tXcml0ZTogcGVyIDE2Ynl0ZXMgd3JpdGUgRUVQUk9NIG9uY2UpICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYWRkciA6IHJlZ2lzdGVyIGFkZHJlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGJ1ZiA6IGlucHV0IGRhdGEgYnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBidWZsZW4gOiBhY2Nlc3MgZGF0YSBzaXplIG9mIGJ1ZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAwIDogc3VjY2VzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgb3RoZXIgOiBmYWlsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgUGF1bCAgICAgICAgICAgICAgICBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgIDIwMDcuMDUgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UzMl90IHpmaVNlcmlhbGx5QmxvY2tXcml0ZUVlcHJvbSh6ZGV2X3QqIGRldiwgdTMyX3QgYWRkciwgdTMyX3QqIGJ1ZiwgdTMyX3QgYnVmbGVuKQoreworICAgIHUzMl90IGNvdW50OworICAgIHUxNl90IGkscmV0LGJsb2Nrc2l6ZTsKKyAgICB1OF90ICB0ZW1wWzJdOworCisgICAgLy8gcGVyIDQgYnl0ZXMgPSAxIGNvdW50CisgICAgY291bnQgPSBidWZsZW4vNDsKKworICAgIC8vIE9wZW4gRUVQUk9NCisgICAgemZEYmdPcGVuRWVwcm9tKGRldik7CisKKyAgICAvLyBXcml0ZSBFRVBST00KKyAgICAvLyBFRVBST00gV3JpdGUgc3RhcnQgYWRkcmVzcyBmcm9tOiAweDEwMDAhPworICAgIC8vIHBlciAxNmJ5dGVzKE49NCkgYmxvY2sgd3JpdGUgRUVQUk9NIG9uY2UKKyAgICBmb3IgKGk9MDsgaTwoY291bnQvNCk7IGkrKykgICAvLyBjb3VudC9OCisgICAgeworICAgICAgICAvL3pmaURiZ0Jsb2NrV3JpdGVFZXByb20oZGV2LCAoYWRkcisoNCpOKmkpKSwgYnVmKyhOKmkpKTsKKyAgICAgICAgLy96ZmlEYmdCbG9ja1dyaXRlRWVwcm9tKGRldiwgKGFkZHIrKDE2KmkpKSwgYnVmKyg0KmkpKTsKKyAgICAgICAgaWYgKHpmd0Jsb2NrV3JpdGVFZXByb20oZGV2LCAoYWRkcisoMTYqaSkpLCBidWYrKDQqaSksIDApICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzAoInpmaURiZ0Jsb2NrV3JpdGVFZXByb20gZmFpbGVkIFxuIik7CisgICAgICAgICAgICAvLyBDbG9zZSBFRVBST00KKyAgICAgICAgICAgIHpmRGJnQ2xvc2VFZXByb20oZGV2KTsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gQ2xvc2UgRUVQUk9NCisgICAgemZEYmdDbG9zZUVlcHJvbShkZXYpOworICAgIHJldHVybiAwOworfQorI2VuZGlmCisjaWYgMAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmaURiZ0R1bXBFZXByb20gICAgICAgICAgICAqLworLyogICAgICBEdW1wIEVFUFJPTS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYWRkciA6IHN0YXJ0IGFkZHJlc3Mgb2YgZHVtcGluZyBFRVBST00gICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGRhdGFsZW4gOiAgbGVuZ3RoIG9mIGFjY2VzcyBFRVBST00gZGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGJ1ZiA6ICBwb2ludCBvZiBidWZmZXIsIHRoZSBidWZmZXIgc2F2ZWQgZHVtcCBkYXRhICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIDAgOiBzdWNjZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBvdGhlciA6IGZhaWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBQYXVsICAgICAgICAgICAgICAgIFp5REFTIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24gICAgMjAwNy4wNiAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyX3QgemZpRGJnRHVtcEVlcHJvbSh6ZGV2X3QqIGRldiwgdTMyX3QgYWRkciwgdTMyX3QgZGF0YWxlbiwgdTMyX3QqIGJ1ZikKK3sKKyAgICB1MzJfdCBjb3VudDsKKyAgICB1MTZfdCBpLHJldDsKKworICAgIGNvdW50ID0gZGF0YWxlbi80OworCisgICAgLy8gb3ZlciBFRVBST00gbGVuZ3RoCisgICAgaWYoZGF0YWxlbiA+IDB4MjAwMCkKKyAgICB7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIGZvcihpPTA7IGk8Y291bnQ7IGkrKykKKyAgICB7CisgICAgICAgIGJ1ZltpXSA9IHpmd1JlYWRFZXByb20oZGV2LCBhZGRyKyg0KmkpKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKyNlbmRpZgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmaURiZ1JlYWRSZWcgICAgICAgICAgICAgICAqLworLyogICAgICBSZWFkIHJlZ2lzdGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYWRkciA6IHJlZ2lzdGVyIGFkZHJlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgMCA6IHN1Y2Nlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIG90aGVyIDogZmFpbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFN0ZXBoZW4gQ2hlbiAgICAgICAgWnlEQVMgVGVjaG5vbG9neSBDb3Jwb3JhdGlvbiAgICAyMDA1LjEwICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MzJfdCB6ZmlEYmdSZWFkUmVnKHpkZXZfdCogZGV2LCB1MzJfdCBhZGRyKQoreworICAgIHUzMl90IGNtZFsyXTsKKyAgICB1MTZfdCByZXQ7CisKKyAgICBjbWRbMF0gPSAweDAwMDAwMDA0OworICAgIGNtZFsxXSA9IGFkZHI7CisKKyAgICByZXQgPSB6Zklzc3VlQ21kKGRldiwgY21kLCA4LCBaTV9PSURfUkVBRCwgMCk7CisgICAgcmV0dXJuIHJldDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZpRGJnUmVhZFRhbGx5ICAgICAgICAgICAgICovCisvKiAgICAgIFJlYWQgcmVnaXN0ZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGRldiA6IGRldmljZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIDAgOiBzdWNjZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBvdGhlciA6IGZhaWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBTdGVwaGVuIENoZW4gICAgICAgIFp5REFTIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24gICAgMjAwNS4xMCAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyX3QgemZpRGJnUmVhZFRhbGx5KHpkZXZfdCogZGV2KQoreworICAgIHUzMl90IGNtZFsxXTsKKyAgICB1MTZfdCByZXQ7CisJem13X2dldF93bGFuX2RldihkZXYpOworCisJaWYgKCAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmhhbFJlSW5pdCApCisJeworCSAgICByZXR1cm4gMTsKKwl9CisKKwkvKiBsZW5bMF0gOiB0eXBlWzB4ODFdIDogc2VxWz9dICovCisgICAgY21kWzBdID0gMCB8IChaTV9DTURfVEFMTFkgPDwgOCk7CisgICAgcmV0ID0gemZJc3N1ZUNtZChkZXYsIGNtZCwgNCwgWk1fT0lEX1RBTExZLCAwKTsKKworCS8qIGxlblswXSA6IHR5cGVbMHg4Ml0gOiBzZXFbP10gKi8KKyAgICBjbWRbMF0gPSAwIHwgKFpNX0NNRF9UQUxMWV9BUEQgPDwgOCk7CisgICAgcmV0ID0gemZJc3N1ZUNtZChkZXYsIGNtZCwgNCwgWk1fT0lEX1RBTExZX0FQRCwgMCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCisKK3UzMl90IHpmaURiZ1NldElGU3ludGhlc2l6ZXIoemRldl90KiBkZXYsIHUzMl90IHZhbHVlKQoreworICAgIHUzMl90IGNtZFsyXTsKKyAgICB1MTZfdCByZXQ7CisKKwkvKiBsZW5bNF0gOiB0eXBlWzB4MzJdIDogc2VxWz9dICovCisgICAgY21kWzBdID0gMHg0IHwgKFpNX09JRF9TWU5USCA8PCA4KTsKKyAgICBjbWRbMV0gPSB2YWx1ZTsKKworICAgIHJldCA9IHpmSXNzdWVDbWQoZGV2LCBjbWQsIDgsIFpNX09JRF9TWU5USCwgMCk7CisgICAgcmV0dXJuIHJldDsKK30KKwordTMyX3QgemZpRGJnUXVlcnlId1R4QnVzeSh6ZGV2X3QqIGRldikKK3sKKyAgICB1MzJfdCBjbWRbMV07CisgICAgdTE2X3QgcmV0OworCisJLyogbGVuWzRdIDogdHlwZVsweEMwXSA6IHNlcVs/XSAqLworCWNtZFswXSA9IDAgfCAoWk1fQ01EX0RLVFhfU1RBVFVTIDw8IDgpOworCisgICAgcmV0ID0gemZJc3N1ZUNtZChkZXYsIGNtZCwgNCwgWk1fT0lEX0RLVFhfU1RBVFVTLCAwKTsKKyAgICByZXR1cm4gcmV0OworfQorCisvL1BhdWwrKworI2lmIDAKK3UxNl90IHpmSHBCbG9ja0VyYXNlRmxhc2goemRldl90ICpkZXYsIHUzMl90IGFkZHIpCit7CisgICAgdTMyX3QgY21kWyhaTV9NQVhfQ01EX1NJWkUvNCldOworICAgIHUxNl90IHJldDsKKworICAgIGNtZFswXSA9IDB4MDAwMDAwMDQgfCAoWk1fQ01EX0ZMQVNIX0VSQVNFIDw8IDgpOworICAgIGNtZFsxXSA9IGFkZHI7CisKKyAgICByZXQgPSB6Zklzc3VlQ21kKGRldiwgY21kLCA4LCBaTV9PSURfSU5URVJOQUxfV1JJVEUsIE5VTEwpOworICAgIHJldHVybiByZXQ7Cit9CisjZW5kaWYKKworI2lmIDAKK3UxNl90IHpmaURiZ1Byb2dyYW1GbGFzaCh6ZGV2X3QgKmRldiwgdTMyX3Qgb2Zmc2V0LCB1MzJfdCBsZW4sIHUzMl90ICpkYXRhKQoreworICAgIHUzMl90IGNtZFsoWk1fTUFYX0NNRF9TSVpFLzQpXTsKKyAgICB1MTZfdCByZXQ7CisgICAgdTE2X3QgaTsKKworCisgICAgY21kWzBdID0gKFpNX0NNRF9GTEFTSF9QUk9HIDw8IDgpIHwgKChsZW4rOCkgJiAweGZmKTsKKyAgICBjbWRbMV0gPSBvZmZzZXQ7CisgICAgY21kWzJdID0gbGVuOworCisgICAgZm9yIChpID0gMDsgaSA8IChsZW4gPj4gMik7IGkrKykKKyAgICB7CisgICAgICAgICBjbWRbMytpXSA9IGRhdGFbaV07CisgICAgfQorCisgICAgcmV0ID0gemZJc3N1ZUNtZChkZXYsIGNtZCwgMTIsIFpNX09JRF9GTEFTSF9QUk9HUkFNLCBOVUxMKTsKKworICAgIHJldHVybiByZXQ7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmaURiZ0NoaXBFcmFzZUZsYXNoICAgICAgICAqLworLyogICAgICBDaGlwIEVyYXNlIEZsYXNoLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAwIDogc3VjY2VzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgb3RoZXIgOiBmYWlsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgUGF1bCAgICAgICAgICAgICAgICBBdGhlcm9zIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24gICAgMjAwNy4wOSAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UxNl90IHpmaURiZ0NoaXBFcmFzZUZsYXNoKHpkZXZfdCAqZGV2KQoreworICAgIHUzMl90IGNtZFsoWk1fTUFYX0NNRF9TSVpFLzQpXTsKKyAgICB1MTZfdCByZXQ7CisKKyAgICBjbWRbMF0gPSAweDAwMDAwMDAwIHwgKFpNX0NNRF9GTEFTSF9FUkFTRSA8PCA4KTsKKworICAgIHJldCA9IHpmSXNzdWVDbWQoZGV2LCBjbWQsIDQsIFpNX09JRF9JTlRFUk5BTF9XUklURSwgTlVMTCk7CisgICAgcmV0dXJuIHJldDsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZmlEYmdHZXRGbGFzaENoZWNrU3VtICAgICAgKi8KKy8qICAgICAgR2V0IEZsYXNoQ2hlY2tTdW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGFkZHIgOiBTdGFydCBhZGRyZXNzIG9mIGdldGNoa3N1bSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBsZW4gOiB0b3RhbCBsZW50aCBvZiBjYWxjdWxhdGUgZ2V0Y2hrc3VtICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAwIDogc3VjY2VzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgb3RoZXIgOiBmYWlsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgUGF1bCAgICAgICAgICAgICAgICBBdGhlcm9zIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24gICAgMjAwNy4wOCAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UzMl90IHpmaURiZ0dldEZsYXNoQ2hlY2tTdW0oemRldl90ICpkZXYsIHUzMl90IGFkZHIsIHUzMl90IGxlbikKK3sKKyAgICB1MzJfdCBjbWRbKFpNX01BWF9DTURfU0laRS80KV07CisgICAgdTMyX3QgcmV0OworCisgICAgY21kWzBdID0gMHgwMDAwMDAwOCB8IChaTV9DTURfRkxBU0hfQ0hLU1VNIDw8IDgpOworICAgIGNtZFsxXSA9IGFkZHI7CisgICAgY21kWzJdID0gbGVuOworCisgICAgcmV0ID0gemZJc3N1ZUNtZChkZXYsIGNtZCwgMTIsIFpNX09JRF9GTEFTSF9DSEtTVU0sIE5VTEwpOworCisgICAgcmV0dXJuIHJldDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmaURiZ1JlYWRGbGFzaCAgICAgICAgICAgICAqLworLyogICAgICBSZWFkIEZsYXNoLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYWRkciA6IFN0YXJ0IGFkZHJlc3Mgb2YgcmVhZCBmbGFzaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGxlbiA6IHRvdGFsIGxlbnRoIG9mIHJlYWQgZmxhc2ggZGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIDAgOiBzdWNjZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBvdGhlciA6IGZhaWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBQYXVsICAgICAgICAgICAgICAgIEF0aGVyb3MgVGVjaG5vbG9neSBDb3Jwb3JhdGlvbiAgICAyMDA3LjA5ICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyX3QgemZpRGJnUmVhZEZsYXNoKHpkZXZfdCAqZGV2LCB1MzJfdCBhZGRyLCB1MzJfdCBsZW4pCit7CisgICAgdTMyX3QgY21kWyhaTV9NQVhfQ01EX1NJWkUvNCldOworICAgIHUzMl90IHJldDsKKworICAgIGNtZFswXSA9IGxlbiB8IChaTV9DTURfRkxBU0hfUkVBRCA8PCA4KTsKKyAgICBjbWRbMV0gPSBhZGRyOworCisgICAgcmV0ID0gemZJc3N1ZUNtZChkZXYsIGNtZCwgOCwgWk1fT0lEX0ZMQVNIX1JFQUQsIE5VTEwpOworICAgIHJldHVybiByZXQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZmlEb3dubG9hZEZ3U2V0ICAgICAgICAgICAgKi8KKy8qICAgICAgQmVmb3JlIERvd25sb2FkIEZXLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIENvbW1hbmQgRlcgdG8gU29mdHdhcmUgcmVzZXQgYW5kIGNsb3NlIHdhdGNoIGRvZyBjb250cm9sLiAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAwIDogc3VjY2VzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgb3RoZXIgOiBmYWlsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgUGF1bCAgICAgICAgICAgICAgICBBdGhlcm9zIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24gICAgMjAwNy4wOSAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UzMl90IHpmaURvd25sb2FkRndTZXQoemRldl90ICpkZXYpCit7CisvL3NvZnR3YXJlcmVzZXQKKy8vY2xvc2Ugd2F0Y2ggZG9nCisgICAgdTMyX3QgY21kWyhaTV9NQVhfQ01EX1NJWkUvNCldOworICAgIHUzMl90IHJldDsKKworICAgIGNtZFswXSA9IDB4MDAwMDAwMDggfCAoWk1fQ01EX0ZXX0RMX0lOSVQgPDwgOCk7CisKKyAgICByZXQgPSB6Zklzc3VlQ21kKGRldiwgY21kLCAxMiwgWk1fT0lEX0ZXX0RMX0lOSVQsIE5VTEwpOworCisgICAgcmV0dXJuIHJldDsKK30KKy8vUGF1bC0tCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb3R1cy9oYWwvaHB1c2IuYyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL2hhbC9ocHVzYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiNzZkZTkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy9oYWwvaHB1c2IuYwpAQCAtMCwwICsxLDE1ODQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNSBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBBdGhlcm9zIENvbW11bmljYXRpb25zIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2R1bGUgTmFtZSA6IHVkLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEFic3RyYWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgVGhpcyBtb2R1bGUgY29udGFpbnMgVVNCIGRlc2NyaXB0b3IgZnVuY3Rpb25zLiAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE5PVEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlICIuLi84MDIxMWNvcmUvY3ByZWNvbXAuaCIKKyNpbmNsdWRlICJocGFuaS5oIgorI2luY2x1ZGUgImhwdXNiLmgiCisKK2V4dGVybiB2b2lkIHpmd1VzYkNtZCh6ZGV2X3QqIGRldiwgdThfdCBlbmRwdCwgdTMyX3QqIGNtZCwgdTE2X3QgY21kTGVuKTsKKworZXh0ZXJuIHZvaWQgemZJZGxSc3AoemRldl90KiBkZXYsIHUzMl90KiByc3AsIHUxNl90IHJzcExlbik7CitleHRlcm4gdTE2X3QgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoemRldl90KiBkZXYsIHUzMl90IGFkZHIsIHUzMl90IHZhbCk7CitleHRlcm4gdTE2X3QgemZGbHVzaERlbGF5V3JpdGUoemRldl90KiBkZXYpOworCisKKyNkZWZpbmUgVVNCX0VORFBPSU5UX1RYX0lOREVYICAgMQorI2RlZmluZSBVU0JfRU5EUE9JTlRfUlhfSU5ERVggICAyCisjZGVmaW5lIFVTQl9FTkRQT0lOVF9JTlRfSU5ERVggIDMKKyNkZWZpbmUgVVNCX0VORFBPSU5UX0NNRF9JTkRFWCAgNAorCit2b2lkIHpmSWRsQ21kKHpkZXZfdCogZGV2LCB1MzJfdCogY21kLCB1MTZfdCBjbWRMZW4pCit7CisjaWYgWk1fU1dfTE9PUF9CQUNLICE9IDEKKyAgICB6ZndVc2JDbWQoZGV2LCBVU0JfRU5EUE9JTlRfQ01EX0lOREVYLCBjbWQsIGNtZExlbik7CisjZW5kaWYKKworICAgIHJldHVybjsKK30KKworCisvKiB6ZkFkanVzdEN0cmxTZXR0aW5nOiBmaXQgT1VUUyBmb3JtYXQgKi8KKy8qICAgICBjb252ZXJ0IE1JTU8yIHRvIE9VVFMgICAgICAgICAgICAgKi8KK3ZvaWQgemZBZGp1c3RDdHJsU2V0dGluZyh6ZGV2X3QqIGRldiwgdTE2X3QqIGhlYWRlciwgemJ1Zl90KiBidWYpCit7CisgICAgLyogTUlNTzIgPT4gT1VUUyBGQi01MCAqLworICAgIC8qIGxlbmd0aCBub3QgY2hhbmdlLCBvbmx5IG1vZGlmeSBmb3JtYXQgKi8KKworICAgIHUzMl90IG9sZE1UOworCXUzMl90IG9sZE1DUzsKKworICAgIHUzMl90IHBoeUN0cmw7CisgICAgdTMyX3Qgb2xkUGh5Q3RybDsKKworICAgIHUxNl90IHRwYyA9IDA7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisgICAgc3RydWN0IHpzSHBQcml2KiBocFByaXY9d2QtPmhwUHJpdmF0ZTsKKworICAgLyogbW0gKi8KKyAgICBpZiAoaGVhZGVyID09IE5VTEwpCisgICAgeworICAgICAgICBvbGRQaHlDdHJsID0gem13X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgNCkgfCAoKHUzMl90KXptd19idWZfcmVhZGgoZGV2LCBidWYsIDYpIDw8IDE2KTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgb2xkUGh5Q3RybCA9IGhlYWRlclsyXSB8ICgodTMyX3QpaGVhZGVyWzNdIDw8MTYpOworICAgIH0KKworCXBoeUN0cmwgPSAwOworCisKKwkvKiBNVCA6IEJpdFsxfjBdICovCisJb2xkTVQgPSBvbGRQaHlDdHJsJjB4MzsKKwlwaHlDdHJsIHw9IG9sZE1UOworICAgIGlmICggb2xkTVQgPT0gMHgzICkgICAvKiBETC1PRkRNIChEdXBsaWNhdGUgTGVnYWN5IE9GRE0pICovCisJCXBoeUN0cmwgfD0gMHgxOworCisKKwkvKiBQVCA6IEJpdFsyXSAgICBIVCBQVDogMCBNaXhlZCBtb2RlICAgIDEgR3JlZW4gZmllbGQgKi8KKwlwaHlDdHJsIHw9IChvbGRQaHlDdHJsJjB4NCk7CisKKwkvKiBCYW5kd2lkdGggY29udHJvbCA6IEJpdFs0fjNdICovCisJaWYgKCBvbGRQaHlDdHJsJjB4ODAwMDAwICkgICAgLyogQml0MjMgOiA0ME0gKi8KKwl7CisJCSNpZiAwCisJCWlmIChvbGRNVCA9PSAweDMpICAgICAgICAgICAgIC8qIERMLU9GRE0gKi8KKyAgICAgICAgICAgIHBoeUN0cmwgfD0gKDB4Mzw8Myk7ICAgLyogNDBNIGR1cGxpY2F0ZSAqLworCQllbHNlCisJCQlwaHlDdHJsIHw9ICgweDI8PDMpOyAgIC8qIDQwTSBzaGFyZWQgKi8KKwkJI2Vsc2UKKwkJaWYgKG9sZE1UID09IDB4MiAmJiAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmh3Qnc0MCkKKwkJeworCQkJcGh5Q3RybCB8PSAoMHgyPDwzKTsgICAvKiA0ME0gc2hhcmVkICovCisJCX0KKwkJI2VuZGlmCisJfQorCWVsc2UgeworICAgICAgICBvbGRQaHlDdHJsICY9IH4weDgwMDAwMDAwOworICAgIH0KKworCS8qIE1DUyA6IEJpdFsyNH4xOF0gKi8KKwlvbGRNQ1MgPSAob2xkUGh5Q3RybCYweDdmMDAwMCk+PjE2OyAgLyogQml0WzIyfjE2XSAqLworCXBoeUN0cmwgfD0gKG9sZE1DUzw8MTgpOworCisJLyogU2hvcnQgR0kgOiBCaXRbMzFdKi8KKyAgICBwaHlDdHJsIHw9IChvbGRQaHlDdHJsJjB4ODAwMDAwMDApOworCisJLyogQU0gOiBBbnRlbm5hIG1hc2sgKi8KKwkvL2lmICgob2xkTVQgPT0gMikgJiYgKG9sZE1DUyA+IDcpKQorCWlmIChocFByaXYtPmhhbENhcGFiaWxpdHkgJiBaTV9IUF9DQVBfMTFOX09ORV9UWF9TVFJFQU0pCisJeworCSAgICBwaHlDdHJsIHw9ICgweDE8PDE1KTsKKwl9CisJZWxzZQorCXsKKwkgICAgLyogSFQgICAgICAgICAgICAgICAgICAgICBUeCAyIGNoYWluICovCisJICAgIC8qIE9GRE0gNk0vOU0vMTJNLzE4TS8yNE0gVHggMiBjaGFpbiAqLworCSAgICAvKiBPRkRNIDM2TS80OE0vNTRNLyAgICAgIFR4IDEgY2hhaW4gKi8KKwkgICAgLyogQ0NLICAgICAgICAgICAgICAgICAgICBUeCAyIGNoYWluICovCisJICAgIGlmICgob2xkTVQgPT0gMikgfHwgKG9sZE1UID09IDMpKQorCSAgICB7CisJICAgICAgICBwaHlDdHJsIHw9ICgweDU8PDE1KTsKKwkgICAgfQorCSAgICBlbHNlIGlmIChvbGRNVCA9PSAxKQorCSAgICB7CisJICAgICAgICBpZiAoKG9sZE1DUyA9PSAweGIpIHx8IChvbGRNQ1MgPT0gMHhmKSB8fAorCSAgICAgICAgICAgIChvbGRNQ1MgPT0gMHhhKSB8fCAob2xkTUNTID09IDB4ZSkgfHwKKwkgICAgICAgICAgICAob2xkTUNTID09IDB4OSkpICAgICAgICAgICAgICAgICAgICAgICAvLzZNLzlNLzEyTS8xOE0vMjRNCisJICAgICAgICB7CisJICAgICAgICAgICAgcGh5Q3RybCB8PSAoMHg1PDwxNSk7CisJICAgICAgICB9CisJICAgICAgICBlbHNlCisJICAgICAgICB7CisJICAgICAgICAgICAgcGh5Q3RybCB8PSAoMHgxPDwxNSk7CisJICAgICAgICB9CisJICAgIH0KKwkgICAgZWxzZSAvLyhvbGRNVD09MCkKKwkgICAgeworCSAgICAgICAgcGh5Q3RybCB8PSAoMHg1PDwxNSk7CisJICAgIH0KKwl9CisJLy9lbHNlCisJLy8gICAgcGh5Q3RybCB8PSAoMHgxPDwxNSk7CisKKwkvKiBUUEMgKi8KKwkvKiBUT0RPIDogYWNjZWxlcmF0aW5nIHRoZXNlIGNvZGUgKi8KKwlpZiAoaHBQcml2LT5od0ZyZXF1ZW5jeSA8IDMwMDApCisJeworICAgICAgICBpZiAob2xkTVQgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgLyogQ0NLICovCisgICAgICAgICAgICB0cGMgPSAoaHBQcml2LT50UG93MnhDY2tbb2xkTUNTXSYweDNmKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChvbGRNVCA9PSAxKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBPRkRNICovCisgICAgICAgICAgICBpZiAob2xkTUNTID09IDB4YykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cGMgPSAoaHBQcml2LT50UG93MngyZ1szXSYweDNmKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKG9sZE1DUyA9PSAweDgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHBjID0gKGhwUHJpdi0+dFBvdzJ4MmdbMl0mMHgzZik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChvbGRNQ1MgPT0gMHhkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRwYyA9IChocFByaXYtPnRQb3cyeDJnWzFdJjB4M2YpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAob2xkTUNTID09IDB4OSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cGMgPSAoKGhwUHJpdi0+dFBvdzJ4MmdbMF0taHBQcml2LT50UG93MngyZzI0SGVhdnlDbGlwT2Zmc2V0KSYweDNmKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cGMgPSAoaHBQcml2LT50UG93MngyZ1swXSYweDNmKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChvbGRNVCA9PSAyKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIG9sZFBoeUN0cmwmMHg4MDAwMDAgKSAgICAvKiBCaXQyMyA6IDQwTSAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIEhUIDQwICovCisgICAgICAgICAgICAgICAgdHBjID0gKGhwUHJpdi0+dFBvdzJ4MmdIdDQwW29sZE1DUyYweDddJjB4M2YpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIEhUIDIwICovCisgICAgICAgICAgICAgICAgdHBjID0gKGhwUHJpdi0+dFBvdzJ4MmdIdDIwW29sZE1DUyYweDddJjB4M2YpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGVsc2UgIC8vNUdIegorICAgIHsKKyAgICAgICAgaWYgKG9sZE1UID09IDEpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIE9GRE0gKi8KKyAgICAgICAgICAgIGlmIChvbGRNQ1MgPT0gMHhjKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRwYyA9IChocFByaXYtPnRQb3cyeDVnWzNdJjB4M2YpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAob2xkTUNTID09IDB4OCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cGMgPSAoaHBQcml2LT50UG93Mng1Z1syXSYweDNmKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKG9sZE1DUyA9PSAweGQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHBjID0gKGhwUHJpdi0+dFBvdzJ4NWdbMV0mMHgzZik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHBjID0gKGhwUHJpdi0+dFBvdzJ4NWdbMF0mMHgzZik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAob2xkTVQgPT0gMikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCBvbGRQaHlDdHJsJjB4ODAwMDAwICkgICAgLyogQml0MjMgOiA0ME0gKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBIVCA0MCAqLworICAgICAgICAgICAgICAgIHRwYyA9IChocFByaXYtPnRQb3cyeDVnSHQ0MFtvbGRNQ1MmMHg3XSYweDNmKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBIVCAyMCAqLworICAgICAgICAgICAgICAgIHRwYyA9IChocFByaXYtPnRQb3cyeDVnSHQyMFtvbGRNQ1MmMHg3XSYweDNmKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIFR4IHBvd2VyIGFkanVzdCBmb3IgSFQ0MCAqLworCS8qIEhUNDAgICArMWRCbSAqLworCWlmICgob2xkTVQ9PTIpICYmIChvbGRQaHlDdHJsJjB4ODAwMDAwKSApCisJeworCSAgICB0cGMgKz0gMjsKKwl9CisJdHBjICY9IDB4M2Y7CisKKyAgICAvKiBFdmwgZm9yY2UgdHggVFBDICovCisgICAgaWYod2QtPmZvcmNlVHhUUEMpCisgICAgeworICAgICAgICB0cGMgPSAodTE2X3QpKHdkLT5mb3JjZVR4VFBDICYgMHgzZik7CisgICAgfQorCisgICAgaWYgKGhwUHJpdi0+aHdGcmVxdWVuY3kgPCAzMDAwKSB7CisgICAgICAgIHdkLT5tYXhUeFBvd2VyMiAmPSAweDNmOworICAgICAgICB0cGMgPSAodHBjID4gd2QtPm1heFR4UG93ZXIyKT8gd2QtPm1heFR4UG93ZXIyIDogdHBjOworICAgIH0gZWxzZSB7CisgICAgICAgIHdkLT5tYXhUeFBvd2VyNSAmPSAweDNmOworICAgICAgICB0cGMgPSAodHBjID4gd2QtPm1heFR4UG93ZXI1KT8gd2QtPm1heFR4UG93ZXI1IDogdHBjOworICAgIH0KKworCisjZGVmaW5lIFpNX01JTl9UUEMgICAgIDUKKyNkZWZpbmUgWk1fVFBDX09GRlNFVCAgNQorI2RlZmluZSBaTV9TSUdOQUxfVEhSRVNIT0xEICA1NgorICAgIGlmICgod2QtPnN0YS5iU2NoZWR1bGVTY2FuID09IEZBTFNFKSAmJiAod2QtPnN0YS5iQ2hhbm5lbFNjYW4gPT0gRkFMU0UpKQorICAgIHsKKyAgICAgICAgaWYgKCggd2QtPndsYW5Nb2RlID09IFpNX01PREVfSU5GUkFTVFJVQ1RVUkUgKQorICAgICAgICAgICAgICAgICYmICh6ZlN0YUlzQ29ubmVjdGVkKGRldikpCisgICAgICAgICAgICAgICAgJiYgKHdkLT5TaWduYWxTdHJlbmd0aCA+IFpNX1NJR05BTF9USFJFU0hPTEQpKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAodHBjID4gKChaTV9NSU5fVFBDK1pNX1RQQ19PRkZTRVQpKjIpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRwYyAtPSAoWk1fVFBDX09GRlNFVCoyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHRwYyA+IChaTV9NSU5fVFBDKjIpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRwYyA9IChaTV9NSU5fVFBDKjIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorI3VuZGVmIFpNX01JTl9UUEMKKyN1bmRlZiBaTV9UUENfT0ZGU0VUCisjdW5kZWYgWk1fU0lHTkFMX1RIUkVTSE9MRAorCisgICAgI2lmbmRlZiBaTV9PVFVTX0xJTlVYX1BIQVNFXzIKKyAgICBwaHlDdHJsIHw9ICh0cGMgJiAweDNmKSA8PCA5OworICAgICNlbmRpZgorCisgICAgLyogU2V0IGJpdHNbODo2XUJGLU1DUyBmb3IgaGVhdnkgY2xpcCAqLworICAgIGlmICgocGh5Q3RybCYweDMpID09IDIpCisJeworCSAgICBwaHlDdHJsIHw9ICgocGh5Q3RybCA+PiAxMikgJiAweDFjMCk7CisgICAgfQorCisJLyogUEhZIGNvbnRyb2wgKi8KKyAgICBpZiAoaGVhZGVyID09IE5VTEwpCisgICAgeworICAgICAgICB6bXdfYnVmX3dyaXRlaChkZXYsIGJ1ZiwgNCwgKHUxNl90KSAocGh5Q3RybCYweGZmZmYpKTsKKyAgICAgICAgem13X2J1Zl93cml0ZWgoZGV2LCBidWYsIDYsICh1MTZfdCkgKHBoeUN0cmw+PjE2KSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8vUEhZIGNvbnRyb2wgTAorICAgICAgICBoZWFkZXJbMl0gPSAodTE2X3QpIChwaHlDdHJsJjB4ZmZmZik7CisgICAgICAgIC8vUEhZIGNvbnRyb2wgSAorICAgICAgICBoZWFkZXJbM10gPSAodTE2X3QpIChwaHlDdHJsPj4xNik7CisgICAgfQorCisJem1fbXNnMl90eChaTV9MVl8yLCAib2xkIHBoeSBjdHJsID0gIiwgb2xkUGh5Q3RybCk7CisgICAgem1fbXNnMl90eChaTV9MVl8yLCAibmV3IHBoeSBjdHJsID0gIiwgcGh5Q3RybCk7CisJLy9EYmdQcmludCgib2xkIHBoeSBjdHJsID0lMDh4IFxuIiwgb2xkUGh5Q3RybCk7CisgICAgLy9EYmdQcmludCgibmV3IHBoeSBjdHJsID0lMDh4IFxuIiwgcGh5Q3RybCk7Cit9CisKKworI2RlZmluZSBFWFRSQV9JTkZPX0xFTiAgICAgIDI0ICAgIC8vUlNTSSg3KSArIEVWTSgxMikgKyBQSFkoMSkgKyBNQUNTdGF0dXMoNCkKK3UxNl90IHpmSHBTZW5kKHpkZXZfdCogZGV2LCB1MTZfdCogaGVhZGVyLCB1MTZfdCBoZWFkZXJMZW4sCisgICAgICAgICAgICAgICAgdTE2X3QqIHNuYXAsIHUxNl90IHNuYXBMZW4sCisgICAgICAgICAgICAgICAgdTE2X3QqIHRhaWwsIHUxNl90IHRhaWxMZW4sIHpidWZfdCogYnVmLCB1MTZfdCBvZmZzZXQsCisgICAgICAgICAgICAgICAgdTE2X3QgYnVmVHlwZSwgdThfdCBhYywgdThfdCBrZXlJZHgpCit7CisjaWYgWk1fU1dfTE9PUF9CQUNLID09IDEKKyAgICB6YnVmX3QgKnJ4YnVmOworICAgIHU4X3QgKnB1UnhCdWY7CisgICAgdThfdCAqcEhkcjsKKwkgICB1OF90ICpwc25hcDsKKwkgICB1MTZfdCBwbGNwbGVuID0gMTI7CisgICAgdTE2X3QgaTsKKyAgIAl1MTZfdCBzd2xwT2Zmc2V0OworI2VuZGlmIC8qICNpZiBaTV9TV19MT09QX0JBQ0sgPT0gMSAqLworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICBzdHJ1Y3QgenNIcFByaXYqIGhwUHJpdj13ZC0+aHBQcml2YXRlOworCisgICAgem1fbXNnMV90eChaTV9MVl8xLCAiemZIcFNlbmQoKSwgbGVuID0gIiwgMTIgKyBoZWFkZXJMZW4tOCArIHNuYXBMZW4gKyB6ZndCdWZHZXRTaXplKGRldiwgYnVmKSArIDQgKyA4KTsKKworCS8qIEFkanVzdCBjdHJsIHNldHRpbmcgOiA2TjE0IHlqc3VuZyAqLworICAgIHpmQWRqdXN0Q3RybFNldHRpbmcoZGV2LCBoZWFkZXIsIGJ1Zik7CisKKyNpZiBaTV9TV19MT09QX0JBQ0sgIT0gMQorICAgIGhwUHJpdi0+dXNiU2VuZEJ5dGVzICs9IHpmd0J1ZkdldFNpemUoZGV2LCBidWYpOworICAgIGhwUHJpdi0+dXNiQWNTZW5kQnl0ZXNbYWMmMHgzXSArPSB6ZndCdWZHZXRTaXplKGRldiwgYnVmKTsKKworICAgIC8qIFN1Ym1pdCBVU0IgT3V0IFVyYiAqLworICAgIHpmd1VzYlNlbmQoZGV2LCBVU0JfRU5EUE9JTlRfVFhfSU5ERVgsICh1OF90ICopaGVhZGVyLCBoZWFkZXJMZW4sCisgICAgICAgICAgICAgICAgICAodThfdCAqKXNuYXAsIHNuYXBMZW4sICh1OF90ICopdGFpbCwgdGFpbExlbiwgYnVmLCBvZmZzZXQpOworI2VuZGlmCisKKyNpZiBaTV9TV19MT09QX0JBQ0sgPT0gMQorCisgICAgcnhidWYgPSB6ZndCdWZBbGxvY2F0ZShkZXYsIHBsY3BsZW4gKyBoZWFkZXJMZW4tOCArIHNuYXBMZW4gKyAoemZ3QnVmR2V0U2l6ZShkZXYsIGJ1Ziktb2Zmc2V0KSArIDQgKyBFWFRSQV9JTkZPX0xFTik7CisgICAgcEhkciA9ICh1OF90ICopIGhlYWRlcis4OworICAgCXBzbmFwID0gKHU4X3QgKikgc25hcDsKKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgLyogc29mdHdhcmUgbG9vcCBiYWNrICovCisgICAgLyogQ29weSBXTEFOIGhlYWRlciBhbmQgcGFja2V0IGJ1ZmZlciAqLworICAgCXN3bHBPZmZzZXQgPSBwbGNwbGVuOworCisgICAgZm9yKGkgPSAwOyBpIDwgaGVhZGVyTGVuLTg7IGkrKykKKyAgICB7CisgICAgICAgIHptd19yeF9idWZfd3JpdGViKGRldiwgcnhidWYsIHN3bHBPZmZzZXQraSwgcEhkcltpXSk7CisgICAgfQorCisgICAJc3dscE9mZnNldCArPSBoZWFkZXJMZW4tODsKKworICAgIC8qIENvcHkgU05BUCBoZWFkZXIgKi8KKyAgICBmb3IoaSA9IDA7IGkgPCBzbmFwTGVuOyBpKyspCisgICAgeworCQkgICAgICB6bXdfcnhfYnVmX3dyaXRlYihkZXYsIHJ4YnVmLCBzd2xwT2Zmc2V0K2ksIHBzbmFwW2ldKTsKKyAgICB9CisKKwkgICBzd2xwT2Zmc2V0ICs9IHNuYXBMZW47CisKKyAgICAvKiBDb3B5IGJvZHkgZnJvbSB0eCBidWYgdG8gcnhidWYgKi8KKyAgICBmb3IoaSA9IDA7IGkgPCAoemZ3QnVmR2V0U2l6ZShkZXYsIGJ1Ziktb2Zmc2V0KTsgaSsrKQorICAgIHsKKyAgICAgICAgdThfdCB2YWx1ZSA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIGkrb2Zmc2V0KTsKKyAgICAgICAgem13X3J4X2J1Zl93cml0ZWIoZGV2LCByeGJ1Ziwgc3dscE9mZnNldCtpLCB2YWx1ZSk7CisgICAgfQorCisJICAgLyogdG90YWwgbGVuZ3RoID0gUExDUCArICAgICAgICAgTWFjSGVhZGVyICAgICAgICsgUGF5bG9hZCAgICsgRkNTICsgUlhzdGF0dXMgKi8KKwkgICAvKiAgICAgICAgICAgICAgICAgMTIgICsgIGhlYWRlckxlbi04ICArIHNuYXBMZW4gKyBidWYgbGVuZ3RoICsgNCAgKyA4ICAgICAgICAqLworICAgCXpmd1NldEJ1ZlNldFNpemUoZGV2LCByeGJ1Ziwgc3dscE9mZnNldCArICh6ZndCdWZHZXRTaXplKGRldiwgYnVmKS1vZmZzZXQpICsgNCArIEVYVFJBX0lORk9fTEVOICk7CisKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgemZ3QnVmRnJlZShkZXYsIGJ1ZiwgMCk7CisKKwkgICAvL3pmd0R1bXBCdWYoZGV2LCByeGJ1Zik7CisJICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAvL3pmQ29yZVJlY3YoZGV2LCByeGJ1Zik7CisKKyNlbmRpZiAvKiAjaWYgWk1fU1dfTE9PUF9CQUNLICovCisKKyAgICByZXR1cm4gWk1fU1VDQ0VTUzsKK30KKworLyogUmVwb3J0IG1vbml0ZXIgSGFsIHJ4IGluZm9ybWF0aW9uIGFib3V0IHJzc2ksIGV2bSwgYmFuZHdpZHRoLCBTRyBldGMgKi8KK3ZvaWQgemZIcFF1ZXJ5TW9uSGFsUnhJbmZvKHpkZXZfdCogZGV2LCB1OF90ICptb25IYWxSeEluZm8pCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworICAgIHpmTWVtb3J5Q29weShtb25IYWxSeEluZm8sCisgICAgICAgICAgICAgICAgKHU4X3QqKSYoKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5oYWxSeEluZm8pLAorICAgICAgICAgICAgICAgIHNpemVvZihzdHJ1Y3QgenNIYWxSeEluZm8pKTsKK30KKworCit1OF90IHpmSXNEYXRhRnJhbWUoemRldl90KiBkZXYsIHpidWZfdCogYnVmKQoreworICAgIHU4X3QgZnJhbWVUeXBlOworICAgIHU4X3QgbXBkdUluZDsKKworICAgIG1wZHVJbmQgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCB6ZndCdWZHZXRTaXplKGRldiwgYnVmKS0xKTsKKworICAgIC8qIHNpbmxnZSBvciBGaXJzdCAqLworICAgIGlmICgobXBkdUluZCAmIDB4MzApID09IDB4MDAgfHwgKG1wZHVJbmQgJiAweDMwKSA9PSAweDIwKQorICAgIHsKKyAgICAgICAgZnJhbWVUeXBlID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgMTIpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBmcmFtZVR5cGUgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCAwKTsKKyAgICB9CisKKyAgICBpZigoZnJhbWVUeXBlICYgMHhmKSA9PSBaTV9XTEFOX0RBVEFfRlJBTUUpCisgICAgICAgIHJldHVybiAxOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKK3UzMl90IHpmY0NvbnZlcnRSYXRlT0ZETSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpCit7CisgICAgLy8gV2hhdCdzIHRoZSBkZWZhdWx0IHZhbHVlPz8KKyAgICB1MzJfdCBNQ1MgPSAwOworCisgICAgc3dpdGNoKHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIDApJiAweGYpCisgICAgeworICAgICAgICBjYXNlIDB4YjoKKyAgICAgICAgICAgIE1DUyA9IDB4NDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDB4ZjoKKyAgICAgICAgICAgIE1DUyA9IDB4NTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDB4YToKKyAgICAgICAgICAgIE1DUyA9IDB4NjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDB4ZToKKyAgICAgICAgICAgIE1DUyA9IDB4NzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDB4OToKKyAgICAgICAgICAgIE1DUyA9IDB4ODsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDB4ZDoKKyAgICAgICAgICAgIE1DUyA9IDB4OTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDB4ODoKKyAgICAgICAgICAgIE1DUyA9IDB4YTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDB4YzoKKyAgICAgICAgICAgIE1DUyA9IDB4YjsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gTUNTOworfQorCit1MTZfdCB6ZkhwR2V0UGF5bG9hZExlbih6ZGV2X3QqIGRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHpidWZfdCogYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgdTE2X3QgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgdTE2X3QgcGxjcEhkckxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHUzMl90ICpyeE1ULAorICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3QgKnJ4TUNTLAorICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3QgKnJ4QlcsCisgICAgICAgICAgICAgICAgICAgICAgICB1MzJfdCAqcnhTRworICAgICAgICAgICAgICAgICAgICAgICAgKQoreworICAgIHU4X3QgbW9kdWxhdGlvbixtcGR1SW5kOworICAgIHUxNl90IGxvdywgaGlnaCwgbXNiOworICAgIHMxNl90IHBheWxvYWRMZW4gPSAwOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgbXBkdUluZCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIGxlbi0xKTsKKyAgICBtb2R1bGF0aW9uID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgKGxlbi0xKSkgJiAweDM7CisgICAgKnJ4TVQgPSBtb2R1bGF0aW9uOworCisgICAgLy96bV9kZWJ1Z19tc2cxKCIgbW9kdWxhdGlvbj0gIiwgbW9kdWxhdGlvbik7CisgICAgc3dpdGNoIChtb2R1bGF0aW9uKSB7CisgICAgY2FzZSAwOiAvKiBDQ0sgTW9kZSAqLworICAgICAgICBsb3cgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCAyKTsKKyAgICAgICAgaGlnaCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIDMpOworICAgICAgICBwYXlsb2FkTGVuID0gKGxvdyB8IGhpZ2ggPDwgOCkgLSA0OworICAgICAgICBpZiAod2QtPmVuYWJsZUhBTERiZ0luZm8pCisgICAgICAgIHsKKyAgICAgICAgICAgICpyeE1DUyA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIDApOworICAgICAgICAgICAgKnJ4QlcgID0gMDsKKyAgICAgICAgICAgICpyeFNHICA9IDA7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxOiAvKiBMZWdhY3ktT0ZETSBtb2RlICovCisgICAgICAgIGxvdyA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIDApID4+IDU7CisgICAgICAgIGhpZ2ggPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCAxKTsKKyAgICAgICAgbXNiID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgMikgJiAweDE7CisgICAgICAgIHBheWxvYWRMZW4gPSAobG93IHwgKGhpZ2ggPDwgMykgfCAobXNiIDw8IDExKSkgLSA0OworICAgICAgICBpZiAod2QtPmVuYWJsZUhBTERiZ0luZm8pCisgICAgICAgIHsKKyAgICAgICAgICAgICpyeE1DUyA9IHpmY0NvbnZlcnRSYXRlT0ZETShkZXYsIGJ1Zik7CisgICAgICAgICAgICAqcnhCVyAgPSAwOworICAgICAgICAgICAgKnJ4U0cgID0gMDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDI6IC8qIEhUIE9GRE0gbW9kZSAqLworICAgICAgICAvL3ptX2RlYnVnX21zZzEoImFnZ3JlZ2F0aW9uPSAiLCAoem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgNikgPj4gMykgJjB4MSApOworICAgICAgICBpZiAoKG1wZHVJbmQgJiAweDMwKSA9PSAweDAwIHx8IChtcGR1SW5kICYgMHgzMCkgPT0gMHgxMCkgICAgLy9zaW5nbGUgb3IgbGFzdCBtcGR1CisgICAgICAgICAgICBwYXlsb2FkTGVuID0gbGVuIC0gMjQgLSA0IC0gcGxjcEhkckxlbjsgIC8vIC0gcnhTdGF0dXMgLSBmY3MKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBwYXlsb2FkTGVuID0gbGVuIC0gNCAtIDQgLSBwbGNwSGRyTGVuOyAgLy8gLSByeFN0YXR1cyAtIGZjcworICAgICAgICAgICAgLy96bV9kZWJ1Z19tc2cxKCJmaXJzdCBvciBtaWRkbGUgbXBkdSwgcGxjcEhkckxlbj0gIiwgcGxjcEhkckxlbik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHdkLT5lbmFibGVIQUxEYmdJbmZvKQorICAgICAgICB7CisgICAgICAgICAgICAqcnhNQ1MgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCAzKSAmIDB4N2Y7CisgICAgICAgICAgICAqcnhCVyAgPSAoem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgMykgPj4gNykgJiAweDE7CisgICAgICAgICAgICAqcnhTRyAgPSAoem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgNikgPj4gNykgJiAweDE7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisKKyAgICB9CisgICAgLyogcmV0dXJuIHRoZSBwYXlsb2FkIGxlbmd0aCAtIEZDUyAqLworICAgIGlmIChwYXlsb2FkTGVuIDwgMCkgcGF5bG9hZExlbiA9IDA7CisgICAgcmV0dXJuIHBheWxvYWRMZW47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZmlVc2JSZWN2ICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgQ2FsbGJhY2sgZnVuY3Rpb24gZm9yIFVTQiBJTiBUcmFuc2Zlci4gICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2OiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgWXVhbi1HdSBXZWkgICAgICAgIFp5REFTIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24gICAgMjAwNS4xMCAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgWk1fSU5UX1VTRV9FUDIgICAgICAgICAgICAgICAgMQorI2RlZmluZSBaTV9JTlRfVVNFX0VQMl9IRUFERVJfU0laRSAgIDEyCisKKyNpZiBaTV9JTlRfVVNFX0VQMiA9PSAxCit2b2lkIHpmaVVzYlJlZ0luKHpkZXZfdCogZGV2LCB1MzJfdCogcnNwLCB1MTZfdCByc3BMZW4pOworI2VuZGlmCisKKyNpZmRlZiBaTV9PVFVTX1JYX1NUUkVBTV9NT0RFCit2b2lkIHpmaVVzYlJlY3ZQZXJQa3QoemRldl90ICpkZXYsIHpidWZfdCAqYnVmKQorI2Vsc2UKK3ZvaWQgemZpVXNiUmVjdih6ZGV2X3QgKmRldiwgemJ1Zl90ICpidWYpCisjZW5kaWYKK3sKKworCisjaWYgWk1fRldfTE9PUF9CQUNLICE9IDEKKyAgICB1OF90IG1wZHVJbmQ7CisgICAgdTE2X3QgcGxjcEhkckxlbjsKKyAgICB1MTZfdCBjcmNQbHVzUnhTdGF0dXNMZW47CisgICAgdTE2X3QgbGVuLCBwYXlsb2FkTGVuPTA7CisgICAgdTE2X3QgaTsgLy9DV1lhbmcoKykKKyAgICBzdHJ1Y3QgenNBZGRpdGlvbkluZm8gYWRkSW5mbzsKKyAgICB1MzJfdCAgICAgICAgICAgICAgIHJ4TVQ7CisgICAgdTMyX3QgICAgICAgICAgICAgICByeE1DUzsKKyAgICB1MzJfdCAgICAgICAgICAgICAgIHJ4Qlc7CisgICAgdTMyX3QgICAgICAgICAgICAgICByeFNHOworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICBzdHJ1Y3QgenNIcFByaXYqIGhwUHJpdj13ZC0+aHBQcml2YXRlOworCisgICAgLy96bV9tc2cwX3J4KFpNX0xWXzAsICJ6ZmlVc2JSZWN2KCkiKTsKKworI2lmIFpNX0lOVF9VU0VfRVAyID09IDEKKworICAgIGZvciAoaT0wOyBpPChaTV9JTlRfVVNFX0VQMl9IRUFERVJfU0laRT4+MSk7IGkrKykKKyAgICB7CisgICAgICAgIGlmICh6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCBpKjIpICE9IDB4ZmZmZikKKyAgICAgICAgCWJyZWFrOworICAgIH0KKworICAgIGlmIChpPT0oWk1fSU5UX1VTRV9FUDJfSEVBREVSX1NJWkU+PjEpKQorICAgIHsKKyAgICAgICAgdTMyX3QgICAgICAgICAgICAgICByc3BbWk1fVVNCX01BWF9FUElOVF9CVUZGRVIvNF07CisgICAgICAgIHUxNl90ICAgICAgICAgICAgICAgcnNwTGVuOworICAgICAgICB1MzJfdCAgICAgICAgICAgICAgIHJzcGk7CisgICAgICAgIHU4X3QqICAgICAgICAgICAgICAgcGRzdCA9ICh1OF90Kilyc3A7CisKKyAgICAgICAgLyogSW50ZXJydXB0IFJzcCAqLworICAgICAgICByc3BMZW4gPSAodTE2X3QpIHpmd0J1ZkdldFNpemUoZGV2LCBidWYpLVpNX0lOVF9VU0VfRVAyX0hFQURFUl9TSVpFOworCisgICAgICAgIGlmIChyc3BMZW4gPiA2MCkKKyAgICAgICAgeworICAgICAgICAgICAgem1fZGVidWdfbXNnMSgiR2V0IGVycm9yIGxlbiBieSBFUDIgPSBcbiIsIHJzcExlbik7CisgICAgICAgICAgICAvKiBmcmVlIFVTQiBidWYgKi8KKwkgICAgICAgICAgemZ3QnVmRnJlZShkZXYsIGJ1ZiwgMCk7CisJICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAocnNwaT0wOyByc3BpPHJzcExlbjsgcnNwaSsrKQorICAgICAgICB7CisgICAgICAgIAkqcGRzdCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIHJzcGkrWk1fSU5UX1VTRV9FUDJfSEVBREVSX1NJWkUpOworICAgICAgICAJcGRzdCsrOworICAgICAgICB9CisKKyAgICAgICAgLy9pZiAoYWRhcHRlci0+emZjYlVzYlJlZ0luKQorICAgICAgICAvLyAgICBhZGFwdGVyLT56ZmNiVXNiUmVnSW4oYWRhcHRlciwgcnNwLCByc3BMZW4pOworICAgICAgICB6ZmlVc2JSZWdJbihkZXYsIHJzcCwgcnNwTGVuKTsKKworCSAgICAgIC8qIGZyZWUgVVNCIGJ1ZiAqLworCSAgICAgIHpmd0J1ZkZyZWUoZGV2LCBidWYsIDApOworCSAgICAgIHJldHVybjsKKyAgICB9CisjZW5kaWYgLyogZW5kIG9mICNpZiBaTV9JTlRfVVNFX0VQMiA9PSAxICovCisKKyAgICBaTV9QRVJGT1JNQU5DRV9SWF9NUERVKGRldiwgYnVmKTsKKworICAgIGlmICh3ZC0+c3dTbmlmZmVyKQorICAgIHsKKyAgICAgICAgLyogYWlyb3BlZWs6IFJlcG9ydCBldmVyeXRoaW5nIHVwICovCisgICAgICAgIGlmICh3ZC0+emZjYlJlY3Y4MDIxMSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB3ZC0+emZjYlJlY3Y4MDIxMShkZXYsIGJ1ZiwgTlVMTCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBSZWFkIHRoZSBsYXN0IGJ5dGUgKi8KKyAgICBsZW4gPSB6ZndCdWZHZXRTaXplKGRldiwgYnVmKTsKKyAgICBtcGR1SW5kID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgbGVuLTEpOworCisgICAgLyogRmlyc3QgTVBEVSAqLworICAgIGlmKChtcGR1SW5kICYgMHgzMCkgPT0gMHgyMCkKKyAgICB7CisgICAgICAgIHUxNl90IGR1cmF0aW9uOworICAgICAgICBpZiAoem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgMzYpID09IDApIC8vQUMgPSBCRQorICAgICAgICB7CisgICAgICAgICAgICBkdXJhdGlvbiA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIDE0KTsKKyAgICAgICAgICAgIGlmIChkdXJhdGlvbiA+IGhwUHJpdi0+YWdnTWF4RHVyYXRpb25CRSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBocFByaXYtPmFnZ01heER1cmF0aW9uQkUgPSBkdXJhdGlvbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoaHBQcml2LT5hZ2dNYXhEdXJhdGlvbkJFID4gMTApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBocFByaXYtPmFnZ01heER1cmF0aW9uQkUtLTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvL0RiZ1ByaW50KCJhZ2dNYXhEdXJhdGlvbkJFPSVkIiwgaHBQcml2LT5hZ2dNYXhEdXJhdGlvbkJFKTsKKyAgICAgICAgfQorICAgIH0KKworI2lmIDEKKyAgICAvKiBGaXJzdCBNUERVIG9yIFNpbmdsZSBNUERVICovCisgICAgaWYoKChtcGR1SW5kICYgMHgzMCkgPT0gMHgwMCkgfHwgKChtcGR1SW5kICYgMHgzMCkgPT0gMHgyMCkpCisgICAgLy9pZiAoKG1wZHVJbmQgJiAweDEwKSA9PSAweDAwKQorICAgIHsKKyAgICAgICAgcGxjcEhkckxlbiA9IDEyOyAgICAgICAgLy8gUExDUCBoZWFkZXIgbGVuZ3RoCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmICh6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCA0KSA9PSB3ZC0+bWFjQWRkclswXSAmJgorICAgICAgICAgICAgem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgNikgPT0gd2QtPm1hY0FkZHJbMV0gJiYKKyAgICAgICAgICAgIHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIDgpID09IHdkLT5tYWNBZGRyWzJdKSB7CisgICAgICAgICAgICBwbGNwSGRyTGVuID0gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICh6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCAxNikgPT0gd2QtPm1hY0FkZHJbMF0gJiYKKyAgICAgICAgICAgICAgICAgem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMTgpID09IHdkLT5tYWNBZGRyWzFdICYmCisgICAgICAgICAgICAgICAgIHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIDIwKSA9PSB3ZC0+bWFjQWRkclsyXSl7CisgICAgICAgICAgICBwbGNwSGRyTGVuID0gMTI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBwbGNwSGRyTGVuID0gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIExhc3QgTVBEVSBvciBTaW5nbGUgTVBEVSAqLworICAgIGlmICgobXBkdUluZCAmIDB4MzApID09IDB4MDAgfHwgKG1wZHVJbmQgJiAweDMwKSA9PSAweDEwKQorICAgIHsKKyAgICAgICAgY3JjUGx1c1J4U3RhdHVzTGVuID0gRVhUUkFfSU5GT19MRU4gKyA0OyAgICAgLy8gRXh0cmEgYnl0ZXMgKyBGQ1MKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgY3JjUGx1c1J4U3RhdHVzTGVuID0gNCArIDQ7ICAgICAvLyBFeHRyYSA0IGJ5dGVzICsgRkNTCisgICAgfQorI2Vsc2UKKyAgICBwbGNwSGRyTGVuID0gMTI7CisgICAgY3JjUGx1c1J4U3RhdHVzTGVuID0gRVhUUkFfSU5GT19MRU4gKyA0OyAgICAgLy8gRXh0cmEgYnl0ZXMgKyBGQ1MKKyNlbmRpZgorCisgICAgaWYgKGxlbiA8IChwbGNwSGRyTGVuKzEwK2NyY1BsdXNSeFN0YXR1c0xlbikpCisgICAgeworICAgICAgICB6bV9tc2cxX3J4KFpNX0xWXzAsICJJbnZhbGlkIFJ4IGxlbmd0aD0iLCBsZW4pOworICAgICAgICAvL3pmd0R1bXBCdWYoZGV2LCBidWYpOworCisgICAgICAgIHpmd0J1ZkZyZWUoZGV2LCBidWYsIDApOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLyogZGlzcGxheSBSU1NJIGNvbWJpbmVkICovCisgICAgLyoKKyAgICAgKiCieqJ3oneid6J3oneid6J3oneid6J3oneid6J3onOid6J3oneid6J3oneid6J3onOid6J3oneid6J3oneic6J3oneid6J3oneid6Jzoneid6J3oneid6J3oneid6J3onOid6J3oneid6J3oneid6J3oneid6J3oneid6J7CisgICAgICogonggUExDUCBIZWFkZXIgonggIE1QRFUgIKJ4IFJTU0kgonggIEVWTSCieCBQSFkgRXJyIKJ4ICBNQUMgU3RhdHVzIKJ4CisgICAgICogonWid6J3oneid6J3oneid6J3oneid6J3oneid6Jxoneid6J3oneid6J3oneid6Jxoneid6J3oneid6J3onGid6J3oneid6J3oneicaJ3oneid6J3oneid6J3oneid6Jxoneid6J3oneid6J3oneid6J3oneid6J3oneidAorICAgICAqIKJ4ICAgICAxMiAgICAgIKJ4ICAgIG4gICCieCAgNyAgIKJ4ICAxMiAgonggICAgMSAgICCieCAgICAgIDQgICAgICCieAorICAgICAqIKJ8oneid6J3oneid6J3oneid6J3oneid6J3oneicqJ3oneid6J3oneid6J3oneicqJ3oneid6J3oneid6Jyoneid6J3oneid6J3onKid6J3oneid6J3oneid6J3oneicqJ3oneid6J3oneid6J3oneid6J3oneid6J3on0KKyAgICAgKglSU1NJIGZpbGVkIChGcm9tIEJCIGFuZCBNQUMganVzdCBwYXNzIHRoZW0gdG8gaG9zdCkKKyAgICAgKiAgIEJ5dGUxOiBSU1NJIGZvciBhbnRlbm5hIDAuCisgICAgICogICBCeXRlMjogUlNTSSBmb3IgYW50ZW5uYSAxLgorICAgICAqICAgQnl0ZTM6IFJTU0kgZm9yIGFudGVubmEgMi4KKyAgICAgKiAgIEJ5dGU0OiBSU1NJIGZvciBhbnRlbm5hIDAgZXh0ZW5zaW9uLgorICAgICAqICAgQnl0ZTU6IFJTU0kgZm9yIGFudGVubmEgMSBleHRlbnNpb24uCisgICAgICogICBCeXRlNjogUlNTSSBmb3IgYW50ZW5uYSAyIGV4dGVuc2lvbi4KKyAgICAgKiAgIEJ5dGU3OiBSU1NJIGZvciBhbnRlbm5hIGNvbWJpbmVkLgorICAgICAqLworCisgICAgLy96bV9kZWJ1Z19tc2cxKCIgcmVjdiBSU1NJID0gIiwgem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgKGxlbi0xKS0xNykpOworCisgICAgcGF5bG9hZExlbiA9IHpmSHBHZXRQYXlsb2FkTGVuKGRldiwgYnVmLCBsZW4sIHBsY3BIZHJMZW4sICZyeE1ULCAmcnhNQ1MsICZyeEJXLCAmcnhTRyk7CisKKyAgICAvKiBIYWwgUnggaW5mbyAqLworICAgIC8qIEZpcnN0IE1QRFUgb3IgU2luZ2xlIE1QRFUgKi8KKyAgICBpZigoKG1wZHVJbmQgJiAweDMwKSA9PSAweDAwKSB8fCAoKG1wZHVJbmQgJiAweDMwKSA9PSAweDIwKSkKKyAgICB7CisgICAgICAgIGlmICh3ZC0+ZW5hYmxlSEFMRGJnSW5mbyAmJiB6ZklzRGF0YUZyYW1lKGRldiwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5oYWxSeEluZm8uY3VycmVudFJ4RGF0YU1UICAgPSByeE1UOworICAgICAgICAgICAgKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5oYWxSeEluZm8uY3VycmVudFJ4RGF0YU1DUyAgPSByeE1DUzsKKyAgICAgICAgICAgICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+aGFsUnhJbmZvLmN1cnJlbnRSeERhdGFCVyAgID0gcnhCVzsKKyAgICAgICAgICAgICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+aGFsUnhJbmZvLmN1cnJlbnRSeERhdGFTRyAgID0gcnhTRzsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgocGxjcEhkckxlbiArIHBheWxvYWRMZW4pID4gbGVuKSB7CisgICAgICAgIHptX21zZzFfcngoWk1fTFZfMCwgIkludmFsaWQgcGF5bG9hZCBsZW5ndGg9IiwgcGF5bG9hZExlbik7CisgICAgICAgIHpmd0J1ZkZyZWUoZGV2LCBidWYsIDApOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy9TdG9yZSBSeCBUYWlsIEluZm9tYXRpb24gYmVmb3JlIFJlbW92ZS0tQ1dZYW5nKCspCisKKyNpZiAwCisgICAgZm9yIChpID0gMDsgaSA8IGNyY1BsdXNSeFN0YXR1c0xlbi00OyBpKyspCisgICAgeworICAgICAgIGFkZEluZm8uVGFpbC5CeXRlW2ldID0KKyAgICAgICAgICAgICAgIHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIGxlbiAtIGNyY1BsdXNSeFN0YXR1c0xlbiArIDQgKyBpKTsKKyAgICB9CisjZWxzZQorLyoKKyogQnJpZWYgZm9ybWF0IG9mIE9VVFMgY2hpcAorKiCieqJ3oneid6J3oneid6J3oneid6J3oneid6J3onOid6J3oneid6J3oneid6J3onOid6J3oneid6J3oneic6J3oneid6J3oneid6Jzoneid6J3oneid6J3oneid6J3onOid6J3oneid6J3oneid6J3oneid6J3oneid6J7CisqIKJ4IFBMQ1AgSGVhZGVyIKJ4ICBNUERVICCieCBSU1NJIKJ4ICBFVk0gonggUEhZIEVyciCieCAgTUFDIFN0YXR1cyCieAorKiCidaJ3oneid6J3oneid6J3oneid6J3oneid6J3onGid6J3oneid6J3oneid6J3onGid6J3oneid6J3oneicaJ3oneid6J3oneid6Jxoneid6J3oneid6J3oneid6J3onGid6J3oneid6J3oneid6J3oneid6J3oneid6J0CisqIKJ4ICAgICAxMiAgICAgIKJ4ICAgIG4gICCieCAgNyAgIKJ4ICAxMiAgonggICAgMSAgICCieCAgICAgIDQgICAgICCieAorKiCifKJ3oneid6J3oneid6J3oneid6J3oneid6J3onKid6J3oneid6J3oneid6J3onKid6J3oneid6J3oneicqJ3oneid6J3oneid6Jyoneid6J3oneid6J3oneid6J3onKid6J3oneid6J3oneid6J3oneid6J3oneid6J9CisqIFJTU0k6CisqICAgICAgIEJ5dGUgMSAgYW50ZW5uYSAwCisqICAgICAgIEJ5dGUgMiAgYW50ZW5uYSAxCisqICAgICAgIEJ5dGUgMyAgYW50ZW5uYSAyCisqICAgICAgIEJ5dGUgNCAgYW50ZW5uYSAwIGV4dGVuc2lvbgorKiAgICAgICBCeXRlIDUgIGFudGVubmEgMSBleHRlbnNpb24KKyogICAgICAgQnl0ZSA2ICBhbnRlbm5hIDIgZXh0ZW5zaW9uCisqICAgICAgIEJ5dGUgNyAgYW50ZW5uYSBjb21iaW5lZAorKiBFVk06CisqICAgICAgIEJ5dGUgMSAgU3RyZWFtIDAgcGlsb3QgMAorKiAgICAgICBCeXRlIDIgIFN0cmVhbSAwIHBpbG90IDEKKyogICAgICAgQnl0ZSAzICBTdHJlYW0gMCBwaWxvdCAyCisqICAgICAgIEJ5dGUgNCAgU3RyZWFtIDAgcGlsb3QgMworKiAgICAgICBCeXRlIDUgIFN0cmVhbSAwIHBpbG90IDQKKyogICAgICAgQnl0ZSA2ICBTdHJlYW0gMCBwaWxvdCA1CisqICAgICAgIEJ5dGUgNyAgU3RyZWFtIDEgcGlsb3QgMAorKiAgICAgICBCeXRlIDggIFN0cmVhbSAxIHBpbG90IDEKKyogICAgICAgQnl0ZSA5ICBTdHJlYW0gMSBwaWxvdCAyCisqICAgICAgIEJ5dGUgMTAgU3RyZWFtIDEgcGlsb3QgMworKiAgICAgICBCeXRlIDExIFN0cmVhbSAxIHBpbG90IDQKKyogICAgICAgQnl0ZSAxMiBTdHJlYW0gMSBwaWxvdCA1CisqLworCisgICAgLyogRmlsbCB0aGUgVGFpbCBpbmZvcm1hdGlvbiAqLworICAgIC8qIExhc3QgTVBEVSBvciBTaW5nbGUgTVBEVSAqLworICAgIGlmICgobXBkdUluZCAmIDB4MzApID09IDB4MDAgfHwgKG1wZHVJbmQgJiAweDMwKSA9PSAweDEwKQorICAgIHsKKyNkZWZpbmUgWk1fUlhfUlNTSV9DT01QRU5TQVRJT04gICAgIDI3CisgICAgICAgIHU4X3Qgem1fcnhfcnNzaV9jb21wZW5zYXRpb24gPSBaTV9SWF9SU1NJX0NPTVBFTlNBVElPTjsKKworICAgIAkvKiBSU1NJIGluZm9ybWF0aW9uICovCisgICAgICAgIGFkZEluZm8uVGFpbC5EYXRhLlNpZ25hbFN0cmVuZ3RoMSA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsCisgICAgICAgICAgICAgICAgKGxlbi0xKSAtIDE3KSArICgoaHBQcml2LT5yeFN0cm9uZ1JTU0kgPT0gMSk/em1fcnhfcnNzaV9jb21wZW5zYXRpb246MCk7CisjdW5kZWYgWk1fUlhfUlNTSV9DT01QRU5TQVRJT04KKworICAgICAgLyogRVZNICovCisKKyAgICAgIC8qIFRPRE86IGZvciBSRC9CQiBkZWJ1ZyBtZXNzYWdlICovCisgICAgICAvKiBzYXZlIGN1cnJlbnQgcnggaHcgaW5mb21yYXRpb24sIHJlcG9ydCB0byBEcnZDb3JlL0FwcGxpY2F0aW9uICovCisgICAgICBpZiAod2QtPmVuYWJsZUhBTERiZ0luZm8gJiYgemZJc0RhdGFGcmFtZShkZXYsIGJ1ZikpCisgICAgICB7CisgICAgICAgICAgICB1OF90IHRyc3NpOworICAgICAgICAgICAgZm9yIChpPTA7IGk8NzsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyc3NpID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgKGxlbi0xKSAtIDIzICsgaSk7CisJICAgICAgICAgICAgaWYgKHRyc3NpJjB4ODApCisJICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0cnNzaSA9ICgofigodThfdCl0cnNzaSkgJiAweDdmKSArIDEpICYgMHg3ZjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5oYWxSeEluZm8uY3VycmVudFJTU0lbaV0gPSB0cnNzaTsKKworICAgICAgICAgICAgfQorICAgICAgICAgIGlmIChyeE1UPT0yKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vaWYgKHJ4QlcpCisgICAgICAgICAgICAvL3sKKyAgICAgICAgICAgIAkgIGZvciAoaT0wOyBpPDEyOyBpKyspCisgICAgICAgICAgICAgICAgICAgICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+aGFsUnhJbmZvLmN1cnJlbnRSeEVWTVtpXSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCAobGVuLTEpIC0gMTYgKyBpKTsKKyAgICAgICAgICAgIC8vfQorICAgICAgICAgICAgLy9lbHNlCisgICAgICAgICAgICAvL3sKKyAgICAgICAgICAgIC8vCSAgZm9yIChpPTA7IGk8NDsgaSsrKQorICAgICAgICAgICAgLy8gICAgICAgICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+aGFsUnhJbmZvLmN1cnJlbnRSeEVWTVtpXSA9CisgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgIHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIChsZW4tMSkgLSAxNiArIGkpOworICAgICAgICAgICAgLy99CisgICAgICAgICAgfQorCisgICAgICAgICAgI2lmIDAKKyAgICAgICAgICAvKiBwcmludCAqLworICAgICAgICAgICAgem1fZGJnKCgiTVQoJWQpIE1DUyglZCkgQlcoJWQpIFNHKCVkKSBSU1NJOiVkLCVkLCVkLCVkLCVkLCVkLCVkIEVWTTooJWQsJWQsJWQsJWQsJWQsJWQpKCVkLCVkLCVkLCVkLCVkLCVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgcnhNVCwKKyAgICAgICAgICAgICAgICAgICAgICAgcnhNQ1MsCisgICAgICAgICAgICAgICAgICAgICAgIHJ4QlcsCisgICAgICAgICAgICAgICAgICAgICAgIHJ4U0csCisgICAgICAgICAgICAgICAgICAgICAgICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+aGFsUnhJbmZvLmN1cnJlbnRSU1NJWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmhhbFJ4SW5mby5jdXJyZW50UlNTSVsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5oYWxSeEluZm8uY3VycmVudFJTU0lbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+aGFsUnhJbmZvLmN1cnJlbnRSU1NJWzNdLAorICAgICAgICAgICAgICAgICAgICAgICAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmhhbFJ4SW5mby5jdXJyZW50UlNTSVs0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5oYWxSeEluZm8uY3VycmVudFJTU0lbNV0sCisgICAgICAgICAgICAgICAgICAgICAgICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+aGFsUnhJbmZvLmN1cnJlbnRSU1NJWzZdLAorICAgICAgICAgICAgICAgICAgICAgICAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmhhbFJ4SW5mby5jdXJyZW50UnhFVk1bMF0sCisgICAgICAgICAgICAgICAgICAgICAgICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+aGFsUnhJbmZvLmN1cnJlbnRSeEVWTVsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5oYWxSeEluZm8uY3VycmVudFJ4RVZNWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmhhbFJ4SW5mby5jdXJyZW50UnhFVk1bM10sCisgICAgICAgICAgICAgICAgICAgICAgICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+aGFsUnhJbmZvLmN1cnJlbnRSeEVWTVs0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5oYWxSeEluZm8uY3VycmVudFJ4RVZNWzVdLAorICAgICAgICAgICAgICAgICAgICAgICAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmhhbFJ4SW5mby5jdXJyZW50UnhFVk1bNl0sCisgICAgICAgICAgICAgICAgICAgICAgICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+aGFsUnhJbmZvLmN1cnJlbnRSeEVWTVs3XSwKKyAgICAgICAgICAgICAgICAgICAgICAgKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5oYWxSeEluZm8uY3VycmVudFJ4RVZNWzhdLAorICAgICAgICAgICAgICAgICAgICAgICAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmhhbFJ4SW5mby5jdXJyZW50UnhFVk1bOV0sCisgICAgICAgICAgICAgICAgICAgICAgICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+aGFsUnhJbmZvLmN1cnJlbnRSeEVWTVsxMF0sCisgICAgICAgICAgICAgICAgICAgICAgICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+aGFsUnhJbmZvLmN1cnJlbnRSeEVWTVsxMV0KKyAgICAgICAgICAgICAgICAgICAgICAgKSk7CisgICAgICAgICAgI2VuZGlmCisgICAgICB9IC8qIGlmICh3ZC0+ZW5hYmxlSEFMRGJnSW5mbyAmJiB6ZklzRGF0YUZyYW1lKGRldiwgYnVmKSkgKi8KKworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKiBNaWQgb3IgRmlyc3QgYWdncmVnYXRlIGZyYW1lIHdpdGhvdXQgcGh5IHJ4IGluZm9ybWF0aW9uICovCisgICAgICAgIGFkZEluZm8uVGFpbC5EYXRhLlNpZ25hbFN0cmVuZ3RoMSA9IDA7CisgICAgfQorCisgICAgYWRkSW5mby5UYWlsLkRhdGEuU2lnbmFsU3RyZW5ndGgyID0gMDsKKyAgICBhZGRJbmZvLlRhaWwuRGF0YS5TaWduYWxTdHJlbmd0aDMgPSAwOworICAgIGFkZEluZm8uVGFpbC5EYXRhLlNpZ25hbFF1YWxpdHkgICA9IDA7CisKKyAgICBhZGRJbmZvLlRhaWwuRGF0YS5TQUluZGV4ICAgICAgICAgICA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIGxlbiAtIDQpOworICAgIGFkZEluZm8uVGFpbC5EYXRhLkRBSW5kZXggICAgICAgICAgID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgbGVuIC0gMyk7CisgICAgYWRkSW5mby5UYWlsLkRhdGEuRXJyb3JJbmRpY2F0aW9uICAgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBsZW4gLSAyKTsKKyAgICBhZGRJbmZvLlRhaWwuRGF0YS5SeE1hY1N0YXR1cyAgICAgICA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIGxlbiAtIDEpOworCisjZW5kaWYKKyAgICAvKiBSZW1vdmUgQ1JDIGFuZCBSeCBTdGF0dXMgKi8KKyAgICB6ZndCdWZTZXRTaXplKGRldiwgYnVmLCAobGVuLWNyY1BsdXNSeFN0YXR1c0xlbikpOworICAgIC8vemZ3QnVmU2V0U2l6ZShkZXYsIGJ1ZiwgcGF5bG9hZExlbiArIHBsY3BIZHJMZW4pOyAgICAvKiBwYXlsb2FkTGVuICsgUExDUCAxMiAtIEZDUyA0Ki8KKworICAgIC8vU3RvcmUgUExDUCBIZWFkZXIgSW5mb21hdGlvbiBiZWZvcmUgUmVtb3ZlLS1DV1lhbmcoKykKKyAgICBpZiAocGxjcEhkckxlbiAhPSAwKQorICAgIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHBsY3BIZHJMZW47IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgYWRkSW5mby5QbGNwSGVhZGVyW2ldID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgaSk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYWRkSW5mby5QbGNwSGVhZGVyWzBdID0gMDsKKyAgICB9CisgICAgLyogUmVtb3ZlIFBMQ1AgaGVhZGVyICovCisgICAgemZ3QnVmUmVtb3ZlSGVhZChkZXYsIGJ1ZiwgcGxjcEhkckxlbik7CisKKyAgICAvKiBoYW5kbGUgODAyLjExIGZyYW1lICovCisgICAgemZDb3JlUmVjdihkZXYsIGJ1ZiwgJmFkZEluZm8pOworCisjZWxzZQorICAgIC8qIEZpcm13YXJlIGxvb3BiYWNrOiBSeCBmcmFtZSA9IFR4IGZyYW1lICAgICAgICovCisgICAgLyogY29udmVydCBSeCBmcmFtZSB0byBmaXQgcmVjZWl2ZSBmcmFtZSBmb3JtYXQgKi8KKyAgICB6YnVmX3QgKm5ld19idWY7CisgICAgdThfdCAgICBjdHJsX29mZnNldCA9IDg7CisgICAgdThfdCAgICBQTENQX0xlbiA9IDEyOworICAgIHU4X3QgICAgZGF0YTsKKyAgICB1OF90ICAgIGk7CisKKworICAgIC8qIFR4OiAgfCBjdHJsX3NldHRpbmcgfCBNYWMgaGRyIHwgZGF0YSB8ICovCisgICAgLyogICAgICAgICAgICA4ICAgICAgICAgICAgMjQgICAgICAgeCAgICAgKi8KKworICAgIC8qIFJ4OiAgICAgICAgICB8IFBMQ1AgfCBNYWMgaGRyIHwgZGF0YSB8IEZDUyB8IFJ4c3RhdHVzIHwgKi8KKyAgICAvKiAgICAgICAgICAgICAgICAgMTIgICAgICAyNCAgICAgICAgeCAgICAgNCAgICAgICA4ICAgICAgICovCisKKyAgICAvKiBuZXcgYWxsb2NhdGUgYSByeCBmb3JtYXQgc2l6ZSBidWYgKi8KKyAgICBuZXdfYnVmID0gemZ3QnVmQWxsb2NhdGUoZGV2LCB6ZndCdWZHZXRTaXplKGRldiwgYnVmKS04KzEyKzQrRVhUUkFfSU5GT19MRU4pOworCisgICAgZm9yIChpPTA7IGk8emZ3QnVmR2V0U2l6ZShkZXYsIGJ1ZiktY3RybF9vZmZzZXQ7IGkrKykKKyAgICB7CisgICAgICAgIGRhdGEgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBjdHJsX29mZnNldCtpKTsKKyAgICAgICAgem13X3J4X2J1Zl93cml0ZWIoZGV2LCBuZXdfYnVmLCBQTENQX0xlbitpLCBkYXRhKTsKKyAgICB9CisKKyAgICB6ZndCdWZTZXRTaXplKGRldiwgbmV3X2J1ZiwgemZ3QnVmR2V0U2l6ZShkZXYsIGJ1ZiktOCsxMis0K0VYVFJBX0lORk9fTEVOKTsKKworICAgIHpmd0J1ZkZyZWUoZGV2LCBidWYsIDApOworCisgICAgLyogcmVjZWl2ZSB0aGUgbmV3X2J1ZiAqLworICAgIC8vemZDb3JlUmVjdihkZXYsIG5ld19idWYpOworCisjZW5kaWYKKworfQorCisjaWZkZWYgWk1fT1RVU19SWF9TVFJFQU1fTU9ERQordm9pZCB6ZmlVc2JSZWN2KHpkZXZfdCAqZGV2LCB6YnVmX3QgKmJ1ZikKK3sKKyAgICB1MTZfdCBpbmRleCA9IDA7CisgICAgdTE2X3QgY2hrSWR4OworICAgIHUzMl90IHN0YXR1cyA9IDA7CisgICAgdTE2X3QgaWk7CisgICAgemJ1Zl90ICpuZXdCdWY7CisgICAgemJ1Zl90ICpyeEJ1ZlBvb2xbOF07CisgICAgdTE2X3QgcnhCdWZQb29sSW5kZXggPSAwOworICAgIHN0cnVjdCB6c0hwUHJpdiAqaGFsUHJpdjsKKyAgICB1OF90ICpzcmNCdWZQdHI7CisgICAgdTMyX3QgYnVmZmVyTGVuZ3RoOworICAgIHUxNl90IHVzYlJ4UmVtYWluTGVuOworICAgIHUxNl90IHVzYlJ4UGt0TGVuOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgaGFsUHJpdiA9IChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGU7CisgICAgc3JjQnVmUHRyID0gem13X2J1Zl9nZXRfYnVmZmVyKGRldiwgYnVmKTsKKworICAgIGJ1ZmZlckxlbmd0aCA9IHpmd0J1ZkdldFNpemUoZGV2LCBidWYpOworCisgICAgLyogWmVybyBMZW5ndGggVHJhbnNmZXIgKi8KKyAgICBpZiAoIWJ1ZmZlckxlbmd0aCkKKyAgICB7CisgICAgICAgIHpmd0J1ZkZyZWUoZGV2LCBidWYsIDApOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgdXNiUnhSZW1haW5MZW4gPSBoYWxQcml2LT51c2JSeFJlbWFpbkxlbjsKKyAgICB1c2JSeFBrdExlbiA9IGhhbFByaXYtPnVzYlJ4VHJhbnNmZXJMZW47CisKKyAgICAvKiBDaGVjayB3aGV0aGVyIHRoZXJlIGlzIGFueSBkYXRhIGluIHRoZSBsYXN0IHRyYW5zZmVyICovCisgICAgaWYgKHVzYlJ4UmVtYWluTGVuICE9IDAgKQorICAgIHsKKyAgICAgICAgemJ1Zl90ICpyZW1haW5CdWZQdHIgPSBoYWxQcml2LT5yZW1haW5CdWY7CisgICAgICAgIHU4X3QqIEJ1ZlB0ciA9IE5VTEw7CisKKyAgICAgICAgaWYgKCByZW1haW5CdWZQdHIgIT0gTlVMTCApCisgICAgICAgIHsKKyAgICAgICAgICAgIEJ1ZlB0ciA9IHptd19idWZfZ2V0X2J1ZmZlcihkZXYsIHJlbWFpbkJ1ZlB0cik7CisgICAgICAgIH0KKworICAgICAgICBpbmRleCA9IHVzYlJ4UmVtYWluTGVuOworICAgICAgICB1c2JSeFJlbWFpbkxlbiAtPSBoYWxQcml2LT51c2JSeFBhZExlbjsKKworICAgICAgICAvKiAgQ29weSBkYXRhICovCisgICAgICAgIGlmICggQnVmUHRyICE9IE5VTEwgKQorICAgICAgICB7CisgICAgICAgICAgICB6ZndNZW1vcnlDb3B5KCYoQnVmUHRyW3VzYlJ4UGt0TGVuXSksIHNyY0J1ZlB0ciwgdXNiUnhSZW1haW5MZW4pOworICAgICAgICB9CisKKyAgICAgICAgdXNiUnhQa3RMZW4gKz0gdXNiUnhSZW1haW5MZW47CisgICAgICAgIGhhbFByaXYtPnVzYlJ4UmVtYWluTGVuID0gMDsKKworICAgICAgICBpZiAoIHJlbWFpbkJ1ZlB0ciAhPSBOVUxMICkKKyAgICAgICAgeworICAgICAgICAgICAgemZ3QnVmU2V0U2l6ZShkZXYsIHJlbWFpbkJ1ZlB0ciwgdXNiUnhQa3RMZW4pOworICAgICAgICAgICAgcnhCdWZQb29sW3J4QnVmUG9vbEluZGV4KytdID0gcmVtYWluQnVmUHRyOworICAgICAgICB9CisgICAgICAgIGhhbFByaXYtPnJlbWFpbkJ1ZiA9IE5VTEw7CisgICAgfQorCisgICAgLy96bV9kZWJ1Z19tc2cxKCJsZW5ndGg6ICVkXG4iLCAoaW50KXBVc2JSeFRyYW5zZmVyLT5wUnhVcmItPlVyYkJ1bGtPckludGVycnVwdFRyYW5zZmVyLlRyYW5zZmVyQnVmZmVyTGVuZ3RoKTsKKworICAgIGJ1ZmZlckxlbmd0aCA9IHpmd0J1ZkdldFNpemUoZGV2LCBidWYpOworLy9wcmludGsoImJ1ZmZlckxlbmd0aCAlZFxuIiwgYnVmZmVyTGVuZ3RoKTsKKyAgICB3aGlsZShpbmRleCA8IGJ1ZmZlckxlbmd0aCkKKyAgICB7CisgICAgICAgIHUxNl90IHBrdExlbjsKKyAgICAgICAgdTE2X3QgcGt0VGFnOworICAgICAgICAvL3U4X3QgKnB0ciA9ICh1OF90KikoKHN0cnVjdCB6c0J1ZmZlciopcFVzYlJ4VHJhbnNmZXItPmJ1ZiktPmRhdGE7CisgICAgICAgIHU4X3QgKnB0ciA9IHNyY0J1ZlB0cjsKKworICAgICAgICAvKiBSZXRyaWV2ZSBwYWNrZXQgbGVuZ3RoIGFuZCB0YWcgKi8KKyAgICAgICAgcGt0TGVuID0gcHRyW2luZGV4XSArIChwdHJbaW5kZXgrMV0gPDwgOCk7CisgICAgICAgIHBrdFRhZyA9IHB0cltpbmRleCsyXSArIChwdHJbaW5kZXgrM10gPDwgOCk7CisKKyAgICAgICAgaWYgKHBrdFRhZyA9PSBaTV9VU0JfU1RSRUFNX01PREVfVEFHKQorICAgICAgICB7CisgICAgICAgICAgICB1MTZfdCBwYWRMZW47CisKKyAgICAgICAgICAgIHptX2Fzc2VydChwa3RMZW4gPCBaTV9XTEFOX01BWF9SWF9TSVpFKTsKKworICAgICAgICAgICAgLy9wcmludGsoIkdldCBhIHBhY2tldCwgcGt0TGVuOiAweCUwNHhcbiIsIHBrdExlbik7CisgICAgICAgICAgICAjaWYgMAorICAgICAgICAgICAgLyogRHVtcCBkYXRhICovCisgICAgICAgICAgICBmb3IgKGlpID0gaW5kZXg7IGlpIDwgcGt0X2xlbis0OykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEYmdQcmludCgiMHglMDJ4ICIsCisgICAgICAgICAgICAgICAgICAgICAgICAoem13X3J4X2J1Zl9yZWFkYihhZGFwdGVyLCBwVXNiUnhUcmFuc2Zlci0+YnVmLCBpaSkgJiAweGZmKSk7CisKKyAgICAgICAgICAgICAgICBpZiAoKCsraWkgJSAxNikgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgRGJnUHJpbnQoIlxuIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIERiZ1ByaW50KCJcbiIpOworICAgICAgICAgICAgI2VuZGlmCisKKyAgICAgICAgICAgIC8qIENhbGN1YXRlIHRoZSBwYWRkaW5nIGxlbmd0aCwgaW4gdGhlIGN1cnJlbnQgZGVzaWduLAorICAgICAgICAgICAgICAgdGhlIGxlbmd0aCBzaG91bGQgYmUgcGFkZGVkIHRvIDQgYnl0ZSBib3VuZHJheS4gKi8KKyAgICAgICAgICAgIHBhZExlbiA9IFpNX1VTQl9TVFJFQU1fTU9ERV9UQUdfTEVOIC0gKHBrdExlbiAmIDB4Myk7CisKKyAgICAgICAgICAgIGlmKHBhZExlbiA9PSBaTV9VU0JfU1RSRUFNX01PREVfVEFHX0xFTikKKyAgICAgICAgICAgICAgICBwYWRMZW4gPSAwOworCisgICAgICAgICAgICBjaGtJZHggPSBpbmRleDsKKyAgICAgICAgICAgIGluZGV4ID0gaW5kZXggKyBaTV9VU0JfU1RSRUFNX01PREVfVEFHX0xFTiArIHBrdExlbiArIHBhZExlbjsKKworICAgICAgICAgICAgaWYgKGNoa0lkeCA+IFpNX01BWF9VU0JfSU5fVFJBTlNGRVJfU0laRSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6bV9kZWJ1Z19tc2cxKCJjaGtJZHggaXMgdG9vIGxhcmdlLCBjaGtJZHg6ICVkXG4iLCBjaGtJZHgpOworICAgICAgICAgICAgICAgIHptX2Fzc2VydCgwKTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSAxOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoaW5kZXggPiBaTV9NQVhfVVNCX0lOX1RSQU5TRkVSX1NJWkUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy9zdHJ1Y3QgenNCdWZmZXIqIEJ1ZlB0cjsKKyAgICAgICAgICAgICAgICAvL3N0cnVjdCB6c0J1ZmZlciogVXNiQnVmUHRyOworICAgICAgICAgICAgICAgIHU4X3QgKkJ1ZlB0cjsKKyAgICAgICAgICAgICAgICB1OF90ICpVc2JCdWZQdHI7CisKKyAgICAgICAgICAgICAgICBoYWxQcml2LT51c2JSeFJlbWFpbkxlbiA9IGluZGV4IC0gWk1fTUFYX1VTQl9JTl9UUkFOU0ZFUl9TSVpFOyAvLyAtIHBhZExlbjsKKyAgICAgICAgICAgICAgICBoYWxQcml2LT51c2JSeFRyYW5zZmVyTGVuID0gWk1fTUFYX1VTQl9JTl9UUkFOU0ZFUl9TSVpFIC0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNoa0lkeCAtIFpNX1VTQl9TVFJFQU1fTU9ERV9UQUdfTEVOOworICAgICAgICAgICAgICAgIGhhbFByaXYtPnVzYlJ4UGFkTGVuID0gcGFkTGVuOworICAgICAgICAgICAgICAgIC8vY2hlY2tfaW5kZXggPSBpbmRleDsKKworICAgICAgICAgICAgICAgIGlmIChoYWxQcml2LT51c2JSeFRyYW5zZmVyTGVuID4gWk1fV0xBTl9NQVhfUlhfU0laRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHptX2RlYnVnX21zZzEoImNoZWNrX2xlbiBpcyB0b28gbGFyZ2UsIGNoa19sZW46ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbFByaXYtPnVzYlJ4VHJhbnNmZXJMZW4pOworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSAxOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvKiBBbGxvY2F0ZSBhIHNrYiBidWZmZXIgKi8KKyAgICAgICAgICAgICAgICBuZXdCdWYgPSB6ZndCdWZBbGxvY2F0ZShkZXYsIFpNX1dMQU5fTUFYX1JYX1NJWkUpOworCisgICAgICAgICAgICAgICAgaWYgKCBuZXdCdWYgIT0gTlVMTCApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBCdWZQdHIgPSB6bXdfYnVmX2dldF9idWZmZXIoZGV2LCBuZXdCdWYpOworICAgICAgICAgICAgICAgICAgICBVc2JCdWZQdHIgPSBzcmNCdWZQdHI7CisKKyAgICAgICAgICAgICAgICAgICAgLyogQ29weSB0aGUgYnVmZmVyICovCisgICAgICAgICAgICAgICAgICAgIHpmd01lbW9yeUNvcHkoQnVmUHRyLCAmKFVzYkJ1ZlB0cltjaGtJZHgrWk1fVVNCX1NUUkVBTV9NT0RFX1RBR19MRU5dKSwgaGFsUHJpdi0+dXNiUnhUcmFuc2Zlckxlbik7CisKKyAgICAgICAgICAgICAgICAgICAgLyogUmVjb3JkIHRoZSBidWZmZXIgcG9pbnRlciAqLworICAgICAgICAgICAgICAgICAgICBoYWxQcml2LT5yZW1haW5CdWYgPSBuZXdCdWY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHU4X3QqIEJ1ZlB0cjsKKyAgICAgICAgICAgICAgICB1OF90KiBVc2JCdWZQdHI7CisKKyAgICAgICAgICAgICAgICAvKiBBbGxvY2F0ZSBhIHNrYiBidWZmZXIgKi8KKyAgICAgICAgICAgICAgICBuZXdCdWYgPSB6ZndCdWZBbGxvY2F0ZShkZXYsIFpNX1dMQU5fTUFYX1JYX1NJWkUpOworICAgICAgICAgICAgICAgIGlmICggbmV3QnVmICE9IE5VTEwgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQnVmUHRyID0gem13X2J1Zl9nZXRfYnVmZmVyKGRldiwgbmV3QnVmKTsKKyAgICAgICAgICAgICAgICAgICAgVXNiQnVmUHRyID0gc3JjQnVmUHRyOworCisgICAgICAgICAgICAgICAgICAgIC8qIENvcHkgdGhlIGJ1ZmZlciAqLworICAgICAgICAgICAgICAgICAgICB6ZndNZW1vcnlDb3B5KEJ1ZlB0ciwgJihVc2JCdWZQdHJbY2hrSWR4K1pNX1VTQl9TVFJFQU1fTU9ERV9UQUdfTEVOXSksIHBrdExlbik7CisKKyAgICAgICAgICAgICAgICAgICAgemZ3QnVmU2V0U2l6ZShkZXYsIG5ld0J1ZiwgcGt0TGVuKTsKKyAgICAgICAgICAgICAgICAgICAgcnhCdWZQb29sW3J4QnVmUG9vbEluZGV4KytdID0gbmV3QnVmOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1MTZfdCBpOworCisgICAgICAgICAgICAgICAgRGJnUHJpbnQoIkNhbid0IGZpbmQgdGFnLCBwa3RfbGVuOiAweCUwNHgsIHRhZzogMHglMDR4XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgcGt0TGVuLCBwa3RUYWcpOworCisgICAgICAgICAgICAgICAgI2lmIDAKKyAgICAgICAgICAgICAgICBmb3IoaSA9IDA7IGkgPCAzMjsgaSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRGJnUHJpbnQoIiUwMnggIiwgYnVmLT5kYXRhW2luZGV4LTE2K2ldKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoKGkgJiAweGYpID09IDB4ZikKKyAgICAgICAgICAgICAgICAgICAgICAgIERiZ1ByaW50KCJcbiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAjZW5kaWYKKworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgLyogRnJlZSBidWZmZXIgKi8KKyAgICAvL3pmd0J1ZkZyZWUoYWRhcHRlciwgcFVzYlJ4VHJhbnNmZXItPmJ1ZiwgMCk7CisgICAgemZ3QnVmRnJlZShkZXYsIGJ1ZiwgMCk7CisKKyAgICBmb3IoaWkgPSAwOyBpaSA8IHJ4QnVmUG9vbEluZGV4OyBpaSsrKQorICAgIHsKKyAgICAgICAgemZpVXNiUmVjdlBlclBrdChkZXYsIHJ4QnVmUG9vbFtpaV0pOworICAgIH0KK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZVc2JJbml0ICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIEluaXRpYWxpemUgVVNCIHJlc291cmNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGRldiA6IGRldmljZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIE5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFN0ZXBoZW4gQ2hlbiAgICAgICAgWnlEQVMgVGVjaG5vbG9neSBDb3Jwb3JhdGlvbiAgICAyMDA1LjEyICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHpmVXNiSW5pdCh6ZGV2X3QqIGRldikKK3sKKyAgICAvKiBJbml0aWFsaXplIFJ4ICYgSU5UIGVuZHBvaW50IGZvciByZWNlaXZpbmcgZGF0YSAmIGludGVycnVwdCAqLworICAgIHpmd1VzYkVuYWJsZVJ4RXB0KGRldiwgVVNCX0VORFBPSU5UX1JYX0lOREVYKTsKKyAgICB6ZndVc2JFbmFibGVJbnRFcHQoZGV2LCBVU0JfRU5EUE9JTlRfSU5UX0lOREVYKTsKKworICAgIHJldHVybjsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZVc2JGcmVlICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIEZyZWUgUENJIHJlc291cmNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGRldiA6IGRldmljZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIE5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFN0ZXBoZW4gQ2hlbiAgICAgICAgWnlEQVMgVGVjaG5vbG9neSBDb3Jwb3JhdGlvbiAgICAyMDA1LjEyICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHpmVXNiRnJlZSh6ZGV2X3QqIGRldikKK3sKKyAgICBzdHJ1Y3QgenNIcFByaXYgKmhhbFByaXY7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBoYWxQcml2ID0gKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZTsKKworI2lmZGVmIFpNX09UVVNfUlhfU1RSRUFNX01PREUKKyAgICBpZiAoIGhhbFByaXYtPnJlbWFpbkJ1ZiAhPSBOVUxMICkKKyAgICB7CisgICAgICAgIHpmd0J1ZkZyZWUoZGV2LCBoYWxQcml2LT5yZW1haW5CdWYsIDApOworICAgIH0KKyNlbmRpZgorCisgICAgcmV0dXJuOworfQorCit2b2lkIHpmSHBTZW5kQmVhY29uKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3QgbGVuKQoreworICAgIHUzMl90IGh3LCBsdzsKKyAgICB1MTZfdCBpOworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIC8qIFdyaXRlIHRvIGJlYWNvbiBidWZmZXIgKFpNX0JFQUNPTl9CVUZGRVJfQUREUkVTUykgKi8KKyAgICBmb3IgKGkgPSAwOyBpPGxlbjsgaSs9NCkKKyAgICB7CisgICAgICAgIGx3ID0gem13X3R4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgaSk7CisgICAgICAgIGh3ID0gem13X3R4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgaSsyKTsKKworICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIFpNX0JFQUNPTl9CVUZGRVJfQUREUkVTUytpLCAoaHc8PDE2KStsdyk7CisgICAgfQorCisgICAgLyogQmVhY29uIFBDTFAgaGVhZGVyICovCisgICAgaWYgKCgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+aHdGcmVxdWVuY3kgPCAzMDAwKQorICAgIHsKKyAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIFpNX01BQ19SRUdfQkNOX1BMQ1AsICgobGVuKzQpPDwoMysxNikpKzB4MDQwMCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgWk1fTUFDX1JFR19CQ05fUExDUCwgKChsZW4rNCk8PCgxNikpKzB4MDAxYik7CisgICAgfQorCisgICAgLyogQmVhY29uIGxlbmd0aCAoaW5jbHVkZSBDUkMzMikgKi8KKyAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIFpNX01BQ19SRUdfQkNOX0xFTkdUSCwgbGVuKzQpOworCisgICAgLyogQmVhY29uIFJlYWR5ICovCisgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBaTV9NQUNfUkVHX0JDTl9DVFJMLCAxKTsKKyAgICB6ZkZsdXNoRGVsYXlXcml0ZShkZXYpOworCisgICAgLyogRnJlZSBiZWFjb24gYnVmICovCisgICAgemZ3QnVmRnJlZShkZXYsIGJ1ZiwgMCk7CisKKyAgICByZXR1cm47Cit9CisKKworI2RlZmluZSBaTV9TVEFUVVNfVFhfQ09NUCAgICAgICAweDAwCisjZGVmaW5lIFpNX1NUQVRVU19SRVRSWV9DT01QICAgIDB4MDEKKyNkZWZpbmUgWk1fU1RBVFVTX1RYX0ZBSUxFRCAgICAgMHgwMgordm9pZCB6ZmlVc2JSZWdJbih6ZGV2X3QqIGRldiwgdTMyX3QqIHJzcCwgdTE2X3QgcnNwTGVuKQoreworICAgIC8vdThfdCBsZW4sIHR5cGUsIGk7CisgICAgdThfdCB0eXBlOworICAgIHU4X3QgKnU4cnNwOworICAgIHUxNl90IHN0YXR1czsKKyAgICB1MzJfdCBiaXRtYXA7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem1fbXNnMF9tbShaTV9MVl8zLCAiemZpVXNiUmVnSW4oKSIpOworCisgICAgdThyc3AgPSAodThfdCAqKXJzcDsKKworICAgIC8vbGVuID0gKnU4cnNwOworICAgIHR5cGUgPSAqKHU4cnNwKzEpOworICAgIHU4cnNwID0gdThyc3ArNDsKKworCisgICAgLyogSW50ZXJydXB0IGV2ZW50ICovCisgICAgaWYgKCh0eXBlICYgMHhDMCkgPT0gMHhDMCkKKyAgICB7CisgICAgICAgIGlmICh0eXBlID09IDB4QzApCisgICAgICAgIHsKKyAgICAgICAgICAgIHpmQ29yZUV2ZW50KGRldiwgMCwgdThyc3ApOworCisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAodHlwZSA9PSAweEMxKQorICAgICAgICB7CisjaWYgMAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHUxNl90IGk7CisgICAgICAgICAgICAgICAgRGJnUHJpbnQoInJzcExlbj0lZFxuIiwgcnNwTGVuKTsKKyAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaTwocnNwTGVuLzQpOyBpKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBEYmdQcmludCgicnNwWyVkXT0weCVseFxuIiwgaSwgcnNwW2ldKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgICAgIHN0YXR1cyA9ICh1MTZfdCkocnNwWzNdID4+IDE2KTsKKworICAgICAgICAgICAgLy8vLzY3ODkKKyAgICAgICAgICAgIHJzcFs4XSA9IHJzcFs4XSA+PiAyIHwgKHJzcFs5XSAmIDB4MSkgPDwgNjsKKyAgICAgICAgICAgIHN3aXRjaCAoc3RhdHVzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgY2FzZSBaTV9TVEFUVVNfUkVUUllfQ09NUCA6CisgICAgICAgICAgICAgICAgemZDb3JlRXZlbnQoZGV2LCAxLCB1OHJzcCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFpNX1NUQVRVU19UWF9GQUlMRUQgOgorICAgICAgICAgICAgICAgIHpmQ29yZUV2ZW50KGRldiwgMiwgdThyc3ApOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBaTV9TVEFUVVNfVFhfQ09NUCA6CisgICAgICAgICAgICAgICAgemZDb3JlRXZlbnQoZGV2LCAzLCB1OHJzcCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAodHlwZSA9PSAweEMyKQorICAgICAgICB7CisgICAgICAgICAgICB6ZkJlYWNvbkNmZ0ludGVycnVwdChkZXYsIHU4cnNwKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICh0eXBlID09IDB4QzMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHpmRW5kT2ZBdGltV2luZG93SW50ZXJydXB0KGRldik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAodHlwZSA9PSAweEM0KQorICAgICAgICB7CisjaWYgMAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHUxNl90IGk7CisgICAgICAgICAgICAgICAgRGJnUHJpbnQoIjB4QzI6cnNwTGVuPSVkXG4iLCByc3BMZW4pOworICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpPChyc3BMZW4vNCk7IGkrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIERiZ1ByaW50KCIweEMyOnJzcFslZF09MHglbHhcbiIsIGksIHJzcFtpXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICBiaXRtYXAgPSAocnNwWzFdID4+IDE2KSArICgocnNwWzJdICYgMHhGRkZGKSA8PCAxNiApOworICAgICAgICAgICAgLy96ZkJhd0NvcmUoZGV2LCAodTE2X3QpcnNwWzFdICYgMHhGRkZGLCBiaXRtYXAsICh1MTZfdCkocnNwWzJdID4+IDE2KSAmIDB4RkYpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHR5cGUgPT0gMHhDNSkKKyAgICAgICAgeworICAgICAgICAgICAgdTE2X3QgaTsKKyNpZiAwCisKKyAgICAgICAgICAgIGZvciAoaT0wOyBpPChyc3BMZW4vNCk7IGkrKykgeworICAgICAgICAgICAgICAgIERiZ1ByaW50KCIweEM1OnJzcFslZF09MHglbHhcbiIsIGksIHJzcFtpXSk7CisgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgICAgIGZvciAoaT0xOyBpPChyc3BMZW4vNCk7IGkrKykgeworICAgICAgICAgICAgICAgIHU4cnNwID0gKHU4X3QgKikocnNwK2kpOworICAgICAgICAgICAgICAgIC8vRGJnUHJpbnQoIjB4QzU6cnNwWyVkXT0weCVseFxuIiwgaSwgKCh1MzJfdCopdThyc3ApWzBdKTsKKyAgICAgICAgICAgICAgICB6ZkNvcmVFdmVudChkZXYsIDQsIHU4cnNwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICh0eXBlID09IDB4QzYpCisgICAgICAgIHsKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIlxuXG4gV2F0Y2hEb2cgaW50ZXJydXB0ISEhIDogMHhDNiBcblxuIik7CisgICAgICAgICAgICBpZiAod2QtPnpmY2JId1dhdGNoRG9nTm90aWZ5ICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2QtPnpmY2JId1dhdGNoRG9nTm90aWZ5KGRldik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAodHlwZSA9PSAweEM4KQorICAgICAgICB7CisgICAgICAgICAgICAvL1BaU1dfQURBUFRFUiBhZGFwdGVyOworCisgICAgICAgICAgICAvLyBmb3IgU1BJIGZsYXNoIHByb2dyYW0gY2hrIEZsYWcKKyAgICAgICAgICAgIHpmd0RiZ1Byb2dyYW1lRmxhc2hDaGtEb25lKGRldik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAodHlwZSA9PSAweEM5KQorICAgICAgICB7CisgICAgICAgICAgICBzdHJ1Y3QgenNIcFByaXYqIGhwUHJpdj13ZC0+aHBQcml2YXRlOworCisgICAgICAgICAgICB6bV9kZWJ1Z19tc2cwKCIjIyMjIyBUeCByZXRyYW5zbWlzc2lvbiA1IHRpbWVzIGV2ZW50ICMjIyMjIik7CisKKyAgICAgICAgICAgIC8qIGNvcnJlY3QgdHggcmV0cmFuc21pc3Npb24gaXNzdWUgKi8KKyAgICAgICAgICAgIGhwUHJpdi0+cmV0cmFuc21pc3Npb25FdmVudCA9IDE7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgemZJZGxSc3AoZGV2LCByc3AsIHJzcExlbik7CisgICAgfQorfQorCisKKyNkZWZpbmUgWk1fUFJPR1JBTV9SQU1fQUREUiAgICAgMHgyMDAwMDAgLy8weDEwMDAgLy8weDcwMDAwMAorI2RlZmluZSBGSVJNV0FSRV9ET1dOTE9BRCAgICAgICAweDMwCisjZGVmaW5lIEZJUk1XQVJFX0RPV05MT0FEX0NPTVAgIDB4MzEKKyNkZWZpbmUgRklSTVdBUkVfQ09ORklSTSAgICAgICAgMHgzMgorCit1MTZfdCB6ZkZpcm13YXJlRG93bmxvYWQoemRldl90KiBkZXYsIHUzMl90KiBmdywgdTMyX3QgbGVuLCB1MzJfdCBvZmZzZXQpCit7CisgICAgdTE2X3QgcmV0ID0gWk1fU1VDQ0VTUzsKKyAgICB1MzJfdCB1Q29kZU9mc3QgPSBvZmZzZXQ7CisgICAgdThfdCAqaW1hZ2UsICpwdHI7CisgICAgdTMyX3QgcmVzdWx0OworCisgICAgaW1hZ2UgPSAodThfdCopIGZ3OworICAgIHB0ciA9IGltYWdlOworCisgICAgd2hpbGUgKGxlbiA+IDApCisgICAgeworICAgICAgICB1MzJfdCB0cmFuc2xlbiA9IChsZW4gPiA0MDk2KSA/IDQwOTYgOiBsZW47CisKKyAgICAgICAgcmVzdWx0ID0gemZ3VXNiU3VibWl0Q29udHJvbChkZXYsIEZJUk1XQVJFX0RPV05MT0FELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1MTZfdCkgKHVDb2RlT2ZzdCA+PiA4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBpbWFnZSwgdHJhbnNsZW4pOworCisgICAgICAgIGlmIChyZXN1bHQgIT0gWk1fU1VDQ0VTUykKKyAgICAgICAgeworICAgICAgICAgICAgem1fbXNnMF9pbml0KFpNX0xWXzAsICJGSVJNV0FSRV9ET1dOTE9BRCBmYWlsZWQiKTsKKyAgICAgICAgICAgIHJldCA9IDE7CisgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgIH0KKworICAgICAgICBsZW4gLT0gdHJhbnNsZW47CisgICAgICAgIGltYWdlICs9IHRyYW5zbGVuOworICAgICAgICB1Q29kZU9mc3QgKz0gdHJhbnNsZW47IC8vIGluIFdvcmQgKDE2IGJpdCkKKworICAgICAgICByZXN1bHQgPSAwOworICAgIH0KKworICAgIC8qIElmIGRvd25sb2FkIGZpcm13YXJlIHN1Y2Nlc3MsIGlzc3VlIGEgY29tbWFuZCB0byBmaXJtd2FyZSAqLworICAgIGlmIChyZXQgPT0gMCkKKyAgICB7CisgICAgICAgIHJlc3VsdCA9IHpmd1VzYlN1Ym1pdENvbnRyb2woZGV2LCBGSVJNV0FSRV9ET1dOTE9BRF9DT01QLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIE5VTEwsIDApOworCisgICAgICAgIGlmIChyZXN1bHQgIT0gWk1fU1VDQ0VTUykKKyAgICAgICAgeworICAgICAgICAgICAgem1fbXNnMF9pbml0KFpNX0xWXzAsICJGSVJNV0FSRV9ET1dOTE9BRF9DT01QIGZhaWxlZCIpOworICAgICAgICAgICAgcmV0ID0gMTsKKyAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgfQorICAgIH0KKworI2lmIDAKKyAgICAvKiBQQ0kgY29kZSAqLworICAgIC8qIFdhaXQgZm9yIGZpcm13YXJlIHJlYWR5ICovCisgICAgcmVzdWx0ID0gemZ3VXNiU3VibWl0Q29udHJvbChkZXYsIEZJUk1XQVJFX0NPTkZJUk0sIFVTQl9ESVJfSU4gfCAweDQwLAorICAgICAgICAgICAgICAgICAgICAgMCwgMCwgJnJldF92YWx1ZSwgc2l6ZW9mKHJldF92YWx1ZSksIEhaKTsKKworICAgIGlmIChyZXN1bHQgIT0gMCkKKyAgICB7CisgICAgICAgIHptX21zZzBfaW5pdChaTV9MVl8wLCAiQ2FuJ3QgcmVjZWl2ZSBmaXJtd2FyZSByZWFkeTogIiwgcmVzdWx0KTsKKyAgICAgICAgcmV0ID0gMTsKKyAgICB9CisjZW5kaWYKKworZXhpdDoKKworICAgIHJldHVybiByZXQ7CisKK30KKwordTE2X3QgemZGaXJtd2FyZURvd25sb2FkTm90SnVtcCh6ZGV2X3QqIGRldiwgdTMyX3QqIGZ3LCB1MzJfdCBsZW4sIHUzMl90IG9mZnNldCkKK3sKKyAgICB1MTZfdCByZXQgPSBaTV9TVUNDRVNTOworICAgIHUzMl90IHVDb2RlT2ZzdCA9IG9mZnNldDsKKyAgICB1OF90ICppbWFnZSwgKnB0cjsKKyAgICB1MzJfdCByZXN1bHQ7CisKKyAgICBpbWFnZSA9ICh1OF90KikgZnc7CisgICAgcHRyID0gaW1hZ2U7CisKKyAgICB3aGlsZSAobGVuID4gMCkKKyAgICB7CisgICAgICAgIHUzMl90IHRyYW5zbGVuID0gKGxlbiA+IDQwOTYpID8gNDA5NiA6IGxlbjsKKworICAgICAgICByZXN1bHQgPSB6ZndVc2JTdWJtaXRDb250cm9sKGRldiwgRklSTVdBUkVfRE9XTkxPQUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHUxNl90KSAodUNvZGVPZnN0ID4+IDgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIGltYWdlLCB0cmFuc2xlbik7CisKKyAgICAgICAgaWYgKHJlc3VsdCAhPSBaTV9TVUNDRVNTKQorICAgICAgICB7CisgICAgICAgICAgICB6bV9tc2cwX2luaXQoWk1fTFZfMCwgIkZJUk1XQVJFX0RPV05MT0FEIGZhaWxlZCIpOworICAgICAgICAgICAgcmV0ID0gMTsKKyAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgfQorCisgICAgICAgIGxlbiAtPSB0cmFuc2xlbjsKKyAgICAgICAgaW1hZ2UgKz0gdHJhbnNsZW47CisgICAgICAgIHVDb2RlT2ZzdCArPSB0cmFuc2xlbjsgLy8gaW4gV29yZCAoMTYgYml0KQorCisgICAgICAgIHJlc3VsdCA9IDA7CisgICAgfQorCitleGl0OgorCisgICAgcmV0dXJuIHJldDsKKworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZJZGxHZXRGcmVlVHhkQ291bnQgICAgICAgICovCisvKiAgICAgIEdldCBmcmVlIFBDSSBQQ0kgVHhEIGNvdW50LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGRldiA6IGRldmljZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIE5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFN0ZXBoZW4gICAgICAgICAgICAgWnlEQVMgVGVjaG5vbG9neSBDb3Jwb3JhdGlvbiAgICAyMDA2LjYgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MzJfdCB6ZkhwR2V0RnJlZVR4ZENvdW50KHpkZXZfdCogZGV2KQoreworICAgIHJldHVybiB6ZndVc2JHZXRGcmVlVHhRU2l6ZShkZXYpOworfQorCit1MzJfdCB6ZkhwR2V0TWF4VHhkQ291bnQoemRldl90KiBkZXYpCit7CisgICAgLy9yZXR1cm4gODsKKyAgICByZXR1cm4gemZ3VXNiR2V0TWF4VHhRU2l6ZShkZXYpOworfQorCit2b2lkIHpmaVVzYlJlZ091dENvbXBsZXRlKHpkZXZfdCogZGV2KQoreworICAgIHJldHVybjsKK30KKworZXh0ZXJuIHZvaWQgemZQdXNoVnR4cSh6ZGV2X3QqIGRldik7CisKK3ZvaWQgemZpVXNiT3V0Q29tcGxldGUoemRldl90KiBkZXYsIHpidWZfdCAqYnVmLCB1OF90IHN0YXR1cywgdThfdCAqaGRyKSB7CisjaWZuZGVmIFpNX0VOQUJMRV9BR0dSRUdBVElPTgorICAgIGlmIChidWYpIHsKKyAgICAgICAgemZ3QnVmRnJlZShkZXYsIGJ1ZiwgMCk7CisgICAgfQorI2Vsc2UKKyAgICAjaWZkZWYgWk1fQllQQVNTX0FHR1JfU0NIRURVTElORworICAgIC8vU2ltcGx5IGZyZWUgdGhlIGJ1ZiBzaW5jZSBCQSByZXRyYW5zbWlzc2lvbiBpcyBkb25lIGluIHRoZSBmaXJtd2FyZQorICAgIGlmIChidWYpCisgICAgeworICAgICAgICB6ZndCdWZGcmVlKGRldiwgYnVmLCAwKTsKKyAgICB9CisgICAgemZQdXNoVnR4cShkZXYpOworICAgICNlbHNlCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgI2lmZGVmIFpNX0VOQUJMRV9GV19CQV9SRVRSQU5TTUlTU0lPTgorICAgIC8vU2ltcGx5IGZyZWUgdGhlIGJ1ZiBzaW5jZSBCQSByZXRyYW5zbWlzc2lvbiBpcyBkb25lIGluIHRoZSBmaXJtd2FyZQorICAgIGlmIChidWYpCisgICAgeworICAgICAgICB6ZndCdWZGcmVlKGRldiwgYnVmLCAwKTsKKyAgICB9CisgICAgI2Vsc2UKKyAgICB1OF90IGFnZzsKKyAgICB1MTZfdCBmcmFtZVR5cGU7CisKKyAgICBpZighaGRyICYmIGJ1ZikgeworICAgICAgICB6ZndCdWZGcmVlKGRldiwgYnVmLCAwKTsKKyAgICAgICAgLy96bV9kZWJ1Z19tc2cwKCJidWYgRnJlZSBkdWUgdG8gaGRyID09IE5VTEwiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmKGhkciAmJiBidWYpIHsKKyAgICAgICAgZnJhbWVUeXBlID0gaGRyWzhdICYgMHhmOworICAgICAgICBhZ2cgPSAodThfdCkoaGRyWzJdID4+IDUgKSAmIDB4MTsKKyAgICAgICAgLy96bV9kZWJ1Z19tc2cxKCJBR0c9IiwgYWdnKTsKKworICAgICAgICBpZiAoIXN0YXR1cykgeworICAgICAgICAgICAgaWYgKGFnZykgeworICAgICAgICAgICAgICAgIC8vZGVsZXRlIGJ1ZiBpbiBiYSBmYWlsIHF1ZXVlPz8KKyAgICAgICAgICAgICAgICAvL25vdCBnYW5uYSBoYXBwZW4/CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICB6ZndCdWZGcmVlKGRldiwgYnVmLCAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGlmIChhZ2cpIHsKKyAgICAgICAgICAgICAgICAvL2Rvbid0IGRvIGFueXRoaW5nCisgICAgICAgICAgICAgICAgLy96ZndCdWZGcmVlKGRldiwgYnVmLCAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIHpmd0J1ZkZyZWUoZGV2LCBidWYsIDApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgICNlbmRpZgorCisgICAgaWYgKHdkLT5zdGF0ZSAhPSBaTV9XTEFOX1NUQVRFX0VOQUJMRUQpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmKCAod2QtPndsYW5Nb2RlID09IFpNX01PREVfQVApIHx8CisgICAgICAgICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9JTkZSQVNUUlVDVFVSRSAmJiB3ZC0+c3RhLkVuYWJsZUhUKSB8fAorICAgICAgICAod2QtPndsYW5Nb2RlID09IFpNX01PREVfUFNFVURPKSApIHsKKyAgICAgICAgemZBZ2dUeFNjaGVkdWxlcihkZXYsIDApOworICAgIH0KKyAgICAjZW5kaWYKKyNlbmRpZgorCisgICAgcmV0dXJuOworCit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzL2hhbC9ocHVzYi5oIGIvZHJpdmVycy9zdGFnaW5nL290dXMvaGFsL2hwdXNiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzVhMGM1NgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL2hhbC9ocHVzYi5oCkBAIC0wLDAgKzEsNDM3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDUgWnlEQVMgVGVjaG5vbG9neSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggQXRoZXJvcyBDb21tdW5pY2F0aW9ucyBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKy8qICBNb2R1bGUgTmFtZSA6IHVkX2RlZnMuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEFic3RyYWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgVGhpcyBtb2R1bGUgY29udGFpbnMgVVNCIGRhdGEgc3RydWN0dXJlIGRlZmluaXRpb25zLiAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE5PVEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfSFBVU0JfSAorI2RlZmluZSBfSFBVU0JfSAorCisjZGVmaW5lIFpNX09UVVNfRU5BQkxFX1JFVFJZX0ZSRVFfQ0hBTkdFCisjZGVmaW5lIFpNX0JFQUNPTl9CVUZGRVJfQUREUkVTUyAgICAgICAgICAgIDB4MTE3OTAwCisKKyNkZWZpbmUgWk1fTUFYX0NNRF9TSVpFICAgICAgICAgICAgICAgICAgICAgNjQKKyNkZWZpbmUgWk1fSEFMX01BWF9FRVBST01fUkVRICAgICAgICAgICAgICAgNTEwCisjZGVmaW5lIFpNX0hBTF9NQVhfRUVQUk9NX1BSUSAgICAgICAgICAgICAgIDIKKworLyogRm9yIFVTQiBTVFJFQU0gbW9kZSAqLworI2lmZGVmIFpNX0RJU0FCTEVfQU1TRFU4S19TVVBQT1JUCisjZGVmaW5lIFpNX01BWF9VU0JfSU5fVFJBTlNGRVJfU0laRSAgICAgICAgIDQwOTYKKyNlbHNlCisjZGVmaW5lIFpNX01BWF9VU0JfSU5fVFJBTlNGRVJfU0laRSAgICAgICAgIDgxOTIKKyNlbmRpZgorI2RlZmluZSBaTV9VU0JfU1RSRUFNX01PREVfVEFHX0xFTiAgICAgICAgICA0CisjZGVmaW5lIFpNX1VTQl9TVFJFQU1fTU9ERV9UQUcgICAgICAgICAgICAgIDB4NGUwMAorI2RlZmluZSBaTV9VU0JfTUFYX0VQSU5UX0JVRkZFUiAgICAgICAgICAgICA2NAorCitzdHJ1Y3QgenNDbWRRCit7CisgICAgdTE2X3Qgc3JjOworICAgIHUxNl90IGNtZExlbjsKKyAgICB1OF90KiBidWY7CisgICAgdTMyX3QgY21kW1pNX01BWF9DTURfU0laRS80XTsKK307CisKK3N0cnVjdCB6c0NvbW1hbmQKK3sKKyAgICB1MTZfdCBkZWxheVdjbWRDb3VudDsKKyAgICB1MzJfdCBkZWxheVdjbWRBZGRyWyhaTV9DTURfUVVFVUVfU0laRS00KS80XTsKKyAgICB1MzJfdCBkZWxheVdjbWRWYWxbKFpNX0NNRF9RVUVVRV9TSVpFLTQpLzRdOworfTsKKworc3RydWN0IHpzSGFsUnhJbmZvCit7CisgICAgdTMyX3QgY3VycmVudFJTU0lbN107ICAgICAgIC8qIFJTU0kgY29tYmluZWQgKi8KKyAgICB1MzJfdCBjdXJyZW50UnhFVk1bMTRdOworICAgIHUzMl90IGN1cnJlbnRSeERhdGFNVDsKKyAgICB1MzJfdCBjdXJyZW50UnhEYXRhTUNTOworICAgIHUzMl90IGN1cnJlbnRSeERhdGFCVzsKKyAgICB1MzJfdCBjdXJyZW50UnhEYXRhU0c7Cit9OworCitzdHJ1Y3QgenNIcFByaXYKK3sKKyAgICB1MTZfdCBod0ZyZXF1ZW5jeTsKKyAgICB1OF90ICBod0J3NDA7CisgICAgdThfdCAgaHdFeHRPZmZzZXQ7CisKKyAgICB1OF90ICBkaXNhYmxlRGZzQ2g7CisKKyAgICB1MzJfdCBoYWxDYXBhYmlsaXR5OworCisgICAgLyogRm9ydHVuYXRlbHkgdGhlIHNlY29uZCBsb29wIGNhbiBiZSBkaXNhYmxlZCB3aXRoIGEgYml0ICovCisgICAgLyogY2FsbGVkIGVuX3BkX2RjX29mZnNldF90aHIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgdThfdCBod05vdEZpcnN0SW5pdDsKKworICAgIC8qIGNvbW1hbmQgcXVldWUgKi8KKyAgICB1MTZfdCAgICAgICAgICAgICAgIGNtZEhlYWQ7CisgICAgdTE2X3QgICAgICAgICAgICAgICBjbWRUYWlsOworI2lmZGVmIFpNX1hQX1VTQl9NVUxUQ01ECisgICAgdTE2X3QgICAgICAgICAgICAgICBjbWRTZW5kOyAgLy8gVXNlZCBmb3IgTXVsdCBzZW5kIFVTQiBjbWQKKyNlbmRpZgorICAgIHN0cnVjdCB6c0NtZFEgICAgICAgY21kUVtaTV9DTURfUVVFVUVfU0laRV07CisgICAgdTE2X3QgICAgICAgICAgICAgICBjbWRQZW5kaW5nOworICAgIHN0cnVjdCB6c0NvbW1hbmQgICAgY21kOyAvKiBidWZmZXIgZm9yIGRlbGF5ZWQgY29tbWFuZHMgKi8KKyAgICB1OF90ICAgICAgICAgICAgICAgIGxlZE1vZGVbMl07CisgICAgdTMyX3QgICAgICAgICAgICAgICBjdGxCdXN5OworICAgIHUzMl90ICAgICAgICAgICAgICAgZXh0QnVzeTsKKworICAgIC8qCisgICAgICogQU5JICYgUmFkYXIgc3VwcG9ydC4KKyAgICAgKi8KKyAgICB1MzJfdCAgIHByb2NQaHlFcnI7ICAgICAgICAgLyogUHJvY2VzcyBQaHkgZXJycyAqLworICAgIHU4X3QgaGFzSHdQaHlDb3VudGVyczsgICAvKiBIYXJkd2FyZSBoYXMgcGh5IGNvdW50ZXJzICovCisgICAgdTMyX3QgICBhbmlQZXJpb2Q7ICAgICAgICAgIC8qIGFuaSB1cGRhdGUgbGlzdCBwZXJpb2QgKi8KKyAgICBzdHJ1Y3QgenNBbmlTdGF0cyAgIHN0YXRzOyAgICAgIC8qIHZhcmlvdXMgc3RhdGlzdGljcyAqLworICAgIHN0cnVjdCB6c0FuaVN0YXRlICAgKmN1cmFuaTsgICAgLyogY2FjaGVkIGxhc3QgcmVmZXJlbmNlICovCisgICAgc3RydWN0IHpzQW5pU3RhdGUgICBhbmlbNTBdOyAgIC8qIHBlci1jaGFubmVsIHN0YXRlICovCisKKyAgICAvKgorICAgICAqIEFuaSB0YWJsZXMgdGhhdCBjaGFuZ2UgYmV0d2VlbiB0aGUgNTQxNiBhbmQgNTMxMi4KKyAgICAgKiBUaGVzZSBnZXQgc2V0IGF0IGF0dGFjaCB0aW1lLgorICAgICAqIFhYWCBkb24ndCBiZWxvbmcgaGVyZQorICAgICAqIFhYWCBuZWVkIGJldHRlciBleHBsYW5hdGlvbgorICAgICAqLworICAgIHMzMl90ICAgICB0b3RhbFNpemVEZXNpcmVkWzVdOworICAgIHMzMl90ICAgICBjb2Fyc2VIaWdoWzVdOworICAgIHMzMl90ICAgICBjb2Fyc2VMb3dbNV07CisgICAgczMyX3QgICAgIGZpcnB3cls1XTsKKworICAgIC8qCisgICAgICogQU5JIHJlbGF0ZWQgUEhZIHJlZ2lzdGVyIHZhbHVlLgorICAgICAqLworICAgIHUzMl90IHJlZ1BIWURlc2lyZWRTWjsKKyAgICB1MzJfdCByZWdQSFlGaW5kU2lnOworICAgIHUzMl90IHJlZ1BIWUFnY0N0bDE7CisgICAgdTMyX3QgcmVnUEhZU2Zjb3JyOworICAgIHUzMl90IHJlZ1BIWVNmY29yckxvdzsKKyAgICB1MzJfdCByZWdQSFlUaW1pbmc1OworICAgIHUzMl90IHJlZ1BIWUNja0RldGVjdDsKKworICAgIHUzMl90IGVlcHJvbUltYWdlWzEwMjRdOworICAgIHUzMl90IGVlcHJvbUltYWdlSW5kZXg7CisgICAgdTMyX3QgZWVwcm9tSW1hZ2VSZFJlcTsKKworICAgIHU4X3QgIGhhbFJlSW5pdDsKKworICAgIHU4X3QgIE9wRmxhZ3M7CisKKyAgICB1OF90IHRQb3cyeENja1s0XTsKKyAgICB1OF90IHRQb3cyeDJnWzRdOworICAgIHU4X3QgdFBvdzJ4MmcyNEhlYXZ5Q2xpcE9mZnNldDsKKyAgICB1OF90IHRQb3cyeDJnSHQyMFs4XTsKKyAgICB1OF90IHRQb3cyeDJnSHQ0MFs4XTsKKyAgICB1OF90IHRQb3cyeDVnWzRdOworICAgIHU4X3QgdFBvdzJ4NWdIdDIwWzhdOworICAgIHU4X3QgdFBvdzJ4NWdIdDQwWzhdOworCisgICAgLyogaHdCQkhlYXZ5Q2xpcCA6IHVzZWQgY29tcGF0aWJpbGl0eSAgICAgICAgICAgKi8KKyAgICAvKiAgICAgICAgICAgICAwIDogZG9uZ2xlIG5vdCBzdXBwb3J0LiAgICAgICAgICAqLworICAgIC8qICAgICAgICAgICAgICEwOiBzdXBwb3J0IGhlYXZ5IGNsaXAuICAgICAgICAgICovCisgICAgdThfdCBod0JCSGVhdnlDbGlwOworICAgIHU4X3QgZW5hYmxlQkJIZWF2eUNsaXA7IC8qIDA9PmZvcmNlIGRpc2FibGUgMT0+ZW5hYmxlICovCisgICAgdThfdCBkb0JCSGVhdnlDbGlwOyAgICAgLyogc2V0IDEgaWYgaGVhdnkgY2xpcCBuZWVkIGJ5IGVhY2ggZnJlcXVlbmN5IHN3aXRjaCAqLworICAgIHUzMl90IHNldFZhbHVlSGVhdnlDbGlwOyAvKiBzYXZlIHNldHRpbmcgdmFsdWUgZm9yIGhlYXZ5IGNsaXAgd2hlbiBjb21wbGV0ZWQgcm91dGluZSAqLworCisgICAgLyoKKyAgICAgKiBSeGRhdGEgUlNTSSwgRVZNLCBSYXRlIGV0Yy4uLgorICAgICAqLworICAgIHN0cnVjdCB6c0hhbFJ4SW5mbyBoYWxSeEluZm87CisKKyAgICB1MzJfdCB1c2JTZW5kQnl0ZXM7CisgICAgdTMyX3QgdXNiQWNTZW5kQnl0ZXNbNF07CisKKyAgICB1MTZfdCBhZ2dNYXhEdXJhdGlvbkJFOworICAgIHUzMl90IGFnZ1BrdE51bTsKKworICAgIHUxNl90IHR4b3BbNF07CisgICAgdTE2X3QgY3dtaW5bNF07CisgICAgdTE2X3QgY3dtYXhbNF07CisgICAgdThfdCAgc3Ryb25nUlNTSTsKKyAgICB1OF90ICByeFN0cm9uZ1JTU0k7CisKKyAgICB1OF90ICBzbG90VHlwZTsgIC8vMC0+MjB1cywgMT0+OXVzCisKKyNpZmRlZiBaTV9PVFVTX1JYX1NUUkVBTV9NT0RFCisgICAgdTE2X3QgdXNiUnhSZW1haW5MZW47CisgICAgdTE2X3QgdXNiUnhQa3RMZW47CisgICAgdTE2X3QgdXNiUnhQYWRMZW47CisgICAgdTE2X3QgdXNiUnhUcmFuc2ZlckxlbjsKKyAgICB6YnVmX3QgICpyZW1haW5CdWY7CisjZW5kaWYKKworICAgIHU4X3QgICAgZG90MTFNb2RlOworCisgICAgdThfdCAgICBpYnNzQmNuRW5hYmxlZDsKKyAgICB1MzJfdCAgIGlic3NCY25JbnRlcnZhbDsKKworICAgIC8vIEZvciByZS1pc3N1ZSB0aGUgZnJlcXVlbmN5IGNoYW5nZSBjb21tYW5kCisgICAgdTMyX3QgICBsYXRlc3RGcmVxdWVuY3k7CisgICAgdThfdCAgICBsYXRlc3RCdzQwOworICAgIHU4X3QgICAgbGF0ZXN0RXh0T2Zmc2V0OworICAgIHU4X3QgICAgZnJlcVJldHJ5Q291bnRlcjsKKworICAgIHU4X3QgICAgcmVjb3JkRnJlcVJldHJ5Q291bnRlcjsKKyAgICB1OF90ICAgIGlzU2l0ZVN1cnZleTsKKyAgICB1OF90ICAgIGNvbGRSZXNldE5lZWRGcmVxOworCisgICAgdTY0X3QgICBjYW1Sb2xsQ2FsbFRhYmxlOworICAgIHU4X3QgICAgY3VycmVudEFja1J0c1RwYzsKKworICAgIC8qICMxIFNhdmUgdGhlIGluaXRpYWwgdmFsdWUgb2YgdGhlIHJlbGF0ZWQgUklGUyByZWdpc3RlciBzZXR0aW5ncyAqLworICAgIC8vdTMyX3QgICBpc0luaXRpYWxQaHk7CisgICAgdTMyX3QgICBpbml0RGVzaXJlZFNpZ1NpemU7CisgICAgdTMyX3QgICBpbml0QUdDOworICAgIHUzMl90ICAgaW5pdEFnY0NvbnRyb2w7CisgICAgdTMyX3QgICBpbml0U2VhcmNoU3RhcnREZWxheTsKKyAgICB1MzJfdCAgIGluaXRSSUZTU2VhcmNoUGFyYW1zOworICAgIHUzMl90ICAgaW5pdEZhc3RDaGFubmVsQ2hhbmdlQ29udHJvbDsKKworICAgIC8qIER5bmFtaWMgU0lGUyBmb3IgcmV0cmFuc21pc3Npb24gZXZlbnQgKi8KKyAgICB1OF90ICAgIHJldHJhbnNtaXNzaW9uRXZlbnQ7CisgICAgdThfdCAgICBsYXRlc3RTSUZTOworfTsKKworZXh0ZXJuIHUzMl90IHpmSHBMb2FkRUVQUk9NRnJvbUZXKHpkZXZfdCogZGV2KTsKKworCit0eXBlZGVmIHU4X3QgQV9VSU5UODsKK3R5cGVkZWYgczhfdCBBX0lOVDg7Cit0eXBlZGVmIHUxNl90IEFfVUlOVDE2OwordHlwZWRlZiB1MzJfdCBBX1VJTlQzMjsKKyNkZWZpbmUgX19BVFRSSUJfUEFDSworCisjcHJhZ21hIHBhY2sgKHB1c2gsIDEpCisKKyNkZWZpbmUgQVI1NDE2X0VFUF9WRVIgICAgICAgICAgICAgICAweEUKKyNkZWZpbmUgQVI1NDE2X0VFUF9WRVJfTUlOT1JfTUFTSyAgICAweEZGRgorI2RlZmluZSBBUjU0MTZfRUVQX05PX0JBQ0tfVkVSICAgICAgIDB4MQorI2RlZmluZSBBUjU0MTZfRUVQX01JTk9SX1ZFUl8yICAgICAgIDB4MiAgLy8gQWRkcyBtb2RhbCBwYXJhbXMgdHhGcmFtZVRvUGFPbiwgdHhGcmFtZXRvRGF0YVN0YXJ0LCBodDQwUG93ZXJJbmMKKyNkZWZpbmUgQVI1NDE2X0VFUF9NSU5PUl9WRVJfMyAgICAgICAweDMgIC8vIEFkZHMgbW9kYWwgcGFyYW1zIGJzd0F0dGVuLCBic3dNYXJnaW4sIHN3U2V0dGxlIGFuZCBiYXNlIE9wRmxhZ3MgZm9yIEhUMjAvNDAgRGlzYWJsZQorCisvLyAxNi1iaXQgb2Zmc2V0IGxvY2F0aW9uIHN0YXJ0IG9mIGNhbGlicmF0aW9uIHN0cnVjdAorI2RlZmluZSBBUjU0MTZfRUVQX1NUQVJUX0xPQyAgICAgICAgIDI1NgorI2RlZmluZSBBUjU0MTZfTlVNXzVHX0NBTF9QSUVSUyAgICAgIDgKKyNkZWZpbmUgQVI1NDE2X05VTV8yR19DQUxfUElFUlMgICAgICA0CisjZGVmaW5lIEFSNTQxNl9OVU1fNUdfMjBfVEFSR0VUX1BPV0VSUyAgOAorI2RlZmluZSBBUjU0MTZfTlVNXzVHXzQwX1RBUkdFVF9QT1dFUlMgIDgKKyNkZWZpbmUgQVI1NDE2X05VTV8yR19DQ0tfVEFSR0VUX1BPV0VSUyAzCisjZGVmaW5lIEFSNTQxNl9OVU1fMkdfMjBfVEFSR0VUX1BPV0VSUyAgNAorI2RlZmluZSBBUjU0MTZfTlVNXzJHXzQwX1RBUkdFVF9QT1dFUlMgIDQKKyNkZWZpbmUgQVI1NDE2X05VTV9DVExTICAgICAgICAgICAgICAyNAorI2RlZmluZSBBUjU0MTZfTlVNX0JBTkRfRURHRVMgICAgICAgIDgKKyNkZWZpbmUgQVI1NDE2X05VTV9QRF9HQUlOUyAgICAgICAgICA0CisjZGVmaW5lIEFSNTQxNl9QRF9HQUlOU19JTl9NQVNLICAgICAgNAorI2RlZmluZSBBUjU0MTZfUERfR0FJTl9JQ0VQVFMgICAgICAgIDUKKyNkZWZpbmUgQVI1NDE2X0VFUFJPTV9NT0RBTF9TUFVSUyAgICA1CisjZGVmaW5lIEFSNTQxNl9NQVhfUkFURV9QT1dFUiAgICAgICAgNjMKKyNkZWZpbmUgQVI1NDE2X05VTV9QREFEQ19WQUxVRVMgICAgICAxMjgKKyNkZWZpbmUgQVI1NDE2X05VTV9SQVRFUyAgICAgICAgICAgICAxNgorI2RlZmluZSBBUjU0MTZfQkNIQU5fVU5VU0VEICAgICAgICAgIDB4RkYKKyNkZWZpbmUgQVI1NDE2X01BWF9QV1JfUkFOR0VfSU5fSEFMRl9EQiA2NAorI2RlZmluZSBBUjU0MTZfT1BGTEFHU18xMUEgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgQVI1NDE2X09QRkxBR1NfMTFHICAgICAgICAgICAweDAyCisjZGVmaW5lIEFSNTQxNl9PUEZMQUdTXzVHX0hUNDAgICAgICAgMHgwNAorI2RlZmluZSBBUjU0MTZfT1BGTEFHU18yR19IVDQwICAgICAgIDB4MDgKKyNkZWZpbmUgQVI1NDE2X09QRkxBR1NfNUdfSFQyMCAgICAgICAweDEwCisjZGVmaW5lIEFSNTQxNl9PUEZMQUdTXzJHX0hUMjAgICAgICAgMHgyMAorI2RlZmluZSBBUjU0MTZfRUVQTUlTQ19CSUdfRU5ESUFOICAgIDB4MDEKKyNkZWZpbmUgRlJFUTJGQklOKHgseSkgKCh5KSA/ICgoeCkgLSAyMzAwKSA6ICgoKHgpIC0gNDgwMCkgLyA1KSkKKyNkZWZpbmUgQVI1NDE2X01BWF9DSEFJTlMgICAgICAgICAgICAyCisjZGVmaW5lIEFSNTQxNl9BTlRfMTZTICAgICAgICAgICAgICAgMjUKKworI2RlZmluZSBBUjU0MTZfTlVNX0FOVF9DSEFJTl9GSUVMRFMgICAgIDcKKyNkZWZpbmUgQVI1NDE2X05VTV9BTlRfQ09NTU9OX0ZJRUxEUyAgICA0CisjZGVmaW5lIEFSNTQxNl9TSVpFX0FOVF9DSEFJTl9GSUVMRCAgICAgMworI2RlZmluZSBBUjU0MTZfU0laRV9BTlRfQ09NTU9OX0ZJRUxEICAgIDQKKyNkZWZpbmUgQVI1NDE2X0FOVF9DSEFJTl9NQVNLICAgICAgICAgICAweDcKKyNkZWZpbmUgQVI1NDE2X0FOVF9DT01NT05fTUFTSyAgICAgICAgICAweGYKKyNkZWZpbmUgQVI1NDE2X0NIQUlOXzBfSURYICAgICAgICAgICAgICAwCisjZGVmaW5lIEFSNTQxNl9DSEFJTl8xX0lEWCAgICAgICAgICAgICAgMQorI2RlZmluZSBBUjU0MTZfQ0hBSU5fMl9JRFggICAgICAgICAgICAgIDIKKworCisvKiBDYXBhYmlsaXRpZXMgRW51bSAqLwordHlwZWRlZiBlbnVtIHsKKyAgICBFRVBDQVBfQ09NUFJFU1NfRElTICA9IDB4MDAwMSwKKyAgICBFRVBDQVBfQUVTX0RJUyAgICAgICA9IDB4MDAwMiwKKyAgICBFRVBDQVBfRkFTVEZSQU1FX0RJUyA9IDB4MDAwNCwKKyAgICBFRVBDQVBfQlVSU1RfRElTICAgICA9IDB4MDAwOCwKKyAgICBFRVBDQVBfTUFYUUNVX00gICAgICA9IDB4MDFGMCwKKyAgICBFRVBDQVBfTUFYUUNVX1MgICAgICA9IDQsCisgICAgRUVQQ0FQX0hFQVZZX0NMSVBfRU4gPSAweDAyMDAsCisgICAgRUVQQ0FQX0tDX0VOVFJJRVNfTSAgPSAweEYwMDAsCisgICAgRUVQQ0FQX0tDX0VOVFJJRVNfUyAgPSAxMiwKK30gRUVQUk9NX0NBUEFCSUxJVElFUzsKKwordHlwZWRlZiBlbnVtIEFyNTQxNl9SYXRlcyB7CisgICAgcmF0ZTZtYiwgIHJhdGU5bWIsICByYXRlMTJtYiwgcmF0ZTE4bWIsCisgICAgcmF0ZTI0bWIsIHJhdGUzNm1iLCByYXRlNDhtYiwgcmF0ZTU0bWIsCisgICAgcmF0ZTFsLCAgIHJhdGUybCwgICByYXRlMnMsICAgcmF0ZTVfNWwsCisgICAgcmF0ZTVfNXMsIHJhdGUxMWwsICByYXRlMTFzLCAgcmF0ZVhyLAorICAgIHJhdGVIdDIwXzAsIHJhdGVIdDIwXzEsIHJhdGVIdDIwXzIsIHJhdGVIdDIwXzMsCisgICAgcmF0ZUh0MjBfNCwgcmF0ZUh0MjBfNSwgcmF0ZUh0MjBfNiwgcmF0ZUh0MjBfNywKKyAgICByYXRlSHQ0MF8wLCByYXRlSHQ0MF8xLCByYXRlSHQ0MF8yLCByYXRlSHQ0MF8zLAorICAgIHJhdGVIdDQwXzQsIHJhdGVIdDQwXzUsIHJhdGVIdDQwXzYsIHJhdGVIdDQwXzcsCisgICAgcmF0ZUR1cENjaywgcmF0ZUR1cE9mZG0sIHJhdGVFeHRDY2ssIHJhdGVFeHRPZmRtLAorICAgIEFyNTQxNlJhdGVTaXplCit9IEFSNTQxNl9SQVRFUzsKKwordHlwZWRlZiBzdHJ1Y3QgZWVwRmxhZ3MgeworICAgIEFfVUlOVDggIG9wRmxhZ3M7CisgICAgQV9VSU5UOCAgZWVwTWlzYzsKK30gX19BVFRSSUJfUEFDSyBFRVBfRkxBR1M7CisKKyNkZWZpbmUgQVI1NDE2X0NIRUNLU1VNX0xPQ0FUSU9OIChBUjU0MTZfRUVQX1NUQVJUX0xPQyArIDEpCit0eXBlZGVmIHN0cnVjdCBCYXNlRWVwSGVhZGVyIHsKKyAgICBBX1VJTlQxNiAgbGVuZ3RoOworICAgIEFfVUlOVDE2ICBjaGVja3N1bTsKKyAgICBBX1VJTlQxNiAgdmVyc2lvbjsKKyAgICBFRVBfRkxBR1Mgb3BDYXBGbGFnczsKKyAgICBBX1VJTlQxNiAgcmVnRG1uWzJdOworICAgIEFfVUlOVDggICBtYWNBZGRyWzZdOworICAgIEFfVUlOVDggICByeE1hc2s7CisgICAgQV9VSU5UOCAgIHR4TWFzazsKKyAgICBBX1VJTlQxNiAgcmZTaWxlbnQ7CisgICAgQV9VSU5UMTYgIGJsdWVUb290aE9wdGlvbnM7CisgICAgQV9VSU5UMTYgIGRldmljZUNhcDsKKyAgICBBX1VJTlQzMiAgYmluQnVpbGROdW1iZXI7CisgICAgQV9VSU5UOCAgIGRldmljZVR5cGU7CisgICAgQV9VSU5UOCAgIGZ1dHVyZUJhc2VbMzNdOworfSBfX0FUVFJJQl9QQUNLIEJBU0VfRUVQX0hFQURFUjsgLy8gNjQgQgorCit0eXBlZGVmIHN0cnVjdCBzcHVyQ2hhblN0cnVjdCB7CisgICAgQV9VSU5UMTYgc3B1ckNoYW47CisgICAgQV9VSU5UOCAgc3B1clJhbmdlTG93OworICAgIEFfVUlOVDggIHNwdXJSYW5nZUhpZ2g7Cit9IF9fQVRUUklCX1BBQ0sgU1BVUl9DSEFOOworCit0eXBlZGVmIHN0cnVjdCBNb2RhbEVlcEhlYWRlciB7CisgICAgQV9VSU5UMzIgIGFudEN0cmxDaGFpbltBUjU0MTZfTUFYX0NIQUlOU107ICAgICAgIC8vIDEyCisgICAgQV9VSU5UMzIgIGFudEN0cmxDb21tb247ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDQKKyAgICBBX0lOVDggICAgYW50ZW5uYUdhaW5DaFtBUjU0MTZfTUFYX0NIQUlOU107ICAgICAgLy8gMworICAgIEFfVUlOVDggICBzd2l0Y2hTZXR0bGluZzsgICAgICAgICAgICAgICAgICAgICAgICAvLyAxCisgICAgQV9VSU5UOCAgIHR4UnhBdHRlbkNoW0FSNTQxNl9NQVhfQ0hBSU5TXTsgICAgICAgIC8vIDMKKyAgICBBX1VJTlQ4ICAgcnhUeE1hcmdpbkNoW0FSNTQxNl9NQVhfQ0hBSU5TXTsgICAgICAgLy8gMworICAgIEFfSU5UOCAgICBhZGNEZXNpcmVkU2l6ZTsgICAgICAgICAgICAgICAgICAgICAgICAvLyAxCisgICAgQV9JTlQ4ICAgIHBnYURlc2lyZWRTaXplOyAgICAgICAgICAgICAgICAgICAgICAgIC8vIDEKKyAgICBBX1VJTlQ4ICAgeGxuYUdhaW5DaFtBUjU0MTZfTUFYX0NIQUlOU107ICAgICAgICAgLy8gMworICAgIEFfVUlOVDggICB0eEVuZFRvWHBhT2ZmOyAgICAgICAgICAgICAgICAgICAgICAgICAvLyAxCisgICAgQV9VSU5UOCAgIHR4RW5kVG9SeE9uOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDEKKyAgICBBX1VJTlQ4ICAgdHhGcmFtZVRvWHBhT247ICAgICAgICAgICAgICAgICAgICAgICAgLy8gMQorICAgIEFfVUlOVDggICB0aHJlc2g2MjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAxCisgICAgQV9JTlQ4ICAgIG5vaXNlRmxvb3JUaHJlc2hDaFtBUjU0MTZfTUFYX0NIQUlOU107IC8vIDMKKyAgICBBX1VJTlQ4ICAgeHBkR2FpbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMQorICAgIEFfVUlOVDggICB4cGQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAxCisgICAgQV9JTlQ4ICAgIGlxQ2FsSUNoW0FSNTQxNl9NQVhfQ0hBSU5TXTsgICAgICAgICAgIC8vIDEKKyAgICBBX0lOVDggICAgaXFDYWxRQ2hbQVI1NDE2X01BWF9DSEFJTlNdOyAgICAgICAgICAgLy8gMQorICAgIEFfVUlOVDggICBwZEdhaW5PdmVybGFwOyAgICAgICAgICAgICAgICAgICAgICAgICAvLyAxCisgICAgQV9VSU5UOCAgIG9iOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDEKKyAgICBBX1VJTlQ4ICAgZGI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMQorICAgIEFfVUlOVDggICB4cGFCaWFzTHZsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAxCisgICAgQV9VSU5UOCAgIHB3ckRlY3JlYXNlRm9yMkNoYWluOyAgICAgICAgICAgICAgICAgIC8vIDEKKyAgICBBX1VJTlQ4ICAgcHdyRGVjcmVhc2VGb3IzQ2hhaW47ICAgICAgICAgICAgICAgICAgLy8gMSAtPiA0OCBCCisgICAgQV9VSU5UOCAgIHR4RnJhbWVUb0RhdGFTdGFydDsgICAgICAgICAgICAgICAgICAgIC8vIDEKKyAgICBBX1VJTlQ4ICAgdHhGcmFtZVRvUGFPbjsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMQorICAgIEFfVUlOVDggICBodDQwUG93ZXJJbmNGb3JQZGFkYzsgICAgICAgICAgICAgICAgICAvLyAxCisgICAgQV9VSU5UOCAgIGJzd0F0dGVuW0FSNTQxNl9NQVhfQ0hBSU5TXTsgICAgICAgICAgIC8vIDMKKyAgICBBX1VJTlQ4ICAgYnN3TWFyZ2luW0FSNTQxNl9NQVhfQ0hBSU5TXTsgICAgICAgICAgLy8gMworICAgIEFfVUlOVDggICBzd1NldHRsZUh0NDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAxCisgICAgQV9VSU5UOCAgIGZ1dHVyZU1vZGFsWzIyXTsgICAgICAgICAgICAgICAgICAgICAgIC8vCisgICAgU1BVUl9DSEFOIHNwdXJDaGFuc1tBUjU0MTZfRUVQUk9NX01PREFMX1NQVVJTXTsgIC8vIDIwIEIKK30gX19BVFRSSUJfUEFDSyBNT0RBTF9FRVBfSEVBREVSOyAgICAgICAgICAgICAgICAgICAgLy8gPT0gMTAwIEIKKwordHlwZWRlZiBzdHJ1Y3QgY2FsRGF0YVBlckZyZXEgeworICAgIEFfVUlOVDggcHdyUGRnW0FSNTQxNl9OVU1fUERfR0FJTlNdW0FSNTQxNl9QRF9HQUlOX0lDRVBUU107CisgICAgQV9VSU5UOCB2cGRQZGdbQVI1NDE2X05VTV9QRF9HQUlOU11bQVI1NDE2X1BEX0dBSU5fSUNFUFRTXTsKK30gX19BVFRSSUJfUEFDSyBDQUxfREFUQV9QRVJfRlJFUTsKKwordHlwZWRlZiBzdHJ1Y3QgQ2FsVGFyZ2V0UG93ZXJMZWdhY3kgeworICAgIEFfVUlOVDggIGJDaGFubmVsOworICAgIEFfVUlOVDggIHRQb3cyeFs0XTsKK30gX19BVFRSSUJfUEFDSyBDQUxfVEFSR0VUX1BPV0VSX0xFRzsKKwordHlwZWRlZiBzdHJ1Y3QgQ2FsVGFyZ2V0UG93ZXJIdCB7CisgICAgQV9VSU5UOCAgYkNoYW5uZWw7CisgICAgQV9VSU5UOCAgdFBvdzJ4WzhdOworfSBfX0FUVFJJQl9QQUNLIENBTF9UQVJHRVRfUE9XRVJfSFQ7CisKKyNpZiBkZWZpbmVkKEFSQ0hfQklHX0VORElBTikgfHwgZGVmaW5lZChCSUdfRU5ESUFOKQordHlwZWRlZiBzdHJ1Y3QgQ2FsQ3RsRWRnZXMgeworICAgIEFfVUlOVDggIGJDaGFubmVsOworICAgIEFfVUlOVDggIGZsYWcgICA6MiwKKyAgICAgICAgICAgICB0UG93ZXIgOjY7Cit9IF9fQVRUUklCX1BBQ0sgQ0FMX0NUTF9FREdFUzsKKyNlbHNlCit0eXBlZGVmIHN0cnVjdCBDYWxDdGxFZGdlcyB7CisgICAgQV9VSU5UOCAgYkNoYW5uZWw7CisgICAgQV9VSU5UOCAgdFBvd2VyIDo2LAorICAgICAgICAgICAgIGZsYWcgICA6MjsKK30gX19BVFRSSUJfUEFDSyBDQUxfQ1RMX0VER0VTOworI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IENhbEN0bERhdGEgeworICAgIENBTF9DVExfRURHRVMgIGN0bEVkZ2VzW0FSNTQxNl9NQVhfQ0hBSU5TXVtBUjU0MTZfTlVNX0JBTkRfRURHRVNdOworfSBfX0FUVFJJQl9QQUNLIENBTF9DVExfREFUQTsKKwordHlwZWRlZiBzdHJ1Y3QgYXI1NDE2RWVwcm9tIHsKKyAgICBCQVNFX0VFUF9IRUFERVIgICAgYmFzZUVlcEhlYWRlcjsgICAgICAgICAvLyA2NCBCCisgICAgQV9VSU5UOCAgIGN1c3REYXRhWzY0XTsgICAgICAgICAgICAgICAgICAgLy8gNjQgQgorICAgIE1PREFMX0VFUF9IRUFERVIgICBtb2RhbEhlYWRlclsyXTsgICAgICAgIC8vIDIwMCBCCisgICAgQV9VSU5UOCAgICAgICAgICAgIGNhbEZyZXFQaWVyNUdbQVI1NDE2X05VTV81R19DQUxfUElFUlNdOworICAgIEFfVUlOVDggICAgICAgICAgICBjYWxGcmVxUGllcjJHW0FSNTQxNl9OVU1fMkdfQ0FMX1BJRVJTXTsKKyAgICBDQUxfREFUQV9QRVJfRlJFUSAgY2FsUGllckRhdGE1R1tBUjU0MTZfTUFYX0NIQUlOU11bQVI1NDE2X05VTV81R19DQUxfUElFUlNdOworICAgIENBTF9EQVRBX1BFUl9GUkVRICBjYWxQaWVyRGF0YTJHW0FSNTQxNl9NQVhfQ0hBSU5TXVtBUjU0MTZfTlVNXzJHX0NBTF9QSUVSU107CisgICAgQ0FMX1RBUkdFVF9QT1dFUl9MRUcgY2FsVGFyZ2V0UG93ZXI1R1tBUjU0MTZfTlVNXzVHXzIwX1RBUkdFVF9QT1dFUlNdOworICAgIENBTF9UQVJHRVRfUE9XRVJfSFQgIGNhbFRhcmdldFBvd2VyNUdIVDIwW0FSNTQxNl9OVU1fNUdfMjBfVEFSR0VUX1BPV0VSU107CisgICAgQ0FMX1RBUkdFVF9QT1dFUl9IVCAgY2FsVGFyZ2V0UG93ZXI1R0hUNDBbQVI1NDE2X05VTV81R180MF9UQVJHRVRfUE9XRVJTXTsKKyAgICBDQUxfVEFSR0VUX1BPV0VSX0xFRyBjYWxUYXJnZXRQb3dlckNja1tBUjU0MTZfTlVNXzJHX0NDS19UQVJHRVRfUE9XRVJTXTsKKyAgICBDQUxfVEFSR0VUX1BPV0VSX0xFRyBjYWxUYXJnZXRQb3dlcjJHW0FSNTQxNl9OVU1fMkdfMjBfVEFSR0VUX1BPV0VSU107CisgICAgQ0FMX1RBUkdFVF9QT1dFUl9IVCAgY2FsVGFyZ2V0UG93ZXIyR0hUMjBbQVI1NDE2X05VTV8yR18yMF9UQVJHRVRfUE9XRVJTXTsKKyAgICBDQUxfVEFSR0VUX1BPV0VSX0hUICBjYWxUYXJnZXRQb3dlcjJHSFQ0MFtBUjU0MTZfTlVNXzJHXzQwX1RBUkdFVF9QT1dFUlNdOworICAgIEFfVUlOVDggICAgICAgICAgICBjdGxJbmRleFtBUjU0MTZfTlVNX0NUTFNdOworICAgIENBTF9DVExfREFUQSAgICAgICBjdGxEYXRhW0FSNTQxNl9OVU1fQ1RMU107CisgICAgQV9VSU5UOCAgICAgICAgICAgIHBhZGRpbmc7Cit9IF9fQVRUUklCX1BBQ0sgQVI1NDE2X0VFUFJPTTsKKworI3ByYWdtYSBwYWNrIChwb3ApCisKK3R5cGVkZWYgZW51bSBDb25mb3JtYW5jZVRlc3RMaW1pdHMgeworICAgIEZDQyAgICAgICAgPSAweDEwLAorICAgIE1LSyAgICAgICAgPSAweDQwLAorICAgIEVUU0kgICAgICAgPSAweDMwLAorICAgIFNEX05PX0NUTCAgPSAweEUwLAorICAgIE5PX0NUTCAgICAgPSAweEZGLAorICAgIENUTF9NT0RFX00gPSAweEYsCisgICAgQ1RMXzExQSAgICA9IDAsCisgICAgQ1RMXzExQiAgICA9IDEsCisgICAgQ1RMXzExRyAgICA9IDIsCisgICAgQ1RMX1RVUkJPICA9IDMsCisgICAgQ1RMXzEwOEcgICA9IDQsCisgICAgQ1RMXzJHSFQyMCA9IDUsCisgICAgQ1RMXzVHSFQyMCA9IDYsCisgICAgQ1RMXzJHSFQ0MCA9IDcsCisgICAgQ1RMXzVHSFQ0MCA9IDgsCit9IEFUSF9DVExTOworCisjZW5kaWYgLyogI2lmbmRlZiBfSFBVU0JfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvaGFsL290dXMuaW5pIGIvZHJpdmVycy9zdGFnaW5nL290dXMvaGFsL290dXMuaW5pCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0ZWZlYjYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy9oYWwvb3R1cy5pbmkKQEAgLTAsMCArMSw0MTQgQEAKKy8qIDg2MDIgOiB1cGRhdGUgbWlzbWF0Y2ggcmVnaXN0ZXIgYmV0d2VlbiBORElTIGFuZCBBUlQgKi8KK3N0YXRpYyBjb25zdCB1MzJfdCBhcjU0MTZNb2Rlc1tdWzZdID0geworLyogUmVnaXN0ZXIgICBBLTIwICAgICAgICBBLTIwLzQwICAgICBHLTIwLzQwICAgICBHLTIwICAgICAgICBHLVR1cmJvICAgICovCisgICAgIHsweDk4MDAsIDB4MDAwMDAwMDcsIDB4MDAwMDAwMDcsIDB4MDAwMDAwMDcsIDB4MDAwMDAwMDcsIDB9LAorICAgICB7MHg5ODA0LCAweDAwMDAwMzAwLCAweDAwMDAwM2M0LCAweDAwMDAwM2M0LCAweDAwMDAwMzAwLCAwfSwKKyAgICAgezB4OTgwOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMH0sCisgICAgIHsweDk4MGMsIDB4YWQ4NDhlMTksIDB4YWQ4NDhlMTksIDB4YWQ4NDhlMTksIDB4YWQ4NDhlMTksIDB9LAorICAgICB7MHg5ODEwLCAweDdkMTRlMDAwLCAweDdkMTRlMDAwLCAweDdkMTRlMDAwLCAweDdkMTRlMDAwLCAwfSwKKyAgICAgezB4OTgxNCwgMHg5YzBhOWY2YiwgMHg5YzBhOWY2YiwgMHg5YzBhOWY2YiwgMHg5YzBhOWY2YiwgMH0sCisgICAgIHsweDk4MTgsIDB4MDAwMDAwOTAsIDB4MDAwMDAwOTAsIDB4MDAwMDAwOTAsIDB4MDAwMDAwOTAsIDB9LAorICAgICB7MHg5ODFjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAwfSwKKyAgICAgezB4OTgyMCwgMHgwMjAyMDIwMCwgMHgwMjAyMDIwMCwgMHgwMjAyMDIwMCwgMHgwMjAyMDIwMCwgMH0sCisgICAgIHsweDk4MjQsIDB4MDAwMDBlMGUsIDB4MDAwMDBlMGUsIDB4MDAwMDBlMGUsIDB4MDAwMDBlMGUsIDB9LAorICAgICB7MHg5ODI4LCAweDBhMDIwMDAxLCAweDBhMDIwMDAxLCAweDBhMDIwMDAxLCAweDBhMDIwMDAxLCAwfSwKKyAgICAgezB4OTgyYywgMHgwMDAwYTAwMCwgMHgwMDAwYTAwMCwgMHgwMDAwYTAwMCwgMHgwMDAwYTAwMCwgMH0sCisgICAgIHsweDk4MzAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB9LAorICAgICB7MHg5ODM0LCAweDAwMDAwZTBlLCAweDAwMDAwZTBlLCAweDAwMDAwZTBlLCAweDAwMDAwZTBlLCAwfSwKKyAgICAgezB4OTgzOCwgMHgwMDAwMDAwNywgMHgwMDAwMDAwNywgMHgwMDAwMDAwNywgMHgwMDAwMDAwNywgMH0sCisgICAgIHsweDk4M2MsIDB4MDAyMDA0MDAsIDB4MDAyMDA0MDAsIDB4MDAyMDA0MDAsIDB4MDAyMDA0MDAsIDB9LAorICAgICB7MHg5ODQwLCAweDIwNmEwMDJlLCAweDIwNmEwMDJlLCAweDIwNmEwMDJlLCAweDIwNmEwMDJlLCAwfSwKKyAgICAgezB4OTg0NCwgMHgxMzcyMTYxZSwgMHgxMzcyMWMxZSwgMHgxMzcyMWMyNCwgMHgxMzcyMTZhNCwgMH0sCisgICAgIHsweDk4NDgsIDB4MDAxYTZhNjUsIDB4MDAxYTZhNjUsIDB4MDAxOTdhNjgsIDB4MDAxOTdhNjgsIDB9LAorICAgICB7MHg5ODRjLCAweDEyODQyMzNjLCAweDEyODQyMzNjLCAweDEyODQyMzNjLCAweDEyODQyMzNjLCAwfSwKKyAgICAgezB4OTg1MCwgMHg2YzQ4YjRlNCwgMHg2YzQ4YjRlNCwgMHg2YzQ4YjBlNCwgMHg2YzQ4YjBlNCwgMH0sCisgICAgIHsweDk4NTQsIDB4MDAwMDA4NTksIDB4MDAwMDA4NTksIDB4MDAwMDA4NTksIDB4MDAwMDA4NTksIDB9LAorICAgICB7MHg5ODU4LCAweDdlYzgwZDJlLCAweDdlYzgwZDJlLCAweDdlYzgwZDJlLCAweDdlYzgwZDJlLCAwfSwKKyAgICAgezB4OTg1YywgMHgzMTM5NWM1ZSwgMHgzMTM5NWM1ZSwgMHgzMTM5NWM1ZSwgMHgzMTM5NWM1ZSwgMH0sCisgICAgIHsweDk4NjAsIDB4MDAwNGRkMTAsIDB4MDAwNGRkMTAsIDB4MDAwNGRkMjAsIDB4MDAwNGRkMjAsIDB9LAorICAgICB7MHg5ODY4LCAweDQwOWE0MTkwLCAweDQwOWE0MTkwLCAweDQwOWE0MTkwLCAweDQwOWE0MTkwLCAwfSwKKyAgICAgezB4OTg2YywgMHgwNTBjYjA4MSwgMHgwNTBjYjA4MSwgMHgwNTBjYjA4MSwgMHgwNTBjYjA4MSwgMH0sCisgICAgIHsweDk5MDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB9LAorICAgICB7MHg5OTA0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAwfSwKKyAgICAgezB4OTkwOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMH0sCisgICAgIHsweDk5MGMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB9LAorICAgICB7MHg5OTE0LCAweDAwMDAwN2QwLCAweDAwMDAwN2QwLCAweDAwMDAwODk4LCAweDAwMDAwODk4LCAwfSwKKyAgICAgezB4OTkxOCwgMHgwMDAwMDExOCwgMHgwMDAwMDIzMCwgMHgwMDAwMDI2OCwgMHgwMDAwMDEzNCwgMH0sCisgICAgIHsweDk5MWMsIDB4MTAwMDBmZmYsIDB4MTAwMDBmZmYsIDB4MTAwMDBmZmYsIDB4MTAwMDBmZmYsIDB9LAorICAgICB7MHg5OTIwLCAweDA1MTAwODFjLCAweDA1MTAwODFjLCAweDA1MTAwMDFjLCAweDA1MTAwMDFjLCAwfSwKKyAgICAgezB4OTkyNCwgMHhkMDA1OGExNSwgMHhkMDA1OGExNSwgMHhkMDA1OGExNSwgMHhkMDA1OGExNSwgMH0sCisgICAgIHsweDk5MjgsIDB4MDAwMDAwMDEsIDB4MDAwMDAwMDEsIDB4MDAwMDAwMDEsIDB4MDAwMDAwMDEsIDB9LAorICAgICB7MHg5OTJjLCAweDAwMDAwMDA0LCAweDAwMDAwMDA0LCAweDAwMDAwMDA0LCAweDAwMDAwMDA0LCAwfSwKKyAgICAgezB4OTkzNCwgMHgzZjNmM2YzZiwgMHgzZjNmM2YzZiwgMHgzZjNmM2YzZiwgMHgzZjNmM2YzZiwgMH0sCisgICAgIHsweDk5MzgsIDB4M2YzZjNmM2YsIDB4M2YzZjNmM2YsIDB4M2YzZjNmM2YsIDB4M2YzZjNmM2YsIDB9LAorICAgICB7MHg5OTNjLCAweDAwMDAwMDdmLCAweDAwMDAwMDdmLCAweDAwMDAwMDdmLCAweDAwMDAwMDdmLCAwfSwKKyAgICAgezB4OTk0NCwgMHhkZmI4MTAyMCwgMHhkZmI4MTAyMCwgMHhkZmI4MTAyMCwgMHhkZmI4MTAyMCwgMH0sCisgICAgIHsweDk5NDgsIDB4OTI4MGIyMTIsIDB4OTI4MGIyMTIsIDB4OTI4MGIyMTIsIDB4OTI4MGIyMTIsIDB9LAorICAgICB7MHg5OTRjLCAweDAwMDIwMDI4LCAweDAwMDIwMDI4LCAweDAwMDIwMDI4LCAweDAwMDIwMDI4LCAwfSwKKyAgICAgezB4OTk1NCwgMHg1ZDUwZTE4OCwgMHg1ZDUwZTE4OCwgMHg1ZDUwZTE4OCwgMHg1ZDUwZTE4OCwgMH0sCisgICAgIHsweDk5NTgsIDB4MDAwODFmZmYsIDB4MDAwODFmZmYsIDB4MDAwODFmZmYsIDB4MDAwODFmZmYsIDB9LAorICAgICB7MHg5OTYwLCAweDAwMDA5YjQwLCAweDAwMDA5YjQwLCAweDAwMDA5YjQwLCAweDAwMDA5YjQwLCAwfSwKKyAgICAgezB4OTk2NCwgMHgwMDAwMTEyMCwgMHgwMDAwMTEyMCwgMHgwMDAwMTEyMCwgMHgwMDAwMTEyMCwgMH0sCisgICAgIHsweDk5NzAsIDB4MTkwZmI1MTUsIDB4MTkwZmI1MTUsIDB4MTkwZmI1MTUsIDB4MTkwZmI1MTUsIDB9LAorICAgICB7MHg5OTc0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAwfSwKKyAgICAgezB4OTk3OCwgMHgwMDAwMDAwMSwgMHgwMDAwMDAwMSwgMHgwMDAwMDAwMSwgMHgwMDAwMDAwMSwgMH0sCisgICAgIHsweDk5N2MsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB9LAorICAgICB7MHg5OTgwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAwfSwKKyAgICAgezB4OTk4NCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMH0sCisgICAgIHsweDk5ODgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB9LAorICAgICB7MHg5OThjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAwfSwKKyAgICAgezB4OTk5MCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMH0sCisgICAgIHsweDk5OTQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB9LAorICAgICB7MHg5OTk4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAwfSwKKyAgICAgezB4OTk5YywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMH0sCisgICAgIHsweDk5YTAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB9LAorICAgICB7MHg5OWE0LCAweDAwMDAwMDA3LCAweDAwMDAwMDA3LCAweDAwMDAwMDA3LCAweDAwMDAwMDA3LCAwfSwKKyAgICAgezB4OTlhOCwgMHgwMDFmZmYwMCwgMHgwMDFmZmYwMCwgMHgwMDFmZmYwMCwgMHgwMDFmZmYwMCwgMH0sCisgICAgIHsweDk5YWMsIDB4MDA2ZjAwYzQsIDB4MDA2ZjAwYzQsIDB4MDA2ZjAwYzQsIDB4MDA2ZjAwYzQsIDB9LAorICAgICB7MHg5OWIwLCAweDAzMDUxMDAwLCAweDAzMDUxMDAwLCAweDAzMDUxMDAwLCAweDAzMDUxMDAwLCAwfSwKKyAgICAgezB4OTliNCwgMHgwMDAwMDgyMCwgMHgwMDAwMDgyMCwgMHgwMDAwMDgyMCwgMHgwMDAwMDgyMCwgMH0sCisgICAgIHsweDk5YzAsIDB4MDM4OTE5YmUsIDB4MDM4OTE5YmUsIDB4MDM4OTE5YmUsIDB4MDM4OTE5YmUsIDB9LAorICAgICB7MHg5OWM0LCAweDA2MzM2Zjc3LCAweDA2MzM2Zjc3LCAweDA2MzM2Zjc3LCAweDA2MzM2Zjc3LCAwfSwKKyAgICAgezB4OTljOCwgMHg2MGY2NTMyYywgMHg2MGY2NTMyYywgMHg2MGY2NTMyYywgMHg2MGY2NTMyYywgMH0sCisgICAgIHsweDk5Y2MsIDB4MDhmMTg2YzgsIDB4MDhmMTg2YzgsIDB4MDhmMTg2YzgsIDB4MDhmMTg2YzgsIDB9LAorICAgICB7MHg5OWQwLCAweDAwMDQ2Mzg0LCAweDAwMDQ2Mzg0LCAweDAwMDQ2Mzg0LCAweDAwMDQ2Mzg0LCAwfSwKKyAgICAgezB4OTlkNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMH0sCisgICAgIHsweDk5ZDgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB9LAorICAgICB7MHg5OWRjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAwfSwKKyAgICAgezB4OTllMCwgMHgwMDAwMDIwMCwgMHgwMDAwMDIwMCwgMHgwMDAwMDIwMCwgMHgwMDAwMDIwMCwgMH0sCisgICAgIHsweDk5ZTQsIDB4NjQ2NDY0NjQsIDB4NjQ2NDY0NjQsIDB4NjQ2NDY0NjQsIDB4NjQ2NDY0NjQsIDB9LAorICAgICB7MHg5OWU4LCAweDNjNzg3ODc4LCAweDNjNzg3ODc4LCAweDNjNzg3ODc4LCAweDNjNzg3ODc4LCAwfSwKKyAgICAgezB4OTllYywgMHgwMDAwMDBhYSwgMHgwMDAwMDBhYSwgMHgwMDAwMDBhYSwgMHgwMDAwMDBhYSwgMH0sCisgICAgIHsweDk5ZjAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB9LAorICAgICB7MHg5OWZjLCAweDAwMDAxMDQyLCAweDAwMDAxMDQyLCAweDAwMDAxMDQyLCAweDAwMDAxMDQyLCAwfSwKKyAgICAgezB4OWEwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMH0sCisgICAgIHsweDlhMDQsIDB4MDAwMDAwNDAsIDB4MDAwMDAwNDAsIDB4MDAwMDAwNDAsIDB4MDAwMDAwNDAsIDB9LAorICAgICB7MHg5YTA4LCAweDAwMDAwMDgwLCAweDAwMDAwMDgwLCAweDAwMDAwMDgwLCAweDAwMDAwMDgwLCAwfSwKKyAgICAgezB4OWEwYywgMHgwMDAwMDFhMSwgMHgwMDAwMDFhMSwgMHgwMDAwMDE0MSwgMHgwMDAwMDE0MSwgMH0sCisgICAgIHsweDlhMTAsIDB4MDAwMDAxZTEsIDB4MDAwMDAxZTEsIDB4MDAwMDAxODEsIDB4MDAwMDAxODEsIDB9LAorICAgICB7MHg5YTE0LCAweDAwMDAwMDIxLCAweDAwMDAwMDIxLCAweDAwMDAwMWMxLCAweDAwMDAwMWMxLCAwfSwKKyAgICAgezB4OWExOCwgMHgwMDAwMDA2MSwgMHgwMDAwMDA2MSwgMHgwMDAwMDAwMSwgMHgwMDAwMDAwMSwgMH0sCisgICAgIHsweDlhMWMsIDB4MDAwMDAxNjgsIDB4MDAwMDAxNjgsIDB4MDAwMDAwNDEsIDB4MDAwMDAwNDEsIDB9LAorICAgICB7MHg5YTIwLCAweDAwMDAwMWE4LCAweDAwMDAwMWE4LCAweDAwMDAwMWE4LCAweDAwMDAwMWE4LCAwfSwKKyAgICAgezB4OWEyNCwgMHgwMDAwMDFlOCwgMHgwMDAwMDFlOCwgMHgwMDAwMDFlOCwgMHgwMDAwMDFlOCwgMH0sCisgICAgIHsweDlhMjgsIDB4MDAwMDAwMjgsIDB4MDAwMDAwMjgsIDB4MDAwMDAwMjgsIDB4MDAwMDAwMjgsIDB9LAorICAgICB7MHg5YTJjLCAweDAwMDAwMDY4LCAweDAwMDAwMDY4LCAweDAwMDAwMDY4LCAweDAwMDAwMDY4LCAwfSwKKyAgICAgezB4OWEzMCwgMHgwMDAwMDE4OSwgMHgwMDAwMDE4OSwgMHgwMDAwMDBhOCwgMHgwMDAwMDBhOCwgMH0sCisgICAgIHsweDlhMzQsIDB4MDAwMDAxYzksIDB4MDAwMDAxYzksIDB4MDAwMDAxNjksIDB4MDAwMDAxNjksIDB9LAorICAgICB7MHg5YTM4LCAweDAwMDAwMDA5LCAweDAwMDAwMDA5LCAweDAwMDAwMWE5LCAweDAwMDAwMWE5LCAwfSwKKyAgICAgezB4OWEzYywgMHgwMDAwMDA0OSwgMHgwMDAwMDA0OSwgMHgwMDAwMDFlOSwgMHgwMDAwMDFlOSwgMH0sCisgICAgIHsweDlhNDAsIDB4MDAwMDAwODksIDB4MDAwMDAwODksIDB4MDAwMDAwMjksIDB4MDAwMDAwMjksIDB9LAorICAgICB7MHg5YTQ0LCAweDAwMDAwMTcwLCAweDAwMDAwMTcwLCAweDAwMDAwMDY5LCAweDAwMDAwMDY5LCAwfSwKKyAgICAgezB4OWE0OCwgMHgwMDAwMDFiMCwgMHgwMDAwMDFiMCwgMHgwMDAwMDE5MCwgMHgwMDAwMDE5MCwgMH0sCisgICAgIHsweDlhNGMsIDB4MDAwMDAxZjAsIDB4MDAwMDAxZjAsIDB4MDAwMDAxZDAsIDB4MDAwMDAxZDAsIDB9LAorICAgICB7MHg5YTUwLCAweDAwMDAwMDMwLCAweDAwMDAwMDMwLCAweDAwMDAwMDEwLCAweDAwMDAwMDEwLCAwfSwKKyAgICAgezB4OWE1NCwgMHgwMDAwMDA3MCwgMHgwMDAwMDA3MCwgMHgwMDAwMDA1MCwgMHgwMDAwMDA1MCwgMH0sCisgICAgIHsweDlhNTgsIDB4MDAwMDAxOTEsIDB4MDAwMDAxOTEsIDB4MDAwMDAwOTAsIDB4MDAwMDAwOTAsIDB9LAorICAgICB7MHg5YTVjLCAweDAwMDAwMWQxLCAweDAwMDAwMWQxLCAweDAwMDAwMTUxLCAweDAwMDAwMTUxLCAwfSwKKyAgICAgezB4OWE2MCwgMHgwMDAwMDAxMSwgMHgwMDAwMDAxMSwgMHgwMDAwMDE5MSwgMHgwMDAwMDE5MSwgMH0sCisgICAgIHsweDlhNjQsIDB4MDAwMDAwNTEsIDB4MDAwMDAwNTEsIDB4MDAwMDAxZDEsIDB4MDAwMDAxZDEsIDB9LAorICAgICB7MHg5YTY4LCAweDAwMDAwMDkxLCAweDAwMDAwMDkxLCAweDAwMDAwMDExLCAweDAwMDAwMDExLCAwfSwKKyAgICAgezB4OWE2YywgMHgwMDAwMDFiOCwgMHgwMDAwMDFiOCwgMHgwMDAwMDA1MSwgMHgwMDAwMDA1MSwgMH0sCisgICAgIHsweDlhNzAsIDB4MDAwMDAxZjgsIDB4MDAwMDAxZjgsIDB4MDAwMDAxOTgsIDB4MDAwMDAxOTgsIDB9LAorICAgICB7MHg5YTc0LCAweDAwMDAwMDM4LCAweDAwMDAwMDM4LCAweDAwMDAwMWQ4LCAweDAwMDAwMWQ4LCAwfSwKKyAgICAgezB4OWE3OCwgMHgwMDAwMDA3OCwgMHgwMDAwMDA3OCwgMHgwMDAwMDAxOCwgMHgwMDAwMDAxOCwgMH0sCisgICAgIHsweDlhN2MsIDB4MDAwMDAxOTksIDB4MDAwMDAxOTksIDB4MDAwMDAwNTgsIDB4MDAwMDAwNTgsIDB9LAorICAgICB7MHg5YTgwLCAweDAwMDAwMWQ5LCAweDAwMDAwMWQ5LCAweDAwMDAwMDk4LCAweDAwMDAwMDk4LCAwfSwKKyAgICAgezB4OWE4NCwgMHgwMDAwMDAxOSwgMHgwMDAwMDAxOSwgMHgwMDAwMDE1OSwgMHgwMDAwMDE1OSwgMH0sCisgICAgIHsweDlhODgsIDB4MDAwMDAwNTksIDB4MDAwMDAwNTksIDB4MDAwMDAxOTksIDB4MDAwMDAxOTksIDB9LAorICAgICB7MHg5YThjLCAweDAwMDAwMDk5LCAweDAwMDAwMDk5LCAweDAwMDAwMWQ5LCAweDAwMDAwMWQ5LCAwfSwKKyAgICAgezB4OWE5MCwgMHgwMDAwMDBkOSwgMHgwMDAwMDBkOSwgMHgwMDAwMDAxOSwgMHgwMDAwMDAxOSwgMH0sCisgICAgIHsweDlhOTQsIDB4MDAwMDAwZjksIDB4MDAwMDAwZjksIDB4MDAwMDAwNTksIDB4MDAwMDAwNTksIDB9LAorICAgICB7MHg5YTk4LCAweDAwMDAwMGY5LCAweDAwMDAwMGY5LCAweDAwMDAwMDk5LCAweDAwMDAwMDk5LCAwfSwKKyAgICAgezB4OWE5YywgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSwgMHgwMDAwMDBkOSwgMHgwMDAwMDBkOSwgMH0sCisgICAgIHsweDlhYTAsIDB4MDAwMDAwZjksIDB4MDAwMDAwZjksIDB4MDAwMDAwZjksIDB4MDAwMDAwZjksIDB9LAorICAgICB7MHg5YWE0LCAweDAwMDAwMGY5LCAweDAwMDAwMGY5LCAweDAwMDAwMGY5LCAweDAwMDAwMGY5LCAwfSwKKyAgICAgezB4OWFhOCwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSwgMH0sCisgICAgIHsweDlhYWMsIDB4MDAwMDAwZjksIDB4MDAwMDAwZjksIDB4MDAwMDAwZjksIDB4MDAwMDAwZjksIDB9LAorICAgICB7MHg5YWIwLCAweDAwMDAwMGY5LCAweDAwMDAwMGY5LCAweDAwMDAwMGY5LCAweDAwMDAwMGY5LCAwfSwKKyAgICAgezB4OWFiNCwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSwgMH0sCisgICAgIHsweDlhYjgsIDB4MDAwMDAwZjksIDB4MDAwMDAwZjksIDB4MDAwMDAwZjksIDB4MDAwMDAwZjksIDB9LAorICAgICB7MHg5YWJjLCAweDAwMDAwMGY5LCAweDAwMDAwMGY5LCAweDAwMDAwMGY5LCAweDAwMDAwMGY5LCAwfSwKKyAgICAgezB4OWFjMCwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSwgMH0sCisgICAgIHsweDlhYzQsIDB4MDAwMDAwZjksIDB4MDAwMDAwZjksIDB4MDAwMDAwZjksIDB4MDAwMDAwZjksIDB9LAorICAgICB7MHg5YWM4LCAweDAwMDAwMGY5LCAweDAwMDAwMGY5LCAweDAwMDAwMGY5LCAweDAwMDAwMGY5LCAwfSwKKyAgICAgezB4OWFjYywgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSwgMH0sCisgICAgIHsweDlhZDAsIDB4MDAwMDAwZjksIDB4MDAwMDAwZjksIDB4MDAwMDAwZjksIDB4MDAwMDAwZjksIDB9LAorICAgICB7MHg5YWQ0LCAweDAwMDAwMGY5LCAweDAwMDAwMGY5LCAweDAwMDAwMGY5LCAweDAwMDAwMGY5LCAwfSwKKyAgICAgezB4OWFkOCwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSwgMH0sCisgICAgIHsweDlhZGMsIDB4MDAwMDAwZjksIDB4MDAwMDAwZjksIDB4MDAwMDAwZjksIDB4MDAwMDAwZjksIDB9LAorICAgICB7MHg5YWUwLCAweDAwMDAwMGY5LCAweDAwMDAwMGY5LCAweDAwMDAwMGY5LCAweDAwMDAwMGY5LCAwfSwKKyAgICAgezB4OWFlNCwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSwgMH0sCisgICAgIHsweDlhZTgsIDB4MDAwMDAwZjksIDB4MDAwMDAwZjksIDB4MDAwMDAwZjksIDB4MDAwMDAwZjksIDB9LAorICAgICB7MHg5YWVjLCAweDAwMDAwMGY5LCAweDAwMDAwMGY5LCAweDAwMDAwMGY5LCAweDAwMDAwMGY5LCAwfSwKKyAgICAgezB4OWFmMCwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSwgMH0sCisgICAgIHsweDlhZjQsIDB4MDAwMDAwZjksIDB4MDAwMDAwZjksIDB4MDAwMDAwZjksIDB4MDAwMDAwZjksIDB9LAorICAgICB7MHg5YWY4LCAweDAwMDAwMGY5LCAweDAwMDAwMGY5LCAweDAwMDAwMGY5LCAweDAwMDAwMGY5LCAwfSwKKyAgICAgezB4OWFmYywgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSwgMH0sCisgICAgIHsweDliMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB9LAorICAgICB7MHg5YjA0LCAweDAwMDAwMDAxLCAweDAwMDAwMDAxLCAweDAwMDAwMDAxLCAweDAwMDAwMDAxLCAwfSwKKyAgICAgezB4OWIwOCwgMHgwMDAwMDAwMiwgMHgwMDAwMDAwMiwgMHgwMDAwMDAwMiwgMHgwMDAwMDAwMiwgMH0sCisgICAgIHsweDliMGMsIDB4MDAwMDAwMDMsIDB4MDAwMDAwMDMsIDB4MDAwMDAwMDMsIDB4MDAwMDAwMDMsIDB9LAorICAgICB7MHg5YjEwLCAweDAwMDAwMDA0LCAweDAwMDAwMDA0LCAweDAwMDAwMDA0LCAweDAwMDAwMDA0LCAwfSwKKyAgICAgezB4OWIxNCwgMHgwMDAwMDAwNSwgMHgwMDAwMDAwNSwgMHgwMDAwMDAwNSwgMHgwMDAwMDAwNSwgMH0sCisgICAgIHsweDliMTgsIDB4MDAwMDAwMDgsIDB4MDAwMDAwMDgsIDB4MDAwMDAwMDgsIDB4MDAwMDAwMDgsIDB9LAorICAgICB7MHg5YjFjLCAweDAwMDAwMDA5LCAweDAwMDAwMDA5LCAweDAwMDAwMDA5LCAweDAwMDAwMDA5LCAwfSwKKyAgICAgezB4OWIyMCwgMHgwMDAwMDAwYSwgMHgwMDAwMDAwYSwgMHgwMDAwMDAwYSwgMHgwMDAwMDAwYSwgMH0sCisgICAgIHsweDliMjQsIDB4MDAwMDAwMGIsIDB4MDAwMDAwMGIsIDB4MDAwMDAwMGIsIDB4MDAwMDAwMGIsIDB9LAorICAgICB7MHg5YjI4LCAweDAwMDAwMDBjLCAweDAwMDAwMDBjLCAweDAwMDAwMDBjLCAweDAwMDAwMDBjLCAwfSwKKyAgICAgezB4OWIyYywgMHgwMDAwMDAwZCwgMHgwMDAwMDAwZCwgMHgwMDAwMDAwZCwgMHgwMDAwMDAwZCwgMH0sCisgICAgIHsweDliMzAsIDB4MDAwMDAwMTAsIDB4MDAwMDAwMTAsIDB4MDAwMDAwMTAsIDB4MDAwMDAwMTAsIDB9LAorICAgICB7MHg5YjM0LCAweDAwMDAwMDExLCAweDAwMDAwMDExLCAweDAwMDAwMDExLCAweDAwMDAwMDExLCAwfSwKKyAgICAgezB4OWIzOCwgMHgwMDAwMDAxMiwgMHgwMDAwMDAxMiwgMHgwMDAwMDAxMiwgMHgwMDAwMDAxMiwgMH0sCisgICAgIHsweDliM2MsIDB4MDAwMDAwMTMsIDB4MDAwMDAwMTMsIDB4MDAwMDAwMTMsIDB4MDAwMDAwMTMsIDB9LAorICAgICB7MHg5YjQwLCAweDAwMDAwMDE0LCAweDAwMDAwMDE0LCAweDAwMDAwMDE0LCAweDAwMDAwMDE0LCAwfSwKKyAgICAgezB4OWI0NCwgMHgwMDAwMDAxNSwgMHgwMDAwMDAxNSwgMHgwMDAwMDAxNSwgMHgwMDAwMDAxNSwgMH0sCisgICAgIHsweDliNDgsIDB4MDAwMDAwMTgsIDB4MDAwMDAwMTgsIDB4MDAwMDAwMTgsIDB4MDAwMDAwMTgsIDB9LAorICAgICB7MHg5YjRjLCAweDAwMDAwMDE5LCAweDAwMDAwMDE5LCAweDAwMDAwMDE5LCAweDAwMDAwMDE5LCAwfSwKKyAgICAgezB4OWI1MCwgMHgwMDAwMDAxYSwgMHgwMDAwMDAxYSwgMHgwMDAwMDAxYSwgMHgwMDAwMDAxYSwgMH0sCisgICAgIHsweDliNTQsIDB4MDAwMDAwMWIsIDB4MDAwMDAwMWIsIDB4MDAwMDAwMWIsIDB4MDAwMDAwMWIsIDB9LAorICAgICB7MHg5YjU4LCAweDAwMDAwMDFjLCAweDAwMDAwMDFjLCAweDAwMDAwMDFjLCAweDAwMDAwMDFjLCAwfSwKKyAgICAgezB4OWI1YywgMHgwMDAwMDAxZCwgMHgwMDAwMDAxZCwgMHgwMDAwMDAxZCwgMHgwMDAwMDAxZCwgMH0sCisgICAgIHsweDliNjAsIDB4MDAwMDAwMjAsIDB4MDAwMDAwMjAsIDB4MDAwMDAwMjAsIDB4MDAwMDAwMjAsIDB9LAorICAgICB7MHg5YjY0LCAweDAwMDAwMDIxLCAweDAwMDAwMDIxLCAweDAwMDAwMDIxLCAweDAwMDAwMDIxLCAwfSwKKyAgICAgezB4OWI2OCwgMHgwMDAwMDAyMiwgMHgwMDAwMDAyMiwgMHgwMDAwMDAyMiwgMHgwMDAwMDAyMiwgMH0sCisgICAgIHsweDliNmMsIDB4MDAwMDAwMjMsIDB4MDAwMDAwMjMsIDB4MDAwMDAwMjMsIDB4MDAwMDAwMjMsIDB9LAorICAgICB7MHg5YjcwLCAweDAwMDAwMDI0LCAweDAwMDAwMDI0LCAweDAwMDAwMDI0LCAweDAwMDAwMDI0LCAwfSwKKyAgICAgezB4OWI3NCwgMHgwMDAwMDAyNSwgMHgwMDAwMDAyNSwgMHgwMDAwMDAyNSwgMHgwMDAwMDAyNSwgMH0sCisgICAgIHsweDliNzgsIDB4MDAwMDAwMjgsIDB4MDAwMDAwMjgsIDB4MDAwMDAwMjgsIDB4MDAwMDAwMjgsIDB9LAorICAgICB7MHg5YjdjLCAweDAwMDAwMDI5LCAweDAwMDAwMDI5LCAweDAwMDAwMDI5LCAweDAwMDAwMDI5LCAwfSwKKyAgICAgezB4OWI4MCwgMHgwMDAwMDAyYSwgMHgwMDAwMDAyYSwgMHgwMDAwMDAyYSwgMHgwMDAwMDAyYSwgMH0sCisgICAgIHsweDliODQsIDB4MDAwMDAwMmIsIDB4MDAwMDAwMmIsIDB4MDAwMDAwMmIsIDB4MDAwMDAwMmIsIDB9LAorICAgICB7MHg5Yjg4LCAweDAwMDAwMDJjLCAweDAwMDAwMDJjLCAweDAwMDAwMDJjLCAweDAwMDAwMDJjLCAwfSwKKyAgICAgezB4OWI4YywgMHgwMDAwMDAyZCwgMHgwMDAwMDAyZCwgMHgwMDAwMDAyZCwgMHgwMDAwMDAyZCwgMH0sCisgICAgIHsweDliOTAsIDB4MDAwMDAwMzAsIDB4MDAwMDAwMzAsIDB4MDAwMDAwMzAsIDB4MDAwMDAwMzAsIDB9LAorICAgICB7MHg5Yjk0LCAweDAwMDAwMDMxLCAweDAwMDAwMDMxLCAweDAwMDAwMDMxLCAweDAwMDAwMDMxLCAwfSwKKyAgICAgezB4OWI5OCwgMHgwMDAwMDAzMiwgMHgwMDAwMDAzMiwgMHgwMDAwMDAzMiwgMHgwMDAwMDAzMiwgMH0sCisgICAgIHsweDliOWMsIDB4MDAwMDAwMzMsIDB4MDAwMDAwMzMsIDB4MDAwMDAwMzMsIDB4MDAwMDAwMzMsIDB9LAorICAgICB7MHg5YmEwLCAweDAwMDAwMDM0LCAweDAwMDAwMDM0LCAweDAwMDAwMDM0LCAweDAwMDAwMDM0LCAwfSwKKyAgICAgezB4OWJhNCwgMHgwMDAwMDAzNSwgMHgwMDAwMDAzNSwgMHgwMDAwMDAzNSwgMHgwMDAwMDAzNSwgMH0sCisgICAgIHsweDliYTgsIDB4MDAwMDAwMzUsIDB4MDAwMDAwMzUsIDB4MDAwMDAwMzUsIDB4MDAwMDAwMzUsIDB9LAorICAgICB7MHg5YmFjLCAweDAwMDAwMDM1LCAweDAwMDAwMDM1LCAweDAwMDAwMDM1LCAweDAwMDAwMDM1LCAwfSwKKyAgICAgezB4OWJiMCwgMHgwMDAwMDAzNSwgMHgwMDAwMDAzNSwgMHgwMDAwMDAzNSwgMHgwMDAwMDAzNSwgMH0sCisgICAgIHsweDliYjQsIDB4MDAwMDAwMzUsIDB4MDAwMDAwMzUsIDB4MDAwMDAwMzUsIDB4MDAwMDAwMzUsIDB9LAorICAgICB7MHg5YmI4LCAweDAwMDAwMDM1LCAweDAwMDAwMDM1LCAweDAwMDAwMDM1LCAweDAwMDAwMDM1LCAwfSwKKyAgICAgezB4OWJiYywgMHgwMDAwMDAzNSwgMHgwMDAwMDAzNSwgMHgwMDAwMDAzNSwgMHgwMDAwMDAzNSwgMH0sCisgICAgIHsweDliYzAsIDB4MDAwMDAwMzUsIDB4MDAwMDAwMzUsIDB4MDAwMDAwMzUsIDB4MDAwMDAwMzUsIDB9LAorICAgICB7MHg5YmM0LCAweDAwMDAwMDM1LCAweDAwMDAwMDM1LCAweDAwMDAwMDM1LCAweDAwMDAwMDM1LCAwfSwKKyAgICAgezB4OWJjOCwgMHgwMDAwMDAzNSwgMHgwMDAwMDAzNSwgMHgwMDAwMDAzNSwgMHgwMDAwMDAzNSwgMH0sCisgICAgIHsweDliY2MsIDB4MDAwMDAwMzUsIDB4MDAwMDAwMzUsIDB4MDAwMDAwMzUsIDB4MDAwMDAwMzUsIDB9LAorICAgICB7MHg5YmQwLCAweDAwMDAwMDM1LCAweDAwMDAwMDM1LCAweDAwMDAwMDM1LCAweDAwMDAwMDM1LCAwfSwKKyAgICAgezB4OWJkNCwgMHgwMDAwMDAzNSwgMHgwMDAwMDAzNSwgMHgwMDAwMDAzNSwgMHgwMDAwMDAzNSwgMH0sCisgICAgIHsweDliZDgsIDB4MDAwMDAwMzUsIDB4MDAwMDAwMzUsIDB4MDAwMDAwMzUsIDB4MDAwMDAwMzUsIDB9LAorICAgICB7MHg5YmRjLCAweDAwMDAwMDM1LCAweDAwMDAwMDM1LCAweDAwMDAwMDM1LCAweDAwMDAwMDM1LCAwfSwKKyAgICAgezB4OWJlMCwgMHgwMDAwMDAzNSwgMHgwMDAwMDAzNSwgMHgwMDAwMDAzNSwgMHgwMDAwMDAzNSwgMH0sCisgICAgIHsweDliZTQsIDB4MDAwMDAwMzUsIDB4MDAwMDAwMzUsIDB4MDAwMDAwMzUsIDB4MDAwMDAwMzUsIDB9LAorICAgICB7MHg5YmU4LCAweDAwMDAwMDM1LCAweDAwMDAwMDM1LCAweDAwMDAwMDM1LCAweDAwMDAwMDM1LCAwfSwKKyAgICAgezB4OWJlYywgMHgwMDAwMDAzNSwgMHgwMDAwMDAzNSwgMHgwMDAwMDAzNSwgMHgwMDAwMDAzNSwgMH0sCisgICAgIHsweDliZjAsIDB4MDAwMDAwMzUsIDB4MDAwMDAwMzUsIDB4MDAwMDAwMzUsIDB4MDAwMDAwMzUsIDB9LAorICAgICB7MHg5YmY0LCAweDAwMDAwMDM1LCAweDAwMDAwMDM1LCAweDAwMDAwMDM1LCAweDAwMDAwMDM1LCAwfSwKKyAgICAgezB4OWJmOCwgMHgwMDAwMDAxMCwgMHgwMDAwMDAxMCwgMHgwMDAwMDAxMCwgMHgwMDAwMDAxMCwgMH0sCisgICAgIHsweDliZmMsIDB4MDAwMDAwMWEsIDB4MDAwMDAwMWEsIDB4MDAwMDAwMWEsIDB4MDAwMDAwMWEsIDB9LAorICAgICB7MHg5YzAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAwfSwKKyAgICAgezB4OWMwYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMH0sCisgICAgIHsweDljMTAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB9LAorICAgICB7MHg5YzE0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAwfSwKKyAgICAgezB4OWMxOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMH0sCisgICAgIHsweDljMWMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB9LAorICAgICB7MHg5YzIwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAwfSwKKyAgICAgezB4OWMyNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMH0sCisgICAgIHsweDljMjgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB9LAorICAgICB7MHg5YzJjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAwfSwKKyAgICAgezB4OWMzMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMH0sCisgICAgIHsweDljMzQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB9LAorICAgICB7MHg5YzM4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAwfSwKKyAgICAgezB4OWMzYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMH0sCisgICAgIHsweDljZjAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB9LAorICAgICB7MHg5Y2Y0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAwfSwKKyAgICAgezB4OWNmOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMH0sCisgICAgIHsweDljZmMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB9LAorICAgICB7MHhhMjAwLCAweDAwMDAwMDA4LCAweDAwMDAwMDA4LCAweDAwMDAwMDBlLCAweDAwMDAwMDBlLCAwfSwKKyAgICAgezB4YTIwNCwgMHgwMDAwMDQ0MCwgMHgwMDAwMDQ0MCwgMHgwMDAwMDQ0MCwgMHgwMDAwMDQ0MCwgMH0sCisgICAgIHsweGEyMDgsIDB4ZDZiZTQ3ODgsIDB4ZDZiZTQ3ODgsIDB4ZDAzZTQ3ODgsIDB4ZDAzZTQ3ODgsIDB9LAorICAgICB7MHhhMjBjLCAweDAxMmU4MTYwLCAweDAxMmU4MTYwLCAweDAxMmE4MTYwLCAweDAxMmE4MTYwLCAwfSwKKyAgICAgezB4YTIxMCwgMHg0MDgwNjMzMywgMHg0MDgwNjMzMywgMHg0MDgwNjMzMywgMHg0MDgwNjMzMywgMH0sCisgICAgIHsweGEyMTQsIDB4MDAxMDZjMTAsIDB4MDAxMDZjMTAsIDB4MDAxMDZjMTAsIDB4MDAxMDZjMTAsIDB9LAorICAgICB7MHhhMjE4LCAweDAwOWM0MDYwLCAweDAwOWM0MDYwLCAweDAwOWM0MDYwLCAweDAwOWM0MDYwLCAwfSwKKyAgICAgezB4YTIxYywgMHgxODgzODAwYSwgMHgxODgzODAwYSwgMHgxODgzODAwYSwgMHgxODgzODAwYSwgMH0sCisgICAgIHsweGEyMjAsIDB4MDE4ODMwYzYsIDB4MDE4ODMwYzYsIDB4MDE4ODMwYzYsIDB4MDE4ODMwYzYsIDB9LAorICAgICB7MHhhMjI0LCAweDAwMDAwNDAwLCAweDAwMDAwNDAwLCAweDAwMDAwNDAwLCAweDAwMDAwNDAwLCAwfSwKKyAgICAgezB4YTIyOCwgMHgwMDAwMDliNSwgMHgwMDAwMDliNSwgMHgwMDAwMDliNSwgMHgwMDAwMDliNSwgMH0sCisgICAgIHsweGEyMmMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB9LAorICAgICB7MHhhMjMwLCAweDAwMDAwMTA4LCAweDAwMDAwMjEwLCAweDAwMDAwMjEwLCAweDAwMDAwMTA4LCAwfSwKKyAgICAgezB4YTIzNCwgMHgzZjNmM2YzZiwgMHgzZjNmM2YzZiwgMHgzZjNmM2YzZiwgMHgzZjNmM2YzZiwgMH0sCisgICAgIHsweGEyMzgsIDB4M2YzZjNmM2YsIDB4M2YzZjNmM2YsIDB4M2YzZjNmM2YsIDB4M2YzZjNmM2YsIDB9LAorICAgICB7MHhhMjNjLCAweDEzYzg4OWFmLCAweDEzYzg4OWFmLCAweDEzYzg4OWFmLCAweDEzYzg4OWFmLCAwfSwKKyAgICAgezB4YTI0MCwgMHgzODQ5MGEyMCwgMHgzODQ5MGEyMCwgMHgzODQ5MGEyMCwgMHgzODQ5MGEyMCwgMH0sCisgICAgIHsweGEyNDQsIDB4MDAwMDdiYjYsIDB4MDAwMDdiYjYsIDB4MDAwMDdiYjYsIDB4MDAwMDdiYjYsIDB9LAorICAgICB7MHhhMjQ4LCAweDBmZmYzZmZjLCAweDBmZmYzZmZjLCAweDBmZmYzZmZjLCAweDBmZmYzZmZjLCAwfSwKKyAgICAgezB4YTI0YywgMHgwMDAwMDAwMSwgMHgwMDAwMDAwMSwgMHgwMDAwMDAwMSwgMHgwMDAwMDAwMSwgMH0sCisgICAgIHsweGEyNTAsIDB4MDAwMGEwMDAsIDB4MDAwMGEwMDAsIDB4MDAwMGEwMDAsIDB4MDAwMGEwMDAsIDB9LAorICAgICB7MHhhMjU0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAwfSwKKyAgICAgezB4YTI1OCwgMHgwY2M3NTM4MCwgMHgwY2M3NTM4MCwgMHgwY2M3NTM4MCwgMHgwY2M3NTM4MCwgMH0sCisgICAgIHsweGEyNWMsIDB4MGYwZjBmMDEsIDB4MGYwZjBmMDEsIDB4MGYwZjBmMDEsIDB4MGYwZjBmMDEsIDB9LAorICAgICB7MHhhMjYwLCAweGRmYTkxZjAxLCAweGRmYTkxZjAxLCAweGRmYTkxZjAxLCAweGRmYTkxZjAxLCAwfSwKKyAgICAgezB4YTI2NCwgMHgwMDQxOGExMSwgMHgwMDQxOGExMSwgMHgwMDQxOGExMSwgMHgwMDQxOGExMSwgMH0sCisgICAgIHsweGEyNjgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB9LAorICAgICB7MHhhMjZjLCAweDA5MjQ5MTI2LCAweDA5MjQ5MTI2LCAweDA5MjQ5MTI2LCAweDA5MjQ5MTI2LCAwfSwKKyAgICAgezB4YTI3NCwgMHgwYTFhOWNhYSwgMHgwYTFhOWNhYSwgMHgwYTFhN2NhYSwgMHgwYTFhN2NhYSwgMH0sCisgICAgIHsweGEyNzgsIDB4MWNlNzM5Y2UsIDB4MWNlNzM5Y2UsIDB4MWNlNzM5Y2UsIDB4MWNlNzM5Y2UsIDB9LAorICAgICB7MHhhMjdjLCAweDA1MTcwMWNlLCAweDA1MTcwMWNlLCAweDA1MTcwMWNlLCAweDA1MTcwMWNlLCAwfSwKKyAgICAgezB4YTMwMCwgMHgxODAxMDAwMCwgMHgxODAxMDAwMCwgMHgxODAxMDAwMCwgMHgxODAxMDAwMCwgMH0sCisgICAgIHsweGEzMDQsIDB4MzAwMzI2MDIsIDB4MzAwMzI2MDIsIDB4MmUwMzI0MDIsIDB4MmUwMzI0MDIsIDB9LAorICAgICB7MHhhMzA4LCAweDQ4MDczZTA2LCAweDQ4MDczZTA2LCAweDRhMGEzYzA2LCAweDRhMGEzYzA2LCAwfSwKKyAgICAgezB4YTMwYywgMHg1NjBiNGMwYSwgMHg1NjBiNGMwYSwgMHg2MjFhNTQwYiwgMHg2MjFhNTQwYiwgMH0sCisgICAgIHsweGEzMTAsIDB4NjQxYTYwMGYsIDB4NjQxYTYwMGYsIDB4NzY0ZjZjMWIsIDB4NzY0ZjZjMWIsIDB9LAorICAgICB7MHhhMzE0LCAweDdhNGY2ZTFiLCAweDdhNGY2ZTFiLCAweDg0NWI3YTVhLCAweDg0NWI3YTVhLCAwfSwKKyAgICAgezB4YTMxOCwgMHg4YzViN2U1YSwgMHg4YzViN2U1YSwgMHg5NTBmOGNjZiwgMHg5NTBmOGNjZiwgMH0sCisgICAgIHsweGEzMWMsIDB4OWQwZjk2Y2YsIDB4OWQwZjk2Y2YsIDB4YTVjZjliNGYsIDB4YTVjZjliNGYsIDB9LAorICAgICB7MHhhMzIwLCAweGI1MWZhNjlmLCAweGI1MWZhNjlmLCAweGJkZGZhZjFmLCAweGJkZGZhZjFmLCAwfSwKKyAgICAgezB4YTMyNCwgMHhjYjNmYmQwNywgMHhjYjNmYmNiZiwgMHhkMWZmYzkzZiwgMHhkMWZmYzkzZiwgMH0sCisgICAgIHsweGEzMjgsIDB4MDAwMGQ3YmYsIDB4MDAwMGQ3YmYsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB9LAorICAgICB7MHhhMzJjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAwfSwKKyAgICAgezB4YTMzMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMH0sCisgICAgIHsweGEzMzQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB9LAorICAgICB7MHhhMzM4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAwfSwKKyAgICAgezB4YTMzYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMH0sCisgICAgIHsweGEzNDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB9LAorICAgICB7MHhhMzQ0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAwfSwKKyAgICAgezB4YTM0OCwgMHgzZmZmZmZmZiwgMHgzZmZmZmZmZiwgMHgzZmZmZmZmZiwgMHgzZmZmZmZmZiwgMH0sCisgICAgIHsweGEzNGMsIDB4M2ZmZmZmZmYsIDB4M2ZmZmZmZmYsIDB4M2ZmZmZmZmYsIDB4M2ZmZmZmZmYsIDB9LAorICAgICB7MHhhMzUwLCAweDNmZmZmZmZmLCAweDNmZmZmZmZmLCAweDNmZmZmZmZmLCAweDNmZmZmZmZmLCAwfSwKKyAgICAgezB4YTM1NCwgMHgwMDAzZmZmZiwgMHgwMDAzZmZmZiwgMHgwMDAzZmZmZiwgMHgwMDAzZmZmZiwgMH0sCisgICAgIHsweGEzNTgsIDB4NzlhOGFhMWYsIDB4NzlhOGFhMWYsIDB4NzlhOGFhMWYsIDB4NzlhOGFhMWYsIDB9LAorICAgICB7MHhhMzg4LCAweDA4MDAwMDAwLCAweDA4MDAwMDAwLCAweDA4MDAwMDAwLCAweDA4MDAwMDAwLCAwfSwKKyAgICAgezB4YTM4YywgMHgzZjNmM2YzZiwgMHgzZjNmM2YzZiwgMHgzZjNmM2YzZiwgMHgzZjNmM2YzZiwgMH0sCisgICAgIHsweGEzOTAsIDB4M2YzZjNmM2YsIDB4M2YzZjNmM2YsIDB4M2YzZjNmM2YsIDB4M2YzZjNmM2YsIDB9LAorICAgICB7MHhhMzk0LCAweDFjZTczOWNlLCAweDFjZTczOWNlLCAweDFjZTczOWNlLCAweDFjZTczOWNlLCAwfSwKKyAgICAgezB4YTM5OCwgMHgwMDAwMDFjZSwgMHgwMDAwMDFjZSwgMHgwMDAwMDFjZSwgMHgwMDAwMDFjZSwgMH0sCisgICAgIHsweGEzOWMsIDB4MDAwMDAwMDcsIDB4MDAwMDAwMDcsIDB4MDAwMDAwMDcsIDB4MDAwMDAwMDcsIDB9LAorICAgICB7MHhhM2EwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAwfSwKKyAgICAgezB4YTNhNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMH0sCisgICAgIHsweGEzYTgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB9LAorICAgICB7MHhhM2FjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAwfSwKKyAgICAgezB4YTNiMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMH0sCisgICAgIHsweGEzYjQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB9LAorICAgICB7MHhhM2I4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAwfSwKKyAgICAgezB4YTNiYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMH0sCisgICAgIHsweGEzYzAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB9LAorICAgICB7MHhhM2M0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAwfSwKKyAgICAgezB4YTNjOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMH0sCisgICAgIHsweGEzY2MsIDB4M2YzZjNmM2YsIDB4M2YzZjNmM2YsIDB4M2YzZjNmM2YsIDB4M2YzZjNmM2YsIDB9LAorICAgICB7MHhhM2QwLCAweDNmM2YzZjNmLCAweDNmM2YzZjNmLCAweDNmM2YzZjNmLCAweDNmM2YzZjNmLCAwfSwKKyAgICAgezB4YTNkNCwgMHgzZjNmM2YzZiwgMHgzZjNmM2YzZiwgMHgzZjNmM2YzZiwgMHgzZjNmM2YzZiwgMH0sCisgICAgIHsweGEzZDgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB9LAorICAgICB7MHhhM2RjLCAweDFjZTczOWNlLCAweDFjZTczOWNlLCAweDFjZTczOWNlLCAweDFjZTczOWNlLCAwfSwKKyAgICAgezB4YTNlMCwgMHgwMDAwMDBjMCwgMHgwMDAwMDBjMCwgMHgwMDAwMDBjMCwgMHgwMDAwMDBjMCwgMH0sCisgICAgIHsweGE4NDgsIDB4MDAxODBhNjUsIDB4MDAxODBhNjUsIDB4MDAxODBhNjgsIDB4MDAxODBhNjgsIDB9LAorICAgICB7MHhhOTIwLCAweDA1MTAwMDFjLCAweDA1MTAwMDFjLCAweDA1MTAwMDFjLCAweDA1MTAwMDFjLCAwfSwKKyAgICAgezB4YTk2MCwgMHgwMDAwOWI0MCwgMHgwMDAwOWI0MCwgMHgwMDAwOWI0MCwgMHgwMDAwOWI0MCwgMH0sCisgICAgIHsweGIyMGMsIDB4MDEyZTgxNjAsIDB4MDEyZTgxNjAsIDB4MDEyYTgxNjAsIDB4MDEyYTgxNjAsIDB9LAorICAgICB7MHhiMjZjLCAweDA5MjQ5MTI2LCAweDA5MjQ5MTI2LCAweDA5MjQ5MTI2LCAweDA5MjQ5MTI2LCAwfSwKKyAgICAgezB4Yjg0OCwgMHgwMDE4MGE2NSwgMHgwMDE4MGE2NSwgMHgwMDE4MGE2OCwgMHgwMDE4MGE2OCwgMH0sCisgICAgIHsweGI5MjAsIDB4MDUxMDAwMWMsIDB4MDUxMDAwMWMsIDB4MDUxMDAwMWMsIDB4MDUxMDAwMWMsIDB9LAorICAgICB7MHhiOTYwLCAweDAwMDA5YjQwLCAweDAwMDA5YjQwLCAweDAwMDA5YjQwLCAweDAwMDA5YjQwLCAwfSwKKyAgICAgezB4YzIwYywgMHgwMTJlODE2MCwgMHgwMTJlODE2MCwgMHgwMTJhODE2MCwgMHgwMTJhODE2MCwgMH0sCisgICAgIHsweGMyNmMsIDB4MDkyNDkxMjYsIDB4MDkyNDkxMjYsIDB4MDkyNDkxMjYsIDB4MDkyNDkxMjYsIDB9LAorICAgICAvL3sweGM4NjQsIDB4MDAwMWNlMDAsIDB4MDAwMWNlMDAsIDB4MDAwMWNlMDAsIDB4MDAwMWNlMDAsIDB9LAorICAgICB7MHhjODY0LCAweDAwMDFjNjAwLCAweDAwMDFjNjAwLCAweDAwMDFjNjAwLCAweDAwMDFjNjAwLCAwfSwKKyAgICAgezB4Yzk1YywgMHgwMDRiNmE4ZSwgMHgwMDRiNmE4ZSwgMHgwMDRiNmE4ZSwgMHgwMDRiNmE4ZSwgMH0sCisgICAgIHsweGM5NjgsIDB4MDAwMDAzY2UsIDB4MDAwMDAzY2UsIDB4MDAwMDAzY2UsIDB4MDAwMDAzY2UsIDB9LAorICAgICB7MHhjOWJjLCAweDAwMTgxNDAwLCAweDAwMTgxNDAwLCAweDAwMTgxNDAwLCAweDAwMTgxNDAwLCAwfSwKKyAgICAgezB4ZDI3MCwgMHgwMDgyMDgyMCwgMHgwMDgyMDgyMCwgMHgwMDgyMDgyMCwgMHgwMDgyMDgyMCwgMH0sCisgICAgIHsweGQzNWMsIDB4MDY2YzQyMGYsIDB4MDY2YzQyMGYsIDB4MDY2YzQyMGYsIDB4MDY2YzQyMGYsIDB9LAorICAgICB7MHhkMzYwLCAweDBmMjgyMjA3LCAweDBmMjgyMjA3LCAweDBmMjgyMjA3LCAweDBmMjgyMjA3LCAwfSwKKyAgICAgezB4ZDM2NCwgMHgxNzYwMTY4NSwgMHgxNzYwMTY4NSwgMHgxNzYwMTY4NSwgMHgxNzYwMTY4NSwgMH0sCisgICAgIHsweGQzNjgsIDB4MWY4MDExMDQsIDB4MWY4MDExMDQsIDB4MWY4MDExMDQsIDB4MWY4MDExMDQsIDB9LAorICAgICB7MHhkMzZjLCAweDM3YTAwYzAzLCAweDM3YTAwYzAzLCAweDM3YTAwYzAzLCAweDM3YTAwYzAzLCAwfSwKKyAgICAgezB4ZDM3MCwgMHgzZmM0MDg4MywgMHgzZmM0MDg4MywgMHgzZmM0MDg4MywgMHgzZmM0MDg4MywgMH0sCisgICAgIHsweGQzNzQsIDB4NTdjMDA4MDMsIDB4NTdjMDA4MDMsIDB4NTdjMDA4MDMsIDB4NTdjMDA4MDMsIDB9LAorICAgICB7MHhkMzc4LCAweDVmZDgwNjgyLCAweDVmZDgwNjgyLCAweDVmZDgwNjgyLCAweDVmZDgwNjgyLCAwfSwKKyAgICAgezB4ZDM3YywgMHg3ZmUwMDQ4MiwgMHg3ZmUwMDQ4MiwgMHg3ZmUwMDQ4MiwgMHg3ZmUwMDQ4MiwgMH0sCisgICAgIHsweGQzODAsIDB4N2YzYzdiYmEsIDB4N2YzYzdiYmEsIDB4N2YzYzdiYmEsIDB4N2YzYzdiYmEsIDB9LAorICAgICB7MHhkMzg0LCAweGYzMzA3ZmYwLCAweGYzMzA3ZmYwLCAweGYzMzA3ZmYwLCAweGYzMzA3ZmYwLCAwfQorfTsKKworCitzdGF0aWMgY29uc3QgdTMyX3Qgb3R1c0JhbmtbXVszXSA9IHsKKyAgICAgLy8jIGJhbmsgMAorICAgICB7MHg5OGIwLCAgMHgxZTU3OTVlNSwgIDB4MWU1Nzk1ZTV9LAorICAgICB7MHg5OGUwLCAgMHgwMjAwODAyMCwgIDB4MDIwMDgwMjB9LAorICAgICAvLyMgYmFuayAxCisgICAgIHsweDk4YjAsICAweDAyMTA4NDIxLCAgMHgwMjEwODQyMX0sCisgICAgIHsweDk4ZWMsICAweDAwMDAwMDA4LCAgMHgwMDAwMDAwOH0sCisgICAgIC8vIyBiYW5rIDIKKyAgICAgezB4OThiMCwgIDB4MGU3M2ZmMTcsICAweDBlNzNmZjE3fSwKKyAgICAgezB4OThlMCwgIDB4MDAwMDA0MjAsICAweDAwMDAwNDIwfSwKKyAgICAgLy8jIGJhbmsgMworICAgICB7MHg5OGYwLCAgMHgwMTQwMDAxOCwgIDB4MDFjMDAwMTh9LAorICAgICAvLyMgYmFuayA0CisgICAgIHsweDk4YjAsICAweDAwMDAwMWExLCAgMHgwMDAwMDFhMX0sCisgICAgIHsweDk4ZTgsICAweDAwMDAwMDAxLCAgMHgwMDAwMDAwMX0sCisgICAgIC8vIyBiYW5rIDUKKyAgICAgezB4OThiMCwgIDB4MDAwMDAwMTMsICAweDAwMDAwMDEzfSwKKyAgICAgezB4OThlNCwgIDB4MDAwMDAwMDIsICAweDAwMDAwMDAyfSwKKyAgICAgLy8jIGJhbmsgNgorICAgICB7MHg5OGIwLCAgMHgwMDAwMDAwMCwgIDB4MDAwMDAwMDB9LAorICAgICB7MHg5OGIwLCAgMHgwMDAwMDAwMCwgIDB4MDAwMDAwMDB9LAorICAgICB7MHg5OGIwLCAgMHgwMDAwMDAwMCwgIDB4MDAwMDAwMDB9LAorICAgICB7MHg5OGIwLCAgMHgwMDAwMDAwMCwgIDB4MDAwMDAwMDB9LAorICAgICB7MHg5OGIwLCAgMHgwMDAwMDAwMCwgIDB4MDAwMDAwMDB9LAorICAgICB7MHg5OGIwLCAgMHgwMDAwNDAwMCwgIDB4MDAwMDQwMDB9LAorICAgICB7MHg5OGIwLCAgMHgwMDAwNmMwMCwgIDB4MDAwMDZjMDB9LAorICAgICB7MHg5OGIwLCAgMHgwMDAwMmMwMCwgIDB4MDAwMDJjMDB9LAorICAgICB7MHg5OGIwLCAgMHgwMDAwNDgwMCwgIDB4MDAwMDQ4MDB9LAorICAgICB7MHg5OGIwLCAgMHgwMDAwNDAwMCwgIDB4MDAwMDQwMDB9LAorICAgICB7MHg5OGIwLCAgMHgwMDAwNjAwMCwgIDB4MDAwMDYwMDB9LAorICAgICB7MHg5OGIwLCAgMHgwMDAwMTAwMCwgIDB4MDAwMDEwMDB9LAorICAgICB7MHg5OGIwLCAgMHgwMDAwNDAwMCwgIDB4MDAwMDQwMDB9LAorICAgICB7MHg5OGIwLCAgMHgwMDAwN2MwMCwgIDB4MDAwMDdjMDB9LAorICAgICB7MHg5OGIwLCAgMHgwMDAwN2MwMCwgIDB4MDAwMDdjMDB9LAorICAgICB7MHg5OGIwLCAgMHgwMDAwN2MwMCwgIDB4MDAwMDdjMDB9LAorICAgICB7MHg5OGIwLCAgMHgwMDAwN2MwMCwgIDB4MDAwMDdjMDB9LAorICAgICB7MHg5OGIwLCAgMHgwMDAwN2MwMCwgIDB4MDAwMDdjMDB9LAorICAgICB7MHg5OGIwLCAgMHgwMDA4N2MwMCwgIDB4MDAwODdjMDB9LAorICAgICB7MHg5OGIwLCAgMHgwMDAwN2MwMCwgIDB4MDAwMDdjMDB9LAorICAgICB7MHg5OGIwLCAgMHgwMDAwNTQwMCwgIDB4MDAwMDU0MDB9LAorICAgICB7MHg5OGIwLCAgMHgwMDAwMGMwMCwgIDB4MDAwMDBjMDB9LAorICAgICB7MHg5OGIwLCAgMHgwMDAwMTgwMCwgIDB4MDAwMDE4MDB9LAorICAgICB7MHg5OGIwLCAgMHgwMDAwN2MwMCwgIDB4MDAwMDdjMDB9LAorICAgICB7MHg5OGIwLCAgMHgwMDAwNmMwMCwgIDB4MDAwMDZjMDB9LAorICAgICB7MHg5OGIwLCAgMHgwMDAwNmMwMCwgIDB4MDAwMDZjMDB9LAorICAgICB7MHg5OGIwLCAgMHgwMDAwN2MwMCwgIDB4MDAwMDdjMDB9LAorICAgICB7MHg5OGIwLCAgMHgwMDAwMmMwMCwgIDB4MDAwMDJjMDB9LAorICAgICB7MHg5OGIwLCAgMHgwMDAwM2MwMCwgIDB4MDAwMDNjMDB9LAorICAgICB7MHg5OGIwLCAgMHgwMDAwMzgwMCwgIDB4MDAwMDM4MDB9LAorICAgICB7MHg5OGIwLCAgMHgwMDAwMWMwMCwgIDB4MDAwMDFjMDB9LAorICAgICB7MHg5OGIwLCAgMHgwMDAwMDgwMCwgIDB4MDAwMDA4MDB9LAorICAgICB7MHg5OGIwLCAgMHgwMDAwMDQwOCwgIDB4MDAwMDA0MDh9LAorICAgICB7MHg5OGIwLCAgMHgwMDAwNGMxNSwgIDB4MDAwMDRjMTV9LAorICAgICB7MHg5OGIwLCAgMHgwMDAwNDE4OCwgIDB4MDAwMDQxODh9LAorICAgICB7MHg5OGIwLCAgMHgwMDAwMjAxZSwgIDB4MDAwMDIwMWV9LAorICAgICB7MHg5OGIwLCAgMHgwMDAxMDQwOCwgIDB4MDAwMTA0MDh9LAorICAgICB7MHg5OGIwLCAgMHgwMDAwMDgwMSwgIDB4MDAwMDA4MDF9LAorICAgICB7MHg5OGIwLCAgMHgwMDAwMGMwOCwgIDB4MDAwMDBjMDh9LAorICAgICB7MHg5OGIwLCAgMHgwMDAwMTgxZSwgIDB4MDAwMDE4MWV9LAorICAgICB7MHg5OGIwLCAgMHgwMDAwMTAxNiwgIDB4MDAwMDEwMTZ9LAorICAgICB7MHg5OGIwLCAgMHgwMDAwMjgwMCwgIDB4MDAwMDI4MDB9LAorICAgICB7MHg5OGIwLCAgMHgwMDAwNDAxMCwgIDB4MDAwMDQwMTB9LAorICAgICB7MHg5OGIwLCAgMHgwMDAwMDgxYywgIDB4MDAwMDA4MWN9LAorICAgICB7MHg5OGIwLCAgMHgwMDAwMDExNSwgIDB4MDAwMDAxMTV9LAorICAgICB7MHg5OGIwLCAgMHgwMDAwMDAxNSwgIDB4MDAwMDAwMTV9LAorICAgICB7MHg5OGIwLCAgMHgwMDAwMDA2NiwgIDB4MDAwMDAwNjZ9LAorICAgICB7MHg5OGIwLCAgMHgwMDAwMDAxYywgIDB4MDAwMDAwMWN9LAorICAgICB7MHg5OGIwLCAgMHgwMDAwMDAwMCwgIDB4MDAwMDAwMDB9LAorICAgICB7MHg5OGIwLCAgMHgwMDAwMDAwNCwgIDB4MDAwMDAwMDR9LAorICAgICB7MHg5OGIwLCAgMHgwMDAwMDAxNSwgIDB4MDAwMDAwMTV9LAorICAgICB7MHg5OGIwLCAgMHgwMDAwMDAxZiwgIDB4MDAwMDAwMWZ9LAorICAgICB7MHg5OGUwLCAgMHgwMDAwMDAwMCwgIDB4MDAwMDA0MDB9LAorICAgICAvLyMgYmFuayA3CisgICAgIHsweDk4YjAsICAweDAwMDAwMGEwLCAgMHgwMDAwMDBhMH0sCisgICAgIHsweDk4YjAsICAweDAwMDAwMDAwLCAgMHgwMDAwMDAwMH0sCisgICAgIHsweDk4YjAsICAweDAwMDAwMDQwLCAgMHgwMDAwMDA0MH0sCisgICAgIHsweDk4ZjAsICAweDAwMDAwMDFjLCAgMHgwMDAwMDAxY30KK307CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb3R1cy9pb2N0bC5jIGIvZHJpdmVycy9zdGFnaW5nL290dXMvaW9jdGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTVjMWU4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvaW9jdGwuYwpAQCAtMCwwICsxLDI5MTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBBdGhlcm9zIENvbW11bmljYXRpb25zIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2R1bGUgTmFtZSA6IGlvY3RsLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEFic3RyYWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgVGhpcyBtb2R1bGUgY29udGFpbnMgTGludXggd2lyZWxlc3MgZXh0ZW5zaW9uIHJlbGF0ZWQgZnVuY3RvbnMuICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE5PVEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICBQbGF0Zm9ybSBkZXBlbmRlbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaW5jbHVkZSAidXNiZHJ2LmgiCisKKyNkZWZpbmUgWkRfSU9DVExfV1BBCQkJICAgIChTSU9DREVWUFJJVkFURSArIDEpCisjZGVmaW5lIFpEX0lPQ1RMX1BBUkFNCQkJICAgIChTSU9DREVWUFJJVkFURSArIDIpCisjZGVmaW5lIFpEX0lPQ1RMX0dFVFdQQUlFCQkgICAgKFNJT0NERVZQUklWQVRFICsgMykKKyNpZmRlZiBaTV9FTkFCTEVfQ0VOQworI2RlZmluZSBaTV9JT0NUTF9DRU5DICAgICAgICAgICAgICAgKFNJT0NERVZQUklWQVRFICsgNCkKKyNlbmRpZiAvL1pNX0VOQUJMRV9DRU5DCisjZGVmaW5lIFpEX1BBUkFNX1JPQU1JTkcJCSAgICAweDAwMDEKKyNkZWZpbmUgWkRfUEFSQU1fUFJJVkFDWQkJICAgIDB4MDAwMgorI2RlZmluZSBaRF9QQVJBTV9XUEEJCQkgICAgMHgwMDAzCisjZGVmaW5lIFpEX1BBUkFNX0NPVU5URVJNRUFTVVJFUwkweDAwMDQKKyNkZWZpbmUgWkRfUEFSQU1fRFJPUFVORU5DUllQVEVECTB4MDAwNQorI2RlZmluZSBaRF9QQVJBTV9BVVRIX0FMR1MJCSAgICAweDAwMDYKKyNkZWZpbmUgWkRfUEFSQU1fV1BTX0ZJTFRFUgkJICAgIDB4MDAwNworCisjaWZkZWYgWk1fRU5BQkxFX0NFTkMKKyNkZWZpbmUgUDgwMjExX1BBQ0tFVF9DRU5DRkxBRwkJMHgwMDAxCisjZW5kaWYgLy9aTV9FTkFCTEVfQ0VOQworI2RlZmluZSBQODAyMTFfUEFDS0VUX1NFVEtFWSAgICAgCTB4MDAwMworCisjZGVmaW5lIFpEX0NNRF9TRVRfRU5DUllQVF9LRVkJCTB4MDAwMQorI2RlZmluZSBaRF9DTURfU0VUX01MTUUJCQkgICAgMHgwMDAyCisjZGVmaW5lIFpEX0NNRF9TQ0FOX1JFUQkJCSAgICAweDAwMDMKKyNkZWZpbmUgWkRfQ01EX1NFVF9HRU5FUklDX0VMRU1FTlQJMHgwMDA0CisjZGVmaW5lIFpEX0NNRF9HRVRfVFNDCQkJICAgIDB4MDAwNQorCisjZGVmaW5lIFpEX0NSWVBUX0FMR19OQU1FX0xFTgkJMTYKKyNkZWZpbmUgWkRfTUFYX0tFWV9TSVpFCQkJICAgIDMyCisjZGVmaW5lIFpEX01BWF9HRU5FUklDX1NJWkUJCSAgICA2NAorCisjaWYgV0lSRUxFU1NfRVhUID4gMTIKKyNpbmNsdWRlIDxuZXQvaXdfaGFuZGxlci5oPgorI2VuZGlmCisKK2V4dGVybiB1MTZfdCB6ZkxueEdldFZhcElkKHpkZXZfdCogZGV2KTsKKworc3RhdGljIGNvbnN0IHUzMl90IGNoYW5uZWxfZnJlcXVlbmN5XzExQVtdID0KK3sKKy8vRXZlbiBlbGVtZW50IGZvciBDaGFubmVsIE51bWJlciwgT2RkIGZvciBGcmVxdWVuY3kKKyAgICAzNiw1MTgwLAorICAgIDQwLDUyMDAsCisgICAgNDQsNTIyMCwKKyAgICA0OCw1MjQwLAorICAgIDUyLDUyNjAsCisgICAgNTYsNTI4MCwKKyAgICA2MCw1MzAwLAorICAgIDY0LDUzMjAsCisgICAgMTAwLDU1MDAsCisgICAgMTA0LDU1MjAsCisgICAgMTA4LDU1NDAsCisgICAgMTEyLDU1NjAsCisgICAgMTE2LDU1ODAsCisgICAgMTIwLDU2MDAsCisgICAgMTI0LDU2MjAsCisgICAgMTI4LDU2NDAsCisgICAgMTMyLDU2NjAsCisgICAgMTM2LDU2ODAsCisgICAgMTQwLDU3MDAsCisvLworICAgIDE4NCw0OTIwLAorICAgIDE4OCw0OTQwLAorICAgIDE5Miw0OTYwLAorICAgIDE5Niw0OTgwLAorICAgIDgsNTA0MCwKKyAgICAxMiw1MDYwLAorICAgIDE2LDUwODAsCisgICAgMzQsNTE3MCwKKyAgICAzOCw1MTkwLAorICAgIDQyLDUyMTAsCisgICAgNDYsNTIzMCwKKy8vCisgICAgMTQ5LDU3NDUsCisgICAgMTUzLDU3NjUsCisgICAgMTU3LDU3ODUsCisgICAgMTYxLDU4MDUsCisgICAgMTY1LDU4MjUKKy8vCit9OworCitpbnQgdXNiZHJ2X2ZyZXEyY2hhbih1MzJfdCBmcmVxKQoreworICAgIC8qIDIuNEcgSHogKi8KKyAgICBpZiAoZnJlcSA+IDI0MDAgJiYgZnJlcSA8IDMwMDApCisgICAgeworICAgICAgICByZXR1cm4gKChmcmVxLTI0MTIpLzUpICsgMTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgdTE2X3QgaWk7CisgICAgICAgIHUxNl90IG51bV9jaGFuID0gc2l6ZW9mKGNoYW5uZWxfZnJlcXVlbmN5XzExQSkvc2l6ZW9mKHUzMl90KTsKKworICAgICAgICBmb3IoaWkgPSAxOyBpaSA8IG51bV9jaGFuOyBpaSArPSAyKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2hhbm5lbF9mcmVxdWVuY3lfMTFBW2lpXSA9PSBmcmVxKQorICAgICAgICAgICAgICAgIHJldHVybiBjaGFubmVsX2ZyZXF1ZW5jeV8xMUFbaWktMV07CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworaW50IHVzYmRydl9jaGFuMmZyZXEoaW50IGNoYW4pCit7CisgICAgaW50IGZyZXE7CisKKyAgICAvKiBJZiBjaGFubmVsIG51bWJlciBpcyBvdXQgb2YgcmFuZ2UgKi8KKyAgICBpZiAoY2hhbiA+IDE2NSB8fCBjaGFuIDw9IDApCisgICAgICAgIHJldHVybiAtMTsKKworICAgIC8qIDIuNEcgYmFuZCAqLworICAgIGlmIChjaGFuID49IDEgJiYgY2hhbiA8PSAxMykKKyAgICB7CisgICAgICAgIGZyZXEgPSAoMjQxMiArIChjaGFuIC0gMSkgKiA1KTsKKyAgICAgICAgcmV0dXJuIGZyZXE7CisgICAgfQorICAgIGVsc2UgaWYgKGNoYW4gPj0gMzYgJiYgY2hhbiA8PSAxNjUpCisgICAgeworICAgICAgICB1MTZfdCBpaTsKKyAgICAgICAgdTE2X3QgbnVtX2NoYW4gPSBzaXplb2YoY2hhbm5lbF9mcmVxdWVuY3lfMTFBKS9zaXplb2YodTMyX3QpOworCisgICAgICAgIGZvcihpaSA9IDA7IGlpIDwgbnVtX2NoYW47IGlpICs9IDIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjaGFubmVsX2ZyZXF1ZW5jeV8xMUFbaWldID09IGNoYW4pCisgICAgICAgICAgICAgICAgcmV0dXJuIGNoYW5uZWxfZnJlcXVlbmN5XzExQVtpaSsxXTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIENhbid0IGZpbmQgZGVzaXJlZCBmcmVxdWVuY3kgKi8KKyAgICAgICAgaWYgKGlpID09IG51bV9jaGFuKQorICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgLyogQ2FuJ3QgZmluZCBkZWlzcmVkIGZyZXF1ZW5jeSAqLworICAgIHJldHVybiAtMTsKK30KKworaW50IHVzYmRydl9pb2N0bF9zZXRlc3NpZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcG9pbnQgKmVycSkKK3sKKyNpZmRlZiBaTV9IT1NUQVBEX1NVUFBPUlQKKyAgICAvL3N0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IGRldi0+bWxfcHJpdjsKKyAgICBjaGFyIGVzc2lkYnVmW0lXX0VTU0lEX01BWF9TSVpFKzFdOworICAgIGludCBpOworCisgICAgaWYoIW5ldGlmX3J1bm5pbmcoZGV2KSkKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisKKyAgICBtZW1zZXQoZXNzaWRidWYsIDAsIHNpemVvZihlc3NpZGJ1ZikpOworCisgICAgcHJpbnRrKEtFUk5fRVJSICJ1c2JkcnZfaW9jdGxfc2V0ZXNzaWRcbiIpOworCisgICAgLy9wcmludGsoInNzaWRsZW49JWRcbiIsIGVycS0+bGVuZ3RoKTsgLy9mb3IgYW55LCBpdCBpcyAxLgorICAgIGlmIChlcnEtPmZsYWdzKSB7CisgICAgICAgIGlmIChlcnEtPmxlbmd0aCA+IChJV19FU1NJRF9NQVhfU0laRSsxKSkKKyAgICAgICAgICAgIHJldHVybiAtRTJCSUc7CisKKyAgICAgICAgaWYgKGNvcHlfZnJvbV91c2VyKGVzc2lkYnVmLCBlcnEtPnBvaW50ZXIsIGVycS0+bGVuZ3RoKSkKKyAgICAgICAgICAgIHJldHVybiAtRUZBVUxUOworICAgIH0KKworICAgIC8vemRfRGlzYXNvY0FsbCgyKTsKKyAgICAvL3dhaXRfbXMoMTAwKTsKKworICAgIHByaW50ayhLRVJOX0VSUiAiZXNzaWRidWY6ICIpOworCisgICAgZm9yKGkgPSAwOyBpIDwgZXJxLT5sZW5ndGg7IGkrKykKKyAgICB7CisgICAgICAgIHByaW50ayhLRVJOX0VSUiAiJTAyeCAiLCBlc3NpZGJ1ZltpXSk7CisgICAgfQorCisgICAgcHJpbnRrKEtFUk5fRVJSICJcbiIpOworCisgICAgZXNzaWRidWZbZXJxLT5sZW5ndGhdID0gJ1wwJzsKKyAgICAvL21lbWNweShtYWNwLT53ZC53cy5zc2lkLCBlc3NpZGJ1ZiwgZXJxLT5sZW5ndGgpOworICAgIC8vbWFjcC0+d2Qud3Muc3NpZExlbiA9IHN0cmxlbihlc3NpZGJ1ZikrMjsKKyAgICAvL21hY3AtPndkLndzLnNzaWRbMV0gPSBzdHJsZW4oZXNzaWRidWYpOyAvLyBVcGRhdGUgc3NpZCBsZW5ndGgKKworICAgIHpmaVdsYW5TZXRTU0lEKGRldiwgZXNzaWRidWYsIGVycS0+bGVuZ3RoKTsKKyNpZiAwCisgICAgcHJpbnRrKEtFUk5fRVJSICJtYWNwLT53ZC53cy5zc2lkOiAiKTsKKworICAgIGZvcihpID0gMDsgaSA8IG1hY3AtPndkLndzLnNzaWRMZW47IGkrKykKKyAgICB7CisgICAgICAgIHByaW50ayhLRVJOX0VSUiAiJTAyeCAiLCBtYWNwLT53ZC53cy5zc2lkW2ldKTsKKyAgICB9CisKKyAgICBwcmludGsoS0VSTl9FUlIgIlxuIik7CisjZW5kaWYKKyAgICB6ZmlXbGFuRGlzYWJsZShkZXYsIDApOworICAgIHpmaVdsYW5FbmFibGUoZGV2KTsKKworI2VuZGlmCisKKyAgICByZXR1cm4gMDsKK30KKworaW50IHVzYmRydl9pb2N0bF9nZXRlc3NpZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcG9pbnQgKmVycSkKK3sKKyAgICAgLy9zdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AgPSBkZXYtPm1sX3ByaXY7CisgICAgIHU4X3QgZXNzaWRidWZbSVdfRVNTSURfTUFYX1NJWkUrMV07CisgICAgIHU4X3QgbGVuOworICAgICB1OF90IGk7CisKKworICAgICAvL2xlbiA9IG1hY3AtPndkLndzLnNzaWRMZW47CisgICAgIC8vbWVtY3B5KGVzc2lkYnVmLCBtYWNwLT53ZC53cy5zc2lkLCBtYWNwLT53ZC53cy5zc2lkTGVuKTsKKyAgICAgemZpV2xhblF1ZXJ5U1NJRChkZXYsIGVzc2lkYnVmLCAmbGVuKTsKKworICAgICBlc3NpZGJ1ZltsZW5dID0gMDsKKworICAgICBwcmludGsoS0VSTl9FUlIgIkVTU0lEOiAiKTsKKworICAgICBmb3IoaSA9IDA7IGkgPCBsZW47IGkrKykKKyAgICAgeworICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICIlYyIsIGVzc2lkYnVmW2ldKTsKKyAgICAgfQorCisgICAgIHByaW50ayhLRVJOX0VSUiAiXG4iKTsKKworICAgICBlcnEtPmZsYWdzPSAxOworICAgICBlcnEtPmxlbmd0aCA9IHN0cmxlbihlc3NpZGJ1ZikgKyAxOworCisgICAgIGlmIChlcnEtPnBvaW50ZXIpCisgICAgICAgICBpZiAoY29weV90b191c2VyKGVycS0+cG9pbnRlciwgZXNzaWRidWYsIGVycS0+bGVuZ3RoKSkKKyAgICAgICAgICAgICByZXR1cm4gLUVGQVVMVDsKKworICAgICByZXR1cm4gMDsKK30KKworCitpbnQgdXNiZHJ2X2lvY3RsX3NldHJ0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcGFyYW0gKnJycSkKK3sKKworICAgIHJldHVybiAwOworfQorCisjaWYgV0lSRUxFU1NfRVhUID4gMTQKKy8qCisgKiBFbmNvZGUgYSBXUEEgb3IgUlNOIGluZm9ybWF0aW9uIGVsZW1lbnQgYXMgYSBjdXN0b20KKyAqIGVsZW1lbnQgdXNpbmcgdGhlIGhvc3RhcCBmb3JtYXQuCisgKi8KK3UzMiBlbmNvZGVfaWUodm9pZCAqYnVmLCB1MzIgYnVmc2l6ZSwgY29uc3QgdTggKmllLCB1MzIgaWVsZW4sIGNvbnN0IHU4ICpsZWFkZXIsIHUzMiBsZWFkZXJfbGVuKQoreworICAgIHU4ICpwOworICAgIHUzMiBpOworCisgICAgaWYgKGJ1ZnNpemUgPCBsZWFkZXJfbGVuKQorICAgICAgICByZXR1cm4gMDsKKyAgICBwID0gYnVmOworICAgIG1lbWNweShwLCBsZWFkZXIsIGxlYWRlcl9sZW4pOworICAgIGJ1ZnNpemUgLT0gbGVhZGVyX2xlbjsKKyAgICBwICs9IGxlYWRlcl9sZW47CisgICAgZm9yIChpID0gMDsgaSA8IGllbGVuICYmIGJ1ZnNpemUgPiAyOyBpKyspCisgICAgICAgIHAgKz0gc3ByaW50ZihwLCAiJTAyeCIsIGllW2ldKTsKKyAgICByZXR1cm4gKGkgPT0gaWVsZW4gPyBwIC0gKHU4ICopYnVmIDogMCk7Cit9CisjZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFdJUkVMRVNTX0VYVCA+IDE0ICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBUcmFuc2xhdGUgc2NhbiBkYXRhIHJldHVybmVkIGZyb20gdGhlIGNhcmQgdG8gYSBjYXJkIGluZGVwZW5kZW50CisgKiBmb3JtYXQgdGhhdCB0aGUgV2lyZWxlc3MgVG9vbHMgd2lsbCB1bmRlcnN0YW5kCisgKi8KK2NoYXIgKnVzYmRydl90cmFuc2xhdGVfc2NhbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sIGNoYXIgKmN1cnJlbnRfZXYsCisgICAgICAgIGNoYXIgKmVuZF9idWYsIHN0cnVjdCB6c0Jzc0luZm8gKmxpc3QpCit7CisgICAgc3RydWN0IGl3X2V2ZW50IGl3ZTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRlbXBvcmFyeSBidWZmZXIgKi8KKyAgICB1MTZfdCBjYXBhYmlsaXRpZXM7CisgICAgY2hhciAqY3VycmVudF92YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZvciByYXRlcyAqLworICAgIGNoYXIgKmxhc3RfZXY7CisgICAgaW50IGk7CisjaWYgV0lSRUxFU1NfRVhUID4gMTQKKyAgICBjaGFyICAgIGJ1Zls2NCoyICsgMzBdOworI2VuZGlmCisKKyAgICBsYXN0X2V2ID0gY3VycmVudF9ldjsKKworLyogRmlyc3QgZW50cnkgKk1VU1QqIGJlIHRoZSBBUCBNQUMgYWRkcmVzcyAqLworICAgIGl3ZS5jbWQgPSBTSU9DR0lXQVA7CisgICAgaXdlLnUuYXBfYWRkci5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7CisgICAgbWVtY3B5KGl3ZS51LmFwX2FkZHIuc2FfZGF0YSwgbGlzdC0+YnNzaWQsIEVUSF9BTEVOKTsKKyAgICBjdXJyZW50X2V2ID0gaXdlX3N0cmVhbV9hZGRfZXZlbnQoCisJaW5mbywKKwljdXJyZW50X2V2LAorCWVuZF9idWYsICZpd2UsIElXX0VWX0FERFJfTEVOKTsKKworICAgIC8qIFJhbiBvdXQgb2YgYnVmZmVyICovCisgICAgaWYgKGxhc3RfZXYgPT0gY3VycmVudF9ldikKKyAgICB7CisgICAgICAgIHJldHVybiBlbmRfYnVmOworICAgIH0KKworICAgIGxhc3RfZXYgPSBjdXJyZW50X2V2OworCisvKiBPdGhlciBlbnRyaWVzIHdpbGwgYmUgZGlzcGxheWVkIGluIHRoZSBvcmRlciB3ZSBnaXZlIHRoZW0gKi8KKworLyogQWRkIHRoZSBFU1NJRCAqLworICAgIGl3ZS51LmRhdGEubGVuZ3RoID0gbGlzdC0+c3NpZFsxXTsKKyAgICBpZihpd2UudS5kYXRhLmxlbmd0aCA+IDMyKQorICAgICAgICBpd2UudS5kYXRhLmxlbmd0aCA9IDMyOworICAgIGl3ZS5jbWQgPSBTSU9DR0lXRVNTSUQ7CisgICAgaXdlLnUuZGF0YS5mbGFncyA9IDE7CisgICAgY3VycmVudF9ldiA9IGl3ZV9zdHJlYW1fYWRkX3BvaW50KAorCWluZm8sCisJY3VycmVudF9ldiwgZW5kX2J1ZiwgJml3ZSwgJmxpc3QtPnNzaWRbMl0pOworCisgICAgLyogUmFuIG91dCBvZiBidWZmZXIgKi8KKyAgICBpZiAobGFzdF9ldiA9PSBjdXJyZW50X2V2KQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVuZF9idWY7CisgICAgfQorCisgICAgbGFzdF9ldiA9IGN1cnJlbnRfZXY7CisKKy8qIEFkZCBtb2RlICovCisgICAgaXdlLmNtZCA9IFNJT0NHSVdNT0RFOworICAgIGNhcGFiaWxpdGllcyA9IChsaXN0LT5jYXBhYmlsaXR5WzFdIDw8IDgpICsgbGlzdC0+Y2FwYWJpbGl0eVswXTsKKyAgICBpZihjYXBhYmlsaXRpZXMgJiAoMHgwMSB8IDB4MDIpKQorICAgIHsKKyAgICAgICAgaWYoY2FwYWJpbGl0aWVzICYgMHgwMSkKKyAgICAgICAgICAgIGl3ZS51Lm1vZGUgPSBJV19NT0RFX01BU1RFUjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgaXdlLnUubW9kZSA9IElXX01PREVfQURIT0M7CisgICAgICAgIGN1cnJlbnRfZXYgPSBpd2Vfc3RyZWFtX2FkZF9ldmVudCgKKwkJaW5mbywKKwkJY3VycmVudF9ldiwgZW5kX2J1ZiwgJml3ZSwgSVdfRVZfVUlOVF9MRU4pOworICAgIH0KKworICAgIC8qIFJhbiBvdXQgb2YgYnVmZmVyICovCisgICAgaWYgKGxhc3RfZXYgPT0gY3VycmVudF9ldikKKyAgICB7CisgICAgICAgIHJldHVybiBlbmRfYnVmOworICAgIH0KKworICAgIGxhc3RfZXYgPSBjdXJyZW50X2V2OworCisvKiBBZGQgZnJlcXVlbmN5ICovCisgICAgaXdlLmNtZCA9IFNJT0NHSVdGUkVROworICAgIGl3ZS51LmZyZXEubSA9IGxpc3QtPmNoYW5uZWw7CisvKiBDaGFubmVsIGZyZXF1ZW5jeSBpbiBLSHogKi8KKyAgICBpZiAoaXdlLnUuZnJlcS5tID4gMTQpCisgICAgeworICAgICAgICBpZiAoKDE4NCA8PSBpd2UudS5mcmVxLm0pICYmIChpd2UudS5mcmVxLm08PTE5NikpCisgICAgICAgICAgICAgIGl3ZS51LmZyZXEubSA9IDQwMDAgKyBpd2UudS5mcmVxLm0gKiA1OworICAgICAgICBlbHNlCisgICAgICAgICAgICAgIGl3ZS51LmZyZXEubSA9IDUwMDAgKyBpd2UudS5mcmVxLm0gKiA1OworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpZiAoaXdlLnUuZnJlcS5tID09IDE0KQorICAgICAgICAgICAgICBpd2UudS5mcmVxLm0gPSAyNDg0OworICAgICAgICBlbHNlCisgICAgICAgICAgICAgIGl3ZS51LmZyZXEubSA9IDI0MTIgKyAoaXdlLnUuZnJlcS5tIC0gMSkgKiA1OworICAgIH0KKyAgICBpd2UudS5mcmVxLmUgPSA2OworICAgIGN1cnJlbnRfZXYgPSBpd2Vfc3RyZWFtX2FkZF9ldmVudCgKKwlpbmZvLAorICAgIAljdXJyZW50X2V2LCBlbmRfYnVmLCAmaXdlLCBJV19FVl9GUkVRX0xFTik7CisKKyAgICAvKiBSYW4gb3V0IG9mIGJ1ZmZlciAqLworICAgIGlmIChsYXN0X2V2ID09IGN1cnJlbnRfZXYpCisgICAgeworICAgICAgICByZXR1cm4gZW5kX2J1ZjsKKyAgICB9CisKKyAgICBsYXN0X2V2ID0gY3VycmVudF9ldjsKKworLyogQWRkIHF1YWxpdHkgc3RhdGlzdGljcyAqLworICAgIGl3ZS5jbWQgPSBJV0VWUVVBTDsKKyNpZiBXSVJFTEVTU19FWFQgPiAxOAorICAgIGl3ZS51LnF1YWwudXBkYXRlZCA9IElXX1FVQUxfUVVBTF9VUERBVEVEIHwgSVdfUVVBTF9MRVZFTF9VUERBVEVECisgICAgICAgICAgICAgICAgICAgICAgICB8SVdfUVVBTF9OT0lTRV9VUERBVEVEOworI2VuZGlmCisgICAgaXdlLnUucXVhbC5sZXZlbCA9IGxpc3QtPnNpZ25hbFN0cmVuZ3RoOworICAgIGl3ZS51LnF1YWwubm9pc2UgPSAwOworICAgIGl3ZS51LnF1YWwucXVhbCA9IGxpc3QtPnNpZ25hbFF1YWxpdHk7CisgICAgY3VycmVudF9ldiA9IGl3ZV9zdHJlYW1fYWRkX2V2ZW50KAorCWluZm8sCisJY3VycmVudF9ldiwgZW5kX2J1ZiwgJml3ZSwgSVdfRVZfUVVBTF9MRU4pOworCisgICAgLyogUmFuIG91dCBvZiBidWZmZXIgKi8KKyAgICBpZiAobGFzdF9ldiA9PSBjdXJyZW50X2V2KQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVuZF9idWY7CisgICAgfQorCisgICAgbGFzdF9ldiA9IGN1cnJlbnRfZXY7CisKKy8qIEFkZCBlbmNyeXB0aW9uIGNhcGFiaWxpdHkgKi8KKworICAgIGl3ZS5jbWQgPSBTSU9DR0lXRU5DT0RFOworICAgIGlmKGNhcGFiaWxpdGllcyAmIDB4MTApCisgICAgICAgIGl3ZS51LmRhdGEuZmxhZ3MgPSBJV19FTkNPREVfRU5BQkxFRCB8IElXX0VOQ09ERV9OT0tFWTsKKyAgICBlbHNlCisgICAgICAgIGl3ZS51LmRhdGEuZmxhZ3MgPSBJV19FTkNPREVfRElTQUJMRUQ7CisKKyAgICBpd2UudS5kYXRhLmxlbmd0aCA9IDA7CisgICAgY3VycmVudF9ldiA9IGl3ZV9zdHJlYW1fYWRkX3BvaW50KAorCWluZm8sCisJY3VycmVudF9ldiwgZW5kX2J1ZiwgJml3ZSwgbGlzdC0+c3NpZCk7CisKKyAgICAvKiBSYW4gb3V0IG9mIGJ1ZmZlciAqLworICAgIGlmIChsYXN0X2V2ID09IGN1cnJlbnRfZXYpCisgICAgeworICAgICAgICByZXR1cm4gZW5kX2J1ZjsKKyAgICB9CisKKyAgICBsYXN0X2V2ID0gY3VycmVudF9ldjsKKworLyogUmF0ZSA6IHN0dWZmaW5nIG11bHRpcGxlIHZhbHVlcyBpbiBhIHNpbmdsZSBldmVudCByZXF1aXJlIGEgYml0CisgKiBtb3JlIG9mIG1hZ2ljICovCisgICAgY3VycmVudF92YWwgPSBjdXJyZW50X2V2ICsgSVdfRVZfTENQX0xFTjsKKworICAgIGl3ZS5jbWQgPSBTSU9DR0lXUkFURTsKKy8qIFRob3NlIHR3byBmbGFncyBhcmUgaWdub3JlZC4uLiAqLworICAgIGl3ZS51LmJpdHJhdGUuZml4ZWQgPSBpd2UudS5iaXRyYXRlLmRpc2FibGVkID0gMDsKKworICAgIGZvcihpID0gMCA7IGkgPCBsaXN0LT5zdXBwb3J0ZWRSYXRlc1sxXSA7IGkrKykKKyAgICB7CisvKiBCaXQgcmF0ZSBnaXZlbiBpbiA1MDAga2IvcyB1bml0cyAoKyAweDgwKSAqLworICAgICAgICBpd2UudS5iaXRyYXRlLnZhbHVlID0gKChsaXN0LT5zdXBwb3J0ZWRSYXRlc1tpKzJdICYgMHg3ZikgKiA1MDAwMDApOworLyogQWRkIG5ldyB2YWx1ZSB0byBldmVudCAqLworICAgICAgICBjdXJyZW50X3ZhbCA9IGl3ZV9zdHJlYW1fYWRkX3ZhbHVlKAorCQlpbmZvLAorCQljdXJyZW50X2V2LCBjdXJyZW50X3ZhbCwgZW5kX2J1ZiwgJml3ZSwgSVdfRVZfUEFSQU1fTEVOKTsKKworICAgICAgICAvKiBSYW4gb3V0IG9mIGJ1ZmZlciAqLworICAgICAgICBpZiAobGFzdF9ldiA9PSBjdXJyZW50X3ZhbCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGVuZF9idWY7CisgICAgICAgIH0KKworICAgICAgICBsYXN0X2V2ID0gY3VycmVudF92YWw7CisgICAgfQorCisgICAgZm9yIChpID0gMCA7IGkgPCBsaXN0LT5leHRTdXBwb3J0ZWRSYXRlc1sxXSA7IGkrKykKKyAgICB7CisvKiBCaXQgcmF0ZSBnaXZlbiBpbiA1MDAga2IvcyB1bml0cyAoKyAweDgwKSAqLworICAgICAgICBpd2UudS5iaXRyYXRlLnZhbHVlID0gKChsaXN0LT5leHRTdXBwb3J0ZWRSYXRlc1tpKzJdICYgMHg3ZikgKiA1MDAwMDApOworLyogQWRkIG5ldyB2YWx1ZSB0byBldmVudCAqLworICAgICAgICBjdXJyZW50X3ZhbCA9IGl3ZV9zdHJlYW1fYWRkX3ZhbHVlKAorCQlpbmZvLAorCQljdXJyZW50X2V2LCBjdXJyZW50X3ZhbCwgZW5kX2J1ZiwgJml3ZSwgSVdfRVZfUEFSQU1fTEVOKTsKKworICAgICAgICAvKiBSYW4gb3V0IG9mIGJ1ZmZlciAqLworICAgICAgICBpZiAobGFzdF9ldiA9PSBjdXJyZW50X3ZhbCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGVuZF9idWY7CisgICAgICAgIH0KKworICAgICAgICBsYXN0X2V2ID0gY3VycmVudF9ldjsKKyAgICB9CisKKy8qIENoZWNrIGlmIHdlIGFkZGVkIGFueSBldmVudCAqLworICAgIGlmKChjdXJyZW50X3ZhbCAtIGN1cnJlbnRfZXYpID4gSVdfRVZfTENQX0xFTikKKyAgICAgICAgY3VycmVudF9ldiA9IGN1cnJlbnRfdmFsOworI2lmIFdJUkVMRVNTX0VYVCA+IDE0CisjZGVmaW5lIElFRUU4MDIxMV9FTEVNSURfUlNOIDB4MzAKKyAgICBtZW1zZXQoJml3ZSwgMCwgc2l6ZW9mKGl3ZSkpOworICAgIGl3ZS5jbWQgPSBJV0VWQ1VTVE9NOworICAgIHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJiY25faW50PSVkIiwgKGxpc3QtPmJlYWNvbkludGVydmFsWzFdIDw8IDgpICsgbGlzdC0+YmVhY29uSW50ZXJ2YWxbMF0pOworICAgIGl3ZS51LmRhdGEubGVuZ3RoID0gc3RybGVuKGJ1Zik7CisgICAgY3VycmVudF9ldiA9IGl3ZV9zdHJlYW1fYWRkX3BvaW50KAorCQlpbmZvLAorCQljdXJyZW50X2V2LCBlbmRfYnVmLCAmaXdlLCBidWYpOworCisgICAgLyogUmFuIG91dCBvZiBidWZmZXIgKi8KKyAgICBpZiAobGFzdF9ldiA9PSBjdXJyZW50X2V2KQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVuZF9idWY7CisgICAgfQorCisgICAgbGFzdF9ldiA9IGN1cnJlbnRfZXY7CisKKyAgICBpZiAobGlzdC0+d3BhSWVbMV0gIT0gMCkKKyAgICB7CisgICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIHJzbl9sZWFkZXJbXSA9ICJyc25faWU9IjsKKyAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgd3BhX2xlYWRlcltdID0gIndwYV9pZT0iOworCisgICAgICAgIG1lbXNldCgmaXdlLCAwLCBzaXplb2YoaXdlKSk7CisgICAgICAgIGl3ZS5jbWQgPSBJV0VWQ1VTVE9NOworICAgICAgICBpZiAobGlzdC0+d3BhSWVbMF0gPT0gSUVFRTgwMjExX0VMRU1JRF9SU04pCisgICAgICAgICAgICBpd2UudS5kYXRhLmxlbmd0aCA9IGVuY29kZV9pZShidWYsIHNpemVvZihidWYpLAorICAgICAgICAgICAgICAgIGxpc3QtPndwYUllLCBsaXN0LT53cGFJZVsxXSsyLAorICAgICAgICAgICAgICAgIHJzbl9sZWFkZXIsIHNpemVvZihyc25fbGVhZGVyKS0xKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgaXdlLnUuZGF0YS5sZW5ndGggPSBlbmNvZGVfaWUoYnVmLCBzaXplb2YoYnVmKSwKKyAgICAgICAgICAgICAgICBsaXN0LT53cGFJZSwgbGlzdC0+d3BhSWVbMV0rMiwKKyAgICAgICAgICAgICAgICB3cGFfbGVhZGVyLCBzaXplb2Yod3BhX2xlYWRlciktMSk7CisKKyAgICAgICAgaWYgKGl3ZS51LmRhdGEubGVuZ3RoICE9IDApCisgICAgICAgICAgICBjdXJyZW50X2V2ID0gaXdlX3N0cmVhbV9hZGRfcG9pbnQoCisJCWluZm8sCisJCWN1cnJlbnRfZXYsIGVuZF9idWYsICZpd2UsIGJ1Zik7CisKKyAgICAgICAgLyogUmFuIG91dCBvZiBidWZmZXIgKi8KKyAgICAgICAgaWYgKGxhc3RfZXYgPT0gY3VycmVudF9ldikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGVuZF9idWY7CisgICAgICAgIH0KKworICAgICAgICBsYXN0X2V2ID0gY3VycmVudF9ldjsKKyAgICB9CisgICAgaWYgKGxpc3QtPnJzbkllWzFdICE9IDApCisgICAgeworICAgICAgICBzdGF0aWMgY29uc3QgY2hhciByc25fbGVhZGVyW10gPSAicnNuX2llPSI7CisgICAgICAgIG1lbXNldCgmaXdlLCAwLCBzaXplb2YoaXdlKSk7CisgICAgICAgIGl3ZS5jbWQgPSBJV0VWQ1VTVE9NOworCisgICAgICAgIGlmIChsaXN0LT5yc25JZVswXSA9PSBJRUVFODAyMTFfRUxFTUlEX1JTTikKKyAgICAgICAgeworICAgICAgICAgICAgaXdlLnUuZGF0YS5sZW5ndGggPSBlbmNvZGVfaWUoYnVmLCBzaXplb2YoYnVmKSwKKyAgICAgICAgICAgICAgICBsaXN0LT5yc25JZSwgbGlzdC0+cnNuSWVbMV0rMiwKKyAgICAgICAgICAgICAgICByc25fbGVhZGVyLCBzaXplb2YocnNuX2xlYWRlciktMSk7CisgICAgICAgICAgICBpZiAoaXdlLnUuZGF0YS5sZW5ndGggIT0gMCkKKyAgICAgICAgICAgICAgICBjdXJyZW50X2V2ID0gaXdlX3N0cmVhbV9hZGRfcG9pbnQoCisJCQlpbmZvLAorCQkJY3VycmVudF9ldiwgZW5kX2J1ZiwgICZpd2UsIGJ1Zik7CisKKyAgICAgICAgICAgIC8qIFJhbiBvdXQgb2YgYnVmZmVyICovCisgICAgICAgICAgICBpZiAobGFzdF9ldiA9PSBjdXJyZW50X2V2KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBlbmRfYnVmOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBsYXN0X2V2ID0gY3VycmVudF9ldjsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgorLyogVGhlIG90aGVyIGRhdGEgaW4gdGhlIHNjYW4gcmVzdWx0IGFyZSBub3QgcmVhbGx5CisgKiBpbnRlcmVzdGluZywgc28gZm9yIG5vdyBkcm9wIGl0ICovCisgICAgcmV0dXJuIGN1cnJlbnRfZXY7Cit9CisKK2ludCB1c2JkcnZ3ZXh0X2dpd25hbWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKyAgICAgICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisgICAgICAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnEsIGNoYXIgKmV4dHJhKQoreworICAgIC8vc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gZGV2LT5tbF9wcml2OworCisgICAgc3RyY3B5KHdycS0+bmFtZSwgIklFRUUgODAyLjExLU1JTU8iKTsKKworICAgIHJldHVybiAwOworfQorCitpbnQgdXNiZHJ2d2V4dF9zaXdmcmVxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisgICAgICAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorICAgICAgICAgICAgc3RydWN0IGl3X2ZyZXEgKmZyZXEsIGNoYXIgKmV4dHJhKQoreworICAgIHUzMl90IEZyZXFLSHo7CisgICAgc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gZGV2LT5tbF9wcml2OworCisgICAgaWYoIW5ldGlmX3J1bm5pbmcoZGV2KSkKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisKKyAgICBpZiAoZnJlcS0+ZSA+IDEpCisgICAgICAgIHJldHVybiAtRUlOVkFMOworCisgICAgaWYgKGZyZXEtPmUgPT0gMSkKKyAgICB7CisgICAgICAgIEZyZXFLSHogPSAoZnJlcS0+bSAvIDEwMDAwMCk7CisKKyAgICAgICAgaWYgKEZyZXFLSHogPiA0MDAwMDAwKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoRnJlcUtIeiA+IDU4MjUwMDApCisgICAgICAgICAgICAgICAgRnJlcUtIeiA9IDU4MjUwMDA7CisgICAgICAgICAgICBlbHNlIGlmIChGcmVxS0h6IDwgNDkyMDAwMCkKKyAgICAgICAgICAgICAgICBGcmVxS0h6ID0gNDkyMDAwMDsKKyAgICAgICAgICAgIGVsc2UgaWYgKEZyZXFLSHogPCA1MDAwMDAwKQorICAgICAgICAgICAgICAgIEZyZXFLSHogPSAoKChGcmVxS0h6IC0gNDAwMDAwMCkgLyA1MDAwKSAqIDUwMDApICsgNDAwMDAwMDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBGcmVxS0h6ID0gKCgoRnJlcUtIeiAtIDUwMDAwMDApIC8gNTAwMCkgKiA1MDAwKSArIDUwMDAwMDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoRnJlcUtIeiA+IDI0ODQwMDApCisgICAgICAgICAgICAgICAgRnJlcUtIeiA9IDI0ODQwMDA7CisgICAgICAgICAgICBlbHNlIGlmIChGcmVxS0h6IDwgMjQxMjAwMCkKKyAgICAgICAgICAgICAgICBGcmVxS0h6ID0gMjQxMjAwMDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBGcmVxS0h6ID0gKCgoRnJlcUtIeiAtIDI0MTIwMDApIC8gNTAwMCkgKiA1MDAwKSArIDI0MTIwMDA7CisgICAgICAgIH0KKworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBGcmVxS0h6ID0gdXNiZHJ2X2NoYW4yZnJlcShmcmVxLT5tKTsKKworICAgICAgICBpZiAoRnJlcUtIeiAhPSAtMSkKKyAgICAgICAgICAgIEZyZXFLSHogKj0gMTAwMDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgRnJlcUtIeiA9IDI0MTIwMDA7CisgICAgfQorCisgICAgLy9wcmludGsoImZyZXEtPm06ICVkLCBmcmVxLT5lOiAlZFxuIiwgZnJlcS0+bSwgZnJlcS0+ZSk7CisgICAgLy9wcmludGsoIkZyZXFLSHo6ICVkXG4iLCBGcmVxS0h6KTsKKworICAgIGlmIChtYWNwLT5EZXZpY2VPcGVuZWQgPT0gMSkKKyAgICB7CisgICAgICAgIHpmaVdsYW5TZXRGcmVxdWVuY3koZGV2LCBGcmVxS0h6LCAwKTsgLy8gSW1tZWRpYXRlCisgICAgICAgIC8vdThfdCB3cGFpZUxlbix3cGFpZVs1MF07CisgICAgICAgIC8vemZpV2xhblF1ZXJ5V3BhSWUoZGV2LCB3cGFpZSwgJndwYWllTGVuKTsKKyAgICAgICAgemZpV2xhbkRpc2FibGUoZGV2LCAwKTsKKyAgICAgICAgemZpV2xhbkVuYWJsZShkZXYpOworICAgICAgICAvL2lmICh3cGFpZUxlbiA+IDIpCisgICAgICAgIC8vICAgIHpmaVdsYW5TZXRXcGFJZShkZXYsIHdwYWllLCB3cGFpZUxlbik7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCB1c2JkcnZ3ZXh0X2dpd2ZyZXEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKyAgICAgICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisgICAgICAgICAgICBzdHJ1Y3QgaXdfZnJlcSAqZnJlcSwgY2hhciAqZXh0cmEpCit7CisgICAgc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gZGV2LT5tbF9wcml2OworCisgICAgaWYgKG1hY3AtPkRldmljZU9wZW5lZCAhPSAxKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGZyZXEtPm0gPSB6ZmlXbGFuUXVlcnlGcmVxdWVuY3koZGV2KTsKKyAgICBmcmVxLT5lID0gMzsKKworICAgIHJldHVybiAwOworfQorCitpbnQgdXNiZHJ2d2V4dF9zaXdtb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisgICAgICAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorICAgICAgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxLCBjaGFyICpleHRyYSkKK3sKKyAgICBzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AgPSBkZXYtPm1sX3ByaXY7CisgICAgdThfdCBXbGFuTW9kZTsKKworICAgIGlmKCFuZXRpZl9ydW5uaW5nKGRldikpCisgICAgICAgIHJldHVybiAtRUlOVkFMOworCisgICAgaWYgKG1hY3AtPkRldmljZU9wZW5lZCAhPSAxKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHN3aXRjaCh3cnEtPm1vZGUpCisgICAgeworICAgICAgICBjYXNlIElXX01PREVfTUFTVEVSOgorICAgICAgICAgICAgV2xhbk1vZGUgPSBaTV9NT0RFX0FQOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgSVdfTU9ERV9JTkZSQToKKyAgICAgICAgICAgIFdsYW5Nb2RlID0gWk1fTU9ERV9JTkZSQVNUUlVDVFVSRTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIElXX01PREVfQURIT0M6CisgICAgICAgICAgICBXbGFuTW9kZSA9IFpNX01PREVfSUJTUzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgV2xhbk1vZGUgPSBaTV9NT0RFX0lCU1M7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICB6ZmlXbGFuU2V0V2xhbk1vZGUoZGV2LFdsYW5Nb2RlKTsKKyAgICB6ZmlXbGFuRGlzYWJsZShkZXYsIDEpOworICAgIHpmaVdsYW5FbmFibGUoZGV2KTsKKworICAgIHJldHVybiAwOworfQorCitpbnQgdXNiZHJ2d2V4dF9naXdtb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisgICAgICAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorICAgICAgICAgICAgX191MzIgKm1vZGUsIGNoYXIgKmV4dHJhKQoreworICAgIHVuc2lnbmVkIGxvbmcgaXJxRmxhZzsKKyAgICBzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AgPSBkZXYtPm1sX3ByaXY7CisKKyAgICBpZighbmV0aWZfcnVubmluZyhkZXYpKQorICAgICAgICByZXR1cm4gLUVJTlZBTDsKKworICAgIGlmIChtYWNwLT5EZXZpY2VPcGVuZWQgIT0gMSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBzcGluX2xvY2tfaXJxc2F2ZSgmbWFjcC0+Y3NfbG9jaywgaXJxRmxhZyk7CisKKyAgICBzd2l0Y2goemZpV2xhblF1ZXJ5V2xhbk1vZGUoZGV2KSkKKyAgICB7CisgICAgICAgIGNhc2UgWk1fTU9ERV9BUDoKKyAgICAgICAgICAgICptb2RlID0gSVdfTU9ERV9NQVNURVI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBaTV9NT0RFX0lORlJBU1RSVUNUVVJFOgorICAgICAgICAgICAgKm1vZGUgPSBJV19NT0RFX0lORlJBOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgWk1fTU9ERV9JQlNTOgorICAgICAgICAgICAgKm1vZGUgPSBJV19NT0RFX0FESE9DOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAqbW9kZSA9IElXX01PREVfQURIT0M7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtYWNwLT5jc19sb2NrLCBpcnFGbGFnKTsKKworICAgIHJldHVybiAwOworfQorCitpbnQgdXNiZHJ2d2V4dF9zaXdzZW5zKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJc3RydWN0IGl3X3BhcmFtICpzZW5zLCBjaGFyICpleHRyYSkKK3sKKwlyZXR1cm4gMDsKK30KKworaW50IHVzYmRydndleHRfZ2l3c2VucyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCXN0cnVjdCBpd19wYXJhbSAqc2VucywgY2hhciAqZXh0cmEpCit7CisJc2Vucy0+dmFsdWUgPSAwOworCXNlbnMtPmZpeGVkID0gMTsKKworCXJldHVybiAwOworfQorCitpbnQgdXNiZHJ2d2V4dF9naXdyYW5nZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICAgICAgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKyAgICAgICAgICAgIHN0cnVjdCBpd19wb2ludCAqZGF0YSwgY2hhciAqZXh0cmEpCit7CisgICAgc3RydWN0IGl3X3JhbmdlICpyYW5nZSA9IChzdHJ1Y3QgaXdfcmFuZ2UgKikgZXh0cmE7CisgICAgaW50IGksIHZhbDsKKyAgICAvL2ludCBudW1fYmFuZF9hOworICAgIHUxNl90IGNoYW5uZWxzWzYwXTsKKyAgICB1MTZfdCBjaGFubmVsX251bTsKKworICAgIGlmKCFuZXRpZl9ydW5uaW5nKGRldikpCisgICAgICAgIHJldHVybiAtRUlOVkFMOworCisjaWYgV0lSRUxFU1NfRVhUID4gOQorICAgIHJhbmdlLT50eHBvd2VyX2NhcGEgPSBJV19UWFBPV19EQk07CisvLyBYWFggd2hhdCBhYm91dCBtaW4vbWF4X3BtcCwgbWluL21heF9wbXQsIGV0Yy4KKyNlbmRpZgorCisjaWYgV0lSRUxFU1NfRVhUID4gMTAKKyAgICByYW5nZS0+d2VfdmVyc2lvbl9jb21waWxlZCA9IFdJUkVMRVNTX0VYVDsKKyAgICByYW5nZS0+d2VfdmVyc2lvbl9zb3VyY2UgPSAxMzsKKworICAgIHJhbmdlLT5yZXRyeV9jYXBhID0gSVdfUkVUUllfTElNSVQ7CisgICAgcmFuZ2UtPnJldHJ5X2ZsYWdzID0gSVdfUkVUUllfTElNSVQ7CisgICAgcmFuZ2UtPm1pbl9yZXRyeSA9IDA7CisgICAgcmFuZ2UtPm1heF9yZXRyeSA9IDI1NTsKKyNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBXSVJFTEVTU19FWFQgPiAxMCAqLworCisgICAgY2hhbm5lbF9udW0gPSB6ZmlXbGFuUXVlcnlBbGxvd0NoYW5uZWxzKGRldiwgY2hhbm5lbHMpOworCisgICAgLyogR3VyYW50ZWUgcmVwb3J0ZWQgY2hhbm5lbCBudW1iZXJzIGlzIGxlc3Mgb3IgZXF1YWwgdG8gSVdfTUFYX0ZSRVFVRU5DSUVTICovCisgICAgaWYgKGNoYW5uZWxfbnVtID4gSVdfTUFYX0ZSRVFVRU5DSUVTKQorICAgICAgICBjaGFubmVsX251bSA9IElXX01BWF9GUkVRVUVOQ0lFUzsKKworICAgIHZhbCA9IDA7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgY2hhbm5lbF9udW07IGkrKykKKyAgICB7CisgICAgICAgIHJhbmdlLT5mcmVxW3ZhbF0uaSA9IHVzYmRydl9mcmVxMmNoYW4oY2hhbm5lbHNbaV0pOworICAgICAgICByYW5nZS0+ZnJlcVt2YWxdLm0gPSBjaGFubmVsc1tpXTsKKyAgICAgICAgcmFuZ2UtPmZyZXFbdmFsXS5lID0gNjsKKyAgICAgICAgdmFsKys7CisgICAgfQorCisgICAgcmFuZ2UtPm51bV9jaGFubmVscyA9IGNoYW5uZWxfbnVtOworICAgIHJhbmdlLT5udW1fZnJlcXVlbmN5ID0gY2hhbm5lbF9udW07CisKKyNpZiAwCisgICAgcmFuZ2UtPm51bV9jaGFubmVscyA9IDE0OyAvLyBPbmx5IDIuNEcKKworLyogWFhYIG5lZWQgdG8gZmlsdGVyIGFnYWluc3QgdGhlIHJlZ3VsYXRvcnkgZG9tYWluICZ8IGFjdGl2ZSBzZXQgKi8KKyAgICB2YWwgPSAwOworICAgIGZvciAoaSA9IDE7IGkgPD0gMTQ7IGkrKykgLy8gQixHIEJhbmRzCisgICAgeworICAgICAgICByYW5nZS0+ZnJlcVt2YWxdLmkgPSBpOworICAgICAgICBpZiAoaSA9PSAxNCkKKyAgICAgICAgICAgICAgcmFuZ2UtPmZyZXFbdmFsXS5tID0gMjQ4NDAwMDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgICByYW5nZS0+ZnJlcVt2YWxdLm0gPSAoMjQxMisoaS0xKSo1KSoxMDAwOworICAgICAgICByYW5nZS0+ZnJlcVt2YWxdLmUgPSAzOworICAgICAgICB2YWwrKzsKKyAgICB9CisKKyAgICBudW1fYmFuZF9hID0gKElXX01BWF9GUkVRVUVOQ0lFUyAtIHZhbCk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX2JhbmRfYTsgaSsrKSAvLyBBIEJhbmRzCisgICAgeworICAgICAgICByYW5nZS0+ZnJlcVt2YWxdLmkgPSBjaGFubmVsX2ZyZXF1ZW5jeV8xMUFbMiAqIGldOworICAgICAgICByYW5nZS0+ZnJlcVt2YWxdLm0gPSBjaGFubmVsX2ZyZXF1ZW5jeV8xMUFbMiAqIGkgKyAxXSAqIDEwMDA7CisgICAgICAgIHJhbmdlLT5mcmVxW3ZhbF0uZSA9IDM7CisgICAgICAgIHZhbCsrOworICAgIH0KKyAgICAvLyBNSU1PIFJhdGUgTm90IERlZmluZWQgTm93CisgICAgLy9Gb3IgODAyLjExYSwgdGhlcmUgYXJlIHRvbyBtb3JlIGZyZXF1ZW5jeS4gV2UgY2FuJ3QgcmV0dXJuIHRoZW0gYWxsCisgICAgcmFuZ2UtPm51bV9mcmVxdWVuY3kgPSB2YWw7CisjZW5kaWYKKworLyogTWF4IG9mIC9wcm9jL25ldC93aXJlbGVzcyAqLworICAgIHJhbmdlLT5tYXhfcXVhbC5xdWFsID0gMTAwOyAvLz8/ICAgICAgICAgICAgICAgICAgLy85MjsKKyAgICByYW5nZS0+bWF4X3F1YWwubGV2ZWwgPSAxNTQ7IC8vPz8KKyAgICByYW5nZS0+bWF4X3F1YWwubm9pc2UgPSAxNTQ7IC8vPz8KKyAgICByYW5nZS0+c2Vuc2l0aXZpdHkgPSAzOyAvLz8/CisKKy8vIFhYWCB0aGVzZSBuZWVkIHRvIGJlIG5zZC1zcGVjaWZpYyEKKyAgICByYW5nZS0+bWluX3J0cyA9IDA7CisgICAgcmFuZ2UtPm1heF9ydHMgPSAyMzQ3OworICAgIHJhbmdlLT5taW5fZnJhZyA9IDI1NjsKKyAgICByYW5nZS0+bWF4X2ZyYWcgPSAyMzQ2OworICAgIHJhbmdlLT5tYXhfZW5jb2RpbmdfdG9rZW5zID0gNC8qTlVNX1dFUEtFWVMqLzsgLy8/PworICAgIHJhbmdlLT5udW1fZW5jb2Rpbmdfc2l6ZXMgPSAyOyAvLz8/CisKKyAgICByYW5nZS0+ZW5jb2Rpbmdfc2l6ZVswXSA9IDU7IC8vPz8gICAgICAgICAgICAgICAvL1dFUCBLZXkgRW5jb2RpbmcgU2l6ZQorICAgIHJhbmdlLT5lbmNvZGluZ19zaXplWzFdID0gMTM7Ly8/PworCisvLyBYWFggd2hhdCBhYm91dCBudW1fYml0cmF0ZXMvdGhyb3VnaHB1dD8KKyAgICByYW5nZS0+bnVtX2JpdHJhdGVzID0gMDsgLy8/PworCisvKiBlc3RpbWF0ZWQgbWF4IHRocm91Z2hwdXQgKi8KKy8vIFhYWCBuZWVkIHRvIGNhcCBpdCBpZiB3ZSdyZSBydW5uaW5nIGF0IH4yTWJwcy4uCisKKyAgICByYW5nZS0+dGhyb3VnaHB1dCA9IDMwMDAwMDAwMDsKKworICAgIHJldHVybiAwOworfQorCitpbnQgdXNiZHJ2d2V4dF9zaXdhcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorICAgICAgICBzdHJ1Y3Qgc29ja2FkZHIgKk1hY0FkZHIsIGNoYXIgKmV4dHJhKQoreworICAgIHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IGRldi0+bWxfcHJpdjsKKworICAgIGlmKCFuZXRpZl9ydW5uaW5nKGRldikpCisgICAgICAgIHJldHVybiAtRUlOVkFMOworCisgICAgaWYgKHpmaVdsYW5RdWVyeVdsYW5Nb2RlKGRldikgPT0gWk1fTU9ERV9BUCkgLy8gQVAgTW9kZQorICAgICAgICB6ZmlXbGFuU2V0TWFjQWRkcmVzcyhkZXYsKHUxNl90ICopJk1hY0FkZHItPnNhX2RhdGFbMF0pOworICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1NUQSBNb2RlCisgICAgICAgIHpmaVdsYW5TZXRCc3NpZChkZXYsJk1hY0FkZHItPnNhX2RhdGFbMF0pOworCisgICAgaWYgKG1hY3AtPkRldmljZU9wZW5lZCA9PSAxKQorICAgIHsKKyAgICAgICAgLy91OF90IHdwYWllTGVuLHdwYWllWzgwXTsKKyAgICAgICAgLy96ZmlXbGFuUXVlcnlXcGFJZShkZXYsIHdwYWllLCAmd3BhaWVMZW4pOworICAgICAgICB6ZmlXbGFuRGlzYWJsZShkZXYsIDApOworICAgICAgICB6ZmlXbGFuRW5hYmxlKGRldik7CisgICAgICAgIC8vaWYgKHdwYWllTGVuID4gMikKKyAgICAgICAgLy8gICAgemZpV2xhblNldFdwYUllKGRldiwgd3BhaWUsIHdwYWllTGVuKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworaW50IHVzYmRydndleHRfZ2l3YXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKyAgICAgICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisgICAgICAgICAgICBzdHJ1Y3Qgc29ja2FkZHIgKk1hY0FkZHIsIGNoYXIgKmV4dHJhKQoreworICAgIHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IGRldi0+bWxfcHJpdjsKKworICAgIGlmIChtYWNwLT5EZXZpY2VPcGVuZWQgIT0gMSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpZiAoemZpV2xhblF1ZXJ5V2xhbk1vZGUoZGV2KSA9PSBaTV9NT0RFX0FQKSAvLyBBUCBNb2RlCisgICAgICAgIHpmaVdsYW5RdWVyeU1hY0FkZHJlc3MoZGV2LCAmTWFjQWRkci0+c2FfZGF0YVswXSk7CisgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vU1RBIE1vZGUKKyAgICB7CisgICAgICAgIGlmIChtYWNwLT5hZGFwdGVyU3RhdGUgPT0gWk1fU1RBVFVTX01FRElBX0NPTk5FQ1QpCisgICAgICAgIHsKKyAgICAgICAgICAgIHpmaVdsYW5RdWVyeUJzc2lkKGRldiwgJk1hY0FkZHItPnNhX2RhdGFbMF0pOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgdThfdCB6ZXJvX2FkZHJbNl0gPSB7IDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAgfTsKKyAgICAgICAgICAgIG1lbWNweSgmTWFjQWRkci0+c2FfZGF0YVswXSwgemVyb19hZGRyLCBzaXplb2YoemVyb19hZGRyKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworaW50IHVzYmRydndleHRfaXdhcGxpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQlzdHJ1Y3QgaXdfcG9pbnQgKmRhdGEsIGNoYXIgKmV4dHJhKQoreworICAgIC8vRG9uJ3Qga25vdyBob3cgdG8gZG8geWV0LS1DV1lhbmcoKykKKyAgICByZXR1cm4gMDsKKworfQorCitpbnQgdXNiZHJ2d2V4dF9zaXdzY2FuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisgICAgICAgIHN0cnVjdCBpd19wb2ludCAqZGF0YSwgY2hhciAqZXh0cmEpCit7CisgICAgc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gZGV2LT5tbF9wcml2OworCisgICAgaWYgKG1hY3AtPkRldmljZU9wZW5lZCAhPSAxKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHByaW50aygiQ1dZIC0gdXNiZHJ2d2V4dF9zaXdzY2FuXG4iKTsKKworICAgIHpmaVdsYW5TY2FuKGRldik7CisKKyAgICByZXR1cm4gMDsKK30KKworaW50IHVzYmRydndleHRfZ2l3c2NhbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICAgICAgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKyAgICAgICAgICAgIHN0cnVjdCBpd19wb2ludCAqZGF0YSwgY2hhciAqZXh0cmEpCit7CisgICAgc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gZGV2LT5tbF9wcml2OworICAgIC8vc3RydWN0IHpzV2xhbkRldiogd2QgPSAoc3RydWN0IHpzV2xhbkRldiopIHptd193bGFuX2RldihkZXYpOworICAgIGNoYXIgKmN1cnJlbnRfZXYgPSBleHRyYTsKKyAgICBjaGFyICplbmRfYnVmOworICAgIGludCBpOworICAgIC8vc3RydWN0IHpzQnNzTGlzdCBCc3NMaXN0OworICAgIHN0cnVjdCB6c0Jzc0xpc3RWMSAqcEJzc0xpc3QgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgenNCc3NMaXN0VjEpLCBHRlBfS0VSTkVMKTsKKyAgICAvL0Jzc0xpc3QgPSB3ZC0+c3RhLnBCc3NMaXN0OworICAgIC8vem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgaWYgKG1hY3AtPkRldmljZU9wZW5lZCAhPSAxKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGlmIChkYXRhLT5sZW5ndGggPT0gMCkKKyAgICB7CisgICAgICAgZW5kX2J1ZiA9IGV4dHJhICsgSVdfU0NBTl9NQVhfREFUQTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZW5kX2J1ZiA9IGV4dHJhICsgZGF0YS0+bGVuZ3RoOworICAgIH0KKworICAgIHByaW50aygiZ2l3c2NhbiAtIFJlcG9ydCBTY2FuIFJlc3VsdHNcbiIpOworICAgIC8vcHJpbnRrKCJnaXdzY2FuIC0gQnNzTGlzdCBTcmV1Y3R1cmUgTGVuIDogJWRcbiIsIHNpemVvZihCc3NMaXN0KSk7CisgICAgLy9wcmludGsoImdpd3NjYW4gLSBCc3NMaXN0IENvdW50IDogJWRcbiIsIHdkLT5zdGEucEJzc0xpc3QtPmJzc0NvdW50KTsKKyAgICAvL3ByaW50aygiZ2l3c2NhbiAtIFVwZGF0ZUJzc0xpc3QgQ291bnQgOiAlZFxuIiwgd2QtPnN0YS5wVXBkYXRlQnNzTGlzdC0+YnNzQ291bnQpOworICAgIHpmaVdsYW5RdWVyeUJzc0xpc3RWMShkZXYsIHBCc3NMaXN0KTsKKyAgICAvL3pmaVdsYW5RdWVyeUJzc0xpc3QoZGV2LCAmQnNzTGlzdCk7CisKKy8qIFJlYWQgYW5kIHBhcnNlIGFsbCBlbnRyaWVzICovCisgICAgcHJpbnRrKCJnaXdzY2FuIC0gcEJzc0xpc3QtPmJzc0NvdW50IDogJWRcbiIsIHBCc3NMaXN0LT5ic3NDb3VudCk7CisgICAgLy9wcmludGsoImdpd3NjYW4gLSBCc3NMaXN0LmJzc0NvdW50IDogJWRcbiIsIEJzc0xpc3QuYnNzQ291bnQpOworCisgICAgZm9yIChpID0gMDsgaSA8IHBCc3NMaXN0LT5ic3NDb3VudDsgaSsrKQorICAgIHsKKy8qIFRyYW5zbGF0ZSB0byBXRSBmb3JtYXQgdGhpcyBlbnRyeSAqLworICAgICAgICAvL2N1cnJlbnRfZXYgPSB1c2JkcnZfdHJhbnNsYXRlX3NjYW4oZGV2LCBpbmZvLCBjdXJyZW50X2V2LAorICAgICAgICAvLyAgICBleHRyYSArIElXX1NDQU5fTUFYX0RBVEEsICZwQnNzTGlzdC0+YnNzSW5mb1tpXSk7CisgICAgICAgIGN1cnJlbnRfZXYgPSB1c2JkcnZfdHJhbnNsYXRlX3NjYW4oZGV2LCBpbmZvLCBjdXJyZW50X2V2LAorICAgICAgICAgICAgZW5kX2J1ZiwgJnBCc3NMaXN0LT5ic3NJbmZvW2ldKTsKKworI2lmIFdJUkVMRVNTX0VYVCA+IDE2CisgICAgICAgIGlmIChjdXJyZW50X2V2ID09IGVuZF9idWYpCisgICAgICAgIHsKKyAgICAgICAgICAgIGtmcmVlKHBCc3NMaXN0KTsKKyAgICAgICAgICAgIGRhdGEtPmxlbmd0aCA9IGN1cnJlbnRfZXYgLSBleHRyYTsKKyAgICAgICAgICAgIHJldHVybiAtRTJCSUc7CisgICAgICAgIH0KKyNlbmRpZgorICAgIH0KKworLyogTGVuZ3RoIG9mIGRhdGEgKi8KKyAgICBkYXRhLT5sZW5ndGggPSAoY3VycmVudF9ldiAtIGV4dHJhKTsKKyAgICBkYXRhLT5mbGFncyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdG9kbyAqLworCisgICAga2ZyZWUocEJzc0xpc3QpOworCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCB1c2JkcnZ3ZXh0X3Npd2Vzc2lkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisgICAgICAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorICAgICAgICAgICAgc3RydWN0IGl3X3BvaW50ICplc3NpZCwgY2hhciAqZXh0cmEpCit7CisgICAgY2hhciBFc3NpZEJ1ZltJV19FU1NJRF9NQVhfU0laRSsxXTsKKyAgICBzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AgPSBkZXYtPm1sX3ByaXY7CisKKyAgICBpZighbmV0aWZfcnVubmluZyhkZXYpKQorICAgICAgICByZXR1cm4gLUVJTlZBTDsKKworICAgIGlmIChlc3NpZC0+ZmxhZ3MgPT0gMSkKKyAgICB7CisgICAgICAgIGlmIChlc3NpZC0+bGVuZ3RoID4gKElXX0VTU0lEX01BWF9TSVpFKzEpKQorICAgICAgICAgICAgcmV0dXJuIC1FMkJJRzsKKworICAgICAgICBpZiAoY29weV9mcm9tX3VzZXIoJkVzc2lkQnVmLCBlc3NpZC0+cG9pbnRlciwgZXNzaWQtPmxlbmd0aCkpCisgICAgICAgICAgICByZXR1cm4gLUVGQVVMVDsKKworICAgICAgICBFc3NpZEJ1Zltlc3NpZC0+bGVuZ3RoXSA9ICdcMCc7CisgICAgICAgIC8vcHJpbnRrKCJzaXdlc3NpZCAtIFNldCBFc3NpZCA6ICVzXG4iLEVzc2lkQnVmKTsKKyAgICAgICAgLy9wcmludGsoInNpd2Vzc2lkIC0gRXNzaWQgTGVuIDogJWRcbiIsZXNzaWQtPmxlbmd0aCk7CisgICAgICAgIC8vcHJpbnRrKCJzaXdlc3NpZCAtIEVzc2lkIEZsYWcgOiAleFxuIixlc3NpZC0+ZmxhZ3MpOworICAgICAgICBpZiAobWFjcC0+RGV2aWNlT3BlbmVkID09IDEpCisgICAgICAgIHsKKyAgICAgICAgICAgIHpmaVdsYW5TZXRTU0lEKGRldiwgRXNzaWRCdWYsIHN0cmxlbihFc3NpZEJ1ZikpOworICAgICAgICAgICAgemZpV2xhblNldEZyZXF1ZW5jeShkZXYsIHpmaVdsYW5RdWVyeUZyZXF1ZW5jeShkZXYpLCBGQUxTRSk7CisgICAgICAgICAgICB6ZmlXbGFuU2V0RW5jcnlNb2RlKGRldiwgemZpV2xhblF1ZXJ5RW5jcnlNb2RlKGRldikpOworICAgICAgICAgICAgLy91OF90IHdwYWllTGVuLHdwYWllWzUwXTsKKyAgICAgICAgICAgIC8vemZpV2xhblF1ZXJ5V3BhSWUoZGV2LCB3cGFpZSwgJndwYWllTGVuKTsKKyAgICAgICAgICAgIHpmaVdsYW5EaXNhYmxlKGRldiwgMCk7CisgICAgICAgICAgICB6ZmlXbGFuRW5hYmxlKGRldik7CisgICAgICAgICAgICAvL2lmICh3cGFpZUxlbiA+IDIpCisgICAgICAgICAgICAvLyAgICB6ZmlXbGFuU2V0V3BhSWUoZGV2LCB3cGFpZSwgd3BhaWVMZW4pOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCB1c2JkcnZ3ZXh0X2dpd2Vzc2lkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisgICAgICAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorICAgICAgICAgICAgc3RydWN0IGl3X3BvaW50ICplc3NpZCwgY2hhciAqZXh0cmEpCit7CisgICAgc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gZGV2LT5tbF9wcml2OworICAgIHU4X3QgRXNzaWRMZW47CisgICAgY2hhciBFc3NpZEJ1ZltJV19FU1NJRF9NQVhfU0laRSsxXTsKKyAgICBpbnQgc3NpZF9sZW47CisKKyAgICBpZighbmV0aWZfcnVubmluZyhkZXYpKQorICAgICAgICByZXR1cm4gLUVJTlZBTDsKKworICAgIGlmIChtYWNwLT5EZXZpY2VPcGVuZWQgIT0gMSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICB6ZmlXbGFuUXVlcnlTU0lEKGRldiwgJkVzc2lkQnVmWzBdLCAmRXNzaWRMZW4pOworCisgICAgLyogQ29udmVydCB0eXBlIGZyb20gdW5zaWduZWQgY2hhciB0byBjaGFyICovCisgICAgc3NpZF9sZW4gPSAoaW50KUVzc2lkTGVuOworCisgICAgLyogTWFrZSBzdXJlIHRoZSBlc3NpZCBsZW5ndGggaXMgbm90IGdyZWF0ZXIgdGhhbiBJV19FU1NJRF9NQVhfU0laRSAqLworICAgIGlmIChzc2lkX2xlbiA+IElXX0VTU0lEX01BWF9TSVpFKQorICAgICAgICBzc2lkX2xlbiA9IElXX0VTU0lEX01BWF9TSVpFOworCisgICAgRXNzaWRCdWZbc3NpZF9sZW5dID0gJ1wwJzsKKworICAgIGVzc2lkLT5mbGFncyA9IDE7CisgICAgZXNzaWQtPmxlbmd0aCA9IHN0cmxlbihFc3NpZEJ1Zik7CisKKyAgICBtZW1jcHkoZXh0cmEsIEVzc2lkQnVmLCBlc3NpZC0+bGVuZ3RoKTsKKyAgICAvLyB3aXJlbGVzcy5jIGluIEtlcm5lbCB3b3VsZCBoYW5kbGUgY29weV90b191c2VyIC0tIGxpbmUgNjc5CisgICAgLyppZiAoZXNzaWQtPnBvaW50ZXIpCisgICAgeworICAgICAgICBpZiAoIGNvcHlfdG9fdXNlcihlc3NpZC0+cG9pbnRlciwgRXNzaWRCdWYsIGVzc2lkLT5sZW5ndGgpICkKKyAgICAgICAgeworICAgICAgICAgICAgcHJpbnRrKCJnaXdlc3NpZCAtIGNvcHlfdG9fdXNlciBGYWlsXG4iKTsKKyAgICAgICAgICAgIHJldHVybiAtRUZBVUxUOworICAgICAgICB9CisgICAgfSovCisKKyAgICByZXR1cm4gMDsKK30KKworaW50IHVzYmRydndleHRfc2l3bmlja24oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQlzdHJ1Y3QgaXdfcG9pbnQgKmRhdGEsIGNoYXIgKm5pY2tuYW1lKQoreworICAgIC8vRXhpc3QgYnV0IGp1bmstLUNXWWFuZygrKQorCXJldHVybiAwOworfQorCitpbnQgdXNiZHJ2d2V4dF9naXduaWNrbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCXN0cnVjdCBpd19wb2ludCAqZGF0YSwgY2hhciAqbmlja25hbWUpCit7CisgICAgc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gZGV2LT5tbF9wcml2OworICAgIHU4X3QgRXNzaWRMZW47CisgICAgY2hhciBFc3NpZEJ1ZltJV19FU1NJRF9NQVhfU0laRSsxXTsKKworICAgIGlmIChtYWNwLT5EZXZpY2VPcGVuZWQgIT0gMSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICB6ZmlXbGFuUXVlcnlTU0lEKGRldiwgJkVzc2lkQnVmWzBdLCAmRXNzaWRMZW4pOworICAgIEVzc2lkQnVmW0Vzc2lkTGVuXSA9IDA7CisKKyAgICBkYXRhLT5mbGFncyA9IDE7CisgICAgZGF0YS0+bGVuZ3RoID0gc3RybGVuKEVzc2lkQnVmKTsKKworICAgIG1lbWNweShuaWNrbmFtZSwgRXNzaWRCdWYsIGRhdGEtPmxlbmd0aCk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IHVzYmRydndleHRfc2l3cmF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICAgICAgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKyAgICAgICAgICAgIHN0cnVjdCBpd19wYXJhbSAqZnJxLCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AgPSBkZXYtPm1sX3ByaXY7CisgICAgLy9BcnJheSB0byBEZWZpbmUgUmF0ZSBOdW1iZXIgdGhhdCBTZW5kIHRvIERyaXZlcgorICAgIHUxNl90IHpjSW5kZXh0b1JhdGVCR1sxNl0gPSB7MTAwMCwgMjAwMCwgNTUwMCwgMTEwMDAsIDAsIDAsIDAsIDAsIDQ4MDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI0MDAwLCAxMjAwMCwgNjAwMCwgNTQwMDAsIDM2MDAwLCAxODAwMCwgOTAwMH07CisgICAgdTE2X3QgemNSYXRlVG9NQ1NbXSA9IHsweGZmLCAwLCAxLCAyLCAzLCAweGIsIDB4ZiwgMHhhLCAweGUsIDB4OSwgMHhkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4LCAweGN9OworICAgIHU4X3QgaSxSYXRlSW5kZXggPSA0OworICAgIHUxNl90IFJhdGVLYnBzOworCisgICAgLy9wcmludGsoImZycS0+ZGlzYWJsZWQgOiAweCV4XG4iLGZycS0+ZGlzYWJsZWQpOworICAgIC8vcHJpbnRrKCJmcnEtPnZhbHVlIDogMHgleFxuIixmcnEtPnZhbHVlKTsKKworICAgIFJhdGVLYnBzID0gZnJxLT52YWx1ZSAvIDEwMDA7CisgICAgLy9wcmludGsoIlJhdGVLYnBzIDogJWRcbiIsIFJhdGVLYnBzKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKyAgICB7CisgICAgICAgIGlmIChSYXRlS2JwcyA9PSB6Y0luZGV4dG9SYXRlQkdbaV0pCisgICAgICAgICAgICBSYXRlSW5kZXggPSBpOworICAgIH0KKyAgICBpZiAoemNJbmRleHRvUmF0ZUJHW1JhdGVJbmRleF0gPT0gMCkKKyAgICAgICAgUmF0ZUluZGV4ID0gMHhmZjsKKyAgICAvL3ByaW50aygiUmF0ZUluZGV4IDogJXhcbiIsIFJhdGVJbmRleCk7CisgICAgZm9yIChpID0gMDsgaSA8IDEzOyBpKyspCisgICAgICAgIGlmIChSYXRlSW5kZXggPT0gemNSYXRlVG9NQ1NbaV0pCisgICAgICAgICAgICBicmVhazsKKyAgICAvL3ByaW50aygiSW5kZXggOiAleFxuIiwgaSk7CisgICAgaWYgKFJhdGVLYnBzID09IDY1MDAwKQorICAgIHsKKyAgICAgICAgUmF0ZUluZGV4ID0gMjA7CisgICAgICAgIHByaW50aygiUmF0ZUluZGV4IDogJWRcbiIsIFJhdGVJbmRleCk7CisgICAgfQorICAgIGlmIChtYWNwLT5EZXZpY2VPcGVuZWQgPT0gMSkKKyAgICB7CisgICAgICAgIHpmaVdsYW5TZXRUeFJhdGUoZGV2LCBpKTsKKyAgICAgICAgLy96ZmlXbGFuRGlzYWJsZShkZXYpOworICAgICAgICAvL3pmaVdsYW5FbmFibGUoZGV2KTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworaW50IHVzYmRydndleHRfZ2l3cmF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICAgICAgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKyAgICAgICAgICAgIHN0cnVjdCBpd19wYXJhbSAqZnJxLCBjaGFyICpleHRyYSkKK3sKKyAgICBzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AgPSBkZXYtPm1sX3ByaXY7CisKKyAgICBpZighbmV0aWZfcnVubmluZyhkZXYpKQorICAgICAgICByZXR1cm4gLUVJTlZBTDsKKworICAgIGlmIChtYWNwLT5EZXZpY2VPcGVuZWQgIT0gMSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBmcnEtPmZpeGVkID0gMDsKKyAgICBmcnEtPmRpc2FibGVkID0gMDsKKyAgICBmcnEtPnZhbHVlID0gemZpV2xhblF1ZXJ5UnhSYXRlKGRldikgKiAxMDAwOworCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCB1c2JkcnZ3ZXh0X3Npd3J0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICAgICAgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKyAgICAgICAgICAgIHN0cnVjdCBpd19wYXJhbSAqcnRzLCBjaGFyICpleHRyYSkKK3sKKyAgICBzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AgPSBkZXYtPm1sX3ByaXY7CisgICAgaW50IHZhbCA9IHJ0cy0+dmFsdWU7CisKKyAgICBpZiAobWFjcC0+RGV2aWNlT3BlbmVkICE9IDEpCisgICAgICAgIHJldHVybiAwOworCisgICAgaWYgKHJ0cy0+ZGlzYWJsZWQpCisgICAgICAgIHZhbCA9IDIzNDc7CisKKyAgICBpZiAoKHZhbCA8IDApIHx8ICh2YWwgPiAyMzQ3KSkKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisKKyAgICB6ZmlXbGFuU2V0UnRzVGhyZXNob2xkKGRldix2YWwpOworCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCB1c2JkcnZ3ZXh0X2dpd3J0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICAgICAgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKyAgICAgICAgICAgIHN0cnVjdCBpd19wYXJhbSAqcnRzLCBjaGFyICpleHRyYSkKK3sKKyAgICBzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AgPSBkZXYtPm1sX3ByaXY7CisKKyAgICBpZighbmV0aWZfcnVubmluZyhkZXYpKQorICAgICAgICByZXR1cm4gLUVJTlZBTDsKKworICAgIGlmIChtYWNwLT5EZXZpY2VPcGVuZWQgIT0gMSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBydHMtPnZhbHVlID0gemZpV2xhblF1ZXJ5UnRzVGhyZXNob2xkKGRldik7CisgICAgcnRzLT5kaXNhYmxlZCA9IChydHMtPnZhbHVlID49IDIzNDcpOworICAgIHJ0cy0+Zml4ZWQgPSAxOworCisgICAgcmV0dXJuIDA7CisKK30KKworaW50IHVzYmRydndleHRfc2l3ZnJhZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICAgICAgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKyAgICAgICAgICAgIHN0cnVjdCBpd19wYXJhbSAqZnJhZywgY2hhciAqZXh0cmEpCit7CisgICAgc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gZGV2LT5tbF9wcml2OworICAgIHUxNl90IGZyYWdUaHJlc2hvbGQ7CisKKyAgICBpZiAobWFjcC0+RGV2aWNlT3BlbmVkICE9IDEpCisgICAgICAgIHJldHVybiAwOworCisgICAgaWYgKGZyYWctPmRpc2FibGVkKQorICAgICAgICBmcmFnVGhyZXNob2xkID0gMDsKKyAgICBlbHNlCisgICAgICAgIGZyYWdUaHJlc2hvbGQgPSBmcmFnLT52YWx1ZTsKKworICAgIHpmaVdsYW5TZXRGcmFnVGhyZXNob2xkKGRldixmcmFnVGhyZXNob2xkKTsKKworICAgIHJldHVybiAwOworfQorCitpbnQgdXNiZHJ2d2V4dF9naXdmcmFnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisgICAgICAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorICAgICAgICAgICAgc3RydWN0IGl3X3BhcmFtICpmcmFnLCBjaGFyICpleHRyYSkKK3sKKyAgICBzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AgPSBkZXYtPm1sX3ByaXY7CisgICAgdTE2IHZhbDsKKyAgICB1bnNpZ25lZCBsb25nIGlycUZsYWc7CisKKyAgICBpZighbmV0aWZfcnVubmluZyhkZXYpKQorICAgICAgICByZXR1cm4gLUVJTlZBTDsKKworICAgIGlmIChtYWNwLT5EZXZpY2VPcGVuZWQgIT0gMSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBzcGluX2xvY2tfaXJxc2F2ZSgmbWFjcC0+Y3NfbG9jaywgaXJxRmxhZyk7CisKKyAgICB2YWwgPSB6ZmlXbGFuUXVlcnlGcmFnVGhyZXNob2xkKGRldik7CisKKyAgICBmcmFnLT52YWx1ZSA9IHZhbDsKKworICAgIGZyYWctPmRpc2FibGVkID0gKHZhbCA+PSAyMzQ2KTsKKyAgICBmcmFnLT5maXhlZCA9IDE7CisKKyAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtYWNwLT5jc19sb2NrLCBpcnFGbGFnKTsKKworICAgIHJldHVybiAwOworfQorCitpbnQgdXNiZHJ2d2V4dF9zaXd0eHBvdyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCXN0cnVjdCBpd19wYXJhbSAqcnJxLCBjaGFyICpleHRyYSkKK3sKKyAgICAvL05vdCBzdXBwb3J0IHlldC0tQ1dZbmcoKykKKwlyZXR1cm4gMDsKK30KKworaW50IHVzYmRydndleHRfZ2l3dHhwb3coc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQlzdHJ1Y3QgaXdfcGFyYW0gKnJycSwgY2hhciAqZXh0cmEpCit7CisgICAgLy9Ob3Qgc3VwcG9ydCB5ZXQtLUNXWW5nKCspCisJcmV0dXJuIDA7Cit9CisKK2ludCB1c2JkcnZ3ZXh0X3Npd3JldHJ5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJc3RydWN0IGl3X3BhcmFtICpycnEsIGNoYXIgKmV4dHJhKQoreworICAgIC8vRG8gbm90aGluZy0tQ1dZYW5nKCspCisJcmV0dXJuIDA7Cit9CisKK2ludCB1c2JkcnZ3ZXh0X2dpd3JldHJ5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJc3RydWN0IGl3X3BhcmFtICpycnEsIGNoYXIgKmV4dHJhKQoreworICAgIC8vRG8gbm90aGluZy0tQ1dZYW5nKCspCisJcmV0dXJuIDA7Cit9CisKK2ludCB1c2JkcnZ3ZXh0X3Npd2VuY29kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICAgICAgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKyAgICAgICAgICAgIHN0cnVjdCBpd19wb2ludCAqZXJxLCBjaGFyICprZXkpCit7CisgICAgc3RydWN0IHpzS2V5SW5mbyBrZXlJbmZvOworICAgIGludCBpLCBXZXBTdGF0ZSA9IFpNX0VOQ1JZUFRJT05fV0VQX0RJU0FCTEVEOworICAgIHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IGRldi0+bWxfcHJpdjsKKworICAgIGlmKCFuZXRpZl9ydW5uaW5nKGRldikpCisgICAgICAgIHJldHVybiAtRUlOVkFMOworCisgICAgaWYgKChlcnEtPmZsYWdzICYgSVdfRU5DT0RFX0RJU0FCTEVEKSA9PSAwKQorICAgIHsKKyAgICAgICAga2V5SW5mby5rZXkgPSBrZXk7CisgICAgICAgIGtleUluZm8ua2V5TGVuZ3RoID0gZXJxLT5sZW5ndGg7CisgICAgICAgIGtleUluZm8ua2V5SW5kZXggPSAoZXJxLT5mbGFncyAmIElXX0VOQ09ERV9JTkRFWCkgLSAxOworICAgICAgICBpZiAoa2V5SW5mby5rZXlJbmRleCA+PSA0KQorICAgICAgICAgICAga2V5SW5mby5rZXlJbmRleCA9IDA7CisgICAgICAgIGtleUluZm8uZmxhZyA9IFpNX0tFWV9GTEFHX0RFRkFVTFRfS0VZOworCisgICAgICAgIHpmaVdsYW5TZXRLZXkoZGV2LCBrZXlJbmZvKTsKKyAgICAgICAgV2VwU3RhdGUgPSBaTV9FTkNSWVBUSU9OX1dFUF9FTkFCTEVEOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBmb3IgKGkgPSAxOyBpIDwgNDsgaSsrKQorICAgICAgICAgICAgemZpV2xhblJlbW92ZUtleShkZXYsIDAsIGkpOworICAgICAgICBXZXBTdGF0ZSA9IFpNX0VOQ1JZUFRJT05fV0VQX0RJU0FCTEVEOworICAgICAgICAvL3pmaVdsYW5TZXRFbmNyeU1vZGUoZGV2LCBaTV9OT19XRVApOworICAgIH0KKworICAgIGlmIChtYWNwLT5EZXZpY2VPcGVuZWQgPT0gMSkKKyAgICB7CisgICAgICAgIHpmaVdsYW5TZXRXZXBTdGF0dXMoZGV2LCBXZXBTdGF0ZSk7CisgICAgICAgIHpmaVdsYW5TZXRGcmVxdWVuY3koZGV2LCB6ZmlXbGFuUXVlcnlGcmVxdWVuY3koZGV2KSwgRkFMU0UpOworICAgICAgICAvL3pmaVdsYW5TZXRFbmNyeU1vZGUoZGV2LCB6ZmlXbGFuUXVlcnlFbmNyeU1vZGUoZGV2KSk7CisgICAgICAgIC8vdThfdCB3cGFpZUxlbix3cGFpZVs1MF07CisgICAgICAgIC8vemZpV2xhblF1ZXJ5V3BhSWUoZGV2LCB3cGFpZSwgJndwYWllTGVuKTsKKyAgICAgICAgemZpV2xhbkRpc2FibGUoZGV2LCAwKTsKKyAgICAgICAgemZpV2xhbkVuYWJsZShkZXYpOworICAgICAgICAvL2lmICh3cGFpZUxlbiA+IDIpCisgICAgICAgIC8vICAgIHpmaVdsYW5TZXRXcGFJZShkZXYsIHdwYWllLCB3cGFpZUxlbik7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCB1c2JkcnZ3ZXh0X2dpd2VuY29kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICAgICAgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKyAgICAgICAgICAgIHN0cnVjdCBpd19wb2ludCAqZXJxLCBjaGFyICprZXkpCit7CisgICAgc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gZGV2LT5tbF9wcml2OworICAgIHU4X3QgRW5jcnlwdGlvbk1vZGU7CisgICAgdThfdCBrZXlMZW4gPSAwOworCisgICAgaWYgKG1hY3AtPkRldmljZU9wZW5lZCAhPSAxKQorICAgICAgICByZXR1cm4gMDsKKworICAgIEVuY3J5cHRpb25Nb2RlID0gemZpV2xhblF1ZXJ5RW5jcnlNb2RlKGRldik7CisKKyAgICBpZiAoRW5jcnlwdGlvbk1vZGUpCisgICAgeworICAgICAgICBlcnEtPmZsYWdzID0gSVdfRU5DT0RFX0VOQUJMRUQ7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGVycS0+ZmxhZ3MgPSBJV19FTkNPREVfRElTQUJMRUQ7CisgICAgfQorCisvKiBXZSBjYW4ndCByZXR1cm4gdGhlIGtleSwgc28gc2V0IHRoZSBwcm9wZXIgZmxhZyBhbmQgcmV0dXJuIHplcm8gKi8KKyAgICBlcnEtPmZsYWdzIHw9IElXX0VOQ09ERV9OT0tFWTsKKyAgICBtZW1zZXQoa2V5LCAwLCAxNik7CisKKy8qIENvcHkgdGhlIGtleSB0byB0aGUgdXNlciBidWZmZXIgKi8KKyAgICBzd2l0Y2goRW5jcnlwdGlvbk1vZGUpCisgICAgeworICAgICAgICBjYXNlIFpNX1dFUDY0OgorICAgICAgICAgICAga2V5TGVuID0gNTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFpNX1dFUDEyODoKKyAgICAgICAgICAgIGtleUxlbiA9IDEzOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgWk1fV0VQMjU2OgorICAgICAgICAgICAga2V5TGVuID0gMjk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBaTV9BRVM6CisgICAgICAgICAgICBrZXlMZW4gPSAxNjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFpNX1RLSVA6CisgICAgICAgICAgICBrZXlMZW4gPSAzMjsKKyAgICAgICAgICAgIGJyZWFrOworI2lmZGVmIFpNX0VOQUJMRV9DRU5DCisgICAgICAgIGNhc2UgWk1fQ0VOQzoKKyAgICAgICAgICAgIGtleUxlbiA9IDMyOworICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYgLy9aTV9FTkFCTEVfQ0VOQworICAgICAgICBjYXNlIFpNX05PX1dFUDoKKyAgICAgICAgICAgIGtleUxlbiA9IDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdCA6CisgICAgICAgICAgICBrZXlMZW4gPSAwOworICAgICAgICAgICAgcHJpbnRrKCJVbmtub3duIEVuY3J5TW9kZVxuIik7CisgICAgICAgICAgICBicmVhazsKKworICAgIH0KKyAgICBlcnEtPmxlbmd0aCA9IGtleUxlbjsKKworICAgIHJldHVybiAwOworfQorCitpbnQgdXNiZHJ2d2V4dF9zaXdwb3dlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICAgICAgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKyAgICAgICAgICAgIHN0cnVjdCBpd19wYXJhbSAqZnJxLCBjaGFyICpleHRyYSkKK3sKKyAgICBzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AgPSBkZXYtPm1sX3ByaXY7CisgICAgdThfdCBQU01vZGU7CisKKyAgICBpZiAobWFjcC0+RGV2aWNlT3BlbmVkICE9IDEpCisgICAgICAgIHJldHVybiAwOworCisgICAgaWYgKGZycS0+ZGlzYWJsZWQpCisgICAgICAgIFBTTW9kZSA9IFpNX1NUQV9QU19OT05FOworICAgIGVsc2UKKyAgICAgICAgUFNNb2RlID0gWk1fU1RBX1BTX01BWDsKKworICAgIHpmaVdsYW5TZXRQb3dlclNhdmVNb2RlKGRldixQU01vZGUpOworCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCB1c2JkcnZ3ZXh0X2dpd3Bvd2VyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisgICAgICAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorICAgICAgICAgICAgc3RydWN0IGl3X3BhcmFtICpmcnEsIGNoYXIgKmV4dHJhKQoreworICAgIHVuc2lnbmVkIGxvbmcgaXJxRmxhZzsKKyAgICBzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AgPSBkZXYtPm1sX3ByaXY7CisKKyAgICBpZiAobWFjcC0+RGV2aWNlT3BlbmVkICE9IDEpCisgICAgICAgIHJldHVybiAwOworCisgICAgc3Bpbl9sb2NrX2lycXNhdmUoJm1hY3AtPmNzX2xvY2ssIGlycUZsYWcpOworCisgICAgaWYgKHpmaVdsYW5RdWVyeVBvd2VyU2F2ZU1vZGUoZGV2KSA9PSBaTV9TVEFfUFNfTk9ORSkKKyAgICAgICAgZnJxLT5kaXNhYmxlZCA9IDE7CisgICAgZWxzZQorICAgICAgICBmcnEtPmRpc2FibGVkID0gMDsKKworICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1hY3AtPmNzX2xvY2ssIGlycUZsYWcpOworCisgICAgcmV0dXJuIDA7Cit9CisKKy8vaW50IHVzYmRydndleHRfc2V0cGFyYW0oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKy8vCQkgICAJIHZvaWQgKncsIGNoYXIgKmV4dHJhKQorLy97CisvLwlzdHJ1Y3QgaWVlZTgwMjExdmFwICp2YXAgPSBkZXYtPm1sX3ByaXY7CisvLwlzdHJ1Y3QgaWVlZTgwMjExY29tICppYyA9IHZhcC0+aXZfaWM7CisvLwlzdHJ1Y3QgaWVlZTgwMjExX3JzbnBhcm1zICpyc24gPSAmdmFwLT5pdl9ic3MtPm5pX3JzbjsKKy8vCWludCAqaSA9IChpbnQgKikgZXh0cmE7CisvLwlpbnQgcGFyYW0gPSBpWzBdOwkJLyogcGFyYW1ldGVyIGlkIGlzIDFzdCAqLworLy8JaW50IHZhbHVlID0gaVsxXTsJCS8qIE5COiBtb3N0IHZhbHVlcyBhcmUgVFlQRV9JTlQgKi8KKy8vCWludCByZXR2ID0gMDsKKy8vCWludCBqLCBjYXBzOworLy8JY29uc3Qgc3RydWN0IGllZWU4MDIxMV9hdXRoZW50aWNhdG9yICphdXRoOworLy8JY29uc3Qgc3RydWN0IGllZWU4MDIxMV9hY2xhdG9yICphY2w7CisvLworLy8Jc3dpdGNoIChwYXJhbSkgeworLy8JY2FzZSBJRUVFODAyMTFfUEFSQU1fQVVUSE1PREU6CisvLwkJc3dpdGNoICh2YWx1ZSkgeworLy8JCWNhc2UgSUVFRTgwMjExX0FVVEhfV1BBOgkvKiBXUEEgKi8KKy8vCQljYXNlIElFRUU4MDIxMV9BVVRIXzgwMjFYOgkvKiA4MDIuMXggKi8KKy8vCQljYXNlIElFRUU4MDIxMV9BVVRIX09QRU46CS8qIG9wZW4gKi8KKy8vCQljYXNlIElFRUU4MDIxMV9BVVRIX1NIQVJFRDoJLyogc2hhcmVkLWtleSAqLworLy8JCWNhc2UgSUVFRTgwMjExX0FVVEhfQVVUTzoJLyogYXV0byAqLworLy8JCQlhdXRoID0gaWVlZTgwMjExX2F1dGhlbnRpY2F0b3JfZ2V0KHZhbHVlKTsKKy8vCQkJaWYgKGF1dGggPT0gTlVMTCkKKy8vCQkJCXJldHVybiAtRUlOVkFMOworLy8JCQlicmVhazsKKy8vCQlkZWZhdWx0OgorLy8JCQlyZXR1cm4gLUVJTlZBTDsKKy8vCQl9CisvLwkJc3dpdGNoICh2YWx1ZSkgeworLy8JCWNhc2UgSUVFRTgwMjExX0FVVEhfV1BBOgkvKiBXUEEgdy8gODAyLjF4ICovCisvLwkJCXZhcC0+aXZfZmxhZ3MgfD0gSUVFRTgwMjExX0ZfUFJJVkFDWTsKKy8vCQkJdmFsdWUgPSBJRUVFODAyMTFfQVVUSF84MDIxWDsKKy8vCQkJYnJlYWs7CisvLwkJY2FzZSBJRUVFODAyMTFfQVVUSF9PUEVOOgkvKiBvcGVuICovCisvLwkJCXZhcC0+aXZfZmxhZ3MgJj0gfihJRUVFODAyMTFfRl9XUEF8SUVFRTgwMjExX0ZfUFJJVkFDWSk7CisvLwkJCWJyZWFrOworLy8JCWNhc2UgSUVFRTgwMjExX0FVVEhfU0hBUkVEOgkvKiBzaGFyZWQta2V5ICovCisvLwkJY2FzZSBJRUVFODAyMTFfQVVUSF9BVVRPOgkvKiBhdXRvICovCisvLwkJY2FzZSBJRUVFODAyMTFfQVVUSF84MDIxWDoJLyogODAyLjF4ICovCisvLwkJCXZhcC0+aXZfZmxhZ3MgJj0gfklFRUU4MDIxMV9GX1dQQTsKKy8vCQkJLyogYm90aCByZXF1aXJlIGEga2V5IHNvIG1hcmsgdGhlIFBSSVZBQ1kgY2FwYWJpbGl0eSAqLworLy8JCQl2YXAtPml2X2ZsYWdzIHw9IElFRUU4MDIxMV9GX1BSSVZBQ1k7CisvLwkJCWJyZWFrOworLy8JCX0KKy8vCQkvKiBOQjogYXV0aGVudGljYXRvciBhdHRhY2gvZGV0YWNoIGhhcHBlbnMgb24gc3RhdGUgY2hhbmdlICovCisvLwkJdmFwLT5pdl9ic3MtPm5pX2F1dGhtb2RlID0gdmFsdWU7CisvLwkJLyogWFhYIG1peGVkL21vZGUvdXNhZ2U/ICovCisvLwkJdmFwLT5pdl9hdXRoID0gYXV0aDsKKy8vCQlyZXR2ID0gRU5FVFJFU0VUOworLy8JCWJyZWFrOworLy8JY2FzZSBJRUVFODAyMTFfUEFSQU1fUFJPVE1PREU6CisvLwkJaWYgKHZhbHVlID4gSUVFRTgwMjExX1BST1RfUlRTQ1RTKQorLy8JCQlyZXR1cm4gLUVJTlZBTDsKKy8vCQlpYy0+aWNfcHJvdG1vZGUgPSB2YWx1ZTsKKy8vCQkvKiBOQjogaWYgbm90IG9wZXJhdGluZyBpbiAxMWcgdGhpcyBjYW4gd2FpdCAqLworLy8JCWlmIChpYy0+aWNfYnNzY2hhbiAhPSBJRUVFODAyMTFfQ0hBTl9BTllDICYmCisvLwkJICAgIElFRUU4MDIxMV9JU19DSEFOX0FOWUcoaWMtPmljX2Jzc2NoYW4pKQorLy8JCQlyZXR2ID0gRU5FVFJFU0VUOworLy8JCWJyZWFrOworLy8JY2FzZSBJRUVFODAyMTFfUEFSQU1fTUNBU1RDSVBIRVI6CisvLwkJaWYgKCh2YXAtPml2X2NhcHMgJiBjaXBoZXIyY2FwKHZhbHVlKSkgPT0gMCAmJgorLy8JCSAgICAhaWVlZTgwMjExX2NyeXB0b19hdmFpbGFibGUodmFsdWUpKQorLy8JCQlyZXR1cm4gLUVJTlZBTDsKKy8vCQlyc24tPnJzbl9tY2FzdGNpcGhlciA9IHZhbHVlOworLy8JCWlmICh2YXAtPml2X2ZsYWdzICYgSUVFRTgwMjExX0ZfV1BBKQorLy8JCQlyZXR2ID0gRU5FVFJFU0VUOworLy8JCWJyZWFrOworLy8JY2FzZSBJRUVFODAyMTFfUEFSQU1fTUNBU1RLRVlMRU46CisvLwkJaWYgKCEoMCA8IHZhbHVlICYmIHZhbHVlIDwgSUVFRTgwMjExX0tFWUJVRl9TSVpFKSkKKy8vCQkJcmV0dXJuIC1FSU5WQUw7CisvLwkJLyogWFhYIG5vIHdheSB0byB2ZXJpZnkgZHJpdmVyIGNhcGFiaWxpdHkgKi8KKy8vCQlyc24tPnJzbl9tY2FzdGtleWxlbiA9IHZhbHVlOworLy8JCWlmICh2YXAtPml2X2ZsYWdzICYgSUVFRTgwMjExX0ZfV1BBKQorLy8JCQlyZXR2ID0gRU5FVFJFU0VUOworLy8JCWJyZWFrOworLy8JY2FzZSBJRUVFODAyMTFfUEFSQU1fVUNBU1RDSVBIRVJTOgorLy8JCS8qCisvLwkJICogQ29udmVydCBjaXBoZXIgc2V0IHRvIGVxdWl2YWxlbnQgY2FwYWJpbGl0aWVzLgorLy8JCSAqIE5COiB0aGlzIGxvZ2ljIGludGVudGlvbmFsbHkgaWdub3JlcyB1bmtub3duIGFuZAorLy8JCSAqIHVuc3VwcG9ydGVkIGNpcGhlcnMgc28gZm9sa3MgY2FuIHNwZWNpZnkgMHhmZiBvcgorLy8JCSAqIHNpbWlsYXIgYW5kIGdldCBhbGwgYXZhaWxhYmxlIGNpcGhlcnMuCisvLwkJICovCisvLwkJY2FwcyA9IDA7CisvLwkJZm9yIChqID0gMTsgaiA8IDMyOyBqKyspCS8qIE5COiBza2lwIFdFUCAqLworLy8JCQlpZiAoKHZhbHVlICYgKDE8PGopKSAmJgorLy8JCQkgICAgKCh2YXAtPml2X2NhcHMgJiBjaXBoZXIyY2FwKGopKSB8fAorLy8JCQkgICAgIGllZWU4MDIxMV9jcnlwdG9fYXZhaWxhYmxlKGopKSkKKy8vCQkJCWNhcHMgfD0gMTw8ajsKKy8vCQlpZiAoY2FwcyA9PSAwKQkJCS8qIG5vdGhpbmcgYXZhaWxhYmxlICovCisvLwkJCXJldHVybiAtRUlOVkFMOworLy8JCS8qIFhYWCB2ZXJpZnkgY2lwaGVycyBvayBmb3IgdW5pY2FzdCB1c2U/ICovCisvLwkJLyogWFhYIGRpc2FsbG93IGlmIHJ1bm5pbmcgYXMgaXQnbGwgaGF2ZSBubyBlZmZlY3QgKi8KKy8vCQlyc24tPnJzbl91Y2FzdGNpcGhlcnNldCA9IGNhcHM7CisvLwkJaWYgKHZhcC0+aXZfZmxhZ3MgJiBJRUVFODAyMTFfRl9XUEEpCisvLwkJCXJldHYgPSBFTkVUUkVTRVQ7CisvLwkJYnJlYWs7CisvLwljYXNlIElFRUU4MDIxMV9QQVJBTV9VQ0FTVENJUEhFUjoKKy8vCQlpZiAoKHJzbi0+cnNuX3VjYXN0Y2lwaGVyc2V0ICYgY2lwaGVyMmNhcCh2YWx1ZSkpID09IDApCisvLwkJCXJldHVybiAtRUlOVkFMOworLy8JCXJzbi0+cnNuX3VjYXN0Y2lwaGVyID0gdmFsdWU7CisvLwkJYnJlYWs7CisvLwljYXNlIElFRUU4MDIxMV9QQVJBTV9VQ0FTVEtFWUxFTjoKKy8vCQlpZiAoISgwIDwgdmFsdWUgJiYgdmFsdWUgPCBJRUVFODAyMTFfS0VZQlVGX1NJWkUpKQorLy8JCQlyZXR1cm4gLUVJTlZBTDsKKy8vCQkvKiBYWFggbm8gd2F5IHRvIHZlcmlmeSBkcml2ZXIgY2FwYWJpbGl0eSAqLworLy8JCXJzbi0+cnNuX3VjYXN0a2V5bGVuID0gdmFsdWU7CisvLwkJYnJlYWs7CisvLwljYXNlIElFRUU4MDIxMV9QQVJBTV9LRVlNR1RBTEdTOgorLy8JCS8qIFhYWCBjaGVjayAqLworLy8JCXJzbi0+cnNuX2tleW1nbXRzZXQgPSB2YWx1ZTsKKy8vCQlpZiAodmFwLT5pdl9mbGFncyAmIElFRUU4MDIxMV9GX1dQQSkKKy8vCQkJcmV0diA9IEVORVRSRVNFVDsKKy8vCQlicmVhazsKKy8vCWNhc2UgSUVFRTgwMjExX1BBUkFNX1JTTkNBUFM6CisvLwkJLyogWFhYIGNoZWNrICovCisvLwkJcnNuLT5yc25fY2FwcyA9IHZhbHVlOworLy8JCWlmICh2YXAtPml2X2ZsYWdzICYgSUVFRTgwMjExX0ZfV1BBKQorLy8JCQlyZXR2ID0gRU5FVFJFU0VUOworLy8JCWJyZWFrOworLy8JY2FzZSBJRUVFODAyMTFfUEFSQU1fV1BBOgorLy8JCWlmICh2YWx1ZSA+IDMpCisvLwkJCXJldHVybiAtRUlOVkFMOworLy8JCS8qIFhYWCB2ZXJpZnkgY2lwaGVycyBhdmFpbGFibGUgKi8KKy8vCQl2YXAtPml2X2ZsYWdzICY9IH5JRUVFODAyMTFfRl9XUEE7CisvLwkJc3dpdGNoICh2YWx1ZSkgeworLy8JCWNhc2UgMToKKy8vCQkJdmFwLT5pdl9mbGFncyB8PSBJRUVFODAyMTFfRl9XUEExOworLy8JCQlicmVhazsKKy8vCQljYXNlIDI6CisvLwkJCXZhcC0+aXZfZmxhZ3MgfD0gSUVFRTgwMjExX0ZfV1BBMjsKKy8vCQkJYnJlYWs7CisvLwkJY2FzZSAzOgorLy8JCQl2YXAtPml2X2ZsYWdzIHw9IElFRUU4MDIxMV9GX1dQQTEgfCBJRUVFODAyMTFfRl9XUEEyOworLy8JCQlicmVhazsKKy8vCQl9CisvLwkJcmV0diA9IEVORVRSRVNFVDsJCS8qIFhYWD8gKi8KKy8vCQlicmVhazsKKy8vCWNhc2UgSUVFRTgwMjExX1BBUkFNX1JPQU1JTkc6CisvLwkJaWYgKCEoSUVFRTgwMjExX1JPQU1JTkdfREVWSUNFIDw9IHZhbHVlICYmCisvLwkJICAgIHZhbHVlIDw9IElFRUU4MDIxMV9ST0FNSU5HX01BTlVBTCkpCisvLwkJCXJldHVybiAtRUlOVkFMOworLy8JCWljLT5pY19yb2FtaW5nID0gdmFsdWU7CisvLwkJYnJlYWs7CisvLwljYXNlIElFRUU4MDIxMV9QQVJBTV9QUklWQUNZOgorLy8JCWlmICh2YWx1ZSkgeworLy8JCQkvKiBYWFggY2hlY2sgZm9yIGtleSBzdGF0ZT8gKi8KKy8vCQkJdmFwLT5pdl9mbGFncyB8PSBJRUVFODAyMTFfRl9QUklWQUNZOworLy8JCX0gZWxzZQorLy8JCQl2YXAtPml2X2ZsYWdzICY9IH5JRUVFODAyMTFfRl9QUklWQUNZOworLy8JCWJyZWFrOworLy8JY2FzZSBJRUVFODAyMTFfUEFSQU1fRFJPUFVORU5DUllQVEVEOgorLy8JCWlmICh2YWx1ZSkKKy8vCQkJdmFwLT5pdl9mbGFncyB8PSBJRUVFODAyMTFfRl9EUk9QVU5FTkM7CisvLwkJZWxzZQorLy8JCQl2YXAtPml2X2ZsYWdzICY9IH5JRUVFODAyMTFfRl9EUk9QVU5FTkM7CisvLwkJYnJlYWs7CisvLwljYXNlIElFRUU4MDIxMV9QQVJBTV9DT1VOVEVSTUVBU1VSRVM6CisvLwkJaWYgKHZhbHVlKSB7CisvLwkJCWlmICgodmFwLT5pdl9mbGFncyAmIElFRUU4MDIxMV9GX1dQQSkgPT0gMCkKKy8vCQkJCXJldHVybiAtRUlOVkFMOworLy8JCQl2YXAtPml2X2ZsYWdzIHw9IElFRUU4MDIxMV9GX0NPVU5URVJNOworLy8JCX0gZWxzZQorLy8JCQl2YXAtPml2X2ZsYWdzICY9IH5JRUVFODAyMTFfRl9DT1VOVEVSTTsKKy8vCQlicmVhazsKKy8vCWNhc2UgSUVFRTgwMjExX1BBUkFNX0RSSVZFUl9DQVBTOgorLy8JCXZhcC0+aXZfY2FwcyA9IHZhbHVlOwkJLyogTkI6IGZvciB0ZXN0aW5nICovCisvLwkJYnJlYWs7CisvLwljYXNlIElFRUU4MDIxMV9QQVJBTV9NQUNDTUQ6CisvLwkJYWNsID0gdmFwLT5pdl9hY2w7CisvLwkJc3dpdGNoICh2YWx1ZSkgeworLy8JCWNhc2UgSUVFRTgwMjExX01BQ0NNRF9QT0xJQ1lfT1BFTjoKKy8vCQljYXNlIElFRUU4MDIxMV9NQUNDTURfUE9MSUNZX0FMTE9XOgorLy8JCWNhc2UgSUVFRTgwMjExX01BQ0NNRF9QT0xJQ1lfREVOWToKKy8vCQkJaWYgKGFjbCA9PSBOVUxMKSB7CisvLwkJCQlhY2wgPSBpZWVlODAyMTFfYWNsYXRvcl9nZXQoIm1hYyIpOworLy8JCQkJaWYgKGFjbCA9PSBOVUxMIHx8ICFhY2wtPmlhY19hdHRhY2godmFwKSkKKy8vCQkJCQlyZXR1cm4gLUVJTlZBTDsKKy8vCQkJCXZhcC0+aXZfYWNsID0gYWNsOworLy8JCQl9CisvLwkJCWFjbC0+aWFjX3NldHBvbGljeSh2YXAsIHZhbHVlKTsKKy8vCQkJYnJlYWs7CisvLwkJY2FzZSBJRUVFODAyMTFfTUFDQ01EX0ZMVVNIOgorLy8JCQlpZiAoYWNsICE9IE5VTEwpCisvLwkJCQlhY2wtPmlhY19mbHVzaCh2YXApOworLy8JCQkvKiBOQjogc2lsZW50bHkgaWdub3JlIHdoZW4gbm90IGluIHVzZSAqLworLy8JCQlicmVhazsKKy8vCQljYXNlIElFRUU4MDIxMV9NQUNDTURfREVUQUNIOgorLy8JCQlpZiAoYWNsICE9IE5VTEwpIHsKKy8vCQkJCXZhcC0+aXZfYWNsID0gTlVMTDsKKy8vCQkJCWFjbC0+aWFjX2RldGFjaCh2YXApOworLy8JCQl9CisvLwkJCWJyZWFrOworLy8JCX0KKy8vCQlicmVhazsKKy8vCWNhc2UgSUVFRTgwMjExX1BBUkFNX1dNTToKKy8vCQlpZiAoaWMtPmljX2NhcHMgJiBJRUVFODAyMTFfQ19XTUUpeworLy8JCQlpZiAodmFsdWUpIHsKKy8vCQkJCXZhcC0+aXZfZmxhZ3MgfD0gSUVFRTgwMjExX0ZfV01FOworLy8JCQkJdmFwLT5pdl9pYy0+aWNfZmxhZ3MgfD0gSUVFRTgwMjExX0ZfV01FOyAvKiBYWFggbmVlZGVkIGJ5IGljX3Jlc2V0ICovCisvLwkJCX0KKy8vCQkJZWxzZSB7CisvLwkJCQl2YXAtPml2X2ZsYWdzICY9IH5JRUVFODAyMTFfRl9XTUU7CisvLwkJCQl2YXAtPml2X2ljLT5pY19mbGFncyAmPSB+SUVFRTgwMjExX0ZfV01FOyAvKiBYWFggbmVlZGVkIGJ5IGljX3Jlc2V0ICovCisvLwkJCX0KKy8vCQkJcmV0diA9IEVORVRSRVNFVDsJLyogUmVuZWdvdGlhdGUgZm9yIGNhcGFiaWxpdGllcyAqLworLy8JCX0KKy8vCQlicmVhazsKKy8vCWNhc2UgSUVFRTgwMjExX1BBUkFNX0hJREVTU0lEOgorLy8JCWlmICh2YWx1ZSkKKy8vCQkJdmFwLT5pdl9mbGFncyB8PSBJRUVFODAyMTFfRl9ISURFU1NJRDsKKy8vCQllbHNlCisvLwkJCXZhcC0+aXZfZmxhZ3MgJj0gfklFRUU4MDIxMV9GX0hJREVTU0lEOworLy8JCXJldHYgPSBFTkVUUkVTRVQ7CisvLwkJYnJlYWs7CisvLwljYXNlIElFRUU4MDIxMV9QQVJBTV9BUEJSSURHRToKKy8vCQlpZiAodmFsdWUgPT0gMCkKKy8vCQkJdmFwLT5pdl9mbGFncyB8PSBJRUVFODAyMTFfRl9OT0JSSURHRTsKKy8vCQllbHNlCisvLwkJCXZhcC0+aXZfZmxhZ3MgJj0gfklFRUU4MDIxMV9GX05PQlJJREdFOworLy8JCWJyZWFrOworLy8JY2FzZSBJRUVFODAyMTFfUEFSQU1fSU5BQ1Q6CisvLwkJdmFwLT5pdl9pbmFjdF9ydW4gPSB2YWx1ZSAvIElFRUU4MDIxMV9JTkFDVF9XQUlUOworLy8JCWJyZWFrOworLy8JY2FzZSBJRUVFODAyMTFfUEFSQU1fSU5BQ1RfQVVUSDoKKy8vCQl2YXAtPml2X2luYWN0X2F1dGggPSB2YWx1ZSAvIElFRUU4MDIxMV9JTkFDVF9XQUlUOworLy8JCWJyZWFrOworLy8JY2FzZSBJRUVFODAyMTFfUEFSQU1fSU5BQ1RfSU5JVDoKKy8vCQl2YXAtPml2X2luYWN0X2luaXQgPSB2YWx1ZSAvIElFRUU4MDIxMV9JTkFDVF9XQUlUOworLy8JCWJyZWFrOworLy8JY2FzZSBJRUVFODAyMTFfUEFSQU1fQUJPTFQ6CisvLwkJY2FwcyA9IDA7CisvLwkJLyoKKy8vCQkgKiBNYXAgYWJvbHQgc2V0dGluZ3MgdG8gY2FwYWJpbGl0eSBiaXRzOworLy8JCSAqIHRoaXMgYWxzbyBzdHJpcHMgdW5rbm93bi91bndhbnRlZCBiaXRzLgorLy8JCSAqLworLy8JCWlmICh2YWx1ZSAmIElFRUU4MDIxMV9BQk9MVF9UVVJCT19QUklNRSkKKy8vCQkJY2FwcyB8PSBJRUVFODAyMTFfQVRIQ19UVVJCT1A7CisvLwkJaWYgKHZhbHVlICYgSUVFRTgwMjExX0FCT0xUX0NPTVBSRVNTSU9OKQorLy8JCQljYXBzIHw9IElFRUU4MDIxMV9BVEhDX0NPTVA7CisvLwkJaWYgKHZhbHVlICYgSUVFRTgwMjExX0FCT0xUX0ZBU1RfRlJBTUUpCisvLwkJCWNhcHMgfD0gSUVFRTgwMjExX0FUSENfRkY7CisvLwkJaWYgKHZhbHVlICYgSUVFRTgwMjExX0FCT0xUX1hSKQorLy8JCQljYXBzIHw9IElFRUU4MDIxMV9BVEhDX1hSOworLy8JCWlmICh2YWx1ZSAmIElFRUU4MDIxMV9BQk9MVF9BUikKKy8vCQkJY2FwcyB8PSBJRUVFODAyMTFfQVRIQ19BUjsKKy8vCQlpZiAodmFsdWUgJiBJRUVFODAyMTFfQUJPTFRfQlVSU1QpCisvLwkJCWNhcHMgfD0gSUVFRTgwMjExX0FUSENfQlVSU1Q7CisvLyAgICAgICAgaWYgKHZhbHVlICYgSUVFRTgwMjExX0FCT0xUX1dNRV9FTEUpCisvLyAgICAgICAgICAgIGNhcHMgfD0gSUVFRTgwMjExX0FUSENfV01FOworLy8JCS8qIHZlcmlmeSByZXF1ZXN0ZWQgY2FwYWJpbGl0aWVzIGFyZSBzdXBwb3J0ZWQgKi8KKy8vCQlpZiAoKGNhcHMgJiBpYy0+aWNfYXRoX2NhcCkgIT0gY2FwcykKKy8vCQkJcmV0dXJuIC1FSU5WQUw7CisvLwkJaWYgKHZhcC0+aXZfYXRoX2NhcCAhPSBjYXBzKSB7CisvLwkJCWlmICgodmFwLT5pdl9hdGhfY2FwIF4gY2FwcykgJiBJRUVFODAyMTFfQVRIQ19UVVJCT1ApIHsKKy8vCQkJCWlmIChpZWVlODAyMTFfc2V0X3R1cmJvKGRldiwgIGNhcHMgJiBJRUVFODAyMTFfQVRIQ19UVVJCT1ApKQorLy8JCQkJCXJldHVybiAtRUlOVkFMOworLy8JCQkJaWVlZTgwMjExX3NjYW5fZmx1c2goaWMpOworLy8JCQl9CisvLwkJCXZhcC0+aXZfYXRoX2NhcCA9IGNhcHM7CisvLwkJCWljLT5pY19hdGhjYXBzZXR1cCh2YXAtPml2X2ljLCB2YXAtPml2X2F0aF9jYXApOworLy8JCQlyZXR2ID0gRU5FVFJFU0VUOworLy8JCX0KKy8vCQlicmVhazsKKy8vCWNhc2UgSUVFRTgwMjExX1BBUkFNX0RUSU1fUEVSSU9EOgorLy8JCWlmICh2YXAtPml2X29wbW9kZSAhPSBJRUVFODAyMTFfTV9IT1NUQVAgJiYKKy8vCQkgICAgdmFwLT5pdl9vcG1vZGUgIT0gSUVFRTgwMjExX01fSUJTUykKKy8vCQkJcmV0dXJuIC1FSU5WQUw7CisvLwkJaWYgKElFRUU4MDIxMV9EVElNX01JTiA8PSB2YWx1ZSAmJgorLy8JCSAgICB2YWx1ZSA8PSBJRUVFODAyMTFfRFRJTV9NQVgpIHsKKy8vCQkJdmFwLT5pdl9kdGltX3BlcmlvZCA9IHZhbHVlOworLy8JCQlyZXR2ID0gRU5FVFJFU0VUOwkJLyogcmVxdWlyZXMgcmVzdGFydCAqLworLy8JCX0gZWxzZQorLy8JCQlyZXR2ID0gRUlOVkFMOworLy8JCWJyZWFrOworLy8JY2FzZSBJRUVFODAyMTFfUEFSQU1fQkVBQ09OX0lOVEVSVkFMOgorLy8JCWlmICh2YXAtPml2X29wbW9kZSAhPSBJRUVFODAyMTFfTV9IT1NUQVAgJiYKKy8vCQkgICAgdmFwLT5pdl9vcG1vZGUgIT0gSUVFRTgwMjExX01fSUJTUykKKy8vCQkJcmV0dXJuIC1FSU5WQUw7CisvLwkJaWYgKElFRUU4MDIxMV9CSU5UVkFMX01JTiA8PSB2YWx1ZSAmJgorLy8JCSAgICB2YWx1ZSA8PSBJRUVFODAyMTFfQklOVFZBTF9NQVgpIHsKKy8vCQkJaWMtPmljX2xpbnR2YWwgPSB2YWx1ZTsJCS8qIFhYWCBtdWx0aS1ic3MgKi8KKy8vCQkJcmV0diA9IEVORVRSRVNFVDsJCS8qIHJlcXVpcmVzIHJlc3RhcnQgKi8KKy8vCQl9IGVsc2UKKy8vCQkJcmV0diA9IEVJTlZBTDsKKy8vCQlicmVhazsKKy8vCWNhc2UgSUVFRTgwMjExX1BBUkFNX0RPVEg6CisvLwkJaWYgKHZhbHVlKSB7CisvLwkJCWljLT5pY19mbGFncyB8PSBJRUVFODAyMTFfRl9ET1RIOworLy8JCX0KKy8vCQllbHNlCisvLwkJCWljLT5pY19mbGFncyAmPSB+SUVFRTgwMjExX0ZfRE9USDsKKy8vCQlyZXR2ID0gRU5FVFJFU0VUOwkvKiBYWFg6IG5lZWQgc29tZXRoaW5nIHRoaXMgZHJhc3RpYz8gKi8KKy8vCQlicmVhazsKKy8vCWNhc2UgSUVFRTgwMjExX1BBUkFNX1BXUlRBUkdFVDoKKy8vCQlpYy0+aWNfY3VyY2hhbm1heHB3ciA9IHZhbHVlOworLy8JCWJyZWFrOworLy8JY2FzZSBJRUVFODAyMTFfUEFSQU1fR0VOUkVBU1NPQzoKKy8vCQlJRUVFODAyMTFfU0VORF9NR01UKHZhcC0+aXZfYnNzLCBJRUVFODAyMTFfRkMwX1NVQlRZUEVfUkVBU1NPQ19SRVEsIDApOworLy8JCWJyZWFrOworLy8JY2FzZSBJRUVFODAyMTFfUEFSQU1fQ09NUFJFU1NJT046CisvLwkJcmV0diA9IGllZWU4MDIxMV9zZXRhdGhjYXAodmFwLCBJRUVFODAyMTFfQVRIQ19DT01QLCB2YWx1ZSk7CisvLwkJYnJlYWs7CisvLyAgICBjYXNlIElFRUU4MDIxMV9QQVJBTV9XTU1fQUdHUk1PREU6CisvLyAgICAgICAgcmV0diA9IGllZWU4MDIxMV9zZXRhdGhjYXAodmFwLCBJRUVFODAyMTFfQVRIQ19XTUUsIHZhbHVlKTsKKy8vICAgICAgICBicmVhazsKKy8vCWNhc2UgSUVFRTgwMjExX1BBUkFNX0ZGOgorLy8JCXJldHYgPSBpZWVlODAyMTFfc2V0YXRoY2FwKHZhcCwgSUVFRTgwMjExX0FUSENfRkYsIHZhbHVlKTsKKy8vCQlicmVhazsKKy8vCWNhc2UgSUVFRTgwMjExX1BBUkFNX1RVUkJPOgorLy8JCXJldHYgPSBpZWVlODAyMTFfc2V0YXRoY2FwKHZhcCwgSUVFRTgwMjExX0FUSENfVFVSQk9QLCB2YWx1ZSk7CisvLwkJaWYgKHJldHYgPT0gRU5FVFJFU0VUKSB7CisvLwkJCWlmKGllZWU4MDIxMV9zZXRfdHVyYm8oZGV2LHZhbHVlKSkKKy8vCQkJCQlyZXR1cm4gLUVJTlZBTDsKKy8vCQkJaWVlZTgwMjExX3NjYW5fZmx1c2goaWMpOworLy8JCX0KKy8vCQlicmVhazsKKy8vCWNhc2UgSUVFRTgwMjExX1BBUkFNX1hSOgorLy8JCXJldHYgPSBpZWVlODAyMTFfc2V0YXRoY2FwKHZhcCwgSUVFRTgwMjExX0FUSENfWFIsIHZhbHVlKTsKKy8vCQlicmVhazsKKy8vCWNhc2UgSUVFRTgwMjExX1BBUkFNX0JVUlNUOgorLy8JCXJldHYgPSBpZWVlODAyMTFfc2V0YXRoY2FwKHZhcCwgSUVFRTgwMjExX0FUSENfQlVSU1QsIHZhbHVlKTsKKy8vCQlicmVhazsKKy8vCWNhc2UgSUVFRTgwMjExX1BBUkFNX0FSOgorLy8JCXJldHYgPSBpZWVlODAyMTFfc2V0YXRoY2FwKHZhcCwgSUVFRTgwMjExX0FUSENfQVIsIHZhbHVlKTsKKy8vCQlicmVhazsKKy8vCWNhc2UgSUVFRTgwMjExX1BBUkFNX1BVUkVHOgorLy8JCWlmICh2YWx1ZSkKKy8vCQkJdmFwLT5pdl9mbGFncyB8PSBJRUVFODAyMTFfRl9QVVJFRzsKKy8vCQllbHNlCisvLwkJCXZhcC0+aXZfZmxhZ3MgJj0gfklFRUU4MDIxMV9GX1BVUkVHOworLy8JCS8qIE5COiByZXNldCBvbmx5IGlmIHdlJ3JlIG9wZXJhdGluZyBvbiBhbiAxMWcgY2hhbm5lbCAqLworLy8JCWlmIChpYy0+aWNfYnNzY2hhbiAhPSBJRUVFODAyMTFfQ0hBTl9BTllDICYmCisvLwkJICAgIElFRUU4MDIxMV9JU19DSEFOX0FOWUcoaWMtPmljX2Jzc2NoYW4pKQorLy8JCQlyZXR2ID0gRU5FVFJFU0VUOworLy8JCWJyZWFrOworLy8JY2FzZSBJRUVFODAyMTFfUEFSQU1fV0RTOgorLy8JCWlmICh2YWx1ZSkKKy8vCQkJdmFwLT5pdl9mbGFnc19leHQgfD0gSUVFRTgwMjExX0ZFWFRfV0RTOworLy8JCWVsc2UKKy8vCQkJdmFwLT5pdl9mbGFnc19leHQgJj0gfklFRUU4MDIxMV9GRVhUX1dEUzsKKy8vCQlicmVhazsKKy8vCWNhc2UgSUVFRTgwMjExX1BBUkFNX0JHU0NBTjoKKy8vCQlpZiAodmFsdWUpIHsKKy8vCQkJaWYgKCh2YXAtPml2X2NhcHMgJiBJRUVFODAyMTFfQ19CR1NDQU4pID09IDApCisvLwkJCQlyZXR1cm4gLUVJTlZBTDsKKy8vCQkJdmFwLT5pdl9mbGFncyB8PSBJRUVFODAyMTFfRl9CR1NDQU47CisvLwkJfSBlbHNlIHsKKy8vCQkJLyogWFhYIHJhY2V5PyAqLworLy8JCQl2YXAtPml2X2ZsYWdzICY9IH5JRUVFODAyMTFfRl9CR1NDQU47CisvLwkJCWllZWU4MDIxMV9jYW5jZWxfc2Nhbih2YXApOwkvKiBhbnl0aGluZyBjdXJyZW50ICovCisvLwkJfQorLy8JCWJyZWFrOworLy8JY2FzZSBJRUVFODAyMTFfUEFSQU1fQkdTQ0FOX0lETEU6CisvLwkJaWYgKHZhbHVlID49IElFRUU4MDIxMV9CR1NDQU5fSURMRV9NSU4pCisvLwkJCXZhcC0+aXZfYmdzY2FuaWRsZSA9IHZhbHVlKkhaLzEwMDA7CisvLwkJZWxzZQorLy8JCQlyZXR2ID0gRUlOVkFMOworLy8JCWJyZWFrOworLy8JY2FzZSBJRUVFODAyMTFfUEFSQU1fQkdTQ0FOX0lOVEVSVkFMOgorLy8JCWlmICh2YWx1ZSA+PSBJRUVFODAyMTFfQkdTQ0FOX0lOVFZBTF9NSU4pCisvLwkJCXZhcC0+aXZfYmdzY2FuaW50dmwgPSB2YWx1ZSpIWjsKKy8vCQllbHNlCisvLwkJCXJldHYgPSBFSU5WQUw7CisvLwkJYnJlYWs7CisvLwljYXNlIElFRUU4MDIxMV9QQVJBTV9NQ0FTVF9SQVRFOgorLy8JCS8qIHVuaXRzIGFyZSBpbiBLSUxPYml0cyBwZXIgc2Vjb25kICovCisvLwkJaWYgKHZhbHVlID49IDI1NiAmJiB2YWx1ZSA8PSA1NDAwMCkKKy8vCQkJdmFwLT5pdl9tY2FzdF9yYXRlID0gdmFsdWU7CisvLwkJZWxzZQorLy8JCQlyZXR2ID0gRUlOVkFMOworLy8JCWJyZWFrOworLy8JY2FzZSBJRUVFODAyMTFfUEFSQU1fQ09WRVJBR0VfQ0xBU1M6CisvLwkJaWYgKHZhbHVlID49IDAgJiYgdmFsdWUgPD0gSUVFRTgwMjExX0NPVkVSQUdFX0NMQVNTX01BWCkgeworLy8JCQlpYy0+aWNfY292ZXJhZ2VjbGFzcyA9IHZhbHVlOworLy8JCQlpZiAoSVNfVVBfQVVUTyh2YXApKQorLy8JCQkJaWVlZTgwMjExX25ld19zdGF0ZSh2YXAsIElFRUU4MDIxMV9TX1NDQU4sIDApOworLy8JCQlyZXR2ID0gMDsKKy8vCQl9CisvLwkJZWxzZQorLy8JCQlyZXR2ID0gRUlOVkFMOworLy8JCWJyZWFrOworLy8JY2FzZSBJRUVFODAyMTFfUEFSQU1fQ09VTlRSWV9JRToKKy8vCQlpZiAodmFsdWUpCisvLwkJCWljLT5pY19mbGFnc19leHQgfD0gSUVFRTgwMjExX0ZFWFRfQ09VTlRSWUlFOworLy8JCWVsc2UKKy8vCQkJaWMtPmljX2ZsYWdzX2V4dCAmPSB+SUVFRTgwMjExX0ZFWFRfQ09VTlRSWUlFOworLy8JCXJldHYgPSBFTkVUUkVTRVQ7CisvLwkJYnJlYWs7CisvLwljYXNlIElFRUU4MDIxMV9QQVJBTV9SRUdDTEFTUzoKKy8vCQlpZiAodmFsdWUpCisvLwkJCWljLT5pY19mbGFnc19leHQgfD0gSUVFRTgwMjExX0ZFWFRfUkVHQ0xBU1M7CisvLwkJZWxzZQorLy8JCQlpYy0+aWNfZmxhZ3NfZXh0ICY9IH5JRUVFODAyMTFfRkVYVF9SRUdDTEFTUzsKKy8vCQlyZXR2ID0gRU5FVFJFU0VUOworLy8JCWJyZWFrOworLy8JY2FzZSBJRUVFODAyMTFfUEFSQU1fU0NBTlZBTElEOgorLy8JCXZhcC0+aXZfc2NhbnZhbGlkID0gdmFsdWUqSFo7CisvLwkJYnJlYWs7CisvLwljYXNlIElFRUU4MDIxMV9QQVJBTV9ST0FNX1JTU0lfMTFBOgorLy8JCXZhcC0+aXZfcm9hbS5yc3NpMTFhID0gdmFsdWU7CisvLwkJYnJlYWs7CisvLwljYXNlIElFRUU4MDIxMV9QQVJBTV9ST0FNX1JTU0lfMTFCOgorLy8JCXZhcC0+aXZfcm9hbS5yc3NpMTFiT25seSA9IHZhbHVlOworLy8JCWJyZWFrOworLy8JY2FzZSBJRUVFODAyMTFfUEFSQU1fUk9BTV9SU1NJXzExRzoKKy8vCQl2YXAtPml2X3JvYW0ucnNzaTExYiA9IHZhbHVlOworLy8JCWJyZWFrOworLy8JY2FzZSBJRUVFODAyMTFfUEFSQU1fUk9BTV9SQVRFXzExQToKKy8vCQl2YXAtPml2X3JvYW0ucmF0ZTExYSA9IHZhbHVlOworLy8JCWJyZWFrOworLy8JY2FzZSBJRUVFODAyMTFfUEFSQU1fUk9BTV9SQVRFXzExQjoKKy8vCQl2YXAtPml2X3JvYW0ucmF0ZTExYk9ubHkgPSB2YWx1ZTsKKy8vCQlicmVhazsKKy8vCWNhc2UgSUVFRTgwMjExX1BBUkFNX1JPQU1fUkFURV8xMUc6CisvLwkJdmFwLT5pdl9yb2FtLnJhdGUxMWIgPSB2YWx1ZTsKKy8vCQlicmVhazsKKy8vCWNhc2UgSUVFRTgwMjExX1BBUkFNX1VBUFNESU5GTzoKKy8vCQlpZiAodmFwLT5pdl9vcG1vZGUgPT0gSUVFRTgwMjExX01fSE9TVEFQKSB7CisvLwkJCWlmIChpYy0+aWNfY2FwcyAmIElFRUU4MDIxMV9DX1VBUFNEKSB7CisvLwkJCQlpZiAodmFsdWUpCisvLwkJCQkJSUVFRTgwMjExX1ZBUF9VQVBTRF9FTkFCTEUodmFwKTsKKy8vCQkJCWVsc2UKKy8vCQkJCQlJRUVFODAyMTFfVkFQX1VBUFNEX0RJU0FCTEUodmFwKTsKKy8vCQkJCXJldHYgPSBFTkVUUkVTRVQ7CisvLwkJCX0KKy8vCQl9CisvLwkJZWxzZSBpZiAodmFwLT5pdl9vcG1vZGUgPT0gSUVFRTgwMjExX01fU1RBKSB7CisvLwkJCXZhcC0+aXZfdWFwc2RpbmZvID0gdmFsdWU7CisvLwkJCUlFRUU4MDIxMV9WQVBfVUFQU0RfRU5BQkxFKHZhcCk7CisvLwkJCXJldHYgPSBFTkVUUkVTRVQ7CisvLwkJfQorLy8JCWJyZWFrOworLy8JY2FzZSBJRUVFODAyMTFfUEFSQU1fU0xFRVA6CisvLwkJLyogWFhYOiBGb3JjZWQgc2xlZXAgZm9yIHRlc3RpbmcuIERvZXMgbm90IGFjdHVhbGx5IHBsYWNlIHRoZQorLy8JCSAqICAgICAgSFcgaW4gc2xlZXAgbW9kZSB5ZXQuIHRoaXMgb25seSBtYWtlcyBzZW5zZSBmb3IgU1RBcy4KKy8vCQkgKi8KKy8vCQlpZiAodmFsdWUpIHsKKy8vCQkJLyogZ290byBzbGVlcCAqLworLy8JCQlJRUVFODAyMTFfVkFQX0dPVE9TTEVFUCh2YXApOworLy8JCX0KKy8vCQllbHNlIHsKKy8vCQkJLyogd2FrZXVwICovCisvLwkJCUlFRUU4MDIxMV9WQVBfV0FLRVVQKHZhcCk7CisvLwkJfQorLy8JCWllZWU4MDIxMV9zZW5kX251bGxkYXRhKGllZWU4MDIxMV9yZWZfbm9kZSh2YXAtPml2X2JzcykpOworLy8JCWJyZWFrOworLy8JY2FzZSBJRUVFODAyMTFfUEFSQU1fUU9TTlVMTDoKKy8vCQkvKiBGb3JjZSBhIFFvUyBOdWxsIGZvciB0ZXN0aW5nLiAqLworLy8JCWllZWU4MDIxMV9zZW5kX3Fvc251bGxkYXRhKHZhcC0+aXZfYnNzLCB2YWx1ZSk7CisvLwkJYnJlYWs7CisvLwljYXNlIElFRUU4MDIxMV9QQVJBTV9QU1BPTEw6CisvLwkJLyogRm9yY2UgYSBQUy1QT0xMIGZvciB0ZXN0aW5nLiAqLworLy8JCWllZWU4MDIxMV9zZW5kX3BzcG9sbCh2YXAtPml2X2Jzcyk7CisvLwkJYnJlYWs7CisvLwljYXNlIElFRUU4MDIxMV9QQVJBTV9FT1NQRFJPUDoKKy8vCQlpZiAodmFwLT5pdl9vcG1vZGUgPT0gSUVFRTgwMjExX01fSE9TVEFQKSB7CisvLwkJCWlmICh2YWx1ZSkgSUVFRTgwMjExX1ZBUF9FT1NQRFJPUF9FTkFCTEUodmFwKTsKKy8vCQkJZWxzZSBJRUVFODAyMTFfVkFQX0VPU1BEUk9QX0RJU0FCTEUodmFwKTsKKy8vCQl9CisvLwkJYnJlYWs7CisvLwljYXNlIElFRUU4MDIxMV9QQVJBTV9NQVJLREZTOgorLy8JCWlmICh2YWx1ZSkKKy8vCQkJaWMtPmljX2ZsYWdzX2V4dCB8PSBJRUVFODAyMTFfRkVYVF9NQVJLREZTOworLy8JCWVsc2UKKy8vCQkJaWMtPmljX2ZsYWdzX2V4dCAmPSB+SUVFRTgwMjExX0ZFWFRfTUFSS0RGUzsKKy8vCQlicmVhazsKKy8vCWNhc2UgSUVFRTgwMjExX1BBUkFNX0NIQU5CVzoKKy8vCQlzd2l0Y2ggKHZhbHVlKSB7CisvLwkJCWNhc2UgMDoKKy8vCQkJCWljLT5pY19jaGFuYndmbGFnID0gMDsKKy8vCQkJCWJyZWFrOworLy8JCQljYXNlIDE6CisvLwkJCQlpYy0+aWNfY2hhbmJ3ZmxhZyA9IElFRUU4MDIxMV9DSEFOX0hBTEY7CisvLwkJCQlicmVhazsKKy8vCQkJY2FzZSAyOgorLy8JCQkJaWMtPmljX2NoYW5id2ZsYWcgPSBJRUVFODAyMTFfQ0hBTl9RVUFSVEVSOworLy8JCQkJYnJlYWs7CisvLwkJCWRlZmF1bHQ6CisvLwkJCQlyZXR2ID0gRUlOVkFMOworLy8JCQkJYnJlYWs7CisvLwkJfQorLy8JCWJyZWFrOworLy8JY2FzZSBJRUVFODAyMTFfUEFSQU1fU0hPUlRQUkVBTUJMRToKKy8vCQlpZiAodmFsdWUpIHsKKy8vCQkJaWMtPmljX2NhcHMgfD0gSUVFRTgwMjExX0NfU0hQUkVBTUJMRTsKKy8vCQl9IGVsc2UgeworLy8JCQlpYy0+aWNfY2FwcyAmPSB+SUVFRTgwMjExX0NfU0hQUkVBTUJMRTsKKy8vCQl9CisvLwkJcmV0diA9IEVORVRSRVNFVDsKKy8vCQlicmVhazsKKy8vCWRlZmF1bHQ6CisvLwkJcmV0diA9IEVPUE5PVFNVUFA7CisvLwkJYnJlYWs7CisvLwl9CisvLwkvKiBYWFggc2hvdWxkIGFueSBvZiB0aGVzZSBjYXVzZSBhIHJlc2Nhbj8gKi8KKy8vCWlmIChyZXR2ID09IEVORVRSRVNFVCkKKy8vCQlyZXR2ID0gSVNfVVBfQVVUTyh2YXApID8gaWVlZTgwMjExX29wZW4odmFwLT5pdl9kZXYpIDogMDsKKy8vCXJldHVybiAtcmV0djsKKy8vfQorCitpbnQgdXNiZHJ2d2V4dF9zZXRtb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSAgIAkgdm9pZCAqdywgY2hhciAqZXh0cmEpCit7CisJcmV0dXJuIDA7Cit9CisKK2ludCB1c2JkcnZ3ZXh0X2dldG1vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCXZvaWQgKncsIGNoYXIgKmV4dHJhKQoreworCS8vc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gZGV2LT5tbF9wcml2OworCXN0cnVjdCBpd19wb2ludCAqd3JpID0gKHN0cnVjdCBpd19wb2ludCAqKWV4dHJhOworCWNoYXIgbW9kZVs4XTsKKworICAgIHN0cmNweShtb2RlLCIxMWciKTsKKwlyZXR1cm4gKGNvcHlfdG9fdXNlcih3cmktPnBvaW50ZXIsIG1vZGUsIDYpID8gLUVGQVVMVCA6IDApOworfQorCitpbnQgemZMbnhQcml2YXRlSW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHpkYXBfaW9jdGwqIHpkcmVxKQoreworCS8vdm9pZCogcmVncCA9IG1hY3AtPnJlZ3A7CisJdTE2X3QgY21kOworCS8vdTMyX3QgdGVtcDsKKwl1MzJfdCogcDsKKwl1MzJfdCBpOworCisJY21kID0gemRyZXEtPmNtZDsKKwlzd2l0Y2goY21kKQorCXsKKwljYXNlIFpNX0lPQ1RMX1JFR19SRUFEOgorCQl6ZmlEYmdSZWFkUmVnKGRldiwgemRyZXEtPmFkZHIpOworCQlicmVhazsKKworCWNhc2UgWk1fSU9DVExfUkVHX1dSSVRFOgorCQl6ZmlEYmdXcml0ZVJlZyhkZXYsIHpkcmVxLT5hZGRyLCB6ZHJlcS0+dmFsdWUpOworCQlicmVhazsKKworCWNhc2UgWk1fSU9DVExfTUVNX1JFQUQ6CisJCXAgPSAodTMyX3QgKikgYnVzX3RvX3ZpcnQoemRyZXEtPmFkZHIpOworCQlwcmludGsoS0VSTl9ERUJVRyAidXNiZHJ2OiByZWFkIG1lbW9yeSBhZGRyOiAweCUwOHggdmFsdWU6IDB4JTA4eFxuIiwgemRyZXEtPmFkZHIsICpwKTsKKwkJYnJlYWs7CisKKwljYXNlIFpNX0lPQ1RMX01FTV9XUklURToKKwkJcCA9ICh1MzJfdCAqKSBidXNfdG9fdmlydCh6ZHJlcS0+YWRkcik7CisJCSpwID0gemRyZXEtPnZhbHVlOworCQlwcmludGsoS0VSTl9ERUJVRyAidXNiZHJ2OiB3cml0ZSB2YWx1ZTogMHglMDh4IHRvIG1lbW9yeSBhZGRyOiAweCUwOHhcbiIsIHpkcmVxLT52YWx1ZSwgemRyZXEtPmFkZHIpOworCQlicmVhazsKKworCWNhc2UgWk1fSU9DVExfVEFMTFkgOgorCQl6ZmlXbGFuU2hvd1RhbGx5KGRldik7CisJCWlmICh6ZHJlcS0+YWRkcikKKwkJCXpmaVdsYW5SZXNldFRhbGx5KGRldik7CisJCWJyZWFrOworCisJY2FzZSBaTV9JT0NUTF9URVNUIDoKKyAgICAgICAgICAgIHByaW50ayhLRVJOX0RFQlVHICJaTV9JT0NUTF9URVNUOmxlbj0lZFxuIiwgemRyZXEtPmFkZHIpOworICAgICAgICAgICAgLy96ZmlXbGFuUmVhZFJlZyhkZXYsIDB4MTBmNDAwKTsKKyAgICAgICAgICAgIC8vemZpV2xhblJlYWRSZWcoZGV2LCAweDEwZjQwNCk7CisgICAgICAgICAgICBwcmludGsoIklPQ1RMIFRFU1RcbiIpOworICAgICAgICAgICAgI2lmIDEKKyAgICAgICAgICAgIC8vcHJpbnQgcGFja2V0CisgICAgICAgICAgICBmb3IgKGk9MDsgaTx6ZHJlcS0+YWRkcjsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgoaSYweDcpID09IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwcmludGsoIlxuIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHByaW50aygiJTAyWCAiLCAodW5zaWduZWQgY2hhcil6ZHJlcS0+ZGF0YVtpXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwcmludGsoIlxuIik7CisgICAgICAgICAgICAjZW5kaWYKKworCisgICAgICAgICAgICAjaWYgMCAvL0ZvciBUZXN0Pz8gMSB0byAwIGJ5IENXWWFuZygtKQorICAgICAgICAgICAgeworICAgICAgICAgICAgc3RydWN0IHNrX2J1ZmYqIHM7CisKKyAgICAgICAgICAgIC8qIEFsbG9jYXRlIGEgc2tiICovCisgICAgICAgICAgICBzID0gYWxsb2Nfc2tiKDIwMDAsIEdGUF9BVE9NSUMpOworCisgICAgICAgICAgICAvKiBDb3B5IGRhdGEgdG8gc2tiICovCisgICAgICAgICAgICBmb3IgKGk9MDsgaTx6ZHJlcS0+YWRkcjsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHMtPmRhdGFbaV0gPSB6ZHJlcS0+ZGF0YVtpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHMtPmxlbiA9IHpkcmVxLT5hZGRyOworCisgICAgICAgICAgICAvKiBDYWxsIHpmSWRsUmVjdigpICovCisgICAgICAgICAgICB6ZmlSZWN2ODAyMTEoZGV2LCBzLCBOVUxMKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICNlbmRpZgorCisgICAgICAgICAgICBicmVhazsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIFpEQ09ORklHICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgY2FzZSBaTV9JT0NUTF9GUkFHIDoKKyAgICAgICAgICAgIHpmaVdsYW5TZXRGcmFnVGhyZXNob2xkKGRldiwgemRyZXEtPmFkZHIpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBaTV9JT0NUTF9SVFMgOgorICAgICAgICAgICAgemZpV2xhblNldFJ0c1RocmVzaG9sZChkZXYsIHpkcmVxLT5hZGRyKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgWk1fSU9DVExfU0NBTiA6CisgICAgICAgICAgICB6ZmlXbGFuU2NhbihkZXYpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBaTV9JT0NUTF9LRVkgOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHU4X3Qga2V5WzI5XTsKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgenNLZXlJbmZvIGtleUluZm87CisgICAgICAgICAgICAgICAgdTMyX3QgaTsKKworICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpPDI5OyBpKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBrZXlbaV0gPSAwOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpPHpkcmVxLT5hZGRyOyBpKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBrZXlbaV0gPSB6ZHJlcS0+ZGF0YVtpXTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwcmludGsoImtleSBsZW49JWQsIGtleT0lMDJ4JTAyeCUwMnglMDJ4JTAyeC4uLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHpkcmVxLT5hZGRyLCBrZXlbMF0sIGtleVsxXSwga2V5WzJdLCBrZXlbM10sIGtleVs0XSk7CisKKyAgICAgICAgICAgICAgICBrZXlJbmZvLmtleUxlbmd0aCA9IHpkcmVxLT5hZGRyOworICAgICAgICAgICAgICAgIGtleUluZm8ua2V5SW5kZXggPSAwOworICAgICAgICAgICAgICAgIGtleUluZm8uZmxhZyA9IDA7CisgICAgICAgICAgICAgICAga2V5SW5mby5rZXkgPSBrZXk7CisgICAgICAgICAgICAgICAgemZpV2xhblNldEtleShkZXYsIGtleUluZm8pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBaTV9JT0NUTF9SQVRFIDoKKyAgICAgICAgICAgIHpmaVdsYW5TZXRUeFJhdGUoZGV2LCB6ZHJlcS0+YWRkcik7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFpNX0lPQ1RMX0VOQ1JZUFRJT05fTU9ERSA6CisgICAgICAgICAgICB6ZmlXbGFuU2V0RW5jcnlNb2RlKGRldiwgemRyZXEtPmFkZHIpOworCisgICAgICAgICAgICB6ZmlXbGFuRGlzYWJsZShkZXYsIDApOworICAgICAgICAgICAgemZpV2xhbkVuYWJsZShkZXYpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIC8vQ1dZYW5nKCspCisgICAgICAgIGNhc2UgWk1fSU9DVExfU0lHTkFMX1NUUkVOR1RIIDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1OF90IGJ1ZmZlclsyXTsKKyAgICAgICAgICAgICAgICB6ZmlXbGFuUXVlcnlTaWduYWxJbmZvKGRldiwgJmJ1ZmZlclswXSk7CisgICAgICAgICAgICAgICAgcHJpbnRrKCJDdXJyZW50IFNpZ25hbCBTdHJlbmd0aCA6ICUwMmRcbiIsIGJ1ZmZlclswXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgLy9DV1lhbmcoKykKKyAgICAgICAgY2FzZSBaTV9JT0NUTF9TSUdOQUxfUVVBTElUWSA6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdThfdCBidWZmZXJbMl07CisgICAgICAgICAgICAgICAgemZpV2xhblF1ZXJ5U2lnbmFsSW5mbyhkZXYsICZidWZmZXJbMF0pOworICAgICAgICAgICAgICAgIHByaW50aygiQ3VycmVudCBTaWduYWwgUXVhbGl0eSA6ICUwMmRcbiIsIGJ1ZmZlclsxXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworCWNhc2UgWk1fSU9DVExfU0VUX1BJQlNTX01PREU6CisJCWlmICh6ZHJlcS0+YWRkciA9PSAxKQorCQkJemZpV2xhblNldFdsYW5Nb2RlKGRldiwgWk1fTU9ERV9QU0VVRE8pOworCQllbHNlCisJCQl6ZmlXbGFuU2V0V2xhbk1vZGUoZGV2LCBaTV9NT0RFX0lORlJBU1RSVUNUVVJFKTsKKworCQl6ZmlXbGFuRGlzYWJsZShkZXYsIDApOworCQl6ZmlXbGFuRW5hYmxlKGRldik7CisKKwkJYnJlYWs7CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIFpEQ09ORklHICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCWRlZmF1bHQgOgorCQlwcmludGsoS0VSTl9FUlIgInVzYmRydjogZXJyb3IgY29tbWFuZCA9ICV4XG4iLCBjbWQpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IHVzYmRydl93cGFfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGF0aHJfd2xhbl9wYXJhbSAqemRwYXJtKQoreworICAgIGludCByZXQgPSAwOworICAgIHU4X3QgYmNfYWRkcls2XSA9IHsgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiB9OworICAgIHU4X3QgbWFjX2FkZHJbODBdOworICAgIHN0cnVjdCB6c0tleUluZm8ga2V5SW5mbzsKKyAgICBzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AgPSBkZXYtPm1sX3ByaXY7CisgICAgdTE2X3QgdmFwSWQgPSAwOworCisgICAgLy96bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBzd2l0Y2goemRwYXJtLT5jbWQpCisgICAgeworICAgICAgICBjYXNlIFpEX0NNRF9TRVRfRU5DUllQVF9LRVk6CisKKyAgICAgICAgICAgIC8qIFNldCB1cCBrZXkgaW5mb3JtYXRpb24gKi8KKyAgICAgICAgICAgIGtleUluZm8ua2V5TGVuZ3RoID0gemRwYXJtLT51LmNyeXB0LmtleV9sZW47CisgICAgICAgICAgICBrZXlJbmZvLmtleUluZGV4ID0gemRwYXJtLT51LmNyeXB0LmlkeDsKKyAgICAgICAgICAgIGlmICh6ZmlXbGFuUXVlcnlXbGFuTW9kZShkZXYpID09IFpNX01PREVfQVApIC8vIEFQIE1vZGUKKyAgICAgICAgICAgICAgICBrZXlJbmZvLmZsYWcgPSBaTV9LRVlfRkxBR19BVVRIRU5USUNBVE9SOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGtleUluZm8uZmxhZyA9IDA7CisgICAgICAgICAgICBrZXlJbmZvLmtleSA9IHpkcGFybS0+dS5jcnlwdC5rZXk7CisgICAgICAgICAgICBrZXlJbmZvLmluaXRJdiA9IHpkcGFybS0+dS5jcnlwdC5zZXE7CisgICAgICAgICAgICBrZXlJbmZvLm1hY0FkZHIgPSAodTE2X3QgKil6ZHBhcm0tPnN0YV9hZGRyOworCisgICAgICAgICAgICAvKiBJZGVudGlmeSB0aGUgTUFDIGFkZHJlc3MgaW5mb3JtYXRpb24gKi8KKyAgICAgICAgICAgIGlmIChtZW1jbXAoemRwYXJtLT5zdGFfYWRkciwgYmNfYWRkciwgc2l6ZW9mKGJjX2FkZHIpKSA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGtleUluZm8uZmxhZyB8PSBaTV9LRVlfRkxBR19HSzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBrZXlJbmZvLmZsYWcgfD0gWk1fS0VZX0ZMQUdfUEs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICghc3RyY21wKHpkcGFybS0+dS5jcnlwdC5hbGcsICJOT05FIikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy91OF90IHplcm9fbWFjW109ezAsMCwwLDAsMCwwfTsKKworICAgICAgICAgICAgICAgIC8qIFNldCBrZXkgbGVuZ3RoIHRvIHplcm8gKi8KKyAgICAgICAgICAgICAgICBrZXlJbmZvLmtleUxlbmd0aCA9IDA7CisKKyAgICAgICAgICAgICAgICBpZiAoemRwYXJtLT5zdGFfYWRkclswXSAmIDEpLy9kZWwgZ3JvdXAga2V5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvL2lmIChtYWNwLT5jYXJkU2V0dGluZy5XUEFJZUxlbj09MCkKKyAgICAgICAgICAgICAgICAgICAgLy97Ly84MDIuMXggZHluYW1pYyBXRVAKKyAgICAgICAgICAgICAgICAgICAgLy8gICAgbUR5bktleU1vZGUgPSAwOworICAgICAgICAgICAgICAgICAgICAvLyAgICBtS2V5Rm9ybWF0WzBdID0gMDsKKyAgICAgICAgICAgICAgICAgICAgLy8gICAgbVByaXZhY3lJbnZva2VkWzBdPUZBTFNFOworICAgICAgICAgICAgICAgICAgICAvLyAgICBtQ2FwWzBdICY9IH5DQVBfUFJJVkFDWTsKKyAgICAgICAgICAgICAgICAgICAgLy8gICAgbWFjcC0+Y2FyZFNldHRpbmcuRW5jcnlPbk9mZlswXT0wOworICAgICAgICAgICAgICAgICAgICAvL30KKyAgICAgICAgICAgICAgICAgICAgLy9tV3BhQmNLZXlMZW4gPSBtR2tJbnN0YWxsZWQgPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvL2lmIChtZW1jbXAoemVyb19tYWMsemRwYXJtLT5zdGFfYWRkciwgNik9PTApCisgICAgICAgICAgICAgICAgICAgIC8veworICAgICAgICAgICAgICAgICAgICAvLyAgICBtRHluS2V5TW9kZT0wOworICAgICAgICAgICAgICAgICAgICAvLyAgICBtS2V5Rm9ybWF0WzBdPTA7CisgICAgICAgICAgICAgICAgICAgIC8vICAgIHBTZXR0aW5nLT5EeW5LZXlNb2RlPTA7CisgICAgICAgICAgICAgICAgICAgIC8vICAgIHBTZXR0aW5nLT5FbmNyeU1vZGVbMF09MDsKKyAgICAgICAgICAgICAgICAgICAgLy8gICAgbUR5bktleU1vZGU9MDsKKyAgICAgICAgICAgICAgICAgICAgLy99CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJTZXQgRW5jcnlwdGlvbiBUeXBlIE5PTkVcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICghc3RyY21wKHpkcGFybS0+dS5jcnlwdC5hbGcsICJUS0lQIikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgemZpV2xhblNldEVuY3J5TW9kZShkZXYsIFpNX1RLSVApOworICAgICAgICAgICAgICAgIC8vTGludXggU3VwcGxpY2FudCB3aWxsIGludmVyc2UgVHgvUngga2V5CisgICAgICAgICAgICAgICAgLy9TbyB3ZSBpbnZlcnNlIGl0IGJhY2sgLy9DV1lhbmcoKykKKyAgICAgICAgICAgICAgICAvL3pmTWVtb3J5Q29weSgmdGVtcFswXSwgJmtleUluZm8ua2V5WzE2XSwgOCk7CisgICAgICAgICAgICAgICAgLy96Zk1lbW9yeUNvcHkoJmtleUluZm8ua2V5WzE2XSwga2V5SW5mby5rZXlbMjRdLCA4KTsKKyAgICAgICAgICAgICAgICAvL3pmTWVtb3J5Q29weSgma2V5SW5mby5rZXlbMjRdLCAmdGVtcFswXSwgOCk7CisgICAgICAgICAgICAgICAgLy91OF90IHRlbXA7CisgICAgICAgICAgICAgICAgLy9pbnQgazsKKyAgICAgICAgICAgICAgICAvL2ZvciAoayA9IDA7IGsgPCA4OyBrKyspCisgICAgICAgICAgICAgICAgLy97CisgICAgICAgICAgICAgICAgLy8gICAgdGVtcCA9IGtleUluZm8ua2V5WzE2ICsga107CisgICAgICAgICAgICAgICAgLy8gICAga2V5SW5mby5rZXlbMTYgKyBrXSA9IGtleUluZm8ua2V5WzI0ICsga107CisgICAgICAgICAgICAgICAgLy8gICAga2V5SW5mby5rZXlbMjQgKyBrXSA9IHRlbXA7CisgICAgICAgICAgICAgICAgLy99CisgICAgICAgICAgICAgICAgLy9DYW1FbmNyeVR5cGUgPSBaTV9US0lQOworICAgICAgICAgICAgICAgIC8vLy9pZiAoaWR4ID09IDApCisgICAgICAgICAgICAgICAgLy97Ly8gUGFpcndpc2Uga2V5CisgICAgICAgICAgICAgICAgLy8gICAgbUtleUZvcm1hdFswXSA9IENhbUVuY3J5VHlwZTsKKyAgICAgICAgICAgICAgICAvLyAgICBtRHluS2V5TW9kZSA9IHBTZXR0aW5nLT5EeW5LZXlNb2RlID0gRFlOX0tFWV9US0lQOworICAgICAgICAgICAgICAgIC8vfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoIXN0cmNtcCh6ZHBhcm0tPnUuY3J5cHQuYWxnLCAiQ0NNUCIpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHpmaVdsYW5TZXRFbmNyeU1vZGUoZGV2LCBaTV9BRVMpOworICAgICAgICAgICAgICAgIC8vQ2FtRW5jcnlUeXBlID0gWk1fQUVTOworICAgICAgICAgICAgICAgIC8vLy9pZiAoaWR4ID09IDApCisgICAgICAgICAgICAgICAgLy97Ly8gUGFpcndpc2Uga2V5CisgICAgICAgICAgICAgICAgLy8gICAgbUtleUZvcm1hdFswXSA9IENhbUVuY3J5VHlwZTsKKyAgICAgICAgICAgICAgICAvLyAgICBtRHluS2V5TW9kZSA9IHBTZXR0aW5nLT5EeW5LZXlNb2RlID0gRFlOX0tFWV9BRVM7CisgICAgICAgICAgICAgICAgLy99CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICghc3RyY21wKHpkcGFybS0+dS5jcnlwdC5hbGcsICJXRVAiKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoa2V5SW5mby5rZXlMZW5ndGggPT0gNSkKKyAgICAgICAgICAgICAgICB7IC8vIFdFUCA2NAorICAgICAgICAgICAgICAgICAgICB6ZmlXbGFuU2V0RW5jcnlNb2RlKGRldiwgWk1fV0VQNjQpOworICAgICAgICAgICAgICAgIC8vICAgIENhbUVuY3J5VHlwZSA9IFpNX1dFUDY0OworICAgICAgICAgICAgICAgIC8vICAgIHRtcER5bktleU1vZGU9RFlOX0tFWV9XRVA2NDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoa2V5SW5mby5rZXlMZW5ndGggPT0gMTMpCisgICAgICAgICAgICAgICAgey8va2V5bGVuPTEzLCBXRVAgMTI4CisgICAgICAgICAgICAgICAgICAgIHpmaVdsYW5TZXRFbmNyeU1vZGUoZGV2LCBaTV9XRVAxMjgpOworICAgICAgICAgICAgICAgIC8vICAgIENhbUVuY3J5VHlwZSA9IFpNX1dFUDEyODsKKyAgICAgICAgICAgICAgICAvLyAgICB0bXBEeW5LZXlNb2RlPURZTl9LRVlfV0VQMTI4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB6ZmlXbGFuU2V0RW5jcnlNb2RlKGRldiwgWk1fV0VQMjU2KTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBGb3IgRHluYW1pYyBXRVAga2V5IChOb24tV1BBIFJhZGl1cyksIHRoZSBrZXkgSUQgcmFuZ2U6IDAtMworICAgICAgICAgICAgICAgIC8vIEluIFdQQS9SU04gbW9kZSwgdGhlIGtleSBJRCByYW5nZTogMS0zLCB1c3VhbGx5LCBhIGJyb2FkY2FzdCBrZXkuCisgICAgICAgICAgICAgICAgLy8gRm9yIFdFUCBrZXkgc2V0dGluZzogd2Ugc2V0IG1EeW5LZXlNb2RlIGFuZCBtS2V5Rm9ybWF0IGluIGZvbGxvd2luZyBjYXNlOgorICAgICAgICAgICAgICAgIC8vICAgMS4gRm9yIDgwMi4xeCBkeW5hbWljYWxseSBnZW5lcmF0ZWQgV0VQIGtleSBtZXRob2QuCisgICAgICAgICAgICAgICAgLy8gICAyLiBGb3IgV1BBL1JTTiBtb2RlLCBidXQga2V5IGlkID09IDAuIChCdXQgdGhpcyBpcyBhbiBpbXBvc3NpYmxlIGNhc2UpCisgICAgICAgICAgICAgICAgLy8gU28sIG9ubHkgY2hlY2sgY2FzZSAxLgorICAgICAgICAgICAgICAgIC8vaWYgKG1hY3AtPmNhcmRTZXR0aW5nLldQQUllTGVuPT0wKQorICAgICAgICAgICAgICAgIC8veworICAgICAgICAgICAgICAgIC8vICAgIG1LZXlGb3JtYXRbMF0gPSBDYW1FbmNyeVR5cGU7CisgICAgICAgICAgICAgICAgLy8gICAgbUR5bktleU1vZGUgPSBwU2V0dGluZy0+RHluS2V5TW9kZSA9IHRtcER5bktleU1vZGU7CisgICAgICAgICAgICAgICAgLy8gICAgbVByaXZhY3lJbnZva2VkWzBdPVRSVUU7CisgICAgICAgICAgICAgICAgLy8gICAgbUNhcFswXSB8PSBDQVBfUFJJVkFDWTsKKyAgICAgICAgICAgICAgICAvLyAgICBtYWNwLT5jYXJkU2V0dGluZy5FbmNyeU9uT2ZmWzBdPTE7CisgICAgICAgICAgICAgICAgLy99CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIERVTVAga2V5IGNvbnRleHQgKi8KKy8vI2lmZGVmIFdQQV9ERUJVRworICAgICAgICAgICAgaWYgKGtleUluZm8ua2V5TGVuZ3RoID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgaWk7CisgICAgICAgICAgICAgICAgcHJpbnRrKCJPdHVzOiBLZXkgQ29udGV4dDpcbiIpOworICAgICAgICAgICAgICAgIGZvcihpaSA9IDA7IGlpIDwga2V5SW5mby5rZXlMZW5ndGg7KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCIweCUwMnggIiwga2V5SW5mby5rZXlbaWldKTsKKyAgICAgICAgICAgICAgICAgICAgaWYoKCsraWkgJSAxNikgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50aygiXG4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcHJpbnRrKCJcbiIpOworICAgICAgICAgICAgfQorLy8jZW5kaWYKKworICAgICAgICAgICAgLyogU2V0IGVuY3J5cHQgbW9kZSAqLworICAgICAgICAgICAgLy96ZmlXbGFuU2V0RW5jcnlNb2RlKGRldiwgQ2FtRW5jcnlUeXBlKTsKKyAgICAgICAgICAgIHZhcElkID0gemZMbnhHZXRWYXBJZChkZXYpOworICAgICAgICAgICAgaWYgKHZhcElkID09IDB4ZmZmZikKKyAgICAgICAgICAgICAgICBrZXlJbmZvLnZhcElkID0gMDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBrZXlJbmZvLnZhcElkID0gdmFwSWQgKyAxOworICAgICAgICAgICAga2V5SW5mby52YXBBZGRyWzBdID0ga2V5SW5mby5tYWNBZGRyWzBdOworICAgICAgICAgICAga2V5SW5mby52YXBBZGRyWzFdID0ga2V5SW5mby5tYWNBZGRyWzFdOworICAgICAgICAgICAga2V5SW5mby52YXBBZGRyWzJdID0ga2V5SW5mby5tYWNBZGRyWzJdOworCisgICAgICAgICAgICB6ZmlXbGFuU2V0S2V5KGRldiwga2V5SW5mbyk7CisKKyAgICAgICAgICAgIC8vemZpV2xhbkRpc2FibGUoZGV2KTsKKyAgICAgICAgICAgIC8vemZpV2xhbkVuYWJsZShkZXYpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBaRF9DTURfU0VUX01MTUU6CisgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgInVzYmRydl93cGFfaW9jdGw6IFpEX0NNRF9TRVRfTUxNRVxuIik7CisKKyAgICAgICAgICAgIC8qIFRyYW5zbGF0ZSBTVEEncyBhZGRyZXNzICovCisgICAgICAgICAgICBzcHJpbnRmKG1hY19hZGRyLCAiJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMngiLCB6ZHBhcm0tPnN0YV9hZGRyWzBdLCB6ZHBhcm0tPnN0YV9hZGRyWzFdLAorICAgICAgICAgICAgICAgIHpkcGFybS0+c3RhX2FkZHJbMl0sIHpkcGFybS0+c3RhX2FkZHJbM10sIHpkcGFybS0+c3RhX2FkZHJbNF0sIHpkcGFybS0+c3RhX2FkZHJbNV0pOworCisgICAgICAgICAgICBzd2l0Y2goemRwYXJtLT51Lm1sbWUuY21kKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgTUxNRV9TVEFfREVBVVRIOgorICAgICAgICAgICAgICAgICAgICBwcmludGsoIiAtLS0tLS0tQ2FsbCB6ZmlXbGFuRGVhdXRoLCByZWFzb246JWRcbiIsemRwYXJtLT51Lm1sbWUucmVhc29uX2NvZGUpOworICAgICAgICAgICAgICAgICAgICBpZih6ZmlXbGFuRGVhdXRoKGRldiwgKHUxNl90KikgemRwYXJtLT5zdGFfYWRkciwgemRwYXJtLT51Lm1sbWUucmVhc29uX2NvZGUpICE9IDApCisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgIkNhbid0IGRlYXV0aGVuY2F0ZSBTVEE6ICVzXG4iLCBtYWNfYWRkcik7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiRGVhdXRoZW50aWNhdGUgU1RBOiAlcyB3aXRoIHJlYXNvbiBjb2RlOiAlZFxuIiwgbWFjX2FkZHIsIHpkcGFybS0+dS5tbG1lLnJlYXNvbl9jb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIE1MTUVfU1RBX0RJU0FTU09DOgorICAgICAgICAgICAgICAgICAgICBwcmludGsoIiAtLS0tLS0tQ2FsbCB6ZmlXbGFuRGVhdXRoLCByZWFzb246JWRcbiIsemRwYXJtLT51Lm1sbWUucmVhc29uX2NvZGUpOworICAgICAgICAgICAgICAgICAgICBpZih6ZmlXbGFuRGVhdXRoKGRldiwgKHUxNl90KikgemRwYXJtLT5zdGFfYWRkciwgemRwYXJtLT51Lm1sbWUucmVhc29uX2NvZGUpICE9IDApCisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgIkNhbid0IGRpc2Fzc29jaWF0ZSBTVEE6ICVzXG4iLCBtYWNfYWRkcik7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiRGlzYXNzb2NpYXRlIFNUQTogJXMgd2l0aCByZWFzb24gY29kZTogJWRcbiIsIG1hY19hZGRyLCB6ZHBhcm0tPnUubWxtZS5yZWFzb25fY29kZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJNTE1FIGNvbW1hbmQ6IDB4JTA0eCBub3Qgc3VwcG9ydFxuIiwgemRwYXJtLT51Lm1sbWUuY21kKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgWkRfQ01EX1NDQU5fUkVROgorICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJ1c2JkcnZfd3BhX2lvY3RsOiBaRF9DTURfU0NBTl9SRVFcbiIpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBaRF9DTURfU0VUX0dFTkVSSUNfRUxFTUVOVDoKKyAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAidXNiZHJ2X3dwYV9pb2N0bDogWkRfQ01EX1NFVF9HRU5FUklDX0VMRU1FTlRcbiIpOworCisgICAgICAgICAgICAvKiBDb3B5IHRoZSBXUEEgSUUgKi8KKyAgICAgICAgICAgIC8vem1fbXNnMV9tbShaTV9MVl8wLCAiQ1dZIC0gd3BhaWUgTGVuZ3RoIDogIiwgemRwYXJtLT51LmdlbmVyaWNfZWxlbS5sZW4pOworICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJ3cGFpZSBMZW5ndGggOiAlZFxuIiwgemRwYXJtLT51LmdlbmVyaWNfZWxlbS5sZW4pOworICAgICAgICAgICAgaWYgKHpmaVdsYW5RdWVyeVdsYW5Nb2RlKGRldikgPT0gWk1fTU9ERV9BUCkgLy8gQVAgTW9kZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHpmaVdsYW5TZXRXcGFJZShkZXYsIHpkcGFybS0+dS5nZW5lcmljX2VsZW0uZGF0YSwgemRwYXJtLT51LmdlbmVyaWNfZWxlbS5sZW4pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1hY3AtPnN1cExlbiA9IHpkcGFybS0+dS5nZW5lcmljX2VsZW0ubGVuOworICAgICAgICAgICAgICAgIG1lbWNweShtYWNwLT5zdXBJZSwgemRwYXJtLT51LmdlbmVyaWNfZWxlbS5kYXRhLCB6ZHBhcm0tPnUuZ2VuZXJpY19lbGVtLmxlbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB6ZmlXbGFuU2V0V3BhU3VwcG9ydChkZXYsIDEpOworICAgICAgICAgICAgLy96ZmlXbGFuU2V0V3BhSWUoZGV2LCB6ZHBhcm0tPnUuZ2VuZXJpY19lbGVtLmRhdGEsIHpkcGFybS0+dS5nZW5lcmljX2VsZW0ubGVuKTsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgaWk7CisgICAgICAgICAgICAgICAgdThfdCBsZW4gPSB6ZHBhcm0tPnUuZ2VuZXJpY19lbGVtLmxlbjsKKyAgICAgICAgICAgICAgICB1OF90ICp3cGFpZSA9ICh1OF90ICopemRwYXJtLT51LmdlbmVyaWNfZWxlbS5kYXRhOworCisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJ3ZC0+YXAud3BhTGVuOiAlZFxuIiwgbGVuKTsKKworICAgICAgICAgICAgICAgIC8qIERVTVAgV1BBIElFICovCisgICAgICAgICAgICAgICAgZm9yKGlpID0gMDsgaWkgPCBsZW47KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICIweCUwMnggIiwgd3BhaWVbaWldKTsKKworICAgICAgICAgICAgICAgICAgICBpZigoKytpaSAlIDE2KSA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJcbiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgIlxuIik7CisgICAgICAgICAgICB9CisKKy8vICAgICAgICAgICAgI2lmZGVmIFpNX0hPU1RBUERfU1VQUE9SVAorICAgICAgICAgICAgLy9pZiAod2QtPndsYW5Nb2RlID09IFpNX01PREVfQVApCisgICAgICAgICAgICAvL3svLyBVcGRhdGUgQmVhY29uIEZJRk8gaW4gdGhlIG5leHQgVEJUVC4KKyAgICAgICAgICAgIC8vICAgIG1lbWNweSgmbVdQQUllLCBwU2V0dGluZy0+V1BBSWUsIHBTZXR0aW5nLT5XUEFJZUxlbik7CisgICAgICAgICAgICAvLyAgICBwcmludGsoS0VSTl9FUlIgIkNvcHkgV1BBIElFIGludG8gbVdQQUllXG4iKTsKKyAgICAgICAgICAgIC8vfQorLy8gICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgIGJyZWFrOworCisvLyAgICAgICAgI2lmZGVmIFpNX0hPU1RBUERfU1VQUE9SVAorICAgICAgICBjYXNlIFpEX0NNRF9HRVRfVFNDOgorICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJ1c2JkcnZfd3BhX2lvY3RsOiBaRF9DTURfR0VUX1RTQ1xuIik7CisgICAgICAgICAgICBicmVhazsKKy8vICAgICAgICAjZW5kaWYKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJ1c2JkcnZfd3BhX2lvY3RsIGRlZmF1bHQ6IDB4JTA0eFxuIiwgemRwYXJtLT5jbWQpOworICAgICAgICAgICAgcmV0ID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKKyNpZmRlZiBaTV9FTkFCTEVfQ0VOQworaW50IHVzYmRydl9jZW5jX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCB6eWRhc19jZW5jX3BhcmFtICp6ZHBhcm0pCit7CisgICAgLy9zdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AgPSBkZXYtPm1sX3ByaXY7CisgICAgc3RydWN0IHpzS2V5SW5mbyBrZXlJbmZvOworICAgIHUxNl90IGFwSWQ7CisgICAgdThfdCBiY19hZGRyWzZdID0geyAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmIH07CisgICAgaW50IHJldCA9IDA7CisgICAgaW50IGlpOworCisgICAgLyogR2V0IHRoZSBBUCBJZCAqLworICAgIGFwSWQgPSB6ZkxueEdldFZhcElkKGRldik7CisKKyAgICBpZiAoYXBJZCA9PSAweGZmZmYpCisgICAgeworICAgICAgICBhcElkID0gMDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBJZCA9IGFwSWQrMTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHpkcGFybS0+Y21kKQorICAgIHsKKyAgICAgICAgY2FzZSBaTV9DTURfQ0VOQ19TRVRDRU5DOgorICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJaTV9DTURfQ0VOQ19TRVRDRU5DXG4iKTsKKyAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAibGVuZ3RoOiAlZFxuIiwgemRwYXJtLT5sZW4pOworICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJwb2xpY3k6ICVkXG4iLCB6ZHBhcm0tPnUuaW5mby5jZW5jX3BvbGljeSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBaTV9DTURfQ0VOQ19TRVRLRVk6CisgICAgICAgICAgICAvL3JldCA9IHdhaV9pb2N0bF9zZXRrZXkodmFwLCBpb2N0bF9tc2cpOworICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJaTV9DTURfQ0VOQ19TRVRLRVlcbiIpOworCisgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgIk1BQyBhZGRyZXNzPSAiKTsKKyAgICAgICAgICAgIGZvcihpaSA9IDA7IGlpIDwgNjsgaWkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgIjB4JTAyeCAiLCB6ZHBhcm0tPnUuY3J5cHQuc3RhX2FkZHJbaWldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiXG4iKTsKKworICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJLZXkgSW5kZXg6ICVkXG4iLCB6ZHBhcm0tPnUuY3J5cHQua2V5aWQpOworICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJFbmNyeXB0aW9uIGtleT0gIik7CisgICAgICAgICAgICBmb3IoaWkgPSAwOyBpaSA8IDE2OyBpaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiMHglMDJ4ICIsIHpkcGFybS0+dS5jcnlwdC5rZXlbaWldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiXG4iKTsKKworICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJNSUMga2V5PSAiKTsKKyAgICAgICAgICAgIGZvcihpaSA9IDE2OyBpaSA8IFpNX0NFTkNfS0VZX1NJWkU7IGlpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICIweCUwMnggIiwgemRwYXJtLT51LmNyeXB0LmtleVtpaV0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJcbiIpOworCisgICAgICAgICAgICAvKiBTZXQgdXAga2V5IGluZm9ybWF0aW9uICovCisgICAgICAgICAgICBrZXlJbmZvLmtleUxlbmd0aCA9IFpNX0NFTkNfS0VZX1NJWkU7CisgICAgICAgICAgICBrZXlJbmZvLmtleUluZGV4ID0gemRwYXJtLT51LmNyeXB0LmtleWlkOworICAgICAgICAgICAga2V5SW5mby5mbGFnID0gWk1fS0VZX0ZMQUdfQVVUSEVOVElDQVRPUiB8IFpNX0tFWV9GTEFHX0NFTkM7CisgICAgICAgICAgICBrZXlJbmZvLmtleSA9IHpkcGFybS0+dS5jcnlwdC5rZXk7CisgICAgICAgICAgICBrZXlJbmZvLm1hY0FkZHIgPSAodTE2X3QgKil6ZHBhcm0tPnUuY3J5cHQuc3RhX2FkZHI7CisKKyAgICAgICAgICAgIC8qIElkZW50aWZ5IHRoZSBNQUMgYWRkcmVzcyBpbmZvcm1hdGlvbiAqLworICAgICAgICAgICAgaWYgKG1lbWNtcCh6ZHBhcm0tPnUuY3J5cHQuc3RhX2FkZHIsIGJjX2FkZHIsIHNpemVvZihiY19hZGRyKSkgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBrZXlJbmZvLmZsYWcgfD0gWk1fS0VZX0ZMQUdfR0s7CisgICAgICAgICAgICAgICAga2V5SW5mby52YXBJZCA9IGFwSWQ7CisgICAgICAgICAgICAgICAgbWVtY3B5KGtleUluZm8udmFwQWRkciwgZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGtleUluZm8uZmxhZyB8PSBaTV9LRVlfRkxBR19QSzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgemZpV2xhblNldEtleShkZXYsIGtleUluZm8pOworCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBaTV9DTURfQ0VOQ19SRUtFWToKKyAgICAgICAgICAgIC8vcmV0ID0gd2FpX2lvY3RsX3Jla2V5KHZhcCwgaW9jdGxfbXNnKTsKKyAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiWk1fQ01EX0NFTkNfUkVLRVlcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXQgPSAtRU9QTk9UU1VQUDsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgfQorCisgICAgLy9pZiAocmV0diA9PSBFTkVUUkVTRVQpCisgICAgLy8gICAgcmV0diA9IElTX1VQX0FVVE8odmFwKSA/IGllZWU4MDIxMV9vcGVuKHZhcC0+aXZfZGV2KSA6IDA7CisKKyAgICByZXR1cm4gcmV0OworfQorI2VuZGlmIC8vWk1fRU5BQkxFX0NFTkMKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCitpbnQgdXNiZHJ2X2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqaWZyLCBpbnQgY21kKQoreworLy8gICAgc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwOworLy8gICAgdm9pZCAqcmVncDsKKyAgICBzdHJ1Y3QgemRhcF9pb2N0bCB6ZHJlcTsKKyAgICBzdHJ1Y3QgaXdyZXEgKndycSA9IChzdHJ1Y3QgaXdyZXEgKilpZnI7CisgICAgc3RydWN0IGF0aHJfd2xhbl9wYXJhbSB6ZHBhcm07CisgICAgc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gZGV2LT5tbF9wcml2OworCisgICAgaW50IGVyciA9IDA7CisgICAgaW50IGNoYW5nZWQgPSAwOworCisvLyAgICByZWdwID0gbWFjcC0+cmVncDsKKworICAgIGlmKCFuZXRpZl9ydW5uaW5nKGRldikpCisgICAgICAgIHJldHVybiAtRUlOVkFMOworCisgICAgc3dpdGNoIChjbWQpCisgICAgeworICAgICAgICAgICAgY2FzZSBTSU9DR0lXTkFNRToKKyAgICAgICAgICAgIHN0cmNweSh3cnEtPnUubmFtZSwgIklFRUUgODAyLjExLURTIik7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFNJT0NHSVdBUDoKKyAgICAgICAgICAgIGVyciA9IHVzYmRydndleHRfZ2l3YXAoZGV2LCBOVUxMLCAmd3JxLT51LmFwX2FkZHIsIE5VTEwpOworICAgICAgICAgICAgYnJlYWs7CisKKworICAgICAgICBjYXNlIFNJT0NTSVdBUDoKKyAgICAgICAgICAgIGVyciA9IHVzYmRydndleHRfc2l3YXAoZGV2LCBOVUxMLCAmd3JxLT51LmFwX2FkZHIsIE5VTEwpOworICAgICAgICAgICAgYnJlYWs7CisKKworICAgICAgICBjYXNlIFNJT0NHSVdNT0RFOgorICAgICAgICAgICAgZXJyID0gdXNiZHJ2d2V4dF9naXdtb2RlKGRldiwgTlVMTCwgJndycS0+dS5tb2RlLCBOVUxMKTsKKyAgICAgICAgICAgIGJyZWFrOworCisKKyAgICAgICAgY2FzZSBTSU9DU0lXRVNTSUQ6CisgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgIkNXWSAtIHVzYmRydndleHRfc2l3ZXNzaWRcbiIpOworICAgICAgICAgICAgLy9lcnIgPSB1c2JkcnZfaW9jdGxfc2V0ZXNzaWQoZGV2LCAmd3JxLT51LmVzc2lkKTsKKyAgICAgICAgICAgIGVyciA9IHVzYmRydndleHRfc2l3ZXNzaWQoZGV2LCBOVUxMLCAmd3JxLT51LmVzc2lkLCBOVUxMKTsKKworICAgICAgICAgICAgaWYgKCEgZXJyKQorICAgICAgICAgICAgICAgIGNoYW5nZWQgPSAxOworICAgICAgICAgICAgYnJlYWs7CisKKworICAgICAgICBjYXNlIFNJT0NHSVdFU1NJRDoKKyAgICAgICAgICAgIGVyciA9IHVzYmRydndleHRfZ2l3ZXNzaWQoZGV2LCBOVUxMLCAmd3JxLT51LmVzc2lkLCBOVUxMKTsKKyAgICAgICAgICAgIGJyZWFrOworCisKKyAgICAgICAgY2FzZSBTSU9DU0lXUlRTOgorCisgICAgICAgICAgICBlcnIgPSB1c2JkcnZfaW9jdGxfc2V0cnRzKGRldiwgJndycS0+dS5ydHMpOworICAgICAgICAgICAgaWYgKCEgZXJyKQorICAgICAgICAgICAgICAgIGNoYW5nZWQgPSAxOworICAgICAgICAgICAgYnJlYWs7CisKKworCQljYXNlIFNJT0NJV0ZJUlNUUFJJViArIDB4MjogLyogc2V0X2F1dGggKi8KKwkJeworCQkJLy9wcmludGsoIkNXWSAtIFNJT0NJV0ZJUlNUUFJJViArIDB4MiAoc2V0X2F1dGgpXG4iKTsKKwkJCWlmICghIGNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCQl7CisJCQkJZXJyID0gLUVQRVJNOworCQkJCWJyZWFrOworCQkJfQorCQkJeworCQkJCWludCB2YWwgPSAqKCAoaW50ICopIHdycS0+dS5uYW1lICk7CisJCQkJaWYgKCh2YWwgPCAwKSB8fCAodmFsID4gMikpCisJCQkJeworCQkJCQllcnIgPSAtRUlOVkFMOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJemZpV2xhblNldEF1dGhlbnRpY2F0aW9uTW9kZShkZXYsIHZhbCk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1hY3AtPkRldmljZU9wZW5lZCA9PSAxKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB6ZmlXbGFuRGlzYWJsZShkZXYsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgemZpV2xhbkVuYWJsZShkZXYpOworICAgICAgICAgICAgICAgICAgICB9CisKKwkJCQkJZXJyID0gMDsKKwkJCQkJY2hhbmdlZCA9IDE7CisJCQkJfQorCQkJfQorCQl9CisJCQlicmVhazsKKworCQljYXNlIFNJT0NJV0ZJUlNUUFJJViArIDB4MzogLyogZ2V0X2F1dGggKi8KKwkJeworCQkgICAgaW50IEF1dGhNb2RlID0gWk1fQVVUSF9NT0RFX09QRU47CisKKwkJCS8vcHJpbnRrKCJDV1kgLSBTSU9DSVdGSVJTVFBSSVYgKyAweDMgKGdldF9hdXRoKVxuIik7CisKKwkJCWlmICh3cnEtPnUuZGF0YS5wb2ludGVyKQorCQkJeworCQkJCXdycS0+dS5kYXRhLmZsYWdzID0gMTsKKworCQkJCUF1dGhNb2RlID0gemZpV2xhblF1ZXJ5QXV0aGVudGljYXRpb25Nb2RlKGRldiwgMCk7CisJCQkJaWYgKEF1dGhNb2RlID09IFpNX0FVVEhfTU9ERV9PUEVOKQorCQkJCXsKKwkJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gMTI7CisKKwkJCQkJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAib3BlbiBzeXN0ZW0iLCAxMikpCisJCQkJCXsKKwkJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCQl9CisJCQkJfQorCQkJCWVsc2UgaWYgKEF1dGhNb2RlID09IFpNX0FVVEhfTU9ERV9TSEFSRURfS0VZKQorCQkJCXsKKwkJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gMTE7CisKKwkJCQkJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAic2hhcmVkIGtleSIsIDExKSkKKwkJCQkJeworCQkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZSBpZiAoQXV0aE1vZGUgPT0gWk1fQVVUSF9NT0RFX0FVVE8pCisJCQkJeworCQkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSAxMDsKKworCQkJCQlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICJhdXRvIG1vZGUiLCAxMCkpCisJCQkJCXsKKwkJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCQl9CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCX0KKwkJCX0KKwkJfQorCQkJYnJlYWs7CisKKworICAgICAgICBjYXNlIFpEQVBJT0NUTDogICAgLy9kZWJ1ZyBjb21tYW5kCisgICAgICAgICAgICBpZiAoY29weV9mcm9tX3VzZXIoJnpkcmVxLCBpZnItPmlmcl9kYXRhLCBzaXplb2YgKHpkcmVxKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJ1c2JkcnY6IGNvcHlfZnJvbV91c2VyIGVycm9yXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVGQVVMVDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy9wcmludGsoS0VSTl9ERUJVRyAidXNiZHJ2OiBjbWQ9JTJ4LCByZWc9MHglMDRseCwgdmFsdWU9MHglMDhseFxuIiwKKyAgICAgICAgICAgIC8vICAgICAgICB6ZHJlcS5jbWQsIHpkcmVxLmFkZHIsIHpkcmVxLnZhbHVlKTsKKworCQkJemZMbnhQcml2YXRlSW9jdGwoZGV2LCAmemRyZXEpOworCisgICAgICAgICAgICBlcnIgPSAwOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBaRF9JT0NUTF9XUEE6CisgICAgICAgICAgICBpZiAoY29weV9mcm9tX3VzZXIoJnpkcGFybSwgaWZyLT5pZnJfZGF0YSwgc2l6ZW9mKHN0cnVjdCBhdGhyX3dsYW5fcGFyYW0pKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgInVzYmRydjogY29weV9mcm9tX3VzZXIgZXJyb3JcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiAtRUZBVUxUOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB1c2JkcnZfd3BhX2lvY3RsKGRldiwgJnpkcGFybSk7CisgICAgICAgICAgICBlcnIgPSAwOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBaRF9JT0NUTF9QQVJBTToKKyAgICAgICAgeworICAgICAgICAgICAgaW50ICpwOworICAgICAgICAgICAgaW50IG9wOworICAgICAgICAgICAgaW50IGFyZzsKKworICAgICAgICAgICAgLyogUG9pbnQgdG8gdGhlIG5hbWUgZmllbGQgYW5kIHJldHJpZXZlIHRoZQorICAgICAgICAgICAgICogb3AgYW5kIGFyZyBlbGVtZW50cy4gICAgICAgICAgKi8KKyAgICAgICAgICAgIHAgPSAoaW50ICopd3JxLT51Lm5hbWU7CisgICAgICAgICAgICBvcCA9ICpwKys7CisgICAgICAgICAgICBhcmcgPSAqcDsKKworICAgICAgICAgICAgaWYob3AgPT0gWkRfUEFSQU1fUk9BTUlORykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgIioqKioqKioqKioqKiogWkRfUEFSQU1fUk9BTUlORzogJWRcbiIsIGFyZyk7CisgICAgICAgICAgICAgICAgLy9tYWNwLT5jYXJkU2V0dGluZy5hcF9zY2FuPShVOClhcmc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZihvcCA9PSBaRF9QQVJBTV9QUklWQUNZKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiWkRfSU9DVExfUFJJVkFDWTogIik7CisKKyAgICAgICAgICAgICAgICAvKiBUdXJuIG9uIHRoZSBwcml2YWN5IGludm9rZSBmbGFnICovCisgICAgICAgICAgICAgICAgaWYoYXJnKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyAgICBtQ2FwWzBdIHw9IENBUF9QUklWQUNZOworICAgICAgICAgICAgICAgIC8vICAgIG1hY3AtPmNhcmRTZXR0aW5nLkVuY3J5T25PZmZbMF0gPSAxOworICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgImVuYWJsZVxuIik7CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyAgICBtQ2FwWzBdICY9IH5DQVBfUFJJVkFDWTsKKyAgICAgICAgICAgICAgICAvLyAgICBtYWNwLT5jYXJkU2V0dGluZy5FbmNyeU9uT2ZmWzBdID0gMDsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJkaXNhYmxlXG4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vY2hhbmdlZD0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYob3AgPT0gWkRfUEFSQU1fV1BBKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiWkRfUEFSQU1fV1BBOiAiKTsKKworICAgICAgICAgICAgICAgIGlmKGFyZykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiZW5hYmxlXG4iKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoemZpV2xhblF1ZXJ5V2xhbk1vZGUoZGV2KSAhPSBaTV9NT0RFX0FQKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgIlN0YXRpb24gTW9kZVxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAvL3pmaVdsYW5RdWVyeVdwYUllKGRldiwgKHU4X3QgKikmd3BhSWUsICZ3cGFsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgLy9wcmludGsoIndwYUllIDogJTJ4LCUyeCwlMnhcbiIsIHdwYUllWzIxXSwgd3BhSWVbMjJdLCB3cGFJZVsyM10pOworICAgICAgICAgICAgICAgICAgICAgICAgLy9wcmludGsoInJzbkllIDogJTJ4LCUyeCwlMnhcbiIsIHdwYUllWzE3XSwgd3BhSWVbMThdLCB3cGFJZVsxOV0pOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChtYWNwLT5zdXBJZVsyMV0gPT0gMHg1MCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWFjcC0+c3VwSWVbMjJdID09IDB4ZjIpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1hY3AtPnN1cEllWzIzXSA9PSAweDIpKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAid2QtPnN0YS5hdXRoTW9kZSA9IFpNX0FVVEhfTU9ERV9XUEFQU0tcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vd2QtPnN0YS5hdXRoTW9kZSA9IFpNX0FVVEhfTU9ERV9XUEFQU0s7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy93ZC0+d3MuYXV0aE1vZGUgPSBaTV9BVVRIX01PREVfV1BBUFNLOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpmaVdsYW5TZXRBdXRoZW50aWNhdGlvbk1vZGUoZGV2LCBaTV9BVVRIX01PREVfV1BBUFNLKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKChtYWNwLT5zdXBJZVsyMV0gPT0gMHg1MCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtYWNwLT5zdXBJZVsyMl0gPT0gMHhmMikgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtYWNwLT5zdXBJZVsyM10gPT0gMHgxKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgIndkLT5zdGEuYXV0aE1vZGUgPSBaTV9BVVRIX01PREVfV1BBXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3dkLT5zdGEuYXV0aE1vZGUgPSBaTV9BVVRIX01PREVfV1BBOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vd2QtPndzLmF1dGhNb2RlID0gWk1fQVVUSF9NT0RFX1dQQTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ZmlXbGFuU2V0QXV0aGVudGljYXRpb25Nb2RlKGRldiwgWk1fQVVUSF9NT0RFX1dQQSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICgobWFjcC0+c3VwSWVbMTddID09IDB4ZikgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtYWNwLT5zdXBJZVsxOF0gPT0gMHhhYykgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtYWNwLT5zdXBJZVsxOV0gPT0gMHgyKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgIndkLT5zdGEuYXV0aE1vZGUgPSBaTV9BVVRIX01PREVfV1BBMlBTS1xuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy93ZC0+c3RhLmF1dGhNb2RlID0gWk1fQVVUSF9NT0RFX1dQQTJQU0s7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy93ZC0+d3MuYXV0aE1vZGUgPSBaTV9BVVRIX01PREVfV1BBMlBTSzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ZmlXbGFuU2V0QXV0aGVudGljYXRpb25Nb2RlKGRldiwgWk1fQVVUSF9NT0RFX1dQQTJQU0spOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoKG1hY3AtPnN1cEllWzE3XSA9PSAweGYpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWFjcC0+c3VwSWVbMThdID09IDB4YWMpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWFjcC0+c3VwSWVbMTldID09IDB4MSkpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJ3ZC0+c3RhLmF1dGhNb2RlID0gWk1fQVVUSF9NT0RFX1dQQTJcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vd2QtPnN0YS5hdXRoTW9kZSA9IFpNX0FVVEhfTU9ERV9XUEEyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vd2QtPndzLmF1dGhNb2RlID0gWk1fQVVUSF9NT0RFX1dQQTI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgemZpV2xhblNldEF1dGhlbnRpY2F0aW9uTW9kZShkZXYsIFpNX0FVVEhfTU9ERV9XUEEyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgobWFjcC0+c3VwSWVbMjFdID09IDB4NTApIHx8IChtYWNwLT5zdXBJZVsyMl0gPT0gMHhmMikpLy9XUEEgb3IgV1BBUFNLCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hY3AtPnN1cEllWzExXSA9PSAweDIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgIndkLT5zdGEud2VwU3RhdHVzID0gWk1fRU5DUllQVElPTl9US0lQXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy93ZC0+c3RhLndlcFN0YXR1cyA9IFpNX0VOQ1JZUFRJT05fVEtJUDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy93ZC0+d3Mud2VwU3RhdHVzID0gWk1fRU5DUllQVElPTl9US0lQOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ZmlXbGFuU2V0V2VwU3RhdHVzKGRldiwgWk1fRU5DUllQVElPTl9US0lQKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJ3ZC0+c3RhLndlcFN0YXR1cyA9IFpNX0VOQ1JZUFRJT05fQUVTXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy93ZC0+c3RhLndlcFN0YXR1cyA9IFpNX0VOQ1JZUFRJT05fQUVTOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3dkLT53cy53ZXBTdGF0dXMgPSBaTV9FTkNSWVBUSU9OX0FFUzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemZpV2xhblNldFdlcFN0YXR1cyhkZXYsIFpNX0VOQ1JZUFRJT05fQUVTKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKG1hY3AtPnN1cEllWzE3XSA9PSAweGYpIHx8IChtYWNwLT5zdXBJZVsxOF0gPT0gMHhhYykpIC8vV1BBMiBvciBXUEEyUFNLCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hY3AtPnN1cEllWzEzXSA9PSAweDIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgIndkLT5zdGEud2VwU3RhdHVzID0gWk1fRU5DUllQVElPTl9US0lQXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy93ZC0+c3RhLndlcFN0YXR1cyA9IFpNX0VOQ1JZUFRJT05fVEtJUDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy93ZC0+d3Mud2VwU3RhdHVzID0gWk1fRU5DUllQVElPTl9US0lQOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ZmlXbGFuU2V0V2VwU3RhdHVzKGRldiwgWk1fRU5DUllQVElPTl9US0lQKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJ3ZC0+c3RhLndlcFN0YXR1cyA9IFpNX0VOQ1JZUFRJT05fQUVTXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy93ZC0+c3RhLndlcFN0YXR1cyA9IFpNX0VOQ1JZUFRJT05fQUVTOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3dkLT53cy53ZXBTdGF0dXMgPSBaTV9FTkNSWVBUSU9OX0FFUzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemZpV2xhblNldFdlcFN0YXR1cyhkZXYsIFpNX0VOQ1JZUFRJT05fQUVTKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgemZpV2xhblNldFdwYVN1cHBvcnQoZGV2LCAxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyogUmVzZXQgdGhlIFdQQSByZWxhdGVkIHZhcmlhYmxlcyAqLworICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgImRpc2FibGVcbiIpOworCisgICAgICAgICAgICAgICAgICAgIHpmaVdsYW5TZXRXcGFTdXBwb3J0KGRldiwgMCk7CisgICAgICAgICAgICAgICAgICAgIHpmaVdsYW5TZXRBdXRoZW50aWNhdGlvbk1vZGUoZGV2LCBaTV9BVVRIX01PREVfT1BFTik7CisgICAgICAgICAgICAgICAgICAgIHpmaVdsYW5TZXRXZXBTdGF0dXMoZGV2LCBaTV9FTkNSWVBUSU9OX1dFUF9ESVNBQkxFRCk7CisKKyAgICAgICAgICAgICAgICAgICAgLyogTm93IHdlIG9ubHkgc2V0IHRoZSBsZW5ndGggaW4gdGhlIFdQQSBJRQorICAgICAgICAgICAgICAgICAgICAgKiBmaWVsZCB0byB6ZXJvLiAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAvL21hY3AtPmNhcmRTZXR0aW5nLldQQUllWzFdID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZihvcCA9PSBaRF9QQVJBTV9DT1VOVEVSTUVBU1VSRVMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICI9PT09PT09PT09PT09PT09WkRfUEFSQU1fQ09VTlRFUk1FQVNVUkVTOiAiKTsKKworICAgICAgICAgICAgICAgIGlmKGFyZykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gICAgbUNvdW50ZXJNZWFzdXJlU3RhdGU9MTsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJlbmFibGVcbiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vICAgIG1Db3VudGVyTWVhc3VyZVN0YXRlPTA7CisgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiZGlzYWJsZVxuIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYob3AgPT0gWkRfUEFSQU1fRFJPUFVORU5DUllQVEVEKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiWkRfUEFSQU1fRFJPUFVORU5DUllQVEVEOiAiKTsKKworICAgICAgICAgICAgICAgIGlmKGFyZykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiZW5hYmxlXG4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJkaXNhYmxlXG4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZihvcCA9PSBaRF9QQVJBTV9BVVRIX0FMR1MpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJaRF9QQVJBTV9BVVRIX0FMR1M6ICIpOworCisgICAgICAgICAgICAgICAgaWYoYXJnID09IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgIk9QRU5fU1lTVEVNXG4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJTSEFSRURfS0VZXG4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZihvcCA9PSBaRF9QQVJBTV9XUFNfRklMVEVSKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiWkRfUEFSQU1fV1BTX0ZJTFRFUjogIik7CisKKyAgICAgICAgICAgICAgICBpZihhcmcpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vICAgIG1Db3VudGVyTWVhc3VyZVN0YXRlPTE7CisgICAgICAgICAgICAgICAgICAgIG1hY3AtPmZvcndhcmRNZ210ID0gMTsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJlbmFibGVcbiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vICAgIG1Db3VudGVyTWVhc3VyZVN0YXRlPTA7CisgICAgICAgICAgICAgICAgICAgIG1hY3AtPmZvcndhcmRNZ210ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJkaXNhYmxlXG4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgICAgIGVyciA9IDA7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFpEX0lPQ1RMX0dFVFdQQUlFOgorICAgICAgICB7CisgICAgICAgICAgICBzdHJ1Y3QgaWVlZTgwMjExcmVxX3dwYWllIHJlcV93cGFpZTsKKyAgICAgICAgICAgIHUxNl90IGFwSWQsIGksIGo7CisKKyAgICAgICAgICAgIC8qIEdldCB0aGUgQVAgSWQgKi8KKyAgICAgICAgICAgIGFwSWQgPSB6ZkxueEdldFZhcElkKGRldik7CisKKyAgICAgICAgICAgIGlmIChhcElkID09IDB4ZmZmZikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcElkID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcElkID0gYXBJZCsxOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoY29weV9mcm9tX3VzZXIoJnJlcV93cGFpZSwgaWZyLT5pZnJfZGF0YSwgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFyZXFfd3BhaWUpKSl7CisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJ1c2JkcnY6IGNvcHlfZnJvbV91c2VyIGVycm9yXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVGQVVMVDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yKGkgPSAwOyBpIDwgWk1fT0FMX01BWF9TVEFfU1VQUE9SVDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvcihqID0gMDsgaiA8IElFRUU4MDIxMV9BRERSX0xFTjsgaisrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1hY3AtPnN0YXdwYWllW2ldLndwYV9tYWNhZGRyW2pdICE9IHJlcV93cGFpZS53cGFfbWFjYWRkcltqXSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoaiA9PSA2KQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChpIDwgWk1fT0FMX01BWF9TVEFfU1VQUE9SVCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvL3ByaW50aygiWkRfSU9DVExfR0VUV1BBSUUgLSBzdGEgaW5kZXggPSAlZFxuIiwgaSk7CisgICAgICAgICAgICAgICAgbWVtY3B5KHJlcV93cGFpZS53cGFfaWUsIG1hY3AtPnN0YXdwYWllW2ldLndwYV9pZSwgSUVFRTgwMjExX01BWF9JRV9TSVpFKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmcmVxX3dwYWllLCBzaXplb2Yoc3RydWN0IGllZWU4MDIxMXJlcV93cGFpZSkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVGQVVMVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgICAgICBlcnIgPSAwOworICAgICAgICAgICAgYnJlYWs7CisjaWZkZWYgWk1fRU5BQkxFX0NFTkMKKyAgICAgICAgY2FzZSBaTV9JT0NUTF9DRU5DOgorICAgICAgICAgICAgaWYgKGNvcHlfZnJvbV91c2VyKCZtYWNwLT56ZF93cGFfcmVxLCBpZnItPmlmcl9kYXRhLCBzaXplb2Yoc3RydWN0IGF0aHJfd2xhbl9wYXJhbSkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAidXNiZHJ2OiBjb3B5X2Zyb21fdXNlciBlcnJvclxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FRkFVTFQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHVzYmRydl9jZW5jX2lvY3RsKGRldiwgKHN0cnVjdCB6eWRhc19jZW5jX3BhcmFtICopJm1hY3AtPnpkX3dwYV9yZXEpOworICAgICAgICAgICAgZXJyID0gMDsKKyAgICAgICAgICAgIGJyZWFrOworI2VuZGlmIC8vWk1fRU5BQkxFX0NFTkMKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGVyciA9IC1FT1BOT1RTVVBQOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisKKyAgICByZXR1cm4gZXJyOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvb2FsX2R0LmggYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy9vYWxfZHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODJiOTc3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvb2FsX2R0LmgKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNy0yMDA4IEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisvKiAgTW9kdWxlIE5hbWUgOiBvYWxfZHQuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBBYnN0cmFjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFRoaXMgbW9kdWxlIGNvbnRhaW5zIGRhdGEgdHlwZSBkZWZpbml0aW9uLiAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBOT1RFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFBsYXRmb3JtIGRlcGVuZGVudC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX09BTF9EVF9ICisjZGVmaW5lIF9PQUxfRFRfSAorCisvKiBQbGVhc2UgaW5jbHVkZSBoZWFkZXIgZmlsZXMgZm9yIGJ1ZmZlciB0eXBlIGluIHRoZSBiZWdpbm5pbmcgb2YgdGhpcyBmaWxlICovCisvKiBQbGVhc2UgaW5jbHVkZSBoZWFkZXIgZmlsZXMgZm9yIGRldmljZSB0eXBlIGhlcmUgKi8KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKwordHlwZWRlZiAgICAgdW5zaWduZWQgbG9uZyBsb25nICB1NjRfdDsKK3R5cGVkZWYgICAgIHVuc2lnbmVkIGludCAgICAgICAgdTMyX3Q7Cit0eXBlZGVmICAgICB1bnNpZ25lZCBzaG9ydCAgICAgIHUxNl90OwordHlwZWRlZiAgICAgdW5zaWduZWQgY2hhciAgICAgICB1OF90OwordHlwZWRlZiAgICAgbG9uZyBsb25nICAgICAgICAgICBzNjRfdDsKK3R5cGVkZWYgICAgIGxvbmcgICAgICAgICAgICAgICAgczMyX3Q7Cit0eXBlZGVmICAgICBzaG9ydCAgICAgICAgICAgICAgIHMxNl90OwordHlwZWRlZiAgICAgY2hhciAgICAgICAgICAgICAgICBzOF90OworCisjaWZuZGVmICAgICBUUlVFCisjZGVmaW5lICAgICBUUlVFICAgICAgICAgICAgICAgICgxPT0xKQorI2VuZGlmCisKKyNpZm5kZWYgICAgIEZBTFNFCisjZGVmaW5lICAgICBGQUxTRSAgICAgICAgICAgICAgICgxPT0wKQorI2VuZGlmCisKKyNpZm5kZWYgICAgIE5VTEwKKyNkZWZpbmUgICAgIE5VTEwgICAgICAgICAgICAgICAgMAorI2VuZGlmCisKKy8qIFBsZWFzZSBpbmNsdWRlIGhlYWRlciBmaWxlcyBmb3IgYnVmZmVyIHR5cGUgaW4gdGhlIGJlZ2lubmluZyBvZiB0aGlzIGZpbGUgKi8KK3R5cGVkZWYgICAgIHN0cnVjdCBza19idWZmICAgICAgemJ1Zl90OworCisvKiBQbGVhc2UgaW5jbHVkZSBoZWFkZXIgZmlsZXMgZm9yIGRldmljZSB0eXBlIGluIHRoZSBiZWdpbm5pbmcgb2YgdGhpcyBmaWxlICovCit0eXBlZGVmICAgICBzdHJ1Y3QgbmV0X2RldmljZSAgIHpkZXZfdDsKKworI2VuZGlmIC8qICNpZm5kZWYgX09BTF9EVF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb3R1cy9vYWxfbWFyYy5oIGIvZHJpdmVycy9zdGFnaW5nL290dXMvb2FsX21hcmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDYxMTE2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvb2FsX21hcmMuaApAQCAtMCwwICsxLDEzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNy0yMDA4IEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisvKiAgTW9kdWxlIE5hbWUgOiBvYWxfbWFyYy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBBYnN0cmFjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFRoaXMgbW9kdWxlIGNvbnRhaW5zIHdhcnBwZXIgZGVmaW5pdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBOT1RFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFBsYXRmb3JtIGRlcGVuZGVudC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX09BTF9NQVJDX0gKKyNkZWZpbmUgX09BTF9NQVJDX0gKKworI2luY2x1ZGUgIm9hbF9kdC5oIgorI2luY2x1ZGUgInVzYmRydi5oIgorCisjZGVmaW5lIFpNX09TX0xJTlVYX0ZVTkMKKworLyoqKioqIENyaXRpY2FsIHNlY3Rpb24gKioqKiovCisvKiBEZWNsYXJlIGZvciBjcml0aWNhbCBzZWN0aW9uICovCisjaWZuZGVmIFpNX0hBTFBMVVNfTE9DSworI2RlZmluZSB6bXdfZ2V0X3dsYW5fZGV2KGRldikgICAgc3RydWN0IHpzV2xhbkRldiAqd2QgPSAoc3RydWN0IHpzV2xhbkRldiopICgoKChzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUqKWRldi0+cHJpdiktPndkKSkKKworI2RlZmluZSB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpIHVuc2lnbmVkIGxvbmcgaXJxRmxhZzsKKworLyogRW50ZXIgY3JpdGljYWwgc2VjdGlvbiAqLworI2RlZmluZSB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpIFwKKyAgICAgICAgc3Bpbl9sb2NrX2lycXNhdmUoJigoKHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqKShkZXYtPnByaXYpKS0+Y3NfbG9jayksIGlycUZsYWcpOworCisvKiBsZWF2ZSBjcml0aWNhbCBzZWN0aW9uICovCisjZGVmaW5lIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldikgXAorICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCYoKChzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKikoZGV2LT5wcml2KSktPmNzX2xvY2spLCBpcnFGbGFnKTsKKyNlbHNlCisjZGVmaW5lIHptd19nZXRfd2xhbl9kZXYoZGV2KSAgICBzdHJ1Y3QgenNXbGFuRGV2ICp3ZCA9IHpmd0dldFdsYW5EZXYoZGV2KTsKKworLyogRGVjbGFyZSBmb3IgY3JpdGljYWwgc2VjdGlvbiAqLworI2RlZmluZSB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpCisKKy8qIEVudGVyIGNyaXRpY2FsIHNlY3Rpb24gKi8KKyNkZWZpbmUgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KSBcCisgICAgICAgIHpmd0VudGVyQ3JpdGljYWxTZWN0aW9uKGRldik7CisKKy8qIGxlYXZlIGNyaXRpY2FsIHNlY3Rpb24gKi8KKyNkZWZpbmUgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KSBcCisgICAgICAgIHpmd0xlYXZlQ3JpdGljYWxTZWN0aW9uKGRldik7CisjZW5kaWYKKworLyoqKioqIEJ5dGUgb3JkZXIgY29udmVydGluZyAqKioqKi8KKyNpZmRlZiBaTV9DT05GSUdfQklHX0VORElBTgorI2RlZmluZSB6bXdfY3B1X3RvX2xlMzIodikgICAgKCgodiAmIDB4ZmYwMDAwMDApID4+IDI0KSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHYgJiAweDAwZmYwMDAwKSA+PiA4KSAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh2ICYgMHgwMDAwZmYwMCkgPDwgOCkgIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodiAmIDB4MDAwMDAwZmYpIDw8IDI0KSkKKworI2RlZmluZSB6bXdfbGUzMl90b19jcHUodikgICAgKCgodiAmIDB4ZmYwMDAwMDApID4+IDI0KSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHYgJiAweDAwZmYwMDAwKSA+PiA4KSAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh2ICYgMHgwMDAwZmYwMCkgPDwgOCkgIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodiAmIDB4MDAwMDAwZmYpIDw8IDI0KSkKKworI2RlZmluZSB6bXdfY3B1X3RvX2xlMTYodikgICAgKCgodiAmIDB4ZmYwMCkgPj4gOCkgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh2ICYgMHgwMGZmKSA8PCA4KSkKKworI2RlZmluZSB6bXdfbGUxNl90b19jcHUodikgICAgKCgodiAmIDB4ZmYwMCkgPj4gOCkgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh2ICYgMHgwMGZmKSA8PCA4KSkKKyNlbHNlCisjZGVmaW5lIHptd19jcHVfdG9fbGUzMih2KSAgICAodikKKyNkZWZpbmUgem13X2xlMzJfdG9fY3B1KHYpICAgICh2KQorI2RlZmluZSB6bXdfY3B1X3RvX2xlMTYodikgICAgKHYpCisjZGVmaW5lIHptd19sZTE2X3RvX2NwdSh2KSAgICAodikKKyNlbmRpZgorCisvKioqKiogQnVmZmVyIGFjY2VzcyAqKioqKi8KKy8qIENhbGxlZCB0byByZWFkL3dyaXRlIGJ1ZmZlciAqLworI2lmbmRlZiBaTV9IQUxQTFVTX0xPQ0sKKworI2RlZmluZSB6bXdfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQpICoodThfdCopKCh1OF90KilidWYtPmRhdGErb2Zmc2V0KQorI2RlZmluZSB6bXdfYnVmX3JlYWRoKGRldiwgYnVmLCBvZmZzZXQpIHptd19jcHVfdG9fbGUxNigqKHUxNl90KikoKHU4X3QqKWJ1Zi0+ZGF0YStvZmZzZXQpKQorI2RlZmluZSB6bXdfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0LCB2YWx1ZSkgKih1OF90KikoKHU4X3QqKWJ1Zi0+ZGF0YStvZmZzZXQpID0gdmFsdWUKKyNkZWZpbmUgem13X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCwgdmFsdWUpICoodTE2X3QqKSgodThfdCopYnVmLT5kYXRhK29mZnNldCkgPSB6bXdfY3B1X3RvX2xlMTYodmFsdWUpCisjZGVmaW5lIHptd19idWZfZ2V0X2J1ZmZlcihkZXYsIGJ1ZikgKHU4X3QqKShidWYtPmRhdGEpCisKKyNlbHNlCisKKyNkZWZpbmUgem13X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KSB6ZndCdWZSZWFkQnl0ZShkZXYsIGJ1Ziwgb2Zmc2V0KQorI2RlZmluZSB6bXdfYnVmX3JlYWRoKGRldiwgYnVmLCBvZmZzZXQpIHpmd0J1ZlJlYWRIYWxmV29yZChkZXYsIGJ1Ziwgb2Zmc2V0KQorI2RlZmluZSB6bXdfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0LCB2YWx1ZSkgemZ3QnVmV3JpdGVCeXRlKGRldiwgYnVmLCBvZmZzZXQsIHZhbHVlKQorI2RlZmluZSB6bXdfYnVmX3dyaXRlaChkZXYsIGJ1Ziwgb2Zmc2V0LCB2YWx1ZSkgemZ3QnVmV3JpdGVIYWxmV29yZChkZXYsIGJ1Ziwgb2Zmc2V0LCB2YWx1ZSkKKyNkZWZpbmUgem13X2J1Zl9nZXRfYnVmZmVyKGRldiwgYnVmKSB6ZndHZXRCdWZmZXIoZGV2LCBidWYpCisKKyNlbmRpZgorCisvKioqKiogRGVidWcgbWVzc2FnZSAqKioqKi8KKyNpZiAwCisjZGVmaW5lIHptX2RlYnVnX21zZzAobXNnKSBwcmludGsoIiVzOiVzXG4iLCBfX2Z1bmNfXywgbXNnKTsKKyNkZWZpbmUgem1fZGVidWdfbXNnMShtc2csIHZhbCkgcHJpbnRrKCIlczolcyVsZFxuIiwgX19mdW5jX18sIFwKKyAgICAgICAgbXNnLCAodTMyX3QpdmFsKTsKKyNkZWZpbmUgem1fZGVidWdfbXNnMihtc2csIHZhbCkgcHJpbnRrKCIlczolcyVseGhcbiIsIF9fZnVuY19fLCBcCisgICAgICAgIG1zZywgKHUzMl90KXZhbCk7CisjZGVmaW5lIHptX2RlYnVnX21zZ19zKG1zZywgdmFsKSBwcmludGsoIiVzOiVzJXNcbiIsIF9fZnVuY19fLCBcCisgICAgICAgIG1zZywgdmFsKTsKKyNkZWZpbmUgem1fZGVidWdfbXNnX3AobXNnLCB2YWwxLCB2YWwyKSBwcmludGsoIiVzOiVzJTAxbGQuJTAybGRcbiIsIF9fZnVuY19fLCBcCisgICAgICAgIG1zZywgKHZhbDEvdmFsMiksICgoKHZhbDEqMTAwKS92YWwyKSUxMDApKTsKKyNkZWZpbmUgem1fZGJnKFMpIHByaW50ayBTCisjZWxzZQorI2RlZmluZSB6bV9kZWJ1Z19tc2cwKG1zZykKKyNkZWZpbmUgem1fZGVidWdfbXNnMShtc2csIHZhbCkKKyNkZWZpbmUgem1fZGVidWdfbXNnMihtc2csIHZhbCkKKyNkZWZpbmUgem1fZGVidWdfbXNnX3MobXNnLCB2YWwpCisjZGVmaW5lIHptX2RlYnVnX21zZ19wKG1zZywgdmFsMSwgdmFsMikKKyNkZWZpbmUgem1fZGJnKFMpCisjZW5kaWYKKworI2RlZmluZSB6bV9hc3NlcnQoZXhwcikgaWYoIShleHByKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcHJpbnRrKCAiQXRoZW9ycyBBc3NlcnRpb24gZmFpbGVkISAlcywlcywlcyxsaW5lPSVkXG4iLCAgIFwKKyAgICAgICAgI2V4cHIsX19GSUxFX18sX19mdW5jX18sX19MSU5FX18pOyAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfQorCisjZGVmaW5lIERiZ1ByaW50IHByaW50aworCisjZW5kaWYgLyogI2lmbmRlZiBfT0FMX01BUkNfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvdXNiZHJ2LmMgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy91c2JkcnYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZmUwNzA3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvdXNiZHJ2LmMKQEAgLTAsMCArMSwxMTQ4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggQXRoZXJvcyBDb21tdW5pY2F0aW9ucyBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKy8qICBNb2R1bGUgTmFtZSA6IHVzYmRydi5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEFic3RyYWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICBUaGlzIG1vZHVsZSBjb250YWlucyBuZXR3b3JrIGludGVyZmFjZSB1cC9kb3duIHJlbGF0ZWQgZnVuY3Rpb25zLiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE5PVEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICBQbGF0Zm9ybSBkZXBlbmRlbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogc3JjL3VzYmRydi5jICovCisKKyNkZWZpbmUgWk1fUElCU1NfTU9ERSAgIDAKKyNkZWZpbmUgWk1fQVBfTU9ERSAgICAgIDAKKyNkZWZpbmUgWk1fQ0hBTk5FTCAgICAgIDExCisjZGVmaW5lIFpNX1dFUF9NT01FICAgICAwCisjZGVmaW5lIFpNX1NIQVJFX0FVVEggICAwCisjZGVmaW5lIFpNX0RJU0FCTEVfWE1JVCAwCisKKyNpbmNsdWRlICJ1c2JkcnYuaCIKKyNpbmNsdWRlICJvYWxfZHQuaCIKKyNpbmNsdWRlICI4MDIxMWNvcmUvcHViX3pmaS5oIgorCisjaW5jbHVkZSAibGludXgvbmV0bGluay5oIgorI2luY2x1ZGUgImxpbnV4L3J0bmV0bGluay5oIgorCisjaWYgV0lSRUxFU1NfRVhUID4gMTIKKyNpbmNsdWRlIDxuZXQvaXdfaGFuZGxlci5oPgorI2VuZGlmCisKKyNpZmRlZiBaTV9IT1NUQVBEX1NVUFBPUlQKKyNpbmNsdWRlICJhdGhyX2NvbW1vbi5oIgorI2VuZGlmCisKK2V4dGVybiB2b2lkIHpmRHVtcERlc2NyaXB0b3IoemRldl90KiBkZXYsIHUxNl90IHR5cGUpOworLy9leHRlcm4gdm9pZCB6ZmlXbGFuUXVlcnlNYWNBZGRyZXNzKHpkZXZfdCogZGV2LCB1OF90KiBhZGRyKTsKKworLy8gSVNSIGhhbmRsZXIKK2lycXJldHVybl90IHVzYmRydl9pbnRyKGludCwgdm9pZCAqLCBzdHJ1Y3QgcHRfcmVncyAqKTsKKworLy8gTmV0d29yayBEZXZpY2UgaW50ZXJmYWNlIHJlbGF0ZWQgZnVuY3Rpb24KK2ludCB1c2JkcnZfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqKTsKK2ludCB1c2JkcnZfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKik7CitpbnQgdXNiZHJ2X2NoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKiwgaW50KTsKK2ludCB1c2JkcnZfc2V0X21hYyhzdHJ1Y3QgbmV0X2RldmljZSAqLCB2b2lkICopOworaW50IHVzYmRydl94bWl0X2ZyYW1lKHN0cnVjdCBza19idWZmICosIHN0cnVjdCBuZXRfZGV2aWNlICopOwordm9pZCB1c2JkcnZfc2V0X211bHRpKHN0cnVjdCBuZXRfZGV2aWNlICopOworc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnVzYmRydl9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKik7CisKKy8vd2lyZWxlc3MgZXh0ZW5zaW9uIGhlbHBlciBmdW5jdGlvbnMKK2ludCB1c2JkcnZfaW9jdGxfc2V0ZXNzaWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3BvaW50ICplcnEpOworaW50IHVzYmRydl9pb2N0bF9nZXRlc3NpZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcG9pbnQgKmVycSk7CitpbnQgdXNiZHJ2X2lvY3RsX3NldHJ0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcGFyYW0gKnJycSk7CisvKiBXaXJlbGVzcyBFeHRlbnNpb24gSGFuZGxlciBmdW5jdGlvbnMgKi8KK2ludCB1c2JkcnZ3ZXh0X2dpd21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyogaW5mbywKKyAgICAgICAgX191MzIgKm1vZGUsIGNoYXIgKmV4dHJhKTsKK2ludCB6ZkxueFByaXZhdGVJb2N0bChzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AsIHN0cnVjdCB6ZGFwX2lvY3RsICp6ZHJlcSk7CisKK3ZvaWQgemZMbngxMG1zVGltZXIoc3RydWN0IG5ldF9kZXZpY2UqIGRldik7CitpbnQgemZVbnJlZ2lzdGVyV2RzRGV2KHN0cnVjdCBuZXRfZGV2aWNlKiBwYXJlbnREZXYsIHUxNl90IHdkc0lkKTsKK2ludCB6ZlJlZ2lzdGVyV2RzRGV2KHN0cnVjdCBuZXRfZGV2aWNlKiBwYXJlbnREZXYsIHUxNl90IHdkc0lkKTsKK2ludCB6Zldkc09wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitpbnQgemZXZHNDbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK2ludCB6ZkxueFZhcE9wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitpbnQgemZMbnhWYXBDbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK2ludCB6ZkxueFZhcFhtaXRGcmFtZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK2ludCB6ZkxueFJlZ2lzdGVyVmFwRGV2KHN0cnVjdCBuZXRfZGV2aWNlKiBwYXJlbnREZXYsIHUxNl90IHZhcElkKTsKK2ludCB1c2JkcnZfd3BhX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBhdGhyX3dsYW5fcGFyYW0gKnpkcGFybSk7CitleHRlcm4gdTE2X3QgemZMbnhHZXRWYXBJZCh6ZGV2X3QqIGRldik7CitleHRlcm4gdTE2X3QgemZMbnhDaGVja1R4QnVmZmVyQ250KHpkZXZfdCAqZGV2KTsKK2V4dGVybiBVc2JUeFFfdCAqemZMbnhHZXRVc2JUeEJ1ZmZlcih6ZGV2X3QgKmRldik7CisKK2V4dGVybiB1MTZfdCB6ZkxueEF1dGhOb3RpZnkoemRldl90KiBkZXYsIHUxNl90KiBtYWNBZGRyKTsKK2V4dGVybiB1MTZfdCB6ZkxueEFzb2NOb3RpZnkoemRldl90KiBkZXYsIHUxNl90KiBtYWNBZGRyLCB1OF90KiBib2R5LCB1MTZfdCBib2R5U2l6ZSwgdTE2X3QgcG9ydCk7CitleHRlcm4gdTE2X3QgemZMbnhEaXNBc29jTm90aWZ5KHpkZXZfdCogZGV2LCB1OF90KiBtYWNBZGRyLCB1MTZfdCBwb3J0KTsKK2V4dGVybiB1MTZfdCB6ZkxueEFwQ29ubmVjdE5vdGlmeSh6ZGV2X3QqIGRldiwgdThfdCogbWFjQWRkciwgdTE2X3QgcG9ydCk7CitleHRlcm4gdm9pZCB6ZkxueENvbm5lY3ROb3RpZnkoemRldl90KiBkZXYsIHUxNl90IHN0YXR1cywgdTE2X3QqIGJzc2lkKTsKK2V4dGVybiB2b2lkIHpmTG54U2Nhbk5vdGlmeSh6ZGV2X3QqIGRldiwgc3RydWN0IHpzU2NhblJlc3VsdCogcmVzdWx0KTsKK2V4dGVybiB2b2lkIHpmTG54U3RhdGlzdGljc05vdGlmeSh6ZGV2X3QqIGRldiwgc3RydWN0IHpzU3Rhc3RpY3MqIHJlc3VsdCk7CitleHRlcm4gdm9pZCB6ZkxueE1pY0ZhaWx1cmVOb3RpZnkoemRldl90KiBkZXYsIHUxNl90KiBhZGRyLCB1MTZfdCBzdGF0dXMpOworZXh0ZXJuIHZvaWQgemZMbnhBcE1pY0ZhaWx1cmVOb3RpZnkoemRldl90KiBkZXYsIHU4X3QqIGFkZHIsIHpidWZfdCogYnVmKTsKK2V4dGVybiB2b2lkIHpmTG54SWJzc1BhcnRuZXJOb3RpZnkoemRldl90KiBkZXYsIHUxNl90IHN0YXR1cywgc3RydWN0IHpzUGFydG5lck5vdGlmeUV2ZW50ICpldmVudCk7CitleHRlcm4gdm9pZCB6ZkxueE1hY0FkZHJlc3NOb3RpZnkoemRldl90KiBkZXYsIHU4X3QqIGFkZHIpOworZXh0ZXJuIHZvaWQgemZMbnhTZW5kQ29tcGxldGVJbmRpY2F0aW9uKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1Zik7CitleHRlcm4gdm9pZCB6ZkxueFJlY3ZFdGgoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCBwb3J0KTsKK2V4dGVybiB2b2lkIHpmTG54UmVzdG9yZUJ1ZkRhdGEoemRldl90KiBkZXYsIHpidWZfdCogYnVmKTsKKyNpZmRlZiBaTV9FTkFCTEVfQ0VOQworZXh0ZXJuIHUxNl90IHpmTG54Q2VuY0Fzb2NOb3RpZnkoemRldl90KiBkZXYsIHUxNl90KiBtYWNBZGRyLCB1OF90KiBib2R5LCB1MTZfdCBib2R5U2l6ZSwgdTE2X3QgcG9ydCk7CisjZW5kaWYgLy9aTV9FTkFCTEVfQ0VOQworZXh0ZXJuIHZvaWQgemZMbnhXYXRjaERvZ05vdGlmeSh6ZGV2X3QqIGRldik7CitleHRlcm4gdm9pZCB6ZkxueFJlY3Y4MDIxMSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHN0cnVjdCB6c0FkZGl0aW9uSW5mbyogYWRkSW5mbyk7CitleHRlcm4gdThfdCB6ZkxueENyZWF0ZVRocmVhZCh6ZGV2X3QgKmRldik7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogICAgICAgICAgICAgICAgICAgICAgICBQIFUgQiBMIEkgQyAgIEQgQSBUIEEKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCisKKy8qIERlZmluaXRpb24gb2YgV2lyZWxlc3MgRXh0ZW5zaW9uICovCisKKyNpZiBXSVJFTEVTU19FWFQgPiAxMgorI2luY2x1ZGUgPG5ldC9pd19oYW5kbGVyLmg+CisjZW5kaWYKKy8vd2lyZWxlc3MgZXh0ZW5zaW9uIGhlbHBlciBmdW5jdGlvbnMKK2V4dGVybiBpbnQgdXNiZHJ2X2lvY3RsX3NldGVzc2lkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19wb2ludCAqZXJxKTsKK2V4dGVybiBpbnQgdXNiZHJ2X2lvY3RsX3NldHJ0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcGFyYW0gKnJycSk7CisvKiBXaXJlbGVzcyBFeHRlbnNpb24gSGFuZGxlciBmdW5jdGlvbnMgKi8KK2V4dGVybiBpbnQgdXNiZHJ2d2V4dF9naXduYW1lKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisgICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycSwgY2hhciAqZXh0cmEpOworZXh0ZXJuIGludCB1c2JkcnZ3ZXh0X3Npd2ZyZXEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKyAgICAgICAgc3RydWN0IGl3X2ZyZXEgKmZyZXEsIGNoYXIgKmV4dHJhKTsKK2V4dGVybiBpbnQgdXNiZHJ2d2V4dF9naXdmcmVxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisgICAgICAgIHN0cnVjdCBpd19mcmVxICpmcmVxLCBjaGFyICpleHRyYSk7CitleHRlcm4gaW50IHVzYmRydndleHRfc2l3bW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorICAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnEsIGNoYXIgKmV4dHJhKTsKK2V4dGVybiBpbnQgdXNiZHJ2d2V4dF9naXdtb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisgICAgICAgIF9fdTMyICptb2RlLCBjaGFyICpleHRyYSk7CitleHRlcm4gaW50IHVzYmRydndleHRfc2l3c2VucyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQlzdHJ1Y3QgaXdfcGFyYW0gKnNlbnMsIGNoYXIgKmV4dHJhKTsKK2V4dGVybiBpbnQgdXNiZHJ2d2V4dF9naXdzZW5zKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCXN0cnVjdCBpd19wYXJhbSAqc2VucywgY2hhciAqZXh0cmEpOworZXh0ZXJuIGludCB1c2JkcnZ3ZXh0X2dpd3JhbmdlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisgICAgICAgIHN0cnVjdCBpd19wb2ludCAqZGF0YSwgY2hhciAqZXh0cmEpOworZXh0ZXJuIGludCB1c2JkcnZ3ZXh0X3Npd2FwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisgICAgICAgIHN0cnVjdCBzb2NrYWRkciAqTWFjQWRkciwgY2hhciAqZXh0cmEpOworZXh0ZXJuIGludCB1c2JkcnZ3ZXh0X2dpd2FwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisgICAgICAgIHN0cnVjdCBzb2NrYWRkciAqTWFjQWRkciwgY2hhciAqZXh0cmEpOworZXh0ZXJuIGludCB1c2JkcnZ3ZXh0X2l3YXBsaXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCXN0cnVjdCBpd19wb2ludCAqZGF0YSwgY2hhciAqZXh0cmEpOworZXh0ZXJuIGludCB1c2JkcnZ3ZXh0X3Npd3NjYW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKyAgICAgICAgc3RydWN0IGl3X3BvaW50ICpkYXRhLCBjaGFyICpleHRyYSk7CitleHRlcm4gaW50IHVzYmRydndleHRfZ2l3c2NhbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorICAgICAgICBzdHJ1Y3QgaXdfcG9pbnQgKmRhdGEsIGNoYXIgKmV4dHJhKTsKK2V4dGVybiBpbnQgdXNiZHJ2d2V4dF9zaXdlc3NpZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorICAgICAgICBzdHJ1Y3QgaXdfcG9pbnQgKmVzc2lkLCBjaGFyICpleHRyYSk7CitleHRlcm4gaW50IHVzYmRydndleHRfZ2l3ZXNzaWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKyAgICAgICAgc3RydWN0IGl3X3BvaW50ICplc3NpZCwgY2hhciAqZXh0cmEpOworZXh0ZXJuIGludCB1c2JkcnZ3ZXh0X3Npd25pY2tuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJICAgIHN0cnVjdCBpd19wb2ludCAqZGF0YSwgY2hhciAqbmlja25hbWUpOworZXh0ZXJuIGludCB1c2JkcnZ3ZXh0X2dpd25pY2tuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJICAgIHN0cnVjdCBpd19wb2ludCAqZGF0YSwgY2hhciAqbmlja25hbWUpOworZXh0ZXJuIGludCB1c2JkcnZ3ZXh0X3Npd3JhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKyAgICAgICAgc3RydWN0IGl3X3BhcmFtICpmcnEsIGNoYXIgKmV4dHJhKTsKK2V4dGVybiBpbnQgdXNiZHJ2d2V4dF9naXdyYXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisgICAgICAgIHN0cnVjdCBpd19wYXJhbSAqZnJxLCBjaGFyICpleHRyYSk7CitleHRlcm4gaW50IHVzYmRydndleHRfc2l3cnRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisgICAgICAgIHN0cnVjdCBpd19wYXJhbSAqcnRzLCBjaGFyICpleHRyYSk7CitleHRlcm4gaW50IHVzYmRydndleHRfZ2l3cnRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisgICAgICAgIHN0cnVjdCBpd19wYXJhbSAqcnRzLCBjaGFyICpleHRyYSk7CitleHRlcm4gaW50IHVzYmRydndleHRfc2l3ZnJhZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorICAgICAgICBzdHJ1Y3QgaXdfcGFyYW0gKmZyYWcsIGNoYXIgKmV4dHJhKTsKK2V4dGVybiBpbnQgdXNiZHJ2d2V4dF9naXdmcmFnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisgICAgICAgIHN0cnVjdCBpd19wYXJhbSAqZnJhZywgY2hhciAqZXh0cmEpOworZXh0ZXJuIGludCB1c2JkcnZ3ZXh0X3Npd3R4cG93KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCXN0cnVjdCBpd19wYXJhbSAqcnJxLCBjaGFyICpleHRyYSk7CitleHRlcm4gaW50IHVzYmRydndleHRfZ2l3dHhwb3coc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJc3RydWN0IGl3X3BhcmFtICpycnEsIGNoYXIgKmV4dHJhKTsKK2V4dGVybiBpbnQgdXNiZHJ2d2V4dF9zaXdyZXRyeShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCSAgICBzdHJ1Y3QgaXdfcGFyYW0gKnJycSwgY2hhciAqZXh0cmEpOworZXh0ZXJuIGludCB1c2JkcnZ3ZXh0X2dpd3JldHJ5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJICAgIHN0cnVjdCBpd19wYXJhbSAqcnJxLCBjaGFyICpleHRyYSk7CitleHRlcm4gaW50IHVzYmRydndleHRfc2l3ZW5jb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisgICAgICAgIHN0cnVjdCBpd19wb2ludCAqZXJxLCBjaGFyICprZXkpOworZXh0ZXJuIGludCB1c2JkcnZ3ZXh0X2dpd2VuY29kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorICAgICAgICBzdHJ1Y3QgaXdfcG9pbnQgKmVycSwgY2hhciAqa2V5KTsKK2V4dGVybiBpbnQgdXNiZHJ2d2V4dF9zaXdwb3dlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorICAgICAgICBzdHJ1Y3QgaXdfcGFyYW0gKmZycSwgY2hhciAqZXh0cmEpOworZXh0ZXJuIGludCB1c2JkcnZ3ZXh0X2dpd3Bvd2VyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisgICAgICAgIHN0cnVjdCBpd19wYXJhbSAqZnJxLCBjaGFyICpleHRyYSk7CitleHRlcm4gaW50IHVzYmRydl9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKmlmciwgaW50IGNtZCk7CisvKgorICogU3RydWN0dXJlcyB0byBleHBvcnQgdGhlIFdpcmVsZXNzIEhhbmRsZXJzCisgKi8KKworc3RydWN0IGl3X3ByaXZfYXJncyB1c2JkcnZfcHJpdmF0ZV9hcmdzW10gPSB7CisvLyAgICB7IFNJT0NJV0ZJUlNUUFJJViArIDB4MCwgMCwgMCwgImxpc3RfYnNzIiB9LAorLy8gICAgeyBTSU9DSVdGSVJTVFBSSVYgKyAweDEsIDAsIDAsICJjYXJkX3Jlc2V0IiB9LAorICAgIHsgU0lPQ0lXRklSU1RQUklWICsgMHgyLCBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwgMCwgInNldF9hdXRoIiB9LCAgLyogMCAtIG9wZW4sIDEgLSBzaGFyZWQga2V5ICovCisgICAgeyBTSU9DSVdGSVJTVFBSSVYgKyAweDMsIDAsIElXX1BSSVZfVFlQRV9DSEFSIHwgMTIsICJnZXRfYXV0aCIgfSwKKy8vICAgIHsgU0lPQ0lXRklSU1RQUklWICsgMHg0LCBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwgMCwgInNldF9wcmVhbWJsZSIgfSwgIC8qIDAgLSBsb25nLCAxIC0gc2hvcnQgKi8KKy8vICAgIHsgU0lPQ0lXRklSU1RQUklWICsgMHg1LCAwLCBJV19QUklWX1RZUEVfQ0hBUiB8IDYsICJnZXRfcHJlYW1ibGUiIH0sCisvLyAgICB7IFNJT0NJV0ZJUlNUUFJJViArIDB4NiwgMCwgMCwgImNudCIgfSwKKy8vICAgIHsgU0lPQ0lXRklSU1RQUklWICsgMHg3LCAwLCAwLCAicmVncyIgfSwKKy8vICAgIHsgU0lPQ0lXRklSU1RQUklWICsgMHg4LCAwLCAwLCAicHJvYmUiIH0sCisvLyAgICB7IFNJT0NJV0ZJUlNUUFJJViArIDB4OSwgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsIDAsICJkYmdfZmxhZyIgfSwKKy8vICAgIHsgU0lPQ0lXRklSU1RQUklWICsgMHhBLCBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwgMCwgImNvbm5lY3QiIH0sCisvLyAgICB7IFNJT0NJV0ZJUlNUUFJJViArIDB4QiwgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsIDAsICJzZXRfbWFjX21vZGUiIH0sCisvLyAgICB7IFNJT0NJV0ZJUlNUUFJJViArIDB4QywgMCwgSVdfUFJJVl9UWVBFX0NIQVIgfCAxMiwgImdldF9tYWNfbW9kZSIgfSwKK307CisKKyNpZiBXSVJFTEVTU19FWFQgPiAxMgorc3RhdGljIGl3X2hhbmRsZXIgdXNiZHJ2d2V4dF9oYW5kbGVyW10gPSB7CisgICAgKGl3X2hhbmRsZXIpIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU0lPQ1NJV0NPTU1JVCAqLworICAgIChpd19oYW5kbGVyKSB1c2JkcnZ3ZXh0X2dpd25hbWUsICAgICAgICAgICAgICAgIC8qIFNJT0NHSVdOQU1FICovCisgICAgKGl3X2hhbmRsZXIpIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU0lPQ1NJV05XSUQgKi8KKyAgICAoaXdfaGFuZGxlcikgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTSU9DR0lXTldJRCAqLworICAgIChpd19oYW5kbGVyKSB1c2JkcnZ3ZXh0X3Npd2ZyZXEsICAgICAgICAgICAgICAgIC8qIFNJT0NTSVdGUkVRICovCisgICAgKGl3X2hhbmRsZXIpIHVzYmRydndleHRfZ2l3ZnJlcSwgICAgICAgICAgICAgICAgLyogU0lPQ0dJV0ZSRVEgKi8KKyAgICAoaXdfaGFuZGxlcikgdXNiZHJ2d2V4dF9zaXdtb2RlLCAgICAgICAgICAgICAgICAvKiBTSU9DU0lXTU9ERSAqLworICAgIChpd19oYW5kbGVyKSB1c2JkcnZ3ZXh0X2dpd21vZGUsICAgICAgICAgICAgICAgIC8qIFNJT0NHSVdNT0RFICovCisgICAgKGl3X2hhbmRsZXIpIHVzYmRydndleHRfc2l3c2VucywgICAgICAgICAgICAgICAgLyogU0lPQ1NJV1NFTlMgKi8KKyAgICAoaXdfaGFuZGxlcikgdXNiZHJ2d2V4dF9naXdzZW5zLCAgICAgICAgICAgICAgICAvKiBTSU9DR0lXU0VOUyAqLworICAgIChpd19oYW5kbGVyKSBOVUxMLCAvKiBub3QgdXNlZCAqLyAgICAgICAgICAgICAgIC8qIFNJT0NTSVdSQU5HRSAqLworICAgIChpd19oYW5kbGVyKSB1c2JkcnZ3ZXh0X2dpd3JhbmdlLCAgICAgICAgICAgICAgIC8qIFNJT0NHSVdSQU5HRSAqLworICAgIChpd19oYW5kbGVyKSBOVUxMLCAvKiBub3QgdXNlZCAqLyAgICAgICAgICAgICAgIC8qIFNJT0NTSVdQUklWICovCisgICAgKGl3X2hhbmRsZXIpIE5VTEwsIC8qIGtlcm5lbCBjb2RlICovICAgICAgICAgICAgLyogU0lPQ0dJV1BSSVYgKi8KKyAgICAoaXdfaGFuZGxlcikgTlVMTCwgLyogbm90IHVzZWQgKi8gICAgICAgICAgICAgICAvKiBTSU9DU0lXU1RBVFMgKi8KKyAgICAoaXdfaGFuZGxlcikgTlVMTCwgLyoga2VybmVsIGNvZGUgKi8gICAgICAgICAgICAvKiBTSU9DR0lXU1RBVFMgKi8KKyAgICAoaXdfaGFuZGxlcikgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTSU9DU0lXU1BZICovCisgICAgKGl3X2hhbmRsZXIpIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU0lPQ0dJV1NQWSAqLworICAgIChpd19oYW5kbGVyKSBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIC0tIGhvbGUgLS0gKi8KKyAgICAoaXdfaGFuZGxlcikgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAtLSBob2xlIC0tICovCisgICAgKGl3X2hhbmRsZXIpIHVzYmRydndleHRfc2l3YXAsICAgICAgICAgICAgICAgICAgLyogU0lPQ1NJV0FQICovCisgICAgKGl3X2hhbmRsZXIpIHVzYmRydndleHRfZ2l3YXAsICAgICAgICAgICAgICAgICAgLyogU0lPQ0dJV0FQICovCisgICAgKGl3X2hhbmRsZXIpIE5VTEwsICAgICAgICAgICAgICAvKiAtLSBob2xlIC0tICovCisgICAgKGl3X2hhbmRsZXIpIHVzYmRydndleHRfaXdhcGxpc3QsICAgICAgICAgICAgICAgLyogU0lPQ0dJV0FQTElTVCAqLworI2lmIFdJUkVMRVNTX0VYVCA+IDEzCisgICAgKGl3X2hhbmRsZXIpIHVzYmRydndleHRfc2l3c2NhbiwgICAgICAgICAgICAgICAgLyogU0lPQ1NJV1NDQU4gKi8KKyAgICAoaXdfaGFuZGxlcikgdXNiZHJ2d2V4dF9naXdzY2FuLCAgICAgICAgICAgICAgICAvKiBTSU9DR0lXU0NBTiAqLworI2Vsc2UgLyogV0lSRUxFU1NfRVhUID4gMTMgKi8KKyAgICAoaXdfaGFuZGxlcikgTlVMTCwgLyogbnVsbCAqLyAgICAgICAgICAgICAgICAgICAvKiBTSU9DU0lXU0NBTiAqLworICAgIChpd19oYW5kbGVyKSBOVUxMLCAvKiBudWxsICovICAgICAgICAgICAgICAgICAgIC8qIFNJT0NHSVdTQ0FOICovCisjZW5kaWYgLyogV0lSRUxFU1NfRVhUID4gMTMgKi8KKyAgICAoaXdfaGFuZGxlcikgdXNiZHJ2d2V4dF9zaXdlc3NpZCwgICAgICAgICAgICAgICAvKiBTSU9DU0lXRVNTSUQgKi8KKyAgICAoaXdfaGFuZGxlcikgdXNiZHJ2d2V4dF9naXdlc3NpZCwgICAgICAgICAgICAgICAvKiBTSU9DR0lXRVNTSUQgKi8KKworICAgIChpd19oYW5kbGVyKSB1c2JkcnZ3ZXh0X3Npd25pY2tuLCAgICAgICAgICAgICAgIC8qIFNJT0NTSVdOSUNLTiAqLworICAgIChpd19oYW5kbGVyKSB1c2JkcnZ3ZXh0X2dpd25pY2tuLCAgICAgICAgICAgICAgIC8qIFNJT0NHSVdOSUNLTiAqLworICAgIChpd19oYW5kbGVyKSBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIC0tIGhvbGUgLS0gKi8KKyAgICAoaXdfaGFuZGxlcikgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAtLSBob2xlIC0tICovCisgICAgKGl3X2hhbmRsZXIpIHVzYmRydndleHRfc2l3cmF0ZSwgICAgICAgICAgICAgICAgLyogU0lPQ1NJV1JBVEUgKi8KKyAgICAoaXdfaGFuZGxlcikgdXNiZHJ2d2V4dF9naXdyYXRlLCAgICAgICAgICAgICAgICAvKiBTSU9DR0lXUkFURSAqLworICAgIChpd19oYW5kbGVyKSB1c2JkcnZ3ZXh0X3Npd3J0cywgICAgICAgICAgICAgICAgIC8qIFNJT0NTSVdSVFMgKi8KKyAgICAoaXdfaGFuZGxlcikgdXNiZHJ2d2V4dF9naXdydHMsICAgICAgICAgICAgICAgICAvKiBTSU9DR0lXUlRTICovCisgICAgKGl3X2hhbmRsZXIpIHVzYmRydndleHRfc2l3ZnJhZywgICAgICAgICAgICAgICAgLyogU0lPQ1NJV0ZSQUcgKi8KKyAgICAoaXdfaGFuZGxlcikgdXNiZHJ2d2V4dF9naXdmcmFnLCAgICAgICAgICAgICAgICAvKiBTSU9DR0lXRlJBRyAqLworICAgIChpd19oYW5kbGVyKSB1c2JkcnZ3ZXh0X3Npd3R4cG93LCAgICAgICAgICAgICAgIC8qIFNJT0NTSVdUWFBPVyAqLworICAgIChpd19oYW5kbGVyKSB1c2JkcnZ3ZXh0X2dpd3R4cG93LCAgICAgICAgICAgICAgIC8qIFNJT0NHSVdUWFBPVyAqLworICAgIChpd19oYW5kbGVyKSB1c2JkcnZ3ZXh0X3Npd3JldHJ5LCAgICAgICAgICAgICAgIC8qIFNJT0NTSVdSRVRSWSAqLworICAgIChpd19oYW5kbGVyKSB1c2JkcnZ3ZXh0X2dpd3JldHJ5LCAgICAgICAgICAgICAgIC8qIFNJT0NHSVdSRVRSWSAqLworICAgIChpd19oYW5kbGVyKSB1c2JkcnZ3ZXh0X3Npd2VuY29kZSwgICAgICAgICAgICAgIC8qIFNJT0NTSVdFTkNPREUgKi8KKyAgICAoaXdfaGFuZGxlcikgdXNiZHJ2d2V4dF9naXdlbmNvZGUsICAgICAgICAgICAgICAvKiBTSU9DR0lXRU5DT0RFICovCisgICAgKGl3X2hhbmRsZXIpIHVzYmRydndleHRfc2l3cG93ZXIsICAgICAgICAgICAgICAgLyogU0lPQ1NJV1BPV0VSICovCisgICAgKGl3X2hhbmRsZXIpIHVzYmRydndleHRfZ2l3cG93ZXIsICAgICAgICAgICAgICAgLyogU0lPQ0dJV1BPV0VSICovCit9OworCitzdGF0aWMgY29uc3QgaXdfaGFuZGxlciB1c2JkcnZfcHJpdmF0ZV9oYW5kbGVyW10gPQoreworCS8vKGl3X2hhbmRsZXIpIHVzYmRydndleHRfc2V0cGFyYW0sCQkvKiBTSU9DV0ZJUlNUUFJJViswICovCisJLy8oaXdfaGFuZGxlcikgdXNiZHJ2d2V4dF9nZXRwYXJhbSwJCS8qIFNJT0NXRklSU1RQUklWKzEgKi8KKwkvLyhpd19oYW5kbGVyKSB1c2JkcnZ3ZXh0X3NldGtleSwJCSAgICAvKiBTSU9DV0ZJUlNUUFJJVisyICovCisJLy8oaXdfaGFuZGxlcikgdXNiZHJ2d2V4dF9zZXR3bW1wYXJhbXMsCS8qIFNJT0NXRklSU1RQUklWKzMgKi8KKwkvLyhpd19oYW5kbGVyKSB1c2JkcnZ3ZXh0X2RlbGtleSwJCSAgICAvKiBTSU9DV0ZJUlNUUFJJVis0ICovCisJLy8oaXdfaGFuZGxlcikgdXNiZHJ2d2V4dF9nZXR3bW1wYXJhbXMsCS8qIFNJT0NXRklSU1RQUklWKzUgKi8KKwkvLyhpd19oYW5kbGVyKSB1c2JkcnZ3ZXh0X3NldG1sbWUsCQkvKiBTSU9DV0ZJUlNUUFJJVis2ICovCisJLy8oaXdfaGFuZGxlcikgdXNiZHJ2d2V4dF9nZXRjaGFuaW5mbywJLyogU0lPQ1dGSVJTVFBSSVYrNyAqLworCS8vKGl3X2hhbmRsZXIpIHVzYmRydndleHRfc2V0b3B0aWUsCQkvKiBTSU9DV0ZJUlNUUFJJVis4ICovCisJLy8oaXdfaGFuZGxlcikgdXNiZHJ2d2V4dF9nZXRvcHRpZSwJCS8qIFNJT0NXRklSU1RQUklWKzkgKi8KKwkvLyhpd19oYW5kbGVyKSB1c2JkcnZ3ZXh0X2FkZG1hYywJCSAgICAvKiBTSU9DV0ZJUlNUUFJJVisxMCAqLworCS8vKGl3X2hhbmRsZXIpIHVzYmRydndleHRfZ2V0c2NhbnJlc3VsdHMsCS8qIFNJT0NXRklSU1RQUklWKzExICovCisJLy8oaXdfaGFuZGxlcikgdXNiZHJ2d2V4dF9kZWxtYWMsCQkgICAgLyogU0lPQ1dGSVJTVFBSSVYrMTIgKi8KKwkvLyhpd19oYW5kbGVyKSB1c2JkcnZ3ZXh0X2dldGNoYW5saXN0LAkvKiBTSU9DV0ZJUlNUUFJJVisxMyAqLworCS8vKGl3X2hhbmRsZXIpIHVzYmRydndleHRfc2V0Y2hhbmxpc3QsCS8qIFNJT0NXRklSU1RQUklWKzE0ICovCisJLy8oaXdfaGFuZGxlcikgTlVMTCwJCQkJICAgICAgICAvKiBTSU9DV0ZJUlNUUFJJVisxNSAqLworCS8vKGl3X2hhbmRsZXIpIHVzYmRydndleHRfY2hhbnN3aXRjaCwJICAgIC8qIFNJT0NXRklSU1RQUklWKzE2ICovCisJLy8oaXdfaGFuZGxlcikgdXNiZHJ2d2V4dF9zZXRtb2RlLAkJLyogU0lPQ1dGSVJTVFBSSVYrMTcgKi8KKwkvLyhpd19oYW5kbGVyKSB1c2JkcnZ3ZXh0X2dldG1vZGUsCQkvKiBTSU9DV0ZJUlNUUFJJVisxOCAqLworICAgIE5VTEwsICAgICAgICAgICAgICAgLyogU0lPQ0lXRklSU1RQUklWICovCit9OworCitzdGF0aWMgc3RydWN0IGl3X2hhbmRsZXJfZGVmIHA4MDIxMXdleHRfaGFuZGxlcl9kZWYgPSB7CisgICAgLm51bV9zdGFuZGFyZCA9IHNpemVvZih1c2JkcnZ3ZXh0X2hhbmRsZXIpIC8gc2l6ZW9mKGl3X2hhbmRsZXIpLAorICAgIC5udW1fcHJpdmF0ZSA9IHNpemVvZih1c2JkcnZfcHJpdmF0ZV9oYW5kbGVyKS9zaXplb2YoaXdfaGFuZGxlciksCisgICAgLm51bV9wcml2YXRlX2FyZ3MgPSBzaXplb2YodXNiZHJ2X3ByaXZhdGVfYXJncykvc2l6ZW9mKHN0cnVjdCBpd19wcml2X2FyZ3MpLAorICAgIC5zdGFuZGFyZCA9IHVzYmRydndleHRfaGFuZGxlciwKKyAgICAucHJpdmF0ZSA9IChpd19oYW5kbGVyICopIHVzYmRydl9wcml2YXRlX2hhbmRsZXIsCisgICAgLnByaXZhdGVfYXJncyA9IChzdHJ1Y3QgaXdfcHJpdl9hcmdzICopIHVzYmRydl9wcml2YXRlX2FyZ3MKK307CisjZW5kaWYKKworLyogV0RTICovCisvL3N0cnVjdCB6c1dkc1N0cnVjdCB3ZHNbWk1fV0RTX1BPUlRfTlVNQkVSXTsKKy8vdm9pZCB6ZkluaXRXZHNTdHJ1Y3Qodm9pZCk7CisKKy8qIFZBUCAqLworc3RydWN0IHpzVmFwU3RydWN0IHZhcFtaTV9WQVBfUE9SVF9OVU1CRVJdOwordm9pZCB6ZkxueEluaXRWYXBTdHJ1Y3Qodm9pZCk7CisKKworLyoqCisgKiB1c2JkcnZfaW50ciAtIGludGVycnVwdCBoYW5kbGVyCisgKiBAaXJxOiB0aGUgSVJRIG51bWJlcgorICogQGRldl9pbnN0OiB0aGUgbmV0X2RldmljZSBzdHJ1Y3QKKyAqIEByZWdzOiByZWdpc3RlcnMgKHVudXNlZCkKKyAqCisgKiBUaGlzIHJvdXRpbmUgaXMgdGhlIElTUiBmb3IgdGhlIHVzYmRydiBib2FyZC4gSXQgc2VydmljZXMKKyAqIHRoZSBSWCAmIFRYIHF1ZXVlcyAmIHN0YXJ0cyB0aGUgUlUgaWYgaXQgaGFzIHN0b3BwZWQgZHVlCisgKiB0byBubyByZXNvdXJjZXMuCisgKi8KK2lycXJldHVybl90IHVzYmRydl9pbnRyKGludCBpcnEsIHZvaWQgKmRldl9pbnN0LCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKyAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworICAgIHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcDsKKworICAgIGRldiA9IGRldl9pbnN0OworICAgIG1hY3AgPSBkZXYtPm1sX3ByaXY7CisKKworICAgIC8qIFJlYWQgcmVnaXN0ZXIgZXJyb3IsIGNhcmQgbWF5IGJlIHVucGx1Z2VkICovCisgICAgaWYgKDApLy8oaW50cl9zdGF0dXMgPT0gLTEpCisgICAgICAgIHJldHVybiBJUlFfTk9ORTsKKworICAgIC8qIHRoZSBkZXZpY2UgaXMgY2xvc2VkLCBkb24ndCBjb250aW51ZSBvciBlbHNlIGJhZCB0aGluZ3MgbWF5IGhhcHBlbi4gKi8KKyAgICBpZiAoIW5ldGlmX3J1bm5pbmcoZGV2KSkgeworICAgICAgICByZXR1cm4gSVJRX05PTkU7CisgICAgfQorCisgICAgaWYgKG1hY3AtPmRyaXZlcl9pc29sYXRlZCkgeworICAgICAgICByZXR1cm4gSVJRX05PTkU7CisgICAgfQorCisjaWYgKFdMQU5fSE9TVElGID09IFdMQU5fUENJKQorICAgIC8vemZpSXNyUGNpKGRldik7CisjZW5kaWYKKworICAgIHJldHVybiBJUlFfSEFORExFRDsKK30KKworaW50IHVzYmRydl9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gZGV2LT5tbF9wcml2OworICAgIGludCByYyA9IDA7CisgICAgdTE2X3Qgc2l6ZTsKKyAgICB2b2lkKiBtZW07CisgICAgLy91bnNpZ25lZCBjaGFyIGFkZHJbNl07CisgICAgc3RydWN0IHpzQ2JGdW5jVGJsIGNiRnVuY1RibDsKKworICAgIHByaW50aygiRW50ZXIgb3BlbigpXG4iKTsKKworLy8jaWZuZGVmIENPTkZJR19TTVAKKy8vICAgIHJlYWRfbG9jaygmKG1hY3AtPmlzb2xhdGVfbG9jaykpOworLy8jZW5kaWYKKyAgICBpZiAobWFjcC0+ZHJpdmVyX2lzb2xhdGVkKSB7CisgICAgICAgIHJjID0gLUVCVVNZOworICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQorCisgICAgc2l6ZSA9IHpmaUdsb2JhbERhdGFTaXplKGRldik7CisgICAgaWYgKChtZW0gPSBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpKSA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgcmMgPSAtRUJVU1k7CisgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CisgICAgbWFjcC0+d2QgPSBtZW07CisKKyAgICBtZW1zZXQoJmNiRnVuY1RibCwgMCwgc2l6ZW9mKHN0cnVjdCB6c0NiRnVuY1RibCkpOworICAgIGNiRnVuY1RibC56ZmNiQXV0aE5vdGlmeSA9IHpmTG54QXV0aE5vdGlmeTsKKyAgICBjYkZ1bmNUYmwuemZjYkF1dGhOb3RpZnkgPSB6ZkxueEF1dGhOb3RpZnk7CisgICAgY2JGdW5jVGJsLnpmY2JBc29jTm90aWZ5ID0gemZMbnhBc29jTm90aWZ5OworICAgIGNiRnVuY1RibC56ZmNiRGlzQXNvY05vdGlmeSA9IHpmTG54RGlzQXNvY05vdGlmeTsKKyAgICBjYkZ1bmNUYmwuemZjYkFwQ29ubmVjdE5vdGlmeSA9IHpmTG54QXBDb25uZWN0Tm90aWZ5OworICAgIGNiRnVuY1RibC56ZmNiQ29ubmVjdE5vdGlmeSA9IHpmTG54Q29ubmVjdE5vdGlmeTsKKyAgICBjYkZ1bmNUYmwuemZjYlNjYW5Ob3RpZnkgPSB6ZkxueFNjYW5Ob3RpZnk7CisgICAgY2JGdW5jVGJsLnpmY2JNaWNGYWlsdXJlTm90aWZ5ID0gemZMbnhNaWNGYWlsdXJlTm90aWZ5OworICAgIGNiRnVuY1RibC56ZmNiQXBNaWNGYWlsdXJlTm90aWZ5ID0gemZMbnhBcE1pY0ZhaWx1cmVOb3RpZnk7CisgICAgY2JGdW5jVGJsLnpmY2JJYnNzUGFydG5lck5vdGlmeSA9IHpmTG54SWJzc1BhcnRuZXJOb3RpZnk7CisgICAgY2JGdW5jVGJsLnpmY2JNYWNBZGRyZXNzTm90aWZ5ID0gemZMbnhNYWNBZGRyZXNzTm90aWZ5OworICAgIGNiRnVuY1RibC56ZmNiU2VuZENvbXBsZXRlSW5kaWNhdGlvbiA9IHpmTG54U2VuZENvbXBsZXRlSW5kaWNhdGlvbjsKKyAgICBjYkZ1bmNUYmwuemZjYlJlY3ZFdGggPSB6ZkxueFJlY3ZFdGg7CisgICAgY2JGdW5jVGJsLnpmY2JSZWN2ODAyMTEgPSB6ZkxueFJlY3Y4MDIxMTsKKyAgICBjYkZ1bmNUYmwuemZjYlJlc3RvcmVCdWZEYXRhID0gemZMbnhSZXN0b3JlQnVmRGF0YTsKKyNpZmRlZiBaTV9FTkFCTEVfQ0VOQworICAgIGNiRnVuY1RibC56ZmNiQ2VuY0Fzb2NOb3RpZnkgPSB6ZkxueENlbmNBc29jTm90aWZ5OworI2VuZGlmIC8vWk1fRU5BQkxFX0NFTkMKKyAgICBjYkZ1bmNUYmwuemZjYkh3V2F0Y2hEb2dOb3RpZnkgPSB6ZkxueFdhdGNoRG9nTm90aWZ5OworICAgIHpmaVdsYW5PcGVuKGRldiwgJmNiRnVuY1RibCk7CisKKyNpZiAwCisgICAgeworICAgICAgICAvL3UxNl90IG1hY1szXSA9IHsweDEzMDAsIDB4YjZkNCwgMHg1YWFmfTsKKyAgICAgICAgdTE2X3QgbWFjWzNdID0gezB4ODAwMCwgMHgwMGFiLCAweDAwMDB9OworICAgICAgICAvL3pmaVdsYW5TZXRNYWNBZGRyZXNzKGRldiwgbWFjKTsKKyAgICB9CisgICAgLyogTUFDIGFkZHJlc3MgKi8KKyAgICB6ZmlXbGFuUXVlcnlNYWNBZGRyZXNzKGRldiwgYWRkcik7CisgICAgZGV2LT5kZXZfYWRkclswXSA9IGFkZHJbMF07CisgICAgZGV2LT5kZXZfYWRkclsxXSA9IGFkZHJbMV07CisgICAgZGV2LT5kZXZfYWRkclsyXSA9IGFkZHJbMl07CisgICAgZGV2LT5kZXZfYWRkclszXSA9IGFkZHJbM107CisgICAgZGV2LT5kZXZfYWRkcls0XSA9IGFkZHJbNF07CisgICAgZGV2LT5kZXZfYWRkcls1XSA9IGFkZHJbNV07CisjZW5kaWYKKyAgICAvL3pmd01hY0FkZHJlc3NOb3RpZnkoKSB3aWxsIGJlIGNhbGxlZCB0byBzZXR1cCBkZXYtPmRldl9hZGRyW10KKworICAgIHpmTG54Q3JlYXRlVGhyZWFkKGRldik7CisKKyAgICBtb2RfdGltZXIoJihtYWNwLT5oYlRpbWVyMTBtcyksIGppZmZpZXMgKyAoMSpIWikvMTAwKTsgICAvLzEwIG1zCisKKyAgICBuZXRpZl9jYXJyaWVyX29uKGRldik7CisKKyAgICBuZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCisjaWYgWk1fQVBfTU9ERSA9PSAxCisgICAgemZpV2xhblNldFdsYW5Nb2RlKGRldiwgWk1fTU9ERV9BUCk7CisgICAgemZpV2xhblNldEJhc2ljUmF0ZShkZXYsIDB4ZiwgMCwgMCk7CisgICAgemZpV2xhblNldFNTSUQoZGV2LCAiT1RVU19DV1kiLCA4KTsKKyAgICB6ZmlXbGFuU2V0RHRpbUNvdW50KGRldiwgMyk7CisKKyAgI2lmIFpNX1dFUF9NT01FID09IDEKKyAgICB7CisgICAgICAgIHU4X3Qga2V5WzE2XSA9IHsweDEyLCAweDM0LCAweDU2LCAweDc4LCAweDkwfTsKKyAgICAgICAgc3RydWN0IHpzS2V5SW5mbyBrZXlJbmZvOworCisgICAgICAgIGtleUluZm8ua2V5TGVuZ3RoID0gNTsKKyAgICAgICAga2V5SW5mby5rZXlJbmRleCA9IDA7CisgICAgICAgIGtleUluZm8uZmxhZyA9IDA7CisgICAgICAgIGtleUluZm8ua2V5ID0ga2V5OworICAgICAgICB6ZmlXbGFuU2V0S2V5KGRldiwga2V5SW5mbyk7CisKKyAgICAgICAgemZpV2xhblNldEVuY3J5TW9kZShkZXYsIFpNX1dFUDY0KTsKKyAgICB9CisKKyAgICAjaWYgWk1fU0hBUkVfQVVUSCA9PSAxCisgICAgemZpV2xhblNldEF1dGhlbnRpY2F0aW9uTW9kZShkZXYsIDEpOworICAgICNlbmRpZiAvLyNpZiBaTV9TSEFSRV9BVVRIID09IDEKKyAgI2VuZGlmIC8vI2lmIFpNX1dFUF9NT01FID09IDEKKworI2VsaWYgWk1fUElCU1NfTU9ERSA9PSAxCisgICAgemZpV2xhblNldFdsYW5Nb2RlKGRldiwgWk1fTU9ERV9QU0VVRE8pOworI2Vsc2UKKyAgICB6ZmlXbGFuU2V0V2xhbk1vZGUoZGV2LCBaTV9NT0RFX0lORlJBU1RSVUNUVVJFKTsKKyNlbmRpZgorICAgIC8vemZpV2xhblNldENoYW5uZWwoZGV2LCBaTV9DSEFOTkVMLCBGQUxTRSk7CisgICAgemZpV2xhblNldEZyZXF1ZW5jeShkZXYsIDI0NjIwMDAsIEZBTFNFKTsKKyAgICB6ZmlXbGFuU2V0UnRzVGhyZXNob2xkKGRldiwgMzI3NjcpOworICAgIHpmaVdsYW5TZXRGcmFnVGhyZXNob2xkKGRldiwgMCk7CisKKyAgICB6ZmlXbGFuRW5hYmxlKGRldik7CisKKyNpZmRlZiBaTV9FTkFCTEVfQ0VOQworICAgIG1hY3AtPm5ldGxpbmtfc2sgPSBuZXRsaW5rX2tlcm5lbF9jcmVhdGUoTkVUTElOS19VU0VSU09DSywgMSwgTlVMTCwgVEhJU19NT0RVTEUpOworCisgICAgaWYgKG1hY3AtPm5ldGxpbmtfc2sgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIHByaW50ayhLRVJOX0VSUiAiQ2FuJ3QgY3JlYXRlIE5FVExJTksgc29ja2V0XG4iKTsKKyAgICB9CisjZW5kaWYKKworICAgIG1hY3AtPkRldmljZU9wZW5lZCA9IDE7CitleGl0OgorLy8jaWZuZGVmIENPTkZJR19TTVAKKy8vICAgIHJlYWRfdW5sb2NrKCYobWFjcC0+aXNvbGF0ZV9sb2NrKSk7CisvLyNlbmRpZgorICAgIC8vemZSZWdpc3Rlcldkc0RldihkZXYsIDApOworICAgIC8vemZMbnhSZWdpc3RlclZhcERldihkZXYsIDApOworCisgICAgcmV0dXJuIHJjOworfQorCisKKworCisvKioKKyAqIHVzYmRydl9nZXRfc3RhdHMgLSBnZXQgZHJpdmVyIHN0YXRpc3RpY3MKKyAqIEBkZXY6IGFkYXB0ZXIncyBuZXRfZGV2aWNlIHN0cnVjdAorICoKKyAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgd2hlbiB0aGUgT1Mgd2FudHMgdGhlIGFkYXB0ZXIncyBzdGF0cyByZXR1cm5lZC4KKyAqIEl0IHJldHVybnMgdGhlIGFkZHJlc3Mgb2YgdGhlIG5ldF9kZXZpY2Vfc3RhdHMgc3R1Y3R1cmUgZm9yIHRoZSBkZXZpY2UuCisgKiBJZiB0aGUgc3RhdGlzdGljcyBhcmUgY3VycmVudGx5IGJlaW5nIHVwZGF0ZWQsIHRoZW4gdGhleSBtaWdodCBiZSBpbmNvcnJlY3QKKyAqIGZvciBhIHNob3J0IHdoaWxlLiBIb3dldmVyLCBzaW5jZSB0aGlzIGNhbm5vdCBhY3R1YWxseSBjYXVzZSBkYW1hZ2UsIG5vCisgKiBsb2NraW5nIGlzIHVzZWQuCisgKi8KKworc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKiB1c2JkcnZfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gZGV2LT5tbF9wcml2OworCisgICAgbWFjcC0+ZHJ2X3N0YXRzLm5ldF9zdGF0cy50eF9lcnJvcnMgPQorICAgICAgICBtYWNwLT5kcnZfc3RhdHMubmV0X3N0YXRzLnR4X2NhcnJpZXJfZXJyb3JzICsKKyAgICAgICAgbWFjcC0+ZHJ2X3N0YXRzLm5ldF9zdGF0cy50eF9hYm9ydGVkX2Vycm9yczsKKworICAgIG1hY3AtPmRydl9zdGF0cy5uZXRfc3RhdHMucnhfZXJyb3JzID0KKyAgICAgICAgbWFjcC0+ZHJ2X3N0YXRzLm5ldF9zdGF0cy5yeF9jcmNfZXJyb3JzICsKKyAgICAgICAgbWFjcC0+ZHJ2X3N0YXRzLm5ldF9zdGF0cy5yeF9mcmFtZV9lcnJvcnMgKworICAgICAgICBtYWNwLT5kcnZfc3RhdHMubmV0X3N0YXRzLnJ4X2xlbmd0aF9lcnJvcnM7CisKKworICAgIHJldHVybiAmKG1hY3AtPmRydl9zdGF0cy5uZXRfc3RhdHMpOworfQorCisKKy8qKgorICogdXNiZHJ2X3NldF9tYWMgLSBzZXQgdGhlIE1BQyBhZGRyZXNzCisgKiBAZGV2OiBhZGFwdGVyJ3MgbmV0X2RldmljZSBzdHJ1Y3QKKyAqIEBhZGRyOiB0aGUgbmV3IGFkZHJlc3MKKyAqCisgKiBUaGlzIHJvdXRpbmUgc2V0cyB0aGUgZXRoZXJuZXQgYWRkcmVzcyBvZiB0aGUgYm9hcmQKKyAqIFJldHVybnM6CisgKiAwICAtIGlmIHN1Y2Nlc3NmdWwKKyAqIC0xIC0gb3RoZXJ3aXNlCisgKi8KKworaW50IHVzYmRydl9zZXRfbWFjKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHZvaWQgKmFkZHIpCit7CisgICAgc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwOworICAgIGludCByYyA9IC0xOworCisgICAgbWFjcCA9IGRldi0+bWxfcHJpdjsKKyAgICByZWFkX2xvY2soJihtYWNwLT5pc29sYXRlX2xvY2spKTsKKworICAgIGlmIChtYWNwLT5kcml2ZXJfaXNvbGF0ZWQpIHsKKyAgICAgICAgZ290byBleGl0OworICAgIH0KKworICAgIHJjID0gMDsKKworCitleGl0OgorICAgIHJlYWRfdW5sb2NrKCYobWFjcC0+aXNvbGF0ZV9sb2NrKSk7CisgICAgcmV0dXJuIHJjOworfQorCisKKwordm9pZAordXNiZHJ2X2lzb2xhdGVfZHJpdmVyKHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCkKK3sKKyNpZm5kZWYgQ09ORklHX1NNUAorICAgIHdyaXRlX2xvY2tfaXJxKCYobWFjcC0+aXNvbGF0ZV9sb2NrKSk7CisjZW5kaWYKKyAgICBtYWNwLT5kcml2ZXJfaXNvbGF0ZWQgPSBUUlVFOworI2lmbmRlZiBDT05GSUdfU01QCisgICAgd3JpdGVfdW5sb2NrX2lycSgmKG1hY3AtPmlzb2xhdGVfbG9jaykpOworI2VuZGlmCisKKyAgICBpZiAobmV0aWZfcnVubmluZyhtYWNwLT5kZXZpY2UpKQorICAgIHsKKyAgICAgICAgbmV0aWZfY2Fycmllcl9vZmYobWFjcC0+ZGV2aWNlKTsKKyAgICAgICAgbmV0aWZfc3RvcF9xdWV1ZShtYWNwLT5kZXZpY2UpOworICAgIH0KK30KKworI2RlZmluZSBWTEFOX1NJWkUgICAJNAoraW50IHVzYmRydl9jaGFuZ2VfbXR1KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBuZXdfbXR1KQoreworICAgIGlmICgobmV3X210dSA8IDY4KSB8fCAobmV3X210dSA+IChFVEhfREFUQV9MRU4gKyBWTEFOX1NJWkUpKSkKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisKKyAgICBkZXYtPm10dSA9IG5ld19tdHU7CisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgemZMbnhVbmxpbmtBbGxVcmJzKHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCk7CisKK2ludCB1c2JkcnZfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKK2V4dGVybiB2b2lkIHpmSHBMZWRDdHJsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUxNl90IGxlZElkLCB1OF90IG1vZGUpOworCisgICAgc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gZGV2LT5tbF9wcml2OworCisgICAgcHJpbnRrKEtFUk5fREVCVUcgInVzYmRydl9jbG9zZVxuIik7CisKKyAgICBuZXRpZl9jYXJyaWVyX29mZihtYWNwLT5kZXZpY2UpOworCisgICAgZGVsX3RpbWVyX3N5bmMoJm1hY3AtPmhiVGltZXIxMG1zKTsKKworICAgIHByaW50ayhLRVJOX0RFQlVHICJ1c2JkcnZfbmV0aWZfY2Fycmllcl9vZmZcbiIpOworCisgICAgdXNiZHJ2X2lzb2xhdGVfZHJpdmVyKG1hY3ApOworCisgICAgcHJpbnRrKEtFUk5fREVCVUcgInVzYmRydl9pc29sYXRlX2RyaXZlclxuIik7CisKKyAgICBuZXRpZl9jYXJyaWVyX29mZihtYWNwLT5kZXZpY2UpOworI2lmZGVmIFpNX0VOQUJMRV9DRU5DCisgICAgLyogQ0VOQyAqLworICAgIGlmIChtYWNwLT5uZXRsaW5rX3NrICE9IE5VTEwpCisgICAgeworICAgIC8vICAgIHNvY2tfcmVsZWFzZShtYWNwLT5uZXRsaW5rX3NrKTsKKyAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJ1c2JkcnYgY2xvc2UgbmV0bGluayBzb2NrZXRcbiIpOworICAgIH0KKyNlbmRpZiAvL1pNX0VOQUJMRV9DRU5DCisjaWYgKFdMQU5fSE9TVElGID09IFdMQU5fUENJKQorICAgIC8vZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisjZW5kaWYKKworICAgIC8qIFR1cm4gb2ZmIExFRCAqLworICAgIHpmSHBMZWRDdHJsKGRldiwgMCwgMCk7CisgICAgemZIcExlZEN0cmwoZGV2LCAxLCAwKTsKKworICAgIC8qIERlbGF5IGZvciBhIHdoaWxlICovCisgICAgbWRlbGF5KDEwKTsKKworICAgIC8qIGNsZWFyIFdQQS9SU04gSUUgKi8KKyAgICBtYWNwLT5zdXBJZVsxXSA9IDA7CisKKyAgICAvKiBzZXQgdGhlIGlzb2xhdGUgZmxhZyB0byBmYWxzZSwgc28gdXNiZHJ2X29wZW4gY2FuIGJlIGNhbGxlZCAqLworICAgIG1hY3AtPmRyaXZlcl9pc29sYXRlZCA9IEZBTFNFOworCisgICAgemZpV2xhbkNsb3NlKGRldik7CisgICAga2ZyZWUobWFjcC0+d2QpOworCisgICAgemZMbnhVbmxpbmtBbGxVcmJzKG1hY3ApOworCisgICAgcmV0dXJuIDA7Cit9CisKKworCisKK2ludCB1c2JkcnZfeG1pdF9mcmFtZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIGludCBub3RpZnlfc3RvcCA9IEZBTFNFOworICAgIHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IGRldi0+bWxfcHJpdjsKKworI2lmIDAKKyAgICAvKiBUZXN0IGNvZGUgKi8KKyAgICB7CisgICAgICAgIHN0cnVjdCBza19idWZmKiBzOworCisgICAgICAgIHMgPSBza2JfY29weV9leHBhbmQoc2tiLCA4LCAwLCBHRlBfQVRPTUlDKTsKKyAgICAgICAgc2tiX3B1c2gocywgOCk7CisgICAgICAgIHMtPmRhdGFbMF0gPSAneic7CisgICAgICAgIHMtPmRhdGFbMV0gPSAneSc7CisgICAgICAgIHMtPmRhdGFbMl0gPSAnZCc7CisgICAgICAgIHMtPmRhdGFbM10gPSAnYSc7CisgICAgICAgIHMtPmRhdGFbNF0gPSAncyc7CisgICAgICAgIHByaW50aygibGVuMT0lZCwgbGVuMj0lZCIsIHNrYi0+bGVuLCBzLT5sZW4pOworICAgICAgICBuZXRsaW5rX2Jyb2FkY2FzdChydG5sLCBzLCAwLCBSVE1HUlBfTElOSywgR0ZQX0FUT01JQyk7CisgICAgfQorI2VuZGlmCisKKyNpZiBaTV9ESVNBQkxFX1hNSVQKKyAgICBkZXZfa2ZyZWVfc2tiX2lycShza2IpOworI2Vsc2UKKyAgICB6ZmlUeFNlbmRFdGgoZGV2LCBza2IsIDApOworI2VuZGlmCisgICAgbWFjcC0+ZHJ2X3N0YXRzLm5ldF9zdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKKyAgICBtYWNwLT5kcnZfc3RhdHMubmV0X3N0YXRzLnR4X3BhY2tldHMrKzsKKworICAgIC8vZGV2X2tmcmVlX3NrYl9pcnEoc2tiKTsKKworICAgIGlmIChub3RpZnlfc3RvcCkgeworICAgICAgICBuZXRpZl9jYXJyaWVyX29mZihkZXYpOworICAgICAgICBuZXRpZl9zdG9wX3F1ZXVlKGRldik7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKworCisKK3ZvaWQgdXNiZHJ2X3NldF9tdWx0aShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCisKKyAgICBpZiAoIShkZXYtPmZsYWdzICYgSUZGX1VQKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgICAgIHJldHVybjsKKworfQorCisKKworLyoqCisgKiB1c2JkcnZfY2xlYXJfc3RydWN0cyAtIGZyZWUgcmVzb3VyY2VzCisKKyAqIEBkZXY6IGFkYXB0ZXIncyBuZXRfZGV2aWNlIHN0cnVjdAorICoKKyAqIEZyZWUgYWxsIGRldmljZSBzcGVjaWZpYyBzdHJ1Y3RzLCB1bm1hcCBpL28gYWRkcmVzcywgZXRjLgorICovCit2b2lkIHVzYmRydl9jbGVhcl9zdHJ1Y3RzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gZGV2LT5tbF9wcml2OworCisKKyNpZiAoV0xBTl9IT1NUSUYgPT0gV0xBTl9QQ0kpCisgICAgaW91bm1hcChtYWNwLT5yZWdwKTsKKworICAgIHBjaV9yZWxlYXNlX3JlZ2lvbnMobWFjcC0+cGRldik7CisgICAgcGNpX2Rpc2FibGVfZGV2aWNlKG1hY3AtPnBkZXYpOworICAgIHBjaV9zZXRfZHJ2ZGF0YShtYWNwLT5wZGV2LCBOVUxMKTsKKyNlbmRpZgorCisgICAga2ZyZWUobWFjcCk7CisKKyAgICBrZnJlZShkZXYpOworCit9CisKK3ZvaWQgdXNiZHJ2X3JlbW92ZTEoc3RydWN0IHBjaV9kZXYgKnBjaWQpCit7CisgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKyAgICBzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3A7CisKKyAgICBpZiAoIShkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKikgcGNpX2dldF9kcnZkYXRhKHBjaWQpKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgbWFjcCA9IGRldi0+bWxfcHJpdjsKKyAgICB1bnJlZ2lzdGVyX25ldGRldihkZXYpOworCisgICAgdXNiZHJ2X2NsZWFyX3N0cnVjdHMoZGV2KTsKK30KKworCit2b2lkIHpmTG54MTBtc1RpbWVyKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYpCit7CisgICAgc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gZGV2LT5tbF9wcml2OworCisgICAgbW9kX3RpbWVyKCYobWFjcC0+aGJUaW1lcjEwbXMpLCBqaWZmaWVzICsgKDEqSFopLzEwMCk7ICAgLy8xMCBtcworICAgIHpmaUhlYXJ0QmVhdChkZXYpOworICAgIHJldHVybjsKK30KKwordm9pZCB6ZkxueEluaXRWYXBTdHJ1Y3Qodm9pZCkKK3sKKyAgICB1MTZfdCBpOworCisgICAgZm9yIChpPTA7IGk8Wk1fVkFQX1BPUlRfTlVNQkVSOyBpKyspCisgICAgeworICAgICAgICB2YXBbaV0uZGV2ID0gTlVMTDsKKyAgICAgICAgdmFwW2ldLm9wZW5GbGFnID0gMDsKKyAgICB9Cit9CisKK2ludCB6ZkxueFZhcE9wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICB1MTZfdCB2YXBJZDsKKworICAgIHZhcElkID0gemZMbnhHZXRWYXBJZChkZXYpOworCisgICAgaWYgKHZhcFt2YXBJZF0ub3BlbkZsYWcgPT0gMCkKKyAgICB7CisgICAgICAgIHZhcFt2YXBJZF0ub3BlbkZsYWcgPSAxOworICAgIAlwcmludGsoInpmTG54VmFwT3BlbiA6IGRldmljZSBuYW1lPSVzLCB2YXAgSUQ9JWRcbiIsIGRldi0+bmFtZSwgdmFwSWQpOworICAgIAl6ZmlXbGFuU2V0U1NJRChkZXYsICJ2YXAxIiwgNCk7CisgICAgCXpmaVdsYW5FbmFibGUoZGV2KTsKKyAgICAJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcHJpbnRrKCJWQVAgb3BlbmVkIGVycm9yIDogdmFwIElEPSVkXG4iLCB2YXBJZCk7CisgICAgfQorCXJldHVybiAwOworfQorCitpbnQgemZMbnhWYXBDbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIHUxNl90IHZhcElkOworCisgICAgdmFwSWQgPSB6ZkxueEdldFZhcElkKGRldik7CisKKyAgICBpZiAodmFwSWQgIT0gMHhmZmZmKQorICAgIHsKKyAgICAgICAgaWYgKHZhcFt2YXBJZF0ub3BlbkZsYWcgPT0gMSkKKyAgICAgICAgeworICAgICAgICAgICAgcHJpbnRrKCJ6ZkxueFZhcENsb3NlOiBkZXZpY2UgbmFtZT0lcywgdmFwIElEPSVkXG4iLCBkZXYtPm5hbWUsIHZhcElkKTsKKworICAgICAgICAgICAgbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworICAgICAgICAgICAgdmFwW3ZhcElkXS5vcGVuRmxhZyA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwcmludGsoIlZBUCBwb3J0IHdhcyBub3Qgb3BlbmVkIDogdmFwIElEPSVkXG4iLCB2YXBJZCk7CisgICAgICAgIH0KKyAgICB9CisJcmV0dXJuIDA7Cit9CisKK2ludCB6ZkxueFZhcFhtaXRGcmFtZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIGludCBub3RpZnlfc3RvcCA9IEZBTFNFOworICAgIHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IGRldi0+bWxfcHJpdjsKKyAgICB1MTZfdCB2YXBJZDsKKworICAgIHZhcElkID0gemZMbnhHZXRWYXBJZChkZXYpOworICAgIC8vcHJpbnRrKCJ6ZkxueFZhcFhtaXRGcmFtZTogdmFwIElEPSVkXG4iLCB2YXBJZCk7CisgICAgLy9wcmludGsoInpmTG54VmFwWG1pdEZyYW1lKCksIHNrYj0lbHhoXG4iLCAodTMyX3Qpc2tiKTsKKworICAgIGlmICh2YXBJZCA+PSBaTV9WQVBfUE9SVF9OVU1CRVIpCisgICAgeworICAgICAgICBkZXZfa2ZyZWVfc2tiX2lycShza2IpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisjaWYgMQorICAgIGlmICh2YXBbdmFwSWRdLm9wZW5GbGFnID09IDApCisgICAgeworICAgICAgICBkZXZfa2ZyZWVfc2tiX2lycShza2IpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisjZW5kaWYKKworCisgICAgemZpVHhTZW5kRXRoKGRldiwgc2tiLCAweDEpOworCisgICAgbWFjcC0+ZHJ2X3N0YXRzLm5ldF9zdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKKyAgICBtYWNwLT5kcnZfc3RhdHMubmV0X3N0YXRzLnR4X3BhY2tldHMrKzsKKworICAgIC8vZGV2X2tmcmVlX3NrYl9pcnEoc2tiKTsKKworICAgIGlmIChub3RpZnlfc3RvcCkgeworICAgICAgICBuZXRpZl9jYXJyaWVyX29mZihkZXYpOworICAgICAgICBuZXRpZl9zdG9wX3F1ZXVlKGRldik7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCB6ZkxueFJlZ2lzdGVyVmFwRGV2KHN0cnVjdCBuZXRfZGV2aWNlKiBwYXJlbnREZXYsIHUxNl90IHZhcElkKQoreworICAgIC8qIEFsbG9jYXRlIG5ldCBkZXZpY2Ugc3RydWN0dXJlICovCisgICAgdmFwW3ZhcElkXS5kZXYgPSBhbGxvY19ldGhlcmRldigwKTsKKyAgICBwcmludGsoIlJlZ2lzdGVyIHZhcCBkZXY9JXhcbiIsICh1MzJfdCl2YXBbdmFwSWRdLmRldik7CisKKyAgICBpZih2YXBbdmFwSWRdLmRldiA9PSBOVUxMKSB7CisgICAgICAgIHByaW50aygiYWxsb2NfZXRoZXJkZXYgZmFpbFxuIik7CisgICAgICAgIHJldHVybiAtRU5PTUVNOworICAgIH0KKworICAgIC8qIFNldHVwIHRoZSBkZWZhdWx0IHNldHRpbmdzICovCisgICAgZXRoZXJfc2V0dXAodmFwW3ZhcElkXS5kZXYpOworCisgICAgLyogTUFDIGFkZHJlc3MgKi8KKyAgICBtZW1jcHkodmFwW3ZhcElkXS5kZXYtPmRldl9hZGRyLCBwYXJlbnREZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7CisKKyAgICB2YXBbdmFwSWRdLmRldi0+aXJxID0gcGFyZW50RGV2LT5pcnE7CisgICAgdmFwW3ZhcElkXS5kZXYtPmJhc2VfYWRkciA9IHBhcmVudERldi0+YmFzZV9hZGRyOworICAgIHZhcFt2YXBJZF0uZGV2LT5tZW1fc3RhcnQgPSBwYXJlbnREZXYtPm1lbV9zdGFydDsKKyAgICB2YXBbdmFwSWRdLmRldi0+bWVtX2VuZCA9IHBhcmVudERldi0+bWVtX2VuZDsKKyAgICB2YXBbdmFwSWRdLmRldi0+bWxfcHJpdiA9IHBhcmVudERldi0+bWxfcHJpdjsKKworICAgIC8vZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSAmemQxMjEyX3dkc194bWl0X2ZyYW1lOworICAgIHZhcFt2YXBJZF0uZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSAmemZMbnhWYXBYbWl0RnJhbWU7CisgICAgdmFwW3ZhcElkXS5kZXYtPm9wZW4gPSAmemZMbnhWYXBPcGVuOworICAgIHZhcFt2YXBJZF0uZGV2LT5zdG9wID0gJnpmTG54VmFwQ2xvc2U7CisgICAgdmFwW3ZhcElkXS5kZXYtPmdldF9zdGF0cyA9ICZ1c2JkcnZfZ2V0X3N0YXRzOworICAgIHZhcFt2YXBJZF0uZGV2LT5jaGFuZ2VfbXR1ID0gJnVzYmRydl9jaGFuZ2VfbXR1OworI2lmZGVmIFpNX0hPU1RBUERfU1VQUE9SVAorICAgIHZhcFt2YXBJZF0uZGV2LT5kb19pb2N0bCA9IHVzYmRydl9pb2N0bDsKKyNlbHNlCisgICAgdmFwW3ZhcElkXS5kZXYtPmRvX2lvY3RsID0gTlVMTDsKKyNlbmRpZgorICAgIHZhcFt2YXBJZF0uZGV2LT5kZXN0cnVjdG9yID0gZnJlZV9uZXRkZXY7CisKKyAgICB2YXBbdmFwSWRdLmRldi0+dHhfcXVldWVfbGVuID0gMDsKKworICAgIHZhcFt2YXBJZF0uZGV2LT5kZXZfYWRkclswXSA9IHBhcmVudERldi0+ZGV2X2FkZHJbMF07CisgICAgdmFwW3ZhcElkXS5kZXYtPmRldl9hZGRyWzFdID0gcGFyZW50RGV2LT5kZXZfYWRkclsxXTsKKyAgICB2YXBbdmFwSWRdLmRldi0+ZGV2X2FkZHJbMl0gPSBwYXJlbnREZXYtPmRldl9hZGRyWzJdOworICAgIHZhcFt2YXBJZF0uZGV2LT5kZXZfYWRkclszXSA9IHBhcmVudERldi0+ZGV2X2FkZHJbM107CisgICAgdmFwW3ZhcElkXS5kZXYtPmRldl9hZGRyWzRdID0gcGFyZW50RGV2LT5kZXZfYWRkcls0XTsKKyAgICB2YXBbdmFwSWRdLmRldi0+ZGV2X2FkZHJbNV0gPSBwYXJlbnREZXYtPmRldl9hZGRyWzVdICsgKHZhcElkKzEpOworCisgICAgLyogU3RvcCB0aGUgbmV0d29yayBxdWV1ZSBmaXJzdCAqLworICAgIG5ldGlmX3N0b3BfcXVldWUodmFwW3ZhcElkXS5kZXYpOworCisgICAgc3ByaW50Zih2YXBbdmFwSWRdLmRldi0+bmFtZSwgInZhcCVkIiwgdmFwSWQpOworICAgIHByaW50aygiUmVnaXN0ZXIgVkFQIGRldiBzdWNjZXNzIDogJXNcbiIsIHZhcFt2YXBJZF0uZGV2LT5uYW1lKTsKKworICAgIGlmKHJlZ2lzdGVyX25ldGRldmljZSh2YXBbdmFwSWRdLmRldikgIT0gMCkgeworICAgICAgICBwcmludGsoInJlZ2lzdGVyIFZBUCBkZXZpY2UgZmFpbFxuIik7CisgICAgICAgIHZhcFt2YXBJZF0uZGV2ID0gTlVMTDsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCB6ZkxueFVucmVnaXN0ZXJWYXBEZXYoc3RydWN0IG5ldF9kZXZpY2UqIHBhcmVudERldiwgdTE2X3QgdmFwSWQpCit7CisgICAgaW50IHJldCA9IDA7CisKKyAgICBwcmludGsoIlVucmVnaXN0ZXIgVkFQIGRldiA6ICVzXG4iLCB2YXBbdmFwSWRdLmRldi0+bmFtZSk7CisKKyAgICBpZih2YXBbdmFwSWRdLmRldiAhPSBOVUxMKSB7CisgICAgICAgIHByaW50aygiVW5yZWdpc3RlciB2YXAgZGV2PSV4XG4iLCAodTMyX3QpdmFwW3ZhcElkXS5kZXYpOworICAgICAgICAvLworICAgICAgICAvL3VucmVnaXN0ZXJfbmV0ZGV2aWNlKHdkc1t3ZHNJZF0uZGV2KTsKKyAgICAgICAgdW5yZWdpc3Rlcl9uZXRkZXYodmFwW3ZhcElkXS5kZXYpOworCisgICAgICAgIHByaW50aygiVkFQIHVucmVnaXN0ZXJfbmV0ZGV2aWNlXG4iKTsKKyAgICAgICAgdmFwW3ZhcElkXS5kZXYgPSBOVUxMOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcHJpbnRrKCJ1bnJlZ2lzdGVyIFZBUCBkZXZpY2U6ICVkIGZhaWxcbiIsIHZhcElkKTsKKyAgICAgICAgcmV0ID0gLUVJTlZBTDsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCisKKworIyAgZGVmaW5lIFNVQk1JVF9VUkIodSxmKSAgICAgICB1c2Jfc3VibWl0X3VyYih1LGYpCisjICBkZWZpbmUgVVNCX0FMTE9DX1VSQih1LGYpICAgIHVzYl9hbGxvY191cmIodSxmKQorCisvL2V4dGVybiB2b2lkIHpmaVdsYW5RdWVyeU1hY0FkZHJlc3MoemRldl90KiBkZXYsIHU4X3QqIGFkZHIpOworCitleHRlcm4gaW50IHVzYmRydl9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworZXh0ZXJuIGludCB1c2JkcnZfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitleHRlcm4gaW50IHVzYmRydl94bWl0X2ZyYW1lKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworZXh0ZXJuIGludCB1c2JkcnZfeG1pdF9mcmFtZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK2V4dGVybiBpbnQgdXNiZHJ2X2NoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG5ld19tdHUpOworZXh0ZXJuIHZvaWQgdXNiZHJ2X3NldF9tdWx0aShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK2V4dGVybiBpbnQgdXNiZHJ2X3NldF9tYWMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdm9pZCAqYWRkcik7CitleHRlcm4gc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKiB1c2JkcnZfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworZXh0ZXJuIGludCB1c2JkcnZfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICppZnIsIGludCBjbWQpOworZXh0ZXJuIFVzYlR4UV90ICp6ZkxueEdldFVzYlR4QnVmZmVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCitpbnQgemZMbnhBbGxvY0FsbFVyYnMoc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwKQoreworICAgIHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2UgPSBtYWNwLT5pbnRlcmZhY2U7CisgICAgc3RydWN0IHVzYl9ob3N0X2ludGVyZmFjZSAqaWZhY2VfZGVzYyA9ICZpbnRlcmZhY2UtPmFsdHNldHRpbmdbMF07CisKKyAgICBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVuZHBvaW50OworICAgIGludCBpOworCisgICAgLyogZGVzY3JpcHRvciBtYXRjaGVzLCBsZXQncyBmaW5kIHRoZSBlbmRwb2ludHMgbmVlZGVkICovCisgICAgLyogY2hlY2sgb3V0IHRoZSBlbmRwb2ludHMgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgaWZhY2VfZGVzYy0+ZGVzYy5iTnVtRW5kcG9pbnRzOyArK2kpCisgICAgeworICAgICAgICBlbmRwb2ludCA9ICZpZmFjZV9kZXNjLT5lbmRwb2ludFtpXS5kZXNjOworICAgICAgICBpZiAoKGVuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzICYgMHg4MCkgJiYKKyAgICAgICAgICAgICgoZW5kcG9pbnQtPmJtQXR0cmlidXRlcyAmIDMpID09IDB4MDIpKQorICAgICAgICB7CisgICAgICAgICAgICAvKiB3ZSBmb3VuZCBhIGJ1bGsgaW4gZW5kcG9pbnQgKi8KKyAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiYnVsayBpbjogd01heFBhY2tldFNpemUgPSAleFxuIiwgbGUxNl90b19jcHUoZW5kcG9pbnQtPndNYXhQYWNrZXRTaXplKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKChlbmRwb2ludC0+YkVuZHBvaW50QWRkcmVzcyAmIDB4ODApID09IDB4MDApICYmCisgICAgICAgICAgICAoKGVuZHBvaW50LT5ibUF0dHJpYnV0ZXMgJiAzKSA9PSAweDAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogd2UgZm91bmQgYSBidWxrIG91dCBlbmRwb2ludCAqLworICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJidWxrIG91dDogd01heFBhY2tldFNpemUgPSAleFxuIiwgbGUxNl90b19jcHUoZW5kcG9pbnQtPndNYXhQYWNrZXRTaXplKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKGVuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzICYgMHg4MCkgJiYKKyAgICAgICAgICAgICgoZW5kcG9pbnQtPmJtQXR0cmlidXRlcyAmIDMpID09IDB4MDMpKQorICAgICAgICB7CisgICAgICAgICAgICAvKiB3ZSBmb3VuZCBhIGludGVycnVwdCBpbiBlbmRwb2ludCAqLworICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJpbnRlcnJ1cHQgaW46IHdNYXhQYWNrZXRTaXplID0gJXhcbiIsIGxlMTZfdG9fY3B1KGVuZHBvaW50LT53TWF4UGFja2V0U2l6ZSkpOworICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJpbnRlcnJ1cHQgaW46IGludF9pbnRlcnZhbCA9ICVkXG4iLCBlbmRwb2ludC0+YkludGVydmFsKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgoKGVuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzICYgMHg4MCkgPT0gMHgwMCkgJiYKKyAgICAgICAgICAgICgoZW5kcG9pbnQtPmJtQXR0cmlidXRlcyAmIDMpID09IDB4MDMpKQorICAgICAgICB7CisgICAgICAgICAgICAvKiB3ZSBmb3VuZCBhIGludGVycnVwdCBvdXQgZW5kcG9pbnQgKi8KKyAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiaW50ZXJydXB0IG91dDogd01heFBhY2tldFNpemUgPSAleFxuIiwgbGUxNl90b19jcHUoZW5kcG9pbnQtPndNYXhQYWNrZXRTaXplKSk7CisgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgImludGVycnVwdCBvdXQ6IGludF9pbnRlcnZhbCA9ICVkXG4iLCBlbmRwb2ludC0+YkludGVydmFsKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIEFsbG9jYXRlIGFsbCBUeCBVUkJzICovCisgICAgZm9yIChpID0gMDsgaSA8IFpNX01BWF9UWF9VUkJfTlVNOyBpKyspCisgICAgeworICAgICAgICBtYWNwLT5XbGFuVHhEYXRhVXJiW2ldID0gVVNCX0FMTE9DX1VSQigwLCBHRlBfS0VSTkVMKTsKKworICAgICAgICBpZiAobWFjcC0+V2xhblR4RGF0YVVyYltpXSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgajsKKworICAgICAgICAgICAgLyogRnJlZSBhbGwgdXJicyAqLworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGk7IGorKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1c2JfZnJlZV91cmIobWFjcC0+V2xhblR4RGF0YVVyYltqXSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQorCisgICAgLyogQWxsb2NhdGUgYWxsIFJ4IFVSQnMgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgWk1fTUFYX1JYX1VSQl9OVU07IGkrKykKKyAgICB7CisgICAgICAgIG1hY3AtPldsYW5SeERhdGFVcmJbaV0gPSBVU0JfQUxMT0NfVVJCKDAsIEdGUF9LRVJORUwpOworCisgICAgICAgIGlmIChtYWNwLT5XbGFuUnhEYXRhVXJiW2ldID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBqOworCisgICAgICAgICAgICAvKiBGcmVlIGFsbCB1cmJzICovCisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgaTsgaisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVzYl9mcmVlX3VyYihtYWNwLT5XbGFuUnhEYXRhVXJiW2pdKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IFpNX01BWF9UWF9VUkJfTlVNOyBqKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdXNiX2ZyZWVfdXJiKG1hY3AtPldsYW5UeERhdGFVcmJbal0pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIEFsbG9jYXRlIFJlZ2lzdGVyIFJlYWQvV3JpdGUgVVNCICovCisgICAgbWFjcC0+UmVnT3V0VXJiID0gVVNCX0FMTE9DX1VSQigwLCBHRlBfS0VSTkVMKTsKKyAgICBtYWNwLT5SZWdJblVyYiA9IFVTQl9BTExPQ19VUkIoMCwgR0ZQX0tFUk5FTCk7CisKKyAgICByZXR1cm4gMTsKK30KKwordm9pZCB6ZkxueEZyZWVBbGxVcmJzKHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCkKK3sKKyAgICBpbnQgaTsKKworICAgIC8qIEZyZWUgYWxsIFR4IFVSQnMgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgWk1fTUFYX1RYX1VSQl9OVU07IGkrKykKKyAgICB7CisgICAgICAgIGlmIChtYWNwLT5XbGFuVHhEYXRhVXJiW2ldICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVzYl9mcmVlX3VyYihtYWNwLT5XbGFuVHhEYXRhVXJiW2ldKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIEZyZWUgYWxsIFJ4IFVSQnMgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgWk1fTUFYX1JYX1VSQl9OVU07IGkrKykKKyAgICB7CisgICAgICAgIGlmIChtYWNwLT5XbGFuUnhEYXRhVXJiW2ldICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVzYl9mcmVlX3VyYihtYWNwLT5XbGFuUnhEYXRhVXJiW2ldKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIEZyZWUgVVNCIFJlZ2lzdGVyIFJlYWQvV3JpdGUgVVJCICovCisgICAgdXNiX2ZyZWVfdXJiKG1hY3AtPlJlZ091dFVyYik7CisgICAgdXNiX2ZyZWVfdXJiKG1hY3AtPlJlZ0luVXJiKTsKK30KKwordm9pZCB6ZkxueFVubGlua0FsbFVyYnMoc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwKQoreworICAgIGludCBpOworCisgICAgLyogVW5saW5rIGFsbCBUeCBVUkJzICovCisgICAgZm9yIChpID0gMDsgaSA8IFpNX01BWF9UWF9VUkJfTlVNOyBpKyspCisgICAgeworICAgICAgICBpZiAobWFjcC0+V2xhblR4RGF0YVVyYltpXSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB1c2JfdW5saW5rX3VyYihtYWNwLT5XbGFuVHhEYXRhVXJiW2ldKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIFVubGluayBhbGwgUnggVVJCcyAqLworICAgIGZvciAoaSA9IDA7IGkgPCBaTV9NQVhfUlhfVVJCX05VTTsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKG1hY3AtPldsYW5SeERhdGFVcmJbaV0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdXNiX3VubGlua191cmIobWFjcC0+V2xhblJ4RGF0YVVyYltpXSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBVbmxpbmsgVVNCIFJlZ2lzdGVyIFJlYWQvV3JpdGUgVVJCICovCisgICAgdXNiX3VubGlua191cmIobWFjcC0+UmVnT3V0VXJiKTsKKworICAgIHVzYl91bmxpbmtfdXJiKG1hY3AtPlJlZ0luVXJiKTsKK30KKwordThfdCB6ZkxueEluaXRTZXR1cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3ApCit7CisgICAgLy91bnNpZ25lZCBjaGFyIGFkZHJbNl07CisKKyAgICAvL2luaXRfTVVURVgoJm1hY3AtPnBzX3NlbSk7CisgICAgLy9pbml0X01VVEVYKCZtYWNwLT5yZWdfc2VtKTsKKyAgICAvL2luaXRfTVVURVgoJm1hY3AtPmJjbl9zZW0pOworICAgIC8vaW5pdF9NVVRFWCgmbWFjcC0+Y29uZmlnX3NlbSk7CisKKyAgICBzcGluX2xvY2tfaW5pdCgmKG1hY3AtPmNzX2xvY2spKTsKKyNpZiAwCisgICAgLyogTUFDIGFkZHJlc3MgKi8KKyAgICB6ZmlXbGFuUXVlcnlNYWNBZGRyZXNzKGRldiwgYWRkcik7CisgICAgZGV2LT5kZXZfYWRkclswXSA9IGFkZHJbMF07CisgICAgZGV2LT5kZXZfYWRkclsxXSA9IGFkZHJbMV07CisgICAgZGV2LT5kZXZfYWRkclsyXSA9IGFkZHJbMl07CisgICAgZGV2LT5kZXZfYWRkclszXSA9IGFkZHJbM107CisgICAgZGV2LT5kZXZfYWRkcls0XSA9IGFkZHJbNF07CisgICAgZGV2LT5kZXZfYWRkcls1XSA9IGFkZHJbNV07CisjZW5kaWYKKyNpZiBXSVJFTEVTU19FWFQgPiAxMgorICAgIGRldi0+d2lyZWxlc3NfaGFuZGxlcnMgPSAoc3RydWN0IGl3X2hhbmRsZXJfZGVmICopJnA4MDIxMXdleHRfaGFuZGxlcl9kZWY7CisjZW5kaWYKKworICAgIGRldi0+b3BlbiA9IHVzYmRydl9vcGVuOworICAgIGRldi0+aGFyZF9zdGFydF94bWl0ID0gdXNiZHJ2X3htaXRfZnJhbWU7CisgICAgZGV2LT5zdG9wID0gdXNiZHJ2X2Nsb3NlOworICAgIGRldi0+Y2hhbmdlX210dSA9ICZ1c2JkcnZfY2hhbmdlX210dTsKKyAgICBkZXYtPmdldF9zdGF0cyA9IHVzYmRydl9nZXRfc3RhdHM7CisgICAgZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSB1c2JkcnZfc2V0X211bHRpOworICAgIGRldi0+c2V0X21hY19hZGRyZXNzID0gdXNiZHJ2X3NldF9tYWM7CisgICAgZGV2LT5kb19pb2N0bCA9IHVzYmRydl9pb2N0bDsKKworICAgIGRldi0+ZmxhZ3MgfD0gSUZGX01VTFRJQ0FTVDsKKworICAgIGRldi0+ZGV2X2FkZHJbMF0gPSAweDAwOworICAgIGRldi0+ZGV2X2FkZHJbMV0gPSAweDAzOworICAgIGRldi0+ZGV2X2FkZHJbMl0gPSAweDdmOworICAgIGRldi0+ZGV2X2FkZHJbM10gPSAweDExOworICAgIGRldi0+ZGV2X2FkZHJbNF0gPSAweDIyOworICAgIGRldi0+ZGV2X2FkZHJbNV0gPSAweDMzOworCisgICAgLyogSW5pdGlhbGl6ZSBIZWFydCBCZWF0IHRpbWVyICovCisgICAgaW5pdF90aW1lcigmbWFjcC0+aGJUaW1lcjEwbXMpOworICAgIG1hY3AtPmhiVGltZXIxMG1zLmRhdGEgPSAodW5zaWduZWQgbG9uZylkZXY7CisgICAgbWFjcC0+aGJUaW1lcjEwbXMuZnVuY3Rpb24gPSAodm9pZCAqKSZ6ZkxueDEwbXNUaW1lcjsKKworICAgIC8qIEluaXRpYWxpemUgV0RTIGFuZCBWQVAgZGF0YSBzdHJ1Y3R1cmUgKi8KKyAgICAvL3pmSW5pdFdkc1N0cnVjdCgpOworICAgIHpmTG54SW5pdFZhcFN0cnVjdCgpOworCisgICAgcmV0dXJuIDE7Cit9CisKK3U4X3QgemZMbnhDbGVhclN0cnVjdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICB1MTZfdCBpaTsKKyAgICB1MTZfdCBUeFFDbnQ7CisKKyAgICBUeFFDbnQgPSB6ZkxueENoZWNrVHhCdWZmZXJDbnQoZGV2KTsKKworICAgIHByaW50ayhLRVJOX0VSUiAiVHhRQ250OiAlZFxuIiwgVHhRQ250KTsKKworICAgIGZvcihpaSA9IDA7IGlpIDwgVHhRQ250OyBpaSsrKQorICAgIHsKKyAgICAgICAgVXNiVHhRX3QgKlR4USA9IHpmTG54R2V0VXNiVHhCdWZmZXIoZGV2KTsKKworICAgICAgICBwcmludGsoS0VSTl9FUlIgImRldl9rZnJlZV9za2JfYW55XG4iKTsKKyAgICAgICAgLyogRnJlZSBidWZmZXIgKi8KKyAgICAgICAgZGV2X2tmcmVlX3NrYl9hbnkoVHhRLT5idWYpOworICAgIH0KKworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvdXNiZHJ2LmggYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy91c2JkcnYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTFiM2IzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvdXNiZHJ2LmgKQEAgLTAsMCArMSwyNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBBdGhlcm9zIENvbW11bmljYXRpb25zIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2R1bGUgTmFtZSA6IHVzYmRydi5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEFic3RyYWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICBUaGlzIG1vZHVsZSBjb250YWlucyBuZXR3b3JrIGludGVyZmFjZSB1cC9kb3duIHJlbGF0ZWQgZGVmaW5pdGlvbiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE5PVEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICBQbGF0Zm9ybSBkZXBlbmRlbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfVVNCRFJWX0gKKyNkZWZpbmUgX1VTQkRSVl9ICisKKyNkZWZpbmUgV0xBTl9VU0IgICAgMAorI2RlZmluZSBXTEFOX1BDSSAgICAxCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisKKyNpbmNsdWRlICJ6ZGNvbXBhdC5oIgorCisjaW5jbHVkZSAib2FsX2R0LmgiCisjaW5jbHVkZSAib2FsX21hcmMuaCIKKyNpbmNsdWRlICI4MDIxMWNvcmUvcHViX3pmaS5oIgorLy8jaW5jbHVkZSAicHViX3pmdy5oIgorI2luY2x1ZGUgIjgwMjExY29yZS9wdWJfdXNiLmgiCisKKyNpbmNsdWRlIDxsaW51eC91c2IuaD4KKy8qIFBsZWFzZSBpbmNsdWRlIGhlYWRlciBmaWxlcyBmb3IgZGV2aWNlIHR5cGUgaW4gdGhlIGJlZ2lubmluZyBvZiB0aGlzIGZpbGUgKi8KKyNkZWZpbmUgdXJiX3QgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB1cmIKKworI2RlZmluZSB1c2JfY29tcGxldGVfdCAgICAgICAgICAgICAgdXNiX2NvbXBsZXRlX3QKKyNkZWZpbmUgcGlwZV90ICAgICAgICAgICAgICAgICAgICAgIHUzMl90CisKKy8qIFVTQiBFbmRwb2ludCBkZWZpbml0aW9uICovCisjZGVmaW5lIFVTQl9XTEFOX1RYX1BJUEUgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgVVNCX1dMQU5fUlhfUElQRSAgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBVU0JfUkVHX0lOX1BJUEUgICAgICAgICAgICAgICAgICAgICAzCisjZGVmaW5lIFVTQl9SRUdfT1VUX1BJUEUgICAgICAgICAgICAgICAgICAgIDQKKworI2lmIChXTEFOX0hPU1RJRiA9PSBXTEFOX1VTQikKKyNpbmNsdWRlIDxsaW51eC91c2IuaD4KKyNlbmRpZgorCisjaWZkZWYgWk1fSE9TVEFQRF9TVVBQT1JUCisjaW5jbHVkZSAiYXRocl9jb21tb24uaCIKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqCQlEZXNjcmlwdG9yIERhdGEgU3RydWN0dXJlCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdHJ1Y3QgZHJpdmVyX3N0YXRzIHsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBuZXRfc3RhdHM7Cit9OworCisjZGVmaW5lIFpNX01BWF9SWF9CVUZGRVJfU0laRSAgICAgICAgICAgICAgIDgxOTIKKworI2lmIFpNX1VTQl9UWF9TVFJFQU1fTU9ERSA9PSAxCisjZGVmaW5lIFpNX01BWF9UWF9BR0dSRUdBVEVfTlVNICAgICAgICAgICAgIDQKKyNkZWZpbmUgWk1fVVNCX1RYX0JVRl9TSVpFICAgICAgICAgICAgICAgICAgODA5NgorI2RlZmluZSBaTV9NQVhfVFhfVVJCX05VTSAgICAgICAgICAgICAgICAgICA0CisjZWxzZQorI2RlZmluZSBaTV9VU0JfVFhfQlVGX1NJWkUgICAgICAgICAgICAgICAgICAyMDQ4CisjZGVmaW5lIFpNX01BWF9UWF9VUkJfTlVNICAgICAgICAgICAgICAgICAgIDgKKyNlbmRpZgorI2RlZmluZSBaTV9VU0JfUkVHX01BWF9CVUZfU0laRSAgICAgICAgICAgICA2NAorI2RlZmluZSBaTV9NQVhfUlhfVVJCX05VTSAgICAgICAgICAgICAgICAgICAxNgorI2RlZmluZSBaTV9NQVhfVFhfQlVGX05VTSAgICAgICAgICAgICAgICAgICAxMjgKKwordHlwZWRlZiBzdHJ1Y3QgVXNiVHhRCit7CisgICAgemJ1Zl90ICpidWY7CisgICAgdThfdCBoZHJbODBdOworICAgIHUxNl90IGhkcmxlbjsKKyAgICB1OF90IHNuYXBbOF07CisgICAgdTE2X3Qgc25hcExlbjsKKyAgICB1OF90IHRhaWxbMTZdOworICAgIHUxNl90IHRhaWxMZW47CisgICAgdTE2X3Qgb2Zmc2V0OworfSBVc2JUeFFfdDsKKworCitzdHJ1Y3QgemRhcF9pb2N0bCB7CisJdTE2X3QgY21kOyAgICAgICAgICAgICAgICAvKiBDb21tYW5kIHRvIHJ1biAqLworCXUzMl90IGFkZHI7ICAgICAgICAgICAgICAgIC8qIExlbmd0aCBvZiB0aGUgZGF0YSBidWZmZXIgKi8KKwl1MzJfdCB2YWx1ZTsgICAgICAgICAgICAgIC8qIFBvaW50ZXIgdG8gdGhlIGRhdGEgYnVmZmVyICovCisJdThfdAlkYXRhWzB4MTAwXTsKK307CisKKyNkZWZpbmUgWk1fT0FMX01BWF9TVEFfU1VQUE9SVCAxNgorCitzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUKK3sKKwkvL2xpbnV4IHVzZWQKKwlzdHJ1Y3QgbmV0X2RldmljZSAJKmRldmljZTsKKyNpZiAoV0xBTl9IT1NUSUYgPT0gV0xBTl9QQ0kpCisJc3RydWN0IHBjaV9kZXYgCQkqcGRldjsKKyNlbmRpZgorI2lmIChXTEFOX0hPU1RJRiA9PSBXTEFOX1VTQikKKwlzdHJ1Y3QgdXNiX2RldmljZQkqdWRldjsKKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAgICAqaW50ZXJmYWNlOworI2VuZGlmCisJc3RydWN0IGRyaXZlcl9zdGF0cyBkcnZfc3RhdHM7CisJY2hhciBpZm5hbWVbSUZOQU1TSVpdOworCWludAkgICAgICAgICAgICAgICAgdXNpbmdfZGFjOworCXU4X3QJCQlyZXZfaWQ7CQkvKiBhZGFwdGVyIFBDSSByZXZpc2lvbiBJRCAqLworCXJ3bG9ja190IAkJaXNvbGF0ZV9sb2NrOworICAgIHNwaW5sb2NrX3QgICAgICBjc19sb2NrOworCWludCAJCQlkcml2ZXJfaXNvbGF0ZWQ7CisjaWYgKFdMQU5fSE9TVElGID09IFdMQU5fUENJKQorCXZvaWQJCQkqcmVncDsKKyNlbmRpZgorCisgICAgICAgIC8qIHRpbWVyIGZvciBoZWFydCBiZWF0ICovCisJc3RydWN0IHRpbWVyX2xpc3QgaGJUaW1lcjEwbXM7CisKKwkvKiBGb3IgZHJpdmVyIGNvcmUgKi8KKwl2b2lkKiB3ZDsKKworI2lmIChXTEFOX0hPU1RJRiA9PSBXTEFOX1VTQikKKwl1OF90ICAgICAgICAgICAgICAgICAgICB0eFVzYkJ1ZltaTV9NQVhfVFhfVVJCX05VTV1bWk1fVVNCX1RYX0JVRl9TSVpFXTsKKwl1OF90ICAgICAgICAgICAgICAgICAgICByZWdVc2JSZWFkQnVmW1pNX1VTQl9SRUdfTUFYX0JVRl9TSVpFXTsKKwl1OF90ICAgICAgICAgICAgICAgICAgICByZWdVc2JXcml0ZUJ1ZltaTV9VU0JfUkVHX01BWF9CVUZfU0laRV07CisJdXJiX3QJCQkqV2xhblR4RGF0YVVyYltaTV9NQVhfVFhfVVJCX05VTV07CisJdXJiX3QJCQkqV2xhblJ4RGF0YVVyYltaTV9NQVhfUlhfVVJCX05VTV07CisJdXJiX3QJCQkqUmVnT3V0VXJiOworCXVyYl90CQkJKlJlZ0luVXJiOworCVVzYlR4UV90ICAgICAgICAgICAgICAgIFVzYlR4QnVmUVtaTV9NQVhfVFhfQlVGX05VTV07CisJemJ1Zl90ICAgICAgICAgICAgICAgICAgKlVzYlJ4QnVmUVtaTV9NQVhfUlhfVVJCX05VTV07CisgICAgICAgIHUxNl90ICAgICAgICAgICAgICAgICAgIFR4QnVmSGVhZDsKKyAgICAgICAgdTE2X3QgICAgICAgICAgICAgICAgICAgVHhCdWZUYWlsOworICAgICAgICB1MTZfdCAgICAgICAgICAgICAgICAgICBUeEJ1ZkNudDsKKyAgICAgICAgdTE2X3QgICAgICAgICAgICAgICAgICAgVHhVcmJIZWFkOworICAgICAgICB1MTZfdCAgICAgICAgICAgICAgICAgICBUeFVyYlRhaWw7CisgICAgICAgIHUxNl90ICAgICAgICAgICAgICAgICAgIFR4VXJiQ250OworICAgICAgICB1MTZfdCAgICAgICAgICAgICAgICAgICBSeEJ1ZkhlYWQ7CisgICAgICAgIHUxNl90ICAgICAgICAgICAgICAgICAgIFJ4QnVmVGFpbDsKKyAgICAgICAgdTE2X3QgICAgICAgICAgICAgICAgICAgUnhCdWZDbnQ7CisjZW5kaWYKKworI2lmIFpNX1VTQl9TVFJFQU1fTU9ERSA9PSAxCisgICAgICAgIHpidWZfdCAgICAgICAgICAgICAgICAgICpyZWFtaW5fYnVmOworI2VuZGlmCisKKyNpZmRlZiBaTV9IT1NUQVBEX1NVUFBPUlQKKyAgICAgICAgc3RydWN0IGF0aHJfd2xhbl9wYXJhbSAgYXRocl93cGFfcmVxOworI2VuZGlmCisgICAgICAgIHN0cnVjdCBzb2NrICAgICAgICAgICAgICpuZXRsaW5rX3NrOworICAgICAgICB1OF90ICAgICAgICAgICAgRGV2aWNlT3BlbmVkOyAvL0NXWWFuZygrKQorICAgICAgICB1OF90ICAgICAgICAgICAgc3VwSWVbNTBdOworICAgICAgICB1OF90ICAgICAgICAgICAgc3VwTGVuOworICAgICAgICBzdHJ1Y3QgaWVlZTgwMjExcmVxX3dwYWllIHN0YXdwYWllW1pNX09BTF9NQVhfU1RBX1NVUFBPUlRdOworICAgICAgICB1OF90ICAgICAgICAgICAgZm9yd2FyZE1nbXQ7CisKKyAgICAgICAgc3RydWN0IHpmQ2JVc2JGdW5jVGJsIHVzYkNiRnVuY3Rpb25zOworCisgICAgICAgIC8qIEZvciBrZXZlbnRkICovCisgICAgICAgIHUzMl90ICAgICAgICAgICAgICAgICAgIGZsYWdzOworICAgICAgICB1bnNpZ25lZCBsb25nICAgICAgICAgICBrZXZlbnRfZmxhZ3M7CisgICAgICAgIHUxNl90ICAgICAgICAgICAgICAgICAgIGtldmVudF9yZWFkeTsKKworICAgICAgICBzdHJ1Y3Qgc2VtYXBob3JlICAgICAgICBpb2N0bF9zZW07CisgICAgICAgIHN0cnVjdCB3b3JrX3N0cnVjdCAgICAgIGtldmVudDsKKyAgICAgICAgd2FpdF9xdWV1ZV9oZWFkX3QgICAgICAgd2FpdF9xdWV1ZV9ldmVudDsKKyNpZmRlZiBaTV9IQUxQTFVTX0xPQ0sKKyAgICAgICAgdW5zaWduZWQgbG9uZyAgICAgICAgICAgaGFsX2lycUZsYWc7CisjZW5kaWYKKyAgICAgICAgdTE2X3QgICAgICAgICAgICAgICAgICAgYWRhcHRlclN0YXRlOworfTsKKworLyogV0RTICovCisjZGVmaW5lIFpNX1dEU19QT1JUX05VTUJFUiAgNgorCitzdHJ1Y3QgenNXZHNTdHJ1Y3QKK3sKKyAgICBzdHJ1Y3QgbmV0X2RldmljZSogZGV2OworICAgIHUxNl90IG9wZW5GbGFnOworfTsKKworLyogVkFQICovCisjZGVmaW5lIFpNX1ZBUF9QT1JUX05VTUJFUiAgNworCitzdHJ1Y3QgenNWYXBTdHJ1Y3QKK3sKKyAgICBzdHJ1Y3QgbmV0X2RldmljZSogZGV2OworICAgIHUxNl90IG9wZW5GbGFnOworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBaTV9JT0NUTF9SRUdfUkVBRAkJCTB4MDEKKyNkZWZpbmUgWk1fSU9DVExfUkVHX1dSSVRFCQkJMHgwMgorI2RlZmluZSBaTV9JT0NUTF9NRU1fRFVNUAkJCTB4MDMKKyNkZWZpbmUgWk1fSU9DVExfUkVHX0RVTVAJCQkweDA1CisjZGVmaW5lIFpNX0lPQ1RMX1RYRF9EVU1QIAkJCTB4MDYKKyNkZWZpbmUgWk1fSU9DVExfUlhEX0RVTVAgCQkJMHgwNworI2RlZmluZSBaTV9JT0NUTF9NRU1fUkVBRAkJCTB4MEIKKyNkZWZpbmUgWk1fSU9DVExfTUVNX1dSSVRFCQkJMHgwQworI2RlZmluZSBaTV9JT0NUTF9ETUFfVEVTVCAgICAgICAgICAgMHgxMAorI2RlZmluZSBaTV9JT0NUTF9SRUdfVEVTVCAgICAgICAgICAgMHgxMQorI2RlZmluZSBaTV9JT0NUTF9URVNUICAgICAgICAgICAgICAgMHg4MAorI2RlZmluZSBaTV9JT0NUTF9UQUxMWSAgICAgICAgICAgICAgMHg4MSAvL0NXWWFuZygrKQorI2RlZmluZSBaTV9JT0NUTF9SVFMgICAgICAgICAgICAgICAgMHhBMAorI2RlZmluZSBaTV9JT0NUTF9NSVhfTU9ERSAgICAgICAgICAgMHhBMQorI2RlZmluZSBaTV9JT0NUTF9GUkFHICAgICAgICAgICAgICAgMHhBMgorI2RlZmluZSBaTV9JT0NUTF9TQ0FOICAgICAgICAgICAgICAgMHhBMworI2RlZmluZSBaTV9JT0NUTF9LRVkgICAgICAgICAgICAgICAgMHhBNAorI2RlZmluZSBaTV9JT0NUTF9SQVRFICAgICAgICAgICAgICAgMHhBNQorI2RlZmluZSBaTV9JT0NUTF9FTkNSWVBUSU9OX01PREUgICAgMHhBNgorI2RlZmluZSBaTV9JT0NUTF9HRVRfVFhDTlQgICAgICAgICAgMHhBNworI2RlZmluZSBaTV9JT0NUTF9HRVRfREVBR0dfQ05UICAgICAgMHhBOAorI2RlZmluZSBaTV9JT0NUTF9EVVJBVElPTl9NT0RFICAgICAgMHhBOQorI2RlZmluZSBaTV9JT0NUTF9TRVRfQUVTX0tFWSAgICAgICAgMHhBQQorI2RlZmluZSBaTV9JT0NUTF9TRVRfQUVTX01PREUgICAgICAgMHhBQgorI2RlZmluZSBaTV9JT0NUTF9TSUdOQUxfU1RSRU5HVEggICAgMHhBQyAvL0NXWWFuZygrKQorI2RlZmluZSBaTV9JT0NUTF9TSUdOQUxfUVVBTElUWSAgICAgMHhBRCAvL0NXWWFuZygrKQorI2RlZmluZSBaTV9JT0NUTF9TRVRfUElCU1NfTU9ERSAgICAgMHhBRQorCisjZGVmaW5lCVpEQVBJT0NUTAkJCQlTSU9DREVWUFJJVkFURQorCitlbnVtIGRldlN0YXRlIHsKKyAgICBPcGVuZWQsCisgICAgRW5hYmxlZCwKKyAgICBEaXNhYmxlZCwKKyAgICBDbG9zZWQKK307CisKKyNlbmRpZgkvKiBfVVNCRFJWX0ggKi8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvd3JhcF9idWYuYyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL3dyYXBfYnVmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjI0OTZhMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL3dyYXBfYnVmLmMKQEAgLTAsMCArMSwxMTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBBdGhlcm9zIENvbW11bmljYXRpb25zIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2R1bGUgTmFtZSA6IHdyYXBfYnVmLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEFic3RyYWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICBUaGlzIG1vZHVsZSBjb250YWlucyB3cmFwcGVyIGZ1bmN0aW9ucyBmb3IgYnVmZmVyIG1hbmFnZW1lbnQgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE5PVEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICBQbGF0Zm9ybSBkZXBlbmRlbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIm9hbF9kdC5oIgorI2luY2x1ZGUgInVzYmRydi5oIgorCisKKyNpbmNsdWRlIDxsaW51eC9uZXRsaW5rLmg+CisKKyNpZiBXSVJFTEVTU19FWFQgPiAxMgorI2luY2x1ZGUgPG5ldC9pd19oYW5kbGVyLmg+CisjZW5kaWYKKworCisKKy8qIENhbGxlZCB0byBhbGxvY2F0ZSBidWZmZXIsIG11c3QgcmV0dXJuIGEgY29udGludWUgYnVmZmVyIHNwYWNlICovCit6YnVmX3QqIHpmd0J1ZkFsbG9jYXRlKHpkZXZfdCogZGV2LCB1MTZfdCBsZW4pCit7CisgICAgemJ1Zl90KiBidWY7CisKKyAgICAvKiBBbGxvY2F0ZSBTS0IgZm9yIHBhY2tldCovCisgICAgYnVmID0gZGV2X2FsbG9jX3NrYihsZW4pOworCisgICAgcmV0dXJuIGJ1ZjsKK30KKworCisvKiBDYWxsZWQgdG8gZnJlZSBidWZmZXIsIHJlcGxhY2UgYmVsb3cgMyBmdW5jdGlvbnMgKi8KK3ZvaWQgemZ3QnVmRnJlZSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IHN0YXR1cykKK3sKKyAgICBkZXZfa2ZyZWVfc2tiX2FueShidWYpOworfQorCisvKiBDYWxsZWQgdG8gYWRqdXN0IGJ1ZmZlciBzaXplIGFuZCBoZWFkIHBvaW50ZXIgKi8KK3UxNl90IHpmd0J1ZlJlbW92ZUhlYWQoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCBzaXplKQoreworICAgIC8vem1fYXNzZXJ0KGJ1Zi0+bGVuID4gc2l6ZSk7CisKKyAgICBidWYtPmRhdGEgKz0gc2l6ZTsKKyAgICBidWYtPmxlbiAtPSBzaXplOworICAgIHJldHVybiAwOworfQorCisKKworCisvKiByZXR1cm4gdGFpbCBpZiBoZWFkPT1OVUxMLCBjYWxsZWQgdG8gY2hhaW4gbXVsdGlwbGUgYnVmZmVyIHRvZ2V0aGVyICovCisvKiBVc2VkIHRvIGNoYWluIFJ4IGJ1ZmZlciB0byBmb3JtIGEgZnJhbWUuIGlmIHRoZSBwcmVwYXJlZCBSeCBidWZmZXIgICovCisvKiBpcyBncmVhdGVyIHRoYW4gYW4gZXRoZXJuZXQgZnJhbWUoMTUxOCszMiBieXRlKSwgdGhlbiB0aGlzIGZ1bmN0aW9uICAgICovCisvKiB3aWxsIG9ubHkgYmUgY2FsbGVkIHdpdGggaGVhZD1OVUxMLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCit1MTZfdCB6ZndCdWZDaGFpbih6ZGV2X3QqIGRldiwgemJ1Zl90KiogaGVhZCwgemJ1Zl90KiB0YWlsKQoreworCisgICAgKmhlYWQgPSB0YWlsOworICAgIHJldHVybiAwOworfQorCisKKy8qIENhbGxlZCB3aGVuIGRvaW5nIGluZnJhLWJzcyBmb3J3YXJkaW5nICovCit1MTZfdCB6ZndCdWZDb3B5KHpkZXZfdCogZGV2LCB6YnVmX3QqIGRzdCwgemJ1Zl90KiBzcmMpCit7CisgICAgbWVtY3B5KGRzdC0+ZGF0YSwgc3JjLT5kYXRhLCBzcmMtPmxlbik7CisgICAgZHN0LT50YWlsID0gZHN0LT5kYXRhOworICAgIHNrYl9wdXQoZHN0LCBzcmMtPmxlbik7CisgICAgcmV0dXJuIDA7Cit9CisKKworLyogQ2FsbGVkIHRvIGFkanVzdCBidWZmZXIgc2l6ZSBhbmQgdGFpbCBwb2ludGVyICovCit1MTZfdCB6ZndCdWZTZXRTaXplKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3Qgc2l6ZSkKK3sKKyNpZmRlZiBORVRfU0tCVUZGX0RBVEFfVVNFU19PRkZTRVQKKyAgICBidWYtPnRhaWwgPSAwOworICAgIGJ1Zi0+bGVuID0gMDsKKyNlbHNlCisgICAgYnVmLT50YWlsID0gYnVmLT5kYXRhOworICAgIGJ1Zi0+bGVuID0gMDsKKyNlbmRpZgorCisgICAgc2tiX3B1dChidWYsIHNpemUpOworICAgIHJldHVybiAwOworfQorCit1MTZfdCB6ZndCdWZHZXRTaXplKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZikKK3sKKyAgICByZXR1cm4gYnVmLT5sZW47Cit9CisKK3ZvaWQgemZ3Q29weUJ1ZkNvbnRleHQoemRldl90KiBkZXYsIHpidWZfdCogc291cmNlLCB6YnVmX3QqIGRzdCkKK3sKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzL3dyYXBfZGJnLmMgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy93cmFwX2RiZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzNzYzZDkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy93cmFwX2RiZy5jCkBAIC0wLDAgKzEsMTAxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggQXRoZXJvcyBDb21tdW5pY2F0aW9ucyBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKy8qICBNb2R1bGUgTmFtZSA6IHdyYXBfZGJnLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEFic3RyYWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICBUaGlzIG1vZHVsZSBjb250YWlucyB3cmFwcGVyIGZ1bmN0aW9ucyBmb3IgZGVidWcgZnVuY3Rpb25zICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE5PVEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICBQbGF0Zm9ybSBkZXBlbmRlbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIm9hbF9kdC5oIgorI2luY2x1ZGUgInVzYmRydi5oIgorCisjaW5jbHVkZSA8bGludXgvbmV0bGluay5oPgorCisjaWYgV0lSRUxFU1NfRVhUID4gMTIKKyNpbmNsdWRlIDxuZXQvaXdfaGFuZGxlci5oPgorI2VuZGlmCisKK3ZvaWQgemZ3RHVtcEJ1Zih6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpCit7CisgICAgdTE2X3QgaTsKKworICAgIGZvciAoaT0wOyBpPGJ1Zi0+bGVuOyBpKyspCisgICAgeworICAgICAgICBwcmludGsoIiUwMnggIiwgKigoKHU4X3QqKWJ1Zi0+ZGF0YSkraSkpOworICAgICAgICBpZiAoKGkmMHhmKT09MHhmKQorICAgICAgICB7CisgICAgICAgICAgICBwcmludGsoIlxuIik7CisgICAgICAgIH0KKyAgICB9CisgICAgcHJpbnRrKCJcbiIpOworfQorCisKK3ZvaWQgemZ3RGJnUmVhZFJlZ0RvbmUoemRldl90KiBkZXYsIHUzMl90IGFkZHIsIHUzMl90IHZhbCkKK3sKKyAgICBwcmludGsoIlJlYWQgYWRkcjoleCA9ICV4XG4iLCBhZGRyLCB2YWwpOworfQorCit2b2lkIHpmd0RiZ1dyaXRlUmVnRG9uZSh6ZGV2X3QqIGRldiwgdTMyX3QgYWRkciwgdTMyX3QgdmFsKQoreworICAgIHByaW50aygiV3JpdGUgYWRkcjoleCA9ICV4XG4iLCBhZGRyLCB2YWwpOworfQorCit2b2lkIHpmd0RiZ1JlYWRUYWxseURvbmUoemRldl90KiBkZXYpCit7CisgICAgLy9wcmludGsoIlJlYWQgVGFsbCBEb25lXG4iKTsKK30KKwordm9pZCB6ZndEYmdXcml0ZUVlcHJvbURvbmUoemRldl90KiBkZXYsIHUzMl90IGFkZHIsIHUzMl90IHZhbCkKK3sKK30KKwordm9pZCB6ZndEYmdRdWVyeUh3VHhCdXN5RG9uZSh6ZGV2X3QqIGRldiwgdTMyX3QgdmFsKQoreworfQorCisvL0ZvciBFdmwgKysKK3ZvaWQgemZ3RGJnUmVhZEZsYXNoRG9uZSh6ZGV2X3QqIGRldiwgdTMyX3QgYWRkciwgdTMyX3QqIHJzcGRhdGEsIHUzMl90IGRhdGFsZW4pCit7CisgICAgcHJpbnRrKCJSZWFkIEZsYXNoIGFkZHI6JXggbGVuZ3RoOiV4XG4iLCBhZGRyLCBkYXRhbGVuKTsKK30KKwordm9pZCB6ZndEYmdQcm9ncmFtZUZsYXNoRG9uZSh6ZGV2X3QqIGRldikKK3sKKyAgICBwcmludGsoIlByb2dyYW0gRmxhc2ggRG9uZVxuIik7Cit9CisKK3ZvaWQgemZ3RGJnUHJvZ3JhbWVGbGFzaENoa0RvbmUoemRldl90KiBkZXYpCit7CisgICAgcHJpbnRrKCJQcm9ncmFtIEZsYXNoIERvbmVcbiIpOworfQorCit2b2lkIHpmd0RiZ0dldEZsYXNoQ2hrU3VtRG9uZSh6ZGV2X3QqIGRldiwgdTMyX3QqIHJzcGRhdGEpCit7CisgICAgcHJpbnRrKCJHZXQgRmxhc2ggQ2hrU3VtIERvbmVcbiIpOworfQorCit2b2lkIHpmd0RiZ0Rvd25sb2FkRndJbml0RG9uZSh6ZGV2X3QqIGRldikKK3sKKyAgICBwcmludGsoIkRvd25sb2FkIEZXIEluaXQgRG9uZVxuIik7Cit9CisvL0ZvciBFdmwgLS0KKworLyogTGVhdmUgYW4gZW1wdHkgbGluZSBiZWxvdyB0byByZW1vdmUgd2FybmluZyBtZXNzYWdlIG9uIHNvbWUgY29tcGlsZXIgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzL3dyYXBfZXYuYyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL3dyYXBfZXYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjZiNzg3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvd3JhcF9ldi5jCkBAIC0wLDAgKzEsMjgzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggQXRoZXJvcyBDb21tdW5pY2F0aW9ucyBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kdWxlIE5hbWUgOiB3cmFwX2V2LmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEFic3RyYWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICBUaGlzIG1vZHVsZSBjb250YWlucyB3cmFwcGVyIGZ1bmN0aW9ucyBmb3IgZXZlbnRzICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE5PVEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICBQbGF0Zm9ybSBkZXBlbmRlbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIm9hbF9kdC5oIgorI2luY2x1ZGUgInVzYmRydi5oIgorCisjaW5jbHVkZSA8bGludXgvbmV0bGluay5oPgorCisjaWYgV0lSRUxFU1NfRVhUID4gMTIKKyNpbmNsdWRlIDxuZXQvaXdfaGFuZGxlci5oPgorI2VuZGlmCisKKworLyoqKioqIE1hbmFnZW1lbnQgKioqKiovCit1MTZfdCB6ZkxueEF1dGhOb3RpZnkoemRldl90KiBkZXYsIHUxNl90KiBtYWNBZGRyKQoreworICAgIHJldHVybiAwOworfQorCit1MTZfdCB6ZkxueEFzb2NOb3RpZnkoemRldl90KiBkZXYsIHUxNl90KiBtYWNBZGRyLCB1OF90KiBib2R5LCB1MTZfdCBib2R5U2l6ZSwgdTE2X3QgcG9ydCkKK3sKKy8vI2lmZGVmIFpNX0hPU1RBUERfU1VQUE9SVAorICAgIHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IGRldi0+bWxfcHJpdjsKKyAgICB1bmlvbiBpd3JlcV9kYXRhIHdyZXE7CisgICAgdThfdCAqYWRkciA9ICh1OF90ICopIG1hY0FkZHI7CisgICAgdTE2X3QgaSwgajsKKworICAgIG1lbXNldCgmd3JlcSwgMCwgc2l6ZW9mKHdyZXEpKTsKKyAgICBtZW1jcHkod3JlcS5hZGRyLnNhX2RhdGEsIG1hY0FkZHIsIEVUSF9BTEVOKTsKKyAgICB3cmVxLmFkZHIuc2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOworICAgIHByaW50ayhLRVJOX0RFQlVHICJqb2luX2V2ZW50IG9mIE1BQzogJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisgICAgICAgICAgICBhZGRyWzBdLCBhZGRyWzFdLCBhZGRyWzJdLCBhZGRyWzNdLCBhZGRyWzRdLCBhZGRyWzVdKTsKKworICAgIGZvcihpID0gMDsgaSA8IFpNX09BTF9NQVhfU1RBX1NVUFBPUlQ7IGkrKykKKyAgICB7CisgICAgICAgIGZvcihqID0gMDsgaiA8IElFRUU4MDIxMV9BRERSX0xFTjsgaisrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoKG1hY3AtPnN0YXdwYWllW2ldLndwYV9tYWNhZGRyW2pdICE9IDApICYmCisgICAgICAgICAgICAgICAgKG1hY3AtPnN0YXdwYWllW2ldLndwYV9tYWNhZGRyW2pdICE9IGFkZHJbal0pKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmIChqID09IDYpCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKGkgPCBaTV9PQUxfTUFYX1NUQV9TVVBQT1JUKQorICAgIHsKKyAgICAgICAgLy9wcmludGsoInpmd0Fzb2NOb3RpZnkgLSBzdG9yZSB3cGEgaWUgaW4gbWFjcCwgaW5kZXggPSAlZFxuIiwgaSk7CisgICAgICAgIG1lbWNweShtYWNwLT5zdGF3cGFpZVtpXS53cGFfbWFjYWRkciwgbWFjQWRkciwgSUVFRTgwMjExX0FERFJfTEVOKTsKKyAgICAgICAgbWVtY3B5KG1hY3AtPnN0YXdwYWllW2ldLndwYV9pZSwgYm9keSwgYm9keVNpemUpOworICAgIH0KKyAgICAvL2lmKG1hY3AtPmNhcmRTZXR0aW5nLkJzc1R5cGUgPT0gSU5GUkFTVFJVQ1RVUkVfQlNTKSB7CisgICAgLy8gICAgICAgICAgICAvL3dpcmVsZXNzX3NlbmRfZXZlbnQobWFjcC0+ZGV2aWNlLCBTSU9DR0lXU0NBTiwgJndyZXEsIE5VTEwpOworICAgIC8vICAgIHdpcmVsZXNzX3NlbmRfZXZlbnQobWFjcC0+ZGV2aWNlLCBTSU9DR0lXQVAsICZ3cmVxLCBOVUxMKTsKKyAgICAvL30KKyNpZiBXSVJFTEVTU19FWFQgPj0gMTUKKyAgICAvL2Vsc2UgaWYobWFjcC0+Y2FyZFNldHRpbmcuQnNzVHlwZSA9PSBBUF9CU1MpIHsKKy8vICAgICAgICBpZiAocG9ydCA9PSAwKQorLy8gICAgICAgIHsKKyAgICAgICAgICAgIHdpcmVsZXNzX3NlbmRfZXZlbnQoZGV2LCBJV0VWUkVHSVNURVJFRCwgJndyZXEsIE5VTEwpOworLy8gICAgICAgIH0KKy8vICAgICAgICBlbHNlCisvLyAgICAgICAgeworLy8gICAgICAgICAgICAvKiBDaGVjayB3aGV0aGVyIHRoZSBWQVAgZGV2aWNlIGlzIHZhbGlkICovCisvLyAgICAgICAgICAgIGlmICh2YXBbcG9ydF0uZGV2ICE9IE5VTEwpCisvLyAgICAgICAgICAgIHsKKy8vICAgICAgICAgICAgICAgIHdpcmVsZXNzX3NlbmRfZXZlbnQodmFwW3BvcnRdLmRldiwgSVdFVlJFR0lTVEVSRUQsICZ3cmVxLCBOVUxMKTsKKy8vICAgICAgICAgICAgfQorLy8gICAgICAgICAgICBlbHNlCisvLyAgICAgICAgICAgIHsKKy8vICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiQ2FuJyBmaW5kIGEgdmFsaWQgVkFQIGRldmljZSwgcG9ydDogJWRcbiIsIHBvcnQpOworLy8gICAgICAgICAgICB9CisvLyAgICAgICAgfQorICAgIC8vfQorI2VuZGlmCisvLyNlbmRpZgorCisgICAgcmV0dXJuIDA7Cit9CisKKworLyogTm90aWZpY2F0aW9uIHRoYXQgYSBTVEEgaXMgZGlzYXNzb2NpYXRlZCBmcm9tIEFQICovCisvKiBBUCBtb2RlIG9ubHkgKi8KK3UxNl90IHpmTG54RGlzQXNvY05vdGlmeSh6ZGV2X3QqIGRldiwgdThfdCogbWFjQWRkciwgdTE2X3QgcG9ydCkKK3sKKyAgICB1bmlvbiBpd3JlcV9kYXRhIHdyZXE7CisgICAgdThfdCAqYWRkciA9ICh1OF90ICopIG1hY0FkZHI7CisKKyAgICBtZW1zZXQoJndyZXEsIDAsIHNpemVvZih3cmVxKSk7CisgICAgbWVtY3B5KHdyZXEuYWRkci5zYV9kYXRhLCBtYWNBZGRyLCBFVEhfQUxFTik7CisgICAgd3JlcS5hZGRyLnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKKyAgICBwcmludGsoS0VSTl9ERUJVRyAiemZ3RGlzQXNvY05vdGlmeSgpLCBNQUM6ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorICAgICAgICAgICAgYWRkclswXSwgYWRkclsxXSwgYWRkclsyXSwgYWRkclszXSwgYWRkcls0XSwgYWRkcls1XSk7CisKKworICAgIHJldHVybiAwOworfQorCisvKiBOb3RpZmljYXRpb24gdGhhdCBhIFNUQSBpcyBjb25uZWN0IHRvIEFQICovCisvKiBBUCBtb2RlIG9ubHkgKi8KK3UxNl90IHpmTG54QXBDb25uZWN0Tm90aWZ5KHpkZXZfdCogZGV2LCB1OF90KiBtYWNBZGRyLCB1MTZfdCBwb3J0KQoreworICAgIHVuaW9uIGl3cmVxX2RhdGEgd3JlcTsKKyAgICB1OF90ICphZGRyID0gKHU4X3QgKikgbWFjQWRkcjsKKworICAgIG1lbXNldCgmd3JlcSwgMCwgc2l6ZW9mKHdyZXEpKTsKKyAgICBtZW1jcHkod3JlcS5hZGRyLnNhX2RhdGEsIG1hY0FkZHIsIEVUSF9BTEVOKTsKKyAgICB3cmVxLmFkZHIuc2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOworICAgIHByaW50ayhLRVJOX0RFQlVHICJ6ZndBcENvbm5lY3ROb3RpZnkoKSwgTUFDOiAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKyAgICAgICAgICAgIGFkZHJbMF0sIGFkZHJbMV0sIGFkZHJbMl0sIGFkZHJbM10sIGFkZHJbNF0sIGFkZHJbNV0pOworCisKKyAgICByZXR1cm4gMDsKK30KKworCisKK3ZvaWQgemZMbnhDb25uZWN0Tm90aWZ5KHpkZXZfdCogZGV2LCB1MTZfdCBzdGF0dXMsIHUxNl90KiBic3NpZCkKK3sKKyAgICB1bmlvbiBpd3JlcV9kYXRhIHdyZXE7CisgICAgdThfdCAqYWRkciA9ICh1OF90ICopIGJzc2lkOworICAgIHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IGRldi0+bWxfcHJpdjsKKworICAgIGlmIChic3NpZCAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgbWVtc2V0KCZ3cmVxLCAwLCBzaXplb2Yod3JlcSkpOworICAgICAgICBpZiAoc3RhdHVzID09IFpNX1NUQVRVU19NRURJQV9DT05ORUNUKQorICAgICAgICAgICAgbWVtY3B5KHdyZXEuYWRkci5zYV9kYXRhLCBic3NpZCwgRVRIX0FMRU4pOworICAgICAgICB3cmVxLmFkZHIuc2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOworCisgICAgICAgIGlmIChzdGF0dXMgPT0gWk1fU1RBVFVTX01FRElBX0NPTk5FQ1QpCisgICAgICAgIHsKKyNpZmRlZiBaTV9DT05GSUdfQklHX0VORElBTgorICAgICAgICAgICAgcHJpbnRrKEtFUk5fREVCVUcgIkNvbm5lY3RlZCB0byBBUCwgTUFDOiAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKyAgICAgICAgICAgICAgICAgICAgYWRkclsxXSwgYWRkclswXSwgYWRkclszXSwgYWRkclsyXSwgYWRkcls1XSwgYWRkcls0XSk7CisjZWxzZQorICAgICAgICAgICAgcHJpbnRrKEtFUk5fREVCVUcgIkNvbm5lY3RlZCB0byBBUCwgTUFDOiAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKyAgICAgICAgICAgICAgICAgICAgYWRkclswXSwgYWRkclsxXSwgYWRkclsyXSwgYWRkclszXSwgYWRkcls0XSwgYWRkcls1XSk7CisjZW5kaWYKKworICAgICAgICAgICAgbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICgoc3RhdHVzID09IFpNX1NUQVRVU19NRURJQV9ESVNDT05ORUNUKSB8fAorICAgICAgICAgICAgICAgICAoc3RhdHVzID09IFpNX1NUQVRVU19NRURJQV9ESVNBQkxFRCkgfHwKKyAgICAgICAgICAgICAgICAgKHN0YXR1cyA9PSBaTV9TVEFUVVNfTUVESUFfQ09OTkVDVElPTl9ESVNBQkxFRCkgfHwKKwkgICAgICAgICAoc3RhdHVzID09IFpNX1NUQVRVU19NRURJQV9DT05ORUNUSU9OX1JFU0VUKSB8fAorCSAgICAgICAgIChzdGF0dXMgPT0gWk1fU1RBVFVTX01FRElBX1JFU0VUKSB8fAorCSAgICAgICAgIChzdGF0dXMgPT0gWk1fU1RBVFVTX01FRElBX0RJU0NPTk5FQ1RfREVBVVRIKSB8fAorCSAgICAgICAgIChzdGF0dXMgPT0gWk1fU1RBVFVTX01FRElBX0RJU0NPTk5FQ1RfRElTQVNPQykgfHwKKwkgICAgICAgICAoc3RhdHVzID09IFpNX1NUQVRVU19NRURJQV9ESVNDT05ORUNUX0JFQUNPTl9NSVNTKSB8fAorICAgICAgICAgICAgICAgICAoc3RhdHVzID09IFpNX1NUQVRVU19NRURJQV9ESVNDT05ORUNUX05PVF9GT1VORCkgfHwKKwkgICAgICAgICAoc3RhdHVzID09IFpNX1NUQVRVU19NRURJQV9ESVNDT05ORUNUX1RJTUVPVVQpKQorICAgICAgICB7CisgICAgICAgICAgICBwcmludGsoS0VSTl9ERUJVRyAiRGlzY29ubmVjdGlvbiBOb3RpZnlcbiIpOworCisgICAgICAgICAgICBuZXRpZl9zdG9wX3F1ZXVlKGRldik7CisgICAgICAgIH0KKworCS8qIFNhdmUgdGhlIGNvbm5lY3RlZCBzdGF0dXMgKi8KKwltYWNwLT5hZGFwdGVyU3RhdGUgPSBzdGF0dXM7CisKKyAgICAgICAgaWYoemZpV2xhblF1ZXJ5V2xhbk1vZGUoZGV2KSA9PSBaTV9NT0RFX0lORlJBU1RSVUNUVVJFKSB7CisgICAgICAgIC8vICAgICAgICAgICAgLy93aXJlbGVzc19zZW5kX2V2ZW50KGRldiwgU0lPQ0dJV1NDQU4sICZ3cmVxLCBOVUxMKTsKKyAgICAgICAgICAgIHdpcmVsZXNzX3NlbmRfZXZlbnQoZGV2LCBTSU9DR0lXQVAsICZ3cmVxLCBOVUxMKTsKKyAgICAgICAgfQorI2lmIFdJUkVMRVNTX0VYVCA+PSAxNQorICAgICAgICBlbHNlIGlmKHpmaVdsYW5RdWVyeVdsYW5Nb2RlKGRldikgPT0gWk1fTU9ERV9BUCkgeworICAgICAgICAgICAgLy9pZiAocG9ydCA9PSAwKQorICAgICAgICAgICAgLy97CisgICAgICAgICAgICAgICAgd2lyZWxlc3Nfc2VuZF9ldmVudChkZXYsIElXRVZSRUdJU1RFUkVELCAmd3JlcSwgTlVMTCk7CisgICAgICAgICAgICAvL30KKyAgICAgICAgICAgIC8vZWxzZQorICAgICAgICAgICAgLy97CisgICAgICAgICAgICAvLyAgICAvKiBDaGVjayB3aGV0aGVyIHRoZSBWQVAgZGV2aWNlIGlzIHZhbGlkICovCisgICAgICAgICAgICAvLyAgICBpZiAodmFwW3BvcnRdLmRldiAhPSBOVUxMKQorICAgICAgICAgICAgLy8gICAgeworICAgICAgICAgICAgLy8gICAgICAgIHdpcmVsZXNzX3NlbmRfZXZlbnQodmFwW3BvcnRdLmRldiwgSVdFVlJFR0lTVEVSRUQsICZ3cmVxLCBOVUxMKTsKKyAgICAgICAgICAgIC8vICAgIH0KKyAgICAgICAgICAgIC8vICAgIGVsc2UKKyAgICAgICAgICAgIC8vICAgIHsKKyAgICAgICAgICAgIC8vICAgICAgICBwcmludGsoS0VSTl9FUlIgIkNhbicgZmluZCBhIHZhbGlkIFZBUCBkZXZpY2UsIHBvcnQ6ICVkXG4iLCBwb3J0KTsKKyAgICAgICAgICAgIC8vICAgIH0KKyAgICAgICAgICAgIC8vfQorICAgICAgICB9CisjZW5kaWYKKyAgICB9CisgICAgLy9yZXR1cm4gMDsKK30KKwordm9pZCB6ZkxueFNjYW5Ob3RpZnkoemRldl90KiBkZXYsIHN0cnVjdCB6c1NjYW5SZXN1bHQqIHJlc3VsdCkKK3sKKyAgICByZXR1cm47Cit9CisKK3ZvaWQgemZMbnhTdGF0aXN0aWNzTm90aWZ5KHpkZXZfdCogZGV2LCBzdHJ1Y3QgenNTdGFzdGljcyogcmVzdWx0KQoreworICAgIHJldHVybjsKK30KKworLy92b2lkIHpmd01pY0ZhaWx1cmVOb3RpZnkoemRldl90KiBkZXYsIHU4X3QqIG1lc3NhZ2UsIHUxNl90IGV2ZW50KQordm9pZCB6ZkxueE1pY0ZhaWx1cmVOb3RpZnkoemRldl90KiBkZXYsIHUxNl90KiBhZGRyLCB1MTZfdCBzdGF0dXMpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgKnRhZyA9ICJNTE1FLU1JQ0hBRUxNSUNGQUlMVVJFLmluZGljYXRpb24iOworCXVuaW9uIGl3cmVxX2RhdGEgd3JxdTsKKwljaGFyIGJ1ZlsxMjhdOworCisJLyogVE9ETzogbmVlZGVkIHBhcmFtZXRlcnM6IGNvdW50LCB0eXBlLCBzcmMgYWRkcmVzcyAqLworCS8vc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiVzKCVzY2FzdCBhZGRyPSVzKSIsIHRhZywKKwkvLyAgICAoc3RhdHVzID09IFpNX01JQ19HUk9VUF9FUlJPUikgPyAgImJyb2FkIiA6ICJ1bmkiLAorCS8vICAgIGV0aGVyX3NwcmludGYoKHU4X3QgKilhZGRyKSk7CisKKwlpZiAoemZpV2xhblF1ZXJ5V2xhbk1vZGUoZGV2KSA9PSBaTV9NT0RFX0lORlJBU1RSVUNUVVJFKQorCXsKKwkJc3RyY3B5KGJ1ZiwgdGFnKTsKKwl9CisKKwltZW1zZXQoJndycXUsIDAsIHNpemVvZih3cnF1KSk7CisJd3JxdS5kYXRhLmxlbmd0aCA9IHN0cmxlbihidWYpOworCXdpcmVsZXNzX3NlbmRfZXZlbnQoZGV2LCBJV0VWQ1VTVE9NLCAmd3JxdSwgYnVmKTsKK30KKworCit2b2lkIHpmTG54QXBNaWNGYWlsdXJlTm90aWZ5KHpkZXZfdCogZGV2LCB1OF90KiBhZGRyLCB6YnVmX3QqIGJ1ZikKK3sKKyAgICB1bmlvbiBpd3JlcV9kYXRhIHdyZXE7CisKKyAgICBtZW1zZXQoJndyZXEsIDAsIHNpemVvZih3cmVxKSk7CisgICAgbWVtY3B5KHdyZXEuYWRkci5zYV9kYXRhLCBhZGRyLCBFVEhfQUxFTik7CisgICAgd3JlcS5hZGRyLnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKKyAgICBwcmludGsoS0VSTl9ERUJVRyAiemZ3QXBNaWNGYWlsdXJlTm90aWZ5KCksIE1BQzogJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisgICAgICAgICAgICBhZGRyWzBdLCBhZGRyWzFdLCBhZGRyWzJdLCBhZGRyWzNdLCBhZGRyWzRdLCBhZGRyWzVdKTsKKworICAgIHJldHVybjsKK30KKworLy8gc3RhdHVzID0gMCAgPT4gcGFydG5lciBsb3N0CisvLyAgICAgICAgPSAxICA9PiBwYXJ0bmVyIGFsaXZlCisvL3ZvaWQgemZ3SWJzc1BhcnRuZXJOb3RpZnkoemRldl90KiBkZXYsIHU4X3Qgc3RhdHVzKQordm9pZCB6ZkxueElic3NQYXJ0bmVyTm90aWZ5KHpkZXZfdCogZGV2LCB1MTZfdCBzdGF0dXMsIHN0cnVjdCB6c1BhcnRuZXJOb3RpZnlFdmVudCAqZXZlbnQpCit7Cit9CisKK3ZvaWQgemZMbnhNYWNBZGRyZXNzTm90aWZ5KHpkZXZfdCogZGV2LCB1OF90KiBhZGRyKQoreworICAgIGRldi0+ZGV2X2FkZHJbMF0gPSBhZGRyWzBdOworICAgIGRldi0+ZGV2X2FkZHJbMV0gPSBhZGRyWzFdOworICAgIGRldi0+ZGV2X2FkZHJbMl0gPSBhZGRyWzJdOworICAgIGRldi0+ZGV2X2FkZHJbM10gPSBhZGRyWzNdOworICAgIGRldi0+ZGV2X2FkZHJbNF0gPSBhZGRyWzRdOworICAgIGRldi0+ZGV2X2FkZHJbNV0gPSBhZGRyWzVdOworfQorCit2b2lkIHpmTG54U2VuZENvbXBsZXRlSW5kaWNhdGlvbih6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpCit7Cit9CisKKwordm9pZCB6ZkxueFJlc3RvcmVCdWZEYXRhKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZikgeworCit9CisvKiBMZWF2ZSBhbiBlbXB0eSBsaW5lIGJlbG93IHRvIHJlbW92ZSB3YXJuaW5nIG1lc3NhZ2Ugb24gc29tZSBjb21waWxlciAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvd3JhcF9tZW0uYyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL3dyYXBfbWVtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODA4MWJiMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL3dyYXBfbWVtLmMKQEAgLTAsMCArMSwxMDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBBdGhlcm9zIENvbW11bmljYXRpb25zIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworLyogIE1vZHVsZSBOYW1lIDogd3JhcF9tZW0uYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQWJzdHJhY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgIFRoaXMgbW9kdWxlIGNvbnRhaW5zIHdyYXBwZXIgZnVuY3Rpb25zIGZvciBtZW1vcnkgbWFuYWdlbWVudCAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTk9URVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgIFBsYXRmb3JtIGRlcGVuZGVudC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAib2FsX2R0LmgiCisjaW5jbHVkZSAidXNiZHJ2LmgiCisKKyNpbmNsdWRlIDxsaW51eC9uZXRsaW5rLmg+CisKKyNpZiBXSVJFTEVTU19FWFQgPiAxMgorI2luY2x1ZGUgPG5ldC9pd19oYW5kbGVyLmg+CisjZW5kaWYKKworLyogTWVtb3J5IG1hbmFnZW1lbnQgKi8KKy8qIENhbGxlZCB0byBhbGxvY2F0ZSB1bmNhY2hlZCBtZW1vcnksIGFsbG9jYXRlZCBtZW1vcnkgbXVzdCAgICAqLworLyogaW4gNC1ieXRlIGJvdW5kYXJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCit2b2lkKiB6ZndNZW1BbGxvY2F0ZSh6ZGV2X3QqIGRldiwgdTMyX3Qgc2l6ZSkKK3sKKyAgICB2b2lkKiBtZW0gPSBOVUxMOworICAgIG1lbSA9IGttYWxsb2Moc2l6ZSwgR0ZQX0FUT01JQyk7CisgICAgcmV0dXJuIG1lbTsKK30KKworCisvKiBDYWxsZWQgdG8gZnJlZSBhbGxvY2F0ZWQgbWVtb3J5ICovCit2b2lkIHpmd01lbUZyZWUoemRldl90KiBkZXYsIHZvaWQqIG1lbSwgdTMyX3Qgc2l6ZSkKK3sKKyAgICBrZnJlZShtZW0pOworICAgIHJldHVybjsKK30KKwordm9pZCB6ZndNZW1vcnlDb3B5KHU4X3QqIGRzdCwgdThfdCogc3JjLCB1MTZfdCBsZW5ndGgpCit7CisgICAgLy91MTZfdCBpOworCisgICAgbWVtY3B5KGRzdCwgc3JjLCBsZW5ndGgpOworICAgIC8vZm9yKGk9MDsgaTxsZW5ndGg7IGkrKykKKyAgICAvL3sKKyAgICAvLyAgICBkc3RbaV0gPSBzcmNbaV07CisgICAgLy99CisgICAgcmV0dXJuOworfQorCit2b2lkIHpmd1plcm9NZW1vcnkodThfdCogdmEsIHUxNl90IGxlbmd0aCkKK3sKKyAgICAvL3UxNl90IGk7CisgICAgbWVtc2V0KHZhLCAwLCBsZW5ndGgpOworICAgIC8vZm9yKGk9MDsgaTxsZW5ndGg7IGkrKykKKyAgICAvL3sKKyAgICAvLyAgICB2YVtpXSA9IDA7CisgICAgLy99CisgICAgcmV0dXJuOworfQorCit2b2lkIHpmd01lbW9yeU1vdmUodThfdCogZHN0LCB1OF90KiBzcmMsIHUxNl90IGxlbmd0aCkKK3sKKyAgICBtZW1jcHkoZHN0LCBzcmMsIGxlbmd0aCk7CisgICAgcmV0dXJuOworfQorCit1OF90IHpmd01lbW9yeUlzRXF1YWwodThfdCogbTEsIHU4X3QqIG0yLCB1MTZfdCBsZW5ndGgpCit7CisgICAgLy91MTZfdCBpOworICAgIGludCByZXQ7CisKKyAgICByZXQgPSBtZW1jbXAobTEsIG0yLCBsZW5ndGgpOworCisgICAgcmV0dXJuICgocmV0PT0wKT9UUlVFOkZBTFNFKTsKKyAgICAvL2ZvcihpPTA7IGk8bGVuZ3RoOyBpKyspCisgICAgLy97CisgICAgLy8gICAgaWYgKCBtMVtpXSAhPSBtMltpXSApCisgICAgLy8gICAgeworICAgIC8vICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgLy8gICAgfQorICAgIC8vfQorCisgICAgLy9yZXR1cm4gVFJVRTsKK30KKworLyogTGVhdmUgYW4gZW1wdHkgbGluZSBiZWxvdyB0byByZW1vdmUgd2FybmluZyBtZXNzYWdlIG9uIHNvbWUgY29tcGlsZXIgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzL3dyYXBfbWlzLmMgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy93cmFwX21pcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzNzkxOGIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy93cmFwX21pcy5jCkBAIC0wLDAgKzEsMTA5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggQXRoZXJvcyBDb21tdW5pY2F0aW9ucyBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kdWxlIE5hbWUgOiB3cmFwX21pcy5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBBYnN0cmFjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgVGhpcyBtb2R1bGUgY29udGFpbnMgd3JhcHBlciBmdW5jdGlvbnMgZm9yIG1pc2MgZnVuY3Rpb25zICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBOT1RFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgUGxhdGZvcm0gZGVwZW5kZW50LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJvYWxfZHQuaCIKKyNpbmNsdWRlICJ1c2JkcnYuaCIKKworI2luY2x1ZGUgPGxpbnV4L25ldGxpbmsuaD4KKworI2lmIFdJUkVMRVNTX0VYVCA+IDEyCisjaW5jbHVkZSA8bmV0L2l3X2hhbmRsZXIuaD4KKyNlbmRpZgorCisvL2V4dGVybiBzdHJ1Y3QgenNXZHNTdHJ1Y3Qgd2RzW1pNX1dEU19QT1JUX05VTUJFUl07CitleHRlcm4gc3RydWN0IHpzVmFwU3RydWN0IHZhcFtaTV9WQVBfUE9SVF9OVU1CRVJdOworZXh0ZXJuIHUxNl90IHpmTG54R2V0VmFwSWQoemRldl90KiBkZXYpOworCisvKiBTaW1wbHkgcmV0dXJuIDB4ZmZmZiBpZiBWQVAgZnVuY3Rpb24gaXMgbm90IHN1cHBvcnRlZCAqLwordTE2X3QgemZ3R2V0VmFwSWQoemRldl90KiBkZXYpCit7CisgICAgcmV0dXJuIHpmTG54R2V0VmFwSWQoZGV2KTsKK30KKwordm9pZCB6ZndTbGVlcCh6ZGV2X3QqIGRldiwgdTMyX3QgbXMpCit7CisgICAgaWYgKGluX2ludGVycnVwdCgpID09IDApCisgICAgeworICAgICAgICBtZGVsYXkobXMpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpbnQgaWk7CisgICAgICAgIGludCBpdGVyID0gMTAwMDAwICogbXM7CisKKyAgICAgICAgZm9yIChpaSA9IDA7IGlpIDwgaXRlcjsgaWkrKykKKyAgICAgICAgeworCisgICAgICAgIH0KKyAgICB9Cit9CisKKyNpZmRlZiBaTV9IQUxQTFVTX0xPQ0sKK2FzbWxpbmthZ2Ugc3RydWN0IHpzV2xhbkRldiAqemZ3R2V0V2xhbkRldih6ZGV2X3QqIGRldikKK3sKKwlzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AgPSBkZXYtPm1sX3ByaXY7CisJcmV0dXJuIG1hY3AtPndkOworfQorCithc21saW5rYWdlIHZvaWQgemZ3RW50ZXJDcml0aWNhbFNlY3Rpb24oemRldl90KiBkZXYpCit7CisJc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gZGV2LT5tbF9wcml2OworCXNwaW5fbG9ja19pcnFzYXZlKCZtYWNwLT5jc19sb2NrLCBtYWNwLT5oYWxfaXJxRmxhZyk7Cit9CisKK2FzbWxpbmthZ2Ugdm9pZCB6ZndMZWF2ZUNyaXRpY2FsU2VjdGlvbih6ZGV2X3QqIGRldikKK3sKKwlzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AgPSBkZXYtPm1sX3ByaXY7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWFjcC0+Y3NfbG9jaywgbWFjcC0+aGFsX2lycUZsYWcpOworfQorCithc21saW5rYWdlIHU4X3QgemZ3QnVmUmVhZEJ5dGUoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCBvZmZzZXQpCit7CisgICAgcmV0dXJuICoodThfdCopKCh1OF90KilidWYtPmRhdGErb2Zmc2V0KTsKK30KKworYXNtbGlua2FnZSB1MTZfdCB6ZndCdWZSZWFkSGFsZldvcmQoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCBvZmZzZXQpCit7CisgICAgcmV0dXJuIHptd19jcHVfdG9fbGUxNigqKHUxNl90KikoKHU4X3QqKWJ1Zi0+ZGF0YStvZmZzZXQpKTsKK30KKworYXNtbGlua2FnZSB2b2lkIHpmd0J1ZldyaXRlQnl0ZSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IG9mZnNldCwgdThfdCB2YWx1ZSkKK3sKKyAgICAqKHU4X3QqKSgodThfdCopYnVmLT5kYXRhK29mZnNldCkgPSB2YWx1ZTsKK30KKworYXNtbGlua2FnZSB2b2lkIHpmd0J1ZldyaXRlSGFsZldvcmQoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCBvZmZzZXQsIHUxNl90IHZhbHVlKQoreworICAgICoodTE2X3QqKSgodThfdCopYnVmLT5kYXRhK29mZnNldCkgPSB6bXdfY3B1X3RvX2xlMTYodmFsdWUpOworfQorCithc21saW5rYWdlIHU4X3QgKnpmd0dldEJ1ZmZlcih6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpCit7CisgICAgcmV0dXJuICh1OF90KikoYnVmLT5kYXRhKTsKK30KKyNlbmRpZgorCisvKiBMZWF2ZSBhbiBlbXB0eSBsaW5lIGJlbG93IHRvIHJlbW92ZSB3YXJuaW5nIG1lc3NhZ2Ugb24gc29tZSBjb21waWxlciAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvd3JhcF9wa3QuYyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL3dyYXBfcGt0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWRiMDAwNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL3dyYXBfcGt0LmMKQEAgLTAsMCArMSwxNzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBBdGhlcm9zIENvbW11bmljYXRpb25zIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2R1bGUgTmFtZSA6IHdyYXBfcGt0LmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEFic3RyYWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICBUaGlzIG1vZHVsZSBjb250YWlucyB3cmFwcGVyIGZ1bmN0aW9ucyBmb3IgcGFja2V0IGhhbmRsaW5nICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE5PVEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICBQbGF0Zm9ybSBkZXBlbmRlbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIm9hbF9kdC5oIgorI2luY2x1ZGUgInVzYmRydi5oIgorCisjaW5jbHVkZSA8bGludXgvbmV0bGluay5oPgorCisjaWYgV0lSRUxFU1NfRVhUID4gMTIKKyNpbmNsdWRlIDxuZXQvaXdfaGFuZGxlci5oPgorI2VuZGlmCisKKworCisvL2V4dGVybiBzdHJ1Y3QgenNXZHNTdHJ1Y3Qgd2RzW1pNX1dEU19QT1JUX05VTUJFUl07CitleHRlcm4gc3RydWN0IHpzVmFwU3RydWN0IHZhcFtaTV9WQVBfUE9SVF9OVU1CRVJdOworCisKKy8qKioqKiBSeCAqKioqKi8KK3ZvaWQgemZMbnhSZWN2ODAyMTEoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCBzdHJ1Y3QgenNBZGRpdGlvbkluZm8qIGFkZEluZm8pCit7CisgICAgdTE2X3QgZnJhbWVUeXBlOworICAgIHUxNl90IGZyYW1lQ3RybDsKKyAgICB1MTZfdCBmcmFtZVN1YnR5cGU7CisgICAgemJ1Zl90ICpza2IxOworICAgIHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IGRldi0+bWxfcHJpdjsKKworICAgIC8vZnJhbWVDdHJsID0gem13X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgMCk7CisgICAgZnJhbWVDdHJsID0gKih1OF90KikoKHU4X3QqKWJ1Zi0+ZGF0YSk7CisgICAgZnJhbWVUeXBlID0gZnJhbWVDdHJsICYgMHhmOworICAgIGZyYW1lU3VidHlwZSA9IGZyYW1lQ3RybCAmIDB4ZjA7CisKKyAgICBpZiAoKGZyYW1lVHlwZSA9PSAweDApICYmIChtYWNwLT5mb3J3YXJkTWdtdCkpCisgICAgeworICAgICAgICBzd2l0Y2ggKGZyYW1lU3VidHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIEJlYWNvbiAqLworICAgICAgICAgICAgY2FzZSAweDgwIDoKKyAgICAgICAgICAgICAgICAvKiBQcm9iZSByZXNwb25zZSAqLworICAgICAgICAgICAgY2FzZSAweDUwIDoKKyAgICAgICAgICAgICAgICBza2IxID0gc2tiX2NvcHkoYnVmLCBHRlBfQVRPTUlDKTsKKyAgICAgICAgICAgICAgICBpZihza2IxICE9IE5VTEwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBza2IxLT5kZXYgPSBkZXY7CisgICAgICAgICAgICAgICAgICAgIHNrYjEtPm1hY19oZWFkZXIgPSBza2IxLT5kYXRhOworCSAgICAgICAgICAgIHNrYjEtPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7CisJICAgICAgICAgICAgc2tiMS0+cGt0X3R5cGUgPSBQQUNLRVRfT1RIRVJIT1NUOworCSAgICAgICAgICAgIHNrYjEtPnByb3RvY29sID0gX19jb25zdGFudF9odG9ucygweDAwMTkpOyAgLyogRVRIX1BfODAyMTFfUkFXICovCisgICAgCSAgICAgICAgICAgIG5ldGlmX3J4KHNrYjEpOworCSAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB6ZmlSZWN2ODAyMTEoZGV2LCBidWYsIGFkZEluZm8pOworICAgIHJldHVybjsKK30KKworI2RlZmluZSBaTV9BVk9JRF9VRFBfTEFSR0VfUEFDS0VUX0ZBSUwKK3ZvaWQgemZMbnhSZWN2RXRoKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3QgcG9ydCkKK3sKKyAgICBzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AgPSBkZXYtPm1sX3ByaXY7CisjaWZkZWYgWk1fQVZPSURfVURQX0xBUkdFX1BBQ0tFVF9GQUlMCisgICAgemJ1Zl90ICpuZXdfYnVmOworCisgICAgLy9uZXdfYnVmID0gZGV2X2FsbG9jX3NrYigyMDQ4KTsKKyAgICBuZXdfYnVmID0gZGV2X2FsbG9jX3NrYihidWYtPmxlbik7CisKKyNpZmRlZiBORVRfU0tCVUZGX0RBVEFfVVNFU19PRkZTRVQKKyAgICBuZXdfYnVmLT50YWlsID0gMDsKKyAgICBuZXdfYnVmLT5sZW4gPSAwOworI2Vsc2UKKyAgICBuZXdfYnVmLT50YWlsID0gbmV3X2J1Zi0+ZGF0YTsKKyAgICBuZXdfYnVmLT5sZW4gPSAwOworI2VuZGlmCisKKyAgICBza2JfcHV0KG5ld19idWYsIGJ1Zi0+bGVuKTsKKyAgICBtZW1jcHkobmV3X2J1Zi0+ZGF0YSwgYnVmLT5kYXRhLCBidWYtPmxlbik7CisKKyAgICAvKiBGcmVlIGJ1ZmZlciAqLworICAgIGRldl9rZnJlZV9za2JfYW55KGJ1Zik7CisKKyAgICBpZiAocG9ydCA9PSAwKQorICAgIHsKKyAgICAgICAgbmV3X2J1Zi0+ZGV2ID0gZGV2OworICAgICAgICBuZXdfYnVmLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKG5ld19idWYsIGRldik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qIFZBUCAqLworICAgICAgICBpZiAodmFwWzBdLmRldiAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBuZXdfYnVmLT5kZXYgPSB2YXBbMF0uZGV2OworICAgICAgICAgICAgbmV3X2J1Zi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhuZXdfYnVmLCB2YXBbMF0uZGV2KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIG5ld19idWYtPmRldiA9IGRldjsKKyAgICAgICAgICAgIG5ld19idWYtPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMobmV3X2J1ZiwgZGV2KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIG5ld19idWYtPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7CisgICAgZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKworICAgIHN3aXRjaChuZXRpZl9yeChuZXdfYnVmKSkKKyNlbHNlCisgICAgaWYgKHBvcnQgPT0gMCkKKyAgICB7CisgICAgICAgIGJ1Zi0+ZGV2ID0gZGV2OworICAgICAgICBidWYtPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoYnVmLCBkZXYpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKiBWQVAgKi8KKyAgICAgICAgaWYgKHZhcFswXS5kZXYgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgYnVmLT5kZXYgPSB2YXBbMF0uZGV2OworICAgICAgICAgICAgYnVmLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKGJ1ZiwgdmFwWzBdLmRldik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBidWYtPmRldiA9IGRldjsKKyAgICAgICAgICAgIGJ1Zi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhidWYsIGRldik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBidWYtPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7CisgICAgZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKworICAgIHN3aXRjaChuZXRpZl9yeChidWYpKQorI2VuZGlmCisgICAgeworICAgIGNhc2UgTkVUX1JYX0JBRDoKKyAgICBjYXNlIE5FVF9SWF9EUk9QOgorICAgIGNhc2UgTkVUX1JYX0NOX01PRDoKKyAgICBjYXNlIE5FVF9SWF9DTl9ISUdIOgorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICAgICAgbWFjcC0+ZHJ2X3N0YXRzLm5ldF9zdGF0cy5yeF9wYWNrZXRzKys7CisgICAgICAgICAgICBtYWNwLT5kcnZfc3RhdHMubmV0X3N0YXRzLnJ4X2J5dGVzICs9IGJ1Zi0+bGVuOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm47Cit9CisKKy8qIExlYXZlIGFuIGVtcHR5IGxpbmUgYmVsb3cgdG8gcmVtb3ZlIHdhcm5pbmcgbWVzc2FnZSBvbiBzb21lIGNvbXBpbGVyICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb3R1cy93cmFwX3NlYy5jIGIvZHJpdmVycy9zdGFnaW5nL290dXMvd3JhcF9zZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjg4ZDA2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvd3JhcF9zZWMuYwpAQCAtMCwwICsxLDEyNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNy0yMDA4IEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZHVsZSBOYW1lIDogd3JhcF9zZWMuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQWJzdHJhY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgIFRoaXMgbW9kdWxlIGNvbnRhaW5zIHdyYXBwZXIgZnVuY3Rpb25zIGZvciBDRU5DLiAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTk9URVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgIFBsYXRmb3JtIGRlcGVuZGVudC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAib2FsX2R0LmgiCisjaW5jbHVkZSAidXNiZHJ2LmgiCisKKyNpbmNsdWRlIDxsaW51eC9uZXRsaW5rLmg+CisKKyNpZiBXSVJFTEVTU19FWFQgPiAxMgorI2luY2x1ZGUgPG5ldC9pd19oYW5kbGVyLmg+CisjZW5kaWYKKworI2lmZGVmIFpNX0VOQUJMRV9DRU5DCitleHRlcm4gaW50IHpmTG54Q2VuY1NlbmRNc2coc3RydWN0IHNvY2sgKm5ldGxpbmtfc2ssIHVfaW50OF90ICptc2csIGludCBsZW4pOworCit1MTZfdCB6ZkxueENlbmNBc29jTm90aWZ5KHpkZXZfdCogZGV2LCB1MTZfdCogbWFjQWRkciwgdThfdCogYm9keSwgdTE2X3QgYm9keVNpemUsIHUxNl90IHBvcnQpCit7CisgICAgc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gKHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqKWRldi0+cHJpdjsKKyAgICBzdHJ1Y3QgenlkYXNfY2VuY19zdGFfaW5mbyBjZW5jX2luZm87CisgICAgLy9zdHJ1Y3Qgc29jayAqbmV0bGlua19zazsKKyAgICB1OF90IGllX2xlbjsKKyAgICBpbnQgaWk7CisKKyAgICAvKiBDcmVhdGUgTkVUTElOSyBzb2NrZXQgKi8KKyAgICAvL25ldGxpbmtfc2sgPSBuZXRsaW5rX2tlcm5lbF9jcmVhdGUoTkVUTElOS19VU0VSU09DSywgTlVMTCk7CisKKyAgICBpZiAobWFjcC0+bmV0bGlua19zayA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJORVRMSU5LIFNvY2tldCBpcyBOVUxMXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIG1lbXNldCgmY2VuY19pbmZvLCAwLCBzaXplb2YoY2VuY19pbmZvKSk7CisKKyAgICAvL21lbWNweShjZW5jX2luZm8uZ3NuLCB2YXAtPml2X2NlbmNtc2tfa2V5cy53a190eGl2LCBaTV9DRU5DX0lWX0xFTik7CisgICAgemZpV2xhblF1ZXJ5R1NOKGRldiwgY2VuY19pbmZvLmdzbiwgcG9ydCk7CisgICAgY2VuY19pbmZvLmRhdGFsZW4gKz0gWk1fQ0VOQ19JVl9MRU47CisgICAgaWVfbGVuID0gYm9keVsxXSArIDI7CisgICAgbWVtY3B5KGNlbmNfaW5mby53aWUsIGJvZHksIGllX2xlbik7CisgICAgY2VuY19pbmZvLmRhdGFsZW4gKz0gaWVfbGVuOworCisgICAgbWVtY3B5KGNlbmNfaW5mby5zdGFfbWFjLCBtYWNBZGRyLCA2KTsKKyAgICBjZW5jX2luZm8ubXNnX3R5cGUgPSBaTV9DRU5DX1dBSV9SRVFVRVNUOworICAgIGNlbmNfaW5mby5kYXRhbGVuICs9IDYgKyAyOworCisgICAgcHJpbnRrKEtFUk5fRVJSICI9PT09PSB6ZndDZW5jU2VuZE1zZywgYm9keVNpemU6ICVkID09PT09XG4iLCBib2R5U2l6ZSk7CisKKyAgICBmb3IoaWkgPSAwOyBpaSA8IGJvZHlTaXplOyBpaSsrKQorICAgIHsKKyAgICAgICAgcHJpbnRrKEtFUk5fRVJSICIlMDJ4ICIsIGJvZHlbaWldKTsKKworICAgICAgICBpZiAoKGlpICYgMHhmKSA9PSAweGYpCisgICAgICAgIHsKKyAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiXG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHpmTG54Q2VuY1NlbmRNc2cobWFjcC0+bmV0bGlua19zaywgKHU4X3QgKikmY2VuY19pbmZvLCBjZW5jX2luZm8uZGF0YWxlbis0KTsKKworICAgIC8qIENsb3NlIE5FVExJTksgc29ja2V0ICovCisgICAgLy9zb2NrX3JlbGVhc2UobmV0bGlua19zayk7CisKKyAgICByZXR1cm4gMDsKK30KKyNlbmRpZiAvL1pNX0VOQUJMRV9DRU5DCisKK3U4X3QgemZ3Q2VuY0hhbmRsZUJlYWNvblByb2JyZXNwb24oemRldl90KiBkZXYsIHU4X3QgKnBXSUVjLAorICAgICAgICB1OF90ICpwUGVlclNTSURjLCB1OF90ICpwUGVlckFkZHJjKQoreworICAgIHJldHVybiAwOworfQorCit1OF90IHpmd0dldFBrdEVuY0V4ZW1wdGlvbkFjdGlvblR5cGUoemRldl90KiBkZXYsIHpidWZfdCogYnVmKQoreworICAgIHJldHVybiBaTV9FTkNSWVBUSU9OX0VYRU1QVF9OT19FWEVNUFRJT047Cit9CisKK3ZvaWQgY29weVRvSW50VHhCdWZmZXIoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1OF90KiBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgdTE2X3Qgb2Zmc2V0LCB1MTZfdCBsZW5ndGgpCit7CisgICAgdTE2X3QgaTsKKworICAgIGZvcihpPTA7IGk8bGVuZ3RoO2krKykKKyAgICB7CisgICAgICAgIC8vem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCtpLCBzcmNbaV0pOworICAgICAgICAqKHU4X3QqKSgodThfdCopYnVmLT5kYXRhK29mZnNldCtpKSA9IHNyY1tpXTsKKyAgICB9Cit9CisKK3UxNl90IHpmd1N0YUFkZEllV3BhUnNuKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3Qgb2Zmc2V0LCB1OF90IGZyYW1lVHlwZSkKK3sKKyAgICBzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AgPSBkZXYtPm1sX3ByaXY7CisgICAgLy96bV9tc2cxX21tKFpNX0xWXzAsICJDV1kgLSBhZGQgd3BhaWUgY29udGVudCBMZW5ndGggOiAiLCBtYWNwLT5zdXBJZVsxXSk7CisgICAgaWYgKG1hY3AtPnN1cEllWzFdICE9IDApCisgICAgeworICAgICAgICBjb3B5VG9JbnRUeEJ1ZmZlcihkZXYsIGJ1ZiwgbWFjcC0+c3VwSWUsIG9mZnNldCwgbWFjcC0+c3VwSWVbMV0rMik7CisgICAgICAgIC8vbWVtY3B5KGJ1Zi0+ZGF0YVtvZmZzZXRdLCBtYWNwLT5zdXBJZSwgbWFjcC0+c3VwSWVbMV0rMik7CisgICAgICAgIG9mZnNldCArPSAobWFjcC0+c3VwSWVbMV0rMik7CisgICAgfQorCisgICAgcmV0dXJuIG9mZnNldDsKK30KKworLyogTGVhdmUgYW4gZW1wdHkgbGluZSBiZWxvdyB0byByZW1vdmUgd2FybmluZyBtZXNzYWdlIG9uIHNvbWUgY29tcGlsZXIgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzL3dyYXBfdXNiLmMgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy93cmFwX3VzYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwNzZlNTYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy93cmFwX3VzYi5jCkBAIC0wLDAgKzEsMTkxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggQXRoZXJvcyBDb21tdW5pY2F0aW9ucyBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kdWxlIE5hbWUgOiB3cmFwX3VzYi5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBBYnN0cmFjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgVGhpcyBtb2R1bGUgY29udGFpbnMgd3JhcHBlciBmdW5jdGlvbnMgZm9yIFVTQiBtYW5hZ2VtZW50ICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBOT1RFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgUGxhdGZvcm0gZGVwZW5kZW50LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJvYWxfZHQuaCIKKyNpbmNsdWRlICJ1c2JkcnYuaCIKKworI2luY2x1ZGUgPGxpbnV4L25ldGxpbmsuaD4KKworI2lmIFdJUkVMRVNTX0VYVCA+IDEyCisjaW5jbHVkZSA8bmV0L2l3X2hhbmRsZXIuaD4KKyNlbmRpZgorCitleHRlcm4gdm9pZCB6ZkxueEluaXRVc2JUeFEoemRldl90KiBkZXYpOworZXh0ZXJuIHZvaWQgemZMbnhJbml0VXNiUnhRKHpkZXZfdCogZGV2KTsKK2V4dGVybiB1MzJfdCB6ZkxueFN1Ym1pdFJlZ0luVXJiKHpkZXZfdCAqZGV2KTsKK3UzMl90IHpmTG54VXNiT3V0KHpkZXZfdCogZGV2LCB1OF90ICpoZHIsIHUxNl90IGhkcmxlbiwgdThfdCAqc25hcCwgdTE2X3Qgc25hcExlbiwKKyAgICAgICAgdThfdCAqdGFpbCwgdTE2X3QgdGFpbExlbiwgemJ1Zl90ICpidWYsIHUxNl90IG9mZnNldCk7Cit1MzJfdCB6ZkxueFVzYldyaXRlUmVnKHpkZXZfdCogZGV2LCB1MzJfdCogY21kLCB1MTZfdCBjbWRMZW4pOworCit2b2lkIHpmd1VzYlJlZ2lzdGVyQ2FsbEJhY2soemRldl90KiBkZXYsIHN0cnVjdCB6ZkNiVXNiRnVuY1RibCAqemZVc2JGdW5jKSB7CisgICAgc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gZGV2LT5tbF9wcml2OworCisgICAgbWFjcC0+dXNiQ2JGdW5jdGlvbnMuemZjYlVzYlJlY3YgPSB6ZlVzYkZ1bmMtPnpmY2JVc2JSZWN2OworICAgIG1hY3AtPnVzYkNiRnVuY3Rpb25zLnpmY2JVc2JSZWdJbiA9IHpmVXNiRnVuYy0+emZjYlVzYlJlZ0luOworICAgIG1hY3AtPnVzYkNiRnVuY3Rpb25zLnpmY2JVc2JPdXRDb21wbGV0ZSA9IHpmVXNiRnVuYy0+emZjYlVzYk91dENvbXBsZXRlOworCisgICAgcmV0dXJuOworfQorCit1MzJfdCB6ZndVc2JHZXRGcmVlVHhRU2l6ZSh6ZGV2X3QqIGRldikKK3sKKyAgICBzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AgPSBkZXYtPm1sX3ByaXY7CisgICAgdTMyX3QgICAgICAgIGZyZWVUeFFTaXplOworICAgIHVuc2lnbmVkIGxvbmcgaXJxRmxhZzsKKyAgICAvL3ptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICAvL3ptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgc3Bpbl9sb2NrX2lycXNhdmUoJm1hY3AtPmNzX2xvY2ssIGlycUZsYWcpOworCisgICAgZnJlZVR4UVNpemUgPSBaTV9NQVhfVFhfQlVGX05VTSAtIG1hY3AtPlR4QnVmQ250OworCisgICAgLy96bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1hY3AtPmNzX2xvY2ssIGlycUZsYWcpOworCisgICAgcmV0dXJuIGZyZWVUeFFTaXplOworfQorCit1MzJfdCB6ZndVc2JHZXRNYXhUeFFTaXplKHpkZXZfdCogZGV2KQoreworICAgIHJldHVybiBaTV9NQVhfVFhfQlVGX05VTTsKK30KKwordTMyX3QgemZ3VXNiRW5hYmxlSW50RXB0KHpkZXZfdCAqZGV2LCB1OF90IGVuZHB0KQoreworICAgIC8qIEluaXRpYWxpemUgVVNCIFR4USAqLworICAgIHpmTG54SW5pdFVzYlR4UShkZXYpOworCisgICAgLyogSW5pdGlhbGl6ZSBVU0IgUnhRICovCisgICAgemZMbnhJbml0VXNiUnhRKGRldik7CisKKyAgICAvKiBJbml0aWFsaXplIFVTQiBSZWdpc3RlciBJbiBVUkIgKi8KKyAgICAvL3pmd1VzYlN1Ym1pdFJlZ0luKGRldik7CisgICAgLyogSW5pdGlhbGl6ZSBVU0IgUmVnaXN0ZXIgSW4gVVJCICovCisgICAgemZMbnhTdWJtaXRSZWdJblVyYihkZXYpOworCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCB6ZndVc2JFbmFibGVSeEVwdCh6ZGV2X3QqIGRldiwgdThfdCBlbmRwdCkKK3sKKyAgICByZXR1cm4gMDsKK30KKwordTMyX3QgemZ3VXNiU3VibWl0Q29udHJvbCh6ZGV2X3QqIGRldiwgdThfdCByZXEsIHUxNl90IHZhbHVlLCB1MTZfdCBpbmRleCwgdm9pZCAqZGF0YSwgdTMyX3Qgc2l6ZSkKK3sKKyAgICBpbnQgcmVzdWx0ID0gMDsKKyAgICB1MzJfdCByZXQgPSAwOworICAgIHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IGRldi0+bWxfcHJpdjsKKyAgICB1OF90KiBidWY7CisKKyAgICBpZiAoc2l6ZSA+IDApCisgICAgeworICAgICAgICBidWYgPSBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpOworICAgICAgICBtZW1jcHkoYnVmLCAodThfdCopZGF0YSwgc2l6ZSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGJ1ZiA9IE5VTEw7CisgICAgfQorCisjaWYgMAorICAgIHByaW50ayhLRVJOX0VSUiAicmVxID0gMHglMDJ4XG4iLCByZXEpOworICAgIHByaW50ayhLRVJOX0VSUiAidmFsdWUgPSAweCUwNHhcbiIsIHZhbHVlKTsKKyAgICBwcmludGsoS0VSTl9FUlIgImluZGV4ID0gMHglMDR4XG4iLCBpbmRleCk7CisgICAgcHJpbnRrKEtFUk5fRVJSICJkYXRhID0gMHglbHhcbiIsICh1MzJfdCkgZGF0YSk7CisgICAgcHJpbnRrKEtFUk5fRVJSICJzaXplID0gJWxkXG4iLCBzaXplKTsKKyNlbmRpZgorCisgICAgcmVzdWx0ID0gdXNiX2NvbnRyb2xfbXNnKG1hY3AtPnVkZXYsIHVzYl9zbmRjdHJscGlwZShtYWNwLT51ZGV2LCAwKSwKKyAgICAgICAgICAgIHJlcSwgVVNCX0RJUl9PVVQgfCAweDQwLCB2YWx1ZSwgaW5kZXgsIGJ1Ziwgc2l6ZSwgSFopOworCisgICAgaWYgKHJlc3VsdCA8IDApCisgICAgeworICAgICAgICBwcmludGsoInpmd1VzYlN1Ym1pdENvbnRyb2woKSBmYWlsZWQsIHJlc3VsdD0weCV4XG4iLCByZXN1bHQpOworICAgICAgICByZXQgPSAxOworICAgIH0KKyAgICBrZnJlZShidWYpOworCisgICAgcmV0dXJuIHJldDsKK30KKwordm9pZCB6ZndVc2JDbWQoemRldl90KiBkZXYsIHU4X3QgZW5kcHQsIHUzMl90KiBjbWQsIHUxNl90IGNtZExlbikKK3sKKyAgICBzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AgPSBkZXYtPm1sX3ByaXY7CisgICAgdTMyX3QgcmV0OworCisgICAgLy9NUFVzYkNvbW1hbmQoZGV2LCBlbmRwdCwgY21kLCBjbWRMZW4pOworICAgIHJldCA9IHpmTG54VXNiV3JpdGVSZWcoZGV2LCBjbWQsIGNtZExlbik7CisKKyAgICAvKiBpZiB6ZkxueFVzYldyaXRlUmVnKCkgcmV0dXJuIGVycm9yLCBmcmVlIGFuZCBhbGxvY2F0ZSB1cmIsIHJlc2VuZCBhZ2FpbiAqLworICAgIGlmIChyZXQgIT0gMCkKKyAgICB7CisgICAgICAgIHVzYl9mcmVlX3VyYihtYWNwLT5SZWdPdXRVcmIpOworICAgICAgICBtYWNwLT5SZWdPdXRVcmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9BVE9NSUMpOworICAgICAgICByZXQgPSB6ZkxueFVzYldyaXRlUmVnKGRldiwgY21kLCBjbWRMZW4pOworICAgIH0KK30KKwordTMyX3QgemZ3VXNiU2VuZCh6ZGV2X3QqIGRldiwgdThfdCBlbmRwdCwgdThfdCAqaGRyLCB1MTZfdCBoZHJsZW4sIHU4X3QgKnNuYXAsIHUxNl90IHNuYXBMZW4sCisgICAgICAgICAgICAgICAgdThfdCAqdGFpbCwgdTE2X3QgdGFpbExlbiwgemJ1Zl90ICpidWYsIHUxNl90IG9mZnNldCkKK3sKKyAgICB1MzJfdCBzdGF0dXM7CisKKyNpZmRlZiBaTV9DT05GSUdfQklHX0VORElBTgorICAgIHUzMl90IGlpID0gMDsKKyAgICB1MTZfdCAqcGMgPSBOVUxMOworCisgICAgcGMgPSAodTE2X3QgKiloZHI7CisgICAgZm9yKGlpPTA7IGlpPChoZHJsZW4+PjEpOyBpaSsrKQorICAgIHsKKyAgICAgICAgcGNbaWldID0gY3B1X3RvX2xlMTYocGNbaWldKTsKKyAgICB9CisKKyAgICBwYyA9ICh1MTZfdCAqKXNuYXA7CisgICAgZm9yKGlpPTA7IGlpPChzbmFwTGVuPj4xKTsgaWkrKykKKyAgICB7CisgICAgICAgIHBjW2lpXSA9IGNwdV90b19sZTE2KHBjW2lpXSk7CisgICAgfQorCisgICAgcGMgPSAodTE2X3QgKil0YWlsOworICAgIGZvcihpaT0wOyBpaTwodGFpbExlbj4+MSk7IGlpKyspCisgICAgeworICAgICAgICBwY1tpaV0gPSBjcHVfdG9fbGUxNihwY1tpaV0pOworICAgIH0KKyNlbmRpZgorCisgICAgc3RhdHVzID0gemZMbnhVc2JPdXQoZGV2LCBoZHIsIGhkcmxlbiwgc25hcCwgc25hcExlbiwgdGFpbCwgdGFpbExlbiwgYnVmLCBvZmZzZXQpOworICAgIGlmICggc3RhdHVzID09IDAgKQorICAgIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJldHVybiAxOworICAgIH0KK30KKworLyogTGVhdmUgYW4gZW1wdHkgbGluZSBiZWxvdyB0byByZW1vdmUgd2FybmluZyBtZXNzYWdlIG9uIHNvbWUgY29tcGlsZXIgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzL3d3cmFwLmMgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy93d3JhcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiYjVmNTkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy93d3JhcC5jCkBAIC0wLDAgKzEsMTEzNCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNy0yMDA4IEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisvKiAgTW9kdWxlIE5hbWUgOiB3d3JhcC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEFic3RyYWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgVGhpcyBtb2R1bGUgY29udGFpbnMgd3JhcHBlciBmdW5jdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE5PVEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgUGxhdGZvcm0gZGVwZW5kZW50LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisvKiBQbGVhc2UgaW5jbHVkZSB5b3VyIGhlYWRlciBmaWxlcyBoZXJlICovCisjaW5jbHVkZSAib2FsX2R0LmgiCisjaW5jbHVkZSAidXNiZHJ2LmgiCisKKyNpbmNsdWRlIDxsaW51eC9uZXRsaW5rLmg+CisKKyNpZiBXSVJFTEVTU19FWFQgPiAxMgorI2luY2x1ZGUgPG5ldC9pd19oYW5kbGVyLmg+CisjZW5kaWYKKworZXh0ZXJuIHZvaWQgemZpUmVjdjgwMjExKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1Ziwgc3RydWN0IHpzQWRkaXRpb25JbmZvKiBhZGRJbmZvKTsKK2V4dGVybiB2b2lkIHpmQ29yZVJlY3YoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCBzdHJ1Y3QgenNBZGRpdGlvbkluZm8qIGFkZEluZm8pOworZXh0ZXJuIHZvaWQgemZJZGxDaGtSc3AoemRldl90KiBkZXYsIHUzMl90KiByc3AsIHUxNl90IHJzcExlbik7CitleHRlcm4gdm9pZCB6ZklkbFJzcCh6ZGV2X3QqIGRldiwgdTMyX3QgKnJzcCwgdTE2X3QgcnNwTGVuKTsKKworCisKKy8vZXh0ZXJuIHN0cnVjdCB6c1dkc1N0cnVjdCB3ZHNbWk1fV0RTX1BPUlRfTlVNQkVSXTsKK2V4dGVybiBzdHJ1Y3QgenNWYXBTdHJ1Y3QgdmFwW1pNX1ZBUF9QT1JUX05VTUJFUl07CisKK3UzMl90IHpmTG54VXNiU3VibWl0VHhEYXRhKHpkZXZfdCogZGV2KTsKK3UzMl90IHpmTG54VXNiSW4oemRldl90KiBkZXYsIHVyYl90ICp1cmIsIHpidWZfdCAqYnVmKTsKK3UzMl90IHpmTG54U3VibWl0UmVnSW5VcmIoemRldl90ICpkZXYpOwordTMyX3QgemZMbnhVc2JTdWJtaXRCdWxrVXJiKHVyYl90ICp1cmIsIHN0cnVjdCB1c2JfZGV2aWNlICp1c2IsIHUxNl90IGVwbnVtLCB1MTZfdCBkaXJlY3Rpb24sCisgICAgICAgIHZvaWQgKnRyYW5zZmVyX2J1ZmZlciwgaW50IGJ1ZmZlcl9sZW5ndGgsIHVzYl9jb21wbGV0ZV90IGNvbXBsZXRlLCB2b2lkICpjb250ZXh0KTsKK3UzMl90IHpmTG54VXNiU3VibWl0SW50VXJiKHVyYl90ICp1cmIsIHN0cnVjdCB1c2JfZGV2aWNlICp1c2IsIHUxNl90IGVwbnVtLCB1MTZfdCBkaXJlY3Rpb24sCisgICAgICAgIHZvaWQgKnRyYW5zZmVyX2J1ZmZlciwgaW50IGJ1ZmZlcl9sZW5ndGgsIHVzYl9jb21wbGV0ZV90IGNvbXBsZXRlLCB2b2lkICpjb250ZXh0LAorICAgICAgICB1MzJfdCBpbnRlcnZhbCk7CisKK3UxNl90IHpmTG54R2V0RnJlZVR4VXJiKHpkZXZfdCAqZGV2KQoreworICAgIHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IGRldi0+bWxfcHJpdjsKKyAgICB1MTZfdCBpZHg7CisgICAgdW5zaWduZWQgbG9uZyBpcnFGbGFnOworCisgICAgc3Bpbl9sb2NrX2lycXNhdmUoJm1hY3AtPmNzX2xvY2ssIGlycUZsYWcpOworCisgICAgLy9pZHggPSAoKG1hY3AtPlR4VXJiVGFpbCArIDEpICYgKFpNX01BWF9UWF9VUkJfTlVNIC0gMSkpOworCisgICAgLy9pZiAoaWR4ICE9IG1hY3AtPlR4VXJiSGVhZCkKKyAgICBpZiAobWFjcC0+VHhVcmJDbnQgIT0gMCkKKyAgICB7CisgICAgICAgIGlkeCA9IG1hY3AtPlR4VXJiVGFpbDsKKyAgICAgICAgbWFjcC0+VHhVcmJUYWlsID0gKChtYWNwLT5UeFVyYlRhaWwgKyAxKSAmIChaTV9NQVhfVFhfVVJCX05VTSAtIDEpKTsKKyAgICAgICAgbWFjcC0+VHhVcmJDbnQtLTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLy9wcmludGsoS0VSTl9FUlIgIm1hY3AtPlR4VXJiQ250OiAlZFxuIiwgbWFjcC0+VHhVcmJDbnQpOworICAgICAgICBpZHggPSAweGZmZmY7CisgICAgfQorCisgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWFjcC0+Y3NfbG9jaywgaXJxRmxhZyk7CisgICAgcmV0dXJuIGlkeDsKK30KKwordm9pZCB6ZkxueFB1dFR4VXJiKHpkZXZfdCAqZGV2KQoreworICAgIHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IGRldi0+bWxfcHJpdjsKKyAgICB1MTZfdCBpZHg7CisgICAgdW5zaWduZWQgbG9uZyBpcnFGbGFnOworCisgICAgc3Bpbl9sb2NrX2lycXNhdmUoJm1hY3AtPmNzX2xvY2ssIGlycUZsYWcpOworCisgICAgaWR4ID0gKChtYWNwLT5UeFVyYkhlYWQgKyAxKSAmIChaTV9NQVhfVFhfVVJCX05VTSAtIDEpKTsKKworICAgIC8vaWYgKGlkeCAhPSBtYWNwLT5UeFVyYlRhaWwpCisgICAgaWYgKG1hY3AtPlR4VXJiQ250IDwgWk1fTUFYX1RYX1VSQl9OVU0pCisgICAgeworICAgICAgICBtYWNwLT5UeFVyYkhlYWQgPSBpZHg7CisgICAgICAgIG1hY3AtPlR4VXJiQ250Kys7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHByaW50aygiVXNiVHhVcmJRIGluY29uc2lzdGVudDogVHhVcmJIZWFkOiAlZCwgVHhVcmJUYWlsOiAlZFxuIiwKKyAgICAgICAgICAgICAgICBtYWNwLT5UeFVyYkhlYWQsIG1hY3AtPlR4VXJiVGFpbCk7CisgICAgfQorCisgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWFjcC0+Y3NfbG9jaywgaXJxRmxhZyk7Cit9CisKK3UxNl90IHpmTG54Q2hlY2tUeEJ1ZmZlckNudCh6ZGV2X3QgKmRldikKK3sKKyAgICBzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AgPSBkZXYtPm1sX3ByaXY7CisgICAgdTE2X3QgVHhCdWZDbnQ7CisgICAgdW5zaWduZWQgbG9uZyBpcnFGbGFnOworCisgICAgc3Bpbl9sb2NrX2lycXNhdmUoJm1hY3AtPmNzX2xvY2ssIGlycUZsYWcpOworCisgICAgVHhCdWZDbnQgPSBtYWNwLT5UeEJ1ZkNudDsKKworICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1hY3AtPmNzX2xvY2ssIGlycUZsYWcpOworICAgIHJldHVybiBUeEJ1ZkNudDsKK30KKworVXNiVHhRX3QgKnpmTG54R2V0VXNiVHhCdWZmZXIoemRldl90ICpkZXYpCit7CisgICAgc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gZGV2LT5tbF9wcml2OworICAgIHUxNl90IGlkeDsKKyAgICBVc2JUeFFfdCAqVHhROworICAgIHVuc2lnbmVkIGxvbmcgaXJxRmxhZzsKKworICAgIHNwaW5fbG9ja19pcnFzYXZlKCZtYWNwLT5jc19sb2NrLCBpcnFGbGFnKTsKKworICAgIGlkeCA9ICgobWFjcC0+VHhCdWZIZWFkKzEpICYgKFpNX01BWF9UWF9CVUZfTlVNIC0gMSkpOworCisgICAgLy9pZiAoaWR4ICE9IG1hY3AtPlR4QnVmVGFpbCkKKyAgICBpZiAobWFjcC0+VHhCdWZDbnQgPiAwKQorICAgIHsKKyAgICAgICAgLy9wcmludGsoIkNXWSAtIHpmd0dldFVzYlR4QnVmZmVyICxtYWNwLT5UeEJ1ZkNudCA9ICVkXG4iLCBtYWNwLT5UeEJ1ZkNudCk7CisgICAgICAgIFR4USA9IChVc2JUeFFfdCAqKSYobWFjcC0+VXNiVHhCdWZRW21hY3AtPlR4QnVmSGVhZF0pOworICAgICAgICBtYWNwLT5UeEJ1ZkhlYWQgPSAoKG1hY3AtPlR4QnVmSGVhZCsxKSAmIChaTV9NQVhfVFhfQlVGX05VTSAtIDEpKTsKKyAgICAgICAgbWFjcC0+VHhCdWZDbnQtLTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYgKG1hY3AtPlR4QnVmSGVhZCAhPSBtYWNwLT5UeEJ1ZlRhaWwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiemZ3R2V0VXNiVHhCdWYgVXNiVHhCdWZRIGluY29uc2lzdGVudDogVHhCdWZIZWFkOiAlZCwgVHhCdWZUYWlsOiAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgbWFjcC0+VHhCdWZIZWFkLCBtYWNwLT5UeEJ1ZlRhaWwpOworICAgICAgICB9CisKKyAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWFjcC0+Y3NfbG9jaywgaXJxRmxhZyk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1hY3AtPmNzX2xvY2ssIGlycUZsYWcpOworICAgIHJldHVybiBUeFE7Cit9CisKK3UxNl90IHpmTG54UHV0VXNiVHhCdWZmZXIoemRldl90ICpkZXYsIHU4X3QgKmhkciwgdTE2X3QgaGRybGVuLAorICAgICAgICB1OF90ICpzbmFwLCB1MTZfdCBzbmFwTGVuLCB1OF90ICp0YWlsLCB1MTZfdCB0YWlsTGVuLAorICAgICAgICB6YnVmX3QgKmJ1ZiwgdTE2X3Qgb2Zmc2V0KQoreworICAgIHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IGRldi0+bWxfcHJpdjsKKyAgICB1MTZfdCBpZHg7CisgICAgVXNiVHhRX3QgKlR4UTsKKyAgICB1bnNpZ25lZCBsb25nIGlycUZsYWc7CisKKyAgICBzcGluX2xvY2tfaXJxc2F2ZSgmbWFjcC0+Y3NfbG9jaywgaXJxRmxhZyk7CisKKyAgICBpZHggPSAoKG1hY3AtPlR4QnVmVGFpbCsxKSAmIChaTV9NQVhfVFhfQlVGX05VTSAtIDEpKTsKKworICAgIC8qIEZvciBUeCBkZWJ1ZyAqLworICAgIC8vem1fYXNzZXJ0KG1hY3AtPlR4QnVmQ250ID49IDApOyAvLyBkZWxldGVkIGJlY2F1c2Ugb2YgYWx3YXlzIHRydWUKKworICAgIC8vaWYgKGlkeCAhPSBtYWNwLT5UeEJ1ZkhlYWQpCisgICAgaWYgKG1hY3AtPlR4QnVmQ250IDwgWk1fTUFYX1RYX0JVRl9OVU0pCisgICAgeworICAgICAgICAvL3ByaW50aygiQ1dZIC0gemZ3UHV0VXNiVHhCdWZmZXIgLG1hY3AtPlR4QnVmQ250ID0gJWRcbiIsIG1hY3AtPlR4QnVmQ250KTsKKyAgICAgICAgVHhRID0gKFVzYlR4UV90ICopJihtYWNwLT5Vc2JUeEJ1ZlFbbWFjcC0+VHhCdWZUYWlsXSk7CisgICAgICAgIG1lbWNweShUeFEtPmhkciwgaGRyLCBoZHJsZW4pOworICAgICAgICBUeFEtPmhkcmxlbiA9IGhkcmxlbjsKKyAgICAgICAgbWVtY3B5KFR4US0+c25hcCwgc25hcCwgc25hcExlbik7CisgICAgICAgIFR4US0+c25hcExlbiA9IHNuYXBMZW47CisgICAgICAgIG1lbWNweShUeFEtPnRhaWwsIHRhaWwsIHRhaWxMZW4pOworICAgICAgICBUeFEtPnRhaWxMZW4gPSB0YWlsTGVuOworICAgICAgICBUeFEtPmJ1ZiA9IGJ1ZjsKKyAgICAgICAgVHhRLT5vZmZzZXQgPSBvZmZzZXQ7CisKKyAgICAgICAgbWFjcC0+VHhCdWZUYWlsID0gKChtYWNwLT5UeEJ1ZlRhaWwrMSkgJiAoWk1fTUFYX1RYX0JVRl9OVU0gLSAxKSk7CisgICAgICAgIG1hY3AtPlR4QnVmQ250Kys7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHByaW50ayhLRVJOX0VSUiAiemZMbnhQdXRVc2JUeEJ1ZmZlciBVc2JUeEJ1ZlEgaW5jb25zaXN0ZW50OiBUeEJ1ZkhlYWQ6ICVkLCBUeEJ1ZlRhaWw6ICVkLCBUeEJ1ZkNudDogJWRcbiIsCisgICAgICAgICAgICBtYWNwLT5UeEJ1ZkhlYWQsIG1hY3AtPlR4QnVmVGFpbCwgbWFjcC0+VHhCdWZDbnQpOworICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtYWNwLT5jc19sb2NrLCBpcnFGbGFnKTsKKyAgICAgICAgcmV0dXJuIDB4ZmZmZjsKKyAgICB9CisKKyAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtYWNwLT5jc19sb2NrLCBpcnFGbGFnKTsKKyAgICByZXR1cm4gMDsKK30KKworemJ1Zl90ICp6ZkxueEdldFVzYlJ4QnVmZmVyKHpkZXZfdCAqZGV2KQoreworICAgIHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IGRldi0+bWxfcHJpdjsKKyAgICAvL3UxNl90IGlkeDsKKyAgICB6YnVmX3QgKmJ1ZjsKKyAgICB1bnNpZ25lZCBsb25nIGlycUZsYWc7CisKKyAgICBzcGluX2xvY2tfaXJxc2F2ZSgmbWFjcC0+Y3NfbG9jaywgaXJxRmxhZyk7CisKKyAgICAvL2lkeCA9ICgobWFjcC0+UnhCdWZIZWFkKzEpICYgKFpNX01BWF9SWF9VUkJfTlVNIC0gMSkpOworCisgICAgLy9pZiAoaWR4ICE9IG1hY3AtPlJ4QnVmVGFpbCkKKyAgICBpZiAobWFjcC0+UnhCdWZDbnQgIT0gMCkKKyAgICB7CisgICAgICAgIGJ1ZiA9IG1hY3AtPlVzYlJ4QnVmUVttYWNwLT5SeEJ1ZkhlYWRdOworICAgICAgICBtYWNwLT5SeEJ1ZkhlYWQgPSAoKG1hY3AtPlJ4QnVmSGVhZCsxKSAmIChaTV9NQVhfUlhfVVJCX05VTSAtIDEpKTsKKyAgICAgICAgbWFjcC0+UnhCdWZDbnQtLTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcHJpbnRrKCJSeEJ1ZlEgaW5jb25zaXN0ZW50OiBSeEJ1ZkhlYWQ6ICVkLCBSeEJ1ZlRhaWw6ICVkXG4iLAorICAgICAgICAgICAgICAgIG1hY3AtPlJ4QnVmSGVhZCwgbWFjcC0+UnhCdWZUYWlsKTsKKyAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWFjcC0+Y3NfbG9jaywgaXJxRmxhZyk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1hY3AtPmNzX2xvY2ssIGlycUZsYWcpOworICAgIHJldHVybiBidWY7Cit9CisKK3UzMl90IHpmTG54UHV0VXNiUnhCdWZmZXIoemRldl90ICpkZXYsIHpidWZfdCAqYnVmKQoreworICAgIHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IGRldi0+bWxfcHJpdjsKKyAgICB1MTZfdCBpZHg7CisgICAgdW5zaWduZWQgbG9uZyBpcnFGbGFnOworCisgICAgc3Bpbl9sb2NrX2lycXNhdmUoJm1hY3AtPmNzX2xvY2ssIGlycUZsYWcpOworCisgICAgaWR4ID0gKChtYWNwLT5SeEJ1ZlRhaWwrMSkgJiAoWk1fTUFYX1JYX1VSQl9OVU0gLSAxKSk7CisKKyAgICAvL2lmIChpZHggIT0gbWFjcC0+UnhCdWZIZWFkKQorICAgIGlmIChtYWNwLT5SeEJ1ZkNudCAhPSBaTV9NQVhfUlhfVVJCX05VTSkKKyAgICB7CisgICAgICAgIG1hY3AtPlVzYlJ4QnVmUVttYWNwLT5SeEJ1ZlRhaWxdID0gYnVmOworICAgICAgICBtYWNwLT5SeEJ1ZlRhaWwgPSBpZHg7CisgICAgICAgIG1hY3AtPlJ4QnVmQ250Kys7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHByaW50aygiUnhCdWZRIGluY29uc2lzdGVudDogUnhCdWZIZWFkOiAlZCwgUnhCdWZUYWlsOiAlZFxuIiwKKyAgICAgICAgICAgICAgICBtYWNwLT5SeEJ1ZkhlYWQsIG1hY3AtPlJ4QnVmVGFpbCk7CisgICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1hY3AtPmNzX2xvY2ssIGlycUZsYWcpOworICAgICAgICByZXR1cm4gMHhmZmZmOworICAgIH0KKworICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1hY3AtPmNzX2xvY2ssIGlycUZsYWcpOworICAgIHJldHVybiAwOworfQorCit2b2lkIHpmTG54VXNiRGF0YU91dF9jYWxsYmFjayh1cmJfdCAqdXJiKQoreworICAgIHpkZXZfdCogZGV2ID0gdXJiLT5jb250ZXh0OworICAgIC8vVXNiVHhRX3QgKlR4RGF0YTsKKworICAgIC8qIEdpdmUgdGhlIHVyYiBiYWNrICovCisgICAgemZMbnhQdXRUeFVyYihkZXYpOworCisgICAgLyogQ2hlY2sgd2hldGhlciB0aGVyZSBpcyBhbnkgcGVuZGluZyBidWZmZXIgbmVlZGVkICovCisgICAgLyogdG8gYmUgc2VudCAqLworICAgIGlmICh6ZkxueENoZWNrVHhCdWZmZXJDbnQoZGV2KSAhPSAwKQorICAgIHsKKyAgICAgICAgLy9UeERhdGEgPSB6ZndHZXRVc2JUeEJ1ZmZlcihkZXYpOworCisgICAgICAgIC8vaWYgKFR4RGF0YSA9PSBOVUxMKQorICAgICAgICAvL3sKKyAgICAgICAgLy8gICAgcHJpbnRrKCJHZXQgYSBOVUxMIGJ1ZmZlciBmcm9tIHpmd0dldFVzYlR4QnVmZmVyXG4iKTsKKyAgICAgICAgLy8gICAgcmV0dXJuOworICAgICAgICAvL30KKyAgICAgICAgLy9lbHNlCisgICAgICAgIC8veworICAgICAgICAgICAgemZMbnhVc2JTdWJtaXRUeERhdGEoZGV2KTsKKyAgICAgICAgLy99CisgICAgfQorfQorCit2b2lkIHpmTG54VXNiRGF0YUluX2NhbGxiYWNrKHVyYl90ICp1cmIpCit7CisgICAgemRldl90KiBkZXYgPSB1cmItPmNvbnRleHQ7CisgICAgc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gZGV2LT5tbF9wcml2OworICAgIHpidWZfdCAqYnVmOworICAgIHpidWZfdCAqbmV3X2J1ZjsKKyAgICBpbnQgc3RhdHVzOworCisjaWYgWk1fVVNCX1NUUkVBTV9NT0RFID09IDEKKyAgICBzdGF0aWMgaW50IHJlbWFpbl9sZW4gPSAwLCBjaGVja19wYWQgPSAwLCBjaGVja19sZW4gPSAwOworICAgIGludCBpbmRleCA9IDA7CisgICAgaW50IGNoa19pZHg7CisgICAgdTE2X3QgcGt0X2xlbjsKKyAgICB1MTZfdCBwa3RfdGFnOworICAgIHUxNl90IGlpOworICAgIHpidWZfdCAqcnhCdWZQb29sWzhdOworICAgIHUxNl90IHJ4QnVmUG9vbEluZGV4ID0gMDsKKyNlbmRpZgorCisgICAgLyogQ2hlY2sgc3RhdHVzIGZvciBVUkIgKi8KKyAgICBpZiAodXJiLT5zdGF0dXMgIT0gMCl7CisgICAgICAgIHByaW50aygiemZMbnhVc2JEYXRhSW5fY2FsbGJhY2soKSA6IHN0YXR1cz0weCV4XG4iLCB1cmItPnN0YXR1cyk7CisgICAgICAgIGlmICgodXJiLT5zdGF0dXMgIT0gLUVOT0VOVCkgJiYgKHVyYi0+c3RhdHVzICE9IC1FQ09OTlJFU0VUKQorICAgICAgICAgICAgJiYgKHVyYi0+c3RhdHVzICE9IC1FU0hVVERPV04pKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHVyYi0+c3RhdHVzID09IC1FUElQRSl7CisgICAgICAgICAgICAgICAgICAgIC8vcHJpbnRrKEtFUk5fRVJSICJub256ZXJvIHJlYWQgYnVsayBzdGF0dXMgcmVjZWl2ZWQ6IC1FUElQRSIpOworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSAtMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodXJiLT5zdGF0dXMgPT0gLUVQUk9UTyl7CisgICAgICAgICAgICAgICAgICAgIC8vcHJpbnRrKEtFUk5fRVJSICJub256ZXJvIHJlYWQgYnVsayBzdGF0dXMgcmVjZWl2ZWQ6IC1FUFJPVE8iKTsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gLTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy9wcmludGsoS0VSTl9FUlIgInVyYi0+c3RhdHVzOiAweCUwOHhcbiIsIHVyYi0+c3RhdHVzKTsKKworICAgICAgICAvKiBEZXF1ZXVlIHNrYiBidWZmZXIgKi8KKyAgICAgICAgYnVmID0gemZMbnhHZXRVc2JSeEJ1ZmZlcihkZXYpOworICAgICAgICBkZXZfa2ZyZWVfc2tiX2FueShidWYpOworICAgICAgICAjaWYgMAorICAgICAgICAvKiBFbnF1ZXVlIHNrYiBidWZmZXIgKi8KKyAgICAgICAgemZMbnhQdXRVc2JSeEJ1ZmZlcihkZXYsIGJ1Zik7CisKKyAgICAgICAgLyogU3VibWl0IGEgUnggdXJiICovCisgICAgICAgIHpmTG54VXNiSW4oZGV2LCB1cmIsIGJ1Zik7CisgICAgICAgICNlbmRpZgorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKHVyYi0+YWN0dWFsX2xlbmd0aCA9PSAwKQorICAgIHsKKyAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJHZXQgYW4gVVJCIHdob3NlIGxlbmd0aCBpcyB6ZXJvIik7CisgICAgICAgIHN0YXR1cyA9IC0xOworICAgIH0KKworICAgIC8qIERlcXVldWUgc2tiIGJ1ZmZlciAqLworICAgIGJ1ZiA9IHpmTG54R2V0VXNiUnhCdWZmZXIoZGV2KTsKKworICAgIC8vemZ3QnVmU2V0U2l6ZShkZXYsIGJ1ZiwgdXJiLT5hY3R1YWxfbGVuZ3RoKTsKKyNpZmRlZiBORVRfU0tCVUZGX0RBVEFfVVNFU19PRkZTRVQKKyAgICBidWYtPnRhaWwgPSAwOworICAgIGJ1Zi0+bGVuID0gMDsKKyNlbHNlCisgICAgYnVmLT50YWlsID0gYnVmLT5kYXRhOworICAgIGJ1Zi0+bGVuID0gMDsKKyNlbmRpZgorCisgICAgaWYgKChidWYtPnRhaWwgKyB1cmItPmFjdHVhbF9sZW5ndGgpID4gYnVmLT5lbmQpCisgICAgICAgIEJVRygpOworCisgICAgc2tiX3B1dChidWYsIHVyYi0+YWN0dWFsX2xlbmd0aCk7CisKKyNpZiBaTV9VU0JfU1RSRUFNX01PREUgPT0gMQorICAgIGlmIChyZW1haW5fbGVuICE9IDApCisgICAgeworICAgICAgICB6YnVmX3QgKnJlbWFpbl9idWYgPSBtYWNwLT5yZWFtaW5fYnVmOworCisgICAgICAgIGluZGV4ID0gcmVtYWluX2xlbjsKKyAgICAgICAgcmVtYWluX2xlbiAtPSBjaGVja19wYWQ7CisKKyAgICAgICAgLyogIENvcHkgZGF0YSAqLworICAgICAgICBtZW1jcHkoJihyZW1haW5fYnVmLT5kYXRhW2NoZWNrX2xlbl0pLCBidWYtPmRhdGEsIHJlbWFpbl9sZW4pOworICAgICAgICBjaGVja19sZW4gKz0gcmVtYWluX2xlbjsKKyAgICAgICAgcmVtYWluX2xlbiA9IDA7CisKKyAgICAgICAgcnhCdWZQb29sW3J4QnVmUG9vbEluZGV4KytdID0gcmVtYWluX2J1ZjsKKyAgICB9CisKKyAgICB3aGlsZShpbmRleCA8IHVyYi0+YWN0dWFsX2xlbmd0aCkKKyAgICB7CisgICAgICAgIHBrdF9sZW4gPSBidWYtPmRhdGFbaW5kZXhdICsgKGJ1Zi0+ZGF0YVtpbmRleCsxXSA8PCA4KTsKKyAgICAgICAgcGt0X3RhZyA9IGJ1Zi0+ZGF0YVtpbmRleCsyXSArIChidWYtPmRhdGFbaW5kZXgrM10gPDwgOCk7CisKKyAgICAgICAgaWYgKHBrdF90YWcgPT0gMHg0ZTAwKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgcGFkX2xlbjsKKworICAgICAgICAgICAgLy9wcmludGsoIkdldCBhIHBhY2tldCwgaW5kZXg6ICVkLCBwa3RfbGVuOiAweCUwNHhcbiIsIGluZGV4LCBwa3RfbGVuKTsKKyAgICAgICAgICAgICNpZiAwCisgICAgICAgICAgICAvKiBEdW1wIGRhdGEgKi8KKyAgICAgICAgICAgIGZvciAoaWkgPSBpbmRleDsgaWkgPCBwa3RfbGVuKzQ7KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHByaW50aygiJTAyeCAiLCAoYnVmLT5kYXRhW2lpXSAmIDB4ZmYpKTsKKworICAgICAgICAgICAgICAgIGlmICgoKytpaSAlIDE2KSA9PSAwKQorICAgICAgICAgICAgICAgICAgICBwcmludGsoIlxuIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHByaW50aygiXG4iKTsKKyAgICAgICAgICAgICNlbmRpZgorCisgICAgICAgICAgICBwYWRfbGVuID0gNCAtIChwa3RfbGVuICYgMHgzKTsKKworICAgICAgICAgICAgaWYocGFkX2xlbiA9PSA0KQorICAgICAgICAgICAgICAgIHBhZF9sZW4gPSAwOworCisgICAgICAgICAgICBjaGtfaWR4ID0gaW5kZXg7CisgICAgICAgICAgICBpbmRleCA9IGluZGV4ICsgNCArIHBrdF9sZW4gKyBwYWRfbGVuOworCisgICAgICAgICAgICBpZiAoaW5kZXggPiBaTV9NQVhfUlhfQlVGRkVSX1NJWkUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmVtYWluX2xlbiA9IGluZGV4IC0gWk1fTUFYX1JYX0JVRkZFUl9TSVpFOyAvLyAtIHBhZF9sZW47CisgICAgICAgICAgICAgICAgY2hlY2tfbGVuID0gWk1fTUFYX1JYX0JVRkZFUl9TSVpFIC0gY2hrX2lkeCAtIDQ7CisgICAgICAgICAgICAgICAgY2hlY2tfcGFkID0gcGFkX2xlbjsKKworICAgICAgICAgICAgICAgIC8qIEFsbG9jYXRlIGEgc2tiIGJ1ZmZlciAqLworICAgICAgICAgICAgICAgIC8vbmV3X2J1ZiA9IHpmd0J1ZkFsbG9jYXRlKGRldiwgWk1fTUFYX1JYX0JVRkZFUl9TSVpFKTsKKyAgICAgICAgICAgICAgICBuZXdfYnVmID0gZGV2X2FsbG9jX3NrYihaTV9NQVhfUlhfQlVGRkVSX1NJWkUpOworCisgICAgICAgICAgICAgICAgLyogU2V0IHNrYiBidWZmZXIgbGVuZ3RoICovCisgICAgICAgICAgICAjaWZkZWYgTkVUX1NLQlVGRl9EQVRBX1VTRVNfT0ZGU0VUCisgICAgICAgICAgICAgICAgbmV3X2J1Zi0+dGFpbCA9IDA7CisgICAgICAgICAgICAgICAgbmV3X2J1Zi0+bGVuID0gMDsKKyAgICAgICAgICAgICNlbHNlCisgICAgICAgICAgICAgICAgbmV3X2J1Zi0+dGFpbCA9IG5ld19idWYtPmRhdGE7CisgICAgICAgICAgICAgICAgbmV3X2J1Zi0+bGVuID0gMDsKKyAgICAgICAgICAgICNlbmRpZgorCisgICAgICAgICAgICAgICAgc2tiX3B1dChuZXdfYnVmLCBwa3RfbGVuKTsKKworICAgICAgICAgICAgICAgIC8qIENvcHkgdGhlIGJ1ZmZlciAqLworICAgICAgICAgICAgICAgIG1lbWNweShuZXdfYnVmLT5kYXRhLCAmKGJ1Zi0+ZGF0YVtjaGtfaWR4KzRdKSwgY2hlY2tfbGVuKTsKKworICAgICAgICAgICAgICAgIC8qIFJlY29yZCB0aGUgYnVmZmVyIHBvaW50ZXIgKi8KKyAgICAgICAgICAgICAgICBtYWNwLT5yZWFtaW5fYnVmID0gbmV3X2J1ZjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgI2lmZGVmIFpNX0RPTlRfQ09QWV9SWF9CVUZGRVIKKyAgICAgICAgICAgICAgICBpZiAocnhCdWZQb29sSW5kZXggPT0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG5ld19idWYgPSBza2JfY2xvbmUoYnVmLCBHRlBfQVRPTUlDKTsKKworICAgICAgICAgICAgICAgICAgICBuZXdfYnVmLT5kYXRhID0gJihidWYtPmRhdGFbY2hrX2lkeCs0XSk7CisgICAgICAgICAgICAgICAgICAgIG5ld19idWYtPmxlbiA9IHBrdF9sZW47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICNlbmRpZgorICAgICAgICAgICAgICAgIC8qIEFsbG9jYXRlIGEgc2tiIGJ1ZmZlciAqLworICAgICAgICAgICAgICAgIG5ld19idWYgPSBkZXZfYWxsb2Nfc2tiKFpNX01BWF9SWF9CVUZGRVJfU0laRSk7CisKKyAgICAgICAgICAgICAgICAvKiBTZXQgc2tiIGJ1ZmZlciBsZW5ndGggKi8KKyAgICAgICAgICAgICNpZmRlZiBORVRfU0tCVUZGX0RBVEFfVVNFU19PRkZTRVQKKyAgICAgICAgICAgICAgICBuZXdfYnVmLT50YWlsID0gMDsKKyAgICAgICAgICAgICAgICBuZXdfYnVmLT5sZW4gPSAwOworICAgICAgICAgICAgI2Vsc2UKKyAgICAgICAgICAgICAgICBuZXdfYnVmLT50YWlsID0gbmV3X2J1Zi0+ZGF0YTsKKyAgICAgICAgICAgICAgICBuZXdfYnVmLT5sZW4gPSAwOworICAgICAgICAgICAgI2VuZGlmCisKKyAgICAgICAgICAgICAgICBza2JfcHV0KG5ld19idWYsIHBrdF9sZW4pOworCisgICAgICAgICAgICAgICAgLyogQ29weSB0aGUgYnVmZmVyICovCisgICAgICAgICAgICAgICAgbWVtY3B5KG5ld19idWYtPmRhdGEsICYoYnVmLT5kYXRhW2Noa19pZHgrNF0pLCBwa3RfbGVuKTsKKworICAgICAgICAjaWZkZWYgWk1fRE9OVF9DT1BZX1JYX0JVRkZFUgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgI2VuZGlmCisgICAgICAgICAgICAgICAgcnhCdWZQb29sW3J4QnVmUG9vbEluZGV4KytdID0gbmV3X2J1ZjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiQ2FuJ3QgZmluZCB0YWcsIHBrdF9sZW46IDB4JTA0eCwgdGFnOiAweCUwNHhcbiIsIHBrdF9sZW4sIHBrdF90YWcpOworCisgICAgICAgICAgICAvKiBGcmVlIGJ1ZmZlciAqLworICAgICAgICAgICAgZGV2X2tmcmVlX3NrYl9hbnkoYnVmKTsKKworICAgICAgICAgICAgLyogQWxsb2NhdGUgYSBza2IgYnVmZmVyICovCisgICAgICAgICAgICBuZXdfYnVmID0gZGV2X2FsbG9jX3NrYihaTV9NQVhfUlhfQlVGRkVSX1NJWkUpOworCisgICAgICAgICAgICAvKiBFbnF1ZXVlIHNrYiBidWZmZXIgKi8KKyAgICAgICAgICAgIHpmTG54UHV0VXNiUnhCdWZmZXIoZGV2LCBuZXdfYnVmKTsKKworICAgICAgICAgICAgLyogU3VibWl0IGEgUnggdXJiICovCisgICAgICAgICAgICB6ZkxueFVzYkluKGRldiwgdXJiLCBuZXdfYnVmKTsKKworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgLyogRnJlZSBidWZmZXIgKi8KKyAgICBkZXZfa2ZyZWVfc2tiX2FueShidWYpOworI2VuZGlmCisKKyAgICAvKiBBbGxvY2F0ZSBhIHNrYiBidWZmZXIgKi8KKyAgICBuZXdfYnVmID0gZGV2X2FsbG9jX3NrYihaTV9NQVhfUlhfQlVGRkVSX1NJWkUpOworCisgICAgLyogRW5xdWV1ZSBza2IgYnVmZmVyICovCisgICAgemZMbnhQdXRVc2JSeEJ1ZmZlcihkZXYsIG5ld19idWYpOworCisgICAgLyogU3VibWl0IGEgUnggdXJiICovCisgICAgemZMbnhVc2JJbihkZXYsIHVyYiwgbmV3X2J1Zik7CisKKyNpZiBaTV9VU0JfU1RSRUFNX01PREUgPT0gMQorICAgIGZvcihpaSA9IDA7IGlpIDwgcnhCdWZQb29sSW5kZXg7IGlpKyspCisgICAgeworICAgICAgICBtYWNwLT51c2JDYkZ1bmN0aW9ucy56ZmNiVXNiUmVjdihkZXYsIHJ4QnVmUG9vbFtpaV0pOworICAgIH0KKyNlbHNlCisgICAgLyogcGFzcyBkYXRhIHRvIHVwcGVyIGxheWVyICovCisgICAgbWFjcC0+dXNiQ2JGdW5jdGlvbnMuemZjYlVzYlJlY3YoZGV2LCBidWYpOworI2VuZGlmCit9CisKK3ZvaWQgemZMbnhVc2JSZWdPdXRfY2FsbGJhY2sodXJiX3QgKnVyYikKK3sKKyAgICAvL2Rldl90KiBkZXYgPSB1cmItPmNvbnRleHQ7CisKKyAgICAvL3ByaW50ayhLRVJOX0VSUiAiemZ3VXNiUmVnT3V0X2NhbGxiYWNrXG4iKTsKK30KKwordm9pZCB6ZkxueFVzYlJlZ0luX2NhbGxiYWNrKHVyYl90ICp1cmIpCit7CisgICAgemRldl90KiBkZXYgPSB1cmItPmNvbnRleHQ7CisgICAgdTMyX3QgcnNwWzY0LzRdOworICAgIGludCBzdGF0dXM7CisgICAgc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gZGV2LT5tbF9wcml2OworCisgICAgLyogQ2hlY2sgc3RhdHVzIGZvciBVUkIgKi8KKyAgICBpZiAodXJiLT5zdGF0dXMgIT0gMCl7CisgICAgICAgIHByaW50aygiemZMbnhVc2JSZWdJbl9jYWxsYmFjaygpIDogc3RhdHVzPTB4JXhcbiIsIHVyYi0+c3RhdHVzKTsKKyAgICAgICAgaWYgKCh1cmItPnN0YXR1cyAhPSAtRU5PRU5UKSAmJiAodXJiLT5zdGF0dXMgIT0gLUVDT05OUkVTRVQpCisgICAgICAgICAgICAmJiAodXJiLT5zdGF0dXMgIT0gLUVTSFVURE9XTikpCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAodXJiLT5zdGF0dXMgPT0gLUVQSVBFKXsKKyAgICAgICAgICAgICAgICAgICAgLy9wcmludGsoS0VSTl9FUlIgIm5vbnplcm8gcmVhZCBidWxrIHN0YXR1cyByZWNlaXZlZDogLUVQSVBFIik7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IC0xOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh1cmItPnN0YXR1cyA9PSAtRVBST1RPKXsKKyAgICAgICAgICAgICAgICAgICAgLy9wcmludGsoS0VSTl9FUlIgIm5vbnplcm8gcmVhZCBidWxrIHN0YXR1cyByZWNlaXZlZDogLUVQUk9UTyIpOworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSAtMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvL3ByaW50ayhLRVJOX0VSUiAidXJiLT5zdGF0dXM6IDB4JTA4eFxuIiwgdXJiLT5zdGF0dXMpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKHVyYi0+YWN0dWFsX2xlbmd0aCA9PSAwKQorICAgIHsKKyAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJHZXQgYW4gVVJCIHdob3NlIGxlbmd0aCBpcyB6ZXJvIik7CisgICAgICAgIHN0YXR1cyA9IC0xOworICAgIH0KKworICAgIC8qIENvcHkgZGF0YSBpbnRvIHJlc3BvbmUgYnVmZmVyICovCisgICAgbWVtY3B5KHJzcCwgbWFjcC0+cmVnVXNiUmVhZEJ1ZiwgdXJiLT5hY3R1YWxfbGVuZ3RoKTsKKworICAgIC8qIE5vdGlmeSB0byB1cHBlciBsYXllciAqLworICAgIC8vemZJZGxDaGtSc3AoZGV2LCByc3AsICh1MTZfdCl1cmItPmFjdHVhbF9sZW5ndGgpOworICAgIC8vemZpVXNiUmVnSW4oZGV2LCByc3AsICh1MTZfdCl1cmItPmFjdHVhbF9sZW5ndGgpOworICAgIG1hY3AtPnVzYkNiRnVuY3Rpb25zLnpmY2JVc2JSZWdJbihkZXYsIHJzcCwgKHUxNl90KXVyYi0+YWN0dWFsX2xlbmd0aCk7CisKKyAgICAvKiBJc3N1ZSBhbm90aGVyIFVTQiBJTiBVUkIgKi8KKyAgICB6ZkxueFN1Ym1pdFJlZ0luVXJiKGRldik7Cit9CisKK3UzMl90IHpmTG54U3VibWl0UmVnSW5VcmIoemRldl90ICpkZXYpCit7CisgICAgdTMyX3QgcmV0OworICAgIHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IGRldi0+bWxfcHJpdjsKKworICAgIC8qIFN1Ym1pdCBhIHJ4IHVyYiAqLworICAgIC8vcmV0ID0gemZMbnhVc2JTdWJtaXRCdWxrVXJiKG1hY3AtPlJlZ0luVXJiLCBtYWNwLT51ZGV2LAorICAgIC8vICAgICAgICBVU0JfUkVHX0lOX1BJUEUsIFVTQl9ESVJfSU4sIG1hY3AtPnJlZ1VzYlJlYWRCdWYsCisgICAgLy8gICAgICAgIFpNX1VTQl9SRUdfTUFYX0JVRl9TSVpFLCB6ZkxueFVzYlJlZ0luX2NhbGxiYWNrLCBkZXYpOworICAgIC8vQ1dZYW5nKC0pCisgICAgLy9pZiAocmV0ICE9IDApCisgICAgLy8gICAgcHJpbnRrKCJ6ZndVc2JTdWJtaXRCdWxrVXJiIGZhaWwsIHN0YXR1czogMHglMDh4XG4iLCAoaW50KXJldCk7CisKKyAgICByZXQgPSB6ZkxueFVzYlN1Ym1pdEludFVyYihtYWNwLT5SZWdJblVyYiwgbWFjcC0+dWRldiwKKyAgICAgICAgICAgIFVTQl9SRUdfSU5fUElQRSwgVVNCX0RJUl9JTiwgbWFjcC0+cmVnVXNiUmVhZEJ1ZiwKKyAgICAgICAgICAgIFpNX1VTQl9SRUdfTUFYX0JVRl9TSVpFLCB6ZkxueFVzYlJlZ0luX2NhbGxiYWNrLCBkZXYsIDEpOworCisgICAgcmV0dXJuIHJldDsKK30KKwordTMyX3QgemZMbnhVc2JTdWJtaXRUeERhdGEoemRldl90KiBkZXYpCit7CisgICAgdTMyX3QgaTsKKyAgICB1MzJfdCByZXQ7CisgICAgdTE2X3QgZnJlZVR4VXJiOworICAgIHU4X3QgKnB1VHhCdWYgPSBOVUxMOworICAgIFVzYlR4UV90ICpUeERhdGE7CisgICAgaW50IGxlbiA9IDA7CisgICAgc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gZGV2LT5tbF9wcml2OworI2lmIFpNX1VTQl9UWF9TVFJFQU1fTU9ERSA9PSAxCisgICAgdThfdCAgICAgICAgICAgICAgIGlpOworICAgIHUxNl90ICAgICAgICAgICAgICBvZmZzZXQgPSAwOworICAgIHUxNl90ICAgICAgICAgICAgICB1c2JUeEFnZ0NudDsKKyAgICB1MTZfdCAgICAgICAgICAgICAgKnBVc2JUeEhkcjsKKyAgICBVc2JUeFFfdCAgICAgICAgICAgKlR4UVBvb2xbWk1fTUFYX1RYX0FHR1JFR0FURV9OVU1dOworI2VuZGlmCisKKyAgICAvKiBGaXJzdCBjaGVjayB3aGV0aGVyIHRoZXJlIGlzIGEgZnJlZSBVUkIgKi8KKyAgICBmcmVlVHhVcmIgPSB6ZkxueEdldEZyZWVUeFVyYihkZXYpOworCisgICAgLyogSWYgdGhlcmUgaXMgbm8gYW55IGZyZWUgVHggVXJiICovCisgICAgaWYgKGZyZWVUeFVyYiA9PSAweGZmZmYpCisgICAgeworICAgICAgICAvL3ByaW50ayhLRVJOX0VSUiAiQ2FuJ3QgZ2V0IGZyZWUgVHggVXJiXG4iKTsKKyAgICAgICAgLy9wcmludGsoIkNXWSAtIENhbid0IGdldCBmcmVlIFR4IFVyYlxuIik7CisgICAgICAgIHJldHVybiAweGZmZmY7CisgICAgfQorCisjaWYgWk1fVVNCX1RYX1NUUkVBTV9NT0RFID09IDEKKyAgICB1c2JUeEFnZ0NudCA9IHpmTG54Q2hlY2tUeEJ1ZmZlckNudChkZXYpOworCisgICAgaWYgKHVzYlR4QWdnQ250ID49IFpNX01BWF9UWF9BR0dSRUdBVEVfTlVNKQorICAgIHsKKyAgICAgICB1c2JUeEFnZ0NudCA9IFpNX01BWF9UWF9BR0dSRUdBVEVfTlVNOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgIHVzYlR4QWdnQ250ID0gMTsKKyAgICB9CisKKyAgICAvL3ByaW50aygidXNiVHhBZ2dDbnQ6ICVkXG4iLCB1c2JUeEFnZ0NudCk7CisjZW5kaWYKKworI2lmIFpNX1VTQl9UWF9TVFJFQU1fTU9ERSA9PSAxCisgICAgZm9yKGlpID0gMDsgaWkgPCB1c2JUeEFnZ0NudDsgaWkrKykKKyAgICB7CisjZW5kaWYKKyAgICAvKiBEZXF1ZXVlIHRoZSBwYWNrZXQgZnJvbSBVc2JUeEJ1ZlEgKi8KKyAgICBUeERhdGEgPSB6ZkxueEdldFVzYlR4QnVmZmVyKGRldik7CisgICAgaWYgKFR4RGF0YSA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgLyogR2l2ZSB0aGUgdXJiIGJhY2sgKi8KKyAgICAgICAgemZMbnhQdXRUeFVyYihkZXYpOworICAgICAgICByZXR1cm4gMHhmZmZmOworICAgIH0KKworICAgIC8qIFBvaW50IHRvIHRoZSBmcmVlVHhVcmIgYnVmZmVyICovCisgICAgcHVUeEJ1ZiA9IG1hY3AtPnR4VXNiQnVmW2ZyZWVUeFVyYl07CisKKyNpZiBaTV9VU0JfVFhfU1RSRUFNX01PREUgPT0gMQorICAgIHB1VHhCdWYgKz0gb2Zmc2V0OworICAgIHBVc2JUeEhkciA9ICh1MTZfdCAqKXB1VHhCdWY7CisKKyAgICAvKiBBZGQgdGhlIHBhY2tldCBsZW5ndGggYW5kIHRhZyBpbmZvcm1hdGlvbiAqLworICAgICpwVXNiVHhIZHIrKyA9IFR4RGF0YS0+aGRybGVuICsgVHhEYXRhLT5zbmFwTGVuICsKKyAgICAgICAgICAgICAoVHhEYXRhLT5idWYtPmxlbiAtIFR4RGF0YS0+b2Zmc2V0KSArICBUeERhdGEtPnRhaWxMZW47CisKKyAgICAqcFVzYlR4SGRyKysgPSAweDY5N2U7CisKKyAgICBwdVR4QnVmICs9IDQ7CisjZW5kaWYgLy8gI2lmZGVmIFpNX1VTQl9UWF9TVFJFQU1fTU9ERQorCisgICAgLyogQ29weSBXTEFOIGhlYWRlciBhbmQgcGFja2V0IGJ1ZmZlciBpbnRvIFVTQiBidWZmZXIgKi8KKyAgICBmb3IoaSA9IDA7IGkgPCBUeERhdGEtPmhkcmxlbjsgaSsrKQorICAgIHsKKyAgICAgICAgKnB1VHhCdWYrKyA9IFR4RGF0YS0+aGRyW2ldOworICAgIH0KKworICAgIC8qIENvcHkgU05BUCBoZWFkZXIgKi8KKyAgICBmb3IoaSA9IDA7IGkgPCBUeERhdGEtPnNuYXBMZW47IGkrKykKKyAgICB7CisgICAgICAgICpwdVR4QnVmKysgPSBUeERhdGEtPnNuYXBbaV07CisgICAgfQorCisgICAgLyogQ29weSBwYWNrZXQgYnVmZmVyICovCisgICAgZm9yKGkgPSAwOyBpIDwgVHhEYXRhLT5idWYtPmxlbiAtIFR4RGF0YS0+b2Zmc2V0OyBpKyspCisgICAgeworICAgIAkvLypwdVR4QnVmKysgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgVHhEYXRhLT5idWYsIGkpOworICAgIAkqcHVUeEJ1ZisrID0gKih1OF90KikoKHU4X3QqKVR4RGF0YS0+YnVmLT5kYXRhK2krVHhEYXRhLT5vZmZzZXQpOworICAgIH0KKworICAgIC8qIENvcHkgdGFpbCAqLworICAgIGZvcihpID0gMDsgaSA8IFR4RGF0YS0+dGFpbExlbjsgaSsrKQorICAgIHsKKyAgICAgICAgKnB1VHhCdWYrKyA9IFR4RGF0YS0+dGFpbFtpXTsKKyAgICB9CisKKyAgICBsZW4gPSBUeERhdGEtPmhkcmxlbitUeERhdGEtPnNuYXBMZW4rVHhEYXRhLT5idWYtPmxlbitUeERhdGEtPnRhaWxMZW4tVHhEYXRhLT5vZmZzZXQ7CisKKyAgICAjaWYgMAorICAgIGlmIChUeERhdGEtPmhkcmxlbiAhPSAwKQorICAgIHsKKyAgICAgICAgcHVUeEJ1ZiA9IG1hY3AtPnR4VXNiQnVmW2ZyZWVUeFVyYl07CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgcHJpbnRrKCIlMDJ4ICIsIHB1VHhCdWZbaV0pOworICAgICAgICAgICAgaWYgKGkgJSAxNiA9PSAxNSkKKyAgICAgICAgICAgICAgICBwcmludGsoIlxuIik7CisgICAgICAgIH0KKyAgICAgICAgcHJpbnRrKCJcbiIpOworICAgIH0KKyAgICAjZW5kaWYKKyAgICAjaWYgMAorICAgIC8qIEZvciBkZWJ1ZyBwdXJwb3NlICovCisgICAgaWYoVHhEYXRhLT5oZHJbOV0gJiAweDQwKQorICAgIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIHUxNl90IGN0cmxMZW4gPSBUeERhdGEtPmhkclswXSArIChUeERhdGEtPmhkclsxXSA8PCA4KTsKKworICAgICAgICBpZiAoY3RybExlbiAhPSBsZW4gKyA0KQorICAgICAgICB7CisgICAgICAgIC8qIER1bXAgY29udHJvbCBzZXR0aW5nICovCisgICAgICAgIGZvcihpID0gMDsgaSA8IDg7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICIweCUwMnggIiwgVHhEYXRhLT5oZHJbaV0pOworICAgICAgICB9CisgICAgICAgIHByaW50ayhLRVJOX0VSUiAiXG4iKTsKKworICAgICAgICBwcmludGsoS0VSTl9FUlIgImN0ckxlbjogJWQsIGhkckxlbjogJWQsIHNuYXBMZW46ICVkXG4iLCBjdHJsTGVuLCBUeERhdGEtPmhkcmxlbiwgVHhEYXRhLT5zbmFwTGVuKTsKKyAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJidWZMZW46ICVkLCB0YWlsTGVuOiAlZCwgbGVuOiAlZFxuIiwgVHhEYXRhLT5idWYtPmxlbiwgVHhEYXRhLT50YWlsTGVuLCBsZW4pOworICAgICAgICB9CisgICAgfQorICAgICNlbmRpZgorCisjaWYgWk1fVVNCX1RYX1NUUkVBTV9NT0RFID09IDEKKyAgICAvLyBBZGQgdGhlIExlbmd0aCBhbmQgVGFnCisgICAgbGVuICs9IDQ7CisKKyAgICAvL3ByaW50aygiJWQgcGFja2V0LCBsZW5ndGg6ICVkXG4iLCBpaSsxLCBsZW4pOworCisgICAgaWYgKGlpIDwgKFpNX01BWF9UWF9BR0dSRUdBVEVfTlVNLTEpKQorICAgIHsKKyAgICAgICAgLyogUGFkIHRoZSBidWZmZXIgdG8gZmlybXdhcmUgZGVzY3JpcHRvciBib3VuZGFyeSAqLworICAgICAgICBvZmZzZXQgKz0gKCgobGVuLTEpIC8gNCkgKyAxKSAqIDQ7CisgICAgfQorCisgICAgaWYgKGlpID09IChaTV9NQVhfVFhfQUdHUkVHQVRFX05VTS0xKSkKKyAgICB7CisgICAgICAgIGxlbiArPSBvZmZzZXQ7CisgICAgfQorCisgICAgVHhRUG9vbFtpaV0gPSBUeERhdGE7CisKKyAgICAvL0RiZ1ByaW50KCIlZCBwYWNrZXQsIG9mZnNldDogJWRcbiIsIGlpKzEsIHBVc2JUeFRyYW5zZmVyLT5vZmZzZXQpOworCisgICAgLyogZnJlZSBwYWNrZXQgKi8KKyAgICAvL3pmQnVmRnJlZShkZXYsIHR4RGF0YS0+YnVmKTsKKyAgICB9CisjZW5kaWYKKyAgICAvL3ByaW50aygiQ1dZIC0gY2FsbCB6ZndVc2JTdWJtaXRCdWxrVXJiKCksIGxlbiA9IDB4JWRcbiIsIGxlbik7CisgICAgLyogU3VibWl0IGEgdHggdXJiICovCisgICAgcmV0ID0gemZMbnhVc2JTdWJtaXRCdWxrVXJiKG1hY3AtPldsYW5UeERhdGFVcmJbZnJlZVR4VXJiXSwgbWFjcC0+dWRldiwKKyAgICAgICAgICAgIFVTQl9XTEFOX1RYX1BJUEUsIFVTQl9ESVJfT1VULCBtYWNwLT50eFVzYkJ1ZltmcmVlVHhVcmJdLAorICAgICAgICAgICAgbGVuLCB6ZkxueFVzYkRhdGFPdXRfY2FsbGJhY2ssIGRldik7CisgICAgLy9DV1lhbmcoLSkKKyAgICAvL2lmIChyZXQgIT0gMCkKKyAgICAvLyAgICBwcmludGsoInpmd1VzYlN1Ym1pdEJ1bGtVcmIgZmFpbCwgc3RhdHVzOiAweCUwOHhcbiIsIChpbnQpcmV0KTsKKworICAgIC8qIGZyZWUgcGFja2V0ICovCisgICAgLy9kZXZfa2ZyZWVfc2tiX2FueShUeERhdGEtPmJ1Zik7CisjaWYgWk1fVVNCX1RYX1NUUkVBTV9NT0RFID09IDEKKyAgICBmb3IoaWkgPSAwOyBpaSA8IHVzYlR4QWdnQ250OyBpaSsrKQorICAgICAgICBtYWNwLT51c2JDYkZ1bmN0aW9ucy56ZmNiVXNiT3V0Q29tcGxldGUoZGV2LCBUeFFQb29sW2lpXS0+YnVmLCAxLCBUeFFQb29sW2lpXS0+aGRyKTsKKyNlbHNlCisgICAgbWFjcC0+dXNiQ2JGdW5jdGlvbnMuemZjYlVzYk91dENvbXBsZXRlKGRldiwgVHhEYXRhLT5idWYsIDEsIFR4RGF0YS0+aGRyKTsKKyNlbmRpZgorCisgICAgcmV0dXJuIHJldDsKK30KKworCisKK3UzMl90IHpmTG54VXNiSW4oemRldl90KiBkZXYsIHVyYl90ICp1cmIsIHpidWZfdCAqYnVmKQoreworICAgIHUzMl90IHJldDsKKyAgICBzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AgPSBkZXYtPm1sX3ByaXY7CisKKyAgICAvKiBTdWJtaXQgYSByeCB1cmIgKi8KKyAgICByZXQgPSB6ZkxueFVzYlN1Ym1pdEJ1bGtVcmIodXJiLCBtYWNwLT51ZGV2LCBVU0JfV0xBTl9SWF9QSVBFLAorICAgICAgICAgICAgVVNCX0RJUl9JTiwgYnVmLT5kYXRhLCBaTV9NQVhfUlhfQlVGRkVSX1NJWkUsCisgICAgICAgICAgICB6ZkxueFVzYkRhdGFJbl9jYWxsYmFjaywgZGV2KTsKKyAgICAvL0NXWWFuZygtKQorICAgIC8vaWYgKHJldCAhPSAwKQorICAgIC8vICAgIHByaW50aygiemZ3VXNiU3VibWl0QnVsa1VyYiBmYWlsLCBzdGF0dXM6IDB4JTA4eFxuIiwgKGludClyZXQpOworCisgICAgcmV0dXJuIHJldDsKK30KKwordTMyX3QgemZMbnhVc2JXcml0ZVJlZyh6ZGV2X3QqIGRldiwgdTMyX3QqIGNtZCwgdTE2X3QgY21kTGVuKQoreworICAgIHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IGRldi0+bWxfcHJpdjsKKyAgICB1MzJfdCByZXQ7CisKKyNpZmRlZiBaTV9DT05GSUdfQklHX0VORElBTgorICAgIGludCBpaSA9IDA7CisKKyAgICBmb3IoaWk9MDsgaWk8KGNtZExlbj4+Mik7IGlpKyspCisJY21kW2lpXSA9IGNwdV90b19sZTMyKGNtZFtpaV0pOworI2VuZGlmCisKKyAgICBtZW1jcHkobWFjcC0+cmVnVXNiV3JpdGVCdWYsIGNtZCwgY21kTGVuKTsKKworICAgIC8qIElzc3VlIGFuIFVTQiBPdXQgdHJhbnNmZXIgKi8KKyAgICAvKiBTdWJtaXQgYSB0eCB1cmIgKi8KKyAgICByZXQgPSB6ZkxueFVzYlN1Ym1pdEludFVyYihtYWNwLT5SZWdPdXRVcmIsIG1hY3AtPnVkZXYsCisgICAgICAgICAgICBVU0JfUkVHX09VVF9QSVBFLCBVU0JfRElSX09VVCwgbWFjcC0+cmVnVXNiV3JpdGVCdWYsCisgICAgICAgICAgICBjbWRMZW4sIHpmTG54VXNiUmVnT3V0X2NhbGxiYWNrLCBkZXYsIDEpOworCisgICAgcmV0dXJuIHJldDsKK30KKworCit1MzJfdCB6ZkxueFVzYk91dCh6ZGV2X3QqIGRldiwgdThfdCAqaGRyLCB1MTZfdCBoZHJsZW4sIHU4X3QgKnNuYXAsIHUxNl90IHNuYXBMZW4sCisgICAgICAgIHU4X3QgKnRhaWwsIHUxNl90IHRhaWxMZW4sIHpidWZfdCAqYnVmLCB1MTZfdCBvZmZzZXQpCit7CisgICAgdTMyX3QgcmV0OworICAgIHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IGRldi0+bWxfcHJpdjsKKworICAgIC8qIENoZWNrIGxlbmd0aCBvZiB0YWlsIGJ1ZmZlciAqLworICAgIC8vem1fYXNzZXJ0KCh0YWlsTGVuIDw9IDE2KSk7CisKKyAgICAvKiBFbnF1ZXVlIHRoZSBwYWNrZXQgaW50byBVc2JUeEJ1ZlEgKi8KKyAgICBpZiAoemZMbnhQdXRVc2JUeEJ1ZmZlcihkZXYsIGhkciwgaGRybGVuLCBzbmFwLCBzbmFwTGVuLCB0YWlsLCB0YWlsTGVuLCBidWYsIG9mZnNldCkgPT0gMHhmZmZmKQorICAgIHsKKyAgICAgICAgLyogZnJlZSBwYWNrZXQgKi8KKyAgICAgICAgLy9wcmludGsoIkNXWSAtIHpmd1B1dFVzYlR4QnVmZmVyIEVycm9yLCBmcmVlIHBhY2tldFxuIik7CisgICAgICAgIC8vZGV2X2tmcmVlX3NrYl9hbnkoYnVmKTsKKyAgICAgICAgbWFjcC0+dXNiQ2JGdW5jdGlvbnMuemZjYlVzYk91dENvbXBsZXRlKGRldiwgYnVmLCAwLCBoZHIpOworICAgICAgICByZXR1cm4gMHhmZmZmOworICAgIH0KKworICAgIC8vcmV0dXJuIDA7CisgICAgLy9wcmludGsoIkNXWSAtIGNhbGwgemZ3VXNiU3VibWl0VHhEYXRhKClcbiIpOworICAgIHJldCA9IHpmTG54VXNiU3VibWl0VHhEYXRhKGRldik7CisgICAgcmV0dXJuIHJldDsKK30KKwordm9pZCB6ZkxueEluaXRVc2JUeFEoemRldl90KiBkZXYpCit7CisgICAgc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gZGV2LT5tbF9wcml2OworCisgICAgcHJpbnRrKEtFUk5fRVJSICJ6ZndJbml0VXNiVHhRXG4iKTsKKworICAgIC8qIFplcm8gbWVtb3J5IGZvciBVc2JUeEJ1ZlEgKi8KKyAgICBtZW1zZXQobWFjcC0+VXNiVHhCdWZRLCAwLCBzaXplb2YoVXNiVHhRX3QpICogWk1fTUFYX1RYX1VSQl9OVU0pOworCisgICAgbWFjcC0+VHhCdWZIZWFkID0gMDsKKyAgICBtYWNwLT5UeEJ1ZlRhaWwgPSAwOworICAgIG1hY3AtPlR4VXJiSGVhZCA9IDA7CisgICAgbWFjcC0+VHhVcmJUYWlsID0gMDsKKyAgICBtYWNwLT5UeFVyYkNudCA9IFpNX01BWF9UWF9VUkJfTlVNOworfQorCit2b2lkIHpmTG54SW5pdFVzYlJ4USh6ZGV2X3QqIGRldikKK3sKKyAgICB1MTZfdCBpOworICAgIHpidWZfdCAqYnVmOworICAgIHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IGRldi0+bWxfcHJpdjsKKworICAgIC8qIFplcm8gbWVtb3J5IGZvciBVc2JSeEJ1ZlEgKi8KKyAgICBtZW1zZXQobWFjcC0+VXNiUnhCdWZRLCAwLCBzaXplb2YoemJ1Zl90ICopICogWk1fTUFYX1JYX1VSQl9OVU0pOworCisgICAgbWFjcC0+UnhCdWZIZWFkID0gMDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBaTV9NQVhfUlhfVVJCX05VTTsgaSsrKQorICAgIHsKKyAgICAgICAgLy9idWYgPSB6ZndCdWZBbGxvY2F0ZShkZXYsIFpNX01BWF9SWF9CVUZGRVJfU0laRSk7CisgICAgICAgIGJ1ZiA9IGRldl9hbGxvY19za2IoWk1fTUFYX1JYX0JVRkZFUl9TSVpFKTsKKyAgICAgICAgbWFjcC0+VXNiUnhCdWZRW2ldID0gYnVmOworICAgIH0KKworICAgIC8vbWFjcC0+UnhCdWZUYWlsID0gWk1fTUFYX1JYX1VSQl9OVU0gLSAxOworICAgIG1hY3AtPlJ4QnVmVGFpbCA9IDA7CisKKyAgICAvKiBTdWJtaXQgYWxsIFJ4IHVyYnMgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgWk1fTUFYX1JYX1VSQl9OVU07IGkrKykKKyAgICB7CisgICAgICAgIHpmTG54UHV0VXNiUnhCdWZmZXIoZGV2LCBtYWNwLT5Vc2JSeEJ1ZlFbaV0pOworICAgICAgICB6ZkxueFVzYkluKGRldiwgbWFjcC0+V2xhblJ4RGF0YVVyYltpXSwgbWFjcC0+VXNiUnhCdWZRW2ldKTsKKyAgICB9Cit9CisKKworCit1MzJfdCB6ZkxueFVzYlN1Ym1pdEJ1bGtVcmIodXJiX3QgKnVyYiwgc3RydWN0IHVzYl9kZXZpY2UgKnVzYiwgdTE2X3QgZXBudW0sIHUxNl90IGRpcmVjdGlvbiwKKyAgICAgICAgdm9pZCAqdHJhbnNmZXJfYnVmZmVyLCBpbnQgYnVmZmVyX2xlbmd0aCwgdXNiX2NvbXBsZXRlX3QgY29tcGxldGUsIHZvaWQgKmNvbnRleHQpCit7CisgICAgdTMyX3QgcmV0OworCisgICAgaWYoZGlyZWN0aW9uID09IFVTQl9ESVJfT1VUKQorICAgIHsKKyAgICAgICAgdXNiX2ZpbGxfYnVsa191cmIodXJiLCB1c2IsIHVzYl9zbmRidWxrcGlwZSh1c2IsIGVwbnVtKSwKKyAgICAgICAgICAgICAgICB0cmFuc2Zlcl9idWZmZXIsIGJ1ZmZlcl9sZW5ndGgsIGNvbXBsZXRlLCBjb250ZXh0KTsKKworICAgICAgICB1cmItPnRyYW5zZmVyX2ZsYWdzIHw9IFVSQl9aRVJPX1BBQ0tFVDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgdXNiX2ZpbGxfYnVsa191cmIodXJiLCB1c2IsIHVzYl9yY3ZidWxrcGlwZSh1c2IsIGVwbnVtKSwKKyAgICAgICAgICAgICAgICB0cmFuc2Zlcl9idWZmZXIsIGJ1ZmZlcl9sZW5ndGgsIGNvbXBsZXRlLCBjb250ZXh0KTsKKyAgICB9CisKKyAgICBpZiAoZXBudW0gPT0gNCkKKyAgICB7CisgICAgICAgIGlmICh1cmItPmhjcHJpdikKKyAgICAgICAgeworICAgICAgICAgICAgLy9wcmludGsoIkNXWSAtIHVyYi0+aGNwcml2IHNldCBieSB1bmtub3duIHJlYXNvbiwgcmVzZXQgaXRcbiIpOworICAgICAgICAgICAgLy91cmItPmhjcHJpdiA9IDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXQgPSB1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9BVE9NSUMpOworICAgIGlmICgoZXBudW0gPT0gNCkgJiAocmV0ICE9IDApKQorICAgIHsKKyAgICAgICAgLy9wcmludGsoIkNXWSAtIHJldCA9ICV4XG4iLCByZXQpOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCit1MzJfdCB6ZkxueFVzYlN1Ym1pdEludFVyYih1cmJfdCAqdXJiLCBzdHJ1Y3QgdXNiX2RldmljZSAqdXNiLCB1MTZfdCBlcG51bSwgdTE2X3QgZGlyZWN0aW9uLAorICAgICAgICB2b2lkICp0cmFuc2Zlcl9idWZmZXIsIGludCBidWZmZXJfbGVuZ3RoLCB1c2JfY29tcGxldGVfdCBjb21wbGV0ZSwgdm9pZCAqY29udGV4dCwKKyAgICAgICAgdTMyX3QgaW50ZXJ2YWwpCit7CisgICAgdTMyX3QgcmV0OworCisgICAgaWYoZGlyZWN0aW9uID09IFVTQl9ESVJfT1VUKQorICAgIHsKKyAgICAgICAgdXNiX2ZpbGxfaW50X3VyYih1cmIsIHVzYiwgdXNiX3NuZGJ1bGtwaXBlKHVzYiwgZXBudW0pLAorICAgICAgICAgICAgICAgIHRyYW5zZmVyX2J1ZmZlciwgYnVmZmVyX2xlbmd0aCwgY29tcGxldGUsIGNvbnRleHQsIGludGVydmFsKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgdXNiX2ZpbGxfaW50X3VyYih1cmIsIHVzYiwgdXNiX3JjdmJ1bGtwaXBlKHVzYiwgZXBudW0pLAorICAgICAgICAgICAgICAgIHRyYW5zZmVyX2J1ZmZlciwgYnVmZmVyX2xlbmd0aCwgY29tcGxldGUsIGNvbnRleHQsIGludGVydmFsKTsKKyAgICB9CisKKyAgICByZXQgPSB1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9BVE9NSUMpOworCisgICAgcmV0dXJuIHJldDsKK30KKworI2lmZGVmIFpNX0VOQUJMRV9DRU5DCitpbnQgemZMbnhDZW5jU2VuZE1zZyhzdHJ1Y3Qgc29jayAqbmV0bGlua19zaywgdV9pbnQ4X3QgKm1zZywgaW50IGxlbikKK3sKKyNkZWZpbmUgQ09NTVRZUEVfR1JPVVAgICA4CisjZGVmaW5lIFdBSV9LX01TRyAgICAgICAgMHgxMQorCisJaW50IHJldCA9IC0xOworCWludCBzaXplOworCXVuc2lnbmVkIGNoYXIgKm9sZF90YWlsOworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IG5sbXNnaGRyICpubGg7CisJY2hhciAqcG9zID0gTlVMTDsKKworCXNpemUgPSBOTE1TR19TUEFDRShsZW4pOworCXNrYiA9IGFsbG9jX3NrYihzaXplLCBHRlBfQVRPTUlDKTsKKworCWlmKHNrYiA9PSBOVUxMKQorCXsKKwkJcHJpbnRrKCJkZXZfYWxsb2Nfc2tiIGZhaWx1cmUgXG4iKTsKKwkJZ290byBvdXQ7CisJfQorCW9sZF90YWlsID0gc2tiLT50YWlsOworCisJLyrM7tC0yv2+3bGoz+C52NDFz6IqLworCW5saCA9IE5MTVNHX1BVVChza2IsIDAsIDAsIFdBSV9LX01TRywgc2l6ZS1zaXplb2YoKm5saCkpOworCXBvcyA9IE5MTVNHX0RBVEEobmxoKTsKKwltZW1zZXQocG9zLCAwLCBsZW4pOworCisJLyq0q8rktb3Tw7unv9W85LXEyv2+3SovCisJbWVtY3B5KHBvcywgbXNnLCAgbGVuKTsKKwkvKrzGy+O+rbn919a92rbUxuS687XEyv2+3cq1vMqzpLbIKi8KKwlubGgtPm5sbXNnX2xlbiA9IHNrYi0+dGFpbCAtIG9sZF90YWlsOworCU5FVExJTktfQ0Ioc2tiKS5kc3RfZ3JvdXAgPSBDT01NVFlQRV9HUk9VUDsKKwluZXRsaW5rX2Jyb2FkY2FzdChuZXRsaW5rX3NrLCBza2IsIDAsIENPTU1UWVBFX0dST1VQLCBHRlBfQVRPTUlDKTsKKwlyZXQgPSAwOworb3V0OgorCXJldHVybiByZXQ7CitubG1zZ19mYWlsdXJlOiAvKk5MTVNHX1BVVCDKp7Dco6zU8rO3z/rM173T19a7urTmKi8KKyAgCWlmKHNrYikKKyAgICAJCWtmcmVlX3NrYihza2IpOworCWdvdG8gb3V0OworCisjdW5kZWYgQ09NTVRZUEVfR1JPVVAKKyN1bmRlZiBXQUlfS19NU0cKK30KKyNlbmRpZiAvL1pNX0VOQUJMRV9DRU5DCisKKy8qIFNpbXBseSByZXR1cm4gMHhmZmZmIGlmIFZBUCBmdW5jdGlvbiBpcyBub3Qgc3VwcG9ydGVkICovCit1MTZfdCB6ZkxueEdldFZhcElkKHpkZXZfdCogZGV2KQoreworICAgIHUxNl90IGk7CisKKyAgICBmb3IgKGk9MDsgaTxaTV9WQVBfUE9SVF9OVU1CRVI7IGkrKykKKyAgICB7CisgICAgICAgIGlmICh2YXBbaV0uZGV2ID09IGRldikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDB4ZmZmZjsKK30KKwordTMyX3QgemZ3UmVhZFJlZyh6ZGV2X3QqIGRldiwgdTMyX3Qgb2Zmc2V0KQoreworICAgIHJldHVybiAwOworfQorCisjaWZuZGVmIElOSVRfV09SSworI2RlZmluZSB3b3JrX3N0cnVjdCB0cV9zdHJ1Y3QKKworI2RlZmluZSBzY2hlZHVsZV93b3JrKGEpICBzY2hlZHVsZV90YXNrKGEpCisKKyNkZWZpbmUgZmx1c2hfc2NoZWR1bGVkX3dvcmsgIGZsdXNoX3NjaGVkdWxlZF90YXNrcworI2RlZmluZSBJTklUX1dPUksoX3dxLCBfcm91dGluZSwgX2RhdGEpICBJTklUX1RRVUVVRShfd3EsIF9yb3V0aW5lLCBfZGF0YSkKKyNkZWZpbmUgUFJFUEFSRV9XT1JLKF93cSwgX3JvdXRpbmUsIF9kYXRhKSAgUFJFUEFSRV9UUVVFVUUoX3dxLCBfcm91dGluZSwgX2RhdGEpCisjZW5kaWYKKworI2RlZmluZSBLRVZFTlRfV0FUQ0hET0cgICAgICAgIDB4MDAwMDAwMDEKKwordTMyX3Qgc21wX2tldmVudF9Mb2NrID0gMDsKKwordm9pZCBrZXZlbnQoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworICAgIHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9CisgICAgICAgICAgICAgICBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHVzYmRydl9wcml2YXRlLCBrZXZlbnQpOworICAgIHpkZXZfdCAqZGV2ID0gbWFjcC0+ZGV2aWNlOworCisgICAgaWYgKG1hY3AgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAodGVzdF9hbmRfc2V0X2JpdCgwLCAodm9pZCAqKSZzbXBfa2V2ZW50X0xvY2spKQorICAgIHsKKyAgICAgICAgLy9zY2hlZHVsZV93b3JrKCZtYWNwLT5rZXZlbnQpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZG93bigmbWFjcC0+aW9jdGxfc2VtKTsKKworICAgIGlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoS0VWRU5UX1dBVENIRE9HLCAmbWFjcC0+a2V2ZW50X2ZsYWdzKSkKKyAgICB7CisgICAgZXh0ZXJuIHUxNl90IHpmSHBTdGFydFJlY3YoemRldl90ICpkZXYpOworICAgICAgICAvL3pmaUh3V2F0Y2hEb2dSZWluaXQoZGV2KTsKKyAgICAgICAgcHJpbnRrKCgiXG4gKioqKioqKioqKioqIEh3IHdhdGNoRG9nIG9jY3VyISEgKioqKioqKioqKioqKiogXG4iKSk7CisgICAgICAgIHpmaVdsYW5TdXNwZW5kKGRldik7CisgICAgICAgIHpmaVdsYW5SZXN1bWUoZGV2LDApOworICAgICAgICB6ZkhwU3RhcnRSZWN2KGRldik7CisgICAgfQorCisgICAgY2xlYXJfYml0KDAsICh2b2lkICopJnNtcF9rZXZlbnRfTG9jayk7CisgICAgdXAoJm1hY3AtPmlvY3RsX3NlbSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgIHpmTG54Q3JlYXRlVGhyZWFkICAgICAgICAgICAgKi8KKy8qICAgICAgQ3JlYXRlIGEgVGhyZWFkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYWx3YXlzIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgWXVhbi1HdSBXZWkgICAgICAgICBBdGhlcm9zIENvbW11bmljYXRpb25zLCBJTkMuICAgIDIwMDcuMyAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3U4X3QgemZMbnhDcmVhdGVUaHJlYWQoemRldl90ICpkZXYpCit7CisgICAgc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gZGV2LT5tbF9wcml2OworCisgICAgLyogQ3JlYXRlIE11dGV4IGFuZCBrZXZlbnRkICovCisgICAgSU5JVF9XT1JLKCZtYWNwLT5rZXZlbnQsIGtldmVudCk7CisgICAgaW5pdF9NVVRFWCgmbWFjcC0+aW9jdGxfc2VtKTsKKworICAgIHJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICB6ZkxueFNpZ25hbFRocmVhZCAgICAgICAgICAgICovCisvKiAgICAgIFNpZ25hbCBUaHJlYWQgd2l0aCBGbGFnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGRldiA6IGRldmljZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBmbGFnIDogc2lnbmFsIHRocmVhZCBmbGFnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBub25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBZdWFuLUd1IFdlaSAgICAgICAgIEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMsIElOQy4gICAgMjAwNy4zICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB6ZkxueFNpZ25hbFRocmVhZCh6ZGV2X3QgKmRldiwgaW50IGZsYWcpCit7CisgICAgc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gZGV2LT5tbF9wcml2OworCisgICAgaWYgKG1hY3AgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIHByaW50aygibWFjcCBpcyBOVUxMXG4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICgwICYmIG1hY3AtPmtldmVudF9yZWFkeSAhPSAxKQorICAgIHsKKyAgICAgICAgcHJpbnRrKCJLZXZlbnQgbm90IHJlYWR5XG4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHNldF9iaXQoZmxhZywgJm1hY3AtPmtldmVudF9mbGFncyk7CisKKyAgICBpZiAoIXNjaGVkdWxlX3dvcmsoJm1hY3AtPmtldmVudCkpCisgICAgeworICAgICAgICAvL0ZhaWxzIGlzIE5vcm1hbAorICAgICAgICAvL3ByaW50ayhLRVJOX0VSUiAic2NoZWR1bGVfdGFzayBmYWlsZWQsIGZsYWcgPSAleFxuIiwgZmxhZyk7CisgICAgfQorfQorCisvKiBOb3RpZnkgd3JhcHBlciB0b2RvIHJlZG93bmxvYWQgZmlybXdhcmUgYW5kIHJlaW5pdCBwcm9jZWR1cmUgd2hlbiAqLworLyogaGFyZHdhcmUgd2F0Y2hkb2cgb2NjdXIgOiB6ZmlId1dhdGNoRG9nUmVpbml0KCkgKi8KK3ZvaWQgemZMbnhXYXRjaERvZ05vdGlmeSh6ZGV2X3QqIGRldikKK3sKKyAgICB6ZkxueFNpZ25hbFRocmVhZChkZXYsIEtFVkVOVF9XQVRDSERPRyk7Cit9CisKKy8qIFF1ZXJ5IER1cmFudGlvbiBvZiBBY3RpdmUgU2NhbiAqLwordm9pZCB6ZndHZXRBY3RpdmVTY2FuRHVyKHpkZXZfdCogZGV2LCB1OF90KiBEdXIpCit7CisgICAgKkR1ciA9IDMwOyAvLyBkZWZhdWx0IDMwIG1zCit9CisKK3ZvaWQgemZ3R2V0U2hvd1plcm9MZW5ndGhTU0lEKHpkZXZfdCogZGV2LCB1OF90KiBEdXIpCit7CisgICAgKkR1ciA9IDA7Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzL3pkY29tcGF0LmggYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy96ZGNvbXBhdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhY2Y0MDAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy96ZGNvbXBhdC5oCkBAIC0wLDAgKzEsNjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBBdGhlcm9zIENvbW11bmljYXRpb25zIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2R1bGUgTmFtZSA6IHpkY29tcGF0LmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEFic3RyYWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICBUaGlzIG1vZHVsZSBjb250YWlucyBmdW5jdGlvbiBkZWZpbnRpb24gZm9yIGNvbXBhdGliaWxpdHkuICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE5PVEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICBQbGF0Zm9ybSBkZXBlbmRlbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfWkRDT01QQVRfSAorI2RlZmluZSBfWkRDT01QQVRfSAorCisKKyNpZm5kZWYgREVDTEFSRV9UQVNLTEVUCisjZGVmaW5lIHRhc2tsZXRfc2NoZWR1bGUoYSkgICBzY2hlZHVsZV90YXNrKGEpCisjZW5kaWYKKworI3VuZGVmIG5ldGRldmljZV90Cit0eXBlZGVmIHN0cnVjdCBuZXRfZGV2aWNlIG5ldGRldmljZV90OworCisjaWZkZWYgV0lSRUxFU1NfRVhUCisjaWYgKFdJUkVMRVNTX0VYVCA8IDEzKQorc3RydWN0IGl3X3JlcXVlc3RfaW5mbworeworICAgICAgICBfX3UxNiAgICAgICAgICAgY21kOyAgICAgICAgICAgIC8qIFdpcmVsZXNzIEV4dGVuc2lvbiBjb21tYW5kICovCisgICAgICAgIF9fdTE2ICAgICAgICAgICBmbGFnczsgICAgICAgICAgLyogTW9yZSB0byBjb21lIDstKSAqLworfTsKKyNlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgSVJRX05PTkUKK3R5cGVkZWYgdm9pZCBpcnFyZXR1cm5fdDsKKyNkZWZpbmUgSVJRX05PTkUKKyNkZWZpbmUgSVJRX0hBTkRMRUQKKyNkZWZpbmUgSVJRX1JFVFZBTCh4KQorI2VuZGlmCisKKyNpZm5kZWYgaW5fYXRvbWljCisjZGVmaW5lIGluX2F0b21pYygpICAwCisjZW5kaWYKKworI2RlZmluZSBVU0JfUVVFVUVfQlVMSyAwCisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb3R1cy96ZHVzYi5jIGIvZHJpdmVycy9zdGFnaW5nL290dXMvemR1c2IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGYxZDIyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvemR1c2IuYwpAQCAtMCwwICsxLDIzOSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNy0yMDA4IEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZHVsZSBOYW1lIDogemR1c2IuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQWJzdHJhY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgIFRoaXMgbW9kdWxlIGNvbnRhaW5zIHBsdWcgYW5kIHBsYXkgaGFuZGxpbmcgZm9yIFVTQiBkZXZpY2UgZHJpdmVyKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTk9URVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgIFBsYXRmb3JtIGRlcGVuZGVudC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZkZWYgTU9EVkVSU0lPTlMKKyNpbmNsdWRlIDxsaW51eC9tb2R2ZXJzaW9ucy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC91c2IuaD4KKworI2luY2x1ZGUgInVzYmRydi5oIgorI2luY2x1ZGUgInpkdXNiLmgiCisKK2ludCB6ZkxueEFsbG9jQWxsVXJicyhzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3ApOwordm9pZCB6ZkxueEZyZWVBbGxVcmJzKHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCk7Cit2b2lkIHpmTG54VW5saW5rQWxsVXJicyhzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3ApOworCitNT0RVTEVfQVVUSE9SKCJBdGhlcm9zIENvbW11bmljYXRpb25zIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkF0aGVyb3MgODAyLjExbiBXaXJlbGVzcyBMQU4gYWRhcHRlciIpOworTU9EVUxFX0xJQ0VOU0UoIkR1YWwgQlNEL0dQTCIpOworCitzdGF0aWMgY29uc3QgY2hhciBkcml2ZXJfbmFtZVtdID0gIk90dXMiOworCisvKiB0YWJsZSBvZiBkZXZpY2VzIHRoYXQgd29yayB3aXRoIHRoaXMgZHJpdmVyICovCitzdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgemQxMjIxX2lkcyBbXSA9IHsKKwl7IFVTQl9ERVZJQ0UoVkVORE9SX0FUSFIsIFBST0RVQ1RfQVI5MTcwKSB9LAorICAgICAgICB7IFVTQl9ERVZJQ0UoVkVORE9SX0RMSU5LLCBQUk9EVUNUX0RXQTE2MEEpIH0sCisJeyBVU0JfREVWSUNFKDB4MDg0NiwgMHg5MDEwKSB9LAorCXsgfQkJCQkJLyogVGVybWluYXRpbmcgZW50cnkgKi8KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUodXNiLCB6ZDEyMjFfaWRzKTsKKworZXh0ZXJuIHU4X3QgemZMbnhJbml0U2V0dXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwKTsKK2V4dGVybiBpbnQgdXNiZHJ2X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworZXh0ZXJuIHU4X3QgemZMbnhDbGVhclN0cnVjdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitleHRlcm4gaW50IHpmV2RzQ2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitleHRlcm4gaW50IHpmVW5yZWdpc3Rlcldkc0RldihzdHJ1Y3QgbmV0X2RldmljZSogcGFyZW50RGV2LCB1MTZfdCB3ZHNJZCk7CitleHRlcm4gaW50IHpmTG54VmFwQ2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitleHRlcm4gaW50IHpmTG54VW5yZWdpc3RlclZhcERldihzdHJ1Y3QgbmV0X2RldmljZSogcGFyZW50RGV2LCB1MTZfdCB2YXBJZCk7CisKKy8qIFdEUyAqLworZXh0ZXJuIHN0cnVjdCB6c1dkc1N0cnVjdCB3ZHNbWk1fV0RTX1BPUlRfTlVNQkVSXTsKKworLyogVkFQICovCitleHRlcm4gc3RydWN0IHpzVmFwU3RydWN0IHZhcFtaTV9WQVBfUE9SVF9OVU1CRVJdOworCitzdGF0aWMgaW50IHpmTG54UHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGVyZmFjZSwKKwljb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCit7CisgICAgc3RydWN0IHVzYl9kZXZpY2UgKmRldiA9IGludGVyZmFjZV90b191c2JkZXYoaW50ZXJmYWNlKTsKKworICAgIHN0cnVjdCBuZXRfZGV2aWNlICpuZXQgPSBOVUxMOworICAgIHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IE5VTEw7CisgICAgaW50IHZlbmRvcl9pZCwgcHJvZHVjdF9pZDsKKyAgICBpbnQgcmVzdWx0ID0gMDsKKworICAgIHVzYl9nZXRfZGV2KGRldik7CisKKyAgICB2ZW5kb3JfaWQgPSBkZXYtPmRlc2NyaXB0b3IuaWRWZW5kb3I7CisgICAgcHJvZHVjdF9pZCA9IGRldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3Q7CisKKyNpZmRlZiBITUFDX0RFQlVHCisgICAgcHJpbnRrKEtFUk5fTk9USUNFICJ2ZW5kb3JfaWQgPSAlMDR4XG4iLCB2ZW5kb3JfaWQpOworICAgIHByaW50ayhLRVJOX05PVElDRSAicHJvZHVjdF9pZCA9ICUwNHhcbiIsIHByb2R1Y3RfaWQpOworCisgICAgaWYgKGRldi0+c3BlZWQgPT0gVVNCX1NQRUVEX0hJR0gpCisgICAgICAgIHByaW50ayhLRVJOX05PVElDRSAiVVNCIDIuMCBIb3N0XG4iKTsKKyAgICBlbHNlCisgICAgICAgIHByaW50ayhLRVJOX05PVElDRSAiVVNCIDEuMSBIb3N0XG4iKTsKKyNlbmRpZgorCisgICAgaWYgKCEobWFjcCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSksIEdGUF9LRVJORUwpKSkKKyAgICB7CisgICAgICAgIHByaW50ayhLRVJOX0VSUiAib3V0IG9mIG1lbW9yeSBhbGxvY2F0aW5nIGRldmljZSBzdHJ1Y3R1cmVcbiIpOworICAgICAgICByZXN1bHQgPSAtRU5PTUVNOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgLyogWmVybyB0aGUgbWVtb3J5ICovCisgICAgbWVtc2V0KG1hY3AsIDAsIHNpemVvZihzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUpKTsKKworICAgIG5ldCA9IGFsbG9jX2V0aGVyZGV2KDApOworCisgICAgaWYgKG5ldCA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJ6ZkxueFByb2JlOiBOb3QgYWJsZSB0byBhbGxvYyBldGhlcmRldiBzdHJ1Y3RcbiIpOworICAgICAgICByZXN1bHQgPSAtRU5PTUVNOworICAgICAgICBnb3RvIGZhaWwxOworICAgIH0KKworICAgIHN0cmNweShuZXQtPm5hbWUsICJhdGglZCIpOworCisgICAgbmV0LT5tbF9wcml2ID0gbWFjcDsgICAvL2tlcm5lbCAyLjYKKyAgICBtYWNwLT51ZGV2ID0gZGV2OworICAgIG1hY3AtPmRldmljZSA9IG5ldDsKKworICAgIC8qIHNldCB1cCB0aGUgZW5kcG9pbnQgaW5mb3JtYXRpb24gKi8KKyAgICAvKiBjaGVjayBvdXQgdGhlIGVuZHBvaW50cyAqLworICAgIG1hY3AtPmludGVyZmFjZSA9IGludGVyZmFjZTsKKworICAgIC8vaW5pdF93YWl0cXVldWVfaGVhZCgmbWFjcC0+cmVnU2V0X3dhaXQpOworICAgIC8vaW5pdF93YWl0cXVldWVfaGVhZCgmbWFjcC0+aW9yd1JzcF93YWl0KTsKKyAgICAvL2luaXRfd2FpdHF1ZXVlX2hlYWQoJm1hY3AtPnRlcm1fd2FpdCk7CisKKyAgICBpZiAoIXpmTG54QWxsb2NBbGxVcmJzKG1hY3ApKQorICAgIHsKKyAgICAgICAgcmVzdWx0ID0gLUVOT01FTTsKKyAgICAgICAgZ290byBmYWlsMjsKKyAgICB9CisKKyAgICBpZiAoIXpmTG54SW5pdFNldHVwKG5ldCwgbWFjcCkpCisgICAgeworICAgICAgICByZXN1bHQgPSAtRUlPOworICAgICAgICBnb3RvIGZhaWwzOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB1c2Jfc2V0X2ludGZkYXRhKGludGVyZmFjZSwgbWFjcCk7CisgICAgICAgIFNFVF9ORVRERVZfREVWKG5ldCwgJmludGVyZmFjZS0+ZGV2KTsKKworICAgICAgICBpZiAocmVnaXN0ZXJfbmV0ZGV2KG5ldCkgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgdXNiX3NldF9pbnRmZGF0YShpbnRlcmZhY2UsIE5VTEwpOworICAgICAgICAgICAgZ290byBmYWlsMzsKKyAgICAgICAgfQorICAgIH0KKworICAgIG5ldGlmX2NhcnJpZXJfb2ZmKG5ldCk7CisgICAgZ290byBkb25lOworCitmYWlsMzoKKyAgICB6ZkxueEZyZWVBbGxVcmJzKG1hY3ApOworZmFpbDI6CisgICAgZnJlZV9uZXRkZXYobmV0KTsgIC8va2VybmVsIDIuNgorZmFpbDE6CisgICAga2ZyZWUobWFjcCk7CisKK2ZhaWw6CisgICAgdXNiX3B1dF9kZXYoZGV2KTsKKyAgICBtYWNwID0gTlVMTDsKKworZG9uZToKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgdm9pZCB6ZkxueERpc2Nvbm5lY3Qoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGVyZmFjZSkKK3sKKyAgICBzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AgPSAoc3RydWN0IHVzYmRydl9wcml2YXRlICopIHVzYl9nZXRfaW50ZmRhdGEoaW50ZXJmYWNlKTsKKworICAgIHByaW50ayhLRVJOX0RFQlVHICJ6ZkxueERpc2Nvbm5lY3RcbiIpOworCisgICAgaWYgKCFtYWNwKQorICAgIHsKKyAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJ1bnJlZ2lzdGVyaW5nIG5vbi1leGlzdGFudCBkZXZpY2VcbiIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKG1hY3AtPmRyaXZlcl9pc29sYXRlZCkKKyAgICB7CisgICAgICAgIGlmIChtYWNwLT5kZXZpY2UtPmZsYWdzICYgSUZGX1VQKQorICAgICAgICAgICAgdXNiZHJ2X2Nsb3NlKG1hY3AtPmRldmljZSk7CisgICAgfQorCisjaWYgMAorICAgIC8qIENsb3NlIFdEUyAqLworICAgIC8vemZXZHNDbG9zZSh3ZHNbMF0uZGV2KTsKKyAgICAvKiBVbnJlZ2lzdGVyIFdEUyAqLworICAgIC8vemZVbnJlZ2lzdGVyV2RzRGV2KG1hY3AtPmRldmljZSwgMCk7CisKKyAgICAvKiBDbG9zZSBWQVAgKi8KKyAgICB6ZkxueFZhcENsb3NlKHZhcFswXS5kZXYpOworICAgIC8qIFVucmVnaXN0ZXIgVkFQICovCisgICAgemZMbnhVbnJlZ2lzdGVyVmFwRGV2KG1hY3AtPmRldmljZSwgMCk7CisjZW5kaWYKKworICAgIHpmTG54Q2xlYXJTdHJ1Y3RzKG1hY3AtPmRldmljZSk7CisKKyAgICB1bnJlZ2lzdGVyX25ldGRldihtYWNwLT5kZXZpY2UpOworCisgICAgdXNiX3B1dF9kZXYoaW50ZXJmYWNlX3RvX3VzYmRldihpbnRlcmZhY2UpKTsKKworICAgIC8vcHJpbnRrKEtFUk5fRVJSICIzLiB6ZkxueFVubGlua0FsbFVyYnNcbiIpOworICAgIC8vemZMbnhVbmxpbmtBbGxVcmJzKG1hY3ApOworCisgICAgLyogRnJlZSBuZXR3b3JrIGludGVyZmFjZSAqLworICAgIGZyZWVfbmV0ZGV2KG1hY3AtPmRldmljZSk7CisKKyAgICB6ZkxueEZyZWVBbGxVcmJzKG1hY3ApOworICAgIC8vemZMbnhDbGVhclN0cnVjdHMobWFjcC0+ZGV2aWNlKTsKKyAgICBrZnJlZShtYWNwKTsKKyAgICBtYWNwID0gTlVMTDsKKworICAgIHVzYl9zZXRfaW50ZmRhdGEoaW50ZXJmYWNlLCBOVUxMKTsKK30KKworc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIHpkMTIyMV9kcml2ZXIgPSB7CisJLm5hbWUgICAgICAgICA9IGRyaXZlcl9uYW1lLAorCS5wcm9iZSAgICAgICAgPSB6ZkxueFByb2JlLAorCS5kaXNjb25uZWN0ICAgPSB6ZkxueERpc2Nvbm5lY3QsCisJLmlkX3RhYmxlICAgICA9IHpkMTIyMV9pZHMsCit9OworCitpbnQgX19pbml0IHpmTG54SWluaXQodm9pZCkKK3sKKyAgICBwcmludGsoS0VSTl9OT1RJQ0UgIiVzIC0gdmVyc2lvbiAlc1xuIiwgIERSSVZFUl9OQU1FLCBWRVJTSU9OSUQpOworICAgIHJldHVybiB1c2JfcmVnaXN0ZXIoJnpkMTIyMV9kcml2ZXIpOworfQorCit2b2lkIF9fZXhpdCB6ZkxueEV4aXQodm9pZCkKK3sKKyAgICB1c2JfZGVyZWdpc3RlcigmemQxMjIxX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHpmTG54SWluaXQpOworbW9kdWxlX2V4aXQoemZMbnhFeGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzL3pkdXNiLmggYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy96ZHVzYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1NmRjMjEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy96ZHVzYi5oCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBBdGhlcm9zIENvbW11bmljYXRpb25zIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2R1bGUgTmFtZSA6IHpkdXNiLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEFic3RyYWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICBUaGlzIG1vZHVsZSBjb250YWlucyBkZWZpbml0aW9ucyBmb3IgVVNCIGRldmljZSBkcml2ZXIgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE5PVEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICBQbGF0Zm9ybSBkZXBlbmRlbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfWkRVU0JfSAorI2RlZmluZSBfWkRVU0JfSAorCisjaWZuZGVmIERSSVZFUl9OQU1FCisjZGVmaW5lIERSSVZFUl9OQU1FICAgICAgICAgICAgICJhcnVzYiIKKyNlbmRpZgorCisjZGVmaW5lIFZFUlNJT05JRCAgICAgICAgICAgICAgICIwLjAuMC45OTkiCisKKy8qIERlZmluZSB0aGVzZSB2YWx1ZXMgdG8gbWF0Y2ggeW91ciBkZXZpY2UgKi8KKyNkZWZpbmUgVkVORE9SX0FUSFIgICAgICAgICAgICAgMHgwQ0YzICAvL0F0aGVyb3MKKyNkZWZpbmUgUFJPRFVDVF9BUjkxNzAgICAgICAgICAgMHg5MTcwCisKKyNkZWZpbmUgVkVORE9SX0RMSU5LICAgICAgICAgICAgMHgwN0QxICAvL0RsaW5rCisjZGVmaW5lIFBST0RVQ1RfRFdBMTYwQSAgICAgICAgIDB4M0MxMAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9wYW5lbC9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL3BhbmVsL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzRiMzBmMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9wYW5lbC9LY29uZmlnCkBAIC0wLDAgKzEsMjc4IEBACitjb25maWcgUEFORUwKKwl0cmlzdGF0ZSAiUGFyYWxsZWwgcG9ydCBMQ0QvS2V5cGFkIFBhbmVsIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBQQVJQT1JUCisJLS0taGVscC0tLQorCSAgU2F5IFkgaGVyZSBpZiB5b3UgaGF2ZSBhbiBIRDQ0NzgwIG9yIEtTLTAwNzQgTENEIGNvbm5lY3RlZCB0byB5b3VyCisJICBwYXJhbGxlbCBwb3J0LiBUaGlzIGRyaXZlciBhbHNvIGZlYXR1cmVzIDQgYW5kIDYta2V5IGtleXBhZHMuIFRoZSBMQ0QKKwkgIGlzIGFjY2Vzc2libGUgdGhyb3VnaCB0aGUgL2Rldi9sY2QgY2hhciBkZXZpY2UgKDEwLCAxNTYpLCBhbmQgdGhlCisJICBrZXlwYWQgdGhyb3VnaCAvZGV2L2tleXBhZCAoMTAsIDE4NSkuIEJvdGggcmVxdWlyZSBtaXNjIGRldmljZSB0byBiZQorCSAgZW5hYmxlZC4gVGhpcyBjb2RlIGNhbiBlaXRoZXIgYmUgY29tcGlsZWQgYXMgYSBtb2R1bGUsIG9yIGxpbmtlZCBpbnRvCisJICB0aGUga2VybmVsIGFuZCBzdGFydGVkIGF0IGJvb3QuIElmIHlvdSBkb24ndCB1bmRlcnN0YW5kIHdoYXQgYWxsIHRoaXMKKwkgIGlzIGFib3V0LCBzYXkgTi4KKworY29uZmlnIFBBTkVMX1BBUlBPUlQKKwlpbnQgIkRlZmF1bHQgcGFyYWxsZWwgcG9ydCBudW1iZXIgKDA9TFBUMSkiCisJZGVwZW5kcyBvbiBQQU5FTAorCXJhbmdlIDAgMjU1CisJZGVmYXVsdCAiMCIKKwktLS1oZWxwLS0tCisJICBUaGlzIGlzIHRoZSBpbmRleCBvZiB0aGUgcGFyYWxsZWwgcG9ydCB0aGUgcGFuZWwgaXMgY29ubmVjdGVkIHRvLiBPbmUKKwkgIGRyaXZlciBpbnN0YW5jZSBvbmx5IHN1cHBvcnRzIG9uZSBwYXJhbGxlbCBwb3J0LCBzbyBpZiB5b3VyIGtleXBhZAorCSAgYW5kIExDRCBhcmUgY29ubmVjdGVkIHRvIHR3byBzZXBhcmF0ZSBwb3J0cywgeW91IGhhdmUgdG8gc3RhcnQgdHdvCisJICBtb2R1bGVzIHdpdGggZGlmZmVyZW50IGFyZ3VtZW50cy4gTnVtYmVyaW5nIHN0YXJ0cyB3aXRoICcwJyBmb3IgTFBUMSwKKwkgIGFuZCBzbyBvbi4KKworY29uZmlnIFBBTkVMX1BST0ZJTEUKKwlpbnQgIkRlZmF1bHQgcGFuZWwgcHJvZmlsZSAoMC01LCAwPWN1c3RvbSkiCisJZGVwZW5kcyBvbiBQQU5FTAorCXJhbmdlIDAgNQorCWRlZmF1bHQgIjUiCisJLS0taGVscC0tLQorCSAgVG8gZWFzZSBjb25maWd1cmF0aW9uLCB0aGUgZHJpdmVyIHN1cHBvcnRzIGRpZmZlcmVudCBjb25maWd1cmF0aW9uCisJICBwcm9maWxlcyBmb3IgcGFzdCBhbmQgcmVjZW50IHdpcmluZ3MuIFRoZXNlIHByb2ZpbGVzIGNhbiBhbHNvIGJlCisJICB1c2VkIHRvIGRlZmluZSBhbiBhcHByb3hpbWF0aXZlIGNvbmZpZ3VyYXRpb24sIGNvbXBsZXRlZCBieSBhIGZldworCSAgb3RoZXIgb3B0aW9ucy4gSGVyZSBhcmUgdGhlIHByb2ZpbGVzIDoKKworCSAgICAwID0gY3VzdG9tIChzZWUgZnVydGhlcikKKwkgICAgMSA9IDJ4MTYgcGFyYWxsZWwgTENELCBvbGQga2V5cGFkCisJICAgIDIgPSAyeDE2IHNlcmlhbCBMQ0QgKEtTLTAwNzQpLCBuZXcga2V5cGFkCisJICAgIDMgPSAyeDE2IHBhcmFsbGVsIExDRCAoSGFudHJvbml4KSwgbm8ga2V5cGFkCisJICAgIDQgPSAyeDE2IHBhcmFsbGVsIExDRCAoTmV4Y29tIE5TQTEwNDUpIHdpdGggTmV4Y29tJ3Mga2V5cGFkCisJICAgIDUgPSAyeDQwIHBhcmFsbGVsIExDRCAob2xkIG9uZSksIHdpdGggb2xkIGtleXBhZAorCisJICBDdXN0b20gY29uZmlndXJhdGlvbnMgYWxsb3cgeW91IHRvIGRlZmluZSBob3cgeW91ciBkaXNwbGF5IGlzCisJICB3aXJlZCB0byB0aGUgcGFyYWxsZWwgcG9ydCwgYW5kIGhvdyBpdCB3b3Jrcy4gVGhpcyBpcyBvbmx5IGludGVuZGVkCisJICBmb3IgZXhwZXJ0cy4KKworY29uZmlnIFBBTkVMX0tFWVBBRAorCWRlcGVuZHMgb24gUEFORUwgJiYgUEFORUxfUFJPRklMRT0iMCIKKwlpbnQgIktleXBhZCB0eXBlICgwPW5vbmUsIDE9b2xkIDYga2V5cywgMj1uZXcgNiBrZXlzLCAzPU5leGNvbSA0IGtleXMpIgorCXJhbmdlIDAgNAorCWRlZmF1bHQgMAorCS0tLWhlbHAtLS0KKwkgIFRoaXMgZW5hYmxlcyBhbmQgY29uZmlndXJlcyBhIGtleXBhZCBjb25uZWN0ZWQgdG8gdGhlIHBhcmFsbGVsIHBvcnQuCisJICBUaGUga2V5cyB3aWxsIGJlIHJlYWQgZnJvbSBjaGFyYWN0ZXIgZGV2aWNlIDEwLDE4NS4gVmFsaWQgdmFsdWVzIGFyZSA6CisKKwkgICAgMCA6IGRvIG5vdCBlbmFibGUgdGhpcyBkcml2ZXIKKwkgICAgMSA6IG9sZCA2IGtleXMga2V5cGFkCisJICAgIDIgOiBuZXcgNiBrZXlzIGtleXBhZCwgYXMgdXNlZCBvbiB0aGUgc2VydmVyIGF0IHd3dy5hbnQtY29tcHV0aW5nLmNvbQorCSAgICAzIDogTmV4Y29tIE5TQTEwNDUncyA0IGtleXMga2V5cGFkCisKKwkgIE5ldyBwcm9maWxlcyBjYW4gYmUgZGVzY3JpYmVkIGluIHRoZSBkcml2ZXIgc291cmNlLiBUaGUgZHJpdmVyIGFsc28KKwkgIHN1cHBvcnRzIHNpbXVsdGFuZW91cyBrZXlzIHByZXNzZWQgd2hlbiB0aGUga2V5cGFkIHN1cHBvcnRzIHRoZW0uCisKK2NvbmZpZyBQQU5FTF9MQ0QKKwlkZXBlbmRzIG9uIFBBTkVMICYmIFBBTkVMX1BST0ZJTEU9IjAiCisJaW50ICJMQ0QgdHlwZSAoMD1ub25lLCAxPWN1c3RvbSwgMj1vbGQgLy8sIDM9a3MwMDc0LCA0PWhhbnRyb25peCwgNT1OZXhjb20pIgorCXJhbmdlIDAgNQorCWRlZmF1bHQgMAorCS0tLWhlbHAtLS0KKwkgICBUaGlzIGVuYWJsZXMgYW5kIGNvbmZpZ3VyZXMgYW4gTENEIGNvbm5lY3RlZCB0byB0aGUgcGFyYWxsZWwgcG9ydC4KKwkgICBUaGUgZHJpdmVyIGluY2x1ZGVzIGFuIGludGVycHJldGVyIGZvciBlc2NhcGUgY29kZXMgc3RhcnRpbmcgd2l0aAorCSAgICdcZVtMJyB3aGljaCBhcmUgc3BlY2lmaWMgdG8gdGhlIExDRCwgYW5kIGEgZmV3IEFOU0kgY29kZXMuIFRoZQorCSAgIGRyaXZlciB3aWxsIGJlIHJlZ2lzdGVyZWQgYXMgY2hhcmFjdGVyIGRldmljZSAxMCwxNTYsIHVzdWFsbHkKKwkgICB1bmRlciB0aGUgbmFtZSAnL2Rldi9sY2QnLiBUaGVyZSBhcmUgYSB0b3RhbCBvZiA2IHN1cHBvcnRlZCB0eXBlcyA6CisKKwkgICAgIDAgOiBkbyBub3QgZW5hYmxlIHRoZSBkcml2ZXIKKwkgICAgIDEgOiBjdXN0b20gY29uZmlndXJhdGlvbiBhbmQgd2lyaW5nIChzZWUgZnVydGhlcikKKwkgICAgIDIgOiAyeDE2ICYgMng0MCBwYXJhbGxlbCBMQ0QgKG9sZCB3aXJpbmcpCisJICAgICAzIDogMngxNiBzZXJpYWwgTENEIChLUy0wMDc0IGJhc2VkKQorCSAgICAgNCA6IDJ4MTYgcGFyYWxsZWwgTENEIChIYW50cm9uaXggd2lyaW5nKQorCSAgICAgNSA6IDJ4MTYgcGFyYWxsZWwgTENEIChOZXhjb20gd2lyaW5nKQorCisJICAgV2hlbiB0eXBlICcxJyBpcyBzcGVjaWZpZWQsIG90aGVyIG9wdGlvbnMgd2lsbCBhcHBlYXIgdG8gY29uZmlndXJlCisJICAgbW9yZSBwcmVjaXNlIGFzcGVjdHMgKHdpcmluZywgZGltZW5zaW9ucywgcHJvdG9jb2wsIC4uLikuIFBsZWFzZSBub3RlCisJICAgdGhhdCB0aG9zZSB2YWx1ZXMgY2hhbmdlZCBmcm9tIHRoZSAyLjQgZHJpdmVyIGZvciBiZXR0ZXIgY29uc2lzdGVuY3kuCisKK2NvbmZpZyBQQU5FTF9MQ0RfSEVJR0hUCisJZGVwZW5kcyBvbiBQQU5FTCAmJiBQQU5FTF9QUk9GSUxFPSIwIiAmJiBQQU5FTF9MQ0Q9IjEiCisJaW50ICJOdW1iZXIgb2YgbGluZXMgb24gdGhlIExDRCAoMS0yKSIKKwlyYW5nZSAxIDIKKwlkZWZhdWx0IDIKKwktLS1oZWxwLS0tCisJICBUaGlzIGlzIHRoZSBudW1iZXIgb2YgdmlzaWJsZSBjaGFyYWN0ZXIgbGluZXMgb24gdGhlIExDRCBpbiBjdXN0b20gcHJvZmlsZS4KKwkgIEl0IGNhbiBlaXRoZXIgYmUgMSBvciAyLgorCitjb25maWcgUEFORUxfTENEX1dJRFRICisJZGVwZW5kcyBvbiBQQU5FTCAmJiBQQU5FTF9QUk9GSUxFPSIwIiAmJiBQQU5FTF9MQ0Q9IjEiCisJaW50ICJOdW1iZXIgb2YgY2hhcmFjdGVycyBwZXIgbGluZSBvbiB0aGUgTENEICgxLTQwKSIKKwlyYW5nZSAxIDQwCisJZGVmYXVsdCA0MAorCS0tLWhlbHAtLS0KKwkgIFRoaXMgaXMgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHBlciBsaW5lIG9uIHRoZSBMQ0QgaW4gY3VzdG9tIHByb2ZpbGUuCisJICBDb21tb24gdmFsdWVzIGFyZSAxNiwyMCwyNCw0MC4KKworY29uZmlnIFBBTkVMX0xDRF9CV0lEVEgKKwlkZXBlbmRzIG9uIFBBTkVMICYmIFBBTkVMX1BST0ZJTEU9IjAiICYmIFBBTkVMX0xDRD0iMSIKKwlpbnQgIkludGVybmFsIExDRCBsaW5lIHdpZHRoICgxLTQwLCA0MCBieSBkZWZhdWx0KSIKKwlyYW5nZSAxIDQwCisJZGVmYXVsdCA0MAorCS0tLWhlbHAtLS0KKwkgIE1vc3QgTENEcyB1c2UgYSBzdGFuZGFyZCBjb250cm9sbGVyIHdoaWNoIHN1cHBvcnRzIGhhcmR3YXJlIGxpbmVzIG9mIDQwCisJICBjaGFyYWN0ZXJzLCBhbHRob3VnaCBzb21ldGltZXMgb25seSAxNiwgMjAgb3IgMjQgb2YgdGhlbSBhcmUgcmVhbGx5IHdpcmVkCisJICB0byB0aGUgdGVybWluYWwuIFRoaXMgcmVzdWx0cyBpbiBzb21lIG5vbi12aXNpYmxlIGJ1dCBhZHJlc3NhYmxlIGNoYXJhY3RlcnMsCisJICBhbmQgaXMgdGhlIGNhc2UgZm9yIG1vc3QgcGFyYWxsZWwgTENEcy4gT3RoZXIgTENEcywgYW5kIHNvbWUgc2VyaWFsIG9uZXMsCisJICBob3dldmVyLCB1c2UgdGhlIHNhbWUgbGluZSB3aWR0aCBpbnRlcm5hbGx5IGFzIHdoYXQgaXMgdmlzaWJsZS4gVGhlIEtTMDA3NAorCSAgZm9yIGV4YW1wbGUsIHVzZXMgMTYgY2hhcmFjdGVycyBwZXIgbGluZSBmb3IgMTYgdmlzaWJsZSBjaGFyYWN0ZXJzIHBlciBsaW5lLgorCisJICBUaGlzIG9wdGlvbiBsZXRzIHlvdSBjb25maWd1cmUgdGhlIHZhbHVlIHVzZWQgYnkgeW91ciBMQ0QgaW4gJ2N1c3RvbScgcHJvZmlsZS4KKwkgIElmIHlvdSBkb24ndCBrbm93LCBwdXQgJzQwJyBoZXJlLgorCitjb25maWcgUEFORUxfTENEX0hXSURUSAorCWRlcGVuZHMgb24gUEFORUwgJiYgUEFORUxfUFJPRklMRT0iMCIgJiYgUEFORUxfTENEPSIxIgorCWludCAiSGFyZHdhcmUgTENEIGxpbmUgd2lkdGggKDEtNjQsIDY0IGJ5IGRlZmF1bHQpIgorCXJhbmdlIDEgNjQKKwlkZWZhdWx0IDY0CisJLS0taGVscC0tLQorCSAgTW9zdCBMQ0RzIHVzZSBhIHNpbmdsZSBhZGRyZXNzIGJpdCB0byBkaWZmZXJlbnRpYXRlIGxpbmUgMCBhbmQgbGluZSAxLiBTaW5jZQorCSAgc29tZSBvZiB0aGVtIG5lZWQgdG8gYmUgYWJsZSB0byBhZGRyZXNzIDQwIGNoYXJzIHdpdGggdGhlIGxvd2VyIGJpdHMsIHRoZXkKKwkgIG9mdGVuIHVzZSB0aGUgaW1tZWRpYXRlbHkgc3VwZXJpb3IgcG93ZXIgb2YgMiwgd2hpY2ggaXMgNjQsIHRvIGFkZHJlc3MgdGhlCisJICBuZXh0IGxpbmUuCisKKwkgIElmIHlvdSBkb24ndCBrbm93IHdoYXQgeW91ciBMQ0QgdXNlcywgaW4gZG91YnQgbGV0IDE2IGhlcmUgZm9yIGEgMngxNiwgYW5kCisJICA2NCBoZXJlIGZvciBhIDJ4NDAuCisKK2NvbmZpZyBQQU5FTF9MQ0RfQ0hBUlNFVAorCWRlcGVuZHMgb24gUEFORUwgJiYgUEFORUxfUFJPRklMRT0iMCIgJiYgUEFORUxfTENEPSIxIgorCWludCAiTENEIGNoYXJhY3RlciBzZXQgKDA9bm9ybWFsLCAxPUtTMDA3NCkiCisJcmFuZ2UgMCAxCisJZGVmYXVsdCAwCisJLS0taGVscC0tLQorCSAgU29tZSBjb250cm9sbGVycyBzdWNoIGFzIHRoZSBLUzAwNzQgdXNlIGEgc29tZXdoYXQgc3RyYW5nZSBjaGFyYWN0ZXIgc2V0CisJICB3aGVyZSBtYW55IHN5bWJvbHMgYXJlIGF0IHVudXN1YWwgcGxhY2VzLiBUaGUgZHJpdmVyIGtub3dzIGhvdyB0byBtYXAKKwkgICdzdGFuZGFyZCcgQVNDSUkgY2hhcmFjdGVycyB0byB0aGUgY2hhcmFjdGVyIHNldHMgdXNlZCBieSB0aGVzZSBjb250cm9sbGVycy4KKwkgIFZhbGlkIHZhbHVlcyBhcmUgOgorCisJICAgICAwIDogbm9ybWFsICh1bnRyYW5zbGF0ZWQpIGNoYXJhY3RlciBzZXQKKwkgICAgIDEgOiBLUzAwNzQgY2hhcmFjdGVyIHNldAorCisJICBJZiB5b3UgZG9uJ3Qga25vdywgdXNlIHRoZSBub3JtYWwgb25lICgwKS4KKworY29uZmlnIFBBTkVMX0xDRF9QUk9UTworCWRlcGVuZHMgb24gUEFORUwgJiYgUEFORUxfUFJPRklMRT0iMCIgJiYgUEFORUxfTENEPSIxIgorCWludCAiTENEIGNvbW11bmljYXRpb24gbW9kZSAoMD1wYXJhbGxlbCA4IGJpdHMsIDE9c2VyaWFsKSIKKwlyYW5nZSAwIDEKKwlkZWZhdWx0IDAKKwktLS1oZWxwLS0tCisJICBUaGlzIGRyaXZlciBub3cgc3VwcG9ydHMgYW55IHNlcmlhbCBvciBwYXJhbGxlbCBMQ0Qgd2lyZWQgdG8gYSBwYXJhbGxlbAorCSAgcG9ydC4gQnV0IGJlZm9yZSBhc3NpZ25pbmcgc2lnbmFscywgdGhlIGRyaXZlciBuZWVkcyB0byBrbm93IGlmIGl0IHdpbGwKKwkgIGJlIGRyaXZpbmcgYSBzZXJpYWwgTENEIG9yIGEgcGFyYWxsZWwgb25lLiBTZXJpYWwgTENEcyBvbmx5IHVzZSAyIHdpcmVzCisJICAoU0RBL1NDTCksIHdoaWxlIHBhcmFsbGVsIG9uZXMgdXNlIDIgb3IgMyB3aXJlcyBmb3IgdGhlIGNvbnRyb2wgc2lnbmFscworCSAgKEUsIFJTLCBzb21ldGltZXMgUlcpLCBhbmQgNCBvciA4IGZvciB0aGUgZGF0YS4gVXNlIDAgaGVyZSBmb3IgYSA4IGJpdHMKKwkgIHBhcmFsbGVsIExDRCwgYW5kIDEgZm9yIGEgc2VyaWFsIExDRC4KKworY29uZmlnIFBBTkVMX0xDRF9QSU5fRQorCWRlcGVuZHMgb24gUEFORUwgJiYgUEFORUxfUFJPRklMRT0iMCIgJiYgUEFORUxfTENEPSIxIiAmJiBQQU5FTF9MQ0RfUFJPVE89IjAiCisgICAgICAgIGludCAiUGFyYWxsZWwgcG9ydCBwaW4gbnVtYmVyICYgcG9sYXJpdHkgY29ubmVjdGVkIHRvIHRoZSBMQ0QgRSBzaWduYWwgKC0xNy4uLjE3KSAiCisJcmFuZ2UgLTE3IDE3CisJZGVmYXVsdCAxNAorCS0tLWhlbHAtLS0KKwkgIFRoaXMgZGVzY3JpYmVzIHRoZSBudW1iZXIgb2YgdGhlIHBhcmFsbGVsIHBvcnQgcGluIHRvIHdoaWNoIHRoZSBMQ0QgJ0UnCisJICBzaWduYWwgaGFzIGJlZW4gY29ubmVjdGVkLiBJdCBjYW4gYmUgOgorCisJICAgICAgICAgIDAgOiBubyBjb25uZWN0aW9uIChlZzogY29ubmVjdGVkIHRvIGdyb3VuZCkKKwkgICAgICAxLi4xNyA6IGRpcmVjdGx5IGNvbm5lY3RlZCB0byBhbnkgb2YgdGhlc2UgcGlucyBvbiB0aGUgREIyNSBwbHVnCisJICAgIC0xLi4tMTcgOiBjb25uZWN0ZWQgdG8gdGhlIHNhbWUgcGluIHRocm91Z2ggYW4gaW52ZXJ0ZXIgKGVnOiB0cmFuc2lzdG9yKS4KKworCSAgRGVmYXVsdCBmb3IgdGhlICdFJyBwaW4gaW4gY3VzdG9tIHByb2ZpbGUgaXMgJzE0JyAoQVVUT0ZFRUQpLgorCitjb25maWcgUEFORUxfTENEX1BJTl9SUworCWRlcGVuZHMgb24gUEFORUwgJiYgUEFORUxfUFJPRklMRT0iMCIgJiYgUEFORUxfTENEPSIxIiAmJiBQQU5FTF9MQ0RfUFJPVE89IjAiCisgICAgICAgIGludCAiUGFyYWxsZWwgcG9ydCBwaW4gbnVtYmVyICYgcG9sYXJpdHkgY29ubmVjdGVkIHRvIHRoZSBMQ0QgUlMgc2lnbmFsICgtMTcuLi4xNykgIgorCXJhbmdlIC0xNyAxNworCWRlZmF1bHQgMTcKKwktLS1oZWxwLS0tCisJICBUaGlzIGRlc2NyaWJlcyB0aGUgbnVtYmVyIG9mIHRoZSBwYXJhbGxlbCBwb3J0IHBpbiB0byB3aGljaCB0aGUgTENEICdSUycKKwkgIHNpZ25hbCBoYXMgYmVlbiBjb25uZWN0ZWQuIEl0IGNhbiBiZSA6CisKKwkgICAgICAgICAgMCA6IG5vIGNvbm5lY3Rpb24gKGVnOiBjb25uZWN0ZWQgdG8gZ3JvdW5kKQorCSAgICAgIDEuLjE3IDogZGlyZWN0bHkgY29ubmVjdGVkIHRvIGFueSBvZiB0aGVzZSBwaW5zIG9uIHRoZSBEQjI1IHBsdWcKKwkgICAgLTEuLi0xNyA6IGNvbm5lY3RlZCB0byB0aGUgc2FtZSBwaW4gdGhyb3VnaCBhbiBpbnZlcnRlciAoZWc6IHRyYW5zaXN0b3IpLgorCisJICBEZWZhdWx0IGZvciB0aGUgJ1JTJyBwaW4gaW4gY3VzdG9tIHByb2ZpbGUgaXMgJzE3JyAoU0VMRUNUIElOKS4KKworY29uZmlnIFBBTkVMX0xDRF9QSU5fUlcKKwlkZXBlbmRzIG9uIFBBTkVMICYmIFBBTkVMX1BST0ZJTEU9IjAiICYmIFBBTkVMX0xDRD0iMSIgJiYgUEFORUxfTENEX1BST1RPPSIwIgorICAgICAgICBpbnQgIlBhcmFsbGVsIHBvcnQgcGluIG51bWJlciAmIHBvbGFyaXR5IGNvbm5lY3RlZCB0byB0aGUgTENEIFJXIHNpZ25hbCAoLTE3Li4uMTcpICIKKwlyYW5nZSAtMTcgMTcKKwlkZWZhdWx0IDE2CisJLS0taGVscC0tLQorCSAgVGhpcyBkZXNjcmliZXMgdGhlIG51bWJlciBvZiB0aGUgcGFyYWxsZWwgcG9ydCBwaW4gdG8gd2hpY2ggdGhlIExDRCAnUlcnCisJICBzaWduYWwgaGFzIGJlZW4gY29ubmVjdGVkLiBJdCBjYW4gYmUgOgorCisJICAgICAgICAgIDAgOiBubyBjb25uZWN0aW9uIChlZzogY29ubmVjdGVkIHRvIGdyb3VuZCkKKwkgICAgICAxLi4xNyA6IGRpcmVjdGx5IGNvbm5lY3RlZCB0byBhbnkgb2YgdGhlc2UgcGlucyBvbiB0aGUgREIyNSBwbHVnCisJICAgIC0xLi4tMTcgOiBjb25uZWN0ZWQgdG8gdGhlIHNhbWUgcGluIHRocm91Z2ggYW4gaW52ZXJ0ZXIgKGVnOiB0cmFuc2lzdG9yKS4KKworCSAgRGVmYXVsdCBmb3IgdGhlICdSVycgcGluIGluIGN1c3RvbSBwcm9maWxlIGlzICcxNicgKElOSVQpLgorCitjb25maWcgUEFORUxfTENEX1BJTl9TQ0wKKwlkZXBlbmRzIG9uIFBBTkVMICYmIFBBTkVMX1BST0ZJTEU9IjAiICYmIFBBTkVMX0xDRD0iMSIgJiYgUEFORUxfTENEX1BST1RPIT0iMCIKKyAgICAgICAgaW50ICJQYXJhbGxlbCBwb3J0IHBpbiBudW1iZXIgJiBwb2xhcml0eSBjb25uZWN0ZWQgdG8gdGhlIExDRCBTQ0wgc2lnbmFsICgtMTcuLi4xNykgIgorCXJhbmdlIC0xNyAxNworCWRlZmF1bHQgMQorCS0tLWhlbHAtLS0KKwkgIFRoaXMgZGVzY3JpYmVzIHRoZSBudW1iZXIgb2YgdGhlIHBhcmFsbGVsIHBvcnQgcGluIHRvIHdoaWNoIHRoZSBzZXJpYWwKKwkgIExDRCAnU0NMJyBzaWduYWwgaGFzIGJlZW4gY29ubmVjdGVkLiBJdCBjYW4gYmUgOgorCisJICAgICAgICAgIDAgOiBubyBjb25uZWN0aW9uIChlZzogY29ubmVjdGVkIHRvIGdyb3VuZCkKKwkgICAgICAxLi4xNyA6IGRpcmVjdGx5IGNvbm5lY3RlZCB0byBhbnkgb2YgdGhlc2UgcGlucyBvbiB0aGUgREIyNSBwbHVnCisJICAgIC0xLi4tMTcgOiBjb25uZWN0ZWQgdG8gdGhlIHNhbWUgcGluIHRocm91Z2ggYW4gaW52ZXJ0ZXIgKGVnOiB0cmFuc2lzdG9yKS4KKworCSAgRGVmYXVsdCBmb3IgdGhlICdTQ0wnIHBpbiBpbiBjdXN0b20gcHJvZmlsZSBpcyAnMScgKFNUUk9CRSkuCisKK2NvbmZpZyBQQU5FTF9MQ0RfUElOX1NEQQorCWRlcGVuZHMgb24gUEFORUwgJiYgUEFORUxfUFJPRklMRT0iMCIgJiYgUEFORUxfTENEPSIxIiAmJiBQQU5FTF9MQ0RfUFJPVE8hPSIwIgorICAgICAgICBpbnQgIlBhcmFsbGVsIHBvcnQgcGluIG51bWJlciAmIHBvbGFyaXR5IGNvbm5lY3RlZCB0byB0aGUgTENEIFNEQSBzaWduYWwgKC0xNy4uLjE3KSAiCisJcmFuZ2UgLTE3IDE3CisJZGVmYXVsdCAyCisJLS0taGVscC0tLQorCSAgVGhpcyBkZXNjcmliZXMgdGhlIG51bWJlciBvZiB0aGUgcGFyYWxsZWwgcG9ydCBwaW4gdG8gd2hpY2ggdGhlIHNlcmlhbAorCSAgTENEICdTREEnIHNpZ25hbCBoYXMgYmVlbiBjb25uZWN0ZWQuIEl0IGNhbiBiZSA6CisKKwkgICAgICAgICAgMCA6IG5vIGNvbm5lY3Rpb24gKGVnOiBjb25uZWN0ZWQgdG8gZ3JvdW5kKQorCSAgICAgIDEuLjE3IDogZGlyZWN0bHkgY29ubmVjdGVkIHRvIGFueSBvZiB0aGVzZSBwaW5zIG9uIHRoZSBEQjI1IHBsdWcKKwkgICAgLTEuLi0xNyA6IGNvbm5lY3RlZCB0byB0aGUgc2FtZSBwaW4gdGhyb3VnaCBhbiBpbnZlcnRlciAoZWc6IHRyYW5zaXN0b3IpLgorCisJICBEZWZhdWx0IGZvciB0aGUgJ1NEQScgcGluIGluIGN1c3RvbSBwcm9maWxlIGlzICcyJyAoRDApLgorCitjb25maWcgUEFORUxfTENEX1BJTl9CTAorCWRlcGVuZHMgb24gUEFORUwgJiYgUEFORUxfUFJPRklMRT0iMCIgJiYgUEFORUxfTENEPSIxIgorICAgICAgICBpbnQgIlBhcmFsbGVsIHBvcnQgcGluIG51bWJlciAmIHBvbGFyaXR5IGNvbm5lY3RlZCB0byB0aGUgTENEIGJhY2tsaWdodCBzaWduYWwgKC0xNy4uLjE3KSAiCisJcmFuZ2UgLTE3IDE3CisJZGVmYXVsdCAwCisJLS0taGVscC0tLQorCSAgVGhpcyBkZXNjcmliZXMgdGhlIG51bWJlciBvZiB0aGUgcGFyYWxsZWwgcG9ydCBwaW4gdG8gd2hpY2ggdGhlIExDRCAnQkwnIHNpZ25hbAorICAgICAgICAgIGhhcyBiZWVuIGNvbm5lY3RlZC4gSXQgY2FuIGJlIDoKKworCSAgICAgICAgICAwIDogbm8gY29ubmVjdGlvbiAoZWc6IGNvbm5lY3RlZCB0byBncm91bmQpCisJICAgICAgMS4uMTcgOiBkaXJlY3RseSBjb25uZWN0ZWQgdG8gYW55IG9mIHRoZXNlIHBpbnMgb24gdGhlIERCMjUgcGx1ZworCSAgICAtMS4uLTE3IDogY29ubmVjdGVkIHRvIHRoZSBzYW1lIHBpbiB0aHJvdWdoIGFuIGludmVydGVyIChlZzogdHJhbnNpc3RvcikuCisKKwkgIERlZmF1bHQgZm9yIHRoZSAnQkwnIHBpbiBpbiBjdXN0b20gcHJvZmlsZSBpcyAnMCcgKHVuY29udHJvbGxlZCkuCisKK2NvbmZpZyBQQU5FTF9DSEFOR0VfTUVTU0FHRQorCWRlcGVuZHMgb24gUEFORUwKKwlib29sICJDaGFuZ2UgTENEIGluaXRpYWxpemF0aW9uIG1lc3NhZ2UgPyIKKwlkZWZhdWx0ICJuIgorCS0tLWhlbHAtLS0KKwkgIFRoaXMgYWxsb3dzIHlvdSB0byByZXBsYWNlIHRoZSBib290IG1lc3NhZ2UgaW5kaWNhdGluZyB0aGUga2VybmVsIHZlcnNpb24KKwkgIGFuZCB0aGUgZHJpdmVyIHZlcnNpb24gd2l0aCBhIGN1c3RvbSBtZXNzYWdlLiBUaGlzIGlzIHVzZWZ1bCBvbiBhcHBsaWFuY2VzCisJICB3aGVyZSBhIHNpbXBsZSAnU3RhcnRpbmcgc3lzdGVtJyBtZXNzYWdlIGNhbiBiZSBlbm91Z2ggdG8gc3RvcCBhIGN1c3RvbWVyCisJICBmcm9tIHdvcnJ5aW5nLgorCisJICBJZiB5b3Ugc2F5ICdZJyBoZXJlLCB5b3UnbGwgYmUgYWJsZSB0byBjaG9vc2UgYSBtZXNzYWdlIHlvdXJzZWxmLiBPdGhlcndpc2UsCisJICBzYXkgJ04nIGFuZCBrZWVwIHRoZSBkZWZhdWx0IG1lc3NhZ2Ugd2l0aCB0aGUgdmVyc2lvbi4KKworY29uZmlnIFBBTkVMX0JPT1RfTUVTU0FHRQorCWRlcGVuZHMgb24gUEFORUwgJiYgUEFORUxfQ0hBTkdFX01FU1NBR0U9InkiCisJc3RyaW5nICJOZXcgaW5pdGlhbGl6YXRpb24gbWVzc2FnZSIKKwlkZWZhdWx0ICIiCisJLS0taGVscC0tLQorCSAgVGhpcyBhbGxvd3MgeW91IHRvIHJlcGxhY2UgdGhlIGJvb3QgbWVzc2FnZSBpbmRpY2F0aW5nIHRoZSBrZXJuZWwgdmVyc2lvbgorCSAgYW5kIHRoZSBkcml2ZXIgdmVyc2lvbiB3aXRoIGEgY3VzdG9tIG1lc3NhZ2UuIFRoaXMgaXMgdXNlZnVsIG9uIGFwcGxpYW5jZXMKKwkgIHdoZXJlIGEgc2ltcGxlICdTdGFydGluZyBzeXN0ZW0nIG1lc3NhZ2UgY2FuIGJlIGVub3VnaCB0byBzdG9wIGEgY3VzdG9tZXIKKwkgIGZyb20gd29ycnlpbmcuCisKKwkgIEFuIGVtcHR5IG1lc3NhZ2Ugd2lsbCBvbmx5IGNsZWFyIHRoZSBkaXNwbGF5IGF0IGRyaXZlciBpbml0IHRpbWUuIEFueSBvdGhlcgorCSAgcHJpbnRmKCktZm9ybWF0dGVkIG1lc3NhZ2UgaXMgdmFsaWQgd2l0aCBuZXdsaW5lIGFuZCBlc2NhcGUgY29kZXMuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcGFuZWwvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvcGFuZWwvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQ3YzIzOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9wYW5lbC9NYWtlZmlsZQpAQCAtMCwwICsxIEBACitvYmotJChDT05GSUdfUEFORUwpCQkrPSBwYW5lbC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcGFuZWwvVE9ETyBiL2RyaXZlcnMvc3RhZ2luZy9wYW5lbC9UT0RPCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0YmU3NDkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcGFuZWwvVE9ETwpAQCAtMCwwICsxLDkgQEAKK1RPRE86CisJLSBjaGVja3BhdGNoLnBsIGNsZWFudXBzCisJLSBMaW5kZW50CisJLSByZXZpZXcgbWFqb3IvbWlub3IgdXNhZ2VzCisJLSByZXZpZXcgdXNlcnNwYWNlIGFwaQorCS0gc2VlIGlmIGFsbCBvZiB0aGlzIGNvdWxkIGJlIGVhc2llciBkb25lIGluIHVzZXJzcGFjZSBpbnN0ZWFkLgorCitQbGVhc2Ugc2VuZCBwYXRjaGVzIHRvIEdyZWcgS3JvYWgtSGFydG1hbiA8Z3JlZ0Brcm9haC5jb20+IGFuZAorV2lsbHkgVGFycmVhdSA8d2lsbHlAbWV0YS14Lm9yZz4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9wYW5lbC9sY2QtcGFuZWwtY2dyYW0udHh0IGIvZHJpdmVycy9zdGFnaW5nL3BhbmVsL2xjZC1wYW5lbC1jZ3JhbS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjljZWVmNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9wYW5lbC9sY2QtcGFuZWwtY2dyYW0udHh0CkBAIC0wLDAgKzEsMjQgQEAKK1NvbWUgTENEcyBhbGxvdyB5b3UgdG8gZGVmaW5lIHVwIHRvIDggY2hhcmFjdGVycywgbWFwcGVkIHRvIEFTQ0lJCitjaGFyYWN0ZXJzIDAgdG8gNy4gVGhlIGVzY2FwZSBjb2RlIHRvIGRlZmluZSBhIG5ldyBjaGFyYWN0ZXIgaXMKKydcZVtMRycgZm9sbG93ZWQgYnkgb25lIGRpZ2l0IGZyb20gMCB0byA3LCByZXByZXNlbnRpbmcgdGhlIGNoYXJhY3RlcgorbnVtYmVyLCBhbmQgdXAgdG8gOCBjb3VwbGVzIG9mIGhleCBkaWdpdHMgdGVybWluYXRlZCBieSBhIHNlbWktY29sb24KKygnOycpLiBFYWNoIGNvdXBsZSBvZiBkaWdpdHMgcmVwcmVzZW50cyBhIGxpbmUsIHdpdGggMS1iaXRzIGZvciBlYWNoCitpbGx1bWluYXRlZCBwaXhlbCB3aXRoIExTQiBvbiB0aGUgcmlnaHQuIExpbmVzIGFyZSBudW1iZXJyZWQgZnJvbSB0aGUKK3RvcCBvZiB0aGUgY2hhcmFjdGVyIHRvIHRoZSBib3R0b20uIE9uIGEgNXg3IG1hdHJpeCwgb25seSB0aGUgNSBsb3dlcgorYml0cyBvZiB0aGUgNyBmaXJzdCBieXRlcyBhcmUgdXNlZCBmb3IgZWFjaCBjaGFyYWN0ZXIuIElmIHRoZSBzdHJpbmcKK2lzIGluY29tcGxldGUsIG9ubHkgY29tcGxldGUgbGluZXMgd2lsbCBiZSByZWRlZmluZWQuIEhlcmUgYXJlIHNvbWUKK2V4YW1wbGVzIDoKKworICBwcmludGYgIlxlW0xHMDAxMDEwMTA1MEQxRjBDMDQ7IiAgPT4gMCA9IFtlbnRlcl0KKyAgcHJpbnRmICJcZVtMRzEwNDBFMUYwMDAwMDAwMDAwOyIgID0+IDEgPSBbdXBdCisgIHByaW50ZiAiXGVbTEcyMDAwMDAwMDAxRjBFMDQwMDsiICA9PiAyID0gW2Rvd25dCisgIHByaW50ZiAiXGVbTEczMDQwRTFGMDAxRjBFMDQwMDsiICA9PiAzID0gW3VwLWRvd25dCisgIHByaW50ZiAiXGVbTEc0MDAwMjA2MEUxRTBFMDYwMjsiICA9PiA0ID0gW2xlZnRdCisgIHByaW50ZiAiXGVbTEc1MDAwODBDMEUwRjBFMEMwODsiICA9PiA1ID0gW3JpZ2h0XQorICBwcmludGYgIlxlW0xHNjAwMTYwNTE1MTYxNDE0MDA7IiAgPT4gNiA9ICJJUCIKKworICBwcmludGYgIlxlW0xHMDAxMDMwNzFGMUYwNzAzMDE7IiAgPT4gYmlnIHNwZWFrZXIKKyAgcHJpbnRmICJcZVtMRzAwMDAyMDYxRTFFMDYwMjAwOyIgID0+IHNtYWxsIHNwZWFrZXIKKworV2lsbHkKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3BhbmVsL3BhbmVsLmMgYi9kcml2ZXJzL3N0YWdpbmcvcGFuZWwvcGFuZWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZmZlMjY5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3BhbmVsL3BhbmVsLmMKQEAgLTAsMCArMSwyMTkzIEBACisvKgorICogRnJvbnQgcGFuZWwgZHJpdmVyIGZvciBMaW51eAorICogQ29weXJpZ2h0IChDKSAyMDAwLTIwMDgsIFdpbGx5IFRhcnJlYXUgPHdAMXd0LmV1PgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBjb2RlIGRyaXZlcyBhbiBMQ0QgbW9kdWxlICgvZGV2L2xjZCksIGFuZCBhIGtleXBhZCAoL2Rldi9rZXlwYWQpCisgKiBjb25uZWN0ZWQgdG8gYSBwYXJhbGxlbCBwcmludGVyIHBvcnQuCisgKgorICogVGhlIExDRCBtb2R1bGUgbWF5IGVpdGhlciBiZSBhbiBIRDQ0NzgwLWxpa2UgOC1iaXQgcGFyYWxsZWwgTENELCBvciBhIDEtYml0CisgKiBzZXJpYWwgbW9kdWxlIGNvbXBhdGlibGUgd2l0aCBTYW1zdW5nJ3MgS1MwMDc0LiBUaGUgcGlucyBtYXkgYmUgY29ubmVjdGVkIGluCisgKiBhbnkgY29tYmluYXRpb24sIGV2ZXJ5dGhpbmcgaXMgcHJvZ3JhbW1hYmxlLgorICoKKyAqIFRoZSBrZXlwYWQgY29uc2lzdHMgaW4gYSBtYXRyaXggb2YgcHVzaCBidXR0b25zIGNvbm5lY3RpbmcgaW5wdXQgcGlucyB0bworICogZGF0YSBvdXRwdXQgcGlucyBvciB0byB0aGUgZ3JvdW5kLiBUaGUgY29tYmluYXRpb25zIGhhdmUgdG8gYmUgaGFyZC1jb2RlZAorICogaW4gdGhlIGRyaXZlciwgdGhvdWdoIHNldmVyYWwgcHJvZmlsZXMgZXhpc3QgYW5kIGFkZGluZyBuZXcgb25lcyBpcyBlYXN5LgorICoKKyAqIFNldmVyYWwgcHJvZmlsZXMgYXJlIHByb3ZpZGVkIGZvciBjb21tb25seSBmb3VuZCBMQ0Qra2V5cGFkIG1vZHVsZXMgb24gdGhlCisgKiBtYXJrZXQsIHN1Y2ggYXMgdGhvc2UgZm91bmQgaW4gTmV4Y29tJ3MgYXBwbGlhbmNlcy4KKyAqCisgKiBGSVhNRToKKyAqICAgICAgLSB0aGUgaW5pdGlhbGl6YXRpb24vZGVpbml0aWFsaXphdGlvbiBwcm9jZXNzIGlzIHZlcnkgZGlydHkgYW5kIHNob3VsZAorICogICAgICAgIGJlIHJld3JpdHRlbi4gSXQgbWF5IGV2ZW4gYmUgYnVnZ3kuCisgKgorICogVE9ETzoKKyAqCS0gZG9jdW1lbnQgMjQga2V5cyBrZXlib2FyZCAoMyByb3dzIG9mIDggY29scywgMzIgZGlvZGVzICsgMiBpbnB1dHMpCisgKiAgICAgIC0gbWFrZSB0aGUgTENEIGEgcGFydCBvZiBhIHZpcnR1YWwgc2NyZWVuIG9mIFZ4KlZ5CisgKgktIG1ha2UgdGhlIGlucHV0cyBsaXN0IHNtcC1zYWZlCisgKiAgICAgIC0gY2hhbmdlIHRoZSBrZXlib2FyZCB0byBhIGRvdWJsZSBtYXBwaW5nIDogc2lnbmFscyAtPiBrZXlfaWQgLT4gdmFsdWVzCisgKiAgICAgICAgc28gdGhhdCBhcHBsaWNhdGlvbnMgY2FuIGNoYW5nZSB2YWx1ZXMgd2l0aG91dCBrbm93aW5nIHNpZ25hbHMKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BhcnBvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CisjaW5jbHVkZSA8bGludXgvcmVib290Lmg+CisjaW5jbHVkZSA8bGludXgvdXRzcmVsZWFzZS5oPgorCisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKworI2RlZmluZSBMQ0RfTUlOT1IJCTE1NgorI2RlZmluZSBLRVlQQURfTUlOT1IJCTE4NQorCisjZGVmaW5lIFBBTkVMX1ZFUlNJT04JCSIwLjkuNSIKKworI2RlZmluZSBMQ0RfTUFYQllURVMJCTI1NgkvKiBtYXggYnVyc3Qgd3JpdGUgKi8KKworI2RlZmluZSBLRVlQQURfQlVGRkVSCQk2NAorI2RlZmluZSBJTlBVVF9QT0xMX1RJTUUJCShIWi81MCkJLyogcG9sbCB0aGUga2V5Ym9hcmQgdGhpcyBldmVyeSBzZWNvbmQgKi8KKyNkZWZpbmUgS0VZUEFEX1JFUF9TVEFSVAkoMTApCS8qIGEga2V5IHN0YXJ0cyB0byByZXBlYXQgYWZ0ZXIgdGhpcyB0aW1lcyBJTlBVVF9QT0xMX1RJTUUgKi8KKyNkZWZpbmUgS0VZUEFEX1JFUF9ERUxBWQkoMikJLyogYSBrZXkgcmVwZWF0cyB0aGlzIHRpbWVzIElOUFVUX1BPTExfVElNRSAqLworCisjZGVmaW5lIEZMQVNIX0xJR0hUX1RFTVBPCSgyMDApCS8qIGtlZXAgdGhlIGxpZ2h0IG9uIHRoaXMgdGltZXMgSU5QVVRfUE9MTF9USU1FIGZvciBlYWNoIGZsYXNoICovCisKKy8qIGNvbnZlcnRzIGFuIHJfc3RyKCkgaW5wdXQgdG8gYW4gYWN0aXZlIGhpZ2gsIGJpdHMgc3RyaW5nIDogMDAwQkFPU0UgKi8KKyNkZWZpbmUgUE5MX1BJTlBVVChhKQkJKCgoKHVuc2lnbmVkIGNoYXIpKGEpKSBeIDB4N0YpID4+IDMpCisKKyNkZWZpbmUgUE5MX1BCVVNZCQkweDgwCS8qIGludmVydGVkIGlucHV0LCBhY3RpdmUgbG93ICovCisjZGVmaW5lIFBOTF9QQUNLCQkweDQwCS8qIGRpcmVjdCBpbnB1dCwgYWN0aXZlIGxvdyAqLworI2RlZmluZSBQTkxfUE9VVFBBCQkweDIwCS8qIGRpcmVjdCBpbnB1dCwgYWN0aXZlIGhpZ2ggKi8KKyNkZWZpbmUgUE5MX1BTRUxFQ0QJCTB4MTAJLyogZGlyZWN0IGlucHV0LCBhY3RpdmUgaGlnaCAqLworI2RlZmluZSBQTkxfUEVSUk9SUAkJMHgwOAkvKiBkaXJlY3QgaW5wdXQsIGFjdGl2ZSBsb3cgKi8KKworI2RlZmluZSBQTkxfUEJJRElSCQkweDIwCS8qIGJpLWRpcmVjdGlvbmFsIHBvcnRzICovCisjZGVmaW5lIFBOTF9QSU5URU4JCTB4MTAJLyogaGlnaCB0byByZWFkIGRhdGEgaW4gb3ItZWQgd2l0aCBkYXRhIG91dCAqLworI2RlZmluZSBQTkxfUFNFTEVDUAkJMHgwOAkvKiBpbnZlcnRlZCBvdXRwdXQsIGFjdGl2ZSBsb3cgKi8KKyNkZWZpbmUgUE5MX1BJTklUUAkJMHgwNAkvKiBkaXJlY3Qgb3V0cHV0LCBhY3RpdmUgbG93ICovCisjZGVmaW5lIFBOTF9QQVVUT0xGCQkweDAyCS8qIGludmVydGVkIG91dHB1dCwgYWN0aXZlIGxvdyAqLworI2RlZmluZSBQTkxfUFNUUk9CRQkJMHgwMQkvKiBpbnZlcnRlZCBvdXRwdXQgKi8KKworI2RlZmluZSBQTkxfUEQwCQkJMHgwMQorI2RlZmluZSBQTkxfUEQxCQkJMHgwMgorI2RlZmluZSBQTkxfUEQyCQkJMHgwNAorI2RlZmluZSBQTkxfUEQzCQkJMHgwOAorI2RlZmluZSBQTkxfUEQ0CQkJMHgxMAorI2RlZmluZSBQTkxfUEQ1CQkJMHgyMAorI2RlZmluZSBQTkxfUEQ2CQkJMHg0MAorI2RlZmluZSBQTkxfUEQ3CQkJMHg4MAorCisjZGVmaW5lIFBJTl9OT05FCQkwCisjZGVmaW5lIFBJTl9TVFJPQkUJCTEKKyNkZWZpbmUgUElOX0QwCQkJMgorI2RlZmluZSBQSU5fRDEJCQkzCisjZGVmaW5lIFBJTl9EMgkJCTQKKyNkZWZpbmUgUElOX0QzCQkJNQorI2RlZmluZSBQSU5fRDQJCQk2CisjZGVmaW5lIFBJTl9ENQkJCTcKKyNkZWZpbmUgUElOX0Q2CQkJOAorI2RlZmluZSBQSU5fRDcJCQk5CisjZGVmaW5lIFBJTl9BVVRPTEYJCTE0CisjZGVmaW5lIFBJTl9JTklUUAkJMTYKKyNkZWZpbmUgUElOX1NFTEVDUAkJMTcKKyNkZWZpbmUgUElOX05PVF9TRVQJCTEyNworCisjZGVmaW5lIExDRF9GTEFHX1MJCTB4MDAwMQorI2RlZmluZSBMQ0RfRkxBR19JRAkJMHgwMDAyCisjZGVmaW5lIExDRF9GTEFHX0IJCTB4MDAwNAkvKiBibGluayBvbiAqLworI2RlZmluZSBMQ0RfRkxBR19DCQkweDAwMDgJLyogY3Vyc29yIG9uICovCisjZGVmaW5lIExDRF9GTEFHX0QJCTB4MDAxMAkvKiBkaXNwbGF5IG9uICovCisjZGVmaW5lIExDRF9GTEFHX0YJCTB4MDAyMAkvKiBsYXJnZSBmb250IG1vZGUgKi8KKyNkZWZpbmUgTENEX0ZMQUdfTgkJMHgwMDQwCS8qIDItcm93cyBtb2RlICovCisjZGVmaW5lIExDRF9GTEFHX0wJCTB4MDA4MAkvKiBiYWNrbGlnaHQgZW5hYmxlZCAqLworCisjZGVmaW5lIExDRF9FU0NBUEVfTEVOCQkyNAkvKiAyNCBjaGFycyBtYXggZm9yIGFuIExDRCBlc2NhcGUgY29tbWFuZCAqLworI2RlZmluZSBMQ0RfRVNDQVBFX0NIQVIJMjcJLyogdXNlIGNoYXIgMjcgZm9yIGVzY2FwZSBjb21tYW5kICovCisKKy8qIG1hY3JvcyB0byBzaW1wbGlmeSB1c2Ugb2YgdGhlIHBhcmFsbGVsIHBvcnQgKi8KKyNkZWZpbmUgcl9jdHIoeCkgICAgICAgIChwYXJwb3J0X3JlYWRfY29udHJvbCgoeCktPnBvcnQpKQorI2RlZmluZSByX2R0cih4KSAgICAgICAgKHBhcnBvcnRfcmVhZF9kYXRhKCh4KS0+cG9ydCkpCisjZGVmaW5lIHJfc3RyKHgpICAgICAgICAocGFycG9ydF9yZWFkX3N0YXR1cygoeCktPnBvcnQpKQorI2RlZmluZSB3X2N0cih4LCB5KSAgICAgZG8geyBwYXJwb3J0X3dyaXRlX2NvbnRyb2woKHgpLT5wb3J0LCAoeSkpOyB9IHdoaWxlICgwKQorI2RlZmluZSB3X2R0cih4LCB5KSAgICAgZG8geyBwYXJwb3J0X3dyaXRlX2RhdGEoKHgpLT5wb3J0LCAoeSkpOyB9IHdoaWxlICgwKQorCisvKiB0aGlzIGRlZmluZXMgd2hpY2ggYml0cyBhcmUgdG8gYmUgdXNlZCBhbmQgd2hpY2ggb25lcyB0byBiZSBpZ25vcmVkICovCitzdGF0aWMgX191OCBzY2FuX21hc2tfbzsJLyogbG9naWNhbCBvciBvZiB0aGUgb3V0cHV0IGJpdHMgaW52b2x2ZWQgaW4gdGhlIHNjYW4gbWF0cml4ICovCitzdGF0aWMgX191OCBzY2FuX21hc2tfaTsJLyogbG9naWNhbCBvciBvZiB0aGUgaW5wdXQgYml0cyBpbnZvbHZlZCBpbiB0aGUgc2NhbiBtYXRyaXggKi8KKwordHlwZWRlZiBfX3U2NCBwbWFza190OworCitlbnVtIGlucHV0X3R5cGUgeworCUlOUFVUX1RZUEVfU1RELAorCUlOUFVUX1RZUEVfS0JELAorfTsKKworZW51bSBpbnB1dF9zdGF0ZSB7CisJSU5QVVRfU1RfTE9XLAorCUlOUFVUX1NUX1JJU0lORywKKwlJTlBVVF9TVF9ISUdILAorCUlOUFVUX1NUX0ZBTExJTkcsCit9OworCitzdHJ1Y3QgbG9naWNhbF9pbnB1dCB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXBtYXNrX3QgbWFzazsKKwlwbWFza190IHZhbHVlOworCWVudW0gaW5wdXRfdHlwZSB0eXBlOworCWVudW0gaW5wdXRfc3RhdGUgc3RhdGU7CisJX191OCByaXNlX3RpbWUsIGZhbGxfdGltZTsKKwlfX3U4IHJpc2VfdGltZXIsIGZhbGxfdGltZXIsIGhpZ2hfdGltZXI7CisKKwl1bmlvbiB7CisJCXN0cnVjdCB7CS8qIHRoaXMgc3RydWN0dXJlIGlzIHZhbGlkIHdoZW4gdHlwZSA9PSBJTlBVVF9UWVBFX1NURCAqLworCQkJdm9pZCAoKnByZXNzX2ZjdCkgKGludCk7CisJCQl2b2lkICgqcmVsZWFzZV9mY3QpIChpbnQpOworCQkJaW50IHByZXNzX2RhdGE7CisJCQlpbnQgcmVsZWFzZV9kYXRhOworCQl9IHN0ZDsKKwkJc3RydWN0IHsJLyogdGhpcyBzdHJ1Y3R1cmUgaXMgdmFsaWQgd2hlbiB0eXBlID09IElOUFVUX1RZUEVfS0JEICovCisJCQkvKiBzdHJpbmdzIGNhbiBiZSBmdWxsLWxlbmd0aCAoaWUuIG5vbiBudWxsLXRlcm1pbmF0ZWQpICovCisJCQljaGFyIHByZXNzX3N0cltzaXplb2Yodm9pZCAqKSArIHNpemVvZihpbnQpXTsKKwkJCWNoYXIgcmVwZWF0X3N0cltzaXplb2Yodm9pZCAqKSArIHNpemVvZihpbnQpXTsKKwkJCWNoYXIgcmVsZWFzZV9zdHJbc2l6ZW9mKHZvaWQgKikgKyBzaXplb2YoaW50KV07CisJCX0ga2JkOworCX0gdTsKK307CisKK0xJU1RfSEVBRChsb2dpY2FsX2lucHV0cyk7CS8qIGxpc3Qgb2YgYWxsIGRlZmluZWQgbG9naWNhbCBpbnB1dHMgKi8KKworLyogcGh5c2ljYWwgY29udGFjdHMgaGlzdG9yeQorICogUGh5c2ljYWwgY29udGFjdHMgYXJlIGEgNDUgYml0cyBzdHJpbmcgb2YgOSBncm91cHMgb2YgNSBiaXRzIGVhY2guCisgKiBUaGUgOCBsb3dlciBncm91cHMgY29ycmVzcG9uZCB0byBvdXRwdXQgYml0cyAwIHRvIDcsIGFuZCB0aGUgOXRoIGdyb3VwCisgKiBjb3JyZXNwb25kcyB0byB0aGUgZ3JvdW5kLgorICogV2l0aGluIGVhY2ggZ3JvdXAsIGJpdHMgYXJlIHN0b3JlZCBpbiB0aGUgc2FtZSBvcmRlciBhcyByZWFkIG9uIHRoZSBwb3J0IDoKKyAqIEJBUFNFIChidXN5PTQsIGFjaz0zLCBwYXBlciBlbXB0eT0yLCBzZWxlY3Q9MSwgZXJyb3I9MCkuCisgKiBTbywgZWFjaCBfX3U2NCAob3IgcG1hc2tfdCkgaXMgcmVwcmVzZW50ZWQgbGlrZSB0aGlzIDoKKyAqIDAwMDAwMDAwMDAwMDAwMDAwMDBCQVBTRUJBUFNFQkFQU0VCQVBTRUJBUFNFQkFQU0VCQVBTRUJBUFNFQkFQU0UKKyAqIDwtLS0tLXVudXNlZC0tLS0tLT48Z25kPjxkMDc+PGQwNj48ZDA1PjxkMDQ+PGQwMz48ZDAyPjxkMDE+PGQwMD4KKyAqLworc3RhdGljIHBtYXNrX3QgcGh5c19yZWFkOwkvKiB3aGF0IGhhcyBqdXN0IGJlZW4gcmVhZCBmcm9tIHRoZSBJL08gcG9ydHMgKi8KK3N0YXRpYyBwbWFza190IHBoeXNfcmVhZF9wcmV2OwkvKiBwcmV2aW91cyBwaHlzX3JlYWQgKi8KK3N0YXRpYyBwbWFza190IHBoeXNfY3VycjsJLyogc3RhYmlsaXplZCBwaHlzX3JlYWQgKHBoeXNfcmVhZHxwaHlzX3JlYWRfcHJldikgKi8KK3N0YXRpYyBwbWFza190IHBoeXNfcHJldjsJLyogcHJldmlvdXMgcGh5c19jdXJyICovCitzdGF0aWMgY2hhciBpbnB1dHNfc3RhYmxlOwkvKiAwIG1lYW5zIHRoYXQgYXQgbGVhc3Qgb25lIGxvZ2ljYWwgc2lnbmFsIG5lZWRzIGJlIGNvbXB1dGVkICovCisKKy8qIHRoZXNlIHZhcmlhYmxlcyBhcmUgc3BlY2lmaWMgdG8gdGhlIGtleXBhZCAqLworc3RhdGljIGNoYXIga2V5cGFkX2J1ZmZlcltLRVlQQURfQlVGRkVSXTsKK3N0YXRpYyBpbnQga2V5cGFkX2J1ZmxlbjsKK3N0YXRpYyBpbnQga2V5cGFkX3N0YXJ0Oworc3RhdGljIGNoYXIga2V5cHJlc3NlZDsKK3N0YXRpYyB3YWl0X3F1ZXVlX2hlYWRfdCBrZXlwYWRfcmVhZF93YWl0OworCisvKiBsY2Qtc3BlY2lmaWMgdmFyaWFibGVzICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBpbnQgbGNkX2ZsYWdzOwkvKiBjb250YWlucyB0aGUgTENEIGNvbmZpZyBzdGF0ZSAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgaW50IGxjZF9hZGRyX3g7CS8qIGNvbnRhaW5zIHRoZSBMQ0QgWCBvZmZzZXQgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIGludCBsY2RfYWRkcl95OwkvKiBjb250YWlucyB0aGUgTENEIFkgb2Zmc2V0ICovCitzdGF0aWMgY2hhciBsY2RfZXNjYXBlW0xDRF9FU0NBUEVfTEVOICsgMV07CS8qIGN1cnJlbnQgZXNjYXBlIHNlcXVlbmNlLCAwIHRlcm1pbmF0ZWQgKi8KK3N0YXRpYyBpbnQgbGNkX2VzY2FwZV9sZW4gPSAtMTsJLyogbm90IGluIGVzY2FwZSBzdGF0ZS4gPj0wID0gZXNjYXBlIGNtZCBsZW4gKi8KKworLyoKKyAqIEJpdCBtYXNrcyB0byBjb252ZXJ0IExDRCBzaWduYWxzIHRvIHBhcmFsbGVsIHBvcnQgb3V0cHV0cy4KKyAqIF9kXyBhcmUgdmFsdWVzIGZvciBkYXRhIHBvcnQsIF9jXyBhcmUgZm9yIGNvbnRyb2wgcG9ydC4KKyAqIFswXSA9IHNpZ25hbCBPRkYsIFsxXSA9IHNpZ25hbCBPTiwgWzJdID0gbWFzaworICovCisjZGVmaW5lIEJJVF9DTFIJCTAKKyNkZWZpbmUgQklUX1NFVAkJMQorI2RlZmluZSBCSVRfTVNLCQkyCisjZGVmaW5lIEJJVF9TVEFURVMJMworLyoKKyAqIG9uZSBlbnRyeSBmb3IgZWFjaCBiaXQgb24gdGhlIExDRAorICovCisjZGVmaW5lIExDRF9CSVRfRQkwCisjZGVmaW5lIExDRF9CSVRfUlMJMQorI2RlZmluZSBMQ0RfQklUX1JXCTIKKyNkZWZpbmUgTENEX0JJVF9CTAkzCisjZGVmaW5lIExDRF9CSVRfQ0wJNAorI2RlZmluZSBMQ0RfQklUX0RBCTUKKyNkZWZpbmUgTENEX0JJVFMJNgorCisvKgorICogZWFjaCBiaXQgY2FuIGJlIGVpdGhlciBjb25uZWN0ZWQgdG8gYSBEQVRBIG9yIENUUkwgcG9ydAorICovCisjZGVmaW5lIExDRF9QT1JUX0MJMAorI2RlZmluZSBMQ0RfUE9SVF9ECTEKKyNkZWZpbmUgTENEX1BPUlRTCTIKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgbGNkX2JpdHNbTENEX1BPUlRTXVtMQ0RfQklUU11bQklUX1NUQVRFU107CisKKy8qCisgKiBMQ0QgcHJvdG9jb2xzCisgKi8KKyNkZWZpbmUgTENEX1BST1RPX1BBUkFMTEVMICAgICAgMAorI2RlZmluZSBMQ0RfUFJPVE9fU0VSSUFMICAgICAgICAxCisKKy8qCisgKiBMQ0QgY2hhcmFjdGVyIHNldHMKKyAqLworI2RlZmluZSBMQ0RfQ0hBUlNFVF9OT1JNQUwgICAgICAwCisjZGVmaW5lIExDRF9DSEFSU0VUX0tTMDA3NCAgICAgIDEKKworLyoKKyAqIExDRCB0eXBlcworICovCisjZGVmaW5lIExDRF9UWVBFX05PTkUJCTAKKyNkZWZpbmUgTENEX1RZUEVfT0xECQkxCisjZGVmaW5lIExDRF9UWVBFX0tTMDA3NAkJMgorI2RlZmluZSBMQ0RfVFlQRV9IQU5UUk9OSVgJMworI2RlZmluZSBMQ0RfVFlQRV9ORVhDT00JCTQKKyNkZWZpbmUgTENEX1RZUEVfQ1VTVE9NCQk1CisKKy8qCisgKiBrZXlwYWQgdHlwZXMKKyAqLworI2RlZmluZSBLRVlQQURfVFlQRV9OT05FCTAKKyNkZWZpbmUgS0VZUEFEX1RZUEVfT0xECQkxCisjZGVmaW5lIEtFWVBBRF9UWVBFX05FVwkJMgorI2RlZmluZSBLRVlQQURfVFlQRV9ORVhDT00JMworCisvKgorICogcGFuZWwgcHJvZmlsZXMKKyAqLworI2RlZmluZSBQQU5FTF9QUk9GSUxFX0NVU1RPTQkwCisjZGVmaW5lIFBBTkVMX1BST0ZJTEVfT0xECTEKKyNkZWZpbmUgUEFORUxfUFJPRklMRV9ORVcJMgorI2RlZmluZSBQQU5FTF9QUk9GSUxFX0hBTlRST05JWAkzCisjZGVmaW5lIFBBTkVMX1BST0ZJTEVfTkVYQ09NCTQKKyNkZWZpbmUgUEFORUxfUFJPRklMRV9MQVJHRQk1CisKKy8qCisgKiBDb25zdHJ1Y3QgY3VzdG9tIGNvbmZpZyBmcm9tIHRoZSBrZXJuZWwncyBjb25maWd1cmF0aW9uCisgKi8KKyNkZWZpbmUgREVGQVVMVF9QUk9GSUxFICAgICAgICAgUEFORUxfUFJPRklMRV9MQVJHRQorI2RlZmluZSBERUZBVUxUX1BBUlBPUlQgICAgICAgICAwCisjZGVmaW5lIERFRkFVTFRfTENEICAgICAgICAgICAgIExDRF9UWVBFX09MRAorI2RlZmluZSBERUZBVUxUX0tFWVBBRCAgICAgICAgICBLRVlQQURfVFlQRV9PTEQKKyNkZWZpbmUgREVGQVVMVF9MQ0RfV0lEVEggICAgICAgNDAKKyNkZWZpbmUgREVGQVVMVF9MQ0RfQldJRFRIICAgICAgNDAKKyNkZWZpbmUgREVGQVVMVF9MQ0RfSFdJRFRIICAgICAgNjQKKyNkZWZpbmUgREVGQVVMVF9MQ0RfSEVJR0hUICAgICAgMgorI2RlZmluZSBERUZBVUxUX0xDRF9QUk9UTyAgICAgICBMQ0RfUFJPVE9fUEFSQUxMRUwKKworI2RlZmluZSBERUZBVUxUX0xDRF9QSU5fRSAgICAgICBQSU5fQVVUT0xGCisjZGVmaW5lIERFRkFVTFRfTENEX1BJTl9SUyAgICAgIFBJTl9TRUxFQ1AKKyNkZWZpbmUgREVGQVVMVF9MQ0RfUElOX1JXICAgICAgUElOX0lOSVRQCisjZGVmaW5lIERFRkFVTFRfTENEX1BJTl9TQ0wgICAgIFBJTl9TVFJPQkUKKyNkZWZpbmUgREVGQVVMVF9MQ0RfUElOX1NEQSAgICAgUElOX0QwCisjZGVmaW5lIERFRkFVTFRfTENEX1BJTl9CTCAgICAgIFBJTl9OT1RfU0VUCisjZGVmaW5lIERFRkFVTFRfTENEX0NIQVJTRVQgICAgIExDRF9DSEFSU0VUX05PUk1BTAorCisjaWZkZWYgQ09ORklHX1BBTkVMX1BST0ZJTEUKKyN1bmRlZiBERUZBVUxUX1BST0ZJTEUKKyNkZWZpbmUgREVGQVVMVF9QUk9GSUxFIENPTkZJR19QQU5FTF9QUk9GSUxFCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19QQU5FTF9QQVJQT1JUCisjdW5kZWYgREVGQVVMVF9QQVJQT1JUCisjZGVmaW5lIERFRkFVTFRfUEFSUE9SVCBDT05GSUdfUEFORUxfUEFSUE9SVAorI2VuZGlmCisKKyNpZiBERUZBVUxUX1BST0ZJTEUgPT0gMAkvKiBjdXN0b20gKi8KKyNpZmRlZiBDT05GSUdfUEFORUxfS0VZUEFECisjdW5kZWYgREVGQVVMVF9LRVlQQUQKKyNkZWZpbmUgREVGQVVMVF9LRVlQQUQgQ09ORklHX1BBTkVMX0tFWVBBRAorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfUEFORUxfTENECisjdW5kZWYgREVGQVVMVF9MQ0QKKyNkZWZpbmUgREVGQVVMVF9MQ0QgQ09ORklHX1BBTkVMX0xDRAorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfUEFORUxfTENEX1dJRFRICisjdW5kZWYgREVGQVVMVF9MQ0RfV0lEVEgKKyNkZWZpbmUgREVGQVVMVF9MQ0RfV0lEVEggQ09ORklHX1BBTkVMX0xDRF9XSURUSAorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfUEFORUxfTENEX0JXSURUSAorI3VuZGVmIERFRkFVTFRfTENEX0JXSURUSAorI2RlZmluZSBERUZBVUxUX0xDRF9CV0lEVEggQ09ORklHX1BBTkVMX0xDRF9CV0lEVEgKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1BBTkVMX0xDRF9IV0lEVEgKKyN1bmRlZiBERUZBVUxUX0xDRF9IV0lEVEgKKyNkZWZpbmUgREVGQVVMVF9MQ0RfSFdJRFRIIENPTkZJR19QQU5FTF9MQ0RfSFdJRFRICisjZW5kaWYKKworI2lmZGVmIENPTkZJR19QQU5FTF9MQ0RfSEVJR0hUCisjdW5kZWYgREVGQVVMVF9MQ0RfSEVJR0hUCisjZGVmaW5lIERFRkFVTFRfTENEX0hFSUdIVCBDT05GSUdfUEFORUxfTENEX0hFSUdIVAorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfUEFORUxfTENEX1BST1RPCisjdW5kZWYgREVGQVVMVF9MQ0RfUFJPVE8KKyNkZWZpbmUgREVGQVVMVF9MQ0RfUFJPVE8gQ09ORklHX1BBTkVMX0xDRF9QUk9UTworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfUEFORUxfTENEX1BJTl9FCisjdW5kZWYgREVGQVVMVF9MQ0RfUElOX0UKKyNkZWZpbmUgREVGQVVMVF9MQ0RfUElOX0UgQ09ORklHX1BBTkVMX0xDRF9QSU5fRQorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfUEFORUxfTENEX1BJTl9SUworI3VuZGVmIERFRkFVTFRfTENEX1BJTl9SUworI2RlZmluZSBERUZBVUxUX0xDRF9QSU5fUlMgQ09ORklHX1BBTkVMX0xDRF9QSU5fUlMKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1BBTkVMX0xDRF9QSU5fUlcKKyN1bmRlZiBERUZBVUxUX0xDRF9QSU5fUlcKKyNkZWZpbmUgREVGQVVMVF9MQ0RfUElOX1JXIENPTkZJR19QQU5FTF9MQ0RfUElOX1JXCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19QQU5FTF9MQ0RfUElOX1NDTAorI3VuZGVmIERFRkFVTFRfTENEX1BJTl9TQ0wKKyNkZWZpbmUgREVGQVVMVF9MQ0RfUElOX1NDTCBDT05GSUdfUEFORUxfTENEX1BJTl9TQ0wKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1BBTkVMX0xDRF9QSU5fU0RBCisjdW5kZWYgREVGQVVMVF9MQ0RfUElOX1NEQQorI2RlZmluZSBERUZBVUxUX0xDRF9QSU5fU0RBIENPTkZJR19QQU5FTF9MQ0RfUElOX1NEQQorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfUEFORUxfTENEX1BJTl9CTAorI3VuZGVmIERFRkFVTFRfTENEX1BJTl9CTAorI2RlZmluZSBERUZBVUxUX0xDRF9QSU5fQkwgQ09ORklHX1BBTkVMX0xDRF9QSU5fQkwKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1BBTkVMX0xDRF9DSEFSU0VUCisjdW5kZWYgREVGQVVMVF9MQ0RfQ0hBUlNFVAorI2RlZmluZSBERUZBVUxUX0xDRF9DSEFSU0VUCisjZW5kaWYKKworI2VuZGlmIC8qIERFRkFVTFRfUFJPRklMRSA9PSAwICovCisKKy8qIGdsb2JhbCB2YXJpYWJsZXMgKi8KK3N0YXRpYyBpbnQga2V5cGFkX29wZW5fY250OwkvKiAjdGltZXMgb3BlbmVkICovCitzdGF0aWMgaW50IGxjZF9vcGVuX2NudDsJLyogI3RpbWVzIG9wZW5lZCAqLworc3RhdGljIHN0cnVjdCBwYXJkZXZpY2UgKnBwcnQ7CisKK3N0YXRpYyBpbnQgbGNkX2luaXRpYWxpemVkOworc3RhdGljIGludCBrZXlwYWRfaW5pdGlhbGl6ZWQ7CisKK3N0YXRpYyBpbnQgbGlnaHRfdGVtcG87CisKK3N0YXRpYyBjaGFyIGxjZF9tdXN0X2NsZWFyOworc3RhdGljIGNoYXIgbGNkX2xlZnRfc2hpZnQ7CitzdGF0aWMgY2hhciBpbml0X2luX3Byb2dyZXNzOworCitzdGF0aWMgdm9pZCAoKmxjZF93cml0ZV9jbWQpIChpbnQpOworc3RhdGljIHZvaWQgKCpsY2Rfd3JpdGVfZGF0YSkgKGludCk7CitzdGF0aWMgdm9pZCAoKmxjZF9jbGVhcl9mYXN0KSAodm9pZCk7CisKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0socHBydF9sb2NrKTsKK3N0YXRpYyBzdHJ1Y3QgdGltZXJfbGlzdCBzY2FuX3RpbWVyOworCitNT0RVTEVfREVTQ1JJUFRJT04oIkdlbmVyaWMgcGFyYWxsZWwgcG9ydCBMQ0QvS2V5cGFkIGRyaXZlciIpOworCitzdGF0aWMgaW50IHBhcnBvcnQgPSAtMTsKK21vZHVsZV9wYXJhbShwYXJwb3J0LCBpbnQsIDAwMDApOworTU9EVUxFX1BBUk1fREVTQyhwYXJwb3J0LCAiUGFyYWxsZWwgcG9ydCBpbmRleCAoMD1scHQxLCAxPWxwdDIsIC4uLikiKTsKKworc3RhdGljIGludCBsY2RfaGVpZ2h0ID0gLTE7Cittb2R1bGVfcGFyYW0obGNkX2hlaWdodCwgaW50LCAwMDAwKTsKK01PRFVMRV9QQVJNX0RFU0MobGNkX2hlaWdodCwgIk51bWJlciBvZiBsaW5lcyBvbiB0aGUgTENEIik7CisKK3N0YXRpYyBpbnQgbGNkX3dpZHRoID0gLTE7Cittb2R1bGVfcGFyYW0obGNkX3dpZHRoLCBpbnQsIDAwMDApOworTU9EVUxFX1BBUk1fREVTQyhsY2Rfd2lkdGgsICJOdW1iZXIgb2YgY29sdW1ucyBvbiB0aGUgTENEIik7CisKK3N0YXRpYyBpbnQgbGNkX2J3aWR0aCA9IC0xOwkvKiBpbnRlcm5hbCBidWZmZXIgd2lkdGggKHVzdWFsbHkgNDApICovCittb2R1bGVfcGFyYW0obGNkX2J3aWR0aCwgaW50LCAwMDAwKTsKK01PRFVMRV9QQVJNX0RFU0MobGNkX2J3aWR0aCwgIkludGVybmFsIExDRCBsaW5lIHdpZHRoICg0MCkiKTsKKworc3RhdGljIGludCBsY2RfaHdpZHRoID0gLTE7CS8qIGhhcmR3YXJlIGJ1ZmZlciB3aWR0aCAodXN1YWxseSA2NCkgKi8KK21vZHVsZV9wYXJhbShsY2RfaHdpZHRoLCBpbnQsIDAwMDApOworTU9EVUxFX1BBUk1fREVTQyhsY2RfaHdpZHRoLCAiTENEIGxpbmUgaGFyZHdhcmUgYWRkcmVzcyAoNjQpIik7CisKK3N0YXRpYyBpbnQgbGNkX2VuYWJsZWQgPSAtMTsKK21vZHVsZV9wYXJhbShsY2RfZW5hYmxlZCwgaW50LCAwMDAwKTsKK01PRFVMRV9QQVJNX0RFU0MobGNkX2VuYWJsZWQsICJEZXByZWNhdGVkIG9wdGlvbiwgdXNlIGxjZF90eXBlIGluc3RlYWQiKTsKKworc3RhdGljIGludCBrZXlwYWRfZW5hYmxlZCA9IC0xOworbW9kdWxlX3BhcmFtKGtleXBhZF9lbmFibGVkLCBpbnQsIDAwMDApOworTU9EVUxFX1BBUk1fREVTQyhrZXlwYWRfZW5hYmxlZCwgIkRlcHJlY2F0ZWQgb3B0aW9uLCB1c2Uga2V5cGFkX3R5cGUgaW5zdGVhZCIpOworCitzdGF0aWMgaW50IGxjZF90eXBlID0gLTE7Cittb2R1bGVfcGFyYW0obGNkX3R5cGUsIGludCwgMDAwMCk7CitNT0RVTEVfUEFSTV9ERVNDKGxjZF90eXBlLAorCQkgIkxDRCB0eXBlOiAwPW5vbmUsIDE9b2xkIC8vLCAyPXNlcmlhbCBrczAwNzQsIDM9aGFudHJvbml4IC8vLCA0PW5leGNvbSAvLywgNT1jb21waWxlZC1pbiIpOworCitzdGF0aWMgaW50IGxjZF9wcm90byA9IC0xOworbW9kdWxlX3BhcmFtKGxjZF9wcm90bywgaW50LCAwMDAwKTsKK01PRFVMRV9QQVJNX0RFU0MobGNkX3Byb3RvLCAiTENEIGNvbW11bmljYXRpb246IDA9cGFyYWxsZWwgKC8vKSwgMT1zZXJpYWwiKTsKKworc3RhdGljIGludCBsY2RfY2hhcnNldCA9IC0xOworbW9kdWxlX3BhcmFtKGxjZF9jaGFyc2V0LCBpbnQsIDAwMDApOworTU9EVUxFX1BBUk1fREVTQyhsY2RfY2hhcnNldCwgIkxDRCBjaGFyYWN0ZXIgc2V0OiAwPXN0YW5kYXJkLCAxPUtTMDA3NCIpOworCitzdGF0aWMgaW50IGtleXBhZF90eXBlID0gLTE7Cittb2R1bGVfcGFyYW0oa2V5cGFkX3R5cGUsIGludCwgMDAwMCk7CitNT0RVTEVfUEFSTV9ERVNDKGtleXBhZF90eXBlLAorCQkgIktleXBhZCB0eXBlOiAwPW5vbmUsIDE9b2xkIDYga2V5cywgMj1uZXcgNisxIGtleXMsIDM9bmV4Y29tIDQga2V5cyIpOworCitzdGF0aWMgaW50IHByb2ZpbGUgPSBERUZBVUxUX1BST0ZJTEU7Cittb2R1bGVfcGFyYW0ocHJvZmlsZSwgaW50LCAwMDAwKTsKK01PRFVMRV9QQVJNX0RFU0MocHJvZmlsZSwKKwkJICIxPTE2eDIgb2xkIGtwOyAyPXNlcmlhbCAxNngyLCBuZXcga3A7IDM9MTZ4MiBoYW50cm9uaXg7IDQ9MTZ4MiBuZXhjb207IGRlZmF1bHQ9NDB4Miwgb2xkIGtwIik7CisKKy8qCisgKiBUaGVzZSBhcmUgdGhlIHBhcmFsbGVsIHBvcnQgcGlucyB0aGUgTENEIGNvbnRyb2wgc2lnbmFscyBhcmUgY29ubmVjdGVkIHRvLgorICogU2V0IHRoaXMgdG8gMCBpZiB0aGUgc2lnbmFsIGlzIG5vdCB1c2VkLiBTZXQgaXQgdG8gaXRzIG9wcG9zaXRlIHZhbHVlCisgKiAobmVnYXRpdmUpIGlmIHRoZSBzaWduYWwgaXMgbmVnYXRlZC4gLU1BWElOVCBpcyB1c2VkIHRvIGluZGljYXRlIHRoYXQgdGhlCisgKiBwaW4gaGFzIG5vdCBiZWVuIGV4cGxpY2l0bHkgc3BlY2lmaWVkLgorICoKKyAqIFdBUk5JTkchIG5vIGNoZWNrIHdpbGwgYmUgcGVyZm9ybWVkIGFib3V0IGNvbGxpc2lvbnMgd2l0aCBrZXlwYWQgIQorICovCisKK3N0YXRpYyBpbnQgbGNkX2VfcGluICA9IFBJTl9OT1RfU0VUOworbW9kdWxlX3BhcmFtKGxjZF9lX3BpbiwgaW50LCAwMDAwKTsKK01PRFVMRV9QQVJNX0RFU0MobGNkX2VfcGluLAorCQkgIiMgb2YgdGhlIC8vIHBvcnQgcGluIGNvbm5lY3RlZCB0byBMQ0QgJ0UnIHNpZ25hbCwgd2l0aCBwb2xhcml0eSAoLTE3Li4xNykiKTsKKworc3RhdGljIGludCBsY2RfcnNfcGluID0gUElOX05PVF9TRVQ7Cittb2R1bGVfcGFyYW0obGNkX3JzX3BpbiwgaW50LCAwMDAwKTsKK01PRFVMRV9QQVJNX0RFU0MobGNkX3JzX3BpbiwKKwkJICIjIG9mIHRoZSAvLyBwb3J0IHBpbiBjb25uZWN0ZWQgdG8gTENEICdSUycgc2lnbmFsLCB3aXRoIHBvbGFyaXR5ICgtMTcuLjE3KSIpOworCitzdGF0aWMgaW50IGxjZF9yd19waW4gPSBQSU5fTk9UX1NFVDsKK21vZHVsZV9wYXJhbShsY2RfcndfcGluLCBpbnQsIDAwMDApOworTU9EVUxFX1BBUk1fREVTQyhsY2RfcndfcGluLAorCQkgIiMgb2YgdGhlIC8vIHBvcnQgcGluIGNvbm5lY3RlZCB0byBMQ0QgJ1JXJyBzaWduYWwsIHdpdGggcG9sYXJpdHkgKC0xNy4uMTcpIik7CisKK3N0YXRpYyBpbnQgbGNkX2JsX3BpbiA9IFBJTl9OT1RfU0VUOworbW9kdWxlX3BhcmFtKGxjZF9ibF9waW4sIGludCwgMDAwMCk7CitNT0RVTEVfUEFSTV9ERVNDKGxjZF9ibF9waW4sCisJCSAiIyBvZiB0aGUgLy8gcG9ydCBwaW4gY29ubmVjdGVkIHRvIExDRCBiYWNrbGlnaHQsIHdpdGggcG9sYXJpdHkgKC0xNy4uMTcpIik7CisKK3N0YXRpYyBpbnQgbGNkX2RhX3BpbiA9IFBJTl9OT1RfU0VUOworbW9kdWxlX3BhcmFtKGxjZF9kYV9waW4sIGludCwgMDAwMCk7CitNT0RVTEVfUEFSTV9ERVNDKGxjZF9kYV9waW4sCisJCSAiIyBvZiB0aGUgLy8gcG9ydCBwaW4gY29ubmVjdGVkIHRvIHNlcmlhbCBMQ0QgJ1NEQScgc2lnbmFsLCB3aXRoIHBvbGFyaXR5ICgtMTcuLjE3KSIpOworCitzdGF0aWMgaW50IGxjZF9jbF9waW4gPSBQSU5fTk9UX1NFVDsKK21vZHVsZV9wYXJhbShsY2RfY2xfcGluLCBpbnQsIDAwMDApOworTU9EVUxFX1BBUk1fREVTQyhsY2RfY2xfcGluLAorCQkgIiMgb2YgdGhlIC8vIHBvcnQgcGluIGNvbm5lY3RlZCB0byBzZXJpYWwgTENEICdTQ0wnIHNpZ25hbCwgd2l0aCBwb2xhcml0eSAoLTE3Li4xNykiKTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgKmxjZF9jaGFyX2NvbnY7CisKKy8qIGZvciBzb21lIExDRCBkcml2ZXJzIChrczAwNzQpIHdlIG5lZWQgYSBjaGFyc2V0IGNvbnZlcnNpb24gdGFibGUuICovCitzdGF0aWMgdW5zaWduZWQgY2hhciBsY2RfY2hhcl9jb252X2tzMDA3NFsyNTZdID0geworCS8qICAgICAgICAgIDB8OCAgIDF8OSAgIDJ8QSAgIDN8QiAgIDR8QyAgIDV8RCAgIDZ8RSAgIDd8RiAqLworCS8qIDB4MDAgKi8gMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywKKwkvKiAweDA4ICovIDB4MDgsIDB4MDksIDB4MGEsIDB4MGIsIDB4MGMsIDB4MGQsIDB4MGUsIDB4MGYsCisJLyogMHgxMCAqLyAweDEwLCAweDExLCAweDEyLCAweDEzLCAweDE0LCAweDE1LCAweDE2LCAweDE3LAorCS8qIDB4MTggKi8gMHgxOCwgMHgxOSwgMHgxYSwgMHgxYiwgMHgxYywgMHgxZCwgMHgxZSwgMHgxZiwKKwkvKiAweDIwICovIDB4MjAsIDB4MjEsIDB4MjIsIDB4MjMsIDB4YTIsIDB4MjUsIDB4MjYsIDB4MjcsCisJLyogMHgyOCAqLyAweDI4LCAweDI5LCAweDJhLCAweDJiLCAweDJjLCAweDJkLCAweDJlLCAweDJmLAorCS8qIDB4MzAgKi8gMHgzMCwgMHgzMSwgMHgzMiwgMHgzMywgMHgzNCwgMHgzNSwgMHgzNiwgMHgzNywKKwkvKiAweDM4ICovIDB4MzgsIDB4MzksIDB4M2EsIDB4M2IsIDB4M2MsIDB4M2QsIDB4M2UsIDB4M2YsCisJLyogMHg0MCAqLyAweGEwLCAweDQxLCAweDQyLCAweDQzLCAweDQ0LCAweDQ1LCAweDQ2LCAweDQ3LAorCS8qIDB4NDggKi8gMHg0OCwgMHg0OSwgMHg0YSwgMHg0YiwgMHg0YywgMHg0ZCwgMHg0ZSwgMHg0ZiwKKwkvKiAweDUwICovIDB4NTAsIDB4NTEsIDB4NTIsIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTYsIDB4NTcsCisJLyogMHg1OCAqLyAweDU4LCAweDU5LCAweDVhLCAweGZhLCAweGZiLCAweGZjLCAweDFkLCAweGM0LAorCS8qIDB4NjAgKi8gMHg5NiwgMHg2MSwgMHg2MiwgMHg2MywgMHg2NCwgMHg2NSwgMHg2NiwgMHg2NywKKwkvKiAweDY4ICovIDB4NjgsIDB4NjksIDB4NmEsIDB4NmIsIDB4NmMsIDB4NmQsIDB4NmUsIDB4NmYsCisJLyogMHg3MCAqLyAweDcwLCAweDcxLCAweDcyLCAweDczLCAweDc0LCAweDc1LCAweDc2LCAweDc3LAorCS8qIDB4NzggKi8gMHg3OCwgMHg3OSwgMHg3YSwgMHhmZCwgMHhmZSwgMHhmZiwgMHhjZSwgMHgyMCwKKwkvKiAweDgwICovIDB4ODAsIDB4ODEsIDB4ODIsIDB4ODMsIDB4ODQsIDB4ODUsIDB4ODYsIDB4ODcsCisJLyogMHg4OCAqLyAweDg4LCAweDg5LCAweDhhLCAweDhiLCAweDhjLCAweDhkLCAweDhlLCAweDhmLAorCS8qIDB4OTAgKi8gMHg5MCwgMHg5MSwgMHg5MiwgMHg5MywgMHg5NCwgMHg5NSwgMHg5NiwgMHg5NywKKwkvKiAweDk4ICovIDB4OTgsIDB4OTksIDB4OWEsIDB4OWIsIDB4OWMsIDB4OWQsIDB4OWUsIDB4OWYsCisJLyogMHhBMCAqLyAweDIwLCAweDQwLCAweGIxLCAweGExLCAweDI0LCAweGEzLCAweGZlLCAweDVmLAorCS8qIDB4QTggKi8gMHgyMiwgMHhjOCwgMHg2MSwgMHgxNCwgMHg5NywgMHgyZCwgMHhhZCwgMHg5NiwKKwkvKiAweEIwICovIDB4ODAsIDB4OGMsIDB4ODIsIDB4ODMsIDB4MjcsIDB4OGYsIDB4ODYsIDB4ZGQsCisJLyogMHhCOCAqLyAweDJjLCAweDgxLCAweDZmLCAweDE1LCAweDhiLCAweDhhLCAweDg0LCAweDYwLAorCS8qIDB4QzAgKi8gMHhlMiwgMHhlMiwgMHhlMiwgMHg1YiwgMHg1YiwgMHhhZSwgMHhiYywgMHhhOSwKKwkvKiAweEM4ICovIDB4YzUsIDB4YmYsIDB4YzYsIDB4ZjEsIDB4ZTMsIDB4ZTMsIDB4ZTMsIDB4ZTMsCisJLyogMHhEMCAqLyAweDQ0LCAweDVkLCAweGE4LCAweGU0LCAweGVjLCAweGVjLCAweDVjLCAweDc4LAorCS8qIDB4RDggKi8gMHhhYiwgMHhhNiwgMHhlNSwgMHg1ZSwgMHg1ZSwgMHhlNiwgMHhhYSwgMHhiZSwKKwkvKiAweEUwICovIDB4N2YsIDB4ZTcsIDB4YWYsIDB4N2IsIDB4N2IsIDB4YWYsIDB4YmQsIDB4YzgsCisJLyogMHhFOCAqLyAweGE0LCAweGE1LCAweGM3LCAweGY2LCAweGE3LCAweGU4LCAweDY5LCAweDY5LAorCS8qIDB4RjAgKi8gMHhlZCwgMHg3ZCwgMHhhOCwgMHhlNCwgMHhlYywgMHg1YywgMHg1YywgMHgyNSwKKwkvKiAweEY4ICovIDB4YWMsIDB4YTYsIDB4ZWEsIDB4ZWYsIDB4N2UsIDB4ZWIsIDB4YjIsIDB4NzksCit9OworCitjaGFyIG9sZF9rZXlwYWRfcHJvZmlsZVtdWzRdWzldID0geworCXsiUzAiLCAiTGVmdFxuIiwgIkxlZnRcbiIsICIifSwKKwl7IlMxIiwgIkRvd25cbiIsICJEb3duXG4iLCAiIn0sCisJeyJTMiIsICJVcFxuIiwgIlVwXG4iLCAiIn0sCisJeyJTMyIsICJSaWdodFxuIiwgIlJpZ2h0XG4iLCAiIn0sCisJeyJTNCIsICJFc2NcbiIsICJFc2NcbiIsICIifSwKKwl7IlM1IiwgIlJldFxuIiwgIlJldFxuIiwgIiJ9LAorCXsiIiwgIiIsICIiLCAiIn0KK307CisKKy8qIHNpZ25hbHMsIHByZXNzLCByZXBlYXQsIHJlbGVhc2UgKi8KK2NoYXIgbmV3X2tleXBhZF9wcm9maWxlW11bNF1bOV0gPSB7CisJeyJTMCIsICJMZWZ0XG4iLCAiTGVmdFxuIiwgIiJ9LAorCXsiUzEiLCAiRG93blxuIiwgIkRvd25cbiIsICIifSwKKwl7IlMyIiwgIlVwXG4iLCAiVXBcbiIsICIifSwKKwl7IlMzIiwgIlJpZ2h0XG4iLCAiUmlnaHRcbiIsICIifSwKKwl7IlM0czUiLCAiIiwgIkVzY1xuIiwgIkVzY1xuIn0sCisJeyJzNFM1IiwgIiIsICJSZXRcbiIsICJSZXRcbiJ9LAorCXsiUzRTNSIsICJIZWxwXG4iLCAiIiwgIiJ9LAorCS8qIGFkZCBuZXcgc2lnbmFscyBhYm92ZSB0aGlzIGxpbmUgKi8KKwl7IiIsICIiLCAiIiwgIiJ9Cit9OworCisvKiBzaWduYWxzLCBwcmVzcywgcmVwZWF0LCByZWxlYXNlICovCitjaGFyIG5leGNvbV9rZXlwYWRfcHJvZmlsZVtdWzRdWzldID0geworCXsiYS1wLWUtIiwgIkRvd25cbiIsICJEb3duXG4iLCAiIn0sCisJeyJhLXAtRS0iLCAiUmV0XG4iLCAiUmV0XG4iLCAiIn0sCisJeyJhLVAtRS0iLCAiRXNjXG4iLCAiRXNjXG4iLCAiIn0sCisJeyJhLVAtZS0iLCAiVXBcbiIsICJVcFxuIiwgIiJ9LAorCS8qIGFkZCBuZXcgc2lnbmFscyBhYm92ZSB0aGlzIGxpbmUgKi8KKwl7IiIsICIiLCAiIiwgIiJ9Cit9OworCitzdGF0aWMgY2hhciAoKmtleXBhZF9wcm9maWxlKVs0XVs5XSA9IG9sZF9rZXlwYWRfcHJvZmlsZTsKKworLyogRklYTUU6IHRoaXMgc2hvdWxkIGJlIGNvbnZlcnRlZCB0byBhIGJpdCBhcnJheSBjb250YWluaW5nIHNpZ25hbHMgc3RhdGVzICovCitzdGF0aWMgc3RydWN0IHsKKwl1bnNpZ25lZCBjaGFyIGU7CS8qIHBhcmFsbGVsIExDRCBFICAgKGRhdGEgbGF0Y2ggb24gZmFsbGluZyBlZGdlKSAqLworCXVuc2lnbmVkIGNoYXIgcnM7CS8qIHBhcmFsbGVsIExDRCBSUyAgKDAgPSBjbWQsIDEgPSBkYXRhKSAqLworCXVuc2lnbmVkIGNoYXIgcnc7CS8qIHBhcmFsbGVsIExDRCBSL1cgKDAgPSBXLCAxID0gUikgKi8KKwl1bnNpZ25lZCBjaGFyIGJsOwkvKiBwYXJhbGxlbCBMQ0QgYmFja2xpZ2h0ICgwID0gb2ZmLCAxID0gb24pICovCisJdW5zaWduZWQgY2hhciBjbDsJLyogc2VyaWFsIExDRCBjbG9jayAobGF0Y2ggb24gcmlzaW5nIGVkZ2UpICovCisJdW5zaWduZWQgY2hhciBkYTsJLyogc2VyaWFsIExDRCBkYXRhICovCit9IGJpdHM7CisKK3N0YXRpYyB2b2lkIGluaXRfc2Nhbl90aW1lcih2b2lkKTsKKworLyogc2V0cyBkYXRhIHBvcnQgYml0cyBhY2NvcmRpbmcgdG8gY3VycmVudCBzaWduYWxzIHZhbHVlcyAqLworc3RhdGljIGludCBzZXRfZGF0YV9iaXRzKHZvaWQpCit7CisJaW50IHZhbCwgYml0OworCisJdmFsID0gcl9kdHIocHBydCk7CisJZm9yIChiaXQgPSAwOyBiaXQgPCBMQ0RfQklUUzsgYml0KyspCisJCXZhbCAmPSBsY2RfYml0c1tMQ0RfUE9SVF9EXVtiaXRdW0JJVF9NU0tdOworCisJdmFsIHw9IGxjZF9iaXRzW0xDRF9QT1JUX0RdW0xDRF9CSVRfRV1bYml0cy5lXQorCSAgICB8IGxjZF9iaXRzW0xDRF9QT1JUX0RdW0xDRF9CSVRfUlNdW2JpdHMucnNdCisJICAgIHwgbGNkX2JpdHNbTENEX1BPUlRfRF1bTENEX0JJVF9SV11bYml0cy5yd10KKwkgICAgfCBsY2RfYml0c1tMQ0RfUE9SVF9EXVtMQ0RfQklUX0JMXVtiaXRzLmJsXQorCSAgICB8IGxjZF9iaXRzW0xDRF9QT1JUX0RdW0xDRF9CSVRfQ0xdW2JpdHMuY2xdCisJICAgIHwgbGNkX2JpdHNbTENEX1BPUlRfRF1bTENEX0JJVF9EQV1bYml0cy5kYV07CisKKwl3X2R0cihwcHJ0LCB2YWwpOworCXJldHVybiB2YWw7Cit9CisKKy8qIHNldHMgY3RybCBwb3J0IGJpdHMgYWNjb3JkaW5nIHRvIGN1cnJlbnQgc2lnbmFscyB2YWx1ZXMgKi8KK3N0YXRpYyBpbnQgc2V0X2N0cmxfYml0cyh2b2lkKQoreworCWludCB2YWwsIGJpdDsKKworCXZhbCA9IHJfY3RyKHBwcnQpOworCWZvciAoYml0ID0gMDsgYml0IDwgTENEX0JJVFM7IGJpdCsrKQorCQl2YWwgJj0gbGNkX2JpdHNbTENEX1BPUlRfQ11bYml0XVtCSVRfTVNLXTsKKworCXZhbCB8PSBsY2RfYml0c1tMQ0RfUE9SVF9DXVtMQ0RfQklUX0VdW2JpdHMuZV0KKwkgICAgfCBsY2RfYml0c1tMQ0RfUE9SVF9DXVtMQ0RfQklUX1JTXVtiaXRzLnJzXQorCSAgICB8IGxjZF9iaXRzW0xDRF9QT1JUX0NdW0xDRF9CSVRfUlddW2JpdHMucnddCisJICAgIHwgbGNkX2JpdHNbTENEX1BPUlRfQ11bTENEX0JJVF9CTF1bYml0cy5ibF0KKwkgICAgfCBsY2RfYml0c1tMQ0RfUE9SVF9DXVtMQ0RfQklUX0NMXVtiaXRzLmNsXQorCSAgICB8IGxjZF9iaXRzW0xDRF9QT1JUX0NdW0xDRF9CSVRfREFdW2JpdHMuZGFdOworCisJd19jdHIocHBydCwgdmFsKTsKKwlyZXR1cm4gdmFsOworfQorCisvKiBzZXRzIGN0cmwgJiBkYXRhIHBvcnQgYml0cyBhY2NvcmRpbmcgdG8gY3VycmVudCBzaWduYWxzIHZhbHVlcyAqLworc3RhdGljIHZvaWQgc2V0X2JpdHModm9pZCkKK3sKKwlzZXRfZGF0YV9iaXRzKCk7CisJc2V0X2N0cmxfYml0cygpOworfQorCisvKgorICogQ29udmVydHMgYSBwYXJhbGxlbCBwb3J0IHBpbiAoZnJvbSAtMjUgdG8gMjUpIHRvIGRhdGEgYW5kIGNvbnRyb2wgcG9ydHMKKyAqIG1hc2tzLCBhbmQgZGF0YSBhbmQgY29udHJvbCBwb3J0IGJpdHMuIFRoZSBzaWduYWwgd2lsbCBiZSBjb25zaWRlcmVkCisgKiB1bmNvbm5lY3RlZCBpZiBpdCdzIG9uIHBpbiAwIG9yIGFuIGludmFsaWQgcGluICg8LTI1IG9yID4yNSkuCisgKgorICogUmVzdWx0IHdpbGwgYmUgdXNlZCB0aGlzIHdheSA6CisgKiAgIG91dChkcG9ydCwgaW4oZHBvcnQpICYgZF92YWxbMl0gfCBkX3ZhbFtzaWduYWxfc3RhdGVdKQorICogICBvdXQoY3BvcnQsIGluKGNwb3J0KSAmIGNfdmFsWzJdIHwgY192YWxbc2lnbmFsX3N0YXRlXSkKKyAqLwordm9pZCBwaW5fdG9fYml0cyhpbnQgcGluLCB1bnNpZ25lZCBjaGFyICpkX3ZhbCwgdW5zaWduZWQgY2hhciAqY192YWwpCit7CisJaW50IGRfYml0LCBjX2JpdCwgaW52OworCisJZF92YWxbMF0gPSBjX3ZhbFswXSA9IGRfdmFsWzFdID0gY192YWxbMV0gPSAwOworCWRfdmFsWzJdID0gY192YWxbMl0gPSAweEZGOworCisJaWYgKHBpbiA9PSAwKQorCQlyZXR1cm47CisKKwlpbnYgPSAocGluIDwgMCk7CisJaWYgKGludikKKwkJcGluID0gLXBpbjsKKworCWRfYml0ID0gY19iaXQgPSAwOworCisJc3dpdGNoIChwaW4pIHsKKwljYXNlIFBJTl9TVFJPQkU6CS8qIHN0cm9iZSwgaW52ZXJ0ZWQgKi8KKwkJY19iaXQgPSBQTkxfUFNUUk9CRTsKKwkJaW52ID0gIWludjsKKwkJYnJlYWs7CisJY2FzZSBQSU5fRDAuLi5QSU5fRDc6CS8qIEQwIC0gRDcgPSAyIC0gOSAqLworCQlkX2JpdCA9IDEgPDwgKHBpbiAtIDIpOworCQlicmVhazsKKwljYXNlIFBJTl9BVVRPTEY6CS8qIGF1dG9mZWVkLCBpbnZlcnRlZCAqLworCQljX2JpdCA9IFBOTF9QQVVUT0xGOworCQlpbnYgPSAhaW52OworCQlicmVhazsKKwljYXNlIFBJTl9JTklUUDoJLyogaW5pdCwgZGlyZWN0ICovCisJCWNfYml0ID0gUE5MX1BJTklUUDsKKwkJYnJlYWs7CisJY2FzZSBQSU5fU0VMRUNQOgkvKiBzZWxlY3RfaW4sIGludmVydGVkICovCisJCWNfYml0ID0gUE5MX1BTRUxFQ1A7CisJCWludiA9ICFpbnY7CisJCWJyZWFrOworCWRlZmF1bHQ6CQkvKiB1bmtub3duIHBpbiwgaWdub3JlICovCisJCWJyZWFrOworCX0KKworCWlmIChjX2JpdCkgeworCQljX3ZhbFsyXSAmPSB+Y19iaXQ7CisJCWNfdmFsWyFpbnZdID0gY19iaXQ7CisJfSBlbHNlIGlmIChkX2JpdCkgeworCQlkX3ZhbFsyXSAmPSB+ZF9iaXQ7CisJCWRfdmFsWyFpbnZdID0gZF9iaXQ7CisJfQorfQorCisvKiBzbGVlcHMgdGhhdCBtYW55IG1pbGxpc2Vjb25kcyB3aXRoIGEgcmVzY2hlZHVsZSAqLworc3RhdGljIHZvaWQgbG9uZ19zbGVlcChpbnQgbXMpCit7CisKKwlpZiAoaW5faW50ZXJydXB0KCkpCisJCW1kZWxheShtcyk7CisJZWxzZSB7CisJCWN1cnJlbnQtPnN0YXRlID0gVEFTS19JTlRFUlJVUFRJQkxFOworCQlzY2hlZHVsZV90aW1lb3V0KChtcyAqIEhaICsgOTk5KSAvIDEwMDApOworCX0KK30KKworLyogc2VuZCBhIHNlcmlhbCBieXRlIHRvIHRoZSBMQ0QgcGFuZWwuIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGxvY2tpbmcgaWYgbmVlZGVkLiAqLworc3RhdGljIHZvaWQgbGNkX3NlbmRfc2VyaWFsKGludCBieXRlKQoreworCWludCBiaXQ7CisKKwkvKiB0aGUgZGF0YSBiaXQgaXMgc2V0IG9uIEQwLCBhbmQgdGhlIGNsb2NrIG9uIFNUUk9CRS4KKwkgKiBMQ0QgcmVhZHMgRDAgb24gU1RST0JFJ3MgcmlzaW5nIGVkZ2UuCisJICovCisJZm9yIChiaXQgPSAwOyBiaXQgPCA4OyBiaXQrKykgeworCQliaXRzLmNsID0gQklUX0NMUjsJLyogQ0xLIGxvdyAqLworCQlzZXRfYml0cygpOworCQliaXRzLmRhID0gYnl0ZSAmIDE7CisJCXNldF9iaXRzKCk7CisJCXVkZWxheSgyKTsJLyogbWFpbnRhaW4gdGhlIGRhdGEgZHVyaW5nIDIgdXMgYmVmb3JlIENMSyB1cCAqLworCQliaXRzLmNsID0gQklUX1NFVDsJLyogQ0xLIGhpZ2ggKi8KKwkJc2V0X2JpdHMoKTsKKwkJdWRlbGF5KDEpOwkvKiBtYWludGFpbiB0aGUgc3Ryb2JlIGR1cmluZyAxIHVzICovCisJCWJ5dGUgPj49IDE7CisJfQorfQorCisvKiB0dXJuIHRoZSBiYWNrbGlnaHQgb24gb3Igb2ZmICovCitzdGF0aWMgdm9pZCBsY2RfYmFja2xpZ2h0KGludCBvbikKK3sKKwlpZiAobGNkX2JsX3BpbiA9PSBQSU5fTk9ORSkKKwkJcmV0dXJuOworCisJLyogVGhlIGJhY2tsaWdodCBpcyBhY3RpdmF0ZWQgYnkgc2V0aW5nIHRoZSBBVVRPRkVFRCBsaW5lIHRvICs1ViAgKi8KKwlzcGluX2xvY2soJnBwcnRfbG9jayk7CisJYml0cy5ibCA9IG9uOworCXNldF9iaXRzKCk7CisJc3Bpbl91bmxvY2soJnBwcnRfbG9jayk7Cit9CisKKy8qIHNlbmQgYSBjb21tYW5kIHRvIHRoZSBMQ0QgcGFuZWwgaW4gc2VyaWFsIG1vZGUgKi8KK3N0YXRpYyB2b2lkIGxjZF93cml0ZV9jbWRfcyhpbnQgY21kKQoreworCXNwaW5fbG9jaygmcHBydF9sb2NrKTsKKwlsY2Rfc2VuZF9zZXJpYWwoMHgxRik7CS8qIFIvVz1XLCBSUz0wICovCisJbGNkX3NlbmRfc2VyaWFsKGNtZCAmIDB4MEYpOworCWxjZF9zZW5kX3NlcmlhbCgoY21kID4+IDQpICYgMHgwRik7CisJdWRlbGF5KDQwKTsJCS8qIHRoZSBzaG9ydGVzdCBjb21tYW5kIHRha2VzIGF0IGxlYXN0IDQwIHVzICovCisJc3Bpbl91bmxvY2soJnBwcnRfbG9jayk7Cit9CisKKy8qIHNlbmQgZGF0YSB0byB0aGUgTENEIHBhbmVsIGluIHNlcmlhbCBtb2RlICovCitzdGF0aWMgdm9pZCBsY2Rfd3JpdGVfZGF0YV9zKGludCBkYXRhKQoreworCXNwaW5fbG9jaygmcHBydF9sb2NrKTsKKwlsY2Rfc2VuZF9zZXJpYWwoMHg1Rik7CS8qIFIvVz1XLCBSUz0xICovCisJbGNkX3NlbmRfc2VyaWFsKGRhdGEgJiAweDBGKTsKKwlsY2Rfc2VuZF9zZXJpYWwoKGRhdGEgPj4gNCkgJiAweDBGKTsKKwl1ZGVsYXkoNDApOwkJLyogdGhlIHNob3J0ZXN0IGRhdGEgdGFrZXMgYXQgbGVhc3QgNDAgdXMgKi8KKwlzcGluX3VubG9jaygmcHBydF9sb2NrKTsKK30KKworLyogc2VuZCBhIGNvbW1hbmQgdG8gdGhlIExDRCBwYW5lbCBpbiA4IGJpdHMgcGFyYWxsZWwgbW9kZSAqLworc3RhdGljIHZvaWQgbGNkX3dyaXRlX2NtZF9wOChpbnQgY21kKQoreworCXNwaW5fbG9jaygmcHBydF9sb2NrKTsKKwkvKiBwcmVzZW50IHRoZSBkYXRhIHRvIHRoZSBkYXRhIHBvcnQgKi8KKwl3X2R0cihwcHJ0LCBjbWQpOworCXVkZWxheSgyMCk7CQkvKiBtYWludGFpbiB0aGUgZGF0YSBkdXJpbmcgMjAgdXMgYmVmb3JlIHRoZSBzdHJvYmUgKi8KKworCWJpdHMuZSA9IEJJVF9TRVQ7CisJYml0cy5ycyA9IEJJVF9DTFI7CisJYml0cy5ydyA9IEJJVF9DTFI7CisJc2V0X2N0cmxfYml0cygpOworCisJdWRlbGF5KDQwKTsJCS8qIG1haW50YWluIHRoZSBzdHJvYmUgZHVyaW5nIDQwIHVzICovCisKKwliaXRzLmUgPSBCSVRfQ0xSOworCXNldF9jdHJsX2JpdHMoKTsKKworCXVkZWxheSgxMjApOwkJLyogdGhlIHNob3J0ZXN0IGNvbW1hbmQgdGFrZXMgYXQgbGVhc3QgMTIwIHVzICovCisJc3Bpbl91bmxvY2soJnBwcnRfbG9jayk7Cit9CisKKy8qIHNlbmQgZGF0YSB0byB0aGUgTENEIHBhbmVsIGluIDggYml0cyBwYXJhbGxlbCBtb2RlICovCitzdGF0aWMgdm9pZCBsY2Rfd3JpdGVfZGF0YV9wOChpbnQgZGF0YSkKK3sKKwlzcGluX2xvY2soJnBwcnRfbG9jayk7CisJLyogcHJlc2VudCB0aGUgZGF0YSB0byB0aGUgZGF0YSBwb3J0ICovCisJd19kdHIocHBydCwgZGF0YSk7CisJdWRlbGF5KDIwKTsJCS8qIG1haW50YWluIHRoZSBkYXRhIGR1cmluZyAyMCB1cyBiZWZvcmUgdGhlIHN0cm9iZSAqLworCisJYml0cy5lID0gQklUX1NFVDsKKwliaXRzLnJzID0gQklUX1NFVDsKKwliaXRzLnJ3ID0gQklUX0NMUjsKKwlzZXRfY3RybF9iaXRzKCk7CisKKwl1ZGVsYXkoNDApOwkJLyogbWFpbnRhaW4gdGhlIHN0cm9iZSBkdXJpbmcgNDAgdXMgKi8KKworCWJpdHMuZSA9IEJJVF9DTFI7CisJc2V0X2N0cmxfYml0cygpOworCisJdWRlbGF5KDQ1KTsJCS8qIHRoZSBzaG9ydGVzdCBkYXRhIHRha2VzIGF0IGxlYXN0IDQ1IHVzICovCisJc3Bpbl91bmxvY2soJnBwcnRfbG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIGxjZF9nb3RveHkodm9pZCkKK3sKKwlsY2Rfd3JpdGVfY21kKDB4ODAJLyogc2V0IEREUkFNIGFkZHJlc3MgKi8KKwkJICAgICAgfCAobGNkX2FkZHJfeSA/IGxjZF9od2lkdGggOiAwKQorCQkgICAgICAvKiB3ZSBmb3JjZSB0aGUgY3Vyc29yIHRvIHN0YXkgYXQgdGhlIGVuZCBvZiB0aGUgbGluZSBpZiBpdCB3YW50cyB0byBnbyBmYXJ0aGVyICovCisJCSAgICAgIHwgKChsY2RfYWRkcl94IDwgbGNkX2J3aWR0aCkgPyBsY2RfYWRkcl94ICYKKwkJCSAobGNkX2h3aWR0aCAtIDEpIDogbGNkX2J3aWR0aCAtIDEpKTsKK30KKworc3RhdGljIHZvaWQgbGNkX3ByaW50KGNoYXIgYykKK3sKKwlpZiAobGNkX2FkZHJfeCA8IGxjZF9id2lkdGgpIHsKKwkJaWYgKGxjZF9jaGFyX2NvbnYgIT0gTlVMTCkKKwkJCWMgPSBsY2RfY2hhcl9jb252Wyh1bnNpZ25lZCBjaGFyKWNdOworCQlsY2Rfd3JpdGVfZGF0YShjKTsKKwkJbGNkX2FkZHJfeCsrOworCX0KKwkvKiBwcmV2ZW50cyB0aGUgY3Vyc29yIGZyb20gd3JhcHBpbmcgb250byB0aGUgbmV4dCBsaW5lICovCisJaWYgKGxjZF9hZGRyX3ggPT0gbGNkX2J3aWR0aCkKKwkJbGNkX2dvdG94eSgpOworfQorCisvKiBmaWxscyB0aGUgZGlzcGxheSB3aXRoIHNwYWNlcyBhbmQgcmVzZXRzIFgvWSAqLworc3RhdGljIHZvaWQgbGNkX2NsZWFyX2Zhc3Rfcyh2b2lkKQoreworCWludCBwb3M7CisJbGNkX2FkZHJfeCA9IGxjZF9hZGRyX3kgPSAwOworCWxjZF9nb3RveHkoKTsKKworCXNwaW5fbG9jaygmcHBydF9sb2NrKTsKKwlmb3IgKHBvcyA9IDA7IHBvcyA8IGxjZF9oZWlnaHQgKiBsY2RfaHdpZHRoOyBwb3MrKykgeworCQlsY2Rfc2VuZF9zZXJpYWwoMHg1Rik7CS8qIFIvVz1XLCBSUz0xICovCisJCWxjZF9zZW5kX3NlcmlhbCgnICcgJiAweDBGKTsKKwkJbGNkX3NlbmRfc2VyaWFsKCgnICcgPj4gNCkgJiAweDBGKTsKKwkJdWRlbGF5KDQwKTsJLyogdGhlIHNob3J0ZXN0IGRhdGEgdGFrZXMgYXQgbGVhc3QgNDAgdXMgKi8KKwl9CisJc3Bpbl91bmxvY2soJnBwcnRfbG9jayk7CisKKwlsY2RfYWRkcl94ID0gbGNkX2FkZHJfeSA9IDA7CisJbGNkX2dvdG94eSgpOworfQorCisvKiBmaWxscyB0aGUgZGlzcGxheSB3aXRoIHNwYWNlcyBhbmQgcmVzZXRzIFgvWSAqLworc3RhdGljIHZvaWQgbGNkX2NsZWFyX2Zhc3RfcDgodm9pZCkKK3sKKwlpbnQgcG9zOworCWxjZF9hZGRyX3ggPSBsY2RfYWRkcl95ID0gMDsKKwlsY2RfZ290b3h5KCk7CisKKwlzcGluX2xvY2soJnBwcnRfbG9jayk7CisJZm9yIChwb3MgPSAwOyBwb3MgPCBsY2RfaGVpZ2h0ICogbGNkX2h3aWR0aDsgcG9zKyspIHsKKwkJLyogcHJlc2VudCB0aGUgZGF0YSB0byB0aGUgZGF0YSBwb3J0ICovCisJCXdfZHRyKHBwcnQsICcgJyk7CisJCXVkZWxheSgyMCk7CS8qIG1haW50YWluIHRoZSBkYXRhIGR1cmluZyAyMCB1cyBiZWZvcmUgdGhlIHN0cm9iZSAqLworCisJCWJpdHMuZSA9IEJJVF9TRVQ7CisJCWJpdHMucnMgPSBCSVRfU0VUOworCQliaXRzLnJ3ID0gQklUX0NMUjsKKwkJc2V0X2N0cmxfYml0cygpOworCisJCXVkZWxheSg0MCk7CS8qIG1haW50YWluIHRoZSBzdHJvYmUgZHVyaW5nIDQwIHVzICovCisKKwkJYml0cy5lID0gQklUX0NMUjsKKwkJc2V0X2N0cmxfYml0cygpOworCisJCXVkZWxheSg0NSk7CS8qIHRoZSBzaG9ydGVzdCBkYXRhIHRha2VzIGF0IGxlYXN0IDQ1IHVzICovCisJfQorCXNwaW5fdW5sb2NrKCZwcHJ0X2xvY2spOworCisJbGNkX2FkZHJfeCA9IGxjZF9hZGRyX3kgPSAwOworCWxjZF9nb3RveHkoKTsKK30KKworLyogY2xlYXJzIHRoZSBkaXNwbGF5IGFuZCByZXNldHMgWC9ZICovCitzdGF0aWMgdm9pZCBsY2RfY2xlYXJfZGlzcGxheSh2b2lkKQoreworCWxjZF93cml0ZV9jbWQoMHgwMSk7CS8qIGNsZWFyIGRpc3BsYXkgKi8KKwlsY2RfYWRkcl94ID0gbGNkX2FkZHJfeSA9IDA7CisJLyogd2UgbXVzdCB3YWl0IGEgZmV3IG1pbGxpc2Vjb25kcyAoMTUpICovCisJbG9uZ19zbGVlcCgxNSk7Cit9CisKK3N0YXRpYyB2b2lkIGxjZF9pbml0X2Rpc3BsYXkodm9pZCkKK3sKKworCWxjZF9mbGFncyA9ICgobGNkX2hlaWdodCA+IDEpID8gTENEX0ZMQUdfTiA6IDApCisJICAgIHwgTENEX0ZMQUdfRCB8IExDRF9GTEFHX0MgfCBMQ0RfRkxBR19COworCisJbG9uZ19zbGVlcCgyMCk7CQkvKiB3YWl0IDIwIG1zIGFmdGVyIHBvd2VyLXVwIGZvciB0aGUgcGFyYW5vaWQgKi8KKworCWxjZF93cml0ZV9jbWQoMHgzMCk7CS8qIDhiaXRzLCAxIGxpbmUsIHNtYWxsIGZvbnRzICovCisJbG9uZ19zbGVlcCgxMCk7CisJbGNkX3dyaXRlX2NtZCgweDMwKTsJLyogOGJpdHMsIDEgbGluZSwgc21hbGwgZm9udHMgKi8KKwlsb25nX3NsZWVwKDEwKTsKKwlsY2Rfd3JpdGVfY21kKDB4MzApOwkvKiA4Yml0cywgMSBsaW5lLCBzbWFsbCBmb250cyAqLworCWxvbmdfc2xlZXAoMTApOworCisJbGNkX3dyaXRlX2NtZCgweDMwCS8qIHNldCBmb250IGhlaWdodCBhbmQgbGluZXMgbnVtYmVyICovCisJCSAgICAgIHwgKChsY2RfZmxhZ3MgJiBMQ0RfRkxBR19GKSA/IDQgOiAwKQorCQkgICAgICB8ICgobGNkX2ZsYWdzICYgTENEX0ZMQUdfTikgPyA4IDogMCkKKwkgICAgKTsKKwlsb25nX3NsZWVwKDEwKTsKKworCWxjZF93cml0ZV9jbWQoMHgwOCk7CS8qIGRpc3BsYXkgb2ZmLCBjdXJzb3Igb2ZmLCBibGluayBvZmYgKi8KKwlsb25nX3NsZWVwKDEwKTsKKworCWxjZF93cml0ZV9jbWQoMHgwOAkvKiBzZXQgZGlzcGxheSBtb2RlICovCisJCSAgICAgIHwgKChsY2RfZmxhZ3MgJiBMQ0RfRkxBR19EKSA/IDQgOiAwKQorCQkgICAgICB8ICgobGNkX2ZsYWdzICYgTENEX0ZMQUdfQykgPyAyIDogMCkKKwkJICAgICAgfCAoKGxjZF9mbGFncyAmIExDRF9GTEFHX0IpID8gMSA6IDApCisJICAgICk7CisKKwlsY2RfYmFja2xpZ2h0KChsY2RfZmxhZ3MgJiBMQ0RfRkxBR19MKSA/IDEgOiAwKTsKKworCWxvbmdfc2xlZXAoMTApOworCisJbGNkX3dyaXRlX2NtZCgweDA2KTsJLyogZW50cnkgbW9kZSBzZXQgOiBpbmNyZW1lbnQsIGN1cnNvciBzaGlmdGluZyAqLworCisJbGNkX2NsZWFyX2Rpc3BsYXkoKTsKK30KKworLyoKKyAqIFRoZXNlIGFyZSB0aGUgZmlsZSBvcGVyYXRpb24gZnVuY3Rpb24gZm9yIHVzZXIgYWNjZXNzIHRvIC9kZXYvbGNkCisgKiBUaGlzIGZ1bmN0aW9uIGNhbiBhbHNvIGJlIGNhbGxlZCBmcm9tIGluc2lkZSB0aGUga2VybmVsLCBieQorICogc2V0dGluZyBmaWxlIGFuZCBwcG9zIHRvIE5VTEwuCisgKgorICovCisKK3N0YXRpYyBzc2l6ZV90IGxjZF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCSBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCisJY29uc3QgY2hhciAqdG1wID0gYnVmOworCWNoYXIgYzsKKworCWZvciAoOyBjb3VudC0tID4gMDsgKHBwb3MgPyAoKnBwb3MpKysgOiAwKSwgKyt0bXApIHsKKwkJaWYgKCFpbl9pbnRlcnJ1cHQoKSAmJiAoKChjb3VudCArIDEpICYgMHgxZikgPT0gMCkpCisJCQlzY2hlZHVsZSgpOwkvKiBsZXQncyBiZSBhIGxpdHRsZSBuaWNlIHdpdGggb3RoZXIgcHJvY2Vzc2VzIHRoYXQgbmVlZCBzb21lIENQVSAqLworCisJCWlmIChwcG9zID09IE5VTEwgJiYgZmlsZSA9PSBOVUxMKQorCQkJYyA9ICp0bXA7CS8qIGxldCdzIG5vdCB1c2UgZ2V0X3VzZXIoKSBmcm9tIHRoZSBrZXJuZWwgISAqLworCQllbHNlIGlmIChnZXRfdXNlcihjLCB0bXApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJLyogZmlyc3QsIHdlJ2xsIHRlc3QgaWYgd2UncmUgaW4gZXNjYXBlIG1vZGUgKi8KKwkJaWYgKChjICE9ICdcbicpICYmIGxjZF9lc2NhcGVfbGVuID49IDApIHsJLyogeWVzLCBsZXQncyBhZGQgdGhpcyBjaGFyIHRvIHRoZSBidWZmZXIgKi8KKwkJCWxjZF9lc2NhcGVbbGNkX2VzY2FwZV9sZW4rK10gPSBjOworCQkJbGNkX2VzY2FwZVtsY2RfZXNjYXBlX2xlbl0gPSAwOworCQl9IGVsc2UgeworCQkJbGNkX2VzY2FwZV9sZW4gPSAtMTsJLyogYWJvcnRzIGFueSBwcmV2aW91cyBlc2NhcGUgc2VxdWVuY2UgKi8KKworCQkJc3dpdGNoIChjKSB7CisJCQljYXNlIExDRF9FU0NBUEVfQ0hBUjoJLyogc3RhcnQgb2YgYW4gZXNjYXBlIHNlcXVlbmNlICovCisJCQkJbGNkX2VzY2FwZV9sZW4gPSAwOworCQkJCWxjZF9lc2NhcGVbbGNkX2VzY2FwZV9sZW5dID0gMDsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ1xiJzoJLyogZ28gYmFjayBvbmUgY2hhciBhbmQgY2xlYXIgaXQgKi8KKwkJCQlpZiAobGNkX2FkZHJfeCA+IDApIHsKKwkJCQkJaWYgKGxjZF9hZGRyX3ggPCBsY2RfYndpZHRoKQkvKiBjaGVjayBpZiB3ZSdyZSBub3QgYXQgdGhlIGVuZCBvZiB0aGUgbGluZSAqLworCQkJCQkJbGNkX3dyaXRlX2NtZCgweDEwKTsJLyogYmFjayBvbmUgY2hhciAqLworCQkJCQlsY2RfYWRkcl94LS07CisJCQkJfQorCQkJCWxjZF93cml0ZV9kYXRhKCcgJyk7CS8qIHJlcGxhY2Ugd2l0aCBhIHNwYWNlICovCisJCQkJbGNkX3dyaXRlX2NtZCgweDEwKTsJLyogYmFjayBvbmUgY2hhciBhZ2FpbiAqLworCQkJCWJyZWFrOworCQkJY2FzZSAnXDAxNCc6CS8qIHF1aWNrbHkgY2xlYXIgdGhlIGRpc3BsYXkgKi8KKwkJCQlsY2RfY2xlYXJfZmFzdCgpOworCQkJCWJyZWFrOworCQkJY2FzZSAnXG4nOgkvKiBmbHVzaCB0aGUgcmVtYWluZGVyIG9mIHRoZSBjdXJyZW50IGxpbmUgYW5kIGdvIHRvIHRoZQorCQkJCQkgICBiZWdpbm5pbmcgb2YgdGhlIG5leHQgbGluZSAqLworCQkJCWZvciAoOyBsY2RfYWRkcl94IDwgbGNkX2J3aWR0aDsgbGNkX2FkZHJfeCsrKQorCQkJCQlsY2Rfd3JpdGVfZGF0YSgnICcpOworCQkJCWxjZF9hZGRyX3ggPSAwOworCQkJCWxjZF9hZGRyX3kgPSAobGNkX2FkZHJfeSArIDEpICUgbGNkX2hlaWdodDsKKwkJCQlsY2RfZ290b3h5KCk7CisJCQkJYnJlYWs7CisJCQljYXNlICdccic6CS8qIGdvIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHNhbWUgbGluZSAqLworCQkJCWxjZF9hZGRyX3ggPSAwOworCQkJCWxjZF9nb3RveHkoKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ1x0JzoJLyogcHJpbnQgYSBzcGFjZSBpbnN0ZWFkIG9mIHRoZSB0YWIgKi8KKwkJCQlsY2RfcHJpbnQoJyAnKTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CS8qIHNpbXBseSBwcmludCB0aGlzIGNoYXIgKi8KKwkJCQlsY2RfcHJpbnQoYyk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQkvKiBub3cgd2UnbGwgc2VlIGlmIHdlJ3JlIGluIGFuIGVzY2FwZSBtb2RlIGFuZCBpZiB0aGUgY3VycmVudAorCQkgICBlc2NhcGUgc2VxdWVuY2UgY2FuIGJlIHVuZGVyc3Rvb2QuCisJCSAqLworCQlpZiAobGNkX2VzY2FwZV9sZW4gPj0gMikgewkvKiBtaW5pbWFsIGxlbmd0aCBmb3IgYW4gZXNjYXBlIGNvbW1hbmQgKi8KKwkJCWludCBwcm9jZXNzZWQgPSAwOwkvKiAxIG1lYW5zIHRoZSBjb21tYW5kIGhhcyBiZWVuIHByb2Nlc3NlZCAqLworCisJCQlpZiAoIXN0cmNtcChsY2RfZXNjYXBlLCAiWzJKIikpIHsJLyogQ2xlYXIgdGhlIGRpc3BsYXkgKi8KKwkJCQlsY2RfY2xlYXJfZmFzdCgpOwkvKiBjbGVhciBkaXNwbGF5ICovCisJCQkJcHJvY2Vzc2VkID0gMTsKKwkJCX0gZWxzZSBpZiAoIXN0cmNtcChsY2RfZXNjYXBlLCAiW0giKSkgewkvKiBDdXJzb3IgdG8gaG9tZSAqLworCQkJCWxjZF9hZGRyX3ggPSBsY2RfYWRkcl95ID0gMDsKKwkJCQlsY2RfZ290b3h5KCk7CisJCQkJcHJvY2Vzc2VkID0gMTsKKwkJCX0KKwkJCS8qIGNvZGVzIHN0YXJ0aW5nIHdpdGggXltbTCAqLworCQkJZWxzZSBpZiAoKGxjZF9lc2NhcGVfbGVuID49IDMpICYmCisJCQkJIChsY2RfZXNjYXBlWzBdID09ICdbJykgJiYgKGxjZF9lc2NhcGVbMV0gPT0gJ0wnKSkgewkvKiBMQ0Qgc3BlY2lhbCBjb2RlcyAqLworCisJCQkJY2hhciAqZXNjID0gbGNkX2VzY2FwZSArIDI7CisJCQkJaW50IG9sZGZsYWdzID0gbGNkX2ZsYWdzOworCisJCQkJLyogY2hlY2sgZm9yIGRpc3BsYXkgbW9kZSBmbGFncyAqLworCQkJCXN3aXRjaCAoKmVzYykgeworCQkJCWNhc2UgJ0QnOgkvKiBEaXNwbGF5IE9OICovCisJCQkJCWxjZF9mbGFncyB8PSBMQ0RfRkxBR19EOworCQkJCQlwcm9jZXNzZWQgPSAxOworCQkJCQlicmVhazsKKwkJCQljYXNlICdkJzoJLyogRGlzcGxheSBPRkYgKi8KKwkJCQkJbGNkX2ZsYWdzICY9IH5MQ0RfRkxBR19EOworCQkJCQlwcm9jZXNzZWQgPSAxOworCQkJCQlicmVhazsKKwkJCQljYXNlICdDJzoJLyogQ3Vyc29yIE9OICovCisJCQkJCWxjZF9mbGFncyB8PSBMQ0RfRkxBR19DOworCQkJCQlwcm9jZXNzZWQgPSAxOworCQkJCQlicmVhazsKKwkJCQljYXNlICdjJzoJLyogQ3Vyc29yIE9GRiAqLworCQkJCQlsY2RfZmxhZ3MgJj0gfkxDRF9GTEFHX0M7CisJCQkJCXByb2Nlc3NlZCA9IDE7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgJ0InOgkvKiBCbGluayBPTiAqLworCQkJCQlsY2RfZmxhZ3MgfD0gTENEX0ZMQUdfQjsKKwkJCQkJcHJvY2Vzc2VkID0gMTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAnYic6CS8qIEJsaW5rIE9GRiAqLworCQkJCQlsY2RfZmxhZ3MgJj0gfkxDRF9GTEFHX0I7CisJCQkJCXByb2Nlc3NlZCA9IDE7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgJysnOgkvKiBCYWNrIGxpZ2h0IE9OICovCisJCQkJCWxjZF9mbGFncyB8PSBMQ0RfRkxBR19MOworCQkJCQlwcm9jZXNzZWQgPSAxOworCQkJCQlicmVhazsKKwkJCQljYXNlICctJzoJLyogQmFjayBsaWdodCBPRkYgKi8KKwkJCQkJbGNkX2ZsYWdzICY9IH5MQ0RfRkxBR19MOworCQkJCQlwcm9jZXNzZWQgPSAxOworCQkJCQlicmVhazsKKwkJCQljYXNlICcqJzoJLyogZmxhc2ggYmFjayBsaWdodCB1c2luZyB0aGUga2V5cGFkIHRpbWVyICovCisJCQkJCWlmIChzY2FuX3RpbWVyLmZ1bmN0aW9uICE9IE5VTEwpIHsKKwkJCQkJCWlmIChsaWdodF90ZW1wbyA9PSAwCisJCQkJCQkgICAgJiYgKChsY2RfZmxhZ3MgJiBMQ0RfRkxBR19MKQorCQkJCQkJCT09IDApKQorCQkJCQkJCWxjZF9iYWNrbGlnaHQoMSk7CisJCQkJCQlsaWdodF90ZW1wbyA9IEZMQVNIX0xJR0hUX1RFTVBPOworCQkJCQl9CisJCQkJCXByb2Nlc3NlZCA9IDE7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgJ2YnOgkvKiBTbWFsbCBGb250ICovCisJCQkJCWxjZF9mbGFncyAmPSB+TENEX0ZMQUdfRjsKKwkJCQkJcHJvY2Vzc2VkID0gMTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAnRic6CS8qIExhcmdlIEZvbnQgKi8KKwkJCQkJbGNkX2ZsYWdzIHw9IExDRF9GTEFHX0Y7CisJCQkJCXByb2Nlc3NlZCA9IDE7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgJ24nOgkvKiBPbmUgTGluZSAqLworCQkJCQlsY2RfZmxhZ3MgJj0gfkxDRF9GTEFHX047CisJCQkJCXByb2Nlc3NlZCA9IDE7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgJ04nOgkvKiBUd28gTGluZXMgKi8KKwkJCQkJbGNkX2ZsYWdzIHw9IExDRF9GTEFHX047CisJCQkJCWJyZWFrOworCisJCQkJY2FzZSAnbCc6CS8qIFNoaWZ0IEN1cnNvciBMZWZ0ICovCisJCQkJCWlmIChsY2RfYWRkcl94ID4gMCkgeworCQkJCQkJaWYgKGxjZF9hZGRyX3ggPCBsY2RfYndpZHRoKQorCQkJCQkJCWxjZF93cml0ZV9jbWQoMHgxMCk7CS8qIGJhY2sgb25lIGNoYXIgaWYgbm90IGF0IGVuZCBvZiBsaW5lICovCisJCQkJCQlsY2RfYWRkcl94LS07CisJCQkJCX0KKwkJCQkJcHJvY2Vzc2VkID0gMTsKKwkJCQkJYnJlYWs7CisKKwkJCQljYXNlICdyJzoJLyogc2hpZnQgY3Vyc29yIHJpZ2h0ICovCisJCQkJCWlmIChsY2RfYWRkcl94IDwgbGNkX3dpZHRoKSB7CisJCQkJCQlpZiAobGNkX2FkZHJfeCA8IChsY2RfYndpZHRoIC0gMSkpCisJCQkJCQkJbGNkX3dyaXRlX2NtZCgweDE0KTsJLyogYWxsb3cgdGhlIGN1cnNvciB0byBwYXNzIHRoZSBlbmQgb2YgdGhlIGxpbmUgKi8KKwkJCQkJCWxjZF9hZGRyX3grKzsKKwkJCQkJfQorCQkJCQlwcm9jZXNzZWQgPSAxOworCQkJCQlicmVhazsKKworCQkJCWNhc2UgJ0wnOgkvKiBzaGlmdCBkaXNwbGF5IGxlZnQgKi8KKwkJCQkJbGNkX2xlZnRfc2hpZnQrKzsKKwkJCQkJbGNkX3dyaXRlX2NtZCgweDE4KTsKKwkJCQkJcHJvY2Vzc2VkID0gMTsKKwkJCQkJYnJlYWs7CisKKwkJCQljYXNlICdSJzoJLyogc2hpZnQgZGlzcGxheSByaWdodCAqLworCQkJCQlsY2RfbGVmdF9zaGlmdC0tOworCQkJCQlsY2Rfd3JpdGVfY21kKDB4MUMpOworCQkJCQlwcm9jZXNzZWQgPSAxOworCQkJCQlicmVhazsKKworCQkJCWNhc2UgJ2snOnsJLyoga2lsbCBlbmQgb2YgbGluZSAqLworCQkJCQkJaW50IHg7CisJCQkJCQlmb3IgKHggPSBsY2RfYWRkcl94OyB4IDwgbGNkX2J3aWR0aDsgeCsrKQorCQkJCQkJCWxjZF93cml0ZV9kYXRhKCcgJyk7CisJCQkJCQlsY2RfZ290b3h5KCk7CS8qIHJlc3RvcmUgY3Vyc29yIHBvc2l0aW9uICovCisJCQkJCQlwcm9jZXNzZWQgPSAxOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQljYXNlICdJJzoJLyogcmVpbml0aWFsaXplIGRpc3BsYXkgKi8KKwkJCQkJbGNkX2luaXRfZGlzcGxheSgpOworCQkJCQlsY2RfbGVmdF9zaGlmdCA9IDA7CisJCQkJCXByb2Nlc3NlZCA9IDE7CisJCQkJCWJyZWFrOworCisJCQkJY2FzZSAnRyc6CS8qIEdlbmVyYXRvciA6IExHY3h4eHh4Li4ueHg7ICovICB7CisJCQkJCQkvKiBtdXN0IGhhdmUgPGM+IGJldHdlZW4gJzAnIGFuZCAnNycsIHJlcHJlc2VudGluZyB0aGUgbnVtZXJpY2FsCisJCQkJCQkgKiBBU0NJSSBjb2RlIG9mIHRoZSByZWRlZmluZWQgY2hhcmFjdGVyLCBhbmQgPHh4Li4ueHg+IGEgc2VxdWVuY2UKKwkJCQkJCSAqIG9mIDE2IGhleCBkaWdpdHMgcmVwcmVzZW50aW5nIDggYnl0ZXMgZm9yIGVhY2ggY2hhcmFjdGVyLiBNb3N0CisJCQkJCQkgKiBMQ0RzIHdpbGwgb25seSB1c2UgNSBsb3dlciBiaXRzIG9mIHRoZSA3IGZpcnN0IGJ5dGVzLgorCQkJCQkJICovCisKKwkJCQkJCXVuc2lnbmVkIGNoYXIgY2dieXRlc1s4XTsKKwkJCQkJCXVuc2lnbmVkIGNoYXIgY2dhZGRyOworCQkJCQkJaW50IGNnb2Zmc2V0OworCQkJCQkJaW50IHNoaWZ0OworCQkJCQkJY2hhciB2YWx1ZTsKKwkJCQkJCWludCBhZGRyOworCisJCQkJCQlpZiAoc3RyY2hyKGVzYywgJzsnKSA9PSBOVUxMKQorCQkJCQkJCWJyZWFrOworCisJCQkJCQllc2MrKzsKKworCQkJCQkJY2dhZGRyID0gKihlc2MrKykgLSAnMCc7CisJCQkJCQlpZiAoY2dhZGRyID4gNykgeworCQkJCQkJCXByb2Nlc3NlZCA9IDE7CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisKKwkJCQkJCWNnb2Zmc2V0ID0gMDsKKwkJCQkJCXNoaWZ0ID0gMDsKKwkJCQkJCXZhbHVlID0gMDsKKwkJCQkJCXdoaWxlICgqZXNjICYmIGNnb2Zmc2V0IDwgOCkgeworCQkJCQkJCXNoaWZ0IF49IDQ7CisJCQkJCQkJaWYgKCplc2MgPj0gJzAnICYmICplc2MgPD0gJzknKQorCQkJCQkJCQl2YWx1ZSB8PSAoKmVzYyAtICcwJykgPDwgc2hpZnQ7CisJCQkJCQkJZWxzZSBpZiAoKmVzYyA+PSAnQScgJiYgKmVzYyA8PSAnWicpCisJCQkJCQkJCXZhbHVlIHw9ICgqZXNjIC0gJ0EnICsgMTApIDw8IHNoaWZ0OworCQkJCQkJCWVsc2UgaWYgKCplc2MgPj0gJ2EnICYmICplc2MgPD0gJ3onKQorCQkJCQkJCQl2YWx1ZSB8PSAoKmVzYyAtICdhJyArIDEwKSA8PCBzaGlmdDsKKwkJCQkJCQllbHNlIHsKKwkJCQkJCQkJZXNjKys7CisJCQkJCQkJCWNvbnRpbnVlOworCQkJCQkJCX0KKworCQkJCQkJCWlmIChzaGlmdCA9PSAwKSB7CisJCQkJCQkJCWNnYnl0ZXNbY2dvZmZzZXQrK10gPSB2YWx1ZTsKKwkJCQkJCQkJdmFsdWUgPSAwOworCQkJCQkJCX0KKworCQkJCQkJCWVzYysrOworCQkJCQkJfQorCisJCQkJCQlsY2Rfd3JpdGVfY21kKDB4NDAgfCAoY2dhZGRyICogOCkpOworCQkJCQkJZm9yIChhZGRyID0gMDsgYWRkciA8IGNnb2Zmc2V0OyBhZGRyKyspCisJCQkJCQkJbGNkX3dyaXRlX2RhdGEoY2dieXRlc1thZGRyXSk7CisKKwkJCQkJCWxjZF9nb3RveHkoKTsJLyogZW5zdXJlcyB0aGF0IHdlIHN0b3Agd3JpdGluZyB0byBDR1JBTSAqLworCQkJCQkJcHJvY2Vzc2VkID0gMTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJY2FzZSAneCc6CS8qIGdvdG94eSA6IEx4WFhYW3lZWVldOyAqLworCQkJCWNhc2UgJ3knOgkvKiBnb3RveHkgOiBMeVlZWVt4WFhYXTsgKi8KKwkJCQkJaWYgKHN0cmNocihlc2MsICc7JykgPT0gTlVMTCkKKwkJCQkJCWJyZWFrOworCisJCQkJCXdoaWxlICgqZXNjKSB7CisJCQkJCQlpZiAoKmVzYyA9PSAneCcpIHsKKwkJCQkJCQllc2MrKzsKKwkJCQkJCQlsY2RfYWRkcl94ID0gMDsKKwkJCQkJCQl3aGlsZSAoaXNkaWdpdCgqZXNjKSkgeworCQkJCQkJCQlsY2RfYWRkcl94ID0KKwkJCQkJCQkJICAgIGxjZF9hZGRyX3ggKgorCQkJCQkJCQkgICAgMTAgKyAoKmVzYyAtCisJCQkJCQkJCQkgICcwJyk7CisJCQkJCQkJCWVzYysrOworCQkJCQkJCX0KKwkJCQkJCX0gZWxzZSBpZiAoKmVzYyA9PSAneScpIHsKKwkJCQkJCQllc2MrKzsKKwkJCQkJCQlsY2RfYWRkcl95ID0gMDsKKwkJCQkJCQl3aGlsZSAoaXNkaWdpdCgqZXNjKSkgeworCQkJCQkJCQlsY2RfYWRkcl95ID0KKwkJCQkJCQkJICAgIGxjZF9hZGRyX3kgKgorCQkJCQkJCQkgICAgMTAgKyAoKmVzYyAtCisJCQkJCQkJCQkgICcwJyk7CisJCQkJCQkJCWVzYysrOworCQkJCQkJCX0KKwkJCQkJCX0gZWxzZQorCQkJCQkJCWJyZWFrOworCQkJCQl9CisKKwkJCQkJbGNkX2dvdG94eSgpOworCQkJCQlwcm9jZXNzZWQgPSAxOworCQkJCQlicmVhazsKKwkJCQl9CS8qIGVuZCBvZiBzd2l0Y2ggKi8KKworCQkJCS8qIENoZWNrIHdldGhlciBvbmUgZmxhZyB3YXMgY2hhbmdlZCAqLworCQkJCWlmIChvbGRmbGFncyAhPSBsY2RfZmxhZ3MpIHsKKwkJCQkJLyogY2hlY2sgd2V0aGVyIG9uZSBvZiBCLEMsRCBmbGFncyB3YXMgY2hhbmdlZCAqLworCQkJCQlpZiAoKG9sZGZsYWdzIF4gbGNkX2ZsYWdzKSAmCisJCQkJCSAgICAoTENEX0ZMQUdfQiB8IExDRF9GTEFHX0MgfCBMQ0RfRkxBR19EKSkKKwkJCQkJCS8qIHNldCBkaXNwbGF5IG1vZGUgKi8KKwkJCQkJCWxjZF93cml0ZV9jbWQoMHgwOCB8CisJCQkJCQkJICAgICAgKChsY2RfZmxhZ3MgJiBMQ0RfRkxBR19EKSA/IDQgOiAwKSB8CisJCQkJCQkJICAgICAgKChsY2RfZmxhZ3MgJiBMQ0RfRkxBR19DKSA/IDIgOiAwKSB8CisJCQkJCQkJICAgICAgKChsY2RfZmxhZ3MgJiBMQ0RfRkxBR19CKSA/IDEgOiAwKSk7CisJCQkJCS8qIGNoZWNrIHdldGhlciBvbmUgb2YgRixOIGZsYWdzIHdhcyBjaGFuZ2VkICovCisJCQkJCWVsc2UgaWYgKChvbGRmbGFncyBeIGxjZF9mbGFncykgJgorCQkJCQkJIChMQ0RfRkxBR19GIHwgTENEX0ZMQUdfTikpCisJCQkJCQlsY2Rfd3JpdGVfY21kKDB4MzAgfAorCQkJCQkJCSAgICAgICgobGNkX2ZsYWdzICYgTENEX0ZMQUdfRikgPyA0IDogMCkgfAorCQkJCQkJCSAgICAgICgobGNkX2ZsYWdzICYgTENEX0ZMQUdfTikgPyA4IDogMCkpOworCQkJCQkvKiBjaGVjayB3ZXRoZXIgTCBmbGFnIHdhcyBjaGFuZ2VkICovCisJCQkJCWVsc2UgaWYgKChvbGRmbGFncyBeIGxjZF9mbGFncykgJgorCQkJCQkJIChMQ0RfRkxBR19MKSkgeworCQkJCQkJaWYgKGxjZF9mbGFncyAmIChMQ0RfRkxBR19MKSkKKwkJCQkJCQlsY2RfYmFja2xpZ2h0KDEpOworCQkJCQkJZWxzZSBpZiAobGlnaHRfdGVtcG8gPT0gMCkJLyogc3dpdGNoIG9mZiB0aGUgbGlnaHQgb25seSB3aGVuIHRoZSB0ZW1wbyBsaWdodGluZyBpcyBnb25lICovCisJCQkJCQkJbGNkX2JhY2tsaWdodCgwKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKworCQkJLyogTENEIHNwZWNpYWwgZXNjYXBlIGNvZGVzICovCisJCQkvKiBmbHVzaCB0aGUgZXNjYXBlIHNlcXVlbmNlIGlmIGl0J3MgYmVlbiBwcm9jZXNzZWQgb3IgaWYgaXQgaXMKKwkJCSAgIGdldHRpbmcgdG9vIGxvbmcuICovCisJCQlpZiAocHJvY2Vzc2VkIHx8IChsY2RfZXNjYXBlX2xlbiA+PSBMQ0RfRVNDQVBFX0xFTikpCisJCQkJbGNkX2VzY2FwZV9sZW4gPSAtMTsKKwkJfQkJLyogZXNjYXBlIGNvZGVzICovCisJfQorCisJcmV0dXJuIHRtcCAtIGJ1ZjsKK30KKworc3RhdGljIGludCBsY2Rfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlpZiAobGNkX29wZW5fY250KQorCQlyZXR1cm4gLUVCVVNZOwkvKiBvcGVuIG9ubHkgb25jZSBhdCBhIHRpbWUgKi8KKworCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKQkvKiBkZXZpY2UgaXMgd3JpdGUtb25seSAqLworCQlyZXR1cm4gLUVQRVJNOworCisJaWYgKGxjZF9tdXN0X2NsZWFyKSB7CisJCWxjZF9jbGVhcl9kaXNwbGF5KCk7CisJCWxjZF9tdXN0X2NsZWFyID0gMDsKKwl9CisJbGNkX29wZW5fY250Kys7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbGNkX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJbGNkX29wZW5fY250LS07CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGxjZF9mb3BzID0geworCS53cml0ZSAgID0gbGNkX3dyaXRlLAorCS5vcGVuICAgID0gbGNkX29wZW4sCisJLnJlbGVhc2UgPSBsY2RfcmVsZWFzZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSBsY2RfZGV2ID0geworCUxDRF9NSU5PUiwKKwkibGNkIiwKKwkmbGNkX2ZvcHMKK307CisKKy8qIHB1YmxpYyBmdW5jdGlvbiB1c2FibGUgZnJvbSB0aGUga2VybmVsIGZvciBhbnkgcHVycG9zZSAqLwordm9pZCBwYW5lbF9sY2RfcHJpbnQoY2hhciAqcykKK3sKKwlpZiAobGNkX2VuYWJsZWQgJiYgbGNkX2luaXRpYWxpemVkKQorCQlsY2Rfd3JpdGUoTlVMTCwgcywgc3RybGVuKHMpLCBOVUxMKTsKK30KKworLyogaW5pdGlhbGl6ZSB0aGUgTENEIGRyaXZlciAqLwordm9pZCBsY2RfaW5pdCh2b2lkKQoreworCXN3aXRjaCAobGNkX3R5cGUpIHsKKwljYXNlIExDRF9UWVBFX09MRDoJLyogcGFyYWxsZWwgbW9kZSwgOCBiaXRzICovCisJCWlmIChsY2RfcHJvdG8gPCAwKQorCQkJbGNkX3Byb3RvID0gTENEX1BST1RPX1BBUkFMTEVMOworCQlpZiAobGNkX2NoYXJzZXQgPCAwKQorCQkJbGNkX2NoYXJzZXQgPSBMQ0RfQ0hBUlNFVF9OT1JNQUw7CisJCWlmIChsY2RfZV9waW4gPT0gUElOX05PVF9TRVQpCisJCQlsY2RfZV9waW4gPSBQSU5fU1RST0JFOworCQlpZiAobGNkX3JzX3BpbiA9PSBQSU5fTk9UX1NFVCkKKwkJCWxjZF9yc19waW4gPSBQSU5fQVVUT0xGOworCisJCWlmIChsY2Rfd2lkdGggPCAwKQorCQkJbGNkX3dpZHRoID0gNDA7CisJCWlmIChsY2RfYndpZHRoIDwgMCkKKwkJCWxjZF9id2lkdGggPSA0MDsKKwkJaWYgKGxjZF9od2lkdGggPCAwKQorCQkJbGNkX2h3aWR0aCA9IDY0OworCQlpZiAobGNkX2hlaWdodCA8IDApCisJCQlsY2RfaGVpZ2h0ID0gMjsKKwkJYnJlYWs7CisJY2FzZSBMQ0RfVFlQRV9LUzAwNzQ6CS8qIHNlcmlhbCBtb2RlLCBrczAwNzQgKi8KKwkJaWYgKGxjZF9wcm90byA8IDApCisJCQlsY2RfcHJvdG8gPSBMQ0RfUFJPVE9fU0VSSUFMOworCQlpZiAobGNkX2NoYXJzZXQgPCAwKQorCQkJbGNkX2NoYXJzZXQgPSBMQ0RfQ0hBUlNFVF9LUzAwNzQ7CisJCWlmIChsY2RfYmxfcGluID09IFBJTl9OT1RfU0VUKQorCQkJbGNkX2JsX3BpbiA9IFBJTl9BVVRPTEY7CisJCWlmIChsY2RfY2xfcGluID09IFBJTl9OT1RfU0VUKQorCQkJbGNkX2NsX3BpbiA9IFBJTl9TVFJPQkU7CisJCWlmIChsY2RfZGFfcGluID09IFBJTl9OT1RfU0VUKQorCQkJbGNkX2RhX3BpbiA9IFBJTl9EMDsKKworCQlpZiAobGNkX3dpZHRoIDwgMCkKKwkJCWxjZF93aWR0aCA9IDE2OworCQlpZiAobGNkX2J3aWR0aCA8IDApCisJCQlsY2RfYndpZHRoID0gNDA7CisJCWlmIChsY2RfaHdpZHRoIDwgMCkKKwkJCWxjZF9od2lkdGggPSAxNjsKKwkJaWYgKGxjZF9oZWlnaHQgPCAwKQorCQkJbGNkX2hlaWdodCA9IDI7CisJCWJyZWFrOworCWNhc2UgTENEX1RZUEVfTkVYQ09NOgkvKiBwYXJhbGxlbCBtb2RlLCA4IGJpdHMsIGdlbmVyaWMgKi8KKwkJaWYgKGxjZF9wcm90byA8IDApCisJCQlsY2RfcHJvdG8gPSBMQ0RfUFJPVE9fUEFSQUxMRUw7CisJCWlmIChsY2RfY2hhcnNldCA8IDApCisJCQlsY2RfY2hhcnNldCA9IExDRF9DSEFSU0VUX05PUk1BTDsKKwkJaWYgKGxjZF9lX3BpbiA9PSBQSU5fTk9UX1NFVCkKKwkJCWxjZF9lX3BpbiA9IFBJTl9BVVRPTEY7CisJCWlmIChsY2RfcnNfcGluID09IFBJTl9OT1RfU0VUKQorCQkJbGNkX3JzX3BpbiA9IFBJTl9TRUxFQ1A7CisJCWlmIChsY2RfcndfcGluID09IFBJTl9OT1RfU0VUKQorCQkJbGNkX3J3X3BpbiA9IFBJTl9JTklUUDsKKworCQlpZiAobGNkX3dpZHRoIDwgMCkKKwkJCWxjZF93aWR0aCA9IDE2OworCQlpZiAobGNkX2J3aWR0aCA8IDApCisJCQlsY2RfYndpZHRoID0gNDA7CisJCWlmIChsY2RfaHdpZHRoIDwgMCkKKwkJCWxjZF9od2lkdGggPSA2NDsKKwkJaWYgKGxjZF9oZWlnaHQgPCAwKQorCQkJbGNkX2hlaWdodCA9IDI7CisJCWJyZWFrOworCWNhc2UgTENEX1RZUEVfQ1VTVE9NOgkvKiBjdXN0b21lci1kZWZpbmVkICovCisJCWlmIChsY2RfcHJvdG8gPCAwKQorCQkJbGNkX3Byb3RvID0gREVGQVVMVF9MQ0RfUFJPVE87CisJCWlmIChsY2RfY2hhcnNldCA8IDApCisJCQlsY2RfY2hhcnNldCA9IERFRkFVTFRfTENEX0NIQVJTRVQ7CisJCS8qIGRlZmF1bHQgZ2VvbWV0cnkgd2lsbCBiZSBzZXQgbGF0ZXIgKi8KKwkJYnJlYWs7CisJY2FzZSBMQ0RfVFlQRV9IQU5UUk9OSVg6CS8qIHBhcmFsbGVsIG1vZGUsIDggYml0cywgaGFudHJvbml4LWxpa2UgKi8KKwlkZWZhdWx0OgorCQlpZiAobGNkX3Byb3RvIDwgMCkKKwkJCWxjZF9wcm90byA9IExDRF9QUk9UT19QQVJBTExFTDsKKwkJaWYgKGxjZF9jaGFyc2V0IDwgMCkKKwkJCWxjZF9jaGFyc2V0ID0gTENEX0NIQVJTRVRfTk9STUFMOworCQlpZiAobGNkX2VfcGluID09IFBJTl9OT1RfU0VUKQorCQkJbGNkX2VfcGluID0gUElOX1NUUk9CRTsKKwkJaWYgKGxjZF9yc19waW4gPT0gUElOX05PVF9TRVQpCisJCQlsY2RfcnNfcGluID0gUElOX1NFTEVDUDsKKworCQlpZiAobGNkX3dpZHRoIDwgMCkKKwkJCWxjZF93aWR0aCA9IDE2OworCQlpZiAobGNkX2J3aWR0aCA8IDApCisJCQlsY2RfYndpZHRoID0gNDA7CisJCWlmIChsY2RfaHdpZHRoIDwgMCkKKwkJCWxjZF9od2lkdGggPSA2NDsKKwkJaWYgKGxjZF9oZWlnaHQgPCAwKQorCQkJbGNkX2hlaWdodCA9IDI7CisJCWJyZWFrOworCX0KKworCS8qIHRoaXMgaXMgdXNlZCB0byBjYXRjaCB3cm9uZyBhbmQgZGVmYXVsdCB2YWx1ZXMgKi8KKwlpZiAobGNkX3dpZHRoIDw9IDApCisJCWxjZF93aWR0aCA9IERFRkFVTFRfTENEX1dJRFRIOworCWlmIChsY2RfYndpZHRoIDw9IDApCisJCWxjZF9id2lkdGggPSBERUZBVUxUX0xDRF9CV0lEVEg7CisJaWYgKGxjZF9od2lkdGggPD0gMCkKKwkJbGNkX2h3aWR0aCA9IERFRkFVTFRfTENEX0hXSURUSDsKKwlpZiAobGNkX2hlaWdodCA8PSAwKQorCQlsY2RfaGVpZ2h0ID0gREVGQVVMVF9MQ0RfSEVJR0hUOworCisJaWYgKGxjZF9wcm90byA9PSBMQ0RfUFJPVE9fU0VSSUFMKSB7CS8qIFNFUklBTCAqLworCQlsY2Rfd3JpdGVfY21kID0gbGNkX3dyaXRlX2NtZF9zOworCQlsY2Rfd3JpdGVfZGF0YSA9IGxjZF93cml0ZV9kYXRhX3M7CisJCWxjZF9jbGVhcl9mYXN0ID0gbGNkX2NsZWFyX2Zhc3RfczsKKworCQlpZiAobGNkX2NsX3BpbiA9PSBQSU5fTk9UX1NFVCkKKwkJCWxjZF9jbF9waW4gPSBERUZBVUxUX0xDRF9QSU5fU0NMOworCQlpZiAobGNkX2RhX3BpbiA9PSBQSU5fTk9UX1NFVCkKKwkJCWxjZF9kYV9waW4gPSBERUZBVUxUX0xDRF9QSU5fU0RBOworCisJfSBlbHNlIHsJCS8qIFBBUkFMTEVMICovCisJCWxjZF93cml0ZV9jbWQgPSBsY2Rfd3JpdGVfY21kX3A4OworCQlsY2Rfd3JpdGVfZGF0YSA9IGxjZF93cml0ZV9kYXRhX3A4OworCQlsY2RfY2xlYXJfZmFzdCA9IGxjZF9jbGVhcl9mYXN0X3A4OworCisJCWlmIChsY2RfZV9waW4gPT0gUElOX05PVF9TRVQpCisJCQlsY2RfZV9waW4gPSBERUZBVUxUX0xDRF9QSU5fRTsKKwkJaWYgKGxjZF9yc19waW4gPT0gUElOX05PVF9TRVQpCisJCQlsY2RfcnNfcGluID0gREVGQVVMVF9MQ0RfUElOX1JTOworCQlpZiAobGNkX3J3X3BpbiA9PSBQSU5fTk9UX1NFVCkKKwkJCWxjZF9yd19waW4gPSBERUZBVUxUX0xDRF9QSU5fUlc7CisJfQorCisJaWYgKGxjZF9ibF9waW4gPT0gUElOX05PVF9TRVQpCisJCWxjZF9ibF9waW4gPSBERUZBVUxUX0xDRF9QSU5fQkw7CisKKwlpZiAobGNkX2VfcGluID09IFBJTl9OT1RfU0VUKQorCQlsY2RfZV9waW4gPSBQSU5fTk9ORTsKKwlpZiAobGNkX3JzX3BpbiA9PSBQSU5fTk9UX1NFVCkKKwkJbGNkX3JzX3BpbiA9IFBJTl9OT05FOworCWlmIChsY2RfcndfcGluID09IFBJTl9OT1RfU0VUKQorCQlsY2RfcndfcGluID0gUElOX05PTkU7CisJaWYgKGxjZF9ibF9waW4gPT0gUElOX05PVF9TRVQpCisJCWxjZF9ibF9waW4gPSBQSU5fTk9ORTsKKwlpZiAobGNkX2NsX3BpbiA9PSBQSU5fTk9UX1NFVCkKKwkJbGNkX2NsX3BpbiA9IFBJTl9OT05FOworCWlmIChsY2RfZGFfcGluID09IFBJTl9OT1RfU0VUKQorCQlsY2RfZGFfcGluID0gUElOX05PTkU7CisKKwlpZiAobGNkX2NoYXJzZXQgPCAwKQorCQlsY2RfY2hhcnNldCA9IERFRkFVTFRfTENEX0NIQVJTRVQ7CisKKwlpZiAobGNkX2NoYXJzZXQgPT0gTENEX0NIQVJTRVRfS1MwMDc0KQorCQlsY2RfY2hhcl9jb252ID0gbGNkX2NoYXJfY29udl9rczAwNzQ7CisJZWxzZQorCQlsY2RfY2hhcl9jb252ID0gTlVMTDsKKworCWlmIChsY2RfYmxfcGluICE9IFBJTl9OT05FKQorCQlpbml0X3NjYW5fdGltZXIoKTsKKworCXBpbl90b19iaXRzKGxjZF9lX3BpbiwgbGNkX2JpdHNbTENEX1BPUlRfRF1bTENEX0JJVF9FXSwKKwkJICAgIGxjZF9iaXRzW0xDRF9QT1JUX0NdW0xDRF9CSVRfRV0pOworCXBpbl90b19iaXRzKGxjZF9yc19waW4sIGxjZF9iaXRzW0xDRF9QT1JUX0RdW0xDRF9CSVRfUlNdLAorCQkgICAgbGNkX2JpdHNbTENEX1BPUlRfQ11bTENEX0JJVF9SU10pOworCXBpbl90b19iaXRzKGxjZF9yd19waW4sIGxjZF9iaXRzW0xDRF9QT1JUX0RdW0xDRF9CSVRfUlddLAorCQkgICAgbGNkX2JpdHNbTENEX1BPUlRfQ11bTENEX0JJVF9SV10pOworCXBpbl90b19iaXRzKGxjZF9ibF9waW4sIGxjZF9iaXRzW0xDRF9QT1JUX0RdW0xDRF9CSVRfQkxdLAorCQkgICAgbGNkX2JpdHNbTENEX1BPUlRfQ11bTENEX0JJVF9CTF0pOworCXBpbl90b19iaXRzKGxjZF9jbF9waW4sIGxjZF9iaXRzW0xDRF9QT1JUX0RdW0xDRF9CSVRfQ0xdLAorCQkgICAgbGNkX2JpdHNbTENEX1BPUlRfQ11bTENEX0JJVF9DTF0pOworCXBpbl90b19iaXRzKGxjZF9kYV9waW4sIGxjZF9iaXRzW0xDRF9QT1JUX0RdW0xDRF9CSVRfREFdLAorCQkgICAgbGNkX2JpdHNbTENEX1BPUlRfQ11bTENEX0JJVF9EQV0pOworCisJLyogYmVmb3JlIHRoaXMgbGluZSwgd2UgbXVzdCBOT1Qgc2VuZCBhbnl0aGluZyB0byB0aGUgZGlzcGxheS4KKwkgKiBTaW5jZSBsY2RfaW5pdF9kaXNwbGF5KCkgbmVlZHMgdG8gd3JpdGUgZGF0YSwgd2UgaGF2ZSB0bworCSAqIGVuYWJsZSBtYXJrIHRoZSBMQ0QgaW5pdGlhbGl6ZWQganVzdCBiZWZvcmUuCisJICovCisJbGNkX2luaXRpYWxpemVkID0gMTsKKwlsY2RfaW5pdF9kaXNwbGF5KCk7CisKKwkvKiBkaXNwbGF5IGEgc2hvcnQgbWVzc2FnZSAqLworI2lmZGVmIENPTkZJR19QQU5FTF9DSEFOR0VfTUVTU0FHRQorI2lmZGVmIENPTkZJR19QQU5FTF9CT09UX01FU1NBR0UKKwlwYW5lbF9sY2RfcHJpbnQoIlx4MWJbTGNceDFiW0xiXHgxYltMKiIgQ09ORklHX1BBTkVMX0JPT1RfTUVTU0FHRSk7CisjZW5kaWYKKyNlbHNlCisJcGFuZWxfbGNkX3ByaW50KCJceDFiW0xjXHgxYltMYlx4MWJbTCpMaW51eC0iIFVUU19SRUxFQVNFICJcblBhbmVsLSIKKwkJCVBBTkVMX1ZFUlNJT04pOworI2VuZGlmCisJbGNkX2FkZHJfeCA9IGxjZF9hZGRyX3kgPSAwOworCWxjZF9tdXN0X2NsZWFyID0gMTsJLyogY2xlYXIgdGhlIGRpc3BsYXkgb24gdGhlIG5leHQgZGV2aWNlIG9wZW5pbmcgKi8KKwlsY2RfZ290b3h5KCk7Cit9CisKKy8qCisgKiBUaGVzZSBhcmUgdGhlIGZpbGUgb3BlcmF0aW9uIGZ1bmN0aW9uIGZvciB1c2VyIGFjY2VzcyB0byAvZGV2L2tleXBhZAorICovCisKK3N0YXRpYyBzc2l6ZV90IGtleXBhZF9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLAorCQkJICAgY2hhciAqYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKworCXVuc2lnbmVkIGkgPSAqcHBvczsKKwljaGFyICp0bXAgPSBidWY7CisKKwlpZiAoa2V5cGFkX2J1ZmxlbiA9PSAwKSB7CisJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykKKwkJCXJldHVybiAtRUFHQUlOOworCisJCWludGVycnVwdGlibGVfc2xlZXBfb24oJmtleXBhZF9yZWFkX3dhaXQpOworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCQlyZXR1cm4gLUVJTlRSOworCX0KKworCWZvciAoOyBjb3VudC0tID4gMCAmJiAoa2V5cGFkX2J1ZmxlbiA+IDApOyArK2ksICsrdG1wLCAtLWtleXBhZF9idWZsZW4pIHsKKwkJcHV0X3VzZXIoa2V5cGFkX2J1ZmZlcltrZXlwYWRfc3RhcnRdLCB0bXApOworCQlrZXlwYWRfc3RhcnQgPSAoa2V5cGFkX3N0YXJ0ICsgMSkgJSBLRVlQQURfQlVGRkVSOworCX0KKwkqcHBvcyA9IGk7CisKKwlyZXR1cm4gdG1wIC0gYnVmOworfQorCitzdGF0aWMgaW50IGtleXBhZF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCisJaWYgKGtleXBhZF9vcGVuX2NudCkKKwkJcmV0dXJuIC1FQlVTWTsJLyogb3BlbiBvbmx5IG9uY2UgYXQgYSB0aW1lICovCisKKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpCS8qIGRldmljZSBpcyByZWFkLW9ubHkgKi8KKwkJcmV0dXJuIC1FUEVSTTsKKworCWtleXBhZF9idWZsZW4gPSAwOwkvKiBmbHVzaCB0aGUgYnVmZmVyIG9uIG9wZW5pbmcgKi8KKwlrZXlwYWRfb3Blbl9jbnQrKzsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBrZXlwYWRfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlrZXlwYWRfb3Blbl9jbnQtLTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMga2V5cGFkX2ZvcHMgPSB7CisJLnJlYWQgICAgPSBrZXlwYWRfcmVhZCwJCS8qIHJlYWQgKi8KKwkub3BlbiAgICA9IGtleXBhZF9vcGVuLAkJLyogb3BlbiAqLworCS5yZWxlYXNlID0ga2V5cGFkX3JlbGVhc2UsCS8qIGNsb3NlICovCit9OworCitzdGF0aWMgc3RydWN0IG1pc2NkZXZpY2Uga2V5cGFkX2RldiA9IHsKKwlLRVlQQURfTUlOT1IsCisJImtleXBhZCIsCisJJmtleXBhZF9mb3BzCit9OworCitzdGF0aWMgdm9pZCBrZXlwYWRfc2VuZF9rZXkoY2hhciAqc3RyaW5nLCBpbnQgbWF4X2xlbikKK3sKKwlpZiAoaW5pdF9pbl9wcm9ncmVzcykKKwkJcmV0dXJuOworCisJLyogc2VuZCB0aGUga2V5IHRvIHRoZSBkZXZpY2Ugb25seSBpZiBhIHByb2Nlc3MgaXMgYXR0YWNoZWQgdG8gaXQuICovCisJaWYgKGtleXBhZF9vcGVuX2NudCA+IDApIHsKKwkJd2hpbGUgKG1heF9sZW4tLSAmJiBrZXlwYWRfYnVmbGVuIDwgS0VZUEFEX0JVRkZFUiAmJiAqc3RyaW5nKSB7CisJCQlrZXlwYWRfYnVmZmVyWyhrZXlwYWRfc3RhcnQgKyBrZXlwYWRfYnVmbGVuKyspICUKKwkJCQkgICAgICBLRVlQQURfQlVGRkVSXSA9ICpzdHJpbmcrKzsKKwkJfQorCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmtleXBhZF9yZWFkX3dhaXQpOworCX0KK30KKworLyogdGhpcyBmdW5jdGlvbiBzY2FucyBhbGwgdGhlIGJpdHMgaW52b2x2aW5nIGF0IGxlYXN0IG9uZSBsb2dpY2FsIHNpZ25hbCwgYW5kIHB1dHMgdGhlCisgKiByZXN1bHRzIGluIHRoZSBiaXRmaWVsZCAicGh5c19yZWFkIiAob25lIGJpdCBwZXIgZXN0YWJsaXNoZWQgY29udGFjdCksIGFuZCBzZXRzCisgKiAicGh5c19yZWFkX3ByZXYiIHRvICJwaHlzX3JlYWQiLgorICoKKyAqIE5vdGU6IHRvIGRlYm91bmNlIGlucHV0IHNpZ25hbHMsIHdlIHdpbGwgb25seSBjb25zaWRlciBhcyBzd2l0Y2hlZCBhIHNpZ25hbCB3aGljaCBpcworICogc3RhYmxlIGFjcm9zcyAyIG1lYXN1cmVzLiBTaWduYWxzIHdoaWNoIGFyZSBkaWZmZXJlbnQgYmV0d2VlbiB0d28gcmVhZHMgd2lsbCBiZSBrZXB0CisgKiBhcyB0aGV5IHByZXZpb3VzbHkgd2VyZSBpbiB0aGVpciBsb2dpY2FsIGZvcm0gKHBoeXNfcHJldikuIEEgc2lnbmFsIHdoaWNoIGhhcyBqdXN0CisgKiBzd2l0Y2hlZCB3aWxsIGhhdmUgYSAxIGluIChwaHlzX3JlYWQgXiBwaHlzX3JlYWRfcHJldikuCisgKi8KK3N0YXRpYyB2b2lkIHBoeXNfc2Nhbl9jb250YWN0cyh2b2lkKQoreworCWludCBiaXQsIGJpdHZhbDsKKwljaGFyIG9sZHZhbDsKKwljaGFyIGJpdG1hc2s7CisJY2hhciBnbmRtYXNrOworCisJcGh5c19wcmV2ID0gcGh5c19jdXJyOworCXBoeXNfcmVhZF9wcmV2ID0gcGh5c19yZWFkOworCXBoeXNfcmVhZCA9IDA7CQkvKiBmbHVzaCBhbGwgc2lnbmFscyAqLworCisJb2xkdmFsID0gcl9kdHIocHBydCkgfCBzY2FuX21hc2tfbzsJLyoga2VlcCB0cmFjayBvZiBvbGQgdmFsdWUsIHdpdGggYWxsIG91dHB1dHMgZGlzYWJsZWQgKi8KKwl3X2R0cihwcHJ0LCBvbGR2YWwgJiB+c2Nhbl9tYXNrX28pOwkvKiBhY3RpdmF0ZSBhbGwga2V5Ym9hcmQgb3V0cHV0cyAoYWN0aXZlIGxvdykgKi8KKwliaXRtYXNrID0gUE5MX1BJTlBVVChyX3N0cihwcHJ0KSkgJiBzY2FuX21hc2tfaTsJLyogd2lsbCBoYXZlIGEgMSBmb3IgZWFjaCBiaXQgc2V0IHRvIGduZCAqLworCXdfZHRyKHBwcnQsIG9sZHZhbCk7CS8qIGRpc2FibGUgYWxsIG1hdHJpeCBzaWduYWxzICovCisKKwkvKiBub3cgdGhhdCBhbGwgb3V0cHV0cyBhcmUgY2xlYXJlZCwgdGhlIG9ubHkgYWN0aXZlIGlucHV0IGJpdHMgYXJlCisJICogZGlyZWN0bHkgY29ubmVjdGVkIHRvIHRoZSBncm91bmQKKwkgKi8KKwlnbmRtYXNrID0gUE5MX1BJTlBVVChyX3N0cihwcHJ0KSkgJiBzY2FuX21hc2tfaTsJLyogMSBmb3IgZWFjaCBncm91bmRlZCBpbnB1dCAqLworCisJcGh5c19yZWFkIHw9IChwbWFza190KSBnbmRtYXNrIDw8IDQwOwkvKiBncm91bmRlZCBpbnB1dHMgYXJlIHNpZ25hbHMgNDAtNDQgKi8KKworCWlmIChiaXRtYXNrICE9IGduZG1hc2spIHsKKwkJLyogc2luY2UgY2xlYXJpbmcgdGhlIG91dHB1dHMgY2hhbmdlZCBzb21lIGlucHV0cywgd2Uga25vdyB0aGF0IHNvbWUKKwkJICogaW5wdXQgc2lnbmFscyBhcmUgY3VycmVudGx5IHRpZWQgdG8gc29tZSBvdXRwdXRzLiBTbyB3ZSdsbCBzY2FuIHRoZW0uCisJCSAqLworCQlmb3IgKGJpdCA9IDA7IGJpdCA8IDg7IGJpdCsrKSB7CisJCQliaXR2YWwgPSAxIDw8IGJpdDsKKworCQkJaWYgKCEoc2Nhbl9tYXNrX28gJiBiaXR2YWwpKQkvKiBza2lwIHVudXNlZCBiaXRzICovCisJCQkJY29udGludWU7CisKKwkJCXdfZHRyKHBwcnQsIG9sZHZhbCAmIH5iaXR2YWwpOwkvKiBlbmFibGUgdGhpcyBvdXRwdXQgKi8KKwkJCWJpdG1hc2sgPSBQTkxfUElOUFVUKHJfc3RyKHBwcnQpKSAmIH5nbmRtYXNrOworCQkJcGh5c19yZWFkIHw9IChwbWFza190KSBiaXRtYXNrIDw8ICg1ICogYml0KTsKKwkJfQorCQl3X2R0cihwcHJ0LCBvbGR2YWwpOwkvKiBkaXNhYmxlIGFsbCBvdXRwdXRzICovCisJfQorCS8qIHRoaXMgaXMgZWFzeTogdXNlIG9sZCBiaXRzIHdoZW4gdGhleSBhcmUgZmxhcHBpbmcsIHVzZSBuZXcgb25lcyB3aGVuIHN0YWJsZSAqLworCXBoeXNfY3VyciA9CisJICAgIChwaHlzX3ByZXYgJiAocGh5c19yZWFkIF4gcGh5c19yZWFkX3ByZXYpKSB8IChwaHlzX3JlYWQgJgorCQkJCQkJCSAgfihwaHlzX3JlYWQgXgorCQkJCQkJCSAgICBwaHlzX3JlYWRfcHJldikpOworfQorCitzdGF0aWMgdm9pZCBwYW5lbF9wcm9jZXNzX2lucHV0cyh2b2lkKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKml0ZW07CisJc3RydWN0IGxvZ2ljYWxfaW5wdXQgKmlucHV0OworCisjaWYgMAorCXByaW50ayhLRVJOX0RFQlVHCisJICAgICAgICJlbnRlcmluZyBwYW5lbF9wcm9jZXNzX2lucHV0cyB3aXRoIHBwPSUwMTZMeCAmIHBjPSUwMTZMeFxuIiwKKwkgICAgICAgcGh5c19wcmV2LCBwaHlzX2N1cnIpOworI2VuZGlmCisKKwlrZXlwcmVzc2VkID0gMDsKKwlpbnB1dHNfc3RhYmxlID0gMTsKKwlsaXN0X2Zvcl9lYWNoKGl0ZW0sICZsb2dpY2FsX2lucHV0cykgeworCQlpbnB1dCA9IGxpc3RfZW50cnkoaXRlbSwgc3RydWN0IGxvZ2ljYWxfaW5wdXQsIGxpc3QpOworCisJCXN3aXRjaCAoaW5wdXQtPnN0YXRlKSB7CisJCWNhc2UgSU5QVVRfU1RfTE9XOgorCQkJaWYgKChwaHlzX2N1cnIgJiBpbnB1dC0+bWFzaykgIT0gaW5wdXQtPnZhbHVlKQorCQkJCWJyZWFrOworCQkJLyogaWYgYWxsIG5lZWRlZCBvbmVzIHdlcmUgYWxyZWFkeSBzZXQgcHJldmlvdXNseSwgdGhpcyBtZWFucyB0aGF0CisJCQkgKiB0aGlzIGxvZ2ljYWwgc2lnbmFsIGhhcyBiZWVuIGFjdGl2YXRlZCBieSB0aGUgcmVsZWFzaW5nIG9mCisJCQkgKiBhbm90aGVyIGNvbWJpbmVkIHNpZ25hbCwgc28gd2UgZG9uJ3Qgd2FudCB0byBtYXRjaC4KKwkJCSAqIGVnOiBBQiAtKHJlbGVhc2UgQiktPiBBIC0ocmVsZWFzZSBBKS0+IDAgOiBkb24ndCBtYXRjaCBBLgorCQkJICovCisJCQlpZiAoKHBoeXNfcHJldiAmIGlucHV0LT5tYXNrKSA9PSBpbnB1dC0+dmFsdWUpCisJCQkJYnJlYWs7CisJCQlpbnB1dC0+cmlzZV90aW1lciA9IDA7CisJCQlpbnB1dC0+c3RhdGUgPSBJTlBVVF9TVF9SSVNJTkc7CisJCQkvKiBubyBicmVhayBoZXJlLCBmYWxsIHRocm91Z2ggKi8KKwkJY2FzZSBJTlBVVF9TVF9SSVNJTkc6CisJCQlpZiAoKHBoeXNfY3VyciAmIGlucHV0LT5tYXNrKSAhPSBpbnB1dC0+dmFsdWUpIHsKKwkJCQlpbnB1dC0+c3RhdGUgPSBJTlBVVF9TVF9MT1c7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoaW5wdXQtPnJpc2VfdGltZXIgPCBpbnB1dC0+cmlzZV90aW1lKSB7CisJCQkJaW5wdXRzX3N0YWJsZSA9IDA7CisJCQkJaW5wdXQtPnJpc2VfdGltZXIrKzsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlucHV0LT5oaWdoX3RpbWVyID0gMDsKKwkJCWlucHV0LT5zdGF0ZSA9IElOUFVUX1NUX0hJR0g7CisJCQkvKiBubyBicmVhayBoZXJlLCBmYWxsIHRocm91Z2ggKi8KKwkJY2FzZSBJTlBVVF9TVF9ISUdIOgorI2lmIDAKKwkJCS8qIEZJWE1FOgorCQkJICogdGhpcyBpcyBhbiBpbnZhbGlkIHRlc3QuIEl0IHRyaWVzIHRvIGNhdGNoIHRyYW5zaXRpb25zIGZyb20gc2luZ2xlLWtleQorCQkJICogdG8gbXVsdGlwbGUta2V5LCBidXQgZG9lc24ndCB0YWtlIGludG8gYWNjb3VudCB0aGUgY29udGFjdHMgcG9sYXJpdHkuCisJCQkgKiBUaGUgb25seSBzb2x1dGlvbiB0byB0aGUgcHJvYmxlbSBpcyB0byBwYXJzZSBrZXlzIGZyb20gdGhlIG1vc3QgY29tcGxleAorCQkJICogdG8gdGhlIHNpbXBsZXN0IGNvbWJpbmF0aW9ucywgYW5kIG1hcmsgdGhlbSBhcyAnY2F1Z2h0JyBvbmNlIGEgY29tYmluYXRpb24KKwkJCSAqIG1hdGNoZXMsIHRoZW4gdW5tYXRjaCBpdCBmb3IgYWxsIG90aGVyIG9uZXMuCisJCQkgKi8KKworCQkJLyogdHJ5IHRvIGNhdGNoIGRhbmdlcm91cyB0cmFuc2l0aW9ucyBjYXNlcyA6CisJCQkgKiBzb21lb25lIGFkZHMgYSBiaXQsIHNvIHRoaXMgc2lnbmFsIHdhcyBhIGZhbHNlCisJCQkgKiBwb3NpdGl2ZSByZXN1bHRpbmcgZnJvbSBhIHRyYW5zaXRpb24uIFdlIHNob3VsZCBpbnZhbGlkYXRlCisJCQkgKiB0aGUgc2lnbmFsIGltbWVkaWF0ZWx5IGFuZCBub3QgY2FsbCB0aGUgcmVsZWFzZSBmdW5jdGlvbi4KKwkJCSAqIGVnOiAwIC0ocHJlc3MgQSktPiBBIC0ocHJlc3MgQiktPiBBQiA6IGRvbid0IG1hdGNoIEEncyByZWxlYXNlLgorCQkJICovCisJCQlpZiAoKChwaHlzX3ByZXYgJiBpbnB1dC0+bWFzaykgPT0gaW5wdXQtPnZhbHVlKQorCQkJICAgICYmICgocGh5c19jdXJyICYgaW5wdXQtPm1hc2spID4gaW5wdXQtPnZhbHVlKSkgeworCQkJCWlucHV0LT5zdGF0ZSA9IElOUFVUX1NUX0xPVzsJLyogaW52YWxpZGF0ZSAqLworCQkJCWJyZWFrOworCQkJfQorI2VuZGlmCisKKwkJCWlmICgocGh5c19jdXJyICYgaW5wdXQtPm1hc2spID09IGlucHV0LT52YWx1ZSkgeworCQkJCWlmICgoaW5wdXQtPnR5cGUgPT0gSU5QVVRfVFlQRV9TVEQpCisJCQkJICAgICYmIChpbnB1dC0+aGlnaF90aW1lciA9PSAwKSkgeworCQkJCQlpbnB1dC0+aGlnaF90aW1lcisrOworCQkJCQlpZiAoaW5wdXQtPnUuc3RkLnByZXNzX2ZjdCAhPSBOVUxMKQorCQkJCQkJaW5wdXQtPnUuc3RkLnByZXNzX2ZjdChpbnB1dC0+dS4KKwkJCQkJCQkJICAgICAgIHN0ZC4KKwkJCQkJCQkJICAgICAgIHByZXNzX2RhdGEpOworCQkJCX0gZWxzZSBpZiAoaW5wdXQtPnR5cGUgPT0gSU5QVVRfVFlQRV9LQkQpIHsKKwkJCQkJa2V5cHJlc3NlZCA9IDE7CS8qIHdpbGwgdHVybiBvbiB0aGUgbGlnaHQgKi8KKworCQkJCQlpZiAoaW5wdXQtPmhpZ2hfdGltZXIgPT0gMCkgeworCQkJCQkJaWYgKGlucHV0LT51LmtiZC5wcmVzc19zdHJbMF0pCisJCQkJCQkJa2V5cGFkX3NlbmRfa2V5KGlucHV0LT4KKwkJCQkJCQkJCXUua2JkLgorCQkJCQkJCQkJcHJlc3Nfc3RyLAorCQkJCQkJCQkJc2l6ZW9mCisJCQkJCQkJCQkoaW5wdXQtPgorCQkJCQkJCQkJIHUua2JkLgorCQkJCQkJCQkJIHByZXNzX3N0cikpOworCQkJCQl9CisKKwkJCQkJaWYgKGlucHV0LT51LmtiZC5yZXBlYXRfc3RyWzBdKSB7CisJCQkJCQlpZiAoaW5wdXQtPmhpZ2hfdGltZXIgPj0KKwkJCQkJCSAgICBLRVlQQURfUkVQX1NUQVJUKSB7CisJCQkJCQkJaW5wdXQtPmhpZ2hfdGltZXIgLT0KKwkJCQkJCQkgICAgS0VZUEFEX1JFUF9ERUxBWTsKKwkJCQkJCQlrZXlwYWRfc2VuZF9rZXkoaW5wdXQtPgorCQkJCQkJCQkJdS5rYmQuCisJCQkJCQkJCQlyZXBlYXRfc3RyLAorCQkJCQkJCQkJc2l6ZW9mCisJCQkJCQkJCQkoaW5wdXQtPgorCQkJCQkJCQkJIHUua2JkLgorCQkJCQkJCQkJIHJlcGVhdF9zdHIpKTsKKwkJCQkJCX0KKwkJCQkJCWlucHV0c19zdGFibGUgPSAwOwkvKiB3ZSB3aWxsIG5lZWQgdG8gY29tZSBiYWNrIGhlcmUgc29vbiAqLworCQkJCQl9CisKKwkJCQkJaWYgKGlucHV0LT5oaWdoX3RpbWVyIDwgMjU1KQorCQkJCQkJaW5wdXQtPmhpZ2hfdGltZXIrKzsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9IGVsc2UgeworCQkJCS8qIGVsc2Ugc2lnbmFsIGZhbGxpbmcgZG93bi4gTGV0J3MgZmFsbCB0aHJvdWdoLiAqLworCQkJCWlucHV0LT5zdGF0ZSA9IElOUFVUX1NUX0ZBTExJTkc7CisJCQkJaW5wdXQtPmZhbGxfdGltZXIgPSAwOworCQkJfQorCQkJLyogbm8gYnJlYWsgaGVyZSwgZmFsbCB0aHJvdWdoICovCisJCWNhc2UgSU5QVVRfU1RfRkFMTElORzoKKyNpZiAwCisJCQkvKiBGSVhNRSAhISEgc2FtZSBjb21tZW50IGFzIGFib3ZlICovCisJCQlpZiAoKChwaHlzX3ByZXYgJiBpbnB1dC0+bWFzaykgPT0gaW5wdXQtPnZhbHVlKQorCQkJICAgICYmICgocGh5c19jdXJyICYgaW5wdXQtPm1hc2spID4gaW5wdXQtPnZhbHVlKSkgeworCQkJCWlucHV0LT5zdGF0ZSA9IElOUFVUX1NUX0xPVzsJLyogaW52YWxpZGF0ZSAqLworCQkJCWJyZWFrOworCQkJfQorI2VuZGlmCisKKwkJCWlmICgocGh5c19jdXJyICYgaW5wdXQtPm1hc2spID09IGlucHV0LT52YWx1ZSkgeworCQkJCWlmIChpbnB1dC0+dHlwZSA9PSBJTlBVVF9UWVBFX0tCRCkgeworCQkJCQlrZXlwcmVzc2VkID0gMTsJLyogd2lsbCB0dXJuIG9uIHRoZSBsaWdodCAqLworCisJCQkJCWlmIChpbnB1dC0+dS5rYmQucmVwZWF0X3N0clswXSkgeworCQkJCQkJaWYgKGlucHV0LT5oaWdoX3RpbWVyID49IEtFWVBBRF9SRVBfU1RBUlQpCisJCQkJCQkJaW5wdXQtPmhpZ2hfdGltZXIgLT0gS0VZUEFEX1JFUF9ERUxBWTsKKwkJCQkJCWtleXBhZF9zZW5kX2tleShpbnB1dC0+dS5rYmQucmVwZWF0X3N0ciwKKwkJCQkJCQkJc2l6ZW9mKGlucHV0LT51LmtiZC5yZXBlYXRfc3RyKSk7CisJCQkJCQlpbnB1dHNfc3RhYmxlID0gMDsJLyogd2Ugd2lsbCBuZWVkIHRvIGNvbWUgYmFjayBoZXJlIHNvb24gKi8KKwkJCQkJfQorCisJCQkJCWlmIChpbnB1dC0+aGlnaF90aW1lciA8IDI1NSkKKwkJCQkJCWlucHV0LT5oaWdoX3RpbWVyKys7CisJCQkJfQorCQkJCWlucHV0LT5zdGF0ZSA9IElOUFVUX1NUX0hJR0g7CisJCQkJYnJlYWs7CisJCQl9IGVsc2UgaWYgKGlucHV0LT5mYWxsX3RpbWVyID49IGlucHV0LT5mYWxsX3RpbWUpIHsKKwkJCQkvKiBjYWxsIHJlbGVhc2UgZXZlbnQgKi8KKwkJCQlpZiAoaW5wdXQtPnR5cGUgPT0gSU5QVVRfVFlQRV9TVEQpIHsKKwkJCQkJaWYgKGlucHV0LT51LnN0ZC5yZWxlYXNlX2ZjdCAhPSBOVUxMKQorCQkJCQkJaW5wdXQtPnUuc3RkLnJlbGVhc2VfZmN0KGlucHV0LT51LnN0ZC5yZWxlYXNlX2RhdGEpOworCisJCQkJfSBlbHNlIGlmIChpbnB1dC0+dHlwZSA9PSBJTlBVVF9UWVBFX0tCRCkgeworCQkJCQlpZiAoaW5wdXQtPnUua2JkLnJlbGVhc2Vfc3RyWzBdKQorCQkJCQkJa2V5cGFkX3NlbmRfa2V5KGlucHV0LT51LmtiZC5yZWxlYXNlX3N0ciwKKwkJCQkJCQkJc2l6ZW9mKGlucHV0LT51LmtiZC5yZWxlYXNlX3N0cikpOworCQkJCX0KKworCQkJCWlucHV0LT5zdGF0ZSA9IElOUFVUX1NUX0xPVzsKKwkJCQlicmVhazsKKwkJCX0gZWxzZSB7CisJCQkJaW5wdXQtPmZhbGxfdGltZXIrKzsKKwkJCQlpbnB1dHNfc3RhYmxlID0gMDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgcGFuZWxfc2Nhbl90aW1lcih2b2lkKQoreworCWlmIChrZXlwYWRfZW5hYmxlZCAmJiBrZXlwYWRfaW5pdGlhbGl6ZWQpIHsKKwkJaWYgKHNwaW5fdHJ5bG9jaygmcHBydF9sb2NrKSkgeworCQkJcGh5c19zY2FuX2NvbnRhY3RzKCk7CisJCQlzcGluX3VubG9jaygmcHBydF9sb2NrKTsJLyogbm8gbmVlZCBmb3IgdGhlIHBhcnBvcnQgYW55bW9yZSAqLworCQl9CisKKwkJaWYgKCFpbnB1dHNfc3RhYmxlIHx8IHBoeXNfY3VyciAhPSBwaHlzX3ByZXYpCisJCQlwYW5lbF9wcm9jZXNzX2lucHV0cygpOworCX0KKworCWlmIChsY2RfZW5hYmxlZCAmJiBsY2RfaW5pdGlhbGl6ZWQpIHsKKwkJaWYgKGtleXByZXNzZWQpIHsKKwkJCWlmIChsaWdodF90ZW1wbyA9PSAwICYmICgobGNkX2ZsYWdzICYgTENEX0ZMQUdfTCkgPT0gMCkpCisJCQkJbGNkX2JhY2tsaWdodCgxKTsKKwkJCWxpZ2h0X3RlbXBvID0gRkxBU0hfTElHSFRfVEVNUE87CisJCX0gZWxzZSBpZiAobGlnaHRfdGVtcG8gPiAwKSB7CisJCQlsaWdodF90ZW1wby0tOworCQkJaWYgKGxpZ2h0X3RlbXBvID09IDAgJiYgKChsY2RfZmxhZ3MgJiBMQ0RfRkxBR19MKSA9PSAwKSkKKwkJCQlsY2RfYmFja2xpZ2h0KDApOworCQl9CisJfQorCisJbW9kX3RpbWVyKCZzY2FuX3RpbWVyLCBqaWZmaWVzICsgSU5QVVRfUE9MTF9USU1FKTsKK30KKworc3RhdGljIHZvaWQgaW5pdF9zY2FuX3RpbWVyKHZvaWQpCit7CisJaWYgKHNjYW5fdGltZXIuZnVuY3Rpb24gIT0gTlVMTCkKKwkJcmV0dXJuOwkJLyogYWxyZWFkeSBzdGFydGVkICovCisKKwlpbml0X3RpbWVyKCZzY2FuX3RpbWVyKTsKKwlzY2FuX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgSU5QVVRfUE9MTF9USU1FOworCXNjYW5fdGltZXIuZGF0YSA9IDA7CisJc2Nhbl90aW1lci5mdW5jdGlvbiA9ICh2b2lkICopJnBhbmVsX3NjYW5fdGltZXI7CisJYWRkX3RpbWVyKCZzY2FuX3RpbWVyKTsKK30KKworLyogY29udmVydHMgYSBuYW1lIG9mIHRoZSBmb3JtICIoe0JiQWFQcFNzRWV9ezAxMjM0NTY3LX0pKiIgdG8gYSBzZXJpZXMgb2YgYml0cy4KKyAqIGlmIDxvbWFzaz4gb3IgPGltYXNrPiBhcmUgbm9uLW51bGwsIHRoZXkgd2lsbCBiZSBvcidlZCB3aXRoIHRoZSBiaXRzIGNvcnJlc3BvbmRpbmcKKyAqIHRvIG91dCBhbmQgaW4gYml0cyByZXNwZWN0aXZlbHkuCisgKiByZXR1cm5zIDEgaWYgb2ssIDAgaWYgZXJyb3IgKGluIHdoaWNoIGNhc2UsIG5vdGhpbmcgaXMgd3JpdHRlbikuCisgKi8KK3N0YXRpYyBpbnQgaW5wdXRfbmFtZTJtYXNrKGNoYXIgKm5hbWUsIHBtYXNrX3QgKm1hc2ssIHBtYXNrX3QgKnZhbHVlLAorCQkJICAgY2hhciAqaW1hc2ssIGNoYXIgKm9tYXNrKQoreworCXN0YXRpYyBjaGFyIHNpZ3RhYlsxMF0gPSAiRWVTc1BwQWFCYiI7CisJY2hhciBpbSwgb207CisJcG1hc2tfdCBtLCB2OworCisJb20gPSBpbSA9IG0gPSB2ID0gMFVMTDsKKwl3aGlsZSAoKm5hbWUpIHsKKwkJaW50IGluLCBvdXQsIGJpdCwgbmVnOworCQlmb3IgKGluID0gMDsgKGluIDwgc2l6ZW9mKHNpZ3RhYikpICYmIChzaWd0YWJbaW5dICE9ICpuYW1lKTsgaW4rKykKKwkJCTsKKwkJaWYgKGluID49IHNpemVvZihzaWd0YWIpKQorCQkJcmV0dXJuIDA7CS8qIGlucHV0IG5hbWUgbm90IGZvdW5kICovCisJCW5lZyA9IChpbiAmIDEpOwkvKiBvZGQgKGxvd2VyKSBuYW1lcyBhcmUgbmVnYXRlZCAqLworCQlpbiA+Pj0gMTsKKwkJaW0gfD0gKDEgPDwgaW4pOworCisJCW5hbWUrKzsKKwkJaWYgKGlzZGlnaXQoKm5hbWUpKSB7CisJCQlvdXQgPSAqbmFtZSAtICcwJzsKKwkJCW9tIHw9ICgxIDw8IG91dCk7CisJCX0gZWxzZSBpZiAoKm5hbWUgPT0gJy0nKQorCQkJb3V0ID0gODsKKwkJZWxzZQorCQkJcmV0dXJuIDA7CS8qIHVua25vd24gYml0IG5hbWUgKi8KKworCQliaXQgPSAob3V0ICogNSkgKyBpbjsKKworCQltIHw9IDFVTEwgPDwgYml0OworCQlpZiAoIW5lZykKKwkJCXYgfD0gMVVMTCA8PCBiaXQ7CisJCW5hbWUrKzsKKwl9CisJKm1hc2sgPSBtOworCSp2YWx1ZSA9IHY7CisJaWYgKGltYXNrKQorCQkqaW1hc2sgfD0gaW07CisJaWYgKG9tYXNrKQorCQkqb21hc2sgfD0gb207CisJcmV0dXJuIDE7Cit9CisKKy8qIHRyaWVzIHRvIGJpbmQgYSBrZXkgdG8gdGhlIHNpZ25hbCBuYW1lIDxuYW1lPi4gVGhlIGtleSB3aWxsIHNlbmQgdGhlCisgKiBzdHJpbmdzIDxwcmVzcz4sIDxyZXBlYXQ+LCA8cmVsZWFzZT4gZm9yIHRoZXNlIHJlc3BlY3RpdmUgZXZlbnRzLgorICogUmV0dXJucyB0aGUgcG9pbnRlciB0byB0aGUgbmV3IGtleSBpZiBvaywgTlVMTCBpZiB0aGUga2V5IGNvdWxkIG5vdCBiZSBib3VuZC4KKyAqLworc3RhdGljIHN0cnVjdCBsb2dpY2FsX2lucHV0ICpwYW5lbF9iaW5kX2tleShjaGFyICpuYW1lLCBjaGFyICpwcmVzcywKKwkJCQkJICAgIGNoYXIgKnJlcGVhdCwgY2hhciAqcmVsZWFzZSkKK3sKKwlzdHJ1Y3QgbG9naWNhbF9pbnB1dCAqa2V5OworCisJa2V5ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGxvZ2ljYWxfaW5wdXQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWtleSkgeworCQlwcmludGsoS0VSTl9FUlIgInBhbmVsOiBub3QgZW5vdWdoIG1lbW9yeVxuIik7CisJCXJldHVybiBOVUxMOworCX0KKwltZW1zZXQoa2V5LCAwLCBzaXplb2Yoc3RydWN0IGxvZ2ljYWxfaW5wdXQpKTsKKwlpZiAoIWlucHV0X25hbWUybWFzayhuYW1lLCAma2V5LT5tYXNrLCAma2V5LT52YWx1ZSwgJnNjYW5fbWFza19pLAorCQkJICAgICAmc2Nhbl9tYXNrX28pKQorCQlyZXR1cm4gTlVMTDsKKworCWtleS0+dHlwZSA9IElOUFVUX1RZUEVfS0JEOworCWtleS0+c3RhdGUgPSBJTlBVVF9TVF9MT1c7CisJa2V5LT5yaXNlX3RpbWUgPSAxOworCWtleS0+ZmFsbF90aW1lID0gMTsKKworI2lmIDAKKwlwcmludGsoS0VSTl9ERUJVRyAiYmluZDogPCVzPiA6IG09JTAxNkx4IHY9JTAxNkx4XG4iLCBuYW1lLCBrZXktPm1hc2ssCisJICAgICAgIGtleS0+dmFsdWUpOworI2VuZGlmCisJc3RybmNweShrZXktPnUua2JkLnByZXNzX3N0ciwgcHJlc3MsIHNpemVvZihrZXktPnUua2JkLnByZXNzX3N0cikpOworCXN0cm5jcHkoa2V5LT51LmtiZC5yZXBlYXRfc3RyLCByZXBlYXQsIHNpemVvZihrZXktPnUua2JkLnJlcGVhdF9zdHIpKTsKKwlzdHJuY3B5KGtleS0+dS5rYmQucmVsZWFzZV9zdHIsIHJlbGVhc2UsCisJCXNpemVvZihrZXktPnUua2JkLnJlbGVhc2Vfc3RyKSk7CisJbGlzdF9hZGQoJmtleS0+bGlzdCwgJmxvZ2ljYWxfaW5wdXRzKTsKKwlyZXR1cm4ga2V5OworfQorCisjaWYgMAorLyogdHJpZXMgdG8gYmluZCBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIHRoZSBzaWduYWwgbmFtZSA8bmFtZT4uIFRoZSBmdW5jdGlvbgorICogPHByZXNzX2ZjdD4gd2lsbCBiZSBjYWxsZWQgd2l0aCB0aGUgPHByZXNzX2RhdGE+IGFyZyB3aGVuIHRoZSBzaWduYWwgaXMKKyAqIGFjdGl2YXRlZCwgYW5kIHNvIG9uIGZvciA8cmVsZWFzZV9mY3Q+LzxyZWxlYXNlX2RhdGE+CisgKiBSZXR1cm5zIHRoZSBwb2ludGVyIHRvIHRoZSBuZXcgc2lnbmFsIGlmIG9rLCBOVUxMIGlmIHRoZSBzaWduYWwgY291bGQgbm90IGJlIGJvdW5kLgorICovCitzdGF0aWMgc3RydWN0IGxvZ2ljYWxfaW5wdXQgKnBhbmVsX2JpbmRfY2FsbGJhY2soY2hhciAqbmFtZSwKKwkJCQkJCSB2b2lkICgqcHJlc3NfZmN0KSAoaW50KSwKKwkJCQkJCSBpbnQgcHJlc3NfZGF0YSwKKwkJCQkJCSB2b2lkICgqcmVsZWFzZV9mY3QpIChpbnQpLAorCQkJCQkJIGludCByZWxlYXNlX2RhdGEpCit7CisJc3RydWN0IGxvZ2ljYWxfaW5wdXQgKmNhbGxiYWNrOworCisJY2FsbGJhY2sgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbG9naWNhbF9pbnB1dCksIEdGUF9LRVJORUwpOworCWlmICghY2FsbGJhY2spIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJwYW5lbDogbm90IGVub3VnaCBtZW1vcnlcbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJbWVtc2V0KGNhbGxiYWNrLCAwLCBzaXplb2Yoc3RydWN0IGxvZ2ljYWxfaW5wdXQpKTsKKwlpZiAoIWlucHV0X25hbWUybWFzayhuYW1lLCAmY2FsbGJhY2stPm1hc2ssICZjYWxsYmFjay0+dmFsdWUsCisJCQkgICAgICZzY2FuX21hc2tfaSwgJnNjYW5fbWFza19vKSkKKwkJcmV0dXJuIE5VTEw7CisKKwljYWxsYmFjay0+dHlwZSA9IElOUFVUX1RZUEVfU1REOworCWNhbGxiYWNrLT5zdGF0ZSA9IElOUFVUX1NUX0xPVzsKKwljYWxsYmFjay0+cmlzZV90aW1lID0gMTsKKwljYWxsYmFjay0+ZmFsbF90aW1lID0gMTsKKwljYWxsYmFjay0+dS5zdGQucHJlc3NfZmN0ID0gcHJlc3NfZmN0OworCWNhbGxiYWNrLT51LnN0ZC5wcmVzc19kYXRhID0gcHJlc3NfZGF0YTsKKwljYWxsYmFjay0+dS5zdGQucmVsZWFzZV9mY3QgPSByZWxlYXNlX2ZjdDsKKwljYWxsYmFjay0+dS5zdGQucmVsZWFzZV9kYXRhID0gcmVsZWFzZV9kYXRhOworCWxpc3RfYWRkKCZjYWxsYmFjay0+bGlzdCwgJmxvZ2ljYWxfaW5wdXRzKTsKKwlyZXR1cm4gY2FsbGJhY2s7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQga2V5cGFkX2luaXQodm9pZCkKK3sKKwlpbnQga2V5bnVtOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmtleXBhZF9yZWFkX3dhaXQpOworCWtleXBhZF9idWZsZW4gPSAwOwkvKiBmbHVzaGVzIGFueSBldmVudHVhbCBub2lzeSBrZXlzdHJva2UgKi8KKworCS8qIExldCdzIGNyZWF0ZSBhbGwga25vd24ga2V5cyAqLworCisJZm9yIChrZXludW0gPSAwOyBrZXlwYWRfcHJvZmlsZVtrZXludW1dWzBdWzBdOyBrZXludW0rKykgeworCQlwYW5lbF9iaW5kX2tleShrZXlwYWRfcHJvZmlsZVtrZXludW1dWzBdLAorCQkJICAgICAgIGtleXBhZF9wcm9maWxlW2tleW51bV1bMV0sCisJCQkgICAgICAga2V5cGFkX3Byb2ZpbGVba2V5bnVtXVsyXSwKKwkJCSAgICAgICBrZXlwYWRfcHJvZmlsZVtrZXludW1dWzNdKTsKKwl9CisKKwlpbml0X3NjYW5fdGltZXIoKTsKKwlrZXlwYWRfaW5pdGlhbGl6ZWQgPSAxOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBkZXZpY2UgaW5pdGlhbGl6YXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQgcGFuZWxfbm90aWZ5X3N5cyhzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnRoaXMsIHVuc2lnbmVkIGxvbmcgY29kZSwKKwkJCSAgICB2b2lkICp1bnVzZWQpCit7CisJaWYgKGxjZF9lbmFibGVkICYmIGxjZF9pbml0aWFsaXplZCkgeworCQlzd2l0Y2ggKGNvZGUpIHsKKwkJY2FzZSBTWVNfRE9XTjoKKwkJCXBhbmVsX2xjZF9wcmludAorCQkJICAgICgiXHgwY1JlbG9hZGluZ1xuU3lzdGVtLi4uXHgxYltMY1x4MWJbTGJceDFiW0wrIik7CisJCQlicmVhazsKKwkJY2FzZSBTWVNfSEFMVDoKKwkJCXBhbmVsX2xjZF9wcmludAorCQkJICAgICgiXHgwY1N5c3RlbSBIYWx0ZWQuXHgxYltMY1x4MWJbTGJceDFiW0wrIik7CisJCQlicmVhazsKKwkJY2FzZSBTWVNfUE9XRVJfT0ZGOgorCQkJcGFuZWxfbGNkX3ByaW50KCJceDBjUG93ZXIgb2ZmLlx4MWJbTGNceDFiW0xiXHgxYltMKyIpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gTk9USUZZX0RPTkU7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgcGFuZWxfbm90aWZpZXIgPSB7CisJcGFuZWxfbm90aWZ5X3N5cywKKwlOVUxMLAorCTAKK307CisKK3N0YXRpYyB2b2lkIHBhbmVsX2F0dGFjaChzdHJ1Y3QgcGFycG9ydCAqcG9ydCkKK3sKKwlpZiAocG9ydC0+bnVtYmVyICE9IHBhcnBvcnQpCisJCXJldHVybjsKKworCWlmIChwcHJ0KSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkgICAgICAgInBhbmVsX2F0dGFjaCgpOiBwb3J0LT5udW1iZXI9JWQgcGFycG9ydD0lZCwgYWxyZWFkeSByZWdpc3RlcmVkICFcbiIsCisJCSAgICAgICBwb3J0LT5udW1iZXIsIHBhcnBvcnQpOworCQlyZXR1cm47CisJfQorCisJcHBydCA9IHBhcnBvcnRfcmVnaXN0ZXJfZGV2aWNlKHBvcnQsICJwYW5lbCIsIE5VTEwsIE5VTEwsCS8qIHBmLCBrZiAqLworCQkJCSAgICAgICBOVUxMLAorCQkJCSAgICAgICAvKlBBUlBPUlRfREVWX0VYQ0wgKi8KKwkJCQkgICAgICAgMCwgKHZvaWQgKikmcHBydCk7CisKKwlpZiAocGFycG9ydF9jbGFpbShwcHJ0KSkgeworCQlwcmludGsoS0VSTl9FUlIKKwkJICAgICAgICJQYW5lbDogY291bGQgbm90IGNsYWltIGFjY2VzcyB0byBwYXJwb3J0JWQuIEFib3J0aW5nLlxuIiwKKwkJICAgICAgIHBhcnBvcnQpOworCQlyZXR1cm47CisJfQorCisJLyogbXVzdCBpbml0IExDRCBmaXJzdCwganVzdCBpbiBjYXNlIGFuIElSUSBmcm9tIHRoZSBrZXlwYWQgaXMgZ2VuZXJhdGVkIGF0IGtleXBhZCBpbml0ICovCisJaWYgKGxjZF9lbmFibGVkKSB7CisJCWxjZF9pbml0KCk7CisJCW1pc2NfcmVnaXN0ZXIoJmxjZF9kZXYpOworCX0KKworCWlmIChrZXlwYWRfZW5hYmxlZCkgeworCQlrZXlwYWRfaW5pdCgpOworCQltaXNjX3JlZ2lzdGVyKCZrZXlwYWRfZGV2KTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHBhbmVsX2RldGFjaChzdHJ1Y3QgcGFycG9ydCAqcG9ydCkKK3sKKwlpZiAocG9ydC0+bnVtYmVyICE9IHBhcnBvcnQpCisJCXJldHVybjsKKworCWlmICghcHBydCkgeworCQlwcmludGsoS0VSTl9FUlIKKwkJICAgICAgICJwYW5lbF9kZXRhY2goKTogcG9ydC0+bnVtYmVyPSVkIHBhcnBvcnQ9JWQsIG5vdGhpbmcgdG8gdW5yZWdpc3Rlci5cbiIsCisJCSAgICAgICBwb3J0LT5udW1iZXIsIHBhcnBvcnQpOworCQlyZXR1cm47CisJfQorCisJaWYgKGtleXBhZF9lbmFibGVkICYmIGtleXBhZF9pbml0aWFsaXplZCkKKwkJbWlzY19kZXJlZ2lzdGVyKCZrZXlwYWRfZGV2KTsKKworCWlmIChsY2RfZW5hYmxlZCAmJiBsY2RfaW5pdGlhbGl6ZWQpCisJCW1pc2NfZGVyZWdpc3RlcigmbGNkX2Rldik7CisKKwlwYXJwb3J0X3JlbGVhc2UocHBydCk7CisJcGFycG9ydF91bnJlZ2lzdGVyX2RldmljZShwcHJ0KTsKKwlwcHJ0ID0gTlVMTDsKK30KKworc3RhdGljIHN0cnVjdCBwYXJwb3J0X2RyaXZlciBwYW5lbF9kcml2ZXIgPSB7CisJLm5hbWUgPSAicGFuZWwiLAorCS5hdHRhY2ggPSBwYW5lbF9hdHRhY2gsCisJLmRldGFjaCA9IHBhbmVsX2RldGFjaCwKK307CisKKy8qIGluaXQgZnVuY3Rpb24gKi8KK2ludCBwYW5lbF9pbml0KHZvaWQpCit7CisJLyogZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5ICovCisJaWYgKGtleXBhZF90eXBlIDwgMCkKKwkJa2V5cGFkX3R5cGUgPSBrZXlwYWRfZW5hYmxlZDsKKworCWlmIChsY2RfdHlwZSA8IDApCisJCWxjZF90eXBlID0gbGNkX2VuYWJsZWQ7CisKKwlpZiAocGFycG9ydCA8IDApCisJCXBhcnBvcnQgPSBERUZBVUxUX1BBUlBPUlQ7CisKKwkvKiB0YWtlIGNhcmUgb2YgYW4gZXZlbnR1YWwgcHJvZmlsZSAqLworCXN3aXRjaCAocHJvZmlsZSkgeworCWNhc2UgUEFORUxfUFJPRklMRV9DVVNUT006CS8qIGN1c3RvbSBwcm9maWxlICovCisJCWlmIChrZXlwYWRfdHlwZSA8IDApCisJCQlrZXlwYWRfdHlwZSA9IERFRkFVTFRfS0VZUEFEOworCQlpZiAobGNkX3R5cGUgPCAwKQorCQkJbGNkX3R5cGUgPSBERUZBVUxUX0xDRDsKKwkJYnJlYWs7CisJY2FzZSBQQU5FTF9QUk9GSUxFX09MRDoJLyogOCBiaXRzLCAyKjE2LCBvbGQga2V5cGFkICovCisJCWlmIChrZXlwYWRfdHlwZSA8IDApCisJCQlrZXlwYWRfdHlwZSA9IEtFWVBBRF9UWVBFX09MRDsKKwkJaWYgKGxjZF90eXBlIDwgMCkKKwkJCWxjZF90eXBlID0gTENEX1RZUEVfT0xEOworCQlpZiAobGNkX3dpZHRoIDwgMCkKKwkJCWxjZF93aWR0aCA9IDE2OworCQlpZiAobGNkX2h3aWR0aCA8IDApCisJCQlsY2RfaHdpZHRoID0gMTY7CisJCWJyZWFrOworCWNhc2UgUEFORUxfUFJPRklMRV9ORVc6CS8qIHNlcmlhbCwgMioxNiwgbmV3IGtleXBhZCAqLworCQlpZiAoa2V5cGFkX3R5cGUgPCAwKQorCQkJa2V5cGFkX3R5cGUgPSBLRVlQQURfVFlQRV9ORVc7CisJCWlmIChsY2RfdHlwZSA8IDApCisJCQlsY2RfdHlwZSA9IExDRF9UWVBFX0tTMDA3NDsKKwkJYnJlYWs7CisJY2FzZSBQQU5FTF9QUk9GSUxFX0hBTlRST05JWDoJLyogOCBiaXRzLCAyKjE2IGhhbnRyb25peC1saWtlLCBubyBrZXlwYWQgKi8KKwkJaWYgKGtleXBhZF90eXBlIDwgMCkKKwkJCWtleXBhZF90eXBlID0gS0VZUEFEX1RZUEVfTk9ORTsKKwkJaWYgKGxjZF90eXBlIDwgMCkKKwkJCWxjZF90eXBlID0gTENEX1RZUEVfSEFOVFJPTklYOworCQlicmVhazsKKwljYXNlIFBBTkVMX1BST0ZJTEVfTkVYQ09NOgkvKiBnZW5lcmljIDggYml0cywgMioxNiwgbmV4Y29tIGtleXBhZCwgZWcuIE5leGNvbS4gKi8KKwkJaWYgKGtleXBhZF90eXBlIDwgMCkKKwkJCWtleXBhZF90eXBlID0gS0VZUEFEX1RZUEVfTkVYQ09NOworCQlpZiAobGNkX3R5cGUgPCAwKQorCQkJbGNkX3R5cGUgPSBMQ0RfVFlQRV9ORVhDT007CisJCWJyZWFrOworCWNhc2UgUEFORUxfUFJPRklMRV9MQVJHRToJLyogOCBiaXRzLCAyKjQwLCBvbGQga2V5cGFkICovCisJCWlmIChrZXlwYWRfdHlwZSA8IDApCisJCQlrZXlwYWRfdHlwZSA9IEtFWVBBRF9UWVBFX09MRDsKKwkJaWYgKGxjZF90eXBlIDwgMCkKKwkJCWxjZF90eXBlID0gTENEX1RZUEVfT0xEOworCQlicmVhazsKKwl9CisKKwlsY2RfZW5hYmxlZCA9IChsY2RfdHlwZSA+IDApOworCWtleXBhZF9lbmFibGVkID0gKGtleXBhZF90eXBlID4gMCk7CisKKwlzd2l0Y2ggKGtleXBhZF90eXBlKSB7CisJY2FzZSBLRVlQQURfVFlQRV9PTEQ6CisJCWtleXBhZF9wcm9maWxlID0gb2xkX2tleXBhZF9wcm9maWxlOworCQlicmVhazsKKwljYXNlIEtFWVBBRF9UWVBFX05FVzoKKwkJa2V5cGFkX3Byb2ZpbGUgPSBuZXdfa2V5cGFkX3Byb2ZpbGU7CisJCWJyZWFrOworCWNhc2UgS0VZUEFEX1RZUEVfTkVYQ09NOgorCQlrZXlwYWRfcHJvZmlsZSA9IG5leGNvbV9rZXlwYWRfcHJvZmlsZTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJa2V5cGFkX3Byb2ZpbGUgPSBOVUxMOworCQlicmVhazsKKwl9CisKKwkvKiB0ZWxscyB2YXJpb3VzIHN1YnN5c3RlbXMgYWJvdXQgdGhlIGZhY3QgdGhhdCB3ZSBhcmUgaW5pdGlhbGl6aW5nICovCisJaW5pdF9pbl9wcm9ncmVzcyA9IDE7CisKKwlpZiAocGFycG9ydF9yZWdpc3Rlcl9kcml2ZXIoJnBhbmVsX2RyaXZlcikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCSAgICAgICAiUGFuZWw6IGNvdWxkIG5vdCByZWdpc3RlciB3aXRoIHBhcnBvcnQuIEFib3J0aW5nLlxuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCWlmICghbGNkX2VuYWJsZWQgJiYgIWtleXBhZF9lbmFibGVkKSB7CisJCS8qIG5vIGRldmljZSBlbmFibGVkLCBsZXQncyByZWxlYXNlIHRoZSBwYXJwb3J0ICovCisJCWlmIChwcHJ0KSB7CisJCQlwYXJwb3J0X3JlbGVhc2UocHBydCk7CisJCQlwYXJwb3J0X3VucmVnaXN0ZXJfZGV2aWNlKHBwcnQpOworCQl9CisJCXBhcnBvcnRfdW5yZWdpc3Rlcl9kcml2ZXIoJnBhbmVsX2RyaXZlcik7CisJCXByaW50ayhLRVJOX0VSUiAiUGFuZWwgZHJpdmVyIHZlcnNpb24gIiBQQU5FTF9WRVJTSU9OCisJCSAgICAgICAiIGRpc2FibGVkLlxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigmcGFuZWxfbm90aWZpZXIpOworCisJaWYgKHBwcnQpCisJCXByaW50ayhLRVJOX0lORk8gIlBhbmVsIGRyaXZlciB2ZXJzaW9uICIgUEFORUxfVkVSU0lPTgorCQkgICAgICAgIiByZWdpc3RlcmVkIG9uIHBhcnBvcnQlZCAoaW89MHglbHgpLlxuIiwgcGFycG9ydCwKKwkJICAgICAgIHBwcnQtPnBvcnQtPmJhc2UpOworCWVsc2UKKwkJcHJpbnRrKEtFUk5fSU5GTyAiUGFuZWwgZHJpdmVyIHZlcnNpb24gIiBQQU5FTF9WRVJTSU9OCisJCSAgICAgICAiIG5vdCB5ZXQgcmVnaXN0ZXJlZFxuIik7CisJLyogdGVsbHMgdmFyaW91cyBzdWJzeXN0ZW1zIGFib3V0IHRoZSBmYWN0IHRoYXQgaW5pdGlhbGl6YXRpb24gaXMgZmluaXNoZWQgKi8KKwlpbml0X2luX3Byb2dyZXNzID0gMDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2luaXQgcGFuZWxfaW5pdF9tb2R1bGUodm9pZCkKK3sKKwlyZXR1cm4gcGFuZWxfaW5pdCgpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgcGFuZWxfY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwl1bnJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigmcGFuZWxfbm90aWZpZXIpOworCisJaWYgKHNjYW5fdGltZXIuZnVuY3Rpb24gIT0gTlVMTCkKKwkJZGVsX3RpbWVyKCZzY2FuX3RpbWVyKTsKKworCWlmIChrZXlwYWRfZW5hYmxlZCkKKwkJbWlzY19kZXJlZ2lzdGVyKCZrZXlwYWRfZGV2KTsKKworCWlmIChsY2RfZW5hYmxlZCkgeworCQlwYW5lbF9sY2RfcHJpbnQoIlx4MGNMQ0QgZHJpdmVyICIgUEFORUxfVkVSU0lPTgorCQkJCSJcbnVubG9hZGVkLlx4MWJbTGNceDFiW0xiXHgxYltMLSIpOworCQltaXNjX2RlcmVnaXN0ZXIoJmxjZF9kZXYpOworCX0KKworCS8qIFRPRE86IGZyZWUgYWxsIGlucHV0IHNpZ25hbHMgKi8KKworCXBhcnBvcnRfcmVsZWFzZShwcHJ0KTsKKwlwYXJwb3J0X3VucmVnaXN0ZXJfZGV2aWNlKHBwcnQpOworCXBhcnBvcnRfdW5yZWdpc3Rlcl9kcml2ZXIoJnBhbmVsX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHBhbmVsX2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KHBhbmVsX2NsZWFudXBfbW9kdWxlKTsKK01PRFVMRV9BVVRIT1IoIldpbGx5IFRhcnJlYXUiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworLyoKKyAqIExvY2FsIHZhcmlhYmxlczoKKyAqICBjLWluZGVudC1sZXZlbDogNAorICogIHRhYi13aWR0aDogOAorICogRW5kOgorICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcG9jaC9SRUFETUUgYi9kcml2ZXJzL3N0YWdpbmcvcG9jaC9SRUFETUUKaW5kZXggZjY1ZTk3OS4uODQyYWZkNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3BvY2gvUkVBRE1FCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9wb2NoL1JFQURNRQpAQCAtMSw1ICsxLDEyIEBACiBUT0RPOgotCS0gZml4IHRyYW5zbWl0IG92ZXJmbG93cworCS0gUnggYmxvY2sgc2l6ZSBpcyBsaW1pdGVkIHRvIDwgMjA0OCwgaGFyZHdhcmUgYnVnPworCS0gR3JvdXAgc2l6ZSBpcyBsaW1pdGVkIHRvIDwgcGFnZSBzaXplLCBrZXJuZWwgYWxsb2MvbW1hcCBBUEkgaXNzdWVzCisJLSBmaXgvd29ya2Fyb3VuZCBjYWNoZSBpc3N1ZXMgaW4gY2lyY3VsYXIgYnVmZmVyIGhlYWRlcgorCS0gdGVzdCB3aGV0aGVyIFR4IGlzIHRyYW5zbWl0dGluZyBkYXRhIGZyb20gcHJvdmlkZWQgYnVmZmVycworCS0gaGFuZGxlIGRldmljZSB1bnBsdWcgY2FzZQorCS0gaGFuZGxlIHRlbXBlcmF0dXJlIGFib3ZlIHRocmVzaG9sZAorCS0gdXNlIGJ1cyBhZGRyZXNzIGluc3RlYWQgb2YgcGh5c2ljYWwgYWRkcmVzcyBmb3IgRE1BCisJLSBzdXBwb3J0IGZvciBzbmFwc2hvdCBtb2RlCiAJLSBhdWRpdCB1c2Vyc3BhY2UgaW50ZXJmYWNlcwogCS0gZ2V0IHJlc2VydmVkIG1ham9yL21pbm9yIGlmIG5lZWRlZAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcG9jaC9wb2NoLmMgYi9kcml2ZXJzL3N0YWdpbmcvcG9jaC9wb2NoLmMKaW5kZXggMGUxMTNmOS4uZWMzNDNlZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3BvY2gvcG9jaC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9wb2NoL3BvY2guYwpAQCAtMTI2LDkgKzEyNiwxMSBAQAogI2RlZmluZSBGUEdBX0lOVF9UWF9BQ1FfRE9ORQkJKDB4MSA8PCAxKQogI2RlZmluZSBGUEdBX0lOVF9SWF9BQ1FfRE9ORQkJKDB4MSkKIAotI2RlZmluZSBGUEdBX1JYX0FEQ19DVExfUkVHCQkweDIxNAotI2RlZmluZSBGUEdBX1JYX0FEQ19DVExfQ09OVF9DQVAJKDB4MCkKLSNkZWZpbmUgRlBHQV9SWF9BRENfQ1RMX1NOQVBfQ0FQCSgweDEpCisjZGVmaW5lIEZQR0FfUlhfQ1RMX1JFRwkJCTB4MjE0CisjZGVmaW5lIEZQR0FfUlhfQ1RMX0ZJRk9fRkxVU0ggICAgICAJKDB4MSA8PCA5KQorI2RlZmluZSBGUEdBX1JYX0NUTF9TWU5USF9EQVRBCQkoMHgxIDw8IDgpCisjZGVmaW5lIEZQR0FfUlhfQ1RMX0NPTlRfQ0FQCQkoMHgwIDw8IDEpCisjZGVmaW5lIEZQR0FfUlhfQ1RMX1NOQVBfQ0FQCQkoMHgxIDw8IDEpCiAKICNkZWZpbmUgRlBHQV9SWF9BUk1fUkVHCQkJMHgyMUMKIApAQCAtMjk5LDYgKzMwMSwxNCBAQAogfQogc3RhdGljIERFVklDRV9BVFRSKGRpciwgU19JUlVTUnxTX0lSR1JQLCBzaG93X2RpcmVjdGlvbiwgTlVMTCk7CiAKK3N0YXRpYyB1bnNpZ25lZCBsb25nIG5wYWdlcyh1bnNpZ25lZCBsb25nIGJ5dGVzKQoreworCWlmIChieXRlcyAlIFBBR0VfU0laRSA9PSAwKQorCQlyZXR1cm4gYnl0ZXMgLyBQQUdFX1NJWkU7CisJZWxzZQorCQlyZXR1cm4gKGJ5dGVzIC8gUEFHRV9TSVpFKSArIDE7Cit9CisKIHN0YXRpYyBzc2l6ZV90IHNob3dfbW1hcF9zaXplKHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCSAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7CkBAIC0zMDksMTAgKzMxOSw4IEBACiAJdW5zaWduZWQgbG9uZyBoZWFkZXJfcGFnZXM7CiAJdW5zaWduZWQgbG9uZyB0b3RhbF9ncm91cF9wYWdlczsKIAotCS8qIEZJWE1FOiBXZSBkbyBub3QgaGF2ZSB0byBhZGQgMSwgaWYgZ3JvdXBfc2l6ZSBhIG11bHRpcGxlIG9mCi0JICAgUEFHRV9TSVpFLiAqLwotCWdyb3VwX3BhZ2VzID0gKGNoYW5uZWwtPmdyb3VwX3NpemUgLyBQQUdFX1NJWkUpICsgMTsKLQloZWFkZXJfcGFnZXMgPSAoY2hhbm5lbC0+aGVhZGVyX3NpemUgLyBQQUdFX1NJWkUpICsgMTsKKwlncm91cF9wYWdlcyA9IG5wYWdlcyhjaGFubmVsLT5ncm91cF9zaXplKTsKKwloZWFkZXJfcGFnZXMgPSBucGFnZXMoY2hhbm5lbC0+aGVhZGVyX3NpemUpOwogCXRvdGFsX2dyb3VwX3BhZ2VzID0gZ3JvdXBfcGFnZXMgKiBjaGFubmVsLT5ncm91cF9jb3VudDsKIAogCW1tYXBfc2l6ZSA9IChoZWFkZXJfcGFnZXMgKyB0b3RhbF9ncm91cF9wYWdlcykgKiBQQUdFX1NJWkU7CkBAIC0zNTAsOCArMzU4LDggQEAKIAl1bnNpZ25lZCBsb25nIGdyb3VwX3BhZ2VzOwogCXVuc2lnbmVkIGxvbmcgaGVhZGVyX3BhZ2VzOwogCi0JZ3JvdXBfcGFnZXMgPSAoY2hhbm5lbC0+Z3JvdXBfc2l6ZSAvIFBBR0VfU0laRSkgKyAxOwotCWhlYWRlcl9wYWdlcyA9IChjaGFubmVsLT5oZWFkZXJfc2l6ZSAvIFBBR0VfU0laRSkgKyAxOworCWdyb3VwX3BhZ2VzID0gbnBhZ2VzKGNoYW5uZWwtPmdyb3VwX3NpemUpOworCWhlYWRlcl9wYWdlcyA9IG5wYWdlcyhjaGFubmVsLT5oZWFkZXJfc2l6ZSk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgY2hhbm5lbC0+Z3JvdXBfY291bnQ7IGkrKykgewogCQlzdHJ1Y3QgcG9jaF9ncm91cF9pbmZvICpncm91cDsKQEAgLTM4NCwxOCArMzkyLDQ1IEBACiAJCWdyb3VwLT51c2VyX29mZnNldCA9CiAJCQkoaGVhZGVyX3BhZ2VzICsgKGkgKiBncm91cF9wYWdlcykpICogUEFHRV9TSVpFOwogCi0JCXByaW50ayhLRVJOX0lORk8gUEZYICIlbGQ6IHVzZXJfb2Zmc2V0OiAweCVseCBkbWE6IDB4JXhcbiIsIGksCi0JCSAgICAgICBncm91cC0+dXNlcl9vZmZzZXQsIGdyb3VwLT5kbWFfYWRkcik7CisJCXByaW50ayhLRVJOX0lORk8gUEZYICIlbGQ6IHVzZXJfb2Zmc2V0OiAweCVseFxuIiwgaSwKKwkJICAgICAgIGdyb3VwLT51c2VyX29mZnNldCk7CiAJfQogCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIGNoYW5uZWxfbGF0Y2hfYXR0cihzdHJ1Y3QgY2hhbm5lbF9pbmZvICpjaGFubmVsKQorc3RhdGljIGludCBjaGFubmVsX2xhdGNoX2F0dHIoc3RydWN0IGNoYW5uZWxfaW5mbyAqY2hhbm5lbCkKIHsKIAljaGFubmVsLT5ncm91cF9jb3VudCA9IGF0b21pY19yZWFkKCZjaGFubmVsLT5zeXNfZ3JvdXBfY291bnQpOwogCWNoYW5uZWwtPmdyb3VwX3NpemUgPSBhdG9taWNfcmVhZCgmY2hhbm5lbC0+c3lzX2dyb3VwX3NpemUpOwogCWNoYW5uZWwtPmJsb2NrX3NpemUgPSBhdG9taWNfcmVhZCgmY2hhbm5lbC0+c3lzX2Jsb2NrX3NpemUpOworCisJaWYgKGNoYW5uZWwtPmdyb3VwX2NvdW50ID09IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiaW52YWxpZCBncm91cCBjb3VudCAlbHUiLAorCQkgICAgICAgY2hhbm5lbC0+Z3JvdXBfY291bnQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoY2hhbm5lbC0+Z3JvdXBfc2l6ZSA9PSAwIHx8CisJICAgIGNoYW5uZWwtPmdyb3VwX3NpemUgPCBjaGFubmVsLT5ibG9ja19zaXplKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggImludmFsaWQgZ3JvdXAgc2l6ZSAlbHUiLAorCQkgICAgICAgY2hhbm5lbC0+Z3JvdXBfc2l6ZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChjaGFubmVsLT5ibG9ja19zaXplID09IDAgfHwgKGNoYW5uZWwtPmJsb2NrX3NpemUgJSA4KSAhPSAwKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggImludmFsaWQgYmxvY2sgc2l6ZSAlbHUiLAorCQkgICAgICAgY2hhbm5lbC0+YmxvY2tfc2l6ZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChjaGFubmVsLT5ncm91cF9zaXplICUgY2hhbm5lbC0+YmxvY2tfc2l6ZSAhPSAwKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlgKKwkJICAgICAgICJncm91cCBzaXplIHNob3VsZCBiZSBtdWx0aXBsZSBvZiBibG9jayBzaXplIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOwogfQogCiAvKgpAQCAtNDMyLDcgKzQ2NywxMCBAQAogCX0KIAogCXByaW50ayhLRVJOX1dBUk5JTkcgImJsb2NrX3NpemUsIGdyb3VwX3NpemUsIGdyb3VwX2NvdW50XG4iKTsKLQlpb3dyaXRlMzIoY2hhbm5lbC0+YmxvY2tfc2l6ZSwgZnBnYSArIGJsb2NrX3NpemVfcmVnKTsKKwkvKgorCSAqIEJsb2NrIHNpemUgaXMgcmVwcmVzZW50ZWQgaW4gbm8uIG9mIDY0IGJpdCB0cmFuc2ZlcnMuCisJICovCisJaW93cml0ZTMyKGNoYW5uZWwtPmJsb2NrX3NpemUgLyA4LCBmcGdhICsgYmxvY2tfc2l6ZV9yZWcpOwogCWlvd3JpdGUzMihjaGFubmVsLT5ncm91cF9zaXplIC8gY2hhbm5lbC0+YmxvY2tfc2l6ZSwKIAkJICBmcGdhICsgYmxvY2tfY291bnRfcmVnKTsKIAlpb3dyaXRlMzIoY2hhbm5lbC0+Z3JvdXBfY291bnQsIGZwZ2EgKyBncm91cF9jb3VudF9yZWcpOwpAQCAtNDQ3LDI3ICs0ODUsMzAgQEAKIAkvKiBUaGUgRE1BIGFkZHJlc3MgcGFnZSByZWdpc3RlciBpcyBzaGFyZWQgYmV0d2VlbiB0aGUgUlggYW5kCiAJICogVFggY2hhbm5lbHMsIHNvIGFjcXVpcmUgbG9jay4KIAkgKi8KLQlzcGluX2xvY2soY2hhbm5lbC0+aW9tZW1fbG9jayk7CiAJZm9yIChpID0gMDsgaSA8IGNoYW5uZWwtPmdyb3VwX2NvdW50OyBpKyspIHsKIAkJcGFnZSA9IGkgLyAzMjsKIAkJZ3JvdXBfaW5fcGFnZSA9IGkgJSAzMjsKIAogCQlncm91cF9yZWcgPSBncm91cF9yZWdzX2Jhc2UgKyAoZ3JvdXBfaW5fcGFnZSAqIDQpOwogCisJCXNwaW5fbG9jayhjaGFubmVsLT5pb21lbV9sb2NrKTsKIAkJaW93cml0ZTMyKHBhZ2UsIGZwZ2EgKyBGUEdBX0RNQV9BRFJfUEFHRV9SRUcpOwogCQlpb3dyaXRlMzIoY2hhbm5lbC0+Z3JvdXBzW2ldLmRtYV9hZGRyLCBmcGdhICsgZ3JvdXBfcmVnKTsKKwkJc3Bpbl91bmxvY2soY2hhbm5lbC0+aW9tZW1fbG9jayk7CiAJfQorCiAJZm9yIChpID0gMDsgaSA8IGNoYW5uZWwtPmdyb3VwX2NvdW50OyBpKyspIHsKIAkJcGFnZSA9IGkgLyAzMjsKIAkJZ3JvdXBfaW5fcGFnZSA9IGkgJSAzMjsKIAogCQlncm91cF9yZWcgPSBncm91cF9yZWdzX2Jhc2UgKyAoZ3JvdXBfaW5fcGFnZSAqIDQpOwogCisJCXNwaW5fbG9jayhjaGFubmVsLT5pb21lbV9sb2NrKTsKIAkJaW93cml0ZTMyKHBhZ2UsIGZwZ2EgKyBGUEdBX0RNQV9BRFJfUEFHRV9SRUcpOwogCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiJWxkOiByZWFkIGRtYV9hZGRyOiAweCV4XG4iLCBpLAogCQkgICAgICAgaW9yZWFkMzIoZnBnYSArIGdyb3VwX3JlZykpOworCQlzcGluX3VubG9jayhjaGFubmVsLT5pb21lbV9sb2NrKTsKIAl9Ci0Jc3Bpbl91bmxvY2soY2hhbm5lbC0+aW9tZW1fbG9jayk7CiAKIH0KIApAQCAtNTM4LDcgKzU3OSw5IEBACiAKIAlwcmludGsoS0VSTl9XQVJOSU5HICJjaGFubmVsX2xhdGNoX2F0dHJcbiIpOwogCi0JY2hhbm5lbF9sYXRjaF9hdHRyKGNoYW5uZWwpOworCXJldCA9IGNoYW5uZWxfbGF0Y2hfYXR0cihjaGFubmVsKTsKKwlpZiAocmV0ICE9IDApCisJCWdvdG8gb3V0OwogCiAJY2hhbm5lbC0+dHJhbnNmZXIgPSAwOwogCkBAIC03ODEsNiArODI0LDExIEBACiAJCWlvd3JpdGUzMihGUEdBX1RYX0NUTF9GSUZPX0ZMVVNICiAJCQkgIHwgRlBHQV9UWF9DVExfT1VUUFVUX0NBUkRCVVMsCiAJCQkgIGZwZ2EgKyBGUEdBX1RYX0NUTF9SRUcpOworCX0gZWxzZSB7CisJCS8qIEZsdXNoIFJYIEZJRk8gYW5kIG91dHB1dCBkYXRhIHRvIGNhcmRidXMuICovCisJCWlvd3JpdGUzMihGUEdBX1JYX0NUTF9DT05UX0NBUAorCQkJICB8IEZQR0FfUlhfQ1RMX0ZJRk9fRkxVU0gsCisJCQkgIGZwZ2EgKyBGUEdBX1JYX0NUTF9SRUcpOwogCX0KIAogCWF0b21pY19pbmMoJmNoYW5uZWwtPmluaXRlZCk7CkBAIC04NDcsOCArODk1LDggQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JZ3JvdXBfcGFnZXMgPSAoY2hhbm5lbC0+Z3JvdXBfc2l6ZSAvIFBBR0VfU0laRSkgKyAxOwotCWhlYWRlcl9wYWdlcyA9IChjaGFubmVsLT5oZWFkZXJfc2l6ZSAvIFBBR0VfU0laRSkgKyAxOworCWdyb3VwX3BhZ2VzID0gbnBhZ2VzKGNoYW5uZWwtPmdyb3VwX3NpemUpOworCWhlYWRlcl9wYWdlcyA9IG5wYWdlcyhjaGFubmVsLT5oZWFkZXJfc2l6ZSk7CiAJdG90YWxfZ3JvdXBfcGFnZXMgPSBncm91cF9wYWdlcyAqIGNoYW5uZWwtPmdyb3VwX2NvdW50OwogCiAJc2l6ZSA9IHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydDsKQEAgLTkwMywxNCArOTUxLDcgQEAKIAlzcGluX2xvY2tfaXJxKCZjaGFubmVsLT5ncm91cF9vZmZzZXRzX2xvY2spOwogCiAJZm9yIChpID0gMDsgaSA8IGNoYW5uZWwtPmdyb3VwX2NvdW50OyBpKyspIHsKLQkJaWYgKGNoYW5uZWwtPmRpciA9PSBDSEFOTkVMX0RJUl9SWAotCQkgICAgJiYgY2hhbm5lbC0+aGVhZGVyLT5ncm91cF9vZmZzZXRzW2ldID09IC0xKSB7Ci0JCQlzcGluX3VubG9ja19pcnEoJmNoYW5uZWwtPmdyb3VwX29mZnNldHNfbG9jayk7Ci0JCQlyZXR1cm4gMTsKLQkJfQotCi0JCWlmIChjaGFubmVsLT5kaXIgPT0gQ0hBTk5FTF9ESVJfVFgKLQkJICAgICYmIGNoYW5uZWwtPmhlYWRlci0+Z3JvdXBfb2Zmc2V0c1tpXSAhPSAtMSkgeworCQlpZiAoY2hhbm5lbC0+aGVhZGVyLT5ncm91cF9vZmZzZXRzW2ldICE9IC0xKSB7CiAJCQlzcGluX3VubG9ja19pcnEoJmNoYW5uZWwtPmdyb3VwX29mZnNldHNfbG9jayk7CiAJCQlyZXR1cm4gMTsKIAkJfQpAQCAtMTA1OCwxMCArMTA5OSw3IEBACiAKIAlmb3IgKGkgPSAwOyBpIDwgZ3JvdXBzX2RvbmU7IGkrKykgewogCQlqID0gKHByZXZfdHJhbnNmZXIgKyBpKSAlIGNoYW5uZWwtPmdyb3VwX2NvdW50OwotCQlpZiAoY2hhbm5lbC0+ZGlyID09IENIQU5ORUxfRElSX1JYKQotCQkJZ3JvdXBfb2Zmc2V0c1tqXSA9IC0xOwotCQllbHNlCi0JCQlncm91cF9vZmZzZXRzW2pdID0gZ3JvdXBzW2pdLnVzZXJfb2Zmc2V0OworCQlncm91cF9vZmZzZXRzW2pdID0gZ3JvdXBzW2pdLnVzZXJfb2Zmc2V0OwogCX0KIAogCXNwaW5fdW5sb2NrKCZjaGFubmVsLT5ncm91cF9vZmZzZXRzX2xvY2spOwpAQCAtMTI4Myw3ICsxMzIxLDcgQEAKIAl9CiAKIAlyZXQgPSByZXF1ZXN0X2lycShwZGV2LT5pcnEsIHBvY2hfaXJxX2hhbmRsZXIsIElSUUZfU0hBUkVELAotCQkJICBkZXYtPmJ1c19pZCwgcG9jaF9kZXYpOworCQkJICBkZXZfbmFtZShkZXYpLCBwb2NoX2Rldik7CiAJaWYgKHJldCkgewogCQlkZXZfZXJyKGRldiwgImVycm9yIHJlcXVlc3RpbmcgSVJRICV1XG4iLCBwZGV2LT5pcnEpOwogCQlyZXQgPSAtRU5PTUVNOwpAQCAtMTM1MCwxMiArMTM4OCwxMiBAQAogCXVuc2lnbmVkIGludCBtaW5vciA9IE1JTk9SKHBvY2hfZGV2LT5jZGV2LmRldik7CiAJdW5zaWduZWQgaW50IGlkID0gbWlub3IgLyBwb2NoX2Rldi0+bmNoYW5uZWxzOwogCi0JLyogRklYTUU6IHVubWFwIGZwZ2FfaW9tZW0gYW5kIGJyaWRnZV9pb21lbSAqLwotCiAJcG9jaF9jbGFzc19kZXZfdW5yZWdpc3Rlcihwb2NoX2RldiwgaWQpOwogCWNkZXZfZGVsKCZwb2NoX2Rldi0+Y2Rldik7CiAJaWRyX3JlbW92ZSgmcG9jaF9pZHMsIGlkKTsKIAlmcmVlX2lycShwZGV2LT5pcnEsIHBvY2hfZGV2KTsKKwlpb3VubWFwKHBvY2hfZGV2LT5mcGdhX2lvbWVtKTsKKwlpb3VubWFwKHBvY2hfZGV2LT5icmlkZ2VfaW9tZW0pOwogCXVpb191bnJlZ2lzdGVyX2RldmljZSh1aW8pOwogCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CiAJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3JzcGl1c2IvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy9yc3BpdXNiL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDIyNWY2NwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9yc3BpdXNiL0tjb25maWcKQEAgLTAsMCArMSw2IEBACitjb25maWcgVVNCX1JTUEkKKwl0cmlzdGF0ZSAiUHJpbmNldG9uIEluc3RydW1lbnRzIFVTQiBjYW1lcmEgc3VwcG9ydCIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIFVTQiAmJiBCUk9LRU4KKwloZWxwCisJICBUaGlzIGRyaXZlciBpcyBmb3IgdGhlIFByaW5jZXRvbiBJbnN0cnVtZW50cyBVU0IgY2FtZXJhIGRldmljZS4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9yc3BpdXNiL01ha2VmaWxlIGIvZHJpdmVycy9zdGFnaW5nL3JzcGl1c2IvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2M3YWVkOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9yc3BpdXNiL01ha2VmaWxlCkBAIC0wLDAgKzEgQEAKK29iai0kKENPTkZJR19VU0JfUlNQSSkJCSs9IHJzcGl1c2IubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3JzcGl1c2IvVE9ETyBiL2RyaXZlcnMvc3RhZ2luZy9yc3BpdXNiL1RPRE8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Q2MzM2YQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9yc3BpdXNiL1RPRE8KQEAgLTAsMCArMSwyMiBAQAorVGhpcyBkcml2ZXIgaXMgZm9yIHRoZSBQcmluY2V0b24gSW5zdHJ1bWVudHMgVVNCIGNhbWVyYS4KKworSXQgbmVlZHMgbG90cyBvZiB3b3JrIHRvIGdldCBpdCBpbnRvIHRoZSBtYWluIGRyaXZlcnMvdXNiLyBzdWJkaXJlY3Rvcnk6CisKK0FueSBwYXRjaGVzIHRvIGRvIGFueSBvZiB0aGUgZm9sbG93aW5nIGNoYW5nZXMgYXJlIGdyZWF0bHkgYXBwcmVjaWF0ZWQ6CisKKwktIG1ha2UgY2hlY2twYXRjaC5wbCBjbGVhbgorCS0gY29kaW5nIHN0eWxlIGZpeHVwcyAodHlwZWRlZnMsIGV0Yy4pCisJLSBnZXQgaXQgdG8gYnVpbGQgcHJvcGVybHkKKwktIGF1ZGl0IGlvY3RscworCS0gcmVtb3ZlIGlvY3RscyBpZiBwb3NzaWJsZQorCS0gYXNzaWduIHByb3BlciBtaW5vciBudW1iZXIKKwktIHJlbW92ZSBkYmcoKSBtYWNybworCS0gbG90cyBvZiBnZW5lcmFsIGNsZWFudXBzCisJLSByZXZpZXcgbG9ja2luZworCitQbGVhc2Ugc2VuZCBwYXRjaGVzIHRvOgorCUdyZWcgS3JvYWgtSGFydG1hbiA8Z3JlZ2toQHN1c2UuZGU+CithbmQgQ0M6CisJSnVkZCBNb250Z29tZXJ5IDxqdWRkQGpwaWxvdC5vcmc+CisJSmVmZiBGcm9udHogPGplZmYuZnJvbnR6QGdtYWlsLmNvbT4KK2FzIHRoZXkgaGF2ZSB0aGlzIGRldmljZSBhbmQgY2FuIHRlc3QgYW55IG5lZWRlZCBjaGFuZ2VzLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3JzcGl1c2IvcnNwaXVzYi5jIGIvZHJpdmVycy9zdGFnaW5nL3JzcGl1c2IvcnNwaXVzYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhMjgxZDYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnNwaXVzYi9yc3BpdXNiLmMKQEAgLTAsMCArMSw4ODcgQEAKKy8qCisgKiByc3BpdXNiLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYgUHJpbmNldG9uIEluc3RydW1lbnRzCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9zY2F0dGVybGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CisjaW5jbHVkZSAicnNwaXVzYi5oIgorCisjaWZkZWYgQ09ORklHX1VTQl9ERUJVRworc3RhdGljIGludCBkZWJ1ZyA9IDE7CisjZWxzZQorc3RhdGljIGludCBkZWJ1ZzsKKyNlbmRpZgorLyogVXNlIG91ciBvd24gZGJnIG1hY3JvICovCisjdW5kZWYgZGJnCisjZGVmaW5lIGRiZyhmb3JtYXQsIGFyZy4uLikgZG8geyBpZiAoZGVidWcpIHByaW50ayhLRVJOX0RFQlVHIF9fRklMRV9fICI6ICIgZm9ybWF0ICJcbiIgLCAjIyBhcmcpOyB9IHdoaWxlICgwKQorCisvKiBWZXJzaW9uIEluZm9ybWF0aW9uICovCisjZGVmaW5lIERSSVZFUl9WRVJTSU9OICJWMS4wLjEiCisjZGVmaW5lIERSSVZFUl9BVVRIT1IgICJQcmluY2V0b24gSW5zdHJ1bWVudHMiCisjZGVmaW5lIERSSVZFUl9ERVNDICAgICJQSSBVU0IyLjAgRGV2aWNlIERyaXZlciBmb3IgTGludXgiCisKKy8qIERlZmluZSB0aGVzZSB2YWx1ZXMgdG8gbWF0Y2ggeW91ciBkZXZpY2VzICovCisjZGVmaW5lIFZFTkRPUl9JRCAgIDB4MEJENworI2RlZmluZSBTVDEzM19QSUQgICAweEEwMTAKKyNkZWZpbmUgUElYSVNfUElEICAgMHhBMDI2CisKKy8qIEdldCBhIG1pbm9yIHJhbmdlIGZvciB5b3VyIGRldmljZXMgZnJvbSB0aGUgdXNiIG1haW50YWluZXIgKi8KKyNpZmRlZiBDT05GSUdfVVNCX0RZTkFNSUNfTUlOT1JTCisjZGVmaW5lIFBJVVNCX01JTk9SX0JBU0UgICAgMAorI2Vsc2UKKyNkZWZpbmUgUElVU0JfTUlOT1JfQkFTRSAgICAxOTIKKyNlbmRpZgorCisvKiBwcmV2ZW50IHJhY2VzIGJldHdlZW4gb3BlbigpIGFuZCBkaXNjb25uZWN0KCkgKi8KK3N0YXRpYyBERUNMQVJFX01VVEVYKGRpc2Nvbm5lY3Rfc2VtKTsKKworLyogU3RydWN0dXJlIHRvIGhvbGQgYWxsIG9mIG91ciBkZXZpY2Ugc3BlY2lmaWMgc3R1ZmYgKi8KK3N0cnVjdCBkZXZpY2VfZXh0ZW5zaW9uIHsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldjsJLyogc2F2ZSBvZmYgdGhlIHVzYiBkZXZpY2UgcG9pbnRlciAqLworCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2U7CS8qIHRoZSBpbnRlcmZhY2UgZm9yIHRoaXMgZGV2aWNlICovCisJdW5zaWduZWQgY2hhciBtaW5vcjsJLyogdGhlIHN0YXJ0aW5nIG1pbm9yIG51bWJlciBmb3IgdGhpcyBkZXZpY2UgKi8KKwlzaXplX3QgYnVsa19pbl9zaXplX3JldHVybmVkOworCWludCBidWxrX2luX2J5dGVfdHJrOworCXN0cnVjdCB1cmIgKioqUGl4ZWxVcmI7CisJaW50IGZyYW1lSWR4OworCWludCB1cmJJZHg7CisJdW5zaWduZWQgaW50ICptYXBsaXN0X251bVBhZ2VzTWFwcGVkOworCWludCBvcGVuOwkJLyogaWYgdGhlIHBvcnQgaXMgb3BlbiBvciBub3QgKi8KKwlpbnQgcHJlc2VudDsJCS8qIGlmIHRoZSBkZXZpY2UgaXMgbm90IGRpc2Nvbm5lY3RlZCAqLworCWludCB1c2VyQnVmTWFwcGVkOwkvKiBoYXMgdGhlIHVzZXIgYnVmZmVyIGJlZW4gbWFwcGVkPyAqLworCXN0cnVjdCBzY2F0dGVybGlzdCAqKnNnbDsJLyogc2NhdHRlci1nYXRoZXIgbGlzdCBmb3IgdXNlciBidWZmZXIgKi8KKwl1bnNpZ25lZCBpbnQgKnNnRW50cmllczsKKwlzdHJ1Y3Qga3JlZiBrcmVmOworCWludCBnb3RQaXhlbERhdGE7CisJaW50IHBlbmRpbmdXcml0ZTsKKwljaGFyICoqcGVuZGVkUGl4ZWxVcmJzOworCWludCBpYW1hOwkJLypQSVhJUyBvciBTVDEzMyAqLworCWludCBudW1fZnJhbWVzOwkJLyogdGhlIG51bWJlciBvZiBmcmFtZXMgdGhhdCB3aWxsIGZpdCBpbiB0aGUgdXNlciBidWZmZXIgKi8KKwlpbnQgYWN0aXZlX2ZyYW1lOworCXVuc2lnbmVkIGxvbmcgZnJhbWVTaXplOworCXN0cnVjdCBzZW1hcGhvcmUgc2VtOworCS8vRlgyIHNwZWNpZmljIGVuZHBvaW50cworCXVuc2lnbmVkIGludCBoRVBbOF07Cit9OworI2RlZmluZSB0b19waV9kZXYoZCkgY29udGFpbmVyX29mKCBkLCBzdHJ1Y3QgZGV2aWNlX2V4dGVuc2lvbiwga3JlZiApCisKK3N0YXRpYyBpbnQgTWFwVXNlckJ1ZmZlcihzdHJ1Y3QgaW9jdGxfc3RydWN0ICosIHN0cnVjdCBkZXZpY2VfZXh0ZW5zaW9uICopOworc3RhdGljIGludCBVbk1hcFVzZXJCdWZmZXIoc3RydWN0IGRldmljZV9leHRlbnNpb24gKik7CitzdGF0aWMgaW50IHBpdXNiX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAorCQkgICAgICAgdW5zaWduZWQgbG9uZyBhcmcpOworc3RhdGljIGludCBwaXVzYl9vdXRwdXQoc3RydWN0IGlvY3RsX3N0cnVjdCAqLCB1bnNpZ25lZCBjaGFyICosIGludCwgc3RydWN0IGRldmljZV9leHRlbnNpb24gKik7CitzdGF0aWMgc3RydWN0IHVzYl9kcml2ZXIgcGl1c2JfZHJpdmVyOworCisvKiB0YWJsZSBvZiBkZXZpY2VzIHRoYXQgd29yayB3aXRoIHRoaXMgZHJpdmVyICovCitzdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgcGlfZGV2aWNlX3RhYmxlW10gPSB7CisJe1VTQl9ERVZJQ0UoVkVORE9SX0lELCBTVDEzM19QSUQpfSwKKwl7VVNCX0RFVklDRShWRU5ET1JfSUQsIFBJWElTX1BJRCl9LAorCXswLCB9CQkJLyogVGVybWluYXRpbmcgZW50cnkgKi8KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUodXNiLCBwaV9kZXZpY2VfdGFibGUpOworCitzdGF0aWMgaW50IGxhc3RFcnIgPSAwOworc3RhdGljIGludCBlcnJDbnQgPSAwOworCitzdGF0aWMgdm9pZCBwaXVzYl9kZWxldGUoc3RydWN0IGtyZWYgKmtyZWYpCit7CisJc3RydWN0IGRldmljZV9leHRlbnNpb24gKnBkeCA9IHRvX3BpX2RldihrcmVmKTsKKworCWRldl9kYmcoJnBkeC0+dWRldi0+ZGV2LCAiJXNcbiIsIF9fZnVuY19fKTsKKwl1c2JfcHV0X2RldihwZHgtPnVkZXYpOworCWtmcmVlKHBkeCk7Cit9CisKK3N0YXRpYyBpbnQgcGl1c2Jfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgZGV2aWNlX2V4dGVuc2lvbiAqcGR4ID0gTlVMTDsKKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZXJmYWNlOworCWludCBzdWJtaW5vcjsKKwlpbnQgcmV0dmFsID0gMDsKKworCWRiZygiUGl1c2JfT3BlbigpIik7CisJc3VibWlub3IgPSBpbWlub3IoaW5vZGUpOworCWludGVyZmFjZSA9IHVzYl9maW5kX2ludGVyZmFjZSgmcGl1c2JfZHJpdmVyLCBzdWJtaW5vcik7CisJaWYgKCFpbnRlcmZhY2UpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlcyAtIGVycm9yLCBjYW4ndCBmaW5kIGRldmljZSBmb3IgbWlub3IgJWRcbiIsCisJCSAgICAgICBfX2Z1bmNfXywgc3VibWlub3IpOworCQlyZXR2YWwgPSAtRU5PREVWOworCQlnb3RvIGV4aXRfbm9fZGV2aWNlOworCX0KKworCXBkeCA9IHVzYl9nZXRfaW50ZmRhdGEoaW50ZXJmYWNlKTsKKwlpZiAoIXBkeCkgeworCQlyZXR2YWwgPSAtRU5PREVWOworCQlnb3RvIGV4aXRfbm9fZGV2aWNlOworCX0KKwlkYmcoIkFsdGVybmF0ZSBTZXR0aW5nID0gJWQiLCBpbnRlcmZhY2UtPm51bV9hbHRzZXR0aW5nKTsKKworCXBkeC0+ZnJhbWVJZHggPSBwZHgtPnVyYklkeCA9IDA7CisJcGR4LT5nb3RQaXhlbERhdGEgPSAwOworCXBkeC0+cGVuZGluZ1dyaXRlID0gMDsKKwlwZHgtPmZyYW1lU2l6ZSA9IDA7CisJcGR4LT5udW1fZnJhbWVzID0gMDsKKwlwZHgtPmFjdGl2ZV9mcmFtZSA9IDA7CisJcGR4LT5idWxrX2luX2J5dGVfdHJrID0gMDsKKwlwZHgtPnVzZXJCdWZNYXBwZWQgPSAwOworCXBkeC0+cGVuZGVkUGl4ZWxVcmJzID0gTlVMTDsKKwlwZHgtPnNnRW50cmllcyA9IE5VTEw7CisJcGR4LT5zZ2wgPSBOVUxMOworCXBkeC0+bWFwbGlzdF9udW1QYWdlc01hcHBlZCA9IE5VTEw7CisJcGR4LT5QaXhlbFVyYiA9IE5VTEw7CisJcGR4LT5idWxrX2luX3NpemVfcmV0dXJuZWQgPSAwOworCS8qIGluY3JlbWVudCBvdXIgdXNhZ2UgY291bnQgZm9yIHRoZSBkZXZpY2UgKi8KKwlrcmVmX2dldCgmcGR4LT5rcmVmKTsKKwkvKiBzYXZlIG91ciBvYmplY3QgaW4gdGhlIGZpbGUncyBwcml2YXRlIHN0cnVjdHVyZSAqLworCWZpbGUtPnByaXZhdGVfZGF0YSA9IHBkeDsKKyAgICAgIGV4aXRfbm9fZGV2aWNlOgorCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQgcGl1c2JfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgZGV2aWNlX2V4dGVuc2lvbiAqcGR4OworCWludCByZXR2YWwgPSAwOworCisJZGJnKCJQaXVzYl9SZWxlYXNlKCkiKTsKKwlwZHggPSAoc3RydWN0IGRldmljZV9leHRlbnNpb24gKilmaWxlLT5wcml2YXRlX2RhdGE7CisJaWYgKHBkeCA9PSBOVUxMKSB7CisJCWRiZygiJXMgLSBvYmplY3QgaXMgTlVMTCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCS8qIGRlY3JlbWVudCB0aGUgY291bnQgb24gb3VyIGRldmljZSAqLworCWtyZWZfcHV0KCZwZHgtPmtyZWYsIHBpdXNiX2RlbGV0ZSk7CisJcmV0dXJuIHJldHZhbDsKK30KKworLyoqCisgKglwaXVzYl9pb2N0bAorICovCitzdGF0aWMgaW50IHBpdXNiX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAorCQkgICAgICAgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IGRldmljZV9leHRlbnNpb24gKnBkeDsKKwljaGFyIGR1bW15Q3RsQnVmW10gPSB7IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAgfTsKKwl1bnNpZ25lZCBsb25nIGRldlJCID0gMDsKKwlpbnQgaSA9IDA7CisJaW50IGVyciA9IDA7CisJaW50IHJldHZhbCA9IDA7CisJc3RydWN0IGlvY3RsX3N0cnVjdCBjdHJsOworCXVuc2lnbmVkIGNoYXIgKnVCdWY7CisJaW50IG51bWJ5dGVzID0gMDsKKwl1bnNpZ25lZCBzaG9ydCBjb250cm9sRGF0YSA9IDA7CisKKwlwZHggPSAoc3RydWN0IGRldmljZV9leHRlbnNpb24gKilmaWxlLT5wcml2YXRlX2RhdGE7CisJLyogdmVyaWZ5IHRoYXQgdGhlIGRldmljZSB3YXNuJ3QgdW5wbHVnZ2VkICovCisJaWYgKCFwZHgtPnByZXNlbnQpIHsKKwkJZGJnKCJObyBEZXZpY2UgUHJlc2VudFxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKwkvKiBmaWxsIGluIHlvdXIgZGV2aWNlIHNwZWNpZmljIHN0dWZmIGhlcmUgKi8KKwlpZiAoX0lPQ19ESVIoY21kKSAmIF9JT0NfUkVBRCkKKwkJZXJyID0gIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsICh2b2lkIF9fdXNlciAqKWFyZywgX0lPQ19TSVpFKGNtZCkpOworCWVsc2UgaWYgKF9JT0NfRElSKGNtZCkgJiBfSU9DX1dSSVRFKQorCQllcnIgPSAhYWNjZXNzX29rKFZFUklGWV9SRUFELCAodm9pZCBfX3VzZXIgKilhcmcsIF9JT0NfU0laRShjbWQpKTsKKwlpZiAoZXJyKSB7CisJCWRldl9lcnIoJnBkeC0+dWRldi0+ZGV2LCAicmV0dXJuIHdpdGggZXJyb3IgPSAlZFxuIiwgZXJyKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCXN3aXRjaCAoY21kKSB7CisJY2FzZSBQSVVTQl9HRVRWTkRDTUQ6CisJCWlmIChjb3B5X2Zyb21fdXNlcgorCQkgICAgKCZjdHJsLCAodm9pZCBfX3VzZXIgKilhcmcsIHNpemVvZihzdHJ1Y3QgaW9jdGxfc3RydWN0KSkpCisJCQlpbmZvKCJjb3B5X2Zyb21fdXNlciBmYWlsZWRcbiIpOworCQlkYmcoIiVzICV4XG4iLCAiR2V0IFZlbmRvciBDb21tYW5kID0gIiwgY3RybC5jbWQpOworCQlyZXR2YWwgPQorCQkgICAgdXNiX2NvbnRyb2xfbXNnKHBkeC0+dWRldiwgdXNiX3JjdmN0cmxwaXBlKHBkeC0+dWRldiwgMCksCisJCQkJICAgIGN0cmwuY21kLCBVU0JfRElSX0lOLCAwLCAwLCAmZGV2UkIsCisJCQkJICAgIGN0cmwubnVtYnl0ZXMsIEhaICogMTApOworCQlpZiAoY3RybC5jbWQgPT0gMHhGMSkgeworCQkJZGJnKCJGVyBWZXJzaW9uIHJldHVybmVkIGZyb20gSFcgPSAlbGQuJWxkIiwKKwkJCSAgICAoZGV2UkIgPj4gOCksIChkZXZSQiAmIDB4RkYpKTsKKwkJfQorCQlyZXR1cm4gZGV2UkI7CisJY2FzZSBQSVVTQl9TRVRWTkRDTUQ6CisJCWlmIChjb3B5X2Zyb21fdXNlcgorCQkgICAgKCZjdHJsLCAodm9pZCBfX3VzZXIgKilhcmcsIHNpemVvZihzdHJ1Y3QgaW9jdGxfc3RydWN0KSkpCisJCQlpbmZvKCJjb3B5X2Zyb21fdXNlciBmYWlsZWRcbiIpOworLy8gICAgICAgICAgICBkYmcoICIlcyAleCIsICJTZXQgVmVuZG9yIENvbW1hbmQgPSAiLGN0cmwuY21kICk7CisJCWNvbnRyb2xEYXRhID0gY3RybC5wRGF0YVswXTsKKwkJY29udHJvbERhdGEgfD0gKGN0cmwucERhdGFbMV0gPDwgOCk7CisvLyAgICAgICAgICAgIGRiZyggIiVzICVkIiwgIlZlbmRvciBEYXRhID0iLGNvbnRyb2xEYXRhICk7CisJCXJldHZhbCA9IHVzYl9jb250cm9sX21zZyhwZHgtPnVkZXYsIHVzYl9zbmRjdHJscGlwZShwZHgtPnVkZXYsIDApLCBjdHJsLmNtZCwgKFVTQl9ESVJfT1VUIHwgVVNCX1RZUEVfVkVORE9SKSwJLyogfCBVU0JfUkVDSVBfRU5EUE9JTlQpLCAqLworCQkJCQkgY29udHJvbERhdGEsCisJCQkJCSAwLAorCQkJCQkgJmR1bW15Q3RsQnVmLCBjdHJsLm51bWJ5dGVzLCBIWiAqIDEwKTsKKwkJcmV0dXJuIHJldHZhbDsKKwkJYnJlYWs7CisJY2FzZSBQSVVTQl9JU0hJR0hTUEVFRDoKKwkJcmV0dXJuICgocGR4LT51ZGV2LT5zcGVlZCA9PSBVU0JfU1BFRURfSElHSCkgPyAxIDogMCk7CisJCWJyZWFrOworCWNhc2UgUElVU0JfV1JJVEVQSVBFOgorCQlpZiAoY29weV9mcm9tX3VzZXIoJmN0cmwsICh2b2lkIF9fdXNlciAqKWFyZywgX0lPQ19TSVpFKGNtZCkpKQorCQkJaW5mbygiY29weV9mcm9tX3VzZXIgV1JJVEVfRFVNTVkgZmFpbGVkXG4iKTsKKwkJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGN0cmwucERhdGEsIGN0cmwubnVtYnl0ZXMpKSB7CisJCQlkYmcoImNhbid0IGFjY2VzcyBwRGF0YSIpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJcGl1c2Jfb3V0cHV0KCZjdHJsLCBjdHJsLnBEYXRhIC8qdUJ1ZiAqLyAsIGN0cmwubnVtYnl0ZXMsIHBkeCk7CisJCXJldHVybiBjdHJsLm51bWJ5dGVzOworCQlicmVhazsKKwljYXNlIFBJVVNCX1VTRVJCVUZGRVI6CisJCWlmIChjb3B5X2Zyb21fdXNlcgorCQkgICAgKCZjdHJsLCAodm9pZCBfX3VzZXIgKilhcmcsIHNpemVvZihzdHJ1Y3QgaW9jdGxfc3RydWN0KSkpCisJCQlpbmZvKCJjb3B5X2Zyb21fdXNlciBmYWlsZWRcbiIpOworCQlyZXR1cm4gTWFwVXNlckJ1ZmZlcigoc3RydWN0IGlvY3RsX3N0cnVjdCAqKSAmIGN0cmwsIHBkeCk7CisJCWJyZWFrOworCWNhc2UgUElVU0JfVU5NQVBfVVNFUkJVRkZFUjoKKwkJVW5NYXBVc2VyQnVmZmVyKHBkeCk7CisJCXJldHVybiAwOworCQlicmVhazsKKwljYXNlIFBJVVNCX1JFQURQSVBFOgorCQlpZiAoY29weV9mcm9tX3VzZXIKKwkJICAgICgmY3RybCwgKHZvaWQgX191c2VyICopYXJnLCBzaXplb2Yoc3RydWN0IGlvY3RsX3N0cnVjdCkpKQorCQkJaW5mbygiY29weV9mcm9tX3VzZXIgZmFpbGVkXG4iKTsKKwkJc3dpdGNoIChjdHJsLmVuZHBvaW50KSB7CisJCWNhc2UgMDoJLy9TVDEzMyBQaXhlbCBEYXRhIG9yIFBJWElTIElPCisJCQlpZiAocGR4LT5pYW1hID09IFBJWElTX1BJRCkgeworCQkJCXVuc2lnbmVkIGludCBudW1Ub1JlYWQgPSAwOworCQkJCXVuc2lnbmVkIGludCB0b3RhbFJlYWQgPSAwOworCQkJCXVCdWYgPSBrbWFsbG9jKGN0cmwubnVtYnl0ZXMsIEdGUF9LRVJORUwpOworCQkJCWlmICghdUJ1ZikgeworCQkJCQlkYmcoIkFsbG9jIGZvciB1QnVmIGZhaWxlZCIpOworCQkJCQlyZXR1cm4gMDsKKwkJCQl9CisJCQkJbnVtYnl0ZXMgPSBjdHJsLm51bWJ5dGVzOworCQkJCW51bVRvUmVhZCA9IG51bWJ5dGVzOworCQkJCWRiZygibnVtYnl0ZXMgdG8gcmVhZCA9ICVkIiwgbnVtYnl0ZXMpOworCQkJCWRiZygiZW5kcG9pbnQgIyAlZCIsIGN0cmwuZW5kcG9pbnQpOworCQkJCWlmIChjb3B5X2Zyb21fdXNlcih1QnVmLCBjdHJsLnBEYXRhLCBudW1ieXRlcykpCisJCQkJCWRiZygiY29weWluZyBjdHJsLnBEYXRhIHRvIGR1bW15QnVmIGZhaWxlZCIpOworCQkJCWRvIHsKKwkJCQkJaSA9IHVzYl9idWxrX21zZyhwZHgtPnVkZXYsIHBkeC0+aEVQW2N0cmwuZW5kcG9pbnRdLCAodUJ1ZiArIHRvdGFsUmVhZCksIChudW1Ub1JlYWQgPiA2NCkgPyA2NCA6IG51bVRvUmVhZCwgJm51bWJ5dGVzLCBIWiAqIDEwKTsJLy9FUDAgY2FuIG9ubHkgaGFuZGxlIDY0IGJ5dGVzIGF0IGEgdGltZQorCQkJCQlpZiAoaSkgeworCQkJCQkJZGJnKCJDTUQgPSAlcywgQWRkcmVzcyA9IDB4JTAyWCIsICgodUJ1ZlszXSA9PSAweDAyKSA/ICJXUklURSIgOiAiUkVBRCIpLCB1QnVmWzFdKTsKKwkJCQkJCWRiZygiTnVtYmVyIG9mIGJ5dGVzIEF0dGVtcHRlZCB0byByZWFkID0gJWQiLCAoaW50KWN0cmwubnVtYnl0ZXMpOworCQkJCQkJZGJnKCJCbG9ja2luZyBSZWFkSS9PIEZhaWxlZCB3aXRoIHN0YXR1cyAlZCIsIGkpOworCQkJCQkJa2ZyZWUodUJ1Zik7CisJCQkJCQlyZXR1cm4gLTE7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlkYmcoIlBpeGlzIEVQMCBSZWFkICVkIGJ5dGVzIiwKKwkJCQkJCSAgICBudW1ieXRlcyk7CisJCQkJCQl0b3RhbFJlYWQgKz0gbnVtYnl0ZXM7CisJCQkJCQludW1Ub1JlYWQgLT0gbnVtYnl0ZXM7CisJCQkJCX0KKwkJCQl9CisJCQkJd2hpbGUgKG51bVRvUmVhZCk7CisJCQkJbWVtY3B5KGN0cmwucERhdGEsIHVCdWYsIHRvdGFsUmVhZCk7CisJCQkJZGJnKCJUb3RhbCBCeXRlcyBSZWFkIGZyb20gUElYSVMgRVAwID0gJWQiLAorCQkJCSAgICB0b3RhbFJlYWQpOworCQkJCWN0cmwubnVtYnl0ZXMgPSB0b3RhbFJlYWQ7CisJCQkJaWYgKGNvcHlfdG9fdXNlcgorCQkJCSAgICAoKHN0cnVjdCBpb2N0bF9zdHJ1Y3QgKikgYXJnLCAmY3RybCwKKwkJCQkgICAgIHNpemVvZihzdHJ1Y3QgaW9jdGxfc3RydWN0KSkpCisJCQkJCWRiZygiY29weV90b191c2VyIGZhaWxlZCBpbiBJT1JCIik7CisJCQkJa2ZyZWUodUJ1Zik7CisJCQkJcmV0dXJuIGN0cmwubnVtYnl0ZXM7CisJCQl9IGVsc2UJLy9TVDEzMyBQaXhlbCBEYXRhCisJCQl7CisJCQkJaWYgKCFwZHgtPmdvdFBpeGVsRGF0YSkKKwkJCQkJcmV0dXJuIDA7CisJCQkJZWxzZSB7CisJCQkJCXBkeC0+Z290UGl4ZWxEYXRhID0gMDsKKwkJCQkJY3RybC5udW1ieXRlcyA9CisJCQkJCSAgICBwZHgtPmJ1bGtfaW5fc2l6ZV9yZXR1cm5lZDsKKwkJCQkJcGR4LT5idWxrX2luX3NpemVfcmV0dXJuZWQgLT0KKwkJCQkJICAgIHBkeC0+ZnJhbWVTaXplOworCQkJCQlmb3IgKGkgPSAwOyBpIDwgcGR4LT5tYXBsaXN0X251bVBhZ2VzTWFwcGVkW3BkeC0+YWN0aXZlX2ZyYW1lXTsgaSsrKQorCQkJCQkJU2V0UGFnZURpcnR5KHBkeC0+c2dsW3BkeC0+YWN0aXZlX2ZyYW1lXVtpXS5wYWdlX2xpbmspOworCQkJCQlwZHgtPmFjdGl2ZV9mcmFtZSA9CisJCQkJCSAgICAoKHBkeC0+YWN0aXZlX2ZyYW1lICsKKwkJCQkJICAgICAgMSkgJSBwZHgtPm51bV9mcmFtZXMpOworCQkJCQlyZXR1cm4gY3RybC5udW1ieXRlczsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAxOgkvL1NUMTMzSU8KKwkJY2FzZSA0OgkvL1BJWElTIElPCisJCQl1QnVmID0ga21hbGxvYyhjdHJsLm51bWJ5dGVzLCBHRlBfS0VSTkVMKTsKKwkJCWlmICghdUJ1ZikgeworCQkJCWRiZygiQWxsb2MgZm9yIHVCdWYgZmFpbGVkIik7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQludW1ieXRlcyA9IGN0cmwubnVtYnl0ZXM7CisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJnKCAibnVtYnl0ZXMgdG8gcmVhZCA9ICVkIiwgbnVtYnl0ZXMgKTsKKwkJCWlmIChjb3B5X2Zyb21fdXNlcih1QnVmLCBjdHJsLnBEYXRhLCBudW1ieXRlcykpCisJCQkJZGJnKCJjb3B5aW5nIGN0cmwucERhdGEgdG8gZHVtbXlCdWYgZmFpbGVkIik7CisJCQlpID0gdXNiX2J1bGtfbXNnKHBkeC0+dWRldiwgcGR4LT5oRVBbY3RybC5lbmRwb2ludF0sCisJCQkJCSB1QnVmLCBudW1ieXRlcywgJm51bWJ5dGVzLCBIWiAqIDEwKTsKKwkJCWlmIChpKSB7CisJCQkJZGJnKCJCbG9ja2luZyBSZWFkSS9PIEZhaWxlZCB3aXRoIHN0YXR1cyAlZCIsCisJCQkJICAgIGkpOworCQkJCWtmcmVlKHVCdWYpOworCQkJCXJldHVybiAtMTsKKwkJCX0gZWxzZSB7CisJCQkJY3RybC5udW1ieXRlcyA9IG51bWJ5dGVzOworCQkJCW1lbWNweShjdHJsLnBEYXRhLCB1QnVmLCBudW1ieXRlcyk7CisJCQkJaWYgKGNvcHlfdG9fdXNlcgorCQkJCSAgICAoKHN0cnVjdCBpb2N0bF9zdHJ1Y3QgKikgYXJnLCAmY3RybCwKKwkJCQkgICAgIHNpemVvZihzdHJ1Y3QgaW9jdGxfc3RydWN0KSkpCisJCQkJCWRiZygiY29weV90b191c2VyIGZhaWxlZCBpbiBJT1JCIik7CisJCQkJa2ZyZWUodUJ1Zik7CisJCQkJcmV0dXJuIGN0cmwubnVtYnl0ZXM7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIDI6CS8vUElYSVMgUGluZworCQljYXNlIDM6CS8vUElYSVMgUG9uZworCQkJaWYgKCFwZHgtPmdvdFBpeGVsRGF0YSkKKwkJCQlyZXR1cm4gMDsKKwkJCWVsc2UgeworCQkJCXBkeC0+Z290UGl4ZWxEYXRhID0gMDsKKwkJCQljdHJsLm51bWJ5dGVzID0gcGR4LT5idWxrX2luX3NpemVfcmV0dXJuZWQ7CisJCQkJcGR4LT5idWxrX2luX3NpemVfcmV0dXJuZWQgLT0gcGR4LT5mcmFtZVNpemU7CisJCQkJZm9yIChpID0gMDsKKwkJCQkgICAgIGkgPAorCQkJCSAgICAgcGR4LT5tYXBsaXN0X251bVBhZ2VzTWFwcGVkW3BkeC0+CisJCQkJCQkJCSBhY3RpdmVfZnJhbWVdOworCQkJCSAgICAgaSsrKQorCQkJCQlTZXRQYWdlRGlydHkocGR4LT5zZ2xbcGR4LT5hY3RpdmVfZnJhbWVdW2ldLnBhZ2VfbGluayk7CisJCQkJcGR4LT5hY3RpdmVfZnJhbWUgPQorCQkJCSAgICAoKHBkeC0+YWN0aXZlX2ZyYW1lICsgMSkgJSBwZHgtPm51bV9mcmFtZXMpOworCQkJCXJldHVybiBjdHJsLm51bWJ5dGVzOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBQSVVTQl9XSEFUQ0FNRVJBOgorCQlyZXR1cm4gcGR4LT5pYW1hOworCWNhc2UgUElVU0JfU0VURlJBTUVTSVpFOgorCQlkYmcoIlBJVVNCX1NFVEZSQU1FU0laRSIpOworCQlpZiAoY29weV9mcm9tX3VzZXIKKwkJICAgICgmY3RybCwgKHZvaWQgX191c2VyICopYXJnLCBzaXplb2Yoc3RydWN0IGlvY3RsX3N0cnVjdCkpKQorCQkJaW5mbygiY29weV9mcm9tX3VzZXIgZmFpbGVkXG4iKTsKKwkJcGR4LT5mcmFtZVNpemUgPSBjdHJsLm51bWJ5dGVzOworCQlwZHgtPm51bV9mcmFtZXMgPSBjdHJsLm51bUZyYW1lczsKKwkJaWYgKCFwZHgtPnNnbCkKKwkJCXBkeC0+c2dsID0KKwkJCSAgICBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc2NhdHRlcmxpc3QgKikgKgorCQkJCSAgICBwZHgtPm51bV9mcmFtZXMsIEdGUF9LRVJORUwpOworCQlpZiAoIXBkeC0+c2dFbnRyaWVzKQorCQkJcGR4LT5zZ0VudHJpZXMgPQorCQkJICAgIGttYWxsb2Moc2l6ZW9mKHVuc2lnbmVkIGludCkgKiBwZHgtPm51bV9mcmFtZXMsCisJCQkJICAgIEdGUF9LRVJORUwpOworCQlpZiAoIXBkeC0+UGl4ZWxVcmIpCisJCQlwZHgtPlBpeGVsVXJiID0KKwkJCSAgICBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdXJiICoqKSAqIHBkeC0+bnVtX2ZyYW1lcywKKwkJCQkgICAgR0ZQX0tFUk5FTCk7CisJCWlmICghcGR4LT5tYXBsaXN0X251bVBhZ2VzTWFwcGVkKQorCQkJcGR4LT5tYXBsaXN0X251bVBhZ2VzTWFwcGVkID0KKwkJCSAgICB2bWFsbG9jKHNpemVvZih1bnNpZ25lZCBpbnQpICogcGR4LT5udW1fZnJhbWVzKTsKKwkJaWYgKCFwZHgtPnBlbmRlZFBpeGVsVXJicykKKwkJCXBkeC0+cGVuZGVkUGl4ZWxVcmJzID0KKwkJCSAgICBrbWFsbG9jKHNpemVvZihjaGFyICopICogcGR4LT5udW1fZnJhbWVzLAorCQkJCSAgICBHRlBfS0VSTkVMKTsKKwkJcmV0dXJuIDA7CisJZGVmYXVsdDoKKwkJZGJnKCIlc1xuIiwgIk5vIElPQ1RMIGZvdW5kIik7CisJCWJyZWFrOworCisJfQorCS8qIHJldHVybiB0aGF0IHdlIGRpZCBub3QgdW5kZXJzdGFuZCB0aGlzIGlvY3RsIGNhbGwgKi8KKwlkYmcoIlJldHVybmluZyAtRU5PVFRZIik7CisJcmV0dXJuIC1FTk9UVFk7Cit9CisKK3N0YXRpYyB2b2lkIHBpdXNiX3dyaXRlX2J1bGtfY2FsbGJhY2soc3RydWN0IHVyYiAqdXJiKQoreworCXN0cnVjdCBkZXZpY2VfZXh0ZW5zaW9uICpwZHggPSB1cmItPmNvbnRleHQ7CisJaW50IHN0YXR1cyA9IHVyYi0+c3RhdHVzOworCisJLyogc3luYy9hc3luYyB1bmxpbmsgZmF1bHRzIGFyZW4ndCBlcnJvcnMgKi8KKwlpZiAoc3RhdHVzICYmICEoc3RhdHVzID09IC1FTk9FTlQgfHwgc3RhdHVzID09IC1FQ09OTlJFU0VUKSkKKwkJZGV2X2RiZygmdXJiLT5kZXYtPmRldiwKKwkJCSIlcyAtIG5vbnplcm8gd3JpdGUgYnVsayBzdGF0dXMgcmVjZWl2ZWQ6ICVkIiwKKwkJCV9fZnVuY19fLCBzdGF0dXMpOworCisJcGR4LT5wZW5kaW5nV3JpdGUgPSAwOworCXVzYl9idWZmZXJfZnJlZSh1cmItPmRldiwgdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoLAorCQkJdXJiLT50cmFuc2Zlcl9idWZmZXIsIHVyYi0+dHJhbnNmZXJfZG1hKTsKK30KKworaW50IHBpdXNiX291dHB1dChzdHJ1Y3QgaW9jdGxfc3RydWN0ICogaW8sIHVuc2lnbmVkIGNoYXIgKnVCdWYsIGludCBsZW4sCisJCSBzdHJ1Y3QgZGV2aWNlX2V4dGVuc2lvbiAqcGR4KQoreworCXN0cnVjdCB1cmIgKnVyYiA9IE5VTEw7CisJaW50IGVyciA9IDA7CisJdW5zaWduZWQgY2hhciAqa2J1ZiA9IE5VTEw7CisKKwl1cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOworCWlmICh1cmIgIT0gTlVMTCkgeworCQlrYnVmID0KKwkJICAgIHVzYl9idWZmZXJfYWxsb2MocGR4LT51ZGV2LCBsZW4sIEdGUF9LRVJORUwsCisJCQkJICAgICAmdXJiLT50cmFuc2Zlcl9kbWEpOworCQlpZiAoIWtidWYpIHsKKwkJCWluZm8oImJ1ZmZlcl9hbGxvYyBmYWlsZWRcbiIpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJbWVtY3B5KGtidWYsIHVCdWYsIGxlbik7CisJCXVzYl9maWxsX2J1bGtfdXJiKHVyYiwgcGR4LT51ZGV2LCBwZHgtPmhFUFtpby0+ZW5kcG9pbnRdLCBrYnVmLAorCQkJCSAgbGVuLCBwaXVzYl93cml0ZV9idWxrX2NhbGxiYWNrLCBwZHgpOworCQl1cmItPnRyYW5zZmVyX2ZsYWdzIHw9IFVSQl9OT19UUkFOU0ZFUl9ETUFfTUFQOworCQllcnIgPSB1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9LRVJORUwpOworCQlpZiAoZXJyKSB7CisJCQlkZXZfZXJyKCZwZHgtPnVkZXYtPmRldiwKKwkJCQkiV1JJVEUgRVJST1I6c3VibWl0IHVyYiBlcnJvciA9ICVkXG4iLCBlcnIpOworCQl9CisJCXBkeC0+cGVuZGluZ1dyaXRlID0gMTsKKwkJdXNiX2ZyZWVfdXJiKHVyYik7CisJfQorCXJldHVybiAtRUlOUFJPR1JFU1M7Cit9CisKK3N0YXRpYyBpbnQgVW5NYXBVc2VyQnVmZmVyKHN0cnVjdCBkZXZpY2VfZXh0ZW5zaW9uICpwZHgpCit7CisJaW50IGkgPSAwOworCWludCBrID0gMDsKKwl1bnNpZ25lZCBpbnQgZXBBZGRyOworCWZvciAoayA9IDA7IGsgPCBwZHgtPm51bV9mcmFtZXM7IGsrKykgeworCQlkYmcoIktpbGxpbmcgVXJicyBmb3IgRnJhbWUgJWQiLCBrKTsKKwkJZm9yIChpID0gMDsgaSA8IHBkeC0+c2dFbnRyaWVzW2tdOyBpKyspIHsKKwkJCXVzYl9raWxsX3VyYihwZHgtPlBpeGVsVXJiW2tdW2ldKTsKKwkJCXVzYl9mcmVlX3VyYihwZHgtPlBpeGVsVXJiW2tdW2ldKTsKKwkJCXBkeC0+cGVuZGVkUGl4ZWxVcmJzW2tdW2ldID0gMDsKKwkJfQorCQlkYmcoIlVyYiBlcnJvciBjb3VudCA9ICVkIiwgZXJyQ250KTsKKwkJZXJyQ250ID0gMDsKKwkJZGJnKCJVcmJzIGZyZWUnZCBhbmQgS2lsbGVkIGZvciBGcmFtZSAlZCIsIGspOworCX0KKworCWZvciAoayA9IDA7IGsgPCBwZHgtPm51bV9mcmFtZXM7IGsrKykgeworCQlpZiAocGR4LT5pYW1hID09IFBJWElTX1BJRCkJLy9pZiBzbywgd2hpY2ggRVAgc2hvdWxkIHdlIG1hcCB0aGlzIGZyYW1lIHRvCisJCXsKKwkJCWlmIChrICUgMikJLy9jaGVjayB0byBzZWUgaWYgdGhpcyBzaG91bGQgdXNlIEVQNChQT05HKQorCQkJeworCQkJCWVwQWRkciA9IHBkeC0+aEVQWzNdOwkvL1BPTkcsIG9kZCBmcmFtZXMKKwkJCX0gZWxzZSB7CisJCQkJZXBBZGRyID0gcGR4LT5oRVBbMl07CS8vUElORywgZXZlbiBmcmFtZXMgYW5kIHplcm8KKwkJCX0KKwkJfSBlbHNlCQkvL1NUMTMzIG9ubHkgaGFzIDEgZW5kcG9pbnQgZm9yIFBpeGVsIGRhdGEgdHJhbnNmZXIKKwkJeworCQkJZXBBZGRyID0gcGR4LT5oRVBbMF07CisJCX0KKwkJdXNiX2J1ZmZlcl91bm1hcF9zZyhwZHgtPnVkZXYsIGVwQWRkciwgcGR4LT5zZ2xba10sCisJCQkJICAgIHBkeC0+bWFwbGlzdF9udW1QYWdlc01hcHBlZFtrXSk7CisJCWZvciAoaSA9IDA7IGkgPCBwZHgtPm1hcGxpc3RfbnVtUGFnZXNNYXBwZWRba107IGkrKykgeworCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBkeC0+c2dsW2tdW2ldLnBhZ2VfbGluayk7CisJCX0KKwkJa2ZyZWUocGR4LT5zZ2xba10pOworCQlrZnJlZShwZHgtPlBpeGVsVXJiW2tdKTsKKwkJa2ZyZWUocGR4LT5wZW5kZWRQaXhlbFVyYnNba10pOworCQlwZHgtPnNnbFtrXSA9IE5VTEw7CisJCXBkeC0+UGl4ZWxVcmJba10gPSBOVUxMOworCQlwZHgtPnBlbmRlZFBpeGVsVXJic1trXSA9IE5VTEw7CisJfQorCWtmcmVlKHBkeC0+c2dFbnRyaWVzKTsKKwl2ZnJlZShwZHgtPm1hcGxpc3RfbnVtUGFnZXNNYXBwZWQpOworCXBkeC0+c2dFbnRyaWVzID0gTlVMTDsKKwlwZHgtPm1hcGxpc3RfbnVtUGFnZXNNYXBwZWQgPSBOVUxMOworCWtmcmVlKHBkeC0+c2dsKTsKKwlrZnJlZShwZHgtPnBlbmRlZFBpeGVsVXJicyk7CisJa2ZyZWUocGR4LT5QaXhlbFVyYik7CisJcGR4LT5zZ2wgPSBOVUxMOworCXBkeC0+cGVuZGVkUGl4ZWxVcmJzID0gTlVMTDsKKwlwZHgtPlBpeGVsVXJiID0gTlVMTDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcGl1c2JfcmVhZFBJWEVMX2NhbGxiYWNrKHN0cnVjdCB1cmIgKnVyYikKK3sKKwlpbnQgaSA9IDA7CisJc3RydWN0IGRldmljZV9leHRlbnNpb24gKnBkeCA9IHVyYi0+Y29udGV4dDsKKwlpbnQgc3RhdHVzID0gdXJiLT5zdGF0dXM7CisKKwlpZiAoc3RhdHVzICYmICEoc3RhdHVzID09IC1FTk9FTlQgfHwgc3RhdHVzID09IC1FQ09OTlJFU0VUKSkgeworCQlkYmcoIiVzIC0gbm9uemVybyByZWFkIGJ1bGsgc3RhdHVzIHJlY2VpdmVkOiAlZCIsIF9fZnVuY19fLAorCQkgICAgc3RhdHVzKTsKKwkJZGJnKCJFcnJvciBpbiByZWFkIEVQMiBjYWxsYmFjayIpOworCQlkYmcoIkZyYW1lSW5kZXggPSAlZCIsIHBkeC0+ZnJhbWVJZHgpOworCQlkYmcoIkJ5dGVzIHJlY2VpdmVkIGJlZm9yZSBwcm9ibGVtIG9jY3VycmVkID0gJWQiLAorCQkgICAgcGR4LT5idWxrX2luX2J5dGVfdHJrKTsKKwkJZGJnKCJVcmIgSWR4ID0gJWQiLCBwZHgtPnVyYklkeCk7CisJCXBkeC0+cGVuZGVkUGl4ZWxVcmJzW3BkeC0+ZnJhbWVJZHhdW3BkeC0+dXJiSWR4XSA9IDA7CisJfSBlbHNlIHsKKwkJcGR4LT5idWxrX2luX2J5dGVfdHJrICs9IHVyYi0+YWN0dWFsX2xlbmd0aDsKKwkJeworCQkJaSA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQyk7CS8vcmVzdWJtaXQgdGhlIFVSQgorCQkJaWYgKGkpIHsKKwkJCQllcnJDbnQrKzsKKwkJCQlpZiAoaSAhPSBsYXN0RXJyKSB7CisJCQkJCWRiZygic3VibWl0IHVyYiBpbiBjYWxsYmFjayBmYWlsZWQgd2l0aCBlcnJvciBjb2RlICVkIiwgaSk7CisJCQkJCWxhc3RFcnIgPSBpOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJcGR4LT51cmJJZHgrKzsJLy9wb2ludCB0byBuZXh0IFVSQiB3aGVuIHdlIGNhbGxiYWNrCisJCQkJaWYgKHBkeC0+YnVsa19pbl9ieXRlX3RyayA+PSBwZHgtPmZyYW1lU2l6ZSkgeworCQkJCQlwZHgtPmJ1bGtfaW5fc2l6ZV9yZXR1cm5lZCA9CisJCQkJCSAgICBwZHgtPmJ1bGtfaW5fYnl0ZV90cms7CisJCQkJCXBkeC0+YnVsa19pbl9ieXRlX3RyayA9IDA7CisJCQkJCXBkeC0+Z290UGl4ZWxEYXRhID0gMTsKKwkJCQkJcGR4LT5mcmFtZUlkeCA9CisJCQkJCSAgICAoKHBkeC0+ZnJhbWVJZHggKworCQkJCQkgICAgICAxKSAlIHBkeC0+bnVtX2ZyYW1lcyk7CisJCQkJCXBkeC0+dXJiSWR4ID0gMDsKKwkJCQl9CisJCQl9CisJCX0KKwl9Cit9CisKKy8qIE1hcFVzZXJCdWZmZXIoCisJaW5wdXRzOgorCXN0cnVjdCBpb2N0bF9zdHJ1Y3QgKmlvIC0gc3RydWN0dXJlIGNvbnRhaW5pbmcgdXNlciBhZGRyZXNzLCBmcmFtZSAjLCBhbmQgc2l6ZQorCXN0cnVjdCBkZXZpY2VfZXh0ZW5zaW9uICpwZHggLSB0aGUgUElVU0IgZGV2aWNlIGV4dGVuc2lvbgorCXJldHVybnM6CisJaW50IC0gc3RhdHVzIG9mIHRoZSB0YXNrCisJTm90ZXM6CisJTWFwVXNlckJ1ZmZlciBtYXBzIGEgYnVmZmVyIHBhc3NlZCBkb3duIHRocm91Z2ggYW4gaW9jdGwuICBUaGUgdXNlciBidWZmZXIgaXMgUGFnZSBBbGlnbmVkIGJ5IHRoZSBhcHAKKwlhbmQgdGhlbiBwYXNzZWQgZG93bi4gIFRoZSBmdW5jdGlvbiBnZXRfZnJlZV9wYWdlcyguLi4pIGRvZXMgdGhlIGFjdHVhbCBtYXBwaW5nIG9mIHRoZSBidWZmZXIgZnJvbSB1c2VyIHNwYWNlIHRvCisJa2VybmVsIHNwYWNlLiAgRnJvbSB0aGVyZSBhIHNjYXR0ZXJsaXN0IGlzIGNyZWF0ZWQgZnJvbSBhbGwgdGhlIHBhZ2VzLiAgVGhlIG5leHQgZnVuY3Rpb24gY2FsbGVkIGlzIHRvIHVzYl9idWZmZXJfbWFwX3NnCisJd2hpY2ggYWxsb2NhdGVkIERNQSBhZGRyZXNzZXMgZm9yIGVhY2ggcGFnZSwgZXZlbiBjb2FsZXNjaW5nIHRoZW0gaWYgcG9zc2libGUuICBUaGUgRE1BIGFkZHJlc3MgaXMgcGxhY2VkIGluIHRoZSBzY2F0dGVybGlzdAorCXN0cnVjdHVyZS4gIFRoZSBmdW5jdGlvbiByZXR1cm5zIHRoZSBudW1iZXIgb2YgRE1BIGFkZHJlc3Nlcy4gIFRoaXMgbWF5IG9yIG1heSBub3QgYmUgZXF1YWwgdG8gdGhlIG51bWJlciBvZiBwYWdlcyB0aGF0CisJdGhlIHVzZXIgYnVmZmVyIHVzZXMuICBXZSB0aGVuIGJ1aWxkIGFuIFVSQiBmb3IgZWFjaCBETUEgYWRkcmVzcyBhbmQgdGhlbiBzdWJtaXQgdGhlbS4KKyovCisvL2ludCBNYXBVc2VyQnVmZmVyKCB1bnNpZ25lZCBsb25nIHVhZGRyLCB1bnNpZ25lZCBsb25nIG51bWJ5dGVzLCB1bnNpZ25lZCBsb25nIGZyYW1lSW5mbywgc3RydWN0IGRldmljZV9leHRlbnNpb24gKnBkeCApCitzdGF0aWMgaW50IE1hcFVzZXJCdWZmZXIoc3RydWN0IGlvY3RsX3N0cnVjdCAqaW8sIHN0cnVjdCBkZXZpY2VfZXh0ZW5zaW9uICpwZHgpCit7CisJdW5zaWduZWQgbG9uZyB1YWRkcjsKKwl1bnNpZ25lZCBsb25nIG51bWJ5dGVzOworCWludCBmcmFtZUluZm87CQkvL3doaWNoIGZyYW1lIHdlJ3JlIG1hcHBpbmcKKwl1bnNpZ25lZCBpbnQgZXBBZGRyID0gMDsKKwl1bnNpZ25lZCBsb25nIGNvdW50ID0gMDsKKwlpbnQgaSA9IDA7CisJaW50IGsgPSAwOworCWludCBlcnIgPSAwOworCXN0cnVjdCBwYWdlICoqbWFwbGlzdF9wOworCWludCBudW1QYWdlc1JlcXVpcmVkOworCWZyYW1lSW5mbyA9IGlvLT5udW1GcmFtZXM7CisJdWFkZHIgPSAodW5zaWduZWQgbG9uZylpby0+cERhdGE7CisJbnVtYnl0ZXMgPSBpby0+bnVtYnl0ZXM7CisKKwlpZiAocGR4LT5pYW1hID09IFBJWElTX1BJRCkJLy9pZiBzbywgd2hpY2ggRVAgc2hvdWxkIHdlIG1hcCB0aGlzIGZyYW1lIHRvCisJeworCQlpZiAoZnJhbWVJbmZvICUgMikJLy9jaGVjayB0byBzZWUgaWYgdGhpcyBzaG91bGQgdXNlIEVQNChQT05HKQorCQl7CisJCQllcEFkZHIgPSBwZHgtPmhFUFszXTsJLy9QT05HLCBvZGQgZnJhbWVzCisJCX0gZWxzZSB7CisJCQllcEFkZHIgPSBwZHgtPmhFUFsyXTsJLy9QSU5HLCBldmVuIGZyYW1lcyBhbmQgemVybworCQl9CisJCWRiZygiUGl4aXMgRnJhbWUgIyVkOiBFUD0lZCIsIGZyYW1lSW5mbywKKwkJICAgIChlcEFkZHIgPT0gcGR4LT5oRVBbMl0pID8gMiA6IDQpOworCX0gZWxzZQkJCS8vU1QxMzMgb25seSBoYXMgMSBlbmRwb2ludCBmb3IgUGl4ZWwgZGF0YSB0cmFuc2ZlcgorCXsKKwkJZXBBZGRyID0gcGR4LT5oRVBbMF07CisJCWRiZygiU1QxMzMgRnJhbWUgIyVkOiBFUD0yIiwgZnJhbWVJbmZvKTsKKwl9CisJY291bnQgPSBudW1ieXRlczsKKwlkYmcoIlVzZXJBZGRyZXNzID0gMHglMDhsWCIsIHVhZGRyKTsKKwlkYmcoIm51bWJ5dGVzID0gJWQiLCAoaW50KW51bWJ5dGVzKTsKKwkvL251bWJlciBvZiBwYWdlcyB0byBtYXAgdGhlIGVudGlyZSB1c2VyIHNwYWNlIERNQSBidWZmZXIKKwludW1QYWdlc1JlcXVpcmVkID0KKwkgICAgKCh1YWRkciAmIH5QQUdFX01BU0spICsgY291bnQgKyB+UEFHRV9NQVNLKSA+PiBQQUdFX1NISUZUOworCWRiZygiTnVtYmVyIG9mIHBhZ2VzIG5lZWRlZCA9ICVkIiwgbnVtUGFnZXNSZXF1aXJlZCk7CisJbWFwbGlzdF9wID0gdm1hbGxvYyhudW1QYWdlc1JlcXVpcmVkICogc2l6ZW9mKHN0cnVjdCBwYWdlKSk7CS8vLCBHRlBfQVRPTUlDKTsKKwlpZiAoIW1hcGxpc3RfcCkgeworCQlkYmcoIkNhbid0IEFsbG9jYXRlIE1lbW9yeSBmb3IgbWFwbGlzdF9wIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwkvL21hcCB0aGUgdXNlciBidWZmZXIgdG8ga2VybmVsIG1lbW9yeQorCWRvd25fd3JpdGUoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7CisJcGR4LT5tYXBsaXN0X251bVBhZ2VzTWFwcGVkW2ZyYW1lSW5mb10gPSBnZXRfdXNlcl9wYWdlcyhjdXJyZW50LCBjdXJyZW50LT5tbSwgKHVhZGRyICYgUEFHRV9NQVNLKSwgbnVtUGFnZXNSZXF1aXJlZCwgV1JJVEUsIDAsCS8vRG9uJ3QgRm9yY2UKKwkJCQkJCQkJbWFwbGlzdF9wLAorCQkJCQkJCQlOVUxMKTsKKwl1cF93cml0ZSgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKKwlkYmcoIk51bWJlciBvZiBwYWdlcyBtYXBwZWQgPSAlZCIsCisJICAgIHBkeC0+bWFwbGlzdF9udW1QYWdlc01hcHBlZFtmcmFtZUluZm9dKTsKKwlmb3IgKGkgPSAwOyBpIDwgcGR4LT5tYXBsaXN0X251bVBhZ2VzTWFwcGVkW2ZyYW1lSW5mb107IGkrKykKKwkJZmx1c2hfZGNhY2hlX3BhZ2UobWFwbGlzdF9wW2ldKTsKKwlpZiAoIXBkeC0+bWFwbGlzdF9udW1QYWdlc01hcHBlZFtmcmFtZUluZm9dKSB7CisJCWRiZygiZ2V0X3VzZXJfcGFnZXMoKSBmYWlsZWQiKTsKKwkJdmZyZWUobWFwbGlzdF9wKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCS8vbmVlZCB0byBjcmVhdGUgYSBzY2F0dGVybGlzdCB0aGF0IHNwYW5zIGVhY2ggZnJhbWUgdGhhdCBjYW4gZml0IGludG8gdGhlIG1hcHBlZCBidWZmZXIKKwlwZHgtPnNnbFtmcmFtZUluZm9dID0KKwkgICAga21hbGxvYygocGR4LT5tYXBsaXN0X251bVBhZ2VzTWFwcGVkW2ZyYW1lSW5mb10gKgorCQkgICAgIHNpemVvZihzdHJ1Y3Qgc2NhdHRlcmxpc3QpKSwgR0ZQX0FUT01JQyk7CisJaWYgKCFwZHgtPnNnbFtmcmFtZUluZm9dKSB7CisJCXZmcmVlKG1hcGxpc3RfcCk7CisJCWRiZygiY2FuJ3QgYWxsb2NhdGUgbWVtIGZvciBzZ2wiKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCXBkeC0+c2dsW2ZyYW1lSW5mb11bMF0ucGFnZV9saW5rID0gbWFwbGlzdF9wWzBdOworCXBkeC0+c2dsW2ZyYW1lSW5mb11bMF0ub2Zmc2V0ID0gdWFkZHIgJiB+UEFHRV9NQVNLOworCWlmIChwZHgtPm1hcGxpc3RfbnVtUGFnZXNNYXBwZWRbZnJhbWVJbmZvXSA+IDEpIHsKKwkJcGR4LT5zZ2xbZnJhbWVJbmZvXVswXS5sZW5ndGggPQorCQkgICAgUEFHRV9TSVpFIC0gcGR4LT5zZ2xbZnJhbWVJbmZvXVswXS5vZmZzZXQ7CisJCWNvdW50IC09IHBkeC0+c2dsW2ZyYW1lSW5mb11bMF0ubGVuZ3RoOworCQlmb3IgKGsgPSAxOyBrIDwgcGR4LT5tYXBsaXN0X251bVBhZ2VzTWFwcGVkW2ZyYW1lSW5mb107IGsrKykgeworCQkJcGR4LT5zZ2xbZnJhbWVJbmZvXVtrXS5vZmZzZXQgPSAwOworCQkJcGR4LT5zZ2xbZnJhbWVJbmZvXVtrXS5wYWdlX2xpbmsgPSBtYXBsaXN0X3Bba107CisJCQlwZHgtPnNnbFtmcmFtZUluZm9dW2tdLmxlbmd0aCA9CisJCQkgICAgKGNvdW50IDwgUEFHRV9TSVpFKSA/IGNvdW50IDogUEFHRV9TSVpFOworCQkJY291bnQgLT0gUEFHRV9TSVpFOwkvL2V4YW1wbGUgaGFkIFBBR0VfU0laRSBoZXJlOworCQl9CisJfSBlbHNlIHsKKwkJcGR4LT5zZ2xbZnJhbWVJbmZvXVswXS5sZW5ndGggPSBjb3VudDsKKwl9CisJcGR4LT5zZ0VudHJpZXNbZnJhbWVJbmZvXSA9CisJICAgIHVzYl9idWZmZXJfbWFwX3NnKHBkeC0+dWRldiwgZXBBZGRyLCBwZHgtPnNnbFtmcmFtZUluZm9dLAorCQkJICAgICAgcGR4LT5tYXBsaXN0X251bVBhZ2VzTWFwcGVkW2ZyYW1lSW5mb10pOworCWRiZygibnVtYmVyIG9mIHNnRW50cmllcyA9ICVkIiwgcGR4LT5zZ0VudHJpZXNbZnJhbWVJbmZvXSk7CisJcGR4LT51c2VyQnVmTWFwcGVkID0gMTsKKwl2ZnJlZShtYXBsaXN0X3ApOworCS8vQ3JlYXRlIGFuZCBTZW5kIHRoZSBVUkIncyBmb3IgZWFjaCBzL2cgZW50cnkKKwlwZHgtPlBpeGVsVXJiW2ZyYW1lSW5mb10gPQorCSAgICBrbWFsbG9jKHBkeC0+c2dFbnRyaWVzW2ZyYW1lSW5mb10gKiBzaXplb2Yoc3RydWN0IHVyYiAqKSwKKwkJICAgIEdGUF9LRVJORUwpOworCWlmICghcGR4LT5QaXhlbFVyYltmcmFtZUluZm9dKSB7CisJCWRiZygiQ2FuJ3QgQWxsb2NhdGUgTWVtb3J5IGZvciBVcmIiKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCWZvciAoaSA9IDA7IGkgPCBwZHgtPnNnRW50cmllc1tmcmFtZUluZm9dOyBpKyspIHsKKwkJcGR4LT5QaXhlbFVyYltmcmFtZUluZm9dW2ldID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsJLy8wIGJlY2F1c2Ugd2UncmUgdXNpbmcgQlVMSyB0cmFuc2ZlcnMKKwkJdXNiX2ZpbGxfYnVsa191cmIocGR4LT5QaXhlbFVyYltmcmFtZUluZm9dW2ldLAorCQkJCSAgcGR4LT51ZGV2LAorCQkJCSAgZXBBZGRyLAorCQkJCSAgKGRtYV9hZGRyX3QgKikgc2dfZG1hX2FkZHJlc3MoJnBkeC0+CisJCQkJCQkJCXNnbFtmcmFtZUluZm9dCisJCQkJCQkJCVtpXSksCisJCQkJICBzZ19kbWFfbGVuKCZwZHgtPnNnbFtmcmFtZUluZm9dW2ldKSwKKwkJCQkgIHBpdXNiX3JlYWRQSVhFTF9jYWxsYmFjaywgKHZvaWQgKilwZHgpOworCQlwZHgtPlBpeGVsVXJiW2ZyYW1lSW5mb11baV0tPnRyYW5zZmVyX2RtYSA9CisJCSAgICBzZ19kbWFfYWRkcmVzcygmcGR4LT5zZ2xbZnJhbWVJbmZvXVtpXSk7CisJCXBkeC0+UGl4ZWxVcmJbZnJhbWVJbmZvXVtpXS0+dHJhbnNmZXJfZmxhZ3MgPQorCQkgICAgVVJCX05PX1RSQU5TRkVSX0RNQV9NQVAgfCBVUkJfTk9fSU5URVJSVVBUOworCX0KKwlwZHgtPlBpeGVsVXJiW2ZyYW1lSW5mb11bLS1pXS0+dHJhbnNmZXJfZmxhZ3MgJj0gflVSQl9OT19JTlRFUlJVUFQ7CS8vb25seSBpbnRlcnJ1cHQgd2hlbiBsYXN0IFVSQiBjb21wbGV0ZXMKKwlwZHgtPnBlbmRlZFBpeGVsVXJic1tmcmFtZUluZm9dID0KKwkgICAga21hbGxvYygocGR4LT5zZ0VudHJpZXNbZnJhbWVJbmZvXSAqIHNpemVvZihjaGFyKSksIEdGUF9LRVJORUwpOworCWlmICghcGR4LT5wZW5kZWRQaXhlbFVyYnNbZnJhbWVJbmZvXSkKKwkJZGJnKCJDYW4ndCBhbGxvY2F0ZSBNZW1vcnkgZm9yIHBlbmRlZFBpeGVsVXJicyIpOworCWZvciAoaSA9IDA7IGkgPCBwZHgtPnNnRW50cmllc1tmcmFtZUluZm9dOyBpKyspIHsKKwkJZXJyID0gdXNiX3N1Ym1pdF91cmIocGR4LT5QaXhlbFVyYltmcmFtZUluZm9dW2ldLCBHRlBfQVRPTUlDKTsKKwkJaWYgKGVycikgeworCQkJZGJnKCIlcyAlZFxuIiwgInN1Ym1pdCB1cmIgZXJyb3IgPSIsIGVycik7CisJCQlwZHgtPnBlbmRlZFBpeGVsVXJic1tmcmFtZUluZm9dW2ldID0gMDsKKwkJCXJldHVybiBlcnI7CisJCX0gZWxzZQorCQkJcGR4LT5wZW5kZWRQaXhlbFVyYnNbZnJhbWVJbmZvXVtpXSA9IDE7OworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcGl1c2JfZm9wcyA9IHsKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkuaW9jdGwgPSBwaXVzYl9pb2N0bCwKKwkub3BlbiA9IHBpdXNiX29wZW4sCisJLnJlbGVhc2UgPSBwaXVzYl9yZWxlYXNlLAorfTsKKworc3RhdGljIHN0cnVjdCB1c2JfY2xhc3NfZHJpdmVyIHBpdXNiX2NsYXNzID0geworCS5uYW1lID0gInVzYi9yc3BpdXNiJWQiLAorCS5mb3BzID0gJnBpdXNiX2ZvcHMsCisJLm1pbm9yX2Jhc2UgPSBQSVVTQl9NSU5PUl9CQVNFLAorfTsKKworLyoqCisgKglwaXVzYl9wcm9iZQorICoKKyAqCUNhbGxlZCBieSB0aGUgdXNiIGNvcmUgd2hlbiBhIG5ldyBkZXZpY2UgaXMgY29ubmVjdGVkIHRoYXQgaXQgdGhpbmtzCisgKgl0aGlzIGRyaXZlciBtaWdodCBiZSBpbnRlcmVzdGVkIGluLgorICovCitzdGF0aWMgaW50IHBpdXNiX3Byb2JlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2UsCisJCSAgICAgICBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IGRldmljZV9leHRlbnNpb24gKnBkeCA9IE5VTEw7CisJc3RydWN0IHVzYl9ob3N0X2ludGVyZmFjZSAqaWZhY2VfZGVzYzsKKwlzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVuZHBvaW50OworCWludCBpOworCWludCByZXR2YWwgPSAtRU5PTUVNOworCisJZGV2X2RiZygmaW50ZXJmYWNlLT5kZXYsICIlcyAtIExvb2tpbmcgZm9yIFBJIFVTQiBIYXJkd2FyZSIsIF9fZnVuY19fKTsKKworCXBkeCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBkZXZpY2VfZXh0ZW5zaW9uKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHBkeCA9PSBOVUxMKSB7CisJCWRldl9lcnIoJmludGVyZmFjZS0+ZGV2LCAiT3V0IG9mIG1lbW9yeVxuIik7CisJCWdvdG8gZXJyb3I7CisJfQorCWtyZWZfaW5pdCgmcGR4LT5rcmVmKTsKKwlwZHgtPnVkZXYgPSB1c2JfZ2V0X2RldihpbnRlcmZhY2VfdG9fdXNiZGV2KGludGVyZmFjZSkpOworCXBkeC0+aW50ZXJmYWNlID0gaW50ZXJmYWNlOworCWlmYWNlX2Rlc2MgPSBpbnRlcmZhY2UtPmN1cl9hbHRzZXR0aW5nOworCisJLyogU2VlIGlmIHRoZSBkZXZpY2Ugb2ZmZXJlZCB1cyBtYXRjaGVzIHdoYXQgd2UgY2FuIGFjY2VwdCAqLworCWlmICgocGR4LT51ZGV2LT5kZXNjcmlwdG9yLmlkVmVuZG9yICE9IFZFTkRPUl9JRCkKKwkgICAgfHwgKChwZHgtPnVkZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0ICE9IFBJWElTX1BJRCkKKwkJJiYgKHBkeC0+dWRldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QgIT0gU1QxMzNfUElEKSkpIHsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCXBkeC0+aWFtYSA9IHBkeC0+dWRldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3Q7CisKKwlpZiAoZGVidWcpIHsKKwkJaWYgKHBkeC0+dWRldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QgPT0gUElYSVNfUElEKQorCQkJZGJnKCJQSVVTQjpQaXhpcyBDYW1lcmEgRm91bmQiKTsKKwkJZWxzZQorCQkJZGJnKCJQSVVTQjpTVDEzMyBVU0IgQ29udHJvbGxlciBGb3VuZCIpOworCQlpZiAocGR4LT51ZGV2LT5zcGVlZCA9PSBVU0JfU1BFRURfSElHSCkKKwkJCWRiZygiSGlnaHNwZWVkKFVTQjIuMCkgRGV2aWNlIEF0dGFjaGVkIik7CisJCWVsc2UKKwkJCWRiZygiTG93c3BlZWQgKFVTQjEuMSkgRGV2aWNlIEF0dGFjaGVkIik7CisKKwkJZGJnKCJOdW1FbmRwb2ludHMgaW4gQ29uZmlndXJhdGlvbjogJWQiLAorCQkgICAgaWZhY2VfZGVzYy0+ZGVzYy5iTnVtRW5kcG9pbnRzKTsKKwl9CisJZm9yIChpID0gMDsgaSA8IGlmYWNlX2Rlc2MtPmRlc2MuYk51bUVuZHBvaW50czsgKytpKSB7CisJCWVuZHBvaW50ID0gJmlmYWNlX2Rlc2MtPmVuZHBvaW50W2ldLmRlc2M7CisJCWlmIChkZWJ1ZykgeworCQkJZGJnKCJFbmRwb2ludFslZF0tPmJEZXNjcmlwdG9yVHlwZSA9ICVkIiwgaSwKKwkJCSAgICBlbmRwb2ludC0+YkRlc2NyaXB0b3JUeXBlKTsKKwkJCWRiZygiRW5kcG9pbnRbJWRdLT5iRW5kcG9pbnRBZGRyZXNzID0gMHglMDJYIiwgaSwKKwkJCSAgICBlbmRwb2ludC0+YkVuZHBvaW50QWRkcmVzcyk7CisJCQlkYmcoIkVuZHBvaW50WyVkXS0+YmJtQXR0cmlidXRlcyA9ICVkIiwgaSwKKwkJCSAgICBlbmRwb2ludC0+Ym1BdHRyaWJ1dGVzKTsKKwkJCWRiZygiRW5kcG9pbnRbJWRdLT5NYXhQYWNrZXRTaXplID0gJWRcbiIsIGksCisJCQkgICAgZW5kcG9pbnQtPndNYXhQYWNrZXRTaXplKTsKKwkJfQorCQlpZiAoKGVuZHBvaW50LT5ibUF0dHJpYnV0ZXMgJiBVU0JfRU5EUE9JTlRfWEZFUlRZUEVfTUFTSykgPT0KKwkJICAgIFVTQl9FTkRQT0lOVF9YRkVSX0JVTEspIHsKKwkJCWlmIChlbmRwb2ludC0+YkVuZHBvaW50QWRkcmVzcyAmIFVTQl9ESVJfSU4pCisJCQkJcGR4LT5oRVBbaV0gPQorCQkJCSAgICB1c2JfcmN2YnVsa3BpcGUocGR4LT51ZGV2LAorCQkJCQkJICAgIGVuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzKTsKKwkJCWVsc2UKKwkJCQlwZHgtPmhFUFtpXSA9CisJCQkJICAgIHVzYl9zbmRidWxrcGlwZShwZHgtPnVkZXYsCisJCQkJCQkgICAgZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3MpOworCQl9CisJfQorCXVzYl9zZXRfaW50ZmRhdGEoaW50ZXJmYWNlLCBwZHgpOworCXJldHZhbCA9IHVzYl9yZWdpc3Rlcl9kZXYoaW50ZXJmYWNlLCAmcGl1c2JfY2xhc3MpOworCWlmIChyZXR2YWwpIHsKKwkJZXJyKCJOb3QgYWJsZSB0byBnZXQgYSBtaW5vciBmb3IgdGhpcyBkZXZpY2UuIik7CisJCXVzYl9zZXRfaW50ZmRhdGEoaW50ZXJmYWNlLCBOVUxMKTsKKwkJZ290byBlcnJvcjsKKwl9CisJcGR4LT5wcmVzZW50ID0gMTsKKworCS8qIHdlIGNhbiByZWdpc3RlciB0aGUgZGV2aWNlIG5vdywgYXMgaXQgaXMgcmVhZHkgKi8KKwlwZHgtPm1pbm9yID0gaW50ZXJmYWNlLT5taW5vcjsKKwkvKiBsZXQgdGhlIHVzZXIga25vdyB3aGF0IG5vZGUgdGhpcyBkZXZpY2UgaXMgbm93IGF0dGFjaGVkIHRvICovCisJZGJnKCJQSSBVU0IyLjAgZGV2aWNlIG5vdyBhdHRhY2hlZCB0byBwaXVzYi0lZCIsIHBkeC0+bWlub3IpOworCXJldHVybiAwOworCisgICAgICBlcnJvcjoKKwlpZiAocGR4KQorCQlrcmVmX3B1dCgmcGR4LT5rcmVmLCBwaXVzYl9kZWxldGUpOworCXJldHVybiByZXR2YWw7Cit9CisKKy8qKgorICoJcGl1c2JfZGlzY29ubmVjdAorICoKKyAqCUNhbGxlZCBieSB0aGUgdXNiIGNvcmUgd2hlbiB0aGUgZGV2aWNlIGlzIHJlbW92ZWQgZnJvbSB0aGUgc3lzdGVtLgorICoKKyAqCVRoaXMgcm91dGluZSBndWFyYW50ZWVzIHRoYXQgdGhlIGRyaXZlciB3aWxsIG5vdCBzdWJtaXQgYW55IG1vcmUgdXJicworICoJYnkgY2xlYXJpbmcgcGR4LT51ZGV2LiAgSXQgaXMgYWxzbyBzdXBwb3NlZCB0byB0ZXJtaW5hdGUgYW55IGN1cnJlbnRseQorICoJYWN0aXZlIHVyYnMuICBVbmZvcnR1bmF0ZWx5LCB1c2JfYnVsa19tc2coKSwgdXNlZCBpbiBwaXVzYl9yZWFkKCksIGRvZXMKKyAqCW5vdCBwcm92aWRlIGFueSB3YXkgdG8gZG8gdGhpcy4gIEJ1dCBhdCBsZWFzdCB3ZSBjYW4gY2FuY2VsIGFuIGFjdGl2ZQorICoJd3JpdGUuCisgKi8KK3N0YXRpYyB2b2lkIHBpdXNiX2Rpc2Nvbm5lY3Qoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGVyZmFjZSkKK3sKKwlzdHJ1Y3QgZGV2aWNlX2V4dGVuc2lvbiAqcGR4OworCWludCBtaW5vciA9IGludGVyZmFjZS0+bWlub3I7CisJbG9ja19rZXJuZWwoKTsKKwlwZHggPSB1c2JfZ2V0X2ludGZkYXRhKGludGVyZmFjZSk7CisJdXNiX3NldF9pbnRmZGF0YShpbnRlcmZhY2UsIE5VTEwpOworCS8qIGdpdmUgYmFjayBvdXIgbWlub3IgKi8KKwl1c2JfZGVyZWdpc3Rlcl9kZXYoaW50ZXJmYWNlLCAmcGl1c2JfY2xhc3MpOworCXVubG9ja19rZXJuZWwoKTsKKwkvKiBwcmV2ZW50IGRldmljZSByZWFkLCB3cml0ZSBhbmQgaW9jdGwgKi8KKwlwZHgtPnByZXNlbnQgPSAwOworCWtyZWZfcHV0KCZwZHgtPmtyZWYsIHBpdXNiX2RlbGV0ZSk7CisJZGJnKCJQSSBVU0IyLjAgZGV2aWNlICMlZCBub3cgZGlzY29ubmVjdGVkXG4iLCBtaW5vcik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciBwaXVzYl9kcml2ZXIgPSB7CisJLm5hbWUgPSAic3ViIiwKKwkucHJvYmUgPSBwaXVzYl9wcm9iZSwKKwkuZGlzY29ubmVjdCA9IHBpdXNiX2Rpc2Nvbm5lY3QsCisJLmlkX3RhYmxlID0gcGlfZGV2aWNlX3RhYmxlLAorfTsKKworLyoqCisgKglwaXVzYl9pbml0CisgKi8KK3N0YXRpYyBpbnQgX19pbml0IHBpdXNiX2luaXQodm9pZCkKK3sKKwlpbnQgcmVzdWx0OworCS8qIHJlZ2lzdGVyIHRoaXMgZHJpdmVyIHdpdGggdGhlIFVTQiBzdWJzeXN0ZW0gKi8KKwlyZXN1bHQgPSB1c2JfcmVnaXN0ZXIoJnBpdXNiX2RyaXZlcik7CisJaWYgKHJlc3VsdCkgeworCQlwcmludGsoS0VSTl9FUlIgS0JVSUxEX01PRE5BTUUKKwkJICAgICAgICI6IHVzYl9yZWdpc3RlciBmYWlsZWQuIEVycm9yIG51bWJlciAlZFxuIiwgcmVzdWx0KTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisJcHJpbnRrKEtFUk5fSU5GTyBLQlVJTERfTU9ETkFNRSAiOiVzOiAlc1xuIiwgRFJJVkVSX0RFU0MsCisJICAgICAgIERSSVZFUl9WRVJTSU9OKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKglwaXVzYl9leGl0CisgKi8KK3N0YXRpYyB2b2lkIF9fZXhpdCBwaXVzYl9leGl0KHZvaWQpCit7CisJLyogZGVyZWdpc3RlciB0aGlzIGRyaXZlciB3aXRoIHRoZSBVU0Igc3Vic3lzdGVtICovCisJdXNiX2RlcmVnaXN0ZXIoJnBpdXNiX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHBpdXNiX2luaXQpOworbW9kdWxlX2V4aXQocGl1c2JfZXhpdCk7CisKKy8qIE1vZHVsZSBwYXJhbWV0ZXJzICovCittb2R1bGVfcGFyYW0oZGVidWcsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiRGVidWcgZW5hYmxlZCBvciBub3QiKTsKKworTU9EVUxFX0FVVEhPUihEUklWRVJfQVVUSE9SKTsKK01PRFVMRV9ERVNDUklQVElPTihEUklWRVJfREVTQyk7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnNwaXVzYi9yc3BpdXNiLmggYi9kcml2ZXJzL3N0YWdpbmcvcnNwaXVzYi9yc3BpdXNiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY1Y2QyZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9yc3BpdXNiL3JzcGl1c2IuaApAQCAtMCwwICsxLDI1IEBACisjaWZuZGVmIF9fUlNQSVVTQl9ICisjZGVmaW5lIF9fUlNQSVVTQl9ICisKKyNkZWZpbmUgUElVU0JfTUFHSUMJCSdtJworI2RlZmluZSBQSVVTQl9JT0NUTF9CQVNFCTE5MgorI2RlZmluZSBQSVVTQl9HRVRWTkRDTUQJCV9JT1IoUElVU0JfTUFHSUMsIFBJVVNCX0lPQ1RMX0JBU0UgKyAxLCBzdHJ1Y3QgaW9jdGxfc3RydWN0KQorI2RlZmluZSBQSVVTQl9TRVRWTkRDTUQJCV9JT1coUElVU0JfTUFHSUMsIFBJVVNCX0lPQ1RMX0JBU0UgKyAyLCBzdHJ1Y3QgaW9jdGxfc3RydWN0KQorI2RlZmluZSBQSVVTQl9XUklURVBJUEUJCV9JT1coUElVU0JfTUFHSUMsIFBJVVNCX0lPQ1RMX0JBU0UgKyAzLCBzdHJ1Y3QgaW9jdGxfc3RydWN0KQorI2RlZmluZSBQSVVTQl9SRUFEUElQRQkJX0lPUihQSVVTQl9NQUdJQywgUElVU0JfSU9DVExfQkFTRSArIDQsIHN0cnVjdCBpb2N0bF9zdHJ1Y3QpCisjZGVmaW5lIFBJVVNCX1NFVEZSQU1FU0laRQlfSU9XKFBJVVNCX01BR0lDLCBQSVVTQl9JT0NUTF9CQVNFICsgNSwgc3RydWN0IGlvY3RsX3N0cnVjdCkKKyNkZWZpbmUgUElVU0JfV0hBVENBTUVSQQlfSU8oUElVU0JfTUFHSUMsICBQSVVTQl9JT0NUTF9CQVNFICsgNikKKyNkZWZpbmUgUElVU0JfVVNFUkJVRkZFUglfSU9XKFBJVVNCX01BR0lDLCBQSVVTQl9JT0NUTF9CQVNFICsgNywgc3RydWN0IGlvY3RsX3N0cnVjdCkKKyNkZWZpbmUgUElVU0JfSVNISUdIU1BFRUQJX0lPKFBJVVNCX01BR0lDLCAgUElVU0JfSU9DVExfQkFTRSArIDgpCisjZGVmaW5lIFBJVVNCX1VOTUFQX1VTRVJCVUZGRVIJX0lPVyhQSVVTQl9NQUdJQywgUElVU0JfSU9DVExfQkFTRSArIDksIHN0cnVjdCBpb2N0bF9zdHJ1Y3QpCisKK3N0cnVjdCBpb2N0bF9zdHJ1Y3QgeworCXVuc2lnbmVkIGNoYXIgY21kOworCXVuc2lnbmVkIGxvbmcgbnVtYnl0ZXM7CisJdW5zaWduZWQgY2hhciBkaXI7CS8vMT1vdXQ7MD1pbgorCWludCBlbmRwb2ludDsKKwlpbnQgbnVtRnJhbWVzOworCXVuc2lnbmVkIGNoYXIgKnBEYXRhOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwLzI4NjBfbWFpbl9kZXYuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvMjg2MF9tYWluX2Rldi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4Y2E4MWYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwLzI4NjBfbWFpbl9kZXYuYwpAQCAtMCwwICsxLDEzNzcgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgTW9kdWxlIE5hbWU6CisgICAgMjg3MF9tYWluX2Rldi5jCisKKyAgICBBYnN0cmFjdDoKKyAgICBDcmVhdGUgYW5kIHJlZ2lzdGVyIG5ldHdvcmsgaW50ZXJmYWNlLgorCisgICAgUmV2aXNpb24gSGlzdG9yeToKKyAgICBXaG8gICAgICAgICBXaGVuICAgICAgICAgICAgV2hhdAorICAgIC0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCisjaW5jbHVkZSAicnRfY29uZmlnLmgiCisKKworI2lmZGVmIE1VTFRJUExFX0NBUkRfU1VQUE9SVAorLy8gcmVjb3JkIHdoZXRoZXIgdGhlIGNhcmQgaW4gdGhlIGNhcmQgbGlzdCBpcyB1c2VkIGluIHRoZSBjYXJkIGZpbGUKK2V4dGVybiBVSU5UOCAgTUNfQ2FyZFVzZWRbXTsKKyNlbmRpZiAvLyBNVUxUSVBMRV9DQVJEX1NVUFBPUlQgLy8KKworCitleHRlcm4gSU5UIF9fZGV2aW5pdCBydDI4eHhfcHJvYmUoSU4gdm9pZCAqX2Rldl9wLCBJTiB2b2lkICpfZGV2X2lkX3AsCisJCQkJCQkJCQlJTiBVSU5UIGFyZ2MsIE9VVCBQUlRNUF9BREFQVEVSICpwcEFkKTsKKworc3RhdGljIHZvaWQgcnhfZG9uZV90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSk7CitzdGF0aWMgdm9pZCBtZ210X2RtYV9kb25lX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKTsKK3N0YXRpYyB2b2lkIGFjMF9kbWFfZG9uZV90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSk7CitzdGF0aWMgdm9pZCBhYzFfZG1hX2RvbmVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpOworc3RhdGljIHZvaWQgYWMyX2RtYV9kb25lX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKTsKK3N0YXRpYyB2b2lkIGFjM19kbWFfZG9uZV90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSk7CitzdGF0aWMgdm9pZCBoY2NhX2RtYV9kb25lX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKTsKK3N0YXRpYyB2b2lkIGZpZm9fc3RhdGlzdGljX2Z1bGxfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpOworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFN5bWJvbCAmIE1hY3JvIERlZmluaXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgUlQyODYwX0lOVF9SWF9ETFkJCQkJKDE8PDApCQkvLyBiaXQgMAorI2RlZmluZSBSVDI4NjBfSU5UX1RYX0RMWQkJCQkoMTw8MSkJCS8vIGJpdCAxCisjZGVmaW5lIFJUMjg2MF9JTlRfUlhfRE9ORQkJCQkoMTw8MikJCS8vIGJpdCAyCisjZGVmaW5lIFJUMjg2MF9JTlRfQUMwX0RNQV9ET05FCQkJKDE8PDMpCQkvLyBiaXQgMworI2RlZmluZSBSVDI4NjBfSU5UX0FDMV9ETUFfRE9ORQkJCSgxPDw0KQkJLy8gYml0IDQKKyNkZWZpbmUgUlQyODYwX0lOVF9BQzJfRE1BX0RPTkUJCQkoMTw8NSkJCS8vIGJpdCA1CisjZGVmaW5lIFJUMjg2MF9JTlRfQUMzX0RNQV9ET05FCQkJKDE8PDYpCQkvLyBiaXQgNgorI2RlZmluZSBSVDI4NjBfSU5UX0hDQ0FfRE1BX0RPTkUJCSgxPDw3KQkJLy8gYml0IDcKKyNkZWZpbmUgUlQyODYwX0lOVF9NR01UX0RPTkUJCQkoMTw8OCkJCS8vIGJpdCA4CisKKyNkZWZpbmUgSU5UX1JYCQkJUlQyODYwX0lOVF9SWF9ET05FCisKKyNkZWZpbmUgSU5UX0FDMF9ETFkJCShSVDI4NjBfSU5UX0FDMF9ETUFfRE9ORSkgLy98IFJUMjg2MF9JTlRfVFhfRExZKQorI2RlZmluZSBJTlRfQUMxX0RMWQkJKFJUMjg2MF9JTlRfQUMxX0RNQV9ET05FKSAvL3wgUlQyODYwX0lOVF9UWF9ETFkpCisjZGVmaW5lIElOVF9BQzJfRExZCQkoUlQyODYwX0lOVF9BQzJfRE1BX0RPTkUpIC8vfCBSVDI4NjBfSU5UX1RYX0RMWSkKKyNkZWZpbmUgSU5UX0FDM19ETFkJCShSVDI4NjBfSU5UX0FDM19ETUFfRE9ORSkgLy98IFJUMjg2MF9JTlRfVFhfRExZKQorI2RlZmluZSBJTlRfSENDQV9ETFkgCShSVDI4NjBfSU5UX0hDQ0FfRE1BX0RPTkUpIC8vfCBSVDI4NjBfSU5UX1RYX0RMWSkKKyNkZWZpbmUgSU5UX01HTVRfRExZCVJUMjg2MF9JTlRfTUdNVF9ET05FCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByb3RvdHlwZXMgb2YgRnVuY3Rpb25zIFVzZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucyAqLworc3RhdGljIElOVCBfX2RldmluaXQgcnQyODYwX2luaXRfb25lIChzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgICplbnQpOworc3RhdGljIFZPSUQgX19kZXZleGl0IHJ0Mjg2MF9yZW1vdmVfb25lKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2KTsKK3N0YXRpYyBJTlQgX19kZXZpbml0IHJ0Mjg2MF9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgICplbnQpOwordm9pZCBpbml0X3RocmVhZF90YXNrKFBSVE1QX0FEQVBURVIgcEFkKTsKK3N0YXRpYyB2b2lkIF9fZXhpdCBydDI4NjBfY2xlYW51cF9tb2R1bGUodm9pZCk7CitzdGF0aWMgaW50IF9faW5pdCBydDI4NjBfaW5pdF9tb2R1bGUodm9pZCk7CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgaW50IHJ0Mjg2MF9zdXNwZW5kKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpOworc3RhdGljIGludCBydDI4NjBfcmVzdW1lKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2KTsKKyNlbmRpZiAvLyBDT05GSUdfUE0gLy8KKyNlbmRpZgorCisKKy8vCisvLyBSYWxpbmsgUENJIGRldmljZSB0YWJsZSwgaW5jbHVkZSBhbGwgc3VwcG9ydGVkIGNoaXBzZXRzCisvLworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHJ0Mjg2MF9wY2lfdGJsW10gX19kZXZpbml0ZGF0YSA9Cit7CisJe1BDSV9ERVZJQ0UoTklDX1BDSV9WRU5ET1JfSUQsIE5JQzI4NjBfUENJX0RFVklDRV9JRCl9LAkJLy9SVDI4NjAyLjRHCisJe1BDSV9ERVZJQ0UoTklDX1BDSV9WRU5ET1JfSUQsIE5JQzI4NjBfUENJZV9ERVZJQ0VfSUQpfSwKKwl7UENJX0RFVklDRShOSUNfUENJX1ZFTkRPUl9JRCwgTklDMjc2MF9QQ0lfREVWSUNFX0lEKX0sCisJe1BDSV9ERVZJQ0UoTklDX1BDSV9WRU5ET1JfSUQsIE5JQzI3OTBfUENJZV9ERVZJQ0VfSUQpfSwKKwl7UENJX0RFVklDRShWRU5fQVdUX1BDSV9WRU5ET1JfSUQsIFZFTl9BV1RfUENJZV9ERVZJQ0VfSUQpfSwKKyAgICB7MCx9CQkvLyB0ZXJtaW5hdGUgbGlzdAorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHJ0Mjg2MF9wY2lfdGJsKTsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKyNpZmRlZiBNT0RVTEVfVkVSU0lPTgorTU9EVUxFX1ZFUlNJT04oU1RBX0RSSVZFUl9WRVJTSU9OKTsKKyNlbmRpZgorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisKKy8vCisvLyBPdXIgUENJIGRyaXZlciBzdHJ1Y3R1cmUKKy8vCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgcnQyODYwX2RyaXZlciA9Cit7CisgICAgbmFtZTogICAgICAgInJ0Mjg2MCIsCisgICAgaWRfdGFibGU6ICAgcnQyODYwX3BjaV90YmwsCisgICAgcHJvYmU6ICAgICAgcnQyODYwX2luaXRfb25lLAorI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSAweDIwNDEyCisgICAgcmVtb3ZlOiAgICAgX19kZXZleGl0X3AocnQyODYwX3JlbW92ZV9vbmUpLAorI2Vsc2UKKyAgICByZW1vdmU6ICAgICBfX2RldmV4aXQocnQyODYwX3JlbW92ZV9vbmUpLAorI2VuZGlmCisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApCisjaWZkZWYgQ09ORklHX1BNCisJc3VzcGVuZDoJcnQyODYwX3N1c3BlbmQsCisJcmVzdW1lOgkJcnQyODYwX3Jlc3VtZSwKKyNlbmRpZgorI2VuZGlmCit9OworCisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApCisjaWZkZWYgQ09ORklHX1BNCisKK1ZPSUQgUlQyODYwUmVqZWN0UGVuZGluZ1BhY2tldHMoCisJSU4JUFJUTVBfQURBUFRFUglwQWQpCit7CisJLy8gY2xlYXIgUFMgcGFja2V0cworCS8vIGNsZWFyIFR4U3cgcGFja2V0cworfQorCitzdGF0aWMgaW50IHJ0Mjg2MF9zdXNwZW5kKAorCXN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2LAorCXBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiA9IHBjaV9nZXRfZHJ2ZGF0YShwY2lfZGV2KTsKKwlQUlRNUF9BREFQVEVSIHBBZCA9IChQUlRNUF9BREFQVEVSKU5VTEw7CisJSU5UMzIgcmV0dmFsOworCisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT0+IHJ0Mjg2MF9zdXNwZW5kKClcbiIpKTsKKworCWlmIChuZXRfZGV2ID09IE5VTEwpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJuZXRfZGV2ID09IE5VTEwhXG4iKSk7CisJfQorCWVsc2UKKwl7CisJCXBBZCA9IG5ldF9kZXYtPm1sX3ByaXY7CisKKwkJLyogd2UgY2FuIG5vdCB1c2UgSUZGX1VQIGJlY2F1c2UgcmEwIGRvd24gYnV0IHJhMSB1cCAqLworCQkvKiBhbmQgMSBzdXNwZW5kL3Jlc3VtZSBmdW5jdGlvbiBmb3IgMSBtb2R1bGUsIG5vdCBmb3IgZWFjaCBpbnRlcmZhY2UgKi8KKwkJLyogc28gTGludXggd2lsbCBjYWxsIHN1c3BlbmQvcmVzdW1lIGZ1bmN0aW9uIG9uY2UgKi8KKwkJaWYgKFZJUlRVQUxfSUZfTlVNKHBBZCkgPiAwKQorCQl7CisJCQkvLyBhdm9pZCB1c2VycyBkbyBzdXNwZW5kIGFmdGVyIGludGVyZmFjZSBpcyBkb3duCisKKwkJCS8vIHN0b3AgaW50ZXJmYWNlCisJCQluZXRpZl9jYXJyaWVyX29mZihuZXRfZGV2KTsKKwkJCW5ldGlmX3N0b3BfcXVldWUobmV0X2Rldik7CisKKwkJCS8vIG1hcmsgZGV2aWNlIGFzIHJlbW92ZWQgZnJvbSBzeXN0ZW0gYW5kIHRoZXJlZm9yZSBubyBsb25nZXIgYXZhaWxhYmxlCisJCQluZXRpZl9kZXZpY2VfZGV0YWNoKG5ldF9kZXYpOworCisJCQkvLyBtYXJrIGhhbHQgZmxhZworCQkJUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyk7CisJCQlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SQURJT19PRkYpOworCisJCQkvLyB0YWtlIGRvd24gdGhlIGRldmljZQorCQkJcnQyOHh4X2Nsb3NlKChQTkVUX0RFViluZXRfZGV2KTsKKworCQkJUlRfTU9EX0RFQ19VU0VfQ09VTlQoKTsKKwkJfQorCX0KKworCS8vIHJlZmVyZW5jZSB0byBodHRwOi8vdm92bzIwMDAuY29tL3R5cGUtbGFiL2xpbnV4L2tlcm5lbC1hcGkvbGludXgta2VybmVsLWFwaS5odG1sCisJLy8gZW5hYmxlIGRldmljZSB0byBnZW5lcmF0ZSBQTUUjIHdoZW4gc3VzcGVuZGVkCisJLy8gcGNpX2Nob29zZV9zdGF0ZSgpOiBDaG9vc2UgdGhlIHBvd2VyIHN0YXRlIG9mIGEgUENJIGRldmljZSB0byBiZSBzdXNwZW5kZWQKKwlyZXR2YWwgPSBwY2lfZW5hYmxlX3dha2UocGNpX2RldiwgcGNpX2Nob29zZV9zdGF0ZShwY2lfZGV2LCBzdGF0ZSksIDEpOworCS8vIHNhdmUgdGhlIFBDSSBjb25maWd1cmF0aW9uIHNwYWNlIG9mIGEgZGV2aWNlIGJlZm9yZSBzdXNwZW5kaW5nCisJcGNpX3NhdmVfc3RhdGUocGNpX2Rldik7CisJLy8gZGlzYWJsZSBQQ0kgZGV2aWNlIGFmdGVyIHVzZQorCXBjaV9kaXNhYmxlX2RldmljZShwY2lfZGV2KTsKKworCXJldHZhbCA9IHBjaV9zZXRfcG93ZXJfc3RhdGUocGNpX2RldiwgcGNpX2Nob29zZV9zdGF0ZShwY2lfZGV2LCBzdGF0ZSkpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPD09PSBydDI4NjBfc3VzcGVuZCgpXG4iKSk7CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGludCBydDI4NjBfcmVzdW1lKAorCXN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBjaV9kZXYpOworCVBSVE1QX0FEQVBURVIgcEFkID0gKFBSVE1QX0FEQVBURVIpTlVMTDsKKwlJTlQzMiByZXR2YWw7CisKKworCS8vIHNldCB0aGUgcG93ZXIgc3RhdGUgb2YgYSBQQ0kgZGV2aWNlCisJLy8gUENJIGhhcyA0IHBvd2VyIHN0YXRlcywgRE8gKG5vcm1hbCkgfiBEMyhsZXNzIHBvd2VyKQorCS8vIGluIGluY2x1ZGUvbGludXgvcGNpLmgsIHlvdSBjYW4gZmluZCB0aGF0CisJLy8gI2RlZmluZSBQQ0lfRDAgICAgICAgICAgKChwY2lfcG93ZXJfdCBfX2ZvcmNlKSAwKQorCS8vICNkZWZpbmUgUENJX0QxICAgICAgICAgICgocGNpX3Bvd2VyX3QgX19mb3JjZSkgMSkKKwkvLyAjZGVmaW5lIFBDSV9EMiAgICAgICAgICAoKHBjaV9wb3dlcl90IF9fZm9yY2UpIDIpCisJLy8gI2RlZmluZSBQQ0lfRDNob3QgICAgICAgKChwY2lfcG93ZXJfdCBfX2ZvcmNlKSAzKQorCS8vICNkZWZpbmUgUENJX0QzY29sZCAgICAgICgocGNpX3Bvd2VyX3QgX19mb3JjZSkgNCkKKwkvLyAjZGVmaW5lIFBDSV9VTktOT1dOICAgICAoKHBjaV9wb3dlcl90IF9fZm9yY2UpIDUpCisJLy8gI2RlZmluZSBQQ0lfUE9XRVJfRVJST1IgKChwY2lfcG93ZXJfdCBfX2ZvcmNlKSAtMSkKKwlyZXR2YWwgPSBwY2lfc2V0X3Bvd2VyX3N0YXRlKHBjaV9kZXYsIFBDSV9EMCk7CisKKwkvLyByZXN0b3JlIHRoZSBzYXZlZCBzdGF0ZSBvZiBhIFBDSSBkZXZpY2UKKwlwY2lfcmVzdG9yZV9zdGF0ZShwY2lfZGV2KTsKKworCS8vIGluaXRpYWxpemUgZGV2aWNlIGJlZm9yZSBpdCdzIHVzZWQgYnkgYSBkcml2ZXIKKwlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGNpX2RldikpCisJeworCQlwcmludGsoInBjaSBlbmFibGUgZmFpbCFcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT0+IHJ0Mjg2MF9yZXN1bWUoKVxuIikpOworCisJaWYgKG5ldF9kZXYgPT0gTlVMTCkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIm5ldF9kZXYgPT0gTlVMTCFcbiIpKTsKKwl9CisJZWxzZQorCQlwQWQgPSBuZXRfZGV2LT5tbF9wcml2OworCisJaWYgKHBBZCAhPSBOVUxMKQorCXsKKwkJLyogd2UgY2FuIG5vdCB1c2UgSUZGX1VQIGJlY2F1c2UgcmEwIGRvd24gYnV0IHJhMSB1cCAqLworCQkvKiBhbmQgMSBzdXNwZW5kL3Jlc3VtZSBmdW5jdGlvbiBmb3IgMSBtb2R1bGUsIG5vdCBmb3IgZWFjaCBpbnRlcmZhY2UgKi8KKwkJLyogc28gTGludXggd2lsbCBjYWxsIHN1c3BlbmQvcmVzdW1lIGZ1bmN0aW9uIG9uY2UgKi8KKwkJaWYgKFZJUlRVQUxfSUZfTlVNKHBBZCkgPiAwKQorCQl7CisJCQkvLyBtYXJrIGRldmljZSBhcyBhdHRhY2hlZCBmcm9tIHN5c3RlbSBhbmQgcmVzdGFydCBpZiBuZWVkZWQKKwkJCW5ldGlmX2RldmljZV9hdHRhY2gobmV0X2Rldik7CisKKwkJCWlmIChydDI4eHhfb3BlbigoUE5FVF9ERVYpbmV0X2RldikgIT0gMCkKKwkJCXsKKwkJCQkvLyBvcGVuIGZhaWwKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT09IHJ0Mjg2MF9yZXN1bWUoKVxuIikpOworCQkJCXJldHVybiAwOworCQkJfQorCisJCQkvLyBpbmNyZWFzZSBNT0RVTEUgdXNlIGNvdW50CisJCQlSVF9NT0RfSU5DX1VTRV9DT1VOVCgpOworCisJCQlSVE1QX0NMRUFSX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MpOworCQkJUlRNUF9DTEVBUl9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SQURJT19PRkYpOworCisJCQluZXRpZl9zdGFydF9xdWV1ZShuZXRfZGV2KTsKKwkJCW5ldGlmX2NhcnJpZXJfb24obmV0X2Rldik7CisJCQluZXRpZl93YWtlX3F1ZXVlKG5ldF9kZXYpOworCQl9CisJfQorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPD09PSBydDI4NjBfcmVzdW1lKClcbiIpKTsKKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvLyBDT05GSUdfUE0gLy8KKyNlbmRpZgorCisKK3N0YXRpYyBJTlQgX19pbml0IHJ0Mjg2MF9pbml0X21vZHVsZShWT0lEKQoreworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDUsMCkKKwlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmcnQyODYwX2RyaXZlcik7CisjZWxzZQorICAgIHJldHVybiBwY2lfbW9kdWxlX2luaXQoJnJ0Mjg2MF9kcml2ZXIpOworI2VuZGlmCit9CisKKworLy8KKy8vIERyaXZlciBtb2R1bGUgdW5sb2FkIGZ1bmN0aW9uCisvLworc3RhdGljIFZPSUQgX19leGl0IHJ0Mjg2MF9jbGVhbnVwX21vZHVsZShWT0lEKQoreworICAgIHBjaV91bnJlZ2lzdGVyX2RyaXZlcigmcnQyODYwX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHJ0Mjg2MF9pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdChydDI4NjBfY2xlYW51cF9tb2R1bGUpOworCisKK3N0YXRpYyBJTlQgX19kZXZpbml0IHJ0Mjg2MF9pbml0X29uZSAoCisgICAgSU4gIHN0cnVjdCBwY2lfZGV2ICAgICAgICAgICAgICAqcGNpX2RldiwKKyAgICBJTiAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgICplbnQpCit7CisgICAgSU5UIHJjOworCisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PiBydDI4NjBfaW5pdF9vbmVcbiIpKTsKKworICAgIC8vIHdha2UgdXAgYW5kIGVuYWJsZSBkZXZpY2UKKyAgICBpZiAocGNpX2VuYWJsZV9kZXZpY2UgKHBjaV9kZXYpKQorICAgIHsKKyAgICAgICAgcmMgPSAtRUlPOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByYyA9IHJ0Mjg2MF9wcm9iZShwY2lfZGV2LCBlbnQpOworICAgIH0KKworICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PT0gcnQyODYwX2luaXRfb25lXG4iKSk7CisgICAgcmV0dXJuIHJjOworfQorCisKK3N0YXRpYyBWT0lEIF9fZGV2ZXhpdCBydDI4NjBfcmVtb3ZlX29uZSgKKyAgICBJTiAgc3RydWN0IHBjaV9kZXYgICpwY2lfZGV2KQoreworICAgIHN0cnVjdCBuZXRfZGV2aWNlICAgKm5ldF9kZXYgPSBwY2lfZ2V0X2RydmRhdGEocGNpX2Rldik7CisgICAgUlRNUF9BREFQVEVSICAgICAgICAqcEFkID0gbmV0X2Rldi0+bWxfcHJpdjsKKworICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT4gcnQyODYwX3JlbW92ZV9vbmVcbiIpKTsKKworCWlmIChwQWQgIT0gTlVMTCkKKwl7CisjaWZkZWYgTVVMVElQTEVfQ0FSRF9TVVBQT1JUCisJCWlmICgocEFkLT5NQ19Sb3dJRCA+PSAwKSAmJiAocEFkLT5NQ19Sb3dJRCA8PSBNQVhfTlVNX09GX01VTFRJUExFX0NBUkQpKQorCQkJTUNfQ2FyZFVzZWRbcEFkLT5NQ19Sb3dJRF0gPSAwOyAvLyBub3QgY2xlYXIgTUFDIGFkZHJlc3MKKyNlbmRpZiAvLyBNVUxUSVBMRV9DQVJEX1NVUFBPUlQgLy8KKworCisKKworCQkvLyBVbnJlZ2lzdGVyIG5ldHdvcmsgZGV2aWNlCisJCXVucmVnaXN0ZXJfbmV0ZGV2KG5ldF9kZXYpOworCisJCS8vIFVubWFwIENTUiBiYXNlIGFkZHJlc3MKKwkJaW91bm1hcCgoY2hhciAqKShuZXRfZGV2LT5iYXNlX2FkZHIpKTsKKworCQlSVE1QRnJlZUFkYXB0ZXIocEFkKTsKKworCQkvLyByZWxlYXNlIG1lbW9yeSByZWdpb24KKwkJcmVsZWFzZV9tZW1fcmVnaW9uKHBjaV9yZXNvdXJjZV9zdGFydChwY2lfZGV2LCAwKSwgcGNpX3Jlc291cmNlX2xlbihwY2lfZGV2LCAwKSk7CisJfQorCWVsc2UKKwl7CisJCS8vIFVucmVnaXN0ZXIgbmV0d29yayBkZXZpY2UKKwkJdW5yZWdpc3Rlcl9uZXRkZXYobmV0X2Rldik7CisKKwkJLy8gVW5tYXAgQ1NSIGJhc2UgYWRkcmVzcworCQlpb3VubWFwKChjaGFyICopKG5ldF9kZXYtPmJhc2VfYWRkcikpOworCisJCS8vIHJlbGVhc2UgbWVtb3J5IHJlZ2lvbgorCQlyZWxlYXNlX21lbV9yZWdpb24ocGNpX3Jlc291cmNlX3N0YXJ0KHBjaV9kZXYsIDApLCBwY2lfcmVzb3VyY2VfbGVuKHBjaV9kZXYsIDApKTsKKwl9CisKKwkvLyBGcmVlIHByZS1hbGxvY2F0ZWQgbmV0X2RldmljZSBtZW1vcnkKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApCisJZnJlZV9uZXRkZXYobmV0X2Rldik7CisjZWxzZQorCWtmcmVlKG5ldF9kZXYpOworI2VuZGlmCit9CisKKy8vCisvLyBQQ0kgZGV2aWNlIHByb2JlICYgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24KKy8vCitzdGF0aWMgSU5UIF9fZGV2aW5pdCAgIHJ0Mjg2MF9wcm9iZSgKKyAgICBJTiAgc3RydWN0IHBjaV9kZXYgICAgICAgICAgICAgICpwY2lfZGV2LAorICAgIElOICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAgKmVudCkKK3sKKwlQUlRNUF9BREFQVEVSIHBBZDsKKyAgICBJTlQgcnYgPSAwOworCisgICAgcnYgPSAoSU5UKXJ0Mjh4eF9wcm9iZSgodm9pZCAqKXBjaV9kZXYsICh2b2lkICopZW50LCAwLCAmcEFkKTsKKwlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19BRFZBTkNFX1BPV0VSX1NBVkVfUENJRV9ERVZJQ0UpOworCXJldHVybiBydjsKK30KKworCit2b2lkIGluaXRfdGhyZWFkX3Rhc2soSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJUE9TX0NPT0tJRSBwT2JqOworCisJcE9iaiA9IChQT1NfQ09PS0lFKSBwQWQtPk9TX0Nvb2tpZTsKKworCXRhc2tsZXRfaW5pdCgmcE9iai0+cnhfZG9uZV90YXNrLCByeF9kb25lX3Rhc2tsZXQsICh1bnNpZ25lZCBsb25nKXBBZCk7CisJdGFza2xldF9pbml0KCZwT2JqLT5tZ210X2RtYV9kb25lX3Rhc2ssIG1nbXRfZG1hX2RvbmVfdGFza2xldCwgKHVuc2lnbmVkIGxvbmcpcEFkKTsKKwl0YXNrbGV0X2luaXQoJnBPYmotPmFjMF9kbWFfZG9uZV90YXNrLCBhYzBfZG1hX2RvbmVfdGFza2xldCwgKHVuc2lnbmVkIGxvbmcpcEFkKTsKKwl0YXNrbGV0X2luaXQoJnBPYmotPmFjMV9kbWFfZG9uZV90YXNrLCBhYzFfZG1hX2RvbmVfdGFza2xldCwgKHVuc2lnbmVkIGxvbmcpcEFkKTsKKwl0YXNrbGV0X2luaXQoJnBPYmotPmFjMl9kbWFfZG9uZV90YXNrLCBhYzJfZG1hX2RvbmVfdGFza2xldCwgKHVuc2lnbmVkIGxvbmcpcEFkKTsKKwl0YXNrbGV0X2luaXQoJnBPYmotPmFjM19kbWFfZG9uZV90YXNrLCBhYzNfZG1hX2RvbmVfdGFza2xldCwgKHVuc2lnbmVkIGxvbmcpcEFkKTsKKwl0YXNrbGV0X2luaXQoJnBPYmotPmhjY2FfZG1hX2RvbmVfdGFzaywgaGNjYV9kbWFfZG9uZV90YXNrbGV0LCAodW5zaWduZWQgbG9uZylwQWQpOworCXRhc2tsZXRfaW5pdCgmcE9iai0+dGJ0dF90YXNrLCB0YnR0X3Rhc2tsZXQsICh1bnNpZ25lZCBsb25nKXBBZCk7CisJdGFza2xldF9pbml0KCZwT2JqLT5maWZvX3N0YXRpc3RpY19mdWxsX3Rhc2ssIGZpZm9fc3RhdGlzdGljX2Z1bGxfdGFza2xldCwgKHVuc2lnbmVkIGxvbmcpcEFkKTsKK30KKwordm9pZCBraWxsX3RocmVhZF90YXNrKElOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCVBPU19DT09LSUUgcE9iajsKKworCXBPYmogPSAoUE9TX0NPT0tJRSkgcEFkLT5PU19Db29raWU7CisKKwl0YXNrbGV0X2tpbGwoJnBPYmotPnJ4X2RvbmVfdGFzayk7CisJdGFza2xldF9raWxsKCZwT2JqLT5tZ210X2RtYV9kb25lX3Rhc2spOworCXRhc2tsZXRfa2lsbCgmcE9iai0+YWMwX2RtYV9kb25lX3Rhc2spOworCXRhc2tsZXRfa2lsbCgmcE9iai0+YWMxX2RtYV9kb25lX3Rhc2spOworCXRhc2tsZXRfa2lsbCgmcE9iai0+YWMyX2RtYV9kb25lX3Rhc2spOworCXRhc2tsZXRfa2lsbCgmcE9iai0+YWMzX2RtYV9kb25lX3Rhc2spOworCXRhc2tsZXRfa2lsbCgmcE9iai0+aGNjYV9kbWFfZG9uZV90YXNrKTsKKwl0YXNrbGV0X2tpbGwoJnBPYmotPnRidHRfdGFzayk7CisJdGFza2xldF9raWxsKCZwT2JqLT5maWZvX3N0YXRpc3RpY19mdWxsX3Rhc2spOworfQorCisKK3N0YXRpYyB2b2lkIHJ0Mjg2MF9pbnRfZW5hYmxlKFBSVE1QX0FEQVBURVIgcEFkLCB1bnNpZ25lZCBpbnQgbW9kZSkKK3sKKwl1MzIgcmVnVmFsdWU7CisKKwlwQWQtPmludF9kaXNhYmxlX21hc2sgJj0gfihtb2RlKTsKKwlyZWdWYWx1ZSA9IHBBZC0+aW50X2VuYWJsZV9yZWcgJiB+KHBBZC0+aW50X2Rpc2FibGVfbWFzayk7CisJUlRNUF9JT19XUklURTMyKHBBZCwgSU5UX01BU0tfQ1NSLCByZWdWYWx1ZSk7ICAgICAvLyAxOmVuYWJsZQorCisJaWYgKHJlZ1ZhbHVlICE9IDApCisJCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9BQ1RJVkUpOworfQorCisKK3N0YXRpYyB2b2lkIHJ0Mjg2MF9pbnRfZGlzYWJsZShQUlRNUF9BREFQVEVSIHBBZCwgdW5zaWduZWQgaW50IG1vZGUpCit7CisJdTMyIHJlZ1ZhbHVlOworCisJcEFkLT5pbnRfZGlzYWJsZV9tYXNrIHw9IG1vZGU7CisJcmVnVmFsdWUgPSAJcEFkLT5pbnRfZW5hYmxlX3JlZyAmIH4ocEFkLT5pbnRfZGlzYWJsZV9tYXNrKTsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBJTlRfTUFTS19DU1IsIHJlZ1ZhbHVlKTsgICAgIC8vIDA6IGRpc2FibGUKKworCWlmIChyZWdWYWx1ZSA9PSAwKQorCXsKKwkJUlRNUF9DTEVBUl9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfQUNUSVZFKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIG1nbXRfZG1hX2RvbmVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlQUlRNUF9BREFQVEVSIHBBZCA9IChQUlRNUF9BREFQVEVSKSBkYXRhOworICAgIElOVF9TT1VSQ0VfQ1NSX1NUUlVDCUludFNvdXJjZTsKKwlQT1NfQ09PS0lFIHBPYmo7CisKKwkvLyBEbyBub3RoaW5nIGlmIHRoZSBkcml2ZXIgaXMgc3RhcnRpbmcgaGFsdCBzdGF0ZS4KKwkvLyBUaGlzIG1pZ2h0IGhhcHBlbiB3aGVuIHRpbWVyIGFscmVhZHkgYmVlbiBmaXJlZCBiZWZvcmUgY2FuY2VsIHRpbWVyIHdpdGggbWxtZWhhbHQKKwlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKQorCQlyZXR1cm47CisKKyAgICBwT2JqID0gKFBPU19DT09LSUUpIHBBZC0+T1NfQ29va2llOworCisJSW50U291cmNlLndvcmQgPSAwOworCUludFNvdXJjZS5maWVsZC5NZ210RG1hRG9uZSA9IDE7CisJcEFkLT5pbnRfcGVuZGluZyAmPSB+SU5UX01HTVRfRExZOworCisJUlRNUEhhbmRsZU1nbXRSaW5nRG1hRG9uZUludGVycnVwdChwQWQpOworCisJLy8gaWYgeW91IHVzZSBSVE1QX1NFTV9MT0NLLCBzb21ldGltZXMga2VybmVsIHdpbGwgaGFuZyB1cCwgbm8gYW55CisJLy8gYnVnIHJlcG9ydCBvdXRwdXQKKwlSVE1QX0lOVF9MT0NLKCZwQWQtPmlycV9sb2NrLCBmbGFncyk7CisJLyoKKwkgKiBkb3VibGUgY2hlY2sgdG8gYXZvaWQgbG9zZSBvZiBpbnRlcnJ1cHRzCisJICovCisJaWYgKHBBZC0+aW50X3BlbmRpbmcgJiBJTlRfTUdNVF9ETFkpCisJeworCQl0YXNrbGV0X2hpX3NjaGVkdWxlKCZwT2JqLT5tZ210X2RtYV9kb25lX3Rhc2spOworCQlSVE1QX0lOVF9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuOworCX0KKworCS8qIGVuYWJsZSBUeERhdGFJbnQgYWdhaW4gKi8KKwlydDI4NjBfaW50X2VuYWJsZShwQWQsIElOVF9NR01UX0RMWSk7CisJUlRNUF9JTlRfVU5MT0NLKCZwQWQtPmlycV9sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIHJ4X2RvbmVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlQUlRNUF9BREFQVEVSIHBBZCA9IChQUlRNUF9BREFQVEVSKSBkYXRhOworCUJPT0xFQU4JYlJlc2NoZWR1bGUgPSAwOworCVBPU19DT09LSUUgcE9iajsKKworCS8vIERvIG5vdGhpbmcgaWYgdGhlIGRyaXZlciBpcyBzdGFydGluZyBoYWx0IHN0YXRlLgorCS8vIFRoaXMgbWlnaHQgaGFwcGVuIHdoZW4gdGltZXIgYWxyZWFkeSBiZWVuIGZpcmVkIGJlZm9yZSBjYW5jZWwgdGltZXIgd2l0aCBtbG1laGFsdAorCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyB8IGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpCisJCXJldHVybjsKKworICAgIHBPYmogPSAoUE9TX0NPT0tJRSkgcEFkLT5PU19Db29raWU7CisKKwlwQWQtPmludF9wZW5kaW5nICY9IH4oSU5UX1JYKTsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQliUmVzY2hlZHVsZSA9IFNUQVJ4RG9uZUludGVycnVwdEhhbmRsZShwQWQsIDApOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJUlRNUF9JTlRfTE9DSygmcEFkLT5pcnFfbG9jaywgZmxhZ3MpOworCS8qCisJICogZG91YmxlIGNoZWNrIHRvIGF2b2lkIHJvdHRpbmcgcGFja2V0CisJICovCisJaWYgKHBBZC0+aW50X3BlbmRpbmcgJiBJTlRfUlggfHwgYlJlc2NoZWR1bGUpCisJeworCQl0YXNrbGV0X2hpX3NjaGVkdWxlKCZwT2JqLT5yeF9kb25lX3Rhc2spOworCQlSVE1QX0lOVF9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuOworCX0KKworCS8qIGVuYWJsZSBSeElOVCBhZ2FpbiAqLworCXJ0Mjg2MF9pbnRfZW5hYmxlKHBBZCwgSU5UX1JYKTsKKwlSVE1QX0lOVF9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIGZsYWdzKTsKKworfQorCit2b2lkIGZpZm9fc3RhdGlzdGljX2Z1bGxfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlQUlRNUF9BREFQVEVSIHBBZCA9IChQUlRNUF9BREFQVEVSKSBkYXRhOworCVBPU19DT09LSUUgcE9iajsKKworCS8vIERvIG5vdGhpbmcgaWYgdGhlIGRyaXZlciBpcyBzdGFydGluZyBoYWx0IHN0YXRlLgorCS8vIFRoaXMgbWlnaHQgaGFwcGVuIHdoZW4gdGltZXIgYWxyZWFkeSBiZWVuIGZpcmVkIGJlZm9yZSBjYW5jZWwgdGltZXIgd2l0aCBtbG1laGFsdAorCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyB8IGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpCisJCXJldHVybjsKKworICAgIHBPYmogPSAoUE9TX0NPT0tJRSkgcEFkLT5PU19Db29raWU7CisKKwlwQWQtPmludF9wZW5kaW5nICY9IH4oRmlmb1N0YUZ1bGxJbnQpOworCU5JQ1VwZGF0ZUZpZm9TdGFDb3VudGVycyhwQWQpOworCisJUlRNUF9JTlRfTE9DSygmcEFkLT5pcnFfbG9jaywgZmxhZ3MpOworCS8qCisJICogZG91YmxlIGNoZWNrIHRvIGF2b2lkIHJvdHRpbmcgcGFja2V0CisJICovCisJaWYgKHBBZC0+aW50X3BlbmRpbmcgJiBGaWZvU3RhRnVsbEludCkKKwl7CisJCXRhc2tsZXRfaGlfc2NoZWR1bGUoJnBPYmotPmZpZm9fc3RhdGlzdGljX2Z1bGxfdGFzayk7CisJCVJUTVBfSU5UX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgZmxhZ3MpOworCQlyZXR1cm47CisJfQorCisJLyogZW5hYmxlIFJ4SU5UIGFnYWluICovCisKKwlydDI4NjBfaW50X2VuYWJsZShwQWQsIEZpZm9TdGFGdWxsSW50KTsKKwlSVE1QX0lOVF9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIGZsYWdzKTsKKworfQorCitzdGF0aWMgdm9pZCBoY2NhX2RtYV9kb25lX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJUFJUTVBfQURBUFRFUiBwQWQgPSAoUFJUTVBfQURBUFRFUikgZGF0YTsKKyAgICBJTlRfU09VUkNFX0NTUl9TVFJVQwlJbnRTb3VyY2U7CisJUE9TX0NPT0tJRSBwT2JqOworCisJLy8gRG8gbm90aGluZyBpZiB0aGUgZHJpdmVyIGlzIHN0YXJ0aW5nIGhhbHQgc3RhdGUuCisJLy8gVGhpcyBtaWdodCBoYXBwZW4gd2hlbiB0aW1lciBhbHJlYWR5IGJlZW4gZmlyZWQgYmVmb3JlIGNhbmNlbCB0aW1lciB3aXRoIG1sbWVoYWx0CisJaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkKKwkJcmV0dXJuOworCisgICAgcE9iaiA9IChQT1NfQ09PS0lFKSBwQWQtPk9TX0Nvb2tpZTsKKworCisJSW50U291cmNlLndvcmQgPSAwOworCUludFNvdXJjZS5maWVsZC5IY2NhRG1hRG9uZSA9IDE7CisJcEFkLT5pbnRfcGVuZGluZyAmPSB+SU5UX0hDQ0FfRExZOworCisJUlRNUEhhbmRsZVR4UmluZ0RtYURvbmVJbnRlcnJ1cHQocEFkLCBJbnRTb3VyY2UpOworCisJUlRNUF9JTlRfTE9DSygmcEFkLT5pcnFfbG9jaywgZmxhZ3MpOworCS8qCisJICogZG91YmxlIGNoZWNrIHRvIGF2b2lkIGxvc2Ugb2YgaW50ZXJydXB0cworCSAqLworCWlmIChwQWQtPmludF9wZW5kaW5nICYgSU5UX0hDQ0FfRExZKQorCXsKKwkJdGFza2xldF9oaV9zY2hlZHVsZSgmcE9iai0+aGNjYV9kbWFfZG9uZV90YXNrKTsKKwkJUlRNUF9JTlRfVU5MT0NLKCZwQWQtPmlycV9sb2NrLCBmbGFncyk7CisJCXJldHVybjsKKwl9CisKKwkvKiBlbmFibGUgVHhEYXRhSW50IGFnYWluICovCisJcnQyODYwX2ludF9lbmFibGUocEFkLCBJTlRfSENDQV9ETFkpOworCVJUTVBfSU5UX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBhYzNfZG1hX2RvbmVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlQUlRNUF9BREFQVEVSIHBBZCA9IChQUlRNUF9BREFQVEVSKSBkYXRhOworICAgIElOVF9TT1VSQ0VfQ1NSX1NUUlVDCUludFNvdXJjZTsKKwlQT1NfQ09PS0lFIHBPYmo7CisJQk9PTEVBTiBiUmVzY2hlZHVsZSA9IDA7CisKKwkvLyBEbyBub3RoaW5nIGlmIHRoZSBkcml2ZXIgaXMgc3RhcnRpbmcgaGFsdCBzdGF0ZS4KKwkvLyBUaGlzIG1pZ2h0IGhhcHBlbiB3aGVuIHRpbWVyIGFscmVhZHkgYmVlbiBmaXJlZCBiZWZvcmUgY2FuY2VsIHRpbWVyIHdpdGggbWxtZWhhbHQKKwlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKQorCQlyZXR1cm47CisKKyAgICBwT2JqID0gKFBPU19DT09LSUUpIHBBZC0+T1NfQ29va2llOworCisJSW50U291cmNlLndvcmQgPSAwOworCUludFNvdXJjZS5maWVsZC5BYzNEbWFEb25lID0gMTsKKwlwQWQtPmludF9wZW5kaW5nICY9IH5JTlRfQUMzX0RMWTsKKworCWJSZXNjaGVkdWxlID0gUlRNUEhhbmRsZVR4UmluZ0RtYURvbmVJbnRlcnJ1cHQocEFkLCBJbnRTb3VyY2UpOworCisJUlRNUF9JTlRfTE9DSygmcEFkLT5pcnFfbG9jaywgZmxhZ3MpOworCS8qCisJICogZG91YmxlIGNoZWNrIHRvIGF2b2lkIGxvc2Ugb2YgaW50ZXJydXB0cworCSAqLworCWlmICgocEFkLT5pbnRfcGVuZGluZyAmIElOVF9BQzNfRExZKSB8fCBiUmVzY2hlZHVsZSkKKwl7CisJCXRhc2tsZXRfaGlfc2NoZWR1bGUoJnBPYmotPmFjM19kbWFfZG9uZV90YXNrKTsKKwkJUlRNUF9JTlRfVU5MT0NLKCZwQWQtPmlycV9sb2NrLCBmbGFncyk7CisJCXJldHVybjsKKwl9CisKKwkvKiBlbmFibGUgVHhEYXRhSW50IGFnYWluICovCisJcnQyODYwX2ludF9lbmFibGUocEFkLCBJTlRfQUMzX0RMWSk7CisJUlRNUF9JTlRfVU5MT0NLKCZwQWQtPmlycV9sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIGFjMl9kbWFfZG9uZV90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCVBSVE1QX0FEQVBURVIgcEFkID0gKFBSVE1QX0FEQVBURVIpIGRhdGE7CisgICAgSU5UX1NPVVJDRV9DU1JfU1RSVUMJSW50U291cmNlOworCVBPU19DT09LSUUgcE9iajsKKwlCT09MRUFOIGJSZXNjaGVkdWxlID0gMDsKKworCS8vIERvIG5vdGhpbmcgaWYgdGhlIGRyaXZlciBpcyBzdGFydGluZyBoYWx0IHN0YXRlLgorCS8vIFRoaXMgbWlnaHQgaGFwcGVuIHdoZW4gdGltZXIgYWxyZWFkeSBiZWVuIGZpcmVkIGJlZm9yZSBjYW5jZWwgdGltZXIgd2l0aCBtbG1laGFsdAorCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyB8IGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpCisJCXJldHVybjsKKworICAgIHBPYmogPSAoUE9TX0NPT0tJRSkgcEFkLT5PU19Db29raWU7CisKKwlJbnRTb3VyY2Uud29yZCA9IDA7CisJSW50U291cmNlLmZpZWxkLkFjMkRtYURvbmUgPSAxOworCXBBZC0+aW50X3BlbmRpbmcgJj0gfklOVF9BQzJfRExZOworCisJYlJlc2NoZWR1bGUgPSBSVE1QSGFuZGxlVHhSaW5nRG1hRG9uZUludGVycnVwdChwQWQsIEludFNvdXJjZSk7CisKKwlSVE1QX0lOVF9MT0NLKCZwQWQtPmlycV9sb2NrLCBmbGFncyk7CisKKwkvKgorCSAqIGRvdWJsZSBjaGVjayB0byBhdm9pZCBsb3NlIG9mIGludGVycnVwdHMKKwkgKi8KKwlpZiAoKHBBZC0+aW50X3BlbmRpbmcgJiBJTlRfQUMyX0RMWSkgfHwgYlJlc2NoZWR1bGUpCisJeworCQl0YXNrbGV0X2hpX3NjaGVkdWxlKCZwT2JqLT5hYzJfZG1hX2RvbmVfdGFzayk7CisJCVJUTVBfSU5UX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgZmxhZ3MpOworCQlyZXR1cm47CisJfQorCisJLyogZW5hYmxlIFR4RGF0YUludCBhZ2FpbiAqLworCXJ0Mjg2MF9pbnRfZW5hYmxlKHBBZCwgSU5UX0FDMl9ETFkpOworCVJUTVBfSU5UX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBhYzFfZG1hX2RvbmVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlQUlRNUF9BREFQVEVSIHBBZCA9IChQUlRNUF9BREFQVEVSKSBkYXRhOworICAgIElOVF9TT1VSQ0VfQ1NSX1NUUlVDCUludFNvdXJjZTsKKwlQT1NfQ09PS0lFIHBPYmo7CisJQk9PTEVBTiBiUmVzY2hlZHVsZSA9IDA7CisKKwkvLyBEbyBub3RoaW5nIGlmIHRoZSBkcml2ZXIgaXMgc3RhcnRpbmcgaGFsdCBzdGF0ZS4KKwkvLyBUaGlzIG1pZ2h0IGhhcHBlbiB3aGVuIHRpbWVyIGFscmVhZHkgYmVlbiBmaXJlZCBiZWZvcmUgY2FuY2VsIHRpbWVyIHdpdGggbWxtZWhhbHQKKwlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKQorCQlyZXR1cm47CisKKyAgICBwT2JqID0gKFBPU19DT09LSUUpIHBBZC0+T1NfQ29va2llOworCisJSW50U291cmNlLndvcmQgPSAwOworCUludFNvdXJjZS5maWVsZC5BYzFEbWFEb25lID0gMTsKKwlwQWQtPmludF9wZW5kaW5nICY9IH5JTlRfQUMxX0RMWTsKKworCWJSZXNjaGVkdWxlID0gUlRNUEhhbmRsZVR4UmluZ0RtYURvbmVJbnRlcnJ1cHQocEFkLCBJbnRTb3VyY2UpOworCisJUlRNUF9JTlRfTE9DSygmcEFkLT5pcnFfbG9jaywgZmxhZ3MpOworCS8qCisJICogZG91YmxlIGNoZWNrIHRvIGF2b2lkIGxvc2Ugb2YgaW50ZXJydXB0cworCSAqLworCWlmICgocEFkLT5pbnRfcGVuZGluZyAmIElOVF9BQzFfRExZKSB8fCBiUmVzY2hlZHVsZSkKKwl7CisJCXRhc2tsZXRfaGlfc2NoZWR1bGUoJnBPYmotPmFjMV9kbWFfZG9uZV90YXNrKTsKKwkJUlRNUF9JTlRfVU5MT0NLKCZwQWQtPmlycV9sb2NrLCBmbGFncyk7CisJCXJldHVybjsKKwl9CisKKwkvKiBlbmFibGUgVHhEYXRhSW50IGFnYWluICovCisJcnQyODYwX2ludF9lbmFibGUocEFkLCBJTlRfQUMxX0RMWSk7CisJUlRNUF9JTlRfVU5MT0NLKCZwQWQtPmlycV9sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIGFjMF9kbWFfZG9uZV90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCVBSVE1QX0FEQVBURVIgcEFkID0gKFBSVE1QX0FEQVBURVIpIGRhdGE7CisgICAgSU5UX1NPVVJDRV9DU1JfU1RSVUMJSW50U291cmNlOworCVBPU19DT09LSUUgcE9iajsKKwlCT09MRUFOIGJSZXNjaGVkdWxlID0gMDsKKworCS8vIERvIG5vdGhpbmcgaWYgdGhlIGRyaXZlciBpcyBzdGFydGluZyBoYWx0IHN0YXRlLgorCS8vIFRoaXMgbWlnaHQgaGFwcGVuIHdoZW4gdGltZXIgYWxyZWFkeSBiZWVuIGZpcmVkIGJlZm9yZSBjYW5jZWwgdGltZXIgd2l0aCBtbG1laGFsdAorCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyB8IGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpCisJCXJldHVybjsKKworICAgIHBPYmogPSAoUE9TX0NPT0tJRSkgcEFkLT5PU19Db29raWU7CisKKwlJbnRTb3VyY2Uud29yZCA9IDA7CisJSW50U291cmNlLmZpZWxkLkFjMERtYURvbmUgPSAxOworCXBBZC0+aW50X3BlbmRpbmcgJj0gfklOVF9BQzBfRExZOworCisJYlJlc2NoZWR1bGUgPSBSVE1QSGFuZGxlVHhSaW5nRG1hRG9uZUludGVycnVwdChwQWQsIEludFNvdXJjZSk7CisKKwlSVE1QX0lOVF9MT0NLKCZwQWQtPmlycV9sb2NrLCBmbGFncyk7CisJLyoKKwkgKiBkb3VibGUgY2hlY2sgdG8gYXZvaWQgbG9zZSBvZiBpbnRlcnJ1cHRzCisJICovCisJaWYgKChwQWQtPmludF9wZW5kaW5nICYgSU5UX0FDMF9ETFkpIHx8IGJSZXNjaGVkdWxlKQorCXsKKwkJdGFza2xldF9oaV9zY2hlZHVsZSgmcE9iai0+YWMwX2RtYV9kb25lX3Rhc2spOworCQlSVE1QX0lOVF9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuOworCX0KKworCS8qIGVuYWJsZSBUeERhdGFJbnQgYWdhaW4gKi8KKwlydDI4NjBfaW50X2VuYWJsZShwQWQsIElOVF9BQzBfRExZKTsKKwlSVE1QX0lOVF9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIGZsYWdzKTsKK30KKworCitpbnQgcHJpbnRfaW50X2NvdW50OworCitJUlFfSEFORExFX1RZUEUKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwxOSkpCitydDI4NjBfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pbnN0YW5jZSkKKyNlbHNlCitydDI4NjBfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pbnN0YW5jZSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCisjZW5kaWYKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBkZXZfaW5zdGFuY2U7CisJUFJUTVBfQURBUFRFUiBwQWQgPSBuZXRfZGV2LT5tbF9wcml2OworCUlOVF9TT1VSQ0VfQ1NSX1NUUlVDCUludFNvdXJjZTsKKwlQT1NfQ09PS0lFIHBPYmo7CisKKwlwT2JqID0gKFBPU19DT09LSUUpIHBBZC0+T1NfQ29va2llOworCisKKwkvKiBOb3RlIDAzMzEyMDA4OiB3ZSBjYW4gbm90IHJldHVybiBoZXJlIGJlZm9yZQorCQlSVE1QX0lPX1JFQUQzMihwQWQsIElOVF9TT1VSQ0VfQ1NSLCAmSW50U291cmNlLndvcmQpOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBJTlRfU09VUkNFX0NTUiwgSW50U291cmNlLndvcmQpOworCQlPciBrZXJuZWwgd2lsbCBwYW5pYyBhZnRlciBpZmNvbmZpZyByYTAgZG93biBzb21ldGltZXMgKi8KKworCisJLy8KKwkvLyBJbml0YWwgdGhlIEludGVycnVwdCBzb3VyY2UuCisJLy8KKwlJbnRTb3VyY2Uud29yZCA9IDB4MDAwMDAwMDBMOworLy8JTWN1SW50U291cmNlLndvcmQgPSAweDAwMDAwMDAwTDsKKworCS8vCisJLy8gR2V0IHRoZSBpbnRlcnJ1cHQgc291cmNlcyAmIHNhdmVkIHRvIGxvY2FsIHZhcmlhYmxlCisJLy8KKwkvL1JUTVBfSU9fUkVBRDMyKHBBZCwgd2hlcmUsICZNY3VJbnRTb3VyY2Uud29yZCk7CisJLy9SVE1QX0lPX1dSSVRFMzIocEFkLCAsIE1jdUludFNvdXJjZS53b3JkKTsKKworCS8vCisJLy8gRmxhZyBmT1BfU1RBVFVTX0RPWkUgT24sIG1lYW5zIEFTSUMgcHV0IHRvIHNsZWVwLCBlbGFzZSBtZWFucyBBU0lDSyBXYWtlVXAKKwkvLyBBbmQgYXQgdGhlIHNhbWUgdGltZSwgY2xvY2sgbWF5YmUgdHVybmVkIG9mZiB0aGF0IHNheSB0aGVyZSBpcyBubyBETUEgc2VydmljZS4KKwkvLyB3aGVuIEFTSUMgZ2V0IHRvIHNsZWVwLgorCS8vIFRvIHByZXZlbnQgc3lzdGVtIGhhbmcgb24gcG93ZXIgc2F2aW5nLgorCS8vIFdlIG5lZWQgdG8gY2hlY2sgaXQgYmVmb3JlIGhhbmRsZSB0aGUgSU5UX1NPVVJDRV9DU1IsIEFTSUMgbXVzdCBiZSB3YWtlIHVwLgorCS8vCisJLy8gUlQyNjYxID0+IHdoZW4gQVNJQyBpcyBzbGVlcGluZywgTUFDIHJlZ2lzdGVyIGNhbm5vdCBiZSByZWFkIGFuZCB3cml0dGVuLgorCS8vIFJUMjg2MCA9PiB3aGVuIEFTSUMgaXMgc2xlZXBpbmcsIE1BQyByZWdpc3RlciBjYW4gYmUgcmVhZCBhbmQgd3JpdHRlbi4KKworCXsKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBJTlRfU09VUkNFX0NTUiwgJkludFNvdXJjZS53b3JkKTsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgSU5UX1NPVVJDRV9DU1IsIEludFNvdXJjZS53b3JkKTsgLy8gd3JpdGUgMSB0byBjbGVhcgorCX0KKworCS8vIERvIG5vdGhpbmcgaWYgUmVzZXQgaW4gcHJvZ3Jlc3MKKwlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTKSB8fAorCQlSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUykpCisJeworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDUsMCkKKyAgICAgICAgcmV0dXJuICBJUlFfSEFORExFRDsKKyNlbHNlCisgICAgICAgIHJldHVybjsKKyNlbmRpZgorCX0KKworCS8vCisJLy8gSGFuZGxlIGludGVycnVwdCwgd2FsayB0aHJvdWdoIGFsbCBiaXRzCisJLy8gU2hvdWxkIHN0YXJ0IGZyb20gaGlnaGVzdCBwcmlvcml0eSBpbnRlcnJ1cHQKKwkvLyBUaGUgcHJpb3JpdHkgY2FuIGJlIGFkanVzdCBieSBhbHRlcmluZyBwcm9jZXNzaW5nIGlmIHN0YXRlbWVudAorCS8vCisKKyAgICBwQWQtPmJQQ0ljbGtPZmYgPSBGQUxTRTsKKworCS8vIElmIHJlcXVpcmVkIHNwaW5sb2NrLCBlYWNoIGludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmUgaGFzIHRvIGFjcXVpcmUKKwkvLyBhbmQgcmVsZWFzZSBpdHNlbGYuCisJLy8KKworCS8vIERvIG5vdGhpbmcgaWYgTklDIGRvZXNuJ3QgZXhpc3QKKwlpZiAoSW50U291cmNlLndvcmQgPT0gMHhmZmZmZmZmZikKKwl7CisJCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QgfCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MpOworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDUsMCkKKyAgICAgICAgcmV0dXJuICBJUlFfSEFORExFRDsKKyNlbHNlCisgICAgICAgIHJldHVybjsKKyNlbmRpZgorCX0KKworCWlmIChJbnRTb3VyY2Uud29yZCAmIFR4Q29oZXJlbnQpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCI+Pj5UeENvaGVyZW50PDw8XG4iKSk7CisJCVJUTVBIYW5kbGVSeENvaGVyZW50SW50ZXJydXB0KHBBZCk7CisJfQorCisJaWYgKEludFNvdXJjZS53b3JkICYgUnhDb2hlcmVudCkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIj4+PlJ4Q29oZXJlbnQ8PDxcbiIpKTsKKwkJUlRNUEhhbmRsZVJ4Q29oZXJlbnRJbnRlcnJ1cHQocEFkKTsKKwl9CisKKwlpZiAoSW50U291cmNlLndvcmQgJiBGaWZvU3RhRnVsbEludCkKKwl7CisjaWYgMQorCQlpZiAoKHBBZC0+aW50X2Rpc2FibGVfbWFzayAmIEZpZm9TdGFGdWxsSW50KSA9PSAwKQorCQl7CisJCQkvKiBtYXNrIEZpZm9TdGFGdWxsSW50ICovCisJCQlydDI4NjBfaW50X2Rpc2FibGUocEFkLCBGaWZvU3RhRnVsbEludCk7CisJCQl0YXNrbGV0X2hpX3NjaGVkdWxlKCZwT2JqLT5maWZvX3N0YXRpc3RpY19mdWxsX3Rhc2spOworCQl9CisJCXBBZC0+aW50X3BlbmRpbmcgfD0gRmlmb1N0YUZ1bGxJbnQ7CisjZWxzZQorCQlOSUNVcGRhdGVGaWZvU3RhQ291bnRlcnMocEFkKTsKKyNlbmRpZgorCX0KKworCWlmIChJbnRTb3VyY2Uud29yZCAmIElOVF9NR01UX0RMWSkKKwl7CisJCWlmICgocEFkLT5pbnRfZGlzYWJsZV9tYXNrICYgSU5UX01HTVRfRExZKSA9PTAgKQorCQl7CisJCQlydDI4NjBfaW50X2Rpc2FibGUocEFkLCBJTlRfTUdNVF9ETFkpOworCQkJdGFza2xldF9oaV9zY2hlZHVsZSgmcE9iai0+bWdtdF9kbWFfZG9uZV90YXNrKTsKKwkJfQorCQlwQWQtPmludF9wZW5kaW5nIHw9IElOVF9NR01UX0RMWSA7CisJfQorCisJaWYgKEludFNvdXJjZS53b3JkICYgSU5UX1JYKQorCXsKKwkJaWYgKChwQWQtPmludF9kaXNhYmxlX21hc2sgJiBJTlRfUlgpID09IDApCisJCXsKKwkJCS8qIG1hc2sgUnhJTlQgKi8KKwkJCXJ0Mjg2MF9pbnRfZGlzYWJsZShwQWQsIElOVF9SWCk7CisJCQl0YXNrbGV0X2hpX3NjaGVkdWxlKCZwT2JqLT5yeF9kb25lX3Rhc2spOworCQl9CisJCXBBZC0+aW50X3BlbmRpbmcgfD0gSU5UX1JYOworCX0KKworCWlmIChJbnRTb3VyY2Uud29yZCAmIElOVF9IQ0NBX0RMWSkKKwl7CisKKwkJaWYgKChwQWQtPmludF9kaXNhYmxlX21hc2sgJiBJTlRfSENDQV9ETFkpID09IDApCisJCXsKKwkJCS8qIG1hc2sgVHhEYXRhSW50ICovCisJCQlydDI4NjBfaW50X2Rpc2FibGUocEFkLCBJTlRfSENDQV9ETFkpOworCQkJdGFza2xldF9oaV9zY2hlZHVsZSgmcE9iai0+aGNjYV9kbWFfZG9uZV90YXNrKTsKKwkJfQorCQlwQWQtPmludF9wZW5kaW5nIHw9IElOVF9IQ0NBX0RMWTsKKwl9CisKKwlpZiAoSW50U291cmNlLndvcmQgJiBJTlRfQUMzX0RMWSkKKwl7CisKKwkJaWYgKChwQWQtPmludF9kaXNhYmxlX21hc2sgJiBJTlRfQUMzX0RMWSkgPT0gMCkKKwkJeworCQkJLyogbWFzayBUeERhdGFJbnQgKi8KKwkJCXJ0Mjg2MF9pbnRfZGlzYWJsZShwQWQsIElOVF9BQzNfRExZKTsKKwkJCXRhc2tsZXRfaGlfc2NoZWR1bGUoJnBPYmotPmFjM19kbWFfZG9uZV90YXNrKTsKKwkJfQorCQlwQWQtPmludF9wZW5kaW5nIHw9IElOVF9BQzNfRExZOworCX0KKworCWlmIChJbnRTb3VyY2Uud29yZCAmIElOVF9BQzJfRExZKQorCXsKKworCQlpZiAoKHBBZC0+aW50X2Rpc2FibGVfbWFzayAmIElOVF9BQzJfRExZKSA9PSAwKQorCQl7CisJCQkvKiBtYXNrIFR4RGF0YUludCAqLworCQkJcnQyODYwX2ludF9kaXNhYmxlKHBBZCwgSU5UX0FDMl9ETFkpOworCQkJdGFza2xldF9oaV9zY2hlZHVsZSgmcE9iai0+YWMyX2RtYV9kb25lX3Rhc2spOworCQl9CisJCXBBZC0+aW50X3BlbmRpbmcgfD0gSU5UX0FDMl9ETFk7CisJfQorCisJaWYgKEludFNvdXJjZS53b3JkICYgSU5UX0FDMV9ETFkpCisJeworCisJCXBBZC0+aW50X3BlbmRpbmcgfD0gSU5UX0FDMV9ETFk7CisKKwkJaWYgKChwQWQtPmludF9kaXNhYmxlX21hc2sgJiBJTlRfQUMxX0RMWSkgPT0gMCkKKwkJeworCQkJLyogbWFzayBUeERhdGFJbnQgKi8KKwkJCXJ0Mjg2MF9pbnRfZGlzYWJsZShwQWQsIElOVF9BQzFfRExZKTsKKwkJCXRhc2tsZXRfaGlfc2NoZWR1bGUoJnBPYmotPmFjMV9kbWFfZG9uZV90YXNrKTsKKwkJfQorCisJfQorCisJaWYgKEludFNvdXJjZS53b3JkICYgSU5UX0FDMF9ETFkpCisJeworCQlwQWQtPmludF9wZW5kaW5nIHw9IElOVF9BQzBfRExZOworCisJCWlmICgocEFkLT5pbnRfZGlzYWJsZV9tYXNrICYgSU5UX0FDMF9ETFkpID09IDApCisJCXsKKwkJCS8qIG1hc2sgVHhEYXRhSW50ICovCisJCQlydDI4NjBfaW50X2Rpc2FibGUocEFkLCBJTlRfQUMwX0RMWSk7CisJCQl0YXNrbGV0X2hpX3NjaGVkdWxlKCZwT2JqLT5hYzBfZG1hX2RvbmVfdGFzayk7CisJCX0KKworCX0KKworICAgIGlmIChJbnRTb3VyY2Uud29yZCAmIFByZVRCVFRJbnQpCisJeworCQlSVE1QSGFuZGxlUHJlVEJUVEludGVycnVwdChwQWQpOworCX0KKworCWlmIChJbnRTb3VyY2Uud29yZCAmIFRCVFRJbnQpCisJeworCQlSVE1QSGFuZGxlVEJUVEludGVycnVwdChwQWQpOworCX0KKworCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCXsKKwkJaWYgKEludFNvdXJjZS53b3JkICYgQXV0b1dha2V1cEludCkKKwkJCVJUTVBIYW5kbGVUd2FrZXVwSW50ZXJydXB0KHBBZCk7CisJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQorICAgIHJldHVybiAgSVJRX0hBTkRMRUQ7CisjZW5kaWYKKworfQorCisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgIENoZWNrIHRoZSBjaGlwc2V0IHZlbmRvci9wcm9kdWN0IElELgorCitBcmd1bWVudHM6CisgICAgX2Rldl9wCQkJCVBvaW50IHRvIHRoZSBQQ0kgb3IgVVNCIGRldmljZQorCitSZXR1cm4gVmFsdWU6CisgICAgVFJVRQkJCQlDaGVjayBvaworCUZBTFNFCQkJCUNoZWNrIGZhaWwKKworTm90ZToKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0JPT0xFQU4gUlQyOFhYQ2hpcHNldENoZWNrKAorCUlOIHZvaWQgKl9kZXZfcCkKK3sKKwkvKiBhbHdheXMgVFJVRSAqLworCXJldHVybiBUUlVFOworfQorCisKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1JvdXRpbmUgRGVzY3JpcHRpb246CisgICAgSW5pdCBuZXQgZGV2aWNlIHN0cnVjdHVyZS4KKworQXJndW1lbnRzOgorICAgIF9kZXZfcAkJCQlQb2ludCB0byB0aGUgUENJIG9yIFVTQiBkZXZpY2UKKyAgICAqbmV0X2RldgkJCVBvaW50IHRvIHRoZSBuZXQgZGV2aWNlCisJKnBBZAkJCQl0aGUgcmF4eCBpbnRlcmZhY2UgZGF0YSBwb2ludGVyCisKK1JldHVybiBWYWx1ZToKKyAgICBUUlVFCQkJCUluaXQgb2sKKwlGQUxTRQkJCQlJbml0IGZhaWwKKworTm90ZToKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0JPT0xFQU4gUlQyOFhYTmV0RGV2SW5pdCgKKwlJTiB2b2lkIAkJCQkqX2Rldl9wLAorCUlOIHN0cnVjdCAgbmV0X2RldmljZQkqbmV0X2RldiwKKwlJTiBSVE1QX0FEQVBURVIgCQkqcEFkKQoreworCXN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2ID0gKHN0cnVjdCBwY2lfZGV2ICopX2Rldl9wOworICAgIGNvbnN0IENIQVIJKnByaW50X25hbWU7CisgICAgVUxPTkcJY3NyX2FkZHI7CisKKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDUsMCkKKyAgICBwcmludF9uYW1lID0gcGNpX2RldiA/IHBjaV9uYW1lKHBjaV9kZXYpIDogInJ0Mjg2MCI7CisjZWxzZQorICAgIHByaW50X25hbWUgPSBwY2lfZGV2ID8gcGNpX2Rldi0+c2xvdF9uYW1lIDogInJ0Mjg2MCI7CisjZW5kaWYgLy8gTElOVVhfVkVSU0lPTl9DT0RFIC8vCisKKwluZXRfZGV2LT5iYXNlX2FkZHIgPSAwOworCW5ldF9kZXYtPmlycSA9IDA7CisKKyAgICBpZiAocGNpX3JlcXVlc3RfcmVnaW9ucyhwY2lfZGV2LCBwcmludF9uYW1lKSkKKyAgICAgICAgZ290byBlcnJfb3V0X2ZyZWVfbmV0ZGV2OworCisgICAgLy8gaW50ZXJydXB0IElSUSBudW1iZXIKKyAgICBuZXRfZGV2LT5pcnEgPSBwY2lfZGV2LT5pcnE7CisKKyAgICAvLyBtYXAgcGh5c2ljYWwgYWRkcmVzcyB0byB2aXJ0dWFsIGFkZHJlc3MgZm9yIGFjY2Vzc2luZyByZWdpc3RlcgorICAgIGNzcl9hZGRyID0gKHVuc2lnbmVkIGxvbmcpIGlvcmVtYXAocGNpX3Jlc291cmNlX3N0YXJ0KHBjaV9kZXYsIDApLAorCQkJCQkJCQkJCXBjaV9yZXNvdXJjZV9sZW4ocGNpX2RldiwgMCkpOworCisgICAgaWYgKCFjc3JfYWRkcikKKyAgICB7CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJCSgiaW9yZW1hcCBmYWlsZWQgZm9yIGRldmljZSAlcywgcmVnaW9uIDB4JWxYIEAgMHglbFhcbiIsCisJCQkJcHJpbnRfbmFtZSwgKFVMT05HKXBjaV9yZXNvdXJjZV9sZW4ocGNpX2RldiwgMCksCisJCQkJKFVMT05HKXBjaV9yZXNvdXJjZV9zdGFydChwY2lfZGV2LCAwKSkpOworICAgICAgICBnb3RvIGVycl9vdXRfZnJlZV9yZXM7CisgICAgfQorCisgICAgLy8gU2F2ZSBDU1IgdmlydHVhbCBhZGRyZXNzIGFuZCBpcnEgdG8gZGV2aWNlIHN0cnVjdHVyZQorICAgIG5ldF9kZXYtPmJhc2VfYWRkciA9IGNzcl9hZGRyOworICAgIHBBZC0+Q1NSQmFzZUFkZHJlc3MgPSAoUFVDSEFSKW5ldF9kZXYtPmJhc2VfYWRkcjsKKworICAgIC8vIFNldCBETUEgbWFzdGVyCisgICAgcGNpX3NldF9tYXN0ZXIocGNpX2Rldik7CisKKyAgICBuZXRfZGV2LT5wcml2X2ZsYWdzID0gSU5UX01BSU47CisKKyAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczogYXQgMHglbHgsIFZBIDB4JWx4LCBJUlEgJWQuIFxuIiwKKyAgICAgICAgCW5ldF9kZXYtPm5hbWUsIChVTE9ORylwY2lfcmVzb3VyY2Vfc3RhcnQocGNpX2RldiwgMCksCisJCQkoVUxPTkcpY3NyX2FkZHIsIHBjaV9kZXYtPmlycSkpOworCXJldHVybiBUUlVFOworCisKKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRVJST1IgSEFORExFIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworZXJyX291dF9mcmVlX3JlczoKKyAgICBwY2lfcmVsZWFzZV9yZWdpb25zKHBjaV9kZXYpOworZXJyX291dF9mcmVlX25ldGRldjoKKwkvKiBmcmVlIG5ldGRldiBpbiBjYWxsZXIsIG5vdCBoZXJlICovCisJcmV0dXJuIEZBTFNFOworfQorCisKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1JvdXRpbmUgRGVzY3JpcHRpb246CisgICAgSW5pdCBuZXQgZGV2aWNlIHN0cnVjdHVyZS4KKworQXJndW1lbnRzOgorICAgIF9kZXZfcAkJCQlQb2ludCB0byB0aGUgUENJIG9yIFVTQiBkZXZpY2UKKwkqcEFkCQkJCXRoZSByYXh4IGludGVyZmFjZSBkYXRhIHBvaW50ZXIKKworUmV0dXJuIFZhbHVlOgorICAgIFRSVUUJCQkJQ29uZmlnIG9rCisJRkFMU0UJCQkJQ29uZmlnIGZhaWwKKworTm90ZToKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0JPT0xFQU4gUlQyOFhYUHJvYmVQb3N0Q29uZmlnKAorCUlOIHZvaWQgCQkJCSpfZGV2X3AsCisJSU4gUlRNUF9BREFQVEVSIAkJKnBBZCwKKwlJTiBJTlQzMgkJCQlhcmdjKQoreworCS8qIG5vIHVzZSAqLworCXJldHVybiBUUlVFOworfQorCisKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1JvdXRpbmUgRGVzY3JpcHRpb246CisgICAgRGlzYWJsZSBETUEuCisKK0FyZ3VtZW50czoKKwkqcEFkCQkJCXRoZSByYXh4IGludGVyZmFjZSBkYXRhIHBvaW50ZXIKKworUmV0dXJuIFZhbHVlOgorCU5vbmUKKworTm90ZToKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgUlQyOFhYRE1BRGlzYWJsZSgKKwlJTiBSVE1QX0FEQVBURVIgCQkqcEFkKQoreworCVdQRE1BX0dMT19DRkdfU1RSVUMgICAgIEdsb0NmZzsKKworCisJUlRNUF9JT19SRUFEMzIocEFkLCBXUERNQV9HTE9fQ0ZHLCAmR2xvQ2ZnLndvcmQpOworCUdsb0NmZy53b3JkICY9IDB4ZmYwOworCUdsb0NmZy5maWVsZC5FblRYV3JpdGVCYWNrRERPTkUgPTE7CisJUlRNUF9JT19XUklURTMyKHBBZCwgV1BETUFfR0xPX0NGRywgR2xvQ2ZnLndvcmQpOworfQorCisKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1JvdXRpbmUgRGVzY3JpcHRpb246CisgICAgRW5hYmxlIERNQS4KKworQXJndW1lbnRzOgorCSpwQWQJCQkJdGhlIHJheHggaW50ZXJmYWNlIGRhdGEgcG9pbnRlcgorCitSZXR1cm4gVmFsdWU6CisJTm9uZQorCitOb3RlOgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBSVDI4WFhETUFFbmFibGUoCisJSU4gUlRNUF9BREFQVEVSIAkJKnBBZCkKK3sKKwlXUERNQV9HTE9fQ0ZHX1NUUlVDCUdsb0NmZzsKKwlpbnQgaSA9IDA7CisKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIDB4NCk7CisJZG8KKwl7CisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgV1BETUFfR0xPX0NGRywgJkdsb0NmZy53b3JkKTsKKwkJaWYgKChHbG9DZmcuZmllbGQuVHhETUFCdXN5ID09IDApICAmJiAoR2xvQ2ZnLmZpZWxkLlJ4RE1BQnVzeSA9PSAwKSkKKwkJCWJyZWFrOworCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PiAgRE1BQnVzeVxuIikpOworCQlSVE1QdXNlY0RlbGF5KDEwMDApOworCQlpKys7CisJfXdoaWxlICggaSA8MjAwKTsKKworCVJUTVB1c2VjRGVsYXkoNTApOworCisJR2xvQ2ZnLmZpZWxkLkVuVFhXcml0ZUJhY2tERE9ORSA9IDE7CisJR2xvQ2ZnLmZpZWxkLldQRE1BQnVyc3RTSVpFID0gMjsKKwlHbG9DZmcuZmllbGQuRW5hYmxlUnhETUEgPSAxOworCUdsb0NmZy5maWVsZC5FbmFibGVUeERNQSA9IDE7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT0gV1JJVEUgRE1BIG9mZnNldCAweDIwOCA9IDB4JXhcbiIsIEdsb0NmZy53b3JkKSk7CisJUlRNUF9JT19XUklURTMyKHBBZCwgV1BETUFfR0xPX0NGRywgR2xvQ2ZnLndvcmQpOworCit9CisKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1JvdXRpbmUgRGVzY3JpcHRpb246CisgICAgV3JpdGUgQmVhY29uIGJ1ZmZlciB0byBBc2ljLgorCitBcmd1bWVudHM6CisJKnBBZAkJCQl0aGUgcmF4eCBpbnRlcmZhY2UgZGF0YSBwb2ludGVyCisKK1JldHVybiBWYWx1ZToKKwlOb25lCisKK05vdGU6Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIFJUMjh4eF9VcGRhdGVCZWFjb25Ub0FzaWMoCisJSU4gUlRNUF9BREFQVEVSCQkqcEFkLAorCUlOIElOVAkJCQlhcGlkeCwKKwlJTiBVTE9ORwkJCUZyYW1lTGVuLAorCUlOIFVMT05HCQkJVXBkYXRlUG9zKQoreworCVVMT05HCQkJCUNhcEluZm9Qb3MgPSAwOworCVVDSEFSICAJCQkqcHRyLCAqcHRyX3VwZGF0ZSwgKnB0cl9jYXBpbmZvOworCVVJTlQgIAkJCWk7CisJQk9PTEVBTgkJCWJCY25SZXEgPSBGQUxTRTsKKwlVQ0hBUgkJCWJjbl9pZHggPSAwOworCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlcygpIDogTm8gdmFsaWQgSW50ZXJmYWNlIGJlIGZvdW5kLlxuIiwgX19mdW5jX18pKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChiQmNuUmVxID09IEZBTFNFKQorCXsKKwkJLyogd2hlbiB0aGUgcmEgaW50ZXJmYWNlIGlzIGRvd24sIGRvIG5vdCBzZW5kIGl0cyBiZWFjb24gZnJhbWUgKi8KKwkJLyogY2xlYXIgYWxsIHplcm8gKi8KKwkJZm9yKGk9MDsgaTxUWFdJX1NJWkU7IGkrPTQpCisJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBwQWQtPkJlYWNvbk9mZnNldFtiY25faWR4XSArIGksIDB4MDApOworCX0KKwllbHNlCisJeworCQlwdHIgPSAoUFVDSEFSKSZwQWQtPkJlYWNvblR4V0k7CisjaWZkZWYgUlRfQklHX0VORElBTgorCQlSVE1QV0lFbmRpYW5DaGFuZ2UocHRyLCBUWVBFX1RYV0kpOworI2VuZGlmCisJCWZvciAoaT0wOyBpPFRYV0lfU0laRTsgaSs9NCkgIC8vIDE2LWJ5dGUgVFhXSSBmaWVsZAorCQl7CisJCQlVSU5UMzIgbG9uZ3B0ciA9ICAqcHRyICsgKCoocHRyKzEpPDw4KSArICgqKHB0cisyKTw8MTYpICsgKCoocHRyKzMpPDwyNCk7CisJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBwQWQtPkJlYWNvbk9mZnNldFtiY25faWR4XSArIGksIGxvbmdwdHIpOworCQkJcHRyICs9IDQ7CisJCX0KKworCQkvLyBVcGRhdGUgQ2FwYWJpbGl0eUluZm8gaW4gQmVhY29uCisJCWZvciAoaSA9IENhcEluZm9Qb3M7IGkgPCAoQ2FwSW5mb1BvcysyKTsgaSsrKQorCQl7CisJCQlSVE1QX0lPX1dSSVRFOChwQWQsIHBBZC0+QmVhY29uT2Zmc2V0W2Jjbl9pZHhdICsgVFhXSV9TSVpFICsgaSwgKnB0cl9jYXBpbmZvKTsKKwkJCXB0cl9jYXBpbmZvICsrOworCQl9CisKKwkJaWYgKEZyYW1lTGVuID4gVXBkYXRlUG9zKQorCQl7CisJCQlmb3IgKGk9IFVwZGF0ZVBvczsgaTwgKEZyYW1lTGVuKTsgaSsrKQorCQkJeworCQkJCVJUTVBfSU9fV1JJVEU4KHBBZCwgcEFkLT5CZWFjb25PZmZzZXRbYmNuX2lkeF0gKyBUWFdJX1NJWkUgKyBpLCAqcHRyX3VwZGF0ZSk7CisJCQkJcHRyX3VwZGF0ZSArKzsKKwkJCX0KKwkJfQorCisJfQorCit9CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKK1ZPSUQgUlRNUEluaXRQQ0llTGlua0N0cmxWYWx1ZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCkKK3sKK30KKworVk9JRCBSVE1QRmluZEhvc3RQQ0lEZXYoCisgICAgSU4JUFJUTVBfQURBUFRFUglwQWQpCit7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCisJQXJndW1lbnRzOgorCQlMZXZlbCA9IFJFU1RPUkVfSEFMVCA6IFJlc3RvcmUgUENJIGhvc3QgYW5kIFJhbGluayBQQ0llIExpbmsgQ29udHJvbCBmaWVsZCB0byBpdHMgZGVmYXVsdCB2YWx1ZS4KKwkJTGV2ZWwgPSBPdGhlciBWYWx1ZSA6IFJlc3RvcmUgZnJvbSBkb3QxMSBwb3dlciBzYXZlIG9yIHJhZGlvIG9mZiBzdGF0dXMuIEFuZCBmb3JjZSBQQ0kgaG9zdCBMaW5rIENvbnRyb2wgZmllbGRzIHRvIDB4MQorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBSVE1QUENJZUxpbmtDdHJsVmFsdWVSZXN0b3JlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOICAgVUNIQVIJCUxldmVsKQoreworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKworCUFyZ3VtZW50czoKKwkJTWF4IDogbGltaXQgSG9zdCBQQ0kgYW5kIFJhbGluayBQQ0llIGRldmljZSdzIExJTksgQ09OVFJPTCBmaWVsZCdzIHZhbHVlLgorCQlCZWNhdXNlIG5vdyBmcmVxdWVudGx5IHNldCBvdXIgZGV2aWNlIHRvIG1vZGUgMSBvciBtb2RlIDMgd2lsbCBjYXVzZSBwcm9ibGVtLgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBSVE1QUENJZUxpbmtDdHJsU2V0dGluZygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiAJVVNIT1JUCQlNYXgpCit7Cit9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKK1ZPSUQgcnQyODYwX3N0b3Aoc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpCit7CisgICAgUFJUTVBfQURBUFRFUiBwQWQgPSAoUFJUTVBfQURBUFRFUilOVUxMOworICAgIGlmIChuZXRfZGV2ID09IE5VTEwpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJuZXRfZGV2ID09IE5VTEwhXG4iKSk7CisJfQorCWVsc2UKKwkJcEFkID0gbmV0X2Rldi0+bWxfcHJpdjsKKworCWlmIChwQWQgIT0gTlVMTCkKKwl7CisJICAgIC8vIHN0b3AgaW50ZXJmYWNlCisJCW5ldGlmX2NhcnJpZXJfb2ZmKG5ldF9kZXYpOworCQluZXRpZl9zdG9wX3F1ZXVlKG5ldF9kZXYpOworCisJCS8vIG1hcmsgZGV2aWNlIGFzIHJlbW92ZWQgZnJvbSBzeXN0ZW0gYW5kIHRoZXJlZm9yZSBubyBsb25nZXIgYXZhaWxhYmxlCisJCW5ldGlmX2RldmljZV9kZXRhY2gobmV0X2Rldik7CisKKwkJLy8gbWFyayBoYWx0IGZsYWcKKwkJUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyk7CisJCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JBRElPX09GRik7CisKKwkJLy8gdGFrZSBkb3duIHRoZSBkZXZpY2UKKwkJcnQyOHh4X2Nsb3NlKChQTkVUX0RFViluZXRfZGV2KTsKKwkJUlRfTU9EX0RFQ19VU0VfQ09VTlQoKTsKKwl9CisgICAgcmV0dXJuOworfQorCisvKgorICogaW52YWlsZCBvciB3cml0ZWJhY2sgY2FjaGUKKyAqIGFuZCBjb252ZXJ0IHZpcnR1YWwgYWRkcmVzcyB0byBwaHlzaWNhbCBhZGRyZXNzCisgKi8KK2RtYV9hZGRyX3QgbGludXhfcGNpX21hcF9zaW5nbGUodm9pZCAqaGFuZGxlLCB2b2lkICpwdHIsIHNpemVfdCBzaXplLCBpbnQgc2RfaWR4LCBpbnQgZGlyZWN0aW9uKQoreworCVBSVE1QX0FEQVBURVIgcEFkOworCVBPU19DT09LSUUgcE9iajsKKworCS8qCisJCS0tLS0tLSBQb3J0aW5nIEluZm9ybWF0aW9uIC0tLS0tLQorCQk+IEZvciBUeCBBbGxvYzoKKwkJCW1nbXQgcGFja2V0cyA9PiBzZF9pZHggPSAwCisJCQlTd0lkeDogcEFkLT5NZ210UmluZy5UeENwdUlkeAorCQkJcFR4RCA6IHBBZC0+TWdtdFJpbmcuQ2VsbFtTd0lkeF0uQWxsb2NWYTsKKworCQkJZGF0YSBwYWNrZXRzID0+IHNkX2lkeCA9IDEKKwkgCQlUeElkeCA6IHBBZC0+VHhSaW5nW3BUeEJsay0+UXVlSWR4XS5UeENwdUlkeAorCSAJCVF1ZUlkeDogcFR4QmxrLT5RdWVJZHgKKwkgCQlwVHhEICA6IHBBZC0+VHhSaW5nW3BUeEJsay0+UXVlSWR4XS5DZWxsW1R4SWR4XS5BbGxvY1ZhOworCisJIAk+IEZvciBSeCBBbGxvYzoKKwkgCQlzZF9pZHggPSAtMQorCSovCisKKwlwQWQgPSAoUFJUTVBfQURBUFRFUiloYW5kbGU7CisJcE9iaiA9IChQT1NfQ09PS0lFKXBBZC0+T1NfQ29va2llOworCisJaWYgKHNkX2lkeCA9PSAxKQorCXsKKwkJUFRYX0JMSwkJcFR4QmxrOworCQlwVHhCbGsgPSAoUFRYX0JMSylwdHI7CisJCXJldHVybiBwY2lfbWFwX3NpbmdsZShwT2JqLT5wY2lfZGV2LCBwVHhCbGstPnBTcmNCdWZEYXRhLCBwVHhCbGstPlNyY0J1ZkxlbiwgZGlyZWN0aW9uKTsKKwl9CisJZWxzZQorCXsKKwkJcmV0dXJuIHBjaV9tYXBfc2luZ2xlKHBPYmotPnBjaV9kZXYsIHB0ciwgc2l6ZSwgZGlyZWN0aW9uKTsKKwl9CisKK30KKwordm9pZCBsaW51eF9wY2lfdW5tYXBfc2luZ2xlKHZvaWQgKmhhbmRsZSwgZG1hX2FkZHJfdCBkbWFfYWRkciwgc2l6ZV90IHNpemUsIGludCBkaXJlY3Rpb24pCit7CisJUFJUTVBfQURBUFRFUiBwQWQ7CisJUE9TX0NPT0tJRSBwT2JqOworCisJcEFkPShQUlRNUF9BREFQVEVSKWhhbmRsZTsKKwlwT2JqID0gKFBPU19DT09LSUUpcEFkLT5PU19Db29raWU7CisKKwlwY2lfdW5tYXBfc2luZ2xlKHBPYmotPnBjaV9kZXYsIGRtYV9hZGRyLCBzaXplLCBkaXJlY3Rpb24pOworCit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjQ0ZTVlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9LY29uZmlnCkBAIC0wLDAgKzEsNSBAQAorY29uZmlnIFJUMjg2MAorCXRyaXN0YXRlICJSYWxpbmsgMjg2MCB3aXJlbGVzcyBzdXBwb3J0IgorCWRlcGVuZHMgb24gUENJICYmIFg4NiAmJiBXTEFOXzgwMjExCisJLS0taGVscC0tLQorCSAgVGhpcyBpcyBhbiBleHBlcmltZW50YWwgZHJpdmVyIGZvciB0aGUgUmFsaW5rIDI4NjAgd2lyZWxlc3MgY2hpcC4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxNjIyMTIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL01ha2VmaWxlCkBAIC0wLDAgKzEsNDMgQEAKK29iai0kKENPTkZJR19SVDI4NjApCSs9IHJ0Mjg2MHN0YS5vCisKKyMgVE9ETzogYWxsIG9mIHRoZXNlIHNob3VsZCBiZSByZW1vdmVkCitFWFRSQV9DRkxBR1MgKz0gLURMSU5VWCAtREFHR1JFR0FUSU9OX1NVUFBPUlQgLURQSUdHWUJBQ0tfU1VQUE9SVCAtRFdNTV9TVVBQT1JUCitFWFRSQV9DRkxBR1MgKz0gLURSVDI4NjAKK0VYVFJBX0NGTEFHUyArPSAtRENPTkZJR19TVEFfU1VQUE9SVAorRVhUUkFfQ0ZMQUdTICs9IC1EREJHCitFWFRSQV9DRkxBR1MgKz0gLURET1QxMV9OX1NVUFBPUlQKK0VYVFJBX0NGTEFHUyArPSAtRFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKK0VYVFJBX0NGTEFHUyArPSAtRE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisKK3J0Mjg2MHN0YS1vYmpzIDo9CVwKKwljb21tb24vbWQ1Lm8JCVwKKwljb21tb24vbWxtZS5vCQlcCisJY29tbW9uL3J0bXBfd2VwLm8JXAorCWNvbW1vbi9hY3Rpb24ubwkJXAorCWNvbW1vbi9jbW1fZGF0YS5vCVwKKwljb21tb24vcnRtcF9pbml0Lm8JXAorCWNvbW1vbi9ydG1wX3RraXAubwlcCisJY29tbW9uL2NtbV9zeW5jLm8JXAorCWNvbW1vbi9lZXByb20ubwkJXAorCWNvbW1vbi9jbW1fc2FuaXR5Lm8JXAorCWNvbW1vbi9jbW1faW5mby5vCVwKKwljb21tb24vY21tX3dwYS5vCVwKKwljb21tb24vZGZzLm8JCVwKKwljb21tb24vc3BlY3RydW0ubwlcCisJc3RhL2Fzc29jLm8JCVwKKwlzdGEvYWlyb25ldC5vCQlcCisJc3RhL2F1dGgubwkJXAorCXN0YS9hdXRoX3JzcC5vCQlcCisJc3RhL3N5bmMubwkJXAorCXN0YS9zYW5pdHkubwkJXAorCXN0YS9ydG1wX2RhdGEubwkJXAorCXN0YS9jb25uZWN0Lm8JCVwKKwlzdGEvd3BhLm8JCVwKKwlydF9saW51eC5vCQlcCisJcnRfcHJvZmlsZS5vCQlcCisJcnRfbWFpbl9kZXYubwkJXAorCXN0YV9pb2N0bC5vCQlcCisJY29tbW9uL2JhX2FjdGlvbi5vCVwKKwljb21tb24vMjg2MF9ydG1wX2luaXQubwlcCisJMjg2MF9tYWluX2Rldi5vCQlcCisJY29tbW9uL2NtbV9kYXRhXzI4NjAubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9UT0RPIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9UT0RPCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmNzBiMGYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL1RPRE8KQEAgLTAsMCArMSwxNyBAQAorSSdtIGhlc2l0YW50IHRvIGFkZCBhIFRPRE8gZmlsZSBoZXJlLCBhcyB0aGUgd2lyZWxlc3MgZGV2ZWxvcGVycyB3b3VsZAorcmVhbGx5IGhhdmUgcGVvcGxlIGhlbHAgdGhlbSBvdXQgb24gdGhlICJjbGVhbiIgcnQyODYwIGRyaXZlciB0aGF0IGNhbgorYmUgZm91bmQgYXQgdGhlIHJ0Mjg2MC5zZi5uZXQgc2l0ZS4KKworQnV0LCBpZiB5b3Ugd2lzaCB0byBjbGVhbiB1cCB0aGlzIGRyaXZlciBpbnN0ZWFkLCBoZXJlJ3MgYSBzaG9ydCBsaXN0IG9mCit0aGluZ3MgdGhhdCBuZWVkIHRvIGJlIGRvbmUgdG8gZ2V0IGl0IGludG8gYSBtb3JlIG1lcmdhYmxlIHNoYXBlOgorCitUT0RPOgorCS0gY2hlY2twYXRjaC5wbCBjbGVhbgorCS0gc3BhcnNlIGNsZWFuCisJLSBwb3J0IHRvIGluLWtlcm5lbCA4MDIxMSBzdGFjaworCS0gcmVtb3ZlIHJlYWRpbmcgZnJvbSAvZXRjLyBjb25maWcgZmlsZXMKKwktIHJldmlldyBieSB0aGUgd2lyZWxlc3MgZGV2ZWxvcGVyIGNvbW11bml0eQorCitQbGVhc2Ugc2VuZCBhbnkgcGF0Y2hlcyBvciBjb21wbGFpbnRzIGFib3V0IHRoaXMgZHJpdmVyIHRvIEdyZWcKK0tyb2FoLUhhcnRtYW4gPGdyZWdAa3JvYWguY29tPiBhbmQgZG9uJ3QgYm90aGVyIHRoZSB1cHN0cmVhbSB3aXJlbGVzcwora2VybmVsIGRldmVsb3BlcnMgYWJvdXQgaXQsIHRoZXkgd2FudCBub3RoaW5nIHRvIGRvIHdpdGggaXQuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2Fpcm9uZXQuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvYWlyb25ldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlMDdiMTkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2Fpcm9uZXQuaApAQCAtMCwwICsxLDIxMCBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwlNb2R1bGUgTmFtZToKKwlhaXJvbmV0LmgKKworCUFic3RyYWN0OgorCisJUmV2aXNpb24gSGlzdG9yeToKKwlXaG8JCQlXaGVuCQkJV2hhdAorCS0tLS0tLS0tCS0tLS0tLS0tLS0JCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlOYW1lCQlEYXRlCQkJTW9kaWZpY2F0aW9uIGxvZ3MKKwlQYXVsIExpbgkwNC0wNi0xNQkJSW5pdGlhbAorKi8KKworI2lmbmRlZglfX0FJUk9ORVRfSF9fCisjZGVmaW5lCV9fQUlST05FVF9IX18KKworLy8gTWVhc3VyZW1lbnQgVHlwZSBkZWZpbml0aW9uCisjZGVmaW5lCU1TUk5fVFlQRV9VTlVTRUQJCQkJMAorI2RlZmluZQlNU1JOX1RZUEVfQ0hBTk5FTF9MT0FEX1JFUQkJMQorI2RlZmluZQlNU1JOX1RZUEVfTk9JU0VfSElTVF9SRVEJCTIKKyNkZWZpbmUJTVNSTl9UWVBFX0JFQUNPTl9SRVEJCQkzCisjZGVmaW5lCU1TUk5fVFlQRV9GUkFNRV9SRVEJCQkJNAorCisvLyBTY2FuIE1vZGUgaW4gQmVhY29uIFJlcXVlc3QKKyNkZWZpbmUJTVNSTl9TQ0FOX01PREVfUEFTU0lWRQkJCTAKKyNkZWZpbmUJTVNSTl9TQ0FOX01PREVfQUNUSVZFCQkJMQorI2RlZmluZQlNU1JOX1NDQU5fTU9ERV9CRUFDT05fVEFCTEUJCTIKKworLy8gUEhZIHR5cGUgZGVmaW5pdGlvbiBmb3IgQWlyb25ldCBiZWFjb24gcmVwb3J0LCBDQ1ggMiB0YWJsZSAzNi05CisjZGVmaW5lCVBIWV9GSAkJCQkJCQkxCisjZGVmaW5lCVBIWV9EU1MJCQkJCQkJMgorI2RlZmluZQlQSFlfVU5VU0VECQkJCQkJMworI2RlZmluZQlQSFlfT0ZETQkJCQkJCTQKKyNkZWZpbmUJUEhZX0hSX0RTUwkJCQkJCTUKKyNkZWZpbmUJUEhZX0VSUAkJCQkJCQk2CisKKy8vIFJQSSB0YWJsZSBpbiBkQm0KKyNkZWZpbmUJUlBJXzAJCQkwCQkJLy8JUG93ZXIgPD0gLTg3CisjZGVmaW5lCVJQSV8xCQkJMQkJCS8vCS04NyA8IFBvd2VyIDw9IC04MgorI2RlZmluZQlSUElfMgkJCTIJCQkvLwktODIgPCBQb3dlciA8PSAtNzcKKyNkZWZpbmUJUlBJXzMJCQkzCQkJLy8JLTc3IDwgUG93ZXIgPD0gLTcyCisjZGVmaW5lCVJQSV80CQkJNAkJCS8vCS03MiA8IFBvd2VyIDw9IC02NworI2RlZmluZQlSUElfNQkJCTUJCQkvLwktNjcgPCBQb3dlciA8PSAtNjIKKyNkZWZpbmUJUlBJXzYJCQk2CQkJLy8JLTYyIDwgUG93ZXIgPD0gLTU3CisjZGVmaW5lCVJQSV83CQkJNwkJCS8vCS01NyA8IFBvd2VyCisKKy8vIENpc2NvIEFpcm9uZXQgSUFQUCBkZWZpbmV0aW9ucworI2RlZmluZQlBSVJPTkVUX0lBUFBfVFlQRQkJCQkJMHgzMgorI2RlZmluZQlBSVJPTkVUX0lBUFBfU1VCVFlQRV9SRVFVRVNUCQkweDAxCisjZGVmaW5lCUFJUk9ORVRfSUFQUF9TVUJUWVBFX1JFUE9SVAkJCTB4ODEKKworLy8gTWVhc3VyZW1lbnQgUmVxdWVzdCBkZXRhaWwgZm9ybWF0Cit0eXBlZGVmCXN0cnVjdAlfTUVBU1VSRU1FTlRfUkVRVUVTVAl7CisJVUNIQVIJQ2hhbm5lbDsKKwlVQ0hBUglTY2FuTW9kZTsJCQkvLyBVc2Ugb25seSBpbiBiZWFjb24gcmVxdWVzdCwgb3RoZXIgcmVxdWVzdHMgZGlkIG5vdCB1c2UgdGhpcyBmaWVsZAorCVVTSE9SVAlEdXJhdGlvbjsKK30JTUVBU1VSRU1FTlRfUkVRVUVTVCwgKlBNRUFTVVJFTUVOVF9SRVFVRVNUOworCisvLyBCZWFjb24gTWVhc3VyZW1lbnQgUmVwb3J0CisvLyBBbGwgdGhlc2UgZmllbGQgbWlnaHQgY2hhbmdlIHRvIFVDSEFSLCBiZWNhdXNlIHdlIGRpZG4ndCBkbyBhbnl0aGluZyB0byB0aGVzZSByZXBvcnQuCisvLyBXZSBjb3B5IGFsbCB0aGVzZSBiZWFjb25zIGFuZCByZXBvcnQgdG8gQ0NYIDIgQVAuCit0eXBlZGVmCXN0cnVjdAlfQkVBQ09OX1JFUE9SVAl7CisJVUNIQVIJQ2hhbm5lbDsKKwlVQ0hBUglTcGFyZTsKKwlVU0hPUlQJRHVyYXRpb247CisJVUNIQVIJUGh5VHlwZTsJCQkvLyBEZWZpbmlhdGlvbiBpcyBsaXN0ZWQgYWJvdmUgdGFibGUgMzYtOQorCVVDSEFSCVJ4UG93ZXI7CisJVUNIQVIJQlNTSURbNl07CisJVUNIQVIJUGFyZW50VFNGWzRdOworCVVDSEFSCVRhcmdldFRTRls4XTsKKwlVU0hPUlQJQmVhY29uSW50ZXJ2YWw7CisJVVNIT1JUCUNhcGFiaWxpdHlJbmZvOworfQlCRUFDT05fUkVQT1JULCAqUEJFQUNPTl9SRVBPUlQ7CisKKy8vIEZyYW1lIE1lYXN1cmVtZW50IFJlcG9ydCAoT3B0aW9uYWwpCit0eXBlZGVmCXN0cnVjdAlfRlJBTUVfUkVQT1JUCXsKKwlVQ0hBUglDaGFubmVsOworCVVDSEFSCVNwYXJlOworCVVTSE9SVAlEdXJhdGlvbjsKKwlVQ0hBUglUQTsKKwlVQ0hBUglCU1NJRFs2XTsKKwlVQ0hBUglSU1NJOworCVVDSEFSCUNvdW50OworfQlGUkFNRV9SRVBPUlQsICpQRlJBTUVfUkVQT1JUOworCisjcHJhZ21hIHBhY2soMSkKKy8vIENoYW5uZWwgTG9hZCBSZXBvcnQKK3R5cGVkZWYJc3RydWN0CV9DSEFOTkVMX0xPQURfUkVQT1JUCXsKKwlVQ0hBUglDaGFubmVsOworCVVDSEFSCVNwYXJlOworCVVTSE9SVAlEdXJhdGlvbjsKKwlVQ0hBUglDQ0FCdXN5OworfQlDSEFOTkVMX0xPQURfUkVQT1JULCAqUENIQU5ORUxfTE9BRF9SRVBPUlQ7CisjcHJhZ21hIHBhY2soKQorCisvLyBOb3NpZSBIaXN0b2dyYW0gUmVwb3J0Cit0eXBlZGVmCXN0cnVjdAlfTk9JU0VfSElTVF9SRVBPUlQJeworCVVDSEFSCUNoYW5uZWw7CisJVUNIQVIJU3BhcmU7CisJVVNIT1JUCUR1cmF0aW9uOworCVVDSEFSCURlbnNpdHlbOF07Cit9CU5PSVNFX0hJU1RfUkVQT1JULCAqUE5PSVNFX0hJU1RfUkVQT1JUOworCisvLyBSYWRpbyBNYW5hZ2VtZW50IENhcGFiaWxpdHkgZWxlbWVudAordHlwZWRlZglzdHJ1Y3QJX1JBRElPX01BTkFHRU1FTlRfQ0FQQUJJTElUWQl7CisJVUNIQVIJRWlkOwkJCQkvLyBUT0RPOiBXaHkgdGhlIEVpZCBpcyAxIGJ5dGUsIG5vdCBub3JtYWwgMiBieXRlcz8/PworCVVDSEFSCUxlbmd0aDsKKwlVQ0hBUglBaXJvbmV0T3VpWzNdOwkJLy8gQUlyb25ldCBPVUkgKDAwIDQwIDk2KQorCVVDSEFSCVR5cGU7CQkJCS8vIFR5cGUgLyBWZXJzaW9uCisJVVNIT1JUCVN0YXR1czsJCQkJLy8gc3dhcDE2IHJlcXVpcmVkCit9CVJBRElPX01BTkFHRU1FTlRfQ0FQQUJJTElUWSwgKlBSQURJT19NQU5BR0VNRU5UX0NBUEFCSUxJVFk7CisKKy8vIE1lYXN1cmVtZW50IE1vZGUgQml0IGRlZmluaXRpb24KK3R5cGVkZWYJc3RydWN0CV9NRUFTVVJFTUVOVF9NT0RFCXsKKwlVQ0hBUglSc3ZkOjQ7CisJVUNIQVIJUmVwb3J0OjE7CisJVUNIQVIJTm90VXNlZDoxOworCVVDSEFSCUVuYWJsZToxOworCVVDSEFSCVBhcmFsbGVsOjE7Cit9CU1FQVNVUkVNRU5UX01PREUsICpQTUVBU1VSRU1FTlRfTU9ERTsKKworLy8gTWVhc3VyZW1lbnQgUmVxdWVzdCBlbGVtZW50LCBUaGlzIGlzIGxpdHRsZSBlbmRpYW4gbW9kZQordHlwZWRlZglzdHJ1Y3QJX01FQVNVUkVNRU5UX1JFUVVFU1RfRUxFTUVOVAl7CisJVVNIT1JUCQkJCUVpZDsKKwlVU0hPUlQJCQkJTGVuZ3RoOwkJCQkvLyBzd2FwMTYgcmVxdWlyZWQKKwlVU0hPUlQJCQkJVG9rZW47CQkJCS8vIG5vbi16ZXJvIHVuaXF1ZSB0b2tlbgorCVVDSEFSCQkJCU1vZGU7CQkJCS8vIE1lYXN1cmVtZW50IE1vZGUKKwlVQ0hBUgkJCQlUeXBlOwkJCQkvLyBNZWFzdXJlbWVudCB0eXBlCit9CU1FQVNVUkVNRU5UX1JFUVVFU1RfRUxFTUVOVCwgKlBNRUFTVVJFTUVOVF9SRVFVRVNUX0VMRU1FTlQ7CisKKy8vIE1lYXN1cmVtZW50IFJlcG9ydCBlbGVtZW50LCBUaGlzIGlzIGxpdHRsZSBlbmRpYW4gbW9kZQordHlwZWRlZglzdHJ1Y3QJX01FQVNVUkVNRU5UX1JFUE9SVF9FTEVNRU5UCXsKKwlVU0hPUlQJCQkJRWlkOworCVVTSE9SVAkJCQlMZW5ndGg7CQkJCS8vIHN3YXAxNiByZXF1aXJlZAorCVVTSE9SVAkJCQlUb2tlbjsJCQkJLy8gbm9uLXplcm8gdW5pcXVlIHRva2VuCisJVUNIQVIJCQkJTW9kZTsJCQkJLy8gTWVhc3VyZW1lbnQgTW9kZQorCVVDSEFSCQkJCVR5cGU7CQkJCS8vIE1lYXN1cmVtZW50IHR5cGUKK30JTUVBU1VSRU1FTlRfUkVQT1JUX0VMRU1FTlQsICpQTUVBU1VSRU1FTlRfUkVQT1JUX0VMRU1FTlQ7CisKKy8vIENpc2NvIEFpcm9uZXQgSUFQUCBGcmFtZSBIZWFkZXIsIE5ldHdvcmsgYnl0ZSBvcmRlciB1c2VkCit0eXBlZGVmCXN0cnVjdAlfQUlST05FVF9JQVBQX0hFQURFUiB7CisJVUNIQVIJQ2lzY29TbmFwSGVhZGVyWzhdOwkvLyA4IGJ5dGVzIENpc2NvIHNuYXAgaGVhZGVyCisJVVNIT1JUCUxlbmd0aDsJCQkJLy8gSUFQUCBJRCAmIGxlbmd0aCwgcmVtZW1iZXIgdG8gc3dhcDE2IGluIExFIHN5c3RlbQorCVVDSEFSCVR5cGU7CQkJCS8vIElBUFAgdHlwZQorCVVDSEFSCVN1YlR5cGU7CQkJLy8gSUFQUCBzdWJ0eXBlCisJVUNIQVIJREFbNl07CQkJCS8vIERlc3RpbmF0aW9uIE1BQyBhZGRyZXNzCisJVUNIQVIJU0FbNl07CQkJCS8vIFNvdXJjZSBNQUMgYWRkcmVzcworCVVTSE9SVAlUb2tlbjsJCQkJLy8gRGlhbG9nIHRva2VuLCBubyBuZWVkIHRvIHN3YXAxNiBzaW5jZSBpdCBpcyBmb3IgeW9rZW4gdXNhZ2Ugb25seQorfQlBSVJPTkVUX0lBUFBfSEVBREVSLCAqUEFJUk9ORVRfSUFQUF9IRUFERVI7CisKKy8vIFJhZGlvIE1lYXN1cmVtZW50IFJlcXVlc3QgZnJhbWUKK3R5cGVkZWYJc3RydWN0CV9BSVJPTkVUX1JNX1JFUVVFU1RfRlJBTUUJeworICAgIEFJUk9ORVRfSUFQUF9IRUFERVIJSUFQUDsJCQkvLyBDb21tb24gaGVhZGVyCisJVUNIQVIJCQkJRGVsYXk7CQkJLy8gQWN0aXZhdGlvbiBEZWxheQorCVVDSEFSCQkJCU9mZnNldDsJCQkvLyBNZWFzdXJlbWVudCBvZmZzZXQKK30JQUlST05FVF9STV9SRVFVRVNUX0ZSQU1FLCAqUEFJUk9ORVRfUk1fUkVRVUVTVF9GUkFNRTsKKworLy8gUmFkaW8gTWVhc3VyZW1lbnQgUmVwb3J0IGZyYW1lCit0eXBlZGVmCXN0cnVjdAlfQUlST05FVF9STV9SRVBPUlRfRlJBTUUJeworICAgIEFJUk9ORVRfSUFQUF9IRUFERVIJSUFQUDsJCQkvLyBDb21tb24gaGVhZGVyCit9CUFJUk9ORVRfUk1fUkVQT1JUX0ZSQU1FLCAqUEFJUk9ORVRfUk1fUkVQT1JUX0ZSQU1FOworCisvLyBTYXZlZCBlbGVtZW50IHJlcXVlc3QgYWN0aW9ucyB3aGljaCB3aWxsIHNhdmVkIGluIFN0YUNmZy4KK3R5cGVkZWYJc3RydWN0CV9STV9SRVFVRVNUX0FDVElPTgl7CisJTUVBU1VSRU1FTlRfUkVRVUVTVF9FTEVNRU5UCVJlcUVsZW07CQkvLyBTYXZlZCByZXF1ZXN0IGVsZW1lbnQKKwlNRUFTVVJFTUVOVF9SRVFVRVNUCQkJTWVhc3VyZW1lbnQ7CS8vIFNhdmVkIG1lYXN1cmVtZW50IHdpdGhpbiB0aGUgcmVxdWVzdCBlbGVtZW50Cit9CVJNX1JFUVVFU1RfQUNUSU9OLCAqUFJNX1JFUVVFU1RfQUNUSU9OOworCisvLyBDQ1ggYWRtaW5pc3RyYXRpb24gY29udHJvbAordHlwZWRlZgl1bmlvbglfQ0NYX0NPTlRST0wJeworCXN0cnVjdAl7CisJCVVJTlQzMgkJRW5hYmxlOjE7CQkJLy8gRW5hYmxlIENDWDIKKwkJVUlOVDMyCQlMZWFwRW5hYmxlOjE7CQkvLyBFbmFibGUgTEVBUCBhdCBDQ1gyCisJCVVJTlQzMgkJUk1FbmFibGU6MTsJCQkvLyBSYWRpbyBNZWFzdXJlbWVudCBFbmFibGUKKwkJVUlOVDMyCQlEQ1JNRW5hYmxlOjE7CQkvLyBOb24gc2VydmluZyBjaGFubmVsIFJhZGlvIE1lYXN1cmVtZW50IGVuYWJsZQorCQlVSU5UMzIJCVFPU0VuYWJsZToxOwkJLy8gRW5hYmxlIFFPUyBmb3IgQ0NYIDIuMCBzdXBwb3J0CisJCVVJTlQzMgkJRmFzdFJvYW1FbmFibGU6MTsJLy8gRW5hYmxlIGZhc3Qgcm9hbWluZworCQlVSU5UMzIJCVJzdmQ6MjsJCQkJLy8gTm90IHVzZWQKKwkJVUlOVDMyCQlkQm1Ub1JvYW06ODsJCS8vIHRoZSBjb25kaXRpb24gdG8gcm9hbSB3aGVuIHJlY2VpdmluZyBSc3NpIGxlc3MgdGhhbiB0aGlzIHZhbHVlLiBJdCdzIG5lZ2F0aXZlIHZhbHVlLgorCQlVSU5UMzIJCVR1TGltaXQ6MTY7CQkJLy8gTGltaXQgZm9yIGRpZmZlcmVudCBjaGFubmVsIHNjYW4KKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CUNDWF9DT05UUk9MLCAqUENDWF9DT05UUk9MOworCisjZW5kaWYJLy8gX19BSVJPTkVUX0hfXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9hcC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9hcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmNmRiMjgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2FwLmgKQEAgLTAsMCArMSw1NTcgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgTW9kdWxlIE5hbWU6CisgICAgYXAuaAorCisgICAgQWJzdHJhY3Q6CisgICAgTWluaXBvcnQgZ2VuZXJpYyBwb3J0aW9uIGhlYWRlciBmaWxlCisKKyAgICBSZXZpc2lvbiBIaXN0b3J5OgorICAgIFdobyAgICAgICAgIFdoZW4gICAgICAgICAgV2hhdAorICAgIC0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFBhdWwgTGluICAgIDA4LTAxLTIwMDIgICAgY3JlYXRlZAorICAgIEphbWVzIFRhbiAgIDA5LTA2LTIwMDIgICAgbW9kaWZpZWQgKFJldmlzZSBOVENSZWdUYWJsZSkKKyAgICBKb2huIENoYW5nICAxMi0yMi0yMDA0ICAgIG1vZGlmaWVkIGZvciBSVDI1NjEvMjY2MS4gbWVyZ2Ugd2l0aCBTVEEgZHJpdmVyCisqLworI2lmbmRlZiBfX0FQX0hfXworI2RlZmluZSBfX0FQX0hfXworCisKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PSBBUCBSVE1QLmggPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vICAgICAgRnVuY3Rpb24gUHJvdG90eXBlcworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisvLyBhcF9kYXRhLmMKKworQk9PTEVBTiBBUEJyaWRnZVRvV2lyZWxlc3NTdGEoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBwSGVhZGVyLAorICAgIElOICBVSU5UICAgICAgICAgICAgSGRyTGVuLAorICAgIElOICBQVUNIQVIgICAgICAgICAgcERhdGEsCisgICAgSU4gIFVJTlQgICAgICAgICAgICBEYXRhTGVuLAorICAgIElOICBVTE9ORyAgICAgICAgICAgZnJvbXdkc2lkeCk7CisKK0JPT0xFQU4gQVBIYW5kbGVSeERvbmVJbnRlcnJ1cHQoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitWT0lECUFQU2VuZFBhY2tldHMoCisJSU4JTkRJU19IQU5ETEUJCU1pbmlwb3J0QWRhcHRlckNvbnRleHQsCisJSU4JUFBORElTX1BBQ0tFVAlwcFBhY2tldEFycmF5LAorCUlOCVVJTlQJCQlOdW1iZXJPZlBhY2tldHMpOworCitORElTX1NUQVRVUyBBUFNlbmRQYWNrZXQoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisgICAgSU4gIFBORElTX1BBQ0tFVCAgICBwUGFja2V0KTsKKworCitORElTX1NUQVRVUyBBUEhhcmRUcmFuc21pdCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglUWF9CTEsJCQkqcFR4QmxrLAorCUlOCVVDSEFSCQkJUXVlSWR4KTsKKworVk9JRCBBUFJ4RUFQT0xGcmFtZUluZGljYXRlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCU1BQ19UQUJMRV9FTlRSWQkqcEVudHJ5LAorCUlOCVJYX0JMSwkJCSpwUnhCbGssCisJSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCk7CisKK05ESVNfU1RBVFVTIEFQQ2hlY2tSeEVycm9yKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBSVDI4WFhfUlhEX1NUUlVDCQlwUnhELAorCUlOCVVDSEFSCQkJV2NpZCk7CisKK0JPT0xFQU4gQVBDaGVja0NsYXNzMkNsYXNzM0Vycm9yKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOIFVMT05HIFdjaWQsCisJSU4gIFBIRUFERVJfODAyXzExICBwSGVhZGVyKTsKKworVk9JRCBBUEhhbmRsZVJ4UHNQb2xsKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCXBBZGRyLAorCUlOCVVTSE9SVAkJCUFpZCwKKyAgICBJTglCT09MRUFOCQkJaXNBY3RpdmUpOworCitWT0lEICAgIFJUTVBEZXNjcmlwdG9yRW5kaWFuQ2hhbmdlKAorICAgIElOICBQVUNIQVIgICAgICAgICAgcERhdGEsCisgICAgSU4gIFVMT05HICAgICAgICAgICBEZXNjcmlwdG9yVHlwZSk7CisKK1ZPSUQgICAgUlRNUEZyYW1lRW5kaWFuQ2hhbmdlKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorICAgIElOICBQVUNIQVIgICAgICAgICAgcERhdGEsCisgICAgSU4gIFVMT05HICAgICAgICAgICBEaXIsCisgICAgSU4gIEJPT0xFQU4gICAgICAgICBGcm9tUnhEb25lSW50KTsKKworLy8gYXBfYXNzb2MuYworCitWT0lEIEFQQXNzb2NTdGF0ZU1hY2hpbmVJbml0KAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorICAgIElOICBTVEFURV9NQUNISU5FICpTLAorICAgIE9VVCBTVEFURV9NQUNISU5FX0ZVTkMgVHJhbnNbXSk7CisKK1ZPSUQgIEFQUGVlckFzc29jUmVxQWN0aW9uKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorICAgIElOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEICBBUFBlZXJSZWFzc29jUmVxQWN0aW9uKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorICAgIElOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEICBBUFBlZXJEaXNhc3NvY1JlcUFjdGlvbigKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKyAgICBJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBNYnNzS2lja091dFN0YXMoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gSU5UIGFwaWR4LAorCUlOIFVTSE9SVCBSZWFzb24pOworCitWT0lEIEFQTWxtZUtpY2tPdXRTdGEoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gUFVDSEFSIHBTdGFBZGRyLAorCUlOIFVDSEFSIFdjaWQsCisJSU4gVVNIT1JUIFJlYXNvbik7CisKK1ZPSUQgQVBNbG1lRGlzYXNzb2NSZXFBY3Rpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCAgQVBDbHMzZXJyQWN0aW9uKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOIAlVTE9ORyBXY2lkLAorICAgIElOCVBIRUFERVJfODAyXzExCXBIZWFkZXIpOworCisKK1VTSE9SVCBBUEJ1aWxkQXNzb2NpYXRpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gTUFDX1RBQkxFX0VOVFJZICpwRW50cnksCisgICAgSU4gVVNIT1JUIENhcGFiaWxpdHlJbmZvLAorICAgIElOIFVDSEFSICBNYXhTdXBwb3J0ZWRSYXRlSW41MDBLYnBzLAorICAgIElOIFVDSEFSICAqUlNOLAorICAgIElOIFVDSEFSICAqcFJTTkxlbiwKKyAgICBJTiBCT09MRUFOIGJXbW1DYXBhYmxlLAorICAgIElOIFVMT05HICBSYWxpbmtJZSwKKyNpZmRlZiBET1QxMU5fRFJBRlQzCisgICAgSU4gRVhUX0NBUF9JTkZPX0VMRU1FTlQgRXh0Q2FwSW5mbywKKyNlbmRpZiAvLyBET1QxMU5fRFJBRlQzIC8vCisJSU4gSFRfQ0FQQUJJTElUWV9JRQkJKnBIdENhcGFiaWxpdHksCisJSU4gVUNIQVIJCSBIdENhcGFiaWxpdHlMZW4sCisgICAgT1VUIFVTSE9SVCAqcEFpZCk7CisKKy8vIGFwX2F1dGguYworCit2b2lkIEFQQXV0aFN0YXRlTWFjaGluZUluaXQoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gU1RBVEVfTUFDSElORSAqU20sCisgICAgT1VUIFNUQVRFX01BQ0hJTkVfRlVOQyBUcmFuc1tdKTsKKworVk9JRCBBUE1sbWVEZWF1dGhSZXFBY3Rpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBBUENsczJlcnJBY3Rpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gCVVMT05HIFdjaWQsCisgICAgSU4JUEhFQURFUl84MDJfMTEJcEhlYWRlcik7CisKKy8vIGFwX2F1dGhyc3AuYworCitWT0lEIEFQQXV0aFJzcFN0YXRlTWFjaGluZUluaXQoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gUFNUQVRFX01BQ0hJTkUgU20sCisgICAgSU4gU1RBVEVfTUFDSElORV9GVU5DIFRyYW5zW10pOworCitWT0lEIEFQUGVlckF1dGhBdEF1dGhSc3BJZGxlQWN0aW9uKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorICAgIElOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIEFQUGVlckRlYXV0aFJlcUFjdGlvbigKKyAgICBJTiBQUlRNUF9BREFQVEVSCXBBZCwKKyAgICBJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIEFQUGVlckF1dGhTaW1wbGVSc3BHZW5BbmRTZW5kKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorICAgIElOICBQSEVBREVSXzgwMl8xMSBwSGRyODAyMTEsCisgICAgSU4gIFVTSE9SVCBBbGcsCisgICAgSU4gIFVTSE9SVCBTZXEsCisgICAgSU4gIFVTSE9SVCBTdGF0dXNDb2RlKTsKKworLy8gYXBfY29ubmVjdC5jCisKK0JPT0xFQU4gQmVhY29uVHJhbnNtaXRSZXF1aXJlZCgKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiBJTlQJCQkJYXBpZHgpOworCitWT0lEIEFQTWFrZUJzc0JlYWNvbigKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTglJTlQJCQkJYXBpZHgpOworCitWT0lEICBBUFVwZGF0ZUJlYWNvbkZyYW1lKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOCUlOVAkJCQlhcGlkeCk7CisKK1ZPSUQgQVBNYWtlQWxsQnNzQmVhY29uKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworVk9JRCAgQVBVcGRhdGVBbGxCZWFjb25GcmFtZSgKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKKworLy8gYXBfc3luYy5jCisKK1ZPSUQgQVBTeW5jU3RhdGVNYWNoaW5lSW5pdCgKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBTVEFURV9NQUNISU5FICpTbSwKKyAgICBPVVQgU1RBVEVfTUFDSElORV9GVU5DIFRyYW5zW10pOworCitWT0lEIEFQU2NhblRpbWVvdXQoCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKKworVk9JRCBBUEludmFsaWRTdGF0ZVdoZW5TY2FuKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgQVBTY2FuVGltZW91dEFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIEFQUGVlclByb2JlUmVxQWN0aW9uKAorICAgIElOICBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBBUFBlZXJCZWFjb25BY3Rpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBBUE1sbWVTY2FuUmVxQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgQVBQZWVyQmVhY29uQXRTY2FuQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgQVBTY2FuQ25jbEFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIEFwU2l0ZVN1cnZleSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK1ZPSUQgU3VwcG9ydFJhdGUoCisJSU4gUFVDSEFSIFN1cFJhdGUsCisJSU4gVUNIQVIgU3VwUmF0ZUxlbiwKKwlJTiBQVUNIQVIgRXh0UmF0ZSwKKwlJTiBVQ0hBUiBFeHRSYXRlTGVuLAorCU9VVCBQVUNIQVIgKlJhdGVzLAorCU9VVCBQVUNIQVIgUmF0ZXNMZW4sCisJT1VUIFBVQ0hBUiBwTWF4U3VwcG9ydFJhdGUpOworCisKK0JPT0xFQU4gQXBTY2FuUnVubmluZygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKKyNpZmRlZiBET1QxMU5fRFJBRlQzCitWT0lEIEFQT3ZlcmxhcHBpbmdCU1NTY2FuKAorCUlOIFJUTVBfQURBUFRFUiAqcEFkKTsKKyNlbmRpZiAvLyBET1QxMU5fRFJBRlQzIC8vCisKKy8vIGFwX3dwYS5jCisKK1ZPSUQgQVBXcGFTdGF0ZU1hY2hpbmVJbml0KAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorICAgIElOICBTVEFURV9NQUNISU5FICpTbSwKKyAgICBPVVQgU1RBVEVfTUFDSElORV9GVU5DIFRyYW5zW10pOworCisvLyBhcF9tbG1lLmMKKworVk9JRCBBUE1sbWVQZXJpb2RpY0V4ZWMoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitWT0lEIEFQTWxtZVNlbGVjdFR4UmF0ZVRhYmxlKAorCUlOIFBSVE1QX0FEQVBURVIJCXBBZCwKKwlJTiBQTUFDX1RBQkxFX0VOVFJZCQlwRW50cnksCisJSU4gUFVDSEFSCQkJCSpwcFRhYmxlLAorCUlOIFBVQ0hBUgkJCQlwVGFibGVTaXplLAorCUlOIFBVQ0hBUgkJCQlwSW5pdFR4UmF0ZUlkeCk7CisKK1ZPSUQgQVBNbG1lU2V0VHhSYXRlKAorCUlOIFBSVE1QX0FEQVBURVIJCXBBZCwKKwlJTiBQTUFDX1RBQkxFX0VOVFJZCQlwRW50cnksCisJSU4gUFJUTVBfVFhfUkFURV9TV0lUQ0gJcFR4UmF0ZSk7CisKK1ZPSUQgQVBNbG1lRHluYW1pY1R4UmF0ZVN3aXRjaGluZygKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK1ZPSUQgQVBRdWlja1Jlc3BvbmVGb3JSYXRlVXBFeGVjKAorICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKKyAgICBJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCisgICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAorICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMyk7CisKK0JPT0xFQU4gQVBNc2dUeXBlU3Vic3QoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gUEZSQU1FXzgwMl8xMSBwRnJhbWUsCisgICAgT1VUIElOVCAqTWFjaGluZSwKKyAgICBPVVQgSU5UICpNc2dUeXBlKTsKKworVk9JRCBBUFF1aWNrUmVzcG9uZUZvclJhdGVVcEV4ZWMoCisgICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorICAgIElOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKKyAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisgICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKKworCitWT0lEIFJUTVBTZXRQaWdneUJhY2soCisJSU4gUFJUTVBfQURBUFRFUglwQWQsCisJSU4gQk9PTEVBTgkJCWJQaWdneUJhY2spOworCitWT0lEIEFQQXNpY0V2YWx1YXRlUnhBbnQoCisJSU4gUFJUTVBfQURBUFRFUglwQWQpOworCitWT0lEIEFQQXNpY1J4QW50RXZhbFRpbWVvdXQoCisJSU4gUFJUTVBfQURBUFRFUglwQWQpOworCisvLyBhcC5jCisKK1ZPSUQgQVBTd2l0Y2hDaGFubmVsKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIElOVCBDaGFubmVsKTsKKworTkRJU19TVEFUVVMgQVBJbml0aWFsaXplKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworVk9JRCBBUFNodXRkb3duKAorICAgIElOIFBSVE1QX0FEQVBURVIgICAgcEFkKTsKKworVk9JRCBBUFN0YXJ0VXAoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitWT0lEIEFQU3RvcCgKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK1ZPSUQgQVBDbGVhbnVwUHNRdWV1ZSgKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKyAgICBJTiAgUFFVRVVFX0hFQURFUiAgIHBRdWV1ZSk7CisKK1ZPSUQgTWFjVGFibGVSZXNldCgKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK01BQ19UQUJMRV9FTlRSWSAqTWFjVGFibGVJbnNlcnRFbnRyeSgKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIHBBZGRyLAorCUlOCVVDSEFSCQkJYXBpZHgsCisJSU4gQk9PTEVBTglDbGVhbkFsbCk7CisKK0JPT0xFQU4gTWFjVGFibGVEZWxldGVFbnRyeSgKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiBVU0hPUlQgd2NpZCwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIHBBZGRyKTsKKworTUFDX1RBQkxFX0VOVFJZICpNYWNUYWJsZUxvb2t1cCgKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIHBBZGRyKTsKKworVk9JRCBNYWNUYWJsZU1haW50ZW5hbmNlKAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkKTsKKworVUlOVDMyIE1hY1RhYmxlQXNzb2NTdGFOdW1HZXQoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpOworCitNQUNfVEFCTEVfRU5UUlkgKkFQU3NQc0lucXVpcnkoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBwQWRkciwKKyAgICBPVVQgU1NUICAgICAgICAgICAgICpTc3QsCisgICAgT1VUIFVTSE9SVCAgICAgICAgICAqQWlkLAorICAgIE9VVCBVQ0hBUiAgICAgICAgICAgKlBzTW9kZSwKKyAgICBPVVQgVUNIQVIgICAgICAgICAgICpSYXRlKTsKKworQk9PTEVBTiBBUFBzSW5kaWNhdGUoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBwQWRkciwKKwlJTiBVTE9ORyBXY2lkLAorICAgIElOICBVQ0hBUiAgICAgICAgICAgUHNtKTsKKworVk9JRCBBcExvZ0V2ZW50KAorICAgIElOIFBSVE1QX0FEQVBURVIgICAgcEFkLAorICAgIElOIFBVQ0hBUiAgICAgICAgICAgcEFkZHIsCisgICAgSU4gVVNIT1JUICAgICAgICAgICBFdmVudCk7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKK1ZPSUQgQVBVcGRhdGVPcGVyYXRpb25Nb2RlKAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworVk9JRCBBUFVwZGF0ZUNhcGFiaWxpdHlBbmRFcnBJZSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK0JPT0xFQU4gQXBDaGVja0FjY2Vzc0NvbnRyb2xMaXN0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFBVQ0hBUiAgICAgICAgcEFkZHIsCisJSU4gVUNIQVIgICAgICAgICBBcGlkeCk7CisKK1ZPSUQgQXBVcGRhdGVBY2Nlc3NDb250cm9sTGlzdCgKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBVQ0hBUiAgICAgICAgIEFwaWR4KTsKKworVk9JRCBBcEVucXVldWVOdWxsRnJhbWUoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gUFVDSEFSICAgICAgICBwQWRkciwKKwlJTiBVQ0hBUiAgICAgICAgIFR4UmF0ZSwKKwlJTiBVQ0hBUiAgICAgICAgIFBJRCwKKwlJTiBVQ0hBUiAgICAgICAgIGFwaWR4LAorICAgIElOIEJPT0xFQU4gICAgICAgYlFvc051bGwsCisgICAgSU4gQk9PTEVBTiAgICAgICBiRU9TUCwKKyAgICBJTiBVQ0hBUiAgICAgICAgIE9sZFVQKTsKKworVk9JRCBBcFNlbmRGcmFtZSgKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKyAgICBJTiAgUFZPSUQgICAgICAgICAgIHBCdWZmZXIsCisgICAgSU4gIFVMT05HICAgICAgICAgICBMZW5ndGgsCisgICAgSU4gIFVDSEFSICAgICAgICAgICBUeFJhdGUsCisgICAgSU4gIFVDSEFSICAgICAgICAgICBQSUQpOworCitWT0lEIEFwRW5xdWV1ZUFja0ZyYW1lKAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIFBVQ0hBUiAgICAgICAgcEFkZHIsCisgICAgSU4gVUNIQVIgICAgICAgICBUeFJhdGUsCisJSU4gVUNIQVIgICAgICAgICBhcGlkeCk7CisKK1VDSEFSIEFQQXV0b1NlbGVjdENoYW5uZWwoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gQk9PTEVBTiBPcHRpbWFsKTsKKworLy8gYXBfc2FuaXR5LmMKKworCitCT09MRUFOIFBlZXJBc3NvY1JlcUNtbVNhbml0eSgKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBCT09MRUFOIGlzUmVzc29jLAorICAgIElOIFZPSUQgKk1zZywKKyAgICBJTiBVTE9ORyBNc2dMZW4sCisgICAgT1VUIFBVQ0hBUiBwQWRkcjIsCisgICAgT1VUIFVTSE9SVCAqcENhcGFiaWxpdHlJbmZvLAorICAgIE9VVCBVU0hPUlQgKnBMaXN0ZW5JbnRlcnZhbCwKKyAgICBPVVQgUFVDSEFSIHBBcEFkZHIsCisgICAgT1VUIFVDSEFSICpwU3NpZExlbiwKKyAgICBPVVQgY2hhciAqU3NpZCwKKyAgICBPVVQgVUNIQVIgKnBSYXRlc0xlbiwKKyAgICBPVVQgVUNIQVIgUmF0ZXNbXSwKKyAgICBPVVQgVUNIQVIgKlJTTiwKKyAgICBPVVQgVUNIQVIgKnBSU05MZW4sCisgICAgT1VUIEJPT0xFQU4gKnBiV21tQ2FwYWJsZSwKKyAgICBPVVQgVUxPTkcgICpwUmFsaW5rSWUsCisjaWZkZWYgRE9UMTFOX0RSQUZUMworICAgIE9VVCBFWFRfQ0FQX0lORk9fRUxFTUVOVAkqcEV4dENhcEluZm8sCisjZW5kaWYgLy8gRE9UMTFOX0RSQUZUMyAvLworICAgIE9VVCBVQ0hBUgkJICpwSHRDYXBhYmlsaXR5TGVuLAorICAgIE9VVCBIVF9DQVBBQklMSVRZX0lFICpwSHRDYXBhYmlsaXR5KTsKKworQk9PTEVBTiBQZWVyRGlzYXNzb2NSZXFTYW5pdHkoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gVk9JRCAqTXNnLAorICAgIElOIFVMT05HIE1zZ0xlbiwKKyAgICBPVVQgUFVDSEFSIHBBZGRyMiwKKyAgICBPVVQgVVNIT1JUICpSZWFzb24pOworCitCT09MRUFOIFBlZXJEZWF1dGhSZXFTYW5pdHkoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gVk9JRCAqTXNnLAorICAgIElOIFVMT05HIE1zZ0xlbiwKKyAgICBPVVQgUFVDSEFSIHBBZGRyMiwKKyAgICBPVVQgVVNIT1JUICpSZWFzb24pOworCitCT09MRUFOIEFQUGVlckF1dGhTYW5pdHkoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gVk9JRCAqTXNnLAorICAgIElOIFVMT05HIE1zZ0xlbiwKKwlPVVQgUFVDSEFSIHBBZGRyMSwKKyAgICBPVVQgUFVDSEFSIHBBZGRyMiwKKyAgICBPVVQgVVNIT1JUICpBbGcsCisgICAgT1VUIFVTSE9SVCAqU2VxLAorICAgIE9VVCBVU0hPUlQgKlN0YXR1cywKKyAgICBDSEFSICpDaGxnVGV4dCk7CisKK0JPT0xFQU4gQVBQZWVyUHJvYmVSZXFTYW5pdHkoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gVk9JRCAqTXNnLAorICAgIElOIFVMT05HIE1zZ0xlbiwKKyAgICBPVVQgUFVDSEFSIHBBZGRyMiwKKyAgICBPVVQgQ0hBUiBTc2lkW10sCisgICAgT1VUIFVDSEFSICpTc2lkTGVuKTsKKworQk9PTEVBTiBBUFBlZXJCZWFjb25BbmRQcm9iZVJzcFNhbml0eSgKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBWT0lEICpNc2csCisgICAgSU4gVUxPTkcgTXNnTGVuLAorICAgIE9VVCBQVUNIQVIgcEFkZHIyLAorICAgIE9VVCBQVUNIQVIgcEJzc2lkLAorICAgIE9VVCBDSEFSIFNzaWRbXSwKKyAgICBPVVQgVUNIQVIgKlNzaWRMZW4sCisgICAgT1VUIFVDSEFSICpCc3NUeXBlLAorICAgIE9VVCBVU0hPUlQgKkJlYWNvblBlcmlvZCwKKyAgICBPVVQgVUNIQVIgKkNoYW5uZWwsCisgICAgT1VUIExBUkdFX0lOVEVHRVIgKlRpbWVzdGFtcCwKKyAgICBPVVQgVVNIT1JUICpDYXBhYmlsaXR5SW5mbywKKyAgICBPVVQgVUNIQVIgUmF0ZVtdLAorICAgIE9VVCBVQ0hBUiAqUmF0ZUxlbiwKKyAgICBPVVQgQk9PTEVBTiAqRXh0ZW5kZWRSYXRlSWVFeGlzdCwKKyAgICBPVVQgVUNIQVIgKkVycCk7CisKKy8vIGFwX2luZm8uYworCisjaWZkZWYgV0lOX05ESVMKK05ESVNfU1RBVFVTIEFQUXVlcnlJbmZvcm1hdGlvbigKKyAgICBJTiAgTkRJU19IQU5ETEUgTWluaXBvcnRBZGFwdGVyQ29udGV4dCwKKyAgICBJTiAgTkRJU19PSUQgICAgT2lkLAorICAgIElOICBQVk9JRCAgICAgICBwSW5mb3JtYXRpb25CdWZmZXIsCisgICAgSU4gIFVMT05HICAgICAgIEluZm9ybWF0aW9uQnVmZmVyTGVuZ3RoLAorICAgIE9VVCBQVUxPTkcgICAgICBwQnl0ZXNXcml0dGVuLAorICAgIE9VVCBQVUxPTkcgICAgICBwQnl0ZXNOZWVkZWQpOworCitORElTX1NUQVRVUyBBUFNldEluZm9ybWF0aW9uKAorICAgIElOICBORElTX0hBTkRMRSBNaW5pcG9ydEFkYXB0ZXJDb250ZXh0LAorICAgIElOICBORElTX09JRCAgICBPaWQsCisgICAgSU4gIFBWT0lEICAgICAgIHBJbmZvcm1hdGlvbkJ1ZmZlciwKKyAgICBJTiAgVUxPTkcgICAgICAgSW5mb3JtYXRpb25CdWZmZXJMZW5ndGgsCisgICAgT1VUIFBVTE9ORyAgICAgIHBCeXRlc1JlYWQsCisgICAgT1VUIFBVTE9ORyAgICAgIHBCeXRlc05lZWRlZCk7CisjZW5kaWYKKworCisvLyA9PT09PT09PT09PT09PT09PT0gZW5kIG9mIEFQIFJUTVAuaCA9PT09PT09PT09PT09PT09PT09PT09PT0KKworCisjZW5kaWYgIC8vIF9fQVBfSF9fCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY2hsaXN0LmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NobGlzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllMTViOWQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NobGlzdC5oCkBAIC0wLDAgKzEsMTI5NiBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwlNb2R1bGUgTmFtZToKKwljaGxpc3QuYworCisJQWJzdHJhY3Q6CisKKwlSZXZpc2lvbiBIaXN0b3J5OgorCVdobyAgICAgICAgIFdoZW4gICAgICAgICAgV2hhdAorCS0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCUZvbmNoaSBXdSAgIDIwMDctMTItMTkgICAgY3JlYXRlZAorKi8KKworI2lmbmRlZiBfX0NITElTVF9IX18KKyNkZWZpbmUgX19DSExJU1RfSF9fCisKKyNpbmNsdWRlICJydG1wX3R5cGUuaCIKKyNpbmNsdWRlICJydG1wX2RlZi5oIgorCisKKyNkZWZpbmUgT0RPUgkJCTAKKyNkZWZpbmUgSURPUgkJCTEKKyNkZWZpbmUgQk9USAkJCTIKKworI2RlZmluZSBCQU5EXzVHICAgICAgICAgMAorI2RlZmluZSBCQU5EXzI0RyAgICAgICAgMQorI2RlZmluZSBCQU5EX0JPVEggICAgICAgMgorCit0eXBlZGVmIHN0cnVjdCBfQ0hfREVTUCB7CisJVUNIQVIgRmlyc3RDaGFubmVsOworCVVDSEFSIE51bU9mQ2g7CisJQ0hBUiBNYXhUeFB3cjsJCQkvLyBkQm0KKwlVQ0hBUiBHZW9ncmFwaHk7CQkJLy8gMDpvdXQgZG9vciwgMTppbiBkb29yLCAyOmJvdGgKKwlCT09MRUFOIERmc1JlcTsJCQkvLyBEZnMgcmVxdWlyZSwgMDogTm8sIDE6IHllcy4KK30gQ0hfREVTUCwgKlBDSF9ERVNQOworCit0eXBlZGVmIHN0cnVjdCBfQ0hfUkVHSU9OIHsKKwlVQ0hBUiBDb3VudFJlZ1szXTsKKwlVQ0hBUiBEZnNUeXBlOwkJCS8vIDA6IENFLCAxOiBGQ0MsIDI6IEpBUCwgMzpKQVBfVzUzLCBKQVBfVzU2CisJQ0hfREVTUCBDaERlc3BbMTBdOworfSBDSF9SRUdJT04sICpQQ0hfUkVHSU9OOworCitzdGF0aWMgQ0hfUkVHSU9OIENoUmVnaW9uW10gPQoreworCQl7CS8vIEFudGlndWEgYW5kIEJlcmJ1ZGEKKwkJCSJBRyIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgIDQsICAyMywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAgNCwgIDIzLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTAwLCAxMSwgMzAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDEwMH4xNDAKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIEFyZ2VudGluYQorCQkJIkFSIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDUyLCAgNCwgIDI0LCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTQ5LCA0LCAgMzAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjEKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIEFydWJhCisJCQkiQVciLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsICA0LCAgMjMsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgIDQsICAyMywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDEwMCwgMTEsIDMwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxMDB+MTQwCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBBdXN0cmFsaWEKKwkJCSJBVSIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgIDQsICAyMywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAgNCwgIDI0LCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTQ5LCA1LCAgMzAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjUKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIEF1c3RyaWEKKwkJCSJBVCIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgIDQsICAyMywgSURPUiwgVFJVRX0sCQkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAgNCwgIDIzLCBJRE9SLCBUUlVFfSwJCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTAwLCAxMSwgMzAsIEJPVEgsIFRSVUV9LAkJLy8gNUcsIGNoIDEwMH4xNDAKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIEJhaGFtYXMKKwkJCSJCUyIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgIDQsICAyMywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAgNCwgIDI0LCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTQ5LCA1LCAgMzAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjUKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIEJhcmJhZG9zCisJCQkiQkIiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsICA0LCAgMjMsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgIDQsICAyNCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDEwMCwgMTEsIDMwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxMDB+MTQwCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBCZXJtdWRhCisJCQkiQk0iLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsICA0LCAgMjMsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgIDQsICAyNCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDEwMCwgMTEsIDMwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxMDB+MTQwCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBCcmF6aWwKKwkJCSJCUiIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgIDQsICAyMywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAgNCwgIDI0LCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTAwLCAxMSwgMjQsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDEwMH4xNDAKKwkJCQl7IDE0OSwgNSwgIDMwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxMDB+MTQwCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBCZWxnaXVtCisJCQkiQkUiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsICA0LCAgMTgsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgIDQsICAxOCwgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIEJ1bGdhcmlhCisJCQkiQkciLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsICA0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgIDQsICAyMywgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTAwLCAxMSwgMzAsIE9ET1IsIFRSVUV9LAkvLyA1RywgY2ggMTAwfjE0MAorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gQ2FuYWRhCisJCQkiQ0EiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsICA0LCAgMjMsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgIDQsICAyMywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDE0OSwgNSwgIDMwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxNDl+MTY1CisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBDYXltYW4gSXNMYW5kcworCQkJIktZIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDM2LCAgNCwgIDIzLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgNTIsICA0LCAgMjQsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAxMDAsIDExLCAzMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTAwfjE0MAorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gQ2hpbGUKKwkJCSJDTCIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgIDQsICAyMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAgNCwgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTQ5LCA1LCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjUKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIENoaW5hCisJCQkiQ04iLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMTQ5LCA0LCAgMjcsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjEKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIENvbG9tYmlhCisJCQkiQ08iLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsICA0LCAgMTcsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgIDQsICAyNCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDEwMCwgMTEsIDMwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxMDB+MTQwCisJCQkJeyAxNDksIDUsICAzMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTQ5fjE2NQorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gQ29zdGEgUmljYQorCQkJIkNSIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDM2LCAgNCwgIDE3LCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgNTIsICA0LCAgMjQsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAxNDksIDQsICAzMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTQ5fjE2MQorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gQ3lwcnVzCisJCQkiQ1kiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsICA0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgIDQsICAyNCwgSURPUiwgVFJVRX0sCQkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDEwMCwgMTEsIDMwLCBCT1RILCBUUlVFfSwJCS8vIDVHLCBjaCAxMDB+MTQwCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBDemVjaF9SZXB1YmxpYworCQkJIkNaIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDM2LCAgNCwgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgNTIsICA0LCAgMjMsIElET1IsIFRSVUV9LAkJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBEZW5tYXJrCisJCQkiREsiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsICA0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgIDQsICAyMywgSURPUiwgVFJVRX0sCQkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDEwMCwgMTEsIDMwLCBCT1RILCBUUlVFfSwJCS8vIDVHLCBjaCAxMDB+MTQwCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBEb21pbmljYW4gUmVwdWJsaWMKKwkJCSJETyIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMCwgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAwCisJCQkJeyAxNDksIDQsICAyMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTQ5fjE2MQorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gRXF1YWRvcgorCQkJIkVDIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAxMDAsIDExLCAgMjcsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDEwMH4xNDAKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIEVsIFNhbHZhZG9yCisJCQkiU1YiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDM2LCAgNCwgICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAgNCwgICAzMCwgQk9USCwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTQ5LCA0LCAgIDM2LCBCT1RILCBUUlVFfSwJLy8gNUcsIGNoIDE0OX4xNjUKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIEZpbmxhbmQKKwkJCSJGSSIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsICA0LCAgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgNTIsICA0LCAgIDIzLCBJRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAxMDAsIDExLCAgMzAsIEJPVEgsIFRSVUV9LAkvLyA1RywgY2ggMTAwfjE0MAorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gRnJhbmNlCisJCQkiRlIiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDM2LCAgNCwgICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAgNCwgICAyMywgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gR2VybWFueQorCQkJIkRFIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgIDQsICAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgIDQsICAgMjMsIElET1IsIFRSVUV9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDEwMCwgMTEsICAzMCwgQk9USCwgVFJVRX0sCS8vIDVHLCBjaCAxMDB+MTQwCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBHcmVlY2UKKwkJCSJHUiIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsICA0LCAgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgNTIsICA0LCAgIDIzLCBJRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAxMDAsIDExLCAgMzAsIE9ET1IsIFRSVUV9LAkvLyA1RywgY2ggMTAwfjE0MAorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gR3VhbQorCQkJIkdVIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMSwgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjExCisJCQkJeyAzNiwgIDQsICAgMTcsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgIDQsICAgMjQsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAxMDAsIDExLCAgMzAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDEwMH4xNDAKKwkJCQl7IDE0OSwgIDUsICAzMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTQ5fjE2NQorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gR3VhdGVtYWxhCisJCQkiR1QiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDM2LCAgNCwgICAxNywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAgNCwgICAyNCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDE0OSwgIDQsICAzMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTQ5fjE2MQorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gSGFpdGkKKwkJCSJIVCIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsICA0LCAgIDE3LCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgNTIsICA0LCAgIDI0LCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTQ5LCAgNCwgIDMwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxNDl+MTYxCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBIb25kdXJhcworCQkJIkhOIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAxNDksICA0LCAgMjcsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjEKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIEhvbmcgS29uZworCQkJIkhLIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgICA0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgICA0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAxNDksICA0LCAgMzAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjEKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIEh1bmdhcnkKKwkJCSJIVSIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsICAgNCwgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgNTIsICAgNCwgIDIzLCBJRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBJY2VsYW5kCisJCQkiSVMiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDM2LCAgIDQsICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAgIDQsICAyMywgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTAwLCAxMSwgIDMwLCBCT1RILCBUUlVFfSwJLy8gNUcsIGNoIDEwMH4xNDAKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIEluZGlhCisJCQkiSU4iLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDE0OSwgCTQsICAyNCwgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMTQ5fjE2MQorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gSW5kb25lc2lhCisJCQkiSUQiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDE0OSwgCTQsICAyNywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTQ5fjE2MQorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gSXJlbGFuZAorCQkJIklFIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgCTQsICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAJNCwgIDIzLCBJRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAxMDAsIDExLCAgMzAsIE9ET1IsIFRSVUV9LAkvLyA1RywgY2ggMTAwfjE0MAorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gSXNyYWVsCisJCQkiSUwiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgICAzLCAgMjAsIElET1IsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MworCQkJCXsgNCwgCTYsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggNH45CisJCQkJeyAxMCwgCTQsICAyMCwgSURPUiwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMTB+MTMKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIEl0YWx5CisJCQkiSVQiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDM2LCAJNCwgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgNTIsIAk0LCAgMjMsIElET1IsIFRSVUV9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDEwMCwgMTEsICAzMCwgT0RPUiwgVFJVRX0sCS8vIDVHLCBjaCAxMDB+MTQwCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBKYXBhbgorCQkJIkpQIiwKKwkJCUpBUCwKKwkJCXsKKwkJCQl7IDEsICAgMTQsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xNAorCQkJCXsgMzYsIAk0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBKb3JkYW4KKwkJCSJKTyIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsICAyMCwgSURPUiwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsIAk0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyAxNDksIAk0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjEKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIExhdHZpYQorCQkJIkxWIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgCTQsICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAJNCwgIDIzLCBJRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAxMDAsIDExLCAgMzAsIEJPVEgsIFRSVUV9LAkvLyA1RywgY2ggMTAwfjE0MAorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gTGllY2h0ZW5zdGVpbgorCQkJIkxJIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyA1MiwgCTQsICAyMywgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTAwLCAxMSwgIDMwLCBCT1RILCBUUlVFfSwJLy8gNUcsIGNoIDEwMH4xNDAKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIExpdGh1YW5pYQorCQkJIkxUIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgCTQsICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAJNCwgIDIzLCBJRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAxMDAsIDExLCAgMzAsIEJPVEgsIFRSVUV9LAkvLyA1RywgY2ggMTAwfjE0MAorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gTHV4ZW1idXJnCisJCQkiTFUiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDM2LCAJNCwgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgNTIsIAk0LCAgMjMsIElET1IsIFRSVUV9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDEwMCwgMTEsICAzMCwgQk9USCwgVFJVRX0sCS8vIDVHLCBjaCAxMDB+MTQwCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBNYWxheXNpYQorCQkJIk1ZIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMzYsIAk0LCAgMjMsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgCTQsICAyMywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDE0OSwgIDUsICAyMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTQ5fjE2NQorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gTWFsdGEKKwkJCSJNVCIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsIAk0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgCTQsICAyMywgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTAwLCAxMSwgIDMwLCBCT1RILCBUUlVFfSwJLy8gNUcsIGNoIDEwMH4xNDAKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIE1hcm9jY28KKwkJCSJNQSIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsIAk0LCAgMjQsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBNZXhpY28KKwkJCSJNWCIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsIAk0LCAgMjMsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgCTQsICAyNCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDE0OSwgIDUsICAzMCwgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMTQ5fjE2NQorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gTmV0aGVybGFuZHMKKwkJCSJOTCIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsIAk0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgCTQsICAyNCwgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTAwLCAxMSwgIDMwLCBCT1RILCBUUlVFfSwJLy8gNUcsIGNoIDEwMH4xNDAKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIE5ldyBaZWFsYW5kCisJCQkiTloiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDM2LCAJNCwgIDI0LCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgNTIsIAk0LCAgMjQsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAxNDksICA0LCAgMzAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjEKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIE5vcndheQorCQkJIk5PIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgCTQsICAyNCwgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAJNCwgIDI0LCBJRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAxMDAsIDExLCAgMzAsIEJPVEgsIFRSVUV9LAkvLyA1RywgY2ggMTQ5fjE2MQorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gUGVydQorCQkJIlBFIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAxNDksICA0LCAgMjcsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjEKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIFBvcnR1Z2FsCisJCQkiUFQiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDM2LCAgIDQsICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAgIDQsICAyMywgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTAwLCAxMSwgIDMwLCBCT1RILCBUUlVFfSwJLy8gNUcsIGNoIDEwMH4xNDAKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIFBvbGFuZAorCQkJIlBMIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgICA0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgICA0LCAgMjMsIElET1IsIFRSVUV9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDEwMCwgMTEsICAzMCwgQk9USCwgVFJVRX0sCS8vIDVHLCBjaCAxMDB+MTQwCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBSb21hbmlhCisJCQkiUk8iLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDM2LCAgIDQsICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAgIDQsICAyMywgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTAwLCAxMSwgIDMwLCBCT1RILCBUUlVFfSwJLy8gNUcsIGNoIDEwMH4xNDAKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIFJ1c3NpYQorCQkJIlJVIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAxNDksICA0LCAgMjAsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjEKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIFNhdWRpIEFyYWJpYQorCQkJIlNBIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgICA0LCAgMjMsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgICA0LCAgMjMsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAxNDksICA0LCAgMjMsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjEKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIFNlcmJpYV9hbmRfTW9udGVuZWdybworCQkJIkNTIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBTaW5nYXBvcmUKKwkJCSJTRyIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsICAgNCwgIDIzLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgNTIsICAgNCwgIDIzLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTQ5LCAgNCwgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxNDl+MTYxCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBTbG92YWtpYQorCQkJIlNLIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgICA0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgICA0LCAgMjMsIElET1IsIFRSVUV9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDEwMCwgMTEsICAzMCwgQk9USCwgVFJVRX0sCS8vIDVHLCBjaCAxMDB+MTQwCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBTbG92ZW5pYQorCQkJIlNJIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgICA0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgICA0LCAgMjMsIElET1IsIFRSVUV9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIFNvdXRoIEFmcmljYQorCQkJIlpBIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgICA0LCAgMjMsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgICA0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAxMDAsIDExLCAgMzAsIEJPVEgsIFRSVUV9LAkvLyA1RywgY2ggMTAwfjE0MAorCQkJCXsgMTQ5LCAgNCwgIDMwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxNDl+MTYxCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBTb3V0aCBLb3JlYQorCQkJIktSIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgICA0LCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgICA0LCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAxMDAsICA4LCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDEwMH4xMjgKKwkJCQl7IDE0OSwgIDQsICAyMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTQ5fjE2MQorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gU3BhaW4KKwkJCSJFUyIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsICAgNCwgIDE3LCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgNTIsICAgNCwgIDIzLCBJRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAxMDAsIDExLCAgMzAsIEJPVEgsIFRSVUV9LAkvLyA1RywgY2ggMTAwfjE0MAorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gU3dlZGVuCisJCQkiU0UiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDM2LCAgIDQsICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAgIDQsICAyMywgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTAwLCAxMSwgIDMwLCBCT1RILCBUUlVFfSwJLy8gNUcsIGNoIDEwMH4xNDAKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIFN3aXR6ZXJsYW5kCisJCQkiQ0giLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDM2LCAgIDQsICAyMywgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgNTIsICAgNCwgIDIzLCBJRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBUYWl3YW4KKwkJCSJUVyIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTEsICAzMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMQorCQkJCXsgNTIsICAgNCwgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gVHVya2V5CisJCQkiVFIiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTEKKwkJCQl7IDM2LCAgIDQsICAyMywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAgIDQsICAyMywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIFVLCisJCQkiR0IiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTEKKwkJCQl7IDM2LCAgIDQsICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDUyLCAgIDQsICAyMywgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTAwLCAxMSwgIDMwLCBCT1RILCBUUlVFfSwJLy8gNUcsIGNoIDEwMH4xNDAKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIFVrcmFpbmUKKwkJCSJVQSIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMQorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gVW5pdGVkX0FyYWJfRW1pcmF0ZXMKKwkJCSJBRSIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMQorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gVW5pdGVkX1N0YXRlcworCQkJIlVTIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMSwgIDMwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjExCisJCQkJeyAzNiwgICA0LCAgMTcsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyA1MiwgICA0LCAgMjQsIEJPVEgsIFRSVUV9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDEwMCwgMTEsICAzMCwgQk9USCwgVFJVRX0sCS8vIDVHLCBjaCAxMDB+MTQwCisJCQkJeyAxNDksICA1LCAgMzAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjUKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIFZlbmV6dWVsYQorCQkJIlZFIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjExCisJCQkJeyAxNDksICA0LCAgMjcsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjEKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIERlZmF1bHQKKwkJCSIiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDExLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTEKKwkJCQl7IDM2LCAgIDQsICAyMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDUyLCAgIDQsICAyMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDEwMCwgMTEsICAyMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTAwfjE0MAorCQkJCXsgMTQ5LCAgNSwgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxNDl+MTY1CisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCit9OworCitzdGF0aWMgaW5saW5lIFBDSF9SRUdJT04gR2V0Q2hSZWdpb24oCisJSU4gUFVDSEFSIENudHJ5Q29kZSkKK3sKKwlJTlQgbG9vcCA9IDA7CisJUENIX1JFR0lPTiBwQ2hSZWdpb24gPSBOVUxMOworCisJd2hpbGUgKHN0cmNtcChDaFJlZ2lvbltsb29wXS5Db3VudFJlZywgIiIpICE9IDApCisJeworCQlpZiAoc3RybmNtcChDaFJlZ2lvbltsb29wXS5Db3VudFJlZywgQ250cnlDb2RlLCAyKSA9PSAwKQorCQl7CisJCQlwQ2hSZWdpb24gPSAmQ2hSZWdpb25bbG9vcF07CisJCQlicmVhazsKKwkJfQorCQlsb29wKys7CisJfQorCisJaWYgKHBDaFJlZ2lvbiA9PSBOVUxMKQorCQlwQ2hSZWdpb24gPSAmQ2hSZWdpb25bbG9vcF07CisJcmV0dXJuIHBDaFJlZ2lvbjsKK30KKworc3RhdGljIGlubGluZSBWT0lEIENoQmFuZENoZWNrKAorCUlOIFVDSEFSIFBoeU1vZGUsCisJT1VUIFBVQ0hBUiBwQ2hUeXBlKQoreworCXN3aXRjaChQaHlNb2RlKQorCXsKKwkJY2FzZSBQSFlfMTFBOgorI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQljYXNlIFBIWV8xMUFOX01JWEVEOgorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQkJKnBDaFR5cGUgPSBCQU5EXzVHOworCQkJYnJlYWs7CisJCWNhc2UgUEhZXzExQUJHX01JWEVEOgorI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQljYXNlIFBIWV8xMUFHTl9NSVhFRDoKKwkJY2FzZSBQSFlfMTFBQkdOX01JWEVEOgorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQkJKnBDaFR5cGUgPSBCQU5EX0JPVEg7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJKnBDaFR5cGUgPSBCQU5EXzI0RzsKKwkJCWJyZWFrOworCX0KK30KKworc3RhdGljIGlubGluZSBVQ0hBUiBGaWxsQ2hMaXN0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFBDSF9ERVNQIHBDaERlc3AsCisJSU4gVUNIQVIgT2Zmc2V0LAorCUlOIFVDSEFSIGluY3JlbWVudCkKK3sKKwlJTlQgaSwgaiwgbDsKKwlVQ0hBUiBjaGFubmVsOworCisJaiA9IE9mZnNldDsKKwlmb3IgKGkgPSAwOyBpIDwgcENoRGVzcC0+TnVtT2ZDaDsgaSsrKQorCXsKKwkJY2hhbm5lbCA9IHBDaERlc3AtPkZpcnN0Q2hhbm5lbCArIGkgKiBpbmNyZW1lbnQ7CisJCWZvciAobD0wOyBsPE1BWF9OVU1fT0ZfQ0hBTk5FTFM7IGwrKykKKwkJeworCQkJaWYgKGNoYW5uZWwgPT0gcEFkLT5UeFBvd2VyW2xdLkNoYW5uZWwpCisJCQl7CisJCQkJcEFkLT5DaGFubmVsTGlzdFtqXS5Qb3dlciA9IHBBZC0+VHhQb3dlcltsXS5Qb3dlcjsKKwkJCQlwQWQtPkNoYW5uZWxMaXN0W2pdLlBvd2VyMiA9IHBBZC0+VHhQb3dlcltsXS5Qb3dlcjI7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaWYgKGwgPT0gTUFYX05VTV9PRl9DSEFOTkVMUykKKwkJCWNvbnRpbnVlOworCisJCXBBZC0+Q2hhbm5lbExpc3Rbal0uQ2hhbm5lbCA9IHBDaERlc3AtPkZpcnN0Q2hhbm5lbCArIGkgKiBpbmNyZW1lbnQ7CisJCXBBZC0+Q2hhbm5lbExpc3Rbal0uTWF4VHhQd3IgPSBwQ2hEZXNwLT5NYXhUeFB3cjsKKwkJcEFkLT5DaGFubmVsTGlzdFtqXS5EZnNSZXEgPSBwQ2hEZXNwLT5EZnNSZXE7CisJCWorKzsKKwl9CisJcEFkLT5DaGFubmVsTGlzdE51bSA9IGo7CisKKwlyZXR1cm4gajsKK30KKworc3RhdGljIGlubGluZSBWT0lEIENyZWF0ZUNoTGlzdCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBQQ0hfUkVHSU9OIHBDaFJlZ2lvbiwKKwlJTiBVQ0hBUiBHZW9ncmFwaHkpCit7CisJSU5UIGk7CisJVUNIQVIgb2Zmc2V0ID0gMDsKKwlQQ0hfREVTUCBwQ2hEZXNwOworCVVDSEFSIENoVHlwZTsKKwlVQ0hBUiBpbmNyZW1lbnQ7CisKKwlpZiAocENoUmVnaW9uID09IE5VTEwpCisJCXJldHVybjsKKworCUNoQmFuZENoZWNrKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUsICZDaFR5cGUpOworCisJZm9yIChpPTA7IGk8MTA7IGkrKykKKwl7CisJCXBDaERlc3AgPSAmcENoUmVnaW9uLT5DaERlc3BbaV07CisJCWlmIChwQ2hEZXNwLT5GaXJzdENoYW5uZWwgPT0gMCkKKwkJCWJyZWFrOworCisJCWlmIChDaFR5cGUgPT0gQkFORF81RykKKwkJeworCQkJaWYgKHBDaERlc3AtPkZpcnN0Q2hhbm5lbCA8PSAxNCkKKwkJCQljb250aW51ZTsKKwkJfQorCQllbHNlIGlmIChDaFR5cGUgPT0gQkFORF8yNEcpCisJCXsKKwkJCWlmIChwQ2hEZXNwLT5GaXJzdENoYW5uZWwgPiAxNCkKKwkJCQljb250aW51ZTsKKwkJfQorCisJCWlmICgocENoRGVzcC0+R2VvZ3JhcGh5ID09IEJPVEgpCisJCQl8fCAocENoRGVzcC0+R2VvZ3JhcGh5ID09IEdlb2dyYXBoeSkpCisgICAgICAgIHsKKwkJCWlmIChwQ2hEZXNwLT5GaXJzdENoYW5uZWwgPiAxNCkKKyAgICAgICAgICAgICAgICBpbmNyZW1lbnQgPSA0OworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGluY3JlbWVudCA9IDE7CisJCQlvZmZzZXQgPSBGaWxsQ2hMaXN0KHBBZCwgcENoRGVzcCwgb2Zmc2V0LCBpbmNyZW1lbnQpOworICAgICAgICB9CisJfQorfQorCitzdGF0aWMgaW5saW5lIFZPSUQgQnVpbGRDaGFubmVsTGlzdEV4KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCVBDSF9SRUdJT04gcENoUmVnOworCisJcENoUmVnID0gR2V0Q2hSZWdpb24ocEFkLT5Db21tb25DZmcuQ291bnRyeUNvZGUpOworCUNyZWF0ZUNoTGlzdChwQWQsIHBDaFJlZywgcEFkLT5Db21tb25DZmcuR2VvZ3JhcGh5KTsKK30KKworc3RhdGljIGlubGluZSBWT0lEIEJ1aWxkQmVhY29uQ2hMaXN0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCU9VVCBQVUNIQVIgcEJ1ZiwKKwlPVVQJUFVMT05HIHBCdWZMZW4pCit7CisJSU5UIGk7CisJVUxPTkcgVG1wTGVuOworCVBDSF9SRUdJT04gcENoUmVnaW9uOworCVBDSF9ERVNQIHBDaERlc3A7CisJVUNIQVIgQ2hUeXBlOworCisJcENoUmVnaW9uID0gR2V0Q2hSZWdpb24ocEFkLT5Db21tb25DZmcuQ291bnRyeUNvZGUpOworCisJaWYgKHBDaFJlZ2lvbiA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlDaEJhbmRDaGVjayhwQWQtPkNvbW1vbkNmZy5QaHlNb2RlLCAmQ2hUeXBlKTsKKwkqcEJ1ZkxlbiA9IDA7CisKKwlmb3IgKGk9MDsgaTwxMDsgaSsrKQorCXsKKwkJcENoRGVzcCA9ICZwQ2hSZWdpb24tPkNoRGVzcFtpXTsKKwkJaWYgKHBDaERlc3AtPkZpcnN0Q2hhbm5lbCA9PSAwKQorCQkJYnJlYWs7CisKKwkJaWYgKENoVHlwZSA9PSBCQU5EXzVHKQorCQl7CisJCQlpZiAocENoRGVzcC0+Rmlyc3RDaGFubmVsIDw9IDE0KQorCQkJCWNvbnRpbnVlOworCQl9CisJCWVsc2UgaWYgKENoVHlwZSA9PSBCQU5EXzI0RykKKwkJeworCQkJaWYgKHBDaERlc3AtPkZpcnN0Q2hhbm5lbCA+IDE0KQorCQkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKChwQ2hEZXNwLT5HZW9ncmFwaHkgPT0gQk9USCkKKwkJCXx8IChwQ2hEZXNwLT5HZW9ncmFwaHkgPT0gcEFkLT5Db21tb25DZmcuR2VvZ3JhcGh5KSkKKwkJeworCQkJTWFrZU91dGdvaW5nRnJhbWUocEJ1ZiArICpwQnVmTGVuLAkJJlRtcExlbiwKKwkJCQkJCQkJMSwgICAgICAgICAgICAgICAgIAkmcENoRGVzcC0+Rmlyc3RDaGFubmVsLAorCQkJCQkJCQkxLCAgICAgICAgICAgICAgICAgCSZwQ2hEZXNwLT5OdW1PZkNoLAorCQkJCQkJCQkxLCAgICAgICAgICAgICAgICAgCSZwQ2hEZXNwLT5NYXhUeFB3ciwKKwkJCQkJCQkJRU5EX09GX0FSR1MpOworCQkJKnBCdWZMZW4gKz0gVG1wTGVuOworCQl9CisJfQorfQorCisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKK3N0YXRpYyBpbmxpbmUgQk9PTEVBTiBJc1ZhbGlkQ2hhbm5lbCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVQ0hBUiBjaGFubmVsKQorCit7CisJSU5UIGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgcEFkLT5DaGFubmVsTGlzdE51bTsgaSsrKQorCXsKKwkJaWYgKHBBZC0+Q2hhbm5lbExpc3RbaV0uQ2hhbm5lbCA9PSBjaGFubmVsKQorCQkJYnJlYWs7CisJfQorCisJaWYgKGkgPT0gcEFkLT5DaGFubmVsTGlzdE51bSkKKwkJcmV0dXJuIEZBTFNFOworCWVsc2UKKwkJcmV0dXJuIFRSVUU7Cit9CisKKworc3RhdGljIGlubGluZSBVQ0hBUiBHZXRFeHRDaCgKKwlJTiBVQ0hBUiBDaGFubmVsLAorCUlOIFVDSEFSIERpcmVjdGlvbikKK3sKKwlDSEFSIEV4dENoOworCisJaWYgKERpcmVjdGlvbiA9PSBFWFRDSEFfQUJPVkUpCisJCUV4dENoID0gQ2hhbm5lbCArIDQ7CisJZWxzZQorCQlFeHRDaCA9IChDaGFubmVsIC0gNCkgPiAwID8gKENoYW5uZWwgLSA0KSA6IDA7CisKKwlyZXR1cm4gRXh0Q2g7Cit9CisKKworc3RhdGljIGlubGluZSBWT0lEIE5fQ2hhbm5lbENoZWNrKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCS8vVUNIQVIgQ2hhbm5lbE51bSA9IHBBZC0+Q2hhbm5lbExpc3ROdW07CisJVUNIQVIgQ2hhbm5lbCA9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWw7CisKKwlpZiAoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCkgJiYgKHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5CVyAgPT0gQldfNDApKQorCXsKKwkJaWYgKENoYW5uZWwgPiAxNCkKKwkJeworCQkJaWYgKChDaGFubmVsID09IDM2KSB8fCAoQ2hhbm5lbCA9PSA0NCkgfHwgKENoYW5uZWwgPT0gNTIpIHx8IChDaGFubmVsID09IDYwKSB8fCAoQ2hhbm5lbCA9PSAxMDApIHx8IChDaGFubmVsID09IDEwOCkgfHwKKwkJCSAgICAoQ2hhbm5lbCA9PSAxMTYpIHx8IChDaGFubmVsID09IDEyNCkgfHwgKENoYW5uZWwgPT0gMTMyKSB8fCAoQ2hhbm5lbCA9PSAxNDkpIHx8IChDaGFubmVsID09IDE1NykpCisJCQl7CisJCQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkVYVENIQSA9IEVYVENIQV9BQk9WRTsKKwkJCX0KKwkJCWVsc2UgaWYgKChDaGFubmVsID09IDQwKSB8fCAoQ2hhbm5lbCA9PSA0OCkgfHwgKENoYW5uZWwgPT0gNTYpIHx8IChDaGFubmVsID09IDY0KSB8fCAoQ2hhbm5lbCA9PSAxMDQpIHx8IChDaGFubmVsID09IDExMikgfHwKKwkJCQkJKENoYW5uZWwgPT0gMTIwKSB8fCAoQ2hhbm5lbCA9PSAxMjgpIHx8IChDaGFubmVsID09IDEzNikgfHwgKENoYW5uZWwgPT0gMTUzKSB8fCAoQ2hhbm5lbCA9PSAxNjEpKQorCQkJeworCQkJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5FWFRDSEEgPSBFWFRDSEFfQkVMT1c7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXICA9IEJXXzIwOworCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJZG8KKwkJCXsKKwkJCQlVQ0hBUiBFeHRDaDsKKwkJCQlVQ0hBUiBEaXIgPSBwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuRVhUQ0hBOworCQkJCUV4dENoID0gR2V0RXh0Q2goQ2hhbm5lbCwgRGlyKTsKKwkJCQlpZiAoSXNWYWxpZENoYW5uZWwocEFkLCBFeHRDaCkpCisJCQkJCWJyZWFrOworCisJCQkJRGlyID0gKERpciA9PSBFWFRDSEFfQUJPVkUpID8gRVhUQ0hBX0JFTE9XIDogRVhUQ0hBX0FCT1ZFOworCQkJCUV4dENoID0gR2V0RXh0Q2goQ2hhbm5lbCwgRGlyKTsKKwkJCQlpZiAoSXNWYWxpZENoYW5uZWwocEFkLCBFeHRDaCkpCisJCQkJeworCQkJCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuRVhUQ0hBID0gRGlyOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXICA9IEJXXzIwOworCQkJfSB3aGlsZShGQUxTRSk7CisKKwkJCWlmIChDaGFubmVsID09IDE0KQorCQkJeworCQkJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5CVyAgPSBCV18yMDsKKwkJCQkvL3BBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5FWFRDSEEgPSBFWFRDSEFfTk9ORTsJLy8gV2UgZGlkbid0IHNldCB0aGUgRXh0Q2ggYXMgTk9ORSBkdWUgdG8gaXQnbGwgc2V0IGluIFJUTVBTZXRIVCgpCisJCQl9CisjaWYgMAorCQkJc3dpdGNoIChwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uICAmIDB4N2YpCisJCQl7CisJCQkJY2FzZSBSRUdJT05fMF9CR19CQU5EOgkvLyAxIC0xMQorCQkJCWNhc2UgUkVHSU9OXzFfQkdfQkFORDoJLy8gMSAtIDEzCisJCQkJY2FzZSBSRUdJT05fNV9CR19CQU5EOgkvLyAxIC0gMTQKKwkJCQkJaWYgKENoYW5uZWwgPD0gNCkKKwkJCQkJeworCQkJCQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkVYVENIQSA9IEVYVENIQV9BQk9WRTsKKwkJCQkJfQorCQkJCQllbHNlIGlmIChDaGFubmVsID49IDgpCisJCQkJCXsKKwkJCQkJCWlmICgoQ2hhbm5lbE51bSAtIENoYW5uZWwpIDwgNCkKKwkJCQkJCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuRVhUQ0hBID0gRVhUQ0hBX0JFTE9XOworCQkJCQl9CisJCQkJCWJyZWFrOworCisJCQkJY2FzZSBSRUdJT05fMl9CR19CQU5EOgkvLyAxMCAtIDExCisJCQkJY2FzZSBSRUdJT05fM19CR19CQU5EOgkvLyAxMCAtIDEzCisJCQkJY2FzZSBSRUdJT05fNF9CR19CQU5EOgkvLyAxNAorCQkJCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlcgID0gQldfMjA7CisJCQkJCWJyZWFrOworCisJCQkJY2FzZSBSRUdJT05fNl9CR19CQU5EOgkvLyAzIC0gOQorCQkJCQlpZiAoQ2hhbm5lbCA8PSA1KQorCQkJCQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkVYVENIQSA9IEVYVENIQV9BQk9WRTsKKwkJCQkJZWxzZSBpZiAoQ2hhbm5lbCA9PSA2KQorCQkJCQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXICA9IEJXXzIwOworCQkJCQllbHNlIGlmIChDaGFubmVsID49IDcpCisJCQkJCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuRVhUQ0hBID0gRVhUQ0hBX0JFTE9XOworCQkJCQlicmVhazsKKworCQkJCWNhc2UgUkVHSU9OXzdfQkdfQkFORDogIC8vIDUgLSAxMworCQkJCQlpZiAoQ2hhbm5lbCA8PSA4KQorCQkJCQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkVYVENIQSA9IEVYVENIQV9BQk9WRTsKKwkJCQkJZWxzZSBpZiAoQ2hhbm5lbCA+PSAxMCkKKwkJCQkJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5FWFRDSEEgPSBFWFRDSEFfQkVMT1c7CisJCQkJCWJyZWFrOworCisJCQkJZGVmYXVsdDoJLy8gRXJyb3IuIHNob3VsZCBuZXZlciBoYXBwZW4KKwkJCQkJYnJlYWs7CisJCQl9CisjZW5kaWYKKwkJfQorCX0KKworCit9CisKKworc3RhdGljIGlubGluZSBWT0lEIE5fU2V0Q2VuQ2goCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJaWYgKHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5CVyA9PSBCV180MCkKKwl7CisJCWlmIChwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuRVhUQ0hBID09IEVYVENIQV9BQk9WRSkKKwkJeworCQkJcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsICsgMjsKKwkJfQorCQllbHNlCisJCXsKKwkJCWlmIChwQWQtPkNvbW1vbkNmZy5DaGFubmVsID09IDE0KQorCQkJCXBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsID0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbCAtIDE7CisJCQllbHNlCisJCQkJcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsIC0gMjsKKwkJfQorCX0KKwllbHNlCisJeworCQlwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWw7CisJfQorfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisKK3N0YXRpYyBpbmxpbmUgVUlOVDggR2V0Q3VudHJ5TWF4VHhQd3IoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVUlOVDggY2hhbm5lbCkKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgcEFkLT5DaGFubmVsTGlzdE51bTsgaSsrKQorCXsKKwkJaWYgKHBBZC0+Q2hhbm5lbExpc3RbaV0uQ2hhbm5lbCA9PSBjaGFubmVsKQorCQkJYnJlYWs7CisJfQorCisJaWYgKGkgPT0gcEFkLT5DaGFubmVsTGlzdE51bSkKKwkJcmV0dXJuIDB4ZmY7CisJZWxzZQorCQlyZXR1cm4gcEFkLT5DaGFubmVsTGlzdFtpXS5NYXhUeFB3cjsKK30KKyNlbmRpZiAvLyBfX0NITElTVF9IX18KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vMjg2MF9ydG1wX2luaXQuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uLzI4NjBfcnRtcF9pbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQ2ZjMwNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uLzI4NjBfcnRtcF9pbml0LmMKQEAgLTAsMCArMSw5MjIgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJTW9kdWxlIE5hbWU6CisJMjg2MF9ydG1wX2luaXQuYworCisJQWJzdHJhY3Q6CisJTWluaXBvcnQgZ2VuZXJpYyBwb3J0aW9uIGhlYWRlciBmaWxlCisKKwlSZXZpc2lvbiBIaXN0b3J5OgorCVdobyAgICAgICAgIFdoZW4gICAgICAgICAgV2hhdAorCS0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCVBhdWwgTGluICAgIDIwMDItMDgtMDEgICAgY3JlYXRlZAorICAgIEpvaG4gQ2hhbmcgIDIwMDQtMDgtMjAgICAgUlQyNTYxLzI2NjEgdXNlIHNjYXR0ZXItZ2F0aGVyIHNjaGVtZQorICAgIEphbiBMZWUgIDIwMDYtMDktMTUgICAgUlQyODYwLiBDaGFuZ2UgZm9yIDgwMi4xMW4gLCBFRVBST00sIExlZCwgQkEsIEhULgorKi8KKyNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKKworCisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCUFsbG9jYXRlIERNQSBtZW1vcnkgYmxvY2tzIGZvciBzZW5kLCByZWNlaXZlCisKKwlBcmd1bWVudHM6CisJCUFkYXB0ZXIJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKworCVJldHVybiBWYWx1ZToKKwkJTkRJU19TVEFUVVNfU1VDQ0VTUworCQlORElTX1NUQVRVU19GQUlMVVJFCisJCU5ESVNfU1RBVFVTX1JFU09VUkNFUworCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitORElTX1NUQVRVUwlSVE1QQWxsb2NUeFJ4UmluZ01lbW9yeSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCkKK3sKKwlORElTX1NUQVRVUwkJU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKwlVTE9ORwkJCVJpbmdCYXNlUGFIaWdoOworCVVMT05HCQkJUmluZ0Jhc2VQYUxvdzsKKwlQVk9JRAkJCVJpbmdCYXNlVmE7CisJSU5UCQkJCWluZGV4LCBudW07CisJUFRYRF9TVFJVQwkJcFR4RDsKKwlQUlhEX1NUUlVDCQlwUnhEOworCVVMT05HCQkJRXJyb3JWYWx1ZSA9IDA7CisJUFJUTVBfVFhfUklORwlwVHhSaW5nOworCVBSVE1QX0RNQUJVRglwRG1hQnVmOworCVBORElTX1BBQ0tFVAlwUGFja2V0OworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+IFJUTVBBbGxvY1R4UnhSaW5nTWVtb3J5XG4iKSk7CisJZG8KKwl7CisJCS8vCisJCS8vIEFsbG9jYXRlIGFsbCByaW5nIGRlc2NyaXB0b3JzLCBpbmNsdWRlIFR4RCwgUnhELCBNZ210RC4KKwkJLy8gQWx0aG91Z2ggZWFjaCBzaXplIGlzIGRpZmZlcmVudCwgdG8gcHJldmVudCBjYWNoZWxpbmUgYW5kIGFsaWdubWVudAorCQkvLyBpc3N1ZSwgSSBpbnRlbnRpb25hbCBzZXQgdGhlbSBhbGwgdG8gNjQgYnl0ZXMuCisJCS8vCisJCWZvciAobnVtPTA7IG51bTxOVU1fT0ZfVFhfUklORzsgbnVtKyspCisJCXsKKwkJCVVMT05HICBCdWZCYXNlUGFIaWdoOworCQkJVUxPTkcgIEJ1ZkJhc2VQYUxvdzsKKwkJCVBWT0lEICBCdWZCYXNlVmE7CisKKwkJCS8vCisJCQkvLyBBbGxvY2F0ZSBUeCByaW5nIGRlc2NyaXB0b3IncyBtZW1vcnkgKDUgVFggcmluZ3MgPSA0IEFDcyArIDEgSENDQSkKKwkJCS8vCisJCQlwQWQtPlR4RGVzY1JpbmdbbnVtXS5BbGxvY1NpemUgPSBUWF9SSU5HX1NJWkUgKiBUWERfU0laRTsKKwkJCVJUTVBfQWxsb2NhdGVUeERlc2NNZW1vcnkoCisJCQkJcEFkLAorCQkJCW51bSwKKwkJCQlwQWQtPlR4RGVzY1JpbmdbbnVtXS5BbGxvY1NpemUsCisJCQkJRkFMU0UsCisJCQkJJnBBZC0+VHhEZXNjUmluZ1tudW1dLkFsbG9jVmEsCisJCQkJJnBBZC0+VHhEZXNjUmluZ1tudW1dLkFsbG9jUGEpOworCisJCQlpZiAocEFkLT5UeERlc2NSaW5nW251bV0uQWxsb2NWYSA9PSBOVUxMKQorCQkJeworCQkJCUVycm9yVmFsdWUgPSBFUlJMT0dfT1VUX09GX1NIQVJFRF9NRU1PUlk7CisJCQkJREJHUFJJTlRfRVJSKCgiRmFpbGVkIHRvIGFsbG9jYXRlIGEgYmlnIGJ1ZmZlclxuIikpOworCQkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1JFU09VUkNFUzsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJLy8gWmVybyBpbml0IHRoaXMgbWVtb3J5IGJsb2NrCisJCQlOZGlzWmVyb01lbW9yeShwQWQtPlR4RGVzY1JpbmdbbnVtXS5BbGxvY1ZhLCBwQWQtPlR4RGVzY1JpbmdbbnVtXS5BbGxvY1NpemUpOworCisJCQkvLyBTYXZlIFBBICYgVkEgZm9yIGZ1cnRoZXIgb3BlcmF0aW9uCisJCQlSaW5nQmFzZVBhSGlnaCA9IFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzSGlnaChwQWQtPlR4RGVzY1JpbmdbbnVtXS5BbGxvY1BhKTsKKwkJCVJpbmdCYXNlUGFMb3cgID0gUlRNUF9HZXRQaHlzaWNhbEFkZHJlc3NMb3cgKHBBZC0+VHhEZXNjUmluZ1tudW1dLkFsbG9jUGEpOworCQkJUmluZ0Jhc2VWYSAgICAgPSBwQWQtPlR4RGVzY1JpbmdbbnVtXS5BbGxvY1ZhOworCisJCQkvLworCQkJLy8gQWxsb2NhdGUgYWxsIDFzdCBUWEJ1ZidzIG1lbW9yeSBmb3IgdGhpcyBUeFJpbmcKKwkJCS8vCisJCQlwQWQtPlR4QnVmU3BhY2VbbnVtXS5BbGxvY1NpemUgPSBUWF9SSU5HX1NJWkUgKiBUWF9ETUFfMVNUX0JVRkZFUl9TSVpFOworCQkJUlRNUF9BbGxvY2F0ZUZpcnN0VHhCdWZmZXIoCisJCQkJcEFkLAorCQkJCW51bSwKKwkJCQlwQWQtPlR4QnVmU3BhY2VbbnVtXS5BbGxvY1NpemUsCisJCQkJRkFMU0UsCisJCQkJJnBBZC0+VHhCdWZTcGFjZVtudW1dLkFsbG9jVmEsCisJCQkJJnBBZC0+VHhCdWZTcGFjZVtudW1dLkFsbG9jUGEpOworCisJCQlpZiAocEFkLT5UeEJ1ZlNwYWNlW251bV0uQWxsb2NWYSA9PSBOVUxMKQorCQkJeworCQkJCUVycm9yVmFsdWUgPSBFUlJMT0dfT1VUX09GX1NIQVJFRF9NRU1PUlk7CisJCQkJREJHUFJJTlRfRVJSKCgiRmFpbGVkIHRvIGFsbG9jYXRlIGEgYmlnIGJ1ZmZlclxuIikpOworCQkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1JFU09VUkNFUzsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJLy8gWmVybyBpbml0IHRoaXMgbWVtb3J5IGJsb2NrCisJCQlOZGlzWmVyb01lbW9yeShwQWQtPlR4QnVmU3BhY2VbbnVtXS5BbGxvY1ZhLCBwQWQtPlR4QnVmU3BhY2VbbnVtXS5BbGxvY1NpemUpOworCisJCQkvLyBTYXZlIFBBICYgVkEgZm9yIGZ1cnRoZXIgb3BlcmF0aW9uCisJCQlCdWZCYXNlUGFIaWdoID0gUlRNUF9HZXRQaHlzaWNhbEFkZHJlc3NIaWdoKHBBZC0+VHhCdWZTcGFjZVtudW1dLkFsbG9jUGEpOworCQkJQnVmQmFzZVBhTG93ICA9IFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzTG93IChwQWQtPlR4QnVmU3BhY2VbbnVtXS5BbGxvY1BhKTsKKwkJCUJ1ZkJhc2VWYSAgICAgPSBwQWQtPlR4QnVmU3BhY2VbbnVtXS5BbGxvY1ZhOworCisJCQkvLworCQkJLy8gSW5pdGlhbGl6ZSBUeCBSaW5nIERlc2NyaXB0b3IgYW5kIGFzc29jaWF0ZWQgYnVmZmVyIG1lbW9yeQorCQkJLy8KKwkJCXBUeFJpbmcgPSAmcEFkLT5UeFJpbmdbbnVtXTsKKwkJCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IFRYX1JJTkdfU0laRTsgaW5kZXgrKykKKwkJCXsKKwkJCQlwVHhSaW5nLT5DZWxsW2luZGV4XS5wTmRpc1BhY2tldCA9IE5VTEw7CisJCQkJcFR4UmluZy0+Q2VsbFtpbmRleF0ucE5leHROZGlzUGFja2V0ID0gTlVMTDsKKwkJCQkvLyBJbml0IFR4IFJpbmcgU2l6ZSwgVmEsIFBhIHZhcmlhYmxlcworCQkJCXBUeFJpbmctPkNlbGxbaW5kZXhdLkFsbG9jU2l6ZSA9IFRYRF9TSVpFOworCQkJCXBUeFJpbmctPkNlbGxbaW5kZXhdLkFsbG9jVmEgPSBSaW5nQmFzZVZhOworCQkJCVJUTVBfU2V0UGh5c2ljYWxBZGRyZXNzSGlnaChwVHhSaW5nLT5DZWxsW2luZGV4XS5BbGxvY1BhLCBSaW5nQmFzZVBhSGlnaCk7CisJCQkJUlRNUF9TZXRQaHlzaWNhbEFkZHJlc3NMb3cgKHBUeFJpbmctPkNlbGxbaW5kZXhdLkFsbG9jUGEsIFJpbmdCYXNlUGFMb3cpOworCisJCQkJLy8gU2V0dXAgVHggQnVmZmVyIHNpemUgJiBhZGRyZXNzLiBvbmx5IDgwMi4xMSBoZWFkZXIgd2lsbCBzdG9yZSBpbiB0aGlzIHNwYWNlCisJCQkJcERtYUJ1ZiA9ICZwVHhSaW5nLT5DZWxsW2luZGV4XS5EbWFCdWY7CisJCQkJcERtYUJ1Zi0+QWxsb2NTaXplID0gVFhfRE1BXzFTVF9CVUZGRVJfU0laRTsKKwkJCQlwRG1hQnVmLT5BbGxvY1ZhID0gQnVmQmFzZVZhOworCQkJCVJUTVBfU2V0UGh5c2ljYWxBZGRyZXNzSGlnaChwRG1hQnVmLT5BbGxvY1BhLCBCdWZCYXNlUGFIaWdoKTsKKwkJCQlSVE1QX1NldFBoeXNpY2FsQWRkcmVzc0xvdyhwRG1hQnVmLT5BbGxvY1BhLCBCdWZCYXNlUGFMb3cpOworCisJCQkJLy8gbGluayB0aGUgcHJlLWFsbG9jYXRlZCBUeEJ1ZiB0byBUWEQKKwkJCQlwVHhEID0gKFBUWERfU1RSVUMpIHBUeFJpbmctPkNlbGxbaW5kZXhdLkFsbG9jVmE7CisJCQkJcFR4RC0+U0RQdHIwID0gQnVmQmFzZVBhTG93OworCQkJCS8vIGFkdmFuY2UgdG8gbmV4dCByaW5nIGRlc2NyaXB0b3IgYWRkcmVzcworCQkJCXBUeEQtPkRNQURPTkUgPSAxOworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwkJCQlSVE1QRGVzY3JpcHRvckVuZGlhbkNoYW5nZSgoUFVDSEFSKXBUeEQsIFRZUEVfVFhEKTsKKyNlbmRpZgorCQkJCVJpbmdCYXNlUGFMb3cgKz0gVFhEX1NJWkU7CisJCQkJUmluZ0Jhc2VWYSA9IChQVUNIQVIpIFJpbmdCYXNlVmEgKyBUWERfU0laRTsKKworCQkJCS8vIGFkdmFuY2UgdG8gbmV4dCBUeEJ1ZiBhZGRyZXNzCisJCQkJQnVmQmFzZVBhTG93ICs9IFRYX0RNQV8xU1RfQlVGRkVSX1NJWkU7CisJCQkJQnVmQmFzZVZhID0gKFBVQ0hBUikgQnVmQmFzZVZhICsgVFhfRE1BXzFTVF9CVUZGRVJfU0laRTsKKwkJCX0KKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlR4UmluZ1slZF06IHRvdGFsICVkIGVudHJ5IGFsbG9jYXRlZFxuIiwgbnVtLCBpbmRleCkpOworCQl9CisJCWlmIChTdGF0dXMgPT0gTkRJU19TVEFUVVNfUkVTT1VSQ0VTKQorCQkJYnJlYWs7CisKKwkJLy8KKwkJLy8gQWxsb2NhdGUgTUdNVCByaW5nIGRlc2NyaXB0b3IncyBtZW1vcnkgZXhjZXB0IFR4IHJpbmcgd2hpY2ggYWxsb2NhdGVkIGVhcmlsZXIKKwkJLy8KKwkJcEFkLT5NZ210RGVzY1JpbmcuQWxsb2NTaXplID0gTUdNVF9SSU5HX1NJWkUgKiBUWERfU0laRTsKKwkJUlRNUF9BbGxvY2F0ZU1nbXREZXNjTWVtb3J5KAorCQkJcEFkLAorCQkJcEFkLT5NZ210RGVzY1JpbmcuQWxsb2NTaXplLAorCQkJRkFMU0UsCisJCQkmcEFkLT5NZ210RGVzY1JpbmcuQWxsb2NWYSwKKwkJCSZwQWQtPk1nbXREZXNjUmluZy5BbGxvY1BhKTsKKworCQlpZiAocEFkLT5NZ210RGVzY1JpbmcuQWxsb2NWYSA9PSBOVUxMKQorCQl7CisJCQlFcnJvclZhbHVlID0gRVJSTE9HX09VVF9PRl9TSEFSRURfTUVNT1JZOworCQkJREJHUFJJTlRfRVJSKCgiRmFpbGVkIHRvIGFsbG9jYXRlIGEgYmlnIGJ1ZmZlclxuIikpOworCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfUkVTT1VSQ0VTOworCQkJYnJlYWs7CisJCX0KKworCQkvLyBaZXJvIGluaXQgdGhpcyBtZW1vcnkgYmxvY2sKKwkJTmRpc1plcm9NZW1vcnkocEFkLT5NZ210RGVzY1JpbmcuQWxsb2NWYSwgcEFkLT5NZ210RGVzY1JpbmcuQWxsb2NTaXplKTsKKworCQkvLyBTYXZlIFBBICYgVkEgZm9yIGZ1cnRoZXIgb3BlcmF0aW9uCisJCVJpbmdCYXNlUGFIaWdoID0gUlRNUF9HZXRQaHlzaWNhbEFkZHJlc3NIaWdoKHBBZC0+TWdtdERlc2NSaW5nLkFsbG9jUGEpOworCQlSaW5nQmFzZVBhTG93ICA9IFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzTG93IChwQWQtPk1nbXREZXNjUmluZy5BbGxvY1BhKTsKKwkJUmluZ0Jhc2VWYSAgICAgPSBwQWQtPk1nbXREZXNjUmluZy5BbGxvY1ZhOworCisJCS8vCisJCS8vIEluaXRpYWxpemUgTUdNVCBSaW5nIGFuZCBhc3NvY2lhdGVkIGJ1ZmZlciBtZW1vcnkKKwkJLy8KKwkJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgTUdNVF9SSU5HX1NJWkU7IGluZGV4KyspCisJCXsKKwkJCXBBZC0+TWdtdFJpbmcuQ2VsbFtpbmRleF0ucE5kaXNQYWNrZXQgPSBOVUxMOworCQkJcEFkLT5NZ210UmluZy5DZWxsW2luZGV4XS5wTmV4dE5kaXNQYWNrZXQgPSBOVUxMOworCQkJLy8gSW5pdCBNR01UIFJpbmcgU2l6ZSwgVmEsIFBhIHZhcmlhYmxlcworCQkJcEFkLT5NZ210UmluZy5DZWxsW2luZGV4XS5BbGxvY1NpemUgPSBUWERfU0laRTsKKwkJCXBBZC0+TWdtdFJpbmcuQ2VsbFtpbmRleF0uQWxsb2NWYSA9IFJpbmdCYXNlVmE7CisJCQlSVE1QX1NldFBoeXNpY2FsQWRkcmVzc0hpZ2gocEFkLT5NZ210UmluZy5DZWxsW2luZGV4XS5BbGxvY1BhLCBSaW5nQmFzZVBhSGlnaCk7CisJCQlSVE1QX1NldFBoeXNpY2FsQWRkcmVzc0xvdyAocEFkLT5NZ210UmluZy5DZWxsW2luZGV4XS5BbGxvY1BhLCBSaW5nQmFzZVBhTG93KTsKKworCQkJLy8gT2Zmc2V0IHRvIG5leHQgcmluZyBkZXNjcmlwdG9yIGFkZHJlc3MKKwkJCVJpbmdCYXNlUGFMb3cgKz0gVFhEX1NJWkU7CisJCQlSaW5nQmFzZVZhID0gKFBVQ0hBUikgUmluZ0Jhc2VWYSArIFRYRF9TSVpFOworCisJCQkvLyBsaW5rIHRoZSBwcmUtYWxsb2NhdGVkIFR4QnVmIHRvIFRYRAorCQkJcFR4RCA9IChQVFhEX1NUUlVDKSBwQWQtPk1nbXRSaW5nLkNlbGxbaW5kZXhdLkFsbG9jVmE7CisJCQlwVHhELT5ETUFET05FID0gMTsKKworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwkJCVJUTVBEZXNjcmlwdG9yRW5kaWFuQ2hhbmdlKChQVUNIQVIpcFR4RCwgVFlQRV9UWEQpOworI2VuZGlmCisJCQkvLyBubyBwcmUtYWxsb2NhdGVkIGJ1ZmZlciByZXF1aXJlZCBpbiBNZ210UmluZyBmb3Igc2NhdHRlci1nYXRoZXIgY2FzZQorCQl9CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1HTVQgUmluZzogdG90YWwgJWQgZW50cnkgYWxsb2NhdGVkXG4iLCBpbmRleCkpOworCisJCS8vCisJCS8vIEFsbG9jYXRlIFJYIHJpbmcgZGVzY3JpcHRvcidzIG1lbW9yeSBleGNlcHQgVHggcmluZyB3aGljaCBhbGxvY2F0ZWQgZWFyaWxlcgorCQkvLworCQlwQWQtPlJ4RGVzY1JpbmcuQWxsb2NTaXplID0gUlhfUklOR19TSVpFICogUlhEX1NJWkU7CisJCVJUTVBfQWxsb2NhdGVSeERlc2NNZW1vcnkoCisJCQlwQWQsCisJCQlwQWQtPlJ4RGVzY1JpbmcuQWxsb2NTaXplLAorCQkJRkFMU0UsCisJCQkmcEFkLT5SeERlc2NSaW5nLkFsbG9jVmEsCisJCQkmcEFkLT5SeERlc2NSaW5nLkFsbG9jUGEpOworCisJCWlmIChwQWQtPlJ4RGVzY1JpbmcuQWxsb2NWYSA9PSBOVUxMKQorCQl7CisJCQlFcnJvclZhbHVlID0gRVJSTE9HX09VVF9PRl9TSEFSRURfTUVNT1JZOworCQkJREJHUFJJTlRfRVJSKCgiRmFpbGVkIHRvIGFsbG9jYXRlIGEgYmlnIGJ1ZmZlclxuIikpOworCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfUkVTT1VSQ0VTOworCQkJYnJlYWs7CisJCX0KKworCQkvLyBaZXJvIGluaXQgdGhpcyBtZW1vcnkgYmxvY2sKKwkJTmRpc1plcm9NZW1vcnkocEFkLT5SeERlc2NSaW5nLkFsbG9jVmEsIHBBZC0+UnhEZXNjUmluZy5BbGxvY1NpemUpOworCisKKwkJcHJpbnRrKCJSWCBERVNDICVwICBzaXplID0gJWxkXG4iLCBwQWQtPlJ4RGVzY1JpbmcuQWxsb2NWYSwKKwkJCQkJcEFkLT5SeERlc2NSaW5nLkFsbG9jU2l6ZSk7CisKKwkJLy8gU2F2ZSBQQSAmIFZBIGZvciBmdXJ0aGVyIG9wZXJhdGlvbgorCQlSaW5nQmFzZVBhSGlnaCA9IFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzSGlnaChwQWQtPlJ4RGVzY1JpbmcuQWxsb2NQYSk7CisJCVJpbmdCYXNlUGFMb3cgID0gUlRNUF9HZXRQaHlzaWNhbEFkZHJlc3NMb3cgKHBBZC0+UnhEZXNjUmluZy5BbGxvY1BhKTsKKwkJUmluZ0Jhc2VWYSAgICAgPSBwQWQtPlJ4RGVzY1JpbmcuQWxsb2NWYTsKKworCQkvLworCQkvLyBJbml0aWFsaXplIFJ4IFJpbmcgYW5kIGFzc29jaWF0ZWQgYnVmZmVyIG1lbW9yeQorCQkvLworCQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBSWF9SSU5HX1NJWkU7IGluZGV4KyspCisJCXsKKwkJCS8vIEluaXQgUlggUmluZyBTaXplLCBWYSwgUGEgdmFyaWFibGVzCisJCQlwQWQtPlJ4UmluZy5DZWxsW2luZGV4XS5BbGxvY1NpemUgPSBSWERfU0laRTsKKwkJCXBBZC0+UnhSaW5nLkNlbGxbaW5kZXhdLkFsbG9jVmEgPSBSaW5nQmFzZVZhOworCQkJUlRNUF9TZXRQaHlzaWNhbEFkZHJlc3NIaWdoKHBBZC0+UnhSaW5nLkNlbGxbaW5kZXhdLkFsbG9jUGEsIFJpbmdCYXNlUGFIaWdoKTsKKwkJCVJUTVBfU2V0UGh5c2ljYWxBZGRyZXNzTG93IChwQWQtPlJ4UmluZy5DZWxsW2luZGV4XS5BbGxvY1BhLCBSaW5nQmFzZVBhTG93KTsKKworCQkJLy8gT2Zmc2V0IHRvIG5leHQgcmluZyBkZXNjcmlwdG9yIGFkZHJlc3MKKwkJCVJpbmdCYXNlUGFMb3cgKz0gUlhEX1NJWkU7CisJCQlSaW5nQmFzZVZhID0gKFBVQ0hBUikgUmluZ0Jhc2VWYSArIFJYRF9TSVpFOworCisJCQkvLyBTZXR1cCBSeCBhc3NvY2lhdGVkIEJ1ZmZlciBzaXplICYgYWxsb2NhdGUgc2hhcmUgbWVtb3J5CisJCQlwRG1hQnVmID0gJnBBZC0+UnhSaW5nLkNlbGxbaW5kZXhdLkRtYUJ1ZjsKKwkJCXBEbWFCdWYtPkFsbG9jU2l6ZSA9IFJYX0JVRkZFUl9BR0dSRVNJWkU7CisJCQlwUGFja2V0ID0gUlRNUF9BbGxvY2F0ZVJ4UGFja2V0QnVmZmVyKAorCQkJCXBBZCwKKwkJCQlwRG1hQnVmLT5BbGxvY1NpemUsCisJCQkJRkFMU0UsCisJCQkJJnBEbWFCdWYtPkFsbG9jVmEsCisJCQkJJnBEbWFCdWYtPkFsbG9jUGEpOworCisJCQkvKiBrZWVwIGFsbG9jYXRlZCByeCBwYWNrZXQgKi8KKwkJCXBBZC0+UnhSaW5nLkNlbGxbaW5kZXhdLnBOZGlzUGFja2V0ID0gcFBhY2tldDsKKworCQkJLy8gRXJyb3IgaGFuZGxpbmcKKwkJCWlmIChwRG1hQnVmLT5BbGxvY1ZhID09IE5VTEwpCisJCQl7CisJCQkJRXJyb3JWYWx1ZSA9IEVSUkxPR19PVVRfT0ZfU0hBUkVEX01FTU9SWTsKKwkJCQlEQkdQUklOVF9FUlIoKCJGYWlsZWQgdG8gYWxsb2NhdGUgUnhSaW5nJ3MgMXN0IGJ1ZmZlclxuIikpOworCQkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1JFU09VUkNFUzsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJLy8gWmVybyBpbml0IHRoaXMgbWVtb3J5IGJsb2NrCisJCQlOZGlzWmVyb01lbW9yeShwRG1hQnVmLT5BbGxvY1ZhLCBwRG1hQnVmLT5BbGxvY1NpemUpOworCisJCQkvLyBXcml0ZSBSeEQgYnVmZmVyIGFkZHJlc3MgJiBhbGxvY2F0ZWQgYnVmZmVyIGxlbmd0aAorCQkJcFJ4RCA9IChQUlhEX1NUUlVDKSBwQWQtPlJ4UmluZy5DZWxsW2luZGV4XS5BbGxvY1ZhOworCQkJcFJ4RC0+U0RQMCA9IFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzTG93KHBEbWFCdWYtPkFsbG9jUGEpOworCQkJcFJ4RC0+RERPTkUgPSAwOworCisjaWZkZWYgUlRfQklHX0VORElBTgorCQkJUlRNUERlc2NyaXB0b3JFbmRpYW5DaGFuZ2UoKFBVQ0hBUilwUnhELCBUWVBFX1JYRCk7CisjZW5kaWYKKwkJfQorCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJ4IFJpbmc6IHRvdGFsICVkIGVudHJ5IGFsbG9jYXRlZFxuIiwgaW5kZXgpKTsKKworCX0Jd2hpbGUgKEZBTFNFKTsKKworCisJTmRpc1plcm9NZW1vcnkoJnBBZC0+RnJhZ0ZyYW1lLCBzaXplb2YoRlJBR01FTlRfRlJBTUUpKTsKKwlwQWQtPkZyYWdGcmFtZS5wRnJhZ1BhY2tldCA9ICBSVE1QX0FsbG9jYXRlRnJhZ1BhY2tldEJ1ZmZlcihwQWQsIFJYX0JVRkZFUl9OT1JNU0laRSk7CisKKwlpZiAocEFkLT5GcmFnRnJhbWUucEZyYWdQYWNrZXQgPT0gTlVMTCkKKwl7CisJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1JFU09VUkNFUzsKKwl9CisKKwlpZiAoU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJeworCQkvLyBMb2cgZXJyb3IgaW5mb3JhbXRpb24KKwkJTmRpc1dyaXRlRXJyb3JMb2dFbnRyeSgKKwkJCXBBZC0+QWRhcHRlckhhbmRsZSwKKwkJCU5ESVNfRVJST1JfQ09ERV9PVVRfT0ZfUkVTT1VSQ0VTLAorCQkJMSwKKwkJCUVycm9yVmFsdWUpOworCX0KKworCURCR1BSSU5UX1MoU3RhdHVzLCAoIjwtLSBSVE1QQWxsb2NUeFJ4UmluZ01lbW9yeSwgU3RhdHVzPSV4XG4iLCBTdGF0dXMpKTsKKwlyZXR1cm4gU3RhdHVzOworfQorCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlJbml0aWFsaXplIHRyYW5zbWl0IGRhdGEgc3RydWN0dXJlcworCisJQXJndW1lbnRzOgorCQlBZGFwdGVyCQkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCisJTm90ZToKKwkJSW5pdGlhbGl6ZSBhbGwgdHJhbnNtaXQgcmVsZWF0ZWQgcHJpdmF0ZSBidWZmZXIsIGluY2x1ZGUgdGhvc2UgZGVmaW5lCisJCWluIFJUTVBfQURBUFRFUiBzdHJ1Y3R1cmUgYW5kIGFsbCBwcml2YXRlIGRhdGEgc3RydWN0dXJlcy4KKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJTklDSW5pdFR4UnhSaW5nQW5kQmFja2xvZ1F1ZXVlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKQoreworCS8vV1BETUFfR0xPX0NGR19TVFJVQwlHbG9DZmc7CisJaW50IGk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8LS0+IE5JQ0luaXRUeFJ4UmluZ0FuZEJhY2tsb2dRdWV1ZVxuIikpOworCisJLy8gSW5pdGlhbGl6ZSBhbGwgdHJhbnNtaXQgcmVsYXRlZCBzb2Z0d2FyZSBxdWV1ZXMKKwlJbml0aWFsaXplUXVldWVIZWFkZXIoJnBBZC0+VHhTd1F1ZXVlW1FJRF9BQ19CRV0pOworCUluaXRpYWxpemVRdWV1ZUhlYWRlcigmcEFkLT5UeFN3UXVldWVbUUlEX0FDX0JLXSk7CisJSW5pdGlhbGl6ZVF1ZXVlSGVhZGVyKCZwQWQtPlR4U3dRdWV1ZVtRSURfQUNfVkldKTsKKwlJbml0aWFsaXplUXVldWVIZWFkZXIoJnBBZC0+VHhTd1F1ZXVlW1FJRF9BQ19WT10pOworCUluaXRpYWxpemVRdWV1ZUhlYWRlcigmcEFkLT5UeFN3UXVldWVbUUlEX0hDQ0FdKTsKKworCS8vIEluaXQgUlggUmluZyBpbmRleCBwb2ludGVyCisJcEFkLT5SeFJpbmcuUnhTd1JlYWRJZHggPSAwOworCXBBZC0+UnhSaW5nLlJ4Q3B1SWR4ID0gUlhfUklOR19TSVpFIC0gMTsKKworCS8vIEluaXQgVFggcmluZ3MgaW5kZXggcG9pbnRlcgorCQlmb3IgKGk9MDsgaTxOVU1fT0ZfVFhfUklORzsgaSsrKQorCQl7CisJCQlwQWQtPlR4UmluZ1tpXS5UeFN3RnJlZUlkeCA9IDA7CisJCQlwQWQtPlR4UmluZ1tpXS5UeENwdUlkeCA9IDA7CisJCX0KKworCS8vIGluaXQgTUdNVCByaW5nIGluZGV4IHBvaW50ZXIKKwlwQWQtPk1nbXRSaW5nLlR4U3dGcmVlSWR4ID0gMDsKKwlwQWQtPk1nbXRSaW5nLlR4Q3B1SWR4ID0gMDsKKworCXBBZC0+UHJpdmF0ZUluZm8uVHhSaW5nRnVsbENudCAgICAgICA9IDA7Cit9CisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVJlc2V0IE5JQyBBc2ljcy4gQ2FsbCBhZnRlciByZXN0IERNQS4gU28gcmVzZXQgVFhfQ1RYX0lEWCB0byB6ZXJvLgorCisJQXJndW1lbnRzOgorCQlBZGFwdGVyCQkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJTm90ZToKKwkJUmVzZXQgTklDIHRvIGluaXRpYWwgc3RhdGUgQVMgSVMgc3lzdGVtIGJvb3QgdXAgdGltZS4KKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJUlRNUFJpbmdDbGVhblVwKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVDSEFSCQkJUmluZ1R5cGUpCit7CisJUFRYRF9TVFJVQwkJcFR4RDsKKwlQUlhEX1NUUlVDCQlwUnhEOworCVBRVUVVRV9FTlRSWQlwRW50cnk7CisJUE5ESVNfUEFDS0VUCXBQYWNrZXQ7CisJaW50CQkJCWk7CisJUFJUTVBfVFhfUklORwlwVHhSaW5nOworCXVuc2lnbmVkIGxvbmcJSXJxRmxhZ3M7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJUTVBSaW5nQ2xlYW5VcChSaW5nSWR4PSVkLCBQZW5kaW5nLU5ESVM9JWxkKVxuIiwgUmluZ1R5cGUsIHBBZC0+UmFsaW5rQ291bnRlcnMuUGVuZGluZ05kaXNQYWNrZXRDb3VudCkpOworCXN3aXRjaCAoUmluZ1R5cGUpCisJeworCQljYXNlIFFJRF9BQ19CSzoKKwkJY2FzZSBRSURfQUNfQkU6CisJCWNhc2UgUUlEX0FDX1ZJOgorCQljYXNlIFFJRF9BQ19WTzoKKwkJY2FzZSBRSURfSENDQToKKwkJCVJUTVBfSVJRX0xPQ0soJnBBZC0+aXJxX2xvY2ssIElycUZsYWdzKTsKKwkJCXBUeFJpbmcgPSAmcEFkLT5UeFJpbmdbUmluZ1R5cGVdOworCisJCQkvLyBXZSBoYXZlIHRvIGNsZWFuIGFsbCBkZXNjcmlwdG9ycyBpbiBjYXNlIHNvbWUgZXJyb3IgaGFwcGVuZWQgd2l0aCByZXNldAorCQkJZm9yIChpPTA7IGk8VFhfUklOR19TSVpFOyBpKyspIC8vIFdlIGhhdmUgdG8gc2NhbiBhbGwgVFggcmluZworCQkJeworCQkJCXBUeEQgID0gKFBUWERfU1RSVUMpIHBUeFJpbmctPkNlbGxbaV0uQWxsb2NWYTsKKworCQkJCXBQYWNrZXQgPSAoUE5ESVNfUEFDS0VUKSBwVHhSaW5nLT5DZWxsW2ldLnBOZGlzUGFja2V0OworCQkJCS8vIHJlbGVhc2Ugc2NhdHRlci1hbmQtZ2F0aGVyIE5ESVNfUEFDS0VUCisJCQkJaWYgKHBQYWNrZXQpCisJCQkJeworCQkJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCQkJCXBUeFJpbmctPkNlbGxbaV0ucE5kaXNQYWNrZXQgPSBOVUxMOworCQkJCX0KKworCQkJCXBQYWNrZXQgPSAoUE5ESVNfUEFDS0VUKSBwVHhSaW5nLT5DZWxsW2ldLnBOZXh0TmRpc1BhY2tldDsKKwkJCQkvLyByZWxlYXNlIHNjYXR0ZXItYW5kLWdhdGhlciBORElTX1BBQ0tFVAorCQkJCWlmIChwUGFja2V0KQorCQkJCXsKKwkJCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCQkJCQlwVHhSaW5nLT5DZWxsW2ldLnBOZXh0TmRpc1BhY2tldCA9IE5VTEw7CisJCQkJfQorCQkJfQorCisJCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0RUWF9JRFgwICsgUmluZ1R5cGUgKiAweDEwLCAmcFR4UmluZy0+VHhEbWFJZHgpOworCQkJcFR4UmluZy0+VHhTd0ZyZWVJZHggPSBwVHhSaW5nLT5UeERtYUlkeDsKKwkJCXBUeFJpbmctPlR4Q3B1SWR4ID0gcFR4UmluZy0+VHhEbWFJZHg7CisJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9DVFhfSURYMCArIFJpbmdUeXBlICogMHgxMCwgcFR4UmluZy0+VHhDcHVJZHgpOworCisJCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIElycUZsYWdzKTsKKwkJCVJUTVBfSVJRX0xPQ0soJnBBZC0+aXJxX2xvY2ssIElycUZsYWdzKTsKKwkJCXdoaWxlIChwQWQtPlR4U3dRdWV1ZVtSaW5nVHlwZV0uSGVhZCAhPSBOVUxMKQorCQkJeworCQkJCXBFbnRyeSA9IFJlbW92ZUhlYWRRdWV1ZSgmcEFkLT5UeFN3UXVldWVbUmluZ1R5cGVdKTsKKwkJCQlwUGFja2V0ID0gUVVFVUVfRU5UUllfVE9fUEFDS0VUKHBFbnRyeSk7CisJCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUmVsZWFzZSAxIE5ESVMgcGFja2V0IGZyb20gcy93IGJhY2tsb2cgcXVldWVcbiIpKTsKKwkJCX0KKwkJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgSXJxRmxhZ3MpOworCQkJYnJlYWs7CisKKwkJY2FzZSBRSURfTUdNVDoKKwkJCS8vIFdlIGhhdmUgdG8gY2xlYW4gYWxsIGRlc2NyaXB0b3JzIGluIGNhc2Ugc29tZSBlcnJvciBoYXBwZW5lZCB3aXRoIHJlc2V0CisJCQlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPk1nbXRSaW5nTG9jayk7CisKKwkJCWZvciAoaT0wOyBpPE1HTVRfUklOR19TSVpFOyBpKyspCisJCQl7CisJCQkJcFR4RCAgPSAoUFRYRF9TVFJVQykgcEFkLT5NZ210UmluZy5DZWxsW2ldLkFsbG9jVmE7CisKKwkJCQlwUGFja2V0ID0gKFBORElTX1BBQ0tFVCkgcEFkLT5NZ210UmluZy5DZWxsW2ldLnBOZGlzUGFja2V0OworCQkJCS8vIHJsZWFzZSBzY2F0dGVyLWFuZC1nYXRoZXIgTkRJU19QQUNLRVQKKwkJCQlpZiAocFBhY2tldCkKKwkJCQl7CisJCQkJCVBDSV9VTk1BUF9TSU5HTEUocEFkLCBwVHhELT5TRFB0cjAsIHBUeEQtPlNETGVuMCwgUENJX0RNQV9UT0RFVklDRSk7CisJCQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJCQl9CisJCQkJcEFkLT5NZ210UmluZy5DZWxsW2ldLnBOZGlzUGFja2V0ID0gTlVMTDsKKworCQkJCXBQYWNrZXQgPSAoUE5ESVNfUEFDS0VUKSBwQWQtPk1nbXRSaW5nLkNlbGxbaV0ucE5leHROZGlzUGFja2V0OworCQkJCS8vIHJlbGVhc2Ugc2NhdHRlci1hbmQtZ2F0aGVyIE5ESVNfUEFDS0VUCisJCQkJaWYgKHBQYWNrZXQpCisJCQkJeworCQkJCQlQQ0lfVU5NQVBfU0lOR0xFKHBBZCwgcFR4RC0+U0RQdHIxLCBwVHhELT5TRExlbjEsIFBDSV9ETUFfVE9ERVZJQ0UpOworCQkJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCQkJfQorCQkJCXBBZC0+TWdtdFJpbmcuQ2VsbFtpXS5wTmV4dE5kaXNQYWNrZXQgPSBOVUxMOworCisJCQl9CisKKwkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfTUdNVERUWF9JRFgsICZwQWQtPk1nbXRSaW5nLlR4RG1hSWR4KTsKKwkJCXBBZC0+TWdtdFJpbmcuVHhTd0ZyZWVJZHggPSBwQWQtPk1nbXRSaW5nLlR4RG1hSWR4OworCQkJcEFkLT5NZ210UmluZy5UeENwdUlkeCA9IHBBZC0+TWdtdFJpbmcuVHhEbWFJZHg7CisJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9NR01UQ1RYX0lEWCwgcEFkLT5NZ210UmluZy5UeENwdUlkeCk7CisKKwkJCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+TWdtdFJpbmdMb2NrKTsKKwkJCXBBZC0+UmFsaW5rQ291bnRlcnMuTWdtdFJpbmdGdWxsQ291bnQgPSAwOworCQkJYnJlYWs7CisKKwkJY2FzZSBRSURfUlg6CisJCQkvLyBXZSBoYXZlIHRvIGNsZWFuIGFsbCBkZXNjcmlwdG9ycyBpbiBjYXNlIHNvbWUgZXJyb3IgaGFwcGVuZWQgd2l0aCByZXNldAorCQkJTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5SeFJpbmdMb2NrKTsKKworCQkJZm9yIChpPTA7IGk8UlhfUklOR19TSVpFOyBpKyspCisJCQl7CisJCQkJcFJ4RCAgPSAoUFJYRF9TVFJVQykgcEFkLT5SeFJpbmcuQ2VsbFtpXS5BbGxvY1ZhOworCQkJCXBSeEQtPkRET05FID0gMCA7CisJCQl9CisKKwkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgUlhfRFJYX0lEWCwgJnBBZC0+UnhSaW5nLlJ4RG1hSWR4KTsKKwkJCXBBZC0+UnhSaW5nLlJ4U3dSZWFkSWR4ID0gcEFkLT5SeFJpbmcuUnhEbWFJZHg7CisJCQlwQWQtPlJ4UmluZy5SeENwdUlkeCA9ICgocEFkLT5SeFJpbmcuUnhEbWFJZHggPT0gMCkgPyAoUlhfUklOR19TSVpFLTEpIDogKHBBZC0+UnhSaW5nLlJ4RG1hSWR4LTEpKTsKKwkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFJYX0NSWF9JRFgsIHBBZC0+UnhSaW5nLlJ4Q3B1SWR4KTsKKworCQkJTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5SeFJpbmdMb2NrKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwl9Cit9CisKKworTkRJU19TVEFUVVMgQWRhcHRlckJsb2NrQWxsb2NhdGVNZW1vcnkoCisJSU4gUFZPSUQJaGFuZGxlLAorCU9VVAlQVk9JRAkqcHBBZCkKK3sKKwlQUENJX0RFViBwY2lfZGV2OworCWRtYV9hZGRyX3QJKnBoeV9hZGRyOworCVBPU19DT09LSUUgcE9iaiA9IChQT1NfQ09PS0lFKSBoYW5kbGU7CisKKwlwY2lfZGV2ID0gcE9iai0+cGNpX2RldjsKKwlwaHlfYWRkciA9ICZwT2JqLT5wQWRfcGE7CisKKwkqcHBBZCA9IChQVk9JRCl2bWFsbG9jKHNpemVvZihSVE1QX0FEQVBURVIpKTsgLy9wY2lfYWxsb2NfY29uc2lzdGVudChwY2lfZGV2LCBzaXplb2YoUlRNUF9BREFQVEVSKSwgcGh5X2FkZHIpOworCisJaWYgKCpwcEFkKQorCXsKKwkJTmRpc1plcm9NZW1vcnkoKnBwQWQsIHNpemVvZihSVE1QX0FEQVBURVIpKTsKKwkJKChQUlRNUF9BREFQVEVSKSpwcEFkKS0+T1NfQ29va2llID0gaGFuZGxlOworCQlyZXR1cm4gKE5ESVNfU1RBVFVTX1NVQ0NFU1MpOworCX0gZWxzZSB7CisJCXJldHVybiAoTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJfQorfQorCisKK3ZvaWQgUlRNUF9BbGxvY2F0ZVR4RGVzY01lbW9yeSgKKwlJTglQUlRNUF9BREFQVEVSIHBBZCwKKwlJTglVSU5UCUluZGV4LAorCUlOCVVMT05HCUxlbmd0aCwKKwlJTglCT09MRUFOCUNhY2hlZCwKKwlPVVQJUFZPSUQJKlZpcnR1YWxBZGRyZXNzLAorCU9VVAlQTkRJU19QSFlTSUNBTF9BRERSRVNTIFBoeXNpY2FsQWRkcmVzcykKK3sKKwlQT1NfQ09PS0lFIHBPYmogPSAoUE9TX0NPT0tJRSlwQWQtPk9TX0Nvb2tpZTsKKworCSpWaXJ0dWFsQWRkcmVzcyA9IChQVk9JRClQQ0lfQUxMT0NfQ09OU0lTVEVOVChwT2JqLT5wY2lfZGV2LHNpemVvZihjaGFyKSpMZW5ndGgsIFBoeXNpY2FsQWRkcmVzcyk7CisKK30KKwordm9pZCBSVE1QX0FsbG9jYXRlTWdtdERlc2NNZW1vcnkoCisJSU4JUFJUTVBfQURBUFRFUiBwQWQsCisJSU4JVUxPTkcJTGVuZ3RoLAorCUlOCUJPT0xFQU4JQ2FjaGVkLAorCU9VVAlQVk9JRAkqVmlydHVhbEFkZHJlc3MsCisJT1VUCVBORElTX1BIWVNJQ0FMX0FERFJFU1MgUGh5c2ljYWxBZGRyZXNzKQoreworCVBPU19DT09LSUUgcE9iaiA9IChQT1NfQ09PS0lFKXBBZC0+T1NfQ29va2llOworCisJKlZpcnR1YWxBZGRyZXNzID0gKFBWT0lEKVBDSV9BTExPQ19DT05TSVNURU5UKHBPYmotPnBjaV9kZXYsc2l6ZW9mKGNoYXIpKkxlbmd0aCwgUGh5c2ljYWxBZGRyZXNzKTsKKworfQorCit2b2lkIFJUTVBfQWxsb2NhdGVSeERlc2NNZW1vcnkoCisJSU4JUFJUTVBfQURBUFRFUiBwQWQsCisJSU4JVUxPTkcJTGVuZ3RoLAorCUlOCUJPT0xFQU4JQ2FjaGVkLAorCU9VVAlQVk9JRAkqVmlydHVhbEFkZHJlc3MsCisJT1VUCVBORElTX1BIWVNJQ0FMX0FERFJFU1MgUGh5c2ljYWxBZGRyZXNzKQoreworCVBPU19DT09LSUUgcE9iaiA9IChQT1NfQ09PS0lFKXBBZC0+T1NfQ29va2llOworCisJKlZpcnR1YWxBZGRyZXNzID0gKFBWT0lEKVBDSV9BTExPQ19DT05TSVNURU5UKHBPYmotPnBjaV9kZXYsc2l6ZW9mKGNoYXIpKkxlbmd0aCwgUGh5c2ljYWxBZGRyZXNzKTsKKworfQorCit2b2lkIFJUTVBfRnJlZVJ4RGVzY01lbW9yeSgKKwlJTglQUlRNUF9BREFQVEVSIHBBZCwKKwlJTglVTE9ORwlMZW5ndGgsCisJSU4JUFZPSUQJVmlydHVhbEFkZHJlc3MsCisJSU4JTkRJU19QSFlTSUNBTF9BRERSRVNTIFBoeXNpY2FsQWRkcmVzcykKK3sKKwlQT1NfQ09PS0lFIHBPYmogPSAoUE9TX0NPT0tJRSlwQWQtPk9TX0Nvb2tpZTsKKworCVBDSV9GUkVFX0NPTlNJU1RFTlQocE9iai0+cGNpX2RldiwgTGVuZ3RoLCBWaXJ0dWFsQWRkcmVzcywgUGh5c2ljYWxBZGRyZXNzKTsKK30KKworCit2b2lkIFJUTVBfQWxsb2NhdGVGaXJzdFR4QnVmZmVyKAorCUlOCVBSVE1QX0FEQVBURVIgcEFkLAorCUlOCVVJTlQJSW5kZXgsCisJSU4JVUxPTkcJTGVuZ3RoLAorCUlOCUJPT0xFQU4JQ2FjaGVkLAorCU9VVAlQVk9JRAkqVmlydHVhbEFkZHJlc3MsCisJT1VUCVBORElTX1BIWVNJQ0FMX0FERFJFU1MgUGh5c2ljYWxBZGRyZXNzKQoreworCVBPU19DT09LSUUgcE9iaiA9IChQT1NfQ09PS0lFKXBBZC0+T1NfQ29va2llOworCisJKlZpcnR1YWxBZGRyZXNzID0gKFBWT0lEKVBDSV9BTExPQ19DT05TSVNURU5UKHBPYmotPnBjaV9kZXYsc2l6ZW9mKGNoYXIpKkxlbmd0aCwgUGh5c2ljYWxBZGRyZXNzKTsKK30KKworLyoKKyAqIEZVTkNUSU9OOiBBbGxvY2F0ZSBhIGNvbW1vbiBidWZmZXIgZm9yIERNQQorICogQVJHVU1FTlRTOgorICogICAgIEFkYXB0ZXJIYW5kbGU6ICBBZGFwdGVySGFuZGxlCisgKiAgICAgTGVuZ3RoOiAgTnVtYmVyIG9mIGJ5dGVzIHRvIGFsbG9jYXRlCisgKiAgICAgQ2FjaGVkOiAgV2hldGhlciBvciBub3QgdGhlIG1lbW9yeSBjYW4gYmUgY2FjaGVkCisgKiAgICAgVmlydHVhbEFkZHJlc3M6ICBQb2ludGVyIHRvIG1lbW9yeSBpcyByZXR1cm5lZCBoZXJlCisgKiAgICAgUGh5c2ljYWxBZGRyZXNzOiAgUGh5c2ljYWwgYWRkcmVzcyBjb3JyZXNwb25kaW5nIHRvIHZpcnR1YWwgYWRkcmVzcworICovCisKK3ZvaWQgUlRNUF9BbGxvY2F0ZVNoYXJlZE1lbW9yeSgKKwlJTglQUlRNUF9BREFQVEVSIHBBZCwKKwlJTglVTE9ORwlMZW5ndGgsCisJSU4JQk9PTEVBTglDYWNoZWQsCisJT1VUCVBWT0lECSpWaXJ0dWFsQWRkcmVzcywKKwlPVVQJUE5ESVNfUEhZU0lDQUxfQUREUkVTUyBQaHlzaWNhbEFkZHJlc3MpCit7CisJUE9TX0NPT0tJRSBwT2JqID0gKFBPU19DT09LSUUpcEFkLT5PU19Db29raWU7CisKKwkqVmlydHVhbEFkZHJlc3MgPSAoUFZPSUQpUENJX0FMTE9DX0NPTlNJU1RFTlQocE9iai0+cGNpX2RldixzaXplb2YoY2hhcikqTGVuZ3RoLCBQaHlzaWNhbEFkZHJlc3MpOworfQorCitWT0lEIFJUTVBGcmVlVHhSeFJpbmdNZW1vcnkoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpCit7CisJaW50IGluZGV4LCBudW0gLCBqOworCVBSVE1QX1RYX1JJTkcgcFR4UmluZzsKKwlQVFhEX1NUUlVDCSAgcFR4RDsKKwlQTkRJU19QQUNLRVQgIHBQYWNrZXQ7CisJdW5zaWduZWQgaW50ICBJcnFGbGFnczsKKworCVBPU19DT09LSUUgcE9iaiA9KFBPU19DT09LSUUpIHBBZC0+T1NfQ29va2llOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+IFJUTVBGcmVlVHhSeFJpbmdNZW1vcnlcbiIpKTsKKworCS8vIEZyZWUgVHhTd1F1ZXVlIFBhY2tldAorCWZvciAoaW5kZXg9MDsgaW5kZXggPE5VTV9PRl9UWF9SSU5HOyBpbmRleCsrKQorCXsKKwkJUFFVRVVFX0VOVFJZIHBFbnRyeTsKKwkJUE5ESVNfUEFDS0VUIHBQYWNrZXQ7CisJCVBRVUVVRV9IRUFERVIgICBwUXVldWU7CisKKwkJUlRNUF9JUlFfTE9DSygmcEFkLT5pcnFfbG9jaywgSXJxRmxhZ3MpOworCQlwUXVldWUgPSAmcEFkLT5UeFN3UXVldWVbaW5kZXhdOworCQl3aGlsZSAocFF1ZXVlLT5IZWFkKQorCQl7CisJCQlwRW50cnkgPSBSZW1vdmVIZWFkUXVldWUocFF1ZXVlKTsKKwkJCXBQYWNrZXQgPSBRVUVVRV9FTlRSWV9UT19QQUNLRVQocEVudHJ5KTsKKwkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJfQorCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIElycUZsYWdzKTsKKwl9CisKKwkvLyBGcmVlIFR4IFJpbmcgUGFja2V0CisJZm9yIChpbmRleD0wO2luZGV4PCBOVU1fT0ZfVFhfUklORztpbmRleCsrKQorCXsKKwkJcFR4UmluZyA9ICZwQWQtPlR4UmluZ1tpbmRleF07CisKKwkJZm9yIChqPTA7IGo8IFRYX1JJTkdfU0laRTsgaisrKQorCQl7CisJCQlwVHhEID0gKFBUWERfU1RSVUMpIChwVHhSaW5nLT5DZWxsW2pdLkFsbG9jVmEpOworCQkJcFBhY2tldCA9IHBUeFJpbmctPkNlbGxbal0ucE5kaXNQYWNrZXQ7CisKKwkJCWlmIChwUGFja2V0KQorCQkJeworICAgICAgICAgICAgCVBDSV9VTk1BUF9TSU5HTEUocEFkLCBwVHhELT5TRFB0cjAsIHBUeEQtPlNETGVuMCwgUENJX0RNQV9UT0RFVklDRSk7CisJCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOworCQkJfQorCQkJLy9BbHdheXMgYXNzaWduIHBOZGlzUGFja2V0IGFzIE5VTEwgYWZ0ZXIgY2xlYXIKKwkJCXBUeFJpbmctPkNlbGxbal0ucE5kaXNQYWNrZXQgPSBOVUxMOworCisJCQlwUGFja2V0ID0gcFR4UmluZy0+Q2VsbFtqXS5wTmV4dE5kaXNQYWNrZXQ7CisKKwkJCWlmIChwUGFja2V0KQorCQkJeworICAgICAgICAgICAgCVBDSV9VTk1BUF9TSU5HTEUocEFkLCBwVHhELT5TRFB0cjEsIHBUeEQtPlNETGVuMSwgUENJX0RNQV9UT0RFVklDRSk7CisJCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOworCQkJfQorCQkJLy9BbHdheXMgYXNzaWduIHBOZXh0TmRpc1BhY2tldCBhcyBOVUxMIGFmdGVyIGNsZWFyCisJCQlwVHhSaW5nLT5DZWxsW3BUeFJpbmctPlR4U3dGcmVlSWR4XS5wTmV4dE5kaXNQYWNrZXQgPSBOVUxMOworCisJCX0KKwl9CisKKwlmb3IgKGluZGV4ID0gUlhfUklOR19TSVpFIC0gMSA7IGluZGV4ID49IDA7IGluZGV4LS0pCisJeworCQlpZiAoKHBBZC0+UnhSaW5nLkNlbGxbaW5kZXhdLkRtYUJ1Zi5BbGxvY1ZhKSAmJiAocEFkLT5SeFJpbmcuQ2VsbFtpbmRleF0ucE5kaXNQYWNrZXQpKQorCQl7CisJCQlQQ0lfVU5NQVBfU0lOR0xFKHBPYmotPnBjaV9kZXYsIHBBZC0+UnhSaW5nLkNlbGxbaW5kZXhdLkRtYUJ1Zi5BbGxvY1BhLCBwQWQtPlJ4UmluZy5DZWxsW2luZGV4XS5EbWFCdWYuQWxsb2NTaXplLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBBZC0+UnhSaW5nLkNlbGxbaW5kZXhdLnBOZGlzUGFja2V0LCBORElTX1NUQVRVU19TVUNDRVNTKTsKKwkJfQorCX0KKwlOZGlzWmVyb01lbW9yeShwQWQtPlJ4UmluZy5DZWxsLCBSWF9SSU5HX1NJWkUgKiBzaXplb2YoUlRNUF9ETUFDQikpOworCisJaWYgKHBBZC0+UnhEZXNjUmluZy5BbGxvY1ZhKQorICAgIHsKKyAgICAJUENJX0ZSRUVfQ09OU0lTVEVOVChwT2JqLT5wY2lfZGV2LCBwQWQtPlJ4RGVzY1JpbmcuQWxsb2NTaXplLCBwQWQtPlJ4RGVzY1JpbmcuQWxsb2NWYSwgcEFkLT5SeERlc2NSaW5nLkFsbG9jUGEpOworICAgIH0KKyAgICBOZGlzWmVyb01lbW9yeSgmcEFkLT5SeERlc2NSaW5nLCBzaXplb2YoUlRNUF9ETUFCVUYpKTsKKworCWlmIChwQWQtPk1nbXREZXNjUmluZy5BbGxvY1ZhKQorCXsKKwkJUENJX0ZSRUVfQ09OU0lTVEVOVChwT2JqLT5wY2lfZGV2LCBwQWQtPk1nbXREZXNjUmluZy5BbGxvY1NpemUsCXBBZC0+TWdtdERlc2NSaW5nLkFsbG9jVmEsIHBBZC0+TWdtdERlc2NSaW5nLkFsbG9jUGEpOworCX0KKwlOZGlzWmVyb01lbW9yeSgmcEFkLT5NZ210RGVzY1JpbmcsIHNpemVvZihSVE1QX0RNQUJVRikpOworCisJZm9yIChudW0gPSAwOyBudW0gPCBOVU1fT0ZfVFhfUklORzsgbnVtKyspCisJeworICAgIAlpZiAocEFkLT5UeEJ1ZlNwYWNlW251bV0uQWxsb2NWYSkKKwkgICAgeworCSAgICAJUENJX0ZSRUVfQ09OU0lTVEVOVChwT2JqLT5wY2lfZGV2LCBwQWQtPlR4QnVmU3BhY2VbbnVtXS5BbGxvY1NpemUsIHBBZC0+VHhCdWZTcGFjZVtudW1dLkFsbG9jVmEsIHBBZC0+VHhCdWZTcGFjZVtudW1dLkFsbG9jUGEpOworCSAgICB9CisJICAgIE5kaXNaZXJvTWVtb3J5KCZwQWQtPlR4QnVmU3BhY2VbbnVtXSwgc2l6ZW9mKFJUTVBfRE1BQlVGKSk7CisKKyAgICAJaWYgKHBBZC0+VHhEZXNjUmluZ1tudW1dLkFsbG9jVmEpCisJICAgIHsKKwkgICAgCVBDSV9GUkVFX0NPTlNJU1RFTlQocE9iai0+cGNpX2RldiwgcEFkLT5UeERlc2NSaW5nW251bV0uQWxsb2NTaXplLCBwQWQtPlR4RGVzY1JpbmdbbnVtXS5BbGxvY1ZhLCBwQWQtPlR4RGVzY1JpbmdbbnVtXS5BbGxvY1BhKTsKKwkgICAgfQorCSAgICBOZGlzWmVyb01lbW9yeSgmcEFkLT5UeERlc2NSaW5nW251bV0sIHNpemVvZihSVE1QX0RNQUJVRikpOworCX0KKworCWlmIChwQWQtPkZyYWdGcmFtZS5wRnJhZ1BhY2tldCkKKwkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBBZC0+RnJhZ0ZyYW1lLnBGcmFnUGFja2V0LCBORElTX1NUQVRVU19TVUNDRVNTKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjwtLSBSVE1QRnJlZVR4UnhSaW5nTWVtb3J5XG4iKSk7Cit9CisKKworLyoKKyAqIEZVTkNUSU9OOiBBbGxvY2F0ZSBhIHBhY2tldCBidWZmZXIgZm9yIERNQQorICogQVJHVU1FTlRTOgorICogICAgIEFkYXB0ZXJIYW5kbGU6ICBBZGFwdGVySGFuZGxlCisgKiAgICAgTGVuZ3RoOiAgTnVtYmVyIG9mIGJ5dGVzIHRvIGFsbG9jYXRlCisgKiAgICAgQ2FjaGVkOiAgV2hldGhlciBvciBub3QgdGhlIG1lbW9yeSBjYW4gYmUgY2FjaGVkCisgKiAgICAgVmlydHVhbEFkZHJlc3M6ICBQb2ludGVyIHRvIG1lbW9yeSBpcyByZXR1cm5lZCBoZXJlCisgKiAgICAgUGh5c2ljYWxBZGRyZXNzOiAgUGh5c2ljYWwgYWRkcmVzcyBjb3JyZXNwb25kaW5nIHRvIHZpcnR1YWwgYWRkcmVzcworICogTm90ZXM6CisgKiAgICAgQ2FjaGVkIGlzIGlnbm9yZWQ6IGFsd2F5cyBjYWNoZWQgbWVtb3J5CisgKi8KK1BORElTX1BBQ0tFVCBSVE1QX0FsbG9jYXRlUnhQYWNrZXRCdWZmZXIoCisJSU4JUFJUTVBfQURBUFRFUiBwQWQsCisJSU4JVUxPTkcJTGVuZ3RoLAorCUlOCUJPT0xFQU4JQ2FjaGVkLAorCU9VVAlQVk9JRAkqVmlydHVhbEFkZHJlc3MsCisJT1VUCVBORElTX1BIWVNJQ0FMX0FERFJFU1MgUGh5c2ljYWxBZGRyZXNzKQoreworCVBORElTX1BBQ0tFVCBwa3Q7CisKKwlwa3QgPSBSVFBLVF9UT19PU1BLVChERVZfQUxMT0NfU0tCKExlbmd0aCkpOworCisJaWYgKHBrdCA9PSBOVUxMKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNhbid0IGFsbG9jYXRlIHJ4ICVsZCBzaXplIHBhY2tldFxuIixMZW5ndGgpKTsKKwl9CisKKwlpZiAocGt0KSB7CisJCVJUTVBfU0VUX1BBQ0tFVF9TT1VSQ0UocGt0LCBQS1RTUkNfTkRJUyk7CisJCSpWaXJ0dWFsQWRkcmVzcyA9IChQVk9JRCkgUlRQS1RfVE9fT1NQS1QocGt0KS0+ZGF0YTsKKwkJKlBoeXNpY2FsQWRkcmVzcyA9IFBDSV9NQVBfU0lOR0xFKHBBZCwgKlZpcnR1YWxBZGRyZXNzLCBMZW5ndGgsIC0xLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCX0gZWxzZSB7CisJCSpWaXJ0dWFsQWRkcmVzcyA9IChQVk9JRCkgTlVMTDsKKwkJKlBoeXNpY2FsQWRkcmVzcyA9IChORElTX1BIWVNJQ0FMX0FERFJFU1MpIE5VTEw7CisJfQorCisJcmV0dXJuIChQTkRJU19QQUNLRVQpIHBrdDsKK30KKworCitWT0lEIEludmFsaWRfUmVtYWluaW5nX1BhY2tldCgKKwlJTglQUlRNUF9BREFQVEVSIHBBZCwKKwlJTgkgVUxPTkcgVmlydHVhbEFkZHJlc3MpCit7CisJTkRJU19QSFlTSUNBTF9BRERSRVNTIFBoeXNpY2FsQWRkcmVzczsKKworCVBoeXNpY2FsQWRkcmVzcyA9IFBDSV9NQVBfU0lOR0xFKHBBZCwgKHZvaWQgKikoVmlydHVhbEFkZHJlc3MrMTYwMCksIFJYX0JVRkZFUl9OT1JNU0laRS0xNjAwLCAtMSwgUENJX0RNQV9GUk9NREVWSUNFKTsKK30KKworUE5ESVNfUEFDS0VUIEdldFBhY2tldEZyb21SeFJpbmcoCisJSU4JCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAkJUFJUMjhYWF9SWERfU1RSVUMJcFNhdmVSeEQsCisJT1VUCQlCT09MRUFOCQkJKnBiUmVzY2hlZHVsZSwKKwlJTiBPVVQJVUlOVDMyCQkJKnBSeFBlbmRpbmcpCit7CisJUFJYRF9TVFJVQwkJCQlwUnhEOworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwlQUlhEX1NUUlVDCQkJCXBEZXN0UnhEOworCVJYRF9TVFJVQwkJCQlSeEQ7CisjZW5kaWYKKwlQTkRJU19QQUNLRVQJCQlwUnhQYWNrZXQgPSBOVUxMOworCVBORElTX1BBQ0tFVAkJCXBOZXdQYWNrZXQ7CisJUFZPSUQJCQkJCUFsbG9jVmE7CisJTkRJU19QSFlTSUNBTF9BRERSRVNTCUFsbG9jUGE7CisJQk9PTEVBTgkJCQkJYlJlc2NoZWR1bGUgPSBGQUxTRTsKKworCVJUTVBfU0VNX0xPQ0soJnBBZC0+UnhSaW5nTG9jayk7CisKKwlpZiAoKnBSeFBlbmRpbmcgPT0gMCkKKwl7CisJCS8vIEdldCBob3cgbWF5IHBhY2tldHMgaGFkIGJlZW4gcmVjZWl2ZWQKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBSWF9EUlhfSURYICwgJnBBZC0+UnhSaW5nLlJ4RG1hSWR4KTsKKworCQlpZiAocEFkLT5SeFJpbmcuUnhTd1JlYWRJZHggPT0gcEFkLT5SeFJpbmcuUnhEbWFJZHgpCisJCXsKKwkJCS8vIG5vIG1vcmUgcnggcGFja2V0cworCQkJYlJlc2NoZWR1bGUgPSBGQUxTRTsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCisJCS8vIGdldCByeCBwZW5kaW5nIGNvdW50CisJCWlmIChwQWQtPlJ4UmluZy5SeERtYUlkeCA+IHBBZC0+UnhSaW5nLlJ4U3dSZWFkSWR4KQorCQkJKnBSeFBlbmRpbmcgPSBwQWQtPlJ4UmluZy5SeERtYUlkeCAtIHBBZC0+UnhSaW5nLlJ4U3dSZWFkSWR4OworCQllbHNlCisJCQkqcFJ4UGVuZGluZwk9IHBBZC0+UnhSaW5nLlJ4RG1hSWR4ICsgUlhfUklOR19TSVpFIC0gcEFkLT5SeFJpbmcuUnhTd1JlYWRJZHg7CisKKwl9CisKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJcERlc3RSeEQgPSAoUFJYRF9TVFJVQykgcEFkLT5SeFJpbmcuQ2VsbFtwQWQtPlJ4UmluZy5SeFN3UmVhZElkeF0uQWxsb2NWYTsKKwlSeEQgPSAqcERlc3RSeEQ7CisJcFJ4RCA9ICZSeEQ7CisJUlRNUERlc2NyaXB0b3JFbmRpYW5DaGFuZ2UoKFBVQ0hBUilwUnhELCBUWVBFX1JYRCk7CisjZWxzZQorCS8vIFBvaW50IHRvIFJ4IGluZGV4ZWQgcnggcmluZyBkZXNjcmlwdG9yCisJcFJ4RCA9IChQUlhEX1NUUlVDKSBwQWQtPlJ4UmluZy5DZWxsW3BBZC0+UnhSaW5nLlJ4U3dSZWFkSWR4XS5BbGxvY1ZhOworI2VuZGlmCisKKwlpZiAocFJ4RC0+RERPTkUgPT0gMCkKKwl7CisJCSpwUnhQZW5kaW5nID0gMDsKKwkJLy8gRE1BSW5keCBoYWQgZG9uZSBidXQgRERPTkUgYml0IG5vdCByZWFkeQorCQliUmVzY2hlZHVsZSA9IFRSVUU7CisJCWdvdG8gZG9uZTsKKwl9CisKKworCS8vIHJldHVybiByeCBkZXNjcmlwdG9yCisJTmRpc01vdmVNZW1vcnkocFNhdmVSeEQsIHBSeEQsIFJYRF9TSVpFKTsKKworCXBOZXdQYWNrZXQgPSBSVE1QX0FsbG9jYXRlUnhQYWNrZXRCdWZmZXIocEFkLCBSWF9CVUZGRVJfQUdHUkVTSVpFLCBGQUxTRSwgJkFsbG9jVmEsICZBbGxvY1BhKTsKKworCWlmIChwTmV3UGFja2V0KQorCXsKKwkJLy8gdW5tYXAgdGhlIHJ4IGJ1ZmZlcgorCQlQQ0lfVU5NQVBfU0lOR0xFKHBBZCwgcEFkLT5SeFJpbmcuQ2VsbFtwQWQtPlJ4UmluZy5SeFN3UmVhZElkeF0uRG1hQnVmLkFsbG9jUGEsCisJCQkJCSBwQWQtPlJ4UmluZy5DZWxsW3BBZC0+UnhSaW5nLlJ4U3dSZWFkSWR4XS5EbWFCdWYuQWxsb2NTaXplLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQlwUnhQYWNrZXQgPSBwQWQtPlJ4UmluZy5DZWxsW3BBZC0+UnhSaW5nLlJ4U3dSZWFkSWR4XS5wTmRpc1BhY2tldDsKKworCQlwQWQtPlJ4UmluZy5DZWxsW3BBZC0+UnhSaW5nLlJ4U3dSZWFkSWR4XS5EbWFCdWYuQWxsb2NTaXplCT0gUlhfQlVGRkVSX0FHR1JFU0laRTsKKwkJcEFkLT5SeFJpbmcuQ2VsbFtwQWQtPlJ4UmluZy5SeFN3UmVhZElkeF0ucE5kaXNQYWNrZXQJCT0gKFBORElTX1BBQ0tFVCkgcE5ld1BhY2tldDsKKwkJcEFkLT5SeFJpbmcuQ2VsbFtwQWQtPlJ4UmluZy5SeFN3UmVhZElkeF0uRG1hQnVmLkFsbG9jVmEJPSBBbGxvY1ZhOworCQlwQWQtPlJ4UmluZy5DZWxsW3BBZC0+UnhSaW5nLlJ4U3dSZWFkSWR4XS5EbWFCdWYuQWxsb2NQYQk9IEFsbG9jUGE7CisJCS8qIHVwZGF0ZSBTRFAwIHRvIG5ldyBidWZmZXIgb2YgcnggcGFja2V0ICovCisJCXBSeEQtPlNEUDAgPSBBbGxvY1BhOworCX0KKwllbHNlCisJeworCQkvL3ByaW50aygiTm8gUnggQnVmZmVyXG4iKTsKKwkJcFJ4UGFja2V0ID0gTlVMTDsKKwkJYlJlc2NoZWR1bGUgPSBUUlVFOworCX0KKworCXBSeEQtPkRET05FID0gMDsKKworCS8vIGhhZCBoYW5kbGVkIG9uZSByeCBwYWNrZXQKKwkqcFJ4UGVuZGluZyA9ICpwUnhQZW5kaW5nIC0gMTsKKworCS8vIHVwZGF0ZSByeCBkZXNjcmlwdG9yIGFuZCBraWNrIHJ4CisjaWZkZWYgUlRfQklHX0VORElBTgorCVJUTVBEZXNjcmlwdG9yRW5kaWFuQ2hhbmdlKChQVUNIQVIpcFJ4RCwgVFlQRV9SWEQpOworCVdyaXRlQmFja1RvRGVzY3JpcHRvcigoUFVDSEFSKXBEZXN0UnhELCAoUFVDSEFSKXBSeEQsIEZBTFNFLCBUWVBFX1JYRCk7CisjZW5kaWYKKwlJTkNfUklOR19JTkRFWChwQWQtPlJ4UmluZy5SeFN3UmVhZElkeCwgUlhfUklOR19TSVpFKTsKKworCXBBZC0+UnhSaW5nLlJ4Q3B1SWR4ID0gKHBBZC0+UnhSaW5nLlJ4U3dSZWFkSWR4ID09IDApID8gKFJYX1JJTkdfU0laRS0xKSA6IChwQWQtPlJ4UmluZy5SeFN3UmVhZElkeC0xKTsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBSWF9DUlhfSURYLCBwQWQtPlJ4UmluZy5SeENwdUlkeCk7CisKK2RvbmU6CisJUlRNUF9TRU1fVU5MT0NLKCZwQWQtPlJ4UmluZ0xvY2spOworCSpwYlJlc2NoZWR1bGUgPSBiUmVzY2hlZHVsZTsKKwlyZXR1cm4gcFJ4UGFja2V0OworfQorLyogRW5kIG9mIDI4NjBfcnRtcF9pbml0LmMgKi8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vYWN0aW9uLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9hY3Rpb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNmY1MzBmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vYWN0aW9uLmMKQEAgLTAsMCArMSwxMDMxIEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgIE1vZHVsZSBOYW1lOgorCWFjdGlvbi5jCisKKyAgICBBYnN0cmFjdDoKKyAgICBIYW5kbGUgYXNzb2NpYXRpb24gcmVsYXRlZCByZXF1ZXN0cyBlaXRoZXIgZnJvbSBXU1RBIG9yIGZyb20gbG9jYWwgTUxNRQorCisgICAgUmV2aXNpb24gSGlzdG9yeToKKyAgICBXaG8gICAgICAgICBXaGVuICAgICAgICAgIFdoYXQKKyAgICAtLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlKYW4gTGVlCQkyMDA2CSAgCWNyZWF0ZWQgZm9yIHJ0Mjg2MAorICovCisKKyNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKKyNpbmNsdWRlICJhY3Rpb24uaCIKKworCitzdGF0aWMgVk9JRCBSZXNlcnZlZEFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIGFzc29jaWF0aW9uIHN0YXRlIG1hY2hpbmUgaW5pdCwgaW5jbHVkaW5nIHN0YXRlIHRyYW5zaXRpb24gYW5kIHRpbWVyIGluaXQKKyAgICBQYXJhbWV0ZXJzOgorICAgICAgICBTIC0gcG9pbnRlciB0byB0aGUgYXNzb2NpYXRpb24gc3RhdGUgbWFjaGluZQorICAgIE5vdGU6CisgICAgICAgIFRoZSBzdGF0ZSBtYWNoaW5lIGxvb2tzIGxpa2UgdGhlIGZvbGxvd2luZworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBU1NPQ19JRExFCisgICAgICAgIE1UMl9NTE1FX0RJU0FTU09DX1JFUSAgICBtbG1lX2Rpc2Fzc29jX3JlcV9hY3Rpb24KKyAgICAgICAgTVQyX1BFRVJfRElTQVNTT0NfUkVRICAgIHBlZXJfZGlzYXNzb2NfYWN0aW9uCisgICAgICAgIE1UMl9QRUVSX0FTU09DX1JFUSAgICAgICBkcm9wCisgICAgICAgIE1UMl9QRUVSX1JFQVNTT0NfUkVRICAgICBkcm9wCisgICAgICAgIE1UMl9DTFMzRVJSICAgICAgICAgICAgICBjbHMzZXJyX2FjdGlvbgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgQWN0aW9uU3RhdGVNYWNoaW5lSW5pdCgKKyAgICBJTglQUlRNUF9BREFQVEVSCXBBZCwKKyAgICBJTiAgU1RBVEVfTUFDSElORSAqUywKKyAgICBPVVQgU1RBVEVfTUFDSElORV9GVU5DIFRyYW5zW10pCit7CisJU3RhdGVNYWNoaW5lSW5pdChTLCAoU1RBVEVfTUFDSElORV9GVU5DICopVHJhbnMsIE1BWF9BQ1RfU1RBVEUsIE1BWF9BQ1RfTVNHLCAoU1RBVEVfTUFDSElORV9GVU5DKURyb3AsIEFDVF9JRExFLCBBQ1RfTUFDSElORV9CQVNFKTsKKworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBQ1RfSURMRSwgTVQyX1BFRVJfU1BFQ1RSVU1fQ0FURSwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyU3BlY3RydW1BY3Rpb24pOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBQ1RfSURMRSwgTVQyX1BFRVJfUU9TX0NBVEUsIChTVEFURV9NQUNISU5FX0ZVTkMpUGVlclFPU0FjdGlvbik7CisKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQUNUX0lETEUsIE1UMl9QRUVSX0RMU19DQVRFLCAoU1RBVEVfTUFDSElORV9GVU5DKVJlc2VydmVkQWN0aW9uKTsKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwkJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFDVF9JRExFLCBNVDJfUEVFUl9ETFNfQ0FURSwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyRExTQWN0aW9uKTsKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBQ1RfSURMRSwgTVQyX1BFRVJfQkFfQ0FURSwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyQkFBY3Rpb24pOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBQ1RfSURMRSwgTVQyX1BFRVJfSFRfQ0FURSwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVySFRBY3Rpb24pOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBQ1RfSURMRSwgTVQyX01MTUVfQUREX0JBX0NBVEUsIChTVEFURV9NQUNISU5FX0ZVTkMpTWxtZUFEREJBQWN0aW9uKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQUNUX0lETEUsIE1UMl9NTE1FX09SSV9ERUxCQV9DQVRFLCAoU1RBVEVfTUFDSElORV9GVU5DKU1sbWVERUxCQUFjdGlvbik7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFDVF9JRExFLCBNVDJfTUxNRV9SRUNfREVMQkFfQ0FURSwgKFNUQVRFX01BQ0hJTkVfRlVOQylNbG1lREVMQkFBY3Rpb24pOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFDVF9JRExFLCBNVDJfUEVFUl9QVUJMSUNfQ0FURSwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyUHVibGljQWN0aW9uKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQUNUX0lETEUsIE1UMl9QRUVSX1JNX0NBVEUsIChTVEFURV9NQUNISU5FX0ZVTkMpUGVlclJNQWN0aW9uKTsKKworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBQ1RfSURMRSwgTVQyX01MTUVfUU9TX0NBVEUsIChTVEFURV9NQUNISU5FX0ZVTkMpTWxtZVFPU0FjdGlvbik7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFDVF9JRExFLCBNVDJfTUxNRV9ETFNfQ0FURSwgKFNUQVRFX01BQ0hJTkVfRlVOQylNbG1lRExTQWN0aW9uKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQUNUX0lETEUsIE1UMl9BQ1RfSU5WQUxJRCwgKFNUQVRFX01BQ0hJTkVfRlVOQylNbG1lSW52YWxpZEFjdGlvbik7Cit9CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKK1ZPSUQgTWxtZUFEREJBQWN0aW9uKAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKKworeworCU1MTUVfQUREQkFfUkVRX1NUUlVDVCAqcEluZm87CisJVUNIQVIgICAgICAgICAgIEFkZHJbNl07CisJUFVDSEFSICAgICAgICAgcE91dEJ1ZmZlciA9IE5VTEw7CisJTkRJU19TVEFUVVMgICAgIE5TdGF0dXM7CisJVUxPTkcJCUlkeDsKKwlGUkFNRV9BRERCQV9SRVEgIEZyYW1lOworCVVMT05HCQlGcmFtZUxlbjsKKwlCQV9PUklfRU5UUlkJCQkqcEJBRW50cnkgPSBOVUxMOworCisJcEluZm8gPSAoTUxNRV9BRERCQV9SRVFfU1RSVUNUICopRWxlbS0+TXNnOworCU5kaXNaZXJvTWVtb3J5KCZGcmFtZSwgc2l6ZW9mKEZSQU1FX0FEREJBX1JFUSkpOworCisJaWYoTWxtZUFkZEJBUmVxU2FuaXR5KHBBZCwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4sIEFkZHIpKQorCXsKKwkJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKKwkJaWYoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCQl7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkJBIC0gTWxtZUFEREJBQWN0aW9uKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxlZCBcbiIpKTsKKwkJCXJldHVybjsKKwkJfQorCQkvLyAxLiBmaW5kIGVudHJ5CisJCUlkeCA9IHBBZC0+TWFjVGFiLkNvbnRlbnRbcEluZm8tPldjaWRdLkJBT3JpV2NpZEFycmF5W3BJbmZvLT5USURdOworCQlpZiAoSWR4ID09IDApCisJCXsKKwkJCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7CisJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIkJBIC0gTWxtZUFEREJBQWN0aW9uKCkgY2FuJ3QgZmluZCBCQU9yaUVudHJ5IFxuIikpOworCQkJcmV0dXJuOworCQl9CisJCWVsc2UKKwkJeworCQkJcEJBRW50cnkgPSZwQWQtPkJBVGFibGUuQkFPcmlFbnRyeVtJZHhdOworCQl9CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJeworCQkJaWYgKEFESE9DX09OKHBBZCkpCisJCQkJQWN0SGVhZGVySW5pdChwQWQsICZGcmFtZS5IZHIsIHBJbmZvLT5wQWRkciwgcEFkLT5DdXJyZW50QWRkcmVzcywgcEFkLT5Db21tb25DZmcuQnNzaWQpOworCQkJZWxzZQorI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCQkJaWYgKHBBZC0+TWFjVGFiLkNvbnRlbnRbcEluZm8tPldjaWRdLlZhbGlkQXNEbHMpCisJCQkJQWN0SGVhZGVySW5pdChwQWQsICZGcmFtZS5IZHIsIHBJbmZvLT5wQWRkciwgcEFkLT5DdXJyZW50QWRkcmVzcywgcEFkLT5Db21tb25DZmcuQnNzaWQpOworCQkJZWxzZQorI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCQkJCUFjdEhlYWRlckluaXQocEFkLCAmRnJhbWUuSGRyLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgcEFkLT5DdXJyZW50QWRkcmVzcywgcEluZm8tPnBBZGRyKTsKKworCQl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwkJRnJhbWUuQ2F0ZWdvcnkgPSBDQVRFR09SWV9CQTsKKwkJRnJhbWUuQWN0aW9uID0gQUREQkFfUkVROworCQlGcmFtZS5CYVBhcm0uQU1TRFVTdXBwb3J0ZWQgPSAwOworCQlGcmFtZS5CYVBhcm0uQkFQb2xpY3kgPSBJTU1FRF9CQTsKKwkJRnJhbWUuQmFQYXJtLlRJRCA9IHBJbmZvLT5USUQ7CisJCUZyYW1lLkJhUGFybS5CdWZTaXplID0gcEluZm8tPkJhQnVmU2l6ZTsKKwkJRnJhbWUuVG9rZW4gPSBwSW5mby0+VG9rZW47CisJCUZyYW1lLlRpbWVPdXRWYWx1ZSA9IHBJbmZvLT5UaW1lT3V0VmFsdWU7CisJCUZyYW1lLkJhU3RhcnRTZXEuZmllbGQuRnJhZ051bSA9IDA7CisJCUZyYW1lLkJhU3RhcnRTZXEuZmllbGQuU3RhcnRTZXEgPSBwQWQtPk1hY1RhYi5Db250ZW50W3BJbmZvLT5XY2lkXS5UeFNlcVtwSW5mby0+VElEXTsKKworCQkqKFVTSE9SVCAqKSgmRnJhbWUuQmFQYXJtKSA9IGNwdTJsZTE2KCooVVNIT1JUICopKCZGcmFtZS5CYVBhcm0pKTsKKwkJRnJhbWUuVGltZU91dFZhbHVlID0gY3B1MmxlMTYoRnJhbWUuVGltZU91dFZhbHVlKTsKKwkJRnJhbWUuQmFTdGFydFNlcS53b3JkID0gY3B1MmxlMTYoRnJhbWUuQmFTdGFydFNlcS53b3JkKTsKKworCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLAkJICAgJkZyYW1lTGVuLAorCQkgICAgICAgICAgICAgIHNpemVvZihGUkFNRV9BRERCQV9SRVEpLCAmRnJhbWUsCisJCSAgICAgICAgICAgICAgRU5EX09GX0FSR1MpOworCQlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIFFJRF9BQ19CRSwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOworCQlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOworCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkJBIC0gU2VuZCBBRERCQSByZXF1ZXN0LiBTdGFydFNlcSA9ICV4LCAgRnJhbWVMZW4gPSAlbGQuIEJ1ZlNpemUgPSAlZFxuIiwgRnJhbWUuQmFTdGFydFNlcS5maWVsZC5TdGFydFNlcSwgRnJhbWVMZW4sIEZyYW1lLkJhUGFybS5CdWZTaXplKSk7CisgICAgfQorfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIHNlbmQgREVMQkEgYW5kIGRlbGV0ZSBCYUVudHJ5IGlmIGFueQorICAgIFBhcmFtZXRyczoKKyAgICAgICAgRWxlbSAtIE1MTUUgbWVzc2FnZSBNTE1FX0RFTEJBX1JFUV9TVFJVQ1QKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBNbG1lREVMQkFBY3Rpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCU1MTUVfREVMQkFfUkVRX1NUUlVDVCAqcEluZm87CisJUFVDSEFSICAgICAgICAgcE91dEJ1ZmZlciA9IE5VTEw7CisJUFVDSEFSCQkgICBwT3V0QnVmZmVyMiA9IE5VTEw7CisJTkRJU19TVEFUVVMgICAgIE5TdGF0dXM7CisJVUxPTkcJCUlkeDsKKwlGUkFNRV9ERUxCQV9SRVEgIEZyYW1lOworCVVMT05HCQlGcmFtZUxlbjsKKwlGUkFNRV9CQVIJRnJhbWVCYXI7CisKKwlwSW5mbyA9IChNTE1FX0RFTEJBX1JFUV9TVFJVQ1QgKilFbGVtLT5Nc2c7CisJLy8gbXVzdCBzZW5kIGJhY2sgREVMQkEKKwlOZGlzWmVyb01lbW9yeSgmRnJhbWUsIHNpemVvZihGUkFNRV9ERUxCQV9SRVEpKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT4gTWxtZURFTEJBQWN0aW9uKCksIEluaXRpYXRvciglZCkgXG4iLCBwSW5mby0+SW5pdGlhdG9yKSk7CisKKwlpZihNbG1lRGVsQkFSZXFTYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbikpCisJeworCQlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOyAgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQorCQlpZihOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJCXsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiQkEgLSBNbG1lREVMQkFBY3Rpb24oKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkIDEuIFxuIikpOworCQkJcmV0dXJuOworCQl9CisKKwkJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyMik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5CisJCWlmKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJeworCQkJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkJBIC0gTWxtZURFTEJBQWN0aW9uKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxlZCAyLiBcbiIpKTsKKwkJCXJldHVybjsKKwkJfQorCisJCS8vIFNFTkQgQkFSIChTZW5kIEJBUiB0byByZWZyZXNoIHBlZXIgcmVvcmRlcmluZyBidWZmZXIuKQorCQlJZHggPSBwQWQtPk1hY1RhYi5Db250ZW50W3BJbmZvLT5XY2lkXS5CQU9yaVdjaWRBcnJheVtwSW5mby0+VElEXTsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJCUJhckhlYWRlckluaXQocEFkLCAmRnJhbWVCYXIsIHBBZC0+TWFjVGFiLkNvbnRlbnRbcEluZm8tPldjaWRdLkFkZHIsIHBBZC0+Q3VycmVudEFkZHJlc3MpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJCUZyYW1lQmFyLlN0YXJ0aW5nU2VxLmZpZWxkLkZyYWdOdW0gPSAwOyAvLyBtYWtlIHN1cmUgc2VxdWVuY2Ugbm90IGNsZWFyIGluIERFTCBmdW5jaXRvbi4KKwkJRnJhbWVCYXIuU3RhcnRpbmdTZXEuZmllbGQuU3RhcnRTZXEgPSBwQWQtPk1hY1RhYi5Db250ZW50W3BJbmZvLT5XY2lkXS5UeFNlcVtwSW5mby0+VElEXTsgLy8gbWFrZSBzdXJlIHNlcXVlbmNlIG5vdCBjbGVhciBpbiBERUwgZnVuY2l0b24uCisJCUZyYW1lQmFyLkJhckNvbnRyb2wuVElEID0gcEluZm8tPlRJRDsgLy8gbWFrZSBzdXJlIHNlcXVlbmNlIG5vdCBjbGVhciBpbiBERUwgZnVuY2l0b24uCisJCUZyYW1lQmFyLkJhckNvbnRyb2wuQUNLUG9saWN5ID0gSU1NRURfQkE7IC8vIG1ha2Ugc3VyZSBzZXF1ZW5jZSBub3QgY2xlYXIgaW4gREVMIGZ1bmNpdG9uLgorCQlGcmFtZUJhci5CYXJDb250cm9sLkNvbXByZXNzZWQgPSAxOyAvLyBtYWtlIHN1cmUgc2VxdWVuY2Ugbm90IGNsZWFyIGluIERFTCBmdW5jaXRvbi4KKwkJRnJhbWVCYXIuQmFyQ29udHJvbC5NVElEID0gMDsgLy8gbWFrZSBzdXJlIHNlcXVlbmNlIG5vdCBjbGVhciBpbiBERUwgZnVuY2l0b24uCisKKwkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlcjIsCQkJCSZGcmFtZUxlbiwKKwkJCQkJICBzaXplb2YoRlJBTUVfQkFSKSwJICAmRnJhbWVCYXIsCisJCQkJCSAgRU5EX09GX0FSR1MpOworCQlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIFFJRF9BQ19CRSwgcE91dEJ1ZmZlcjIsIEZyYW1lTGVuKTsKKwkJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyMik7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQkEgLSBNbG1lREVMQkFBY3Rpb24oKSAuIFNlbmQgQkFSIHRvIHJlZnJlc2ggcGVlciByZW9yZGVyaW5nIGJ1ZmZlciBcbiIpKTsKKworCQkvLyBTRU5EIERFTEJBIEZSQU1FCisJCUZyYW1lTGVuID0gMDsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJeworCQkJaWYgKEFESE9DX09OKHBBZCkpCisJCQkJQWN0SGVhZGVySW5pdChwQWQsICZGcmFtZS5IZHIsIHBBZC0+TWFjVGFiLkNvbnRlbnRbcEluZm8tPldjaWRdLkFkZHIsIHBBZC0+Q3VycmVudEFkZHJlc3MsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKwkJCWVsc2UKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwkJCWlmIChwQWQtPk1hY1RhYi5Db250ZW50W3BJbmZvLT5XY2lkXS5WYWxpZEFzRGxzKQorCQkJCUFjdEhlYWRlckluaXQocEFkLCAmRnJhbWUuSGRyLCBwQWQtPk1hY1RhYi5Db250ZW50W3BJbmZvLT5XY2lkXS5BZGRyLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisJCQllbHNlCisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisJCQkJQWN0SGVhZGVySW5pdChwQWQsICZGcmFtZS5IZHIsICBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgcEFkLT5DdXJyZW50QWRkcmVzcywgcEFkLT5NYWNUYWIuQ29udGVudFtwSW5mby0+V2NpZF0uQWRkcik7CisJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwkJRnJhbWUuQ2F0ZWdvcnkgPSBDQVRFR09SWV9CQTsKKwkJRnJhbWUuQWN0aW9uID0gREVMQkE7CisJCUZyYW1lLkRlbGJhUGFybS5Jbml0aWF0b3IgPSBwSW5mby0+SW5pdGlhdG9yOworCQlGcmFtZS5EZWxiYVBhcm0uVElEID0gcEluZm8tPlRJRDsKKwkJRnJhbWUuUmVhc29uQ29kZSA9IDM5OyAvLyBUaW1lIE91dAorCQkqKFVTSE9SVCAqKSgmRnJhbWUuRGVsYmFQYXJtKSA9IGNwdTJsZTE2KCooVVNIT1JUICopKCZGcmFtZS5EZWxiYVBhcm0pKTsKKwkJRnJhbWUuUmVhc29uQ29kZSA9IGNwdTJsZTE2KEZyYW1lLlJlYXNvbkNvZGUpOworCisJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAgICAgICAgJkZyYW1lTGVuLAorCQkgICAgICAgICAgICAgIHNpemVvZihGUkFNRV9ERUxCQV9SRVEpLCAgICAmRnJhbWUsCisJCSAgICAgICAgICAgICAgRU5EX09GX0FSR1MpOworCQlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIFFJRF9BQ19CRSwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOworCQlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJCQSAtIE1sbWVERUxCQUFjdGlvbigpIC4gMyBERUxCQSBzZW50LiBJbml0aWF0b3IoJWQpXG4iLCBwSW5mby0+SW5pdGlhdG9yKSk7CisgICAgCX0KK30KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworVk9JRCBNbG1lUU9TQWN0aW9uKAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKK30KKworVk9JRCBNbG1lRExTQWN0aW9uKAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKK30KKworVk9JRCBNbG1lSW52YWxpZEFjdGlvbigKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisJLy9QVUNIQVIJCSAgIHBPdXRCdWZmZXIgPSBOVUxMOworCS8vUmV0dXJuIHRoZSByZWNlaXZpbmcgZnJhbWUgZXhjZXB0IHRoZSBNU0Igb2YgY2F0ZWdvcnkgZmlsZWQgc2V0IHRvIDEuICA3LjMuMS4xMQorfQorCitWT0lEIFBlZXJRT1NBY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworfQorCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCitWT0lEIFBlZXJETFNBY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCVVDSEFSCUFjdGlvbiA9IEVsZW0tPk1zZ1tMRU5HVEhfODAyXzExKzFdOworCisJc3dpdGNoKEFjdGlvbikKKwl7CisJCWNhc2UgQUNUSU9OX0RMU19SRVFVRVNUOgorI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJCVBlZXJEbHNSZXFBY3Rpb24ocEFkLCBFbGVtKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwkJCWJyZWFrOworCisJCWNhc2UgQUNUSU9OX0RMU19SRVNQT05TRToKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCQlQZWVyRGxzUnNwQWN0aW9uKHBBZCwgRWxlbSk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJCQlicmVhazsKKworCQljYXNlIEFDVElPTl9ETFNfVEVBUkRPV046CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQkJUGVlckRsc1RlYXJEb3duQWN0aW9uKHBBZCwgRWxlbSk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJCQlicmVhazsKKwl9Cit9CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKK1ZPSUQgUGVlckJBQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlVQ0hBUglBY3Rpb24gPSBFbGVtLT5Nc2dbTEVOR1RIXzgwMl8xMSsxXTsKKworCXN3aXRjaChBY3Rpb24pCisJeworCQljYXNlIEFEREJBX1JFUToKKwkJCVBlZXJBZGRCQVJlcUFjdGlvbihwQWQsRWxlbSk7CisJCQlicmVhazsKKwkJY2FzZSBBRERCQV9SRVNQOgorCQkJUGVlckFkZEJBUnNwQWN0aW9uKHBBZCxFbGVtKTsKKwkJCWJyZWFrOworCQljYXNlIERFTEJBOgorCQkJUGVlckRlbEJBQWN0aW9uKHBBZCxFbGVtKTsKKwkJCWJyZWFrOworCX0KK30KKworCisjaWZkZWYgRE9UMTFOX0RSQUZUMworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCitWT0lEIFN0YVB1YmxpY0FjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVQ0hBUiBCc3MyMDQwQ29leGlzdCkKK3sKKwlCU1NfMjA0MF9DT0VYSVNUX0lFCQlCc3NDb2V4aXN0OworCU1MTUVfU0NBTl9SRVFfU1RSVUNUCQkJU2NhblJlcTsKKworCUJzc0NvZXhpc3Qud29yZCA9IEJzczIwNDBDb2V4aXN0OworCS8vIEFQIGFza3MgU3RhdGlvbiB0byByZXR1cm4gYSAyMC80MCBCU1MgQ29leGlzdGVuY2UgbWdtdCBmcmFtZS4gIFNvIHdlIGZpcnN0IHN0YXJ0cyBhIHNjYW4sIHRoZW4gc2VuZCBiYWNrIDIwLzQwIEJTUyBDb2V4aXN0ZW5jZSBtZ210IGZyYW1lCisJaWYgKChCc3NDb2V4aXN0LmZpZWxkLkluZm9SZXEgPT0gMSkgJiYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfU0NBTl8yMDQwKSkpCisJeworCQkvLyBDbGVhciByZWNvcmQgZmlyc3QuICBBZnRlciBzY2FuICwgd2lsbCB1cGRhdGUgdGhvc2UgYml0IGFuZCBzZW5kIGJhY2sgdG8gdHJhbnNtaXRlci4KKwkJcEFkLT5Db21tb25DZmcuQlNTQ29leGlzdDIwNDAuZmllbGQuSW5mb1JlcSA9IDE7CisJCXBBZC0+Q29tbW9uQ2ZnLkJTU0NvZXhpc3QyMDQwLmZpZWxkLkludG9sZXJhbnQ0MCA9IDA7CisJCXBBZC0+Q29tbW9uQ2ZnLkJTU0NvZXhpc3QyMDQwLmZpZWxkLkJTUzIwV2lkdGhSZXEgPSAwOworCQkvLyBGaWxsIG91dCBzdHVmZiBmb3Igc2NhbiByZXF1ZXN0CisJCVNjYW5QYXJtRmlsbChwQWQsICZTY2FuUmVxLCBaZXJvU3NpZCwgMCwgQlNTX0FOWSwgU0NBTl8yMDQwX0JTU19DT0VYSVNUKTsKKwkJTWxtZUVucXVldWUocEFkLCBTWU5DX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX1NDQU5fUkVRLCBzaXplb2YoTUxNRV9TQ0FOX1JFUV9TVFJVQ1QpLCAmU2NhblJlcSk7CisJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX1dBSVRfT0lEX0xJU1RfU0NBTjsKKwl9Cit9CisKKworLyoKK0Rlc2NyaXB0aW9uIDogQnVpbGQgSW50b2xlcmFudCBDaGFubmVsIFJlcnBvdCBmcm9tIFRyaWdnZXIgZXZlbnQgdGFibGUuCityZXR1cm4gOiBob3cgbWFueSBieXRlcyBjb3BpZWQuCisqLworVUxPTkcgQnVpbGRJbnRvbGVyYW50Q2hhbm5lbFJlcCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiAgICBQVUNIQVIgIHBEZXN0KQoreworCVVMT05HCQkJRnJhbWVMZW4gPSAwOworCVVMT05HCQkJUmVhZE9mZnNldCA9IDA7CisJVUNIQVIJCQlpOworCVVDSEFSCQkJTGFzdFJlZ0NsYXNzID0gMHhmZjsKKwlQVUNIQVIJCQlwTGVuOworCisJZm9yICggaSA9IDA7aSA8IE1BWF9UUklHR0VSX0VWRU5UO2krKykKKwl7CisJCWlmIChwQWQtPkNvbW1vbkNmZy5UcmlnZ2VyRXZlbnRUYWIuRXZlbnRBW2ldLmJWYWxpZCA9PSBUUlVFKQorCQl7CisJCQlpZiAocEFkLT5Db21tb25DZmcuVHJpZ2dlckV2ZW50VGFiLkV2ZW50QVtpXS5SZWdDbGFzcyA9PSBMYXN0UmVnQ2xhc3MpCisJCQl7CisJCQkJKihwRGVzdCArIFJlYWRPZmZzZXQpID0gKFVDSEFSKXBBZC0+Q29tbW9uQ2ZnLlRyaWdnZXJFdmVudFRhYi5FdmVudEFbaV0uQ2hhbm5lbDsKKwkJCQkqcExlbisrOworCQkJCVJlYWRPZmZzZXQrKzsKKwkJCQlGcmFtZUxlbisrOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCSoocERlc3QgKyBSZWFkT2Zmc2V0KSA9IElFXzIwNDBfQlNTX0lOVE9MRVJBTlRfUkVQT1JUOyAgLy8gSUUKKwkJCQkqKHBEZXN0ICsgUmVhZE9mZnNldCArIDEpID0gMjsJLy8gTGVuID0gUmVnQ2xhc3MgYnl0ZSArIGNoYW5uZWwgYnl0ZS4KKwkJCQlwTGVuID0gcERlc3QgKyBSZWFkT2Zmc2V0ICsgMTsKKwkJCQlMYXN0UmVnQ2xhc3MgPSBwQWQtPkNvbW1vbkNmZy5UcmlnZ2VyRXZlbnRUYWIuRXZlbnRBW2ldLlJlZ0NsYXNzOworCQkJCSoocERlc3QgKyBSZWFkT2Zmc2V0ICsgMikgPSBMYXN0UmVnQ2xhc3M7CS8vIExlbiA9IFJlZ0NsYXNzIGJ5dGUgKyBjaGFubmVsIGJ5dGUuCisJCQkJKihwRGVzdCArIFJlYWRPZmZzZXQgKyAzKSA9IChVQ0hBUilwQWQtPkNvbW1vbkNmZy5UcmlnZ2VyRXZlbnRUYWIuRXZlbnRBW2ldLkNoYW5uZWw7CisJCQkJRnJhbWVMZW4gKz0gNDsKKwkJCQlSZWFkT2Zmc2V0ICs9IDQ7CisJCQl9CisKKwkJfQorCX0KKwlyZXR1cm4gRnJhbWVMZW47Cit9CisKKworLyoKK0Rlc2NyaXB0aW9uIDogU2VuZCAyMC80MCBCU1MgQ29leGlzdGVuY2UgQWN0aW9uIGZyYW1lIElmIG9uZSB0cmlnZ2VyIGV2ZW50IGlzIHRyaWdnZXJlZC4KKyovCitWT0lEIFNlbmQyMDQwQ29leGlzdEFjdGlvbigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiAgICBVQ0hBUiAgV2NpZCwKKwlJTglCT09MRUFOCWJBZGRJbnRvbGVyYW50Q2hhKQoreworCVBVQ0hBUgkJCXBPdXRCdWZmZXIgPSBOVUxMOworCU5ESVNfU1RBVFVTIAlOU3RhdHVzOworCUZSQU1FX0FDVElPTl9IRFIJRnJhbWU7CisJVUxPTkcJCQlGcmFtZUxlbjsKKwlVTE9ORwkJCUludG9sZXJhbnRDaGFSZXBMZW47CisKKwlJbnRvbGVyYW50Q2hhUmVwTGVuID0gMDsKKwlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOyAgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQorCWlmKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiQUNUIC0gU2VuZDIwNDBDb2V4aXN0QWN0aW9uKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxlZCBcbiIpKTsKKwkJcmV0dXJuOworCX0KKwlBY3RIZWFkZXJJbml0KHBBZCwgJkZyYW1lLkhkciwgcEFkLT5NYWNUYWIuQ29udGVudFtXY2lkXS5BZGRyLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisJRnJhbWUuQ2F0ZWdvcnkgPSBDQVRFR09SWV9QVUJMSUM7CisJRnJhbWUuQWN0aW9uID0gQUNUSU9OX0JTU18yMDQwX0NPRVhJU1Q7CisKKwlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLAkJCQkmRnJhbWVMZW4sCisJCQkJICBzaXplb2YoRlJBTUVfQUNUSU9OX0hEUiksCSAgJkZyYW1lLAorCQkJCSAgRU5EX09GX0FSR1MpOworCisJKihwT3V0QnVmZmVyICsgRnJhbWVMZW4pID0gcEFkLT5Db21tb25DZmcuQlNTQ29leGlzdDIwNDAud29yZDsKKwlGcmFtZUxlbisrOworCisJaWYgKGJBZGRJbnRvbGVyYW50Q2hhID09IFRSVUUpCisJCUludG9sZXJhbnRDaGFSZXBMZW4gPSBCdWlsZEludG9sZXJhbnRDaGFubmVsUmVwKHBBZCwgcE91dEJ1ZmZlciArIEZyYW1lTGVuKTsKKworCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgUUlEX0FDX0JFLCBwT3V0QnVmZmVyLCBGcmFtZUxlbiArIEludG9sZXJhbnRDaGFSZXBMZW4pOworCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiQUNUIC0gU2VuZDIwNDBDb2V4aXN0QWN0aW9uKCBCU1NDb2V4aXN0MjA0MCA9IDB4JXggKSAgXG4iLCBwQWQtPkNvbW1vbkNmZy5CU1NDb2V4aXN0MjA0MC53b3JkKSk7CisKK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJQWZ0ZXIgc2NhbiwgVXBkYXRlIDIwLzQwIEJTUyBDb2V4aXN0ZW5jZSBJRSBhbmQgc2VuZCBvdXQuCisJQWNjb3JkaW5nIHRvIDgwMi4xMW4gRDMuMDMgMTEuMTQuMTAKKworCVBhcmFtZXRlcnM6CisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBVcGRhdGUyMDQwQ29leGlzdEZyYW1lQW5kTm90aWZ5KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOICAgIFVDSEFSICBXY2lkLAorCUlOCUJPT0xFQU4JYkFkZEludG9sZXJhbnRDaGEpCit7CisJQlNTXzIwNDBfQ09FWElTVF9JRQlPbGRWYWx1ZTsKKworCU9sZFZhbHVlLndvcmQgPSBwQWQtPkNvbW1vbkNmZy5CU1NDb2V4aXN0MjA0MC53b3JkOworCWlmICgocEFkLT5Db21tb25DZmcuVHJpZ2dlckV2ZW50VGFiLkV2ZW50QU5vID4gMCkgfHwgKHBBZC0+Q29tbW9uQ2ZnLlRyaWdnZXJFdmVudFRhYi5FdmVudEJDb3VudERvd24gPiAwKSkKKwkJcEFkLT5Db21tb25DZmcuQlNTQ29leGlzdDIwNDAuZmllbGQuQlNTMjBXaWR0aFJlcSA9IDE7CisKKwkvLyBOZWVkIHRvIGNoZWNrICEhISEKKwkvLyBIb3cgU1RBIHdpbGwgc2V0IEludG9sZXJhbnQ0MCBpZiBpbXBsZW1lbnRhdGlvbiBkZXBlbmRlbnQuIE5vdyB3ZSBkb24ndCBzZXQgdGhpcyBiaXQgZmlyc3QuISEhISEKKwkvLyBTbyBPbmx5IGNoZWNrIEJTUzIwV2lkdGhSZXEgY2hhbmdlLgorCWlmIChPbGRWYWx1ZS5maWVsZC5CU1MyMFdpZHRoUmVxICE9IHBBZC0+Q29tbW9uQ2ZnLkJTU0NvZXhpc3QyMDQwLmZpZWxkLkJTUzIwV2lkdGhSZXEpCisJeworCQlTZW5kMjA0MENvZXhpc3RBY3Rpb24ocEFkLCBXY2lkLCBiQWRkSW50b2xlcmFudENoYSk7CisJfQorfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisKK0JPT0xFQU4gQ2hhbm5lbFN3aXRjaFNhbml0eUNoZWNrKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOICAgIFVDSEFSICBXY2lkLAorCUlOICAgIFVDSEFSICBOZXdDaGFubmVsLAorCUlOICAgIFVDSEFSICBTZWNvbmRhcnkpCit7CisJVUNIQVIJCWk7CisKKwlpZiAoV2NpZCA+PSBNQVhfTEVOX09GX01BQ19UQUJMRSkKKwkJcmV0dXJuIEZBTFNFOworCisJaWYgKChOZXdDaGFubmVsID4gNykgJiYgKFNlY29uZGFyeSA9PSAxKSkKKwkJcmV0dXJuIEZBTFNFOworCisJaWYgKChOZXdDaGFubmVsIDwgNSkgJiYgKFNlY29uZGFyeSA9PSAzKSkKKwkJcmV0dXJuIEZBTFNFOworCisJLy8gMC4gQ2hlY2sgaWYgbmV3IGNoYW5uZWwgaXMgaW4gdGhlIGNoYW5uZWxsaXN0LgorCWZvciAoaSA9IDA7aSA8IHBBZC0+Q2hhbm5lbExpc3ROdW07aSsrKQorCXsKKwkJaWYgKHBBZC0+Q2hhbm5lbExpc3RbaV0uQ2hhbm5lbCA9PSBOZXdDaGFubmVsKQorCQl7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChpID09IHBBZC0+Q2hhbm5lbExpc3ROdW0pCisJCXJldHVybiBGQUxTRTsKKworCXJldHVybiBUUlVFOworfQorCisKK1ZPSUQgQ2hhbm5lbFN3aXRjaEFjdGlvbigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiAgICBVQ0hBUiAgV2NpZCwKKwlJTiAgICBVQ0hBUiAgTmV3Q2hhbm5lbCwKKwlJTiAgICBVQ0hBUiAgU2Vjb25kYXJ5KQoreworCVVDSEFSCQlCQlBWYWx1ZSA9IDA7CisJVUxPTkcJCU1BQ1ZhbHVlOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJTUEVDVFJVTSAtIENoYW5uZWxTd2l0Y2hBY3Rpb24oTmV3Q2hhbm5lbCA9ICVkICwgU2Vjb25kYXJ5ID0gJWQpICBcbiIsIE5ld0NoYW5uZWwsIFNlY29uZGFyeSkpOworCisJaWYgKENoYW5uZWxTd2l0Y2hTYW5pdHlDaGVjayhwQWQsIFdjaWQsIE5ld0NoYW5uZWwsIFNlY29uZGFyeSkgPT0gRkFMU0UpCisJCXJldHVybjsKKworCS8vIDEuICBTd2l0Y2hlcyB0byBCVyA9IDIwLgorCWlmIChTZWNvbmRhcnkgPT0gMCkKKwl7CisJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgJkJCUFZhbHVlKTsKKwkJQkJQVmFsdWUmPSAofjB4MTgpOworCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCBCQlBWYWx1ZSk7CisJCWlmIChwQWQtPk1BQ1ZlcnNpb24gPT0gMHgyODYwMDEwMCkKKwkJeworCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjksIDB4MTYpOworCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNzAsIDB4MDgpOworCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNzMsIDB4MTEpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhcnQyODYwQyAhISEgXG4iICkpOworCQl9CisJCXBBZC0+Q29tbW9uQ2ZnLkJCUEN1cnJlbnRCVyA9IEJXXzIwOworCQlwQWQtPkNvbW1vbkNmZy5DaGFubmVsID0gTmV3Q2hhbm5lbDsKKwkJcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsOworCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwsRkFMU0UpOworCQlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKTsKKwkJcEFkLT5NYWNUYWIuQ29udGVudFtXY2lkXS5IVFBoeU1vZGUuZmllbGQuQlcgPSAwOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEyME1IeiAgICEhISBcbiIgKSk7CisJfQorCS8vIDEuICBTd2l0Y2hlcyB0byBCVyA9IDQwIEFuZCBTdGF0aW9uIHN1cHBvcnRzIEJXID0gNDAuCisJZWxzZSBpZiAoKChTZWNvbmRhcnkgPT0gMSkgfHwgKFNlY29uZGFyeSA9PSAzKSkgJiYgKHBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQ2hhbm5lbFdpZHRoID09IDEpKQorCXsKKwkJcEFkLT5Db21tb25DZmcuQ2hhbm5lbCA9IE5ld0NoYW5uZWw7CisKKwkJaWYgKFNlY29uZGFyeSA9PSAxKQorCQl7CisJCQkvLyBTZWNvbmRhcnkgYWJvdmUuCisJCQlwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgKyAyOworCQkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9CQU5EX0NGRywgJk1BQ1ZhbHVlKTsKKwkJCU1BQ1ZhbHVlICY9IDB4ZmU7CisJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9CQU5EX0NGRywgTUFDVmFsdWUpOworCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCAmQkJQVmFsdWUpOworCQkJQkJQVmFsdWUmPSAofjB4MTgpOworCQkJQkJQVmFsdWV8PSAoMHgxMCk7CisJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCBCQlBWYWx1ZSk7CisJCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsICZCQlBWYWx1ZSk7CisJCQlCQlBWYWx1ZSY9ICh+MHgyMCk7CisJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCBCQlBWYWx1ZSk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISE0ME1IeiBMb3dlciBMSU5LIFVQICEhISBDb250cm9sIENoYW5uZWwgYXQgQmVsb3cuIENlbnRyYWwgPSAlZCBcbiIsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsICkpOworCQl9CisJCWVsc2UKKwkJeworCQkJLy8gU2Vjb25kYXJ5IGJlbG93LgorCQkJcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsIC0gMjsKKwkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfQkFORF9DRkcsICZNQUNWYWx1ZSk7CisJCQlNQUNWYWx1ZSAmPSAweGZlOworCQkJTUFDVmFsdWUgfD0gMHgxOworCQkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfQkFORF9DRkcsIE1BQ1ZhbHVlKTsKKwkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgJkJCUFZhbHVlKTsKKwkJCUJCUFZhbHVlJj0gKH4weDE4KTsKKwkJCUJCUFZhbHVlfD0gKDB4MTApOworCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgQkJQVmFsdWUpOworCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCAmQkJQVmFsdWUpOworCQkJQkJQVmFsdWUmPSAofjB4MjApOworCQkJQkJQVmFsdWV8PSAoMHgyMCk7CisJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCBCQlBWYWx1ZSk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISE0ME1IeiBVcHBlciBMSU5LIFVQICEhISBDb250cm9sIENoYW5uZWwgYXQgVXBwZXJDZW50cmFsID0gJWQgXG4iLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCApKTsKKwkJfQorCQlwQWQtPkNvbW1vbkNmZy5CQlBDdXJyZW50QlcgPSBCV180MDsKKwkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCwgRkFMU0UpOworCQlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCk7CisJCXBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0uSFRQaHlNb2RlLmZpZWxkLkJXID0gMTsKKwl9Cit9CisjZW5kaWYgLy8gRE9UMTFOX0RSQUZUMyAvLworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCitWT0lEIFBlZXJQdWJsaWNBY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworI2lmZGVmIERPVDExTl9EUkFGVDMKKwlVQ0hBUglBY3Rpb24gPSBFbGVtLT5Nc2dbTEVOR1RIXzgwMl8xMSsxXTsKKyNlbmRpZiAvLyBET1QxMU5fRFJBRlQzIC8vCisKKwlpZiAoRWxlbS0+V2NpZCA+PSBNQVhfTEVOX09GX01BQ19UQUJMRSkKKwkJcmV0dXJuOworCisjaWZkZWYgRE9UMTFOX0RSQUZUMworCXN3aXRjaChBY3Rpb24pCisJeworCQljYXNlIEFDVElPTl9CU1NfMjA0MF9DT0VYSVNUOgkvLyBGb3JtYXQgZGVmaW5lZCBpbiBJRUVFIDcuNC43YS4xIGluIDExbiBEcmFmMy4wMworCQkJeworCQkJCS8vVUNIQVIJQnNzQ29leGlzdDsKKwkJCQlCU1NfMjA0MF9DT0VYSVNUX0VMRU1FTlQJCSpwQ29leGlzdEluZm87CisJCQkJQlNTXzIwNDBfQ09FWElTVF9JRSAJCQkqcEJzc0NvZXhpc3RJZTsKKwkJCQlCU1NfMjA0MF9JTlRPTEVSQU5UX0NIX1JFUE9SVAkqcEludG9sZXJhbnRSZXBvcnQgPSBOVUxMOworCisJCQkJaWYgKEVsZW0tPk1zZ0xlbiA8PSAoTEVOR1RIXzgwMl8xMSArIHNpemVvZihCU1NfMjA0MF9DT0VYSVNUX0VMRU1FTlQpKSApCisJCQkJeworCQkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJBQ1RJT04gLSAyMC80MCBCU1MgQ29leGlzdGVuY2UgTWFuYWdlbWVudCBGcmFtZSBsZW5ndGggdG9vIHNob3J0ISBsZW4gPSAlbGQhXG4iLCBFbGVtLT5Nc2dMZW4pKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFDVElPTiAtIDIwLzQwIEJTUyBDb2V4aXN0ZW5jZSBNYW5hZ2VtZW50IGFjdGlvbi0tLS0+IFxuIikpOworCQkJCWhleF9kdW1wKCJDb2V4aXN0ZW5jZU1nbXRGcmFtZSIsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuKTsKKworCisJCQkJcENvZXhpc3RJbmZvID0gKEJTU18yMDQwX0NPRVhJU1RfRUxFTUVOVCAqKSAmRWxlbS0+TXNnW0xFTkdUSF84MDJfMTErMl07CisJCQkJLy9oZXhfZHVtcCgiQ29leGlzdEluZm8iLCAoUFVDSEFSKXBDb2V4aXN0SW5mbywgc2l6ZW9mKEJTU18yMDQwX0NPRVhJU1RfRUxFTUVOVCkpOworCQkJCWlmIChFbGVtLT5Nc2dMZW4gPj0gKExFTkdUSF84MDJfMTEgKyBzaXplb2YoQlNTXzIwNDBfQ09FWElTVF9FTEVNRU5UKSArIHNpemVvZihCU1NfMjA0MF9JTlRPTEVSQU5UX0NIX1JFUE9SVCkpKQorCQkJCXsKKwkJCQkJcEludG9sZXJhbnRSZXBvcnQgPSAoQlNTXzIwNDBfSU5UT0xFUkFOVF9DSF9SRVBPUlQgKikoKFBVQ0hBUilwQ29leGlzdEluZm8gKyBzaXplb2YoQlNTXzIwNDBfQ09FWElTVF9FTEVNRU5UKSk7CisJCQkJfQorCQkJCS8vaGV4X2R1bXAoIkludG9sZXJhbnRSZXBvcnQgIiwgKFBVQ0hBUilwSW50b2xlcmFudFJlcG9ydCwgc2l6ZW9mKEJTU18yMDQwX0lOVE9MRVJBTlRfQ0hfUkVQT1JUKSk7CisKKwkJCQlwQnNzQ29leGlzdEllID0gKEJTU18yMDQwX0NPRVhJU1RfSUUgKikoJnBDb2V4aXN0SW5mby0+QnNzQ29leGlzdEllKTsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQkJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCQkJeworCQkJCQlpZiAoSU5GUkFfT04ocEFkKSkKKwkJCQkJeworCQkJCQkJU3RhUHVibGljQWN0aW9uKHBBZCwgcENvZXhpc3RJbmZvKTsKKwkJCQkJfQorCQkJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCQkJfQorCQkJYnJlYWs7CisJfQorCisjZW5kaWYgLy8gRE9UMTFOX0RSQUZUMyAvLworCit9CisKKworc3RhdGljIFZPSUQgUmVzZXJ2ZWRBY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCVVDSEFSIENhdGVnb3J5OworCisJaWYgKEVsZW0tPk1zZ0xlbiA8PSBMRU5HVEhfODAyXzExKQorCXsKKwkJcmV0dXJuOworCX0KKworCUNhdGVnb3J5ID0gRWxlbS0+TXNnW0xFTkdUSF84MDJfMTFdOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUmN2IHJlc2VydmVkIGNhdGVnb3J5KCVkKSBBY3Rpb24gRnJhbWVcbiIsIENhdGVnb3J5KSk7CisJaGV4X2R1bXAoIlJlc2VydmVkIEFjdGlvbiBGcmFtZSIsICZFbGVtLT5Nc2dbMF0sIEVsZW0tPk1zZ0xlbik7Cit9CisKK1ZPSUQgUGVlclJNQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKKworeworCXJldHVybjsKK30KKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorc3RhdGljIFZPSUQgcmVzcG9uZF9odF9pbmZvcm1hdGlvbl9leGNoYW5nZV9hY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCVBVQ0hBUgkJCXBPdXRCdWZmZXIgPSBOVUxMOworCU5ESVNfU1RBVFVTCQlOU3RhdHVzOworCVVMT05HCQkJRnJhbWVMZW47CisJRlJBTUVfSFRfSU5GTwlIVElORk9mcmFtZSwgKnBGcmFtZTsKKwlVQ0hBUiAgIAkJKnBBZGRyOworCisKKwkvLyAyLiBBbHdheXMgc2VuZCBiYWNrIEFEREJBIFJlc3BvbnNlCisJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsJIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKKworCWlmIChOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkFDVElPTiAtIHJlc3BvbmRfaHRfaW5mb3JtYXRpb25fZXhjaGFuZ2VfYWN0aW9uKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxlZCBcbiIpKTsKKwkJcmV0dXJuOworCX0KKworCS8vIGdldCBSQQorCXBGcmFtZSA9IChGUkFNRV9IVF9JTkZPICopICZFbGVtLT5Nc2dbMF07CisJcEFkZHIgPSBwRnJhbWUtPkhkci5BZGRyMjsKKworCU5kaXNaZXJvTWVtb3J5KCZIVElORk9mcmFtZSwgc2l6ZW9mKEZSQU1FX0hUX0lORk8pKTsKKwkvLyAyLTEuIFByZXBhcmUgQUREQkEgUmVzcG9uc2UgZnJhbWUuCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwl7CisJCWlmIChBREhPQ19PTihwQWQpKQorCQkJQWN0SGVhZGVySW5pdChwQWQsICZIVElORk9mcmFtZS5IZHIsIHBBZGRyLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisJCWVsc2UKKwkJCUFjdEhlYWRlckluaXQocEFkLCAmSFRJTkZPZnJhbWUuSGRyLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgcEFkLT5DdXJyZW50QWRkcmVzcywgcEFkZHIpOworCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCUhUSU5GT2ZyYW1lLkNhdGVnb3J5ID0gQ0FURUdPUllfSFQ7CisJSFRJTkZPZnJhbWUuQWN0aW9uID0gSFRfSU5GT19FWENIQU5HRTsKKwlIVElORk9mcmFtZS5IVF9JbmZvLlJlcXVlc3QgPSAwOworCUhUSU5GT2ZyYW1lLkhUX0luZm8uRm9ydHlfTUh6X0ludG9sZXJhbnQgPSBwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkZvcnR5X01oel9JbnRvbGVyYW50OworCUhUSU5GT2ZyYW1lLkhUX0luZm8uU1RBX0NoYW5uZWxfV2lkdGgJID0gcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLkFkZEh0SW5mby5SZWNvbVdpZHRoOworCisJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwJCQkJCSZGcmFtZUxlbiwKKwkJCQkJICBzaXplb2YoRlJBTUVfSFRfSU5GTyksCSZIVElORk9mcmFtZSwKKwkJCQkJICBFTkRfT0ZfQVJHUyk7CisKKwlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIFFJRF9BQ19CRSwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOworCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7Cit9CisKKworI2lmZGVmIERPVDExTl9EUkFGVDMKK1ZPSUQgU2VuZE5vdGlmeUJXQWN0aW9uRnJhbWUoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVUNIQVIgIFdjaWQsCisJSU4gVUNIQVIgYXBpZHgpCit7CisJUFVDSEFSCQkJcE91dEJ1ZmZlciA9IE5VTEw7CisJTkRJU19TVEFUVVMgCU5TdGF0dXM7CisJRlJBTUVfQUNUSU9OX0hEUglGcmFtZTsKKwlVTE9ORwkJCUZyYW1lTGVuOworCVBVQ0hBUgkJCXBBZGRyMTsKKworCisJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKKwlpZihOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIkFDVCAtIFNlbmROb3RpZnlCV0FjdGlvbigpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWQgXG4iKSk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoV2NpZCA9PSBNQ0FTVF9XQ0lEKQorCQlwQWRkcjEgPSAmQlJPQURDQVNUX0FERFJbMF07CisJZWxzZQorCQlwQWRkcjEgPSBwQWQtPk1hY1RhYi5Db250ZW50W1djaWRdLkFkZHI7CisJQWN0SGVhZGVySW5pdChwQWQsICZGcmFtZS5IZHIsIHBBZGRyMSwgcEFkLT5BcENmZy5NQlNTSURbYXBpZHhdLkJzc2lkLCBwQWQtPkFwQ2ZnLk1CU1NJRFthcGlkeF0uQnNzaWQpOworCisJRnJhbWUuQ2F0ZWdvcnkgPSBDQVRFR09SWV9IVDsKKwlGcmFtZS5BY3Rpb24gPSBOT1RJRllfQldfQUNUSU9OOworCisJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwJCQkJJkZyYW1lTGVuLAorCQkJCSAgc2l6ZW9mKEZSQU1FX0FDVElPTl9IRFIpLAkgICZGcmFtZSwKKwkJCQkgIEVORF9PRl9BUkdTKTsKKworCSoocE91dEJ1ZmZlciArIEZyYW1lTGVuKSA9IHBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mby5BZGRIdEluZm8uUmVjb21XaWR0aDsKKwlGcmFtZUxlbisrOworCisKKwlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIFFJRF9BQ19CRSwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQUNUIC0gU2VuZE5vdGlmeUJXQWN0aW9uKE5vdGlmeUJXPSAlZCkhXG4iLCBwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8uQWRkSHRJbmZvLlJlY29tV2lkdGgpKTsKKworfQorI2VuZGlmIC8vIERPVDExTl9EUkFGVDMgLy8KKworCitWT0lEIFBlZXJIVEFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisJVUNIQVIJQWN0aW9uID0gRWxlbS0+TXNnW0xFTkdUSF84MDJfMTErMV07CisKKwlpZiAoRWxlbS0+V2NpZCA+PSBNQVhfTEVOX09GX01BQ19UQUJMRSkKKwkJcmV0dXJuOworCisJc3dpdGNoKEFjdGlvbikKKwl7CisJCWNhc2UgTk9USUZZX0JXX0FDVElPTjoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQUNUSU9OIC0gSFQgTm90aWZ5IENoYW5uZWwgYmFuZHdpZHRoIGFjdGlvbi0tLS0+IFxuIikpOworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQkJaWYocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5iSHRFbmFibGUgPT0gRkFMU0UpCisJCQl7CisJCQkJLy8gTm90ZSwgdGhpcyBpcyB0byBwYXRjaCBESVItMTM1MyBBUC4gV2hlbiB0aGUgQVAgc2V0IHRvIFdlcCwgaXQgd2lsbCB1c2UgbGVnYWN5IG1vZGUuIEJ1dCBBUCBzdGlsbCBrZWVwcworCQkJCS8vIHNlbmRpbmcgQldfTm90aWZ5IEFjdGlvbiBmcmFtZSwgYW5kIGNhdXNlIHVzIHRvIGxpbmt1cCBhbmQgbGlua2Rvd24uCisJCQkJLy8gSW4gbGVnYWN5IG1vZGUsIGRvbid0IG5lZWQgdG8gcGFyc2UgSFQgYWN0aW9uIGZyYW1lLgorCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQUNUSU9OIC1JZ25vcmUgSFQgTm90aWZ5IENoYW5uZWwgQlcgd2hlbiBsaW5rIGFzIGxlZ2FjeSBtb2RlLiBCVyA9ICVkLS0tPiBcbiIsCisJCQkJCQkJCUVsZW0tPk1zZ1tMRU5HVEhfODAyXzExKzJdICkpOworCQkJCWJyZWFrOworCQkJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJCQlpZiAoRWxlbS0+TXNnW0xFTkdUSF84MDJfMTErMl0gPT0gMCkJLy8gNy40LjguMi4gaWYgdmFsdWUgaXMgMSwga2VlcCB0aGUgc2FtZSBhcyBzdXBwb3J0ZWQgY2hhbm5lbCBiYW5kd2lkdGguCisJCQkJcEFkLT5NYWNUYWIuQ29udGVudFtFbGVtLT5XY2lkXS5IVFBoeU1vZGUuZmllbGQuQlcgPSAwOworCisJCQlicmVhazsKKwkJY2FzZSBTTVBTX0FDVElPTjoKKwkJCS8vIDcuMy4xLjI1CisgCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJBQ1RJT04gLSBTTVBTIGFjdGlvbi0tLS0+IFxuIikpOworCQkJaWYgKCgoRWxlbS0+TXNnW0xFTkdUSF84MDJfMTErMl0mMHgxKSA9PSAwKSkKKwkJCXsKKwkJCQlwQWQtPk1hY1RhYi5Db250ZW50W0VsZW0tPldjaWRdLk1tcHNNb2RlID0gTU1QU19FTkFCTEU7CisJCQl9CisJCQllbHNlIGlmICgoKEVsZW0tPk1zZ1tMRU5HVEhfODAyXzExKzJdJjB4MikgPT0gMCkpCisJCQl7CisJCQkJcEFkLT5NYWNUYWIuQ29udGVudFtFbGVtLT5XY2lkXS5NbXBzTW9kZSA9IE1NUFNfU1RBVElDOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXBBZC0+TWFjVGFiLkNvbnRlbnRbRWxlbS0+V2NpZF0uTW1wc01vZGUgPSBNTVBTX0RZTkFNSUM7CisJCQl9CisKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQWlkKCVkKSBNSU1PIFBTID0gJWRcbiIsIEVsZW0tPldjaWQsIHBBZC0+TWFjVGFiLkNvbnRlbnRbRWxlbS0+V2NpZF0uTW1wc01vZGUpKTsKKwkJCS8vIHJ0Mjg2MGMgOiBhZGQgc29tZXRoaW5nIGZvciBzbXBzIGNoYW5nZS4KKwkJCWJyZWFrOworCisJCWNhc2UgU0VUUENPX0FDVElPTjoKKwkJCWJyZWFrOworCQljYXNlIE1JTU9fQ0hBX01FQVNVUkVfQUNUSU9OOgorCQkJYnJlYWs7CisJCWNhc2UgSFRfSU5GT19FWENIQU5HRToKKwkJCXsKKwkJCQlIVF9JTkZPUk1BVElPTl9PQ1RFVAkqcEhUX2luZm87CisKKwkJCQlwSFRfaW5mbyA9IChIVF9JTkZPUk1BVElPTl9PQ1RFVCAqKSAmRWxlbS0+TXNnW0xFTkdUSF84MDJfMTErMl07CisgICAgCQkJCS8vIDcuNC44LjEwCisgICAgCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQUNUSU9OIC0gSFQgSW5mb3JtYXRpb24gRXhjaGFuZ2UgYWN0aW9uLS0tLT4gXG4iKSk7CisgICAgCQkJCWlmIChwSFRfaW5mby0+UmVxdWVzdCkKKyAgICAJCQkJeworICAgIAkJCQkJcmVzcG9uZF9odF9pbmZvcm1hdGlvbl9leGNoYW5nZV9hY3Rpb24ocEFkLCBFbGVtKTsKKyAgICAJCQkJfQorCQkJfQorICAgIAkJCWJyZWFrOworCX0KK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVJldHJ5IHNlbmRpbmcgQUREQkEgUmVxZXN0LgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwlQYXJhbWV0cnM6CisJcDgwMjNIZWFkZXI6IGlmIHRoaXMgaXMgYWxyZWFkeSA4MDIuMyBmb3JtYXQsIHA4MDIzSGVhZGVyIGlzIE5VTEwKKworCVJldHVybgk6IFRSVUUgaWYgcHV0IGludG8gcnggcmVvcmRlcmluZyBidWZmZXIsIHNob3VsZG4ndCBpbmRpY2F0ZXJ4aGVyZS4KKwkJCQlGQUxTRSAsIHRoZW4gY29udGludWUgaW5kaWNhdGVyeCBhdCB0aGlzIG1vbWVudC4KKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIE9SSUJBVGltZXJUaW1lb3V0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKQoreworCU1BQ19UQUJMRV9FTlRSWQkqcEVudHJ5OworCUlOVAkJCWksIHRvdGFsOworCVVDSEFSCQkJVElEOworCisjaWZkZWYgUkFMSU5LX0FURQorCWlmIChBVEVfT04ocEFkKSkKKwkJcmV0dXJuOworI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKworCXRvdGFsID0gcEFkLT5NYWNUYWIuU2l6ZSAqIE5VTV9PRl9USUQ7CisKKwlmb3IgKGkgPSAxOyAoKGkgPE1BWF9MRU5fT0ZfQkFfT1JJX1RBQkxFKSAmJiAodG90YWwgPiAwKSkgOyBpKyspCisJeworCQlpZiAgKHBBZC0+QkFUYWJsZS5CQU9yaUVudHJ5W2ldLk9SSV9CQV9TdGF0dXMgPT0gT3JpZ2luYXRvcl9Eb25lKQorCQl7CisJCQlwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtwQWQtPkJBVGFibGUuQkFPcmlFbnRyeVtpXS5XY2lkXTsKKwkJCVRJRCA9IHBBZC0+QkFUYWJsZS5CQU9yaUVudHJ5W2ldLlRJRDsKKworCQkJQVNTRVJUKHBBZC0+QkFUYWJsZS5CQU9yaUVudHJ5W2ldLldjaWQgPCBNQVhfTEVOX09GX01BQ19UQUJMRSk7CisJCX0KKwkJdG90YWwgLS07CisJfQorfQorCisKK1ZPSUQgU2VuZFJlZnJlc2hCQVIoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JTUFDX1RBQkxFX0VOVFJZCSpwRW50cnkpCit7CisJRlJBTUVfQkFSCQlGcmFtZUJhcjsKKwlVTE9ORwkJCUZyYW1lTGVuOworCU5ESVNfU1RBVFVTIAlOU3RhdHVzOworCVBVQ0hBUgkJCXBPdXRCdWZmZXIgPSBOVUxMOworCVVTSE9SVAkJCVNlcXVlbmNlOworCVVDSEFSCQkJaSwgVElEOworCVVTSE9SVAkJCWlkeDsKKwlCQV9PUklfRU5UUlkJKnBCQUVudHJ5OworCisJZm9yIChpID0gMDsgaSA8TlVNX09GX1RJRDsgaSsrKQorCXsKKwkJaWR4ID0gcEVudHJ5LT5CQU9yaVdjaWRBcnJheVtpXTsKKwkJaWYgKGlkeCA9PSAwKQorCQl7CisJCQljb250aW51ZTsKKwkJfQorCQlwQkFFbnRyeSA9ICZwQWQtPkJBVGFibGUuQkFPcmlFbnRyeVtpZHhdOworCisJCWlmICAocEJBRW50cnktPk9SSV9CQV9TdGF0dXMgPT0gT3JpZ2luYXRvcl9Eb25lKQorCQl7CisJCQlUSUQgPSBwQkFFbnRyeS0+VElEOworCisJCQlBU1NFUlQocEJBRW50cnktPldjaWQgPCBNQVhfTEVOX09GX01BQ19UQUJMRSk7CisKKwkJCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5CisJCQlpZihOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJCQl7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJCQSAtIE1sbWVBRERCQUFjdGlvbigpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWQgXG4iKSk7CisJCQkJcmV0dXJuOworCQkJfQorCisJCQlTZXF1ZW5jZSA9IHBFbnRyeS0+VHhTZXFbVElEXTsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCQkJQmFySGVhZGVySW5pdChwQWQsICZGcmFtZUJhciwgcEVudHJ5LT5BZGRyLCBwQWQtPkN1cnJlbnRBZGRyZXNzKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCQkJRnJhbWVCYXIuU3RhcnRpbmdTZXEuZmllbGQuRnJhZ051bSA9IDA7IC8vIG1ha2Ugc3VyZSBzZXF1ZW5jZSBub3QgY2xlYXIgaW4gREVMIGZ1bmN0aW9uLgorCQkJRnJhbWVCYXIuU3RhcnRpbmdTZXEuZmllbGQuU3RhcnRTZXEgPSBTZXF1ZW5jZTsgLy8gbWFrZSBzdXJlIHNlcXVlbmNlIG5vdCBjbGVhciBpbiBERUwgZnVuY2l0b24uCisJCQlGcmFtZUJhci5CYXJDb250cm9sLlRJRCA9IFRJRDsgLy8gbWFrZSBzdXJlIHNlcXVlbmNlIG5vdCBjbGVhciBpbiBERUwgZnVuY2l0b24uCisKKwkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsCQkJCSZGcmFtZUxlbiwKKwkJCQkJCQkgIHNpemVvZihGUkFNRV9CQVIpLAkgICZGcmFtZUJhciwKKwkJCQkJCQkgIEVORF9PRl9BUkdTKTsKKwkJCWlmICgxKQkvLyBOb3cgd2UgYWx3YXlzIHNlbmQgQkFSLgorCQkJeworCQkJCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgMCwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOworCQkJfQorCQkJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKKwkJfQorCX0KK30KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworVk9JRCBBY3RIZWFkZXJJbml0KAorICAgIElOCVBSVE1QX0FEQVBURVIJcEFkLAorICAgIElOIE9VVCBQSEVBREVSXzgwMl8xMSBwSGRyODAyMTEsCisgICAgSU4gUFVDSEFSIEFkZHIxLAorICAgIElOIFBVQ0hBUiBBZGRyMiwKKyAgICBJTiBQVUNIQVIgQWRkcjMpCit7CisgICAgTmRpc1plcm9NZW1vcnkocEhkcjgwMjExLCBzaXplb2YoSEVBREVSXzgwMl8xMSkpOworICAgIHBIZHI4MDIxMS0+RkMuVHlwZSA9IEJUWVBFX01HTVQ7CisgICAgcEhkcjgwMjExLT5GQy5TdWJUeXBlID0gU1VCVFlQRV9BQ1RJT047CisKKyAgICBDT1BZX01BQ19BRERSKHBIZHI4MDIxMS0+QWRkcjEsIEFkZHIxKTsKKwlDT1BZX01BQ19BRERSKHBIZHI4MDIxMS0+QWRkcjIsIEFkZHIyKTsKKyAgICBDT1BZX01BQ19BRERSKHBIZHI4MDIxMS0+QWRkcjMsIEFkZHIzKTsKK30KKworVk9JRCBCYXJIZWFkZXJJbml0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOIE9VVCBQRlJBTUVfQkFSIHBDbnRsQmFyLAorCUlOIFBVQ0hBUiBwREEsCisJSU4gUFVDSEFSIHBTQSkKK3sKKwlOZGlzWmVyb01lbW9yeShwQ250bEJhciwgc2l6ZW9mKEZSQU1FX0JBUikpOworCXBDbnRsQmFyLT5GQy5UeXBlID0gQlRZUEVfQ05UTDsKKwlwQ250bEJhci0+RkMuU3ViVHlwZSA9IFNVQlRZUEVfQkxPQ0tfQUNLX1JFUTsKKyAgIAlwQ250bEJhci0+QmFyQ29udHJvbC5NVElEID0gMDsKKwlwQ250bEJhci0+QmFyQ29udHJvbC5Db21wcmVzc2VkID0gMTsKKwlwQ250bEJhci0+QmFyQ29udHJvbC5BQ0tQb2xpY3kgPSAwOworCisKKwlwQ250bEJhci0+RHVyYXRpb24gPSAxNiArIFJUTVBDYWxjRHVyYXRpb24ocEFkLCBSQVRFXzEsIHNpemVvZihGUkFNRV9CQSkpOworCisJQ09QWV9NQUNfQUREUihwQ250bEJhci0+QWRkcjEsIHBEQSk7CisJQ09QWV9NQUNfQUREUihwQ250bEJhci0+QWRkcjIsIHBTQSk7Cit9CisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlJbnNlcnQgQ2F0ZWdvcnkgYW5kIGFjdGlvbiBjb2RlIGludG8gdGhlIGFjdGlvbiBmcmFtZS4KKworCVBhcmFtZXRyczoKKwkJMS4gZnJhbWUgYnVmZmVyIHBvaW50ZXIuCisJCTIuIGZyYW1lIGxlbmd0aC4KKwkJMy4gY2F0ZWdvcnkgY29kZSBvZiB0aGUgZnJhbWUuCisJCTQuIGFjdGlvbiBjb2RlIG9mIHRoZSBmcmFtZS4KKworCVJldHVybgk6IE5vbmUuCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBJbnNlcnRBY3RGaWVsZCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlPVVQgUFVDSEFSIHBGcmFtZUJ1ZiwKKwlPVVQgUFVMT05HIHBGcmFtZUxlbiwKKwlJTiBVSU5UOCBDYXRlZ29yeSwKKwlJTiBVSU5UOCBBY3RDb2RlKQoreworCVVMT05HIFRlbXBMZW47CisKKwlNYWtlT3V0Z29pbmdGcmFtZSgJcEZyYW1lQnVmLAkJJlRlbXBMZW4sCisJCQkJCQkxLAkJCQkmQ2F0ZWdvcnksCisJCQkJCQkxLAkJCQkmQWN0Q29kZSwKKwkJCQkJCUVORF9PRl9BUkdTKTsKKworCSpwRnJhbWVMZW4gPSAqcEZyYW1lTGVuICsgVGVtcExlbjsKKworCXJldHVybjsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2FjdGlvbi5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vYWN0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2UzODc3ZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2FjdGlvbi5oCkBAIC0wLDAgKzEsNjggQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJTW9kdWxlIE5hbWU6CisJYWlyb25ldC5oCisKKwlBYnN0cmFjdDoKKworCVJldmlzaW9uIEhpc3Rvcnk6CisJV2hvCQkJV2hlbgkJCVdoYXQKKwktLS0tLS0tLQktLS0tLS0tLS0tCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJTmFtZQkJRGF0ZQkJCU1vZGlmaWNhdGlvbiBsb2dzCisJUGF1bCBMaW4JMDQtMDYtMTUJCUluaXRpYWwKKyovCisKKyNpZm5kZWYJX19BQ1RJT05fSF9fCisjZGVmaW5lCV9fQUNUSU9OX0hfXworCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX19IVF9JTkZPX09DVEVUCit7CisjaWZkZWYgUlRfQklHX0VORElBTgorCVVDSEFSCVJlc2VydmVkOjU7CisJVUNIQVIgCVNUQV9DaGFubmVsX1dpZHRoOjE7CisJVUNIQVIJRm9ydHlfTUh6X0ludG9sZXJhbnQ6MTsKKwlVQ0hBUglSZXF1ZXN0OjE7CisjZWxzZQorCVVDSEFSCVJlcXVlc3Q6MTsKKwlVQ0hBUglGb3J0eV9NSHpfSW50b2xlcmFudDoxOworCVVDSEFSIAlTVEFfQ2hhbm5lbF9XaWR0aDoxOworCVVDSEFSCVJlc2VydmVkOjU7CisjZW5kaWYKK30gSFRfSU5GT1JNQVRJT05fT0NURVQ7CisKKwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9fRlJBTUVfSFRfSU5GTworeworCUhFQURFUl84MDJfMTEgICAJCUhkcjsKKwlVQ0hBUgkJCQkJQ2F0ZWdvcnk7CisJVUNIQVIJCQkJCUFjdGlvbjsKKwlIVF9JTkZPUk1BVElPTl9PQ1RFVAlIVF9JbmZvOworfSAgIEZSQU1FX0hUX0lORk8sICpQRlJBTUVfSFRfSU5GTzsKKworI2VuZGlmIC8qIF9fQUNUSU9OX0hfXyAqLworCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2JhX2FjdGlvbi5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vYmFfYWN0aW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTkxZDFlMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2JhX2FjdGlvbi5jCkBAIC0wLDAgKzEsMTgwMiBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCisjaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCisKKworCisjZGVmaW5lIEJBX09SSV9JTklUX1NFUQkJKHBFbnRyeS0+VHhTZXFbVElEXSkgLy8xCQkJLy8gaW5pdGFsIHNlcXVlbmNlIG51bWJlciBvZiBCQSBzZXNzaW9uCisKKyNkZWZpbmUgT1JJX1NFU1NJT05fTUFYX1JFVFJZCTgKKyNkZWZpbmUgT1JJX0JBX1NFU1NJT05fVElNRU9VVAkoMjAwMCkJLy8gbXMKKyNkZWZpbmUgUkVDX0JBX1NFU1NJT05fSURMRV9USU1FT1VUCSgxMDAwKQkvLyBtcworCisjZGVmaW5lIFJFT1JERVJJTkdfUEFDS0VUX1RJTUVPVVQJCSgoMTAwICogSFopLzEwMDApCS8vIHN5c3RlbSB0aWNrcyAtLSAxMDAgbXMKKyNkZWZpbmUgTUFYX1JFT1JERVJJTkdfUEFDS0VUX1RJTUVPVVQJKCgzMDAwICogSFopLzEwMDApCS8vIHN5c3RlbSB0aWNrcyAtLSAxMDAgbXMKKworI2RlZmluZSBSRVNFVF9SQ1ZfU0VRCQkoMHhGRkZGKQorCitzdGF0aWMgdm9pZCBiYV9tcGR1X2Jsa19mcmVlKFBSVE1QX0FEQVBURVIgcEFkLCBzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1ICptcGR1X2Jsayk7CisKKworQkFfT1JJX0VOVFJZICpCQVRhYmxlQWxsb2NPcmlFbnRyeSgKKwkJCQkJCQkJICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwkJCQkJCQkJICBPVVQgVVNIT1JUICAgICAgICAgICpJZHgpOworCitCQV9SRUNfRU5UUlkgKkJBVGFibGVBbGxvY1JlY0VudHJ5KAorCQkJCQkJCQkgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCQkJCQkJCQkgIE9VVCBVU0hPUlQgICAgICAgICAgKklkeCk7CisKK1ZPSUQgQkFPcmlTZXNzaW9uU2V0dXBUaW1lb3V0KAorICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKKyAgICBJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCisgICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAorICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMyk7CisKK1ZPSUQgQkFSZWNTZXNzaW9uSWRsZVRpbWVvdXQoCisgICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorICAgIElOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKKyAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisgICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKKworCitCVUlMRF9USU1FUl9GVU5DVElPTihCQU9yaVNlc3Npb25TZXR1cFRpbWVvdXQpOworQlVJTERfVElNRVJfRlVOQ1RJT04oQkFSZWNTZXNzaW9uSWRsZVRpbWVvdXQpOworCisjZGVmaW5lIEFOTk9VTkNFX1JFT1JERVJJTkdfUEFDS0VUKF9wQWQsIF9tcGR1X2JsaykJXAorCQkJQW5ub3VuY2VfUmVvcmRlcmluZ19QYWNrZXQoX3BBZCwgX21wZHVfYmxrKTsKKworVk9JRCBCQV9NYXhXaW5TaXplUmVhc2lnbigKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiBNQUNfVEFCTEVfRU5UUlkgICpwRW50cnlQZWVyLAorCU9VVCBVQ0hBUgkJCSpwV2luU2l6ZSkKK3sKKwlVQ0hBUiBNYXhTaXplOworCisKKwlpZiAocEFkLT5NQUNWZXJzaW9uID49IFJBTElOS18yODgzX1ZFUlNJT04pIC8vIDMqMworCXsKKwkJaWYgKHBBZC0+TUFDVmVyc2lvbiA+PSBSQUxJTktfMzA3MF9WRVJTSU9OKQorCQl7CisJCQlpZiAocEVudHJ5UGVlci0+V2VwU3RhdHVzICE9IE5kaXM4MDJfMTFFbmNyeXB0aW9uRGlzYWJsZWQpCisJCQkJTWF4U2l6ZSA9IDc7IC8vIGZvciBub24tb3BlbiBtb2RlCisJCQllbHNlCisJCQkJTWF4U2l6ZSA9IDEzOworCQl9CisJCWVsc2UKKwkJCU1heFNpemUgPSAzMTsKKwl9CisJZWxzZSBpZiAocEFkLT5NQUNWZXJzaW9uID49IFJBTElOS18yODgwRV9WRVJTSU9OKSAvLyAyODgwIGUKKwl7CisJCWlmIChwRW50cnlQZWVyLT5XZXBTdGF0dXMgIT0gTmRpczgwMl8xMUVuY3J5cHRpb25EaXNhYmxlZCkKKwkJCU1heFNpemUgPSA3OyAvLyBmb3Igbm9uLW9wZW4gbW9kZQorCQllbHNlCisJCQlNYXhTaXplID0gMTM7CisJfQorCWVsc2UKKwkJTWF4U2l6ZSA9IDc7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJiYT4gV2luIFNpemUgPSAlZCwgTWF4IFNpemUgPSAlZFxuIiwKKwkJCSpwV2luU2l6ZSwgTWF4U2l6ZSkpOworCisJaWYgKCgqcFdpblNpemUpID4gTWF4U2l6ZSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoImJhPiByZWFzc2lnbiBtYXggd2luIHNpemUgZnJvbSAlZCB0byAlZFxuIiwKKwkJCQkqcFdpblNpemUsIE1heFNpemUpKTsKKworCQkqcFdpblNpemUgPSBNYXhTaXplOworCX0KK30KKwordm9pZCBBbm5vdW5jZV9SZW9yZGVyaW5nX1BhY2tldChJTiBQUlRNUF9BREFQVEVSCQkJcEFkLAorCQkJCQkJCQlJTiBzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1CSptcGR1KQoreworCVBORElTX1BBQ0tFVCAgICBwUGFja2V0OworCisJcFBhY2tldCA9IG1wZHUtPnBQYWNrZXQ7CisKKwlpZiAobXBkdS0+YkFNU0RVKQorCXsKKwkJQVNTRVJUKDApOworCQlCQV9SZW9yZGVyX0FNU0RVX0Fubm5vdW5jZShwQWQsIHBQYWNrZXQpOworCX0KKwllbHNlCisJeworCQkvLworCQkvLyBwYXNzIHRoaXMgODAyLjMgcGFja2V0IHRvIHVwcGVyIGxheWVyIG9yIGZvcndhcmQgdGhpcyBwYWNrZXQgdG8gV00gZGlyZWN0bHkKKwkJLy8KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQkJQU5OT1VOQ0VfT1JfRk9SV0FSRF84MDJfM19QQUNLRVQocEFkLCBwUGFja2V0LCBSVE1QX0dFVF9QQUNLRVRfSUYocFBhY2tldCkpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCX0KK30KKworLyoKKyAqIEluc2VydCBhIHJlb3JkZXJpbmcgbXBkdSBpbnRvIHNvcnRlZCBsaW5rZWQgbGlzdCBieSBzZXF1ZW5jZSBuby4KKyAqLworQk9PTEVBTiBiYV9yZW9yZGVyaW5nX21wZHVfaW5zZXJ0c29ydGVkKHN0cnVjdCByZW9yZGVyaW5nX2xpc3QgKmxpc3QsIHN0cnVjdCByZW9yZGVyaW5nX21wZHUgKm1wZHUpCit7CisKKwlzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1ICoqcHBTY2FuID0gJmxpc3QtPm5leHQ7CisKKwl3aGlsZSAoKnBwU2NhbiAhPSBOVUxMKQorCXsKKwkJaWYgKFNFUV9TTUFMTEVSKCgqcHBTY2FuKS0+U2VxdWVuY2UsIG1wZHUtPlNlcXVlbmNlLCBNQVhTRVEpKQorCQl7CisJCQlwcFNjYW4gPSAmKCpwcFNjYW4pLT5uZXh0OworCQl9CisJCWVsc2UgaWYgKCgqcHBTY2FuKS0+U2VxdWVuY2UgPT0gbXBkdS0+U2VxdWVuY2UpCisJCXsKKwkJCS8qIGdpdmUgdXAgdGhpcyBkdXBsaWNhdGVkIGZyYW1lICovCisJCQlyZXR1cm4oRkFMU0UpOworCQl9CisJCWVsc2UKKwkJeworCQkJLyogZmluZCBwb3NpdGlvbiAqLworCQkJYnJlYWs7CisJCX0KKwl9CisKKwltcGR1LT5uZXh0ID0gKnBwU2NhbjsKKwkqcHBTY2FuID0gbXBkdTsKKwlsaXN0LT5xbGVuKys7CisJcmV0dXJuIFRSVUU7Cit9CisKKworLyoKKyAqIGNhbGxlciBsb2NrIGNyaXRpY2FsIHNlY3Rpb24gaWYgbmVjZXNzYXJ5CisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBiYV9lbnF1ZXVlKHN0cnVjdCByZW9yZGVyaW5nX2xpc3QgKmxpc3QsIHN0cnVjdCByZW9yZGVyaW5nX21wZHUgKm1wZHVfYmxrKQoreworCWxpc3QtPnFsZW4rKzsKKwltcGR1X2Jsay0+bmV4dCA9IGxpc3QtPm5leHQ7CisJbGlzdC0+bmV4dCA9IG1wZHVfYmxrOworfQorCisvKgorICogY2FsbGVyIGxvY2sgY3JpdGljYWwgc2VjdGlvbiBpZiBuZWNlc3NhcnkKKyAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1ICogYmFfZGVxdWV1ZShzdHJ1Y3QgcmVvcmRlcmluZ19saXN0ICpsaXN0KQoreworCXN0cnVjdCByZW9yZGVyaW5nX21wZHUgKm1wZHVfYmxrID0gTlVMTDsKKworCUFTU0VSVChsaXN0KTsKKworCQlpZiAobGlzdC0+cWxlbikKKwkJeworCQkJbGlzdC0+cWxlbi0tOworCQkJbXBkdV9ibGsgPSBsaXN0LT5uZXh0OworCQkJaWYgKG1wZHVfYmxrKQorCQkJeworCQkJCWxpc3QtPm5leHQgPSBtcGR1X2Jsay0+bmV4dDsKKwkJCQltcGR1X2Jsay0+bmV4dCA9IE5VTEw7CisJCQl9CisJCX0KKwlyZXR1cm4gbXBkdV9ibGs7Cit9CisKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1ICAqYmFfcmVvcmRlcmluZ19tcGR1X2RlcXVldWUoc3RydWN0IHJlb3JkZXJpbmdfbGlzdCAqbGlzdCkKK3sKKwlyZXR1cm4oYmFfZGVxdWV1ZShsaXN0KSk7Cit9CisKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1ICAqYmFfcmVvcmRlcmluZ19tcGR1X3Byb2JlKHN0cnVjdCByZW9yZGVyaW5nX2xpc3QgKmxpc3QpCisJeworCUFTU0VSVChsaXN0KTsKKworCQlyZXR1cm4obGlzdC0+bmV4dCk7CisJfQorCisKKy8qCisgKiBmcmVlIGFsbCByZXNvdXJjZSBmb3IgcmVvcmRlcmluZyBtZWNoYW5pc20KKyAqLwordm9pZCBiYV9yZW9yZGVyaW5nX3Jlc291cmNlX3JlbGVhc2UoUFJUTVBfQURBUFRFUiBwQWQpCit7CisJQkFfVEFCTEUgICAgICAgICpUYWI7CisJUEJBX1JFQ19FTlRSWSAgIHBCQUVudHJ5OworCXN0cnVjdCByZW9yZGVyaW5nX21wZHUgKm1wZHVfYmxrOworCWludCBpOworCisJVGFiID0gJnBBZC0+QkFUYWJsZTsKKworCS8qIEkuICByZWxlYXNlIGFsbCBwZW5kaW5nIHJlb3JkZXJpbmcgcGFja2V0ICovCisJTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5CQVRhYkxvY2spOworCWZvciAoaSA9IDA7IGkgPCBNQVhfTEVOX09GX0JBX1JFQ19UQUJMRTsgaSsrKQorCXsKKwkJcEJBRW50cnkgPSAmVGFiLT5CQVJlY0VudHJ5W2ldOworCQlpZiAocEJBRW50cnktPlJFQ19CQV9TdGF0dXMgIT0gUmVjaXBpZW50X05PTkUpCisJCXsKKwkJCXdoaWxlICgobXBkdV9ibGsgPSBiYV9yZW9yZGVyaW5nX21wZHVfZGVxdWV1ZSgmcEJBRW50cnktPmxpc3QpKSkKKwkJCXsKKwkJCQlBU1NFUlQobXBkdV9ibGstPnBQYWNrZXQpOworCQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBtcGR1X2Jsay0+cFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCQkJYmFfbXBkdV9ibGtfZnJlZShwQWQsIG1wZHVfYmxrKTsKKwkJCX0KKwkJfQorCX0KKwlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPkJBVGFiTG9jayk7CisKKwlBU1NFUlQocEJBRW50cnktPmxpc3QucWxlbiA9PSAwKTsKKwkvKiBJSS4gZnJlZSBtZW1vcnkgb2YgcmVvcmRlcmluZyBtcGR1IHRhYmxlICovCisJTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5tcGR1X2Jsa19wb29sLmxvY2spOworCW9zX2ZyZWVfbWVtKHBBZCwgcEFkLT5tcGR1X2Jsa19wb29sLm1lbSk7CisJTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5tcGR1X2Jsa19wb29sLmxvY2spOworfQorCisKKworLyoKKyAqIEFsbG9jYXRlIGFsbCByZXNvdXJjZSBmb3IgcmVvcmRlcmluZyBtZWNoYW5pc20KKyAqLworQk9PTEVBTiBiYV9yZW9yZGVyaW5nX3Jlc291cmNlX2luaXQoUFJUTVBfQURBUFRFUiBwQWQsIGludCBudW0pCit7CisJaW50ICAgICBpOworCVBVQ0hBUiAgbWVtOworCXN0cnVjdCByZW9yZGVyaW5nX21wZHUgKm1wZHVfYmxrOworCXN0cnVjdCByZW9yZGVyaW5nX2xpc3QgKmZyZWVsaXN0OworCisJLyogYWxsb2NhdGUgc3BpbmxvY2sgKi8KKwlOZGlzQWxsb2NhdGVTcGluTG9jaygmcEFkLT5tcGR1X2Jsa19wb29sLmxvY2spOworCisJLyogaW5pdGlhbGl6ZSBmcmVlbGlzdCAqLworCWZyZWVsaXN0ID0gJnBBZC0+bXBkdV9ibGtfcG9vbC5mcmVlbGlzdDsKKwlmcmVlbGlzdC0+bmV4dCA9IE5VTEw7CisJZnJlZWxpc3QtPnFsZW4gPSAwOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQWxsb2NhdGUgJWQgbWVtb3J5IGZvciBCQSByZW9yZGVyaW5nXG4iLCAoVUlOVDMyKShudW0qc2l6ZW9mKHN0cnVjdCByZW9yZGVyaW5nX21wZHUpKSkpOworCisJLyogYWxsb2NhdGUgbnVtYmVyIG9mIG1wZHVfYmxrIG1lbW9yeSAqLworCW9zX2FsbG9jX21lbShwQWQsIChQVUNIQVIgKikmbWVtLCAobnVtKnNpemVvZihzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1KSkpOworCisJcEFkLT5tcGR1X2Jsa19wb29sLm1lbSA9IG1lbTsKKworCWlmIChtZW0gPT0gTlVMTCkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkNhbid0IEFsbG9jYXRlIE1lbW9yeSBmb3IgQkEgUmVvcmRlcmluZ1xuIikpOworCQlyZXR1cm4oRkFMU0UpOworCX0KKworCS8qIGJ1aWxkIG1wZHVfYmxrIGZyZWUgbGlzdCAqLworCWZvciAoaT0wOyBpPG51bTsgaSsrKQorCXsKKwkJLyogZ2V0IG1wZHVfYmxrICovCisJCW1wZHVfYmxrID0gKHN0cnVjdCByZW9yZGVyaW5nX21wZHUgKikgbWVtOworCQkvKiBpbml0aWFsIG1wZHVfYmxrICovCisJCU5kaXNaZXJvTWVtb3J5KG1wZHVfYmxrLCBzaXplb2Yoc3RydWN0IHJlb3JkZXJpbmdfbXBkdSkpOworCQkvKiBuZXh0IG1wZHVfYmxrICovCisJCW1lbSArPSBzaXplb2Yoc3RydWN0IHJlb3JkZXJpbmdfbXBkdSk7CisJCS8qIGluc2VydCBtcGR1X2JsayBpbnRvIGZyZWVsaXN0ICovCisJCWJhX2VucXVldWUoZnJlZWxpc3QsIG1wZHVfYmxrKTsKKwl9CisKKwlyZXR1cm4oVFJVRSk7Cit9CisKKy8vc3RhdGljIGludCBibGtfY291bnQ9MDsgLy8gc2FtcGxlIHRha2Ugb2ZmLCBubyB1c2UKKworc3RhdGljIHN0cnVjdCByZW9yZGVyaW5nX21wZHUgKmJhX21wZHVfYmxrX2FsbG9jKFBSVE1QX0FEQVBURVIgcEFkKQoreworCXN0cnVjdCByZW9yZGVyaW5nX21wZHUgKm1wZHVfYmxrOworCisJTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5tcGR1X2Jsa19wb29sLmxvY2spOworCW1wZHVfYmxrID0gYmFfZGVxdWV1ZSgmcEFkLT5tcGR1X2Jsa19wb29sLmZyZWVsaXN0KTsKKwlpZiAobXBkdV9ibGspCisJeworLy8JCWJsa19jb3VudCsrOworCQkvKiByZXNldCBtcGR1X2JsayAqLworCQlOZGlzWmVyb01lbW9yeShtcGR1X2Jsaywgc2l6ZW9mKHN0cnVjdCByZW9yZGVyaW5nX21wZHUpKTsKKwl9CisJTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5tcGR1X2Jsa19wb29sLmxvY2spOworCXJldHVybiBtcGR1X2JsazsKK30KKworc3RhdGljIHZvaWQgYmFfbXBkdV9ibGtfZnJlZShQUlRNUF9BREFQVEVSIHBBZCwgc3RydWN0IHJlb3JkZXJpbmdfbXBkdSAqbXBkdV9ibGspCit7CisJQVNTRVJUKG1wZHVfYmxrKTsKKworCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+bXBkdV9ibGtfcG9vbC5sb2NrKTsKKy8vCWJsa19jb3VudC0tOworCWJhX2VucXVldWUoJnBBZC0+bXBkdV9ibGtfcG9vbC5mcmVlbGlzdCwgbXBkdV9ibGspOworCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+bXBkdV9ibGtfcG9vbC5sb2NrKTsKK30KKworCitzdGF0aWMgVVNIT1JUIGJhX2luZGljYXRlX3Jlb3JkZXJpbmdfbXBkdXNfaW5fb3JkZXIoCisJCQkJCQkJCQkJCQkgICBJTiBQUlRNUF9BREFQVEVSICAgIHBBZCwKKwkJCQkJCQkJCQkJCSAgIElOIFBCQV9SRUNfRU5UUlkgICAgcEJBRW50cnksCisJCQkJCQkJCQkJCQkgICBJTiBVU0hPUlQgICAgICAgICAgIFN0YXJ0U2VxKQoreworCXN0cnVjdCByZW9yZGVyaW5nX21wZHUgKm1wZHVfYmxrOworCVVTSE9SVCAgTGFzdEluZFNlcSA9IFJFU0VUX1JDVl9TRVE7CisKKwlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQkFFbnRyeS0+UnhSZVJpbmdMb2NrKTsKKworCXdoaWxlICgobXBkdV9ibGsgPSBiYV9yZW9yZGVyaW5nX21wZHVfcHJvYmUoJnBCQUVudHJ5LT5saXN0KSkpCisJCXsKKwkJCS8qIGZpbmQgaW4tb3JkZXIgZnJhbWUgKi8KKwkJaWYgKCFTRVFfU1RFUE9ORShtcGR1X2Jsay0+U2VxdWVuY2UsIFN0YXJ0U2VxLCBNQVhTRVEpKQorCQkJeworCQkJCWJyZWFrOworCQkJfQorCQkJLyogZGVxdWV1ZSBpbi1vcmRlciBmcmFtZSBmcm9tIHJlb2RlcmluZyBsaXN0ICovCisJCQltcGR1X2JsayA9IGJhX3Jlb3JkZXJpbmdfbXBkdV9kZXF1ZXVlKCZwQkFFbnRyeS0+bGlzdCk7CisJCQkvKiBwYXNzIHRoaXMgZnJhbWUgdXAgKi8KKwkJQU5OT1VOQ0VfUkVPUkRFUklOR19QQUNLRVQocEFkLCBtcGR1X2Jsayk7CisJCS8qIG1vdmUgdG8gbmV4dCBzZXF1ZW5jZSAqLworCQkJU3RhcnRTZXEgPSBtcGR1X2Jsay0+U2VxdWVuY2U7CisJCUxhc3RJbmRTZXEgPSBTdGFydFNlcTsKKwkJLyogZnJlZSBtcGR1X2JsayAqLworCQkJYmFfbXBkdV9ibGtfZnJlZShwQWQsIG1wZHVfYmxrKTsKKwl9CisKKwlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQkFFbnRyeS0+UnhSZVJpbmdMb2NrKTsKKworCS8qIHVwZGF0ZSBsYXN0IGluZGljYXRlZCBzZXF1ZW5jZSAqLworCXJldHVybiBMYXN0SW5kU2VxOworfQorCitzdGF0aWMgdm9pZCBiYV9pbmRpY2F0ZV9yZW9yZGVyaW5nX21wZHVzX2xlX3NlcSgKKwkJCQkJCQkJCQkJICAgSU4gUFJUTVBfQURBUFRFUiAgICBwQWQsCisJCQkJCQkJCQkJCSAgIElOIFBCQV9SRUNfRU5UUlkgICAgcEJBRW50cnksCisJCQkJCQkJCQkJCSAgIElOIFVTSE9SVCAgICAgICAgICAgU2VxdWVuY2UpCit7CisJc3RydWN0IHJlb3JkZXJpbmdfbXBkdSAqbXBkdV9ibGs7CisKKwlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQkFFbnRyeS0+UnhSZVJpbmdMb2NrKTsKKwl3aGlsZSAoKG1wZHVfYmxrID0gYmFfcmVvcmRlcmluZ19tcGR1X3Byb2JlKCZwQkFFbnRyeS0+bGlzdCkpKQorCQl7CisJCQkvKiBmaW5kIGluLW9yZGVyIGZyYW1lICovCisJCWlmICgobXBkdV9ibGstPlNlcXVlbmNlID09IFNlcXVlbmNlKSB8fCBTRVFfU01BTExFUihtcGR1X2Jsay0+U2VxdWVuY2UsIFNlcXVlbmNlLCBNQVhTRVEpKQorCQl7CisJCQkvKiBkZXF1ZXVlIGluLW9yZGVyIGZyYW1lIGZyb20gcmVvZGVyaW5nIGxpc3QgKi8KKwkJCW1wZHVfYmxrID0gYmFfcmVvcmRlcmluZ19tcGR1X2RlcXVldWUoJnBCQUVudHJ5LT5saXN0KTsKKwkJCS8qIHBhc3MgdGhpcyBmcmFtZSB1cCAqLworCQkJQU5OT1VOQ0VfUkVPUkRFUklOR19QQUNLRVQocEFkLCBtcGR1X2Jsayk7CisJCQkvKiBmcmVlIG1wZHVfYmxrICovCisJCQliYV9tcGR1X2Jsa19mcmVlKHBBZCwgbXBkdV9ibGspOworCQl9CisJCWVsc2UKKwkJCXsKKwkJCQlicmVhazsKKwkJCX0KKwl9CisJTmRpc1JlbGVhc2VTcGluTG9jaygmcEJBRW50cnktPlJ4UmVSaW5nTG9jayk7Cit9CisKKworc3RhdGljIHZvaWQgYmFfcmVmcmVzaF9yZW9yZGVyaW5nX21wZHVzKAorCQkJCQkJCQkJICAgSU4gUFJUTVBfQURBUFRFUiAgICBwQWQsCisJCQkJCQkJCQkgICBQQkFfUkVDX0VOVFJZICAgICAgIHBCQUVudHJ5KQoreworCXN0cnVjdCByZW9yZGVyaW5nX21wZHUgKm1wZHVfYmxrOworCisJTmRpc0FjcXVpcmVTcGluTG9jaygmcEJBRW50cnktPlJ4UmVSaW5nTG9jayk7CisKKwkJCS8qIGRlcXVldWUgaW4tb3JkZXIgZnJhbWUgZnJvbSByZW9kZXJpbmcgbGlzdCAqLworCXdoaWxlICgobXBkdV9ibGsgPSBiYV9yZW9yZGVyaW5nX21wZHVfZGVxdWV1ZSgmcEJBRW50cnktPmxpc3QpKSkKKwl7CisJCQkvKiBwYXNzIHRoaXMgZnJhbWUgdXAgKi8KKwkJQU5OT1VOQ0VfUkVPUkRFUklOR19QQUNLRVQocEFkLCBtcGR1X2Jsayk7CisKKwkJcEJBRW50cnktPkxhc3RJbmRTZXEgPSBtcGR1X2Jsay0+U2VxdWVuY2U7CisJCQliYV9tcGR1X2Jsa19mcmVlKHBBZCwgbXBkdV9ibGspOworCisJCS8qIHVwZGF0ZSBsYXN0IGluZGljYXRlZCBzZXF1ZW5jZSAqLworCX0KKwlBU1NFUlQocEJBRW50cnktPmxpc3QucWxlbiA9PSAwKTsKKwlwQkFFbnRyeS0+TGFzdEluZFNlcSA9IFJFU0VUX1JDVl9TRVE7CisJTmRpc1JlbGVhc2VTcGluTG9jaygmcEJBRW50cnktPlJ4UmVSaW5nTG9jayk7Cit9CisKKworLy9zdGF0aWMKK3ZvaWQgYmFfZmx1c2hfcmVvcmRlcmluZ190aW1lb3V0X21wZHVzKAorCQkJCQkJCQkJSU4gUFJUTVBfQURBUFRFUiAgICBwQWQsCisJCQkJCQkJCQlJTiBQQkFfUkVDX0VOVFJZICAgIHBCQUVudHJ5LAorCQkJCQkJCQkJSU4gVUxPTkcgICAgICAgICAgICBOb3czMikKKworeworCVVTSE9SVCBTZXF1ZW5jZTsKKworLy8JaWYgKChSVE1QX1RJTUVfQUZURVIoKHVuc2lnbmVkIGxvbmcpTm93MzIsICh1bnNpZ25lZCBsb25nKShwQkFFbnRyeS0+TGFzdEluZFNlcUF0VGltZXIrUkVPUkRFUklOR19QQUNLRVRfVElNRU9VVCkpICYmCisvLwkJIChwQkFFbnRyeS0+bGlzdC5xbGVuID4gKChwQkFFbnRyeS0+QkFXaW5TaXplKjcpLzgpKSkgLy98fAorLy8JCShSVE1QX1RJTUVfQUZURVIoKHVuc2lnbmVkIGxvbmcpTm93MzIsICh1bnNpZ25lZCBsb25nKShwQkFFbnRyeS0+TGFzdEluZFNlcUF0VGltZXIrKDEwKlJFT1JERVJJTkdfUEFDS0VUX1RJTUVPVVQpKSkgJiYKKy8vCQkgKHBCQUVudHJ5LT5saXN0LnFsZW4gPiAocEJBRW50cnktPkJBV2luU2l6ZS84KSkpCisJaWYgKFJUTVBfVElNRV9BRlRFUigodW5zaWduZWQgbG9uZylOb3czMiwgKHVuc2lnbmVkIGxvbmcpKHBCQUVudHJ5LT5MYXN0SW5kU2VxQXRUaW1lcisoTUFYX1JFT1JERVJJTkdfUEFDS0VUX1RJTUVPVVQvNikpKQorCQkgJiYocEJBRW50cnktPmxpc3QucWxlbiA+IDEpCisJCSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgidGltZW91dFslZF0gKCUwOGx4LSUwOGx4ID0gJWQgPiAlZCk6ICV4LCBmbHVzaCBhbGwhXG4gIiwgcEJBRW50cnktPmxpc3QucWxlbiwgTm93MzIsIChwQkFFbnRyeS0+TGFzdEluZFNlcUF0VGltZXIpLAorCQkJICAgKGludCkoKGxvbmcpIE5vdzMyIC0gKGxvbmcpKHBCQUVudHJ5LT5MYXN0SW5kU2VxQXRUaW1lcikpLCBNQVhfUkVPUkRFUklOR19QQUNLRVRfVElNRU9VVCwKKwkJCSAgIHBCQUVudHJ5LT5MYXN0SW5kU2VxKSk7CisJCWJhX3JlZnJlc2hfcmVvcmRlcmluZ19tcGR1cyhwQWQsIHBCQUVudHJ5KTsKKwkJcEJBRW50cnktPkxhc3RJbmRTZXFBdFRpbWVyID0gTm93MzI7CisJfQorCWVsc2UKKwlpZiAoUlRNUF9USU1FX0FGVEVSKCh1bnNpZ25lZCBsb25nKU5vdzMyLCAodW5zaWduZWQgbG9uZykocEJBRW50cnktPkxhc3RJbmRTZXFBdFRpbWVyKyhSRU9SREVSSU5HX1BBQ0tFVF9USU1FT1VUKSkpCisJCSYmIChwQkFFbnRyeS0+bGlzdC5xbGVuID4gMCkKKwkgICApCisJCXsKKy8vCQlwcmludGsoInRpbWVvdXRbJWRdICglbHgtJWx4ID0gJWQgPiAlZCk6ICV4LCAiLCBwQkFFbnRyeS0+bGlzdC5xbGVuLCBOb3czMiwgKHBCQUVudHJ5LT5MYXN0SW5kU2VxQXRUaW1lciksCisvLwkJCSAgIChpbnQpKChsb25nKSBOb3czMiAtIChsb25nKShwQkFFbnRyeS0+TGFzdEluZFNlcUF0VGltZXIpKSwgUkVPUkRFUklOR19QQUNLRVRfVElNRU9VVCwKKy8vCQkJICAgcEJBRW50cnktPkxhc3RJbmRTZXEpOworICAgIAkJLy8KKwkJLy8gZm9yY2UgTGFzdEluZFNlcSB0byBzaGlmdCB0byBMYXN0SW5kU2VxKzEKKyAgICAJCS8vCisgICAgCQlTZXF1ZW5jZSA9IChwQkFFbnRyeS0+TGFzdEluZFNlcSsxKSAmIE1BWFNFUTsKKyAgICAJCWJhX2luZGljYXRlX3Jlb3JkZXJpbmdfbXBkdXNfbGVfc2VxKHBBZCwgcEJBRW50cnksIFNlcXVlbmNlKTsKKyAgICAJCXBCQUVudHJ5LT5MYXN0SW5kU2VxQXRUaW1lciA9IE5vdzMyOworCQkJcEJBRW50cnktPkxhc3RJbmRTZXEgPSBTZXF1ZW5jZTsKKyAgICAJCS8vCisgICAgCQkvLyBpbmRpY2F0ZSBpbi1vcmRlciBtcGR1cworICAgIAkJLy8KKyAgICAJCVNlcXVlbmNlID0gYmFfaW5kaWNhdGVfcmVvcmRlcmluZ19tcGR1c19pbl9vcmRlcihwQWQsIHBCQUVudHJ5LCBTZXF1ZW5jZSk7CisgICAgCQlpZiAoU2VxdWVuY2UgIT0gUkVTRVRfUkNWX1NFUSkKKyAgICAJCXsKKyAgICAJCQlwQkFFbnRyeS0+TGFzdEluZFNlcSA9IFNlcXVlbmNlOworICAgIAkJfQorCisJCS8vcHJpbnRrKCIleCwgZmx1c2ggb25lIVxuIiwgcEJBRW50cnktPkxhc3RJbmRTZXEpOworCisJfQorI2lmIDAKKwllbHNlIGlmICgKKwkJCSAoUlRNUF9USU1FX0FGVEVSKCh1bnNpZ25lZCBsb25nKU5vdzMyLCAodW5zaWduZWQgbG9uZykocEJBRW50cnktPkxhc3RJbmRTZXFBdFRpbWVyKyhNQVhfUkVPUkRFUklOR19QQUNLRVRfVElNRU9VVCkpKSAmJgorCQkJICAocEJBRW50cnktPmxpc3QucWxlbiA+IDEpKQorCQkJKQorCQl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgidGltZW91dFslZF0gKCVseC0lbHggPSAlZCA+ICVkKTogJXhcbiAiLCBwQkFFbnRyeS0+bGlzdC5xbGVuLCBOb3czMiwgKHBCQUVudHJ5LT5MYXN0SW5kU2VxQXRUaW1lciksCisJCQkgICAoaW50KSgobG9uZykgTm93MzIgLSAobG9uZykocEJBRW50cnktPkxhc3RJbmRTZXFBdFRpbWVyKSksIE1BWF9SRU9SREVSSU5HX1BBQ0tFVF9USU1FT1VULAorCQkJICAgcEJBRW50cnktPkxhc3RJbmRTZXEpKTsKKwkJYmFfcmVmcmVzaF9yZW9yZGVyaW5nX21wZHVzKHBBZCwgcEJBRW50cnkpOworCQkJcEJBRW50cnktPkxhc3RJbmRTZXFBdFRpbWVyID0gTm93MzI7CisJCQkJfQorI2VuZGlmCit9CisKKworLyoKKyAqIGdlbmVyYXRlIEFEREJBIHJlcXVlc3QgdG8KKyAqIHNldCB1cCBCQSBhZ3JlZW1lbnQKKyAqLworVk9JRCBCQU9yaVNlc3Npb25TZXRVcCgKKwkJCQkJICBJTiBQUlRNUF9BREFQVEVSICAgIHBBZCwKKwkJCQkJICBJTiBNQUNfVEFCTEVfRU5UUlkgICpwRW50cnksCisJCQkJCSAgSU4gVUNIQVIgICAgICAgICAgICBUSUQsCisJCQkJCSAgSU4gVVNIT1JUICAgICAgICAgICBUaW1lT3V0LAorCQkJCQkgIElOIFVMT05HICAgICAgICAgICAgRGVsYXlUaW1lLAorCQkJCQkgIElOIEJPT0xFQU4gICAgICAgICAgaXNGb3JjZWQpCisKK3sKKwkvL01MTUVfQUREQkFfUkVRX1NUUlVDVAlBZGRiYVJlcTsKKwlCQV9PUklfRU5UUlkgICAgICAgICAgICAqcEJBRW50cnkgPSBOVUxMOworCVVTSE9SVCAgICAgICAgICAgICAgICAgIElkeDsKKwlCT09MRUFOICAgICAgICAgICAgICAgICBDYW5jZWxsZWQ7CisKKwlpZiAoKHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BdXRvQkEgIT0gVFJVRSkgICYmICAoaXNGb3JjZWQgPT0gRkFMU0UpKQorCQlyZXR1cm47CisKKwkvLyBpZiB0aGlzIGVudHJ5IGlzIGxpbWl0ZWQgdG8gdXNlIGxlZ2FjeSB0eCBtb2RlLCBpdCBkb2Vzbid0IGdlbmVyYXRlIEJBLgorCWlmIChSVE1QU3RhRml4ZWRUeE1vZGUocEFkLCBwRW50cnkpICE9IEZJWEVEX1RYTU9ERV9IVCkKKwkJcmV0dXJuOworCisJaWYgKChwRW50cnktPkJBRGVjbGluZUJpdG1hcCAmICgxPDxUSUQpKSAmJiAoaXNGb3JjZWQgPT0gRkFMU0UpKQorCXsKKwkJLy8gdHJ5IGFnYWluIGFmdGVyIDMgc2VjcworCQlEZWxheVRpbWUgPSAzMDAwOworLy8JCXByaW50aygiRGVDbGluZSBCQSBmcm9tIFBlZXJcbiIpOworLy8JCXJldHVybjsKKwl9CisKKworCUlkeCA9IHBFbnRyeS0+QkFPcmlXY2lkQXJyYXlbVElEXTsKKwlpZiAoSWR4ID09IDApCisJeworCQkvLyBhbGxvY2F0ZSBhIEJBIHNlc3Npb24KKwkJcEJBRW50cnkgPSBCQVRhYmxlQWxsb2NPcmlFbnRyeShwQWQsICZJZHgpOworCQlpZiAocEJBRW50cnkgPT0gTlVMTCkKKwkJeworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJBRERCQSAtIE1sbWVBRERCQUFjdGlvbigpIGFsbG9jYXRlIEJBIHNlc3Npb24gZmFpbGVkIFxuIikpOworCQkJcmV0dXJuOworCQl9CisJfQorCWVsc2UKKwl7CisJCXBCQUVudHJ5ID0mcEFkLT5CQVRhYmxlLkJBT3JpRW50cnlbSWR4XTsKKwl9CisKKwlpZiAocEJBRW50cnktPk9SSV9CQV9TdGF0dXMgPj0gT3JpZ2luYXRvcl9XYWl0UmVzKQorCXsKKwkJcmV0dXJuOworCX0KKworCXBFbnRyeS0+QkFPcmlXY2lkQXJyYXlbVElEXSA9IElkeDsKKworCS8vIEluaXRpYWxpemUgQkEgc2Vzc2lvbgorCXBCQUVudHJ5LT5PUklfQkFfU3RhdHVzID0gT3JpZ2luYXRvcl9XYWl0UmVzOworCXBCQUVudHJ5LT5XY2lkID0gcEVudHJ5LT5BaWQ7CisJcEJBRW50cnktPkJBV2luU2l6ZSA9IHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5SeEJBV2luTGltaXQ7CisJcEJBRW50cnktPlNlcXVlbmNlID0gQkFfT1JJX0lOSVRfU0VROworCXBCQUVudHJ5LT5Ub2tlbiA9IDE7CS8vICgyMDA4LTAxLTIxKSBKYW4gTGVlIHJlY29tbWVuZHMgaXQgLSB0aGlzIHRva2VuIGNhbid0IGJlIDAKKwlwQkFFbnRyeS0+VElEID0gVElEOworCXBCQUVudHJ5LT5UaW1lT3V0VmFsdWUgPSBUaW1lT3V0OworCXBCQUVudHJ5LT5wQWRhcHRlciA9IHBBZDsKKworCWlmICghKHBFbnRyeS0+VFhCQWJpdG1hcCAmICgxPDxUSUQpKSkKKwl7CisJCVJUTVBJbml0VGltZXIocEFkLCAmcEJBRW50cnktPk9SSUJBVGltZXIsIEdFVF9USU1FUl9GVU5DVElPTihCQU9yaVNlc3Npb25TZXR1cFRpbWVvdXQpLCBwQkFFbnRyeSwgRkFMU0UpOworCX0KKwllbHNlCisJCVJUTVBDYW5jZWxUaW1lcigmcEJBRW50cnktPk9SSUJBVGltZXIsICZDYW5jZWxsZWQpOworCisJLy8gc2V0IHRpbWVyIHRvIHNlbmQgQUREQkEgcmVxdWVzdAorCVJUTVBTZXRUaW1lcigmcEJBRW50cnktPk9SSUJBVGltZXIsIERlbGF5VGltZSk7Cit9CisKK1ZPSUQgQkFPcmlTZXNzaW9uQWRkKAorCQkJSU4gUFJUTVBfQURBUFRFUiAgICBwQWQsCisJCQkJCUlOIE1BQ19UQUJMRV9FTlRSWSAgKnBFbnRyeSwKKwkJCUlOIFBGUkFNRV9BRERCQV9SU1AgcEZyYW1lKQoreworCUJBX09SSV9FTlRSWSAgKnBCQUVudHJ5ID0gTlVMTDsKKwlCT09MRUFOICAgICAgIENhbmNlbGxlZDsKKwlVQ0hBUiAgICAgICAgIFRJRDsKKwlVU0hPUlQgICAgICAgIElkeDsKKwlQVUNIQVIgICAgICAgICAgcE91dEJ1ZmZlcjIgPSBOVUxMOworCU5ESVNfU1RBVFVTICAgICBOU3RhdHVzOworCVVMT05HICAgICAgICAgICBGcmFtZUxlbjsKKwlGUkFNRV9CQVIgICAgICAgRnJhbWVCYXI7CisKKwlUSUQgPSBwRnJhbWUtPkJhUGFybS5USUQ7CisJSWR4ID0gcEVudHJ5LT5CQU9yaVdjaWRBcnJheVtUSURdOworCXBCQUVudHJ5ID0mcEFkLT5CQVRhYmxlLkJBT3JpRW50cnlbSWR4XTsKKworCS8vIFN0YXJ0IGZpbGwgaW4gcGFyYW1ldGVycy4KKwlpZiAoKElkeCAhPTApICYmIChwQkFFbnRyeS0+VElEID09IFRJRCkgJiYgKHBCQUVudHJ5LT5PUklfQkFfU3RhdHVzID09IE9yaWdpbmF0b3JfV2FpdFJlcykpCisJeworCQlwQkFFbnRyeS0+QkFXaW5TaXplID0gbWluKHBCQUVudHJ5LT5CQVdpblNpemUsICgoVUNIQVIpcEZyYW1lLT5CYVBhcm0uQnVmU2l6ZSkpOworCQlCQV9NYXhXaW5TaXplUmVhc2lnbihwQWQsIHBFbnRyeSwgJnBCQUVudHJ5LT5CQVdpblNpemUpOworCisJCXBCQUVudHJ5LT5UaW1lT3V0VmFsdWUgPSBwRnJhbWUtPlRpbWVPdXRWYWx1ZTsKKwkJcEJBRW50cnktPk9SSV9CQV9TdGF0dXMgPSBPcmlnaW5hdG9yX0RvbmU7CisJCS8vIHJlc2V0IHNlcXVlbmNlIG51bWJlcgorCQlwQkFFbnRyeS0+U2VxdWVuY2UgPSBCQV9PUklfSU5JVF9TRVE7CisJCS8vIFNldCBCaXRtYXAgZmxhZy4KKwkJcEVudHJ5LT5UWEJBYml0bWFwIHw9ICgxPDxUSUQpOworCQkJCVJUTVBDYW5jZWxUaW1lcigmcEJBRW50cnktPk9SSUJBVGltZXIsICZDYW5jZWxsZWQpOworCisJCXBCQUVudHJ5LT5PUklCQVRpbWVyLlRpbWVyVmFsdWUgPSAwOwkvL3BGcmFtZS0+VGltZU91dFZhbHVlOworCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiJXMgOiBUWEJBYml0bWFwID0gJXgsIEJBV2luU2l6ZSA9ICVkLCBUaW1lT3V0ID0gJWxkXG4iLCBfX2Z1bmNfXywgcEVudHJ5LT5UWEJBYml0bWFwLAorCQkJCQkJCQkgcEJBRW50cnktPkJBV2luU2l6ZSwgcEJBRW50cnktPk9SSUJBVGltZXIuVGltZXJWYWx1ZSkpOworCisJCS8vIFNFTkQgQkFSIDsKKwkJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyMik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5CisJCWlmIChOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJCXsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQkEgLSBCQU9yaVNlc3Npb25BZGQoKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkIFxuIikpOworCQkJcmV0dXJuOworCQl9CisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQkJQmFySGVhZGVySW5pdChwQWQsICZGcmFtZUJhciwgcEFkLT5NYWNUYWIuQ29udGVudFtwQkFFbnRyeS0+V2NpZF0uQWRkciwgcEFkLT5DdXJyZW50QWRkcmVzcyk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwkJRnJhbWVCYXIuU3RhcnRpbmdTZXEuZmllbGQuRnJhZ051bSA9IDA7CS8vIG1ha2Ugc3VyZSBzZXF1ZW5jZSBub3QgY2xlYXIgaW4gREVMIGZ1bmN0aW9uLgorCQlGcmFtZUJhci5TdGFydGluZ1NlcS5maWVsZC5TdGFydFNlcSA9IHBCQUVudHJ5LT5TZXF1ZW5jZTsgLy8gbWFrZSBzdXJlIHNlcXVlbmNlIG5vdCBjbGVhciBpbiBERUwgZnVuY2l0b24uCisJCUZyYW1lQmFyLkJhckNvbnRyb2wuVElEID0gcEJBRW50cnktPlRJRDsgLy8gbWFrZSBzdXJlIHNlcXVlbmNlIG5vdCBjbGVhciBpbiBERUwgZnVuY2l0b24uCisJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIyLCAgICAgICAgICAgICAgJkZyYW1lTGVuLAorCQkJCQkJICBzaXplb2YoRlJBTUVfQkFSKSwgICAgICAmRnJhbWVCYXIsCisJCQkJCSAgRU5EX09GX0FSR1MpOworCQlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIFFJRF9BQ19CRSwgcE91dEJ1ZmZlcjIsIEZyYW1lTGVuKTsKKwkJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyMik7CisKKworCQlpZiAocEJBRW50cnktPk9SSUJBVGltZXIuVGltZXJWYWx1ZSkKKwkJCVJUTVBTZXRUaW1lcigmcEJBRW50cnktPk9SSUJBVGltZXIsIHBCQUVudHJ5LT5PUklCQVRpbWVyLlRpbWVyVmFsdWUpOyAvLyBpbiBtU2VjCisJfQorfQorCitCT09MRUFOIEJBUmVjU2Vzc2lvbkFkZCgKKwkJCQkJICAgSU4gUFJUTVBfQURBUFRFUiAgICBwQWQsCisJCQkJCSAgIElOIE1BQ19UQUJMRV9FTlRSWSAgKnBFbnRyeSwKKwkJCQkJICAgSU4gUEZSQU1FX0FEREJBX1JFUSBwRnJhbWUpCit7CisJQkFfUkVDX0VOVFJZICAgICAgICAgICAgKnBCQUVudHJ5ID0gTlVMTDsKKwlCT09MRUFOICAgICAgICAgICAgICAgICBTdGF0dXMgPSBUUlVFOworCUJPT0xFQU4gICAgICAgICAgICAgICAgIENhbmNlbGxlZDsKKwlVU0hPUlQgICAgICAgICAgICAgICAgICBJZHg7CisJVUNIQVIgICAgICAgICAgICAgICAgICAgVElEOworCVVDSEFSICAgICAgICAgICAgICAgICAgIEJBV2luU2l6ZTsKKwkvL1VJTlQzMiAgICAgICAgICAgICAgICAgIFZhbHVlOworCS8vVUlOVCAgICAgICAgICAgICAgICAgICAgb2Zmc2V0OworCisKKwlBU1NFUlQocEVudHJ5KTsKKworCS8vIGZpbmQgVElECisJVElEID0gcEZyYW1lLT5CYVBhcm0uVElEOworCisJQkFXaW5TaXplID0gbWluKCgoVUNIQVIpcEZyYW1lLT5CYVBhcm0uQnVmU2l6ZSksIChVQ0hBUilwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuUnhCQVdpbkxpbWl0KTsKKworCS8vIEludGVsIHBhdGNoCisJaWYgKEJBV2luU2l6ZSA9PSAwKQorCXsKKwkJQkFXaW5TaXplID0gNjQ7CisJfQorCisJSWR4ID0gcEVudHJ5LT5CQVJlY1djaWRBcnJheVtUSURdOworCisKKwlpZiAoSWR4ID09IDApCisJeworCQlwQkFFbnRyeSA9IEJBVGFibGVBbGxvY1JlY0VudHJ5KHBBZCwgJklkeCk7CisJfQorCWVsc2UKKwl7CisJCXBCQUVudHJ5ID0gJnBBZC0+QkFUYWJsZS5CQVJlY0VudHJ5W0lkeF07CisJCS8vIGZsdXNoIGFsbCBwZW5kaW5nIHJlb3JkZXJpbmcgbXBkdXMKKwkJYmFfcmVmcmVzaF9yZW9yZGVyaW5nX21wZHVzKHBBZCwgcEJBRW50cnkpOworCX0KKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiJXMoJWxkKTogSWR4ID0gJWQsIEJBV2luU2l6ZShyZXEgJWQpID0gJWRcbiIsIF9fZnVuY19fLCBwQWQtPkJBVGFibGUubnVtQXNSZWNpcGllbnQsIElkeCwKKwkJCQkJCQkgcEZyYW1lLT5CYVBhcm0uQnVmU2l6ZSwgQkFXaW5TaXplKSk7CisKKwkvLyBTdGFydCBmaWxsIGluIHBhcmFtZXRlcnMuCisJaWYgKHBCQUVudHJ5ICE9IE5VTEwpCisJeworCQlBU1NFUlQocEJBRW50cnktPmxpc3QucWxlbiA9PSAwKTsKKworCQlwQkFFbnRyeS0+UkVDX0JBX1N0YXR1cyA9IFJlY2lwaWVudF9IYW5kbGVSZXM7CisJCXBCQUVudHJ5LT5CQVdpblNpemUgPSBCQVdpblNpemU7CisJCXBCQUVudHJ5LT5XY2lkID0gcEVudHJ5LT5BaWQ7CisJCXBCQUVudHJ5LT5USUQgPSBUSUQ7CisJCXBCQUVudHJ5LT5UaW1lT3V0VmFsdWUgPSBwRnJhbWUtPlRpbWVPdXRWYWx1ZTsKKwkJcEJBRW50cnktPlJFQ19CQV9TdGF0dXMgPSBSZWNpcGllbnRfQWNjZXB0OworCQkvLyBpbml0aWFsIHNlcXVlbmNlIG51bWJlcgorCQlwQkFFbnRyeS0+TGFzdEluZFNlcSA9IFJFU0VUX1JDVl9TRVE7IC8vcEZyYW1lLT5CYVN0YXJ0U2VxLmZpZWxkLlN0YXJ0U2VxOworCisJCXByaW50aygiU3RhcnQgU2VxID0gJTA4eFxuIiwgIHBGcmFtZS0+QmFTdGFydFNlcS5maWVsZC5TdGFydFNlcSk7CisKKwkJaWYgKHBFbnRyeS0+UlhCQWJpdG1hcCAmICgxPDxUSUQpKQorCQl7CisJCQlSVE1QQ2FuY2VsVGltZXIoJnBCQUVudHJ5LT5SRUNCQVRpbWVyLCAmQ2FuY2VsbGVkKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCVJUTVBJbml0VGltZXIocEFkLCAmcEJBRW50cnktPlJFQ0JBVGltZXIsIEdFVF9USU1FUl9GVU5DVElPTihCQVJlY1Nlc3Npb25JZGxlVGltZW91dCksIHBCQUVudHJ5LCBUUlVFKTsKKwkJfQorCisjaWYgMAkvLyBmb3IgZGVidWdnaW5nCisJCVJUTVBTZXRUaW1lcigmcEJBRW50cnktPlJFQ0JBVGltZXIsIFJFQ19CQV9TRVNTSU9OX0lETEVfVElNRU9VVCk7CisjZW5kaWYKKworCQkvLyBTZXQgQml0bWFwIGZsYWcuCisJCXBFbnRyeS0+UlhCQWJpdG1hcCB8PSAoMTw8VElEKTsKKwkJcEVudHJ5LT5CQVJlY1djaWRBcnJheVtUSURdID0gSWR4OworCisJCXBFbnRyeS0+QkFEZWNsaW5lQml0bWFwICY9IH4oMTw8VElEKTsKKworCQkvLyBTZXQgQkEgc2Vzc2lvbiBtYXNrIGluIFdDSUQgdGFibGUuCisJCVJUMjhYWF9BRERfQkFfU0VTU0lPTl9UT19BU0lDKHBBZCwgcEVudHJ5LT5BaWQsIFRJRCk7CisKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJNQUNFbnRyeVslZF1SWEJBYml0bWFwID0gMHgleC4gQkFSZWNXY2lkQXJyYXk9JWRcbiIsCisJCQkJcEVudHJ5LT5BaWQsIHBFbnRyeS0+UlhCQWJpdG1hcCwgcEVudHJ5LT5CQVJlY1djaWRBcnJheVtUSURdKSk7CisJfQorCWVsc2UKKwl7CisJCVN0YXR1cyA9IEZBTFNFOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkNhbid0IEFjY2VwdCBBRERCQSBmb3IgJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnggVElEID0gJWRcbiIsCisJCQkJUFJJTlRfTUFDKHBFbnRyeS0+QWRkciksIFRJRCkpOworCX0KKwlyZXR1cm4oU3RhdHVzKTsKK30KKworCitCQV9SRUNfRU5UUlkgKkJBVGFibGVBbGxvY1JlY0VudHJ5KAorCQkJCQkJCQkgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCQkJCQkJCQkgIE9VVCBVU0hPUlQgICAgICAgICAgKklkeCkKK3sKKwlpbnQgICAgICAgICAgICAgaTsKKwlCQV9SRUNfRU5UUlkgICAgKnBCQUVudHJ5ID0gTlVMTDsKKworCisJTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5CQVRhYkxvY2spOworCisJaWYgKHBBZC0+QkFUYWJsZS5udW1Bc1JlY2lwaWVudCA+PSBNQVhfQkFSRUNJX1NFU1NJT04pCisJeworCQlwcmludGsoIkJBIFJlY2lwZWludCBTZXNzaW9uICglbGQpID4gJWRcbiIsIHBBZC0+QkFUYWJsZS5udW1Bc1JlY2lwaWVudCwKKwkJCU1BWF9CQVJFQ0lfU0VTU0lPTik7CisJCWdvdG8gZG9uZTsKKwl9CisKKwkvLyByZXNlcnZlIGlkeCAwIHRvIGlkZW50aWZ5IEJBV2NpZEFycmF5W1RJRF0gYXMgZW1wdHkKKwlmb3IgKGk9MTsgaSA8IE1BWF9MRU5fT0ZfQkFfUkVDX1RBQkxFOyBpKyspCisJeworCQlwQkFFbnRyeSA9JnBBZC0+QkFUYWJsZS5CQVJlY0VudHJ5W2ldOworCQlpZiAoKHBCQUVudHJ5LT5SRUNfQkFfU3RhdHVzID09IFJlY2lwaWVudF9OT05FKSkKKwkJeworCQkJLy8gZ2V0IG9uZQorCQkJcEFkLT5CQVRhYmxlLm51bUFzUmVjaXBpZW50Kys7CisJCQlwQkFFbnRyeS0+UkVDX0JBX1N0YXR1cyA9IFJlY2lwaWVudF9VU0VEOworCQkJKklkeCA9IGk7CisJCQlicmVhazsKKwkJfQorCX0KKworZG9uZToKKwlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPkJBVGFiTG9jayk7CisJcmV0dXJuIHBCQUVudHJ5OworfQorCitCQV9PUklfRU5UUlkgKkJBVGFibGVBbGxvY09yaUVudHJ5KAorCQkJCQkJCQkgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCQkJCQkJCQkgIE9VVCBVU0hPUlQgICAgICAgICAgKklkeCkKK3sKKwlpbnQgICAgICAgICAgICAgaTsKKwlCQV9PUklfRU5UUlkgICAgKnBCQUVudHJ5ID0gTlVMTDsKKworCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+QkFUYWJMb2NrKTsKKworCWlmIChwQWQtPkJBVGFibGUubnVtQXNPcmlnaW5hdG9yID49IChNQVhfTEVOX09GX0JBX09SSV9UQUJMRSkpCisJeworCQlnb3RvIGRvbmU7CisJfQorCisJLy8gcmVzZXJ2ZSBpZHggMCB0byBpZGVudGlmeSBCQVdjaWRBcnJheVtUSURdIGFzIGVtcHR5CisJZm9yIChpPTE7IGk8TUFYX0xFTl9PRl9CQV9PUklfVEFCTEU7IGkrKykKKwl7CisJCXBCQUVudHJ5ID0mcEFkLT5CQVRhYmxlLkJBT3JpRW50cnlbaV07CisJCWlmICgocEJBRW50cnktPk9SSV9CQV9TdGF0dXMgPT0gT3JpZ2luYXRvcl9OT05FKSkKKwkJeworCQkJLy8gZ2V0IG9uZQorCQkJcEFkLT5CQVRhYmxlLm51bUFzT3JpZ2luYXRvcisrOworCQkJcEJBRW50cnktPk9SSV9CQV9TdGF0dXMgPSBPcmlnaW5hdG9yX1VTRUQ7CisJCQlwQkFFbnRyeS0+cEFkYXB0ZXIgPSBwQWQ7CisJCQkqSWR4ID0gaTsKKwkJCWJyZWFrOworCQl9CisJfQorCitkb25lOgorCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+QkFUYWJMb2NrKTsKKwlyZXR1cm4gcEJBRW50cnk7Cit9CisKKworVk9JRCBCQVRhYmxlRnJlZU9yaUVudHJ5KAorCQkJCQkJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJCQkJCQlJTiAgVUxPTkcgICAgICAgICAgIElkeCkKK3sKKwlCQV9PUklfRU5UUlkgICAgKnBCQUVudHJ5ID0gTlVMTDsKKwlNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeTsKKworCisJaWYgKChJZHggPT0gMCkgfHwgKElkeCA+PSBNQVhfTEVOX09GX0JBX09SSV9UQUJMRSkpCisJCXJldHVybjsKKworCXBCQUVudHJ5ID0mcEFkLT5CQVRhYmxlLkJBT3JpRW50cnlbSWR4XTsKKworCWlmIChwQkFFbnRyeS0+T1JJX0JBX1N0YXR1cyAhPSBPcmlnaW5hdG9yX05PTkUpCisJeworCQlwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtwQkFFbnRyeS0+V2NpZF07CisJCXBFbnRyeS0+QkFPcmlXY2lkQXJyYXlbcEJBRW50cnktPlRJRF0gPSAwOworCisKKwkJTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5CQVRhYkxvY2spOworCQlpZiAocEJBRW50cnktPk9SSV9CQV9TdGF0dXMgPT0gT3JpZ2luYXRvcl9Eb25lKQorCQl7CisJCSAJcEVudHJ5LT5UWEJBYml0bWFwICY9ICh+KDE8PChwQkFFbnRyeS0+VElEKSApKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkJBVGFibGVGcmVlT3JpRW50cnkgbnVtQXNPcmlnaW5hdG9yPSAlbGRcbiIsIHBBZC0+QkFUYWJsZS5udW1Bc1JlY2lwaWVudCkpOworCQkJLy8gRXJhc2UgQml0bWFwIGZsYWcuCisJCX0KKworCQlBU1NFUlQocEFkLT5CQVRhYmxlLm51bUFzT3JpZ2luYXRvciAhPSAwKTsKKworCQlwQWQtPkJBVGFibGUubnVtQXNPcmlnaW5hdG9yIC09IDE7CisKKwkJcEJBRW50cnktPk9SSV9CQV9TdGF0dXMgPSBPcmlnaW5hdG9yX05PTkU7CisJCXBCQUVudHJ5LT5Ub2tlbiA9IDA7CisJCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+QkFUYWJMb2NrKTsKKwl9Cit9CisKKworVk9JRCBCQVRhYmxlRnJlZVJlY0VudHJ5KAorCQkJCQkJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJCQkJCQlJTiAgVUxPTkcgICAgICAgICAgIElkeCkKK3sKKwlCQV9SRUNfRU5UUlkgICAgKnBCQUVudHJ5ID0gTlVMTDsKKwlNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeTsKKworCisJaWYgKChJZHggPT0gMCkgfHwgKElkeCA+PSBNQVhfTEVOX09GX0JBX1JFQ19UQUJMRSkpCisJCXJldHVybjsKKworCXBCQUVudHJ5ID0mcEFkLT5CQVRhYmxlLkJBUmVjRW50cnlbSWR4XTsKKworCWlmIChwQkFFbnRyeS0+UkVDX0JBX1N0YXR1cyAhPSBSZWNpcGllbnRfTk9ORSkKKwl7CisJCXBFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W3BCQUVudHJ5LT5XY2lkXTsKKwkJcEVudHJ5LT5CQVJlY1djaWRBcnJheVtwQkFFbnRyeS0+VElEXSA9IDA7CisKKwkJTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5CQVRhYkxvY2spOworCisJCUFTU0VSVChwQWQtPkJBVGFibGUubnVtQXNSZWNpcGllbnQgIT0gMCk7CisKKwkJcEFkLT5CQVRhYmxlLm51bUFzUmVjaXBpZW50IC09IDE7CisKKwkJcEJBRW50cnktPlJFQ19CQV9TdGF0dXMgPSBSZWNpcGllbnRfTk9ORTsKKwkJTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5CQVRhYkxvY2spOworCX0KK30KKworCitWT0lEIEJBT3JpU2Vzc2lvblRlYXJEb3duKAorCQkJCQkJIElOIE9VVCAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwkJCQkJCSBJTiAgICAgIFVDSEFSICAgICAgICAgICBXY2lkLAorCQkJCQkJIElOICAgICAgVUNIQVIgICAgICAgICAgIFRJRCwKKwkJCQkJCSBJTiAgICAgIEJPT0xFQU4gICAgICAgICBiUGFzc2l2ZSwKKwkJCQkJCSBJTiAgICAgIEJPT0xFQU4gICAgICAgICBiRm9yY2VTZW5kKQoreworCVVMT05HICAgICAgICAgICBJZHggPSAwOworCUJBX09SSV9FTlRSWSAgICAqcEJBRW50cnk7CisJQk9PTEVBTiAgICAgICAgIENhbmNlbGxlZDsKKworCWlmIChXY2lkID49IE1BWF9MRU5fT0ZfTUFDX1RBQkxFKQorCXsKKwkJcmV0dXJuOworCX0KKworCS8vCisJLy8gTG9jYXRlIGNvcnJlc3BvbmRpbmcgQkEgT3JpZ2luYXRvciBFbnRyeSBpbiBCQSBUYWJsZSB3aXRoIHRoZSAocEFkZHIsVElEKS4KKwkvLworCUlkeCA9IHBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0uQkFPcmlXY2lkQXJyYXlbVElEXTsKKwlpZiAoKElkeCA9PSAwKSB8fCAoSWR4ID49IE1BWF9MRU5fT0ZfQkFfT1JJX1RBQkxFKSkKKwl7CisJCWlmIChiRm9yY2VTZW5kID09IFRSVUUpCisJCXsKKwkJCS8vIGZvcmNlIHNlbmQgc3BlY2lmaWVkIFRJRCBEZWxCQQorCQkJTUxNRV9ERUxCQV9SRVFfU1RSVUNUICAgRGVsYmFSZXE7CisJCQlNTE1FX1FVRVVFX0VMRU0gKkVsZW0gPSAoTUxNRV9RVUVVRV9FTEVNICopIGttYWxsb2Moc2l6ZW9mKE1MTUVfUVVFVUVfRUxFTSksIE1FTV9BTExPQ19GTEFHKTsKKworCQkJTmRpc1plcm9NZW1vcnkoJkRlbGJhUmVxLCBzaXplb2YoRGVsYmFSZXEpKTsKKwkJCU5kaXNaZXJvTWVtb3J5KEVsZW0sIHNpemVvZihNTE1FX1FVRVVFX0VMRU0pKTsKKworCQkJQ09QWV9NQUNfQUREUihEZWxiYVJlcS5BZGRyLCBwQWQtPk1hY1RhYi5Db250ZW50W1djaWRdLkFkZHIpOworCQkJRGVsYmFSZXEuV2NpZCA9IFdjaWQ7CisJCQlEZWxiYVJlcS5USUQgPSBUSUQ7CisJCQlEZWxiYVJlcS5Jbml0aWF0b3IgPSBPUklHSU5BVE9SOworI2lmIDEKKwkJCUVsZW0tPk1zZ0xlbiAgPSBzaXplb2YoRGVsYmFSZXEpOworCQkJTmRpc01vdmVNZW1vcnkoRWxlbS0+TXNnLCAmRGVsYmFSZXEsIHNpemVvZihEZWxiYVJlcSkpOworCQkJTWxtZURFTEJBQWN0aW9uKHBBZCwgRWxlbSk7CisJCQlrZnJlZShFbGVtKTsKKyNlbHNlCisJCQlNbG1lRW5xdWV1ZShwQWQsIEFDVElPTl9TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9PUklfREVMQkFfQ0FURSwgc2l6ZW9mKE1MTUVfREVMQkFfUkVRX1NUUlVDVCksIChQVk9JRCkmRGVsYmFSZXEpOworCQkJUlQyOFhYX01MTUVfSEFORExFUihwQWQpOworI2VuZGlmCisJCX0KKworCQlyZXR1cm47CisJfQorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCIlcz09PT5XY2lkPSVkLlRJRD0lZCBcbiIsIF9fZnVuY19fLCBXY2lkLCBUSUQpKTsKKworCXBCQUVudHJ5ID0gJnBBZC0+QkFUYWJsZS5CQU9yaUVudHJ5W0lkeF07CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJcdD09PT5JZHggPSAlbGQsIFdjaWQ9JWQuVElEPSVkLCBPUklfQkFfU3RhdHVzID0gJWQgXG4iLCBJZHgsIFdjaWQsIFRJRCwgcEJBRW50cnktPk9SSV9CQV9TdGF0dXMpKTsKKwkvLworCS8vIFByZXBhcmUgRGVsQkEgYWN0aW9uIGZyYW1lIGFuZCBzZW5kIHRvIHRoZSBwZWVyLgorCS8vCisJaWYgKChiUGFzc2l2ZSA9PSBGQUxTRSkgJiYgKFRJRCA9PSBwQkFFbnRyeS0+VElEKSAmJiAocEJBRW50cnktPk9SSV9CQV9TdGF0dXMgPT0gT3JpZ2luYXRvcl9Eb25lKSkKKwl7CisJCU1MTUVfREVMQkFfUkVRX1NUUlVDVCAgIERlbGJhUmVxOworCQlNTE1FX1FVRVVFX0VMRU0gKkVsZW0gPSAoTUxNRV9RVUVVRV9FTEVNICopIGttYWxsb2Moc2l6ZW9mKE1MTUVfUVVFVUVfRUxFTSksIE1FTV9BTExPQ19GTEFHKTsKKworCQlOZGlzWmVyb01lbW9yeSgmRGVsYmFSZXEsIHNpemVvZihEZWxiYVJlcSkpOworCQlOZGlzWmVyb01lbW9yeShFbGVtLCBzaXplb2YoTUxNRV9RVUVVRV9FTEVNKSk7CisKKwkJQ09QWV9NQUNfQUREUihEZWxiYVJlcS5BZGRyLCBwQWQtPk1hY1RhYi5Db250ZW50W1djaWRdLkFkZHIpOworCQlEZWxiYVJlcS5XY2lkID0gV2NpZDsKKwkJRGVsYmFSZXEuVElEID0gcEJBRW50cnktPlRJRDsKKwkJRGVsYmFSZXEuSW5pdGlhdG9yID0gT1JJR0lOQVRPUjsKKyNpZiAxCisJCUVsZW0tPk1zZ0xlbiAgPSBzaXplb2YoRGVsYmFSZXEpOworCQlOZGlzTW92ZU1lbW9yeShFbGVtLT5Nc2csICZEZWxiYVJlcSwgc2l6ZW9mKERlbGJhUmVxKSk7CisJCU1sbWVERUxCQUFjdGlvbihwQWQsIEVsZW0pOworCQlrZnJlZShFbGVtKTsKKyNlbHNlCisJCU1sbWVFbnF1ZXVlKHBBZCwgQUNUSU9OX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX09SSV9ERUxCQV9DQVRFLCBzaXplb2YoTUxNRV9ERUxCQV9SRVFfU1RSVUNUKSwgKFBWT0lEKSZEZWxiYVJlcSk7CisJCVJUMjhYWF9NTE1FX0hBTkRMRVIocEFkKTsKKyNlbmRpZgorCX0KKwlSVE1QQ2FuY2VsVGltZXIoJnBCQUVudHJ5LT5PUklCQVRpbWVyLCAmQ2FuY2VsbGVkKTsKKwlCQVRhYmxlRnJlZU9yaUVudHJ5KHBBZCwgSWR4KTsKKworCWlmIChiUGFzc2l2ZSkKKwl7CisJCS8vQkFPcmlTZXNzaW9uU2V0VXAocEFkLCAmcEFkLT5NYWNUYWIuQ29udGVudFtXY2lkXSwgVElELCAwLCAxMDAwMCwgVFJVRSk7CisJfQorfQorCitWT0lEIEJBUmVjU2Vzc2lvblRlYXJEb3duKAorCQkJCQkJIElOIE9VVCAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwkJCQkJCSBJTiAgICAgIFVDSEFSICAgICAgICAgICBXY2lkLAorCQkJCQkJIElOICAgICAgVUNIQVIgICAgICAgICAgIFRJRCwKKwkJCQkJCSBJTiAgICAgIEJPT0xFQU4gICAgICAgICBiUGFzc2l2ZSkKK3sKKwlVTE9ORyAgICAgICAgICAgSWR4ID0gMDsKKwlCQV9SRUNfRU5UUlkgICAgKnBCQUVudHJ5OworCisJaWYgKFdjaWQgPj0gTUFYX0xFTl9PRl9NQUNfVEFCTEUpCisJeworCQlyZXR1cm47CisJfQorCisJLy8KKwkvLyAgTG9jYXRlIGNvcnJlc3BvbmRpbmcgQkEgT3JpZ2luYXRvciBFbnRyeSBpbiBCQSBUYWJsZSB3aXRoIHRoZSAocEFkZHIsVElEKS4KKwkvLworCUlkeCA9IHBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0uQkFSZWNXY2lkQXJyYXlbVElEXTsKKwlpZiAoSWR4ID09IDApCisJCXJldHVybjsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiJXM9PT0+V2NpZD0lZC5USUQ9JWQgXG4iLCBfX2Z1bmNfXywgV2NpZCwgVElEKSk7CisKKworCXBCQUVudHJ5ID0gJnBBZC0+QkFUYWJsZS5CQVJlY0VudHJ5W0lkeF07CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJcdD09PT5JZHggPSAlbGQsIFdjaWQ9JWQuVElEPSVkLCBSRUNfQkFfU3RhdHVzID0gJWQgXG4iLCBJZHgsIFdjaWQsIFRJRCwgcEJBRW50cnktPlJFQ19CQV9TdGF0dXMpKTsKKwkvLworCS8vIFByZXBhcmUgRGVsQkEgYWN0aW9uIGZyYW1lIGFuZCBzZW5kIHRvIHRoZSBwZWVyLgorCS8vCisJaWYgKChUSUQgPT0gcEJBRW50cnktPlRJRCkgJiYgKHBCQUVudHJ5LT5SRUNfQkFfU3RhdHVzID09IFJlY2lwaWVudF9BY2NlcHQpKQorCXsKKwkJTUxNRV9ERUxCQV9SRVFfU1RSVUNUICAgRGVsYmFSZXE7CisJCUJPT0xFQU4gCQkJCUNhbmNlbGxlZDsKKwkJTUxNRV9RVUVVRV9FTEVNICpFbGVtID0gKE1MTUVfUVVFVUVfRUxFTSAqKSBrbWFsbG9jKHNpemVvZihNTE1FX1FVRVVFX0VMRU0pLCBNRU1fQUxMT0NfRkxBRyk7CisJCS8vVUxPTkcgICBvZmZzZXQ7CisJCS8vVUlOVDMyICBWQUxVRTsKKworCQlSVE1QQ2FuY2VsVGltZXIoJnBCQUVudHJ5LT5SRUNCQVRpbWVyLCAmQ2FuY2VsbGVkKTsKKworCQkvLworCQkvLyAxLiBTZW5kIERFTEJBIEFjdGlvbiBGcmFtZQorCQkvLworCQlpZiAoYlBhc3NpdmUgPT0gRkFMU0UpCisJCXsKKwkJCU5kaXNaZXJvTWVtb3J5KCZEZWxiYVJlcSwgc2l6ZW9mKERlbGJhUmVxKSk7CisJCQlOZGlzWmVyb01lbW9yeShFbGVtLCBzaXplb2YoTUxNRV9RVUVVRV9FTEVNKSk7CisKKwkJCUNPUFlfTUFDX0FERFIoRGVsYmFSZXEuQWRkciwgcEFkLT5NYWNUYWIuQ29udGVudFtXY2lkXS5BZGRyKTsKKwkJCURlbGJhUmVxLldjaWQgPSBXY2lkOworCQkJRGVsYmFSZXEuVElEID0gVElEOworCQkJRGVsYmFSZXEuSW5pdGlhdG9yID0gUkVDSVBJRU5UOworI2lmIDEKKwkJCUVsZW0tPk1zZ0xlbiAgPSBzaXplb2YoRGVsYmFSZXEpOworCQkJTmRpc01vdmVNZW1vcnkoRWxlbS0+TXNnLCAmRGVsYmFSZXEsIHNpemVvZihEZWxiYVJlcSkpOworCQkJTWxtZURFTEJBQWN0aW9uKHBBZCwgRWxlbSk7CisJCQlrZnJlZShFbGVtKTsKKyNlbHNlCisJCQlNbG1lRW5xdWV1ZShwQWQsIEFDVElPTl9TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9PUklfREVMQkFfQ0FURSwgc2l6ZW9mKE1MTUVfREVMQkFfUkVRX1NUUlVDVCksIChQVk9JRCkmRGVsYmFSZXEpOworCQkJUlQyOFhYX01MTUVfSEFORExFUihwQWQpOworI2VuZGlmCisJCX0KKworCisJCS8vCisJCS8vIDIuIEZyZWUgcmVzb3VyY2Ugb2YgQkEgc2Vzc2lvbgorCQkvLworCQkvLyBmbHVzaCBhbGwgcGVuZGluZyByZW9yZGVyaW5nIG1wZHVzCisJCWJhX3JlZnJlc2hfcmVvcmRlcmluZ19tcGR1cyhwQWQsIHBCQUVudHJ5KTsKKworCQlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPkJBVGFiTG9jayk7CisKKwkJLy8gRXJhc2UgQml0bWFwIGZsYWcuCisJCXBCQUVudHJ5LT5MYXN0SW5kU2VxID0gUkVTRVRfUkNWX1NFUTsKKwkJcEJBRW50cnktPkJBV2luU2l6ZSA9IDA7CisJCS8vIEVyYXNlIEJpdG1hcCBmbGFnIGF0IHNvZnR3YXJlIG1hY3RhYmxlCisJCXBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0uUlhCQWJpdG1hcCAmPSAofigxPDwocEJBRW50cnktPlRJRCkpKTsKKwkJcEFkLT5NYWNUYWIuQ29udGVudFtXY2lkXS5CQVJlY1djaWRBcnJheVtUSURdID0gMDsKKworCQlSVDI4WFhfREVMX0JBX1NFU1NJT05fRlJPTV9BU0lDKHBBZCwgV2NpZCwgVElEKTsKKworCQlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPkJBVGFiTG9jayk7CisKKwl9CisKKwlCQVRhYmxlRnJlZVJlY0VudHJ5KHBBZCwgSWR4KTsKK30KKworVk9JRCBCQVNlc3Npb25UZWFyRG93bkFMTCgKKwkJCQkJCSBJTiBPVVQgIFBSVE1QX0FEQVBURVIgcEFkLAorCQkJCQkJIElOICAgICAgVUNIQVIgV2NpZCkKK3sKKwlpbnQgaTsKKworCWZvciAoaT0wOyBpPE5VTV9PRl9USUQ7IGkrKykKKwl7CisJCUJBT3JpU2Vzc2lvblRlYXJEb3duKHBBZCwgV2NpZCwgaSwgRkFMU0UsIEZBTFNFKTsKKwkJQkFSZWNTZXNzaW9uVGVhckRvd24ocEFkLCBXY2lkLCBpLCBGQUxTRSk7CisJfQorfQorCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJUmV0cnkgc2VuZGluZyBBRERCQSBSZXFlc3QuCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCVBhcmFtZXRyczoKKwlwODAyM0hlYWRlcjogaWYgdGhpcyBpcyBhbHJlYWR5IDgwMi4zIGZvcm1hdCwgcDgwMjNIZWFkZXIgaXMgTlVMTAorCisJUmV0dXJuCTogVFJVRSBpZiBwdXQgaW50byByeCByZW9yZGVyaW5nIGJ1ZmZlciwgc2hvdWxkbid0IGluZGljYXRlcnhoZXJlLgorCQkJCUZBTFNFICwgdGhlbiBjb250aW51ZSBpbmRpY2F0ZXJ4IGF0IHRoaXMgbW9tZW50LgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgQkFPcmlTZXNzaW9uU2V0dXBUaW1lb3V0KAorICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKKyAgICBJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCisgICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAorICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMykKK3sKKwlCQV9PUklfRU5UUlkgICAgKnBCQUVudHJ5ID0gKEJBX09SSV9FTlRSWSAqKUZ1bmN0aW9uQ29udGV4dDsKKwlNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeTsKKwlQUlRNUF9BREFQVEVSICAgcEFkOworCisJaWYgKHBCQUVudHJ5ID09IE5VTEwpCisJCXJldHVybjsKKworCXBBZCA9IHBCQUVudHJ5LT5wQWRhcHRlcjsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJeworCQkvLyBEbyBub3RoaW5nIGlmIG1vbml0b3IgbW9kZSBpcyBvbgorCQlpZiAoTU9OSVRPUl9PTihwQWQpKQorCQkJcmV0dXJuOworCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworI2lmZGVmIFJBTElOS19BVEUKKwkvLyBOb3RoaW5nIHRvIGRvIGluIEFURSBtb2RlLgorCWlmIChBVEVfT04ocEFkKSkKKwkJcmV0dXJuOworI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKworCXBFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W3BCQUVudHJ5LT5XY2lkXTsKKworCWlmICgocEJBRW50cnktPk9SSV9CQV9TdGF0dXMgPT0gT3JpZ2luYXRvcl9XYWl0UmVzKSAmJiAocEJBRW50cnktPlRva2VuIDwgT1JJX1NFU1NJT05fTUFYX1JFVFJZKSkKKwl7CisJCU1MTUVfQUREQkFfUkVRX1NUUlVDVCAgICBBZGRiYVJlcTsKKworCQlOZGlzWmVyb01lbW9yeSgmQWRkYmFSZXEsIHNpemVvZihBZGRiYVJlcSkpOworCQlDT1BZX01BQ19BRERSKEFkZGJhUmVxLnBBZGRyLCBwRW50cnktPkFkZHIpOworCQlBZGRiYVJlcS5XY2lkID0gKFVDSEFSKShwRW50cnktPkFpZCk7CisJCUFkZGJhUmVxLlRJRCA9IHBCQUVudHJ5LT5USUQ7CisJCUFkZGJhUmVxLkJhQnVmU2l6ZSA9IHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5SeEJBV2luTGltaXQ7CisJCUFkZGJhUmVxLlRpbWVPdXRWYWx1ZSA9IDA7CisJCUFkZGJhUmVxLlRva2VuID0gcEJBRW50cnktPlRva2VuOworCQlNbG1lRW5xdWV1ZShwQWQsIEFDVElPTl9TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9BRERfQkFfQ0FURSwgc2l6ZW9mKE1MTUVfQUREQkFfUkVRX1NUUlVDVCksIChQVk9JRCkmQWRkYmFSZXEpOworCQlSVDI4WFhfTUxNRV9IQU5ETEVSKHBBZCk7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQkEgT3JpIFNlc3Npb24gVGltZW91dCglZCkgOiBTZW5kIEFERCBCQSBhZ2FpblxuIiwgcEJBRW50cnktPlRva2VuKSk7CisKKwkJcEJBRW50cnktPlRva2VuKys7CisJCVJUTVBTZXRUaW1lcigmcEJBRW50cnktPk9SSUJBVGltZXIsIE9SSV9CQV9TRVNTSU9OX1RJTUVPVVQpOworCX0KKwllbHNlCisJeworCQlCQVRhYmxlRnJlZU9yaUVudHJ5KHBBZCwgcEVudHJ5LT5CQU9yaVdjaWRBcnJheVtwQkFFbnRyeS0+VElEXSk7CisJfQorfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVJldHJ5IHNlbmRpbmcgQUREQkEgUmVxZXN0LgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwlQYXJhbWV0cnM6CisJcDgwMjNIZWFkZXI6IGlmIHRoaXMgaXMgYWxyZWFkeSA4MDIuMyBmb3JtYXQsIHA4MDIzSGVhZGVyIGlzIE5VTEwKKworCVJldHVybgk6IFRSVUUgaWYgcHV0IGludG8gcnggcmVvcmRlcmluZyBidWZmZXIsIHNob3VsZG4ndCBpbmRpY2F0ZXJ4aGVyZS4KKwkJCQlGQUxTRSAsIHRoZW4gY29udGludWUgaW5kaWNhdGVyeCBhdCB0aGlzIG1vbWVudC4KKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIEJBUmVjU2Vzc2lvbklkbGVUaW1lb3V0KAorICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKKyAgICBJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCisgICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAorICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMykKK3sKKworCUJBX1JFQ19FTlRSWSAgICAqcEJBRW50cnkgPSAoQkFfUkVDX0VOVFJZICopRnVuY3Rpb25Db250ZXh0OworCVBSVE1QX0FEQVBURVIgICBwQWQ7CisJVUxPTkcgICAgICAgICAgIE5vdzMyOworCisJaWYgKHBCQUVudHJ5ID09IE5VTEwpCisJCXJldHVybjsKKworCWlmICgocEJBRW50cnktPlJFQ19CQV9TdGF0dXMgPT0gUmVjaXBpZW50X0FjY2VwdCkpCisJeworCQlOZGlzR2V0U3lzdGVtVXBUaW1lKCZOb3czMik7CisKKwkJaWYgKFJUTVBfVElNRV9BRlRFUigodW5zaWduZWQgbG9uZylOb3czMiwgKHVuc2lnbmVkIGxvbmcpKHBCQUVudHJ5LT5MYXN0SW5kU2VxQXRUaW1lciArIFJFQ19CQV9TRVNTSU9OX0lETEVfVElNRU9VVCkpKQorCQl7CisJCQlwQWQgPSBwQkFFbnRyeS0+cEFkYXB0ZXI7CisJCQkvLyBmbHVzaCBhbGwgcGVuZGluZyByZW9yZGVyaW5nIG1wZHVzCisJCQliYV9yZWZyZXNoX3Jlb3JkZXJpbmdfbXBkdXMocEFkLCBwQkFFbnRyeSk7CisJCQlwcmludGsoIiVsZDogUkVDIEJBIHNlc3Npb24gVGltZW91dFxuIiwgTm93MzIpOworCQl9CisJfQorfQorCisKK1ZPSUQgUGVlckFkZEJBUmVxQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKKworeworCS8vCTcuNC40LjEKKwkvL1VMT05HCUlkeDsKKwlVQ0hBUiAgIFN0YXR1cyA9IDE7CisJVUNIQVIgICBwQWRkcls2XTsKKwlGUkFNRV9BRERCQV9SU1AgQUREZnJhbWU7CisJUFVDSEFSICAgICAgICAgcE91dEJ1ZmZlciA9IE5VTEw7CisJTkRJU19TVEFUVVMgICAgIE5TdGF0dXM7CisJUEZSQU1FX0FEREJBX1JFUSAgcEFkZHJlcUZyYW1lID0gTlVMTDsKKwkvL1VDSEFSCQlCdWZTaXplOworCVVMT05HICAgICAgIEZyYW1lTGVuOworCVBVTE9ORyAgICAgIHB0ZW1wOworCVBNQUNfVEFCTEVfRU5UUlkJcE1hY0VudHJ5OworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXMgPT0+IChXY2lkID0gJWQpXG4iLCBfX2Z1bmNfXywgRWxlbS0+V2NpZCkpOworCisJLy9oZXhfZHVtcCgiQWRkQkFSZXEiLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbik7CisKKwkvL0FEREJBIFJlcXVlc3QgZnJvbSB1bmtub3duIHBlZXIsIGlnbm9yZSB0aGlzLgorCWlmIChFbGVtLT5XY2lkID49IE1BWF9MRU5fT0ZfTUFDX1RBQkxFKQorCQlyZXR1cm47CisKKwlwTWFjRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtFbGVtLT5XY2lkXTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkJBIC0gUGVlckFkZEJBUmVxQWN0aW9uLS0tLT4gXG4iKSk7CisJcHRlbXAgPSAoUFVMT05HKUVsZW0tPk1zZzsKKwkvL0RCR1BSSU5UX1JBVyhSVF9ERUJVR19FTVUsICgiJTA4eDo6ICUwOHg6OiAlMDh4OjogJTA4eDo6ICUwOHg6OiAlMDh4OjogJTA4eDo6ICUwOHg6OiAlMDh4XG4iLCAqKHB0ZW1wKSwgKihwdGVtcCsxKSwgKihwdGVtcCsyKSwgKihwdGVtcCszKSwgKihwdGVtcCs0KSwgKihwdGVtcCs1KSwgKihwdGVtcCs2KSwgKihwdGVtcCs3KSwgKihwdGVtcCs4KSkpOworCisJaWYgKFBlZXJBZGRCQVJlcUFjdGlvblNhbml0eShwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuLCBwQWRkcikpCisJeworCisJCWlmICgocEFkLT5Db21tb25DZmcuYkJBRGVjbGluZSA9PSBGQUxTRSkgJiYgSVNfSFRfU1RBKHBNYWNFbnRyeSkpCisJCXsKKwkJCXBBZGRyZXFGcmFtZSA9IChQRlJBTUVfQUREQkFfUkVRKSgmRWxlbS0+TXNnWzBdKTsKKwkJCXByaW50aygiUmN2IFdjaWQoJWQpIEFkZEJBUmVxXG4iLCBFbGVtLT5XY2lkKTsKKwkJCWlmIChCQVJlY1Nlc3Npb25BZGQocEFkLCAmcEFkLT5NYWNUYWIuQ29udGVudFtFbGVtLT5XY2lkXSwgcEFkZHJlcUZyYW1lKSkKKwkJCQlTdGF0dXMgPSAwOworCQkJZWxzZQorCQkJCVN0YXR1cyA9IDM4OyAvLyBtb3JlIHBhcmFtZXRlcnMgaGF2ZSBpbnZhbGlkIHZhbHVlcworCQl9CisJCWVsc2UKKwkJeworCQkJU3RhdHVzID0gMzc7IC8vIHRoZSByZXF1ZXN0IGhhcyBiZWVuIGRlY2xpbmVkLgorCQl9CisJfQorCisJaWYgKHBBZC0+TWFjVGFiLkNvbnRlbnRbRWxlbS0+V2NpZF0uVmFsaWRBc0NMSSkKKwkJQVNTRVJUKHBBZC0+TWFjVGFiLkNvbnRlbnRbRWxlbS0+V2NpZF0uU3N0ID09IFNTVF9BU1NPQyk7CisKKwlwQWRkcmVxRnJhbWUgPSAoUEZSQU1FX0FEREJBX1JFUSkoJkVsZW0tPk1zZ1swXSk7CisJLy8gMi4gQWx3YXlzIHNlbmQgYmFjayBBRERCQSBSZXNwb25zZQorCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcik7CSAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5CisJaWYgKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQUNUSU9OIC0gUGVlckJBQWN0aW9uKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxlZCBcbiIpKTsKKwkJcmV0dXJuOworCX0KKworCU5kaXNaZXJvTWVtb3J5KCZBRERmcmFtZSwgc2l6ZW9mKEZSQU1FX0FEREJBX1JTUCkpOworCS8vIDItMS4gUHJlcGFyZSBBRERCQSBSZXNwb25zZSBmcmFtZS4KKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCXsKKwkJaWYgKEFESE9DX09OKHBBZCkpCisJCQlBY3RIZWFkZXJJbml0KHBBZCwgJkFERGZyYW1lLkhkciwgcEFkZHIsIHBBZC0+Q3VycmVudEFkZHJlc3MsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKwkJZWxzZQorI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCQlpZiAocEFkLT5NYWNUYWIuQ29udGVudFtFbGVtLT5XY2lkXS5WYWxpZEFzRGxzKQorCQkJQWN0SGVhZGVySW5pdChwQWQsICZBRERmcmFtZS5IZHIsIHBBZGRyLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisJCWVsc2UKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKwkJCUFjdEhlYWRlckluaXQocEFkLCAmQUREZnJhbWUuSGRyLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgcEFkLT5DdXJyZW50QWRkcmVzcywgcEFkZHIpOworCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwlBRERmcmFtZS5DYXRlZ29yeSA9IENBVEVHT1JZX0JBOworCUFERGZyYW1lLkFjdGlvbiA9IEFEREJBX1JFU1A7CisJQUREZnJhbWUuVG9rZW4gPSBwQWRkcmVxRnJhbWUtPlRva2VuOworCS8vIFdoYXQgaXMgdGhlIFN0YXR1cyBjb2RlPz8gIG5lZWQgdG8gY2hlY2suCisJQUREZnJhbWUuU3RhdHVzQ29kZSA9IFN0YXR1czsKKwlBRERmcmFtZS5CYVBhcm0uQkFQb2xpY3kgPSBJTU1FRF9CQTsKKwlBRERmcmFtZS5CYVBhcm0uQU1TRFVTdXBwb3J0ZWQgPSAwOworCUFERGZyYW1lLkJhUGFybS5USUQgPSBwQWRkcmVxRnJhbWUtPkJhUGFybS5USUQ7CisJQUREZnJhbWUuQmFQYXJtLkJ1ZlNpemUgPSBtaW4oKChVQ0hBUilwQWRkcmVxRnJhbWUtPkJhUGFybS5CdWZTaXplKSwgKFVDSEFSKXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5SeEJBV2luTGltaXQpOworCWlmIChBRERmcmFtZS5CYVBhcm0uQnVmU2l6ZSA9PSAwKQorCXsKKwkJQUREZnJhbWUuQmFQYXJtLkJ1ZlNpemUgPSA2NDsKKwl9CisJQUREZnJhbWUuVGltZU91dFZhbHVlID0gMDsgLy9wQWRkcmVxRnJhbWUtPlRpbWVPdXRWYWx1ZTsKKworCSooVVNIT1JUICopKCZBRERmcmFtZS5CYVBhcm0pID0gY3B1MmxlMTYoKihVU0hPUlQgKikoJkFERGZyYW1lLkJhUGFybSkpOworCUFERGZyYW1lLlN0YXR1c0NvZGUgPSBjcHUybGUxNihBRERmcmFtZS5TdGF0dXNDb2RlKTsKKwlBRERmcmFtZS5UaW1lT3V0VmFsdWUgPSBjcHUybGUxNihBRERmcmFtZS5UaW1lT3V0VmFsdWUpOworCisJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICAgICAgICAmRnJhbWVMZW4sCisJCQkJCSAgc2l6ZW9mKEZSQU1FX0FEREJBX1JTUCksICAmQUREZnJhbWUsCisJCQkgIEVORF9PRl9BUkdTKTsKKwlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIFFJRF9BQ19CRSwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOworCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcyglZCk6IFRJRCglZCksIEJ1ZlNpemUoJWQpIDw9PSBcbiIsIF9fZnVuY19fLCBFbGVtLT5XY2lkLCBBRERmcmFtZS5CYVBhcm0uVElELAorCQkJCQkJCSAgQUREZnJhbWUuQmFQYXJtLkJ1ZlNpemUpKTsKK30KKworCitWT0lEIFBlZXJBZGRCQVJzcEFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCisKK3sKKwkvL1VDSEFSCQlJZHgsIGk7CisJLy9QVUNIQVIJCSAgIHBPdXRCdWZmZXIgPSBOVUxMOworCVBGUkFNRV9BRERCQV9SU1AgICAgcEZyYW1lID0gTlVMTDsKKwkvL1BCQV9PUklfRU5UUlkJCXBCQUVudHJ5OworCisJLy9BRERCQSBSZXNwb25zZSBmcm9tIHVua25vd24gcGVlciwgaWdub3JlIHRoaXMuCisJaWYgKEVsZW0tPldjaWQgPj0gTUFYX0xFTl9PRl9NQUNfVEFCTEUpCisJCXJldHVybjsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzID09PiBXY2lkKCVkKVxuIiwgX19mdW5jX18sIEVsZW0tPldjaWQpKTsKKworCS8vaGV4X2R1bXAoIlBlZXJBZGRCQVJzcEFjdGlvbigpIiwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4pOworCisJaWYgKFBlZXJBZGRCQVJzcEFjdGlvblNhbml0eShwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuKSkKKwl7CisJCXBGcmFtZSA9IChQRlJBTUVfQUREQkFfUlNQKSgmRWxlbS0+TXNnWzBdKTsKKworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJcdFx0IFN0YXR1c0NvZGUgPSAlZFxuIiwgcEZyYW1lLT5TdGF0dXNDb2RlKSk7CisJCXN3aXRjaCAocEZyYW1lLT5TdGF0dXNDb2RlKQorCQl7CisJCQljYXNlIDA6CisJCQkJLy8gSSB3YW50IGEgQkFzZXNzaW9uIHdpdGggdGhpcyBwZWVyIGFzIGFuIG9yaWdpbmF0b3IuCisJCQkJQkFPcmlTZXNzaW9uQWRkKHBBZCwgJnBBZC0+TWFjVGFiLkNvbnRlbnRbRWxlbS0+V2NpZF0sIHBGcmFtZSk7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCS8vIGNoZWNrIHN0YXR1cyA9PSBVU0VEID8/PworCQkJCUJBT3JpU2Vzc2lvblRlYXJEb3duKHBBZCwgRWxlbS0+V2NpZCwgcEZyYW1lLT5CYVBhcm0uVElELCBUUlVFLCBGQUxTRSk7CisJCQkJYnJlYWs7CisJCX0KKwkJLy8gUmN2IERlY2xpbmUgU3RhdHVzQ29kZQorCQlpZiAoKHBGcmFtZS0+U3RhdHVzQ29kZSA9PSAzNykKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKyAgICAgICAgICAgIHx8ICgocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkgJiYgU1RBX1RHTl9XSUZJX09OKHBBZCkgJiYgKHBGcmFtZS0+U3RhdHVzQ29kZSAhPSAwKSkKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKyAgICAgICAgICAgICkKKwkJeworCQkJcEFkLT5NYWNUYWIuQ29udGVudFtFbGVtLT5XY2lkXS5CQURlY2xpbmVCaXRtYXAgfD0gMTw8cEZyYW1lLT5CYVBhcm0uVElEOworCQl9CisJfQorfQorCitWT0lEIFBlZXJEZWxCQUFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCisKK3sKKwkvL1VDSEFSCQkJCUlkeDsKKwkvL1BVQ0hBUgkJCQlwT3V0QnVmZmVyID0gTlVMTDsKKwlQRlJBTUVfREVMQkFfUkVRICAgIHBEZWxGcmFtZSA9IE5VTEw7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIiVzID09PlxuIiwgX19mdW5jX18pKTsKKwkvL0RFTEJBIFJlcXVlc3QgZnJvbSB1bmtub3duIHBlZXIsIGlnbm9yZSB0aGlzLgorCWlmIChQZWVyRGVsQkFBY3Rpb25TYW5pdHkocEFkLCBFbGVtLT5XY2lkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbikpCisJeworCQlwRGVsRnJhbWUgPSAoUEZSQU1FX0RFTEJBX1JFUSkoJkVsZW0tPk1zZ1swXSk7CisJCWlmIChwRGVsRnJhbWUtPkRlbGJhUGFybS5Jbml0aWF0b3IgPT0gT1JJR0lOQVRPUikKKwkJeworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJCQSAtIFBlZXJEZWxCQUFjdGlvbi0tLS0+IE9SSUdJTkFUT1JcbiIpKTsKKwkJCUJBUmVjU2Vzc2lvblRlYXJEb3duKHBBZCwgRWxlbS0+V2NpZCwgcERlbEZyYW1lLT5EZWxiYVBhcm0uVElELCBUUlVFKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQkEgLSBQZWVyRGVsQkFBY3Rpb24tLS0tPiBSRUNJUElFTlQsIFJlYXNvbiA9ICVkXG4iLCAgcERlbEZyYW1lLT5SZWFzb25Db2RlKSk7CisJCQkvL2hleF9kdW1wKCJEZWxCQSBGcmFtZSIsIHBEZWxGcmFtZSwgRWxlbS0+TXNnTGVuKTsKKwkJCUJBT3JpU2Vzc2lvblRlYXJEb3duKHBBZCwgRWxlbS0+V2NpZCwgcERlbEZyYW1lLT5EZWxiYVBhcm0uVElELCBUUlVFLCBGQUxTRSk7CisJCX0KKwl9Cit9CisKKworQk9PTEVBTiBDbnRsRW5xdWV1ZUZvclJlY3YoCisJCQkJCQkgIElOIFBSVE1QX0FEQVBURVIJCXBBZCwKKwkJCQkJCSAgSU4gVUxPTkcJCQkJV2NpZCwKKwkJCQkJCSAgSU4gVUxPTkcJCQkJTXNnTGVuLAorCQkJCQkJICBJTiBQRlJBTUVfQkFfUkVRCQlwTXNnKQoreworCVBGUkFNRV9CQV9SRVEgICBwRnJhbWUgPSBwTXNnOworCS8vUFJUTVBfUkVPUkRFUkJVRglwQnVmZmVyOworCS8vUFJUTVBfUkVPUkRFUkJVRglwRG1hQnVmOworCVBCQV9SRUNfRU5UUlkgcEJBRW50cnk7CisJLy9CT09MRUFOIAlSZXN1bHQ7CisJVUxPTkcgICBJZHg7CisJLy9VQ0hBUglOdW1SeFBrdDsKKwlVQ0hBUglUSUQ7Ly8sIGk7CisKKwlUSUQgPSAoVUNIQVIpcEZyYW1lLT5CQVJDb250cm9sLlRJRDsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzKCk6IEJBUi1XY2lkKCVsZCksIFRpZCAoJWQpXG4iLCBfX2Z1bmNfXywgV2NpZCwgVElEKSk7CisJLy9oZXhfZHVtcCgiQkFSIiwgKFBDSEFSKSBwRnJhbWUsIE1zZ0xlbik7CisJLy8gRG8gbm90aGluZyBpZiB0aGUgZHJpdmVyIGlzIHN0YXJ0aW5nIGhhbHQgc3RhdGUuCisJLy8gVGhpcyBtaWdodCBoYXBwZW4gd2hlbiB0aW1lciBhbHJlYWR5IGJlZW4gZmlyZWQgYmVmb3JlIGNhbmNlbCB0aW1lciB3aXRoIG1sbWVoYWx0CisJaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkKKwkJcmV0dXJuIEZBTFNFOworCisJLy8gRmlyc3QgY2hlY2sgdGhlIHNpemUsIGl0IE1VU1Qgbm90IGV4Y2VlZCB0aGUgbWxtZSBxdWV1ZSBzaXplCisJaWYgKE1zZ0xlbiA+IE1HTVRfRE1BX0JVRkZFUl9TSVpFKQorCXsKKwkJREJHUFJJTlRfRVJSKCgiQ250bEVucXVldWVGb3JSZWN2OiBmcmFtZSB0b28gbGFyZ2UsIHNpemUgPSAlbGQgXG4iLCBNc2dMZW4pKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKwllbHNlIGlmIChNc2dMZW4gIT0gc2l6ZW9mKEZSQU1FX0JBX1JFUSkpCisJeworCQlEQkdQUklOVF9FUlIoKCJDbnRsRW5xdWV1ZUZvclJlY3Y6IEJsb2NrQWNrIFJlcXVlc3QgZnJhbWUgbGVuZ3RoIHNpemUgPSAlbGQgaW5jb3JyZWN0XG4iLCBNc2dMZW4pKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKwllbHNlIGlmIChNc2dMZW4gIT0gc2l6ZW9mKEZSQU1FX0JBX1JFUSkpCisJeworCQlEQkdQUklOVF9FUlIoKCJDbnRsRW5xdWV1ZUZvclJlY3Y6IEJsb2NrQWNrIFJlcXVlc3QgZnJhbWUgbGVuZ3RoIHNpemUgPSAlbGQgaW5jb3JyZWN0XG4iLCBNc2dMZW4pKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCWlmICgoV2NpZCA8IE1BWF9MRU5fT0ZfTUFDX1RBQkxFKSAmJiAoVElEIDwgOCkpCisJCXsKKwkJLy8gaWYgdGhpcyByZWNlaXZpbmcgcGFja2V0IGlzIGZyb20gU0EgdGhhdCBpcyBpbiBvdXIgT3JpRW50cnkuIFNpbmNlIFdDSUQgPDkgaGFzIGRpcmVjdCBtYXBwaW5nLiBubyBuZWVkIHNlYXJjaC4KKwkJSWR4ID0gcEFkLT5NYWNUYWIuQ29udGVudFtXY2lkXS5CQVJlY1djaWRBcnJheVtUSURdOworCQlwQkFFbnRyeSA9ICZwQWQtPkJBVGFibGUuQkFSZWNFbnRyeVtJZHhdOworCQl9CisJCWVsc2UKKwkJeworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQkFSKCVsZCkgOiBUaWQgKCVkKSAtICUwNHg6JTA0eFxuIiwgV2NpZCwgVElELCBwRnJhbWUtPkJBU3RhcnRpbmdTZXEuZmllbGQuU3RhcnRTZXEsIHBCQUVudHJ5LT5MYXN0SW5kU2VxICkpOworCisJaWYgKFNFUV9TTUFMTEVSKHBCQUVudHJ5LT5MYXN0SW5kU2VxLCBwRnJhbWUtPkJBU3RhcnRpbmdTZXEuZmllbGQuU3RhcnRTZXEsIE1BWFNFUSkpCisJeworCQkvL3ByaW50aygiQkFSIFNlcSA9ICV4LCBMYXN0SW5kU2VxID0gJXhcbiIsIHBGcmFtZS0+QkFTdGFydGluZ1NlcS5maWVsZC5TdGFydFNlcSwgcEJBRW50cnktPkxhc3RJbmRTZXEpOworCQliYV9pbmRpY2F0ZV9yZW9yZGVyaW5nX21wZHVzX2xlX3NlcShwQWQsIHBCQUVudHJ5LCBwRnJhbWUtPkJBU3RhcnRpbmdTZXEuZmllbGQuU3RhcnRTZXEpOworCQlwQkFFbnRyeS0+TGFzdEluZFNlcSA9IChwRnJhbWUtPkJBU3RhcnRpbmdTZXEuZmllbGQuU3RhcnRTZXEgPT0gMCkgPyBNQVhTRVEgOihwRnJhbWUtPkJBU3RhcnRpbmdTZXEuZmllbGQuU3RhcnRTZXEgLTEpOworCX0KKwkvL2JhX3JlZnJlc2hfcmVvcmRlcmluZ19tcGR1cyhwQWQsIHBCQUVudHJ5KTsKKwlyZXR1cm4gVFJVRTsKK30KKworLyoKK0Rlc2NyaXB0aW9uIDogU2VuZCBQU01QIEFjdGlvbiBmcmFtZSBJZiBQU01QIG1vZGUgc3dpdGNoZXMuCisqLworVk9JRCBTZW5kUFNNUEFjdGlvbigKKwkJCQkgICBJTiBQUlRNUF9BREFQVEVSCQlwQWQsCisJCQkJICAgSU4gVUNIQVIJCQkJV2NpZCwKKwkJCQkgICBJTiBVQ0hBUgkJCQlQc21wKQoreworCVBVQ0hBUiAgICAgICAgICBwT3V0QnVmZmVyID0gTlVMTDsKKwlORElTX1NUQVRVUyAgICAgTlN0YXR1czsKKwkvL1VMT05HICAgICAgICAgICBJZHg7CisJRlJBTUVfUFNNUF9BQ1RJT04gICBGcmFtZTsKKwlVTE9ORyAgICAgICAgICAgRnJhbWVMZW47CisKKwlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOwkgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQorCWlmIChOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIkJBIC0gTWxtZUFEREJBQWN0aW9uKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxlZCBcbiIpKTsKKwkJcmV0dXJuOworCX0KKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQlBY3RIZWFkZXJJbml0KHBBZCwgJkZyYW1lLkhkciwgcEFkLT5Db21tb25DZmcuQnNzaWQsIHBBZC0+Q3VycmVudEFkZHJlc3MsIHBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0uQWRkcik7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlGcmFtZS5DYXRlZ29yeSA9IENBVEVHT1JZX0hUOworCUZyYW1lLkFjdGlvbiA9IFNNUFNfQUNUSU9OOworCXN3aXRjaCAoUHNtcCkKKwl7CisJCWNhc2UgTU1QU19FTkFCTEU6CisJCQlGcmFtZS5Qc21wID0gMDsKKwkJCWJyZWFrOworCQljYXNlIE1NUFNfRFlOQU1JQzoKKwkJCUZyYW1lLlBzbXAgPSAzOworCQkJYnJlYWs7CisJCWNhc2UgTU1QU19TVEFUSUM6CisJCQlGcmFtZS5Qc21wID0gMTsKKwkJCWJyZWFrOworCX0KKwlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAgICAgICAgICAgICAgICZGcmFtZUxlbiwKKwkJCQkJICBzaXplb2YoRlJBTUVfUFNNUF9BQ1RJT04pLCAgICAgICZGcmFtZSwKKwkJCQkJICBFTkRfT0ZfQVJHUyk7CisJTWluaXBvcnRNTVJlcXVlc3QocEFkLCBRSURfQUNfQkUsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKKwlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOworCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiSFQgLSBTZW5kUFNNUEFjdGlvbiggJWQgKSAgXG4iLCBGcmFtZS5Qc21wKSk7Cit9CisKKworI2RlZmluZSBSQURJT19NRUFTVVJFTUVOVF9SRVFVRVNUX0FDVElPTgkwCisKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRAoreworCVVDSEFSCVJlZ3VsYXRvcnlDbGFzczsKKwlVQ0hBUglDaGFubmVsTnVtYmVyOworCVVTSE9SVAlSYW5kb21JbnRlcnZhbDsKKwlVU0hPUlQJTWVhc3VyZW1lbnREdXJhdGlvbjsKKwlVQ0hBUglNZWFzdXJlbWVudE1vZGU7CisJVUNIQVIgICBCU1NJRFtNQUNfQUREUl9MRU5dOworCVVDSEFSCVJlcG9ydGluZ0NvbmRpdGlvbjsKKwlVQ0hBUglUaHJlc2hvbGQ7CisJVUNIQVIgICBTU0lESUVbMl07CQkJLy8gMiBieXRlCit9IEJFQUNPTl9SRVFVRVNUOworCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQKK3sKKwlVQ0hBUglJRDsKKwlVQ0hBUglMZW5ndGg7CisJVUNIQVIJVG9rZW47CisJVUNIQVIJUmVxdWVzdE1vZGU7CisJVUNIQVIJVHlwZTsKK30gTUVBU1VSRU1FTlRfUkVROworCisKKworCit2b2lkIGNvbnZlcnRfcmVvcmRlcmluZ19wYWNrZXRfdG9fcHJlQU1TRFVfb3JfODAyXzNfcGFja2V0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVJYX0JMSwkJCSpwUnhCbGssCisJSU4gIFVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpCit7CisJUE5ESVNfUEFDS0VUCXBSeFBrdDsKKwlVQ0hBUgkJCUhlYWRlcjgwMl8zW0xFTkdUSF84MDJfM107CisKKwkvLyAxLiBnZXQgODAyLjMgSGVhZGVyCisJLy8gMi4gcmVtb3ZlIExMQworCS8vIAkJYS4gcG9pbnRlciBwUnhCbGstPnBEYXRhIHRvIHBheWxvYWQKKwkvLyAgICAgIGIuIG1vZGlmeSBwUnhCbGstPkRhdGFTaXplCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQlSVE1QXzgwMl8xMV9SRU1PVkVfTExDX0FORF9DT05WRVJUX1RPXzgwMl8zKHBSeEJsaywgSGVhZGVyODAyXzMpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJQVNTRVJUKHBSeEJsay0+cFJ4UGFja2V0KTsKKwlwUnhQa3QgPSBSVFBLVF9UT19PU1BLVChwUnhCbGstPnBSeFBhY2tldCk7CisKKwlSVFBLVF9UT19PU1BLVChwUnhQa3QpLT5kZXYgPSBnZXRfbmV0ZGV2X2Zyb21fYnNzaWQocEFkLCBGcm9tV2hpY2hCU1NJRCk7CisJUlRQS1RfVE9fT1NQS1QocFJ4UGt0KS0+ZGF0YSA9IHBSeEJsay0+cERhdGE7CisJUlRQS1RfVE9fT1NQS1QocFJ4UGt0KS0+bGVuID0gcFJ4QmxrLT5EYXRhU2l6ZTsKKwlSVFBLVF9UT19PU1BLVChwUnhQa3QpLT50YWlsID0gUlRQS1RfVE9fT1NQS1QocFJ4UGt0KS0+ZGF0YSArIFJUUEtUX1RPX09TUEtUKHBSeFBrdCktPmxlbjsKKworCS8vCisJLy8gY29weSA4MDIuMyBoZWFkZXIsIGlmIG5lY2Vzc2FyeQorCS8vCisJaWYgKCFSWF9CTEtfVEVTVF9GTEFHKHBSeEJsaywgZlJYX0FNU0RVKSkKKwl7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJeworI2lmZGVmIExJTlVYCisJCQlOZGlzTW92ZU1lbW9yeShza2JfcHVzaChwUnhQa3QsIExFTkdUSF84MDJfMyksIEhlYWRlcjgwMl8zLCBMRU5HVEhfODAyXzMpOworI2VuZGlmCisjaWZkZWYgVUNPUworCQkJTmRpc01vdmVNZW1vcnkobmV0X3BrdF9wdXNoKHBSeFBrdCwgTEVOR1RIXzgwMl8zKSwgSGVhZGVyODAyXzMsIExFTkdUSF84MDJfMyk7CisjZW5kaWYKKwkJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCX0KK30KKworCisjZGVmaW5lIElORElDQVRFX0xFR0FDWV9PUl9BTVNEVShfcEFkLCBfcFJ4QmxrLCBfZnJvbVdoaWNoQlNTSUQpCQlcCisJZG8JCQkJCQkJCQkJCQkJCQkJCVwKKwl7CQkJCQkJCQkJCQkJCQkJCQlcCisgICAgCWlmIChSWF9CTEtfVEVTVF9GTEFHKF9wUnhCbGssIGZSWF9BTVNEVSkpCQkJCQkJXAorICAgIAl7CQkJCQkJCQkJCQkJCQkJCVwKKyAgICAJCUluZGljYXRlX0FNU0RVX1BhY2tldChfcEFkLCBfcFJ4QmxrLCBfZnJvbVdoaWNoQlNTSUQpOwkJXAorICAgIAl9CQkJCQkJCQkJCQkJCQkJCVwKKwkJZWxzZSBpZiAoUlhfQkxLX1RFU1RfRkxBRyhfcFJ4QmxrLCBmUlhfRUFQKSkJCQkJCVwKKwkJewkJCQkJCQkJCQkJCQkJCQlcCisJCQlJbmRpY2F0ZV9FQVBPTF9QYWNrZXQoX3BBZCwgX3BSeEJsaywgX2Zyb21XaGljaEJTU0lEKTsJCVwKKwkJfQkJCQkJCQkJCQkJCQkJCQlcCisgICAgCWVsc2UJCQkJCQkJCQkJCQkJCQlcCisgICAgCXsJCQkJCQkJCQkJCQkJCQkJXAorICAgIAkJSW5kaWNhdGVfTGVnYWN5X1BhY2tldChfcEFkLCBfcFJ4QmxrLCBfZnJvbVdoaWNoQlNTSUQpOwkJXAorICAgIAl9CQkJCQkJCQkJCQkJCQkJCVwKKwl9IHdoaWxlICgwKTsKKworCisKK3N0YXRpYyBWT0lEIGJhX2VucXVldWVfcmVvcmRlcmluZ19wYWNrZXQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUEJBX1JFQ19FTlRSWQlwQkFFbnRyeSwKKwlJTglSWF9CTEsJCQkqcFJ4QmxrLAorCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpCit7CisJc3RydWN0IHJlb3JkZXJpbmdfbXBkdSAqbXBkdV9ibGs7CisJVUlOVDE2CVNlcXVlbmNlID0gKFVJTlQxNikgcFJ4QmxrLT5wSGVhZGVyLT5TZXF1ZW5jZTsKKworCW1wZHVfYmxrID0gYmFfbXBkdV9ibGtfYWxsb2MocEFkKTsKKwlpZiAobXBkdV9ibGsgIT0gTlVMTCkKKwl7CisJCS8vIFdyaXRlIFJ4RCBidWZmZXIgYWRkcmVzcyAmIGFsbG9jYXRlZCBidWZmZXIgbGVuZ3RoCisJCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBCQUVudHJ5LT5SeFJlUmluZ0xvY2spOworCisJCW1wZHVfYmxrLT5TZXF1ZW5jZSA9IFNlcXVlbmNlOworCisJCW1wZHVfYmxrLT5iQU1TRFUgPSBSWF9CTEtfVEVTVF9GTEFHKHBSeEJsaywgZlJYX0FNU0RVKTsKKworCQljb252ZXJ0X3Jlb3JkZXJpbmdfcGFja2V0X3RvX3ByZUFNU0RVX29yXzgwMl8zX3BhY2tldChwQWQsIHBSeEJsaywgRnJvbVdoaWNoQlNTSUQpOworCisJCVNUQVRTX0lOQ19SWF9QQUNLRVRTKHBBZCwgRnJvbVdoaWNoQlNTSUQpOworCisgICAgICAgIC8vCisJCS8vIGl0IGlzIG5lY2Vzc2FyeSBmb3IgcmVvcmRlcmluZyBwYWNrZXQgdG8gcmVjb3JkCisJCS8vIHdoaWNoIEJTUyBpdCBjb21lIGZyb20KKwkJLy8KKwkJUlRNUF9TRVRfUEFDS0VUX0lGKHBSeEJsay0+cFJ4UGFja2V0LCBGcm9tV2hpY2hCU1NJRCk7CisKKwkJbXBkdV9ibGstPnBQYWNrZXQgPSBwUnhCbGstPnBSeFBhY2tldDsKKworCQlpZiAoYmFfcmVvcmRlcmluZ19tcGR1X2luc2VydHNvcnRlZCgmcEJBRW50cnktPmxpc3QsIG1wZHVfYmxrKSA9PSBGQUxTRSkKKwkJeworCQkJLy8gaGFkIGJlZW4gYWxyZWFkeSB3aXRoaW4gcmVvcmRlcmluZyBsaXN0CisJCQkvLyBkb24ndCBpbmRpY2F0ZQorCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeEJsay0+cFJ4UGFja2V0LCBORElTX1NUQVRVU19TVUNDRVNTKTsKKwkJCWJhX21wZHVfYmxrX2ZyZWUocEFkLCBtcGR1X2Jsayk7CisJCX0KKworCQlBU1NFUlQoKDA8PSBwQkFFbnRyeS0+bGlzdC5xbGVuKSAgJiYgKHBCQUVudHJ5LT5saXN0LnFsZW4gPD0gcEJBRW50cnktPkJBV2luU2l6ZSkpOworCQlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQkFFbnRyeS0+UnhSZVJpbmdMb2NrKTsKKwl9CisJZWxzZQorCXsKKyNpZiAwCisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAgKCIhISEgKCVkOiVkKSBDYW4ndCBhbGxvY2F0ZSByZW9yZGVyaW5nIG1wZHUgYmxrXG4iLAorCQkJCQkJCQkgICBibGtfY291bnQsIHBCQUVudHJ5LT5saXN0LnFsZW4pKTsKKyNlbHNlCisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAgKCIhISEgKCVkKSBDYW4ndCBhbGxvY2F0ZSByZW9yZGVyaW5nIG1wZHUgYmxrXG4iLAorCQkJCQkJCQkgICBwQkFFbnRyeS0+bGlzdC5xbGVuKSk7CisjZW5kaWYKKwkJLyoKKwkJICogZmx1c2ggYWxsIHBlbmRpbmcgcmVvcmRlcmluZyBtcGR1cworCQkgKiBhbmQgcmVjZXZpbmcgbXBkdSB0byB1cHBlciBsYXllcgorCQkgKiBtYWtlIHRjcC9pcCB0byB0YWtlIGNhcmUgcmVvcmRlcmluZyBtZWNoYW5pc20KKwkJICovCisJCS8vYmFfcmVmcmVzaF9yZW9yZGVyaW5nX21wZHVzKHBBZCwgcEJBRW50cnkpOworCQliYV9pbmRpY2F0ZV9yZW9yZGVyaW5nX21wZHVzX2xlX3NlcShwQWQsIHBCQUVudHJ5LCBTZXF1ZW5jZSk7CisKKwkJcEJBRW50cnktPkxhc3RJbmRTZXEgPSBTZXF1ZW5jZTsKKwkJSU5ESUNBVEVfTEVHQUNZX09SX0FNU0RVKHBBZCwgcFJ4QmxrLCBGcm9tV2hpY2hCU1NJRCk7CisJfQorfQorCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJSW5kaWNhdGUgdGhpcyBwYWNrZXQgdG8gdXBwZXIgbGF5ZXIgb3IgcHV0IGl0IGludG8gcmVvcmRlcmluZyBidWZmZXIKKworCVBhcmFtZXRyczoKKwkJcFJ4QmxrICAgICAgICAgOiBjYXJyeSBuZWNlc3NhcnkgcGFja2V0IGluZm8gODAyLjExIGZvcm1hdAorCQlGcm9tV2hpY2hCU1NJRCA6IHRoZSBwYWNrZXQgcmVjZWl2ZWQgZnJvbSB3aGljaCBCU1MKKworCVJldHVybgk6CisJCQkgIG5vbmUKKworCU5vdGUgICAgOgorCSAgICAgICAgICB0aGUgcGFja2V0IHF1ZXVlZCBpbnRvIHJlb3JkZXJpbmcgYnVmZmVyIG5lZWQgdG8gY292ZXIgdG8gODAyLjMgZm9ybWF0CisJCQkgIG9yIHByZV9BTVNEVSBmb3JtYXQKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK1ZPSUQgSW5kaWNhdGVfQU1QRFVfUGFja2V0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVJYX0JMSwkJCSpwUnhCbGssCisJSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCkKK3sKKwlVU0hPUlQJCQkJSWR4OworCVBCQV9SRUNfRU5UUlkJCXBCQUVudHJ5ID0gTlVMTDsKKwlVSU5UMTYJCQkJU2VxdWVuY2UgPSBwUnhCbGstPnBIZWFkZXItPlNlcXVlbmNlOworCVVMT05HCQkJCU5vdzMyOworCVVDSEFSCQkJCVdjaWQgPSBwUnhCbGstPnBSeFdJLT5XaXJlbGVzc0NsaUlEOworCVVDSEFSCQkJCVRJRCA9IHBSeEJsay0+cFJ4V0ktPlRJRDsKKworCisJaWYgKCFSWF9CTEtfVEVTVF9GTEFHKHBSeEJsaywgZlJYX0FNU0RVKSAmJiAgKHBSeEJsay0+RGF0YVNpemUgPiBNQVhfUlhfUEtUX0xFTikpCisJeworI2lmIDAgLy8gc2FtcGxlIHRha2Ugb2ZmLCBubyB1c2UKKwkJc3RhdGljIGludCBlcnJfc2l6ZTsKKworCQllcnJfc2l6ZSsrOworCQlpZiAoZXJyX3NpemUgPiAyMCkgeworCQkJIHByaW50aygiQU1QRFUgRGF0YVNpemUgPSAlZFxuIiwgcFJ4QmxrLT5EYXRhU2l6ZSk7CisJCQkgaGV4X2R1bXAoIjgwMi4xMSBIZWFkZXIiLCAoVUNIQVIgKilwUnhCbGstPnBIZWFkZXIsIDI0KTsKKwkJCSBoZXhfZHVtcCgiUGF5bG9hZCIsIHBSeEJsay0+cERhdGEsIDY0KTsKKwkJCSBlcnJfc2l6ZSA9IDA7CisJCX0KKyNlbmRpZgorCQkvLyByZWxlYXNlIHBhY2tldAorCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4QmxrLT5wUnhQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCQlyZXR1cm47CisJfQorCisKKyNpZiAwIC8vIHRlc3QKKwkvKiBSZWMgQkEgU2Vzc2lvbiBoYWQgYmVlbiB0b3JuIGRvd24gKi8KKwlJTkRJQ0FURV9MRUdBQ1lfT1JfQU1TRFUocEFkLCBwUnhCbGssIEZyb21XaGljaEJTU0lEKTsKKwlyZXR1cm47CisjZW5kaWYKKworCWlmIChXY2lkIDwgTUFYX0xFTl9PRl9NQUNfVEFCTEUpCisJeworCQlJZHggPSBwQWQtPk1hY1RhYi5Db250ZW50W1djaWRdLkJBUmVjV2NpZEFycmF5W1RJRF07CisJCWlmIChJZHggPT0gMCkKKwkJeworCQkJLyogUmVjIEJBIFNlc3Npb24gaGFkIGJlZW4gdG9ybiBkb3duICovCisJCQlJTkRJQ0FURV9MRUdBQ1lfT1JfQU1TRFUocEFkLCBwUnhCbGssIEZyb21XaGljaEJTU0lEKTsKKwkJCXJldHVybjsKKwkJfQorCQlwQkFFbnRyeSA9ICZwQWQtPkJBVGFibGUuQkFSZWNFbnRyeVtJZHhdOworCX0KKwllbHNlCisJeworCQkvLyBpbXBvc3NpYmxlICEhIQorCQlBU1NFUlQoMCk7CisJCS8vIHJlbGVhc2UgcGFja2V0CisJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhCbGstPnBSeFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCXJldHVybjsKKwl9CisKKwlBU1NFUlQocEJBRW50cnkpOworCisJLy8gdXBkYXRlIGxhc3QgcnggdGltZQorCU5kaXNHZXRTeXN0ZW1VcFRpbWUoJk5vdzMyKTsKKworCXBCQUVudHJ5LT5yY3ZTZXEgPSBTZXF1ZW5jZTsKKworCisJYmFfZmx1c2hfcmVvcmRlcmluZ190aW1lb3V0X21wZHVzKHBBZCwgcEJBRW50cnksIE5vdzMyKTsKKwlwQkFFbnRyeS0+TGFzdEluZFNlcUF0VGltZXIgPSBOb3czMjsKKworCS8vCisJLy8gUmVzZXQgTGFzdCBJbmRpY2F0ZSBTZXF1ZW5jZQorCS8vCisJaWYgKHBCQUVudHJ5LT5MYXN0SW5kU2VxID09IFJFU0VUX1JDVl9TRVEpCisJeworCQlBU1NFUlQoKHBCQUVudHJ5LT5saXN0LnFsZW4gPT0gMCkgJiYgKHBCQUVudHJ5LT5saXN0Lm5leHQgPT0gTlVMTCkpOworCisJCS8vIHJlc2V0IHJjdiBzZXF1ZW5jZSBvZiBCQSBzZXNzaW9uCisJCXBCQUVudHJ5LT5MYXN0SW5kU2VxID0gU2VxdWVuY2U7CisJCXBCQUVudHJ5LT5MYXN0SW5kU2VxQXRUaW1lciA9IE5vdzMyOworCQlJTkRJQ0FURV9MRUdBQ1lfT1JfQU1TRFUocEFkLCBwUnhCbGssIEZyb21XaGljaEJTU0lEKTsKKwkJcmV0dXJuOworCX0KKworCisJLy8KKwkvLyBJLiBDaGVjayBpZiBpbiBvcmRlci4KKwkvLworCWlmIChTRVFfU1RFUE9ORShTZXF1ZW5jZSwgcEJBRW50cnktPkxhc3RJbmRTZXEsIE1BWFNFUSkpCisJeworCQlVU0hPUlQgIExhc3RJbmRTZXE7CisKKwkJcEJBRW50cnktPkxhc3RJbmRTZXEgPSBTZXF1ZW5jZTsKKwkJSU5ESUNBVEVfTEVHQUNZX09SX0FNU0RVKHBBZCwgcFJ4QmxrLCBGcm9tV2hpY2hCU1NJRCk7CisgCQlMYXN0SW5kU2VxID0gYmFfaW5kaWNhdGVfcmVvcmRlcmluZ19tcGR1c19pbl9vcmRlcihwQWQsIHBCQUVudHJ5LCBwQkFFbnRyeS0+TGFzdEluZFNlcSk7CisJCWlmIChMYXN0SW5kU2VxICE9IFJFU0VUX1JDVl9TRVEpCisJCXsKKwkJCXBCQUVudHJ5LT5MYXN0SW5kU2VxID0gTGFzdEluZFNlcTsKKwkJfQorCQlwQkFFbnRyeS0+TGFzdEluZFNlcUF0VGltZXIgPSBOb3czMjsKKwl9CisJLy8KKwkvLyBJSS4gRHJvcCBEdXBsaWNhdGVkIFBhY2tldAorCS8vCisJZWxzZSBpZiAoU2VxdWVuY2UgPT0gcEJBRW50cnktPkxhc3RJbmRTZXEpCisJeworCisJCS8vIGRyb3AgYW5kIHJlbGVhc2UgcGFja2V0CisJCXBCQUVudHJ5LT5uRHJvcFBhY2tldCsrOworCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4QmxrLT5wUnhQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCX0KKwkvLworCS8vIElJSS4gRHJvcCBPbGQgUmVjZWl2ZWQgUGFja2V0CisJLy8KKwllbHNlIGlmIChTRVFfU01BTExFUihTZXF1ZW5jZSwgcEJBRW50cnktPkxhc3RJbmRTZXEsIE1BWFNFUSkpCisJeworCisJCS8vIGRyb3AgYW5kIHJlbGVhc2UgcGFja2V0CisJCXBCQUVudHJ5LT5uRHJvcFBhY2tldCsrOworCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4QmxrLT5wUnhQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCX0KKwkvLworCS8vIElWLiBSZWNlaXZlIFNlcXVlbmNlIHdpdGhpbiBXaW5kb3cgU2l6ZQorCS8vCisJZWxzZSBpZiAoU0VRX1NNQUxMRVIoU2VxdWVuY2UsICgoKHBCQUVudHJ5LT5MYXN0SW5kU2VxK3BCQUVudHJ5LT5CQVdpblNpemUrMSkpICYgTUFYU0VRKSwgTUFYU0VRKSkKKwl7CisJCWJhX2VucXVldWVfcmVvcmRlcmluZ19wYWNrZXQocEFkLCBwQkFFbnRyeSwgcFJ4QmxrLCBGcm9tV2hpY2hCU1NJRCk7CisJfQorCS8vCisJLy8gVi4gUmVjZWl2ZSBzZXEgc3VycGFzc2VzIFdpbihsYXN0c2VxICsgbk1TRFUpLiBTbyByZWZyZXNoIGFsbCByZW9yZGVyIGJ1ZmZlcgorCS8vCisJZWxzZQorCXsKKyNpZiAwCisJCWJhX3JlZnJlc2hfcmVvcmRlcmluZ19tcGR1cyhwQWQsIHBCQUVudHJ5KTsKKwkJSU5ESUNBVEVfTEVHQUNZX09SX0FNU0RVKHBBZCwgcFJ4QmxrLCBGcm9tV2hpY2hCU1NJRCk7CisjZWxzZQorCQlMT05HIFdpblN0YXJ0U2VxLCBUbXBTZXE7CisKKworCQlUbXBTZXEgPSBTZXF1ZW5jZSAtIChwQkFFbnRyeS0+QkFXaW5TaXplKSAtMTsKKwkJaWYgKFRtcFNlcSA8IDApCisJCXsKKwkJCVRtcFNlcSA9IChNQVhTRVErMSkgKyBUbXBTZXE7CisJCX0KKwkJV2luU3RhcnRTZXEgPSAoVG1wU2VxKzEpICYgTUFYU0VROworCQliYV9pbmRpY2F0ZV9yZW9yZGVyaW5nX21wZHVzX2xlX3NlcShwQWQsIHBCQUVudHJ5LCBXaW5TdGFydFNlcSk7CisJCXBCQUVudHJ5LT5MYXN0SW5kU2VxID0gV2luU3RhcnRTZXE7IC8vVG1wU2VxOworCisJCXBCQUVudHJ5LT5MYXN0SW5kU2VxQXRUaW1lciA9IE5vdzMyOworCisJCWJhX2VucXVldWVfcmVvcmRlcmluZ19wYWNrZXQocEFkLCBwQkFFbnRyeSwgcFJ4QmxrLCBGcm9tV2hpY2hCU1NJRCk7CisKKwkJVG1wU2VxID0gYmFfaW5kaWNhdGVfcmVvcmRlcmluZ19tcGR1c19pbl9vcmRlcihwQWQsIHBCQUVudHJ5LCBwQkFFbnRyeS0+TGFzdEluZFNlcSk7CisJCWlmIChUbXBTZXEgIT0gUkVTRVRfUkNWX1NFUSkKKwkJeworCQkJcEJBRW50cnktPkxhc3RJbmRTZXEgPSBUbXBTZXE7CisJCX0KKyNlbmRpZgorCX0KK30KKworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9jbW1fZGF0YS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vY21tX2RhdGEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjdiOWViCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vY21tX2RhdGEuYwpAQCAtMCwwICsxLDM0NjYgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KKworI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgorCisjZGVmaW5lIE1BWF9UWF9JTl9UQlRUCQkoMTYpCisKKworVUNIQVIJU05BUF84MDJfMUhbXSA9IHsweGFhLCAweGFhLCAweDAzLCAweDAwLCAweDAwLCAweDAwfTsKK1VDSEFSCVNOQVBfQlJJREdFX1RVTk5FTFtdID0gezB4YWEsIDB4YWEsIDB4MDMsIDB4MDAsIDB4MDAsIDB4Zjh9OworLy8gQWRkIENpc2NvIEFpcm9uZXQgU05BUCBoZWFkZSBmb3IgQ0NYMiBzdXBwb3J0CitVQ0hBUglTTkFQX0FJUk9ORVRbXSA9IHsweGFhLCAweGFhLCAweDAzLCAweDAwLCAweDQwLCAweDk2LCAweDAwLCAweDAwfTsKK1VDSEFSCUNLSVBfTExDX1NOQVBbXSA9IHsweGFhLCAweGFhLCAweDAzLCAweDAwLCAweDQwLCAweDk2LCAweDAwLCAweDAyfTsKK1VDSEFSCUVBUE9MX0xMQ19TTkFQW109IHsweGFhLCAweGFhLCAweDAzLCAweDAwLCAweDAwLCAweDAwLCAweDg4LCAweDhlfTsKK1VDSEFSCUVBUE9MW10gPSB7MHg4OCwgMHg4ZX07CitVQ0hBUiAgIFRQSURbXSA9IHsweDgxLCAweDAwfTsgLyogVkxBTiByZWxhdGVkICovCisKK1VDSEFSCUlQWFtdID0gezB4ODEsIDB4Mzd9OworVUNIQVIJQVBQTEVfVEFMS1tdID0gezB4ODAsIDB4ZjN9OworVUNIQVIJUmF0ZUlkVG9QbGNwU2lnbmFsWzEyXSA9IHsKKwkgMCwgLyogUkFURV8xICovCTEsIC8qIFJBVEVfMiAqLyAJMiwgLyogUkFURV81XzUgKi8JMywgLyogUkFURV8xMSAqLwkvLyBzZWUgQkJQIHNwZWMKKwkxMSwgLyogUkFURV82ICovICAgMTUsIC8qIFJBVEVfOSAqLyAgICAxMCwgLyogUkFURV8xMiAqLyAgIDE0LCAvKiBSQVRFXzE4ICovCS8vIHNlZSBJRUVFODAyLjExYS0xOTk5IHAuMTQKKwkgOSwgLyogUkFURV8yNCAqLyAgMTMsIC8qIFJBVEVfMzYgKi8JOCwgLyogUkFURV80OCAqLyAgIDEyICAvKiBSQVRFXzU0ICovIH07IC8vIHNlZSBJRUVFODAyLjExYS0xOTk5IHAuMTQKKworVUNIQVIJIE9mZG1TaWduYWxUb1JhdGVJZFsxNl0gPSB7CisJUkFURV81NCwgIFJBVEVfNTQsCVJBVEVfNTQsICBSQVRFXzU0LAkvLyBPRkRNIFBMQ1AgU2lnbmFsID0gMCwgIDEsICAyLCAgMyByZXNwZWN0aXZlbHkKKwlSQVRFXzU0LCAgUkFURV81NCwJUkFURV81NCwgIFJBVEVfNTQsCS8vIE9GRE0gUExDUCBTaWduYWwgPSA0LCAgNSwgIDYsICA3IHJlc3BlY3RpdmVseQorCVJBVEVfNDgsICBSQVRFXzI0LAlSQVRFXzEyLCAgUkFURV82LAkvLyBPRkRNIFBMQ1AgU2lnbmFsID0gOCwgIDksICAxMCwgMTEgcmVzcGVjdGl2ZWx5CisJUkFURV81NCwgIFJBVEVfMzYsCVJBVEVfMTgsICBSQVRFXzksCS8vIE9GRE0gUExDUCBTaWduYWwgPSAxMiwgMTMsIDE0LCAxNSByZXNwZWN0aXZlbHkKK307CisKK1VDSEFSCSBPZmRtUmF0ZVRvUnh3aU1DU1sxMl0gPSB7CisJMCwgIDAsCTAsICAwLAorCTAsICAxLAkyLCAgMywJLy8gT0ZETSByYXRlIDYsOSwxMiwxOCA9IHJ4d2kgbWNzIDAsMSwyLDMKKwk0LCAgNSwJNiwgIDcsCS8vIE9GRE0gcmF0ZSAyNCwzNiw0OCw1NCA9IHJ4d2kgbWNzIDQsNSw2LDcKK307CitVQ0hBUgkgUnh3aU1DU1RvT2ZkbVJhdGVbMTJdID0geworCVJBVEVfNiwgIFJBVEVfOSwJUkFURV8xMiwgIFJBVEVfMTgsCisJUkFURV8yNCwgIFJBVEVfMzYsCVJBVEVfNDgsICBSQVRFXzU0LAkvLyBPRkRNIHJhdGUgNiw5LDEyLDE4ID0gcnh3aSBtY3MgMCwxLDIsMworCTQsICA1LAk2LCAgNywJLy8gT0ZETSByYXRlIDI0LDM2LDQ4LDU0ID0gcnh3aSBtY3MgNCw1LDYsNworfTsKKworY2hhciogICBNQ1NUb01icHNbXSA9IHsiMU1icHMiLCIyTWJwcyIsIjUuNU1icHMiLCIxMU1icHMiLCIwNk1icHMiLCIwOU1icHMiLCIxMk1icHMiLCIxOE1icHMiLCIyNE1icHMiLCIzNk1icHMiLCI0OE1icHMiLCI1NE1icHMiLCJNTS0wIiwiTU0tMSIsIk1NLTIiLCJNTS0zIiwiTU0tNCIsIk1NLTUiLCJNTS02IiwiTU0tNyIsIk1NLTgiLCJNTS05IiwiTU0tMTAiLCJNTS0xMSIsIk1NLTEyIiwiTU0tMTMiLCJNTS0xNCIsIk1NLTE1IiwiTU0tMzIiLCJlZTEiLCJlZTIiLCJlZTMifTsKKworVUNIQVIgZGVmYXVsdF9jd21pbltdPXtDV19NSU5fSU5fQklUUywgQ1dfTUlOX0lOX0JJVFMsIENXX01JTl9JTl9CSVRTLTEsIENXX01JTl9JTl9CSVRTLTJ9OworVUNIQVIgZGVmYXVsdF9zdGFfYWlmc25bXT17Myw3LDIsMn07CisKK1VDSEFSIE1hcFVzZXJQcmlvcml0eVRvQWNjZXNzQ2F0ZWdvcnlbOF0gPSB7UUlEX0FDX0JFLCBRSURfQUNfQkssIFFJRF9BQ19CSywgUUlEX0FDX0JFLCBRSURfQUNfVkksIFFJRF9BQ19WSSwgUUlEX0FDX1ZPLCBRSURfQUNfVk99OworCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlBUEkgZm9yIE1MTUUgdG8gdHJhbnNtaXQgbWFuYWdlbWVudCBmcmFtZSB0byBBUCAoQlNTIE1vZGUpCisJb3Igc3RhdGlvbiAoSUJTUyBNb2RlKQorCisJQXJndW1lbnRzOgorCQlwQWQgUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCQlwRGF0YQkJUG9pbnRlciB0byB0aGUgb3V0Z29pbmcgODAyLjExIGZyYW1lCisJCUxlbmd0aAkJU2l6ZSBvZiBvdXRnb2luZyBtYW5hZ2VtZW50IGZyYW1lCisKKwlSZXR1cm4gVmFsdWU6CisJCU5ESVNfU1RBVFVTX0ZBSUxVUkUKKwkJTkRJU19TVEFUVVNfUEVORElORworCQlORElTX1NUQVRVU19TVUNDRVNTCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK05ESVNfU1RBVFVTIE1pbmlwb3J0TU1SZXF1ZXN0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVDSEFSCQkJUXVlSWR4LAorCUlOCVBVQ0hBUgkJCXBEYXRhLAorCUlOCVVJTlQJCQlMZW5ndGgpCit7CisJUE5ESVNfUEFDS0VUCXBQYWNrZXQ7CisJTkRJU19TVEFUVVMgIAlTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworCVVMT05HCSAJCUZyZWVOdW07CisjaWZkZWYgUlQyODYwCisJdW5zaWduZWQgbG9uZwlJcnFGbGFncyA9IDA7CisjZW5kaWYgLy8gUlQyODYwIC8vCisJVUNIQVIJCQlJcnFTdGF0ZTsKKwlVQ0hBUgkJCXJ0bXBId0hkcltUWElORk9fU0laRSArIFRYV0lfU0laRV07IC8vUlRNUF9IV19IRFJfTEVOXTsKKworCUFTU0VSVChMZW5ndGggPD0gTUdNVF9ETUFfQlVGRkVSX1NJWkUpOworCisJUXVlSWR4PTM7CisKKwkvLyAyODYwQyB1c2UgVHggUmluZworCisJSXJxU3RhdGUgPSBwQWQtPmlycV9kaXNhYmxlZDsKKyNpZmRlZiBSVDI4NjAKKwlpZiAoKHBBZC0+TUFDVmVyc2lvbiA9PSAweDI4NjAwMTAwKSAmJiAoIUlycVN0YXRlKSkKKwkJUlRNUF9JUlFfTE9DSygmcEFkLT5pcnFfbG9jaywgSXJxRmxhZ3MpOworI2VuZGlmIC8vIFJUMjg2MCAvLworCisJZG8KKwl7CisJCS8vIFJlc2V0IGlzIGluIHByb2dyZXNzLCBzdG9wIGltbWVkaWF0ZWx5CisJCWlmICggUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTKSB8fAorCQkJIFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKXx8CisJCQkgIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9TVEFSVF9VUCkpCisJCXsKKwkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX0ZBSUxVUkU7CisJCQlicmVhazsKKwkJfQorCisJCS8vIENoZWNrIEZyZWUgcHJpb3JpdHkgcXVldWUKKwkJLy8gU2luY2Ugd2UgdXNlIFBCRiBRdWV1ZTIgZm9yIG1hbmFnZW1lbnQgZnJhbWUuICBJdHMgY29ycmVzcG9uZGluZyBETUEgcmluZyBzaG91bGQgYmUgdXNpbmcgVHhSaW5nLgorCisJCS8vIDI4NjBDIHVzZSBUeCBSaW5nCisJCWlmIChwQWQtPk1BQ1ZlcnNpb24gPT0gMHgyODYwMDEwMCkKKwkJeworCQkJRnJlZU51bSA9IEdFVF9UWFJJTkdfRlJFRU5PKHBBZCwgUXVlSWR4KTsKKwkJfQorCQllbHNlCisJCXsKKwkJCUZyZWVOdW0gPSBHRVRfTUdNVFJJTkdfRlJFRU5PKHBBZCk7CisJCX0KKworCQlpZiAoKEZyZWVOdW0gPiAwKSkKKwkJeworCQkJLy8gV2UgbmVlZCB0byByZXNlcnZlIHNwYWNlIGZvciBydG1wIGhhcmR3YXJlIGhlYWRlci4gaS5lLiwgVHhXSSBmb3IgUlQyODYwIGFuZCBUeEluZm8rVHhXSSBmb3IgUlQyODcwCisJCQlOZGlzWmVyb01lbW9yeSgmcnRtcEh3SGRyLCAoVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkUpKTsKKwkJCVN0YXR1cyA9IFJUTVBBbGxvY2F0ZU5kaXNQYWNrZXQocEFkLCAmcFBhY2tldCwgKFBVQ0hBUikmcnRtcEh3SGRyLCAoVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkUpLCBwRGF0YSwgTGVuZ3RoKTsKKwkJCWlmIChTdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJCXsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19XQVJOLCAoIk1pbmlwb3J0TU1SZXF1ZXN0IChlcnJvcjo6IGNhbid0IGFsbG9jYXRlIE5ESVMgUEFDS0VUKVxuIikpOworCQkJCWJyZWFrOworCQkJfQorCisJCQkvL3BBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NT0RFID0gTU9ERV9DQ0s7CisJCQkvL3BBZC0+Q29tbW9uQ2ZnLk1sbWVSYXRlID0gUkFURV8yOworCisKKwkJCVN0YXR1cyA9IE1sbWVIYXJkVHJhbnNtaXQocEFkLCBRdWVJZHgsIHBQYWNrZXQpOworCQkJaWYgKFN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCQkJCVJUTVBGcmVlTmRpc1BhY2tldChwQWQsIHBQYWNrZXQpOworCQl9CisJCWVsc2UKKwkJeworCQkJcEFkLT5SYWxpbmtDb3VudGVycy5NZ210UmluZ0Z1bGxDb3VudCsrOworCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiUWlkeCglZCksIG5vdCBlbm91Z2ggc3BhY2UgaW4gTWdtdFJpbmcsIE1nbXRSaW5nRnVsbENvdW50PSVsZCFcbiIsCisJCQkJCQkJCQkJUXVlSWR4LCBwQWQtPlJhbGlua0NvdW50ZXJzLk1nbXRSaW5nRnVsbENvdW50KSk7CisJCX0KKworCX0gd2hpbGUgKEZBTFNFKTsKKworI2lmZGVmIFJUMjg2MAorCS8vIDI4NjBDIHVzZSBUeCBSaW5nCisJaWYgKChwQWQtPk1BQ1ZlcnNpb24gPT0gMHgyODYwMDEwMCkgJiYgKCFJcnFTdGF0ZSkpCisJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgSXJxRmxhZ3MpOworI2VuZGlmIC8vIFJUMjg2MCAvLworCisJcmV0dXJuIFN0YXR1czsKK30KKworCisjaWZkZWYgUlQyODYwCitORElTX1NUQVRVUyBNaW5pcG9ydE1NUmVxdWVzdFVubG9jaygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVQ0hBUgkJCVF1ZUlkeCwKKwlJTglQVUNIQVIJCQlwRGF0YSwKKwlJTglVSU5UCQkJTGVuZ3RoKQoreworCVBORElTX1BBQ0tFVAlwUGFja2V0OworCU5ESVNfU1RBVFVTICBTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworCVVMT05HCSBGcmVlTnVtOworCVRYV0lfU1RSVUMJCVRYV0k7CisJVUxPTkcJU1dfVFhfSURYOworCVBUWERfU1RSVUMJCXBUeEQ7CisKKwlRdWVJZHggPSAzOworCUFTU0VSVChMZW5ndGggPD0gTUdNVF9ETUFfQlVGRkVSX1NJWkUpOworCisJZG8KKwl7CisJCS8vIFJlc2V0IGlzIGluIHByb2dyZXNzLCBzdG9wIGltbWVkaWF0ZWx5CisJCWlmICggUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTKSB8fAorCQkJIFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKXx8CisJCQkgIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9TVEFSVF9VUCkpCisJCXsKKwkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX0ZBSUxVUkU7CisJCQlicmVhazsKKwkJfQorCisJCS8vIENoZWNrIEZyZWUgcHJpb3JpdHkgcXVldWUKKwkJLy8gU2luY2Ugd2UgdXNlIFBCRiBRdWV1ZTIgZm9yIG1hbmFnZW1lbnQgZnJhbWUuICBJdHMgY29ycmVzcG9uZGluZyBETUEgcmluZyBzaG91bGQgYmUgdXNpbmcgVHhSaW5nLgorCQkvLyAyODYwQyB1c2UgVHggUmluZworCQlpZiAocEFkLT5NQUNWZXJzaW9uID09IDB4Mjg2MDAxMDApCisJCXsKKwkJCUZyZWVOdW0gPSBHRVRfVFhSSU5HX0ZSRUVOTyhwQWQsIFF1ZUlkeCk7CisJCQlTV19UWF9JRFggPSBwQWQtPlR4UmluZ1tRdWVJZHhdLlR4Q3B1SWR4OworCQkJcFR4RCAgPSAoUFRYRF9TVFJVQykgcEFkLT5UeFJpbmdbUXVlSWR4XS5DZWxsW1NXX1RYX0lEWF0uQWxsb2NWYTsKKwkJfQorCQllbHNlCisJCXsKKwkJCUZyZWVOdW0gPSBHRVRfTUdNVFJJTkdfRlJFRU5PKHBBZCk7CisJCQlTV19UWF9JRFggPSBwQWQtPk1nbXRSaW5nLlR4Q3B1SWR4OworCQkJcFR4RCAgPSAoUFRYRF9TVFJVQykgcEFkLT5NZ210UmluZy5DZWxsW1NXX1RYX0lEWF0uQWxsb2NWYTsKKwkJfQorCQlpZiAoKEZyZWVOdW0gPiAwKSkKKwkJeworCQkJTmRpc1plcm9NZW1vcnkoJlRYV0ksIFRYV0lfU0laRSk7CisJCQlTdGF0dXMgPSBSVE1QQWxsb2NhdGVOZGlzUGFja2V0KHBBZCwgJnBQYWNrZXQsIChQVUNIQVIpJlRYV0ksIFRYV0lfU0laRSwgcERhdGEsIExlbmd0aCk7CisJCQlpZiAoU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJCQl7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfV0FSTiwgKCJNaW5pcG9ydE1NUmVxdWVzdCAoZXJyb3I6OiBjYW4ndCBhbGxvY2F0ZSBORElTIFBBQ0tFVClcbiIpKTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJU3RhdHVzID0gTWxtZUhhcmRUcmFuc21pdChwQWQsIFF1ZUlkeCwgcFBhY2tldCk7CisJCQlpZiAoU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJCQkJUlRNUEZyZWVOZGlzUGFja2V0KHBBZCwgcFBhY2tldCk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlwQWQtPlJhbGlua0NvdW50ZXJzLk1nbXRSaW5nRnVsbENvdW50Kys7CisJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJRaWR4KCVkKSwgbm90IGVub3VnaCBzcGFjZSBpbiBNZ210UmluZ1xuIiwgUXVlSWR4KSk7CisJCX0KKworCX0gd2hpbGUgKEZBTFNFKTsKKworCisJcmV0dXJuIFN0YXR1czsKK30KKyNlbmRpZiAvLyBSVDI4NjAgLy8KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJQ29weSBmcmFtZSBmcm9tIHdhaXRpbmcgcXVldWUgaW50byByZWxhdGl2ZSByaW5nIGJ1ZmZlciBhbmQgc2V0CisJYXBwcm9wcmlhdGUgQVNJQyByZWdpc3RlciB0byBraWNrIGhhcmR3YXJlIHRyYW5zbWl0IGZ1bmN0aW9uCisKKwlBcmd1bWVudHM6CisJCXBBZCBQb2ludGVyIHRvIG91ciBhZGFwdGVyCisJCXBCdWZmZXIgCVBvaW50ZXIgdG8JbWVtb3J5IG9mIG91dGdvaW5nIGZyYW1lCisJCUxlbmd0aAkJU2l6ZSBvZiBvdXRnb2luZyBtYW5hZ2VtZW50IGZyYW1lCisKKwlSZXR1cm4gVmFsdWU6CisJCU5ESVNfU1RBVFVTX0ZBSUxVUkUKKwkJTkRJU19TVEFUVVNfUEVORElORworCQlORElTX1NUQVRVU19TVUNDRVNTCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK05ESVNfU1RBVFVTIE1sbWVIYXJkVHJhbnNtaXQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVUNIQVIJCQlRdWVJZHgsCisJSU4JUE5ESVNfUEFDS0VUCXBQYWNrZXQpCit7CisJaWYgKHBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJETW9kZSAhPSBSRF9OT1JNQUxfTU9ERSkKKwl7CisJCXJldHVybiBORElTX1NUQVRVU19GQUlMVVJFOworCX0KKworI2lmZGVmIFJUMjg2MAorCWlmICggcEFkLT5NQUNWZXJzaW9uID09IDB4Mjg2MDAxMDAgKQorCQlyZXR1cm4gTWxtZUhhcmRUcmFuc21pdFR4UmluZyhwQWQsUXVlSWR4LHBQYWNrZXQpOworCWVsc2UKKyNlbmRpZiAvLyBSVDI4NjAgLy8KKwkJcmV0dXJuIE1sbWVIYXJkVHJhbnNtaXRNZ210UmluZyhwQWQsUXVlSWR4LHBQYWNrZXQpOworCit9CisKKworI2lmZGVmIFJUMjg2MAorTkRJU19TVEFUVVMgTWxtZUhhcmRUcmFuc21pdFR4UmluZygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVQ0hBUglRdWVJZHgsCisJSU4JUE5ESVNfUEFDS0VUCXBQYWNrZXQpCit7CisJUEFDS0VUX0lORk8gCVBhY2tldEluZm87CisJUFVDSEFSCQkJcFNyY0J1ZlZBOworCVVJTlQJCQlTcmNCdWZMZW47CisJUFRYRF9TVFJVQwkJcFR4RDsKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisgICAgUFRYRF9TVFJVQyAgICAgIHBEZXN0VHhEOworICAgIFRYRF9TVFJVQyAgICAgICBUeEQ7CisjZW5kaWYKKwlQSEVBREVSXzgwMl8xMQlwSGVhZGVyXzgwMl8xMTsKKwlCT09MRUFOIAkJYkFja1JlcXVpcmVkLCBiSW5zZXJ0VGltZXN0YW1wOworCVVMT05HCQkJU3JjQnVmUEE7CisJVUNIQVIJCQlNbG1lUmF0ZTsKKwlVTE9ORwkJCVN3SWR4ID0gcEFkLT5UeFJpbmdbUXVlSWR4XS5UeENwdUlkeDsKKwlQVFhXSV9TVFJVQyAJcEZpcnN0VHhXSTsKKwlVTE9ORwkgRnJlZU51bTsKKwlNQUNfVEFCTEVfRU5UUlkJKnBNYWNFbnRyeSA9IE5VTEw7CisKKworCVJUTVBfUXVlcnlQYWNrZXRJbmZvKHBQYWNrZXQsICZQYWNrZXRJbmZvLCAmcFNyY0J1ZlZBLCAmU3JjQnVmTGVuKTsKKworCWlmIChwU3JjQnVmVkEgPT0gTlVMTCkKKwl7CisJCS8vIFRoZSBidWZmZXIgc2hvdWxkbid0IGJlIE5VTEwKKwkJcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkU7CisJfQorCisJLy8gTWFrZSBzdXJlIE1HTVQgcmluZyByZXNvdXJjZSB3b24ndCBiZSB1c2VkIGJ5IG90aGVyIHRocmVhZHMKKwkvL05kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+VHhSaW5nTG9jayk7CisKKwlGcmVlTnVtID0gR0VUX1RYUklOR19GUkVFTk8ocEFkLCBRdWVJZHgpOworCisJaWYgKEZyZWVOdW0gPT0gMCkKKwl7CisJCS8vTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5UeFJpbmdMb2NrKTsKKwkJcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkU7CisJfQorCisJU3dJZHggPSBwQWQtPlR4UmluZ1tRdWVJZHhdLlR4Q3B1SWR4OworCisjaWZuZGVmIFJUX0JJR19FTkRJQU4KKwlwVHhEICA9IChQVFhEX1NUUlVDKSBwQWQtPlR4UmluZ1tRdWVJZHhdLkNlbGxbU3dJZHhdLkFsbG9jVmE7CisjZWxzZQorICAgIHBEZXN0VHhEICA9IChQVFhEX1NUUlVDKXBBZC0+VHhSaW5nW1F1ZUlkeF0uQ2VsbFtTd0lkeF0uQWxsb2NWYTsKKyAgICBUeEQgPSAqcERlc3RUeEQ7CisgICAgcFR4RCA9ICZUeEQ7CisgICAgUlRNUERlc2NyaXB0b3JFbmRpYW5DaGFuZ2UoKFBVQ0hBUilwVHhELCBUWVBFX1RYRCk7CisjZW5kaWYKKworCWlmIChwQWQtPlR4UmluZ1tRdWVJZHhdLkNlbGxbU3dJZHhdLnBOZGlzUGFja2V0KQorCXsKKwkJcHJpbnRrKCJNbG1lSGFyZFRyYW5zbWl0IEVycm9yXG4iKTsKKwkJcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkU7CisJfQorCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCXsKKwkJLy8gb3V0Z29pbmcgZnJhbWUgYWx3YXlzIHdha2V1cCBQSFkgdG8gcHJldmVudCBmcmFtZSBsb3N0CisJCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0RPWkUpKQorCQkJQXNpY0ZvcmNlV2FrZXVwKHBBZCwgVFJVRSk7CisJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCXBGaXJzdFR4V0kJPShQVFhXSV9TVFJVQylwU3JjQnVmVkE7CisKKwlwSGVhZGVyXzgwMl8xMSA9IChQSEVBREVSXzgwMl8xMSkgKHBTcmNCdWZWQSArIFRYV0lfU0laRSk7CisJaWYgKHBIZWFkZXJfODAyXzExLT5BZGRyMVswXSAmIDB4MDEpCisJeworCQlNbG1lUmF0ZSA9IHBBZC0+Q29tbW9uQ2ZnLkJhc2ljTWxtZVJhdGU7CisJfQorCWVsc2UKKwl7CisJCU1sbWVSYXRlID0gcEFkLT5Db21tb25DZmcuTWxtZVJhdGU7CisJfQorCisJaWYgKChwSGVhZGVyXzgwMl8xMS0+RkMuVHlwZSA9PSBCVFlQRV9EQVRBKSAmJgorCQkocEhlYWRlcl84MDJfMTEtPkZDLlN1YlR5cGUgPT0gU1VCVFlQRV9RT1NfTlVMTCkpCisJeworCQlwTWFjRW50cnkgPSBNYWNUYWJsZUxvb2t1cChwQWQsIHBIZWFkZXJfODAyXzExLT5BZGRyMSk7CisJfQorCisJLy8gVmVyaWZ5IE1sbWUgcmF0ZSBmb3IgYSAvIGcgYmFuZHMuCisJaWYgKChwQWQtPkxhdGNoUmZSZWdzLkNoYW5uZWwgPiAxNCkgJiYgKE1sbWVSYXRlIDwgUkFURV82KSkgLy8gMTFBIGJhbmQKKwkJTWxtZVJhdGUgPSBSQVRFXzY7CisKKwkvLworCS8vIFNob3VsZCBub3QgYmUgaGFyZCBjb2RlIHRvIHNldCBQd3JNZ210IHRvIDAgKFBXUl9BQ1RJVkUpCisJLy8gU25pY2UgaXQncyBiZWVuIHNldCB0byAwIHdoaWxlIG9uIE1ndE1hY0hlYWRlckluaXQKKwkvLyBCeSB0aGUgd2F5IHRoaXMgd2lsbCBjYXVzZSBmcmFtZSB0byBiZSBzZW5kIG9uIFBXUl9TQVZFIGZhaWxlZC4KKwkvLworCS8vCisJLy8gSW4gV01NLVVBUFNELCBtbG1lIGZyYW1lIHNob3VsZCBiZSBzZXQgcHNtIGFzIHBvd2VyIHNhdmluZyBidXQgcHJvYmUgcmVxdWVzdCBmcmFtZQorI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorICAgIC8vIERhdGEtTnVsbCBwYWNrZXRzIGFsc2UgcGFzcyB0aHJvdWdoIE1NUmVxdWVzdCBpbiBSVDI4NjAsIGhvd2V2ZXIsIHdlIGhvcGUgY29udHJvbCB0aGUgcHNtIGJpdCB0byBwYXNzIEFQU0QKKwlpZiAocEhlYWRlcl84MDJfMTEtPkZDLlR5cGUgIT0gQlRZUEVfREFUQSkKKyAgICB7CisgICAgCWlmICgocEhlYWRlcl84MDJfMTEtPkZDLlN1YlR5cGUgPT0gU1VCVFlQRV9QUk9CRV9SRVEpIHx8ICEocEFkLT5Db21tb25DZmcuYkFQU0RDYXBhYmxlICYmIHBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uYkFQU0RDYXBhYmxlKSkKKyAgICAJeworICAgIAkJcEhlYWRlcl84MDJfMTEtPkZDLlB3ck1nbXQgPSBQV1JfQUNUSVZFOworICAgIAl9CisgICAgCWVsc2UKKyAgICAJeworICAgIAkJcEhlYWRlcl84MDJfMTEtPkZDLlB3ck1nbXQgPSBwQWQtPkNvbW1vbkNmZy5iQVBTREZvcmNlUG93ZXJTYXZlOworICAgIAl9CisgICAgfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJYkluc2VydFRpbWVzdGFtcCA9IEZBTFNFOworCWlmIChwSGVhZGVyXzgwMl8xMS0+RkMuVHlwZSA9PSBCVFlQRV9DTlRMKSAvLyBtdXN0IGJlIFBTLVBPTEwKKwl7CisJCWJBY2tSZXF1aXJlZCA9IEZBTFNFOworCX0KKwllbHNlIC8vIEJUWVBFX01HTVQgb3IgQlRZUEVfREFUQShtdXN0IGJlIE5VTEwgZnJhbWUpCisJeworCQlpZiAocEhlYWRlcl84MDJfMTEtPkFkZHIxWzBdICYgMHgwMSkgLy8gTVVMVElDQVNULCBCUk9BRENBU1QKKwkJeworCQkJYkFja1JlcXVpcmVkID0gRkFMU0U7CisJCQlwSGVhZGVyXzgwMl8xMS0+RHVyYXRpb24gPSAwOworCQl9CisJCWVsc2UKKwkJeworCQkJYkFja1JlcXVpcmVkID0gVFJVRTsKKwkJCXBIZWFkZXJfODAyXzExLT5EdXJhdGlvbiA9IFJUTVBDYWxjRHVyYXRpb24ocEFkLCBNbG1lUmF0ZSwgMTQpOworCQkJaWYgKHBIZWFkZXJfODAyXzExLT5GQy5TdWJUeXBlID09IFNVQlRZUEVfUFJPQkVfUlNQKQorCQkJeworCQkJCWJJbnNlcnRUaW1lc3RhbXAgPSBUUlVFOworCQkJfQorCQl9CisJfQorCXBIZWFkZXJfODAyXzExLT5TZXF1ZW5jZSA9IHBBZC0+U2VxdWVuY2UrKzsKKwlpZiAocEFkLT5TZXF1ZW5jZSA+IDB4ZmZmKQorCQlwQWQtPlNlcXVlbmNlID0gMDsKKwkvLyBCZWZvcmUgcmFkYXIgZGV0ZWN0aW9uIGRvbmUsIG1nbXQgZnJhbWUgY2FuIG5vdCBiZSBzZW50IGJ1dCBwcm9iZSByZXEKKwkvLyBCZWNhdXNlIHdlIG5lZWQgdG8gdXNlIHByb2JlIHJlcSB0byB0cmlnZ2VyIGRyaXZlciB0byBzZW5kIHByb2JlIHJlcSBpbiBwYXNzaXZlIHNjYW4KKwlpZiAoKHBIZWFkZXJfODAyXzExLT5GQy5TdWJUeXBlICE9IFNVQlRZUEVfUFJPQkVfUkVRKQorCQkmJiAocEFkLT5Db21tb25DZmcuYklFRUU4MDIxMUggPT0gMSkKKwkJJiYgKHBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJETW9kZSAhPSBSRF9OT1JNQUxfTU9ERSkpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIk1sbWVIYXJkVHJhbnNtaXQgLS0+IHJhZGFyIGRldGVjdCBub3QgaW4gbm9ybWFsIG1vZGUgISEhXG4iKSk7CisJCXJldHVybiAoTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJfQorCisjaWZkZWYgUlRfQklHX0VORElBTgorCVJUTVBGcmFtZUVuZGlhbkNoYW5nZShwQWQsIChQVUNIQVIpcEhlYWRlcl84MDJfMTEsIERJUl9XUklURSwgRkFMU0UpOworI2VuZGlmCisJLy8KKwkvLyBmaWxsIHNjYXR0ZXItYW5kLWdhdGhlciBidWZmZXIgbGlzdCBpbnRvIFRYRC4gSW50ZXJuYWxseSBjcmVhdGVkIE5ESVMgUEFDS0VUCisJLy8gc2hvdWxkIGFsd2F5cyBoYXMgb25seSBvbmUgb2h5c2ljYWwgYnVmZmVyLCBhbmQgdGhlIHdob2xlIGZyYW1lIHNpemUgZXF1YWxzCisJLy8gdG8gdGhlIGZpcnN0IHNjYXR0ZXIgYnVmZmVyIHNpemUKKwkvLworCisJLy8gSW5pdGlhbGl6ZSBUWCBEZXNjcmlwdG9yCisJLy8gRm9yIGludGVyLWZyYW1lIGdhcCwgdGhlIG51bWJlciBpcyBmb3IgdGhpcyBmcmFtZSBhbmQgbmV4dCBmcmFtZQorCS8vIEZvciBNTE1FIHJhdGUsIHdlIHdpbGwgZml4IGFzIDJNYiB0byBtYXRjaCBvdGhlciB2ZW5kb3IncyBpbXBsZW1lbnQKKworLy8gbWFuYWdlbWVudCBmcmFtZSBkb2Vzbid0IG5lZWQgZW5jcnlwdGlvbi4gc28gdXNlIFJFU0VSVkVEX1dDSUQgbm8gbWF0dGVyIHUgYXJlIHNlbmRpbmcgdG8gc3BlY2lmaWMgd2NpZCBvciBub3QuCisJLy8gT25seSBiZWFjb24gdXNlIE5zZXE9VFJVRS4gU28gaGVyZSB3ZSB1c2UgTnNlcT1GQUxTRS4KKwlpZiAocE1hY0VudHJ5ID09IE5VTEwpCisJeworCQlSVE1QV3JpdGVUeFdJKHBBZCwgcEZpcnN0VHhXSSwgRkFMU0UsIEZBTFNFLCBiSW5zZXJ0VGltZXN0YW1wLCBGQUxTRSwgYkFja1JlcXVpcmVkLCBGQUxTRSwKKwkJMCwgUkVTRVJWRURfV0NJRCwgKFNyY0J1ZkxlbiAtIFRYV0lfU0laRSksIFBJRF9NR01ULCAwLCAgKFVDSEFSKXBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NQ1MsIElGU19CQUNLT0ZGLCBGQUxTRSwgJnBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdCk7CisJfQorCWVsc2UKKwl7CisJCVJUTVBXcml0ZVR4V0kocEFkLCBwRmlyc3RUeFdJLCBGQUxTRSwgRkFMU0UsCisJCQkJCWJJbnNlcnRUaW1lc3RhbXAsIEZBTFNFLCBiQWNrUmVxdWlyZWQsIEZBTFNFLAorCQkJCQkwLCBwTWFjRW50cnktPkFpZCwgKFNyY0J1ZkxlbiAtIFRYV0lfU0laRSksCisJCQkJCXBNYWNFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1DUywgMCwKKwkJCQkJKFVDSEFSKXBNYWNFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1DUywKKwkJCQkJSUZTX0JBQ0tPRkYsIEZBTFNFLCAmcE1hY0VudHJ5LT5NYXhIVFBoeU1vZGUpOworCX0KKworCXBBZC0+VHhSaW5nW1F1ZUlkeF0uQ2VsbFtTd0lkeF0ucE5kaXNQYWNrZXQgPSBwUGFja2V0OworCXBBZC0+VHhSaW5nW1F1ZUlkeF0uQ2VsbFtTd0lkeF0ucE5leHROZGlzUGFja2V0ID0gTlVMTDsKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJUlRNUFdJRW5kaWFuQ2hhbmdlKChQVUNIQVIpcEZpcnN0VHhXSSwgVFlQRV9UWFdJKTsKKyNlbmRpZgorCVNyY0J1ZlBBID0gUENJX01BUF9TSU5HTEUocEFkLCBwU3JjQnVmVkEsIFNyY0J1ZkxlbiwgMCwgUENJX0RNQV9UT0RFVklDRSk7CisKKworCVJUTVBXcml0ZVR4RGVzY3JpcHRvcihwQWQsIHBUeEQsIFRSVUUsIEZJRk9fRURDQSk7CisJcFR4RC0+TGFzdFNlYzAgPSAxOworCXBUeEQtPkxhc3RTZWMxID0gMTsKKwlwVHhELT5TRExlbjAgPSBTcmNCdWZMZW47CisJcFR4RC0+U0RMZW4xID0gMDsKKwlwVHhELT5TRFB0cjAgPSBTcmNCdWZQQTsKKwlwVHhELT5ETUFET05FID0gMDsKKworI2lmZGVmIFJUX0JJR19FTkRJQU4KKyAgICBSVE1QRGVzY3JpcHRvckVuZGlhbkNoYW5nZSgoUFVDSEFSKXBUeEQsIFRZUEVfVFhEKTsKKyAgICBXcml0ZUJhY2tUb0Rlc2NyaXB0b3IoKFBVQ0hBUilwRGVzdFR4RCwgKFBVQ0hBUilwVHhELCBGQUxTRSwgVFlQRV9UWEQpOworI2VuZGlmCisKKwlwQWQtPlJhbGlua0NvdW50ZXJzLktpY2tUeENvdW50Kys7CisJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeERvbmVDb3VudCsrOworCisgICAJLy8gSW5jcmVhc2UgVFhfQ1RYX0lEWCwgYnV0IHdyaXRlIHRvIHJlZ2lzdGVyIGxhdGVyLgorCUlOQ19SSU5HX0lOREVYKHBBZC0+VHhSaW5nW1F1ZUlkeF0uVHhDcHVJZHgsIFRYX1JJTkdfU0laRSk7CisKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9DVFhfSURYMCArIFF1ZUlkeCoweDEwLCAgcEFkLT5UeFJpbmdbUXVlSWR4XS5UeENwdUlkeCk7CisKKwlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKK30KKyNlbmRpZiAvLyBSVDI4NjAgLy8KKworCitORElTX1NUQVRVUyBNbG1lSGFyZFRyYW5zbWl0TWdtdFJpbmcoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVUNIQVIJUXVlSWR4LAorCUlOCVBORElTX1BBQ0tFVAlwUGFja2V0KQoreworCVBBQ0tFVF9JTkZPIAlQYWNrZXRJbmZvOworCVBVQ0hBUgkJCXBTcmNCdWZWQTsKKwlVSU5UCQkJU3JjQnVmTGVuOworCVBIRUFERVJfODAyXzExCXBIZWFkZXJfODAyXzExOworCUJPT0xFQU4gCQliQWNrUmVxdWlyZWQsIGJJbnNlcnRUaW1lc3RhbXA7CisJVUNIQVIJCQlNbG1lUmF0ZTsKKwlQVFhXSV9TVFJVQyAJcEZpcnN0VHhXSTsKKwlNQUNfVEFCTEVfRU5UUlkJKnBNYWNFbnRyeSA9IE5VTEw7CisKKwlSVE1QX1F1ZXJ5UGFja2V0SW5mbyhwUGFja2V0LCAmUGFja2V0SW5mbywgJnBTcmNCdWZWQSwgJlNyY0J1Zkxlbik7CisJCVJUTVBfU0VNX0xPQ0soJnBBZC0+TWdtdFJpbmdMb2NrKTsKKworCisJaWYgKHBTcmNCdWZWQSA9PSBOVUxMKQorCXsKKwkJUlRNUF9TRU1fVU5MT0NLKCZwQWQtPk1nbXRSaW5nTG9jayk7CisJCXJldHVybiBORElTX1NUQVRVU19GQUlMVVJFOworCX0KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJeworCQkvLyBvdXRnb2luZyBmcmFtZSBhbHdheXMgd2FrZXVwIFBIWSB0byBwcmV2ZW50IGZyYW1lIGxvc3QKKwkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSkpCisJCQlBc2ljRm9yY2VXYWtldXAocEFkLCBUUlVFKTsKKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlwRmlyc3RUeFdJID0gKFBUWFdJX1NUUlVDKShwU3JjQnVmVkEgKyAgVFhJTkZPX1NJWkUpOworCXBIZWFkZXJfODAyXzExID0gKFBIRUFERVJfODAyXzExKSAocFNyY0J1ZlZBICsgVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkUpOyAvL1RYV0lfU0laRSk7CisKKwlpZiAocEhlYWRlcl84MDJfMTEtPkFkZHIxWzBdICYgMHgwMSkKKwl7CisJCU1sbWVSYXRlID0gcEFkLT5Db21tb25DZmcuQmFzaWNNbG1lUmF0ZTsKKwl9CisJZWxzZQorCXsKKwkJTWxtZVJhdGUgPSBwQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZTsKKwl9CisKKwkvLyBWZXJpZnkgTWxtZSByYXRlIGZvciBhIC8gZyBiYW5kcy4KKwlpZiAoKHBBZC0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbCA+IDE0KSAmJiAoTWxtZVJhdGUgPCBSQVRFXzYpKSAvLyAxMUEgYmFuZAorCQlNbG1lUmF0ZSA9IFJBVEVfNjsKKworCWlmICgocEhlYWRlcl84MDJfMTEtPkZDLlR5cGUgPT0gQlRZUEVfREFUQSkgJiYKKwkJKHBIZWFkZXJfODAyXzExLT5GQy5TdWJUeXBlID09IFNVQlRZUEVfUU9TX05VTEwpKQorCXsKKwkJcE1hY0VudHJ5ID0gTWFjVGFibGVMb29rdXAocEFkLCBwSGVhZGVyXzgwMl8xMS0+QWRkcjEpOworCX0KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJeworCQkvLyBGaXhlZCBXNTIgd2l0aCBBY3Rpdml0eSBzY2FuIGlzc3VlIGluIEFCR19NSVhFRCBhbmQgQUJHTl9NSVhFRCBtb2RlLgorCQlpZiAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFBQkdfTUlYRUQKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCXx8IHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQUJHTl9NSVhFRAorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQkpCisJCXsKKwkJCWlmIChwQWQtPkxhdGNoUmZSZWdzLkNoYW5uZWwgPiAxNCkKKwkJCQlwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTU9ERSA9IDE7CisJCQllbHNlCisJCQkJcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1PREUgPSAwOworCQl9CisJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJLy8KKwkvLyBTaG91bGQgbm90IGJlIGhhcmQgY29kZSB0byBzZXQgUHdyTWdtdCB0byAwIChQV1JfQUNUSVZFKQorCS8vIFNuaWNlIGl0J3MgYmVlbiBzZXQgdG8gMCB3aGlsZSBvbiBNZ3RNYWNIZWFkZXJJbml0CisJLy8gQnkgdGhlIHdheSB0aGlzIHdpbGwgY2F1c2UgZnJhbWUgdG8gYmUgc2VuZCBvbiBQV1JfU0FWRSBmYWlsZWQuCisJLy8KKwkvLyBwSGVhZGVyXzgwMl8xMS0+RkMuUHdyTWdtdCA9IDA7IC8vIChwQWQtPlN0YUNmZy5Qc20gPT0gUFdSX1NBVkUpOworCS8vCisJLy8gSW4gV01NLVVBUFNELCBtbG1lIGZyYW1lIHNob3VsZCBiZSBzZXQgcHNtIGFzIHBvd2VyIHNhdmluZyBidXQgcHJvYmUgcmVxdWVzdCBmcmFtZQorI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorICAgIC8vIERhdGEtTnVsbCBwYWNrZXRzIGFsc2UgcGFzcyB0aHJvdWdoIE1NUmVxdWVzdCBpbiBSVDI4NjAsIGhvd2V2ZXIsIHdlIGhvcGUgY29udHJvbCB0aGUgcHNtIGJpdCB0byBwYXNzIEFQU0QKKwlpZiAoKHBIZWFkZXJfODAyXzExLT5GQy5UeXBlICE9IEJUWVBFX0RBVEEpICYmIChwSGVhZGVyXzgwMl8xMS0+RkMuVHlwZSAhPSBCVFlQRV9DTlRMKSkKKwl7CisJCWlmICgocEFkLT5TdGFDZmcuUHNtID09IFBXUl9TQVZFKSAmJgorCQkJKHBIZWFkZXJfODAyXzExLT5GQy5TdWJUeXBlID09IFNVQlRZUEVfQUNUSU9OKSkKKwkJCXBIZWFkZXJfODAyXzExLT5GQy5Qd3JNZ210ID0gUFdSX1NBVkU7CisJCWVsc2UKKwkJCXBIZWFkZXJfODAyXzExLT5GQy5Qd3JNZ210ID0gUFdSX0FDVElWRTsKKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwliSW5zZXJ0VGltZXN0YW1wID0gRkFMU0U7CisJaWYgKHBIZWFkZXJfODAyXzExLT5GQy5UeXBlID09IEJUWVBFX0NOVEwpIC8vIG11c3QgYmUgUFMtUE9MTAorCXsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJLy9TZXQgUE0gYml0IGluIHBzLXBvbGwsIHRvIGZpeCBXTEsgMS4yICBQb3dlclNhdmVNb2RlX2V4dCBmYWlsdXJlIGlzc3VlLgorCQlpZiAoKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpICYmIChwSGVhZGVyXzgwMl8xMS0+RkMuU3ViVHlwZSA9PSBTVUJUWVBFX1BTX1BPTEwpKQorCQl7CisJCQlwSGVhZGVyXzgwMl8xMS0+RkMuUHdyTWdtdCA9IFBXUl9TQVZFOworCQl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJCWJBY2tSZXF1aXJlZCA9IEZBTFNFOworCX0KKwllbHNlIC8vIEJUWVBFX01HTVQgb3IgQlRZUEVfREFUQShtdXN0IGJlIE5VTEwgZnJhbWUpCisJeworCQlpZiAocEhlYWRlcl84MDJfMTEtPkFkZHIxWzBdICYgMHgwMSkgLy8gTVVMVElDQVNULCBCUk9BRENBU1QKKwkJeworCQkJYkFja1JlcXVpcmVkID0gRkFMU0U7CisJCQlwSGVhZGVyXzgwMl8xMS0+RHVyYXRpb24gPSAwOworCQl9CisJCWVsc2UKKwkJeworCQkJYkFja1JlcXVpcmVkID0gVFJVRTsKKwkJCXBIZWFkZXJfODAyXzExLT5EdXJhdGlvbiA9IFJUTVBDYWxjRHVyYXRpb24ocEFkLCBNbG1lUmF0ZSwgMTQpOworCQkJaWYgKHBIZWFkZXJfODAyXzExLT5GQy5TdWJUeXBlID09IFNVQlRZUEVfUFJPQkVfUlNQKQorCQkJeworCQkJCWJJbnNlcnRUaW1lc3RhbXAgPSBUUlVFOworCQkJfQorCQl9CisJfQorCisJcEhlYWRlcl84MDJfMTEtPlNlcXVlbmNlID0gcEFkLT5TZXF1ZW5jZSsrOworCWlmIChwQWQtPlNlcXVlbmNlID4weGZmZikKKwkJcEFkLT5TZXF1ZW5jZSA9IDA7CisKKwkvLyBCZWZvcmUgcmFkYXIgZGV0ZWN0aW9uIGRvbmUsIG1nbXQgZnJhbWUgY2FuIG5vdCBiZSBzZW50IGJ1dCBwcm9iZSByZXEKKwkvLyBCZWNhdXNlIHdlIG5lZWQgdG8gdXNlIHByb2JlIHJlcSB0byB0cmlnZ2VyIGRyaXZlciB0byBzZW5kIHByb2JlIHJlcSBpbiBwYXNzaXZlIHNjYW4KKwlpZiAoKHBIZWFkZXJfODAyXzExLT5GQy5TdWJUeXBlICE9IFNVQlRZUEVfUFJPQkVfUkVRKQorCQkmJiAocEFkLT5Db21tb25DZmcuYklFRUU4MDIxMUggPT0gMSkKKwkJJiYgKHBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJETW9kZSAhPSBSRF9OT1JNQUxfTU9ERSkpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIk1sbWVIYXJkVHJhbnNtaXQgLS0+IHJhZGFyIGRldGVjdCBub3QgaW4gbm9ybWFsIG1vZGUgISEhXG4iKSk7CisJCVJUTVBfU0VNX1VOTE9DSygmcEFkLT5NZ210UmluZ0xvY2spOworCQlyZXR1cm4gKE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCX0KKworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwlSVE1QRnJhbWVFbmRpYW5DaGFuZ2UocEFkLCAoUFVDSEFSKXBIZWFkZXJfODAyXzExLCBESVJfV1JJVEUsIEZBTFNFKTsKKyNlbmRpZgorCisJLy8KKwkvLyBmaWxsIHNjYXR0ZXItYW5kLWdhdGhlciBidWZmZXIgbGlzdCBpbnRvIFRYRC4gSW50ZXJuYWxseSBjcmVhdGVkIE5ESVMgUEFDS0VUCisJLy8gc2hvdWxkIGFsd2F5cyBoYXMgb25seSBvbmUgb2h5c2ljYWwgYnVmZmVyLCBhbmQgdGhlIHdob2xlIGZyYW1lIHNpemUgZXF1YWxzCisJLy8gdG8gdGhlIGZpcnN0IHNjYXR0ZXIgYnVmZmVyIHNpemUKKwkvLworCisJLy8gSW5pdGlhbGl6ZSBUWCBEZXNjcmlwdG9yCisJLy8gRm9yIGludGVyLWZyYW1lIGdhcCwgdGhlIG51bWJlciBpcyBmb3IgdGhpcyBmcmFtZSBhbmQgbmV4dCBmcmFtZQorCS8vIEZvciBNTE1FIHJhdGUsIHdlIHdpbGwgZml4IGFzIDJNYiB0byBtYXRjaCBvdGhlciB2ZW5kb3IncyBpbXBsZW1lbnQKKworLy8gbWFuYWdlbWVudCBmcmFtZSBkb2Vzbid0IG5lZWQgZW5jcnlwdGlvbi4gc28gdXNlIFJFU0VSVkVEX1dDSUQgbm8gbWF0dGVyIHUgYXJlIHNlbmRpbmcgdG8gc3BlY2lmaWMgd2NpZCBvciBub3QuCisJaWYgKHBNYWNFbnRyeSA9PSBOVUxMKQorCXsKKwkJUlRNUFdyaXRlVHhXSShwQWQsIHBGaXJzdFR4V0ksIEZBTFNFLCBGQUxTRSwgYkluc2VydFRpbWVzdGFtcCwgRkFMU0UsIGJBY2tSZXF1aXJlZCwgRkFMU0UsCisJCTAsIFJFU0VSVkVEX1dDSUQsIChTcmNCdWZMZW4gLSBUWElORk9fU0laRSAtIFRYV0lfU0laRSksIFBJRF9NR01ULCAwLCAgKFVDSEFSKXBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NQ1MsIElGU19CQUNLT0ZGLCBGQUxTRSwgJnBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdCk7CisJfQorCWVsc2UKKwl7CisJCVJUTVBXcml0ZVR4V0kocEFkLCBwRmlyc3RUeFdJLCBGQUxTRSwgRkFMU0UsCisJCQkJCWJJbnNlcnRUaW1lc3RhbXAsIEZBTFNFLCBiQWNrUmVxdWlyZWQsIEZBTFNFLAorCQkJCQkwLCBwTWFjRW50cnktPkFpZCwgKFNyY0J1ZkxlbiAtIFRYSU5GT19TSVpFIC0gVFhXSV9TSVpFKSwKKwkJCQkJcE1hY0VudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTUNTLCAwLAorCQkJCQkoVUNIQVIpcE1hY0VudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTUNTLAorCQkJCQlJRlNfQkFDS09GRiwgRkFMU0UsICZwTWFjRW50cnktPk1heEhUUGh5TW9kZSk7CisJfQorCisjaWZkZWYgUlRfQklHX0VORElBTgorCVJUTVBXSUVuZGlhbkNoYW5nZSgoUFVDSEFSKXBGaXJzdFR4V0ksIFRZUEVfVFhXSSk7CisjZW5kaWYKKworCS8vIE5vdyBkbyBoYXJkd2FyZS1kZXBlbmVkIGtpY2sgb3V0LgorCUhBTF9LaWNrT3V0TWdtdFR4KHBBZCwgUXVlSWR4LCBwUGFja2V0LCBwU3JjQnVmVkEsIFNyY0J1Zkxlbik7CisKKwkvLyBNYWtlIHN1cmUgdG8gcmVsZWFzZSBNR01UIHJpbmcgcmVzb3VyY2UKKwlSVE1QX1NFTV9VTkxPQ0soJnBBZC0+TWdtdFJpbmdMb2NrKTsKKwlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCU5ldyBEZVF1ZXVlIFByb2NlZHVyZXMuCisKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBERVFVRVVFX0xPQ0sobG9jaywgYkludENvbnRleHQsIElycUZsYWdzKSAJCQkJXAorCQkJZG97CQkJCQkJCQkJCQkJCVwKKwkJCQlpZiAoYkludENvbnRleHQgPT0gRkFMU0UpCQkJCQkJXAorCQkJCVJUTVBfSVJRX0xPQ0soKGxvY2spLCBJcnFGbGFncyk7CQlcCisJCQl9d2hpbGUoMCkKKworI2RlZmluZSBERVFVRVVFX1VOTE9DSyhsb2NrLCBiSW50Q29udGV4dCwgSXJxRmxhZ3MpCQkJCVwKKwkJCWRvewkJCQkJCQkJCQkJCQlcCisJCQkJaWYgKGJJbnRDb250ZXh0ID09IEZBTFNFKQkJCQkJCVwKKwkJCQkJUlRNUF9JUlFfVU5MT0NLKChsb2NrKSwgSXJxRmxhZ3MpOwlcCisJCQl9d2hpbGUoMCkKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlUeCBQYXRoIGRlc2lnbiBhbGdvcml0aG06CisJCUJhc2ljYWxseSwgd2UgZGl2aWRlIHRoZSBwYWNrZXRzIGludG8gZm91ciB0eXBlcywgQnJvYWRjYXN0L011bHRpY2FzdCwgMTFOIFJhdGUoQU1QRFUsIEFNU0RVLCBOb3JtYWwpLCBCL0cgUmF0ZShBUkFMSU5LLCBOb3JtYWwpLAorCQlTcGVjaWZpYyBQYWNrZXQgVHlwZS4gRm9sbG93aW5nIHNob3cgdGhlIGNsYXNzaWZpY2F0aW9uIHJ1bGUgYW5kIHBvbGljeSBmb3IgZWFjaCBraW5kcyBvZiBwYWNrZXRzLgorCQkJCUNsYXNzaWZpY2F0aW9uIFJ1bGU9PgorCQkJCQlNdWx0aWNhc3Q6ICgqYWRkcjEgJiAweDAxKSA9PSAweDAxCisJCQkJCVNwZWNpZmljIDogYkRIQ1BGcmFtZSwgYkFSUEZyYW1lLCBiRUFQT0xGcmFtZSwgZXRjLgorCQkJCQkxMU4gUmF0ZSA6IElmIHBlZXIgc3VwcG9ydCBIVAorCQkJCQkJCQkoMSkuQU1QRFUgIC0tIElmIFRYQkEgaXMgbmVnb3RpYXRlZC4KKwkJCQkJCQkJKDIpLkFNU0RVICAtLSBJZiBBTVNEVSBpcyBjYXBhYmxlIGZvciBib3RoIHBlZXIgYW5kIG91cnNlbGYuCisJCQkJCQkJCQkJCSopLiBBTVNEVSBjYW4gZW1iZWRkZWQgaW4gYSBBTVBEVSwgYnV0IG5vdyB3ZSBkaWRuJ3Qgc3VwcG9ydCBpdC4KKwkJCQkJCQkJKDMpLk5vcm1hbCAtLSBPdGhlciBwYWNrZXRzIHdoaWNoIHNlbmQgYXMgMTFuIHJhdGUuCisKKwkJCQkJQi9HIFJhdGUgOiBJZiBwZWVyIGlzIGIvZyBvbmx5LgorCQkJCQkJCQkoMSkuQVJBTElOSy0tIElmIGJvdGggb2YgcGVlci91cyBzdXBwcm90IFJhbGluayBwcm9wcmlldGFyeSBBZ2dyZWdhdGlvbiBhbmQgdGhlIFR4UmF0ZSBpcyBsYXJnZSB0aGFuIFJBVEVfNgorCQkJCQkJCQkoMikuTm9ybWFsIC0tIE90aGVyIHBhY2tldHMgd2hpY2ggc2VuZCBhcyBiL2cgcmF0ZS4KKwkJCQkJRnJhZ21lbnQ6CisJCQkJCQkJCVRoZSBwYWNrZXQgbXVzdCBiZSB1bmljYXN0LCBOT1QgQS1SQUxJTkssIE5PVCBBLU1TRFUsIE5PVCAxMW4sIHRoZW4gY2FuIGNvbnNpZGVyIGFib3V0IGZyYWdtZW50LgorCisJCQkJQ2xhc3NpZmllZCBQYWNrZXQgSGFuZGxlIFJ1bGU9PgorCQkJCQlNdWx0aWNhc3Q6CisJCQkJCQkJCU5vIEFDSywgCQkvL3BUeEJsay0+YkFja1JlcXVpcmVkID0gRkFMU0U7CisJCQkJCQkJCU5vIFdNTSwgCQkvL3BUeEJsay0+YldNTSA9IEZBTFNFOworCQkJCQkJCQlObyBwaWdneWJhY2ssICAgLy9wVHhCbGstPmJQaWdneUJhY2sgPSBGQUxTRTsKKwkJCQkJCQkJRm9yY2UgTG93UmF0ZSwgIC8vcFR4QmxrLT5iRm9yY2VMb3dSYXRlID0gVFJVRTsKKwkJCQkJU3BlY2lmaWMgOglCYXNpY2FsbHksIGZvciBzcGVjaWZpYyBwYWNrZXQsIHdlIHNob3VsZCBoYW5kbGUgaXQgc3BlY2lmaWNhbGx5LCBidXQgbm93IGFsbCBzcGVjaWZpYyBwYWNrZXRzIGFyZSB1c2UKKwkJCQkJCQkJCXRoZSBzYW1lIHBvbGljeSB0byBoYW5kbGUgaXQuCisJCQkJCQkJCUZvcmNlIExvd1JhdGUsICAvL3BUeEJsay0+YkZvcmNlTG93UmF0ZSA9IFRSVUU7CisKKwkJCQkJMTFOIFJhdGUgOgorCQkJCQkJCQlObyBwaWdneWJhY2ssCS8vcFR4QmxrLT5iUGlnZ3lCYWNrID0gRkFMU0U7CisKKwkJCQkJCQkJKDEpLkFNU0RVCisJCQkJCQkJCQlwVHhCbGstPmJXTU0gPSBUUlVFOworCQkJCQkJCQkoMikuQU1QRFUKKwkJCQkJCQkJCXBUeEJsay0+YldNTSA9IFRSVUU7CisJCQkJCQkJCSgzKS5Ob3JtYWwKKworCQkJCQlCL0cgUmF0ZSA6CisJCQkJCQkJCSgxKS5BUkFMSU5LCisKKwkJCQkJCQkJKDIpLk5vcm1hbAorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK3N0YXRpYyBVQ0hBUiBUeFBrdENsYXNzaWZpY2F0aW9uKAorCUlOIFJUTVBfQURBUFRFUiAqcEFkLAorCUlOIFBORElTX1BBQ0tFVCAgcFBhY2tldCkKK3sKKwlVQ0hBUgkJCVR4RnJhbWVUeXBlID0gVFhfVU5LT1dOX0ZSQU1FOworCVVDSEFSCQkJV2NpZDsKKwlNQUNfVEFCTEVfRU5UUlkJKnBNYWNFbnRyeSA9IE5VTEw7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJQk9PTEVBTgkJCWJIVFJhdGUgPSBGQUxTRTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCVdjaWQgPSBSVE1QX0dFVF9QQUNLRVRfV0NJRChwUGFja2V0KTsKKwlpZiAoV2NpZCA9PSBNQ0FTVF9XQ0lEKQorCXsJLy8gSGFuZGxlIGZvciBSQSBpcyBCcm9hZGNhc3QvTXVsdGljYXN0IEFkZHJlc3MuCisJCXJldHVybiBUWF9NQ0FTVF9GUkFNRTsKKwl9CisKKwkvLyBIYW5kbGUgZm9yIHVuaWNhc3QgcGFja2V0cworCXBNYWNFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W1djaWRdOworCWlmIChSVE1QX0dFVF9QQUNLRVRfTE9XUkFURShwUGFja2V0KSkKKwl7CS8vIEl0J3MgYSBzcGVjaWZpYyBwYWNrZXQgbmVlZCB0byBmb3JjZSBsb3cgcmF0ZSwgaS5lLiwgYkRIQ1BGcmFtZSwgYkVBUE9MRnJhbWUsIGJXQUlGcmFtZQorCQlUeEZyYW1lVHlwZSA9IFRYX0xFR0FDWV9GUkFNRTsKKwl9CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJZWxzZSBpZiAoSVNfSFRfUkFURShwTWFjRW50cnkpKQorCXsJLy8gaXQncyBhIDExbiBjYXBhYmxlIHBhY2tldAorCisJCS8vIERlcGVuZHMgb24gSFRQaHlNb2RlIHRvIGNoZWNrIGlmIHRoZSBwZWVyIHN1cHBvcnQgdGhlIEhUUmF0ZSB0cmFuc21pc3Npb24uCisJCS8vIAlDdXJyZW50bHkgZGlkbid0IHN1cHBvcnQgQS1NU0RVIGVtYmVkZGVkIGluIEEtTVBEVQorCQliSFRSYXRlID0gVFJVRTsKKwkJaWYgKFJUTVBfR0VUX1BBQ0tFVF9NT1JFREFUQShwUGFja2V0KSB8fCAocE1hY0VudHJ5LT5Qc01vZGUgPT0gUFdSX1NBVkUpKQorCQkJVHhGcmFtZVR5cGUgPSBUWF9MRUdBQ1lfRlJBTUU7CisjaWZkZWYgVUFQU0RfQVBfU1VQUE9SVAorCQllbHNlIGlmIChSVE1QX0dFVF9QQUNLRVRfRU9TUChwUGFja2V0KSkKKwkJCVR4RnJhbWVUeXBlID0gVFhfTEVHQUNZX0ZSQU1FOworI2VuZGlmIC8vIFVBUFNEX0FQX1NVUFBPUlQgLy8KKwkJZWxzZSBpZigocE1hY0VudHJ5LT5UWEJBYml0bWFwICYgKDE8PChSVE1QX0dFVF9QQUNLRVRfVVAocFBhY2tldCkpKSkgIT0gMCkKKwkJCXJldHVybiBUWF9BTVBEVV9GUkFNRTsKKwkJZWxzZSBpZihDTElFTlRfU1RBVFVTX1RFU1RfRkxBRyhwTWFjRW50cnksIGZDTElFTlRfU1RBVFVTX0FNU0RVX0lOVVNFRCkpCisJCQlyZXR1cm4gVFhfQU1TRFVfRlJBTUU7CisJCWVsc2UKKwkJCVR4RnJhbWVUeXBlID0gVFhfTEVHQUNZX0ZSQU1FOworCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwllbHNlCisJewkvLyBpdCdzIGEgbGVnYWN5IGIvZyBwYWNrZXQuCisJCWlmICgoQ0xJRU5UX1NUQVRVU19URVNUX0ZMQUcocE1hY0VudHJ5LCBmQ0xJRU5UX1NUQVRVU19BR0dSRUdBVElPTl9DQVBBQkxFKSAmJiBwQWQtPkNvbW1vbkNmZy5iQWdncmVnYXRpb25DYXBhYmxlKSAmJgorCQkJKFJUTVBfR0VUX1BBQ0tFVF9UWFJBVEUocFBhY2tldCkgPj0gUkFURV82KSAmJgorCQkJKCEoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19XTU1fSU5VU0VEKSAmJiBDTElFTlRfU1RBVFVTX1RFU1RfRkxBRyhwTWFjRW50cnksIGZDTElFTlRfU1RBVFVTX1dNTV9DQVBBQkxFKSkpKQorCQl7CS8vIGlmIHBlZXIgc3VwcG9ydCBSYWxpbmsgQWdncmVnYXRpb24sIHdlIHVzZSBpdC4KKwkJCVR4RnJhbWVUeXBlID0gVFhfUkFMSU5LX0ZSQU1FOworCQl9CisJCWVsc2UKKwkJeworCQkJVHhGcmFtZVR5cGUgPSBUWF9MRUdBQ1lfRlJBTUU7CisJCX0KKwl9CisKKwkvLyBDdXJyZW50bHksIG91ciBmcmFnbWVudCBvbmx5IHN1cHBvcnQgd2hlbiBhIHVuaWNhc3QgcGFja2V0IHNlbmQgYXMgTk9ULUFSQUxJTkssIE5PVC1BTVNEVSBhbmQgTk9ULUFNUERVLgorCWlmICgoUlRNUF9HRVRfUEFDS0VUX0ZSQUdNRU5UUyhwUGFja2V0KSA+IDEpICYmIChUeEZyYW1lVHlwZSA9PSBUWF9MRUdBQ1lfRlJBTUUpKQorCQlUeEZyYW1lVHlwZSA9IFRYX0ZSQUdfRlJBTUU7CisKKwlyZXR1cm4gVHhGcmFtZVR5cGU7Cit9CisKKworQk9PTEVBTiBSVE1QX0ZpbGxUeEJsa0luZm8oCisJSU4gUlRNUF9BREFQVEVSICpwQWQsCisJSU4gVFhfQkxLICpwVHhCbGspCit7CisJUEFDS0VUX0lORk8JCQlQYWNrZXRJbmZvOworCVBORElTX1BBQ0tFVAkJcFBhY2tldDsKKwlQTUFDX1RBQkxFX0VOVFJZCXBNYWNFbnRyeSA9IE5VTEw7CisKKwlwUGFja2V0ID0gcFR4QmxrLT5wUGFja2V0OworCVJUTVBfUXVlcnlQYWNrZXRJbmZvKHBQYWNrZXQsICZQYWNrZXRJbmZvLCAmcFR4QmxrLT5wU3JjQnVmSGVhZGVyLCAmcFR4QmxrLT5TcmNCdWZMZW4pOworCisJcFR4QmxrLT5XY2lkCSAJIAkJPSBSVE1QX0dFVF9QQUNLRVRfV0NJRChwUGFja2V0KTsKKwlwVHhCbGstPmFwaWR4CQkgCQk9IFJUTVBfR0VUX1BBQ0tFVF9JRihwUGFja2V0KTsKKwlwVHhCbGstPlVzZXJQcmlvcml0eSAJCT0gUlRNUF9HRVRfUEFDS0VUX1VQKHBQYWNrZXQpOworCXBUeEJsay0+RnJhbWVHYXAgPSBJRlNfSFRUWE9QOwkJLy8gQVNJQyBkZXRlcm1pbmUgRnJhbWUgR2FwCisKKwlpZiAoUlRNUF9HRVRfUEFDS0VUX0NMRUFSX0VBUF9GUkFNRShwVHhCbGstPnBQYWNrZXQpKQorCQlUWF9CTEtfU0VUX0ZMQUcocFR4QmxrLCBmVFhfYkNsZWFyRUFQRnJhbWUpOworCWVsc2UKKwkJVFhfQkxLX0NMRUFSX0ZMQUcocFR4QmxrLCBmVFhfYkNsZWFyRUFQRnJhbWUpOworCisJLy8gRGVmYXVsdCB0byBjbGVhciB0aGlzIGZsYWcKKwlUWF9CTEtfQ0xFQVJfRkxBRyhwVHhCbGssIGZUWF9iRm9yY2VOb25Rb1MpOworCisKKwlpZiAocFR4QmxrLT5XY2lkID09IE1DQVNUX1dDSUQpCisJeworCQlwVHhCbGstPnBNYWNFbnRyeSA9IE5VTEw7CisJCXsKKyNpZmRlZiBNQ0FTVF9SQVRFX1NQRUNJRklDCisJCQlQVUNIQVIgcERBID0gR0VUX09TX1BLVF9EQVRBUFRSKHBQYWNrZXQpOworCQkJaWYgKCgoKnBEQSAmIDB4MDEpID09IDB4MDEpICYmICgqcERBICE9IDB4ZmYpKQorCQkJCXBUeEJsay0+cFRyYW5zbWl0ID0gJnBBZC0+Q29tbW9uQ2ZnLk1DYXN0UGh5TW9kZTsKKwkJCWVsc2UKKyNlbmRpZiAvLyBNQ0FTVF9SQVRFX1NQRUNJRklDIC8vCisJCQkJcFR4QmxrLT5wVHJhbnNtaXQgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtNQ0FTVF9XQ0lEXS5IVFBoeU1vZGU7CisJCX0KKworCQlUWF9CTEtfQ0xFQVJfRkxBRyhwVHhCbGssIGZUWF9iQWNrUmVxdWlyZWQpOwkvLyBBY2tSZXF1aXJlZCA9IEZBTFNFLCB3aGVuIGJyb2FkY2FzdCBwYWNrZXQgaW4gQWRob2MgbW9kZS4KKwkJLy9UWF9CTEtfU0VUX0ZMQUcocFR4QmxrLCBmVFhfYkZvcmNlTG93UmF0ZSk7CisJCVRYX0JMS19DTEVBUl9GTEFHKHBUeEJsaywgZlRYX2JBbGxvd0ZyYWcpOworCQlUWF9CTEtfQ0xFQVJfRkxBRyhwVHhCbGssIGZUWF9iV01NKTsKKwkJaWYgKFJUTVBfR0VUX1BBQ0tFVF9NT1JFREFUQShwUGFja2V0KSkKKwkJeworCQkJVFhfQkxLX1NFVF9GTEFHKHBUeEJsaywgZlRYX2JNb3JlRGF0YSk7CisJCX0KKworCX0KKwllbHNlCisJeworCQlwVHhCbGstPnBNYWNFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W3BUeEJsay0+V2NpZF07CisJCXBUeEJsay0+cFRyYW5zbWl0ID0gJnBUeEJsay0+cE1hY0VudHJ5LT5IVFBoeU1vZGU7CisKKwkJcE1hY0VudHJ5ID0gcFR4QmxrLT5wTWFjRW50cnk7CisKKworCQkvLyBGb3IgYWxsIHVuaWNhc3QgcGFja2V0cywgbmVlZCBBY2sgdW5sZXNzIHRoZSBBY2sgUG9saWN5IGlzIG5vdCBzZXQgYXMgTk9STUFMX0FDSy4KKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkFja1BvbGljeVtwVHhCbGstPlF1ZUlkeF0gIT0gTk9STUFMX0FDSykKKwkJCVRYX0JMS19DTEVBUl9GTEFHKHBUeEJsaywgZlRYX2JBY2tSZXF1aXJlZCk7CisJCWVsc2UKKwkJCVRYX0JMS19TRVRfRkxBRyhwVHhCbGssIGZUWF9iQWNrUmVxdWlyZWQpOworCisJCXsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJCXsKKworCQkJCS8vIElmIHN1cHBvcnQgV01NLCBlbmFibGUgaXQuCisJCQkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfV01NX0lOVVNFRCkpCisJCQkJCVRYX0JMS19TRVRfRkxBRyhwVHhCbGssIGZUWF9iV01NKTsKKwkJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwkJfQorCisJCWlmIChwVHhCbGstPlR4RnJhbWVUeXBlID09IFRYX0xFR0FDWV9GUkFNRSkKKwkJeworCQkJaWYgKCAoUlRNUF9HRVRfUEFDS0VUX0xPV1JBVEUocFBhY2tldCkpIHx8CisgICAgICAgICAgICAgICAgKChwQWQtPk9wTW9kZSA9PSBPUE1PREVfQVApICYmIChwTWFjRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NT0RFID09IE1PREVfQ0NLKSAmJiAocE1hY0VudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTUNTID09IFJBVEVfMSkpKQorCQkJewkvLyBTcGVjaWZpYyBwYWNrZXQsIGkuZS4sIGJESENQRnJhbWUsIGJFQVBPTEZyYW1lLCBiV0FJRnJhbWUsIG5lZWQgZm9yY2UgbG93IHJhdGUuCisJCQkJcFR4QmxrLT5wVHJhbnNtaXQgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtNQ0FTVF9XQ0lEXS5IVFBoeU1vZGU7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQkJLy8gTW9kaWZ5IHRoZSBXTU0gYml0IGZvciBJQ1YgaXNzdWUuIElmIHdlIGhhdmUgYSBwYWNrZXQgd2l0aCBFT1NQIGZpZWxkIG5lZWQgdG8gc2V0IGFzIDEsIGhvdyB0byBoYW5kbGUgaXQ/Pz8KKwkJCQlpZiAoSVNfSFRfU1RBKHBUeEJsay0+cE1hY0VudHJ5KSAmJgorCQkJCQkoQ0xJRU5UX1NUQVRVU19URVNUX0ZMQUcocE1hY0VudHJ5LCBmQ0xJRU5UX1NUQVRVU19SQUxJTktfQ0hJUFNFVCkpICYmCisJCQkJCSgocEFkLT5Db21tb25DZmcuYlJkZyA9PSBUUlVFKSAmJiBDTElFTlRfU1RBVFVTX1RFU1RfRkxBRyhwTWFjRW50cnksIGZDTElFTlRfU1RBVFVTX1JER19DQVBBQkxFKSkpCisJCQkJeworCQkJCQlUWF9CTEtfQ0xFQVJfRkxBRyhwVHhCbGssIGZUWF9iV01NKTsKKwkJCQkJVFhfQkxLX1NFVF9GTEFHKHBUeEJsaywgZlRYX2JGb3JjZU5vblFvUyk7CisJCQkJfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQkJfQorCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQlpZiAoIChJU19IVF9SQVRFKHBNYWNFbnRyeSkgPT0gRkFMU0UpICYmCisJCQkJKENMSUVOVF9TVEFUVVNfVEVTVF9GTEFHKHBNYWNFbnRyeSwgZkNMSUVOVF9TVEFUVVNfUElHR1lCQUNLX0NBUEFCTEUpKSkKKwkJCXsJLy8gQ3VycmVudGx5IHBpZ2d5LWJhY2sgb25seSBzdXBwb3J0IHdoZW4gcGVlciBpcyBvcGVyYXRlIGluIGIvZyBtb2RlLgorCQkJCVRYX0JMS19TRVRfRkxBRyhwVHhCbGssIGZUWF9iUGlnZ3lCYWNrKTsKKwkJCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCQkJaWYgKFJUTVBfR0VUX1BBQ0tFVF9NT1JFREFUQShwUGFja2V0KSkKKwkJCXsKKwkJCQlUWF9CTEtfU0VUX0ZMQUcocFR4QmxrLCBmVFhfYk1vcmVEYXRhKTsKKwkJCX0KKyNpZmRlZiBVQVBTRF9BUF9TVVBQT1JUCisJCQlpZiAoUlRNUF9HRVRfUEFDS0VUX0VPU1AocFBhY2tldCkpCisJCQl7CisJCQkJVFhfQkxLX1NFVF9GTEFHKHBUeEJsaywgZlRYX2JXTU1fVUFQU0RfRU9TUCk7CisJCQl9CisjZW5kaWYgLy8gVUFQU0RfQVBfU1VQUE9SVCAvLworCQl9CisJCWVsc2UgaWYgKHBUeEJsay0+VHhGcmFtZVR5cGUgPT0gVFhfRlJBR19GUkFNRSkKKwkJeworCQkJVFhfQkxLX1NFVF9GTEFHKHBUeEJsaywgZlRYX2JBbGxvd0ZyYWcpOworCQl9CisKKwkJcE1hY0VudHJ5LT5EZWJ1Z1R4Q291bnQrKzsKKwl9CisKKwlyZXR1cm4gVFJVRTsKK30KKworCitCT09MRUFOIENhbkRvQWdncmVnYXRlVHJhbnNtaXQoCisJSU4gUlRNUF9BREFQVEVSICpwQWQsCisJSU4gTkRJU19QQUNLRVQgKnBQYWNrZXQsCisJSU4gVFhfQkxLCQkqcFR4QmxrKQoreworCisJLy9wcmludGsoIkNoZWNrIGlmIGNhbiBkbyBhZ2dyZWdhdGlvbiEgVHhGcmFtZVR5cGU9JWQhXG4iLCBwVHhCbGstPlR4RnJhbWVUeXBlKTsKKworCWlmIChSVE1QX0dFVF9QQUNLRVRfV0NJRChwUGFja2V0KSA9PSBNQ0FTVF9XQ0lEKQorCQlyZXR1cm4gRkFMU0U7CisKKwlpZiAoUlRNUF9HRVRfUEFDS0VUX0RIQ1AocFBhY2tldCkgfHwKKwkJUlRNUF9HRVRfUEFDS0VUX0VBUE9MKHBQYWNrZXQpIHx8CisJCVJUTVBfR0VUX1BBQ0tFVF9XQUkocFBhY2tldCkpCisJCXJldHVybiBGQUxTRTsKKworCWlmICgocFR4QmxrLT5UeEZyYW1lVHlwZSA9PSBUWF9BTVNEVV9GUkFNRSkgJiYKKwkJKChwVHhCbGstPlRvdGFsRnJhbWVMZW4gKyBHRVRfT1NfUEtUX0xFTihwUGFja2V0KSk+IChSWF9CVUZGRVJfQUdHUkVTSVpFIC0gMTAwKSkpCisJewkvLyBGb3IgQU1TRFUsIGFsbG93IHRoZSBwYWNrZXRzIHdpdGggdG90YWwgbGVuZ3RoIDwgbWF4LWFtc2R1IHNpemUKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCWlmICgocFR4QmxrLT5UeEZyYW1lVHlwZSA9PSBUWF9SQUxJTktfRlJBTUUpICYmCisJCShwVHhCbGstPlR4UGFja2V0TGlzdC5OdW1iZXIgPT0gMikpCisJewkvLyBGb3IgUkFMSU5LLUFnZ3JlZ2F0aW9uLCBhbGxvdyB0d28gZnJhbWVzIGluIG9uZSBiYXRjaC4KKwkJcmV0dXJuIEZBTFNFOworCX0KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCWlmICgoSU5GUkFfT04ocEFkKSkgJiYgKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpKSAvLyBtdXN0IGJlIHVuaWNhc3QgdG8gQVAKKwkJcmV0dXJuIFRSVUU7CisJZWxzZQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCQlyZXR1cm4gRkFMU0U7CisKK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJVG8gZG8gdGhlIGVucXVldWUgb3BlcmF0aW9uIGFuZCBleHRyYWN0IHRoZSBmaXJzdCBpdGVtIG9mIHdhaXRpbmcKKwkJbGlzdC4gSWYgYSBudW1iZXIgb2YgYXZhaWxhYmxlIHNoYXJlZCBtZW1vcnkgc2VnbWVudHMgY291bGQgbWVldAorCQl0aGUgcmVxdWVzdCBvZiBleHRyYWN0ZWQgaXRlbSwgdGhlIGV4dHJhY3RlZCBpdGVtIHdpbGwgYmUgZnJhZ21lbnRlZAorCQlpbnRvIHNoYXJlZCBtZW1vcnkgc2VnbWVudHMuCisKKwlBcmd1bWVudHM6CisJCXBBZCBQb2ludGVyIHRvIG91ciBhZGFwdGVyCisJCXBRdWV1ZQkJUG9pbnRlciB0byBXYWl0aW5nIFF1ZXVlCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgUlRNUERlUXVldWVQYWNrZXQoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIEJPT0xFQU4gICAgICAgICBiSW50Q29udGV4dCwKKwlJTiAgVUNIQVIJCQlRSWR4LCAvKiBCdWxrT3V0UGlwZUlkICovCisJSU4gIFVDSEFSICAgICAgICAgICBNYXhfVHhfUGFja2V0cykKK3sKKwlQUVVFVUVfRU5UUlkgICAgcEVudHJ5ID0gTlVMTDsKKwlQTkRJU19QQUNLRVQgCXBQYWNrZXQ7CisJTkRJU19TVEFUVVMgICAgIFN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisJVUNIQVIgICAgICAgICAgIENvdW50PTA7CisJUFFVRVVFX0hFQURFUiAgIHBRdWV1ZTsKKwlVTE9ORyAgICAgICAgICAgRnJlZU51bWJlcltOVU1fT0ZfVFhfUklOR107CisJVUNIQVIJCQlRdWVJZHgsIHNRSWR4LCBlUUlkeDsKKwl1bnNpZ25lZCBsb25nCUlycUZsYWdzID0gMDsKKwlCT09MRUFOCQkJaGFzVHhEZXNjID0gRkFMU0U7CisJVFhfQkxLCQkJVHhCbGs7CisJVFhfQkxLCQkJKnBUeEJsazsKKworI2lmZGVmIERCR19ESUFHTk9TRQorCUJPT0xFQU4JCQlmaXJzdFJvdW5kOworCVJ0bXBEaWFnU3RydWN0CSpwRGlhZ1N0cnVjdCA9ICZwQWQtPkRpYWdTdHJ1Y3Q7CisjZW5kaWYKKworCisJaWYgKFFJZHggPT0gTlVNX09GX1RYX1JJTkcpCisJeworCQlzUUlkeCA9IDA7CisJCWVRSWR4ID0gMzsJLy8gNCBBQ3MsIHN0YXJ0IGZyb20gMC4KKwl9CisJZWxzZQorCXsKKwkJc1FJZHggPSBlUUlkeCA9IFFJZHg7CisJfQorCisJZm9yIChRdWVJZHg9c1FJZHg7IFF1ZUlkeCA8PSBlUUlkeDsgUXVlSWR4KyspCisJeworCQlDb3VudD0wOworCisJCVJUMjhYWF9TVEFSVF9ERVFVRVVFKHBBZCwgUXVlSWR4LCBJcnFGbGFncyk7CisKKyNpZmRlZiBEQkdfRElBR05PU0UKKwkJZmlyc3RSb3VuZCA9ICgoUXVlSWR4ID09IDApID8gVFJVRSA6IEZBTFNFKTsKKyNlbmRpZiAvLyBEQkdfRElBR05PU0UgLy8KKworCQl3aGlsZSAoMSkKKwkJeworCQkJaWYgKChSVE1QX1RFU1RfRkxBRyhwQWQsIChmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTIHwKKwkJCQkJCQkJCQlmUlRNUF9BREFQVEVSX1JBRElPX09GRiB8CisJCQkJCQkJCQkJZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUyB8CisJCQkJCQkJCQkJZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwKKwkJCQkJCQkJCQlmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSkpCisJCQl7CisJCQkJUlQyOFhYX1NUT1BfREVRVUVVRShwQWQsIFF1ZUlkeCwgSXJxRmxhZ3MpOworCQkJCXJldHVybjsKKwkJCX0KKworCQkJaWYgKENvdW50ID49IE1heF9UeF9QYWNrZXRzKQorCQkJCWJyZWFrOworCisJCQlERVFVRVVFX0xPQ0soJnBBZC0+aXJxX2xvY2ssIGJJbnRDb250ZXh0LCBJcnFGbGFncyk7CisJCQlpZiAoJnBBZC0+VHhTd1F1ZXVlW1F1ZUlkeF0gPT0gTlVMTCkKKwkJCXsKKyNpZmRlZiBEQkdfRElBR05PU0UKKwkJCQlpZiAoZmlyc3RSb3VuZCA9PSBUUlVFKQorCQkJCQlwRGlhZ1N0cnVjdC0+VHhTV1F1ZUNudFtwRGlhZ1N0cnVjdC0+QXJyYXlDdXJJZHhdWzBdKys7CisjZW5kaWYgLy8gREJHX0RJQUdOT1NFIC8vCisJCQkJREVRVUVVRV9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIGJJbnRDb250ZXh0LCBJcnFGbGFncyk7CisJCQkJYnJlYWs7CisJCQl9CisKKyNpZmRlZiBSVDI4NjAKKwkJCUZyZWVOdW1iZXJbUXVlSWR4XSA9IEdFVF9UWFJJTkdfRlJFRU5PKHBBZCwgUXVlSWR4KTsKKworI2lmZGVmIERCR19ESUFHTk9TRQorCQkJaWYgKGZpcnN0Um91bmQgPT0gVFJVRSkKKwkJCXsKKwkJCQlVQ0hBUgl0eERlc2NOdW1MZXZlbCwgdHhTd1FOdW1MZXZlbDsKKworCQkJCXR4RGVzY051bUxldmVsID0gKFRYX1JJTkdfU0laRSAtIEZyZWVOdW1iZXJbUXVlSWR4XSk7IC8vIE51bWJlciBvZiBvY2N1cGllZCBodyBkZXNjLgorCQkJCXR4RGVzY051bUxldmVsID0gKCh0eERlc2NOdW1MZXZlbCA8PTE1KSA/IHR4RGVzY051bUxldmVsIDogMTUpOworCQkJCXBEaWFnU3RydWN0LT5UeERlc2NDbnRbcERpYWdTdHJ1Y3QtPkFycmF5Q3VySWR4XVt0eERlc2NOdW1MZXZlbF0rKzsKKworCQkJCXR4U3dRTnVtTGV2ZWwgPSAoKHBBZC0+VHhTd1F1ZXVlW1F1ZUlkeF0uTnVtYmVyIDw9NykgPyBwQWQtPlR4U3dRdWV1ZVtRdWVJZHhdLk51bWJlciA6IDgpOworCQkJCXBEaWFnU3RydWN0LT5UeFNXUXVlQ250W3BEaWFnU3RydWN0LT5BcnJheUN1cklkeF1bdHhTd1FOdW1MZXZlbF0rKzsKKworCQkJCWZpcnN0Um91bmQgPSBGQUxTRTsKKwkJCX0KKyNlbmRpZiAvLyBEQkdfRElBR05PU0UgLy8KKworCQkJaWYgKEZyZWVOdW1iZXJbUXVlSWR4XSA8PSA1KQorCQkJeworCQkJCS8vIGZyZWUgVHgoUXVlSWR4KSByZXNvdXJjZXMKKwkJCQlSVE1QRnJlZVRYRFVwb25UeERtYURvbmUocEFkLCBRdWVJZHgpOworCQkJCUZyZWVOdW1iZXJbUXVlSWR4XSA9IEdFVF9UWFJJTkdfRlJFRU5PKHBBZCwgUXVlSWR4KTsKKwkJCX0KKyNlbmRpZiAvLyBSVDI4NjAgLy8KKworCQkJLy8gcHJvYmUgdGhlIFF1ZXVlIEhlYWQKKwkJCXBRdWV1ZSA9ICZwQWQtPlR4U3dRdWV1ZVtRdWVJZHhdOworCQkJaWYgKChwRW50cnkgPSBwUXVldWUtPkhlYWQpID09IE5VTEwpCisJCQl7CisJCQkJREVRVUVVRV9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIGJJbnRDb250ZXh0LCBJcnFGbGFncyk7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCXBUeEJsayA9ICZUeEJsazsKKwkJCU5kaXNaZXJvTWVtb3J5KChQVUNIQVIpcFR4QmxrLCBzaXplb2YoVFhfQkxLKSk7CisJCQlwVHhCbGstPlF1ZUlkeCA9IFF1ZUlkeDsKKworCQkJcFBhY2tldCA9IFFVRVVFX0VOVFJZX1RPX1BLVChwRW50cnkpOworCisJCQkvLyBFYXJseSBjaGVjayB0byBtYWtlIHN1cmUgd2UgaGF2ZSBlbm9ndWggVHggUmVzb3VyY2UuCisJCQloYXNUeERlc2MgPSBSVDI4WFhfSEFTX0VOT1VHSF9GUkVFX0RFU0MocEFkLCBwVHhCbGssIEZyZWVOdW1iZXJbUXVlSWR4XSwgcFBhY2tldCk7CisJCQlpZiAoIWhhc1R4RGVzYykKKwkJCXsKKwkJCQlwQWQtPlByaXZhdGVJbmZvLlR4UmluZ0Z1bGxDbnQrKzsKKworCQkJCURFUVVFVUVfVU5MT0NLKCZwQWQtPmlycV9sb2NrLCBiSW50Q29udGV4dCwgSXJxRmxhZ3MpOworCisJCQkJYnJlYWs7CisJCQl9CisKKwkJCXBUeEJsay0+VHhGcmFtZVR5cGUgPSBUeFBrdENsYXNzaWZpY2F0aW9uKHBBZCwgcFBhY2tldCk7CisJCQlwRW50cnkgPSBSZW1vdmVIZWFkUXVldWUocFF1ZXVlKTsKKwkJCXBUeEJsay0+VG90YWxGcmFtZU51bSsrOworCQkJcFR4QmxrLT5Ub3RhbEZyYWdOdW0gKz0gUlRNUF9HRVRfUEFDS0VUX0ZSQUdNRU5UUyhwUGFja2V0KTsJLy8gVGhlIHJlYWwgZnJhZ21lbnQgbnVtYmVyIG1heWJlIHZhcnkKKwkJCXBUeEJsay0+VG90YWxGcmFtZUxlbiArPSBHRVRfT1NfUEtUX0xFTihwUGFja2V0KTsKKwkJCXBUeEJsay0+cFBhY2tldCA9IHBQYWNrZXQ7CisJCQlJbnNlcnRUYWlsUXVldWUoJnBUeEJsay0+VHhQYWNrZXRMaXN0LCBQQUNLRVRfVE9fUVVFVUVfRU5UUlkocFBhY2tldCkpOworCisJCQlpZiAocFR4QmxrLT5UeEZyYW1lVHlwZSA9PSBUWF9SQUxJTktfRlJBTUUgfHwgcFR4QmxrLT5UeEZyYW1lVHlwZSA9PSBUWF9BTVNEVV9GUkFNRSkKKwkJCXsKKwkJCQkvLyBFbmhhbmNlIFNXIEFnZ3JlZ2F0aW9uIE1lY2hhbmlzbQorCQkJCWlmIChORUVEX1FVRVVFX0JBQ0tfRk9SX0FHRyhwQWQsIFF1ZUlkeCwgRnJlZU51bWJlcltRdWVJZHhdLCBwVHhCbGstPlR4RnJhbWVUeXBlKSkKKwkJCQl7CisJCQkJCUluc2VydEhlYWRRdWV1ZShwUXVldWUsIFBBQ0tFVF9UT19RVUVVRV9FTlRSWShwUGFja2V0KSk7CisJCQkJCURFUVVFVUVfVU5MT0NLKCZwQWQtPmlycV9sb2NrLCBiSW50Q29udGV4dCwgSXJxRmxhZ3MpOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQlkb3sKKwkJCQkJaWYoKHBFbnRyeSA9IHBRdWV1ZS0+SGVhZCkgPT0gTlVMTCkKKwkJCQkJCWJyZWFrOworCisJCQkJCS8vIEZvciBUWF9BTVNEVV9GUkFNRS9UWF9SQUxJTktfRlJBTUUsIE5lZWQgdG8gY2hlY2sgaWYgbmV4dCBwYWtjZXQgY2FuIGRvIGFnZ3JlZ2F0aW9uLgorCQkJCQlwUGFja2V0ID0gUVVFVUVfRU5UUllfVE9fUEtUKHBFbnRyeSk7CisJCQkJCUZyZWVOdW1iZXJbUXVlSWR4XSA9IEdFVF9UWFJJTkdfRlJFRU5PKHBBZCwgUXVlSWR4KTsKKwkJCQkJaGFzVHhEZXNjID0gUlQyOFhYX0hBU19FTk9VR0hfRlJFRV9ERVNDKHBBZCwgcFR4QmxrLCBGcmVlTnVtYmVyW1F1ZUlkeF0sIHBQYWNrZXQpOworCQkJCQlpZiAoKGhhc1R4RGVzYyA9PSBGQUxTRSkgfHwgKENhbkRvQWdncmVnYXRlVHJhbnNtaXQocEFkLCBwUGFja2V0LCBwVHhCbGspID09IEZBTFNFKSkKKwkJCQkJCWJyZWFrOworCisJCQkJCS8vUmVtb3ZlIHRoZSBwYWNrZXQgZnJvbSB0aGUgVHhTd1F1ZXVlIGFuZCBpbnNlcnQgaW50byBwVHhCbGsKKwkJCQkJcEVudHJ5ID0gUmVtb3ZlSGVhZFF1ZXVlKHBRdWV1ZSk7CisJCQkJCUFTU0VSVChwRW50cnkpOworCQkJCQlwUGFja2V0ID0gUVVFVUVfRU5UUllfVE9fUEtUKHBFbnRyeSk7CisJCQkJCXBUeEJsay0+VG90YWxGcmFtZU51bSsrOworCQkJCQlwVHhCbGstPlRvdGFsRnJhZ051bSArPSBSVE1QX0dFVF9QQUNLRVRfRlJBR01FTlRTKHBQYWNrZXQpOwkvLyBUaGUgcmVhbCBmcmFnbWVudCBudW1iZXIgbWF5YmUgdmFyeQorCQkJCQlwVHhCbGstPlRvdGFsRnJhbWVMZW4gKz0gR0VUX09TX1BLVF9MRU4ocFBhY2tldCk7CisJCQkJCUluc2VydFRhaWxRdWV1ZSgmcFR4QmxrLT5UeFBhY2tldExpc3QsIFBBQ0tFVF9UT19RVUVVRV9FTlRSWShwUGFja2V0KSk7CisJCQkJfXdoaWxlKDEpOworCisJCQkJaWYgKHBUeEJsay0+VHhQYWNrZXRMaXN0Lk51bWJlciA9PSAxKQorCQkJCQlwVHhCbGstPlR4RnJhbWVUeXBlID0gVFhfTEVHQUNZX0ZSQU1FOworCQkJfQorCisKKwkJCUNvdW50ICs9IHBUeEJsay0+VHhQYWNrZXRMaXN0Lk51bWJlcjsKKworCQkJCS8vIERvIEhhcmRUcmFuc21pdCBub3cuCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQkJCVN0YXR1cyA9IFNUQUhhcmRUcmFuc21pdChwQWQsIHBUeEJsaywgUXVlSWR4KTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworI2lmZGVmIFJUMjg2MAorCQkJREVRVUVVRV9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIGJJbnRDb250ZXh0LCBJcnFGbGFncyk7CisJCQkvLyBzdGF0aWMgcmF0ZSBhbHNvIG5lZWQgTklDVXBkYXRlRmlmb1N0YUNvdW50ZXJzKCkgZnVuY3Rpb24uCisJCQkvL2lmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1RYX1JBVEVfU1dJVENIX0VOQUJMRUQpKQorCQkJCU5JQ1VwZGF0ZUZpZm9TdGFDb3VudGVycyhwQWQpOworI2VuZGlmIC8vIFJUMjg2MCAvLworCQl9CisKKwkJUlQyOFhYX1NUT1BfREVRVUVVRShwQWQsIFF1ZUlkeCwgSXJxRmxhZ3MpOworCisKKyNpZmRlZiBCTE9DS19ORVRfSUYKKwkJaWYgKChwQWQtPmJsb2NrUXVldWVUYWJbUXVlSWR4XS5Td1R4UXVldWVCbG9ja0ZsYWcgPT0gVFJVRSkKKwkJCSYmIChwQWQtPlR4U3dRdWV1ZVtRdWVJZHhdLk51bWJlciA8IDEpKQorCQl7CisJCQlyZWxlYXNlTmV0SWYoJnBBZC0+YmxvY2tRdWV1ZVRhYltRdWVJZHhdKTsKKwkJfQorI2VuZGlmIC8vIEJMT0NLX05FVF9JRiAvLworCisJfQorCit9CisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCUNhbGN1bGF0ZXMgdGhlIGR1cmF0aW9uIHdoaWNoIGlzIHJlcXVpcmVkIHRvIHRyYW5zbWl0IG91dCBmcmFtZXMKKwl3aXRoIGdpdmVuIHNpemUgYW5kIHNwZWNpZmllZCByYXRlLgorCisJQXJndW1lbnRzOgorCQlwQWQgCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKwkJUmF0ZQkJCVRyYW5zbWl0IHJhdGUKKwkJU2l6ZQkJCUZyYW1lIHNpemUgaW4gdW5pdHMgb2YgYnl0ZQorCisJUmV0dXJuIFZhbHVlOgorCQlEdXJhdGlvbiBudW1iZXIgaW4gdW5pdHMgb2YgdXNlYworCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitVU0hPUlQJUlRNUENhbGNEdXJhdGlvbigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVQ0hBUgkJCVJhdGUsCisJSU4JVUxPTkcJCQlTaXplKQoreworCVVMT05HCUR1cmF0aW9uID0gMDsKKworCWlmIChSYXRlIDwgUkFURV9GSVJTVF9PRkRNX1JBVEUpIC8vIENDSworCXsKKwkJaWYgKChSYXRlID4gUkFURV8xKSAmJiBPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1NIT1JUX1BSRUFNQkxFX0lOVVNFRCkpCisJCQlEdXJhdGlvbiA9IDk2OwkvLyA3MisyNCBwcmVhbWJsZStwbGNwCisJCWVsc2UKKwkJCUR1cmF0aW9uID0gMTkyOyAvLyAxNDQrNDggcHJlYW1ibGUrcGxjcAorCisJCUR1cmF0aW9uICs9IChVU0hPUlQpKChTaXplIDw8IDQpIC8gUmF0ZUlkVG81MDBLYnBzW1JhdGVdKTsKKwkJaWYgKChTaXplIDw8IDQpICUgUmF0ZUlkVG81MDBLYnBzW1JhdGVdKQorCQkJRHVyYXRpb24gKys7CisJfQorCWVsc2UgaWYgKFJhdGUgPD0gUkFURV9MQVNUX09GRE1fUkFURSkvLyBPRkRNIHJhdGVzCisJeworCQlEdXJhdGlvbiA9IDIwICsgNjsJCS8vIDE2KzQgcHJlYW1ibGUrcGxjcCArIFNpZ25hbCBFeHRlbnNpb24KKwkJRHVyYXRpb24gKz0gNCAqIChVU0hPUlQpKCgxMSArIFNpemUgKiA0KSAvIFJhdGVJZFRvNTAwS2Jwc1tSYXRlXSk7CisJCWlmICgoMTEgKyBTaXplICogNCkgJSBSYXRlSWRUbzUwMEticHNbUmF0ZV0pCisJCQlEdXJhdGlvbiArPSA0OworCX0KKwllbHNlCS8vbWltbyByYXRlCisJeworCQlEdXJhdGlvbiA9IDIwICsgNjsJCS8vIDE2KzQgcHJlYW1ibGUrcGxjcCArIFNpZ25hbCBFeHRlbnNpb24KKwl9CisKKwlyZXR1cm4gKFVTSE9SVClEdXJhdGlvbjsKK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJQ2FsY3VsYXRlcyB0aGUgZHVyYXRpb24gd2hpY2ggaXMgcmVxdWlyZWQgdG8gdHJhbnNtaXQgb3V0IGZyYW1lcworCXdpdGggZ2l2ZW4gc2l6ZSBhbmQgc3BlY2lmaWVkIHJhdGUuCisKKwlBcmd1bWVudHM6CisJCXBUeFdJCQlQb2ludGVyIHRvIGhlYWQgb2YgZWFjaCBNUERVIHRvIEhXLgorCQlBY2sgCQlTZXR0aW5nIGZvciBBY2sgcmVxdWlyZW1lbnQgYml0CisJCUZyYWdtZW50CVNldHRpbmcgZm9yIEZyYWdtZW50IGJpdAorCQlSZXRyeU1vZGUJU2V0dGluZyBmb3IgcmV0cnkgbW9kZQorCQlJZnMgCQlTZXR0aW5nIGZvciBJRlMgZ2FwCisJCVJhdGUJCVNldHRpbmcgZm9yIHRyYW5zbWl0IHJhdGUKKwkJU2VydmljZSAJU2V0dGluZyBmb3Igc2VydmljZQorCQlMZW5ndGgJCUZyYW1lIGxlbmd0aAorCQlUeFByZWFtYmxlCVNob3J0IG9yIExvbmcgcHJlYW1ibGUgd2hlbiB1c2luZyBDQ0sgcmF0ZXMKKwkJUXVlSWR4IC0gMC0zLCBhY2NvcmRpbmcgdG8gODAyLjExZS9kNC40IEp1bmUvMjAwMworCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisgICAgU2VlIGFsc28gOiBCQVNtYXJ0SGFyZFRyYW5zbWl0KCkgICAgISEhCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIFJUTVBXcml0ZVR4V0koCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFRYV0lfU1RSVUMgCXBPdXRUeFdJLAorCUlOCUJPT0xFQU4JCQlGUkFHLAorCUlOCUJPT0xFQU4JCQlDRkFDSywKKwlJTglCT09MRUFOCQkJSW5zVGltZXN0YW1wLAorCUlOCUJPT0xFQU4gCQlBTVBEVSwKKwlJTglCT09MRUFOIAkJQWNrLAorCUlOCUJPT0xFQU4gCQlOU2VxLAkJLy8gSFcgbmV3IGEgc2VxdWVuY2UuCisJSU4JVUNIQVIJCQlCQVNpemUsCisJSU4JVUNIQVIJCQlXQ0lELAorCUlOCVVMT05HCQkJTGVuZ3RoLAorCUlOCVVDSEFSIAkJCVBJRCwKKwlJTglVQ0hBUgkJCVRJRCwKKwlJTglVQ0hBUgkJCVR4UmF0ZSwKKwlJTglVQ0hBUgkJCVR4b3Btb2RlLAorCUlOCUJPT0xFQU4JCQlDZkFjaywKKwlJTglIVFRSQU5TTUlUX1NFVFRJTkcJKnBUcmFuc21pdCkKK3sKKwlQTUFDX1RBQkxFX0VOVFJZCXBNYWMgPSBOVUxMOworCVRYV0lfU1RSVUMgCQlUeFdJOworCVBUWFdJX1NUUlVDIAlwVHhXSTsKKworCWlmIChXQ0lEIDwgTUFYX0xFTl9PRl9NQUNfVEFCTEUpCisJCXBNYWMgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtXQ0lEXTsKKworCS8vCisJLy8gQWx3YXlzIHVzZSBMb25nIHByZWFtYmxlIGJlZm9yZSB2ZXJpZmlhdGlvbiBzaG9ydCBwcmVhbWJsZSBmdW5jdGlvbmFsaXR5IHdvcmtzIHdlbGwuCisJLy8gVG9kbzogcmVtb3ZlIHRoZSBmb2xsb3dpbmcgbGluZSBpZiBzaG9ydCBwcmVhbWJsZSBmdW5jdGlvbmFsaXR5IHdvcmtzCisJLy8KKwlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19TSE9SVF9QUkVBTUJMRV9JTlVTRUQpOworCU5kaXNaZXJvTWVtb3J5KCZUeFdJLCBUWFdJX1NJWkUpOworCXBUeFdJID0gJlR4V0k7CisKKwlwVHhXSS0+RlJBRz0gRlJBRzsKKworCXBUeFdJLT5DRkFDSyA9IENGQUNLOworCXBUeFdJLT5UUz0gSW5zVGltZXN0YW1wOworCXBUeFdJLT5BTVBEVSA9IEFNUERVOworCXBUeFdJLT5BQ0sgPSBBY2s7CisJcFR4V0ktPnR4b3A9IFR4b3Btb2RlOworCisJcFR4V0ktPk5TRVEgPSBOU2VxOworCS8vIEpvaG4gdHVuZSB0aGUgcGVyZm9ybWFjZSB3aXRoIEludGVsIENsaWVudCBpbiAyMCBNSHogcGVyZm9ybWFuY2UKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwlCQVNpemUgPSBwQWQtPkNvbW1vbkNmZy5UeEJBU2l6ZTsKKworCWlmKCBCQVNpemUgPjcgKQorCQlCQVNpemUgPTc7CisJcFR4V0ktPkJBV2luU2l6ZSA9IEJBU2l6ZTsKKwlwVHhXSS0+U2hvcnRHSSA9IHBUcmFuc21pdC0+ZmllbGQuU2hvcnRHSTsKKwlwVHhXSS0+U1RCQyA9IHBUcmFuc21pdC0+ZmllbGQuU1RCQzsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCXBUeFdJLT5XaXJlbGVzc0NsaUlEID0gV0NJRDsKKwlwVHhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50ID0gTGVuZ3RoOworCXBUeFdJLT5QYWNrZXRJZCA9IFBJRDsKKworCS8vIElmIENDSyBvciBPRkRNLCBCVyBtdXN0IGJlIDIwCisJcFR4V0ktPkJXID0gKHBUcmFuc21pdC0+ZmllbGQuTU9ERSA8PSBNT0RFX09GRE0pID8gKEJXXzIwKSA6IChwVHJhbnNtaXQtPmZpZWxkLkJXKTsKKyNpZmRlZiBET1QxMU5fRFJBRlQzCisJaWYgKHBUeFdJLT5CVykKKwkJcFR4V0ktPkJXID0gKHBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mby5BZGRIdEluZm8uUmVjb21XaWR0aCA9PSAwKSA/IChCV18yMCkgOiAocFRyYW5zbWl0LT5maWVsZC5CVyk7CisjZW5kaWYgLy8gRE9UMTFOX0RSQUZUMyAvLworCisJcFR4V0ktPk1DUyA9IHBUcmFuc21pdC0+ZmllbGQuTUNTOworCXBUeFdJLT5QSFlNT0RFID0gcFRyYW5zbWl0LT5maWVsZC5NT0RFOworCXBUeFdJLT5DRkFDSyA9IENmQWNrOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJaWYgKHBNYWMpCisJeworCQlpZiAocEFkLT5Db21tb25DZmcuYk1JTU9QU0VuYWJsZSkKKwkJeworCQkJaWYgKChwTWFjLT5NbXBzTW9kZSA9PSBNTVBTX0RZTkFNSUMpICYmIChwVHJhbnNtaXQtPmZpZWxkLk1DUyA+IDcpKQorCQkJeworCQkJCS8vIER5bmFtaWMgTUlNTyBQb3dlciBTYXZlIE1vZGUKKwkJCQlwVHhXSS0+TUlNT3BzID0gMTsKKwkJCX0KKwkJCWVsc2UgaWYgKHBNYWMtPk1tcHNNb2RlID09IE1NUFNfU1RBVElDKQorCQkJeworCQkJCS8vIFN0YXRpYyBNSU1PIFBvd2VyIFNhdmUgTW9kZQorCQkJCWlmIChwVHJhbnNtaXQtPmZpZWxkLk1PREUgPj0gTU9ERV9IVE1JWCAmJiBwVHJhbnNtaXQtPmZpZWxkLk1DUyA+IDcpCisJCQkJeworCQkJCQlwVHhXSS0+TUNTID0gNzsKKwkJCQkJcFR4V0ktPk1JTU9wcyA9IDA7CisJCQkJfQorCQkJfQorCQl9CisJCS8vcFR4V0ktPk1JTU9wcyA9IChwTWFjLT5Qc01vZGUgPT0gUFdSX01NUFMpPyAxOjA7CisJCWlmIChwTWFjLT5iSUFtQmFkQXRoZXJvcyAmJiAocE1hYy0+V2VwU3RhdHVzICE9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZCkpCisJCXsKKwkJCXBUeFdJLT5NcGR1RGVuc2l0eSA9IDc7CisJCX0KKwkJZWxzZQorCQl7CisJCQlwVHhXSS0+TXBkdURlbnNpdHkgPSBwTWFjLT5NcGR1RGVuc2l0eTsKKwkJfQorCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCXBUeFdJLT5QYWNrZXRJZCA9IHBUeFdJLT5NQ1M7CisJTmRpc01vdmVNZW1vcnkocE91dFR4V0ksICZUeFdJLCBzaXplb2YoVFhXSV9TVFJVQykpOworfQorCisKK1ZPSUQgUlRNUFdyaXRlVHhXSV9EYXRhKAorCUlOCVBSVE1QX0FEQVBURVIJCXBBZCwKKwlJTglPVVQgUFRYV0lfU1RSVUMJCXBUeFdJLAorCUlOCVRYX0JMSwkJCQkqcFR4QmxrKQoreworCUhUVFJBTlNNSVRfU0VUVElORwkqcFRyYW5zbWl0OworCVBNQUNfVEFCTEVfRU5UUlkJcE1hY0VudHJ5OworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCVVDSEFSCQkJCUJBU2l6ZTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCisJQVNTRVJUKHBUeFdJKTsKKworCXBUcmFuc21pdCA9IHBUeEJsay0+cFRyYW5zbWl0OworCXBNYWNFbnRyeSA9IHBUeEJsay0+cE1hY0VudHJ5OworCisKKwkvLworCS8vIEFsd2F5cyB1c2UgTG9uZyBwcmVhbWJsZSBiZWZvcmUgdmVyaWZpYXRpb24gc2hvcnQgcHJlYW1ibGUgZnVuY3Rpb25hbGl0eSB3b3JrcyB3ZWxsLgorCS8vIFRvZG86IHJlbW92ZSB0aGUgZm9sbG93aW5nIGxpbmUgaWYgc2hvcnQgcHJlYW1ibGUgZnVuY3Rpb25hbGl0eSB3b3JrcworCS8vCisJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfU0hPUlRfUFJFQU1CTEVfSU5VU0VEKTsKKwlOZGlzWmVyb01lbW9yeShwVHhXSSwgVFhXSV9TSVpFKTsKKworCXBUeFdJLT5GUkFHCQk9IFRYX0JMS19URVNUX0ZMQUcocFR4QmxrLCBmVFhfYkFsbG93RnJhZyk7CisJcFR4V0ktPkFDSwkJPSBUWF9CTEtfVEVTVF9GTEFHKHBUeEJsaywgZlRYX2JBY2tSZXF1aXJlZCk7CisJcFR4V0ktPnR4b3AJCT0gcFR4QmxrLT5GcmFtZUdhcDsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCWlmIChwTWFjRW50cnkgJiYKKwkJKHBBZC0+U3RhQ2ZnLkJzc1R5cGUgPT0gQlNTX0lORlJBKSAmJgorCQkocE1hY0VudHJ5LT5WYWxpZEFzRGxzID09IFRSVUUpKQorCQlwVHhXSS0+V2lyZWxlc3NDbGlJRCA9IEJTU0lEX1dDSUQ7CisJZWxzZQorI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCQlwVHhXSS0+V2lyZWxlc3NDbGlJRAkJPSBwVHhCbGstPldjaWQ7CisKKwlwVHhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50CT0gcFR4QmxrLT5NcGR1SGVhZGVyTGVuICsgcFR4QmxrLT5TcmNCdWZMZW47CisJcFR4V0ktPkNGQUNLCQkJCT0gVFhfQkxLX1RFU1RfRkxBRyhwVHhCbGssIGZUWF9iUGlnZ3lCYWNrKTsKKworCS8vIElmIENDSyBvciBPRkRNLCBCVyBtdXN0IGJlIDIwCisJcFR4V0ktPkJXID0gKHBUcmFuc21pdC0+ZmllbGQuTU9ERSA8PSBNT0RFX09GRE0pID8gKEJXXzIwKSA6IChwVHJhbnNtaXQtPmZpZWxkLkJXKTsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKyNpZmRlZiBET1QxMU5fRFJBRlQzCisJaWYgKHBUeFdJLT5CVykKKwkJcFR4V0ktPkJXID0gKHBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mby5BZGRIdEluZm8uUmVjb21XaWR0aCA9PSAwKSA/IChCV18yMCkgOiAocFRyYW5zbWl0LT5maWVsZC5CVyk7CisjZW5kaWYgLy8gRE9UMTFOX0RSQUZUMyAvLworCXBUeFdJLT5BTVBEVQk9ICgocFR4QmxrLT5UeEZyYW1lVHlwZSA9PSBUWF9BTVBEVV9GUkFNRSkgPyBUUlVFIDogRkFMU0UpOworCisJLy8gSm9obiB0dW5lIHRoZSBwZXJmb3JtYWNlIHdpdGggSW50ZWwgQ2xpZW50IGluIDIwIE1IeiBwZXJmb3JtYW5jZQorCUJBU2l6ZSA9IHBBZC0+Q29tbW9uQ2ZnLlR4QkFTaXplOworCWlmKChwVHhCbGstPlR4RnJhbWVUeXBlID09IFRYX0FNUERVX0ZSQU1FKSAmJiAocE1hY0VudHJ5KSkKKwl7CisJCVVDSEFSCQlSQUJBT3JpSWR4ID0gMDsJLy9UaGUgUkEncyBCQSBPcmlnaW5hdG9yIHRhYmxlIGluZGV4LgorCisJCVJBQkFPcmlJZHggPSBwVHhCbGstPnBNYWNFbnRyeS0+QkFPcmlXY2lkQXJyYXlbcFR4QmxrLT5Vc2VyUHJpb3JpdHldOworCQlCQVNpemUgPSBwQWQtPkJBVGFibGUuQkFPcmlFbnRyeVtSQUJBT3JpSWR4XS5CQVdpblNpemU7CisJfQorCisJcFR4V0ktPlR4QkYgPSBwVHJhbnNtaXQtPmZpZWxkLlR4QkY7CisJcFR4V0ktPkJBV2luU2l6ZSA9IEJBU2l6ZTsKKwlwVHhXSS0+U2hvcnRHSSA9IHBUcmFuc21pdC0+ZmllbGQuU2hvcnRHSTsKKwlwVHhXSS0+U1RCQyA9IHBUcmFuc21pdC0+ZmllbGQuU1RCQzsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCXBUeFdJLT5NQ1MgPSBwVHJhbnNtaXQtPmZpZWxkLk1DUzsKKwlwVHhXSS0+UEhZTU9ERSA9IHBUcmFuc21pdC0+ZmllbGQuTU9ERTsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCWlmIChwTWFjRW50cnkpCisJeworCQlpZiAoKHBNYWNFbnRyeS0+TW1wc01vZGUgPT0gTU1QU19EWU5BTUlDKSAmJiAocFRyYW5zbWl0LT5maWVsZC5NQ1MgPiA3KSkKKwkJeworCQkJLy8gRHluYW1pYyBNSU1PIFBvd2VyIFNhdmUgTW9kZQorCQkJcFR4V0ktPk1JTU9wcyA9IDE7CisJCX0KKwkJZWxzZSBpZiAocE1hY0VudHJ5LT5NbXBzTW9kZSA9PSBNTVBTX1NUQVRJQykKKwkJeworCQkJLy8gU3RhdGljIE1JTU8gUG93ZXIgU2F2ZSBNb2RlCisJCQlpZiAocFRyYW5zbWl0LT5maWVsZC5NT0RFID49IE1PREVfSFRNSVggJiYgcFRyYW5zbWl0LT5maWVsZC5NQ1MgPiA3KQorCQkJeworCQkJCXBUeFdJLT5NQ1MgPSA3OworCQkJCXBUeFdJLT5NSU1PcHMgPSAwOworCQkJfQorCQl9CisKKwkJaWYgKHBNYWNFbnRyeS0+YklBbUJhZEF0aGVyb3MgJiYgKHBNYWNFbnRyeS0+V2VwU3RhdHVzICE9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZCkpCisJCXsKKwkJCXBUeFdJLT5NcGR1RGVuc2l0eSA9IDc7CisJCX0KKwkJZWxzZQorCQl7CisJCQlwVHhXSS0+TXBkdURlbnNpdHkgPSBwTWFjRW50cnktPk1wZHVEZW5zaXR5OworCQl9CisJfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisjaWZkZWYgREJHX0RJQUdOT1NFCisJCWlmIChwVHhCbGstPlF1ZUlkeD09IDApCisJCXsKKwkJCXBBZC0+RGlhZ1N0cnVjdC5UeERhdGFDbnRbcEFkLT5EaWFnU3RydWN0LkFycmF5Q3VySWR4XSsrOworCQkJcEFkLT5EaWFnU3RydWN0LlR4TWNzQ250W3BBZC0+RGlhZ1N0cnVjdC5BcnJheUN1cklkeF1bcFR4V0ktPk1DU10rKzsKKwkJfQorI2VuZGlmIC8vIERCR19ESUFHTk9TRSAvLworCisJLy8gZm9yIHJhdGUgYWRhcGF0aW9uCisJcFR4V0ktPlBhY2tldElkID0gcFR4V0ktPk1DUzsKK30KKworCitWT0lEIFJUTVBXcml0ZVR4V0lfQ2FjaGUoCisJSU4JUFJUTVBfQURBUFRFUgkJcEFkLAorCUlOCU9VVCBQVFhXSV9TVFJVQwkJcFR4V0ksCisJSU4JVFhfQkxLCQkJCSpwVHhCbGspCit7CisJUEhUVFJBTlNNSVRfU0VUVElORwlwVHJhbnNtaXQ7CisJUE1BQ19UQUJMRV9FTlRSWQlwTWFjRW50cnk7CisKKwkvLworCS8vIHVwZGF0ZSBUWFdJCisJLy8KKwlwTWFjRW50cnkgPSBwVHhCbGstPnBNYWNFbnRyeTsKKwlwVHJhbnNtaXQgPSBwVHhCbGstPnBUcmFuc21pdDsKKworCWlmIChwTWFjRW50cnktPmJBdXRvVHhSYXRlU3dpdGNoKQorCXsKKwkJcFR4V0ktPnR4b3AgPSBJRlNfSFRUWE9QOworCisJCS8vIElmIENDSyBvciBPRkRNLCBCVyBtdXN0IGJlIDIwCisJCXBUeFdJLT5CVyA9IChwVHJhbnNtaXQtPmZpZWxkLk1PREUgPD0gTU9ERV9PRkRNKSA/IChCV18yMCkgOiAocFRyYW5zbWl0LT5maWVsZC5CVyk7CisJCXBUeFdJLT5TaG9ydEdJID0gcFRyYW5zbWl0LT5maWVsZC5TaG9ydEdJOworCQlwVHhXSS0+U1RCQyA9IHBUcmFuc21pdC0+ZmllbGQuU1RCQzsKKworCQlwVHhXSS0+TUNTID0gcFRyYW5zbWl0LT5maWVsZC5NQ1M7CisJCXBUeFdJLT5QSFlNT0RFID0gcFRyYW5zbWl0LT5maWVsZC5NT0RFOworCisJCS8vIHNldCBQSUQgZm9yIFR4UmF0ZVN3aXRjaGluZworCQlwVHhXSS0+UGFja2V0SWQgPSBwVHJhbnNtaXQtPmZpZWxkLk1DUzsKKwl9CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwlwVHhXSS0+QU1QRFUgPSAoKHBNYWNFbnRyeS0+Tm9CQURhdGFDb3VudERvd24gPT0gMCkgPyBUUlVFOiBGQUxTRSk7CisJcFR4V0ktPk1JTU9wcyA9IDA7CisKKyNpZmRlZiBET1QxMU5fRFJBRlQzCisJaWYgKHBUeFdJLT5CVykKKwkJcFR4V0ktPkJXID0gKHBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mby5BZGRIdEluZm8uUmVjb21XaWR0aCA9PSAwKSA/IChCV18yMCkgOiAocFRyYW5zbWl0LT5maWVsZC5CVyk7CisjZW5kaWYgLy8gRE9UMTFOX0RSQUZUMyAvLworCisJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJNSU1PUFNFbmFibGUpCisJeworCQkvLyBNSU1PIFBvd2VyIFNhdmUgTW9kZQorCQlpZiAoKHBNYWNFbnRyeS0+TW1wc01vZGUgPT0gTU1QU19EWU5BTUlDKSAmJiAocFRyYW5zbWl0LT5maWVsZC5NQ1MgPiA3KSkKKwkJeworCQkJLy8gRHluYW1pYyBNSU1PIFBvd2VyIFNhdmUgTW9kZQorCQkJcFR4V0ktPk1JTU9wcyA9IDE7CisJCX0KKwkJZWxzZSBpZiAocE1hY0VudHJ5LT5NbXBzTW9kZSA9PSBNTVBTX1NUQVRJQykKKwkJeworCQkJLy8gU3RhdGljIE1JTU8gUG93ZXIgU2F2ZSBNb2RlCisJCQlpZiAoKHBUcmFuc21pdC0+ZmllbGQuTU9ERSA+PSBNT0RFX0hUTUlYKSAmJiAocFRyYW5zbWl0LT5maWVsZC5NQ1MgPiA3KSkKKwkJCXsKKwkJCQlwVHhXSS0+TUNTID0gNzsKKwkJCQlwVHhXSS0+TUlNT3BzID0gMDsKKwkJCX0KKwkJfQorCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworI2lmZGVmIERCR19ESUFHTk9TRQorCWlmIChwVHhCbGstPlF1ZUlkeD09IDApCisJeworCQlwQWQtPkRpYWdTdHJ1Y3QuVHhEYXRhQ250W3BBZC0+RGlhZ1N0cnVjdC5BcnJheUN1cklkeF0rKzsKKwkJcEFkLT5EaWFnU3RydWN0LlR4TWNzQ250W3BBZC0+RGlhZ1N0cnVjdC5BcnJheUN1cklkeF1bcFR4V0ktPk1DU10rKzsKKwl9CisjZW5kaWYgLy8gREJHX0RJQUdOT1NFIC8vCisKKwlwVHhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50ID0gcFR4QmxrLT5NcGR1SGVhZGVyTGVuICsgcFR4QmxrLT5TcmNCdWZMZW47CisKK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJQ2FsY3VsYXRlcyB0aGUgZHVyYXRpb24gd2hpY2ggaXMgcmVxdWlyZWQgdG8gdHJhbnNtaXQgb3V0IGZyYW1lcworCXdpdGggZ2l2ZW4gc2l6ZSBhbmQgc3BlY2lmaWVkIHJhdGUuCisKKwlBcmd1bWVudHM6CisJCXBUeEQJCVBvaW50ZXIgdG8gdHJhbnNtaXQgZGVzY3JpcHRvcgorCQlBY2sgCQlTZXR0aW5nIGZvciBBY2sgcmVxdWlyZW1lbnQgYml0CisJCUZyYWdtZW50CVNldHRpbmcgZm9yIEZyYWdtZW50IGJpdAorCQlSZXRyeU1vZGUJU2V0dGluZyBmb3IgcmV0cnkgbW9kZQorCQlJZnMgCQlTZXR0aW5nIGZvciBJRlMgZ2FwCisJCVJhdGUJCVNldHRpbmcgZm9yIHRyYW5zbWl0IHJhdGUKKwkJU2VydmljZSAJU2V0dGluZyBmb3Igc2VydmljZQorCQlMZW5ndGgJCUZyYW1lIGxlbmd0aAorCQlUeFByZWFtYmxlCVNob3J0IG9yIExvbmcgcHJlYW1ibGUgd2hlbiB1c2luZyBDQ0sgcmF0ZXMKKwkJUXVlSWR4IC0gMC0zLCBhY2NvcmRpbmcgdG8gODAyLjExZS9kNC40IEp1bmUvMjAwMworCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBSVE1QV3JpdGVUeERlc2NyaXB0b3IoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFRYRF9TVFJVQwkJcFR4RCwKKwlJTglCT09MRUFOIAkJYldJViwKKwlJTglVQ0hBUgkJCVF1ZXVlU0VMKQoreworCS8vCisJLy8gQWx3YXlzIHVzZSBMb25nIHByZWFtYmxlIGJlZm9yZSB2ZXJpZmlhdGlvbiBzaG9ydCBwcmVhbWJsZSBmdW5jdGlvbmFsaXR5IHdvcmtzIHdlbGwuCisJLy8gVG9kbzogcmVtb3ZlIHRoZSBmb2xsb3dpbmcgbGluZSBpZiBzaG9ydCBwcmVhbWJsZSBmdW5jdGlvbmFsaXR5IHdvcmtzCisJLy8KKwlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19TSE9SVF9QUkVBTUJMRV9JTlVTRUQpOworCisJcFR4RC0+V0lWCT0gKGJXSVYpID8gMTogMDsKKwlwVHhELT5RU0VMPSAoUXVldWVTRUwpOworCWlmIChwQWQtPmJHZW5PbmVIQ0NBID09IFRSVUUpCisJCXBUeEQtPlFTRUw9IEZJRk9fSENDQTsKKwlwVHhELT5ETUFET05FID0gMDsKK30KKworCisvLyBzaG91bGQgYmUgY2FsbGVkIG9ubHkgd2hlbiAtCisvLyAxLiBNRUFESUFfQ09OTkVDVEVECisvLyAyLiBBR0dSRUdBVElPTl9JTl9VU0VECisvLyAzLiBGcmFnbWVudGF0aW9uIG5vdCBpbiB1c2VkCisvLyA0LiBlaXRoZXIgbm8gcHJldmlvdXMgZnJhbWUgKHBQcmV2QWRkcjE9TlVMTCkgLk9SLiBwcmV2aW91ZCBmcmFtZSBpcyBhZ2dyZWdhdGlibGUKK0JPT0xFQU4gVHhGcmFtZUlzQWdncmVnYXRpYmxlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCXBQcmV2QWRkcjEsCisJSU4JUFVDSEFSCQkJcDgwMjNoZHIpCit7CisKKwkvLyBjYW4ndCBhZ2dyZWdhdGUgRUFQT0wgKDgwMi4xeCkgZnJhbWUKKwlpZiAoKHA4MDIzaGRyWzEyXSA9PSAweDg4KSAmJiAocDgwMjNoZHJbMTNdID09IDB4OGUpKQorCQlyZXR1cm4gRkFMU0U7CisKKwkvLyBjYW4ndCBhZ2dyZWdhdGUgbXVsdGljYXN0L2Jyb2FkY2FzdCBmcmFtZQorCWlmIChwODAyM2hkclswXSAmIDB4MDEpCisJCXJldHVybiBGQUxTRTsKKworCWlmIChJTkZSQV9PTihwQWQpKSAvLyBtdXN0IGJlIHVuaWNhc3QgdG8gQVAKKwkJcmV0dXJuIFRSVUU7CisJZWxzZSBpZiAoKHBQcmV2QWRkcjEgPT0gTlVMTCkgfHwgTUFDX0FERFJfRVFVQUwocFByZXZBZGRyMSwgcDgwMjNoZHIpKSAvLyB1bmljYXN0IHRvIHNhbWUgU1RBCisJCXJldHVybiBUUlVFOworCWVsc2UKKwkJcmV0dXJuIEZBTFNFOworfQorCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCSAgIENoZWNrIHRoZSBNU0RVIEFnZ3JlZ2F0aW9uIHBvbGljeQorCTEuSFQgYWdncmVnYXRpb24gaXMgQS1NU0RVCisJMi5sZWdhYWN5IHJhdGUgYWdncmVnYXRpb24gaXMgc29mdHdhcmUgYWdncmVnYXRpb24gYnkgUmFsaW5rLgorCisJQXJndW1lbnRzOgorCisJUmV0dXJuIFZhbHVlOgorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0JPT0xFQU4gUGVlcklzQWdncmVPbigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVTE9ORwkJICAgVHhSYXRlLAorCUlOCVBNQUNfVEFCTEVfRU5UUlkgcE1hY0VudHJ5KQoreworCVVMT05HCUFGbGFncyA9IChmQ0xJRU5UX1NUQVRVU19BTVNEVV9JTlVTRUQgfCBmQ0xJRU5UX1NUQVRVU19BR0dSRUdBVElPTl9DQVBBQkxFKTsKKworCWlmIChwTWFjRW50cnkgIT0gTlVMTCAmJiBDTElFTlRfU1RBVFVTX1RFU1RfRkxBRyhwTWFjRW50cnksIEFGbGFncykpCisJeworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQlpZiAocE1hY0VudHJ5LT5IVFBoeU1vZGUuZmllbGQuTU9ERSA+PSBNT0RFX0hUTUlYKQorCQl7CisJCQlyZXR1cm4gVFJVRTsKKwkJfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisjaWZkZWYgQUdHUkVHQVRJT05fU1VQUE9SVAorCQlpZiAoVHhSYXRlID49IFJBVEVfNiAmJiBwQWQtPkNvbW1vbkNmZy5iQWdncmVnYXRpb25DYXBhYmxlICYmICghKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfV01NX0lOVVNFRCkgJiYgQ0xJRU5UX1NUQVRVU19URVNUX0ZMQUcocE1hY0VudHJ5LCBmQ0xJRU5UX1NUQVRVU19XTU1fQ0FQQUJMRSkpKSkKKwkJewkvLyBsZWdhY3kgIFJhbGluayBBZ2dyZWdhdGlvbiBzdXBwb3J0CisJCQlyZXR1cm4gVFJVRTsKKwkJfQorI2VuZGlmIC8vIEFHR1JFR0FUSU9OX1NVUFBPUlQgLy8KKwl9CisKKwlyZXR1cm4gRkFMU0U7CisKK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJQ2hlY2sgYW5kIGZpbmUgdGhlIHBhY2tldCB3YWl0aW5nIGluIFNXIHF1ZXVlIHdpdGggaGlnaGVzdCBwcmlvcml0eQorCisJQXJndW1lbnRzOgorCQlwQWQgUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCisJUmV0dXJuIFZhbHVlOgorCQlwUXVldWUJCVBvaW50ZXIgdG8gV2FpdGluZyBRdWV1ZQorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworUFFVRVVFX0hFQURFUglSVE1QQ2hlY2tUeFN3UXVldWUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUIFBVQ0hBUgkJCXBRdWVJZHgpCit7CisKKwlVTE9ORwlOdW1iZXI7CisKKwlOdW1iZXIgPSBwQWQtPlR4U3dRdWV1ZVtRSURfQUNfQktdLk51bWJlcgorCQkJICsgcEFkLT5UeFN3UXVldWVbUUlEX0FDX0JFXS5OdW1iZXIKKwkJCSArIHBBZC0+VHhTd1F1ZXVlW1FJRF9BQ19WSV0uTnVtYmVyCisJCQkgKyBwQWQtPlR4U3dRdWV1ZVtRSURfQUNfVk9dLk51bWJlcgorCQkJICsgcEFkLT5UeFN3UXVldWVbUUlEX0hDQ0FdLk51bWJlcjsKKworCWlmIChwQWQtPlR4U3dRdWV1ZVtRSURfQUNfVk9dLkhlYWQgIT0gTlVMTCkKKwl7CisJCSpwUXVlSWR4ID0gUUlEX0FDX1ZPOworCQlyZXR1cm4gKCZwQWQtPlR4U3dRdWV1ZVtRSURfQUNfVk9dKTsKKwl9CisJZWxzZSBpZiAocEFkLT5UeFN3UXVldWVbUUlEX0FDX1ZJXS5IZWFkICE9IE5VTEwpCisJeworCQkqcFF1ZUlkeCA9IFFJRF9BQ19WSTsKKwkJcmV0dXJuICgmcEFkLT5UeFN3UXVldWVbUUlEX0FDX1ZJXSk7CisJfQorCWVsc2UgaWYgKHBBZC0+VHhTd1F1ZXVlW1FJRF9BQ19CRV0uSGVhZCAhPSBOVUxMKQorCXsKKwkJKnBRdWVJZHggPSBRSURfQUNfQkU7CisJCXJldHVybiAoJnBBZC0+VHhTd1F1ZXVlW1FJRF9BQ19CRV0pOworCX0KKwllbHNlIGlmIChwQWQtPlR4U3dRdWV1ZVtRSURfQUNfQktdLkhlYWQgIT0gTlVMTCkKKwl7CisJCSpwUXVlSWR4ID0gUUlEX0FDX0JLOworCQlyZXR1cm4gKCZwQWQtPlR4U3dRdWV1ZVtRSURfQUNfQktdKTsKKwl9CisJZWxzZSBpZiAocEFkLT5UeFN3UXVldWVbUUlEX0hDQ0FdLkhlYWQgIT0gTlVMTCkKKwl7CisJCSpwUXVlSWR4ID0gUUlEX0hDQ0E7CisJCXJldHVybiAoJnBBZC0+VHhTd1F1ZXVlW1FJRF9IQ0NBXSk7CisJfQorCisJLy8gTm8gcGFja2V0IHBlbmRpbmcgaW4gVHggU3cgcXVldWUKKwkqcFF1ZUlkeCA9IFFJRF9BQ19CSzsKKworCXJldHVybiAoTlVMTCk7Cit9CisKKworI2lmZGVmIFJUMjg2MAorQk9PTEVBTiAgUlRNUEZyZWVUWERVcG9uVHhEbWFEb25lKAorCUlOIFBSVE1QX0FEQVBURVIJcEFkLAorCUlOIFVDSEFSCQkJUXVlSWR4KQoreworCVBSVE1QX1RYX1JJTkcgcFR4UmluZzsKKwlQVFhEX1NUUlVDCSAgcFR4RDsKKyNpZmRlZglSVF9CSUdfRU5ESUFOCisgICAgUFRYRF9TVFJVQyAgICAgIHBEZXN0VHhEOworI2VuZGlmCisJUE5ESVNfUEFDS0VUICBwUGFja2V0OworCVVDSEFSCUZSRUUgPSAwOworCVRYRF9TVFJVQwlUeEQsICpwT3JpVHhEOworCS8vVUxPTkcJCUlycUZsYWdzOworCUJPT0xFQU4JCQliUmVzY2hlZHVsZSA9IEZBTFNFOworCisKKwlBU1NFUlQoUXVlSWR4IDwgTlVNX09GX1RYX1JJTkcpOworCXBUeFJpbmcgPSAmcEFkLT5UeFJpbmdbUXVlSWR4XTsKKworCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfRFRYX0lEWDAgKyBRdWVJZHggKiBSSU5HUkVHX0RJRkYsICZwVHhSaW5nLT5UeERtYUlkeCk7CisJd2hpbGUgKHBUeFJpbmctPlR4U3dGcmVlSWR4ICE9IHBUeFJpbmctPlR4RG1hSWR4KQorCXsKKyNpZmRlZiBSQUxJTktfQVRFCisjaWZkZWYgUkFMSU5LXzI4eHhfUUEKKwkJUEhFQURFUl84MDJfMTEJcEhlYWRlcjgwMjExOworCisJCWlmICgoQVRFX09OKHBBZCkpICYmIChwQWQtPmF0ZS5iUUFUeFN0YXJ0ID09IFRSVUUpKQorCQl7CisJCQlpZiAocEFkLT5hdGUuUUlEID09IFF1ZUlkeCkKKwkJCXsKKwkJCQlwQWQtPmF0ZS5UeERvbmVDb3VudCsrOworCQkJCS8vcEFkLT5hdGUuUmVwZWF0Kys7CisJCQkJcEFkLT5SYWxpbmtDb3VudGVycy5LaWNrVHhDb3VudCsrOworCisJCQkJLyogYWx3YXlzIHVzZSBRSURfQUNfQkUgYW5kIEZJRk9fRURDQSAqLworCQkJCUFTU0VSVChwQWQtPmF0ZS5RSUQgPT0gMCk7CisJCQkJcEFkLT5hdGUuVHhBYzArKzsKKworCQkJCUZSRUUrKzsKKyNpZm5kZWYgUlRfQklHX0VORElBTgorCQkJCXBUeEQgPSAoUFRYRF9TVFJVQykgKHBUeFJpbmctPkNlbGxbcFR4UmluZy0+VHhTd0ZyZWVJZHhdLkFsbG9jVmEpOworCQkJCXBPcmlUeEQgPSBwVHhEOworCQkgICAgICAgIE5kaXNNb3ZlTWVtb3J5KCZUeEQsIHBUeEQsIHNpemVvZihUWERfU1RSVUMpKTsKKwkJCQlwVHhEID0gJlR4RDsKKyNlbHNlCisJCSAgICAgICAgcERlc3RUeEQgPSAoUFRYRF9TVFJVQykgKHBUeFJpbmctPkNlbGxbcFR4UmluZy0+VHhTd0ZyZWVJZHhdLkFsbG9jVmEpOworCQkgICAgICAgIHBPcmlUeEQgPSBwRGVzdFR4RCA7CisJCSAgICAgICAgVHhEID0gKnBEZXN0VHhEOworCQkgICAgICAgIHBUeEQgPSAmVHhEOworCQkgICAgICAgIFJUTVBEZXNjcmlwdG9yRW5kaWFuQ2hhbmdlKChQVUNIQVIpcFR4RCwgVFlQRV9UWEQpOworI2VuZGlmCisJCQkJcFR4RC0+RE1BRE9ORSA9IDA7CisKKwkJCQlwSGVhZGVyODAyMTEgPSBwVHhSaW5nLT5DZWxsW3BUeFJpbmctPlR4U3dGcmVlSWR4XS5EbWFCdWYuQWxsb2NWYSArIHNpemVvZihUWFdJX1NUUlVDKTsKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJCQkJUlRNUEZyYW1lRW5kaWFuQ2hhbmdlKHBBZCwgKFBVQ0hBUilwSGVhZGVyODAyMTEsIERJUl9SRUFELCBGQUxTRSk7CisjZW5kaWYKKwkJCQlwSGVhZGVyODAyMTEtPlNlcXVlbmNlID0gKytwQWQtPmF0ZS5zZXE7CisjaWZkZWYgUlRfQklHX0VORElBTgorCQkJCVJUTVBGcmFtZUVuZGlhbkNoYW5nZShwQWQsIChQVUNIQVIpcEhlYWRlcjgwMjExLCBESVJfV1JJVEUsIEZBTFNFKTsKKyNlbmRpZgorCisJCQkJaWYgICgocEFkLT5hdGUuYlFBVHhTdGFydCA9PSBUUlVFKSAmJiAocEFkLT5hdGUuTW9kZSAmIEFURV9UWEZSQU1FKSAmJiAocEFkLT5hdGUuVHhEb25lQ291bnQgPCBwQWQtPmF0ZS5UeENvdW50KSkKKwkJCQl7CisJCQkJCXBBZC0+UmFsaW5rQ291bnRlcnMuVHJhbnNtaXR0ZWRCeXRlQ291bnQgKz0gIChwVHhELT5TRExlbjEgKyBwVHhELT5TRExlbjApOworCQkJCQlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY0RtYURvbmVDb3VudFtRdWVJZHhdICsrOworCQkJCQlJTkNfUklOR19JTkRFWChwVHhSaW5nLT5UeFN3RnJlZUlkeCwgVFhfUklOR19TSVpFKTsKKwkJCQkJLyogZ2V0IHR4X3RkeF9pZHggYWdhaW4gKi8KKwkJCQkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9EVFhfSURYMCArIFF1ZUlkeCAqIFJJTkdSRUdfRElGRiAsICAmcFR4UmluZy0+VHhEbWFJZHgpOworCQkJCQlnb3RvIGtpY2tfb3V0OworCQkJCX0KKwkJCQllbHNlIGlmICgocEFkLT5hdGUuVHhTdGF0dXMgPT0gMSkvKiBvciAocEFkLT5hdGUuYlFBVHhTdGFydCA9PSBUUlVFKSA/Pz8gKi8gJiYgKHBBZC0+YXRlLlR4RG9uZUNvdW50ID09IHBBZC0+YXRlLlR4Q291bnQpKS8vPD09PT09PT09PT09PT09PT09PT09PT09PVBFVEVSCisJCQkJeworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoImFsbCBUeCBpcyBkb25lXG4iKSk7CisJCQkJCS8vIFR4IHN0YXR1cyBlbnRlcnMgaWRsZSBtb2RlLgorCQkJCQlwQWQtPmF0ZS5UeFN0YXR1cyA9IDA7CisJCQkJfQorCQkJCWVsc2UgaWYgKCEocEFkLT5hdGUuTW9kZSAmIEFURV9UWEZSQU1FKSkKKwkJCQl7CisJCQkJCS8qIG5vdCBjb21wbGV0ZSBzZW5kaW5nIHlldCwgYnV0IHNvbWVvbmUgcHJlc3MgdGhlIFN0b3AgVFggYm90dG9uLiAqLworCQkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIm5vdCBjb21wbGV0ZSBzZW5kaW5nIHlldCwgYnV0IHNvbWVvbmUgcHJlc3NlZCB0aGUgU3RvcCBUWCBib3R0b21cbiIpKTsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJwQWQtPmF0ZS5Nb2RlID0gMHglMDJ4XG4iLCBwQWQtPmF0ZS5Nb2RlKSk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX09GRiwoInBUeFJpbmctPlR4U3dGcmVlSWR4ID0gJWRcbiIsIHBUeFJpbmctPlR4U3dGcmVlSWR4KSk7CisgIAkJCQl9CisjaWZuZGVmIFJUX0JJR19FTkRJQU4KKwkgICAgICAgIAlOZGlzTW92ZU1lbW9yeShwT3JpVHhELCBwVHhELCBzaXplb2YoVFhEX1NUUlVDKSk7CisjZWxzZQorICAgICAgICAJCVJUTVBEZXNjcmlwdG9yRW5kaWFuQ2hhbmdlKChQVUNIQVIpcFR4RCwgVFlQRV9UWEQpOworICAgICAgICAJCSpwRGVzdFR4RCA9IFR4RDsKKyNlbmRpZiAvLyBSVF9CSUdfRU5ESUFOIC8vCisKKwkJCQlJTkNfUklOR19JTkRFWChwVHhSaW5nLT5UeFN3RnJlZUlkeCwgVFhfUklOR19TSVpFKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJfQorI2VuZGlmIC8vIFJBTElOS18yOHh4X1FBIC8vCisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCisJCS8vIHN0YXRpYyByYXRlIGFsc28gbmVlZCBOSUNVcGRhdGVGaWZvU3RhQ291bnRlcnMoKSBmdW5jdGlvbi4KKwkJLy9pZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19UWF9SQVRFX1NXSVRDSF9FTkFCTEVEKSkKKwkJCU5JQ1VwZGF0ZUZpZm9TdGFDb3VudGVycyhwQWQpOworCisJCS8qIE5vdGUgOiBJZiAocEFkLT5hdGUuYlFBVHhTdGFydCA9PSBUUlVFKSwgd2Ugd2lsbCBuZXZlciByZWFjaCBoZXJlLiAqLworCQlGUkVFKys7CisjaWZuZGVmIFJUX0JJR19FTkRJQU4KKyAgICAgICAgICAgICAgICBwVHhEID0gKFBUWERfU1RSVUMpIChwVHhSaW5nLT5DZWxsW3BUeFJpbmctPlR4U3dGcmVlSWR4XS5BbGxvY1ZhKTsKKwkJcE9yaVR4RCA9IHBUeEQ7CisgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkoJlR4RCwgcFR4RCwgc2l6ZW9mKFRYRF9TVFJVQykpOworCQlwVHhEID0gJlR4RDsKKyNlbHNlCisgICAgICAgIHBEZXN0VHhEID0gKFBUWERfU1RSVUMpIChwVHhSaW5nLT5DZWxsW3BUeFJpbmctPlR4U3dGcmVlSWR4XS5BbGxvY1ZhKTsKKyAgICAgICAgcE9yaVR4RCA9IHBEZXN0VHhEIDsKKyAgICAgICAgVHhEID0gKnBEZXN0VHhEOworICAgICAgICBwVHhEID0gJlR4RDsKKyAgICAgICAgUlRNUERlc2NyaXB0b3JFbmRpYW5DaGFuZ2UoKFBVQ0hBUilwVHhELCBUWVBFX1RYRCk7CisjZW5kaWYKKworCQlwVHhELT5ETUFET05FID0gMDsKKworCisjaWZkZWYgUkFMSU5LX0FURQorCQkvKiBFeGVjdXRpb24gb2YgdGhpcyBibG9jayBpcyBub3QgYWxsb3dlZCB3aGVuIEFURSBpcyBydW5uaW5nLiAqLworCQlpZiAoIShBVEVfT04ocEFkKSkpCisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisJCXsKKwkJCXBQYWNrZXQgPSBwVHhSaW5nLT5DZWxsW3BUeFJpbmctPlR4U3dGcmVlSWR4XS5wTmRpc1BhY2tldDsKKwkJCWlmIChwUGFja2V0KQorCQkJeworI2lmZGVmIENPTkZJR181VlRfRU5IQU5DRQorCQkJCWlmIChSVE1QX0dFVF9QQUNLRVRfNVZUKHBQYWNrZXQpKQorCQkJCQlQQ0lfVU5NQVBfU0lOR0xFKHBBZCwgcFR4RC0+U0RQdHIxLCAxNiwgUENJX0RNQV9UT0RFVklDRSk7CisJCQkJZWxzZQorI2VuZGlmIC8vIENPTkZJR181VlRfRU5IQU5DRSAvLworCQkJCQlQQ0lfVU5NQVBfU0lOR0xFKHBBZCwgcFR4RC0+U0RQdHIxLCBwVHhELT5TRExlbjEsIFBDSV9ETUFfVE9ERVZJQ0UpOworCQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19TVUNDRVNTKTsKKwkJCX0KKwkJCS8vQWx3YXlzIGFzc2lnbiBwTmRpc1BhY2tldCBhcyBOVUxMIGFmdGVyIGNsZWFyCisJCQlwVHhSaW5nLT5DZWxsW3BUeFJpbmctPlR4U3dGcmVlSWR4XS5wTmRpc1BhY2tldCA9IE5VTEw7CisKKwkJCXBQYWNrZXQgPSBwVHhSaW5nLT5DZWxsW3BUeFJpbmctPlR4U3dGcmVlSWR4XS5wTmV4dE5kaXNQYWNrZXQ7CisKKwkJCUFTU0VSVChwUGFja2V0ID09IE5VTEwpOworCQkJaWYgKHBQYWNrZXQpCisJCQl7CisjaWZkZWYgQ09ORklHXzVWVF9FTkhBTkNFCisJCQkJaWYgKFJUTVBfR0VUX1BBQ0tFVF81VlQocFBhY2tldCkpCisJCQkJCVBDSV9VTk1BUF9TSU5HTEUocEFkLCBwVHhELT5TRFB0cjEsIDE2LCBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJCQllbHNlCisjZW5kaWYgLy8gQ09ORklHXzVWVF9FTkhBTkNFIC8vCisJCQkJCVBDSV9VTk1BUF9TSU5HTEUocEFkLCBwVHhELT5TRFB0cjEsIHBUeEQtPlNETGVuMSwgUENJX0RNQV9UT0RFVklDRSk7CisJCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOworCQkJfQorCQkJLy9BbHdheXMgYXNzaWduIHBOZXh0TmRpc1BhY2tldCBhcyBOVUxMIGFmdGVyIGNsZWFyCisJCQlwVHhSaW5nLT5DZWxsW3BUeFJpbmctPlR4U3dGcmVlSWR4XS5wTmV4dE5kaXNQYWNrZXQgPSBOVUxMOworCQl9CisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCQlwQWQtPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkQnl0ZUNvdW50ICs9ICAocFR4RC0+U0RMZW4xICsgcFR4RC0+U0RMZW4wKTsKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNEbWFEb25lQ291bnRbUXVlSWR4XSArKzsKKwkJSU5DX1JJTkdfSU5ERVgocFR4UmluZy0+VHhTd0ZyZWVJZHgsIFRYX1JJTkdfU0laRSk7CisJCS8qIGdldCB0eF90ZHhfaWR4IGFnYWluICovCisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfRFRYX0lEWDAgKyBRdWVJZHggKiBSSU5HUkVHX0RJRkYgLCAgJnBUeFJpbmctPlR4RG1hSWR4KTsKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisgICAgICAgIFJUTVBEZXNjcmlwdG9yRW5kaWFuQ2hhbmdlKChQVUNIQVIpcFR4RCwgVFlQRV9UWEQpOworICAgICAgICAqcERlc3RUeEQgPSBUeEQ7CisjZWxzZQorICAgICAgICBOZGlzTW92ZU1lbW9yeShwT3JpVHhELCBwVHhELCBzaXplb2YoVFhEX1NUUlVDKSk7CisjZW5kaWYKKworI2lmZGVmIFJBTElOS19BVEUKKyNpZmRlZiBSQUxJTktfMjh4eF9RQQora2lja19vdXQ6CisjZW5kaWYgLy8gUkFMSU5LXzI4eHhfUUEgLy8KKworCQkvLworCQkvLyBBVEVfVFhDT05UIG1vZGUgYWxzbyBuZWVkIHRvIHNlbmQgc29tZSBub3JtYWwgZnJhbWVzLCBzbyBsZXQgaXQgaW4uCisJCS8vIEFURV9TVE9QIG11c3QgYmUgY2hhbmdlZCBub3QgdG8gYmUgMHhmZgorCQkvLyB0byBwcmV2ZW50IGl0IGZyb20gcnVubmluZyBpbnRvIHRoaXMgYmxvY2suCisJCS8vCisJCWlmICgocEFkLT5hdGUuTW9kZSAmIEFURV9UWEZSQU1FKSAmJiAocEFkLT5hdGUuUUlEID09IFF1ZUlkeCkpCisJCXsKKwkJCS8vIFR4RG9uZUNvdW50KysgaGFzIGJlZW4gZG9uZSBpZiBRQSBpcyB1c2VkLgorCQkJaWYgKHBBZC0+YXRlLmJRQVR4U3RhcnQgPT0gRkFMU0UpCisJCQl7CisJCQkJcEFkLT5hdGUuVHhEb25lQ291bnQrKzsKKwkJCX0KKwkJCWlmICgoKHBBZC0+YXRlLlR4Q291bnQgLSBwQWQtPmF0ZS5UeERvbmVDb3VudCArIDEpID49IFRYX1JJTkdfU0laRSkpCisJCQl7CisJCQkJLyogTm90ZSA6IFdlIGluY3JlYXNlIFR4Q3B1SWR4IGhlcmUsIG5vdCBUeFN3RnJlZUlkeCAhICovCisJCQkJSU5DX1JJTkdfSU5ERVgocEFkLT5UeFJpbmdbUXVlSWR4XS5UeENwdUlkeCwgVFhfUklOR19TSVpFKTsKKyNpZm5kZWYgUlRfQklHX0VORElBTi8vPD09PT09PT09PT09PT09PT09PT09PT09PT09UEVURVIKKwkJCQlwVHhEID0gKFBUWERfU1RSVUMpIChwVHhSaW5nLT5DZWxsW3BBZC0+VHhSaW5nW1F1ZUlkeF0uVHhDcHVJZHhdLkFsbG9jVmEpOworCQkJCXBPcmlUeEQgPSBwVHhEOworCQkgICAgICAgIE5kaXNNb3ZlTWVtb3J5KCZUeEQsIHBUeEQsIHNpemVvZihUWERfU1RSVUMpKTsKKwkJCQlwVHhEID0gJlR4RDsKKyNlbHNlCisJCSAgICAgICAgcERlc3RUeEQgPSAoUFRYRF9TVFJVQykgKHBUeFJpbmctPkNlbGxbcEFkLT5UeFJpbmdbUXVlSWR4XS5UeENwdUlkeF0uQWxsb2NWYSk7CisJCSAgICAgICAgcE9yaVR4RCA9IHBEZXN0VHhEIDsKKwkJICAgICAgICBUeEQgPSAqcERlc3RUeEQ7CisJCSAgICAgICAgcFR4RCA9ICZUeEQ7CisJCSAgICAgICAgUlRNUERlc2NyaXB0b3JFbmRpYW5DaGFuZ2UoKFBVQ0hBUilwVHhELCBUWVBFX1RYRCk7CisjZW5kaWYKKwkJCQlwVHhELT5ETUFET05FID0gMDsKKyNpZm5kZWYgUlRfQklHX0VORElBTi8vPD09PT09PT09PT09PT09PT09PT09PT09PT09UEVURVIKKyAgICAgICAgCQlOZGlzTW92ZU1lbW9yeShwT3JpVHhELCBwVHhELCBzaXplb2YoVFhEX1NUUlVDKSk7CisjZWxzZQorICAgICAgICAJCVJUTVBEZXNjcmlwdG9yRW5kaWFuQ2hhbmdlKChQVUNIQVIpcFR4RCwgVFlQRV9UWEQpOworICAgICAgICAJCSpwRGVzdFR4RCA9IFR4RDsKKyNlbmRpZgorCQkJCS8vIGtpY2sgVHgtUmluZy4KKwkJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9DVFhfSURYMCArIFF1ZUlkeCAqIFJJTkdSRUdfRElGRiwgcEFkLT5UeFJpbmdbUXVlSWR4XS5UeENwdUlkeCk7CisJCQkJcEFkLT5SYWxpbmtDb3VudGVycy5LaWNrVHhDb3VudCsrOworCQkJfQorCQl9CisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCX0KKworCisJcmV0dXJuICBiUmVzY2hlZHVsZTsKKworfQorCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlQcm9jZXNzIFRYIFJpbmdzIERNQSBEb25lIGludGVycnVwdCwgcnVubmluZyBpbiBEUEMgbGV2ZWwKKworCUFyZ3VtZW50czoKKwkJQWRhcHRlciAJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0JPT0xFQU4JUlRNUEhhbmRsZVR4UmluZ0RtYURvbmVJbnRlcnJ1cHQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JSU5UX1NPVVJDRV9DU1JfU1RSVUMgVHhSaW5nQml0bWFwKQoreworICAgIHVuc2lnbmVkIGxvbmcJSXJxRmxhZ3M7CisJQk9PTEVBTgkJCWJSZXNjaGVkdWxlID0gRkFMU0U7CisKKwkvLyBNYWtlIHN1cmUgVHggcmluZyByZXNvdXJjZSB3b24ndCBiZSB1c2VkIGJ5IG90aGVyIHRocmVhZHMKKworCVJUTVBfSVJRX0xPQ0soJnBBZC0+aXJxX2xvY2ssIElycUZsYWdzKTsKKworCWlmIChUeFJpbmdCaXRtYXAuZmllbGQuQWMwRG1hRG9uZSkKKwkJYlJlc2NoZWR1bGUgPSBSVE1QRnJlZVRYRFVwb25UeERtYURvbmUocEFkLCBRSURfQUNfQkUpOworCisJaWYgKFR4UmluZ0JpdG1hcC5maWVsZC5IY2NhRG1hRG9uZSkKKwkJYlJlc2NoZWR1bGUgfD0gUlRNUEZyZWVUWERVcG9uVHhEbWFEb25lKHBBZCwgUUlEX0hDQ0EpOworCisJaWYgKFR4UmluZ0JpdG1hcC5maWVsZC5BYzNEbWFEb25lKQorCQliUmVzY2hlZHVsZSB8PSBSVE1QRnJlZVRYRFVwb25UeERtYURvbmUocEFkLCBRSURfQUNfVk8pOworCisJaWYgKFR4UmluZ0JpdG1hcC5maWVsZC5BYzJEbWFEb25lKQorCQliUmVzY2hlZHVsZSB8PSBSVE1QRnJlZVRYRFVwb25UeERtYURvbmUocEFkLCBRSURfQUNfVkkpOworCisJaWYgKFR4UmluZ0JpdG1hcC5maWVsZC5BYzFEbWFEb25lKQorCQliUmVzY2hlZHVsZSB8PSBSVE1QRnJlZVRYRFVwb25UeERtYURvbmUocEFkLCBRSURfQUNfQkspOworCisJLy8gTWFrZSBzdXJlIHRvIHJlbGVhc2UgVHggcmluZyByZXNvdXJjZQorCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgSXJxRmxhZ3MpOworCisJLy8gRGVxdWV1ZSBvdXRnb2luZyBmcmFtZXMgZnJvbSBUeFN3UXVldWVbXSBhbmQgcHJvY2VzcyBpdAorCVJUTVBEZVF1ZXVlUGFja2V0KHBBZCwgRkFMU0UsIE5VTV9PRl9UWF9SSU5HLCBNQVhfVFhfUFJPQ0VTUyk7CisKKwlyZXR1cm4gIGJSZXNjaGVkdWxlOworfQorCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlQcm9jZXNzIE1HTVQgcmluZyBETUEgZG9uZSBpbnRlcnJ1cHQsIHJ1bm5pbmcgaW4gRFBDIGxldmVsCisKKwlBcmd1bWVudHM6CisJCXBBZCAJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECVJUTVBIYW5kbGVNZ210UmluZ0RtYURvbmVJbnRlcnJ1cHQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQpCit7CisJUFRYRF9TVFJVQwkgcFR4RDsKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisgICAgUFRYRF9TVFJVQyAgICAgIHBEZXN0VHhEOworICAgIFRYRF9TVFJVQyAgICAgICBUeEQ7CisjZW5kaWYKKwlQTkRJU19QQUNLRVQgcFBhY2tldDsKKwlVQ0hBUglGUkVFID0gMDsKKwlQUlRNUF9NR01UX1JJTkcgcE1nbXRSaW5nID0gJnBBZC0+TWdtdFJpbmc7CisKKwlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPk1nbXRSaW5nTG9jayk7CisKKwlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX01HTVREVFhfSURYLCAmcE1nbXRSaW5nLT5UeERtYUlkeCk7CisJd2hpbGUgKHBNZ210UmluZy0+VHhTd0ZyZWVJZHghPSBwTWdtdFJpbmctPlR4RG1hSWR4KQorCXsKKwkJRlJFRSsrOworI2lmZGVmIFJUX0JJR19FTkRJQU4KKyAgICAgICAgcERlc3RUeEQgPSAoUFRYRF9TVFJVQykgKHBNZ210UmluZy0+Q2VsbFtwQWQtPk1nbXRSaW5nLlR4U3dGcmVlSWR4XS5BbGxvY1ZhKTsKKyAgICAgICAgVHhEID0gKnBEZXN0VHhEOworICAgICAgICBwVHhEID0gJlR4RDsKKwkJUlRNUERlc2NyaXB0b3JFbmRpYW5DaGFuZ2UoKFBVQ0hBUilwVHhELCBUWVBFX1RYRCk7CisjZWxzZQorCQlwVHhEID0gKFBUWERfU1RSVUMpIChwTWdtdFJpbmctPkNlbGxbcEFkLT5NZ210UmluZy5UeFN3RnJlZUlkeF0uQWxsb2NWYSk7CisjZW5kaWYKKwkJcFR4RC0+RE1BRE9ORSA9IDA7CisJCXBQYWNrZXQgPSBwTWdtdFJpbmctPkNlbGxbcE1nbXRSaW5nLT5UeFN3RnJlZUlkeF0ucE5kaXNQYWNrZXQ7CisKKworCQlpZiAocFBhY2tldCkKKwkJeworCQkJUENJX1VOTUFQX1NJTkdMRShwQWQsIHBUeEQtPlNEUHRyMCwgcFR4RC0+U0RMZW4wLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19TVUNDRVNTKTsKKwkJfQorCQlwTWdtdFJpbmctPkNlbGxbcE1nbXRSaW5nLT5UeFN3RnJlZUlkeF0ucE5kaXNQYWNrZXQgPSBOVUxMOworCisJCXBQYWNrZXQgPSBwTWdtdFJpbmctPkNlbGxbcE1nbXRSaW5nLT5UeFN3RnJlZUlkeF0ucE5leHROZGlzUGFja2V0OworCQlpZiAocFBhY2tldCkKKwkJeworCQkJUENJX1VOTUFQX1NJTkdMRShwQWQsIHBUeEQtPlNEUHRyMSwgcFR4RC0+U0RMZW4xLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19TVUNDRVNTKTsKKwkJfQorCQlwTWdtdFJpbmctPkNlbGxbcE1nbXRSaW5nLT5UeFN3RnJlZUlkeF0ucE5leHROZGlzUGFja2V0ID0gTlVMTDsKKwkJSU5DX1JJTkdfSU5ERVgocE1nbXRSaW5nLT5UeFN3RnJlZUlkeCwgTUdNVF9SSU5HX1NJWkUpOworCisjaWZkZWYgUlRfQklHX0VORElBTgorICAgICAgICBSVE1QRGVzY3JpcHRvckVuZGlhbkNoYW5nZSgoUFVDSEFSKXBUeEQsIFRZUEVfVFhEKTsKKyAgICAgICAgV3JpdGVCYWNrVG9EZXNjcmlwdG9yKChQVUNIQVIpcERlc3RUeEQsIChQVUNIQVIpcFR4RCwgVFJVRSwgVFlQRV9UWEQpOworI2VuZGlmCisJfQorCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+TWdtdFJpbmdMb2NrKTsKKworfQorCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCUFyZ3VtZW50czoKKwkJQWRhcHRlciAJUG9pbnRlciB0byBvdXIgYWRhcHRlci4gRGVxdWV1ZSBhbGwgcG93ZXIgc2FmZSBkZWxheWVkIGJyYW9kY2FzdCBmcmFtZXMgYWZ0ZXIgYmVhY29uLgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECVJUTVBIYW5kbGVUQlRUSW50ZXJydXB0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCXsKKwkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSkpCisJCXsKKwkJfQorCX0KK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwlBcmd1bWVudHM6CisJCUFkYXB0ZXIgCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIuIFJld3JpdGUgYmVhY29uIGNvbnRlbnQgYmVmb3JlIG5leHQgc2VuZC1vdXQuCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJUlRNUEhhbmRsZVByZVRCVFRJbnRlcnJ1cHQoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJeworCQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKSkKKwkJeworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlRNUEhhbmRsZVByZVRCVFRJbnRlcnJ1cHQuLi5cbiIpKTsKKwkJfQorCX0KKworCit9CisKK1ZPSUQJUlRNUEhhbmRsZVJ4Q29oZXJlbnRJbnRlcnJ1cHQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQpCit7CisJV1BETUFfR0xPX0NGR19TVFJVQwlHbG9DZmc7CisKKwlpZiAocEFkID09IE5VTEwpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT09PiBwQWQgaXMgTlVMTCwgcmV0dXJuLlxuIikpOworCQlyZXR1cm47CisJfQorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT0+IFJUTVBIYW5kbGVSeENvaGVyZW50SW50ZXJydXB0IFxuIikpOworCisJUlRNUF9JT19SRUFEMzIocEFkLCBXUERNQV9HTE9fQ0ZHICwgJkdsb0NmZy53b3JkKTsKKworCUdsb0NmZy5maWVsZC5FblRYV3JpdGVCYWNrRERPTkUgPSAwOworCUdsb0NmZy5maWVsZC5FbmFibGVSeERNQSA9IDA7CisJR2xvQ2ZnLmZpZWxkLkVuYWJsZVR4RE1BID0gMDsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBXUERNQV9HTE9fQ0ZHLCBHbG9DZmcud29yZCk7CisKKwlSVE1QUmluZ0NsZWFuVXAocEFkLCBRSURfQUNfQkUpOworCVJUTVBSaW5nQ2xlYW5VcChwQWQsIFFJRF9BQ19CSyk7CisJUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX0FDX1ZJKTsKKwlSVE1QUmluZ0NsZWFuVXAocEFkLCBRSURfQUNfVk8pOworCVJUTVBSaW5nQ2xlYW5VcChwQWQsIFFJRF9IQ0NBKTsKKwlSVE1QUmluZ0NsZWFuVXAocEFkLCBRSURfTUdNVCk7CisJUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX1JYKTsKKworCVJUTVBFbmFibGVSeFR4KHBBZCk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT0gUlRNUEhhbmRsZVJ4Q29oZXJlbnRJbnRlcnJ1cHQgXG4iKSk7Cit9CisKKworVk9JRCBEQkdQUklOVF9UWF9SSU5HKAorCUlOIFBSVE1QX0FEQVBURVIgIHBBZCwKKwlJTiBVQ0hBUiAgICAgICAgICBRdWVJZHgpCit7CisJVUlOVDMyCQlBYzBCYXNlOworCVVJTlQzMgkJQWMwSHdJZHggPSAwLCBBYzBTd0lkeCA9IDAsIEFDMGZyZWVJZHg7CisJaW50CQkJaTsKKwlQVUxPTkcJcHRlbXA7CisKKwlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAiICApKTsKKwlzd2l0Y2ggKFF1ZUlkeCkKKwl7CisJCWNhc2UgUUlEX0FDX0JFOgorCQkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9CQVNFX1BUUjAsICZBYzBCYXNlKTsKKwkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfQ1RYX0lEWDAsICZBYzBTd0lkeCk7CisJCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0RUWF9JRFgwLCAmQWMwSHdJZHgpOworCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIkFsbCBRSURfQUNfQkUgREVTQ1JJUFRPUiAgXG4gIiAgKSk7CisJCQlmb3IgKGk9MDtpPFRYX1JJTkdfU0laRTtpKyspCisJCQl7CisJCQkJcHRlbXA9IChQVUxPTkcpcEFkLT5UeFJpbmdbUUlEX0FDX0JFXS5DZWxsW2ldLkFsbG9jVmE7CisJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIlslMDJkXSAgJTA4bHg6ICUwOGx4OiAlMDhseDogJTA4bHhcbiAiICwgaSwgKnB0ZW1wLCoocHRlbXArMSksKihwdGVtcCsyKSwqKHB0ZW1wKzMpKSk7CisJCQl9CisJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiICBcbiAiICApKTsKKwkJCWJyZWFrOworCQljYXNlIFFJRF9BQ19CSzoKKwkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfQkFTRV9QVFIxLCAmQWMwQmFzZSk7CisJCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0NUWF9JRFgxLCAmQWMwU3dJZHgpOworCQkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9EVFhfSURYMSwgJkFjMEh3SWR4KTsKKwkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCJBbGwgUUlEX0FDX0JLIERFU0NSSVBUT1IgIFxuICIgICkpOworCQkJZm9yIChpPTA7aTxUWF9SSU5HX1NJWkU7aSsrKQorCQkJeworCQkJCXB0ZW1wPSAoUFVMT05HKXBBZC0+VHhSaW5nW1FJRF9BQ19CS10uQ2VsbFtpXS5BbGxvY1ZhOworCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCJbJTAyZF0gICUwOGx4OiAlMDhseDogJTA4bHg6ICUwOGx4XG4gIiAsIGksICpwdGVtcCwqKHB0ZW1wKzEpLCoocHRlbXArMiksKihwdGVtcCszKSkpOworCQkJfQorCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIiAgXG4gIiAgKSk7CisJCQlicmVhazsKKwkJY2FzZSBRSURfQUNfVkk6CisJCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0JBU0VfUFRSMiwgJkFjMEJhc2UpOworCQkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9DVFhfSURYMiwgJkFjMFN3SWR4KTsKKwkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfRFRYX0lEWDIsICZBYzBId0lkeCk7CisJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiQWxsIFFJRF9BQ19WSSBERVNDUklQVE9SIFxuICIgICkpOworCQkJZm9yIChpPTA7aTxUWF9SSU5HX1NJWkU7aSsrKQorCQkJeworCQkJCXB0ZW1wPSAoUFVMT05HKXBBZC0+VHhSaW5nW1FJRF9BQ19WSV0uQ2VsbFtpXS5BbGxvY1ZhOworCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCJbJTAyZF0gICUwOGx4OiAlMDhseDogJTA4bHg6ICUwOGx4XG4gIiAsIGksICpwdGVtcCwqKHB0ZW1wKzEpLCoocHRlbXArMiksKihwdGVtcCszKSkpOworCQkJfQorCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIiAgXG4gIiAgKSk7CisJCQlicmVhazsKKwkJY2FzZSBRSURfQUNfVk86CisJCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0JBU0VfUFRSMywgJkFjMEJhc2UpOworCQkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9DVFhfSURYMywgJkFjMFN3SWR4KTsKKwkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfRFRYX0lEWDMsICZBYzBId0lkeCk7CisJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiQWxsIFFJRF9BQ19WTyBERVNDUklQVE9SIFxuICIgICkpOworCQkJZm9yIChpPTA7aTxUWF9SSU5HX1NJWkU7aSsrKQorCQkJeworCQkJCXB0ZW1wPSAoUFVMT05HKXBBZC0+VHhSaW5nW1FJRF9BQ19WT10uQ2VsbFtpXS5BbGxvY1ZhOworCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCJbJTAyZF0gICUwOGx4OiAlMDhseDogJTA4bHg6ICUwOGx4XG4gIiAsIGksICpwdGVtcCwqKHB0ZW1wKzEpLCoocHRlbXArMiksKihwdGVtcCszKSkpOworCQkJfQorCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIiAgXG4gIiAgKSk7CisJCQlicmVhazsKKwkJY2FzZSBRSURfTUdNVDoKKwkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfQkFTRV9QVFI1LCAmQWMwQmFzZSk7CisJCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0NUWF9JRFg1LCAmQWMwU3dJZHgpOworCQkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9EVFhfSURYNSwgJkFjMEh3SWR4KTsKKwkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCIgQWxsIFFJRF9NR01UICBERVNDUklQVE9SIFxuICIgICkpOworCQkJZm9yIChpPTA7aTxNR01UX1JJTkdfU0laRTtpKyspCisJCQl7CisJCQkJcHRlbXA9IChQVUxPTkcpcEFkLT5NZ210UmluZy5DZWxsW2ldLkFsbG9jVmE7CisJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIlslMDJkXSAgJTA4bHg6ICUwOGx4OiAlMDhseDogJTA4bHhcbiAiICwgaSwgKnB0ZW1wLCoocHRlbXArMSksKihwdGVtcCsyKSwqKHB0ZW1wKzMpKSk7CisJCQl9CisJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiICBcbiAiICApKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlEQkdQUklOVF9FUlIoKCJEQkdQUklOVF9UWF9SSU5HKFJpbmcgJWQpIG5vdCBzdXBwb3J0ZWRcbiIsIFF1ZUlkeCkpOworCQkJYnJlYWs7CisJfQorCUFDMGZyZWVJZHggPSBwQWQtPlR4UmluZ1tRdWVJZHhdLlR4U3dGcmVlSWR4OworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJUeFJpbmclZCwgVFhfRFRYX0lEWD0lZCwgVFhfQ1RYX0lEWD0lZFxuIiwgUXVlSWR4LCBBYzBId0lkeCwgQWMwU3dJZHgpKTsKKwlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsKCIgCVR4U3dGcmVlSWR4WyVkXSIsIEFDMGZyZWVJZHgpKTsKKwlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsKCIJcGVuZGluZy1ORElTPSVsZFxuIiwgcEFkLT5SYWxpbmtDb3VudGVycy5QZW5kaW5nTmRpc1BhY2tldENvdW50KSk7CisKKworfQorCisKK1ZPSUQgREJHUFJJTlRfUlhfUklORygKKwlJTiBQUlRNUF9BREFQVEVSICBwQWQpCit7CisJVUlOVDMyCQlBYzBCYXNlOworCVVJTlQzMgkJQWMwSHdJZHggPSAwLCBBYzBTd0lkeCA9IDAsIEFDMGZyZWVJZHg7CisJaW50CQkJaTsKKwlVSU5UMzIJKnB0ZW1wOworCisJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIiAgKSk7CisJUlRNUF9JT19SRUFEMzIocEFkLCBSWF9CQVNFX1BUUiwgJkFjMEJhc2UpOworCVJUTVBfSU9fUkVBRDMyKHBBZCwgUlhfQ1JYX0lEWCwgJkFjMFN3SWR4KTsKKwlSVE1QX0lPX1JFQUQzMihwQWQsIFJYX0RSWF9JRFgsICZBYzBId0lkeCk7CisJQUMwZnJlZUlkeCA9IHBBZC0+UnhSaW5nLlJ4U3dSZWFkSWR4OworCisJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIkFsbCBSWCBEU1AgIFxuICIgICkpOworCWZvciAoaT0wO2k8UlhfUklOR19TSVpFO2krKykKKwl7CisJCXB0ZW1wID0gKFVJTlQzMiAqKXBBZC0+UnhSaW5nLkNlbGxbaV0uQWxsb2NWYTsKKwkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIlslMDJkXSAgJTA4eDogJTA4eDogJTA4eDogJTA4eFxuICIgLCBpLCAqcHRlbXAsKihwdGVtcCsxKSwqKHB0ZW1wKzIpLCoocHRlbXArMykpKTsKKwl9CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSeFJpbmcsIFJYX0RSWF9JRFg9JWQsIFJYX0NSWF9JRFg9JWQgXG4iLCBBYzBId0lkeCwgQWMwU3dJZHgpKTsKKwlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsKCIgCVJ4U3dSZWFkSWR4IFslZF09IiwgQUMwZnJlZUlkeCkpOworCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwoIglwZW5kaW5nLU5ESVM9JWxkXG4iLCBwQWQtPlJhbGlua0NvdW50ZXJzLlBlbmRpbmdOZGlzUGFja2V0Q291bnQpKTsKK30KKyNlbmRpZiAvLyBSVDI4NjAgLy8KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVN1c3BlbmQgTVNEVSB0cmFuc21pc3Npb24KKworCUFyZ3VtZW50czoKKwkJcEFkIAlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECVJUTVBTdXNwZW5kTXNkdVRyYW5zbWlzc2lvbigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCkKK3sKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlNDQU5OSU5HLCBzdXNwZW5kIE1TRFUgdHJhbnNtaXNzaW9uIC4uLlxuIikpOworCisKKwkvLworCS8vIEJlZm9yZSBCU1NfU0NBTl9JTl9QUk9HUkVTUywgd2UgbmVlZCB0byBrZWVwIEN1cnJlbnQgUjY2IHZhbHVlIGFuZAorCS8vIHVzZSBMb3dib3VuZCBhcyBSNjYgdmFsdWUgb24gU2Nhbk5leHRDaGFubmVsKC4uLikKKwkvLworCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNjYsICZwQWQtPkJicFR1bmluZy5SNjZDdXJyZW50VmFsdWUpOworCisJLy8gc2V0IEJCUF9SNjYgdG8gMHgzMC8weDQwIHdoZW4gc2Nhbm5pbmcgKEFzaWNTd2l0Y2hDaGFubmVsIHdpbGwgc2V0IFI2NiBhY2NvcmRpbmcgdG8gY2hhbm5lbCB3aGVuIHNjYW5uaW5nKQorCVJUTVBTZXRBR0NJbml0VmFsdWUocEFkLCBCV18yMCk7CisKKwlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUyk7Cit9CisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVJlc3VtZSBNU0RVIHRyYW5zbWlzc2lvbgorCisJQXJndW1lbnRzOgorCQlwQWQgCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBSVE1QUmVzdW1lTXNkdVRyYW5zbWlzc2lvbigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCkKK3sKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlNDQU4gZG9uZSwgcmVzdW1lIE1TRFUgdHJhbnNtaXNzaW9uIC4uLlxuIikpOworCisKKwlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2NiwgcEFkLT5CYnBUdW5pbmcuUjY2Q3VycmVudFZhbHVlKTsKKworCVJUTVBfQ0xFQVJfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpOworCVJUTVBEZVF1ZXVlUGFja2V0KHBBZCwgRkFMU0UsIE5VTV9PRl9UWF9SSU5HLCBNQVhfVFhfUFJPQ0VTUyk7Cit9CisKKworVUlOVCBkZWFnZ3JlZ2F0ZV9BTVNEVV9hbm5vdW5jZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlQTkRJU19QQUNLRVQJCXBQYWNrZXQsCisJSU4JUFVDSEFSCQkJcERhdGEsCisJSU4JVUxPTkcJCQlEYXRhU2l6ZSkKK3sKKwlVU0hPUlQgCQkJUGF5bG9hZFNpemU7CisJVVNIT1JUIAkJCVN1YkZyYW1lU2l6ZTsKKwlQSEVBREVSXzgwMl8zIAlwQU1TRFVzdWJoZWFkZXI7CisJVUlOVAkJCW5NU0RVOworICAgIFVDSEFSCQkJSGVhZGVyODAyXzNbMTRdOworCisJUFVDSEFSCQkJcFBheWxvYWQsIHBEQSwgcFNBLCBwUmVtb3ZlZExMQ1NOQVA7CisJUE5ESVNfUEFDS0VUCXBDbG9uZVBhY2tldDsKKworCisKKwluTVNEVSA9IDA7CisKKwl3aGlsZSAoRGF0YVNpemUgPiBMRU5HVEhfODAyXzMpCisJeworCisJCW5NU0RVKys7CisKKwkJcEFNU0RVc3ViaGVhZGVyID0gKFBIRUFERVJfODAyXzMpcERhdGE7CisJCVBheWxvYWRTaXplID0gcEFNU0RVc3ViaGVhZGVyLT5PY3RldFsxXSArIChwQU1TRFVzdWJoZWFkZXItPk9jdGV0WzBdPDw4KTsKKwkJU3ViRnJhbWVTaXplID0gUGF5bG9hZFNpemUgKyBMRU5HVEhfODAyXzM7CisKKworCQlpZiAoKERhdGFTaXplIDwgU3ViRnJhbWVTaXplKSB8fCAoUGF5bG9hZFNpemUgPiAxNTE4ICkpCisJCXsKKwkJCWJyZWFrOworCQl9CisKKwkJcFBheWxvYWQgPSBwRGF0YSArIExFTkdUSF84MDJfMzsKKwkJcERBID0gcERhdGE7CisJCXBTQSA9IHBEYXRhICsgTUFDX0FERFJfTEVOOworCisJCS8vIGNvbnZlcnQgdG8gODAyLjMgaGVhZGVyCisgICAgICAgIENPTlZFUlRfVE9fODAyXzMoSGVhZGVyODAyXzMsIHBEQSwgcFNBLCBwUGF5bG9hZCwgUGF5bG9hZFNpemUsIHBSZW1vdmVkTExDU05BUCk7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJaWYgKChIZWFkZXI4MDJfM1sxMl0gPT0gMHg4OCkgJiYgKEhlYWRlcjgwMl8zWzEzXSA9PSAweDhFKSApCisJCXsKKwkJICAgIC8vIGF2b2lkIGxvY2FsIGhlYXAgb3ZlcmZsb3csIHVzZSBkeWFuYW1pYyBhbGxvY2F0aW9uCisJCSAgIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSA9IChNTE1FX1FVRVVFX0VMRU0gKikga21hbGxvYyhzaXplb2YoTUxNRV9RVUVVRV9FTEVNKSwgTUVNX0FMTE9DX0ZMQUcpOworCQkgICBtZW1tb3ZlKEVsZW0tPk1zZysoTEVOR1RIXzgwMl8xMSArIExFTkdUSF84MDJfMV9IKSwgcFBheWxvYWQsIFBheWxvYWRTaXplKTsKKwkJICAgRWxlbS0+TXNnTGVuID0gTEVOR1RIXzgwMl8xMSArIExFTkdUSF84MDJfMV9IICsgUGF5bG9hZFNpemU7CisJCSAgIFdwYUVBUE9MS2V5QWN0aW9uKHBBZCwgRWxlbSk7CisJCSAgIGtmcmVlKEVsZW0pOworCQl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJeworCSAgICAgICAgCWlmIChwUmVtb3ZlZExMQ1NOQVApCisJICAgICAgICAJeworCSAgICAJCQlwUGF5bG9hZCAtPSBMRU5HVEhfODAyXzM7CisJICAgIAkJCVBheWxvYWRTaXplICs9IExFTkdUSF84MDJfMzsKKwkgICAgCQkJTmRpc01vdmVNZW1vcnkocFBheWxvYWQsICZIZWFkZXI4MDJfM1swXSwgTEVOR1RIXzgwMl8zKTsKKwkgICAgICAgIAl9CisJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCQlwQ2xvbmVQYWNrZXQgPSBDbG9uZVBhY2tldChwQWQsIHBQYWNrZXQsIHBQYXlsb2FkLCBQYXlsb2FkU2l6ZSk7CisJCWlmIChwQ2xvbmVQYWNrZXQpCisJCXsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCQkJQU5OT1VOQ0VfT1JfRk9SV0FSRF84MDJfM19QQUNLRVQocEFkLCBwQ2xvbmVQYWNrZXQsIFJUTVBfR0VUX1BBQ0tFVF9JRihwUGFja2V0KSk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJCX0KKworCisJCS8vIEEtTVNEVSBoYXMgcGFkZGluZyB0byBtdWx0aXBsZSBvZiA0IGluY2x1ZGluZyBzdWJmcmFtZSBoZWFkZXIuCisJCS8vIGFsaWduIFN1YkZyYW1lU2l6ZSB1cCB0byBtdWx0aXBsZSBvZiA0CisJCVN1YkZyYW1lU2l6ZSA9IChTdWJGcmFtZVNpemUrMykmKH4weDMpOworCisKKwkJaWYgKFN1YkZyYW1lU2l6ZSA+IDE1MjggfHwgU3ViRnJhbWVTaXplIDwgMzIpCisJCXsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKERhdGFTaXplID4gU3ViRnJhbWVTaXplKQorCQl7CisJCQlwRGF0YSArPSBTdWJGcmFtZVNpemU7CisJCQlEYXRhU2l6ZSAtPSBTdWJGcmFtZVNpemU7CisJCX0KKwkJZWxzZQorCQl7CisJCQkvLyBlbmQgb2YgQS1NU0RVCisJCQlEYXRhU2l6ZSA9IDA7CisJCX0KKwl9CisKKwkvLyBmaW5hbGx5IHJlbGVhc2Ugb3JpZ2luYWwgcnggcGFja2V0CisJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOworCisJcmV0dXJuIG5NU0RVOworfQorCisKK1VJTlQgQkFfUmVvcmRlcl9BTVNEVV9Bbm5ub3VuY2UoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUE5ESVNfUEFDS0VUCXBQYWNrZXQpCit7CisJUFVDSEFSCQkJcERhdGE7CisJVVNIT1JUCQkJRGF0YVNpemU7CisJVUlOVAkJCW5NU0RVID0gMDsKKworCXBEYXRhID0gKFBVQ0hBUikgR0VUX09TX1BLVF9EQVRBUFRSKHBQYWNrZXQpOworCURhdGFTaXplID0gKFVTSE9SVCkgR0VUX09TX1BLVF9MRU4ocFBhY2tldCk7CisKKwluTVNEVSA9IGRlYWdncmVnYXRlX0FNU0RVX2Fubm91bmNlKHBBZCwgcFBhY2tldCwgcERhdGEsIERhdGFTaXplKTsKKworCXJldHVybiBuTVNEVTsKK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCUxvb2sgdXAgdGhlIE1BQyBhZGRyZXNzIGluIHRoZSBNQUMgdGFibGUuIFJldHVybiBOVUxMIGlmIG5vdCBmb3VuZC4KKwlSZXR1cm46CisJCXBFbnRyeSAtIHBvaW50ZXIgdG8gdGhlIE1BQyBlbnRyeTsgTlVMTCBpcyBub3QgZm91bmQKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK01BQ19UQUJMRV9FTlRSWSAqTWFjVGFibGVMb29rdXAoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJUFVDSEFSIHBBZGRyKQoreworCVVMT05HIEhhc2hJZHg7CisJTUFDX1RBQkxFX0VOVFJZICpwRW50cnkgPSBOVUxMOworCisJSGFzaElkeCA9IE1BQ19BRERSX0hBU0hfSU5ERVgocEFkZHIpOworCXBFbnRyeSA9IHBBZC0+TWFjVGFiLkhhc2hbSGFzaElkeF07CisKKwl3aGlsZSAocEVudHJ5ICYmIChwRW50cnktPlZhbGlkQXNDTEkgfHwgcEVudHJ5LT5WYWxpZEFzV0RTIHx8IHBFbnRyeS0+VmFsaWRBc0FwQ2xpIHx8IHBFbnRyeS0+VmFsaWRBc01lc2gpKQorCXsKKwkJaWYgKE1BQ19BRERSX0VRVUFMKHBFbnRyeS0+QWRkciwgcEFkZHIpKQorCQl7CisJCQlicmVhazsKKwkJfQorCQllbHNlCisJCQlwRW50cnkgPSBwRW50cnktPnBOZXh0OworCX0KKworCXJldHVybiBwRW50cnk7Cit9CisKK01BQ19UQUJMRV9FTlRSWSAqTWFjVGFibGVJbnNlcnRFbnRyeSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgUFVDSEFSCQkJcEFkZHIsCisJSU4JVUNIQVIJCQlhcGlkeCwKKwlJTiBCT09MRUFOCUNsZWFuQWxsKQoreworCVVDSEFSIEhhc2hJZHg7CisJaW50IGksIEZpcnN0V2NpZDsKKwlNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeSA9IE5VTEwsICpwQ3VyckVudHJ5OworCisJLy8gaWYgRlVMTCwgcmV0dXJuCisJaWYgKHBBZC0+TWFjVGFiLlNpemUgPj0gTUFYX0xFTl9PRl9NQUNfVEFCTEUpCisJCXJldHVybiBOVUxMOworCisJRmlyc3RXY2lkID0gMTsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCWlmIChwQWQtPlN0YUNmZy5Cc3NUeXBlID09IEJTU19JTkZSQSkKKwkJRmlyc3RXY2lkID0gMjsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCS8vIGFsbG9jYXRlIG9uZSBNQUMgZW50cnkKKwlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPk1hY1RhYkxvY2spOworCWZvciAoaSA9IEZpcnN0V2NpZDsgaTwgTUFYX0xFTl9PRl9NQUNfVEFCTEU7IGkrKykgICAvLyBza2lwIGVudHJ5IzAgc28gdGhhdCAiZW50cnkgaW5kZXggPT0gQUlEIiBmb3IgZmFzdCBsb29rdXAKKwl7CisJCS8vIHBpY2sgdXAgdGhlIGZpcnN0IGF2YWlsYWJsZSB2YWNhbmN5CisJCWlmICgocEFkLT5NYWNUYWIuQ29udGVudFtpXS5WYWxpZEFzQ0xJID09IEZBTFNFKSAmJgorCQkJKHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uVmFsaWRBc1dEUyA9PSBGQUxTRSkgJiYKKwkJCShwQWQtPk1hY1RhYi5Db250ZW50W2ldLlZhbGlkQXNBcENsaT09IEZBTFNFKSAmJgorCQkJKHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uVmFsaWRBc01lc2ggPT0gRkFMU0UpCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJCQkmJiAocEFkLT5NYWNUYWIuQ29udGVudFtpXS5WYWxpZEFzRGxzID09IEZBTFNFKQorI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCQkJKQorCQl7CisJCQlwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtpXTsKKwkJCWlmIChDbGVhbkFsbCA9PSBUUlVFKQorCQkJeworCQkJCXBFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMTE7CisJCQkJcEVudHJ5LT5DdXJyVHhSYXRlID0gUkFURV8xMTsKKwkJCQlOZGlzWmVyb01lbW9yeShwRW50cnksIHNpemVvZihNQUNfVEFCTEVfRU5UUlkpKTsKKwkJCQlwRW50cnktPlBhaXJ3aXNlS2V5LktleUxlbiA9IDA7CisJCQkJcEVudHJ5LT5QYWlyd2lzZUtleS5DaXBoZXJBbGcgPSBDSVBIRVJfTk9ORTsKKwkJCX0KKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwkJCWlmIChhcGlkeCA+PSBNSU5fTkVUX0RFVklDRV9GT1JfRExTKQorCQkJeworCQkJCXBFbnRyeS0+VmFsaWRBc0NMSSA9IEZBTFNFOworCQkJCXBFbnRyeS0+VmFsaWRBc1dEUyA9IEZBTFNFOworCQkJCXBFbnRyeS0+VmFsaWRBc0FwQ2xpID0gRkFMU0U7CisJCQkJcEVudHJ5LT5WYWxpZEFzTWVzaCA9IEZBTFNFOworCQkJCXBFbnRyeS0+VmFsaWRBc0RscyA9IFRSVUU7CisJCQkJcEVudHJ5LT5pc0NhY2hlZCA9IEZBTFNFOworCQkJfQorCQkJZWxzZQorI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCQkJeworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJCQl7CisJCQkJCXBFbnRyeS0+VmFsaWRBc0NMSSA9IFRSVUU7CisJCQkJCXBFbnRyeS0+VmFsaWRBc1dEUyA9IEZBTFNFOworCQkJCQlwRW50cnktPlZhbGlkQXNBcENsaSA9IEZBTFNFOworCQkJCQlwRW50cnktPlZhbGlkQXNNZXNoID0gRkFMU0U7CisJCQkJCXBFbnRyeS0+VmFsaWRBc0RscyA9IEZBTFNFOworCQkJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwkJCX0KKworCQkJcEVudHJ5LT5iSUFtQmFkQXRoZXJvcyA9IEZBTFNFOworCQkJcEVudHJ5LT5wQWQgPSBwQWQ7CisJCQlwRW50cnktPkNNVGltZXJSdW5uaW5nID0gRkFMU0U7CisJCQlwRW50cnktPkVucXVldWVFYXBvbFN0YXJ0VGltZXJSdW5uaW5nID0gRUFQT0xfU1RBUlRfRElTQUJMRTsKKwkJCXBFbnRyeS0+UlNOSUVfTGVuID0gMDsKKwkJCU5kaXNaZXJvTWVtb3J5KHBFbnRyeS0+Ul9Db3VudGVyLCBzaXplb2YocEVudHJ5LT5SX0NvdW50ZXIpKTsKKwkJCXBFbnRyeS0+UmVUcnlDb3VudGVyID0gUEVFUl9NU0cxX1JFVFJZX1RJTUVSX0NUUjsKKworCQkJaWYgKHBFbnRyeS0+VmFsaWRBc01lc2gpCisJCQkJcEVudHJ5LT5hcGlkeCA9IChhcGlkeCAtIE1JTl9ORVRfREVWSUNFX0ZPUl9NRVNIKTsKKwkJCWVsc2UgaWYgKHBFbnRyeS0+VmFsaWRBc0FwQ2xpKQorCQkJCXBFbnRyeS0+YXBpZHggPSAoYXBpZHggLSBNSU5fTkVUX0RFVklDRV9GT1JfQVBDTEkpOworCQkJZWxzZSBpZiAocEVudHJ5LT5WYWxpZEFzV0RTKQorCQkJCXBFbnRyeS0+YXBpZHggPSAoYXBpZHggLSBNSU5fTkVUX0RFVklDRV9GT1JfV0RTKTsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwkJCWVsc2UgaWYgKHBFbnRyeS0+VmFsaWRBc0RscykKKwkJCQlwRW50cnktPmFwaWR4ID0gKGFwaWR4IC0gTUlOX05FVF9ERVZJQ0VfRk9SX0RMUyk7CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJCQllbHNlCisJCQkJcEVudHJ5LT5hcGlkeCA9IGFwaWR4OworCisJCQl7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQkJCXsKKwkJCQkJcEVudHJ5LT5BdXRoTW9kZSA9IHBBZC0+U3RhQ2ZnLkF1dGhNb2RlOworCQkJCQlwRW50cnktPldlcFN0YXR1cyA9IHBBZC0+U3RhQ2ZnLldlcFN0YXR1czsKKwkJCQkJcEVudHJ5LT5Qcml2YWN5RmlsdGVyID0gTmRpczgwMl8xMVByaXZGaWx0ZXJBY2NlcHRBbGw7CisjaWZkZWYgUlQyODYwCisJCQkJCUFzaWNSZW1vdmVQYWlyd2lzZUtleUVudHJ5KHBBZCwgcEVudHJ5LT5hcGlkeCwgKFVDSEFSKWkpOworI2VuZGlmIC8vIFJUMjg2MCAvLworCQkJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwkJCX0KKworCQkJcEVudHJ5LT5HVEtTdGF0ZSA9IFJFS0VZX05FR09USUFUSU5HOworCQkJcEVudHJ5LT5QYWlyd2lzZUtleS5LZXlMZW4gPSAwOworCQkJcEVudHJ5LT5QYWlyd2lzZUtleS5DaXBoZXJBbGcgPSBDSVBIRVJfTk9ORTsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJCWlmICgocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkgJiYKKwkJCQkocEFkLT5TdGFDZmcuQnNzVHlwZSA9PSBCU1NfQURIT0MpKQorCQkJCXBFbnRyeS0+UG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRDsKKwkJCWVsc2UKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwkJCWlmIChwRW50cnktPlZhbGlkQXNEbHMgPT0gVFJVRSkKKwkJCQlwRW50cnktPlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQ7CisJCQllbHNlCisjZW5kaWYgLy9RT1NfRExTX1NVUFBPUlQKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwkJCXBFbnRyeS0+UG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQ7CisJCQlwRW50cnktPlBNS0lEX0NhY2hlSWR4ID0gRU5UUllfTk9UX0ZPVU5EOworCQkJQ09QWV9NQUNfQUREUihwRW50cnktPkFkZHIsIHBBZGRyKTsKKwkJCXBFbnRyeS0+U3N0ID0gU1NUX05PVF9BVVRIOworCQkJcEVudHJ5LT5BdXRoU3RhdGUgPSBBU19OT1RfQVVUSDsKKwkJCXBFbnRyeS0+QWlkID0gKFVTSE9SVClpOyAgLy8wOworCQkJcEVudHJ5LT5DYXBhYmlsaXR5SW5mbyA9IDA7CisJCQlwRW50cnktPlBzTW9kZSA9IFBXUl9BQ1RJVkU7CisJCQlwRW50cnktPlBzUUlkbGVDb3VudCA9IDA7CisJCQlwRW50cnktPk5vRGF0YUlkbGVDb3VudCA9IDA7CisJCQlwRW50cnktPkNvbnRpbnVlVHhGYWlsQ250ID0gMDsKKwkJCUluaXRpYWxpemVRdWV1ZUhlYWRlcigmcEVudHJ5LT5Qc1F1ZXVlKTsKKworCisJCQlwQWQtPk1hY1RhYi5TaXplICsrOworCQkJLy8gQWRkIHRoaXMgZW50cnkgaW50byBBU0lDIFJYIFdDSUQgc2VhcmNoIHRhYmxlCisJCQlSVDI4WFhfU1RBX0VOVFJZX0FERChwQWQsIHBFbnRyeSk7CisKKworCisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNYWNUYWJsZUluc2VydEVudHJ5IC0gYWxsb2NhdGUgZW50cnkgIyVkLCBUb3RhbD0gJWRcbiIsaSwgcEFkLT5NYWNUYWIuU2l6ZSkpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvLyBhZGQgdGhpcyBNQUMgZW50cnkgaW50byBIQVNIIHRhYmxlCisJaWYgKHBFbnRyeSkKKwl7CisJCUhhc2hJZHggPSBNQUNfQUREUl9IQVNIX0lOREVYKHBBZGRyKTsKKwkJaWYgKHBBZC0+TWFjVGFiLkhhc2hbSGFzaElkeF0gPT0gTlVMTCkKKwkJeworCQkJcEFkLT5NYWNUYWIuSGFzaFtIYXNoSWR4XSA9IHBFbnRyeTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXBDdXJyRW50cnkgPSBwQWQtPk1hY1RhYi5IYXNoW0hhc2hJZHhdOworCQkJd2hpbGUgKHBDdXJyRW50cnktPnBOZXh0ICE9IE5VTEwpCisJCQkJcEN1cnJFbnRyeSA9IHBDdXJyRW50cnktPnBOZXh0OworCQkJcEN1cnJFbnRyeS0+cE5leHQgPSBwRW50cnk7CisJCX0KKwl9CisKKwlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPk1hY1RhYkxvY2spOworCXJldHVybiBwRW50cnk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJRGVsZXRlIGEgc3BlY2lmaWVkIGNsaWVudCBmcm9tIE1BQyB0YWJsZQorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK0JPT0xFQU4gTWFjVGFibGVEZWxldGVFbnRyeSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVU0hPUlQgd2NpZCwKKwlJTiBQVUNIQVIgcEFkZHIpCit7CisJVVNIT1JUIEhhc2hJZHg7CisJTUFDX1RBQkxFX0VOVFJZICpwRW50cnksICpwUHJldkVudHJ5LCAqcFByb2JlRW50cnk7CisJQk9PTEVBTiBDYW5jZWxsZWQ7CisKKwlpZiAod2NpZCA+PSBNQVhfTEVOX09GX01BQ19UQUJMRSkKKwkJcmV0dXJuIEZBTFNFOworCisJTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5NYWNUYWJMb2NrKTsKKworCUhhc2hJZHggPSBNQUNfQUREUl9IQVNIX0lOREVYKHBBZGRyKTsKKwlwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFt3Y2lkXTsKKworCWlmIChwRW50cnkgJiYgKHBFbnRyeS0+VmFsaWRBc0NMSSB8fCBwRW50cnktPlZhbGlkQXNBcENsaSB8fCBwRW50cnktPlZhbGlkQXNXRFMgfHwgcEVudHJ5LT5WYWxpZEFzTWVzaAorI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorIAkJfHwgcEVudHJ5LT5WYWxpZEFzRGxzCisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJCSkpCisJeworCQlpZiAoTUFDX0FERFJfRVFVQUwocEVudHJ5LT5BZGRyLCBwQWRkcikpCisJCXsKKworCQkJLy8gRGVsZXRlIHRoaXMgZW50cnkgZnJvbSBBU0lDIG9uLWNoaXAgV0NJRCBUYWJsZQorCQkJUlQyOFhYX1NUQV9FTlRSWV9NQUNfUkVTRVQocEFkLCB3Y2lkKTsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJLy8gZnJlZSByZXNvdXJjZXMgb2YgQkEKKwkJCUJBU2Vzc2lvblRlYXJEb3duQUxMKHBBZCwgcEVudHJ5LT5BaWQpOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisKKwkJCXBQcmV2RW50cnkgPSBOVUxMOworCQkJcFByb2JlRW50cnkgPSBwQWQtPk1hY1RhYi5IYXNoW0hhc2hJZHhdOworCQkJQVNTRVJUKHBQcm9iZUVudHJ5KTsKKworCQkJLy8gdXBkYXRlIEhhc2ggbGlzdAorCQkJZG8KKwkJCXsKKwkJCQlpZiAocFByb2JlRW50cnkgPT0gcEVudHJ5KQorCQkJCXsKKwkJCQkJaWYgKHBQcmV2RW50cnkgPT0gTlVMTCkKKwkJCQkJeworCQkJCQkJcEFkLT5NYWNUYWIuSGFzaFtIYXNoSWR4XSA9IHBFbnRyeS0+cE5leHQ7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlwUHJldkVudHJ5LT5wTmV4dCA9IHBFbnRyeS0+cE5leHQ7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJcFByZXZFbnRyeSA9IHBQcm9iZUVudHJ5OworCQkJCXBQcm9iZUVudHJ5ID0gcFByb2JlRW50cnktPnBOZXh0OworCQkJfSB3aGlsZSAocFByb2JlRW50cnkpOworCisJCQkvLyBub3QgZm91bmQgISEhCisJCQlBU1NFUlQocFByb2JlRW50cnkgIT0gTlVMTCk7CisKKwkJCVJUMjhYWF9TVEFfRU5UUllfS0VZX0RFTChwQWQsIEJTUzAsIHdjaWQpOworCisKKwkJaWYgKHBFbnRyeS0+RW5xdWV1ZUVhcG9sU3RhcnRUaW1lclJ1bm5pbmcgIT0gRUFQT0xfU1RBUlRfRElTQUJMRSkKKwkJeworCQkJUlRNUENhbmNlbFRpbWVyKCZwRW50cnktPkVucXVldWVTdGFydEZvclBTS1RpbWVyLCAmQ2FuY2VsbGVkKTsKKwkJCXBFbnRyeS0+RW5xdWV1ZUVhcG9sU3RhcnRUaW1lclJ1bm5pbmcgPSBFQVBPTF9TVEFSVF9ESVNBQkxFOworCQl9CisKKworICAgCQkJTmRpc1plcm9NZW1vcnkocEVudHJ5LCBzaXplb2YoTUFDX1RBQkxFX0VOVFJZKSk7CisJCQlwQWQtPk1hY1RhYi5TaXplIC0tOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTWFjVGFibGVEZWxldGVFbnRyeTEgLSBUb3RhbD0gJWRcbiIsIHBBZC0+TWFjVGFiLlNpemUpKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXByaW50aygiXG4lczogSW1wb3NzaWJsZSBXY2lkID0gJWQgISEhISFcbiIsIF9fZnVuY19fLCB3Y2lkKTsKKwkJfQorCX0KKworCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+TWFjVGFiTG9jayk7CisKKwkvL1Jlc2V0IG9wZXJhdGluZyBtb2RlIHdoZW4gbm8gU3RhLgorCWlmIChwQWQtPk1hY1RhYi5TaXplID09IDApCisJeworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQlwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8uQWRkSHRJbmZvMi5PcGVyYWlvbk1vZGUgPSAwOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQlBc2ljVXBkYXRlUHJvdGVjdChwQWQsIDAgLypwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8uQWRkSHRJbmZvMi5PcGVyYWlvbk1vZGUqLywgKEFMTE5fU0VUUFJPVEVDVCksIFRSVUUsIDAgLypwQWQtPk1hY1RhYi5mQW55U3RhdGlvbk5vbkdGKi8pOworCX0KKworCXJldHVybiBUUlVFOworfQorCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJVGhpcyByb3V0aW5lIHJlc2V0IHRoZSBlbnRpcmUgTUFDIHRhYmxlLiBBbGwgcGFja2V0cyBwZW5kaW5nIGluCisJCXRoZSBwb3dlci1zYXZpbmcgcXVldWVzIGFyZSBmcmVlZCBoZXJlLgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgTWFjVGFibGVSZXNldCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgcEFkKQoreworCWludCAgICAgICAgIGk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNYWNUYWJsZVJlc2V0XG4iKSk7CisJLy9OZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPk1hY1RhYkxvY2spOworCisJZm9yIChpPTE7IGk8TUFYX0xFTl9PRl9NQUNfVEFCTEU7IGkrKykKKwl7CisjaWZkZWYgUlQyODYwCisJCVJUMjhYWF9TVEFfRU5UUllfTUFDX1JFU0VUKHBBZCwgaSk7CisjZW5kaWYgLy8gUlQyODYwIC8vCisJCWlmIChwQWQtPk1hY1RhYi5Db250ZW50W2ldLlZhbGlkQXNDTEkgPT0gVFJVRSkKKwkgICB7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCS8vIGZyZWUgcmVzb3VyY2VzIG9mIEJBCisJCQlCQVNlc3Npb25UZWFyRG93bkFMTChwQWQsIGkpOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJCQlwQWQtPk1hY1RhYi5Db250ZW50W2ldLlZhbGlkQXNDTEkgPSBGQUxTRTsKKworCisKKworCQkJLy9Bc2ljRGVsV2NpZFRhYihwQWQsIGkpOworCQl9CisJfQorCisJcmV0dXJuOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBBc3NvY1Bhcm1GaWxsKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE9VVCBNTE1FX0FTU09DX1JFUV9TVFJVQ1QgKkFzc29jUmVxLAorCUlOIFBVQ0hBUiAgICAgICAgICAgICAgICAgICAgIHBBZGRyLAorCUlOIFVTSE9SVCAgICAgICAgICAgICAgICAgICAgIENhcGFiaWxpdHlJbmZvLAorCUlOIFVMT05HICAgICAgICAgICAgICAgICAgICAgIFRpbWVvdXQsCisJSU4gVVNIT1JUICAgICAgICAgICAgICAgICAgICAgTGlzdGVuSW50dikKK3sKKwlDT1BZX01BQ19BRERSKEFzc29jUmVxLT5BZGRyLCBwQWRkcik7CisJLy8gQWRkIG1hc2sgdG8gc3VwcG9ydCA4MDIuMTFiIG1vZGUgb25seQorCUFzc29jUmVxLT5DYXBhYmlsaXR5SW5mbyA9IENhcGFiaWxpdHlJbmZvICYgU1VQUE9SVEVEX0NBUEFCSUxJVFlfSU5GTzsgLy8gbm90IGNmLXBvbGxhYmxlLCBub3QgY2YtcG9sbC1yZXF1ZXN0CisJQXNzb2NSZXEtPlRpbWVvdXQgPSBUaW1lb3V0OworCUFzc29jUmVxLT5MaXN0ZW5JbnR2ID0gTGlzdGVuSW50djsKK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBEaXNhc3NvY1Bhcm1GaWxsKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE9VVCBNTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1QgKkRpc2Fzc29jUmVxLAorCUlOIFBVQ0hBUiBwQWRkciwKKwlJTiBVU0hPUlQgUmVhc29uKQoreworCUNPUFlfTUFDX0FERFIoRGlzYXNzb2NSZXEtPkFkZHIsIHBBZGRyKTsKKwlEaXNhc3NvY1JlcS0+UmVhc29uID0gUmVhc29uOworfQorCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlDaGVjayB0aGUgb3V0IGdvaW5nIGZyYW1lLCBpZiB0aGlzIGlzIGFuIERIQ1Agb3IgQVJQIGRhdGFncmFtCisJd2lsbCBiZSBkdXBsaWNhdGUgYW5vdGhlciBmcmFtZSBhdCBsb3cgZGF0YSByYXRlIHRyYW5zbWl0LgorCisJQXJndW1lbnRzOgorCQlwQWQgCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisJCXBQYWNrZXQgCVBvaW50ZXIgdG8gb3V0Z29pbmcgTmRpcyBmcmFtZQorCisJUmV0dXJuIFZhbHVlOgorCQlUUlVFCQlUbyBiZSBkdXBsaWNhdGUgYXQgTG93IGRhdGEgcmF0ZSB0cmFuc21pdC4gKDFtYikKKwkJRkFMU0UJCURvIG5vdGhpbmcuCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCU5vdGU6CisKKwkJTUFDIGhlYWRlciArIElQIEhlYWRlciArIFVEUCBIZWFkZXIKKwkJICAxNCBCeXRlcwkgIDIwIEJ5dGVzCisKKwkJVURQIEhlYWRlcgorCQkwMHwwMXwwMnwwM3wwNHwwNXwwNnwwN3wwOHwwOXwxMHwxMXwxMnwxM3wxNHwxNXwKKwkJCQkJCVNvdXJjZSBQb3J0CisJCTE2fDE3fDE4fDE5fDIwfDIxfDIyfDIzfDI0fDI1fDI2fDI3fDI4fDI5fDMwfDMxfAorCQkJCQlEZXN0aW5hdGlvbiBQb3J0CisKKwkJcG9ydCAweDQzIG1lYW5zIEJvb3RzdHJhcCBQcm90b2NvbCwgc2VydmVyLgorCQlQb3J0IDB4NDQgbWVhbnMgQm9vdHN0cmFwIFByb3RvY29sLCBjbGllbnQuCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCisKK0JPT0xFQU4gUlRNUENoZWNrREhDUEZyYW1lKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBORElTX1BBQ0tFVAlwUGFja2V0KQoreworCVBBQ0tFVF9JTkZPIAlQYWNrZXRJbmZvOworCVVMT05HCQkJTnVtYmVyT2ZCeXRlc1JlYWQgPSAwOworCVVMT05HCQkJQ3VycmVudE9mZnNldCA9IDA7CisJUFZPSUQJCQlwVmlydHVhbEFkZHJlc3MgPSBOVUxMOworCVVJTlQJCQlOZGlzQnVmZmVyTGVuZ3RoOworCVBVQ0hBUgkJCXBTcmM7CisJVVNIT1JUCQkJUHJvdG9jb2w7CisJVUNIQVIJCQlCeXRlT2Zmc2V0MzYgPSAwOworCVVDSEFSCQkJQnl0ZU9mZnNldDM4ID0gMDsKKwlCT09MRUFOIAkJUmVhZEZpcnN0UGFybSA9IFRSVUU7CisKKwlSVE1QX1F1ZXJ5UGFja2V0SW5mbyhwUGFja2V0LCAmUGFja2V0SW5mbywgKFBVQ0hBUiAqKSZwVmlydHVhbEFkZHJlc3MsICZOZGlzQnVmZmVyTGVuZ3RoKTsKKworCU51bWJlck9mQnl0ZXNSZWFkICs9IE5kaXNCdWZmZXJMZW5ndGg7CisJcFNyYyA9IChQVUNIQVIpIHBWaXJ0dWFsQWRkcmVzczsKKwlQcm90b2NvbCA9ICoocFNyYyArIDEyKSAqIDI1NiArICoocFNyYyArIDEzKTsKKworCS8vCisJLy8gQ2hlY2sgREhDUCAmIEJPT1RQIHByb3RvY29sCisJLy8KKwl3aGlsZSAoTnVtYmVyT2ZCeXRlc1JlYWQgPD0gUGFja2V0SW5mby5Ub3RhbFBhY2tldExlbmd0aCkKKwl7CisJCWlmICgoTnVtYmVyT2ZCeXRlc1JlYWQgPj0gMzUpICYmIChSZWFkRmlyc3RQYXJtID09IFRSVUUpKQorCQl7CisJCQlDdXJyZW50T2Zmc2V0ID0gMzUgLSAoTnVtYmVyT2ZCeXRlc1JlYWQgLSBOZGlzQnVmZmVyTGVuZ3RoKTsKKwkJCUJ5dGVPZmZzZXQzNiA9ICoocFNyYyArIEN1cnJlbnRPZmZzZXQpOworCQkJUmVhZEZpcnN0UGFybSA9IEZBTFNFOworCQl9CisKKwkJaWYgKE51bWJlck9mQnl0ZXNSZWFkID49IDM3KQorCQl7CisJCQlDdXJyZW50T2Zmc2V0ID0gMzcgLSAoTnVtYmVyT2ZCeXRlc1JlYWQgLSBOZGlzQnVmZmVyTGVuZ3RoKTsKKwkJCUJ5dGVPZmZzZXQzOCA9ICoocFNyYyArIEN1cnJlbnRPZmZzZXQpOworCQkJLy9FbmQgb2YgUmVhZAorCQkJYnJlYWs7CisJCX0KKwkJcmV0dXJuIEZBTFNFOworCX0KKworCS8vIENoZWNrIGZvciBESENQICYgQk9PVFAgcHJvdG9jb2wKKwlpZiAoKEJ5dGVPZmZzZXQzNiAhPSAweDQ0KSB8fCAoQnl0ZU9mZnNldDM4ICE9IDB4NDMpKQorCQl7CisJCS8vCisJCS8vIDIwNTQgKGhleCAwODA2KSBmb3IgQVJQIGRhdGFncmFtcworCQkvLyBpZiB0aGlzIHBhY2tldCBpcyBub3QgQVJQIGRhdGFncmFtcywgdGhlbiBkbyBub3RoaW5nCisJCS8vIEFSUCBkYXRhZ3JhbXMgd2lsbCBhbHNvIGJlIGR1cGxpY2F0ZSBhdCAxbWIgYnJvYWRjYXN0IGZyYW1lcworCQkvLworCQlpZiAoUHJvdG9jb2wgIT0gMHgwODA2ICkKKwkJCXJldHVybiBGQUxTRTsKKwkJfQorCisJcmV0dXJuIFRSVUU7Cit9CisKKworQk9PTEVBTiBSVE1QQ2hlY2tFdGhlclR5cGUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUE5ESVNfUEFDS0VUCXBQYWNrZXQpCit7CisJVVNIT1JUCVR5cGVMZW47CisJVUNIQVIJQnl0ZTAsIEJ5dGUxOworCVBVQ0hBUglwU3JjQnVmOworCVVJTlQzMglwa3RMZW47CisJVUlOVDE2IAlzcmNQb3J0LCBkc3RQb3J0OworCUJPT0xFQU4Jc3RhdHVzID0gVFJVRTsKKworCisJcFNyY0J1ZiA9IEdFVF9PU19QS1RfREFUQVBUUihwUGFja2V0KTsKKwlwa3RMZW4gPSBHRVRfT1NfUEtUX0xFTihwUGFja2V0KTsKKworCUFTU0VSVChwU3JjQnVmKTsKKworCVJUTVBfU0VUX1BBQ0tFVF9TUEVDSUZJQyhwUGFja2V0LCAwKTsKKworCS8vIGdldCBFdGhlcm5ldCBwcm90b2NvbCBmaWVsZAorCVR5cGVMZW4gPSAocFNyY0J1ZlsxMl0gPDwgOCkgKyBwU3JjQnVmWzEzXTsKKworCXBTcmNCdWYgKz0gTEVOR1RIXzgwMl8zOwkvLyBTa2lwIHRoZSBFdGhlcm5ldCBIZWFkZXIuCisKKwlpZiAoVHlwZUxlbiA8PSAxNTAwKQorCXsJLy8gODAyLjMsIDgwMi4zIExMQworCQkvKgorCQkJRGVzdE1BQyg2KSArIFNyY01BQyg2KSArIExlbmdodCgyKSArCisJCQlEU0FQKDEpICsgU1NBUCgxKSArIENvbnRyb2woMSkgKworCQkJaWYgdGhlIERTQVAgPSAweEFBLCBTU0FQPTB4QUEsIENvbnRvcmwgPSAweDAzLCBpdCBoYXMgYSA1LWJ5dGVzIFNOQVAgaGVhZGVyLgorCQkJCT0+ICsgU05BUCAoNSwgT3JpZ2luYXRpb25JRCgzKSArIGV0aGVyVHlwZSgyKSkKKwkJKi8KKwkJaWYgKHBTcmNCdWZbMF0gPT0gMHhBQSAmJiBwU3JjQnVmWzFdID09IDB4QUEgJiYgcFNyY0J1ZlsyXSA9PSAweDAzKQorCQl7CisJCQlTbmlmZjJCeXRlc0Zyb21OZGlzQnVmZmVyKHBTcmNCdWYsIDYsICZCeXRlMCwgJkJ5dGUxKTsKKwkJCVJUTVBfU0VUX1BBQ0tFVF9MTENTTkFQKHBQYWNrZXQsIDEpOworCQkJVHlwZUxlbiA9IChVU0hPUlQpKChCeXRlMCA8PCA4KSArIEJ5dGUxKTsKKwkJCXBTcmNCdWYgKz0gODsgLy8gU2tpcCB0aGlzIExMQy9TTkFQIGhlYWRlcgorCQl9CisJCWVsc2UKKwkJeworCQkJLy9JdCBqdXN0IGhhcyAzLWJ5dGUgTExDIGhlYWRlciwgbWF5YmUgYSBsZWdhY3kgZXRoZXIgdHlwZSBmcmFtZS4gd2UgZGlkbid0IGhhbmRsZSBpdC4KKwkJfQorCX0KKworCS8vIElmIGl0J3MgYSBWTEFOIHBhY2tldCwgZ2V0IHRoZSByZWFsIFR5cGUvTGVuZ3RoIGZpZWxkLgorCWlmIChUeXBlTGVuID09IDB4ODEwMCkKKwl7CisJCS8qIDB4ODEwMCBtZWFucyBWTEFOIHBhY2tldHMgKi8KKworCQkvKiBEZXN0LiBNQUMgQWRkcmVzcyAoNi1ieXRlcykgKworCQkgICBTb3VyY2UgTUFDIEFkZHJlc3MgKDYtYnl0ZXMpICsKKwkJICAgTGVuZ3RoL1R5cGUgPSA4MDIuMVEgVGFnIFR5cGUgKDItYnl0ZSkgKworCQkgICBUYWcgQ29udHJvbCBJbmZvcm1hdGlvbiAoMi1ieXRlcykgKworCQkgICBMZW5ndGggLyBUeXBlICgyLWJ5dGVzKSArCisJCSAgIGRhdGEgcGF5bG9hZCAoMC1uIGJ5dGVzKSArCisJCSAgIFBhZCAoMC1wIGJ5dGVzKSArCisJCSAgIEZyYW1lIENoZWNrIFNlcXVlbmNlICg0LWJ5dGVzKSAqLworCisJCVJUTVBfU0VUX1BBQ0tFVF9WTEFOKHBQYWNrZXQsIDEpOworCQlTbmlmZjJCeXRlc0Zyb21OZGlzQnVmZmVyKHBTcmNCdWYsIDIsICZCeXRlMCwgJkJ5dGUxKTsKKwkJVHlwZUxlbiA9IChVU0hPUlQpKChCeXRlMCA8PCA4KSArIEJ5dGUxKTsKKworCQlwU3JjQnVmICs9IDQ7IC8vIFNraXAgdGhlIFZMQU4gSGVhZGVyLgorCX0KKworCXN3aXRjaCAoVHlwZUxlbikKKwl7CisJCWNhc2UgMHgwODAwOgorCQkJeworCQkJCUFTU0VSVCgocGt0TGVuID4gMzQpKTsKKwkJCQlpZiAoKihwU3JjQnVmICsgOSkgPT0gMHgxMSkKKwkJCQl7CS8vIHVkcCBwYWNrZXQKKwkJCQkJQVNTRVJUKChwa3RMZW4gPiAzNCkpOwkvLyAxNCBmb3IgZXRoZXJuZXQgaGVhZGVyLCAyMCBmb3IgSVAgaGVhZGVyCisKKwkJCQkJcFNyY0J1ZiArPSAyMDsJLy8gU2tpcCB0aGUgSVAgaGVhZGVyCisJCQkJCXNyY1BvcnQgPSBPU19OVE9IUygqKChVSU5UMTYgKilwU3JjQnVmKSk7CisJCQkJCWRzdFBvcnQgPSBPU19OVE9IUygqKChVSU5UMTYgKikocFNyY0J1ZiArMikpKTsKKworCQkJCQlpZiAoKHNyY1BvcnQ9PTB4NDQgJiYgZHN0UG9ydD09MHg0MykgfHwgKHNyY1BvcnQ9PTB4NDMgJiYgZHN0UG9ydD09MHg0NCkpCisJCQkJCXsJLy9JdCdzIGEgQk9PVFAvREhDUCBwYWNrZXQKKwkJCQkJCVJUTVBfU0VUX1BBQ0tFVF9ESENQKHBQYWNrZXQsIDEpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgMHgwODA2OgorCQkJeworCQkJCS8vQVJQIFBhY2tldC4KKwkJCQlSVE1QX1NFVF9QQUNLRVRfREhDUChwUGFja2V0LCAxKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIDB4ODg4ZToKKwkJCXsKKwkJCQkvLyBFQVBPTCBQYWNrZXQuCisJCQkJUlRNUF9TRVRfUEFDS0VUX0VBUE9MKHBQYWNrZXQsIDEpOworCQkJfQorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlzdGF0dXMgPSBGQUxTRTsKKwkJCWJyZWFrOworCX0KKworCXJldHVybiBzdGF0dXM7CisKK30KKworCisKK1ZPSUQgVXBkYXRlX1Jzc2lfU2FtcGxlKAorCUlOIFBSVE1QX0FEQVBURVIJcEFkLAorCUlOIFJTU0lfU0FNUExFCQkqcFJzc2ksCisJSU4gUFJYV0lfU1RSVUMJCXBSeFdJKQorCQl7CisJQ0hBUglyc3NpMCA9IHBSeFdJLT5SU1NJMDsKKwlDSEFSCXJzc2kxID0gcFJ4V0ktPlJTU0kxOworCUNIQVIJcnNzaTIgPSBwUnhXSS0+UlNTSTI7CisKKwlpZiAocnNzaTAgIT0gMCkKKwl7CisJCXBSc3NpLT5MYXN0UnNzaTAJPSBDb252ZXJ0VG9Sc3NpKHBBZCwgKENIQVIpcnNzaTAsIFJTU0lfMCk7CisJCXBSc3NpLT5BdmdSc3NpMFg4CT0gKHBSc3NpLT5BdmdSc3NpMFg4IC0gcFJzc2ktPkF2Z1Jzc2kwKSArIHBSc3NpLT5MYXN0UnNzaTA7CisJCXBSc3NpLT5BdmdSc3NpMAk9IHBSc3NpLT5BdmdSc3NpMFg4ID4+IDM7CisJfQorCisJaWYgKHJzc2kxICE9IDApCisJeworCQlwUnNzaS0+TGFzdFJzc2kxCT0gQ29udmVydFRvUnNzaShwQWQsIChDSEFSKXJzc2kxLCBSU1NJXzEpOworCQlwUnNzaS0+QXZnUnNzaTFYOAk9IChwUnNzaS0+QXZnUnNzaTFYOCAtIHBSc3NpLT5BdmdSc3NpMSkgKyBwUnNzaS0+TGFzdFJzc2kxOworCQlwUnNzaS0+QXZnUnNzaTEJPSBwUnNzaS0+QXZnUnNzaTFYOCA+PiAzOworCX0KKworCWlmIChyc3NpMiAhPSAwKQorCXsKKwkJcFJzc2ktPkxhc3RSc3NpMgk9IENvbnZlcnRUb1Jzc2kocEFkLCAoQ0hBUilyc3NpMiwgUlNTSV8yKTsKKwkJcFJzc2ktPkF2Z1Jzc2kyWDggID0gKHBSc3NpLT5BdmdSc3NpMlg4IC0gcFJzc2ktPkF2Z1Jzc2kyKSArIHBSc3NpLT5MYXN0UnNzaTI7CisJCXBSc3NpLT5BdmdSc3NpMiA9IHBSc3NpLT5BdmdSc3NpMlg4ID4+IDM7CisJfQorfQorCisKKworLy8gTm9ybWFsIGxlZ2FjeSBSeCBwYWNrZXQgaW5kaWNhdGlvbgorVk9JRCBJbmRpY2F0ZV9MZWdhY3lfUGFja2V0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVJYX0JMSwkJCSpwUnhCbGssCisJSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCkKK3sKKwlQTkRJU19QQUNLRVQJcFJ4UGFja2V0ID0gcFJ4QmxrLT5wUnhQYWNrZXQ7CisJVUNIQVIJCQlIZWFkZXI4MDJfM1tMRU5HVEhfODAyXzNdOworCisJLy8gMS4gZ2V0IDgwMi4zIEhlYWRlcgorCS8vIDIuIHJlbW92ZSBMTEMKKwkvLyAJCWEuIHBvaW50ZXIgcFJ4QmxrLT5wRGF0YSB0byBwYXlsb2FkCisJLy8gICAgICBiLiBtb2RpZnkgcFJ4QmxrLT5EYXRhU2l6ZQorI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCVJUTVBfODAyXzExX1JFTU9WRV9MTENfQU5EX0NPTlZFUlRfVE9fODAyXzMocFJ4QmxrLCBIZWFkZXI4MDJfMyk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlpZiAocFJ4QmxrLT5EYXRhU2l6ZSA+IE1BWF9SWF9QS1RfTEVOKQorCXsKKworCQkvLyByZWxlYXNlIHBhY2tldAorCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4UGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJcmV0dXJuOworCX0KKworCisJU1RBVFNfSU5DX1JYX1BBQ0tFVFMocEFkLCBGcm9tV2hpY2hCU1NJRCk7CisKKworCXdsYW5fODAyXzExX3RvXzgwMl8zX3BhY2tldChwQWQsIHBSeEJsaywgSGVhZGVyODAyXzMsIEZyb21XaGljaEJTU0lEKTsKKworCS8vCisJLy8gcGFzcyB0aGlzIDgwMi4zIHBhY2tldCB0byB1cHBlciBsYXllciBvciBmb3J3YXJkIHRoaXMgcGFja2V0IHRvIFdNIGRpcmVjdGx5CisJLy8KKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQlBTk5PVU5DRV9PUl9GT1JXQVJEXzgwMl8zX1BBQ0tFVChwQWQsIHBSeFBhY2tldCwgRnJvbVdoaWNoQlNTSUQpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCit9CisKKworLy8gTm9ybWFsLCBBTVBEVSBvciBBTVNEVQorVk9JRCBDbW1SeG5vblJhbGlua0ZyYW1lSW5kaWNhdGUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUlhfQkxLCQkJKnBSeEJsaywKKwlJTglVQ0hBUgkJCUZyb21XaGljaEJTU0lEKQoreworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCWlmIChSWF9CTEtfVEVTVF9GTEFHKHBSeEJsaywgZlJYX0FNUERVKSAmJiAocEFkLT5Db21tb25DZmcuYkRpc2FibGVSZW9yZGVyaW5nID09IDApKQorCXsKKwkJSW5kaWNhdGVfQU1QRFVfUGFja2V0KHBBZCwgcFJ4QmxrLCBGcm9tV2hpY2hCU1NJRCk7CisJfQorCWVsc2UKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwl7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCWlmIChSWF9CTEtfVEVTVF9GTEFHKHBSeEJsaywgZlJYX0FNU0RVKSkKKwkJeworCQkJLy8gaGFuZGxlIEEtTVNEVQorCQkJSW5kaWNhdGVfQU1TRFVfUGFja2V0KHBBZCwgcFJ4QmxrLCBGcm9tV2hpY2hCU1NJRCk7CisJCX0KKwkJZWxzZQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQl7CisJCQlJbmRpY2F0ZV9MZWdhY3lfUGFja2V0KHBBZCwgcFJ4QmxrLCBGcm9tV2hpY2hCU1NJRCk7CisJCX0KKwl9Cit9CisKKworVk9JRCBDbW1SeFJhbGlua0ZyYW1lSW5kaWNhdGUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JTUFDX1RBQkxFX0VOVFJZCSpwRW50cnksCisJSU4JUlhfQkxLCQkJKnBSeEJsaywKKwlJTglVQ0hBUgkJCUZyb21XaGljaEJTU0lEKQoreworCVVDSEFSCQkJSGVhZGVyODAyXzNbTEVOR1RIXzgwMl8zXTsKKwlVSU5UMTYJCQlNc2R1MlNpemU7CisJVUlOVDE2IAkJCVBheWxvYWQxU2l6ZSwgUGF5bG9hZDJTaXplOworCVBVQ0hBUiAJCQlwRGF0YTI7CisJUE5ESVNfUEFDS0VUCXBQYWNrZXQyID0gTlVMTDsKKworCisKKwlNc2R1MlNpemUgPSAqKHBSeEJsay0+cERhdGEpICsgKCoocFJ4QmxrLT5wRGF0YSsxKSA8PCA4KTsKKworCWlmICgoTXNkdTJTaXplIDw9IDE1MzYpICYmIChNc2R1MlNpemUgPCBwUnhCbGstPkRhdGFTaXplKSkKKwl7CisJCS8qIHNraXAgdHdvIGJ5dGUgTVNEVTIgbGVuICovCisJCXBSeEJsay0+cERhdGEgKz0gMjsKKwkJcFJ4QmxrLT5EYXRhU2l6ZSAtPSAyOworCX0KKwllbHNlCisJeworCQkvLyByZWxlYXNlIHBhY2tldAorCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4QmxrLT5wUnhQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCQlyZXR1cm47CisJfQorCisJLy8gZ2V0IDgwMi4zIEhlYWRlciBhbmQgIHJlbW92ZSBMTEMKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQlSVE1QXzgwMl8xMV9SRU1PVkVfTExDX0FORF9DT05WRVJUX1RPXzgwMl8zKHBSeEJsaywgSGVhZGVyODAyXzMpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisKKwlBU1NFUlQocFJ4QmxrLT5wUnhQYWNrZXQpOworCisJLy8gUmFsaW5rIEFnZ3JlZ2F0aW9uIGZyYW1lCisJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNSeEFnZ3JlZ2F0aW9uQ291bnQgKys7CisJUGF5bG9hZDFTaXplID0gcFJ4QmxrLT5EYXRhU2l6ZSAtIE1zZHUyU2l6ZTsKKwlQYXlsb2FkMlNpemUgPSBNc2R1MlNpemUgLSBMRU5HVEhfODAyXzM7CisKKwlwRGF0YTIgPSBwUnhCbGstPnBEYXRhICsgUGF5bG9hZDFTaXplICsgTEVOR1RIXzgwMl8zOworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCXBQYWNrZXQyID0gZHVwbGljYXRlX3BrdChwQWQsIChwRGF0YTItTEVOR1RIXzgwMl8zKSwgTEVOR1RIXzgwMl8zLCBwRGF0YTIsIFBheWxvYWQyU2l6ZSwgRnJvbVdoaWNoQlNTSUQpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJaWYgKCFwUGFja2V0MikKKwl7CisJCS8vIHJlbGVhc2UgcGFja2V0CisJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhCbGstPnBSeFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCXJldHVybjsKKwl9CisKKwkvLyB1cGRhdGUgcGF5bG9hZCBzaXplIG9mIDFzdCBwYWNrZXQKKwlwUnhCbGstPkRhdGFTaXplID0gUGF5bG9hZDFTaXplOworCXdsYW5fODAyXzExX3RvXzgwMl8zX3BhY2tldChwQWQsIHBSeEJsaywgSGVhZGVyODAyXzMsIEZyb21XaGljaEJTU0lEKTsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCUFOTk9VTkNFX09SX0ZPUldBUkRfODAyXzNfUEFDS0VUKHBBZCwgcFJ4QmxrLT5wUnhQYWNrZXQsIEZyb21XaGljaEJTU0lEKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCWlmIChwUGFja2V0MikKKwl7CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCQlBTk5PVU5DRV9PUl9GT1JXQVJEXzgwMl8zX1BBQ0tFVChwQWQsIHBQYWNrZXQyLCBGcm9tV2hpY2hCU1NJRCk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJfQorfQorCisKKyNkZWZpbmUgUkVTRVRfRlJBR0ZSQU1FKF9mcmFnRnJhbWUpIFwKKwl7CQkJCQkJCQlcCisJCV9mcmFnRnJhbWUuUnhTaXplID0gMDsJCVwKKwkJX2ZyYWdGcmFtZS5TZXF1ZW5jZSA9IDA7CVwKKwkJX2ZyYWdGcmFtZS5MYXN0RnJhZyA9IDA7CVwKKwkJX2ZyYWdGcmFtZS5GbGFncyA9IDA7CQlcCisJfQorCisKK1BORElTX1BBQ0tFVCBSVE1QRGVGcmFnbWVudERhdGFGcmFtZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglSWF9CTEsJCQkqcFJ4QmxrKQoreworCVBIRUFERVJfODAyXzExCXBIZWFkZXIgPSBwUnhCbGstPnBIZWFkZXI7CisJUE5ESVNfUEFDS0VUCXBSeFBhY2tldCA9IHBSeEJsay0+cFJ4UGFja2V0OworCVVDSEFSCQkJKnBEYXRhID0gcFJ4QmxrLT5wRGF0YTsKKwlVU0hPUlQJCQlEYXRhU2l6ZSA9IHBSeEJsay0+RGF0YVNpemU7CisJUE5ESVNfUEFDS0VUCXBSZXRQYWNrZXQgPSBOVUxMOworCVVDSEFSCQkJKnBGcmFnQnVmZmVyID0gTlVMTDsKKwlCT09MRUFOIAkJYlJlYXNzRG9uZSA9IEZBTFNFOworCVVDSEFSCQkJSGVhZGVyUm9vbSA9IDA7CisKKworCUFTU0VSVChwSGVhZGVyKTsKKworCUhlYWRlclJvb20gPSBwRGF0YSAtIChVQ0hBUiAqKXBIZWFkZXI7CisKKwkvLyBSZS1hc3NlbWJsZSB0aGUgZnJhZ21lbnRlZCBwYWNrZXRzCisJaWYgKHBIZWFkZXItPkZyYWcgPT0gMCkJCS8vIEZyYWcuIE51bWJlciBpcyAwIDogRmlyc3QgZnJhZyBvciBvbmx5IG9uZSBwa3QKKwl7CisJCS8vIHRoZSBmaXJzdCBwa3Qgb2YgZnJhZ21lbnQsIHJlY29yZCBpdC4KKwkJaWYgKHBIZWFkZXItPkZDLk1vcmVGcmFnKQorCQl7CisJCQlBU1NFUlQocEFkLT5GcmFnRnJhbWUucEZyYWdQYWNrZXQpOworCQkJcEZyYWdCdWZmZXIgPSBHRVRfT1NfUEtUX0RBVEFQVFIocEFkLT5GcmFnRnJhbWUucEZyYWdQYWNrZXQpOworCQkJcEFkLT5GcmFnRnJhbWUuUnhTaXplICAgPSBEYXRhU2l6ZSArIEhlYWRlclJvb207CisJCQlOZGlzTW92ZU1lbW9yeShwRnJhZ0J1ZmZlciwJIHBIZWFkZXIsIHBBZC0+RnJhZ0ZyYW1lLlJ4U2l6ZSk7CisJCQlwQWQtPkZyYWdGcmFtZS5TZXF1ZW5jZSA9IHBIZWFkZXItPlNlcXVlbmNlOworCQkJcEFkLT5GcmFnRnJhbWUuTGFzdEZyYWcgPSBwSGVhZGVyLT5GcmFnOwkgICAvLyBTaG91bGQgYmUgMAorCQkJQVNTRVJUKHBBZC0+RnJhZ0ZyYW1lLkxhc3RGcmFnID09IDApOworCQkJZ290byBkb25lOwkvLyBlbmQgb2YgcHJvY2Vzc2luZyB0aGlzIGZyYW1lCisJCX0KKwl9CisJZWxzZQkvL01pZGRsZSAmIEVuZCBvZiBmcmFnbWVudAorCXsKKwkJaWYgKChwSGVhZGVyLT5TZXF1ZW5jZSAhPSBwQWQtPkZyYWdGcmFtZS5TZXF1ZW5jZSkgfHwKKwkJCShwSGVhZGVyLT5GcmFnICE9IChwQWQtPkZyYWdGcmFtZS5MYXN0RnJhZyArIDEpKSkKKwkJeworCQkJLy8gRnJhZ21lbnQgaXMgbm90IHRoZSBzYW1lIHNlcXVlbmNlIG9yIG91dCBvZiBmcmFnbWVudCBudW1iZXIgb3JkZXIKKwkJCS8vIFJlc2V0IEZyYWdtZW50IGNvbnRyb2wgYmxrCisJCQlSRVNFVF9GUkFHRlJBTUUocEFkLT5GcmFnRnJhbWUpOworCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiRnJhZ21lbnQgaXMgbm90IHRoZSBzYW1lIHNlcXVlbmNlIG9yIG91dCBvZiBmcmFnbWVudCBudW1iZXIgb3JkZXIuXG4iKSk7CisJCQlnb3RvIGRvbmU7IC8vIGdpdmUgdXAgdGhpcyBmcmFtZQorCQl9CisJCWVsc2UgaWYgKChwQWQtPkZyYWdGcmFtZS5SeFNpemUgKyBEYXRhU2l6ZSkgPiBNQVhfRlJBTUVfU0laRSkKKwkJeworCQkJLy8gRnJhZ21lbnQgZnJhbWUgaXMgdG9vIGxhcmdlLCBpdCBleGVlZHMgdGhlIG1heGltdW0gZnJhbWUgc2l6ZS4KKwkJCS8vIFJlc2V0IEZyYWdtZW50IGNvbnRyb2wgYmxrCisJCQlSRVNFVF9GUkFHRlJBTUUocEFkLT5GcmFnRnJhbWUpOworCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiRnJhZ21lbnQgZnJhbWUgaXMgdG9vIGxhcmdlLCBpdCBleGVlZHMgdGhlIG1heGltdW0gZnJhbWUgc2l6ZS5cbiIpKTsKKwkJCWdvdG8gZG9uZTsgLy8gZ2l2ZSB1cCB0aGlzIGZyYW1lCisJCX0KKworICAgICAgICAvLworCQkvLyBCcm9hZGNvbSBBUChCQ005NDcwNEFHUikgd2lsbCBzZW5kIG91dCBMTEMgaW4gZnJhZ21lbnQncyBwYWNrZXQsIExMQyBvbmx5IGNhbiBhY2NwZXQgYXQgZmlyc3QgZnJhZ21lbnQuCisJCS8vIEluIHRoaXMgY2FzZSwgd2Ugd2lsbCBkcm9wdCBpdC4KKwkJLy8KKwkJaWYgKE5kaXNFcXVhbE1lbW9yeShwRGF0YSwgU05BUF84MDJfMUgsIHNpemVvZihTTkFQXzgwMl8xSCkpKQorCQl7CisJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJGaW5kIGFub3RoZXIgTExDIGF0IE1pZGRsZSBvciBFbmQgZnJhZ21lbnQoU049JWQsIEZyYWc9JWQpXG4iLCBwSGVhZGVyLT5TZXF1ZW5jZSwgcEhlYWRlci0+RnJhZykpOworCQkJZ290byBkb25lOyAvLyBnaXZlIHVwIHRoaXMgZnJhbWUKKwkJfQorCisJCXBGcmFnQnVmZmVyID0gR0VUX09TX1BLVF9EQVRBUFRSKHBBZC0+RnJhZ0ZyYW1lLnBGcmFnUGFja2V0KTsKKworCQkvLyBjb25jYXRlbmF0ZSB0aGlzIGZyYWdtZW50IGludG8gdGhlIHJlLWFzc2VtYmx5IGJ1ZmZlcgorCQlOZGlzTW92ZU1lbW9yeSgocEZyYWdCdWZmZXIgKyBwQWQtPkZyYWdGcmFtZS5SeFNpemUpLCBwRGF0YSwgRGF0YVNpemUpOworCQlwQWQtPkZyYWdGcmFtZS5SeFNpemUgICs9IERhdGFTaXplOworCQlwQWQtPkZyYWdGcmFtZS5MYXN0RnJhZyA9IHBIZWFkZXItPkZyYWc7CSAgIC8vIFVwZGF0ZSBmcmFnbWVudCBudW1iZXIKKworCQkvLyBMYXN0IGZyYWdtZW50CisJCWlmIChwSGVhZGVyLT5GQy5Nb3JlRnJhZyA9PSBGQUxTRSkKKwkJeworCQkJYlJlYXNzRG9uZSA9IFRSVUU7CisJCX0KKwl9CisKK2RvbmU6CisJLy8gYWx3YXlzIHJlbGVhc2UgcnggZnJhZ21lbnRlZCBwYWNrZXQKKwlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4UGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKworCS8vIHJldHVybiBkZWZyYWdtZW50ZWQgcGFja2V0IGlmIHBhY2tldCBpcyByZWFzc2VtYmxlZCBjb21wbGV0ZWx5CisJLy8gb3RoZXJ3aXNlIHJldHVybiBOVUxMCisJaWYgKGJSZWFzc0RvbmUpCisJeworCQlQTkRJU19QQUNLRVQgcE5ld0ZyYWdQYWNrZXQ7CisKKwkJLy8gYWxsb2NhdGUgYSBuZXcgcGFja2V0IGJ1ZmZlciBmb3IgZnJhZ21lbnQKKwkJcE5ld0ZyYWdQYWNrZXQgPSBSVE1QX0FsbG9jYXRlRnJhZ1BhY2tldEJ1ZmZlcihwQWQsIFJYX0JVRkZFUl9OT1JNU0laRSk7CisJCWlmIChwTmV3RnJhZ1BhY2tldCkKKwkJeworCQkJLy8gdXBkYXRlIFJ4QmxrCisJCQlwUmV0UGFja2V0ID0gcEFkLT5GcmFnRnJhbWUucEZyYWdQYWNrZXQ7CisJCQlwQWQtPkZyYWdGcmFtZS5wRnJhZ1BhY2tldCA9IHBOZXdGcmFnUGFja2V0OworCQkJcFJ4QmxrLT5wSGVhZGVyID0gKFBIRUFERVJfODAyXzExKSBHRVRfT1NfUEtUX0RBVEFQVFIocFJldFBhY2tldCk7CisJCQlwUnhCbGstPnBEYXRhID0gKFVDSEFSICopcFJ4QmxrLT5wSGVhZGVyICsgSGVhZGVyUm9vbTsKKwkJCXBSeEJsay0+RGF0YVNpemUgPSBwQWQtPkZyYWdGcmFtZS5SeFNpemUgLSBIZWFkZXJSb29tOworCQkJcFJ4QmxrLT5wUnhQYWNrZXQgPSBwUmV0UGFja2V0OworCQl9CisJCWVsc2UKKwkJeworCQkJUkVTRVRfRlJBR0ZSQU1FKHBBZC0+RnJhZ0ZyYW1lKTsKKwkJfQorCX0KKworCXJldHVybiBwUmV0UGFja2V0OworfQorCisKK1ZPSUQgSW5kaWNhdGVfQU1TRFVfUGFja2V0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVJYX0JMSwkJCSpwUnhCbGssCisJSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCkKK3sKKwlVSU5UCQkJbk1TRFU7CisKKwl1cGRhdGVfb3NfcGFja2V0X2luZm8ocEFkLCBwUnhCbGssIEZyb21XaGljaEJTU0lEKTsKKwlSVE1QX1NFVF9QQUNLRVRfSUYocFJ4QmxrLT5wUnhQYWNrZXQsIEZyb21XaGljaEJTU0lEKTsKKwluTVNEVSA9IGRlYWdncmVnYXRlX0FNU0RVX2Fubm91bmNlKHBBZCwgcFJ4QmxrLT5wUnhQYWNrZXQsIHBSeEJsay0+cERhdGEsIHBSeEJsay0+RGF0YVNpemUpOworfQorCitWT0lEIEluZGljYXRlX0VBUE9MX1BhY2tldCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglSWF9CTEsJCQkqcFJ4QmxrLAorCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpCit7CisJTUFDX1RBQkxFX0VOVFJZICpwRW50cnkgPSBOVUxMOworCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCXsKKwkJcEVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF07CisJCVNUQVJ4RUFQT0xGcmFtZUluZGljYXRlKHBBZCwgcEVudHJ5LCBwUnhCbGssIEZyb21XaGljaEJTU0lEKTsKKwkJcmV0dXJuOworCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCWlmIChwRW50cnkgPT0gTlVMTCkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1dBUk4sICgiSW5kaWNhdGVfRUFQT0xfUGFja2V0OiBkcm9wIGFuZCByZWxlYXNlIHRoZSBpbnZhbGlkIHBhY2tldC5cbiIpKTsKKwkJLy8gcmVsZWFzZSBwYWNrZXQKKwkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeEJsay0+cFJ4UGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJcmV0dXJuOworCX0KK30KKworI2RlZmluZSBCQ05fVEJUVF9PRkZTRVQJCTY0CS8vZGVmZXIgNjQgdXMKK1ZPSUQgUmVTeW5jQmVhY29uVGltZSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCkKK3sKKworCVVJTlQzMiAgT2Zmc2V0OworCisKKwlPZmZzZXQgPSAocEFkLT5UYnR0VGlja0NvdW50KSAlIChCQ05fVEJUVF9PRkZTRVQpOworCisJcEFkLT5UYnR0VGlja0NvdW50Kys7CisKKwkvLworCS8vIFRoZSB1cGRhdGVkIEJlYWNvbkludGVydmFsIFZhbHVlIHdpbGwgYWZmZWN0IEJlYWNvbiBJbnRlcnZhbCBhZnRlciB0d28gVEJUVAorCS8vIGJlYWNhc3VlIHRoZSBvcmlnaW5hbCBCZWFjb25JbnRlcnZhbCBoYWQgYmVlbiBsb2FkZWQgaW50byBuZXh0IFRCVFRfVElNRVIKKwkvLworCWlmIChPZmZzZXQgPT0gKEJDTl9UQlRUX09GRlNFVC0yKSkKKwl7CisJCUJDTl9USU1FX0NGR19TVFJVQyBjc3I7CisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgQkNOX1RJTUVfQ0ZHLCAmY3NyLndvcmQpOworCQljc3IuZmllbGQuQmVhY29uSW50ZXJ2YWwgPSAocEFkLT5Db21tb25DZmcuQmVhY29uUGVyaW9kIDw8IDQpIC0gMSA7CS8vIEFTSUMgcmVnaXN0ZXIgaW4gdW5pdHMgb2YgMS8xNiBUVSA9IDY0dXMKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgQkNOX1RJTUVfQ0ZHLCBjc3Iud29yZCk7CisJfQorCWVsc2UKKwl7CisJCWlmIChPZmZzZXQgPT0gKEJDTl9UQlRUX09GRlNFVC0xKSkKKwkJeworCQkJQkNOX1RJTUVfQ0ZHX1NUUlVDIGNzcjsKKworCQkJUlRNUF9JT19SRUFEMzIocEFkLCBCQ05fVElNRV9DRkcsICZjc3Iud29yZCk7CisJCQljc3IuZmllbGQuQmVhY29uSW50ZXJ2YWwgPSAocEFkLT5Db21tb25DZmcuQmVhY29uUGVyaW9kKSA8PCA0OyAvLyBBU0lDIHJlZ2lzdGVyIGluIHVuaXRzIG9mIDEvMTYgVFUKKwkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIEJDTl9USU1FX0NGRywgY3NyLndvcmQpOworCQl9CisJfQorfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9jbW1fZGF0YV8yODYwLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9jbW1fZGF0YV8yODYwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDE5ZTUwYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2NtbV9kYXRhXzI4NjAuYwpAQCAtMCwwICsxLDEyNDAgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KKworLyoKKyAgIEFsbCBmdW5jdGlvbnMgaW4gdGhpcyBmaWxlIG11c3QgYmUgUENJLWRlcGVuZGVkLCBvciB5b3Ugc2hvdWxkIG91dCB5b3VyIGZ1bmN0aW9uCisJaW4gb3RoZXIgZmlsZXMuCisKKyovCisjaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCisKK2V4dGVybiBSVE1QX1JGX1JFR1MgUkYyODUwUmVnVGFibGVbXTsKK2V4dGVybiBVQ0hBUglOVU1fT0ZfMjg1MF9DSE5MOworCitVU0hPUlQgUnRtcFBDSV9Xcml0ZVR4UmVzb3VyY2UoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVFhfQkxLCQkJKnBUeEJsaywKKwlJTglCT09MRUFOCQkJYklzTGFzdCwKKwlPVVQJVVNIT1JUCQkJKkZyZWVOdW1iZXIpCit7CisKKwlVQ0hBUgkJCSpwRE1BSGVhZGVyQnVmVkE7CisJVVNIT1JUCQkJVHhJZHgsIFJldFR4SWR4OworCVBUWERfU1RSVUMJCXBUeEQ7CisJVUlOVDMyCQkJQnVmQmFzZVBhTG93OworCVBSVE1QX1RYX1JJTkcJcFR4UmluZzsKKwlVU0hPUlQJCQlod0hlYWRlckxlbjsKKworCS8vCisJLy8gZ2V0IFR4IFJpbmcgUmVzb3VyY2UKKwkvLworCXBUeFJpbmcgPSAmcEFkLT5UeFJpbmdbcFR4QmxrLT5RdWVJZHhdOworCVR4SWR4ID0gcEFkLT5UeFJpbmdbcFR4QmxrLT5RdWVJZHhdLlR4Q3B1SWR4OworCXBETUFIZWFkZXJCdWZWQSA9IChQVUNIQVIpIHBUeFJpbmctPkNlbGxbVHhJZHhdLkRtYUJ1Zi5BbGxvY1ZhOworCUJ1ZkJhc2VQYUxvdyA9IFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzTG93KHBUeFJpbmctPkNlbGxbVHhJZHhdLkRtYUJ1Zi5BbGxvY1BhKTsKKworCS8vIGNvcHkgVFhJTkZPICsgVFhXSSArIFdMQU4gSGVhZGVyICsgTExDIGludG8gRE1BIEhlYWRlciBCdWZmZXIKKwlpZiAocFR4QmxrLT5UeEZyYW1lVHlwZSA9PSBUWF9BTVNEVV9GUkFNRSkKKwl7CisJCWh3SGVhZGVyTGVuID0gcFR4QmxrLT5NcGR1SGVhZGVyTGVuIC0gTEVOR1RIX0FNU0RVX1NVQkZSQU1FSEVBRCArIHBUeEJsay0+SGRyUGFkTGVuICsgTEVOR1RIX0FNU0RVX1NVQkZSQU1FSEVBRDsKKwl9CisJZWxzZQorCXsKKwkJaHdIZWFkZXJMZW4gPSBwVHhCbGstPk1wZHVIZWFkZXJMZW4gKyBwVHhCbGstPkhkclBhZExlbjsKKwl9CisJTmRpc01vdmVNZW1vcnkocERNQUhlYWRlckJ1ZlZBLCBwVHhCbGstPkhlYWRlckJ1ZiwgVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkUgKyBod0hlYWRlckxlbik7CisKKwlwVHhSaW5nLT5DZWxsW1R4SWR4XS5wTmRpc1BhY2tldCA9IHBUeEJsay0+cFBhY2tldDsKKwlwVHhSaW5nLT5DZWxsW1R4SWR4XS5wTmV4dE5kaXNQYWNrZXQgPSBOVUxMOworCisJLy8KKwkvLyBidWlsZCBUeCBEZXNjcmlwdG9yCisJLy8KKworCXBUeEQgPSAoUFRYRF9TVFJVQykgcFR4UmluZy0+Q2VsbFtUeElkeF0uQWxsb2NWYTsKKwlOZGlzWmVyb01lbW9yeShwVHhELCBUWERfU0laRSk7CisKKwlwVHhELT5TRFB0cjAgPSBCdWZCYXNlUGFMb3c7CisJcFR4RC0+U0RMZW4wID0gVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkUgKyBod0hlYWRlckxlbjsgLy8gaW5jbHVkZSBwYWRkaW5nCisJcFR4RC0+U0RQdHIxID0gUENJX01BUF9TSU5HTEUocEFkLCBwVHhCbGssIDAsIDEsIFBDSV9ETUFfVE9ERVZJQ0UpOzsKKwlwVHhELT5TRExlbjEgPSBwVHhCbGstPlNyY0J1ZkxlbjsKKwlwVHhELT5MYXN0U2VjMCA9IDA7CisJcFR4RC0+TGFzdFNlYzEgPSAoYklzTGFzdCkgPyAxIDogMDsKKworCVJUTVBXcml0ZVR4RGVzY3JpcHRvcihwQWQsIHBUeEQsIEZBTFNFLCBGSUZPX0VEQ0EpOworCisJUmV0VHhJZHggPSBUeElkeDsKKwkvLworCS8vIFVwZGF0ZSBUeCBpbmRleAorCS8vCisJSU5DX1JJTkdfSU5ERVgoVHhJZHgsIFRYX1JJTkdfU0laRSk7CisJcFR4UmluZy0+VHhDcHVJZHggPSBUeElkeDsKKworCSpGcmVlTnVtYmVyIC09IDE7CisKKwlyZXR1cm4gUmV0VHhJZHg7Cit9CisKKworVVNIT1JUIFJ0bXBQQ0lfV3JpdGVTaW5nbGVUeFJlc291cmNlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVRYX0JMSwkJCSpwVHhCbGssCisJSU4JQk9PTEVBTgkJCWJJc0xhc3QsCisJT1VUCVVTSE9SVAkJCSpGcmVlTnVtYmVyKQoreworCisJVUNIQVIJCQkqcERNQUhlYWRlckJ1ZlZBOworCVVTSE9SVAkJCVR4SWR4LCBSZXRUeElkeDsKKwlQVFhEX1NUUlVDCQlwVHhEOworI2lmZGVmIFJUX0JJR19FTkRJQU4KKyAgICBQVFhEX1NUUlVDICAgICAgcERlc3RUeEQ7CisgICAgVFhEX1NUUlVDICAgICAgIFR4RDsKKyNlbmRpZgorCVVJTlQzMgkJCUJ1ZkJhc2VQYUxvdzsKKwlQUlRNUF9UWF9SSU5HCXBUeFJpbmc7CisJVVNIT1JUCQkJaHdIZWFkZXJMZW47CisKKwkvLworCS8vIGdldCBUeCBSaW5nIFJlc291cmNlCisJLy8KKwlwVHhSaW5nID0gJnBBZC0+VHhSaW5nW3BUeEJsay0+UXVlSWR4XTsKKwlUeElkeCA9IHBBZC0+VHhSaW5nW3BUeEJsay0+UXVlSWR4XS5UeENwdUlkeDsKKwlwRE1BSGVhZGVyQnVmVkEgPSAoUFVDSEFSKSBwVHhSaW5nLT5DZWxsW1R4SWR4XS5EbWFCdWYuQWxsb2NWYTsKKwlCdWZCYXNlUGFMb3cgPSBSVE1QX0dldFBoeXNpY2FsQWRkcmVzc0xvdyhwVHhSaW5nLT5DZWxsW1R4SWR4XS5EbWFCdWYuQWxsb2NQYSk7CisKKwkvLyBjb3B5IFRYSU5GTyArIFRYV0kgKyBXTEFOIEhlYWRlciArIExMQyBpbnRvIERNQSBIZWFkZXIgQnVmZmVyCisJaHdIZWFkZXJMZW4gPSBwVHhCbGstPk1wZHVIZWFkZXJMZW4gKyBwVHhCbGstPkhkclBhZExlbjsKKworCU5kaXNNb3ZlTWVtb3J5KHBETUFIZWFkZXJCdWZWQSwgcFR4QmxrLT5IZWFkZXJCdWYsIFRYSU5GT19TSVpFICsgVFhXSV9TSVpFICsgaHdIZWFkZXJMZW4pOworCisJcFR4UmluZy0+Q2VsbFtUeElkeF0ucE5kaXNQYWNrZXQgPSBwVHhCbGstPnBQYWNrZXQ7CisJcFR4UmluZy0+Q2VsbFtUeElkeF0ucE5leHROZGlzUGFja2V0ID0gTlVMTDsKKworCS8vCisJLy8gYnVpbGQgVHggRGVzY3JpcHRvcgorCS8vCisjaWZuZGVmIFJUX0JJR19FTkRJQU4KKwlwVHhEID0gKFBUWERfU1RSVUMpIHBUeFJpbmctPkNlbGxbVHhJZHhdLkFsbG9jVmE7CisjZWxzZQorCXBEZXN0VHhEID0gKFBUWERfU1RSVUMpIHBUeFJpbmctPkNlbGxbVHhJZHhdLkFsbG9jVmE7CisJVHhEID0gKnBEZXN0VHhEOworCXBUeEQgPSAmVHhEOworI2VuZGlmCisJTmRpc1plcm9NZW1vcnkocFR4RCwgVFhEX1NJWkUpOworCisJcFR4RC0+U0RQdHIwID0gQnVmQmFzZVBhTG93OworCXBUeEQtPlNETGVuMCA9IFRYSU5GT19TSVpFICsgVFhXSV9TSVpFICsgaHdIZWFkZXJMZW47IC8vIGluY2x1ZGUgcGFkZGluZworCXBUeEQtPlNEUHRyMSA9IFBDSV9NQVBfU0lOR0xFKHBBZCwgcFR4QmxrLCAwLCAxLCBQQ0lfRE1BX1RPREVWSUNFKTs7CisJcFR4RC0+U0RMZW4xID0gcFR4QmxrLT5TcmNCdWZMZW47CisJcFR4RC0+TGFzdFNlYzAgPSAwOworCXBUeEQtPkxhc3RTZWMxID0gKGJJc0xhc3QpID8gMSA6IDA7CisKKwlSVE1QV3JpdGVUeERlc2NyaXB0b3IocEFkLCBwVHhELCBGQUxTRSwgRklGT19FRENBKTsKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJUlRNUFdJRW5kaWFuQ2hhbmdlKChQVUNIQVIpKHBETUFIZWFkZXJCdWZWQSArIFRYSU5GT19TSVpFKSwgVFlQRV9UWFdJKTsKKwlSVE1QRnJhbWVFbmRpYW5DaGFuZ2UocEFkLCAoUFVDSEFSKShwRE1BSGVhZGVyQnVmVkEgKyBUWElORk9fU0laRSArIFRYV0lfU0laRSksIERJUl9XUklURSwgRkFMU0UpOworCVJUTVBEZXNjcmlwdG9yRW5kaWFuQ2hhbmdlKChQVUNIQVIpcFR4RCwgVFlQRV9UWEQpOworICAgIFdyaXRlQmFja1RvRGVzY3JpcHRvcigoUFVDSEFSKXBEZXN0VHhELCAoUFVDSEFSKXBUeEQsIEZBTFNFLCBUWVBFX1RYRCk7CisjZW5kaWYgLy8gUlRfQklHX0VORElBTiAvLworCisJUmV0VHhJZHggPSBUeElkeDsKKwkvLworCS8vIFVwZGF0ZSBUeCBpbmRleAorCS8vCisJSU5DX1JJTkdfSU5ERVgoVHhJZHgsIFRYX1JJTkdfU0laRSk7CisJcFR4UmluZy0+VHhDcHVJZHggPSBUeElkeDsKKworCSpGcmVlTnVtYmVyIC09IDE7CisKKwlyZXR1cm4gUmV0VHhJZHg7Cit9CisKKworVVNIT1JUIFJ0bXBQQ0lfV3JpdGVNdWx0aVR4UmVzb3VyY2UoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVFhfQkxLCQkJKnBUeEJsaywKKwlJTglVQ0hBUgkJCWZyYW1lTnVtLAorCU9VVAlVU0hPUlQJCQkqRnJlZU51bWJlcikKK3sKKwlCT09MRUFOIGJJc0xhc3Q7CisJVUNIQVIJCQkqcERNQUhlYWRlckJ1ZlZBOworCVVTSE9SVAkJCVR4SWR4LCBSZXRUeElkeDsKKwlQVFhEX1NUUlVDCQlwVHhEOworI2lmZGVmIFJUX0JJR19FTkRJQU4KKyAgICBQVFhEX1NUUlVDICAgICAgcERlc3RUeEQ7CisgICAgVFhEX1NUUlVDICAgICAgIFR4RDsKKyNlbmRpZgorCVVJTlQzMgkJCUJ1ZkJhc2VQYUxvdzsKKwlQUlRNUF9UWF9SSU5HCXBUeFJpbmc7CisJVVNIT1JUCQkJaHdIZHJMZW47CisJVUlOVDMyCQkJZmlyc3RETUFMZW47CisKKwliSXNMYXN0ID0gKChmcmFtZU51bSA9PSAocFR4QmxrLT5Ub3RhbEZyYW1lTnVtIC0gMSkpID8gMSA6IDApOworCisJLy8KKwkvLyBnZXQgVHggUmluZyBSZXNvdXJjZQorCS8vCisJcFR4UmluZyA9ICZwQWQtPlR4UmluZ1twVHhCbGstPlF1ZUlkeF07CisJVHhJZHggPSBwQWQtPlR4UmluZ1twVHhCbGstPlF1ZUlkeF0uVHhDcHVJZHg7CisJcERNQUhlYWRlckJ1ZlZBID0gKFBVQ0hBUikgcFR4UmluZy0+Q2VsbFtUeElkeF0uRG1hQnVmLkFsbG9jVmE7CisJQnVmQmFzZVBhTG93ID0gUlRNUF9HZXRQaHlzaWNhbEFkZHJlc3NMb3cocFR4UmluZy0+Q2VsbFtUeElkeF0uRG1hQnVmLkFsbG9jUGEpOworCisJaWYgKGZyYW1lTnVtID09IDApCisJeworCQkvLyBjb3B5IFRYSU5GTyArIFRYV0kgKyBXTEFOIEhlYWRlciArIExMQyBpbnRvIERNQSBIZWFkZXIgQnVmZmVyCisJCWlmIChwVHhCbGstPlR4RnJhbWVUeXBlID09IFRYX0FNU0RVX0ZSQU1FKQorCQkJLy9od0hkckxlbiA9IFJPVU5EX1VQKHBUeEJsay0+TXBkdUhlYWRlckxlbi1MRU5HVEhfQU1TRFVfU1VCRlJBTUVIRUFELCA0KStMRU5HVEhfQU1TRFVfU1VCRlJBTUVIRUFEOworCQkJaHdIZHJMZW4gPSBwVHhCbGstPk1wZHVIZWFkZXJMZW4gLSBMRU5HVEhfQU1TRFVfU1VCRlJBTUVIRUFEICsgcFR4QmxrLT5IZHJQYWRMZW4gKyBMRU5HVEhfQU1TRFVfU1VCRlJBTUVIRUFEOworCQllbHNlIGlmIChwVHhCbGstPlR4RnJhbWVUeXBlID09IFRYX1JBTElOS19GUkFNRSkKKwkJCS8vaHdIZHJMZW4gPSBST1VORF9VUChwVHhCbGstPk1wZHVIZWFkZXJMZW4tTEVOR1RIX0FSQUxJTktfSEVBREVSX0ZJRUxELCA0KStMRU5HVEhfQVJBTElOS19IRUFERVJfRklFTEQ7CisJCQlod0hkckxlbiA9IHBUeEJsay0+TXBkdUhlYWRlckxlbiAtIExFTkdUSF9BUkFMSU5LX0hFQURFUl9GSUVMRCArIHBUeEJsay0+SGRyUGFkTGVuICsgTEVOR1RIX0FSQUxJTktfSEVBREVSX0ZJRUxEOworCQllbHNlCisJCQkvL2h3SGRyTGVuID0gUk9VTkRfVVAocFR4QmxrLT5NcGR1SGVhZGVyTGVuLCA0KTsKKwkJCWh3SGRyTGVuID0gcFR4QmxrLT5NcGR1SGVhZGVyTGVuICsgcFR4QmxrLT5IZHJQYWRMZW47CisKKwkJZmlyc3RETUFMZW4gPSBUWElORk9fU0laRSArIFRYV0lfU0laRSArIGh3SGRyTGVuOworCX0KKwllbHNlCisJeworCQlmaXJzdERNQUxlbiA9IHBUeEJsay0+TXBkdUhlYWRlckxlbjsKKwl9CisKKwlOZGlzTW92ZU1lbW9yeShwRE1BSGVhZGVyQnVmVkEsIHBUeEJsay0+SGVhZGVyQnVmLCBmaXJzdERNQUxlbik7CisKKwlwVHhSaW5nLT5DZWxsW1R4SWR4XS5wTmRpc1BhY2tldCA9IHBUeEJsay0+cFBhY2tldDsKKwlwVHhSaW5nLT5DZWxsW1R4SWR4XS5wTmV4dE5kaXNQYWNrZXQgPSBOVUxMOworCisJLy8KKwkvLyBidWlsZCBUeCBEZXNjcmlwdG9yCisJLy8KKyNpZm5kZWYgUlRfQklHX0VORElBTgorCXBUeEQgPSAoUFRYRF9TVFJVQykgcFR4UmluZy0+Q2VsbFtUeElkeF0uQWxsb2NWYTsKKyNlbHNlCisJcERlc3RUeEQgPSAoUFRYRF9TVFJVQykgcFR4UmluZy0+Q2VsbFtUeElkeF0uQWxsb2NWYTsKKwlUeEQgPSAqcERlc3RUeEQ7CisJcFR4RCA9ICZUeEQ7CisjZW5kaWYKKwlOZGlzWmVyb01lbW9yeShwVHhELCBUWERfU0laRSk7CisKKwlwVHhELT5TRFB0cjAgPSBCdWZCYXNlUGFMb3c7CisJcFR4RC0+U0RMZW4wID0gZmlyc3RETUFMZW47IC8vIGluY2x1ZGUgcGFkZGluZworCXBUeEQtPlNEUHRyMSA9IFBDSV9NQVBfU0lOR0xFKHBBZCwgcFR4QmxrLCAwLCAxLCBQQ0lfRE1BX1RPREVWSUNFKTs7CisJcFR4RC0+U0RMZW4xID0gcFR4QmxrLT5TcmNCdWZMZW47CisJcFR4RC0+TGFzdFNlYzAgPSAwOworCXBUeEQtPkxhc3RTZWMxID0gKGJJc0xhc3QpID8gMSA6IDA7CisKKwlSVE1QV3JpdGVUeERlc2NyaXB0b3IocEFkLCBwVHhELCBGQUxTRSwgRklGT19FRENBKTsKKworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwlpZiAoZnJhbWVOdW0gPT0gMCkKKwkJUlRNUEZyYW1lRW5kaWFuQ2hhbmdlKHBBZCwgKFBVQ0hBUikocERNQUhlYWRlckJ1ZlZBKyBUWElORk9fU0laRSArIFRYV0lfU0laRSksIERJUl9XUklURSwgRkFMU0UpOworCisJaWYgKGZyYW1lTnVtICE9IDApCisJCVJUTVBXSUVuZGlhbkNoYW5nZSgoUFVDSEFSKShwRE1BSGVhZGVyQnVmVkEgKyBUWElORk9fU0laRSksIFRZUEVfVFhXSSk7CisKKwlSVE1QRGVzY3JpcHRvckVuZGlhbkNoYW5nZSgoUFVDSEFSKXBUeEQsIFRZUEVfVFhEKTsKKwlXcml0ZUJhY2tUb0Rlc2NyaXB0b3IoKFBVQ0hBUilwRGVzdFR4RCwgKFBVQ0hBUilwVHhELCBGQUxTRSwgVFlQRV9UWEQpOworI2VuZGlmIC8vIFJUX0JJR19FTkRJQU4gLy8KKworCVJldFR4SWR4ID0gVHhJZHg7CisJLy8KKwkvLyBVcGRhdGUgVHggaW5kZXgKKwkvLworCUlOQ19SSU5HX0lOREVYKFR4SWR4LCBUWF9SSU5HX1NJWkUpOworCXBUeFJpbmctPlR4Q3B1SWR4ID0gVHhJZHg7CisKKwkqRnJlZU51bWJlciAtPSAxOworCisJcmV0dXJuIFJldFR4SWR4OworCit9CisKKworVk9JRCBSdG1wUENJX0ZpbmFsV3JpdGVUeFJlc291cmNlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVRYX0JMSwkJCSpwVHhCbGssCisJSU4JVVNIT1JUCQkJdG90YWxNUERVU2l6ZSwKKwlJTglVU0hPUlQJCQlGaXJzdFR4SWR4KQoreworCisJUFRYV0lfU1RSVUMJCXBUeFdJOworCVBSVE1QX1RYX1JJTkcJcFR4UmluZzsKKworCS8vCisJLy8gZ2V0IFR4IFJpbmcgUmVzb3VyY2UKKwkvLworCXBUeFJpbmcgPSAmcEFkLT5UeFJpbmdbcFR4QmxrLT5RdWVJZHhdOworCXBUeFdJID0gKFBUWFdJX1NUUlVDKSBwVHhSaW5nLT5DZWxsW0ZpcnN0VHhJZHhdLkRtYUJ1Zi5BbGxvY1ZhOworCXBUeFdJLT5NUERVdG90YWxCeXRlQ291bnQgPSB0b3RhbE1QRFVTaXplOworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwlSVE1QV0lFbmRpYW5DaGFuZ2UoKFBVQ0hBUilwVHhXSSwgVFlQRV9UWFdJKTsKKyNlbmRpZiAvLyBSVF9CSUdfRU5ESUFOIC8vCisKK30KKworCitWT0lEIFJ0bXBQQ0lEYXRhTGFzdFR4SWR4KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVDSEFSCQkJUXVlSWR4LAorCUlOCVVTSE9SVAkJCUxhc3RUeElkeCkKK3sKKwlQVFhEX1NUUlVDCQlwVHhEOworI2lmZGVmIFJUX0JJR19FTkRJQU4KKyAgICBQVFhEX1NUUlVDICAgICAgcERlc3RUeEQ7CisgICAgVFhEX1NUUlVDICAgICAgIFR4RDsKKyNlbmRpZgorCVBSVE1QX1RYX1JJTkcJcFR4UmluZzsKKworCS8vCisJLy8gZ2V0IFR4IFJpbmcgUmVzb3VyY2UKKwkvLworCXBUeFJpbmcgPSAmcEFkLT5UeFJpbmdbUXVlSWR4XTsKKworCS8vCisJLy8gYnVpbGQgVHggRGVzY3JpcHRvcgorCS8vCisjaWZuZGVmIFJUX0JJR19FTkRJQU4KKwlwVHhEID0gKFBUWERfU1RSVUMpIHBUeFJpbmctPkNlbGxbTGFzdFR4SWR4XS5BbGxvY1ZhOworI2Vsc2UKKwlwRGVzdFR4RCA9IChQVFhEX1NUUlVDKSBwVHhSaW5nLT5DZWxsW0xhc3RUeElkeF0uQWxsb2NWYTsKKwlUeEQgPSAqcERlc3RUeEQ7CisJcFR4RCA9ICZUeEQ7CisjZW5kaWYKKworCXBUeEQtPkxhc3RTZWMxID0gMTsKKworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwlSVE1QRGVzY3JpcHRvckVuZGlhbkNoYW5nZSgoUFVDSEFSKXBUeEQsIFRZUEVfVFhEKTsKKyAgICBXcml0ZUJhY2tUb0Rlc2NyaXB0b3IoKFBVQ0hBUilwRGVzdFR4RCwgKFBVQ0hBUilwVHhELCBGQUxTRSwgVFlQRV9UWEQpOworI2VuZGlmIC8vIFJUX0JJR19FTkRJQU4gLy8KKworfQorCisKK1VTSE9SVAlSdG1wUENJX1dyaXRlRnJhZ1R4UmVzb3VyY2UoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVFhfQkxLCQkJKnBUeEJsaywKKwlJTglVQ0hBUgkJCWZyYWdOdW0sCisJT1VUCVVTSE9SVAkJCSpGcmVlTnVtYmVyKQoreworCVVDSEFSCQkJKnBETUFIZWFkZXJCdWZWQTsKKwlVU0hPUlQJCQlUeElkeCwgUmV0VHhJZHg7CisJUFRYRF9TVFJVQwkJcFR4RDsKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisgICAgUFRYRF9TVFJVQyAgICAgIHBEZXN0VHhEOworICAgIFRYRF9TVFJVQyAgICAgICBUeEQ7CisjZW5kaWYKKwlVSU5UMzIJCQlCdWZCYXNlUGFMb3c7CisJUFJUTVBfVFhfUklORwlwVHhSaW5nOworCVVTSE9SVAkJCWh3SGVhZGVyTGVuOworCVVJTlQzMgkJCWZpcnN0RE1BTGVuOworCisJLy8KKwkvLyBHZXQgVHggUmluZyBSZXNvdXJjZQorCS8vCisJcFR4UmluZyA9ICZwQWQtPlR4UmluZ1twVHhCbGstPlF1ZUlkeF07CisJVHhJZHggPSBwQWQtPlR4UmluZ1twVHhCbGstPlF1ZUlkeF0uVHhDcHVJZHg7CisJcERNQUhlYWRlckJ1ZlZBID0gKFBVQ0hBUikgcFR4UmluZy0+Q2VsbFtUeElkeF0uRG1hQnVmLkFsbG9jVmE7CisJQnVmQmFzZVBhTG93ID0gUlRNUF9HZXRQaHlzaWNhbEFkZHJlc3NMb3cocFR4UmluZy0+Q2VsbFtUeElkeF0uRG1hQnVmLkFsbG9jUGEpOworCisJLy8KKwkvLyBDb3B5IFRYSU5GTyArIFRYV0kgKyBXTEFOIEhlYWRlciArIExMQyBpbnRvIERNQSBIZWFkZXIgQnVmZmVyCisJLy8KKwlod0hlYWRlckxlbiA9IHBUeEJsay0+TXBkdUhlYWRlckxlbiArIHBUeEJsay0+SGRyUGFkTGVuOworCisJZmlyc3RETUFMZW4gPSBUWElORk9fU0laRSArIFRYV0lfU0laRSArIGh3SGVhZGVyTGVuOworCU5kaXNNb3ZlTWVtb3J5KHBETUFIZWFkZXJCdWZWQSwgcFR4QmxrLT5IZWFkZXJCdWYsIGZpcnN0RE1BTGVuKTsKKworCisJLy8KKwkvLyBCdWlsZCBUeCBEZXNjcmlwdG9yCisJLy8KKyNpZm5kZWYgUlRfQklHX0VORElBTgorCXBUeEQgPSAoUFRYRF9TVFJVQykgcFR4UmluZy0+Q2VsbFtUeElkeF0uQWxsb2NWYTsKKyNlbHNlCisJcERlc3RUeEQgPSAoUFRYRF9TVFJVQykgcFR4UmluZy0+Q2VsbFtUeElkeF0uQWxsb2NWYTsKKwlUeEQgPSAqcERlc3RUeEQ7CisJcFR4RCA9ICZUeEQ7CisjZW5kaWYKKwlOZGlzWmVyb01lbW9yeShwVHhELCBUWERfU0laRSk7CisKKwlpZiAoZnJhZ051bSA9PSBwVHhCbGstPlRvdGFsRnJhZ051bSkKKwl7CisJCXBUeFJpbmctPkNlbGxbVHhJZHhdLnBOZGlzUGFja2V0ID0gcFR4QmxrLT5wUGFja2V0OworCQlwVHhSaW5nLT5DZWxsW1R4SWR4XS5wTmV4dE5kaXNQYWNrZXQgPSBOVUxMOworCX0KKworCXBUeEQtPlNEUHRyMCA9IEJ1ZkJhc2VQYUxvdzsKKwlwVHhELT5TRExlbjAgPSBmaXJzdERNQUxlbjsgLy8gaW5jbHVkZSBwYWRkaW5nCisJcFR4RC0+U0RQdHIxID0gUENJX01BUF9TSU5HTEUocEFkLCBwVHhCbGssIDAsIDEsIFBDSV9ETUFfVE9ERVZJQ0UpOworCXBUeEQtPlNETGVuMSA9IHBUeEJsay0+U3JjQnVmTGVuOworCXBUeEQtPkxhc3RTZWMwID0gMDsKKwlwVHhELT5MYXN0U2VjMSA9IDE7CisKKwlSVE1QV3JpdGVUeERlc2NyaXB0b3IocEFkLCBwVHhELCBGQUxTRSwgRklGT19FRENBKTsKKworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwlSVE1QV0lFbmRpYW5DaGFuZ2UoKFBVQ0hBUikocERNQUhlYWRlckJ1ZlZBICsgVFhJTkZPX1NJWkUpLCBUWVBFX1RYV0kpOworCVJUTVBGcmFtZUVuZGlhbkNoYW5nZShwQWQsIChQVUNIQVIpKHBETUFIZWFkZXJCdWZWQSArIFRYSU5GT19TSVpFICsgVFhXSV9TSVpFKSwgRElSX1dSSVRFLCBGQUxTRSk7CisJUlRNUERlc2NyaXB0b3JFbmRpYW5DaGFuZ2UoKFBVQ0hBUilwVHhELCBUWVBFX1RYRCk7CisgICAgV3JpdGVCYWNrVG9EZXNjcmlwdG9yKChQVUNIQVIpcERlc3RUeEQsIChQVUNIQVIpcFR4RCwgRkFMU0UsIFRZUEVfVFhEKTsKKyNlbmRpZiAvLyBSVF9CSUdfRU5ESUFOIC8vCisKKwlSZXRUeElkeCA9IFR4SWR4OworCXBUeEJsay0+UHJpdiArPSBwVHhCbGstPlNyY0J1ZkxlbjsKKworCS8vCisJLy8gVXBkYXRlIFR4IGluZGV4CisJLy8KKwlJTkNfUklOR19JTkRFWChUeElkeCwgVFhfUklOR19TSVpFKTsKKwlwVHhSaW5nLT5UeENwdUlkeCA9IFR4SWR4OworCisJKkZyZWVOdW1iZXIgLT0gMTsKKworCXJldHVybiBSZXRUeElkeDsKKworfQorCisvKgorCU11c3QgYmUgcnVuIGluIEludGVycnVwdCBjb250ZXh0CisJVGhpcyBmdW5jdGlvbiBoYW5kbGUgUENJIHNwZWNpZmljIFR4RGVzYyBhbmQgY3B1IGluZGV4IHVwZGF0ZSBhbmQga2ljayB0aGUgcGFja2V0IG91dC4KKyAqLworaW50IFJ0bXBQQ0lNZ210S2lja091dCgKKwlJTiBSVE1QX0FEQVBURVIgCSpwQWQsCisJSU4gVUNIQVIgCQkJUXVlSWR4LAorCUlOIFBORElTX1BBQ0tFVAkJcFBhY2tldCwKKwlJTiBQVUNIQVIJCQlwU3JjQnVmVkEsCisJSU4gVUlOVCAJCQlTcmNCdWZMZW4pCit7CisJUFRYRF9TVFJVQwkJcFR4RDsKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisgICAgUFRYRF9TVFJVQyAgICAgIHBEZXN0VHhEOworICAgIFRYRF9TVFJVQyAgICAgICBUeEQ7CisjZW5kaWYKKwlVTE9ORwkJCVN3SWR4ID0gcEFkLT5NZ210UmluZy5UeENwdUlkeDsKKworI2lmZGVmIFJUX0JJR19FTkRJQU4KKyAgICBwRGVzdFR4RCAgPSAoUFRYRF9TVFJVQylwQWQtPk1nbXRSaW5nLkNlbGxbU3dJZHhdLkFsbG9jVmE7CisgICAgVHhEID0gKnBEZXN0VHhEOworICAgIHBUeEQgPSAmVHhEOworICAgIFJUTVBEZXNjcmlwdG9yRW5kaWFuQ2hhbmdlKChQVUNIQVIpcFR4RCwgVFlQRV9UWEQpOworI2Vsc2UKKwlwVHhEICA9IChQVFhEX1NUUlVDKSBwQWQtPk1nbXRSaW5nLkNlbGxbU3dJZHhdLkFsbG9jVmE7CisjZW5kaWYKKworCXBBZC0+TWdtdFJpbmcuQ2VsbFtTd0lkeF0ucE5kaXNQYWNrZXQgPSBwUGFja2V0OworCXBBZC0+TWdtdFJpbmcuQ2VsbFtTd0lkeF0ucE5leHROZGlzUGFja2V0ID0gTlVMTDsKKworCVJUTVBXcml0ZVR4RGVzY3JpcHRvcihwQWQsIHBUeEQsIFRSVUUsIEZJRk9fTUdNVCk7CisJcFR4RC0+TGFzdFNlYzAgPSAxOworCXBUeEQtPkxhc3RTZWMxID0gMTsKKwlwVHhELT5ETUFET05FID0gMDsKKwlwVHhELT5TRExlbjEgPSAwOworCXBUeEQtPlNEUHRyMCA9IFBDSV9NQVBfU0lOR0xFKHBBZCwgcFNyY0J1ZlZBLCBTcmNCdWZMZW4sIDAsIFBDSV9ETUFfVE9ERVZJQ0UpOzsKKwlwVHhELT5TRExlbjAgPSBTcmNCdWZMZW47CisKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJUlRNUERlc2NyaXB0b3JFbmRpYW5DaGFuZ2UoKFBVQ0hBUilwVHhELCBUWVBFX1RYRCk7CisgICAgV3JpdGVCYWNrVG9EZXNjcmlwdG9yKChQVUNIQVIpcERlc3RUeEQsIChQVUNIQVIpcFR4RCwgRkFMU0UsIFRZUEVfVFhEKTsKKyNlbmRpZgorCisJcEFkLT5SYWxpbmtDb3VudGVycy5LaWNrVHhDb3VudCsrOworCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhEb25lQ291bnQrKzsKKworCS8vIEluY3JlYXNlIFRYX0NUWF9JRFgsIGJ1dCB3cml0ZSB0byByZWdpc3RlciBsYXRlci4KKwlJTkNfUklOR19JTkRFWChwQWQtPk1nbXRSaW5nLlR4Q3B1SWR4LCBNR01UX1JJTkdfU0laRSk7CisKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9NR01UQ1RYX0lEWCwgIHBBZC0+TWdtdFJpbmcuVHhDcHVJZHgpOworCisJcmV0dXJuIDA7Cit9CisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCUNoZWNrIFJ4IGRlc2NyaXB0b3IsIHJldHVybiBORElTX1NUQVRVU19GQUlMVVJFIGlmIGFueSBlcnJvciBkb3VuZAorCisJQXJndW1lbnRzOgorCQlwUnhECQlQb2ludGVyIHRvIHRoZSBSeCBkZXNjcmlwdG9yCisKKwlSZXR1cm4gVmFsdWU6CisJCU5ESVNfU1RBVFVTX1NVQ0NFU1MgCU5vIGVycgorCQlORElTX1NUQVRVU19GQUlMVVJFIAlFcnJvcgorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK05ESVNfU1RBVFVTIFJUTVBDaGVja1J4RXJyb3IoCisJSU4JUFJUTVBfQURBUFRFUgkJcEFkLAorCUlOCVBIRUFERVJfODAyXzExCQlwSGVhZGVyLAorCUlOCVBSWFdJX1NUUlVDIAkJcFJ4V0ksCisJSU4gIFBSVDI4WFhfUlhEX1NUUlVDIAlwUnhEKQoreworCVBDSVBIRVJfS0VZIHBXcGFLZXk7CisJSU5UIGRCbTsKKworCS8vIFBoeSBlcnJvcnMgJiBDUkMgZXJyb3JzCisJaWYgKC8qKHBSeEQtPlBoeUVycikgfHwqLyAocFJ4RC0+Q3JjKSkKKwl7CisJCS8vIENoZWNrIFJTU0kgZm9yIE5vaXNlIEhpc3Qgc3RhdGlzdGljIGNvbGxlY3Rpb24uCisJCWRCbSA9IChJTlQpIChwUnhXSS0+UlNTSTApIC0gcEFkLT5CYnBSc3NpVG9EYm1EZWx0YTsKKwkJaWYgKGRCbSA8PSAtODcpCisJCQlwQWQtPlN0YUNmZy5SUElEZW5zaXR5WzBdICs9IDE7CisJCWVsc2UgaWYgKGRCbSA8PSAtODIpCisJCQlwQWQtPlN0YUNmZy5SUElEZW5zaXR5WzFdICs9IDE7CisJCWVsc2UgaWYgKGRCbSA8PSAtNzcpCisJCQlwQWQtPlN0YUNmZy5SUElEZW5zaXR5WzJdICs9IDE7CisJCWVsc2UgaWYgKGRCbSA8PSAtNzIpCisJCQlwQWQtPlN0YUNmZy5SUElEZW5zaXR5WzNdICs9IDE7CisJCWVsc2UgaWYgKGRCbSA8PSAtNjcpCisJCQlwQWQtPlN0YUNmZy5SUElEZW5zaXR5WzRdICs9IDE7CisJCWVsc2UgaWYgKGRCbSA8PSAtNjIpCisJCQlwQWQtPlN0YUNmZy5SUElEZW5zaXR5WzVdICs9IDE7CisJCWVsc2UgaWYgKGRCbSA8PSAtNTcpCisJCQlwQWQtPlN0YUNmZy5SUElEZW5zaXR5WzZdICs9IDE7CisJCWVsc2UgaWYgKGRCbSA+IC01NykKKwkJCXBBZC0+U3RhQ2ZnLlJQSURlbnNpdHlbN10gKz0gMTsKKworCQlyZXR1cm4oTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJfQorCisJLy8gQWRkIFJ4IHNpemUgdG8gY2hhbm5lbCBsb2FkIGNvdW50ZXIsIHdlIHNob3VsZCBpZ25vcmUgZXJyb3IgY291bnRzCisJcEFkLT5TdGFDZmcuQ0xCdXN5Qnl0ZXMgKz0gKHBSeEQtPlNETDAgKyAxNCk7CisKKwkvLyBEcm9wIFRvRHMgcHJvbWlzY291cyBmcmFtZSwgaXQgaXMgb3BlbmVkIGR1ZSB0byBDQ1ggMiBjaGFubmVsIGxvYWQgc3RhdGlzdGljcworCWlmIChwSGVhZGVyICE9IE5VTEwpCisJeworCQlpZiAocEhlYWRlci0+RkMuVG9EcykKKwkJeworCQkJcmV0dXJuKE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCQl9CisJfQorCisJLy8gRHJvcCBub3QgVTJNIGZyYW1lcywgY2FudCdzIGRyb3AgaGVyZSBiZWNhdXNlIHdlIHdpbGwgZHJvcCBiZWFjb24gaW4gdGhpcyBjYXNlCisJLy8gSSBhbSBraW5kIG9mIGRvdWJ0aW5nIHRoZSBVMk0gYml0IG9wZXJhdGlvbgorCS8vIGlmIChwUnhELT5VMk0gPT0gMCkKKwkvLwlyZXR1cm4oTkRJU19TVEFUVVNfRkFJTFVSRSk7CisKKwkvLyBkcm9wIGRlY3lwdGlvbiBmYWlsIGZyYW1lCisJaWYgKHBSeEQtPkNpcGhlckVycikKKwl7CisJCWlmIChwUnhELT5DaXBoZXJFcnIgPT0gMikKKwkJCXtEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsKCJwUnhEIEVSUk9SOiBJQ1Ygb2sgYnV0IE1JQ0VyciAiKSk7fQorCQllbHNlIGlmIChwUnhELT5DaXBoZXJFcnIgPT0gMSkKKwkJCXtEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsKCJwUnhEIEVSUk9SOiBJQ1YgRXJyICIpKTt9CisJCWVsc2UgaWYgKHBSeEQtPkNpcGhlckVyciA9PSAzKQorCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCgicFJ4RCBFUlJPUjogS2V5IG5vdCB2YWxpZCAiKSk7CisKKyAgICAgICAgaWYgKCgocFJ4RC0+Q2lwaGVyRXJyICYgMSkgPT0gMSkgJiYgcEFkLT5Db21tb25DZmcuYldpcmVsZXNzRXZlbnQgJiYgSU5GUkFfT04ocEFkKSkKKyAgICAgICAgICAgIFJUTVBTZW5kV2lyZWxlc3NFdmVudChwQWQsIElXX0lDVl9FUlJPUl9FVkVOVF9GTEFHLCBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkFkZHIsIEJTUzAsIDApOworCisJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwoIiAlZCAobGVuPSVkLCBNY2FzdD0lZCwgTXlCc3M9JWQsIFdjaWQ9JWQsIEtleUlkPSVkKVxuIiwKKwkJCXBSeEQtPkNpcGhlckVyciwKKwkJCXBSeEQtPlNETDAsCisJCQlwUnhELT5NY2FzdCB8IHBSeEQtPkJjYXN0LAorCQkJcFJ4RC0+TXlCc3MsCisJCQlwUnhXSS0+V2lyZWxlc3NDbGlJRCwKKwkJCXBSeFdJLT5LZXlJbmRleCkpOworCisJCS8vCisJCS8vIE1JQyBFcnJvcgorCQkvLworCQlpZiAocFJ4RC0+Q2lwaGVyRXJyID09IDIpCisJCXsKKwkJCXBXcGFLZXkgPSAmcEFkLT5TaGFyZWRLZXlbQlNTMF1bcFJ4V0ktPktleUluZGV4XTsKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgICAgICAgICBpZiAocEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQKQorICAgICAgICAgICAgICAgIFdwYVNlbmRNaWNGYWlsdXJlVG9XcGFTdXBwbGljYW50KHBBZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBXcGFLZXktPlR5cGUgPT0gUEFJUldJU0VLRVkpID8gVFJVRTpGQUxTRSk7CisgICAgICAgICAgICBlbHNlCisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCQkJICAgIFJUTVBSZXBvcnRNaWNFcnJvcihwQWQsIHBXcGFLZXkpOworCisgICAgICAgICAgICBpZiAoKChwUnhELT5DaXBoZXJFcnIgJiAyKSA9PSAyKSAmJiBwQWQtPkNvbW1vbkNmZy5iV2lyZWxlc3NFdmVudCAmJiBJTkZSQV9PTihwQWQpKQorICAgICAgICAgICAgICAgIFJUTVBTZW5kV2lyZWxlc3NFdmVudChwQWQsIElXX01JQ19FUlJPUl9FVkVOVF9GTEFHLCBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkFkZHIsIEJTUzAsIDApOworCisJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsKCJSeCBNSUMgVmFsdWUgZXJyb3JcbiIpKTsKKwkJfQorCisJCWlmIChwSGVhZGVyID09IE5VTEwpCisJCQlyZXR1cm4oTkRJU19TVEFUVVNfU1VDQ0VTUyk7CisKKwkJcmV0dXJuKE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCX0KKworCXJldHVybihORElTX1NUQVRVU19TVUNDRVNTKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlUaGlzIHJvdXRpbmUgc2VuZHMgY29tbWFuZCB0byBmaXJtd2FyZSBhbmQgdHVybiBvdXIgY2hpcCB0byBwb3dlciBzYXZlIG1vZGUuCisJCUJvdGggUmFkaW9PZmYgYW5kIC4xMSBwb3dlciBzYXZlIGZ1bmN0aW9uIG5lZWRzIHRvIGNhbGwgdGhpcyByb3V0aW5lLgorCUlucHV0OgorCQlMZXZlbCA9IEdVSVJBRElPX09GRiAgOiBHVUkgUmFkaW8gT2ZmIG1vZGUKKwkJTGV2ZWwgPSBET1QxMVBPV0VSU0FWRSAgOiA4MDIuMTEgcG93ZXIgc2F2ZSBtb2RlCisJCUxldmVsID0gUlRNUF9IQUxUICA6IFdoZW4gRGlzYWJsZSBkZXZpY2UuCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIFJUMjh4eFBjaUFzaWNSYWRpb09mZigKKwlJTiBQUlRNUF9BREFQVEVSICAgIHBBZCwKKwlJTiBVQ0hBUiAgICAgICAgICAgIExldmVsLAorCUlOIFVTSE9SVCAgICAgICAgICAgVGJ0dE51bVRvTmV4dFdha2VVcCkKK3sKKwlXUERNQV9HTE9fQ0ZHX1NUUlVDCURtYUNmZzsKKwlVQ0hBUgkJaSwgdGVtcEJCUF9SMyA9IDA7CisJQk9PTEVBTgkJYnJjID0gRkFMU0UsIENhbmNlbGxlZDsKKyAgICBVSU5UMzIJCVRiVFRUaW1lID0gMDsKKwlVSU5UMzIJCVBzUG9sbFRpbWUgPSAwLCBNQUNWYWx1ZTsKKyAgICBVTE9ORwkJQmVhY29uUGVyaW9kVGltZTsKKyAgICBVSU5UMzIJCVJ4RG1hSWR4LCBSeENwdUlkeDsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBc2ljUmFkaW9PZmYgPT09PiBUeENwdUlkeCA9ICVkLCBUeERtYUlkeCA9ICVkLiBSeENwdUlkeCA9ICVkLCBSeERtYUlkeCA9ICVkLlxuIiwgcEFkLT5UeFJpbmdbMF0uVHhDcHVJZHgsIHBBZC0+VHhSaW5nWzBdLlR4RG1hSWR4LCBwQWQtPlJ4UmluZy5SeENwdUlkeCwgcEFkLT5SeFJpbmcuUnhEbWFJZHgpKTsKKworICAgIC8vIENoZWNrIFJ4IERNQSBidXN5IHN0YXR1cywgaWYgbW9yZSB0aGFuIGhhbGYgaXMgb2NjdXBpZWQsIGdpdmUgdXAgdGhpcyByYWRpbyBvZmYuCisJUlRNUF9JT19SRUFEMzIocEFkLCBSWF9EUlhfSURYICwgJlJ4RG1hSWR4KTsKKwlSVE1QX0lPX1JFQUQzMihwQWQsIFJYX0NSWF9JRFggLCAmUnhDcHVJZHgpOworCWlmICgoUnhEbWFJZHggPiBSeENwdUlkeCkgJiYgKChSeERtYUlkeCAtIFJ4Q3B1SWR4KSA+IFJYX1JJTkdfU0laRS8zKSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFzaWNSYWRpb09mZiA9PT0+IHJldHVybjEuIFJ4RG1hSWR4ID0gJWQgLCAgUnhDcHVJZHggPSAlZC4gXG4iLCBSeERtYUlkeCwgUnhDcHVJZHgpKTsKKwkJcmV0dXJuOworCX0KKwllbHNlIGlmICgoUnhDcHVJZHggPj0gUnhEbWFJZHgpICYmICgoUnhDcHVJZHggLSBSeERtYUlkeCkgPCBSWF9SSU5HX1NJWkUvMykpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBc2ljUmFkaW9PZmYgPT09PiByZXR1cm4yLiAgUnhDcHVJZHggPSAlZC4gUnhEbWFJZHggPSAlZCAsICBcbiIsIFJ4Q3B1SWR4LCBSeERtYUlkeCkpOworCQlyZXR1cm47CisJfQorCisgICAgLy8gT25jZSBnbyBpbnRvIHRoaXMgZnVuY3Rpb24sIGRpc2FibGUgdHggYmVjYXVzZSBkb24ndCB3YW50IHRvbyBtYW55IHBhY2tldHMgaW4gcXVldWUgdG8gcHJldmVudCBIVyBzdG9wcy4KKwlwQWQtPmJQQ0ljbGtPZmZEaXNhYmxlVHggPSBUUlVFOworCisJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQURWQU5DRV9QT1dFUl9TQVZFX1BDSUVfREVWSUNFKSkKKwl7CisJICAgIFJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lLlJhZGlvT25PZmZUaW1lciwJJkNhbmNlbGxlZCk7CisJICAgIFJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lLlBzUG9sbFRpbWVyLAkmQ2FuY2VsbGVkKTsKKworCSAgICBpZiAoTGV2ZWwgPT0gRE9UMTFQT1dFUlNBVkUpCisJCXsKKwkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVEJUVF9USU1FUiwgJlRiVFRUaW1lKTsKKwkJCVRiVFRUaW1lICY9IDB4MWZmZmY7CisJCQkvLyAwMC4gY2hlY2sgaWYgbmVlZCB0byBkbyBzbGVlcCBpbiB0aGlzIERUSU0gcGVyaW9kLiAgIElmIG5leHQgYmVhY29uIHdpbGwgYXJyaXZlIHdpdGhpbiAzMG1zICwgLi4uZG9lc24ndCBuZWNlc3NhcmlseSBzbGVlcC4KKwkJCS8vIFRiVFRUaW1lIHVpbnQgPSA2NHVzLCBMRUFEX1RJTUUgdW5pdCA9IDEwMjR1cywgUHNQb2xsVGltZSB1bml0ID0gMW1zCisJICAgICAgICBpZiAgKCgoNjQqVGJUVFRpbWUpIDwoKExFQURfVElNRSoxMDI0KSArIDQwMDAwKSkgJiYgKFRidHROdW1Ub05leHRXYWtlVXAgPT0gMCkpCisJCQl7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiVGJUVFRpbWUgPSAweCV4ICwgZ2l2ZSB1cCB0aGlzIHNsZWVwLiBcbiIsIFRiVFRUaW1lKSk7CisJICAgICAgICAgICAgT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSk7CisJICAgICAgICAgICAgcEFkLT5iUENJY2xrT2ZmRGlzYWJsZVR4ID0gRkFMU0U7CisJCQkJcmV0dXJuOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCVBzUG9sbFRpbWUgPSAoNjQqVGJUVFRpbWUtIExFQURfVElNRSoxMDI0KS8xMDAwOworCQkJCVBzUG9sbFRpbWUgLT0gMzsKKworCSAgICAgICAgICAgIEJlYWNvblBlcmlvZFRpbWUgPSBwQWQtPkNvbW1vbkNmZy5CZWFjb25QZXJpb2QqMTAyLzEwMDsKKwkJCQlpZiAoVGJ0dE51bVRvTmV4dFdha2VVcCA+IDApCisJCQkJCVBzUG9sbFRpbWUgKz0gKChUYnR0TnVtVG9OZXh0V2FrZVVwIC0xKSAqIEJlYWNvblBlcmlvZFRpbWUpOworCisJICAgICAgICAgICAgcEFkLT5NbG1lLmJQc1BvbGxUaW1lclJ1bm5pbmcgPSBUUlVFOworCQkJCVJUTVBTZXRUaW1lcigmcEFkLT5NbG1lLlBzUG9sbFRpbWVyLCBQc1BvbGxUaW1lKTsKKwkJCX0KKwkJfQorCX0KKworICAgIC8vIDAuIERpc2FibGUgVHggRE1BLgorCVJUTVBfSU9fUkVBRDMyKHBBZCwgV1BETUFfR0xPX0NGRywgJkRtYUNmZy53b3JkKTsKKwlEbWFDZmcuZmllbGQuRW5hYmxlVHhETUEgPSAwOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIFdQRE1BX0dMT19DRkcsIERtYUNmZy53b3JkKTsKKworCS8vIDEuIFdhaXQgRE1BIG5vdCBidXN5CisJaSA9IDA7CisJZG8KKwl7CisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgV1BETUFfR0xPX0NGRywgJkRtYUNmZy53b3JkKTsKKwkJaWYgKChEbWFDZmcuZmllbGQuVHhETUFCdXN5ID09IDApICYmIChEbWFDZmcuZmllbGQuUnhETUFCdXN5ID09IDApKQorCQkJYnJlYWs7CisJCVJUTVB1c2VjRGVsYXkoMjApOworCQlpKys7CisJfXdoaWxlKGkgPCA1MCk7CisKKwlpZiAoaSA+PSA1MCkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkRNQSBrZWVwcyBidXN5LiAgcmV0dXJuIG9uIFJUMjh4eFBjaUFzaWNSYWRpb09mZiAoKVxuIikpOworCQlwQWQtPmJQQ0ljbGtPZmZEaXNhYmxlVHggPSBGQUxTRTsKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBXUERNQV9HTE9fQ0ZHLCAmRG1hQ2ZnLndvcmQpOworCQlEbWFDZmcuZmllbGQuRW5hYmxlVHhETUEgPSAxOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBXUERNQV9HTE9fQ0ZHLCBEbWFDZmcud29yZCk7CisJCXJldHVybjsKKwl9CisKKyAgICBSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9JRExFX1JBRElPX09GRik7CisKKyAgICAvLyBTZXQgdG8gMVIuCisgICAgdGVtcEJCUF9SMyA9IChwQWQtPlN0YUNmZy5CQlBSMyAmIDB4RTcpOworCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsIHRlbXBCQlBfUjMpOworCisJLy8gSW4gUmFkaW8gT2ZmLCB3ZSB0dXJuIG9mZiBSRiBjbGssIFNvIG5vdyBuZWVkIHRvIGNhbGwgQVNJQ1N3aXRjaENoYW5uZWwgYWdhaW4uCisJaWYgKElORlJBX09OKHBBZCkgJiYgKHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsICE9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpCisJCSYmIChwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5DaGFubmVsV2lkdGggPT0gQldfNDApKQorCXsKKwkJLy8gTXVzdCB1c2luZyA0ME1Iei4KKwkJQXNpY1R1cm5PZmZSRkNsayhwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsKTsKKwl9CisJZWxzZQorCXsKKwkJLy8gTXVzdCB1c2luZyAyME1Iei4KKwkJQXNpY1R1cm5PZmZSRkNsayhwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpOworCX0KKworICAgIC8vIFdoZW4gUENJIGNsb2NrIGlzIG9mZiwgZG9uJ3Qgd2FudCB0byBzZXJ2aWNlIGludGVycnVwdC4KKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBJTlRfTUFTS19DU1IsIEF1dG9XYWtldXBJbnQpOworCisgICAgUlRNUF9JT19XUklURTMyKHBBZCwgUlhfQ1JYX0lEWCwgcEFkLT5SeFJpbmcuUnhDcHVJZHgpOworCS8vIERpc2FibGUgTUFDIFJ4CisJUlRNUF9JT19SRUFEMzIocEFkLCBNQUNfU1lTX0NUUkwgLCAmTUFDVmFsdWUpOworCU1BQ1ZhbHVlICY9IDB4Zjc7CisJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMICwgTUFDVmFsdWUpOworCisJLy8gIDIuIFNlbmQgU2xlZXAgY29tbWFuZAorCVJUTVBfSU9fV1JJVEUzMihwQWQsIEgyTV9NQUlMQk9YX1NUQVRVUywgMHhmZmZmZmZmZik7CisJUlRNUF9JT19XUklURTMyKHBBZCwgSDJNX01BSUxCT1hfQ0lELCAweGZmZmZmZmZmKTsKKwlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4MzAsIFBvd2VyU2FmZUNJRCwgMHhmZiwgMHgwMCk7ICAgLy8gc2VuZCBQT1dFUi1TQVZFIGNvbW1hbmQgdG8gTUNVLiBUaW1lb3V0IHVuaXQ6NDB1cy4KKwkvLyAgMi0xLiBXYWl0IGNvbW1hbmQgc3VjY2VzcworCS8vIFN0YXR1cyA9IDEgOiBzdWNjZXNzLCBTdGF0dXMgPSAyLCBhbHJlYWR5IHNsZWVwLCBTdGF0dXMgPSAzLCBNYXliZSBNQUMgaXMgYnVzeSBzbyBjYW4ndCBmaW5pc2ggdGhpcyB0YXNrLgorCWJyYyA9IEFzaWNDaGVja0NvbW1hbk9rKHBBZCwgUG93ZXJTYWZlQ0lEKTsKKworICAgIGlmIChicmMgPT0gRkFMU0UpCisgICAgeworICAgICAgICAvLyB0cnkgYWdhaW4KKyAgICAJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDMwLCBQb3dlclNhZmVDSUQsIDB4ZmYsIDB4MDApOyAgIC8vIHNlbmQgUE9XRVItU0FWRSBjb21tYW5kIHRvIE1DVS4gVGltZW91dCB1bml0OjQwdXMuCisgICAgCS8vUlRNUHVzZWNEZWxheSgyMDApOworICAgIAlicmMgPSBBc2ljQ2hlY2tDb21tYW5PayhwQWQsIFBvd2VyU2FmZUNJRCk7CisgICAgfQorCisJLy8gIDMuIEFmdGVyIDB4MzAgY29tbWFuZCBpcyBvaywgc2VuZCByYWRpbyBvZmYgY29tbWFuZC4gbG93Ynl0ZSA9IDAgZm9yIHBvd2VyIHNhZmUuCisJLy8gSWYgMHgzMCBjb21tYW5kIGlzIG5vdCBvayB0aGlzIHRpbWUsIHdlIGNhbiBpZ25vcmUgMHgzNSBjb21tYW5kLiBJdCB3aWxsIG1ha2Ugc3VyZSBub3QgY2F1c2UgZmlybXdhcmUnciBwcm9ibGVtLgorCWlmICgoTGV2ZWwgPT0gRE9UMTFQT1dFUlNBVkUpICYmIChicmMgPT0gVFJVRSkpCisJeworCQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4MzUsIFBvd2VyUmFkaW9PZmZDSUQsIDAsIDB4MDApOwkvLyBsb3dieXRlID0gMCBtZWFucyB0byBkbyBwb3dlciBzYWZlLCBOT1QgdHVybiBvZmYgcmFkaW8uCisJIAkvLyAgMy0xLiBXYWl0IGNvbW1hbmQgc3VjY2VzcworCSAJQXNpY0NoZWNrQ29tbWFuT2socEFkLCBQb3dlclJhZGlvT2ZmQ0lEKTsKKwl9CisJZWxzZSBpZiAoYnJjID09IFRSVUUpCisJeworCQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4MzUsIFBvd2VyUmFkaW9PZmZDSUQsIDEsIDB4MDApOwkvLyBsb3dieXRlID0gMCBtZWFucyB0byBkbyBwb3dlciBzYWZlLCBOT1QgdHVybiBvZmYgcmFkaW8uCisJIAkvLyAgMy0xLiBXYWl0IGNvbW1hbmQgc3VjY2VzcworCSAJQXNpY0NoZWNrQ29tbWFuT2socEFkLCBQb3dlclJhZGlvT2ZmQ0lEKTsKKwl9CisKKyAgICAvLyBXYWl0IERNQSBub3QgYnVzeQorCWkgPSAwOworCWRvCisJeworCQlSVE1QX0lPX1JFQUQzMihwQWQsIFdQRE1BX0dMT19DRkcsICZEbWFDZmcud29yZCk7CisJCWlmIChEbWFDZmcuZmllbGQuUnhETUFCdXN5ID09IDApCisJCQlicmVhazsKKwkJUlRNUHVzZWNEZWxheSgyMCk7CisJCWkrKzsKKwl9d2hpbGUoaSA8IDUwKTsKKworCWlmIChpID49IDUwKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiRE1BIFJ4IGtlZXBzIGJ1c3kuICBvbiBSVDI4eHhQY2lBc2ljUmFkaW9PZmYgKClcbiIpKTsKKwl9CisJLy8gZGlzYWJsZSBETUEgUnguCisJeworCQlSVE1QX0lPX1JFQUQzMihwQWQsIFdQRE1BX0dMT19DRkcsICZEbWFDZmcud29yZCk7CisJCURtYUNmZy5maWVsZC5FbmFibGVSeERNQSA9IDA7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFdQRE1BX0dMT19DRkcsIERtYUNmZy53b3JkKTsKKwl9CisKKwlpZiAoTGV2ZWwgPT0gRE9UMTFQT1dFUlNBVkUpCisJeworCQlBVVRPX1dBS0VVUF9TVFJVQwlBdXRvV2FrZXVwQ2ZnOworCQkvL1JUTVBTZXRUaW1lcigmcEFkLT5NbG1lLlBzUG9sbFRpbWVyLCA5MCk7CisKKwkJLy8gd2UgaGF2ZSBkZWNpZGVkIHRvIFNMRUVQLCBzbyBhdCBsZWFzdCBkbyBpdCBmb3IgYSBCRUFDT04gcGVyaW9kLgorCQlpZiAoVGJ0dE51bVRvTmV4dFdha2VVcCA9PSAwKQorCQkJVGJ0dE51bVRvTmV4dFdha2VVcCA9IDE7CisKKwkJQXV0b1dha2V1cENmZy53b3JkID0gMDsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgQVVUT19XQUtFVVBfQ0ZHLCBBdXRvV2FrZXVwQ2ZnLndvcmQpOworCisJCS8vIDEuIFNldCBhdXRvIHdha2UgdXAgdGltZXIuCisJCUF1dG9XYWtldXBDZmcuZmllbGQuTnVtb2ZTbGVlcGluZ1RidHQgPSBUYnR0TnVtVG9OZXh0V2FrZVVwIC0gMTsKKwkJQXV0b1dha2V1cENmZy5maWVsZC5FbmFibGVBdXRvV2FrZXVwID0gMTsKKwkJQXV0b1dha2V1cENmZy5maWVsZC5BdXRvTGVhZFRpbWUgPSBMRUFEX1RJTUU7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIEFVVE9fV0FLRVVQX0NGRywgQXV0b1dha2V1cENmZy53b3JkKTsKKwl9CisKKwkvLyAgNC0xLiBJZiBpdCdzIHRvIGRpc2FibGUgb3VyIGRldmljZS4gTmVlZCB0byByZXN0b3JlIFBDSSBDb25maWd1cmF0aW9uIFNwYWNlIHRvIGl0cyBvcmlnaW5hbCB2YWx1ZS4KKwlpZiAoTGV2ZWwgPT0gUlRNUF9IQUxUKQorCXsKKwkJaWYgKChicmMgPT0gVFJVRSkgJiYgKGkgPCA1MCkpCisJCQlSVE1QUENJZUxpbmtDdHJsU2V0dGluZyhwQWQsIDEpOworCX0KKwkvLyAgNC4gU2V0IFBDSSBjb25maWd1cmF0aW9uIFNwYWNlIExpbmsgQ29tdHJvbCBmaWVsZHMuICBPbmx5IFJhZGlvIE9mZiBuZWVkcyB0byBjYWxsIHRoaXMgZnVuY3Rpb24KKwllbHNlCisJeworCQlpZiAoKGJyYyA9PSBUUlVFKSAmJiAoaSA8IDUwKSkKKwkJCVJUTVBQQ0llTGlua0N0cmxTZXR0aW5nKHBBZCwgMyk7CisJfQorCisgICAgcEFkLT5iUENJY2xrT2ZmRGlzYWJsZVR4ID0gRkFMU0U7Cit9CisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlUaGlzIHJvdXRpbmUgc2VuZHMgY29tbWFuZCB0byBmaXJtd2FyZSBhbmQgdHVybiBvdXIgY2hpcCB0byB3YWtlIHVwIG1vZGUgZnJvbSBwb3dlciBzYXZlIG1vZGUuCisJCUJvdGggUmFkaW9PbiBhbmQgLjExIHBvd2VyIHNhdmUgZnVuY3Rpb24gbmVlZHMgdG8gY2FsbCB0aGlzIHJvdXRpbmUuCisJSW5wdXQ6CisJCUxldmVsID0gR1VJUkFESU9fT0ZGIDogY2FsbCB0aGlzIGZ1bmN0aW9uIGlzIGZyb20gUmFkaW8gT2ZmIHRvIFJhZGlvIE9uLiAgTmVlZCB0byByZXN0b3JlIFBDSSBob3N0IHZhbHVlLgorCQlMZXZlbCA9IG90aGVyIHZhbHVlIDogbm9ybWFsIHdha2UgdXAgZnVuY3Rpb24uCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitCT09MRUFOIFJUMjh4eFBjaUFzaWNSYWRpb09uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVDSEFSICAgICBMZXZlbCkKK3sKKyAgICBXUERNQV9HTE9fQ0ZHX1NUUlVDCURtYUNmZzsKKwlCT09MRUFOCQkJCUNhbmNlbGxlZCwgYnJ2ID0gVFJVRTsKKyAgICBVSU5UMzIJCQkgICAgTUFDVmFsdWU7CisKKwlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19BRFZBTkNFX1BPV0VSX1NBVkVfUENJRV9ERVZJQ0UpKQorCXsKKwkgICAgcEFkLT5NbG1lLmJQc1BvbGxUaW1lclJ1bm5pbmcgPSBGQUxTRTsKKwkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWUuUHNQb2xsVGltZXIsCSZDYW5jZWxsZWQpOworCQlpZiAoKExldmVsID09IEdVSVJBRElPX09GRikgfHwgKExldmVsID09IEdVSV9JRExFX1BPV0VSX1NBVkUpKQorCQl7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVDI4eHhQY2lBc2ljUmFkaW9PbiAoKVxuIikpOworCQkJLy8gMS4gU2V0IFBDSSBMaW5rIENvbnRyb2wgaW4gQ29uZmlndXJhdGlvbiBTcGFjZS4KKwkJCVJUTVBQQ0llTGlua0N0cmxWYWx1ZVJlc3RvcmUocEFkLCBSRVNUT1JFX1dBS0VVUCk7CisJCQlSVE1QdXNlY0RlbGF5KDYwMDApOworCQl9CisJfQorCisgICAgcEFkLT5iUENJY2xrT2ZmID0gRkFMU0U7CisKKwkvLyAyLiBTZW5kIHdha2UgdXAgY29tbWFuZC4KKwlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4MzEsIFBvd2VyV2FrZUNJRCwgMHgwMCwgMHgwMCk7CisKKwkvLyAyLTEuIHdhaXQgY29tbWFuZCBvay4KKwlicnYgPSBBc2ljQ2hlY2tDb21tYW5PayhwQWQsIFBvd2VyV2FrZUNJRCk7CisgICAgaWYgKGJydikKKyAgICB7CisgICAgCS8vUlRNUF9JT19XUklURTMyKHBBZCwgSU5UX01BU0tfQ1NSLCAoREVMQVlJTlRNQVNLfFJ4SU5UKSk7CisgICAgCU5JQ0VuYWJsZUludGVycnVwdChwQWQpOworCisgICAgCS8vIDMuIEVuYWJsZSBUeCBETUEuCisgICAgCVJUTVBfSU9fUkVBRDMyKHBBZCwgV1BETUFfR0xPX0NGRywgJkRtYUNmZy53b3JkKTsKKyAgICAJRG1hQ2ZnLmZpZWxkLkVuYWJsZVR4RE1BID0gMTsKKyAgICAgICAgRG1hQ2ZnLmZpZWxkLkVuYWJsZVJ4RE1BID0gMTsKKyAgICAJUlRNUF9JT19XUklURTMyKHBBZCwgV1BETUFfR0xPX0NGRywgRG1hQ2ZnLndvcmQpOworCisgICAgICAgIC8vIEVhYmxlIE1BQyBSeAorICAgIAlSVE1QX0lPX1JFQUQzMihwQWQsIE1BQ19TWVNfQ1RSTCAsICZNQUNWYWx1ZSk7CisgICAgCU1BQ1ZhbHVlIHw9IDB4ODsKKyAgICAJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMICwgTUFDVmFsdWUpOworCisgICAgCVJUTVBfQ0xFQVJfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSURMRV9SQURJT19PRkYpOworICAgIAlpZiAoTGV2ZWwgPT0gR1VJX0lETEVfUE9XRVJfU0FWRSkKKyAgICAJeworICAgIAkJLy8gSW4gUmFkaW8gT2ZmLCB3ZSB0dXJuIG9mZiBSRiBjbGssIFNvIG5vdyBuZWVkIHRvIGNhbGwgQVNJQ1N3aXRjaENoYW5uZWwgYWdhaW4uCisgICAgCQlpZiAoSU5GUkFfT04ocEFkKSAmJiAocEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgIT0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkKKyAgICAJCQkmJiAocEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQ2hhbm5lbFdpZHRoID09IEJXXzQwKSkKKyAgICAJCXsKKyAgICAJCQkvLyBNdXN0IHVzaW5nIDQwTUh6LgorICAgIAkJCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwsIEZBTFNFKTsKKyAgICAJCQlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCk7CisgICAgCQl9CisgICAgCQllbHNlCisgICAgCQl7CisgICAgCQkJLy8gTXVzdCB1c2luZyAyME1Iei4KKyAgICAJCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwsIEZBTFNFKTsKKyAgICAJCQlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKTsKKyAgICAJCX0KKyAgICAJfQorICAgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICByZXR1cm4gRkFMU0U7Cit9CisKK1ZPSUQgUlQyOHh4UGNpU3RhQXNpY0ZvcmNlV2FrZXVwKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIEJPT0xFQU4gICAgICAgYkZyb21UeCkKK3sKKyAgICBBVVRPX1dBS0VVUF9TVFJVQwlBdXRvV2FrZXVwQ2ZnOworCisgICAgaWYgKCFPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0RPWkUpKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19XQUtFVVBfTk9XKSkKKyAgICB7CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIndha2luZyB1cCBub3chXG4iKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBPUFNUQVRVU19TRVRfRkxBRyhwQWQsIGZPUF9TVEFUVVNfV0FLRVVQX05PVyk7CisKKyAgICBpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19BRFZBTkNFX1BPV0VSX1NBVkVfUENJRV9ERVZJQ0UpKQorICAgIHsKKyAgICAgICAgLy8gU3VwcG9ydCBQQ0llIEFkdmFuY2UgUG93ZXIgU2F2ZQorICAgIAlpZiAoYkZyb21UeCA9PSBUUlVFKQorICAgIAl7CisgICAgICAgICAgICBwQWQtPk1sbWUuYlBzUG9sbFRpbWVyUnVubmluZyA9IEZBTFNFOworICAgIAkJUlRNUFBDSWVMaW5rQ3RybFZhbHVlUmVzdG9yZShwQWQsIFJFU1RPUkVfV0FLRVVQKTsKKyAgICAJCVJUTVB1c2VjRGVsYXkoMzAwMCk7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT09PT09QXNpY0ZvcmNlV2FrZXVwPT09YkZyb21UeFxuIikpOworICAgIAl9CisKKwkJQXV0b1dha2V1cENmZy53b3JkID0gMDsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgQVVUT19XQUtFVVBfQ0ZHLCBBdXRvV2FrZXVwQ2ZnLndvcmQpOworCisgICAgICAgIGlmIChSVDI4eHhQY2lBc2ljUmFkaW9PbihwQWQsIERPVDExUE9XRVJTQVZFKSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gSW4gUmFkaW8gT2ZmLCB3ZSB0dXJuIG9mZiBSRiBjbGssIFNvIG5vdyBuZWVkIHRvIGNhbGwgQVNJQ1N3aXRjaENoYW5uZWwgYWdhaW4uCisgICAgICAgIAlpZiAoSU5GUkFfT04ocEFkKSAmJiAocEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgIT0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkKKyAgICAgICAgCQkmJiAocEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQ2hhbm5lbFdpZHRoID09IEJXXzQwKSkKKyAgICAgICAgCXsKKyAgICAgICAgCQkvLyBNdXN0IHVzaW5nIDQwTUh6LgorICAgICAgICAJCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwsIEZBTFNFKTsKKyAgICAgICAgCQlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCk7CisgICAgICAgIAl9CisgICAgICAgIAllbHNlCisgICAgICAgIAl7CisgICAgICAgIAkJLy8gTXVzdCB1c2luZyAyME1Iei4KKyAgICAgICAgCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwsIEZBTFNFKTsKKyAgICAgICAgCQlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKTsKKyAgICAgICAgCX0KKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvLyBQQ0ksIDI4NjAtUENJZQorICAgICAgICBBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4MzEsIDB4ZmYsIDB4MDAsIDB4MDApOworCQlBdXRvV2FrZXVwQ2ZnLndvcmQgPSAwOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBBVVRPX1dBS0VVUF9DRkcsIEF1dG9XYWtldXBDZmcud29yZCk7CisgICAgfQorCisgICAgT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSk7CisgICAgT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfV0FLRVVQX05PVyk7CisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPD09PT09PT1SVDI4eHhQY2lTdGFBc2ljRm9yY2VXYWtldXBcbiIpKTsKK30KKworVk9JRCBSVDI4eHhQY2lTdGFBc2ljU2xlZXBUaGVuQXV0b1dha2V1cCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVU0hPUlQgVGJ0dE51bVRvTmV4dFdha2VVcCkKK3sKKyAgICBpZiAocEFkLT5TdGFDZmcuYlJhZGlvID09IEZBTFNFKQorCXsKKwkJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSk7CisJCXJldHVybjsKKwl9CisgICAgaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQURWQU5DRV9QT1dFUl9TQVZFX1BDSUVfREVWSUNFKSkKKyAgICB7CisgICAgCVVMT05HCU5vdyA9IDA7CisgICAgICAgIGlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1dBS0VVUF9OT1cpKQorICAgICAgICB7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJ3YWtpbmcgdXAgbm93IVxuIikpOworICAgICAgICAgICAgT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworCQlOZGlzR2V0U3lzdGVtVXBUaW1lKCZOb3cpOworCQkvLyBJZiBsYXN0IHNlbmQgTlVMTCBmcmFtIHRpbWUgaXMgdG9vIGNsb3NlIHRvIHRoaXMgcmVjZWl2aW5nIGJlYWNvbiAod2l0aGluIDhtcyksIGRvbid0IGdvIHRvIHNsZWVwIGZvciB0aGlzIERUTS4KKwkJLy8gQmVjYXVzZSBTb21lIEFQIGNhbid0IHF1ZXVpbmcgb3V0Z29pbmcgZnJhbWVzIGltbWVkaWF0ZWx5LgorCQlpZiAoKChwQWQtPk1sbWUuTGFzdFNlbmROVUxMcHNtVGltZSArIDgpID49IE5vdykgJiYgKHBBZC0+TWxtZS5MYXN0U2VuZE5VTExwc21UaW1lIDw9IE5vdykpCisJCXsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk5vdyA9ICVsdSwgTGFzdFNlbmROVUxMcHNtVGltZT0lbHUgOiAgUnhDb3VudFNpbmNlTGFzdE5VTEwgPSAlbHUuIFxuIiwgTm93LCBwQWQtPk1sbWUuTGFzdFNlbmROVUxMcHNtVGltZSwgcEFkLT5SYWxpbmtDb3VudGVycy5SeENvdW50U2luY2VMYXN0TlVMTCkpOworCQkJcmV0dXJuOworCQl9CisJCWVsc2UgaWYgKChwQWQtPlJhbGlua0NvdW50ZXJzLlJ4Q291bnRTaW5jZUxhc3ROVUxMID4gMCkgJiYgKChwQWQtPk1sbWUuTGFzdFNlbmROVUxMcHNtVGltZSArIHBBZC0+Q29tbW9uQ2ZnLkJlYWNvblBlcmlvZCkgPj0gTm93KSkKKwkJeworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTm93ID0gJWx1LCBMYXN0U2VuZE5VTExwc21UaW1lPSVsdTogUnhDb3VudFNpbmNlTGFzdE5VTEwgPSAlbHUgPiAwIFxuIiwgTm93LCBwQWQtPk1sbWUuTGFzdFNlbmROVUxMcHNtVGltZSwgIHBBZC0+UmFsaW5rQ291bnRlcnMuUnhDb3VudFNpbmNlTGFzdE5VTEwpKTsKKwkJCXJldHVybjsKKwkJfQorCisgICAgICAgIFJUMjh4eFBjaUFzaWNSYWRpb09mZihwQWQsIERPVDExUE9XRVJTQVZFLCBUYnR0TnVtVG9OZXh0V2FrZVVwKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgQVVUT19XQUtFVVBfU1RSVUMJQXV0b1dha2V1cENmZzsKKyAgICAgICAgLy8gd2UgaGF2ZSBkZWNpZGVkIHRvIFNMRUVQLCBzbyBhdCBsZWFzdCBkbyBpdCBmb3IgYSBCRUFDT04gcGVyaW9kLgorICAgICAgICBpZiAoVGJ0dE51bVRvTmV4dFdha2VVcCA9PSAwKQorICAgICAgICAgICAgVGJ0dE51bVRvTmV4dFdha2VVcCA9IDE7CisKKyAgICAgICAgQXV0b1dha2V1cENmZy53b3JkID0gMDsKKyAgICAgICAgUlRNUF9JT19XUklURTMyKHBBZCwgQVVUT19XQUtFVVBfQ0ZHLCBBdXRvV2FrZXVwQ2ZnLndvcmQpOworICAgICAgICBBdXRvV2FrZXVwQ2ZnLmZpZWxkLk51bW9mU2xlZXBpbmdUYnR0ID0gVGJ0dE51bVRvTmV4dFdha2VVcCAtIDE7CisgICAgICAgIEF1dG9XYWtldXBDZmcuZmllbGQuRW5hYmxlQXV0b1dha2V1cCA9IDE7CisgICAgICAgIEF1dG9XYWtldXBDZmcuZmllbGQuQXV0b0xlYWRUaW1lID0gNTsKKyAgICAgICAgUlRNUF9JT19XUklURTMyKHBBZCwgQVVUT19XQUtFVVBfQ0ZHLCBBdXRvV2FrZXVwQ2ZnLndvcmQpOworICAgICAgICBBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4MzAsIDB4ZmYsIDB4ZmYsIDB4MDApOyAgIC8vIHNlbmQgUE9XRVItU0FWRSBjb21tYW5kIHRvIE1DVS4gVGltZW91dCA0MHVzLgorICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8LS0gJXMsIFRidHROdW1Ub05leHRXYWtlVXA9JWQgXG4iLCBfX2Z1bmNfXywgVGJ0dE51bVRvTmV4dFdha2VVcCkpOworICAgIH0KKyAgICBPUFNUQVRVU19TRVRfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSk7Cit9CisKK1ZPSUQgUHNQb2xsV2FrZUV4ZWMoCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKQoreworCVJUTVBfQURBUFRFUiAqcEFkID0gKFJUTVBfQURBUFRFUiAqKUZ1bmN0aW9uQ29udGV4dDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCItLT5Qc1BvbGxXYWtlRXhlYyBcbiIpKTsKKwlSVE1QX0lOVF9MT0NLKCZwQWQtPmlycV9sb2NrLCBmbGFncyk7CisgICAgaWYgKHBBZC0+TWxtZS5iUHNQb2xsVGltZXJSdW5uaW5nKQorICAgIHsKKwkgICAgUlRNUFBDSWVMaW5rQ3RybFZhbHVlUmVzdG9yZShwQWQsIFJFU1RPUkVfV0FLRVVQKTsKKyAgICB9CisgICAgcEFkLT5NbG1lLmJQc1BvbGxUaW1lclJ1bm5pbmcgPSBGQUxTRTsKKwlSVE1QX0lOVF9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIGZsYWdzKTsKK30KKworVk9JRCAgUmFkaW9PbkV4ZWMoCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKQoreworCVJUTVBfQURBUFRFUiAqcEFkID0gKFJUTVBfQURBUFRFUiAqKUZ1bmN0aW9uQ29udGV4dDsKKwlXUERNQV9HTE9fQ0ZHX1NUUlVDCURtYUNmZzsKKwlCT09MRUFOCQkJCUNhbmNlbGxlZDsKKworCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0RPWkUpKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCItLT5SYWRpb09uRXhlYygpIHJldHVybiBvbiBmT1BfU1RBVFVTX0RPWkUgPT0gVFJVRTsgXG4iKSk7CisJCVJUTVBTZXRUaW1lcigmcEFkLT5NbG1lLlJhZGlvT25PZmZUaW1lciwgMTApOworCQlyZXR1cm47CisJfQorCisJaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUykpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIi0tPlJhZGlvT25FeGVjKCkgcmV0dXJuIG9uIFNDQU5fSU5fUFJPR1JFU1M7IFxuIikpOworCQlSVE1QU2V0VGltZXIoJnBBZC0+TWxtZS5SYWRpb09uT2ZmVGltZXIsIDEwKTsKKwkJcmV0dXJuOworCX0KKyAgICBwQWQtPk1sbWUuYlBzUG9sbFRpbWVyUnVubmluZyA9IEZBTFNFOworCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lLlBzUG9sbFRpbWVyLAkmQ2FuY2VsbGVkKTsKKwlpZiAocEFkLT5TdGFDZmcuYlJhZGlvID09IFRSVUUpCisJeworCQlwQWQtPmJQQ0ljbGtPZmYgPSBGQUxTRTsKKyAgICAgICAgUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX0FDX0JLKTsKKwkJUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX0FDX0JFKTsKKwkJUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX0FDX1ZJKTsKKwkJUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX0FDX1ZPKTsKKwkJUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX0hDQ0EpOworCQlSVE1QUmluZ0NsZWFuVXAocEFkLCBRSURfTUdNVCk7CisJCVJUTVBSaW5nQ2xlYW5VcChwQWQsIFFJRF9SWCk7CisKKwkJLy8gMi4gU2VuZCB3YWtlIHVwIGNvbW1hbmQuCisJCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHgzMSwgUG93ZXJXYWtlQ0lELCAweDAwLCAweDAyKTsKKwkJLy8gMi0xLiB3YWl0IGNvbW1hbmQgb2suCisJCUFzaWNDaGVja0NvbW1hbk9rKHBBZCwgUG93ZXJXYWtlQ0lEKTsKKworCQkvLyBXaGVuIFBDSSBjbG9jayBpcyBvZmYsIGRvbid0IHdhbnQgdG8gc2VydmljZSBpbnRlcnJ1cHQuIFNvIHdoZW4gYmFjayB0byBjbG9jayBvbiwgZW5hYmxlIGludGVycnVwdC4KKwkJTklDRW5hYmxlSW50ZXJydXB0KHBBZCk7CisKKwkJLy8gMy4gRW5hYmxlIFR4IERNQS4KKwkJUlRNUF9JT19SRUFEMzIocEFkLCBXUERNQV9HTE9fQ0ZHLCAmRG1hQ2ZnLndvcmQpOworCQlEbWFDZmcuZmllbGQuRW5hYmxlVHhETUEgPSAxOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBXUERNQV9HTE9fQ0ZHLCBEbWFDZmcud29yZCk7CisKKwkJLy8gSW4gUmFkaW8gT2ZmLCB3ZSB0dXJuIG9mZiBSRiBjbGssIFNvIG5vdyBuZWVkIHRvIGNhbGwgQVNJQ1N3aXRjaENoYW5uZWwgYWdhaW4uCisJCWlmIChJTkZSQV9PTihwQWQpICYmIChwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCAhPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKQorCQkJJiYgKHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkNoYW5uZWxXaWR0aCA9PSBCV180MCkpCisJCXsKKwkJCS8vIE11c3QgdXNpbmcgNDBNSHouCisJCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsLCBGQUxTRSk7CisJCQlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCk7CisJCX0KKwkJZWxzZQorCQl7CisJCQkvLyBNdXN0IHVzaW5nIDIwTUh6LgorCQkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsLCBGQUxTRSk7CisJCQlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKTsKKwkJfQorCisJCS8vIENsZWFyIFJhZGlvIG9mZiBmbGFnCisJCVJUTVBfQ0xFQVJfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkFESU9fT0ZGKTsKKworCQkvLyBTZXQgTEVECisJCVJUTVBTZXRMRUQocEFkLCBMRURfUkFESU9fT04pOworCisgICAgICAgIGlmIChwQWQtPlN0YUNmZy5Qc20gPT0gUFdSX0FDVElWRSkKKyAgICAgICAgeworICAgIAkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgcEFkLT5TdGFDZmcuQkJQUjMpOworICAgICAgICB9CisJfQorCWVsc2UKKwl7CisJCVJUMjh4eFBjaUFzaWNSYWRpb09mZihwQWQsIEdVSVJBRElPX09GRiwgMCk7CisJfQorfQorCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKK1ZPSUQgUlQyOHh4UGNpTWxtZVJhZGlvT24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisgICAgaWYgKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkFESU9fT0ZGKSkKKyAgIAkJcmV0dXJuOworCisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCIlcz09PT5cbiIsIF9fZnVuY19fKSk7CisKKyAgICBpZiAoKHBBZC0+T3BNb2RlID09IE9QTU9ERV9BUCkgfHwKKyAgICAgICAgKChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKSAmJiAoIU9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQURWQU5DRV9QT1dFUl9TQVZFX1BDSUVfREVWSUNFKSkpKQorICAgIHsKKyAgICAJTklDUmVzZXRGcm9tRXJyb3IocEFkKTsKKworICAgIAlSVE1QUmluZ0NsZWFuVXAocEFkLCBRSURfQUNfQkspOworICAgIAlSVE1QUmluZ0NsZWFuVXAocEFkLCBRSURfQUNfQkUpOworICAgIAlSVE1QUmluZ0NsZWFuVXAocEFkLCBRSURfQUNfVkkpOworICAgIAlSVE1QUmluZ0NsZWFuVXAocEFkLCBRSURfQUNfVk8pOworICAgIAlSVE1QUmluZ0NsZWFuVXAocEFkLCBRSURfSENDQSk7CisgICAgCVJUTVBSaW5nQ2xlYW5VcChwQWQsIFFJRF9NR01UKTsKKyAgICAJUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX1JYKTsKKworICAgIAkvLyBFbmFibGUgVHgvUngKKyAgICAJUlRNUEVuYWJsZVJ4VHgocEFkKTsKKworICAgIAkvLyBDbGVhciBSYWRpbyBvZmYgZmxhZworICAgIAlSVE1QX0NMRUFSX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JBRElPX09GRik7CisKKwkgICAgLy8gU2V0IExFRAorCSAgICBSVE1QU2V0TEVEKHBBZCwgTEVEX1JBRElPX09OKTsKKyAgICB9CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKyAgICBpZiAoKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpICYmCisgICAgICAgIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0FEVkFOQ0VfUE9XRVJfU0FWRV9QQ0lFX0RFVklDRSkpKQorICAgIHsKKyAgICAgICAgQk9PTEVBTgkJQ2FuY2VsbGVkOworCisgICAgCVJUTVBQQ0llTGlua0N0cmxWYWx1ZVJlc3RvcmUocEFkLCBSRVNUT1JFX1dBS0VVUCk7CisKKyAgICAgICAgcEFkLT5NbG1lLmJQc1BvbGxUaW1lclJ1bm5pbmcgPSBGQUxTRTsKKyAgICAJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWUuUHNQb2xsVGltZXIsCSZDYW5jZWxsZWQpOworICAgIAlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZS5SYWRpb09uT2ZmVGltZXIsCSZDYW5jZWxsZWQpOworICAgIAlSVE1QU2V0VGltZXIoJnBBZC0+TWxtZS5SYWRpb09uT2ZmVGltZXIsIDEwKTsKKyAgICB9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCit9CisKK1ZPSUQgUlQyOHh4UGNpTWxtZVJhZGlvT0ZGKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworICAgIFdQRE1BX0dMT19DRkdfU1RSVUMJR2xvQ2ZnOworCVVJTlQzMglpOworCisgICAgaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SQURJT19PRkYpKQorICAgIAlyZXR1cm47CisKKyAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIiVzPT09PlxuIiwgX19mdW5jX18pKTsKKworCS8vIFNldCBMRUQKKwlSVE1QU2V0TEVEKHBBZCwgTEVEX1JBRElPX09GRik7CisJLy8gU2V0IFJhZGlvIG9mZiBmbGFnCisJUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkFESU9fT0ZGKTsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisgICAgeworICAgIAlCT09MRUFOCQlDYW5jZWxsZWQ7CisgICAgCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpKQorICAgIAl7CisJCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5TY2FuVGltZXIsICZDYW5jZWxsZWQpOworCQkJUlRNUF9DTEVBUl9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUyk7CisgICAgCX0KKworCQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19BRFZBTkNFX1BPV0VSX1NBVkVfUENJRV9ERVZJQ0UpKQorICAgICAgICB7CisgICAgICAgICAgICBCT09MRUFOIENhbmNlbGxlZDsKKyAgICAgICAgICAgIHBBZC0+TWxtZS5iUHNQb2xsVGltZXJSdW5uaW5nID0gRkFMU0U7CisgICAgICAgICAgICBSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZS5Qc1BvbGxUaW1lciwJJkNhbmNlbGxlZCk7CisJICAgICAgICBSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZS5SYWRpb09uT2ZmVGltZXIsCSZDYW5jZWxsZWQpOworICAgICAgICB9CisKKyAgICAgICAgLy8gTGluayBkb3duIGZpcnN0IGlmIGFueSBhc3NvY2lhdGlvbiBleGlzdHMKKyAgICAgICAgaWYgKElORlJBX09OKHBBZCkgfHwgQURIT0NfT04ocEFkKSkKKyAgICAgICAgICAgIExpbmtEb3duKHBBZCwgRkFMU0UpOworICAgICAgICBSVE1QdXNlY0RlbGF5KDEwMDAwKTsKKyAgICAgICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgLy8gQ2xlYW4gdXAgb2xkIGJzcyB0YWJsZQorICAgICAgICBCc3NUYWJsZUluaXQoJnBBZC0+U2NhblRhYik7CisgICAgfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJLy8gRGlzYWJsZSBUeC9SeCBETUEKKwlSVE1QX0lPX1JFQUQzMihwQWQsIFdQRE1BX0dMT19DRkcsICZHbG9DZmcud29yZCk7CSAgIC8vIGRpc2FibGUgRE1BCisJR2xvQ2ZnLmZpZWxkLkVuYWJsZVR4RE1BID0gMDsKKwlHbG9DZmcuZmllbGQuRW5hYmxlUnhETUEgPSAwOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIFdQRE1BX0dMT19DRkcsIEdsb0NmZy53b3JkKTsJICAgLy8gYWJvcnQgYWxsIFRYIHJpbmdzCisKKworCS8vIE1BQ19TWVNfQ1RSTCA9PiB2YWx1ZSA9IDB4MCA9PiA0MG1BCisJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCAwKTsKKworCS8vIFBXUl9QSU5fQ0ZHID0+IHZhbHVlID0gMHgwID0+IDQwbUEKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBQV1JfUElOX0NGRywgMCk7CisKKwkvLyBUWF9QSU5fQ0ZHID0+IHZhbHVlID0gMHgwID0+IDIwbUEKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9QSU5fQ0ZHLCAwKTsKKworCWlmIChwQWQtPkNvbW1vbkNmZy5CQlBDdXJyZW50QlcgPT0gQldfNDApCisJeworCQkvLyBNdXN0IHVzaW5nIDQwTUh6LgorCQlBc2ljVHVybk9mZlJGQ2xrKHBBZCwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwpOworCX0KKwllbHNlCisJeworCQkvLyBNdXN0IHVzaW5nIDIwTUh6LgorCQlBc2ljVHVybk9mZlJGQ2xrKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCk7CisJfQorCisJLy8gV2FpdGluZyBmb3IgRE1BIGlkbGUKKwlpID0gMDsKKwlkbworCXsKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBXUERNQV9HTE9fQ0ZHLCAmR2xvQ2ZnLndvcmQpOworCQlpZiAoKEdsb0NmZy5maWVsZC5UeERNQUJ1c3kgPT0gMCkgJiYgKEdsb0NmZy5maWVsZC5SeERNQUJ1c3kgPT0gMCkpCisJCQlicmVhazsKKworCQlSVE1QdXNlY0RlbGF5KDEwMDApOworCX13aGlsZSAoaSsrIDwgMTAwKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2NtbV9pbmZvLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9jbW1faW5mby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkOTJhYzYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9jbW1faW5mby5jCkBAIC0wLDAgKzEsMzQxNyBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworCisjaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCisKK0lOVAlTaG93X1NTSURfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1Zik7CisKK0lOVAlTaG93X1dpcmVsZXNzTW9kZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKTsKKworSU5UCVNob3dfVHhCdXJzdF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKTsKKworSU5UCVNob3dfVHhQcmVhbWJsZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKTsKKworSU5UCVNob3dfVHhQb3dlcl9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKTsKKworSU5UCVNob3dfQ2hhbm5lbF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKTsKKworSU5UCVNob3dfQkdQcm90ZWN0aW9uX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpOworCitJTlQJU2hvd19SVFNUaHJlc2hvbGRfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1Zik7CisKK0lOVAlTaG93X0ZyYWdUaHJlc2hvbGRfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1Zik7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKK0lOVAlTaG93X0h0QndfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1Zik7CisKK0lOVAlTaG93X0h0TWNzX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpOworCitJTlQJU2hvd19IdEdpX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpOworCitJTlQJU2hvd19IdE9wTW9kZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKTsKKworSU5UCVNob3dfSHRFeHRjaGFfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1Zik7CisKK0lOVAlTaG93X0h0TXBkdURlbnNpdHlfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1Zik7CisKK0lOVAlTaG93X0h0QmFXaW5TaXplX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpOworCitJTlQJU2hvd19IdFJkZ19Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKTsKKworSU5UCVNob3dfSHRBbXNkdV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKTsKKworSU5UCVNob3dfSHRBdXRvQmFfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1Zik7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKK0lOVAlTaG93X0NvdW50cnlSZWdpb25fUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1Zik7CisKK0lOVAlTaG93X0NvdW50cnlSZWdpb25BQmFuZF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKTsKKworSU5UCVNob3dfQ291bnRyeUNvZGVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1Zik7CisKKyNpZmRlZiBBR0dSRUdBVElPTl9TVVBQT1JUCitJTlQJU2hvd19Qa3RBZ2dyZWdhdGVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1Zik7CisjZW5kaWYgLy8gQUdHUkVHQVRJT05fU1VQUE9SVCAvLworCisjaWZkZWYgV01NX1NVUFBPUlQKK0lOVAlTaG93X1dtbUNhcGFibGVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1Zik7CisjZW5kaWYgLy8gV01NX1NVUFBPUlQgLy8KKworSU5UCVNob3dfSUVFRTgwMjExSF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKTsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorSU5UCVNob3dfTmV0d29ya1R5cGVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1Zik7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKK0lOVAlTaG93X0F1dGhNb2RlX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpOworCitJTlQJU2hvd19FbmNyeXBUeXBlX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpOworCitJTlQJU2hvd19EZWZhdWx0S2V5SURfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1Zik7CisKK0lOVAlTaG93X0tleTFfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1Zik7CisKK0lOVAlTaG93X0tleTJfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1Zik7CisKK0lOVAlTaG93X0tleTNfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1Zik7CisKK0lOVAlTaG93X0tleTRfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1Zik7CisKK0lOVAlTaG93X1dQQVBTS19Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKTsKKworc3RhdGljIHN0cnVjdCB7CisJQ0hBUiAqbmFtZTsKKwlJTlQgKCpzaG93X3Byb2MpKFBSVE1QX0FEQVBURVIgcEFkYXB0ZXIsIFBVQ0hBUiBhcmcpOworfSAqUFJUTVBfUFJJVkFURV9TVEFfU0hPV19DRkdfVkFMVUVfUFJPQywgUlRNUF9QUklWQVRFX1NUQV9TSE9XX0NGR19WQUxVRV9QUk9DW10gPSB7CisJeyJTU0lEIiwJCQkJCVNob3dfU1NJRF9Qcm9jfSwKKwl7IldpcmVsZXNzTW9kZSIsCQkJU2hvd19XaXJlbGVzc01vZGVfUHJvY30sCisJeyJUeEJ1cnN0IiwJCQkJCVNob3dfVHhCdXJzdF9Qcm9jfSwKKwl7IlR4UHJlYW1ibGUiLAkJCQlTaG93X1R4UHJlYW1ibGVfUHJvY30sCisJeyJUeFBvd2VyIiwJCQkJCVNob3dfVHhQb3dlcl9Qcm9jfSwKKwl7IkNoYW5uZWwiLAkJCQkJU2hvd19DaGFubmVsX1Byb2N9LAorCXsiQkdQcm90ZWN0aW9uIiwJCQlTaG93X0JHUHJvdGVjdGlvbl9Qcm9jfSwKKwl7IlJUU1RocmVzaG9sZCIsCQkJU2hvd19SVFNUaHJlc2hvbGRfUHJvY30sCisJeyJGcmFnVGhyZXNob2xkIiwJCQlTaG93X0ZyYWdUaHJlc2hvbGRfUHJvY30sCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJeyJIdEJ3IiwJCQkJCVNob3dfSHRCd19Qcm9jfSwKKwl7Ikh0TWNzIiwJCQkJCVNob3dfSHRNY3NfUHJvY30sCisJeyJIdEdpIiwJCQkJCVNob3dfSHRHaV9Qcm9jfSwKKwl7Ikh0T3BNb2RlIiwJCQkJU2hvd19IdE9wTW9kZV9Qcm9jfSwKKwl7Ikh0RXh0Y2hhIiwJCQkJU2hvd19IdEV4dGNoYV9Qcm9jfSwKKwl7Ikh0TXBkdURlbnNpdHkiLAkJCVNob3dfSHRNcGR1RGVuc2l0eV9Qcm9jfSwKKwl7Ikh0QmFXaW5TaXplIiwJCSAgICAgICAgU2hvd19IdEJhV2luU2l6ZV9Qcm9jfSwKKwl7Ikh0UmRnIiwJCSAgICAgICAgCVNob3dfSHRSZGdfUHJvY30sCisJeyJIdEFtc2R1IiwJCSAgICAgICAgCVNob3dfSHRBbXNkdV9Qcm9jfSwKKwl7Ikh0QXV0b0JhIiwJCSAgICAgICAgU2hvd19IdEF1dG9CYV9Qcm9jfSwKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwl7IkNvdW50cnlSZWdpb24iLAkJCVNob3dfQ291bnRyeVJlZ2lvbl9Qcm9jfSwKKwl7IkNvdW50cnlSZWdpb25BQmFuZCIsCQlTaG93X0NvdW50cnlSZWdpb25BQmFuZF9Qcm9jfSwKKwl7IkNvdW50cnlDb2RlIiwJCQkJU2hvd19Db3VudHJ5Q29kZV9Qcm9jfSwKKyNpZmRlZiBBR0dSRUdBVElPTl9TVVBQT1JUCisJeyJQa3RBZ2dyZWdhdGUiLAkJCVNob3dfUGt0QWdncmVnYXRlX1Byb2N9LAorI2VuZGlmCisKKyNpZmRlZiBXTU1fU1VQUE9SVAorCXsiV21tQ2FwYWJsZSIsCQkJCVNob3dfV21tQ2FwYWJsZV9Qcm9jfSwKKyNlbmRpZgorCXsiSUVFRTgwMjExSCIsCQkJCVNob3dfSUVFRTgwMjExSF9Qcm9jfSwKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKyAgICB7Ik5ldHdvcmtUeXBlIiwJCQkJU2hvd19OZXR3b3JrVHlwZV9Qcm9jfSwKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwl7IkF1dGhNb2RlIiwJCQkJU2hvd19BdXRoTW9kZV9Qcm9jfSwKKwl7IkVuY3J5cFR5cGUiLAkJCQlTaG93X0VuY3J5cFR5cGVfUHJvY30sCisJeyJEZWZhdWx0S2V5SUQiLAkJCVNob3dfRGVmYXVsdEtleUlEX1Byb2N9LAorCXsiS2V5MSIsCQkJCQlTaG93X0tleTFfUHJvY30sCisJeyJLZXkyIiwJCQkJCVNob3dfS2V5Ml9Qcm9jfSwKKwl7IktleTMiLAkJCQkJU2hvd19LZXkzX1Byb2N9LAorCXsiS2V5NCIsCQkJCQlTaG93X0tleTRfUHJvY30sCisJeyJXUEFQU0siLAkJCQkJU2hvd19XUEFQU0tfUHJvY30sCisJe05VTEwsIE5VTEx9Cit9OworCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIEdldCBEcml2ZXIgdmVyc2lvbi4KKworICAgIFJldHVybjoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVCBTZXRfRHJpdmVyVmVyc2lvbl9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkRyaXZlciB2ZXJzaW9uLSVzXG4iLCBTVEFfRFJJVkVSX1ZFUlNJT04pKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworICAgIHJldHVybiBUUlVFOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBDb3VudHJ5IFJlZ2lvbi4KKyAgICAgICAgVGhpcyBjb21tYW5kIHdpbGwgbm90IHdvcmssIGlmIHRoZSBmaWVsZCBvZiBDb3VudHJ5UmVnaW9uIGluIGVlcHJvbSBpcyBwcm9ncmFtbWVkLgorICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UIFNldF9Db3VudHJ5UmVnaW9uX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCVVMT05HIHJlZ2lvbjsKKworCXJlZ2lvbiA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisKKyNpZmRlZiBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUCisJcmV0dXJuIC1FT1BOT1RTVVBQOworI2VuZGlmIC8vIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QgLy8KKworCS8vIENvdW50cnkgY2FuIGJlIHNldCBvbmx5IHdoZW4gRUVQUk9NIG5vdCBwcm9ncmFtbWVkCisJaWYgKHBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb24gJiAweDgwKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiU2V0X0NvdW50cnlSZWdpb25fUHJvYzo6cGFyYW1ldGVyIG9mIENvdW50cnlSZWdpb24gaW4gZWVwcm9tIGlzIHByb2dyYW1tZWQgXG4iKSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlpZigocmVnaW9uID49IDApICYmIChyZWdpb24gPD0gUkVHSU9OX01BWElNVU1fQkdfQkFORCkpCisJeworCQlwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uID0gKFVDSEFSKSByZWdpb247CisJfQorCWVsc2UgaWYgKHJlZ2lvbiA9PSBSRUdJT05fMzFfQkdfQkFORCkKKwl7CisJCXBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb24gPSAoVUNIQVIpIHJlZ2lvbjsKKwl9CisJZWxzZQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiU2V0X0NvdW50cnlSZWdpb25fUHJvYzo6cGFyYW1ldGVycyBvdXQgb2YgcmFuZ2VcbiIpKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCS8vIGlmIHNldCBjb3VudHJ5IHJlZ2lvbiwgZHJpdmVyIG5lZWRzIHRvIGJlIHJlc2V0CisJQnVpbGRDaGFubmVsTGlzdChwQWQpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0NvdW50cnlSZWdpb25fUHJvYzo6KENvdW50cnlSZWdpb249JWQpXG4iLCBwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uKSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgQ291bnRyeSBSZWdpb24gZm9yIEEgYmFuZC4KKyAgICAgICAgVGhpcyBjb21tYW5kIHdpbGwgbm90IHdvcmssIGlmIHRoZSBmaWVsZCBvZiBDb3VudHJ5UmVnaW9uIGluIGVlcHJvbSBpcyBwcm9ncmFtbWVkLgorICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UIFNldF9Db3VudHJ5UmVnaW9uQUJhbmRfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJVUxPTkcgcmVnaW9uOworCisJcmVnaW9uID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKworI2lmZGVmIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QKKwlyZXR1cm4gLUVPUE5PVFNVUFA7CisjZW5kaWYgLy8gRVhUX0JVSUxEX0NIQU5ORUxfTElTVCAvLworCisJLy8gQ291bnRyeSBjYW4gYmUgc2V0IG9ubHkgd2hlbiBFRVBST00gbm90IHByb2dyYW1tZWQKKwlpZiAocEFkLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbkZvckFCYW5kICYgMHg4MCkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlNldF9Db3VudHJ5UmVnaW9uQUJhbmRfUHJvYzo6cGFyYW1ldGVyIG9mIENvdW50cnlSZWdpb24gaW4gZWVwcm9tIGlzIHByb2dyYW1tZWQgXG4iKSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlpZigocmVnaW9uID49IDApICYmIChyZWdpb24gPD0gUkVHSU9OX01BWElNVU1fQV9CQU5EKSkKKwl7CisJCXBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb25Gb3JBQmFuZCA9IChVQ0hBUikgcmVnaW9uOworCX0KKwllbHNlCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJTZXRfQ291bnRyeVJlZ2lvbkFCYW5kX1Byb2M6OnBhcmFtZXRlcnMgb3V0IG9mIHJhbmdlXG4iKSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwkvLyBpZiBzZXQgY291bnRyeSByZWdpb24sIGRyaXZlciBuZWVkcyB0byBiZSByZXNldAorCUJ1aWxkQ2hhbm5lbExpc3QocEFkKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9Db3VudHJ5UmVnaW9uQUJhbmRfUHJvYzo6KENvdW50cnlSZWdpb249JWQpXG4iLCBwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uRm9yQUJhbmQpKTsKKworCXJldHVybiBUUlVFOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBXaXJlbGVzcyBNb2RlCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQJU2V0X1dpcmVsZXNzTW9kZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVTE9ORwlXaXJlbGVzc01vZGU7CisJSU5UCQlzdWNjZXNzID0gVFJVRTsKKworCVdpcmVsZXNzTW9kZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJeworCQlJTlQgTWF4UGh5TW9kZSA9IFBIWV8xMUc7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJTWF4UGh5TW9kZSA9IFBIWV8xMU5fNUc7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwkJaWYgKFdpcmVsZXNzTW9kZSA8PSBNYXhQaHlNb2RlKQorCQl7CisJCQlSVE1QU2V0UGh5TW9kZShwQWQsIFdpcmVsZXNzTW9kZSk7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQlpZiAoV2lyZWxlc3NNb2RlID49IFBIWV8xMUFCR05fTUlYRUQpCisJCQl7CisJCQkJcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkF1dG9CQSA9IFRSVUU7CisJCQkJcEFkLT5Db21tb25DZmcuUkVHQkFDYXBhYmlsaXR5LmZpZWxkLkF1dG9CQSA9IFRSVUU7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkF1dG9CQSA9IEZBTFNFOworCQkJCXBBZC0+Q29tbW9uQ2ZnLlJFR0JBQ2FwYWJpbGl0eS5maWVsZC5BdXRvQkEgPSBGQUxTRTsKKwkJCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJCS8vIFNldCBBZGhvY01vZGUgcmF0ZXMKKwkJCWlmIChwQWQtPlN0YUNmZy5Cc3NUeXBlID09IEJTU19BREhPQykKKwkJCXsKKwkJCQlNbG1lVXBkYXRlVHhSYXRlcyhwQWQsIEZBTFNFLCAwKTsKKwkJCQlNYWtlSWJzc0JlYWNvbihwQWQpOyAgICAgICAgICAgLy8gcmUtYnVpbGQgQkVBQ09OIGZyYW1lCisJCQkJQXNpY0VuYWJsZUlic3NTeW5jKHBBZCk7ICAgICAgIC8vIGNvcHkgdG8gb24tY2hpcCBtZW1vcnkKKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCXN1Y2Nlc3MgPSBGQUxTRTsKKwkJfQorCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCS8vIGl0IGlzIG5lZWRlZCB0byBzZXQgU1NJRCB0byB0YWtlIGVmZmVjdAorCWlmIChzdWNjZXNzID09IFRSVUUpCisJeworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQlTZXRDb21tb25IVChwQWQpOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfV2lyZWxlc3NNb2RlX1Byb2M6Oig9JWxkKVxuIiwgV2lyZWxlc3NNb2RlKSk7CisJfQorCWVsc2UKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlNldF9XaXJlbGVzc01vZGVfUHJvYzo6cGFyYW1ldGVycyBvdXQgb2YgcmFuZ2VcbiIpKTsKKwl9CisKKwlyZXR1cm4gc3VjY2VzczsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgQ2hhbm5lbAorICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UCVNldF9DaGFubmVsX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworIAlJTlQJCXN1Y2Nlc3MgPSBUUlVFOworCVVDSEFSCUNoYW5uZWw7CisKKwlDaGFubmVsID0gKFVDSEFSKSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCisJLy8gY2hlY2sgaWYgdGhpcyBjaGFubmVsIGlzIHZhbGlkCisJaWYgKENoYW5uZWxTYW5pdHkocEFkLCBDaGFubmVsKSA9PSBUUlVFKQorCXsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJeworCQkJcEFkLT5Db21tb25DZmcuQ2hhbm5lbCA9IENoYW5uZWw7CisKKwkJCWlmIChNT05JVE9SX09OKHBBZCkpCisJCQl7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQkJTl9DaGFubmVsQ2hlY2socEFkKTsKKwkJCQlpZiAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEICYmCisJCQkJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5CVyA9PSBCV180MCkKKwkJCQl7CisJCQkJCU5fU2V0Q2VuQ2gocEFkKTsKKwkJCQkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCwgRkFMU0UpOworCQkJCQlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCk7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkJXXzQwLCBjb250cm9sX2NoYW5uZWwoJWQpLCBDZW50cmFsQ2hhbm5lbCglZCkgXG4iLAorCQkJCQkJCQlwQWQtPkNvbW1vbkNmZy5DaGFubmVsLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCkpOworCQkJCX0KKwkJCQllbHNlCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCQkJeworCQkJCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwsIEZBTFNFKTsKKwkJCQkJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCk7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkJXXzIwLCBDaGFubmVsKCVkKVxuIiwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkpOworCQkJCX0KKwkJCX0KKwkJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCQlzdWNjZXNzID0gVFJVRTsKKwl9CisJZWxzZQorCXsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQkJc3VjY2VzcyA9IEZBTFNFOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCX0KKworCisJaWYgKHN1Y2Nlc3MgPT0gVFJVRSkKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0NoYW5uZWxfUHJvYzo6KENoYW5uZWw9JWQpXG4iLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKSk7CisKKwlyZXR1cm4gc3VjY2VzczsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgU2hvcnQgU2xvdCBUaW1lIEVuYWJsZSBvciBEaXNhYmxlCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQJU2V0X1Nob3J0U2xvdF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVTE9ORyBTaG9ydFNsb3Q7CisKKwlTaG9ydFNsb3QgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCisJaWYgKFNob3J0U2xvdCA9PSAxKQorCQlwQWQtPkNvbW1vbkNmZy5iVXNlU2hvcnRTbG90VGltZSA9IFRSVUU7CisJZWxzZSBpZiAoU2hvcnRTbG90ID09IDApCisJCXBBZC0+Q29tbW9uQ2ZnLmJVc2VTaG9ydFNsb3RUaW1lID0gRkFMU0U7CisJZWxzZQorCQlyZXR1cm4gRkFMU0U7ICAvL0ludmFsaWQgYXJndW1lbnQKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9TaG9ydFNsb3RfUHJvYzo6KFNob3J0U2xvdD0lZClcbiIsIHBBZC0+Q29tbW9uQ2ZnLmJVc2VTaG9ydFNsb3RUaW1lKSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgVHggcG93ZXIKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVAlTZXRfVHhQb3dlcl9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVTE9ORyBUeFBvd2VyOworCUlOVCAgIHN1Y2Nlc3MgPSBGQUxTRTsKKworCVR4UG93ZXIgPSAoVUxPTkcpIHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisJaWYgKFR4UG93ZXIgPD0gMTAwKQorCXsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQl7CisJCQlwQWQtPkNvbW1vbkNmZy5UeFBvd2VyRGVmYXVsdCA9IFR4UG93ZXI7CisJCQlwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA9IHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJEZWZhdWx0OworCQl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJCXN1Y2Nlc3MgPSBUUlVFOworCX0KKwllbHNlCisJCXN1Y2Nlc3MgPSBGQUxTRTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9UeFBvd2VyX1Byb2M6OihUeFBvd2VyUGVyY2VudGFnZT0lbGQpXG4iLCBwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSkpOworCisJcmV0dXJuIHN1Y2Nlc3M7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IDExQi8xMUcgUHJvdGVjdGlvbgorICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UCVNldF9CR1Byb3RlY3Rpb25fUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJc3dpdGNoIChzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApKQorCXsKKwkJY2FzZSAwOiAvL0FVVE8KKwkJCXBBZC0+Q29tbW9uQ2ZnLlVzZUJHUHJvdGVjdGlvbiA9IDA7CisJCQlicmVhazsKKwkJY2FzZSAxOiAvL0Fsd2F5cyBPbgorCQkJcEFkLT5Db21tb25DZmcuVXNlQkdQcm90ZWN0aW9uID0gMTsKKwkJCWJyZWFrOworCQljYXNlIDI6IC8vQWx3YXlzIE9GRgorCQkJcEFkLT5Db21tb25DZmcuVXNlQkdQcm90ZWN0aW9uID0gMjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OiAgLy9JbnZhbGlkIGFyZ3VtZW50CisJCQlyZXR1cm4gRkFMU0U7CisJfQorCisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfQkdQcm90ZWN0aW9uX1Byb2M6OihCR1Byb3RlY3Rpb249JWxkKVxuIiwgcEFkLT5Db21tb25DZmcuVXNlQkdQcm90ZWN0aW9uKSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgVHhQcmVhbWJsZQorICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UCVNldF9UeFByZWFtYmxlX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCVJUXzgwMl8xMV9QUkVBTUJMRQlQcmVhbWJsZTsKKworCVByZWFtYmxlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKworCisJc3dpdGNoIChQcmVhbWJsZSkKKwl7CisJCWNhc2UgUnQ4MDJfMTFQcmVhbWJsZVNob3J0OgorCQkJcEFkLT5Db21tb25DZmcuVHhQcmVhbWJsZSA9IFByZWFtYmxlOworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJCQlNbG1lU2V0VHhQcmVhbWJsZShwQWQsIFJ0ODAyXzExUHJlYW1ibGVTaG9ydCk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJCQlicmVhazsKKwkJY2FzZSBSdDgwMl8xMVByZWFtYmxlTG9uZzoKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJY2FzZSBSdDgwMl8xMVByZWFtYmxlQXV0bzoKKwkJCS8vIGlmIHVzZXIgd2FudHMgQVVUTywgaW5pdGlhbGl6ZSB0byBMT05HIGhlcmUsIHRoZW4gY2hhbmdlIGFjY29yZGluZyB0byBBUCdzCisJCQkvLyBjYXBhYmlsaXR5IHVwb24gYXNzb2NpYXRpb24uCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJCQlwQWQtPkNvbW1vbkNmZy5UeFByZWFtYmxlID0gUHJlYW1ibGU7CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQkJCU1sbWVTZXRUeFByZWFtYmxlKHBBZCwgUnQ4MDJfMTFQcmVhbWJsZUxvbmcpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCQkJYnJlYWs7CisJCWRlZmF1bHQ6IC8vSW52YWxpZCBhcmd1bWVudAorCQkJcmV0dXJuIEZBTFNFOworCX0KKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9UeFByZWFtYmxlX1Byb2M6OihUeFByZWFtYmxlPSVsZClcbiIsIHBBZC0+Q29tbW9uQ2ZnLlR4UHJlYW1ibGUpKTsKKworCXJldHVybiBUUlVFOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBSVFMgVGhyZXNob2xkCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQJU2V0X1JUU1RocmVzaG9sZF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwkgTkRJU184MDJfMTFfUlRTX1RIUkVTSE9MRCAgICAgICAgICAgUnRzVGhyZXNoOworCisJUnRzVGhyZXNoID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKworCWlmKChSdHNUaHJlc2ggPiAwKSAmJiAoUnRzVGhyZXNoIDw9IE1BWF9SVFNfVEhSRVNIT0xEKSkKKwkJcEFkLT5Db21tb25DZmcuUnRzVGhyZXNob2xkICA9IChVU0hPUlQpUnRzVGhyZXNoOworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCWVsc2UgaWYgKFJ0c1RocmVzaCA9PSAwKQorCQlwQWQtPkNvbW1vbkNmZy5SdHNUaHJlc2hvbGQgPSBNQVhfUlRTX1RIUkVTSE9MRDsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwllbHNlCisJCXJldHVybiBGQUxTRTsgLy9JbnZhbGlkIGFyZ3VtZW50CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfUlRTVGhyZXNob2xkX1Byb2M6OihSVFNUaHJlc2hvbGQ9JWQpXG4iLCBwQWQtPkNvbW1vbkNmZy5SdHNUaHJlc2hvbGQpKTsKKworCXJldHVybiBUUlVFOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBGcmFnbWVudCBUaHJlc2hvbGQKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVAlTZXRfRnJhZ1RocmVzaG9sZF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwkgTkRJU184MDJfMTFfRlJBR01FTlRBVElPTl9USFJFU0hPTEQgICAgIEZyYWdUaHJlc2g7CisKKwlGcmFnVGhyZXNoID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKworCWlmIChGcmFnVGhyZXNoID4gTUFYX0ZSQUdfVEhSRVNIT0xEIHx8IEZyYWdUaHJlc2ggPCBNSU5fRlJBR19USFJFU0hPTEQpCisJeworCQkvL0lsbGVnYWwgRnJhZ1RocmVzaCBzbyB3ZSBzZXQgaXQgdG8gZGVmYXVsdAorCQlwQWQtPkNvbW1vbkNmZy5GcmFnbWVudFRocmVzaG9sZCA9IE1BWF9GUkFHX1RIUkVTSE9MRDsKKwl9CisJZWxzZSBpZiAoRnJhZ1RocmVzaCAlIDIgPT0gMSkKKwl7CisJCS8vIFRoZSBsZW5ndGggb2YgZWFjaCBmcmFnbWVudCBzaGFsbCBhbHdheXMgYmUgYW4gZXZlbiBudW1iZXIgb2Ygb2N0ZXRzLCBleGNlcHQgZm9yIHRoZSBsYXN0IGZyYWdtZW50CisJCS8vIG9mIGFuIE1TRFUgb3IgTU1QRFUsIHdoaWNoIG1heSBiZSBlaXRoZXIgYW4gZXZlbiBvciBhbiBvZGQgbnVtYmVyIG9mIG9jdGV0cy4KKwkJcEFkLT5Db21tb25DZmcuRnJhZ21lbnRUaHJlc2hvbGQgPSAoVVNIT1JUKShGcmFnVGhyZXNoIC0gMSk7CisJfQorCWVsc2UKKwl7CisJCXBBZC0+Q29tbW9uQ2ZnLkZyYWdtZW50VGhyZXNob2xkID0gKFVTSE9SVClGcmFnVGhyZXNoOworCX0KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJeworCQlpZiAocEFkLT5Db21tb25DZmcuRnJhZ21lbnRUaHJlc2hvbGQgPT0gTUFYX0ZSQUdfVEhSRVNIT0xEKQorCQkJcEFkLT5Db21tb25DZmcuYlVzZVplcm9Ub0Rpc2FibGVGcmFnbWVudCA9IFRSVUU7CisJCWVsc2UKKwkJCXBBZC0+Q29tbW9uQ2ZnLmJVc2VaZXJvVG9EaXNhYmxlRnJhZ21lbnQgPSBGQUxTRTsKKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfRnJhZ1RocmVzaG9sZF9Qcm9jOjooRnJhZ1RocmVzaG9sZD0lZClcbiIsIHBBZC0+Q29tbW9uQ2ZnLkZyYWdtZW50VGhyZXNob2xkKSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgVHhCdXJzdAorICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UCVNldF9UeEJ1cnN0X1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCVVMT05HIFR4QnVyc3Q7CisKKwlUeEJ1cnN0ID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKwlpZiAoVHhCdXJzdCA9PSAxKQorCQlwQWQtPkNvbW1vbkNmZy5iRW5hYmxlVHhCdXJzdCA9IFRSVUU7CisJZWxzZSBpZiAoVHhCdXJzdCA9PSAwKQorCQlwQWQtPkNvbW1vbkNmZy5iRW5hYmxlVHhCdXJzdCA9IEZBTFNFOworCWVsc2UKKwkJcmV0dXJuIEZBTFNFOyAgLy9JbnZhbGlkIGFyZ3VtZW50CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfVHhCdXJzdF9Qcm9jOjooVHhCdXJzdD0lZClcbiIsIHBBZC0+Q29tbW9uQ2ZnLmJFbmFibGVUeEJ1cnN0KSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworI2lmZGVmIEFHR1JFR0FUSU9OX1NVUFBPUlQKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IFR4QnVyc3QKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVAlTZXRfUGt0QWdncmVnYXRlX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCVVMT05HIGFnZ3JlOworCisJYWdncmUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCisJaWYgKGFnZ3JlID09IDEpCisJCXBBZC0+Q29tbW9uQ2ZnLmJBZ2dyZWdhdGlvbkNhcGFibGUgPSBUUlVFOworCWVsc2UgaWYgKGFnZ3JlID09IDApCisJCXBBZC0+Q29tbW9uQ2ZnLmJBZ2dyZWdhdGlvbkNhcGFibGUgPSBGQUxTRTsKKwllbHNlCisJCXJldHVybiBGQUxTRTsgIC8vSW52YWxpZCBhcmd1bWVudAorCisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfUGt0QWdncmVnYXRlX1Byb2M6OihBR0dSRT0lZClcbiIsIHBBZC0+Q29tbW9uQ2ZnLmJBZ2dyZWdhdGlvbkNhcGFibGUpKTsKKworCXJldHVybiBUUlVFOworfQorI2VuZGlmCisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IElFRUU4MDIxMUguCisgICAgICAgIFRoaXMgcGFyYW1ldGVyIGlzIDEgd2hlbiBuZWVkcyByYWRhciBkZXRlY3Rpb24sIG90aGVyd2lzZSAwCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQJU2V0X0lFRUU4MDIxMUhfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisgICAgVUxPTkcgaWVlZTgwMjExaDsKKworCWllZWU4MDIxMWggPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCisJaWYgKGllZWU4MDIxMWggPT0gMSkKKwkJcEFkLT5Db21tb25DZmcuYklFRUU4MDIxMUggPSBUUlVFOworCWVsc2UgaWYgKGllZWU4MDIxMWggPT0gMCkKKwkJcEFkLT5Db21tb25DZmcuYklFRUU4MDIxMUggPSBGQUxTRTsKKwllbHNlCisJCXJldHVybiBGQUxTRTsgIC8vSW52YWxpZCBhcmd1bWVudAorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0lFRUU4MDIxMUhfUHJvYzo6KElFRUU4MDIxMUg9JWQpXG4iLCBwQWQtPkNvbW1vbkNmZy5iSUVFRTgwMjExSCkpOworCisJcmV0dXJuIFRSVUU7Cit9CisKKworI2lmZGVmIERCRworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBGb3IgRGVidWcgaW5mb3JtYXRpb24KKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVAlTZXRfRGVidWdfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT0+IFNldF9EZWJ1Z19Qcm9jICoqKioqKioqKioqKioqKioqKipcbiIpKTsKKworICAgIGlmKHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCkgPD0gUlRfREVCVUdfTE9VRCkKKyAgICAgICAgUlREZWJ1Z0xldmVsID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PSBTZXRfRGVidWdfUHJvYyhSVERlYnVnTGV2ZWwgPSAlbGQpXG4iLCBSVERlYnVnTGV2ZWwpKTsKKworCXJldHVybiBUUlVFOworfQorI2VuZGlmCisKK0lOVAlTaG93X0Rlc2NJbmZvX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworI2lmZGVmIFJUMjg2MAorCUlOVCBpLCBRdWVJZHg9MDsKKwlQUlQyOFhYX1JYRF9TVFJVQyBwUnhEOworICAgIFBUWERfU1RSVUMgcFR4RDsKKwlQUlRNUF9UWF9SSU5HCXBUeFJpbmcgPSAmcEFkLT5UeFJpbmdbUXVlSWR4XTsKKwlQUlRNUF9NR01UX1JJTkcJcE1nbXRSaW5nID0gJnBBZC0+TWdtdFJpbmc7CisJUFJUTVBfUlhfUklORwlwUnhSaW5nID0gJnBBZC0+UnhSaW5nOworCisJZm9yKGk9MDtpPFRYX1JJTkdfU0laRTtpKyspCisJeworCSAgICBwVHhEID0gKFBUWERfU1RSVUMpIHBUeFJpbmctPkNlbGxbaV0uQWxsb2NWYTsKKwkgICAgcHJpbnRrKCJEZXNjICMlZFxuIixpKTsKKwkgICAgaGV4X2R1bXAoIlR4IERlc2NyaXB0b3IiLCAoY2hhciAqKXBUeEQsIDE2KTsKKwkgICAgcHJpbnRrKCJwVHhELT5ETUFET05FID0gJXhcbiIsIHBUeEQtPkRNQURPTkUpOworCX0KKwlwcmludGsoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CisJZm9yKGk9MDtpPE1HTVRfUklOR19TSVpFO2krKykKKwl7CisJICAgIHBUeEQgPSAoUFRYRF9TVFJVQykgcE1nbXRSaW5nLT5DZWxsW2ldLkFsbG9jVmE7CisJICAgIHByaW50aygiRGVzYyAjJWRcbiIsaSk7CisJICAgIGhleF9kdW1wKCJNZ210IERlc2NyaXB0b3IiLCAoY2hhciAqKXBUeEQsIDE2KTsKKwkgICAgcHJpbnRrKCJwTWdtdC0+RE1BRE9ORSA9ICV4XG4iLCBwVHhELT5ETUFET05FKTsKKwl9CisJcHJpbnRrKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworCWZvcihpPTA7aTxSWF9SSU5HX1NJWkU7aSsrKQorCXsKKwkgICAgcFJ4RCA9IChQUlQyOFhYX1JYRF9TVFJVQykgcFJ4UmluZy0+Q2VsbFtpXS5BbGxvY1ZhOworCSAgICBwcmludGsoIkRlc2MgIyVkXG4iLGkpOworCSAgICBoZXhfZHVtcCgiUnggRGVzY3JpcHRvciIsIChjaGFyICopcFJ4RCwgMTYpOworCQlwcmludGsoInBSeEQtPkRET05FID0gJXhcbiIsIHBSeEQtPkRET05FKTsKKwl9CisjZW5kaWYgLy8gUlQyODYwIC8vCisKKwlyZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBSZXNldCBzdGF0aXN0aWNzIGNvdW50ZXIKKworICAgIEFyZ3VtZW50czoKKyAgICAgICAgcEFkYXB0ZXIgICAgICAgICAgICBQb2ludGVyIHRvIG91ciBhZGFwdGVyCisgICAgICAgIGFyZworCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQJU2V0X1Jlc2V0U3RhdENvdW50ZXJfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT0+U2V0X1Jlc2V0U3RhdENvdW50ZXJfUHJvY1xuIikpOworCisJLy8gYWRkIHRoZSBtb3N0IHVwLXRvLWRhdGUgaC93IHJhdyBjb3VudGVycyBpbnRvIHNvZnR3YXJlIGNvdW50ZXJzCisJTklDVXBkYXRlUmF3Q291bnRlcnMocEFkKTsKKworCU5kaXNaZXJvTWVtb3J5KCZwQWQtPldsYW5Db3VudGVycywgc2l6ZW9mKENPVU5URVJfODAyXzExKSk7CisJTmRpc1plcm9NZW1vcnkoJnBBZC0+Q291bnRlcnM4MDIzLCBzaXplb2YoQ09VTlRFUl84MDJfMykpOworCU5kaXNaZXJvTWVtb3J5KCZwQWQtPlJhbGlua0NvdW50ZXJzLCBzaXplb2YoQ09VTlRFUl9SQUxJTkspKTsKKworCXJldHVybiBUUlVFOworfQorCitCT09MRUFOIFJUTVBDaGVja1N0clByaW50QWJsZSgKKyAgICBJTiAgQ0hBUiAqcEluUHV0U3RyLAorICAgIElOICBVQ0hBUiBzdHJMZW4pCit7CisgICAgVUNIQVIgaT0wOworCisgICAgZm9yIChpPTA7IGk8c3RyTGVuOyBpKyspCisgICAgeworICAgICAgICBpZiAoKHBJblB1dFN0cltpXSA8IDB4MjEpIHx8CisgICAgICAgICAgICAocEluUHV0U3RyW2ldID4gMHg3RSkpCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlSZW1vdmUgV1BBIEtleSBwcm9jZXNzCisKKwlBcmd1bWVudHM6CisJCXBBZCAJCQkJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKwkJcEJ1ZgkJCQkJCQlQb2ludGVyIHRvIHRoZSB3aGVyZSB0aGUga2V5IHN0b3JlZAorCisJUmV0dXJuIFZhbHVlOgorCQlORElTX1NVQ0NFU1MJCQkJCUFkZCBrZXkgc3VjY2Vzc2Z1bGx5CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCitWT0lEICAgIFJUTVBTZXREZXNpcmVkUmF0ZXMoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgTE9ORyAgICAgICAgICAgIFJhdGVzKQoreworICAgIE5ESVNfODAyXzExX1JBVEVTIGFyeVJhdGVzOworCisgICAgbWVtc2V0KCZhcnlSYXRlcywgMHgwMCwgc2l6ZW9mKE5ESVNfODAyXzExX1JBVEVTKSk7CisgICAgc3dpdGNoIChwQWRhcHRlci0+Q29tbW9uQ2ZnLlBoeU1vZGUpCisgICAgeworICAgICAgICBjYXNlIFBIWV8xMUE6IC8vIEEgb25seQorICAgICAgICAgICAgc3dpdGNoIChSYXRlcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIDYwMDAwMDA6IC8vNk0KKyAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMF0gPSAweDBjOyAvLyA2TQorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTXzA7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgOTAwMDAwMDogLy85TQorICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1swXSA9IDB4MTI7IC8vIDlNCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfMTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAxMjAwMDAwMDogLy8xMk0KKyAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMF0gPSAweDE4OyAvLyAxMk0KKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU18yOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDE4MDAwMDAwOiAvLzE4TQorICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1swXSA9IDB4MjQ7IC8vIDE4TQorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTXzM7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMjQwMDAwMDA6IC8vMjRNCisgICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzBdID0gMHgzMDsgLy8gMjRNCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfNDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAzNjAwMDAwMDogLy8zNk0KKyAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMF0gPSAweDQ4OyAvLyAzNk0KKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU181OworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDQ4MDAwMDAwOiAvLzQ4TQorICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1swXSA9IDB4NjA7IC8vIDQ4TQorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTXzY7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgNTQwMDAwMDA6IC8vNTRNCisgICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzBdID0gMHg2YzsgLy8gNTRNCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfNzsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAtMTogLy9BdXRvCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMF0gPSAweDZjOyAvLyA1NE1icHMKKyAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMV0gPSAweDYwOyAvLyA0OE1icHMKKyAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMl0gPSAweDQ4OyAvLyAzNk1icHMKKyAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbM10gPSAweDMwOyAvLyAyNE1icHMKKyAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbNF0gPSAweDI0OyAvLyAxOE0KKyAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbNV0gPSAweDE4OyAvLyAxMk0KKyAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbNl0gPSAweDEyOyAvLyA5TQorICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1s3XSA9IDB4MGM7IC8vIDZNCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfQVVUTzsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBQSFlfMTFCR19NSVhFRDogLy8gQi9HIE1peGVkCisgICAgICAgIGNhc2UgUEhZXzExQjogLy8gQiBvbmx5CisgICAgICAgIGNhc2UgUEhZXzExQUJHX01JWEVEOiAvLyBBL0IvRyBNaXhlZAorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgc3dpdGNoIChSYXRlcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIDEwMDAwMDA6IC8vMU0KKyAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMF0gPSAweDAyOworICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTXzA7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMjAwMDAwMDogLy8yTQorICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1swXSA9IDB4MDQ7CisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfMTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSA1MDAwMDAwOiAvLzUuNU0KKyAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMF0gPSAweDBiOyAvLyA1LjVNCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfMjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAxMTAwMDAwMDogLy8xMU0KKyAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMF0gPSAweDE2OyAvLyAxMU0KKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU18zOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDYwMDAwMDA6IC8vNk0KKyAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMF0gPSAweDBjOyAvLyA2TQorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTXzA7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgOTAwMDAwMDogLy85TQorICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1swXSA9IDB4MTI7IC8vIDlNCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfMTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAxMjAwMDAwMDogLy8xMk0KKyAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMF0gPSAweDE4OyAvLyAxMk0KKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU18yOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDE4MDAwMDAwOiAvLzE4TQorICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1swXSA9IDB4MjQ7IC8vIDE4TQorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTXzM7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMjQwMDAwMDA6IC8vMjRNCisgICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzBdID0gMHgzMDsgLy8gMjRNCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfNDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAzNjAwMDAwMDogLy8zNk0KKyAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMF0gPSAweDQ4OyAvLyAzNk0KKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU181OworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDQ4MDAwMDAwOiAvLzQ4TQorICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1swXSA9IDB4NjA7IC8vIDQ4TQorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTXzY7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgNTQwMDAwMDA6IC8vNTRNCisgICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzBdID0gMHg2YzsgLy8gNTRNCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfNzsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAtMTogLy9BdXRvCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFCKQorICAgICAgICAgICAgICAgICAgICB7IC8vQiBPbmx5CisgICAgICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1swXSA9IDB4MTY7IC8vIDExTWJwcworICAgICAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMV0gPSAweDBiOyAvLyA1LjVNYnBzCisgICAgICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1syXSA9IDB4MDQ7IC8vIDJNYnBzCisgICAgICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1szXSA9IDB4MDI7IC8vIDFNYnBzCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7IC8vKEIvRykgTWl4ZWQgb3IgKEEvQi9HKSBNaXhlZAorICAgICAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMF0gPSAweDZjOyAvLyA1NE1icHMKKyAgICAgICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzFdID0gMHg2MDsgLy8gNDhNYnBzCisgICAgICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1syXSA9IDB4NDg7IC8vIDM2TWJwcworICAgICAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbM10gPSAweDMwOyAvLyAyNE1icHMKKyAgICAgICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzRdID0gMHgxNjsgLy8gMTFNYnBzCisgICAgICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1s1XSA9IDB4MGI7IC8vIDUuNU1icHMKKyAgICAgICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzZdID0gMHgwNDsgLy8gMk1icHMKKyAgICAgICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzddID0gMHgwMjsgLy8gMU1icHMKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTX0FVVE87CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgTmRpc1plcm9NZW1vcnkocEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVSYXRlLCBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUyk7CisgICAgTmRpc01vdmVNZW1vcnkocEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVSYXRlLCAmYXJ5UmF0ZXMsIHNpemVvZihORElTXzgwMl8xMV9SQVRFUykpOworICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiBSVE1QU2V0RGVzaXJlZFJhdGVzICglMDJ4LCUwMngsJTAyeCwlMDJ4LCUwMngsJTAyeCwlMDJ4LCUwMngpXG4iLAorICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbMF0scEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzFdLAorICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbMl0scEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzNdLAorICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbNF0scEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzVdLAorICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbNl0scEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzddICkpOworICAgIC8vIENoYW5naW5nIERlc2lyZWRSYXRlIG1heSBhZmZlY3QgdGhlIE1BWCBUWCByYXRlIHdlIHVzZWQgdG8gVFggZnJhbWVzIG91dAorICAgIE1sbWVVcGRhdGVUeFJhdGVzKHBBZGFwdGVyLCBGQUxTRSwgMCk7Cit9CisKK05ESVNfU1RBVFVTIFJUTVBXUEFSZW1vdmVLZXlQcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBWT0lECQkJcEJ1ZikKK3sKKwlQTkRJU184MDJfMTFfUkVNT1ZFX0tFWSBwS2V5OworCVVMT05HCQkJCQlLZXlJZHg7CisJTkRJU19TVEFUVVMgCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfRkFJTFVSRTsKKwlCT09MRUFOIAliVHhLZXk7IAkJLy8gU2V0IHRoZSBrZXkgYXMgdHJhbnNtaXQga2V5CisJQk9PTEVBTiAJYlBhaXJ3aXNlOwkJLy8gSW5kaWNhdGUgdGhlIGtleSBpcyBwYWlyd2lzZSBrZXkKKwlCT09MRUFOIAliS2V5UlNDOwkJLy8gaW5kaWNhdGUgdGhlIHJlY2VpdmUgIFNDIHNldCBieSBLZXlSU0MgdmFsdWUuCisJCQkJCQkJCS8vIE90aGVyd2lzZSwgaXQgd2lsbCBzZXQgYnkgdGhlIE5JQy4KKwlCT09MRUFOIAliQXV0aGVudGljYXRvcjsgLy8gaW5kaWNhdGUga2V5IGlzIHNldCBieSBhdXRoZW50aWNhdG9yLgorCUlOVCAJCWk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIi0tLT4gUlRNUFdQQVJlbW92ZUtleVByb2NcbiIpKTsKKworCXBLZXkgPSAoUE5ESVNfODAyXzExX1JFTU9WRV9LRVkpIHBCdWY7CisJS2V5SWR4ID0gcEtleS0+S2V5SW5kZXggJiAweGZmOworCS8vIEJpdCAzMSBvZiBBZGQta2V5LCBUeCBLZXkKKwliVHhLZXkJCSAgID0gKHBLZXktPktleUluZGV4ICYgMHg4MDAwMDAwMCkgPyBUUlVFIDogRkFMU0U7CisJLy8gQml0IDMwIG9mIEFkZC1rZXkgUGFpcndpc2VLZXkKKwliUGFpcndpc2UJICAgPSAocEtleS0+S2V5SW5kZXggJiAweDQwMDAwMDAwKSA/IFRSVUUgOiBGQUxTRTsKKwkvLyBCaXQgMjkgb2YgQWRkLWtleSBLZXlSU0MKKwliS2V5UlNDIAkgICA9IChwS2V5LT5LZXlJbmRleCAmIDB4MjAwMDAwMDApID8gVFJVRSA6IEZBTFNFOworCS8vIEJpdCAyOCBvZiBBZGQta2V5IEF1dGhlbnRpY2F0b3IKKwliQXV0aGVudGljYXRvciA9IChwS2V5LT5LZXlJbmRleCAmIDB4MTAwMDAwMDApID8gVFJVRSA6IEZBTFNFOworCisJLy8gMS4gSWYgYlR4IGlzIFRSVUUsIHJldHVybiBmYWlsdXJlIGluZm9ybWF0aW9uCisJaWYgKGJUeEtleSA9PSBUUlVFKQorCQlyZXR1cm4oTkRJU19TVEFUVVNfSU5WQUxJRF9EQVRBKTsKKworCS8vIDIuIENoZWNrIFBhaXJ3aXNlIEtleQorCWlmIChiUGFpcndpc2UpCisJeworCQkvLyBhLiBJZiBCU1NJRCBpcyBicm9hZGNhc3QsIHJlbW92ZSBhbGwgcGFpcndpc2Uga2V5cy4KKwkJLy8gYi4gSWYgbm90IGJyb2FkY2FzdCwgcmVtb3ZlIHRoZSBwYWlyd2lzZSBzcGVjaWZpZWQgYnkgQlNTSUQKKwkJZm9yIChpID0gMDsgaSA8IFNIQVJFX0tFWV9OVU07IGkrKykKKwkJeworCQkJaWYgKE1BQ19BRERSX0VRVUFMKHBBZC0+U2hhcmVkS2V5W0JTUzBdW2ldLkJzc0lkLCBwS2V5LT5CU1NJRCkpCisJCQl7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSVE1QV1BBUmVtb3ZlS2V5UHJvYyhLZXlJZHg9JWQpXG4iLCBpKSk7CisJCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1baV0uS2V5TGVuID0gMDsKKwkJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtpXS5DaXBoZXJBbGcgPSBDSVBIRVJfTk9ORTsKKwkJCQlBc2ljUmVtb3ZlU2hhcmVkS2V5RW50cnkocEFkLCBCU1MwLCAoVUNIQVIpaSk7CisJCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKwkvLyAzLiBHcm91cCBLZXkKKwllbHNlCisJeworCQkvLyBhLiBJZiBCU1NJRCBpcyBicm9hZGNhc3QsIHJlbW92ZSBhbGwgZ3JvdXAga2V5cyBpbmRleGVkCisJCS8vIGIuIElmIEJTU0lEIG1hdGNoZWQsIGRlbGV0ZSB0aGUgZ3JvdXAga2V5IGluZGV4ZWQuCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUlRNUFdQQVJlbW92ZUtleVByb2MoS2V5SWR4PSVsZClcbiIsIEtleUlkeCkpOworCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLktleUxlbiA9IDA7CisJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uQ2lwaGVyQWxnID0gQ0lQSEVSX05PTkU7CisJCUFzaWNSZW1vdmVTaGFyZWRLZXlFbnRyeShwQWQsIEJTUzAsIChVQ0hBUilLZXlJZHgpOworCQlTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworCX0KKworCXJldHVybiAoU3RhdHVzKTsKK30KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJUmVtb3ZlIEFsbCBXUEEgS2V5cworCisJQXJndW1lbnRzOgorCQlwQWQgCQkJCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJUlRNUFdQQVJlbW92ZUFsbEtleXMoCisJSU4JUFJUTVBfQURBUFRFUglwQWQpCit7CisKKwlVQ0hBUiAJaTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUlRNUFdQQVJlbW92ZUFsbEtleXMoQXV0aE1vZGU9JWQsIFdlcFN0YXR1cz0lZClcbiIsIHBBZC0+U3RhQ2ZnLkF1dGhNb2RlLCBwQWQtPlN0YUNmZy5XZXBTdGF0dXMpKTsKKworCS8vIEZvciBXRVAvQ0tJUCwgdGhlcmUgaXMgbm8gbmVlZCB0byByZW1vdmUgaXQsIHNpbmNlIFdpblhQIHdvbid0IHNldCBpdCBhZ2FpbiBhZnRlcgorCS8vIExpbmsgdXAuIEFuZCBpdCB3aWxsIGJlIHJlcGxhY2VkIGlmIHVzZXIgY2hhbmdlZCBpdC4KKwlpZiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPCBOZGlzODAyXzExQXV0aE1vZGVXUEEpCisJCXJldHVybjsKKworCS8vIEZvciBXUEEtTm9uZSwgdGhlcmUgaXMgbm8gbmVlZCB0byByZW1vdmUgaXQsIHNpbmNlIFdpblhQIHdvbid0IHNldCBpdCBhZ2FpbiBhZnRlcgorCS8vIExpbmsgdXAuIEFuZCBpdCB3aWxsIGJlIHJlcGxhY2VkIGlmIHVzZXIgY2hhbmdlZCBpdC4KKwlpZiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZSkKKwkJcmV0dXJuOworCisJLy8gc2V0IEJTU0lEIHdjaWQgZW50cnkgb2YgdGhlIFBhaXItd2lzZSBLZXkgdGFibGUgYXMgbm8tc2VjdXJpdHkgbW9kZQorCUFzaWNSZW1vdmVQYWlyd2lzZUtleUVudHJ5KHBBZCwgQlNTMCwgQlNTSURfV0NJRCk7CisKKwkvLyBzZXQgYWxsIHNoYXJlZCBrZXkgbW9kZSBhcyBuby1zZWN1cml0eS4KKwlmb3IgKGkgPSAwOyBpIDwgU0hBUkVfS0VZX05VTTsgaSsrKQorICAgIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJyZW1vdmUgJXMga2V5ICMlZFxuIiwgQ2lwaGVyTmFtZVtwQWQtPlNoYXJlZEtleVtCU1MwXVtpXS5DaXBoZXJBbGddLCBpKSk7CisJCU5kaXNaZXJvTWVtb3J5KCZwQWQtPlNoYXJlZEtleVtCU1MwXVtpXSwgc2l6ZW9mKENJUEhFUl9LRVkpKTsKKworCQlBc2ljUmVtb3ZlU2hhcmVkS2V5RW50cnkocEFkLCBCU1MwLCBpKTsKKwl9CisKK30KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlDaGFuZ2UgTklDIFBIWSBtb2RlLiBSZS1hc3NvY2lhdGlvbiBtYXkgYmUgbmVjZXNzYXJ5LiBwb3NzaWJsZSBzZXR0aW5ncworCQlpbmNsdWRlIC0gUEhZXzExQiwgUEhZXzExQkdfTUlYRUQsIFBIWV8xMUEsIGFuZCBQSFlfMTFBQkdfTUlYRUQKKworCUFyZ3VtZW50czoKKwkJcEFkIC0gUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCQlwaHltb2RlICAtCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlSVE1QU2V0UGh5TW9kZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVTE9ORyBwaHltb2RlKQoreworCUlOVCBpOworCS8vIHRoZSBzZWxlY3RlZCBwaHltb2RlIG11c3QgYmUgc3VwcG9ydGVkIGJ5IHRoZSBSRiBJQyBlbmNvZGVkIGluIEUyUFJPTQorCisJLy8gaWYgbm8gY2hhbmdlLCBkbyBub3RoaW5nCisJLyogYnVnIGZpeAorCWlmIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IHBoeW1vZGUpCisJCXJldHVybjsKKyAgICAqLworCXBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPSAoVUNIQVIpcGh5bW9kZTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUlRNUFNldFBoeU1vZGUgOiBQaHlNb2RlPSVkLCBjaGFubmVsPSVkIFxuIiwgcEFkLT5Db21tb25DZmcuUGh5TW9kZSwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkpOworI2lmZGVmIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QKKwlCdWlsZENoYW5uZWxMaXN0RXgocEFkKTsKKyNlbHNlCisJQnVpbGRDaGFubmVsTGlzdChwQWQpOworI2VuZGlmIC8vIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QgLy8KKworCS8vIHNhbml0eSBjaGVjayB1c2VyIHNldHRpbmcKKwlmb3IgKGkgPSAwOyBpIDwgcEFkLT5DaGFubmVsTGlzdE51bTsgaSsrKQorCXsKKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPT0gcEFkLT5DaGFubmVsTGlzdFtpXS5DaGFubmVsKQorCQkJYnJlYWs7CisJfQorCisJaWYgKGkgPT0gcEFkLT5DaGFubmVsTGlzdE51bSkKKwl7CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCQlwQWQtPkNvbW1vbkNmZy5DaGFubmVsID0gRmlyc3RDaGFubmVsKHBBZCk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlJUTVBTZXRQaHlNb2RlOiBjaGFubmVsIGlzIG91dCBvZiByYW5nZSwgdXNlIGZpcnN0IGNoYW5uZWw9JWQgXG4iLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKSk7CisJfQorCisJTmRpc1plcm9NZW1vcnkocEFkLT5Db21tb25DZmcuU3VwUmF0ZSwgTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVMpOworCU5kaXNaZXJvTWVtb3J5KHBBZC0+Q29tbW9uQ2ZnLkV4dFJhdGUsIE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTKTsKKwlOZGlzWmVyb01lbW9yeShwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlLCBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUyk7CisJc3dpdGNoIChwaHltb2RlKSB7CisJCWNhc2UgUEhZXzExQjoKKwkJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVbMF0gID0gMHg4MjsJICAvLyAxIG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzLCBiYXNpYyByYXRlCisJCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlWzFdICA9IDB4ODQ7CSAgLy8gMiBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcywgYmFzaWMgcmF0ZQorCQkJcEFkLT5Db21tb25DZmcuU3VwUmF0ZVsyXSAgPSAweDhCOwkgIC8vIDUuNSBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcywgYmFzaWMgcmF0ZQorCQkJcEFkLT5Db21tb25DZmcuU3VwUmF0ZVszXSAgPSAweDk2OwkgIC8vIDExIG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzLCBiYXNpYyByYXRlCisJCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlTGVuICA9IDQ7CisJCQlwQWQtPkNvbW1vbkNmZy5FeHRSYXRlTGVuICA9IDA7CisJCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzBdICA9IDI7CSAgIC8vIDEgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbMV0gID0gNDsJICAgLy8gMiBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVsyXSAgPSAxMTsgICAgLy8gNS41IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCisJCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzNdICA9IDIyOyAgICAvLyAxMSBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQkJLy9wQWQtPkNvbW1vbkNmZy5IVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfQ0NLOyAvLyBUaGlzIE1PREUgaXMgb25seSBGWUkuIG5vdCB1c2UKKwkJCWJyZWFrOworCisJCWNhc2UgUEhZXzExRzoKKwkJY2FzZSBQSFlfMTFCR19NSVhFRDoKKwkJY2FzZSBQSFlfMTFBQkdfTUlYRUQ6CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCWNhc2UgUEhZXzExTl8yXzRHOgorCQljYXNlIFBIWV8xMUFCR05fTUlYRUQ6CisJCWNhc2UgUEhZXzExQkdOX01JWEVEOgorCQljYXNlIFBIWV8xMUdOX01JWEVEOgorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQkJcEFkLT5Db21tb25DZmcuU3VwUmF0ZVswXSAgPSAweDgyOwkgIC8vIDEgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMsIGJhc2ljIHJhdGUKKwkJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVbMV0gID0gMHg4NDsJICAvLyAyIG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzLCBiYXNpYyByYXRlCisJCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlWzJdICA9IDB4OEI7CSAgLy8gNS41IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzLCBiYXNpYyByYXRlCisJCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlWzNdICA9IDB4OTY7CSAgLy8gMTEgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMsIGJhc2ljIHJhdGUKKwkJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVbNF0gID0gMHgxMjsJICAvLyA5IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCisJCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlWzVdICA9IDB4MjQ7CSAgLy8gMTggbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVbNl0gID0gMHg0ODsJICAvLyAzNiBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQkJcEFkLT5Db21tb25DZmcuU3VwUmF0ZVs3XSAgPSAweDZjOwkgIC8vIDU0IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCisJCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlTGVuICA9IDg7CisJCQlwQWQtPkNvbW1vbkNmZy5FeHRSYXRlWzBdICA9IDB4MEM7CSAgLy8gNiBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQkJcEFkLT5Db21tb25DZmcuRXh0UmF0ZVsxXSAgPSAweDE4OwkgIC8vIDEyIG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCisJCQlwQWQtPkNvbW1vbkNmZy5FeHRSYXRlWzJdICA9IDB4MzA7CSAgLy8gMjQgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJCXBBZC0+Q29tbW9uQ2ZnLkV4dFJhdGVbM10gID0gMHg2MDsJICAvLyA0OCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQkJcEFkLT5Db21tb25DZmcuRXh0UmF0ZUxlbiAgPSA0OworCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVswXSAgPSAyOwkgICAvLyAxIG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCisJCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzFdICA9IDQ7CSAgIC8vIDIgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbMl0gID0gMTE7ICAgIC8vIDUuNSBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVszXSAgPSAyMjsgICAgLy8gMTEgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbNF0gID0gMTI7ICAgIC8vIDYgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbNV0gID0gMTg7ICAgIC8vIDkgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbNl0gID0gMjQ7ICAgIC8vIDEyIG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCisJCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzddICA9IDM2OyAgICAvLyAxOCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVs4XSAgPSA0ODsgICAgLy8gMjQgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbOV0gID0gNzI7ICAgIC8vIDM2IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCisJCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzEwXSA9IDk2OyAgICAvLyA0OCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVsxMV0gPSAxMDg7ICAgLy8gNTQgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJCWJyZWFrOworCisJCWNhc2UgUEhZXzExQToKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJY2FzZSBQSFlfMTFBTl9NSVhFRDoKKwkJY2FzZSBQSFlfMTFBR05fTUlYRUQ6CisJCWNhc2UgUEhZXzExTl81RzoKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVbMF0gID0gMHg4QzsJICAvLyA2IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzLCBiYXNpYyByYXRlCisJCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlWzFdICA9IDB4MTI7CSAgLy8gOSBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQkJcEFkLT5Db21tb25DZmcuU3VwUmF0ZVsyXSAgPSAweDk4OwkgIC8vIDEyIG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzLCBiYXNpYyByYXRlCisJCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlWzNdICA9IDB4MjQ7CSAgLy8gMTggbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVbNF0gID0gMHhiMDsJICAvLyAyNCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcywgYmFzaWMgcmF0ZQorCQkJcEFkLT5Db21tb25DZmcuU3VwUmF0ZVs1XSAgPSAweDQ4OwkgIC8vIDM2IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCisJCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlWzZdICA9IDB4NjA7CSAgLy8gNDggbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVbN10gID0gMHg2YzsJICAvLyA1NCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQkJcEFkLT5Db21tb25DZmcuU3VwUmF0ZUxlbiAgPSA4OworCQkJcEFkLT5Db21tb25DZmcuRXh0UmF0ZUxlbiAgPSAwOworCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVswXSAgPSAxMjsgICAgLy8gNiBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVsxXSAgPSAxODsgICAgLy8gOSBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVsyXSAgPSAyNDsgICAgLy8gMTIgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbM10gID0gMzY7ICAgIC8vIDE4IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCisJCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzRdICA9IDQ4OyAgICAvLyAyNCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVs1XSAgPSA3MjsgICAgLy8gMzYgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbNl0gID0gOTY7ICAgIC8vIDQ4IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCisJCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzddICA9IDEwODsgICAvLyA1NCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQkJLy9wQWQtPkNvbW1vbkNmZy5IVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfT0ZETTsgLy8gVGhpcyBNT0RFIGlzIG9ubHkgRllJLiBub3QgdXNlCisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJfQorCisKKwlwQWQtPkNvbW1vbkNmZy5CYW5kU3RhdGUgPSBVTktOT1dOX0JBTkQ7Cit9CisKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlDYWxsZXIgZW5zdXJlcyB3ZSBoYXMgODAyLjExbiBzdXBwb3J0LgorCQlDYWxscyBhdCBzZXR0aW5nIEhUIGZyb20gQVAvU1RBU2V0aW5mb3JtYXRpb24KKworCUFyZ3VtZW50czoKKwkJcEFkIC0gUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCQlwaHltb2RlICAtCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECVJUTVBTZXRIVCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglPSURfU0VUX0hUX1BIWU1PREUgKnBIVFBoeU1vZGUpCit7CisJLy9VTE9ORwkqcG1jczsKKwlVSU5UMzIJVmFsdWUgPSAwOworCVVDSEFSCUJCUFZhbHVlID0gMDsKKwlVQ0hBUglCQlAzVmFsdWUgPSAwOworCVVDSEFSCVJ4U3RyZWFtID0gcEFkLT5Db21tb25DZmcuUnhTdHJlYW07CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVE1QU2V0SFQgOiBIVF9tb2RlKCVkKSwgRXh0T2Zmc2V0KCVkKSwgTUNTKCVkKSwgQlcoJWQpLCBTVEJDKCVkKSwgU0hPUlRHSSglZClcbiIsCisJCQkJCQkJCQkJcEhUUGh5TW9kZS0+SHRNb2RlLCBwSFRQaHlNb2RlLT5FeHRPZmZzZXQsCisJCQkJCQkJCQkJcEhUUGh5TW9kZS0+TUNTLCBwSFRQaHlNb2RlLT5CVywKKwkJCQkJCQkJCQlwSFRQaHlNb2RlLT5TVEJDLCBwSFRQaHlNb2RlLT5TSE9SVEdJKSk7CisKKwkvLyBEb24ndCB6ZXJvIHN1cHBvcnRlZEh5UGh5IHN0cnVjdHVyZS4KKwlSVE1QWmVyb01lbW9yeSgmcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5LCBzaXplb2YocEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5KSk7CisJUlRNUFplcm9NZW1vcnkoJnBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mbywgc2l6ZW9mKHBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mbykpOworCVJUTVBaZXJvTWVtb3J5KCZwQWQtPkNvbW1vbkNmZy5OZXdFeHRDaGFuT2Zmc2V0LCBzaXplb2YocEFkLT5Db21tb25DZmcuTmV3RXh0Q2hhbk9mZnNldCkpOworCVJUTVBaZXJvTWVtb3J5KCZwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHksIHNpemVvZihwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkpKTsKKworICAgCWlmIChwQWQtPkNvbW1vbkNmZy5iUmRnKQorCXsKKwkJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5LkV4dEh0Q2FwSW5mby5QbHVzSFRDID0gMTsKKwkJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5LkV4dEh0Q2FwSW5mby5SREdTdXBwb3J0ID0gMTsKKwl9CisJZWxzZQorCXsKKwkJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5LkV4dEh0Q2FwSW5mby5QbHVzSFRDID0gMDsKKwkJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5LkV4dEh0Q2FwSW5mby5SREdTdXBwb3J0ID0gMDsKKwl9CisKKwlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBQYXJtLk1heFJBbXBkdUZhY3RvciA9IDM7CisJcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5Lk1heFJBbXBkdUZhY3RvciA9IDM7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVE1QU2V0SFQgOiBSeEJBV2luTGltaXQgPSAlZFxuIiwgcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlJ4QkFXaW5MaW1pdCkpOworCisJLy8gTWltbyBwb3dlciBzYXZlLCBBLU1TRFUgc2l6ZSwKKwlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQW1zZHVFbmFibGUgPSAoVVNIT1JUKXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BbXNkdUVuYWJsZTsKKwlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQW1zZHVTaXplID0gKFVDSEFSKXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BbXNkdVNpemU7CisJcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5Lk1pbW9QcyA9IChVQ0hBUilwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTU1QU21vZGU7CisJcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5Lk1wZHVEZW5zaXR5ID0gKFVDSEFSKXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5NcGR1RGVuc2l0eTsKKworCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQU1zZHVTaXplID0gKFVTSE9SVClwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQW1zZHVTaXplOworCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uTWltb1BzID0gKFVTSE9SVClwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTU1QU21vZGU7CisJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwUGFybS5NcGR1RGVuc2l0eSA9IChVQ0hBUilwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTXBkdURlbnNpdHk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVE1QU2V0SFQgOiBBTXNkdVNpemUgPSAlZCwgTWltb1BzID0gJWQsIE1wZHVEZW5zaXR5ID0gJWQsIE1heFJBbXBkdUZhY3RvciA9ICVkXG4iLAorCQkJCQkJCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5BbXNkdVNpemUsCisJCQkJCQkJCQkJCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5Lk1pbW9QcywKKwkJCQkJCQkJCQkJCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuTXBkdURlbnNpdHksCisJCQkJCQkJCQkJCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5Lk1heFJBbXBkdUZhY3RvcikpOworCisJaWYocEhUUGh5TW9kZS0+SHRNb2RlID09IEhUTU9ERV9HRikKKwl7CisJCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uR0YgPSAxOworCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuR0YgPSAxOworCX0KKwllbHNlCisJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5HRiA9IDA7CisKKwkvLyBEZWNpZGUgUnggTUNTU2V0CisJc3dpdGNoIChSeFN0cmVhbSkKKwl7CisJCWNhc2UgMToKKwkJCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMF0gPSAgMHhmZjsKKwkJCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMV0gPSAgMHgwMDsKKwkJCWJyZWFrOworCisJCWNhc2UgMjoKKwkJCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMF0gPSAgMHhmZjsKKwkJCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMV0gPSAgMHhmZjsKKwkJCWJyZWFrOworCisJCWNhc2UgMzogLy8gMyozCisJCQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuTUNTU2V0WzBdID0gIDB4ZmY7CisJCQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuTUNTU2V0WzFdID0gIDB4ZmY7CisJCQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuTUNTU2V0WzJdID0gIDB4ZmY7CisJCQlicmVhazsKKwl9CisKKwlpZiAocEFkLT5Db21tb25DZmcuYkZvcnR5X01oel9JbnRvbGVyYW50ICYmIChwQWQtPkNvbW1vbkNmZy5DaGFubmVsIDw9IDE0KSAmJiAocEhUUGh5TW9kZS0+QlcgPT0gQldfNDApICkKKwl7CisJCXBIVFBoeU1vZGUtPkJXID0gQldfMjA7CisJCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uRm9ydHlfTWh6X0ludG9sZXJhbnQgPSAxOworCX0KKworCWlmKHBIVFBoeU1vZGUtPkJXID09IEJXXzQwKQorCXsKKwkJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lk1DU1NldFs0XSA9IDB4MTsgLy8gTUNTIDMyCisJCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQ2hhbm5lbFdpZHRoID0gMTsKKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPD0gMTQpCisJCQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkNDS21vZGVpbjQwID0gMTsKKworCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQ2hhbm5lbFdpZHRoID0gMTsKKwkJcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLkFkZEh0SW5mby5SZWNvbVdpZHRoID0gMTsKKwkJcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLkFkZEh0SW5mby5FeHRDaGFuT2Zmc2V0ID0gKHBIVFBoeU1vZGUtPkV4dE9mZnNldCA9PSBFWFRDSEFfQkVMT1cpPyAoRVhUQ0hBX0JFTE9XKTogRVhUQ0hBX0FCT1ZFOworCQkvLyBTZXQgUmVnc2l0ZXIgZm9yIGV4dGVuc2lvbiBjaGFubmVsIHBvc2l0aW9uLgorCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0JBTkRfQ0ZHLCAmVmFsdWUpOworCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsICZCQlAzVmFsdWUpOworCQlpZiAoKHBIVFBoeU1vZGUtPkV4dE9mZnNldCA9PSBFWFRDSEFfQkVMT1cpKQorCQl7CisJCQlWYWx1ZSB8PSAweDE7CisJCQlCQlAzVmFsdWUgfD0gKDB4MjApOworCQkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfQkFORF9DRkcsIFZhbHVlKTsKKwkJfQorCQllbHNlIGlmICgocEhUUGh5TW9kZS0+RXh0T2Zmc2V0ID09IEVYVENIQV9BQk9WRSkpCisJCXsKKwkJCVZhbHVlICY9IDB4ZmU7CisJCQlCQlAzVmFsdWUgJj0gKH4weDIwKTsKKwkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX0JBTkRfQ0ZHLCBWYWx1ZSk7CisJCX0KKworCQkvLyBUdXJuIG9uIEJCUCA0ME1IeiBtb2RlIG5vdyBvbmx5IGFzIEFQIC4KKwkJLy8gU3RhIGNhbiB0dXJuIG9uIEJCUCA0ME1IeiBhZnRlciBjb25uZWN0aW9uIHdpdGggNDBNSHogQVAuIFN0YSBvbmx5IGJyb2FkY2FzdCA0ME1IeiBjYXBhYmlsaXR5IGJlZm9yZSBjb25uZWN0aW9uLgorCQlpZiAoKHBBZC0+T3BNb2RlID09IE9QTU9ERV9BUCkgfHwgSU5GUkFfT04ocEFkKSB8fCBBREhPQ19PTihwQWQpCisJCQkpCisJCXsKKwkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgJkJCUFZhbHVlKTsKKwkJCUJCUFZhbHVlICY9ICh+MHgxOCk7CisJCQlCQlBWYWx1ZSB8PSAweDEwOworCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgQkJQVmFsdWUpOworCisJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCBCQlAzVmFsdWUpOworCQkJcEFkLT5Db21tb25DZmcuQkJQQ3VycmVudEJXID0gQldfNDA7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5DaGFubmVsV2lkdGggPSAwOworCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQ2hhbm5lbFdpZHRoID0gMDsKKwkJcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLkFkZEh0SW5mby5SZWNvbVdpZHRoID0gMDsKKwkJcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLkFkZEh0SW5mby5FeHRDaGFuT2Zmc2V0ID0gRVhUQ0hBX05PTkU7CisJCXBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsID0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbDsKKwkJLy8gVHVybiBvbiBCQlAgMjBNSHogbW9kZSBieSByZXF1ZXN0IGhlcmUuCisJCXsKKwkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgJkJCUFZhbHVlKTsKKwkJCUJCUFZhbHVlICY9ICh+MHgxOCk7CisJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCBCQlBWYWx1ZSk7CisJCQlwQWQtPkNvbW1vbkNmZy5CQlBDdXJyZW50QlcgPSBCV18yMDsKKwkJfQorCX0KKworCWlmKHBIVFBoeU1vZGUtPlNUQkMgPT0gU1RCQ19VU0UpCisJeworCQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLlR4U1RCQyA9IDE7CisJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5UeFNUQkMgPSAxOworCQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLlJ4U1RCQyA9IDE7CisJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5SeFNUQkMgPSAxOworCX0KKwllbHNlCisJeworCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuVHhTVEJDID0gMDsKKwkJcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LlJ4U1RCQyA9IDA7CisJfQorCisKKwlpZihwSFRQaHlNb2RlLT5TSE9SVEdJID09IEdJXzQwMCkKKwl7CisJCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uU2hvcnRHSWZvcjIwID0gMTsKKwkJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5TaG9ydEdJZm9yNDAgPSAxOworCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuU2hvcnRHSWZvcjIwID0gMTsKKwkJcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LlNob3J0R0lmb3I0MCA9IDE7CisJfQorCWVsc2UKKwl7CisJCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uU2hvcnRHSWZvcjIwID0gMDsKKwkJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5TaG9ydEdJZm9yNDAgPSAwOworCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuU2hvcnRHSWZvcjIwID0gMDsKKwkJcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LlNob3J0R0lmb3I0MCA9IDA7CisJfQorCisJLy8gV2Ugc3VwcG9ydCBsaW5rIGFkYXB0YXRpb24gZm9yIHVuc29saWNpdCBNQ1MgZmVlZGJhY2ssIHNldCB0byAyLgorCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5FeHRIdENhcEluZm8uTUNTRmVlZGJhY2sgPSBNQ1NGQktfTk9ORTsgLy9NQ1NGQktfVU5TT0xJQ0lUOworCXBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mby5Db250cm9sQ2hhbiA9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWw7CisJLy8gMSwgdGhlIGV4dGVuc2lvbiBjaGFubmVsIGFib3ZlIHRoZSBjb250cm9sIGNoYW5uZWwuCisKKwkvLyBFRENBIHBhcmFtZXRlcnMgdXNlZCBmb3IgQVAncyBvd24gdHJhbnNtaXNzaW9uCisJaWYgKHBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uYlZhbGlkID09IEZBTFNFKQorCXsKKwkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5iVmFsaWQgPSBUUlVFOworCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLkFpZnNuWzBdID0gMzsKKwkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5BaWZzblsxXSA9IDc7CisJCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uQWlmc25bMl0gPSAxOworCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLkFpZnNuWzNdID0gMTsKKworCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLkN3bWluWzBdID0gNDsKKwkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5Dd21pblsxXSA9IDQ7CisJCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uQ3dtaW5bMl0gPSAzOworCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLkN3bWluWzNdID0gMjsKKworCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLkN3bWF4WzBdID0gNjsKKwkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5Dd21heFsxXSA9IDEwOworCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLkN3bWF4WzJdID0gNDsKKwkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5Dd21heFszXSA9IDM7CisKKwkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5UeG9wWzBdICA9IDA7CisJCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uVHhvcFsxXSAgPSAwOworCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLlR4b3BbMl0gID0gOTQ7CisJCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uVHhvcFszXSAgPSA0NzsKKwl9CisJQXNpY1NldEVkY2FQYXJtKHBBZCwgJnBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0pOworCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCXsKKwkJUlRNUFNldEluZGl2aWR1YWxIVChwQWQsIDApOworCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCUNhbGxlciBlbnN1cmVzIHdlIGhhcyA4MDIuMTFuIHN1cHBvcnQuCisJCUNhbGxzIGF0IHNldHRpbmcgSFQgZnJvbSBBUC9TVEFTZXRpbmZvcm1hdGlvbgorCisJQXJndW1lbnRzOgorCQlwQWQgLSBQb2ludGVyIHRvIG91ciBhZGFwdGVyCisJCXBoeW1vZGUgIC0KKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJUlRNUFNldEluZGl2aWR1YWxIVCgKKwlJTglQUlRNUF9BREFQVEVSCQlwQWQsCisJSU4JVUNIQVIJCQkJYXBpZHgpCit7CisJUFJUX0hUX1BIWV9JTkZPCQlwRGVzaXJlZF9odF9waHkgPSBOVUxMOworCVVDSEFSCVR4U3RyZWFtID0gcEFkLT5Db21tb25DZmcuVHhTdHJlYW07CisJVUNIQVIJRGVzaXJlZE1jcwk9IE1DU19BVVRPOworCisJZG8KKwl7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJeworCQkJcERlc2lyZWRfaHRfcGh5ID0gJnBBZC0+U3RhQ2ZnLkRlc2lyZWRIdFBoeUluZm87CisJCQlEZXNpcmVkTWNzID0gcEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1M7CisJCQkvL3BBZC0+U3RhQ2ZnLmJBdXRvVHhSYXRlU3dpdGNoID0gKERlc2lyZWRNY3MgPT0gTUNTX0FVVE8pID8gVFJVRSA6IEZBTFNFOworCQkJCWJyZWFrOworCQl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJfSB3aGlsZSAoRkFMU0UpOworCisJaWYgKHBEZXNpcmVkX2h0X3BoeSA9PSBOVUxMKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiUlRNUFNldEluZGl2aWR1YWxIVDogaW52YWxpZCBhcGlkeCglZClcbiIsIGFwaWR4KSk7CisJCXJldHVybjsKKwl9CisJUlRNUFplcm9NZW1vcnkocERlc2lyZWRfaHRfcGh5LCBzaXplb2YoUlRfSFRfUEhZX0lORk8pKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJUTVBTZXRJbmRpdmlkdWFsSFQgOiBEZXNpcmVkIE1DUyA9ICVkXG4iLCBEZXNpcmVkTWNzKSk7CisJLy8gQ2hlY2sgdGhlIHZhbGlkaXR5IG9mIE1DUworCWlmICgoVHhTdHJlYW0gPT0gMSkgJiYgKChEZXNpcmVkTWNzID49IE1DU184KSAmJiAoRGVzaXJlZE1jcyA8PSBNQ1NfMTUpKSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1dBUk4sICgiUlRNUFNldEluZGl2aWR1YWxIVDogTUNTKCVkKSBpcyBpbnZhbGlkIGluIDFTLCByZXNldCBpdCBhcyBNQ1NfN1xuIiwgRGVzaXJlZE1jcykpOworCQlEZXNpcmVkTWNzID0gTUNTXzc7CisJfQorCisJaWYgKChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQ2hhbm5lbFdpZHRoID09IEJXXzIwKSAmJiAoRGVzaXJlZE1jcyA9PSBNQ1NfMzIpKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfV0FSTiwgKCJSVE1QU2V0SW5kaXZpZHVhbEhUOiBNQ1NfMzIgaXMgb25seSBzdXBwb3J0ZWQgaW4gNDAtTUh6LCByZXNldCBpdCBhcyBNQ1NfMFxuIikpOworCQlEZXNpcmVkTWNzID0gTUNTXzA7CisJfQorCisJcERlc2lyZWRfaHRfcGh5LT5iSHRFbmFibGUgPSBUUlVFOworCisJLy8gRGVjaWRlIGRlc2lyZWQgVHggTUNTCisJc3dpdGNoIChUeFN0cmVhbSkKKwl7CisJCWNhc2UgMToKKwkJCWlmIChEZXNpcmVkTWNzID09IE1DU19BVVRPKQorCQkJeworCQkJCXBEZXNpcmVkX2h0X3BoeS0+TUNTU2V0WzBdPSAweGZmOworCQkJCXBEZXNpcmVkX2h0X3BoeS0+TUNTU2V0WzFdPSAweDAwOworCQkJfQorCQkJZWxzZSBpZiAoRGVzaXJlZE1jcyA8PSBNQ1NfNykKKwkJCXsKKwkJCQlwRGVzaXJlZF9odF9waHktPk1DU1NldFswXT0gMTw8RGVzaXJlZE1jczsKKwkJCQlwRGVzaXJlZF9odF9waHktPk1DU1NldFsxXT0gMHgwMDsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgMjoKKwkJCWlmIChEZXNpcmVkTWNzID09IE1DU19BVVRPKQorCQkJeworCQkJCXBEZXNpcmVkX2h0X3BoeS0+TUNTU2V0WzBdPSAweGZmOworCQkJCXBEZXNpcmVkX2h0X3BoeS0+TUNTU2V0WzFdPSAweGZmOworCQkJfQorCQkJZWxzZSBpZiAoRGVzaXJlZE1jcyA8PSBNQ1NfMTUpCisJCQl7CisJCQkJVUxPTkcgbW9kZTsKKworCQkJCW1vZGUgPSBEZXNpcmVkTWNzIC8gODsKKwkJCQlpZiAobW9kZSA8IDIpCisJCQkJCXBEZXNpcmVkX2h0X3BoeS0+TUNTU2V0W21vZGVdID0gKDEgPDwgKERlc2lyZWRNY3MgLSBtb2RlICogOCkpOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSAzOiAvLyAzKjMKKwkJCWlmIChEZXNpcmVkTWNzID09IE1DU19BVVRPKQorCQkJeworCQkJCS8qIE1DUzAgfiBNQ1MyMywgMyBieXRlcyAqLworCQkJCXBEZXNpcmVkX2h0X3BoeS0+TUNTU2V0WzBdPSAweGZmOworCQkJCXBEZXNpcmVkX2h0X3BoeS0+TUNTU2V0WzFdPSAweGZmOworCQkJCXBEZXNpcmVkX2h0X3BoeS0+TUNTU2V0WzJdPSAweGZmOworCQkJfQorCQkJZWxzZSBpZiAoRGVzaXJlZE1jcyA8PSBNQ1NfMjMpCisJCQl7CisJCQkJVUxPTkcgbW9kZTsKKworCQkJCW1vZGUgPSBEZXNpcmVkTWNzIC8gODsKKwkJCQlpZiAobW9kZSA8IDMpCisJCQkJCXBEZXNpcmVkX2h0X3BoeS0+TUNTU2V0W21vZGVdID0gKDEgPDwgKERlc2lyZWRNY3MgLSBtb2RlICogOCkpOworCQkJfQorCQkJYnJlYWs7CisJfQorCisJaWYocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkNoYW5uZWxXaWR0aCA9PSBCV180MCkKKwl7CisJCWlmIChEZXNpcmVkTWNzID09IE1DU19BVVRPIHx8IERlc2lyZWRNY3MgPT0gTUNTXzMyKQorCQkJcERlc2lyZWRfaHRfcGh5LT5NQ1NTZXRbNF0gPSAweDE7CisJfQorCisJLy8gdXBkYXRlIEhUIFJhdGUgc2V0dGluZworICAgIGlmIChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKQorICAgICAgICBNbG1lVXBkYXRlSHRUeFJhdGVzKHBBZCwgQlNTMCk7CisgICAgZWxzZQorCSAgICBNbG1lVXBkYXRlSHRUeFJhdGVzKHBBZCwgYXBpZHgpOworfQorCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJVXBkYXRlIEhUIElFIGZyb20gb3VyIGNhcGFiaWxpdHkuCisKKwlBcmd1bWVudHM6CisJCVNlbmQgYWxsIEhUIElFIGluIGJlYWNvbi9wcm9iZSByc3AvYXNzb2MgcnNwL2FjdGlvbiBmcmFtZS4KKworCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlSVE1QVXBkYXRlSFRJRSgKKwlJTglSVF9IVF9DQVBBQklMSVRZCSpwUnRIdCwKKwlJTgkJVUNIQVIJCQkJKnBNY3NTZXQsCisJT1VUCQlIVF9DQVBBQklMSVRZX0lFICpwSHRDYXBhYmlsaXR5LAorCU9VVAkJQUREX0hUX0lORk9fSUUJCSpwQWRkSHRJbmZvKQoreworCVJUTVBaZXJvTWVtb3J5KHBIdENhcGFiaWxpdHksIHNpemVvZihIVF9DQVBBQklMSVRZX0lFKSk7CisJUlRNUFplcm9NZW1vcnkocEFkZEh0SW5mbywgc2l6ZW9mKEFERF9IVF9JTkZPX0lFKSk7CisKKwkJcEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLkNoYW5uZWxXaWR0aCA9IHBSdEh0LT5DaGFubmVsV2lkdGg7CisJCXBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5NaW1vUHMgPSBwUnRIdC0+TWltb1BzOworCQlwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uR0YgPSBwUnRIdC0+R0Y7CisJCXBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5TaG9ydEdJZm9yMjAgPSBwUnRIdC0+U2hvcnRHSWZvcjIwOworCQlwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uU2hvcnRHSWZvcjQwID0gcFJ0SHQtPlNob3J0R0lmb3I0MDsKKwkJcEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLlR4U1RCQyA9IHBSdEh0LT5UeFNUQkM7CisJCXBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5SeFNUQkMgPSBwUnRIdC0+UnhTVEJDOworCQlwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uQU1zZHVTaXplID0gcFJ0SHQtPkFtc2R1U2l6ZTsKKwkJcEh0Q2FwYWJpbGl0eS0+SHRDYXBQYXJtLk1heFJBbXBkdUZhY3RvciA9IHBSdEh0LT5NYXhSQW1wZHVGYWN0b3I7CisJCXBIdENhcGFiaWxpdHktPkh0Q2FwUGFybS5NcGR1RGVuc2l0eSA9IHBSdEh0LT5NcGR1RGVuc2l0eTsKKworCQlwQWRkSHRJbmZvLT5BZGRIdEluZm8uRXh0Q2hhbk9mZnNldCA9IHBSdEh0LT5FeHRDaGFuT2Zmc2V0IDsKKwkJcEFkZEh0SW5mby0+QWRkSHRJbmZvLlJlY29tV2lkdGggPSBwUnRIdC0+UmVjb21XaWR0aDsKKwkJcEFkZEh0SW5mby0+QWRkSHRJbmZvMi5PcGVyYWlvbk1vZGUgPSBwUnRIdC0+T3BlcmFpb25Nb2RlOworCQlwQWRkSHRJbmZvLT5BZGRIdEluZm8yLk5vbkdmUHJlc2VudCA9IHBSdEh0LT5Ob25HZlByZXNlbnQ7CisJCVJUTVBNb3ZlTWVtb3J5KHBBZGRIdEluZm8tPk1DU1NldCwgLypwUnRIdC0+TUNTU2V0Ki9wTWNzU2V0LCA0KTsgLy8gcnQyODYwIG9ubHkgc3VwcG9ydCBNQ1MgbWF4PTMyLCBubyBuZWVkIHRvIGNvcHkgYWxsIDE2IHVjaGFyLgorCisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUlRNUFVwZGF0ZUhUSUUgPD09IFxuIikpOworfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlBZGQgQ2xpZW50IHNlY3VyaXR5IGluZm9ybWF0aW9uIGludG8gQVNJQyBXQ0lEIHRhYmxlIGFuZCBJVkVJViB0YWJsZS4KKyAgICBSZXR1cm46CisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVDSEFSCQkJQnNzSWR4LAorCUlOIAlVQ0hBUgkJIAlLZXlJZHgsCisJSU4gCVVDSEFSCQkgCUNpcGhlckFsZywKKwlJTiAJTUFDX1RBQkxFX0VOVFJZICpwRW50cnkpCit7CisJVUlOVDMyCQlXQ0lEQXR0cmkgPSAwOworCVVTSE9SVAkJb2Zmc2V0OworCVVDSEFSCQlJVkVJViA9IDA7CisJVVNIT1JUCQlXY2lkID0gMDsKKworCXsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJeworCQkJaWYgKEJzc0lkeCA+IEJTUzApCisJCQl7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeTogVGhlIEJTUy1pbmRleCglZCkgaXMgb3V0IG9mIHJhbmdlIGZvciBJbmZyYSBsaW5rLiBcbiIsIEJzc0lkeCkpOworCQkJCXJldHVybjsKKwkJCX0KKworCQkJLy8gMS4JSW4gQURIT0MgbW9kZSwgdGhlIEFJRCBpcyB3Y2lkIG51bWJlci4gQW5kIE5PIG1lc2ggbGluayBleGlzdHMuCisJCQkvLyAyLglJbiBJbmZyYSBtb2RlLCB0aGUgQUlEOjEgTVVTVCBiZSB3Y2lkIG9mIGluZnJhIFNUQS4KKwkJCS8vCQkJCQkgICB0aGUgQUlEOjJ+IGFzc2lnbiB0byBtZXNoIGxpbmsgZW50cnkuCisJCQlpZiAocEVudHJ5ICYmIEFESE9DX09OKHBBZCkpCisJCQkJV2NpZCA9IHBFbnRyeS0+QWlkOworCQkJZWxzZSBpZiAocEVudHJ5ICYmIElORlJBX09OKHBBZCkpCisJCQl7CisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJCQkJaWYgKHBFbnRyeS0+VmFsaWRBc0RscyA9PSBUUlVFKQorCQkJCQlXY2lkID0gcEVudHJ5LT5BaWQ7CisJCQkJZWxzZQorI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCQkJCVdjaWQgPSBCU1NJRF9XQ0lEOworCQkJfQorCQkJZWxzZQorCQkJCVdjaWQgPSBNQ0FTVF9XQ0lEOworCQl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJfQorCisJLy8gVXBkYXRlIFdDSUQgYXR0cmlidXRlIHRhYmxlCisJb2Zmc2V0ID0gTUFDX1dDSURfQVRUUklCVVRFX0JBU0UgKyAoV2NpZCAqIEhXX1dDSURfQVRUUklfU0laRSk7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCXsKKwkJaWYgKHBFbnRyeSAmJiBwRW50cnktPlZhbGlkQXNNZXNoKQorCQkJV0NJREF0dHJpID0gKENpcGhlckFsZzw8MSkgfCBQQUlSV0lTRUtFWVRBQkxFOworI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCQllbHNlIGlmICgocEVudHJ5KSAmJiAocEVudHJ5LT5WYWxpZEFzRGxzKSAmJgorCQkJCQkoKENpcGhlckFsZyA9PSBDSVBIRVJfVEtJUCkgfHwKKwkJCQkgCShDaXBoZXJBbGcgPT0gQ0lQSEVSX1RLSVBfTk9fTUlDKSB8fAorCQkJCQkoQ2lwaGVyQWxnID09IENJUEhFUl9BRVMpIHx8CisJCQkJIAkoQ2lwaGVyQWxnID09IENJUEhFUl9OT05FKSkpCisJCQlXQ0lEQXR0cmkgPSAoQ2lwaGVyQWxnPDwxKSB8IFBBSVJXSVNFS0VZVEFCTEU7CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisJCWVsc2UKKwkJCVdDSURBdHRyaSA9IChDaXBoZXJBbGc8PDEpIHwgU0hBUkVES0VZVEFCTEU7CisJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJUlRNUF9JT19XUklURTMyKHBBZCwgb2Zmc2V0LCBXQ0lEQXR0cmkpOworCisKKwkvLyBVcGRhdGUgSVYvRUlWIHRhYmxlCisJb2Zmc2V0ID0gTUFDX0lWRUlWX1RBQkxFX0JBU0UgKyAoV2NpZCAqIEhXX0lWRUlWX0VOVFJZX1NJWkUpOworCisJLy8gV1BBIG1vZGUKKwlpZiAoKENpcGhlckFsZyA9PSBDSVBIRVJfVEtJUCkgfHwgKENpcGhlckFsZyA9PSBDSVBIRVJfVEtJUF9OT19NSUMpIHx8IChDaXBoZXJBbGcgPT0gQ0lQSEVSX0FFUykpCisJeworCQkvLyBFaXYgYml0IG9uLiBrZXlpZCBhbHdheXMgaXMgMCBmb3IgcGFpcndpc2Uga2V5CisJCUlWRUlWID0gKEtleUlkeCA8PDYpIHwgMHgyMDsKKwl9CisJZWxzZQorCXsKKwkJLy8gV0VQIEtleUlkeCBpcyBkZWZhdWx0IHR4IGtleS4KKwkJSVZFSVYgPSAoS2V5SWR4IDw8IDYpOworCX0KKworCS8vIEZvciBrZXkgaW5kZXggYW5kIGV4dCBJViBiaXQsIHNvIG9ubHkgbmVlZCB0byB1cGRhdGUgdGhlIHBvc2l0aW9uKG9mZnNldCszKS4KKyNpZmRlZiBSVDI4NjAKKwlSVE1QX0lPX1dSSVRFOChwQWQsIG9mZnNldCszLCBJVkVJVik7CisjZW5kaWYgLy8gUlQyODYwIC8vCisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnk6IFdDSUQgIyVkLCBLZXlJbmRleCAjJWQsIEFsZz0lc1xuIixXY2lkLCBLZXlJZHgsIENpcGhlck5hbWVbQ2lwaGVyQWxnXSkpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiCVdDSURBdHRyaSA9IDB4JXggXG4iLCAgV0NJREF0dHJpKSk7CisKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBQYXJzZSBlbmNyeXB0aW9uIHR5cGUKK0FyZ3VtZW50czoKKyAgICBwQWRhcHRlciAgICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byBvdXIgYWRhcHRlcgorICAgIHdycSAgICAgICAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpb2N0bCBhcmd1bWVudAorCisgICAgUmV0dXJuIFZhbHVlOgorICAgICAgICBOb25lCisKKyAgICBOb3RlOgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworQ0hBUiAqR2V0RW5jcnlwdFR5cGUoQ0hBUiBlbmMpCit7CisgICAgaWYoZW5jID09IE5kaXM4MDJfMTFXRVBEaXNhYmxlZCkKKyAgICAgICAgcmV0dXJuICJOT05FIjsKKyAgICBpZihlbmMgPT0gTmRpczgwMl8xMVdFUEVuYWJsZWQpCisgICAgCXJldHVybiAiV0VQIjsKKyAgICBpZihlbmMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkKKyAgICAJcmV0dXJuICJUS0lQIjsKKyAgICBpZihlbmMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKKyAgICAJcmV0dXJuICJBRVMiOworCWlmKGVuYyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjRFbmFibGVkKQorICAgIAlyZXR1cm4gIlRLSVBBRVMiOworICAgIGVsc2UKKyAgICAJcmV0dXJuICJVTktOT1ciOworfQorCitDSEFSICpHZXRBdXRoTW9kZShDSEFSIGF1dGgpCit7CisgICAgaWYoYXV0aCA9PSBOZGlzODAyXzExQXV0aE1vZGVPcGVuKQorICAgIAlyZXR1cm4gIk9QRU4iOworICAgIGlmKGF1dGggPT0gTmRpczgwMl8xMUF1dGhNb2RlU2hhcmVkKQorICAgIAlyZXR1cm4gIlNIQVJFRCI7CisJaWYoYXV0aCA9PSBOZGlzODAyXzExQXV0aE1vZGVBdXRvU3dpdGNoKQorICAgIAlyZXR1cm4gIkFVVE9XRVAiOworICAgIGlmKGF1dGggPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKQorICAgIAlyZXR1cm4gIldQQSI7CisgICAgaWYoYXV0aCA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spCisgICAgCXJldHVybiAiV1BBUFNLIjsKKyAgICBpZihhdXRoID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmUpCisgICAgCXJldHVybiAiV1BBTk9ORSI7CisgICAgaWYoYXV0aCA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyKQorICAgIAlyZXR1cm4gIldQQTIiOworICAgIGlmKGF1dGggPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykKKyAgICAJcmV0dXJuICJXUEEyUFNLIjsKKwlpZihhdXRoID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTFXUEEyKQorICAgIAlyZXR1cm4gIldQQTFXUEEyIjsKKwlpZihhdXRoID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTFQU0tXUEEyUFNLKQorICAgIAlyZXR1cm4gIldQQTFQU0tXUEEyUFNLIjsKKworICAgIAlyZXR1cm4gIlVOS05PVyI7Cit9CisKKyNpZiAxIC8vI2lmbmRlZiBVQ09TCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIEdldCBzaXRlIHN1cnZleSByZXN1bHRzCisJQXJndW1lbnRzOgorCSAgICBwQWRhcHRlciAgICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCSAgICB3cnEgICAgICAgICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW9jdGwgYXJndW1lbnQKKworICAgIFJldHVybiBWYWx1ZToKKyAgICAgICAgTm9uZQorCisgICAgTm90ZToKKyAgICAgICAgVXNhZ2U6CisgICAgICAgIAkJMS4pIFVJIG5lZWRzIHRvIHdhaXQgNCBzZWNvbmRzIGFmdGVyIGlzc3VlIGEgc2l0ZSBzdXJ2ZXkgY29tbWFuZAorICAgICAgICAJCTIuKSBpd3ByaXYgcmEwIGdldF9zaXRlX3N1cnZleQorICAgICAgICAJCTMuKSBVSSBuZWVkcyB0byBwcmVwYXJlIGF0IGxlYXN0IDQwOTZieXRlcyB0byBnZXQgdGhlIHJlc3VsdHMKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KKyNkZWZpbmUJTElORV9MRU4JKDQrMzMrMjArOCsxMCs5KzcrMykJLy8gQ2hhbm5lbCtTU0lEK0Jzc2lkK1dlcFN0YXR1cytBdXRoTW9kZStTaWduYWwrV2lyZXNzTW9kZStOZXR3b3JrVHlwZQorVk9JRCBSVE1QSW9jdGxHZXRTaXRlU3VydmV5KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCisJSU4Jc3RydWN0IGl3cmVxCSp3cnEpCit7CisJQ0hBUgkJKm1zZzsKKwlJTlQgCQlpPTA7CisJSU5UCQkJV2FpdENudDsKKwlJTlQgCQlTdGF0dXM9MDsKKwlDSEFSCQlTc2lkW01BWF9MRU5fT0ZfU1NJRCArMV07CisgICAgSU5UICAgICAgICAgUnNzaSA9IDAsIG1heF9sZW4gPSBMSU5FX0xFTjsKKwlVSU5UICAgICAgICBSc3NpX1F1YWxpdHkgPSAwOworCU5ESVNfODAyXzExX05FVFdPUktfVFlQRSAgICB3aXJlbGVzc19tb2RlOworCisJb3NfYWxsb2NfbWVtKE5VTEwsIChQVUNIQVIgKikmbXNnLCBzaXplb2YoQ0hBUikqKChNQVhfTEVOX09GX0JTU19UQUJMRSkqbWF4X2xlbikpOworCisJaWYgKG1zZyA9PSBOVUxMKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlRNUElvY3RsR2V0U2l0ZVN1cnZleSAtIG1zZyBtZW1vcnkgYWxsb2MgZmFpbC5cbiIpKTsKKwkJcmV0dXJuOworCX0KKworCW1lbXNldChtc2csIDAgLChNQVhfTEVOX09GX0JTU19UQUJMRSkqbWF4X2xlbiApOworCW1lbXNldChTc2lkLCAwICwoTUFYX0xFTl9PRl9TU0lEICsxKSk7CisJc3ByaW50Zihtc2csIiVzIiwiXG4iKTsKKwlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwiJS00cyUtMzNzJS0yMHMlLThzJS0xMHMlLTlzJS03cyUtM3NcbiIsCisJICAgICJDaCIsICJTU0lEIiwgIkJTU0lEIiwgIkVuYyIsICJBdXRoIiwgIlNpZ2FubCglKSIsICJXLU1vZGUiLCAiIE5UIik7CisKKwlXYWl0Q250ID0gMDsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlwQWRhcHRlci0+U3RhQ2ZnLmJTY2FuUmVxSXNGcm9tV2ViVUkgPSBUUlVFOworCXdoaWxlICgoU2NhblJ1bm5pbmcocEFkYXB0ZXIpID09IFRSVUUpICYmIChXYWl0Q250KysgPCAyMDApKQorCQlPU19XQUlUKDUwMCk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlmb3IoaT0wOyBpPHBBZGFwdGVyLT5TY2FuVGFiLkJzc05yIDtpKyspCisJeworCQlpZiggcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uQ2hhbm5lbD09MCkKKwkJCWJyZWFrOworCisJCWlmKChzdHJsZW4obXNnKSttYXhfbGVuICkgPj0gSVdfU0NBTl9NQVhfREFUQSkKKwkJCWJyZWFrOworCisJCS8vQ2hhbm5lbAorCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwiJS00ZCIsIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkNoYW5uZWwpOworCQkvL1NTSUQKKwkJbWVtY3B5KFNzaWQsIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlNzaWQsIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlNzaWRMZW4pOworCQlTc2lkW3BBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlNzaWRMZW5dID0gJ1wwJzsKKwkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksIiUtMzNzIiwgU3NpZCk7CisJCS8vQlNTSUQKKwkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksIiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4ICAgIiwKKwkJCXBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkJzc2lkWzBdLAorCQkJcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uQnNzaWRbMV0sCisJCQlwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Cc3NpZFsyXSwKKwkJCXBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkJzc2lkWzNdLAorCQkJcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uQnNzaWRbNF0sCisJCQlwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Cc3NpZFs1XSk7CisJCS8vRW5jcnlwdGlvbiBUeXBlCisJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCIlLThzIixHZXRFbmNyeXB0VHlwZShwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5XZXBTdGF0dXMpKTsKKwkJLy9BdXRoZW50aWNhdGlvbiBNb2RlCisJCWlmIChwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMVdFUEVuYWJsZWQpCisJCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwiJS0xMHMiLCAiVU5LTk9XIik7CisJCWVsc2UKKwkJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCIlLTEwcyIsR2V0QXV0aE1vZGUocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uQXV0aE1vZGUpKTsKKwkJLy8gUnNzaQorCQlSc3NpID0gKElOVClwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Sc3NpOworCQlpZiAoUnNzaSA+PSAtNTApCisJCQlSc3NpX1F1YWxpdHkgPSAxMDA7CisJCWVsc2UgaWYgKFJzc2kgPj0gLTgwKSAgICAvLyBiZXR3ZWVuIC01MCB+IC04MGRibQorCQkJUnNzaV9RdWFsaXR5ID0gKFVJTlQpKDI0ICsgKChSc3NpICsgODApICogMjYpLzEwKTsKKwkJZWxzZSBpZiAoUnNzaSA+PSAtOTApICAgLy8gYmV0d2VlbiAtODAgfiAtOTBkYm0KKwkJCVJzc2lfUXVhbGl0eSA9IChVSU5UKSgoKFJzc2kgKyA5MCkgKiAyNikvMTApOworCQllbHNlICAgIC8vIDwgLTg0IGRibQorCQkJUnNzaV9RdWFsaXR5ID0gMDsKKwkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksIiUtOWQiLCBSc3NpX1F1YWxpdHkpOworCQkvLyBXaXJlbGVzcyBNb2RlCisJCXdpcmVsZXNzX21vZGUgPSBOZXR3b3JrVHlwZUluVXNlU2FuaXR5KCZwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXSk7CisJCWlmICh3aXJlbGVzc19tb2RlID09IE5kaXM4MDJfMTFGSCB8fAorCQkJd2lyZWxlc3NfbW9kZSA9PSBOZGlzODAyXzExRFMpCisJCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwiJS03cyIsICIxMWIiKTsKKwkJZWxzZSBpZiAod2lyZWxlc3NfbW9kZSA9PSBOZGlzODAyXzExT0ZETTUpCisJCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwiJS03cyIsICIxMWEiKTsKKwkJZWxzZSBpZiAod2lyZWxlc3NfbW9kZSA9PSBOZGlzODAyXzExT0ZETTVfTikKKwkJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCIlLTdzIiwgIjExYS9uIik7CisJCWVsc2UgaWYgKHdpcmVsZXNzX21vZGUgPT0gTmRpczgwMl8xMU9GRE0yNCkKKwkJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCIlLTdzIiwgIjExYi9nIik7CisJCWVsc2UgaWYgKHdpcmVsZXNzX21vZGUgPT0gTmRpczgwMl8xMU9GRE0yNF9OKQorCQkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksIiUtN3MiLCAiMTFiL2cvbiIpOworCQllbHNlCisJCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwiJS03cyIsICJ1bmtub3ciKTsKKwkJLy9OZXR3b3JrIFR5cGUKKwkJaWYgKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkJzc1R5cGUgPT0gQlNTX0FESE9DKQorCQkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksIiUtM3MiLCAiIEFkIik7CisJCWVsc2UKKwkJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCIlLTNzIiwgIiBJbiIpOworCisgICAgICAgIHNwcmludGYobXNnK3N0cmxlbihtc2cpLCJcbiIpOworCX0KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCXBBZGFwdGVyLT5TdGFDZmcuYlNjYW5SZXFJc0Zyb21XZWJVSSA9IEZBTFNFOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCXdycS0+dS5kYXRhLmxlbmd0aCA9IHN0cmxlbihtc2cpOworCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBtc2csIHdycS0+dS5kYXRhLmxlbmd0aCk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVE1QSW9jdGxHZXRTaXRlU3VydmV5IC0gd3JxLT51LmRhdGEubGVuZ3RoID0gJWRcbiIsIHdycS0+dS5kYXRhLmxlbmd0aCkpOworCW9zX2ZyZWVfbWVtKE5VTEwsIChQVUNIQVIpbXNnKTsKK30KKworCisjZGVmaW5lCU1BQ19MSU5FX0xFTgkoMTQrNCs0KzEwKzEwKzEwKzYrNikJLy8gQWRkcithaWQrcHNtK2RhdGF0aW1lK3J4Ynl0ZSt0eGJ5dGUrY3VycmVudCB0eCByYXRlK2xhc3QgdHggcmF0ZQorVk9JRCBSVE1QSW9jdGxHZXRNYWNUYWJsZSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBzdHJ1Y3QgaXdyZXEgKndycSkKK3sKKwlJTlQgaTsKKwlSVF84MDJfMTFfTUFDX1RBQkxFIE1hY1RhYjsKKwljaGFyICptc2c7CisKKwlNYWNUYWIuTnVtID0gMDsKKwlmb3IgKGk9MDsgaTxNQVhfTEVOX09GX01BQ19UQUJMRTsgaSsrKQorCXsKKwkJaWYgKHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uVmFsaWRBc0NMSSAmJiAocEFkLT5NYWNUYWIuQ29udGVudFtpXS5Tc3QgPT0gU1NUX0FTU09DKSkKKwkJeworCQkJQ09QWV9NQUNfQUREUihNYWNUYWIuRW50cnlbTWFjVGFiLk51bV0uQWRkciwgJnBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uQWRkcik7CisJCQlNYWNUYWIuRW50cnlbTWFjVGFiLk51bV0uQWlkID0gKFVDSEFSKXBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uQWlkOworCQkJTWFjVGFiLkVudHJ5W01hY1RhYi5OdW1dLlBzbSA9IHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uUHNNb2RlOworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJTWFjVGFiLkVudHJ5W01hY1RhYi5OdW1dLk1pbW9QcyA9IHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uTW1wc01vZGU7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwkJCS8vIEZpbGwgaW4gUlNTSSBwZXIgZW50cnkKKwkJCU1hY1RhYi5FbnRyeVtNYWNUYWIuTnVtXS5BdmdSc3NpMCA9IHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uUnNzaVNhbXBsZS5BdmdSc3NpMDsKKwkJCU1hY1RhYi5FbnRyeVtNYWNUYWIuTnVtXS5BdmdSc3NpMSA9IHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uUnNzaVNhbXBsZS5BdmdSc3NpMTsKKwkJCU1hY1RhYi5FbnRyeVtNYWNUYWIuTnVtXS5BdmdSc3NpMiA9IHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uUnNzaVNhbXBsZS5BdmdSc3NpMjsKKworCQkJLy8gdGhlIGNvbm5lY3RlZCB0aW1lIHBlciBlbnRyeQorCQkJTWFjVGFiLkVudHJ5W01hY1RhYi5OdW1dLkNvbm5lY3RlZFRpbWUgPSBwQWQtPk1hY1RhYi5Db250ZW50W2ldLlN0YUNvbm5lY3RUaW1lOworCQkJTWFjVGFiLkVudHJ5W01hY1RhYi5OdW1dLlR4UmF0ZS5maWVsZC5NQ1MgPSBwQWQtPk1hY1RhYi5Db250ZW50W2ldLkhUUGh5TW9kZS5maWVsZC5NQ1M7CisJCQlNYWNUYWIuRW50cnlbTWFjVGFiLk51bV0uVHhSYXRlLmZpZWxkLkJXID0gcEFkLT5NYWNUYWIuQ29udGVudFtpXS5IVFBoeU1vZGUuZmllbGQuQlc7CisJCQlNYWNUYWIuRW50cnlbTWFjVGFiLk51bV0uVHhSYXRlLmZpZWxkLlNob3J0R0kgPSBwQWQtPk1hY1RhYi5Db250ZW50W2ldLkhUUGh5TW9kZS5maWVsZC5TaG9ydEdJOworCQkJTWFjVGFiLkVudHJ5W01hY1RhYi5OdW1dLlR4UmF0ZS5maWVsZC5TVEJDID0gcEFkLT5NYWNUYWIuQ29udGVudFtpXS5IVFBoeU1vZGUuZmllbGQuU1RCQzsKKwkJCU1hY1RhYi5FbnRyeVtNYWNUYWIuTnVtXS5UeFJhdGUuZmllbGQucnN2ID0gcEFkLT5NYWNUYWIuQ29udGVudFtpXS5IVFBoeU1vZGUuZmllbGQucnN2OworCQkJTWFjVGFiLkVudHJ5W01hY1RhYi5OdW1dLlR4UmF0ZS5maWVsZC5NT0RFID0gcEFkLT5NYWNUYWIuQ29udGVudFtpXS5IVFBoeU1vZGUuZmllbGQuTU9ERTsKKwkJCU1hY1RhYi5FbnRyeVtNYWNUYWIuTnVtXS5UeFJhdGUud29yZCA9IHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uSFRQaHlNb2RlLndvcmQ7CisKKwkJCU1hY1RhYi5OdW0gKz0gMTsKKwkJfQorCX0KKwl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoUlRfODAyXzExX01BQ19UQUJMRSk7CisJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmTWFjVGFiLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6IGNvcHlfdG9fdXNlcigpIGZhaWxcbiIsIF9fZnVuY19fKSk7CisJfQorCisJbXNnID0gKENIQVIgKikga21hbGxvYyhzaXplb2YoQ0hBUikqKE1BWF9MRU5fT0ZfTUFDX1RBQkxFKk1BQ19MSU5FX0xFTiksIE1FTV9BTExPQ19GTEFHKTsKKwltZW1zZXQobXNnLCAwICxNQVhfTEVOX09GX01BQ19UQUJMRSpNQUNfTElORV9MRU4gKTsKKwlzcHJpbnRmKG1zZywiJXMiLCJcbiIpOworCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCIlLTE0cyUtNHMlLTRzJS0xMHMlLTEwcyUtMTBzJS02cyUtNnNcbiIsCisJCSJNQUMiLCAiQUlEIiwgIlBTTSIsICJMRFQiLCAiUnhCIiwgIlR4QiIsIkNUeFIiLCAiTFR4UiIpOworCisJZm9yIChpPTA7IGk8TUFYX0xFTl9PRl9NQUNfVEFCTEU7IGkrKykKKwl7CisJCVBNQUNfVEFCTEVfRU5UUlkgcEVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbaV07CisJCWlmIChwRW50cnktPlZhbGlkQXNDTEkgJiYgKHBFbnRyeS0+U3N0ID09IFNTVF9BU1NPQykpCisJCXsKKwkJCWlmKChzdHJsZW4obXNnKStNQUNfTElORV9MRU4gKSA+PSAoTUFYX0xFTl9PRl9NQUNfVEFCTEUqTUFDX0xJTkVfTEVOKSApCisJCQkJYnJlYWs7CisJCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwiJTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4ICAiLAorCQkJCXBFbnRyeS0+QWRkclswXSwgcEVudHJ5LT5BZGRyWzFdLCBwRW50cnktPkFkZHJbMl0sCisJCQkJcEVudHJ5LT5BZGRyWzNdLCBwRW50cnktPkFkZHJbNF0sIHBFbnRyeS0+QWRkcls1XSk7CisJCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwiJS00ZCIsIChpbnQpcEVudHJ5LT5BaWQpOworCQkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksIiUtNGQiLCAoaW50KXBFbnRyeS0+UHNNb2RlKTsKKwkJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCIlLTEwZCIsMC8qcEFkLT5NYWNUYWIuQ29udGVudFtpXS5IU0NvdW50ZXIuTGFzdERhdGFQYWNrZXRUaW1lKi8pOyAvLyBUb0RvCisJCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwiJS0xMGQiLDAvKnBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uSFNDb3VudGVyLlRvdGFsUnhCeXRlQ291bnQqLyk7IC8vIFRvRG8KKwkJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCIlLTEwZCIsMC8qcEFkLT5NYWNUYWIuQ29udGVudFtpXS5IU0NvdW50ZXIuVG90YWxUeEJ5dGVDb3VudCovKTsgLy8gVG9EbworCQkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksIiUtNmQiLFJhdGVJZFRvTWJwc1twQWQtPk1hY1RhYi5Db250ZW50W2ldLkN1cnJUeFJhdGVdKTsKKwkJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCIlLTZkXG4iLDAvKlJhdGVJZFRvTWJwc1twQWQtPk1hY1RhYi5Db250ZW50W2ldLkxhc3RUeFJhdGVdKi8pOyAvLyBUb0RvCisJCX0KKwl9CisJLy8gZm9yIGNvbXBhdGlibGUgd2l0aCBvbGQgQVBJIGp1c3QgZG8gdGhlIHByaW50ayB0byBjb25zb2xlCisJLy93cnEtPnUuZGF0YS5sZW5ndGggPSBzdHJsZW4obXNnKTsKKwkvL2lmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgbXNnLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXMiLCBtc2cpKTsKKwl9CisKKwlrZnJlZShtc2cpOworfQorI2VuZGlmIC8vIFVDT1MgLy8KKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorSU5UCVNldF9CQVNldHVwX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworICAgIFVDSEFSIG1hY1s2XSwgdGlkOworCWNoYXIgKnRva2VuLCBzZXBWYWx1ZVtdID0gIjoiLCBEQVNIID0gJy0nOworCUlOVCBpOworICAgIE1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5OworCisvKgorCVRoZSBCQVNldHVwIGludXB0IHN0cmluZyBmb3JtYXQgc2hvdWxkIGJlIHh4Onh4Onh4Onh4Onh4Onh4LWQsCisJCT0+VGhlIHNpeCAyIGRpZ2l0IGhleC1kZWNpbWFsIG51bWJlciBwcmV2aW91cyBhcmUgdGhlIE1hYyBhZGRyZXNzLAorCQk9PlRoZSBzZXZlbnRoIGRlY2ltYWwgbnVtYmVyIGlzIHRoZSB0aWQgdmFsdWUuCisqLworCS8vcHJpbnRrKCJcbiVzXG4iLCBhcmcpOworCisJaWYoc3RybGVuKGFyZykgPCAxOSkgIC8vTWFjIGFkZHJlc3MgYWNjZXB0YWJsZSBmb3JtYXQgMDE6MDI6MDM6MDQ6MDU6MDYgbGVuZ3RoIDE3IHBsdXMgdGhlICItIiBhbmQgdGlkIHZhbHVlIGluIGRlY2ltYWwgZm9ybWF0LgorCQlyZXR1cm4gRkFMU0U7CisKKwl0b2tlbiA9IHN0cmNocihhcmcsIERBU0gpOworCWlmICgodG9rZW4gIT0gTlVMTCkgJiYgKHN0cmxlbih0b2tlbik+MSkpCisJeworCQl0aWQgPSBzaW1wbGVfc3RydG9sKCh0b2tlbisxKSwgMCwgMTApOworCQlpZiAodGlkID4gMTUpCisJCQlyZXR1cm4gRkFMU0U7CisKKwkJKnRva2VuID0gJ1wwJzsKKwkJZm9yIChpID0gMCwgdG9rZW4gPSByc3RydG9rKGFyZywgJnNlcFZhbHVlWzBdKTsgdG9rZW47IHRva2VuID0gcnN0cnRvayhOVUxMLCAmc2VwVmFsdWVbMF0pLCBpKyspCisJCXsKKwkJCWlmKChzdHJsZW4odG9rZW4pICE9IDIpIHx8ICghaXN4ZGlnaXQoKnRva2VuKSkgfHwgKCFpc3hkaWdpdCgqKHRva2VuKzEpKSkpCisJCQkJcmV0dXJuIEZBTFNFOworCQkJQXRvSCh0b2tlbiwgKFBVQ0hBUikoJm1hY1tpXSksIDEpOworCQl9CisJCWlmKGkgIT0gNikKKwkJCXJldHVybiBGQUxTRTsKKworCQlwcmludGsoIlxuJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMngtJTAyeFxuIiwgbWFjWzBdLCBtYWNbMV0sCisJCQkJbWFjWzJdLCBtYWNbM10sIG1hY1s0XSwgbWFjWzVdLCB0aWQpOworCisJICAgIHBFbnRyeSA9IE1hY1RhYmxlTG9va3VwKHBBZCwgbWFjKTsKKworICAgIAlpZiAocEVudHJ5KSB7CisgICAgICAgIAlwcmludGsoIlxuU2V0dXAgQkEgU2Vzc2lvbjogVGlkID0gJWRcbiIsIHRpZCk7CisJICAgICAgICBCQU9yaVNlc3Npb25TZXRVcChwQWQsIHBFbnRyeSwgdGlkLCAwLCAxMDAsIFRSVUUpOworICAgIAl9CisKKwkJcmV0dXJuIFRSVUU7CisJfQorCisJcmV0dXJuIEZBTFNFOworCit9CisKK0lOVAlTZXRfQkFEZWNsaW5lX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCVVMT05HIGJCQURlY2xpbmU7CisKKwliQkFEZWNsaW5lID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKworCWlmIChiQkFEZWNsaW5lID09IDApCisJeworCQlwQWQtPkNvbW1vbkNmZy5iQkFEZWNsaW5lID0gRkFMU0U7CisJfQorCWVsc2UgaWYgKGJCQURlY2xpbmUgPT0gMSkKKwl7CisJCXBBZC0+Q29tbW9uQ2ZnLmJCQURlY2xpbmUgPSBUUlVFOworCX0KKwllbHNlCisJeworCQlyZXR1cm4gRkFMU0U7IC8vSW52YWxpZCBhcmd1bWVudAorCX0KKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9CQURlY2xpbmVfUHJvYzo6KEJBRGVjbGluZT0lZClcbiIsIHBBZC0+Q29tbW9uQ2ZnLmJCQURlY2xpbmUpKTsKKworCXJldHVybiBUUlVFOworfQorCitJTlQJU2V0X0JBT3JpVGVhckRvd25fUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisgICAgVUNIQVIgbWFjWzZdLCB0aWQ7CisJY2hhciAqdG9rZW4sIHNlcFZhbHVlW10gPSAiOiIsIERBU0ggPSAnLSc7CisJSU5UIGk7CisgICAgTUFDX1RBQkxFX0VOVFJZICpwRW50cnk7CisKKy8qCisJVGhlIEJBT3JpVGVhckRvd24gaW51cHQgc3RyaW5nIGZvcm1hdCBzaG91bGQgYmUgeHg6eHg6eHg6eHg6eHg6eHgtZCwKKwkJPT5UaGUgc2l4IDIgZGlnaXQgaGV4LWRlY2ltYWwgbnVtYmVyIHByZXZpb3VzIGFyZSB0aGUgTWFjIGFkZHJlc3MsCisJCT0+VGhlIHNldmVudGggZGVjaW1hbCBudW1iZXIgaXMgdGhlIHRpZCB2YWx1ZS4KKyovCisgICAgaWYoc3RybGVuKGFyZykgPCAxOSkgIC8vTWFjIGFkZHJlc3MgYWNjZXB0YWJsZSBmb3JtYXQgMDE6MDI6MDM6MDQ6MDU6MDYgbGVuZ3RoIDE3IHBsdXMgdGhlICItIiBhbmQgdGlkIHZhbHVlIGluIGRlY2ltYWwgZm9ybWF0LgorCQlyZXR1cm4gRkFMU0U7CisKKwl0b2tlbiA9IHN0cmNocihhcmcsIERBU0gpOworCWlmICgodG9rZW4gIT0gTlVMTCkgJiYgKHN0cmxlbih0b2tlbik+MSkpCisJeworCQl0aWQgPSBzaW1wbGVfc3RydG9sKCh0b2tlbisxKSwgMCwgMTApOworCQlpZiAodGlkID4gTlVNX09GX1RJRCkKKwkJCXJldHVybiBGQUxTRTsKKworCQkqdG9rZW4gPSAnXDAnOworCQlmb3IgKGkgPSAwLCB0b2tlbiA9IHJzdHJ0b2soYXJnLCAmc2VwVmFsdWVbMF0pOyB0b2tlbjsgdG9rZW4gPSByc3RydG9rKE5VTEwsICZzZXBWYWx1ZVswXSksIGkrKykKKwkJeworCQkJaWYoKHN0cmxlbih0b2tlbikgIT0gMikgfHwgKCFpc3hkaWdpdCgqdG9rZW4pKSB8fCAoIWlzeGRpZ2l0KCoodG9rZW4rMSkpKSkKKwkJCQlyZXR1cm4gRkFMU0U7CisJCQlBdG9IKHRva2VuLCAoUFVDSEFSKSgmbWFjW2ldKSwgMSk7CisJCX0KKwkJaWYoaSAhPSA2KQorCQkJcmV0dXJuIEZBTFNFOworCisJICAgIHByaW50aygiXG4lMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeC0lMDJ4IiwgbWFjWzBdLCBtYWNbMV0sCisJICAgICAgICAgICBtYWNbMl0sIG1hY1szXSwgbWFjWzRdLCBtYWNbNV0sIHRpZCk7CisKKwkgICAgcEVudHJ5ID0gTWFjVGFibGVMb29rdXAocEFkLCBtYWMpOworCisJICAgIGlmIChwRW50cnkpIHsKKwkgICAgICAgIHByaW50aygiXG5UZWFyIGRvd24gT3JpIEJBIFNlc3Npb246IFRpZCA9ICVkXG4iLCB0aWQpOworICAgICAgICBCQU9yaVNlc3Npb25UZWFyRG93bihwQWQsIHBFbnRyeS0+QWlkLCB0aWQsIEZBTFNFLCBUUlVFKTsKKwkgICAgfQorCisJCXJldHVybiBUUlVFOworCX0KKworCXJldHVybiBGQUxTRTsKKworfQorCitJTlQJU2V0X0JBUmVjVGVhckRvd25fUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisgICAgVUNIQVIgbWFjWzZdLCB0aWQ7CisJY2hhciAqdG9rZW4sIHNlcFZhbHVlW10gPSAiOiIsIERBU0ggPSAnLSc7CisJSU5UIGk7CisgICAgTUFDX1RBQkxFX0VOVFJZICpwRW50cnk7CisKKyAgICAvL3ByaW50aygiXG4lc1xuIiwgYXJnKTsKKy8qCisJVGhlIEJBUmVjVGVhckRvd24gaW51cHQgc3RyaW5nIGZvcm1hdCBzaG91bGQgYmUgeHg6eHg6eHg6eHg6eHg6eHgtZCwKKwkJPT5UaGUgc2l4IDIgZGlnaXQgaGV4LWRlY2ltYWwgbnVtYmVyIHByZXZpb3VzIGFyZSB0aGUgTWFjIGFkZHJlc3MsCisJCT0+VGhlIHNldmVudGggZGVjaW1hbCBudW1iZXIgaXMgdGhlIHRpZCB2YWx1ZS4KKyovCisgICAgaWYoc3RybGVuKGFyZykgPCAxOSkgIC8vTWFjIGFkZHJlc3MgYWNjZXB0YWJsZSBmb3JtYXQgMDE6MDI6MDM6MDQ6MDU6MDYgbGVuZ3RoIDE3IHBsdXMgdGhlICItIiBhbmQgdGlkIHZhbHVlIGluIGRlY2ltYWwgZm9ybWF0LgorCQlyZXR1cm4gRkFMU0U7CisKKwl0b2tlbiA9IHN0cmNocihhcmcsIERBU0gpOworCWlmICgodG9rZW4gIT0gTlVMTCkgJiYgKHN0cmxlbih0b2tlbik+MSkpCisJeworCQl0aWQgPSBzaW1wbGVfc3RydG9sKCh0b2tlbisxKSwgMCwgMTApOworCQlpZiAodGlkID4gTlVNX09GX1RJRCkKKwkJCXJldHVybiBGQUxTRTsKKworCQkqdG9rZW4gPSAnXDAnOworCQlmb3IgKGkgPSAwLCB0b2tlbiA9IHJzdHJ0b2soYXJnLCAmc2VwVmFsdWVbMF0pOyB0b2tlbjsgdG9rZW4gPSByc3RydG9rKE5VTEwsICZzZXBWYWx1ZVswXSksIGkrKykKKwkJeworCQkJaWYoKHN0cmxlbih0b2tlbikgIT0gMikgfHwgKCFpc3hkaWdpdCgqdG9rZW4pKSB8fCAoIWlzeGRpZ2l0KCoodG9rZW4rMSkpKSkKKwkJCQlyZXR1cm4gRkFMU0U7CisJCQlBdG9IKHRva2VuLCAoUFVDSEFSKSgmbWFjW2ldKSwgMSk7CisJCX0KKwkJaWYoaSAhPSA2KQorCQkJcmV0dXJuIEZBTFNFOworCisJCXByaW50aygiXG4lMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeC0lMDJ4IiwgbWFjWzBdLCBtYWNbMV0sCisJCSAgICAgICBtYWNbMl0sIG1hY1szXSwgbWFjWzRdLCBtYWNbNV0sIHRpZCk7CisKKwkJcEVudHJ5ID0gTWFjVGFibGVMb29rdXAocEFkLCBtYWMpOworCisJCWlmIChwRW50cnkpIHsKKwkJICAgIHByaW50aygiXG5UZWFyIGRvd24gUmVjIEJBIFNlc3Npb246IFRpZCA9ICVkXG4iLCB0aWQpOworCQkgICAgQkFSZWNTZXNzaW9uVGVhckRvd24ocEFkLCBwRW50cnktPkFpZCwgdGlkLCBGQUxTRSk7CisJCX0KKworCQlyZXR1cm4gVFJVRTsKKwl9CisKKwlyZXR1cm4gRkFMU0U7CisKK30KKworSU5UCVNldF9IdEJ3X1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCVVMT05HIEh0Qnc7CisKKwlIdEJ3ID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKwlpZiAoSHRCdyA9PSBCV180MCkKKwkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXICA9IEJXXzQwOworCWVsc2UgaWYgKEh0QncgPT0gQldfMjApCisJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5CVyAgPSBCV18yMDsKKwllbHNlCisJCXJldHVybiBGQUxTRTsgIC8vSW52YWxpZCBhcmd1bWVudAorCisJU2V0Q29tbW9uSFQocEFkKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9IdEJ3X1Byb2M6OihIdEJ3PSVkKVxuIiwgcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXKSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworSU5UCVNldF9IdE1jc19Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVTE9ORyBIdE1jcywgTWNzX3RtcDsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKyAgICBCT09MRUFOIGJBdXRvUmF0ZSA9IEZBTFNFOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJTWNzX3RtcCA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisKKwlpZiAoTWNzX3RtcCA8PSAxNSB8fCBNY3NfdG1wID09IDMyKQorCQlIdE1jcyA9IE1jc190bXA7CisJZWxzZQorCQlIdE1jcyA9IE1DU19BVVRPOworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwl7CisJCXBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gSHRNY3M7CisJCXBBZC0+U3RhQ2ZnLmJBdXRvVHhSYXRlU3dpdGNoID0gKEh0TWNzID09IE1DU19BVVRPKSA/IFRSVUU6RkFMU0U7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9IdE1jc19Qcm9jOjooSHRNY3M9JWQsIGJBdXRvVHhSYXRlU3dpdGNoID0gJWQpXG4iLAorCQkJCQkJcEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MsIHBBZC0+U3RhQ2ZnLmJBdXRvVHhSYXRlU3dpdGNoKSk7CisKKwkJaWYgKChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlIDwgUEhZXzExQUJHTl9NSVhFRCkgfHwKKwkJCShwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkhUUGh5TW9kZS5maWVsZC5NT0RFIDwgTU9ERV9IVE1JWCkpCisJCXsKKwkgICAgICAgIGlmICgocEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgIT0gTUNTX0FVVE8pICYmCisJCQkJKEh0TWNzID49IDAgJiYgSHRNY3MgPD0gMykgJiYKKwkgICAgICAgICAgICAocEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5GaXhlZFR4TW9kZSA9PSBGSVhFRF9UWE1PREVfQ0NLKSkKKwkJCXsKKwkJCQlSVE1QU2V0RGVzaXJlZFJhdGVzKHBBZCwgKExPTkcpIChSYXRlSWRUb01icHNbSHRNY3NdICogMTAwMDAwMCkpOworCQkJfQorCSAgICAgICAgZWxzZSBpZiAoKHBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTICE9IE1DU19BVVRPKSAmJgorCQkJCQkoSHRNY3MgPj0gMCAmJiBIdE1jcyA8PSA3KSAmJgorCSAgICAgICAgICAgIAkocEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5GaXhlZFR4TW9kZSA9PSBGSVhFRF9UWE1PREVfT0ZETSkpCisJCQl7CisJCQkJUlRNUFNldERlc2lyZWRSYXRlcyhwQWQsIChMT05HKSAoUmF0ZUlkVG9NYnBzW0h0TWNzKzRdICogMTAwMDAwMCkpOworCQkJfQorCQkJZWxzZQorCQkJCWJBdXRvUmF0ZSA9IFRSVUU7CisKKwkJCWlmIChiQXV0b1JhdGUpCisJCQl7CisJICAgICAgICAgICAgcEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfQVVUTzsKKwkJCQlSVE1QU2V0RGVzaXJlZFJhdGVzKHBBZCwgLTEpOworCQkJfQorCSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0h0TWNzX1Byb2M6OihGaXhlZFR4TW9kZT0lZClcbiIscEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5GaXhlZFR4TW9kZSkpOworCQl9CisgICAgICAgIGlmIChBREhPQ19PTihwQWQpKQorICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJU2V0Q29tbW9uSFQocEFkKTsKKworCXJldHVybiBUUlVFOworfQorCitJTlQJU2V0X0h0R2lfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJVUxPTkcgSHRHaTsKKworCUh0R2kgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCisJaWYgKCBIdEdpID09IEdJXzQwMCkKKwkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLlNob3J0R0kgPSBHSV80MDA7CisJZWxzZSBpZiAoIEh0R2kgPT0gR0lfODAwICkKKwkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLlNob3J0R0kgPSBHSV84MDA7CisJZWxzZQorCQlyZXR1cm4gRkFMU0U7IC8vSW52YWxpZCBhcmd1bWVudAorCisJU2V0Q29tbW9uSFQocEFkKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9IdEdpX1Byb2M6OihTaG9ydEdJPSVkKVxuIixwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuU2hvcnRHSSkpOworCisJcmV0dXJuIFRSVUU7Cit9CisKKworSU5UCVNldF9IdFR4QkFTaXplX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCVVDSEFSIFNpemU7CisKKwlTaXplID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKworCWlmIChTaXplIDw9MCB8fCBTaXplID49NjQpCisJeworCQlTaXplID0gODsKKwl9CisJcEFkLT5Db21tb25DZmcuVHhCQVNpemUgPSBTaXplLTE7CisJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiU2V0X0h0VHhCQVNpemUgOjooVHhCQVNpemU9ICVkKVxuIiwgU2l6ZSkpOworCisJcmV0dXJuIFRSVUU7Cit9CisKKworSU5UCVNldF9IdE9wTW9kZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKworCVVMT05HIFZhbHVlOworCisJVmFsdWUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCisJaWYgKFZhbHVlID09IEhUTU9ERV9HRikKKwkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkhUTU9ERSAgPSBIVE1PREVfR0Y7CisJZWxzZSBpZiAoIFZhbHVlID09IEhUTU9ERV9NTSApCisJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5IVE1PREUgID0gSFRNT0RFX01NOworCWVsc2UKKwkJcmV0dXJuIEZBTFNFOyAvL0ludmFsaWQgYXJndW1lbnQKKworCVNldENvbW1vbkhUKHBBZCk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfSHRPcE1vZGVfUHJvYzo6KEh0T3BNb2RlPSVkKVxuIixwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuSFRNT0RFKSk7CisKKwlyZXR1cm4gVFJVRTsKKworfQorCitJTlQJU2V0X0h0U3RiY19Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKworCVVMT05HIFZhbHVlOworCisJVmFsdWUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCisJaWYgKFZhbHVlID09IFNUQkNfVVNFKQorCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuU1RCQyA9IFNUQkNfVVNFOworCWVsc2UgaWYgKCBWYWx1ZSA9PSBTVEJDX05PTkUgKQorCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuU1RCQyA9IFNUQkNfTk9ORTsKKwllbHNlCisJCXJldHVybiBGQUxTRTsgLy9JbnZhbGlkIGFyZ3VtZW50CisKKwlTZXRDb21tb25IVChwQWQpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X1N0YmNfUHJvYzo6KEh0U3RiYz0lZClcbiIscEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLlNUQkMpKTsKKworCXJldHVybiBUUlVFOworfQorCitJTlQJU2V0X0h0SHRjX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCisJVUxPTkcgVmFsdWU7CisKKwlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisJaWYgKFZhbHVlID09IDApCisJCXBBZC0+SFRDRW5hYmxlID0gRkFMU0U7CisJZWxzZSBpZiAoIFZhbHVlID09MSApCisgICAgICAgIAlwQWQtPkhUQ0VuYWJsZSA9IFRSVUU7CisJZWxzZQorCQlyZXR1cm4gRkFMU0U7IC8vSW52YWxpZCBhcmd1bWVudAorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0h0SHRjX1Byb2M6OihIdEh0Yz0lZClcbiIscEFkLT5IVENFbmFibGUpKTsKKworCXJldHVybiBUUlVFOworfQorCitJTlQJU2V0X0h0RXh0Y2hhX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCisJVUxPTkcgVmFsdWU7CisKKwlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisKKwlpZiAoVmFsdWUgPT0gMCkKKwkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkVYVENIQSAgPSBFWFRDSEFfQkVMT1c7CisJZWxzZSBpZiAoIFZhbHVlID09MSApCisgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5FWFRDSEEgPSBFWFRDSEFfQUJPVkU7CisJZWxzZQorCQlyZXR1cm4gRkFMU0U7IC8vSW52YWxpZCBhcmd1bWVudAorCisJU2V0Q29tbW9uSFQocEFkKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9IdEV4dGNoYV9Qcm9jOjooSHRFeHRjaGE9JWQpXG4iLHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5FWFRDSEEpKTsKKworCXJldHVybiBUUlVFOworfQorCitJTlQJU2V0X0h0TXBkdURlbnNpdHlfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJVUxPTkcgVmFsdWU7CisKKwlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisKKwlpZiAoVmFsdWUgPD03ICYmIFZhbHVlID49IDApCisJCXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5NcGR1RGVuc2l0eSA9IFZhbHVlOworCWVsc2UKKwkJcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1wZHVEZW5zaXR5ID0gNDsKKworCVNldENvbW1vbkhUKHBBZCk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfSHRNcGR1RGVuc2l0eV9Qcm9jOjooSHRNcGR1RGVuc2l0eT0lZClcbiIscEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1wZHVEZW5zaXR5KSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworSU5UCVNldF9IdEJhV2luU2l6ZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVTE9ORyBWYWx1ZTsKKworCVZhbHVlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKworCisJaWYgKFZhbHVlID49MSAmJiBWYWx1ZSA8PSA2NCkKKwl7CisJCXBBZC0+Q29tbW9uQ2ZnLlJFR0JBQ2FwYWJpbGl0eS5maWVsZC5SeEJBV2luTGltaXQgPSBWYWx1ZTsKKwkJcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlJ4QkFXaW5MaW1pdCA9IFZhbHVlOworCX0KKwllbHNlCisJeworICAgICAgICBwQWQtPkNvbW1vbkNmZy5SRUdCQUNhcGFiaWxpdHkuZmllbGQuUnhCQVdpbkxpbWl0ID0gNjQ7CisJCXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5SeEJBV2luTGltaXQgPSA2NDsKKwl9CisKKwlTZXRDb21tb25IVChwQWQpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0h0QmFXaW5TaXplX1Byb2M6OihIdEJhV2luU2l6ZT0lZClcbiIscEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlJ4QkFXaW5MaW1pdCkpOworCisJcmV0dXJuIFRSVUU7Cit9CisKK0lOVAlTZXRfSHRSZGdfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJVUxPTkcgVmFsdWU7CisKKwlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisKKwlpZiAoVmFsdWUgPT0gMCkKKwkJcEFkLT5Db21tb25DZmcuYlJkZyA9IEZBTFNFOworCWVsc2UgaWYgKCBWYWx1ZSA9PTEgKQorCXsKKwkJcEFkLT5IVENFbmFibGUgPSBUUlVFOworICAgICAgICAJcEFkLT5Db21tb25DZmcuYlJkZyA9IFRSVUU7CisJfQorCWVsc2UKKwkJcmV0dXJuIEZBTFNFOyAvL0ludmFsaWQgYXJndW1lbnQKKworCVNldENvbW1vbkhUKHBBZCk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfSHRSZGdfUHJvYzo6KEh0UmRnPSVkKVxuIixwQWQtPkNvbW1vbkNmZy5iUmRnKSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworSU5UCVNldF9IdExpbmtBZGFwdF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVTE9ORyBWYWx1ZTsKKworCVZhbHVlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKwlpZiAoVmFsdWUgPT0gMCkKKwkJcEFkLT5iTGlua0FkYXB0ID0gRkFMU0U7CisJZWxzZSBpZiAoIFZhbHVlID09MSApCisJeworCQkJcEFkLT5IVENFbmFibGUgPSBUUlVFOworCQkJcEFkLT5iTGlua0FkYXB0ID0gVFJVRTsKKwl9CisJZWxzZQorCQlyZXR1cm4gRkFMU0U7IC8vSW52YWxpZCBhcmd1bWVudAorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0h0TGlua0FkYXB0X1Byb2M6OihIdExpbmtBZGFwdD0lZClcbiIscEFkLT5iTGlua0FkYXB0KSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworSU5UCVNldF9IdEFtc2R1X1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCVVMT05HIFZhbHVlOworCisJVmFsdWUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCWlmIChWYWx1ZSA9PSAwKQorCQlwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQW1zZHVFbmFibGUgPSBGQUxTRTsKKwllbHNlIGlmICggVmFsdWUgPT0gMSApCisgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BbXNkdUVuYWJsZSA9IFRSVUU7CisJZWxzZQorCQlyZXR1cm4gRkFMU0U7IC8vSW52YWxpZCBhcmd1bWVudAorCisJU2V0Q29tbW9uSFQocEFkKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9IdEFtc2R1X1Byb2M6OihIdEFtc2R1PSVkKVxuIixwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQW1zZHVFbmFibGUpKTsKKworCXJldHVybiBUUlVFOworfQorCitJTlQJU2V0X0h0QXV0b0JhX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCVVMT05HIFZhbHVlOworCisJVmFsdWUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCWlmIChWYWx1ZSA9PSAwKQorCQlwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQXV0b0JBID0gRkFMU0U7CisgICAgZWxzZSBpZiAoVmFsdWUgPT0gMSkKKwkJcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkF1dG9CQSA9IFRSVUU7CisJZWxzZQorCQlyZXR1cm4gRkFMU0U7IC8vSW52YWxpZCBhcmd1bWVudAorCisgICAgcEFkLT5Db21tb25DZmcuUkVHQkFDYXBhYmlsaXR5LmZpZWxkLkF1dG9CQSA9IHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BdXRvQkE7CisJU2V0Q29tbW9uSFQocEFkKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9IdEF1dG9CYV9Qcm9jOjooSHRBdXRvQmE9JWQpXG4iLHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BdXRvQkEpKTsKKworCXJldHVybiBUUlVFOworCit9CisKK0lOVAlTZXRfSHRQcm90ZWN0X1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCVVMT05HIFZhbHVlOworCisJVmFsdWUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCWlmIChWYWx1ZSA9PSAwKQorCQlwQWQtPkNvbW1vbkNmZy5iSFRQcm90ZWN0ID0gRkFMU0U7CisgICAgZWxzZSBpZiAoVmFsdWUgPT0gMSkKKwkJcEFkLT5Db21tb25DZmcuYkhUUHJvdGVjdCA9IFRSVUU7CisJZWxzZQorCQlyZXR1cm4gRkFMU0U7IC8vSW52YWxpZCBhcmd1bWVudAorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0h0UHJvdGVjdF9Qcm9jOjooSHRQcm90ZWN0PSVkKVxuIixwQWQtPkNvbW1vbkNmZy5iSFRQcm90ZWN0KSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworSU5UCVNldF9TZW5kUFNNUEFjdGlvbl9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKyAgICBVQ0hBUiBtYWNbNl0sIG1vZGU7CisJY2hhciAqdG9rZW4sIHNlcFZhbHVlW10gPSAiOiIsIERBU0ggPSAnLSc7CisJSU5UIGk7CisgICAgTUFDX1RBQkxFX0VOVFJZICpwRW50cnk7CisKKyAgICAvL3ByaW50aygiXG4lc1xuIiwgYXJnKTsKKy8qCisJVGhlIEJBUmVjVGVhckRvd24gaW51cHQgc3RyaW5nIGZvcm1hdCBzaG91bGQgYmUgeHg6eHg6eHg6eHg6eHg6eHgtZCwKKwkJPT5UaGUgc2l4IDIgZGlnaXQgaGV4LWRlY2ltYWwgbnVtYmVyIHByZXZpb3VzIGFyZSB0aGUgTWFjIGFkZHJlc3MsCisJCT0+VGhlIHNldmVudGggZGVjaW1hbCBudW1iZXIgaXMgdGhlIG1vZGUgdmFsdWUuCisqLworICAgIGlmKHN0cmxlbihhcmcpIDwgMTkpICAvL01hYyBhZGRyZXNzIGFjY2VwdGFibGUgZm9ybWF0IDAxOjAyOjAzOjA0OjA1OjA2IGxlbmd0aCAxNyBwbHVzIHRoZSAiLSIgYW5kIG1vZGUgdmFsdWUgaW4gZGVjaW1hbCBmb3JtYXQuCisJCXJldHVybiBGQUxTRTsKKworICAgCXRva2VuID0gc3RyY2hyKGFyZywgREFTSCk7CisJaWYgKCh0b2tlbiAhPSBOVUxMKSAmJiAoc3RybGVuKHRva2VuKT4xKSkKKwl7CisJCW1vZGUgPSBzaW1wbGVfc3RydG9sKCh0b2tlbisxKSwgMCwgMTApOworCQlpZiAobW9kZSA+IE1NUFNfRU5BQkxFKQorCQkJcmV0dXJuIEZBTFNFOworCisJCSp0b2tlbiA9ICdcMCc7CisJCWZvciAoaSA9IDAsIHRva2VuID0gcnN0cnRvayhhcmcsICZzZXBWYWx1ZVswXSk7IHRva2VuOyB0b2tlbiA9IHJzdHJ0b2soTlVMTCwgJnNlcFZhbHVlWzBdKSwgaSsrKQorCQl7CisJCQlpZigoc3RybGVuKHRva2VuKSAhPSAyKSB8fCAoIWlzeGRpZ2l0KCp0b2tlbikpIHx8ICghaXN4ZGlnaXQoKih0b2tlbisxKSkpKQorCQkJCXJldHVybiBGQUxTRTsKKwkJCUF0b0godG9rZW4sIChQVUNIQVIpKCZtYWNbaV0pLCAxKTsKKwkJfQorCQlpZihpICE9IDYpCisJCQlyZXR1cm4gRkFMU0U7CisKKwkJcHJpbnRrKCJcbiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4LSUwMngiLCBtYWNbMF0sIG1hY1sxXSwKKwkJICAgICAgIG1hY1syXSwgbWFjWzNdLCBtYWNbNF0sIG1hY1s1XSwgbW9kZSk7CisKKwkJcEVudHJ5ID0gTWFjVGFibGVMb29rdXAocEFkLCBtYWMpOworCisJCWlmIChwRW50cnkpIHsKKwkJICAgIHByaW50aygiXG5TZW5kUFNNUEFjdGlvbiBNSVBTIG1vZGUgPSAlZFxuIiwgbW9kZSk7CisJCSAgICBTZW5kUFNNUEFjdGlvbihwQWQsIHBFbnRyeS0+QWlkLCBtb2RlKTsKKwkJfQorCisJCXJldHVybiBUUlVFOworCX0KKworCXJldHVybiBGQUxTRTsKKworCit9CisKK0lOVAlTZXRfSHRNSU1PUFNtb2RlX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCVVMT05HIFZhbHVlOworCisJVmFsdWUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCisJaWYgKFZhbHVlIDw9MyAmJiBWYWx1ZSA+PSAwKQorCQlwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTU1QU21vZGUgPSBWYWx1ZTsKKwllbHNlCisJCXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5NTVBTbW9kZSA9IDM7CisKKwlTZXRDb21tb25IVChwQWQpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0h0TUlNT1BTbW9kZV9Qcm9jOjooTUlNT1BTIG1vZGU9JWQpXG4iLHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5NTVBTbW9kZSkpOworCisJcmV0dXJuIFRSVUU7Cit9CisKKworSU5UCVNldF9Gb3JjZVNob3J0R0lfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJVUxPTkcgVmFsdWU7CisKKwlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisJaWYgKFZhbHVlID09IDApCisJCXBBZC0+V0lGSXRlc3RiZWQuYlNob3J0R0kgPSBGQUxTRTsKKwllbHNlIGlmIChWYWx1ZSA9PSAxKQorCQlwQWQtPldJRkl0ZXN0YmVkLmJTaG9ydEdJID0gVFJVRTsKKwllbHNlCisJCXJldHVybiBGQUxTRTsgLy9JbnZhbGlkIGFyZ3VtZW50CisKKwlTZXRDb21tb25IVChwQWQpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0ZvcmNlU2hvcnRHSV9Qcm9jOjooRm9yY2VTaG9ydEdJPSVkKVxuIiwgcEFkLT5XSUZJdGVzdGJlZC5iU2hvcnRHSSkpOworCisJcmV0dXJuIFRSVUU7Cit9CisKKworCitJTlQJU2V0X0ZvcmNlR0ZfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJVUxPTkcgVmFsdWU7CisKKwlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisJaWYgKFZhbHVlID09IDApCisJCXBBZC0+V0lGSXRlc3RiZWQuYkdyZWVuRmllbGQgPSBGQUxTRTsKKwllbHNlIGlmIChWYWx1ZSA9PSAxKQorCQlwQWQtPldJRkl0ZXN0YmVkLmJHcmVlbkZpZWxkID0gVFJVRTsKKwllbHNlCisJCXJldHVybiBGQUxTRTsgLy9JbnZhbGlkIGFyZ3VtZW50CisKKwlTZXRDb21tb25IVChwQWQpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0ZvcmNlR0ZfUHJvYzo6KEZvcmNlR0Y9JWQpXG4iLCBwQWQtPldJRkl0ZXN0YmVkLmJHcmVlbkZpZWxkKSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworSU5UCVNldF9IdE1pbW9Qc19Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVTE9ORyBWYWx1ZTsKKworCVZhbHVlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKwlpZiAoVmFsdWUgPT0gMCkKKwkJcEFkLT5Db21tb25DZmcuYk1JTU9QU0VuYWJsZSA9IEZBTFNFOworCWVsc2UgaWYgKFZhbHVlID09IDEpCisJCXBBZC0+Q29tbW9uQ2ZnLmJNSU1PUFNFbmFibGUgPSBUUlVFOworCWVsc2UKKwkJcmV0dXJuIEZBTFNFOyAvL0ludmFsaWQgYXJndW1lbnQKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9IdE1pbW9Qc19Qcm9jOjooSHRNaW1vUHM9JWQpXG4iLHBBZC0+Q29tbW9uQ2ZnLmJNSU1PUFNFbmFibGUpKTsKKworCXJldHVybiBUUlVFOworfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKK0lOVAlTZXRDb21tb25IVCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCkKK3sKKwlPSURfU0VUX0hUX1BIWU1PREUJCVNldEhUOworCisJaWYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPCBQSFlfMTFBQkdOX01JWEVEKQorCQlyZXR1cm4gRkFMU0U7CisKKwlTZXRIVC5QaHlNb2RlID0gcEFkLT5Db21tb25DZmcuUGh5TW9kZTsKKwlTZXRIVC5UcmFuc21pdE5vID0gKChVQ0hBUilwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoKTsKKwlTZXRIVC5IdE1vZGUgPSAoVUNIQVIpcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkhUTU9ERTsKKwlTZXRIVC5FeHRPZmZzZXQgPSAoVUNIQVIpcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkVYVENIQTsKKwlTZXRIVC5NQ1MgPSBNQ1NfQVVUTzsKKwlTZXRIVC5CVyA9IChVQ0hBUilwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlc7CisJU2V0SFQuU1RCQyA9IChVQ0hBUilwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuU1RCQzsKKwlTZXRIVC5TSE9SVEdJID0gKFVDSEFSKXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5TaG9ydEdJOworCisJUlRNUFNldEhUKHBBZCwgJlNldEhUKTsKKworCXJldHVybiBUUlVFOworfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCitJTlQJU2V0X0ZpeGVkVHhNb2RlX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCVVDSEFSCWZpeF90eF9tb2RlID0gRklYRURfVFhNT0RFX0hUOworCisJaWYgKHN0cmNtcChhcmcsICJPRkRNIikgPT0gMCB8fCBzdHJjbXAoYXJnLCAib2ZkbSIpID09IDApCisJeworCQlmaXhfdHhfbW9kZSA9IEZJWEVEX1RYTU9ERV9PRkRNOworCX0KKwllbHNlIGlmIChzdHJjbXAoYXJnLCAiQ0NLIikgPT0gMCB8fCBzdHJjbXAoYXJnLCAiY2NrIikgPT0gMCkKKwl7CisgICAgICAgIGZpeF90eF9tb2RlID0gRklYRURfVFhNT0RFX0NDSzsKKwl9CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQlwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkZpeGVkVHhNb2RlID0gZml4X3R4X21vZGU7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfRml4ZWRUeE1vZGVfUHJvYzo6KEZpeGVkVHhNb2RlPSVkKVxuIiwgZml4X3R4X21vZGUpKTsKKworCXJldHVybiBUUlVFOworfQorCisjaWZkZWYgQ09ORklHX0FQU1RBX01JWEVEX1NVUFBPUlQKK0lOVAlTZXRfT3BNb2RlX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCVVMT05HIFZhbHVlOworCisJVmFsdWUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCisjaWZkZWYgUlQyODYwCisJaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKKyNlbmRpZiAvLyBSVDI4NjAgLy8KKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkNhbiBub3Qgc3dpdGNoIG9wZXJhdGUgbW9kZSBvbiBpbnRlcmZhY2UgdXAgISEgXG4iKSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlpZiAoVmFsdWUgPT0gMCkKKwkJcEFkLT5PcE1vZGUgPSBPUE1PREVfU1RBOworCWVsc2UgaWYgKFZhbHVlID09IDEpCisJCXBBZC0+T3BNb2RlID0gT1BNT0RFX0FQOworCWVsc2UKKwkJcmV0dXJuIEZBTFNFOyAvL0ludmFsaWQgYXJndW1lbnQKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9PcE1vZGVfUHJvYzo6KE9wTW9kZT0lcylcbiIsIHBBZC0+T3BNb2RlID09IDEgPyAiQVAgTW9kZSIgOiAiU1RBIE1vZGUiKSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKyNlbmRpZiAvLyBDT05GSUdfQVBTVEFfTUlYRURfU1VQUE9SVCAvLworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KK1BDSEFSICAgUlRNUEdldFJhbGlua0F1dGhNb2RlU3RyKAorICAgIElOICBORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9NT0RFIGF1dGhNb2RlKQoreworCXN3aXRjaChhdXRoTW9kZSkKKwl7CisJCWNhc2UgTmRpczgwMl8xMUF1dGhNb2RlT3BlbjoKKwkJCXJldHVybiAiT1BFTiI7CisgICAgICAgIGRlZmF1bHQ6CisJCWNhc2UgTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLOgorCQkJcmV0dXJuICJXUEFQU0siOworCQljYXNlIE5kaXM4MDJfMTFBdXRoTW9kZVNoYXJlZDoKKwkJCXJldHVybiAiU0hBUkVEIjsKKwkJY2FzZSBOZGlzODAyXzExQXV0aE1vZGVXUEE6CisJCQlyZXR1cm4gIldQQSI7CisJCWNhc2UgTmRpczgwMl8xMUF1dGhNb2RlV1BBMjoKKwkJCXJldHVybiAiV1BBMiI7CisJCWNhc2UgTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSzoKKwkJCXJldHVybiAiV1BBMlBTSyI7CisgICAgICAgIGNhc2UgTmRpczgwMl8xMUF1dGhNb2RlV1BBMVBTS1dQQTJQU0s6CisJCQlyZXR1cm4gIldQQVBTS1dQQTJQU0siOworICAgICAgICBjYXNlIE5kaXM4MDJfMTFBdXRoTW9kZVdQQTFXUEEyOgorCQkJcmV0dXJuICJXUEExV1BBMiI7CisJCWNhc2UgTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZToKKwkJCXJldHVybiAiV1BBTk9ORSI7CisJfQorfQorCitQQ0hBUiAgIFJUTVBHZXRSYWxpbmtFbmNyeU1vZGVTdHIoCisgICAgSU4gIFVTSE9SVCBlbmNyeU1vZGUpCit7CisJc3dpdGNoKGVuY3J5TW9kZSkKKwl7CisJICAgIGRlZmF1bHQ6CisJCWNhc2UgTmRpczgwMl8xMVdFUERpc2FibGVkOgorCQkJcmV0dXJuICJOT05FIjsKKwkJY2FzZSBOZGlzODAyXzExV0VQRW5hYmxlZDoKKwkJCXJldHVybiAiV0VQIjsKKwkJY2FzZSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkOgorCQkJcmV0dXJuICJUS0lQIjsKKwkJY2FzZSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkOgorCQkJcmV0dXJuICJBRVMiOworICAgICAgICBjYXNlIE5kaXM4MDJfMTFFbmNyeXB0aW9uNEVuYWJsZWQ6CisJCQlyZXR1cm4gIlRLSVBBRVMiOworCX0KK30KKworSU5UIFJUTVBTaG93Q2ZnVmFsdWUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJcE5hbWUsCisJSU4JUFVDSEFSCQkJcEJ1ZikKK3sKKwlJTlQJU3RhdHVzID0gMDsKKworCWZvciAoUFJUTVBfUFJJVkFURV9TVEFfU0hPV19DRkdfVkFMVUVfUFJPQyA9IFJUTVBfUFJJVkFURV9TVEFfU0hPV19DRkdfVkFMVUVfUFJPQzsgUFJUTVBfUFJJVkFURV9TVEFfU0hPV19DRkdfVkFMVUVfUFJPQy0+bmFtZTsgUFJUTVBfUFJJVkFURV9TVEFfU0hPV19DRkdfVkFMVUVfUFJPQysrKQorCXsKKwkJaWYgKCFzdHJjbXAocE5hbWUsIFBSVE1QX1BSSVZBVEVfU1RBX1NIT1dfQ0ZHX1ZBTFVFX1BST0MtPm5hbWUpKQorCQl7CisJCQlpZihQUlRNUF9QUklWQVRFX1NUQV9TSE9XX0NGR19WQUxVRV9QUk9DLT5zaG93X3Byb2MocEFkLCBwQnVmKSkKKwkJCQlTdGF0dXMgPSAtRUlOVkFMOworCQkJYnJlYWs7ICAvL0V4aXQgZm9yIGxvb3AuCisJCX0KKwl9CisKKwlpZihQUlRNUF9QUklWQVRFX1NUQV9TSE9XX0NGR19WQUxVRV9QUk9DLT5uYW1lID09IE5VTEwpCisJeworCQlzcHJpbnRmKHBCdWYsICJcbiIpOworCQlmb3IgKFBSVE1QX1BSSVZBVEVfU1RBX1NIT1dfQ0ZHX1ZBTFVFX1BST0MgPSBSVE1QX1BSSVZBVEVfU1RBX1NIT1dfQ0ZHX1ZBTFVFX1BST0M7IFBSVE1QX1BSSVZBVEVfU1RBX1NIT1dfQ0ZHX1ZBTFVFX1BST0MtPm5hbWU7IFBSVE1QX1BSSVZBVEVfU1RBX1NIT1dfQ0ZHX1ZBTFVFX1BST0MrKykKKwkJCXNwcmludGYocEJ1ZiwgIiVzJXNcbiIsIHBCdWYsIFBSVE1QX1BSSVZBVEVfU1RBX1NIT1dfQ0ZHX1ZBTFVFX1BST0MtPm5hbWUpOworCX0KKworCXJldHVybiBTdGF0dXM7Cit9CisKK0lOVAlTaG93X1NTSURfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1ZikKK3sKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCXNwcmludGYocEJ1ZiwgIlx0JXMiLCBwQWQtPkNvbW1vbkNmZy5Tc2lkKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwlyZXR1cm4gMDsKK30KKworSU5UCVNob3dfV2lyZWxlc3NNb2RlX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpCit7CisJc3dpdGNoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUpCisJeworCQljYXNlIFBIWV8xMUJHX01JWEVEOgorCQkJc3ByaW50ZihwQnVmLCAiXHQxMUIvRyIpOworCQkJYnJlYWs7CisJCWNhc2UgUEhZXzExQjoKKwkJCXNwcmludGYocEJ1ZiwgIlx0MTFCIik7CisJCQlicmVhazsKKwkJY2FzZSBQSFlfMTFBOgorCQkJc3ByaW50ZihwQnVmLCAiXHQxMUEiKTsKKwkJCWJyZWFrOworCQljYXNlIFBIWV8xMUFCR19NSVhFRDoKKwkJCXNwcmludGYocEJ1ZiwgIlx0MTFBL0IvRyIpOworCQkJYnJlYWs7CisJCWNhc2UgUEhZXzExRzoKKwkJCXNwcmludGYocEJ1ZiwgIlx0MTFHIik7CisJCQlicmVhazsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJY2FzZSBQSFlfMTFBQkdOX01JWEVEOgorCQkJc3ByaW50ZihwQnVmLCAiXHQxMUEvQi9HL04iKTsKKwkJCWJyZWFrOworCQljYXNlIFBIWV8xMU5fMl80RzoKKwkJCXNwcmludGYocEJ1ZiwgIlx0MTFOIG9ubHkgd2l0aCAyLjRHIik7CisJCQlicmVhazsKKwkJY2FzZSBQSFlfMTFHTl9NSVhFRDoKKwkJCXNwcmludGYocEJ1ZiwgIlx0MTFHL04iKTsKKwkJCWJyZWFrOworCQljYXNlIFBIWV8xMUFOX01JWEVEOgorCQkJc3ByaW50ZihwQnVmLCAiXHQxMUEvTiIpOworCQkJYnJlYWs7CisJCWNhc2UgUEhZXzExQkdOX01JWEVEOgorCQkJc3ByaW50ZihwQnVmLCAiXHQxMUIvRy9OIik7CisJCQlicmVhazsKKwkJY2FzZSBQSFlfMTFBR05fTUlYRUQ6CisJCQlzcHJpbnRmKHBCdWYsICJcdDExQS9HL04iKTsKKwkJCWJyZWFrOworCQljYXNlIFBIWV8xMU5fNUc6CisJCQlzcHJpbnRmKHBCdWYsICJcdDExTiBvbmx5IHdpdGggNUciKTsKKwkJCWJyZWFrOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQlkZWZhdWx0OgorCQkJc3ByaW50ZihwQnVmLCAiXHRVbmtub3cgVmFsdWUoJWQpIiwgcEFkLT5Db21tb25DZmcuUGh5TW9kZSk7CisJCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKKworSU5UCVNob3dfVHhCdXJzdF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKQoreworCXNwcmludGYocEJ1ZiwgIlx0JXMiLCBwQWQtPkNvbW1vbkNmZy5iRW5hYmxlVHhCdXJzdCA/ICJUUlVFIjoiRkFMU0UiKTsKKwlyZXR1cm4gMDsKK30KKworSU5UCVNob3dfVHhQcmVhbWJsZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKQoreworCXN3aXRjaChwQWQtPkNvbW1vbkNmZy5UeFByZWFtYmxlKQorCXsKKwkJY2FzZSBSdDgwMl8xMVByZWFtYmxlU2hvcnQ6CisJCQlzcHJpbnRmKHBCdWYsICJcdFNob3J0Iik7CisJCQlicmVhazsKKwkJY2FzZSBSdDgwMl8xMVByZWFtYmxlTG9uZzoKKwkJCXNwcmludGYocEJ1ZiwgIlx0TG9uZyIpOworCQkJYnJlYWs7CisJCWNhc2UgUnQ4MDJfMTFQcmVhbWJsZUF1dG86CisJCQlzcHJpbnRmKHBCdWYsICJcdEF1dG8iKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJc3ByaW50ZihwQnVmLCAiXHRVbmtub3cgVmFsdWUoJWx1KSIsIHBBZC0+Q29tbW9uQ2ZnLlR4UHJlYW1ibGUpOworCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK0lOVAlTaG93X1R4UG93ZXJfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1ZikKK3sKKwlzcHJpbnRmKHBCdWYsICJcdCVsdSIsIHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlKTsKKwlyZXR1cm4gMDsKK30KKworSU5UCVNob3dfQ2hhbm5lbF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKQoreworCXNwcmludGYocEJ1ZiwgIlx0JWQiLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKTsKKwlyZXR1cm4gMDsKK30KKworSU5UCVNob3dfQkdQcm90ZWN0aW9uX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpCit7CisJc3dpdGNoKHBBZC0+Q29tbW9uQ2ZnLlVzZUJHUHJvdGVjdGlvbikKKwl7CisJCWNhc2UgMTogLy9BbHdheXMgT24KKwkJCXNwcmludGYocEJ1ZiwgIlx0T04iKTsKKwkJCWJyZWFrOworCQljYXNlIDI6IC8vQWx3YXlzIE9GRgorCQkJc3ByaW50ZihwQnVmLCAiXHRPRkYiKTsKKwkJCWJyZWFrOworCQljYXNlIDA6IC8vQVVUTworCQkJc3ByaW50ZihwQnVmLCAiXHRBdXRvIik7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXNwcmludGYocEJ1ZiwgIlx0VW5rbm93IFZhbHVlKCVsdSkiLCBwQWQtPkNvbW1vbkNmZy5Vc2VCR1Byb3RlY3Rpb24pOworCQkJYnJlYWs7CisJfQorCXJldHVybiAwOworfQorCitJTlQJU2hvd19SVFNUaHJlc2hvbGRfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1ZikKK3sKKwlzcHJpbnRmKHBCdWYsICJcdCV1IiwgcEFkLT5Db21tb25DZmcuUnRzVGhyZXNob2xkKTsKKwlyZXR1cm4gMDsKK30KKworSU5UCVNob3dfRnJhZ1RocmVzaG9sZF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKQoreworCXNwcmludGYocEJ1ZiwgIlx0JXUiLCBwQWQtPkNvbW1vbkNmZy5GcmFnbWVudFRocmVzaG9sZCk7CisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKK0lOVAlTaG93X0h0QndfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1ZikKK3sKKwlpZiAocEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXID09IEJXXzQwKQorCXsKKwkJc3ByaW50ZihwQnVmLCAiXHQ0MCBNSHoiKTsKKwl9CisJZWxzZQorCXsKKyAgICAgICAgc3ByaW50ZihwQnVmLCAiXHQyMCBNSHoiKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK0lOVAlTaG93X0h0TWNzX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpCit7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQlzcHJpbnRmKHBCdWYsICJcdCV1IiwgcEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCXJldHVybiAwOworfQorCitJTlQJU2hvd19IdEdpX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpCit7CisJc3dpdGNoKHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5TaG9ydEdJKQorCXsKKwkJY2FzZSBHSV80MDA6CisJCQlzcHJpbnRmKHBCdWYsICJcdEdJXzQwMCIpOworCQkJYnJlYWs7CisJCWNhc2UgR0lfODAwOgorCQkJc3ByaW50ZihwQnVmLCAiXHRHSV84MDAiKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJc3ByaW50ZihwQnVmLCAiXHRVbmtub3cgVmFsdWUoJXUpIiwgcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLlNob3J0R0kpOworCQkJYnJlYWs7CisJfQorCXJldHVybiAwOworfQorCitJTlQJU2hvd19IdE9wTW9kZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKQoreworCXN3aXRjaChwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuSFRNT0RFKQorCXsKKwkJY2FzZSBIVE1PREVfR0Y6CisJCQlzcHJpbnRmKHBCdWYsICJcdEdGIik7CisJCQlicmVhazsKKwkJY2FzZSBIVE1PREVfTU06CisJCQlzcHJpbnRmKHBCdWYsICJcdE1NIik7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXNwcmludGYocEJ1ZiwgIlx0VW5rbm93IFZhbHVlKCV1KSIsIHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5IVE1PREUpOworCQkJYnJlYWs7CisJfQorCXJldHVybiAwOworfQorCitJTlQJU2hvd19IdEV4dGNoYV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKQoreworCXN3aXRjaChwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuRVhUQ0hBKQorCXsKKwkJY2FzZSBFWFRDSEFfQkVMT1c6CisJCQlzcHJpbnRmKHBCdWYsICJcdEJlbG93Iik7CisJCQlicmVhazsKKwkJY2FzZSBFWFRDSEFfQUJPVkU6CisJCQlzcHJpbnRmKHBCdWYsICJcdEFib3ZlIik7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXNwcmludGYocEJ1ZiwgIlx0VW5rbm93IFZhbHVlKCV1KSIsIHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5FWFRDSEEpOworCQkJYnJlYWs7CisJfQorCXJldHVybiAwOworfQorCisKK0lOVAlTaG93X0h0TXBkdURlbnNpdHlfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1ZikKK3sKKwlzcHJpbnRmKHBCdWYsICJcdCV1IiwgcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1wZHVEZW5zaXR5KTsKKwlyZXR1cm4gMDsKK30KKworSU5UCVNob3dfSHRCYVdpblNpemVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1ZikKK3sKKwlzcHJpbnRmKHBCdWYsICJcdCV1IiwgcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlJ4QkFXaW5MaW1pdCk7CisJcmV0dXJuIDA7Cit9CisKK0lOVAlTaG93X0h0UmRnX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpCit7CisJc3ByaW50ZihwQnVmLCAiXHQlcyIsIHBBZC0+Q29tbW9uQ2ZnLmJSZGcgPyAiVFJVRSI6IkZBTFNFIik7CisJcmV0dXJuIDA7Cit9CisKK0lOVAlTaG93X0h0QW1zZHVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1ZikKK3sKKwlzcHJpbnRmKHBCdWYsICJcdCVzIiwgcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkFtc2R1RW5hYmxlID8gIlRSVUUiOiJGQUxTRSIpOworCXJldHVybiAwOworfQorCitJTlQJU2hvd19IdEF1dG9CYV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKQoreworCXNwcmludGYocEJ1ZiwgIlx0JXMiLCBwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQXV0b0JBID8gIlRSVUUiOiJGQUxTRSIpOworCXJldHVybiAwOworfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCitJTlQJU2hvd19Db3VudHJ5UmVnaW9uX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpCit7CisJc3ByaW50ZihwQnVmLCAiXHQlZCIsIHBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb24pOworCXJldHVybiAwOworfQorCitJTlQJU2hvd19Db3VudHJ5UmVnaW9uQUJhbmRfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1ZikKK3sKKwlzcHJpbnRmKHBCdWYsICJcdCVkIiwgcEFkLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbkZvckFCYW5kKTsKKwlyZXR1cm4gMDsKK30KKworSU5UCVNob3dfQ291bnRyeUNvZGVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1ZikKK3sKKwlzcHJpbnRmKHBCdWYsICJcdCVzIiwgcEFkLT5Db21tb25DZmcuQ291bnRyeUNvZGUpOworCXJldHVybiAwOworfQorCisjaWZkZWYgQUdHUkVHQVRJT05fU1VQUE9SVAorSU5UCVNob3dfUGt0QWdncmVnYXRlX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpCit7CisJc3ByaW50ZihwQnVmLCAiXHQlcyIsIHBBZC0+Q29tbW9uQ2ZnLmJBZ2dyZWdhdGlvbkNhcGFibGUgPyAiVFJVRSI6IkZBTFNFIik7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYgLy8gQUdHUkVHQVRJT05fU1VQUE9SVCAvLworCisjaWZkZWYgV01NX1NVUFBPUlQKK0lOVAlTaG93X1dtbUNhcGFibGVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1ZikKK3sKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCXNwcmludGYocEJ1ZiwgIlx0JXMiLCBwQWQtPkNvbW1vbkNmZy5iV21tQ2FwYWJsZSA/ICJUUlVFIjoiRkFMU0UiKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCXJldHVybiAwOworfQorI2VuZGlmIC8vIFdNTV9TVVBQT1JUIC8vCisKK0lOVAlTaG93X0lFRUU4MDIxMUhfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1ZikKK3sKKwlzcHJpbnRmKHBCdWYsICJcdCVzIiwgcEFkLT5Db21tb25DZmcuYklFRUU4MDIxMUggPyAiVFJVRSI6IkZBTFNFIik7CisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKK0lOVAlTaG93X05ldHdvcmtUeXBlX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpCit7CisJc3dpdGNoKHBBZC0+U3RhQ2ZnLkJzc1R5cGUpCisJeworCQljYXNlIEJTU19BREhPQzoKKwkJCXNwcmludGYocEJ1ZiwgIlx0QWRob2MiKTsKKwkJCWJyZWFrOworCQljYXNlIEJTU19JTkZSQToKKwkJCXNwcmludGYocEJ1ZiwgIlx0SW5mcmEiKTsKKwkJCWJyZWFrOworCQljYXNlIEJTU19BTlk6CisJCQlzcHJpbnRmKHBCdWYsICJcdEFueSIpOworCQkJYnJlYWs7CisJCWNhc2UgQlNTX01PTklUT1I6CisJCQlzcHJpbnRmKHBCdWYsICJcdE1vbml0b3IiKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJc3ByaW50ZihwQnVmLCAiXHRVbmtub3cgVmFsdWUoJWQpIiwgcEFkLT5TdGFDZmcuQnNzVHlwZSk7CisJCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKK0lOVAlTaG93X0F1dGhNb2RlX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpCit7CisJTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fTU9ERQlBdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZU9wZW47CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQlBdXRoTW9kZSA9IHBBZC0+U3RhQ2ZnLkF1dGhNb2RlOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJaWYgKChBdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVPcGVuKSAmJgorCQkoQXV0aE1vZGUgPD0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMVBTS1dQQTJQU0spKQorCQlzcHJpbnRmKHBCdWYsICJcdCVzIiwgUlRNUEdldFJhbGlua0F1dGhNb2RlU3RyKEF1dGhNb2RlKSk7CisJZWxzZQorCQlzcHJpbnRmKHBCdWYsICJcdFVua25vdyBWYWx1ZSglZCkiLCBBdXRoTW9kZSk7CisKKwlyZXR1cm4gMDsKK30KKworSU5UCVNob3dfRW5jcnlwVHlwZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKQoreworCU5ESVNfODAyXzExX1dFUF9TVEFUVVMJV2VwU3RhdHVzID0gTmRpczgwMl8xMVdFUERpc2FibGVkOworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJV2VwU3RhdHVzID0gcEFkLT5TdGFDZmcuV2VwU3RhdHVzOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJaWYgKChXZXBTdGF0dXMgPj0gTmRpczgwMl8xMVdFUEVuYWJsZWQpICYmCisJCShXZXBTdGF0dXMgPD0gTmRpczgwMl8xMUVuY3J5cHRpb240S2V5QWJzZW50KSkKKwkJc3ByaW50ZihwQnVmLCAiXHQlcyIsIFJUTVBHZXRSYWxpbmtFbmNyeU1vZGVTdHIoV2VwU3RhdHVzKSk7CisJZWxzZQorCQlzcHJpbnRmKHBCdWYsICJcdFVua25vdyBWYWx1ZSglZCkiLCBXZXBTdGF0dXMpOworCisJcmV0dXJuIDA7Cit9CisKK0lOVAlTaG93X0RlZmF1bHRLZXlJRF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKQoreworCVVDSEFSIERlZmF1bHRLZXlJZCA9IDA7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQlEZWZhdWx0S2V5SWQgPSBwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQ7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlzcHJpbnRmKHBCdWYsICJcdCVkIiwgRGVmYXVsdEtleUlkKTsKKworCXJldHVybiAwOworfQorCitJTlQJU2hvd19XZXBLZXlfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiAgSU5UCQkJCUtleUlkeCwKKwlPVVQJUFVDSEFSCQkJcEJ1ZikKK3sKKwlVQ0hBUiAgIEtleVsxNl0gPSB7MH0sIEtleUxlbmd0aCA9IDA7CisJSU5UCQlpbmRleCA9IEJTUzA7CisKKwlLZXlMZW5ndGggPSBwQWQtPlNoYXJlZEtleVtpbmRleF1bS2V5SWR4XS5LZXlMZW47CisJTmRpc01vdmVNZW1vcnkoS2V5LCBwQWQtPlNoYXJlZEtleVtpbmRleF1bS2V5SWR4XS5LZXksIEtleUxlbmd0aCk7CisKKwkvL2NoZWNrIGtleSBzdHJpbmcgaXMgQVNDSUkgb3Igbm90CisgICAgaWYgKFJUTVBDaGVja1N0clByaW50QWJsZShLZXksIEtleUxlbmd0aCkpCisgICAgICAgIHNwcmludGYocEJ1ZiwgIlx0JXMiLCBLZXkpOworICAgIGVsc2UKKyAgICB7CisgICAgICAgIGludCBpZHg7CisgICAgICAgIHNwcmludGYocEJ1ZiwgIlx0Iik7CisgICAgICAgIGZvciAoaWR4ID0gMDsgaWR4IDwgS2V5TGVuZ3RoOyBpZHgrKykKKyAgICAgICAgICAgIHNwcmludGYocEJ1ZitzdHJsZW4ocEJ1ZiksICIlMDJYIiwgS2V5W2lkeF0pOworICAgIH0KKwlyZXR1cm4gMDsKK30KKworSU5UCVNob3dfS2V5MV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKQoreworCVNob3dfV2VwS2V5X1Byb2MocEFkLCAwLCBwQnVmKTsKKwlyZXR1cm4gMDsKK30KKworSU5UCVNob3dfS2V5Ml9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKQoreworCVNob3dfV2VwS2V5X1Byb2MocEFkLCAxLCBwQnVmKTsKKwlyZXR1cm4gMDsKK30KKworSU5UCVNob3dfS2V5M19Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKQoreworCVNob3dfV2VwS2V5X1Byb2MocEFkLCAyLCBwQnVmKTsKKwlyZXR1cm4gMDsKK30KKworSU5UCVNob3dfS2V5NF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKQoreworCVNob3dfV2VwS2V5X1Byb2MocEFkLCAzLCBwQnVmKTsKKwlyZXR1cm4gMDsKK30KKworSU5UCVNob3dfV1BBUFNLX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpCit7CisJSU5UIAlpZHg7CisJVUNIQVIJUE1LWzMyXSA9IHswfTsKKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJTmRpc01vdmVNZW1vcnkoUE1LLCBwQWQtPlN0YUNmZy5QTUssIDMyKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworICAgIHNwcmludGYocEJ1ZiwgIlx0UE1LID0gIik7CisgICAgZm9yIChpZHggPSAwOyBpZHggPCAzMjsgaWR4KyspCisgICAgICAgIHNwcmludGYocEJ1ZitzdHJsZW4ocEJ1ZiksICIlMDJYIiwgUE1LW2lkeF0pOworCisJcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2NtbV9zYW5pdHkuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2NtbV9zYW5pdHkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMGYwNzBkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vY21tX3Nhbml0eS5jCkBAIC0wLDAgKzEsMTYzMyBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwlNb2R1bGUgTmFtZToKKwlzYW5pdHkuYworCisJQWJzdHJhY3Q6CisKKwlSZXZpc2lvbiBIaXN0b3J5OgorCVdobwkJCVdoZW4JCQlXaGF0CisJLS0tLS0tLS0JLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCUpvaG4gQ2hhbmcgIDIwMDQtMDktMDEgICAgICBhZGQgV01NIHN1cHBvcnQKKyovCisjaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCisKKworZXh0ZXJuIFVDSEFSCUNJU0NPX09VSVtdOworCitleHRlcm4gVUNIQVIJV1BBX09VSVtdOworZXh0ZXJuIFVDSEFSCVJTTl9PVUlbXTsKK2V4dGVybiBVQ0hBUglXTUVfSU5GT19FTEVNW107CitleHRlcm4gVUNIQVIJV01FX1BBUk1fRUxFTVtdOworZXh0ZXJuIFVDSEFSCUNjeDJRb3NJbmZvW107CitleHRlcm4gVUNIQVIJUkFMSU5LX09VSVtdOworZXh0ZXJuIFVDSEFSCUJST0FEQ09NX09VSVtdOworZXh0ZXJuIFVDSEFSICAgIFdQU19PVUlbXTsKKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBNTE1FIG1lc3NhZ2Ugc2FuaXR5IGNoZWNrCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK0JPT0xFQU4gTWxtZUFkZEJBUmVxU2FuaXR5KAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIFZPSUQgKk1zZywKKyAgICBJTiBVTE9ORyBNc2dMZW4sCisgICAgT1VUIFBVQ0hBUiBwQWRkcjIpCit7CisgICAgUE1MTUVfQUREQkFfUkVRX1NUUlVDVCAgIHBJbmZvOworCisgICAgcEluZm8gPSAoTUxNRV9BRERCQV9SRVFfU1RSVUNUICopTXNnOworCisgICAgaWYgKChNc2dMZW4gIT0gc2l6ZW9mKE1MTUVfQUREQkFfUkVRX1NUUlVDVCkpKQorICAgIHsKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTWxtZUFkZEJBUmVxU2FuaXR5IGZhaWwgLSBtZXNzYWdlIGxlbmdodCBub3QgY29ycmVjdC5cbiIpKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIGlmICgocEluZm8tPldjaWQgPj0gTUFYX0xFTl9PRl9NQUNfVEFCTEUpKQorICAgIHsKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTWxtZUFkZEJBUmVxU2FuaXR5IGZhaWwgLSBUaGUgcGVlciBNYWMgaXMgbm90IGFzc29jaWF0ZWQgeWV0LlxuIikpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgaWYgKChwSW5mby0+cEFkZHJbMF0mMHgwMSkgPT0gMHgwMSkKKyAgICB7CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1sbWVBZGRCQVJlcVNhbml0eSBmYWlsIC0gYnJvYWRjYXN0IGFkZHJlc3Mgbm90IHN1cHBvcnQgQkFcbiIpKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIHJldHVybiBUUlVFOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIE1MTUUgbWVzc2FnZSBzYW5pdHkgY2hlY2sKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworQk9PTEVBTiBNbG1lRGVsQkFSZXFTYW5pdHkoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gVk9JRCAqTXNnLAorICAgIElOIFVMT05HIE1zZ0xlbikKK3sKKwlNTE1FX0RFTEJBX1JFUV9TVFJVQ1QgKnBJbmZvOworCXBJbmZvID0gKE1MTUVfREVMQkFfUkVRX1NUUlVDVCAqKU1zZzsKKworICAgIGlmICgoTXNnTGVuICE9IHNpemVvZihNTE1FX0RFTEJBX1JFUV9TVFJVQ1QpKSkKKyAgICB7CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIk1sbWVEZWxCQVJlcVNhbml0eSBmYWlsIC0gbWVzc2FnZSBsZW5naHQgbm90IGNvcnJlY3QuXG4iKSk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHBJbmZvLT5XY2lkID49IE1BWF9MRU5fT0ZfTUFDX1RBQkxFKSkKKyAgICB7CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIk1sbWVEZWxCQVJlcVNhbml0eSBmYWlsIC0gVGhlIHBlZXIgTWFjIGlzIG5vdCBhc3NvY2lhdGVkIHlldC5cbiIpKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIGlmICgocEluZm8tPlRJRCAmIDB4ZjApKQorICAgIHsKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiTWxtZURlbEJBUmVxU2FuaXR5IGZhaWwgLSBUaGUgcGVlciBUSUQgaXMgaW5jb3JyZWN0LlxuIikpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisJaWYgKE5kaXNFcXVhbE1lbW9yeShwQWQtPk1hY1RhYi5Db250ZW50W3BJbmZvLT5XY2lkXS5BZGRyLCBwSW5mby0+QWRkciwgTUFDX0FERFJfTEVOKSA9PSAwKQorICAgIHsKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiTWxtZURlbEJBUmVxU2FuaXR5IGZhaWwgLSB0aGUgcGVlciBhZGRyIGRvc2VuJ3QgZXhpc3QuXG4iKSk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworQk9PTEVBTiBQZWVyQWRkQkFSZXFBY3Rpb25TYW5pdHkoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gVk9JRCAqcE1zZywKKyAgICBJTiBVTE9ORyBNc2dMZW4sCisJT1VUIFBVQ0hBUiBwQWRkcjIpCit7CisJUEZSQU1FXzgwMl8xMSBwRnJhbWUgPSAoUEZSQU1FXzgwMl8xMSlwTXNnOworCVBGUkFNRV9BRERCQV9SRVEgcEFkZEZyYW1lOworCXBBZGRGcmFtZSA9IChQRlJBTUVfQUREQkFfUkVRKShwTXNnKTsKKwlpZiAoTXNnTGVuIDwgKHNpemVvZihGUkFNRV9BRERCQV9SRVEpKSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiUGVlckFkZEJBUmVxQWN0aW9uU2FuaXR5OiBBRERCQSBSZXF1ZXN0IGZyYW1lIGxlbmd0aCBzaXplID0gJWxkIGluY29ycmVjdFxuIiwgTXNnTGVuKSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisJLy8gd2Ugc3VwcG9ydCBpbW1lZGlhdGUgQkEuCisJKihVU0hPUlQgKikoJnBBZGRGcmFtZS0+QmFQYXJtKSA9IGNwdTJsZTE2KCooVVNIT1JUICopKCZwQWRkRnJhbWUtPkJhUGFybSkpOworCXBBZGRGcmFtZS0+VGltZU91dFZhbHVlID0gY3B1MmxlMTYocEFkZEZyYW1lLT5UaW1lT3V0VmFsdWUpOworCXBBZGRGcmFtZS0+QmFTdGFydFNlcS53b3JkID0gY3B1MmxlMTYocEFkZEZyYW1lLT5CYVN0YXJ0U2VxLndvcmQpOworCisJaWYgKHBBZGRGcmFtZS0+QmFQYXJtLkJBUG9saWN5ICE9IElNTUVEX0JBKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJQZWVyQWRkQkFSZXFBY3Rpb25TYW5pdHk6IEFEREJBIFJlcXVlc3QgQmEgUG9saWN5WyVkXSBub3Qgc3VwcG9ydFxuIiwgcEFkZEZyYW1lLT5CYVBhcm0uQkFQb2xpY3kpKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJBRERCQSBSZXF1ZXN0LiB0aWQ9JXgsIEJ1ZnNpemU9JXgsIEFNU0RVU3VwcG9ydGVkPSV4IFxuIiwgcEFkZEZyYW1lLT5CYVBhcm0uVElELCBwQWRkRnJhbWUtPkJhUGFybS5CdWZTaXplLCBwQWRkRnJhbWUtPkJhUGFybS5BTVNEVVN1cHBvcnRlZCkpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJLy8gd2Ugc3VwcG9ydCBpbW1lZGlhdGUgQkEuCisJaWYgKHBBZGRGcmFtZS0+QmFQYXJtLlRJRCAmMHhmZmYwKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJQZWVyQWRkQkFSZXFBY3Rpb25TYW5pdHk6IEFEREJBIFJlcXVlc3QgaW5jb3JyZWN0IFRJRCA9ICVkXG4iLCBwQWRkRnJhbWUtPkJhUGFybS5USUQpKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKwlDT1BZX01BQ19BRERSKHBBZGRyMiwgcEZyYW1lLT5IZHIuQWRkcjIpOworCXJldHVybiBUUlVFOworfQorCitCT09MRUFOIFBlZXJBZGRCQVJzcEFjdGlvblNhbml0eSgKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBWT0lEICpwTXNnLAorICAgIElOIFVMT05HIE1zZ0xlbikKK3sKKwlQRlJBTUVfQUREQkFfUlNQIHBBZGRGcmFtZTsKKworCXBBZGRGcmFtZSA9IChQRlJBTUVfQUREQkFfUlNQKShwTXNnKTsKKwlpZiAoTXNnTGVuIDwgKHNpemVvZihGUkFNRV9BRERCQV9SU1ApKSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiUGVlckFkZEJBUnNwQWN0aW9uU2FuaXR5OiBBRERCQSBSZXNwb25zZSBmcmFtZSBsZW5ndGggc2l6ZSA9ICVsZCBpbmNvcnJlY3RcbiIsIE1zZ0xlbikpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCS8vIHdlIHN1cHBvcnQgaW1tZWRpYXRlIEJBLgorCSooVVNIT1JUICopKCZwQWRkRnJhbWUtPkJhUGFybSkgPSBjcHUybGUxNigqKFVTSE9SVCAqKSgmcEFkZEZyYW1lLT5CYVBhcm0pKTsKKwlwQWRkRnJhbWUtPlN0YXR1c0NvZGUgPSBjcHUybGUxNihwQWRkRnJhbWUtPlN0YXR1c0NvZGUpOworCXBBZGRGcmFtZS0+VGltZU91dFZhbHVlID0gY3B1MmxlMTYocEFkZEZyYW1lLT5UaW1lT3V0VmFsdWUpOworCisJaWYgKHBBZGRGcmFtZS0+QmFQYXJtLkJBUG9saWN5ICE9IElNTUVEX0JBKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJQZWVyQWRkQkFSZXFBY3Rpb25TYW5pdHk6IEFEREJBIFJlc3BvbnNlIEJhIFBvbGljeVslZF0gbm90IHN1cHBvcnRcbiIsIHBBZGRGcmFtZS0+QmFQYXJtLkJBUG9saWN5KSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwkvLyB3ZSBzdXBwb3J0IGltbWVkaWF0ZSBCQS4KKwlpZiAocEFkZEZyYW1lLT5CYVBhcm0uVElEICYweGZmZjApCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIlBlZXJBZGRCQVJzcEFjdGlvblNhbml0eTogQUREQkEgUmVzcG9uc2UgaW5jb3JyZWN0IFRJRCA9ICVkXG4iLCBwQWRkRnJhbWUtPkJhUGFybS5USUQpKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKwlyZXR1cm4gVFJVRTsKKworfQorCitCT09MRUFOIFBlZXJEZWxCQUFjdGlvblNhbml0eSgKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBVQ0hBUiBXY2lkLAorICAgIElOIFZPSUQgKnBNc2csCisgICAgSU4gVUxPTkcgTXNnTGVuICkKK3sKKwkvL1BGUkFNRV84MDJfMTEgcEZyYW1lID0gKFBGUkFNRV84MDJfMTEpcE1zZzsKKwlQRlJBTUVfREVMQkFfUkVRICBwRGVsRnJhbWU7CisJaWYgKE1zZ0xlbiAhPSAoc2l6ZW9mKEZSQU1FX0RFTEJBX1JFUSkpKQorCQlyZXR1cm4gRkFMU0U7CisKKwlpZiAoV2NpZCA+PSBNQVhfTEVOX09GX01BQ19UQUJMRSkKKwkJcmV0dXJuIEZBTFNFOworCisJcERlbEZyYW1lID0gKFBGUkFNRV9ERUxCQV9SRVEpKHBNc2cpOworCisJKihVU0hPUlQgKikoJnBEZWxGcmFtZS0+RGVsYmFQYXJtKSA9IGNwdTJsZTE2KCooVVNIT1JUICopKCZwRGVsRnJhbWUtPkRlbGJhUGFybSkpOworCXBEZWxGcmFtZS0+UmVhc29uQ29kZSA9IGNwdTJsZTE2KHBEZWxGcmFtZS0+UmVhc29uQ29kZSk7CisKKwlpZiAocERlbEZyYW1lLT5EZWxiYVBhcm0uVElEICYweGZmZjApCisJCXJldHVybiBGQUxTRTsKKworCXJldHVybiBUUlVFOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIE1MTUUgbWVzc2FnZSBzYW5pdHkgY2hlY2sKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworQk9PTEVBTiBQZWVyQmVhY29uQW5kUHJvYmVSc3BTYW5pdHkoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gVk9JRCAqTXNnLAorICAgIElOIFVMT05HIE1zZ0xlbiwKKyAgICBJTiBVQ0hBUiAgTXNnQ2hhbm5lbCwKKyAgICBPVVQgUFVDSEFSIHBBZGRyMiwKKyAgICBPVVQgUFVDSEFSIHBCc3NpZCwKKyAgICBPVVQgQ0hBUiBTc2lkW10sCisgICAgT1VUIFVDSEFSICpwU3NpZExlbiwKKyAgICBPVVQgVUNIQVIgKnBCc3NUeXBlLAorICAgIE9VVCBVU0hPUlQgKnBCZWFjb25QZXJpb2QsCisgICAgT1VUIFVDSEFSICpwQ2hhbm5lbCwKKyAgICBPVVQgVUNIQVIgKnBOZXdDaGFubmVsLAorICAgIE9VVCBMQVJHRV9JTlRFR0VSICpwVGltZXN0YW1wLAorICAgIE9VVCBDRl9QQVJNICpwQ2ZQYXJtLAorICAgIE9VVCBVU0hPUlQgKnBBdGltV2luLAorICAgIE9VVCBVU0hPUlQgKnBDYXBhYmlsaXR5SW5mbywKKyAgICBPVVQgVUNIQVIgKnBFcnAsCisgICAgT1VUIFVDSEFSICpwRHRpbUNvdW50LAorICAgIE9VVCBVQ0hBUiAqcER0aW1QZXJpb2QsCisgICAgT1VUIFVDSEFSICpwQmNhc3RGbGFnLAorICAgIE9VVCBVQ0hBUiAqcE1lc3NhZ2VUb01lLAorICAgIE9VVCBVQ0hBUiBTdXBSYXRlW10sCisgICAgT1VUIFVDSEFSICpwU3VwUmF0ZUxlbiwKKyAgICBPVVQgVUNIQVIgRXh0UmF0ZVtdLAorICAgIE9VVCBVQ0hBUiAqcEV4dFJhdGVMZW4sCisgICAgT1VUCVVDSEFSICpwQ2tpcEZsYWcsCisgICAgT1VUCVVDSEFSICpwQWlyb25ldENlbGxQb3dlckxpbWl0LAorICAgIE9VVCBQRURDQV9QQVJNICAgICAgIHBFZGNhUGFybSwKKyAgICBPVVQgUFFCU1NfTE9BRF9QQVJNICBwUWJzc0xvYWQsCisgICAgT1VUIFBRT1NfQ0FQQUJJTElUWV9QQVJNIHBRb3NDYXBhYmlsaXR5LAorICAgIE9VVCBVTE9ORyAqcFJhbGlua0llLAorICAgIE9VVCBVQ0hBUgkJICpwSHRDYXBhYmlsaXR5TGVuLAorI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorICAgIE9VVCBVQ0hBUgkJICpwUHJlTkh0Q2FwYWJpbGl0eUxlbiwKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKyAgICBPVVQgSFRfQ0FQQUJJTElUWV9JRSAqcEh0Q2FwYWJpbGl0eSwKKwlPVVQgVUNIQVIJCSAqQWRkSHRJbmZvTGVuLAorCU9VVCBBRERfSFRfSU5GT19JRSAqQWRkSHRJbmZvLAorCU9VVCBVQ0hBUiAqTmV3RXh0Q2hhbm5lbE9mZnNldCwJCS8vIEh0IGV4dGVuc2lvbiBjaGFubmVsIG9mZnNldChhYm92ZSBvciBiZWxvdykKKyAgICBPVVQgVVNIT1JUICpMZW5ndGhWSUUsCisgICAgT1VUCVBORElTXzgwMl8xMV9WQVJJQUJMRV9JRXMgcFZJRSkKK3sKKyAgICBDSEFSCQkJCSpQdHI7CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJQ0hBUiAJCQkJVGltTGVuOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworICAgIFBGUkFNRV84MDJfMTEJCXBGcmFtZTsKKyAgICBQRUlEX1NUUlVDVCAgICAgICAgIHBFaWQ7CisgICAgVUNIQVIJCQkJU3ViVHlwZTsKKyAgICBVQ0hBUgkJCQlTYW5pdHk7CisgICAgLy9VQ0hBUgkJCQlFQ1dNaW4sIEVDV01heDsKKyAgICAvL01BQ19DU1I5X1NUUlVDCQlDc3I5OworICAgIFVMT05HCQkJCUxlbmd0aCA9IDA7CisKKwkvLyBGb3Igc29tZSAxMWEgQVAgd2hpY2ggZGlkbid0IGhhdmUgRFNfSUUsIHdlIHVzZSB0d28gY29uZGl0aW9ucyB0byBkZWNpZGUgdGhlIGNoYW5uZWwKKwkvLwkxLiBJZiB0aGUgQVAgaXMgMTFuIGVuYWJsZWQsIHRoZW4gY2hlY2sgdGhlIGNvbnRyb2wgY2hhbm5lbC4KKwkvLwkyLiBJZiB0aGUgQVAgZGlkbid0IGhhdmUgYW55IGluZm8gYWJvdXQgY2hhbm5lbCwgdXNlIHRoZSBjaGFubmVsIHdlIHJlY2VpdmVkIHRoaXMgZnJhbWUgYXMgdGhlIGNoYW5uZWwuIChNYXkgaW5hY2N1cmFjeSEhKQorCVVDSEFSCQkJQ3RybENoYW5uZWwgPSAwOworCisgICAgLy8gQWRkIGZvciAzIG5lY2Vzc2FyeSBFSUQgZmllbGQgY2hlY2sKKyAgICBTYW5pdHkgPSAwOworCisgICAgKnBBdGltV2luID0gMDsKKyAgICAqcEVycCA9IDA7CisgICAgKnBEdGltQ291bnQgPSAwOworICAgICpwRHRpbVBlcmlvZCA9IDA7CisgICAgKnBCY2FzdEZsYWcgPSAwOworICAgICpwTWVzc2FnZVRvTWUgPSAwOworICAgICpwRXh0UmF0ZUxlbiA9IDA7CisgICAgKnBDa2lwRmxhZyA9IDA7CQkJICAgICAgICAvLyBEZWZhdWx0IG9mIENraXBGbGFnIGlzIDAKKyAgICAqcEFpcm9uZXRDZWxsUG93ZXJMaW1pdCA9IDB4RkY7ICAvLyBEZWZhdWx0IG9mIEFpcm9uZXRDZWxsUG93ZXJMaW1pdCBpcyAweEZGCisgICAgKkxlbmd0aFZJRSA9IDA7CQkJCQkvLyBTZXQgdGhlIGxlbmd0aCBvZiBWSUUgdG8gaW5pdCB2YWx1ZSAwCisgICAgKnBIdENhcGFiaWxpdHlMZW4gPSAwOwkJCQkJLy8gU2V0IHRoZSBsZW5ndGggb2YgVklFIHRvIGluaXQgdmFsdWUgMAorI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCWlmIChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKQorCQkqcFByZU5IdENhcGFiaWxpdHlMZW4gPSAwOwkJCQkJLy8gU2V0IHRoZSBsZW5ndGggb2YgVklFIHRvIGluaXQgdmFsdWUgMAorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworICAgICpBZGRIdEluZm9MZW4gPSAwOwkJCQkJLy8gU2V0IHRoZSBsZW5ndGggb2YgVklFIHRvIGluaXQgdmFsdWUgMAorICAgICpwUmFsaW5rSWUgPSAwOworICAgICpwTmV3Q2hhbm5lbCA9IDA7CisgICAgKk5ld0V4dENoYW5uZWxPZmZzZXQgPSAweGZmOwkvL0RlZmF1bHQgMHhmZiBtZWFucyBubyBzdWNoIElFCisgICAgcENmUGFybS0+YlZhbGlkID0gRkFMU0U7ICAgICAgICAvLyBkZWZhdWx0OiBubyBJRV9DRiBmb3VuZAorICAgIHBRYnNzTG9hZC0+YlZhbGlkID0gRkFMU0U7ICAgICAgLy8gZGVmYXVsdDogbm8gSUVfUUJTU19MT0FEIGZvdW5kCisgICAgcEVkY2FQYXJtLT5iVmFsaWQgPSBGQUxTRTsgICAgICAvLyBkZWZhdWx0OiBubyBJRV9FRENBX1BBUkFNRVRFUiBmb3VuZAorICAgIHBRb3NDYXBhYmlsaXR5LT5iVmFsaWQgPSBGQUxTRTsgLy8gZGVmYXVsdDogbm8gSUVfUU9TX0NBUEFCSUxJVFkgZm91bmQKKworICAgIHBGcmFtZSA9IChQRlJBTUVfODAyXzExKU1zZzsKKworICAgIC8vIGdldCBzdWJ0eXBlIGZyb20gaGVhZGVyCisgICAgU3ViVHlwZSA9IChVQ0hBUilwRnJhbWUtPkhkci5GQy5TdWJUeXBlOworCisgICAgLy8gZ2V0IEFkZHIyIGFuZCBCU1NJRCBmcm9tIGhlYWRlcgorICAgIENPUFlfTUFDX0FERFIocEFkZHIyLCBwRnJhbWUtPkhkci5BZGRyMik7CisgICAgQ09QWV9NQUNfQUREUihwQnNzaWQsIHBGcmFtZS0+SGRyLkFkZHIzKTsKKworICAgIFB0ciA9IHBGcmFtZS0+T2N0ZXQ7CisgICAgTGVuZ3RoICs9IExFTkdUSF84MDJfMTE7CisKKyAgICAvLyBnZXQgdGltZXN0YW1wIGZyb20gcGF5bG9hZCBhbmQgYWR2YW5jZSB0aGUgcG9pbnRlcgorICAgIE5kaXNNb3ZlTWVtb3J5KHBUaW1lc3RhbXAsIFB0ciwgVElNRVNUQU1QX0xFTik7CisKKwlwVGltZXN0YW1wLT51Lkxvd1BhcnQgPSBjcHUybGUzMihwVGltZXN0YW1wLT51Lkxvd1BhcnQpOworCXBUaW1lc3RhbXAtPnUuSGlnaFBhcnQgPSBjcHUybGUzMihwVGltZXN0YW1wLT51LkhpZ2hQYXJ0KTsKKworICAgIFB0ciArPSBUSU1FU1RBTVBfTEVOOworICAgIExlbmd0aCArPSBUSU1FU1RBTVBfTEVOOworCisgICAgLy8gZ2V0IGJlYWNvbiBpbnRlcnZhbCBmcm9tIHBheWxvYWQgYW5kIGFkdmFuY2UgdGhlIHBvaW50ZXIKKyAgICBOZGlzTW92ZU1lbW9yeShwQmVhY29uUGVyaW9kLCBQdHIsIDIpOworICAgIFB0ciArPSAyOworICAgIExlbmd0aCArPSAyOworCisgICAgLy8gZ2V0IGNhcGFiaWxpdHkgaW5mbyBmcm9tIHBheWxvYWQgYW5kIGFkdmFuY2UgdGhlIHBvaW50ZXIKKyAgICBOZGlzTW92ZU1lbW9yeShwQ2FwYWJpbGl0eUluZm8sIFB0ciwgMik7CisgICAgUHRyICs9IDI7CisgICAgTGVuZ3RoICs9IDI7CisKKyAgICBpZiAoQ0FQX0lTX0VTU19PTigqcENhcGFiaWxpdHlJbmZvKSkKKyAgICAgICAgKnBCc3NUeXBlID0gQlNTX0lORlJBOworICAgIGVsc2UKKyAgICAgICAgKnBCc3NUeXBlID0gQlNTX0FESE9DOworCisgICAgcEVpZCA9IChQRUlEX1NUUlVDVCkgUHRyOworCisgICAgLy8gZ2V0IHZhcmlhYmxlIGZpZWxkcyBmcm9tIHBheWxvYWQgYW5kIGFkdmFuY2UgdGhlIHBvaW50ZXIKKyAgICB3aGlsZSAoKExlbmd0aCArIDIgKyBwRWlkLT5MZW4pIDw9IE1zZ0xlbikKKyAgICB7CisgICAgICAgIC8vCisgICAgICAgIC8vIFNlY3VyZSBjb3B5IFZJRSB0byBWYXJJRVtNQVhfVklFX0xFTl0gZGlkbid0IG92ZXJmbG93LgorICAgICAgICAvLworICAgICAgICBpZiAoKCpMZW5ndGhWSUUgKyBwRWlkLT5MZW4gKyAyKSA+PSBNQVhfVklFX0xFTikKKyAgICAgICAgeworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfV0FSTiwgKCJQZWVyQmVhY29uQW5kUHJvYmVSc3BTYW5pdHkgLSBWYXJpYWJsZSBJRXMgb3V0IG9mIHJlc291cmNlIFtsZW4oPSVkKSA+IE1BWF9WSUVfTEVOKD0lZCldXG4iLAorICAgICAgICAgICAgICAgICAgICAoKkxlbmd0aFZJRSArIHBFaWQtPkxlbiArIDIpLCBNQVhfVklFX0xFTikpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBzd2l0Y2gocEVpZC0+RWlkKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIElFX1NTSUQ6CisgICAgICAgICAgICAgICAgLy8gQWxyZWFkeSBoYXMgb25lIFNTSUQgRUlEIGluIHRoaXMgYmVhY29uLCBpZ25vcmUgdGhlIHNlY29uZCBvbmUKKyAgICAgICAgICAgICAgICBpZiAoU2FuaXR5ICYgMHgxKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBpZihwRWlkLT5MZW4gPD0gTUFYX0xFTl9PRl9TU0lEKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkoU3NpZCwgcEVpZC0+T2N0ZXQsIHBFaWQtPkxlbik7CisgICAgICAgICAgICAgICAgICAgICpwU3NpZExlbiA9IHBFaWQtPkxlbjsKKyAgICAgICAgICAgICAgICAgICAgU2FuaXR5IHw9IDB4MTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGVlckJlYWNvbkFuZFByb2JlUnNwU2FuaXR5IC0gd3JvbmcgSUVfU1NJRCAobGVuPSVkKVxuIixwRWlkLT5MZW4pKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBJRV9TVVBQX1JBVEVTOgorICAgICAgICAgICAgICAgIGlmKHBFaWQtPkxlbiA8PSBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFNhbml0eSB8PSAweDI7CisgICAgICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KFN1cFJhdGUsIHBFaWQtPk9jdGV0LCBwRWlkLT5MZW4pOworICAgICAgICAgICAgICAgICAgICAqcFN1cFJhdGVMZW4gPSBwRWlkLT5MZW47CisKKyAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogMjAwNC0wOS0xNCBub3QgYSBnb29kIGRlc2lnbiBoZXJlLCBjYXVzZSBpdCBleGNsdWRlIGV4dHJhIHJhdGVzCisgICAgICAgICAgICAgICAgICAgIC8vIGZyb20gU2NhblRhYi4gV2Ugc2hvdWxkIHJlcG9ydCBhcyBpcy4gQW5kIGZpbHRlciBvdXQgdW5zdXBwb3J0ZWQKKyAgICAgICAgICAgICAgICAgICAgLy8gcmF0ZXMgaW4gTWxtZUF1eC4KKyAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgYWdhaW5zdCB0aGUgc3VwcG9ydGVkIHJhdGVzCisgICAgICAgICAgICAgICAgICAgIC8vIFJUTVBDaGVja1JhdGVzKHBBZCwgU3VwUmF0ZSwgcFN1cFJhdGVMZW4pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyQmVhY29uQW5kUHJvYmVSc3BTYW5pdHkgLSB3cm9uZyBJRV9TVVBQX1JBVEVTIChsZW49JWQpXG4iLHBFaWQtPkxlbikpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIElFX0hUX0NBUDoKKwkJCWlmIChwRWlkLT5MZW4gPj0gU0laRV9IVF9DQVBfSUUpICAvL05vdGU6IGFsbG93IGV4dGVuc2lvbi4hIQorCQkJeworCQkJCU5kaXNNb3ZlTWVtb3J5KHBIdENhcGFiaWxpdHksIHBFaWQtPk9jdGV0LCBzaXplb2YoSFRfQ0FQQUJJTElUWV9JRSkpOworCQkJCSpwSHRDYXBhYmlsaXR5TGVuID0gU0laRV9IVF9DQVBfSUU7CS8vIE5ub3cgd2Ugb25seSBzdXBwb3J0IDI2IGJ5dGVzLgorCisJCQkJKihVU0hPUlQgKikoJnBIdENhcGFiaWxpdHktPkh0Q2FwSW5mbykgPSBjcHUybGUxNigqKFVTSE9SVCAqKSgmcEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvKSk7CisJCQkJKihVU0hPUlQgKikoJnBIdENhcGFiaWxpdHktPkV4dEh0Q2FwSW5mbykgPSBjcHUybGUxNigqKFVTSE9SVCAqKSgmcEh0Q2FwYWJpbGl0eS0+RXh0SHRDYXBJbmZvKSk7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQkJCXsKKwkJCQkJKnBQcmVOSHRDYXBhYmlsaXR5TGVuID0gMDsJLy8gTm5vdyB3ZSBvbmx5IHN1cHBvcnQgMjYgYnl0ZXMuCisKKwkJCQkJUHRyID0gKFBVQ0hBUikgcFZJRTsKKwkJCQkJTmRpc01vdmVNZW1vcnkoUHRyICsgKkxlbmd0aFZJRSwgJnBFaWQtPkVpZCwgcEVpZC0+TGVuICsgMik7CisJCQkJCSpMZW5ndGhWSUUgKz0gKHBFaWQtPkxlbiArIDIpOworCQkJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19XQVJOLCAoIlBlZXJCZWFjb25BbmRQcm9iZVJzcFNhbml0eSAtIHdyb25nIElFX0hUX0NBUC4gcEVpZC0+TGVuID0gJWRcbiIsIHBFaWQtPkxlbikpOworCQkJfQorCisJCWJyZWFrOworICAgICAgICAgICAgY2FzZSBJRV9BRERfSFQ6CisJCQlpZiAocEVpZC0+TGVuID49IHNpemVvZihBRERfSFRfSU5GT19JRSkpCisJCQl7CisJCQkJLy8gVGhpcyBJRSBhbGxvd3MgZXh0ZW5zaW9uLCBidXQgd2UgY2FuIGlnbm9yZSBleHRyYSBieXRlcyBiZXlvbmQgb3VyIGtub3dsZWRnZSAsIHNvIG9ubHkKKwkJCQkvLyBjb3B5IGZpcnN0IHNpemVvZihBRERfSFRfSU5GT19JRSkKKwkJCQlOZGlzTW92ZU1lbW9yeShBZGRIdEluZm8sIHBFaWQtPk9jdGV0LCBzaXplb2YoQUREX0hUX0lORk9fSUUpKTsKKwkJCQkqQWRkSHRJbmZvTGVuID0gU0laRV9BRERfSFRfSU5GT19JRTsKKworCQkJCUN0cmxDaGFubmVsID0gQWRkSHRJbmZvLT5Db250cm9sQ2hhbjsKKworCQkJCSooVVNIT1JUICopKCZBZGRIdEluZm8tPkFkZEh0SW5mbzIpID0gY3B1MmxlMTYoKihVU0hPUlQgKikoJkFkZEh0SW5mby0+QWRkSHRJbmZvMikpOworCQkJCSooVVNIT1JUICopKCZBZGRIdEluZm8tPkFkZEh0SW5mbzMpID0gY3B1MmxlMTYoKihVU0hPUlQgKikoJkFkZEh0SW5mby0+QWRkSHRJbmZvMykpOworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJCQl7CisJCQkgICAgICAgICAgICAgICAgUHRyID0gKFBVQ0hBUikgcFZJRTsKKwkJCSAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShQdHIgKyAqTGVuZ3RoVklFLCAmcEVpZC0+RWlkLCBwRWlkLT5MZW4gKyAyKTsKKwkJCSAgICAgICAgICAgICAgICAqTGVuZ3RoVklFICs9IChwRWlkLT5MZW4gKyAyKTsKKwkJCQl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfV0FSTiwgKCJQZWVyQmVhY29uQW5kUHJvYmVSc3BTYW5pdHkgLSB3cm9uZyBJRV9BRERfSFQuIFxuIikpOworCQkJfQorCisJCWJyZWFrOworICAgICAgICAgICAgY2FzZSBJRV9TRUNPTkRBUllfQ0hfT0ZGU0VUOgorCQkJaWYgKHBFaWQtPkxlbiA9PSAxKQorCQkJeworCQkJCSpOZXdFeHRDaGFubmVsT2Zmc2V0ID0gcEVpZC0+T2N0ZXRbMF07CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfV0FSTiwgKCJQZWVyQmVhY29uQW5kUHJvYmVSc3BTYW5pdHkgLSB3cm9uZyBJRV9TRUNPTkRBUllfQ0hfT0ZGU0VULiBcbiIpKTsKKwkJCX0KKworCQlicmVhazsKKyAgICAgICAgICAgIGNhc2UgSUVfRkhfUEFSTToKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyQmVhY29uQW5kUHJvYmVSc3BTYW5pdHkoSUVfRkhfUEFSTSkgXG4iKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgSUVfRFNfUEFSTToKKyAgICAgICAgICAgICAgICBpZihwRWlkLT5MZW4gPT0gMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICpwQ2hhbm5lbCA9ICpwRWlkLT5PY3RldDsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJCQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJCQkJeworCQkJCQkJaWYgKENoYW5uZWxTYW5pdHkocEFkLCAqcENoYW5uZWwpID09IDApCisJCQkJCQl7CisKKwkJCQkJCQlyZXR1cm4gRkFMU0U7CisJCQkJCQl9CisJCQkJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKyAgICAgICAgICAgICAgICAgICAgU2FuaXR5IHw9IDB4NDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGVlckJlYWNvbkFuZFByb2JlUnNwU2FuaXR5IC0gd3JvbmcgSUVfRFNfUEFSTSAobGVuPSVkKVxuIixwRWlkLT5MZW4pKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBJRV9DRl9QQVJNOgorICAgICAgICAgICAgICAgIGlmKHBFaWQtPkxlbiA9PSA2KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcENmUGFybS0+YlZhbGlkID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgcENmUGFybS0+Q2ZwQ291bnQgPSBwRWlkLT5PY3RldFswXTsKKyAgICAgICAgICAgICAgICAgICAgcENmUGFybS0+Q2ZwUGVyaW9kID0gcEVpZC0+T2N0ZXRbMV07CisgICAgICAgICAgICAgICAgICAgIHBDZlBhcm0tPkNmcE1heER1cmF0aW9uID0gcEVpZC0+T2N0ZXRbMl0gKyAyNTYgKiBwRWlkLT5PY3RldFszXTsKKyAgICAgICAgICAgICAgICAgICAgcENmUGFybS0+Q2ZwRHVyUmVtYWluaW5nID0gcEVpZC0+T2N0ZXRbNF0gKyAyNTYgKiBwRWlkLT5PY3RldFs1XTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGVlckJlYWNvbkFuZFByb2JlUnNwU2FuaXR5IC0gd3JvbmcgSUVfQ0ZfUEFSTVxuIikpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIElFX0lCU1NfUEFSTToKKyAgICAgICAgICAgICAgICBpZihwRWlkLT5MZW4gPT0gMikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBdGltV2luLCBwRWlkLT5PY3RldCwgcEVpZC0+TGVuKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGVlckJlYWNvbkFuZFByb2JlUnNwU2FuaXR5IC0gd3JvbmcgSUVfSUJTU19QQVJNXG4iKSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKyAgICAgICAgICAgIGNhc2UgSUVfVElNOgorICAgICAgICAgICAgICAgIGlmKElORlJBX09OKHBBZCkgJiYgU3ViVHlwZSA9PSBTVUJUWVBFX0JFQUNPTikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEdldFRpbUJpdCgoUFVDSEFSKXBFaWQsIHBBZC0+U3RhQWN0aXZlLkFpZCwgJlRpbUxlbiwgcEJjYXN0RmxhZywgcER0aW1Db3VudCwgcER0aW1QZXJpb2QsIHBNZXNzYWdlVG9NZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworICAgICAgICAgICAgY2FzZSBJRV9DSEFOTkVMX1NXSVRDSF9BTk5PVU5DRU1FTlQ6CisgICAgICAgICAgICAgICAgaWYocEVpZC0+TGVuID09IDMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIAkqcE5ld0NoYW5uZWwgPSBwRWlkLT5PY3RldFsxXTsJLy9leHRyYWN0IG5ldyBjaGFubmVsIG51bWJlcgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgLy8gTmV3IGZvciBXUEEKKyAgICAgICAgICAgIC8vIENDWCB2MiBoYXMgdGhlIHNhbWUgSUUsIHdlIG5lZWQgdG8gcGFyc2UgdGhhdCB0b28KKyAgICAgICAgICAgIC8vIFdpZmkgV01NIHVzZSB0aGUgc2FtZSBJRSB2YWxlLCBuZWVkIHRvIHBhcnNlIHRoYXQgdG9vCisgICAgICAgICAgICAvLyBjYXNlIElFX1dQQToKKyAgICAgICAgICAgIGNhc2UgSUVfVkVORE9SX1NQRUNJRklDOgorICAgICAgICAgICAgICAgIC8vIENoZWNrIHRoZSBPVUkgdmVyc2lvbiwgZmlsdGVyIG91dCBub24tc3RhbmRhcmQgdXNhZ2UKKyAgICAgICAgICAgICAgICBpZiAoTmRpc0VxdWFsTWVtb3J5KHBFaWQtPk9jdGV0LCBSQUxJTktfT1VJLCAzKSAmJiAocEVpZC0+TGVuID09IDcpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8qcFJhbGlua0llID0gcEVpZC0+T2N0ZXRbM107CisgICAgICAgICAgICAgICAgICAgIGlmIChwRWlkLT5PY3RldFszXSAhPSAwKQorICAgICAgICAJCQkJKnBSYWxpbmtJZSA9IHBFaWQtPk9jdGV0WzNdOworICAgICAgICAJCQllbHNlCisgICAgICAgIAkJCQkqcFJhbGlua0llID0gMHhmMDAwMDAwMDsgLy8gU2V0IHRvIG5vbi16ZXJvIHZhbHVlIChjYW4ndCBzZXQgYml0MC0yKSB0byByZXByZXNlbnQgdGhpcyBpcyBSYWxpbmsgQ2hpcC4gU28gYXQgbGlua3VwLCB3ZSB3aWxsIHNldCByYWxpbmtjaGlwIGZsYWcuCisgICAgICAgICAgICAgICAgfQorI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkvLyBUaGlzIEhUIElFIGlzIGJlZm9yZSBJRUVFIGRyYWZ0IHNldCBIVCBJRSB2YWx1ZS4yMDA2LTA5LTI4IGJ5IEphbi4KKworICAgICAgICAgICAgICAgIC8vIE90aGVyIHZlbmRvcnMgaGFkIHByb2R1Y3Rpb24gYmVmb3JlIElFX0hUX0NBUCB2YWx1ZSBpcyBhc3NpZ25lZC4gVG8gYmFja3dhcmQgc3VwcG9ydCB0aG9zZSBvbGQtZmlybXdhcmUgQVAsCisgICAgICAgICAgICAgICAgLy8gQ2hlY2sgYnJvYWRjb20tZGVmaWVuZCBwcmUtODAyLjExbkQxLjAgT1VJIGZvciBIVCByZWxhdGVkIElFLCBpbmNsdWRpbmcgSFQgQ2FwYXRpbGl0aWVzIElFIGFuZCBIVCBJbmZvcm1hdGlvbiBJRQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKCgqcEh0Q2FwYWJpbGl0eUxlbiA9PSAwKSAmJiBOZGlzRXF1YWxNZW1vcnkocEVpZC0+T2N0ZXQsIFBSRV9OX0hUX09VSSwgMykgJiYgKHBFaWQtPkxlbiA+PSA0KSAmJiAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoKHBFaWQtPk9jdGV0WzNdID09IE9VSV9QUkVOX0hUX0NBUCkgJiYgKHBFaWQtPkxlbiA+PSAzMCkgJiYgKCpwSHRDYXBhYmlsaXR5TGVuID09IDApKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwSHRDYXBhYmlsaXR5LCAmcEVpZC0+T2N0ZXRbNF0sIHNpemVvZihIVF9DQVBBQklMSVRZX0lFKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAqcFByZU5IdENhcGFiaWxpdHlMZW4gPSBTSVpFX0hUX0NBUF9JRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmICgocEVpZC0+T2N0ZXRbM10gPT0gT1VJX1BSRU5fQUREX0hUKSAmJiAocEVpZC0+TGVuID49IDI2KSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkoQWRkSHRJbmZvLCAmcEVpZC0+T2N0ZXRbNF0sIHNpemVvZihBRERfSFRfSU5GT19JRSkpOworICAgICAgICAgICAgICAgICAgICAgICAgKkFkZEh0SW5mb0xlbiA9IFNJWkVfQUREX0hUX0lORk9fSUU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisgICAgICAgICAgICAgICAgZWxzZSBpZiAoTmRpc0VxdWFsTWVtb3J5KHBFaWQtPk9jdGV0LCBXUEFfT1VJLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIENvcHkgdG8gcFZJRSB3aGljaCB3aWxsIHJlcG9ydCB0byBtaWNyb3NvZnQgYnNzaWQgbGlzdC4KKyAgICAgICAgICAgICAgICAgICAgUHRyID0gKFBVQ0hBUikgcFZJRTsKKyAgICAgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkoUHRyICsgKkxlbmd0aFZJRSwgJnBFaWQtPkVpZCwgcEVpZC0+TGVuICsgMik7CisgICAgICAgICAgICAgICAgICAgICpMZW5ndGhWSUUgKz0gKHBFaWQtPkxlbiArIDIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChOZGlzRXF1YWxNZW1vcnkocEVpZC0+T2N0ZXQsIFdNRV9QQVJNX0VMRU0sIDYpICYmIChwRWlkLT5MZW4gPT0gMjQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgUFVDSEFSIHB0cjsKKyAgICAgICAgICAgICAgICAgICAgaW50IGk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gcGFyc2luZyBFRENBIHBhcmFtZXRlcnMKKyAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5iVmFsaWQgICAgICAgICAgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPmJRQWNrICAgICAgICAgICA9IEZBTFNFOyAvLyBwRWlkLT5PY3RldFswXSAmIDB4MTA7CisgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+YlF1ZXVlUmVxdWVzdCAgID0gRkFMU0U7IC8vIHBFaWQtPk9jdGV0WzBdICYgMHgyMDsKKyAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5iVHhvcFJlcXVlc3QgICAgPSBGQUxTRTsgLy8gcEVpZC0+T2N0ZXRbMF0gJiAweDQwOworICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPkVkY2FVcGRhdGVDb3VudCA9IHBFaWQtPk9jdGV0WzZdICYgMHgwZjsKKyAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5iQVBTRENhcGFibGUgICAgPSAocEVpZC0+T2N0ZXRbNl0gJiAweDgwKSA/IDEgOiAwOworICAgICAgICAgICAgICAgICAgICBwdHIgPSAmcEVpZC0+T2N0ZXRbOF07CisgICAgICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpPDQ7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgYWNpID0gKCpwdHIgJiAweDYwKSA+PiA1OyAvLyBiNX42IGlzIEFDIElOREVYCisgICAgICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPmJBQ01bYWNpXSAgPSAoKCgqcHRyKSAmIDB4MTApID09IDB4MTApOyAgIC8vIGI1IGlzIEFDTQorICAgICAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5BaWZzblthY2ldID0gKCpwdHIpICYgMHgwZjsgICAgICAgICAgICAgICAvLyBiMH4zIGlzIEFJRlNOCisgICAgICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPkN3bWluW2FjaV0gPSAqKHB0cisxKSAmIDB4MGY7ICAgICAgICAgICAgIC8vIGIwfjQgaXMgQ3dtaW4KKyAgICAgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+Q3dtYXhbYWNpXSA9ICoocHRyKzEpID4+IDQ7ICAgICAgICAgICAgICAgLy8gYjV+OCBpcyBDd21heAorICAgICAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5UeG9wW2FjaV0gID0gKihwdHIrMikgKyAyNTYgKiAoKihwdHIrMykpOyAvLyBpbiB1bml0IG9mIDMyLXVzCisgICAgICAgICAgICAgICAgICAgICAgICBwdHIgKz0gNDsgLy8gcG9pbnQgdG8gbmV4dCBBQworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKE5kaXNFcXVhbE1lbW9yeShwRWlkLT5PY3RldCwgV01FX0lORk9fRUxFTSwgNikgJiYgKHBFaWQtPkxlbiA9PSA3KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIHBhcnNpbmcgRURDQSBwYXJhbWV0ZXJzCisgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+YlZhbGlkICAgICAgICAgID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5iUUFjayAgICAgICAgICAgPSBGQUxTRTsgLy8gcEVpZC0+T2N0ZXRbMF0gJiAweDEwOworICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPmJRdWV1ZVJlcXVlc3QgICA9IEZBTFNFOyAvLyBwRWlkLT5PY3RldFswXSAmIDB4MjA7CisgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+YlR4b3BSZXF1ZXN0ICAgID0gRkFMU0U7IC8vIHBFaWQtPk9jdGV0WzBdICYgMHg0MDsKKyAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5FZGNhVXBkYXRlQ291bnQgPSBwRWlkLT5PY3RldFs2XSAmIDB4MGY7CisgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+YkFQU0RDYXBhYmxlICAgID0gKHBFaWQtPk9jdGV0WzZdICYgMHg4MCkgPyAxIDogMDsKKworICAgICAgICAgICAgICAgICAgICAvLyB1c2UgZGVmYXVsdCBFRENBIHBhcmFtZXRlcgorICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPmJBQ01bUUlEX0FDX0JFXSAgPSAwOworICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPkFpZnNuW1FJRF9BQ19CRV0gPSAzOworICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPkN3bWluW1FJRF9BQ19CRV0gPSBDV19NSU5fSU5fQklUUzsKKyAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5Dd21heFtRSURfQUNfQkVdID0gQ1dfTUFYX0lOX0JJVFM7CisgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+VHhvcFtRSURfQUNfQkVdICA9IDA7CisKKyAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5iQUNNW1FJRF9BQ19CS10gID0gMDsKKyAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5BaWZzbltRSURfQUNfQktdID0gNzsKKyAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5Dd21pbltRSURfQUNfQktdID0gQ1dfTUlOX0lOX0JJVFM7CisgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+Q3dtYXhbUUlEX0FDX0JLXSA9IENXX01BWF9JTl9CSVRTOworICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPlR4b3BbUUlEX0FDX0JLXSAgPSAwOworCisgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+YkFDTVtRSURfQUNfVkldICA9IDA7CisgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+QWlmc25bUUlEX0FDX1ZJXSA9IDI7CisgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+Q3dtaW5bUUlEX0FDX1ZJXSA9IENXX01JTl9JTl9CSVRTLTE7CisgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+Q3dtYXhbUUlEX0FDX1ZJXSA9IENXX01BWF9JTl9CSVRTOworICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPlR4b3BbUUlEX0FDX1ZJXSAgPSA5NjsgICAvLyBBQ19WSTogOTYqMzJ1cyB+PSAzbXMKKworICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPmJBQ01bUUlEX0FDX1ZPXSAgPSAwOworICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPkFpZnNuW1FJRF9BQ19WT10gPSAyOworICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPkN3bWluW1FJRF9BQ19WT10gPSBDV19NSU5fSU5fQklUUy0yOworICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPkN3bWF4W1FJRF9BQ19WT10gPSBDV19NQVhfSU5fQklUUy0xOworICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPlR4b3BbUUlEX0FDX1ZPXSAgPSA0ODsgICAvLyBBQ19WTzogNDgqMzJ1cyB+PSAxLjVtcworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBJRV9FWFRfU1VQUF9SQVRFUzoKKyAgICAgICAgICAgICAgICBpZiAocEVpZC0+TGVuIDw9IE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkoRXh0UmF0ZSwgcEVpZC0+T2N0ZXQsIHBFaWQtPkxlbik7CisgICAgICAgICAgICAgICAgICAgICpwRXh0UmF0ZUxlbiA9IHBFaWQtPkxlbjsKKworICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiAyMDA0LTA5LTE0IG5vdCBhIGdvb2QgZGVzaWduIGhlcmUsIGNhdXNlIGl0IGV4Y2x1ZGUgZXh0cmEgcmF0ZXMKKyAgICAgICAgICAgICAgICAgICAgLy8gZnJvbSBTY2FuVGFiLiBXZSBzaG91bGQgcmVwb3J0IGFzIGlzLiBBbmQgZmlsdGVyIG91dCB1bnN1cHBvcnRlZAorICAgICAgICAgICAgICAgICAgICAvLyByYXRlcyBpbiBNbG1lQXV4LgorICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBhZ2FpbnN0IHRoZSBzdXBwb3J0ZWQgcmF0ZXMKKyAgICAgICAgICAgICAgICAgICAgLy8gUlRNUENoZWNrUmF0ZXMocEFkLCBFeHRSYXRlLCBwRXh0UmF0ZUxlbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIElFX0VSUDoKKyAgICAgICAgICAgICAgICBpZiAocEVpZC0+TGVuID09IDEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAqcEVycCA9IChVQ0hBUilwRWlkLT5PY3RldFswXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgSUVfQUlST05FVF9DS0lQOgorICAgICAgICAgICAgICAgIC8vIDAuIENoZWNrIEFpcm9uZXQgSUUgbGVuZ3RoLCBpdCBtdXN0IGJlIGxhcmdlciBvciBlcXVhbCB0byAyOAorICAgICAgICAgICAgICAgIC8vIENpc2NvIEFQMzUwIHVzZWQgbGVuZ3RoIGFzIDI4CisgICAgICAgICAgICAgICAgLy8gQ2lzY28gQVAxMlhYIHVzZWQgbGVuZ3RoIGFzIDMwCisgICAgICAgICAgICAgICAgaWYgKHBFaWQtPkxlbiA8IChDS0lQX05FR09USUFUSU9OX0xFTkdUSCAtIDIpKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIC8vIDEuIENvcHkgQ0tJUCBmbGFnIGJ5dGUgdG8gYnVmZmVyIGZvciBwcm9jZXNzCisgICAgICAgICAgICAgICAgKnBDa2lwRmxhZyA9ICoocEVpZC0+T2N0ZXQgKyA4KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBJRV9BUF9UWF9QT1dFUjoKKyAgICAgICAgICAgICAgICAvLyBBUCBDb250cm9sIG9mIENsaWVudCBUcmFuc21pdCBQb3dlcgorICAgICAgICAgICAgICAgIC8vMC4gQ2hlY2sgQWlyb25ldCBJRSBsZW5ndGgsIGl0IG11c3QgYmUgNgorICAgICAgICAgICAgICAgIGlmIChwRWlkLT5MZW4gIT0gMHgwNikKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAvLyBHZXQgY2VsbCBwb3dlciBsaW1pdCBpbiBkQm0KKyAgICAgICAgICAgICAgICBpZiAoTmRpc0VxdWFsTWVtb3J5KHBFaWQtPk9jdGV0LCBDSVNDT19PVUksIDMpID09IDEpCisgICAgICAgICAgICAgICAgICAgICpwQWlyb25ldENlbGxQb3dlckxpbWl0ID0gKihwRWlkLT5PY3RldCArIDQpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAvLyBXUEEyICYgODAyLjExaSBSU04KKyAgICAgICAgICAgIGNhc2UgSUVfUlNOOgorICAgICAgICAgICAgICAgIC8vIFRoZXJlIGlzIG5vIE9VSSBmb3IgdmVyc2lvbiBhbnltb3JlLCBjaGVjayB0aGUgZ3JvdXAgY2lwaGVyIE9VSSBiZWZvcmUgY29weWluZworICAgICAgICAgICAgICAgIGlmIChSVE1QRXF1YWxNZW1vcnkocEVpZC0+T2N0ZXQgKyAyLCBSU05fT1VJLCAzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIENvcHkgdG8gcFZJRSB3aGljaCB3aWxsIHJlcG9ydCB0byBtaWNyb3NvZnQgYnNzaWQgbGlzdC4KKyAgICAgICAgICAgICAgICAgICAgUHRyID0gKFBVQ0hBUikgcFZJRTsKKyAgICAgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkoUHRyICsgKkxlbmd0aFZJRSwgJnBFaWQtPkVpZCwgcEVpZC0+TGVuICsgMik7CisgICAgICAgICAgICAgICAgICAgICpMZW5ndGhWSUUgKz0gKHBFaWQtPkxlbiArIDIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKyNpZmRlZiBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUCisJCQljYXNlIElFX0NPVU5UUlk6CisJCQkJUHRyID0gKFBVQ0hBUikgcFZJRTsKKyAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShQdHIgKyAqTGVuZ3RoVklFLCAmcEVpZC0+RWlkLCBwRWlkLT5MZW4gKyAyKTsKKyAgICAgICAgICAgICAgICAqTGVuZ3RoVklFICs9IChwRWlkLT5MZW4gKyAyKTsKKwkJCQlicmVhazsKKyNlbmRpZiAvLyBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUIC8vCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBMZW5ndGggPSBMZW5ndGggKyAyICsgcEVpZC0+TGVuOyAgLy8gRWlkWzFdICsgTGVuWzFdKyBjb250ZW50W0xlbl0KKyAgICAgICAgcEVpZCA9IChQRUlEX1NUUlVDVCkoKFVDSEFSKilwRWlkICsgMiArIHBFaWQtPkxlbik7CisgICAgfQorCisgICAgLy8gRm9yIHNvbWUgMTFhIEFQLiBpdCBkaWQgbm90IGhhdmUgdGhlIGNoYW5uZWwgRUlELCBwYXRjaCBoZXJlCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwl7CisJCVVDSEFSIExhdGNoUmZDaGFubmVsID0gTXNnQ2hhbm5lbDsKKwkJaWYgKChwQWQtPkxhdGNoUmZSZWdzLkNoYW5uZWwgPiAxNCkgJiYgKChTYW5pdHkgJiAweDQpID09IDApKQorCQl7CisJCQlpZiAoQ3RybENoYW5uZWwgIT0gMCkKKwkJCQkqcENoYW5uZWwgPSBDdHJsQ2hhbm5lbDsKKwkJCWVsc2UKKwkJCQkqcENoYW5uZWwgPSBMYXRjaFJmQ2hhbm5lbDsKKwkJCVNhbml0eSB8PSAweDQ7CisJCX0KKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlpZiAoU2FuaXR5ICE9IDB4NykKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1dBUk4sICgiUGVlckJlYWNvbkFuZFByb2JlUnNwU2FuaXR5IC0gbWlzc2luZyBmaWVsZCwgU2FuaXR5PTB4JTAyeFxuIiwgU2FuaXR5KSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisJZWxzZQorCXsKKwkJcmV0dXJuIFRSVUU7CisJfQorCit9CisKKyNpZmRlZiBET1QxMU5fRFJBRlQzCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCU1MTUUgbWVzc2FnZSBzYW5pdHkgY2hlY2sgZm9yIHNvbWUgSUUgYWRkcmVzc2VkICBpbiA4MDIuMTFuIGQzLjAzLgorCVJldHVybjoKKwkJVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitCT09MRUFOIFBlZXJCZWFjb25BbmRQcm9iZVJzcFNhbml0eTIoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVk9JRCAqTXNnLAorCUlOIFVMT05HIE1zZ0xlbiwKKwlPVVQgVUNIQVIgCSpSZWdDbGFzcykKK3sKKwlDSEFSCQkJCSpQdHI7CisJUEZSQU1FXzgwMl8xMQkJcEZyYW1lOworCVBFSURfU1RSVUNUCQkJcEVpZDsKKwlVTE9ORwkJCQlMZW5ndGggPSAwOworCisJcEZyYW1lID0gKFBGUkFNRV84MDJfMTEpTXNnOworCisJKlJlZ0NsYXNzID0gMDsKKwlQdHIgPSBwRnJhbWUtPk9jdGV0OworCUxlbmd0aCArPSBMRU5HVEhfODAyXzExOworCisJLy8gZ2V0IHRpbWVzdGFtcCBmcm9tIHBheWxvYWQgYW5kIGFkdmFuY2UgdGhlIHBvaW50ZXIKKwlQdHIgKz0gVElNRVNUQU1QX0xFTjsKKwlMZW5ndGggKz0gVElNRVNUQU1QX0xFTjsKKworCS8vIGdldCBiZWFjb24gaW50ZXJ2YWwgZnJvbSBwYXlsb2FkIGFuZCBhZHZhbmNlIHRoZSBwb2ludGVyCisJUHRyICs9IDI7CisJTGVuZ3RoICs9IDI7CisKKwkvLyBnZXQgY2FwYWJpbGl0eSBpbmZvIGZyb20gcGF5bG9hZCBhbmQgYWR2YW5jZSB0aGUgcG9pbnRlcgorCVB0ciArPSAyOworCUxlbmd0aCArPSAyOworCisJcEVpZCA9IChQRUlEX1NUUlVDVCkgUHRyOworCisJLy8gZ2V0IHZhcmlhYmxlIGZpZWxkcyBmcm9tIHBheWxvYWQgYW5kIGFkdmFuY2UgdGhlIHBvaW50ZXIKKwl3aGlsZSAoKExlbmd0aCArIDIgKyBwRWlkLT5MZW4pIDw9IE1zZ0xlbikKKwl7CisJCXN3aXRjaChwRWlkLT5FaWQpCisJCXsKKwkJCWNhc2UgSUVfU1VQUF9SRUdfQ0xBU1M6CisJCQkJaWYocEVpZC0+TGVuID4gMCkKKwkJCQl7CisJCQkJCSpSZWdDbGFzcyA9ICpwRWlkLT5PY3RldDsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGVlckJlYWNvbkFuZFByb2JlUnNwU2FuaXR5IC0gd3JvbmcgSUVfU1NJRCAobGVuPSVkKVxuIixwRWlkLT5MZW4pKTsKKwkJCQkJcmV0dXJuIEZBTFNFOworCQkJCX0KKwkJCQlicmVhazsKKwkJfQorCisJCUxlbmd0aCA9IExlbmd0aCArIDIgKyBwRWlkLT5MZW47ICAvLyBFaWRbMV0gKyBMZW5bMV0rIGNvbnRlbnRbTGVuXQorCQlwRWlkID0gKFBFSURfU1RSVUNUKSgoVUNIQVIqKXBFaWQgKyAyICsgcEVpZC0+TGVuKTsKKwl9CisKKwlyZXR1cm4gVFJVRTsKKworfQorI2VuZGlmIC8vIERPVDExTl9EUkFGVDMgLy8KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBNTE1FIG1lc3NhZ2Ugc2FuaXR5IGNoZWNrCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworQk9PTEVBTiBNbG1lU2NhblJlcVNhbml0eSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBWT0lEICpNc2csCisJSU4gVUxPTkcgTXNnTGVuLAorCU9VVCBVQ0hBUiAqcEJzc1R5cGUsCisJT1VUIENIQVIgU3NpZFtdLAorCU9VVCBVQ0hBUiAqcFNzaWRMZW4sCisJT1VUIFVDSEFSICpwU2NhblR5cGUpCit7CisJTUxNRV9TQ0FOX1JFUV9TVFJVQ1QgKkluZm87CisKKwlJbmZvID0gKE1MTUVfU0NBTl9SRVFfU1RSVUNUICopKE1zZyk7CisJKnBCc3NUeXBlID0gSW5mby0+QnNzVHlwZTsKKwkqcFNzaWRMZW4gPSBJbmZvLT5Tc2lkTGVuOworCU5kaXNNb3ZlTWVtb3J5KFNzaWQsIEluZm8tPlNzaWQsICpwU3NpZExlbik7CisJKnBTY2FuVHlwZSA9IEluZm8tPlNjYW5UeXBlOworCisJaWYgKCgqcEJzc1R5cGUgPT0gQlNTX0lORlJBIHx8ICpwQnNzVHlwZSA9PSBCU1NfQURIT0MgfHwgKnBCc3NUeXBlID09IEJTU19BTlkpCisJCSYmICgqcFNjYW5UeXBlID09IFNDQU5fQUNUSVZFIHx8ICpwU2NhblR5cGUgPT0gU0NBTl9QQVNTSVZFCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCXx8ICpwU2NhblR5cGUgPT0gU0NBTl9DSVNDT19QQVNTSVZFIHx8ICpwU2NhblR5cGUgPT0gU0NBTl9DSVNDT19BQ1RJVkUKKwkJfHwgKnBTY2FuVHlwZSA9PSBTQ0FOX0NJU0NPX0NIQU5ORUxfTE9BRCB8fCAqcFNjYW5UeXBlID09IFNDQU5fQ0lTQ09fTk9JU0UKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwkJKSkKKwl7CisJCXJldHVybiBUUlVFOworCX0KKwllbHNlCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNbG1lU2NhblJlcVNhbml0eSBmYWlsIC0gd3JvbmcgQnNzVHlwZSBvciBTY2FuVHlwZVxuIikpOworCQlyZXR1cm4gRkFMU0U7CisJfQorfQorCisvLyBJUlFMID0gRElTUEFUQ0hfTEVWRUwKK1VDSEFSIENoYW5uZWxTYW5pdHkoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gVUNIQVIgY2hhbm5lbCkKK3sKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBwQWQtPkNoYW5uZWxMaXN0TnVtOyBpICsrKQorICAgIHsKKyAgICAgICAgaWYgKGNoYW5uZWwgPT0gcEFkLT5DaGFubmVsTGlzdFtpXS5DaGFubmVsKQorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIHJldHVybiAwOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIE1MTUUgbWVzc2FnZSBzYW5pdHkgY2hlY2sKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworQk9PTEVBTiBQZWVyRGVhdXRoU2FuaXR5KAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIFZPSUQgKk1zZywKKyAgICBJTiBVTE9ORyBNc2dMZW4sCisgICAgT1VUIFBVQ0hBUiBwQWRkcjIsCisgICAgT1VUIFVTSE9SVCAqcFJlYXNvbikKK3sKKyAgICBQRlJBTUVfODAyXzExIHBGcmFtZSA9IChQRlJBTUVfODAyXzExKU1zZzsKKworICAgIENPUFlfTUFDX0FERFIocEFkZHIyLCBwRnJhbWUtPkhkci5BZGRyMik7CisgICAgTmRpc01vdmVNZW1vcnkocFJlYXNvbiwgJnBGcmFtZS0+T2N0ZXRbMF0sIDIpOworCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgTUxNRSBtZXNzYWdlIHNhbml0eSBjaGVjaworICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitCT09MRUFOIFBlZXJBdXRoU2FuaXR5KAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIFZPSUQgKk1zZywKKyAgICBJTiBVTE9ORyBNc2dMZW4sCisgICAgT1VUIFBVQ0hBUiBwQWRkciwKKyAgICBPVVQgVVNIT1JUICpwQWxnLAorICAgIE9VVCBVU0hPUlQgKnBTZXEsCisgICAgT1VUIFVTSE9SVCAqcFN0YXR1cywKKyAgICBDSEFSICpwQ2hsZ1RleHQpCit7CisgICAgUEZSQU1FXzgwMl8xMSBwRnJhbWUgPSAoUEZSQU1FXzgwMl8xMSlNc2c7CisKKyAgICBDT1BZX01BQ19BRERSKHBBZGRyLCAgIHBGcmFtZS0+SGRyLkFkZHIyKTsKKyAgICBOZGlzTW92ZU1lbW9yeShwQWxnLCAgICAmcEZyYW1lLT5PY3RldFswXSwgMik7CisgICAgTmRpc01vdmVNZW1vcnkocFNlcSwgICAgJnBGcmFtZS0+T2N0ZXRbMl0sIDIpOworICAgIE5kaXNNb3ZlTWVtb3J5KHBTdGF0dXMsICZwRnJhbWUtPk9jdGV0WzRdLCAyKTsKKworICAgIGlmICgoKnBBbGcgPT0gTmRpczgwMl8xMUF1dGhNb2RlT3BlbikKKyNpZmRlZiBMRUFQX1NVUFBPUlQKKyAgICAgIHx8ICgqcEFsZyA9PSBDSVNDT19BdXRoTW9kZUxFQVApCisjZW5kaWYgLy8gTEVBUF9TVVBQT1JUIC8vCisgICAgICApCisgICAgeworICAgICAgICBpZiAoKnBTZXEgPT0gMSB8fCAqcFNlcSA9PSAyKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXJBdXRoU2FuaXR5IGZhaWwgLSB3cm9uZyBTZWcjXG4iKSk7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoKnBBbGcgPT0gTmRpczgwMl8xMUF1dGhNb2RlU2hhcmVkKQorICAgIHsKKyAgICAgICAgaWYgKCpwU2VxID09IDEgfHwgKnBTZXEgPT0gNCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoKnBTZXEgPT0gMiB8fCAqcFNlcSA9PSAzKQorICAgICAgICB7CisgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQ2hsZ1RleHQsICZwRnJhbWUtPk9jdGV0WzhdLCBDSVBIRVJfVEVYVF9MRU4pOworICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyQXV0aFNhbml0eSBmYWlsIC0gd3JvbmcgU2VnI1xuIikpOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXJBdXRoU2FuaXR5IGZhaWwgLSB3cm9uZyBhbGdvcml0aG1cbiIpKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBNTE1FIG1lc3NhZ2Ugc2FuaXR5IGNoZWNrCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworQk9PTEVBTiBNbG1lQXV0aFJlcVNhbml0eSgKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBWT0lEICpNc2csCisgICAgSU4gVUxPTkcgTXNnTGVuLAorICAgIE9VVCBQVUNIQVIgcEFkZHIsCisgICAgT1VUIFVMT05HICpwVGltZW91dCwKKyAgICBPVVQgVVNIT1JUICpwQWxnKQoreworICAgIE1MTUVfQVVUSF9SRVFfU1RSVUNUICpwSW5mbzsKKworICAgIHBJbmZvICA9IChNTE1FX0FVVEhfUkVRX1NUUlVDVCAqKU1zZzsKKyAgICBDT1BZX01BQ19BRERSKHBBZGRyLCBwSW5mby0+QWRkcik7CisgICAgKnBUaW1lb3V0ID0gcEluZm8tPlRpbWVvdXQ7CisgICAgKnBBbGcgPSBwSW5mby0+QWxnOworCisgICAgaWYgKCgoKnBBbGcgPT0gTmRpczgwMl8xMUF1dGhNb2RlU2hhcmVkKSB8fCgqcEFsZyA9PSBOZGlzODAyXzExQXV0aE1vZGVPcGVuKQorI2lmZGVmIExFQVBfU1VQUE9SVAorICAgICB8fCAoKnBBbGcgPT0gQ0lTQ09fQXV0aE1vZGVMRUFQKQorI2VuZGlmIC8vIExFQVBfU1VQUE9SVCAvLworICAgICAJKSAmJgorICAgICAgICAoKCpwQWRkciAmIDB4MDEpID09IDApKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1sbWVBdXRoUmVxU2FuaXR5IGZhaWwgLSB3cm9uZyBhbGdvcml0aG1cbiIpKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBNTE1FIG1lc3NhZ2Ugc2FuaXR5IGNoZWNrCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK0JPT0xFQU4gTWxtZUFzc29jUmVxU2FuaXR5KAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIFZPSUQgKk1zZywKKyAgICBJTiBVTE9ORyBNc2dMZW4sCisgICAgT1VUIFBVQ0hBUiBwQXBBZGRyLAorICAgIE9VVCBVU0hPUlQgKnBDYXBhYmlsaXR5SW5mbywKKyAgICBPVVQgVUxPTkcgKnBUaW1lb3V0LAorICAgIE9VVCBVU0hPUlQgKnBMaXN0ZW5JbnR2KQoreworICAgIE1MTUVfQVNTT0NfUkVRX1NUUlVDVCAqcEluZm87CisKKyAgICBwSW5mbyA9IChNTE1FX0FTU09DX1JFUV9TVFJVQ1QgKilNc2c7CisgICAgKnBUaW1lb3V0ID0gcEluZm8tPlRpbWVvdXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aW1lb3V0CisgICAgQ09QWV9NQUNfQUREUihwQXBBZGRyLCBwSW5mby0+QWRkcik7ICAgICAgICAgICAgICAgICAgIC8vIEFQIGFkZHJlc3MKKyAgICAqcENhcGFiaWxpdHlJbmZvID0gcEluZm8tPkNhcGFiaWxpdHlJbmZvOyAgICAgICAgICAgICAgIC8vIGNhcGFiaWxpdHkgaW5mbworICAgICpwTGlzdGVuSW50diA9IHBJbmZvLT5MaXN0ZW5JbnR2OworCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgTUxNRSBtZXNzYWdlIHNhbml0eSBjaGVjaworICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitCT09MRUFOIFBlZXJEaXNhc3NvY1Nhbml0eSgKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBWT0lEICpNc2csCisgICAgSU4gVUxPTkcgTXNnTGVuLAorICAgIE9VVCBQVUNIQVIgcEFkZHIyLAorICAgIE9VVCBVU0hPUlQgKnBSZWFzb24pCit7CisgICAgUEZSQU1FXzgwMl8xMSBwRnJhbWUgPSAoUEZSQU1FXzgwMl8xMSlNc2c7CisKKyAgICBDT1BZX01BQ19BRERSKHBBZGRyMiwgcEZyYW1lLT5IZHIuQWRkcjIpOworICAgIE5kaXNNb3ZlTWVtb3J5KHBSZWFzb24sICZwRnJhbWUtPk9jdGV0WzBdLCAyKTsKKworICAgIHJldHVybiBUUlVFOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVNhbml0eSBjaGVjayBOZXR3b3JrVHlwZSAoMTFiLCAxMWcgb3IgMTFhKQorCisJQXJndW1lbnRzOgorCQlwQnNzIC0gUG9pbnRlciB0byBCU1MgdGFibGUuCisKKwlSZXR1cm4gVmFsdWU6CisgICAgICAgIE5kaXM4MDJfMTFEUyAuLi4uLi4uKDExYikKKyAgICAgICAgTmRpczgwMl8xMU9GRE0yNC4uLi4oMTFnKQorICAgICAgICBOZGlzODAyXzExT0ZETTUuLi4uLigxMWEpCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK05ESVNfODAyXzExX05FVFdPUktfVFlQRSBOZXR3b3JrVHlwZUluVXNlU2FuaXR5KAorICAgIElOIFBCU1NfRU5UUlkgcEJzcykKK3sKKwlORElTXzgwMl8xMV9ORVRXT1JLX1RZUEUJTmV0V29ya1R5cGU7CisJVUNIQVIJCQkJCQlyYXRlLCBpOworCisJTmV0V29ya1R5cGUgPSBOZGlzODAyXzExRFM7CisKKwlpZiAocEJzcy0+Q2hhbm5lbCA8PSAxNCkKKwl7CisJCS8vCisJCS8vIEZpcnN0IGNoZWNrIHN1cHBvcnQgUmF0ZS4KKwkJLy8KKwkJZm9yIChpID0gMDsgaSA8IHBCc3MtPlN1cFJhdGVMZW47IGkrKykKKwkJeworCQkJcmF0ZSA9IHBCc3MtPlN1cFJhdGVbaV0gJiAweDdmOyAvLyBNYXNrIG91dCBiYXNpYyByYXRlIHNldCBiaXQKKwkJCWlmICgocmF0ZSA9PSAyKSB8fCAocmF0ZSA9PSA0KSB8fCAocmF0ZSA9PSAxMSkgfHwgKHJhdGUgPT0gMjIpKQorCQkJeworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCS8vCisJCQkJLy8gT3RoZXJ3aXNlIChldmVuIHJhdGUgPiAxMDgpIG1lYW5zIE5kaXM4MDJfMTFPRkRNMjQKKwkJCQkvLworCQkJCU5ldFdvcmtUeXBlID0gTmRpczgwMl8xMU9GRE0yNDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCS8vCisJCS8vIFNlY29uZCBjaGVjayBFeHRlbmQgUmF0ZS4KKwkJLy8KKwkJaWYgKE5ldFdvcmtUeXBlICE9IE5kaXM4MDJfMTFPRkRNMjQpCisJCXsKKwkJCWZvciAoaSA9IDA7IGkgPCBwQnNzLT5FeHRSYXRlTGVuOyBpKyspCisJCQl7CisJCQkJcmF0ZSA9IHBCc3MtPlN1cFJhdGVbaV0gJiAweDdmOyAvLyBNYXNrIG91dCBiYXNpYyByYXRlIHNldCBiaXQKKwkJCQlpZiAoKHJhdGUgPT0gMikgfHwgKHJhdGUgPT0gNCkgfHwgKHJhdGUgPT0gMTEpIHx8IChyYXRlID09IDIyKSkKKwkJCQl7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQkvLworCQkJCQkvLyBPdGhlcndpc2UgKGV2ZW4gcmF0ZSA+IDEwOCkgbWVhbnMgTmRpczgwMl8xMU9GRE0yNAorCQkJCQkvLworCQkJCQlOZXRXb3JrVHlwZSA9IE5kaXM4MDJfMTFPRkRNMjQ7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwllbHNlCisJeworCQlOZXRXb3JrVHlwZSA9IE5kaXM4MDJfMTFPRkRNNTsKKwl9CisKKyAgICBpZiAocEJzcy0+SHRDYXBhYmlsaXR5TGVuICE9IDApCisgICAgeworICAgICAgICBpZiAoTmV0V29ya1R5cGUgPT0gTmRpczgwMl8xMU9GRE01KQorICAgICAgICAgICAgTmV0V29ya1R5cGUgPSBOZGlzODAyXzExT0ZETTVfTjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgTmV0V29ya1R5cGUgPSBOZGlzODAyXzExT0ZETTI0X047CisgICAgfQorCisJcmV0dXJuIE5ldFdvcmtUeXBlOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFdQQSBtZXNzYWdlIHNhbml0eSBjaGVjaworICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK0JPT0xFQU4gUGVlcldwYU1lc3NhZ2VTYW5pdHkoCisgICAgSU4gCVBSVE1QX0FEQVBURVIgCQlwQWQsCisgICAgSU4gCVBFQVBPTF9QQUNLRVQgCQlwTXNnLAorICAgIElOIAlVTE9ORyAJCQkJTXNnTGVuLAorICAgIElOIAlVQ0hBUgkJCQlNc2dUeXBlLAorICAgIElOIAlNQUNfVEFCTEVfRU5UUlkgIAkqcEVudHJ5KQoreworCVVDSEFSCQkJbWljW0xFTl9LRVlfREVTQ19NSUNdLCBkaWdlc3RbODBdLCBLRVlEQVRBW01BWF9MRU5fT0ZfUlNOSUVdOworCUJPT0xFQU4JCQliUmVwbGF5RGlmZiA9IEZBTFNFOworCUJPT0xFQU4JCQliV1BBMiA9IEZBTFNFOworCUtFWV9JTkZPCQlFYXBvbEtleUluZm87CisJVUNIQVIJCQlHcm91cEtleUluZGV4ID0gMDsKKworCisJTmRpc1plcm9NZW1vcnkobWljLCBzaXplb2YobWljKSk7CisJTmRpc1plcm9NZW1vcnkoZGlnZXN0LCBzaXplb2YoZGlnZXN0KSk7CisJTmRpc1plcm9NZW1vcnkoS0VZREFUQSwgc2l6ZW9mKEtFWURBVEEpKTsKKwlOZGlzWmVyb01lbW9yeSgoUFVDSEFSKSZFYXBvbEtleUluZm8sIHNpemVvZihFYXBvbEtleUluZm8pKTsKKworCU5kaXNNb3ZlTWVtb3J5KChQVUNIQVIpJkVhcG9sS2V5SW5mbywgKFBVQ0hBUikmcE1zZy0+S2V5RGVzYy5LZXlJbmZvLCBzaXplb2YoS0VZX0lORk8pKTsKKworCSooKFVTSE9SVCAqKSZFYXBvbEtleUluZm8pID0gY3B1MmxlMTYoKigoVVNIT1JUICopJkVhcG9sS2V5SW5mbykpOworCisJLy8gQ2hvb3NlIFdQQTIgb3Igbm90CisJaWYgKChwRW50cnktPkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIpIHx8IChwRW50cnktPkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spKQorCQliV1BBMiA9IFRSVUU7CisKKwkvLyAwLiBDaGVjayBNc2dUeXBlCisJaWYgKChNc2dUeXBlID4gRUFQT0xfR1JPVVBfTVNHXzIpIHx8IChNc2dUeXBlIDwgRUFQT0xfUEFJUl9NU0dfMSkpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJUaGUgbWVzc2FnZSB0eXBlIGlzIGludmFsaWQoJWQpISBcbiIsIE1zZ1R5cGUpKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCS8vIDEuIFJlcGxheSBjb3VudGVyIGNoZWNrCisgCWlmIChNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzEgfHwgTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18zIHx8IE1zZ1R5cGUgPT0gRUFQT0xfR1JPVVBfTVNHXzEpCS8vIEZvciBzdXBwbGljYW50CisgICAgeworICAgIAkvLyBGaXJzdCB2YWxpZGF0ZSByZXBsYXkgY291bnRlciwgb25seSBhY2NlcHQgbWVzc2FnZSB3aXRoIGxhcmdlciByZXBsYXkgY291bnRlci4KKwkJLy8gTGV0IGVxdWFsIHBhc3MsIHNvbWUgQVAgc3RhcnQgd2l0aCBhbGwgemVybyByZXBsYXkgY291bnRlcgorCQlVQ0hBUglaZXJvUmVwbGF5W0xFTl9LRVlfREVTQ19SRVBMQVldOworCisgICAgICAgIE5kaXNaZXJvTWVtb3J5KFplcm9SZXBsYXksIExFTl9LRVlfREVTQ19SRVBMQVkpOworCQlpZiAoKFJUTVBDb21wYXJlTWVtb3J5KHBNc2ctPktleURlc2MuUmVwbGF5Q291bnRlciwgcEVudHJ5LT5SX0NvdW50ZXIsIExFTl9LRVlfREVTQ19SRVBMQVkpICE9IDEpICYmCisJCQkoUlRNUENvbXBhcmVNZW1vcnkocE1zZy0+S2V5RGVzYy5SZXBsYXlDb3VudGVyLCBaZXJvUmVwbGF5LCBMRU5fS0VZX0RFU0NfUkVQTEFZKSAhPSAwKSkKKyAgICAJeworCQkJYlJlcGxheURpZmYgPSBUUlVFOworICAgIAl9CisgCX0KKwllbHNlIGlmIChNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzIgfHwgTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR180IHx8IE1zZ1R5cGUgPT0gRUFQT0xfR1JPVVBfTVNHXzIpCS8vIEZvciBhdXRoZW50aWNhdG9yCisJeworCQkvLyBjaGVjayBSZXBsYXkgQ291bnRlciBjb3Jlc3BvbmRzIHRvIE1TRyBmcm9tIGF1dGhlbnRpY2F0b3IsIG90aGVyd2lzZSBkaXNjYXJkCisgICAgCWlmICghTmRpc0VxdWFsTWVtb3J5KHBNc2ctPktleURlc2MuUmVwbGF5Q291bnRlciwgcEVudHJ5LT5SX0NvdW50ZXIsIExFTl9LRVlfREVTQ19SRVBMQVkpKQorICAgIAl7CisJCQliUmVwbGF5RGlmZiA9IFRSVUU7CisgICAgCX0KKwl9CisKKwkvLyBSZXBsYXkgQ291bnRlciBkaWZmZXJlbnQgY29uZGl0aW9uCisJaWYgKGJSZXBsYXlEaWZmKQorCXsKKwkJLy8gc2VuZCB3aXJlbGVzcyBldmVudCAtIGZvciByZXBsYXkgY291bnRlciBkaWZmZXJlbnQKKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJXaXJlbGVzc0V2ZW50KQorCQkJUlRNUFNlbmRXaXJlbGVzc0V2ZW50KHBBZCwgSVdfUkVQTEFZX0NPVU5URVJfRElGRl9FVkVOVF9GTEFHLCBwRW50cnktPkFkZHIsIHBFbnRyeS0+YXBpZHgsIDApOworCisJCWlmIChNc2dUeXBlIDwgRUFQT0xfR1JPVVBfTVNHXzEpCisJCXsKKyAgICAgICAgICAgCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlJlcGxheSBDb3VudGVyIERpZmZlcmVudCBpbiBwYWlyd2lzZSBtc2cgJWQgb2YgNC13YXkgaGFuZHNoYWtlIVxuIiwgTXNnVHlwZSkpOworCQl9CisJCWVsc2UKKwkJeworCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiUmVwbGF5IENvdW50ZXIgRGlmZmVyZW50IGluIGdyb3VwIG1zZyAlZCBvZiAyLXdheSBoYW5kc2hha2UhXG4iLCAoTXNnVHlwZSAtIEVBUE9MX1BBSVJfTVNHXzQpKSk7CisJCX0KKworCQloZXhfZHVtcCgiUmVjZWl2ZSByZXBsYXkgY291bnRlciAiLCBwTXNnLT5LZXlEZXNjLlJlcGxheUNvdW50ZXIsIExFTl9LRVlfREVTQ19SRVBMQVkpOworCQloZXhfZHVtcCgiQ3VycmVudCByZXBsYXkgY291bnRlciAiLCBwRW50cnktPlJfQ291bnRlciwgTEVOX0tFWV9ERVNDX1JFUExBWSk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKwl9CisKKwkvLyAyLiBWZXJpZnkgTUlDIGV4Y2VwdCBQYWlyd2lzZSBNc2cxCisJaWYgKE1zZ1R5cGUgIT0gRUFQT0xfUEFJUl9NU0dfMSkKKwl7CisJCVVDSEFSCQkJcmN2ZF9taWNbTEVOX0tFWV9ERVNDX01JQ107CisKKwkJLy8gUmVjb3JkIHRoZSByZWNlaXZlZCBNSUMgZm9yIGNoZWNrIGxhdGVyCisJCU5kaXNNb3ZlTWVtb3J5KHJjdmRfbWljLCBwTXNnLT5LZXlEZXNjLktleU1pYywgTEVOX0tFWV9ERVNDX01JQyk7CisJCU5kaXNaZXJvTWVtb3J5KHBNc2ctPktleURlc2MuS2V5TWljLCBMRU5fS0VZX0RFU0NfTUlDKTsKKworICAgICAgICBpZiAocEVudHJ5LT5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkJLy8gVEtJUAorICAgICAgICB7CisgICAgICAgICAgICBobWFjX21kNShwRW50cnktPlBUSywgTEVOX0VBUF9NSUNLLCAoUFVDSEFSKXBNc2csIE1zZ0xlbiwgbWljKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChwRW50cnktPldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQkvLyBBRVMKKyAgICAgICAgeworICAgICAgICAgICAgSE1BQ19TSEExKChQVUNIQVIpcE1zZywgTXNnTGVuLCBwRW50cnktPlBUSywgTEVOX0VBUF9NSUNLLCBkaWdlc3QpOworICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkobWljLCBkaWdlc3QsIExFTl9LRVlfREVTQ19NSUMpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFOZGlzRXF1YWxNZW1vcnkocmN2ZF9taWMsIG1pYywgTEVOX0tFWV9ERVNDX01JQykpCisgICAgICAgIHsKKwkJCS8vIHNlbmQgd2lyZWxlc3MgZXZlbnQgLSBmb3IgTUlDIGRpZmZlcmVudAorCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJXaXJlbGVzc0V2ZW50KQorCQkJCVJUTVBTZW5kV2lyZWxlc3NFdmVudChwQWQsIElXX01JQ19ESUZGX0VWRU5UX0ZMQUcsIHBFbnRyeS0+QWRkciwgcEVudHJ5LT5hcGlkeCwgMCk7CisKKwkJCWlmIChNc2dUeXBlIDwgRUFQT0xfR1JPVVBfTVNHXzEpCisJCQl7CisgICAgICAgICAgICAJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiTUlDIERpZmZlcmVudCBpbiBwYWlyd2lzZSBtc2cgJWQgb2YgNC13YXkgaGFuZHNoYWtlIVxuIiwgTXNnVHlwZSkpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIk1JQyBEaWZmZXJlbnQgaW4gZ3JvdXAgbXNnICVkIG9mIDItd2F5IGhhbmRzaGFrZSFcbiIsIChNc2dUeXBlIC0gRUFQT0xfUEFJUl9NU0dfNCkpKTsKKwkJCX0KKworCQkJaGV4X2R1bXAoIlJlY2VpdmVkIE1JQyIsIHJjdmRfbWljLCBMRU5fS0VZX0RFU0NfTUlDKTsKKwkJCWhleF9kdW1wKCJEZXNpcmVkICBNSUMiLCBtaWMsIExFTl9LRVlfREVTQ19NSUMpOworCisJCQlyZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKwl9CisKKwkvLyBFeHRyYWN0IHRoZSBjb250ZXh0IG9mIHRoZSBLZXkgRGF0YSBmaWVsZCBpZiBpdCBleGlzdAorCS8vIFRoZSBmaWVsZCBpbiBwYWlyd2lzZV9tc2dfMl9XUEExKFdQQTIpICYgcGFpcndpc2VfbXNnXzNfV1BBMSBpcyB1bi1lbmNyeXB0ZWQuCisJLy8gVGhlIGZpZWxkIGluIGdyb3VwX21zZ18xX1dQQTEoV1BBMikgJiBwYWlyd2lzZV9tc2dfM19XUEEyIGlzIGVuY3J5cHRlZC4KKwlpZiAocE1zZy0+S2V5RGVzYy5LZXlEYXRhTGVuWzFdID4gMCkKKwl7CisJCS8vIERlY3J5cHQgdGhpcyBmaWVsZAorCQlpZiAoKE1zZ1R5cGUgPT0gRUFQT0xfUEFJUl9NU0dfMyAmJiBiV1BBMikgfHwgKE1zZ1R5cGUgPT0gRUFQT0xfR1JPVVBfTVNHXzEpKQorCQl7CisJCQlpZihwRW50cnktPldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQorCQkJeworCQkJCS8vIEFFUworCQkJCUFFU19HVEtfS0VZX1VOV1JBUCgmcEVudHJ5LT5QVEtbMTZdLCBLRVlEQVRBLCBwTXNnLT5LZXlEZXNjLktleURhdGFMZW5bMV0scE1zZy0+S2V5RGVzYy5LZXlEYXRhKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlJTlQgCWk7CisJCQkJVUNIQVIgICBLZXlbMzJdOworCQkJCS8vIERlY3J5cHQgVEtJUCBHVEsKKwkJCQkvLyBDb25zdHJ1Y3QgMzIgYnl0ZXMgUkM0IEtleQorCQkJCU5kaXNNb3ZlTWVtb3J5KEtleSwgcE1zZy0+S2V5RGVzYy5LZXlJdiwgMTYpOworCQkJCU5kaXNNb3ZlTWVtb3J5KCZLZXlbMTZdLCAmcEVudHJ5LT5QVEtbMTZdLCAxNik7CisJCQkJQVJDRk9VUl9JTklUKCZwQWQtPlByaXZhdGVJbmZvLldFUENPTlRFWFQsIEtleSwgMzIpOworCQkJCS8vZGlzY2FyZCBmaXJzdCAyNTYgYnl0ZXMKKwkJCQlmb3IoaSA9IDA7IGkgPCAyNTY7IGkrKykKKwkJCQkJQVJDRk9VUl9CWVRFKCZwQWQtPlByaXZhdGVJbmZvLldFUENPTlRFWFQpOworCQkJCS8vIERlY3J5cHQgR1RLLiBCZWNhcmVmdWwsIHRoZXJlIGlzIG5vIElDViB0byBjaGVjayB0aGUgcmVzdWx0IGlzIGNvcnJlY3Qgb3Igbm90CisJCQkJQVJDRk9VUl9ERUNSWVBUKCZwQWQtPlByaXZhdGVJbmZvLldFUENPTlRFWFQsIEtFWURBVEEsIHBNc2ctPktleURlc2MuS2V5RGF0YSwgcE1zZy0+S2V5RGVzYy5LZXlEYXRhTGVuWzFdKTsKKwkJCX0KKworCQkJaWYgKCFiV1BBMiAmJiAoTXNnVHlwZSA9PSBFQVBPTF9HUk9VUF9NU0dfMSkpCisJCQkJR3JvdXBLZXlJbmRleCA9IEVhcG9sS2V5SW5mby5LZXlJbmRleDsKKworCQl9CisJCWVsc2UgaWYgKChNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzIpIHx8IChNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzMgJiYgIWJXUEEyKSkKKwkJeworCQkJTmRpc01vdmVNZW1vcnkoS0VZREFUQSwgcE1zZy0+S2V5RGVzYy5LZXlEYXRhLCBwTXNnLT5LZXlEZXNjLktleURhdGFMZW5bMV0pOworCQl9CisJCWVsc2UKKwkJeworCisJCQlyZXR1cm4gVFJVRTsKKwkJfQorCisJCS8vIFBhcnNlIEtleSBEYXRhIGZpZWxkIHRvCisJCS8vIDEuIHZlcmlmeSBSU04gSUUgZm9yIHBhaXJ3aXNlX21zZ18yX1dQQTEoV1BBMikgLHBhaXJ3aXNlX21zZ18zX1dQQTEoV1BBMikKKwkJLy8gMi4gdmVyaWZ5IEtERSBmb3JtYXQgZm9yIHBhaXJ3aXNlX21zZ18zX1dQQTIsIGdyb3VwX21zZ18xX1dQQTIKKwkJLy8gMy4gdXBkYXRlIHNoYXJlZCBrZXkgZm9yIHBhaXJ3aXNlX21zZ18zX1dQQTIsIGdyb3VwX21zZ18xX1dQQTEoV1BBMikKKwkJaWYgKCFSVE1QUGFyc2VFYXBvbEtleURhdGEocEFkLCBLRVlEQVRBLCBwTXNnLT5LZXlEZXNjLktleURhdGFMZW5bMV0sIEdyb3VwS2V5SW5kZXgsIE1zZ1R5cGUsIGJXUEEyLCBwRW50cnkpKQorCQl7CisJCQlyZXR1cm4gRkFMU0U7CisJCX0KKwl9CisKKwlyZXR1cm4gVFJVRTsKKworfQorCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCitCT09MRUFOIE1sbWVEbHNSZXFTYW5pdHkoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gVk9JRCAqTXNnLAorICAgIElOIFVMT05HIE1zZ0xlbiwKKyAgICBPVVQgUFJUXzgwMl8xMV9ETFMgKnBETFMsCisgICAgT1VUIFBVU0hPUlQgcFJlYXNvbikKK3sKKwlNTE1FX0RMU19SRVFfU1RSVUNUICpwSW5mbzsKKworICAgIHBJbmZvID0gKE1MTUVfRExTX1JFUV9TVFJVQ1QgKilNc2c7CisKKwkqcERMUyA9IHBJbmZvLT5wRExTOworCSpwUmVhc29uID0gcEluZm8tPlJlYXNvbjsKKworCXJldHVybiBUUlVFOworfQorI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCitCT09MRUFOIFBlZXJEbHNSZXFTYW5pdHkoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gVk9JRCAqTXNnLAorICAgIElOIFVMT05HIE1zZ0xlbiwKKyAgICBPVVQgUFVDSEFSIHBEQSwKKyAgICBPVVQgUFVDSEFSIHBTQSwKKyAgICBPVVQgVVNIT1JUICpwQ2FwYWJpbGl0eUluZm8sCisgICAgT1VUIFVTSE9SVCAqcERsc1RpbWVvdXQsCisgICAgT1VUIFVDSEFSICpwUmF0ZXNMZW4sCisgICAgT1VUIFVDSEFSIFJhdGVzW10sCisJT1VUIFVDSEFSICpwSHRDYXBhYmlsaXR5TGVuLAorICAgIE9VVCBIVF9DQVBBQklMSVRZX0lFICpwSHRDYXBhYmlsaXR5KQoreworCUNIQVIgICAgICAgICAgICAqUHRyOworICAgIFBGUkFNRV84MDJfMTEJRnIgPSAoUEZSQU1FXzgwMl8xMSlNc2c7CisJUEVJRF9TVFJVQ1QgIGVpZF9wdHI7CisKKyAgICAvLyB0byBwcmV2ZW50IGNhbGxlciBmcm9tIHVzaW5nIGdhcmJhZ2Ugb3V0cHV0IHZhbHVlCisgICAgKnBDYXBhYmlsaXR5SW5mbwk9IDA7CisgICAgKnBEbHNUaW1lb3V0CT0gMDsKKwkqcEh0Q2FwYWJpbGl0eUxlbiA9IDA7CisKKyAgICBQdHIgPSBGci0+T2N0ZXQ7CisKKwkvLyBvZmZzZXQgdG8gZGVzdGluYXRpb24gTUFDIGFkZHJlc3MgKENhdGVnb3J5IGFuZCBBY3Rpb24gZmllbGQpCisgICAgUHRyICs9IDI7CisKKyAgICAvLyBnZXQgREEgZnJvbSBwYXlsb2FkIGFuZCBhZHZhbmNlIHRoZSBwb2ludGVyCisgICAgTmRpc01vdmVNZW1vcnkocERBLCBQdHIsIE1BQ19BRERSX0xFTik7CisgICAgUHRyICs9IE1BQ19BRERSX0xFTjsKKworICAgIC8vIGdldCBTQSBmcm9tIHBheWxvYWQgYW5kIGFkdmFuY2UgdGhlIHBvaW50ZXIKKyAgICBOZGlzTW92ZU1lbW9yeShwU0EsIFB0ciwgTUFDX0FERFJfTEVOKTsKKyAgICBQdHIgKz0gTUFDX0FERFJfTEVOOworCisgICAgLy8gZ2V0IGNhcGFiaWxpdHkgaW5mbyBmcm9tIHBheWxvYWQgYW5kIGFkdmFuY2UgdGhlIHBvaW50ZXIKKyAgICBOZGlzTW92ZU1lbW9yeShwQ2FwYWJpbGl0eUluZm8sIFB0ciwgMik7CisgICAgUHRyICs9IDI7CisKKyAgICAvLyBnZXQgY2FwYWJpbGl0eSBpbmZvIGZyb20gcGF5bG9hZCBhbmQgYWR2YW5jZSB0aGUgcG9pbnRlcgorICAgIE5kaXNNb3ZlTWVtb3J5KHBEbHNUaW1lb3V0LCBQdHIsIDIpOworICAgIFB0ciArPSAyOworCisJLy8gQ2F0ZWdvcnkgYW5kIEFjdGlvbiBmaWVsZCArIERBICsgU0EgKyBjYXBhYmlsaXR5ICsgVGltZW91dAorCWVpZF9wdHIgPSAoUEVJRF9TVFJVQ1QpICZGci0+T2N0ZXRbMThdOworCisJd2hpbGUgKCgoVUNIQVIqKWVpZF9wdHIgKyBlaWRfcHRyLT5MZW4gKyAxKSA8ICgoVUNIQVIqKUZyICsgTXNnTGVuKSkKKwl7CisJCXN3aXRjaChlaWRfcHRyLT5FaWQpCisJCXsKKwkJCWNhc2UgSUVfU1VQUF9SQVRFUzoKKyAgICAgICAgICAgICAgICBpZiAoKGVpZF9wdHItPkxlbiA8PSBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUykgJiYgKGVpZF9wdHItPkxlbiA+IDApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkoUmF0ZXMsIGVpZF9wdHItPk9jdGV0LCBlaWRfcHRyLT5MZW4pOworICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyRGxzUmVxU2FuaXR5IC0gSUVfU1VQUF9SQVRFUy4sIExlbj0lZC4gUmF0ZXNbMF09JXhcbiIsZWlkX3B0ci0+TGVuLCBSYXRlc1swXSkpOworICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSYXRlc1sxXT0leCAleCAleCAleCAleCAleCAleFxuIiwgUmF0ZXNbMV0sIFJhdGVzWzJdLCBSYXRlc1szXSwgUmF0ZXNbNF0sIFJhdGVzWzVdLCBSYXRlc1s2XSwgUmF0ZXNbN10pKTsKKyAgICAgICAgICAgICAgICAgICAgKnBSYXRlc0xlbiA9IGVpZF9wdHItPkxlbjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgKnBSYXRlc0xlbiA9IDg7CisJCQkJCVJhdGVzWzBdID0gMHg4MjsKKwkJCQkJUmF0ZXNbMV0gPSAweDg0OworCQkJCQlSYXRlc1syXSA9IDB4OGI7CisJCQkJCVJhdGVzWzNdID0gMHg5NjsKKwkJCQkJUmF0ZXNbNF0gPSAweDEyOworCQkJCQlSYXRlc1s1XSA9IDB4MjQ7CisJCQkJCVJhdGVzWzZdID0gMHg0ODsKKwkJCQkJUmF0ZXNbN10gPSAweDZjOworICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyRGxzUmVxU2FuaXR5IC0gd3JvbmcgSUVfU1VQUF9SQVRFUy4sIExlbj0lZFxuIixlaWRfcHRyLT5MZW4pKTsKKyAgICAgICAgICAgICAgICB9CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgSUVfRVhUX1NVUFBfUkFURVM6CisgICAgICAgICAgICAgICAgaWYgKGVpZF9wdHItPkxlbiArICpwUmF0ZXNMZW4gPD0gTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeSgmUmF0ZXNbKnBSYXRlc0xlbl0sIGVpZF9wdHItPk9jdGV0LCBlaWRfcHRyLT5MZW4pOworICAgICAgICAgICAgICAgICAgICAqcFJhdGVzTGVuID0gKCpwUmF0ZXNMZW4pICsgZWlkX3B0ci0+TGVuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeSgmUmF0ZXNbKnBSYXRlc0xlbl0sIGVpZF9wdHItPk9jdGV0LCBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUyAtICgqcFJhdGVzTGVuKSk7CisgICAgICAgICAgICAgICAgICAgICpwUmF0ZXNMZW4gPSBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUzsKKyAgICAgICAgICAgICAgICB9CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgSUVfSFRfQ0FQOgorCQkJCWlmIChlaWRfcHRyLT5MZW4gPj0gc2l6ZW9mKEhUX0NBUEFCSUxJVFlfSUUpKQorCQkJCXsKKwkJCQkJTmRpc01vdmVNZW1vcnkocEh0Q2FwYWJpbGl0eSwgZWlkX3B0ci0+T2N0ZXQsIHNpemVvZihIVF9DQVBBQklMSVRZX0lFKSk7CisKKwkJCQkJKihVU0hPUlQgKikoJnBIdENhcGFiaWxpdHktPkh0Q2FwSW5mbykgPSBjcHUybGUxNigqKFVTSE9SVCAqKSgmcEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvKSk7CisJCQkJCSooVVNIT1JUICopKCZwSHRDYXBhYmlsaXR5LT5FeHRIdENhcEluZm8pID0gY3B1MmxlMTYoKihVU0hPUlQgKikoJnBIdENhcGFiaWxpdHktPkV4dEh0Q2FwSW5mbykpOworCQkJCQkqcEh0Q2FwYWJpbGl0eUxlbiA9IHNpemVvZihIVF9DQVBBQklMSVRZX0lFKTsKKworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyRGxzUmVxU2FuaXR5IC0gSUVfSFRfQ0FQXG4iKSk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXJEbHNSZXFTYW5pdHkgLSB3cm9uZyBJRV9IVF9DQVAuZWlkX3B0ci0+TGVuID0gJWRcbiIsIGVpZF9wdHItPkxlbikpOworCQkJCX0KKwkJCQlicmVhazsKKworCQkJZGVmYXVsdDoKKwkJCQlicmVhazsKKwkJfQorCisJCWVpZF9wdHIgPSAoUEVJRF9TVFJVQ1QpKChVQ0hBUiopZWlkX3B0ciArIDIgKyBlaWRfcHRyLT5MZW4pOworCX0KKworICAgIHJldHVybiBUUlVFOworfQorCitCT09MRUFOIFBlZXJEbHNSc3BTYW5pdHkoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gVk9JRCAqTXNnLAorICAgIElOIFVMT05HIE1zZ0xlbiwKKyAgICBPVVQgUFVDSEFSIHBEQSwKKyAgICBPVVQgUFVDSEFSIHBTQSwKKyAgICBPVVQgVVNIT1JUICpwQ2FwYWJpbGl0eUluZm8sCisgICAgT1VUIFVTSE9SVCAqcFN0YXR1cywKKyAgICBPVVQgVUNIQVIgKnBSYXRlc0xlbiwKKyAgICBPVVQgVUNIQVIgUmF0ZXNbXSwKKyAgICBPVVQgVUNIQVIgKnBIdENhcGFiaWxpdHlMZW4sCisgICAgT1VUIEhUX0NBUEFCSUxJVFlfSUUgKnBIdENhcGFiaWxpdHkpCit7CisgICAgQ0hBUiAgICAgICAgICAgICpQdHI7CisgICAgUEZSQU1FXzgwMl8xMQlGciA9IChQRlJBTUVfODAyXzExKU1zZzsKKwlQRUlEX1NUUlVDVCAgZWlkX3B0cjsKKworICAgIC8vIHRvIHByZXZlbnQgY2FsbGVyIGZyb20gdXNpbmcgZ2FyYmFnZSBvdXRwdXQgdmFsdWUKKyAgICAqcFN0YXR1cwkJPSAwOworICAgICpwQ2FwYWJpbGl0eUluZm8JPSAwOworCSpwSHRDYXBhYmlsaXR5TGVuID0gMDsKKworICAgIFB0ciA9IEZyLT5PY3RldDsKKworCS8vIG9mZnNldCB0byBkZXN0aW5hdGlvbiBNQUMgYWRkcmVzcyAoQ2F0ZWdvcnkgYW5kIEFjdGlvbiBmaWVsZCkKKyAgICBQdHIgKz0gMjsKKworCS8vIGdldCBzdGF0dXMgY29kZSBmcm9tIHBheWxvYWQgYW5kIGFkdmFuY2UgdGhlIHBvaW50ZXIKKyAgICBOZGlzTW92ZU1lbW9yeShwU3RhdHVzLCBQdHIsIDIpOworICAgIFB0ciArPSAyOworCisgICAgLy8gZ2V0IERBIGZyb20gcGF5bG9hZCBhbmQgYWR2YW5jZSB0aGUgcG9pbnRlcgorICAgIE5kaXNNb3ZlTWVtb3J5KHBEQSwgUHRyLCBNQUNfQUREUl9MRU4pOworICAgIFB0ciArPSBNQUNfQUREUl9MRU47CisKKyAgICAvLyBnZXQgU0EgZnJvbSBwYXlsb2FkIGFuZCBhZHZhbmNlIHRoZSBwb2ludGVyCisgICAgTmRpc01vdmVNZW1vcnkocFNBLCBQdHIsIE1BQ19BRERSX0xFTik7CisgICAgUHRyICs9IE1BQ19BRERSX0xFTjsKKworCWlmIChwU3RhdHVzID09IDApCisJeworCSAgICAvLyBnZXQgY2FwYWJpbGl0eSBpbmZvIGZyb20gcGF5bG9hZCBhbmQgYWR2YW5jZSB0aGUgcG9pbnRlcgorCSAgICBOZGlzTW92ZU1lbW9yeShwQ2FwYWJpbGl0eUluZm8sIFB0ciwgMik7CisJICAgIFB0ciArPSAyOworCX0KKworCS8vIENhdGVnb3J5IGFuZCBBY3Rpb24gZmllbGQgKyBzdGF0dXMgY29kZSArIERBICsgU0EgKyBjYXBhYmlsaXR5CisJZWlkX3B0ciA9IChQRUlEX1NUUlVDVCkgJkZyLT5PY3RldFsxOF07CisKKwl3aGlsZSAoKChVQ0hBUiopZWlkX3B0ciArIGVpZF9wdHItPkxlbiArIDEpIDwgKChVQ0hBUiopRnIgKyBNc2dMZW4pKQorCXsKKwkJc3dpdGNoKGVpZF9wdHItPkVpZCkKKwkJeworCQkJY2FzZSBJRV9TVVBQX1JBVEVTOgorICAgICAgICAgICAgICAgIGlmICgoZWlkX3B0ci0+TGVuIDw9IE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTKSAmJiAoZWlkX3B0ci0+TGVuID4gMCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShSYXRlcywgZWlkX3B0ci0+T2N0ZXQsIGVpZF9wdHItPkxlbik7CisgICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXJEbHNSc3BTYW5pdHkgLSBJRV9TVVBQX1JBVEVTLiwgTGVuPSVkLiBSYXRlc1swXT0leFxuIixlaWRfcHRyLT5MZW4sIFJhdGVzWzBdKSk7CisgICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJhdGVzWzFdPSV4ICV4ICV4ICV4ICV4ICV4ICV4XG4iLCBSYXRlc1sxXSwgUmF0ZXNbMl0sIFJhdGVzWzNdLCBSYXRlc1s0XSwgUmF0ZXNbNV0sIFJhdGVzWzZdLCBSYXRlc1s3XSkpOworICAgICAgICAgICAgICAgICAgICAqcFJhdGVzTGVuID0gZWlkX3B0ci0+TGVuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAqcFJhdGVzTGVuID0gODsKKwkJCQkJUmF0ZXNbMF0gPSAweDgyOworCQkJCQlSYXRlc1sxXSA9IDB4ODQ7CisJCQkJCVJhdGVzWzJdID0gMHg4YjsKKwkJCQkJUmF0ZXNbM10gPSAweDk2OworCQkJCQlSYXRlc1s0XSA9IDB4MTI7CisJCQkJCVJhdGVzWzVdID0gMHgyNDsKKwkJCQkJUmF0ZXNbNl0gPSAweDQ4OworCQkJCQlSYXRlc1s3XSA9IDB4NmM7CisgICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXJEbHNSc3BTYW5pdHkgLSB3cm9uZyBJRV9TVVBQX1JBVEVTLiwgTGVuPSVkXG4iLGVpZF9wdHItPkxlbikpOworICAgICAgICAgICAgICAgIH0KKwkJCQlicmVhazsKKworCQkJY2FzZSBJRV9FWFRfU1VQUF9SQVRFUzoKKyAgICAgICAgICAgICAgICBpZiAoZWlkX3B0ci0+TGVuICsgKnBSYXRlc0xlbiA8PSBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KCZSYXRlc1sqcFJhdGVzTGVuXSwgZWlkX3B0ci0+T2N0ZXQsIGVpZF9wdHItPkxlbik7CisgICAgICAgICAgICAgICAgICAgICpwUmF0ZXNMZW4gPSAoKnBSYXRlc0xlbikgKyBlaWRfcHRyLT5MZW47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KCZSYXRlc1sqcFJhdGVzTGVuXSwgZWlkX3B0ci0+T2N0ZXQsIE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTIC0gKCpwUmF0ZXNMZW4pKTsKKyAgICAgICAgICAgICAgICAgICAgKnBSYXRlc0xlbiA9IE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTOworICAgICAgICAgICAgICAgIH0KKwkJCQlicmVhazsKKworCQkJY2FzZSBJRV9IVF9DQVA6CisJCQkJaWYgKGVpZF9wdHItPkxlbiA+PSBzaXplb2YoSFRfQ0FQQUJJTElUWV9JRSkpCisJCQkJeworCQkJCQlOZGlzTW92ZU1lbW9yeShwSHRDYXBhYmlsaXR5LCBlaWRfcHRyLT5PY3RldCwgc2l6ZW9mKEhUX0NBUEFCSUxJVFlfSUUpKTsKKworCQkJCQkqKFVTSE9SVCAqKSgmcEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvKSA9IGNwdTJsZTE2KCooVVNIT1JUICopKCZwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8pKTsKKwkJCQkJKihVU0hPUlQgKikoJnBIdENhcGFiaWxpdHktPkV4dEh0Q2FwSW5mbykgPSBjcHUybGUxNigqKFVTSE9SVCAqKSgmcEh0Q2FwYWJpbGl0eS0+RXh0SHRDYXBJbmZvKSk7CisJCQkJCSpwSHRDYXBhYmlsaXR5TGVuID0gc2l6ZW9mKEhUX0NBUEFCSUxJVFlfSUUpOworCisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXJEbHNSc3BTYW5pdHkgLSBJRV9IVF9DQVBcbiIpKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGVlckRsc1JzcFNhbml0eSAtIHdyb25nIElFX0hUX0NBUC5laWRfcHRyLT5MZW4gPSAlZFxuIiwgZWlkX3B0ci0+TGVuKSk7CisJCQkJfQorCQkJCWJyZWFrOworCisJCQlkZWZhdWx0OgorCQkJCWJyZWFrOworCQl9CisKKwkJZWlkX3B0ciA9IChQRUlEX1NUUlVDVCkoKFVDSEFSKillaWRfcHRyICsgMiArIGVpZF9wdHItPkxlbik7CisJfQorCisgICAgcmV0dXJuIFRSVUU7Cit9CisKK0JPT0xFQU4gUGVlckRsc1RlYXJEb3duU2FuaXR5KAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIFZPSUQgKk1zZywKKyAgICBJTiBVTE9ORyBNc2dMZW4sCisgICAgT1VUIFBVQ0hBUiBwREEsCisgICAgT1VUIFBVQ0hBUiBwU0EsCisgICAgT1VUIFVTSE9SVCAqcFJlYXNvbikKK3sKKyAgICBDSEFSICAgICAgICAgICAgKlB0cjsKKyAgICBQRlJBTUVfODAyXzExCUZyID0gKFBGUkFNRV84MDJfMTEpTXNnOworCisgICAgLy8gdG8gcHJldmVudCBjYWxsZXIgZnJvbSB1c2luZyBnYXJiYWdlIG91dHB1dCB2YWx1ZQorICAgICpwUmVhc29uCT0gMDsKKworICAgIFB0ciA9IEZyLT5PY3RldDsKKworCS8vIG9mZnNldCB0byBkZXN0aW5hdGlvbiBNQUMgYWRkcmVzcyAoQ2F0ZWdvcnkgYW5kIEFjdGlvbiBmaWVsZCkKKyAgICBQdHIgKz0gMjsKKworICAgIC8vIGdldCBEQSBmcm9tIHBheWxvYWQgYW5kIGFkdmFuY2UgdGhlIHBvaW50ZXIKKyAgICBOZGlzTW92ZU1lbW9yeShwREEsIFB0ciwgTUFDX0FERFJfTEVOKTsKKyAgICBQdHIgKz0gTUFDX0FERFJfTEVOOworCisgICAgLy8gZ2V0IFNBIGZyb20gcGF5bG9hZCBhbmQgYWR2YW5jZSB0aGUgcG9pbnRlcgorICAgIE5kaXNNb3ZlTWVtb3J5KHBTQSwgUHRyLCBNQUNfQUREUl9MRU4pOworICAgIFB0ciArPSBNQUNfQUREUl9MRU47CisKKwkvLyBnZXQgcmVhc29uIGNvZGUgZnJvbSBwYXlsb2FkIGFuZCBhZHZhbmNlIHRoZSBwb2ludGVyCisgICAgTmRpc01vdmVNZW1vcnkocFJlYXNvbiwgUHRyLCAyKTsKKyAgICBQdHIgKz0gMjsKKworICAgIHJldHVybiBUUlVFOworfQorI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9jbW1fc3luYy5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vY21tX3N5bmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGU0MTA5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vY21tX3N5bmMuYwpAQCAtMCwwICsxLDcwMiBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwlNb2R1bGUgTmFtZToKKwlzeW5jLmMKKworCUFic3RyYWN0OgorCisJUmV2aXNpb24gSGlzdG9yeToKKwlXaG8JCQlXaGVuCQkJV2hhdAorCS0tLS0tLS0tCS0tLS0tLS0tLS0JCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlKb2huIENoYW5nCTIwMDQtMDktMDEgICAgICBtb2RpZmllZCBmb3IgcnQyNTYxLzI2NjEKKyovCisjaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCisKKy8vIDIuNCBHaHogY2hhbm5lbCBwbGFuIGluZGV4IGluIHRoZSBUeFBvd2VyIGFycmF5cy4KKyNkZWZpbmUJQkdfQkFORF9SRUdJT05fMF9TVEFSVAkwCQkJLy8gMSwyLDMsNCw1LDYsNyw4LDksMTAsMTEKKyNkZWZpbmUJQkdfQkFORF9SRUdJT05fMF9TSVpFCTExCisjZGVmaW5lCUJHX0JBTkRfUkVHSU9OXzFfU1RBUlQJMAkJCS8vIDEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyLDEzCisjZGVmaW5lCUJHX0JBTkRfUkVHSU9OXzFfU0laRQkxMworI2RlZmluZQlCR19CQU5EX1JFR0lPTl8yX1NUQVJUCTkJCQkvLyAxMCwxMQorI2RlZmluZQlCR19CQU5EX1JFR0lPTl8yX1NJWkUJMgorI2RlZmluZQlCR19CQU5EX1JFR0lPTl8zX1NUQVJUCTkJCQkvLyAxMCwxMSwxMiwxMworI2RlZmluZQlCR19CQU5EX1JFR0lPTl8zX1NJWkUJNAorI2RlZmluZQlCR19CQU5EX1JFR0lPTl80X1NUQVJUCTEzCQkJLy8gMTQKKyNkZWZpbmUJQkdfQkFORF9SRUdJT05fNF9TSVpFCTEKKyNkZWZpbmUJQkdfQkFORF9SRUdJT05fNV9TVEFSVAkwCQkJLy8gMSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIsMTMsMTQKKyNkZWZpbmUJQkdfQkFORF9SRUdJT05fNV9TSVpFCTE0CisjZGVmaW5lCUJHX0JBTkRfUkVHSU9OXzZfU1RBUlQJMgkJCS8vIDMsNCw1LDYsNyw4LDkKKyNkZWZpbmUJQkdfQkFORF9SRUdJT05fNl9TSVpFCTcKKyNkZWZpbmUJQkdfQkFORF9SRUdJT05fN19TVEFSVAk0CQkJLy8gNSw2LDcsOCw5LDEwLDExLDEyLDEzCisjZGVmaW5lCUJHX0JBTkRfUkVHSU9OXzdfU0laRQk5CisjZGVmaW5lCUJHX0JBTkRfUkVHSU9OXzMxX1NUQVJUCTAJCQkvLyAxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNAorI2RlZmluZQlCR19CQU5EX1JFR0lPTl8zMV9TSVpFCTE0CisKKy8vIDUgR2h6IGNoYW5uZWwgcGxhbiBpbmRleCBpbiB0aGUgVHhQb3dlciBhcnJheXMuCitVQ0hBUiBBX0JBTkRfUkVHSU9OXzBfQ0hBTk5FTF9MSVNUW109ezM2LCA0MCwgNDQsIDQ4LCA1MiwgNTYsIDYwLCA2NCwgMTQ5LCAxNTMsIDE1NywgMTYxLCAxNjV9OworVUNIQVIgQV9CQU5EX1JFR0lPTl8xX0NIQU5ORUxfTElTVFtdPXszNiwgNDAsIDQ0LCA0OCwgNTIsIDU2LCA2MCwgNjQsIDEwMCwgMTA0LCAxMDgsIDExMiwgMTE2LCAxMjAsIDEyNCwgMTI4LCAxMzIsIDEzNiwgMTQwfTsKK1VDSEFSIEFfQkFORF9SRUdJT05fMl9DSEFOTkVMX0xJU1RbXT17MzYsIDQwLCA0NCwgNDgsIDUyLCA1NiwgNjAsIDY0fTsKK1VDSEFSIEFfQkFORF9SRUdJT05fM19DSEFOTkVMX0xJU1RbXT17NTIsIDU2LCA2MCwgNjQsIDE0OSwgMTUzLCAxNTcsIDE2MX07CitVQ0hBUiBBX0JBTkRfUkVHSU9OXzRfQ0hBTk5FTF9MSVNUW109ezE0OSwgMTUzLCAxNTcsIDE2MSwgMTY1fTsKK1VDSEFSIEFfQkFORF9SRUdJT05fNV9DSEFOTkVMX0xJU1RbXT17MTQ5LCAxNTMsIDE1NywgMTYxfTsKK1VDSEFSIEFfQkFORF9SRUdJT05fNl9DSEFOTkVMX0xJU1RbXT17MzYsIDQwLCA0NCwgNDh9OworVUNIQVIgQV9CQU5EX1JFR0lPTl83X0NIQU5ORUxfTElTVFtdPXszNiwgNDAsIDQ0LCA0OCwgNTIsIDU2LCA2MCwgNjQsIDEwMCwgMTA0LCAxMDgsIDExMiwgMTE2LCAxMjAsIDEyNCwgMTI4LCAxMzIsIDEzNiwgMTQwLCAxNDksIDE1MywgMTU3LCAxNjEsIDE2NX07CitVQ0hBUiBBX0JBTkRfUkVHSU9OXzhfQ0hBTk5FTF9MSVNUW109ezUyLCA1NiwgNjAsIDY0fTsKK1VDSEFSIEFfQkFORF9SRUdJT05fOV9DSEFOTkVMX0xJU1RbXT17MzYsIDQwLCA0NCwgNDgsIDUyLCA1NiwgNjAsIDY0LCAxMDAsIDEwNCwgMTA4LCAxMTIsIDExNiwgMTMyLCAxMzYsIDE0MCwgMTQ5LCAxNTMsIDE1NywgMTYxLCAxNjV9OworVUNIQVIgQV9CQU5EX1JFR0lPTl8xMF9DSEFOTkVMX0xJU1RbXT17MzYsIDQwLCA0NCwgNDgsIDE0OSwgMTUzLCAxNTcsIDE2MSwgMTY1fTsKK1VDSEFSIEFfQkFORF9SRUdJT05fMTFfQ0hBTk5FTF9MSVNUW109ezM2LCA0MCwgNDQsIDQ4LCA1MiwgNTYsIDYwLCA2NCwgMTAwLCAxMDQsIDEwOCwgMTEyLCAxMTYsIDEyMCwgMTQ5LCAxNTMsIDE1NywgMTYxfTsKKworLy9CYVNpemVBcnJheSBmb2xsb3dzIHRoZSA4MDIuMTFuIGRlZmluaXRpb24gYXMgTWF4UnhGYWN0b3IuICAyXigxMytmYWN0b3IpIGJ5dGVzLiBXaGVuIGZhY3RvciA9MCwgaXQncyBhYm91dCBCYSBidWZmZXIgc2l6ZSA9OC4KK1VDSEFSIEJhU2l6ZUFycmF5WzRdID0gezgsMTYsMzIsNjR9OworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVVwZGF0ZSBTdGFDZmctPkNoYW5uZWxMaXN0W10gYWNjb3JkaW5nIHRvIDEpIENvdW50cnkgUmVnaW9uIDIpIFJGIElDIHR5cGUsCisJCWFuZCAzKSBQSFktbW9kZSB1c2VyIHNlbGVjdGVkLgorCQlUaGUgb3V0Y29tZSBpcyB1c2VkIGJ5IGRyaXZlciB3aGVuIGRvaW5nIHNpdGUgc3VydmV5LgorCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgQnVpbGRDaGFubmVsTGlzdCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlVQ0hBUiBpLCBqLCBpbmRleD0wLCBudW09MDsKKwlQVUNIQVIJcENoYW5uZWxMaXN0ID0gTlVMTDsKKworCU5kaXNaZXJvTWVtb3J5KHBBZC0+Q2hhbm5lbExpc3QsIE1BWF9OVU1fT0ZfQ0hBTk5FTFMgKiBzaXplb2YoQ0hBTk5FTF9UWF9QT1dFUikpOworCisJLy8gaWYgbm90IDExYS1vbmx5IG1vZGUsIGNoYW5uZWwgbGlzdCBzdGFydHMgZnJvbSAyLjRHaHogYmFuZAorCWlmICgocEFkLT5Db21tb25DZmcuUGh5TW9kZSAhPSBQSFlfMTFBKQorI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkmJiAocEFkLT5Db21tb25DZmcuUGh5TW9kZSAhPSBQSFlfMTFBTl9NSVhFRCkgJiYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgIT0gUEhZXzExTl81RykKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkpCisJeworCQlzd2l0Y2ggKHBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb24gICYgMHg3ZikKKwkJeworCQkJY2FzZSBSRUdJT05fMF9CR19CQU5EOgkvLyAxIC0xMQorCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPkNoYW5uZWxMaXN0W2luZGV4XSwgJnBBZC0+VHhQb3dlcltCR19CQU5EX1JFR0lPTl8wX1NUQVJUXSwgc2l6ZW9mKENIQU5ORUxfVFhfUE9XRVIpICogQkdfQkFORF9SRUdJT05fMF9TSVpFKTsKKwkJCQlpbmRleCArPSBCR19CQU5EX1JFR0lPTl8wX1NJWkU7CisJCQkJYnJlYWs7CisJCQljYXNlIFJFR0lPTl8xX0JHX0JBTkQ6CS8vIDEgLSAxMworCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPkNoYW5uZWxMaXN0W2luZGV4XSwgJnBBZC0+VHhQb3dlcltCR19CQU5EX1JFR0lPTl8xX1NUQVJUXSwgc2l6ZW9mKENIQU5ORUxfVFhfUE9XRVIpICogQkdfQkFORF9SRUdJT05fMV9TSVpFKTsKKwkJCQlpbmRleCArPSBCR19CQU5EX1JFR0lPTl8xX1NJWkU7CisJCQkJYnJlYWs7CisJCQljYXNlIFJFR0lPTl8yX0JHX0JBTkQ6CS8vIDEwIC0gMTEKKwkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5DaGFubmVsTGlzdFtpbmRleF0sICZwQWQtPlR4UG93ZXJbQkdfQkFORF9SRUdJT05fMl9TVEFSVF0sIHNpemVvZihDSEFOTkVMX1RYX1BPV0VSKSAqIEJHX0JBTkRfUkVHSU9OXzJfU0laRSk7CisJCQkJaW5kZXggKz0gQkdfQkFORF9SRUdJT05fMl9TSVpFOworCQkJCWJyZWFrOworCQkJY2FzZSBSRUdJT05fM19CR19CQU5EOgkvLyAxMCAtIDEzCisJCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+Q2hhbm5lbExpc3RbaW5kZXhdLCAmcEFkLT5UeFBvd2VyW0JHX0JBTkRfUkVHSU9OXzNfU1RBUlRdLCBzaXplb2YoQ0hBTk5FTF9UWF9QT1dFUikgKiBCR19CQU5EX1JFR0lPTl8zX1NJWkUpOworCQkJCWluZGV4ICs9IEJHX0JBTkRfUkVHSU9OXzNfU0laRTsKKwkJCQlicmVhazsKKwkJCWNhc2UgUkVHSU9OXzRfQkdfQkFORDoJLy8gMTQKKwkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5DaGFubmVsTGlzdFtpbmRleF0sICZwQWQtPlR4UG93ZXJbQkdfQkFORF9SRUdJT05fNF9TVEFSVF0sIHNpemVvZihDSEFOTkVMX1RYX1BPV0VSKSAqIEJHX0JBTkRfUkVHSU9OXzRfU0laRSk7CisJCQkJaW5kZXggKz0gQkdfQkFORF9SRUdJT05fNF9TSVpFOworCQkJCWJyZWFrOworCQkJY2FzZSBSRUdJT05fNV9CR19CQU5EOgkvLyAxIC0gMTQKKwkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5DaGFubmVsTGlzdFtpbmRleF0sICZwQWQtPlR4UG93ZXJbQkdfQkFORF9SRUdJT05fNV9TVEFSVF0sIHNpemVvZihDSEFOTkVMX1RYX1BPV0VSKSAqIEJHX0JBTkRfUkVHSU9OXzVfU0laRSk7CisJCQkJaW5kZXggKz0gQkdfQkFORF9SRUdJT05fNV9TSVpFOworCQkJCWJyZWFrOworCQkJY2FzZSBSRUdJT05fNl9CR19CQU5EOgkvLyAzIC0gOQorCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPkNoYW5uZWxMaXN0W2luZGV4XSwgJnBBZC0+VHhQb3dlcltCR19CQU5EX1JFR0lPTl82X1NUQVJUXSwgc2l6ZW9mKENIQU5ORUxfVFhfUE9XRVIpICogQkdfQkFORF9SRUdJT05fNl9TSVpFKTsKKwkJCQlpbmRleCArPSBCR19CQU5EX1JFR0lPTl82X1NJWkU7CisJCQkJYnJlYWs7CisJCQljYXNlIFJFR0lPTl83X0JHX0JBTkQ6ICAvLyA1IC0gMTMKKwkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5DaGFubmVsTGlzdFtpbmRleF0sICZwQWQtPlR4UG93ZXJbQkdfQkFORF9SRUdJT05fN19TVEFSVF0sIHNpemVvZihDSEFOTkVMX1RYX1BPV0VSKSAqIEJHX0JBTkRfUkVHSU9OXzdfU0laRSk7CisJCQkJaW5kZXggKz0gQkdfQkFORF9SRUdJT05fN19TSVpFOworCQkJCWJyZWFrOworCQkJY2FzZSBSRUdJT05fMzFfQkdfQkFORDoJLy8gMSAtIDE0CisJCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+Q2hhbm5lbExpc3RbaW5kZXhdLCAmcEFkLT5UeFBvd2VyW0JHX0JBTkRfUkVHSU9OXzMxX1NUQVJUXSwgc2l6ZW9mKENIQU5ORUxfVFhfUE9XRVIpICogQkdfQkFORF9SRUdJT05fMzFfU0laRSk7CisJCQkJaW5kZXggKz0gQkdfQkFORF9SRUdJT05fMzFfU0laRTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6ICAgICAgICAgICAgLy8gRXJyb3IuIHNob3VsZCBuZXZlciBoYXBwZW4KKwkJCQlicmVhazsKKwkJfQorCQlmb3IgKGk9MDsgaTxpbmRleDsgaSsrKQorCQkJcEFkLT5DaGFubmVsTGlzdFtpXS5NYXhUeFB3ciA9IDIwOworCX0KKworCWlmICgocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFBKSB8fCAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFBQkdfTUlYRUQpCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCXx8IChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUFCR05fTUlYRUQpIHx8IChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUFOX01JWEVEKQorCQl8fCAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFBR05fTUlYRUQpIHx8IChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMU5fNUcpCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJKQorCXsKKwkJc3dpdGNoIChwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uRm9yQUJhbmQgJiAweDdmKQorCQl7CisJCQljYXNlIFJFR0lPTl8wX0FfQkFORDoKKwkJCQludW0gPSBzaXplb2YoQV9CQU5EX1JFR0lPTl8wX0NIQU5ORUxfTElTVCkvc2l6ZW9mKFVDSEFSKTsKKwkJCQlwQ2hhbm5lbExpc3QgPSBBX0JBTkRfUkVHSU9OXzBfQ0hBTk5FTF9MSVNUOworCQkJCWJyZWFrOworCQkJY2FzZSBSRUdJT05fMV9BX0JBTkQ6CisJCQkJbnVtID0gc2l6ZW9mKEFfQkFORF9SRUdJT05fMV9DSEFOTkVMX0xJU1QpL3NpemVvZihVQ0hBUik7CisJCQkJcENoYW5uZWxMaXN0ID0gQV9CQU5EX1JFR0lPTl8xX0NIQU5ORUxfTElTVDsKKwkJCQlicmVhazsKKwkJCWNhc2UgUkVHSU9OXzJfQV9CQU5EOgorCQkJCW51bSA9IHNpemVvZihBX0JBTkRfUkVHSU9OXzJfQ0hBTk5FTF9MSVNUKS9zaXplb2YoVUNIQVIpOworCQkJCXBDaGFubmVsTGlzdCA9IEFfQkFORF9SRUdJT05fMl9DSEFOTkVMX0xJU1Q7CisJCQkJYnJlYWs7CisJCQljYXNlIFJFR0lPTl8zX0FfQkFORDoKKwkJCQludW0gPSBzaXplb2YoQV9CQU5EX1JFR0lPTl8zX0NIQU5ORUxfTElTVCkvc2l6ZW9mKFVDSEFSKTsKKwkJCQlwQ2hhbm5lbExpc3QgPSBBX0JBTkRfUkVHSU9OXzNfQ0hBTk5FTF9MSVNUOworCQkJCWJyZWFrOworCQkJY2FzZSBSRUdJT05fNF9BX0JBTkQ6CisJCQkJbnVtID0gc2l6ZW9mKEFfQkFORF9SRUdJT05fNF9DSEFOTkVMX0xJU1QpL3NpemVvZihVQ0hBUik7CisJCQkJcENoYW5uZWxMaXN0ID0gQV9CQU5EX1JFR0lPTl80X0NIQU5ORUxfTElTVDsKKwkJCQlicmVhazsKKwkJCWNhc2UgUkVHSU9OXzVfQV9CQU5EOgorCQkJCW51bSA9IHNpemVvZihBX0JBTkRfUkVHSU9OXzVfQ0hBTk5FTF9MSVNUKS9zaXplb2YoVUNIQVIpOworCQkJCXBDaGFubmVsTGlzdCA9IEFfQkFORF9SRUdJT05fNV9DSEFOTkVMX0xJU1Q7CisJCQkJYnJlYWs7CisJCQljYXNlIFJFR0lPTl82X0FfQkFORDoKKwkJCQludW0gPSBzaXplb2YoQV9CQU5EX1JFR0lPTl82X0NIQU5ORUxfTElTVCkvc2l6ZW9mKFVDSEFSKTsKKwkJCQlwQ2hhbm5lbExpc3QgPSBBX0JBTkRfUkVHSU9OXzZfQ0hBTk5FTF9MSVNUOworCQkJCWJyZWFrOworCQkJY2FzZSBSRUdJT05fN19BX0JBTkQ6CisJCQkJbnVtID0gc2l6ZW9mKEFfQkFORF9SRUdJT05fN19DSEFOTkVMX0xJU1QpL3NpemVvZihVQ0hBUik7CisJCQkJcENoYW5uZWxMaXN0ID0gQV9CQU5EX1JFR0lPTl83X0NIQU5ORUxfTElTVDsKKwkJCQlicmVhazsKKwkJCWNhc2UgUkVHSU9OXzhfQV9CQU5EOgorCQkJCW51bSA9IHNpemVvZihBX0JBTkRfUkVHSU9OXzhfQ0hBTk5FTF9MSVNUKS9zaXplb2YoVUNIQVIpOworCQkJCXBDaGFubmVsTGlzdCA9IEFfQkFORF9SRUdJT05fOF9DSEFOTkVMX0xJU1Q7CisJCQkJYnJlYWs7CisJCQljYXNlIFJFR0lPTl85X0FfQkFORDoKKwkJCQludW0gPSBzaXplb2YoQV9CQU5EX1JFR0lPTl85X0NIQU5ORUxfTElTVCkvc2l6ZW9mKFVDSEFSKTsKKwkJCQlwQ2hhbm5lbExpc3QgPSBBX0JBTkRfUkVHSU9OXzlfQ0hBTk5FTF9MSVNUOworCQkJCWJyZWFrOworCisJCQljYXNlIFJFR0lPTl8xMF9BX0JBTkQ6CisJCQkJbnVtID0gc2l6ZW9mKEFfQkFORF9SRUdJT05fMTBfQ0hBTk5FTF9MSVNUKS9zaXplb2YoVUNIQVIpOworCQkJCXBDaGFubmVsTGlzdCA9IEFfQkFORF9SRUdJT05fMTBfQ0hBTk5FTF9MSVNUOworCQkJCWJyZWFrOworCisJCQljYXNlIFJFR0lPTl8xMV9BX0JBTkQ6CisJCQkJbnVtID0gc2l6ZW9mKEFfQkFORF9SRUdJT05fMTFfQ0hBTk5FTF9MSVNUKS9zaXplb2YoVUNIQVIpOworCQkJCXBDaGFubmVsTGlzdCA9IEFfQkFORF9SRUdJT05fMTFfQ0hBTk5FTF9MSVNUOworCQkJCWJyZWFrOworCisJCQlkZWZhdWx0OiAgICAgICAgICAgIC8vIEVycm9yLiBzaG91bGQgbmV2ZXIgaGFwcGVuCisJCQkJREJHUFJJTlQoUlRfREVCVUdfV0FSTiwoImNvdW50cnlyZWdpb249JWQgbm90IHN1cHBvcnQiLCBwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uRm9yQUJhbmQpKTsKKwkJCQlicmVhazsKKwkJfQorCisJCWlmIChudW0gIT0gMCkKKwkJeworCQkJVUNIQVIgUmFkYXJDaFsxNV09ezUyLCA1NiwgNjAsIDY0LCAxMDAsIDEwNCwgMTA4LCAxMTIsIDExNiwgMTIwLCAxMjQsIDEyOCwgMTMyLCAxMzYsIDE0MH07CisJCQlmb3IgKGk9MDsgaTxudW07IGkrKykKKwkJCXsKKwkJCQlmb3IgKGo9MDsgajxNQVhfTlVNX09GX0NIQU5ORUxTOyBqKyspCisJCQkJeworCQkJCQlpZiAocENoYW5uZWxMaXN0W2ldID09IHBBZC0+VHhQb3dlcltqXS5DaGFubmVsKQorCQkJCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+Q2hhbm5lbExpc3RbaW5kZXgraV0sICZwQWQtPlR4UG93ZXJbal0sIHNpemVvZihDSEFOTkVMX1RYX1BPV0VSKSk7CisJCQkJCX0KKwkJCQlmb3IgKGo9MDsgajwxNTsgaisrKQorCQkJCXsKKwkJCQkJaWYgKHBDaGFubmVsTGlzdFtpXSA9PSBSYWRhckNoW2pdKQorCQkJCQkJcEFkLT5DaGFubmVsTGlzdFtpbmRleCtpXS5EZnNSZXEgPSBUUlVFOworCQkJCX0KKwkJCQlwQWQtPkNoYW5uZWxMaXN0W2luZGV4K2ldLk1heFR4UHdyID0gMjA7CisJCQl9CisJCQlpbmRleCArPSBudW07CisJCX0KKwl9CisKKwlwQWQtPkNoYW5uZWxMaXN0TnVtID0gaW5kZXg7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJjb3VudHJ5IGNvZGU9JWQvJWQsIFJGSUM9JWQsIFBIWSBtb2RlPSVkLCBzdXBwb3J0ICVkIGNoYW5uZWxzXG4iLAorCQlwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uLCBwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uRm9yQUJhbmQsIHBBZC0+UmZJY1R5cGUsIHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUsIHBBZC0+Q2hhbm5lbExpc3ROdW0pKTsKKyNpZmRlZiBEQkcKKwlmb3IgKGk9MDtpPHBBZC0+Q2hhbm5lbExpc3ROdW07aSsrKQorCXsKKwkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCgiQnVpbGRDaGFubmVsICMgJWQgOjogUHdyMCA9ICVkLCBQd3IxID0lZCwgXG4gIiwgcEFkLT5DaGFubmVsTGlzdFtpXS5DaGFubmVsLCBwQWQtPkNoYW5uZWxMaXN0W2ldLlBvd2VyLCBwQWQtPkNoYW5uZWxMaXN0W2ldLlBvd2VyMikpOworCX0KKyNlbmRpZgorfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVRoaXMgcm91dGluZSByZXR1cm4gdGhlIGZpcnN0IGNoYW5uZWwgbnVtYmVyIGFjY29yZGluZyB0byB0aGUgY291bnRyeQorCQljb2RlIHNlbGVjdGlvbiBhbmQgUkYgSUMgc2VsZWN0aW9uIChzaWduYWwgYmFuZCBvciBkdWFsIGJhbmQpLiBJdCBpcyBjYWxsZWQKKwkJd2hlbmV2ZXIgZHJpdmVyIG5lZWQgdG8gc3RhcnQgYSBzaXRlIHN1cnZleSBvZiBhbGwgc3VwcG9ydGVkIGNoYW5uZWxzLgorCVJldHVybjoKKwkJY2ggLSB0aGUgZmlyc3QgY2hhbm5lbCBudW1iZXIgb2YgY3VycmVudCBjb3VudHJ5IGNvZGUgc2V0dGluZworCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1VDSEFSIEZpcnN0Q2hhbm5lbCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlyZXR1cm4gcEFkLT5DaGFubmVsTGlzdFswXS5DaGFubmVsOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVRoaXMgcm91dGluZSByZXR1cm5zIHRoZSBuZXh0IGNoYW5uZWwgbnVtYmVyLiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkCisJCWR1cmluZyBkcml2ZXIgbmVlZCB0byBzdGFydCBhIHNpdGUgc3VydmV5IG9mIGFsbCBzdXBwb3J0ZWQgY2hhbm5lbHMuCisJUmV0dXJuOgorCQluZXh0X2NoYW5uZWwgLSB0aGUgbmV4dCBjaGFubmVsIG51bWJlciB2YWxpZCBpbiBjdXJyZW50IGNvdW50cnkgY29kZSBzZXR0aW5nLgorCU5vdGU6CisJCXJldHVybiAwIGlmIG5vIG1vcmUgbmV4dCBjaGFubmVsCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVUNIQVIgTmV4dENoYW5uZWwoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVUNIQVIgY2hhbm5lbCkKK3sKKwlpbnQgaTsKKwlVQ0hBUiBuZXh0X2NoYW5uZWwgPSAwOworCisJZm9yIChpID0gMDsgaSA8IChwQWQtPkNoYW5uZWxMaXN0TnVtIC0gMSk7IGkrKykKKwkJaWYgKGNoYW5uZWwgPT0gcEFkLT5DaGFubmVsTGlzdFtpXS5DaGFubmVsKQorCQl7CisJCQluZXh0X2NoYW5uZWwgPSBwQWQtPkNoYW5uZWxMaXN0W2krMV0uQ2hhbm5lbDsKKwkJCWJyZWFrOworCX0KKwlyZXR1cm4gbmV4dF9jaGFubmVsOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVRoaXMgcm91dGluZSBpcyBmb3IgQ2lzY28gQ29tcGF0aWJsZSBFeHRlbnNpb25zIDIuWAorCQlTcGVjMzEuIEFQIENvbnRyb2wgb2YgQ2xpZW50IFRyYW5zbWl0IFBvd2VyCisJUmV0dXJuOgorCQlOb25lCisJTm90ZToKKwkgICBSZXF1aXJlZCBieSBBaXJvbmV0IGRCbShtVykKKwkJICAgMGRCbSgxbVcpLCAgIDFkQm0oNW1XKSwgMTNkQm0oMjBtVyksIDE1ZEJtKDMwbVcpLAorCQkgIDE3ZEJtKDUwbXcpLCAyMGRCbSgxMDBtVykKKworCSAgIFdlIHN1cHBvcnRlZAorCQkgICAzZEJtKExvd2VzdCksIDZkQm0oMTAlKSwgOWRCbSgyNSUpLCAxMmRCbSg1MCUpLAorCQkgIDE0ZEJtKDc1JSksICAgMTVkQm0oMTAwJSkKKworCQlUaGUgY2xpZW50IHN0YXRpb24ncyBhY3R1YWwgdHJhbnNtaXQgcG93ZXIgc2hhbGwgYmUgd2l0aGluICsvLSA1ZEIgb2YKKwkJdGhlIG1pbmltdW0gdmFsdWUgb3IgbmV4dCBsb3dlciB2YWx1ZS4KKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIENoYW5nZVRvQ2VsbFBvd2VyTGltaXQoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVUNIQVIgICAgICAgICBBaXJvbmV0Q2VsbFBvd2VyTGltaXQpCit7CisJLy92YWx1ZCAweEZGIG1lYW5zIHRoYXQgaGFzbid0IGZvdW5kIHBvd2VyIGxpbWl0IGluZm9ybWF0aW9uCisJLy9mcm9tIHRoZSBBUCdzIEJlYWNvbi9Qcm9iZSByZXNwb25zZS4KKwlpZiAoQWlyb25ldENlbGxQb3dlckxpbWl0ID09IDB4RkYpCisJCXJldHVybjsKKworCWlmIChBaXJvbmV0Q2VsbFBvd2VyTGltaXQgPCA2KSAvL1VzZWQgTG93ZXN0IFBvd2VyIFBlcmNlbnRhZ2UuCisJCXBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID0gNjsKKwllbHNlIGlmIChBaXJvbmV0Q2VsbFBvd2VyTGltaXQgPCA5KQorCQlwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA9IDEwOworCWVsc2UgaWYgKEFpcm9uZXRDZWxsUG93ZXJMaW1pdCA8IDEyKQorCQlwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA9IDI1OworCWVsc2UgaWYgKEFpcm9uZXRDZWxsUG93ZXJMaW1pdCA8IDE0KQorCQlwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA9IDUwOworCWVsc2UgaWYgKEFpcm9uZXRDZWxsUG93ZXJMaW1pdCA8IDE1KQorCQlwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA9IDc1OworCWVsc2UKKwkJcEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UgPSAxMDA7IC8vZWxzZSB1c2VkIG1heGltdW0KKworCWlmIChwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA+IHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJEZWZhdWx0KQorCQlwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA9IHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJEZWZhdWx0OworCit9CisKK0NIQVIJQ29udmVydFRvUnNzaSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTglDSEFSCQkJUnNzaSwKKwlJTiAgVUNIQVIgICBSc3NpTnVtYmVyKQoreworCVVDSEFSCVJzc2lPZmZzZXQsIExOQUdhaW47CisKKwkvLyBSc3NpIGVxdWFscyB0byB6ZXJvIHNob3VsZCBiZSBhbiBpbnZhbGlkIHZhbHVlCisJaWYgKFJzc2kgPT0gMCkKKwkJcmV0dXJuIC05OTsKKworCUxOQUdhaW4gPSBHRVRfTE5BX0dBSU4ocEFkKTsKKyAgICBpZiAocEFkLT5MYXRjaFJmUmVncy5DaGFubmVsID4gMTQpCisgICAgeworICAgICAgICBpZiAoUnNzaU51bWJlciA9PSAwKQorCQkJUnNzaU9mZnNldCA9IHBBZC0+QVJzc2lPZmZzZXQwOworCQllbHNlIGlmIChSc3NpTnVtYmVyID09IDEpCisJCQlSc3NpT2Zmc2V0ID0gcEFkLT5BUnNzaU9mZnNldDE7CisJCWVsc2UKKwkJCVJzc2lPZmZzZXQgPSBwQWQtPkFSc3NpT2Zmc2V0MjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYgKFJzc2lOdW1iZXIgPT0gMCkKKwkJCVJzc2lPZmZzZXQgPSBwQWQtPkJHUnNzaU9mZnNldDA7CisJCWVsc2UgaWYgKFJzc2lOdW1iZXIgPT0gMSkKKwkJCVJzc2lPZmZzZXQgPSBwQWQtPkJHUnNzaU9mZnNldDE7CisJCWVsc2UKKwkJCVJzc2lPZmZzZXQgPSBwQWQtPkJHUnNzaU9mZnNldDI7CisgICAgfQorCisgICAgcmV0dXJuICgtMTIgLSBSc3NpT2Zmc2V0IC0gTE5BR2FpbiAtIFJzc2kpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVNjYW4gbmV4dCBjaGFubmVsCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBTY2FuTmV4dENoYW5uZWwoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJSEVBREVSXzgwMl8xMSAgIEhkcjgwMjExOworCVBVQ0hBUiAgICAgICAgICBwT3V0QnVmZmVyID0gTlVMTDsKKwlORElTX1NUQVRVUyAgICAgTlN0YXR1czsKKwlVTE9ORyAgICAgICAgICAgRnJhbWVMZW4gPSAwOworCVVDSEFSICAgICAgICAgICBTc2lkTGVuID0gMCwgU2NhblR5cGUgPSBwQWQtPk1sbWVBdXguU2NhblR5cGUsIEJCUFZhbHVlID0gMDsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlVU0hPUlQgICAgICAgICAgU3RhdHVzOworCVBIRUFERVJfODAyXzExICBwSGRyODAyMTE7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJVUlOVAkJCVNjYW5UaW1lSW41Z0NoYW5uZWwgPSBTSE9SVF9DSEFOTkVMX1RJTUU7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCXsKKwkJaWYgKE1PTklUT1JfT04ocEFkKSkKKwkJCXJldHVybjsKKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKyNpZmRlZiBSQUxJTktfQVRFCisJLy8gTm90aGluZyB0byBkbyBpbiBBVEUgbW9kZS4KKwlpZiAoQVRFX09OKHBBZCkpCisJCXJldHVybjsKKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisKKwlpZiAocEFkLT5NbG1lQXV4LkNoYW5uZWwgPT0gMCkKKwl7CisJCWlmICgocEFkLT5Db21tb25DZmcuQkJQQ3VycmVudEJXID09IEJXXzQwKQorI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQkJJiYgKElORlJBX09OKHBBZCkKKwkJCQl8fCAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX0FQKSkKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwkJCSkKKwkJeworCQkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCwgRkFMU0UpOworCQkJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwpOworCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCAmQkJQVmFsdWUpOworCQkJQkJQVmFsdWUgJj0gKH4weDE4KTsKKwkJCUJCUFZhbHVlIHw9IDB4MTA7CisJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCBCQlBWYWx1ZSk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTWU5DIC0gRW5kIG9mIFNDQU4sIHJlc3RvcmUgdG8gNDBNSHogY2hhbm5lbCAlZCwgVG90YWwgQlNTWyUwMmRdXG4iLHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsLCBwQWQtPlNjYW5UYWIuQnNzTnIpKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCwgRkFMU0UpOworCQkJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTWU5DIC0gRW5kIG9mIFNDQU4sIHJlc3RvcmUgdG8gY2hhbm5lbCAlZCwgVG90YWwgQlNTWyUwMmRdXG4iLHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwsIHBBZC0+U2NhblRhYi5Cc3NOcikpOworCQl9CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJeworCQkJLy8KKwkJCS8vIFRvIHByZXZlbnQgZGF0YSBsb3N0LgorCQkJLy8gU2VuZCBhbiBOVUxMIGRhdGEgd2l0aCB0dXJuZWQgUFNNIGJpdCBvbiB0byBjdXJyZW50IGFzc29jaWF0ZWQgQVAgYmVmb3JlIFNDQU4gcHJvZ3Jlc3MuCisJCQkvLyBOb3csIHdlIG5lZWQgdG8gc2VuZCBhbiBOVUxMIGRhdGEgd2l0aCB0dXJuZWQgUFNNIGJpdCBvZmYgdG8gQVAsIHdoZW4gc2NhbiBwcm9ncmVzcyBkb25lCisJCQkvLworCQkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSAmJiAoSU5GUkFfT04ocEFkKSkpCisJCQl7CisJCQkJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsIChQVk9JRCkmcE91dEJ1ZmZlcik7CisJCQkJaWYgKE5TdGF0dXMJPT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJCQl7CisJCQkJCXBIZHI4MDIxMSA9IChQSEVBREVSXzgwMl8xMSkgcE91dEJ1ZmZlcjsKKwkJCQkJTWd0TWFjSGVhZGVySW5pdChwQWQsIHBIZHI4MDIxMSwgU1VCVFlQRV9OVUxMX0ZVTkMsIDEsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisJCQkJCXBIZHI4MDIxMS0+RHVyYXRpb24gPSAwOworCQkJCQlwSGRyODAyMTEtPkZDLlR5cGUgPSBCVFlQRV9EQVRBOworCQkJCQlwSGRyODAyMTEtPkZDLlB3ck1nbXQgPSAocEFkLT5TdGFDZmcuUHNtID09IFBXUl9TQVZFKTsKKworCQkJCQkvLyBTZW5kIHVzaW5nIHByaW9yaXR5IHF1ZXVlCisJCQkJCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgMCwgcE91dEJ1ZmZlciwgc2l6ZW9mKEhFQURFUl84MDJfMTEpKTsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTWxtZVNjYW5SZXFBY3Rpb24gLS0gU2VuZCBQU00gRGF0YSBmcmFtZVxuIikpOworCQkJCQlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOworCQkJCQlSVE1QdXNlY0RlbGF5KDUwMDApOworCQkJCX0KKwkJCX0KKworCQkJcEFkLT5NbG1lLlN5bmNNYWNoaW5lLkN1cnJTdGF0ZSA9IFNZTkNfSURMRTsKKwkJCVN0YXR1cyA9IE1MTUVfU1VDQ0VTUzsKKwkJCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9TQ0FOX0NPTkYsIDIsICZTdGF0dXMpOworCQl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKworCQlSVE1QX0NMRUFSX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKTsKKwl9CisJZWxzZQorCXsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJeworCQkvLyBCQlAgYW5kIFJGIGFyZSBub3QgYWNjZXNzaWJsZSBpbiBQUyBtb2RlLCB3ZSBoYXMgdG8gd2FrZSB0aGVtIHVwIGZpcnN0CisJCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0RPWkUpKQorCQkJQXNpY0ZvcmNlV2FrZXVwKHBBZCwgVFJVRSk7CisKKwkJCS8vIGxlYXZlIFBTTSBkdXJpbmcgc2Nhbm5pbmcuIG90aGVyd2lzZSB3ZSBtYXkgbG9zdCBQcm9iZVJzcCAmIEJFQUNPTgorCQkJaWYgKHBBZC0+U3RhQ2ZnLlBzbSA9PSBQV1JfU0FWRSkKKwkJCQlNbG1lU2V0UHNtQml0KHBBZCwgUFdSX0FDVElWRSk7CisJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBBZC0+TWxtZUF1eC5DaGFubmVsLCBUUlVFKTsKKwkJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5NbG1lQXV4LkNoYW5uZWwpOworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCXsKKwkJCWlmIChwQWQtPk1sbWVBdXguQ2hhbm5lbCA+IDE0KQorCQkJeworCQkJCWlmICgocEFkLT5Db21tb25DZmcuYklFRUU4MDIxMUggPT0gMSkgJiYgUmFkYXJDaGFubmVsQ2hlY2socEFkLCBwQWQtPk1sbWVBdXguQ2hhbm5lbCkpCisJCQkJeworCQkJCQlTY2FuVHlwZSA9IFNDQU5fUEFTU0lWRTsKKwkJCQkJU2NhblRpbWVJbjVnQ2hhbm5lbCA9IE1JTl9DSEFOTkVMX1RJTUU7CisJCQkJfQorCQkJfQorCisjaWZkZWYgQ0FSUklFUl9ERVRFQ1RJT05fU1VQUE9SVCAvLyBSb2dlciBzeW5jIENhcnJpZXIKKwkJCS8vIGNhcnJpZXIgZGV0ZWN0aW9uCisJCQlpZiAocEFkLT5Db21tb25DZmcuQ2FycmllckRldGVjdC5FbmFibGUgPT0gVFJVRSkKKwkJCXsKKwkJCQlTY2FuVHlwZSA9IFNDQU5fUEFTU0lWRTsKKwkJCQlTY2FuVGltZUluNWdDaGFubmVsID0gTUlOX0NIQU5ORUxfVElNRTsKKwkJCX0KKyNlbmRpZiAvLyBDQVJSSUVSX0RFVEVDVElPTl9TVVBQT1JUIC8vCisJCX0KKworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJCS8vR2xvYmFsIGNvdW50cnkgZG9tYWluKGNoMS0xMTphY3RpdmUgc2NhbiwgY2gxMi0xNCBwYXNzaXZlIHNjYW4pCisJCWlmICgocEFkLT5NbG1lQXV4LkNoYW5uZWwgPD0gMTQpICYmIChwQWQtPk1sbWVBdXguQ2hhbm5lbCA+PSAxMikgJiYgKChwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uICYgMHg3ZikgPT0gUkVHSU9OXzMxX0JHX0JBTkQpKQorCQl7CisJCQlTY2FuVHlwZSA9IFNDQU5fUEFTU0lWRTsKKwkJfQorCisJCS8vIFdlIG5lZWQgdG8gc2hvcnRlbiBhY3RpdmUgc2NhbiB0aW1lIGluIG9yZGVyIGZvciBXWkMgY29ubmVjdCBpc3N1ZQorCQkvLyBDaG5hZ2UgdGhlIGNoYW5uZWwgc2NhbiB0aW1lIGZvciBDSVNDTyBzdHVmZiBiYXNlZCBvbiBpdHMgSUFQUCBhbm5vdW5jZW1lbnQKKwkJaWYgKFNjYW5UeXBlID09IEZBU1RfU0NBTl9BQ1RJVkUpCisJCQlSVE1QU2V0VGltZXIoJnBBZC0+TWxtZUF1eC5TY2FuVGltZXIsIEZBU1RfQUNUSVZFX1NDQU5fVElNRSk7CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCWVsc2UgaWYgKCgoU2NhblR5cGUgPT0gU0NBTl9DSVNDT19BQ1RJVkUpIHx8CisJCQkJKFNjYW5UeXBlID09IFNDQU5fQ0lTQ09fUEFTU0lWRSkgfHwKKwkJCQkoU2NhblR5cGUgPT0gU0NBTl9DSVNDT19DSEFOTkVMX0xPQUQpIHx8CisJCQkJKFNjYW5UeXBlID09IFNDQU5fQ0lTQ09fTk9JU0UpKSAmJiAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkpCisJCXsKKwkJCWlmIChwQWQtPlN0YUNmZy5DQ1hTY2FuVGltZSA8IDI1KQorCQkJCVJUTVBTZXRUaW1lcigmcEFkLT5NbG1lQXV4LlNjYW5UaW1lciwgcEFkLT5TdGFDZmcuQ0NYU2NhblRpbWUgKiAyKTsKKwkJCWVsc2UKKwkJCQlSVE1QU2V0VGltZXIoJnBBZC0+TWxtZUF1eC5TY2FuVGltZXIsIHBBZC0+U3RhQ2ZnLkNDWFNjYW5UaW1lKTsKKwkJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCQllbHNlIC8vIG11c3QgYmUgU0NBTl9QQVNTSVZFIG9yIFNDQU5fQUNUSVZFCisJCXsKKwkJCWlmICgocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFBQkdfTUlYRUQpCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQkJfHwgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQUJHTl9NSVhFRCkgfHwgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQUdOX01JWEVEKQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQkJKQorCQkJeworCQkJCWlmIChwQWQtPk1sbWVBdXguQ2hhbm5lbCA+IDE0KQorCQkJCQlSVE1QU2V0VGltZXIoJnBBZC0+TWxtZUF1eC5TY2FuVGltZXIsIFNjYW5UaW1lSW41Z0NoYW5uZWwpOworCQkJCWVsc2UKKwkJCQlSVE1QU2V0VGltZXIoJnBBZC0+TWxtZUF1eC5TY2FuVGltZXIsIE1JTl9DSEFOTkVMX1RJTUUpOworCQkJfQorCQkJZWxzZQorCQkJCVJUTVBTZXRUaW1lcigmcEFkLT5NbG1lQXV4LlNjYW5UaW1lciwgTUFYX0NIQU5ORUxfVElNRSk7CisJCX0KKworCQlpZiAoKFNjYW5UeXBlID09IFNDQU5fQUNUSVZFKSB8fCAoU2NhblR5cGUgPT0gRkFTVF9TQ0FOX0FDVElWRSkgfHwKKwkJCShTY2FuVHlwZSA9PSBTQ0FOX0NJU0NPX0FDVElWRSkpCisJCXsKKwkJCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5CisJCQlpZiAoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCQkJeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNZTkMgLSBTY2FuTmV4dENoYW5uZWwoKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbFxuIikpOworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQkJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCQkJeworCQkJCQlwQWQtPk1sbWUuU3luY01hY2hpbmUuQ3VyclN0YXRlID0gU1lOQ19JRExFOworCQkJCQlTdGF0dXMgPSBNTE1FX0ZBSUxfTk9fUkVTT1VSQ0U7CisJCQkJCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9TQ0FOX0NPTkYsIDIsICZTdGF0dXMpOworCQkJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCQkJCXJldHVybjsKKwkJCX0KKworCQkJLy8gVGhlcmUgaXMgbm8gbmVlZCB0byBzZW5kIGJyb2FkY2FzdCBwcm9iZSByZXF1ZXN0IGlmIGFjdGl2ZSBzY2FuIGlzIGluIGVmZmVjdC4KKwkJCWlmICgoU2NhblR5cGUgPT0gU0NBTl9BQ1RJVkUpIHx8IChTY2FuVHlwZSA9PSBGQVNUX1NDQU5fQUNUSVZFKQorCQkJCSkKKwkJCQlTc2lkTGVuID0gcEFkLT5NbG1lQXV4LlNzaWRMZW47CisJCQllbHNlCisJCQkJU3NpZExlbiA9IDA7CisKKwkJCU1ndE1hY0hlYWRlckluaXQocEFkLCAmSGRyODAyMTEsIFNVQlRZUEVfUFJPQkVfUkVRLCAwLCBCUk9BRENBU1RfQUREUiwgQlJPQURDQVNUX0FERFIpOworCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICAgICAgICAmRnJhbWVMZW4sCisJCQkJCQkJICBzaXplb2YoSEVBREVSXzgwMl8xMSksICAgICZIZHI4MDIxMSwKKwkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgJlNzaWRJZSwKKwkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgJlNzaWRMZW4sCisJCQkJCQkJICBTc2lkTGVuLAkJCSAgICAgICAgcEFkLT5NbG1lQXV4LlNzaWQsCisJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICZTdXBSYXRlSWUsCisJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICZwQWQtPkNvbW1vbkNmZy5TdXBSYXRlTGVuLAorCQkJCQkJCSAgcEFkLT5Db21tb25DZmcuU3VwUmF0ZUxlbiwgIHBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGUsCisJCQkJCQkJICBFTkRfT0ZfQVJHUyk7CisKKwkJCWlmIChwQWQtPkNvbW1vbkNmZy5FeHRSYXRlTGVuKQorCQkJeworCQkJCVVMT05HIFRtcDsKKwkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sICAgICAgICAgICAgJlRtcCwKKwkJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkV4dFJhdGVJZSwKKwkJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBBZC0+Q29tbW9uQ2ZnLkV4dFJhdGVMZW4sCisJCQkJCQkJCSAgcEFkLT5Db21tb25DZmcuRXh0UmF0ZUxlbiwgICAgICAgICAgcEFkLT5Db21tb25DZmcuRXh0UmF0ZSwKKwkJCQkJCQkJICBFTkRfT0ZfQVJHUyk7CisJCQkJRnJhbWVMZW4gKz0gVG1wOworCQkJfQorCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQlpZiAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEKQorCQkJeworCQkJCVVMT05HCVRtcDsKKwkJCQlVQ0hBUglIdExlbjsKKwkJCQlVQ0hBUglCUk9BRENPTVs0XSA9IHsweDAsIDB4OTAsIDB4NGMsIDB4MzN9OworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwkJCQlIVF9DQVBBQklMSVRZX0lFIEh0Q2FwYWJpbGl0eVRtcDsKKyNlbmRpZgorCQkJCWlmIChwQWQtPmJCcm9hZENvbUhUID09IFRSVUUpCisJCQkJeworCQkJCQlIdExlbiA9IHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHlMZW4gKyA0OworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwkJCQkJTmRpc01vdmVNZW1vcnkoJkh0Q2FwYWJpbGl0eVRtcCwgJnBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHksIFNJWkVfSFRfQ0FQX0lFKTsKKwkJCQkJKihVU0hPUlQgKikoJkh0Q2FwYWJpbGl0eVRtcC5IdENhcEluZm8pID0gU1dBUDE2KCooVVNIT1JUICopKCZIdENhcGFiaWxpdHlUbXAuSHRDYXBJbmZvKSk7CisJCQkJCSooVVNIT1JUICopKCZIdENhcGFiaWxpdHlUbXAuRXh0SHRDYXBJbmZvKSA9IFNXQVAxNigqKFVTSE9SVCAqKSgmSHRDYXBhYmlsaXR5VG1wLkV4dEh0Q2FwSW5mbykpOworCisJCQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwgICAgICAgICAgJlRtcCwKKwkJCQkJCQkJCTEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmV3BhSWUsCisJCQkJCQkJCQkxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkh0TGVuLAorCQkJCQkJCQkJNCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZCUk9BRENPTVswXSwKKwkJCQkJCQkJCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHlMZW4sICAgICAmSHRDYXBhYmlsaXR5VG1wLAorCQkJCQkJCQkJRU5EX09GX0FSR1MpOworI2Vsc2UKKwkJCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAgICAgICAgICAmVG1wLAorCQkJCQkJCQkJMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZXcGFJZSwKKwkJCQkJCQkJCTEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmSHRMZW4sCisJCQkJCQkJCQk0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkJST0FEQ09NWzBdLAorCQkJCQkJCQkJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eUxlbiwgICAgICZwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5LAorCQkJCQkJCQkJRU5EX09GX0FSR1MpOworI2VuZGlmIC8vIFJUX0JJR19FTkRJQU4gLy8KKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJSHRMZW4gPSBwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5TGVuOworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwkJCQkJTmRpc01vdmVNZW1vcnkoJkh0Q2FwYWJpbGl0eVRtcCwgJnBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eSwgU0laRV9IVF9DQVBfSUUpOworCQkJCQkqKFVTSE9SVCAqKSgmSHRDYXBhYmlsaXR5VG1wLkh0Q2FwSW5mbykgPSBTV0FQMTYoKihVU0hPUlQgKikoJkh0Q2FwYWJpbGl0eVRtcC5IdENhcEluZm8pKTsKKwkJCQkJKihVU0hPUlQgKikoJkh0Q2FwYWJpbGl0eVRtcC5FeHRIdENhcEluZm8pID0gU1dBUDE2KCooVVNIT1JUICopKCZIdENhcGFiaWxpdHlUbXAuRXh0SHRDYXBJbmZvKSk7CisKKwkJCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAgICAgICAgICAmVG1wLAorCQkJCQkJCQkJMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZIdENhcEllLAorCQkJCQkJCQkJMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZIdExlbiwKKwkJCQkJCQkJCUh0TGVuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAmSHRDYXBhYmlsaXR5VG1wLAorCQkJCQkJCQkJRU5EX09GX0FSR1MpOworI2Vsc2UKKwkJCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAgICAgICAgICAmVG1wLAorCQkJCQkJCQkJMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZIdENhcEllLAorCQkJCQkJCQkJMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZIdExlbiwKKwkJCQkJCQkJCUh0TGVuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5LAorCQkJCQkJCQkJRU5EX09GX0FSR1MpOworI2VuZGlmIC8vIFJUX0JJR19FTkRJQU4gLy8KKwkJCQl9CisJCQkJRnJhbWVMZW4gKz0gVG1wOworCisjaWZkZWYgRE9UMTFOX0RSQUZUMworCQkJCWlmIChwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuYjIwNDBDb2V4aXN0U2NhblN1cCA9PSAxKQorCQkJCXsKKwkJCQkJVUxPTkcJCVRtcDsKKwkJCQkJSHRMZW4gPSAxOworCQkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sICAgICAgICAgICAgJlRtcCwKKwkJCQkJCQkJCSAgMSwJCQkJCSZFeHRIdENhcEllLAorCQkJCQkJCQkJICAxLAkJCQkJJkh0TGVuLAorCQkJCQkJCQkJICAxLCAgICAgICAgICAJCQkmcEFkLT5Db21tb25DZmcuQlNTQ29leGlzdDIwNDAud29yZCwKKwkJCQkJCQkJCSAgRU5EX09GX0FSR1MpOworCisJCQkJCUZyYW1lTGVuICs9IFRtcDsKKwkJCQl9CisjZW5kaWYgLy8gRE9UMTFOX0RSQUZUMyAvLworCQkJfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisKKwkJCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgMCwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOworCQkJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKKwkJfQorCisJCS8vIEZvciBTQ0FOX0NJU0NPX1BBU1NJVkUsIGRvIG5vdGhpbmcgYW5kIHNpbGVudGx5IHdhaXQgZm9yIGJlYWNvbiBvciBvdGhlciBwcm9iZSByZXBvbnNlCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJCXBBZC0+TWxtZS5TeW5jTWFjaGluZS5DdXJyU3RhdGUgPSBTQ0FOX0xJU1RFTjsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCX0KK30KKworVk9JRCBNZ3RQcm9iUmVxTWFjSGVhZGVySW5pdCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiBPVVQgUEhFQURFUl84MDJfMTEgcEhkcjgwMjExLAorCUlOIFVDSEFSIFN1YlR5cGUsCisJSU4gVUNIQVIgVG9EcywKKwlJTiBQVUNIQVIgcERBLAorCUlOIFBVQ0hBUiBwQnNzaWQpCit7CisJTmRpc1plcm9NZW1vcnkocEhkcjgwMjExLCBzaXplb2YoSEVBREVSXzgwMl8xMSkpOworCisJcEhkcjgwMjExLT5GQy5UeXBlID0gQlRZUEVfTUdNVDsKKwlwSGRyODAyMTEtPkZDLlN1YlR5cGUgPSBTdWJUeXBlOworCWlmIChTdWJUeXBlID09IFNVQlRZUEVfQUNLKQorCQlwSGRyODAyMTEtPkZDLlR5cGUgPSBCVFlQRV9DTlRMOworCXBIZHI4MDIxMS0+RkMuVG9EcyA9IFRvRHM7CisJQ09QWV9NQUNfQUREUihwSGRyODAyMTEtPkFkZHIxLCBwREEpOworCUNPUFlfTUFDX0FERFIocEhkcjgwMjExLT5BZGRyMiwgcEFkLT5DdXJyZW50QWRkcmVzcyk7CisJQ09QWV9NQUNfQUREUihwSGRyODAyMTEtPkFkZHIzLCBwQnNzaWQpOworfQorCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2NtbV93cGEuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2NtbV93cGEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MWMzMzJhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vY21tX3dwYS5jCkBAIC0wLDAgKzEsMTYwNiBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwlNb2R1bGUgTmFtZToKKwl3cGEuYworCisJQWJzdHJhY3Q6CisKKwlSZXZpc2lvbiBIaXN0b3J5OgorCVdobwkJCVdoZW4JCQlXaGF0CisJLS0tLS0tLS0JLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCUphbglMZWUJCTAzLTA3LTIyCQlJbml0aWFsCisJUGF1bCBMaW4JMDMtMTEtMjgJCU1vZGlmeSBmb3Igc3VwcGxpY2FudAorKi8KKyNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKKy8vIFdQQSBPVUkKK1VDSEFSCQlPVUlfV1BBX05PTkVfQUtNWzRdCQk9IHsweDAwLCAweDUwLCAweEYyLCAweDAwfTsKK1VDSEFSICAgICAgIE9VSV9XUEFfVkVSU0lPTls0XSAgICAgID0gezB4MDAsIDB4NTAsIDB4RjIsIDB4MDF9OworVUNIQVIgICAgICAgT1VJX1dQQV9US0lQWzRdICAgICA9IHsweDAwLCAweDUwLCAweEYyLCAweDAyfTsKK1VDSEFSICAgICAgIE9VSV9XUEFfQ0NNUFs0XSAgICAgPSB7MHgwMCwgMHg1MCwgMHhGMiwgMHgwNH07CitVQ0hBUiAgICAgICBPVUlfV1BBXzgwMjFYX0FLTVs0XQk9IHsweDAwLCAweDUwLCAweEYyLCAweDAxfTsKK1VDSEFSICAgICAgIE9VSV9XUEFfUFNLX0FLTVs0XSAgICAgID0gezB4MDAsIDB4NTAsIDB4RjIsIDB4MDJ9OworLy8gV1BBMiBPVUkKK1VDSEFSICAgICAgIE9VSV9XUEEyX1dFUDQwWzRdICAgPSB7MHgwMCwgMHgwRiwgMHhBQywgMHgwMX07CitVQ0hBUiAgICAgICBPVUlfV1BBMl9US0lQWzRdICAgICAgICA9IHsweDAwLCAweDBGLCAweEFDLCAweDAyfTsKK1VDSEFSICAgICAgIE9VSV9XUEEyX0NDTVBbNF0gICAgICAgID0gezB4MDAsIDB4MEYsIDB4QUMsIDB4MDR9OworVUNIQVIgICAgICAgT1VJX1dQQTJfODAyMVhfQUtNWzRdICAgPSB7MHgwMCwgMHgwRiwgMHhBQywgMHgwMX07CitVQ0hBUiAgICAgICBPVUlfV1BBMl9QU0tfQUtNWzRdICAgCT0gezB4MDAsIDB4MEYsIDB4QUMsIDB4MDJ9OworLy8gTVNBIE9VSQorVUNIQVIgICAJT1VJX01TQV84MDIxWF9BS01bNF0gICAgPSB7MHgwMCwgMHgwRiwgMHhBQywgMHgwNX07CQkvLyBOb3QgeWV0IGZpbmFsIC0gSUVFRSA4MDIuMTFzLUQxLjA2CitVQ0hBUiAgIAlPVUlfTVNBX1BTS19BS01bNF0gICAJPSB7MHgwMCwgMHgwRiwgMHhBQywgMHgwNn07CQkvLyBOb3QgeWV0IGZpbmFsIC0gSUVFRSA4MDIuMTFzLUQxLjA2CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlUaGUgcHNldWRvLXJhbmRvbSBmdW5jdGlvbihQUkYpIHRoYXQgaGFzaGVzIHZhcmlvdXMgaW5wdXRzIHRvCisJCWRlcml2ZSBhIHBzZXVkby1yYW5kb20gdmFsdWUuIFRvIGFkZCBsaXZlbmVzcyB0byB0aGUgcHNldWRvLXJhbmRvbQorCQl2YWx1ZSwgYSBub25jZSBzaG91bGQgYmUgb25lIG9mIHRoZSBpbnB1dHMuCisKKwkJSXQgaXMgdXNlZCB0byBnZW5lcmF0ZSBQVEssIEdUSyBvciBzb21lIHNwZWNpZmljIHJhbmRvbSB2YWx1ZS4KKworCUFyZ3VtZW50czoKKwkJVUNIQVIJKmtleSwJCS0JdGhlIGtleSBtYXRlcmlhbCBmb3IgSE1BQ19TSEExIHVzZQorCQlJTlQJCWtleV9sZW4JCS0JdGhlIGxlbmd0aCBvZiBrZXkKKwkJVUNIQVIJKnByZWZpeAkJLQlhIHByZWZpeCBsYWJlbAorCQlJTlQJCXByZWZpeF9sZW4JLQl0aGUgbGVuZ3RoIG9mIHRoZSBsYWJlbAorCQlVQ0hBUgkqZGF0YQkJLQlhIHNwZWNpZmljIGRhdGEgd2l0aCB2YXJpYWJsZSBsZW5ndGgKKwkJSU5UCQlkYXRhX2xlbgktCXRoZSBsZW5ndGggb2YgYSBzcGVjaWZpYyBkYXRhCisJCUlOVAkJbGVuCQkJLQl0aGUgb3V0cHV0IGxlbmdodAorCisJUmV0dXJuIFZhbHVlOgorCQlVQ0hBUgkqb3V0cHV0CQktCXRoZSBjYWxjdWxhdGVkIHJlc3VsdAorCisJTm90ZToKKwkJODAyLjExaS0yMDA0CUFubmV4IEguMworCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlQUkYoCisJSU4JVUNIQVIJKmtleSwKKwlJTglJTlQJCWtleV9sZW4sCisJSU4JVUNIQVIJKnByZWZpeCwKKwlJTglJTlQJCXByZWZpeF9sZW4sCisJSU4JVUNIQVIJKmRhdGEsCisJSU4JSU5UCQlkYXRhX2xlbiwKKwlPVVQJVUNIQVIJKm91dHB1dCwKKwlJTglJTlQJCWxlbikKK3sKKwlJTlQJCWk7CisgICAgVUNIQVIgICAqaW5wdXQ7CisJSU5UCQljdXJyZW50aW5kZXggPSAwOworCUlOVAkJdG90YWxfbGVuOworCisJLy8gQWxsb2NhdGUgbWVtb3J5IGZvciBpbnB1dAorCW9zX2FsbG9jX21lbShOVUxMLCAoUFVDSEFSICopJmlucHV0LCAxMDI0KTsKKworICAgIGlmIChpbnB1dCA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiISEhUFJGOiBubyBtZW1vcnkhISFcbiIpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworCS8vIEdlbmVyYXRlIGNvbmNhdGVuYXRpb24gaW5wdXQKKwlOZGlzTW92ZU1lbW9yeShpbnB1dCwgcHJlZml4LCBwcmVmaXhfbGVuKTsKKworCS8vIENvbmNhdGVuYXRlIGEgc2luZ2xlIG9jdGV0IGNvbnRhaW5pbmcgMAorCWlucHV0W3ByZWZpeF9sZW5dID0JMDsKKworCS8vIENvbmNhdGVuYXRlIHNwZWNpZmljIGRhdGEKKwlOZGlzTW92ZU1lbW9yeSgmaW5wdXRbcHJlZml4X2xlbiArIDFdLCBkYXRhLCBkYXRhX2xlbik7CisJdG90YWxfbGVuID0JcHJlZml4X2xlbiArIDEgKyBkYXRhX2xlbjsKKworCS8vIENvbmNhdGVuYXRlIGEgc2luZ2xlIG9jdGV0IGNvbnRhaW5pbmcgMAorCS8vIFRoaXMgb2N0ZXQgc2hhbGwgYmUgdXBkYXRlIGxhdGVyCisJaW5wdXRbdG90YWxfbGVuXSA9IDA7CisJdG90YWxfbGVuKys7CisKKwkvLyBJdGVyYXRlIHRvIGNhbGN1bGF0ZSB0aGUgcmVzdWx0IGJ5IGhtYWMtc2hhLTEKKwkvLyBUaGVuIGNvbmNhdGVuYXRlIHRvIGxhc3QgcmVzdWx0CisJZm9yCShpID0gMDsJaSA8CShsZW4gKyAxOSkgLyAyMDsgaSsrKQorCXsKKwkJSE1BQ19TSEExKGlucHV0LCB0b3RhbF9sZW4sCWtleSwga2V5X2xlbiwgJm91dHB1dFtjdXJyZW50aW5kZXhdKTsKKwkJY3VycmVudGluZGV4ICs9CTIwOworCisJCS8vIHVwZGF0ZSB0aGUgbGFzdCBvY3RldAorCQlpbnB1dFt0b3RhbF9sZW4gLSAxXSsrOworCX0KKyAgICBvc19mcmVlX21lbShOVUxMLCBpbnB1dCk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlJdCB1dGlsaXplcyBQUkYtMzg0IG9yIFBSRi01MTIgdG8gZGVyaXZlIHNlc3Npb24tc3BlY2lmaWMga2V5cyBmcm9tIGEgUE1LLgorCQlJdCBzaGFsbCBiZSBjYWxsZWQgYnkgNC13YXkgaGFuZHNoYWtlIHByb2Nlc3NpbmcuCisKKwlBcmd1bWVudHM6CisJCXBBZCAJLQlwb2ludGVyIHRvIG91ciBwQWRhcHRlciBjb250ZXh0CisJCVBNSwkJLQlwb2ludGVyIHRvIFBNSworCQlBTm9uY2UJLQlwb2ludGVyIHRvIEFOb25jZQorCQlBQQkJLQlwb2ludGVyIHRvIEF1dGhlbnRpY2F0b3IgQWRkcmVzcworCQlTTm9uY2UJLQlwb2ludGVyIHRvIFNOb25jZQorCQlTQQkJLQlwb2ludGVyIHRvIFN1cHBsaWNhbnQgQWRkcmVzcworCQlsZW4JCS0JaW5kaWNhdGUgdGhlIGxlbmd0aCBvZiBQVEsgKG9jdGV0KQorCisJUmV0dXJuIFZhbHVlOgorCQlPdXRwdXQJCXBvaW50ZXIgdG8gdGhlIFBUSworCisJTm90ZToKKwkJUmVmZXIgdG8gSUVFRSA4MDIuMTFpLTIwMDQgOC41LjEuMgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBXcGFDb3VudFBUSygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVQ0hBUgkqUE1LLAorCUlOCVVDSEFSCSpBTm9uY2UsCisJSU4JVUNIQVIJKkFBLAorCUlOCVVDSEFSCSpTTm9uY2UsCisJSU4JVUNIQVIJKlNBLAorCU9VVAlVQ0hBUgkqb3V0cHV0LAorCUlOCVVJTlQJbGVuKQoreworCVVDSEFSCWNvbmNhdGVuYXRpb25bNzZdOworCVVJTlQJQ3VyclBvcyA9IDA7CisJVUNIQVIJdGVtcFszMl07CisJVUNIQVIJUHJlZml4W10gPSB7J1AnLCAnYScsICdpJywgJ3InLCAndycsICdpJywgJ3MnLCAnZScsICcgJywgJ2snLCAnZScsICd5JywgJyAnLAorCQkJCQkJJ2UnLCAneCcsICdwJywgJ2EnLCAnbicsICdzJywgJ2knLCAnbycsICduJ307CisKKwkvLyBpbml0aWF0ZSB0aGUgY29uY2F0ZW5hdGlvbiBpbnB1dAorCU5kaXNaZXJvTWVtb3J5KHRlbXAsIHNpemVvZih0ZW1wKSk7CisJTmRpc1plcm9NZW1vcnkoY29uY2F0ZW5hdGlvbiwgNzYpOworCisJLy8gR2V0IHNtYWxsZXIgYWRkcmVzcworCWlmIChSVE1QQ29tcGFyZU1lbW9yeShTQSwgQUEsIDYpID09IDEpCisJCU5kaXNNb3ZlTWVtb3J5KGNvbmNhdGVuYXRpb24sIEFBLCA2KTsKKwllbHNlCisJCU5kaXNNb3ZlTWVtb3J5KGNvbmNhdGVuYXRpb24sIFNBLCA2KTsKKwlDdXJyUG9zICs9IDY7CisKKwkvLyBHZXQgbGFyZ2VyIGFkZHJlc3MKKwlpZiAoUlRNUENvbXBhcmVNZW1vcnkoU0EsIEFBLCA2KSA9PSAxKQorCQlOZGlzTW92ZU1lbW9yeSgmY29uY2F0ZW5hdGlvbltDdXJyUG9zXSwgU0EsIDYpOworCWVsc2UKKwkJTmRpc01vdmVNZW1vcnkoJmNvbmNhdGVuYXRpb25bQ3VyclBvc10sIEFBLCA2KTsKKworCS8vIHN0b3JlIHRoZSBsYXJnZXIgbWFjIGFkZHJlc3MgZm9yIGJhY2t3YXJkIGNvbXBhdGlibGUgb2YKKwkvLyByYWxpbmsgcHJvcHJpZXRhcnkgU1RBLWtleSBpc3N1ZQorCU5kaXNNb3ZlTWVtb3J5KHRlbXAsICZjb25jYXRlbmF0aW9uW0N1cnJQb3NdLCBNQUNfQUREUl9MRU4pOworCUN1cnJQb3MgKz0gNjsKKworCS8vIEdldCBzbWFsbGVyIE5vbmNlCisJaWYgKFJUTVBDb21wYXJlTWVtb3J5KEFOb25jZSwgU05vbmNlLCAzMikgPT0gMCkKKwkJTmRpc01vdmVNZW1vcnkoJmNvbmNhdGVuYXRpb25bQ3VyclBvc10sIHRlbXAsIDMyKTsJLy8gcGF0Y2ggZm9yIHJhbGluayBwcm9wcmlldGFyeSBTVEEta2V5IGlzc3VlCisJZWxzZSBpZiAoUlRNUENvbXBhcmVNZW1vcnkoQU5vbmNlLCBTTm9uY2UsIDMyKSA9PSAxKQorCQlOZGlzTW92ZU1lbW9yeSgmY29uY2F0ZW5hdGlvbltDdXJyUG9zXSwgU05vbmNlLCAzMik7CisJZWxzZQorCQlOZGlzTW92ZU1lbW9yeSgmY29uY2F0ZW5hdGlvbltDdXJyUG9zXSwgQU5vbmNlLCAzMik7CisJQ3VyclBvcyArPSAzMjsKKworCS8vIEdldCBsYXJnZXIgTm9uY2UKKwlpZiAoUlRNUENvbXBhcmVNZW1vcnkoQU5vbmNlLCBTTm9uY2UsIDMyKSA9PSAwKQorCQlOZGlzTW92ZU1lbW9yeSgmY29uY2F0ZW5hdGlvbltDdXJyUG9zXSwgdGVtcCwgMzIpOwkvLyBwYXRjaCBmb3IgcmFsaW5rIHByb3ByaWV0YXJ5IFNUQS1rZXkgaXNzdWUKKwllbHNlIGlmIChSVE1QQ29tcGFyZU1lbW9yeShBTm9uY2UsIFNOb25jZSwgMzIpID09IDEpCisJCU5kaXNNb3ZlTWVtb3J5KCZjb25jYXRlbmF0aW9uW0N1cnJQb3NdLCBBTm9uY2UsIDMyKTsKKwllbHNlCisJCU5kaXNNb3ZlTWVtb3J5KCZjb25jYXRlbmF0aW9uW0N1cnJQb3NdLCBTTm9uY2UsIDMyKTsKKwlDdXJyUG9zICs9IDMyOworCisJaGV4X2R1bXAoImNvbmNhdGVuYXRpb249IiwgY29uY2F0ZW5hdGlvbiwgNzYpOworCisJLy8gVXNlIFBSRiB0byBnZW5lcmF0ZSBQVEsKKwlQUkYoUE1LLCBMRU5fTUFTVEVSX0tFWSwgUHJlZml4LCAyMiwgY29uY2F0ZW5hdGlvbiwgNzYsIG91dHB1dCwgbGVuKTsKKworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJR2VuZXJhdGUgcmFuZG9tIG51bWJlciBieSBzb2Z0d2FyZS4KKworCUFyZ3VtZW50czoKKwkJcEFkCQktCXBvaW50ZXIgdG8gb3VyIHBBZGFwdGVyIGNvbnRleHQKKwkJbWFjQWRkcgktCXBvaW50ZXIgdG8gbG9jYWwgTUFDIGFkZHJlc3MKKworCVJldHVybiBWYWx1ZToKKworCU5vdGU6CisJCTgwMi4xaWktMjAwNCAgQW5uZXggSC41CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECUdlblJhbmRvbSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVQ0hBUgkJCSptYWNBZGRyLAorCU9VVAlVQ0hBUgkJCSpyYW5kb20pCit7CisJSU5UCQlpLCBjdXJyOworCVVDSEFSCWxvY2FsWzgwXSwgS2V5Q291bnRlclszMl07CisJVUNIQVIJcmVzdWx0WzgwXTsKKwlVTE9ORwlDdXJyZW50VGltZTsKKwlVQ0hBUglwcmVmaXhbXSA9IHsnSScsICduJywgJ2knLCAndCcsICcgJywgJ0MnLCAnbycsICd1JywgJ24nLCAndCcsICdlJywgJ3InfTsKKworCS8vIFplcm8gdGhlIHJlbGF0ZWQgaW5mb3JtYXRpb24KKwlOZGlzWmVyb01lbW9yeShyZXN1bHQsIDgwKTsKKwlOZGlzWmVyb01lbW9yeShsb2NhbCwgODApOworCU5kaXNaZXJvTWVtb3J5KEtleUNvdW50ZXIsIDMyKTsKKworCWZvcgkoaSA9IDA7CWkgPAkzMjsJaSsrKQorCXsKKwkJLy8gY29weSB0aGUgbG9jYWwgTUFDIGFkZHJlc3MKKwkJQ09QWV9NQUNfQUREUihsb2NhbCwgbWFjQWRkcik7CisJCWN1cnIgPQlNQUNfQUREUl9MRU47CisKKwkJLy8gY29uY2F0ZW5hdGUgdGhlIGN1cnJlbnQgdGltZQorCQlOZGlzR2V0U3lzdGVtVXBUaW1lKCZDdXJyZW50VGltZSk7CisJCU5kaXNNb3ZlTWVtb3J5KCZsb2NhbFtjdXJyXSwgICZDdXJyZW50VGltZSwJc2l6ZW9mKEN1cnJlbnRUaW1lKSk7CisJCWN1cnIgKz0Jc2l6ZW9mKEN1cnJlbnRUaW1lKTsKKworCQkvLyBjb25jYXRlbmF0ZSB0aGUgbGFzdCByZXN1bHQKKwkJTmRpc01vdmVNZW1vcnkoJmxvY2FsW2N1cnJdLCAgcmVzdWx0LCAzMik7CisJCWN1cnIgKz0JMzI7CisKKwkJLy8gY29uY2F0ZW5hdGUgYSB2YXJpYWJsZQorCQlOZGlzTW92ZU1lbW9yeSgmbG9jYWxbY3Vycl0sICAmaSwgIDIpOworCQljdXJyICs9CTI7CisKKwkJLy8gY2FsY3VsYXRlIHRoZSByZXN1bHQKKwkJUFJGKEtleUNvdW50ZXIsIDMyLCBwcmVmaXgsMTIsIGxvY2FsLCBjdXJyLCByZXN1bHQsIDMyKTsKKwl9CisKKwlOZGlzTW92ZU1lbW9yeShyYW5kb20sIHJlc3VsdCwJMzIpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJQnVpbGQgY2lwaGVyIHN1aXRlIGluIFJTTi1JRS4KKwkJSXQgb25seSBzaGFsbCBiZSBjYWxsZWQgYnkgUlRNUE1ha2VSU05JRS4KKworCUFyZ3VtZW50czoKKwkJcEFkCQkJLQlwb2ludGVyIHRvIG91ciBwQWRhcHRlciBjb250ZXh0CisgICAgCUVsZW1lbnRJRAktCWluZGljYXRlIHRoZSBXUEExIG9yIFdQQTIKKyAgICAJV2VwU3RhdHVzCS0JaW5kaWNhdGUgdGhlIGVuY3J5cHRpb24gdHlwZQorCQliTWl4Q2lwaGVyCS0JYSBib29sZWFuIHRvIGluZGljYXRlIHRoZSBwYWlyd2lzZSBjaXBoZXIgYW5kIGdyb3VwCisJCQkJCQljaXBoZXIgYXJlIHRoZSBzYW1lIG9yIG5vdAorCisJUmV0dXJuIFZhbHVlOgorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK3N0YXRpYyBWT0lEIFJUTVBJbnNlcnRSc25JZUNpcGhlcigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTglVQ0hBUgkJCUVsZW1lbnRJRCwKKwlJTglVSU5UCQkJV2VwU3RhdHVzLAorCUlOCUJPT0xFQU4JCQliTWl4Q2lwaGVyLAorCUlOCVVDSEFSCQkJRmxleGlibGVDaXBoZXIsCisJT1VUCVBVQ0hBUgkJCXBSc25JZSwKKwlPVVQJVUNIQVIJCQkqcnNuX2xlbikKK3sKKwlVQ0hBUglQYWlyd2lzZUNudDsKKworCSpyc25fbGVuID0gMDsKKworCS8vIGRlY2lkZSBXUEEyIG9yIFdQQTEKKwlpZiAoRWxlbWVudElEID09IFdwYTJJZSkKKwl7CisJCVJTTklFMgkqcFJzbmllX2NpcGhlciA9IChSU05JRTIqKXBSc25JZTsKKworCQkvLyBBc3NpZ24gdGhlIHZlcnNvbiBhcyAxCisJCXBSc25pZV9jaXBoZXItPnZlcnNpb24gPSAxOworCisgICAgICAgIHN3aXRjaCAoV2VwU3RhdHVzKQorICAgICAgICB7CisgICAgICAgIAkvLyBUS0lQIG1vZGUKKyAgICAgICAgICAgIGNhc2UgTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZDoKKyAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwUnNuaWVfY2lwaGVyLT5tY2FzdCwgT1VJX1dQQTJfVEtJUCwgNCk7CisgICAgICAgICAgICAgICAgcFJzbmllX2NpcGhlci0+dWNvdW50ID0gMTsKKyAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwUnNuaWVfY2lwaGVyLT51Y2FzdFswXS5vdWksIE9VSV9XUEEyX1RLSVAsIDQpOworICAgICAgICAgICAgICAgICpyc25fbGVuID0gc2l6ZW9mKFJTTklFMik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKwkJCS8vIEFFUyBtb2RlCisgICAgICAgICAgICBjYXNlIE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQ6CisJCQkJaWYgKGJNaXhDaXBoZXIpCisJCQkJCU5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPm1jYXN0LCBPVUlfV1BBMl9US0lQLCA0KTsKKwkJCQllbHNlCisJCQkJCU5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPm1jYXN0LCBPVUlfV1BBMl9DQ01QLCA0KTsKKyAgICAgICAgICAgICAgICBwUnNuaWVfY2lwaGVyLT51Y291bnQgPSAxOworICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPnVjYXN0WzBdLm91aSwgT1VJX1dQQTJfQ0NNUCwgNCk7CisgICAgICAgICAgICAgICAgKnJzbl9sZW4gPSBzaXplb2YoUlNOSUUyKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworCQkJLy8gVEtJUC1BRVMgbWl4IG1vZGUKKyAgICAgICAgICAgIGNhc2UgTmRpczgwMl8xMUVuY3J5cHRpb240RW5hYmxlZDoKKyAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwUnNuaWVfY2lwaGVyLT5tY2FzdCwgT1VJX1dQQTJfVEtJUCwgNCk7CisKKwkJCQlQYWlyd2lzZUNudCA9IDE7CisJCQkJLy8gSW5zZXJ0IFdQQTIgVEtJUCBhcyB0aGUgZmlyc3QgcGFpcndpc2UgY2lwaGVyCisJCQkJaWYgKE1JWF9DSVBIRVJfV1BBMl9US0lQX09OKEZsZXhpYmxlQ2lwaGVyKSkKKwkJCQl7CisgICAgICAgICAgICAgICAgCU5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPnVjYXN0WzBdLm91aSwgT1VJX1dQQTJfVEtJUCwgNCk7CisJCQkJCS8vIEluc2VydCBXUEEyIEFFUyBhcyB0aGUgc2Vjb25kYXJ5IHBhaXJ3aXNlIGNpcGhlcgorCQkJCQlpZiAoTUlYX0NJUEhFUl9XUEEyX0FFU19PTihGbGV4aWJsZUNpcGhlcikpCisJCQkJCXsKKyAgICAgICAgICAgICAgICAJCU5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPnVjYXN0WzBdLm91aSArIDQsIE9VSV9XUEEyX0NDTVAsIDQpOworCQkJCQkJUGFpcndpc2VDbnQgPSAyOworCQkJCQl9CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCS8vIEluc2VydCBXUEEyIEFFUyBhcyB0aGUgZmlyc3QgcGFpcndpc2UgY2lwaGVyCisJCQkJCU5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPnVjYXN0WzBdLm91aSwgT1VJX1dQQTJfQ0NNUCwgNCk7CisJCQkJfQorCisgICAgICAgICAgICAgICAgcFJzbmllX2NpcGhlci0+dWNvdW50ID0gUGFpcndpc2VDbnQ7CisgICAgICAgICAgICAgICAgKnJzbl9sZW4gPSBzaXplb2YoUlNOSUUyKSArICg0ICogKFBhaXJ3aXNlQ250IC0gMSkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKwkJLy8gc3dhcCBmb3IgYmlnLWVuZGlhbiBwbGF0Zm9ybQorCQlwUnNuaWVfY2lwaGVyLT52ZXJzaW9uID0gY3B1MmxlMTYocFJzbmllX2NpcGhlci0+dmVyc2lvbik7CisJICAgIHBSc25pZV9jaXBoZXItPnVjb3VudCA9IGNwdTJsZTE2KHBSc25pZV9jaXBoZXItPnVjb3VudCk7CisJfQorCWVsc2UKKwl7CisJCVJTTklFCSpwUnNuaWVfY2lwaGVyID0gKFJTTklFKilwUnNuSWU7CisKKwkJLy8gQXNzaWduIE9VSSBhbmQgdmVyc2lvbgorCQlOZGlzTW92ZU1lbW9yeShwUnNuaWVfY2lwaGVyLT5vdWksIE9VSV9XUEFfVkVSU0lPTiwgNCk7CisgICAgICAgIHBSc25pZV9jaXBoZXItPnZlcnNpb24gPSAxOworCisJCXN3aXRjaCAoV2VwU3RhdHVzKQorCQl7CisJCQkvLyBUS0lQIG1vZGUKKyAgICAgICAgICAgIGNhc2UgTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZDoKKyAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwUnNuaWVfY2lwaGVyLT5tY2FzdCwgT1VJX1dQQV9US0lQLCA0KTsKKyAgICAgICAgICAgICAgICBwUnNuaWVfY2lwaGVyLT51Y291bnQgPSAxOworICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPnVjYXN0WzBdLm91aSwgT1VJX1dQQV9US0lQLCA0KTsKKyAgICAgICAgICAgICAgICAqcnNuX2xlbiA9IHNpemVvZihSU05JRSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKwkJCS8vIEFFUyBtb2RlCisgICAgICAgICAgICBjYXNlIE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQ6CisJCQkJaWYgKGJNaXhDaXBoZXIpCisJCQkJCU5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPm1jYXN0LCBPVUlfV1BBX1RLSVAsIDQpOworCQkJCWVsc2UKKwkJCQkJTmRpc01vdmVNZW1vcnkocFJzbmllX2NpcGhlci0+bWNhc3QsIE9VSV9XUEFfQ0NNUCwgNCk7CisgICAgICAgICAgICAgICAgcFJzbmllX2NpcGhlci0+dWNvdW50ID0gMTsKKyAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwUnNuaWVfY2lwaGVyLT51Y2FzdFswXS5vdWksIE9VSV9XUEFfQ0NNUCwgNCk7CisgICAgICAgICAgICAgICAgKnJzbl9sZW4gPSBzaXplb2YoUlNOSUUpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisJCQkvLyBUS0lQLUFFUyBtaXggbW9kZQorICAgICAgICAgICAgY2FzZSBOZGlzODAyXzExRW5jcnlwdGlvbjRFbmFibGVkOgorICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPm1jYXN0LCBPVUlfV1BBX1RLSVAsIDQpOworCisJCQkJUGFpcndpc2VDbnQgPSAxOworCQkJCS8vIEluc2VydCBXUEEgVEtJUCBhcyB0aGUgZmlyc3QgcGFpcndpc2UgY2lwaGVyCisJCQkJaWYgKE1JWF9DSVBIRVJfV1BBX1RLSVBfT04oRmxleGlibGVDaXBoZXIpKQorCQkJCXsKKyAgICAgICAgICAgICAgICAJTmRpc01vdmVNZW1vcnkocFJzbmllX2NpcGhlci0+dWNhc3RbMF0ub3VpLCBPVUlfV1BBX1RLSVAsIDQpOworCQkJCQkvLyBJbnNlcnQgV1BBIEFFUyBhcyB0aGUgc2Vjb25kYXJ5IHBhaXJ3aXNlIGNpcGhlcgorCQkJCQlpZiAoTUlYX0NJUEhFUl9XUEFfQUVTX09OKEZsZXhpYmxlQ2lwaGVyKSkKKwkJCQkJeworICAgICAgICAgICAgICAgIAkJTmRpc01vdmVNZW1vcnkocFJzbmllX2NpcGhlci0+dWNhc3RbMF0ub3VpICsgNCwgT1VJX1dQQV9DQ01QLCA0KTsKKwkJCQkJCVBhaXJ3aXNlQ250ID0gMjsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQkvLyBJbnNlcnQgV1BBIEFFUyBhcyB0aGUgZmlyc3QgcGFpcndpc2UgY2lwaGVyCisJCQkJCU5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPnVjYXN0WzBdLm91aSwgT1VJX1dQQV9DQ01QLCA0KTsKKwkJCQl9CisKKyAgICAgICAgICAgICAgICBwUnNuaWVfY2lwaGVyLT51Y291bnQgPSBQYWlyd2lzZUNudDsKKyAgICAgICAgICAgICAgICAqcnNuX2xlbiA9IHNpemVvZihSU05JRSkgKyAoNCAqIChQYWlyd2lzZUNudCAtIDEpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisJCS8vIHN3YXAgZm9yIGJpZy1lbmRpYW4gcGxhdGZvcm0KKwkJcFJzbmllX2NpcGhlci0+dmVyc2lvbiA9IGNwdTJsZTE2KHBSc25pZV9jaXBoZXItPnZlcnNpb24pOworCSAgICBwUnNuaWVfY2lwaGVyLT51Y291bnQgPSBjcHUybGUxNihwUnNuaWVfY2lwaGVyLT51Y291bnQpOworCX0KKworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJQnVpbGQgQUtNIHN1aXRlIGluIFJTTi1JRS4KKwkJSXQgb25seSBzaGFsbCBiZSBjYWxsZWQgYnkgUlRNUE1ha2VSU05JRS4KKworCUFyZ3VtZW50czoKKwkJcEFkCQkJLQlwb2ludGVyIHRvIG91ciBwQWRhcHRlciBjb250ZXh0CisgICAgCUVsZW1lbnRJRAktCWluZGljYXRlIHRoZSBXUEExIG9yIFdQQTIKKyAgICAJQXV0aE1vZGUJLQlpbmRpY2F0ZSB0aGUgYXV0aGVudGljYXRpb24gbW9kZQorCQlhcGlkeAkJLQlpbmRpY2F0ZSB0aGUgaW50ZXJmYWNlIGluZGV4CisKKwlSZXR1cm4gVmFsdWU6CisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworc3RhdGljIFZPSUQgUlRNUEluc2VydFJzbkllQUtNKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOCVVDSEFSCQkJRWxlbWVudElELAorCUlOCVVJTlQJCQlBdXRoTW9kZSwKKwlJTglVQ0hBUgkJCWFwaWR4LAorCU9VVAlQVUNIQVIJCQlwUnNuSWUsCisJT1VUCVVDSEFSCQkJKnJzbl9sZW4pCit7CisJUlNOSUVfQVVUSAkJKnBSc25pZV9hdXRoOworCisJcFJzbmllX2F1dGggPSAoUlNOSUVfQVVUSCopKHBSc25JZSArICgqcnNuX2xlbikpOworCisJLy8gZGVjaWRlIFdQQTIgb3IgV1BBMQorCWlmIChFbGVtZW50SUQgPT0gV3BhMkllKQorCXsKKwkJc3dpdGNoIChBdXRoTW9kZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBOZGlzODAyXzExQXV0aE1vZGVXUEEyOgorICAgICAgICAgICAgY2FzZSBOZGlzODAyXzExQXV0aE1vZGVXUEExV1BBMjoKKyAgICAgICAgICAgICAgICBwUnNuaWVfYXV0aC0+YWNvdW50ID0gMTsKKyAgICAgICAgICAgICAgICAJTmRpc01vdmVNZW1vcnkocFJzbmllX2F1dGgtPmF1dGhbMF0ub3VpLCBPVUlfV1BBMl84MDIxWF9BS00sIDQpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0s6CisgICAgICAgICAgICBjYXNlIE5kaXM4MDJfMTFBdXRoTW9kZVdQQTFQU0tXUEEyUFNLOgorICAgICAgICAgICAgICAgIHBSc25pZV9hdXRoLT5hY291bnQgPSAxOworICAgICAgICAgICAgICAgIAlOZGlzTW92ZU1lbW9yeShwUnNuaWVfYXV0aC0+YXV0aFswXS5vdWksIE9VSV9XUEEyX1BTS19BS00sIDQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisJfQorCWVsc2UKKwl7CisJCXN3aXRjaCAoQXV0aE1vZGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgTmRpczgwMl8xMUF1dGhNb2RlV1BBOgorICAgICAgICAgICAgY2FzZSBOZGlzODAyXzExQXV0aE1vZGVXUEExV1BBMjoKKyAgICAgICAgICAgICAgICBwUnNuaWVfYXV0aC0+YWNvdW50ID0gMTsKKyAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwUnNuaWVfYXV0aC0+YXV0aFswXS5vdWksIE9VSV9XUEFfODAyMVhfQUtNLCA0KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0s6CisgICAgICAgICAgICBjYXNlIE5kaXM4MDJfMTFBdXRoTW9kZVdQQTFQU0tXUEEyUFNLOgorICAgICAgICAgICAgICAgIHBSc25pZV9hdXRoLT5hY291bnQgPSAxOworICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBSc25pZV9hdXRoLT5hdXRoWzBdLm91aSwgT1VJX1dQQV9QU0tfQUtNLCA0KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworCQkJY2FzZSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lOgorICAgICAgICAgICAgICAgIHBSc25pZV9hdXRoLT5hY291bnQgPSAxOworICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBSc25pZV9hdXRoLT5hdXRoWzBdLm91aSwgT1VJX1dQQV9OT05FX0FLTSwgNCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKwl9CisKKwlwUnNuaWVfYXV0aC0+YWNvdW50ID0gY3B1MmxlMTYocFJzbmllX2F1dGgtPmFjb3VudCk7CisKKwkoKnJzbl9sZW4pICs9IHNpemVvZihSU05JRV9BVVRIKTsJLy8gdXBkYXRlIGN1cnJlbnQgUlNOSUUgbGVuZ3RoCisKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCUJ1aWxkIGNhcGFiaWxpdHkgaW4gUlNOLUlFLgorCQlJdCBvbmx5IHNoYWxsIGJlIGNhbGxlZCBieSBSVE1QTWFrZVJTTklFLgorCisJQXJndW1lbnRzOgorCQlwQWQJCQktCXBvaW50ZXIgdG8gb3VyIHBBZGFwdGVyIGNvbnRleHQKKyAgICAJRWxlbWVudElECS0JaW5kaWNhdGUgdGhlIFdQQTEgb3IgV1BBMgorCQlhcGlkeAkJLQlpbmRpY2F0ZSB0aGUgaW50ZXJmYWNlIGluZGV4CisKKwlSZXR1cm4gVmFsdWU6CisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworc3RhdGljIFZPSUQgUlRNUEluc2VydFJzbkllQ2FwKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOCVVDSEFSCQkJRWxlbWVudElELAorCUlOCVVDSEFSCQkJYXBpZHgsCisJT1VUCVBVQ0hBUgkJCXBSc25JZSwKKwlPVVQJVUNIQVIJCQkqcnNuX2xlbikKK3sKKwlSU05fQ0FQQUJJTElUSUVTICAgICpwUlNOX0NhcDsKKworCS8vIGl0IGNvdWxkIGJlIGlnbm9yZWQgaW4gV1BBMSBtb2RlCisJaWYgKEVsZW1lbnRJRCA9PSBXcGFJZSkKKwkJcmV0dXJuOworCisJcFJTTl9DYXAgPSAoUlNOX0NBUEFCSUxJVElFUyopKHBSc25JZSArICgqcnNuX2xlbikpOworCisKKwlwUlNOX0NhcC0+d29yZCA9IGNwdTJsZTE2KHBSU05fQ2FwLT53b3JkKTsKKworCSgqcnNuX2xlbikgKz0gc2l6ZW9mKFJTTl9DQVBBQklMSVRJRVMpOwkvLyB1cGRhdGUgY3VycmVudCBSU05JRSBsZW5ndGgKKworfQorCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlCdWlsZCBSU04gSUUgY29udGV4dC4gSXQgaXMgbm90IGluY2x1ZGVkIGVsZW1lbnQtSUQgYW5kIGxlbmd0aC4KKworCUFyZ3VtZW50czoKKwkJcEFkCQkJLQlwb2ludGVyIHRvIG91ciBwQWRhcHRlciBjb250ZXh0CisgICAgCUF1dGhNb2RlCS0JaW5kaWNhdGUgdGhlIGF1dGhlbnRpY2F0aW9uIG1vZGUKKyAgICAJV2VwU3RhdHVzCS0JaW5kaWNhdGUgdGhlIGVuY3J5cHRpb24gdHlwZQorCQlhcGlkeAkJLQlpbmRpY2F0ZSB0aGUgaW50ZXJmYWNlIGluZGV4CisKKwlSZXR1cm4gVmFsdWU6CisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBSVE1QTWFrZVJTTklFKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorICAgIElOICBVSU5UICAgICAgICAgICAgQXV0aE1vZGUsCisgICAgSU4gIFVJTlQgICAgICAgICAgICBXZXBTdGF0dXMsCisJSU4JVUNIQVIJCQlhcGlkeCkKK3sKKwlQVUNIQVIJCXBSc25JZSA9IE5VTEw7CQkJLy8gcHJpbWFyeSBSU05JRQorCVVDSEFSIAkJKnJzbmllbGVuX2N1cl9wID0gMDsJLy8gdGhlIGxlbmd0aCBvZiB0aGUgcHJpbWFyeSBSU05JRQorCVVDSEFSCQkqcnNuaWVsZW5fZXhfY3VyX3AgPSAwOwkvLyB0aGUgbGVuZ3RoIG9mIHRoZSBzZWNvbmRhcnkgUlNOSUUKKwlVQ0hBUgkJUHJpbWFyeVJzbmllOworCUJPT0xFQU4JCWJNaXhDaXBoZXIgPSBGQUxTRTsJLy8gaW5kaWNhdGUgdGhlIHBhaXJ3aXNlIGFuZCBncm91cCBjaXBoZXIgYXJlIGRpZmZlcmVudAorCVVDSEFSCQlwX29mZnNldDsKKwlXUEFfTUlYX1BBSVJfQ0lQSEVSCQlGbGV4aWJsZUNpcGhlciA9IE1JWF9DSVBIRVJfTk9UVVNFOwkvLyBpdCBwcm92aWRlIHRoZSBtb3JlIGZsZXhpYmxlIGNpcGhlciBjb21iaW5hdGlvbiBpbiBXUEEtV1BBMiBhbmQgVEtJUEFFUyBtb2RlCisKKwlyc25pZWxlbl9jdXJfcCA9IE5VTEw7CisJcnNuaWVsZW5fZXhfY3VyX3AgPSBOVUxMOworCisJeworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQl7CisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorCQkJaWYgKHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCAhPSBXUEFfU1VQUExJQ0FOVF9ESVNBQkxFKQorCQkJeworCQkJCWlmIChBdXRoTW9kZSA8IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKKwkJCQkJcmV0dXJuOworCQkJfQorCQkJZWxzZQorI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKwkJCXsKKwkJCQkvLyBTdXBwb3J0IFdQQVBTSyBvciBXUEEyUFNLIGluIFNUQS1JbmZyYSBtb2RlCisJCQkJLy8gU3VwcG9ydCBXUEFOb25lIGluIFNUQS1BZGhvYyBtb2RlCisJCQkJaWYgKChBdXRoTW9kZSAhPSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spICYmCisJCQkJCShBdXRoTW9kZSAhPSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKSAmJgorCQkJCQkoQXV0aE1vZGUgIT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZSkKKwkJCQkJKQorCQkJCQlyZXR1cm47CisJCQl9CisKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiPT0+IFJUTVBNYWtlUlNOSUUoU1RBKVxuIikpOworCisJCQkvLyBaZXJvIFJTTklFIGNvbnRleHQKKwkJCXBBZC0+U3RhQ2ZnLlJTTklFX0xlbiA9IDA7CisJCQlOZGlzWmVyb01lbW9yeShwQWQtPlN0YUNmZy5SU05fSUUsIE1BWF9MRU5fT0ZfUlNOSUUpOworCisJCQkvLyBQb2ludGVyIHRvIFJTTklFCisJCQlyc25pZWxlbl9jdXJfcCA9ICZwQWQtPlN0YUNmZy5SU05JRV9MZW47CisJCQlwUnNuSWUgPSBwQWQtPlN0YUNmZy5SU05fSUU7CisKKwkJCWJNaXhDaXBoZXIgPSBwQWQtPlN0YUNmZy5iTWl4Q2lwaGVyOworCQl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJfQorCisJLy8gaW5kaWNhdGUgcHJpbWFyeSBSU05JRSBhcyBXUEEgb3IgV1BBMgorCWlmICgoQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKSB8fAorCQkoQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKSB8fAorCQkoQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZSkgfHwKKwkJKEF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTFXUEEyKSB8fAorCQkoQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMVBTS1dQQTJQU0spKQorCQlQcmltYXJ5UnNuaWUgPSBXcGFJZTsKKwllbHNlCisJCVByaW1hcnlSc25pZSA9IFdwYTJJZTsKKworCXsKKwkJLy8gQnVpbGQgdGhlIHByaW1hcnkgUlNOSUUKKwkJLy8gMS4gaW5zZXJ0IGNpcGhlciBzdWl0ZQorCQlSVE1QSW5zZXJ0UnNuSWVDaXBoZXIocEFkLCBQcmltYXJ5UnNuaWUsIFdlcFN0YXR1cywgYk1peENpcGhlciwgRmxleGlibGVDaXBoZXIsIHBSc25JZSwgJnBfb2Zmc2V0KTsKKworCQkvLyAyLiBpbnNlcnQgQUtNCisJCVJUTVBJbnNlcnRSc25JZUFLTShwQWQsIFByaW1hcnlSc25pZSwgQXV0aE1vZGUsIGFwaWR4LCBwUnNuSWUsICZwX29mZnNldCk7CisKKwkJLy8gMy4gaW5zZXJ0IGNhcGFiaWxpdHkKKwkJUlRNUEluc2VydFJzbkllQ2FwKHBBZCwgUHJpbWFyeVJzbmllLCBhcGlkeCwgcFJzbkllLCAmcF9vZmZzZXQpOworCX0KKworCS8vIDQuIHVwZGF0ZSB0aGUgUlNOSUUgbGVuZ3RoCisJKnJzbmllbGVuX2N1cl9wID0gcF9vZmZzZXQ7CisKKwloZXhfZHVtcCgiVGhlIHByaW1hcnkgUlNOSUUiLCBwUnNuSWUsICgqcnNuaWVsZW5fY3VyX3ApKTsKKworCit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKwkJQ2hlY2sgd2hldGhlciB0aGUgcmVjZWl2ZWQgZnJhbWUgaXMgRUFQIGZyYW1lLgorCisJQXJndW1lbnRzOgorCQlwQWQJCQkJLQlwb2ludGVyIHRvIG91ciBwQWRhcHRlciBjb250ZXh0CisJCXBFbnRyeQkJCS0JcG9pbnRlciB0byBhY3RpdmUgZW50cnkKKwkJcERhdGEJCQktCXRoZSByZWNlaXZlZCBmcmFtZQorCQlEYXRhQnl0ZUNvdW50IAktCXRoZSByZWNlaXZlZCBmcmFtZSdzIGxlbmd0aAorCQlGcm9tV2hpY2hCU1NJRAktCWluZGljYXRlIHRoZSBpbnRlcmZhY2UgaW5kZXgKKworICAgIFJldHVybjoKKyAgICAgICAgIFRSVUUgCQkJLQlUaGlzIGZyYW1lIGlzIEVBUCBmcmFtZQorICAgICAgICAgRkFMU0UgCQkJLQlvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0JPT0xFQU4gUlRNUENoZWNrV1BBZnJhbWUoCisgICAgSU4gUFJUTVBfQURBUFRFUiAgICBwQWQsCisgICAgSU4gUE1BQ19UQUJMRV9FTlRSWQlwRW50cnksCisgICAgSU4gUFVDSEFSICAgICAgICAgICBwRGF0YSwKKyAgICBJTiBVTE9ORyAgICAgICAgICAgIERhdGFCeXRlQ291bnQsCisJSU4gVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCkKK3sKKwlVTE9ORwlCb2R5X2xlbjsKKwlCT09MRUFOIENhbmNlbGxlZDsKKworCisgICAgaWYoRGF0YUJ5dGVDb3VudCA8IChMRU5HVEhfODAyXzFfSCArIExFTkdUSF9FQVBPTF9IKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisKKwkvLyBTa2lwIExMQyBoZWFkZXIKKyAgICBpZiAoTmRpc0VxdWFsTWVtb3J5KFNOQVBfODAyXzFILCBwRGF0YSwgNikgfHwKKyAgICAgICAgLy8gQ2lzY28gMTIwMCBBUCBtYXkgc2VuZCBwYWNrZXQgd2l0aCBTTkFQX0JSSURHRV9UVU5ORUwKKyAgICAgICAgTmRpc0VxdWFsTWVtb3J5KFNOQVBfQlJJREdFX1RVTk5FTCwgcERhdGEsIDYpKQorICAgIHsKKyAgICAgICAgcERhdGEgKz0gNjsKKyAgICB9CisJLy8gU2tpcCAyLWJ5dGVzIEVBUG9MIHR5cGUKKyAgICBpZiAoTmRpc0VxdWFsTWVtb3J5KEVBUE9MLCBwRGF0YSwgMikpCisgICAgeworICAgICAgICBwRGF0YSArPSAyOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgIHN3aXRjaCAoKihwRGF0YSsxKSkKKyAgICB7CisgICAgICAgIGNhc2UgRUFQUGFja2V0OgorCQkJQm9keV9sZW4gPSAoKihwRGF0YSsyKTw8OCkgfCAoKihwRGF0YSszKSk7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSZWNlaXZlIEVBUC1QYWNrZXQgZnJhbWUsIFRZUEUgPSAwLCBMZW5ndGggPSAlbGRcbiIsIEJvZHlfbGVuKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBFQVBPTFN0YXJ0OgorICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmVjZWl2ZSBFQVBPTC1TdGFydCBmcmFtZSwgVFlQRSA9IDEgXG4iKSk7CisJCQlpZiAocEVudHJ5LT5FbnF1ZXVlRWFwb2xTdGFydFRpbWVyUnVubmluZyAhPSBFQVBPTF9TVEFSVF9ESVNBQkxFKQorICAgICAgICAgICAgeworICAgICAgICAgICAgCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNhbmNlbCB0aGUgRW5xdWV1ZUVhcG9sU3RhcnRUaW1lclJ1bm5pbmcgXG4iKSk7CisgICAgICAgICAgICAgICAgUlRNUENhbmNlbFRpbWVyKCZwRW50cnktPkVucXVldWVTdGFydEZvclBTS1RpbWVyLCAmQ2FuY2VsbGVkKTsKKyAgICAgICAgICAgICAgICBwRW50cnktPkVucXVldWVFYXBvbFN0YXJ0VGltZXJSdW5uaW5nID0gRUFQT0xfU1RBUlRfRElTQUJMRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEVBUE9MTG9nb2ZmOgorICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmVjZWl2ZSBFQVBPTExvZ29mZiBmcmFtZSwgVFlQRSA9IDIgXG4iKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBFQVBPTEtleToKKwkJCUJvZHlfbGVuID0gKCoocERhdGErMik8PDgpIHwgKCoocERhdGErMykpOworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmVjZWl2ZSBFQVBPTC1LZXkgZnJhbWUsIFRZUEUgPSAzLCBMZW5ndGggPSAlbGRcbiIsIEJvZHlfbGVuKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBFQVBPTEFTRkFsZXJ0OgorICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmVjZWl2ZSBFQVBPTEFTRkFsZXJ0IGZyYW1lLCBUWVBFID0gNCBcbiIpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgfQorICAgIHJldHVybiBUUlVFOworfQorCisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgRU5DUllQVCBBRVMgR1RLIGJlZm9yZSBzZW5kaW5nIGluIEVBUE9MIGZyYW1lLgorICAgICAgICBBRVMgR1RLIGxlbmd0aCA9IDEyOCBiaXQsICBzbyBmaXggYmxvY2tzIGZvciBhZXMta2V5LXdyYXAgYXMgMiBpbiB0aGlzIGZ1bmN0aW9uLgorICAgICAgICBUaGlzIGZ1bmN0aW9uIHJlZmVyZW5jZXMgdG8gUkZDIDMzOTQgZm9yIGFlcyBrZXkgd3JhcCBhbGdvcml0aG0uCisgICAgUmV0dXJuOgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBBRVNfR1RLX0tFWV9XUkFQKAorICAgIElOIFVDSEFSICAgICprZXksCisgICAgSU4gVUNIQVIgICAgKnBsYWludGV4dCwKKyAgICBJTiBVQ0hBUiAgICBwX2xlbiwKKyAgICBPVVQgVUNIQVIgICAqY2lwaGVydGV4dCkKK3sKKyAgICBVQ0hBUiAgICAgICBBWzhdLCBCSU5bMTZdLCBCT1VUWzE2XTsKKyAgICBVQ0hBUiAgICAgICBSWzUxMl07CisgICAgSU5UICAgICAgICAgbnVtX2Jsb2NrcyA9IHBfbGVuLzg7ICAgLy8gdW5pdDo2NGJpdHMKKyAgICBJTlQgICAgICAgICBpLCBqOworICAgIGFlc19jb250ZXh0IGFlc2N0eDsKKyAgICBVQ0hBUiAgICAgICB4b3I7CisKKyAgICBydG1wX2Flc19zZXRfa2V5KCZhZXNjdHgsIGtleSwgMTI4KTsKKworICAgIC8vIEluaXQgSUEKKyAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorICAgICAgICBBW2ldID0gMHhhNjsKKworICAgIC8vSW5wdXQgcGxhaW50ZXh0CisgICAgZm9yIChpID0gMDsgaSA8IG51bV9ibG9ja3M7IGkrKykKKyAgICB7CisgICAgICAgIGZvciAoaiA9IDAgOyBqIDwgODsgaisrKQorICAgICAgICAgICAgUls4ICogKGkgKyAxKSArIGpdID0gcGxhaW50ZXh0WzggKiBpICsgal07CisgICAgfQorCisgICAgLy8gS2V5IE1peAorICAgIGZvciAoaiA9IDA7IGogPCA2OyBqKyspCisgICAgeworICAgICAgICBmb3IoaSA9IDE7IGkgPD0gbnVtX2Jsb2NrczsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICAvL3BoYXNlIDEKKyAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KEJJTiwgQSwgOCk7CisgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeSgmQklOWzhdLCAmUls4ICogaV0sIDgpOworICAgICAgICAgICAgcnRtcF9hZXNfZW5jcnlwdCgmYWVzY3R4LCBCSU4sIEJPVVQpOworCisgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShBLCAmQk9VVFswXSwgOCk7CisgICAgICAgICAgICB4b3IgPSBudW1fYmxvY2tzICogaiArIGk7CisgICAgICAgICAgICBBWzddID0gQk9VVFs3XSBeIHhvcjsKKyAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KCZSWzggKiBpXSwgJkJPVVRbOF0sIDgpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gT3V0cHV0IGNpcGhlcnRleHQKKyAgICBOZGlzTW92ZU1lbW9yeShjaXBoZXJ0ZXh0LCBBLCA4KTsKKworICAgIGZvciAoaSA9IDE7IGkgPD0gbnVtX2Jsb2NrczsgaSsrKQorICAgIHsKKyAgICAgICAgZm9yIChqID0gMCA7IGogPCA4OyBqKyspCisgICAgICAgICAgICBjaXBoZXJ0ZXh0WzggKiBpICsgal0gPSBSWzggKiBpICsgal07CisgICAgfQorfQorCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlNaXNjIGZ1bmN0aW9uIHRvIGRlY3J5cHQgQUVTIGJvZHkKKworCUFyZ3VtZW50czoKKworCVJldHVybiBWYWx1ZToKKworCU5vdGU6CisJCVRoaXMgZnVuY3Rpb24gcmVmZXJlbmNlcyB0bwlSRkMJMzM5NCBmb3IgYWVzIGtleSB1bndyYXAgYWxnb3JpdGhtLgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlBRVNfR1RLX0tFWV9VTldSQVAoCisJSU4JVUNIQVIJKmtleSwKKwlPVVQJVUNIQVIJKnBsYWludGV4dCwKKwlJTglVQ0hBUiAgICBjX2xlbiwKKwlJTglVQ0hBUgkqY2lwaGVydGV4dCkKKworeworCVVDSEFSICAgICAgIEFbOF0sIEJJTlsxNl0sIEJPVVRbMTZdOworCVVDSEFSICAgICAgIHhvcjsKKwlJTlQgICAgICAgICBpLCBqOworCWFlc19jb250ZXh0IGFlc2N0eDsKKwlVQ0hBUiAgICAgICAqUjsKKwlJTlQgICAgICAgICBudW1fYmxvY2tzID0gY19sZW4vODsJLy8gdW5pdDo2NGJpdHMKKworCisJb3NfYWxsb2NfbWVtKE5VTEwsIChQVUNIQVIgKikmUiwgNTEyKTsKKworCWlmIChSID09IE5VTEwpCisgICAgeworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIhISFBRVNfR1RLX0tFWV9VTldSQVA6IG5vIG1lbW9yeSEhIVxuIikpOworICAgICAgICByZXR1cm47CisgICAgfSAvKiBFbmQgb2YgaWYgKi8KKworCS8vIEluaXRpYWxpemUKKwlOZGlzTW92ZU1lbW9yeShBLCBjaXBoZXJ0ZXh0LCA4KTsKKwkvL0lucHV0IHBsYWludGV4dAorCWZvcihpID0gMDsgaSA8IChjX2xlbi04KTsgaSsrKQorCXsKKwkJUlsgaV0gPSBjaXBoZXJ0ZXh0W2kgKyA4XTsKKwl9CisKKwlydG1wX2Flc19zZXRfa2V5KCZhZXNjdHgsIGtleSwgMTI4KTsKKworCWZvcihqID0gNTsgaiA+PSAwOyBqLS0pCisJeworCQlmb3IoaSA9IChudW1fYmxvY2tzLTEpOyBpID4gMDsgaS0tKQorCQl7CisJCQl4b3IgPSAobnVtX2Jsb2NrcyAtMSApKiBqICsgaTsKKwkJCU5kaXNNb3ZlTWVtb3J5KEJJTiwgQSwgOCk7CisJCQlCSU5bN10gPSBBWzddIF4geG9yOworCQkJTmRpc01vdmVNZW1vcnkoJkJJTls4XSwgJlJbKGktMSkqOF0sIDgpOworCQkJcnRtcF9hZXNfZGVjcnlwdCgmYWVzY3R4LCBCSU4sIEJPVVQpOworCQkJTmRpc01vdmVNZW1vcnkoQSwgJkJPVVRbMF0sIDgpOworCQkJTmRpc01vdmVNZW1vcnkoJlJbKGktMSkqOF0sICZCT1VUWzhdLCA4KTsKKwkJfQorCX0KKworCS8vIE9VVFBVVAorCWZvcihpID0gMDsgaSA8IGNfbGVuOyBpKyspCisJeworCQlwbGFpbnRleHRbaV0gPSBSW2ldOworCX0KKworCisJb3NfZnJlZV9tZW0oTlVMTCwgUik7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKwkJUmVwb3J0IHRoZSBFQVAgbWVzc2FnZSB0eXBlCisKKwlBcmd1bWVudHM6CisJCW1zZwkJLQlFQVBPTF9QQUlSX01TR18xCisJCQkJCUVBUE9MX1BBSVJfTVNHXzIKKwkJCQkJRUFQT0xfUEFJUl9NU0dfMworCQkJCQlFQVBPTF9QQUlSX01TR180CisJCQkJCUVBUE9MX0dST1VQX01TR18xCisJCQkJCUVBUE9MX0dST1VQX01TR18yCisKKyAgICBSZXR1cm46CisgICAgICAgICBtZXNzYWdlIHR5cGUgc3RyaW5nCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0NIQVIgKkdldEVhcG9sTXNnVHlwZShDSEFSIG1zZykKK3sKKyAgICBpZihtc2cgPT0gRUFQT0xfUEFJUl9NU0dfMSkKKyAgICAgICAgcmV0dXJuICJQYWlyd2lzZSBNZXNzYWdlIDEiOworICAgIGVsc2UgaWYobXNnID09IEVBUE9MX1BBSVJfTVNHXzIpCisgICAgICAgIHJldHVybiAiUGFpcndpc2UgTWVzc2FnZSAyIjsKKwllbHNlIGlmKG1zZyA9PSBFQVBPTF9QQUlSX01TR18zKQorICAgICAgICByZXR1cm4gIlBhaXJ3aXNlIE1lc3NhZ2UgMyI7CisJZWxzZSBpZihtc2cgPT0gRUFQT0xfUEFJUl9NU0dfNCkKKyAgICAgICAgcmV0dXJuICJQYWlyd2lzZSBNZXNzYWdlIDQiOworCWVsc2UgaWYobXNnID09IEVBUE9MX0dST1VQX01TR18xKQorICAgICAgICByZXR1cm4gIkdyb3VwIE1lc3NhZ2UgMSI7CisJZWxzZSBpZihtc2cgPT0gRUFQT0xfR1JPVVBfTVNHXzIpCisgICAgICAgIHJldHVybiAiR3JvdXAgTWVzc2FnZSAyIjsKKyAgICBlbHNlCisgICAgCXJldHVybiAiSW52YWxpZCBNZXNzYWdlIjsKK30KKworCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICBDaGVjayBTYW5pdHkgUlNOIElFIG9mIEVBUG9MIG1lc3NhZ2UKKworICAgIEFyZ3VtZW50czoKKworICAgIFJldHVybiBWYWx1ZToKKworCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworQk9PTEVBTiBSVE1QQ2hlY2tSU05JRSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBEYXRhLAorCUlOICBVQ0hBUiAgICAgICAgICAgRGF0YUxlbiwKKwlJTiAgTUFDX1RBQkxFX0VOVFJZICpwRW50cnksCisJT1VUCVVDSEFSCQkJKk9mZnNldCkKK3sKKwlQVUNIQVIgICAgICAgICAgICAgIHBWSUU7CisJVUNIQVIgICAgICAgICAgICAgICBsZW47CisJUEVJRF9TVFJVQ1QgICAgICAgICBwRWlkOworCUJPT0xFQU4JCQkJcmVzdWx0ID0gRkFMU0U7CisKKwlwVklFID0gcERhdGE7CisJbGVuCSA9IERhdGFMZW47CisJKk9mZnNldCA9IDA7CisKKwl3aGlsZSAobGVuID4gc2l6ZW9mKFJTTklFMikpCisJeworCQlwRWlkID0gKFBFSURfU1RSVUNUKSBwVklFOworCQkvLyBXUEEgUlNOIElFCisJCWlmICgocEVpZC0+RWlkID09IElFX1dQQSkgJiYgKE5kaXNFcXVhbE1lbW9yeShwRWlkLT5PY3RldCwgV1BBX09VSSwgNCkpKQorCQl7CisJCQlpZiAoKHBFbnRyeS0+QXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBIHx8IHBFbnRyeS0+QXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKSAmJgorCQkJCShOZGlzRXF1YWxNZW1vcnkocFZJRSwgcEVudHJ5LT5SU05fSUUsIHBFbnRyeS0+UlNOSUVfTGVuKSkgJiYKKwkJCQkocEVudHJ5LT5SU05JRV9MZW4gPT0gKHBFaWQtPkxlbiArIDIpKSkKKwkJCXsKKwkJCQkJcmVzdWx0ID0gVFJVRTsKKwkJCX0KKworCQkJKk9mZnNldCArPSAocEVpZC0+TGVuICsgMik7CisJCX0KKwkJLy8gV1BBMiBSU04gSUUKKwkJZWxzZSBpZiAoKHBFaWQtPkVpZCA9PSBJRV9SU04pICYmIChOZGlzRXF1YWxNZW1vcnkocEVpZC0+T2N0ZXQgKyAyLCBSU05fT1VJLCAzKSkpCisJCXsKKwkJCWlmICgocEVudHJ5LT5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyIHx8IHBFbnRyeS0+QXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykgJiYKKwkJCQkoTmRpc0VxdWFsTWVtb3J5KHBWSUUsIHBFbnRyeS0+UlNOX0lFLCBwRW50cnktPlJTTklFX0xlbikpICYmCisJCQkJKHBFbnRyeS0+UlNOSUVfTGVuID09IChwRWlkLT5MZW4gKyAyKSkvKiBUb0RvLUFsYmVydFkgZm9yIG1lc2gqLykKKwkJCXsKKwkJCQkJcmVzdWx0ID0gVFJVRTsKKwkJCX0KKworCQkJKk9mZnNldCArPSAocEVpZC0+TGVuICsgMik7CisJCX0KKwkJZWxzZQorCQl7CisJCQlicmVhazsKKwkJfQorCisJCXBWSUUgKz0gKHBFaWQtPkxlbiArIDIpOworCQlsZW4gIC09IChwRWlkLT5MZW4gKyAyKTsKKwl9CisKKworCXJldHVybiByZXN1bHQ7CisKK30KKworCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICBQYXJzZSBLRVlEQVRBIGZpZWxkLiAgS0VZREFUQVtdIE1heSBjb250YWluIDIgUlNOIElFIGFuZCBvcHRpb25hbGx5IEdUSy4KKyAgICBHVEsgIGlzIGVuY2FwdHVsYXRlZCBpbiBLREUgZm9ybWF0IGF0ICBwLjgzIDgwMi4xMWkgRDEwCisKKyAgICBBcmd1bWVudHM6CisKKyAgICBSZXR1cm4gVmFsdWU6CisKKyAgICBOb3RlOgorICAgICAgICA4MDIuMTFpIEQxMAorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworQk9PTEVBTiBSVE1QUGFyc2VFYXBvbEtleURhdGEoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFBVQ0hBUiAgICAgICAgICBwS2V5RGF0YSwKKwlJTiAgVUNIQVIgICAgICAgICAgIEtleURhdGFMZW4sCisJSU4JVUNIQVIJCQlHcm91cEtleUluZGV4LAorCUlOCVVDSEFSCQkJTXNnVHlwZSwKKwlJTglCT09MRUFOCQkJYldQQTIsCisJSU4gIE1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5KQoreworICAgIFBLREVfRU5DQVAgICAgICAgICAgcEtERSA9IE5VTEw7CisgICAgUFVDSEFSICAgICAgICAgICAgICBwTXlLZXlEYXRhID0gcEtleURhdGE7CisgICAgVUNIQVIgICAgICAgICAgICAgICBLZXlEYXRhTGVuZ3RoID0gS2V5RGF0YUxlbjsKKyAgICBVQ0hBUiAgICAgICAgICAgICAgIEdUS0xFTiA9IDA7CisJVUNIQVIJCQkJRGVmYXVsdElkeCA9IDA7CisJVUNIQVIJCQkJc2tpcF9vZmZzZXQ7CisKKwkvLyBWZXJpZnkgVGhlIFJTTiBJRSBjb250YWluZWQgaW4gcGFpcmV3aXNlX21zZ18yICYmIHBhaXJld2lzZV9tc2dfMyBhbmQgc2tpcCBpdAorCWlmIChNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzIgfHwgTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18zKQorICAgIHsKKwkJLy8gQ2hlY2sgUlNOIElFIHdoZXRoZXIgaXQgaXMgV1BBMi9XUEEyUFNLCisJCWlmICghUlRNUENoZWNrUlNOSUUocEFkLCBwS2V5RGF0YSwgS2V5RGF0YUxlbiwgcEVudHJ5LCAmc2tpcF9vZmZzZXQpKQorCQl7CisJCQkvLyBzZW5kIHdpcmVsZXNzIGV2ZW50IC0gZm9yIFJTTiBJRSBkaWZmZXJlbnQKKwkJCWlmIChwQWQtPkNvbW1vbkNmZy5iV2lyZWxlc3NFdmVudCkKKwkJCQlSVE1QU2VuZFdpcmVsZXNzRXZlbnQocEFkLCBJV19SU05JRV9ESUZGX0VWRU5UX0ZMQUcsIHBFbnRyeS0+QWRkciwgcEVudHJ5LT5hcGlkeCwgMCk7CisKKyAgICAgICAgCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlJTTl9JRSBEaWZmZXJlbnQgaW4gbXNnICVkIG9mIDQtd2F5IGhhbmRzaGFrZSFcbiIsIE1zZ1R5cGUpKTsKKwkJCWhleF9kdW1wKCJSZWNlaXZlIFJTTl9JRSAiLCBwS2V5RGF0YSwgS2V5RGF0YUxlbik7CisJCQloZXhfZHVtcCgiRGVzaXJlZCBSU05fSUUgIiwgcEVudHJ5LT5SU05fSUUsIHBFbnRyeS0+UlNOSUVfTGVuKTsKKworCQkJcmV0dXJuIEZBTFNFOworICAgIAl9CisgICAgCWVsc2UKKwkJeworCQkJaWYgKGJXUEEyICYmIE1zZ1R5cGUgPT0gRUFQT0xfUEFJUl9NU0dfMykKKwkJCXsKKwkJCQkvLyBza2lwIFJTTiBJRQorCQkJCXBNeUtleURhdGEgKz0gc2tpcF9vZmZzZXQ7CisJCQkJS2V5RGF0YUxlbmd0aCAtPSBza2lwX29mZnNldDsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVE1QUGFyc2VFYXBvbEtleURhdGEgPT0+IFdQQTIvV1BBMlBTSyBSU04gSUUgbWF0Y2hlZCBpbiBNc2cgMywgTGVuZ3RoKCVkKSBcbiIsIHNraXBfb2Zmc2V0KSk7CisJCQl9CisJCQllbHNlCisJCQkJcmV0dXJuIFRSVUU7CisJCX0KKwl9CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJUTVBQYXJzZUVhcG9sS2V5RGF0YSA9PT4gS2V5RGF0YUxlbmd0aCAlZCB3aXRob3V0IFJTTl9JRSBcbiIsIEtleURhdGFMZW5ndGgpKTsKKworCS8vIFBhcnNlIEVLRCBmb3JtYXQgaW4gcGFpcndpc2VfbXNnXzNfV1BBMiAmJiBncm91cF9tc2dfMV9XUEEyCisJaWYgKGJXUEEyICYmIChNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzMgfHwgTXNnVHlwZSA9PSBFQVBPTF9HUk9VUF9NU0dfMSkpCisJeworCQlpZiAoS2V5RGF0YUxlbmd0aCA+PSA4KQkvLyBLREUgZm9ybWF0IGV4Y2x1ZGUgR1RLIGxlbmd0aAorICAgIAl7CisgICAgICAgIAlwS0RFID0gKFBLREVfRU5DQVApIHBNeUtleURhdGE7CisKKworCQkJRGVmYXVsdElkeCA9IHBLREUtPkdUS0VuY2FwLktpZDsKKworCQkJLy8gU2FuaXR5IGNoZWNrIC0gS0VEIGxlbmd0aAorCQkJaWYgKEtleURhdGFMZW5ndGggPCAocEtERS0+TGVuICsgMikpCisgICAgCQl7CisgICAgICAgIAkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiRVJST1I6IFRoZSBsZW4gZnJvbSBLREUgaXMgdG9vIHNob3J0IFxuIikpOworICAgICAgICAJCXJldHVybiBGQUxTRTsKKyAgICAJCX0KKworCQkJLy8gR2V0IEdUSyBsZW5ndGggLSByZWZlciB0byBJRUVFIDgwMi4xMWktMjAwNCBwLjgyCisJCQlHVEtMRU4gPSBwS0RFLT5MZW4gLTY7CisJCQlpZiAoR1RLTEVOIDwgTEVOX0FFU19LRVkpCisJCQl7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiRVJST1I6IEdUSyBLZXkgbGVuZ3RoIGlzIHRvbyBzaG9ydCAoJWQpIFxuIiwgR1RLTEVOKSk7CisgICAgICAgIAkJcmV0dXJuIEZBTFNFOworCQkJfQorCisgICAgCX0KKwkJZWxzZQorICAgIAl7CisJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJFUlJPUjogS0RFIGZvcm1hdCBsZW5ndGggaXMgdG9vIHNob3J0IFxuIikpOworCSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIAl9CisKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiR1RLIGluIEtERSBmb3JtYXQgLERlZmF1bHRLZXlJRD0lZCwgS2V5TGVuPSVkIFxuIiwgRGVmYXVsdElkeCwgR1RLTEVOKSk7CisJCS8vIHNraXAgaXQKKwkJcE15S2V5RGF0YSArPSA4OworCQlLZXlEYXRhTGVuZ3RoIC09IDg7CisKKwl9CisJZWxzZSBpZiAoIWJXUEEyICYmIE1zZ1R5cGUgPT0gRUFQT0xfR1JPVVBfTVNHXzEpCisJeworCQlEZWZhdWx0SWR4ID0gR3JvdXBLZXlJbmRleDsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiR1RLIERlZmF1bHRLZXlJRD0lZCBcbiIsIERlZmF1bHRJZHgpKTsKKwl9CisKKwkvLyBTYW5pdHkgY2hlY2sgLSBzaGFyZWQga2V5IGluZGV4IG11c3QgYmUgMSB+IDMKKwlpZiAoRGVmYXVsdElkeCA8IDEgfHwgRGVmYXVsdElkeCA+IDMpCisgICAgeworICAgICAJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiRVJST1I6IEdUSyBLZXkgaW5kZXgoJWQpIGlzIGludmFsaWQgaW4gJXMgJXMgXG4iLCBEZWZhdWx0SWR4LCAoKGJXUEEyKSA/ICJXUEEyIiA6ICJXUEEiKSwgR2V0RWFwb2xNc2dUeXBlKE1zZ1R5cGUpKSk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCS8vIFRvZG8KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCXJldHVybiBUUlVFOworCit9CisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCUNvbnN0cnVjdCBFQVBvTCBtZXNzYWdlIGZvciBXUEEgaGFuZHNoYWtpbmcKKwkJSXRzIGZvcm1hdCBpcyBiZWxvdywKKworCQkrLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisJCXwgUHJvdG9jb2wgVmVyc2lvbgkgfCAgMSBvY3RldAorCQkrLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisJCXwgUHJvdG9jb2wgVHlwZQkJIHwJMSBvY3RldAorCQkrLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisJCXwgQm9keSBMZW5ndGgJCSB8ICAyIG9jdGV0cworCQkrLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisJCXwgRGVzY3JpcHRvciBUeXBlCSB8CTEgb2N0ZXQKKwkJKy0tLS0tLS0tLS0tLS0tLS0tLS0tKworCQl8IEtleSBJbmZvcm1hdGlvbiAgICB8CTIgb2N0ZXRzCisJCSstLS0tLS0tLS0tLS0tLS0tLS0tLSsKKwkJfCBLZXkgTGVuZ3RoCSAgICAgfCAgMSBvY3RldAorCQkrLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisJCXwgS2V5IFJlcGFseSBDb3VudGVyIHwJOCBvY3RldHMKKwkJKy0tLS0tLS0tLS0tLS0tLS0tLS0tKworCQl8IEtleSBOb25jZQkJICAgICB8ICAzMiBvY3RldHMKKwkJKy0tLS0tLS0tLS0tLS0tLS0tLS0tKworCQl8IEtleSBJVgkJCSB8ICAxNiBvY3RldHMKKwkJKy0tLS0tLS0tLS0tLS0tLS0tLS0tKworCQl8IEtleSBSU0MJCQkgfCAgOCBvY3RldHMKKwkJKy0tLS0tLS0tLS0tLS0tLS0tLS0tKworCQl8IEtleSBJRCBvciBSZXNlcnZlZCB8CTggb2N0ZXRzCisJCSstLS0tLS0tLS0tLS0tLS0tLS0tLSsKKwkJfCBLZXkgTUlDCQkJIHwJMTYgb2N0ZXRzCisJCSstLS0tLS0tLS0tLS0tLS0tLS0tLSsKKwkJfCBLZXkgRGF0YSBMZW5ndGgJIHwJMiBvY3RldHMKKwkJKy0tLS0tLS0tLS0tLS0tLS0tLS0tKworCQl8IEtleSBEYXRhCQkJIHwJbiBvY3RldHMKKwkJKy0tLS0tLS0tLS0tLS0tLS0tLS0tKworCisKKwlBcmd1bWVudHM6CisJCXBBZAkJCVBvaW50ZXIJdG8gb3VyIGFkYXB0ZXIKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJQ29uc3RydWN0RWFwb2xNc2coCisJSU4gCVBSVE1QX0FEQVBURVIgICAgCXBBZCwKKyAgICBJTiAJVUNIQVIJCQkJQXV0aE1vZGUsCisgICAgSU4gCVVDSEFSCQkJCVdlcFN0YXR1cywKKyAgICBJTiAJVUNIQVIJCQkJR3JvdXBLZXlXZXBTdGF0dXMsCisgICAgSU4gCVVDSEFSCQkJCU1zZ1R5cGUsCisgICAgSU4JVUNIQVIJCQkJRGVmYXVsdEtleUlkeCwKKyAgICBJTiAJVUNIQVIJCQkJKlJlcGxheUNvdW50ZXIsCisJSU4gCVVDSEFSCQkJCSpLZXlOb25jZSwKKwlJTglVQ0hBUgkJCQkqVHhSU0MsCisJSU4JVUNIQVIJCQkJKlBUSywKKwlJTglVQ0hBUgkJCQkqR1RLLAorCUlOCVVDSEFSCQkJCSpSU05JRSwKKwlJTglVQ0hBUgkJCQlSU05JRV9MZW4sCisgICAgT1VUIFBFQVBPTF9QQUNLRVQgICAgICAgcE1zZykKK3sKKwlCT09MRUFOCWJXUEEyID0gRkFMU0U7CisKKwkvLyBDaG9vc2UgV1BBMiBvciBub3QKKwlpZiAoKEF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIpIHx8IChBdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKSkKKwkJYldQQTIgPSBUUlVFOworCisgICAgLy8gSW5pdCBQYWNrZXQgYW5kIEZpbGwgaGVhZGVyCisgICAgcE1zZy0+UHJvVmVyID0gRUFQT0xfVkVSOworICAgIHBNc2ctPlByb1R5cGUgPSBFQVBPTEtleTsKKworCS8vIERlZmF1bHQgOTUgYnl0ZXMsIHRoZSBFQVBvTC1LZXkgZGVzY3JpcHRvciBleGNsdWRlIEtleS1kYXRhIGZpZWxkCisJcE1zZy0+Qm9keV9MZW5bMV0gPSBMRU5fRUFQT0xfS0VZX01TRzsKKworCS8vIEZpbGwgaW4gRUFQb0wgZGVzY3JpcHRvcgorCWlmIChiV1BBMikKKwkJcE1zZy0+S2V5RGVzYy5UeXBlID0gV1BBMl9LRVlfREVTQzsKKwllbHNlCisJCXBNc2ctPktleURlc2MuVHlwZSA9IFdQQTFfS0VZX0RFU0M7CisKKwkvLyBGaWxsIGluIEtleSBpbmZvcm1hdGlvbiwgcmVmZXIgdG8gSUVFRSBTdGQgODAyLjExaS0yMDA0IHBhZ2UgNzgKKwkvLyBXaGVuIGVpdGhlciB0aGUgcGFpcndpc2Ugb3IgdGhlIGdyb3VwIGNpcGhlciBpcyBBRVMsIHRoZSBERVNDX1RZUEVfQUVTKDIpIHNoYWxsIGJlIHVzZWQuCisJcE1zZy0+S2V5RGVzYy5LZXlJbmZvLktleURlc2NWZXIgPQorICAgICAgICAJKCgoV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpIHx8IChHcm91cEtleVdlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKSkgPyAoREVTQ19UWVBFX0FFUykgOiAoREVTQ19UWVBFX1RLSVApKTsKKworCS8vIFNwZWNpZnkgS2V5IFR5cGUgYXMgR3JvdXAoMCkgb3IgUGFpcndpc2UoMSkKKwlpZiAoTXNnVHlwZSA+PSBFQVBPTF9HUk9VUF9NU0dfMSkKKwkJcE1zZy0+S2V5RGVzYy5LZXlJbmZvLktleVR5cGUgPSBHUk9VUEtFWTsKKwllbHNlCisJCXBNc2ctPktleURlc2MuS2V5SW5mby5LZXlUeXBlID0gUEFJUldJU0VLRVk7CisKKwkvLyBTcGVjaWZ5IEtleSBJbmRleCwgb25seSBncm91cF9tc2cxX1dQQTEKKwlpZiAoIWJXUEEyICYmIChNc2dUeXBlID49IEVBUE9MX0dST1VQX01TR18xKSkKKwkJcE1zZy0+S2V5RGVzYy5LZXlJbmZvLktleUluZGV4ID0gRGVmYXVsdEtleUlkeDsKKworCWlmIChNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzMpCisJCXBNc2ctPktleURlc2MuS2V5SW5mby5JbnN0YWxsID0gMTsKKworCWlmICgoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18xKSB8fCAoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18zKSB8fCAoTXNnVHlwZSA9PSBFQVBPTF9HUk9VUF9NU0dfMSkpCisJCXBNc2ctPktleURlc2MuS2V5SW5mby5LZXlBY2sgPSAxOworCisJaWYgKE1zZ1R5cGUgIT0gRUFQT0xfUEFJUl9NU0dfMSkKKwkJcE1zZy0+S2V5RGVzYy5LZXlJbmZvLktleU1pYyA9IDE7CisKKwlpZiAoKGJXUEEyICYmIChNc2dUeXBlID49IEVBUE9MX1BBSVJfTVNHXzMpKSB8fCAoIWJXUEEyICYmIChNc2dUeXBlID49IEVBUE9MX0dST1VQX01TR18xKSkpCisgICAgeworICAgICAgIAlwTXNnLT5LZXlEZXNjLktleUluZm8uU2VjdXJlID0gMTsKKyAgICB9CisKKwlpZiAoYldQQTIgJiYgKChNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzMpIHx8IChNc2dUeXBlID09IEVBUE9MX0dST1VQX01TR18xKSkpCisgICAgeworICAgICAgICBwTXNnLT5LZXlEZXNjLktleUluZm8uRUtEX0RMID0gMTsKKyAgICB9CisKKwkvLyBrZXkgSW5mb3JtYXRpb24gZWxlbWVudCBoYXMgZG9uZS4KKwkqKFVTSE9SVCAqKSgmcE1zZy0+S2V5RGVzYy5LZXlJbmZvKSA9IGNwdTJsZTE2KCooVVNIT1JUICopKCZwTXNnLT5LZXlEZXNjLktleUluZm8pKTsKKworCS8vIEZpbGwgaW4gS2V5IExlbmd0aAorCXsKKwkJaWYgKE1zZ1R5cGUgPj0gRUFQT0xfR1JPVVBfTVNHXzEpCisJCXsKKwkJCS8vIHRoZSBsZW5ndGggb2YgZ3JvdXAga2V5IGNpcGhlcgorCQkJcE1zZy0+S2V5RGVzYy5LZXlMZW5ndGhbMV0gPSAoKEdyb3VwS2V5V2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpID8gVEtJUF9HVEtfTEVOR1RIIDogTEVOX0FFU19LRVkpOworCQl9CisJCWVsc2UKKwkJeworCQkJLy8gdGhlIGxlbmd0aCBvZiBwYWlyd2lzZSBrZXkgY2lwaGVyCisJCQlwTXNnLT5LZXlEZXNjLktleUxlbmd0aFsxXSA9ICgoV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpID8gTEVOX1RLSVBfS0VZIDogTEVOX0FFU19LRVkpOworCQl9CisJfQorCisgCS8vIEZpbGwgaW4gcmVwbGF5IGNvdW50ZXIKKyAgICBOZGlzTW92ZU1lbW9yeShwTXNnLT5LZXlEZXNjLlJlcGxheUNvdW50ZXIsIFJlcGxheUNvdW50ZXIsIExFTl9LRVlfREVTQ19SRVBMQVkpOworCisJLy8gRmlsbCBLZXkgTm9uY2UgZmllbGQKKwkvLyBBTm9uY2UgOiBwYWlyd2lzZV9tc2cxICYgcGFpcndpc2VfbXNnMworCS8vIFNOb25jZSA6IHBhaXJ3aXNlX21zZzIKKwkvLyBHTm9uY2UgOiBncm91cF9tc2cxX3dwYTEKKwlpZiAoKE1zZ1R5cGUgPD0gRUFQT0xfUEFJUl9NU0dfMykgfHwgKCghYldQQTIgJiYgKE1zZ1R5cGUgPT0gRUFQT0xfR1JPVVBfTVNHXzEpKSkpCisgICAgCU5kaXNNb3ZlTWVtb3J5KHBNc2ctPktleURlc2MuS2V5Tm9uY2UsIEtleU5vbmNlLCBMRU5fS0VZX0RFU0NfTk9OQ0UpOworCisJLy8gRmlsbCBrZXkgSVYgLSBXUEEyIGFzIDAsIFdQQTEgYXMgcmFuZG9tCisJaWYgKCFiV1BBMiAmJiAoTXNnVHlwZSA9PSBFQVBPTF9HUk9VUF9NU0dfMSkpCisJeworCQkvLyBTdWdnZXN0IElWIGJlIHJhbmRvbSBudW1iZXIgcGx1cyBzb21lIG51bWJlciwKKwkJTmRpc01vdmVNZW1vcnkocE1zZy0+S2V5RGVzYy5LZXlJdiwgJktleU5vbmNlWzE2XSwgTEVOX0tFWV9ERVNDX0lWKTsKKyAgICAgICAgcE1zZy0+S2V5RGVzYy5LZXlJdlsxNV0gKz0gMjsKKwl9CisKKyAgICAvLyBGaWxsIEtleSBSU0MgZmllbGQKKyAgICAvLyBJdCBjb250YWlucyB0aGUgUlNDIGZvciB0aGUgR1RLIGJlaW5nIGluc3RhbGxlZC4KKwlpZiAoKE1zZ1R5cGUgPT0gRUFQT0xfUEFJUl9NU0dfMyAmJiBiV1BBMikgfHwgKE1zZ1R5cGUgPT0gRUFQT0xfR1JPVVBfTVNHXzEpKQorCXsKKyAgICAgICAgTmRpc01vdmVNZW1vcnkocE1zZy0+S2V5RGVzYy5LZXlSc2MsIFR4UlNDLCA2KTsKKwl9CisKKwkvLyBDbGVhciBLZXkgTUlDIGZpZWxkIGZvciBNSUMgY2FsY3VsYXRpb24gbGF0ZXIKKyAgICBOZGlzWmVyb01lbW9yeShwTXNnLT5LZXlEZXNjLktleU1pYywgTEVOX0tFWV9ERVNDX01JQyk7CisKKwlDb25zdHJ1Y3RFYXBvbEtleURhdGEocEFkLAorCQkJCQkJICBBdXRoTW9kZSwKKwkJCQkJCSAgV2VwU3RhdHVzLAorCQkJCQkJICBHcm91cEtleVdlcFN0YXR1cywKKwkJCQkJCSAgTXNnVHlwZSwKKwkJCQkJCSAgRGVmYXVsdEtleUlkeCwKKwkJCQkJCSAgYldQQTIsCisJCQkJCQkgIFBUSywKKwkJCQkJCSAgR1RLLAorCQkJCQkJICBSU05JRSwKKwkJCQkJCSAgUlNOSUVfTGVuLAorCQkJCQkJICBwTXNnKTsKKworCS8vIENhbGN1bGF0ZSBNSUMgYW5kIGZpbGwgaW4gS2V5TWljIEZpZWxkIGV4Y2VwdCBQYWlyd2lzZSBNc2cgMS4KKwlpZiAoTXNnVHlwZSAhPSBFQVBPTF9QQUlSX01TR18xKQorCXsKKwkJQ2FsY3VsYXRlTUlDKHBBZCwgV2VwU3RhdHVzLCBQVEssIHBNc2cpOworCX0KKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT4gQ29uc3RydWN0RWFwb2xNc2cgZm9yICVzICVzXG4iLCAoKGJXUEEyKSA/ICJXUEEyIiA6ICJXUEEiKSwgR2V0RWFwb2xNc2dUeXBlKE1zZ1R5cGUpKSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiCSAgICAgQm9keSBsZW5ndGggPSAlZCBcbiIsIHBNc2ctPkJvZHlfTGVuWzFdKSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiCSAgICAgS2V5IGxlbmd0aCAgPSAlZCBcbiIsIHBNc2ctPktleURlc2MuS2V5TGVuZ3RoWzFdKSk7CisKKworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJQ29uc3RydWN0IHRoZSBLZXkgRGF0YSBmaWVsZCBvZiBFQVBvTCBtZXNzYWdlCisKKwlBcmd1bWVudHM6CisJCXBBZAkJCVBvaW50ZXIJdG8gb3VyIGFkYXB0ZXIKKwkJRWxlbQkJTWVzc2FnZSBib2R5CisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECUNvbnN0cnVjdEVhcG9sS2V5RGF0YSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVQ0hBUgkJCUF1dGhNb2RlLAorCUlOCVVDSEFSCQkJV2VwU3RhdHVzLAorCUlOCVVDSEFSCQkJR3JvdXBLZXlXZXBTdGF0dXMsCisJSU4gCVVDSEFSCQkJTXNnVHlwZSwKKwlJTglVQ0hBUgkJCURlZmF1bHRLZXlJZHgsCisJSU4JQk9PTEVBTgkJCWJXUEEyQ2FwYWJsZSwKKwlJTglVQ0hBUgkJCSpQVEssCisJSU4JVUNIQVIJCQkqR1RLLAorCUlOCVVDSEFSCQkJKlJTTklFLAorCUlOCVVDSEFSCQkJUlNOSUVfTEVOLAorCU9VVCBQRUFQT0xfUEFDS0VUICAgcE1zZykKK3sKKwlVQ0hBUgkJKm1wb29sLCAqS2V5X0RhdGEsICpSYzRHVEs7CisJVUNIQVIgICAgICAgZWtleVsoTEVOX0tFWV9ERVNDX0lWK0xFTl9FQVBfRUspXTsKKwlVQ0hBUgkJZGF0YV9vZmZzZXQ7CisKKworCWlmIChNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzEgfHwgTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR180IHx8IE1zZ1R5cGUgPT0gRUFQT0xfR1JPVVBfTVNHXzIpCisJCXJldHVybjsKKworCS8vIGFsbG9jYXRlIG1lbW9yeSBwb29sCisJb3NfYWxsb2NfbWVtKHBBZCwgKFBVQ0hBUiAqKSZtcG9vbCwgMTUwMCk7CisKKyAgICBpZiAobXBvb2wgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJLyogUmM0R1RLIExlbiA9IDUxMiAqLworCVJjNEdUSyA9IChVQ0hBUiAqKSBST1VORF9VUChtcG9vbCwgNCk7CisJLyogS2V5X0RhdGEgTGVuID0gNTEyICovCisJS2V5X0RhdGEgPSAoVUNIQVIgKikgUk9VTkRfVVAoUmM0R1RLICsgNTEyLCA0KTsKKworCU5kaXNaZXJvTWVtb3J5KEtleV9EYXRhLCA1MTIpOworCXBNc2ctPktleURlc2MuS2V5RGF0YUxlblsxXSA9IDA7CisJZGF0YV9vZmZzZXQgPSAwOworCisJLy8gRW5jYXBzdWxhdGUgUlNOSUUgaW4gcGFpcndpc2VfbXNnMiAmIHBhaXJ3aXNlX21zZzMKKwlpZiAoUlNOSUVfTEVOICYmICgoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18yKSB8fCAoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18zKSkpCisJeworCQlpZiAoYldQQTJDYXBhYmxlKQorCQkJS2V5X0RhdGFbZGF0YV9vZmZzZXQgKyAwXSA9IElFX1dQQTI7CisJCWVsc2UKKwkJCUtleV9EYXRhW2RhdGFfb2Zmc2V0ICsgMF0gPSBJRV9XUEE7CisKKyAgICAgICAgS2V5X0RhdGFbZGF0YV9vZmZzZXQgKyAxXSA9IFJTTklFX0xFTjsKKwkJTmRpc01vdmVNZW1vcnkoJktleV9EYXRhW2RhdGFfb2Zmc2V0ICsgMl0sIFJTTklFLCBSU05JRV9MRU4pOworCQlkYXRhX29mZnNldCArPSAoMiArIFJTTklFX0xFTik7CisJfQorCisJLy8gRW5jYXBzdWxhdGUgS0RFIGZvcm1hdCBpbiBwYWlyd2lzZV9tc2czX1dQQTIgJiBncm91cF9tc2cxX1dQQTIKKwlpZiAoYldQQTJDYXBhYmxlICYmICgoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18zKSB8fCAoTXNnVHlwZSA9PSBFQVBPTF9HUk9VUF9NU0dfMSkpKQorCXsKKwkJLy8gS2V5IERhdGEgRW5jYXBzdWxhdGlvbiAoS0RFKSBmb3JtYXQgLSA4MDIuMTFpLTIwMDQgIEZpZ3VyZS00M3cgYW5kIFRhYmxlLTIwaAorICAgICAgICBLZXlfRGF0YVtkYXRhX29mZnNldCArIDBdID0gMHhERDsKKworCQlpZiAoR3JvdXBLZXlXZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKKwkJeworCQkJS2V5X0RhdGFbZGF0YV9vZmZzZXQgKyAxXSA9IDB4MTY7Ly8gNCsyKzE2KE9VSStEYXRhVHlwZStEYXRhRmllbGQpCisJCX0KKwkJZWxzZQorCQl7CisJCQlLZXlfRGF0YVtkYXRhX29mZnNldCArIDFdID0gMHgyNjsvLyA0KzIrMzIoT1VJK0RhdGFUeXBlK0RhdGFGaWVsZCkKKwkJfQorCisgICAgICAgIEtleV9EYXRhW2RhdGFfb2Zmc2V0ICsgMl0gPSAweDAwOworICAgICAgICBLZXlfRGF0YVtkYXRhX29mZnNldCArIDNdID0gMHgwRjsKKyAgICAgICAgS2V5X0RhdGFbZGF0YV9vZmZzZXQgKyA0XSA9IDB4QUM7CisgICAgICAgIEtleV9EYXRhW2RhdGFfb2Zmc2V0ICsgNV0gPSAweDAxOworCisJCS8vIEdUSyBLREUgZm9ybWF0IC0gODAyLjExaS0yMDA0ICBGaWd1cmUtNDN4CisgICAgICAgIEtleV9EYXRhW2RhdGFfb2Zmc2V0ICsgNl0gPSAoRGVmYXVsdEtleUlkeCAmIDB4MDMpOworICAgICAgICBLZXlfRGF0YVtkYXRhX29mZnNldCArIDddID0gMHgwMDsJLy8gUmVzZXJ2ZWQgQnl0ZQorCisJCWRhdGFfb2Zmc2V0ICs9IDg7CisJfQorCisKKwkvLyBFbmNhcHN1bGF0ZSBHVEsgYW5kIGVuY3J5cHQgdGhlIGtleS1kYXRhIGZpZWxkIHdpdGggS0VLLgorCS8vIE9ubHkgZm9yIHBhaXJ3aXNlX21zZzNfV1BBMiBhbmQgZ3JvdXBfbXNnMQorCWlmICgoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18zICYmIGJXUEEyQ2FwYWJsZSkgfHwgKE1zZ1R5cGUgPT0gRUFQT0xfR1JPVVBfTVNHXzEpKQorCXsKKwkJLy8gRmlsbCBpbiBHVEsKKwkJaWYgKEdyb3VwS2V5V2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCisJCXsKKwkJCU5kaXNNb3ZlTWVtb3J5KCZLZXlfRGF0YVtkYXRhX29mZnNldF0sIEdUSywgTEVOX0FFU19LRVkpOworCQkJZGF0YV9vZmZzZXQgKz0gTEVOX0FFU19LRVk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlOZGlzTW92ZU1lbW9yeSgmS2V5X0RhdGFbZGF0YV9vZmZzZXRdLCBHVEssIFRLSVBfR1RLX0xFTkdUSCk7CisJCQlkYXRhX29mZnNldCArPSBUS0lQX0dUS19MRU5HVEg7CisJCX0KKworCQkvLyBTdGlsbCBkb250IGtub3cgd2h5LCBidXQgaWYgbm90IGFwcGVuZCB3aWxsIG9jY3VyICJHVEsgbm90IGluY2x1ZGUgaW4gTVNHMyIKKwkJLy8gUGF0Y2ggZm9yIGNvbXBhdGliaWxpdHkgYmV0d2VlbiB6ZXJvIGNvbmZpZyBhbmQgZnVuaworCQlpZiAoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18zICYmIGJXUEEyQ2FwYWJsZSkKKwkJeworCQkJaWYgKEdyb3VwS2V5V2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCisJCQl7CisJCQkJS2V5X0RhdGFbZGF0YV9vZmZzZXQgKyAwXSA9IDB4REQ7CisJCQkJS2V5X0RhdGFbZGF0YV9vZmZzZXQgKyAxXSA9IDA7CisJCQkJZGF0YV9vZmZzZXQgKz0gMjsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlLZXlfRGF0YVtkYXRhX29mZnNldCArIDBdID0gMHhERDsKKwkJCQlLZXlfRGF0YVtkYXRhX29mZnNldCArIDFdID0gMDsKKwkJCQlLZXlfRGF0YVtkYXRhX29mZnNldCArIDJdID0gMDsKKwkJCQlLZXlfRGF0YVtkYXRhX29mZnNldCArIDNdID0gMDsKKwkJCQlLZXlfRGF0YVtkYXRhX29mZnNldCArIDRdID0gMDsKKwkJCQlLZXlfRGF0YVtkYXRhX29mZnNldCArIDVdID0gMDsKKwkJCQlkYXRhX29mZnNldCArPSA2OworCQkJfQorCQl9CisKKwkJLy8gRW5jcnlwdCB0aGUgZGF0YSBtYXRlcmlhbCBpbiBrZXkgZGF0YSBmaWVsZAorCQlpZiAoV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCisJCXsKKwkJCUFFU19HVEtfS0VZX1dSQVAoJlBUS1sxNl0sIEtleV9EYXRhLCBkYXRhX29mZnNldCwgUmM0R1RLKTsKKyAgICAgICAgICAgIC8vIEFFUyB3cmFwIGZ1bmN0aW9uIHdpbGwgZ3JvdyA4IGJ5dGVzIGluIGxlbmd0aAorICAgICAgICAgICAgZGF0YV9vZmZzZXQgKz0gODsKKwkJfQorCQllbHNlCisJCXsKKwkJCS8vIFBSRVBBUkUgRW5jcnlwdGVkICAiS2V5IERBVEEiIGZpZWxkLiAgKEVuY3J5cHQgR1RLIHdpdGggUkM0LCB1c2luZiBQVEtbMTZdLT5bMzFdIGFzIEtleSwgSVYtZmllbGQgYXMgSVYpCisJCQkvLyBwdXQgVHhUc2MgaW4gS2V5IFJTQyBmaWVsZAorCQkJcEFkLT5Qcml2YXRlSW5mby5GQ1NDUkMzMiA9IFBQUElOSVRGQ1MzMjsgICAvL0luaXQgY3JjMzIuCisKKwkJCS8vIGVrZXkgaXMgdGhlIGNvbnRhbmV0aW9uIG9mIElWLWZpZWxkLCBhbmQgUFRLWzE2XS0+UFRLWzMxXQorCQkJTmRpc01vdmVNZW1vcnkoZWtleSwgcE1zZy0+S2V5RGVzYy5LZXlJdiwgTEVOX0tFWV9ERVNDX0lWKTsKKwkJCU5kaXNNb3ZlTWVtb3J5KCZla2V5W0xFTl9LRVlfREVTQ19JVl0sICZQVEtbMTZdLCBMRU5fRUFQX0VLKTsKKwkJCUFSQ0ZPVVJfSU5JVCgmcEFkLT5Qcml2YXRlSW5mby5XRVBDT05URVhULCBla2V5LCBzaXplb2YoZWtleSkpOyAgLy9JTklUIFNCT1gsIEtFWUxFTiszKElWKQorCQkJcEFkLT5Qcml2YXRlSW5mby5GQ1NDUkMzMiA9IFJUTVBfQ0FMQ19GQ1MzMihwQWQtPlByaXZhdGVJbmZvLkZDU0NSQzMyLCBLZXlfRGF0YSwgZGF0YV9vZmZzZXQpOworCQkJV1BBQVJDRk9VUl9FTkNSWVBUKCZwQWQtPlByaXZhdGVJbmZvLldFUENPTlRFWFQsIFJjNEdUSywgS2V5X0RhdGEsIGRhdGFfb2Zmc2V0KTsKKwkJfQorCisJCU5kaXNNb3ZlTWVtb3J5KHBNc2ctPktleURlc2MuS2V5RGF0YSwgUmM0R1RLLCBkYXRhX29mZnNldCk7CisJfQorCWVsc2UKKwl7CisJCU5kaXNNb3ZlTWVtb3J5KHBNc2ctPktleURlc2MuS2V5RGF0YSwgS2V5X0RhdGEsIGRhdGFfb2Zmc2V0KTsKKwl9CisKKwkvLyBzZXQga2V5IGRhdGEgbGVuZ3RoIGZpZWxkIGFuZCB0b3RhbCBsZW5ndGgKKwlwTXNnLT5LZXlEZXNjLktleURhdGFMZW5bMV0gPSBkYXRhX29mZnNldDsKKyAgICBwTXNnLT5Cb2R5X0xlblsxXSArPSBkYXRhX29mZnNldDsKKworCW9zX2ZyZWVfbWVtKHBBZCwgbXBvb2wpOworCit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlDYWxjYXVsYXRlIE1JQy4gSXQgaXMgdXNlZCBkdXJpbmcgNC13YXlzIGhhbmRzaGFya2luZy4KKworCUFyZ3VtZW50czoKKwkJcEFkCQkJCS0JcG9pbnRlciB0byBvdXIgcEFkYXB0ZXIgY29udGV4dAorICAgIAlQZWVyV2VwU3RhdHVzCS0JaW5kaWNhdGUgdGhlIGVuY3J5cHRpb24gdHlwZQorCisJUmV0dXJuIFZhbHVlOgorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJQ2FsY3VsYXRlTUlDKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVDSEFSCQkJUGVlcldlcFN0YXR1cywKKwlJTglVQ0hBUgkJCSpQVEssCisJT1VUIFBFQVBPTF9QQUNLRVQgICBwTXNnKQoreworICAgIFVDSEFSICAgKk91dEJ1ZmZlcjsKKwlVTE9ORwlGcmFtZUxlbiA9IDA7CisJVUNIQVIJbWljW0xFTl9LRVlfREVTQ19NSUNdOworCVVDSEFSCWRpZ2VzdFs4MF07CisKKwkvLyBhbGxvY2F0ZSBtZW1vcnkgZm9yIE1JQyBjYWxjdWxhdGlvbgorCW9zX2FsbG9jX21lbShwQWQsIChQVUNIQVIgKikmT3V0QnVmZmVyLCA1MTIpOworCisgICAgaWYgKE91dEJ1ZmZlciA9PSBOVUxMKQorICAgIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiISEhQ2FsY3VsYXRlTUlDOiBubyBtZW1vcnkhISFcbiIpKTsKKwkJcmV0dXJuOworICAgIH0KKworCS8vIG1ha2UgYSBmcmFtZSBmb3IgY2FsY3VsYXRpbmcgTUlDLgorICAgIE1ha2VPdXRnb2luZ0ZyYW1lKE91dEJ1ZmZlciwgICAgICAgICAgICAJJkZyYW1lTGVuLAorICAgICAgICAgICAgICAgICAgICAgIHBNc2ctPkJvZHlfTGVuWzFdICsgNCwgIAlwTXNnLAorICAgICAgICAgICAgICAgICAgICAgIEVORF9PRl9BUkdTKTsKKworCU5kaXNaZXJvTWVtb3J5KG1pYywgc2l6ZW9mKG1pYykpOworCisJLy8gQ2FsY3VsYXRlIE1JQworICAgIGlmIChQZWVyV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCisgCXsKKwkJSE1BQ19TSEExKE91dEJ1ZmZlciwgIEZyYW1lTGVuLCBQVEssIExFTl9FQVBfTUlDSywgZGlnZXN0KTsKKwkJTmRpc01vdmVNZW1vcnkobWljLCBkaWdlc3QsIExFTl9LRVlfREVTQ19NSUMpOworCX0KKwllbHNlCisJeworCQlobWFjX21kNShQVEssICBMRU5fRUFQX01JQ0ssIE91dEJ1ZmZlciwgRnJhbWVMZW4sIG1pYyk7CisJfQorCisJLy8gc3RvcmUgdGhlIGNhbGN1bGF0ZWQgTUlDCisJTmRpc01vdmVNZW1vcnkocE1zZy0+S2V5RGVzYy5LZXlNaWMsIG1pYywgTEVOX0tFWV9ERVNDX01JQyk7CisKKwlvc19mcmVlX21lbShwQWQsIE91dEJ1ZmZlcik7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlTb21lIHJlY2VpdmVkIGZyYW1lcyBjYW4ndCBkZWNyeXB0IGJ5IEFzaWMsIHNvIGRlY3J5cHQgdGhlbSBieSBzb2Z0d2FyZS4KKworCUFyZ3VtZW50czoKKwkJcEFkCQkJCS0JcG9pbnRlciB0byBvdXIgcEFkYXB0ZXIgY29udGV4dAorICAgIAlQZWVyV2VwU3RhdHVzCS0JaW5kaWNhdGUgdGhlIGVuY3J5cHRpb24gdHlwZQorCisJUmV0dXJuIFZhbHVlOgorCQlORElTX1NUQVRVU19TVUNDRVNTCQktCWRlY3J5cHRpb24gc3VjY2Vzc2Z1bAorCQlORElTX1NUQVRVU19GQUlMVVJFCQktCWRlY3J5cHRpb24gZmFpbHVyZQorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworTkRJU19TVEFUVVMJUlRNUFNvZnREZWNyeXB0QnJvYWRDYXN0RGF0YSgKKwlJTglQUlRNUF9BREFQVEVSCQkJCQlwQWQsCisJSU4JUlhfQkxLCQkJCQkJCSpwUnhCbGssCisJSU4gIE5ESVNfODAyXzExX0VOQ1JZUFRJT05fU1RBVFVTIAlHcm91cENpcGhlciwKKwlJTiAgUENJUEhFUl9LRVkJCQkJCQlwU2hhcmRfa2V5KQoreworCVBSWFdJX1NUUlVDCQkJcFJ4V0kgPSBwUnhCbGstPnBSeFdJOworCisKKworCS8vIGhhbmRsZSBXRVAgZGVjcnlwdGlvbgorCWlmIChHcm91cENpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjFFbmFibGVkKQorICAgIHsKKwkJaWYgKFJUTVBTb2Z0RGVjcnlwdFdFUChwQWQsIHBSeEJsay0+cERhdGEsIHBSeFdJLT5NUERVdG90YWxCeXRlQ291bnQsIHBTaGFyZF9rZXkpKQorCQl7CisKKwkJCS8vTWludXMgSVZbNF0gJiBJQ1ZbNF0KKwkJCXBSeFdJLT5NUERVdG90YWxCeXRlQ291bnQgLT0gODsKKwkJfQorCQllbHNlCisJCXsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkVSUk9SIDogU29mdHdhcmUgZGVjcnlwdCBXRVAgZGF0YSBmYWlscy5cbiIpKTsKKwkJCS8vIGdpdmUgdXAgdGhpcyBmcmFtZQorCQkJcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkU7CisJCX0KKwl9CisJLy8gaGFuZGxlIFRLSVAgZGVjcnlwdGlvbgorCWVsc2UgaWYgKEdyb3VwQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpCisJeworCQlpZiAoUlRNUFNvZnREZWNyeXB0VEtJUChwQWQsIHBSeEJsay0+cERhdGEsIHBSeFdJLT5NUERVdG90YWxCeXRlQ291bnQsIDAsIHBTaGFyZF9rZXkpKQorCQl7CisKKwkJCS8vTWludXMgOCBieXRlcyBNSUMsIDggYnl0ZXMgSVYvRUlWLCA0IGJ5dGVzIElDVgorCQkJcFJ4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudCAtPSAyMDsKKwkJfQorICAgICAgICBlbHNlCisJCXsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkVSUk9SIDogUlRNUFNvZnREZWNyeXB0VEtJUCBGYWlsZWRcbiIpKTsKKwkJCS8vIGdpdmUgdXAgdGhpcyBmcmFtZQorCQkJcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkU7CisgICAgICAgIH0KKwl9CisJLy8gaGFuZGxlIEFFUyBkZWNyeXB0aW9uCisJZWxzZSBpZiAoR3JvdXBDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKKwl7CisJCWlmIChSVE1QU29mdERlY3J5cHRBRVMocEFkLCBwUnhCbGstPnBEYXRhLCBwUnhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50ICwgcFNoYXJkX2tleSkpCisJCXsKKworCQkJLy84IGJ5dGVzIE1JQywgOCBieXRlcyBJVi9FSVYgKENDTVAgSGVhZGVyKQorCQkJcFJ4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudCAtPSAxNjsKKwkJfQorCQllbHNlCisJCXsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkVSUk9SIDogUlRNUFNvZnREZWNyeXB0QUVTIEZhaWxlZFxuIikpOworCQkJLy8gZ2l2ZSB1cCB0aGlzIGZyYW1lCisJCQlyZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRTsKKwkJfQorCX0KKwllbHNlCisJeworCQkvLyBnaXZlIHVwIHRoaXMgZnJhbWUKKwkJcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkU7CisJfQorCisJcmV0dXJuIE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vZGZzLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9kZnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDliYmE1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vZGZzLmMKQEAgLTAsMCArMSw0NTMgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgTW9kdWxlIE5hbWU6CisgICAgYXBfZGZzLmMKKworICAgIEFic3RyYWN0OgorICAgIFN1cHBvcnQgREZTIGZ1bmN0aW9uLgorCisgICAgUmV2aXNpb24gSGlzdG9yeToKKyAgICBXaG8gICAgICAgV2hlbiAgICAgICAgICAgIFdoYXQKKyAgICAtLS0tLS0tLSAgLS0tLS0tLS0tLSAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBGb25jaGkgICAgMDMtMTItMjAwNyAgICAgIGNyZWF0ZWQKKyovCisKKyNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKKwordHlwZWRlZiBzdHJ1Y3QgX1JBREFSX0RVUkFUSU9OX1RBQkxFCit7CisJVUxPTkcgUkREdXJSZWdpb247CisJVUxPTkcgUmFkYXJTaWduYWxEdXJhdGlvbjsKKwlVTE9ORyBUb2xlcmFuY2U7Cit9IFJBREFSX0RVUkFUSU9OX1RBQkxFLCAqUFJBREFSX0RVUkFUSU9OX1RBQkxFOworCisKK3N0YXRpYyBVQ0hBUiBSZElkbGVUaW1lVGFibGVbTUFYX1JEX1JFR0lPTl1bNF0gPQoreworCXs5LCAyNTAsIDI1MCwgMjUwfSwJCS8vIENFCisJezQsIDI1MCwgMjUwLCAyNTB9LAkJLy8gRkNDCisJezQsIDI1MCwgMjUwLCAyNTB9LAkJLy8gSkFQCisJezE1LCAyNTAsIDI1MCwgMjUwfSwJLy8gSkFQX1c1MworCXs0LCAyNTAsIDI1MCwgMjUwfQkJLy8gSkFQX1c1NgorfTsKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCUJicCBSYWRhciBkZXRlY3Rpb24gcm91dGluZQorCisJQXJndW1lbnRzOgorCQlwQWQgCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKworCVJldHVybiBWYWx1ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgQmJwUmFkYXJEZXRlY3Rpb25TdGFydCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlVSU5UOCBSYWRhclBlcmlvZDsKKworCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCAxMTQsIDB4MDIpOworCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCAxMjEsIDB4MjApOworCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCAxMjIsIDB4MDApOworCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCAxMjMsIDB4MDgvKjB4ODAqLyk7CisJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIDEyNCwgMHgyOCk7CisJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIDEyNSwgMHhmZik7CisKKyNpZiAwCisJLy8gdG9nZ2xlIFJ4IGVuYWJsZSBiaXQgZm9yIHJhZGFyIGRldGVjdGlvbi4KKwkvLyBpdCdzIEFuZHkncyByZWNvbW1hbmQuCisJeworCQlVSU5UMzIgVmFsdWU7CisJUlRNUF9JT19SRUFEMzIocEFkLCBNQUNfU1lTX0NUUkwsICZWYWx1ZSk7CisJVmFsdWUgfD0gKDB4MSA8PCAzKTsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIFZhbHVlKTsKKwlWYWx1ZSAmPSB+KDB4MSA8PCAzKTsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIFZhbHVlKTsKKwl9CisjZW5kaWYKKwlSYWRhclBlcmlvZCA9ICgoVUlOVClSZElkbGVUaW1lVGFibGVbcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkREdXJSZWdpb25dWzBdICsgKFVJTlQpcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuRGZzU2Vzc2lvblRpbWUpIDwgMjUwID8KKwkJCShSZElkbGVUaW1lVGFibGVbcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkREdXJSZWdpb25dWzBdICsgcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuRGZzU2Vzc2lvblRpbWUpIDogMjUwOworCisJUlRNUF9JT19XUklURTgocEFkLCAweDcwMjAsIDB4MWQpOworCVJUTVBfSU9fV1JJVEU4KHBBZCwgMHg3MDIxLCAweDQwKTsKKworCVJhZGFyRGV0ZWN0aW9uU3RhcnQocEFkLCAwLCBSYWRhclBlcmlvZCk7CisJcmV0dXJuOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJQmJwIFJhZGFyIGRldGVjdGlvbiByb3V0aW5lCisKKwlBcmd1bWVudHM6CisJCXBBZCAJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCisJUmV0dXJuIFZhbHVlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBCYnBSYWRhckRldGVjdGlvblN0b3AoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJUlRNUF9JT19XUklURTgocEFkLCAweDcwMjAsIDB4MWQpOworCVJUTVBfSU9fV1JJVEU4KHBBZCwgMHg3MDIxLCAweDYwKTsKKworCVJhZGFyRGV0ZWN0aW9uU3RvcChwQWQpOworCXJldHVybjsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVJhZGFyIGRldGVjdGlvbiByb3V0aW5lCisKKwlBcmd1bWVudHM6CisJCXBBZCAJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCisJUmV0dXJuIFZhbHVlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBSYWRhckRldGVjdGlvblN0YXJ0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIEJPT0xFQU4gQ1RTUHJvdGVjdCwKKwlJTiBVSU5UOCBDVFNQZXJpb2QpCit7CisJVUlOVDggRGZzQWN0aXZlVGltZSA9IChwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5EZnNTZXNzaW9uVGltZSAmIDB4MWYpOworCVVJTlQ4IEN0c1Byb3RlY3QgPSAoQ1RTUHJvdGVjdCA9PSAxKSA/IDB4MDIgOiAweDAxOyAvLyBDVFMgcHJvdGVjdC4KKworCWlmIChDVFNQcm90ZWN0ICE9IDApCisJeworCQlzd2l0Y2gocEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkREdXJSZWdpb24pCisJCXsKKwkJY2FzZSBGQ0M6CisJCWNhc2UgSkFQX1c1NjoKKwkJCUN0c1Byb3RlY3QgPSAweDAzOworCQkJYnJlYWs7CisKKwkJY2FzZSBDRToKKwkJY2FzZSBKQVBfVzUzOgorCQlkZWZhdWx0OgorCQkJQ3RzUHJvdGVjdCA9IDB4MDI7CisJCQlicmVhazsKKwkJfQorCX0KKwllbHNlCisJCUN0c1Byb3RlY3QgPSAweDAxOworCisKKwkvLyBzZW5kIHN0YXJ0LVJEIHdpdGggQ1RTIHByb3RlY3Rpb24gY29tbWFuZCB0byBNQ1UKKwkvLyBoaWdoYnl0ZSBbN10JCXJlc2VydmUKKwkvLyBoaWdoYnl0ZSBbNjo1XQkweDogc3RvcCBDYXJyaWVyL1JhZGFyIGRldGVjdGlvbgorCS8vIGhpZ2hieXRlIFsxMF06CVN0YXJ0IENhcnJpZXIvUmFkYXIgZGV0ZWN0aW9uIHdpdGhvdXQgQ1RTIHByb3RlY3Rpb24sIDExOiBTdGFydCBDYXJyaWVyL1JhZGFyIGRldGVjdGlvbiB3aXRoIENUUyBwcm90ZWN0aW9uCisJLy8gaGlnaGJ5dGUgWzQ6MF0JUmFkYXIvY2FycmllciBkZXRlY3Rpb24gZHVyYXRpb24uIEluIDFtcy4KKworCS8vIGxvd2J5dGUgWzc6MF0JUmFkYXIvY2FycmllciBkZXRlY3Rpb24gcGVyaW9kLCBpbiAxbXMuCisJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDYwLCAweGZmLCBDVFNQZXJpb2QsIERmc0FjdGl2ZVRpbWUgfCAoQ3RzUHJvdGVjdCA8PCA1KSk7CisJLy9Bc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4NjMsIDB4ZmYsIDEwLCAwKTsKKworCXJldHVybjsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVJhZGFyIGRldGVjdGlvbiByb3V0aW5lCisKKwlBcmd1bWVudHM6CisJCXBBZCAJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCisJUmV0dXJuIFZhbHVlOgorCQlUUlVFCUZvdW5kIHJhZGFyIHNpZ25hbAorCQlGQUxTRQlOb3QgZm91bmQgcmFkYXIgc2lnbmFsCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIFJhZGFyRGV0ZWN0aW9uU3RvcCgKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCkKK3sKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJhZGFyRGV0ZWN0aW9uU3RvcC5cbiIpKTsKKwlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4NjAsIDB4ZmYsIDB4MDAsIDB4MDApOwkvLyBzZW5kIHN0YXJ0LVJEIHdpdGggQ1RTIHByb3RlY3Rpb24gY29tbWFuZCB0byBNQ1UKKworCXJldHVybjsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVJhZGFyIGNoYW5uZWwgY2hlY2sgcm91dGluZQorCisJQXJndW1lbnRzOgorCQlwQWQgCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKworCVJldHVybiBWYWx1ZToKKwkJVFJVRQluZWVkIHRvIGRvIHJhZGFyIGRldGVjdAorCQlGQUxTRQluZWVkIG5vdCB0byBkbyByYWRhciBkZXRlY3QKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0JPT0xFQU4gUmFkYXJDaGFubmVsQ2hlY2soCisJSU4gUFJUTVBfQURBUFRFUglwQWQsCisJSU4gVUNIQVIJCQlDaCkKK3sKKyNpZiAxCisJSU5UCQlpOworCUJPT0xFQU4gcmVzdWx0ID0gRkFMU0U7CisKKwlmb3IgKGk9MDsgaTxwQWQtPkNoYW5uZWxMaXN0TnVtOyBpKyspCisJeworCQlpZiAoQ2ggPT0gcEFkLT5DaGFubmVsTGlzdFtpXS5DaGFubmVsKQorCQl7CisJCQlyZXN1bHQgPSBwQWQtPkNoYW5uZWxMaXN0W2ldLkRmc1JlcTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuIHJlc3VsdDsKKyNlbHNlCisJSU5UCQlpOworCVVDSEFSCUNoYW5uZWxbMTVdPXs1MiwgNTYsIDYwLCA2NCwgMTAwLCAxMDQsIDEwOCwgMTEyLCAxMTYsIDEyMCwgMTI0LCAxMjgsIDEzMiwgMTM2LCAxNDB9OworCisJZm9yIChpPTA7IGk8MTU7IGkrKykKKwl7CisJCWlmIChDaCA9PSBDaGFubmVsW2ldKQorCQl7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChpICE9IDE1KQorCQlyZXR1cm4gVFJVRTsKKwllbHNlCisJCXJldHVybiBGQUxTRTsKKyNlbmRpZgorfQorCitVTE9ORyBKYXBSYWRhclR5cGUoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJVUxPTkcJCWk7CisJY29uc3QgVUNIQVIJQ2hhbm5lbFsxNV09ezUyLCA1NiwgNjAsIDY0LCAxMDAsIDEwNCwgMTA4LCAxMTIsIDExNiwgMTIwLCAxMjQsIDEyOCwgMTMyLCAxMzYsIDE0MH07CisKKwlpZiAocEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkREdXJSZWdpb24gIT0gSkFQKQorCXsKKwkJcmV0dXJuIHBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJERHVyUmVnaW9uOworCX0KKworCWZvciAoaT0wOyBpPDE1OyBpKyspCisJeworCQlpZiAocEFkLT5Db21tb25DZmcuQ2hhbm5lbCA9PSBDaGFubmVsW2ldKQorCQl7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChpIDwgNCkKKwkJcmV0dXJuIEpBUF9XNTM7CisJZWxzZSBpZiAoaSA8IDE1KQorCQlyZXR1cm4gSkFQX1c1NjsKKwllbHNlCisJCXJldHVybiBKQVA7IC8vIFc1MgorCit9CisKK1VMT05HIFJUTVBCYnBSZWFkUmFkYXJEdXJhdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCkKK3sKKwlVSU5UOCBieXRlVmFsdWUgPSAwOworCVVMT05HIHJlc3VsdDsKKworCUJCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjExNSwgJmJ5dGVWYWx1ZSk7CisKKwlyZXN1bHQgPSAwOworCXN3aXRjaCAoYnl0ZVZhbHVlKQorCXsKKwljYXNlIDE6IC8vIHJhZGFyIHNpZ25hbCBkZXRlY3RlZCBieSBwdWxzZSBtb2RlLgorCWNhc2UgMjogLy8gcmFkYXIgc2lnbmFsIGRldGVjdGVkIGJ5IHdpZHRoIG1vZGUuCisJCXJlc3VsdCA9IFJUTVBSZWFkUmFkYXJEdXJhdGlvbihwQWQpOworCQlicmVhazsKKworCWNhc2UgMDogLy8gTm8gcmFkYXIgc2lnbmFsLgorCWRlZmF1bHQ6CisKKwkJcmVzdWx0ID0gMDsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJlc3VsdDsKK30KKworVUxPTkcgUlRNUFJlYWRSYWRhckR1cmF0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIJcEFkKQoreworCVVMT05HIHJlc3VsdCA9IDA7CisKKyNpZmRlZiBERlNfU1VQUE9SVAorCVVJTlQ4IGR1cmF0aW9uMSA9IDAsIGR1cmF0aW9uMiA9IDAsIGR1cmF0aW9uMyA9IDA7CisKKwlCQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IxMTYsICZkdXJhdGlvbjEpOworCUJCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjExNywgJmR1cmF0aW9uMik7CisJQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMTE4LCAmZHVyYXRpb24zKTsKKwlyZXN1bHQgPSAoZHVyYXRpb24xIDw8IDE2KSArIChkdXJhdGlvbjIgPDwgOCkgKyBkdXJhdGlvbjM7CisjZW5kaWYgLy8gREZTX1NVUFBPUlQgLy8KKworCXJldHVybiByZXN1bHQ7CisKK30KKworVk9JRCBSVE1QQ2xlYW5SYWRhckR1cmF0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIJcEFkKQoreworCXJldHVybjsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgICAgICBSYWRhciB3YXZlIGRldGVjdGlvbi4gVGhlIEFQSSBzaG91bGQgYmUgaW52b2tlIGVhY2ggc2Vjb25kLgorCisgICAgQXJndW1lbnRzOgorICAgICAgICBwQWQgICAgICAgICAtIEFkYXB0ZXIgcG9pbnRlcgorCisgICAgUmV0dXJuIFZhbHVlOgorICAgICAgICBOb25lCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIEFwUmFkYXJEZXRlY3RQZXJpb2RpYygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlJTlQJaTsKKworCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LkluU2VydmljZU1vbml0b3JDb3VudCsrOworCisJZm9yIChpPTA7IGk8cEFkLT5DaGFubmVsTGlzdE51bTsgaSsrKQorCXsKKwkJaWYgKHBBZC0+Q2hhbm5lbExpc3RbaV0uUmVtYWluaW5nVGltZUZvclVzZSA+IDApCisJCXsKKwkJCXBBZC0+Q2hhbm5lbExpc3RbaV0uUmVtYWluaW5nVGltZUZvclVzZSAtLTsKKwkJCWlmICgocEFkLT5NbG1lLlBlcmlvZGljUm91bmQlNSkgPT0gMCkKKwkJCXsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSYWRhckRldGVjdFBlcmlvZGljIC0gY2g9JWQsIFJlbWFpbmluZ1RpbWVGb3JVc2U9JWRcbiIsIHBBZC0+Q2hhbm5lbExpc3RbaV0uQ2hhbm5lbCwgcEFkLT5DaGFubmVsTGlzdFtpXS5SZW1haW5pbmdUaW1lRm9yVXNlKSk7CisJCQl9CisJCX0KKwl9CisKKwkvL3JhZGFyIGRldGVjdAorCWlmICgocEFkLT5Db21tb25DZmcuQ2hhbm5lbCA+IDE0KQorCQkmJiAocEFkLT5Db21tb25DZmcuYklFRUU4MDIxMUggPT0gMSkKKwkJJiYgUmFkYXJDaGFubmVsQ2hlY2socEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKSkKKwl7CisJCVJhZGFyRGV0ZWN0UGVyaW9kaWMocEFkKTsKKwl9CisKKwlyZXR1cm47Cit9CisKKy8vIFBlcmlvZGljIFJhZGFyIGRldGVjdGlvbiwgc3dpdGNoIGNoYW5uZWwgd2lsbCBvY2N1ciBpbiBSVE1QSGFuZGxlVEJUVEludGVycnVwdCgpCisvLyBCZWZvcmUgc3dpdGNoIGNoYW5uZWwsIGRyaXZlciBuZWVkcyBkb2luZyBjaGFubmVsIHN3aXRjaCBhbm5vdW5jZW1lbnQuCitWT0lEIFJhZGFyRGV0ZWN0UGVyaW9kaWMoCisJSU4gUFJUTVBfQURBUFRFUglwQWQpCit7CisJLy8gbmVlZCB0byBjaGVjayBjaGFubmVsIGF2YWlsYWJpbGl0eSwgYWZ0ZXIgc3dpdGNoIGNoYW5uZWwKKwlpZiAocEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkRNb2RlICE9IFJEX1NJTEVOQ0VfTU9ERSkKKwkJCXJldHVybjsKKworCS8vIGNoYW5uZWwgYXZhaWxhYmlsaXR5IGNoZWNrIHRpbWUgaXMgNjBzZWMsIHVzZSA2NSBmb3IgYXNzdXJhbmNlCisJaWYgKHBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJEQ291bnQrKyA+IHBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LkNoTW92aW5nVGltZSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk5vdCBmb3VuZCByYWRhciBzaWduYWwsIHN0YXJ0IHNlbmQgYmVhY29uIGFuZCByYWRhciBkZXRlY3Rpb24gaW4gc2VydmljZSBtb25pdG9yXG5cbiIpKTsKKwkJCUJicFJhZGFyRGV0ZWN0aW9uU3RvcChwQWQpOworCQlBc2ljRW5hYmxlQnNzU3luYyhwQWQpOworCQlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5SRE1vZGUgPSBSRF9OT1JNQUxfTU9ERTsKKworCisJCXJldHVybjsKKwl9CisKKwlyZXR1cm47Cit9CisKKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorCQljaGFuZ2UgY2hhbm5lbCBtb3ZpbmcgdGltZSBmb3IgREZTIHRlc3RpbmcuCisKKwlBcmd1bWVudHM6CisJICAgIHBBZGFwdGVyICAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIG91ciBhZGFwdGVyCisJICAgIHdycSAgICAgICAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpb2N0bCBhcmd1bWVudAorCisgICAgUmV0dXJuIFZhbHVlOgorICAgICAgICBOb25lCisKKyAgICBOb3RlOgorICAgICAgICBVc2FnZToKKyAgICAgICAgICAgICAgIDEuKSBpd3ByaXYgcmEwIHNldCBDaE1vdlRpbWU9W3ZhbHVlXQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UIFNldF9DaE1vdmluZ1RpbWVfUHJvYygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBQVUNIQVIgYXJnKQoreworCVVJTlQ4IFZhbHVlOworCisJVmFsdWUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCisJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuQ2hNb3ZpbmdUaW1lID0gVmFsdWU7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6ICVkXG4iLCBfX2Z1bmNfXywKKwkJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuQ2hNb3ZpbmdUaW1lKSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworSU5UIFNldF9Mb25nUHVsc2VSYWRhclRoX1Byb2MoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gUFVDSEFSIGFyZykKK3sKKwlVSU5UOCBWYWx1ZTsKKworCVZhbHVlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKSA+IDEwID8gMTAgOiBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCisJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuTG9uZ1B1bHNlUmFkYXJUaCA9IFZhbHVlOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OiAlZFxuIiwgX19mdW5jX18sCisJCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LkxvbmdQdWxzZVJhZGFyVGgpKTsKKworCXJldHVybiBUUlVFOworfQorCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2VlcHJvbS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vZWVwcm9tLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmVkMmQ2NgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2VlcHJvbS5jCkBAIC0wLDAgKzEsMjQ0IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCU1vZHVsZSBOYW1lOgorCWVlcHJvbS5jCisKKwlBYnN0cmFjdDoKKworCVJldmlzaW9uIEhpc3Rvcnk6CisJV2hvCQkJV2hlbgkJCVdoYXQKKwktLS0tLS0tLQktLS0tLS0tLS0tCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJTmFtZQkJRGF0ZQkJCU1vZGlmaWNhdGlvbiBsb2dzCisqLworI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgorCisvLyBJUlFMID0gUEFTU0lWRV9MRVZFTAorVk9JRCBSYWlzZUNsb2NrKAorICAgIElOCVBSVE1QX0FEQVBURVIJcEFkLAorICAgIElOICBVSU5UMzIgKngpCit7CisgICAgKnggPSAqeCB8IEVFU0s7CisgICAgUlRNUF9JT19XUklURTMyKHBBZCwgRTJQUk9NX0NTUiwgKngpOworICAgIFJUTVB1c2VjRGVsYXkoMSk7CQkJCS8vIE1heCBmcmVxdWVuY3kgPSAxTUh6IGluIFNwZWMuIGRlZmluaXRpb24KK30KKworLy8gSVJRTCA9IFBBU1NJVkVfTEVWRUwKK1ZPSUQgTG93ZXJDbG9jaygKKyAgICBJTglQUlRNUF9BREFQVEVSCXBBZCwKKyAgICBJTiAgVUlOVDMyICp4KQoreworICAgICp4ID0gKnggJiB+RUVTSzsKKyAgICBSVE1QX0lPX1dSSVRFMzIocEFkLCBFMlBST01fQ1NSLCAqeCk7CisgICAgUlRNUHVzZWNEZWxheSgxKTsKK30KKworLy8gSVJRTCA9IFBBU1NJVkVfTEVWRUwKK1VTSE9SVCBTaGlmdEluQml0cygKKyAgICBJTglQUlRNUF9BREFQVEVSCXBBZCkKK3sKKyAgICBVSU5UMzIJCXgsaTsKKwlVU0hPUlQgICAgICBkYXRhPTA7CisKKyAgICBSVE1QX0lPX1JFQUQzMihwQWQsIEUyUFJPTV9DU1IsICZ4KTsKKworICAgIHggJj0gfiggRUVETyB8IEVFREkpOworCisgICAgZm9yKGk9MDsgaTwxNjsgaSsrKQorICAgIHsKKyAgICAgICAgZGF0YSA9IGRhdGEgPDwgMTsKKyAgICAgICAgUmFpc2VDbG9jayhwQWQsICZ4KTsKKworICAgICAgICBSVE1QX0lPX1JFQUQzMihwQWQsIEUyUFJPTV9DU1IsICZ4KTsKKworICAgICAgICB4ICY9IH4oRUVESSk7CisgICAgICAgIGlmKHggJiBFRURPKQorICAgICAgICAgICAgZGF0YSB8PSAxOworCisgICAgICAgIExvd2VyQ2xvY2socEFkLCAmeCk7CisgICAgfQorCisgICAgcmV0dXJuIGRhdGE7Cit9CisKKy8vIElSUUwgPSBQQVNTSVZFX0xFVkVMCitWT0lEIFNoaWZ0T3V0Qml0cygKKyAgICBJTglQUlRNUF9BREFQVEVSCXBBZCwKKyAgICBJTiAgVVNIT1JUIGRhdGEsCisgICAgSU4gIFVTSE9SVCBjb3VudCkKK3sKKyAgICBVSU5UMzIgICAgICAgeCxtYXNrOworCisgICAgbWFzayA9IDB4MDEgPDwgKGNvdW50IC0gMSk7CisgICAgUlRNUF9JT19SRUFEMzIocEFkLCBFMlBST01fQ1NSLCAmeCk7CisKKyAgICB4ICY9IH4oRUVETyB8IEVFREkpOworCisgICAgZG8KKyAgICB7CisgICAgICAgIHggJj0gfkVFREk7CisgICAgICAgIGlmKGRhdGEgJiBtYXNrKQkJeCB8PSBFRURJOworCisgICAgICAgIFJUTVBfSU9fV1JJVEUzMihwQWQsIEUyUFJPTV9DU1IsIHgpOworCisgICAgICAgIFJhaXNlQ2xvY2socEFkLCAmeCk7CisgICAgICAgIExvd2VyQ2xvY2socEFkLCAmeCk7CisKKyAgICAgICAgbWFzayA9IG1hc2sgPj4gMTsKKyAgICB9IHdoaWxlKG1hc2spOworCisgICAgeCAmPSB+RUVESTsKKyAgICBSVE1QX0lPX1dSSVRFMzIocEFkLCBFMlBST01fQ1NSLCB4KTsKK30KKworLy8gSVJRTCA9IFBBU1NJVkVfTEVWRUwKK1ZPSUQgRUVwcm9tQ2xlYW51cCgKKyAgICBJTglQUlRNUF9BREFQVEVSCXBBZCkKK3sKKyAgICBVSU5UMzIgeDsKKworICAgIFJUTVBfSU9fUkVBRDMyKHBBZCwgRTJQUk9NX0NTUiwgJngpOworCisgICAgeCAmPSB+KEVFQ1MgfCBFRURJKTsKKyAgICBSVE1QX0lPX1dSSVRFMzIocEFkLCBFMlBST01fQ1NSLCB4KTsKKworICAgIFJhaXNlQ2xvY2socEFkLCAmeCk7CisgICAgTG93ZXJDbG9jayhwQWQsICZ4KTsKK30KKworVk9JRCBFV0VOKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKQoreworICAgIFVJTlQzMgl4OworCisgICAgLy8gcmVzZXQgYml0cyBhbmQgc2V0IEVFQ1MKKyAgICBSVE1QX0lPX1JFQUQzMihwQWQsIEUyUFJPTV9DU1IsICZ4KTsKKyAgICB4ICY9IH4oRUVESSB8IEVFRE8gfCBFRVNLKTsKKyAgICB4IHw9IEVFQ1M7CisgICAgUlRNUF9JT19XUklURTMyKHBBZCwgRTJQUk9NX0NTUiwgeCk7CisKKwkvLyBraWNrIGEgcHVsc2UKKwlSYWlzZUNsb2NrKHBBZCwgJngpOworCUxvd2VyQ2xvY2socEFkLCAmeCk7CisKKyAgICAvLyBvdXRwdXQgdGhlIHJlYWRfb3Bjb2RlIGFuZCBzaXggcHVsc2UgaW4gdGhhdCBvcmRlcgorICAgIFNoaWZ0T3V0Qml0cyhwQWQsIEVFUFJPTV9FV0VOX09QQ09ERSwgNSk7CisgICAgU2hpZnRPdXRCaXRzKHBBZCwgMCwgNik7CisKKyAgICBFRXByb21DbGVhbnVwKHBBZCk7Cit9CisKK1ZPSUQgRVdEUygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCkKK3sKKyAgICBVSU5UMzIJeDsKKworICAgIC8vIHJlc2V0IGJpdHMgYW5kIHNldCBFRUNTCisgICAgUlRNUF9JT19SRUFEMzIocEFkLCBFMlBST01fQ1NSLCAmeCk7CisgICAgeCAmPSB+KEVFREkgfCBFRURPIHwgRUVTSyk7CisgICAgeCB8PSBFRUNTOworICAgIFJUTVBfSU9fV1JJVEUzMihwQWQsIEUyUFJPTV9DU1IsIHgpOworCisJLy8ga2ljayBhIHB1bHNlCisJUmFpc2VDbG9jayhwQWQsICZ4KTsKKwlMb3dlckNsb2NrKHBBZCwgJngpOworCisgICAgLy8gb3V0cHV0IHRoZSByZWFkX29wY29kZSBhbmQgc2l4IHB1bHNlIGluIHRoYXQgb3JkZXIKKyAgICBTaGlmdE91dEJpdHMocEFkLCBFRVBST01fRVdEU19PUENPREUsIDUpOworICAgIFNoaWZ0T3V0Qml0cyhwQWQsIDAsIDYpOworCisgICAgRUVwcm9tQ2xlYW51cChwQWQpOworfQorCisvLyBJUlFMID0gUEFTU0lWRV9MRVZFTAorVVNIT1JUIFJUTVBfRUVQUk9NX1JFQUQxNigKKyAgICBJTglQUlRNUF9BREFQVEVSCXBBZCwKKyAgICBJTiAgVVNIT1JUIE9mZnNldCkKK3sKKyAgICBVSU5UMzIJCXg7CisgICAgVVNIT1JUCQlkYXRhOworCisgICAgT2Zmc2V0IC89IDI7CisgICAgLy8gcmVzZXQgYml0cyBhbmQgc2V0IEVFQ1MKKyAgICBSVE1QX0lPX1JFQUQzMihwQWQsIEUyUFJPTV9DU1IsICZ4KTsKKyAgICB4ICY9IH4oRUVESSB8IEVFRE8gfCBFRVNLKTsKKyAgICB4IHw9IEVFQ1M7CisgICAgUlRNUF9JT19XUklURTMyKHBBZCwgRTJQUk9NX0NTUiwgeCk7CisKKwkvLyBraWNrIGEgcHVsc2UKKwlSYWlzZUNsb2NrKHBBZCwgJngpOworCUxvd2VyQ2xvY2socEFkLCAmeCk7CisKKyAgICAvLyBvdXRwdXQgdGhlIHJlYWRfb3Bjb2RlIGFuZCByZWdpc3RlciBudW1iZXIgaW4gdGhhdCBvcmRlcgorICAgIFNoaWZ0T3V0Qml0cyhwQWQsIEVFUFJPTV9SRUFEX09QQ09ERSwgMyk7CisgICAgU2hpZnRPdXRCaXRzKHBBZCwgT2Zmc2V0LCBwQWQtPkVFUFJPTUFkZHJlc3NOdW0pOworCisgICAgLy8gTm93IHJlYWQgdGhlIGRhdGEgKDE2IGJpdHMpIGluIGZyb20gdGhlIHNlbGVjdGVkIEVFUFJPTSB3b3JkCisgICAgZGF0YSA9IFNoaWZ0SW5CaXRzKHBBZCk7CisKKyAgICBFRXByb21DbGVhbnVwKHBBZCk7CisKKyAgICByZXR1cm4gZGF0YTsKK30JLy9SZWFkRUVwcm9tCisKK1ZPSUQgUlRNUF9FRVBST01fV1JJVEUxNigKKyAgICBJTglQUlRNUF9BREFQVEVSCXBBZCwKKyAgICBJTiAgVVNIT1JUIE9mZnNldCwKKyAgICBJTiAgVVNIT1JUIERhdGEpCit7CisgICAgVUlOVDMyIHg7CisKKwlPZmZzZXQgLz0gMjsKKworCUVXRU4ocEFkKTsKKworICAgIC8vIHJlc2V0IGJpdHMgYW5kIHNldCBFRUNTCisgICAgUlRNUF9JT19SRUFEMzIocEFkLCBFMlBST01fQ1NSLCAmeCk7CisgICAgeCAmPSB+KEVFREkgfCBFRURPIHwgRUVTSyk7CisgICAgeCB8PSBFRUNTOworICAgIFJUTVBfSU9fV1JJVEUzMihwQWQsIEUyUFJPTV9DU1IsIHgpOworCisJLy8ga2ljayBhIHB1bHNlCisJUmFpc2VDbG9jayhwQWQsICZ4KTsKKwlMb3dlckNsb2NrKHBBZCwgJngpOworCisgICAgLy8gb3V0cHV0IHRoZSByZWFkX29wY29kZSAscmVnaXN0ZXIgbnVtYmVyIGFuZCBkYXRhIGluIHRoYXQgb3JkZXIKKyAgICBTaGlmdE91dEJpdHMocEFkLCBFRVBST01fV1JJVEVfT1BDT0RFLCAzKTsKKyAgICBTaGlmdE91dEJpdHMocEFkLCBPZmZzZXQsIHBBZC0+RUVQUk9NQWRkcmVzc051bSk7CisJU2hpZnRPdXRCaXRzKHBBZCwgRGF0YSwgMTYpOwkJLy8gMTYtYml0IGFjY2VzcworCisgICAgLy8gcmVhZCBETyBzdGF0dXMKKyAgICBSVE1QX0lPX1JFQUQzMihwQWQsIEUyUFJPTV9DU1IsICZ4KTsKKworCUVFcHJvbUNsZWFudXAocEFkKTsKKworCVJUTVB1c2VjRGVsYXkoMTAwMDApOwkvL2RlbGF5IGZvciB0d3AoTUFYKT0xMG1zCisKKwlFV0RTKHBBZCk7CisKKyAgICBFRXByb21DbGVhbnVwKHBBZCk7Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2Zpcm13YXJlLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9maXJtd2FyZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3Mjk5NmYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9maXJtd2FyZS5oCkBAIC0wLDAgKzEsNTU4IEBACisvKgorIENvcHlyaWdodCAoYykgMjAwNywgUmFsaW5rIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24KKyBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgUmVkaXN0cmlidXRpb24uICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIGJpbmFyeSBmb3JtLCB3aXRob3V0CisgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorIG1ldDoKKworIAkqIFJlZGlzdHJpYnV0aW9ucyBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhlCisgCWZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKKyAJcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIAkqIE5laXRoZXIgdGhlIG5hbWUgb2YgUmFsaW5rIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAJc3VwcGxpZXJzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcworIAlzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAJKiBObyByZXZlcnNlIGVuZ2luZWVyaW5nLCBkZWNvbXBpbGF0aW9uLCBvciBkaXNhc3NlbWJseSBvZiB0aGlzIHNvZnR3YXJlCisgCWlzIHBlcm1pdHRlZC4KKworIExpbWl0ZWQgcGF0ZW50IGxpY2Vuc2UuIFJhbGluayBUZWNobm9sb2d5IENvcnBvcmF0aW9uIGdyYW50cyBhIHdvcmxkLXdpZGUsCisgcm95YWx0eS1mcmVlLCBub24tZXhjbHVzaXZlIGxpY2Vuc2UgdW5kZXIgcGF0ZW50cyBpdCBub3cgb3IgaGVyZWFmdGVyCisgb3ducyBvciBjb250cm9scyB0byBtYWtlLCBoYXZlIG1hZGUsIHVzZSwgaW1wb3J0LCBvZmZlciB0byBzZWxsIGFuZAorIHNlbGwgKCJVdGlsaXplIikgdGhpcyBzb2Z0d2FyZSwgYnV0IHNvbGVseSB0byB0aGUgZXh0ZW50IHRoYXQgYW55Cisgc3VjaCBwYXRlbnQgaXMgbmVjZXNzYXJ5IHRvIFV0aWxpemUgdGhlIHNvZnR3YXJlIGFsb25lLCBvciBpbgorIGNvbWJpbmF0aW9uIHdpdGggYW4gb3BlcmF0aW5nIHN5c3RlbSBsaWNlbnNlZCB1bmRlciBhbiBhcHByb3ZlZCBPcGVuCisgU291cmNlIGxpY2Vuc2UgYXMgbGlzdGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlIGF0CisgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzLiAgVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0bworIGFueSBvdGhlciBjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGlzIHNvZnR3YXJlLiAgTm8gaGFyZHdhcmUgcGVyCisgc2UgaXMgbGljZW5zZWQgaGVyZXVuZGVyLgorCisgRElTQ0xBSU1FUi4gIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORAorIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywKKyBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORAorIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MKKyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SCisgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRQorIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKKyBEQU1BR0UuCisqLworLyogQVVUTyBHRU4gUExFQVNFIERPIE5PVCBNT0RJRlkgSVQgKi8KKy8qIEFVVE8gR0VOIFBMRUFTRSBETyBOT1QgTU9ESUZZIElUICovCisKKworVUNIQVIgRmlybXdhcmVJbWFnZSBbXSA9IHsKKzB4MDIsIDB4MDMsIDB4NWUsIDB4MDIsIDB4MDIsIDB4YjEsIDB4MjIsIDB4MjIsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4MDIsIDB4MDEsIDB4ODIsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweDAyLCAweDAwLCAweDFlLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweDAyLCAweDAxLCAweDMzLCAweGMwLCAweGUwLAorMHhjMCwgMHhmMCwgMHhjMCwgMHg4MywgMHhjMCwgMHg4MiwgMHhjMCwgMHhkMCwgMHg3NSwgMHhkMCwgMHgxOCwgMHhjMiwgMHhhZiwgMHgzMCwgMHg0NSwgMHgwMywKKzB4MTIsIDB4MTAsIDB4MDksIDB4OTAsIDB4MDQsIDB4MTYsIDB4ZTAsIDB4MzAsIDB4ZTMsIDB4MDMsIDB4NzQsIDB4MDgsIDB4ZjAsIDB4OTAsIDB4MDQsIDB4MTQsCisweGUwLCAweDIwLCAweGU3LCAweDAzLCAweDAyLCAweDAwLCAweGNiLCAweDc0LCAweDgwLCAweGYwLCAweDkwLCAweDcwLCAweDEyLCAweGUwLCAweGY1LCAweDJmLAorMHg5MCwgMHgwNCwgMHgwNCwgMHhlMCwgMHgyNCwgMHhjZiwgMHg2MCwgMHgzMCwgMHgxNCwgMHg2MCwgMHg0MiwgMHgyNCwgMHhlMiwgMHg2MCwgMHg0NywgMHgxNCwKKzB4NjAsIDB4NTUsIDB4MjQsIDB4MjEsIDB4NzAsIDB4NjAsIDB4ZTUsIDB4NTUsIDB4MjQsIDB4ZmUsIDB4NjAsIDB4MDcsIDB4MTQsIDB4NjAsIDB4MDgsIDB4MjQsCisweDAyLCAweDcwLCAweDA4LCAweDdkLCAweDAxLCAweDgwLCAweDI4LCAweDdkLCAweDAyLCAweDgwLCAweDI0LCAweDkwLCAweDcwLCAweDEwLCAweGUwLCAweGY1LAorMHg1MCwgMHg4NSwgMHgyZiwgMHg0MCwgMHhkMiwgMHgwMSwgMHg4MCwgMHgzZSwgMHhlNSwgMHg1NSwgMHg2NCwgMHgwMywgMHg2MCwgMHgwNCwgMHhlNSwgMHg1NSwKKzB4NzAsIDB4MDQsIDB4N2QsIDB4MDIsIDB4ODAsIDB4MDksIDB4ODUsIDB4MmYsIDB4NDEsIDB4ZDIsIDB4MDIsIDB4ODAsIDB4MjksIDB4YWQsIDB4NTUsIDB4YWYsCisweDJmLCAweDEyLCAweDAyLCAweDhkLCAweDgwLCAweDIwLCAweDkwLCAweDcwLCAweDEwLCAweGUwLCAweGY1LCAweDQ3LCAweDkwLCAweDcwLCAweDExLCAweGUwLAorMHhmNSwgMHg0NCwgMHgxMiwgMHgxMCwgMHgyNSwgMHg4MCwgMHgwNiwgMHg5MCwgMHg3MCwgMHgxMCwgMHhlMCwgMHhmNSwgMHg0NSwgMHhlNCwgMHhmZCwgMHhhZiwKKzB4MmYsIDB4MTIsIDB4MDIsIDB4OGQsIDB4ZDIsIDB4MDQsIDB4OTAsIDB4NzAsIDB4MTMsIDB4ZTQsIDB4ZjAsIDB4ZDIsIDB4YWYsIDB4ZDAsIDB4ZDAsIDB4ZDAsCisweDgyLCAweGQwLCAweDgzLCAweGQwLCAweGYwLCAweGQwLCAweGUwLCAweDMyLCAweDkwLCAweDcwLCAweDJhLCAweGUwLCAweDMwLCAweGUxLCAweDUzLCAweGMyLAorMHhhZiwgMHg5MCwgMHg3MCwgMHgyOCwgMHhlMCwgMHg5MCwgMHgxMCwgMHgxYywgMHhmMCwgMHg5MCwgMHg3MCwgMHgyOSwgMHhlMCwgMHg5MCwgMHgxMCwgMHgxZCwKKzB4ZjAsIDB4OTAsIDB4NzAsIDB4MmEsIDB4ZTAsIDB4OTAsIDB4MTAsIDB4MWUsIDB4ZjAsIDB4OTAsIDB4MTAsIDB4MWMsIDB4ZTAsIDB4ZjUsIDB4MzAsIDB4OTAsCisweDEwLCAweDFlLCAweGUwLCAweDIwLCAweGUxLCAweGYzLCAweDkwLCAweDEwLCAweDFjLCAweGUwLCAweDkwLCAweDcwLCAweDI4LCAweGYwLCAweDkwLCAweDEwLAorMHgxZCwgMHhlMCwgMHg5MCwgMHg3MCwgMHgyOSwgMHhmMCwgMHg5MCwgMHgxMCwgMHgxZSwgMHhlMCwgMHg5MCwgMHg3MCwgMHgyYSwgMHhmMCwgMHgzMCwgMHg0YSwKKzB4MGQsIDB4OTAsIDB4NzAsIDB4MjQsIDB4ZTAsIDB4NDQsIDB4MDEsIDB4ZjAsIDB4OTAsIDB4MDIsIDB4MmMsIDB4NzQsIDB4ZmYsIDB4ZjAsIDB4YzIsIDB4MDUsCisweGQyLCAweGFmLCAweDIyLCAweGMwLCAweGUwLCAweGMwLCAweGYwLCAweGMwLCAweDgzLCAweGMwLCAweDgyLCAweGMwLCAweGQwLCAweGU4LCAweGMwLCAweGUwLAorMHhlOSwgMHhjMCwgMHhlMCwgMHhlYSwgMHhjMCwgMHhlMCwgMHhlYiwgMHhjMCwgMHhlMCwgMHhlYywgMHhjMCwgMHhlMCwgMHhlZCwgMHhjMCwgMHhlMCwgMHhlZSwKKzB4YzAsIDB4ZTAsIDB4ZWYsIDB4YzAsIDB4ZTAsIDB4YzIsIDB4YWYsIDB4MzAsIDB4NDUsIDB4MDMsIDB4MTIsIDB4MTAsIDB4MTIsIDB4ZDIsIDB4YWYsIDB4ZDAsCisweGUwLCAweGZmLCAweGQwLCAweGUwLCAweGZlLCAweGQwLCAweGUwLCAweGZkLCAweGQwLCAweGUwLCAweGZjLCAweGQwLCAweGUwLCAweGZiLCAweGQwLCAweGUwLAorMHhmYSwgMHhkMCwgMHhlMCwgMHhmOSwgMHhkMCwgMHhlMCwgMHhmOCwgMHhkMCwgMHhkMCwgMHhkMCwgMHg4MiwgMHhkMCwgMHg4MywgMHhkMCwgMHhmMCwgMHhkMCwKKzB4ZTAsIDB4MzIsIDB4YzAsIDB4ZTAsIDB4YzAsIDB4ZjAsIDB4YzAsIDB4ODMsIDB4YzAsIDB4ODIsIDB4YzAsIDB4ZDAsIDB4NzUsIDB4ZDAsIDB4MTAsIDB4YzIsCisweGFmLCAweDMwLCAweDQ1LCAweDAzLCAweDEyLCAweDEwLCAweDBjLCAweDMwLCAweDU4LCAweDBhLCAweGU1LCAweDU0LCAweDYwLCAweDA0LCAweDE1LCAweDU0LAorMHg4MCwgMHgwMiwgMHhjMiwgMHg1OCwgMHgzMCwgMHg1OSwgMHgwYSwgMHhlNSwgMHg1MCwgMHg2MCwgMHgwNCwgMHgxNSwgMHg1MCwgMHg4MCwgMHgwMiwgMHhjMiwKKzB4NTksIDB4ZDUsIDB4NTMsIDB4MDcsIDB4MzAsIDB4NjAsIDB4MDQsIDB4MTUsIDB4NDYsIDB4ZDIsIDB4MDQsIDB4MzAsIDB4NDUsIDB4MDMsIDB4MTIsIDB4MTAsCisweDBmLCAweGMyLCAweDhkLCAweGQyLCAweGFmLCAweGQwLCAweGQwLCAweGQwLCAweDgyLCAweGQwLCAweDgzLCAweGQwLCAweGYwLCAweGQwLCAweGUwLCAweDMyLAorMHgxMiwgMHgwMiwgMHhkMywgMHgzMCwgMHg0NSwgMHgwMywgMHgxMiwgMHgxMCwgMHgwMywgMHgzMCwgMHgwMSwgMHgwNiwgMHgyMCwgMHgwOSwgMHgwMywgMHgxMiwKKzB4MTAsIDB4MWMsIDB4MzAsIDB4MDIsIDB4MDYsIDB4MjAsIDB4MGEsIDB4MDMsIDB4MTIsIDB4MTAsIDB4MWYsIDB4MzAsIDB4MDMsIDB4MDYsIDB4MjAsIDB4MGIsCisweDAzLCAweDEyLCAweDEwLCAweDFmLCAweDMwLCAweDA0LCAweDA2LCAweDIwLCAweDBjLCAweDAzLCAweDEyLCAweDEwLCAweDIyLCAweDIwLCAweDEzLCAweDA5LAorMHgyMCwgMHgxMSwgMHgwNiwgMHhlNSwgMHgyYiwgMHg0NSwgMHgyYywgMHg2MCwgMHgwMywgMHhkMywgMHg4MCwgMHgwMSwgMHhjMywgMHg5MiwgMHhhOSwgMHgxMiwKKzB4MDIsIDB4ZWMsIDB4ODAsIDB4YmYsIDB4YzIsIDB4NDMsIDB4ZDIsIDB4NDUsIDB4ZTQsIDB4ZjUsIDB4MjAsIDB4ZjUsIDB4MjEsIDB4ZjUsIDB4NTMsIDB4ZjUsCisweDQ2LCAweGY1LCAweDJiLCAweGY1LCAweDJjLCAweGMyLCAweDQyLCAweGY1LCAweDUxLCAweGY1LCAweDUyLCAweGY1LCAweDU1LCAweDkwLCAweDA0LCAweDE4LAorMHg3NCwgMHg4MCwgMHhmMCwgMHg5MCwgMHgwNCwgMHgxYSwgMHg3NCwgMHgwOCwgMHhmMCwgMHhjMiwgMHgxOSwgMHhjMiwgMHgxOCwgMHhjMiwgMHgxYSwgMHgyMiwKKzB4YzgsIDB4ZWYsIDB4YzgsIDB4ZTYsIDB4ZmEsIDB4MDgsIDB4ZTYsIDB4NGEsIDB4NjAsIDB4MGMsIDB4YzgsIDB4ZWYsIDB4YzgsIDB4MDgsIDB4ZTYsIDB4MTYsCisweDE4LCAweDcwLCAweDAxLCAweDE2LCAweGMzLCAweDIyLCAweGVkLCAweDI0LCAweGZmLCAweGZkLCAweGVjLCAweDM0LCAweGZmLCAweGM4LCAweGVmLCAweGM4LAorMHhmNiwgMHgwOCwgMHhjNiwgMHhlZCwgMHhjNiwgMHhkMywgMHgyMiwgMHhkMCwgMHg4MywgMHhkMCwgMHg4MiwgMHhmOCwgMHhlNCwgMHg5MywgMHg3MCwgMHgxMiwKKzB4NzQsIDB4MDEsIDB4OTMsIDB4NzAsIDB4MGQsIDB4YTMsIDB4YTMsIDB4OTMsIDB4ZjgsIDB4NzQsIDB4MDEsIDB4OTMsIDB4ZjUsIDB4ODIsIDB4ODgsIDB4ODMsCisweGU0LCAweDczLCAweDc0LCAweDAyLCAweDkzLCAweDY4LCAweDYwLCAweGVmLCAweGEzLCAweGEzLCAweGEzLCAweDgwLCAweGRmLCAweGVmLCAweGY0LCAweDYwLAorMHgxZiwgMHhlNCwgMHhmZSwgMHgxMiwgMHgwMywgMHg2YSwgMHhlMCwgMHhiNCwgMHhmZiwgMHgxMiwgMHgxMiwgMHgwMywgMHg2YSwgMHhlZiwgMHhmMCwgMHg3NCwKKzB4MWMsIDB4MmUsIDB4ZjUsIDB4ODIsIDB4ZTQsIDB4MzQsIDB4NzAsIDB4ZjUsIDB4ODMsIDB4ZWQsIDB4ZjAsIDB4MjIsIDB4MGUsIDB4YmUsIDB4MDQsIDB4ZTMsCisweDIyLCAweGMwLCAweGUwLCAweGMwLCAweGYwLCAweGMwLCAweDgzLCAweGMwLCAweDgyLCAweGMwLCAweGQwLCAweDc1LCAweGQwLCAweDA4LCAweGMyLCAweGFmLAorMHgzMCwgMHg0NSwgMHgwMywgMHgxMiwgMHgxMCwgMHgwNiwgMHhkMiwgMHhhZiwgMHhkMCwgMHhkMCwgMHhkMCwgMHg4MiwgMHhkMCwgMHg4MywgMHhkMCwgMHhmMCwKKzB4ZDAsIDB4ZTAsIDB4MzIsIDB4YzIsIDB4YWYsIDB4MTIsIDB4MDAsIDB4MDYsIDB4MTIsIDB4MDIsIDB4MTQsIDB4MTIsIDB4MDMsIDB4MWMsIDB4ZTQsIDB4ZjUsCisweDIyLCAweGY1LCAweDQ3LCAweDkwLCAweDA0LCAweDAwLCAweDc0LCAweDgwLCAweGYwLCAweGQyLCAweGFmLCAweDIyLCAweDMwLCAweDQ1LCAweDAzLCAweDEyLAorMHgxMCwgMHgxNSwgMHhlNSwgMHgyMCwgMHg3MCwgMHgwMywgMHgyMCwgMHgxMCwgMHgwMywgMHgzMCwgMHgxMSwgMHgwMywgMHg0MywgMHg4NywgMHgwMSwgMHgyMiwKKzB4YzAsIDB4MmEsIDB4NzQsIDB4MDMsIDB4YzAsIDB4ZTAsIDB4YzAsIDB4ODIsIDB4YzAsIDB4ODMsIDB4NzUsIDB4MmEsIDB4MGEsIDB4MjIsIDB4YzAsIDB4MmEsCisweDc0LCAweDAzLCAweGMwLCAweGUwLCAweGMwLCAweDgyLCAweGMwLCAweDgzLCAweDc1LCAweDJhLCAweDE4LCAweDIyLCAweDc1LCAweDg5LCAweDAyLCAweGU0LAorMHhmNSwgMHg4YywgMHhmNSwgMHg4YSwgMHhmNSwgMHg4OCwgMHhmNSwgMHhiOCwgMHhmNSwgMHhlOCwgMHg3NSwgMHg5MCwgMHgxOCwgMHhkMiwgMHg4YywgMHg3NSwKKzB4YTgsIDB4MDUsIDB4MjIsIDB4Y2UsIDB4ZWYsIDB4Y2UsIDB4ZWUsIDB4NjAsIDB4MDgsIDB4N2YsIDB4ZmYsIDB4MTIsIDB4MDMsIDB4ODAsIDB4MWUsIDB4ODAsCisweGY1LCAweDIyLCAweGM4LCAweGVmLCAweGM4LCAweGU2LCAweDYwLCAweDAzLCAweDE2LCAweGMzLCAweDIyLCAweGVkLCAweDE0LCAweGY2LCAweGQzLCAweDIyLAorMHhjOCwgMHhlZiwgMHhjOCwgMHhlNiwgMHg2MCwgMHgwNiwgMHgxNiwgMHhlNiwgMHgyNCwgMHhmZiwgMHhiMywgMHgyMiwgMHhjMywgMHgyMiwgMHg3OCwgMHg3ZiwKKzB4ZTQsIDB4ZjYsIDB4ZDgsIDB4ZmQsIDB4NzUsIDB4ODEsIDB4NWYsIDB4MDIsIDB4MDEsIDB4ZDAsIDB4NzQsIDB4MTQsIDB4MmUsIDB4ZjUsIDB4ODIsIDB4ZTQsCisweDM0LCAweDcwLCAweGY1LCAweDgzLCAweDIyLCAweGVmLCAweDkwLCAweDAzLCAweDdlLCAweDkzLCAweDkwLCAweDAzLCAweDAwLCAweDczLCAweDBhLCAweDE4LAorMHhlZiwgMHg2MCwgMHgwMywgMHgxZiwgMHg4MCwgMHhmYSwgMHgyMiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweDAyLCAweDEwLCAweDI4LCAweDAyLCAweDEwLCAweDNiLCAweDAyLCAweDEwLCAweDNjLCAweDAyLCAweDEyLCAweGI4LCAweDAyLAorMHgxMiwgMHhiOSwgMHgwMiwgMHgxMywgMHgzZSwgMHgwMiwgMHgxMywgMHgzZiwgMHhjMywgMHgyMiwgMHhmZiwgMHhmZiwgMHgwMiwgMHgxNiwgMHg1NiwgMHgwMiwKKzB4MTcsIDB4NmIsIDB4MDIsIDB4MTQsIDB4MmEsIDB4MDIsIDB4MTMsIDB4NDAsIDB4MzAsIDB4MDUsIDB4MDYsIDB4MjAsIDB4MGQsIDB4MDMsIDB4MTIsIDB4MDAsCisweGQ4LCAweDMwLCAweDA2LCAweDA2LCAweDIwLCAweDBlLCAweDAzLCAweDEyLCAweDE4LCAweDVlLCAweDIyLCAweDIyLCAweDkwLCAweDA0LCAweDE0LCAweGUwLAorMHgyMCwgMHhlNywgMHgwMywgMHgwMiwgMHgxMiwgMHhiNywgMHg5MCwgMHg3MCwgMHgxMiwgMHhlMCwgMHhmNSwgMHg1NiwgMHg5MCwgMHgwNCwgMHgwNCwgMHhlMCwKKzB4MTIsIDB4MDIsIDB4NjcsIDB4MTEsIDB4NGUsIDB4MzAsIDB4MTEsIDB4MjUsIDB4MzEsIDB4MTAsIDB4ODcsIDB4MzMsIDB4MTAsIDB4YWEsIDB4MzQsIDB4MTAsCisweGMzLCAweDM1LCAweDExLCAweDU3LCAweDUwLCAweDExLCAweDdiLCAweDUxLCAweDExLCAweDg0LCAweDUyLCAweDExLCAweDg0LCAweDUzLCAweDExLCAweDg0LAorMHg1NCwgMHgxMSwgMHhjNSwgMHg1NSwgMHgxMSwgMHhkYywgMHg3MCwgMHgxMiwgMHgwNywgMHg3MSwgMHgxMiwgMHgzNCwgMHg3MiwgMHgxMiwgMHg1ZSwgMHg4MCwKKzB4MTIsIDB4ODEsIDB4ODMsIDB4MDAsIDB4MDAsIDB4MTIsIDB4YjcsIDB4NzUsIDB4MjQsIDB4MDUsIDB4NzUsIDB4MjUsIDB4ZGMsIDB4OTAsIDB4NzAsIDB4OWYsCisweDc0LCAweDEyLCAweGYwLCAweGQyLCAweDE4LCAweGQyLCAweDYxLCAweDc1LCAweDM1LCAweDBkLCAweGU0LCAweDkwLCAweDcwLCAweDEzLCAweGYwLCAweGU1LAorMHg1NiwgMHhmNCwgMHg3MCwgMHgwMywgMHgwMiwgMHgxMiwgMHhiNywgMHgwMiwgMHgxMiwgMHhhYSwgMHhjMiwgMHgxOCwgMHg5MCwgMHgwMSwgMHgxNCwgMHhlMCwKKzB4NTQsIDB4ZmQsIDB4ZjAsIDB4ZTQsIDB4OTAsIDB4NzAsIDB4MTMsIDB4ZjAsIDB4ZTUsIDB4NTYsIDB4ZjQsIDB4NzAsIDB4MDMsIDB4MDIsIDB4MTIsIDB4YjcsCisweDAyLCAweDEyLCAweGFhLCAweGU1LCAweDU1LCAweDY0LCAweDAyLCAweDcwLCAweDM3LCAweDkwLCAweDcwLCAweDEwLCAweGUwLCAweDYwLCAweDA4LCAweDkwLAorMHgwMSwgMHgwZCwgMHg3NCwgMHgwOSwgMHhmMCwgMHg4MCwgMHgyNSwgMHhlNSwgMHgzNCwgMHgxNCwgMHg2MCwgMHgwYSwgMHgxNCwgMHg2MCwgMHgwZiwgMHgxNCwKKzB4NjAsIDB4MTQsIDB4MjQsIDB4MDMsIDB4NzAsIDB4MTYsIDB4OTAsIDB4MDEsIDB4MGQsIDB4NzQsIDB4MDgsIDB4ZjAsIDB4ODAsIDB4MGUsIDB4OTAsIDB4MDEsCisweDBkLCAweDc0LCAweDBiLCAweGYwLCAweDgwLCAweDA2LCAweDkwLCAweDAxLCAweDBkLCAweDc0LCAweDFiLCAweGYwLCAweDdkLCAweDAxLCAweDgwLCAweDAyLAorMHg3ZCwgMHgwMiwgMHhhZiwgMHg1NiwgMHgxMiwgMHgwMiwgMHg4ZCwgMHg5MCwgMHg3MCwgMHgxMSwgMHhlMCwgMHgyNCwgMHhmZiwgMHg5MiwgMHgxYiwgMHg5MCwKKzB4MDQsIDB4MTQsIDB4NzQsIDB4ODAsIDB4ZjAsIDB4ZTQsIDB4OTAsIDB4NzAsIDB4MTMsIDB4ZjAsIDB4ZTUsIDB4NTYsIDB4ZjQsIDB4NzAsIDB4MDMsIDB4MDIsCisweDEyLCAweGI3LCAweDAyLCAweDEyLCAweGFhLCAweDIwLCAweDAyLCAweDAzLCAweDMwLCAweDAzLCAweDFkLCAweDdkLCAweDAyLCAweGFmLCAweDU2LCAweDEyLAorMHgwMiwgMHg4ZCwgMHg5MCwgMHgwNCwgMHgxNCwgMHg3NCwgMHg4MCwgMHhmMCwgMHhlNCwgMHg5MCwgMHg3MCwgMHgxMywgMHhmMCwgMHhlNSwgMHg1NiwgMHhmNCwKKzB4NzAsIDB4MDMsIDB4MDIsIDB4MTIsIDB4YjcsIDB4MDIsIDB4MTIsIDB4YWEsIDB4ODUsIDB4NTYsIDB4NDEsIDB4ZDIsIDB4MDIsIDB4MjIsIDB4OTAsIDB4NzAsCisweDExLCAweGUwLCAweDI0LCAweGZmLCAweDkyLCAweDFiLCAweDIyLCAweDkwLCAweDcwLCAweDEwLCAweGUwLCAweDU0LCAweDdmLCAweDY0LCAweDAyLCAweDYwLAorMHgwMywgMHgwMiwgMHgxMiwgMHhiNywgMHg5MCwgMHg3MCwgMHgxMSwgMHhlMCwgMHg2NCwgMHgwOCwgMHg2MCwgMHgwOCwgMHhlMCwgMHg2NCwgMHgyMCwgMHg2MCwKKzB4MDMsIDB4MDIsIDB4MTIsIDB4YjcsIDB4NzUsIDB4NGUsIDB4MDMsIDB4NzUsIDB4NGYsIDB4MjAsIDB4MjIsIDB4OTAsIDB4NzAsIDB4MTEsIDB4ZTAsIDB4MjQsCisweGZmLCAweDkyLCAweDQ3LCAweDIyLCAweDkwLCAweDA0LCAweDA0LCAweGUwLCAweDI1LCAweGUwLCAweDI0LCAweDVkLCAweGY1LCAweDU3LCAweDkwLCAweDcwLAorMHgxMCwgMHhlMCwgMHhmZiwgMHg3NCwgMHg0NywgMHgyNSwgMHg1NywgMHhmOCwgMHhjNiwgMHhlZiwgMHhjNiwgMHg5MCwgMHg3MCwgMHgxMSwgMHhlMCwgMHhmZiwKKzB4NzQsIDB4NDgsIDB4MjUsIDB4NTcsIDB4ZjgsIDB4YzYsIDB4ZWYsIDB4YzYsIDB4ZTQsIDB4ZmQsIDB4YWYsIDB4NTYsIDB4MTIsIDB4MDIsIDB4OGQsIDB4OTAsCisweDA0LCAweDE0LCAweDc0LCAweDgwLCAweGYwLCAweGU0LCAweDkwLCAweDcwLCAweDEzLCAweGYwLCAweGU1LCAweDU2LCAweGY0LCAweDcwLCAweDAzLCAweDAyLAorMHgxMiwgMHhiNywgMHgwMiwgMHgxMiwgMHhhYSwgMHhlNSwgMHg0NywgMHhiNCwgMHgwNywgMHgwOCwgMHg5MCwgMHg3MCwgMHgxMSwgMHhlMCwgMHg1NCwgMHgwNywKKzB4ZjUsIDB4MjYsIDB4ZTQsIDB4ZmQsIDB4YWYsIDB4NTYsIDB4MTIsIDB4MDIsIDB4OGQsIDB4ZDIsIDB4MDQsIDB4MjIsIDB4OTAsIDB4NzAsIDB4MTAsIDB4ZTAsCisweGZlLCAweDkwLCAweDcwLCAweDExLCAweGUwLCAweGZkLCAweGVkLCAweGY4LCAweGU2LCAweGY1LCAweDU3LCAweGZkLCAweGFmLCAweDU2LCAweDEyLCAweDAyLAorMHg4ZCwgMHg5MCwgMHgwNCwgMHgxNCwgMHg3NCwgMHg4MCwgMHhmMCwgMHhlNCwgMHg5MCwgMHg3MCwgMHgxMywgMHhmMCwgMHhlNSwgMHg1NiwgMHhmNCwgMHg3MCwKKzB4MDMsIDB4MDIsIDB4MTIsIDB4YjcsIDB4MDIsIDB4MTIsIDB4YWEsIDB4OTAsIDB4NzAsIDB4MTAsIDB4ZTAsIDB4ZmUsIDB4OTAsIDB4NzAsIDB4MTEsIDB4ZTAsCisweGZkLCAweGVkLCAweGY1LCAweDgyLCAweDhlLCAweDgzLCAweGUwLCAweGY1LCAweDU3LCAweGZkLCAweGFmLCAweDU2LCAweDEyLCAweDAyLCAweDhkLCAweDkwLAorMHgwNCwgMHgxNCwgMHg3NCwgMHg4MCwgMHhmMCwgMHhlNCwgMHg5MCwgMHg3MCwgMHgxMywgMHhmMCwgMHhlNSwgMHg1NiwgMHhmNCwgMHg3MCwgMHgwMywgMHgwMiwKKzB4MTIsIDB4YjcsIDB4ODAsIDB4NzYsIDB4ZTQsIDB4ZjUsIDB4NGUsIDB4ZjUsIDB4NGYsIDB4NzUsIDB4MjYsIDB4ZmYsIDB4YzIsIDB4MTksIDB4YzIsIDB4MTgsCisweGMyLCAweDFhLCAweDc1LCAweDM0LCAweGZmLCAweGFkLCAweDU3LCAweGFmLCAweDU2LCAweDEyLCAweDAyLCAweDhkLCAweDkwLCAweDA0LCAweDE0LCAweDc0LAorMHg4MCwgMHhmMCwgMHhlNCwgMHg5MCwgMHg3MCwgMHgxMywgMHhmMCwgMHhlNSwgMHg1NiwgMHhmNCwgMHg2MCwgMHg1YiwgMHg4MCwgMHg0YywgMHg5MCwgMHg3MCwKKzB4MTAsIDB4ZTAsIDB4MjQsIDB4ZmYsIDB4OTIsIDB4NGEsIDB4ZDIsIDB4MDUsIDB4YWQsIDB4NTcsIDB4YWYsIDB4NTYsIDB4MTIsIDB4MDIsIDB4OGQsIDB4OTAsCisweDA0LCAweDE0LCAweDc0LCAweDgwLCAweGYwLCAweGU0LCAweDkwLCAweDcwLCAweDEzLCAweGYwLCAweGU1LCAweDU2LCAweGY0LCAweDYwLCAweDM4LCAweDgwLAorMHgyOSwgMHg5MCwgMHg3MCwgMHgxMCwgMHhlMCwgMHhmNSwgMHgzNCwgMHhkMywgMHg5NCwgMHgwMCwgMHg0MCwgMHgwNywgMHg5MCwgMHgwMSwgMHgwZCwgMHhlMCwKKzB4NTQsIDB4ZmIsIDB4ZjAsIDB4YWQsIDB4NTcsIDB4YWYsIDB4NTYsIDB4MTIsIDB4MDIsIDB4OGQsIDB4OTAsIDB4MDQsIDB4MTQsIDB4NzQsIDB4ODAsIDB4ZjAsCisweGU0LCAweDkwLCAweDcwLCAweDEzLCAweGYwLCAweGU1LCAweDU2LCAweGY0LCAweDYwLCAweDBkLCAweDkwLCAweDcwLCAweDI1LCAweGUwLCAweDQ0LCAweDAxLAorMHhmMCwgMHg5MCwgMHgwMiwgMHgyYywgMHg3NCwgMHhmZiwgMHhmMCwgMHgyMiwgMHgyMiwgMHhlNSwgMHg1MywgMHg2MCwgMHgwMywgMHgwMiwgMHgxMywgMHgzZCwKKzB4ZTUsIDB4NGYsIDB4NDUsIDB4NGUsIDB4NjAsIDB4MDgsIDB4ZTUsIDB4NGYsIDB4MTUsIDB4NGYsIDB4NzAsIDB4MDIsIDB4MTUsIDB4NGUsIDB4YTIsIDB4MTksCisweGU0LCAweDMzLCAweDkwLCAweDcwLCAweDkwLCAweGYwLCAweGEyLCAweDE4LCAweGU0LCAweDMzLCAweGEzLCAweGYwLCAweDMwLCAweDE5LCAweDRkLCAweDkwLAorMHg3MCwgMHg5OCwgMHg3NCwgMHgyMywgMHhmMCwgMHhhMywgMHhlNSwgMHgyNSwgMHhmMCwgMHhlNSwgMHgyNCwgMHhhMywgMHhmMCwgMHg3ZiwgMHgzNSwgMHg3ZCwKKzB4MzIsIDB4MTIsIDB4MDMsIDB4NDIsIDB4NTAsIDB4MDksIDB4OTAsIDB4MTAsIDB4MDQsIDB4ZTAsIDB4NTQsIDB4ZjcsIDB4ZjAsIDB4ZDIsIDB4MDYsIDB4ZTUsCisweDM1LCAweGQzLCAweDk0LCAweDEwLCAweDQwLCAweDFlLCAweDMwLCAweDFhLCAweDFiLCAweGMyLCAweDFhLCAweGEyLCAweDE4LCAweDkyLCAweDE5LCAweDIwLAorMHgxOSwgMHgxMiwgMHg5MCwgMHgwNCwgMHgwOSwgMHhlMCwgMHg1NCwgMHhkZCwgMHhmMCwgMHg5MCwgMHgxMCwgMHgwNCwgMHhlMCwgMHg0NCwgMHgwOCwgMHhmMCwKKzB4YzIsIDB4NjEsIDB4ZDIsIDB4MDMsIDB4ZTUsIDB4MzUsIDB4YjQsIDB4MGIsIDB4MTQsIDB4ZDIsIDB4MDMsIDB4MjIsIDB4ZTQsIDB4ZjUsIDB4MzUsIDB4YTIsCisweDE4LCAweDkyLCAweDE5LCAweDMwLCAweDE5LCAweDA3LCAweDkwLCAweDA0LCAweDA5LCAweGUwLCAweDQ0LCAweDIyLCAweGYwLCAweDIyLCAweDIyLCAweDIyLAorMHhjMiwgMHg0YiwgMHhjMiwgMHg0YywgMHhlNSwgMHg0NCwgMHgxMiwgMHgwMiwgMHg2NywgMHgxMywgMHg2MiwgMHgwMCwgMHgxMywgMHhmNSwgMHgwNCwgMHgxMywKKzB4ZjEsIDB4MDgsIDB4MTMsIDB4Y2MsIDB4MTAsIDB4MTMsIDB4NzYsIDB4MjAsIDB4MTMsIDB4OTYsIDB4NjAsIDB4MTMsIDB4YTcsIDB4YTAsIDB4MDAsIDB4MDAsCisweDEzLCAweGY3LCAweDg1LCAweDQ4LCAweDQzLCAweDg1LCAweDRhLCAweDQyLCAweDg1LCAweDRjLCAweDVlLCAweGU1LCAweDQ3LCAweDY0LCAweDA2LCAweDYwLAorMHgwMywgMHgwMiwgMHgxMywgMHhmNywgMHg4MCwgMHgxYiwgMHhlNSwgMHg0OCwgMHhjNCwgMHg1NCwgMHgwZiwgMHhmNSwgMHg0MywgMHhlNSwgMHg0YSwgMHhjNCwKKzB4NTQsIDB4MGYsIDB4ZjUsIDB4NDIsIDB4ZTUsIDB4NGMsIDB4YzQsIDB4NTQsIDB4MGYsIDB4ZjUsIDB4NWUsIDB4ZTUsIDB4NDcsIDB4NjQsIDB4MDYsIDB4NzAsCisweDY2LCAweDUzLCAweDQzLCAweDBmLCAweDgwLCAweDYxLCAweDg1LCAweDQ5LCAweDQzLCAweDg1LCAweDRiLCAweDQyLCAweDg1LCAweDRkLCAweDVlLCAweGU1LAorMHg0NywgMHg2NCwgMHgwNiwgMHg3MCwgMHg1MiwgMHg4MCwgMHgxYiwgMHhlNSwgMHg0OSwgMHhjNCwgMHg1NCwgMHgwZiwgMHhmNSwgMHg0MywgMHhlNSwgMHg0YiwKKzB4YzQsIDB4NTQsIDB4MGYsIDB4ZjUsIDB4NDIsIDB4ZTUsIDB4NGQsIDB4YzQsIDB4NTQsIDB4MGYsIDB4ZjUsIDB4NWUsIDB4ZTUsIDB4NDcsIDB4NjQsIDB4MDYsCisweDcwLCAweDM1LCAweGU1LCAweDQzLCAweDU0LCAweDBmLCAweDQ0LCAweDEwLCAweGY1LCAweDQzLCAweDgwLCAweDJiLCAweGU1LCAweDQ3LCAweGI0LCAweDA0LAorMHgwNiwgMHg1MywgMHg1ZSwgMHhmYiwgMHg3NSwgMHg0MiwgMHgwOSwgMHhlNSwgMHg0NywgMHhiNCwgMHgwNSwgMHgwNiwgMHg0MywgMHg1ZSwgMHgwNCwgMHg3NSwKKzB4NDIsIDB4MDksIDB4ZTUsIDB4NDcsIDB4YjQsIDB4MDYsIDB4MTAsIDB4ZTUsIDB4NDMsIDB4NTQsIDB4MGYsIDB4NDQsIDB4MzAsIDB4ZjUsIDB4NDMsIDB4ODAsCisweDA2LCAweGQyLCAweDRiLCAweDgwLCAweDAyLCAweGQyLCAweDRjLCAweGU0LCAweGY1LCAweDM4LCAweGU1LCAweDQyLCAweGM0LCAweDU0LCAweGYwLCAweGZmLAorMHhlNSwgMHg0MywgMHg1NCwgMHgwZiwgMHg0ZiwgMHhmNSwgMHg1ZiwgMHg5MCwgMHg3MCwgMHg0NCwgMHhmMCwgMHhhMywgMHhlNSwgMHg1ZSwgMHhmMCwgMHhhMywKKzB4ZTUsIDB4NGEsIDB4ZjAsIDB4YTMsIDB4ZTUsIDB4NDgsIDB4ZjAsIDB4YTMsIDB4ZTUsIDB4NGMsIDB4ZjAsIDB4YTMsIDB4ZTUsIDB4NDQsIDB4ZjAsIDB4YTMsCisweGU1LCAweDQyLCAweGYwLCAweGEzLCAweGU1LCAweDQzLCAweGYwLCAweGQyLCAweDYwLCAweDIyLCAweGU1LCAweDQ3LCAweDYwLCAweDEwLCAweDI0LCAweGMwLAorMHg3MCwgMHgwMywgMHgxMiwgMHgxNiwgMHgzNiwgMHgxMiwgMHgxNCwgMHgzZiwgMHhjMiwgMHhhZiwgMHhjMiwgMHgwNCwgMHhkMiwgMHhhZiwgMHgyMiwgMHhjMiwKKzB4YWYsIDB4OTAsIDB4MDQsIDB4MTQsIDB4ZTAsIDB4NTQsIDB4MGUsIDB4NjAsIDB4MDQsIDB4ZDIsIDB4MWMsIDB4ODAsIDB4MDgsIDB4ZTUsIDB4NGUsIDB4NDUsCisweDRmLCAweDI0LCAweGZmLCAweDkyLCAweDFjLCAweGQyLCAweGFmLCAweDkwLCAweDA0LCAweDE0LCAweGUwLCAweGEyLCAweGU0LCAweDkyLCAweDFkLCAweDc0LAorMHgxZSwgMHhmMCwgMHhlNSwgMHg1ZiwgMHg1NCwgMHgwZiwgMHhmNSwgMHgyZCwgMHhlNSwgMHgzOCwgMHg3MCwgMHgxMywgMHgzMCwgMHgxYywgMHgwNSwgMHhlNSwKKzB4NWYsIDB4MjAsIDB4ZTUsIDB4MGIsIDB4MzAsIDB4MWQsIDB4MTksIDB4ZTUsIDB4NWYsIDB4NTQsIDB4MzAsIDB4ZmYsIDB4YmYsIDB4MzAsIDB4MTEsIDB4ZTUsCisweDM4LCAweDcwLCAweDA1LCAweDc1LCAweDM4LCAweDBjLCAweDgwLCAweDAyLCAweDE1LCAweDM4LCAweGQyLCAweDZjLCAweGQyLCAweDZkLCAweDgwLCAweDBmLAorMHhlNSwgMHg1ZiwgMHgzMCwgMHhlNiwgMHgwNiwgMHhjMiwgMHg2YywgMHhkMiwgMHg2ZCwgMHg4MCwgMHgwNCwgMHhkMiwgMHg2YywgMHhjMiwgMHg2ZCwgMHhlNSwKKzB4NDcsIDB4NjQsIDB4MDMsIDB4NzAsIDB4MjEsIDB4MzAsIDB4NGIsIDB4MDYsIDB4YzIsIDB4NmMsIDB4ZDIsIDB4NmQsIDB4ODAsIDB4MTgsIDB4ZTUsIDB4MzgsCisweDcwLCAweDAzLCAweDMwLCAweDRjLCAweDExLCAweGMyLCAweDRjLCAweGU1LCAweDM4LCAweDcwLCAweDA1LCAweDc1LCAweDM4LCAweDA3LCAweDgwLCAweDAyLAorMHgxNSwgMHgzOCwgMHhkMiwgMHg2YywgMHhkMiwgMHg2ZCwgMHg5MCwgMHg3MCwgMHg0NiwgMHhlNSwgMHgyZCwgMHhmMCwgMHgyMCwgMHg2OSwgMHgwNywgMHhlNSwKKzB4NWUsIDB4MjAsIDB4ZTAsIDB4MDIsIDB4YjIsIDB4NjgsIDB4MjAsIDB4NmIsIDB4MDcsIDB4ZTUsIDB4NWUsIDB4MjAsIDB4ZTEsIDB4MDIsIDB4YjIsIDB4NmEsCisweDIwLCAweDZkLCAweDA3LCAweGU1LCAweDVlLCAweDIwLCAweGUyLCAweDAyLCAweGIyLCAweDZjLCAweDkwLCAweDcwLCAweDQ3LCAweGU1LCAweDJkLCAweGYwLAorMHg3NSwgMHgyZSwgMHg0MCwgMHgyMCwgMHg2OSwgMHgwNCwgMHhhMiwgMHg2OCwgMHg4MCwgMHgxNSwgMHgzMCwgMHg2OCwgMHgwNiwgMHhlNSwgMHg0NiwgMHhhMiwKKzB4ZTMsIDB4ODAsIDB4MGMsIDB4ZTUsIDB4NDYsIDB4NTQsIDB4ZjAsIDB4ZmYsIDB4YmYsIDB4ZjAsIDB4MDMsIDB4ZDMsIDB4ODAsIDB4MDEsIDB4YzMsIDB4OTIsCisweDczLCAweDkyLCAweDcyLCAweDIwLCAweDZiLCAweDA0LCAweGEyLCAweDZhLCAweDgwLCAweDE1LCAweDMwLCAweDZhLCAweDA2LCAweGU1LCAweDQ2LCAweGEyLAorMHhlMywgMHg4MCwgMHgwYywgMHhlNSwgMHg0NiwgMHg1NCwgMHhmMCwgMHhmZiwgMHhiZiwgMHhmMCwgMHgwMywgMHhkMywgMHg4MCwgMHgwMSwgMHhjMywgMHg5MiwKKzB4NzUsIDB4OTIsIDB4NzQsIDB4MjAsIDB4NmQsIDB4MDQsIDB4YTIsIDB4NmMsIDB4ODAsIDB4MTUsIDB4MzAsIDB4NmMsIDB4MDYsIDB4ZTUsIDB4NDYsIDB4YTIsCisweGUzLCAweDgwLCAweDBjLCAweGU1LCAweDQ2LCAweDU0LCAweGYwLCAweGZmLCAweGJmLCAweGYwLCAweDAzLCAweGQzLCAweDgwLCAweDAxLCAweGMzLCAweDkyLAorMHg3MSwgMHg5MiwgMHg3MCwgMHg5MCwgMHgxMCwgMHgyZiwgMHhlNSwgMHgyZSwgMHhmMCwgMHhlNSwgMHg0NywgMHg2NCwgMHgwNiwgMHg3MCwgMHg0NiwgMHg5MCwKKzB4MDIsIDB4MjksIDB4ZTAsIDB4NTQsIDB4ZmUsIDB4ZjAsIDB4ZTUsIDB4NDMsIDB4YzQsIDB4NTQsIDB4MGYsIDB4MTQsIDB4NjAsIDB4MTQsIDB4MjQsIDB4ZmUsCisweDYwLCAweDFmLCAweDI0LCAweDAzLCAweDYwLCAweDAzLCAweDAyLCAweDE2LCAweDM1LCAweDkwLCAweDAyLCAweDI4LCAweGUwLCAweDMwLCAweDQ3LCAweDBkLAorMHg4MCwgMHgwNywgMHg5MCwgMHgwMiwgMHgyOCwgMHhlMCwgMHgyMCwgMHg0NywgMHgwNCwgMHg1NCwgMHhmZSwgMHhmMCwgMHgyMiwgMHg0NCwgMHgwMSwgMHhmMCwKKzB4MjIsIDB4ZTUsIDB4NDYsIDB4MzAsIDB4ZTMsIDB4MDQsIDB4N2YsIDB4MDEsIDB4ODAsIDB4MDIsIDB4N2YsIDB4MDAsIDB4OTAsIDB4MDIsIDB4MjgsIDB4ZTAsCisweDU0LCAweGZlLCAweDRmLCAweGYwLCAweDIyLCAweGU1LCAweDQ3LCAweDY0LCAweDA3LCAweDYwLCAweDAzLCAweDAyLCAweDE2LCAweDM1LCAweGY1LCAweDI3LAorMHg5MCwgMHgwMiwgMHgyOSwgMHhlMCwgMHg1NCwgMHhmYywgMHhmMCwgMHhlNSwgMHgyNiwgMHgxNCwgMHg2MCwgMHgyNiwgMHgxNCwgMHg2MCwgMHgyZSwgMHgxNCwKKzB4NjAsIDB4MzYsIDB4MjQsIDB4MDMsIDB4NzAsIDB4NWYsIDB4ZTUsIDB4NDYsIDB4MTMsIDB4MTMsIDB4MTMsIDB4NTQsIDB4MWYsIDB4NzUsIDB4ZjAsIDB4MDMsCisweDg0LCAweGFmLCAweGYwLCAweDIwLCAweDQ3LCAweDA0LCAweDdlLCAweDAxLCAweDgwLCAweDAyLCAweDdlLCAweDAwLCAweGVmLCAweDZlLCAweDI0LCAweGZmLAorMHg4MCwgMHgwMiwgMHhhMiwgMHg0NywgMHg5MiwgMHgzOSwgMHhhMiwgMHg0NywgMHhiMywgMHg5MiwgMHgzOCwgMHg4MCwgMHgzZiwgMHhlNSwgMHg0NiwgMHgzMCwKKzB4ZTMsIDB4MDMsIDB4ZDMsIDB4ODAsIDB4MjcsIDB4YzMsIDB4ODAsIDB4MjQsIDB4ZTUsIDB4NDYsIDB4MzAsIDB4ZTMsIDB4MGQsIDB4NTQsIDB4NzAsIDB4YzMsCisweDk0LCAweDYwLCAweDUwLCAweDA2LCAweDdlLCAweDAwLCAweDdmLCAweDAxLCAweDgwLCAweDA0LCAweDdlLCAweDAwLCAweDdmLCAweDAwLCAweDIwLCAweDQ3LAorMHgwNCwgMHg3ZCwgMHgwMSwgMHg4MCwgMHgwMiwgMHg3ZCwgMHgwMCwgMHhlZiwgMHg2ZCwgMHg0ZSwgMHgyNCwgMHhmZiwgMHg5MiwgMHgzOCwgMHhhMiwgMHg0NywKKzB4YjMsIDB4OTIsIDB4MzksIDB4ODAsIDB4MDcsIDB4YTIsIDB4NDcsIDB4YjMsIDB4OTIsIDB4MzgsIDB4OTIsIDB4MzksIDB4OTAsIDB4MDIsIDB4MjgsIDB4ZTAsCisweDU0LCAweGZjLCAweDQ1LCAweDI3LCAweGYwLCAweDIyLCAweGU0LCAweDkwLCAweDAyLCAweDI5LCAweGYwLCAweDMwLCAweDQ3LCAweDA0LCAweGFmLCAweDQ1LAorMHg4MCwgMHgwNCwgMHhlNSwgMHg0NSwgMHhmNCwgMHhmZiwgMHg5MCwgMHgwMiwgMHgyOCwgMHhlZiwgMHhmMCwgMHgyMiwgMHg4ZiwgMHg1MCwgMHhkMiwgMHg1OSwKKzB4MjIsIDB4OGYsIDB4NTQsIDB4ZDIsIDB4NTgsIDB4MjIsIDB4ZTQsIDB4ZjUsIDB4MzAsIDB4YzIsIDB4YWYsIDB4ZTUsIDB4NTEsIDB4MTQsIDB4NjAsIDB4NGEsCisweDE0LCAweDYwLCAweDZhLCAweDI0LCAweDAyLCAweDYwLCAweDAzLCAweDAyLCAweDE3LCAweDRjLCAweGQyLCAweDU5LCAweDc1LCAweDU1LCAweDAxLCAweDIwLAorMHgxOSwgMHgxYywgMHg5MCwgMHgwMiwgMHgwOCwgMHhlMCwgMHg1NCwgMHhmZSwgMHhmMCwgMHhlMCwgMHgyMCwgMHhlMSwgMHgyMywgMHg5MCwgMHgwNCwgMHgzNCwKKzB4ZTAsIDB4YjQsIDB4MDIsIDB4MWMsIDB4YTMsIDB4ZTAsIDB4YjQsIDB4MDIsIDB4MTcsIDB4YTMsIDB4ZTAsIDB4YjQsIDB4MDIsIDB4MTIsIDB4N2YsIDB4MjAsCisweDEyLCAweDE2LCAweDRjLCAweDkwLCAweDEwLCAweDA0LCAweGUwLCAweDU0LCAweGYzLCAweGYwLCAweDc1LCAweDUxLCAweDAxLCAweDAyLCAweDE3LCAweDRjLAorMHhlNSwgMHg1MCwgMHg3MCwgMHgwNiwgMHg3NSwgMHgzMCwgMHgwMywgMHgwMiwgMHgxNywgMHg0YywgMHg5MCwgMHgxMiwgMHgwMCwgMHhlMCwgMHg1NCwgMHgwMywKKzB4NzAsIDB4MTUsIDB4N2YsIDB4MjAsIDB4MTIsIDB4MTYsIDB4NGMsIDB4MjAsIDB4MTksIDB4MDcsIDB4OTAsIDB4MDIsIDB4MDgsIDB4ZTAsIDB4NTQsIDB4ZmIsCisweGYwLCAweDc1LCAweDUxLCAweDAyLCAweDAyLCAweDE3LCAweDRjLCAweGU1LCAweDUwLCAweDcwLCAweDAyLCAweDgwLCAweDdhLCAweDIwLCAweDE5LCAweDBmLAorMHg5MCwgMHgwMiwgMHgwOCwgMHhlMCwgMHgyMCwgMHhlMywgMHg2YywgMHg5MCwgMHgwNCwgMHgzNywgMHhlMCwgMHg2NCwgMHgyMiwgMHg3MCwgMHg2NCwgMHg5MCwKKzB4MTIsIDB4MDQsIDB4NzQsIDB4MGEsIDB4ZjAsIDB4MzAsIDB4MWIsIDB4MTEsIDB4OTAsIDB4MTMsIDB4MjgsIDB4ZTAsIDB4NTQsIDB4ZjAsIDB4ZjAsIDB4YTMsCisweGUwLCAweDU0LCAweGYwLCAweGYwLCAweGEzLCAweGUwLCAweDU0LCAweGZhLCAweGYwLCAweDIwLCAweDE5LCAweDA3LCAweDkwLCAweDA0LCAweDAxLCAweGUwLAorMHg0NCwgMHgxMCwgMHhmMCwgMHhlNSwgMHgzNCwgMHhmNCwgMHg5MCwgMHgwNCwgMHgwMSwgMHg2MCwgMHgwNiwgMHhlMCwgMHg1NCwgMHhmYiwgMHhmMCwgMHg4MCwKKzB4MDQsIDB4ZTAsIDB4NTQsIDB4ZjksIDB4ZjAsIDB4MjAsIDB4MTksIDB4MDcsIDB4OTAsIDB4MTIsIDB4MDQsIDB4ZTAsIDB4NDQsIDB4MDQsIDB4ZjAsIDB4ZTUsCisweDM0LCAweGY0LCAweDYwLCAweDE0LCAweDkwLCAweDAxLCAweDBkLCAweGUwLCAweGY1LCAweDMzLCAweGU1LCAweDM0LCAweGQzLCAweDk0LCAweDAyLCAweDQwLAorMHgwNywgMHg5MCwgMHgxMiwgMHgwNCwgMHhlMCwgMHg1NCwgMHhmZCwgMHhmMCwgMHg3NSwgMHgzMCwgMHgwMSwgMHg3NSwgMHg1NSwgMHgwMiwgMHhlNCwgMHhmNSwKKzB4NTEsIDB4ODAsIDB4MDksIDB4ZTUsIDB4NTAsIDB4NzAsIDB4MDUsIDB4NzUsIDB4MzAsIDB4MDMsIDB4ZjUsIDB4NTEsIDB4ZTUsIDB4MzAsIDB4NjAsIDB4MTgsCisweGMyLCAweDAxLCAweGU0LCAweGY1LCAweDUxLCAweGMyLCAweDU5LCAweDIwLCAweDE5LCAweDBlLCAweGFkLCAweDMwLCAweGFmLCAweDQwLCAweDEyLCAweDE4LAorMHgyYSwgMHhlNSwgMHgzMCwgMHhiNCwgMHgwMywgMHgwMiwgMHhkMiwgMHgwMywgMHhkMiwgMHhhZiwgMHgyMiwgMHhjMiwgMHhhZiwgMHgzMCwgMHgwMSwgMHgwZSwKKzB4ZTQsIDB4ZjUsIDB4NTEsIDB4YzIsIDB4NTksIDB4YzIsIDB4MDEsIDB4N2QsIDB4MDIsIDB4YWYsIDB4NDAsIDB4MTIsIDB4MTgsIDB4MmEsIDB4ZTUsIDB4NTIsCisweDE0LCAweDYwLCAweDU1LCAweDE0LCAweDYwLCAweDJmLCAweDI0LCAweDAyLCAweDYwLCAweDAzLCAweDAyLCAweDE4LCAweDI3LCAweGU1LCAweDM0LCAweGY0LAorMHg2MCwgMHgyMywgMHhlNSwgMHgzNCwgMHhkMywgMHg5NCwgMHgwMiwgMHg0MCwgMHgxNiwgMHg5MCwgMHgxMiwgMHgwNCwgMHhlMCwgMHg0NCwgMHgwMiwgMHhmMCwKKzB4OTAsIDB4MDEsIDB4MGQsIDB4ZTAsIDB4MjAsIDB4ZTMsIDB4MDMsIDB4MDIsIDB4MTgsIDB4MjcsIDB4N2YsIDB4NTAsIDB4MTIsIDB4MTYsIDB4NTEsIDB4NzUsCisweDUyLCAweDAyLCAweDc1LCAweDU1LCAweDAzLCAweGU1LCAweDM0LCAweGY0LCAweDYwLCAweDBhLCAweGU1LCAweDU0LCAweDcwLCAweDY5LCAweDkwLCAweDAxLAorMHgwZCwgMHhlNSwgMHgzMywgMHhmMCwgMHg5MCwgMHgxMiwgMHgwNCwgMHhlMCwgMHg1NCwgMHhmYiwgMHhmMCwgMHg3ZiwgMHgyMCwgMHgxMiwgMHgxNiwgMHg1MSwKKzB4NzUsIDB4NTIsIDB4MDEsIDB4NzUsIDB4NTUsIDB4MDMsIDB4ODAsIDB4NGYsIDB4ZTUsIDB4NTQsIDB4NzAsIDB4NGIsIDB4OTAsIDB4MDQsIDB4MDEsIDB4ZTAsCisweDQ0LCAweDBlLCAweGYwLCAweDIwLCAweDE5LCAweDA0LCAweGUwLCAweDU0LCAweGVmLCAweGYwLCAweDkwLCAweDEzLCAweDI4LCAweGUwLCAweDQ0LCAweDBmLAorMHhmMCwgMHhhMywgMHhlMCwgMHg0NCwgMHgwZiwgMHhmMCwgMHhhMywgMHhlMCwgMHg0NCwgMHgwNSwgMHhmMCwgMHg5MCwgMHgxMiwgMHgwNCwgMHg3NCwgMHgwMywKKzB4ZjAsIDB4MjAsIDB4MTksIDB4MDcsIDB4OTAsIDB4MDIsIDB4MDgsIDB4ZTAsIDB4NDQsIDB4MDUsIDB4ZjAsIDB4OTAsIDB4MTAsIDB4MDQsIDB4ZTAsIDB4NDQsCisweDBjLCAweGYwLCAweGU0LCAweGY1LCAweDUyLCAweGY1LCAweDU1LCAweDMwLCAweDAyLCAweDBiLCAweGMyLCAweDAyLCAweDdkLCAweDAxLCAweGFmLCAweDQxLAorMHgxMiwgMHgxOCwgMHgyYSwgMHg4MCwgMHgwMiwgMHhjMiwgMHgwMywgMHhkMiwgMHhhZiwgMHgyMiwgMHhlZiwgMHhmNCwgMHg2MCwgMHgyZCwgMHhlNCwgMHhmZSwKKzB4NzQsIDB4MTQsIDB4MmUsIDB4ZjUsIDB4ODIsIDB4ZTQsIDB4MzQsIDB4NzAsIDB4ZjUsIDB4ODMsIDB4ZTAsIDB4YjQsIDB4ZmYsIDB4MTksIDB4NzQsIDB4MTQsCisweDJlLCAweGY1LCAweDgyLCAweGU0LCAweDM0LCAweDcwLCAweGY1LCAweDgzLCAweGVmLCAweGYwLCAweDc0LCAweDFjLCAweDJlLCAweGY1LCAweDgyLCAweGU0LAorMHgzNCwgMHg3MCwgMHhmNSwgMHg4MywgMHhlZCwgMHhmMCwgMHgyMiwgMHgwZSwgMHhiZSwgMHgwNCwgMHhkNSwgMHgyMiwgMHgyMiwgMHgyMiwgMHgyMCwgMHgxOSwKKzB4MDMsIDB4MDIsIDB4MTksIDB4MGYsIDB4OTAsIDB4NzAsIDB4ODAsIDB4ZTAsIDB4MDQsIDB4ZjAsIDB4OTAsIDB4MDQsIDB4MzcsIDB4ZTAsIDB4MzAsIDB4ZTUsCisweDAzLCAweDAyLCAweDE5LCAweDBiLCAweDkwLCAweDA0LCAweDI4LCAweGUwLCAweGY1LCAweDMxLCAweGEzLCAweGUwLCAweGY1LCAweDMwLCAweGY1LCAweDMyLAorMHhlNCwgMHhmNSwgMHgzNywgMHg5MCwgMHg3MCwgMHg4MSwgMHhlMCwgMHgwNCwgMHhmMCwgMHg5MCwgMHg3MCwgMHg4MiwgMHhlMCwgMHgwNCwgMHhmMCwgMHhlNSwKKzB4MzIsIDB4NzUsIDB4ZjAsIDB4ODAsIDB4YTQsIDB4MjQsIDB4MDAsIDB4ZmYsIDB4ZTUsIDB4ZjAsIDB4MzQsIDB4ODAsIDB4ZmUsIDB4ZTUsIDB4MzAsIDB4NjUsCisweDMyLCAweDcwLCAweDA1LCAweGZjLCAweDdkLCAweDE4LCAweDgwLCAweDA0LCAweDdjLCAweDAwLCAweDdkLCAweDAwLCAweGVmLCAweDJkLCAweGZmLCAweGVlLAorMHgzYywgMHhmZSwgMHgxMiwgMHgxOSwgMHgxMCwgMHg1MCwgMHgyNSwgMHg5MCwgMHg3MCwgMHg4MywgMHhlMCwgMHgwNCwgMHhmMCwgMHg5MCwgMHgwMSwgMHgxNCwKKzB4ZTAsIDB4NDQsIDB4MDIsIDB4ZjAsIDB4ZTAsIDB4MzAsIDB4ZTEsIDB4MDYsIDB4OTAsIDB4NzAsIDB4OTIsIDB4NzQsIDB4NDUsIDB4ZjAsIDB4OTAsIDB4NzAsCisweDkzLCAweGUwLCAweDA0LCAweGYwLCAweDkwLCAweDA0LCAweDAxLCAweGUwLCAweDkwLCAweDcwLCAweDk0LCAweGYwLCAweGU1LCAweDMyLCAweDY1LCAweDMxLAorMHg2MCwgMHgxMCwgMHhlNCwgMHgyNSwgMHgzMiwgMHhmZiwgMHhlNCwgMHgzNCwgMHg4MCwgMHg4ZiwgMHg4MiwgMHhmNSwgMHg4MywgMHhlMCwgMHhmNSwgMHgzMiwKKzB4ODAsIDB4OTcsIDB4OTAsIDB4MDQsIDB4MTAsIDB4NzQsIDB4MDEsIDB4ZjAsIDB4OTAsIDB4MDQsIDB4MjgsIDB4ZTUsIDB4MzEsIDB4ZjAsIDB4YTMsIDB4ZTUsCisweDMwLCAweGYwLCAweDkwLCAweDA0LCAweDExLCAweDc0LCAweDAxLCAweGYwLCAweDAyLCAweDE4LCAweDZhLCAweGMyLCAweDA2LCAweGQyLCAweDFhLCAweDIyLAorMHg5MCwgMHg3MCwgMHg4NCwgMHhlNSwgMHgzNywgMHhmMCwgMHhjMywgMHg5NCwgMHgwNiwgMHg1MCwgMHgxOSwgMHg4ZiwgMHg4MiwgMHg4ZSwgMHg4MywgMHhlMCwKKzB4YjQsIDB4ZmYsIDB4MDcsIDB4MDUsIDB4MzcsIDB4ZTQsIDB4ZjUsIDB4MzYsIDB4ODAsIDB4NTksIDB4ZTQsIDB4ZjUsIDB4MzcsIDB4OGYsIDB4ODIsIDB4OGUsCisweDgzLCAweGYwLCAweDgwLCAweDRmLCAweGU1LCAweDM2LCAweDc1LCAweGYwLCAweDA2LCAweDg0LCAweDc0LCAweDA4LCAweDI1LCAweGYwLCAweGY1LCAweDgyLAorMHhlNCwgMHgzNCwgMHgxMCwgMHhmNSwgMHg4MywgMHhlMCwgMHhmZCwgMHg4ZiwgMHg4MiwgMHg4ZSwgMHg4MywgMHhlMCwgMHhmYywgMHg2ZCwgMHg3MCwgMHgzMCwKKzB4OTAsIDB4NzAsIDB4ODgsIDB4ZTAsIDB4MDQsIDB4ZjAsIDB4YTMsIDB4ZTAsIDB4ZmQsIDB4ZDMsIDB4OTUsIDB4MzcsIDB4NDAsIDB4MDIsIDB4ODAsIDB4MDIsCisweGFkLCAweDM3LCAweDkwLCAweDcwLCAweDg5LCAweGVkLCAweGYwLCAweDA1LCAweDM3LCAweDA1LCAweDM2LCAweGU1LCAweDM2LCAweDc1LCAweGYwLCAweDA2LAorMHg4NCwgMHg3NCwgMHg4YSwgMHgyNSwgMHhmMCwgMHhmNSwgMHg4MiwgMHhlNCwgMHgzNCwgMHg3MCwgMHhmNSwgMHg4MywgMHhlYywgMHhmMCwgMHg4MCwgMHgwMywKKzB4ZTQsIDB4ZjUsIDB4MzcsIDB4MGYsIDB4YmYsIDB4MDAsIDB4MDEsIDB4MGUsIDB4ZWYsIDB4NTQsIDB4N2YsIDB4NjAsIDB4MGEsIDB4ZTUsIDB4MzcsIDB4YzMsCisweDk0LCAweDRlLCAweDUwLCAweDAzLCAweDAyLCAweDE5LCAweDEwLCAweGU1LCAweDM3LCAweGI0LCAweDRlLCAweDAzLCAweGQzLCAweDgwLCAweDAxLCAweGMzLAorMHgyMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDBiLCAweDk0LCAweGViLCB9IDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL21kNS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vbWQ1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzc0Nzc2YgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL21kNS5jCkBAIC0wLDAgKzEsMTQyNyBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICBNb2R1bGUgTmFtZToKKyAgICBtZDUuYworCisJQWJzdHJhY3Q6CisKKwlSZXZpc2lvbiBIaXN0b3J5OgorCVdobwkJCVdoZW4JCQlXaGF0CisJLS0tLS0tLS0JLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCU5hbWUJCURhdGUJCQlNb2RpZmljYXRpb24gbG9ncworCWphbgkJCTEwLTI4LTAzCQlJbml0aWFsCisJUml0YSAgICAJMTEtMjMtMDQJCU1vZGlmeSBNRDUgYW5kIFNIQS0xCisJUml0YQkJMTAtMTQtMDUJCU1vZGlmeSBTSEEtMSBpbiBiaWctZW5kaWFuIHBsYXRmb3JtCisgKi8KKyNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKKworLyoqCisgKiBtZDVfbWFjOgorICogQGtleTogcG9pbnRlciB0bwl0aGUJa2V5CXVzZWQgZm9yIE1BQyBnZW5lcmF0aW9uCisgKiBAa2V5X2xlbjogbGVuZ3RoCW9mIHRoZSBrZXkgaW4gYnl0ZXMKKyAqIEBkYXRhOiBwb2ludGVyIHRvIHRoZSBkYXRhIGFyZWEgZm9yIHdoaWNoIHRoZSBNQUMgaXMJZ2VuZXJhdGVkCisgKiBAZGF0YV9sZW46IGxlbmd0aCBvZgl0aGUJZGF0YSBpbglieXRlcworICogQG1hYzogcG9pbnRlciB0bwl0aGUJYnVmZmVyIGhvbGRpbmcgc3BhY2UgZm9yIHRoZSBNQUM7IHRoZSBidWZmZXIgc2hvdWxkCisgKiBoYXZlCXNwYWNlIGZvciAxMjgtYml0ICgxNiBieXRlcykgTUQ1IGhhc2ggdmFsdWUKKyAqCisgKiBtZDVfbWFjKCkgZGV0ZXJtaW5lcwl0aGUJbWVzc2FnZQlhdXRoZW50aWNhdGlvbiBjb2RlCWJ5IHVzaW5nIHNlY3VyZQloYXNoCisgKiBNRDUoa2V5IHwgZGF0YSB8CWtleSkuCisgKi8KK3ZvaWQgbWQ1X21hYyh1OCAqa2V5LCBzaXplX3Qga2V5X2xlbiwgdTggKmRhdGEsIHNpemVfdCBkYXRhX2xlbiwgdTggKm1hYykKK3sKKwlNRDVfQ1RYCWNvbnRleHQ7CisKKwlNRDVJbml0KCZjb250ZXh0KTsKKwlNRDVVcGRhdGUoJmNvbnRleHQsCWtleSwga2V5X2xlbik7CisJTUQ1VXBkYXRlKCZjb250ZXh0LAlkYXRhLCBkYXRhX2xlbik7CisJTUQ1VXBkYXRlKCZjb250ZXh0LAlrZXksIGtleV9sZW4pOworCU1ENUZpbmFsKG1hYywgJmNvbnRleHQpOworfQorCisvKioKKyAqIGhtYWNfbWQ1OgorICogQGtleTogcG9pbnRlciB0bwl0aGUJa2V5CXVzZWQgZm9yIE1BQyBnZW5lcmF0aW9uCisgKiBAa2V5X2xlbjogbGVuZ3RoCW9mIHRoZSBrZXkgaW4gYnl0ZXMKKyAqIEBkYXRhOiBwb2ludGVyIHRvIHRoZSBkYXRhIGFyZWEgZm9yIHdoaWNoIHRoZSBNQUMgaXMJZ2VuZXJhdGVkCisgKiBAZGF0YV9sZW46IGxlbmd0aCBvZgl0aGUJZGF0YSBpbglieXRlcworICogQG1hYzogcG9pbnRlciB0bwl0aGUJYnVmZmVyIGhvbGRpbmcgc3BhY2UgZm9yIHRoZSBNQUM7IHRoZSBidWZmZXIgc2hvdWxkCisgKiBoYXZlCXNwYWNlIGZvciAxMjgtYml0ICgxNiBieXRlcykgTUQ1IGhhc2ggdmFsdWUKKyAqCisgKiBobWFjX21kNSgpIGRldGVybWluZXMgdGhlIG1lc3NhZ2UgYXV0aGVudGljYXRpb24JY29kZSB1c2luZyBITUFDLU1ENS4KKyAqIFRoaXMJaW1wbGVtZW50YXRpb24gaXMgYmFzZWQJb24gdGhlIHNhbXBsZSBjb2RlIHByZXNlbnRlZCBpbglSRkMJMjEwNC4KKyAqLwordm9pZCBobWFjX21kNSh1OCAqa2V5LCBzaXplX3Qga2V5X2xlbiwgdTggKmRhdGEsIHNpemVfdCBkYXRhX2xlbiwgdTggKm1hYykKK3sKKwlNRDVfQ1RYCWNvbnRleHQ7CisgICAgdTgga19pcGFkWzY1XTsgLyogaW5uZXIgcGFkZGluZyAtIGtleSBYT1JkIHdpdGggaXBhZCAqLworICAgIHU4IGtfb3BhZFs2NV07IC8qIG91dGVyIHBhZGRpbmcgLSBrZXkgWE9SZCB3aXRoIG9wYWQgKi8KKyAgICB1OCB0a1sxNl07CisJaW50CWk7CisKKwkvL2Fzc2VydChrZXkgIT0gTlVMTCAmJiBkYXRhICE9IE5VTEwgJiYgbWFjICE9IE5VTEwpOworCisJLyogaWYga2V5IGlzIGxvbmdlcgl0aGFuIDY0CWJ5dGVzIHJlc2V0CWl0IHRvIGtleSA9CU1ENShrZXkpICovCisJaWYgKGtleV9sZW4JPiA2NCkgeworCQlNRDVfQ1RYCXR0Y29udGV4dDsKKworCQlNRDVJbml0KCZ0dGNvbnRleHQpOworCQlNRDVVcGRhdGUoJnR0Y29udGV4dCwga2V5LCBrZXlfbGVuKTsKKwkJTUQ1RmluYWwodGssICZ0dGNvbnRleHQpOworCQkvL2tleT0oUFVDSEFSKXR0Y29udGV4dC5idWY7CisJCWtleQk9IHRrOworCQlrZXlfbGVuCT0gMTY7CisJfQorCisJLyogdGhlIEhNQUNfTUQ1CXRyYW5zZm9ybSBsb29rcwlsaWtlOgorCSAqCisJICogTUQ1KEsgWE9SIG9wYWQsIE1ENShLIFhPUiBpcGFkLCB0ZXh0KSkKKwkgKgorCSAqIHdoZXJlIEsgaXMgYW4gbiBieXRlCWtleQorCSAqIGlwYWQJaXMgdGhlIGJ5dGUJMHgzNiByZXBlYXRlZCA2NCB0aW1lcworCSAqIG9wYWQJaXMgdGhlIGJ5dGUJMHg1YyByZXBlYXRlZCA2NCB0aW1lcworCSAqIGFuZCB0ZXh0CWlzIHRoZSBkYXRhCWJlaW5nIHByb3RlY3RlZAkqLworCisJLyogc3RhcnQgb3V0IGJ5CXN0b3JpbmcJa2V5CWluIHBhZHMJKi8KKwlOZGlzWmVyb01lbW9yeShrX2lwYWQsIHNpemVvZihrX2lwYWQpKTsKKwlOZGlzWmVyb01lbW9yeShrX29wYWQsCXNpemVvZihrX29wYWQpKTsKKwkvL2Fzc2VydChrZXlfbGVuIDwgc2l6ZW9mKGtfaXBhZCkpOworCU5kaXNNb3ZlTWVtb3J5KGtfaXBhZCwga2V5LAlrZXlfbGVuKTsKKwlOZGlzTW92ZU1lbW9yeShrX29wYWQsIGtleSwJa2V5X2xlbik7CisKKwkvKiBYT1Iga2V5IHdpdGgJaXBhZCBhbmQgb3BhZCB2YWx1ZXMgKi8KKwlmb3IJKGkgPSAwOwlpIDwJNjQ7CWkrKykgeworCQlrX2lwYWRbaV0gXj0gMHgzNjsKKwkJa19vcGFkW2ldIF49IDB4NWM7CisJfQorCisJLyogcGVyZm9ybSBpbm5lciBNRDUgKi8KKwlNRDVJbml0KCZjb250ZXh0KTsJCQkJCSAvKglpbml0IGNvbnRleHQgZm9yIDFzdCBwYXNzICovCisJTUQ1VXBkYXRlKCZjb250ZXh0LAlrX2lwYWQsCTY0KTsJIC8qCXN0YXJ0IHdpdGggaW5uZXIgcGFkICovCisJTUQ1VXBkYXRlKCZjb250ZXh0LAlkYXRhLCBkYXRhX2xlbik7IC8qCXRoZW4gdGV4dCBvZiBkYXRhZ3JhbSAqLworCU1ENUZpbmFsKG1hYywgJmNvbnRleHQpOwkJCSAvKglmaW5pc2ggdXAgMXN0IHBhc3MgKi8KKworCS8qIHBlcmZvcm0gb3V0ZXIgTUQ1ICovCisJTUQ1SW5pdCgmY29udGV4dCk7CQkJCQkgLyoJaW5pdCBjb250ZXh0IGZvciAybmQgcGFzcyAqLworCU1ENVVwZGF0ZSgmY29udGV4dCwJa19vcGFkLAk2NCk7CSAvKglzdGFydCB3aXRoIG91dGVyIHBhZCAqLworCU1ENVVwZGF0ZSgmY29udGV4dCwJbWFjLCAxNik7CQkgLyoJdGhlbiByZXN1bHRzIG9mCTFzdAloYXNoICovCisJTUQ1RmluYWwobWFjLCAmY29udGV4dCk7CQkJIC8qCWZpbmlzaCB1cCAybmQgcGFzcyAqLworfQorCisjaWZuZGVmIFJUX0JJR19FTkRJQU4KKyNkZWZpbmUgYnl0ZVJldmVyc2UoYnVmLCBsZW4pICAgLyogTm90aGluZyAqLworI2Vsc2UKK3ZvaWQgYnl0ZVJldmVyc2UodW5zaWduZWQgY2hhciAqYnVmLCB1bnNpZ25lZCBsb25ncyk7Cit2b2lkIGJ5dGVSZXZlcnNlKHVuc2lnbmVkIGNoYXIgKmJ1ZiwgdW5zaWduZWQgbG9uZ3MpCit7CisgICAgZG8geworICAgICAgICAqKFVJTlQzMiAqKWJ1ZiA9IFNXQVAzMigqKFVJTlQzMiAqKWJ1Zik7CisgICAgICAgIGJ1ZiArPSA0OworICAgIH0gd2hpbGUgKC0tbG9uZ3MpOworfQorI2VuZGlmCisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT0gIE1ENSBpbXBsZW1lbnRhdGlvbiA9PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8vIGZvdXIgYmFzZSBmdW5jdGlvbnMgZm9yIE1ENQorI2RlZmluZSBNRDVfRjEoeCwgeSwgeikgKCgoeCkgJiAoeSkpIHwgKCh+eCkgJiAoeikpKQorI2RlZmluZSBNRDVfRjIoeCwgeSwgeikgKCgoeCkgJiAoeikpIHwgKCh5KSAmICh+eikpKQorI2RlZmluZSBNRDVfRjMoeCwgeSwgeikgKCh4KSBeICh5KSBeICh6KSkKKyNkZWZpbmUgTUQ1X0Y0KHgsIHksIHopICgoeSkgXiAoKHgpIHwgKH56KSkpCisjZGVmaW5lIENZQ0xJQ19MRUZUX1NISUZUKHcsIHMpICgoKHcpIDw8IChzKSkgfCAoKHcpID4+ICgzMi0ocykpKSkKKworI2RlZmluZQlNRDVTdGVwKGYsIHcsIHgsIHksCXosIGRhdGEsIHQsIHMpCVwKKwkoIHcJKz0gZih4LAl5LCB6KSArCWRhdGEgKyB0LCAgdyA9IChDWUNMSUNfTEVGVF9TSElGVCh3LCBzKSkgJiAweGZmZmZmZmZmLCB3ICs9CXggKQorCisKKy8qCisgKiAgRnVuY3Rpb24gRGVzY3JpcHRpb246CisgKiAgICAgIEluaXRpYXRlIE1ENSBDb250ZXh0IHNhdGlzZmllZCBpbiBSRkMgMTMyMQorICoKKyAqICBBcmd1bWVudHM6CisgKiAgICAgIHBDdHggICAgICAgIFBvaW50ZXIJdG8gTUQ1IGNvbnRleHQKKyAqCisgKiAgUmV0dXJuIFZhbHVlOgorICogICAgICBOb25lCisgKi8KK1ZPSUQgTUQ1SW5pdChNRDVfQ1RYICpwQ3R4KQoreworICAgIHBDdHgtPkJ1ZlswXT0weDY3NDUyMzAxOworICAgIHBDdHgtPkJ1ZlsxXT0weGVmY2RhYjg5OworICAgIHBDdHgtPkJ1ZlsyXT0weDk4YmFkY2ZlOworICAgIHBDdHgtPkJ1ZlszXT0weDEwMzI1NDc2OworCisgICAgcEN0eC0+TGVuSW5CaXRDb3VudFswXT0wOworICAgIHBDdHgtPkxlbkluQml0Q291bnRbMV09MDsKK30KKworCisvKgorICogIEZ1bmN0aW9uIERlc2NyaXB0aW9uOgorICogICAgICBVcGRhdGUgTUQ1IENvbnRleHQsIGFsbG93IG9mIGFuIGFycmFyeSBvZiBvY3RldHMgYXMgdGhlIG5leHQgcG9ydGlvbgorICogICAgICBvZiB0aGUgbWVzc2FnZQorICoKKyAqICBBcmd1bWVudHM6CisgKiAgICAgIHBDdHgJCVBvaW50ZXIJdG8gTUQ1IGNvbnRleHQKKyAqIAkgICAgcERhdGEgICAgICAgUG9pbnRlciB0byBpbnB1dCBkYXRhCisgKiAgICAgIExlbkluQnl0ZXMgIFRoZSBsZW5ndGggb2YgaW5wdXQgZGF0YSAodW5pdDogYnl0ZSkKKyAqCisgKiAgUmV0dXJuIFZhbHVlOgorICogICAgICBOb25lCisgKgorICogIE5vdGU6CisgKiAgICAgIENhbGxlZCBhZnRlciBNRDVJbml0IG9yIE1ENVVwZGF0ZShpdHNlbGYpCisgKi8KK1ZPSUQgTUQ1VXBkYXRlKE1ENV9DVFggKnBDdHgsIFVDSEFSICpwRGF0YSwgVUlOVDMyIExlbkluQnl0ZXMpCit7CisKKyAgICBVSU5UMzIgVGZUaW1lczsKKyAgICBVSU5UMzIgdGVtcDsKKwl1bnNpZ25lZCBpbnQgaTsKKworICAgIHRlbXAgPSBwQ3R4LT5MZW5JbkJpdENvdW50WzBdOworCisgICAgcEN0eC0+TGVuSW5CaXRDb3VudFswXSA9IChVSU5UMzIpIChwQ3R4LT5MZW5JbkJpdENvdW50WzBdICsgKExlbkluQnl0ZXMgPDwgMykpOworCisgICAgaWYgKHBDdHgtPkxlbkluQml0Q291bnRbMF0gPCB0ZW1wKQorICAgICAgICBwQ3R4LT5MZW5JbkJpdENvdW50WzFdKys7ICAgLy9jYXJyeSBpbgorCisgICAgcEN0eC0+TGVuSW5CaXRDb3VudFsxXSArPSBMZW5JbkJ5dGVzID4+IDI5OworCisgICAgLy8gbW9kIDY0IGJ5dGVzCisgICAgdGVtcCA9ICh0ZW1wID4+IDMpICYgMHgzZjsKKworICAgIC8vIHByb2Nlc3MgbGFja3Mgb2YgNjQtYnl0ZSBkYXRhCisgICAgaWYgKHRlbXApCisgICAgeworICAgICAgICBVQ0hBUiAqcEFkcyA9IChVQ0hBUiAqKSBwQ3R4LT5JbnB1dCArIHRlbXA7CisKKyAgICAgICAgaWYgKCh0ZW1wK0xlbkluQnl0ZXMpIDwgNjQpCisgICAgICAgIHsKKyAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZHMsIChVQ0hBUiAqKXBEYXRhLCBMZW5JbkJ5dGVzKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZHMsIChVQ0hBUiAqKXBEYXRhLCA2NC10ZW1wKTsKKyAgICAgICAgYnl0ZVJldmVyc2UocEN0eC0+SW5wdXQsIDE2KTsKKyAgICAgICAgTUQ1VHJhbnNmb3JtKHBDdHgtPkJ1ZiwgKFVJTlQzMiAqKXBDdHgtPklucHV0KTsKKworICAgICAgICBwRGF0YSArPSA2NC10ZW1wOworICAgICAgICBMZW5JbkJ5dGVzIC09IDY0LXRlbXA7CisgICAgfSAvLyBlbmQgb2YgaWYgKHRlbXApCisKKworICAgIFRmVGltZXMgPSAoTGVuSW5CeXRlcyA+PiA2KTsKKworICAgIGZvciAoaT1UZlRpbWVzOyBpPjA7IGktLSkKKyAgICB7CisgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBDdHgtPklucHV0LCAoVUNIQVIgKilwRGF0YSwgNjQpOworICAgICAgICBieXRlUmV2ZXJzZShwQ3R4LT5JbnB1dCwgMTYpOworICAgICAgICBNRDVUcmFuc2Zvcm0ocEN0eC0+QnVmLCAoVUlOVDMyICopcEN0eC0+SW5wdXQpOworICAgICAgICBwRGF0YSArPSA2NDsKKyAgICAgICAgTGVuSW5CeXRlcyAtPSA2NDsKKyAgICB9IC8vIGVuZCBvZiBmb3IKKworICAgIC8vIGJ1ZmZlcmluZyBsYWNrcyBvZiA2NC1ieXRlIGRhdGEKKyAgICBpZihMZW5JbkJ5dGVzKQorICAgICAgICBOZGlzTW92ZU1lbW9yeShwQ3R4LT5JbnB1dCwgKFVDSEFSICopcERhdGEsIExlbkluQnl0ZXMpOworCit9CisKKworLyoKKyAqICBGdW5jdGlvbiBEZXNjcmlwdGlvbjoKKyAqICAgICAgQXBwZW5kIHBhZGRpbmcgYml0cyBhbmQgbGVuZ3RoIG9mIG9yaWdpbmFsIG1lc3NhZ2UgaW4gdGhlIHRhaWwKKyAqICAgICAgVGhlIG1lc3NhZ2UgZGlnZXN0IGhhcyB0byBiZSBjb21wbGV0ZWQgaW4gdGhlIGVuZAorICoKKyAqICBBcmd1bWVudHM6CisgKiAgICAgIERpZ2VzdAkJT3V0cHV0IG9mIERpZ2VzdC1NZXNzYWdlIGZvciBNRDUKKyAqICAJcEN0eCAgICAgICAgUG9pbnRlcgl0byBNRDUgY29udGV4dAorICoKKyAqICBSZXR1cm4gVmFsdWU6CisgKiAgICAgIE5vbmUKKyAqCisgKiAgTm90ZToKKyAqICAgICAgQ2FsbGVkIGFmdGVyIE1ENVVwZGF0ZQorICovCitWT0lEIE1ENUZpbmFsKFVDSEFSIERpZ2VzdFsxNl0sIE1ENV9DVFggKnBDdHgpCit7CisgICAgVUNIQVIgUmVtYWluZGVyOworICAgIFVDSEFSIFBhZExlbkluQnl0ZXM7CisgICAgVUNIQVIgKnBBcHBlbmQ9MDsKKyAgICB1bnNpZ25lZCBpbnQgaTsKKworICAgIFJlbWFpbmRlciA9IChVQ0hBUikoKHBDdHgtPkxlbkluQml0Q291bnRbMF0gPj4gMykgJiAweDNmKTsKKworICAgIFBhZExlbkluQnl0ZXMgPSAoUmVtYWluZGVyIDwgNTYpID8gKDU2LVJlbWFpbmRlcikgOiAoMTIwLVJlbWFpbmRlcik7CisKKyAgICBwQXBwZW5kID0gKFVDSEFSICopcEN0eC0+SW5wdXQgKyBSZW1haW5kZXI7CisKKyAgICAvLyBwYWRkaW5nIGJpdHMgd2l0aG91dCBjcm9zc2luZyBibG9jayg2NC1ieXRlIGJhc2VkKSBib3VuZGFyeQorICAgIGlmIChSZW1haW5kZXIgPCA1NikKKyAgICB7CisgICAgICAgICpwQXBwZW5kID0gMHg4MDsKKyAgICAgICAgUGFkTGVuSW5CeXRlcyAtLTsKKworICAgICAgICBOZGlzWmVyb01lbW9yeSgoVUNIQVIgKilwQ3R4LT5JbnB1dCArIFJlbWFpbmRlcisxLCBQYWRMZW5JbkJ5dGVzKTsKKworCQkvLyBhZGQgZGF0YS1sZW5ndGggZmllbGQsIGZyb20gbG93IHRvIGhpZ2gKKyAgICAgICAJZm9yIChpPTA7IGk8NDsgaSsrKQorICAgICAgICB7CisgICAgICAgIAlwQ3R4LT5JbnB1dFs1NitpXSA9IChVQ0hBUikoKHBDdHgtPkxlbkluQml0Q291bnRbMF0gPj4gKGkgPDwgMykpICYgMHhmZik7CisgICAgICAgIAlwQ3R4LT5JbnB1dFs2MCtpXSA9IChVQ0hBUikoKHBDdHgtPkxlbkluQml0Q291bnRbMV0gPj4gKGkgPDwgMykpICYgMHhmZik7CisgICAgICAJfQorCisgICAgICAgIGJ5dGVSZXZlcnNlKHBDdHgtPklucHV0LCAxNik7CisgICAgICAgIE1ENVRyYW5zZm9ybShwQ3R4LT5CdWYsIChVSU5UMzIgKilwQ3R4LT5JbnB1dCk7CisgICAgfSAvLyBlbmQgb2YgaWYKKworICAgIC8vIHBhZGRpbmcgYml0cyB3aXRoIGNyb3NzaW5nIGJsb2NrKDY0LWJ5dGUgYmFzZWQpIGJvdW5kYXJ5CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLy8gdGhlIGZpcnN0IGJsb2NrID09PQorICAgICAgICAqcEFwcGVuZCA9IDB4ODA7CisgICAgICAgIFBhZExlbkluQnl0ZXMgLS07CisKKyAgICAgICAgTmRpc1plcm9NZW1vcnkoKFVDSEFSICopcEN0eC0+SW5wdXQgKyBSZW1haW5kZXIrMSwgKDY0LVJlbWFpbmRlci0xKSk7CisgICAgICAgIFBhZExlbkluQnl0ZXMgLT0gKDY0IC0gUmVtYWluZGVyIC0gMSk7CisKKyAgICAgICAgYnl0ZVJldmVyc2UocEN0eC0+SW5wdXQsIDE2KTsKKyAgICAgICAgTUQ1VHJhbnNmb3JtKHBDdHgtPkJ1ZiwgKFVJTlQzMiAqKXBDdHgtPklucHV0KTsKKworCisgICAgICAgIC8vIHRoZSBzZWNvbmQgYmxvY2sgPT09CisgICAgICAgIE5kaXNaZXJvTWVtb3J5KChVQ0hBUiAqKXBDdHgtPklucHV0LCBQYWRMZW5JbkJ5dGVzKTsKKworICAgICAgICAvLyBhZGQgZGF0YS1sZW5ndGggZmllbGQKKyAgICAgICAgZm9yIChpPTA7IGk8NDsgaSsrKQorICAgICAgICB7CisgICAgICAgIAlwQ3R4LT5JbnB1dFs1NitpXSA9IChVQ0hBUikoKHBDdHgtPkxlbkluQml0Q291bnRbMF0gPj4gKGkgPDwgMykpICYgMHhmZik7CisgICAgICAgIAlwQ3R4LT5JbnB1dFs2MCtpXSA9IChVQ0hBUikoKHBDdHgtPkxlbkluQml0Q291bnRbMV0gPj4gKGkgPDwgMykpICYgMHhmZik7CisgICAgICAJfQorCisgICAgICAgIGJ5dGVSZXZlcnNlKHBDdHgtPklucHV0LCAxNik7CisgICAgICAgIE1ENVRyYW5zZm9ybShwQ3R4LT5CdWYsIChVSU5UMzIgKilwQ3R4LT5JbnB1dCk7CisgICAgfSAvLyBlbmQgb2YgZWxzZQorCisKKyAgICBOZGlzTW92ZU1lbW9yeSgoVUNIQVIgKilEaWdlc3QsIChVSU5UMzIgKilwQ3R4LT5CdWYsIDE2KTsgLy8gb3V0cHV0CisgICAgYnl0ZVJldmVyc2UoKFVDSEFSICopRGlnZXN0LCA0KTsKKyAgICBOZGlzWmVyb01lbW9yeShwQ3R4LCBzaXplb2YocEN0eCkpOyAvLyBtZW1vcnkgZnJlZQorfQorCisKKy8qCisgKiAgRnVuY3Rpb24gRGVzY3JpcHRpb246CisgKiAgICAgIFRoZSBjZW50cmFsIGFsZ29yaXRobSBvZiBNRDUsIGNvbnNpc3RzIG9mIGZvdXIgcm91bmRzIGFuZCBzaXh0ZWVuCisgKiAgCXN0ZXBzIHBlciByb3VuZAorICoKKyAqICBBcmd1bWVudHM6CisgKiAgICAgIEJ1ZiAgICAgQnVmZmVycyBvZiBmb3VyIHN0YXRlcyAob3V0cHV0OiAxNiBieXRlcykKKyAqIAkgICAgTWVzICAgICBJbnB1dCBkYXRhIChpbnB1dDogNjQgYnl0ZXMpCisgKgorICogIFJldHVybiBWYWx1ZToKKyAqICAgICAgTm9uZQorICoKKyAqICBOb3RlOgorICogICAgICBDYWxsZWQgYnkgTUQ1VXBkYXRlIG9yIE1ENUZpbmFsCisgKi8KK1ZPSUQgTUQ1VHJhbnNmb3JtKFVJTlQzMiBCdWZbNF0sIFVJTlQzMiBNZXNbMTZdKQoreworICAgIFVJTlQzMiBSZWdbNF0sIFRlbXA7CisJdW5zaWduZWQgaW50IGk7CisKKyAgICBzdGF0aWMgVUNIQVIgTFNoaWZ0VmFsWzE2XSA9CisgICAgeworICAgICAgICA3LCAxMiwgMTcsIDIyLAorCQk1LCA5ICwgMTQsIDIwLAorCQk0LCAxMSwgMTYsIDIzLAorIAkJNiwgMTAsIDE1LCAyMSwKKyAJfTsKKworCisJLy8gW2VxdWFsIHRvIDQyOTQ5NjcyOTYqYWJzKHNpbihpbmRleCkpXQorICAgIHN0YXRpYyBVSU5UMzIgTUQ1VGFibGVbNjRdID0KKwl7CisJCTB4ZDc2YWE0NzgsCTB4ZThjN2I3NTYsCTB4MjQyMDcwZGIsCTB4YzFiZGNlZWUsCisJCTB4ZjU3YzBmYWYsCTB4NDc4N2M2MmEsCTB4YTgzMDQ2MTMsIDB4ZmQ0Njk1MDEsCisJCTB4Njk4MDk4ZDgsCTB4OGI0NGY3YWYsCTB4ZmZmZjViYjEsCTB4ODk1Y2Q3YmUsCisgICAgCTB4NmI5MDExMjIsCTB4ZmQ5ODcxOTMsCTB4YTY3OTQzOGUsCTB4NDliNDA4MjEsCisKKyAgICAJMHhmNjFlMjU2MiwJMHhjMDQwYjM0MCwJMHgyNjVlNWE1MSwJMHhlOWI2YzdhYSwKKyAgICAJMHhkNjJmMTA1ZCwJMHgwMjQ0MTQ1MywJMHhkOGExZTY4MSwJMHhlN2QzZmJjOCwKKyAgICAJMHgyMWUxY2RlNiwJMHhjMzM3MDdkNiwJMHhmNGQ1MGQ4NywJMHg0NTVhMTRlZCwKKyAgICAJMHhhOWUzZTkwNSwJMHhmY2VmYTNmOCwJMHg2NzZmMDJkOSwJMHg4ZDJhNGM4YSwKKworICAgIAkweGZmZmEzOTQyLAkweDg3NzFmNjgxLAkweDZkOWQ2MTIyLAkweGZkZTUzODBjLAorICAgIAkweGE0YmVlYTQ0LAkweDRiZGVjZmE5LAkweGY2YmI0YjYwLAkweGJlYmZiYzcwLAorICAgIAkweDI4OWI3ZWM2LAkweGVhYTEyN2ZhLAkweGQ0ZWYzMDg1LAkweDA0ODgxZDA1LAorICAgIAkweGQ5ZDRkMDM5LAkweGU2ZGI5OWU1LAkweDFmYTI3Y2Y4LAkweGM0YWM1NjY1LAorCisgICAgCTB4ZjQyOTIyNDQsCTB4NDMyYWZmOTcsCTB4YWI5NDIzYTcsCTB4ZmM5M2EwMzksCisgICAJCTB4NjU1YjU5YzMsCTB4OGYwY2NjOTIsCTB4ZmZlZmY0N2QsCTB4ODU4NDVkZDEsCisgICAgCTB4NmZhODdlNGYsCTB4ZmUyY2U2ZTAsCTB4YTMwMTQzMTQsCTB4NGUwODExYTEsCisgICAgCTB4Zjc1MzdlODIsCTB4YmQzYWYyMzUsCTB4MmFkN2QyYmIsCTB4ZWI4NmQzOTEKKwl9OworCisKKyAgICBmb3IgKGk9MDsgaTw0OyBpKyspCisgICAgICAgIFJlZ1tpXT1CdWZbaV07CisKKworICAgIC8vIDY0IHN0ZXBzIGluIE1ENSBhbGdvcml0aG0KKyAgICBmb3IgKGk9MDsgaTwxNjsgaSsrKQorICAgIHsKKyAgICAgICAgTUQ1U3RlcChNRDVfRjEsIFJlZ1swXSwgUmVnWzFdLCBSZWdbMl0sIFJlZ1szXSwgTWVzW2ldLAorICAgICAgICAgICAgICAgIE1ENVRhYmxlW2ldLCBMU2hpZnRWYWxbaSAmIDB4M10pOworCisgICAgICAgIC8vIG9uZS13b3JkIHJpZ2h0IHNoaWZ0CisgICAgICAgIFRlbXAgICA9IFJlZ1szXTsKKyAgICAgICAgUmVnWzNdID0gUmVnWzJdOworICAgICAgICBSZWdbMl0gPSBSZWdbMV07CisgICAgICAgIFJlZ1sxXSA9IFJlZ1swXTsKKyAgICAgICAgUmVnWzBdID0gVGVtcDsKKyAgICB9CisgICAgZm9yIChpPTE2OyBpPDMyOyBpKyspCisgICAgeworICAgICAgICBNRDVTdGVwKE1ENV9GMiwgUmVnWzBdLCBSZWdbMV0sIFJlZ1syXSwgUmVnWzNdLCBNZXNbKDUqKGkgJiAweGYpKzEpICYgMHhmXSwKKyAgICAgICAgICAgICAgICBNRDVUYWJsZVtpXSwgTFNoaWZ0VmFsWygweDEgPDwgMikrKGkgJiAweDMpXSk7CisKKyAgICAgICAgLy8gb25lLXdvcmQgcmlnaHQgc2hpZnQKKyAgICAgICAgVGVtcCAgID0gUmVnWzNdOworICAgICAgICBSZWdbM10gPSBSZWdbMl07CisgICAgICAgIFJlZ1syXSA9IFJlZ1sxXTsKKyAgICAgICAgUmVnWzFdID0gUmVnWzBdOworICAgICAgICBSZWdbMF0gPSBUZW1wOworICAgIH0KKyAgICBmb3IgKGk9MzI7IGk8NDg7IGkrKykKKyAgICB7CisgICAgICAgIE1ENVN0ZXAoTUQ1X0YzLCBSZWdbMF0sIFJlZ1sxXSwgUmVnWzJdLCBSZWdbM10sIE1lc1soMyooaSAmIDB4ZikrNSkgJiAweGZdLAorICAgICAgICAgICAgICAgIE1ENVRhYmxlW2ldLCBMU2hpZnRWYWxbKDB4MSA8PCAzKSsoaSAmIDB4MyldKTsKKworICAgICAgICAvLyBvbmUtd29yZCByaWdodCBzaGlmdAorICAgICAgICBUZW1wICAgPSBSZWdbM107CisgICAgICAgIFJlZ1szXSA9IFJlZ1syXTsKKyAgICAgICAgUmVnWzJdID0gUmVnWzFdOworICAgICAgICBSZWdbMV0gPSBSZWdbMF07CisgICAgICAgIFJlZ1swXSA9IFRlbXA7CisgICAgfQorICAgIGZvciAoaT00ODsgaTw2NDsgaSsrKQorICAgIHsKKyAgICAgICAgTUQ1U3RlcChNRDVfRjQsIFJlZ1swXSwgUmVnWzFdLCBSZWdbMl0sIFJlZ1szXSwgTWVzWyg3KihpICYgMHhmKSkgJiAweGZdLAorICAgICAgICAgICAgICAgIE1ENVRhYmxlW2ldLCBMU2hpZnRWYWxbKDB4MyA8PCAyKSsoaSAmIDB4MyldKTsKKworICAgICAgICAvLyBvbmUtd29yZCByaWdodCBzaGlmdAorICAgICAgICBUZW1wICAgPSBSZWdbM107CisgICAgICAgIFJlZ1szXSA9IFJlZ1syXTsKKyAgICAgICAgUmVnWzJdID0gUmVnWzFdOworICAgICAgICBSZWdbMV0gPSBSZWdbMF07CisgICAgICAgIFJlZ1swXSA9IFRlbXA7CisgICAgfQorCisKKyAgICAvLyAodGVtcG9yYXJ5KW91dHB1dAorICAgIGZvciAoaT0wOyBpPDQ7IGkrKykKKyAgICAgICAgQnVmW2ldICs9IFJlZ1tpXTsKKworfQorCisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PSAgU0hBLTEgaW1wbGVtZW50YXRpb24gPT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8vIGZvdXIgYmFzZSBmdW5jdGlvbnMgZm9yIFNIQS0xCisjZGVmaW5lIFNIQTFfRjEoYiwgYywgZCkgICAgKCgoYikgJiAoYykpIHwgKCh+YikgJiAoZCkpKQorI2RlZmluZSBTSEExX0YyKGIsIGMsIGQpICAgICgoYikgXiAoYykgXiAoZCkpCisjZGVmaW5lIFNIQTFfRjMoYiwgYywgZCkgICAgKCgoYikgJiAoYykpIHwgKChiKSAmIChkKSkgfCAoKGMpICYgKGQpKSkKKworCisjZGVmaW5lIFNIQTFTdGVwKGYsIGEsIGIsIGMsIGQsIGUsIHcsIGspICAgIFwKKyAgICAoIGUJKz0gKCBmKGIsIGMsIGQpICsgdyArIGsgKyBDWUNMSUNfTEVGVF9TSElGVChhLCA1KSkgJiAweGZmZmZmZmZmLCBcCisgICAgICBiID0gQ1lDTElDX0xFRlRfU0hJRlQoYiwgMzApICkKKworLy9Jbml0aWF0ZSBTSEEtMSBDb250ZXh0IHNhdGlzZmllZCBpbiBSRkMgMzE3NAorVk9JRCBTSEFJbml0KFNIQV9DVFggKnBDdHgpCit7CisgICAgcEN0eC0+QnVmWzBdPTB4Njc0NTIzMDE7CisgICAgcEN0eC0+QnVmWzFdPTB4ZWZjZGFiODk7CisgICAgcEN0eC0+QnVmWzJdPTB4OThiYWRjZmU7CisgICAgcEN0eC0+QnVmWzNdPTB4MTAzMjU0NzY7CisgICAgcEN0eC0+QnVmWzRdPTB4YzNkMmUxZjA7CisKKyAgICBwQ3R4LT5MZW5JbkJpdENvdW50WzBdPTA7CisgICAgcEN0eC0+TGVuSW5CaXRDb3VudFsxXT0wOworfQorCisvKgorICogIEZ1bmN0aW9uIERlc2NyaXB0aW9uOgorICogICAgICBVcGRhdGUgU0hBLTEgQ29udGV4dCwgYWxsb3cgb2YgYW4gYXJyYXJ5IG9mIG9jdGV0cyBhcyB0aGUgbmV4dAorICogICAgICBwb3J0aW9uIG9mIHRoZSBtZXNzYWdlCisgKgorICogIEFyZ3VtZW50czoKKyAqICAgICAgcEN0eAkJUG9pbnRlcgl0byBTSEEtMSBjb250ZXh0CisgKiAJICAgIHBEYXRhICAgICAgIFBvaW50ZXIgdG8gaW5wdXQgZGF0YQorICogICAgICBMZW5JbkJ5dGVzICBUaGUgbGVuZ3RoIG9mIGlucHV0IGRhdGEgKHVuaXQ6IGJ5dGUpCisgKgorICogIFJldHVybiBWYWx1ZToKKyAqICAgICAgZXJyb3IgICAgICAgaW5kaWNhdGUgbW9yZSB0aGFuIHBvdygyLDY0KSBiaXRzIG9mIGRhdGEKKyAqCisgKiAgTm90ZToKKyAqICAgICAgQ2FsbGVkIGFmdGVyIFNIQUluaXQgb3IgU0hBVXBkYXRlKGl0c2VsZikKKyAqLworVUNIQVIgU0hBVXBkYXRlKFNIQV9DVFggKnBDdHgsIFVDSEFSICpwRGF0YSwgVUlOVDMyIExlbkluQnl0ZXMpCit7CisgICAgVUlOVDMyIFRmVGltZXM7CisgICAgVUlOVDMyIHRlbXAxLHRlbXAyOworCXVuc2lnbmVkIGludCBpOworCVVDSEFSIGVycj0xOworCisgICAgdGVtcDEgPSBwQ3R4LT5MZW5JbkJpdENvdW50WzBdOworICAgIHRlbXAyID0gcEN0eC0+TGVuSW5CaXRDb3VudFsxXTsKKworICAgIHBDdHgtPkxlbkluQml0Q291bnRbMF0gPSAoVUlOVDMyKSAocEN0eC0+TGVuSW5CaXRDb3VudFswXSArIChMZW5JbkJ5dGVzIDw8IDMpKTsKKyAgICBpZiAocEN0eC0+TGVuSW5CaXRDb3VudFswXSA8IHRlbXAxKQorICAgICAgICBwQ3R4LT5MZW5JbkJpdENvdW50WzFdKys7ICAgLy9jYXJyeSBpbgorCisKKyAgICBwQ3R4LT5MZW5JbkJpdENvdW50WzFdID0gKFVJTlQzMikgKHBDdHgtPkxlbkluQml0Q291bnRbMV0gKyhMZW5JbkJ5dGVzID4+IDI5KSk7CisgICAgaWYgKHBDdHgtPkxlbkluQml0Q291bnRbMV0gPCB0ZW1wMikKKyAgICAgICAgcmV0dXJuIChlcnIpOyAgIC8vY2hlY2sgdG90YWwgbGVuZ3RoIG9mIG9yaWdpbmFsIGRhdGEKKworCisgICAgLy8gbW9kIDY0IGJ5dGVzCisgICAgdGVtcDEgPSAodGVtcDEgPj4gMykgJiAweDNmOworCisgICAgLy8gcHJvY2VzcyBsYWNrcyBvZiA2NC1ieXRlIGRhdGEKKyAgICBpZiAodGVtcDEpCisgICAgeworICAgICAgICBVQ0hBUiAqcEFkcyA9IChVQ0hBUiAqKSBwQ3R4LT5JbnB1dCArIHRlbXAxOworCisgICAgICAgIGlmICgodGVtcDErTGVuSW5CeXRlcykgPCA2NCkKKyAgICAgICAgeworICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkcywgKFVDSEFSICopcERhdGEsIExlbkluQnl0ZXMpOworICAgICAgICAgICAgcmV0dXJuICgwKTsKKyAgICAgICAgfQorCisgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZHMsIChVQ0hBUiAqKXBEYXRhLCA2NC10ZW1wMSk7CisgICAgICAgIGJ5dGVSZXZlcnNlKChVQ0hBUiAqKXBDdHgtPklucHV0LCAxNik7CisKKyAgICAgICAgTmRpc1plcm9NZW1vcnkoKFVDSEFSICopcEN0eC0+SW5wdXQgKyA2NCwgMTYpOworICAgICAgICBTSEFUcmFuc2Zvcm0ocEN0eC0+QnVmLCAoVUlOVDMyICopcEN0eC0+SW5wdXQpOworCisgICAgICAgIHBEYXRhICs9IDY0LXRlbXAxOworICAgICAgICBMZW5JbkJ5dGVzIC09IDY0LXRlbXAxOworICAgIH0gLy8gZW5kIG9mIGlmICh0ZW1wMSkKKworCisgICAgVGZUaW1lcyA9IChMZW5JbkJ5dGVzID4+IDYpOworCisgICAgZm9yIChpPVRmVGltZXM7IGk+MDsgaS0tKQorICAgIHsKKyAgICAgICAgTmRpc01vdmVNZW1vcnkocEN0eC0+SW5wdXQsIChVQ0hBUiAqKXBEYXRhLCA2NCk7CisgICAgICAgIGJ5dGVSZXZlcnNlKChVQ0hBUiAqKXBDdHgtPklucHV0LCAxNik7CisKKyAgICAgICAgTmRpc1plcm9NZW1vcnkoKFVDSEFSICopcEN0eC0+SW5wdXQgKyA2NCwgMTYpOworICAgICAgICBTSEFUcmFuc2Zvcm0ocEN0eC0+QnVmLCAoVUlOVDMyICopcEN0eC0+SW5wdXQpOworICAgICAgICBwRGF0YSArPSA2NDsKKyAgICAgICAgTGVuSW5CeXRlcyAtPSA2NDsKKyAgICB9IC8vIGVuZCBvZiBmb3IKKworICAgIC8vIGJ1ZmZlcmluZyBsYWNrcyBvZiA2NC1ieXRlIGRhdGEKKyAgICBpZihMZW5JbkJ5dGVzKQorICAgICAgICBOZGlzTW92ZU1lbW9yeShwQ3R4LT5JbnB1dCwgKFVDSEFSICopcERhdGEsIExlbkluQnl0ZXMpOworCisJcmV0dXJuICgwKTsKKworfQorCisvLyBBcHBlbmQgcGFkZGluZyBiaXRzIGFuZCBsZW5ndGggb2Ygb3JpZ2luYWwgbWVzc2FnZSBpbiB0aGUgdGFpbAorLy8gVGhlIG1lc3NhZ2UgZGlnZXN0IGhhcyB0byBiZSBjb21wbGV0ZWQgaW4gdGhlIGVuZAorVk9JRCBTSEFGaW5hbChTSEFfQ1RYICpwQ3R4LCBVQ0hBUiBEaWdlc3RbMjBdKQoreworICAgIFVDSEFSIFJlbWFpbmRlcjsKKyAgICBVQ0hBUiBQYWRMZW5JbkJ5dGVzOworICAgIFVDSEFSICpwQXBwZW5kPTA7CisgICAgdW5zaWduZWQgaW50IGk7CisKKyAgICBSZW1haW5kZXIgPSAoVUNIQVIpKChwQ3R4LT5MZW5JbkJpdENvdW50WzBdID4+IDMpICYgMHgzZik7CisKKyAgICBwQXBwZW5kID0gKFVDSEFSICopcEN0eC0+SW5wdXQgKyBSZW1haW5kZXI7CisKKyAgICBQYWRMZW5JbkJ5dGVzID0gKFJlbWFpbmRlciA8IDU2KSA/ICg1Ni1SZW1haW5kZXIpIDogKDEyMC1SZW1haW5kZXIpOworCisgICAgLy8gcGFkZGluZyBiaXRzIHdpdGhvdXQgY3Jvc3NpbmcgYmxvY2soNjQtYnl0ZSBiYXNlZCkgYm91bmRhcnkKKyAgICBpZiAoUmVtYWluZGVyIDwgNTYpCisgICAgeworICAgICAgICAqcEFwcGVuZCA9IDB4ODA7CisgICAgICAgIFBhZExlbkluQnl0ZXMgLS07CisKKyAgICAgICAgTmRpc1plcm9NZW1vcnkoKFVDSEFSICopcEN0eC0+SW5wdXQgKyBSZW1haW5kZXIrMSwgUGFkTGVuSW5CeXRlcyk7CisKKwkJLy8gYWRkIGRhdGEtbGVuZ3RoIGZpZWxkLCBmcm9tIGhpZ2ggdG8gbG93CisgICAgICAgIGZvciAoaT0wOyBpPDQ7IGkrKykKKyAgICAgICAgeworICAgICAgICAJcEN0eC0+SW5wdXRbNTYraV0gPSAoVUNIQVIpKChwQ3R4LT5MZW5JbkJpdENvdW50WzFdID4+ICgoMy1pKSA8PCAzKSkgJiAweGZmKTsKKyAgICAgICAgCXBDdHgtPklucHV0WzYwK2ldID0gKFVDSEFSKSgocEN0eC0+TGVuSW5CaXRDb3VudFswXSA+PiAoKDMtaSkgPDwgMykpICYgMHhmZik7CisgICAgICAJfQorCisgICAgICAgIGJ5dGVSZXZlcnNlKChVQ0hBUiAqKXBDdHgtPklucHV0LCAxNik7CisgICAgICAgIE5kaXNaZXJvTWVtb3J5KChVQ0hBUiAqKXBDdHgtPklucHV0ICsgNjQsIDE0KTsKKyAgICAgICAgU0hBVHJhbnNmb3JtKHBDdHgtPkJ1ZiwgKFVJTlQzMiAqKXBDdHgtPklucHV0KTsKKyAgICB9IC8vIGVuZCBvZiBpZgorCisgICAgLy8gcGFkZGluZyBiaXRzIHdpdGggY3Jvc3NpbmcgYmxvY2soNjQtYnl0ZSBiYXNlZCkgYm91bmRhcnkKKyAgICBlbHNlCisgICAgeworICAgICAgICAvLyB0aGUgZmlyc3QgYmxvY2sgPT09CisgICAgICAgICpwQXBwZW5kID0gMHg4MDsKKyAgICAgICAgUGFkTGVuSW5CeXRlcyAtLTsKKworICAgICAgICBOZGlzWmVyb01lbW9yeSgoVUNIQVIgKilwQ3R4LT5JbnB1dCArIFJlbWFpbmRlcisxLCAoNjQtUmVtYWluZGVyLTEpKTsKKyAgICAgICAgUGFkTGVuSW5CeXRlcyAtPSAoNjQgLSBSZW1haW5kZXIgLSAxKTsKKworICAgICAgICBieXRlUmV2ZXJzZSgoVUNIQVIgKilwQ3R4LT5JbnB1dCwgMTYpOworICAgICAgICBOZGlzWmVyb01lbW9yeSgoVUNIQVIgKilwQ3R4LT5JbnB1dCArIDY0LCAxNik7CisgICAgICAgIFNIQVRyYW5zZm9ybShwQ3R4LT5CdWYsIChVSU5UMzIgKilwQ3R4LT5JbnB1dCk7CisKKworICAgICAgICAvLyB0aGUgc2Vjb25kIGJsb2NrID09PQorICAgICAgICBOZGlzWmVyb01lbW9yeSgoVUNIQVIgKilwQ3R4LT5JbnB1dCwgUGFkTGVuSW5CeXRlcyk7CisKKwkJLy8gYWRkIGRhdGEtbGVuZ3RoIGZpZWxkCisJCWZvciAoaT0wOyBpPDQ7IGkrKykKKyAgICAgICAgeworICAgICAgICAJcEN0eC0+SW5wdXRbNTYraV0gPSAoVUNIQVIpKChwQ3R4LT5MZW5JbkJpdENvdW50WzFdID4+ICgoMy1pKSA8PCAzKSkgJiAweGZmKTsKKyAgICAgICAgCXBDdHgtPklucHV0WzYwK2ldID0gKFVDSEFSKSgocEN0eC0+TGVuSW5CaXRDb3VudFswXSA+PiAoKDMtaSkgPDwgMykpICYgMHhmZik7CisgICAgICAJfQorCisgICAgICAgIGJ5dGVSZXZlcnNlKChVQ0hBUiAqKXBDdHgtPklucHV0LCAxNik7CisgICAgICAgIE5kaXNaZXJvTWVtb3J5KChVQ0hBUiAqKXBDdHgtPklucHV0ICsgNjQsIDE2KTsKKyAgICAgICAgU0hBVHJhbnNmb3JtKHBDdHgtPkJ1ZiwgKFVJTlQzMiAqKXBDdHgtPklucHV0KTsKKyAgICB9IC8vIGVuZCBvZiBlbHNlCisKKworICAgIC8vT3V0cHV0LCBieXRlcmV2ZXJzZQorICAgIGZvciAoaT0wOyBpPDIwOyBpKyspCisgICAgeworICAgICAgICBEaWdlc3QgW2ldID0gKFVDSEFSKShwQ3R4LT5CdWZbaT4+Ml0gPj4gOCooMy0oaSAmIDB4MykpKTsKKyAgICB9CisKKyAgICBOZGlzWmVyb01lbW9yeShwQ3R4LCBzaXplb2YocEN0eCkpOyAvLyBtZW1vcnkgZnJlZQorfQorCisKKy8vIFRoZSBjZW50cmFsIGFsZ29yaXRobSBvZiBTSEEtMSwgY29uc2lzdHMgb2YgZm91ciByb3VuZHMgYW5kCisvLyB0d2VudHkgc3RlcHMgcGVyIHJvdW5kCitWT0lEIFNIQVRyYW5zZm9ybShVSU5UMzIgQnVmWzVdLCBVSU5UMzIgTWVzWzIwXSkKK3sKKyAgICBVSU5UMzIgUmVnWzVdLFRlbXA7CisJdW5zaWduZWQgaW50IGk7CisgICAgVUlOVDMyIFdbODBdOworCisgICAgc3RhdGljIFVJTlQzMiBTSEExVGFibGVbNF0gPSB7IDB4NWE4Mjc5OTksIDB4NmVkOWViYTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4ZjFiYmNkYywgMHhjYTYyYzFkNiB9OworCisgICAgUmVnWzBdPUJ1ZlswXTsKKwlSZWdbMV09QnVmWzFdOworCVJlZ1syXT1CdWZbMl07CisJUmVnWzNdPUJ1ZlszXTsKKwlSZWdbNF09QnVmWzRdOworCisgICAgLy90aGUgZmlyc3Qgb2N0ZXQgb2YgYSB3b3JkIGlzIHN0b3JlZCBpbiB0aGUgMHRoIGVsZW1lbnQsIGJ5dGVyZXZlcnNlCisJZm9yKGkgPSAwOyBpIDwgMTY7IGkrKykKKyAgICB7CisgICAgCVdbaV0gID0gKE1lc1tpXSA+PiAyNCkgJiAweGZmOworICAgICAgICBXW2ldIHw9IChNZXNbaV0gPj4gOCApICYgMHhmZjAwOworICAgICAgICBXW2ldIHw9IChNZXNbaV0gPDwgOCApICYgMHhmZjAwMDA7CisgICAgICAgIFdbaV0gfD0gKE1lc1tpXSA8PCAyNCkgJiAweGZmMDAwMDAwOworICAgIH0KKworCisgICAgZm9yCShpID0gMDsgaSA8IDY0OyBpKyspCisJICAgIFdbMTYraV0gPSBDWUNMSUNfTEVGVF9TSElGVChXW2ldIF4gV1syK2ldIF4gV1s4K2ldIF4gV1sxMytpXSwgMSk7CisKKworICAgIC8vIDgwIHN0ZXBzIGluIFNIQS0xIGFsZ29yaXRobQorICAgIGZvciAoaT0wOyBpPDgwOyBpKyspCisgICAgeworICAgICAgICBpZiAoaTwyMCkKKyAgICAgICAgICAgIFNIQTFTdGVwKFNIQTFfRjEsIFJlZ1swXSwgUmVnWzFdLCBSZWdbMl0sIFJlZ1szXSwgUmVnWzRdLAorICAgICAgICAgICAgICAgICAgICAgV1tpXSwgU0hBMVRhYmxlWzBdKTsKKworICAgICAgICBlbHNlIGlmIChpPj0yMCAmJiBpPDQwKQorICAgICAgICAgICAgU0hBMVN0ZXAoU0hBMV9GMiwgUmVnWzBdLCBSZWdbMV0sIFJlZ1syXSwgUmVnWzNdLCBSZWdbNF0sCisgICAgICAgICAgICAgICAgICAgICBXW2ldLCBTSEExVGFibGVbMV0pOworCisJCWVsc2UgaWYgKGk+PTQwICYmIGk8NjApCisgICAgICAgICAgICBTSEExU3RlcChTSEExX0YzLCBSZWdbMF0sIFJlZ1sxXSwgUmVnWzJdLCBSZWdbM10sIFJlZ1s0XSwKKyAgICAgICAgICAgICAgICAgICAgICBXW2ldLCBTSEExVGFibGVbMl0pOworCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIFNIQTFTdGVwKFNIQTFfRjIsIFJlZ1swXSwgUmVnWzFdLCBSZWdbMl0sIFJlZ1szXSwgUmVnWzRdLAorICAgICAgICAgICAgICAgICAgICAgV1tpXSwgU0hBMVRhYmxlWzNdKTsKKworCisgICAgICAgLy8gb25lLXdvcmQgcmlnaHQgc2hpZnQKKwkJVGVtcCAgID0gUmVnWzRdOworICAgICAgICBSZWdbNF0gPSBSZWdbM107CisgICAgICAgIFJlZ1szXSA9IFJlZ1syXTsKKyAgICAgICAgUmVnWzJdID0gUmVnWzFdOworICAgICAgICBSZWdbMV0gPSBSZWdbMF07CisgICAgICAgIFJlZ1swXSA9IFRlbXA7CisKKyAgICB9IC8vIGVuZCBvZiBmb3ItbG9vcAorCisKKyAgICAvLyAodGVtcG9yYXJ5KW91dHB1dAorICAgIGZvciAoaT0wOyBpPDU7IGkrKykKKyAgICAgICAgQnVmW2ldICs9IFJlZ1tpXTsKKworfQorCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT0gIEFFUyBFbi9EZWNyeXB0aW9uID09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKy8qIGZvcndhcmQgUy1ib3ggKi8KK3N0YXRpYyB1aW50MzIgRlNiWzI1Nl0gPQoreworCTB4NjMsIDB4N0MsCTB4NzcsIDB4N0IsCTB4RjIsIDB4NkIsCTB4NkYsIDB4QzUsCisJMHgzMCwgMHgwMSwJMHg2NywgMHgyQiwJMHhGRSwgMHhENywJMHhBQiwgMHg3NiwKKwkweENBLCAweDgyLAkweEM5LCAweDdELAkweEZBLCAweDU5LAkweDQ3LCAweEYwLAorCTB4QUQsIDB4RDQsCTB4QTIsIDB4QUYsCTB4OUMsIDB4QTQsCTB4NzIsIDB4QzAsCisJMHhCNywgMHhGRCwJMHg5MywgMHgyNiwJMHgzNiwgMHgzRiwJMHhGNywgMHhDQywKKwkweDM0LCAweEE1LAkweEU1LCAweEYxLAkweDcxLCAweEQ4LAkweDMxLCAweDE1LAorCTB4MDQsIDB4QzcsCTB4MjMsIDB4QzMsCTB4MTgsIDB4OTYsCTB4MDUsIDB4OUEsCisJMHgwNywgMHgxMiwJMHg4MCwgMHhFMiwJMHhFQiwgMHgyNywJMHhCMiwgMHg3NSwKKwkweDA5LCAweDgzLAkweDJDLCAweDFBLAkweDFCLCAweDZFLAkweDVBLCAweEEwLAorCTB4NTIsIDB4M0IsCTB4RDYsIDB4QjMsCTB4MjksIDB4RTMsCTB4MkYsIDB4ODQsCisJMHg1MywgMHhEMSwJMHgwMCwgMHhFRCwJMHgyMCwgMHhGQywJMHhCMSwgMHg1QiwKKwkweDZBLCAweENCLAkweEJFLCAweDM5LAkweDRBLCAweDRDLAkweDU4LCAweENGLAorCTB4RDAsIDB4RUYsCTB4QUEsIDB4RkIsCTB4NDMsIDB4NEQsCTB4MzMsIDB4ODUsCisJMHg0NSwgMHhGOSwJMHgwMiwgMHg3RiwJMHg1MCwgMHgzQywJMHg5RiwgMHhBOCwKKwkweDUxLCAweEEzLAkweDQwLCAweDhGLAkweDkyLCAweDlELAkweDM4LCAweEY1LAorCTB4QkMsIDB4QjYsCTB4REEsIDB4MjEsCTB4MTAsIDB4RkYsCTB4RjMsIDB4RDIsCisJMHhDRCwgMHgwQywJMHgxMywgMHhFQywJMHg1RiwgMHg5NywJMHg0NCwgMHgxNywKKwkweEM0LCAweEE3LAkweDdFLCAweDNELAkweDY0LCAweDVELAkweDE5LCAweDczLAorCTB4NjAsIDB4ODEsCTB4NEYsIDB4REMsCTB4MjIsIDB4MkEsCTB4OTAsIDB4ODgsCisJMHg0NiwgMHhFRSwJMHhCOCwgMHgxNCwJMHhERSwgMHg1RSwJMHgwQiwgMHhEQiwKKwkweEUwLCAweDMyLAkweDNBLCAweDBBLAkweDQ5LCAweDA2LAkweDI0LCAweDVDLAorCTB4QzIsIDB4RDMsCTB4QUMsIDB4NjIsCTB4OTEsIDB4OTUsCTB4RTQsIDB4NzksCisJMHhFNywgMHhDOCwJMHgzNywgMHg2RCwJMHg4RCwgMHhENSwJMHg0RSwgMHhBOSwKKwkweDZDLCAweDU2LAkweEY0LCAweEVBLAkweDY1LCAweDdBLAkweEFFLCAweDA4LAorCTB4QkEsIDB4NzgsCTB4MjUsIDB4MkUsCTB4MUMsIDB4QTYsCTB4QjQsIDB4QzYsCisJMHhFOCwgMHhERCwJMHg3NCwgMHgxRiwJMHg0QiwgMHhCRCwJMHg4QiwgMHg4QSwKKwkweDcwLCAweDNFLAkweEI1LCAweDY2LAkweDQ4LCAweDAzLAkweEY2LCAweDBFLAorCTB4NjEsIDB4MzUsCTB4NTcsIDB4QjksCTB4ODYsIDB4QzEsCTB4MUQsIDB4OUUsCisJMHhFMSwgMHhGOCwJMHg5OCwgMHgxMSwJMHg2OSwgMHhEOSwJMHg4RSwgMHg5NCwKKwkweDlCLCAweDFFLAkweDg3LCAweEU5LAkweENFLCAweDU1LAkweDI4LCAweERGLAorCTB4OEMsIDB4QTEsCTB4ODksIDB4MEQsCTB4QkYsIDB4RTYsCTB4NDIsIDB4NjgsCisJMHg0MSwgMHg5OSwJMHgyRCwgMHgwRiwJMHhCMCwgMHg1NCwJMHhCQiwgMHgxNgorfTsKKworLyogZm9yd2FyZCB0YWJsZSAqLworI2RlZmluZQlGVCBcCitcCisJVihDNiw2Myw2MyxBNSksCVYoRjgsN0MsN0MsODQpLAlWKEVFLDc3LDc3LDk5KSwJVihGNiw3Qiw3Qiw4RCksCVwKKwlWKEZGLEYyLEYyLDBEKSwJVihENiw2Qiw2QixCRCksCVYoREUsNkYsNkYsQjEpLAlWKDkxLEM1LEM1LDU0KSwJXAorCVYoNjAsMzAsMzAsNTApLAlWKDAyLDAxLDAxLDAzKSwJVihDRSw2Nyw2NyxBOSksCVYoNTYsMkIsMkIsN0QpLAlcCisJVihFNyxGRSxGRSwxOSksCVYoQjUsRDcsRDcsNjIpLAlWKDRELEFCLEFCLEU2KSwJVihFQyw3Niw3Niw5QSksCVwKKwlWKDhGLENBLENBLDQ1KSwJVigxRiw4Miw4Miw5RCksCVYoODksQzksQzksNDApLAlWKEZBLDdELDdELDg3KSwJXAorCVYoRUYsRkEsRkEsMTUpLAlWKEIyLDU5LDU5LEVCKSwJVig4RSw0Nyw0NyxDOSksCVYoRkIsRjAsRjAsMEIpLAlcCisJVig0MSxBRCxBRCxFQyksCVYoQjMsRDQsRDQsNjcpLAlWKDVGLEEyLEEyLEZEKSwJVig0NSxBRixBRixFQSksCVwKKwlWKDIzLDlDLDlDLEJGKSwJVig1MyxBNCxBNCxGNyksCVYoRTQsNzIsNzIsOTYpLAlWKDlCLEMwLEMwLDVCKSwJXAorCVYoNzUsQjcsQjcsQzIpLAlWKEUxLEZELEZELDFDKSwJVigzRCw5Myw5MyxBRSksCVYoNEMsMjYsMjYsNkEpLAlcCisJVig2QywzNiwzNiw1QSksCVYoN0UsM0YsM0YsNDEpLAlWKEY1LEY3LEY3LDAyKSwJVig4MyxDQyxDQyw0RiksCVwKKwlWKDY4LDM0LDM0LDVDKSwJVig1MSxBNSxBNSxGNCksCVYoRDEsRTUsRTUsMzQpLAlWKEY5LEYxLEYxLDA4KSwJXAorCVYoRTIsNzEsNzEsOTMpLAlWKEFCLEQ4LEQ4LDczKSwJVig2MiwzMSwzMSw1MyksCVYoMkEsMTUsMTUsM0YpLAlcCisJVigwOCwwNCwwNCwwQyksCVYoOTUsQzcsQzcsNTIpLAlWKDQ2LDIzLDIzLDY1KSwJVig5RCxDMyxDMyw1RSksCVwKKwlWKDMwLDE4LDE4LDI4KSwJVigzNyw5Niw5NixBMSksCVYoMEEsMDUsMDUsMEYpLAlWKDJGLDlBLDlBLEI1KSwJXAorCVYoMEUsMDcsMDcsMDkpLAlWKDI0LDEyLDEyLDM2KSwJVigxQiw4MCw4MCw5QiksCVYoREYsRTIsRTIsM0QpLAlcCisJVihDRCxFQixFQiwyNiksCVYoNEUsMjcsMjcsNjkpLAlWKDdGLEIyLEIyLENEKSwJVihFQSw3NSw3NSw5RiksCVwKKwlWKDEyLDA5LDA5LDFCKSwJVigxRCw4Myw4Myw5RSksCVYoNTgsMkMsMkMsNzQpLAlWKDM0LDFBLDFBLDJFKSwJXAorCVYoMzYsMUIsMUIsMkQpLAlWKERDLDZFLDZFLEIyKSwJVihCNCw1QSw1QSxFRSksCVYoNUIsQTAsQTAsRkIpLAlcCisJVihBNCw1Miw1MixGNiksCVYoNzYsM0IsM0IsNEQpLAlWKEI3LEQ2LEQ2LDYxKSwJVig3RCxCMyxCMyxDRSksCVwKKwlWKDUyLDI5LDI5LDdCKSwJVihERCxFMyxFMywzRSksCVYoNUUsMkYsMkYsNzEpLAlWKDEzLDg0LDg0LDk3KSwJXAorCVYoQTYsNTMsNTMsRjUpLAlWKEI5LEQxLEQxLDY4KSwJVigwMCwwMCwwMCwwMCksCVYoQzEsRUQsRUQsMkMpLAlcCisJVig0MCwyMCwyMCw2MCksCVYoRTMsRkMsRkMsMUYpLAlWKDc5LEIxLEIxLEM4KSwJVihCNiw1Qiw1QixFRCksCVwKKwlWKEQ0LDZBLDZBLEJFKSwJVig4RCxDQixDQiw0NiksCVYoNjcsQkUsQkUsRDkpLAlWKDcyLDM5LDM5LDRCKSwJXAorCVYoOTQsNEEsNEEsREUpLAlWKDk4LDRDLDRDLEQ0KSwJVihCMCw1OCw1OCxFOCksCVYoODUsQ0YsQ0YsNEEpLAlcCisJVihCQixEMCxEMCw2QiksCVYoQzUsRUYsRUYsMkEpLAlWKDRGLEFBLEFBLEU1KSwJVihFRCxGQixGQiwxNiksCVwKKwlWKDg2LDQzLDQzLEM1KSwJVig5QSw0RCw0RCxENyksCVYoNjYsMzMsMzMsNTUpLAlWKDExLDg1LDg1LDk0KSwJXAorCVYoOEEsNDUsNDUsQ0YpLAlWKEU5LEY5LEY5LDEwKSwJVigwNCwwMiwwMiwwNiksCVYoRkUsN0YsN0YsODEpLAlcCisJVihBMCw1MCw1MCxGMCksCVYoNzgsM0MsM0MsNDQpLAlWKDI1LDlGLDlGLEJBKSwJVig0QixBOCxBOCxFMyksCVwKKwlWKEEyLDUxLDUxLEYzKSwJVig1RCxBMyxBMyxGRSksCVYoODAsNDAsNDAsQzApLAlWKDA1LDhGLDhGLDhBKSwJXAorCVYoM0YsOTIsOTIsQUQpLAlWKDIxLDlELDlELEJDKSwJVig3MCwzOCwzOCw0OCksCVYoRjEsRjUsRjUsMDQpLAlcCisJVig2MyxCQyxCQyxERiksCVYoNzcsQjYsQjYsQzEpLAlWKEFGLERBLERBLDc1KSwJVig0MiwyMSwyMSw2MyksCVwKKwlWKDIwLDEwLDEwLDMwKSwJVihFNSxGRixGRiwxQSksCVYoRkQsRjMsRjMsMEUpLAlWKEJGLEQyLEQyLDZEKSwJXAorCVYoODEsQ0QsQ0QsNEMpLAlWKDE4LDBDLDBDLDE0KSwJVigyNiwxMywxMywzNSksCVYoQzMsRUMsRUMsMkYpLAlcCisJVihCRSw1Riw1RixFMSksCVYoMzUsOTcsOTcsQTIpLAlWKDg4LDQ0LDQ0LENDKSwJVigyRSwxNywxNywzOSksCVwKKwlWKDkzLEM0LEM0LDU3KSwJVig1NSxBNyxBNyxGMiksCVYoRkMsN0UsN0UsODIpLAlWKDdBLDNELDNELDQ3KSwJXAorCVYoQzgsNjQsNjQsQUMpLAlWKEJBLDVELDVELEU3KSwJVigzMiwxOSwxOSwyQiksCVYoRTYsNzMsNzMsOTUpLAlcCisJVihDMCw2MCw2MCxBMCksCVYoMTksODEsODEsOTgpLAlWKDlFLDRGLDRGLEQxKSwJVihBMyxEQyxEQyw3RiksCVwKKwlWKDQ0LDIyLDIyLDY2KSwJVig1NCwyQSwyQSw3RSksCVYoM0IsOTAsOTAsQUIpLAlWKDBCLDg4LDg4LDgzKSwJXAorCVYoOEMsNDYsNDYsQ0EpLAlWKEM3LEVFLEVFLDI5KSwJVig2QixCOCxCOCxEMyksCVYoMjgsMTQsMTQsM0MpLAlcCisJVihBNyxERSxERSw3OSksCVYoQkMsNUUsNUUsRTIpLAlWKDE2LDBCLDBCLDFEKSwJVihBRCxEQixEQiw3NiksCVwKKwlWKERCLEUwLEUwLDNCKSwJVig2NCwzMiwzMiw1NiksCVYoNzQsM0EsM0EsNEUpLAlWKDE0LDBBLDBBLDFFKSwJXAorCVYoOTIsNDksNDksREIpLAlWKDBDLDA2LDA2LDBBKSwJVig0OCwyNCwyNCw2QyksCVYoQjgsNUMsNUMsRTQpLAlcCisJVig5RixDMixDMiw1RCksCVYoQkQsRDMsRDMsNkUpLAlWKDQzLEFDLEFDLEVGKSwJVihDNCw2Miw2MixBNiksCVwKKwlWKDM5LDkxLDkxLEE4KSwJVigzMSw5NSw5NSxBNCksCVYoRDMsRTQsRTQsMzcpLAlWKEYyLDc5LDc5LDhCKSwJXAorCVYoRDUsRTcsRTcsMzIpLAlWKDhCLEM4LEM4LDQzKSwJVig2RSwzNywzNyw1OSksCVYoREEsNkQsNkQsQjcpLAlcCisJVigwMSw4RCw4RCw4QyksCVYoQjEsRDUsRDUsNjQpLAlWKDlDLDRFLDRFLEQyKSwJVig0OSxBOSxBOSxFMCksCVwKKwlWKEQ4LDZDLDZDLEI0KSwJVihBQyw1Niw1NixGQSksCVYoRjMsRjQsRjQsMDcpLAlWKENGLEVBLEVBLDI1KSwJXAorCVYoQ0EsNjUsNjUsQUYpLAlWKEY0LDdBLDdBLDhFKSwJVig0NyxBRSxBRSxFOSksCVYoMTAsMDgsMDgsMTgpLAlcCisJVig2RixCQSxCQSxENSksCVYoRjAsNzgsNzgsODgpLAlWKDRBLDI1LDI1LDZGKSwJVig1QywyRSwyRSw3MiksCVwKKwlWKDM4LDFDLDFDLDI0KSwJVig1NyxBNixBNixGMSksCVYoNzMsQjQsQjQsQzcpLAlWKDk3LEM2LEM2LDUxKSwJXAorCVYoQ0IsRTgsRTgsMjMpLAlWKEExLERELERELDdDKSwJVihFOCw3NCw3NCw5QyksCVYoM0UsMUYsMUYsMjEpLAlcCisJVig5Niw0Qiw0QixERCksCVYoNjEsQkQsQkQsREMpLAlWKDBELDhCLDhCLDg2KSwJVigwRiw4QSw4QSw4NSksCVwKKwlWKEUwLDcwLDcwLDkwKSwJVig3QywzRSwzRSw0MiksCVYoNzEsQjUsQjUsQzQpLAlWKENDLDY2LDY2LEFBKSwJXAorCVYoOTAsNDgsNDgsRDgpLAlWKDA2LDAzLDAzLDA1KSwJVihGNyxGNixGNiwwMSksCVYoMUMsMEUsMEUsMTIpLAlcCisJVihDMiw2MSw2MSxBMyksCVYoNkEsMzUsMzUsNUYpLAlWKEFFLDU3LDU3LEY5KSwJVig2OSxCOSxCOSxEMCksCVwKKwlWKDE3LDg2LDg2LDkxKSwJVig5OSxDMSxDMSw1OCksCVYoM0EsMUQsMUQsMjcpLAlWKDI3LDlFLDlFLEI5KSwJXAorCVYoRDksRTEsRTEsMzgpLAlWKEVCLEY4LEY4LDEzKSwJVigyQiw5OCw5OCxCMyksCVYoMjIsMTEsMTEsMzMpLAlcCisJVihEMiw2OSw2OSxCQiksCVYoQTksRDksRDksNzApLAlWKDA3LDhFLDhFLDg5KSwJVigzMyw5NCw5NCxBNyksCVwKKwlWKDJELDlCLDlCLEI2KSwJVigzQywxRSwxRSwyMiksCVYoMTUsODcsODcsOTIpLAlWKEM5LEU5LEU5LDIwKSwJXAorCVYoODcsQ0UsQ0UsNDkpLAlWKEFBLDU1LDU1LEZGKSwJVig1MCwyOCwyOCw3OCksCVYoQTUsREYsREYsN0EpLAlcCisJVigwMyw4Qyw4Qyw4RiksCVYoNTksQTEsQTEsRjgpLAlWKDA5LDg5LDg5LDgwKSwJVigxQSwwRCwwRCwxNyksCVwKKwlWKDY1LEJGLEJGLERBKSwJVihENyxFNixFNiwzMSksCVYoODQsNDIsNDIsQzYpLAlWKEQwLDY4LDY4LEI4KSwJXAorCVYoODIsNDEsNDEsQzMpLAlWKDI5LDk5LDk5LEIwKSwJVig1QSwyRCwyRCw3NyksCVYoMUUsMEYsMEYsMTEpLAlcCisJVig3QixCMCxCMCxDQiksCVYoQTgsNTQsNTQsRkMpLAlWKDZELEJCLEJCLEQ2KSwJVigyQywxNiwxNiwzQSkKKworI2RlZmluZQlWKGEsYixjLGQpIDB4IyNhIyNiIyNjIyNkCitzdGF0aWMgdWludDMyIEZUMFsyNTZdID0geyBGVCB9OworI3VuZGVmIFYKKworI2RlZmluZQlWKGEsYixjLGQpIDB4IyNkIyNhIyNiIyNjCitzdGF0aWMgdWludDMyIEZUMVsyNTZdID0geyBGVCB9OworI3VuZGVmIFYKKworI2RlZmluZQlWKGEsYixjLGQpIDB4IyNjIyNkIyNhIyNiCitzdGF0aWMgdWludDMyIEZUMlsyNTZdID0geyBGVCB9OworI3VuZGVmIFYKKworI2RlZmluZQlWKGEsYixjLGQpIDB4IyNiIyNjIyNkIyNhCitzdGF0aWMgdWludDMyIEZUM1syNTZdID0geyBGVCB9OworI3VuZGVmIFYKKworI3VuZGVmIEZUCisKKy8qIHJldmVyc2UgUy1ib3ggKi8KKworc3RhdGljIHVpbnQzMiBSU2JbMjU2XSA9Cit7CisJMHg1MiwgMHgwOSwJMHg2QSwgMHhENSwJMHgzMCwgMHgzNiwJMHhBNSwgMHgzOCwKKwkweEJGLCAweDQwLAkweEEzLCAweDlFLAkweDgxLCAweEYzLAkweEQ3LCAweEZCLAorCTB4N0MsIDB4RTMsCTB4MzksIDB4ODIsCTB4OUIsIDB4MkYsCTB4RkYsIDB4ODcsCisJMHgzNCwgMHg4RSwJMHg0MywgMHg0NCwJMHhDNCwgMHhERSwJMHhFOSwgMHhDQiwKKwkweDU0LCAweDdCLAkweDk0LCAweDMyLAkweEE2LCAweEMyLAkweDIzLCAweDNELAorCTB4RUUsIDB4NEMsCTB4OTUsIDB4MEIsCTB4NDIsIDB4RkEsCTB4QzMsIDB4NEUsCisJMHgwOCwgMHgyRSwJMHhBMSwgMHg2NiwJMHgyOCwgMHhEOSwJMHgyNCwgMHhCMiwKKwkweDc2LCAweDVCLAkweEEyLCAweDQ5LAkweDZELCAweDhCLAkweEQxLCAweDI1LAorCTB4NzIsIDB4RjgsCTB4RjYsIDB4NjQsCTB4ODYsIDB4NjgsCTB4OTgsIDB4MTYsCisJMHhENCwgMHhBNCwJMHg1QywgMHhDQywJMHg1RCwgMHg2NSwJMHhCNiwgMHg5MiwKKwkweDZDLCAweDcwLAkweDQ4LCAweDUwLAkweEZELCAweEVELAkweEI5LCAweERBLAorCTB4NUUsIDB4MTUsCTB4NDYsIDB4NTcsCTB4QTcsIDB4OEQsCTB4OUQsIDB4ODQsCisJMHg5MCwgMHhEOCwJMHhBQiwgMHgwMCwJMHg4QywgMHhCQywJMHhEMywgMHgwQSwKKwkweEY3LCAweEU0LAkweDU4LCAweDA1LAkweEI4LCAweEIzLAkweDQ1LCAweDA2LAorCTB4RDAsIDB4MkMsCTB4MUUsIDB4OEYsCTB4Q0EsIDB4M0YsCTB4MEYsIDB4MDIsCisJMHhDMSwgMHhBRiwJMHhCRCwgMHgwMywJMHgwMSwgMHgxMywJMHg4QSwgMHg2QiwKKwkweDNBLCAweDkxLAkweDExLCAweDQxLAkweDRGLCAweDY3LAkweERDLCAweEVBLAorCTB4OTcsIDB4RjIsCTB4Q0YsIDB4Q0UsCTB4RjAsIDB4QjQsCTB4RTYsIDB4NzMsCisJMHg5NiwgMHhBQywJMHg3NCwgMHgyMiwJMHhFNywgMHhBRCwJMHgzNSwgMHg4NSwKKwkweEUyLCAweEY5LAkweDM3LCAweEU4LAkweDFDLCAweDc1LAkweERGLCAweDZFLAorCTB4NDcsIDB4RjEsCTB4MUEsIDB4NzEsCTB4MUQsIDB4MjksCTB4QzUsIDB4ODksCisJMHg2RiwgMHhCNywJMHg2MiwgMHgwRSwJMHhBQSwgMHgxOCwJMHhCRSwgMHgxQiwKKwkweEZDLCAweDU2LAkweDNFLCAweDRCLAkweEM2LCAweEQyLAkweDc5LCAweDIwLAorCTB4OUEsIDB4REIsCTB4QzAsIDB4RkUsCTB4NzgsIDB4Q0QsCTB4NUEsIDB4RjQsCisJMHgxRiwgMHhERCwJMHhBOCwgMHgzMywJMHg4OCwgMHgwNywJMHhDNywgMHgzMSwKKwkweEIxLCAweDEyLAkweDEwLCAweDU5LAkweDI3LCAweDgwLAkweEVDLCAweDVGLAorCTB4NjAsIDB4NTEsCTB4N0YsIDB4QTksCTB4MTksIDB4QjUsCTB4NEEsIDB4MEQsCisJMHgyRCwgMHhFNSwJMHg3QSwgMHg5RiwJMHg5MywgMHhDOSwJMHg5QywgMHhFRiwKKwkweEEwLCAweEUwLAkweDNCLCAweDRELAkweEFFLCAweDJBLAkweEY1LCAweEIwLAorCTB4QzgsIDB4RUIsCTB4QkIsIDB4M0MsCTB4ODMsIDB4NTMsCTB4OTksIDB4NjEsCisJMHgxNywgMHgyQiwJMHgwNCwgMHg3RSwJMHhCQSwgMHg3NywJMHhENiwgMHgyNiwKKwkweEUxLCAweDY5LAkweDE0LCAweDYzLAkweDU1LCAweDIxLAkweDBDLCAweDdECit9OworCisvKiByZXZlcnNlIHRhYmxlICovCisKKyNkZWZpbmUJUlQgXAorXAorCVYoNTEsRjQsQTcsNTApLAlWKDdFLDQxLDY1LDUzKSwJVigxQSwxNyxBNCxDMyksCVYoM0EsMjcsNUUsOTYpLAlcCisJVigzQixBQiw2QixDQiksCVYoMUYsOUQsNDUsRjEpLAlWKEFDLEZBLDU4LEFCKSwJVig0QixFMywwMyw5MyksCVwKKwlWKDIwLDMwLEZBLDU1KSwJVihBRCw3Niw2RCxGNiksCVYoODgsQ0MsNzYsOTEpLAlWKEY1LDAyLDRDLDI1KSwJXAorCVYoNEYsRTUsRDcsRkMpLAlWKEM1LDJBLENCLEQ3KSwJVigyNiwzNSw0NCw4MCksCVYoQjUsNjIsQTMsOEYpLAlcCisJVihERSxCMSw1QSw0OSksCVYoMjUsQkEsMUIsNjcpLAlWKDQ1LEVBLDBFLDk4KSwJVig1RCxGRSxDMCxFMSksCVwKKwlWKEMzLDJGLDc1LDAyKSwJVig4MSw0QyxGMCwxMiksCVYoOEQsNDYsOTcsQTMpLAlWKDZCLEQzLEY5LEM2KSwJXAorCVYoMDMsOEYsNUYsRTcpLAlWKDE1LDkyLDlDLDk1KSwJVihCRiw2RCw3QSxFQiksCVYoOTUsNTIsNTksREEpLAlcCisJVihENCxCRSw4MywyRCksCVYoNTgsNzQsMjEsRDMpLAlWKDQ5LEUwLDY5LDI5KSwJVig4RSxDOSxDOCw0NCksCVwKKwlWKDc1LEMyLDg5LDZBKSwJVihGNCw4RSw3OSw3OCksCVYoOTksNTgsM0UsNkIpLAlWKDI3LEI5LDcxLEREKSwJXAorCVYoQkUsRTEsNEYsQjYpLAlWKEYwLDg4LEFELDE3KSwJVihDOSwyMCxBQyw2NiksCVYoN0QsQ0UsM0EsQjQpLAlcCisJVig2MyxERiw0QSwxOCksCVYoRTUsMUEsMzEsODIpLAlWKDk3LDUxLDMzLDYwKSwJVig2Miw1Myw3Riw0NSksCVwKKwlWKEIxLDY0LDc3LEUwKSwJVihCQiw2QixBRSw4NCksCVYoRkUsODEsQTAsMUMpLAlWKEY5LDA4LDJCLDk0KSwJXAorCVYoNzAsNDgsNjgsNTgpLAlWKDhGLDQ1LEZELDE5KSwJVig5NCxERSw2Qyw4NyksCVYoNTIsN0IsRjgsQjcpLAlcCisJVihBQiw3MyxEMywyMyksCVYoNzIsNEIsMDIsRTIpLAlWKEUzLDFGLDhGLDU3KSwJVig2Niw1NSxBQiwyQSksCVwKKwlWKEIyLEVCLDI4LDA3KSwJVigyRixCNSxDMiwwMyksCVYoODYsQzUsN0IsOUEpLAlWKEQzLDM3LDA4LEE1KSwJXAorCVYoMzAsMjgsODcsRjIpLAlWKDIzLEJGLEE1LEIyKSwJVigwMiwwMyw2QSxCQSksCVYoRUQsMTYsODIsNUMpLAlcCisJVig4QSxDRiwxQywyQiksCVYoQTcsNzksQjQsOTIpLAlWKEYzLDA3LEYyLEYwKSwJVig0RSw2OSxFMixBMSksCVwKKwlWKDY1LERBLEY0LENEKSwJVigwNiwwNSxCRSxENSksCVYoRDEsMzQsNjIsMUYpLAlWKEM0LEE2LEZFLDhBKSwJXAorCVYoMzQsMkUsNTMsOUQpLAlWKEEyLEYzLDU1LEEwKSwJVigwNSw4QSxFMSwzMiksCVYoQTQsRjYsRUIsNzUpLAlcCisJVigwQiw4MyxFQywzOSksCVYoNDAsNjAsRUYsQUEpLAlWKDVFLDcxLDlGLDA2KSwJVihCRCw2RSwxMCw1MSksCVwKKwlWKDNFLDIxLDhBLEY5KSwJVig5NixERCwwNiwzRCksCVYoREQsM0UsMDUsQUUpLAlWKDRELEU2LEJELDQ2KSwJXAorCVYoOTEsNTQsOEQsQjUpLAlWKDcxLEM0LDVELDA1KSwJVigwNCwwNixENCw2RiksCVYoNjAsNTAsMTUsRkYpLAlcCisJVigxOSw5OCxGQiwyNCksCVYoRDYsQkQsRTksOTcpLAlWKDg5LDQwLDQzLENDKSwJVig2NyxEOSw5RSw3NyksCVwKKwlWKEIwLEU4LDQyLEJEKSwJVigwNyw4OSw4Qiw4OCksCVYoRTcsMTksNUIsMzgpLAlWKDc5LEM4LEVFLERCKSwJXAorCVYoQTEsN0MsMEEsNDcpLAlWKDdDLDQyLDBGLEU5KSwJVihGOCw4NCwxRSxDOSksCVYoMDAsMDAsMDAsMDApLAlcCisJVigwOSw4MCw4Niw4MyksCVYoMzIsMkIsRUQsNDgpLAlWKDFFLDExLDcwLEFDKSwJVig2Qyw1QSw3Miw0RSksCVwKKwlWKEZELDBFLEZGLEZCKSwJVigwRiw4NSwzOCw1NiksCVYoM0QsQUUsRDUsMUUpLAlWKDM2LDJELDM5LDI3KSwJXAorCVYoMEEsMEYsRDksNjQpLAlWKDY4LDVDLEE2LDIxKSwJVig5Qiw1Qiw1NCxEMSksCVYoMjQsMzYsMkUsM0EpLAlcCisJVigwQywwQSw2NyxCMSksCVYoOTMsNTcsRTcsMEYpLAlWKEI0LEVFLDk2LEQyKSwJVigxQiw5Qiw5MSw5RSksCVwKKwlWKDgwLEMwLEM1LDRGKSwJVig2MSxEQywyMCxBMiksCVYoNUEsNzcsNEIsNjkpLAlWKDFDLDEyLDFBLDE2KSwJXAorCVYoRTIsOTMsQkEsMEEpLAlWKEMwLEEwLDJBLEU1KSwJVigzQywyMixFMCw0MyksCVYoMTIsMUIsMTcsMUQpLAlcCisJVigwRSwwOSwwRCwwQiksCVYoRjIsOEIsQzcsQUQpLAlWKDJELEI2LEE4LEI5KSwJVigxNCwxRSxBOSxDOCksCVwKKwlWKDU3LEYxLDE5LDg1KSwJVihBRiw3NSwwNyw0QyksCVYoRUUsOTksREQsQkIpLAlWKEEzLDdGLDYwLEZEKSwJXAorCVYoRjcsMDEsMjYsOUYpLAlWKDVDLDcyLEY1LEJDKSwJVig0NCw2NiwzQixDNSksCVYoNUIsRkIsN0UsMzQpLAlcCisJVig4Qiw0MywyOSw3NiksCVYoQ0IsMjMsQzYsREMpLAlWKEI2LEVELEZDLDY4KSwJVihCOCxFNCxGMSw2MyksCVwKKwlWKEQ3LDMxLERDLENBKSwJVig0Miw2Myw4NSwxMCksCVYoMTMsOTcsMjIsNDApLAlWKDg0LEM2LDExLDIwKSwJXAorCVYoODUsNEEsMjQsN0QpLAlWKEQyLEJCLDNELEY4KSwJVihBRSxGOSwzMiwxMSksCVYoQzcsMjksQTEsNkQpLAlcCisJVigxRCw5RSwyRiw0QiksCVYoREMsQjIsMzAsRjMpLAlWKDBELDg2LDUyLEVDKSwJVig3NyxDMSxFMyxEMCksCVwKKwlWKDJCLEIzLDE2LDZDKSwJVihBOSw3MCxCOSw5OSksCVYoMTEsOTQsNDgsRkEpLAlWKDQ3LEU5LDY0LDIyKSwJXAorCVYoQTgsRkMsOEMsQzQpLAlWKEEwLEYwLDNGLDFBKSwJVig1Niw3RCwyQyxEOCksCVYoMjIsMzMsOTAsRUYpLAlcCisJVig4Nyw0OSw0RSxDNyksCVYoRDksMzgsRDEsQzEpLAlWKDhDLENBLEEyLEZFKSwJVig5OCxENCwwQiwzNiksCVwKKwlWKEE2LEY1LDgxLENGKSwJVihBNSw3QSxERSwyOCksCVYoREEsQjcsOEUsMjYpLAlWKDNGLEFELEJGLEE0KSwJXAorCVYoMkMsM0EsOUQsRTQpLAlWKDUwLDc4LDkyLDBEKSwJVig2QSw1RixDQyw5QiksCVYoNTQsN0UsNDYsNjIpLAlcCisJVihGNiw4RCwxMyxDMiksCVYoOTAsRDgsQjgsRTgpLAlWKDJFLDM5LEY3LDVFKSwJVig4MixDMyxBRixGNSksCVwKKwlWKDlGLDVELDgwLEJFKSwJVig2OSxEMCw5Myw3QyksCVYoNkYsRDUsMkQsQTkpLAlWKENGLDI1LDEyLEIzKSwJXAorCVYoQzgsQUMsOTksM0IpLAlWKDEwLDE4LDdELEE3KSwJVihFOCw5Qyw2Myw2RSksCVYoREIsM0IsQkIsN0IpLAlcCisJVihDRCwyNiw3OCwwOSksCVYoNkUsNTksMTgsRjQpLAlWKEVDLDlBLEI3LDAxKSwJVig4Myw0Riw5QSxBOCksCVwKKwlWKEU2LDk1LDZFLDY1KSwJVihBQSxGRixFNiw3RSksCVYoMjEsQkMsQ0YsMDgpLAlWKEVGLDE1LEU4LEU2KSwJXAorCVYoQkEsRTcsOUIsRDkpLAlWKDRBLDZGLDM2LENFKSwJVihFQSw5RiwwOSxENCksCVYoMjksQjAsN0MsRDYpLAlcCisJVigzMSxBNCxCMixBRiksCVYoMkEsM0YsMjMsMzEpLAlWKEM2LEE1LDk0LDMwKSwJVigzNSxBMiw2NixDMCksCVwKKwlWKDc0LDRFLEJDLDM3KSwJVihGQyw4MixDQSxBNiksCVYoRTAsOTAsRDAsQjApLAlWKDMzLEE3LEQ4LDE1KSwJXAorCVYoRjEsMDQsOTgsNEEpLAlWKDQxLEVDLERBLEY3KSwJVig3RixDRCw1MCwwRSksCVYoMTcsOTEsRjYsMkYpLAlcCisJVig3Niw0RCxENiw4RCksCVYoNDMsRUYsQjAsNEQpLAlWKENDLEFBLDRELDU0KSwJVihFNCw5NiwwNCxERiksCVwKKwlWKDlFLEQxLEI1LEUzKSwJVig0Qyw2QSw4OCwxQiksCVYoQzEsMkMsMUYsQjgpLAlWKDQ2LDY1LDUxLDdGKSwJXAorCVYoOUQsNUUsRUEsMDQpLAlWKDAxLDhDLDM1LDVEKSwJVihGQSw4Nyw3NCw3MyksCVYoRkIsMEIsNDEsMkUpLAlcCisJVihCMyw2NywxRCw1QSksCVYoOTIsREIsRDIsNTIpLAlWKEU5LDEwLDU2LDMzKSwJVig2RCxENiw0NywxMyksCVwKKwlWKDlBLEQ3LDYxLDhDKSwJVigzNyxBMSwwQyw3QSksCVYoNTksRjgsMTQsOEUpLAlWKEVCLDEzLDNDLDg5KSwJXAorCVYoQ0UsQTksMjcsRUUpLAlWKEI3LDYxLEM5LDM1KSwJVihFMSwxQyxFNSxFRCksCVYoN0EsNDcsQjEsM0MpLAlcCisJVig5QyxEMixERiw1OSksCVYoNTUsRjIsNzMsM0YpLAlWKDE4LDE0LENFLDc5KSwJVig3MyxDNywzNyxCRiksCVwKKwlWKDUzLEY3LENELEVBKSwJVig1RixGRCxBQSw1QiksCVYoREYsM0QsNkYsMTQpLAlWKDc4LDQ0LERCLDg2KSwJXAorCVYoQ0EsQUYsRjMsODEpLAlWKEI5LDY4LEM0LDNFKSwJVigzOCwyNCwzNCwyQyksCVYoQzIsQTMsNDAsNUYpLAlcCisJVigxNiwxRCxDMyw3MiksCVYoQkMsRTIsMjUsMEMpLAlWKDI4LDNDLDQ5LDhCKSwJVihGRiwwRCw5NSw0MSksCVwKKwlWKDM5LEE4LDAxLDcxKSwJVigwOCwwQyxCMyxERSksCVYoRDgsQjQsRTQsOUMpLAlWKDY0LDU2LEMxLDkwKSwJXAorCVYoN0IsQ0IsODQsNjEpLAlWKEQ1LDMyLEI2LDcwKSwJVig0OCw2Qyw1Qyw3NCksCVYoRDAsQjgsNTcsNDIpCisKKyNkZWZpbmUJVihhLGIsYyxkKSAweCMjYSMjYiMjYyMjZAorc3RhdGljIHVpbnQzMiBSVDBbMjU2XSA9IHsgUlQgfTsKKyN1bmRlZiBWCisKKyNkZWZpbmUJVihhLGIsYyxkKSAweCMjZCMjYSMjYiMjYworc3RhdGljIHVpbnQzMiBSVDFbMjU2XSA9IHsgUlQgfTsKKyN1bmRlZiBWCisKKyNkZWZpbmUJVihhLGIsYyxkKSAweCMjYyMjZCMjYSMjYgorc3RhdGljIHVpbnQzMiBSVDJbMjU2XSA9IHsgUlQgfTsKKyN1bmRlZiBWCisKKyNkZWZpbmUJVihhLGIsYyxkKSAweCMjYiMjYyMjZCMjYQorc3RhdGljIHVpbnQzMiBSVDNbMjU2XSA9IHsgUlQgfTsKKyN1bmRlZiBWCisKKyN1bmRlZiBSVAorCisvKiByb3VuZCBjb25zdGFudHMgKi8KKworc3RhdGljIHVpbnQzMiBSQ09OWzEwXSA9Cit7CisJMHgwMTAwMDAwMCwJMHgwMjAwMDAwMCwJMHgwNDAwMDAwMCwJMHgwODAwMDAwMCwKKwkweDEwMDAwMDAwLAkweDIwMDAwMDAwLAkweDQwMDAwMDAwLAkweDgwMDAwMDAwLAorCTB4MUIwMDAwMDAsCTB4MzYwMDAwMDAKK307CisKKy8qIGtleSBzY2hlZHVsZQl0YWJsZXMgKi8KKworc3RhdGljIGludCBLVF9pbml0ID0gMTsKKworc3RhdGljIHVpbnQzMiBLVDBbMjU2XTsKK3N0YXRpYyB1aW50MzIgS1QxWzI1Nl07CitzdGF0aWMgdWludDMyIEtUMlsyNTZdOworc3RhdGljIHVpbnQzMiBLVDNbMjU2XTsKKworLyogcGxhdGZvcm0taW5kZXBlbmRhbnQJMzItYml0IGludGVnZXIgbWFuaXB1bGF0aW9uCW1hY3JvcyAqLworCisjZGVmaW5lCUdFVF9VSU5UMzIobixiLGkpCQkJCQkJXAorewkJCQkJCQkJCQkJCVwKKwkobikJPSAoCSh1aW50MzIpIChiKVsoaSkJXSA8PCAyNAkpCQlcCisJCXwgKAkodWludDMyKSAoYilbKGkpICsgMV0gPDwgMTYJKQkJXAorCQl8ICgJKHVpbnQzMikgKGIpWyhpKSArIDJdIDw8ICA4CSkJCVwKKwkJfCAoCSh1aW50MzIpIChiKVsoaSkgKyAzXQkJKTsJCVwKK30KKworI2RlZmluZQlQVVRfVUlOVDMyKG4sYixpKQkJCQkJCVwKK3sJCQkJCQkJCQkJCQlcCisJKGIpWyhpKQkgICBdID0gKHVpbnQ4KSAoIChuKSA+PgkyNCApOwkJXAorCShiKVsoaSkJKyAxXSA9ICh1aW50OCkgKCAobikgPj4JMTYgKTsJCVwKKwkoYilbKGkpCSsgMl0gPSAodWludDgpICggKG4pID4+CSA4ICk7CQlcCisJKGIpWyhpKQkrIDNdID0gKHVpbnQ4KSAoIChuKQkgICApOwkJXAorfQorCisvKiBBRVMga2V5IHNjaGVkdWxpbmcgcm91dGluZSAqLworCitpbnQJcnRtcF9hZXNfc2V0X2tleSggYWVzX2NvbnRleHQgKmN0eCwgdWludDggKmtleSwgaW50IG5iaXRzICkKK3sKKwlpbnQJaTsKKwl1aW50MzIgKlJLLAkqU0s7CisKKwlzd2l0Y2goCW5iaXRzICkKKwl7CisJCWNhc2UgMTI4OiBjdHgtPm5yID0JMTA7CWJyZWFrOworCQljYXNlIDE5MjogY3R4LT5uciA9CTEyOwlicmVhazsKKwkJY2FzZSAyNTY6IGN0eC0+bnIgPQkxNDsJYnJlYWs7CisJCWRlZmF1bHQJOiByZXR1cm4oIDEJKTsKKwl9CisKKwlSSyA9IGN0eC0+ZXJrOworCisJZm9yKCBpID0gMDsJaSA8CShuYml0cyA+PiA1KTsgaSsrICkKKwl7CisJCUdFVF9VSU5UMzIoCVJLW2ldLCBrZXksCWkgKgk0ICk7CisJfQorCisJLyogc2V0dXAgZW5jcnlwdGlvbglyb3VuZCBrZXlzICovCisKKwlzd2l0Y2goCW5iaXRzICkKKwl7CisJY2FzZSAxMjg6CisKKwkJZm9yKCBpID0gMDsJaSA8CTEwOwlpKyssIFJLCSs9IDQgKQorCQl7CisJCQlSS1s0XSAgPSBSS1swXSBeIFJDT05baV0gXgorCQkJCQkJKCBGU2JbICh1aW50OCkgKCBSS1szXSA+PiAxNiApIF0gPDwJMjQgKSBeCisJCQkJCQkoIEZTYlsgKHVpbnQ4KSAoIFJLWzNdID4+ICA4ICkgXSA8PAkxNiApIF4KKwkJCQkJCSggRlNiWyAodWludDgpICggUktbM10JCSApIF0gPDwJIDggKSBeCisJCQkJCQkoIEZTYlsgKHVpbnQ4KSAoIFJLWzNdID4+IDI0ICkgXQkgICApOworCisJCQlSS1s1XSAgPSBSS1sxXSBeIFJLWzRdOworCQkJUktbNl0gID0gUktbMl0gXiBSS1s1XTsKKwkJCVJLWzddICA9IFJLWzNdIF4gUktbNl07CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIDE5MjoKKworCQlmb3IoIGkgPSAwOwlpIDwJODsgaSsrLAlSSyArPSA2CSkKKwkJeworCQkJUktbNl0gID0gUktbMF0gXiBSQ09OW2ldIF4KKwkJCQkJCSggRlNiWyAodWludDgpICggUktbNV0gPj4gMTYgKSBdIDw8CTI0ICkgXgorCQkJCQkJKCBGU2JbICh1aW50OCkgKCBSS1s1XSA+PiAgOCApIF0gPDwJMTYgKSBeCisJCQkJCQkoIEZTYlsgKHVpbnQ4KSAoIFJLWzVdCQkgKSBdIDw8CSA4ICkgXgorCQkJCQkJKCBGU2JbICh1aW50OCkgKCBSS1s1XSA+PiAyNCApIF0JICAgKTsKKworCQkJUktbN10gID0gUktbMV0gXiBSS1s2XTsKKwkJCVJLWzhdICA9IFJLWzJdIF4gUktbN107CisJCQlSS1s5XSAgPSBSS1szXSBeIFJLWzhdOworCQkJUktbMTBdID0gUktbNF0gXiBSS1s5XTsKKwkJCVJLWzExXSA9IFJLWzVdIF4gUktbMTBdOworCQl9CisJCWJyZWFrOworCisJY2FzZSAyNTY6CisKKwkJZm9yKCBpID0gMDsJaSA8CTc7IGkrKywJUksgKz0gOAkpCisJCXsKKwkJCVJLWzhdICA9IFJLWzBdIF4gUkNPTltpXSBeCisJCQkJCQkoIEZTYlsgKHVpbnQ4KSAoIFJLWzddID4+IDE2ICkgXSA8PAkyNCApIF4KKwkJCQkJCSggRlNiWyAodWludDgpICggUktbN10gPj4gIDggKSBdIDw8CTE2ICkgXgorCQkJCQkJKCBGU2JbICh1aW50OCkgKCBSS1s3XQkJICkgXSA8PAkgOCApIF4KKwkJCQkJCSggRlNiWyAodWludDgpICggUktbN10gPj4gMjQgKSBdCSAgICk7CisKKwkJCVJLWzldICA9IFJLWzFdIF4gUktbOF07CisJCQlSS1sxMF0gPSBSS1syXSBeIFJLWzldOworCQkJUktbMTFdID0gUktbM10gXiBSS1sxMF07CisKKwkJCVJLWzEyXSA9IFJLWzRdIF4KKwkJCQkJCSggRlNiWyAodWludDgpICggUktbMTFdCT4+IDI0ICkJXSA8PCAyNAkpIF4KKwkJCQkJCSggRlNiWyAodWludDgpICggUktbMTFdCT4+IDE2ICkJXSA8PCAxNgkpIF4KKwkJCQkJCSggRlNiWyAodWludDgpICggUktbMTFdCT4+CTggKQldIDw8ICA4CSkgXgorCQkJCQkJKCBGU2JbICh1aW50OCkgKCBSS1sxMV0JCSAgKQldCQkpOworCisJCQlSS1sxM10gPSBSS1s1XSBeIFJLWzEyXTsKKwkJCVJLWzE0XSA9IFJLWzZdIF4gUktbMTNdOworCQkJUktbMTVdID0gUktbN10gXiBSS1sxNF07CisJCX0KKwkJYnJlYWs7CisJfQorCisJLyogc2V0dXAgZGVjcnlwdGlvbglyb3VuZCBrZXlzICovCisKKwlpZigJS1RfaW5pdAkpCisJeworCQlmb3IoIGkgPSAwOwlpIDwJMjU2OyBpKysgKQorCQl7CisJCQlLVDBbaV0gPSBSVDBbIEZTYltpXSBdOworCQkJS1QxW2ldID0gUlQxWyBGU2JbaV0gXTsKKwkJCUtUMltpXSA9IFJUMlsgRlNiW2ldIF07CisJCQlLVDNbaV0gPSBSVDNbIEZTYltpXSBdOworCQl9CisKKwkJS1RfaW5pdAk9IDA7CisJfQorCisJU0sgPSBjdHgtPmRyazsKKworCSpTSysrID0JKlJLKys7CisJKlNLKysgPQkqUksrKzsKKwkqU0srKyA9CSpSSysrOworCSpTSysrID0JKlJLKys7CisKKwlmb3IoIGkgPSAxOwlpIDwJY3R4LT5ucjsgaSsrICkKKwl7CisJCVJLIC09IDg7CisKKwkJKlNLKysgPQlLVDBbICh1aW50OCkgKCAqUksgPj4gMjQgKSBdIF4KKwkJCQlLVDFbICh1aW50OCkgKCAqUksgPj4gMTYgKSBdIF4KKwkJCQlLVDJbICh1aW50OCkgKCAqUksgPj4gIDggKSBdIF4KKwkJCQlLVDNbICh1aW50OCkgKCAqUksJCSApIF07IFJLKys7CisKKwkJKlNLKysgPQlLVDBbICh1aW50OCkgKCAqUksgPj4gMjQgKSBdIF4KKwkJCQlLVDFbICh1aW50OCkgKCAqUksgPj4gMTYgKSBdIF4KKwkJCQlLVDJbICh1aW50OCkgKCAqUksgPj4gIDggKSBdIF4KKwkJCQlLVDNbICh1aW50OCkgKCAqUksJCSApIF07IFJLKys7CisKKwkJKlNLKysgPQlLVDBbICh1aW50OCkgKCAqUksgPj4gMjQgKSBdIF4KKwkJCQlLVDFbICh1aW50OCkgKCAqUksgPj4gMTYgKSBdIF4KKwkJCQlLVDJbICh1aW50OCkgKCAqUksgPj4gIDggKSBdIF4KKwkJCQlLVDNbICh1aW50OCkgKCAqUksJCSApIF07IFJLKys7CisKKwkJKlNLKysgPQlLVDBbICh1aW50OCkgKCAqUksgPj4gMjQgKSBdIF4KKwkJCQlLVDFbICh1aW50OCkgKCAqUksgPj4gMTYgKSBdIF4KKwkJCQlLVDJbICh1aW50OCkgKCAqUksgPj4gIDggKSBdIF4KKwkJCQlLVDNbICh1aW50OCkgKCAqUksJCSApIF07IFJLKys7CisJfQorCisJUksgLT0gODsKKworCSpTSysrID0JKlJLKys7CisJKlNLKysgPQkqUksrKzsKKwkqU0srKyA9CSpSSysrOworCSpTSysrID0JKlJLKys7CisKKwlyZXR1cm4oCTAgKTsKK30KKworLyogQUVTIDEyOC1iaXQgYmxvY2sgZW5jcnlwdGlvbglyb3V0aW5lCSovCisKK3ZvaWQgcnRtcF9hZXNfZW5jcnlwdChhZXNfY29udGV4dCAqY3R4LCB1aW50OCBpbnB1dFsxNl0sCXVpbnQ4IG91dHB1dFsxNl0gKQoreworCXVpbnQzMiAqUkssCVgwLAlYMSwJWDIsCVgzLAlZMCwJWTEsCVkyLAlZMzsKKworCVJLID0gY3R4LT5lcms7CisJR0VUX1VJTlQzMigJWDAsCWlucHV0LAkwICk7IFgwCV49IFJLWzBdOworCUdFVF9VSU5UMzIoCVgxLAlpbnB1dCwJNCApOyBYMQlePSBSS1sxXTsKKwlHRVRfVUlOVDMyKAlYMiwJaW5wdXQsCTggKTsgWDIJXj0gUktbMl07CisJR0VUX1VJTlQzMigJWDMsCWlucHV0LCAxMiApOyBYMwlePSBSS1szXTsKKworI2RlZmluZQlBRVNfRlJPVU5EKFgwLFgxLFgyLFgzLFkwLFkxLFkyLFkzKQkJXAorewkJCQkJCQkJCQkJCVwKKwlSSyArPSA0OwkJCQkJCQkJCVwKKwkJCQkJCQkJCQkJCVwKKwlYMCA9IFJLWzBdIF4gRlQwWyAodWludDgpICgJWTAgPj4gMjQgKSBdIF4JXAorCQkJCSBGVDFbICh1aW50OCkgKAlZMSA+PiAxNiApIF0gXglcCisJCQkJIEZUMlsgKHVpbnQ4KSAoCVkyID4+ICA4ICkgXSBeCVwKKwkJCQkgRlQzWyAodWludDgpICgJWTMJCSApIF07CVwKKwkJCQkJCQkJCQkJCVwKKwlYMSA9IFJLWzFdIF4gRlQwWyAodWludDgpICgJWTEgPj4gMjQgKSBdIF4JXAorCQkJCSBGVDFbICh1aW50OCkgKAlZMiA+PiAxNiApIF0gXglcCisJCQkJIEZUMlsgKHVpbnQ4KSAoCVkzID4+ICA4ICkgXSBeCVwKKwkJCQkgRlQzWyAodWludDgpICgJWTAJCSApIF07CVwKKwkJCQkJCQkJCQkJCVwKKwlYMiA9IFJLWzJdIF4gRlQwWyAodWludDgpICgJWTIgPj4gMjQgKSBdIF4JXAorCQkJCSBGVDFbICh1aW50OCkgKAlZMyA+PiAxNiApIF0gXglcCisJCQkJIEZUMlsgKHVpbnQ4KSAoCVkwID4+ICA4ICkgXSBeCVwKKwkJCQkgRlQzWyAodWludDgpICgJWTEJCSApIF07CVwKKwkJCQkJCQkJCQkJCVwKKwlYMyA9IFJLWzNdIF4gRlQwWyAodWludDgpICgJWTMgPj4gMjQgKSBdIF4JXAorCQkJCSBGVDFbICh1aW50OCkgKAlZMCA+PiAxNiApIF0gXglcCisJCQkJIEZUMlsgKHVpbnQ4KSAoCVkxID4+ICA4ICkgXSBeCVwKKwkJCQkgRlQzWyAodWludDgpICgJWTIJCSApIF07CVwKK30KKworCUFFU19GUk9VTkQoCVkwLAlZMSwJWTIsCVkzLAlYMCwJWDEsCVgyLAlYMyApOwkJLyogcm91bmQgMSAqLworCUFFU19GUk9VTkQoCVgwLAlYMSwJWDIsCVgzLAlZMCwJWTEsCVkyLAlZMyApOwkJLyogcm91bmQgMiAqLworCUFFU19GUk9VTkQoCVkwLAlZMSwJWTIsCVkzLAlYMCwJWDEsCVgyLAlYMyApOwkJLyogcm91bmQgMyAqLworCUFFU19GUk9VTkQoCVgwLAlYMSwJWDIsCVgzLAlZMCwJWTEsCVkyLAlZMyApOwkJLyogcm91bmQgNCAqLworCUFFU19GUk9VTkQoCVkwLAlZMSwJWTIsCVkzLAlYMCwJWDEsCVgyLAlYMyApOwkJLyogcm91bmQgNSAqLworCUFFU19GUk9VTkQoCVgwLAlYMSwJWDIsCVgzLAlZMCwJWTEsCVkyLAlZMyApOwkJLyogcm91bmQgNiAqLworCUFFU19GUk9VTkQoCVkwLAlZMSwJWTIsCVkzLAlYMCwJWDEsCVgyLAlYMyApOwkJLyogcm91bmQgNyAqLworCUFFU19GUk9VTkQoCVgwLAlYMSwJWDIsCVgzLAlZMCwJWTEsCVkyLAlZMyApOwkJLyogcm91bmQgOCAqLworCUFFU19GUk9VTkQoCVkwLAlZMSwJWTIsCVkzLAlYMCwJWDEsCVgyLAlYMyApOwkJLyogcm91bmQgOSAqLworCisJaWYoCWN0eC0+bnIJPiAxMCApCisJeworCQlBRVNfRlJPVU5EKAlYMCwJWDEsCVgyLAlYMywJWTAsCVkxLAlZMiwJWTMgKTsJLyogcm91bmQgMTAJKi8KKwkJQUVTX0ZST1VORCgJWTAsCVkxLAlZMiwJWTMsCVgwLAlYMSwJWDIsCVgzICk7CS8qIHJvdW5kIDExCSovCisJfQorCisJaWYoCWN0eC0+bnIJPiAxMiApCisJeworCQlBRVNfRlJPVU5EKAlYMCwJWDEsCVgyLAlYMywJWTAsCVkxLAlZMiwJWTMgKTsJLyogcm91bmQgMTIJKi8KKwkJQUVTX0ZST1VORCgJWTAsCVkxLAlZMiwJWTMsCVgwLAlYMSwJWDIsCVgzICk7CS8qIHJvdW5kIDEzCSovCisJfQorCisJLyogbGFzdAlyb3VuZCAqLworCisJUksgKz0gNDsKKworCVgwID0gUktbMF0gXiAoIEZTYlsJKHVpbnQ4KQkoIFkwID4+CTI0ICkgXSA8PCAyNCApIF4KKwkJCQkgKCBGU2JbCSh1aW50OCkJKCBZMSA+PgkxNiApIF0gPDwgMTYgKSBeCisJCQkJICggRlNiWwkodWludDgpCSggWTIgPj4JIDggKSBdIDw8ICA4ICkgXgorCQkJCSAoIEZTYlsJKHVpbnQ4KQkoIFkzCSAgICkgXQkJICk7CisKKwlYMSA9IFJLWzFdIF4gKCBGU2JbCSh1aW50OCkJKCBZMSA+PgkyNCApIF0gPDwgMjQgKSBeCisJCQkJICggRlNiWwkodWludDgpCSggWTIgPj4JMTYgKSBdIDw8IDE2ICkgXgorCQkJCSAoIEZTYlsJKHVpbnQ4KQkoIFkzID4+CSA4ICkgXSA8PCAgOCApIF4KKwkJCQkgKCBGU2JbCSh1aW50OCkJKCBZMAkgICApIF0JCSApOworCisJWDIgPSBSS1syXSBeICggRlNiWwkodWludDgpCSggWTIgPj4JMjQgKSBdIDw8IDI0ICkgXgorCQkJCSAoIEZTYlsJKHVpbnQ4KQkoIFkzID4+CTE2ICkgXSA8PCAxNiApIF4KKwkJCQkgKCBGU2JbCSh1aW50OCkJKCBZMCA+PgkgOCApIF0gPDwgIDggKSBeCisJCQkJICggRlNiWwkodWludDgpCSggWTEJICAgKSBdCQkgKTsKKworCVgzID0gUktbM10gXiAoIEZTYlsJKHVpbnQ4KQkoIFkzID4+CTI0ICkgXSA8PCAyNCApIF4KKwkJCQkgKCBGU2JbCSh1aW50OCkJKCBZMCA+PgkxNiApIF0gPDwgMTYgKSBeCisJCQkJICggRlNiWwkodWludDgpCSggWTEgPj4JIDggKSBdIDw8ICA4ICkgXgorCQkJCSAoIEZTYlsJKHVpbnQ4KQkoIFkyCSAgICkgXQkJICk7CisKKwlQVVRfVUlOVDMyKAlYMCwJb3V0cHV0LAkgMCApOworCVBVVF9VSU5UMzIoCVgxLAlvdXRwdXQsCSA0ICk7CisJUFVUX1VJTlQzMigJWDIsCW91dHB1dCwJIDggKTsKKwlQVVRfVUlOVDMyKAlYMywJb3V0cHV0LAkxMiApOworfQorCisvKiBBRVMgMTI4LWJpdCBibG9jayBkZWNyeXB0aW9uCXJvdXRpbmUJKi8KKwordm9pZCBydG1wX2Flc19kZWNyeXB0KCBhZXNfY29udGV4dCAqY3R4LAl1aW50OCBpbnB1dFsxNl0sIHVpbnQ4IG91dHB1dFsxNl0gKQoreworCXVpbnQzMiAqUkssCVgwLAlYMSwJWDIsCVgzLAlZMCwJWTEsCVkyLAlZMzsKKworCVJLID0gY3R4LT5kcms7CisKKwlHRVRfVUlOVDMyKAlYMCwJaW5wdXQsCTAgKTsgWDAJXj0gUktbMF07CisJR0VUX1VJTlQzMigJWDEsCWlucHV0LAk0ICk7IFgxCV49IFJLWzFdOworCUdFVF9VSU5UMzIoCVgyLAlpbnB1dCwJOCApOyBYMglePSBSS1syXTsKKwlHRVRfVUlOVDMyKAlYMywJaW5wdXQsIDEyICk7IFgzCV49IFJLWzNdOworCisjZGVmaW5lCUFFU19SUk9VTkQoWDAsWDEsWDIsWDMsWTAsWTEsWTIsWTMpCQlcCit7CQkJCQkJCQkJCQkJXAorCVJLICs9IDQ7CQkJCQkJCQkJXAorCQkJCQkJCQkJCQkJXAorCVgwID0gUktbMF0gXiBSVDBbICh1aW50OCkgKAlZMCA+PiAyNCApIF0gXglcCisJCQkJIFJUMVsgKHVpbnQ4KSAoCVkzID4+IDE2ICkgXSBeCVwKKwkJCQkgUlQyWyAodWludDgpICgJWTIgPj4gIDggKSBdIF4JXAorCQkJCSBSVDNbICh1aW50OCkgKAlZMQkJICkgXTsJXAorCQkJCQkJCQkJCQkJXAorCVgxID0gUktbMV0gXiBSVDBbICh1aW50OCkgKAlZMSA+PiAyNCApIF0gXglcCisJCQkJIFJUMVsgKHVpbnQ4KSAoCVkwID4+IDE2ICkgXSBeCVwKKwkJCQkgUlQyWyAodWludDgpICgJWTMgPj4gIDggKSBdIF4JXAorCQkJCSBSVDNbICh1aW50OCkgKAlZMgkJICkgXTsJXAorCQkJCQkJCQkJCQkJXAorCVgyID0gUktbMl0gXiBSVDBbICh1aW50OCkgKAlZMiA+PiAyNCApIF0gXglcCisJCQkJIFJUMVsgKHVpbnQ4KSAoCVkxID4+IDE2ICkgXSBeCVwKKwkJCQkgUlQyWyAodWludDgpICgJWTAgPj4gIDggKSBdIF4JXAorCQkJCSBSVDNbICh1aW50OCkgKAlZMwkJICkgXTsJXAorCQkJCQkJCQkJCQkJXAorCVgzID0gUktbM10gXiBSVDBbICh1aW50OCkgKAlZMyA+PiAyNCApIF0gXglcCisJCQkJIFJUMVsgKHVpbnQ4KSAoCVkyID4+IDE2ICkgXSBeCVwKKwkJCQkgUlQyWyAodWludDgpICgJWTEgPj4gIDggKSBdIF4JXAorCQkJCSBSVDNbICh1aW50OCkgKAlZMAkJICkgXTsJXAorfQorCisJQUVTX1JST1VORCgJWTAsCVkxLAlZMiwJWTMsCVgwLAlYMSwJWDIsCVgzICk7CQkvKiByb3VuZCAxICovCisJQUVTX1JST1VORCgJWDAsCVgxLAlYMiwJWDMsCVkwLAlZMSwJWTIsCVkzICk7CQkvKiByb3VuZCAyICovCisJQUVTX1JST1VORCgJWTAsCVkxLAlZMiwJWTMsCVgwLAlYMSwJWDIsCVgzICk7CQkvKiByb3VuZCAzICovCisJQUVTX1JST1VORCgJWDAsCVgxLAlYMiwJWDMsCVkwLAlZMSwJWTIsCVkzICk7CQkvKiByb3VuZCA0ICovCisJQUVTX1JST1VORCgJWTAsCVkxLAlZMiwJWTMsCVgwLAlYMSwJWDIsCVgzICk7CQkvKiByb3VuZCA1ICovCisJQUVTX1JST1VORCgJWDAsCVgxLAlYMiwJWDMsCVkwLAlZMSwJWTIsCVkzICk7CQkvKiByb3VuZCA2ICovCisJQUVTX1JST1VORCgJWTAsCVkxLAlZMiwJWTMsCVgwLAlYMSwJWDIsCVgzICk7CQkvKiByb3VuZCA3ICovCisJQUVTX1JST1VORCgJWDAsCVgxLAlYMiwJWDMsCVkwLAlZMSwJWTIsCVkzICk7CQkvKiByb3VuZCA4ICovCisJQUVTX1JST1VORCgJWTAsCVkxLAlZMiwJWTMsCVgwLAlYMSwJWDIsCVgzICk7CQkvKiByb3VuZCA5ICovCisKKwlpZigJY3R4LT5ucgk+IDEwICkKKwl7CisJCUFFU19SUk9VTkQoCVgwLAlYMSwJWDIsCVgzLAlZMCwJWTEsCVkyLAlZMyApOwkvKiByb3VuZCAxMAkqLworCQlBRVNfUlJPVU5EKAlZMCwJWTEsCVkyLAlZMywJWDAsCVgxLAlYMiwJWDMgKTsJLyogcm91bmQgMTEJKi8KKwl9CisKKwlpZigJY3R4LT5ucgk+IDEyICkKKwl7CisJCUFFU19SUk9VTkQoCVgwLAlYMSwJWDIsCVgzLAlZMCwJWTEsCVkyLAlZMyApOwkvKiByb3VuZCAxMgkqLworCQlBRVNfUlJPVU5EKAlZMCwJWTEsCVkyLAlZMywJWDAsCVgxLAlYMiwJWDMgKTsJLyogcm91bmQgMTMJKi8KKwl9CisKKwkvKiBsYXN0CXJvdW5kICovCisKKwlSSyArPSA0OworCisJWDAgPSBSS1swXSBeICggUlNiWwkodWludDgpCSggWTAgPj4JMjQgKSBdIDw8IDI0ICkgXgorCQkJCSAoIFJTYlsJKHVpbnQ4KQkoIFkzID4+CTE2ICkgXSA8PCAxNiApIF4KKwkJCQkgKCBSU2JbCSh1aW50OCkJKCBZMiA+PgkgOCApIF0gPDwgIDggKSBeCisJCQkJICggUlNiWwkodWludDgpCSggWTEJICAgKSBdCQkgKTsKKworCVgxID0gUktbMV0gXiAoIFJTYlsJKHVpbnQ4KQkoIFkxID4+CTI0ICkgXSA8PCAyNCApIF4KKwkJCQkgKCBSU2JbCSh1aW50OCkJKCBZMCA+PgkxNiApIF0gPDwgMTYgKSBeCisJCQkJICggUlNiWwkodWludDgpCSggWTMgPj4JIDggKSBdIDw8ICA4ICkgXgorCQkJCSAoIFJTYlsJKHVpbnQ4KQkoIFkyCSAgICkgXQkJICk7CisKKwlYMiA9IFJLWzJdIF4gKCBSU2JbCSh1aW50OCkJKCBZMiA+PgkyNCApIF0gPDwgMjQgKSBeCisJCQkJICggUlNiWwkodWludDgpCSggWTEgPj4JMTYgKSBdIDw8IDE2ICkgXgorCQkJCSAoIFJTYlsJKHVpbnQ4KQkoIFkwID4+CSA4ICkgXSA8PCAgOCApIF4KKwkJCQkgKCBSU2JbCSh1aW50OCkJKCBZMwkgICApIF0JCSApOworCisJWDMgPSBSS1szXSBeICggUlNiWwkodWludDgpCSggWTMgPj4JMjQgKSBdIDw8IDI0ICkgXgorCQkJCSAoIFJTYlsJKHVpbnQ4KQkoIFkyID4+CTE2ICkgXSA8PCAxNiApIF4KKwkJCQkgKCBSU2JbCSh1aW50OCkJKCBZMSA+PgkgOCApIF0gPDwgIDggKSBeCisJCQkJICggUlNiWwkodWludDgpCSggWTAJICAgKSBdCQkgKTsKKworCVBVVF9VSU5UMzIoCVgwLAlvdXRwdXQsCSAwICk7CisJUFVUX1VJTlQzMigJWDEsCW91dHB1dCwJIDQgKTsKKwlQVVRfVUlOVDMyKAlYMiwJb3V0cHV0LAkgOCApOworCVBVVF9VSU5UMzIoCVgzLAlvdXRwdXQsCTEyICk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlTSEExIGZ1bmN0aW9uCisKKwlBcmd1bWVudHM6CisKKwlSZXR1cm4gVmFsdWU6CisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlITUFDX1NIQTEoCisJSU4JVUNIQVIJKnRleHQsCisJSU4JVUlOVAl0ZXh0X2xlbiwKKwlJTglVQ0hBUgkqa2V5LAorCUlOCVVJTlQJa2V5X2xlbiwKKwlJTglVQ0hBUgkqZGlnZXN0KQoreworCVNIQV9DVFgJY29udGV4dDsKKwlVQ0hBUglrX2lwYWRbNjVdOyAvKiBpbm5lciBwYWRkaW5nIC0ga2V5IFhPUmQgd2l0aCBpcGFkCSovCisJVUNIQVIJa19vcGFkWzY1XTsgLyogb3V0ZXIgcGFkZGluZyAtIGtleSBYT1JkIHdpdGggb3BhZAkqLworCUlOVAkJaTsKKworCS8vIGlmIGtleSBpcyBsb25nZXIJdGhhbiA2NAlieXRlcyByZXNldAlpdCB0byBrZXk9U0hBMShrZXkpCisJaWYgKGtleV9sZW4JPiA2NCkKKwl7CisJCVNIQV9DVFgJCSB0Y3R4OworCQlTSEFJbml0KCZ0Y3R4KTsKKwkJU0hBVXBkYXRlKCZ0Y3R4LCBrZXksIGtleV9sZW4pOworCQlTSEFGaW5hbCgmdGN0eCwJa2V5KTsKKwkJa2V5X2xlbgk9IDIwOworCX0KKwlOZGlzWmVyb01lbW9yeShrX2lwYWQsIHNpemVvZihrX2lwYWQpKTsKKwlOZGlzWmVyb01lbW9yeShrX29wYWQsIHNpemVvZihrX29wYWQpKTsKKwlOZGlzTW92ZU1lbW9yeShrX2lwYWQsIGtleSwJa2V5X2xlbik7CisJTmRpc01vdmVNZW1vcnkoa19vcGFkLCBrZXksCWtleV9sZW4pOworCisJLy8gWE9SIGtleSB3aXRoCWlwYWQgYW5kIG9wYWQgdmFsdWVzCisJZm9yCShpID0gMDsJaSA8CTY0OwlpKyspCisJeworCQlrX2lwYWRbaV0gXj0gMHgzNjsKKwkJa19vcGFkW2ldIF49IDB4NWM7CisJfQorCisJLy8gcGVyZm9ybSBpbm5lciBTSEExCisJU0hBSW5pdCgmY29udGV4dCk7IAkJCQkJCS8qIGluaXQgY29udGV4dCBmb3IgMXN0IHBhc3MgKi8KKwlTSEFVcGRhdGUoJmNvbnRleHQsCWtfaXBhZCwJNjQpOwkJLyoJc3RhcnQgd2l0aCBpbm5lciBwYWQgKi8KKwlTSEFVcGRhdGUoJmNvbnRleHQsCXRleHQsIHRleHRfbGVuKTsJLyoJdGhlbiB0ZXh0IG9mIGRhdGFncmFtICovCisJU0hBRmluYWwoJmNvbnRleHQsIGRpZ2VzdCk7CQkJCS8qIGZpbmlzaCB1cCAxc3QgcGFzcyAqLworCisJLy9wZXJmb3JtIG91dGVyCVNIQTEKKwlTSEFJbml0KCZjb250ZXh0KTsJCQkJCS8qIGluaXQgY29udGV4dCBmb3IgMm5kIHBhc3MgKi8KKwlTSEFVcGRhdGUoJmNvbnRleHQsCWtfb3BhZCwJNjQpOwkvKglzdGFydCB3aXRoIG91dGVyIHBhZCAqLworCVNIQVVwZGF0ZSgmY29udGV4dCwJZGlnZXN0LAkyMCk7CS8qCXRoZW4gcmVzdWx0cyBvZgkxc3QJaGFzaCAqLworCVNIQUZpbmFsKCZjb250ZXh0LCBkaWdlc3QpOwkJCS8qIGZpbmlzaCB1cCAybmQgcGFzcyAqLworCit9CisKKy8qCisqIEYoUCwgUywgYywgaSkgPSBVMSB4b3IgVTIgeG9yIC4uLiBVYworKiBVMSA9IFBSRihQLCBTIHx8IEludChpKSkKKyogVTIgPSBQUkYoUCwgVTEpCisqIFVjID0gUFJGKFAsIFVjLTEpCisqLworCit2b2lkIEYoY2hhciAqcGFzc3dvcmQsIHVuc2lnbmVkIGNoYXIgKnNzaWQsIGludCBzc2lkbGVuZ3RoLCBpbnQgaXRlcmF0aW9ucywgaW50IGNvdW50LCB1bnNpZ25lZCBjaGFyICpvdXRwdXQpCit7CisgICAgdW5zaWduZWQgY2hhciBkaWdlc3RbMzZdLCBkaWdlc3QxW1NIQV9ESUdFU1RfTEVOXTsKKyAgICBpbnQgaSwgajsKKworICAgIC8qIFUxID0gUFJGKFAsIFMgfHwgaW50KGkpKSAqLworICAgIG1lbWNweShkaWdlc3QsIHNzaWQsIHNzaWRsZW5ndGgpOworICAgIGRpZ2VzdFtzc2lkbGVuZ3RoXSA9ICh1bnNpZ25lZCBjaGFyKSgoY291bnQ+PjI0KSAmIDB4ZmYpOworICAgIGRpZ2VzdFtzc2lkbGVuZ3RoKzFdID0gKHVuc2lnbmVkIGNoYXIpKChjb3VudD4+MTYpICYgMHhmZik7CisgICAgZGlnZXN0W3NzaWRsZW5ndGgrMl0gPSAodW5zaWduZWQgY2hhcikoKGNvdW50Pj44KSAmIDB4ZmYpOworICAgIGRpZ2VzdFtzc2lkbGVuZ3RoKzNdID0gKHVuc2lnbmVkIGNoYXIpKGNvdW50ICYgMHhmZik7CisgICAgSE1BQ19TSEExKGRpZ2VzdCwgc3NpZGxlbmd0aCs0LCAodW5zaWduZWQgY2hhciopIHBhc3N3b3JkLCAoaW50KSBzdHJsZW4ocGFzc3dvcmQpLCBkaWdlc3QxKTsgLy8gZm9yIFdQQSB1cGRhdGUKKworICAgIC8qIG91dHB1dCA9IFUxICovCisgICAgbWVtY3B5KG91dHB1dCwgZGlnZXN0MSwgU0hBX0RJR0VTVF9MRU4pOworCisgICAgZm9yIChpID0gMTsgaSA8IGl0ZXJhdGlvbnM7IGkrKykKKyAgICB7CisgICAgICAgIC8qIFVuID0gUFJGKFAsIFVuLTEpICovCisgICAgICAgIEhNQUNfU0hBMShkaWdlc3QxLCBTSEFfRElHRVNUX0xFTiwgKHVuc2lnbmVkIGNoYXIqKSBwYXNzd29yZCwgKGludCkgc3RybGVuKHBhc3N3b3JkKSwgZGlnZXN0KTsgLy8gZm9yIFdQQSB1cGRhdGUKKyAgICAgICAgbWVtY3B5KGRpZ2VzdDEsIGRpZ2VzdCwgU0hBX0RJR0VTVF9MRU4pOworCisgICAgICAgIC8qIG91dHB1dCA9IG91dHB1dCB4b3IgVW4gKi8KKyAgICAgICAgZm9yIChqID0gMDsgaiA8IFNIQV9ESUdFU1RfTEVOOyBqKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dHB1dFtqXSBePSBkaWdlc3Rbal07CisgICAgICAgIH0KKyAgICB9Cit9CisvKgorKiBwYXNzd29yZCAtIGFzY2lpIHN0cmluZyB1cCB0byA2MyBjaGFyYWN0ZXJzIGluIGxlbmd0aAorKiBzc2lkIC0gb2N0ZXQgc3RyaW5nIHVwIHRvIDMyIG9jdGV0cworKiBzc2lkbGVuZ3RoIC0gbGVuZ3RoIG9mIHNzaWQgaW4gb2N0ZXRzCisqIG91dHB1dCBtdXN0IGJlIDQwIG9jdGV0cyBpbiBsZW5ndGggYW5kIG91dHB1dHMgMjU2IGJpdHMgb2Yga2V5CisqLworaW50IFBhc3N3b3JkSGFzaChjaGFyICpwYXNzd29yZCwgdW5zaWduZWQgY2hhciAqc3NpZCwgaW50IHNzaWRsZW5ndGgsIHVuc2lnbmVkIGNoYXIgKm91dHB1dCkKK3sKKyAgICBpZiAoKHN0cmxlbihwYXNzd29yZCkgPiA2MykgfHwgKHNzaWRsZW5ndGggPiAzMikpCisgICAgICAgIHJldHVybiAwOworCisgICAgRihwYXNzd29yZCwgc3NpZCwgc3NpZGxlbmd0aCwgNDA5NiwgMSwgb3V0cHV0KTsKKyAgICBGKHBhc3N3b3JkLCBzc2lkLCBzc2lkbGVuZ3RoLCA0MDk2LCAyLCAmb3V0cHV0W1NIQV9ESUdFU1RfTEVOXSk7CisgICAgcmV0dXJuIDE7Cit9CisKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vbWxtZS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vbWxtZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyOTc0NzAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9tbG1lLmMKQEAgLTAsMCArMSw4NjY3IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCU1vZHVsZSBOYW1lOgorCW1sbWUuYworCisJQWJzdHJhY3Q6CisKKwlSZXZpc2lvbiBIaXN0b3J5OgorCVdobwkJCVdoZW4JCQlXaGF0CisJLS0tLS0tLS0JLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCUpvaG4gQ2hhbmcJMjAwNC0wOC0yNQkJTW9kaWZ5IGZyb20gUlQyNTAwIGNvZGUgYmFzZQorCUpvaG4gQ2hhbmcJMjAwNC0wOS0wNgkJbW9kaWZpZWQgZm9yIFJUMjYwMAorKi8KKworI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorCitVQ0hBUglDSVNDT19PVUlbXSA9IHsweDAwLCAweDQwLCAweDk2fTsKKworVUNIQVIJV1BBX09VSVtdID0gezB4MDAsIDB4NTAsIDB4ZjIsIDB4MDF9OworVUNIQVIJUlNOX09VSVtdID0gezB4MDAsIDB4MGYsIDB4YWN9OworVUNIQVIJV0FQSV9PVUlbXSA9IHsweDAwLCAweDE0LCAweDcyfTsKK1VDSEFSICAgV01FX0lORk9fRUxFTVtdICA9IHsweDAwLCAweDUwLCAweGYyLCAweDAyLCAweDAwLCAweDAxfTsKK1VDSEFSICAgV01FX1BBUk1fRUxFTVtdID0gezB4MDAsIDB4NTAsIDB4ZjIsIDB4MDIsIDB4MDEsIDB4MDF9OworVUNIQVIJQ2N4MlFvc0luZm9bXSA9IHsweDAwLCAweDQwLCAweDk2LCAweDA0fTsKK1VDSEFSICAgUkFMSU5LX09VSVtdICA9IHsweDAwLCAweDBjLCAweDQzfTsKK1VDSEFSICAgQlJPQURDT01fT1VJW10gID0gezB4MDAsIDB4OTAsIDB4NGN9OworVUNIQVIgICBXUFNfT1VJW10gPSB7MHgwMCwgMHg1MCwgMHhmMiwgMHgwNH07CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCitVQ0hBUglQUkVfTl9IVF9PVUlbXQk9IHsweDAwLCAweDkwLCAweDRjfTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworVUNIQVIgUmF0ZVN3aXRjaFRhYmxlW10gPSB7CisvLyBJdGVtIE5vLiAgIE1vZGUgICBDdXJyLU1DUyAgIFRyYWluVXAgICBUcmFpbkRvd24JCS8vIE1vZGUtIEJpdDA6IFNUQkMsIEJpdDE6IFNob3J0IEdJLCBCaXQ0LDU6IE1vZGUoMDpDQ0ssIDE6T0ZETSwgMjpIVCBNaXgsIDM6SFQgR0YpCisgICAgMHgxMSwgMHgwMCwgIDAsICAwLCAgMCwJCQkJCQkvLyBJbml0aWFsIHVzZWQgaXRlbSBhZnRlciBhc3NvY2lhdGlvbgorICAgIDB4MDAsIDB4MDAsICAwLCA0MCwgMTAxLAorICAgIDB4MDEsIDB4MDAsICAxLCA0MCwgNTAsCisgICAgMHgwMiwgMHgwMCwgIDIsIDM1LCA0NSwKKyAgICAweDAzLCAweDAwLCAgMywgMjAsIDQ1LAorICAgIDB4MDQsIDB4MjEsICAwLCAzMCwgNTAsCisgICAgMHgwNSwgMHgyMSwgIDEsIDIwLCA1MCwKKyAgICAweDA2LCAweDIxLCAgMiwgMjAsIDUwLAorICAgIDB4MDcsIDB4MjEsICAzLCAxNSwgNTAsCisgICAgMHgwOCwgMHgyMSwgIDQsIDE1LCAzMCwKKyAgICAweDA5LCAweDIxLCAgNSwgMTAsIDI1LAorICAgIDB4MGEsIDB4MjEsICA2LCAgOCwgMjUsCisgICAgMHgwYiwgMHgyMSwgIDcsICA4LCAyNSwKKyAgICAweDBjLCAweDIwLCAxMiwgIDE1LCAzMCwKKyAgICAweDBkLCAweDIwLCAxMywgIDgsIDIwLAorICAgIDB4MGUsIDB4MjAsIDE0LCAgOCwgMjAsCisgICAgMHgwZiwgMHgyMCwgMTUsICA4LCAyNSwKKyAgICAweDEwLCAweDIyLCAxNSwgIDgsIDI1LAorICAgIDB4MTEsIDB4MDAsICAwLCAgMCwgIDAsCisgICAgMHgxMiwgMHgwMCwgIDAsICAwLCAgMCwKKyAgICAweDEzLCAweDAwLCAgMCwgIDAsICAwLAorICAgIDB4MTQsIDB4MDAsICAwLCAgMCwgIDAsCisgICAgMHgxNSwgMHgwMCwgIDAsICAwLCAgMCwKKyAgICAweDE2LCAweDAwLCAgMCwgIDAsICAwLAorICAgIDB4MTcsIDB4MDAsICAwLCAgMCwgIDAsCisgICAgMHgxOCwgMHgwMCwgIDAsICAwLCAgMCwKKyAgICAweDE5LCAweDAwLCAgMCwgIDAsICAwLAorICAgIDB4MWEsIDB4MDAsICAwLCAgMCwgIDAsCisgICAgMHgxYiwgMHgwMCwgIDAsICAwLCAgMCwKKyAgICAweDFjLCAweDAwLCAgMCwgIDAsICAwLAorICAgIDB4MWQsIDB4MDAsICAwLCAgMCwgIDAsCisgICAgMHgxZSwgMHgwMCwgIDAsICAwLCAgMCwKKyAgICAweDFmLCAweDAwLCAgMCwgIDAsICAwLAorfTsKKworVUNIQVIgUmF0ZVN3aXRjaFRhYmxlMTFCW10gPSB7CisvLyBJdGVtIE5vLiAgIE1vZGUgICBDdXJyLU1DUyAgIFRyYWluVXAgICBUcmFpbkRvd24JCS8vIE1vZGUtIEJpdDA6IFNUQkMsIEJpdDE6IFNob3J0IEdJLCBCaXQ0LDU6IE1vZGUoMDpDQ0ssIDE6T0ZETSwgMjpIVCBNaXgsIDM6SFQgR0YpCisgICAgMHgwNCwgMHgwMywgIDAsICAwLCAgMCwJCQkJCQkvLyBJbml0aWFsIHVzZWQgaXRlbSBhZnRlciBhc3NvY2lhdGlvbgorICAgIDB4MDAsIDB4MDAsICAwLCA0MCwgMTAxLAorICAgIDB4MDEsIDB4MDAsICAxLCA0MCwgNTAsCisgICAgMHgwMiwgMHgwMCwgIDIsIDM1LCA0NSwKKyAgICAweDAzLCAweDAwLCAgMywgMjAsIDQ1LAorfTsKKworVUNIQVIgUmF0ZVN3aXRjaFRhYmxlMTFCR1tdID0geworLy8gSXRlbSBOby4gICBNb2RlICAgQ3Vyci1NQ1MgICBUcmFpblVwICAgVHJhaW5Eb3duCQkvLyBNb2RlLSBCaXQwOiBTVEJDLCBCaXQxOiBTaG9ydCBHSSwgQml0NCw1OiBNb2RlKDA6Q0NLLCAxOk9GRE0sIDI6SFQgTWl4LCAzOkhUIEdGKQorICAgIDB4MGEsIDB4MDAsICAwLCAgMCwgIDAsCQkJCQkJLy8gSW5pdGlhbCB1c2VkIGl0ZW0gYWZ0ZXIgYXNzb2NpYXRpb24KKyAgICAweDAwLCAweDAwLCAgMCwgNDAsIDEwMSwKKyAgICAweDAxLCAweDAwLCAgMSwgNDAsIDUwLAorICAgIDB4MDIsIDB4MDAsICAyLCAzNSwgNDUsCisgICAgMHgwMywgMHgwMCwgIDMsIDIwLCA0NSwKKyAgICAweDA0LCAweDEwLCAgMiwgMjAsIDM1LAorICAgIDB4MDUsIDB4MTAsICAzLCAxNiwgMzUsCisgICAgMHgwNiwgMHgxMCwgIDQsIDEwLCAyNSwKKyAgICAweDA3LCAweDEwLCAgNSwgMTYsIDI1LAorICAgIDB4MDgsIDB4MTAsICA2LCAxMCwgMjUsCisgICAgMHgwOSwgMHgxMCwgIDcsIDEwLCAxMywKK307CisKK1VDSEFSIFJhdGVTd2l0Y2hUYWJsZTExR1tdID0geworLy8gSXRlbSBOby4gICBNb2RlICAgQ3Vyci1NQ1MgICBUcmFpblVwICAgVHJhaW5Eb3duCQkvLyBNb2RlLSBCaXQwOiBTVEJDLCBCaXQxOiBTaG9ydCBHSSwgQml0NCw1OiBNb2RlKDA6Q0NLLCAxOk9GRE0sIDI6SFQgTWl4LCAzOkhUIEdGKQorICAgIDB4MDgsIDB4MDAsICAwLCAgMCwgIDAsCQkJCQkJLy8gSW5pdGlhbCB1c2VkIGl0ZW0gYWZ0ZXIgYXNzb2NpYXRpb24KKyAgICAweDAwLCAweDEwLCAgMCwgMjAsIDEwMSwKKyAgICAweDAxLCAweDEwLCAgMSwgMjAsIDM1LAorICAgIDB4MDIsIDB4MTAsICAyLCAyMCwgMzUsCisgICAgMHgwMywgMHgxMCwgIDMsIDE2LCAzNSwKKyAgICAweDA0LCAweDEwLCAgNCwgMTAsIDI1LAorICAgIDB4MDUsIDB4MTAsICA1LCAxNiwgMjUsCisgICAgMHgwNiwgMHgxMCwgIDYsIDEwLCAyNSwKKyAgICAweDA3LCAweDEwLCAgNywgMTAsIDEzLAorfTsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorVUNIQVIgUmF0ZVN3aXRjaFRhYmxlMTFOMVNbXSA9IHsKKy8vIEl0ZW0gTm8uICAgTW9kZSAgIEN1cnItTUNTICAgVHJhaW5VcCAgIFRyYWluRG93bgkJLy8gTW9kZS0gQml0MDogU1RCQywgQml0MTogU2hvcnQgR0ksIEJpdDQsNTogTW9kZSgwOkNDSywgMTpPRkRNLCAyOkhUIE1peCwgMzpIVCBHRikKKyAgICAweDA5LCAweDAwLCAgMCwgIDAsICAwLAkJCQkJCS8vIEluaXRpYWwgdXNlZCBpdGVtIGFmdGVyIGFzc29jaWF0aW9uCisgICAgMHgwMCwgMHgyMSwgIDAsIDMwLCAxMDEsCisgICAgMHgwMSwgMHgyMSwgIDEsIDIwLCA1MCwKKyAgICAweDAyLCAweDIxLCAgMiwgMjAsIDUwLAorICAgIDB4MDMsIDB4MjEsICAzLCAxNSwgNTAsCisgICAgMHgwNCwgMHgyMSwgIDQsIDE1LCAzMCwKKyAgICAweDA1LCAweDIxLCAgNSwgMTAsIDI1LAorICAgIDB4MDYsIDB4MjEsICA2LCAgOCwgMTQsCisgICAgMHgwNywgMHgyMSwgIDcsICA4LCAxNCwKKyAgICAweDA4LCAweDIzLCAgNywgIDgsIDE0LAorfTsKKworVUNIQVIgUmF0ZVN3aXRjaFRhYmxlMTFOMlNbXSA9IHsKKy8vIEl0ZW0gTm8uICAgTW9kZSAgIEN1cnItTUNTICAgVHJhaW5VcCAgIFRyYWluRG93bgkJLy8gTW9kZS0gQml0MDogU1RCQywgQml0MTogU2hvcnQgR0ksIEJpdDQsNTogTW9kZSgwOkNDSywgMTpPRkRNLCAyOkhUIE1peCwgMzpIVCBHRikKKyAgICAweDBhLCAweDAwLCAgMCwgIDAsICAwLCAgICAgIC8vIEluaXRpYWwgdXNlZCBpdGVtIGFmdGVyIGFzc29jaWF0aW9uCisgICAgMHgwMCwgMHgyMSwgIDAsIDMwLCAxMDEsCisgICAgMHgwMSwgMHgyMSwgIDEsIDIwLCA1MCwKKyAgICAweDAyLCAweDIxLCAgMiwgMjAsIDUwLAorICAgIDB4MDMsIDB4MjEsICAzLCAxNSwgNTAsCisgICAgMHgwNCwgMHgyMSwgIDQsIDE1LCAzMCwKKyAgICAweDA1LCAweDIwLCAxMiwgIDE1LCAzMCwKKyAgICAweDA2LCAweDIwLCAxMywgIDgsIDIwLAorICAgIDB4MDcsIDB4MjAsIDE0LCAgOCwgMjAsCisgICAgMHgwOCwgMHgyMCwgMTUsICA4LCAyNSwKKyAgICAweDA5LCAweDIyLCAxNSwgIDgsIDI1LAorfTsKKworVUNIQVIgUmF0ZVN3aXRjaFRhYmxlMTFOM1NbXSA9IHsKKy8vIEl0ZW0gTm8uCU1vZGUJQ3Vyci1NQ1MJVHJhaW5VcAlUcmFpbkRvd24JLy8gTW9kZS0gQml0MDogU1RCQywgQml0MTogU2hvcnQgR0ksIEJpdDQsNTogTW9kZSgwOkNDSywgMTpPRkRNLCAyOkhUIE1peCwgMzpIVCBHRikKKyAgICAweDBhLCAweDAwLCAgMCwgIDAsICAwLCAgICAgIC8vIEluaXRpYWwgdXNlZCBpdGVtIGFmdGVyIGFzc29jaWF0aW9uCisgICAgMHgwMCwgMHgyMSwgIDAsIDMwLCAxMDEsCisgICAgMHgwMSwgMHgyMSwgIDEsIDIwLCA1MCwKKyAgICAweDAyLCAweDIxLCAgMiwgMjAsIDUwLAorICAgIDB4MDMsIDB4MjEsICAzLCAxNSwgNTAsCisgICAgMHgwNCwgMHgyMSwgIDQsIDE1LCAzMCwKKyAgICAweDA1LCAweDIwLCAxMiwgIDE1LCAzMCwKKyAgICAweDA2LCAweDIwLCAxMywgIDgsIDIwLAorICAgIDB4MDcsIDB4MjAsIDE0LCAgOCwgMjAsCisgICAgMHgwOCwgMHgyMCwgMTUsICA4LCAyNSwKKyAgICAweDA5LCAweDIyLCAxNSwgIDgsIDI1LAorfTsKKworVUNIQVIgUmF0ZVN3aXRjaFRhYmxlMTFOMlNGb3JBQmFuZFtdID0geworLy8gSXRlbSBOby4gICBNb2RlICAgQ3Vyci1NQ1MgICBUcmFpblVwICAgVHJhaW5Eb3duCQkvLyBNb2RlLSBCaXQwOiBTVEJDLCBCaXQxOiBTaG9ydCBHSSwgQml0NCw1OiBNb2RlKDA6Q0NLLCAxOk9GRE0sIDI6SFQgTWl4LCAzOkhUIEdGKQorICAgIDB4MGIsIDB4MDksICAwLCAgMCwgIDAsCQkJCQkJLy8gSW5pdGlhbCB1c2VkIGl0ZW0gYWZ0ZXIgYXNzb2NpYXRpb24KKyAgICAweDAwLCAweDIxLCAgMCwgMzAsIDEwMSwKKyAgICAweDAxLCAweDIxLCAgMSwgMjAsIDUwLAorICAgIDB4MDIsIDB4MjEsICAyLCAyMCwgNTAsCisgICAgMHgwMywgMHgyMSwgIDMsIDE1LCA1MCwKKyAgICAweDA0LCAweDIxLCAgNCwgMTUsIDMwLAorICAgIDB4MDUsIDB4MjEsICA1LCAxNSwgMzAsCisgICAgMHgwNiwgMHgyMCwgMTIsICAxNSwgMzAsCisgICAgMHgwNywgMHgyMCwgMTMsICA4LCAyMCwKKyAgICAweDA4LCAweDIwLCAxNCwgIDgsIDIwLAorICAgIDB4MDksIDB4MjAsIDE1LCAgOCwgMjUsCisgICAgMHgwYSwgMHgyMiwgMTUsICA4LCAyNSwKK307CisKK1VDSEFSIFJhdGVTd2l0Y2hUYWJsZTExTjNTRm9yQUJhbmRbXSA9IHsgLy8gMyozCisvLyBJdGVtIE5vLiAgIE1vZGUgICBDdXJyLU1DUyAgIFRyYWluVXAgICBUcmFpbkRvd24JCS8vIE1vZGUtIEJpdDA6IFNUQkMsIEJpdDE6IFNob3J0IEdJLCBCaXQ0LDU6IE1vZGUoMDpDQ0ssIDE6T0ZETSwgMjpIVCBNaXgsIDM6SFQgR0YpCisgICAgMHgwYiwgMHgwOSwgIDAsICAwLCAgMCwJCQkJCQkvLyBJbml0aWFsIHVzZWQgaXRlbSBhZnRlciBhc3NvY2lhdGlvbgorICAgIDB4MDAsIDB4MjEsICAwLCAzMCwgMTAxLAorICAgIDB4MDEsIDB4MjEsICAxLCAyMCwgNTAsCisgICAgMHgwMiwgMHgyMSwgIDIsIDIwLCA1MCwKKyAgICAweDAzLCAweDIxLCAgMywgMTUsIDUwLAorICAgIDB4MDQsIDB4MjEsICA0LCAxNSwgMzAsCisgICAgMHgwNSwgMHgyMSwgIDUsIDE1LCAzMCwKKyAgICAweDA2LCAweDIwLCAxMiwgIDE1LCAzMCwKKyAgICAweDA3LCAweDIwLCAxMywgIDgsIDIwLAorICAgIDB4MDgsIDB4MjAsIDE0LCAgOCwgMjAsCisgICAgMHgwOSwgMHgyMCwgMTUsICA4LCAyNSwKKyAgICAweDBhLCAweDIyLCAxNSwgIDgsIDI1LAorfTsKKworVUNIQVIgUmF0ZVN3aXRjaFRhYmxlMTFCR04xU1tdID0geworLy8gSXRlbSBOby4gICBNb2RlICAgQ3Vyci1NQ1MgICBUcmFpblVwICAgVHJhaW5Eb3duCQkvLyBNb2RlLSBCaXQwOiBTVEJDLCBCaXQxOiBTaG9ydCBHSSwgQml0NCw1OiBNb2RlKDA6Q0NLLCAxOk9GRE0sIDI6SFQgTWl4LCAzOkhUIEdGKQorICAgIDB4MGQsIDB4MDAsICAwLCAgMCwgIDAsCQkJCQkJLy8gSW5pdGlhbCB1c2VkIGl0ZW0gYWZ0ZXIgYXNzb2NpYXRpb24KKyAgICAweDAwLCAweDAwLCAgMCwgNDAsIDEwMSwKKyAgICAweDAxLCAweDAwLCAgMSwgNDAsIDUwLAorICAgIDB4MDIsIDB4MDAsICAyLCAzNSwgNDUsCisgICAgMHgwMywgMHgwMCwgIDMsIDIwLCA0NSwKKyAgICAweDA0LCAweDIxLCAgMCwgMzAsMTAxLAkvLzUwCisgICAgMHgwNSwgMHgyMSwgIDEsIDIwLCA1MCwKKyAgICAweDA2LCAweDIxLCAgMiwgMjAsIDUwLAorICAgIDB4MDcsIDB4MjEsICAzLCAxNSwgNTAsCisgICAgMHgwOCwgMHgyMSwgIDQsIDE1LCAzMCwKKyAgICAweDA5LCAweDIxLCAgNSwgMTAsIDI1LAorICAgIDB4MGEsIDB4MjEsICA2LCAgOCwgMTQsCisgICAgMHgwYiwgMHgyMSwgIDcsICA4LCAxNCwKKwkweDBjLCAweDIzLCAgNywgIDgsIDE0LAorfTsKKworVUNIQVIgUmF0ZVN3aXRjaFRhYmxlMTFCR04yU1tdID0geworLy8gSXRlbSBOby4gICBNb2RlICAgQ3Vyci1NQ1MgICBUcmFpblVwICAgVHJhaW5Eb3duCQkvLyBNb2RlLSBCaXQwOiBTVEJDLCBCaXQxOiBTaG9ydCBHSSwgQml0NCw1OiBNb2RlKDA6Q0NLLCAxOk9GRE0sIDI6SFQgTWl4LCAzOkhUIEdGKQorICAgIDB4MGEsIDB4MDAsICAwLCAgMCwgIDAsCQkJCQkJLy8gSW5pdGlhbCB1c2VkIGl0ZW0gYWZ0ZXIgYXNzb2NpYXRpb24KKyAgICAweDAwLCAweDIxLCAgMCwgMzAsMTAxLAkvLzUwCisgICAgMHgwMSwgMHgyMSwgIDEsIDIwLCA1MCwKKyAgICAweDAyLCAweDIxLCAgMiwgMjAsIDUwLAorICAgIDB4MDMsIDB4MjEsICAzLCAxNSwgNTAsCisgICAgMHgwNCwgMHgyMSwgIDQsIDE1LCAzMCwKKyAgICAweDA1LCAweDIwLCAxMiwgMTUsIDMwLAorICAgIDB4MDYsIDB4MjAsIDEzLCAgOCwgMjAsCisgICAgMHgwNywgMHgyMCwgMTQsICA4LCAyMCwKKyAgICAweDA4LCAweDIwLCAxNSwgIDgsIDI1LAorICAgIDB4MDksIDB4MjIsIDE1LCAgOCwgMjUsCit9OworCitVQ0hBUiBSYXRlU3dpdGNoVGFibGUxMUJHTjNTW10gPSB7IC8vIDMqMworLy8gSXRlbSBOby4gICBNb2RlICAgQ3Vyci1NQ1MgICBUcmFpblVwICAgVHJhaW5Eb3duCQkvLyBNb2RlLSBCaXQwOiBTVEJDLCBCaXQxOiBTaG9ydCBHSSwgQml0NCw1OiBNb2RlKDA6Q0NLLCAxOk9GRE0sIDI6SFQgTWl4LCAzOkhUIEdGKQorICAgIDB4MGEsIDB4MDAsICAwLCAgMCwgIDAsCQkJCQkJLy8gSW5pdGlhbCB1c2VkIGl0ZW0gYWZ0ZXIgYXNzb2NpYXRpb24KKyAgICAweDAwLCAweDIxLCAgMCwgMzAsMTAxLAkvLzUwCisgICAgMHgwMSwgMHgyMSwgIDEsIDIwLCA1MCwKKyAgICAweDAyLCAweDIxLCAgMiwgMjAsIDUwLAorICAgIDB4MDMsIDB4MjEsICAzLCAyMCwgNTAsCisgICAgMHgwNCwgMHgyMSwgIDQsIDE1LCA1MCwKKyAgICAweDA1LCAweDIwLCAyMCwgMTUsIDMwLAorICAgIDB4MDYsIDB4MjAsIDIxLCAgOCwgMjAsCisgICAgMHgwNywgMHgyMCwgMjIsICA4LCAyMCwKKyAgICAweDA4LCAweDIwLCAyMywgIDgsIDI1LAorICAgIDB4MDksIDB4MjIsIDIzLCAgOCwgMjUsCit9OworCitVQ0hBUiBSYXRlU3dpdGNoVGFibGUxMUJHTjJTRm9yQUJhbmRbXSA9IHsKKy8vIEl0ZW0gTm8uICAgTW9kZSAgIEN1cnItTUNTICAgVHJhaW5VcCAgIFRyYWluRG93bgkJLy8gTW9kZS0gQml0MDogU1RCQywgQml0MTogU2hvcnQgR0ksIEJpdDQsNTogTW9kZSgwOkNDSywgMTpPRkRNLCAyOkhUIE1peCwgMzpIVCBHRikKKyAgICAweDBiLCAweDA5LCAgMCwgIDAsICAwLAkJCQkJCS8vIEluaXRpYWwgdXNlZCBpdGVtIGFmdGVyIGFzc29jaWF0aW9uCisgICAgMHgwMCwgMHgyMSwgIDAsIDMwLDEwMSwJLy81MAorICAgIDB4MDEsIDB4MjEsICAxLCAyMCwgNTAsCisgICAgMHgwMiwgMHgyMSwgIDIsIDIwLCA1MCwKKyAgICAweDAzLCAweDIxLCAgMywgMTUsIDUwLAorICAgIDB4MDQsIDB4MjEsICA0LCAxNSwgMzAsCisgICAgMHgwNSwgMHgyMSwgIDUsIDE1LCAzMCwKKyAgICAweDA2LCAweDIwLCAxMiwgMTUsIDMwLAorICAgIDB4MDcsIDB4MjAsIDEzLCAgOCwgMjAsCisgICAgMHgwOCwgMHgyMCwgMTQsICA4LCAyMCwKKyAgICAweDA5LCAweDIwLCAxNSwgIDgsIDI1LAorICAgIDB4MGEsIDB4MjIsIDE1LCAgOCwgMjUsCit9OworCitVQ0hBUiBSYXRlU3dpdGNoVGFibGUxMUJHTjNTRm9yQUJhbmRbXSA9IHsgLy8gMyozCisvLyBJdGVtIE5vLiAgIE1vZGUgICBDdXJyLU1DUyAgIFRyYWluVXAgICBUcmFpbkRvd24JCS8vIE1vZGUtIEJpdDA6IFNUQkMsIEJpdDE6IFNob3J0IEdJLCBCaXQ0LDU6IE1vZGUoMDpDQ0ssIDE6T0ZETSwgMjpIVCBNaXgsIDM6SFQgR0YpCisgICAgMHgwYywgMHgwOSwgIDAsICAwLCAgMCwJCQkJCQkvLyBJbml0aWFsIHVzZWQgaXRlbSBhZnRlciBhc3NvY2lhdGlvbgorICAgIDB4MDAsIDB4MjEsICAwLCAzMCwxMDEsCS8vNTAKKyAgICAweDAxLCAweDIxLCAgMSwgMjAsIDUwLAorICAgIDB4MDIsIDB4MjEsICAyLCAyMCwgNTAsCisgICAgMHgwMywgMHgyMSwgIDMsIDE1LCA1MCwKKyAgICAweDA0LCAweDIxLCAgNCwgMTUsIDMwLAorICAgIDB4MDUsIDB4MjEsICA1LCAxNSwgMzAsCisgICAgMHgwNiwgMHgyMSwgMTIsIDE1LCAzMCwKKyAgICAweDA3LCAweDIwLCAyMCwgMTUsIDMwLAorICAgIDB4MDgsIDB4MjAsIDIxLCAgOCwgMjAsCisgICAgMHgwOSwgMHgyMCwgMjIsICA4LCAyMCwKKyAgICAweDBhLCAweDIwLCAyMywgIDgsIDI1LAorICAgIDB4MGIsIDB4MjIsIDIzLCAgOCwgMjUsCit9OworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCitQVUNIQVIgUmVhc29uU3RyaW5nW10gPSB7CisJLyogMCAgKi8JICJSZXNlcnZlZCIsCisJLyogMSAgKi8JICJVbnNwZWNpZmllZCBSZWFzb24iLAorCS8qIDIgICovCSAiUHJldmlvdXMgQXV0aCBubyBsb25nZXIgdmFsaWQiLAorCS8qIDMgICovCSAiU1RBIGlzIGxlYXZpbmcgLyBoYXMgbGVmdCIsCisJLyogNCAgKi8JICJESVMtQVNTT0MgZHVlIHRvIGluYWN0aXZpdHkiLAorCS8qIDUgICovCSAiQVAgdW5hYmxlIHRvIGhhbmxlIGFsbCBhc3NvY2lhdGlvbnMiLAorCS8qIDYgICovCSAiY2xhc3MgMiBlcnJvciIsCisJLyogNyAgKi8JICJjbGFzcyAzIGVycm9yIiwKKwkvKiA4ICAqLwkgIlNUQSBpcyBsZWF2aW5nIC8gaGFzIGxlZnQiLAorCS8qIDkgICovCSAicmVxdWlyZSBhdXRoIGJlZm9yZSBhc3NvYy9yZS1hc3NvYyIsCisJLyogMTAgKi8JICJSZXNlcnZlZCIsCisJLyogMTEgKi8JICJSZXNlcnZlZCIsCisJLyogMTIgKi8JICJSZXNlcnZlZCIsCisJLyogMTMgKi8JICJpbnZhbGlkIElFIiwKKwkvKiAxNCAqLwkgIk1JQyBlcnJvciIsCisJLyogMTUgKi8JICI0LXdheSBoYW5kc2hha2UgdGltZW91dCIsCisJLyogMTYgKi8JICIyLXdheSAoZ3JvdXAga2V5KSBoYW5kc2hha2UgdGltZW91dCIsCisJLyogMTcgKi8JICI0LXdheSBoYW5kc2hha2UgSUUgZGlmZiBhbW9uZyBBc3Nvc1JlcS9Sc3AvQmVhY29uIiwKKwkvKiAxOCAqLworfTsKKworZXh0ZXJuIFVDSEFSCSBPZmRtUmF0ZVRvUnh3aU1DU1tdOworLy8gc2luY2UgUlQ2MSBoYXMgYmV0dGVyIFJYIHNlbnNpYmlsaXR5LCB3ZSBoYXZlIHRvIGxpbWl0IFRYIEFDSyByYXRlIG5vdCB0byBleGNlZWQgb3VyIG5vcm1hbCBkYXRhIFRYIHJhdGUuCisvLyBvdGhlcndpc2UgdGhlIFdMQU4gcGVlciBtYXkgbm90IGJlIGFibGUgdG8gcmVjZWl2ZSB0aGUgQUNLIHRodXMgZG93bmdyYWRlIGl0cyBkYXRhIFRYIHJhdGUKK1VMT05HIEJhc2ljUmF0ZU1hc2tbMTJdCQkJCT0gezB4ZmZmZmYwMDEgLyogMS1NYnBzICovLCAweGZmZmZmMDAzIC8qIDIgTWJwcyAqLywgMHhmZmZmZjAwNyAvKiA1LjUgKi8sIDB4ZmZmZmYwMGYgLyogMTEgKi8sCisJCQkJCQkJCQkgIDB4ZmZmZmYwMWYgLyogNiAqLwkgLCAweGZmZmZmMDNmIC8qIDkgKi8JICAsIDB4ZmZmZmYwN2YgLyogMTIgKi8gLCAweGZmZmZmMGZmIC8qIDE4ICovLAorCQkJCQkJCQkJICAweGZmZmZmMWZmIC8qIDI0ICovCSAsIDB4ZmZmZmYzZmYgLyogMzYgKi8JICAsIDB4ZmZmZmY3ZmYgLyogNDggKi8gLCAweGZmZmZmZmZmIC8qIDU0ICovfTsKKworVUNIQVIgTVVMVElDQVNUX0FERFJbTUFDX0FERFJfTEVOXSA9IHsweDEsICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwfTsKK1VDSEFSIEJST0FEQ0FTVF9BRERSW01BQ19BRERSX0xFTl0gPSB7MHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZn07CitVQ0hBUiBaRVJPX01BQ19BRERSW01BQ19BRERSX0xFTl0gID0gezB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9OworCisvLyBlLmcuIFJzc2lTYWZlTGV2ZWxGb3JUeFJhdGVbUkFURV8zNl0iIG1lYW5zIGlmIHRoZSBjdXJyZW50IFJTU0kgaXMgZ3JlYXRlciB0aGFuCisvLwkJdGhpcyB2YWx1ZSwgdGhlbiBpdCdzIHF1YXJhbnRlZWQgY2FwYWJsZSBvZiBvcGVyYXRpbmcgaW4gMzYgbWJwcyBUWCByYXRlIGluCisvLwkJY2xlYW4gZW52aXJvbm1lbnQuCisvLwkJCQkJCQkJICBUeFJhdGU6IDEgICAyICAgNS41CTExCSA2CSAgOSAgICAxMgkxOAkgMjQgICAzNiAgIDQ4CTU0CSA3MiAgMTAwCitDSEFSIFJzc2lTYWZlTGV2ZWxGb3JUeFJhdGVbXSA9eyAgLTkyLCAtOTEsIC05MCwgLTg3LCAtODgsIC04NiwgLTg1LCAtODMsIC04MSwgLTc4LCAtNzIsIC03MSwgLTQwLCAtNDAgfTsKKworVUNIQVIgIFJhdGVJZFRvTWJwc1tdCSA9IHsgMSwgMiwgNSwgMTEsIDYsIDksIDEyLCAxOCwgMjQsIDM2LCA0OCwgNTQsIDcyLCAxMDB9OworVVNIT1JUIFJhdGVJZFRvNTAwS2Jwc1tdID0geyAyLCA0LCAxMSwgMjIsIDEyLCAxOCwgMjQsIDM2LCA0OCwgNzIsIDk2LCAxMDgsIDE0NCwgMjAwfTsKKworVUNIQVIgIFNzaWRJZQkgPSBJRV9TU0lEOworVUNIQVIgIFN1cFJhdGVJZSA9IElFX1NVUFBfUkFURVM7CitVQ0hBUiAgRXh0UmF0ZUllID0gSUVfRVhUX1NVUFBfUkFURVM7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCitVQ0hBUiAgSHRDYXBJZSA9IElFX0hUX0NBUDsKK1VDSEFSICBBZGRIdEluZm9JZSA9IElFX0FERF9IVDsKK1VDSEFSICBOZXdFeHRDaGFuSWUgPSBJRV9TRUNPTkRBUllfQ0hfT0ZGU0VUOworI2lmZGVmIERPVDExTl9EUkFGVDMKK1VDSEFSICBFeHRIdENhcEllID0gSUVfRVhUX0NBUEFCSUxJVFk7CisjZW5kaWYgLy8gRE9UMTFOX0RSQUZUMyAvLworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworVUNIQVIgIEVycEllCSA9IElFX0VSUDsKK1VDSEFSICBEc0llIAkgPSBJRV9EU19QQVJNOworVUNIQVIgIFRpbUllCSA9IElFX1RJTTsKK1VDSEFSICBXcGFJZQkgPSBJRV9XUEE7CitVQ0hBUiAgV3BhMkllCSA9IElFX1dQQTI7CitVQ0hBUiAgSWJzc0llCSA9IElFX0lCU1NfUEFSTTsKK1VDSEFSICBDY3gySWUJID0gSUVfQ0NYX1YyOworCitleHRlcm4gVUNIQVIJV1BBX09VSVtdOworCitVQ0hBUglTRVNfT1VJW10gPSB7MHgwMCwgMHg5MCwgMHg0Y307CisKK1VDSEFSCVplcm9Tc2lkWzMyXSA9IHsweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDB9OworCisvLyBSZXNldCB0aGUgUkZJQyBzZXR0aW5nIHRvIG5ldyBzZXJpZXMKK1JUTVBfUkZfUkVHUyBSRjI4NTBSZWdUYWJsZVtdID0geworLy8JCWNoCSBSMSAJCSBSMiAJCSBSMyhUWDB+ND0wKSBSNAorCQl7MSwgIDB4OTg0MDJlY2MsIDB4OTg0YzA3ODYsIDB4OTgxNmI0NTUsIDB4OTgwMDUxMGJ9LAorCQl7MiwgIDB4OTg0MDJlY2MsIDB4OTg0YzA3ODYsIDB4OTgxNjhhNTUsIDB4OTgwMDUxOWZ9LAorCQl7MywgIDB4OTg0MDJlY2MsIDB4OTg0YzA3OGEsIDB4OTgxNjhhNTUsIDB4OTgwMDUxOGJ9LAorCQl7NCwgIDB4OTg0MDJlY2MsIDB4OTg0YzA3OGEsIDB4OTgxNjhhNTUsIDB4OTgwMDUxOWZ9LAorCQl7NSwgIDB4OTg0MDJlY2MsIDB4OTg0YzA3OGUsIDB4OTgxNjhhNTUsIDB4OTgwMDUxOGJ9LAorCQl7NiwgIDB4OTg0MDJlY2MsIDB4OTg0YzA3OGUsIDB4OTgxNjhhNTUsIDB4OTgwMDUxOWZ9LAorCQl7NywgIDB4OTg0MDJlY2MsIDB4OTg0YzA3OTIsIDB4OTgxNjhhNTUsIDB4OTgwMDUxOGJ9LAorCQl7OCwgIDB4OTg0MDJlY2MsIDB4OTg0YzA3OTIsIDB4OTgxNjhhNTUsIDB4OTgwMDUxOWZ9LAorCQl7OSwgIDB4OTg0MDJlY2MsIDB4OTg0YzA3OTYsIDB4OTgxNjhhNTUsIDB4OTgwMDUxOGJ9LAorCQl7MTAsIDB4OTg0MDJlY2MsIDB4OTg0YzA3OTYsIDB4OTgxNjhhNTUsIDB4OTgwMDUxOWZ9LAorCQl7MTEsIDB4OTg0MDJlY2MsIDB4OTg0YzA3OWEsIDB4OTgxNjhhNTUsIDB4OTgwMDUxOGJ9LAorCQl7MTIsIDB4OTg0MDJlY2MsIDB4OTg0YzA3OWEsIDB4OTgxNjhhNTUsIDB4OTgwMDUxOWZ9LAorCQl7MTMsIDB4OTg0MDJlY2MsIDB4OTg0YzA3OWUsIDB4OTgxNjhhNTUsIDB4OTgwMDUxOGJ9LAorCQl7MTQsIDB4OTg0MDJlY2MsIDB4OTg0YzA3YTIsIDB4OTgxNjhhNTUsIDB4OTgwMDUxOTN9LAorCisJCS8vIDgwMi4xMSBVTkkgLyBIeXBlckxhbiAyCisJCXszNiwgMHg5ODQwMmVjYywgMHg5ODRjMDk5YSwgMHg5ODE1OGE1NSwgMHg5ODBlZDFhM30sCisJCXszOCwgMHg5ODQwMmVjYywgMHg5ODRjMDk5ZSwgMHg5ODE1OGE1NSwgMHg5ODBlZDE5M30sCisJCXs0MCwgMHg5ODQwMmVjOCwgMHg5ODRjMDY4MiwgMHg5ODE1OGE1NSwgMHg5ODBlZDE4M30sCisJCXs0NCwgMHg5ODQwMmVjOCwgMHg5ODRjMDY4MiwgMHg5ODE1OGE1NSwgMHg5ODBlZDFhM30sCisJCXs0NiwgMHg5ODQwMmVjOCwgMHg5ODRjMDY4NiwgMHg5ODE1OGE1NSwgMHg5ODBlZDE4Yn0sCisJCXs0OCwgMHg5ODQwMmVjOCwgMHg5ODRjMDY4NiwgMHg5ODE1OGE1NSwgMHg5ODBlZDE5Yn0sCisJCXs1MiwgMHg5ODQwMmVjOCwgMHg5ODRjMDY4YSwgMHg5ODE1OGE1NSwgMHg5ODBlZDE5M30sCisJCXs1NCwgMHg5ODQwMmVjOCwgMHg5ODRjMDY4YSwgMHg5ODE1OGE1NSwgMHg5ODBlZDFhM30sCisJCXs1NiwgMHg5ODQwMmVjOCwgMHg5ODRjMDY4ZSwgMHg5ODE1OGE1NSwgMHg5ODBlZDE4Yn0sCisJCXs2MCwgMHg5ODQwMmVjOCwgMHg5ODRjMDY5MiwgMHg5ODE1OGE1NSwgMHg5ODBlZDE4M30sCisJCXs2MiwgMHg5ODQwMmVjOCwgMHg5ODRjMDY5MiwgMHg5ODE1OGE1NSwgMHg5ODBlZDE5M30sCisJCXs2NCwgMHg5ODQwMmVjOCwgMHg5ODRjMDY5MiwgMHg5ODE1OGE1NSwgMHg5ODBlZDFhM30sIC8vIFBsdWdmZXN0IzQsIERheTQsIGNoYW5nZSBSRlIzIGxlZnQ0dGggOS0+NS4KKworCQkvLyA4MDIuMTEgSHlwZXJMYW4gMgorCQl7MTAwLCAweDk4NDAyZWM4LCAweDk4NGMwNmIyLCAweDk4MTc4YTU1LCAweDk4MGVkNzgzfSwKKworCQkvLyAyMDA4LjA0LjMwIG1vZGlmaWVkCisJCS8vIFRoZSBzeXN0ZW0gdGVhbSBoYXMgQU4gdG8gaW1wcm92ZSB0aGUgRVZNIHZhbHVlCisJCS8vIGZvciBjaGFubmVsIDEwMiB0byAxMDggZm9yIHRoZSBSVDI4NTAvUlQyNzUwIGR1YWwgYmFuZCBzb2x1dGlvbi4KKwkJezEwMiwgMHg5ODQwMmVjOCwgMHg5ODVjMDZiMiwgMHg5ODU3OGE1NSwgMHg5ODBlZDc5M30sCisJCXsxMDQsIDB4OTg0MDJlYzgsIDB4OTg1YzA2YjIsIDB4OTg1NzhhNTUsIDB4OTgwZWQxYTN9LAorCQl7MTA4LCAweDk4NDAyZWNjLCAweDk4NWMwYTMyLCAweDk4NTc4YTU1LCAweDk4MGVkMTkzfSwKKworCQl7MTEwLCAweDk4NDAyZWNjLCAweDk4NGMwYTM2LCAweDk4MTc4YTU1LCAweDk4MGVkMTgzfSwKKwkJezExMiwgMHg5ODQwMmVjYywgMHg5ODRjMGEzNiwgMHg5ODE3OGE1NSwgMHg5ODBlZDE5Yn0sCisJCXsxMTYsIDB4OTg0MDJlY2MsIDB4OTg0YzBhM2EsIDB4OTgxNzhhNTUsIDB4OTgwZWQxYTN9LAorCQl7MTE4LCAweDk4NDAyZWNjLCAweDk4NGMwYTNlLCAweDk4MTc4YTU1LCAweDk4MGVkMTkzfSwKKwkJezEyMCwgMHg5ODQwMmVjNCwgMHg5ODRjMDM4MiwgMHg5ODE3OGE1NSwgMHg5ODBlZDE4M30sCisJCXsxMjQsIDB4OTg0MDJlYzQsIDB4OTg0YzAzODIsIDB4OTgxNzhhNTUsIDB4OTgwZWQxOTN9LAorCQl7MTI2LCAweDk4NDAyZWM0LCAweDk4NGMwMzgyLCAweDk4MTc4YTU1LCAweDk4MGVkMTVifSwgLy8gMHg5ODBlZDFiYi0+MHg5ODBlZDE1YiByZXF1aXJlZCBieSBSb3J5IDIwMDcwOTI3CisJCXsxMjgsIDB4OTg0MDJlYzQsIDB4OTg0YzAzODIsIDB4OTgxNzhhNTUsIDB4OTgwZWQxYTN9LAorCQl7MTMyLCAweDk4NDAyZWM0LCAweDk4NGMwMzg2LCAweDk4MTc4YTU1LCAweDk4MGVkMThifSwKKwkJezEzNCwgMHg5ODQwMmVjNCwgMHg5ODRjMDM4NiwgMHg5ODE3OGE1NSwgMHg5ODBlZDE5M30sCisJCXsxMzYsIDB4OTg0MDJlYzQsIDB4OTg0YzAzODYsIDB4OTgxNzhhNTUsIDB4OTgwZWQxOWJ9LAorCQl7MTQwLCAweDk4NDAyZWM0LCAweDk4NGMwMzhhLCAweDk4MTc4YTU1LCAweDk4MGVkMTgzfSwKKworCQkvLyA4MDIuMTEgVU5JSQorCQl7MTQ5LCAweDk4NDAyZWM0LCAweDk4NGMwMzhhLCAweDk4MTc4YTU1LCAweDk4MGVkMWE3fSwKKwkJezE1MSwgMHg5ODQwMmVjNCwgMHg5ODRjMDM4ZSwgMHg5ODE3OGE1NSwgMHg5ODBlZDE4N30sCisJCXsxNTMsIDB4OTg0MDJlYzQsIDB4OTg0YzAzOGUsIDB4OTgxNzhhNTUsIDB4OTgwZWQxOGZ9LAorCQl7MTU3LCAweDk4NDAyZWM0LCAweDk4NGMwMzhlLCAweDk4MTc4YTU1LCAweDk4MGVkMTlmfSwKKwkJezE1OSwgMHg5ODQwMmVjNCwgMHg5ODRjMDM4ZSwgMHg5ODE3OGE1NSwgMHg5ODBlZDFhN30sCisJCXsxNjEsIDB4OTg0MDJlYzQsIDB4OTg0YzAzOTIsIDB4OTgxNzhhNTUsIDB4OTgwZWQxODd9LAorCQl7MTY1LCAweDk4NDAyZWM0LCAweDk4NGMwMzkyLCAweDk4MTc4YTU1LCAweDk4MGVkMTk3fSwKKworCQkvLyBKYXBhbgorCQl7MTg0LCAweDk1MDAyY2NjLCAweDk1MDA0OTFlLCAweDk1MDliZTU1LCAweDk1MGMwYTBifSwKKwkJezE4OCwgMHg5NTAwMmNjYywgMHg5NTAwNDkyMiwgMHg5NTA5YmU1NSwgMHg5NTBjMGExM30sCisJCXsxOTIsIDB4OTUwMDJjY2MsIDB4OTUwMDQ5MjYsIDB4OTUwOWJlNTUsIDB4OTUwYzBhMWJ9LAorCQl7MTk2LCAweDk1MDAyY2NjLCAweDk1MDA0OTJhLCAweDk1MDliZTU1LCAweDk1MGMwYTIzfSwKKwkJezIwOCwgMHg5NTAwMmNjYywgMHg5NTAwNDkzYSwgMHg5NTA5YmU1NSwgMHg5NTBjMGExM30sCisJCXsyMTIsIDB4OTUwMDJjY2MsIDB4OTUwMDQ5M2UsIDB4OTUwOWJlNTUsIDB4OTUwYzBhMWJ9LAorCQl7MjE2LCAweDk1MDAyY2NjLCAweDk1MDA0OTgyLCAweDk1MDliZTU1LCAweDk1MGMwYTIzfSwKKworCQkvLyBzdGlsbCBsYWNrIG9mIE1NQUMoSmFwYW4pIGNoIDM0LDM4LDQyLDQ2Cit9OworVUNIQVIJTlVNX09GXzI4NTBfQ0hOTCA9IChzaXplb2YoUkYyODUwUmVnVGFibGUpIC8gc2l6ZW9mKFJUTVBfUkZfUkVHUykpOworCitGUkVRVUVOQ1lfSVRFTSBGcmVxSXRlbXMzMDIwW10gPQoreworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwkvLyBJU00gOiAyLjQgdG8gMi40ODMgR0h6ICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCS8vIDExZworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwkvLy1DSC0tLU4tLS0tLS0tUi0tLUstLS0tLS0tLS0tLQorCXsxLCAgICAyNDEsICAyLCAgMn0sCisJezIsICAgIDI0MSwJIDIsICA3fSwKKwl7MywgICAgMjQyLAkgMiwgIDJ9LAorCXs0LCAgICAyNDIsCSAyLCAgN30sCisJezUsICAgIDI0MywJIDIsICAyfSwKKwl7NiwgICAgMjQzLAkgMiwgIDd9LAorCXs3LCAgICAyNDQsCSAyLCAgMn0sCisJezgsICAgIDI0NCwJIDIsICA3fSwKKwl7OSwgICAgMjQ1LAkgMiwgIDJ9LAorCXsxMCwgICAyNDUsCSAyLCAgN30sCisJezExLCAgIDI0NiwJIDIsICAyfSwKKwl7MTIsICAgMjQ2LAkgMiwgIDd9LAorCXsxMywgICAyNDcsCSAyLCAgMn0sCisJezE0LCAgIDI0OCwJIDIsICA0fSwKK307CisjZGVmaW5lCU5VTV9PRl8zMDIwX0NITkwJKHNpemVvZihGcmVxSXRlbXMzMDIwKSAvIHNpemVvZihGUkVRVUVOQ1lfSVRFTSkpCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJaW5pdGlhbGl6ZSB0aGUgTUxNRSB0YXNrIGFuZCBpdHMgZGF0YSBzdHJ1Y3R1cmUgKHF1ZXVlLCBzcGlubG9jaywKKwkJdGltZXIsIHN0YXRlIG1hY2hpbmVzKS4KKworCUlSUUwgPSBQQVNTSVZFX0xFVkVMCisKKwlSZXR1cm46CisJCWFsd2F5cyByZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUworCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitORElTX1NUQVRVUyBNbG1lSW5pdCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlORElTX1NUQVRVUyBTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+IE1MTUUgSW5pdGlhbGl6ZVxuIikpOworCisJZG8KKwl7CisJCVN0YXR1cyA9IE1sbWVRdWV1ZUluaXQoJnBBZC0+TWxtZS5RdWV1ZSk7CisJCWlmKFN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCQkJYnJlYWs7CisKKwkJcEFkLT5NbG1lLmJSdW5uaW5nID0gRkFMU0U7CisJCU5kaXNBbGxvY2F0ZVNwaW5Mb2NrKCZwQWQtPk1sbWUuVGFza0xvY2spOworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCXsKKwkJCUJzc1RhYmxlSW5pdCgmcEFkLT5TY2FuVGFiKTsKKworCQkJLy8gaW5pdCBTVEEgc3RhdGUgbWFjaGluZXMKKwkJCUFzc29jU3RhdGVNYWNoaW5lSW5pdChwQWQsICZwQWQtPk1sbWUuQXNzb2NNYWNoaW5lLCBwQWQtPk1sbWUuQXNzb2NGdW5jKTsKKwkJCUF1dGhTdGF0ZU1hY2hpbmVJbml0KHBBZCwgJnBBZC0+TWxtZS5BdXRoTWFjaGluZSwgcEFkLT5NbG1lLkF1dGhGdW5jKTsKKwkJCUF1dGhSc3BTdGF0ZU1hY2hpbmVJbml0KHBBZCwgJnBBZC0+TWxtZS5BdXRoUnNwTWFjaGluZSwgcEFkLT5NbG1lLkF1dGhSc3BGdW5jKTsKKwkJCVN5bmNTdGF0ZU1hY2hpbmVJbml0KHBBZCwgJnBBZC0+TWxtZS5TeW5jTWFjaGluZSwgcEFkLT5NbG1lLlN5bmNGdW5jKTsKKwkJCVdwYVBza1N0YXRlTWFjaGluZUluaXQocEFkLCAmcEFkLT5NbG1lLldwYVBza01hY2hpbmUsIHBBZC0+TWxtZS5XcGFQc2tGdW5jKTsKKwkJCUFpcm9uZXRTdGF0ZU1hY2hpbmVJbml0KHBBZCwgJnBBZC0+TWxtZS5BaXJvbmV0TWFjaGluZSwgcEFkLT5NbG1lLkFpcm9uZXRGdW5jKTsKKworI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCQkJRGxzU3RhdGVNYWNoaW5lSW5pdChwQWQsICZwQWQtPk1sbWUuRGxzTWFjaGluZSwgcEFkLT5NbG1lLkRsc0Z1bmMpOworI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCisKKwkJCS8vIFNpbmNlIHdlIGFyZSB1c2luZyBzd2l0Y2gvY2FzZSB0byBpbXBsZW1lbnQgaXQsIHRoZSBpbml0IGlzIGRpZmZlcmVudCBmcm9tIHRoZSBhYm92ZQorCQkJLy8gc3RhdGUgbWFjaGluZSBpbml0CisJCQlNbG1lQ250bEluaXQocEFkLCAmcEFkLT5NbG1lLkNudGxNYWNoaW5lLCBOVUxMKTsKKwkJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisKKworCQlBY3Rpb25TdGF0ZU1hY2hpbmVJbml0KHBBZCwgJnBBZC0+TWxtZS5BY3RNYWNoaW5lLCBwQWQtPk1sbWUuQWN0RnVuYyk7CisKKwkJLy8gSW5pdCBtbG1lIHBlcmlvZGljIHRpbWVyCisJCVJUTVBJbml0VGltZXIocEFkLCAmcEFkLT5NbG1lLlBlcmlvZGljVGltZXIsIEdFVF9USU1FUl9GVU5DVElPTihNbG1lUGVyaW9kaWNFeGVjKSwgcEFkLCBUUlVFKTsKKworCQkvLyBTZXQgbWxtZSBwZXJpb2RpYyB0aW1lcgorCQlSVE1QU2V0VGltZXIoJnBBZC0+TWxtZS5QZXJpb2RpY1RpbWVyLCBNTE1FX1RBU0tfRVhFQ19JTlRWKTsKKworCQkvLyBzb2Z0d2FyZS1iYXNlZCBSWCBBbnRlbm5hIGRpdmVyc2l0eQorCQlSVE1QSW5pdFRpbWVyKHBBZCwgJnBBZC0+TWxtZS5SeEFudEV2YWxUaW1lciwgR0VUX1RJTUVSX0ZVTkNUSU9OKEFzaWNSeEFudEV2YWxUaW1lb3V0KSwgcEFkLCBGQUxTRSk7CisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorI2lmZGVmIFJUMjg2MAorCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQl7CisJICAgICAgICBpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19BRFZBTkNFX1BPV0VSX1NBVkVfUENJRV9ERVZJQ0UpKQorCSAgICAgICAgeworCSAgICAgICAgICAgIC8vIG9ubHkgUENJZSBjYXJkcyBuZWVkIHRoZXNlIHR3byB0aW1lcnMKKwkgICAgCQlSVE1QSW5pdFRpbWVyKHBBZCwgJnBBZC0+TWxtZS5Qc1BvbGxUaW1lciwgR0VUX1RJTUVSX0ZVTkNUSU9OKFBzUG9sbFdha2VFeGVjKSwgcEFkLCBGQUxTRSk7CisJICAgIAkJUlRNUEluaXRUaW1lcihwQWQsICZwQWQtPk1sbWUuUmFkaW9Pbk9mZlRpbWVyLCBHRVRfVElNRVJfRlVOQ1RJT04oUmFkaW9PbkV4ZWMpLCBwQWQsIEZBTFNFKTsKKwkgICAgICAgIH0KKwkJfQorI2VuZGlmIC8vIFJUMjg2MCAvLworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJfSB3aGlsZSAoRkFMU0UpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPC0tIE1MTUUgSW5pdGlhbGl6ZVxuIikpOworCisJcmV0dXJuIFN0YXR1czsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQltYWluIGxvb3Agb2YgdGhlIE1MTUUKKwlQcmU6CisJCU1sbWUgaGFzIHRvIGJlIGluaXRpYWxpemVkLCBhbmQgdGhlcmUgYXJlIHNvbWV0aGluZyBpbnNpZGUgdGhlIHF1ZXVlCisJTm90ZToKKwkJVGhpcyBmdW5jdGlvbiBpcyBpbnZva2VkIGZyb20gTVBTZXRJbmZvcm1hdGlvbiBhbmQgTVBSZWNlaXZlOworCQlUaGlzIHRhc2sgZ3VhcmFudGVlIG9ubHkgb25lIE1sbWVIYW5kbGVyIHdpbGwgcnVuLgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIE1sbWVIYW5kbGVyKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCU1MTUVfUVVFVUVfRUxFTSAJICAgKkVsZW0gPSBOVUxMOworI2lmZGVmIEFQQ0xJX1NVUFBPUlQKKwlTSE9SVCBhcGNsaUlmSW5kZXg7CisjZW5kaWYKKworCS8vIE9ubHkgYWNjZXB0IE1MTUUgYW5kIEZyYW1lIGZyb20gcGVlciBzaWRlLCBubyBvdGhlciAoY29udHJvbC9kYXRhKSBmcmFtZSBzaG91bGQKKwkvLyBnZXQgaW50byB0aGlzIHN0YXRlIG1hY2hpbmUKKworCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+TWxtZS5UYXNrTG9jayk7CisJaWYocEFkLT5NbG1lLmJSdW5uaW5nKQorCXsKKwkJTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5NbG1lLlRhc2tMb2NrKTsKKwkJcmV0dXJuOworCX0KKwllbHNlCisJeworCQlwQWQtPk1sbWUuYlJ1bm5pbmcgPSBUUlVFOworCX0KKwlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPk1sbWUuVGFza0xvY2spOworCisJd2hpbGUgKCFNbG1lUXVldWVFbXB0eSgmcEFkLT5NbG1lLlF1ZXVlKSkKKwl7CisJCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTUxNRV9SRVNFVF9JTl9QUk9HUkVTUykgfHwKKwkJCVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKSB8fAorCQkJUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKQorCQl7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJEZXZpY2UgSGFsdGVkIG9yIFJlbW92ZWQgb3IgTWxtZVJlc3QsIGV4aXQgTWxtZUhhbmRsZXIhIChxdWV1ZSBudW0gPSAlbGQpXG4iLCBwQWQtPk1sbWUuUXVldWUuTnVtKSk7CisJCQlicmVhazsKKwkJfQorCisjaWZkZWYgUkFMSU5LX0FURQorCQlpZihBVEVfT04ocEFkKSkKKwkJeworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiVGhlIGRyaXZlciBpcyBpbiBBVEUgbW9kZSBub3cgaW4gTWxtZUhhbmRsZXJcbiIpKTsKKwkJCWJyZWFrOworCQl9CisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCisJCS8vRnJvbSBtZXNzYWdlIHR5cGUsIGRldGVybWluZSB3aGljaCBzdGF0ZSBtYWNoaW5lIEkgc2hvdWxkIGRyaXZlCisJCWlmIChNbG1lRGVxdWV1ZSgmcEFkLT5NbG1lLlF1ZXVlLCAmRWxlbSkpCisJCXsKKworCQkJLy8gaWYgZGVxdWV1ZSBzdWNjZXNzCisJCQlzd2l0Y2ggKEVsZW0tPk1hY2hpbmUpCisJCQl7CisJCQkJLy8gU1RBIHN0YXRlIG1hY2hpbmVzCisjaWZkZWYJQ09ORklHX1NUQV9TVVBQT1JUCisJCQkJY2FzZSBBU1NPQ19TVEFURV9NQUNISU5FOgorCQkJCQlTdGF0ZU1hY2hpbmVQZXJmb3JtQWN0aW9uKHBBZCwgJnBBZC0+TWxtZS5Bc3NvY01hY2hpbmUsIEVsZW0pOworCQkJCQlicmVhazsKKwkJCQljYXNlIEFVVEhfU1RBVEVfTUFDSElORToKKwkJCQkJU3RhdGVNYWNoaW5lUGVyZm9ybUFjdGlvbihwQWQsICZwQWQtPk1sbWUuQXV0aE1hY2hpbmUsIEVsZW0pOworCQkJCQlicmVhazsKKwkJCQljYXNlIEFVVEhfUlNQX1NUQVRFX01BQ0hJTkU6CisJCQkJCVN0YXRlTWFjaGluZVBlcmZvcm1BY3Rpb24ocEFkLCAmcEFkLT5NbG1lLkF1dGhSc3BNYWNoaW5lLCBFbGVtKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTWU5DX1NUQVRFX01BQ0hJTkU6CisJCQkJCVN0YXRlTWFjaGluZVBlcmZvcm1BY3Rpb24ocEFkLCAmcEFkLT5NbG1lLlN5bmNNYWNoaW5lLCBFbGVtKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBNTE1FX0NOVExfU1RBVEVfTUFDSElORToKKwkJCQkJTWxtZUNudGxNYWNoaW5lUGVyZm9ybUFjdGlvbihwQWQsICZwQWQtPk1sbWUuQ250bE1hY2hpbmUsIEVsZW0pOworCQkJCQlicmVhazsKKwkJCQljYXNlIFdQQV9QU0tfU1RBVEVfTUFDSElORToKKwkJCQkJU3RhdGVNYWNoaW5lUGVyZm9ybUFjdGlvbihwQWQsICZwQWQtPk1sbWUuV3BhUHNrTWFjaGluZSwgRWxlbSk7CisJCQkJCWJyZWFrOworI2lmZGVmIExFQVBfU1VQUE9SVAorCQkJCWNhc2UgTEVBUF9TVEFURV9NQUNISU5FOgorCQkJCQlMZWFwTWFjaGluZVBlcmZvcm1BY3Rpb24ocEFkLCAmcEFkLT5NbG1lLkxlYXBNYWNoaW5lLCBFbGVtKTsKKwkJCQkJYnJlYWs7CisjZW5kaWYKKwkJCQljYXNlIEFJUk9ORVRfU1RBVEVfTUFDSElORToKKwkJCQkJU3RhdGVNYWNoaW5lUGVyZm9ybUFjdGlvbihwQWQsICZwQWQtPk1sbWUuQWlyb25ldE1hY2hpbmUsIEVsZW0pOworCQkJCQlicmVhazsKKworI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCQkJCWNhc2UgRExTX1NUQVRFX01BQ0hJTkU6CisJCQkJCVN0YXRlTWFjaGluZVBlcmZvcm1BY3Rpb24ocEFkLCAmcEFkLT5NbG1lLkRsc01hY2hpbmUsIEVsZW0pOworCQkJCQlicmVhazsKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCQkJCWNhc2UgQUNUSU9OX1NUQVRFX01BQ0hJTkU6CisJCQkJCVN0YXRlTWFjaGluZVBlcmZvcm1BY3Rpb24ocEFkLCAmcEFkLT5NbG1lLkFjdE1hY2hpbmUsIEVsZW0pOworCQkJCQlicmVhazsKKworCisKKworCQkJCWRlZmF1bHQ6CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkVSUk9SOiBJbGxlZ2FsIG1hY2hpbmUgJWxkIGluIE1sbWVIYW5kbGVyKClcbiIsIEVsZW0tPk1hY2hpbmUpKTsKKwkJCQkJYnJlYWs7CisJCQl9IC8vIGVuZCBvZiBzd2l0Y2gKKworCQkJLy8gZnJlZSBNTE1FIGVsZW1lbnQKKwkJCUVsZW0tPk9jY3VwaWVkID0gRkFMU0U7CisJCQlFbGVtLT5Nc2dMZW4gPSAwOworCisJCX0KKwkJZWxzZSB7CisJCQlEQkdQUklOVF9FUlIoKCJNbG1lSGFuZGxlcjogTWxtZVF1ZXVlIGVtcHR5XG4iKSk7CisJCX0KKwl9CisKKwlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPk1sbWUuVGFza0xvY2spOworCXBBZC0+TWxtZS5iUnVubmluZyA9IEZBTFNFOworCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+TWxtZS5UYXNrTG9jayk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJRGVzdHJ1Y3RvciBvZiBNTE1FIChEZXN0cm95IHF1ZXVlLCBzdGF0ZSBtYWNoaW5lLCBzcGluIGxvY2sgYW5kIHRpbWVyKQorCVBhcmFtZXRlcnM6CisJCUFkYXB0ZXIgLSBOSUMgQWRhcHRlciBwb2ludGVyCisJUG9zdDoKKwkJVGhlIE1MTUUgdGFzayB3aWxsIG5vIGxvbmdlciB3b3JrIHByb3Blcmx5CisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBNbG1lSGFsdCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlCT09MRUFOIAkgIENhbmNlbGxlZDsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PiBNbG1lSGFsdFxuIikpOworCisJaWYgKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpCisJeworCQkvLyBkaXNhYmxlIEJFQUNPTiBnZW5lcmF0aW9uIGFuZCBvdGhlciBCRUFDT04gcmVsYXRlZCBoYXJkd2FyZSB0aW1lcnMKKwkJQXNpY0Rpc2FibGVTeW5jKHBBZCk7CisJfQorCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwl7CisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJCVVDSEFSCQlpOworI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCQkvLyBDYW5jZWwgcGVuZGluZyB0aW1lcnMKKwkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguQXNzb2NUaW1lciwJCSZDYW5jZWxsZWQpOworCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5SZWFzc29jVGltZXIsCQkmQ2FuY2VsbGVkKTsKKwkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguRGlzYXNzb2NUaW1lciwJJkNhbmNlbGxlZCk7CisJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LkF1dGhUaW1lciwJCSZDYW5jZWxsZWQpOworCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5CZWFjb25UaW1lciwJCSZDYW5jZWxsZWQpOworCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5TY2FuVGltZXIsCQkmQ2FuY2VsbGVkKTsKKyNpZmRlZiBSVDI4NjAKKwkgICAgaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQURWQU5DRV9QT1dFUl9TQVZFX1BDSUVfREVWSUNFKSkKKwkgICAgeworCSAgIAkgICAgUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWUuUHNQb2xsVGltZXIsCQkmQ2FuY2VsbGVkKTsKKwkJICAgIFJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lLlJhZGlvT25PZmZUaW1lciwJCSZDYW5jZWxsZWQpOworCQl9CisjZW5kaWYgLy8gUlQyODYwIC8vCisKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwkJZm9yIChpPTA7IGk8TUFYX05VTV9PRl9ETFNfRU5UUlk7IGkrKykKKwkJeworCQkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5UaW1lciwgJkNhbmNlbGxlZCk7CisJCX0KKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZS5QZXJpb2RpY1RpbWVyLAkJJkNhbmNlbGxlZCk7CisJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWUuUnhBbnRFdmFsVGltZXIsCQkmQ2FuY2VsbGVkKTsKKworCisKKwlpZiAoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkKKwl7CisJCS8vIFNldCBMRUQKKwkJUlRNUFNldExFRChwQWQsIExFRF9IQUxUKTsKKyAgICAgICAgUlRNUFNldFNpZ25hbExFRChwQWQsIC0xMDApOwkvLyBGb3JjZSBzaWduYWwgc3RyZW5ndGggTGVkIHRvIGJlIHR1cm5lZCBvZmYsIGZpcm13YXJlIGlzIG5vdCBkb25lIGl0LgorCX0KKworCVJUTVB1c2VjRGVsYXkoNTAwMCk7ICAgIC8vICA1IG1zZWMgdG8gZ3VyYW50ZWUgQW50IERpdmVyc2l0eSB0aW1lciBjYW5jZWxlZAorCisJTWxtZVF1ZXVlRGVzdHJveSgmcEFkLT5NbG1lLlF1ZXVlKTsKKwlOZGlzRnJlZVNwaW5Mb2NrKCZwQWQtPk1sbWUuVGFza0xvY2spOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPD09IE1sbWVIYWx0XG4iKSk7Cit9CisKK1ZPSUQgTWxtZVJlc2V0UmFsaW5rQ291bnRlcnMoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpCit7CisJcEFkLT5SYWxpbmtDb3VudGVycy5MYXN0T25lU2VjUnhPa0RhdGFDbnQgPSBwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1J4T2tEYXRhQ250OworCS8vIGNsZWFyIGFsbCBPbmVTZWN4eHggY291bnRlcnMuCisJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNCZWFjb25TZW50Q250ID0gMDsKKwlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY0ZhbHNlQ0NBQ250ID0gMDsKKwlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1J4RmNzRXJyQ250ID0gMDsKKwlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1J4T2tDbnQgPSAwOworCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhGYWlsQ291bnQgPSAwOworCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhOb1JldHJ5T2tDb3VudCA9IDA7CisJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeFJldHJ5T2tDb3VudCA9IDA7CisJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNSeE9rRGF0YUNudCA9IDA7CisKKwkvLyBUT0RPOiBmb3IgZGVidWcgb25seS4gdG8gYmUgcmVtb3ZlZAorCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjT3NUeENvdW50W1FJRF9BQ19CRV0gPSAwOworCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjT3NUeENvdW50W1FJRF9BQ19CS10gPSAwOworCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjT3NUeENvdW50W1FJRF9BQ19WSV0gPSAwOworCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjT3NUeENvdW50W1FJRF9BQ19WT10gPSAwOworCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjRG1hRG9uZUNvdW50W1FJRF9BQ19CRV0gPSAwOworCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjRG1hRG9uZUNvdW50W1FJRF9BQ19CS10gPSAwOworCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjRG1hRG9uZUNvdW50W1FJRF9BQ19WSV0gPSAwOworCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjRG1hRG9uZUNvdW50W1FJRF9BQ19WT10gPSAwOworCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhEb25lQ291bnQgPSAwOworCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjUnhDb3VudCA9IDA7CisJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeEFnZ3JlZ2F0aW9uQ291bnQgPSAwOworCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjUnhBZ2dyZWdhdGlvbkNvdW50ID0gMDsKKworCXJldHVybjsKK30KKwordW5zaWduZWQgbG9uZyByeF9BTVNEVTsKK3Vuc2lnbmVkIGxvbmcgcnhfVG90YWw7CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJVGhpcyByb3V0aW5lIGlzIGV4ZWN1dGVkIHBlcmlvZGljYWxseSB0byAtCisJCTEuIERlY2lkZSBpZiBpdCdzIGEgcmlnaHQgdGltZSB0byB0dXJuIG9uIFB3ck1nbXQgYml0IG9mIGFsbAorCQkgICBvdXRnb2lpbmcgZnJhbWVzCisJCTIuIENhbGN1bGF0ZSBDaGFubmVsUXVhbGl0eSBiYXNlZCBvbiBzdGF0aXN0aWNzIG9mIHRoZSBsYXN0CisJCSAgIHBlcmlvZCwgc28gdGhhdCBUWCByYXRlIHdvbid0IHRvZ2dsaW5nIHZlcnkgZnJlcXVlbnRseSBiZXR3ZWVuIGEKKwkJICAgc3VjY2Vzc2Z1bCBUWCBhbmQgYSBmYWlsZWQgVFguCisJCTMuIElmIHRoZSBjYWxjdWxhdGVkIENoYW5uZWxRdWFsaXR5IGluZGljYXRlZCBjdXJyZW50IGNvbm5lY3Rpb24gbm90CisJCSAgIGhlYWx0aHksIHRoZW4gYSBST0FNaW5nIGF0dGVtcHQgaXMgdHJpZWQgaGVyZS4KKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworI2RlZmluZSBBREhPQ19CRUFDT05fTE9TVF9USU1FCQkoOCpPU19IWikgIC8vIDggc2VjCitWT0lEIE1sbWVQZXJpb2RpY0V4ZWMoCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKQoreworCVVMT05HCQkJVHhUb3RhbENudDsKKwlQUlRNUF9BREFQVEVSCXBBZCA9IChSVE1QX0FEQVBURVIgKilGdW5jdGlvbkNvbnRleHQ7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKyNpZmRlZiBSVDI4NjAKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCXsKKwkgICAgLy8gSWYgSGFyZHdhcmUgY29udHJvbGxlZCBSYWRpbyBlbmFibGVkLCB3ZSBoYXZlIHRvIGNoZWNrIEdQSU8gcGluMiBldmVyeSAyIHNlY29uZC4KKwkJLy8gTW92ZSBjb2RlIHRvIGhlcmUsIGJlY2F1c2UgZm9sbG93aW5nIGNvZGUgd2lsbCByZXR1cm4gd2hlbiByYWRpbyBpcyBvZmYKKwkJaWYgKChwQWQtPk1sbWUuUGVyaW9kaWNSb3VuZCAlIChNTE1FX1RBU0tfRVhFQ19NVUxUSVBMRSAqIDIpID09IDApICYmIChwQWQtPlN0YUNmZy5iSGFyZHdhcmVSYWRpbyA9PSBUUlVFKSAmJgorCQkJKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpICYmCisJCQkoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKSkgJiYKKwkJCShwQWQtPmJQQ0ljbGtPZmYgPT0gRkFMU0UpKQorCQl7CisJCQlVSU5UMzIJCQkJZGF0YSA9IDA7CisKKwkJCS8vIFJlYWQgR1BJTyBwaW4yIGFzIEhhcmR3YXJlIGNvbnRyb2xsZWQgcmFkaW8gc3RhdGUKKwkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgR1BJT19DVFJMX0NGRywgJmRhdGEpOworCQkJaWYgKGRhdGEgJiAweDA0KQorCQkJeworCQkJCXBBZC0+U3RhQ2ZnLmJId1JhZGlvID0gVFJVRTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlwQWQtPlN0YUNmZy5iSHdSYWRpbyA9IEZBTFNFOworCQkJfQorCQkJaWYgKHBBZC0+U3RhQ2ZnLmJSYWRpbyAhPSAocEFkLT5TdGFDZmcuYkh3UmFkaW8gJiYgcEFkLT5TdGFDZmcuYlN3UmFkaW8pKQorCQkJeworCQkJCXBBZC0+U3RhQ2ZnLmJSYWRpbyA9IChwQWQtPlN0YUNmZy5iSHdSYWRpbyAmJiBwQWQtPlN0YUNmZy5iU3dSYWRpbyk7CisJCQkJaWYgKHBBZC0+U3RhQ2ZnLmJSYWRpbyA9PSBUUlVFKQorCQkJCXsKKwkJCQkJTWxtZVJhZGlvT24ocEFkKTsKKwkJCQkJLy8gVXBkYXRlIGV4dHJhIGluZm9ybWF0aW9uCisJCQkJCXBBZC0+RXh0cmFJbmZvID0gRVhUUkFfSU5GT19DTEVBUjsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJTWxtZVJhZGlvT2ZmKHBBZCk7CisJCQkJCS8vIFVwZGF0ZSBleHRyYSBpbmZvcm1hdGlvbgorCQkJCQlwQWQtPkV4dHJhSW5mbyA9IEhXX1JBRElPX09GRjsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisjZW5kaWYgLy8gUlQyODYwIC8vCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwkvLyBEbyBub3RoaW5nIGlmIHRoZSBkcml2ZXIgaXMgc3RhcnRpbmcgaGFsdCBzdGF0ZS4KKwkvLyBUaGlzIG1pZ2h0IGhhcHBlbiB3aGVuIHRpbWVyIGFscmVhZHkgYmVlbiBmaXJlZCBiZWZvcmUgY2FuY2VsIHRpbWVyIHdpdGggbWxtZWhhbHQKKwlpZiAoKFJUTVBfVEVTVF9GTEFHKHBBZCwgKGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyB8CisJCQkJCQkJCWZSVE1QX0FEQVBURVJfUkFESU9fT0ZGIHwKKwkJCQkJCQkJZlJUTVBfQURBUFRFUl9SQURJT19NRUFTVVJFTUVOVCB8CisJCQkJCQkJCWZSVE1QX0FEQVBURVJfUkVTRVRfSU5fUFJPR1JFU1MpKSkpCisJCXJldHVybjsKKworCVJUMjhYWF9NTE1FX1BSRV9TQU5JVFlfQ0hFQ0socEFkKTsKKworI2lmZGVmIFJBTElOS19BVEUKKwkvKiBEbyBub3Qgc2hvdyBSU1NJIHVudGlsICJOb3JtYWwgMSBzZWNvbmQgTWxtZSBQZXJpb2RpY0V4ZWMiLiAqLworCWlmIChBVEVfT04ocEFkKSkKKwl7CisJCWlmIChwQWQtPk1sbWUuUGVyaW9kaWNSb3VuZCAlIE1MTUVfVEFTS19FWEVDX01VTFRJUExFICE9IChNTE1FX1RBU0tfRVhFQ19NVUxUSVBMRSAtIDEpKQorCXsKKwkJCXBBZC0+TWxtZS5QZXJpb2RpY1JvdW5kICsrOworCQkJcmV0dXJuOworCQl9CisJfQorI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJeworCQkvLyBEbyBub3RoaW5nIGlmIG1vbml0b3IgbW9kZSBpcyBvbgorCQlpZiAoTU9OSVRPUl9PTihwQWQpKQorCQkJcmV0dXJuOworCisJCWlmIChwQWQtPk1sbWUuUGVyaW9kaWNSb3VuZCAmIDB4MSkKKwkJeworCQkJLy8gVGhpcyBpcyB0aGUgZml4IGZvciB3aWZpIDExbiBleHRlbnNpb24gY2hhbm5lbCBvdmVybGFwcGluZyB0ZXN0IGNhc2UuICBmb3IgMjg2MEQKKwkJCWlmICgoKHBBZC0+TUFDVmVyc2lvbiAmIDB4ZmZmZikgPT0gMHgwMTAxKSAmJgorCQkJCShTVEFfVEdOX1dJRklfT04ocEFkKSkgJiYKKwkJCQkocEFkLT5Db21tb25DZmcuSU9UZXN0UGFybS5iVG9nZ2xlID09IEZBTFNFKSkKKworCQkJCXsKKwkJCQkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhPUF9DVFJMX0NGRywgMHgyNEJmKTsKKwkJCQkJcEFkLT5Db21tb25DZmcuSU9UZXN0UGFybS5iVG9nZ2xlID0gVFJVRTsKKwkJCQl9CisJCQkJZWxzZSBpZiAoKFNUQV9UR05fV0lGSV9PTihwQWQpKSAmJgorCQkJCQkJKChwQWQtPk1BQ1ZlcnNpb24gJiAweGZmZmYpID09IDB4MDEwMSkpCisJCQkJeworCQkJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWE9QX0NUUkxfQ0ZHLCAweDI0M2YpOworCQkJCQlwQWQtPkNvbW1vbkNmZy5JT1Rlc3RQYXJtLmJUb2dnbGUgPSBGQUxTRTsKKwkJCQl9CisJCX0KKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlwQWQtPmJVcGRhdGVCY25DbnREb25lID0gRkFMU0U7CisKKy8vCVJFQ0JBVGltZXJUaW1lb3V0KFN5c3RlbVNwZWNpZmljMSxGdW5jdGlvbkNvbnRleHQsU3lzdGVtU3BlY2lmaWMyLFN5c3RlbVNwZWNpZmljMyk7CisJcEFkLT5NbG1lLlBlcmlvZGljUm91bmQgKys7CisKKwkvLyBleGVjdXRlIGV2ZXJ5IDUwMG1zCisJaWYgKChwQWQtPk1sbWUuUGVyaW9kaWNSb3VuZCAlIDUgPT0gMCkgJiYgUlRNUEF1dG9SYXRlU3dpdGNoQ2hlY2socEFkKS8qKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfVFhfUkFURV9TV0lUQ0hfRU5BQkxFRCkpKi8pCisJeworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQkvLyBwZXJmb3JtIGR5bmFtaWMgdHggcmF0ZSBzd2l0Y2hpbmcgYmFzZWQgb24gcGFzdCBUWCBoaXN0b3J5CisJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCXsKKwkJCWlmICgoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpCisJCQkJCSkKKwkJCQkmJiAoIU9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSkpKQorCQkJCU1sbWVEeW5hbWljVHhSYXRlU3dpdGNoaW5nKHBBZCk7CisJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwl9CisKKwkvLyBOb3JtYWwgMSBzZWNvbmQgTWxtZSBQZXJpb2RpY0V4ZWMuCisJaWYgKHBBZC0+TWxtZS5QZXJpb2RpY1JvdW5kICVNTE1FX1RBU0tfRVhFQ19NVUxUSVBMRSA9PSAwKQorCXsKKyAgICAgICAgICAgICAgICBwQWQtPk1sbWUuT25lU2VjUGVyaW9kaWNSb3VuZCArKzsKKworI2lmZGVmIFJBTElOS19BVEUKKyAgICAJaWYgKEFURV9PTihwQWQpKQorICAgIAl7CisJCQkvKiByZXF1ZXN0IGZyb20gQmFyb24gOiBtb3ZlIHRoaXMgcm91dGluZSBmcm9tIGxhdGVyIHRvIGhlcmUgKi8KKwkJCS8qIGZvciBzaG93aW5nIFJ4IGVycm9yIGNvdW50IGluIEFURSBSWEZSQU1FICovCisgICAgICAgICAgICBOSUNVcGRhdGVSYXdDb3VudGVycyhwQWQpOworCQkJaWYgKHBBZC0+YXRlLmJSeEZlciA9PSAxKQorCQkJeworCQkJCXBBZC0+YXRlLlJ4VG90YWxDbnQgKz0gcEFkLT5hdGUuUnhDbnRQZXJTZWM7CisJCQkgICAgYXRlX3ByaW50KEtFUk5fRU1FUkcgIk1sbWVQZXJpb2RpY0V4ZWM6IFJ4IHBhY2tldCBjbnQgPSAlZC8lZFxuIiwgcEFkLT5hdGUuUnhDbnRQZXJTZWMsIHBBZC0+YXRlLlJ4VG90YWxDbnQpOworCQkJCXBBZC0+YXRlLlJ4Q250UGVyU2VjID0gMDsKKworCQkJCWlmIChwQWQtPmF0ZS5SeEFudGVubmFTZWwgPT0gMCkKKwkJCQkJYXRlX3ByaW50KEtFUk5fRU1FUkcgIk1sbWVQZXJpb2RpY0V4ZWM6IFJ4IEF2Z1Jzc2kwPSVkLCBBdmdSc3NpMT0lZCwgQXZnUnNzaTI9JWRcblxuIiwKKwkJCQkJCXBBZC0+YXRlLkF2Z1Jzc2kwLCBwQWQtPmF0ZS5BdmdSc3NpMSwgcEFkLT5hdGUuQXZnUnNzaTIpOworCQkJCWVsc2UKKwkJCQkJYXRlX3ByaW50KEtFUk5fRU1FUkcgIk1sbWVQZXJpb2RpY0V4ZWM6IFJ4IEF2Z1Jzc2k9JWRcblxuIiwgcEFkLT5hdGUuQXZnUnNzaTApOworCQkJfQorCQkJTWxtZVJlc2V0UmFsaW5rQ291bnRlcnMocEFkKTsKKwkJCXJldHVybjsKKyAgICAJfQorI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKworCisJCWlmIChyeF9Ub3RhbCkKKwkJeworCisJCQkvLyByZXNldCBjb3VudGVycworCQkJcnhfQU1TRFUgPSAwOworCQkJcnhfVG90YWwgPSAwOworCQl9CisKKwkJLy8gTWVkaWEgc3RhdHVzIGNoYW5nZWQsIHJlcG9ydCB0byBORElTCisJCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTUVESUFfU1RBVEVfQ0hBTkdFKSkKKwkJeworCQkJUlRNUF9DTEVBUl9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9NRURJQV9TVEFURV9DSEFOR0UpOworCQkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSkKKwkJCXsKKwkJCQlwQWQtPkluZGljYXRlTWVkaWFTdGF0ZSA9IE5kaXNNZWRpYVN0YXRlQ29ubmVjdGVkOworCQkJCVJUTVBfSW5kaWNhdGVNZWRpYVN0YXRlKHBBZCk7CisKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlwQWQtPkluZGljYXRlTWVkaWFTdGF0ZSA9IE5kaXNNZWRpYVN0YXRlRGlzY29ubmVjdGVkOworCQkJCVJUTVBfSW5kaWNhdGVNZWRpYVN0YXRlKHBBZCk7CisJCQl9CisJCX0KKworCQlOZGlzR2V0U3lzdGVtVXBUaW1lKCZwQWQtPk1sbWUuTm93MzIpOworCisJCS8vIGFkZCB0aGUgbW9zdCB1cC10by1kYXRlIGgvdyByYXcgY291bnRlcnMgaW50byBzb2Z0d2FyZSB2YXJpYWJsZSwgc28gdGhhdAorCQkvLyB0aGUgZHluYW1pYyB0dW5pbmcgbWVjaGFuaXNtIGJlbG93IGFyZSBiYXNlZCBvbiBtb3N0IHVwLXRvLWRhdGUgaW5mb3JtYXRpb24KKwkJTklDVXBkYXRlUmF3Q291bnRlcnMocEFkKTsKKworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisgICAJCS8vIE5lZWQgc3RhdGlzdGljcyBhZnRlciByZWFkIGNvdW50ZXIuIFNvIHB1dCBhZnRlciBOSUNVcGRhdGVSYXdDb3VudGVycworCQlPUklCQVRpbWVyVGltZW91dChwQWQpOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisKKwkJLy8gVGhlIHRpbWUgcGVyaW9kIGZvciBjaGVja2luZyBhbnRlbm5hIGlzIGFjY29yZGluZyB0byB0cmFmZmljCisJCWlmIChwQWQtPk1sbWUuYkVuYWJsZUF1dG9BbnRlbm5hQ2hlY2spCisJCXsKKwkJCVR4VG90YWxDbnQgPSBwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4Tm9SZXRyeU9rQ291bnQgKworCQkJCQkJCSBwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4UmV0cnlPa0NvdW50ICsKKwkJCQkJCQkgcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeEZhaWxDb3VudDsKKworCQkJaWYgKFR4VG90YWxDbnQgPiA1MCkKKwkJCXsKKwkJCQlpZiAocEFkLT5NbG1lLk9uZVNlY1BlcmlvZGljUm91bmQgJSAxMCA9PSAwKQorCQkJCXsKKwkJCQkJQXNpY0V2YWx1YXRlUnhBbnQocEFkKTsKKwkJCQl9CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJaWYgKHBBZC0+TWxtZS5PbmVTZWNQZXJpb2RpY1JvdW5kICUgMyA9PSAwKQorCQkJCXsKKwkJCQkJQXNpY0V2YWx1YXRlUnhBbnQocEFkKTsKKwkJCQl9CisJCQl9CisJCX0KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQkJU1RBTWxtZVBlcmlvZGljRXhlYyhwQWQpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJCU1sbWVSZXNldFJhbGlua0NvdW50ZXJzKHBBZCk7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJeworI2lmZGVmIFJUMjg2MAorCQkJaWYgKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkgJiYgKHBBZC0+YlBDSWNsa09mZiA9PSBGQUxTRSkpCisjZW5kaWYgLy8gUlQyODYwIC8vCisJCQl7CisJCQkJLy8gV2hlbiBBZGhvYyBiZWFjb24gaXMgZW5hYmxlZCBhbmQgUlRTL0NUUyBpcyBlbmFibGVkLCB0aGVyZSBpcyBhIGNoYW5jZSB0aGF0IGhhcmR3YXJlIE1BQyBGU00gd2lsbCBydW4gaW50byBhIGRlYWRsb2NrCisJCQkJLy8gYW5kIHNlbmRpbmcgQ1RTLXRvLXNlbGYgb3ZlciBhbmQgb3Zlci4KKwkJCQkvLyBTb2Z0d2FyZSBQYXRjaCBTb2x1dGlvbjoKKwkJCQkvLyAxLiBQb2xsaW5nIGRlYnVnIHN0YXRlIHJlZ2lzdGVyIDB4MTBGNCBldmVyeSBvbmUgc2Vjb25kLgorCQkJCS8vIDIuIElmIGluIDB4MTBGNCB0aGUgKChiaXQyOT09MSkgJiYgKGJpdDc9PTEpKSBPUiAoKGJpdDI5PT0xKSAmJiAoYml0NT09MSkpLCBpdCBtZWFucyB0aGUgZGVhZGxvY2sgaGFzIG9jY3VycmVkLgorCQkJCS8vIDMuIElmIHRoZSBkZWFkbG9jayBvY2N1cnJlZCwgcmVzZXQgTUFDL0JCUCBieSBzZXR0aW5nIDB4MTAwNCB0byAweDAwMDEgZm9yIGEgd2hpbGUgdGhlbiBzZXR0aW5nIGl0IGJhY2sgdG8gMHgwMDBDIGFnYWluLgorCisJCQkJVUlOVDMyCU1hY1JlZyA9IDA7CisKKwkJCQlSVE1QX0lPX1JFQUQzMihwQWQsIDB4MTBGNCwgJk1hY1JlZyk7CisJCQkJaWYgKCgoTWFjUmVnICYgMHgyMDAwMDAwMCkgJiYgKE1hY1JlZyAmIDB4ODApKSB8fCAoKE1hY1JlZyAmIDB4MjAwMDAwMDApICYmIChNYWNSZWcgJiAweDIwKSkpCisJCQkJeworCQkJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIDB4MSk7CisJCQkJCVJUTVB1c2VjRGVsYXkoMSk7CisJCQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgMHhDKTsKKworCQkJCQlEQkdQUklOVChSVF9ERUJVR19XQVJOLCgiV2FybmluZywgTUFDIHNwZWNpZmljIGNvbmRpdGlvbiBvY2N1cnMgXG4iKSk7CisJCQkJfQorCQkJfQorCQl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwkJUlQyOFhYX01MTUVfSEFORExFUihwQWQpOworCX0KKworCisJcEFkLT5iVXBkYXRlQmNuQ250RG9uZSA9IEZBTFNFOworfQorCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCitWT0lEIFNUQU1sbWVQZXJpb2RpY0V4ZWMoCisJUFJUTVBfQURBUFRFUiBwQWQpCit7CisJVUxPTkcJCQkgICAgVHhUb3RhbENudDsKKworLy8KKy8vIFdlIHJldHVybiBoZXJlIGluIEFURSBtb2RlLCBiZWNhdXNlIHRoZSBzdGF0aXN0aWNzCisvLyB0aGF0IEFURSBuZWVkcyBhcmUgbm90IGNvbGxlY3RlZCB2aWEgdGhpcyByb3V0aW5lLgorLy8KKyNpZmRlZiBSQUxJTktfQVRFCisJLy8gSXQgaXMgc3VwcG9zZWQgdGhhdCB3ZSB3aWxsIG5ldmVyIHJlYWNoIGhlcmUgaW4gQVRFIG1vZGUuCisJQVNTRVJUKCEoQVRFX09OKHBBZCkpKTsKKwlpZiAoQVRFX09OKHBBZCkpCisJCXJldHVybjsKKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgaWYgKHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCA9PSBXUEFfU1VQUExJQ0FOVF9ESVNBQkxFKQorI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKyAgICB7CisgICAgCS8vIFdQQSBNSUMgZXJyb3Igc2hvdWxkIGJsb2NrIGFzc29jaWF0aW9uIGF0dGVtcHQgZm9yIDYwIHNlY29uZHMKKyAgICAJaWYgKHBBZC0+U3RhQ2ZnLmJCbG9ja0Fzc29jICYmIChwQWQtPlN0YUNmZy5MYXN0TWljRXJyb3JUaW1lICsgKDYwICogT1NfSFopIDwgcEFkLT5NbG1lLk5vdzMyKSkKKyAgICAJCXBBZC0+U3RhQ2ZnLmJCbG9ja0Fzc29jID0gRkFMU0U7CisgICAgfQorCisgICAgaWYgKChwQWQtPlByZU1lZGlhU3RhdGUgIT0gcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUpICYmIChwQWQtPkNvbW1vbkNmZy5iV2lyZWxlc3NFdmVudCkpCisJeworCQlpZiAocEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPT0gTmRpc01lZGlhU3RhdGVDb25uZWN0ZWQpCisJCXsKKwkJCVJUTVBTZW5kV2lyZWxlc3NFdmVudChwQWQsIElXX1NUQV9MSU5LVVBfRVZFTlRfRkxBRywgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5BZGRyLCBCU1MwLCAwKTsKKwkJfQorCQlwQWQtPlByZU1lZGlhU3RhdGUgPSBwQWQtPkluZGljYXRlTWVkaWFTdGF0ZTsKKwl9CisKKworCisKKyAgIAlBc2ljU3RhQmJwVHVuaW5nKHBBZCk7CisKKwlUeFRvdGFsQ250ID0gcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeE5vUmV0cnlPa0NvdW50ICsKKwkJCQkJIHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhSZXRyeU9rQ291bnQgKworCQkJCQkgcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeEZhaWxDb3VudDsKKworCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCkpCisJeworCQkvLyB1cGRhdGUgY2hhbm5lbCBxdWFsaXR5IGZvciBSb2FtaW5nIGFuZCBVSSBMaW5rUXVhbGl0eSBkaXNwbGF5CisJCU1sbWVDYWxjdWxhdGVDaGFubmVsUXVhbGl0eShwQWQsIHBBZC0+TWxtZS5Ob3czMik7CisJfQorCisJLy8gbXVzdCBiZSBBRlRFUiBNbG1lRHluYW1pY1R4UmF0ZVN3aXRjaGluZygpIGJlY2F1c2UgaXQgbmVlZHMgdG8ga25vdyBpZgorCS8vIFJhZGlvIGlzIGN1cnJlbnRseSBpbiBub2lzeSBlbnZpcm9ubWVudAorCWlmICghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKSkKKwkJQXNpY0FkanVzdFR4UG93ZXIocEFkKTsKKworCWlmIChJTkZSQV9PTihwQWQpKQorCXsKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwkJLy8gQ2hlY2sgRExTIHRpbWUgb3V0LCB0aGVuIHRlYXIgZG93biB0aG9zZSBzZXNzaW9uCisJCVJUTVBDaGVja0RMU1RpbWVPdXQocEFkKTsKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKworCQkvLyBJcyBQU00gYml0IGNvbnNpc3RlbnQgd2l0aCB1c2VyIHBvd2VyIG1hbmFnZW1lbnQgcG9saWN5PworCQkvLyBUaGlzIGlzIHRoZSBvbmx5IHBsYWNlIHRoYXQgd2lsbCBzZXQgUFNNIGJpdCBPTi4KKwkJaWYgKCFPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0RPWkUpKQorCQlNbG1lQ2hlY2tQc21DaGFuZ2UocEFkLCBwQWQtPk1sbWUuTm93MzIpOworCisJCXBBZC0+UmFsaW5rQ291bnRlcnMuTGFzdE9uZVNlY1RvdGFsVHhDb3VudCA9IFR4VG90YWxDbnQ7CisKKwkJaWYgKChwQWQtPlN0YUNmZy5MYXN0QmVhY29uUnhUaW1lICsgMSpPU19IWiA8IHBBZC0+TWxtZS5Ob3czMikgJiYKKwkJCSghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKSkgJiYKKwkJCSgoVHhUb3RhbENudCArIHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjUnhPa0NudCA8IDYwMCkpKQorCQl7CisJCQlSVE1QU2V0QUdDSW5pdFZhbHVlKHBBZCwgQldfMjApOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTU1DSEsgLSBObyBCRUFDT04uIHJlc3RvcmUgUjY2IHRvIHRoZSBsb3cgYm91bmQoJWQpIFxuIiwgKDB4MkUgKyBHRVRfTE5BX0dBSU4ocEFkKSkpKTsKKwkJfQorCisgICAgICAgIHsKKyAgICAJCWlmIChwQWQtPkNvbW1vbkNmZy5iQVBTRENhcGFibGUgJiYgcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5iQVBTRENhcGFibGUpCisgICAgCQl7CisgICAgCQkgICAgLy8gV2hlbiBBUFNEIGlzIGVuYWJsZWQsIHRoZSBwZXJpb2QgY2hhbmdlcyBhcyAyMCBzZWMKKyAgICAJCQlpZiAoKHBBZC0+TWxtZS5PbmVTZWNQZXJpb2RpY1JvdW5kICUgMjApID09IDgpCisgICAgCQkJCVJUTVBTZW5kTnVsbEZyYW1lKHBBZCwgcEFkLT5Db21tb25DZmcuVHhSYXRlLCBUUlVFKTsKKyAgICAJCX0KKyAgICAJCWVsc2UKKyAgICAJCXsKKyAgICAJCSAgICAvLyBTZW5kIG91dCBhIE5VTEwgZnJhbWUgZXZlcnkgMTAgc2VjIHRvIGluZm9ybSBBUCB0aGF0IFNUQSBpcyBzdGlsbCBhbGl2ZSAoQXZvaWQgYmVpbmcgYWdlIG91dCkKKyAgICAJCQlpZiAoKHBBZC0+TWxtZS5PbmVTZWNQZXJpb2RpY1JvdW5kICUgMTApID09IDgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAocEFkLT5Db21tb25DZmcuYldtbUNhcGFibGUpCisgICAgCQkJCQlSVE1QU2VuZE51bGxGcmFtZShwQWQsIHBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZSwgVFJVRSk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKwkJCQkJCVJUTVBTZW5kTnVsbEZyYW1lKHBBZCwgcEFkLT5Db21tb25DZmcuVHhSYXRlLCBGQUxTRSk7CisgICAgICAgICAgICAgICAgfQorICAgIAkJfQorICAgICAgICB9CisKKwkJaWYgKENRSV9JU19ERUFEKHBBZC0+TWxtZS5DaGFubmVsUXVhbGl0eSkpCisJCQl7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNTUNISyAtIE5vIEJFQUNPTi4gRGVhZCBDUUkuIEF1dG8gUmVjb3ZlcnkgYXR0ZW1wdCAjJWxkXG4iLCBwQWQtPlJhbGlua0NvdW50ZXJzLkJhZENRSUF1dG9SZWNvdmVyeUNvdW50KSk7CisJCQlwQWQtPlN0YUNmZy5DQ1hBZGphY2VudEFQUmVwb3J0RmxhZyA9IFRSVUU7CisJCQlwQWQtPlN0YUNmZy5DQ1hBZGphY2VudEFQTGlua0Rvd25UaW1lID0gcEFkLT5TdGFDZmcuTGFzdEJlYWNvblJ4VGltZTsKKworCQkJLy8gTG9zdCBBUCwgc2VuZCBkaXNjb25uZWN0ICYgbGluayBkb3duIGV2ZW50CisJCQlMaW5rRG93bihwQWQsIEZBTFNFKTsKKworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyNpZm5kZWYgTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyAgICAgICAgICAgIGlmIChwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVApCisJCQl7CisgICAgICAgICAgICAgICAgdW5pb24gaXdyZXFfZGF0YSAgICB3cnF1OworICAgICAgICAgICAgICAgIC8vc2VuZCBkaXNhc3NvY2lhdGUgZXZlbnQgdG8gd3BhX3N1cHBsaWNhbnQKKyAgICAgICAgICAgICAgICBtZW1zZXQoJndycXUsIDAsIHNpemVvZih3cnF1KSk7CisgICAgICAgICAgICAgICAgd3JxdS5kYXRhLmZsYWdzID0gUlRfRElTQVNTT0NfRVZFTlRfRkxBRzsKKyAgICAgICAgICAgICAgICB3aXJlbGVzc19zZW5kX2V2ZW50KHBBZC0+bmV0X2RldiwgSVdFVkNVU1RPTSwgJndycXUsIE5VTEwpOworICAgICAgICAgICAgfQorI2VuZGlmIC8vIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCisjaWZkZWYgTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1bmlvbiBpd3JlcV9kYXRhICAgIHdycXU7CisgICAgICAgICAgICAgICAgbWVtc2V0KHdycXUuYXBfYWRkci5zYV9kYXRhLCAwLCBNQUNfQUREUl9MRU4pOworICAgICAgICAgICAgICAgIHdpcmVsZXNzX3NlbmRfZXZlbnQocEFkLT5uZXRfZGV2LCBTSU9DR0lXQVAsICZ3cnF1LCBOVUxMKTsKKyAgICAgICAgICAgIH0KKyNlbmRpZiAvLyBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCisJCQlNbG1lQXV0b1JlY29ubmVjdExhc3RTU0lEKHBBZCk7CisJCX0KKwkJZWxzZSBpZiAoQ1FJX0lTX0JBRChwQWQtPk1sbWUuQ2hhbm5lbFF1YWxpdHkpKQorCQl7CisJCQlwQWQtPlJhbGlua0NvdW50ZXJzLkJhZENRSUF1dG9SZWNvdmVyeUNvdW50ICsrOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTU1DSEsgLSBCYWQgQ1FJLiBBdXRvIFJlY292ZXJ5IGF0dGVtcHQgIyVsZFxuIiwgcEFkLT5SYWxpbmtDb3VudGVycy5CYWRDUUlBdXRvUmVjb3ZlcnlDb3VudCkpOworCQkJTWxtZUF1dG9SZWNvbm5lY3RMYXN0U1NJRChwQWQpOworCQl9CisKKwkJLy8gQWRkIGF1dG8gc2VhbWxlc3Mgcm9hbWluZworCQlpZiAocEFkLT5TdGFDZmcuYkZhc3RSb2FtaW5nKQorCQl7CisJCQlTSE9SVAlkQm1Ub1JvYW0gPSAoU0hPUlQpcEFkLT5TdGFDZmcuZEJtVG9Sb2FtOworCisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSc3NpPSVkLCBkQm1Ub1JvYW09JWRcbiIsIFJUTVBNYXhSc3NpKHBBZCwgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTAsIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kxLCBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMiksIChDSEFSKWRCbVRvUm9hbSkpOworCisJCQlpZiAoUlRNUE1heFJzc2kocEFkLCBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMCwgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTEsIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kyKSA8PSAoQ0hBUilkQm1Ub1JvYW0pCisJCQl7CisJCQkJTWxtZUNoZWNrRm9yRmFzdFJvYW1pbmcocEFkLCBwQWQtPk1sbWUuTm93MzIpOworCQkJfQorCQl9CisJfQorCWVsc2UgaWYgKEFESE9DX09OKHBBZCkpCisJeworCQkvLyAyMDAzLTA0LTE3IGpvaG4uIHRoaXMgaXMgYSBwYXRjaCB0aGF0IGRyaXZlciBmb3JjZXMgYSBCRUFDT04gb3V0IGlmIEFTSUMgZmFpbHMKKwkJLy8gdGhlICJUWCBCRUFDT04gY29tcGV0aXRpb24iIGZvciB0aGUgZW50aXJlIHBhc3QgMSBzZWMuCisJCS8vIFNvIHRoYXQgZXZlbiB3aGVuIEFTSUMncyBCRUFDT05nZW4gZW5naW5lIGJlZW4gYmxvY2tlZAorCQkvLyBieSBwZWVyJ3MgQkVBQ09OIGR1ZSB0byBzbG93ZXIgc3lzdGVtIGNsb2NrLCB0aGlzIFNUQSBzdGlsbCBjYW4gc2VuZCBvdXQKKwkJLy8gbWluaW11bSBCRUFDT04gdG8gdGVsbCB0aGUgcGVlciBJJ20gYWxpdmUuCisJCS8vIGRyYXdiYWNrIGlzIHRoYXQgdGhpcyBCRUFDT04gd29uJ3QgYmUgd2VsbCBhbGlnbmVkIGF0IFRCVFQgYm91bmRhcnkuCisJCS8vIEVucXVldWVCZWFjb25GcmFtZShwQWQpOwkJCSAgLy8gc29mdHdhcmUgc2VuZCBCRUFDT04KKworCQkvLyBpZiBhbGwgMTFiIHBlZXJzIGxlYXZlIHRoaXMgQlNTIG1vcmUgdGhhbiA1IHNlY29uZHMsIHVwZGF0ZSBUeCByYXRlLAorCQkvLyByZXN0b3JlIG91dGdvaW5nIEJFQUNPTiB0byBzdXBwb3J0IEIvRy1taXhlZCBtb2RlCisJCWlmICgocEFkLT5Db21tb25DZmcuQ2hhbm5lbCA8PSAxNCkJCQkgICAmJgorCQkJKHBBZC0+Q29tbW9uQ2ZnLk1heFR4UmF0ZSA8PSBSQVRFXzExKQkgICAmJgorCQkJKHBBZC0+Q29tbW9uQ2ZnLk1heERlc2lyZWRSYXRlID4gUkFURV8xMSkgICYmCisJCQkoKHBBZC0+U3RhQ2ZnLkxhc3QxMWJCZWFjb25SeFRpbWUgKyA1Kk9TX0haKSA8IHBBZC0+TWxtZS5Ob3czMikpCisJCXsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1NQ0hLIC0gbGFzdCAxMUIgcGVlciBsZWZ0LCB1cGRhdGUgVHggcmF0ZXNcbiIpKTsKKwkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQWN0aXZlLlN1cFJhdGUsIHBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGUsIE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTKTsKKwkJCXBBZC0+U3RhQWN0aXZlLlN1cFJhdGVMZW4gPSBwQWQtPkNvbW1vbkNmZy5TdXBSYXRlTGVuOworCQkJTWxtZVVwZGF0ZVR4UmF0ZXMocEFkLCBGQUxTRSwgMCk7CisJCQlNYWtlSWJzc0JlYWNvbihwQWQpOwkJLy8gcmUtYnVpbGQgQkVBQ09OIGZyYW1lCisJCQlBc2ljRW5hYmxlSWJzc1N5bmMocEFkKTsJLy8gY29weSB0byBvbi1jaGlwIG1lbW9yeQorCQkJcEFkLT5TdGFDZmcuQWRob2NCT25seUpvaW5lZCA9IEZBTFNFOworCQl9CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCkKKwkJeworCQkJaWYgKChwQWQtPlN0YUNmZy5BZGhvY0JHSm9pbmVkKSAmJgorCQkJCSgocEFkLT5TdGFDZmcuTGFzdDExZ0JlYWNvblJ4VGltZSArIDUgKiBPU19IWikgPCBwQWQtPk1sbWUuTm93MzIpKQorCQkJeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1NQ0hLIC0gbGFzdCAxMUcgcGVlciBsZWZ0XG4iKSk7CisJCQkJcEFkLT5TdGFDZmcuQWRob2NCR0pvaW5lZCA9IEZBTFNFOworCQkJfQorCisJCQlpZiAoKHBBZC0+U3RhQ2ZnLkFkaG9jMjBOSm9pbmVkKSAmJgorCQkJCSgocEFkLT5TdGFDZmcuTGFzdDIwTkJlYWNvblJ4VGltZSArIDUgKiBPU19IWikgPCBwQWQtPk1sbWUuTm93MzIpKQorCQkJeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1NQ0hLIC0gbGFzdCAyME1IeiBOIHBlZXIgbGVmdFxuIikpOworCQkJCXBBZC0+U3RhQ2ZnLkFkaG9jMjBOSm9pbmVkID0gRkFMU0U7CisJCQl9CisJCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCQkvL3JhZGFyIGRldGVjdAorCQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPiAxNCkKKwkJCSYmIChwQWQtPkNvbW1vbkNmZy5iSUVFRTgwMjExSCA9PSAxKQorCQkJJiYgUmFkYXJDaGFubmVsQ2hlY2socEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKSkKKwkJeworCQkJUmFkYXJEZXRlY3RQZXJpb2RpYyhwQWQpOworCQl9CisKKwkJLy8gSWYgYWxsIHBlZXJzIGxlYXZlLCBhbmQgdGhpcyBTVEEgYmVjb21lcyB0aGUgbGFzdCBvbmUgaW4gdGhpcyBJQlNTLCB0aGVuIGNoYW5nZSBNZWRpYVN0YXRlCisJCS8vIHRvIERJU0NPTk5FQ1RFRC4gQnV0IHN0aWxsIGhvbGRpbmcgdGhpcyBJQlNTIChpLmUuIHNlbmRpbmcgQkVBQ09OKSBzbyB0aGF0IG90aGVyIFNUQXMgY2FuCisJCS8vIGpvaW4gbGF0ZXIuCisJCWlmICgocEFkLT5TdGFDZmcuTGFzdEJlYWNvblJ4VGltZSArIEFESE9DX0JFQUNPTl9MT1NUX1RJTUUgPCBwQWQtPk1sbWUuTm93MzIpICYmCisJCQlPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCkpCisJCXsKKwkJCU1MTUVfU1RBUlRfUkVRX1NUUlVDVCAgICAgU3RhcnRSZXE7CisKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1NQ0hLIC0gZXhjZXNzaXZlIEJFQUNPTiBsb3N0LCBsYXN0IFNUQSBpbiB0aGlzIElCU1MsIE1lZGlhU3RhdGU9RGlzY29ubmVjdGVkXG4iKSk7CisJCQlMaW5rRG93bihwQWQsIEZBTFNFKTsKKworCQkJU3RhcnRQYXJtRmlsbChwQWQsICZTdGFydFJlcSwgcEFkLT5NbG1lQXV4LlNzaWQsIHBBZC0+TWxtZUF1eC5Tc2lkTGVuKTsKKwkJCU1sbWVFbnF1ZXVlKHBBZCwgU1lOQ19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9TVEFSVF9SRVEsIHNpemVvZihNTE1FX1NUQVJUX1JFUV9TVFJVQ1QpLCAmU3RhcnRSZXEpOworCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9TVEFSVDsKKwkJfQorCX0KKwllbHNlIC8vIG5vIElORlJBIG5vciBBREhPQyBjb25uZWN0aW9uCisJeworCisJCWlmIChwQWQtPlN0YUNmZy5iU2NhblJlcUlzRnJvbVdlYlVJICYmCisgICAgICAgICAgICAoKHBBZC0+U3RhQ2ZnLkxhc3RTY2FuVGltZSArIDMwICogT1NfSFopID4gcEFkLT5NbG1lLk5vdzMyKSkKKwkJCWdvdG8gU0tJUF9BVVRPX1NDQU5fQ09OTjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcEFkLT5TdGFDZmcuYlNjYW5SZXFJc0Zyb21XZWJVSSA9IEZBTFNFOworCisJCWlmICgocEFkLT5TdGFDZmcuYkF1dG9SZWNvbm5lY3QgPT0gVFJVRSkKKwkJCSYmIFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9TVEFSVF9VUCkKKwkJCSYmIChNbG1lVmFsaWRhdGVTU0lEKHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZCwgcEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuKSA9PSBUUlVFKSkKKwkJeworCQkJaWYgKChwQWQtPlNjYW5UYWIuQnNzTnI9PTApICYmIChwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID09IENOVExfSURMRSkpCisJCQl7CisJCQkJTUxNRV9TQ0FOX1JFUV9TVFJVQ1QJICAgU2NhblJlcTsKKworCQkJCWlmICgocEFkLT5TdGFDZmcuTGFzdFNjYW5UaW1lICsgMTAgKiBPU19IWikgPCBwQWQtPk1sbWUuTm93MzIpCisJCQkJeworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTVEFNbG1lUGVyaW9kaWNFeGVjKCk6Q05UTCAtIFNjYW5UYWIuQnNzTnI9PTAsIHN0YXJ0IGEgbmV3IEFDVElWRSBzY2FuIFNTSURbJXNdXG4iLCBwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWQpKTsKKwkJCQkJU2NhblBhcm1GaWxsKHBBZCwgJlNjYW5SZXEsIHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZCwgcEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuLCBCU1NfQU5ZLCBTQ0FOX0FDVElWRSk7CisJCQkJCU1sbWVFbnF1ZXVlKHBBZCwgU1lOQ19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9TQ0FOX1JFUSwgc2l6ZW9mKE1MTUVfU0NBTl9SRVFfU1RSVUNUKSwgJlNjYW5SZXEpOworCQkJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX09JRF9MSVNUX1NDQU47CisJCQkJCS8vIFJlc2V0IE1pc3NlZCBzY2FuIG51bWJlcgorCQkJCQlwQWQtPlN0YUNmZy5MYXN0U2NhblRpbWUgPSBwQWQtPk1sbWUuTm93MzI7CisJCQkJfQorCQkJCWVsc2UgaWYgKHBBZC0+U3RhQ2ZnLkJzc1R5cGUgPT0gQlNTX0FESE9DKQkvLyBRdWl0IHRoZSBmb3JldmVyIHNjYW4gd2hlbiBpbiBhIHZlcnkgY2xlYW4gcm9vbQorCQkJCQlNbG1lQXV0b1JlY29ubmVjdExhc3RTU0lEKHBBZCk7CisJCQl9CisJCQllbHNlIGlmIChwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID09IENOVExfSURMRSkKKwkJCXsKKwkJCQlpZiAoKHBBZC0+TWxtZS5PbmVTZWNQZXJpb2RpY1JvdW5kICUgNykgPT0gMCkKKwkJCQl7CisJCQkJCU1sbWVBdXRvU2NhbihwQWQpOworCQkJCQlwQWQtPlN0YUNmZy5MYXN0U2NhblRpbWUgPSBwQWQtPk1sbWUuTm93MzI7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisjaWZkZWYgQ0FSUklFUl9ERVRFQ1RJT05fU1VQUE9SVCAvLyBSb2dlciBzeW5jIENhcnJpZXIKKwkJCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkNhcnJpZXJEZXRlY3QuRW5hYmxlID09IFRSVUUpCisJCQkJCXsKKwkJCQkJCWlmICgocEFkLT5NbG1lLk9uZVNlY1BlcmlvZGljUm91bmQgJSA1KSA9PSAxKQorCQkJCQkJCU1sbWVBdXRvUmVjb25uZWN0TGFzdFNTSUQocEFkKTsKKwkJCQkJfQorCQkJCQllbHNlCisjZW5kaWYgLy8gQ0FSUklFUl9ERVRFQ1RJT05fU1VQUE9SVCAvLworCQkJCQkJTWxtZUF1dG9SZWNvbm5lY3RMYXN0U1NJRChwQWQpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworU0tJUF9BVVRPX1NDQU5fQ09OTjoKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorICAgIGlmICgocEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5UWEJBYml0bWFwICE9MCkgJiYgKHBBZC0+TWFjVGFiLmZBbnlCQVNlc3Npb24gPT0gRkFMU0UpKQorCXsKKwkJcEFkLT5NYWNUYWIuZkFueUJBU2Vzc2lvbiA9IFRSVUU7CisJCUFzaWNVcGRhdGVQcm90ZWN0KHBBZCwgSFRfRk9SQ0VSVFNDVFMsICBBTExOX1NFVFBST1RFQ1QsIEZBTFNFLCBGQUxTRSk7CisJfQorCWVsc2UgaWYgKChwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlRYQkFiaXRtYXAgPT0wKSAmJiAocEFkLT5NYWNUYWIuZkFueUJBU2Vzc2lvbiA9PSBUUlVFKSkKKwl7CisJCXBBZC0+TWFjVGFiLmZBbnlCQVNlc3Npb24gPSBGQUxTRTsKKwkJQXNpY1VwZGF0ZVByb3RlY3QocEFkLCBwQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzIuT3BlcmFpb25Nb2RlLCAgQUxMTl9TRVRQUk9URUNULCBGQUxTRSwgRkFMU0UpOworCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisjaWZkZWYgRE9UMTFOX0RSQUZUMworCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1NDQU5fMjA0MCkpCisJCVRyaUV2ZW50Q291bnRlck1haW50ZW5hbmNlKHBBZCk7CisjZW5kaWYgLy8gRE9UMTFOX0RSQUZUMyAvLworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJcmV0dXJuOworfQorCisvLyBMaW5rIGRvd24gcmVwb3J0CitWT0lEIExpbmtEb3duRXhlYygKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCisJSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpCit7CisKKwlSVE1QX0FEQVBURVIgKnBBZCA9IChSVE1QX0FEQVBURVIgKilGdW5jdGlvbkNvbnRleHQ7CisKKwlwQWQtPkluZGljYXRlTWVkaWFTdGF0ZSA9IE5kaXNNZWRpYVN0YXRlRGlzY29ubmVjdGVkOworCVJUTVBfSW5kaWNhdGVNZWRpYVN0YXRlKHBBZCk7CisgICAgcEFkLT5FeHRyYUluZm8gPSBHRU5FUkFMX0xJTktfRE9XTjsKK30KKworLy8gSVJRTCA9IERJU1BBVENIX0xFVkVMCitWT0lEIE1sbWVBdXRvU2NhbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwkvLyBjaGVjayBDbnRsTWFjaGluZS5DdXJyU3RhdGUgdG8gYXZvaWQgY29sbGlzaW9uIHdpdGggTkRJUyBTZXRPSUQgcmVxdWVzdAorCWlmIChwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID09IENOVExfSURMRSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1NQ0hLIC0gRHJpdmVyIGF1dG8gc2NhblxuIikpOworCQlNbG1lRW5xdWV1ZShwQWQsCisJCQkJCU1MTUVfQ05UTF9TVEFURV9NQUNISU5FLAorCQkJCQlPSURfODAyXzExX0JTU0lEX0xJU1RfU0NBTiwKKwkJCQkJMCwKKwkJCQkJTlVMTCk7CisJCVJUMjhYWF9NTE1FX0hBTkRMRVIocEFkKTsKKwl9Cit9CisKKy8vIElSUUwgPSBESVNQQVRDSF9MRVZFTAorVk9JRCBNbG1lQXV0b1JlY29ubmVjdExhc3RTU0lEKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCisKKwkvLyBjaGVjayBDbnRsTWFjaGluZS5DdXJyU3RhdGUgdG8gYXZvaWQgY29sbGlzaW9uIHdpdGggTkRJUyBTZXRPSUQgcmVxdWVzdAorCWlmICgocEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9PSBDTlRMX0lETEUpICYmCisJCShNbG1lVmFsaWRhdGVTU0lEKHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZCwgcEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuKSA9PSBUUlVFKSkKKwl7CisJCU5ESVNfODAyXzExX1NTSUQgT2lkU3NpZDsKKwkJT2lkU3NpZC5Tc2lkTGVuZ3RoID0gcEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuOworCQlOZGlzTW92ZU1lbW9yeShPaWRTc2lkLlNzaWQsIHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZCwgcEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuKTsKKworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJEcml2ZXIgYXV0byByZWNvbm5lY3QgdG8gbGFzdCBPSURfODAyXzExX1NTSUQgc2V0dGluZyAtICVzLCBsZW4gLSAlZFxuIiwgcEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkLCBwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWRMZW4pKTsKKwkJTWxtZUVucXVldWUocEFkLAorCQkJCQlNTE1FX0NOVExfU1RBVEVfTUFDSElORSwKKwkJCQkJT0lEXzgwMl8xMV9TU0lELAorCQkJCQlzaXplb2YoTkRJU184MDJfMTFfU1NJRCksCisJCQkJCSZPaWRTc2lkKTsKKwkJUlQyOFhYX01MTUVfSEFORExFUihwQWQpOworCX0KK30KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCVZhbGlkYXRlIFNTSUQgZm9yIGNvbm5lY3Rpb24gdHJ5IGFuZCByZXNjYW4gcHVycG9zZQorCVZhbGlkIFNTSUQgd2lsbCBoYXZlIHZpc2libGUgY2hhcnMgb25seS4KKwlUaGUgdmFsaWQgbGVuZ3RoIGlzIGZyb20gMCB0byAzMi4KKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitCT09MRUFOIE1sbWVWYWxpZGF0ZVNTSUQoCisJSU4gUFVDSEFSCXBTc2lkLAorCUlOIFVDSEFSCVNzaWRMZW4pCit7CisJaW50CWluZGV4OworCisJaWYgKFNzaWRMZW4gPiBNQVhfTEVOX09GX1NTSUQpCisJCXJldHVybiAoRkFMU0UpOworCisJLy8gQ2hlY2sgZWFjaCBjaGFyYWN0ZXIgdmFsdWUKKwlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBTc2lkTGVuOyBpbmRleCsrKQorCXsKKwkJaWYgKHBTc2lkW2luZGV4XSA8IDB4MjApCisJCQlyZXR1cm4gKEZBTFNFKTsKKwl9CisKKwkvLyBBbGwgY2hlY2tlZAorCXJldHVybiAoVFJVRSk7Cit9CisKK1ZPSUQgTWxtZVNlbGVjdFR4UmF0ZVRhYmxlKAorCUlOIFBSVE1QX0FEQVBURVIJCXBBZCwKKwlJTiBQTUFDX1RBQkxFX0VOVFJZCQlwRW50cnksCisJSU4gUFVDSEFSCQkJCSpwcFRhYmxlLAorCUlOIFBVQ0hBUgkJCQlwVGFibGVTaXplLAorCUlOIFBVQ0hBUgkJCQlwSW5pdFR4UmF0ZUlkeCkKK3sKKwlkbworCXsKKwkJLy8gZGVjaWRlIHRoZSByYXRlIHRhYmxlIGZvciB0dW5pbmcKKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZVRhYmxlU2l6ZSA+IDApCisJCXsKKwkJCSpwcFRhYmxlID0gUmF0ZVN3aXRjaFRhYmxlOworCQkJKnBUYWJsZVNpemUgPSBSYXRlU3dpdGNoVGFibGVbMF07CisJCQkqcEluaXRUeFJhdGVJZHggPSBSYXRlU3dpdGNoVGFibGVbMV07CisKKwkJCWJyZWFrOworCQl9CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJaWYgKChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKSAmJiBBREhPQ19PTihwQWQpKQorCQl7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCkgJiYKKwkJCQkhcEFkLT5TdGFDZmcuQWRob2NCT25seUpvaW5lZCAmJgorCQkJCSFwQWQtPlN0YUNmZy5BZGhvY0JHSm9pbmVkICYmCisJCQkJKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uTUNTU2V0WzBdID09IDB4ZmYpICYmCisJCQkJKChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLk1DU1NldFsxXSA9PSAweDAwKSB8fCAocEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCA9PSAxKSkpCisJCQl7Ly8gMTFOIDFTIEFkaG9jCisJCQkJKnBwVGFibGUgPSBSYXRlU3dpdGNoVGFibGUxMU4xUzsKKwkJCQkqcFRhYmxlU2l6ZSA9IFJhdGVTd2l0Y2hUYWJsZTExTjFTWzBdOworCQkJCSpwSW5pdFR4UmF0ZUlkeCA9IFJhdGVTd2l0Y2hUYWJsZTExTjFTWzFdOworCisJCQl9CisJCQllbHNlIGlmICgocEFkLT5Db21tb25DZmcuUGh5TW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEKSAmJgorCQkJCQkhcEFkLT5TdGFDZmcuQWRob2NCT25seUpvaW5lZCAmJgorCQkJCQkhcEFkLT5TdGFDZmcuQWRob2NCR0pvaW5lZCAmJgorCQkJCQkocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5NQ1NTZXRbMF0gPT0gMHhmZikgJiYKKwkJCQkJKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uTUNTU2V0WzFdID09IDB4ZmYpICYmCisJCQkJCShwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoID09IDIpKQorCQkJey8vIDExTiAyUyBBZGhvYworCQkJCWlmIChwQWQtPkxhdGNoUmZSZWdzLkNoYW5uZWwgPD0gMTQpCisJCQkJeworCQkJCQkqcHBUYWJsZSA9IFJhdGVTd2l0Y2hUYWJsZTExTjJTOworCQkJCQkqcFRhYmxlU2l6ZSA9IFJhdGVTd2l0Y2hUYWJsZTExTjJTWzBdOworCQkJCQkqcEluaXRUeFJhdGVJZHggPSBSYXRlU3dpdGNoVGFibGUxMU4yU1sxXTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJKnBwVGFibGUgPSBSYXRlU3dpdGNoVGFibGUxMU4yU0ZvckFCYW5kOworCQkJCQkqcFRhYmxlU2l6ZSA9IFJhdGVTd2l0Y2hUYWJsZTExTjJTRm9yQUJhbmRbMF07CisJCQkJCSpwSW5pdFR4UmF0ZUlkeCA9IFJhdGVTd2l0Y2hUYWJsZTExTjJTRm9yQUJhbmRbMV07CisJCQkJfQorCisJCQl9CisJCQllbHNlCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQikKKwkJCXsKKwkJCQkqcHBUYWJsZSA9IFJhdGVTd2l0Y2hUYWJsZTExQjsKKwkJCQkqcFRhYmxlU2l6ZSA9IFJhdGVTd2l0Y2hUYWJsZTExQlswXTsKKwkJCQkqcEluaXRUeFJhdGVJZHggPSBSYXRlU3dpdGNoVGFibGUxMUJbMV07CisKKwkJCX0KKwkgICAgICAgIGVsc2UgaWYoKHBBZC0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbCA8PSAxNCkgJiYgKHBBZC0+U3RhQ2ZnLkFkaG9jQk9ubHlKb2luZWQgPT0gVFJVRSkpCisJCQl7CisJCQkJLy8gVVNlIEIgVGFibGUgd2hlbiBPbmx5IGItb25seSBTdGF0aW9uIGluIG15IElCU1MgLgorCQkJCSpwcFRhYmxlID0gUmF0ZVN3aXRjaFRhYmxlMTFCOworCQkJCSpwVGFibGVTaXplID0gUmF0ZVN3aXRjaFRhYmxlMTFCWzBdOworCQkJCSpwSW5pdFR4UmF0ZUlkeCA9IFJhdGVTd2l0Y2hUYWJsZTExQlsxXTsKKworCQkJfQorCQkJZWxzZSBpZiAocEFkLT5MYXRjaFJmUmVncy5DaGFubmVsIDw9IDE0KQorCQkJeworCQkJCSpwcFRhYmxlID0gUmF0ZVN3aXRjaFRhYmxlMTFCRzsKKwkJCQkqcFRhYmxlU2l6ZSA9IFJhdGVTd2l0Y2hUYWJsZTExQkdbMF07CisJCQkJKnBJbml0VHhSYXRlSWR4ID0gUmF0ZVN3aXRjaFRhYmxlMTFCR1sxXTsKKworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCSpwcFRhYmxlID0gUmF0ZVN3aXRjaFRhYmxlMTFHOworCQkJCSpwVGFibGVTaXplID0gUmF0ZVN3aXRjaFRhYmxlMTFHWzBdOworCQkJCSpwSW5pdFR4UmF0ZUlkeCA9IFJhdGVTd2l0Y2hUYWJsZTExR1sxXTsKKworCQkJfQorCQkJYnJlYWs7CisJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQlpZiAoKHBFbnRyeS0+UmF0ZUxlbiA9PSAxMikgJiYgKHBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFswXSA9PSAweGZmKSAmJgorCQkJKChwRW50cnktPkhUQ2FwYWJpbGl0eS5NQ1NTZXRbMV0gPT0gMHgwMCkgfHwgKHBBZC0+Q29tbW9uQ2ZnLlR4U3RyZWFtID09IDEpKSkKKwkJey8vIDExQkdOIDFTIEFQCisJCQkqcHBUYWJsZSA9IFJhdGVTd2l0Y2hUYWJsZTExQkdOMVM7CisJCQkqcFRhYmxlU2l6ZSA9IFJhdGVTd2l0Y2hUYWJsZTExQkdOMVNbMF07CisJCQkqcEluaXRUeFJhdGVJZHggPSBSYXRlU3dpdGNoVGFibGUxMUJHTjFTWzFdOworCisJCQlicmVhazsKKwkJfQorCisJCWlmICgocEVudHJ5LT5SYXRlTGVuID09IDEyKSAmJiAocEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzBdID09IDB4ZmYpICYmCisJCQkocEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzFdID09IDB4ZmYpICYmIChwQWQtPkNvbW1vbkNmZy5UeFN0cmVhbSA9PSAyKSkKKwkJey8vIDExQkdOIDJTIEFQCisJCQlpZiAocEFkLT5MYXRjaFJmUmVncy5DaGFubmVsIDw9IDE0KQorCQkJeworCQkJCSpwcFRhYmxlID0gUmF0ZVN3aXRjaFRhYmxlMTFCR04yUzsKKwkJCQkqcFRhYmxlU2l6ZSA9IFJhdGVTd2l0Y2hUYWJsZTExQkdOMlNbMF07CisJCQkJKnBJbml0VHhSYXRlSWR4ID0gUmF0ZVN3aXRjaFRhYmxlMTFCR04yU1sxXTsKKworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCSpwcFRhYmxlID0gUmF0ZVN3aXRjaFRhYmxlMTFCR04yU0ZvckFCYW5kOworCQkJCSpwVGFibGVTaXplID0gUmF0ZVN3aXRjaFRhYmxlMTFCR04yU0ZvckFCYW5kWzBdOworCQkJCSpwSW5pdFR4UmF0ZUlkeCA9IFJhdGVTd2l0Y2hUYWJsZTExQkdOMlNGb3JBQmFuZFsxXTsKKworCQkJfQorCQkJYnJlYWs7CisJCX0KKworCQlpZiAoKHBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFswXSA9PSAweGZmKSAmJiAoKHBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFsxXSA9PSAweDAwKSB8fCAocEFkLT5Db21tb25DZmcuVHhTdHJlYW0gPT0gMSkpKQorCQl7Ly8gMTFOIDFTIEFQCisJCQkqcHBUYWJsZSA9IFJhdGVTd2l0Y2hUYWJsZTExTjFTOworCQkJKnBUYWJsZVNpemUgPSBSYXRlU3dpdGNoVGFibGUxMU4xU1swXTsKKwkJCSpwSW5pdFR4UmF0ZUlkeCA9IFJhdGVTd2l0Y2hUYWJsZTExTjFTWzFdOworCisJCQlicmVhazsKKwkJfQorCisJCWlmICgocEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzBdID09IDB4ZmYpICYmIChwRW50cnktPkhUQ2FwYWJpbGl0eS5NQ1NTZXRbMV0gPT0gMHhmZikgJiYgKHBBZC0+Q29tbW9uQ2ZnLlR4U3RyZWFtID09IDIpKQorCQl7Ly8gMTFOIDJTIEFQCisJCQlpZiAocEFkLT5MYXRjaFJmUmVncy5DaGFubmVsIDw9IDE0KQorCQkJeworCQkJKnBwVGFibGUgPSBSYXRlU3dpdGNoVGFibGUxMU4yUzsKKwkJCSpwVGFibGVTaXplID0gUmF0ZVN3aXRjaFRhYmxlMTFOMlNbMF07CisJCQkqcEluaXRUeFJhdGVJZHggPSBSYXRlU3dpdGNoVGFibGUxMU4yU1sxXTsKKyAgICAgICAgICAgIH0KKwkJCWVsc2UKKwkJCXsKKwkJCQkqcHBUYWJsZSA9IFJhdGVTd2l0Y2hUYWJsZTExTjJTRm9yQUJhbmQ7CisJCQkJKnBUYWJsZVNpemUgPSBSYXRlU3dpdGNoVGFibGUxMU4yU0ZvckFCYW5kWzBdOworCQkJCSpwSW5pdFR4UmF0ZUlkeCA9IFJhdGVTd2l0Y2hUYWJsZTExTjJTRm9yQUJhbmRbMV07CisJCQl9CisKKwkJCWJyZWFrOworCQl9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCS8vZWxzZSBpZiAoKHBBZC0+U3RhQWN0aXZlLlN1cFJhdGVMZW4gPT0gNCkgJiYgKHBBZC0+U3RhQWN0aXZlLkV4dFJhdGVMZW4gPT0gMCkgJiYgKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uTUNTU2V0WzBdID09IDApICYmIChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLk1DU1NldFsxXSA9PSAwKSkKKwkJaWYgKChwRW50cnktPlJhdGVMZW4gPT0gNCkKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCSYmIChwRW50cnktPkhUQ2FwYWJpbGl0eS5NQ1NTZXRbMF0gPT0gMCkgJiYgKHBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFsxXSA9PSAwKQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQkJKQorCQl7Ly8gQiBvbmx5IEFQCisJCQkqcHBUYWJsZSA9IFJhdGVTd2l0Y2hUYWJsZTExQjsKKwkJCSpwVGFibGVTaXplID0gUmF0ZVN3aXRjaFRhYmxlMTFCWzBdOworCQkJKnBJbml0VHhSYXRlSWR4ID0gUmF0ZVN3aXRjaFRhYmxlMTFCWzFdOworCisJCQlicmVhazsKKwkJfQorCisJCS8vZWxzZSBpZiAoKHBBZC0+U3RhQWN0aXZlLlN1cFJhdGVMZW4gKyBwQWQtPlN0YUFjdGl2ZS5FeHRSYXRlTGVuID4gOCkgJiYgKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uTUNTU2V0WzBdID09IDApICYmIChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLk1DU1NldFsxXSA9PSAwKSkKKwkJaWYgKChwRW50cnktPlJhdGVMZW4gPiA4KQorI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJJiYgKHBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFswXSA9PSAwKSAmJiAocEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzFdID09IDApCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCQkpCisJCXsvLyBCL0cgIG1peGVkIEFQCisJCQkqcHBUYWJsZSA9IFJhdGVTd2l0Y2hUYWJsZTExQkc7CisJCQkqcFRhYmxlU2l6ZSA9IFJhdGVTd2l0Y2hUYWJsZTExQkdbMF07CisJCQkqcEluaXRUeFJhdGVJZHggPSBSYXRlU3dpdGNoVGFibGUxMUJHWzFdOworCisJCQlicmVhazsKKwkJfQorCisJCS8vZWxzZSBpZiAoKHBBZC0+U3RhQWN0aXZlLlN1cFJhdGVMZW4gKyBwQWQtPlN0YUFjdGl2ZS5FeHRSYXRlTGVuID09IDgpICYmIChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLk1DU1NldFswXSA9PSAwKSAmJiAocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5NQ1NTZXRbMV0gPT0gMCkpCisJCWlmICgocEVudHJ5LT5SYXRlTGVuID09IDgpCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQkmJiAocEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzBdID09IDApICYmIChwRW50cnktPkhUQ2FwYWJpbGl0eS5NQ1NTZXRbMV0gPT0gMCkKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJCSkKKwkJey8vIEcgb25seSBBUAorCQkJKnBwVGFibGUgPSBSYXRlU3dpdGNoVGFibGUxMUc7CisJCQkqcFRhYmxlU2l6ZSA9IFJhdGVTd2l0Y2hUYWJsZTExR1swXTsKKwkJCSpwSW5pdFR4UmF0ZUlkeCA9IFJhdGVTd2l0Y2hUYWJsZTExR1sxXTsKKworCQkJYnJlYWs7CisJCX0KKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQl7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQkvL2Vsc2UgaWYgKChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLk1DU1NldFswXSA9PSAwKSAmJiAocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5NQ1NTZXRbMV0gPT0gMCkpCisJCQlpZiAoKHBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFswXSA9PSAwKSAmJiAocEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzFdID09IDApKQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQkJewkvLyBMZWdhY3kgbW9kZQorCQkJCWlmIChwQWQtPkNvbW1vbkNmZy5NYXhUeFJhdGUgPD0gUkFURV8xMSkKKwkJCQl7CisJCQkJCSpwcFRhYmxlID0gUmF0ZVN3aXRjaFRhYmxlMTFCOworCQkJCQkqcFRhYmxlU2l6ZSA9IFJhdGVTd2l0Y2hUYWJsZTExQlswXTsKKwkJCQkJKnBJbml0VHhSYXRlSWR4ID0gUmF0ZVN3aXRjaFRhYmxlMTFCWzFdOworCQkJCX0KKwkJCQllbHNlIGlmICgocEFkLT5Db21tb25DZmcuTWF4VHhSYXRlID4gUkFURV8xMSkgJiYgKHBBZC0+Q29tbW9uQ2ZnLk1pblR4UmF0ZSA+IFJBVEVfMTEpKQorCQkJCXsKKwkJCQkJKnBwVGFibGUgPSBSYXRlU3dpdGNoVGFibGUxMUc7CisJCQkJCSpwVGFibGVTaXplID0gUmF0ZVN3aXRjaFRhYmxlMTFHWzBdOworCQkJCQkqcEluaXRUeFJhdGVJZHggPSBSYXRlU3dpdGNoVGFibGUxMUdbMV07CisKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJKnBwVGFibGUgPSBSYXRlU3dpdGNoVGFibGUxMUJHOworCQkJCQkqcFRhYmxlU2l6ZSA9IFJhdGVTd2l0Y2hUYWJsZTExQkdbMF07CisJCQkJCSpwSW5pdFR4UmF0ZUlkeCA9IFJhdGVTd2l0Y2hUYWJsZTExQkdbMV07CisJCQkJfQorCQkJCWJyZWFrOworCQkJfQorI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJaWYgKHBBZC0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbCA8PSAxNCkKKwkJCXsKKwkJCQlpZiAocEFkLT5Db21tb25DZmcuVHhTdHJlYW0gPT0gMSkKKwkJCQl7CisJCQkJCSpwcFRhYmxlID0gUmF0ZVN3aXRjaFRhYmxlMTFOMVM7CisJCQkJCSpwVGFibGVTaXplID0gUmF0ZVN3aXRjaFRhYmxlMTFOMVNbMF07CisJCQkJCSpwSW5pdFR4UmF0ZUlkeCA9IFJhdGVTd2l0Y2hUYWJsZTExTjFTWzFdOworCQkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsKCJEUlM6IHVua293biBtb2RlLGRlZmF1bHQgdXNlIDExTiAxUyBBUCBcbiIpKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJKnBwVGFibGUgPSBSYXRlU3dpdGNoVGFibGUxMU4yUzsKKwkJCQkJKnBUYWJsZVNpemUgPSBSYXRlU3dpdGNoVGFibGUxMU4yU1swXTsKKwkJCQkJKnBJbml0VHhSYXRlSWR4ID0gUmF0ZVN3aXRjaFRhYmxlMTFOMlNbMV07CisJCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwoIkRSUzogdW5rb3duIG1vZGUsZGVmYXVsdCB1c2UgMTFOIDJTIEFQIFxuIikpOworCQkJCX0KKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlpZiAocEFkLT5Db21tb25DZmcuVHhTdHJlYW0gPT0gMSkKKwkJCQl7CisJCQkJCSpwcFRhYmxlID0gUmF0ZVN3aXRjaFRhYmxlMTFOMVM7CisJCQkJCSpwVGFibGVTaXplID0gUmF0ZVN3aXRjaFRhYmxlMTFOMVNbMF07CisJCQkJCSpwSW5pdFR4UmF0ZUlkeCA9IFJhdGVTd2l0Y2hUYWJsZTExTjFTWzFdOworCQkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsKCJEUlM6IHVua293biBtb2RlLGRlZmF1bHQgdXNlIDExTiAxUyBBUCBcbiIpKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJKnBwVGFibGUgPSBSYXRlU3dpdGNoVGFibGUxMU4yU0ZvckFCYW5kOworCQkJCQkqcFRhYmxlU2l6ZSA9IFJhdGVTd2l0Y2hUYWJsZTExTjJTRm9yQUJhbmRbMF07CisJCQkJCSpwSW5pdFR4UmF0ZUlkeCA9IFJhdGVTd2l0Y2hUYWJsZTExTjJTRm9yQUJhbmRbMV07CisJCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwoIkRSUzogdW5rb3duIG1vZGUsZGVmYXVsdCB1c2UgMTFOIDJTIEFQIFxuIikpOworCQkJCX0KKwkJCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwoIkRSUzogdW5rb3duIG1vZGUgKFN1cFJhdGVMZW49JWQsIEV4dFJhdGVMZW49JWQsIE1DU1NldFswXT0weCV4LCBNQ1NTZXRbMV09MHgleClcbiIsCisJCQkJcEFkLT5TdGFBY3RpdmUuU3VwUmF0ZUxlbiwgcEFkLT5TdGFBY3RpdmUuRXh0UmF0ZUxlbiwgcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5NQ1NTZXRbMF0sIHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uTUNTU2V0WzFdKSk7CisJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwl9IHdoaWxlKEZBTFNFKTsKK30KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlUaGlzIHJvdXRpbmUgY2hlY2tzIGlmIHRoZXJlJ3JlIG90aGVyIEFQcyBvdXQgdGhlcmUgY2FwYWJsZSBmb3IKKwkJcm9hbWluZy4gQ2FsbGVyIHNob3VsZCBjYWxsIHRoaXMgcm91dGluZSBvbmx5IHdoZW4gTGluayB1cCBpbiBJTkZSQSBtb2RlCisJCWFuZCBjaGFubmVsIHF1YWxpdHkgaXMgYmVsb3cgQ1FJX0dPT0RfVEhSRVNIT0xELgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwlPdXRwdXQ6CisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBNbG1lQ2hlY2tGb3JSb2FtaW5nKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVMT05HCU5vdzMyKQoreworCVVTSE9SVAkgICBpOworCUJTU19UQUJMRSAgKnBSb2FtVGFiID0gJnBBZC0+TWxtZUF1eC5Sb2FtVGFiOworCUJTU19FTlRSWSAgKnBCc3M7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT4gTWxtZUNoZWNrRm9yUm9hbWluZ1xuIikpOworCS8vIHB1dCBhbGwgcm9hbWluZyBjYW5kaWRhdGVzIGludG8gUm9hbVRhYiwgYW5kIHNvcnQgaW4gUlNTSSBvcmRlcgorCUJzc1RhYmxlSW5pdChwUm9hbVRhYik7CisJZm9yIChpID0gMDsgaSA8IHBBZC0+U2NhblRhYi5Cc3NOcjsgaSsrKQorCXsKKwkJcEJzcyA9ICZwQWQtPlNjYW5UYWIuQnNzRW50cnlbaV07CisKKwkJaWYgKChwQnNzLT5MYXN0QmVhY29uUnhUaW1lICsgQkVBQ09OX0xPU1RfVElNRSkgPCBOb3czMikKKwkJCWNvbnRpbnVlOwkgLy8gQVAgZGlzYXBwZWFyCisJCWlmIChwQnNzLT5Sc3NpIDw9IFJTU0lfVEhSRVNIT0xEX0ZPUl9ST0FNSU5HKQorCQkJY29udGludWU7CSAvLyBSU1NJIHRvbyB3ZWFrLiBmb3JnZXQgaXQuCisJCWlmIChNQUNfQUREUl9FUVVBTChwQnNzLT5Cc3NpZCwgcEFkLT5Db21tb25DZmcuQnNzaWQpKQorCQkJY29udGludWU7CSAvLyBza2lwIGN1cnJlbnQgQVAKKwkJaWYgKHBCc3MtPlJzc2kgPCAocEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTAgKyBSU1NJX0RFTFRBKSkKKwkJCWNvbnRpbnVlOwkgLy8gb25seSBBUCB3aXRoIHN0cm9uZ2VyIFJTU0kgaXMgZWxpZ2libGUgZm9yIHJvYW1pbmcKKworCQkvLyBBUCBwYXNzaW5nIGFsbCBhYm92ZSBydWxlcyBpcyBwdXQgaW50byByb2FtaW5nIGNhbmRpZGF0ZSB0YWJsZQorCQlOZGlzTW92ZU1lbW9yeSgmcFJvYW1UYWItPkJzc0VudHJ5W3BSb2FtVGFiLT5Cc3NOcl0sIHBCc3MsIHNpemVvZihCU1NfRU5UUlkpKTsKKwkJcFJvYW1UYWItPkJzc05yICs9IDE7CisJfQorCisJaWYgKHBSb2FtVGFiLT5Cc3NOciA+IDApCisJeworCQkvLyBjaGVjayBDbnRsTWFjaGluZS5DdXJyU3RhdGUgdG8gYXZvaWQgY29sbGlzaW9uIHdpdGggTkRJUyBTZXRPSUQgcmVxdWVzdAorCQlpZiAocEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9PSBDTlRMX0lETEUpCisJCXsKKwkJCXBBZC0+UmFsaW5rQ291bnRlcnMuUG9vckNRSVJvYW1pbmdDb3VudCArKzsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1NQ0hLIC0gUm9hbWluZyBhdHRlbXB0ICMlbGRcbiIsIHBBZC0+UmFsaW5rQ291bnRlcnMuUG9vckNRSVJvYW1pbmdDb3VudCkpOworCQkJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfUk9BTUlOR19SRVEsIDAsIE5VTEwpOworCQkJUlQyOFhYX01MTUVfSEFORExFUihwQWQpOworCQl9CisJfQorCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PSBNbG1lQ2hlY2tGb3JSb2FtaW5nKCMgb2YgY2FuZGlkYXRlPSAlZClcbiIscFJvYW1UYWItPkJzc05yKSk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJVGhpcyByb3V0aW5lIGNoZWNrcyBpZiB0aGVyZSdyZSBvdGhlciBBUHMgb3V0IHRoZXJlIGNhcGFibGUgZm9yCisJCXJvYW1pbmcuIENhbGxlciBzaG91bGQgY2FsbCB0aGlzIHJvdXRpbmUgb25seSB3aGVuIGxpbmsgdXAgaW4gSU5GUkEgbW9kZQorCQlhbmQgY2hhbm5lbCBxdWFsaXR5IGlzIGJlbG93IENRSV9HT09EX1RIUkVTSE9MRC4KKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJT3V0cHV0OgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgTWxtZUNoZWNrRm9yRmFzdFJvYW1pbmcoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVUxPTkcJCQlOb3cpCit7CisJVVNIT1JUCQlpOworCUJTU19UQUJMRQkqcFJvYW1UYWIgPSAmcEFkLT5NbG1lQXV4LlJvYW1UYWI7CisJQlNTX0VOVFJZCSpwQnNzOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT0+IE1sbWVDaGVja0ZvckZhc3RSb2FtaW5nXG4iKSk7CisJLy8gcHV0IGFsbCByb2FtaW5nIGNhbmRpZGF0ZXMgaW50byBSb2FtVGFiLCBhbmQgc29ydCBpbiBSU1NJIG9yZGVyCisJQnNzVGFibGVJbml0KHBSb2FtVGFiKTsKKwlmb3IgKGkgPSAwOyBpIDwgcEFkLT5TY2FuVGFiLkJzc05yOyBpKyspCisJeworCQlwQnNzID0gJnBBZC0+U2NhblRhYi5Cc3NFbnRyeVtpXTsKKworICAgICAgICBpZiAoKHBCc3MtPlJzc2kgPD0gLTUwKSAmJiAocEJzcy0+Q2hhbm5lbCA9PSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKSkKKwkJCWNvbnRpbnVlOwkgLy8gUlNTSSB0b28gd2Vhay4gZm9yZ2V0IGl0LgorCQlpZiAoTUFDX0FERFJfRVFVQUwocEJzcy0+QnNzaWQsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKSkKKwkJCWNvbnRpbnVlOwkgLy8gc2tpcCBjdXJyZW50IEFQCisJCWlmICghU1NJRF9FUVVBTChwQnNzLT5Tc2lkLCBwQnNzLT5Tc2lkTGVuLCBwQWQtPkNvbW1vbkNmZy5Tc2lkLCBwQWQtPkNvbW1vbkNmZy5Tc2lkTGVuKSkKKwkJCWNvbnRpbnVlOwkgLy8gc2tpcCBkaWZmZXJlbnQgU1NJRAorICAgICAgICBpZiAocEJzcy0+UnNzaSA8IChSVE1QTWF4UnNzaShwQWQsIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kwLCBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMSwgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTIpICsgUlNTSV9ERUxUQSkpCisJCQljb250aW51ZTsJIC8vIHNraXAgQVAgd2l0aG91dCBiZXR0ZXIgUlNTSQorCisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkxhc3RSc3NpMCA9ICVkLCBwQnNzLT5Sc3NpID0gJWRcbiIsIFJUTVBNYXhSc3NpKHBBZCwgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTAsIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kxLCBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMiksIHBCc3MtPlJzc2kpKTsKKwkJLy8gQVAgcGFzc2luZyBhbGwgYWJvdmUgcnVsZXMgaXMgcHV0IGludG8gcm9hbWluZyBjYW5kaWRhdGUgdGFibGUKKwkJTmRpc01vdmVNZW1vcnkoJnBSb2FtVGFiLT5Cc3NFbnRyeVtwUm9hbVRhYi0+QnNzTnJdLCBwQnNzLCBzaXplb2YoQlNTX0VOVFJZKSk7CisJCXBSb2FtVGFiLT5Cc3NOciArPSAxOworCX0KKworCWlmIChwUm9hbVRhYi0+QnNzTnIgPiAwKQorCXsKKwkJLy8gY2hlY2sgQ250bE1hY2hpbmUuQ3VyclN0YXRlIHRvIGF2b2lkIGNvbGxpc2lvbiB3aXRoIE5ESVMgU2V0T0lEIHJlcXVlc3QKKwkJaWYgKHBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPT0gQ05UTF9JRExFKQorCQl7CisJCQlwQWQtPlJhbGlua0NvdW50ZXJzLlBvb3JDUUlSb2FtaW5nQ291bnQgKys7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNTUNISyAtIFJvYW1pbmcgYXR0ZW1wdCAjJWxkXG4iLCBwQWQtPlJhbGlua0NvdW50ZXJzLlBvb3JDUUlSb2FtaW5nQ291bnQpKTsKKwkJCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX1JPQU1JTkdfUkVRLCAwLCBOVUxMKTsKKwkJCVJUMjhYWF9NTE1FX0hBTkRMRVIocEFkKTsKKwkJfQorCX0KKwkvLyBNYXliZSBzaXRlIHN1cnZleSByZXF1aXJlZAorCWVsc2UKKwl7CisJCWlmICgocEFkLT5TdGFDZmcuTGFzdFNjYW5UaW1lICsgMTAgKiAxMDAwKSA8IE5vdykKKwkJeworCQkJLy8gY2hlY2sgQ250bE1hY2hpbmUuQ3VyclN0YXRlIHRvIGF2b2lkIGNvbGxpc2lvbiB3aXRoIE5ESVMgU2V0T0lEIHJlcXVlc3QKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1NQ0hLIC0gUm9hbWluZywgTm8gZWxpZ2FibGUgZW50cnksIHRyeSBuZXcgc2NhbiFcbiIpKTsKKwkJCXBBZC0+U3RhQ2ZnLlNjYW5DbnQgPSAyOworCQkJcEFkLT5TdGFDZmcuTGFzdFNjYW5UaW1lID0gTm93OworCQkJTWxtZUF1dG9TY2FuKHBBZCk7CisJCX0KKwl9CisKKyAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT0gTWxtZUNoZWNrRm9yRmFzdFJvYW1pbmcgKEJzc05yPSVkKVxuIiwgcFJvYW1UYWItPkJzc05yKSk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJVGhpcyByb3V0aW5lIGNhbGN1bGF0ZXMgVHhQRVIsIFJ4UEVSIG9mIHRoZSBwYXN0IE4tc2VjIHBlcmlvZC4gQW5kCisJCWFjY29yZGluZyB0byB0aGUgY2FsY3VsYXRpb24gcmVzdWx0LCBDaGFubmVsUXVhbGl0eSBpcyBjYWxjdWxhdGVkIGhlcmUKKwkJdG8gZGVjaWRlIGlmIGN1cnJlbnQgQVAgaXMgc3RpbGwgZG9pbmcgdGhlIGpvYi4KKworCQlJZiBDaGFubmVsUXVhbGl0eSBpcyBub3QgZ29vZCwgYSBST0FNaW5nIGF0dGVtcHQgbWF5IGJlIHRyaWVkIGxhdGVyLgorCU91dHB1dDoKKwkJU3RhQ2ZnLkNoYW5uZWxRdWFsaXR5IC0gMC4uMTAwCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCU5PVEU6IFRoaXMgcm91dGluZSBkZWNpZGUgY2hhbm5sZSBxdWFsaXR5IGJhc2VkIG9uIFJYIENSQyBlcnJvciByYXRpby4KKwkJQ2FsbGVyIHNob3VsZCBtYWtlIHN1cmUgYSBmdW5jdGlvbiBjYWxsIHRvIE5JQ1VwZGF0ZVJhd0NvdW50ZXJzKHBBZCkKKwkJaXMgcGVyZm9ybWVkIHJpZ2h0IGJlZm9yZSB0aGlzIHJvdXRpbmUsIHNvIHRoYXQgdGhpcyByb3V0aW5lIGNhbiBkZWNpZGUKKwkJY2hhbm5lbCBxdWFsaXR5IGJhc2VkIG9uIHRoZSBtb3N0IHVwLXRvLWRhdGUgaW5mb3JtYXRpb24KKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIE1sbWVDYWxjdWxhdGVDaGFubmVsUXVhbGl0eSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVTE9ORyBOb3czMikKK3sKKwlVTE9ORyBUeE9rQ250LCBUeENudCwgVHhQRVIsIFR4UFJSOworCVVMT05HIFJ4Q250LCBSeFBFUjsKKwlVQ0hBUiBOb3JSc3NpOworCUNIQVIgIE1heFJzc2k7CisJVUxPTkcgQmVhY29uTG9zdFRpbWUgPSBCRUFDT05fTE9TVF9USU1FOworCisjaWZkZWYgQ0FSUklFUl9ERVRFQ1RJT05fU1VQUE9SVCAvLyBSb2dlciBzeW5jIENhcnJpZXIKKwkvLyBsb25nZXIgYmVhY29uIGxvc3QgdGltZSB3aGVuIGNhcnJpZXIgZGV0ZWN0aW9uIGVuYWJsZWQKKwlpZiAocEFkLT5Db21tb25DZmcuQ2FycmllckRldGVjdC5FbmFibGUgPT0gVFJVRSkKKwl7CisJCUJlYWNvbkxvc3RUaW1lID0gQkVBQ09OX0xPU1RfVElNRSArIEJFQUNPTl9MT1NUX1RJTUUvMjsKKwl9CisjZW5kaWYgLy8gQ0FSUklFUl9ERVRFQ1RJT05fU1VQUE9SVCAvLworCisJTWF4UnNzaSA9IFJUTVBNYXhSc3NpKHBBZCwgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTAsIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kxLCBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMik7CisKKwkvLworCS8vIGNhbGN1bGF0ZSBUWCBwYWNrZXQgZXJyb3IgcmF0aW8gYW5kIFRYIHJldHJ5IHJhdGlvIC0gaWYgdG9vIGZldyBUWCBzYW1wbGVzLCBza2lwIFRYIHJlbGF0ZWQgc3RhdGlzdGljcworCS8vCisJVHhPa0NudCA9IHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhOb1JldHJ5T2tDb3VudCArIHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhSZXRyeU9rQ291bnQ7CisJVHhDbnQgPSBUeE9rQ250ICsgcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeEZhaWxDb3VudDsKKwlpZiAoVHhDbnQgPCA1KQorCXsKKwkJVHhQRVIgPSAwOworCQlUeFBSUiA9IDA7CisJfQorCWVsc2UKKwl7CisJCVR4UEVSID0gKHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhGYWlsQ291bnQgKiAxMDApIC8gVHhDbnQ7CisJCVR4UFJSID0gKChUeENudCAtIHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhOb1JldHJ5T2tDb3VudCkgKiAxMDApIC8gVHhDbnQ7CisJfQorCisJLy8KKwkvLyBjYWxjdWxhdGUgUlggUEVSIC0gZG9uJ3QgdGFrZSBSeFBFUiBpbnRvIGNvbnNpZGVyYXRpb24gaWYgdG9vIGZldyBzYW1wbGUKKwkvLworCVJ4Q250ID0gcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNSeE9rQ250ICsgcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNSeEZjc0VyckNudDsKKwlpZiAoUnhDbnQgPCA1KQorCQlSeFBFUiA9IDA7CisJZWxzZQorCQlSeFBFUiA9IChwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1J4RmNzRXJyQ250ICogMTAwKSAvIFJ4Q250OworCisJLy8KKwkvLyBkZWNpZGUgQ2hhbm5lbFF1YWxpdHkgYmFzZWQgb246IDEpbGFzdCBCRUFDT04gcmVjZWl2ZWQgdGltZSwgMilsYXN0IFJTU0ksIDMpVHhQRVIsIGFuZCA0KVJ4UEVSCisJLy8KKwlpZiAoSU5GUkFfT04ocEFkKSAmJgorCQkocEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeE5vUmV0cnlPa0NvdW50IDwgMikgJiYgLy8gbm8gaGVhdnkgdHJhZmZpYworCQkocEFkLT5TdGFDZmcuTGFzdEJlYWNvblJ4VGltZSArIEJlYWNvbkxvc3RUaW1lIDwgTm93MzIpKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQkVBQ09OIGxvc3QgPiAlbGQgbXNlYyB3aXRoIFR4T2tDbnQ9JWxkIC0+IENRST0wXG4iLCBCZWFjb25Mb3N0VGltZSwgVHhPa0NudCkpOworCQlwQWQtPk1sbWUuQ2hhbm5lbFF1YWxpdHkgPSAwOworCX0KKwllbHNlCisJeworCQkvLyBOb3JtYWxpemUgUnNzaQorCQlpZiAoTWF4UnNzaSA+IC00MCkKKwkJCU5vclJzc2kgPSAxMDA7CisJCWVsc2UgaWYgKE1heFJzc2kgPCAtOTApCisJCQlOb3JSc3NpID0gMDsKKwkJZWxzZQorCQkJTm9yUnNzaSA9IChNYXhSc3NpICsgOTApICogMjsKKworCQkvLyBDaGFubmVsUXVhbGl0eSA9IFcxKlJTU0kgKyBXMipUeFBSUiArIFczKlJ4UEVSCSAoUlNTSSAwLi4xMDApLCAoVHhQRVIgMTAwLi4wKSwgKFJ4UEVSIDEwMC4uMCkKKwkJcEFkLT5NbG1lLkNoYW5uZWxRdWFsaXR5ID0gKFJTU0lfV0VJR0hUSU5HICogTm9yUnNzaSArCisJCQkJCQkJCSAgIFRYX1dFSUdIVElORyAqICgxMDAgLSBUeFBSUikgKworCQkJCQkJCQkgICBSWF9XRUlHSFRJTkcqICgxMDAgLSBSeFBFUikpIC8gMTAwOworCQlpZiAocEFkLT5NbG1lLkNoYW5uZWxRdWFsaXR5ID49IDEwMCkKKwkJCXBBZC0+TWxtZS5DaGFubmVsUXVhbGl0eSA9IDEwMDsKKwl9CisKK30KKworVk9JRCBNbG1lU2V0VHhSYXRlKAorCUlOIFBSVE1QX0FEQVBURVIJCXBBZCwKKwlJTiBQTUFDX1RBQkxFX0VOVFJZCQlwRW50cnksCisJSU4gUFJUTVBfVFhfUkFURV9TV0lUQ0gJcFR4UmF0ZSkKK3sKKwlVQ0hBUglNYXhNb2RlID0gTU9ERV9PRkRNOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJTWF4TW9kZSA9IE1PREVfSFRHUkVFTkZJRUxEOworCisJaWYgKHBUeFJhdGUtPlNUQkMgJiYgKHBBZC0+U3RhQ2ZnLk1heEhUUGh5TW9kZS5maWVsZC5TVEJDKSAmJiAocEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCA9PSAyKSkKKwkJcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLlNUQkMgPSBTVEJDX1VTRTsKKwllbHNlCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCXBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5TVEJDID0gU1RCQ19OT05FOworCisJaWYgKHBUeFJhdGUtPkN1cnJNQ1MgPCBNQ1NfQVVUTykKKwkJcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1DUyA9IHBUeFJhdGUtPkN1cnJNQ1M7CisKKwlpZiAocEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1DUyA+IDcpCisJCXBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5TVEJDID0gU1RCQ19OT05FOworCisgICAJaWYgKEFESE9DX09OKHBBZCkpCisJeworCQkvLyBJZiBwZWVyIGFkaG9jIGlzIGItb25seSBtb2RlLCB3ZSBjYW4ndCBzZW5kIDExZyByYXRlLgorCQlwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuU2hvcnRHSSA9IEdJXzgwMDsKKwkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuU1RCQwk9IFNUQkNfTk9ORTsKKworCQkvLworCQkvLyBGb3IgQWRob2MgTU9ERV9DQ0ssIGRyaXZlciB3aWxsIHVzZSBBZGhvY0JPbmx5Sm9pbmVkIGZsYWcgdG8gcm9sbCBiYWNrIHRvIEIgb25seSBpZiBuZWNlc3NhcnkKKwkJLy8KKwkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTU9ERQk9IHBUeFJhdGUtPk1vZGU7CisJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLlNob3J0R0kJPSBwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuU2hvcnRHSTsKKwkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTCQk9IHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NQ1M7CisKKwkJLy8gUGF0Y2ggc3BlZWQgZXJyb3IgaW4gc3RhdHVzIHBhZ2UKKwkJcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1PREUgPSBwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NT0RFOworCX0KKwllbHNlCisJeworCQlpZiAocFR4UmF0ZS0+TW9kZSA8PSBNYXhNb2RlKQorCQkJcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1PREUgPSBwVHhSYXRlLT5Nb2RlOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCWlmIChwVHhSYXRlLT5TaG9ydEdJICYmIChwQWQtPlN0YUNmZy5NYXhIVFBoeU1vZGUuZmllbGQuU2hvcnRHSSkpCisJCQlwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuU2hvcnRHSSA9IEdJXzQwMDsKKwkJZWxzZQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQkJcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLlNob3J0R0kgPSBHSV84MDA7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJLy8gUmVleGFtIGVhY2ggYmFuZHdpZHRoJ3MgU0dJIHN1cHBvcnQuCisJCWlmIChwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuU2hvcnRHSSA9PSBHSV80MDApCisJCXsKKwkJCWlmICgocEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuQlcgPT0gQldfMjApICYmICghQ0xJRU5UX1NUQVRVU19URVNUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19TR0kyMF9DQVBBQkxFKSkpCisJCQkJcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLlNob3J0R0kgPSBHSV84MDA7CisJCQlpZiAoKHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLkJXID09IEJXXzQwKSAmJiAoIUNMSUVOVF9TVEFUVVNfVEVTVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfU0dJNDBfQ0FQQUJMRSkpKQorCQkJCXBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5TaG9ydEdJID0gR0lfODAwOworCQl9CisKKwkJLy8gVHVybiBSVFMvQ1RTIHJhdGUgdG8gNk1icHMuCisJCWlmICgocEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTID09IDApICYmIChwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTUNTICE9IDApKQorCQl7CisJCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NQ1MJCT0gcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1DUzsKKwkJCWlmIChwQWQtPk1hY1RhYi5mQW55QkFTZXNzaW9uKQorCQkJeworCQkJCUFzaWNVcGRhdGVQcm90ZWN0KHBBZCwgSFRfRk9SQ0VSVFNDVFMsIEFMTE5fU0VUUFJPVEVDVCwgVFJVRSwgKEJPT0xFQU4pcEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLk5vbkdmUHJlc2VudCk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJQXNpY1VwZGF0ZVByb3RlY3QocEFkLCBwQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzIuT3BlcmFpb25Nb2RlLCBBTExOX1NFVFBST1RFQ1QsIFRSVUUsIChCT09MRUFOKXBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi5Ob25HZlByZXNlbnQpOworCQkJfQorCQl9CisJCWVsc2UgaWYgKChwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NQ1MgPT0gOCkgJiYgKHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NQ1MgIT0gOCkpCisJCXsKKwkJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1DUwkJPSBwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTUNTOworCQkJaWYgKHBBZC0+TWFjVGFiLmZBbnlCQVNlc3Npb24pCisJCQl7CisJCQkJQXNpY1VwZGF0ZVByb3RlY3QocEFkLCBIVF9GT1JDRVJUU0NUUywgQUxMTl9TRVRQUk9URUNULCBUUlVFLCAoQk9PTEVBTilwQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzIuTm9uR2ZQcmVzZW50KTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlBc2ljVXBkYXRlUHJvdGVjdChwQWQsIHBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi5PcGVyYWlvbk1vZGUsIEFMTE5fU0VUUFJPVEVDVCwgVFJVRSwgKEJPT0xFQU4pcEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLk5vbkdmUHJlc2VudCk7CisJCQl9CisJCX0KKwkJZWxzZSBpZiAoKHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1DUyAhPSAwKSAmJiAocEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1DUyA9PSAwKSkKKwkJeworCQkJQXNpY1VwZGF0ZVByb3RlY3QocEFkLCBIVF9SVFNDVFNfNk0sIEFMTE5fU0VUUFJPVEVDVCwgVFJVRSwgKEJPT0xFQU4pcEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLk5vbkdmUHJlc2VudCk7CisKKwkJfQorCQllbHNlIGlmICgocEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTICE9IDgpICYmIChwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTUNTID09IDgpKQorCQl7CisJCQlBc2ljVXBkYXRlUHJvdGVjdChwQWQsIEhUX1JUU0NUU182TSwgQUxMTl9TRVRQUk9URUNULCBUUlVFLCAoQk9PTEVBTilwQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzIuTm9uR2ZQcmVzZW50KTsKKwkJfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLlNUQkMJPSBwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuU1RCQzsKKwkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuU2hvcnRHSQk9IHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5TaG9ydEdJOworCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NQ1MJCT0gcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1DUzsKKwkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTU9ERQk9IHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NT0RFOworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQlpZiAoKHBBZC0+U3RhQ2ZnLk1heEhUUGh5TW9kZS5maWVsZC5NT0RFID09IE1PREVfSFRHUkVFTkZJRUxEKSAmJgorCQkgICAgcEFkLT5XSUZJdGVzdGJlZC5iR3JlZW5GaWVsZCkKKwkJICAgIHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX0hUR1JFRU5GSUVMRDsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwl9CisKKwlwQWQtPkxhc3RUeFJhdGUgPSAoVVNIT1JUKShwRW50cnktPkhUUGh5TW9kZS53b3JkKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlUaGlzIHJvdXRpbmUgY2FsY3VsYXRlcyB0aGUgYWN1bXVsYXRlZCBUeFBFUiBvZiBlYXhoIFR4UmF0ZS4gQW5kCisJCWFjY29yZGluZyB0byB0aGUgY2FsY3VsYXRpb24gcmVzdWx0LCBjaGFuZ2UgQ29tbW9uQ2ZnLlR4UmF0ZSB3aGljaAorCQlpcyB0aGUgc3RhYmxlIFRYIFJhdGUgd2UgZXhwZWN0IHRoZSBSYWRpbyBzaXR1YXRpb24gY291bGQgc3VzdGFpbmVkLgorCisJCUNvbW1vbkNmZy5UeFJhdGUgd2lsbCBjaGFuZ2UgZHluYW1pY2FsbHkgd2l0aGluIHtSQVRFXzEvUkFURV82LCBNYXhUeFJhdGV9CisJT3V0cHV0OgorCQlDb21tb25DZmcuVHhSYXRlIC0KKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJTk9URToKKwkJY2FsbCB0aGlzIHJvdXRpbmUgZXZlcnkgc2Vjb25kCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBNbG1lRHluYW1pY1R4UmF0ZVN3aXRjaGluZygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlVQ0hBUgkJCQkJVXBSYXRlSWR4ID0gMCwgRG93blJhdGVJZHggPSAwLCBDdXJyUmF0ZUlkeDsKKwlVTE9ORwkJCQkJaSwgQWNjdVR4VG90YWxDbnQgPSAwLCBUeFRvdGFsQ250OworCVVMT05HCQkJCQlUeEVycm9yUmF0aW8gPSAwOworCUJPT0xFQU4JCQkJCWJUeFJhdGVDaGFuZ2VkLCBiVXBncmFkZVF1YWxpdHkgPSBGQUxTRTsKKwlQUlRNUF9UWF9SQVRFX1NXSVRDSAlwQ3VyclR4UmF0ZSwgcE5leHRUeFJhdGUgPSBOVUxMOworCVBVQ0hBUgkJCQkJcFRhYmxlOworCVVDSEFSCQkJCQlUYWJsZVNpemUgPSAwOworCVVDSEFSCQkJCQlJbml0VHhSYXRlSWR4ID0gMCwgVHJhaW5VcCwgVHJhaW5Eb3duOworCUNIQVIJCQkJCVJzc2ksIFJzc2lPZmZzZXQgPSAwOworCVRYX1NUQV9DTlQxX1NUUlVDCQlTdGFUeDE7CisJVFhfU1RBX0NOVDBfU1RSVUMJCVR4U3RhQ250MDsKKwlVTE9ORwkJCQkJVHhSZXRyYW5zbWl0ID0gMCwgVHhTdWNjZXNzID0gMCwgVHhGYWlsQ291bnQgPSAwOworCU1BQ19UQUJMRV9FTlRSWQkJCSpwRW50cnk7CisKKyNpZmRlZiBSQUxJTktfQVRFCisJaWYgKEFURV9PTihwQWQpKQorCXsKKwkJcmV0dXJuOworCX0KKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisKKwkvKmlmIChwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID4gMSkKKwkJUnNzaSA9IChwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kwICsgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMSkgPj4gMTsKKwllbHNlCisJCVJzc2kgPSBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kwOyovCisKKwkvLworCS8vIHdhbGsgdGhyb3VnaCBNQUMgdGFibGUsIHNlZSBpZiBuZWVkIHRvIGNoYW5nZSBBUCdzIFRYIHJhdGUgdG93YXJkIGVhY2ggZW50cnkKKwkvLworICAgCWZvciAoaSA9IDE7IGkgPCBNQVhfTEVOX09GX01BQ19UQUJMRTsgaSsrKQorCXsKKwkJcEVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbaV07CisKKwkJLy8gY2hlY2sgaWYgdGhpcyBlbnRyeSBuZWVkIHRvIHN3aXRjaCByYXRlIGF1dG9tYXRpY2FsbHkKKwkJaWYgKFJUTVBDaGVja0VudHJ5RW5hYmxlQXV0b1JhdGVTd2l0Y2gocEFkLCBwRW50cnkpID09IEZBTFNFKQorCQkJY29udGludWU7CisKKwkJaWYgKChwQWQtPk1hY1RhYi5TaXplID09IDEpIHx8IChwRW50cnktPlZhbGlkQXNEbHMpKQorCQl7CisJCQlSc3NpID0gUlRNUE1heFJzc2kocEFkLCAoQ0hBUilwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kwLCAoQ0hBUilwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kxLCAoQ0hBUilwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kyKTsKKworCQkJLy8gVXBkYXRlIHN0YXRpc3RpYyBjb3VudGVyCisJCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX1NUQV9DTlQwLCAmVHhTdGFDbnQwLndvcmQpOworCQkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9TVEFfQ05UMSwgJlN0YVR4MS53b3JkKTsKKwkJCXBBZC0+YlVwZGF0ZUJjbkNudERvbmUgPSBUUlVFOworCQkJVHhSZXRyYW5zbWl0ID0gU3RhVHgxLmZpZWxkLlR4UmV0cmFuc21pdDsKKwkJCVR4U3VjY2VzcyA9IFN0YVR4MS5maWVsZC5UeFN1Y2Nlc3M7CisJCQlUeEZhaWxDb3VudCA9IFR4U3RhQ250MC5maWVsZC5UeEZhaWxDb3VudDsKKwkJCVR4VG90YWxDbnQgPSBUeFJldHJhbnNtaXQgKyBUeFN1Y2Nlc3MgKyBUeEZhaWxDb3VudDsKKworCQkJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeFJldHJ5T2tDb3VudCArPSBTdGFUeDEuZmllbGQuVHhSZXRyYW5zbWl0OworCQkJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeE5vUmV0cnlPa0NvdW50ICs9IFN0YVR4MS5maWVsZC5UeFN1Y2Nlc3M7CisJCQlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4RmFpbENvdW50ICs9IFR4U3RhQ250MC5maWVsZC5UeEZhaWxDb3VudDsKKwkJCXBBZC0+V2xhbkNvdW50ZXJzLlRyYW5zbWl0dGVkRnJhZ21lbnRDb3VudC51Lkxvd1BhcnQgKz0gU3RhVHgxLmZpZWxkLlR4U3VjY2VzczsKKwkJCXBBZC0+V2xhbkNvdW50ZXJzLlJldHJ5Q291bnQudS5Mb3dQYXJ0ICs9IFN0YVR4MS5maWVsZC5UeFJldHJhbnNtaXQ7CisJCQlwQWQtPldsYW5Db3VudGVycy5GYWlsZWRDb3VudC51Lkxvd1BhcnQgKz0gVHhTdGFDbnQwLmZpZWxkLlR4RmFpbENvdW50OworCisJCQkvLyBpZiBubyB0cmFmZmljIGluIHRoZSBwYXN0IDEtc2VjIHBlcmlvZCwgZG9uJ3QgY2hhbmdlIFRYIHJhdGUsCisJCQkvLyBidXQgY2xlYXIgYWxsIGJhZCBoaXN0b3J5LiBiZWNhdXNlIHRoZSBiYWQgaGlzdG9yeSBtYXkgYWZmZWN0IHRoZSBuZXh0CisJCQkvLyBDaGFyaW90IHRocm91Z2hwdXQgdGVzdAorCQkJQWNjdVR4VG90YWxDbnQgPSBwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4Tm9SZXRyeU9rQ291bnQgKworCQkJCQkJIHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhSZXRyeU9rQ291bnQgKworCQkJCQkJIHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhGYWlsQ291bnQ7CisKKwkJCWlmIChUeFRvdGFsQ250KQorCQkJCVR4RXJyb3JSYXRpbyA9ICgoVHhSZXRyYW5zbWl0ICsgVHhGYWlsQ291bnQpICogMTAwKSAvIFR4VG90YWxDbnQ7CisJCX0KKwkJZWxzZQorCQl7CisJCQlSc3NpID0gUlRNUE1heFJzc2kocEFkLCAoQ0hBUilwRW50cnktPlJzc2lTYW1wbGUuQXZnUnNzaTAsIChDSEFSKXBFbnRyeS0+UnNzaVNhbXBsZS5BdmdSc3NpMSwgKENIQVIpcEVudHJ5LT5Sc3NpU2FtcGxlLkF2Z1Jzc2kyKTsKKworCQkJVHhUb3RhbENudCA9IHBFbnRyeS0+T25lU2VjVHhOb1JldHJ5T2tDb3VudCArCisJCQkJIHBFbnRyeS0+T25lU2VjVHhSZXRyeU9rQ291bnQgKworCQkJCSBwRW50cnktPk9uZVNlY1R4RmFpbENvdW50OworCisJCQlpZiAoVHhUb3RhbENudCkKKwkJCQlUeEVycm9yUmF0aW8gPSAoKHBFbnRyeS0+T25lU2VjVHhSZXRyeU9rQ291bnQgKyBwRW50cnktPk9uZVNlY1R4RmFpbENvdW50KSAqIDEwMCkgLyBUeFRvdGFsQ250OworCQl9CisKKwkJQ3VyclJhdGVJZHggPSBwRW50cnktPkN1cnJUeFJhdGVJbmRleDsKKworCQlNbG1lU2VsZWN0VHhSYXRlVGFibGUocEFkLCBwRW50cnksICZwVGFibGUsICZUYWJsZVNpemUsICZJbml0VHhSYXRlSWR4KTsKKworCQlpZiAoQ3VyclJhdGVJZHggPj0gVGFibGVTaXplKQorCQl7CisJCQlDdXJyUmF0ZUlkeCA9IFRhYmxlU2l6ZSAtIDE7CisJCX0KKworCQkvLyBXaGVuIHN3aXRjaCBmcm9tIEZpeGVkIHJhdGUgLT4gYXV0byByYXRlLCB0aGUgUkVBTCBUWCByYXRlIG1pZ2h0IGJlIGRpZmZlcmVudCBmcm9tIHBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZUluZGV4LgorCQkvLyBTbyBuZWVkIHRvIHN5bmMgaGVyZS4KKwkJcEN1cnJUeFJhdGUgPSAoUFJUTVBfVFhfUkFURV9TV0lUQ0gpICZwVGFibGVbKEN1cnJSYXRlSWR4KzEpKjVdOworCQlpZiAoKHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1DUyAhPSBwQ3VyclR4UmF0ZS0+Q3Vyck1DUykKKwkJCS8vJiYgKHBBZC0+U3RhQ2ZnLmJBdXRvVHhSYXRlU3dpdGNoID09IFRSVUUpCisJCQkpCisJCXsKKworCQkJLy8gTmVlZCB0byBzeW5jIFJlYWwgVHggcmF0ZSBhbmQgb3VyIHJlY29yZC4KKwkJCS8vIFRoZW4gcmV0dXJuIGZvciBuZXh0IERSUy4KKwkJCXBDdXJyVHhSYXRlID0gKFBSVE1QX1RYX1JBVEVfU1dJVENIKSAmcFRhYmxlWyhJbml0VHhSYXRlSWR4KzEpKjVdOworCQkJcEVudHJ5LT5DdXJyVHhSYXRlSW5kZXggPSBJbml0VHhSYXRlSWR4OworCQkJTWxtZVNldFR4UmF0ZShwQWQsIHBFbnRyeSwgcEN1cnJUeFJhdGUpOworCisJCQkvLyByZXNldCBhbGwgT25lU2VjVHggY291bnRlcnMKKwkJCVJFU0VUX09ORV9TRUNfVFhfQ05UKHBFbnRyeSk7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8vIGRlY2lkZSB0aGUgbmV4dCB1cGdyYWRlIHJhdGUgYW5kIGRvd25ncmFkZSByYXRlLCBpZiBhbnkKKwkJaWYgKChDdXJyUmF0ZUlkeCA+IDApICYmIChDdXJyUmF0ZUlkeCA8IChUYWJsZVNpemUgLSAxKSkpCisJCXsKKwkJCVVwUmF0ZUlkeCA9IEN1cnJSYXRlSWR4ICsgMTsKKwkJCURvd25SYXRlSWR4ID0gQ3VyclJhdGVJZHggLTE7CisJCX0KKwkJZWxzZSBpZiAoQ3VyclJhdGVJZHggPT0gMCkKKwkJeworCQkJVXBSYXRlSWR4ID0gQ3VyclJhdGVJZHggKyAxOworCQkJRG93blJhdGVJZHggPSBDdXJyUmF0ZUlkeDsKKwkJfQorCQllbHNlIGlmIChDdXJyUmF0ZUlkeCA9PSAoVGFibGVTaXplIC0gMSkpCisJCXsKKwkJCVVwUmF0ZUlkeCA9IEN1cnJSYXRlSWR4OworCQkJRG93blJhdGVJZHggPSBDdXJyUmF0ZUlkeCAtIDE7CisJCX0KKworCQlwQ3VyclR4UmF0ZSA9IChQUlRNUF9UWF9SQVRFX1NXSVRDSCkgJnBUYWJsZVsoQ3VyclJhdGVJZHgrMSkqNV07CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJaWYgKChSc3NpID4gLTY1KSAmJiAocEN1cnJUeFJhdGUtPk1vZGUgPj0gTU9ERV9IVE1JWCkpCisJCXsKKwkJCVRyYWluVXAJCT0gKHBDdXJyVHhSYXRlLT5UcmFpblVwICsgKHBDdXJyVHhSYXRlLT5UcmFpblVwID4+IDEpKTsKKwkJCVRyYWluRG93bgk9IChwQ3VyclR4UmF0ZS0+VHJhaW5Eb3duICsgKHBDdXJyVHhSYXRlLT5UcmFpbkRvd24gPj4gMSkpOworCQl9CisJCWVsc2UKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJeworCQkJVHJhaW5VcAkJPSBwQ3VyclR4UmF0ZS0+VHJhaW5VcDsKKwkJCVRyYWluRG93bgk9IHBDdXJyVHhSYXRlLT5UcmFpbkRvd247CisJCX0KKworCQkvL3BBZC0+RHJzQ291bnRlcnMuTGFzdFRpbWVUeFJhdGVDaGFuZ2VBY3Rpb24gPSBwQWQtPkRyc0NvdW50ZXJzLkxhc3RTZWNUeFJhdGVDaGFuZ2VBY3Rpb247CisKKwkJLy8KKwkJLy8gS2VlcCB0aGUgbGFzdCB0aW1lIFR4UmF0ZUNoYW5nZUFjdGlvbiBzdGF0dXMuCisJCS8vCisJCXBFbnRyeS0+TGFzdFRpbWVUeFJhdGVDaGFuZ2VBY3Rpb24gPSBwRW50cnktPkxhc3RTZWNUeFJhdGVDaGFuZ2VBY3Rpb247CisKKworCisJCS8vCisJCS8vIENBU0UgMS4gd2hlbiBUWCBzYW1wbGVzIGFyZSBmZXdlciB0aGFuIDE1LCB0aGVuIGRlY2lkZSBUWCByYXRlIHNvbGVseSBvbiBSU1NJCisJCS8vICAgICAgICAgKGNyaXRlcmlhIGNvcGllZCBmcm9tIFJUMjUwMCBmb3IgTmV0b3BpYSBjYXNlKQorCQkvLworCQlpZiAoVHhUb3RhbENudCA8PSAxNSkKKwkJeworCQkJQ0hBUglpZHggPSAwOworCQkJVUNIQVIJVHhSYXRlSWR4OworCQkJLy9VQ0hBUglNQ1MwID0gMCwgTUNTMSA9IDAsIE1DUzIgPSAwLCBNQ1MzID0gMCwgTUNTNCA9IDAsIE1DUzcgPSAwLCBNQ1MxMiA9IDAsIE1DUzEzID0gMCwgTUNTMTQgPSAwLCBNQ1MxNSA9IDA7CisJCQlVQ0hBUglNQ1MwID0gMCwgTUNTMSA9IDAsIE1DUzIgPSAwLCBNQ1MzID0gMCwgTUNTNCA9IDAsICBNQ1M1ID0wLCBNQ1M2ID0gMCwgTUNTNyA9IDA7CisJICAgICAgICBVQ0hBUglNQ1MxMiA9IDAsIE1DUzEzID0gMCwgTUNTMTQgPSAwLCBNQ1MxNSA9IDA7CisJCQlVQ0hBUglNQ1MyMCA9IDAsIE1DUzIxID0gMCwgTUNTMjIgPSAwLCBNQ1MyMyA9IDA7IC8vIDMqMworCisJCQkvLyBjaGVjayB0aGUgZXhpc3RlbmNlIGFuZCBpbmRleCBvZiBlYWNoIG5lZWRlZCBNQ1MKKwkJCXdoaWxlIChpZHggPCBwVGFibGVbMF0pCisJCQl7CisJCQkJcEN1cnJUeFJhdGUgPSAoUFJUTVBfVFhfUkFURV9TV0lUQ0gpICZwVGFibGVbKGlkeCsxKSo1XTsKKworCQkJCWlmIChwQ3VyclR4UmF0ZS0+Q3Vyck1DUyA9PSBNQ1NfMCkKKwkJCQl7CisJCQkJCU1DUzAgPSBpZHg7CisJCQkJfQorCQkJCWVsc2UgaWYgKHBDdXJyVHhSYXRlLT5DdXJyTUNTID09IE1DU18xKQorCQkJCXsKKwkJCQkJTUNTMSA9IGlkeDsKKwkJCQl9CisJCQkJZWxzZSBpZiAocEN1cnJUeFJhdGUtPkN1cnJNQ1MgPT0gTUNTXzIpCisJCQkJeworCQkJCQlNQ1MyID0gaWR4OworCQkJCX0KKwkJCQllbHNlIGlmIChwQ3VyclR4UmF0ZS0+Q3Vyck1DUyA9PSBNQ1NfMykKKwkJCQl7CisJCQkJCU1DUzMgPSBpZHg7CisJCQkJfQorCQkJCWVsc2UgaWYgKHBDdXJyVHhSYXRlLT5DdXJyTUNTID09IE1DU180KQorCQkJCXsKKwkJCQkJTUNTNCA9IGlkeDsKKwkJCQl9CisJICAgICAgICAgICAgZWxzZSBpZiAocEN1cnJUeFJhdGUtPkN1cnJNQ1MgPT0gTUNTXzUpCisJICAgICAgICAgICAgeworCSAgICAgICAgICAgICAgICBNQ1M1ID0gaWR4OworCSAgICAgICAgICAgIH0KKwkgICAgICAgICAgICBlbHNlIGlmIChwQ3VyclR4UmF0ZS0+Q3Vyck1DUyA9PSBNQ1NfNikKKwkgICAgICAgICAgICB7CisJICAgICAgICAgICAgICAgIE1DUzYgPSBpZHg7CisJICAgICAgICAgICAgfQorCQkJCS8vZWxzZSBpZiAocEN1cnJUeFJhdGUtPkN1cnJNQ1MgPT0gTUNTXzcpCisJCQkJZWxzZSBpZiAoKHBDdXJyVHhSYXRlLT5DdXJyTUNTID09IE1DU183KSAmJiAocEN1cnJUeFJhdGUtPlNob3J0R0kgPT0gR0lfODAwKSkJLy8gcHJldmVudCB0aGUgaGlnaGVzdCBNQ1MgdXNpbmcgc2hvcnQgR0kgd2hlbiAxVCBhbmQgbG93IHRocm91Z2hwdXQKKwkJCQl7CisJCQkJCU1DUzcgPSBpZHg7CisJCQkJfQorCQkJCWVsc2UgaWYgKHBDdXJyVHhSYXRlLT5DdXJyTUNTID09IE1DU18xMikKKwkJCQl7CisJCQkJCU1DUzEyID0gaWR4OworCQkJCX0KKwkJCQllbHNlIGlmIChwQ3VyclR4UmF0ZS0+Q3Vyck1DUyA9PSBNQ1NfMTMpCisJCQkJeworCQkJCQlNQ1MxMyA9IGlkeDsKKwkJCQl9CisJCQkJZWxzZSBpZiAocEN1cnJUeFJhdGUtPkN1cnJNQ1MgPT0gTUNTXzE0KQorCQkJCXsKKwkJCQkJTUNTMTQgPSBpZHg7CisJCQkJfQorCQkJCS8vZWxzZSBpZiAoKHBDdXJyVHhSYXRlLT5DdXJyTUNTID09IE1DU18xNSkvKiAmJiAocEN1cnJUeFJhdGUtPlNob3J0R0kgPT0gR0lfODAwKSovKQkvL3dlIGhvcGUgdG8gdXNlIFNob3J0R0kgYXMgaW5pdGlhbCByYXRlCisJCQkJZWxzZSBpZiAoKHBDdXJyVHhSYXRlLT5DdXJyTUNTID09IE1DU18xNSkgJiYgKHBDdXJyVHhSYXRlLT5TaG9ydEdJID09IEdJXzgwMCkpCS8vd2UgaG9wZSB0byB1c2UgU2hvcnRHSSBhcyBpbml0aWFsIHJhdGUsIGhvd2V2ZXIgQXRoZXJvcydzIGNoaXAgaGFzIGJ1Z3Mgd2hlbiBzaG9ydCBHSQorCQkJCXsKKwkJCQkJTUNTMTUgPSBpZHg7CisJCQkJfQorCQkJCWVsc2UgaWYgKHBDdXJyVHhSYXRlLT5DdXJyTUNTID09IE1DU18yMCkgLy8gMyozCisJCQkJeworCQkJCQlNQ1MyMCA9IGlkeDsKKwkJCQl9CisJCQkJZWxzZSBpZiAocEN1cnJUeFJhdGUtPkN1cnJNQ1MgPT0gTUNTXzIxKQorCQkJCXsKKwkJCQkJTUNTMjEgPSBpZHg7CisJCQkJfQorCQkJCWVsc2UgaWYgKHBDdXJyVHhSYXRlLT5DdXJyTUNTID09IE1DU18yMikKKwkJCQl7CisJCQkJCU1DUzIyID0gaWR4OworCQkJCX0KKwkJCQllbHNlIGlmIChwQ3VyclR4UmF0ZS0+Q3Vyck1DUyA9PSBNQ1NfMjMpCisJCQkJeworCQkJCQlNQ1MyMyA9IGlkeDsKKwkJCQl9CisJCQkJaWR4ICsrOworCQkJfQorCisJCQlpZiAocEFkLT5MYXRjaFJmUmVncy5DaGFubmVsIDw9IDE0KQorCQkJeworCQkJCWlmIChwQWQtPk5pY0NvbmZpZzIuZmllbGQuRXh0ZXJuYWxMTkFGb3JHKQorCQkJCXsKKwkJCQkJUnNzaU9mZnNldCA9IDI7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCVJzc2lPZmZzZXQgPSA1OworCQkJCX0KKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlpZiAocEFkLT5OaWNDb25maWcyLmZpZWxkLkV4dGVybmFsTE5BRm9yQSkKKwkJCQl7CisJCQkJCVJzc2lPZmZzZXQgPSA1OworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlSc3NpT2Zmc2V0ID0gODsKKwkJCQl9CisJCQl9CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQkvKmlmIChNQ1MxNSkqLworCQkJaWYgKChwVGFibGUgPT0gUmF0ZVN3aXRjaFRhYmxlMTFCR04zUykgfHwKKwkJCQkocFRhYmxlID09IFJhdGVTd2l0Y2hUYWJsZTExTjNTKSB8fAorCQkJCShwVGFibGUgPT0gUmF0ZVN3aXRjaFRhYmxlKSkKKwkJCXsvLyBOIG1vZGUgd2l0aCAzIHN0cmVhbSAvLyAzKjMKKwkJCQlpZiAoTUNTMjMgJiYgKFJzc2kgPj0gLTcwKSkKKwkJCQkJVHhSYXRlSWR4ID0gTUNTMTU7CisJCQkJZWxzZSBpZiAoTUNTMjIgJiYgKFJzc2kgPj0gLTcyKSkKKwkJCQkJVHhSYXRlSWR4ID0gTUNTMTQ7CisgICAgICAgIAkgICAgZWxzZSBpZiAoTUNTMjEgJiYgKFJzc2kgPj0gLTc2KSkKKwkJCQkJVHhSYXRlSWR4ID0gTUNTMTM7CisJCQkJZWxzZSBpZiAoTUNTMjAgJiYgKFJzc2kgPj0gLTc4KSkKKwkJCQkJVHhSYXRlSWR4ID0gTUNTMTI7CisJCQllbHNlIGlmIChNQ1M0ICYmIChSc3NpID49IC04MikpCisJCQkJVHhSYXRlSWR4ID0gTUNTNDsKKwkJCWVsc2UgaWYgKE1DUzMgJiYgKFJzc2kgPj0gLTg0KSkKKwkJCQlUeFJhdGVJZHggPSBNQ1MzOworCQkJZWxzZSBpZiAoTUNTMiAmJiAoUnNzaSA+PSAtODYpKQorCQkJCVR4UmF0ZUlkeCA9IE1DUzI7CisJCQllbHNlIGlmIChNQ1MxICYmIChSc3NpID49IC04OCkpCisJCQkJVHhSYXRlSWR4ID0gTUNTMTsKKwkJCWVsc2UKKwkJCQlUeFJhdGVJZHggPSBNQ1MwOworCQl9CisJCWVsc2UgaWYgKChwVGFibGUgPT0gUmF0ZVN3aXRjaFRhYmxlMTFCR04yUykgfHwgKHBUYWJsZSA9PSBSYXRlU3dpdGNoVGFibGUxMUJHTjJTRm9yQUJhbmQpIHx8KHBUYWJsZSA9PSBSYXRlU3dpdGNoVGFibGUxMU4yUykgfHwocFRhYmxlID09IFJhdGVTd2l0Y2hUYWJsZTExTjJTRm9yQUJhbmQpKSAvLyAzKjMKKwkJCXsvLyBOIG1vZGUgd2l0aCAyIHN0cmVhbQorCQkJCWlmIChNQ1MxNSAmJiAoUnNzaSA+PSAoLTcwK1Jzc2lPZmZzZXQpKSkKKwkJCQkJVHhSYXRlSWR4ID0gTUNTMTU7CisJCQkJZWxzZSBpZiAoTUNTMTQgJiYgKFJzc2kgPj0gKC03MitSc3NpT2Zmc2V0KSkpCisJCQkJCVR4UmF0ZUlkeCA9IE1DUzE0OworCQkJCWVsc2UgaWYgKE1DUzEzICYmIChSc3NpID49ICgtNzYrUnNzaU9mZnNldCkpKQorCQkJCQlUeFJhdGVJZHggPSBNQ1MxMzsKKwkJCQllbHNlIGlmIChNQ1MxMiAmJiAoUnNzaSA+PSAoLTc4K1Jzc2lPZmZzZXQpKSkKKwkJCQkJVHhSYXRlSWR4ID0gTUNTMTI7CisJCQkJZWxzZSBpZiAoTUNTNCAmJiAoUnNzaSA+PSAoLTgyK1Jzc2lPZmZzZXQpKSkKKwkJCQkJVHhSYXRlSWR4ID0gTUNTNDsKKwkJCQllbHNlIGlmIChNQ1MzICYmIChSc3NpID49ICgtODQrUnNzaU9mZnNldCkpKQorCQkJCQlUeFJhdGVJZHggPSBNQ1MzOworCQkJCWVsc2UgaWYgKE1DUzIgJiYgKFJzc2kgPj0gKC04NitSc3NpT2Zmc2V0KSkpCisJCQkJCVR4UmF0ZUlkeCA9IE1DUzI7CisJCQkJZWxzZSBpZiAoTUNTMSAmJiAoUnNzaSA+PSAoLTg4K1Jzc2lPZmZzZXQpKSkKKwkJCQkJVHhSYXRlSWR4ID0gTUNTMTsKKwkJCQllbHNlCisJCQkJCVR4UmF0ZUlkeCA9IE1DUzA7CisJCQl9CisJCQllbHNlIGlmICgocFRhYmxlID09IFJhdGVTd2l0Y2hUYWJsZTExQkdOMVMpIHx8IChwVGFibGUgPT0gUmF0ZVN3aXRjaFRhYmxlMTFOMVMpKQorCQkJey8vIE4gbW9kZSB3aXRoIDEgc3RyZWFtCisJCQkJaWYgKE1DUzcgJiYgKFJzc2kgPiAoLTcyK1Jzc2lPZmZzZXQpKSkKKwkJCQkJVHhSYXRlSWR4ID0gTUNTNzsKKwkJCQllbHNlIGlmIChNQ1M2ICYmIChSc3NpID4gKC03NCtSc3NpT2Zmc2V0KSkpCisJCQkJCVR4UmF0ZUlkeCA9IE1DUzY7CisJCQkJZWxzZSBpZiAoTUNTNSAmJiAoUnNzaSA+ICgtNzcrUnNzaU9mZnNldCkpKQorCQkJCQlUeFJhdGVJZHggPSBNQ1M1OworCQkJCWVsc2UgaWYgKE1DUzQgJiYgKFJzc2kgPiAoLTc5K1Jzc2lPZmZzZXQpKSkKKwkJCQkJVHhSYXRlSWR4ID0gTUNTNDsKKwkJCQllbHNlIGlmIChNQ1MzICYmIChSc3NpID4gKC04MStSc3NpT2Zmc2V0KSkpCisJCQkJCVR4UmF0ZUlkeCA9IE1DUzM7CisJCQkJZWxzZSBpZiAoTUNTMiAmJiAoUnNzaSA+ICgtODMrUnNzaU9mZnNldCkpKQorCQkJCQlUeFJhdGVJZHggPSBNQ1MyOworCQkJCWVsc2UgaWYgKE1DUzEgJiYgKFJzc2kgPiAoLTg2K1Jzc2lPZmZzZXQpKSkKKwkJCQkJVHhSYXRlSWR4ID0gTUNTMTsKKwkJCQllbHNlCisJCQkJCVR4UmF0ZUlkeCA9IE1DUzA7CisJCQl9CisJCQllbHNlCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCQl7Ly8gTGVnYWN5IG1vZGUKKwkJCQlpZiAoTUNTNyAmJiAoUnNzaSA+IC03MCkpCisJCQkJCVR4UmF0ZUlkeCA9IE1DUzc7CisJCQkJZWxzZSBpZiAoTUNTNiAmJiAoUnNzaSA+IC03NCkpCisJCQkJCVR4UmF0ZUlkeCA9IE1DUzY7CisJCQkJZWxzZSBpZiAoTUNTNSAmJiAoUnNzaSA+IC03OCkpCisJCQkJCVR4UmF0ZUlkeCA9IE1DUzU7CisJCQkJZWxzZSBpZiAoTUNTNCAmJiAoUnNzaSA+IC04MikpCisJCQkJCVR4UmF0ZUlkeCA9IE1DUzQ7CisJCQkJZWxzZSBpZiAoTUNTNCA9PSAwKQkvLyBmb3IgQi1vbmx5IG1vZGUKKwkJCQkJVHhSYXRlSWR4ID0gTUNTMzsKKwkJCQllbHNlIGlmIChNQ1MzICYmIChSc3NpID4gLTg1KSkKKwkJCQkJVHhSYXRlSWR4ID0gTUNTMzsKKwkJCQllbHNlIGlmIChNQ1MyICYmIChSc3NpID4gLTg3KSkKKwkJCQkJVHhSYXRlSWR4ID0gTUNTMjsKKwkJCQllbHNlIGlmIChNQ1MxICYmIChSc3NpID4gLTkwKSkKKwkJCQkJVHhSYXRlSWR4ID0gTUNTMTsKKwkJCQllbHNlCisJCQkJCVR4UmF0ZUlkeCA9IE1DUzA7CisJCQl9CisKKwkJCXsKKwkJCQlwRW50cnktPkN1cnJUeFJhdGVJbmRleCA9IFR4UmF0ZUlkeDsKKwkJCQlwTmV4dFR4UmF0ZSA9IChQUlRNUF9UWF9SQVRFX1NXSVRDSCkgJnBUYWJsZVsocEVudHJ5LT5DdXJyVHhSYXRlSW5kZXgrMSkqNV07CisJCQkJTWxtZVNldFR4UmF0ZShwQWQsIHBFbnRyeSwgcE5leHRUeFJhdGUpOworCQkJfQorCisJCQlOZGlzWmVyb01lbW9yeShwRW50cnktPlR4UXVhbGl0eSwgc2l6ZW9mKFVTSE9SVCkgKiBNQVhfU1RFUF9PRl9UWF9SQVRFX1NXSVRDSCk7CisJCQlOZGlzWmVyb01lbW9yeShwRW50cnktPlBFUiwgc2l6ZW9mKFVDSEFSKSAqIE1BWF9TVEVQX09GX1RYX1JBVEVfU1dJVENIKTsKKwkJCXBFbnRyeS0+Zkxhc3RTZWNBY2NvcmRpbmdSU1NJID0gVFJVRTsKKwkJCS8vIHJlc2V0IGFsbCBPbmVTZWNUeCBjb3VudGVycworCQkJUkVTRVRfT05FX1NFQ19UWF9DTlQocEVudHJ5KTsKKworCQkJY29udGludWU7CisJCX0KKworCQlpZiAocEVudHJ5LT5mTGFzdFNlY0FjY29yZGluZ1JTU0kgPT0gVFJVRSkKKwkJeworCQkJcEVudHJ5LT5mTGFzdFNlY0FjY29yZGluZ1JTU0kgPSBGQUxTRTsKKwkJCXBFbnRyeS0+TGFzdFNlY1R4UmF0ZUNoYW5nZUFjdGlvbiA9IDA7CisJCQkvLyByZXNldCBhbGwgT25lU2VjVHggY291bnRlcnMKKwkJCVJFU0VUX09ORV9TRUNfVFhfQ05UKHBFbnRyeSk7CisKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJZG8KKwkJeworCQkJQk9PTEVBTgliVHJhaW5VcERvd24gPSBGQUxTRTsKKworCQkJcEVudHJ5LT5DdXJyVHhSYXRlU3RhYmxlVGltZSArKzsKKworCQkJLy8gZG93bmdyYWRlIFRYIHF1YWxpdHkgaWYgUEVSID49IFJhdGUtRG93biB0aHJlc2hvbGQKKwkJCWlmIChUeEVycm9yUmF0aW8gPj0gVHJhaW5Eb3duKQorCQkJeworCQkJCWJUcmFpblVwRG93biA9IFRSVUU7CisJCQkJcEVudHJ5LT5UeFF1YWxpdHlbQ3VyclJhdGVJZHhdID0gRFJTX1RYX1FVQUxJVFlfV09SU1RfQk9VTkQ7CisJCQl9CisJCQkvLyB1cGdyYWRlIFRYIHF1YWxpdHkgaWYgUEVSIDw9IFJhdGUtVXAgdGhyZXNob2xkCisJCQllbHNlIGlmIChUeEVycm9yUmF0aW8gPD0gVHJhaW5VcCkKKwkJCXsKKwkJCQliVHJhaW5VcERvd24gPSBUUlVFOworCQkJCWJVcGdyYWRlUXVhbGl0eSA9IFRSVUU7CisJCQkJaWYgKHBFbnRyeS0+VHhRdWFsaXR5W0N1cnJSYXRlSWR4XSkKKwkJCQkJcEVudHJ5LT5UeFF1YWxpdHlbQ3VyclJhdGVJZHhdIC0tOyAgLy8gcXVhbGl0eSB2ZXJ5IGdvb2QgaW4gQ3VyclJhdGUKKworCQkJCWlmIChwRW50cnktPlR4UmF0ZVVwUGVuYWx0eSkKKwkJCQkJcEVudHJ5LT5UeFJhdGVVcFBlbmFsdHkgLS07CisJCQkJZWxzZSBpZiAocEVudHJ5LT5UeFF1YWxpdHlbVXBSYXRlSWR4XSkKKwkJCQkJcEVudHJ5LT5UeFF1YWxpdHlbVXBSYXRlSWR4XSAtLTsgICAgLy8gbWF5IGltcHJvdmUgbmV4dCBVUCByYXRlJ3MgcXVhbGl0eQorCQkJfQorCisJCQlwRW50cnktPlBFUltDdXJyUmF0ZUlkeF0gPSAoVUNIQVIpVHhFcnJvclJhdGlvOworCisJCQlpZiAoYlRyYWluVXBEb3duKQorCQkJeworCQkJCS8vIHBlcmZvcm0gRFJTIC0gY29uc2lkZXIgVHhSYXRlIERvd24gZmlyc3QsIHRoZW4gcmF0ZSB1cC4KKwkJCQlpZiAoKEN1cnJSYXRlSWR4ICE9IERvd25SYXRlSWR4KSAmJiAocEVudHJ5LT5UeFF1YWxpdHlbQ3VyclJhdGVJZHhdID49IERSU19UWF9RVUFMSVRZX1dPUlNUX0JPVU5EKSkKKwkJCQl7CisJCQkJCXBFbnRyeS0+Q3VyclR4UmF0ZUluZGV4ID0gRG93blJhdGVJZHg7CisJCQkJfQorCQkJCWVsc2UgaWYgKChDdXJyUmF0ZUlkeCAhPSBVcFJhdGVJZHgpICYmIChwRW50cnktPlR4UXVhbGl0eVtVcFJhdGVJZHhdIDw9IDApKQorCQkJCXsKKwkJCQkJcEVudHJ5LT5DdXJyVHhSYXRlSW5kZXggPSBVcFJhdGVJZHg7CisJCQkJfQorCQkJfQorCQl9IHdoaWxlIChGQUxTRSk7CisKKwkJLy8gaWYgcmF0ZS11cCBoYXBwZW4sIGNsZWFyIGFsbCBiYWQgaGlzdG9yeSBvZiBhbGwgVFggcmF0ZXMKKwkJaWYgKHBFbnRyeS0+Q3VyclR4UmF0ZUluZGV4ID4gQ3VyclJhdGVJZHgpCisJCXsKKwkJCXBFbnRyeS0+Q3VyclR4UmF0ZVN0YWJsZVRpbWUgPSAwOworCQkJcEVudHJ5LT5UeFJhdGVVcFBlbmFsdHkgPSAwOworCQkJcEVudHJ5LT5MYXN0U2VjVHhSYXRlQ2hhbmdlQWN0aW9uID0gMTsgLy8gcmF0ZSBVUAorCQkJTmRpc1plcm9NZW1vcnkocEVudHJ5LT5UeFF1YWxpdHksIHNpemVvZihVU0hPUlQpICogTUFYX1NURVBfT0ZfVFhfUkFURV9TV0lUQ0gpOworCQkJTmRpc1plcm9NZW1vcnkocEVudHJ5LT5QRVIsIHNpemVvZihVQ0hBUikgKiBNQVhfU1RFUF9PRl9UWF9SQVRFX1NXSVRDSCk7CisKKwkJCS8vCisJCQkvLyBGb3IgVHhSYXRlIGZhc3QgdHJhaW4gdXAKKwkJCS8vCisJCQlpZiAoIXBBZC0+U3RhQ2ZnLlN0YVF1aWNrUmVzcG9uZUZvclJhdGVVcFRpbWVyUnVubmluZykKKwkJCXsKKwkJCQlSVE1QU2V0VGltZXIoJnBBZC0+U3RhQ2ZnLlN0YVF1aWNrUmVzcG9uZUZvclJhdGVVcFRpbWVyLCAxMDApOworCisJCQkJcEFkLT5TdGFDZmcuU3RhUXVpY2tSZXNwb25lRm9yUmF0ZVVwVGltZXJSdW5uaW5nID0gVFJVRTsKKwkJCX0KKwkJCWJUeFJhdGVDaGFuZ2VkID0gVFJVRTsKKwkJfQorCQkvLyBpZiByYXRlLWRvd24gaGFwcGVuLCBvbmx5IGNsZWFyIERvd25SYXRlJ3MgYmFkIGhpc3RvcnkKKwkJZWxzZSBpZiAocEVudHJ5LT5DdXJyVHhSYXRlSW5kZXggPCBDdXJyUmF0ZUlkeCkKKwkJeworCQkJcEVudHJ5LT5DdXJyVHhSYXRlU3RhYmxlVGltZSA9IDA7CisJCQlwRW50cnktPlR4UmF0ZVVwUGVuYWx0eSA9IDA7ICAgICAgICAgICAvLyBubyBwZW5hbHR5CisJCQlwRW50cnktPkxhc3RTZWNUeFJhdGVDaGFuZ2VBY3Rpb24gPSAyOyAvLyByYXRlIERPV04KKwkJCXBFbnRyeS0+VHhRdWFsaXR5W3BFbnRyeS0+Q3VyclR4UmF0ZUluZGV4XSA9IDA7CisJCQlwRW50cnktPlBFUltwRW50cnktPkN1cnJUeFJhdGVJbmRleF0gPSAwOworCisJCQkvLworCQkJLy8gRm9yIFR4UmF0ZSBmYXN0IHRyYWluIGRvd24KKwkJCS8vCisJCQlpZiAoIXBBZC0+U3RhQ2ZnLlN0YVF1aWNrUmVzcG9uZUZvclJhdGVVcFRpbWVyUnVubmluZykKKwkJCXsKKwkJCQlSVE1QU2V0VGltZXIoJnBBZC0+U3RhQ2ZnLlN0YVF1aWNrUmVzcG9uZUZvclJhdGVVcFRpbWVyLCAxMDApOworCisJCQkJcEFkLT5TdGFDZmcuU3RhUXVpY2tSZXNwb25lRm9yUmF0ZVVwVGltZXJSdW5uaW5nID0gVFJVRTsKKwkJCX0KKwkJCWJUeFJhdGVDaGFuZ2VkID0gVFJVRTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXBFbnRyeS0+TGFzdFNlY1R4UmF0ZUNoYW5nZUFjdGlvbiA9IDA7IC8vIHJhdGUgbm8gY2hhbmdlCisJCQliVHhSYXRlQ2hhbmdlZCA9IEZBTFNFOworCQl9CisKKwkJcEVudHJ5LT5MYXN0VHhPa0NvdW50ID0gVHhTdWNjZXNzOworCisJCS8vIHJlc2V0IGFsbCBPbmVTZWNUeCBjb3VudGVycworCQlSRVNFVF9PTkVfU0VDX1RYX0NOVChwRW50cnkpOworCisJCXBOZXh0VHhSYXRlID0gKFBSVE1QX1RYX1JBVEVfU1dJVENIKSAmcFRhYmxlWyhwRW50cnktPkN1cnJUeFJhdGVJbmRleCsxKSo1XTsKKwkJaWYgKGJUeFJhdGVDaGFuZ2VkICYmIHBOZXh0VHhSYXRlKQorCQl7CisJCQlNbG1lU2V0VHhSYXRlKHBBZCwgcEVudHJ5LCBwTmV4dFR4UmF0ZSk7CisJCX0KKwl9Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJU3RhdGlvbiBzaWRlLCBBdXRvIFR4UmF0ZSBmYXN0ZXIgdHJhaW4gdXAgdGltZXIgY2FsbCBiYWNrIGZ1bmN0aW9uLgorCisJQXJndW1lbnRzOgorCQlTeXN0ZW1TcGVjaWZpYzEJCQktIE5vdCB1c2VkLgorCQlGdW5jdGlvbkNvbnRleHQJCQktIFBvaW50ZXIgdG8gb3VyIEFkYXB0ZXIgY29udGV4dC4KKwkJU3lzdGVtU3BlY2lmaWMyCQkJLSBOb3QgdXNlZC4KKwkJU3lzdGVtU3BlY2lmaWMzCQkJLSBOb3QgdXNlZC4KKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBTdGFRdWlja1Jlc3BvbmVGb3JSYXRlVXBFeGVjKAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKKwlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMykKK3sKKwlQUlRNUF9BREFQVEVSCQkJcEFkID0gKFBSVE1QX0FEQVBURVIpRnVuY3Rpb25Db250ZXh0OworCVVDSEFSCQkJCQlVcFJhdGVJZHggPSAwLCBEb3duUmF0ZUlkeCA9IDAsIEN1cnJSYXRlSWR4ID0gMDsKKwlVTE9ORwkJCQkJVHhUb3RhbENudDsKKwlVTE9ORwkJCQkJVHhFcnJvclJhdGlvID0gMDsKKwlCT09MRUFOCQkJCQliVHhSYXRlQ2hhbmdlZCA9IFRSVUU7IC8vLCBiVXBncmFkZVF1YWxpdHkgPSBGQUxTRTsKKwlQUlRNUF9UWF9SQVRFX1NXSVRDSAlwQ3VyclR4UmF0ZSwgcE5leHRUeFJhdGUgPSBOVUxMOworCVBVQ0hBUgkJCQkJcFRhYmxlOworCVVDSEFSCQkJCQlUYWJsZVNpemUgPSAwOworCVVDSEFSCQkJCQlJbml0VHhSYXRlSWR4ID0gMCwgVHJhaW5VcCwgVHJhaW5Eb3duOworCVRYX1NUQV9DTlQxX1NUUlVDCQlTdGFUeDE7CisJVFhfU1RBX0NOVDBfU1RSVUMJCVR4U3RhQ250MDsKKwlDSEFSCQkJCQlSc3NpLCByYXRpbzsKKwlVTE9ORwkJCQkJVHhSZXRyYW5zbWl0ID0gMCwgVHhTdWNjZXNzID0gMCwgVHhGYWlsQ291bnQgPSAwOworCU1BQ19UQUJMRV9FTlRSWQkJCSpwRW50cnk7CisJVUxPTkcJCQkJCWk7CisKKwlwQWQtPlN0YUNmZy5TdGFRdWlja1Jlc3BvbmVGb3JSYXRlVXBUaW1lclJ1bm5pbmcgPSBGQUxTRTsKKworICAgIC8vCisgICAgLy8gd2FsayB0aHJvdWdoIE1BQyB0YWJsZSwgc2VlIGlmIG5lZWQgdG8gY2hhbmdlIEFQJ3MgVFggcmF0ZSB0b3dhcmQgZWFjaCBlbnRyeQorICAgIC8vCisJZm9yIChpID0gMTsgaSA8IE1BWF9MRU5fT0ZfTUFDX1RBQkxFOyBpKyspCisJeworCQlwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtpXTsKKworCQkvLyBjaGVjayBpZiB0aGlzIGVudHJ5IG5lZWQgdG8gc3dpdGNoIHJhdGUgYXV0b21hdGljYWxseQorCQlpZiAoUlRNUENoZWNrRW50cnlFbmFibGVBdXRvUmF0ZVN3aXRjaChwQWQsIHBFbnRyeSkgPT0gRkFMU0UpCisJCQljb250aW51ZTsKKworCQkvL1Jzc2kgPSBSVE1QTWF4UnNzaShwQWQsIChDSEFSKXBBZC0+U3RhQ2ZnLkF2Z1Jzc2kwLCAoQ0hBUilwQWQtPlN0YUNmZy5BdmdSc3NpMSwgKENIQVIpcEFkLT5TdGFDZmcuQXZnUnNzaTIpOworCSAgICBpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCA+IDEpCisJCQlSc3NpID0gKHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTAgKyBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kxKSA+PiAxOworCQllbHNlCisJCQlSc3NpID0gcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMDsKKworCQlDdXJyUmF0ZUlkeCA9IHBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZUluZGV4OworCisJCQlNbG1lU2VsZWN0VHhSYXRlVGFibGUocEFkLCBwRW50cnksICZwVGFibGUsICZUYWJsZVNpemUsICZJbml0VHhSYXRlSWR4KTsKKworCQkvLyBkZWNpZGUgdGhlIG5leHQgdXBncmFkZSByYXRlIGFuZCBkb3duZ3JhZGUgcmF0ZSwgaWYgYW55CisJCWlmICgoQ3VyclJhdGVJZHggPiAwKSAmJiAoQ3VyclJhdGVJZHggPCAoVGFibGVTaXplIC0gMSkpKQorCQl7CisJCQlVcFJhdGVJZHggPSBDdXJyUmF0ZUlkeCArIDE7CisJCQlEb3duUmF0ZUlkeCA9IEN1cnJSYXRlSWR4IC0xOworCQl9CisJCWVsc2UgaWYgKEN1cnJSYXRlSWR4ID09IDApCisJCXsKKwkJCVVwUmF0ZUlkeCA9IEN1cnJSYXRlSWR4ICsgMTsKKwkJCURvd25SYXRlSWR4ID0gQ3VyclJhdGVJZHg7CisJCX0KKwkJZWxzZSBpZiAoQ3VyclJhdGVJZHggPT0gKFRhYmxlU2l6ZSAtIDEpKQorCQl7CisJCQlVcFJhdGVJZHggPSBDdXJyUmF0ZUlkeDsKKwkJCURvd25SYXRlSWR4ID0gQ3VyclJhdGVJZHggLSAxOworCQl9CisKKwkJcEN1cnJUeFJhdGUgPSAoUFJUTVBfVFhfUkFURV9TV0lUQ0gpICZwVGFibGVbKEN1cnJSYXRlSWR4KzEpKjVdOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCWlmICgoUnNzaSA+IC02NSkgJiYgKHBDdXJyVHhSYXRlLT5Nb2RlID49IE1PREVfSFRNSVgpKQorCQl7CisJCQlUcmFpblVwCQk9IChwQ3VyclR4UmF0ZS0+VHJhaW5VcCArIChwQ3VyclR4UmF0ZS0+VHJhaW5VcCA+PiAxKSk7CisJCQlUcmFpbkRvd24JPSAocEN1cnJUeFJhdGUtPlRyYWluRG93biArIChwQ3VyclR4UmF0ZS0+VHJhaW5Eb3duID4+IDEpKTsKKwkJfQorCQllbHNlCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCXsKKwkJCVRyYWluVXAJCT0gcEN1cnJUeFJhdGUtPlRyYWluVXA7CisJCQlUcmFpbkRvd24JPSBwQ3VyclR4UmF0ZS0+VHJhaW5Eb3duOworCQl9CisKKwkJaWYgKHBBZC0+TWFjVGFiLlNpemUgPT0gMSkKKwkJeworCQkJLy8gVXBkYXRlIHN0YXRpc3RpYyBjb3VudGVyCisJCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX1NUQV9DTlQwLCAmVHhTdGFDbnQwLndvcmQpOworCQkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9TVEFfQ05UMSwgJlN0YVR4MS53b3JkKTsKKworCQkJVHhSZXRyYW5zbWl0ID0gU3RhVHgxLmZpZWxkLlR4UmV0cmFuc21pdDsKKwkJCVR4U3VjY2VzcyA9IFN0YVR4MS5maWVsZC5UeFN1Y2Nlc3M7CisJCQlUeEZhaWxDb3VudCA9IFR4U3RhQ250MC5maWVsZC5UeEZhaWxDb3VudDsKKwkJCVR4VG90YWxDbnQgPSBUeFJldHJhbnNtaXQgKyBUeFN1Y2Nlc3MgKyBUeEZhaWxDb3VudDsKKworCQkJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeFJldHJ5T2tDb3VudCArPSBTdGFUeDEuZmllbGQuVHhSZXRyYW5zbWl0OworCQkJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeE5vUmV0cnlPa0NvdW50ICs9IFN0YVR4MS5maWVsZC5UeFN1Y2Nlc3M7CisJCQlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4RmFpbENvdW50ICs9IFR4U3RhQ250MC5maWVsZC5UeEZhaWxDb3VudDsKKwkJCXBBZC0+V2xhbkNvdW50ZXJzLlRyYW5zbWl0dGVkRnJhZ21lbnRDb3VudC51Lkxvd1BhcnQgKz0gU3RhVHgxLmZpZWxkLlR4U3VjY2VzczsKKwkJCXBBZC0+V2xhbkNvdW50ZXJzLlJldHJ5Q291bnQudS5Mb3dQYXJ0ICs9IFN0YVR4MS5maWVsZC5UeFJldHJhbnNtaXQ7CisJCQlwQWQtPldsYW5Db3VudGVycy5GYWlsZWRDb3VudC51Lkxvd1BhcnQgKz0gVHhTdGFDbnQwLmZpZWxkLlR4RmFpbENvdW50OworCisJCQlpZiAoVHhUb3RhbENudCkKKwkJCQlUeEVycm9yUmF0aW8gPSAoKFR4UmV0cmFuc21pdCArIFR4RmFpbENvdW50KSAqIDEwMCkgLyBUeFRvdGFsQ250OworCQl9CisJCWVsc2UKKwkJeworCQkJVHhUb3RhbENudCA9IHBFbnRyeS0+T25lU2VjVHhOb1JldHJ5T2tDb3VudCArCisJCQkJIHBFbnRyeS0+T25lU2VjVHhSZXRyeU9rQ291bnQgKworCQkJCSBwRW50cnktPk9uZVNlY1R4RmFpbENvdW50OworCisJCQlpZiAoVHhUb3RhbENudCkKKwkJCQlUeEVycm9yUmF0aW8gPSAoKHBFbnRyeS0+T25lU2VjVHhSZXRyeU9rQ291bnQgKyBwRW50cnktPk9uZVNlY1R4RmFpbENvdW50KSAqIDEwMCkgLyBUeFRvdGFsQ250OworCQl9CisKKworCQkvLworCQkvLyBDQVNFIDEuIHdoZW4gVFggc2FtcGxlcyBhcmUgZmV3ZXIgdGhhbiAxNSwgdGhlbiBkZWNpZGUgVFggcmF0ZSBzb2xlbHkgb24gUlNTSQorCQkvLyAgICAgICAgIChjcml0ZXJpYSBjb3BpZWQgZnJvbSBSVDI1MDAgZm9yIE5ldG9waWEgY2FzZSkKKwkJLy8KKwkJaWYgKFR4VG90YWxDbnQgPD0gMTIpCisJCXsKKwkJCU5kaXNaZXJvTWVtb3J5KHBBZC0+RHJzQ291bnRlcnMuVHhRdWFsaXR5LCBzaXplb2YoVVNIT1JUKSAqIE1BWF9TVEVQX09GX1RYX1JBVEVfU1dJVENIKTsKKwkJCU5kaXNaZXJvTWVtb3J5KHBBZC0+RHJzQ291bnRlcnMuUEVSLCBzaXplb2YoVUNIQVIpICogTUFYX1NURVBfT0ZfVFhfUkFURV9TV0lUQ0gpOworCisJCQlpZiAoKHBBZC0+RHJzQ291bnRlcnMuTGFzdFNlY1R4UmF0ZUNoYW5nZUFjdGlvbiA9PSAxKSAmJiAoQ3VyclJhdGVJZHggIT0gRG93blJhdGVJZHgpKQorCQkJeworCQkJCXBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZUluZGV4ID0gRG93blJhdGVJZHg7CisJCQkJcEFkLT5EcnNDb3VudGVycy5UeFF1YWxpdHlbQ3VyclJhdGVJZHhdID0gRFJTX1RYX1FVQUxJVFlfV09SU1RfQk9VTkQ7CisJCQl9CisJCQllbHNlIGlmICgocEFkLT5EcnNDb3VudGVycy5MYXN0U2VjVHhSYXRlQ2hhbmdlQWN0aW9uID09IDIpICYmIChDdXJyUmF0ZUlkeCAhPSBVcFJhdGVJZHgpKQorCQkJeworCQkJCXBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZUluZGV4ID0gVXBSYXRlSWR4OworCQkJfQorCisJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsKCJRdWlja0RSUzogVHhUb3RhbENudCA8PSAxNSwgdHJhaW4gYmFjayB0byBvcmlnaW5hbCByYXRlIFxuIikpOworCQkJcmV0dXJuOworCQl9CisKKwkJZG8KKwkJeworCQkJVUxPTkcgT25lU2VjVHhOb1JldHJ5T0tSYXRpb25Db3VudDsKKworCQkJaWYgKHBBZC0+RHJzQ291bnRlcnMuTGFzdFRpbWVUeFJhdGVDaGFuZ2VBY3Rpb24gPT0gMCkKKwkJCQlyYXRpbyA9IDU7CisJCQllbHNlCisJCQkJcmF0aW8gPSA0OworCisJCQkvLyBkb3duZ3JhZGUgVFggcXVhbGl0eSBpZiBQRVIgPj0gUmF0ZS1Eb3duIHRocmVzaG9sZAorCQkJaWYgKFR4RXJyb3JSYXRpbyA+PSBUcmFpbkRvd24pCisJCQl7CisJCQkJcEFkLT5EcnNDb3VudGVycy5UeFF1YWxpdHlbQ3VyclJhdGVJZHhdID0gRFJTX1RYX1FVQUxJVFlfV09SU1RfQk9VTkQ7CisJCQl9CisKKwkJCXBBZC0+RHJzQ291bnRlcnMuUEVSW0N1cnJSYXRlSWR4XSA9IChVQ0hBUilUeEVycm9yUmF0aW87CisKKwkJCU9uZVNlY1R4Tm9SZXRyeU9LUmF0aW9uQ291bnQgPSAoVHhTdWNjZXNzICogcmF0aW8pOworCisJCQkvLyBwZXJmb3JtIERSUyAtIGNvbnNpZGVyIFR4UmF0ZSBEb3duIGZpcnN0LCB0aGVuIHJhdGUgdXAuCisJCQlpZiAoKHBBZC0+RHJzQ291bnRlcnMuTGFzdFNlY1R4UmF0ZUNoYW5nZUFjdGlvbiA9PSAxKSAmJiAoQ3VyclJhdGVJZHggIT0gRG93blJhdGVJZHgpKQorCQkJeworCQkJCWlmICgocEFkLT5EcnNDb3VudGVycy5MYXN0VHhPa0NvdW50ICsgMikgPj0gT25lU2VjVHhOb1JldHJ5T0tSYXRpb25Db3VudCkKKwkJCQl7CisJCQkJCXBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZUluZGV4ID0gRG93blJhdGVJZHg7CisJCQkJCXBBZC0+RHJzQ291bnRlcnMuVHhRdWFsaXR5W0N1cnJSYXRlSWR4XSA9IERSU19UWF9RVUFMSVRZX1dPUlNUX0JPVU5EOworCisJCQkJfQorCisJCQl9CisJCQllbHNlIGlmICgocEFkLT5EcnNDb3VudGVycy5MYXN0U2VjVHhSYXRlQ2hhbmdlQWN0aW9uID09IDIpICYmIChDdXJyUmF0ZUlkeCAhPSBVcFJhdGVJZHgpKQorCQkJeworCQkJCWlmICgoVHhFcnJvclJhdGlvID49IDUwKSB8fCAoVHhFcnJvclJhdGlvID49IFRyYWluRG93bikpCisJCQkJeworCisJCQkJfQorCQkJCWVsc2UgaWYgKChwQWQtPkRyc0NvdW50ZXJzLkxhc3RUeE9rQ291bnQgKyAyKSA+PSBPbmVTZWNUeE5vUmV0cnlPS1JhdGlvbkNvdW50KQorCQkJCXsKKwkJCQkJcEFkLT5Db21tb25DZmcuVHhSYXRlSW5kZXggPSBVcFJhdGVJZHg7CisJCQkJfQorCQkJfQorCQl9d2hpbGUgKEZBTFNFKTsKKworCQkvLyBpZiByYXRlLXVwIGhhcHBlbiwgY2xlYXIgYWxsIGJhZCBoaXN0b3J5IG9mIGFsbCBUWCByYXRlcworCQlpZiAocEFkLT5Db21tb25DZmcuVHhSYXRlSW5kZXggPiBDdXJyUmF0ZUlkeCkKKwkJeworCQkJcEFkLT5EcnNDb3VudGVycy5UeFJhdGVVcFBlbmFsdHkgPSAwOworCQkJTmRpc1plcm9NZW1vcnkocEFkLT5EcnNDb3VudGVycy5UeFF1YWxpdHksIHNpemVvZihVU0hPUlQpICogTUFYX1NURVBfT0ZfVFhfUkFURV9TV0lUQ0gpOworCQkJTmRpc1plcm9NZW1vcnkocEFkLT5EcnNDb3VudGVycy5QRVIsIHNpemVvZihVQ0hBUikgKiBNQVhfU1RFUF9PRl9UWF9SQVRFX1NXSVRDSCk7CisJCX0KKwkJLy8gaWYgcmF0ZS1kb3duIGhhcHBlbiwgb25seSBjbGVhciBEb3duUmF0ZSdzIGJhZCBoaXN0b3J5CisJCWVsc2UgaWYgKHBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZUluZGV4IDwgQ3VyclJhdGVJZHgpCisJCXsKKwkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwoIlF1aWNrRFJTOiAtLVRYIHJhdGUgZnJvbSAlZCB0byAlZCBcbiIsIEN1cnJSYXRlSWR4LCBwQWQtPkNvbW1vbkNmZy5UeFJhdGVJbmRleCkpOworCisJCQlwQWQtPkRyc0NvdW50ZXJzLlR4UmF0ZVVwUGVuYWx0eSA9IDA7ICAgICAgICAgICAvLyBubyBwZW5hbHR5CisJCQlwQWQtPkRyc0NvdW50ZXJzLlR4UXVhbGl0eVtwQWQtPkNvbW1vbkNmZy5UeFJhdGVJbmRleF0gPSAwOworCQkJcEFkLT5EcnNDb3VudGVycy5QRVJbcEFkLT5Db21tb25DZmcuVHhSYXRlSW5kZXhdID0gMDsKKwkJfQorCQllbHNlCisJCXsKKwkJCWJUeFJhdGVDaGFuZ2VkID0gRkFMU0U7CisJCX0KKworCQlwTmV4dFR4UmF0ZSA9IChQUlRNUF9UWF9SQVRFX1NXSVRDSCkgJnBUYWJsZVsocEFkLT5Db21tb25DZmcuVHhSYXRlSW5kZXgrMSkqNV07CisJCWlmIChiVHhSYXRlQ2hhbmdlZCAmJiBwTmV4dFR4UmF0ZSkKKwkJeworCQkJTWxtZVNldFR4UmF0ZShwQWQsIHBFbnRyeSwgcE5leHRUeFJhdGUpOworCQl9CisJfQorfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVRoaXMgcm91dGluZSBpcyBleGVjdXRlZCBwZXJpb2RpY2FsbHkgaW5zaWRlIE1sbWVQZXJpb2RpY0V4ZWMoKSBhZnRlcgorCQlhc3NvY2lhdGlvbiB3aXRoIGFuIEFQLgorCQlJdCBjaGVja3MgaWYgU3RhQ2ZnLlBzbSBpcyBjb25zaXN0ZW50IHdpdGggdXNlciBwb2xpY3kgKHJlY29yZGVkIGluCisJCVN0YUNmZy5XaW5kb3dzUG93ZXJNb2RlKS4gSWYgbm90LCBlbmZvcmNlIHVzZXIgcG9saWN5LiBIb3dldmVyLAorCQl0aGVyZSdyZSBzb21lIGNvbmRpdGlvbnMgdG8gY29uc2lkZXI6CisJCTEuIHdlIGRvbid0IHN1cHBvcnQgcG93ZXItc2F2aW5nIGluIEFESE9DIG1vZGUsIHNvIFBzbT1QV1JfQUNUSVZFIGFsbAorCQkgICB0aGUgdGltZSB3aGVuIE1pYnNzPT1UUlVFCisJCTIuIFdoZW4gbGluayB1cCBpbiBJTkZSQSBtb2RlLCBQc20gc2hvdWxkIG5vdCBiZSBzd2l0Y2ggdG8gUFdSX1NBVkUKKwkJICAgaWYgb3V0Z29pbmcgdHJhZmZpYyBhdmFpbGFibGUgaW4gVHhSaW5nIG9yIE1nbXRSaW5nLgorCU91dHB1dDoKKwkJMS4gY2hhbmdlIHBBZC0+U3RhQ2ZnLlBzbSB0byBQV1JfU0FWRSBvciBsZWF2ZSBpdCB1bnRvdWNoZWQKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBNbG1lQ2hlY2tQc21DaGFuZ2UoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVUxPTkcJTm93MzIpCit7CisJVUxPTkcJUG93ZXJNb2RlOworCisJLy8gY29uZGl0aW9uIC0KKwkvLyAxLiBQc20gbWF5YmUgT04gb25seSBoYXBwZW4gaW4gSU5GUkFTVFJVQ1RVUkUgbW9kZQorCS8vIDIuIHVzZXIgd2FudHMgZWl0aGVyIE1BWF9QU1Agb3IgRkFTVF9QU1AKKwkvLyAzLiBidXQgY3VycmVudCBwc20gaXMgbm90IGluIFBXUl9TQVZFCisJLy8gNC4gQ05UTCBzdGF0ZSBtYWNoaW5lIGlzIG5vdCBkb2luZyBTQ0FObmluZworCS8vIDUuIG5vIFRYIFNVQ0NFU1MgZXZlbnQgZm9yIHRoZSBwYXN0IDEtc2VjIHBlcmlvZAorI2lmZGVmIE5ESVM1MV9NSU5JUE9SVAorCWlmIChwQWQtPlN0YUNmZy5XaW5kb3dzUG93ZXJQcm9maWxlID09IE5kaXNQb3dlclByb2ZpbGVCYXR0ZXJ5KQorCQlQb3dlck1vZGUgPSBwQWQtPlN0YUNmZy5XaW5kb3dzQmF0dGVyeVBvd2VyTW9kZTsKKwllbHNlCisjZW5kaWYKKwkJUG93ZXJNb2RlID0gcEFkLT5TdGFDZmcuV2luZG93c1Bvd2VyTW9kZTsKKworCWlmIChJTkZSQV9PTihwQWQpICYmCisJCShQb3dlck1vZGUgIT0gTmRpczgwMl8xMVBvd2VyTW9kZUNBTSkgJiYKKwkJKHBBZC0+U3RhQ2ZnLlBzbSA9PSBQV1JfQUNUSVZFKSAmJgorCQkocEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9PSBDTlRMX0lETEUpKQorCXsKKwkJTmRpc0dldFN5c3RlbVVwVGltZSgmcEFkLT5NbG1lLkxhc3RTZW5kTlVMTHBzbVRpbWUpOworCQlwQWQtPlJhbGlua0NvdW50ZXJzLlJ4Q291bnRTaW5jZUxhc3ROVUxMID0gMDsKKwkJTWxtZVNldFBzbUJpdChwQWQsIFBXUl9TQVZFKTsKKwkJaWYgKCEocEFkLT5Db21tb25DZmcuYkFQU0RDYXBhYmxlICYmIHBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uYkFQU0RDYXBhYmxlKSkKKwkJeworCQkJUlRNUFNlbmROdWxsRnJhbWUocEFkLCBwQWQtPkNvbW1vbkNmZy5UeFJhdGUsIEZBTFNFKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCVJUTVBTZW5kTnVsbEZyYW1lKHBBZCwgcEFkLT5Db21tb25DZmcuVHhSYXRlLCBUUlVFKTsKKwkJfQorCX0KK30KKworLy8gSVJRTCA9IFBBU1NJVkVfTEVWRUwKKy8vIElSUUwgPSBESVNQQVRDSF9MRVZFTAorVk9JRCBNbG1lU2V0UHNtQml0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVTSE9SVCBwc20pCit7CisJQVVUT19SU1BfQ0ZHX1NUUlVDIGNzcjQ7CisKKwlwQWQtPlN0YUNmZy5Qc20gPSBwc207CisJUlRNUF9JT19SRUFEMzIocEFkLCBBVVRPX1JTUF9DRkcsICZjc3I0LndvcmQpOworCWNzcjQuZmllbGQuQWNrQ3RzUHNtQml0ID0gKHBzbSA9PSBQV1JfU0FWRSk/IDE6MDsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBBVVRPX1JTUF9DRkcsIGNzcjQud29yZCk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTWxtZVNldFBzbUJpdCA9ICVkXG4iLCBwc20pKTsKK30KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCisvLyBJUlFMID0gRElTUEFUQ0hfTEVWRUwKK1ZPSUQgTWxtZVNldFR4UHJlYW1ibGUoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVVNIT1JUIFR4UHJlYW1ibGUpCit7CisJQVVUT19SU1BfQ0ZHX1NUUlVDIGNzcjQ7CisKKwkvLworCS8vIEFsd2F5cyB1c2UgTG9uZyBwcmVhbWJsZSBiZWZvcmUgdmVyaWZpYXRpb24gc2hvcnQgcHJlYW1ibGUgZnVuY3Rpb25hbGl0eSB3b3JrcyB3ZWxsLgorCS8vIFRvZG86IHJlbW92ZSB0aGUgZm9sbG93aW5nIGxpbmUgaWYgc2hvcnQgcHJlYW1ibGUgZnVuY3Rpb25hbGl0eSB3b3JrcworCS8vCisJLy9UeFByZWFtYmxlID0gUnQ4MDJfMTFQcmVhbWJsZUxvbmc7CisKKwlSVE1QX0lPX1JFQUQzMihwQWQsIEFVVE9fUlNQX0NGRywgJmNzcjQud29yZCk7CisJaWYgKFR4UHJlYW1ibGUgPT0gUnQ4MDJfMTFQcmVhbWJsZUxvbmcpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNbG1lU2V0VHhQcmVhbWJsZSAoPSBMT05HIFBSRUFNQkxFKVxuIikpOworCQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19TSE9SVF9QUkVBTUJMRV9JTlVTRUQpOworCQljc3I0LmZpZWxkLkF1dG9SZXNwb25kZXJQcmVhbWJsZSA9IDA7CisJfQorCWVsc2UKKwl7CisJCS8vIE5PVEU6IDFNYnBzIHNob3VsZCBhbHdheXMgdXNlIGxvbmcgcHJlYW1ibGUKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTWxtZVNldFR4UHJlYW1ibGUgKD0gU0hPUlQgUFJFQU1CTEUpXG4iKSk7CisJCU9QU1RBVFVTX1NFVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19TSE9SVF9QUkVBTUJMRV9JTlVTRUQpOworCQljc3I0LmZpZWxkLkF1dG9SZXNwb25kZXJQcmVhbWJsZSA9IDE7CisJfQorCisJUlRNUF9JT19XUklURTMyKHBBZCwgQVVUT19SU1BfQ0ZHLCBjc3I0LndvcmQpOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFVwZGF0ZSBiYXNpYyByYXRlIGJpdG1hcAorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworVk9JRCBVcGRhdGVCYXNpY1JhdGVCaXRtYXAoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlcikKK3sKKyAgICBJTlQgIGksIGo7CisgICAgICAgICAgICAgICAgICAvKiAxICAyICA1LjUsIDExLCAgNiwgIDksIDEyLCAxOCwgMjQsIDM2LCA0OCwgIDU0ICovCisgICAgVUNIQVIgcmF0ZVtdID0geyAyLCA0LCAgMTEsIDIyLCAxMiwgMTgsIDI0LCAzNiwgNDgsIDcyLCA5NiwgMTA4IH07CisgICAgVUNIQVIgKnN1cF9wID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5TdXBSYXRlOworICAgIFVDSEFSICpleHRfcCA9IHBBZGFwdGVyLT5Db21tb25DZmcuRXh0UmF0ZTsKKyAgICBVTE9ORyBiaXRtYXAgPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLkJhc2ljUmF0ZUJpdG1hcDsKKworCisgICAgLyogaWYgQSBtb2RlLCBhbHdheXMgdXNlIGZpeCBCYXNpY1JhdGVCaXRNYXAgKi8KKyAgICAvL2lmIChwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWwgPT0gUEhZXzExQSkKKwlpZiAocEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsID4gMTQpCisgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuQmFzaWNSYXRlQml0bWFwID0gMHgxNTA7IC8qIDYsIDEyLCAyNE0gKi8KKyAgICAvKiBFbmQgb2YgaWYgKi8KKworICAgIGlmIChwQWRhcHRlci0+Q29tbW9uQ2ZnLkJhc2ljUmF0ZUJpdG1hcCA+IDQwOTUpCisgICAgeworICAgICAgICAvKiAoMiBeIE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTKSAtMSAqLworICAgICAgICByZXR1cm47CisgICAgfSAvKiBFbmQgb2YgaWYgKi8KKworICAgIGZvcihpPTA7IGk8TUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVM7IGkrKykKKyAgICB7CisgICAgICAgIHN1cF9wW2ldICY9IDB4N2Y7CisgICAgICAgIGV4dF9wW2ldICY9IDB4N2Y7CisgICAgfSAvKiBFbmQgb2YgZm9yICovCisKKyAgICBmb3IoaT0wOyBpPE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTOyBpKyspCisgICAgeworICAgICAgICBpZiAoYml0bWFwICYgKDEgPDwgaSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvcihqPTA7IGo8TUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVM7IGorKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoc3VwX3Bbal0gPT0gcmF0ZVtpXSkKKyAgICAgICAgICAgICAgICAgICAgc3VwX3Bbal0gfD0gMHg4MDsKKyAgICAgICAgICAgICAgICAvKiBFbmQgb2YgaWYgKi8KKyAgICAgICAgICAgIH0gLyogRW5kIG9mIGZvciAqLworCisgICAgICAgICAgICBmb3Ioaj0wOyBqPE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTOyBqKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGV4dF9wW2pdID09IHJhdGVbaV0pCisgICAgICAgICAgICAgICAgICAgIGV4dF9wW2pdIHw9IDB4ODA7CisgICAgICAgICAgICAgICAgLyogRW5kIG9mIGlmICovCisgICAgICAgICAgICB9IC8qIEVuZCBvZiBmb3IgKi8KKyAgICAgICAgfSAvKiBFbmQgb2YgaWYgKi8KKyAgICB9IC8qIEVuZCBvZiBmb3IgKi8KK30gLyogRW5kIG9mIFVwZGF0ZUJhc2ljUmF0ZUJpdG1hcCAqLworCisvLyBJUlFMID0gUEFTU0lWRV9MRVZFTAorLy8gSVJRTCA9IERJU1BBVENIX0xFVkVMCisvLyBiTGlua1VwIGlzIHRvIGlkZW50aWZ5IHRoZSBpbml0YWwgbGluayBzcGVlZC4KKy8vIFRSVUUgaW5kaWNhdGVzIHRoZSByYXRlIHVwZGF0ZSBhdCBsaW5rdXAsIHdlIHNob3VsZCBub3QgdHJ5IHRvIHNldCB0aGUgcmF0ZSBhdCA1NE1icHMuCitWT0lEIE1sbWVVcGRhdGVUeFJhdGVzKAorCUlOIFBSVE1QX0FEQVBURVIgCQlwQWQsCisJSU4gCUJPT0xFQU4JCSAJCWJMaW5rVXAsCisJSU4JVUNIQVIJCQkJYXBpZHgpCit7CisJaW50IGksIG51bTsKKwlVQ0hBUiBSYXRlID0gUkFURV82LCBNYXhEZXNpcmUgPSBSQVRFXzEsIE1heFN1cHBvcnQgPSBSQVRFXzE7CisJVUNIQVIgTWluU3VwcG9ydCA9IFJBVEVfNTQ7CisJVUxPTkcgQmFzaWNSYXRlQml0bWFwID0gMDsKKwlVQ0hBUiBDdXJyQmFzaWNSYXRlID0gUkFURV8xOworCVVDSEFSICpwU3VwUmF0ZSwgU3VwUmF0ZUxlbiwgKnBFeHRSYXRlLCBFeHRSYXRlTGVuOworCVBIVFRSQU5TTUlUX1NFVFRJTkcJCXBIdFBoeSA9IE5VTEw7CisJUEhUVFJBTlNNSVRfU0VUVElORwkJcE1heEh0UGh5ID0gTlVMTDsKKwlQSFRUUkFOU01JVF9TRVRUSU5HCQlwTWluSHRQaHkgPSBOVUxMOworCUJPT0xFQU4gCQkJCSphdXRvX3JhdGVfY3VyX3A7CisJVUNIQVIJCQkJCUh0TWNzID0gTUNTX0FVVE87CisKKwkvLyBmaW5kIG1heCBkZXNpcmVkIHJhdGUKKwlVcGRhdGVCYXNpY1JhdGVCaXRtYXAocEFkKTsKKworCW51bSA9IDA7CisJYXV0b19yYXRlX2N1cl9wID0gTlVMTDsKKwlmb3IgKGk9MDsgaTxNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUzsgaSsrKQorCXsKKwkJc3dpdGNoIChwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlW2ldICYgMHg3ZikKKwkJeworCQkJY2FzZSAyOiAgUmF0ZSA9IFJBVEVfMTsgICBudW0rKzsgICBicmVhazsKKwkJCWNhc2UgNDogIFJhdGUgPSBSQVRFXzI7ICAgbnVtKys7ICAgYnJlYWs7CisJCQljYXNlIDExOiBSYXRlID0gUkFURV81XzU7IG51bSsrOyAgIGJyZWFrOworCQkJY2FzZSAyMjogUmF0ZSA9IFJBVEVfMTE7ICBudW0rKzsgICBicmVhazsKKwkJCWNhc2UgMTI6IFJhdGUgPSBSQVRFXzY7ICAgbnVtKys7ICAgYnJlYWs7CisJCQljYXNlIDE4OiBSYXRlID0gUkFURV85OyAgIG51bSsrOyAgIGJyZWFrOworCQkJY2FzZSAyNDogUmF0ZSA9IFJBVEVfMTI7ICBudW0rKzsgICBicmVhazsKKwkJCWNhc2UgMzY6IFJhdGUgPSBSQVRFXzE4OyAgbnVtKys7ICAgYnJlYWs7CisJCQljYXNlIDQ4OiBSYXRlID0gUkFURV8yNDsgIG51bSsrOyAgIGJyZWFrOworCQkJY2FzZSA3MjogUmF0ZSA9IFJBVEVfMzY7ICBudW0rKzsgICBicmVhazsKKwkJCWNhc2UgOTY6IFJhdGUgPSBSQVRFXzQ4OyAgbnVtKys7ICAgYnJlYWs7CisJCQljYXNlIDEwODogUmF0ZSA9IFJBVEVfNTQ7IG51bSsrOyAgIGJyZWFrOworCQkJLy9kZWZhdWx0OiBSYXRlID0gUkFURV8xOyAgIGJyZWFrOworCQl9CisJCWlmIChNYXhEZXNpcmUgPCBSYXRlKSAgTWF4RGVzaXJlID0gUmF0ZTsKKwl9CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwl7CisJCXBIdFBoeSAJCT0gJnBBZC0+U3RhQ2ZnLkhUUGh5TW9kZTsKKwkJcE1heEh0UGh5CT0gJnBBZC0+U3RhQ2ZnLk1heEhUUGh5TW9kZTsKKwkJcE1pbkh0UGh5CT0gJnBBZC0+U3RhQ2ZnLk1pbkhUUGh5TW9kZTsKKworCQlhdXRvX3JhdGVfY3VyX3AgPSAmcEFkLT5TdGFDZmcuYkF1dG9UeFJhdGVTd2l0Y2g7CisJCUh0TWNzIAkJPSBwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUzsKKworCQlpZiAoKHBBZC0+U3RhQ2ZnLkJzc1R5cGUgPT0gQlNTX0FESE9DKSAmJgorCQkJKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQikgJiYKKwkJCShNYXhEZXNpcmUgPiBSQVRFXzExKSkKKwkJeworCQkJTWF4RGVzaXJlID0gUkFURV8xMTsKKwkJfQorCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCXBBZC0+Q29tbW9uQ2ZnLk1heERlc2lyZWRSYXRlID0gTWF4RGVzaXJlOworCXBNaW5IdFBoeS0+d29yZCA9IDA7CisJcE1heEh0UGh5LT53b3JkID0gMDsKKwlwSHRQaHktPndvcmQgPSAwOworCisJLy8gQXV0byByYXRlIHN3aXRjaGluZyBpcyBlbmFibGVkIG9ubHkgaWYgbW9yZSB0aGFuIG9uZSBERVNJUkVEIFJBVEVTIGFyZQorCS8vIHNwZWNpZmllZDsgb3RoZXJ3aXNlIGRpc2FibGVkCisJaWYgKG51bSA8PSAxKQorCXsKKwkJKmF1dG9fcmF0ZV9jdXJfcCA9IEZBTFNFOworCX0KKwllbHNlCisJeworCQkqYXV0b19yYXRlX2N1cl9wID0gVFJVRTsKKwl9CisKKyNpZiAxCisJaWYgKEh0TWNzICE9IE1DU19BVVRPKQorCXsKKwkJKmF1dG9fcmF0ZV9jdXJfcCA9IEZBTFNFOworCX0KKwllbHNlCisJeworCQkqYXV0b19yYXRlX2N1cl9wID0gVFJVRTsKKwl9CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCWlmICgoQURIT0NfT04ocEFkKSB8fCBJTkZSQV9PTihwQWQpKSAmJiAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkpCisJeworCQlwU3VwUmF0ZSA9ICZwQWQtPlN0YUFjdGl2ZS5TdXBSYXRlWzBdOworCQlwRXh0UmF0ZSA9ICZwQWQtPlN0YUFjdGl2ZS5FeHRSYXRlWzBdOworCQlTdXBSYXRlTGVuID0gcEFkLT5TdGFBY3RpdmUuU3VwUmF0ZUxlbjsKKwkJRXh0UmF0ZUxlbiA9IHBBZC0+U3RhQWN0aXZlLkV4dFJhdGVMZW47CisJfQorCWVsc2UKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwl7CisJCXBTdXBSYXRlID0gJnBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVbMF07CisJCXBFeHRSYXRlID0gJnBBZC0+Q29tbW9uQ2ZnLkV4dFJhdGVbMF07CisJCVN1cFJhdGVMZW4gPSBwQWQtPkNvbW1vbkNmZy5TdXBSYXRlTGVuOworCQlFeHRSYXRlTGVuID0gcEFkLT5Db21tb25DZmcuRXh0UmF0ZUxlbjsKKwl9CisKKwkvLyBmaW5kIG1heCBzdXBwb3J0ZWQgcmF0ZQorCWZvciAoaT0wOyBpPFN1cFJhdGVMZW47IGkrKykKKwl7CisJCXN3aXRjaCAocFN1cFJhdGVbaV0gJiAweDdmKQorCQl7CisJCQljYXNlIDI6ICAgUmF0ZSA9IFJBVEVfMTsJaWYgKHBTdXBSYXRlW2ldICYgMHg4MCkgQmFzaWNSYXRlQml0bWFwIHw9IDB4MDAwMTsJIGJyZWFrOworCQkJY2FzZSA0OiAgIFJhdGUgPSBSQVRFXzI7CWlmIChwU3VwUmF0ZVtpXSAmIDB4ODApIEJhc2ljUmF0ZUJpdG1hcCB8PSAweDAwMDI7CSBicmVhazsKKwkJCWNhc2UgMTE6ICBSYXRlID0gUkFURV81XzU7CWlmIChwU3VwUmF0ZVtpXSAmIDB4ODApIEJhc2ljUmF0ZUJpdG1hcCB8PSAweDAwMDQ7CSBicmVhazsKKwkJCWNhc2UgMjI6ICBSYXRlID0gUkFURV8xMTsJaWYgKHBTdXBSYXRlW2ldICYgMHg4MCkgQmFzaWNSYXRlQml0bWFwIHw9IDB4MDAwODsJIGJyZWFrOworCQkJY2FzZSAxMjogIFJhdGUgPSBSQVRFXzY7CS8qaWYgKHBTdXBSYXRlW2ldICYgMHg4MCkqLyAgQmFzaWNSYXRlQml0bWFwIHw9IDB4MDAxMDsgIGJyZWFrOworCQkJY2FzZSAxODogIFJhdGUgPSBSQVRFXzk7CWlmIChwU3VwUmF0ZVtpXSAmIDB4ODApIEJhc2ljUmF0ZUJpdG1hcCB8PSAweDAwMjA7CSBicmVhazsKKwkJCWNhc2UgMjQ6ICBSYXRlID0gUkFURV8xMjsJLyppZiAocFN1cFJhdGVbaV0gJiAweDgwKSovICBCYXNpY1JhdGVCaXRtYXAgfD0gMHgwMDQwOyAgYnJlYWs7CisJCQljYXNlIDM2OiAgUmF0ZSA9IFJBVEVfMTg7CWlmIChwU3VwUmF0ZVtpXSAmIDB4ODApIEJhc2ljUmF0ZUJpdG1hcCB8PSAweDAwODA7CSBicmVhazsKKwkJCWNhc2UgNDg6ICBSYXRlID0gUkFURV8yNDsJLyppZiAocFN1cFJhdGVbaV0gJiAweDgwKSovICBCYXNpY1JhdGVCaXRtYXAgfD0gMHgwMTAwOyAgYnJlYWs7CisJCQljYXNlIDcyOiAgUmF0ZSA9IFJBVEVfMzY7CWlmIChwU3VwUmF0ZVtpXSAmIDB4ODApIEJhc2ljUmF0ZUJpdG1hcCB8PSAweDAyMDA7CSBicmVhazsKKwkJCWNhc2UgOTY6ICBSYXRlID0gUkFURV80ODsJaWYgKHBTdXBSYXRlW2ldICYgMHg4MCkgQmFzaWNSYXRlQml0bWFwIHw9IDB4MDQwMDsJIGJyZWFrOworCQkJY2FzZSAxMDg6IFJhdGUgPSBSQVRFXzU0OwlpZiAocFN1cFJhdGVbaV0gJiAweDgwKSBCYXNpY1JhdGVCaXRtYXAgfD0gMHgwODAwOwkgYnJlYWs7CisJCQlkZWZhdWx0OiAgUmF0ZSA9IFJBVEVfMTsJYnJlYWs7CisJCX0KKwkJaWYgKE1heFN1cHBvcnQgPCBSYXRlKQlNYXhTdXBwb3J0ID0gUmF0ZTsKKworCQlpZiAoTWluU3VwcG9ydCA+IFJhdGUpIE1pblN1cHBvcnQgPSBSYXRlOworCX0KKworCWZvciAoaT0wOyBpPEV4dFJhdGVMZW47IGkrKykKKwl7CisJCXN3aXRjaCAocEV4dFJhdGVbaV0gJiAweDdmKQorCQl7CisJCQljYXNlIDI6ICAgUmF0ZSA9IFJBVEVfMTsJaWYgKHBFeHRSYXRlW2ldICYgMHg4MCkgQmFzaWNSYXRlQml0bWFwIHw9IDB4MDAwMTsJIGJyZWFrOworCQkJY2FzZSA0OiAgIFJhdGUgPSBSQVRFXzI7CWlmIChwRXh0UmF0ZVtpXSAmIDB4ODApIEJhc2ljUmF0ZUJpdG1hcCB8PSAweDAwMDI7CSBicmVhazsKKwkJCWNhc2UgMTE6ICBSYXRlID0gUkFURV81XzU7CWlmIChwRXh0UmF0ZVtpXSAmIDB4ODApIEJhc2ljUmF0ZUJpdG1hcCB8PSAweDAwMDQ7CSBicmVhazsKKwkJCWNhc2UgMjI6ICBSYXRlID0gUkFURV8xMTsJaWYgKHBFeHRSYXRlW2ldICYgMHg4MCkgQmFzaWNSYXRlQml0bWFwIHw9IDB4MDAwODsJIGJyZWFrOworCQkJY2FzZSAxMjogIFJhdGUgPSBSQVRFXzY7CS8qaWYgKHBFeHRSYXRlW2ldICYgMHg4MCkqLyAgQmFzaWNSYXRlQml0bWFwIHw9IDB4MDAxMDsgIGJyZWFrOworCQkJY2FzZSAxODogIFJhdGUgPSBSQVRFXzk7CWlmIChwRXh0UmF0ZVtpXSAmIDB4ODApIEJhc2ljUmF0ZUJpdG1hcCB8PSAweDAwMjA7CSBicmVhazsKKwkJCWNhc2UgMjQ6ICBSYXRlID0gUkFURV8xMjsJLyppZiAocEV4dFJhdGVbaV0gJiAweDgwKSovICBCYXNpY1JhdGVCaXRtYXAgfD0gMHgwMDQwOyAgYnJlYWs7CisJCQljYXNlIDM2OiAgUmF0ZSA9IFJBVEVfMTg7CWlmIChwRXh0UmF0ZVtpXSAmIDB4ODApIEJhc2ljUmF0ZUJpdG1hcCB8PSAweDAwODA7CSBicmVhazsKKwkJCWNhc2UgNDg6ICBSYXRlID0gUkFURV8yNDsJLyppZiAocEV4dFJhdGVbaV0gJiAweDgwKSovICBCYXNpY1JhdGVCaXRtYXAgfD0gMHgwMTAwOyAgYnJlYWs7CisJCQljYXNlIDcyOiAgUmF0ZSA9IFJBVEVfMzY7CWlmIChwRXh0UmF0ZVtpXSAmIDB4ODApIEJhc2ljUmF0ZUJpdG1hcCB8PSAweDAyMDA7CSBicmVhazsKKwkJCWNhc2UgOTY6ICBSYXRlID0gUkFURV80ODsJaWYgKHBFeHRSYXRlW2ldICYgMHg4MCkgQmFzaWNSYXRlQml0bWFwIHw9IDB4MDQwMDsJIGJyZWFrOworCQkJY2FzZSAxMDg6IFJhdGUgPSBSQVRFXzU0OwlpZiAocEV4dFJhdGVbaV0gJiAweDgwKSBCYXNpY1JhdGVCaXRtYXAgfD0gMHgwODAwOwkgYnJlYWs7CisJCQlkZWZhdWx0OiAgUmF0ZSA9IFJBVEVfMTsJYnJlYWs7CisJCX0KKwkJaWYgKE1heFN1cHBvcnQgPCBSYXRlKQlNYXhTdXBwb3J0ID0gUmF0ZTsKKworCQlpZiAoTWluU3VwcG9ydCA+IFJhdGUpIE1pblN1cHBvcnQgPSBSYXRlOworCX0KKworCVJUTVBfSU9fV1JJVEUzMihwQWQsIExFR0FDWV9CQVNJQ19SQVRFLCBCYXNpY1JhdGVCaXRtYXApOworCisJLy8gY2FsY3VsYXRlIHRoZSBleHB0ZWN0ZWQgQUNLIHJhdGUgZm9yIGVhY2ggVFggcmF0ZS4gVGhpcyBpbmZvIGlzIHVzZWQgdG8gY2FjdWxhdGUKKwkvLyB0aGUgRFVSQVRJT04gZmllbGQgb2Ygb3V0Z29pbmcgdW5paWNhc3QgREFUQS9NR01UIGZyYW1lCisJZm9yIChpPTA7IGk8TUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVM7IGkrKykKKwl7CisJCWlmIChCYXNpY1JhdGVCaXRtYXAgJiAoMHgwMSA8PCBpKSkKKwkJCUN1cnJCYXNpY1JhdGUgPSAoVUNIQVIpaTsKKwkJcEFkLT5Db21tb25DZmcuRXhwZWN0ZWRBQ0tSYXRlW2ldID0gQ3VyckJhc2ljUmF0ZTsKKwl9CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIk1sbWVVcGRhdGVUeFJhdGVzW01heFN1cHBvcnQgPSAlZF0gPSBNYXhEZXNpcmUgJWQgTWJwc1xuIiwgUmF0ZUlkVG9NYnBzW01heFN1cHBvcnRdLCBSYXRlSWRUb01icHNbTWF4RGVzaXJlXSkpOworCS8vIG1heCB0eCByYXRlID0gbWluIHttYXggZGVzaXJlIHJhdGUsIG1heCBzdXBwb3J0ZWQgcmF0ZX0KKwlpZiAoTWF4U3VwcG9ydCA8IE1heERlc2lyZSkKKwkJcEFkLT5Db21tb25DZmcuTWF4VHhSYXRlID0gTWF4U3VwcG9ydDsKKwllbHNlCisJCXBBZC0+Q29tbW9uQ2ZnLk1heFR4UmF0ZSA9IE1heERlc2lyZTsKKworCXBBZC0+Q29tbW9uQ2ZnLk1pblR4UmF0ZSA9IE1pblN1cHBvcnQ7CisJaWYgKCphdXRvX3JhdGVfY3VyX3ApCisJeworCQlzaG9ydCBkYm0gPSAwOworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQkJZGJtID0gcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMCAtIHBBZC0+QmJwUnNzaVRvRGJtRGVsdGE7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJCWlmIChiTGlua1VwID09IFRSVUUpCisJCQlwQWQtPkNvbW1vbkNmZy5UeFJhdGUgPSBSQVRFXzI0OworCQllbHNlCisJCQlwQWQtPkNvbW1vbkNmZy5UeFJhdGUgPSBwQWQtPkNvbW1vbkNmZy5NYXhUeFJhdGU7CisKKwkJaWYgKGRibSA8IC03NSkKKwkJCXBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZSA9IFJBVEVfMTE7CisJCWVsc2UgaWYgKGRibSA8IC03MCkKKwkJCXBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZSA9IFJBVEVfMjQ7CisKKwkJLy8gc2hvdWxkIG5ldmVyIGV4Y2VlZCBNYXhUeFJhdGUgKGNvbnNpZGVyIDExQi1vbmx5IG1vZGUpCisJCWlmIChwQWQtPkNvbW1vbkNmZy5UeFJhdGUgPiBwQWQtPkNvbW1vbkNmZy5NYXhUeFJhdGUpCisJCQlwQWQtPkNvbW1vbkNmZy5UeFJhdGUgPSBwQWQtPkNvbW1vbkNmZy5NYXhUeFJhdGU7CisKKwkJcEFkLT5Db21tb25DZmcuVHhSYXRlSW5kZXggPSAwOworCX0KKwllbHNlCisJeworCQlwQWQtPkNvbW1vbkNmZy5UeFJhdGUgPSBwQWQtPkNvbW1vbkNmZy5NYXhUeFJhdGU7CisJCXBIdFBoeS0+ZmllbGQuTUNTCT0gKHBBZC0+Q29tbW9uQ2ZnLk1heFR4UmF0ZSA+IDMpID8gKHBBZC0+Q29tbW9uQ2ZnLk1heFR4UmF0ZSAtIDQpIDogcEFkLT5Db21tb25DZmcuTWF4VHhSYXRlOworCQlwSHRQaHktPmZpZWxkLk1PREUJPSAocEFkLT5Db21tb25DZmcuTWF4VHhSYXRlID4gMykgPyBNT0RFX09GRE0gOiBNT0RFX0NDSzsKKworCQlwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkhUUGh5TW9kZS5maWVsZC5TVEJDCT0gcEh0UGh5LT5maWVsZC5TVEJDOworCQlwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkhUUGh5TW9kZS5maWVsZC5TaG9ydEdJCT0gcEh0UGh5LT5maWVsZC5TaG9ydEdJOworCQlwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkhUUGh5TW9kZS5maWVsZC5NQ1MJCT0gcEh0UGh5LT5maWVsZC5NQ1M7CisJCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLk1PREUJPSBwSHRQaHktPmZpZWxkLk1PREU7CisJfQorCisJaWYgKHBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZSA8PSBSQVRFXzExKQorCXsKKwkJcE1heEh0UGh5LT5maWVsZC5NT0RFID0gTU9ERV9DQ0s7CisJCXBNYXhIdFBoeS0+ZmllbGQuTUNTID0gcEFkLT5Db21tb25DZmcuVHhSYXRlOworCQlwTWluSHRQaHktPmZpZWxkLk1DUyA9IHBBZC0+Q29tbW9uQ2ZnLk1pblR4UmF0ZTsKKwl9CisJZWxzZQorCXsKKwkJcE1heEh0UGh5LT5maWVsZC5NT0RFID0gTU9ERV9PRkRNOworCQlwTWF4SHRQaHktPmZpZWxkLk1DUyA9IE9mZG1SYXRlVG9SeHdpTUNTW3BBZC0+Q29tbW9uQ2ZnLlR4UmF0ZV07CisJCWlmIChwQWQtPkNvbW1vbkNmZy5NaW5UeFJhdGUgPj0gUkFURV82ICYmIChwQWQtPkNvbW1vbkNmZy5NaW5UeFJhdGUgPD0gUkFURV81NCkpCisJCQl7cE1pbkh0UGh5LT5maWVsZC5NQ1MgPSBPZmRtUmF0ZVRvUnh3aU1DU1twQWQtPkNvbW1vbkNmZy5NaW5UeFJhdGVdO30KKwkJZWxzZQorCQkJe3BNaW5IdFBoeS0+ZmllbGQuTUNTID0gcEFkLT5Db21tb25DZmcuTWluVHhSYXRlO30KKwl9CisKKwlwSHRQaHktPndvcmQgPSAocE1heEh0UGh5LT53b3JkKTsKKwlpZiAoYkxpbmtVcCAmJiAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkpCisJeworCQkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5IVFBoeU1vZGUud29yZCA9IHBIdFBoeS0+d29yZDsKKwkJCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uTWF4SFRQaHlNb2RlLndvcmQgPSBwTWF4SHRQaHktPndvcmQ7CisJCQlwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLk1pbkhUUGh5TW9kZS53b3JkID0gcE1pbkh0UGh5LT53b3JkOworCX0KKwllbHNlCisJeworCQlzd2l0Y2ggKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUpCisJCXsKKwkJCWNhc2UgUEhZXzExQkdfTUlYRUQ6CisJCQljYXNlIFBIWV8xMUI6CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQljYXNlIFBIWV8xMUJHTl9NSVhFRDoKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJCQlwQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZSA9IFJBVEVfMTsKKwkJCQlwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTU9ERSA9IE1PREVfQ0NLOworCQkJCXBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NQ1MgPSBSQVRFXzE7CisJCQkJcEFkLT5Db21tb25DZmcuUnRzUmF0ZSA9IFJBVEVfMTE7CisJCQkJYnJlYWs7CisJCQljYXNlIFBIWV8xMUc6CisJCQljYXNlIFBIWV8xMUE6CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQljYXNlIFBIWV8xMUFHTl9NSVhFRDoKKwkJCWNhc2UgUEhZXzExR05fTUlYRUQ6CisJCQljYXNlIFBIWV8xMU5fMl80RzoKKwkJCWNhc2UgUEhZXzExQU5fTUlYRUQ6CisJCQljYXNlIFBIWV8xMU5fNUc6CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCQkJcEFkLT5Db21tb25DZmcuTWxtZVJhdGUgPSBSQVRFXzY7CisJCQkJcEFkLT5Db21tb25DZmcuUnRzUmF0ZSA9IFJBVEVfNjsKKwkJCQlwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTU9ERSA9IE1PREVfT0ZETTsKKwkJCQlwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTUNTID0gT2ZkbVJhdGVUb1J4d2lNQ1NbcEFkLT5Db21tb25DZmcuTWxtZVJhdGVdOworCQkJCWJyZWFrOworCQkJY2FzZSBQSFlfMTFBQkdfTUlYRUQ6CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQljYXNlIFBIWV8xMUFCR05fTUlYRUQ6CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPD0gMTQpCisJCQkJeworCQkJCQlwQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZSA9IFJBVEVfMTsKKwkJCQkJcEFkLT5Db21tb25DZmcuUnRzUmF0ZSA9IFJBVEVfMTsKKwkJCQkJcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1PREUgPSBNT0RFX0NDSzsKKwkJCQkJcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1DUyA9IFJBVEVfMTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJcEFkLT5Db21tb25DZmcuTWxtZVJhdGUgPSBSQVRFXzY7CisJCQkJCXBBZC0+Q29tbW9uQ2ZnLlJ0c1JhdGUgPSBSQVRFXzY7CisJCQkJCXBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NT0RFID0gTU9ERV9PRkRNOworCQkJCQlwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTUNTID0gT2ZkbVJhdGVUb1J4d2lNQ1NbcEFkLT5Db21tb25DZmcuTWxtZVJhdGVdOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6IC8vIGVycm9yCisJCQkJcEFkLT5Db21tb25DZmcuTWxtZVJhdGUgPSBSQVRFXzY7CisgICAgICAgICAgICAgICAgICAgICAgICAJcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1PREUgPSBNT0RFX09GRE07CisJCQkJcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1DUyA9IE9mZG1SYXRlVG9SeHdpTUNTW3BBZC0+Q29tbW9uQ2ZnLk1sbWVSYXRlXTsKKwkJCQlwQWQtPkNvbW1vbkNmZy5SdHNSYXRlID0gUkFURV8xOworCQkJCWJyZWFrOworCQl9CisJCS8vCisJCS8vIEtlZXAgQmFzaWMgTWxtZSBSYXRlLgorCQkvLworCQlwQWQtPk1hY1RhYi5Db250ZW50W01DQVNUX1dDSURdLkhUUGh5TW9kZS53b3JkID0gcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LndvcmQ7CisJCWlmIChwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTU9ERSA9PSBNT0RFX09GRE0pCisJCQlwQWQtPk1hY1RhYi5Db250ZW50W01DQVNUX1dDSURdLkhUUGh5TW9kZS5maWVsZC5NQ1MgPSBPZmRtUmF0ZVRvUnh3aU1DU1tSQVRFXzI0XTsKKwkJZWxzZQorCQkJcEFkLT5NYWNUYWIuQ29udGVudFtNQ0FTVF9XQ0lEXS5IVFBoeU1vZGUuZmllbGQuTUNTID0gUkFURV8xOworCQlwQWQtPkNvbW1vbkNmZy5CYXNpY01sbWVSYXRlID0gcEFkLT5Db21tb25DZmcuTWxtZVJhdGU7CisJfQorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiIE1sbWVVcGRhdGVUeFJhdGVzIChNYXhEZXNpcmU9JWQsIE1heFN1cHBvcnQ9JWQsIE1heFR4UmF0ZT0lZCwgTWluUmF0ZT0lZCwgUmF0ZSBTd2l0Y2hpbmcgPSVkKVxuIiwKKwkJCSBSYXRlSWRUb01icHNbTWF4RGVzaXJlXSwgUmF0ZUlkVG9NYnBzW01heFN1cHBvcnRdLCBSYXRlSWRUb01icHNbcEFkLT5Db21tb25DZmcuTWF4VHhSYXRlXSwgUmF0ZUlkVG9NYnBzW3BBZC0+Q29tbW9uQ2ZnLk1pblR4UmF0ZV0sCisJCQkgLypPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1RYX1JBVEVfU1dJVENIX0VOQUJMRUQpKi8qYXV0b19yYXRlX2N1cl9wKSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiIE1sbWVVcGRhdGVUeFJhdGVzIChUeFJhdGU9JWQsIFJ0c1JhdGU9JWQsIEJhc2ljUmF0ZUJpdG1hcD0weCUwNGx4KVxuIiwKKwkJCSBSYXRlSWRUb01icHNbcEFkLT5Db21tb25DZmcuVHhSYXRlXSwgUmF0ZUlkVG9NYnBzW3BBZC0+Q29tbW9uQ2ZnLlJ0c1JhdGVdLCBCYXNpY1JhdGVCaXRtYXApKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNbG1lVXBkYXRlVHhSYXRlcyAoTWxtZVRyYW5zbWl0PTB4JXgsIE1pbkhUUGh5TW9kZT0leCwgTWF4SFRQaHlNb2RlPTB4JXgsIEhUUGh5TW9kZT0weCV4KVxuIiwKKwkJCSBwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQud29yZCwgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5NaW5IVFBoeU1vZGUud29yZCAscEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5NYXhIVFBoeU1vZGUud29yZCAscEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5IVFBoeU1vZGUud29yZCApKTsKK30KKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlUaGlzIGZ1bmN0aW9uIHVwZGF0ZSBIVCBSYXRlIHNldHRpbmcuCisJCUlucHV0IFdjaWQgdmFsdWUgaXMgdmFsaWQgZm9yIDIgY2FzZSA6CisJCTEuIGl0J3MgdXNlZCBmb3IgU3RhdGlvbiBpbiBpbmZyYSBtb2RlIHRoYXQgY29weSBBUCByYXRlIHRvIE1hY3RhYmxlLgorCQkyLiBPUiBTdGF0aW9uIAlpbiBhZGhvYyBtb2RlIHRvIGNvcHkgcGVlcidzIEhUIHJhdGUgdG8gTWFjdGFibGUuCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgTWxtZVVwZGF0ZUh0VHhSYXRlcygKKwlJTiBQUlRNUF9BREFQVEVSIAkJcEFkLAorCUlOCVVDSEFSCQkJCWFwaWR4KQoreworCVVDSEFSCVN0YmNNY3M7IC8vaiwgU3RiY01jcywgYml0bWFzazsKKwlDSEFSIAlpOyAvLyAzKjMKKwlSVF9IVF9DQVBBQklMSVRZIAkqcFJ0SHRDYXAgPSBOVUxMOworCVJUX0hUX1BIWV9JTkZPCQkqcEFjdGl2ZUh0UGh5ID0gTlVMTDsKKwlVTE9ORwkJQmFzaWNNQ1M7CisJVUNIQVIgaiwgYml0bWFzazsKKwlQUlRfSFRfUEhZX0lORk8JCQlwRGVzaXJlSHRQaHkgPSBOVUxMOworCVBIVFRSQU5TTUlUX1NFVFRJTkcJCXBIdFBoeSA9IE5VTEw7CisJUEhUVFJBTlNNSVRfU0VUVElORwkJcE1heEh0UGh5ID0gTlVMTDsKKwlQSFRUUkFOU01JVF9TRVRUSU5HCQlwTWluSHRQaHkgPSBOVUxMOworCUJPT0xFQU4gCQkJCSphdXRvX3JhdGVfY3VyX3A7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIk1sbWVVcGRhdGVIdFR4UmF0ZXM9PT0+IFxuIikpOworCisJYXV0b19yYXRlX2N1cl9wID0gTlVMTDsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJeworCQlwRGVzaXJlSHRQaHkJPSAmcEFkLT5TdGFDZmcuRGVzaXJlZEh0UGh5SW5mbzsKKwkJcEFjdGl2ZUh0UGh5CT0gJnBBZC0+U3RhQ2ZnLkRlc2lyZWRIdFBoeUluZm87CisJCXBIdFBoeSAJCT0gJnBBZC0+U3RhQ2ZnLkhUUGh5TW9kZTsKKwkJcE1heEh0UGh5CT0gJnBBZC0+U3RhQ2ZnLk1heEhUUGh5TW9kZTsKKwkJcE1pbkh0UGh5CT0gJnBBZC0+U3RhQ2ZnLk1pbkhUUGh5TW9kZTsKKworCQlhdXRvX3JhdGVfY3VyX3AgPSAmcEFkLT5TdGFDZmcuYkF1dG9UeFJhdGVTd2l0Y2g7CisJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJaWYgKChBREhPQ19PTihwQWQpIHx8IElORlJBX09OKHBBZCkpICYmIChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKSkKKwl7CisJCWlmIChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLmJIdEVuYWJsZSA9PSBGQUxTRSkKKwkJCXJldHVybjsKKworCQlwUnRIdENhcCA9ICZwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRIdFBoeTsKKwkJcEFjdGl2ZUh0UGh5ID0gJnBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm87CisJCVN0YmNNY3MgPSAoVUNIQVIpcEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8zLlN0YmNNY3M7CisJCUJhc2ljTUNTID1wQWQtPk1sbWVBdXguQWRkSHRJbmZvLk1DU1NldFswXSsocEFkLT5NbG1lQXV4LkFkZEh0SW5mby5NQ1NTZXRbMV08PDgpKyhTdGJjTWNzPDwxNik7CisJCWlmICgocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LlR4U1RCQykgJiYgKHBSdEh0Q2FwLT5SeFNUQkMpICYmIChwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoID09IDIpKQorCQkJcE1heEh0UGh5LT5maWVsZC5TVEJDID0gU1RCQ19VU0U7CisJCWVsc2UKKwkJCXBNYXhIdFBoeS0+ZmllbGQuU1RCQyA9IFNUQkNfTk9ORTsKKwl9CisJZWxzZQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCXsKKwkJaWYgKHBEZXNpcmVIdFBoeS0+Ykh0RW5hYmxlID09IEZBTFNFKQorCQkJcmV0dXJuOworCisJCXBSdEh0Q2FwID0gJnBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeTsKKwkJU3RiY01jcyA9IChVQ0hBUilwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8uQWRkSHRJbmZvMy5TdGJjTWNzOworCQlCYXNpY01DUyA9IHBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mby5NQ1NTZXRbMF0rKHBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mby5NQ1NTZXRbMV08PDgpKyhTdGJjTWNzPDwxNik7CisJCWlmICgocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LlR4U1RCQykgJiYgKHBSdEh0Q2FwLT5SeFNUQkMpICYmIChwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoID09IDIpKQorCQkJcE1heEh0UGh5LT5maWVsZC5TVEJDID0gU1RCQ19VU0U7CisJCWVsc2UKKwkJCXBNYXhIdFBoeS0+ZmllbGQuU1RCQyA9IFNUQkNfTk9ORTsKKwl9CisKKwkvLyBEZWNpZGUgTUFYIGh0IHJhdGUuCisJaWYgKChwUnRIdENhcC0+R0YpICYmIChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuR0YpKQorCQlwTWF4SHRQaHktPmZpZWxkLk1PREUgPSBNT0RFX0hUR1JFRU5GSUVMRDsKKwllbHNlCisJCXBNYXhIdFBoeS0+ZmllbGQuTU9ERSA9IE1PREVfSFRNSVg7CisKKyAgICBpZiAoKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5DaGFubmVsV2lkdGgpICYmIChwUnRIdENhcC0+Q2hhbm5lbFdpZHRoKSkKKwkJcE1heEh0UGh5LT5maWVsZC5CVyA9IEJXXzQwOworCWVsc2UKKwkJcE1heEh0UGh5LT5maWVsZC5CVyA9IEJXXzIwOworCisgICAgaWYgKHBNYXhIdFBoeS0+ZmllbGQuQlcgPT0gQldfMjApCisJCXBNYXhIdFBoeS0+ZmllbGQuU2hvcnRHSSA9IChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuU2hvcnRHSWZvcjIwICYgcFJ0SHRDYXAtPlNob3J0R0lmb3IyMCk7CisJZWxzZQorCQlwTWF4SHRQaHktPmZpZWxkLlNob3J0R0kgPSAocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LlNob3J0R0lmb3I0MCAmIHBSdEh0Q2FwLT5TaG9ydEdJZm9yNDApOworCisJZm9yIChpPTIzOyBpPj0wOyBpLS0pIC8vIDMqMworCXsKKwkJaiA9IGkvODsKKwkJYml0bWFzayA9ICgxPDwoaS0oaio4KSkpOworCisJCWlmICgocEFjdGl2ZUh0UGh5LT5NQ1NTZXRbal0gJiBiaXRtYXNrKSAmJiAocERlc2lyZUh0UGh5LT5NQ1NTZXRbal0gJiBiaXRtYXNrKSkKKwkJeworCQkJcE1heEh0UGh5LT5maWVsZC5NQ1MgPSBpOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoaT09MCkKKwkJCWJyZWFrOworCX0KKworCS8vIENvcHkgTUlOIGh0IHJhdGUuICBydDI4NjA/Pz8KKwlwTWluSHRQaHktPmZpZWxkLkJXID0gQldfMjA7CisJcE1pbkh0UGh5LT5maWVsZC5NQ1MgPSAwOworCXBNaW5IdFBoeS0+ZmllbGQuU1RCQyA9IDA7CisJcE1pbkh0UGh5LT5maWVsZC5TaG9ydEdJID0gMDsKKwkvL0lmIFNUQSBhc3NpZ25zIGZpeGVkIHJhdGUuIHVwZGF0ZSB0byBmaXhlZCBoZXJlLgorI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCWlmICggKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpICYmIChwRGVzaXJlSHRQaHktPk1DU1NldFswXSAhPSAweGZmKSkKKwl7CisJCWlmIChwRGVzaXJlSHRQaHktPk1DU1NldFs0XSAhPSAwKQorCQl7CisJCQlwTWF4SHRQaHktPmZpZWxkLk1DUyA9IDMyOworCQkJcE1pbkh0UGh5LT5maWVsZC5NQ1MgPSAzMjsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiTWxtZVVwZGF0ZUh0VHhSYXRlczw9PT0gVXNlIEZpeGVkIE1DUyA9ICVkXG4iLHBNaW5IdFBoeS0+ZmllbGQuTUNTKSk7CisJCX0KKworCQlmb3IgKGk9MjM7IChDSEFSKWkgPj0gMDsgaS0tKSAvLyAzKjMKKwkJeworCQkJaiA9IGkvODsKKwkJCWJpdG1hc2sgPSAoMTw8KGktKGoqOCkpKTsKKwkJCWlmICggKHBEZXNpcmVIdFBoeS0+TUNTU2V0W2pdICYgYml0bWFzaykgJiYgKHBBY3RpdmVIdFBoeS0+TUNTU2V0W2pdICYgYml0bWFzaykpCisJCQl7CisJCQkJcE1heEh0UGh5LT5maWVsZC5NQ1MgPSBpOworCQkJCXBNaW5IdFBoeS0+ZmllbGQuTUNTID0gaTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChpPT0wKQorCQkJCWJyZWFrOworCQl9CisJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisKKwkvLyBEZWNpZGUgaHQgcmF0ZQorCXBIdFBoeS0+ZmllbGQuU1RCQyA9IHBNYXhIdFBoeS0+ZmllbGQuU1RCQzsKKwlwSHRQaHktPmZpZWxkLkJXID0gcE1heEh0UGh5LT5maWVsZC5CVzsKKwlwSHRQaHktPmZpZWxkLk1PREUgPSBwTWF4SHRQaHktPmZpZWxkLk1PREU7CisJcEh0UGh5LT5maWVsZC5NQ1MgPSBwTWF4SHRQaHktPmZpZWxkLk1DUzsKKwlwSHRQaHktPmZpZWxkLlNob3J0R0kgPSBwTWF4SHRQaHktPmZpZWxkLlNob3J0R0k7CisKKwkvLyB1c2UgZGVmYXVsdCBub3cuIHJ0Mjg2MAorCWlmIChwRGVzaXJlSHRQaHktPk1DU1NldFswXSAhPSAweGZmKQorCQkqYXV0b19yYXRlX2N1cl9wID0gRkFMU0U7CisJZWxzZQorCQkqYXV0b19yYXRlX2N1cl9wID0gVFJVRTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiBNbG1lVXBkYXRlSHRUeFJhdGVzPC0tLS5BTXNkdVNpemUgPSAlZCAgXG4iLCBwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQW1zZHVTaXplICkpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiVFg6IE1DU1swXSA9ICV4IChjaG9vc2UgJWQpLCBCVyA9ICVkLCBTaG9ydEdJID0gJWQsIE1PREUgPSAlZCwgIFxuIiwgcEFjdGl2ZUh0UGh5LT5NQ1NTZXRbMF0scEh0UGh5LT5maWVsZC5NQ1MsCisJCXBIdFBoeS0+ZmllbGQuQlcsIHBIdFBoeS0+ZmllbGQuU2hvcnRHSSwgcEh0UGh5LT5maWVsZC5NT0RFKSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJNbG1lVXBkYXRlSHRUeFJhdGVzPD09PSBcbiIpKTsKK30KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworLy8gSVJRTCA9IERJU1BBVENIX0xFVkVMCitWT0lEIE1sbWVSYWRpb09mZigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlSVDI4WFhfTUxNRV9SQURJT19PRkYocEFkKTsKK30KKworLy8gSVJRTCA9IERJU1BBVENIX0xFVkVMCitWT0lEIE1sbWVSYWRpb09uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCVJUMjhYWF9NTE1FX1JBRElPX09OKHBBZCk7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIGJzc190YWJsZS5jCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKworLyohIFxicmllZiBpbml0aWFsaXplIEJTUyB0YWJsZQorICoJXHBhcmFtIHBfdGFiIHBvaW50ZXIgdG8gdGhlIHRhYmxlCisgKglccmV0dXJuIG5vbmUKKyAqCVxwcmUKKyAqCVxwb3N0CisKKyBJUlFMID0gUEFTU0lWRV9MRVZFTAorIElSUUwgPSBESVNQQVRDSF9MRVZFTAorCisgKi8KK1ZPSUQgQnNzVGFibGVJbml0KAorCUlOIEJTU19UQUJMRSAqVGFiKQoreworCWludCBpOworCisJVGFiLT5Cc3NOciA9IDA7CisgICAgVGFiLT5Cc3NPdmVybGFwTnIgPSAwOworCWZvciAoaSA9IDA7IGkgPCBNQVhfTEVOX09GX0JTU19UQUJMRTsgaSsrKQorCXsKKwkJTmRpc1plcm9NZW1vcnkoJlRhYi0+QnNzRW50cnlbaV0sIHNpemVvZihCU1NfRU5UUlkpKTsKKwkJVGFiLT5Cc3NFbnRyeVtpXS5Sc3NpID0gLTEyNzsJLy8gaW5pdGlhbCB0aGUgcnNzaSBhcyBhIG1pbmltdW0gdmFsdWUKKwl9Cit9CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKK1ZPSUQgQkFUYWJsZUluaXQoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gQkFfVEFCTEUgKlRhYikKK3sKKwlpbnQgaTsKKworCVRhYi0+bnVtQXNPcmlnaW5hdG9yID0gMDsKKwlUYWItPm51bUFzUmVjaXBpZW50ID0gMDsKKwlOZGlzQWxsb2NhdGVTcGluTG9jaygmcEFkLT5CQVRhYkxvY2spOworCWZvciAoaSA9IDA7IGkgPCBNQVhfTEVOX09GX0JBX1JFQ19UQUJMRTsgaSsrKQorCXsKKwkJVGFiLT5CQVJlY0VudHJ5W2ldLlJFQ19CQV9TdGF0dXMgPSBSZWNpcGllbnRfTk9ORTsKKwkJTmRpc0FsbG9jYXRlU3BpbkxvY2soJihUYWItPkJBUmVjRW50cnlbaV0uUnhSZVJpbmdMb2NrKSk7CisJfQorCWZvciAoaSA9IDA7IGkgPCBNQVhfTEVOX09GX0JBX09SSV9UQUJMRTsgaSsrKQorCXsKKwkJVGFiLT5CQU9yaUVudHJ5W2ldLk9SSV9CQV9TdGF0dXMgPSBPcmlnaW5hdG9yX05PTkU7CisJfQorfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisvKiEgXGJyaWVmIHNlYXJjaCB0aGUgQlNTIHRhYmxlIGJ5IFNTSUQKKyAqCVxwYXJhbSBwX3RhYiBwb2ludGVyIHRvIHRoZSBic3MgdGFibGUKKyAqCVxwYXJhbSBzc2lkIFNTSUQgc3RyaW5nCisgKglccmV0dXJuIGluZGV4IG9mIHRoZSB0YWJsZSwgQlNTX05PVF9GT1VORCBpZiBub3QgaW4gdGhlIHRhYmxlCisgKglccHJlCisgKglccG9zdAorICoJXG5vdGUgc2VhcmNoIGJ5IHNlcXVlbnRpYWwgc2VhcmNoCisKKyBJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworICovCitVTE9ORyBCc3NUYWJsZVNlYXJjaCgKKwlJTiBCU1NfVEFCTEUgKlRhYiwKKwlJTiBQVUNIQVIJIHBCc3NpZCwKKwlJTiBVQ0hBUgkgQ2hhbm5lbCkKK3sKKwlVQ0hBUiBpOworCisJZm9yIChpID0gMDsgaSA8IFRhYi0+QnNzTnI7IGkrKykKKwl7CisJCS8vCisJCS8vIFNvbWUgQVAgdGhhdCBzdXBwb3J0IEEvQi9HIG1vZGUgdGhhdCBtYXkgdXNlZCB0aGUgc2FtZSBCU1NJRCBvbiAxMUEgYW5kIDExQi9HLgorCQkvLyBXZSBzaG91bGQgZGlzdGluZ3Vpc2ggdGhpcyBjYXNlLgorCQkvLworCQlpZiAoKCgoVGFiLT5Cc3NFbnRyeVtpXS5DaGFubmVsIDw9IDE0KSAmJiAoQ2hhbm5lbCA8PSAxNCkpIHx8CisJCQkgKChUYWItPkJzc0VudHJ5W2ldLkNoYW5uZWwgPiAxNCkgJiYgKENoYW5uZWwgPiAxNCkpKSAmJgorCQkJTUFDX0FERFJfRVFVQUwoVGFiLT5Cc3NFbnRyeVtpXS5Cc3NpZCwgcEJzc2lkKSkKKwkJeworCQkJcmV0dXJuIGk7CisJCX0KKwl9CisJcmV0dXJuIChVTE9ORylCU1NfTk9UX0ZPVU5EOworfQorCitVTE9ORyBCc3NTc2lkVGFibGVTZWFyY2goCisJSU4gQlNTX1RBQkxFICpUYWIsCisJSU4gUFVDSEFSCSBwQnNzaWQsCisJSU4gUFVDSEFSCSBwU3NpZCwKKwlJTiBVQ0hBUgkgU3NpZExlbiwKKwlJTiBVQ0hBUgkgQ2hhbm5lbCkKK3sKKwlVQ0hBUiBpOworCisJZm9yIChpID0gMDsgaSA8IFRhYi0+QnNzTnI7IGkrKykKKwl7CisJCS8vCisJCS8vIFNvbWUgQVAgdGhhdCBzdXBwb3J0IEEvQi9HIG1vZGUgdGhhdCBtYXkgdXNlZCB0aGUgc2FtZSBCU1NJRCBvbiAxMUEgYW5kIDExQi9HLgorCQkvLyBXZSBzaG91bGQgZGlzdGluZ3Vpc2ggdGhpcyBjYXNlLgorCQkvLworCQlpZiAoKCgoVGFiLT5Cc3NFbnRyeVtpXS5DaGFubmVsIDw9IDE0KSAmJiAoQ2hhbm5lbCA8PSAxNCkpIHx8CisJCQkgKChUYWItPkJzc0VudHJ5W2ldLkNoYW5uZWwgPiAxNCkgJiYgKENoYW5uZWwgPiAxNCkpKSAmJgorCQkJTUFDX0FERFJfRVFVQUwoVGFiLT5Cc3NFbnRyeVtpXS5Cc3NpZCwgcEJzc2lkKSAmJgorCQkJU1NJRF9FUVVBTChwU3NpZCwgU3NpZExlbiwgVGFiLT5Cc3NFbnRyeVtpXS5Tc2lkLCBUYWItPkJzc0VudHJ5W2ldLlNzaWRMZW4pKQorCQl7CisJCQlyZXR1cm4gaTsKKwkJfQorCX0KKwlyZXR1cm4gKFVMT05HKUJTU19OT1RfRk9VTkQ7Cit9CisKK1VMT05HIEJzc1RhYmxlU2VhcmNoV2l0aFNTSUQoCisJSU4gQlNTX1RBQkxFICpUYWIsCisJSU4gUFVDSEFSCSBCc3NpZCwKKwlJTiBQVUNIQVIJIHBTc2lkLAorCUlOIFVDSEFSCSBTc2lkTGVuLAorCUlOIFVDSEFSCSBDaGFubmVsKQoreworCVVDSEFSIGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgVGFiLT5Cc3NOcjsgaSsrKQorCXsKKwkJaWYgKCgoKFRhYi0+QnNzRW50cnlbaV0uQ2hhbm5lbCA8PSAxNCkgJiYgKENoYW5uZWwgPD0gMTQpKSB8fAorCQkJKChUYWItPkJzc0VudHJ5W2ldLkNoYW5uZWwgPiAxNCkgJiYgKENoYW5uZWwgPiAxNCkpKSAmJgorCQkJTUFDX0FERFJfRVFVQUwoJihUYWItPkJzc0VudHJ5W2ldLkJzc2lkKSwgQnNzaWQpICYmCisJCQkoU1NJRF9FUVVBTChwU3NpZCwgU3NpZExlbiwgVGFiLT5Cc3NFbnRyeVtpXS5Tc2lkLCBUYWItPkJzc0VudHJ5W2ldLlNzaWRMZW4pIHx8CisJCQkoTmRpc0VxdWFsTWVtb3J5KHBTc2lkLCBaZXJvU3NpZCwgU3NpZExlbikpIHx8CisJCQkoTmRpc0VxdWFsTWVtb3J5KFRhYi0+QnNzRW50cnlbaV0uU3NpZCwgWmVyb1NzaWQsIFRhYi0+QnNzRW50cnlbaV0uU3NpZExlbikpKSkKKwkJeworCQkJcmV0dXJuIGk7CisJCX0KKwl9CisJcmV0dXJuIChVTE9ORylCU1NfTk9UX0ZPVU5EOworfQorCisvLyBJUlFMID0gRElTUEFUQ0hfTEVWRUwKK1ZPSUQgQnNzVGFibGVEZWxldGVFbnRyeSgKKwlJTiBPVVQJQlNTX1RBQkxFICpUYWIsCisJSU4JCVBVQ0hBUgkgIHBCc3NpZCwKKwlJTgkJVUNIQVIJICBDaGFubmVsKQoreworCVVDSEFSIGksIGo7CisKKwlmb3IgKGkgPSAwOyBpIDwgVGFiLT5Cc3NOcjsgaSsrKQorCXsKKwkJaWYgKChUYWItPkJzc0VudHJ5W2ldLkNoYW5uZWwgPT0gQ2hhbm5lbCkgJiYKKwkJCShNQUNfQUREUl9FUVVBTChUYWItPkJzc0VudHJ5W2ldLkJzc2lkLCBwQnNzaWQpKSkKKwkJeworCQkJZm9yIChqID0gaTsgaiA8IFRhYi0+QnNzTnIgLSAxOyBqKyspCisJCQl7CisJCQkJTmRpc01vdmVNZW1vcnkoJihUYWItPkJzc0VudHJ5W2pdKSwgJihUYWItPkJzc0VudHJ5W2ogKyAxXSksIHNpemVvZihCU1NfRU5UUlkpKTsKKwkJCX0KKwkJCU5kaXNaZXJvTWVtb3J5KCYoVGFiLT5Cc3NFbnRyeVtUYWItPkJzc05yIC0gMV0pLCBzaXplb2YoQlNTX0VOVFJZKSk7CisJCQlUYWItPkJzc05yIC09IDE7CisJCQlyZXR1cm47CisJCX0KKwl9Cit9CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJRGVsZXRlIHRoZSBPcmlnaW5hdG9yIEVudHJ5IGluIEJBdGFibGUuIE9yIGRlY3JlYXNlIG51bUFzIE9yaWdpbmF0b3IgYnkgMSBpZiBuZWVkZWQuCisKKwlBcmd1bWVudHM6CisJLy8gSVJRTCA9IERJU1BBVENIX0xFVkVMCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBCQVRhYmxlRGVsZXRlT1JJRW50cnkoCisJSU4gT1VUCVBSVE1QX0FEQVBURVIgcEFkLAorCUlOCQlCQV9PUklfRU5UUlkJKnBCQU9SSUVudHJ5KQoreworCisJaWYgKHBCQU9SSUVudHJ5LT5PUklfQkFfU3RhdHVzICE9IE9yaWdpbmF0b3JfTk9ORSkKKwl7CisJCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+QkFUYWJMb2NrKTsKKwkJaWYgKHBCQU9SSUVudHJ5LT5PUklfQkFfU3RhdHVzID09IE9yaWdpbmF0b3JfRG9uZSkKKwkJeworCQkJcEFkLT5CQVRhYmxlLm51bUFzT3JpZ2luYXRvciAtPSAxOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQkFUYWJsZURlbGV0ZU9SSUVudHJ5IG51bUFzT3JpZ2luYXRvcj0gJWxkXG4iLCBwQWQtPkJBVGFibGUubnVtQXNSZWNpcGllbnQpKTsKKwkJCS8vIEVyYXNlIEJpdG1hcCBmbGFnLgorCQl9CisJCXBBZC0+TWFjVGFiLkNvbnRlbnRbcEJBT1JJRW50cnktPldjaWRdLlRYQkFiaXRtYXAgJj0gKH4oMTw8KHBCQU9SSUVudHJ5LT5USUQpICkpOwkvLyBJZiBTVEEgbW9kZSwgIGVyYXNlIGZsYWcgaGVyZQorCQlwQWQtPk1hY1RhYi5Db250ZW50W3BCQU9SSUVudHJ5LT5XY2lkXS5CQU9yaVdjaWRBcnJheVtwQkFPUklFbnRyeS0+VElEXSA9IDA7CS8vIElmIFNUQSBtb2RlLCAgZXJhc2UgZmxhZyBoZXJlCisJCXBCQU9SSUVudHJ5LT5PUklfQkFfU3RhdHVzID0gT3JpZ2luYXRvcl9OT05FOworCQlwQkFPUklFbnRyeS0+VG9rZW4gPSAxOworCQkvLyBOb3QgY2xlYXIgU2VxdWVuY2UgaGVyZS4KKwkJTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5CQVRhYkxvY2spOworCX0KK30KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworLyohIFxicmllZgorICoJXHBhcmFtCisgKglccmV0dXJuCisgKglccHJlCisgKglccG9zdAorCisgSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKyAqLworVk9JRCBCc3NFbnRyeVNldCgKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQgQlNTX0VOVFJZICpwQnNzLAorCUlOIFBVQ0hBUiBwQnNzaWQsCisJSU4gQ0hBUiBTc2lkW10sCisJSU4gVUNIQVIgU3NpZExlbiwKKwlJTiBVQ0hBUiBCc3NUeXBlLAorCUlOIFVTSE9SVCBCZWFjb25QZXJpb2QsCisJSU4gUENGX1BBUk0gcENmUGFybSwKKwlJTiBVU0hPUlQgQXRpbVdpbiwKKwlJTiBVU0hPUlQgQ2FwYWJpbGl0eUluZm8sCisJSU4gVUNIQVIgU3VwUmF0ZVtdLAorCUlOIFVDSEFSIFN1cFJhdGVMZW4sCisJSU4gVUNIQVIgRXh0UmF0ZVtdLAorCUlOIFVDSEFSIEV4dFJhdGVMZW4sCisJSU4gSFRfQ0FQQUJJTElUWV9JRSAqcEh0Q2FwYWJpbGl0eSwKKwlJTiBBRERfSFRfSU5GT19JRSAqcEFkZEh0SW5mbywJLy8gQVAgbWlnaHQgdXNlIHRoaXMgYWRkaXRpb25hbCBodCBpbmZvIElFCisJSU4gVUNIQVIJCQlIdENhcGFiaWxpdHlMZW4sCisJSU4gVUNIQVIJCQlBZGRIdEluZm9MZW4sCisJSU4gVUNIQVIJCQlOZXdFeHRDaGFuT2Zmc2V0LAorCUlOIFVDSEFSIENoYW5uZWwsCisJSU4gQ0hBUiBSc3NpLAorCUlOIExBUkdFX0lOVEVHRVIgVGltZVN0YW1wLAorCUlOIFVDSEFSIENraXBGbGFnLAorCUlOIFBFRENBX1BBUk0gcEVkY2FQYXJtLAorCUlOIFBRT1NfQ0FQQUJJTElUWV9QQVJNIHBRb3NDYXBhYmlsaXR5LAorCUlOIFBRQlNTX0xPQURfUEFSTSBwUWJzc0xvYWQsCisJSU4gVVNIT1JUIExlbmd0aFZJRSwKKwlJTiBQTkRJU184MDJfMTFfVkFSSUFCTEVfSUVzIHBWSUUpCit7CisJQ09QWV9NQUNfQUREUihwQnNzLT5Cc3NpZCwgcEJzc2lkKTsKKwkvLyBEZWZhdWx0IEhpZGRlbiBTU0lEIHRvIGJlIFRSVUUsIGl0IHdpbGwgYmUgdHVybmVkIHRvIEZBTFNFIGFmdGVyIGNvcGluZyBTU0lECisJcEJzcy0+SGlkZGVuID0gMTsKKwlpZiAoU3NpZExlbiA+IDApCisJeworCQkvLyBGb3IgaGlkZGVuIFNTSUQgQVAsIGl0IG1pZ2h0IHNlbmQgYmVhY29uIHdpdGggU1NJRCBsZW4gZXF1YWwgdG8gMAorCQkvLyBPciBzZW5kIGJlYWNvbiAvcHJvYmUgcmVzcG9uc2Ugd2l0aCBTU0lEIGxlbiBtYXRjaGluZyByZWFsIFNTSUQgbGVuZ3RoLAorCQkvLyBidXQgU1NJRCBpcyBhbGwgemVyby4gc3VjaCBhcyAiMDAtMDAtMDAtMDAiIHdpdGggbGVuZ3RoIDQuCisJCS8vIFdlIGhhdmUgdG8gcHJldmVudCB0aGlzIGNhc2Ugb3ZlcndyaXRlIGNvcnJlY3QgdGFibGUKKwkJaWYgKE5kaXNFcXVhbE1lbW9yeShTc2lkLCBaZXJvU3NpZCwgU3NpZExlbikgPT0gMCkKKwkJeworCQkgICAgTmRpc1plcm9NZW1vcnkocEJzcy0+U3NpZCwgTUFYX0xFTl9PRl9TU0lEKTsKKwkJCU5kaXNNb3ZlTWVtb3J5KHBCc3MtPlNzaWQsIFNzaWQsIFNzaWRMZW4pOworCQkJcEJzcy0+U3NpZExlbiA9IFNzaWRMZW47CisJCQlwQnNzLT5IaWRkZW4gPSAwOworCQl9CisJfQorCWVsc2UKKwkJcEJzcy0+U3NpZExlbiA9IDA7CisJcEJzcy0+QnNzVHlwZSA9IEJzc1R5cGU7CisJcEJzcy0+QmVhY29uUGVyaW9kID0gQmVhY29uUGVyaW9kOworCWlmIChCc3NUeXBlID09IEJTU19JTkZSQSkKKwl7CisJCWlmIChwQ2ZQYXJtLT5iVmFsaWQpCisJCXsKKwkJCXBCc3MtPkNmcENvdW50ID0gcENmUGFybS0+Q2ZwQ291bnQ7CisJCQlwQnNzLT5DZnBQZXJpb2QgPSBwQ2ZQYXJtLT5DZnBQZXJpb2Q7CisJCQlwQnNzLT5DZnBNYXhEdXJhdGlvbiA9IHBDZlBhcm0tPkNmcE1heER1cmF0aW9uOworCQkJcEJzcy0+Q2ZwRHVyUmVtYWluaW5nID0gcENmUGFybS0+Q2ZwRHVyUmVtYWluaW5nOworCQl9CisJfQorCWVsc2UKKwl7CisJCXBCc3MtPkF0aW1XaW4gPSBBdGltV2luOworCX0KKworCXBCc3MtPkNhcGFiaWxpdHlJbmZvID0gQ2FwYWJpbGl0eUluZm87CisJLy8gVGhlIHByaXZhY3kgYml0IGluZGljYXRlIHNlY3VyaXR5IGlzIE9OLCBpdCBtYWlnaHQgYmUgV0VQLCBUS0lQIG9yIEFFUworCS8vIENvbWJpbmUgd2l0aCBBdXRoTW9kZSwgdGhleSB3aWxsIGRlY2lkZSB0aGUgY29ubmVjdGlvbiBtZXRob2RzLgorCXBCc3MtPlByaXZhY3kgPSBDQVBfSVNfUFJJVkFDWV9PTihwQnNzLT5DYXBhYmlsaXR5SW5mbyk7CisJQVNTRVJUKFN1cFJhdGVMZW4gPD0gTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVMpOworCWlmIChTdXBSYXRlTGVuIDw9IE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTKQorCQlOZGlzTW92ZU1lbW9yeShwQnNzLT5TdXBSYXRlLCBTdXBSYXRlLCBTdXBSYXRlTGVuKTsKKwllbHNlCisJCU5kaXNNb3ZlTWVtb3J5KHBCc3MtPlN1cFJhdGUsIFN1cFJhdGUsIE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTKTsKKwlwQnNzLT5TdXBSYXRlTGVuID0gU3VwUmF0ZUxlbjsKKwlBU1NFUlQoRXh0UmF0ZUxlbiA8PSBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUyk7CisJTmRpc01vdmVNZW1vcnkocEJzcy0+RXh0UmF0ZSwgRXh0UmF0ZSwgRXh0UmF0ZUxlbik7CisJTmRpc01vdmVNZW1vcnkoJnBCc3MtPkh0Q2FwYWJpbGl0eSwgcEh0Q2FwYWJpbGl0eSwgSHRDYXBhYmlsaXR5TGVuKTsKKwlOZGlzTW92ZU1lbW9yeSgmcEJzcy0+QWRkSHRJbmZvLCBwQWRkSHRJbmZvLCBBZGRIdEluZm9MZW4pOworCXBCc3MtPk5ld0V4dENoYW5PZmZzZXQgPSBOZXdFeHRDaGFuT2Zmc2V0OworCXBCc3MtPkV4dFJhdGVMZW4gPSBFeHRSYXRlTGVuOworCXBCc3MtPkNoYW5uZWwgPSBDaGFubmVsOworCXBCc3MtPkNlbnRyYWxDaGFubmVsID0gQ2hhbm5lbDsKKwlwQnNzLT5Sc3NpID0gUnNzaTsKKwkvLyBVcGRhdGUgQ2tpcEZsYWcuIGlmIG5vdCBleGlzdHMsIHRoZSB2YWx1ZSBpcyAweDAKKwlwQnNzLT5Da2lwRmxhZyA9IENraXBGbGFnOworCisJLy8gTmV3IGZvciBtaWNyb3NvZnQgRml4ZWQgSUVzCisJTmRpc01vdmVNZW1vcnkocEJzcy0+Rml4SUVzLlRpbWVzdGFtcCwgJlRpbWVTdGFtcCwgOCk7CisJcEJzcy0+Rml4SUVzLkJlYWNvbkludGVydmFsID0gQmVhY29uUGVyaW9kOworCXBCc3MtPkZpeElFcy5DYXBhYmlsaXRpZXMgPSBDYXBhYmlsaXR5SW5mbzsKKworCS8vIE5ldyBmb3IgbWljcm9zb2Z0IFZhcmlhYmxlIElFcworCWlmIChMZW5ndGhWSUUgIT0gMCkKKwl7CisJCXBCc3MtPlZhcklFTGVuID0gTGVuZ3RoVklFOworCQlOZGlzTW92ZU1lbW9yeShwQnNzLT5WYXJJRXMsIHBWSUUsIHBCc3MtPlZhcklFTGVuKTsKKwl9CisJZWxzZQorCXsKKwkJcEJzcy0+VmFySUVMZW4gPSAwOworCX0KKworCXBCc3MtPkFkZEh0SW5mb0xlbiA9IDA7CisJcEJzcy0+SHRDYXBhYmlsaXR5TGVuID0gMDsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwlpZiAoSHRDYXBhYmlsaXR5TGVuPiAwKQorCXsKKwkJcEJzcy0+SHRDYXBhYmlsaXR5TGVuID0gSHRDYXBhYmlsaXR5TGVuOworCQlOZGlzTW92ZU1lbW9yeSgmcEJzcy0+SHRDYXBhYmlsaXR5LCBwSHRDYXBhYmlsaXR5LCBIdENhcGFiaWxpdHlMZW4pOworCQlpZiAoQWRkSHRJbmZvTGVuID4gMCkKKwkJeworCQkJcEJzcy0+QWRkSHRJbmZvTGVuID0gQWRkSHRJbmZvTGVuOworCQkJTmRpc01vdmVNZW1vcnkoJnBCc3MtPkFkZEh0SW5mbywgcEFkZEh0SW5mbywgQWRkSHRJbmZvTGVuKTsKKworCSAJCQlpZiAoKHBBZGRIdEluZm8tPkNvbnRyb2xDaGFuID4gMikmJiAocEFkZEh0SW5mby0+QWRkSHRJbmZvLkV4dENoYW5PZmZzZXQgPT0gRVhUQ0hBX0JFTE9XKSAmJiAocEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLkNoYW5uZWxXaWR0aCA9PSBCV180MCkpCisJIAkJCXsKKwkgCQkJCXBCc3MtPkNlbnRyYWxDaGFubmVsID0gcEFkZEh0SW5mby0+Q29udHJvbENoYW4gLSAyOworCSAJCQl9CisJIAkJCWVsc2UgaWYgKChwQWRkSHRJbmZvLT5BZGRIdEluZm8uRXh0Q2hhbk9mZnNldCA9PSBFWFRDSEFfQUJPVkUpICYmIChwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uQ2hhbm5lbFdpZHRoID09IEJXXzQwKSkKKwkJCQl7CisJCSAJCQkJcEJzcy0+Q2VudHJhbENoYW5uZWwgPSBwQWRkSHRJbmZvLT5Db250cm9sQ2hhbiArIDI7CisJCQkJfQorCQl9CisJfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJQnNzQ2lwaGVyUGFyc2UocEJzcyk7CisKKwkvLyBuZXcgZm9yIFFPUworCWlmIChwRWRjYVBhcm0pCisJCU5kaXNNb3ZlTWVtb3J5KCZwQnNzLT5FZGNhUGFybSwgcEVkY2FQYXJtLCBzaXplb2YoRURDQV9QQVJNKSk7CisJZWxzZQorCQlwQnNzLT5FZGNhUGFybS5iVmFsaWQgPSBGQUxTRTsKKwlpZiAocFFvc0NhcGFiaWxpdHkpCisJCU5kaXNNb3ZlTWVtb3J5KCZwQnNzLT5Rb3NDYXBhYmlsaXR5LCBwUW9zQ2FwYWJpbGl0eSwgc2l6ZW9mKFFPU19DQVBBQklMSVRZX1BBUk0pKTsKKwllbHNlCisJCXBCc3MtPlFvc0NhcGFiaWxpdHkuYlZhbGlkID0gRkFMU0U7CisJaWYgKHBRYnNzTG9hZCkKKwkJTmRpc01vdmVNZW1vcnkoJnBCc3MtPlFic3NMb2FkLCBwUWJzc0xvYWQsIHNpemVvZihRQlNTX0xPQURfUEFSTSkpOworCWVsc2UKKwkJcEJzcy0+UWJzc0xvYWQuYlZhbGlkID0gRkFMU0U7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCXsKKwkJUEVJRF9TVFJVQ1QgICAgIHBFaWQ7CisJCVVTSE9SVCAgICAgICAgICBMZW5ndGggPSAwOworCisKKwkJTmRpc1plcm9NZW1vcnkoJnBCc3MtPldwYUlFLklFWzBdLCBNQVhfQ1VTVE9NX0xFTik7CisJCU5kaXNaZXJvTWVtb3J5KCZwQnNzLT5Sc25JRS5JRVswXSwgTUFYX0NVU1RPTV9MRU4pOworI2lmZGVmIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QKKwkJTmRpc1plcm9NZW1vcnkoJnBCc3MtPkNvdW50cnlTdHJpbmdbMF0sIDMpOworCQlwQnNzLT5iSGFzQ291bnRyeUlFID0gRkFMU0U7CisjZW5kaWYgLy8gRVhUX0JVSUxEX0NIQU5ORUxfTElTVCAvLworCQlwRWlkID0gKFBFSURfU1RSVUNUKSBwVklFOworCQl3aGlsZSAoKExlbmd0aCArIDIgKyAoVVNIT1JUKXBFaWQtPkxlbikgPD0gTGVuZ3RoVklFKQorCQl7CisJCQlzd2l0Y2gocEVpZC0+RWlkKQorCQkJeworCQkJCWNhc2UgSUVfV1BBOgorCQkJCQlpZiAoTmRpc0VxdWFsTWVtb3J5KHBFaWQtPk9jdGV0LCBXUEFfT1VJLCA0KSkKKwkJCQkJeworCQkJCQkJaWYgKChwRWlkLT5MZW4gKyAyKSA+IE1BWF9DVVNUT01fTEVOKQorCQkJCQkJeworCQkJCQkJCXBCc3MtPldwYUlFLklFTGVuID0gMDsKKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJCXBCc3MtPldwYUlFLklFTGVuID0gcEVpZC0+TGVuICsgMjsKKwkJCQkJCU5kaXNNb3ZlTWVtb3J5KHBCc3MtPldwYUlFLklFLCBwRWlkLCBwQnNzLT5XcGFJRS5JRUxlbik7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBJRV9SU046CisgICAgICAgICAgICAgICAgICAgIGlmIChOZGlzRXF1YWxNZW1vcnkocEVpZC0+T2N0ZXQgKyAyLCBSU05fT1VJLCAzKSkKKwkJCQkJeworCQkJCQkJaWYgKChwRWlkLT5MZW4gKyAyKSA+IE1BWF9DVVNUT01fTEVOKQorCQkJCQkJeworCQkJCQkJCXBCc3MtPlJzbklFLklFTGVuID0gMDsKKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJCXBCc3MtPlJzbklFLklFTGVuID0gcEVpZC0+TGVuICsgMjsKKwkJCQkJCU5kaXNNb3ZlTWVtb3J5KHBCc3MtPlJzbklFLklFLCBwRWlkLCBwQnNzLT5Sc25JRS5JRUxlbik7CisJCQl9CisJCQkJYnJlYWs7CisjaWZkZWYgRVhUX0JVSUxEX0NIQU5ORUxfTElTVAorCQkJCWNhc2UgSUVfQ09VTlRSWToKKwkJCQkJTmRpc01vdmVNZW1vcnkoJnBCc3MtPkNvdW50cnlTdHJpbmdbMF0sIHBFaWQtPk9jdGV0LCAzKTsKKwkJCQkJcEJzcy0+Ykhhc0NvdW50cnlJRSA9IFRSVUU7CisJCQkJCWJyZWFrOworI2VuZGlmIC8vIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QgLy8KKyAgICAgICAgICAgIH0KKwkJCUxlbmd0aCA9IExlbmd0aCArIDIgKyAoVVNIT1JUKXBFaWQtPkxlbjsgIC8vIEVpZFsxXSArIExlblsxXSsgY29udGVudFtMZW5dCisJCQlwRWlkID0gKFBFSURfU1RSVUNUKSgoVUNIQVIqKXBFaWQgKyAyICsgcEVpZC0+TGVuKTsKKwkJfQorCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KK30KKworLyohCisgKglcYnJpZWYgaW5zZXJ0IGFuIGVudHJ5IGludG8gdGhlIGJzcyB0YWJsZQorICoJXHBhcmFtIHBfdGFiIFRoZSBCU1MgdGFibGUKKyAqCVxwYXJhbSBCc3NpZCBCU1NJRAorICoJXHBhcmFtIHNzaWQgU1NJRAorICoJXHBhcmFtIHNzaWRfbGVuIExlbmd0aCBvZiBTU0lECisgKglccGFyYW0gYnNzX3R5cGUKKyAqCVxwYXJhbSBiZWFjb25fcGVyaW9kCisgKglccGFyYW0gdGltZXN0YW1wCisgKglccGFyYW0gcF9jZgorICoJXHBhcmFtIGF0aW1fd2luCisgKglccGFyYW0gY2FwCisgKglccGFyYW0gcmF0ZXMKKyAqCVxwYXJhbSByYXRlc19sZW4KKyAqCVxwYXJhbSBjaGFubmVsX2lkeAorICoJXHJldHVybiBub25lCisgKglccHJlCisgKglccG9zdAorICoJXG5vdGUgSWYgU1NJRCBpcyBpZGVudGljYWwsIHRoZSBvbGQgZW50cnkgd2lsbCBiZSByZXBsYWNlZCBieSB0aGUgbmV3IG9uZQorCisgSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKyAqLworVUxPTkcgQnNzVGFibGVTZXRFbnRyeSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQgQlNTX1RBQkxFICpUYWIsCisJSU4gUFVDSEFSIHBCc3NpZCwKKwlJTiBDSEFSIFNzaWRbXSwKKwlJTiBVQ0hBUiBTc2lkTGVuLAorCUlOIFVDSEFSIEJzc1R5cGUsCisJSU4gVVNIT1JUIEJlYWNvblBlcmlvZCwKKwlJTiBDRl9QQVJNICpDZlBhcm0sCisJSU4gVVNIT1JUIEF0aW1XaW4sCisJSU4gVVNIT1JUIENhcGFiaWxpdHlJbmZvLAorCUlOIFVDSEFSIFN1cFJhdGVbXSwKKwlJTiBVQ0hBUiBTdXBSYXRlTGVuLAorCUlOIFVDSEFSIEV4dFJhdGVbXSwKKwlJTiBVQ0hBUiBFeHRSYXRlTGVuLAorCUlOIEhUX0NBUEFCSUxJVFlfSUUgKnBIdENhcGFiaWxpdHksCisJSU4gQUREX0hUX0lORk9fSUUgKnBBZGRIdEluZm8sCS8vIEFQIG1pZ2h0IHVzZSB0aGlzIGFkZGl0aW9uYWwgaHQgaW5mbyBJRQorCUlOIFVDSEFSCQkJSHRDYXBhYmlsaXR5TGVuLAorCUlOIFVDSEFSCQkJQWRkSHRJbmZvTGVuLAorCUlOIFVDSEFSCQkJTmV3RXh0Q2hhbk9mZnNldCwKKwlJTiBVQ0hBUiBDaGFubmVsTm8sCisJSU4gQ0hBUiBSc3NpLAorCUlOIExBUkdFX0lOVEVHRVIgVGltZVN0YW1wLAorCUlOIFVDSEFSIENraXBGbGFnLAorCUlOIFBFRENBX1BBUk0gcEVkY2FQYXJtLAorCUlOIFBRT1NfQ0FQQUJJTElUWV9QQVJNIHBRb3NDYXBhYmlsaXR5LAorCUlOIFBRQlNTX0xPQURfUEFSTSBwUWJzc0xvYWQsCisJSU4gVVNIT1JUIExlbmd0aFZJRSwKKwlJTiBQTkRJU184MDJfMTFfVkFSSUFCTEVfSUVzIHBWSUUpCit7CisJVUxPTkcJSWR4OworCisJSWR4ID0gQnNzVGFibGVTZWFyY2hXaXRoU1NJRChUYWIsIHBCc3NpZCwgIFNzaWQsIFNzaWRMZW4sIENoYW5uZWxObyk7CisJaWYgKElkeCA9PSBCU1NfTk9UX0ZPVU5EKQorCXsKKwkJaWYgKFRhYi0+QnNzTnIgPj0gTUFYX0xFTl9PRl9CU1NfVEFCTEUpCisJICAgIHsKKwkJCS8vCisJCQkvLyBJdCBtYXkgaGFwcGVuIHdoZW4gQlNTIFRhYmxlIHdhcyBmdWxsLgorCQkJLy8gVGhlIGRlc2lyZWQgQVAgd2lsbCBub3QgYmUgYWRkZWQgaW50byBCU1MgVGFibGUKKwkJCS8vIEluIHRoaXMgY2FzZSwgaWYgd2UgZm91bmQgdGhlIGRlc2lyZWQgQVAgdGhlbiBvdmVyd3JpdGUgQlNTIFRhYmxlLgorCQkJLy8KKwkJCWlmKCFPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCkpCisJCQl7CisJCQkJaWYgKE1BQ19BRERSX0VRVUFMKHBBZC0+TWxtZUF1eC5Cc3NpZCwgcEJzc2lkKSB8fAorCQkJCQlTU0lEX0VRVUFMKHBBZC0+TWxtZUF1eC5Tc2lkLCBwQWQtPk1sbWVBdXguU3NpZExlbiwgU3NpZCwgU3NpZExlbikpCisJCQkJeworCQkJCQlJZHggPSBUYWItPkJzc092ZXJsYXBOcjsKKwkJCQkJQnNzRW50cnlTZXQocEFkLCAmVGFiLT5Cc3NFbnRyeVtJZHhdLCBwQnNzaWQsIFNzaWQsIFNzaWRMZW4sIEJzc1R5cGUsIEJlYWNvblBlcmlvZCwgQ2ZQYXJtLCBBdGltV2luLAorCQkJCQkJQ2FwYWJpbGl0eUluZm8sIFN1cFJhdGUsIFN1cFJhdGVMZW4sIEV4dFJhdGUsIEV4dFJhdGVMZW4scEh0Q2FwYWJpbGl0eSwgcEFkZEh0SW5mbyxIdENhcGFiaWxpdHlMZW4sIEFkZEh0SW5mb0xlbiwKKwkJCQkJCU5ld0V4dENoYW5PZmZzZXQsIENoYW5uZWxObywgUnNzaSwgVGltZVN0YW1wLCBDa2lwRmxhZywgcEVkY2FQYXJtLCBwUW9zQ2FwYWJpbGl0eSwgcFFic3NMb2FkLCBMZW5ndGhWSUUsIHBWSUUpOworICAgICAgICAgICAgICAgICAgICBUYWItPkJzc092ZXJsYXBOciA9IChUYWItPkJzc092ZXJsYXBOcisrKSAlIE1BWF9MRU5fT0ZfQlNTX1RBQkxFOworCQkJCX0KKwkJCQlyZXR1cm4gSWR4OworCQkJfQorCQkJZWxzZQorCQkJeworCQkJcmV0dXJuIEJTU19OT1RfRk9VTkQ7CisJCQl9CisJCX0KKwkJSWR4ID0gVGFiLT5Cc3NOcjsKKwkJQnNzRW50cnlTZXQocEFkLCAmVGFiLT5Cc3NFbnRyeVtJZHhdLCBwQnNzaWQsIFNzaWQsIFNzaWRMZW4sIEJzc1R5cGUsIEJlYWNvblBlcmlvZCwgQ2ZQYXJtLCBBdGltV2luLAorCQkJCQlDYXBhYmlsaXR5SW5mbywgU3VwUmF0ZSwgU3VwUmF0ZUxlbiwgRXh0UmF0ZSwgRXh0UmF0ZUxlbixwSHRDYXBhYmlsaXR5LCBwQWRkSHRJbmZvLEh0Q2FwYWJpbGl0eUxlbiwgQWRkSHRJbmZvTGVuLAorCQkJCQlOZXdFeHRDaGFuT2Zmc2V0LCBDaGFubmVsTm8sIFJzc2ksIFRpbWVTdGFtcCwgQ2tpcEZsYWcsIHBFZGNhUGFybSwgcFFvc0NhcGFiaWxpdHksIHBRYnNzTG9hZCwgTGVuZ3RoVklFLCBwVklFKTsKKwkJVGFiLT5Cc3NOcisrOworCX0KKwllbHNlCisJeworCQlCc3NFbnRyeVNldChwQWQsICZUYWItPkJzc0VudHJ5W0lkeF0sIHBCc3NpZCwgU3NpZCwgU3NpZExlbiwgQnNzVHlwZSwgQmVhY29uUGVyaW9kLENmUGFybSwgQXRpbVdpbiwKKwkJCQkJQ2FwYWJpbGl0eUluZm8sIFN1cFJhdGUsIFN1cFJhdGVMZW4sIEV4dFJhdGUsIEV4dFJhdGVMZW4scEh0Q2FwYWJpbGl0eSwgcEFkZEh0SW5mbyxIdENhcGFiaWxpdHlMZW4sIEFkZEh0SW5mb0xlbiwKKwkJCQkJTmV3RXh0Q2hhbk9mZnNldCwgQ2hhbm5lbE5vLCBSc3NpLCBUaW1lU3RhbXAsIENraXBGbGFnLCBwRWRjYVBhcm0sIHBRb3NDYXBhYmlsaXR5LCBwUWJzc0xvYWQsIExlbmd0aFZJRSwgcFZJRSk7CisJfQorCisJcmV0dXJuIElkeDsKK30KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorI2lmZGVmIERPVDExX05fU1VQUE9SVAorI2lmZGVmIERPVDExTl9EUkFGVDMKK1ZPSUQgIFRyaUV2ZW50SW5pdCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCkKK3sKKwlVQ0hBUgkJaTsKKworCWZvciAoaSA9IDA7aSA8IE1BWF9UUklHR0VSX0VWRU5UO2krKykKKwkJcEFkLT5Db21tb25DZmcuVHJpZ2dlckV2ZW50VGFiLkV2ZW50QVtpXS5iVmFsaWQgPSBGQUxTRTsKKworCXBBZC0+Q29tbW9uQ2ZnLlRyaWdnZXJFdmVudFRhYi5FdmVudEFObyA9IDA7CisJcEFkLT5Db21tb25DZmcuVHJpZ2dlckV2ZW50VGFiLkV2ZW50QkNvdW50RG93biA9IDA7Cit9CisKK1VMT05HIFRyaUV2ZW50VGFibGVTZXRFbnRyeSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQgVFJJR0dFUl9FVkVOVF9UQUIgKlRhYiwKKwlJTiBQVUNIQVIgcEJzc2lkLAorCUlOIEhUX0NBUEFCSUxJVFlfSUUgKnBIdENhcGFiaWxpdHksCisJSU4gVUNIQVIJCQlIdENhcGFiaWxpdHlMZW4sCisJSU4gVUNIQVIJCQlSZWdDbGFzcywKKwlJTiBVQ0hBUiBDaGFubmVsTm8pCit7CisJLy8gRXZlbnQgQQorCWlmIChIdENhcGFiaWxpdHlMZW4gPT0gMCkKKwl7CisJCWlmIChUYWItPkV2ZW50QU5vIDwgTUFYX1RSSUdHRVJfRVZFTlQpCisJCXsKKwkJCVJUTVBNb3ZlTWVtb3J5KFRhYi0+RXZlbnRBW1RhYi0+RXZlbnRBTm9dLkJTU0lELCBwQnNzaWQsIDYpOworCQkJVGFiLT5FdmVudEFbVGFiLT5FdmVudEFOb10uYlZhbGlkID0gVFJVRTsKKwkJCVRhYi0+RXZlbnRBW1RhYi0+RXZlbnRBTm9dLkNoYW5uZWwgPSBDaGFubmVsTm87CisJCQlUYWItPkV2ZW50QVtUYWItPkV2ZW50QU5vXS5DRENvdW50ZXIgPSBwQWQtPkNvbW1vbkNmZy5Eb3QxMUJzc1dpZHRoQ2hhblRyYW5EZWxheTsKKwkJCWlmIChSZWdDbGFzcyAhPSAwKQorCQkJeworCQkJCS8vIEJlYWNvbiBoYXMgUmVndWxhdG9yeSBjbGFzcyBJRS4gU28gdXNlIGJlYWNvbidzCisJCQkJVGFiLT5FdmVudEFbVGFiLT5FdmVudEFOb10uUmVnQ2xhc3MgPSBSZWdDbGFzczsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQkvLyBVc2UgU3RhdGlvbidzIFJlZ3VsYXRvcnkgY2xhc3MgaW5zdGVhZC4KKwkJCQlpZiAocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkSHRQaHkuYkh0RW5hYmxlID09IFRSVUUpCisJCQkJeworCQkJCQlpZiAocEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPiBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKQorCQkJCQl7CisJCQkJCQlUYWItPkV2ZW50QVtUYWItPkV2ZW50QU5vXS5SZWdDbGFzcyA9IDMyOworCQkJCQl9CisJCQkJCWVsc2UgaWYgKHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsIDwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkKKwkJCQkJCVRhYi0+RXZlbnRBW1RhYi0+RXZlbnRBTm9dLlJlZ0NsYXNzID0gMzM7CisJCQkJfQorCQkJCWVsc2UKKwkJCQkJVGFiLT5FdmVudEFbVGFiLT5FdmVudEFOb10uUmVnQ2xhc3MgPSA/PzsKKworCQkJfQorCisJCQlUYWItPkV2ZW50QU5vICsrOworCQl9CisJfQorCWVsc2UgaWYgKHBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5JbnRvbGVyYW50NDApCisJeworCQlUYWItPkV2ZW50QkNvdW50RG93biA9IHBBZC0+Q29tbW9uQ2ZnLkRvdDExQnNzV2lkdGhDaGFuVHJhbkRlbGF5OworCX0KKworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVRyaWdnZXIgRXZlbnQgdGFibGUgTWFpbnRhaW5lbmNlIGNhbGxlZCBvbmNlIGV2ZXJ5IHNlY29uZC4KKworCUFyZ3VtZW50czoKKwkvLyBJUlFMID0gRElTUEFUQ0hfTEVWRUwKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIFRyaUV2ZW50Q291bnRlck1haW50ZW5hbmNlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKQoreworCVVDSEFSCQlpOworCUJPT0xFQU4JCQliTm90aWZ5ID0gRkFMU0U7CisJZm9yIChpID0gMDtpIDwgTUFYX1RSSUdHRVJfRVZFTlQ7aSsrKQorCXsKKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLlRyaWdnZXJFdmVudFRhYi5FdmVudEFbaV0uYlZhbGlkICYmIChwQWQtPkNvbW1vbkNmZy5UcmlnZ2VyRXZlbnRUYWIuRXZlbnRBW2ldLkNEQ291bnRlciA+IDApKQorCQl7CisJCQlwQWQtPkNvbW1vbkNmZy5UcmlnZ2VyRXZlbnRUYWIuRXZlbnRBW2ldLkNEQ291bnRlci0tOworCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLlRyaWdnZXJFdmVudFRhYi5FdmVudEFbaV0uQ0RDb3VudGVyID09IDApCisJCQl7CisJCQkJcEFkLT5Db21tb25DZmcuVHJpZ2dlckV2ZW50VGFiLkV2ZW50QVtpXS5iVmFsaWQgPSBGQUxTRTsKKwkJCQlwQWQtPkNvbW1vbkNmZy5UcmlnZ2VyRXZlbnRUYWIuRXZlbnRBTm8gLS07CisJCQkJLy8gTmVlZCB0byBzZW5kIDIwLzQwIENvZXhpc3RlbmNlIE5vdGlmeSBmcmFtZSBpZiBoYXMgc3RhdHVzIGNoYW5nZS4KKwkJCQliTm90aWZ5ID0gVFJVRTsKKwkJCX0KKwkJfQorCX0KKwlpZiAocEFkLT5Db21tb25DZmcuVHJpZ2dlckV2ZW50VGFiLkV2ZW50QkNvdW50RG93biA+IDApCisJeworCQlwQWQtPkNvbW1vbkNmZy5UcmlnZ2VyRXZlbnRUYWIuRXZlbnRCQ291bnREb3duLS07CisJCWlmIChwQWQtPkNvbW1vbkNmZy5UcmlnZ2VyRXZlbnRUYWIuRXZlbnRCQ291bnREb3duID09IDApCisJCQliTm90aWZ5ID0gVFJVRTsKKwl9CisKKwlpZiAoYk5vdGlmeSA9PSBUUlVFKQorCQlVcGRhdGUyMDQwQ29leGlzdEZyYW1lQW5kTm90aWZ5KHBBZCwgQlNTSURfV0NJRCwgVFJVRSk7Cit9CisjZW5kaWYgLy8gRE9UMTFOX0RSQUZUMyAvLworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisvLyBJUlFMID0gRElTUEFUQ0hfTEVWRUwKK1ZPSUQgQnNzVGFibGVTc2lkU29ydCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQgQlNTX1RBQkxFICpPdXRUYWIsCisJSU4JQ0hBUiBTc2lkW10sCisJSU4JVUNIQVIgU3NpZExlbikKK3sKKwlJTlQgaTsKKwlCc3NUYWJsZUluaXQoT3V0VGFiKTsKKworCWZvciAoaSA9IDA7IGkgPCBwQWQtPlNjYW5UYWIuQnNzTnI7IGkrKykKKwl7CisJCUJTU19FTlRSWSAqcEluQnNzID0gJnBBZC0+U2NhblRhYi5Cc3NFbnRyeVtpXTsKKwkJQk9PTEVBTgliSXNIaWRkZW5BcEluY2x1ZGVkID0gRkFMU0U7CisKKwkJaWYgKCgocEFkLT5Db21tb25DZmcuYklFRUU4MDIxMUggPT0gMSkgJiYKKyAgICAgICAgICAgIChwQWQtPk1sbWVBdXguQ2hhbm5lbCA+IDE0KSAmJgorICAgICAgICAgICAgIFJhZGFyQ2hhbm5lbENoZWNrKHBBZCwgcEluQnNzLT5DaGFubmVsKSkKKyNpZmRlZiBDQVJSSUVSX0RFVEVDVElPTl9TVVBQT1JUIC8vIFJvZ2VyIHN5bmMgQ2FycmllcgorICAgICAgICAgICAgIHx8IChwQWQtPkNvbW1vbkNmZy5DYXJyaWVyRGV0ZWN0LkVuYWJsZSA9PSBUUlVFKQorI2VuZGlmIC8vIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQgLy8KKyAgICAgICAgICAgICkKKwkJeworCQkJaWYgKHBJbkJzcy0+SGlkZGVuKQorCQkJCWJJc0hpZGRlbkFwSW5jbHVkZWQgPSBUUlVFOworCQl9CisKKwkJaWYgKChwSW5Cc3MtPkJzc1R5cGUgPT0gcEFkLT5TdGFDZmcuQnNzVHlwZSkgJiYKKwkJCShTU0lEX0VRVUFMKFNzaWQsIFNzaWRMZW4sIHBJbkJzcy0+U3NpZCwgcEluQnNzLT5Tc2lkTGVuKSB8fCBiSXNIaWRkZW5BcEluY2x1ZGVkKSkKKwkJeworCQkJQlNTX0VOVFJZICpwT3V0QnNzID0gJk91dFRhYi0+QnNzRW50cnlbT3V0VGFiLT5Cc3NOcl07CisKKworI2lmZGVmIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QKKwkJCS8vIElmIG5vIENvdW50cnkgSUUgZXhpc3RzIG5vIENvbm5lY3Rpb24gd2lsbCBiZSBlc3RhYmxpc2hlZCB3aGVuIElFRUU4MDIxMWRDbGllbnRNb2RlIGlzIHN0cmljdC4KKwkJCWlmICgocEFkLT5TdGFDZmcuSUVFRTgwMjExZENsaWVudE1vZGUgPT0gUnQ4MDJfMTFfRF9TdHJpY3QpICYmCisJCQkJKHBJbkJzcy0+Ykhhc0NvdW50cnlJRSA9PSBGQUxTRSkpCisJCQl7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJTdGFDZmcuSUVFRTgwMjExZENsaWVudE1vZGUgPT0gUnQ4MDJfMTFfRF9TdHJpY3QsIGJ1dCB0aGlzIEFQIGRvZXNuJ3QgaGF2ZSBjb3VudHJ5IElFLlxuIikpOworCQkJCWNvbnRpbnVlOworCQkJfQorI2VuZGlmIC8vIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QgLy8KKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJLy8gMi40Ry81RyBOIG9ubHkgbW9kZQorCQkJaWYgKChwSW5Cc3MtPkh0Q2FwYWJpbGl0eUxlbiA9PSAwKSAmJgorCQkJCSgocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFOXzJfNEcpIHx8IChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMU5fNUcpKSkKKwkJCXsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlNUQSBpcyBpbiBOLW9ubHkgTW9kZSwgdGhpcyBBUCBkb24ndCBoYXZlIEh0IGNhcGFiaWxpdHkgaW4gQmVhY29uLlxuIikpOworCQkJCWNvbnRpbnVlOworCQkJfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJCQkvLyBOZXcgZm9yIFdQQTIKKwkJCS8vIENoZWNrIHRoZSBBdXRobW9kZSBmaXJzdAorCQkJaWYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKKwkJCXsKKwkJCQkvLyBDaGVjayBBdXRoTW9kZSBhbmQgQXV0aE1vZGVBdXggZm9yIG1hdGNoaW5nLCBpbiBjYXNlIEFQIHN1cHBvcnQgZHVhbC1tb2RlCisJCQkJaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSAhPSBwSW5Cc3MtPkF1dGhNb2RlKSAmJiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgIT0gcEluQnNzLT5BdXRoTW9kZUF1eCkpCisJCQkJCS8vIE5vbmUgbWF0Y2hlZAorCQkJCQljb250aW51ZTsKKworCQkJCS8vIENoZWNrIGNpcGhlciBzdWl0ZSwgQVAgbXVzdCBoYXZlIG1vcmUgc2VjdXJlZCBjaXBoZXIgdGhhbiBzdGF0aW9uIHNldHRpbmcKKwkJCQlpZiAoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkgfHwgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykpCisJCQkJeworCQkJCQkvLyBJZiBpdCdzIG5vdCBtaXhlZCBtb2RlLCB3ZSBzaG91bGQgb25seSBsZXQgQlNTIHBhc3Mgd2l0aCB0aGUgc2FtZSBlbmNyeXB0aW9uCisJCQkJCWlmIChwSW5Cc3MtPldQQS5iTWl4TW9kZSA9PSBGQUxTRSkKKwkJCQkJCWlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgIT0gcEluQnNzLT5XUEEuR3JvdXBDaXBoZXIpCisJCQkJCQkJY29udGludWU7CisKKwkJCQkJLy8gY2hlY2sgZ3JvdXAgY2lwaGVyCisJCQkJCWlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPCBwSW5Cc3MtPldQQS5Hcm91cENpcGhlcikKKwkJCQkJCWNvbnRpbnVlOworCisJCQkJCS8vIGNoZWNrIHBhaXJ3aXNlIGNpcGhlciwgc2tpcCBpZiBub25lIG1hdGNoZWQKKwkJCQkJLy8gSWYgcHJvZmlsZSBzZXQgdG8gQUVTLCBsZXQgaXQgcGFzcyB3aXRob3V0IHF1ZXN0aW9uLgorCQkJCQkvLyBJZiBwcm9maWxlIHNldCB0byBUS0lQLCB3ZSBtdXN0IGZpbmQgb25lIG1hdGVjaGVkCisJCQkJCWlmICgocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpICYmCisJCQkJCQkocEFkLT5TdGFDZmcuV2VwU3RhdHVzICE9IHBJbkJzcy0+V1BBLlBhaXJDaXBoZXIpICYmCisJCQkJCQkocEFkLT5TdGFDZmcuV2VwU3RhdHVzICE9IHBJbkJzcy0+V1BBLlBhaXJDaXBoZXJBdXgpKQorCQkJCQkJY29udGludWU7CisJCQkJfQorCQkJCWVsc2UgaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyKSB8fCAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykpCisJCQkJeworCQkJCQkvLyBJZiBpdCdzIG5vdCBtaXhlZCBtb2RlLCB3ZSBzaG91bGQgb25seSBsZXQgQlNTIHBhc3Mgd2l0aCB0aGUgc2FtZSBlbmNyeXB0aW9uCisJCQkJCWlmIChwSW5Cc3MtPldQQTIuYk1peE1vZGUgPT0gRkFMU0UpCisJCQkJCQlpZiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzICE9IHBJbkJzcy0+V1BBMi5Hcm91cENpcGhlcikKKwkJCQkJCQljb250aW51ZTsKKworCQkJCQkvLyBjaGVjayBncm91cCBjaXBoZXIKKwkJCQkJaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA8IHBJbkJzcy0+V1BBMi5Hcm91cENpcGhlcikKKwkJCQkJCWNvbnRpbnVlOworCisJCQkJCS8vIGNoZWNrIHBhaXJ3aXNlIGNpcGhlciwgc2tpcCBpZiBub25lIG1hdGNoZWQKKwkJCQkJLy8gSWYgcHJvZmlsZSBzZXQgdG8gQUVTLCBsZXQgaXQgcGFzcyB3aXRob3V0IHF1ZXN0aW9uLgorCQkJCQkvLyBJZiBwcm9maWxlIHNldCB0byBUS0lQLCB3ZSBtdXN0IGZpbmQgb25lIG1hdGVjaGVkCisJCQkJCWlmICgocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpICYmCisJCQkJCQkocEFkLT5TdGFDZmcuV2VwU3RhdHVzICE9IHBJbkJzcy0+V1BBMi5QYWlyQ2lwaGVyKSAmJgorCQkJCQkJKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAhPSBwSW5Cc3MtPldQQTIuUGFpckNpcGhlckF1eCkpCisJCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQl9CisJCQkvLyBCc3MgVHlwZSBtYXRjaGVkLCBTU0lEIG1hdGNoZWQuCisJCQkvLyBXZSB3aWxsIGNoZWNrIHdlcHN0YXR1cyBmb3IgcXVhbGlmaWNhdGlvbiBCc3MKKwkJCWVsc2UgaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAhPSBwSW5Cc3MtPldlcFN0YXR1cykKKwkJCXsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlN0YUNmZy5XZXBTdGF0dXM9JWQsIHdoaWxlIHBJbkJzcy0+V2VwU3RhdHVzPSVkXG4iLCBwQWQtPlN0YUNmZy5XZXBTdGF0dXMsIHBJbkJzcy0+V2VwU3RhdHVzKSk7CisJCQkJLy8KKwkJCQkvLyBGb3IgdGhlIFNFU3YyIGNhc2UsIHdlIHdpbGwgbm90IHF1YWxpZnkgV2VwU3RhdHVzLgorCQkJCS8vCisJCQkJaWYgKCFwSW5Cc3MtPmJTRVMpCisJCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQkvLyBTaW5jZSB0aGUgQVAgaXMgdXNpbmcgaGlkZGVuIFNTSUQsIGFuZCB3ZSBhcmUgdHJ5aW5nIHRvIGNvbm5lY3QgdG8gQU5ZCisJCQkvLyBJdCBkZWZpbml0ZWx5IHdpbGwgZmFpbC4gU28sIHNraXAgaXQuCisJCQkvLyBDQ1ggYWxzbyByZXF1aXJlIG5vdCBldmVuIHRyeSB0byBjb25uZWN0IGl0ISEKKwkJCWlmIChTc2lkTGVuID09IDApCisJCQkJY29udGludWU7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCS8vIElmIGJvdGggc3RhdGlvbiBhbmQgQVAgdXNlIDQwTUh6LCBzdGlsbCBuZWVkIHRvIGNoZWNrIGlmIHRoZSA0ME1IWiBiYW5kJ3MgbGVnYWxpdHkgaW4gbXkgY291bnRyeSByZWdpb24KKwkJCS8vIElmIHRoaXMgNDBNSHogd2lkZWJhbmQgaXMgbm90IGFsbG93ZWQgaW4gbXkgY291bnRyeSBsaXN0LCB1c2UgYmFuZHdpZHRoIDIwTUhaIGluc3RlYWQsCisJCQlpZiAoKHBJbkJzcy0+Q2VudHJhbENoYW5uZWwgIT0gcEluQnNzLT5DaGFubmVsKSAmJgorCQkJCShwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlcgPT0gQldfNDApKQorCQkJeworCQkJCWlmIChSVE1QQ2hlY2tDaGFubmVsKHBBZCwgcEluQnNzLT5DZW50cmFsQ2hhbm5lbCwgcEluQnNzLT5DaGFubmVsKSA9PSBGQUxTRSkKKwkJCQl7CisJCQkJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5CVyA9IEJXXzIwOworCQkJCQlTZXRDb21tb25IVChwQWQpOworCQkJCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlcgPSBCV180MDsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5DaGFubmVsV2lkdGggPT0gQkFORF9XSURUSF8yMCkKKwkJCQkJeworCQkJCQkJU2V0Q29tbW9uSFQocEFkKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCQkJLy8gY29weSBtYXRjaGluZyBCU1MgZnJvbSBJblRhYiB0byBPdXRUYWIKKwkJCU5kaXNNb3ZlTWVtb3J5KHBPdXRCc3MsIHBJbkJzcywgc2l6ZW9mKEJTU19FTlRSWSkpOworCisJCQlPdXRUYWItPkJzc05yKys7CisJCX0KKwkJZWxzZSBpZiAoKHBJbkJzcy0+QnNzVHlwZSA9PSBwQWQtPlN0YUNmZy5Cc3NUeXBlKSAmJiAoU3NpZExlbiA9PSAwKSkKKwkJeworCQkJQlNTX0VOVFJZICpwT3V0QnNzID0gJk91dFRhYi0+QnNzRW50cnlbT3V0VGFiLT5Cc3NOcl07CisKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJLy8gMi40Ry81RyBOIG9ubHkgbW9kZQorCQkJaWYgKChwSW5Cc3MtPkh0Q2FwYWJpbGl0eUxlbiA9PSAwKSAmJgorCQkJCSgocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFOXzJfNEcpIHx8IChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMU5fNUcpKSkKKwkJCXsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlNUQSBpcyBpbiBOLW9ubHkgTW9kZSwgdGhpcyBBUCBkb24ndCBoYXZlIEh0IGNhcGFiaWxpdHkgaW4gQmVhY29uLlxuIikpOworCQkJCWNvbnRpbnVlOworCQkJfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJCQkvLyBOZXcgZm9yIFdQQTIKKwkJCS8vIENoZWNrIHRoZSBBdXRobW9kZSBmaXJzdAorCQkJaWYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKKwkJCXsKKwkJCQkvLyBDaGVjayBBdXRoTW9kZSBhbmQgQXV0aE1vZGVBdXggZm9yIG1hdGNoaW5nLCBpbiBjYXNlIEFQIHN1cHBvcnQgZHVhbC1tb2RlCisJCQkJaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSAhPSBwSW5Cc3MtPkF1dGhNb2RlKSAmJiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgIT0gcEluQnNzLT5BdXRoTW9kZUF1eCkpCisJCQkJCS8vIE5vbmUgbWF0Y2hlZAorCQkJCQljb250aW51ZTsKKworCQkJCS8vIENoZWNrIGNpcGhlciBzdWl0ZSwgQVAgbXVzdCBoYXZlIG1vcmUgc2VjdXJlZCBjaXBoZXIgdGhhbiBzdGF0aW9uIHNldHRpbmcKKwkJCQlpZiAoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkgfHwgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykpCisJCQkJeworCQkJCQkvLyBJZiBpdCdzIG5vdCBtaXhlZCBtb2RlLCB3ZSBzaG91bGQgb25seSBsZXQgQlNTIHBhc3Mgd2l0aCB0aGUgc2FtZSBlbmNyeXB0aW9uCisJCQkJCWlmIChwSW5Cc3MtPldQQS5iTWl4TW9kZSA9PSBGQUxTRSkKKwkJCQkJCWlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgIT0gcEluQnNzLT5XUEEuR3JvdXBDaXBoZXIpCisJCQkJCQkJY29udGludWU7CisKKwkJCQkJLy8gY2hlY2sgZ3JvdXAgY2lwaGVyCisJCQkJCWlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPCBwSW5Cc3MtPldQQS5Hcm91cENpcGhlcikKKwkJCQkJCWNvbnRpbnVlOworCisJCQkJCS8vIGNoZWNrIHBhaXJ3aXNlIGNpcGhlciwgc2tpcCBpZiBub25lIG1hdGNoZWQKKwkJCQkJLy8gSWYgcHJvZmlsZSBzZXQgdG8gQUVTLCBsZXQgaXQgcGFzcyB3aXRob3V0IHF1ZXN0aW9uLgorCQkJCQkvLyBJZiBwcm9maWxlIHNldCB0byBUS0lQLCB3ZSBtdXN0IGZpbmQgb25lIG1hdGVjaGVkCisJCQkJCWlmICgocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpICYmCisJCQkJCQkocEFkLT5TdGFDZmcuV2VwU3RhdHVzICE9IHBJbkJzcy0+V1BBLlBhaXJDaXBoZXIpICYmCisJCQkJCQkocEFkLT5TdGFDZmcuV2VwU3RhdHVzICE9IHBJbkJzcy0+V1BBLlBhaXJDaXBoZXJBdXgpKQorCQkJCQkJY29udGludWU7CisJCQkJfQorCQkJCWVsc2UgaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyKSB8fCAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykpCisJCQkJeworCQkJCQkvLyBJZiBpdCdzIG5vdCBtaXhlZCBtb2RlLCB3ZSBzaG91bGQgb25seSBsZXQgQlNTIHBhc3Mgd2l0aCB0aGUgc2FtZSBlbmNyeXB0aW9uCisJCQkJCWlmIChwSW5Cc3MtPldQQTIuYk1peE1vZGUgPT0gRkFMU0UpCisJCQkJCQlpZiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzICE9IHBJbkJzcy0+V1BBMi5Hcm91cENpcGhlcikKKwkJCQkJCQljb250aW51ZTsKKworCQkJCQkvLyBjaGVjayBncm91cCBjaXBoZXIKKwkJCQkJaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA8IHBJbkJzcy0+V1BBMi5Hcm91cENpcGhlcikKKwkJCQkJCWNvbnRpbnVlOworCisJCQkJCS8vIGNoZWNrIHBhaXJ3aXNlIGNpcGhlciwgc2tpcCBpZiBub25lIG1hdGNoZWQKKwkJCQkJLy8gSWYgcHJvZmlsZSBzZXQgdG8gQUVTLCBsZXQgaXQgcGFzcyB3aXRob3V0IHF1ZXN0aW9uLgorCQkJCQkvLyBJZiBwcm9maWxlIHNldCB0byBUS0lQLCB3ZSBtdXN0IGZpbmQgb25lIG1hdGVjaGVkCisJCQkJCWlmICgocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpICYmCisJCQkJCQkocEFkLT5TdGFDZmcuV2VwU3RhdHVzICE9IHBJbkJzcy0+V1BBMi5QYWlyQ2lwaGVyKSAmJgorCQkJCQkJKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAhPSBwSW5Cc3MtPldQQTIuUGFpckNpcGhlckF1eCkpCisJCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQl9CisJCQkvLyBCc3MgVHlwZSBtYXRjaGVkLCBTU0lEIG1hdGNoZWQuCisJCQkvLyBXZSB3aWxsIGNoZWNrIHdlcHN0YXR1cyBmb3IgcXVhbGlmaWNhdGlvbiBCc3MKKwkJCWVsc2UgaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAhPSBwSW5Cc3MtPldlcFN0YXR1cykKKwkJCQkJY29udGludWU7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCS8vIElmIGJvdGggc3RhdGlvbiBhbmQgQVAgdXNlIDQwTUh6LCBzdGlsbCBuZWVkIHRvIGNoZWNrIGlmIHRoZSA0ME1IWiBiYW5kJ3MgbGVnYWxpdHkgaW4gbXkgY291bnRyeSByZWdpb24KKwkJCS8vIElmIHRoaXMgNDBNSHogd2lkZWJhbmQgaXMgbm90IGFsbG93ZWQgaW4gbXkgY291bnRyeSBsaXN0LCB1c2UgYmFuZHdpZHRoIDIwTUhaIGluc3RlYWQsCisJCQlpZiAoKHBJbkJzcy0+Q2VudHJhbENoYW5uZWwgIT0gcEluQnNzLT5DaGFubmVsKSAmJgorCQkJCShwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlcgPT0gQldfNDApKQorCQkJeworCQkJCWlmIChSVE1QQ2hlY2tDaGFubmVsKHBBZCwgcEluQnNzLT5DZW50cmFsQ2hhbm5lbCwgcEluQnNzLT5DaGFubmVsKSA9PSBGQUxTRSkKKwkJCQl7CisJCQkJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5CVyA9IEJXXzIwOworCQkJCQlTZXRDb21tb25IVChwQWQpOworCQkJCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlcgPSBCV180MDsKKwkJCQl9CisJCQl9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwkJCS8vIGNvcHkgbWF0Y2hpbmcgQlNTIGZyb20gSW5UYWIgdG8gT3V0VGFiCisJCQlOZGlzTW92ZU1lbW9yeShwT3V0QnNzLCBwSW5Cc3MsIHNpemVvZihCU1NfRU5UUlkpKTsKKworCQkJT3V0VGFiLT5Cc3NOcisrOworCQl9CisKKwkJaWYgKE91dFRhYi0+QnNzTnIgPj0gTUFYX0xFTl9PRl9CU1NfVEFCTEUpCisJCQlicmVhazsKKwl9CisKKwlCc3NUYWJsZVNvcnRCeVJzc2koT3V0VGFiKTsKK30KKworCisvLyBJUlFMID0gRElTUEFUQ0hfTEVWRUwKK1ZPSUQgQnNzVGFibGVTb3J0QnlSc3NpKAorCUlOIE9VVCBCU1NfVEFCTEUgKk91dFRhYikKK3sKKwlJTlQgCSAgaSwgajsKKwlCU1NfRU5UUlkgVG1wQnNzOworCisJZm9yIChpID0gMDsgaSA8IE91dFRhYi0+QnNzTnIgLSAxOyBpKyspCisJeworCQlmb3IgKGogPSBpKzE7IGogPCBPdXRUYWItPkJzc05yOyBqKyspCisJCXsKKwkJCWlmIChPdXRUYWItPkJzc0VudHJ5W2pdLlJzc2kgPiBPdXRUYWItPkJzc0VudHJ5W2ldLlJzc2kpCisJCQl7CisJCQkJTmRpc01vdmVNZW1vcnkoJlRtcEJzcywgJk91dFRhYi0+QnNzRW50cnlbal0sIHNpemVvZihCU1NfRU5UUlkpKTsKKwkJCQlOZGlzTW92ZU1lbW9yeSgmT3V0VGFiLT5Cc3NFbnRyeVtqXSwgJk91dFRhYi0+QnNzRW50cnlbaV0sIHNpemVvZihCU1NfRU5UUlkpKTsKKwkJCQlOZGlzTW92ZU1lbW9yeSgmT3V0VGFiLT5Cc3NFbnRyeVtpXSwgJlRtcEJzcywgc2l6ZW9mKEJTU19FTlRSWSkpOworCQkJfQorCQl9CisJfQorfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisKK1ZPSUQgQnNzQ2lwaGVyUGFyc2UoCisJSU4gT1VUCVBCU1NfRU5UUlkJcEJzcykKK3sKKwlQRUlEX1NUUlVDVCAJCSBwRWlkOworCVBVQ0hBUgkJCQlwVG1wOworCVBSU05fSUVfSEVBREVSX1NUUlVDVAkJCXBSc25IZWFkZXI7CisJUENJUEhFUl9TVUlURV9TVFJVQ1QJCQlwQ2lwaGVyOworCVBBS01fU1VJVEVfU1RSVUNUCQkJCXBBS007CisJVVNIT1JUCQkJCQkJCUNvdW50OworCUlOVAkJCQkJCQkJTGVuZ3RoOworCU5ESVNfODAyXzExX0VOQ1JZUFRJT05fU1RBVFVTCVRtcENpcGhlcjsKKworCS8vCisJLy8gV2VwU3RhdHVzIHdpbGwgYmUgcmVzZXQgbGF0ZXIsIGlmIEFQIGFubm91bmNlIFRLSVAgb3IgQUVTIG9uIHRoZSBiZWFjb24gZnJhbWUuCisJLy8KKwlpZiAocEJzcy0+UHJpdmFjeSkKKwl7CisJCXBCc3MtPldlcFN0YXR1cyAJPSBOZGlzODAyXzExV0VQRW5hYmxlZDsKKwl9CisJZWxzZQorCXsKKwkJcEJzcy0+V2VwU3RhdHVzIAk9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKKwl9CisJLy8gU2V0IGRlZmF1bHQgdG8gZGlzYWJsZSAmIG9wZW4gYXV0aGVudGljYXRpb24gYmVmb3JlIHBhcnNpbmcgdmFyaWFibGUgSUUKKwlwQnNzLT5BdXRoTW9kZQkJPSBOZGlzODAyXzExQXV0aE1vZGVPcGVuOworCXBCc3MtPkF1dGhNb2RlQXV4CT0gTmRpczgwMl8xMUF1dGhNb2RlT3BlbjsKKworCS8vIEluaXQgV1BBIHNldHRpbmcKKwlwQnNzLT5XUEEuUGFpckNpcGhlcgk9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKKwlwQnNzLT5XUEEuUGFpckNpcGhlckF1eCA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKKwlwQnNzLT5XUEEuR3JvdXBDaXBoZXIJPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CisJcEJzcy0+V1BBLlJzbkNhcGFiaWxpdHkgPSAwOworCXBCc3MtPldQQS5iTWl4TW9kZQkJPSBGQUxTRTsKKworCS8vIEluaXQgV1BBMiBzZXR0aW5nCisJcEJzcy0+V1BBMi5QYWlyQ2lwaGVyCSA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKKwlwQnNzLT5XUEEyLlBhaXJDaXBoZXJBdXggPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CisJcEJzcy0+V1BBMi5Hcm91cENpcGhlcgkgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CisJcEJzcy0+V1BBMi5Sc25DYXBhYmlsaXR5ID0gMDsKKwlwQnNzLT5XUEEyLmJNaXhNb2RlIAkgPSBGQUxTRTsKKworCisJTGVuZ3RoID0gKElOVCkgcEJzcy0+VmFySUVMZW47CisKKwl3aGlsZSAoTGVuZ3RoID4gMCkKKwl7CisJCS8vIFBhcnNlIGNpcGhlciBzdWl0ZSBiYXNlIG9uIFdQQTEgJiBXUEEyLCB0aGV5IHNob3VsZCBiZSBwYXJzZWQgZGlmZmVyZW50bHkKKwkJcFRtcCA9ICgoUFVDSEFSKSBwQnNzLT5WYXJJRXMpICsgcEJzcy0+VmFySUVMZW4gLSBMZW5ndGg7CisJCXBFaWQgPSAoUEVJRF9TVFJVQ1QpIHBUbXA7CisJCXN3aXRjaCAocEVpZC0+RWlkKQorCQl7CisJCQljYXNlIElFX1dQQToKKwkJCQkvL1BhcnNlIENpc2NvIElFX1dQQSAoTEVBUCwgQ0NLTSwgZXRjLikKKwkJCQlpZiAoIE5kaXNFcXVhbE1lbW9yeSgocFRtcCs4KSwgQ0lTQ09fT1VJLCAzKSkKKwkJCQl7CisJCQkJCXBUbXAgICArPSAxMTsKKwkJCQkJc3dpdGNoICgqcFRtcCkKKwkJCQkJeworCQkJCQkJY2FzZSAxOgorCQkJCQkJY2FzZSA1OgkvLyBBbHRob3VnaCBXRVAgaXMgbm90IGFsbG93ZWQgaW4gV1BBIHJlbGF0ZWQgYXV0aCBtb2RlLCB3ZSBwYXJzZSBpdCBhbnl3YXkKKwkJCQkJCQlwQnNzLT5XZXBTdGF0dXMgPSBOZGlzODAyXzExRW5jcnlwdGlvbjFFbmFibGVkOworCQkJCQkJCXBCc3MtPldQQS5QYWlyQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb24xRW5hYmxlZDsKKwkJCQkJCQlwQnNzLT5XUEEuR3JvdXBDaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbjFFbmFibGVkOworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSAyOgorCQkJCQkJCXBCc3MtPldlcFN0YXR1cyA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ7CisJCQkJCQkJcEJzcy0+V1BBLlBhaXJDaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbjFFbmFibGVkOworCQkJCQkJCXBCc3MtPldQQS5Hcm91cENpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMUVuYWJsZWQ7CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlIDQ6CisJCQkJCQkJcEJzcy0+V2VwU3RhdHVzID0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZDsKKwkJCQkJCQlwQnNzLT5XUEEuUGFpckNpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMUVuYWJsZWQ7CisJCQkJCQkJcEJzcy0+V1BBLkdyb3VwQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb24xRW5hYmxlZDsKKwkJCQkJCQlicmVhazsKKwkJCQkJCWRlZmF1bHQ6CisJCQkJCQkJYnJlYWs7CisJCQkJCX0KKworCQkJCQkvLyBpZiBDaXNjbyBJRV9XUEEsIGJyZWFrCisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQllbHNlIGlmIChOZGlzRXF1YWxNZW1vcnkocEVpZC0+T2N0ZXQsIFNFU19PVUksIDMpICYmIChwRWlkLT5MZW4gPT0gNykpCisJCQkJeworCQkJCQlwQnNzLT5iU0VTID0gVFJVRTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWVsc2UgaWYgKE5kaXNFcXVhbE1lbW9yeShwRWlkLT5PY3RldCwgV1BBX09VSSwgNCkgIT0gMSkKKwkJCQl7CisJCQkJCS8vIGlmIHVuc3VwcG9ydGVkIHZlbmRvciBzcGVjaWZpYyBJRQorCQkJCQlicmVhazsKKwkJCQl9CisJCQkJLy8gU2tpcCBPVUksIHZlcnNpb24sIGFuZCBtdWx0aWNhc3Qgc3VpdGUKKwkJCQkvLyBUaGlzIHBhcnQgc2hvdWxkIGJlIGltcHJvdmVkIGluIHRoZSBmdXR1cmUgd2hlbiBBUCBzdXBwb3J0ZWQgbXVsdGlwbGUgY2lwaGVyIHN1aXRlLgorCQkJCS8vIEZvciBub3csIGl0J3MgT0sgc2luY2UgYWxtb3N0IGFsbCBBUHMgaGF2ZSBmaXhlZCBjaXBoZXIgc3VpdGUgc3VwcG9ydGVkLgorCQkJCS8vIHBUbXAgPSAoUFVDSEFSKSBwRWlkLT5PY3RldDsKKwkJCQlwVG1wICAgKz0gMTE7CisKKwkJCQkvLyBDaXBoZXIgU3VpdGUgU2VsZWN0b3JzIGZyb20gU3BlYyBQODAyLjExaS9EMy4yIFAyNi4KKwkJCQkvLwlWYWx1ZQkgICBNZWFuaW5nCisJCQkJLy8JMAkJCU5vbmUKKwkJCQkvLwkxCQkJV0VQLTQwCisJCQkJLy8JMgkJCVRraXAKKwkJCQkvLwkzCQkJV1JBUAorCQkJCS8vCTQJCQlBRVMKKwkJCQkvLwk1CQkJV0VQLTEwNAorCQkJCS8vIFBhcnNlIGdyb3VwIGNpcGhlcgorCQkJCXN3aXRjaCAoKnBUbXApCisJCQkJeworCQkJCQljYXNlIDE6CisJCQkJCWNhc2UgNToJLy8gQWx0aG91Z2ggV0VQIGlzIG5vdCBhbGxvd2VkIGluIFdQQSByZWxhdGVkIGF1dGggbW9kZSwgd2UgcGFyc2UgaXQgYW55d2F5CisJCQkJCQlwQnNzLT5XUEEuR3JvdXBDaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbjFFbmFibGVkOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgMjoKKwkJCQkJCXBCc3MtPldQQS5Hcm91cENpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSA0OgorCQkJCQkJcEJzcy0+V1BBLkdyb3VwQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZDsKKwkJCQkJCWJyZWFrOworCQkJCQlkZWZhdWx0OgorCQkJCQkJYnJlYWs7CisJCQkJfQorCQkJCS8vIG51bWJlciBvZiB1bmljYXN0IHN1aXRlCisJCQkJcFRtcCAgICs9IDE7CisKKwkJCQkvLyBza2lwIGFsbCB1bmljYXN0IGNpcGhlciBzdWl0ZXMKKwkJCQkvL0NvdW50ID0gKihQVVNIT1JUKSBwVG1wOworCQkJCUNvdW50ID0gKHBUbXBbMV08PDgpICsgcFRtcFswXTsKKwkJCQlwVG1wICAgKz0gc2l6ZW9mKFVTSE9SVCk7CisKKwkJCQkvLyBQYXJzaW5nIGFsbCB1bmljYXN0IGNpcGhlciBzdWl0ZQorCQkJCXdoaWxlIChDb3VudCA+IDApCisJCQkJeworCQkJCQkvLyBTa2lwIE9VSQorCQkJCQlwVG1wICs9IDM7CisJCQkJCVRtcENpcGhlciA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKKwkJCQkJc3dpdGNoICgqcFRtcCkKKwkJCQkJeworCQkJCQkJY2FzZSAxOgorCQkJCQkJY2FzZSA1OiAvLyBBbHRob3VnaCBXRVAgaXMgbm90IGFsbG93ZWQgaW4gV1BBIHJlbGF0ZWQgYXV0aCBtb2RlLCB3ZSBwYXJzZSBpdCBhbnl3YXkKKwkJCQkJCQlUbXBDaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbjFFbmFibGVkOworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSAyOgorCQkJCQkJCVRtcENpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ7CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlIDQ6CisJCQkJCQkJVG1wQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZDsKKwkJCQkJCQlicmVhazsKKwkJCQkJCWRlZmF1bHQ6CisJCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJaWYgKFRtcENpcGhlciA+IHBCc3MtPldQQS5QYWlyQ2lwaGVyKQorCQkJCQl7CisJCQkJCQkvLyBNb3ZlIHRoZSBsb3dlciBjaXBoZXIgc3VpdGUgdG8gUGFpckNpcGhlckF1eAorCQkJCQkJcEJzcy0+V1BBLlBhaXJDaXBoZXJBdXggPSBwQnNzLT5XUEEuUGFpckNpcGhlcjsKKwkJCQkJCXBCc3MtPldQQS5QYWlyQ2lwaGVyCT0gVG1wQ2lwaGVyOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJcEJzcy0+V1BBLlBhaXJDaXBoZXJBdXggPSBUbXBDaXBoZXI7CisJCQkJCX0KKwkJCQkJcFRtcCsrOworCQkJCQlDb3VudC0tOworCQkJCX0KKworCQkJCS8vIDQuIGdldCBBS00gc3VpdGUgY291bnRzCisJCQkJLy9Db3VudAk9ICooUFVTSE9SVCkgcFRtcDsKKwkJCQlDb3VudCA9IChwVG1wWzFdPDw4KSArIHBUbXBbMF07CisJCQkJcFRtcCAgICs9IHNpemVvZihVU0hPUlQpOworCQkJCXBUbXAgICArPSAzOworCisJCQkJc3dpdGNoICgqcFRtcCkKKwkJCQl7CisJCQkJCWNhc2UgMToKKwkJCQkJCS8vIFNldCBBUCBzdXBwb3J0IFdQQSBtb2RlCisJCQkJCQlpZiAocEJzcy0+QXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlT3BlbikKKwkJCQkJCQlwQnNzLT5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTsKKwkJCQkJCWVsc2UKKwkJCQkJCQlwQnNzLT5BdXRoTW9kZUF1eCA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIDI6CisJCQkJCQkvLyBTZXQgQVAgc3VwcG9ydCBXUEEgbW9kZQorCQkJCQkJaWYgKHBCc3MtPkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZU9wZW4pCisJCQkJCQkJcEJzcy0+QXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0s7CisJCQkJCQllbHNlCisJCQkJCQkJcEJzcy0+QXV0aE1vZGVBdXggPSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0s7CisJCQkJCQlicmVhazsKKwkJCQkJZGVmYXVsdDoKKwkJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlwVG1wICAgKz0gMTsKKworCQkJCS8vIEZpeGVkIGZvciBXUEEtTm9uZQorCQkJCWlmIChwQnNzLT5Cc3NUeXBlID09IEJTU19BREhPQykKKwkJCQl7CisJCQkJCXBCc3MtPkF1dGhNb2RlCSAgPSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lOworCQkJCQlwQnNzLT5BdXRoTW9kZUF1eCA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmU7CisJCQkJCXBCc3MtPldlcFN0YXR1cyAgID0gcEJzcy0+V1BBLkdyb3VwQ2lwaGVyOworCQkJCQkvLyBQYXRjaGVkIGJ1Z3MgZm9yIG9sZCBkcml2ZXIKKwkJCQkJaWYgKHBCc3MtPldQQS5QYWlyQ2lwaGVyQXV4ID09IE5kaXM4MDJfMTFXRVBEaXNhYmxlZCkKKwkJCQkJCXBCc3MtPldQQS5QYWlyQ2lwaGVyQXV4ID0gcEJzcy0+V1BBLkdyb3VwQ2lwaGVyOworCQkJCX0KKwkJCQllbHNlCisJCQkJCXBCc3MtPldlcFN0YXR1cyAgID0gcEJzcy0+V1BBLlBhaXJDaXBoZXI7CisKKwkJCQkvLyBDaGVjayB0aGUgUGFpciAmIEdyb3VwLCBpZiBkaWZmZXJlbnQsIHR1cm4gb24gbWl4ZWQgbW9kZSBmbGFnCisJCQkJaWYgKHBCc3MtPldQQS5Hcm91cENpcGhlciAhPSBwQnNzLT5XUEEuUGFpckNpcGhlcikKKwkJCQkJcEJzcy0+V1BBLmJNaXhNb2RlID0gVFJVRTsKKworCQkJCWJyZWFrOworCisJCQljYXNlIElFX1JTTjoKKwkJCQlwUnNuSGVhZGVyID0gKFBSU05fSUVfSEVBREVSX1NUUlVDVCkgcFRtcDsKKworCQkJCS8vIDAuIFZlcnNpb24gbXVzdCBiZSAxCisJCQkJaWYgKGxlMmNwdTE2KHBSc25IZWFkZXItPlZlcnNpb24pICE9IDEpCisJCQkJCWJyZWFrOworCQkJCXBUbXAgICArPSBzaXplb2YoUlNOX0lFX0hFQURFUl9TVFJVQ1QpOworCisJCQkJLy8gMS4gQ2hlY2sgZ3JvdXAgY2lwaGVyCisJCQkJcENpcGhlciA9IChQQ0lQSEVSX1NVSVRFX1NUUlVDVCkgcFRtcDsKKwkJCQlpZiAoIVJUTVBFcXVhbE1lbW9yeShwVG1wLCBSU05fT1VJLCAzKSkKKwkJCQkJYnJlYWs7CisKKwkJCQkvLyBQYXJzZSBncm91cCBjaXBoZXIKKwkJCQlzd2l0Y2ggKHBDaXBoZXItPlR5cGUpCisJCQkJeworCQkJCQljYXNlIDE6CisJCQkJCWNhc2UgNToJLy8gQWx0aG91Z2ggV0VQIGlzIG5vdCBhbGxvd2VkIGluIFdQQSByZWxhdGVkIGF1dGggbW9kZSwgd2UgcGFyc2UgaXQgYW55d2F5CisJCQkJCQlwQnNzLT5XUEEyLkdyb3VwQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb24xRW5hYmxlZDsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIDI6CisJCQkJCQlwQnNzLT5XUEEyLkdyb3VwQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZDsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIDQ6CisJCQkJCQlwQnNzLT5XUEEyLkdyb3VwQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZDsKKwkJCQkJCWJyZWFrOworCQkJCQlkZWZhdWx0OgorCQkJCQkJYnJlYWs7CisJCQkJfQorCQkJCS8vIHNldCB0byBjb3JyZWN0IG9mZnNldCBmb3IgbmV4dCBwYXJzaW5nCisJCQkJcFRtcCAgICs9IHNpemVvZihDSVBIRVJfU1VJVEVfU1RSVUNUKTsKKworCQkJCS8vIDIuIEdldCBwYWlyd2lzZSBjaXBoZXIgY291bnRzCisJCQkJLy9Db3VudCA9ICooUFVTSE9SVCkgcFRtcDsKKwkJCQlDb3VudCA9IChwVG1wWzFdPDw4KSArIHBUbXBbMF07CisJCQkJcFRtcCAgICs9IHNpemVvZihVU0hPUlQpOworCisJCQkJLy8gMy4gR2V0IHBhaXJ3aXNlIGNpcGhlcgorCQkJCS8vIFBhcnNpbmcgYWxsIHVuaWNhc3QgY2lwaGVyIHN1aXRlCisJCQkJd2hpbGUgKENvdW50ID4gMCkKKwkJCQl7CisJCQkJCS8vIFNraXAgT1VJCisJCQkJCXBDaXBoZXIgPSAoUENJUEhFUl9TVUlURV9TVFJVQ1QpIHBUbXA7CisJCQkJCVRtcENpcGhlciA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKKwkJCQkJc3dpdGNoIChwQ2lwaGVyLT5UeXBlKQorCQkJCQl7CisJCQkJCQljYXNlIDE6CisJCQkJCQljYXNlIDU6IC8vIEFsdGhvdWdoIFdFUCBpcyBub3QgYWxsb3dlZCBpbiBXUEEgcmVsYXRlZCBhdXRoIG1vZGUsIHdlIHBhcnNlIGl0IGFueXdheQorCQkJCQkJCVRtcENpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMUVuYWJsZWQ7CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlIDI6CisJCQkJCQkJVG1wQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZDsKKwkJCQkJCQlicmVhazsKKwkJCQkJCWNhc2UgNDoKKwkJCQkJCQlUbXBDaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkOworCQkJCQkJCWJyZWFrOworCQkJCQkJZGVmYXVsdDoKKwkJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQlpZiAoVG1wQ2lwaGVyID4gcEJzcy0+V1BBMi5QYWlyQ2lwaGVyKQorCQkJCQl7CisJCQkJCQkvLyBNb3ZlIHRoZSBsb3dlciBjaXBoZXIgc3VpdGUgdG8gUGFpckNpcGhlckF1eAorCQkJCQkJcEJzcy0+V1BBMi5QYWlyQ2lwaGVyQXV4ID0gcEJzcy0+V1BBMi5QYWlyQ2lwaGVyOworCQkJCQkJcEJzcy0+V1BBMi5QYWlyQ2lwaGVyCSA9IFRtcENpcGhlcjsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCXBCc3MtPldQQTIuUGFpckNpcGhlckF1eCA9IFRtcENpcGhlcjsKKwkJCQkJfQorCQkJCQlwVG1wICs9IHNpemVvZihDSVBIRVJfU1VJVEVfU1RSVUNUKTsKKwkJCQkJQ291bnQtLTsKKwkJCQl9CisKKwkJCQkvLyA0LiBnZXQgQUtNIHN1aXRlIGNvdW50cworCQkJCS8vQ291bnQJPSAqKFBVU0hPUlQpIHBUbXA7CisJCQkJQ291bnQgPSAocFRtcFsxXTw8OCkgKyBwVG1wWzBdOworCQkJCXBUbXAgICArPSBzaXplb2YoVVNIT1JUKTsKKworCQkJCS8vIDUuIEdldCBBS00gY2lwaGVycworCQkJCXBBS00gPSAoUEFLTV9TVUlURV9TVFJVQ1QpIHBUbXA7CisJCQkJaWYgKCFSVE1QRXF1YWxNZW1vcnkocFRtcCwgUlNOX09VSSwgMykpCisJCQkJCWJyZWFrOworCisJCQkJc3dpdGNoIChwQUtNLT5UeXBlKQorCQkJCXsKKwkJCQkJY2FzZSAxOgorCQkJCQkJLy8gU2V0IEFQIHN1cHBvcnQgV1BBIG1vZGUKKwkJCQkJCWlmIChwQnNzLT5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVPcGVuKQorCQkJCQkJCXBCc3MtPkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMjsKKwkJCQkJCWVsc2UKKwkJCQkJCQlwQnNzLT5BdXRoTW9kZUF1eCA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTI7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSAyOgorCQkJCQkJLy8gU2V0IEFQIHN1cHBvcnQgV1BBIG1vZGUKKwkJCQkJCWlmIChwQnNzLT5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVPcGVuKQorCQkJCQkJCXBCc3MtPkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSzsKKwkJCQkJCWVsc2UKKwkJCQkJCQlwQnNzLT5BdXRoTW9kZUF1eCA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0s7CisJCQkJCQlicmVhazsKKwkJCQkJZGVmYXVsdDoKKwkJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlwVG1wICAgKz0gKENvdW50ICogc2l6ZW9mKEFLTV9TVUlURV9TVFJVQ1QpKTsKKworCQkJCS8vIEZpeGVkIGZvciBXUEEtTm9uZQorCQkJCWlmIChwQnNzLT5Cc3NUeXBlID09IEJTU19BREhPQykKKwkJCQl7CisJCQkJCXBCc3MtPkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZTsKKwkJCQkJcEJzcy0+QXV0aE1vZGVBdXggPSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lOworCQkJCQlwQnNzLT5XUEEuUGFpckNpcGhlckF1eCA9IHBCc3MtPldQQTIuUGFpckNpcGhlckF1eDsKKwkJCQkJcEJzcy0+V1BBLkdyb3VwQ2lwaGVyCT0gcEJzcy0+V1BBMi5Hcm91cENpcGhlcjsKKwkJCQkJcEJzcy0+V2VwU3RhdHVzIAkJPSBwQnNzLT5XUEEuR3JvdXBDaXBoZXI7CisJCQkJCS8vIFBhdGNoZWQgYnVncyBmb3Igb2xkIGRyaXZlcgorCQkJCQlpZiAocEJzcy0+V1BBLlBhaXJDaXBoZXJBdXggPT0gTmRpczgwMl8xMVdFUERpc2FibGVkKQorCQkJCQkJcEJzcy0+V1BBLlBhaXJDaXBoZXJBdXggPSBwQnNzLT5XUEEuR3JvdXBDaXBoZXI7CisJCQkJfQorCQkJCXBCc3MtPldlcFN0YXR1cyAgID0gcEJzcy0+V1BBMi5QYWlyQ2lwaGVyOworCisJCQkJLy8gNi4gR2V0IFJTTiBjYXBhYmlsaXR5CisJCQkJLy9wQnNzLT5XUEEyLlJzbkNhcGFiaWxpdHkgPSAqKFBVU0hPUlQpIHBUbXA7CisJCQkJcEJzcy0+V1BBMi5Sc25DYXBhYmlsaXR5ID0gKHBUbXBbMV08PDgpICsgcFRtcFswXTsKKwkJCQlwVG1wICs9IHNpemVvZihVU0hPUlQpOworCisJCQkJLy8gQ2hlY2sgdGhlIFBhaXIgJiBHcm91cCwgaWYgZGlmZmVyZW50LCB0dXJuIG9uIG1peGVkIG1vZGUgZmxhZworCQkJCWlmIChwQnNzLT5XUEEyLkdyb3VwQ2lwaGVyICE9IHBCc3MtPldQQTIuUGFpckNpcGhlcikKKwkJCQkJcEJzcy0+V1BBMi5iTWl4TW9kZSA9IFRSVUU7CisKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJYnJlYWs7CisJCX0KKwkJTGVuZ3RoIC09IChwRWlkLT5MZW4gKyAyKTsKKwl9Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIG1hY190YWJsZS5jCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKy8qISBcYnJpZWYgZ2VuZXJhdGVzIGEgcmFuZG9tIG1hYyBhZGRyZXNzIHZhbHVlIGZvciBJQlNTIEJTU0lECisgKglccGFyYW0gQWRkciB0aGUgYnNzaWQgbG9jYXRpb24KKyAqCVxyZXR1cm4gbm9uZQorICoJXHByZQorICoJXHBvc3QKKyAqLworVk9JRCBNYWNBZGRyUmFuZG9tQnNzaWQoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJT1VUIFBVQ0hBUiBwQWRkcikKK3sKKwlJTlQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBNQUNfQUREUl9MRU47IGkrKykKKwl7CisJCXBBZGRyW2ldID0gUmFuZG9tQnl0ZShwQWQpOworCX0KKworCXBBZGRyWzBdID0gKHBBZGRyWzBdICYgMHhmZSkgfCAweDAyOyAgLy8gdGhlIGZpcnN0IDIgYml0cyBtdXN0IGJlIDAxeHh4eHh4eHgKK30KKworLyohIFxicmllZiBpbml0IHRoZSBtYW5hZ2VtZW50IG1hYyBmcmFtZSBoZWFkZXIKKyAqCVxwYXJhbSBwX2hkciBtYWMgaGVhZGVyCisgKglccGFyYW0gc3VidHlwZSBzdWJ0eXBlIG9mIHRoZSBmcmFtZQorICoJXHBhcmFtIHBfZHMgZGVzdGluYXRpb24gYWRkcmVzcywgZG9uJ3QgY2FyZSBpZiBpdCBpcyBhIGJyb2FkY2FzdCBhZGRyZXNzCisgKglccmV0dXJuIG5vbmUKKyAqCVxwcmUgdGhlIHN0YXRpb24gaGFzIHRoZSBmb2xsb3dpbmcgaW5mb3JtYXRpb24gaW4gdGhlIHBBZC0+U3RhQ2ZnCisgKgkgLSBic3NpZAorICoJIC0gc3RhdGlvbiBhZGRyZXNzCisgKglccG9zdAorICoJXG5vdGUgdGhpcyBmdW5jdGlvbiBpbml0aWFsaXplcyB0aGUgZm9sbG93aW5nIGZpZWxkCisKKyBJUlFMID0gUEFTU0lWRV9MRVZFTAorIElSUUwgPSBESVNQQVRDSF9MRVZFTAorCisgKi8KK1ZPSUQgTWd0TWFjSGVhZGVySW5pdCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiBPVVQgUEhFQURFUl84MDJfMTEgcEhkcjgwMjExLAorCUlOIFVDSEFSIFN1YlR5cGUsCisJSU4gVUNIQVIgVG9EcywKKwlJTiBQVUNIQVIgcERBLAorCUlOIFBVQ0hBUiBwQnNzaWQpCit7CisJTmRpc1plcm9NZW1vcnkocEhkcjgwMjExLCBzaXplb2YoSEVBREVSXzgwMl8xMSkpOworCisJcEhkcjgwMjExLT5GQy5UeXBlID0gQlRZUEVfTUdNVDsKKwlwSGRyODAyMTEtPkZDLlN1YlR5cGUgPSBTdWJUeXBlOworCXBIZHI4MDIxMS0+RkMuVG9EcyA9IFRvRHM7CisJQ09QWV9NQUNfQUREUihwSGRyODAyMTEtPkFkZHIxLCBwREEpOworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCUNPUFlfTUFDX0FERFIocEhkcjgwMjExLT5BZGRyMiwgcEFkLT5DdXJyZW50QWRkcmVzcyk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJQ09QWV9NQUNfQUREUihwSGRyODAyMTEtPkFkZHIzLCBwQnNzaWQpOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBtZW1fbWdtdC5jCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKy8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVGhpcyByb3V0aW5lIGJ1aWxkIGFuIG91dGdvaW5nIGZyYW1lLCBhbmQgZmlsbCBhbGwgaW5mb3JtYXRpb24gc3BlY2lmaWVkCisgKiBpbiBhcmd1bWVudCBsaXN0IHRvIHRoZSBmcmFtZSBib2R5LiBUaGUgYWN0dWFsIGZyYW1lIHNpemUgaXMgdGhlIHN1bW1hdGlvbgorICogb2YgYWxsIGFyZ3VtZW50cy4KKyAqIGlucHV0IHBhcmFtczoKKyAqCQlCdWZmZXIgLSBwb2ludGVyIHRvIGEgcHJlLWFsbG9jYXRlZCBtZW1vcnkgc2VnbWVudAorICoJCWFyZ3MgLSBhIGxpc3Qgb2YgPGludCBhcmdfc2l6ZSwgYXJnPiBwYWlycy4KKyAqCQlOT1RFIE5PVEUgTk9URSEhISEgdGhlIGxhc3QgYXJndW1lbnQgbXVzdCBiZSBOVUxMLCBvdGhlcndpc2UgdGhpcworICoJCQkJCQkgICBmdW5jdGlvbiB3aWxsIEZBSUwhISEKKyAqIHJldHVybjoKKyAqCQlTaXplIG9mIHRoZSBidWZmZXIKKyAqIHVzYWdlOgorICoJCU1ha2VPdXRnb2luZ0ZyYW1lKEJ1ZmZlciwgb3V0cHV0X2xlbmd0aCwgMiwgJmZjLCAyLCAmZHVyLCA2LCBwX2FkZHIxLCA2LHBfYWRkcjIsIEVORF9PRl9BUkdTKTsKKworIElSUUwgPSBQQVNTSVZFX0xFVkVMCisgSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworVUxPTkcgTWFrZU91dGdvaW5nRnJhbWUoCisJT1VUIENIQVIgKkJ1ZmZlciwKKwlPVVQgVUxPTkcgKkZyYW1lTGVuLCAuLi4pCit7CisJQ0hBUiAgICpwOworCWludCAJbGVuZzsKKwlVTE9ORwlUb3RMZW5nOworCXZhX2xpc3QgQXJnczsKKworCS8vIGNhbGN1bGF0ZXMgdGhlIHRvdGFsIGxlbmd0aAorCVRvdExlbmcgPSAwOworCXZhX3N0YXJ0KEFyZ3MsIEZyYW1lTGVuKTsKKwlkbworCXsKKwkJbGVuZyA9IHZhX2FyZyhBcmdzLCBpbnQpOworCQlpZiAobGVuZyA9PSBFTkRfT0ZfQVJHUykKKwkJeworCQkJYnJlYWs7CisJCX0KKwkJcCA9IHZhX2FyZyhBcmdzLCBQVk9JRCk7CisJCU5kaXNNb3ZlTWVtb3J5KCZCdWZmZXJbVG90TGVuZ10sIHAsIGxlbmcpOworCQlUb3RMZW5nID0gVG90TGVuZyArIGxlbmc7CisJfSB3aGlsZShUUlVFKTsKKworCXZhX2VuZChBcmdzKTsgLyogY2xlYW4gdXAgKi8KKwkqRnJhbWVMZW4gPSBUb3RMZW5nOworCXJldHVybiBUb3RMZW5nOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBtbG1lX3F1ZXVlLmMKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLyohIFxicmllZglJbml0aWFsaXplIFRoZSBNTE1FIFF1ZXVlLCB1c2VkIGJ5IE1MTUUgRnVuY3Rpb25zCisgKglccGFyYW0JKlF1ZXVlCSAgIFRoZSBNTE1FIFF1ZXVlCisgKglccmV0dXJuIEFsd2F5cwkgICBSZXR1cm4gTkRJU19TVEFURV9TVUNDRVNTIGluIHRoaXMgaW1wbGVtZW50YXRpb24KKyAqCVxwcmUKKyAqCVxwb3N0CisgKglcbm90ZQlCZWNhdXNlIHRoaXMgaXMgZG9uZSBvbmx5IG9uY2UgKGF0IHRoZSBpbml0IHN0YWdlKSwgbm8gbmVlZCB0byBiZSBsb2NrZWQKKworIElSUUwgPSBQQVNTSVZFX0xFVkVMCisKKyAqLworTkRJU19TVEFUVVMgTWxtZVF1ZXVlSW5pdCgKKwlJTiBNTE1FX1FVRVVFICpRdWV1ZSkKK3sKKwlJTlQgaTsKKworCU5kaXNBbGxvY2F0ZVNwaW5Mb2NrKCZRdWV1ZS0+TG9jayk7CisKKwlRdWV1ZS0+TnVtCT0gMDsKKwlRdWV1ZS0+SGVhZCA9IDA7CisJUXVldWUtPlRhaWwgPSAwOworCisJZm9yIChpID0gMDsgaSA8IE1BWF9MRU5fT0ZfTUxNRV9RVUVVRTsgaSsrKQorCXsKKwkJUXVldWUtPkVudHJ5W2ldLk9jY3VwaWVkID0gRkFMU0U7CisJCVF1ZXVlLT5FbnRyeVtpXS5Nc2dMZW4gPSAwOworCQlOZGlzWmVyb01lbW9yeShRdWV1ZS0+RW50cnlbaV0uTXNnLCBNR01UX0RNQV9CVUZGRVJfU0laRSk7CisJfQorCisJcmV0dXJuIE5ESVNfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qISBcYnJpZWYJIEVucXVldWUgYSBtZXNzYWdlIGZvciBvdGhlciB0aHJlYWRzLCBpZiB0aGV5IHdhbnQgdG8gc2VuZCBtZXNzYWdlcyB0byBNTE1FIHRocmVhZAorICoJXHBhcmFtCSpRdWV1ZQkgIFRoZSBNTE1FIFF1ZXVlCisgKglccGFyYW0JIE1hY2hpbmUgIFRoZSBTdGF0ZSBNYWNoaW5lIElkCisgKglccGFyYW0JIE1zZ1R5cGUgIFRoZSBNZXNzYWdlIFR5cGUKKyAqCVxwYXJhbQkgTXNnTGVuICAgVGhlIE1lc3NhZ2UgbGVuZ3RoCisgKglccGFyYW0JKk1zZwkgIFRoZSBtZXNzYWdlIHBvaW50ZXIKKyAqCVxyZXR1cm4gIFRSVUUgaWYgZW5xdWV1ZSBpcyBzdWNjZXNzZnVsLCBGQUxTRSBpZiB0aGUgcXVldWUgaXMgZnVsbAorICoJXHByZQorICoJXHBvc3QKKyAqCVxub3RlCSBUaGUgbWVzc2FnZSBoYXMgdG8gYmUgaW5pdGlhbGl6ZWQKKworIElSUUwgPSBQQVNTSVZFX0xFVkVMCisgSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKyAqLworQk9PTEVBTiBNbG1lRW5xdWV1ZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiBVTE9ORyBNYWNoaW5lLAorCUlOIFVMT05HIE1zZ1R5cGUsCisJSU4gVUxPTkcgTXNnTGVuLAorCUlOIFZPSUQgKk1zZykKK3sKKwlJTlQgVGFpbDsKKwlNTE1FX1FVRVVFCSpRdWV1ZSA9IChNTE1FX1FVRVVFICopJnBBZC0+TWxtZS5RdWV1ZTsKKworCS8vIERvIG5vdGhpbmcgaWYgdGhlIGRyaXZlciBpcyBzdGFydGluZyBoYWx0IHN0YXRlLgorCS8vIFRoaXMgbWlnaHQgaGFwcGVuIHdoZW4gdGltZXIgYWxyZWFkeSBiZWVuIGZpcmVkIGJlZm9yZSBjYW5jZWwgdGltZXIgd2l0aCBtbG1laGFsdAorCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyB8IGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpCisJCXJldHVybiBGQUxTRTsKKworCS8vIEZpcnN0IGNoZWNrIHRoZSBzaXplLCBpdCBNVVNUIG5vdCBleGNlZWQgdGhlIG1sbWUgcXVldWUgc2l6ZQorCWlmIChNc2dMZW4gPiBNR01UX0RNQV9CVUZGRVJfU0laRSkKKwl7CisJCURCR1BSSU5UX0VSUigoIk1sbWVFbnF1ZXVlOiBtc2cgdG9vIGxhcmdlLCBzaXplID0gJWxkIFxuIiwgTXNnTGVuKSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlpZiAoTWxtZVF1ZXVlRnVsbChRdWV1ZSkpCisJeworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJTmRpc0FjcXVpcmVTcGluTG9jaygmKFF1ZXVlLT5Mb2NrKSk7CisJVGFpbCA9IFF1ZXVlLT5UYWlsOworCVF1ZXVlLT5UYWlsKys7CisJUXVldWUtPk51bSsrOworCWlmIChRdWV1ZS0+VGFpbCA9PSBNQVhfTEVOX09GX01MTUVfUVVFVUUpCisJeworCQlRdWV1ZS0+VGFpbCA9IDA7CisJfQorCisJUXVldWUtPkVudHJ5W1RhaWxdLldjaWQgPSBSRVNFUlZFRF9XQ0lEOworCVF1ZXVlLT5FbnRyeVtUYWlsXS5PY2N1cGllZCA9IFRSVUU7CisJUXVldWUtPkVudHJ5W1RhaWxdLk1hY2hpbmUgPSBNYWNoaW5lOworCVF1ZXVlLT5FbnRyeVtUYWlsXS5Nc2dUeXBlID0gTXNnVHlwZTsKKwlRdWV1ZS0+RW50cnlbVGFpbF0uTXNnTGVuICA9IE1zZ0xlbjsKKworCWlmIChNc2cgIT0gTlVMTCkKKwl7CisJCU5kaXNNb3ZlTWVtb3J5KFF1ZXVlLT5FbnRyeVtUYWlsXS5Nc2csIE1zZywgTXNnTGVuKTsKKwl9CisKKwlOZGlzUmVsZWFzZVNwaW5Mb2NrKCYoUXVldWUtPkxvY2spKTsKKwlyZXR1cm4gVFJVRTsKK30KKworLyohIFxicmllZgkgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHdoZW4gUmVjdiBnZXRzIGEgTUxNRSBtZXNzYWdlCisgKglccGFyYW0JKlF1ZXVlCQkJIFRoZSBNTE1FIFF1ZXVlCisgKglccGFyYW0JIFRpbWVTdGFtcEhpZ2gJIFRoZSB1cHBlciAzMiBiaXQgb2YgdGltZXN0YW1wCisgKglccGFyYW0JIFRpbWVTdGFtcExvdwkgVGhlIGxvd2VyIDMyIGJpdCBvZiB0aW1lc3RhbXAKKyAqCVxwYXJhbQkgUnNzaQkJCSBUaGUgcmVjZWl2aW5nIFJTU0kgc3RyZW5ndGgKKyAqCVxwYXJhbQkgTXNnTGVuIAkJIFRoZSBsZW5ndGggb2YgdGhlIG1lc3NhZ2UKKyAqCVxwYXJhbQkqTXNnCQkJIFRoZSBtZXNzYWdlIHBvaW50ZXIKKyAqCVxyZXR1cm4gIFRSVUUgaWYgZXZlcnl0aGluZyBvaywgRkFMU0Ugb3RoZXJ3aXNlIChsaWtlIFF1ZXVlIEZ1bGwpCisgKglccHJlCisgKglccG9zdAorCisgSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKyAqLworQk9PTEVBTiBNbG1lRW5xdWV1ZUZvclJlY3YoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4gVUxPTkcgV2NpZCwKKwlJTiBVTE9ORyBUaW1lU3RhbXBIaWdoLAorCUlOIFVMT05HIFRpbWVTdGFtcExvdywKKwlJTiBVQ0hBUiBSc3NpMCwKKwlJTiBVQ0hBUiBSc3NpMSwKKwlJTiBVQ0hBUiBSc3NpMiwKKwlJTiBVTE9ORyBNc2dMZW4sCisJSU4gVk9JRCAqTXNnLAorCUlOIFVDSEFSIFNpZ25hbCkKK3sKKwlJTlQgCQkgVGFpbCwgTWFjaGluZTsKKwlQRlJBTUVfODAyXzExIHBGcmFtZSA9IChQRlJBTUVfODAyXzExKU1zZzsKKwlJTlQJCSBNc2dUeXBlOworCU1MTUVfUVVFVUUJKlF1ZXVlID0gKE1MTUVfUVVFVUUgKikmcEFkLT5NbG1lLlF1ZXVlOworCisjaWZkZWYgUkFMSU5LX0FURQorCS8qIE5vdGhpbmcgdG8gZG8gaW4gQVRFIG1vZGUgKi8KKwlpZihBVEVfT04ocEFkKSkKKwkJcmV0dXJuIEZBTFNFOworI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKworCS8vIERvIG5vdGhpbmcgaWYgdGhlIGRyaXZlciBpcyBzdGFydGluZyBoYWx0IHN0YXRlLgorCS8vIFRoaXMgbWlnaHQgaGFwcGVuIHdoZW4gdGltZXIgYWxyZWFkeSBiZWVuIGZpcmVkIGJlZm9yZSBjYW5jZWwgdGltZXIgd2l0aCBtbG1laGFsdAorCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyB8IGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpCisJeworCQlEQkdQUklOVF9FUlIoKCJNbG1lRW5xdWV1ZUZvclJlY3Y6IGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTU1xuIikpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJLy8gRmlyc3QgY2hlY2sgdGhlIHNpemUsIGl0IE1VU1Qgbm90IGV4Y2VlZCB0aGUgbWxtZSBxdWV1ZSBzaXplCisJaWYgKE1zZ0xlbiA+IE1HTVRfRE1BX0JVRkZFUl9TSVpFKQorCXsKKwkJREJHUFJJTlRfRVJSKCgiTWxtZUVucXVldWVGb3JSZWN2OiBmcmFtZSB0b28gbGFyZ2UsIHNpemUgPSAlbGQgXG4iLCBNc2dMZW4pKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCWlmIChNbG1lUXVldWVGdWxsKFF1ZXVlKSkKKwl7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCXsKKwkJaWYgKCFNc2dUeXBlU3Vic3QocEFkLCBwRnJhbWUsICZNYWNoaW5lLCAmTXNnVHlwZSkpCisJCXsKKwkJCURCR1BSSU5UX0VSUigoIk1sbWVFbnF1ZXVlRm9yUmVjdjogdW4tcmVjb25nbml6ZWQgbWdtdC0+c3VidHlwZT0lZFxuIixwRnJhbWUtPkhkci5GQy5TdWJUeXBlKSk7CisJCQlyZXR1cm4gRkFMU0U7CisJCX0KKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwkvLyBPSywgd2UgZ290IGFsbCB0aGUgaW5mb3JtYXRpb25zLCBpdCBpcyB0aW1lIHRvIHB1dCB0aGluZ3MgaW50byBxdWV1ZQorCU5kaXNBY3F1aXJlU3BpbkxvY2soJihRdWV1ZS0+TG9jaykpOworCVRhaWwgPSBRdWV1ZS0+VGFpbDsKKwlRdWV1ZS0+VGFpbCsrOworCVF1ZXVlLT5OdW0rKzsKKwlpZiAoUXVldWUtPlRhaWwgPT0gTUFYX0xFTl9PRl9NTE1FX1FVRVVFKQorCXsKKwkJUXVldWUtPlRhaWwgPSAwOworCX0KKwlRdWV1ZS0+RW50cnlbVGFpbF0uT2NjdXBpZWQgPSBUUlVFOworCVF1ZXVlLT5FbnRyeVtUYWlsXS5NYWNoaW5lID0gTWFjaGluZTsKKwlRdWV1ZS0+RW50cnlbVGFpbF0uTXNnVHlwZSA9IE1zZ1R5cGU7CisJUXVldWUtPkVudHJ5W1RhaWxdLk1zZ0xlbiAgPSBNc2dMZW47CisJUXVldWUtPkVudHJ5W1RhaWxdLlRpbWVTdGFtcC51Lkxvd1BhcnQgPSBUaW1lU3RhbXBMb3c7CisJUXVldWUtPkVudHJ5W1RhaWxdLlRpbWVTdGFtcC51LkhpZ2hQYXJ0ID0gVGltZVN0YW1wSGlnaDsKKwlRdWV1ZS0+RW50cnlbVGFpbF0uUnNzaTAgPSBSc3NpMDsKKwlRdWV1ZS0+RW50cnlbVGFpbF0uUnNzaTEgPSBSc3NpMTsKKwlRdWV1ZS0+RW50cnlbVGFpbF0uUnNzaTIgPSBSc3NpMjsKKwlRdWV1ZS0+RW50cnlbVGFpbF0uU2lnbmFsID0gU2lnbmFsOworCVF1ZXVlLT5FbnRyeVtUYWlsXS5XY2lkID0gKFVDSEFSKVdjaWQ7CisKKwlRdWV1ZS0+RW50cnlbVGFpbF0uQ2hhbm5lbCA9IHBBZC0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbDsKKworCWlmIChNc2cgIT0gTlVMTCkKKwl7CisJCU5kaXNNb3ZlTWVtb3J5KFF1ZXVlLT5FbnRyeVtUYWlsXS5Nc2csIE1zZywgTXNnTGVuKTsKKwl9CisKKwlOZGlzUmVsZWFzZVNwaW5Mb2NrKCYoUXVldWUtPkxvY2spKTsKKworCVJUMjhYWF9NTE1FX0hBTkRMRVIocEFkKTsKKworCXJldHVybiBUUlVFOworfQorCisKKy8qISBcYnJpZWYJIERlcXVldWUgYSBtZXNzYWdlIGZyb20gdGhlIE1MTUUgUXVldWUKKyAqCVxwYXJhbQkqUXVldWUJICBUaGUgTUxNRSBRdWV1ZQorICoJXHBhcmFtCSpFbGVtCSAgVGhlIG1lc3NhZ2UgZGVxdWV1ZWQgZnJvbSBNTE1FIFF1ZXVlCisgKglccmV0dXJuICBUUlVFIGlmIHRoZSBFbGVtIGNvbnRhaW5zIHNvbWV0aGluZywgRkFMU0Ugb3RoZXJ3aXNlCisgKglccHJlCisgKglccG9zdAorCisgSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKyAqLworQk9PTEVBTiBNbG1lRGVxdWV1ZSgKKwlJTiBNTE1FX1FVRVVFICpRdWV1ZSwKKwlPVVQgTUxNRV9RVUVVRV9FTEVNICoqRWxlbSkKK3sKKwlOZGlzQWNxdWlyZVNwaW5Mb2NrKCYoUXVldWUtPkxvY2spKTsKKwkqRWxlbSA9ICYoUXVldWUtPkVudHJ5W1F1ZXVlLT5IZWFkXSk7CisJUXVldWUtPk51bS0tOworCVF1ZXVlLT5IZWFkKys7CisJaWYgKFF1ZXVlLT5IZWFkID09IE1BWF9MRU5fT0ZfTUxNRV9RVUVVRSkKKwl7CisJCVF1ZXVlLT5IZWFkID0gMDsKKwl9CisJTmRpc1JlbGVhc2VTcGluTG9jaygmKFF1ZXVlLT5Mb2NrKSk7CisJcmV0dXJuIFRSVUU7Cit9CisKKy8vIElSUUwgPSBESVNQQVRDSF9MRVZFTAorVk9JRAlNbG1lUmVzdGFydFN0YXRlTWFjaGluZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCkKK3sKKyNpZmRlZiBSVDI4NjAKKwlNTE1FX1FVRVVFX0VMRU0JCSpFbGVtID0gTlVMTDsKKyNlbmRpZiAvLyBSVDI4NjAgLy8KKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlCT09MRUFOCQkJCUNhbmNlbGxlZDsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1sbWVSZXN0YXJ0U3RhdGVNYWNoaW5lIFxuIikpOworCisjaWZkZWYgUlQyODYwCisJTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5NbG1lLlRhc2tMb2NrKTsKKwlpZihwQWQtPk1sbWUuYlJ1bm5pbmcpCisJeworCQlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPk1sbWUuVGFza0xvY2spOworCQlyZXR1cm47CisJfQorCWVsc2UKKwl7CisJCXBBZC0+TWxtZS5iUnVubmluZyA9IFRSVUU7CisJfQorCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+TWxtZS5UYXNrTG9jayk7CisKKwkvLyBSZW1vdmUgYWxsIE1sbWUgcXVldWVzIGVsZW1lbnRzCisJd2hpbGUgKCFNbG1lUXVldWVFbXB0eSgmcEFkLT5NbG1lLlF1ZXVlKSkKKwl7CisJCS8vRnJvbSBtZXNzYWdlIHR5cGUsIGRldGVybWluZSB3aGljaCBzdGF0ZSBtYWNoaW5lIEkgc2hvdWxkIGRyaXZlCisJCWlmIChNbG1lRGVxdWV1ZSgmcEFkLT5NbG1lLlF1ZXVlLCAmRWxlbSkpCisJCXsKKwkJCS8vIGZyZWUgTUxNRSBlbGVtZW50CisJCQlFbGVtLT5PY2N1cGllZCA9IEZBTFNFOworCQkJRWxlbS0+TXNnTGVuID0gMDsKKworCQl9CisJCWVsc2UgeworCQkJREJHUFJJTlRfRVJSKCgiTWxtZVJlc3RhcnRTdGF0ZU1hY2hpbmU6IE1sbWVRdWV1ZSBlbXB0eVxuIikpOworCQl9CisJfQorI2VuZGlmIC8vIFJUMjg2MCAvLworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwl7CisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJCVVDSEFSIGk7CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisJCS8vIENhbmNlbCBhbGwgdGltZXIgZXZlbnRzCisJCS8vIEJlIGNhcmVmdWwgdG8gY2FuY2VsIG5ldyBhZGRlZCB0aW1lcgorCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5Bc3NvY1RpbWVyLAkgICZDYW5jZWxsZWQpOworCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5SZWFzc29jVGltZXIsICAgJkNhbmNlbGxlZCk7CisJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LkRpc2Fzc29jVGltZXIsICAmQ2FuY2VsbGVkKTsKKwkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguQXV0aFRpbWVyLAkgICAmQ2FuY2VsbGVkKTsKKwkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguQmVhY29uVGltZXIsCSAgICZDYW5jZWxsZWQpOworCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5TY2FuVGltZXIsCSAgICZDYW5jZWxsZWQpOworCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJCWZvciAoaT0wOyBpPE1BWF9OVU1fT0ZfRExTX0VOVFJZOyBpKyspCisJCXsKKwkJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVGltZXIsICZDYW5jZWxsZWQpOworCQl9CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJLy8gQ2hhbmdlIGJhY2sgdG8gb3JpZ2luYWwgY2hhbm5lbCBpbiBjYXNlIG9mIGRvaW5nIHNjYW4KKwlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwsIEZBTFNFKTsKKwlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKTsKKworCS8vIFJlc3VtZSBNU0RVIHdoaWNoIGlzIHR1cm5lZCBvZmYgZHVybmluZyBzY2FuCisJUlRNUFJlc3VtZU1zZHVUcmFuc21pc3Npb24ocEFkKTsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJeworCQkvLyBTZXQgYWxsIHN0YXRlIG1hY2hpbmVzIGJhY2sgSURMRQorCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlICAgID0gQ05UTF9JRExFOworCQlwQWQtPk1sbWUuQXNzb2NNYWNoaW5lLkN1cnJTdGF0ZSAgID0gQVNTT0NfSURMRTsKKwkJcEFkLT5NbG1lLkF1dGhNYWNoaW5lLkN1cnJTdGF0ZSAgICA9IEFVVEhfUkVRX0lETEU7CisJCXBBZC0+TWxtZS5BdXRoUnNwTWFjaGluZS5DdXJyU3RhdGUgPSBBVVRIX1JTUF9JRExFOworCQlwQWQtPk1sbWUuU3luY01hY2hpbmUuQ3VyclN0YXRlICAgID0gU1lOQ19JRExFOworCQlwQWQtPk1sbWUuQWN0TWFjaGluZS5DdXJyU3RhdGUgICAgPSBBQ1RfSURMRTsKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwkJcEFkLT5NbG1lLkRsc01hY2hpbmUuQ3VyclN0YXRlICAgID0gRExTX0lETEU7CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisjaWZkZWYgUlQyODYwCisJLy8gUmVtb3ZlIHJ1bm5pbmcgc3RhdGUKKwlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPk1sbWUuVGFza0xvY2spOworCXBBZC0+TWxtZS5iUnVubmluZyA9IEZBTFNFOworCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+TWxtZS5UYXNrTG9jayk7CisjZW5kaWYgLy8gUlQyODYwIC8vCit9CisKKy8qISBcYnJpZWYJdGVzdCBpZiB0aGUgTUxNRSBRdWV1ZSBpcyBlbXB0eQorICoJXHBhcmFtCSpRdWV1ZQkgIFRoZSBNTE1FIFF1ZXVlCisgKglccmV0dXJuIFRSVUUgaWYgdGhlIFF1ZXVlIGlzIGVtcHR5LCBGQUxTRSBvdGhlcndpc2UKKyAqCVxwcmUKKyAqCVxwb3N0CisKKyBJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworICovCitCT09MRUFOIE1sbWVRdWV1ZUVtcHR5KAorCUlOIE1MTUVfUVVFVUUgKlF1ZXVlKQoreworCUJPT0xFQU4gQW5zOworCisJTmRpc0FjcXVpcmVTcGluTG9jaygmKFF1ZXVlLT5Mb2NrKSk7CisJQW5zID0gKFF1ZXVlLT5OdW0gPT0gMCk7CisJTmRpc1JlbGVhc2VTcGluTG9jaygmKFF1ZXVlLT5Mb2NrKSk7CisKKwlyZXR1cm4gQW5zOworfQorCisvKiEgXGJyaWVmCSB0ZXN0IGlmIHRoZSBNTE1FIFF1ZXVlIGlzIGZ1bGwKKyAqCVxwYXJhbQkgKlF1ZXVlIAkgVGhlIE1MTUUgUXVldWUKKyAqCVxyZXR1cm4gIFRSVUUgaWYgdGhlIFF1ZXVlIGlzIGVtcHR5LCBGQUxTRSBvdGhlcndpc2UKKyAqCVxwcmUKKyAqCVxwb3N0CisKKyBJUlFMID0gUEFTU0lWRV9MRVZFTAorIElSUUwgPSBESVNQQVRDSF9MRVZFTAorCisgKi8KK0JPT0xFQU4gTWxtZVF1ZXVlRnVsbCgKKwlJTiBNTE1FX1FVRVVFICpRdWV1ZSkKK3sKKwlCT09MRUFOIEFuczsKKworCU5kaXNBY3F1aXJlU3BpbkxvY2soJihRdWV1ZS0+TG9jaykpOworCUFucyA9IChRdWV1ZS0+TnVtID09IE1BWF9MRU5fT0ZfTUxNRV9RVUVVRSB8fCBRdWV1ZS0+RW50cnlbUXVldWUtPlRhaWxdLk9jY3VwaWVkKTsKKwlOZGlzUmVsZWFzZVNwaW5Mb2NrKCYoUXVldWUtPkxvY2spKTsKKworCXJldHVybiBBbnM7Cit9CisKKy8qISBcYnJpZWYJIFRoZSBkZXN0cnVjdG9yIG9mIE1MTUUgUXVldWUKKyAqCVxwYXJhbQorICoJXHJldHVybgorICoJXHByZQorICoJXHBvc3QKKyAqCVxub3RlCUNsZWFyIE1sbWUgUXVldWUsIFNldCBRdWV1ZS0+TnVtIHRvIFplcm8uCisKKyBJUlFMID0gUEFTU0lWRV9MRVZFTAorCisgKi8KK1ZPSUQgTWxtZVF1ZXVlRGVzdHJveSgKKwlJTiBNTE1FX1FVRVVFICpwUXVldWUpCit7CisJTmRpc0FjcXVpcmVTcGluTG9jaygmKHBRdWV1ZS0+TG9jaykpOworCXBRdWV1ZS0+TnVtICA9IDA7CisJcFF1ZXVlLT5IZWFkID0gMDsKKwlwUXVldWUtPlRhaWwgPSAwOworCU5kaXNSZWxlYXNlU3BpbkxvY2soJihwUXVldWUtPkxvY2spKTsKKwlOZGlzRnJlZVNwaW5Mb2NrKCYocFF1ZXVlLT5Mb2NrKSk7Cit9CisKKy8qISBcYnJpZWYJIFRvIHN1YnN0aXR1dGUgdGhlIG1lc3NhZ2UgdHlwZSBpZiB0aGUgbWVzc2FnZSBpcyBjb21pbmcgZnJvbSBleHRlcm5hbAorICoJXHBhcmFtCXBGcmFtZQkJICAgVGhlIGZyYW1lIHJlY2VpdmVkCisgKglccGFyYW0JKk1hY2hpbmUJICAgVGhlIHN0YXRlIG1hY2hpbmUKKyAqCVxwYXJhbQkqTXNnVHlwZQkgICB0aGUgbWVzc2FnZSB0eXBlIGZvciB0aGUgc3RhdGUgbWFjaGluZQorICoJXHJldHVybiBUUlVFIGlmIHRoZSBzdWJzdGl0dXRpb24gaXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlCisgKglccHJlCisgKglccG9zdAorCisgSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKyAqLworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorQk9PTEVBTiBNc2dUeXBlU3Vic3QoCisJSU4gUFJUTVBfQURBUFRFUiAgcEFkLAorCUlOIFBGUkFNRV84MDJfMTEgcEZyYW1lLAorCU9VVCBJTlQgKk1hY2hpbmUsCisJT1VUIElOVCAqTXNnVHlwZSkKK3sKKwlVU0hPUlQJU2VxOworCVVDSEFSCUVBUFR5cGU7CisJUFVDSEFSCXBEYXRhOworCisJLy8gUG9pbnRlciB0byBzdGFydCBvZiBkYXRhIGZyYW1lcyBpbmNsdWRpbmcgU05BUCBoZWFkZXIKKwlwRGF0YSA9IChQVUNIQVIpIHBGcmFtZSArIExFTkdUSF84MDJfMTE7CisKKwkvLyBUaGUgb25seSBkYXRhIHR5cGUgd2lsbCBwYXNzIHRvIHRoaXMgZnVuY3Rpb24gaXMgRUFQT0wgZnJhbWUKKwlpZiAocEZyYW1lLT5IZHIuRkMuVHlwZSA9PSBCVFlQRV9EQVRBKQorCXsKKwkJaWYgKE5kaXNFcXVhbE1lbW9yeShTTkFQX0FJUk9ORVQsIHBEYXRhLCBMRU5HVEhfODAyXzFfSCkpCisJCXsKKwkJCS8vIENpc2NvIEFpcm9uZXQgU05BUCBoZWFkZXIKKwkJCSpNYWNoaW5lID0gQUlST05FVF9TVEFURV9NQUNISU5FOworCQkJKk1zZ1R5cGUgPSBNVDJfQUlST05FVF9NU0c7CisJCQlyZXR1cm4gKFRSVUUpOworCQl9CisjaWZkZWYgTEVBUF9TVVBQT1JUCisJCWlmICggcEFkLT5TdGFDZmcuTGVhcEF1dGhNb2RlID09IENJU0NPX0F1dGhNb2RlTEVBUCApIC8vTEVBUAorCQl7CisJCQkvLyBMRUFQIGZyYW1lcworCQkJKk1hY2hpbmUgPSBMRUFQX1NUQVRFX01BQ0hJTkU7CisJCQlFQVBUeXBlID0gKigoVUNIQVIqKXBGcmFtZSArIExFTkdUSF84MDJfMTEgKyBMRU5HVEhfODAyXzFfSCArIDEpOworCQkJcmV0dXJuIChMZWFwTXNnVHlwZVN1YnN0KEVBUFR5cGUsIE1zZ1R5cGUpKTsKKwkJfQorCQllbHNlCisjZW5kaWYgLy8gTEVBUF9TVVBQT1JUIC8vCisJCXsKKwkJCSpNYWNoaW5lID0gV1BBX1BTS19TVEFURV9NQUNISU5FOworCQkJRUFQVHlwZSA9ICooKFVDSEFSKilwRnJhbWUgKyBMRU5HVEhfODAyXzExICsgTEVOR1RIXzgwMl8xX0ggKyAxKTsKKwkJCXJldHVybihXcGFNc2dUeXBlU3Vic3QoRUFQVHlwZSwgTXNnVHlwZSkpOworCQl9CisJfQorCisJc3dpdGNoIChwRnJhbWUtPkhkci5GQy5TdWJUeXBlKQorCXsKKwkJY2FzZSBTVUJUWVBFX0FTU09DX1JFUToKKwkJCSpNYWNoaW5lID0gQVNTT0NfU1RBVEVfTUFDSElORTsKKwkJCSpNc2dUeXBlID0gTVQyX1BFRVJfQVNTT0NfUkVROworCQkJYnJlYWs7CisJCWNhc2UgU1VCVFlQRV9BU1NPQ19SU1A6CisJCQkqTWFjaGluZSA9IEFTU09DX1NUQVRFX01BQ0hJTkU7CisJCQkqTXNnVHlwZSA9IE1UMl9QRUVSX0FTU09DX1JTUDsKKwkJCWJyZWFrOworCQljYXNlIFNVQlRZUEVfUkVBU1NPQ19SRVE6CisJCQkqTWFjaGluZSA9IEFTU09DX1NUQVRFX01BQ0hJTkU7CisJCQkqTXNnVHlwZSA9IE1UMl9QRUVSX1JFQVNTT0NfUkVROworCQkJYnJlYWs7CisJCWNhc2UgU1VCVFlQRV9SRUFTU09DX1JTUDoKKwkJCSpNYWNoaW5lID0gQVNTT0NfU1RBVEVfTUFDSElORTsKKwkJCSpNc2dUeXBlID0gTVQyX1BFRVJfUkVBU1NPQ19SU1A7CisJCQlicmVhazsKKwkJY2FzZSBTVUJUWVBFX1BST0JFX1JFUToKKwkJCSpNYWNoaW5lID0gU1lOQ19TVEFURV9NQUNISU5FOworCQkJKk1zZ1R5cGUgPSBNVDJfUEVFUl9QUk9CRV9SRVE7CisJCQlicmVhazsKKwkJY2FzZSBTVUJUWVBFX1BST0JFX1JTUDoKKwkJCSpNYWNoaW5lID0gU1lOQ19TVEFURV9NQUNISU5FOworCQkJKk1zZ1R5cGUgPSBNVDJfUEVFUl9QUk9CRV9SU1A7CisJCQlicmVhazsKKwkJY2FzZSBTVUJUWVBFX0JFQUNPTjoKKwkJCSpNYWNoaW5lID0gU1lOQ19TVEFURV9NQUNISU5FOworCQkJKk1zZ1R5cGUgPSBNVDJfUEVFUl9CRUFDT047CisJCQlicmVhazsKKwkJY2FzZSBTVUJUWVBFX0FUSU06CisJCQkqTWFjaGluZSA9IFNZTkNfU1RBVEVfTUFDSElORTsKKwkJCSpNc2dUeXBlID0gTVQyX1BFRVJfQVRJTTsKKwkJCWJyZWFrOworCQljYXNlIFNVQlRZUEVfRElTQVNTT0M6CisJCQkqTWFjaGluZSA9IEFTU09DX1NUQVRFX01BQ0hJTkU7CisJCQkqTXNnVHlwZSA9IE1UMl9QRUVSX0RJU0FTU09DX1JFUTsKKwkJCWJyZWFrOworCQljYXNlIFNVQlRZUEVfQVVUSDoKKwkJCS8vIGdldCB0aGUgc2VxdWVuY2UgbnVtYmVyIGZyb20gcGF5bG9hZCAyNCBNYWMgSGVhZGVyICsgMiBieXRlcyBhbGdvcml0aG0KKwkJCU5kaXNNb3ZlTWVtb3J5KCZTZXEsICZwRnJhbWUtPk9jdGV0WzJdLCBzaXplb2YoVVNIT1JUKSk7CisJCQlpZiAoU2VxID09IDEgfHwgU2VxID09IDMpCisJCQl7CisJCQkJKk1hY2hpbmUgPSBBVVRIX1JTUF9TVEFURV9NQUNISU5FOworCQkJCSpNc2dUeXBlID0gTVQyX1BFRVJfQVVUSF9PREQ7CisJCQl9CisJCQllbHNlIGlmIChTZXEgPT0gMiB8fCBTZXEgPT0gNCkKKwkJCXsKKwkJCQkqTWFjaGluZSA9IEFVVEhfU1RBVEVfTUFDSElORTsKKwkJCQkqTXNnVHlwZSA9IE1UMl9QRUVSX0FVVEhfRVZFTjsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlyZXR1cm4gRkFMU0U7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBTVUJUWVBFX0RFQVVUSDoKKwkJCSpNYWNoaW5lID0gQVVUSF9SU1BfU1RBVEVfTUFDSElORTsKKwkJCSpNc2dUeXBlID0gTVQyX1BFRVJfREVBVVRIOworCQkJYnJlYWs7CisJCWNhc2UgU1VCVFlQRV9BQ1RJT046CisJCQkqTWFjaGluZSA9IEFDVElPTl9TVEFURV9NQUNISU5FOworCQkJLy8gIFNvbWV0aW1lcyBTdGEgd2lsbCByZXR1cm4gd2l0aCBjYXRlZ29yeSBieXRlcyB3aXRoIE1TQiA9IDEsIGlmIHRoZXkgcmVjZWl2ZSBjYXRvZ29yeSBvdXQgb2YgdGhlaXIgc3VwcG9ydAorCQkJaWYgKChwRnJhbWUtPk9jdGV0WzBdJjB4N0YpID4gTUFYX1BFRVJfQ0FURV9NU0cpCisJCQl7CisJCQkJKk1zZ1R5cGUgPSBNVDJfQUNUX0lOVkFMSUQ7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJKk1zZ1R5cGUgPSAocEZyYW1lLT5PY3RldFswXSYweDdGKTsKKwkJCX0KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIEZBTFNFOworCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIFRSVUU7Cit9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIHN0YXRlX21hY2hpbmUuYworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisvKiEgXGJyaWVmIEluaXRpYWxpemUgdGhlIHN0YXRlIG1hY2hpbmUuCisgKglccGFyYW0gKlMJCQlwb2ludGVyIHRvIHRoZSBzdGF0ZSBtYWNoaW5lCisgKglccGFyYW0JVHJhbnMJCVN0YXRlIG1hY2hpbmUgdHJhbnNpdGlvbiBmdW5jdGlvbgorICoJXHBhcmFtCVN0TnIJCW51bWJlciBvZiBzdGF0ZXMKKyAqCVxwYXJhbQlNc2dOcgkJbnVtYmVyIG9mIG1lc3NhZ2VzCisgKglccGFyYW0JRGVmRnVuYyAJZGVmYXVsdCBmdW5jdGlvbiwgd2hlbiB0aGVyZSBpcyBpbnZhbGlkIHN0YXRlL21lc3NhZ2UgY29tYmluYXRpb24KKyAqCVxwYXJhbQlJbml0U3RhdGUJaW5pdGlhbCBzdGF0ZSBvZiB0aGUgc3RhdGUgbWFjaGluZQorICoJXHBhcmFtCUJhc2UJCVN0YXRlTWFjaGluZSBiYXNlLCBpbnRlcm5hbCB1c2Ugb25seQorICoJXHByZSBwX3NtIHNob3VsZCBiZSBhIGxlZ2FsIHBvaW50ZXIKKyAqCVxwb3N0CisKKyBJUlFMID0gUEFTU0lWRV9MRVZFTAorCisgKi8KK1ZPSUQgU3RhdGVNYWNoaW5lSW5pdCgKKwlJTiBTVEFURV9NQUNISU5FICpTLAorCUlOIFNUQVRFX01BQ0hJTkVfRlVOQyBUcmFuc1tdLAorCUlOIFVMT05HIFN0TnIsCisJSU4gVUxPTkcgTXNnTnIsCisJSU4gU1RBVEVfTUFDSElORV9GVU5DIERlZkZ1bmMsCisJSU4gVUxPTkcgSW5pdFN0YXRlLAorCUlOIFVMT05HIEJhc2UpCit7CisJVUxPTkcgaSwgajsKKworCS8vIHNldCBudW1iZXIgb2Ygc3RhdGVzIGFuZCBtZXNzYWdlcworCVMtPk5yU3RhdGUgPSBTdE5yOworCVMtPk5yTXNnICAgPSBNc2dOcjsKKwlTLT5CYXNlICAgID0gQmFzZTsKKworCVMtPlRyYW5zRnVuYyAgPSBUcmFuczsKKworCS8vIGluaXQgYWxsIHN0YXRlIHRyYW5zaXRpb24gdG8gZGVmYXVsdCBmdW5jdGlvbgorCWZvciAoaSA9IDA7IGkgPCBTdE5yOyBpKyspCisJeworCQlmb3IgKGogPSAwOyBqIDwgTXNnTnI7IGorKykKKwkJeworCQkJUy0+VHJhbnNGdW5jW2kgKiBNc2dOciArIGpdID0gRGVmRnVuYzsKKwkJfQorCX0KKworCS8vIHNldCB0aGUgc3RhcnRpbmcgc3RhdGUKKwlTLT5DdXJyU3RhdGUgPSBJbml0U3RhdGU7Cit9CisKKy8qISBcYnJpZWYgVGhpcyBmdW5jdGlvbiBmaWxscyBpbiB0aGUgZnVuY3Rpb24gcG9pbnRlciBpbnRvIHRoZSBjZWxsIGluIHRoZSBzdGF0ZSBtYWNoaW5lCisgKglccGFyYW0gKlMJcG9pbnRlciB0byB0aGUgc3RhdGUgbWFjaGluZQorICoJXHBhcmFtIFN0CXN0YXRlCisgKglccGFyYW0gTXNnCWluY29taW5nIG1lc3NhZ2UKKyAqCVxwYXJhbSBmCXRoZSBmdW5jdGlvbiB0byBiZSBleGVjdXRlZCB3aGVuIChzdGF0ZSwgbWVzc2FnZSkgY29tYmluYXRpb24gb2NjdXJzIGF0IHRoZSBzdGF0ZSBtYWNoaW5lCisgKglccHJlICpTIHNob3VsZCBiZSBhIGxlZ2FsIHBvaW50ZXIgdG8gdGhlIHN0YXRlIG1hY2hpbmUsIHN0LCBtc2csIHNob3VsZCBiZSBhbGwgd2l0aGluIHRoZSByYW5nZSwgQmFzZSBzaG91bGQgYmUgc2V0IGluIHRoZSBpbml0aWFsIHN0YXRlCisgKglccG9zdAorCisgSVJRTCA9IFBBU1NJVkVfTEVWRUwKKworICovCitWT0lEIFN0YXRlTWFjaGluZVNldEFjdGlvbigKKwlJTiBTVEFURV9NQUNISU5FICpTLAorCUlOIFVMT05HIFN0LAorCUlOIFVMT05HIE1zZywKKwlJTiBTVEFURV9NQUNISU5FX0ZVTkMgRnVuYykKK3sKKwlVTE9ORyBNc2dJZHg7CisKKwlNc2dJZHggPSBNc2cgLSBTLT5CYXNlOworCisJaWYgKFN0IDwgUy0+TnJTdGF0ZSAmJiBNc2dJZHggPCBTLT5Ock1zZykKKwl7CisJCS8vIGJvdW5kYXJ5IGNoZWNraW5nIGJlZm9yZSBzZXR0aW5nIHRoZSBhY3Rpb24KKwkJUy0+VHJhbnNGdW5jW1N0ICogUy0+TnJNc2cgKyBNc2dJZHhdID0gRnVuYzsKKwl9Cit9CisKKy8qISBcYnJpZWYJIFRoaXMgZnVuY3Rpb24gZG9lcyB0aGUgc3RhdGUgdHJhbnNpdGlvbgorICoJXHBhcmFtCSAqQWRhcHRlciB0aGUgTklDIGFkYXB0ZXIgcG9pbnRlcgorICoJXHBhcmFtCSAqUyAJICB0aGUgc3RhdGUgbWFjaGluZQorICoJXHBhcmFtCSAqRWxlbQkgIHRoZSBtZXNzYWdlIHRvIGJlIGV4ZWN1dGVkCisgKglccmV0dXJuICAgTm9uZQorCisgSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKyAqLworVk9JRCBTdGF0ZU1hY2hpbmVQZXJmb3JtQWN0aW9uKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOIFNUQVRFX01BQ0hJTkUgKlMsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCSgqKFMtPlRyYW5zRnVuY1tTLT5DdXJyU3RhdGUgKiBTLT5Ock1zZyArIEVsZW0tPk1zZ1R5cGUgLSBTLT5CYXNlXSkpKHBBZCwgRWxlbSk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJVGhlIGRyb3AgZnVuY3Rpb24sIHdoZW4gbWFjaGluZSBleGVjdXRlcyB0aGlzLCB0aGUgbWVzc2FnZSBpcyBzaW1wbHkKKwkJaWdub3JlZC4gVGhpcyBmdW5jdGlvbiBkb2VzIG5vdGhpbmcsIHRoZSBtZXNzYWdlIGlzIGZyZWVkIGluCisJCVN0YXRlTWFjaGluZVBlcmZvcm1BY3Rpb24oKQorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgRHJvcCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIGxmc3IuYworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBMZnNySW5pdCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVTE9ORyBTZWVkKQoreworCWlmIChTZWVkID09IDApCisJCXBBZC0+TWxtZS5TaGlmdFJlZyA9IDE7CisJZWxzZQorCQlwQWQtPk1sbWUuU2hpZnRSZWcgPSBTZWVkOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVUNIQVIgUmFuZG9tQnl0ZSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlVTE9ORyBpOworCVVDSEFSIFIsIFJlc3VsdDsKKworCVIgPSAwOworCisJaWYgKHBBZC0+TWxtZS5TaGlmdFJlZyA9PSAwKQorCU5kaXNHZXRTeXN0ZW1VcFRpbWUoKFVMT05HICopJnBBZC0+TWxtZS5TaGlmdFJlZyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorCXsKKwkJaWYgKHBBZC0+TWxtZS5TaGlmdFJlZyAmIDB4MDAwMDAwMDEpCisJCXsKKwkJCXBBZC0+TWxtZS5TaGlmdFJlZyA9ICgocEFkLT5NbG1lLlNoaWZ0UmVnIF4gTEZTUl9NQVNLKSA+PiAxKSB8IDB4ODAwMDAwMDA7CisJCQlSZXN1bHQgPSAxOworCQl9CisJCWVsc2UKKwkJeworCQkJcEFkLT5NbG1lLlNoaWZ0UmVnID0gcEFkLT5NbG1lLlNoaWZ0UmVnID4+IDE7CisJCQlSZXN1bHQgPSAwOworCQl9CisJCVIgPSAoUiA8PCAxKSB8IFJlc3VsdDsKKwl9CisKKwlyZXR1cm4gUjsKK30KKworVk9JRCBBc2ljVXBkYXRlQXV0b0ZhbGxCYWNrVGFibGUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJcFJhdGVUYWJsZSkKK3sKKwlVQ0hBUgkJCQkJaTsKKwlIVF9GQktfQ0ZHMF9TVFJVQwkJSHRDZmcwOworCUhUX0ZCS19DRkcxX1NUUlVDCQlIdENmZzE7CisJTEdfRkJLX0NGRzBfU1RSVUMJCUxnQ2ZnMDsKKwlMR19GQktfQ0ZHMV9TVFJVQwkJTGdDZmcxOworCVBSVE1QX1RYX1JBVEVfU1dJVENICXBDdXJyVHhSYXRlLCBwTmV4dFR4UmF0ZTsKKworCS8vIHNldCB0byBpbml0aWFsIHZhbHVlCisJSHRDZmcwLndvcmQgPSAweDY1NDMyMTAwOworCUh0Q2ZnMS53b3JkID0gMHhlZGNiYTk4ODsKKwlMZ0NmZzAud29yZCA9IDB4ZWRjYmE5ODg7CisJTGdDZmcxLndvcmQgPSAweDAwMDAyMTAwOworCisJcE5leHRUeFJhdGUgPSAoUFJUTVBfVFhfUkFURV9TV0lUQ0gpcFJhdGVUYWJsZSsxOworCWZvciAoaSA9IDE7IGkgPCAqKChQVUNIQVIpIHBSYXRlVGFibGUpOyBpKyspCisJeworCQlwQ3VyclR4UmF0ZSA9IChQUlRNUF9UWF9SQVRFX1NXSVRDSClwUmF0ZVRhYmxlKzEraTsKKwkJc3dpdGNoIChwQ3VyclR4UmF0ZS0+TW9kZSkKKwkJeworCQkJY2FzZSAwOgkJLy9DQ0sKKwkJCQlicmVhazsKKwkJCWNhc2UgMToJCS8vT0ZETQorCQkJCXsKKwkJCQkJc3dpdGNoKHBDdXJyVHhSYXRlLT5DdXJyTUNTKQorCQkJCQl7CisJCQkJCQljYXNlIDA6CisJCQkJCQkJTGdDZmcwLmZpZWxkLk9GRE1NQ1MwRkJLID0gKHBOZXh0VHhSYXRlLT5Nb2RlID09IE1PREVfT0ZETSkgPyAocE5leHRUeFJhdGUtPkN1cnJNQ1MrOCk6IHBOZXh0VHhSYXRlLT5DdXJyTUNTOworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSAxOgorCQkJCQkJCUxnQ2ZnMC5maWVsZC5PRkRNTUNTMUZCSyA9IChwTmV4dFR4UmF0ZS0+TW9kZSA9PSBNT0RFX09GRE0pID8gKHBOZXh0VHhSYXRlLT5DdXJyTUNTKzgpOiBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKKwkJCQkJCQlicmVhazsKKwkJCQkJCWNhc2UgMjoKKwkJCQkJCQlMZ0NmZzAuZmllbGQuT0ZETU1DUzJGQksgPSAocE5leHRUeFJhdGUtPk1vZGUgPT0gTU9ERV9PRkRNKSA/IChwTmV4dFR4UmF0ZS0+Q3Vyck1DUys4KTogcE5leHRUeFJhdGUtPkN1cnJNQ1M7CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlIDM6CisJCQkJCQkJTGdDZmcwLmZpZWxkLk9GRE1NQ1MzRkJLID0gKHBOZXh0VHhSYXRlLT5Nb2RlID09IE1PREVfT0ZETSkgPyAocE5leHRUeFJhdGUtPkN1cnJNQ1MrOCk6IHBOZXh0VHhSYXRlLT5DdXJyTUNTOworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSA0OgorCQkJCQkJCUxnQ2ZnMC5maWVsZC5PRkRNTUNTNEZCSyA9IChwTmV4dFR4UmF0ZS0+TW9kZSA9PSBNT0RFX09GRE0pID8gKHBOZXh0VHhSYXRlLT5DdXJyTUNTKzgpOiBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKKwkJCQkJCQlicmVhazsKKwkJCQkJCWNhc2UgNToKKwkJCQkJCQlMZ0NmZzAuZmllbGQuT0ZETU1DUzVGQksgPSAocE5leHRUeFJhdGUtPk1vZGUgPT0gTU9ERV9PRkRNKSA/IChwTmV4dFR4UmF0ZS0+Q3Vyck1DUys4KTogcE5leHRUeFJhdGUtPkN1cnJNQ1M7CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlIDY6CisJCQkJCQkJTGdDZmcwLmZpZWxkLk9GRE1NQ1M2RkJLID0gKHBOZXh0VHhSYXRlLT5Nb2RlID09IE1PREVfT0ZETSkgPyAocE5leHRUeFJhdGUtPkN1cnJNQ1MrOCk6IHBOZXh0VHhSYXRlLT5DdXJyTUNTOworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSA3OgorCQkJCQkJCUxnQ2ZnMC5maWVsZC5PRkRNTUNTN0ZCSyA9IChwTmV4dFR4UmF0ZS0+TW9kZSA9PSBNT0RFX09GRE0pID8gKHBOZXh0VHhSYXRlLT5DdXJyTUNTKzgpOiBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKKwkJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCQlicmVhazsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCWNhc2UgMjoJCS8vSFQtTUlYCisJCQljYXNlIDM6CQkvL0hULUdGCisJCQkJeworCQkJCQlpZiAoKHBOZXh0VHhSYXRlLT5Nb2RlID49IE1PREVfSFRNSVgpICYmIChwQ3VyclR4UmF0ZS0+Q3Vyck1DUyAhPSBwTmV4dFR4UmF0ZS0+Q3Vyck1DUykpCisJCQkJCXsKKwkJCQkJCXN3aXRjaChwQ3VyclR4UmF0ZS0+Q3Vyck1DUykKKwkJCQkJCXsKKwkJCQkJCQljYXNlIDA6CisJCQkJCQkJCUh0Q2ZnMC5maWVsZC5IVE1DUzBGQksgPSBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSAxOgorCQkJCQkJCQlIdENmZzAuZmllbGQuSFRNQ1MxRkJLID0gcE5leHRUeFJhdGUtPkN1cnJNQ1M7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgMjoKKwkJCQkJCQkJSHRDZmcwLmZpZWxkLkhUTUNTMkZCSyA9IHBOZXh0VHhSYXRlLT5DdXJyTUNTOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQljYXNlIDM6CisJCQkJCQkJCUh0Q2ZnMC5maWVsZC5IVE1DUzNGQksgPSBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSA0OgorCQkJCQkJCQlIdENmZzAuZmllbGQuSFRNQ1M0RkJLID0gcE5leHRUeFJhdGUtPkN1cnJNQ1M7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgNToKKwkJCQkJCQkJSHRDZmcwLmZpZWxkLkhUTUNTNUZCSyA9IHBOZXh0VHhSYXRlLT5DdXJyTUNTOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQljYXNlIDY6CisJCQkJCQkJCUh0Q2ZnMC5maWVsZC5IVE1DUzZGQksgPSBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSA3OgorCQkJCQkJCQlIdENmZzAuZmllbGQuSFRNQ1M3RkJLID0gcE5leHRUeFJhdGUtPkN1cnJNQ1M7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgODoKKwkJCQkJCQkJSHRDZmcxLmZpZWxkLkhUTUNTOEZCSyA9IHBOZXh0VHhSYXRlLT5DdXJyTUNTOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQljYXNlIDk6CisJCQkJCQkJCUh0Q2ZnMS5maWVsZC5IVE1DUzlGQksgPSBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSAxMDoKKwkJCQkJCQkJSHRDZmcxLmZpZWxkLkhUTUNTMTBGQksgPSBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSAxMToKKwkJCQkJCQkJSHRDZmcxLmZpZWxkLkhUTUNTMTFGQksgPSBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSAxMjoKKwkJCQkJCQkJSHRDZmcxLmZpZWxkLkhUTUNTMTJGQksgPSBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSAxMzoKKwkJCQkJCQkJSHRDZmcxLmZpZWxkLkhUTUNTMTNGQksgPSBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSAxNDoKKwkJCQkJCQkJSHRDZmcxLmZpZWxkLkhUTUNTMTRGQksgPSBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSAxNToKKwkJCQkJCQkJSHRDZmcxLmZpZWxkLkhUTUNTMTVGQksgPSBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJZGVmYXVsdDoKKwkJCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiQXNpY1VwZGF0ZUF1dG9GYWxsQmFja1RhYmxlOiBub3Qgc3VwcG9ydCBDdXJyTUNTPSVkXG4iLCBwQ3VyclR4UmF0ZS0+Q3Vyck1DUykpOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJCWJyZWFrOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQl9CisKKwkJcE5leHRUeFJhdGUgPSBwQ3VyclR4UmF0ZTsKKwl9CisKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBIVF9GQktfQ0ZHMCwgSHRDZmcwLndvcmQpOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIEhUX0ZCS19DRkcxLCBIdENmZzEud29yZCk7CisJUlRNUF9JT19XUklURTMyKHBBZCwgTEdfRkJLX0NGRzAsIExnQ2ZnMC53b3JkKTsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBMR19GQktfQ0ZHMSwgTGdDZmcxLndvcmQpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJU2V0IE1BQyByZWdpc3RlciB2YWx1ZSBhY2NvcmRpbmcgb3BlcmF0aW9uIG1vZGUuCisJCU9wZXJhdGlvbk1vZGUgQU5EIGJOb25HRkV4aXN0IGFyZSBmb3IgTU0gYW5kIEdGIFByb3RlY2l0b24uCisJCUlmIE1NIG9yIEdGIG1hc2sgaXMgbm90IHNldCwgdGhvc2UgcGFzc2luZyBhcmd1bWVudCBkb2Vzbid0IG5vdCB0YWtlIGVmZmVjdC4KKworCQlPcGVyYXRpb24gbW9kZSBtZWFuaW5nOgorCQk9IDAgOiBQdXJlIEhULCBubyBwcmVvdGVjdGlvbi4KKwkJPSAweDAxOyB0aGVyZSBtYXkgYmUgbm9uLUhUIGRldmljZXMgaW4gYm90aCB0aGUgY29udHJvbCBhbmQgZXh0ZW5zaW9uIGNoYW5uZWwsIHByb3RlY3Rpb24gaXMgb3B0aW9uYWwgaW4gQlNTLgorCQk9IDB4MTA6IE5vIFRyYW5zbWlzc2lvbiBpbiA0ME0gaXMgcHJvdGVjdGVkLgorCQk9IDB4MTE6IFRyYW5zbWlzc2lvbiBpbiBib3RoIDQwTSBhbmQgMjBNIHNoYWxsIGJlIHByb3RlY3RlZAorCQlpZiAoYk5vbkdGRXhpc3QpCisJCQl3ZSBzaG91bGQgY2hvb3NlIG5vdCB0byB1c2UgR0YuIEJ1dCBzdGlsbCBzZXQgY29ycmVjdCBBU0lDIHJlZ2lzdGVycy4KKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIAlBc2ljVXBkYXRlUHJvdGVjdCgKKwlJTgkJUFJUTVBfQURBUFRFUglwQWQsCisJSU4gCQlVU0hPUlQJCQlPcGVyYXRpb25Nb2RlLAorCUlOIAkJVUNIQVIJCQlTZXRNYXNrLAorCUlOCQlCT09MRUFOCQkJYkRpc2FibGVCR1Byb3RlY3QsCisJSU4JCUJPT0xFQU4JCQliTm9uR0ZFeGlzdCkKK3sKKwlQUk9UX0NGR19TVFJVQwlQcm90Q2ZnLCBQcm90Q2ZnNDsKKwlVSU5UMzIgUHJvdGVjdFs2XTsKKwlVU0hPUlQJCQlvZmZzZXQ7CisJVUNIQVIJCQlpOworCVVJTlQzMiBNYWNSZWcgPSAwOworCisjaWZkZWYgUkFMSU5LX0FURQorCWlmIChBVEVfT04ocEFkKSkKKwkJcmV0dXJuOworI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCWlmICghKHBBZC0+Q29tbW9uQ2ZnLmJIVFByb3RlY3QpICYmIChPcGVyYXRpb25Nb2RlICE9IDgpKQorCXsKKwkJcmV0dXJuOworCX0KKworCWlmIChwQWQtPkJBVGFibGUubnVtQXNPcmlnaW5hdG9yKQorCXsKKwkJLy8KKwkJLy8gZW5hYmxlIHRoZSBSVFMvQ1RTIHRvIGF2b2lkIGNoYW5uZWwgY29sbGlzaW9uCisJCS8vCisJCVNldE1hc2sgPSBBTExOX1NFVFBST1RFQ1Q7CisJCU9wZXJhdGlvbk1vZGUgPSA4OworCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCS8vIENvbmZpZyBBU0lDIFJUUyB0aHJlc2hvbGQgcmVnaXN0ZXIKKwlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX1JUU19DRkcsICZNYWNSZWcpOworCU1hY1JlZyAmPSAweEZGMDAwMEZGOworI2lmIDAKKwlNYWNSZWcgfD0gKHBBZC0+Q29tbW9uQ2ZnLlJ0c1RocmVzaG9sZCA8PCA4KTsKKyNlbHNlCisJLy8gSWYgdGhlIHVzZXIgd2FudCBkaXNhYmxlIFJ0c1RocmVzaG9sZCBhbmQgZW5iYWxlIEFtc2R1L1JhbGluay1BZ2dyZWdhdGlvbiwgc2V0IHRoZSBSdHNUaHJlc2hvbGQgYXMgNDA5NgorICAgICAgICBpZiAoKAorI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJKHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BbXNkdUVuYWJsZSkgfHwKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJCShwQWQtPkNvbW1vbkNmZy5iQWdncmVnYXRpb25DYXBhYmxlID09IFRSVUUpKQorICAgICAgICAgICAgJiYgcEFkLT5Db21tb25DZmcuUnRzVGhyZXNob2xkID09IE1BWF9SVFNfVEhSRVNIT0xEKQorICAgICAgICB7CisJCQlNYWNSZWcgfD0gKDB4MTAwMCA8PCA4KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKwkJCU1hY1JlZyB8PSAocEFkLT5Db21tb25DZmcuUnRzVGhyZXNob2xkIDw8IDgpOworICAgICAgICB9CisjZW5kaWYKKworCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX1JUU19DRkcsIE1hY1JlZyk7CisKKwkvLyBJbml0aWFsIGNvbW1vbiBwcm90ZWN0aW9uIHNldHRpbmdzCisJUlRNUFplcm9NZW1vcnkoUHJvdGVjdCwgc2l6ZW9mKFByb3RlY3QpKTsKKwlQcm90Q2ZnNC53b3JkID0gMDsKKwlQcm90Q2ZnLndvcmQgPSAwOworCVByb3RDZmcuZmllbGQuVHhvcEFsbG93R0Y0MCA9IDE7CisJUHJvdENmZy5maWVsZC5UeG9wQWxsb3dHRjIwID0gMTsKKwlQcm90Q2ZnLmZpZWxkLlR4b3BBbGxvd01NNDAgPSAxOworCVByb3RDZmcuZmllbGQuVHhvcEFsbG93TU0yMCA9IDE7CisJUHJvdENmZy5maWVsZC5UeG9wQWxsb3dPZmRtID0gMTsKKwlQcm90Q2ZnLmZpZWxkLlR4b3BBbGxvd0NjayA9IDE7CisJUHJvdENmZy5maWVsZC5SVFNUaEVuID0gMTsKKwlQcm90Q2ZnLmZpZWxkLlByb3RlY3ROYXYgPSBBU0lDX1NIT1JUTkFWOworCisJLy8gdXBkYXRlIFBIWSBtb2RlIGFuZCByYXRlCisJaWYgKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPiAxNCkKKwkJUHJvdENmZy5maWVsZC5Qcm90ZWN0UmF0ZSA9IDB4NDAwMDsKKwlQcm90Q2ZnLmZpZWxkLlByb3RlY3RSYXRlIHw9IHBBZC0+Q29tbW9uQ2ZnLlJ0c1JhdGU7CisKKwkvLyBIYW5kbGUgbGVnYWN5KEIvRykgcHJvdGVjdGlvbgorCWlmIChiRGlzYWJsZUJHUHJvdGVjdCkKKwl7CisJCS8vUHJvdENmZy5maWVsZC5Qcm90ZWN0UmF0ZSA9IHBBZC0+Q29tbW9uQ2ZnLlJ0c1JhdGU7CisJCVByb3RDZmcuZmllbGQuUHJvdGVjdEN0cmwgPSAwOworCQlQcm90ZWN0WzBdID0gUHJvdENmZy53b3JkOworCQlQcm90ZWN0WzFdID0gUHJvdENmZy53b3JkOworCX0KKwllbHNlCisJeworCQkvL1Byb3RDZmcuZmllbGQuUHJvdGVjdFJhdGUgPSBwQWQtPkNvbW1vbkNmZy5SdHNSYXRlOworCQlQcm90Q2ZnLmZpZWxkLlByb3RlY3RDdHJsID0gMDsJCQkvLyBDQ0sgZG8gbm90IG5lZWQgdG8gYmUgcHJvdGVjdGVkCisJCVByb3RlY3RbMF0gPSBQcm90Q2ZnLndvcmQ7CisJCVByb3RDZmcuZmllbGQuUHJvdGVjdEN0cmwgPSBBU0lDX0NUUzsJLy8gT0ZETSBuZWVkcyB1c2luZyBDQ0sgdG8gcHJvdGVjdAorCQlQcm90ZWN0WzFdID0gUHJvdENmZy53b3JkOworCX0KKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCS8vIERlY2lkZSBIVCBmcmFtZSBwcm90ZWN0aW9uLgorCWlmICgoU2V0TWFzayAmIEFMTE5fU0VUUFJPVEVDVCkgIT0gMCkKKwl7CisJCXN3aXRjaChPcGVyYXRpb25Nb2RlKQorCQl7CisJCQljYXNlIDB4MDoKKwkJCQkvLyBOTyBQUk9URUNUCisJCQkJLy8gMS5BbGwgU1RBcyBpbiB0aGUgQlNTIGFyZSAyMC80MCBNSHogSFQKKwkJCQkvLyAyLiBpbiBhaSAyMC80ME1IeiBCU1MKKwkJCQkvLyAzLiBhbGwgU1RBcyBhcmUgMjBNSHogaW4gYSAyME1IeiBCU1MKKwkJCQkvLyBQdXJlIEhULiBubyBwcm90ZWN0aW9uLgorCisJCQkJLy8gTU0yMF9QUk9UX0NGRworCQkJCS8vCVJlc2VydmVkICgzMToyNykKKwkJCQkvLyAJUFJPVF9UWE9QKDI1OjIwKSAtLSAwMTAxMTEKKwkJCQkvLwlQUk9UX05BVigxOToxOCkgIC0tIDAxIChTaG9ydCBOQVYgcHJvdGVjdGlvbikKKwkJCQkvLyAgUFJPVF9DVFJMKDE3OjE2KSAtLSAwMCAoTm9uZSkKKwkJCQkvLyAJUFJPVF9SQVRFKDE1OjApICAtLSAweDQwMDQgKE9GRE0gMjRNKQorCQkJCVByb3RlY3RbMl0gPSAweDAxNzQ0MDA0OworCisJCQkJLy8gTU00MF9QUk9UX0NGRworCQkJCS8vCVJlc2VydmVkICgzMToyNykKKwkJCQkvLyAJUFJPVF9UWE9QKDI1OjIwKSAtLSAxMTExMTEKKwkJCQkvLwlQUk9UX05BVigxOToxOCkgIC0tIDAxIChTaG9ydCBOQVYgcHJvdGVjdGlvbikKKwkJCQkvLyAgUFJPVF9DVFJMKDE3OjE2KSAtLSAwMCAoTm9uZSkKKwkJCQkvLyAJUFJPVF9SQVRFKDE1OjApICAtLSAweDQwODQgKGR1cGxpY2F0ZSBPRkRNIDI0TSkKKwkJCQlQcm90ZWN0WzNdID0gMHgwM2Y0NDA4NDsKKworCQkJCS8vIENGMjBfUFJPVF9DRkcKKwkJCQkvLwlSZXNlcnZlZCAoMzE6MjcpCisJCQkJLy8gCVBST1RfVFhPUCgyNToyMCkgLS0gMDEwMTExCisJCQkJLy8JUFJPVF9OQVYoMTk6MTgpICAtLSAwMSAoU2hvcnQgTkFWIHByb3RlY3Rpb24pCisJCQkJLy8gIFBST1RfQ1RSTCgxNzoxNikgLS0gMDAgKE5vbmUpCisJCQkJLy8gCVBST1RfUkFURSgxNTowKSAgLS0gMHg0MDA0IChPRkRNIDI0TSkKKwkJCQlQcm90ZWN0WzRdID0gMHgwMTc0NDAwNDsKKworCQkJCS8vIENGNDBfUFJPVF9DRkcKKwkJCQkvLwlSZXNlcnZlZCAoMzE6MjcpCisJCQkJLy8gCVBST1RfVFhPUCgyNToyMCkgLS0gMTExMTExCisJCQkJLy8JUFJPVF9OQVYoMTk6MTgpICAtLSAwMSAoU2hvcnQgTkFWIHByb3RlY3Rpb24pCisJCQkJLy8gIFBST1RfQ1RSTCgxNzoxNikgLS0gMDAgKE5vbmUpCisJCQkJLy8gCVBST1RfUkFURSgxNTowKSAgLS0gMHg0MDg0IChkdXBsaWNhdGUgT0ZETSAyNE0pCisJCQkJUHJvdGVjdFs1XSA9IDB4MDNmNDQwODQ7CisKKwkJCQlpZiAoYk5vbkdGRXhpc3QpCisJCQkJeworCQkJCQkvLyBQUk9UX05BVigxOToxOCkgIC0tIDAxIChTaG9ydCBOQVYgcHJvdGVjdGlpb24pCisJCQkJCS8vIFBST1RfQ1RSTCgxNzoxNikgLS0gMDEgKFJUUy9DVFMpCisJCQkJCVByb3RlY3RbNF0gPSAweDAxNzU0MDA0OworCQkJCQlQcm90ZWN0WzVdID0gMHgwM2Y1NDA4NDsKKwkJCQl9CisJCQkJcEFkLT5Db21tb25DZmcuSU9UZXN0UGFybS5iUlRTTG9uZ1Byb3RPbiA9IEZBTFNFOworCQkJCWJyZWFrOworCisgCQkJY2FzZSAxOgorCQkJCS8vIFRoaXMgaXMgIkhUIG5vbi1tZW1iZXIgcHJvdGVjdGlvbiBtb2RlLiIKKwkJCQkvLyBJZiB0aGVyZSBtYXkgYmUgbm9uLUhUIFNUQXMgbXkgQlNTCisJCQkJUHJvdENmZy53b3JkID0gMHgwMTc0NDAwNDsJLy8gUFJPVF9DVFJMKDE3OjE2KSA6IDAgKE5vbmUpCisJCQkJUHJvdENmZzQud29yZCA9IDB4MDNmNDQwODQ7IC8vIGR1cGxpY2FldCBsZWdhY3kgMjRNLiBCVyBzZXQgMS4KKwkJCQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19CR19QUk9URUNUSU9OX0lOVVNFRCkpCisJCQkJeworCQkJCQlQcm90Q2ZnLndvcmQgPSAweDAxNzQwMDAzOwkvL0VSUCB1c2UgUHJvdGVjdGlvbiBiaXQgaXMgc2V0LCB1c2UgcHJvdGVjdGlvbiByYXRlIGF0IENsYXVzZSAxOC4uCisJCQkJCVByb3RDZmc0LndvcmQgPSAweDAzZjQwMDAzOyAvLyBEb24ndCBkdXBsaWNhdGUgUlRTL0NUUyBpbiBDQ0sgbW9kZS4gMHgwM2Y0MDA4MzsKKwkJCQl9CisJCQkJLy9Bc3NpZ24gUHJvdGVjdGlvbiBtZXRob2QgZm9yIDIwJjQwIE1IeiBwYWNrZXRzCisJCQkJUHJvdENmZy5maWVsZC5Qcm90ZWN0Q3RybCA9IEFTSUNfUlRTOworCQkJCVByb3RDZmcuZmllbGQuUHJvdGVjdE5hdiA9IEFTSUNfU0hPUlROQVY7CisJCQkJUHJvdENmZzQuZmllbGQuUHJvdGVjdEN0cmwgPSBBU0lDX1JUUzsKKwkJCQlQcm90Q2ZnNC5maWVsZC5Qcm90ZWN0TmF2ID0gQVNJQ19TSE9SVE5BVjsKKwkJCQlQcm90ZWN0WzJdID0gUHJvdENmZy53b3JkOworCQkJCVByb3RlY3RbM10gPSBQcm90Q2ZnNC53b3JkOworCQkJCVByb3RlY3RbNF0gPSBQcm90Q2ZnLndvcmQ7CisJCQkJUHJvdGVjdFs1XSA9IFByb3RDZmc0LndvcmQ7CisJCQkJcEFkLT5Db21tb25DZmcuSU9UZXN0UGFybS5iUlRTTG9uZ1Byb3RPbiA9IFRSVUU7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgMjoKKwkJCQkvLyBJZiBvbmx5IEhUIFNUQXMgYXJlIGluIEJTUy4gYXQgbGVhc3Qgb25lIGlzIDIwTUh6LiBPbmx5IHByb3RlY3QgNDBNSHogcGFja2V0cworCQkJCVByb3RDZmcud29yZCA9IDB4MDE3NDQwMDQ7ICAvLyBQUk9UX0NUUkwoMTc6MTYpIDogMCAoTm9uZSkKKwkJCQlQcm90Q2ZnNC53b3JkID0gMHgwM2Y0NDA4NDsgLy8gZHVwbGljYWV0IGxlZ2FjeSAyNE0uIEJXIHNldCAxLgorCisJCQkJLy9Bc3NpZ24gUHJvdGVjdGlvbiBtZXRob2QgZm9yIDQwTUh6IHBhY2tldHMKKwkJCQlQcm90Q2ZnNC5maWVsZC5Qcm90ZWN0Q3RybCA9IEFTSUNfUlRTOworCQkJCVByb3RDZmc0LmZpZWxkLlByb3RlY3ROYXYgPSBBU0lDX1NIT1JUTkFWOworCQkJCVByb3RlY3RbMl0gPSBQcm90Q2ZnLndvcmQ7CisJCQkJUHJvdGVjdFszXSA9IFByb3RDZmc0LndvcmQ7CisJCQkJaWYgKGJOb25HRkV4aXN0KQorCQkJCXsKKwkJCQkJUHJvdENmZy5maWVsZC5Qcm90ZWN0Q3RybCA9IEFTSUNfUlRTOworCQkJCQlQcm90Q2ZnLmZpZWxkLlByb3RlY3ROYXYgPSBBU0lDX1NIT1JUTkFWOworCQkJCX0KKwkJCQlQcm90ZWN0WzRdID0gUHJvdENmZy53b3JkOworCQkJCVByb3RlY3RbNV0gPSBQcm90Q2ZnNC53b3JkOworCisJCQkJcEFkLT5Db21tb25DZmcuSU9UZXN0UGFybS5iUlRTTG9uZ1Byb3RPbiA9IEZBTFNFOworCQkJCWJyZWFrOworCisJCQljYXNlIDM6CisJCQkJLy8gSFQgbWl4ZWQgbW9kZS4JIFBST1RFQ1QgQUxMIQorCQkJCS8vIEFzc2lnbiBSYXRlCisJCQkJUHJvdENmZy53b3JkID0gMHgwMTc0NDAwNDsJLy9kdXBsaWNhZXQgbGVnYWN5IDI0TS4gQlcgc2V0IDEuCisJCQkJUHJvdENmZzQud29yZCA9IDB4MDNmNDQwODQ7CisJCQkJLy8gYm90aCAyME1IeiBhbmQgNDBNSHogYXJlIHByb3RlY3RlZC4gV2hldGhlciB1c2UgUlRTIG9yIENUUy10by1zZWxmIGRlcGVuZHMgb24gdGhlCisJCQkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQkdfUFJPVEVDVElPTl9JTlVTRUQpKQorCQkJCXsKKwkJCQkJUHJvdENmZy53b3JkID0gMHgwMTc0MDAwMzsJLy9FUlAgdXNlIFByb3RlY3Rpb24gYml0IGlzIHNldCwgdXNlIHByb3RlY3Rpb24gcmF0ZSBhdCBDbGF1c2UgMTguLgorCQkJCQlQcm90Q2ZnNC53b3JkID0gMHgwM2Y0MDAwMzsgLy8gRG9uJ3QgZHVwbGljYXRlIFJUUy9DVFMgaW4gQ0NLIG1vZGUuIDB4MDNmNDAwODMKKwkJCQl9CisJCQkJLy9Bc3NpZ24gUHJvdGVjdGlvbiBtZXRob2QgZm9yIDIwJjQwIE1IeiBwYWNrZXRzCisJCQkJUHJvdENmZy5maWVsZC5Qcm90ZWN0Q3RybCA9IEFTSUNfUlRTOworCQkJCVByb3RDZmcuZmllbGQuUHJvdGVjdE5hdiA9IEFTSUNfU0hPUlROQVY7CisJCQkJUHJvdENmZzQuZmllbGQuUHJvdGVjdEN0cmwgPSBBU0lDX1JUUzsKKwkJCQlQcm90Q2ZnNC5maWVsZC5Qcm90ZWN0TmF2ID0gQVNJQ19TSE9SVE5BVjsKKwkJCQlQcm90ZWN0WzJdID0gUHJvdENmZy53b3JkOworCQkJCVByb3RlY3RbM10gPSBQcm90Q2ZnNC53b3JkOworCQkJCVByb3RlY3RbNF0gPSBQcm90Q2ZnLndvcmQ7CisJCQkJUHJvdGVjdFs1XSA9IFByb3RDZmc0LndvcmQ7CisJCQkJcEFkLT5Db21tb25DZmcuSU9UZXN0UGFybS5iUlRTTG9uZ1Byb3RPbiA9IFRSVUU7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgODoKKwkJCQkvLyBTcGVjaWFsIG9uIGZvciBBdGhlcm9zIHByb2JsZW0gbiBjaGlwLgorCQkJCVByb3RlY3RbMl0gPSAweDAxNzU0MDA0OworCQkJCVByb3RlY3RbM10gPSAweDAzZjU0MDg0OworCQkJCVByb3RlY3RbNF0gPSAweDAxNzU0MDA0OworCQkJCVByb3RlY3RbNV0gPSAweDAzZjU0MDg0OworCQkJCXBBZC0+Q29tbW9uQ2ZnLklPVGVzdFBhcm0uYlJUU0xvbmdQcm90T24gPSBUUlVFOworCQkJCWJyZWFrOworCQl9CisJfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJb2Zmc2V0ID0gQ0NLX1BST1RfQ0ZHOworCWZvciAoaSA9IDA7aSA8IDY7aSsrKQorCXsKKwkJaWYgKChTZXRNYXNrICYgKDE8PCBpKSkpCisJCXsKKwkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIG9mZnNldCArIGkqNCwgUHJvdGVjdFtpXSk7CisJCX0KKwl9Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKworCUlSUUwgPSBQQVNTSVZFX0xFVkVMCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIEFzaWNTd2l0Y2hDaGFubmVsKAorCQkJCQkgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOCVVDSEFSCQkJQ2hhbm5lbCwKKwlJTglCT09MRUFOCQkJYlNjYW4pCit7CisJVUxPTkcJCQlSMiA9IDAsIFIzID0gREVGQVVMVF9SRl9UWF9QT1dFUiwgUjQgPSAwOworCUNIQVIgICAgVHhQd2VyID0gMCwgVHhQd2VyMiA9IERFRkFVTFRfUkZfVFhfUE9XRVI7IC8vQmJwOTQgPSBCQlBSOTRfREVGQVVMVCwgVHhQd2VyMiA9IERFRkFVTFRfUkZfVFhfUE9XRVI7CisJVUNIQVIJaW5kZXg7CisJVUlOVDMyIAlWYWx1ZSA9IDA7IC8vQmJwUmVnLCBWYWx1ZTsKKwlSVE1QX1JGX1JFR1MgKlJGUmVnVGFibGU7CisKKwkvLyBTZWFyY2ggVHggcG93ZXIgdmFsdWUKKwlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBwQWQtPkNoYW5uZWxMaXN0TnVtOyBpbmRleCsrKQorCXsKKwkJaWYgKENoYW5uZWwgPT0gcEFkLT5DaGFubmVsTGlzdFtpbmRleF0uQ2hhbm5lbCkKKwkJeworCQkJVHhQd2VyID0gcEFkLT5DaGFubmVsTGlzdFtpbmRleF0uUG93ZXI7CisJCQlUeFB3ZXIyID0gcEFkLT5DaGFubmVsTGlzdFtpbmRleF0uUG93ZXIyOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoaW5kZXggPT0gTUFYX05VTV9PRl9DSEFOTkVMUykKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkFzaWNTd2l0Y2hDaGFubmVsOiBDYW50IGZpbmQgdGhlIENoYW5uZWwjJWQgXG4iLCBDaGFubmVsKSk7CisJfQorCisJeworCQlSRlJlZ1RhYmxlID0gUkYyODUwUmVnVGFibGU7CisKKwkJc3dpdGNoIChwQWQtPlJmSWNUeXBlKQorCQl7CisJCQljYXNlIFJGSUNfMjgyMDoKKwkJCWNhc2UgUkZJQ18yODUwOgorCQkJY2FzZSBSRklDXzI3MjA6CisJCQljYXNlIFJGSUNfMjc1MDoKKworCQkJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgTlVNX09GXzI4NTBfQ0hOTDsgaW5kZXgrKykKKwkJCXsKKwkJCQlpZiAoQ2hhbm5lbCA9PSBSRlJlZ1RhYmxlW2luZGV4XS5DaGFubmVsKQorCQkJCXsKKwkJCQkJUjIgPSBSRlJlZ1RhYmxlW2luZGV4XS5SMjsKKwkJCQkJaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGggPT0gMSkKKwkJCQkJeworCQkJCQkJUjIgfD0gMHg0MDAwOwkvLyBJZiBUWHBhdGggaXMgMSwgYml0IDE0ID0gMTsKKwkJCQkJfQorCisJCQkJCWlmIChwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDIpCisJCQkJCXsKKwkJCQkJCVIyIHw9IDB4NDA7CS8vIHdyaXRlIDEgdG8gb2ZmIFJ4cGF0aC4KKwkJCQkJfQorCQkJCQllbHNlIGlmIChwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDEpCisJCQkJCXsKKwkJCQkJCVIyIHw9IDB4MjAwNDA7CS8vIHdyaXRlIDEgdG8gb2ZmIFJ4UGF0aAorCQkJCQl9CisKKwkJCQkJaWYgKENoYW5uZWwgPiAxNCkKKwkJCQkJeworCQkJCQkJLy8gaW5pdGlhbGl6ZSBSMywgUjQKKwkJCQkJCVIzID0gKFJGUmVnVGFibGVbaW5kZXhdLlIzICYgMHhmZmZmYzFmZik7CisJCQkJCQlSNCA9IChSRlJlZ1RhYmxlW2luZGV4XS5SNCAmICh+MHgwMDFmODdjMCkpIHwgKHBBZC0+UmZGcmVxT2Zmc2V0IDw8IDE1KTsKKworCQkJCQkJLy8gNUcgYmFuZCBwb3dlciByYW5nZTogMHhGOX4wWDBGLCBUWDAgUmVnMyBiaXQ5L1RYMSBSZWc0IGJpdDY9IjAiIG1lYW5zIHRoZSBUWCBwb3dlciByZWR1Y2UgN2RCCisJCQkJCQkvLyBSMworCQkJCQkJaWYgKChUeFB3ZXIgPj0gLTcpICYmIChUeFB3ZXIgPCAwKSkKKwkJCQkJCXsKKwkJCQkJCQlUeFB3ZXIgPSAoNytUeFB3ZXIpOworCQkJCQkJCVR4UHdlciA9IChUeFB3ZXIgPiAweEYpID8gKDB4RikgOiAoVHhQd2VyKTsKKwkJCQkJCQlSMyB8PSAoVHhQd2VyIDw8IDEwKTsKKwkJCQkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJBc2ljU3dpdGNoQ2hhbm5lbDogVHhQd2VyPSVkIFxuIiwgVHhQd2VyKSk7CisJCQkJCQl9CisJCQkJCQllbHNlCisJCQkJCQl7CisJCQkJCQkJVHhQd2VyID0gKFR4UHdlciA+IDB4RikgPyAoMHhGKSA6IChUeFB3ZXIpOworCQkJCQkJCVIzIHw9IChUeFB3ZXIgPDwgMTApIHwgKDEgPDwgOSk7CisJCQkJCQl9CisKKwkJCQkJCS8vIFI0CisJCQkJCQlpZiAoKFR4UHdlcjIgPj0gLTcpICYmIChUeFB3ZXIyIDwgMCkpCisJCQkJCQl7CisJCQkJCQkJVHhQd2VyMiA9ICg3K1R4UHdlcjIpOworCQkJCQkJCVR4UHdlcjIgPSAoVHhQd2VyMiA+IDB4RikgPyAoMHhGKSA6IChUeFB3ZXIyKTsKKwkJCQkJCQlSNCB8PSAoVHhQd2VyMiA8PCA3KTsKKwkJCQkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJBc2ljU3dpdGNoQ2hhbm5lbDogVHhQd2VyMj0lZCBcbiIsIFR4UHdlcjIpKTsKKwkJCQkJCX0KKwkJCQkJCWVsc2UKKwkJCQkJCXsKKwkJCQkJCQlUeFB3ZXIyID0gKFR4UHdlcjIgPiAweEYpID8gKDB4RikgOiAoVHhQd2VyMik7CisJCQkJCQkJUjQgfD0gKFR4UHdlcjIgPDwgNykgfCAoMSA8PCA2KTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCVIzID0gKFJGUmVnVGFibGVbaW5kZXhdLlIzICYgMHhmZmZmYzFmZikgfCAoVHhQd2VyIDw8IDkpOyAvLyBzZXQgVFggcG93ZXIwCisJCQkJCVI0ID0gKFJGUmVnVGFibGVbaW5kZXhdLlI0ICYgKH4weDAwMWY4N2MwKSkgfCAocEFkLT5SZkZyZXFPZmZzZXQgPDwgMTUpIHwgKFR4UHdlcjIgPDw2KTsvLyBTZXQgZnJlcSBPZmZzZXQgJiBUeFB3cjEKKwkJCQkJfQorCisJCQkJCS8vIEJhc2VkIG9uIEJCUCBjdXJyZW50IG1vZGUgYmVmb3JlIGNoYW5naW5nIFJGIGNoYW5uZWwuCisJCQkJCWlmICghYlNjYW4gJiYgKHBBZC0+Q29tbW9uQ2ZnLkJCUEN1cnJlbnRCVyA9PSBCV180MCkpCisJCQkJCXsKKwkJCQkJCVI0IHw9MHgyMDAwMDA7CisJCQkJCX0KKworCQkJCQkvLyBVcGRhdGUgdmFyaWFibGVzCisJCQkJCXBBZC0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbCA9IENoYW5uZWw7CisJCQkJCXBBZC0+TGF0Y2hSZlJlZ3MuUjEgPSBSRlJlZ1RhYmxlW2luZGV4XS5SMTsKKwkJCQkJcEFkLT5MYXRjaFJmUmVncy5SMiA9IFIyOworCQkJCQlwQWQtPkxhdGNoUmZSZWdzLlIzID0gUjM7CisJCQkJCXBBZC0+TGF0Y2hSZlJlZ3MuUjQgPSBSNDsKKworCQkJCQkvLyBTZXQgUkYgdmFsdWUgMSdzIHNldCBSM1tiaXQyXSA9IFswXQorCQkJCQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCBwQWQtPkxhdGNoUmZSZWdzLlIxKTsKKwkJCQkJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgcEFkLT5MYXRjaFJmUmVncy5SMik7CisJCQkJCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIChwQWQtPkxhdGNoUmZSZWdzLlIzICYgKH4weDA0KSkpOworCQkJCQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCBwQWQtPkxhdGNoUmZSZWdzLlI0KTsKKworCQkJCQlSVE1QdXNlY0RlbGF5KDIwMCk7CisKKwkJCQkJLy8gU2V0IFJGIHZhbHVlIDIncyBzZXQgUjNbYml0Ml0gPSBbMV0KKwkJCQkJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgcEFkLT5MYXRjaFJmUmVncy5SMSk7CisJCQkJCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIHBBZC0+TGF0Y2hSZlJlZ3MuUjIpOworCQkJCQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCAocEFkLT5MYXRjaFJmUmVncy5SMyB8IDB4MDQpKTsKKwkJCQkJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgcEFkLT5MYXRjaFJmUmVncy5SNCk7CisKKwkJCQkJUlRNUHVzZWNEZWxheSgyMDApOworCisJCQkJCS8vIFNldCBSRiB2YWx1ZSAzJ3Mgc2V0IFIzW2JpdDJdID0gWzBdCisJCQkJCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIHBBZC0+TGF0Y2hSZlJlZ3MuUjEpOworCQkJCQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCBwQWQtPkxhdGNoUmZSZWdzLlIyKTsKKwkJCQkJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgKHBBZC0+TGF0Y2hSZlJlZ3MuUjMgJiAofjB4MDQpKSk7CisJCQkJCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIHBBZC0+TGF0Y2hSZlJlZ3MuUjQpOworCisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvLyBDaGFuZ2UgQkJQIHNldHRpbmcgZHVyaW5nIHNpd3RjaCBmcm9tIGEtPmcsIGctPmEKKwlpZiAoQ2hhbm5lbCA8PSAxNCkKKwl7CisJICAgIFVMT05HCVR4UGluQ2ZnID0gMHgwMDA1MEYwQTsvL0dhcnkgMjAwNy8wOC8wOSAweDA1MEEwQQorCisJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjYyLCAoMHgzNyAtIEdFVF9MTkFfR0FJTihwQWQpKSk7CisJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjYzLCAoMHgzNyAtIEdFVF9MTkFfR0FJTihwQWQpKSk7CisJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY0LCAoMHgzNyAtIEdFVF9MTkFfR0FJTihwQWQpKSk7CisJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjg2LCAwKTsvLygweDQ0IC0gR0VUX0xOQV9HQUlOKHBBZCkpKTsJLy8gQWNjb3JkaW5nIHRoZSBSb3J5J3Mgc3VnZ2VzdGlvbiB0byBzb2x2ZSB0aGUgbWlkZGxlIHJhbmdlIGlzc3VlLgorCQkvL1JUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjgyLCAweDYyKTsKKworCQkvLyBSeCBIaWdoIHBvd2VyIFZHQSBvZmZzZXQgZm9yIExOQSBzZWxlY3QKKwkgICAgaWYgKHBBZC0+TmljQ29uZmlnMi5maWVsZC5FeHRlcm5hbExOQUZvckcpCisJICAgIHsKKwkgICAgICAgIFJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjgyLCAweDYyKTsKKwkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjc1LCAweDQ2KTsKKwkgICAgfQorCSAgICBlbHNlCisJICAgIHsKKwkgICAgICAgIFJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjgyLCAweDg0KTsKKwkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjc1LCAweDUwKTsKKwkgICAgfQorCisJCS8vIDVHIGJhbmQgc2VsZWN0aW9uIFBJTiwgYml0MSBhbmQgYml0MiBhcmUgY29tcGxlbWVudAorCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0JBTkRfQ0ZHLCAmVmFsdWUpOworCQlWYWx1ZSAmPSAofjB4Nik7CisJCVZhbHVlIHw9ICgweDA0KTsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfQkFORF9DRkcsIFZhbHVlKTsKKworICAgICAgICAvLyBUdXJuIG9mZiB1bnVzZWQgUEEgb3IgTE5BIHdoZW4gb25seSAxVCBvciAxUgorCQlpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCA9PSAxKQorCQl7CisJCQlUeFBpbkNmZyAmPSAweEZGRkZGRkYzOworCQl9CisJCWlmIChwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDEpCisJCXsKKwkJCVR4UGluQ2ZnICY9IDB4RkZGRkYzRkY7CisJCX0KKworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9QSU5fQ0ZHLCBUeFBpbkNmZyk7CisJfQorCWVsc2UKKwl7CisJICAgIFVMT05HCVR4UGluQ2ZnID0gMHgwMDA1MEYwNTsvL0dhcnkgMjAwNy84LzkgMHgwNTA1MDUKKworCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2MiwgKDB4MzcgLSBHRVRfTE5BX0dBSU4ocEFkKSkpOworCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2MywgKDB4MzcgLSBHRVRfTE5BX0dBSU4ocEFkKSkpOworCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2NCwgKDB4MzcgLSBHRVRfTE5BX0dBSU4ocEFkKSkpOworCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I4NiwgMCk7Ly8oMHg0NCAtIEdFVF9MTkFfR0FJTihwQWQpKSk7ICAgLy8gQWNjb3JkaW5nIHRoZSBSb3J5J3Mgc3VnZ2VzdGlvbiB0byBzb2x2ZSB0aGUgbWlkZGxlIHJhbmdlIGlzc3VlLgorCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I4MiwgMHhGMik7CisKKwkJLy8gUnggSGlnaCBwb3dlciBWR0Egb2Zmc2V0IGZvciBMTkEgc2VsZWN0CisJCWlmIChwQWQtPk5pY0NvbmZpZzIuZmllbGQuRXh0ZXJuYWxMTkFGb3JBKQorCQl7CisJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I3NSwgMHg0Nik7CisJCX0KKwkJZWxzZQorCQl7CisJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I3NSwgMHg1MCk7CisJCX0KKworCQkvLyA1RyBiYW5kIHNlbGVjdGlvbiBQSU4sIGJpdDEgYW5kIGJpdDIgYXJlIGNvbXBsZW1lbnQKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9CQU5EX0NGRywgJlZhbHVlKTsKKwkJVmFsdWUgJj0gKH4weDYpOworCQlWYWx1ZSB8PSAoMHgwMik7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX0JBTkRfQ0ZHLCBWYWx1ZSk7CisKKyAgICAgICAgLy8gVHVybiBvZmYgdW51c2VkIFBBIG9yIExOQSB3aGVuIG9ubHkgMVQgb3IgMVIKKwkJaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGggPT0gMSkKKwkJeworCQkJVHhQaW5DZmcgJj0gMHhGRkZGRkZGMzsKKwl9CisJCWlmIChwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDEpCisJCXsKKwkJCVR4UGluQ2ZnICY9IDB4RkZGRkYzRkY7CisJfQorCisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX1BJTl9DRkcsIFR4UGluQ2ZnKTsKKwl9CisKKyAgICAvLyBSNjYgc2hvdWxkIGJlIHNldCBhY2NvcmRpbmcgdG8gQ2hhbm5lbCBhbmQgdXNlIDIwTUh6IHdoZW4gc2Nhbm5pbmcKKwkvL1JUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY2LCAoMHgyRSArIEdFVF9MTkFfR0FJTihwQWQpKSk7CisJaWYgKGJTY2FuKQorCQlSVE1QU2V0QUdDSW5pdFZhbHVlKHBBZCwgQldfMjApOworCWVsc2UKKwkJUlRNUFNldEFHQ0luaXRWYWx1ZShwQWQsIHBBZC0+Q29tbW9uQ2ZnLkJCUEN1cnJlbnRCVyk7CisKKwkvLworCS8vIE9uIDExQSwgV2Ugc2hvdWxkIGRlbGF5IGFuZCB3YWl0IFJGL0JCUCB0byBiZSBzdGFibGUKKwkvLyBhbmQgdGhlIGFwcHJvcHJpYXRlIHRpbWUgc2hvdWxkIGJlIDEwMDAgbWljcm8gc2Vjb25kcworCS8vIDIwMDUvMDYvMDUgLSBPbiAxMUcsIFdlIGFsc28gbmVlZCB0aGlzIGRlbGF5IHRpbWUuIE90aGVyd2lzZSBpdCdzIGRpZmZpY3VsdCB0byBwYXNzIHRoZSBXSFFMLgorCS8vCisJUlRNUHVzZWNEZWxheSgxMDAwKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlN3aXRjaENoYW5uZWwjJWQoUkY9JWQsIFB3cjA9JWx1LCBQd3IxPSVsdSwgJWRUKSB0byAsIFIxPTB4JTA4bHgsIFIyPTB4JTA4bHgsIFIzPTB4JTA4bHgsIFI0PTB4JTA4bHhcbiIsCisJCQkJCQkJICBDaGFubmVsLAorCQkJCQkJCSAgcEFkLT5SZkljVHlwZSwKKwkJCQkJCQkgIChSMyAmIDB4MDAwMDNlMDApID4+IDksCisJCQkJCQkJICAoUjQgJiAweDAwMDAwN2MwKSA+PiA2LAorCQkJCQkJCSAgcEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCwKKwkJCQkJCQkgIHBBZC0+TGF0Y2hSZlJlZ3MuUjEsCisJCQkJCQkJICBwQWQtPkxhdGNoUmZSZWdzLlIyLAorCQkJCQkJCSAgcEFkLT5MYXRjaFJmUmVncy5SMywKKwkJCQkJCQkgIHBBZC0+TGF0Y2hSZlJlZ3MuUjQpKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlUaGlzIGZ1bmN0aW9uIGlzIHJlcXVpcmVkIGZvciAyNDIxIG9ubHksIGFuZCBzaG91bGQgbm90IGJlIHVzZWQgZHVyaW5nCisJCXNpdGUgc3VydmV5LiBJdCdzIG9ubHkgcmVxdWlyZWQgYWZ0ZXIgTklDIGRlY2lkZWQgdG8gc3RheSBhdCBhIGNoYW5uZWwKKwkJZm9yIGEgbG9uZ2VyIHBlcmlvZC4KKwkJV2hlbiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCwgaXQncyBhbHdheXMgYWZ0ZXIgQXNpY1N3aXRjaENoYW5uZWwoKS4KKworCUlSUUwgPSBQQVNTSVZFX0xFVkVMCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIEFzaWNMb2NrQ2hhbm5lbCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVQ0hBUiBDaGFubmVsKQoreworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRAlBc2ljQW50ZW5uYVNlbGVjdCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVQ0hBUgkJCUNoYW5uZWwpCit7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlBbnRlbm5hIG1pc2NlbGxhbmVvdXMgc2V0dGluZy4KKworCUFyZ3VtZW50czoKKwkJcEFkCQkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCQlCYW5kU3RhdGUJCQkJSW5kaWNhdGUgY3VycmVudCBCYW5kIFN0YXRlLgorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMIDw9IERJU1BBVENIX0xFVkVMCisKKwlOb3RlOgorCQkxLikgRnJhbWUgRW5kIHR5cGUgY29udHJvbAorCQkJb25seSB2YWxpZCBmb3IgRyBvbmx5IChSRl8yNTI3ICYgUkZfMjUyOSkKKwkJCTA6IG1lYW5zIERQRFQsIHNldCBCQlAgUjQgYml0IDUgdG8gMQorCQkJMTogbWVhbnMgU1BEVCwgc2V0IEJCUCBSNCBiaXQgNSB0byAwCisKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJQXNpY0FudGVubmFTZXR0aW5nKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCUFCR0JBTkRfU1RBVEUJQmFuZFN0YXRlKQoreworfQorCitWT0lEIEFzaWNSZlR1bmluZ0V4ZWMoCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKQoreworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCUdpdmVzIENDSyBUWCByYXRlIDIgbW9yZSBkQiBUWCBwb3dlci4KKwkJVGhpcyByb3V0aW5lIHdvcmtzIG9ubHkgaW4gTElOSyBVUCBpbiBJTkZSQVNUUlVDVFVSRSBtb2RlLgorCisJCWNhbGN1bGF0ZSBkZXNpcmVkIFR4IHBvd2VyIGluIFJGIFIzLlR4MH41LAlzaG91bGQgY29uc2lkZXIgLQorCQkwLiBpZiBjdXJyZW50IHJhZGlvIGlzIGEgbm9pc3kgZW52aXJvbm1lbnQgKHBBZC0+RHJzQ291bnRlcnMuZk5vaXN5RW52aXJvbm1lbnQpCisJCTEuIFR4UG93ZXJQZXJjZW50YWdlCisJCTIuIGF1dG8gY2FsaWJyYXRpb24gYmFzZWQgb24gVFNTSSBmZWVkYmFjaworCQkzLiBleHRyYSAyIGRiIGZvciBDQ0sKKwkJNC4gLTEwIGRiIHVwb24gdmVyeS1zaG9ydCBkaXN0YW5jZSAoQXZnUlNTSSA+PSAtNDBkYikgdG8gQVAKKworCU5PVEU6IFNpbmNlIHRoaXMgcm91dGluZSByZXF1aXJlcyB0aGUgdmFsdWUgb2YgKHBBZC0+RHJzQ291bnRlcnMuZk5vaXN5RW52aXJvbm1lbnQpLAorCQlpdCBzaG91bGQgYmUgY2FsbGVkIEFGVEVSIE1sbWVEeW5hbWljVHhSYXRTd2l0Y2hpbmcoKQorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgQXNpY0FkanVzdFR4UG93ZXIoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJSU5UCQkJaSwgajsKKwlDSEFSCQlEZWx0YVB3ciA9IDA7CisJQk9PTEVBTgkJYkF1dG9UeEFnYyA9IEZBTFNFOworCVVDSEFSCQlUc3NpUmVmLCAqcFRzc2lNaW51c0JvdW5kYXJ5LCAqcFRzc2lQbHVzQm91bmRhcnksIFR4QWdjU3RlcDsKKwlVQ0hBUgkJQmJwUjEgPSAwLCBCYnBSNDkgPSAwLCBpZHg7CisJUENIQVIJCXBUeEFnY0NvbXBlbnNhdGU7CisJVUxPTkcJCVR4UHdyWzVdOworCUNIQVIJCVZhbHVlOworCisJaWYgKHBBZC0+Q29tbW9uQ2ZnLkJCUEN1cnJlbnRCVyA9PSBCV180MCkKKwl7CisJCWlmIChwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA+IDE0KQorCQl7CisJCQlUeFB3clswXSA9IHBBZC0+VHg0ME1Qd3JDZmdBQmFuZFswXTsKKwkJCVR4UHdyWzFdID0gcEFkLT5UeDQwTVB3ckNmZ0FCYW5kWzFdOworCQkJVHhQd3JbMl0gPSBwQWQtPlR4NDBNUHdyQ2ZnQUJhbmRbMl07CisJCQlUeFB3clszXSA9IHBBZC0+VHg0ME1Qd3JDZmdBQmFuZFszXTsKKwkJCVR4UHdyWzRdID0gcEFkLT5UeDQwTVB3ckNmZ0FCYW5kWzRdOworCQl9CisJCWVsc2UKKwkJeworCQkJVHhQd3JbMF0gPSBwQWQtPlR4NDBNUHdyQ2ZnR0JhbmRbMF07CisJCQlUeFB3clsxXSA9IHBBZC0+VHg0ME1Qd3JDZmdHQmFuZFsxXTsKKwkJCVR4UHdyWzJdID0gcEFkLT5UeDQwTVB3ckNmZ0dCYW5kWzJdOworCQkJVHhQd3JbM10gPSBwQWQtPlR4NDBNUHdyQ2ZnR0JhbmRbM107CisJCQlUeFB3cls0XSA9IHBBZC0+VHg0ME1Qd3JDZmdHQmFuZFs0XTsKKwkJfQorCX0KKwllbHNlCisJeworCQlpZiAocEFkLT5Db21tb25DZmcuQ2hhbm5lbCA+IDE0KQorCQl7CisJCQlUeFB3clswXSA9IHBBZC0+VHgyME1Qd3JDZmdBQmFuZFswXTsKKwkJCVR4UHdyWzFdID0gcEFkLT5UeDIwTVB3ckNmZ0FCYW5kWzFdOworCQkJVHhQd3JbMl0gPSBwQWQtPlR4MjBNUHdyQ2ZnQUJhbmRbMl07CisJCQlUeFB3clszXSA9IHBBZC0+VHgyME1Qd3JDZmdBQmFuZFszXTsKKwkJCVR4UHdyWzRdID0gcEFkLT5UeDIwTVB3ckNmZ0FCYW5kWzRdOworCQl9CisJCWVsc2UKKwkJeworCQkJVHhQd3JbMF0gPSBwQWQtPlR4MjBNUHdyQ2ZnR0JhbmRbMF07CisJCQlUeFB3clsxXSA9IHBBZC0+VHgyME1Qd3JDZmdHQmFuZFsxXTsKKwkJCVR4UHdyWzJdID0gcEFkLT5UeDIwTVB3ckNmZ0dCYW5kWzJdOworCQkJVHhQd3JbM10gPSBwQWQtPlR4MjBNUHdyQ2ZnR0JhbmRbM107CisJCQlUeFB3cls0XSA9IHBBZC0+VHgyME1Qd3JDZmdHQmFuZFs0XTsKKwkJfQorCX0KKworCS8vIFRYIHBvd2VyIGNvbXBlbnNhdGlvbiBmb3IgdGVtcGVyYXR1cmUgdmFyaWF0aW9uIGJhc2VkIG9uIFRTU0kuIHRyeSBldmVyeSA0IHNlY29uZAorCWlmIChwQWQtPk1sbWUuT25lU2VjUGVyaW9kaWNSb3VuZCAlIDQgPT0gMCkKKwl7CisJCWlmIChwQWQtPkNvbW1vbkNmZy5DaGFubmVsIDw9IDE0KQorCQl7CisJCQkvKiBiZyBjaGFubmVsICovCisJCQliQXV0b1R4QWdjICAgICAgICAgPSBwQWQtPmJBdXRvVHhBZ2NHOworCQkJVHNzaVJlZiAgICAgICAgICAgID0gcEFkLT5Uc3NpUmVmRzsKKwkJCXBUc3NpTWludXNCb3VuZGFyeSA9ICZwQWQtPlRzc2lNaW51c0JvdW5kYXJ5R1swXTsKKwkJCXBUc3NpUGx1c0JvdW5kYXJ5ICA9ICZwQWQtPlRzc2lQbHVzQm91bmRhcnlHWzBdOworCQkJVHhBZ2NTdGVwICAgICAgICAgID0gcEFkLT5UeEFnY1N0ZXBHOworCQkJcFR4QWdjQ29tcGVuc2F0ZSAgID0gJnBBZC0+VHhBZ2NDb21wZW5zYXRlRzsKKwkJfQorCQllbHNlCisJCXsKKwkJCS8qIGEgY2hhbm5lbCAqLworCQkJYkF1dG9UeEFnYyAgICAgICAgID0gcEFkLT5iQXV0b1R4QWdjQTsKKwkJCVRzc2lSZWYgICAgICAgICAgICA9IHBBZC0+VHNzaVJlZkE7CisJCQlwVHNzaU1pbnVzQm91bmRhcnkgPSAmcEFkLT5Uc3NpTWludXNCb3VuZGFyeUFbMF07CisJCQlwVHNzaVBsdXNCb3VuZGFyeSAgPSAmcEFkLT5Uc3NpUGx1c0JvdW5kYXJ5QVswXTsKKwkJCVR4QWdjU3RlcCAgICAgICAgICA9IHBBZC0+VHhBZ2NTdGVwQTsKKwkJCXBUeEFnY0NvbXBlbnNhdGUgICA9ICZwQWQtPlR4QWdjQ29tcGVuc2F0ZUE7CisJCX0KKworCQlpZiAoYkF1dG9UeEFnYykKKwkJeworCQkJLyogQmJwUjEgaXMgdW5zaWduZWQgY2hhciAqLworCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I0OSwgJkJicFI0OSk7CisKKwkJCS8qIChwKSBUc3NpUGx1c0JvdW5kYXJ5R1swXSA9IDAgPSAobSkgVHNzaU1pbnVzQm91bmRhcnlHWzBdICovCisJCQkvKiBjb21wZW5zYXRlOiArNCAgICAgKzMgICArMiAgICsxICAgIDAgICAtMSAgIC0yICAgLTMgICAtNCAqIHN0ZXBzICovCisJCQkvKiBzdGVwIHZhbHVlIGlzIGRlZmluZWQgaW4gcEFkLT5UeEFnY1N0ZXBHIGZvciB0eCBwb3dlciB2YWx1ZSAqLworCisJCQkvKiBbNF0rMStbNF0gICBwNCAgICAgcDMgICBwMiAgIHAxICAgbzEgICBtMSAgIG0yICAgbTMgICBtNCAqLworCQkJLyogZXg6ICAgICAgICAgMHgwMCAweDE1IDB4MjUgMHg0NSAweDg4IDB4QTAgMHhCNSAweEQwIDB4RjAKKwkJCSAgIGFib3ZlIHZhbHVlIGFyZSBleGFtaW5lZCBpbiBtYXNzIGZhY3RvcnkgcHJvZHVjdGlvbiAqLworCQkJLyogICAgICAgICAgICAgWzRdICAgIFszXSAgWzJdICBbMV0gIFswXSAgWzFdICBbMl0gIFszXSAgWzRdICovCisKKwkJCS8qIHBsdXMgKCspIGlzIDB4MDAgfiAweDQ1LCBtaW51cyAoLSkgaXMgMHhhMCB+IDB4ZjAgKi8KKwkJCS8qIGlmIHZhbHVlIGlzIGJldHdlZW4gcDEgfiBvMSBvciBvMSB+IHMxLCBubyBuZWVkIHRvIGFkanVzdCB0eCBwb3dlciAqLworCQkJLyogaWYgdmFsdWUgaXMgMHhhNSwgdHggcG93ZXIgd2lsbCBiZSAtPSBUeEFnY1N0ZXAqKDItMSkgKi8KKworCQkJaWYgKEJicFI0OSA+IHBUc3NpTWludXNCb3VuZGFyeVsxXSkKKwkJCXsKKwkJCQkvLyBSZWFkaW5nIGlzIGxhcmdlciB0aGFuIHRoZSByZWZlcmVuY2UgdmFsdWUKKwkJCQkvLyBjaGVjayBmb3IgaG93IGxhcmdlIHdlIG5lZWQgdG8gZGVjcmVhc2UgdGhlIFR4IHBvd2VyCisJCQkJZm9yIChpZHggPSAxOyBpZHggPCA1OyBpZHgrKykKKwkJCQl7CisJCQkJCWlmIChCYnBSNDkgPD0gcFRzc2lNaW51c0JvdW5kYXJ5W2lkeF0pICAvLyBGb3VuZCB0aGUgcmFuZ2UKKwkJCQkJCWJyZWFrOworCQkJCX0KKwkJCQkvLyBUaGUgaW5kZXggaXMgdGhlIHN0ZXAgd2Ugc2hvdWxkIGRlY3JlYXNlLCBpZHggPSAwIG1lYW5zIHRoZXJlIGlzIG5vdGhpbmcgdG8gY29tcGVuc2F0ZQorCQkJCSpwVHhBZ2NDb21wZW5zYXRlID0gLShUeEFnY1N0ZXAgKiAoaWR4LTEpKTsKKworCQkJCURlbHRhUHdyICs9ICgqcFR4QWdjQ29tcGVuc2F0ZSk7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0gVHggUG93ZXIsIEJCUCBSMT0leCwgVHNzaVJlZj0leCwgVHhBZ2NTdGVwPSV4LCBzdGVwID0gLSVkXG4iLAorCQkJCQlCYnBSNDksIFRzc2lSZWYsIFR4QWdjU3RlcCwgaWR4LTEpKTsKKwkJCX0KKwkJCWVsc2UgaWYgKEJicFI0OSA8IHBUc3NpUGx1c0JvdW5kYXJ5WzFdKQorCQkJeworCQkJCS8vIFJlYWRpbmcgaXMgc21hbGxlciB0aGFuIHRoZSByZWZlcmVuY2UgdmFsdWUKKwkJCQkvLyBjaGVjayBmb3IgaG93IGxhcmdlIHdlIG5lZWQgdG8gaW5jcmVhc2UgdGhlIFR4IHBvd2VyCisJCQkJZm9yIChpZHggPSAxOyBpZHggPCA1OyBpZHgrKykKKwkJCQl7CisJCQkJCWlmIChCYnBSNDkgPj0gcFRzc2lQbHVzQm91bmRhcnlbaWR4XSkgICAvLyBGb3VuZCB0aGUgcmFuZ2UKKwkJCQkJCWJyZWFrOworCQkJCX0KKwkJCQkvLyBUaGUgaW5kZXggaXMgdGhlIHN0ZXAgd2Ugc2hvdWxkIGluY3JlYXNlLCBpZHggPSAwIG1lYW5zIHRoZXJlIGlzIG5vdGhpbmcgdG8gY29tcGVuc2F0ZQorCQkJCSpwVHhBZ2NDb21wZW5zYXRlID0gVHhBZ2NTdGVwICogKGlkeC0xKTsKKwkJCQlEZWx0YVB3ciArPSAoKnBUeEFnY0NvbXBlbnNhdGUpOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIisrIFR4IFBvd2VyLCBCQlAgUjE9JXgsIFRzc2lSZWY9JXgsIFR4QWdjU3RlcD0leCwgc3RlcCA9ICslZFxuIiwKKwkJCQkJQmJwUjQ5LCBUc3NpUmVmLCBUeEFnY1N0ZXAsIGlkeC0xKSk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJKnBUeEFnY0NvbXBlbnNhdGUgPSAwOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiAgIFR4IFBvd2VyLCBCQlAgUjQ5PSV4LCBUc3NpUmVmPSV4LCBUeEFnY1N0ZXA9JXgsIHN0ZXAgPSArJWRcbiIsCisJCQkJCUJicFI0OSwgVHNzaVJlZiwgVHhBZ2NTdGVwLCAwKSk7CisJCQl9CisJCX0KKwl9CisJZWxzZQorCXsKKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPD0gMTQpCisJCXsKKwkJCWJBdXRvVHhBZ2MgICAgICAgICA9IHBBZC0+YkF1dG9UeEFnY0c7CisJCQlwVHhBZ2NDb21wZW5zYXRlICAgPSAmcEFkLT5UeEFnY0NvbXBlbnNhdGVHOworCQl9CisJCWVsc2UKKwkJeworCQkJYkF1dG9UeEFnYyAgICAgICAgID0gcEFkLT5iQXV0b1R4QWdjQTsKKwkJCXBUeEFnY0NvbXBlbnNhdGUgICA9ICZwQWQtPlR4QWdjQ29tcGVuc2F0ZUE7CisJCX0KKworCQlpZiAoYkF1dG9UeEFnYykKKwkJCURlbHRhUHdyICs9ICgqcFR4QWdjQ29tcGVuc2F0ZSk7CisJfQorCisJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IxLCAmQmJwUjEpOworCUJicFIxICY9IDB4RkM7CisKKyNpZmRlZiBTSU5HTEVfU0tVCisJLy8gSGFuZGxlIHJlZ3VsYXRvcnkgbWF4IHR4IHBvd2VyIGNvbnN0cmFpbgorCWRvCisJeworCQlVQ0hBUiAgICBUeFB3ckluRUVQUk9NID0gMHhGRiwgQ291bnRyeVR4UHdyID0gMHhGRiwgY3JpdGVyaW9uOworCQlVQ0hBUiAgICBBZGp1c3RNYXhUeFB3cls0MF07CisKKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPiAxNCkgLy8gNUcgYmFuZAorCQkJVHhQd3JJbkVFUFJPTSA9ICgocEFkLT5Db21tb25DZmcuRGVmaW5lTWF4VHhQd3IgJiAweEZGMDApID4+IDgpOworCQllbHNlIC8vIDIuNEcgYmFuZAorCQkJVHhQd3JJbkVFUFJPTSA9IChwQWQtPkNvbW1vbkNmZy5EZWZpbmVNYXhUeFB3ciAmIDB4MDBGRik7CisJCUNvdW50cnlUeFB3ciA9IEdldEN1bnRyeU1heFR4UHdyKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCk7CisKKwkJLy8gZXJyb3IgaGFuZGxpbmcsIHJhbmdlIGNoZWNrCisJCWlmICgoVHhQd3JJbkVFUFJPTSA+IDB4NTApIHx8IChDb3VudHJ5VHhQd3IgPiAweDUwKSkKKwkJeworCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJBc2ljQWRqdXN0VHhQb3dlciAtIEludmFsaWQgbWF4IHR4IHBvd2VyICg9MHglMDJ4KSwgQ291bnRyeVR4UHdyPSVkXG4iLCBUeFB3ckluRUVQUk9NLCBDb3VudHJ5VHhQd3IpKTsKKwkJCWJyZWFrOworCQl9CisKKwkJY3JpdGVyaW9uID0gKigoUFVDSEFSKVR4UHdyICsgMikgJiAweEY7ICAgICAgICAvLyBGQUUgdXNlIE9GRE0gNk0gYXMgY3JpdGVyaW9uCisKKwkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCgiQXNpY0FkanVzdFR4UG93ZXIgKGNyaXRlcmlvbj0lZCwgVHhQd3JJbkVFUFJPTT0lZCwgQ291bnRyeVR4UHdyPSVkKVxuIiwgY3JpdGVyaW9uLCBUeFB3ckluRUVQUk9NLCBDb3VudHJ5VHhQd3IpKTsKKworCQkvLyBBZGp1c3QgbWF4IHR4IHBvd2VyIGFjY29yZGluZyB0byB0aGUgcmVsYXRpb25zaGlwIG9mIHR4IHBvd2VyIGluIEUyUFJPTQorCQlmb3IgKGk9MDsgaTw1OyBpKyspCisJCXsKKwkJCS8vIENDSyB3aWxsIGhhdmUgNGRCbSBsYXJnZXIgdGhhbiBPRkRNCisJCQkvLyBUaGVyZWZvcmUsIHdlIHNob3VsZCBzZXBhcmF0ZSB0byBwYXJzZSB0aGUgdHggcG93ZXIgZmllbGQKKwkJCWlmIChpID09IDApCisJCQl7CisJCQkJZm9yIChqPTA7IGo8ODsgaisrKQorCQkJCXsKKwkJCQkJVmFsdWUgPSAoQ0hBUikoKFR4UHdyW2ldID4+IGoqNCkgJiAweDBGKTsKKworCQkJCQlpZiAoaiA8IDQpCisJCQkJCXsKKwkJCQkJCS8vIENDSyB3aWxsIGhhdmUgNGRCbSBsYXJnZXIgdGhhbiBPRkRNCisJCQkJCQlBZGp1c3RNYXhUeFB3cltpKjgral0gPSBUeFB3ckluRUVQUk9NICsgKFZhbHVlIC0gY3JpdGVyaW9uKSArIDQ7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlBZGp1c3RNYXhUeFB3cltpKjgral0gPSBUeFB3ckluRUVQUk9NICsgKFZhbHVlIC0gY3JpdGVyaW9uKTsKKwkJCQkJfQorCQkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsKCJBc2ljQWRqdXN0VHhQb3dlciAoaS9qPSVkLyVkLCBWYWx1ZT0lZCwgJWQpXG4iLCBpLCBqLCBWYWx1ZSwgQWRqdXN0TWF4VHhQd3JbaSo4K2pdKSk7CisJCQkJfQorCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWZvciAoaj0wOyBqPDg7IGorKykKKwkJCQl7CisJCQkJCVZhbHVlID0gKENIQVIpKChUeFB3cltpXSA+PiBqKjQpICYgMHgwRik7CisKKwkJCQkJQWRqdXN0TWF4VHhQd3JbaSo4K2pdID0gVHhQd3JJbkVFUFJPTSArIChWYWx1ZSAtIGNyaXRlcmlvbik7CisJCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwoIkFzaWNBZGp1c3RUeFBvd2VyIChpL2o9JWQvJWQsIFZhbHVlPSVkLCAlZClcbiIsIGksIGosIFZhbHVlLCBBZGp1c3RNYXhUeFB3cltpKjgral0pKTsKKwkJCQl9CisJCQl9CisJCX0KKworCQkvLyBBZGp1c3QgdHggcG93ZXIgYWNjb3JkaW5nIHRvIHRoZSByZWxhdGlvbnNoaXAKKwkJZm9yIChpPTA7IGk8NTsgaSsrKQorCQl7CisJCQlpZiAoVHhQd3JbaV0gIT0gMHhmZmZmZmZmZikKKwkJCXsKKwkJCQlmb3IgKGo9MDsgajw4OyBqKyspCisJCQkJeworCQkJCQlWYWx1ZSA9IChDSEFSKSgoVHhQd3JbaV0gPj4gaio0KSAmIDB4MEYpOworCisJCQkJCS8vIFRoZSBzeXN0ZW0gdHggcG93ZXIgaXMgbGFyZ2VyIHRoYW4gdGhlIHJlZ3VsYXRvcnksIHRoZSBwb3dlciBzaG91bGQgYmUgcmVzdHJhaW4KKwkJCQkJaWYgKEFkanVzdE1heFR4UHdyW2kqOCtqXSA+IENvdW50cnlUeFB3cikKKwkJCQkJeworCQkJCQkJLy8gZGVjcmVhc2UgdG8gemVybyBhbmQgZG9uJ3QgbmVlZCB0byB0YWtlIGNhcmUgQkJQUjEKKwkJCQkJCWlmICgoVmFsdWUgLSAoQWRqdXN0TWF4VHhQd3JbaSo4K2pdIC0gQ291bnRyeVR4UHdyKSkgPiAwKQorCQkJCQkJCVZhbHVlIC09IChBZGp1c3RNYXhUeFB3cltpKjgral0gLSBDb3VudHJ5VHhQd3IpOworCQkJCQkJZWxzZQorCQkJCQkJCVZhbHVlID0gMDsKKworCQkJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCgiQXNpY0FkanVzdFR4UG93ZXIgKGkvaj0lZC8lZCwgVmFsdWU9JWQsICVkKVxuIiwgaSwgaiwgVmFsdWUsIEFkanVzdE1heFR4UHdyW2kqOCtqXSkpOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwoIkFzaWNBZGp1c3RUeFBvd2VyIChpL2o9JWQvJWQsIFZhbHVlPSVkLCAlZCwgbm8gY2hhbmdlKVxuIiwgaSwgaiwgVmFsdWUsIEFkanVzdE1heFR4UHdyW2kqOCtqXSkpOworCisJCQkJCQlUeFB3cltpXSA9IChUeFB3cltpXSAmIH4oMHgwMDAwMDAwRiA8PCBqKjQpKSB8IChWYWx1ZSA8PCBqKjQpOworCQkJCX0KKwkJCX0KKwkJfQorCX0gd2hpbGUgKEZBTFNFKTsKKyNlbmRpZiAvLyBTSU5HTEVfU0tVIC8vCisKKwkvKiBjYWxjdWxhdGUgZGVsdGEgcG93ZXIgYmFzZWQgb24gdGhlIHBlcmNlbnRhZ2Ugc3BlY2lmaWVkIGZyb20gVUkgKi8KKwkvLyBFMlBST00gc2V0dGluZyBpcyBjYWxpYnJhdGVkIGZvciBtYXhpbXVtIFRYIHBvd2VyIChpLmUuIDEwMCUpCisJLy8gV2UgbG93ZXIgVFggcG93ZXIgaGVyZSBhY2NvcmRpbmcgdG8gdGhlIHBlcmNlbnRhZ2Ugc3BlY2lmaWVkIGZyb20gVUkKKwlpZiAocEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UgPT0gMHhmZmZmZmZmZikgICAgICAgLy8gQVVUTyBUWCBQT1dFUiBjb250cm9sCisJCTsKKwllbHNlIGlmIChwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA+IDkwKSAgLy8gOTEgfiAxMDAlICYgQVVUTywgdHJlYXQgYXMgMTAwJSBpbiB0ZXJtcyBvZiBtVworCQk7CisJZWxzZSBpZiAocEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UgPiA2MCkgIC8vIDYxIH4gOTAlLCB0cmVhdCBhcyA3NSUgaW4gdGVybXMgb2YgbVcJCS8vIERlbHRhUHdyIC09IDE7CisJeworCQlEZWx0YVB3ciAtPSAxOworCX0KKwllbHNlIGlmIChwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA+IDMwKSAgLy8gMzEgfiA2MCUsIHRyZWF0IGFzIDUwJSBpbiB0ZXJtcyBvZiBtVwkJLy8gRGVsdGFQd3IgLT0gMzsKKwl7CisJCURlbHRhUHdyIC09IDM7CisJfQorCWVsc2UgaWYgKHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID4gMTUpICAvLyAxNiB+IDMwJSwgdHJlYXQgYXMgMjUlIGluIHRlcm1zIG9mIG1XCQkvLyBEZWx0YVB3ciAtPSA2OworCXsKKwkJQmJwUjEgfD0gMHgwMTsKKwl9CisJZWxzZSBpZiAocEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UgPiA5KSAgIC8vIDEwIH4gMTUlLCB0cmVhdCBhcyAxMi41JSBpbiB0ZXJtcyBvZiBtVwkJLy8gRGVsdGFQd3IgLT0gOTsKKwl7CisJCUJicFIxIHw9IDB4MDE7CisJCURlbHRhUHdyIC09IDM7CisJfQorCWVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMCB+IDkgJSwgdHJlYXQgYXMgTUlOKH4zJSkgaW4gdGVybXMgb2YgbVcJCS8vIERlbHRhUHdyIC09IDEyOworCXsKKwkJQmJwUjEgfD0gMHgwMjsKKwl9CisKKwlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IxLCBCYnBSMSk7CisKKwkvKiByZXNldCBkaWZmZXJlbnQgbmV3IHR4IHBvd2VyIGZvciBkaWZmZXJlbnQgVFggcmF0ZSAqLworCWZvcihpPTA7IGk8NTsgaSsrKQorCXsKKwkJaWYgKFR4UHdyW2ldICE9IDB4ZmZmZmZmZmYpCisJCXsKKwkJCWZvciAoaj0wOyBqPDg7IGorKykKKwkJCXsKKwkJCQlWYWx1ZSA9IChDSEFSKSgoVHhQd3JbaV0gPj4gaio0KSAmIDB4MEYpOyAvKiAwIH4gMTUgKi8KKworCQkJCWlmICgoVmFsdWUgKyBEZWx0YVB3cikgPCAwKQorCQkJCXsKKwkJCQkJVmFsdWUgPSAwOyAvKiBtaW4gKi8KKwkJCQl9CisJCQkJZWxzZSBpZiAoKFZhbHVlICsgRGVsdGFQd3IpID4gMHhGKQorCQkJCXsKKwkJCQkJVmFsdWUgPSAweEY7IC8qIG1heCAqLworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlWYWx1ZSArPSBEZWx0YVB3cjsgLyogdGVtcGVyYXR1cmUgY29tcGVuc2F0aW9uICovCisJCQkJfQorCisJCQkJLyogZmlsbCBuZXcgdmFsdWUgdG8gQ1NSIG9mZnNldCAqLworCQkJCVR4UHdyW2ldID0gKFR4UHdyW2ldICYgfigweDAwMDAwMDBGIDw8IGoqNCkpIHwgKFZhbHVlIDw8IGoqNCk7CisJCQl9CisKKwkJCS8qIHdyaXRlIHR4IHBvd2VyIHZhbHVlIHRvIENTUiAqLworCQkJLyogVFhfUFdSX0NGR18wICg4IHR4IHJhdGUpIGZvcglUWCBwb3dlciBmb3IgT0ZETSAxMk0vMThNCisJCQkJCQkJCQkJCVRYIHBvd2VyIGZvciBPRkRNIDZNLzlNCisJCQkJCQkJCQkJCVRYIHBvd2VyIGZvciBDQ0s1LjVNLzExTQorCQkJCQkJCQkJCQlUWCBwb3dlciBmb3IgQ0NLMU0vMk0gKi8KKwkJCS8qIFRYX1BXUl9DRkdfMSB+IFRYX1BXUl9DRkdfNCAqLworCQkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfUFdSX0NGR18wICsgaSo0LCBUeFB3cltpXSk7CisJCX0KKwl9CisKK30KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlwdXQgUEhZIHRvIHNsZWVwIGhlcmUsIGFuZCBzZXQgbmV4dCB3YWtldXAgdGltZXIuIFBIWSBkb2Vzbid0IG5vdCB3YWtldXAKKwkJYXV0b21hdGljYWxseS4gSW5zdGVhZCwgTUNVIHdpbGwgaXNzdWUgYSBUd2FrZVVwSW50ZXJydXB0IHRvIGhvc3QgYWZ0ZXIKKwkJdGhlIHdha2V1cCB0aW1lciB0aW1lb3V0LiBEcml2ZXIgaGFzIHRvIGlzc3VlIGEgc2VwYXJhdGUgY29tbWFuZCB0byB3YWtlCisJCVBIWSB1cC4KKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBBc2ljU2xlZXBUaGVuQXV0b1dha2V1cCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVU0hPUlQgVGJ0dE51bVRvTmV4dFdha2VVcCkKK3sKKyAgICBSVDI4WFhfU1RBX1NMRUVQX1RIRU5fQVVUT19XQUtFVVAocEFkLCBUYnR0TnVtVG9OZXh0V2FrZVVwKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlBc2ljRm9yY2VXYWtldXAoKSBpcyB1c2VkIHdoZW5ldmVyIG1hbnVhbCB3YWtldXAgaXMgcmVxdWlyZWQKKwkJQXNpY0ZvcmNlU2xlZXAoKSBzaG91bGQgb25seSBiZSB1c2VkIHdoZW4gbm90IGluIElORlJBIEJTUy4gV2hlbgorCQlpbiBJTkZSQSBCU1MsIHdlIHNob3VsZCB1c2UgQXNpY1NsZWVwVGhlbkF1dG9XYWtldXAoKSBpbnN0ZWFkLgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgQXNpY0ZvcmNlU2xlZXAoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlBc2ljRm9yY2VXYWtldXAoKSBpcyB1c2VkIHdoZW5ldmVyIFR3YWtldXAgdGltZXIgKHNldCB2aWEgQXNpY1NsZWVwVGhlbkF1dG9XYWtldXApCisJCWV4cGlyZWQuCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgQXNpY0ZvcmNlV2FrZXVwKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIEJPT0xFQU4gICAgYkZyb21UeCkKK3sKKyAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLT4gQXNpY0ZvcmNlV2FrZXVwIFxuIikpOworICAgIFJUMjhYWF9TVEFfRk9SQ0VfV0FLRVVQKHBBZCwgYkZyb21UeCk7Cit9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVNldCBNeSBCU1NJRAorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIEFzaWNTZXRCc3NpZCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBQVUNIQVIgcEJzc2lkKQoreworCVVMT05HCQkgIEFkZHI0OworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT09PT09PT09PT09PiBBc2ljU2V0QnNzaWQgJXg6JXg6JXg6JXg6JXg6JXhcbiIsCisJCXBCc3NpZFswXSxwQnNzaWRbMV0scEJzc2lkWzJdLHBCc3NpZFszXSwgcEJzc2lkWzRdLHBCc3NpZFs1XSkpOworCisJQWRkcjQgPSAoVUxPTkcpKHBCc3NpZFswXSkJCSB8CisJCQkoVUxPTkcpKHBCc3NpZFsxXSA8PCA4KSAgfAorCQkJKFVMT05HKShwQnNzaWRbMl0gPDwgMTYpIHwKKwkJCShVTE9ORykocEJzc2lkWzNdIDw8IDI0KTsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfQlNTSURfRFcwLCBBZGRyNCk7CisKKwlBZGRyNCA9IDA7CisJLy8gYWx3YXlzIG9uZSBCU1NJRCBpbiBTVEEgbW9kZQorCUFkZHI0ID0gKFVMT05HKShwQnNzaWRbNF0pIHwgKFVMT05HKShwQnNzaWRbNV0gPDwgOCk7CisKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfQlNTSURfRFcxLCBBZGRyNCk7Cit9CisKK1ZPSUQgQXNpY1NldE1jYXN0V0MoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJTUFDX1RBQkxFX0VOVFJZICpwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtNQ0FTVF9XQ0lEXTsKKwlVU0hPUlQJCW9mZnNldDsKKworCXBFbnRyeS0+U3N0ICAgICAgICA9IFNTVF9BU1NPQzsKKwlwRW50cnktPkFpZCAgICAgICAgPSBNQ0FTVF9XQ0lEOwkvLyBTb2Z0YXAgc3VwcG9ydHMgMSBCU1NJRCBhbmQgdXNlIFdDSUQ9MCBhcyBtdWx0aWNhc3QgV2NpZCBpbmRleAorCXBFbnRyeS0+UHNNb2RlICAgICA9IFBXUl9BQ1RJVkU7CisJcEVudHJ5LT5DdXJyVHhSYXRlID0gcEFkLT5Db21tb25DZmcuTWxtZVJhdGU7CisJb2Zmc2V0ID0gTUFDX1dDSURfQkFTRSArIEJTUzBNY2FzdF9XQ0lEICogSFdfV0NJRF9FTlRSWV9TSVpFOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgQXNpY0RlbFdjaWRUYWIoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVUNIQVIJV2NpZCkKK3sKKwlVTE9ORwkJICBBZGRyMCA9IDB4MCwgQWRkcjEgPSAweDA7CisJVUxPTkcgCQlvZmZzZXQ7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBc2ljRGVsV2NpZFRhYj09PldjaWQgPSAweCV4XG4iLFdjaWQpKTsKKwlvZmZzZXQgPSBNQUNfV0NJRF9CQVNFICsgV2NpZCAqIEhXX1dDSURfRU5UUllfU0laRTsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBvZmZzZXQsIEFkZHIwKTsKKwlvZmZzZXQgKz0gNDsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBvZmZzZXQsIEFkZHIxKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIEFzaWNFbmFibGVSREcoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJVFhfTElOS19DRkdfU1RSVUMJVHhMaW5rQ2ZnOworCVVJTlQzMgkJCQlEYXRhID0gMDsKKworCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfTElOS19DRkcsICZUeExpbmtDZmcud29yZCk7CisJVHhMaW5rQ2ZnLmZpZWxkLlR4UkRHRW4gPSAxOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX0xJTktfQ0ZHLCBUeExpbmtDZmcud29yZCk7CisKKwlSVE1QX0lPX1JFQUQzMihwQWQsIEVEQ0FfQUMwX0NGRywgJkRhdGEpOworCURhdGEgICY9IDB4RkZGRkZGMDA7CisJRGF0YSAgfD0gMHg4MDsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBFRENBX0FDMF9DRkcsIERhdGEpOworCisJLy9PUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19BR0dSRUdBVElPTl9JTlVTRUQpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgQXNpY0Rpc2FibGVSREcoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJVFhfTElOS19DRkdfU1RSVUMJVHhMaW5rQ2ZnOworCVVJTlQzMgkJCQlEYXRhID0gMDsKKworCisJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9MSU5LX0NGRywgJlR4TGlua0NmZy53b3JkKTsKKwlUeExpbmtDZmcuZmllbGQuVHhSREdFbiA9IDA7CisJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfTElOS19DRkcsIFR4TGlua0NmZy53b3JkKTsKKworCVJUTVBfSU9fUkVBRDMyKHBBZCwgRURDQV9BQzBfQ0ZHLCAmRGF0YSk7CisKKwlEYXRhICAmPSAweEZGRkZGRjAwOworCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfRFlOQU1JQ19CRV9UWE9QX0FDVElWRSkKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJJiYgKHBBZC0+TWFjVGFiLmZBbnlTdGF0aW9uTUlNT1BTRHluYW1pYyA9PSBGQUxTRSkKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkpCisJeworCQkvLyBGb3IgQ1dDIHRlc3QsIGNoYW5nZSB0eG9wIGZyb20gMHgzMCB0byAweDIwIGluIFR4QnVyc3QgbW9kZQorCQlpZiAocEFkLT5Db21tb25DZmcuYkVuYWJsZVR4QnVyc3QpCisJCQlEYXRhIHw9IDB4MjA7CisJfQorCVJUTVBfSU9fV1JJVEUzMihwQWQsIEVEQ0FfQUMwX0NGRywgRGF0YSk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKworCUlSUUwgPSBQQVNTSVZFX0xFVkVMCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIEFzaWNEaXNhYmxlU3luYygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlCQ05fVElNRV9DRkdfU1RSVUMgY3NyOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0tPkRpc2FibGUgVFNGIHN5bmNocm9uaXphdGlvblxuIikpOworCisJLy8gMjAwMy0xMi0yMCBkaXNhYmxlIFRTRiBhbmQgVEJUVCB3aGlsZSBOSUMgaW4gcG93ZXItc2F2aW5nIGhhdmUgc2lkZSBlZmZlY3QKKwkvLwkJCSAgdGhhdCBOSUMgd2lsbCBuZXZlciB3YWtlcyB1cCBiZWNhdXNlIFRTRiBzdG9wcyBhbmQgbm8gbW9yZQorCS8vCQkJICBUQlRUIGludGVycnVwdHMKKwlwQWQtPlRidHRUaWNrQ291bnQgPSAwOworCVJUTVBfSU9fUkVBRDMyKHBBZCwgQkNOX1RJTUVfQ0ZHLCAmY3NyLndvcmQpOworCWNzci5maWVsZC5iQmVhY29uR2VuID0gMDsKKwljc3IuZmllbGQuYlRCVFRFbmFibGUgPSAwOworCWNzci5maWVsZC5Uc2ZTeW5jTW9kZSA9IDA7CisJY3NyLmZpZWxkLmJUc2ZUaWNraW5nID0gMDsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBCQ05fVElNRV9DRkcsIGNzci53b3JkKTsKKworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgQXNpY0VuYWJsZUJzc1N5bmMoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJQkNOX1RJTUVfQ0ZHX1NUUlVDIGNzcjsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tLT5Bc2ljRW5hYmxlQnNzU3luYyhJTkZSQSBtb2RlKVxuIikpOworCisJUlRNUF9JT19SRUFEMzIocEFkLCBCQ05fVElNRV9DRkcsICZjc3Iud29yZCk7CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwl7CisJCWNzci5maWVsZC5CZWFjb25JbnRlcnZhbCA9IHBBZC0+Q29tbW9uQ2ZnLkJlYWNvblBlcmlvZCA8PCA0OyAvLyBBU0lDIHJlZ2lzdGVyIGluIHVuaXRzIG9mIDEvMTYgVFUKKwkJY3NyLmZpZWxkLmJUc2ZUaWNraW5nID0gMTsKKwkJY3NyLmZpZWxkLlRzZlN5bmNNb2RlID0gMTsgLy8gc3luYyBUU0YgaW4gSU5GUkFTVFJVQ1RVUkUgbW9kZQorCQljc3IuZmllbGQuYkJlYWNvbkdlbiAgPSAwOyAvLyBkbyBOT1QgZ2VuZXJhdGUgQkVBQ09OCisJCWNzci5maWVsZC5iVEJUVEVuYWJsZSA9IDE7CisJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCVJUTVBfSU9fV1JJVEUzMihwQWQsIEJDTl9USU1FX0NGRywgY3NyLndvcmQpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJTm90ZToKKwkJQkVBQ09OIGZyYW1lIGluIHNoYXJlZCBtZW1vcnkgc2hvdWxkIGJlIGJ1aWx0IG9rIGJlZm9yZSB0aGlzIHJvdXRpbmUKKwkJY2FuIGJlIGNhbGxlZC4gT3RoZXJ3aXNlLCBhIGdhcmJhZ2UgZnJhbWUgbWF5YmUgdHJhbnNtaXR0ZWQgb3V0IGV2ZXJ5CisJCUJlYWNvbiBwZXJpb2QuCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgQXNpY0VuYWJsZUlic3NTeW5jKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCUJDTl9USU1FX0NGR19TVFJVQyBjc3I5OworCVBVQ0hBUgkJCXB0cjsKKwlVSU5UIGk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLS0+QXNpY0VuYWJsZUlic3NTeW5jKEFESE9DIG1vZGUuIE1QRFV0b3RhbEJ5dGVDb3VudCA9ICVkKVxuIiwgcEFkLT5CZWFjb25UeFdJLk1QRFV0b3RhbEJ5dGVDb3VudCkpOworCisJUlRNUF9JT19SRUFEMzIocEFkLCBCQ05fVElNRV9DRkcsICZjc3I5LndvcmQpOworCWNzcjkuZmllbGQuYkJlYWNvbkdlbiA9IDA7CisJY3NyOS5maWVsZC5iVEJUVEVuYWJsZSA9IDA7CisJY3NyOS5maWVsZC5iVHNmVGlja2luZyA9IDA7CisJUlRNUF9JT19XUklURTMyKHBBZCwgQkNOX1RJTUVfQ0ZHLCBjc3I5LndvcmQpOworCisjaWZkZWYgUlQyODYwCisJLy8gbW92ZSBCRUFDT04gVFhEIGFuZCBmcmFtZSBjb250ZW50IHRvIG9uLWNoaXAgbWVtb3J5CisJcHRyID0gKFBVQ0hBUikmcEFkLT5CZWFjb25UeFdJOworCWZvciAoaT0wOyBpPFRYV0lfU0laRTsgaSs9NCkgIC8vIDE2LWJ5dGUgVFhXSSBmaWVsZAorCXsKKwkJVUlOVDMyIGxvbmdwdHIgPSAgKnB0ciArICgqKHB0cisxKTw8OCkgKyAoKihwdHIrMik8PDE2KSArICgqKHB0ciszKTw8MjQpOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBIV19CRUFDT05fQkFTRTAgKyBpLCBsb25ncHRyKTsKKwkJcHRyICs9IDQ7CisJfQorCisJLy8gc3RhcnQgcmlnaHQgYWZ0ZXIgdGhlIDE2LWJ5dGUgVFhXSSBmaWVsZAorCXB0ciA9IHBBZC0+QmVhY29uQnVmOworCWZvciAoaT0wOyBpPCBwQWQtPkJlYWNvblR4V0kuTVBEVXRvdGFsQnl0ZUNvdW50OyBpKz00KQorCXsKKwkJVUlOVDMyIGxvbmdwdHIgPSAgKnB0ciArICgqKHB0cisxKTw8OCkgKyAoKihwdHIrMik8PDE2KSArICgqKHB0ciszKTw8MjQpOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBIV19CRUFDT05fQkFTRTAgKyBUWFdJX1NJWkUgKyBpLCBsb25ncHRyKTsKKwkJcHRyICs9NDsKKwl9CisjZW5kaWYgLy8gUlQyODYwIC8vCisKKwkvLyBzdGFydCBzZW5kaW5nIEJFQUNPTgorCWNzcjkuZmllbGQuQmVhY29uSW50ZXJ2YWwgPSBwQWQtPkNvbW1vbkNmZy5CZWFjb25QZXJpb2QgPDwgNDsgLy8gQVNJQyByZWdpc3RlciBpbiB1bml0cyBvZiAxLzE2IFRVCisJY3NyOS5maWVsZC5iVHNmVGlja2luZyA9IDE7CisJY3NyOS5maWVsZC5Uc2ZTeW5jTW9kZSA9IDI7IC8vIHN5bmMgVFNGIGluIElCU1MgbW9kZQorCWNzcjkuZmllbGQuYlRCVFRFbmFibGUgPSAxOworCWNzcjkuZmllbGQuYkJlYWNvbkdlbiA9IDE7CisJUlRNUF9JT19XUklURTMyKHBBZCwgQkNOX1RJTUVfQ0ZHLCBjc3I5LndvcmQpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBBc2ljU2V0RWRjYVBhcm0oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gUEVEQ0FfUEFSTQkgcEVkY2FQYXJtKQoreworCUVEQ0FfQUNfQ0ZHX1NUUlVDICAgQWMwQ2ZnLCBBYzFDZmcsIEFjMkNmZywgQWMzQ2ZnOworCUFDX1RYT1BfQ1NSMF9TVFJVQyBjc3IwOworCUFDX1RYT1BfQ1NSMV9TVFJVQyBjc3IxOworCUFJRlNOX0NTUl9TVFJVQyAgICBBaWZzbkNzcjsKKwlDV01JTl9DU1JfU1RSVUMgICAgQ3dtaW5Dc3I7CisJQ1dNQVhfQ1NSX1NUUlVDICAgIEN3bWF4Q3NyOworCWludCBpOworCisJQWMwQ2ZnLndvcmQgPSAwOworCUFjMUNmZy53b3JkID0gMDsKKwlBYzJDZmcud29yZCA9IDA7CisJQWMzQ2ZnLndvcmQgPSAwOworCWlmICgocEVkY2FQYXJtID09IE5VTEwpIHx8IChwRWRjYVBhcm0tPmJWYWxpZCA9PSBGQUxTRSkpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkFzaWNTZXRFZGNhUGFybVxuIikpOworCQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19XTU1fSU5VU0VEKTsKKwkJZm9yIChpPTA7IGk8TUFYX0xFTl9PRl9NQUNfVEFCTEU7IGkrKykKKwkJeworCQkJaWYgKHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uVmFsaWRBc0NMSSB8fCBwQWQtPk1hY1RhYi5Db250ZW50W2ldLlZhbGlkQXNBcENsaSkKKwkJCQlDTElFTlRfU1RBVFVTX0NMRUFSX0ZMQUcoJnBBZC0+TWFjVGFiLkNvbnRlbnRbaV0sIGZDTElFTlRfU1RBVFVTX1dNTV9DQVBBQkxFKTsKKwkJfQorCisJCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkJLy8gICAgICBNQUMgUmVnaXN0ZXIgaGFzIGEgY29weSAuCisJCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkJaWYoIHBBZC0+Q29tbW9uQ2ZnLmJFbmFibGVUeEJ1cnN0ICkKKwkJeworCQkJLy8gRm9yIENXQyB0ZXN0LCBjaGFuZ2UgdHhvcCBmcm9tIDB4MzAgdG8gMHgyMCBpbiBUeEJ1cnN0IG1vZGUKKwkJCUFjMENmZy5maWVsZC5BY1R4b3AgPSAweDIwOyAvLyBTdWdnZXN0IGJ5IEpvaG4gZm9yIFR4QnVyc3QgaW4gSFQgTW9kZQorCQl9CisJCWVsc2UKKwkJCUFjMENmZy5maWVsZC5BY1R4b3AgPSAwOwkvLyBRSURfQUNfQkUKKwkJQWMwQ2ZnLmZpZWxkLkN3bWluID0gQ1dfTUlOX0lOX0JJVFM7CisJCUFjMENmZy5maWVsZC5Dd21heCA9IENXX01BWF9JTl9CSVRTOworCQlBYzBDZmcuZmllbGQuQWlmc24gPSAyOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBFRENBX0FDMF9DRkcsIEFjMENmZy53b3JkKTsKKworCQlBYzFDZmcuZmllbGQuQWNUeG9wID0gMDsJLy8gUUlEX0FDX0JLCisJCUFjMUNmZy5maWVsZC5Dd21pbiA9IENXX01JTl9JTl9CSVRTOworCQlBYzFDZmcuZmllbGQuQ3dtYXggPSBDV19NQVhfSU5fQklUUzsKKwkJQWMxQ2ZnLmZpZWxkLkFpZnNuID0gMjsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgRURDQV9BQzFfQ0ZHLCBBYzFDZmcud29yZCk7CisKKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQikKKwkJeworCQkJQWMyQ2ZnLmZpZWxkLkFjVHhvcCA9IDE5MjsJLy8gQUNfVkk6IDE5MiozMnVzIH49IDZtcworCQkJQWMzQ2ZnLmZpZWxkLkFjVHhvcCA9IDk2OwkvLyBBQ19WTzogOTYqMzJ1cyAgfj0gM21zCisJCX0KKwkJZWxzZQorCQl7CisJCQlBYzJDZmcuZmllbGQuQWNUeG9wID0gOTY7CS8vIEFDX1ZJOiA5NiozMnVzIH49IDNtcworCQkJQWMzQ2ZnLmZpZWxkLkFjVHhvcCA9IDQ4OwkvLyBBQ19WTzogNDgqMzJ1cyB+PSAxLjVtcworCQl9CisJCUFjMkNmZy5maWVsZC5Dd21pbiA9IENXX01JTl9JTl9CSVRTOworCQlBYzJDZmcuZmllbGQuQ3dtYXggPSBDV19NQVhfSU5fQklUUzsKKwkJQWMyQ2ZnLmZpZWxkLkFpZnNuID0gMjsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgRURDQV9BQzJfQ0ZHLCBBYzJDZmcud29yZCk7CisJCUFjM0NmZy5maWVsZC5Dd21pbiA9IENXX01JTl9JTl9CSVRTOworCQlBYzNDZmcuZmllbGQuQ3dtYXggPSBDV19NQVhfSU5fQklUUzsKKwkJQWMzQ2ZnLmZpZWxkLkFpZnNuID0gMjsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgRURDQV9BQzNfQ0ZHLCBBYzNDZmcud29yZCk7CisKKwkJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCQkvLyAgICAgIERNQSBSZWdpc3RlciBoYXMgYSBjb3B5IHRvby4KKwkJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCQljc3IwLmZpZWxkLkFjMFR4b3AgPSAwOwkJLy8gUUlEX0FDX0JFCisJCWNzcjAuZmllbGQuQWMxVHhvcCA9IDA7CQkvLyBRSURfQUNfQksKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgV01NX1RYT1AwX0NGRywgY3NyMC53b3JkKTsKKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQikKKwkJeworCQkJY3NyMS5maWVsZC5BYzJUeG9wID0gMTkyOwkJLy8gQUNfVkk6IDE5MiozMnVzIH49IDZtcworCQkJY3NyMS5maWVsZC5BYzNUeG9wID0gOTY7CQkvLyBBQ19WTzogOTYqMzJ1cyAgfj0gM21zCisJCX0KKwkJZWxzZQorCQl7CisJCQljc3IxLmZpZWxkLkFjMlR4b3AgPSA5NjsJCS8vIEFDX1ZJOiA5NiozMnVzIH49IDNtcworCQkJY3NyMS5maWVsZC5BYzNUeG9wID0gNDg7CQkvLyBBQ19WTzogNDgqMzJ1cyB+PSAxLjVtcworCQl9CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFdNTV9UWE9QMV9DRkcsIGNzcjEud29yZCk7CisKKwkJQ3dtaW5Dc3Iud29yZCA9IDA7CisJCUN3bWluQ3NyLmZpZWxkLkN3bWluMCA9IENXX01JTl9JTl9CSVRTOworCQlDd21pbkNzci5maWVsZC5Dd21pbjEgPSBDV19NSU5fSU5fQklUUzsKKwkJQ3dtaW5Dc3IuZmllbGQuQ3dtaW4yID0gQ1dfTUlOX0lOX0JJVFM7CisJCUN3bWluQ3NyLmZpZWxkLkN3bWluMyA9IENXX01JTl9JTl9CSVRTOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBXTU1fQ1dNSU5fQ0ZHLCBDd21pbkNzci53b3JkKTsKKworCQlDd21heENzci53b3JkID0gMDsKKwkJQ3dtYXhDc3IuZmllbGQuQ3dtYXgwID0gQ1dfTUFYX0lOX0JJVFM7CisJCUN3bWF4Q3NyLmZpZWxkLkN3bWF4MSA9IENXX01BWF9JTl9CSVRTOworCQlDd21heENzci5maWVsZC5Dd21heDIgPSBDV19NQVhfSU5fQklUUzsKKwkJQ3dtYXhDc3IuZmllbGQuQ3dtYXgzID0gQ1dfTUFYX0lOX0JJVFM7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFdNTV9DV01BWF9DRkcsIEN3bWF4Q3NyLndvcmQpOworCisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFdNTV9BSUZTTl9DRkcsIDB4MDAwMDIyMjIpOworCisJCU5kaXNaZXJvTWVtb3J5KCZwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLCBzaXplb2YoRURDQV9QQVJNKSk7CisJfQorCWVsc2UKKwl7CisJCU9QU1RBVFVTX1NFVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19XTU1fSU5VU0VEKTsKKwkJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCQkvLyAgICAgIE1BQyBSZWdpc3RlciBoYXMgYSBjb3B5LgorCQkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJCS8vCisJCS8vIE1vZGlmeSBDd21pbi9Dd21heC9UeG9wIG9uIHF1ZXVlW1FJRF9BQ19WSV0sIFJlY29tbWVuZCBieSBKZXJyeSAyMDA1LzA3LzI3CisJCS8vIFRvIGRlZ3JhZGUgb3VyIFZJRE8gUXVldWUncyB0aHJvdWdocHV0IGZvciBXaUZpIFdNTSBTM1QwNyBJc3N1ZS4KKwkJLy8KKwkJLy9wRWRjYVBhcm0tPlR4b3BbUUlEX0FDX1ZJXSA9IHBFZGNhUGFybS0+VHhvcFtRSURfQUNfVkldICogNyAvIDEwOyAvLyBydDI4NjBjIG5lZWQgdGhpcworCisJCUFjMENmZy5maWVsZC5BY1R4b3AgPSAgcEVkY2FQYXJtLT5UeG9wW1FJRF9BQ19CRV07CisJCUFjMENmZy5maWVsZC5Dd21pbj0gcEVkY2FQYXJtLT5Dd21pbltRSURfQUNfQkVdOworCQlBYzBDZmcuZmllbGQuQ3dtYXggPSBwRWRjYVBhcm0tPkN3bWF4W1FJRF9BQ19CRV07CisJCUFjMENmZy5maWVsZC5BaWZzbiA9IHBFZGNhUGFybS0+QWlmc25bUUlEX0FDX0JFXTsgLy8rMTsKKworCQlBYzFDZmcuZmllbGQuQWNUeG9wID0gIHBFZGNhUGFybS0+VHhvcFtRSURfQUNfQktdOworCQlBYzFDZmcuZmllbGQuQ3dtaW4gPSBwRWRjYVBhcm0tPkN3bWluW1FJRF9BQ19CS107IC8vKzI7CisJCUFjMUNmZy5maWVsZC5Dd21heCA9IHBFZGNhUGFybS0+Q3dtYXhbUUlEX0FDX0JLXTsKKwkJQWMxQ2ZnLmZpZWxkLkFpZnNuID0gcEVkY2FQYXJtLT5BaWZzbltRSURfQUNfQktdOyAvLysxOworCisJCUFjMkNmZy5maWVsZC5BY1R4b3AgPSAocEVkY2FQYXJtLT5UeG9wW1FJRF9BQ19WSV0gKiA2KSAvIDEwOworCQlBYzJDZmcuZmllbGQuQ3dtaW4gPSBwRWRjYVBhcm0tPkN3bWluW1FJRF9BQ19WSV07CisJCUFjMkNmZy5maWVsZC5Dd21heCA9IHBFZGNhUGFybS0+Q3dtYXhbUUlEX0FDX1ZJXTsKKwkJQWMyQ2ZnLmZpZWxkLkFpZnNuID0gcEVkY2FQYXJtLT5BaWZzbltRSURfQUNfVkldOworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQl7CisJCQkvLyBUdW5pbmcgZm9yIFdpLUZpIFdNTSBTMDYKKwkJCWlmIChwQWQtPkNvbW1vbkNmZy5iV2lGaVRlc3QgJiYKKwkJCQlwRWRjYVBhcm0tPkFpZnNuW1FJRF9BQ19WSV0gPT0gMTApCisJCQkJQWMyQ2ZnLmZpZWxkLkFpZnNuIC09IDE7CisKKwkJCS8vIFR1bmluZyBmb3IgVEduIFdpLUZpIDUuMi4zMgorCQkJLy8gU1RBIFRlc3RCZWQgY2hhbmdlcyBpbiB0aGlzIGl0ZW06IGNvbmV4YW50IGxlZ2FjeSBzdGEgPT0+IGJyb2FkY29tIDExbiBzdGEKKwkJCWlmIChTVEFfVEdOX1dJRklfT04ocEFkKSAmJgorCQkJCXBFZGNhUGFybS0+QWlmc25bUUlEX0FDX1ZJXSA9PSAxMCkKKwkJCXsKKwkJCQlBYzBDZmcuZmllbGQuQWlmc24gPSAzOworCQkJCUFjMkNmZy5maWVsZC5BY1R4b3AgPSA1OworCQkJfQorCQl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwkJQWMzQ2ZnLmZpZWxkLkFjVHhvcCA9IHBFZGNhUGFybS0+VHhvcFtRSURfQUNfVk9dOworCQlBYzNDZmcuZmllbGQuQ3dtaW4gPSBwRWRjYVBhcm0tPkN3bWluW1FJRF9BQ19WT107CisJCUFjM0NmZy5maWVsZC5Dd21heCA9IHBFZGNhUGFybS0+Q3dtYXhbUUlEX0FDX1ZPXTsKKwkJQWMzQ2ZnLmZpZWxkLkFpZnNuID0gcEVkY2FQYXJtLT5BaWZzbltRSURfQUNfVk9dOworCisvLyNpZmRlZiBXSUZJX1RFU1QKKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJXaUZpVGVzdCkKKwkJeworCQkJaWYgKEFjM0NmZy5maWVsZC5BY1R4b3AgPT0gMTAyKQorCQkJeworCQkJQWMwQ2ZnLmZpZWxkLkFjVHhvcCA9IHBFZGNhUGFybS0+VHhvcFtRSURfQUNfQkVdID8gcEVkY2FQYXJtLT5UeG9wW1FJRF9BQ19CRV0gOiAxMDsKKwkJCQlBYzBDZmcuZmllbGQuQWlmc24gID0gcEVkY2FQYXJtLT5BaWZzbltRSURfQUNfQkVdLTE7IC8qIEFJRlNOIG11c3QgPj0gMSAqLworCQkJQWMxQ2ZnLmZpZWxkLkFjVHhvcCA9IHBFZGNhUGFybS0+VHhvcFtRSURfQUNfQktdOworCQkJCUFjMUNmZy5maWVsZC5BaWZzbiAgPSBwRWRjYVBhcm0tPkFpZnNuW1FJRF9BQ19CS107CisJCQlBYzJDZmcuZmllbGQuQWNUeG9wID0gcEVkY2FQYXJtLT5UeG9wW1FJRF9BQ19WSV07CisJCQl9IC8qIEVuZCBvZiBpZiAqLworCQl9CisvLyNlbmRpZiAvLyBXSUZJX1RFU1QgLy8KKworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBFRENBX0FDMF9DRkcsIEFjMENmZy53b3JkKTsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgRURDQV9BQzFfQ0ZHLCBBYzFDZmcud29yZCk7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIEVEQ0FfQUMyX0NGRywgQWMyQ2ZnLndvcmQpOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBFRENBX0FDM19DRkcsIEFjM0NmZy53b3JkKTsKKworCisJCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkJLy8gICAgICBETUEgUmVnaXN0ZXIgaGFzIGEgY29weSB0b28uCisJCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkJY3NyMC5maWVsZC5BYzBUeG9wID0gQWMwQ2ZnLmZpZWxkLkFjVHhvcDsKKwkJY3NyMC5maWVsZC5BYzFUeG9wID0gQWMxQ2ZnLmZpZWxkLkFjVHhvcDsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgV01NX1RYT1AwX0NGRywgY3NyMC53b3JkKTsKKworCQljc3IxLmZpZWxkLkFjMlR4b3AgPSBBYzJDZmcuZmllbGQuQWNUeG9wOworCQljc3IxLmZpZWxkLkFjM1R4b3AgPSBBYzNDZmcuZmllbGQuQWNUeG9wOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBXTU1fVFhPUDFfQ0ZHLCBjc3IxLndvcmQpOworCisJCUN3bWluQ3NyLndvcmQgPSAwOworCQlDd21pbkNzci5maWVsZC5Dd21pbjAgPSBwRWRjYVBhcm0tPkN3bWluW1FJRF9BQ19CRV07CisJCUN3bWluQ3NyLmZpZWxkLkN3bWluMSA9IHBFZGNhUGFybS0+Q3dtaW5bUUlEX0FDX0JLXTsKKwkJQ3dtaW5Dc3IuZmllbGQuQ3dtaW4yID0gcEVkY2FQYXJtLT5Dd21pbltRSURfQUNfVkldOworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQkJQ3dtaW5Dc3IuZmllbGQuQ3dtaW4zID0gcEVkY2FQYXJtLT5Dd21pbltRSURfQUNfVk9dIC0gMTsgLy9mb3IgVEduIHdpZmkgdGVzdAorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBXTU1fQ1dNSU5fQ0ZHLCBDd21pbkNzci53b3JkKTsKKworCQlDd21heENzci53b3JkID0gMDsKKwkJQ3dtYXhDc3IuZmllbGQuQ3dtYXgwID0gcEVkY2FQYXJtLT5Dd21heFtRSURfQUNfQkVdOworCQlDd21heENzci5maWVsZC5Dd21heDEgPSBwRWRjYVBhcm0tPkN3bWF4W1FJRF9BQ19CS107CisJCUN3bWF4Q3NyLmZpZWxkLkN3bWF4MiA9IHBFZGNhUGFybS0+Q3dtYXhbUUlEX0FDX1ZJXTsKKwkJQ3dtYXhDc3IuZmllbGQuQ3dtYXgzID0gcEVkY2FQYXJtLT5Dd21heFtRSURfQUNfVk9dOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBXTU1fQ1dNQVhfQ0ZHLCBDd21heENzci53b3JkKTsKKworCQlBaWZzbkNzci53b3JkID0gMDsKKwkJQWlmc25Dc3IuZmllbGQuQWlmc24wID0gQWMwQ2ZnLmZpZWxkLkFpZnNuOyAvL3BFZGNhUGFybS0+QWlmc25bUUlEX0FDX0JFXTsKKwkJQWlmc25Dc3IuZmllbGQuQWlmc24xID0gQWMxQ2ZnLmZpZWxkLkFpZnNuOyAvL3BFZGNhUGFybS0+QWlmc25bUUlEX0FDX0JLXTsKKwkJQWlmc25Dc3IuZmllbGQuQWlmc24yID0gQWMyQ2ZnLmZpZWxkLkFpZnNuOyAvL3BFZGNhUGFybS0+QWlmc25bUUlEX0FDX1ZJXTsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJeworCQkJLy8gVHVuaW5nIGZvciBXaS1GaSBXTU0gUzA2CisJCQlpZiAocEFkLT5Db21tb25DZmcuYldpRmlUZXN0ICYmCisJCQkJcEVkY2FQYXJtLT5BaWZzbltRSURfQUNfVkldID09IDEwKQorCQkJCUFpZnNuQ3NyLmZpZWxkLkFpZnNuMiA9IEFjMkNmZy5maWVsZC5BaWZzbiAtIDQ7CisKKwkJCS8vIFR1bmluZyBmb3IgVEduIFdpLUZpIDUuMi4zMgorCQkJLy8gU1RBIFRlc3RCZWQgY2hhbmdlcyBpbiB0aGlzIGl0ZW06IGNvbmV4YW50IGxlZ2FjeSBzdGEgPT0+IGJyb2FkY29tIDExbiBzdGEKKwkJCWlmIChTVEFfVEdOX1dJRklfT04ocEFkKSAmJgorCQkJCXBFZGNhUGFybS0+QWlmc25bUUlEX0FDX1ZJXSA9PSAxMCkKKwkJCXsKKwkJCQlBaWZzbkNzci5maWVsZC5BaWZzbjAgPSAzOworCQkJCUFpZnNuQ3NyLmZpZWxkLkFpZnNuMiA9IDc7CisJCQl9CisJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQkJQWlmc25Dc3IuZmllbGQuQWlmc24zID0gQWMzQ2ZnLmZpZWxkLkFpZnNuIC0gMTsgLy9wRWRjYVBhcm0tPkFpZnNuW1FJRF9BQ19WT107IC8vZm9yIFRHbiB3aWZpIHRlc3QKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwkJUlRNUF9JT19XUklURTMyKHBBZCwgV01NX0FJRlNOX0NGRywgQWlmc25Dc3Iud29yZCk7CisKKwkJTmRpc01vdmVNZW1vcnkoJnBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0sIHBFZGNhUGFybSwgc2l6ZW9mKEVEQ0FfUEFSTSkpOworCQlpZiAoIUFESE9DX09OKHBBZCkpCisJCXsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiRURDQSBbIyVkXTogQUlGU04gQ1dtaW4gQ1dtYXggIFRYT1AodXMpICBBQ01cbiIsIHBFZGNhUGFybS0+RWRjYVVwZGF0ZUNvdW50KSk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIiAgICAgQUNfQkUgICAgICAlMmQgICAgICUyZCAgICAgJTJkICAgICAgJTRkICAgICAlZFxuIiwKKwkJCQkJCQkJCSBwRWRjYVBhcm0tPkFpZnNuWzBdLAorCQkJCQkJCQkJIHBFZGNhUGFybS0+Q3dtaW5bMF0sCisJCQkJCQkJCQkgcEVkY2FQYXJtLT5Dd21heFswXSwKKwkJCQkJCQkJCSBwRWRjYVBhcm0tPlR4b3BbMF08PDUsCisJCQkJCQkJCQkgcEVkY2FQYXJtLT5iQUNNWzBdKSk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIiAgICAgQUNfQksgICAgICAlMmQgICAgICUyZCAgICAgJTJkICAgICAgJTRkICAgICAlZFxuIiwKKwkJCQkJCQkJCSBwRWRjYVBhcm0tPkFpZnNuWzFdLAorCQkJCQkJCQkJIHBFZGNhUGFybS0+Q3dtaW5bMV0sCisJCQkJCQkJCQkgcEVkY2FQYXJtLT5Dd21heFsxXSwKKwkJCQkJCQkJCSBwRWRjYVBhcm0tPlR4b3BbMV08PDUsCisJCQkJCQkJCQkgcEVkY2FQYXJtLT5iQUNNWzFdKSk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIiAgICAgQUNfVkkgICAgICAlMmQgICAgICUyZCAgICAgJTJkICAgICAgJTRkICAgICAlZFxuIiwKKwkJCQkJCQkJCSBwRWRjYVBhcm0tPkFpZnNuWzJdLAorCQkJCQkJCQkJIHBFZGNhUGFybS0+Q3dtaW5bMl0sCisJCQkJCQkJCQkgcEVkY2FQYXJtLT5Dd21heFsyXSwKKwkJCQkJCQkJCSBwRWRjYVBhcm0tPlR4b3BbMl08PDUsCisJCQkJCQkJCQkgcEVkY2FQYXJtLT5iQUNNWzJdKSk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIiAgICAgQUNfVk8gICAgICAlMmQgICAgICUyZCAgICAgJTJkICAgICAgJTRkICAgICAlZFxuIiwKKwkJCQkJCQkJCSBwRWRjYVBhcm0tPkFpZnNuWzNdLAorCQkJCQkJCQkJIHBFZGNhUGFybS0+Q3dtaW5bM10sCisJCQkJCQkJCQkgcEVkY2FQYXJtLT5Dd21heFszXSwKKwkJCQkJCQkJCSBwRWRjYVBhcm0tPlR4b3BbM108PDUsCisJCQkJCQkJCQkgcEVkY2FQYXJtLT5iQUNNWzNdKSk7CisJCX0KKwl9Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKworCUlSUUwgPSBQQVNTSVZFX0xFVkVMCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIAlBc2ljU2V0U2xvdFRpbWUoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gQk9PTEVBTiBiVXNlU2hvcnRTbG90VGltZSkKK3sKKwlVTE9ORwlTbG90VGltZTsKKwlVSU5UMzIJUmVnVmFsdWUgPSAwOworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJaWYgKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPiAxNCkKKwkJYlVzZVNob3J0U2xvdFRpbWUgPSBUUlVFOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJaWYgKGJVc2VTaG9ydFNsb3RUaW1lKQorCQlPUFNUQVRVU19TRVRfRkxBRyhwQWQsIGZPUF9TVEFUVVNfU0hPUlRfU0xPVF9JTlVTRUQpOworCWVsc2UKKwkJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfU0hPUlRfU0xPVF9JTlVTRUQpOworCisJU2xvdFRpbWUgPSAoYlVzZVNob3J0U2xvdFRpbWUpPyA5IDogMjA7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCXsKKwkJLy8gZm9yY2UgdXNpbmcgc2hvcnQgU0xPVCB0aW1lIGZvciBGQUUgdG8gZGVtbyBwZXJmb3JtYW5jZSB3aGVuIFR4QnVyc3QgaXMgT04KKwkJaWYgKCgocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5iSHRFbmFibGUgPT0gRkFMU0UpICYmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1dNTV9JTlVTRUQpKSkKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCXx8ICgocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5iSHRFbmFibGUgPT0gVFJVRSkgJiYgKHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5Qb2xpY3kgPT0gQkFfTk9UVVNFKSkKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJCSkKKwkJeworCQkJLy8gSW4gdGhpcyBjYXNlLCB3ZSB3aWxsIHRoaW5rIGl0IGlzIGRvaW5nIFdpLUZpIHRlc3QKKwkJCS8vIEFuZCB3ZSB3aWxsIG5vdCBzZXQgdG8gc2hvcnQgc2xvdCB3aGVuIGJFbmFibGVUeEJ1cnN0IGlzIFRSVUUuCisJCX0KKwkJZWxzZSBpZiAocEFkLT5Db21tb25DZmcuYkVuYWJsZVR4QnVyc3QpCisJCQlTbG90VGltZSA9IDk7CisJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJLy8KKwkvLyBGb3Igc29tZSByZWFzb25zLCBhbHdheXMgc2V0IGl0IHRvIHNob3J0IHNsb3QgdGltZS4KKwkvLworCS8vIFRvRG86IFNob3VsZCBjb25zaWRlciBjYXBhYmlsaXR5IHdpdGggMTFCCisJLy8KKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCXsKKwkJaWYgKHBBZC0+U3RhQ2ZnLkJzc1R5cGUgPT0gQlNTX0FESE9DKQorCQkJU2xvdFRpbWUgPSAyMDsKKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlSVE1QX0lPX1JFQUQzMihwQWQsIEJLT0ZGX1NMT1RfQ0ZHLCAmUmVnVmFsdWUpOworCVJlZ1ZhbHVlID0gUmVnVmFsdWUgJiAweEZGRkZGRjAwOworCisJUmVnVmFsdWUgfD0gU2xvdFRpbWU7CisKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBCS09GRl9TTE9UX0NGRywgUmVnVmFsdWUpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlBZGQgU2hhcmVkIGtleSBpbmZvcm1hdGlvbiBpbnRvIEFTSUMuCisJCVVwZGF0ZSBzaGFyZWQga2V5LCBUeE1pYyBhbmQgUnhNaWMgdG8gQXNpYyBTaGFyZWQga2V5IHRhYmxlCisJCVVwZGF0ZSBpdHMgY2lwaGVyQWxnIHRvIEFzaWMgU2hhcmVkIGtleSBNb2RlLgorCisgICAgUmV0dXJuOgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgQXNpY0FkZFNoYXJlZEtleUVudHJ5KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVDSEFSCQkgQnNzSW5kZXgsCisJSU4gVUNIQVIJCSBLZXlJZHgsCisJSU4gVUNIQVIJCSBDaXBoZXJBbGcsCisJSU4gUFVDSEFSCQkgcEtleSwKKwlJTiBQVUNIQVIJCSBwVHhNaWMsCisJSU4gUFVDSEFSCQkgcFJ4TWljKQoreworCVVMT05HIG9mZnNldDsgLy8sIGNzcjA7CisJU0hBUkVES0VZX01PREVfU1RSVUMgY3NyMTsKKyNpZmRlZiBSVDI4NjAKKwlJTlQgICBpOworI2VuZGlmIC8vIFJUMjg2MCAvLworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQXNpY0FkZFNoYXJlZEtleUVudHJ5IEJzc0luZGV4PSVkLCBLZXlJZHg9JWRcbiIsIEJzc0luZGV4LEtleUlkeCkpOworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJBc2ljQWRkU2hhcmVkS2V5RW50cnk6ICVzIGtleSAjJWRcbiIsIENpcGhlck5hbWVbQ2lwaGVyQWxnXSwgQnNzSW5kZXgqNCArIEtleUlkeCkpOworCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCIgCUtleSA9ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisJCXBLZXlbMF0scEtleVsxXSxwS2V5WzJdLHBLZXlbM10scEtleVs0XSxwS2V5WzVdLHBLZXlbNl0scEtleVs3XSxwS2V5WzhdLHBLZXlbOV0scEtleVsxMF0scEtleVsxMV0scEtleVsxMl0scEtleVsxM10scEtleVsxNF0scEtleVsxNV0pKTsKKwlpZiAocFJ4TWljKQorCXsKKwkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIiAJUnggTUlDIEtleSA9ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKwkJCXBSeE1pY1swXSxwUnhNaWNbMV0scFJ4TWljWzJdLHBSeE1pY1szXSxwUnhNaWNbNF0scFJ4TWljWzVdLHBSeE1pY1s2XSxwUnhNaWNbN10pKTsKKwl9CisJaWYgKHBUeE1pYykKKwl7CisJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCIgCVR4IE1JQyBLZXkgPSAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisJCQlwVHhNaWNbMF0scFR4TWljWzFdLHBUeE1pY1syXSxwVHhNaWNbM10scFR4TWljWzRdLHBUeE1pY1s1XSxwVHhNaWNbNl0scFR4TWljWzddKSk7CisJfQorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vCisJLy8gZmlsbCBrZXkgbWF0ZXJpYWwgLSBrZXkgKyBUWCBNSUMgKyBSWCBNSUMKKwkvLworI2lmZGVmIFJUMjg2MAorCW9mZnNldCA9IFNIQVJFRF9LRVlfVEFCTEVfQkFTRSArICg0KkJzc0luZGV4ICsgS2V5SWR4KSpIV19LRVlfRU5UUllfU0laRTsKKwlmb3IgKGk9MDsgaTxNQVhfTEVOX09GX1NIQVJFX0tFWTsgaSsrKQorCXsKKwkJUlRNUF9JT19XUklURTgocEFkLCBvZmZzZXQgKyBpLCBwS2V5W2ldKTsKKwl9CisKKwlvZmZzZXQgKz0gTUFYX0xFTl9PRl9TSEFSRV9LRVk7CisJaWYgKHBUeE1pYykKKwl7CisJCWZvciAoaT0wOyBpPDg7IGkrKykKKwkJeworCQkJUlRNUF9JT19XUklURTgocEFkLCBvZmZzZXQgKyBpLCBwVHhNaWNbaV0pOworCQl9CisJfQorCisJb2Zmc2V0ICs9IDg7CisJaWYgKHBSeE1pYykKKwl7CisJCWZvciAoaT0wOyBpPDg7IGkrKykKKwkJeworCQkJUlRNUF9JT19XUklURTgocEFkLCBvZmZzZXQgKyBpLCBwUnhNaWNbaV0pOworCQl9CisJfQorI2VuZGlmIC8vIFJUMjg2MCAvLworCisKKwkvLworCS8vIFVwZGF0ZSBjaXBoZXIgYWxnb3JpdGhtLiBXU1RBIGFsd2F5cyB1c2UgQlNTMAorCS8vCisJUlRNUF9JT19SRUFEMzIocEFkLCBTSEFSRURfS0VZX01PREVfQkFTRSs0KihCc3NJbmRleC8yKSwgJmNzcjEud29yZCk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSZWFkOiBTSEFSRURfS0VZX01PREVfQkFTRSBhdCB0aGlzIEJzc1slZF0gS2V5SWR4WyVkXT0gMHgleCBcbiIsIEJzc0luZGV4LEtleUlkeCwgY3NyMS53b3JkKSk7CisJaWYgKChCc3NJbmRleCUyKSA9PSAwKQorCXsKKwkJaWYgKEtleUlkeCA9PSAwKQorCQkJY3NyMS5maWVsZC5Cc3MwS2V5MENpcGhlckFsZyA9IENpcGhlckFsZzsKKwkJZWxzZSBpZiAoS2V5SWR4ID09IDEpCisJCQljc3IxLmZpZWxkLkJzczBLZXkxQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOworCQllbHNlIGlmIChLZXlJZHggPT0gMikKKwkJCWNzcjEuZmllbGQuQnNzMEtleTJDaXBoZXJBbGcgPSBDaXBoZXJBbGc7CisJCWVsc2UKKwkJCWNzcjEuZmllbGQuQnNzMEtleTNDaXBoZXJBbGcgPSBDaXBoZXJBbGc7CisJfQorCWVsc2UKKwl7CisJCWlmIChLZXlJZHggPT0gMCkKKwkJCWNzcjEuZmllbGQuQnNzMUtleTBDaXBoZXJBbGcgPSBDaXBoZXJBbGc7CisJCWVsc2UgaWYgKEtleUlkeCA9PSAxKQorCQkJY3NyMS5maWVsZC5Cc3MxS2V5MUNpcGhlckFsZyA9IENpcGhlckFsZzsKKwkJZWxzZSBpZiAoS2V5SWR4ID09IDIpCisJCQljc3IxLmZpZWxkLkJzczFLZXkyQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOworCQllbHNlCisJCQljc3IxLmZpZWxkLkJzczFLZXkzQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOworCX0KKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIldyaXRlOiBTSEFSRURfS0VZX01PREVfQkFTRSBhdCB0aGlzIEJzc1slZF0gPSAweCV4IFxuIiwgQnNzSW5kZXgsIGNzcjEud29yZCkpOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIFNIQVJFRF9LRVlfTU9ERV9CQVNFKzQqKEJzc0luZGV4LzIpLCBjc3IxLndvcmQpOworCit9CisKKy8vCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorVk9JRCBBc2ljUmVtb3ZlU2hhcmVkS2V5RW50cnkoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVUNIQVIJCSBCc3NJbmRleCwKKwlJTiBVQ0hBUgkJIEtleUlkeCkKK3sKKwkvL1VMT05HIFNlY0NzcjA7CisJU0hBUkVES0VZX01PREVfU1RSVUMgY3NyMTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQXNpY1JlbW92ZVNoYXJlZEtleUVudHJ5OiAjJWQgXG4iLCBCc3NJbmRleCo0ICsgS2V5SWR4KSk7CisKKwlSVE1QX0lPX1JFQUQzMihwQWQsIFNIQVJFRF9LRVlfTU9ERV9CQVNFKzQqKEJzc0luZGV4LzIpLCAmY3NyMS53b3JkKTsKKwlpZiAoKEJzc0luZGV4JTIpID09IDApCisJeworCQlpZiAoS2V5SWR4ID09IDApCisJCQljc3IxLmZpZWxkLkJzczBLZXkwQ2lwaGVyQWxnID0gMDsKKwkJZWxzZSBpZiAoS2V5SWR4ID09IDEpCisJCQljc3IxLmZpZWxkLkJzczBLZXkxQ2lwaGVyQWxnID0gMDsKKwkJZWxzZSBpZiAoS2V5SWR4ID09IDIpCisJCQljc3IxLmZpZWxkLkJzczBLZXkyQ2lwaGVyQWxnID0gMDsKKwkJZWxzZQorCQkJY3NyMS5maWVsZC5Cc3MwS2V5M0NpcGhlckFsZyA9IDA7CisJfQorCWVsc2UKKwl7CisJCWlmIChLZXlJZHggPT0gMCkKKwkJCWNzcjEuZmllbGQuQnNzMUtleTBDaXBoZXJBbGcgPSAwOworCQllbHNlIGlmIChLZXlJZHggPT0gMSkKKwkJCWNzcjEuZmllbGQuQnNzMUtleTFDaXBoZXJBbGcgPSAwOworCQllbHNlIGlmIChLZXlJZHggPT0gMikKKwkJCWNzcjEuZmllbGQuQnNzMUtleTJDaXBoZXJBbGcgPSAwOworCQllbHNlCisJCQljc3IxLmZpZWxkLkJzczFLZXkzQ2lwaGVyQWxnID0gMDsKKwl9CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJXcml0ZTogU0hBUkVEX0tFWV9NT0RFX0JBU0UgYXQgdGhpcyBCc3NbJWRdID0gMHgleCBcbiIsIEJzc0luZGV4LCBjc3IxLndvcmQpKTsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBTSEFSRURfS0VZX01PREVfQkFTRSs0KihCc3NJbmRleC8yKSwgY3NyMS53b3JkKTsKKwlBU1NFUlQoQnNzSW5kZXggPCA0KTsKKwlBU1NFUlQoS2V5SWR4IDwgNCk7CisKK30KKworCitWT0lEIEFzaWNVcGRhdGVXQ0lEQXR0cmlidXRlKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVTSE9SVAkJV0NJRCwKKwlJTiBVQ0hBUgkJQnNzSW5kZXgsCisJSU4gVUNIQVIgICAgICAgIENpcGhlckFsZywKKwlJTiBCT09MRUFOCQliVXNlUGFpcmV3aXNlS2V5VGFibGUpCit7CisJVUxPTkcgICBXQ0lEQXR0cmkgPSAwLCBvZmZzZXQ7CisKKwkvLworCS8vIFVwZGF0ZSBXQ0lEIGF0dHJpYnV0ZS4KKwkvLyBPbmx5IFR4S2V5IGNvdWxkIHVwZGF0ZSBXQ0lEIGF0dHJpYnV0ZS4KKwkvLworCW9mZnNldCA9IE1BQ19XQ0lEX0FUVFJJQlVURV9CQVNFICsgKFdDSUQgKiBIV19XQ0lEX0FUVFJJX1NJWkUpOworCVdDSURBdHRyaSA9IChCc3NJbmRleCA8PCA0KSB8IChDaXBoZXJBbGcgPDwgMSkgfCAoYlVzZVBhaXJld2lzZUtleVRhYmxlKTsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBvZmZzZXQsIFdDSURBdHRyaSk7Cit9CisKK1ZPSUQgQXNpY1VwZGF0ZVdDSURJVkVJVigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVU0hPUlQJCVdDSUQsCisJSU4gVUxPTkcgICAgICAgIHVJViwKKwlJTiBVTE9ORyAgICAgICAgdUVJVikKK3sKKwlVTE9ORwlvZmZzZXQ7CisKKwlvZmZzZXQgPSBNQUNfSVZFSVZfVEFCTEVfQkFTRSArIChXQ0lEICogSFdfSVZFSVZfRU5UUllfU0laRSk7CisKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBvZmZzZXQsIHVJVik7CisJUlRNUF9JT19XUklURTMyKHBBZCwgb2Zmc2V0ICsgNCwgdUVJVik7Cit9CisKK1ZPSUQgQXNpY1VwZGF0ZVJ4V0NJRFRhYmxlKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVTSE9SVAkJV0NJRCwKKwlJTiBQVUNIQVIgICAgICAgIHBBZGRyKQoreworCVVMT05HIG9mZnNldDsKKwlVTE9ORyBBZGRyOworCisJb2Zmc2V0ID0gTUFDX1dDSURfQkFTRSArIChXQ0lEICogSFdfV0NJRF9FTlRSWV9TSVpFKTsKKwlBZGRyID0gcEFkZHJbMF0gKyAocEFkZHJbMV0gPDwgOCkgKyhwQWRkclsyXSA8PCAxNikgKyhwQWRkclszXSA8PCAyNCk7CisJUlRNUF9JT19XUklURTMyKHBBZCwgb2Zmc2V0LCBBZGRyKTsKKwlBZGRyID0gcEFkZHJbNF0gKyAocEFkZHJbNV0gPDwgOCk7CisJUlRNUF9JT19XUklURTMyKHBBZCwgb2Zmc2V0ICsgNCwgQWRkcik7Cit9CisKKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIFJvdXRpbmUgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBDaXBoZXIgS2V5LCBDaXBoZXIgYWxnb3JpdGhtLCBJVi9FSVYgdG8gQXNpYworCisgICAgQXJndW1lbnRzOgorICAgICAgICBwQWQgICAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIG91ciBhZGFwdGVyCisgICAgICAgIFdDSUQgICAgICAgICAgICAgICAgICAgIFdDSUQgRW50cnkgbnVtYmVyLgorICAgICAgICBCc3NJbmRleCAgICAgICAgICAgICAgICBCU1NJRCBpbmRleCwgc3RhdGlvbiBvciBub25lIG11bHRpcGxlIEJTU0lEIHN1cHBvcnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyB2YWx1ZSBzaG91bGQgYmUgMC4KKyAgICAgICAgS2V5SWR4ICAgICAgICAgICAgICAgICAgVGhpcyBLZXlJZHggd2lsbCBzZXQgdG8gSVYncyBLZXlJRCBpZiBiVHhLZXkgZW5hYmxlZAorICAgICAgICBwQ2lwaGVyS2V5ICAgICAgICAgICAgICBQb2ludGVyIHRvIENpcGhlciBLZXkuCisgICAgICAgIGJVc2VQYWlyZXdpc2VLZXlUYWJsZSAgIFRSVUUgbWVhbnMgc2F2ZWQgdGhlIGtleSBpbiBTaGFyZWRLZXkgdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyd2lzZSBQYWlyZXdpc2VLZXkgdGFibGUKKyAgICAgICAgYlR4S2V5ICAgICAgICAgICAgICAgICAgVGhpcyBpcyB0aGUgdHJhbnNtaXQga2V5IGlmIGVuYWJsZWQuCisKKyAgICBSZXR1cm4gVmFsdWU6CisgICAgICAgIE5vbmUKKworICAgIE5vdGU6CisgICAgICAgIFRoaXMgcm91dGluZSB3aWxsIHNldCB0aGUgcmVsYXRpdmUga2V5IHN0dWZmIHRvIEFzaWMgaW5jbHVkaW5nIFdDSUQgYXR0cmlidXRlLAorICAgICAgICBDaXBoZXIgS2V5LCBDaXBoZXIgYWxnb3JpdGhtIGFuZCBJVi9FSVYuCisKKyAgICAgICAgSVYvRUlWIHdpbGwgYmUgdXBkYXRlIGlmIHRoaXMgQ2lwaGVyS2V5IGlzIHRoZSB0cmFuc21pc3Npb24ga2V5IGJlY2F1c2UKKyAgICAgICAgQVNJQyB3aWxsIGJhc2Ugb24gSVYncyBLZXlJRCB2YWx1ZSB0byBzZWxlY3QgQ2lwaGVyIEtleS4KKworICAgICAgICBJZiBiVHhLZXkgc2V0cyB0byBGQUxTRSwgdGhpcyBpcyBub3QgdGhlIFRYIGtleSwgYnV0IGl0IGNvdWxkIGJlCisgICAgICAgIFJYIGtleQorCisgICAgCUZvciBBUCBtb2RlIGJUeEtleSBtdXN0IGJlIGFsd2F5cyBzZXQgdG8gVFJVRS4KKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIEFzaWNBZGRLZXlFbnRyeSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVU0hPUlQJCVdDSUQsCisJSU4gVUNIQVIJCUJzc0luZGV4LAorCUlOIFVDSEFSCQlLZXlJZHgsCisJSU4gUENJUEhFUl9LRVkJcENpcGhlcktleSwKKwlJTiBCT09MRUFOCQliVXNlUGFpcmV3aXNlS2V5VGFibGUsCisJSU4gQk9PTEVBTgkJYlR4S2V5KQoreworCVVMT05HCW9mZnNldDsKKwlVQ0hBUglJVjQgPSAwOworCVBVQ0hBUgkJcEtleSA9IHBDaXBoZXJLZXktPktleTsKKwlQVUNIQVIJCXBUeE1pYyA9IHBDaXBoZXJLZXktPlR4TWljOworCVBVQ0hBUgkJcFJ4TWljID0gcENpcGhlcktleS0+UnhNaWM7CisJUFVDSEFSCQlwVHh0c2MgPSBwQ2lwaGVyS2V5LT5UeFRzYzsKKwlVQ0hBUgkJQ2lwaGVyQWxnID0gcENpcGhlcktleS0+Q2lwaGVyQWxnOworCVNIQVJFREtFWV9NT0RFX1NUUlVDIGNzcjE7CisjaWZkZWYgUlQyODYwCisJVUNIQVIJCWk7CisjZW5kaWYgLy8gUlQyODYwIC8vCisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT4gQXNpY0FkZEtleUVudHJ5XG4iKSk7CisJLy8KKwkvLyAxLikgZGVjaWRlIGtleSB0YWJsZSBvZmZzZXQKKwkvLworCWlmIChiVXNlUGFpcmV3aXNlS2V5VGFibGUpCisJCW9mZnNldCA9IFBBSVJXSVNFX0tFWV9UQUJMRV9CQVNFICsgKFdDSUQgKiBIV19LRVlfRU5UUllfU0laRSk7CisJZWxzZQorCQlvZmZzZXQgPSBTSEFSRURfS0VZX1RBQkxFX0JBU0UgKyAoNCAqIEJzc0luZGV4ICsgS2V5SWR4KSAqIEhXX0tFWV9FTlRSWV9TSVpFOworCisJLy8KKwkvLyAyLikgU2V0IEtleSB0byBBc2ljCisJLy8KKwkvL2ZvciAoaSA9IDA7IGkgPCBLZXlMZW47IGkrKykKKyNpZmRlZiBSVDI4NjAKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0xFTl9PRl9QRUVSX0tFWTsgaSsrKQorCXsKKwkJUlRNUF9JT19XUklURTgocEFkLCBvZmZzZXQgKyBpLCBwS2V5W2ldKTsKKwl9CisJb2Zmc2V0ICs9IE1BWF9MRU5fT0ZfUEVFUl9LRVk7CisKKwkvLworCS8vIDMuKSBTZXQgTUlDIGtleSBpZiBhdmFpbGFibGUKKwkvLworCWlmIChwVHhNaWMpCisJeworCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorCQl7CisJCQlSVE1QX0lPX1dSSVRFOChwQWQsIG9mZnNldCArIGksIHBUeE1pY1tpXSk7CisJCX0KKwl9CisJb2Zmc2V0ICs9IExFTl9US0lQX1RYTUlDSzsKKworCWlmIChwUnhNaWMpCisJeworCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorCQl7CisJCQlSVE1QX0lPX1dSSVRFOChwQWQsIG9mZnNldCArIGksIHBSeE1pY1tpXSk7CisJCX0KKwl9CisjZW5kaWYgLy8gUlQyODYwIC8vCisKKworCS8vCisJLy8gNC4pIE1vZGlmeSBJVi9FSVYgaWYgbmVlZHMKKwkvLyAgICAgVGhpcyB3aWxsIGZvcmNlIEFzaWMgdG8gdXNlIHRoaXMga2V5IElEIGJ5IHNldHRpbmcgSVYuCisJLy8KKwlpZiAoYlR4S2V5KQorCXsKKyNpZmRlZiBSVDI4NjAKKwkJb2Zmc2V0ID0gTUFDX0lWRUlWX1RBQkxFX0JBU0UgKyAoV0NJRCAqIEhXX0lWRUlWX0VOVFJZX1NJWkUpOworCQkvLworCQkvLyBXcml0ZSBJVgorCQkvLworCQlSVE1QX0lPX1dSSVRFOChwQWQsIG9mZnNldCwgcFR4dHNjWzFdKTsKKwkJUlRNUF9JT19XUklURTgocEFkLCBvZmZzZXQgKyAxLCAoKHBUeHRzY1sxXSB8IDB4MjApICYgMHg3ZikpOworCQlSVE1QX0lPX1dSSVRFOChwQWQsIG9mZnNldCArIDIsIHBUeHRzY1swXSk7CisKKwkJSVY0ID0gKEtleUlkeCA8PCA2KTsKKwkJaWYgKChDaXBoZXJBbGcgPT0gQ0lQSEVSX1RLSVApIHx8IChDaXBoZXJBbGcgPT0gQ0lQSEVSX1RLSVBfTk9fTUlDKSB8fChDaXBoZXJBbGcgPT0gQ0lQSEVSX0FFUykpCisJCQlJVjQgfD0gMHgyMDsgIC8vIHR1cm4gb24gZXh0ZW5zaW9uIGJpdCBtZWFucyBFSVYgZXhpc3RlbmNlCisKKwkJUlRNUF9JT19XUklURTgocEFkLCBvZmZzZXQgKyAzLCBJVjQpOworCisJCS8vCisJCS8vIFdyaXRlIEVJVgorCQkvLworCQlvZmZzZXQgKz0gNDsKKwkJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKwkJeworCQkJUlRNUF9JT19XUklURTgocEFkLCBvZmZzZXQgKyBpLCBwVHh0c2NbaSArIDJdKTsKKwkJfQorI2VuZGlmIC8vIFJUMjg2MCAvLworCisJCUFzaWNVcGRhdGVXQ0lEQXR0cmlidXRlKHBBZCwgV0NJRCwgQnNzSW5kZXgsIENpcGhlckFsZywgYlVzZVBhaXJld2lzZUtleVRhYmxlKTsKKwl9CisKKwlpZiAoIWJVc2VQYWlyZXdpc2VLZXlUYWJsZSkKKwl7CisJCS8vCisJCS8vIE9ubHkgdXBkYXRlIHRoZSBzaGFyZWQga2V5IHNlY3VyaXR5IG1vZGUKKwkJLy8KKwkJUlRNUF9JT19SRUFEMzIocEFkLCBTSEFSRURfS0VZX01PREVfQkFTRSArIDQgKiAoQnNzSW5kZXggLyAyKSwgJmNzcjEud29yZCk7CisJCWlmICgoQnNzSW5kZXggJSAyKSA9PSAwKQorCQl7CisJCQlpZiAoS2V5SWR4ID09IDApCisJCQkJY3NyMS5maWVsZC5Cc3MwS2V5MENpcGhlckFsZyA9IENpcGhlckFsZzsKKwkJCWVsc2UgaWYgKEtleUlkeCA9PSAxKQorCQkJCWNzcjEuZmllbGQuQnNzMEtleTFDaXBoZXJBbGcgPSBDaXBoZXJBbGc7CisJCQllbHNlIGlmIChLZXlJZHggPT0gMikKKwkJCQljc3IxLmZpZWxkLkJzczBLZXkyQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOworCQkJZWxzZQorCQkJCWNzcjEuZmllbGQuQnNzMEtleTNDaXBoZXJBbGcgPSBDaXBoZXJBbGc7CisJCX0KKwkJZWxzZQorCQl7CisJCQlpZiAoS2V5SWR4ID09IDApCisJCQkJY3NyMS5maWVsZC5Cc3MxS2V5MENpcGhlckFsZyA9IENpcGhlckFsZzsKKwkJCWVsc2UgaWYgKEtleUlkeCA9PSAxKQorCQkJCWNzcjEuZmllbGQuQnNzMUtleTFDaXBoZXJBbGcgPSBDaXBoZXJBbGc7CisJCQllbHNlIGlmIChLZXlJZHggPT0gMikKKwkJCQljc3IxLmZpZWxkLkJzczFLZXkyQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOworCQkJZWxzZQorCQkJCWNzcjEuZmllbGQuQnNzMUtleTNDaXBoZXJBbGcgPSBDaXBoZXJBbGc7CisJCX0KKwkJUlRNUF9JT19XUklURTMyKHBBZCwgU0hBUkVEX0tFWV9NT0RFX0JBU0UgKyA0ICogKEJzc0luZGV4IC8gMiksIGNzcjEud29yZCk7CisJfQorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPD09IEFzaWNBZGRLZXlFbnRyeVxuIikpOworfQorCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCUFkZCBQYWlyLXdpc2Uga2V5IG1hdGVyaWFsIGludG8gQVNJQy4KKwkJVXBkYXRlIHBhaXJ3aXNlIGtleSwgVHhNaWMgYW5kIFJ4TWljIHRvIEFzaWMgUGFpci13aXNlIGtleSB0YWJsZQorCisgICAgUmV0dXJuOgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgQXNpY0FkZFBhaXJ3aXNlS2V5RW50cnkoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gUFVDSEFSICAgICAgICBwQWRkciwKKwlJTiBVQ0hBUgkJV0NJRCwKKwlJTiBDSVBIRVJfS0VZCQkgKnBDaXBoZXJLZXkpCit7CisJSU5UIGk7CisJVUxPTkcgCQlvZmZzZXQ7CisJUFVDSEFSCQkgcEtleSA9IHBDaXBoZXJLZXktPktleTsKKwlQVUNIQVIJCSBwVHhNaWMgPSBwQ2lwaGVyS2V5LT5UeE1pYzsKKwlQVUNIQVIJCSBwUnhNaWMgPSBwQ2lwaGVyS2V5LT5SeE1pYzsKKyNpZmRlZiBEQkcKKwlVQ0hBUgkJQ2lwaGVyQWxnID0gcENpcGhlcktleS0+Q2lwaGVyQWxnOworI2VuZGlmIC8vIERCRyAvLworCisJLy8gRUtFWQorCW9mZnNldCA9IFBBSVJXSVNFX0tFWV9UQUJMRV9CQVNFICsgKFdDSUQgKiBIV19LRVlfRU5UUllfU0laRSk7CisjaWZkZWYgUlQyODYwCisJZm9yIChpPTA7IGk8TUFYX0xFTl9PRl9QRUVSX0tFWTsgaSsrKQorCXsKKwkJUlRNUF9JT19XUklURTgocEFkLCBvZmZzZXQgKyBpLCBwS2V5W2ldKTsKKwl9CisjZW5kaWYgLy8gUlQyODYwIC8vCisJZm9yIChpPTA7IGk8TUFYX0xFTl9PRl9QRUVSX0tFWTsgaSs9NCkKKwl7CisJCVVJTlQzMiBWYWx1ZTsKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBvZmZzZXQgKyBpLCAmVmFsdWUpOworCX0KKworCW9mZnNldCArPSBNQVhfTEVOX09GX1BFRVJfS0VZOworCisJLy8gIE1JQyBLRVkKKwlpZiAocFR4TWljKQorCXsKKyNpZmRlZiBSVDI4NjAKKwkJZm9yIChpPTA7IGk8ODsgaSsrKQorCQl7CisJCQlSVE1QX0lPX1dSSVRFOChwQWQsIG9mZnNldCtpLCBwVHhNaWNbaV0pOworCQl9CisjZW5kaWYgLy8gUlQyODYwIC8vCisJfQorCW9mZnNldCArPSA4OworCWlmIChwUnhNaWMpCisJeworI2lmZGVmIFJUMjg2MAorCQlmb3IgKGk9MDsgaTw4OyBpKyspCisJCXsKKwkJCVJUTVBfSU9fV1JJVEU4KHBBZCwgb2Zmc2V0K2ksIHBSeE1pY1tpXSk7CisJCX0KKyNlbmRpZiAvLyBSVDI4NjAgLy8KKwl9CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkFzaWNBZGRQYWlyd2lzZUtleUVudHJ5OiBXQ0lEICMlZCBBbGc9JXNcbiIsV0NJRCwgQ2lwaGVyTmFtZVtDaXBoZXJBbGddKSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCIJS2V5ID0gJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKwkJcEtleVswXSxwS2V5WzFdLHBLZXlbMl0scEtleVszXSxwS2V5WzRdLHBLZXlbNV0scEtleVs2XSxwS2V5WzddLHBLZXlbOF0scEtleVs5XSxwS2V5WzEwXSxwS2V5WzExXSxwS2V5WzEyXSxwS2V5WzEzXSxwS2V5WzE0XSxwS2V5WzE1XSkpOworCWlmIChwUnhNaWMpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIJUnggTUlDIEtleSA9ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKwkJCXBSeE1pY1swXSxwUnhNaWNbMV0scFJ4TWljWzJdLHBSeE1pY1szXSxwUnhNaWNbNF0scFJ4TWljWzVdLHBSeE1pY1s2XSxwUnhNaWNbN10pKTsKKwl9CisJaWYgKHBUeE1pYykKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIglUeCBNSUMgS2V5ID0gJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorCQkJcFR4TWljWzBdLHBUeE1pY1sxXSxwVHhNaWNbMl0scFR4TWljWzNdLHBUeE1pY1s0XSxwVHhNaWNbNV0scFR4TWljWzZdLHBUeE1pY1s3XSkpOworCX0KK30KKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVJlbW92ZSBQYWlyLXdpc2Uga2V5IG1hdGVyaWFsIGZyb20gQVNJQy4KKworICAgIFJldHVybjoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIEFzaWNSZW1vdmVQYWlyd2lzZUtleUVudHJ5KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVDSEFSCQkgQnNzSWR4LAorCUlOIFVDSEFSCQkgV2NpZCkKK3sKKwlVTE9ORwkJV0NJREF0dHJpOworCVVTSE9SVAkJb2Zmc2V0OworCisJLy8gcmUtc2V0IHRoZSBlbnRyeSdzIFdDSUQgYXR0cmlidXRlIGFzIE9QRU4tTk9ORS4KKwlvZmZzZXQgPSBNQUNfV0NJRF9BVFRSSUJVVEVfQkFTRSArIChXY2lkICogSFdfV0NJRF9BVFRSSV9TSVpFKTsKKwlXQ0lEQXR0cmkgPSAoQnNzSWR4PDw0KSB8IFBBSVJXSVNFS0VZVEFCTEU7CisJUlRNUF9JT19XUklURTMyKHBBZCwgb2Zmc2V0LCBXQ0lEQXR0cmkpOworfQorCitCT09MRUFOIEFzaWNTZW5kQ29tbWFuZFRvTWN1KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVDSEFSCQkgQ29tbWFuZCwKKwlJTiBVQ0hBUgkJIFRva2VuLAorCUlOIFVDSEFSCQkgQXJnMCwKKwlJTiBVQ0hBUgkJIEFyZzEpCit7CisJSE9TVF9DTURfQ1NSX1NUUlVDCUgyTUNtZDsKKwlIMk1fTUFJTEJPWF9TVFJVQwlIMk1NYWlsYm94OworCVVMT05HCQkJCWkgPSAwOworI2lmZGVmIFJUMjg2MAorI2lmZGVmIFJBTElOS19BVEUKKwlzdGF0aWMgVUlOVDMyIGogPSAwOworI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKyNlbmRpZiAvLyBSVDI4NjAgLy8KKwlkbworCXsKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBIMk1fTUFJTEJPWF9DU1IsICZIMk1NYWlsYm94LndvcmQpOworCQlpZiAoSDJNTWFpbGJveC5maWVsZC5Pd25lciA9PSAwKQorCQkJYnJlYWs7CisKKwkJUlRNUHVzZWNEZWxheSgyKTsKKwl9IHdoaWxlKGkrKyA8IDEwMCk7CisKKwlpZiAoaSA+PSAxMDApCisJeworI2lmZGVmIFJUMjg2MAorI2lmZGVmIFJBTElOS19BVEUKKwkJaWYgKHBBZC0+YXRlLmJGV0xvYWRpbmcgPT0gVFJVRSkKKwkJeworCQkJLyogcmVsb2FkaW5nIGZpcm13YXJlIHdoZW4gcmVjZWl2ZWQgaXdwcml2IGNtZCAiQVRFPUFURVNUT1AiICovCisJCQlpZiAoaiA+IDApCisJCQl7CisJCQkJaWYgKGogJSA2NCAhPSAwKQorCQkJCXsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiIyIpKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiXG4iKSk7CisJCQkJfQorCQkJCSsrajsKKwkJCX0KKwkJCWVsc2UgaWYgKGogPT0gMCkKKwkJCXsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJMb2FkaW5nIGZpcm13YXJlLiBQbGVhc2Ugd2FpdCBmb3IgYSBtb21lbnQuLi5cbiIpKTsKKwkJCQkrK2o7CisJCQl9CisJCX0KKwkJZWxzZQorI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKyNlbmRpZiAvLyBSVDI4NjAgLy8KKwkJeworCQlEQkdQUklOVF9FUlIoKCJIMk1fTUFJTEJPWCBzdGlsbCBob2xkIGJ5IE1DVS4gY29tbWFuZCBmYWlsXG4iKSk7CisJCX0KKwkJcmV0dXJuIEZBTFNFOworCX0KKworI2lmZGVmIFJUMjg2MAorI2lmZGVmIFJBTElOS19BVEUKKwllbHNlIGlmIChwQWQtPmF0ZS5iRldMb2FkaW5nID09IFRSVUUpCisJeworCQkvKiByZWxvYWRpbmcgb2YgZmlybXdhcmUgaXMgY29tcGxldGVkICovCisJCXBBZC0+YXRlLmJGV0xvYWRpbmcgPSBGQUxTRTsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiXG4iKSk7CisJCWogPSAwOworCX0KKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisjZW5kaWYgLy8gUlQyODYwIC8vCisKKwlIMk1NYWlsYm94LmZpZWxkLk93bmVyCSAgPSAxOwkgICAvLyBwYXNzIG93bmVyc2hpcCB0byBNQ1UKKwlIMk1NYWlsYm94LmZpZWxkLkNtZFRva2VuID0gVG9rZW47CisJSDJNTWFpbGJveC5maWVsZC5IaWdoQnl0ZSA9IEFyZzE7CisJSDJNTWFpbGJveC5maWVsZC5Mb3dCeXRlICA9IEFyZzA7CisJUlRNUF9JT19XUklURTMyKHBBZCwgSDJNX01BSUxCT1hfQ1NSLCBIMk1NYWlsYm94LndvcmQpOworCisJSDJNQ21kLndvcmQgCQkJICA9IDA7CisJSDJNQ21kLmZpZWxkLkhvc3RDb21tYW5kICA9IENvbW1hbmQ7CisJUlRNUF9JT19XUklURTMyKHBBZCwgSE9TVF9DTURfQ1NSLCBIMk1DbWQud29yZCk7CisKKwlpZiAoQ29tbWFuZCAhPSAweDgwKQorCXsKKwl9CisKKwlyZXR1cm4gVFJVRTsKK30KKworI2lmZGVmIFJUMjg2MAorQk9PTEVBTiBBc2ljQ2hlY2tDb21tYW5PaygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVQ0hBUgkJIENvbW1hbmQpCit7CisJVUlOVDMyCUNtZFN0YXR1cyA9IDAsIENJRCA9IDAsIGk7CisJVUlOVDMyCVRoaXNDSURNYXNrID0gMDsKKworCWkgPSAwOworCWRvCisJeworCQlSVE1QX0lPX1JFQUQzMihwQWQsIEgyTV9NQUlMQk9YX0NJRCwgJkNJRCk7CisJCS8vIEZpbmQgd2hlcmUgdGhlIGNvbW1hbmQgaXMuIEJlY2F1c2UgdGhpcyBpcyByYW5kb21seSBzcGVjaWZpZWQgYnkgZmlybXdhcmUuCisJCWlmICgoQ0lEICYgQ0lEME1BU0spID09IENvbW1hbmQpCisJCXsKKwkJCVRoaXNDSURNYXNrID0gQ0lEME1BU0s7CisJCQlicmVhazsKKwkJfQorCQllbHNlIGlmICgoKChDSUQgJiBDSUQxTUFTSyk+PjgpICYgMHhmZikgPT0gQ29tbWFuZCkKKwkJeworCQkJVGhpc0NJRE1hc2sgPSBDSUQxTUFTSzsKKwkJCWJyZWFrOworCQl9CisJCWVsc2UgaWYgKCgoKENJRCAmIENJRDJNQVNLKT4+MTYpICYgMHhmZikgPT0gQ29tbWFuZCkKKwkJeworCQkJVGhpc0NJRE1hc2sgPSBDSUQyTUFTSzsKKwkJCWJyZWFrOworCQl9CisJCWVsc2UgaWYgKCgoKENJRCAmIENJRDNNQVNLKT4+MjQpICYgMHhmZikgPT0gQ29tbWFuZCkKKwkJeworCQkJVGhpc0NJRE1hc2sgPSBDSUQzTUFTSzsKKwkJCWJyZWFrOworCQl9CisKKwkJUlRNUHVzZWNEZWxheSgxMDApOworCQlpKys7CisJfXdoaWxlIChpIDwgMjAwKTsKKworCS8vIEdldCBDb21tYW5kU3RhdHVzIFZhbHVlCisJUlRNUF9JT19SRUFEMzIocEFkLCBIMk1fTUFJTEJPWF9TVEFUVVMsICZDbWRTdGF0dXMpOworCisJLy8gVGhpcyBjb21tYW5kJ3Mgc3RhdHVzIGlzIGF0IHRoZSBzYW1lIHBvc2l0aW9uIGFzIGNvbW1hbmQuIFNvIEFORCBjb21tYW5kIHBvc2l0aW9uJ3MgYml0bWFzayB0byByZWFkIHN0YXR1cy4KKwlpZiAoaSA8IDIwMCkKKwl7CisJCS8vIElmIFN0YXR1cyBpcyAxLCB0aGUgY29tYW1uZCBpcyBzdWNjZXNzLgorCQlpZiAoKChDbWRTdGF0dXMgJiBUaGlzQ0lETWFzaykgPT0gMHgxKSB8fCAoKENtZFN0YXR1cyAmIFRoaXNDSURNYXNrKSA9PSAweDEwMCkKKwkJCXx8ICgoQ21kU3RhdHVzICYgVGhpc0NJRE1hc2spID09IDB4MTAwMDApIHx8ICgoQ21kU3RhdHVzICYgVGhpc0NJRE1hc2spID09IDB4MTAwMDAwMCkpCisJCXsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPiBBc2ljQ2hlY2tDb21tYW5PayBDSUQgPSAweCV4LCBDbWRTdGF0dXM9IDB4JXggXG4iLCBDSUQsIENtZFN0YXR1cykpOworCQkJUlRNUF9JT19XUklURTMyKHBBZCwgSDJNX01BSUxCT1hfU1RBVFVTLCAweGZmZmZmZmZmKTsKKwkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIEgyTV9NQUlMQk9YX0NJRCwgMHhmZmZmZmZmZik7CisJCQlyZXR1cm4gVFJVRTsKKwkJfQorCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLT4gQXNpY0NoZWNrQ29tbWFuRmFpbDEgQ0lEID0gMHgleCwgQ21kU3RhdHVzPSAweCV4IFxuIiwgQ0lELCBDbWRTdGF0dXMpKTsKKwl9CisJZWxzZQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+IEFzaWNDaGVja0NvbW1hbkZhaWwyIFRpbWVvdXQgQ29tbWFuZCA9ICVkLCBDbWRTdGF0dXM9IDB4JXggXG4iLCBDb21tYW5kLCBDbWRTdGF0dXMpKTsKKwl9CisJLy8gQ2xlYXIgQ29tbWFuZCBhbmQgU3RhdHVzLgorCVJUTVBfSU9fV1JJVEUzMihwQWQsIEgyTV9NQUlMQk9YX1NUQVRVUywgMHhmZmZmZmZmZik7CisJUlRNUF9JT19XUklURTMyKHBBZCwgSDJNX01BSUxCT1hfQ0lELCAweGZmZmZmZmZmKTsKKworCXJldHVybiBGQUxTRTsKK30KKyNlbmRpZiAvLyBSVDI4NjAgLy8KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVZlcmlmeSB0aGUgc3VwcG9ydCByYXRlIGZvciBkaWZmZXJlbnQgUEhZIHR5cGUKKworCUFyZ3VtZW50czoKKwkJcEFkIAkJCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCUlSUUwgPSBQQVNTSVZFX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECVJUTVBDaGVja1JhdGVzKAorCUlOCQlQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiBPVVQJVUNIQVIJCQlTdXBSYXRlW10sCisJSU4gT1VUCVVDSEFSCQkJKlN1cFJhdGVMZW4pCit7CisJVUNIQVIJUmF0ZUlkeCwgaSwgajsKKwlVQ0hBUglOZXdSYXRlWzEyXSwgTmV3UmF0ZUxlbjsKKworCU5ld1JhdGVMZW4gPSAwOworCisJaWYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQikKKwkJUmF0ZUlkeCA9IDQ7CisJZWxzZQorCQlSYXRlSWR4ID0gMTI7CisKKwkvLyBDaGVjayBmb3Igc3VwcG9ydCByYXRlcyBleGNsdWRlIGJhc2ljIHJhdGUgYml0CisJZm9yIChpID0gMDsgaSA8ICpTdXBSYXRlTGVuOyBpKyspCisJCWZvciAoaiA9IDA7IGogPCBSYXRlSWR4OyBqKyspCisJCQlpZiAoKFN1cFJhdGVbaV0gJiAweDdmKSA9PSBSYXRlSWRUbzUwMEticHNbal0pCisJCQkJTmV3UmF0ZVtOZXdSYXRlTGVuKytdID0gU3VwUmF0ZVtpXTsKKworCSpTdXBSYXRlTGVuID0gTmV3UmF0ZUxlbjsKKwlOZGlzTW92ZU1lbW9yeShTdXBSYXRlLCBOZXdSYXRlLCBOZXdSYXRlTGVuKTsKK30KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorI2lmZGVmIERPVDExX05fU1VQUE9SVAorQk9PTEVBTiBSVE1QQ2hlY2tDaGFubmVsKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVDSEFSCQlDZW50cmFsQ2hhbm5lbCwKKwlJTiBVQ0hBUgkJQ2hhbm5lbCkKK3sKKwlVQ0hBUgkJazsKKwlVQ0hBUgkJVXBwZXJDaGFubmVsID0gMCwgTG93ZXJDaGFubmVsID0gMDsKKwlVQ0hBUgkJTm9FZmZlY3RDaGFubmVsaW5MaXN0ID0gMDsKKworCS8vIEZpbmQgdXBwZXIgYW5kIGxvd2VyIGNoYW5uZWwgYWNjb3JkaW5nIHRvIDQwTUh6IGN1cnJlbnQgb3BlcmF0aW9uLgorCWlmIChDZW50cmFsQ2hhbm5lbCA8IENoYW5uZWwpCisJeworCQlVcHBlckNoYW5uZWwgPSBDaGFubmVsOworCQlpZiAoQ2VudHJhbENoYW5uZWwgPiAyKQorCQkJTG93ZXJDaGFubmVsID0gQ2VudHJhbENoYW5uZWwgLSAyOworCQllbHNlCisJCQlyZXR1cm4gRkFMU0U7CisJfQorCWVsc2UgaWYgKENlbnRyYWxDaGFubmVsID4gQ2hhbm5lbCkKKwl7CisJCVVwcGVyQ2hhbm5lbCA9IENlbnRyYWxDaGFubmVsICsgMjsKKwkJTG93ZXJDaGFubmVsID0gQ2hhbm5lbDsKKwl9CisKKwlmb3IgKGsgPSAwO2sgPCBwQWQtPkNoYW5uZWxMaXN0TnVtO2srKykKKwl7CisJCWlmIChwQWQtPkNoYW5uZWxMaXN0W2tdLkNoYW5uZWwgPT0gVXBwZXJDaGFubmVsKQorCQl7CisJCQlOb0VmZmVjdENoYW5uZWxpbkxpc3QgKys7CisJCX0KKwkJaWYgKHBBZC0+Q2hhbm5lbExpc3Rba10uQ2hhbm5lbCA9PSBMb3dlckNoYW5uZWwpCisJCXsKKwkJCU5vRWZmZWN0Q2hhbm5lbGluTGlzdCArKzsKKwkJfQorCX0KKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiVG90YWwgQ2hhbm5lbCBpbiBDaGFubmVsIExpc3QgPSBbJWRdXG4iLCBOb0VmZmVjdENoYW5uZWxpbkxpc3QpKTsKKwlpZiAoTm9FZmZlY3RDaGFubmVsaW5MaXN0ID09IDIpCisJCXJldHVybiBUUlVFOworCWVsc2UKKwkJcmV0dXJuIEZBTFNFOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJVmVyaWZ5IHRoZSBzdXBwb3J0IHJhdGUgZm9yIEhUIHBoeSB0eXBlCisKKwlBcmd1bWVudHM6CisJCXBBZCAJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCisJUmV0dXJuIFZhbHVlOgorCQlGQUxTRSBpZiBwQWQtPkNvbW1vbkNmZy5TdXBwb3J0ZWRIdFBoeSBkb2Vzbid0IGFjY2VwdCB0aGUgcEh0Q2FwYWJpbGl0eS4gIChBUCBNb2RlKQorCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0JPT0xFQU4gCVJUTVBDaGVja0h0KAorCUlOCVBSVE1QX0FEQVBURVIJCQlwQWQsCisJSU4JVUNIQVIJCQkJCVdjaWQsCisJSU4gCUhUX0NBUEFCSUxJVFlfSUUJCSpwSHRDYXBhYmlsaXR5LAorCUlOIAlBRERfSFRfSU5GT19JRQkJCSpwQWRkSHRJbmZvKQoreworCWlmIChXY2lkID49IE1BWF9MRU5fT0ZfTUFDX1RBQkxFKQorCQlyZXR1cm4gRkFMU0U7CisKKwkvLyBJZiB1c2UgQU1TRFUsIHNldCBmbGFnLgorCWlmIChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQW1zZHVFbmFibGUpCisJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcoJnBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0sIGZDTElFTlRfU1RBVFVTX0FNU0RVX0lOVVNFRCk7CisJLy8gU2F2ZSBQZWVyIENhcGFiaWxpdHkKKwlpZiAocEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLlNob3J0R0lmb3IyMCkKKwkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRygmcEFkLT5NYWNUYWIuQ29udGVudFtXY2lkXSwgZkNMSUVOVF9TVEFUVVNfU0dJMjBfQ0FQQUJMRSk7CisJaWYgKHBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5TaG9ydEdJZm9yNDApCisJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcoJnBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0sIGZDTElFTlRfU1RBVFVTX1NHSTQwX0NBUEFCTEUpOworCWlmIChwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uVHhTVEJDKQorCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKCZwQWQtPk1hY1RhYi5Db250ZW50W1djaWRdLCBmQ0xJRU5UX1NUQVRVU19UeFNUQkNfQ0FQQUJMRSk7CisJaWYgKHBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5SeFNUQkMpCisJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcoJnBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0sIGZDTElFTlRfU1RBVFVTX1J4U1RCQ19DQVBBQkxFKTsKKwlpZiAocEFkLT5Db21tb25DZmcuYlJkZyAmJiBwSHRDYXBhYmlsaXR5LT5FeHRIdENhcEluZm8uUkRHU3VwcG9ydCkKKwl7CisJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcoJnBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0sIGZDTElFTlRfU1RBVFVTX1JER19DQVBBQkxFKTsKKwl9CisKKwlpZiAoV2NpZCA8IE1BWF9MRU5fT0ZfTUFDX1RBQkxFKQorCXsKKwkJcEFkLT5NYWNUYWIuQ29udGVudFtXY2lkXS5NcGR1RGVuc2l0eSA9IHBIdENhcGFiaWxpdHktPkh0Q2FwUGFybS5NcGR1RGVuc2l0eTsKKwl9CisKKwkvLyBXaWxsIGNoZWNrIENoYW5uZWxXaWR0aCBmb3IgTUNTU2V0WzRdIGJlbG93CisJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5NQ1NTZXRbNF0gPSAweDE7CisgICAgc3dpdGNoIChwQWQtPkNvbW1vbkNmZy5SeFN0cmVhbSkKKwl7CisJCWNhc2UgMToKKwkJCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuTUNTU2V0WzBdID0gMHhmZjsKKwkJCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuTUNTU2V0WzFdID0gMHgwMDsKKyAgICAgICAgICAgIHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuTUNTU2V0WzJdID0gMHgwMDsKKyAgICAgICAgICAgIHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuTUNTU2V0WzNdID0gMHgwMDsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lk1DU1NldFswXSA9IDB4ZmY7CisJCQlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lk1DU1NldFsxXSA9IDB4ZmY7CisgICAgICAgICAgICBwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lk1DU1NldFsyXSA9IDB4MDA7CisgICAgICAgICAgICBwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lk1DU1NldFszXSA9IDB4MDA7CisJCQlicmVhazsKKwkJY2FzZSAzOgorCQkJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMF0gPSAweGZmOworCQkJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMV0gPSAweGZmOworICAgICAgICAgICAgcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMl0gPSAweGZmOworICAgICAgICAgICAgcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5NQ1NTZXRbM10gPSAweDAwOworCQkJYnJlYWs7CisJfQorCisJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQ2hhbm5lbFdpZHRoID0gcEFkZEh0SW5mby0+QWRkSHRJbmZvLlJlY29tV2lkdGggJiBwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQ2hhbm5lbFdpZHRoOworCisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlRNUENoZWNrSHQ6OiBIdENhcEluZm8uQ2hhbm5lbFdpZHRoPSVkLCBSZWNvbVdpZHRoPSVkLCBEZXNpcmVkSHRQaHkuQ2hhbm5lbFdpZHRoPSVkLCBCVzQwTUF2YWlsRm9yQS9HPSVkLyVkLCBQaHlNb2RlPSVkIFxuIiwKKwkJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQ2hhbm5lbFdpZHRoLCBwQWRkSHRJbmZvLT5BZGRIdEluZm8uUmVjb21XaWR0aCwgcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkNoYW5uZWxXaWR0aCwKKwkJcEFkLT5OaWNDb25maWcyLmZpZWxkLkJXNDBNQXZhaWxGb3JBLCBwQWQtPk5pY0NvbmZpZzIuZmllbGQuQlc0ME1BdmFpbEZvckcsIHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUpKTsKKworCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkdGID0gIHBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5HRiAmcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkdGOworCisJLy8gU2VuZCBBc3NvYyBSZXEgd2l0aCBteSBIVCBjYXBhYmlsaXR5LgorCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkFNc2R1U2l6ZSA9ICBwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQW1zZHVTaXplOworCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLk1pbW9QcyA9ICBwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuTWltb1BzOworCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLlNob3J0R0lmb3IyMCA9ICAocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LlNob3J0R0lmb3IyMCkgJiAocEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLlNob3J0R0lmb3IyMCk7CisJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uU2hvcnRHSWZvcjQwID0gIChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuU2hvcnRHSWZvcjQwKSAmIChwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uU2hvcnRHSWZvcjQwKTsKKwlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5UeFNUQkMgPSAgKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5UeFNUQkMpJihwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uUnhTVEJDKTsKKwlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5SeFNUQkMgPSAgKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5SeFNUQkMpJihwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uVHhTVEJDKTsKKwlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwUGFybS5NYXhSQW1wZHVGYWN0b3IgPSBwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuTWF4UkFtcGR1RmFjdG9yOworICAgIHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuSHRDYXBQYXJtLk1wZHVEZW5zaXR5ID0gcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwUGFybS5NcGR1RGVuc2l0eTsKKwlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5LkV4dEh0Q2FwSW5mby5QbHVzSFRDID0gcEh0Q2FwYWJpbGl0eS0+RXh0SHRDYXBJbmZvLlBsdXNIVEM7CisJcEFkLT5NYWNUYWIuQ29udGVudFtXY2lkXS5IVENhcGFiaWxpdHkuRXh0SHRDYXBJbmZvLlBsdXNIVEMgPSBwSHRDYXBhYmlsaXR5LT5FeHRIdENhcEluZm8uUGx1c0hUQzsKKwlpZiAocEFkLT5Db21tb25DZmcuYlJkZykKKwl7CisJCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuRXh0SHRDYXBJbmZvLlJER1N1cHBvcnQgPSBwSHRDYXBhYmlsaXR5LT5FeHRIdENhcEluZm8uUkRHU3VwcG9ydDsKKyAgICAgICAgcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5FeHRIdENhcEluZm8uUGx1c0hUQyA9IDE7CisJfQorCisgICAgaWYgKHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkNoYW5uZWxXaWR0aCA9PSBCV18yMCkKKyAgICAgICAgcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5NQ1NTZXRbNF0gPSAweDA7ICAvLyBCVzIwIGNhbid0IHRyYW5zbWl0IE1DUzMyCisKKwlDT1BZX0FQX0hUU0VUVElOR1NfRlJPTV9CRUFDT04ocEFkLCBwSHRDYXBhYmlsaXR5KTsKKwlyZXR1cm4gVFJVRTsKK30KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVZlcmlmeSB0aGUgc3VwcG9ydCByYXRlIGZvciBkaWZmZXJlbnQgUEhZIHR5cGUKKworCUFyZ3VtZW50czoKKwkJcEFkIAkJCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCUlSUUwgPSBQQVNTSVZFX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIFJUTVBVcGRhdGVNbG1lUmF0ZSgKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCkKK3sKKwlVQ0hBUglNaW5pbXVtUmF0ZTsKKwlVQ0hBUglQcm9wZXJNbG1lUmF0ZTsgLy89IFJBVEVfNTQ7CisJVUNIQVIJaSwgaiwgUmF0ZUlkeCA9IDEyOyAvLzEsIDIsIDUuNSwgMTEsIDYsIDksIDEyLCAxOCwgMjQsIDM2LCA0OCwgNTQKKwlCT09MRUFOCWJNYXRjaCA9IEZBTFNFOworCisJc3dpdGNoIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlKQorCXsKKwkJY2FzZSBQSFlfMTFCOgorCQkJUHJvcGVyTWxtZVJhdGUgPSBSQVRFXzExOworCQkJTWluaW11bVJhdGUgPSBSQVRFXzE7CisJCQlicmVhazsKKwkJY2FzZSBQSFlfMTFCR19NSVhFRDoKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJY2FzZSBQSFlfMTFBQkdOX01JWEVEOgorCQljYXNlIFBIWV8xMUJHTl9NSVhFRDoKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJCWlmICgocEFkLT5NbG1lQXV4LlN1cFJhdGVMZW4gPT0gNCkgJiYKKwkJCQkocEFkLT5NbG1lQXV4LkV4dFJhdGVMZW4gPT0gMCkpCisJCQkJLy8gQiBvbmx5IEFQCisJCQkJUHJvcGVyTWxtZVJhdGUgPSBSQVRFXzExOworCQkJZWxzZQorCQkJCVByb3Blck1sbWVSYXRlID0gUkFURV8yNDsKKworCQkJaWYgKHBBZC0+TWxtZUF1eC5DaGFubmVsIDw9IDE0KQorCQkJCU1pbmltdW1SYXRlID0gUkFURV8xOworCQkJZWxzZQorCQkJCU1pbmltdW1SYXRlID0gUkFURV82OworCQkJYnJlYWs7CisJCWNhc2UgUEhZXzExQToKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJY2FzZSBQSFlfMTFOXzJfNEc6CS8vIHJ0Mjg2MCBuZWVkIHRvIGNoZWNrIG1sbWVyYXRlIGZvciA4MDIuMTFuCisJCWNhc2UgUEhZXzExR05fTUlYRUQ6CisJCWNhc2UgUEhZXzExQUdOX01JWEVEOgorCQljYXNlIFBIWV8xMUFOX01JWEVEOgorCQljYXNlIFBIWV8xMU5fNUc6CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCQlQcm9wZXJNbG1lUmF0ZSA9IFJBVEVfMjQ7CisJCQlNaW5pbXVtUmF0ZSA9IFJBVEVfNjsKKwkJCWJyZWFrOworCQljYXNlIFBIWV8xMUFCR19NSVhFRDoKKwkJCVByb3Blck1sbWVSYXRlID0gUkFURV8yNDsKKwkJCWlmIChwQWQtPk1sbWVBdXguQ2hhbm5lbCA8PSAxNCkKKwkJCSAgIE1pbmltdW1SYXRlID0gUkFURV8xOworCQkJZWxzZQorCQkJCU1pbmltdW1SYXRlID0gUkFURV82OworCQkJYnJlYWs7CisJCWRlZmF1bHQ6IC8vIGVycm9yCisJCQlQcm9wZXJNbG1lUmF0ZSA9IFJBVEVfMTsKKwkJCU1pbmltdW1SYXRlID0gUkFURV8xOworCQkJYnJlYWs7CisJfQorCisJZm9yIChpID0gMDsgaSA8IHBBZC0+TWxtZUF1eC5TdXBSYXRlTGVuOyBpKyspCisJeworCQlmb3IgKGogPSAwOyBqIDwgUmF0ZUlkeDsgaisrKQorCQl7CisJCQlpZiAoKHBBZC0+TWxtZUF1eC5TdXBSYXRlW2ldICYgMHg3ZikgPT0gUmF0ZUlkVG81MDBLYnBzW2pdKQorCQkJeworCQkJCWlmIChqID09IFByb3Blck1sbWVSYXRlKQorCQkJCXsKKwkJCQkJYk1hdGNoID0gVFJVRTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisKKwkJaWYgKGJNYXRjaCkKKwkJCWJyZWFrOworCX0KKworCWlmIChiTWF0Y2ggPT0gRkFMU0UpCisJeworCQlmb3IgKGkgPSAwOyBpIDwgcEFkLT5NbG1lQXV4LkV4dFJhdGVMZW47IGkrKykKKwkJeworCQkJZm9yIChqID0gMDsgaiA8IFJhdGVJZHg7IGorKykKKwkJCXsKKwkJCQlpZiAoKHBBZC0+TWxtZUF1eC5FeHRSYXRlW2ldICYgMHg3ZikgPT0gUmF0ZUlkVG81MDBLYnBzW2pdKQorCQkJCXsKKwkJCQkJaWYgKGogPT0gUHJvcGVyTWxtZVJhdGUpCisJCQkJCXsKKwkJCQkJCWJNYXRjaCA9IFRSVUU7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKworCQkJaWYgKGJNYXRjaCkKKwkJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChiTWF0Y2ggPT0gRkFMU0UpCisJeworCQlQcm9wZXJNbG1lUmF0ZSA9IE1pbmltdW1SYXRlOworCX0KKworCXBBZC0+Q29tbW9uQ2ZnLk1sbWVSYXRlID0gTWluaW11bVJhdGU7CisJcEFkLT5Db21tb25DZmcuUnRzUmF0ZSA9IFByb3Blck1sbWVSYXRlOworCWlmIChwQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZSA+PSBSQVRFXzYpCisJeworCQlwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTU9ERSA9IE1PREVfT0ZETTsKKwkJcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1DUyA9IE9mZG1SYXRlVG9SeHdpTUNTW3BBZC0+Q29tbW9uQ2ZnLk1sbWVSYXRlXTsKKwkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1MwTWNhc3RfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX09GRE07CisJCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTME1jYXN0X1dDSURdLkhUUGh5TW9kZS5maWVsZC5NQ1MgPSBPZmRtUmF0ZVRvUnh3aU1DU1twQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZV07CisJfQorCWVsc2UKKwl7CisJCXBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NT0RFID0gTU9ERV9DQ0s7CisJCXBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NQ1MgPSBwQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZTsKKwkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1MwTWNhc3RfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX0NDSzsKKwkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1MwTWNhc3RfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLk1DUyA9IHBBZC0+Q29tbW9uQ2ZnLk1sbWVSYXRlOworCX0KKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJUTVBVcGRhdGVNbG1lUmF0ZSA9PT4gICBNbG1lVHJhbnNtaXQgPSAweCV4ICBcbiIgLCBwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQud29yZCkpOworfQorCitDSEFSIFJUTVBNYXhSc3NpKAorCUlOIFBSVE1QX0FEQVBURVIJcEFkLAorCUlOIENIQVIJCQkJUnNzaTAsCisJSU4gQ0hBUgkJCQlSc3NpMSwKKwlJTiBDSEFSCQkJCVJzc2kyKQoreworCUNIQVIJbGFyZ2VyID0gLTEyNzsKKworCWlmICgocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAxKSAmJiAoUnNzaTAgIT0gMCkpCisJeworCQlsYXJnZXIgPSBSc3NpMDsKKwl9CisKKwlpZiAoKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPj0gMikgJiYgKFJzc2kxICE9IDApKQorCXsKKwkJbGFyZ2VyID0gbWF4KFJzc2kwLCBSc3NpMSk7CisJfQorCisJaWYgKChwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDMpICYmIChSc3NpMiAhPSAwKSkKKwl7CisJCWxhcmdlciA9IG1heChsYXJnZXIsIFJzc2kyKTsKKwl9CisKKwlpZiAobGFyZ2VyID09IC0xMjcpCisJCWxhcmdlciA9IDA7CisKKwlyZXR1cm4gbGFyZ2VyOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFJvdXRpbmUgRGVzY3JpcHRpb246CisgICAgICAgIFBlcmlvZGljIGV2YWx1YXRlIGFudGVubmEgbGluayBzdGF0dXMKKworICAgIEFyZ3VtZW50czoKKyAgICAgICAgcEFkICAgICAgICAgLSBBZGFwdGVyIHBvaW50ZXIKKworICAgIFJldHVybiBWYWx1ZToKKyAgICAgICAgTm9uZQorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBBc2ljRXZhbHVhdGVSeEFudCgKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCkKK3sKKwlVQ0hBUglCQlBSMyA9IDA7CisKKyNpZmRlZiBSQUxJTktfQVRFCisJaWYgKEFURV9PTihwQWQpKQorCQlyZXR1cm47CisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCXsKKwkJaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUwl8CisJCQkJCQkJCWZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUwl8CisJCQkJCQkJCWZSVE1QX0FEQVBURVJfUkFESU9fT0ZGCQkJfAorCQkJCQkJCQlmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QJCXwKKwkJCQkJCQkJZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUykpCisJCQlyZXR1cm47CisKKwkJaWYgKHBBZC0+U3RhQ2ZnLlBzbSA9PSBQV1JfU0FWRSkKKwkJCXJldHVybjsKKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsICZCQlBSMyk7CisJQkJQUjMgJj0gKH4weDE4KTsKKwlpZihwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDMpCisJeworCQlCQlBSMyB8PSAoMHgxMCk7CisJfQorCWVsc2UgaWYocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAyKQorCXsKKwkJQkJQUjMgfD0gKDB4OCk7CisJfQorCWVsc2UgaWYocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAxKQorCXsKKwkJQkJQUjMgfD0gKDB4MCk7CisJfQorCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsIEJCUFIzKTsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKyNpZmRlZiBSVDI4NjAKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorICAgIAlwQWQtPlN0YUNmZy5CQlBSMyA9IEJCUFIzOworI2VuZGlmIC8vIFJUMjg2MCAvLworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCkKKwkJKQorCXsKKwkJVUxPTkcJVHhUb3RhbENudCA9IHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhOb1JldHJ5T2tDb3VudCArCisJCQkJCQkJCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhSZXRyeU9rQ291bnQgKworCQkJCQkJCQlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4RmFpbENvdW50OworCisJCWlmIChUeFRvdGFsQ250ID4gNTApCisJCXsKKwkJCVJUTVBTZXRUaW1lcigmcEFkLT5NbG1lLlJ4QW50RXZhbFRpbWVyLCAyMCk7CisJCQlwQWQtPk1sbWUuYkxvd1Rocm91Z2hwdXQgPSBGQUxTRTsKKwkJfQorCQllbHNlCisJCXsKKwkJCVJUTVBTZXRUaW1lcigmcEFkLT5NbG1lLlJ4QW50RXZhbFRpbWVyLCAzMDApOworCQkJcEFkLT5NbG1lLmJMb3dUaHJvdWdocHV0ID0gVFJVRTsKKwkJfQorCX0KK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgICAgICBBZnRlciBldmFsdWF0aW9uLCBjaGVjayBhbnRlbm5hIGxpbmsgc3RhdHVzCisKKyAgICBBcmd1bWVudHM6CisgICAgICAgIHBBZCAgICAgICAgIC0gQWRhcHRlciBwb2ludGVyCisKKyAgICBSZXR1cm4gVmFsdWU6CisgICAgICAgIE5vbmUKKworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgQXNpY1J4QW50RXZhbFRpbWVvdXQoCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKQoreworCVJUTVBfQURBUFRFUgkqcEFkID0gKFJUTVBfQURBUFRFUiAqKUZ1bmN0aW9uQ29udGV4dDsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlVQ0hBUgkJCUJCUFIzID0gMDsKKwlDSEFSCQkJbGFyZ2VyID0gLTEyNywgcnNzaTAsIHJzc2kxLCByc3NpMjsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworI2lmZGVmIFJBTElOS19BVEUKKwlpZiAoQVRFX09OKHBBZCkpCisJCXJldHVybjsKKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJeworCQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTKQl8fAorCQkJUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MpCQl8fAorCQkJUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JBRElPX09GRikJCQl8fAorCQkJUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKQorCQkJcmV0dXJuOworCisJCWlmIChwQWQtPlN0YUNmZy5Qc20gPT0gUFdSX1NBVkUpCisJCQlyZXR1cm47CisKKworCQkvLyBpZiB0aGUgdHJhZmZpYyBpcyBsb3csIHVzZSBhdmVyYWdlIHJzc2kgYXMgdGhlIGNyaXRlcmlhCisJCWlmIChwQWQtPk1sbWUuYkxvd1Rocm91Z2hwdXQgPT0gVFJVRSkKKwkJeworCQkJcnNzaTAgPSBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMDsKKwkJCXJzc2kxID0gcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTE7CisJCQlyc3NpMiA9IHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kyOworCQl9CisJCWVsc2UKKwkJeworCQkJcnNzaTAgPSBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kwOworCQkJcnNzaTEgPSBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kxOworCQkJcnNzaTIgPSBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kyOworCQl9CisKKwkJaWYocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAzKQorCQl7CisJCQlsYXJnZXIgPSBtYXgocnNzaTAsIHJzc2kxKTsKKworCQkJaWYgKGxhcmdlciA+IChyc3NpMiArIDIwKSkKKwkJCQlwQWQtPk1sbWUuUmVhbFJ4UGF0aCA9IDI7CisJCQllbHNlCisJCQkJcEFkLT5NbG1lLlJlYWxSeFBhdGggPSAzOworCQl9CisJCWVsc2UgaWYocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAyKQorCQl7CisJCQlpZiAocnNzaTAgPiAocnNzaTEgKyAyMCkpCisJCQkJcEFkLT5NbG1lLlJlYWxSeFBhdGggPSAxOworCQkJZWxzZQorCQkJCXBBZC0+TWxtZS5SZWFsUnhQYXRoID0gMjsKKwkJfQorCisJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgJkJCUFIzKTsKKwkJQkJQUjMgJj0gKH4weDE4KTsKKwkJaWYocEFkLT5NbG1lLlJlYWxSeFBhdGggPT0gMykKKwkJeworCQkJQkJQUjMgfD0gKDB4MTApOworCQl9CisJCWVsc2UgaWYocEFkLT5NbG1lLlJlYWxSeFBhdGggPT0gMikKKwkJeworCQkJQkJQUjMgfD0gKDB4OCk7CisJCX0KKwkJZWxzZSBpZihwQWQtPk1sbWUuUmVhbFJ4UGF0aCA9PSAxKQorCQl7CisJCQlCQlBSMyB8PSAoMHgwKTsKKwkJfQorCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCBCQlBSMyk7CisjaWZkZWYgUlQyODYwCisgICAgcEFkLT5TdGFDZmcuQkJQUjMgPSBCQlBSMzsKKyNlbmRpZiAvLyBSVDI4NjAgLy8KKwl9CisKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworfQorCisKKworVk9JRCBBUFNEUGVyaW9kaWNFeGVjKAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKKwlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMykKK3sKKwlSVE1QX0FEQVBURVIgKnBBZCA9IChSVE1QX0FEQVBURVIgKilGdW5jdGlvbkNvbnRleHQ7CisKKwlpZiAoIU9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSkKKwkJcmV0dXJuOworCisJcEFkLT5Db21tb25DZmcuVHJpZ2dlclRpbWVyQ291bnQrKzsKKworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFJvdXRpbmUgRGVzY3JpcHRpb246CisgICAgICAgIFNldC9yZXNldCBNQUMgcmVnaXN0ZXJzIGFjY29yZGluZyB0byBiUGlnZ3lCYWNrIHBhcmFtZXRlcgorCisgICAgQXJndW1lbnRzOgorICAgICAgICBwQWQgICAgICAgICAtIEFkYXB0ZXIgcG9pbnRlcgorICAgICAgICBiUGlnZ3lCYWNrICAtIEVuYWJsZSAvIERpc2FibGUgUGlnZ3ktQmFjaworCisgICAgUmV0dXJuIFZhbHVlOgorICAgICAgICBOb25lCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIFJUTVBTZXRQaWdneUJhY2soCisgICAgSU4gUFJUTVBfQURBUFRFUiAgICBwQWQsCisgICAgSU4gQk9PTEVBTiAgICAgICAgICBiUGlnZ3lCYWNrKQoreworCVRYX0xJTktfQ0ZHX1NUUlVDICBUeExpbmtDZmc7CisKKwlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0xJTktfQ0ZHLCAmVHhMaW5rQ2ZnLndvcmQpOworCisJVHhMaW5rQ2ZnLmZpZWxkLlR4Q0ZBY2tFbiA9IGJQaWdneUJhY2s7CisJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfTElOS19DRkcsIFR4TGlua0NmZy53b3JkKTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgICAgICBjaGVjayBpZiB0aGlzIGVudHJ5IG5lZWQgdG8gc3dpdGNoIHJhdGUgYXV0b21hdGljYWxseQorCisgICAgQXJndW1lbnRzOgorICAgICAgICBwQWQKKyAgICAgICAgcEVudHJ5CisKKyAgICBSZXR1cm4gVmFsdWU6CisgICAgICAgIFRVUkUKKyAgICAgICAgRkFMU0UKKworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0JPT0xFQU4gUlRNUENoZWNrRW50cnlFbmFibGVBdXRvUmF0ZVN3aXRjaCgKKwlJTiBQUlRNUF9BREFQVEVSICAgIHBBZCwKKwlJTiBQTUFDX1RBQkxFX0VOVFJZCXBFbnRyeSkKK3sKKwlCT09MRUFOCQlyZXN1bHQgPSBUUlVFOworCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCXsKKwkJLy8gb25seSBhc3NvY2lhdGVkIFNUQSBjb3VudHMKKwkJaWYgKHBFbnRyeSAmJiAocEVudHJ5LT5WYWxpZEFzQ0xJKSAmJiAocEVudHJ5LT5Tc3QgPT0gU1NUX0FTU09DKSkKKwkJeworCQkJcmVzdWx0ID0gcEFkLT5TdGFDZmcuYkF1dG9UeFJhdGVTd2l0Y2g7CisJCX0KKwkJZWxzZQorCQkJcmVzdWx0ID0gRkFMU0U7CisKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwkJaWYgKHBFbnRyeSAmJiAocEVudHJ5LT5WYWxpZEFzRGxzKSkKKwkJCXJlc3VsdCA9IHBBZC0+U3RhQ2ZnLmJBdXRvVHhSYXRlU3dpdGNoOworI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCisKKwlyZXR1cm4gcmVzdWx0OworfQorCisKK0JPT0xFQU4gUlRNUEF1dG9SYXRlU3dpdGNoQ2hlY2soCisJSU4gUFJUTVBfQURBUFRFUiAgICBwQWQpCit7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCXsKKwkJaWYgKHBBZC0+U3RhQ2ZnLmJBdXRvVHhSYXRlU3dpdGNoKQorCQkJcmV0dXJuIFRSVUU7CisJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCXJldHVybiBGQUxTRTsKK30KKworCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFJvdXRpbmUgRGVzY3JpcHRpb246CisgICAgICAgIGNoZWNrIGlmIHRoaXMgZW50cnkgbmVlZCB0byBmaXggdHggbGVnYWN5IHJhdGUKKworICAgIEFyZ3VtZW50czoKKyAgICAgICAgcEFkCisgICAgICAgIHBFbnRyeQorCisgICAgUmV0dXJuIFZhbHVlOgorICAgICAgICBUVVJFCisgICAgICAgIEZBTFNFCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitVQ0hBUiBSVE1QU3RhRml4ZWRUeE1vZGUoCisJSU4gUFJUTVBfQURBUFRFUiAgICBwQWQsCisJSU4gUE1BQ19UQUJMRV9FTlRSWQlwRW50cnkpCit7CisJVUNIQVIJdHhfbW9kZSA9IEZJWEVEX1RYTU9ERV9IVDsKKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwl7CisJCXR4X21vZGUgPSAoVUNIQVIpcEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5GaXhlZFR4TW9kZTsKKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlyZXR1cm4gdHhfbW9kZTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgICAgICBPdmVyd3JpdGUgSFQgVHggTW9kZSBieSBGaXhlZCBMZWdlbmN5IFR4IE1vZGUsIGlmIHNwZWNpZmllZC4KKworICAgIEFyZ3VtZW50czoKKyAgICAgICAgcEFkCisgICAgICAgIHBFbnRyeQorCisgICAgUmV0dXJuIFZhbHVlOgorICAgICAgICBUVVJFCisgICAgICAgIEZBTFNFCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIFJUTVBVcGRhdGVMZWdhY3lUeFNldHRpbmcoCisJCVVDSEFSCQkJCWZpeGVkX3R4X21vZGUsCisJCVBNQUNfVEFCTEVfRU5UUlkJcEVudHJ5KQoreworCUhUVFJBTlNNSVRfU0VUVElORyBUcmFuc21pdFNldHRpbmc7CisKKwlpZiAoZml4ZWRfdHhfbW9kZSA9PSBGSVhFRF9UWE1PREVfSFQpCisJCXJldHVybjsKKworCVRyYW5zbWl0U2V0dGluZy53b3JkID0gMDsKKworCVRyYW5zbWl0U2V0dGluZy5maWVsZC5NT0RFID0gcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTU9ERTsKKwlUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTOworCisJaWYgKGZpeGVkX3R4X21vZGUgPT0gRklYRURfVFhNT0RFX0NDSykKKwl7CisJCVRyYW5zbWl0U2V0dGluZy5maWVsZC5NT0RFID0gTU9ERV9DQ0s7CisJCS8vIENDSyBtb2RlIGFsbG93IE1DUyAwfjMKKwkJaWYgKFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPiBNQ1NfMykKKwkJCVRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfMzsKKwl9CisJZWxzZQorCXsKKwkJVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1PREUgPSBNT0RFX09GRE07CisJCS8vIE9GRE0gbW9kZSBhbGxvdyBNQ1MgMH43CisJCWlmIChUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID4gTUNTXzcpCisJCQlUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTXzc7CisJfQorCisJaWYgKHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1PREUgPj0gVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1PREUpCisJeworCQlwRW50cnktPkhUUGh5TW9kZS53b3JkID0gVHJhbnNtaXRTZXR0aW5nLndvcmQ7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJUTVBVcGRhdGVMZWdhY3lUeFNldHRpbmcgOiB3Y2lkLSVkLCBNT0RFPSVzLCBNQ1M9JWQgXG4iLAorCQkJCXBFbnRyeS0+QWlkLCBHZXRQaHlNb2RlKHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1PREUpLCBwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NQ1MpKTsKKwl9Cit9CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJZHluYW1pYyB0dW5lIEJCUCBSNjYgdG8gZmluZCBhIGJhbGFuY2UgYmV0d2VlbiBzZW5zaWJpbGl0eSBhbmQKKwkJbm9pc2UgaXNvbGF0aW9uCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgQXNpY1N0YUJicFR1bmluZygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlVQ0hBUglPcmlnUjY2VmFsdWUgPSAwLCBSNjY7Ly8sIFI2NlVwcGVyQm91bmQgPSAweDMwLCBSNjZMb3dlckJvdW5kID0gMHgzMDsKKwlDSEFSCVJzc2k7CisKKwkvLyAyODYwQyBkaWQgbm90IHN1cHBvcnQgRmFzZSBDQ0EsIHRoZXJlZm9yZSBjYW4ndCB0dW5lCisJaWYgKHBBZC0+TUFDVmVyc2lvbiA9PSAweDI4NjAwMTAwKQorCQlyZXR1cm47CisKKwkvLworCS8vIHdvcmsgYXMgYSBTVEEKKwkvLworCWlmIChwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlICE9IENOVExfSURMRSkgIC8vIG5vIFI2NiB0dW5pbmcgd2hlbiBTQ0FOTklORworCQlyZXR1cm47CisKKwlpZiAoKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpCisJCSYmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCkKKwkJCSkKKwkJJiYgIShPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0RPWkUpKQorI2lmZGVmIFJUMjg2MAorCQkmJiAocEFkLT5iUENJY2xrT2ZmID09IEZBTFNFKQorI2VuZGlmIC8vIFJUMjg2MCAvLworCQkpCisJeworCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY2LCAmT3JpZ1I2NlZhbHVlKTsKKwkJUjY2ID0gT3JpZ1I2NlZhbHVlOworCisJCWlmIChwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID4gMSkKKwkJCVJzc2kgPSAocEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMCArIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTEpID4+IDE7CisJCWVsc2UKKwkJCVJzc2kgPSBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kwOworCisJCWlmIChwQWQtPkxhdGNoUmZSZWdzLkNoYW5uZWwgPD0gMTQpCisJCXsJLy9CRyBiYW5kCisJCQl7CisJCQkJaWYgKFJzc2kgPiBSU1NJX0ZPUl9NSURfTE9XX1NFTlNJQklMSVRZKQorCQkJCXsKKwkJCQkJUjY2ID0gKDB4MkUgKyBHRVRfTE5BX0dBSU4ocEFkKSkgKyAweDEwOworCQkJCQlpZiAoT3JpZ1I2NlZhbHVlICE9IFI2NikKKwkJCQkJeworCQkJCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjYsIFI2Nik7CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJUjY2ID0gMHgyRSArIEdFVF9MTkFfR0FJTihwQWQpOworCQkJCQlpZiAoT3JpZ1I2NlZhbHVlICE9IFI2NikKKwkJCQkJeworCQkJCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjYsIFI2Nik7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CS8vQSBiYW5kCisJCQlpZiAocEFkLT5Db21tb25DZmcuQkJQQ3VycmVudEJXID09IEJXXzIwKQorCQkJeworCQkJCWlmIChSc3NpID4gUlNTSV9GT1JfTUlEX0xPV19TRU5TSUJJTElUWSkKKwkJCQl7CisJCQkJCVI2NiA9IDB4MzIgKyAoR0VUX0xOQV9HQUlOKHBBZCkqNSkvMyArIDB4MTA7CisJCQkJCWlmIChPcmlnUjY2VmFsdWUgIT0gUjY2KQorCQkJCQl7CisJCQkJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2NiwgUjY2KTsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlSNjYgPSAweDMyICsgKEdFVF9MTkFfR0FJTihwQWQpKjUpLzM7CisJCQkJCWlmIChPcmlnUjY2VmFsdWUgIT0gUjY2KQorCQkJCQl7CisJCQkJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2NiwgUjY2KTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlpZiAoUnNzaSA+IFJTU0lfRk9SX01JRF9MT1dfU0VOU0lCSUxJVFkpCisJCQkJeworCQkJCQlSNjYgPSAweDNBICsgKEdFVF9MTkFfR0FJTihwQWQpKjUpLzMgKyAweDEwOworCQkJCQlpZiAoT3JpZ1I2NlZhbHVlICE9IFI2NikKKwkJCQkJeworCQkJCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjYsIFI2Nik7CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJUjY2ID0gMHgzQSArIChHRVRfTE5BX0dBSU4ocEFkKSo1KS8zOworCQkJCQlpZiAoT3JpZ1I2NlZhbHVlICE9IFI2NikKKwkJCQkJeworCQkJCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjYsIFI2Nik7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKworCisJfQorfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCitWT0lEIFJUTVBTZXRBR0NJbml0VmFsdWUoCisJSU4gUFJUTVBfQURBUFRFUglwQWQsCisJSU4gVUNIQVIJCQlCYW5kV2lkdGgpCit7CisJVUNIQVIJUjY2ID0gMHgzMDsKKworCWlmIChwQWQtPkxhdGNoUmZSZWdzLkNoYW5uZWwgPD0gMTQpCisJewkvLyBCRyBiYW5kCisJCVI2NiA9IDB4MkUgKyBHRVRfTE5BX0dBSU4ocEFkKTsKKwkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjYsIFI2Nik7CisJfQorCWVsc2UKKwl7CS8vQSBiYW5kCisJCWlmIChCYW5kV2lkdGggPT0gQldfMjApCisJCXsKKwkJCVI2NiA9IChVQ0hBUikoMHgzMiArIChHRVRfTE5BX0dBSU4ocEFkKSo1KS8zKTsKKwkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY2LCBSNjYpOworCQl9CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCWVsc2UKKwkJeworCQkJUjY2ID0gKFVDSEFSKSgweDNBICsgKEdFVF9MTkFfR0FJTihwQWQpKjUpLzMpOworCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjYsIFI2Nik7CisJCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwl9CisKK30KKworVk9JRCBBc2ljVHVybk9mZlJGQ2xrKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOCVVDSEFSCQlDaGFubmVsKQoreworCisJLy8gUkYgUjIgYml0IDE4ID0gMAorCVVJTlQzMgkJCVIxID0gMCwgUjIgPSAwLCBSMyA9IDA7CisJVUNIQVIJCQlpbmRleDsKKwlSVE1QX1JGX1JFR1MJKlJGUmVnVGFibGU7CisKKwlSRlJlZ1RhYmxlID0gUkYyODUwUmVnVGFibGU7CisKKwlzd2l0Y2ggKHBBZC0+UmZJY1R5cGUpCisJeworCQljYXNlIFJGSUNfMjgyMDoKKwkJY2FzZSBSRklDXzI4NTA6CisJCWNhc2UgUkZJQ18yNzIwOgorCQljYXNlIFJGSUNfMjc1MDoKKworCQkJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgTlVNX09GXzI4NTBfQ0hOTDsgaW5kZXgrKykKKwkJCXsKKwkJCQlpZiAoQ2hhbm5lbCA9PSBSRlJlZ1RhYmxlW2luZGV4XS5DaGFubmVsKQorCQkJCXsKKwkJCQkJUjEgPSBSRlJlZ1RhYmxlW2luZGV4XS5SMSAmIDB4ZmZmZmRmZmY7CisJCQkJCVIyID0gUkZSZWdUYWJsZVtpbmRleF0uUjIgJiAweGZmZmJmZmZmOworCQkJCQlSMyA9IFJGUmVnVGFibGVbaW5kZXhdLlIzICYgMHhmZmYzZmZmZjsKKworCQkJCQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCBSMSk7CisJCQkJCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIFIyKTsKKworCQkJCQkvLyBQcm9ncmFtIFIxYjEzIHRvIDEsIFIzL2IxOCwxOSB0byAwLCBSMmIxOCB0byAwLgorCQkJCQkvLyBTZXQgUkYgUjIgYml0MTg9MCwgUjMgYml0WzE4OjE5XT0wCisJCQkJCS8vaWYgKHBBZC0+U3RhQ2ZnLmJSYWRpbyA9PSBGQUxTRSkKKwkJCQkJaWYgKDEpCisJCQkJCXsKKwkJCQkJCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIFIzKTsKKworCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQXNpY1R1cm5PZmZSRkNsayMlZChSRj0lZCwgKSAsIFIyPTB4JTA4eCwgIFIzID0gMHglMDh4IFxuIiwKKwkJCQkJCQlDaGFubmVsLCBwQWQtPlJmSWNUeXBlLCBSMiwgUjMpKTsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBc2ljVHVybk9mZlJGQ2xrIyVkKFJGPSVkLCApICwgUjI9MHglMDh4IFxuIiwKKwkJCQkJCQlDaGFubmVsLCBwQWQtPlJmSWNUeXBlLCBSMikpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJfQorfQorCisKK1ZPSUQgQXNpY1R1cm5PblJGQ2xrKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOCVVDSEFSCQkJQ2hhbm5lbCkKK3sKKworCS8vIFJGIFIyIGJpdCAxOCA9IDAKKwlVSU5UMzIJCQlSMSA9IDAsIFIyID0gMCwgUjMgPSAwOworCVVDSEFSCQkJaW5kZXg7CisJUlRNUF9SRl9SRUdTCSpSRlJlZ1RhYmxlOworCisJUkZSZWdUYWJsZSA9IFJGMjg1MFJlZ1RhYmxlOworCisJc3dpdGNoIChwQWQtPlJmSWNUeXBlKQorCXsKKwkJY2FzZSBSRklDXzI4MjA6CisJCWNhc2UgUkZJQ18yODUwOgorCQljYXNlIFJGSUNfMjcyMDoKKwkJY2FzZSBSRklDXzI3NTA6CisKKwkJCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IE5VTV9PRl8yODUwX0NITkw7IGluZGV4KyspCisJCQl7CisJCQkJaWYgKENoYW5uZWwgPT0gUkZSZWdUYWJsZVtpbmRleF0uQ2hhbm5lbCkKKwkJCQl7CisJCQkJCVIzID0gcEFkLT5MYXRjaFJmUmVncy5SMzsKKwkJCQkJUjMgJj0gMHhmZmYzZmZmZjsKKwkJCQkJUjMgfD0gMHgwMDA4MDAwMDsKKwkJCQkJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgUjMpOworCisJCQkJCVIxID0gUkZSZWdUYWJsZVtpbmRleF0uUjE7CisJCQkJCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIFIxKTsKKworCQkJCQlSMiA9IFJGUmVnVGFibGVbaW5kZXhdLlIyOworCQkJCQlpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCA9PSAxKQorCQkJCQl7CisJCQkJCQlSMiB8PSAweDQwMDA7CS8vIElmIFRYcGF0aCBpcyAxLCBiaXQgMTQgPSAxOworCQkJCQl9CisKKwkJCQkJaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPT0gMikKKwkJCQkJeworCQkJCQkJUjIgfD0gMHg0MDsJLy8gd3JpdGUgMSB0byBvZmYgUnhwYXRoLgorCQkJCQl9CisJCQkJCWVsc2UgaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPT0gMSkKKwkJCQkJeworCQkJCQkJUjIgfD0gMHgyMDA0MDsJLy8gd3JpdGUgMSB0byBvZmYgUnhQYXRoCisJCQkJCX0KKwkJCQkJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgUjIpOworCisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwl9CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBc2ljVHVybk9uUkZDbGsjJWQoUkY9JWQsICkgLCBSMj0weCUwOHhcbiIsCisJCUNoYW5uZWwsCisJCXBBZC0+UmZJY1R5cGUsCisJCVIyKSk7Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL25ldGlmX2Jsb2NrLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9uZXRpZl9ibG9jay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzZjdkMDgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9uZXRpZl9ibG9jay5jCkBAIC0wLDAgKzEsMTQ0IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisjaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCisjaW5jbHVkZSAibmV0aWZfYmxvY2suaCIKKworc3RhdGljIE5FVElGX0VOVFJZIGZyZWVOZXRJZkVudHJ5UG9vbFtGUkVFX05FVElGX1BPT0xfU0laRV07CitzdGF0aWMgTElTVF9IRUFERVIgZnJlZU5ldElmRW50cnlMaXN0OworCit2b2lkIGluaXRibG9ja1F1ZXVlVGFiKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCWludCBpOworCisJaW5pdExpc3QoJmZyZWVOZXRJZkVudHJ5TGlzdCk7CisJZm9yIChpID0gMDsgaSA8IEZSRUVfTkVUSUZfUE9PTF9TSVpFOyBpKyspCisJCWluc2VydFRhaWxMaXN0KCZmcmVlTmV0SWZFbnRyeUxpc3QsIChQTElTVF9FTlRSWSkmZnJlZU5ldElmRW50cnlQb29sW2ldKTsKKworCWZvciAoaT0wOyBpIDwgTlVNX09GX1RYX1JJTkc7IGkrKykKKwkJaW5pdExpc3QoJnBBZC0+YmxvY2tRdWV1ZVRhYltpXS5OZXRJZkxpc3QpOworCisJcmV0dXJuOworfQorCitCT09MRUFOIGJsb2NrTmV0SWYoCisJSU4gUEJMT0NLX1FVRVVFX0VOVFJZIHBCbG9ja1F1ZXVlRW50cnksCisJSU4gUE5FVF9ERVYgcE5ldERldikKK3sKKwlQTkVUSUZfRU5UUlkgcE5ldElmRW50cnkgPSBOVUxMOworCisJaWYgKChwTmV0SWZFbnRyeSA9IChQTkVUSUZfRU5UUlkpcmVtb3ZlSGVhZExpc3QoJmZyZWVOZXRJZkVudHJ5TGlzdCkpICE9IE5VTEwpCisJeworCQluZXRpZl9zdG9wX3F1ZXVlKHBOZXREZXYpOworCQlwTmV0SWZFbnRyeS0+cE5ldERldiA9IHBOZXREZXY7CisJCWluc2VydFRhaWxMaXN0KCZwQmxvY2tRdWV1ZUVudHJ5LT5OZXRJZkxpc3QsIChQTElTVF9FTlRSWSlwTmV0SWZFbnRyeSk7CisKKwkJcEJsb2NrUXVldWVFbnRyeS0+U3dUeFF1ZXVlQmxvY2tGbGFnID0gVFJVRTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgibmV0aWZfc3RvcF9xdWV1ZSglcylcbiIsIHBOZXREZXYtPm5hbWUpKTsKKwl9CisJZWxzZQorCQlyZXR1cm4gRkFMU0U7CisKKwlyZXR1cm4gVFJVRTsKK30KKworVk9JRCByZWxlYXNlTmV0SWYoCisJSU4gUEJMT0NLX1FVRVVFX0VOVFJZIHBCbG9ja1F1ZXVlRW50cnkpCit7CisJUE5FVElGX0VOVFJZIHBOZXRJZkVudHJ5ID0gTlVMTDsKKwlQTElTVF9IRUFERVIgcE5ldElmTGlzdCA9ICZwQmxvY2tRdWV1ZUVudHJ5LT5OZXRJZkxpc3Q7CisKKwl3aGlsZSgocE5ldElmRW50cnkgPSAoUE5FVElGX0VOVFJZKXJlbW92ZUhlYWRMaXN0KHBOZXRJZkxpc3QpKSAhPSAgTlVMTCkKKwl7CisJCVBORVRfREVWIHBOZXREZXYgPSBwTmV0SWZFbnRyeS0+cE5ldERldjsKKwkJbmV0aWZfd2FrZV9xdWV1ZShwTmV0RGV2KTsKKwkJaW5zZXJ0VGFpbExpc3QoJmZyZWVOZXRJZkVudHJ5TGlzdCwgKFBMSVNUX0VOVFJZKXBOZXRJZkVudHJ5KTsKKworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJuZXRpZl93YWtlX3F1ZXVlKCVzKVxuIiwgcE5ldERldi0+bmFtZSkpOworCX0KKwlwQmxvY2tRdWV1ZUVudHJ5LT5Td1R4UXVldWVCbG9ja0ZsYWcgPSBGQUxTRTsKKwlyZXR1cm47Cit9CisKKworVk9JRCBTdG9wTmV0SWZRdWV1ZSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVQ0hBUiBRdWVJZHgsCisJSU4gUE5ESVNfUEFDS0VUIHBQYWNrZXQpCit7CisJUE5FVF9ERVYgTmV0RGV2ID0gTlVMTDsKKwlVQ0hBUiBJZklkeCA9IDA7CisJQk9PTEVBTiB2YWxpZCA9IEZBTFNFOworCisjaWZkZWYgQVBDTElfU1VQUE9SVAorCWlmIChSVE1QX0dFVF9QQUNLRVRfTkVUX0RFVklDRShwUGFja2V0KSA+PSBNSU5fTkVUX0RFVklDRV9GT1JfQVBDTEkpCisJeworCQlJZklkeCA9IChSVE1QX0dFVF9QQUNLRVRfTkVUX0RFVklDRShwUGFja2V0KSAtIE1JTl9ORVRfREVWSUNFX0ZPUl9BUENMSSkgJSBNQVhfQVBDTElfTlVNOworCQlOZXREZXYgPSBwQWQtPkFwQ2ZnLkFwQ2xpVGFiW0lmSWR4XS5kZXY7CisJfQorCWVsc2UKKyNlbmRpZiAvLyBBUENMSV9TVVBQT1JUIC8vCisjaWZkZWYgV0RTX1NVUFBPUlQKKwlpZiAoUlRNUF9HRVRfUEFDS0VUX05FVF9ERVZJQ0UocFBhY2tldCkgPj0gTUlOX05FVF9ERVZJQ0VfRk9SX1dEUykKKwl7CisJCUlmSWR4ID0gKFJUTVBfR0VUX1BBQ0tFVF9ORVRfREVWSUNFKHBQYWNrZXQpIC0gTUlOX05FVF9ERVZJQ0VfRk9SX1dEUykgJSBNQVhfV0RTX0VOVFJZOworCQlOZXREZXYgPSBwQWQtPldkc1RhYi5XZHNFbnRyeVtJZklkeF0uZGV2OworCX0KKwllbHNlCisjZW5kaWYgLy8gV0RTX1NVUFBPUlQgLy8KKwl7CisjaWZkZWYgTUJTU19TVVBQT1JUCisJCWlmIChwQWQtPk9wTW9kZSA9PSBPUE1PREVfQVApCisJCXsKKwkJCUlmSWR4ID0gKFJUTVBfR0VUX1BBQ0tFVF9ORVRfREVWSUNFKHBQYWNrZXQpIC0gTUlOX05FVF9ERVZJQ0VfRk9SX01CU1NJRCkgJSBNQVhfTUJTU0lEX05VTTsKKwkJCU5ldERldiA9IHBBZC0+QXBDZmcuTUJTU0lEW0lmSWR4XS5NU1NJRERldjsKKwkJfQorCQllbHNlCisJCXsKKwkJCUlmSWR4ID0gTUFJTl9NQlNTSUQ7CisJCQlOZXREZXYgPSBwQWQtPm5ldF9kZXY7CisJCX0KKyNlbHNlCisJCUlmSWR4ID0gTUFJTl9NQlNTSUQ7CisJCU5ldERldiA9IHBBZC0+bmV0X2RldjsKKyNlbmRpZgorCX0KKworCS8vIFdNTSBzdXBwb3J0IDQgc29mdHdhcmUgcXVldWVzLgorCS8vIE9uZSBzb2Z0d2FyZSBxdWV1ZSBmdWxsIGRvZXNuJ3QgbWVhbiBkZXZpY2UgaGF2ZSBubyBjYXBiaWxpdHkgdG8gdHJhbnNtaXQgcGFja2V0LgorCS8vIFNvIGRpc2FibGUgYmxvY2sgTmV0LUlmIHF1ZXVlIGZ1bmN0aW9uIHdoaWxlIFdNTSBlbmFibGUuCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJdmFsaWQgPSAocEFkLT5Db21tb25DZmcuYldtbUNhcGFibGUgPT0gVFJVRSkgPyBGQUxTRSA6IFRSVUU7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlpZiAodmFsaWQpCisJCWJsb2NrTmV0SWYoJnBBZC0+YmxvY2tRdWV1ZVRhYltRdWVJZHhdLCBOZXREZXYpOworCXJldHVybjsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vbmV0aWZfYmxvY2suaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL25ldGlmX2Jsb2NrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmU1MTUxYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL25ldGlmX2Jsb2NrLmgKQEAgLTAsMCArMSw1OCBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworI2lmbmRlZiBfX05FVF9JRl9CTE9DS19IX18KKyNkZWZpbmUgX19ORVRfSUZfQkxPQ0tfSF9fCisKKy8vI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgImxpbmtfbGlzdC5oIgorI2luY2x1ZGUgInJ0bXAuaCIKKworI2RlZmluZSBGUkVFX05FVElGX1BPT0xfU0laRSAzMgorCit0eXBlZGVmIHN0cnVjdCBfTkVUSUZfRU5UUlkKK3sKKwlzdHJ1Y3QgX05FVElGX0VOVFJZICpwTmV4dDsKKwlQTkVUX0RFViBwTmV0RGV2OworfSBORVRJRl9FTlRSWSwgKlBORVRJRl9FTlRSWTsKKwordm9pZCBpbml0YmxvY2tRdWV1ZVRhYigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK0JPT0xFQU4gYmxvY2tOZXRJZigKKwlJTiBQQkxPQ0tfUVVFVUVfRU5UUlkgcEJsb2NrUXVldWVFbnRyeSwKKwlJTiBQTkVUX0RFViBwTmV0RGV2KTsKKworVk9JRCByZWxlYXNlTmV0SWYoCisJSU4gUEJMT0NLX1FVRVVFX0VOVFJZIHBCbG9ja1F1ZXVlRW50cnkpOworCitWT0lEIFN0b3BOZXRJZlF1ZXVlKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVDSEFSIFF1ZUlkeCwKKwlJTiBQTkRJU19QQUNLRVQgcFBhY2tldCk7CisjZW5kaWYgLy8gX19ORVRfSUZfQkxPQ0tfSF9fCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL3J0bXBfaW5pdC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vcnRtcF9pbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTYzZjJjNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL3J0bXBfaW5pdC5jCkBAIC0wLDAgKzEsMzc0NCBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwlNb2R1bGUgTmFtZToKKwlydG1wX2luaXQuYworCisJQWJzdHJhY3Q6CisJTWluaXBvcnQgZ2VuZXJpYyBwb3J0aW9uIGhlYWRlciBmaWxlCisKKwlSZXZpc2lvbiBIaXN0b3J5OgorCVdobyAgICAgICAgIFdoZW4gICAgICAgICAgV2hhdAorCS0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCVBhdWwgTGluICAgIDIwMDItMDgtMDEgICAgY3JlYXRlZAorICAgIEpvaG4gQ2hhbmcgIDIwMDQtMDgtMjAgICAgUlQyNTYxLzI2NjEgdXNlIHNjYXR0ZXItZ2F0aGVyIHNjaGVtZQorICAgIEphbiBMZWUgIDIwMDYtMDktMTUgICAgUlQyODYwLiBDaGFuZ2UgZm9yIDgwMi4xMW4gLCBFRVBST00sIExlZCwgQkEsIEhULgorKi8KKyNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKKyNpbmNsdWRlIAkiZmlybXdhcmUuaCIKKyNpbmNsdWRlIDxsaW51eC9iaXRyZXYuaD4KKworVUNIQVIgICAgQklUOFtdID0gezB4MDEsIDB4MDIsIDB4MDQsIDB4MDgsIDB4MTAsIDB4MjAsIDB4NDAsIDB4ODB9OworVUxPTkcgICAgQklUMzJbXSA9IHsweDAwMDAwMDAxLCAweDAwMDAwMDAyLCAweDAwMDAwMDA0LCAweDAwMDAwMDA4LAorCQkJCQkweDAwMDAwMDEwLCAweDAwMDAwMDIwLCAweDAwMDAwMDQwLCAweDAwMDAwMDgwLAorCQkJCQkweDAwMDAwMTAwLCAweDAwMDAwMjAwLCAweDAwMDAwNDAwLCAweDAwMDAwODAwLAorCQkJCQkweDAwMDAxMDAwLCAweDAwMDAyMDAwLCAweDAwMDA0MDAwLCAweDAwMDA4MDAwLAorCQkJCQkweDAwMDEwMDAwLCAweDAwMDIwMDAwLCAweDAwMDQwMDAwLCAweDAwMDgwMDAwLAorCQkJCQkweDAwMTAwMDAwLCAweDAwMjAwMDAwLCAweDAwNDAwMDAwLCAweDAwODAwMDAwLAorCQkJCQkweDAxMDAwMDAwLCAweDAyMDAwMDAwLCAweDA0MDAwMDAwLCAweDA4MDAwMDAwLAorCQkJCQkweDEwMDAwMDAwLCAweDIwMDAwMDAwLCAweDQwMDAwMDAwLCAweDgwMDAwMDAwfTsKKworY2hhciogICBDaXBoZXJOYW1lW10gPSB7Im5vbmUiLCJ3ZXA2NCIsIndlcDEyOCIsIlRLSVAiLCJBRVMiLCJDS0lQNjQiLCJDS0lQMTI4In07CisKK2NvbnN0IHVuc2lnbmVkIHNob3J0IGNjaXR0XzE2VGFibGVbXSA9IHsKKwkweDAwMDAsIDB4MTAyMSwgMHgyMDQyLCAweDMwNjMsIDB4NDA4NCwgMHg1MEE1LCAweDYwQzYsIDB4NzBFNywKKwkweDgxMDgsIDB4OTEyOSwgMHhBMTRBLCAweEIxNkIsIDB4QzE4QywgMHhEMUFELCAweEUxQ0UsIDB4RjFFRiwKKwkweDEyMzEsIDB4MDIxMCwgMHgzMjczLCAweDIyNTIsIDB4NTJCNSwgMHg0Mjk0LCAweDcyRjcsIDB4NjJENiwKKwkweDkzMzksIDB4ODMxOCwgMHhCMzdCLCAweEEzNUEsIDB4RDNCRCwgMHhDMzlDLCAweEYzRkYsIDB4RTNERSwKKwkweDI0NjIsIDB4MzQ0MywgMHgwNDIwLCAweDE0MDEsIDB4NjRFNiwgMHg3NEM3LCAweDQ0QTQsIDB4NTQ4NSwKKwkweEE1NkEsIDB4QjU0QiwgMHg4NTI4LCAweDk1MDksIDB4RTVFRSwgMHhGNUNGLCAweEM1QUMsIDB4RDU4RCwKKwkweDM2NTMsIDB4MjY3MiwgMHgxNjExLCAweDA2MzAsIDB4NzZENywgMHg2NkY2LCAweDU2OTUsIDB4NDZCNCwKKwkweEI3NUIsIDB4QTc3QSwgMHg5NzE5LCAweDg3MzgsIDB4RjdERiwgMHhFN0ZFLCAweEQ3OUQsIDB4QzdCQywKKwkweDQ4QzQsIDB4NThFNSwgMHg2ODg2LCAweDc4QTcsIDB4MDg0MCwgMHgxODYxLCAweDI4MDIsIDB4MzgyMywKKwkweEM5Q0MsIDB4RDlFRCwgMHhFOThFLCAweEY5QUYsIDB4ODk0OCwgMHg5OTY5LCAweEE5MEEsIDB4QjkyQiwKKwkweDVBRjUsIDB4NEFENCwgMHg3QUI3LCAweDZBOTYsIDB4MUE3MSwgMHgwQTUwLCAweDNBMzMsIDB4MkExMiwKKwkweERCRkQsIDB4Q0JEQywgMHhGQkJGLCAweEVCOUUsIDB4OUI3OSwgMHg4QjU4LCAweEJCM0IsIDB4QUIxQSwKKwkweDZDQTYsIDB4N0M4NywgMHg0Q0U0LCAweDVDQzUsIDB4MkMyMiwgMHgzQzAzLCAweDBDNjAsIDB4MUM0MSwKKwkweEVEQUUsIDB4RkQ4RiwgMHhDREVDLCAweEREQ0QsIDB4QUQyQSwgMHhCRDBCLCAweDhENjgsIDB4OUQ0OSwKKwkweDdFOTcsIDB4NkVCNiwgMHg1RUQ1LCAweDRFRjQsIDB4M0UxMywgMHgyRTMyLCAweDFFNTEsIDB4MEU3MCwKKwkweEZGOUYsIDB4RUZCRSwgMHhERkRELCAweENGRkMsIDB4QkYxQiwgMHhBRjNBLCAweDlGNTksIDB4OEY3OCwKKwkweDkxODgsIDB4ODFBOSwgMHhCMUNBLCAweEExRUIsIDB4RDEwQywgMHhDMTJELCAweEYxNEUsIDB4RTE2RiwKKwkweDEwODAsIDB4MDBBMSwgMHgzMEMyLCAweDIwRTMsIDB4NTAwNCwgMHg0MDI1LCAweDcwNDYsIDB4NjA2NywKKwkweDgzQjksIDB4OTM5OCwgMHhBM0ZCLCAweEIzREEsIDB4QzMzRCwgMHhEMzFDLCAweEUzN0YsIDB4RjM1RSwKKwkweDAyQjEsIDB4MTI5MCwgMHgyMkYzLCAweDMyRDIsIDB4NDIzNSwgMHg1MjE0LCAweDYyNzcsIDB4NzI1NiwKKwkweEI1RUEsIDB4QTVDQiwgMHg5NUE4LCAweDg1ODksIDB4RjU2RSwgMHhFNTRGLCAweEQ1MkMsIDB4QzUwRCwKKwkweDM0RTIsIDB4MjRDMywgMHgxNEEwLCAweDA0ODEsIDB4NzQ2NiwgMHg2NDQ3LCAweDU0MjQsIDB4NDQwNSwKKwkweEE3REIsIDB4QjdGQSwgMHg4Nzk5LCAweDk3QjgsIDB4RTc1RiwgMHhGNzdFLCAweEM3MUQsIDB4RDczQywKKwkweDI2RDMsIDB4MzZGMiwgMHgwNjkxLCAweDE2QjAsIDB4NjY1NywgMHg3Njc2LCAweDQ2MTUsIDB4NTYzNCwKKwkweEQ5NEMsIDB4Qzk2RCwgMHhGOTBFLCAweEU5MkYsIDB4OTlDOCwgMHg4OUU5LCAweEI5OEEsIDB4QTlBQiwKKwkweDU4NDQsIDB4NDg2NSwgMHg3ODA2LCAweDY4MjcsIDB4MThDMCwgMHgwOEUxLCAweDM4ODIsIDB4MjhBMywKKwkweENCN0QsIDB4REI1QywgMHhFQjNGLCAweEZCMUUsIDB4OEJGOSwgMHg5QkQ4LCAweEFCQkIsIDB4QkI5QSwKKwkweDRBNzUsIDB4NUE1NCwgMHg2QTM3LCAweDdBMTYsIDB4MEFGMSwgMHgxQUQwLCAweDJBQjMsIDB4M0E5MiwKKwkweEZEMkUsIDB4RUQwRiwgMHhERDZDLCAweENENEQsIDB4QkRBQSwgMHhBRDhCLCAweDlERTgsIDB4OERDOSwKKwkweDdDMjYsIDB4NkMwNywgMHg1QzY0LCAweDRDNDUsIDB4M0NBMiwgMHgyQzgzLCAweDFDRTAsIDB4MENDMSwKKwkweEVGMUYsIDB4RkYzRSwgMHhDRjVELCAweERGN0MsIDB4QUY5QiwgMHhCRkJBLCAweDhGRDksIDB4OUZGOCwKKwkweDZFMTcsIDB4N0UzNiwgMHg0RTU1LCAweDVFNzQsIDB4MkU5MywgMHgzRUIyLCAweDBFRDEsIDB4MUVGMAorfTsKKyNkZWZpbmUgQnl0ZUNSQzE2KHYsIGNyYykgXAorCSh1bnNpZ25lZCBzaG9ydCkoKGNyYyA8PCA4KSBeICBjY2l0dF8xNlRhYmxlWygoY3JjID4+IDgpIF4gKHYpKSAmIDI1NV0pCisKKy8vCisvLyBCQlAgcmVnaXN0ZXIgaW5pdGlhbGl6YXRpb24gc2V0CisvLworUkVHX1BBSVIgICBCQlBSZWdUYWJsZVtdID0geworCXtCQlBfUjY1LAkJMHgyQ30sCQkvLyBmaXggcnNzaSBpc3N1ZQorCXtCQlBfUjY2LAkJMHgzOH0sCS8vIEFsc28gc2V0IHRoaXMgZGVmYXVsdCB2YWx1ZSB0byBwQWQtPkJicFR1bmluZy5SNjZDdXJyZW50VmFsdWUgYXQgaW5pdGlhbAorCXtCQlBfUjY5LAkJMHgxMn0sCisJe0JCUF9SNzAsCQkweGF9LAkvLyBCQlBfUjcwIHdpbGwgY2hhbmdlIHRvIDB4OCBpbiBBcFN0YXJ0VXAgYW5kIExpbmtVcCBmb3IgcnQyODYwQywgb3RoZXJ3aXNlIHZhbHVlIGlzIDB4YQorCXtCQlBfUjczLAkJMHgxMH0sCisJe0JCUF9SODEsCQkweDM3fSwKKwl7QkJQX1I4MiwJCTB4NjJ9LAorCXtCQlBfUjgzLAkJMHg2QX0sCisJe0JCUF9SODQsCQkweDk5fSwJLy8gMHgxOSBpcyBmb3IgcnQyODYwRSBhbmQgYWZ0ZXIuIFRoaXMgaXMgZm9yIGV4dGVuc2lvbiBjaGFubmVsIG92ZXJsYXBwaW5nIElPVC4gMHg5OSBpcyBmb3IgcnQyODYwRCBhbmQgYmVmb3JlCisJe0JCUF9SODYsCQkweDAwfSwJLy8gbWlkZGxlIHJhbmdlIGlzc3VlLCBSb3J5IEAyMDA4LTAxLTI4CisJe0JCUF9SOTEsCQkweDA0fSwJLy8gbWlkZGxlIHJhbmdlIGlzc3VlLCBSb3J5IEAyMDA4LTAxLTI4CisJe0JCUF9SOTIsCQkweDAwfSwJLy8gbWlkZGxlIHJhbmdlIGlzc3VlLCBSb3J5IEAyMDA4LTAxLTI4CisJe0JCUF9SMTAzLCAgCTB4MDB9LCAJLy8gbmVhciByYW5nZSBoaWdoLXBvd2VyIGlzc3VlLCByZXF1ZXN0ZWQgZnJvbSBHYXJ5IEAyMDA4LTA1MjgKKwl7QkJQX1IxMDUsCQkweDA1fSwJLy8gMHgwNSBpcyBmb3IgcnQyODYwRSB0byB0dXJuIG9uIEZFUSBjb250cm9sLiBJdCBpcyBzYWZlIGZvciBydDI4NjBEIGFuZCBiZWZvcmUsIGJlY2F1c2UgQml0IDc6MiBhcmUgcmVzZXJ2ZWQgaW4gcnQyODYwRCBhbmQgYmVmb3JlLgorfTsKKyNkZWZpbmUJTlVNX0JCUF9SRUdfUEFSTVMJKHNpemVvZihCQlBSZWdUYWJsZSkgLyBzaXplb2YoUkVHX1BBSVIpKQorCisvLworLy8gUkYgcmVnaXN0ZXIgaW5pdGlhbGl6YXRpb24gc2V0CisvLworCisvLworLy8gQVNJQyByZWdpc3RlciBpbml0aWFsaXphdGlvbiBzZXRzCisvLworCitSVE1QX1JFR19QQUlSCU1BQ1JlZ1RhYmxlW10gPQl7CisjaWYgZGVmaW5lZChIV19CRUFDT05fT0ZGU0VUKSAmJiAoSFdfQkVBQ09OX09GRlNFVCA9PSAweDIwMCkKKwl7QkNOX09GRlNFVDAsCQkJMHhmOGYwZThlMH0sIC8qIDB4MzgwMChlMCksIDB4M0EwMChlOCksIDB4M0MwMChmMCksIDB4M0UwMChmOCksIDUxMkIgZm9yIGVhY2ggYmVhY29uICovCisJe0JDTl9PRkZTRVQxLAkJCTB4NmY3N2QwYzh9LCAvKiAweDMyMDAoYzgpLCAweDM0MDAoZDApLCAweDFEQzAoNzcpLCAweDFCQzAoNmYpLCA1MTJCIGZvciBlYWNoIGJlYWNvbiAqLworI2VsaWYgZGVmaW5lZChIV19CRUFDT05fT0ZGU0VUKSAmJiAoSFdfQkVBQ09OX09GRlNFVCA9PSAweDEwMCkKKwl7QkNOX09GRlNFVDAsCQkJMHhlY2U4ZTRlMH0sIC8qIDB4MzgwMCwgMHgzQTAwLCAweDNDMDAsIDB4M0UwMCwgNTEyQiBmb3IgZWFjaCBiZWFjb24gKi8KKwl7QkNOX09GRlNFVDEsCQkJMHhmY2Y4ZjRmMH0sIC8qIDB4MzgwMCwgMHgzQTAwLCAweDNDMDAsIDB4M0UwMCwgNTEyQiBmb3IgZWFjaCBiZWFjb24gKi8KKyNlbHNlCisgICAgI2Vycm9yIFlvdSBtdXN0IHJlLWNhbGN1bGF0ZSBuZXcgdmFsdWUgZm9yIEJDTl9PRkZTRVQwICYgQkNOX09GRlNFVDEgaW4gTUFDUmVnVGFibGVbXSEhIQorI2VuZGlmIC8vIEhXX0JFQUNPTl9PRkZTRVQgLy8KKworCXtMRUdBQ1lfQkFTSUNfUkFURSwJCTB4MDAwMDAxM2Z9LCAvLyAgQmFzaWMgcmF0ZSBzZXQgYml0bWFwCisJe0hUX0JBU0lDX1JBVEUsCQkweDAwMDA4MDAzfSwgLy8gQmFzaWMgSFQgcmF0ZSBzZXQgLCAyME0sIE1DUz0zLCBNTS4gRm9ybWF0IGlzIHRoZSBzYW1lIGFzIGluIFRYV0kuCisJe01BQ19TWVNfQ1RSTCwJCTB4MDB9LCAvLyAweDEwMDQsICwgZGVmYXVsdCBEaXNhYmxlIFJYCisJe1JYX0ZJTFRSX0NGRywJCTB4MTdmOTd9LCAvLzB4MTQwMCAgLCBSWCBmaWx0ZXIgY29udHJvbCwKKwl7QktPRkZfU0xPVF9DRkcsCTB4MjA5fSwgLy8gZGVmYXVsdCBzZXQgc2hvcnQgc2xvdCB0aW1lLCBDQ19ERUxBWV9USU1FIHNob3VsZCBiZSAyCisJe1RYX1NXX0NGRzAsCQkweDB9LCAJCS8vIEdhcnksMjAwOC0wNS0yMSBmb3IgQ1dDIHRlc3QKKwl7VFhfU1dfQ0ZHMSwJCTB4ODA2MDZ9LCAvLyBHYXJ5LDIwMDYtMDgtMjMKKwl7VFhfTElOS19DRkcsCQkweDEwMjB9LAkJLy8gR2FyeSwyMDA2LTA4LTIzCisJe1RYX1RJTUVPVVRfQ0ZHLAkweDAwMGEyMDkwfSwJLy8gQ0NLIGhhcyBzb21lIHByb2JsZW0uIFNvIGluY3JlYXNlIHRpbWllb3V0IHZhbHVlLiAyMDA2LTEwLTA5Ly8gTUFydmVrIFJUICwgTW9kaWZ5IGZvciAyODYwRSAsMjAwNy0wOC0wMQorCXtNQVhfTEVOX0NGRywJCU1BWF9BR0dSRUdBVElPTl9TSVpFIHwgMHgwMDAwMTAwMH0sCS8vIDB4MzAxOCwgTUFYIGZyYW1lIGxlbmd0aC4gTWF4IFBTRFUgPSAxNmtieXRlcy4KKwl7TEVEX0NGRywJCTB4N2YwMzFlNDZ9LCAvLyBHYXJ5LCAyMDA2LTA4LTIzCisJe1BCRl9NQVhfUENOVCwJCQkweDFGM0ZCRjlGfSwgCS8vMHgxRjNmN2Y5Zn0sCQkvL0phbiwgMjAwNi8wNC8yMAorCXtUWF9SVFlfQ0ZHLAkJCTB4NDdkMDFmMGZ9LAkvLyBKYW4sIDIwMDYvMTEvMTYsIFNldCBUeFdJLT5BQ0sgPTAgaW4gUHJvYmUgUnNwIE1vZGlmeSBmb3IgMjg2MEUgLDIwMDctMDgtMDMKKwl7QVVUT19SU1BfQ0ZHLAkJCTB4MDAwMDAwMTN9LAkvLyBJbml0aWFsIEF1dG9fUmVzcG9uZGVyLCBiZWNhdXNlIFFBIHdpbGwgdHVybiBvZmYgQXV0by1SZXNwb25kZXIKKwl7Q0NLX1BST1RfQ0ZHLAkJCTB4MDU3NDAwMDMgLyoweDAxNzQwMDAzKi99LAkvLyBJbml0aWFsIEF1dG9fUmVzcG9uZGVyLCBiZWNhdXNlIFFBIHdpbGwgdHVybiBvZmYgQXV0by1SZXNwb25kZXIuIEFuZCBSVFMgdGhyZXNob2xkIGlzIGVuYWJsZWQuCisJe09GRE1fUFJPVF9DRkcsCQkJMHgwNTc0MDAwMyAvKjB4MDE3NDAwMDMqL30sCS8vIEluaXRpYWwgQXV0b19SZXNwb25kZXIsIGJlY2F1c2UgUUEgd2lsbCB0dXJuIG9mZiBBdXRvLVJlc3BvbmRlci4gQW5kIFJUUyB0aHJlc2hvbGQgaXMgZW5hYmxlZC4KKwl7R0YyMF9QUk9UX0NGRywJCQkweDAxNzQ0MDA0fSwgICAgLy8gc2V0IDE5OjE4IC0tPiBTaG9ydCBOQVYgZm9yIE1JTU8gUFMKKwl7R0Y0MF9QUk9UX0NGRywJCQkweDAzRjQ0MDg0fSwKKwl7TU0yMF9QUk9UX0NGRywJCQkweDAxNzQ0MDA0fSwKKyNpZmRlZiBSVDI4NjAKKwl7TU00MF9QUk9UX0NGRywJCQkweDAzRjU0MDg0fSwKKyNlbmRpZiAvLyBSVDI4NjAgLy8KKwl7VFhPUF9DVFJMX0NGRywJCQkweDAwMDA1ODNmLCAvKjB4MDAwMDI0M2YqLyAvKjB4MDAwMDI0YmYqL30sCS8vRXh0ZW5zaW9uIGNoYW5uZWwgYmFja29mZi4KKwl7VFhfUlRTX0NGRywJCQkweDAwMDkyYjIwfSwKKwl7RVhQX0FDS19USU1FLAkJCTB4MDAyNDAwY2F9LAkvLyBkZWZhdWx0IHZhbHVlCisJe1RYT1BfSExEUl9FVCwgCQkJMHgwMDAwMDAwMn0sCisKKwkvKiBKZXJyeSBjb21tZW50cyAyMDA4LzAxLzE2OiB3ZSB1c2UgU0lGUyA9IDEwdXMgaW4gQ0NLIGRlZmF1bHRseSwgYnV0IGl0IHNlZW1zIHRoYXQgMTB1cworCQlpcyB0b28gc21hbGwgZm9yIElOVEVMIDIyMDBiZyBjYXJkLCBzbyBpbiBNQlNTIG1vZGUsIHRoZSBkZWx0YSB0aW1lIGJldHdlZW4gYmVhY29uMAorCQlhbmQgYmVhY29uMSBpcyBTSUZTICgxMHVzKSwgc28gaWYgSU5URUwgMjIwMGJnIGNhcmQgY29ubmVjdHMgdG8gQlNTMCwgdGhlIHBpbmcKKwkJd2lsbCBhbHdheXMgbG9zdC4gU28gd2UgY2hhbmdlIHRoZSBTSUZTIG9mIENDSyBmcm9tIDEwdXMgdG8gMTZ1cy4gKi8KKwl7WElGU19USU1FX0NGRywJCQkweDMzYTQxMDEwfSwKKwl7UFdSX1BJTl9DRkcsCQkJMHgwMDAwMDAwM30sCS8vIHBhdGNoIGZvciAyODgwLUUKK307CisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorUlRNUF9SRUdfUEFJUglTVEFNQUNSZWdUYWJsZVtdID0JeworCXtXTU1fQUlGU05fQ0ZHLAkJMHgwMDAwMjI3M30sCisJe1dNTV9DV01JTl9DRkcsCTB4MDAwMDIzNDR9LAorCXtXTU1fQ1dNQVhfQ0ZHLAkweDAwMDAzNGFhfSwKK307CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKyNkZWZpbmUJTlVNX01BQ19SRUdfUEFSTVMJCShzaXplb2YoTUFDUmVnVGFibGUpIC8gc2l6ZW9mKFJUTVBfUkVHX1BBSVIpKQorI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorI2RlZmluZQlOVU1fU1RBX01BQ19SRUdfUEFSTVMJKHNpemVvZihTVEFNQUNSZWdUYWJsZSkgLyBzaXplb2YoUlRNUF9SRUdfUEFJUikpCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKworLy8gTmV3IDhrIGJ5dGUgZmlybXdhcmUgc2l6ZSBmb3IgUlQzMDcxL1JUMzA3MgorI2RlZmluZSBGSVJNV0FSRUlNQUdFX01BWF9MRU5HVEgJMHgyMDAwCisjZGVmaW5lIEZJUk1XQVJFSU1BR0VfTEVOR1RICQkoc2l6ZW9mIChGaXJtd2FyZUltYWdlKSAvIHNpemVvZihVQ0hBUikpCisjZGVmaW5lIEZJUk1XQVJFX01BSk9SX1ZFUlNJT04JMAorCisjZGVmaW5lIEZJUk1XQVJFSU1BR0VWMV9MRU5HVEgJMHgxMDAwCisjZGVmaW5lIEZJUk1XQVJFSU1BR0VWMl9MRU5HVEgJMHgxMDAwCisKKyNpZmRlZiBSVDI4NjAKKyNkZWZpbmUgRklSTVdBUkVfTUlOT1JfVkVSU0lPTgkyCisjZW5kaWYgLy8gUlQyODYwIC8vCisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCUFsbG9jYXRlIFJUTVBfQURBUFRFUiBkYXRhIGJsb2NrIGFuZCBkbyBzb21lIGluaXRpYWxpemF0aW9uCisKKwlBcmd1bWVudHM6CisJCUFkYXB0ZXIJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKworCVJldHVybiBWYWx1ZToKKwkJTkRJU19TVEFUVVNfU1VDQ0VTUworCQlORElTX1NUQVRVU19GQUlMVVJFCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK05ESVNfU1RBVFVTCVJUTVBBbGxvY0FkYXB0ZXJCbG9jaygKKwlJTiAgUFZPSUQJaGFuZGxlLAorCU9VVAlQUlRNUF9BREFQVEVSCSpwcEFkYXB0ZXIpCit7CisJUFJUTVBfQURBUFRFUglwQWQ7CisJTkRJU19TVEFUVVMJCVN0YXR1czsKKwlJTlQgCQkJaW5kZXg7CisJVUNIQVIJCQkqcEJlYWNvbkJ1ZiA9IE5VTEw7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLT4gUlRNUEFsbG9jQWRhcHRlckJsb2NrXG4iKSk7CisKKwkqcHBBZGFwdGVyID0gTlVMTDsKKworCWRvCisJeworCQkvLyBBbGxvY2F0ZSBSVE1QX0FEQVBURVIgbWVtb3J5IGJsb2NrCisJCXBCZWFjb25CdWYgPSBrbWFsbG9jKE1BWF9CRUFDT05fU0laRSwgTUVNX0FMTE9DX0ZMQUcpOworCQlpZiAocEJlYWNvbkJ1ZiA9PSBOVUxMKQorCQl7CisJCQlTdGF0dXMgPSBORElTX1NUQVRVU19GQUlMVVJFOworCQkJREJHUFJJTlRfRVJSKCgiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSAtIEJlYWNvbkJ1ZiFcbiIpKTsKKwkJCWJyZWFrOworCQl9CisKKwkJU3RhdHVzID0gQWRhcHRlckJsb2NrQWxsb2NhdGVNZW1vcnkoaGFuZGxlLCAoUFZPSUQgKikmcEFkKTsKKwkJaWYgKFN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCQl7CisJCQlEQkdQUklOVF9FUlIoKCJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IC0gQURBUFRFUlxuIikpOworCQkJYnJlYWs7CisJCX0KKwkJcEFkLT5CZWFjb25CdWYgPSBwQmVhY29uQnVmOworCQlwcmludGsoIlxuXG49PT0gcEFkID0gJXAsIHNpemUgPSAlZCA9PT1cblxuIiwgcEFkLCAoVUlOVDMyKXNpemVvZihSVE1QX0FEQVBURVIpKTsKKworCisJCS8vIEluaXQgc3BpbiBsb2NrcworCQlOZGlzQWxsb2NhdGVTcGluTG9jaygmcEFkLT5NZ210UmluZ0xvY2spOworI2lmZGVmIFJUMjg2MAorCQlOZGlzQWxsb2NhdGVTcGluTG9jaygmcEFkLT5SeFJpbmdMb2NrKTsKKyNlbmRpZiAvLyBSVDI4NjAgLy8KKworCQlmb3IgKGluZGV4ID0wIDsgaW5kZXggPCBOVU1fT0ZfVFhfUklORzsgaW5kZXgrKykKKwkJeworCQkJTmRpc0FsbG9jYXRlU3BpbkxvY2soJnBBZC0+VHhTd1F1ZXVlTG9ja1tpbmRleF0pOworCQkJTmRpc0FsbG9jYXRlU3BpbkxvY2soJnBBZC0+RGVRdWV1ZUxvY2tbaW5kZXhdKTsKKwkJCXBBZC0+RGVRdWV1ZVJ1bm5pbmdbaW5kZXhdID0gRkFMU0U7CisJCX0KKworCQlOZGlzQWxsb2NhdGVTcGluTG9jaygmcEFkLT5pcnFfbG9jayk7CisKKwl9IHdoaWxlIChGQUxTRSk7CisKKwlpZiAoKFN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKSAmJiAocEJlYWNvbkJ1ZikpCisJCWtmcmVlKHBCZWFjb25CdWYpOworCisJKnBwQWRhcHRlciA9IHBBZDsKKworCURCR1BSSU5UX1MoU3RhdHVzLCAoIjwtLSBSVE1QQWxsb2NBZGFwdGVyQmxvY2ssIFN0YXR1cz0leFxuIiwgU3RhdHVzKSk7CisJcmV0dXJuIFN0YXR1czsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVJlYWQgaW5pdGlhbCBUeCBwb3dlciBwZXIgTUNTIGFuZCBCVyBmcm9tIEVFUFJPTQorCisJQXJndW1lbnRzOgorCQlBZGFwdGVyCQkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJUlRNUFJlYWRUeFB3clBlclJhdGUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQpCit7CisJVUxPTkcJCWRhdGEsIEFkYXRhLCBHZGF0YTsKKwlVU0hPUlQJCWksIHZhbHVlLCB2YWx1ZTI7CisJSU5UCQkJQXB3cmRlbHRhLCBHcHdyZGVsdGE7CisJVUNIQVIJCXQxLHQyLHQzLHQ0OworCUJPT0xFQU4JCWJWYWxpZCwgYkFwd3JkZWx0YU1pbnVzID0gVFJVRSwgYkdwd3JkZWx0YU1pbnVzID0gVFJVRTsKKworCS8vCisJLy8gR2V0IHBvd2VyIGRlbHRhIGZvciAyME1IeiBhbmQgNDBNSHouCisJLy8KKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJUeHBvd2VyIHBlciBSYXRlXG4iKSk7CisJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fVFhQT1dFUl9ERUxUQSwgdmFsdWUyKTsKKwlBcHdyZGVsdGEgPSAwOworCUdwd3JkZWx0YSA9IDA7CisKKwlpZiAoKHZhbHVlMiAmIDB4ZmYpICE9IDB4ZmYpCisJeworCQlpZiAoKHZhbHVlMiAmIDB4ODApKQorCQkJR3B3cmRlbHRhID0gKHZhbHVlMiYweGYpOworCisJCWlmICgodmFsdWUyICYgMHg0MCkpCisJCQliR3B3cmRlbHRhTWludXMgPSBGQUxTRTsKKwkJZWxzZQorCQkJYkdwd3JkZWx0YU1pbnVzID0gVFJVRTsKKwl9CisJaWYgKCh2YWx1ZTIgJiAweGZmMDApICE9IDB4ZmYwMCkKKwl7CisJCWlmICgodmFsdWUyICYgMHg4MDAwKSkKKwkJCUFwd3JkZWx0YSA9ICgodmFsdWUyJjB4ZjAwKT4+OCk7CisKKwkJaWYgKCh2YWx1ZTIgJiAweDQwMDApKQorCQkJYkFwd3JkZWx0YU1pbnVzID0gRkFMU0U7CisJCWVsc2UKKwkJCWJBcHdyZGVsdGFNaW51cyA9IFRSVUU7CisJfQorCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkdwd3JkZWx0YSA9ICV4LCBBcHdyZGVsdGEgPSAleCAuXG4iLCBHcHdyZGVsdGEsIEFwd3JkZWx0YSkpOworCisJLy8KKwkvLyBHZXQgVHhwb3dlciBwZXIgTUNTIGZvciAyME1IeiBpbiAyLjRHLgorCS8vCisJZm9yIChpPTA7IGk8NTsgaSsrKQorCXsKKwkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fVFhQT1dFUl9CWVJBVEVfMjBNSFpfMl80RyArIGkqNCwgdmFsdWUpOworCQlkYXRhID0gdmFsdWU7CisJCWlmIChiQXB3cmRlbHRhTWludXMgPT0gRkFMU0UpCisJCXsKKwkJCXQxID0gKHZhbHVlJjB4ZikrKEFwd3JkZWx0YSk7CisJCQlpZiAodDEgPiAweGYpCisJCQkJdDEgPSAweGY7CisJCQl0MiA9ICgodmFsdWUmMHhmMCk+PjQpKyhBcHdyZGVsdGEpOworCQkJaWYgKHQyID4gMHhmKQorCQkJCXQyID0gMHhmOworCQkJdDMgPSAoKHZhbHVlJjB4ZjAwKT4+OCkrKEFwd3JkZWx0YSk7CisJCQlpZiAodDMgPiAweGYpCisJCQkJdDMgPSAweGY7CisJCQl0NCA9ICgodmFsdWUmMHhmMDAwKT4+MTIpKyhBcHdyZGVsdGEpOworCQkJaWYgKHQ0ID4gMHhmKQorCQkJCXQ0ID0gMHhmOworCQl9CisJCWVsc2UKKwkJeworCQkJaWYgKCh2YWx1ZSYweGYpID4gQXB3cmRlbHRhKQorCQkJCXQxID0gKHZhbHVlJjB4ZiktKEFwd3JkZWx0YSk7CisJCQllbHNlCisJCQkJdDEgPSAwOworCQkJaWYgKCgodmFsdWUmMHhmMCk+PjQpID4gQXB3cmRlbHRhKQorCQkJCXQyID0gKCh2YWx1ZSYweGYwKT4+NCktKEFwd3JkZWx0YSk7CisJCQllbHNlCisJCQkJdDIgPSAwOworCQkJaWYgKCgodmFsdWUmMHhmMDApPj44KSA+IEFwd3JkZWx0YSkKKwkJCQl0MyA9ICgodmFsdWUmMHhmMDApPj44KS0oQXB3cmRlbHRhKTsKKwkJCWVsc2UKKwkJCQl0MyA9IDA7CisJCQlpZiAoKCh2YWx1ZSYweGYwMDApPj4xMikgPiBBcHdyZGVsdGEpCisJCQkJdDQgPSAoKHZhbHVlJjB4ZjAwMCk+PjEyKS0oQXB3cmRlbHRhKTsKKwkJCWVsc2UKKwkJCQl0NCA9IDA7CisJCX0KKwkJQWRhdGEgPSB0MSArICh0Mjw8NCkgKyAodDM8PDgpICsgKHQ0PDwxMik7CisJCWlmIChiR3B3cmRlbHRhTWludXMgPT0gRkFMU0UpCisJCXsKKwkJCXQxID0gKHZhbHVlJjB4ZikrKEdwd3JkZWx0YSk7CisJCQlpZiAodDEgPiAweGYpCisJCQkJdDEgPSAweGY7CisJCQl0MiA9ICgodmFsdWUmMHhmMCk+PjQpKyhHcHdyZGVsdGEpOworCQkJaWYgKHQyID4gMHhmKQorCQkJCXQyID0gMHhmOworCQkJdDMgPSAoKHZhbHVlJjB4ZjAwKT4+OCkrKEdwd3JkZWx0YSk7CisJCQlpZiAodDMgPiAweGYpCisJCQkJdDMgPSAweGY7CisJCQl0NCA9ICgodmFsdWUmMHhmMDAwKT4+MTIpKyhHcHdyZGVsdGEpOworCQkJaWYgKHQ0ID4gMHhmKQorCQkJCXQ0ID0gMHhmOworCQl9CisJCWVsc2UKKwkJeworCQkJaWYgKCh2YWx1ZSYweGYpID4gR3B3cmRlbHRhKQorCQkJCXQxID0gKHZhbHVlJjB4ZiktKEdwd3JkZWx0YSk7CisJCQllbHNlCisJCQkJdDEgPSAwOworCQkJaWYgKCgodmFsdWUmMHhmMCk+PjQpID4gR3B3cmRlbHRhKQorCQkJCXQyID0gKCh2YWx1ZSYweGYwKT4+NCktKEdwd3JkZWx0YSk7CisJCQllbHNlCisJCQkJdDIgPSAwOworCQkJaWYgKCgodmFsdWUmMHhmMDApPj44KSA+IEdwd3JkZWx0YSkKKwkJCQl0MyA9ICgodmFsdWUmMHhmMDApPj44KS0oR3B3cmRlbHRhKTsKKwkJCWVsc2UKKwkJCQl0MyA9IDA7CisJCQlpZiAoKCh2YWx1ZSYweGYwMDApPj4xMikgPiBHcHdyZGVsdGEpCisJCQkJdDQgPSAoKHZhbHVlJjB4ZjAwMCk+PjEyKS0oR3B3cmRlbHRhKTsKKwkJCWVsc2UKKwkJCQl0NCA9IDA7CisJCX0KKwkJR2RhdGEgPSB0MSArICh0Mjw8NCkgKyAodDM8PDgpICsgKHQ0PDwxMik7CisKKwkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fVFhQT1dFUl9CWVJBVEVfMjBNSFpfMl80RyArIGkqNCArIDIsIHZhbHVlKTsKKwkJaWYgKGJBcHdyZGVsdGFNaW51cyA9PSBGQUxTRSkKKwkJeworCQkJdDEgPSAodmFsdWUmMHhmKSsoQXB3cmRlbHRhKTsKKwkJCWlmICh0MSA+IDB4ZikKKwkJCQl0MSA9IDB4ZjsKKwkJCXQyID0gKCh2YWx1ZSYweGYwKT4+NCkrKEFwd3JkZWx0YSk7CisJCQlpZiAodDIgPiAweGYpCisJCQkJdDIgPSAweGY7CisJCQl0MyA9ICgodmFsdWUmMHhmMDApPj44KSsoQXB3cmRlbHRhKTsKKwkJCWlmICh0MyA+IDB4ZikKKwkJCQl0MyA9IDB4ZjsKKwkJCXQ0ID0gKCh2YWx1ZSYweGYwMDApPj4xMikrKEFwd3JkZWx0YSk7CisJCQlpZiAodDQgPiAweGYpCisJCQkJdDQgPSAweGY7CisJCX0KKwkJZWxzZQorCQl7CisJCQlpZiAoKHZhbHVlJjB4ZikgPiBBcHdyZGVsdGEpCisJCQkJdDEgPSAodmFsdWUmMHhmKS0oQXB3cmRlbHRhKTsKKwkJCWVsc2UKKwkJCQl0MSA9IDA7CisJCQlpZiAoKCh2YWx1ZSYweGYwKT4+NCkgPiBBcHdyZGVsdGEpCisJCQkJdDIgPSAoKHZhbHVlJjB4ZjApPj40KS0oQXB3cmRlbHRhKTsKKwkJCWVsc2UKKwkJCQl0MiA9IDA7CisJCQlpZiAoKCh2YWx1ZSYweGYwMCk+PjgpID4gQXB3cmRlbHRhKQorCQkJCXQzID0gKCh2YWx1ZSYweGYwMCk+PjgpLShBcHdyZGVsdGEpOworCQkJZWxzZQorCQkJCXQzID0gMDsKKwkJCWlmICgoKHZhbHVlJjB4ZjAwMCk+PjEyKSA+IEFwd3JkZWx0YSkKKwkJCQl0NCA9ICgodmFsdWUmMHhmMDAwKT4+MTIpLShBcHdyZGVsdGEpOworCQkJZWxzZQorCQkJCXQ0ID0gMDsKKwkJfQorCQlBZGF0YSB8PSAoKHQxPDwxNikgKyAodDI8PDIwKSArICh0Mzw8MjQpICsgKHQ0PDwyOCkpOworCQlpZiAoYkdwd3JkZWx0YU1pbnVzID09IEZBTFNFKQorCQl7CisJCQl0MSA9ICh2YWx1ZSYweGYpKyhHcHdyZGVsdGEpOworCQkJaWYgKHQxID4gMHhmKQorCQkJCXQxID0gMHhmOworCQkJdDIgPSAoKHZhbHVlJjB4ZjApPj40KSsoR3B3cmRlbHRhKTsKKwkJCWlmICh0MiA+IDB4ZikKKwkJCQl0MiA9IDB4ZjsKKwkJCXQzID0gKCh2YWx1ZSYweGYwMCk+PjgpKyhHcHdyZGVsdGEpOworCQkJaWYgKHQzID4gMHhmKQorCQkJCXQzID0gMHhmOworCQkJdDQgPSAoKHZhbHVlJjB4ZjAwMCk+PjEyKSsoR3B3cmRlbHRhKTsKKwkJCWlmICh0NCA+IDB4ZikKKwkJCQl0NCA9IDB4ZjsKKwkJfQorCQllbHNlCisJCXsKKwkJCWlmICgodmFsdWUmMHhmKSA+IEdwd3JkZWx0YSkKKwkJCQl0MSA9ICh2YWx1ZSYweGYpLShHcHdyZGVsdGEpOworCQkJZWxzZQorCQkJCXQxID0gMDsKKwkJCWlmICgoKHZhbHVlJjB4ZjApPj40KSA+IEdwd3JkZWx0YSkKKwkJCQl0MiA9ICgodmFsdWUmMHhmMCk+PjQpLShHcHdyZGVsdGEpOworCQkJZWxzZQorCQkJCXQyID0gMDsKKwkJCWlmICgoKHZhbHVlJjB4ZjAwKT4+OCkgPiBHcHdyZGVsdGEpCisJCQkJdDMgPSAoKHZhbHVlJjB4ZjAwKT4+OCktKEdwd3JkZWx0YSk7CisJCQllbHNlCisJCQkJdDMgPSAwOworCQkJaWYgKCgodmFsdWUmMHhmMDAwKT4+MTIpID4gR3B3cmRlbHRhKQorCQkJCXQ0ID0gKCh2YWx1ZSYweGYwMDApPj4xMiktKEdwd3JkZWx0YSk7CisJCQllbHNlCisJCQkJdDQgPSAwOworCQl9CisJCUdkYXRhIHw9ICgodDE8PDE2KSArICh0Mjw8MjApICsgKHQzPDwyNCkgKyAodDQ8PDI4KSk7CisJCWRhdGEgfD0gKHZhbHVlPDwxNik7CisKKwkJcEFkLT5UeDIwTVB3ckNmZ0FCYW5kW2ldID0gcEFkLT5UeDQwTVB3ckNmZ0FCYW5kW2ldID0gQWRhdGE7CisJCXBBZC0+VHgyME1Qd3JDZmdHQmFuZFtpXSA9IHBBZC0+VHg0ME1Qd3JDZmdHQmFuZFtpXSA9IEdkYXRhOworCisJCWlmIChkYXRhICE9IDB4ZmZmZmZmZmYpCisJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9QV1JfQ0ZHXzAgKyBpKjQsIGRhdGEpOworCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiMjBNSHogQlcsIDIuNEcgYmFuZC0lbHgsICBBZGF0YSA9ICVseCwgIEdkYXRhID0gJWx4IFxuIiwgZGF0YSwgQWRhdGEsIEdkYXRhKSk7CisJfQorCisJLy8KKwkvLyBDaGVjayB0aGlzIGJsb2NrIGlzIHZhbGlkIGZvciA0ME1IeiBpbiAyLjRHLiBJZiBpbnZhbGlkLCB1c2UgcGFyYW1ldGVyIGZvciAyME1IeiBpbiAyLjRHCisJLy8KKwliVmFsaWQgPSBUUlVFOworCWZvciAoaT0wOyBpPDY7IGkrKykKKwl7CisJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX1RYUE9XRVJfQllSQVRFXzQwTUhaXzJfNEcgKyAyICsgaSoyLCB2YWx1ZSk7CisJCWlmICgoKHZhbHVlICYgMHgwMEZGKSA9PSAweDAwRkYpIHx8ICgodmFsdWUgJiAweEZGMDApID09IDB4RkYwMCkpCisJCXsKKwkJCWJWYWxpZCA9IEZBTFNFOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvLworCS8vIEdldCBUeHBvd2VyIHBlciBNQ1MgZm9yIDQwTUh6IGluIDIuNEcuCisJLy8KKwlpZiAoYlZhbGlkKQorCXsKKwkJZm9yIChpPTA7IGk8NDsgaSsrKQorCQl7CisJCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9UWFBPV0VSX0JZUkFURV80ME1IWl8yXzRHICsgaSo0LCB2YWx1ZSk7CisJCQlpZiAoYkdwd3JkZWx0YU1pbnVzID09IEZBTFNFKQorCQkJeworCQkJCXQxID0gKHZhbHVlJjB4ZikrKEdwd3JkZWx0YSk7CisJCQkJaWYgKHQxID4gMHhmKQorCQkJCQl0MSA9IDB4ZjsKKwkJCQl0MiA9ICgodmFsdWUmMHhmMCk+PjQpKyhHcHdyZGVsdGEpOworCQkJCWlmICh0MiA+IDB4ZikKKwkJCQkJdDIgPSAweGY7CisJCQkJdDMgPSAoKHZhbHVlJjB4ZjAwKT4+OCkrKEdwd3JkZWx0YSk7CisJCQkJaWYgKHQzID4gMHhmKQorCQkJCQl0MyA9IDB4ZjsKKwkJCQl0NCA9ICgodmFsdWUmMHhmMDAwKT4+MTIpKyhHcHdyZGVsdGEpOworCQkJCWlmICh0NCA+IDB4ZikKKwkJCQkJdDQgPSAweGY7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJaWYgKCh2YWx1ZSYweGYpID4gR3B3cmRlbHRhKQorCQkJCQl0MSA9ICh2YWx1ZSYweGYpLShHcHdyZGVsdGEpOworCQkJCWVsc2UKKwkJCQkJdDEgPSAwOworCQkJCWlmICgoKHZhbHVlJjB4ZjApPj40KSA+IEdwd3JkZWx0YSkKKwkJCQkJdDIgPSAoKHZhbHVlJjB4ZjApPj40KS0oR3B3cmRlbHRhKTsKKwkJCQllbHNlCisJCQkJCXQyID0gMDsKKwkJCQlpZiAoKCh2YWx1ZSYweGYwMCk+PjgpID4gR3B3cmRlbHRhKQorCQkJCQl0MyA9ICgodmFsdWUmMHhmMDApPj44KS0oR3B3cmRlbHRhKTsKKwkJCQllbHNlCisJCQkJCXQzID0gMDsKKwkJCQlpZiAoKCh2YWx1ZSYweGYwMDApPj4xMikgPiBHcHdyZGVsdGEpCisJCQkJCXQ0ID0gKCh2YWx1ZSYweGYwMDApPj4xMiktKEdwd3JkZWx0YSk7CisJCQkJZWxzZQorCQkJCQl0NCA9IDA7CisJCQl9CisJCQlHZGF0YSA9IHQxICsgKHQyPDw0KSArICh0Mzw8OCkgKyAodDQ8PDEyKTsKKworCQkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fVFhQT1dFUl9CWVJBVEVfNDBNSFpfMl80RyArIGkqNCArIDIsIHZhbHVlKTsKKwkJCWlmIChiR3B3cmRlbHRhTWludXMgPT0gRkFMU0UpCisJCQl7CisJCQkJdDEgPSAodmFsdWUmMHhmKSsoR3B3cmRlbHRhKTsKKwkJCQlpZiAodDEgPiAweGYpCisJCQkJCXQxID0gMHhmOworCQkJCXQyID0gKCh2YWx1ZSYweGYwKT4+NCkrKEdwd3JkZWx0YSk7CisJCQkJaWYgKHQyID4gMHhmKQorCQkJCQl0MiA9IDB4ZjsKKwkJCQl0MyA9ICgodmFsdWUmMHhmMDApPj44KSsoR3B3cmRlbHRhKTsKKwkJCQlpZiAodDMgPiAweGYpCisJCQkJCXQzID0gMHhmOworCQkJCXQ0ID0gKCh2YWx1ZSYweGYwMDApPj4xMikrKEdwd3JkZWx0YSk7CisJCQkJaWYgKHQ0ID4gMHhmKQorCQkJCQl0NCA9IDB4ZjsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlpZiAoKHZhbHVlJjB4ZikgPiBHcHdyZGVsdGEpCisJCQkJCXQxID0gKHZhbHVlJjB4ZiktKEdwd3JkZWx0YSk7CisJCQkJZWxzZQorCQkJCQl0MSA9IDA7CisJCQkJaWYgKCgodmFsdWUmMHhmMCk+PjQpID4gR3B3cmRlbHRhKQorCQkJCQl0MiA9ICgodmFsdWUmMHhmMCk+PjQpLShHcHdyZGVsdGEpOworCQkJCWVsc2UKKwkJCQkJdDIgPSAwOworCQkJCWlmICgoKHZhbHVlJjB4ZjAwKT4+OCkgPiBHcHdyZGVsdGEpCisJCQkJCXQzID0gKCh2YWx1ZSYweGYwMCk+PjgpLShHcHdyZGVsdGEpOworCQkJCWVsc2UKKwkJCQkJdDMgPSAwOworCQkJCWlmICgoKHZhbHVlJjB4ZjAwMCk+PjEyKSA+IEdwd3JkZWx0YSkKKwkJCQkJdDQgPSAoKHZhbHVlJjB4ZjAwMCk+PjEyKS0oR3B3cmRlbHRhKTsKKwkJCQllbHNlCisJCQkJCXQ0ID0gMDsKKwkJCX0KKwkJCUdkYXRhIHw9ICgodDE8PDE2KSArICh0Mjw8MjApICsgKHQzPDwyNCkgKyAodDQ8PDI4KSk7CisKKwkJCWlmIChpID09IDApCisJCQkJcEFkLT5UeDQwTVB3ckNmZ0dCYW5kW2krMV0gPSAocEFkLT5UeDQwTVB3ckNmZ0dCYW5kW2krMV0gJiAweDAwMDBGRkZGKSB8IChHZGF0YSAmIDB4RkZGRjAwMDApOworCQkJZWxzZQorCQkJCXBBZC0+VHg0ME1Qd3JDZmdHQmFuZFtpKzFdID0gR2RhdGE7CisKKwkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCI0ME1IeiBCVywgMi40RyBiYW5kLCBHZGF0YSA9ICVseCBcbiIsIEdkYXRhKSk7CisJCX0KKwl9CisKKwkvLworCS8vIENoZWNrIHRoaXMgYmxvY2sgaXMgdmFsaWQgZm9yIDIwTUh6IGluIDVHLiBJZiBpbnZhbGlkLCB1c2UgcGFyYW1ldGVyIGZvciAyME1IeiBpbiAyLjRHCisJLy8KKwliVmFsaWQgPSBUUlVFOworCWZvciAoaT0wOyBpPDg7IGkrKykKKwl7CisJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX1RYUE9XRVJfQllSQVRFXzIwTUhaXzVHICsgMiArIGkqMiwgdmFsdWUpOworCQlpZiAoKCh2YWx1ZSAmIDB4MDBGRikgPT0gMHgwMEZGKSB8fCAoKHZhbHVlICYgMHhGRjAwKSA9PSAweEZGMDApKQorCQl7CisJCQliVmFsaWQgPSBGQUxTRTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJLy8KKwkvLyBHZXQgVHhwb3dlciBwZXIgTUNTIGZvciAyME1IeiBpbiA1Ry4KKwkvLworCWlmIChiVmFsaWQpCisJeworCQlmb3IgKGk9MDsgaTw1OyBpKyspCisJCXsKKwkJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX1RYUE9XRVJfQllSQVRFXzIwTUhaXzVHICsgaSo0LCB2YWx1ZSk7CisJCQlpZiAoYkFwd3JkZWx0YU1pbnVzID09IEZBTFNFKQorCQkJeworCQkJCXQxID0gKHZhbHVlJjB4ZikrKEFwd3JkZWx0YSk7CisJCQkJaWYgKHQxID4gMHhmKQorCQkJCQl0MSA9IDB4ZjsKKwkJCQl0MiA9ICgodmFsdWUmMHhmMCk+PjQpKyhBcHdyZGVsdGEpOworCQkJCWlmICh0MiA+IDB4ZikKKwkJCQkJdDIgPSAweGY7CisJCQkJdDMgPSAoKHZhbHVlJjB4ZjAwKT4+OCkrKEFwd3JkZWx0YSk7CisJCQkJaWYgKHQzID4gMHhmKQorCQkJCQl0MyA9IDB4ZjsKKwkJCQl0NCA9ICgodmFsdWUmMHhmMDAwKT4+MTIpKyhBcHdyZGVsdGEpOworCQkJCWlmICh0NCA+IDB4ZikKKwkJCQkJdDQgPSAweGY7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJaWYgKCh2YWx1ZSYweGYpID4gQXB3cmRlbHRhKQorCQkJCQl0MSA9ICh2YWx1ZSYweGYpLShBcHdyZGVsdGEpOworCQkJCWVsc2UKKwkJCQkJdDEgPSAwOworCQkJCWlmICgoKHZhbHVlJjB4ZjApPj40KSA+IEFwd3JkZWx0YSkKKwkJCQkJdDIgPSAoKHZhbHVlJjB4ZjApPj40KS0oQXB3cmRlbHRhKTsKKwkJCQllbHNlCisJCQkJCXQyID0gMDsKKwkJCQlpZiAoKCh2YWx1ZSYweGYwMCk+PjgpID4gQXB3cmRlbHRhKQorCQkJCQl0MyA9ICgodmFsdWUmMHhmMDApPj44KS0oQXB3cmRlbHRhKTsKKwkJCQllbHNlCisJCQkJCXQzID0gMDsKKwkJCQlpZiAoKCh2YWx1ZSYweGYwMDApPj4xMikgPiBBcHdyZGVsdGEpCisJCQkJCXQ0ID0gKCh2YWx1ZSYweGYwMDApPj4xMiktKEFwd3JkZWx0YSk7CisJCQkJZWxzZQorCQkJCQl0NCA9IDA7CisJCQl9CisJCQlBZGF0YSA9IHQxICsgKHQyPDw0KSArICh0Mzw8OCkgKyAodDQ8PDEyKTsKKworCQkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fVFhQT1dFUl9CWVJBVEVfMjBNSFpfNUcgKyBpKjQgKyAyLCB2YWx1ZSk7CisJCQlpZiAoYkFwd3JkZWx0YU1pbnVzID09IEZBTFNFKQorCQkJeworCQkJCXQxID0gKHZhbHVlJjB4ZikrKEFwd3JkZWx0YSk7CisJCQkJaWYgKHQxID4gMHhmKQorCQkJCQl0MSA9IDB4ZjsKKwkJCQl0MiA9ICgodmFsdWUmMHhmMCk+PjQpKyhBcHdyZGVsdGEpOworCQkJCWlmICh0MiA+IDB4ZikKKwkJCQkJdDIgPSAweGY7CisJCQkJdDMgPSAoKHZhbHVlJjB4ZjAwKT4+OCkrKEFwd3JkZWx0YSk7CisJCQkJaWYgKHQzID4gMHhmKQorCQkJCQl0MyA9IDB4ZjsKKwkJCQl0NCA9ICgodmFsdWUmMHhmMDAwKT4+MTIpKyhBcHdyZGVsdGEpOworCQkJCWlmICh0NCA+IDB4ZikKKwkJCQkJdDQgPSAweGY7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJaWYgKCh2YWx1ZSYweGYpID4gQXB3cmRlbHRhKQorCQkJCQl0MSA9ICh2YWx1ZSYweGYpLShBcHdyZGVsdGEpOworCQkJCWVsc2UKKwkJCQkJdDEgPSAwOworCQkJCWlmICgoKHZhbHVlJjB4ZjApPj40KSA+IEFwd3JkZWx0YSkKKwkJCQkJdDIgPSAoKHZhbHVlJjB4ZjApPj40KS0oQXB3cmRlbHRhKTsKKwkJCQllbHNlCisJCQkJCXQyID0gMDsKKwkJCQlpZiAoKCh2YWx1ZSYweGYwMCk+PjgpID4gQXB3cmRlbHRhKQorCQkJCQl0MyA9ICgodmFsdWUmMHhmMDApPj44KS0oQXB3cmRlbHRhKTsKKwkJCQllbHNlCisJCQkJCXQzID0gMDsKKwkJCQlpZiAoKCh2YWx1ZSYweGYwMDApPj4xMikgPiBBcHdyZGVsdGEpCisJCQkJCXQ0ID0gKCh2YWx1ZSYweGYwMDApPj4xMiktKEFwd3JkZWx0YSk7CisJCQkJZWxzZQorCQkJCQl0NCA9IDA7CisJCQl9CisJCQlBZGF0YSB8PSAoKHQxPDwxNikgKyAodDI8PDIwKSArICh0Mzw8MjQpICsgKHQ0PDwyOCkpOworCisJCQlpZiAoaSA9PSAwKQorCQkJCXBBZC0+VHgyME1Qd3JDZmdBQmFuZFtpXSA9IChwQWQtPlR4MjBNUHdyQ2ZnQUJhbmRbaV0gJiAweDAwMDBGRkZGKSB8IChBZGF0YSAmIDB4RkZGRjAwMDApOworCQkJZWxzZQorCQkJCXBBZC0+VHgyME1Qd3JDZmdBQmFuZFtpXSA9IEFkYXRhOworCisJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiMjBNSHogQlcsIDVHSHogYmFuZCwgQWRhdGEgPSAlbHggXG4iLCBBZGF0YSkpOworCQl9CisJfQorCisJLy8KKwkvLyBDaGVjayB0aGlzIGJsb2NrIGlzIHZhbGlkIGZvciA0ME1IeiBpbiA1Ry4gSWYgaW52YWxpZCwgdXNlIHBhcmFtZXRlciBmb3IgMjBNSHogaW4gMi40RworCS8vCisJYlZhbGlkID0gVFJVRTsKKwlmb3IgKGk9MDsgaTw2OyBpKyspCisJeworCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9UWFBPV0VSX0JZUkFURV80ME1IWl81RyArIDIgKyBpKjIsIHZhbHVlKTsKKwkJaWYgKCgodmFsdWUgJiAweDAwRkYpID09IDB4MDBGRikgfHwgKCh2YWx1ZSAmIDB4RkYwMCkgPT0gMHhGRjAwKSkKKwkJeworCQkJYlZhbGlkID0gRkFMU0U7CisJCQlicmVhazsKKwkJfQorCX0KKworCS8vCisJLy8gR2V0IFR4cG93ZXIgcGVyIE1DUyBmb3IgNDBNSHogaW4gNUcuCisJLy8KKwlpZiAoYlZhbGlkKQorCXsKKwkJZm9yIChpPTA7IGk8NDsgaSsrKQorCQl7CisJCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9UWFBPV0VSX0JZUkFURV80ME1IWl81RyArIGkqNCwgdmFsdWUpOworCQkJaWYgKGJBcHdyZGVsdGFNaW51cyA9PSBGQUxTRSkKKwkJCXsKKwkJCQl0MSA9ICh2YWx1ZSYweGYpKyhBcHdyZGVsdGEpOworCQkJCWlmICh0MSA+IDB4ZikKKwkJCQkJdDEgPSAweGY7CisJCQkJdDIgPSAoKHZhbHVlJjB4ZjApPj40KSsoQXB3cmRlbHRhKTsKKwkJCQlpZiAodDIgPiAweGYpCisJCQkJCXQyID0gMHhmOworCQkJCXQzID0gKCh2YWx1ZSYweGYwMCk+PjgpKyhBcHdyZGVsdGEpOworCQkJCWlmICh0MyA+IDB4ZikKKwkJCQkJdDMgPSAweGY7CisJCQkJdDQgPSAoKHZhbHVlJjB4ZjAwMCk+PjEyKSsoQXB3cmRlbHRhKTsKKwkJCQlpZiAodDQgPiAweGYpCisJCQkJCXQ0ID0gMHhmOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWlmICgodmFsdWUmMHhmKSA+IEFwd3JkZWx0YSkKKwkJCQkJdDEgPSAodmFsdWUmMHhmKS0oQXB3cmRlbHRhKTsKKwkJCQllbHNlCisJCQkJCXQxID0gMDsKKwkJCQlpZiAoKCh2YWx1ZSYweGYwKT4+NCkgPiBBcHdyZGVsdGEpCisJCQkJCXQyID0gKCh2YWx1ZSYweGYwKT4+NCktKEFwd3JkZWx0YSk7CisJCQkJZWxzZQorCQkJCQl0MiA9IDA7CisJCQkJaWYgKCgodmFsdWUmMHhmMDApPj44KSA+IEFwd3JkZWx0YSkKKwkJCQkJdDMgPSAoKHZhbHVlJjB4ZjAwKT4+OCktKEFwd3JkZWx0YSk7CisJCQkJZWxzZQorCQkJCQl0MyA9IDA7CisJCQkJaWYgKCgodmFsdWUmMHhmMDAwKT4+MTIpID4gQXB3cmRlbHRhKQorCQkJCQl0NCA9ICgodmFsdWUmMHhmMDAwKT4+MTIpLShBcHdyZGVsdGEpOworCQkJCWVsc2UKKwkJCQkJdDQgPSAwOworCQkJfQorCQkJQWRhdGEgPSB0MSArICh0Mjw8NCkgKyAodDM8PDgpICsgKHQ0PDwxMik7CisKKwkJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX1RYUE9XRVJfQllSQVRFXzQwTUhaXzVHICsgaSo0ICsgMiwgdmFsdWUpOworCQkJaWYgKGJBcHdyZGVsdGFNaW51cyA9PSBGQUxTRSkKKwkJCXsKKwkJCQl0MSA9ICh2YWx1ZSYweGYpKyhBcHdyZGVsdGEpOworCQkJCWlmICh0MSA+IDB4ZikKKwkJCQkJdDEgPSAweGY7CisJCQkJdDIgPSAoKHZhbHVlJjB4ZjApPj40KSsoQXB3cmRlbHRhKTsKKwkJCQlpZiAodDIgPiAweGYpCisJCQkJCXQyID0gMHhmOworCQkJCXQzID0gKCh2YWx1ZSYweGYwMCk+PjgpKyhBcHdyZGVsdGEpOworCQkJCWlmICh0MyA+IDB4ZikKKwkJCQkJdDMgPSAweGY7CisJCQkJdDQgPSAoKHZhbHVlJjB4ZjAwMCk+PjEyKSsoQXB3cmRlbHRhKTsKKwkJCQlpZiAodDQgPiAweGYpCisJCQkJCXQ0ID0gMHhmOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWlmICgodmFsdWUmMHhmKSA+IEFwd3JkZWx0YSkKKwkJCQkJdDEgPSAodmFsdWUmMHhmKS0oQXB3cmRlbHRhKTsKKwkJCQllbHNlCisJCQkJCXQxID0gMDsKKwkJCQlpZiAoKCh2YWx1ZSYweGYwKT4+NCkgPiBBcHdyZGVsdGEpCisJCQkJCXQyID0gKCh2YWx1ZSYweGYwKT4+NCktKEFwd3JkZWx0YSk7CisJCQkJZWxzZQorCQkJCQl0MiA9IDA7CisJCQkJaWYgKCgodmFsdWUmMHhmMDApPj44KSA+IEFwd3JkZWx0YSkKKwkJCQkJdDMgPSAoKHZhbHVlJjB4ZjAwKT4+OCktKEFwd3JkZWx0YSk7CisJCQkJZWxzZQorCQkJCQl0MyA9IDA7CisJCQkJaWYgKCgodmFsdWUmMHhmMDAwKT4+MTIpID4gQXB3cmRlbHRhKQorCQkJCQl0NCA9ICgodmFsdWUmMHhmMDAwKT4+MTIpLShBcHdyZGVsdGEpOworCQkJCWVsc2UKKwkJCQkJdDQgPSAwOworCQkJfQorCQkJQWRhdGEgfD0gKCh0MTw8MTYpICsgKHQyPDwyMCkgKyAodDM8PDI0KSArICh0NDw8MjgpKTsKKworCQkJaWYgKGkgPT0gMCkKKwkJCQlwQWQtPlR4NDBNUHdyQ2ZnQUJhbmRbaSsxXSA9IChwQWQtPlR4NDBNUHdyQ2ZnQUJhbmRbaSsxXSAmIDB4MDAwMEZGRkYpIHwgKEFkYXRhICYgMHhGRkZGMDAwMCk7CisJCQllbHNlCisJCQkJcEFkLT5UeDQwTVB3ckNmZ0FCYW5kW2krMV0gPSBBZGF0YTsKKworCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIjQwTUh6IEJXLCA1R0h6IGJhbmQsIEFkYXRhID0gJWx4IFxuIiwgQWRhdGEpKTsKKwkJfQorCX0KK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJUmVhZCBpbml0aWFsIGNoYW5uZWwgcG93ZXIgcGFyYW1ldGVycyBmcm9tIEVFUFJPTQorCisJQXJndW1lbnRzOgorCQlBZGFwdGVyCQkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJUlRNUFJlYWRDaGFubmVsUHdyKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKQoreworCVVDSEFSCQkJCWksIGNob2Zmc2V0OworCUVFUFJPTV9UWF9QV1JfU1RSVUMJICAgIFBvd2VyOworCUVFUFJPTV9UWF9QV1JfU1RSVUMJICAgIFBvd2VyMjsKKworCS8vIFJlYWQgVHggcG93ZXIgdmFsdWUgZm9yIGFsbCBjaGFubmVscworCS8vIFZhbHVlIGZyb20gMSAtIDB4N2YuIERlZmF1bHQgdmFsdWUgaXMgMjQuCisJLy8gUG93ZXIgdmFsdWUgOiAyLjRHIDB4MDAgKDApIH4gMHgxRiAoMzEpCisJLy8gICAgICAgICAgICAgOiA1LjVHIDB4RjkgKC03KSB+IDB4MEYgKDE1KQorCisJLy8gMC4gMTFiL2csIGNoMSAtIGNoIDE0CisJZm9yIChpID0gMDsgaSA8IDc7IGkrKykKKwl7CisJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX0dfVFhfUFdSX09GRlNFVCArIGkgKiAyLCBQb3dlci53b3JkKTsKKwkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fR19UWDJfUFdSX09GRlNFVCArIGkgKiAyLCBQb3dlcjIud29yZCk7CisJCXBBZC0+VHhQb3dlcltpICogMl0uQ2hhbm5lbCA9IGkgKiAyICsgMTsKKwkJcEFkLT5UeFBvd2VyW2kgKiAyICsgMV0uQ2hhbm5lbCA9IGkgKiAyICsgMjsKKworCQlpZiAoKFBvd2VyLmZpZWxkLkJ5dGUwID4gMzEpIHx8IChQb3dlci5maWVsZC5CeXRlMCA8IDApKQorCQkJcEFkLT5UeFBvd2VyW2kgKiAyXS5Qb3dlciA9IERFRkFVTFRfUkZfVFhfUE9XRVI7CisJCWVsc2UKKwkJCXBBZC0+VHhQb3dlcltpICogMl0uUG93ZXIgPSBQb3dlci5maWVsZC5CeXRlMDsKKworCQlpZiAoKFBvd2VyLmZpZWxkLkJ5dGUxID4gMzEpIHx8IChQb3dlci5maWVsZC5CeXRlMSA8IDApKQorCQkJcEFkLT5UeFBvd2VyW2kgKiAyICsgMV0uUG93ZXIgPSBERUZBVUxUX1JGX1RYX1BPV0VSOworCQllbHNlCisJCQlwQWQtPlR4UG93ZXJbaSAqIDIgKyAxXS5Qb3dlciA9IFBvd2VyLmZpZWxkLkJ5dGUxOworCisJCWlmICgoUG93ZXIyLmZpZWxkLkJ5dGUwID4gMzEpIHx8IChQb3dlcjIuZmllbGQuQnl0ZTAgPCAwKSkKKwkJCXBBZC0+VHhQb3dlcltpICogMl0uUG93ZXIyID0gREVGQVVMVF9SRl9UWF9QT1dFUjsKKwkJZWxzZQorCQkJcEFkLT5UeFBvd2VyW2kgKiAyXS5Qb3dlcjIgPSBQb3dlcjIuZmllbGQuQnl0ZTA7CisKKwkJaWYgKChQb3dlcjIuZmllbGQuQnl0ZTEgPiAzMSkgfHwgKFBvd2VyMi5maWVsZC5CeXRlMSA8IDApKQorCQkJcEFkLT5UeFBvd2VyW2kgKiAyICsgMV0uUG93ZXIyID0gREVGQVVMVF9SRl9UWF9QT1dFUjsKKwkJZWxzZQorCQkJcEFkLT5UeFBvd2VyW2kgKiAyICsgMV0uUG93ZXIyID0gUG93ZXIyLmZpZWxkLkJ5dGUxOworCX0KKworCS8vIDEuIFUtTklJIGxvd2VyL21pZGRsZSBiYW5kOiAzNiwgMzgsIDQwOyA0NCwgNDYsIDQ4OyA1MiwgNTQsIDU2OyA2MCwgNjIsIDY0IChpbmNsdWRpbmcgY2VudHJhbCBmcmVxdWVuY3kgaW4gQlcgNDBNSHopCisJLy8gMS4xIEZpbGwgdXAgY2hhbm5lbAorCWNob2Zmc2V0ID0gMTQ7CisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKwl7CisJCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMF0uQ2hhbm5lbAk9IDM2ICsgaSAqIDggKyAwOworCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDBdLlBvd2VyCT0gREVGQVVMVF9SRl9UWF9QT1dFUjsKKwkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAwXS5Qb3dlcjIJPSBERUZBVUxUX1JGX1RYX1BPV0VSOworCisJCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMV0uQ2hhbm5lbAk9IDM2ICsgaSAqIDggKyAyOworCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDFdLlBvd2VyCT0gREVGQVVMVF9SRl9UWF9QT1dFUjsKKwkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAxXS5Qb3dlcjIJPSBERUZBVUxUX1JGX1RYX1BPV0VSOworCisJCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMl0uQ2hhbm5lbAk9IDM2ICsgaSAqIDggKyA0OworCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDJdLlBvd2VyCT0gREVGQVVMVF9SRl9UWF9QT1dFUjsKKwkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAyXS5Qb3dlcjIJPSBERUZBVUxUX1JGX1RYX1BPV0VSOworCX0KKworCS8vIDEuMiBGaWxsIHVwIHBvd2VyCisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwl7CisJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX0FfVFhfUFdSX09GRlNFVCArIGkgKiAyLCBQb3dlci53b3JkKTsKKwkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fQV9UWDJfUFdSX09GRlNFVCArIGkgKiAyLCBQb3dlcjIud29yZCk7CisKKwkJaWYgKChQb3dlci5maWVsZC5CeXRlMCA8IDE2KSAmJiAoUG93ZXIuZmllbGQuQnl0ZTAgPj0gLTcpKQorCQkJcEFkLT5UeFBvd2VyW2kgKiAyICsgY2hvZmZzZXQgKyAwXS5Qb3dlciA9IFBvd2VyLmZpZWxkLkJ5dGUwOworCisJCWlmICgoUG93ZXIuZmllbGQuQnl0ZTEgPCAxNikgJiYgKFBvd2VyLmZpZWxkLkJ5dGUxID49IC03KSkKKwkJCXBBZC0+VHhQb3dlcltpICogMiArIGNob2Zmc2V0ICsgMV0uUG93ZXIgPSBQb3dlci5maWVsZC5CeXRlMTsKKworCQlpZiAoKFBvd2VyMi5maWVsZC5CeXRlMCA8IDE2KSAmJiAoUG93ZXIyLmZpZWxkLkJ5dGUwID49IC03KSkKKwkJCXBBZC0+VHhQb3dlcltpICogMiArIGNob2Zmc2V0ICsgMF0uUG93ZXIyID0gUG93ZXIyLmZpZWxkLkJ5dGUwOworCisJCWlmICgoUG93ZXIyLmZpZWxkLkJ5dGUxIDwgMTYpICYmIChQb3dlcjIuZmllbGQuQnl0ZTEgPj0gLTcpKQorCQkJcEFkLT5UeFBvd2VyW2kgKiAyICsgY2hvZmZzZXQgKyAxXS5Qb3dlcjIgPSBQb3dlcjIuZmllbGQuQnl0ZTE7CisJfQorCisJLy8gMi4gSGlwcGVyTEFOIDIgMTAwLCAxMDIgLDEwNDsgMTA4LCAxMTAsIDExMjsgMTE2LCAxMTgsIDEyMDsgMTI0LCAxMjYsIDEyODsgMTMyLCAxMzQsIDEzNjsgMTQwIChpbmNsdWRpbmcgY2VudHJhbCBmcmVxdWVuY3kgaW4gQlcgNDBNSHopCisJLy8gMi4xIEZpbGwgdXAgY2hhbm5lbAorCWNob2Zmc2V0ID0gMTQgKyAxMjsKKwlmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKQorCXsKKwkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAwXS5DaGFubmVsCT0gMTAwICsgaSAqIDggKyAwOworCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDBdLlBvd2VyCT0gREVGQVVMVF9SRl9UWF9QT1dFUjsKKwkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAwXS5Qb3dlcjIJPSBERUZBVUxUX1JGX1RYX1BPV0VSOworCisJCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMV0uQ2hhbm5lbAk9IDEwMCArIGkgKiA4ICsgMjsKKwkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAxXS5Qb3dlcgk9IERFRkFVTFRfUkZfVFhfUE9XRVI7CisJCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMV0uUG93ZXIyCT0gREVGQVVMVF9SRl9UWF9QT1dFUjsKKworCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDJdLkNoYW5uZWwJPSAxMDAgKyBpICogOCArIDQ7CisJCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMl0uUG93ZXIJPSBERUZBVUxUX1JGX1RYX1BPV0VSOworCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDJdLlBvd2VyMgk9IERFRkFVTFRfUkZfVFhfUE9XRVI7CisJfQorCXBBZC0+VHhQb3dlclszICogNSArIGNob2Zmc2V0ICsgMF0uQ2hhbm5lbAkJPSAxNDA7CisJcEFkLT5UeFBvd2VyWzMgKiA1ICsgY2hvZmZzZXQgKyAwXS5Qb3dlcgkJPSBERUZBVUxUX1JGX1RYX1BPV0VSOworCXBBZC0+VHhQb3dlclszICogNSArIGNob2Zmc2V0ICsgMF0uUG93ZXIyCQk9IERFRkFVTFRfUkZfVFhfUE9XRVI7CisKKwkvLyAyLjIgRmlsbCB1cCBwb3dlcgorCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJeworCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9BX1RYX1BXUl9PRkZTRVQgKyAoY2hvZmZzZXQgLSAxNCkgKyBpICogMiwgUG93ZXIud29yZCk7CisJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX0FfVFgyX1BXUl9PRkZTRVQgKyAoY2hvZmZzZXQgLSAxNCkgKyBpICogMiwgUG93ZXIyLndvcmQpOworCisJCWlmICgoUG93ZXIuZmllbGQuQnl0ZTAgPCAxNikgJiYgKFBvd2VyLmZpZWxkLkJ5dGUwID49IC03KSkKKwkJCXBBZC0+VHhQb3dlcltpICogMiArIGNob2Zmc2V0ICsgMF0uUG93ZXIgPSBQb3dlci5maWVsZC5CeXRlMDsKKworCQlpZiAoKFBvd2VyLmZpZWxkLkJ5dGUxIDwgMTYpICYmIChQb3dlci5maWVsZC5CeXRlMSA+PSAtNykpCisJCQlwQWQtPlR4UG93ZXJbaSAqIDIgKyBjaG9mZnNldCArIDFdLlBvd2VyID0gUG93ZXIuZmllbGQuQnl0ZTE7CisKKwkJaWYgKChQb3dlcjIuZmllbGQuQnl0ZTAgPCAxNikgJiYgKFBvd2VyMi5maWVsZC5CeXRlMCA+PSAtNykpCisJCQlwQWQtPlR4UG93ZXJbaSAqIDIgKyBjaG9mZnNldCArIDBdLlBvd2VyMiA9IFBvd2VyMi5maWVsZC5CeXRlMDsKKworCQlpZiAoKFBvd2VyMi5maWVsZC5CeXRlMSA8IDE2KSAmJiAoUG93ZXIyLmZpZWxkLkJ5dGUxID49IC03KSkKKwkJCXBBZC0+VHhQb3dlcltpICogMiArIGNob2Zmc2V0ICsgMV0uUG93ZXIyID0gUG93ZXIyLmZpZWxkLkJ5dGUxOworCX0KKworCS8vIDMuIFUtTklJIHVwcGVyIGJhbmQ6IDE0OSwgMTUxLCAxNTM7IDE1NywgMTU5LCAxNjE7IDE2NSAoaW5jbHVkaW5nIGNlbnRyYWwgZnJlcXVlbmN5IGluIEJXIDQwTUh6KQorCS8vIDMuMSBGaWxsIHVwIGNoYW5uZWwKKwljaG9mZnNldCA9IDE0ICsgMTIgKyAxNjsKKwlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKQorCXsKKwkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAwXS5DaGFubmVsCT0gMTQ5ICsgaSAqIDggKyAwOworCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDBdLlBvd2VyCT0gREVGQVVMVF9SRl9UWF9QT1dFUjsKKwkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAwXS5Qb3dlcjIJPSBERUZBVUxUX1JGX1RYX1BPV0VSOworCisJCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMV0uQ2hhbm5lbAk9IDE0OSArIGkgKiA4ICsgMjsKKwkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAxXS5Qb3dlcgk9IERFRkFVTFRfUkZfVFhfUE9XRVI7CisJCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMV0uUG93ZXIyCT0gREVGQVVMVF9SRl9UWF9QT1dFUjsKKworCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDJdLkNoYW5uZWwJPSAxNDkgKyBpICogOCArIDQ7CisJCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMl0uUG93ZXIJPSBERUZBVUxUX1JGX1RYX1BPV0VSOworCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDJdLlBvd2VyMgk9IERFRkFVTFRfUkZfVFhfUE9XRVI7CisJfQorCXBBZC0+VHhQb3dlclszICogMiArIGNob2Zmc2V0ICsgMF0uQ2hhbm5lbAkJPSAxNjU7CisJcEFkLT5UeFBvd2VyWzMgKiAyICsgY2hvZmZzZXQgKyAwXS5Qb3dlcgkJPSBERUZBVUxUX1JGX1RYX1BPV0VSOworCXBBZC0+VHhQb3dlclszICogMiArIGNob2Zmc2V0ICsgMF0uUG93ZXIyCQk9IERFRkFVTFRfUkZfVFhfUE9XRVI7CisKKwkvLyAzLjIgRmlsbCB1cCBwb3dlcgorCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisJeworCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9BX1RYX1BXUl9PRkZTRVQgKyAoY2hvZmZzZXQgLSAxNCkgKyBpICogMiwgUG93ZXIud29yZCk7CisJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX0FfVFgyX1BXUl9PRkZTRVQgKyAoY2hvZmZzZXQgLSAxNCkgKyBpICogMiwgUG93ZXIyLndvcmQpOworCisJCWlmICgoUG93ZXIuZmllbGQuQnl0ZTAgPCAxNikgJiYgKFBvd2VyLmZpZWxkLkJ5dGUwID49IC03KSkKKwkJCXBBZC0+VHhQb3dlcltpICogMiArIGNob2Zmc2V0ICsgMF0uUG93ZXIgPSBQb3dlci5maWVsZC5CeXRlMDsKKworCQlpZiAoKFBvd2VyLmZpZWxkLkJ5dGUxIDwgMTYpICYmIChQb3dlci5maWVsZC5CeXRlMSA+PSAtNykpCisJCQlwQWQtPlR4UG93ZXJbaSAqIDIgKyBjaG9mZnNldCArIDFdLlBvd2VyID0gUG93ZXIuZmllbGQuQnl0ZTE7CisKKwkJaWYgKChQb3dlcjIuZmllbGQuQnl0ZTAgPCAxNikgJiYgKFBvd2VyMi5maWVsZC5CeXRlMCA+PSAtNykpCisJCQlwQWQtPlR4UG93ZXJbaSAqIDIgKyBjaG9mZnNldCArIDBdLlBvd2VyMiA9IFBvd2VyMi5maWVsZC5CeXRlMDsKKworCQlpZiAoKFBvd2VyMi5maWVsZC5CeXRlMSA8IDE2KSAmJiAoUG93ZXIyLmZpZWxkLkJ5dGUxID49IC03KSkKKwkJCXBBZC0+VHhQb3dlcltpICogMiArIGNob2Zmc2V0ICsgMV0uUG93ZXIyID0gUG93ZXIyLmZpZWxkLkJ5dGUxOworCX0KKworCS8vIDQuIFByaW50IGFuZCBEZWJ1ZworCWNob2Zmc2V0ID0gMTQgKyAxMiArIDE2ICsgNzsKKworCisjaWYgMAorCS8vIEluaXQgdGhlIDgwMi4xMWogY2hhbm5lbCBudW1iZXIgZm9yIFRYIGNoYW5uZWwgcG93ZXIKKwkvLyAwLiAyME1IegorCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspCisJeworCQlwQWQtPlR4UG93ZXIxMUpbaV0uQ2hhbm5lbCA9IDggKyBpICogNDsKKwkJcEFkLT5UeFBvd2VyMTFKW2ldLkJXID0gQldfMjA7CisJfQorCisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKwl7CisJCXBBZC0+VHhQb3dlcjExSltpICsgM10uQ2hhbm5lbCA9IDM0ICsgaSAqIDQ7CisJCXBBZC0+VHhQb3dlcjExSltpICsgM10uQlcgPSBCV18yMDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorCXsKKwkJcEFkLT5UeFBvd2VyMTFKW2kgKyA3XS5DaGFubmVsID0gMTg0ICsgaSAqIDQ7CisJCXBBZC0+VHhQb3dlcjExSltpICsgN10uQlcgPSBCV18yMDsKKwl9CisKKwkvLyAwLiAxME1IegorCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspCisJeworCQlwQWQtPlR4UG93ZXIxMUpbaSArIDExXS5DaGFubmVsID0gNyArIGk7CisJCXBBZC0+VHhQb3dlcjExSltpICsgMTFdLkJXID0gQldfMTA7CisJfQorCXBBZC0+VHhQb3dlcjExSlsxM10uQ2hhbm5lbCA9IDExOworCXBBZC0+VHhQb3dlcjExSlsxM10uQlcgPSBCV18xMDsKKworCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspCisJeworCQlwQWQtPlR4UG93ZXIxMUpbaSArIDE0XS5DaGFubmVsID0gMTgzICsgaTsKKwkJcEFkLT5UeFBvd2VyMTFKW2kgKyAxNF0uQlc9IEJXXzEwOworCX0KKworCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspCisJeworCQlwQWQtPlR4UG93ZXIxMUpbaSArIDE3XS5DaGFubmVsID0gMTg3ICsgaTsKKwkJcEFkLT5UeFBvd2VyMTFKW2kgKyAxN10uQlcgPSBCV18xMDsKKwl9CisJZm9yIChpID0gMDsgaSA8IDEwOyBpKyspCisJeworCQlQb3dlci53b3JkID0gUlRNUF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX0phcGFuX1RYX1BXUl9PRkZTRVQgKyBpICogMik7CisJCVBvd2VyMi53b3JkID0gUlRNUF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX0phcGFuX1RYMl9QV1JfT0ZGU0VUICsgaSAqIDIpOworCisJCWlmICgoUG93ZXIuZmllbGQuQnl0ZTAgPCAzNikgJiYgKFBvd2VyLmZpZWxkLkJ5dGUwID4gLTYpKQorCQkJcEFkLT5UeFBvd2VyMTFKW2kgKiAyXS5Qb3dlciA9IFBvd2VyLmZpZWxkLkJ5dGUwOworCisJCWlmICgoUG93ZXIuZmllbGQuQnl0ZTEgPCAzNikgJiYgKFBvd2VyLmZpZWxkLkJ5dGUxID4gLTYpKQorCQkJcEFkLT5UeFBvd2VyMTFKW2kgKiAyICsgMV0uUG93ZXIgPSBQb3dlci5maWVsZC5CeXRlMTsKKworCQlpZiAoKFBvd2VyMi5maWVsZC5CeXRlMCA8IDM2KSAmJiAoUG93ZXIyLmZpZWxkLkJ5dGUwID4gLTYpKQorCQkJcEFkLT5UeFBvd2VyMTFKW2kgKiAyXS5Qb3dlcjIgPSBQb3dlcjIuZmllbGQuQnl0ZTA7CisKKwkJaWYgKChQb3dlcjIuZmllbGQuQnl0ZTEgPCAzNikgJiYgKFBvd2VyMi5maWVsZC5CeXRlMSA+IC02KSkKKwkJCXBBZC0+VHhQb3dlcjExSltpICogMiArIDFdLlBvd2VyMiA9IFBvd2VyMi5maWVsZC5CeXRlMTsKKwl9CisjZW5kaWYKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVJlYWQgdGhlIGZvbGxvd2luZyBmcm9tIHRoZSByZWdpc3RyeQorCQkxLiBBbGwgdGhlIHBhcmFtZXRlcnMKKwkJMi4gTmV0d29ya0FkZHJlcworCisJQXJndW1lbnRzOgorCQlBZGFwdGVyCQkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCQlXcmFwcGVyQ29uZmlndXJhdGlvbkNvbnRleHQJRm9yIHVzZSBieSBOZGlzT3BlbkNvbmZpZ3VyYXRpb24KKworCVJldHVybiBWYWx1ZToKKwkJTkRJU19TVEFUVVNfU1VDQ0VTUworCQlORElTX1NUQVRVU19GQUlMVVJFCisJCU5ESVNfU1RBVFVTX1JFU09VUkNFUworCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitORElTX1NUQVRVUwlOSUNSZWFkUmVnUGFyYW1ldGVycygKKwlJTglQUlRNUF9BREFQVEVSCQlwQWQsCisJSU4JTkRJU19IQU5ETEUJCQlXcmFwcGVyQ29uZmlndXJhdGlvbkNvbnRleHQKKwkpCit7CisJTkRJU19TVEFUVVMJCQkJCQlTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworCURCR1BSSU5UX1MoU3RhdHVzLCAoIjwtLSBOSUNSZWFkUmVnUGFyYW1ldGVycywgU3RhdHVzPSV4XG4iLCBTdGF0dXMpKTsKKwlyZXR1cm4gU3RhdHVzOworfQorCisKKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJUmVhZCBpbml0aWFsIHBhcmFtZXRlcnMgZnJvbSBFRVBST00KKworCUFyZ3VtZW50czoKKwkJQWRhcHRlcgkJCQkJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECU5JQ1JlYWRFRVBST01QYXJhbWV0ZXJzKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCW1hY19hZGRyKQoreworCVVJTlQzMgkJCWRhdGEgPSAwOworCVVTSE9SVAkJCWksIHZhbHVlLCB2YWx1ZTI7CisJVUNIQVIJCQlUbXBQaHk7CisJRUVQUk9NX1RYX1BXUl9TVFJVQwkgICAgUG93ZXI7CisJRUVQUk9NX1ZFUlNJT05fU1RSVUMgICAgVmVyc2lvbjsKKwlFRVBST01fQU5URU5OQV9TVFJVQwlBbnRlbm5hOworCUVFUFJPTV9OSUNfQ09ORklHMl9TVFJVQyAgICBOaWNDb25maWcyOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+IE5JQ1JlYWRFRVBST01QYXJhbWV0ZXJzXG4iKSk7CisKKwkvLyBJbml0IEVFUFJPTSBBZGRyZXNzIE51bWJlciwgYmVmb3JlIGFjY2VzcyBFRVBST007IGlmIDkzYzQ2LCBFRVBST01BZGRyZXNzTnVtPTYsIGVsc2UgaWYgOTNjNjYsIEVFUFJPTUFkZHJlc3NOdW09OAorCVJUTVBfSU9fUkVBRDMyKHBBZCwgRTJQUk9NX0NTUiwgJmRhdGEpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPiBFMlBST01fQ1NSID0gMHgleFxuIiwgZGF0YSkpOworCisJaWYoKGRhdGEgJiAweDMwKSA9PSAwKQorCQlwQWQtPkVFUFJPTUFkZHJlc3NOdW0gPSA2OwkJLy8gOTNDNDYKKwllbHNlIGlmKChkYXRhICYgMHgzMCkgPT0gMHgxMCkKKwkJcEFkLT5FRVBST01BZGRyZXNzTnVtID0gODsgICAgIC8vIDkzQzY2CisJZWxzZQorCQlwQWQtPkVFUFJPTUFkZHJlc3NOdW0gPSA4OyAgICAgLy8gOTNDODYKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLT4gRUVQUk9NQWRkcmVzc051bSA9ICVkXG4iLCBwQWQtPkVFUFJPTUFkZHJlc3NOdW0gKSk7CisKKwkvLyBSVDI4NjAgTUFDIG5vIGxvbmdlciBhdXRvIGxvYWQgTUFDIGFkZHJlc3MgZnJvbSBFMlBST00uIERyaXZlciBoYXMgdG8gaW50aWFsaXplCisJLy8gTUFDIGFkZHJlc3MgcmVnaXN0ZXJzIGFjY29yZGluZyB0byBFMlBST00gc2V0dGluZworCWlmIChtYWNfYWRkciA9PSBOVUxMIHx8CisJCXN0cmxlbihtYWNfYWRkcikgIT0gMTcgfHwKKwkJbWFjX2FkZHJbMl0gIT0gJzonICB8fCBtYWNfYWRkcls1XSAhPSAnOicgIHx8IG1hY19hZGRyWzhdICE9ICc6JyB8fAorCQltYWNfYWRkclsxMV0gIT0gJzonIHx8IG1hY19hZGRyWzE0XSAhPSAnOicpCisJeworCQlVU0hPUlQgIEFkZHIwMSxBZGRyMjMsQWRkcjQ1IDsKKworCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIDB4MDQsIEFkZHIwMSk7CisJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgMHgwNiwgQWRkcjIzKTsKKwkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCAweDA4LCBBZGRyNDUpOworCisJCXBBZC0+UGVybWFuZW50QWRkcmVzc1swXSA9IChVQ0hBUikoQWRkcjAxICYgMHhmZik7CisJCXBBZC0+UGVybWFuZW50QWRkcmVzc1sxXSA9IChVQ0hBUikoQWRkcjAxID4+IDgpOworCQlwQWQtPlBlcm1hbmVudEFkZHJlc3NbMl0gPSAoVUNIQVIpKEFkZHIyMyAmIDB4ZmYpOworCQlwQWQtPlBlcm1hbmVudEFkZHJlc3NbM10gPSAoVUNIQVIpKEFkZHIyMyA+PiA4KTsKKwkJcEFkLT5QZXJtYW5lbnRBZGRyZXNzWzRdID0gKFVDSEFSKShBZGRyNDUgJiAweGZmKTsKKwkJcEFkLT5QZXJtYW5lbnRBZGRyZXNzWzVdID0gKFVDSEFSKShBZGRyNDUgPj4gOCk7CisKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSW5pdGlhbGl6ZSBNQUMgQWRkcmVzcyBmcm9tIEUyUFJPTSBcbiIpKTsKKwl9CisJZWxzZQorCXsKKwkJSU5UCQlqOworCQlQVUNIQVIJbWFjcHRyOworCisJCW1hY3B0ciA9IG1hY19hZGRyOworCisJCWZvciAoaj0wOyBqPE1BQ19BRERSX0xFTjsgaisrKQorCQl7CisJCQlBdG9IKG1hY3B0ciwgJnBBZC0+UGVybWFuZW50QWRkcmVzc1tqXSwgMSk7CisJCQltYWNwdHI9bWFjcHRyKzM7CisJCX0KKworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJbml0aWFsaXplIE1BQyBBZGRyZXNzIGZyb20gbW9kdWxlIHBhcmFtZXRlciBcbiIpKTsKKwl9CisKKworCXsKKwkJLy9tb3JlIGNvbnZlbmluZXQgdG8gdGVzdCBtYnNzaWQsIHNvIGFwJ3MgYnNzaWQgJjB4ZjEKKwkJaWYgKHBBZC0+UGVybWFuZW50QWRkcmVzc1swXSA9PSAweGZmKQorCQkJcEFkLT5QZXJtYW5lbnRBZGRyZXNzWzBdID0gUmFuZG9tQnl0ZShwQWQpJjB4Zjg7CisKKwkJLy9pZiAocEFkLT5QZXJtYW5lbnRBZGRyZXNzWzVdID09IDB4ZmYpCisJCS8vCXBBZC0+UGVybWFuZW50QWRkcmVzc1s1XSA9IFJhbmRvbUJ5dGUocEFkKSYweGY4OworCisJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwoIkUyUFJPTSBNQUM6ID0lMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKwkJCXBBZC0+UGVybWFuZW50QWRkcmVzc1swXSwgcEFkLT5QZXJtYW5lbnRBZGRyZXNzWzFdLAorCQkJcEFkLT5QZXJtYW5lbnRBZGRyZXNzWzJdLCBwQWQtPlBlcm1hbmVudEFkZHJlc3NbM10sCisJCQlwQWQtPlBlcm1hbmVudEFkZHJlc3NbNF0sIHBBZC0+UGVybWFuZW50QWRkcmVzc1s1XSkpOworCQlpZiAocEFkLT5iTG9jYWxBZG1pbk1BQyA9PSBGQUxTRSkKKwkJeworCQkJTUFDX0RXMF9TVFJVQyBjc3IyOworCQkJTUFDX0RXMV9TVFJVQyBjc3IzOworCQkJQ09QWV9NQUNfQUREUihwQWQtPkN1cnJlbnRBZGRyZXNzLCBwQWQtPlBlcm1hbmVudEFkZHJlc3MpOworCQkJY3NyMi5maWVsZC5CeXRlMCA9IHBBZC0+Q3VycmVudEFkZHJlc3NbMF07CisJCQljc3IyLmZpZWxkLkJ5dGUxID0gcEFkLT5DdXJyZW50QWRkcmVzc1sxXTsKKwkJCWNzcjIuZmllbGQuQnl0ZTIgPSBwQWQtPkN1cnJlbnRBZGRyZXNzWzJdOworCQkJY3NyMi5maWVsZC5CeXRlMyA9IHBBZC0+Q3VycmVudEFkZHJlc3NbM107CisJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfQUREUl9EVzAsIGNzcjIud29yZCk7CisJCQljc3IzLndvcmQgPSAwOworCQkJY3NyMy5maWVsZC5CeXRlNCA9IHBBZC0+Q3VycmVudEFkZHJlc3NbNF07CisJCQljc3IzLmZpZWxkLkJ5dGU1ID0gcEFkLT5DdXJyZW50QWRkcmVzc1s1XTsKKwkJCWNzcjMuZmllbGQuVTJNZU1hc2sgPSAweGZmOworCQkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX0FERFJfRFcxLCBjc3IzLndvcmQpOworCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCgiRTJQUk9NIE1BQzogPSUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorCQkJCXBBZC0+UGVybWFuZW50QWRkcmVzc1swXSwgcEFkLT5QZXJtYW5lbnRBZGRyZXNzWzFdLAorCQkJCXBBZC0+UGVybWFuZW50QWRkcmVzc1syXSwgcEFkLT5QZXJtYW5lbnRBZGRyZXNzWzNdLAorCQkJCXBBZC0+UGVybWFuZW50QWRkcmVzc1s0XSwgcEFkLT5QZXJtYW5lbnRBZGRyZXNzWzVdKSk7CisJCX0KKwl9CisKKwkvLyBpZiBub3QgcmV0dXJuIGVhcmx5LiBjYXVzZSBmYWlsIGF0IGVtdWxhdGlvbi4KKwkvLyBJbml0IHRoZSBjaGFubmVsIG51bWJlciBmb3IgVFggY2hhbm5lbCBwb3dlcgorCVJUTVBSZWFkQ2hhbm5lbFB3cihwQWQpOworCisJLy8gaWYgRTJQUk9NIHZlcnNpb24gbWlzbWF0Y2ggd2l0aCBkcml2ZXIncyBleHBlY3RhdGlvbiwgdGhlbiBza2lwCisJLy8gYWxsIHN1YnNlcXVlbnQgRTJSUE9NIHJldGlldmFsIGFuZCBzZXQgYSBzeXN0ZW0gZXJyb3IgYml0IHRvIG5vdGlmeSBHVUkKKwlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9WRVJTSU9OX09GRlNFVCwgVmVyc2lvbi53b3JkKTsKKwlwQWQtPkVlcHJvbVZlcnNpb24gPSBWZXJzaW9uLmZpZWxkLlZlcnNpb24gKyBWZXJzaW9uLmZpZWxkLkZhZVJlbGVhc2VOdW1iZXIgKiAyNTY7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiRTJQUk9NOiBWZXJzaW9uID0gJWQsIEZBRSByZWxlYXNlICMlZFxuIiwgVmVyc2lvbi5maWVsZC5WZXJzaW9uLCBWZXJzaW9uLmZpZWxkLkZhZVJlbGVhc2VOdW1iZXIpKTsKKworCWlmIChWZXJzaW9uLmZpZWxkLlZlcnNpb24gPiBWQUxJRF9FRVBST01fVkVSU0lPTikKKwl7CisJCURCR1BSSU5UX0VSUigoIkUyUFJPTTogV1JPTkcgVkVSU0lPTiAweCV4LCBzaG91bGQgYmUgJWRcbiIsVmVyc2lvbi5maWVsZC5WZXJzaW9uLCBWQUxJRF9FRVBST01fVkVSU0lPTikpOworCQkvKnBBZC0+U3lzdGVtRXJyb3JCaXRtYXAgfD0gMHgwMDAwMDAwMTsKKworCQkvLyBoYXJkLWNvZGUgZGVmYXVsdCB2YWx1ZSB3aGVuIG5vIHByb3BlciBFMlBST00gaW5zdGFsbGVkCisJCXBBZC0+YkF1dG9UeEFnY0EgPSBGQUxTRTsKKwkJcEFkLT5iQXV0b1R4QWdjRyA9IEZBTFNFOworCisJCS8vIERlZmF1bHQgdGhlIGNoYW5uZWwgcG93ZXIKKwkJZm9yIChpID0gMDsgaSA8IE1BWF9OVU1fT0ZfQ0hBTk5FTFM7IGkrKykKKwkJCXBBZC0+VHhQb3dlcltpXS5Qb3dlciA9IERFRkFVTFRfUkZfVFhfUE9XRVI7CisKKwkJLy8gRGVmYXVsdCB0aGUgY2hhbm5lbCBwb3dlcgorCQlmb3IgKGkgPSAwOyBpIDwgTUFYX05VTV9PRl8xMUpDSEFOTkVMUzsgaSsrKQorCQkJcEFkLT5UeFBvd2VyMTFKW2ldLlBvd2VyID0gREVGQVVMVF9SRl9UWF9QT1dFUjsKKworCQlmb3IoaSA9IDA7IGkgPCBOVU1fRUVQUk9NX0JCUF9QQVJNUzsgaSsrKQorCQkJcEFkLT5FRVBST01EZWZhdWx0VmFsdWVbaV0gPSAweGZmZmY7CisJCXJldHVybjsgICovCisJfQorCisJLy8gUmVhZCBCQlAgZGVmYXVsdCB2YWx1ZSBmcm9tIEVFUFJPTSBhbmQgc3RvcmUgdG8gYXJyYXkoRUVQUk9NRGVmYXVsdFZhbHVlKSBpbiBwQWQKKwlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9OSUMxX09GRlNFVCwgdmFsdWUpOworCXBBZC0+RUVQUk9NRGVmYXVsdFZhbHVlWzBdID0gdmFsdWU7CisKKwlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9OSUMyX09GRlNFVCwgdmFsdWUpOworCXBBZC0+RUVQUk9NRGVmYXVsdFZhbHVlWzFdID0gdmFsdWU7CisKKwlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIDB4MzgsIHZhbHVlKTsJLy8gQ291bnRyeSBSZWdpb24KKwlwQWQtPkVFUFJPTURlZmF1bHRWYWx1ZVsyXSA9IHZhbHVlOworCisJZm9yKGkgPSAwOyBpIDwgODsgaSsrKQorCXsKKwkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fQkJQX0JBU0VfT0ZGU0VUICsgaSoyLCB2YWx1ZSk7CisJCXBBZC0+RUVQUk9NRGVmYXVsdFZhbHVlW2krM10gPSB2YWx1ZTsKKwl9CisKKwkvLyBXZSBoYXZlIHRvIHBhcnNlIE5JQyBjb25maWd1cmF0aW9uIDAgYXQgaGVyZS4KKwkvLyBJZiBUU1NJIGRpZCBub3QgaGF2ZSBwcmVsb2FkZWQgdmFsdWUsIGl0IHNob3VsZCByZXNldCB0aGUgVHhBdXRvQWdjIHRvIGZhbHNlCisJLy8gVGhlcmVmb3JlLCB3ZSBoYXZlIHRvIHJlYWQgVHhBdXRvQWdjIGNvbnRyb2wgYmVmb3JlaGFuZC4KKwkvLyBSZWFkIFR4IEFHQyBjb250cm9sIGJpdAorCUFudGVubmEud29yZCA9IHBBZC0+RUVQUk9NRGVmYXVsdFZhbHVlWzBdOworCWlmIChBbnRlbm5hLndvcmQgPT0gMHhGRkZGKQorCXsKKwkJQW50ZW5uYS53b3JkID0gMDsKKwkJQW50ZW5uYS5maWVsZC5SZkljVHlwZSA9IFJGSUNfMjgyMDsKKwkJQW50ZW5uYS5maWVsZC5UeFBhdGggPSAxOworCQlBbnRlbm5hLmZpZWxkLlJ4UGF0aCA9IDI7CisJCURCR1BSSU5UKFJUX0RFQlVHX1dBUk4sICgiRTJQUk9NIGVycm9yLCBoYXJkIGNvZGUgYXMgMHglMDR4XG4iLCBBbnRlbm5hLndvcmQpKTsKKwl9CisKKwkvLyBDaG9vc2UgdGhlIGRlc2lyZWQgVHgmUnggc3RyZWFtLgorCWlmICgocEFkLT5Db21tb25DZmcuVHhTdHJlYW0gPT0gMCkgfHwgKHBBZC0+Q29tbW9uQ2ZnLlR4U3RyZWFtID4gQW50ZW5uYS5maWVsZC5UeFBhdGgpKQorCQlwQWQtPkNvbW1vbkNmZy5UeFN0cmVhbSA9IEFudGVubmEuZmllbGQuVHhQYXRoOworCisJaWYgKChwQWQtPkNvbW1vbkNmZy5SeFN0cmVhbSA9PSAwKSB8fCAocEFkLT5Db21tb25DZmcuUnhTdHJlYW0gPiBBbnRlbm5hLmZpZWxkLlJ4UGF0aCkpCisJeworCQlwQWQtPkNvbW1vbkNmZy5SeFN0cmVhbSA9IEFudGVubmEuZmllbGQuUnhQYXRoOworCisJCWlmICgocEFkLT5NQUNWZXJzaW9uIDwgUkFMSU5LXzI4ODNfVkVSU0lPTikgJiYKKwkJCShwQWQtPkNvbW1vbkNmZy5SeFN0cmVhbSA+IDIpKQorCQl7CisJCQkvLyBvbmx5IDIgUnggc3RyZWFtcyBmb3IgUlQyODYwIHNlcmllcworCQkJcEFkLT5Db21tb25DZmcuUnhTdHJlYW0gPSAyOworCQl9CisJfQorCisJLy8gMyozCisJLy8gcmVhZCB2YWx1ZSBmcm9tIEVFUFJPTSBhbmQgc2V0IHRoZW0gdG8gQ1NSMTc0IH4gMTc3IGluIGNoYWluMCB+IGNoYWluMgorCS8vIHlldCBpbXBsZW1lbnQKKwlmb3IoaT0wOyBpPDM7IGkrKykKKwl7CisJfQorCisJTmljQ29uZmlnMi53b3JkID0gcEFkLT5FRVBST01EZWZhdWx0VmFsdWVbMV07CisKKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwl7CisJCU5pY0NvbmZpZzIud29yZCA9IDA7CisJCWlmICgoTmljQ29uZmlnMi53b3JkICYgMHgwMGZmKSA9PSAweGZmKQorCQl7CisJCQlOaWNDb25maWcyLndvcmQgJj0gMHhmZjAwOworCQl9CisKKwkJaWYgKChOaWNDb25maWcyLndvcmQgPj4gOCkgPT0gMHhmZikKKwkJeworCQkJTmljQ29uZmlnMi53b3JkICY9IDB4MDBmZjsKKwkJfQorCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCWlmIChOaWNDb25maWcyLmZpZWxkLkR5bmFtaWNUeEFnY0NvbnRyb2wgPT0gMSkKKwkJcEFkLT5iQXV0b1R4QWdjQSA9IHBBZC0+YkF1dG9UeEFnY0cgPSBUUlVFOworCWVsc2UKKwkJcEFkLT5iQXV0b1R4QWdjQSA9IHBBZC0+YkF1dG9UeEFnY0cgPSBGQUxTRTsKKworCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCJOSUNSZWFkRUVQUk9NUGFyYW1ldGVyczogUnhQYXRoID0gJWQsIFR4UGF0aCA9ICVkXG4iLCBBbnRlbm5hLmZpZWxkLlJ4UGF0aCwgQW50ZW5uYS5maWVsZC5UeFBhdGgpKTsKKworCS8vIFNhdmUgdGhlIGFudGVubmEgZm9yIGZ1dHVyZSB1c2UKKwlwQWQtPkFudGVubmEud29yZCA9IEFudGVubmEud29yZDsKKworCS8vCisJLy8gUmVzZXQgUGh5TW9kZSBpZiB3ZSBkb24ndCBzdXBwb3J0IDgwMi4xMWEKKwkvLyBPbmx5IFJGSUNfMjg1MCAmIFJGSUNfMjc1MCBzdXBwb3J0IDgwMi4xMWEKKwkvLworCWlmICgoQW50ZW5uYS5maWVsZC5SZkljVHlwZSAhPSBSRklDXzI4NTApICYmIChBbnRlbm5hLmZpZWxkLlJmSWNUeXBlICE9IFJGSUNfMjc1MCkpCisJeworCQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQUJHX01JWEVEKSB8fAorCQkJKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQSkpCisJCQlwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID0gUEhZXzExQkdfTUlYRUQ7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCWVsc2UgaWYgKChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUFCR05fTUlYRUQpCXx8CisJCQkJIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUFOX01JWEVEKSAJfHwKKwkJCQkgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQUdOX01JWEVEKSAJfHwKKwkJCQkgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExTl81RykpCisJCQlwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID0gUEhZXzExQkdOX01JWEVEOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCX0KKworCS8vIFJlYWQgVFNTSSByZWZlcmVuY2UgYW5kIFRTU0kgYm91bmRhcnkgZm9yIHRlbXBlcmF0dXJlIGNvbXBlbnNhdGlvbi4gVGhpcyBpcyB1Z2x5CisJLy8gMC4gMTFiL2cKKwl7CisJCS8qIHRoZXNlIGFyZSB0ZW1wYXR1cmUgcmVmZXJlbmNlIHZhbHVlICgweDAwIH4gMHhGRSkKKwkJICAgZXg6IDB4MDAgMHgxNSAweDI1IDB4NDUgMHg4OCAweEEwIDB4QjUgMHhEMCAweEYwCisJCSAgIFRzc2lQbHVzQm91bmRhcnlHIFs0XSBbM10gWzJdIFsxXSBbMF0gKHNtYWxsZXIpICsKKwkJICAgVHNzaU1pbnVzQm91bmRhcnlHWzBdIFsxXSBbMl0gWzNdIFs0XSAobGFyZ2VyKSAqLworCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIDB4NkUsIFBvd2VyLndvcmQpOworCQlwQWQtPlRzc2lNaW51c0JvdW5kYXJ5R1s0XSA9IFBvd2VyLmZpZWxkLkJ5dGUwOworCQlwQWQtPlRzc2lNaW51c0JvdW5kYXJ5R1szXSA9IFBvd2VyLmZpZWxkLkJ5dGUxOworCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIDB4NzAsIFBvd2VyLndvcmQpOworCQlwQWQtPlRzc2lNaW51c0JvdW5kYXJ5R1syXSA9IFBvd2VyLmZpZWxkLkJ5dGUwOworCQlwQWQtPlRzc2lNaW51c0JvdW5kYXJ5R1sxXSA9IFBvd2VyLmZpZWxkLkJ5dGUxOworCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIDB4NzIsIFBvd2VyLndvcmQpOworCQlwQWQtPlRzc2lSZWZHICAgPSBQb3dlci5maWVsZC5CeXRlMDsgLyogcmVmZXJlbmNlIHZhbHVlIFswXSAqLworCQlwQWQtPlRzc2lQbHVzQm91bmRhcnlHWzFdID0gUG93ZXIuZmllbGQuQnl0ZTE7CisJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgMHg3NCwgUG93ZXIud29yZCk7CisJCXBBZC0+VHNzaVBsdXNCb3VuZGFyeUdbMl0gPSBQb3dlci5maWVsZC5CeXRlMDsKKwkJcEFkLT5Uc3NpUGx1c0JvdW5kYXJ5R1szXSA9IFBvd2VyLmZpZWxkLkJ5dGUxOworCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIDB4NzYsIFBvd2VyLndvcmQpOworCQlwQWQtPlRzc2lQbHVzQm91bmRhcnlHWzRdID0gUG93ZXIuZmllbGQuQnl0ZTA7CisJCXBBZC0+VHhBZ2NTdGVwRyA9IFBvd2VyLmZpZWxkLkJ5dGUxOworCQlwQWQtPlR4QWdjQ29tcGVuc2F0ZUcgPSAwOworCQlwQWQtPlRzc2lNaW51c0JvdW5kYXJ5R1swXSA9IHBBZC0+VHNzaVJlZkc7CisJCXBBZC0+VHNzaVBsdXNCb3VuZGFyeUdbMF0gID0gcEFkLT5Uc3NpUmVmRzsKKworCQkvLyBEaXNhYmxlIFR4QWdjIGlmIHRoZSBiYXNlZCB2YWx1ZSBpcyBub3QgcmlnaHQKKwkJaWYgKHBBZC0+VHNzaVJlZkcgPT0gMHhmZikKKwkJCXBBZC0+YkF1dG9UeEFnY0cgPSBGQUxTRTsKKworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkUyUFJPTTogRyBUc3NpWy00IC4uICs0XSA9ICVkICVkICVkICVkIC0gJWQgLSVkICVkICVkICVkLCBzdGVwPSVkLCB0dW5pbmc9JWRcbiIsCisJCQlwQWQtPlRzc2lNaW51c0JvdW5kYXJ5R1s0XSwgcEFkLT5Uc3NpTWludXNCb3VuZGFyeUdbM10sIHBBZC0+VHNzaU1pbnVzQm91bmRhcnlHWzJdLCBwQWQtPlRzc2lNaW51c0JvdW5kYXJ5R1sxXSwKKwkJCXBBZC0+VHNzaVJlZkcsCisJCQlwQWQtPlRzc2lQbHVzQm91bmRhcnlHWzFdLCBwQWQtPlRzc2lQbHVzQm91bmRhcnlHWzJdLCBwQWQtPlRzc2lQbHVzQm91bmRhcnlHWzNdLCBwQWQtPlRzc2lQbHVzQm91bmRhcnlHWzRdLAorCQkJcEFkLT5UeEFnY1N0ZXBHLCBwQWQtPmJBdXRvVHhBZ2NHKSk7CisJfQorCS8vIDEuIDExYQorCXsKKwkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCAweEQ0LCBQb3dlci53b3JkKTsKKwkJcEFkLT5Uc3NpTWludXNCb3VuZGFyeUFbNF0gPSBQb3dlci5maWVsZC5CeXRlMDsKKwkJcEFkLT5Uc3NpTWludXNCb3VuZGFyeUFbM10gPSBQb3dlci5maWVsZC5CeXRlMTsKKwkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCAweEQ2LCBQb3dlci53b3JkKTsKKwkJcEFkLT5Uc3NpTWludXNCb3VuZGFyeUFbMl0gPSBQb3dlci5maWVsZC5CeXRlMDsKKwkJcEFkLT5Uc3NpTWludXNCb3VuZGFyeUFbMV0gPSBQb3dlci5maWVsZC5CeXRlMTsKKwkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCAweEQ4LCBQb3dlci53b3JkKTsKKwkJcEFkLT5Uc3NpUmVmQSAgID0gUG93ZXIuZmllbGQuQnl0ZTA7CisJCXBBZC0+VHNzaVBsdXNCb3VuZGFyeUFbMV0gPSBQb3dlci5maWVsZC5CeXRlMTsKKwkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCAweERBLCBQb3dlci53b3JkKTsKKwkJcEFkLT5Uc3NpUGx1c0JvdW5kYXJ5QVsyXSA9IFBvd2VyLmZpZWxkLkJ5dGUwOworCQlwQWQtPlRzc2lQbHVzQm91bmRhcnlBWzNdID0gUG93ZXIuZmllbGQuQnl0ZTE7CisJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgMHhEQywgUG93ZXIud29yZCk7CisJCXBBZC0+VHNzaVBsdXNCb3VuZGFyeUFbNF0gPSBQb3dlci5maWVsZC5CeXRlMDsKKwkJcEFkLT5UeEFnY1N0ZXBBID0gUG93ZXIuZmllbGQuQnl0ZTE7CisJCXBBZC0+VHhBZ2NDb21wZW5zYXRlQSA9IDA7CisJCXBBZC0+VHNzaU1pbnVzQm91bmRhcnlBWzBdID0gcEFkLT5Uc3NpUmVmQTsKKwkJcEFkLT5Uc3NpUGx1c0JvdW5kYXJ5QVswXSAgPSBwQWQtPlRzc2lSZWZBOworCisJCS8vIERpc2FibGUgVHhBZ2MgaWYgdGhlIGJhc2VkIHZhbHVlIGlzIG5vdCByaWdodAorCQlpZiAocEFkLT5Uc3NpUmVmQSA9PSAweGZmKQorCQkJcEFkLT5iQXV0b1R4QWdjQSA9IEZBTFNFOworCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiRTJQUk9NOiBBIFRzc2lbLTQgLi4gKzRdID0gJWQgJWQgJWQgJWQgLSAlZCAtJWQgJWQgJWQgJWQsIHN0ZXA9JWQsIHR1bmluZz0lZFxuIiwKKwkJCXBBZC0+VHNzaU1pbnVzQm91bmRhcnlBWzRdLCBwQWQtPlRzc2lNaW51c0JvdW5kYXJ5QVszXSwgcEFkLT5Uc3NpTWludXNCb3VuZGFyeUFbMl0sIHBBZC0+VHNzaU1pbnVzQm91bmRhcnlBWzFdLAorCQkJcEFkLT5Uc3NpUmVmQSwKKwkJCXBBZC0+VHNzaVBsdXNCb3VuZGFyeUFbMV0sIHBBZC0+VHNzaVBsdXNCb3VuZGFyeUFbMl0sIHBBZC0+VHNzaVBsdXNCb3VuZGFyeUFbM10sIHBBZC0+VHNzaVBsdXNCb3VuZGFyeUFbNF0sCisJCQlwQWQtPlR4QWdjU3RlcEEsIHBBZC0+YkF1dG9UeEFnY0EpKTsKKwl9CisJcEFkLT5CYnBSc3NpVG9EYm1EZWx0YSA9IDB4MDsKKworCS8vIFJlYWQgZnJlcXVlbmN5IG9mZnNldCBzZXR0aW5nIGZvciBSRgorCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX0ZSRVFfT0ZGU0VULCB2YWx1ZSk7CisJaWYgKCh2YWx1ZSAmIDB4MDBGRikgIT0gMHgwMEZGKQorCQlwQWQtPlJmRnJlcU9mZnNldCA9IChVTE9ORykgKHZhbHVlICYgMHgwMEZGKTsKKwllbHNlCisJCXBBZC0+UmZGcmVxT2Zmc2V0ID0gMDsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJFMlBST006IFJGIEZyZXFPZmZzZXQ9MHglbHggXG4iLCBwQWQtPlJmRnJlcU9mZnNldCkpOworCisJLy9Db3VudHJ5UmVnaW9uIGJ5dGUgb2Zmc2V0ICgzOGgpCisJdmFsdWUgPSBwQWQtPkVFUFJPTURlZmF1bHRWYWx1ZVsyXSA+PiA4OwkJLy8gMi40RyBiYW5kCisJdmFsdWUyID0gcEFkLT5FRVBST01EZWZhdWx0VmFsdWVbMl0gJiAweDAwRkY7CS8vIDVHIGJhbmQKKworCWlmICgodmFsdWUgPD0gUkVHSU9OX01BWElNVU1fQkdfQkFORCkgJiYgKHZhbHVlMiA8PSBSRUdJT05fTUFYSU1VTV9BX0JBTkQpKQorCXsKKwkJcEFkLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbiA9ICgoVUNIQVIpIHZhbHVlKSB8IDB4ODA7CisJCXBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb25Gb3JBQmFuZCA9ICgoVUNIQVIpIHZhbHVlMikgfCAweDgwOworCQlUbXBQaHkgPSBwQWQtPkNvbW1vbkNmZy5QaHlNb2RlOworCQlwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID0gMHhmZjsKKwkJUlRNUFNldFBoeU1vZGUocEFkLCBUbXBQaHkpOworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQlTZXRDb21tb25IVChwQWQpOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCX0KKworCS8vCisJLy8gR2V0IFJTU0kgT2Zmc2V0IG9uIEVFUFJPTSAweDlBaCAmIDB4OUNoLgorCS8vIFRoZSB2YWxpZCB2YWx1ZSBhcmUgKC0xMCB+IDEwKQorCS8vCisJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fUlNTSV9CR19PRkZTRVQsIHZhbHVlKTsKKwlwQWQtPkJHUnNzaU9mZnNldDAgPSB2YWx1ZSAmIDB4MDBmZjsKKwlwQWQtPkJHUnNzaU9mZnNldDEgPSAodmFsdWUgPj4gOCk7CisJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fUlNTSV9CR19PRkZTRVQrMiwgdmFsdWUpOworCXBBZC0+QkdSc3NpT2Zmc2V0MiA9IHZhbHVlICYgMHgwMGZmOworCXBBZC0+QUxOQUdhaW4xID0gKHZhbHVlID4+IDgpOworCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX0xOQV9PRkZTRVQsIHZhbHVlKTsKKwlwQWQtPkJMTkFHYWluID0gdmFsdWUgJiAweDAwZmY7CisJcEFkLT5BTE5BR2FpbjAgPSAodmFsdWUgPj4gOCk7CisKKwkvLyBWYWxpZGF0ZSAxMWIvZyBSU1NJXzAgb2Zmc2V0LgorCWlmICgocEFkLT5CR1Jzc2lPZmZzZXQwIDwgLTEwKSB8fCAocEFkLT5CR1Jzc2lPZmZzZXQwID4gMTApKQorCQlwQWQtPkJHUnNzaU9mZnNldDAgPSAwOworCisJLy8gVmFsaWRhdGUgMTFiL2cgUlNTSV8xIG9mZnNldC4KKwlpZiAoKHBBZC0+QkdSc3NpT2Zmc2V0MSA8IC0xMCkgfHwgKHBBZC0+QkdSc3NpT2Zmc2V0MSA+IDEwKSkKKwkJcEFkLT5CR1Jzc2lPZmZzZXQxID0gMDsKKworCS8vIFZhbGlkYXRlIDExYi9nIFJTU0lfMiBvZmZzZXQuCisJaWYgKChwQWQtPkJHUnNzaU9mZnNldDIgPCAtMTApIHx8IChwQWQtPkJHUnNzaU9mZnNldDIgPiAxMCkpCisJCXBBZC0+QkdSc3NpT2Zmc2V0MiA9IDA7CisKKwlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9SU1NJX0FfT0ZGU0VULCB2YWx1ZSk7CisJcEFkLT5BUnNzaU9mZnNldDAgPSB2YWx1ZSAmIDB4MDBmZjsKKwlwQWQtPkFSc3NpT2Zmc2V0MSA9ICh2YWx1ZSA+PiA4KTsKKwlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIChFRVBST01fUlNTSV9BX09GRlNFVCsyKSwgdmFsdWUpOworCXBBZC0+QVJzc2lPZmZzZXQyID0gdmFsdWUgJiAweDAwZmY7CisJcEFkLT5BTE5BR2FpbjIgPSAodmFsdWUgPj4gOCk7CisKKwlpZiAoKChVQ0hBUilwQWQtPkFMTkFHYWluMSA9PSAweEZGKSB8fCAocEFkLT5BTE5BR2FpbjEgPT0gMHgwMCkpCisJCXBBZC0+QUxOQUdhaW4xID0gcEFkLT5BTE5BR2FpbjA7CisJaWYgKCgoVUNIQVIpcEFkLT5BTE5BR2FpbjIgPT0gMHhGRikgfHwgKHBBZC0+QUxOQUdhaW4yID09IDB4MDApKQorCQlwQWQtPkFMTkFHYWluMiA9IHBBZC0+QUxOQUdhaW4wOworCisJLy8gVmFsaWRhdGUgMTFhIFJTU0lfMCBvZmZzZXQuCisJaWYgKChwQWQtPkFSc3NpT2Zmc2V0MCA8IC0xMCkgfHwgKHBBZC0+QVJzc2lPZmZzZXQwID4gMTApKQorCQlwQWQtPkFSc3NpT2Zmc2V0MCA9IDA7CisKKwkvLyBWYWxpZGF0ZSAxMWEgUlNTSV8xIG9mZnNldC4KKwlpZiAoKHBBZC0+QVJzc2lPZmZzZXQxIDwgLTEwKSB8fCAocEFkLT5BUnNzaU9mZnNldDEgPiAxMCkpCisJCXBBZC0+QVJzc2lPZmZzZXQxID0gMDsKKworCS8vVmFsaWRhdGUgMTFhIFJTU0lfMiBvZmZzZXQuCisJaWYgKChwQWQtPkFSc3NpT2Zmc2V0MiA8IC0xMCkgfHwgKHBBZC0+QVJzc2lPZmZzZXQyID4gMTApKQorCQlwQWQtPkFSc3NpT2Zmc2V0MiA9IDA7CisKKwkvLworCS8vIEdldCBMRUQgU2V0dGluZy4KKwkvLworCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgMHgzYSwgdmFsdWUpOworCXBBZC0+TGVkQ250bC53b3JkID0gKHZhbHVlJjB4ZmYwMCkgPj4gODsKKwlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9MRUQxX09GRlNFVCwgdmFsdWUpOworCXBBZC0+TGVkMSA9IHZhbHVlOworCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX0xFRDJfT0ZGU0VULCB2YWx1ZSk7CisJcEFkLT5MZWQyID0gdmFsdWU7CisJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fTEVEM19PRkZTRVQsIHZhbHVlKTsKKwlwQWQtPkxlZDMgPSB2YWx1ZTsKKworCVJUTVBSZWFkVHhQd3JQZXJSYXRlKHBBZCk7CisKKyNpZmRlZiBTSU5HTEVfU0tVCisJLy9wQWQtPkNvbW1vbkNmZy5EZWZpbmVNYXhUeFB3ciA9IFJUTVBfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9ERUZJTkVfTUFYX1RYUFdSKTsKKwlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9ERUZJTkVfTUFYX1RYUFdSLCBwQWQtPkNvbW1vbkNmZy5EZWZpbmVNYXhUeFB3cik7CisjZW5kaWYgLy8gU0lOR0xFX1NLVSAvLworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPC0tIE5JQ1JlYWRFRVBST01QYXJhbWV0ZXJzXG4iKSk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlTZXQgZGVmYXVsdCB2YWx1ZSBmcm9tIEVFUFJPTQorCisJQXJndW1lbnRzOgorCQlBZGFwdGVyCQkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJTklDSW5pdEFzaWNGcm9tRUVQUk9NKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKQoreworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCVVJTlQzMgkJCQkJZGF0YSA9IDA7CisJVUNIQVIJQkJQUjEgPSAwOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCVVTSE9SVAkJCQkJaTsKKwlFRVBST01fQU5URU5OQV9TVFJVQwlBbnRlbm5hOworCUVFUFJPTV9OSUNfQ09ORklHMl9TVFJVQyAgICBOaWNDb25maWcyOworCVVDSEFSCUJCUFIzID0gMDsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPiBOSUNJbml0QXNpY0Zyb21FRVBST01cbiIpKTsKKwlmb3IoaSA9IDM7IGkgPCBOVU1fRUVQUk9NX0JCUF9QQVJNUzsgaSsrKQorCXsKKwkJVUNIQVIgQmJwUmVnSWR4LCBCYnBWYWx1ZTsKKworCQlpZiAoKHBBZC0+RUVQUk9NRGVmYXVsdFZhbHVlW2ldICE9IDB4RkZGRikgJiYgKHBBZC0+RUVQUk9NRGVmYXVsdFZhbHVlW2ldICE9IDApKQorCQl7CisJCQlCYnBSZWdJZHggPSAoVUNIQVIpKHBBZC0+RUVQUk9NRGVmYXVsdFZhbHVlW2ldID4+IDgpOworCQkJQmJwVmFsdWUgID0gKFVDSEFSKShwQWQtPkVFUFJPTURlZmF1bHRWYWx1ZVtpXSAmIDB4ZmYpOworCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJicFJlZ0lkeCwgQmJwVmFsdWUpOworCQl9CisJfQorCisJQW50ZW5uYS53b3JkID0gcEFkLT5BbnRlbm5hLndvcmQ7CisJcEFkLT5NbG1lLlJlYWxSeFBhdGggPSAoVUNIQVIpIEFudGVubmEuZmllbGQuUnhQYXRoOworCXBBZC0+UmZJY1R5cGUgPSAoVUNIQVIpIEFudGVubmEuZmllbGQuUmZJY1R5cGU7CisKKwlOaWNDb25maWcyLndvcmQgPSBwQWQtPkVFUFJPTURlZmF1bHRWYWx1ZVsxXTsKKworCisJLy8gU2F2ZSB0aGUgYW50ZW5uYSBmb3IgZnV0dXJlIHVzZQorCXBBZC0+TmljQ29uZmlnMi53b3JkID0gTmljQ29uZmlnMi53b3JkOworCisJLy8KKwkvLyBTZW5kIExFRCBTZXR0aW5nIHRvIE1DVS4KKwkvLworCWlmIChwQWQtPkxlZENudGwud29yZCA9PSAweEZGKQorCXsKKwkJcEFkLT5MZWRDbnRsLndvcmQgPSAweDAxOworCQlwQWQtPkxlZDEgPSAweDU1NTU7CisJCXBBZC0+TGVkMiA9IDB4MjIyMTsKKworI2lmZGVmIFJUMjg2MAorCQlwQWQtPkxlZDMgPSAweEE5Rjg7CisjZW5kaWYgLy8gUlQyODYwIC8vCisJfQorCisJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDUyLCAweGZmLCAoVUNIQVIpcEFkLT5MZWQxLCAoVUNIQVIpKHBBZC0+TGVkMSA+PiA4KSk7CisJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDUzLCAweGZmLCAoVUNIQVIpcEFkLT5MZWQyLCAoVUNIQVIpKHBBZC0+TGVkMiA+PiA4KSk7CisJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDU0LCAweGZmLCAoVUNIQVIpcEFkLT5MZWQzLCAoVUNIQVIpKHBBZC0+TGVkMyA+PiA4KSk7CisgICAgcEFkLT5MZWRJbmRpY2F0b3JTdHJlZ3RoID0gMHhGRjsKKyAgICBSVE1QU2V0U2lnbmFsTEVEKHBBZCwgLTEwMCk7CS8vIEZvcmNlIHNpZ25hbCBzdHJlbmd0aCBMZWQgdG8gYmUgdHVybmVkIG9mZiwgYmVmb3JlIGxpbmsgdXAKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJeworCQkvLyBSZWFkIEhhcmR3YXJlIGNvbnRyb2xsZWQgUmFkaW8gc3RhdGUgZW5hYmxlIGJpdAorCQlpZiAoTmljQ29uZmlnMi5maWVsZC5IYXJkd2FyZVJhZGlvQ29udHJvbCA9PSAxKQorCQl7CisJCQlwQWQtPlN0YUNmZy5iSGFyZHdhcmVSYWRpbyA9IFRSVUU7CisKKwkJCS8vIFJlYWQgR1BJTyBwaW4yIGFzIEhhcmR3YXJlIGNvbnRyb2xsZWQgcmFkaW8gc3RhdGUKKwkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgR1BJT19DVFJMX0NGRywgJmRhdGEpOworCQkJaWYgKChkYXRhICYgMHgwNCkgPT0gMCkKKwkJCXsKKwkJCQlwQWQtPlN0YUNmZy5iSHdSYWRpbyA9IEZBTFNFOworCQkJCXBBZC0+U3RhQ2ZnLmJSYWRpbyA9IEZBTFNFOworCQkJCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JBRElPX09GRik7CisJCQl9CisJCX0KKwkJZWxzZQorCQkJcEFkLT5TdGFDZmcuYkhhcmR3YXJlUmFkaW8gPSBGQUxTRTsKKworCQlpZiAocEFkLT5TdGFDZmcuYlJhZGlvID09IEZBTFNFKQorCQl7CisJCQlSVE1QU2V0TEVEKHBBZCwgTEVEX1JBRElPX09GRik7CisJCX0KKwkJZWxzZQorCQl7CisJCQlSVE1QU2V0TEVEKHBBZCwgTEVEX1JBRElPX09OKTsKKyNpZmRlZiBSVDI4NjAKKwkJCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHgzMCwgMHhmZiwgMHhmZiwgMHgwMik7CisJCQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4MzEsIFBvd2VyV2FrZUNJRCwgMHgwMCwgMHgwMCk7CisJCQkvLyAyLTEuIHdhaXQgY29tbWFuZCBvay4KKwkJCUFzaWNDaGVja0NvbW1hbk9rKHBBZCwgUG93ZXJXYWtlQ0lEKTsKKyNlbmRpZiAvLyBSVDI4NjAgLy8KKwkJfQorCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCS8vIFR1cm4gb2ZmIHBhdGNoaW5nIGZvciBjYXJkYnVzIGNvbnRyb2xsZXIKKwlpZiAoTmljQ29uZmlnMi5maWVsZC5DYXJkYnVzQWNjZWxlcmF0aW9uID09IDEpCisJeworCX0KKworCWlmIChOaWNDb25maWcyLmZpZWxkLkR5bmFtaWNUeEFnY0NvbnRyb2wgPT0gMSkKKwkJcEFkLT5iQXV0b1R4QWdjQSA9IHBBZC0+YkF1dG9UeEFnY0cgPSBUUlVFOworCWVsc2UKKwkJcEFkLT5iQXV0b1R4QWdjQSA9IHBBZC0+YkF1dG9UeEFnY0cgPSBGQUxTRTsKKwkvLworCS8vIFNpbmNlIEJCUCBoYXMgYmVlbiBwcm9nYW1lZCwgdG8gbWFrZSBzdXJlIEJCUCBzZXR0aW5nIHdpbGwgYmUKKwkvLyB1cGF0ZSBpbnNpZGUgb2YgQXNpY0FudGVubmFTZWxlY3QsIHNvIHJlc2V0IHRvIFVOS05PV05fQkFORCEhCisJLy8KKwlwQWQtPkNvbW1vbkNmZy5CYW5kU3RhdGUgPSBVTktOT1dOX0JBTkQ7CisKKwlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsICZCQlBSMyk7CisJQkJQUjMgJj0gKH4weDE4KTsKKwlpZihwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDMpCisJeworCQlCQlBSMyB8PSAoMHgxMCk7CisJfQorCWVsc2UgaWYocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAyKQorCXsKKwkJQkJQUjMgfD0gKDB4OCk7CisJfQorCWVsc2UgaWYocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAxKQorCXsKKwkJQkJQUjMgfD0gKDB4MCk7CisJfQorCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsIEJCUFIzKTsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJeworCQkvLyBIYW5kbGUgdGhlIGRpZmZlcmVuY2Ugd2hlbiAxVAorCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjEsICZCQlBSMSk7CisJCWlmKHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGggPT0gMSkKKwkJeworCQlCQlBSMSAmPSAofjB4MTgpOworCQl9CisJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjEsIEJCUFIxKTsKKworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJVc2UgSHcgUmFkaW8gQ29udHJvbCBQaW49JWQ7IGlmIHVzZWQgUGluPSVkO1xuIiwgcEFkLT5Db21tb25DZmcuYkhhcmR3YXJlUmFkaW8sIHBBZC0+Q29tbW9uQ2ZnLmJIYXJkd2FyZVJhZGlvKSk7CisJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlR4UGF0aCA9ICVkLCBSeFBhdGggPSAlZCwgUkZJQz0lZCwgUG9sYXIrTEVEIG1vZGU9JXhcbiIsIHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGgsIHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGgsIHBBZC0+UmZJY1R5cGUsIHBBZC0+TGVkQ250bC53b3JkKSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPC0tIE5JQ0luaXRBc2ljRnJvbUVFUFJPTVxuIikpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJSW5pdGlhbGl6ZSBOSUMgaGFyZHdhcmUKKworCUFyZ3VtZW50czoKKwkJQWRhcHRlcgkJCQkJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitORElTX1NUQVRVUwlOSUNJbml0aWFsaXplQWRhcHRlcigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiAgIEJPT0xFQU4gICAgYkhhcmRSZXNldCkKK3sKKwlORElTX1NUQVRVUyAgICAgU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKwlXUERNQV9HTE9fQ0ZHX1NUUlVDCUdsb0NmZzsKKyNpZmRlZiBSVDI4NjAKKwlVSU5UMzIJCQlWYWx1ZTsKKwlERUxBWV9JTlRfQ0ZHX1NUUlVDCUludENmZzsKKyNlbmRpZiAvLyBSVDI4NjAgLy8KKwlVTE9ORwlpID0wLCBqPTA7CisJQUNfVFhPUF9DU1IwX1NUUlVDCWNzcjA7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLT4gTklDSW5pdGlhbGl6ZUFkYXB0ZXJcbiIpKTsKKworCS8vIDMuIFNldCBETUEgZ2xvYmFsIGNvbmZpZ3VyYXRpb24gZXhjZXB0IFRYX0RNQV9FTiBhbmQgUlhfRE1BX0VOIGJpdHM6CityZXRyeToKKwlpID0gMDsKKwlkbworCXsKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBXUERNQV9HTE9fQ0ZHLCAmR2xvQ2ZnLndvcmQpOworCQlpZiAoKEdsb0NmZy5maWVsZC5UeERNQUJ1c3kgPT0gMCkgICYmIChHbG9DZmcuZmllbGQuUnhETUFCdXN5ID09IDApKQorCQkJYnJlYWs7CisKKwkJUlRNUHVzZWNEZWxheSgxMDAwKTsKKwkJaSsrOworCX13aGlsZSAoIGk8MTAwKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT0gRE1BIG9mZnNldCAweDIwOCA9IDB4JXhcbiIsIEdsb0NmZy53b3JkKSk7CisJR2xvQ2ZnLndvcmQgJj0gMHhmZjA7CisJR2xvQ2ZnLmZpZWxkLkVuVFhXcml0ZUJhY2tERE9ORSA9MTsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBXUERNQV9HTE9fQ0ZHLCBHbG9DZmcud29yZCk7CisKKwkvLyBSZWNvcmQgSFcgQmVhY29uIG9mZnNldAorCXBBZC0+QmVhY29uT2Zmc2V0WzBdID0gSFdfQkVBQ09OX0JBU0UwOworCXBBZC0+QmVhY29uT2Zmc2V0WzFdID0gSFdfQkVBQ09OX0JBU0UxOworCXBBZC0+QmVhY29uT2Zmc2V0WzJdID0gSFdfQkVBQ09OX0JBU0UyOworCXBBZC0+QmVhY29uT2Zmc2V0WzNdID0gSFdfQkVBQ09OX0JBU0UzOworCXBBZC0+QmVhY29uT2Zmc2V0WzRdID0gSFdfQkVBQ09OX0JBU0U0OworCXBBZC0+QmVhY29uT2Zmc2V0WzVdID0gSFdfQkVBQ09OX0JBU0U1OworCXBBZC0+QmVhY29uT2Zmc2V0WzZdID0gSFdfQkVBQ09OX0JBU0U2OworCXBBZC0+QmVhY29uT2Zmc2V0WzddID0gSFdfQkVBQ09OX0JBU0U3OworCisJLy8KKwkvLyB3cml0ZSBhbGwgc2hhcmVkIFJpbmcncyBiYXNlIGFkZHJlc3MgaW50byBBU0lDCisJLy8KKworCS8vIGFzaWMgc2ltdWxhdGlvbiBzZXF1ZW5jZSBwdXQgdGhpcyBhaGVhZCBiZWZvcmUgbG9hZGluZyBmaXJtd2FyZS4KKwkvLyBwYmYgaGFyZHdhcmUgcmVzZXQKKyNpZmRlZiBSVDI4NjAKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBXUERNQV9SU1RfSURYLCAweDEwMDNmKTsJLy8gMHgxMDAwMCBmb3IgcmVzZXQgcngsIDB4M2YgcmVzZXRzIGFsbCA2IHR4IHJpbmdzLgorCVJUTVBfSU9fV1JJVEUzMihwQWQsIFBCRl9TWVNfQ1RSTCwgMHhlMWYpOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIFBCRl9TWVNfQ1RSTCwgMHhlMDApOworI2VuZGlmIC8vIFJUMjg2MCAvLworCisJLy8gSW5pdGlhbHplIEFTSUMgZm9yIFRYICYgUnggb3BlcmF0aW9uCisJaWYgKE5JQ0luaXRpYWxpemVBc2ljKHBBZCAsIGJIYXJkUmVzZXQpICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJeworCQlpZiAoaisrID09IDApCisJCXsKKwkJCU5JQ0xvYWRGaXJtd2FyZShwQWQpOworCQkJZ290byByZXRyeTsKKwkJfQorCQlyZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRTsKKwl9CisKKworI2lmZGVmIFJUMjg2MAorCS8vIFdyaXRlIEFDX0JLIGJhc2UgYWRkcmVzcyByZWdpc3RlcgorCVZhbHVlID0gUlRNUF9HZXRQaHlzaWNhbEFkZHJlc3NMb3cocEFkLT5UeFJpbmdbUUlEX0FDX0JLXS5DZWxsWzBdLkFsbG9jUGEpOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX0JBU0VfUFRSMSwgVmFsdWUpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPiBUWF9CQVNFX1BUUjEgOiAweCV4XG4iLCBWYWx1ZSkpOworCisJLy8gV3JpdGUgQUNfQkUgYmFzZSBhZGRyZXNzIHJlZ2lzdGVyCisJVmFsdWUgPSBSVE1QX0dldFBoeXNpY2FsQWRkcmVzc0xvdyhwQWQtPlR4UmluZ1tRSURfQUNfQkVdLkNlbGxbMF0uQWxsb2NQYSk7CisJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfQkFTRV9QVFIwLCBWYWx1ZSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+IFRYX0JBU0VfUFRSMCA6IDB4JXhcbiIsIFZhbHVlKSk7CisKKwkvLyBXcml0ZSBBQ19WSSBiYXNlIGFkZHJlc3MgcmVnaXN0ZXIKKwlWYWx1ZSA9IFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzTG93KHBBZC0+VHhSaW5nW1FJRF9BQ19WSV0uQ2VsbFswXS5BbGxvY1BhKTsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9CQVNFX1BUUjIsIFZhbHVlKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLT4gVFhfQkFTRV9QVFIyIDogMHgleFxuIiwgVmFsdWUpKTsKKworCS8vIFdyaXRlIEFDX1ZPIGJhc2UgYWRkcmVzcyByZWdpc3RlcgorCVZhbHVlID0gUlRNUF9HZXRQaHlzaWNhbEFkZHJlc3NMb3cocEFkLT5UeFJpbmdbUUlEX0FDX1ZPXS5DZWxsWzBdLkFsbG9jUGEpOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX0JBU0VfUFRSMywgVmFsdWUpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPiBUWF9CQVNFX1BUUjMgOiAweCV4XG4iLCBWYWx1ZSkpOworCisJLy8gV3JpdGUgSENDQSBiYXNlIGFkZHJlc3MgcmVnaXN0ZXIKKwkgIFZhbHVlID0gUlRNUF9HZXRQaHlzaWNhbEFkZHJlc3NMb3cocEFkLT5UeFJpbmdbUUlEX0hDQ0FdLkNlbGxbMF0uQWxsb2NQYSk7CisJICBSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9CQVNFX1BUUjQsIFZhbHVlKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLT4gVFhfQkFTRV9QVFI0IDogMHgleFxuIiwgVmFsdWUpKTsKKworCS8vIFdyaXRlIE1HTVRfQkFTRV9DU1IgcmVnaXN0ZXIKKwlWYWx1ZSA9IFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzTG93KHBBZC0+TWdtdFJpbmcuQ2VsbFswXS5BbGxvY1BhKTsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9CQVNFX1BUUjUsIFZhbHVlKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLT4gVFhfQkFTRV9QVFI1IDogMHgleFxuIiwgVmFsdWUpKTsKKworCS8vIFdyaXRlIFJYX0JBU0VfQ1NSIHJlZ2lzdGVyCisJVmFsdWUgPSBSVE1QX0dldFBoeXNpY2FsQWRkcmVzc0xvdyhwQWQtPlJ4UmluZy5DZWxsWzBdLkFsbG9jUGEpOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIFJYX0JBU0VfUFRSLCBWYWx1ZSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+IFJYX0JBU0VfUFRSIDogMHgleFxuIiwgVmFsdWUpKTsKKworCS8vIEluaXQgUlggUmluZyBpbmRleCBwb2ludGVyCisJcEFkLT5SeFJpbmcuUnhTd1JlYWRJZHggPSAwOworCXBBZC0+UnhSaW5nLlJ4Q3B1SWR4ID0gUlhfUklOR19TSVpFLTE7CisJUlRNUF9JT19XUklURTMyKHBBZCwgUlhfQ1JYX0lEWCwgcEFkLT5SeFJpbmcuUnhDcHVJZHgpOworCisJLy8gSW5pdCBUWCByaW5ncyBpbmRleCBwb2ludGVyCisJeworCQlmb3IgKGk9MDsgaTxOVU1fT0ZfVFhfUklORzsgaSsrKQorCQl7CisJCQlwQWQtPlR4UmluZ1tpXS5UeFN3RnJlZUlkeCA9IDA7CisJCQlwQWQtPlR4UmluZ1tpXS5UeENwdUlkeCA9IDA7CisJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCAoVFhfQ1RYX0lEWDAgKyBpICogMHgxMCkgLCAgcEFkLT5UeFJpbmdbaV0uVHhDcHVJZHgpOworCQl9CisJfQorCisJLy8gaW5pdCBNR01UIHJpbmcgaW5kZXggcG9pbnRlcgorCXBBZC0+TWdtdFJpbmcuVHhTd0ZyZWVJZHggPSAwOworCXBBZC0+TWdtdFJpbmcuVHhDcHVJZHggPSAwOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX01HTVRDVFhfSURYLCAgcEFkLT5NZ210UmluZy5UeENwdUlkeCk7CisKKwkvLworCS8vIHNldCBlYWNoIFJpbmcncyBTSVpFICBpbnRvIEFTSUMuIERlc2NyaXB0b3IgU2l6ZSBpcyBmaXhlZCBieSBkZXNpZ24uCisJLy8KKworCS8vIFdyaXRlIFRYX1JJTkdfQ1NSMCByZWdpc3RlcgorCVZhbHVlID0gVFhfUklOR19TSVpFOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX01BWF9DTlQwLCBWYWx1ZSk7CisJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfTUFYX0NOVDEsIFZhbHVlKTsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9NQVhfQ05UMiwgVmFsdWUpOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX01BWF9DTlQzLCBWYWx1ZSk7CisJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfTUFYX0NOVDQsIFZhbHVlKTsKKwlWYWx1ZSA9IE1HTVRfUklOR19TSVpFOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX01HTVRNQVhfQ05ULCBWYWx1ZSk7CisKKwkvLyBXcml0ZSBSWF9SSU5HX0NTUiByZWdpc3RlcgorCVZhbHVlID0gUlhfUklOR19TSVpFOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIFJYX01BWF9DTlQsIFZhbHVlKTsKKyNlbmRpZiAvLyBSVDI4NjAgLy8KKworCisJLy8gV01NIHBhcmFtZXRlcgorCWNzcjAud29yZCA9IDA7CisJUlRNUF9JT19XUklURTMyKHBBZCwgV01NX1RYT1AwX0NGRywgY3NyMC53b3JkKTsKKwlpZiAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFCKQorCXsKKwkJY3NyMC5maWVsZC5BYzBUeG9wID0gMTkyOwkvLyBBQ19WSTogMTkyKjMydXMgfj0gNm1zCisJCWNzcjAuZmllbGQuQWMxVHhvcCA9IDk2OwkvLyBBQ19WTzogOTYqMzJ1cyAgfj0gM21zCisJfQorCWVsc2UKKwl7CisJCWNzcjAuZmllbGQuQWMwVHhvcCA9IDk2OwkvLyBBQ19WSTogOTYqMzJ1cyB+PSAzbXMKKwkJY3NyMC5maWVsZC5BYzFUeG9wID0gNDg7CS8vIEFDX1ZPOiA0OCozMnVzIH49IDEuNW1zCisJfQorCVJUTVBfSU9fV1JJVEUzMihwQWQsIFdNTV9UWE9QMV9DRkcsIGNzcjAud29yZCk7CisKKworI2lmZGVmIFJUMjg2MAorCS8vIDMuIFNldCBETUEgZ2xvYmFsIGNvbmZpZ3VyYXRpb24gZXhjZXB0IFRYX0RNQV9FTiBhbmQgUlhfRE1BX0VOIGJpdHM6CisJaSA9IDA7CisJZG8KKwl7CisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgV1BETUFfR0xPX0NGRywgJkdsb0NmZy53b3JkKTsKKwkJaWYgKChHbG9DZmcuZmllbGQuVHhETUFCdXN5ID09IDApICAmJiAoR2xvQ2ZnLmZpZWxkLlJ4RE1BQnVzeSA9PSAwKSkKKwkJCWJyZWFrOworCisJCVJUTVB1c2VjRGVsYXkoMTAwMCk7CisJCWkrKzsKKwl9d2hpbGUgKCBpIDwgMTAwKTsKKworCUdsb0NmZy53b3JkICY9IDB4ZmYwOworCUdsb0NmZy5maWVsZC5FblRYV3JpdGVCYWNrRERPTkUgPTE7CisJUlRNUF9JT19XUklURTMyKHBBZCwgV1BETUFfR0xPX0NGRywgR2xvQ2ZnLndvcmQpOworCisJSW50Q2ZnLndvcmQgPSAwOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIERFTEFZX0lOVF9DRkcsIEludENmZy53b3JkKTsKKyNlbmRpZiAvLyBSVDI4NjAgLy8KKworCisJLy8gcmVzZXQgYWN0aW9uCisJLy8gTG9hZCBmaXJtd2FyZQorCS8vICBTdGF0dXMgPSBOSUNMb2FkRmlybXdhcmUocEFkKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjwtLSBOSUNJbml0aWFsaXplQWRhcHRlclxuIikpOworCXJldHVybiBTdGF0dXM7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlJbml0aWFsaXplIEFTSUMKKworCUFyZ3VtZW50czoKKwkJQWRhcHRlcgkJCQkJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitORElTX1NUQVRVUwlOSUNJbml0aWFsaXplQXNpYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiAgQk9PTEVBTgkJYkhhcmRSZXNldCkKK3sKKwlVTE9ORwkJCUluZGV4ID0gMDsKKwlVQ0hBUgkJCVIwID0gMHhmZjsKKwlVSU5UMzIJCQlNYWNDc3IxMiA9IDAsIENvdW50ZXIgPSAwOworCVVTSE9SVAkJCUtleUlkeDsKKwlJTlQJCQkJaSxhcGlkeDsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPiBOSUNJbml0aWFsaXplQXNpY1xuIikpOworCisjaWZkZWYgUlQyODYwCisJaWYgKGJIYXJkUmVzZXQgPT0gVFJVRSkKKwl7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgMHgzKTsKKwl9CisJZWxzZQorCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIDB4MSk7CisKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIDB4MCk7CisJLy8gSW5pdGlhbGl6ZSBNQUMgcmVnaXN0ZXIgdG8gZGVmYXVsdCB2YWx1ZQorCWZvciAoSW5kZXggPSAwOyBJbmRleCA8IE5VTV9NQUNfUkVHX1BBUk1TOyBJbmRleCsrKQorCXsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDUmVnVGFibGVbSW5kZXhdLlJlZ2lzdGVyLCBNQUNSZWdUYWJsZVtJbmRleF0uVmFsdWUpOworCX0KKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwl7CisJCWZvciAoSW5kZXggPSAwOyBJbmRleCA8IE5VTV9TVEFfTUFDX1JFR19QQVJNUzsgSW5kZXgrKykKKwkJeworCQkJUlRNUF9JT19XUklURTMyKHBBZCwgU1RBTUFDUmVnVGFibGVbSW5kZXhdLlJlZ2lzdGVyLCBTVEFNQUNSZWdUYWJsZVtJbmRleF0uVmFsdWUpOworCQl9CisJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworI2VuZGlmIC8vIFJUMjg2MCAvLworCisKKwkvLworCS8vIEJlZm9yZSBwcm9ncmFtIEJCUCwgd2UgbmVlZCB0byB3YWl0IEJCUC9SRiBnZXQgd2FrZSB1cC4KKwkvLworCUluZGV4ID0gMDsKKwlkbworCXsKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBNQUNfU1RBVFVTX0NGRywgJk1hY0NzcjEyKTsKKworCQlpZiAoKE1hY0NzcjEyICYgMHgwMykgPT0gMCkJLy8gaWYgQkIuUkYgaXMgc3RhYmxlCisJCQlicmVhazsKKworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDaGVjayBNQUNfU1RBVFVTX0NGRyAgPSBCdXN5ID0gJXhcbiIsIE1hY0NzcjEyKSk7CisJCVJUTVB1c2VjRGVsYXkoMTAwMCk7CisJfSB3aGlsZSAoSW5kZXgrKyA8IDEwMCk7CisKKyAgICAvLyBUaGUgY29tbWFuZHMgdG8gZmlybXdhcmUgc2hvdWxkIGJlIGFmdGVyIHRoZXNlIGNvbW1hbmRzLCB0aGVzZSBjb21tYW5kcyB3aWxsIGluaXQgZmlybXdhcmUKKwkvLyBQQ0kgYW5kIFVTQiBhcmUgbm90IHRoZSBzYW1lIGJlY2F1c2UgUENJIGRyaXZlciBuZWVkcyB0byB3YWl0IGZvciBQQ0kgYnVzIHJlYWR5CisJUlRNUF9JT19XUklURTMyKHBBZCwgSDJNX0JCUF9BR0VOVCwgMCk7CS8vIGluaXRpYWxpemUgQkJQIFIvVyBhY2Nlc3MgYWdlbnQKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBIMk1fTUFJTEJPWF9DU1IsIDApOworCVJUTVB1c2VjRGVsYXkoMTAwMCk7CisKKwkvLyBSZWFkIEJCUCByZWdpc3RlciwgbWFrZSBzdXJlIEJCUCBpcyB1cCBhbmQgcnVubmluZyBiZWZvcmUgd3JpdGUgbmV3IGRhdGEKKwlJbmRleCA9IDA7CisJZG8KKwl7CisJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMCwgJlIwKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQkJQIHZlcnNpb24gPSAleFxuIiwgUjApKTsKKwl9IHdoaWxlICgoKytJbmRleCA8IDIwKSAmJiAoKFIwID09IDB4ZmYpIHx8IChSMCA9PSAweDAwKSkpOworCS8vQVNTRVJUKEluZGV4IDwgMjApOyAvL3RoaXMgd2lsbCBjYXVzZSBCU09EIG9uIENoZWNrLWJ1aWxkIGRyaXZlcgorCisJaWYgKChSMCA9PSAweGZmKSB8fCAoUjAgPT0gMHgwMCkpCisJCXJldHVybiBORElTX1NUQVRVU19GQUlMVVJFOworCisJLy8gSW5pdGlhbGl6ZSBCQlAgcmVnaXN0ZXIgdG8gZGVmYXVsdCB2YWx1ZQorCWZvciAoSW5kZXggPSAwOyBJbmRleCA8IE5VTV9CQlBfUkVHX1BBUk1TOyBJbmRleCsrKQorCXsKKwkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUFJlZ1RhYmxlW0luZGV4XS5SZWdpc3RlciwgQkJQUmVnVGFibGVbSW5kZXhdLlZhbHVlKTsKKwl9CisKKwkvLyBmb3IgcnQyODYwRSBhbmQgYWZ0ZXIsIGluaXQgQkJQX1I4NCB3aXRoIDB4MTkuIFRoaXMgaXMgZm9yIGV4dGVuc2lvbiBjaGFubmVsIG92ZXJsYXBwaW5nIElPVC4KKwlpZiAoKHBBZC0+TUFDVmVyc2lvbiYweGZmZmYpICE9IDB4MDEwMSkKKwkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SODQsIDB4MTkpOworCisKKwlpZiAocEFkLT5NQUNWZXJzaW9uID09IDB4Mjg2MDAxMDApCisJeworCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2OSwgMHgxNik7CisJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjczLCAweDEyKTsKKyAgICB9CisKKwlpZiAocEFkLT5NQUNWZXJzaW9uID49IFJBTElOS18yODgwRV9WRVJTSU9OICYmIHBBZC0+TUFDVmVyc2lvbiA8IFJBTElOS18zMDcwX1ZFUlNJT04pIC8vIDMqMworCXsKKwkJLy8gZW5sYXJnZSBNQVhfTEVOX0NGRworCQlVSU5UMzIgY3NyOworCQlSVE1QX0lPX1JFQUQzMihwQWQsIE1BWF9MRU5fQ0ZHLCAmY3NyKTsKKwkJY3NyICY9IDB4RkZGOworCQljc3IgfD0gMHgyMDAwOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQVhfTEVOX0NGRywgY3NyKTsKKwl9CisKKworCS8vIEFkZCByYWRpbyBvZmYgY29udHJvbAorI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJeworCQlpZiAocEFkLT5TdGFDZmcuYlJhZGlvID09IEZBTFNFKQorCQl7CisvLwkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFBXUl9QSU5fQ0ZHLCAweDAwMDAxODE4KTsKKwkJCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JBRElPX09GRik7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQgUmFkaW8gT2ZmXG4iKSk7CisJCX0KKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwkvLyBDbGVhciByYXcgY291bnRlcnMKKwlSVE1QX0lPX1JFQUQzMihwQWQsIFJYX1NUQV9DTlQwLCAmQ291bnRlcik7CisJUlRNUF9JT19SRUFEMzIocEFkLCBSWF9TVEFfQ05UMSwgJkNvdW50ZXIpOworCVJUTVBfSU9fUkVBRDMyKHBBZCwgUlhfU1RBX0NOVDIsICZDb3VudGVyKTsKKwlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX1NUQV9DTlQwLCAmQ291bnRlcik7CisJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9TVEFfQ05UMSwgJkNvdW50ZXIpOworCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfU1RBX0NOVDIsICZDb3VudGVyKTsKKworCS8vIEFTSUMgd2lsbCBrZWVwIGdhcmJhZ2UgdmFsdWUgYWZ0ZXIgYm9vdAorCS8vIENsZWFyIGFsbCBzZWFyZWQga2V5IHRhYmxlIHdoZW4gaW5pdGlhbAorCS8vIFRoaXMgcm91dGluZSBjYW4gYmUgaWdub3JlZCBpbiByYWRpby1PTi9PRkYgb3BlcmF0aW9uLgorCWlmIChiSGFyZFJlc2V0KQorCXsKKwkJZm9yIChLZXlJZHggPSAwOyBLZXlJZHggPCA0OyBLZXlJZHgrKykKKwkJeworCQkJUlRNUF9JT19XUklURTMyKHBBZCwgU0hBUkVEX0tFWV9NT0RFX0JBU0UgKyA0KktleUlkeCwgMCk7CisJCX0KKworCQkvLyBDbGVhciBhbGwgcGFpcndpc2Uga2V5IHRhYmxlIHdoZW4gaW5pdGlhbAorCQlmb3IgKEtleUlkeCA9IDA7IEtleUlkeCA8IDI1NjsgS2V5SWR4KyspCisJCXsKKwkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19XQ0lEX0FUVFJJQlVURV9CQVNFICsgKEtleUlkeCAqIEhXX1dDSURfQVRUUklfU0laRSksIDEpOworCQl9CisJfQorCisKKwkvLyBJdCBpc24ndCBuZWNlc3NhcnkgdG8gY2xlYXIgdGhpcyBzcGFjZSB3aGVuIG5vdCBoYXJkIHJlc2V0LgorCWlmIChiSGFyZFJlc2V0ID09IFRSVUUpCisJeworCQkvLyBjbGVhciBhbGwgb24tY2hpcCBCRUFDT04gZnJhbWUgc3BhY2UKKwkJZm9yIChhcGlkeCA9IDA7IGFwaWR4IDwgSFdfQkVBQ09OX01BWF9DT1VOVDsgYXBpZHgrKykKKwkJeworCQkJZm9yIChpID0gMDsgaSA8IEhXX0JFQUNPTl9PRkZTRVQ+PjI7IGkrPTQpCisJCQkJUlRNUF9JT19XUklURTMyKHBBZCwgcEFkLT5CZWFjb25PZmZzZXRbYXBpZHhdICsgaSwgMHgwMCk7CisJCX0KKwl9CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCXsKKwkJLy8gZm9yIHJ0Mjg2MEUgYW5kIGFmdGVyLCBpbml0IFRYT1BfQ1RSTF9DRkcgd2l0aCAweDU4M2YuIFRoaXMgaXMgZm9yIGV4dGVuc2lvbiBjaGFubmVsIG92ZXJsYXBwaW5nIElPVC4KKwkJaWYgKChwQWQtPk1BQ1ZlcnNpb24mMHhmZmZmKSAhPSAweDAxMDEpCisJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWE9QX0NUUkxfQ0ZHLCAweDU4M2YpOworCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjwtLSBOSUNJbml0aWFsaXplQXNpY1xuIikpOworCXJldHVybiBORElTX1NUQVRVU19TVUNDRVNTOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJUmVzZXQgTklDIEFzaWNzCisKKwlBcmd1bWVudHM6CisJCUFkYXB0ZXIJCQkJCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCUlSUUwgPSBQQVNTSVZFX0xFVkVMCisKKwlOb3RlOgorCQlSZXNldCBOSUMgdG8gaW5pdGlhbCBzdGF0ZSBBUyBJUyBzeXN0ZW0gYm9vdCB1cCB0aW1lLgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlOSUNJc3N1ZVJlc2V0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKQoreworCVVJTlQzMglWYWx1ZSA9IDA7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+IE5JQ0lzc3VlUmVzZXRcbiIpKTsKKworCS8vIERpc2FibGUgUngsIHJlZ2lzdGVyIHZhbHVlIHN1cHBvc2VkIHdpbGwgcmVtYWluIGFmdGVyIHJlc2V0CisJUlRNUF9JT19SRUFEMzIocEFkLCBNQUNfU1lTX0NUUkwsICZWYWx1ZSk7CisJVmFsdWUgJj0gKDB4ZmZmZmZmZjMpOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgVmFsdWUpOworCisJLy8gSXNzdWUgcmVzZXQgYW5kIGNsZWFyIGZyb20gcmVzZXQgc3RhdGUKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIDB4MDMpOyAvLyAyMDA0LTA5LTE3IGNoYW5nZSBmcm9tIDB4MDEKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIDB4MDApOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPC0tIE5JQ0lzc3VlUmVzZXRcbiIpKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCUNoZWNrIEFTSUMgcmVnaXN0ZXJzIGFuZCBmaW5kIGFueSByZWFzb24gdGhlIHN5c3RlbSBtaWdodCBoYW5nCisKKwlBcmd1bWVudHM6CisJCUFkYXB0ZXIJCQkJCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworQk9PTEVBTglOSUNDaGVja0ZvckhhbmcoCisJSU4JUFJUTVBfQURBUFRFUglwQWQpCit7CisJcmV0dXJuIChGQUxTRSk7Cit9CisKK1ZPSUQgTklDVXBkYXRlRmlmb1N0YUNvdW50ZXJzKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCVRYX1NUQV9GSUZPX1NUUlVDCVN0YUZpZm87CisJTUFDX1RBQkxFX0VOVFJZCQkqcEVudHJ5OworCVVDSEFSCQkJCWkgPSAwOworCVVDSEFSCQkJcGlkID0gMCwgd2NpZCA9IDA7CisJQ0hBUgkJCQlyZVRyeTsKKwlVQ0hBUgkJCQlzdWNjTUNTOworCisjaWZkZWYgUkFMSU5LX0FURQorCS8qIE5vdGhpbmcgdG8gZG8gaW4gQVRFIG1vZGUgKi8KKwlpZiAoQVRFX09OKHBBZCkpCisJCXJldHVybjsKKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisKKwkJZG8KKwkJeworCQkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9TVEFfRklGTywgJlN0YUZpZm8ud29yZCk7CisKKwkJCWlmIChTdGFGaWZvLmZpZWxkLmJWYWxpZCA9PSAwKQorCQkJCWJyZWFrOworCisJCQl3Y2lkID0gKFVDSEFSKVN0YUZpZm8uZmllbGQud2NpZDsKKworCisJCS8qIGlnbm9yZSBOb0FDSyBhbmQgTUdNVCBmcmFtZSB1c2UgMHhGRiBhcyBXQ0lEICovCisJCQlpZiAoKFN0YUZpZm8uZmllbGQuVHhBY2tSZXF1aXJlZCA9PSAwKSB8fCAod2NpZCA+PSBNQVhfTEVOX09GX01BQ19UQUJMRSkpCisJCQl7CisJCQkJaSsrOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQkvKiBQSUQgc3RvcmUgVHggTUNTIFJhdGUgKi8KKwkJCXBpZCA9IChVQ0hBUilTdGFGaWZvLmZpZWxkLlBpZFR5cGU7CisKKwkJCXBFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W3djaWRdOworCisJCQlwRW50cnktPkRlYnVnRklGT0NvdW50Kys7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCWlmIChTdGFGaWZvLmZpZWxkLlR4QkYpIC8vIDMqMworCQkJCXBFbnRyeS0+VHhCRkNvdW50Kys7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKyNpZmRlZiBVQVBTRF9BUF9TVVBQT1JUCisJCQlVQVBTRF9TUF9BVUVfSGFuZGxlKHBBZCwgcEVudHJ5LCBTdGFGaWZvLmZpZWxkLlR4U3VjY2Vzcyk7CisjZW5kaWYgLy8gVUFQU0RfQVBfU1VQUE9SVCAvLworCisJCQlpZiAoIVN0YUZpZm8uZmllbGQuVHhTdWNjZXNzKQorCQkJeworCQkJCXBFbnRyeS0+RklGT0NvdW50Kys7CisJCQkJcEVudHJ5LT5PbmVTZWNUeEZhaWxDb3VudCsrOworCisJCQkJaWYgKHBFbnRyeS0+RklGT0NvdW50ID49IDEpCisJCQkJeworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIjIikpOworI2lmIDAKKwkJCQkJU2VuZFJlZnJlc2hCQVIocEFkLCBwRW50cnkpOworCQkJCQlwRW50cnktPk5vQkFEYXRhQ291bnREb3duID0gNjQ7CisjZWxzZQorI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJCQlwRW50cnktPk5vQkFEYXRhQ291bnREb3duID0gNjQ7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwkJCQkJaWYocEVudHJ5LT5Qc01vZGUgPT0gUFdSX0FDVElWRSkKKwkJCQkJeworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJCQkJaW50IHRpZDsKKwkJCQkJCWZvciAodGlkPTA7IHRpZDxOVU1fT0ZfVElEOyB0aWQrKykKKwkJCQkJCXsKKwkJCQkJCQlCQU9yaVNlc3Npb25UZWFyRG93bihwQWQsIHBFbnRyeS0+QWlkLCAgdGlkLCBGQUxTRSwgRkFMU0UpOworCQkJCQkJfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJCQkJCQkvLyBVcGRhdGUgdGhlIGNvbnRpbnVvdXMgdHJhbnNtaXNzaW9uIGNvdW50ZXIgZXhjZXB0IFBTIG1vZGUKKwkJCQkJCXBFbnRyeS0+Q29udGludWVUeEZhaWxDbnQrKzsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCS8vIENsZWFyIHRoZSBGSUZPQ291bnQgd2hlbiBzdGEgaW4gUG93ZXIgU2F2ZSBtb2RlLiBCYXNpY2FsbHkgd2UgYXNzdW1lCisJCQkJCQkvLyAgICAgdGhpcyB0eCBlcnJvciBoYXBwZW5lZCBkdWUgdG8gc3RhIGp1c3QgZ28gdG8gc2xlZXAuCisJCQkJCQlwRW50cnktPkZJRk9Db3VudCA9IDA7CisJCQkJCQlwRW50cnktPkNvbnRpbnVlVHhGYWlsQ250ID0gMDsKKwkJCQkJfQorI2VuZGlmCisJCQkJCS8vcEVudHJ5LT5GSUZPQ291bnQgPSAwOworCQkJCX0KKwkJCQkvL3BFbnRyeS0+YlNlbmRCQVIgPSBUUlVFOworCQkJfQorCQkJZWxzZQorCQkJeworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJCWlmICgocEVudHJ5LT5Qc01vZGUgIT0gUFdSX1NBVkUpICYmIChwRW50cnktPk5vQkFEYXRhQ291bnREb3duID4gMCkpCisJCQkJeworCQkJCQlwRW50cnktPk5vQkFEYXRhQ291bnREb3duLS07CisJCQkJCWlmIChwRW50cnktPk5vQkFEYXRhQ291bnREb3duPT0wKQorCQkJCQl7CisJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJAXG4iKSk7CisJCQkJCX0KKwkJCQl9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCQkJcEVudHJ5LT5GSUZPQ291bnQgPSAwOworCQkJCXBFbnRyeS0+T25lU2VjVHhOb1JldHJ5T2tDb3VudCsrOworCQkJCS8vIHVwZGF0ZSBOb0RhdGFJZGxlQ291bnQgd2hlbiBzdWNlc3NmdWwgc2VuZCBwYWNrZXQgdG8gU1RBLgorCQkJCXBFbnRyeS0+Tm9EYXRhSWRsZUNvdW50ID0gMDsKKwkJCQlwRW50cnktPkNvbnRpbnVlVHhGYWlsQ250ID0gMDsKKwkJCX0KKworCQkJc3VjY01DUyA9IFN0YUZpZm8uZmllbGQuU3VjY2Vzc1JhdGUgJiAweDdGOworCisJCQlyZVRyeSA9IHBpZCAtIHN1Y2NNQ1M7CisKKwkJCWlmIChTdGFGaWZvLmZpZWxkLlR4U3VjY2VzcykKKwkJCXsKKwkJCQlwRW50cnktPlRYTUNTRXhwZWN0ZWRbcGlkXSsrOworCQkJCWlmIChwaWQgPT0gc3VjY01DUykKKwkJCQl7CisJCQkJCXBFbnRyeS0+VFhNQ1NTdWNjZXNzZnVsW3BpZF0rKzsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJcEVudHJ5LT5UWE1DU0F1dG9GYWxsQmFja1twaWRdW3N1Y2NNQ1NdKys7CisJCQkJfQorCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXBFbnRyeS0+VFhNQ1NGYWlsZWRbcGlkXSsrOworCQkJfQorCisJCQlpZiAocmVUcnkgPiAwKQorCQkJeworCQkJCWlmICgocGlkID49IDEyKSAmJiBzdWNjTUNTIDw9NykKKwkJCQl7CisJCQkJCXJlVHJ5IC09IDQ7CisJCQkJfQorCQkJCXBFbnRyeS0+T25lU2VjVHhSZXRyeU9rQ291bnQgKz0gcmVUcnk7CisJCQl9CisKKwkJCWkrKzsKKwkJCS8vIEFTSUMgc3RvcmUgMTYgc3RhY2sKKwkJfSB3aGlsZSAoIGkgPCAoMipUWF9SSU5HX1NJWkUpICk7CisKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVJlYWQgc3RhdGlzdGljYWwgY291bnRlcnMgZnJvbSBoYXJkd2FyZSByZWdpc3RlcnMgYW5kIHJlY29yZCB0aGVtCisJCWluIHNvZnR3YXJlIHZhcmlhYmxlcyBmb3IgbGF0ZXIgb24gcXVlcnkKKworCUFyZ3VtZW50czoKKwkJcEFkCQkJCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBOSUNVcGRhdGVSYXdDb3VudGVycygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlVSU5UMzIJT2xkVmFsdWU7CisJUlhfU1RBX0NOVDBfU1RSVUMJIFJ4U3RhQ250MDsKKwlSWF9TVEFfQ05UMV9TVFJVQyAgIFJ4U3RhQ250MTsKKwlSWF9TVEFfQ05UMl9TVFJVQyAgIFJ4U3RhQ250MjsKKwlUWF9TVEFfQ05UMF9TVFJVQyAJIFR4U3RhQ250MDsKKwlUWF9TVEFfQ05UMV9TVFJVQwkgU3RhVHgxOworCVRYX1NUQV9DTlQyX1NUUlVDCSBTdGFUeDI7CisJVFhfQUdHX0NOVF9TVFJVQwlUeEFnZ0NudDsKKwlUWF9BR0dfQ05UMF9TVFJVQwlUeEFnZ0NudDA7CisJVFhfQUdHX0NOVDFfU1RSVUMJVHhBZ2dDbnQxOworCVRYX0FHR19DTlQyX1NUUlVDCVR4QWdnQ250MjsKKwlUWF9BR0dfQ05UM19TVFJVQwlUeEFnZ0NudDM7CisJVFhfQUdHX0NOVDRfU1RSVUMJVHhBZ2dDbnQ0OworCVRYX0FHR19DTlQ1X1NUUlVDCVR4QWdnQ250NTsKKwlUWF9BR0dfQ05UNl9TVFJVQwlUeEFnZ0NudDY7CisJVFhfQUdHX0NOVDdfU1RSVUMJVHhBZ2dDbnQ3OworCisJUlRNUF9JT19SRUFEMzIocEFkLCBSWF9TVEFfQ05UMCwgJlJ4U3RhQ250MC53b3JkKTsKKwlSVE1QX0lPX1JFQUQzMihwQWQsIFJYX1NUQV9DTlQyLCAmUnhTdGFDbnQyLndvcmQpOworCisJeworCQlSVE1QX0lPX1JFQUQzMihwQWQsIFJYX1NUQV9DTlQxLCAmUnhTdGFDbnQxLndvcmQpOworCSAgICAvLyBVcGRhdGUgUlggUExDUCBlcnJvciBjb3VudGVyCisJICAgIHBBZC0+UHJpdmF0ZUluZm8uUGh5UnhFcnJDbnQgKz0gUnhTdGFDbnQxLmZpZWxkLlBsY3BFcnI7CisJCS8vIFVwZGF0ZSBGYWxzZSBDQ0EgY291bnRlcgorCQlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY0ZhbHNlQ0NBQ250ICs9IFJ4U3RhQ250MS5maWVsZC5GYWxzZUNjYTsKKwl9CisKKwkvLyBVcGRhdGUgRkNTIGNvdW50ZXJzCisJT2xkVmFsdWU9IHBBZC0+V2xhbkNvdW50ZXJzLkZDU0Vycm9yQ291bnQudS5Mb3dQYXJ0OworCXBBZC0+V2xhbkNvdW50ZXJzLkZDU0Vycm9yQ291bnQudS5Mb3dQYXJ0ICs9IChSeFN0YUNudDAuZmllbGQuQ3JjRXJyKTsgLy8gPj4gNyk7CisJaWYgKHBBZC0+V2xhbkNvdW50ZXJzLkZDU0Vycm9yQ291bnQudS5Mb3dQYXJ0IDwgT2xkVmFsdWUpCisJCXBBZC0+V2xhbkNvdW50ZXJzLkZDU0Vycm9yQ291bnQudS5IaWdoUGFydCsrOworCisJLy8gQWRkIEZDUyBlcnJvciBjb3VudCB0byBwcml2YXRlIGNvdW50ZXJzCisJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNSeEZjc0VyckNudCArPSBSeFN0YUNudDAuZmllbGQuQ3JjRXJyOworCU9sZFZhbHVlID0gcEFkLT5SYWxpbmtDb3VudGVycy5SZWFsRmNzRXJyQ291bnQudS5Mb3dQYXJ0OworCXBBZC0+UmFsaW5rQ291bnRlcnMuUmVhbEZjc0VyckNvdW50LnUuTG93UGFydCArPSBSeFN0YUNudDAuZmllbGQuQ3JjRXJyOworCWlmIChwQWQtPlJhbGlua0NvdW50ZXJzLlJlYWxGY3NFcnJDb3VudC51Lkxvd1BhcnQgPCBPbGRWYWx1ZSkKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5SZWFsRmNzRXJyQ291bnQudS5IaWdoUGFydCsrOworCisJLy8gVXBkYXRlIER1cGxpY2F0ZSBSY3YgY2hlY2sKKwlwQWQtPlJhbGlua0NvdW50ZXJzLkR1cGxpY2F0ZVJjdiArPSBSeFN0YUNudDIuZmllbGQuUnhEdXBsaUNvdW50OworCXBBZC0+V2xhbkNvdW50ZXJzLkZyYW1lRHVwbGljYXRlQ291bnQudS5Mb3dQYXJ0ICs9IFJ4U3RhQ250Mi5maWVsZC5SeER1cGxpQ291bnQ7CisJLy8gVXBkYXRlIFJYIE92ZXJmbG93IGNvdW50ZXIKKwlwQWQtPkNvdW50ZXJzODAyMy5SeE5vQnVmZmVyICs9IChSeFN0YUNudDIuZmllbGQuUnhGaWZvT3ZlcmZsb3dDb3VudCk7CisKKwlpZiAoIXBBZC0+YlVwZGF0ZUJjbkNudERvbmUpCisJeworCS8vIFVwZGF0ZSBCRUFDT04gc2VudCBjb3VudAorCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfU1RBX0NOVDAsICZUeFN0YUNudDAud29yZCk7CisJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9TVEFfQ05UMSwgJlN0YVR4MS53b3JkKTsKKwlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX1NUQV9DTlQyLCAmU3RhVHgyLndvcmQpOworCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjQmVhY29uU2VudENudCArPSBUeFN0YUNudDAuZmllbGQuVHhCZWFjb25Db3VudDsKKwlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4UmV0cnlPa0NvdW50ICs9IFN0YVR4MS5maWVsZC5UeFJldHJhbnNtaXQ7CisJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeE5vUmV0cnlPa0NvdW50ICs9IFN0YVR4MS5maWVsZC5UeFN1Y2Nlc3M7CisJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeEZhaWxDb3VudCArPSBUeFN0YUNudDAuZmllbGQuVHhGYWlsQ291bnQ7CisJcEFkLT5XbGFuQ291bnRlcnMuVHJhbnNtaXR0ZWRGcmFnbWVudENvdW50LnUuTG93UGFydCArPSBTdGFUeDEuZmllbGQuVHhTdWNjZXNzOworCXBBZC0+V2xhbkNvdW50ZXJzLlJldHJ5Q291bnQudS5Mb3dQYXJ0ICs9IFN0YVR4MS5maWVsZC5UeFJldHJhbnNtaXQ7CisJcEFkLT5XbGFuQ291bnRlcnMuRmFpbGVkQ291bnQudS5Mb3dQYXJ0ICs9IFR4U3RhQ250MC5maWVsZC5UeEZhaWxDb3VudDsKKwl9CisKKwl7CisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfQUdHX0NOVCwgJlR4QWdnQ250LndvcmQpOworCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0FHR19DTlQwLCAmVHhBZ2dDbnQwLndvcmQpOworCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0FHR19DTlQxLCAmVHhBZ2dDbnQxLndvcmQpOworCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0FHR19DTlQyLCAmVHhBZ2dDbnQyLndvcmQpOworCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0FHR19DTlQzLCAmVHhBZ2dDbnQzLndvcmQpOworCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0FHR19DTlQ0LCAmVHhBZ2dDbnQ0LndvcmQpOworCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0FHR19DTlQ1LCAmVHhBZ2dDbnQ1LndvcmQpOworCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0FHR19DTlQ2LCAmVHhBZ2dDbnQ2LndvcmQpOworCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0FHR19DTlQ3LCAmVHhBZ2dDbnQ3LndvcmQpOworCQlwQWQtPlJhbGlua0NvdW50ZXJzLlR4QWdnQ291bnQgKz0gVHhBZ2dDbnQuZmllbGQuQWdnVHhDb3VudDsKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5UeE5vbkFnZ0NvdW50ICs9IFR4QWdnQ250LmZpZWxkLk5vbkFnZ1R4Q291bnQ7CisJCXBBZC0+UmFsaW5rQ291bnRlcnMuVHhBZ2cxTVBEVUNvdW50ICs9IFR4QWdnQ250MC5maWVsZC5BZ2dTaXplMUNvdW50OworCQlwQWQtPlJhbGlua0NvdW50ZXJzLlR4QWdnMk1QRFVDb3VudCArPSBUeEFnZ0NudDAuZmllbGQuQWdnU2l6ZTJDb3VudDsKKworCQlwQWQtPlJhbGlua0NvdW50ZXJzLlR4QWdnM01QRFVDb3VudCArPSBUeEFnZ0NudDEuZmllbGQuQWdnU2l6ZTNDb3VudDsKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5UeEFnZzRNUERVQ291bnQgKz0gVHhBZ2dDbnQxLmZpZWxkLkFnZ1NpemU0Q291bnQ7CisJCXBBZC0+UmFsaW5rQ291bnRlcnMuVHhBZ2c1TVBEVUNvdW50ICs9IFR4QWdnQ250Mi5maWVsZC5BZ2dTaXplNUNvdW50OworCQlwQWQtPlJhbGlua0NvdW50ZXJzLlR4QWdnNk1QRFVDb3VudCArPSBUeEFnZ0NudDIuZmllbGQuQWdnU2l6ZTZDb3VudDsKKworCQlwQWQtPlJhbGlua0NvdW50ZXJzLlR4QWdnN01QRFVDb3VudCArPSBUeEFnZ0NudDMuZmllbGQuQWdnU2l6ZTdDb3VudDsKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5UeEFnZzhNUERVQ291bnQgKz0gVHhBZ2dDbnQzLmZpZWxkLkFnZ1NpemU4Q291bnQ7CisJCXBBZC0+UmFsaW5rQ291bnRlcnMuVHhBZ2c5TVBEVUNvdW50ICs9IFR4QWdnQ250NC5maWVsZC5BZ2dTaXplOUNvdW50OworCQlwQWQtPlJhbGlua0NvdW50ZXJzLlR4QWdnMTBNUERVQ291bnQgKz0gVHhBZ2dDbnQ0LmZpZWxkLkFnZ1NpemUxMENvdW50OworCisJCXBBZC0+UmFsaW5rQ291bnRlcnMuVHhBZ2cxMU1QRFVDb3VudCArPSBUeEFnZ0NudDUuZmllbGQuQWdnU2l6ZTExQ291bnQ7CisJCXBBZC0+UmFsaW5rQ291bnRlcnMuVHhBZ2cxMk1QRFVDb3VudCArPSBUeEFnZ0NudDUuZmllbGQuQWdnU2l6ZTEyQ291bnQ7CisJCXBBZC0+UmFsaW5rQ291bnRlcnMuVHhBZ2cxM01QRFVDb3VudCArPSBUeEFnZ0NudDYuZmllbGQuQWdnU2l6ZTEzQ291bnQ7CisJCXBBZC0+UmFsaW5rQ291bnRlcnMuVHhBZ2cxNE1QRFVDb3VudCArPSBUeEFnZ0NudDYuZmllbGQuQWdnU2l6ZTE0Q291bnQ7CisKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5UeEFnZzE1TVBEVUNvdW50ICs9IFR4QWdnQ250Ny5maWVsZC5BZ2dTaXplMTVDb3VudDsKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5UeEFnZzE2TVBEVUNvdW50ICs9IFR4QWdnQ250Ny5maWVsZC5BZ2dTaXplMTZDb3VudDsKKworCQkvLyBDYWxjdWxhdGUgdGhlIHRyYW5zbWl0dGVkIEEtTVBEVSBjb3VudAorCQlwQWQtPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkQU1QRFVDb3VudC51Lkxvd1BhcnQgKz0gVHhBZ2dDbnQwLmZpZWxkLkFnZ1NpemUxQ291bnQ7CisJCXBBZC0+UmFsaW5rQ291bnRlcnMuVHJhbnNtaXR0ZWRBTVBEVUNvdW50LnUuTG93UGFydCArPSAoVHhBZ2dDbnQwLmZpZWxkLkFnZ1NpemUyQ291bnQgLyAyKTsKKworCQlwQWQtPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkQU1QRFVDb3VudC51Lkxvd1BhcnQgKz0gKFR4QWdnQ250MS5maWVsZC5BZ2dTaXplM0NvdW50IC8gMyk7CisJCXBBZC0+UmFsaW5rQ291bnRlcnMuVHJhbnNtaXR0ZWRBTVBEVUNvdW50LnUuTG93UGFydCArPSAoVHhBZ2dDbnQxLmZpZWxkLkFnZ1NpemU0Q291bnQgLyA0KTsKKworCQlwQWQtPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkQU1QRFVDb3VudC51Lkxvd1BhcnQgKz0gKFR4QWdnQ250Mi5maWVsZC5BZ2dTaXplNUNvdW50IC8gNSk7CisJCXBBZC0+UmFsaW5rQ291bnRlcnMuVHJhbnNtaXR0ZWRBTVBEVUNvdW50LnUuTG93UGFydCArPSAoVHhBZ2dDbnQyLmZpZWxkLkFnZ1NpemU2Q291bnQgLyA2KTsKKworCQlwQWQtPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkQU1QRFVDb3VudC51Lkxvd1BhcnQgKz0gKFR4QWdnQ250My5maWVsZC5BZ2dTaXplN0NvdW50IC8gNyk7CisJCXBBZC0+UmFsaW5rQ291bnRlcnMuVHJhbnNtaXR0ZWRBTVBEVUNvdW50LnUuTG93UGFydCArPSAoVHhBZ2dDbnQzLmZpZWxkLkFnZ1NpemU4Q291bnQgLyA4KTsKKworCQlwQWQtPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkQU1QRFVDb3VudC51Lkxvd1BhcnQgKz0gKFR4QWdnQ250NC5maWVsZC5BZ2dTaXplOUNvdW50IC8gOSk7CisJCXBBZC0+UmFsaW5rQ291bnRlcnMuVHJhbnNtaXR0ZWRBTVBEVUNvdW50LnUuTG93UGFydCArPSAoVHhBZ2dDbnQ0LmZpZWxkLkFnZ1NpemUxMENvdW50IC8gMTApOworCisJCXBBZC0+UmFsaW5rQ291bnRlcnMuVHJhbnNtaXR0ZWRBTVBEVUNvdW50LnUuTG93UGFydCArPSAoVHhBZ2dDbnQ1LmZpZWxkLkFnZ1NpemUxMUNvdW50IC8gMTEpOworCQlwQWQtPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkQU1QRFVDb3VudC51Lkxvd1BhcnQgKz0gKFR4QWdnQ250NS5maWVsZC5BZ2dTaXplMTJDb3VudCAvIDEyKTsKKworCQlwQWQtPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkQU1QRFVDb3VudC51Lkxvd1BhcnQgKz0gKFR4QWdnQ250Ni5maWVsZC5BZ2dTaXplMTNDb3VudCAvIDEzKTsKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5UcmFuc21pdHRlZEFNUERVQ291bnQudS5Mb3dQYXJ0ICs9IChUeEFnZ0NudDYuZmllbGQuQWdnU2l6ZTE0Q291bnQgLyAxNCk7CisKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5UcmFuc21pdHRlZEFNUERVQ291bnQudS5Mb3dQYXJ0ICs9IChUeEFnZ0NudDcuZmllbGQuQWdnU2l6ZTE1Q291bnQgLyAxNSk7CisJCXBBZC0+UmFsaW5rQ291bnRlcnMuVHJhbnNtaXR0ZWRBTVBEVUNvdW50LnUuTG93UGFydCArPSAoVHhBZ2dDbnQ3LmZpZWxkLkFnZ1NpemUxNkNvdW50IC8gMTYpOworCX0KKworI2lmZGVmIERCR19ESUFHTk9TRQorCXsKKwkJUnRtcERpYWdTdHJ1Y3QJKnBEaWFnOworCQlDT1VOVEVSX1JBTElOSwkqcFJhbGlua0NvdW50ZXJzOworCQlVQ0hBUgkJCUFycmF5Q3VySWR4LCBpOworCisJCXBEaWFnID0gJnBBZC0+RGlhZ1N0cnVjdDsKKwkJcFJhbGlua0NvdW50ZXJzID0gJnBBZC0+UmFsaW5rQ291bnRlcnM7CisJCUFycmF5Q3VySWR4ID0gcERpYWctPkFycmF5Q3VySWR4OworCisJCWlmIChwRGlhZy0+aW5pdGVkID09IDApCisJCXsKKwkJCU5kaXNaZXJvTWVtb3J5KHBEaWFnLCBzaXplb2Yoc3RydWN0IF9SdG1wRGlhZ1N0cmN1dF8pKTsKKwkJCXBEaWFnLT5BcnJheVN0YXJ0SWR4ID0gcERpYWctPkFycmF5Q3VySWR4ID0gMDsKKwkJCXBEaWFnLT5pbml0ZWQgPSAxOworCQl9CisJCWVsc2UKKwkJeworCQkJLy8gVHgKKwkJCXBEaWFnLT5UeEZhaWxDbnRbQXJyYXlDdXJJZHhdID0gVHhTdGFDbnQwLmZpZWxkLlR4RmFpbENvdW50OworCQkJcERpYWctPlR4QWdnQ250W0FycmF5Q3VySWR4XSA9IFR4QWdnQ250LmZpZWxkLkFnZ1R4Q291bnQ7CisJCQlwRGlhZy0+VHhOb25BZ2dDbnRbQXJyYXlDdXJJZHhdID0gVHhBZ2dDbnQuZmllbGQuTm9uQWdnVHhDb3VudDsKKwkJCXBEaWFnLT5UeEFNUERVQ250W0FycmF5Q3VySWR4XVswXSA9IFR4QWdnQ250MC5maWVsZC5BZ2dTaXplMUNvdW50OworCQkJcERpYWctPlR4QU1QRFVDbnRbQXJyYXlDdXJJZHhdWzFdID0gVHhBZ2dDbnQwLmZpZWxkLkFnZ1NpemUyQ291bnQ7CisJCQlwRGlhZy0+VHhBTVBEVUNudFtBcnJheUN1cklkeF1bMl0gPSBUeEFnZ0NudDEuZmllbGQuQWdnU2l6ZTNDb3VudDsKKwkJCXBEaWFnLT5UeEFNUERVQ250W0FycmF5Q3VySWR4XVszXSA9IFR4QWdnQ250MS5maWVsZC5BZ2dTaXplNENvdW50OworCQkJcERpYWctPlR4QU1QRFVDbnRbQXJyYXlDdXJJZHhdWzRdID0gVHhBZ2dDbnQyLmZpZWxkLkFnZ1NpemU1Q291bnQ7CisJCQlwRGlhZy0+VHhBTVBEVUNudFtBcnJheUN1cklkeF1bNV0gPSBUeEFnZ0NudDIuZmllbGQuQWdnU2l6ZTZDb3VudDsKKwkJCXBEaWFnLT5UeEFNUERVQ250W0FycmF5Q3VySWR4XVs2XSA9IFR4QWdnQ250My5maWVsZC5BZ2dTaXplN0NvdW50OworCQkJcERpYWctPlR4QU1QRFVDbnRbQXJyYXlDdXJJZHhdWzddID0gVHhBZ2dDbnQzLmZpZWxkLkFnZ1NpemU4Q291bnQ7CisJCQlwRGlhZy0+VHhBTVBEVUNudFtBcnJheUN1cklkeF1bOF0gPSBUeEFnZ0NudDQuZmllbGQuQWdnU2l6ZTlDb3VudDsKKwkJCXBEaWFnLT5UeEFNUERVQ250W0FycmF5Q3VySWR4XVs5XSA9IFR4QWdnQ250NC5maWVsZC5BZ2dTaXplMTBDb3VudDsKKwkJCXBEaWFnLT5UeEFNUERVQ250W0FycmF5Q3VySWR4XVsxMF0gPSBUeEFnZ0NudDUuZmllbGQuQWdnU2l6ZTExQ291bnQ7CisJCQlwRGlhZy0+VHhBTVBEVUNudFtBcnJheUN1cklkeF1bMTFdID0gVHhBZ2dDbnQ1LmZpZWxkLkFnZ1NpemUxMkNvdW50OworCQkJcERpYWctPlR4QU1QRFVDbnRbQXJyYXlDdXJJZHhdWzEyXSA9IFR4QWdnQ250Ni5maWVsZC5BZ2dTaXplMTNDb3VudDsKKwkJCXBEaWFnLT5UeEFNUERVQ250W0FycmF5Q3VySWR4XVsxM10gPSBUeEFnZ0NudDYuZmllbGQuQWdnU2l6ZTE0Q291bnQ7CisJCQlwRGlhZy0+VHhBTVBEVUNudFtBcnJheUN1cklkeF1bMTRdID0gVHhBZ2dDbnQ3LmZpZWxkLkFnZ1NpemUxNUNvdW50OworCQkJcERpYWctPlR4QU1QRFVDbnRbQXJyYXlDdXJJZHhdWzE1XSA9IFR4QWdnQ250Ny5maWVsZC5BZ2dTaXplMTZDb3VudDsKKworCQkJcERpYWctPlJ4Q3JjRXJyQ250W0FycmF5Q3VySWR4XSA9IFJ4U3RhQ250MC5maWVsZC5DcmNFcnI7CisKKwkJCUlOQ19SSU5HX0lOREVYKHBEaWFnLT5BcnJheUN1cklkeCwgIERJQUdOT1NFX1RJTUUpOworCQkJQXJyYXlDdXJJZHggPSBwRGlhZy0+QXJyYXlDdXJJZHg7CisJCQlmb3IgKGkgPTA7IGkgPCA5OyBpKyspCisJCQl7CisJCQkJcERpYWctPlR4RGVzY0NudFtBcnJheUN1cklkeF1baV09IDA7CisJCQkJcERpYWctPlR4U1dRdWVDbnRbQXJyYXlDdXJJZHhdW2ldID0wOworCQkJCXBEaWFnLT5UeE1jc0NudFtBcnJheUN1cklkeF1baV0gPSAwOworCQkJCXBEaWFnLT5SeE1jc0NudFtBcnJheUN1cklkeF1baV0gPSAwOworCQkJfQorCQkJcERpYWctPlR4RGF0YUNudFtBcnJheUN1cklkeF0gPSAwOworCQkJcERpYWctPlR4RmFpbENudFtBcnJheUN1cklkeF0gPSAwOworCQkJcERpYWctPlJ4RGF0YUNudFtBcnJheUN1cklkeF0gPSAwOworCQkJcERpYWctPlJ4Q3JjRXJyQ250W0FycmF5Q3VySWR4XSAgPSAwOworCQkJZm9yIChpID0gOTsgaSA8IDI0OyBpKyspIC8vIDMqMworCQkJeworCQkJCXBEaWFnLT5UeERlc2NDbnRbQXJyYXlDdXJJZHhdW2ldID0gMDsKKwkJCQlwRGlhZy0+VHhNY3NDbnRbQXJyYXlDdXJJZHhdW2ldID0gMDsKKwkJCQlwRGlhZy0+UnhNY3NDbnRbQXJyYXlDdXJJZHhdW2ldID0gMDsKK30KKworCQkJaWYgKHBEaWFnLT5BcnJheUN1cklkeCA9PSBwRGlhZy0+QXJyYXlTdGFydElkeCkKKwkJCQlJTkNfUklOR19JTkRFWChwRGlhZy0+QXJyYXlTdGFydElkeCwgIERJQUdOT1NFX1RJTUUpOworCQl9CisKKwl9CisjZW5kaWYgLy8gREJHX0RJQUdOT1NFIC8vCisKKworfQorCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlSZXNldCBOSUMgZnJvbSBlcnJvcgorCisJQXJndW1lbnRzOgorCQlBZGFwdGVyCQkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCisJTm90ZToKKwkJUmVzZXQgTklDIGZyb20gZXJyb3Igc3RhdGUKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJTklDUmVzZXRGcm9tRXJyb3IoCisJSU4JUFJUTVBfQURBUFRFUglwQWQpCit7CisJLy8gUmVzZXQgQkJQIChhY2NvcmRpbmcgdG8gYWxleCwgcmVzZXQgQVNJQyB3aWxsIGZvcmNlIHJlc2V0IEJCUAorCS8vIFRoZXJlZm9yZSwgc2tpcCB0aGUgcmVzZXQgQkJQCisJLy8gUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX0NTUjEsIDB4Mik7CisKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIDB4MSk7CisJLy8gUmVtb3ZlIEFTSUMgZnJvbSByZXNldCBzdGF0ZQorCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgMHgwKTsKKworCU5JQ0luaXRpYWxpemVBZGFwdGVyKHBBZCwgRkFMU0UpOworCU5JQ0luaXRBc2ljRnJvbUVFUFJPTShwQWQpOworCisJLy8gU3dpdGNoIHRvIGN1cnJlbnQgY2hhbm5lbCwgc2luY2UgZHVyaW5nIHJlc2V0IHByb2Nlc3MsIHRoZSBjb25uZWN0aW9uIHNob3VsZCByZW1haW5zIG9uLgorCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwsIEZBTFNFKTsKKwlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQllcmFzZSA4MDUxIGZpcm13YXJlIGltYWdlIGluIE1BQyBBU0lDCisKKwlBcmd1bWVudHM6CisJCUFkYXB0ZXIJCQkJCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBOSUNFcmFzZUZpcm13YXJlKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCVVMT05HIGk7CisKKwlmb3IoaT0wOyBpPE1BWF9GSVJNV0FSRV9JTUFHRV9TSVpFOyBpKz00KQorCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBGSVJNV0FSRV9JTUFHRV9CQVNFICsgaSwgMCk7CisKK30vKiBFbmQgb2YgTklDRXJhc2VGaXJtd2FyZSAqLworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJTG9hZCA4MDUxIGZpcm13YXJlIFJUMjU2MS5CSU4gZmlsZSBpbnRvIE1BQyBBU0lDCisKKwlBcmd1bWVudHM6CisJCUFkYXB0ZXIJCQkJCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisKKwlSZXR1cm4gVmFsdWU6CisJCU5ESVNfU1RBVFVTX1NVQ0NFU1MgICAgICAgICBmaXJtd2FyZSBpbWFnZSBsb2FkIG9rCisJCU5ESVNfU1RBVFVTX0ZBSUxVUkUgICAgICAgICBpbWFnZSBub3QgZm91bmQKKworCUlSUUwgPSBQQVNTSVZFX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitORElTX1NUQVRVUyBOSUNMb2FkRmlybXdhcmUoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisjaWZkZWYgQklOX0lOX0ZJTEUKKyNkZWZpbmUgTklDTEZfREVGQVVMVF9VU0UoKQlcCisJZmxnX2RlZmF1bHRfZmlybV91c2UgPSBUUlVFOyBcCisJcHJpbnRrKCIlcyAtIFVzZSBkZWZhdWx0IGZpcm13YXJlIVxuIiwgX19mdW5jX18pOworCisJTkRJU19TVEFUVVMJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisJUFVDSEFSCQkJc3JjOworCXN0cnVjdCBmaWxlCQkqc3JjZjsKKwlJTlQgCQkJcmV0dmFsLCBvcmdmc3VpZCwgb3JnZnNnaWQsIGk7CisgICAJbW1fc2VnbWVudF90CW9yZ2ZzOworCVBVQ0hBUgkJCXBGaXJtd2FyZUltYWdlOworCVVJTlQJCQlGaWxlTGVuZ3RoID0gMDsKKwlVSU5UMzIJCQlNYWNSZWc7CisJVUxPTkcJCQlJbmRleDsKKwlVTE9ORwkJCWZpcm07CisJQk9PTEVBTgkJCWZsZ19kZWZhdWx0X2Zpcm1fdXNlID0gRkFMU0U7CisKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT4gJXNcbiIsIF9fZnVuY19fKSk7CisKKwkvKiBpbml0ICovCisJcEZpcm13YXJlSW1hZ2UgPSBOVUxMOworCXNyYyA9IFJUTVBfRklSTVdBUkVfRklMRV9OQU1FOworCisJLyogc2F2ZSB1aWQgYW5kIGdpZCB1c2VkIGZvciBmaWxlc3lzdGVtIGFjY2Vzcy4KKwkgICBzZXQgdXNlciBhbmQgZ3JvdXAgdG8gMCAocm9vdCkgKi8KKwlvcmdmc3VpZCA9IGN1cnJlbnQtPmZzdWlkOworCW9yZ2ZzZ2lkID0gY3VycmVudC0+ZnNnaWQ7CisJY3VycmVudC0+ZnN1aWQgPSBjdXJyZW50LT5mc2dpZCA9IDA7CisgICAgb3JnZnMgPSBnZXRfZnMoKTsKKyAgICBzZXRfZnMoS0VSTkVMX0RTKTsKKworCXBBZC0+RmlybXdhcmVWZXJzaW9uID0gKEZJUk1XQVJFX01BSk9SX1ZFUlNJT04gPDwgOCkgKyBcCisJCQkJCQkgICBGSVJNV0FSRV9NSU5PUl9WRVJTSU9OOworCisKKwkvKiBhbGxvY2F0ZSBmaXJtd2FyZSBidWZmZXIgKi8KKyAgICBwRmlybXdhcmVJbWFnZSA9IGttYWxsb2MoTUFYX0ZJUk1XQVJFX0lNQUdFX1NJWkUsIE1FTV9BTExPQ19GTEFHKTsKKyAgICBpZiAocEZpcm13YXJlSW1hZ2UgPT0gTlVMTCkKKwl7CisJCS8qIGFsbG9jYXRlIGZhaWwsIHVzZSBkZWZhdWx0IGZpcm13YXJlIGFycmF5IGluIGZpcm13YXJlLmggKi8KKwkJcHJpbnRrKCIlcyAtIEFsbG9jYXRlIG1lbW9yeSBmYWlsIVxuIiwgX19mdW5jX18pOworCQlOSUNMRl9ERUZBVUxUX1VTRSgpOworICAgIH0KKwllbHNlCisJeworCQkvKiBhbGxvY2F0ZSBvayEgemVybyB0aGUgZmlybXdhcmUgYnVmZmVyICovCisJCW1lbXNldChwRmlybXdhcmVJbWFnZSwgMHgwMCwgTUFYX0ZJUk1XQVJFX0lNQUdFX1NJWkUpOworCX0gLyogRW5kIG9mIGlmICovCisKKworCS8qIGlmIG9rLCByZWFkIGZpcm13YXJlIGZpbGUgZnJvbSAqLmJpbiBmaWxlICovCisJaWYgKGZsZ19kZWZhdWx0X2Zpcm1fdXNlID09IEZBTFNFKQorCXsKKwkJZG8KKwkJeworCQkJLyogb3BlbiB0aGUgYmluIGZpbGUgKi8KKwkJCXNyY2YgPSBmaWxwX29wZW4oc3JjLCBPX1JET05MWSwgMCk7CisKKwkJCWlmIChJU19FUlIoc3JjZikpCisJCQl7CisJCQkJcHJpbnRrKCIlcyAtIEVycm9yICVsZCBvcGVuaW5nICVzXG4iLAorCQkJCQkgICBfX2Z1bmNfXywgLVBUUl9FUlIoc3JjZiksIHNyYyk7CisJCQkJTklDTEZfREVGQVVMVF9VU0UoKTsKKwkJCQlicmVhazsKKwkJCX0gLyogRW5kIG9mIGlmICovCisKKwkJCS8qIHRoZSBvYmplY3QgbXVzdCBoYXZlIGEgcmVhZCBtZXRob2QgKi8KKwkJCWlmICgoc3JjZi0+Zl9vcCA9PSBOVUxMKSB8fCAoc3JjZi0+Zl9vcC0+cmVhZCA9PSBOVUxMKSkKKwkJCXsKKwkJCQlwcmludGsoIiVzIC0gJXMgZG9lcyBub3QgaGF2ZSBhIHdyaXRlIG1ldGhvZFxuIiwgX19mdW5jX18sIHNyYyk7CisJCQkJTklDTEZfREVGQVVMVF9VU0UoKTsKKwkJCQlicmVhazsKKwkJCX0gLyogRW5kIG9mIGlmICovCisKKwkJCS8qIHJlYWQgdGhlIGZpcm13YXJlIGZyb20gdGhlIGZpbGUgKi5iaW4gKi8KKwkJCUZpbGVMZW5ndGggPSBzcmNmLT5mX29wLT5yZWFkKHNyY2YsCisJCQkJCQkJCQkJICBwRmlybXdhcmVJbWFnZSwKKwkJCQkJCQkJCQkgIE1BWF9GSVJNV0FSRV9JTUFHRV9TSVpFLAorCQkJCQkJCQkJCSAgJnNyY2YtPmZfcG9zKTsKKworCQkJaWYgKEZpbGVMZW5ndGggIT0gTUFYX0ZJUk1XQVJFX0lNQUdFX1NJWkUpCisJCQl7CisJCQkJcHJpbnRrKCIlczogZXJyb3IgZmlsZSBsZW5ndGggKD0lZCkgaW4gUlQyODYwQVAuQklOXG4iLAorCQkJCQkgICBfX2Z1bmNfXywgRmlsZUxlbmd0aCk7CisJCQkJTklDTEZfREVGQVVMVF9VU0UoKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlQVUNIQVIgcHRyID0gcEZpcm13YXJlSW1hZ2U7CisJCQkJVVNIT1JUIGNyYyA9IDB4ZmZmZjsKKworCisJCQkJLyogY2FsY3VsYXRlIGZpcm13YXJlIENSQyAqLworCQkJCWZvcihpPTA7IGk8KE1BWF9GSVJNV0FSRV9JTUFHRV9TSVpFLTIpOyBpKyssIHB0cisrKQorCQkJCQljcmMgPSBCeXRlQ1JDMTYoYml0cmV2OCgqcHRyKSwgY3JjKTsKKwkJCQkvKiBFbmQgb2YgZm9yICovCisKKwkJCQlpZiAoKHBGaXJtd2FyZUltYWdlW01BWF9GSVJNV0FSRV9JTUFHRV9TSVpFLTJdICE9IFwKKwkJCQkJCQkJKFVDSEFSKWJpdHJldjgoKFVDSEFSKShjcmM+PjgpKSkgfHwKKwkJCQkJKHBGaXJtd2FyZUltYWdlW01BWF9GSVJNV0FSRV9JTUFHRV9TSVpFLTFdICE9IFwKKwkJCQkJCQkJKFVDSEFSKWJpdHJldjgoKFVDSEFSKWNyYykpKQorCQkJCXsKKwkJCQkJLyogQ1JDIGZhaWwgKi8KKwkJCQkJcHJpbnRrKCIlczogQ1JDID0gMHglMDJ4IDB4JTAyeCAiCisJCQkJCQkgICAiZXJyb3IsIHNob3VsZCBiZSAweCUwMnggMHglMDJ4XG4iLAorCQkJCQkJICAgX19mdW5jX18sCisJCQkJCQkgICBwRmlybXdhcmVJbWFnZVtNQVhfRklSTVdBUkVfSU1BR0VfU0laRS0yXSwKKwkJCQkJCSAgIHBGaXJtd2FyZUltYWdlW01BWF9GSVJNV0FSRV9JTUFHRV9TSVpFLTFdLAorCQkJCQkJICAgKFVDSEFSKShjcmM+PjgpLCAoVUNIQVIpKGNyYykpOworCQkJCQlOSUNMRl9ERUZBVUxUX1VTRSgpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJLyogZmlybXdhcmUgaXMgb2sgKi8KKwkJCQkJcEFkLT5GaXJtd2FyZVZlcnNpb24gPSBcCisJCQkJCQkocEZpcm13YXJlSW1hZ2VbTUFYX0ZJUk1XQVJFX0lNQUdFX1NJWkUtNF0gPDwgOCkgKworCQkJCQkJcEZpcm13YXJlSW1hZ2VbTUFYX0ZJUk1XQVJFX0lNQUdFX1NJWkUtM107CisKKwkJCQkJLyogY2hlY2sgaWYgZmlybXdhcmUgdmVyc2lvbiBvZiB0aGUgZmlsZSBpcyB0b28gb2xkICovCisJCQkJCWlmICgocEFkLT5GaXJtd2FyZVZlcnNpb24pIDwgXAorCQkJCQkJCQkJCQkoKEZJUk1XQVJFX01BSk9SX1ZFUlNJT04gPDwgOCkgKworCQkJCQkJCQkJICAJIAkgRklSTVdBUkVfTUlOT1JfVkVSU0lPTikpCisJCQkJCXsKKwkJCQkJCXByaW50aygiJXM6IGZpcm13YXJlIHZlcnNpb24gdG9vIG9sZCFcbiIsIF9fZnVuY19fKTsKKwkJCQkJCU5JQ0xGX0RFRkFVTFRfVVNFKCk7CisJCQkJCQlicmVhazsKKwkJCQkJfSAvKiBFbmQgb2YgaWYgKi8KKwkJCQl9IC8qIEVuZCBvZiBpZiAqLworCisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJCQkgKCJOSUNMb2FkRmlybXdhcmU6IENSQyBvaywgdmVyPSVkLiVkXG4iLAorCQkJCQkJICBwRmlybXdhcmVJbWFnZVtNQVhfRklSTVdBUkVfSU1BR0VfU0laRS00XSwKKwkJCQkJCSAgcEZpcm13YXJlSW1hZ2VbTUFYX0ZJUk1XQVJFX0lNQUdFX1NJWkUtM10pKTsKKwkJCX0gLyogRW5kIG9mIGlmIChGaWxlTGVuZ3RoID09IE1BWF9GSVJNV0FSRV9JTUFHRV9TSVpFKSAqLworCQkJYnJlYWs7CisJCX0gd2hpbGUoVFJVRSk7CisKKwkJLyogY2xvc2UgZmlybXdhcmUgZmlsZSAqLworCQlpZiAoSVNfRVJSKHNyY2YpKQorCQkJOworCQllbHNlCisJCXsKKwkJCXJldHZhbCA9IGZpbHBfY2xvc2Uoc3JjZiwgTlVMTCk7CisJCQlpZiAocmV0dmFsKQorCQkJeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJCQkJICgiLS0+IEVycm9yICVkIGNsb3NpbmcgJXNcbiIsIC1yZXR2YWwsIHNyYykpOworCQkJfSAvKiBFbmQgb2YgaWYgKi8KKwkJfSAvKiBFbmQgb2YgaWYgKi8KKwl9IC8qIEVuZCBvZiBpZiAqLworCisKKwkvKiB3cml0ZSBmaXJtd2FyZSB0byBBU0lDICovCisJaWYgKGZsZ19kZWZhdWx0X2Zpcm1fdXNlID09IFRSVUUpCisJeworCQkvKiB1c2UgZGVmYXVsdCBmaW1ld2FyZSwgZnJlZSBhbGxvY2F0ZWQgYnVmZmVyICovCisJCWlmIChwRmlybXdhcmVJbWFnZSAhPSBOVUxMKQorCQkJa2ZyZWUocEZpcm13YXJlSW1hZ2UpOworCQkvKiBFbmQgb2YgaWYgKi8KKworCQkvKiB1c2UgZGVmYXVsdCAqLmJpbiBhcnJheSAqLworCQlwRmlybXdhcmVJbWFnZSA9IEZpcm13YXJlSW1hZ2U7CisJCUZpbGVMZW5ndGggPSBzaXplb2YoRmlybXdhcmVJbWFnZSk7CisJfSAvKiBFbmQgb2YgaWYgKi8KKworCS8qIGVuYWJsZSBIb3N0IHByb2dyYW0gcmFtIHdyaXRlIHNlbGVjdGlvbiAqLworCVJUTVBfSU9fV1JJVEUzMihwQWQsIFBCRl9TWVNfQ1RSTCwgMHgxMDAwMCk7CisKKwlmb3IoaT0wOyBpPEZpbGVMZW5ndGg7IGkrPTQpCisJeworCQlmaXJtID0gcEZpcm13YXJlSW1hZ2VbaV0gKworCQkJICAgKHBGaXJtd2FyZUltYWdlW2krM10gPDwgMjQpICsKKwkJCSAgIChwRmlybXdhcmVJbWFnZVtpKzJdIDw8IDE2KSArCisJCQkgICAocEZpcm13YXJlSW1hZ2VbaSsxXSA8PCA4KTsKKworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBGSVJNV0FSRV9JTUFHRV9CQVNFICsgaSwgZmlybSk7CisJfSAvKiBFbmQgb2YgZm9yICovCisKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBQQkZfU1lTX0NUUkwsIDB4MDAwMDApOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIFBCRl9TWVNfQ1RSTCwgMHgwMDAwMSk7CisKKwkvKiBpbml0aWFsaXplIEJCUCBSL1cgYWNjZXNzIGFnZW50ICovCisJUlRNUF9JT19XUklURTMyKHBBZCwgSDJNX0JCUF9BR0VOVCwgMCk7CisJUlRNUF9JT19XUklURTMyKHBBZCwgSDJNX01BSUxCT1hfQ1NSLCAwKTsKKworCWlmIChmbGdfZGVmYXVsdF9maXJtX3VzZSA9PSBGQUxTRSkKKwl7CisJCS8qIHVzZSBmaWxlIGZpcm13YXJlLCBmcmVlIGFsbG9jYXRlZCBidWZmZXIgKi8KKwkJaWYgKHBGaXJtd2FyZUltYWdlICE9IE5VTEwpCisJCQlrZnJlZShwRmlybXdhcmVJbWFnZSk7CisJCS8qIEVuZCBvZiBpZiAqLworCX0gLyogRW5kIG9mIGlmICovCisKKwlzZXRfZnMob3JnZnMpOworCWN1cnJlbnQtPmZzdWlkID0gb3JnZnN1aWQ7CisJY3VycmVudC0+ZnNnaWQgPSBvcmdmc2dpZDsKKyNlbHNlCisKKwlORElTX1NUQVRVUwkJU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKwlQVUNIQVIJCQlwRmlybXdhcmVJbWFnZTsKKwlVTE9ORwkJCUZpbGVMZW5ndGgsIEluZGV4OworCS8vVUxPTkcJCQlmaXJtOworCVVJTlQzMgkJCU1hY1JlZyA9IDA7CisKKwlwRmlybXdhcmVJbWFnZSA9IEZpcm13YXJlSW1hZ2U7CisJRmlsZUxlbmd0aCA9IHNpemVvZihGaXJtd2FyZUltYWdlKTsKKwlSVDI4WFhfV1JJVEVfRklSTVdBUkUocEFkLCBwRmlybXdhcmVJbWFnZSwgRmlsZUxlbmd0aCk7CisjZW5kaWYKKworCS8qIGNoZWNrIGlmIE1DVSBpcyByZWFkeSAqLworCUluZGV4ID0gMDsKKwlkbworCXsKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBQQkZfU1lTX0NUUkwsICZNYWNSZWcpOworCisJCWlmIChNYWNSZWcgJiAweDgwKQorCQkJYnJlYWs7CisKKwkJUlRNUHVzZWNEZWxheSgxMDAwKTsKKwl9IHdoaWxlIChJbmRleCsrIDwgMTAwMCk7CisKKyAgICBpZiAoSW5kZXggPj0gMTAwMCkKKwl7CisJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX0ZBSUxVUkU7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIk5JQ0xvYWRGaXJtd2FyZTogTUNVIGlzIG5vdCByZWFkeVxuXG5cbiIpKTsKKwl9IC8qIEVuZCBvZiBpZiAqLworCisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCI8PT09ICVzIChzdGF0dXM9JWQpXG4iLCBfX2Z1bmNfXywgU3RhdHVzKSk7CisgICAgcmV0dXJuIFN0YXR1czsKK30gLyogRW5kIG9mIE5JQ0xvYWRGaXJtd2FyZSAqLworCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlMb2FkIFR4IHJhdGUgc3dpdGNoaW5nIHBhcmFtZXRlcnMKKworCUFyZ3VtZW50czoKKwkJQWRhcHRlcgkJCQkJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKworCVJldHVybiBWYWx1ZToKKwkJTkRJU19TVEFUVVNfU1VDQ0VTUyAgICAgICAgIGZpcm13YXJlIGltYWdlIGxvYWQgb2sKKwkJTkRJU19TVEFUVVNfRkFJTFVSRSAgICAgICAgIGltYWdlIG5vdCBmb3VuZAorCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKworCVJhdGUgVGFibGUgRm9ybWF0OgorCQkxLiAoQjA6IFZhbGlkIEl0ZW0gbnVtYmVyKSAoQjE6SW5pdGlhbCBpdGVtIGZyb20gemVybykKKwkJMi4gSXRlbSBOdW1iZXIoRGVjKSAgICAgIE1vZGUoSGV4KSAgICAgQ3VycmVudCBNQ1MoRGVjKSAgICBUcmFpblVwKERlYykgICAgVHJhaW5Eb3duKERlYykKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK05ESVNfU1RBVFVTIE5JQ0xvYWRSYXRlU3dpdGNoaW5nUGFyYW1zKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCXJldHVybiBORElTX1NUQVRVU19TVUNDRVNTOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJaWYgIHBTcmMxIGFsbCB6ZXJvIHdpdGggbGVuZ3RoIExlbmd0aCwgcmV0dXJuIDAuCisJCUlmIG5vdCBhbGwgemVybywgcmV0dXJuIDEKKworCUFyZ3VtZW50czoKKwkJcFNyYzEKKworCVJldHVybiBWYWx1ZToKKwkJMToJCQlub3QgYWxsIHplcm8KKwkJMDoJCQlhbGwgemVybworCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVUxPTkcJUlRNUE5vdEFsbFplcm8oCisJSU4JUFZPSUQJcFNyYzEsCisJSU4JVUxPTkcJTGVuZ3RoKQoreworCVBVQ0hBUglwTWVtMTsKKwlVTE9ORwlJbmRleCA9IDA7CisKKwlwTWVtMSA9IChQVUNIQVIpIHBTcmMxOworCisJZm9yIChJbmRleCA9IDA7IEluZGV4IDwgTGVuZ3RoOyBJbmRleCsrKQorCXsKKwkJaWYgKHBNZW0xW0luZGV4XSAhPSAweDApCisJCXsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKEluZGV4ID09IExlbmd0aCkKKwl7CisJCXJldHVybiAoMCk7CisJfQorCWVsc2UKKwl7CisJCXJldHVybiAoMSk7CisJfQorfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJQ29tcGFyZSB0d28gbWVtb3J5IGJsb2NrCisKKwlBcmd1bWVudHM6CisJCXBTcmMxCQlQb2ludGVyIHRvIGZpcnN0IG1lbW9yeSBhZGRyZXNzCisJCXBTcmMyCQlQb2ludGVyIHRvIHNlY29uZCBtZW1vcnkgYWRkcmVzcworCisJUmV0dXJuIFZhbHVlOgorCQkwOgkJCW1lbW9yeSBpcyBlcXVhbAorCQkxOgkJCXBTcmMxIG1lbW9yeSBpcyBsYXJnZXIKKwkJMjoJCQlwU3JjMiBtZW1vcnkgaXMgbGFyZ2VyCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitVTE9ORwlSVE1QQ29tcGFyZU1lbW9yeSgKKwlJTglQVk9JRAlwU3JjMSwKKwlJTglQVk9JRAlwU3JjMiwKKwlJTglVTE9ORwlMZW5ndGgpCit7CisJUFVDSEFSCXBNZW0xOworCVBVQ0hBUglwTWVtMjsKKwlVTE9ORwlJbmRleCA9IDA7CisKKwlwTWVtMSA9IChQVUNIQVIpIHBTcmMxOworCXBNZW0yID0gKFBVQ0hBUikgcFNyYzI7CisKKwlmb3IgKEluZGV4ID0gMDsgSW5kZXggPCBMZW5ndGg7IEluZGV4KyspCisJeworCQlpZiAocE1lbTFbSW5kZXhdID4gcE1lbTJbSW5kZXhdKQorCQkJcmV0dXJuICgxKTsKKwkJZWxzZSBpZiAocE1lbTFbSW5kZXhdIDwgcE1lbTJbSW5kZXhdKQorCQkJcmV0dXJuICgyKTsKKwl9CisKKwkvLyBFcXVhbAorCXJldHVybiAoMCk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlaZXJvIG91dCBtZW1vcnkgYmxvY2sKKworCUFyZ3VtZW50czoKKwkJcFNyYzEJCVBvaW50ZXIgdG8gbWVtb3J5IGFkZHJlc3MKKwkJTGVuZ3RoCQlTaXplCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCUlSUUwgPSBQQVNTSVZFX0xFVkVMCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlSVE1QWmVyb01lbW9yeSgKKwlJTglQVk9JRAlwU3JjLAorCUlOCVVMT05HCUxlbmd0aCkKK3sKKwlQVUNIQVIJcE1lbTsKKwlVTE9ORwlJbmRleCA9IDA7CisKKwlwTWVtID0gKFBVQ0hBUikgcFNyYzsKKworCWZvciAoSW5kZXggPSAwOyBJbmRleCA8IExlbmd0aDsgSW5kZXgrKykKKwl7CisJCXBNZW1bSW5kZXhdID0gMHgwMDsKKwl9Cit9CisKK1ZPSUQJUlRNUEZpbGxNZW1vcnkoCisJSU4JUFZPSUQJcFNyYywKKwlJTglVTE9ORwlMZW5ndGgsCisJSU4JVUNIQVIJRmlsbCkKK3sKKwlQVUNIQVIJcE1lbTsKKwlVTE9ORwlJbmRleCA9IDA7CisKKwlwTWVtID0gKFBVQ0hBUikgcFNyYzsKKworCWZvciAoSW5kZXggPSAwOyBJbmRleCA8IExlbmd0aDsgSW5kZXgrKykKKwl7CisJCXBNZW1bSW5kZXhdID0gRmlsbDsKKwl9Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlDb3B5IGRhdGEgZnJvbSBtZW1vcnkgYmxvY2sgMSB0byBtZW1vcnkgYmxvY2sgMgorCisJQXJndW1lbnRzOgorCQlwRGVzdAkJUG9pbnRlciB0byBkZXN0aW5hdGlvbiBtZW1vcnkgYWRkcmVzcworCQlwU3JjCQlQb2ludGVyIHRvIHNvdXJjZSBtZW1vcnkgYWRkcmVzcworCQlMZW5ndGgJCUNvcHkgc2l6ZQorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJUlRNUE1vdmVNZW1vcnkoCisJT1VUCVBWT0lECXBEZXN0LAorCUlOCVBWT0lECXBTcmMsCisJSU4JVUxPTkcJTGVuZ3RoKQoreworCVBVQ0hBUglwTWVtMTsKKwlQVUNIQVIJcE1lbTI7CisJVUlOVAlJbmRleDsKKworCUFTU0VSVCgoTGVuZ3RoPT0wKSB8fCAocERlc3QgJiYgcFNyYykpOworCisJcE1lbTEgPSAoUFVDSEFSKSBwRGVzdDsKKwlwTWVtMiA9IChQVUNIQVIpIHBTcmM7CisKKwlmb3IgKEluZGV4ID0gMDsgSW5kZXggPCBMZW5ndGg7IEluZGV4KyspCisJeworCQlwTWVtMVtJbmRleF0gPSBwTWVtMltJbmRleF07CisJfQorfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJSW5pdGlhbGl6ZSBwb3J0IGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlCisKKwlBcmd1bWVudHM6CisJCUFkYXB0ZXIJCQkJCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCUlSUUwgPSBQQVNTSVZFX0xFVkVMCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlVc2VyQ2ZnSW5pdCgKKwlJTglQUlRNUF9BREFQVEVSIHBBZCkKK3sKKyAgICBVSU5UIGtleV9pbmRleCwgYnNzX2luZGV4OworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+IFVzZXJDZmdJbml0XG4iKSk7CisKKwkvLworCS8vICBwYXJ0IEkuIGludGlhbGl6ZSBjb21tb24gY29uZmlndXJhdGlvbgorCS8vCisKKwlmb3Ioa2V5X2luZGV4PTA7IGtleV9pbmRleDxTSEFSRV9LRVlfTlVNOyBrZXlfaW5kZXgrKykKKwl7CisJCWZvcihic3NfaW5kZXggPSAwOyBic3NfaW5kZXggPCBNQVhfTUJTU0lEX05VTTsgYnNzX2luZGV4KyspCisJCXsKKwkJCXBBZC0+U2hhcmVkS2V5W2Jzc19pbmRleF1ba2V5X2luZGV4XS5LZXlMZW4gPSAwOworCQkJcEFkLT5TaGFyZWRLZXlbYnNzX2luZGV4XVtrZXlfaW5kZXhdLkNpcGhlckFsZyA9IENJUEhFUl9OT05FOworCQl9CisJfQorCisJcEFkLT5BbnRlbm5hLndvcmQgPSAwOworCXBBZC0+Q29tbW9uQ2ZnLkJCUEN1cnJlbnRCVyA9IEJXXzIwOworCisJcEFkLT5MZWRDbnRsLndvcmQgPSAwOworI2lmZGVmIFJUMjg2MAorCXBBZC0+TGVkSW5kaWNhdG9yU3RyZWd0aCA9IDA7CisJcEFkLT5STG5rQ3RybE9mZnNldCA9IDA7CisJcEFkLT5Ib3N0TG5rQ3RybE9mZnNldCA9IDA7CisjZW5kaWYgLy8gUlQyODYwIC8vCisKKwlwQWQtPmJBdXRvVHhBZ2NBID0gRkFMU0U7CQkJLy8gRGVmYXVsdCBpcyBPRkYKKwlwQWQtPmJBdXRvVHhBZ2NHID0gRkFMU0U7CQkJLy8gRGVmYXVsdCBpcyBPRkYKKwlwQWQtPlJmSWNUeXBlID0gUkZJQ18yODIwOworCisJLy8gSW5pdCB0aW1lciBmb3IgcmVzZXQgY29tcGxldGUgZXZlbnQKKwlwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA9IDE7CisJcEFkLT5iRm9yY2VQcmludFRYID0gRkFMU0U7CisJcEFkLT5iRm9yY2VQcmludFJYID0gRkFMU0U7CisJcEFkLT5iU3RhRmlmb1Rlc3QgPSBGQUxTRTsKKwlwQWQtPmJQcm90ZWN0aW9uVGVzdCA9IEZBTFNFOworCXBBZC0+YkhDQ0FUZXN0ID0gRkFMU0U7CisJcEFkLT5iR2VuT25lSENDQSA9IEZBTFNFOworCXBBZC0+Q29tbW9uQ2ZnLkRzaWZzID0gMTA7ICAgICAgLy8gaW4gdW5pdHMgb2YgdXNlYworCXBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXIgPSAxMDA7IC8vbVcKKwlwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA9IDB4ZmZmZmZmZmY7IC8vIEFVVE8KKwlwQWQtPkNvbW1vbkNmZy5UeFBvd2VyRGVmYXVsdCA9IDB4ZmZmZmZmZmY7IC8vIEFVVE8KKwlwQWQtPkNvbW1vbkNmZy5UeFByZWFtYmxlID0gUnQ4MDJfMTFQcmVhbWJsZUF1dG87IC8vIHVzZSBMb25nIHByZWFtYmxlIG9uIFRYIGJ5IGRlZmF1dAorCXBBZC0+Q29tbW9uQ2ZnLmJVc2VaZXJvVG9EaXNhYmxlRnJhZ21lbnQgPSBGQUxTRTsKKwlwQWQtPkNvbW1vbkNmZy5SdHNUaHJlc2hvbGQgPSAyMzQ3OworCXBBZC0+Q29tbW9uQ2ZnLkZyYWdtZW50VGhyZXNob2xkID0gMjM0NjsKKwlwQWQtPkNvbW1vbkNmZy5Vc2VCR1Byb3RlY3Rpb24gPSAwOyAgICAvLyAwOiBBVVRPCisJcEFkLT5Db21tb25DZmcuYkVuYWJsZVR4QnVyc3QgPSBUUlVFOyAvLzA7CisJcEFkLT5Db21tb25DZmcuUGh5TW9kZSA9IDB4ZmY7ICAgICAvLyB1bmtub3duCisJcEFkLT5Db21tb25DZmcuQmFuZFN0YXRlID0gVU5LTk9XTl9CQU5EOworCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LkNTUGVyaW9kID0gMTA7CisJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuQ1NDb3VudCA9IDA7CisJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkRNb2RlID0gUkRfTk9STUFMX01PREU7CisJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuQ2hNb3ZpbmdUaW1lID0gNjU7CisJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuTG9uZ1B1bHNlUmFkYXJUaCA9IDM7CisJcEFkLT5Db21tb25DZmcuYkFQU0RDYXBhYmxlID0gRkFMU0U7CisJcEFkLT5Db21tb25DZmcuYk5lZWRTZW5kVHJpZ2dlckZyYW1lID0gRkFMU0U7CisJcEFkLT5Db21tb25DZmcuVHJpZ2dlclRpbWVyQ291bnQgPSAwOworCXBBZC0+Q29tbW9uQ2ZnLmJBUFNERm9yY2VQb3dlclNhdmUgPSBGQUxTRTsKKwlwQWQtPkNvbW1vbkNmZy5iQ291bnRyeUZsYWcgPSBGQUxTRTsKKwlwQWQtPkNvbW1vbkNmZy5UeFN0cmVhbSA9IDA7CisJcEFkLT5Db21tb25DZmcuUnhTdHJlYW0gPSAwOworCisJTmRpc1plcm9NZW1vcnkoJnBBZC0+QmVhY29uVHhXSSwgc2l6ZW9mKHBBZC0+QmVhY29uVHhXSSkpOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJTmRpc1plcm9NZW1vcnkoJnBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eSwgc2l6ZW9mKHBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eSkpOworCXBBZC0+SFRDRW5hYmxlID0gRkFMU0U7CisJcEFkLT5iQnJvYWRDb21IVCA9IEZBTFNFOworCXBBZC0+Q29tbW9uQ2ZnLmJSZGcgPSBGQUxTRTsKKworI2lmZGVmIERPVDExTl9EUkFGVDMKKwlwQWQtPkNvbW1vbkNmZy5Eb3QxMU9Cc3NTY2FuUGFzc2l2ZUR3ZWxsID0gZG90MTFPQlNTU2NhblBhc3NpdmVEd2VsbDsJLy8gVW5pdCA6IFRVLiA1fjEwMDAKKwlwQWQtPkNvbW1vbkNmZy5Eb3QxMU9Cc3NTY2FuQWN0aXZlRHdlbGwgPSBkb3QxMU9CU1NTY2FuQWN0aXZlRHdlbGw7CS8vIFVuaXQgOiBUVS4gMTB+MTAwMAorCXBBZC0+Q29tbW9uQ2ZnLkRvdDExQnNzV2lkdGhUcmlnZ2VyU2NhbkludCA9IGRvdDExQlNTV2lkdGhUcmlnZ2VyU2NhbkludGVydmFsOwkvLyBVbml0IDogU2Vjb25kCisJcEFkLT5Db21tb25DZmcuRG90MTFPQnNzU2NhblBhc3NpdmVUb3RhbFBlckNoYW5uZWwgPSBkb3QxMU9CU1NTY2FuUGFzc2l2ZVRvdGFsUGVyQ2hhbm5lbDsJLy8gVW5pdCA6IFRVLiAyMDB+MTAwMDAKKwlwQWQtPkNvbW1vbkNmZy5Eb3QxMU9Cc3NTY2FuQWN0aXZlVG90YWxQZXJDaGFubmVsID0gZG90MTFPQlNTU2NhbkFjdGl2ZVRvdGFsUGVyQ2hhbm5lbDsJLy8gVW5pdCA6IFRVLiAyMH4xMDAwMAorCXBBZC0+Q29tbW9uQ2ZnLkRvdDExQnNzV2lkdGhDaGFuVHJhbkRlbGF5RmFjdG9yID0gZG90MTFCU1NXaWR0aENoYW5uZWxUcmFuc2FjdGlvbkRlbGF5RmFjdG9yOworCXBBZC0+Q29tbW9uQ2ZnLkRvdDExT0Jzc1NjYW5BY3Rpdml0eVRocmUgPSBkb3QxMUJTU1NjYW5BY3Rpdml0eVRocmVzaG9sZDsJLy8gVW5pdCA6IHBlcmNlbnRhZ2UKKwlwQWQtPkNvbW1vbkNmZy5Eb3QxMUJzc1dpZHRoQ2hhblRyYW5EZWxheSA9IChwQWQtPkNvbW1vbkNmZy5Eb3QxMUJzc1dpZHRoVHJpZ2dlclNjYW5JbnQgKiBwQWQtPkNvbW1vbkNmZy5Eb3QxMUJzc1dpZHRoQ2hhblRyYW5EZWxheUZhY3Rvcik7CisjZW5kaWYgIC8vIERPVDExTl9EUkFGVDMgLy8KKworCU5kaXNaZXJvTWVtb3J5KCZwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8sIHNpemVvZihwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8pKTsKKwlwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTU1QU21vZGUgPSBNTVBTX0VOQUJMRTsKKwlwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTXBkdURlbnNpdHkgPSAwOworCXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5Qb2xpY3kgPSBJTU1FRF9CQTsKKwlwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuUnhCQVdpbkxpbWl0ID0gNjQ7IC8vMzI7CisJcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlR4QkFXaW5MaW1pdCA9IDY0OyAvLzMyOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPiBVc2VyQ2ZnSW5pdC4gQkFDYXBhYmlsaXR5ID0gMHgleFxuIiwgcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LndvcmQpKTsKKworCXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BdXRvQkEgPSBGQUxTRTsKKwlCQVRhYmxlSW5pdChwQWQsICZwQWQtPkJBVGFibGUpOworCisJcEFkLT5Db21tb25DZmcuYkV4dENoYW5uZWxTd2l0Y2hBbm5vdW5jZW1lbnQgPSAxOworCXBBZC0+Q29tbW9uQ2ZnLmJIVFByb3RlY3QgPSAxOworCXBBZC0+Q29tbW9uQ2ZnLmJNSU1PUFNFbmFibGUgPSBUUlVFOworCXBBZC0+Q29tbW9uQ2ZnLmJCQURlY2xpbmUgPSBGQUxTRTsKKwlwQWQtPkNvbW1vbkNmZy5iRGlzYWJsZVJlb3JkZXJpbmcgPSBGQUxTRTsKKworCXBBZC0+Q29tbW9uQ2ZnLlR4QkFTaXplID0gNzsKKworCXBBZC0+Q29tbW9uQ2ZnLlJFR0JBQ2FwYWJpbGl0eS53b3JkID0gcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LndvcmQ7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwkvL3BBZC0+Q29tbW9uQ2ZnLkhUUGh5TW9kZS5maWVsZC5CVyA9IEJXXzIwOworCS8vcEFkLT5Db21tb25DZmcuSFRQaHlNb2RlLmZpZWxkLk1DUyA9IE1DU19BVVRPOworCS8vcEFkLT5Db21tb25DZmcuSFRQaHlNb2RlLmZpZWxkLlNob3J0R0kgPSBHSV84MDA7CisJLy9wQWQtPkNvbW1vbkNmZy5IVFBoeU1vZGUuZmllbGQuU1RCQyA9IFNUQkNfTk9ORTsKKwlwQWQtPkNvbW1vbkNmZy5UeFJhdGUgPSBSQVRFXzY7CisKKwlwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTUNTID0gTUNTX1JBVEVfNjsKKwlwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuQlcgPSBCV18yMDsKKwlwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTU9ERSA9IE1PREVfT0ZETTsKKworCXBBZC0+Q29tbW9uQ2ZnLkJlYWNvblBlcmlvZCA9IDEwMDsgICAgIC8vIGluIG1TZWMKKworCS8vCisJLy8gcGFydCBJSS4gaW50aWFsaXplIFNUQSBzcGVjaWZpYyBjb25maWd1cmF0aW9uCisJLy8KKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCXsKKwkJUlhfRklMVEVSX1NFVF9GTEFHKHBBZCwgZlJYX0ZJTFRFUl9BQ0NFUFRfRElSRUNUKTsKKwkJUlhfRklMVEVSX0NMRUFSX0ZMQUcocEFkLCBmUlhfRklMVEVSX0FDQ0VQVF9NVUxUSUNBU1QpOworCQlSWF9GSUxURVJfU0VUX0ZMQUcocEFkLCBmUlhfRklMVEVSX0FDQ0VQVF9CUk9BRENBU1QpOworCQlSWF9GSUxURVJfU0VUX0ZMQUcocEFkLCBmUlhfRklMVEVSX0FDQ0VQVF9BTExfTVVMVElDQVNUKTsKKworCQlwQWQtPlN0YUNmZy5Qc20gPSBQV1JfQUNUSVZFOworCisJCXBBZC0+U3RhQ2ZnLk9yaWdXZXBTdGF0dXMgPSBOZGlzODAyXzExRW5jcnlwdGlvbkRpc2FibGVkOworCQlwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb25EaXNhYmxlZDsKKwkJcEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbkRpc2FibGVkOworCQlwQWQtPlN0YUNmZy5iTWl4Q2lwaGVyID0gRkFMU0U7CisJCXBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCA9IDA7CisKKwkJLy8gODAyLjF4IHBvcnQgY29udHJvbAorCQlwQWQtPlN0YUNmZy5Qcml2YWN5RmlsdGVyID0gTmRpczgwMl8xMVByaXZGaWx0ZXI4MDIxeFdFUDsKKwkJcEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQ7CisJCXBBZC0+U3RhQ2ZnLkxhc3RNaWNFcnJvclRpbWUgPSAwOworCQlwQWQtPlN0YUNmZy5NaWNFcnJDbnQgICAgICAgID0gMDsKKwkJcEFkLT5TdGFDZmcuYkJsb2NrQXNzb2MgICAgICA9IEZBTFNFOworCQlwQWQtPlN0YUNmZy5XcGFTdGF0ZSAgICAgICAgID0gU1NfTk9UVVNFOworCisJCXBBZC0+Q29tbW9uQ2ZnLk5kaXNSYWRpb1N0YXRlT2ZmID0gRkFMU0U7CQkvLyBOZXcgdG8gc3VwcG9ydCBtaWNyb3NvZnQgZGlzYWJsZSByYWRpbyB3aXRoIE9JRCBjb21tYW5kCisKKwkJcEFkLT5TdGFDZmcuUnNzaVRyaWdnZXIgPSAwOworCQlOZGlzWmVyb01lbW9yeSgmcEFkLT5TdGFDZmcuUnNzaVNhbXBsZSwgc2l6ZW9mKFJTU0lfU0FNUExFKSk7CisJCXBBZC0+U3RhQ2ZnLlJzc2lUcmlnZ2VyTW9kZSA9IFJTU0lfVFJJR0dFUkVEX1VQT05fQkVMT1dfVEhSRVNIT0xEOworCQlwQWQtPlN0YUNmZy5BdGltV2luID0gMDsKKwkJcEFkLT5TdGFDZmcuRGVmYXVsdExpc3RlbkNvdW50ID0gMzsvL2RlZmF1bHQgbGlzdGVuIGNvdW50OworCQlwQWQtPlN0YUNmZy5Cc3NUeXBlID0gQlNTX0lORlJBOyAgLy8gQlNTX0lORlJBIG9yIEJTU19BREhPQyBvciBCU1NfTU9OSVRPUgorCQlwQWQtPlN0YUNmZy5iU2NhblJlcUlzRnJvbVdlYlVJID0gRkFMU0U7CisJCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0RPWkUpOworCQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19XQUtFVVBfTk9XKTsKKworCQlwQWQtPlN0YUNmZy5iQXV0b1R4UmF0ZVN3aXRjaCA9IFRSVUU7CisJCXBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTX0FVVE87CisJfQorCisjaWZkZWYgRVhUX0JVSUxEX0NIQU5ORUxfTElTVAorCXBBZC0+U3RhQ2ZnLklFRUU4MDIxMWRDbGllbnRNb2RlID0gUnQ4MDJfMTFfRF9Ob25lOworI2VuZGlmIC8vIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QgLy8KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCS8vIGdsb2JhbCB2YXJpYWJsZXMgbVhYWFggdXNlZCBpbiBNQUMgcHJvdG9jb2wgc3RhdGUgbWFjaGluZXMKKwlPUFNUQVRVU19TRVRfRkxBRyhwQWQsIGZPUF9TVEFUVVNfUkVDRUlWRV9EVElNKTsKKwlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19BREhPQ19PTik7CisJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfSU5GUkFfT04pOworCisJLy8gUEhZIHNwZWNpZmljYXRpb24KKwlwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID0gUEhZXzExQkdfTUlYRUQ7CQkvLyBkZWZhdWx0IFBIWSBtb2RlCisJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfU0hPUlRfUFJFQU1CTEVfSU5VU0VEKTsgIC8vIENDSyB1c2UgTE9ORyBwcmVhbWJsZQorCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwl7CisJCS8vIHVzZXIgZGVzaXJlZCBwb3dlciBtb2RlCisJCXBBZC0+U3RhQ2ZnLldpbmRvd3NQb3dlck1vZGUgPSBOZGlzODAyXzExUG93ZXJNb2RlQ0FNOworCQlwQWQtPlN0YUNmZy5XaW5kb3dzQmF0dGVyeVBvd2VyTW9kZSA9IE5kaXM4MDJfMTFQb3dlck1vZGVDQU07CisJCXBBZC0+U3RhQ2ZnLmJXaW5kb3dzQUNDQU1FbmFibGUgPSBGQUxTRTsKKworI2lmZGVmIExFQVBfU1VQUE9SVAorCQkvLyBDQ1ggdjEuMCByZWxlYXRlZCBpbml0IHZhbHVlCisJCVJUTVBJbml0VGltZXIocEFkLCAmcEFkLT5TdGFDZmcuTGVhcEF1dGhUaW1lciwgR0VUX1RJTUVSX0ZVTkNUSU9OKExlYXBBdXRoVGltZW91dCksIHBBZCwgRkFMU0UpOworCQlwQWQtPlN0YUNmZy5MZWFwQXV0aE1vZGUgPSBDSVNDT19BdXRoTW9kZUxFQVBOb25lOworCQlwQWQtPlN0YUNmZy5iQ2tpcE9uID0gRkFMU0U7CisjZW5kaWYgLy8gTEVBUF9TVVBQT1JUIC8vCisKKwkJUlRNUEluaXRUaW1lcihwQWQsICZwQWQtPlN0YUNmZy5TdGFRdWlja1Jlc3BvbmVGb3JSYXRlVXBUaW1lciwgR0VUX1RJTUVSX0ZVTkNUSU9OKFN0YVF1aWNrUmVzcG9uZUZvclJhdGVVcEV4ZWMpLCBwQWQsIEZBTFNFKTsKKwkJcEFkLT5TdGFDZmcuU3RhUXVpY2tSZXNwb25lRm9yUmF0ZVVwVGltZXJSdW5uaW5nID0gRkFMU0U7CisKKwkJLy8gUGF0Y2ggZm9yIE5kdGVzdAorCQlwQWQtPlN0YUNmZy5TY2FuQ250ID0gMDsKKworCQkvLyBDQ1ggMi4wIGNvbnRyb2wgZmxhZyBpbml0CisJCXBBZC0+U3RhQ2ZnLkNDWEVuYWJsZSA9IEZBTFNFOworCQlwQWQtPlN0YUNmZy5DQ1hSZXFUeXBlID0gTVNSTl9UWVBFX1VOVVNFRDsKKwkJcEFkLT5TdGFDZmcuQ0NYUW9zRUNXTWluCT0gNDsKKwkJcEFkLT5TdGFDZmcuQ0NYUW9zRUNXTWF4CT0gMTA7CisKKwkJcEFkLT5TdGFDZmcuYkh3UmFkaW8gID0gVFJVRTsgLy8gRGVmYXVsdCBIYXJkd2FyZSBSYWRpbyBzdGF0dXMgaXMgT24KKwkJcEFkLT5TdGFDZmcuYlN3UmFkaW8gID0gVFJVRTsgLy8gRGVmYXVsdCBTb2Z0d2FyZSBSYWRpbyBzdGF0dXMgaXMgT24KKwkJcEFkLT5TdGFDZmcuYlJhZGlvICAgID0gVFJVRTsgLy8gYkh3UmFkaW8gJiYgYlN3UmFkaW8KKwkJcEFkLT5TdGFDZmcuYkhhcmR3YXJlUmFkaW8gPSBGQUxTRTsJCS8vIERlZmF1bHQgaXMgT0ZGCisJCXBBZC0+U3RhQ2ZnLmJTaG93SGlkZGVuU1NJRCA9IEZBTFNFOwkJLy8gRGVmYXVsdCBubyBzaG93CisKKwkJLy8gTml0cm8gbW9kZSBjb250cm9sCisJCXBBZC0+U3RhQ2ZnLmJBdXRvUmVjb25uZWN0ID0gVFJVRTsKKworCQkvLyBTYXZlIHRoZSBpbml0IHRpbWUgYXMgbGFzdCBzY2FuIHRpbWUsIHRoZSBzeXN0ZW0gc2hvdWxkIGRvIHNjYW4gYWZ0ZXIgMiBzZWNvbmRzLgorCQkvLyBUaGlzIHBhdGNoIGlzIGZvciBkcml2ZXIgd2FrZSB1cCBmcm9tIHN0YW5kYnkgbW9kZSwgc3lzdGVtIHdpbGwgZG8gc2NhbiByaWdodCBhd2F5LgorCQlwQWQtPlN0YUNmZy5MYXN0U2NhblRpbWUgPSAwOworCQlOZGlzWmVyb01lbW9yeShwQWQtPm5pY2tuYW1lLCBJV19FU1NJRF9NQVhfU0laRSsxKTsKKwkJc3ByaW50ZihwQWQtPm5pY2tuYW1lLCAiJXMiLCBTVEFfTklDX0RFVklDRV9OQU1FKTsKKwkJUlRNUEluaXRUaW1lcihwQWQsICZwQWQtPlN0YUNmZy5XcGFEaXNhc3NvY0FuZEJsb2NrQXNzb2NUaW1lciwgR0VUX1RJTUVSX0ZVTkNUSU9OKFdwYURpc2Fzc29jQXBBbmRCbG9ja0Fzc29jKSwgcEFkLCBGQUxTRSk7CisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorCQlwQWQtPlN0YUNmZy5JRUVFODAyMVggPSBGQUxTRTsKKwkJcEFkLT5TdGFDZmcuSUVFRTgwMjF4X3JlcXVpcmVkX2tleXMgPSBGQUxTRTsKKwkJcEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQID0gV1BBX1NVUFBMSUNBTlRfRElTQUJMRTsKKyNpZmRlZiBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorCQlwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgPSBXUEFfU1VQUExJQ0FOVF9FTkFCTEU7CisjZW5kaWYgLy8gTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisKKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwkvLyBEZWZhdWx0IGZvciBleHRyYSBpbmZvcm1hdGlvbiBpcyBub3QgdmFsaWQKKwlwQWQtPkV4dHJhSW5mbyA9IEVYVFJBX0lORk9fQ0xFQVI7CisKKwkvLyBEZWZhdWx0IENvbmZpZyBjaGFuZ2UgZmxhZworCXBBZC0+YkNvbmZpZ0NoYW5nZWQgPSBGQUxTRTsKKworCS8vCisJLy8gcGFydCBJSUkuIEFQIGNvbmZpZ3VyYXRpb25zCisJLy8KKworCisJLy8KKwkvLyBwYXJ0IElWLiBvdGhlcnMKKwkvLworCS8vIGR5bmFtaWMgQkJQIFI2NjpzZW5zaWJpdHkgdHVuaW5nIHRvIG92ZXJjb21lIGJhY2tncm91bmQgbm9pc2UKKwlwQWQtPkJicFR1bmluZy5iRW5hYmxlICAgICAgICAgICAgICAgID0gVFJVRTsKKwlwQWQtPkJicFR1bmluZy5GYWxzZUNjYUxvd2VyVGhyZXNob2xkID0gMTAwOworCXBBZC0+QmJwVHVuaW5nLkZhbHNlQ2NhVXBwZXJUaHJlc2hvbGQgPSA1MTI7CisJcEFkLT5CYnBUdW5pbmcuUjY2RGVsdGEgICAgICAgICAgICAgICA9IDQ7CisJcEFkLT5NbG1lLmJFbmFibGVBdXRvQW50ZW5uYUNoZWNrID0gVFJVRTsKKworCS8vCisJLy8gQWxzbyBpbml0aWFsIFI2NkN1cnJlbnRWYWx1ZSwgUlRVU0JSZXN1bWVNc2R1VHJhbnNtaXNzaW9uIG1pZ2h0IHVzZSB0aGlzIHZhbHVlLgorCS8vIGlmIG5vdCBpbml0aWFsIHRoaXMgdmFsdWUsIHRoZSBkZWZhdWx0IHZhbHVlIHdpbGwgYmUgMC4KKwkvLworCXBBZC0+QmJwVHVuaW5nLlI2NkN1cnJlbnRWYWx1ZSA9IDB4Mzg7CisKKwlwQWQtPkJicDk0ID0gQkJQUjk0X0RFRkFVTFQ7CisJcEFkLT5CYnBGb3JDQ0sgPSBGQUxTRTsKKworCS8vIGluaXRpYWxpemUgTUFDIHRhYmxlIGFuZCBhbGxvY2F0ZSBzcGluIGxvY2sKKwlOZGlzWmVyb01lbW9yeSgmcEFkLT5NYWNUYWIsIHNpemVvZihNQUNfVEFCTEUpKTsKKwlJbml0aWFsaXplUXVldWVIZWFkZXIoJnBBZC0+TWFjVGFiLk1jYXN0UHNRdWV1ZSk7CisJTmRpc0FsbG9jYXRlU3BpbkxvY2soJnBBZC0+TWFjVGFiTG9jayk7CisKKyNpZmRlZiBSQUxJTktfQVRFCisJTmRpc1plcm9NZW1vcnkoJnBBZC0+YXRlLCBzaXplb2YoQVRFX0lORk8pKTsKKwlwQWQtPmF0ZS5Nb2RlID0gQVRFX1NUT1A7CisJcEFkLT5hdGUuVHhDb3VudCA9IDIwMDsvKiB0byBleGNlZWQgVFhfUklOR19TSVpFIC4uLiAqLworCXBBZC0+YXRlLlR4TGVuZ3RoID0gMTAyNDsKKwlwQWQtPmF0ZS5UeFdJLlNob3J0R0kgPSAwOy8vIExPTkcgR0kgOiA4MDAgbnMKKwlwQWQtPmF0ZS5UeFdJLlBIWU1PREUgPSBNT0RFX0NDSzsKKwlwQWQtPmF0ZS5UeFdJLk1DUyA9IDM7CisJcEFkLT5hdGUuVHhXSS5CVyA9IEJXXzIwOworCXBBZC0+YXRlLkNoYW5uZWwgPSAxOworCXBBZC0+YXRlLlFJRCA9IFFJRF9BQ19CRTsKKwlwQWQtPmF0ZS5BZGRyMVswXSA9IDB4MDA7CisJcEFkLT5hdGUuQWRkcjFbMV0gPSAweDExOworCXBBZC0+YXRlLkFkZHIxWzJdID0gMHgyMjsKKwlwQWQtPmF0ZS5BZGRyMVszXSA9IDB4QUE7CisJcEFkLT5hdGUuQWRkcjFbNF0gPSAweEJCOworCXBBZC0+YXRlLkFkZHIxWzVdID0gMHhDQzsKKwlOZGlzTW92ZU1lbW9yeShwQWQtPmF0ZS5BZGRyMiwgcEFkLT5hdGUuQWRkcjEsIEVUSF9MRU5HVEhfT0ZfQUREUkVTUyk7CisJTmRpc01vdmVNZW1vcnkocEFkLT5hdGUuQWRkcjMsIHBBZC0+YXRlLkFkZHIxLCBFVEhfTEVOR1RIX09GX0FERFJFU1MpOworCXBBZC0+YXRlLmJSeEZlciA9IDA7CisJcEFkLT5hdGUuYlFBVHhTdGFydCA9IEZBTFNFOworCXBBZC0+YXRlLmJRQVJ4U3RhcnQgPSBGQUxTRTsKKyNpZmRlZiBSVDI4NjAKKwlwQWQtPmF0ZS5iRldMb2FkaW5nID0gRkFMU0U7CisjZW5kaWYgLy8gUlQyODYwIC8vCisjaWZkZWYgUkFMSU5LXzI4eHhfUUEKKwkvL3BBZC0+YXRlLlJlcGVhdCA9IDA7CisJcEFkLT5hdGUuVHhTdGF0dXMgPSAwOworCXBBZC0+YXRlLkF0ZVBpZCA9IFRIUkVBRF9QSURfSU5JVF9WQUxVRTsKKyNlbmRpZiAvLyBSQUxJTktfMjh4eF9RQSAvLworI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKworCisJcEFkLT5Db21tb25DZmcuYldpRmlUZXN0ID0gRkFMU0U7CisjaWZkZWYgUlQyODYwCisgICAgcEFkLT5iUENJY2xrT2ZmID0gRkFMU0U7CisjZW5kaWYgLy8gUlQyODYwIC8vCisKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjwtLSBVc2VyQ2ZnSW5pdFxuIikpOworfQorCisvLyBJUlFMID0gUEFTU0lWRV9MRVZFTAorVUNIQVIgQnRvSChjaGFyIGNoKQoreworCWlmIChjaCA+PSAnMCcgJiYgY2ggPD0gJzknKSByZXR1cm4gKGNoIC0gJzAnKTsgICAgICAgIC8vIEhhbmRsZSBudW1lcmFscworCWlmIChjaCA+PSAnQScgJiYgY2ggPD0gJ0YnKSByZXR1cm4gKGNoIC0gJ0EnICsgMHhBKTsgIC8vIEhhbmRsZSBjYXBpdG9sIGhleCBkaWdpdHMKKwlpZiAoY2ggPj0gJ2EnICYmIGNoIDw9ICdmJykgcmV0dXJuIChjaCAtICdhJyArIDB4QSk7ICAvLyBIYW5kbGUgc21hbGwgaGV4IGRpZ2l0cworCXJldHVybigyNTUpOworfQorCisvLworLy8gIEZVTkNUSU9OOiBBdG9IKGNoYXIgKiwgVUNIQVIgKiwgaW50KQorLy8KKy8vICBQVVJQT1NFOiAgQ29udmVydHMgYXNjaWkgc3RyaW5nIHRvIG5ldHdvcmsgb3JkZXIgaGV4CisvLworLy8gIFBBUkFNRVRFUlM6CisvLyAgICBzcmMgICAgLSBwb2ludGVyIHRvIGlucHV0IGFzY2lpIHN0cmluZworLy8gICAgZGVzdCAgIC0gcG9pbnRlciB0byBvdXRwdXQgaGV4CisvLyAgICBkZXN0bGVuIC0gc2l6ZSBvZiBkZXN0CisvLworLy8gIENPTU1FTlRTOgorLy8KKy8vICAgIDIgYXNjaWkgYnl0ZXMgbWFrZSBhIGhleCBieXRlIHNvIG11c3QgcHV0IDFzdCBhc2NpaSBieXRlIG9mIHBhaXIKKy8vICAgIGludG8gdXBwZXIgbmliYmxlIGFuZCAybmQgYXNjaWkgYnl0ZSBvZiBwYWlyIGludG8gbG93ZXIgbmliYmxlLgorLy8KKy8vIElSUUwgPSBQQVNTSVZFX0xFVkVMCisKK3ZvaWQgQXRvSChjaGFyICogc3JjLCBVQ0hBUiAqIGRlc3QsIGludCBkZXN0bGVuKQoreworCWNoYXIgKiBzcmNwdHI7CisJUFVDSEFSIGRlc3RUZW1wOworCisJc3JjcHRyID0gc3JjOworCWRlc3RUZW1wID0gKFBVQ0hBUikgZGVzdDsKKworCXdoaWxlKGRlc3RsZW4tLSkKKwl7CisJCSpkZXN0VGVtcCA9IEJ0b0goKnNyY3B0cisrKSA8PCA0OyAgICAvLyBQdXQgMXN0IGFzY2lpIGJ5dGUgaW4gdXBwZXIgbmliYmxlLgorCQkqZGVzdFRlbXAgKz0gQnRvSCgqc3JjcHRyKyspOyAgICAgIC8vIEFkZCAybmQgYXNjaWkgYnl0ZSB0byBhYm92ZS4KKwkJZGVzdFRlbXArKzsKKwl9Cit9CisKK1ZPSUQJUlRNUFBhdGNoTWFjQmJwQnVnKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKQoreworCVVMT05HCUluZGV4OworCisJLy8gSW5pdGlhbGl6ZSBCQlAgcmVnaXN0ZXIgdG8gZGVmYXVsdCB2YWx1ZQorCWZvciAoSW5kZXggPSAwOyBJbmRleCA8IE5VTV9CQlBfUkVHX1BBUk1TOyBJbmRleCsrKQorCXsKKwkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUFJlZ1RhYmxlW0luZGV4XS5SZWdpc3RlciwgKFVDSEFSKUJCUFJlZ1RhYmxlW0luZGV4XS5WYWx1ZSk7CisJfQorCisJLy8gSW5pdGlhbGl6ZSBSRiByZWdpc3RlciB0byBkZWZhdWx0IHZhbHVlCisJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsLCBGQUxTRSk7CisJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCk7CisKKwkvLyBSZS1pbml0IEJCUCByZWdpc3RlciBmcm9tIEVFUFJPTSB2YWx1ZQorCU5JQ0luaXRBc2ljRnJvbUVFUFJPTShwQWQpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJSW5pdCB0aW1lciBvYmplY3RzCisKKwlBcmd1bWVudHM6CisJCXBBZAkJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKwkJcFRpbWVyCQkJCVRpbWVyIHN0cnVjdHVyZQorCQlwVGltZXJGdW5jCQkJRnVuY3Rpb24gdG8gZXhlY3V0ZSB3aGVuIHRpbWVyIGV4cGlyZWQKKwkJUmVwZWF0CQkJCVR1cmUgZm9yIHBlcmlvZCB0aW1lcgorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlSVE1QSW5pdFRpbWVyKAorCUlOCVBSVE1QX0FEQVBURVIJCQlwQWQsCisJSU4JUFJBTElOS19USU1FUl9TVFJVQ1QJcFRpbWVyLAorCUlOCVBWT0lECQkJCQlwVGltZXJGdW5jLAorCUlOCVBWT0lECQkJCQlwRGF0YSwKKwlJTglCT09MRUFOCQkJCQlSZXBlYXQpCit7CisJLy8KKwkvLyBTZXQgVmFsaWQgdG8gVFJVRSBmb3IgbGF0ZXIgdXNlZC4KKwkvLyBJdCB3aWxsIGNyYXNoIGlmIHdlIGNhbmNlbCBhIHRpbWVyIG9yIHNldCBhIHRpbWVyCisJLy8gdGhhdCB3ZSBoYXZlbid0IGluaXRpYWxpemUgYmVmb3JlLgorCS8vCisJcFRpbWVyLT5WYWxpZCAgICAgID0gVFJVRTsKKworCXBUaW1lci0+UGVyaW9kaWNUeXBlID0gUmVwZWF0OworCXBUaW1lci0+U3RhdGUgICAgICA9IEZBTFNFOworCXBUaW1lci0+Y29va2llID0gKFVMT05HKSBwRGF0YTsKKworCisJUlRNUF9PU19Jbml0X1RpbWVyKHBBZCwJJnBUaW1lci0+VGltZXJPYmosCXBUaW1lckZ1bmMsIChQVk9JRCkgcFRpbWVyKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCUluaXQgdGltZXIgb2JqZWN0cworCisJQXJndW1lbnRzOgorCQlwVGltZXIJCQkJVGltZXIgc3RydWN0dXJlCisJCVZhbHVlCQkJCVRpbWVyIHZhbHVlIGluIG1pbGxpc2Vjb25kcworCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlOb3RlOgorCQlUbyB1c2UgdGhpcyByb3V0aW5lLCBtdXN0IGNhbGwgUlRNUEluaXRUaW1lciBiZWZvcmUuCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECVJUTVBTZXRUaW1lcigKKwlJTglQUkFMSU5LX1RJTUVSX1NUUlVDVAlwVGltZXIsCisJSU4JVUxPTkcJCQkJCVZhbHVlKQoreworCWlmIChwVGltZXItPlZhbGlkKQorCXsKKwkJcFRpbWVyLT5UaW1lclZhbHVlID0gVmFsdWU7CisJCXBUaW1lci0+U3RhdGUgICAgICA9IEZBTFNFOworCQlpZiAocFRpbWVyLT5QZXJpb2RpY1R5cGUgPT0gVFJVRSkKKwkJeworCQkJcFRpbWVyLT5SZXBlYXQgPSBUUlVFOworCQkJUlRNUF9TZXRQZXJpb2RpY1RpbWVyKCZwVGltZXItPlRpbWVyT2JqLCBWYWx1ZSk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlwVGltZXItPlJlcGVhdCA9IEZBTFNFOworCQkJUlRNUF9PU19BZGRfVGltZXIoJnBUaW1lci0+VGltZXJPYmosIFZhbHVlKTsKKwkJfQorCX0KKwllbHNlCisJeworCQlEQkdQUklOVF9FUlIoKCJSVE1QU2V0VGltZXIgZmFpbGVkLCBUaW1lciBoYXNuJ3QgYmVlbiBpbml0aWFsaXplIVxuIikpOworCX0KK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJSW5pdCB0aW1lciBvYmplY3RzCisKKwlBcmd1bWVudHM6CisJCXBUaW1lcgkJCQlUaW1lciBzdHJ1Y3R1cmUKKwkJVmFsdWUJCQkJVGltZXIgdmFsdWUgaW4gbWlsbGlzZWNvbmRzCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCU5vdGU6CisJCVRvIHVzZSB0aGlzIHJvdXRpbmUsIG11c3QgY2FsbCBSVE1QSW5pdFRpbWVyIGJlZm9yZS4KKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJUlRNUE1vZFRpbWVyKAorCUlOCVBSQUxJTktfVElNRVJfU1RSVUNUCXBUaW1lciwKKwlJTglVTE9ORwkJCQkJVmFsdWUpCit7CisJQk9PTEVBTglDYW5jZWw7CisKKwlpZiAocFRpbWVyLT5WYWxpZCkKKwl7CisJCXBUaW1lci0+VGltZXJWYWx1ZSA9IFZhbHVlOworCQlwVGltZXItPlN0YXRlICAgICAgPSBGQUxTRTsKKwkJaWYgKHBUaW1lci0+UGVyaW9kaWNUeXBlID09IFRSVUUpCisJCXsKKwkJCVJUTVBDYW5jZWxUaW1lcihwVGltZXIsICZDYW5jZWwpOworCQkJUlRNUFNldFRpbWVyKHBUaW1lciwgVmFsdWUpOworCQl9CisJCWVsc2UKKwkJeworCQkJUlRNUF9PU19Nb2RfVGltZXIoJnBUaW1lci0+VGltZXJPYmosIFZhbHVlKTsKKwkJfQorCX0KKwllbHNlCisJeworCQlEQkdQUklOVF9FUlIoKCJSVE1QTW9kVGltZXIgZmFpbGVkLCBUaW1lciBoYXNuJ3QgYmVlbiBpbml0aWFsaXplIVxuIikpOworCX0KK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCUNhbmNlbCB0aW1lciBvYmplY3RzCisKKwlBcmd1bWVudHM6CisJCUFkYXB0ZXIJCQkJCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCUlSUUwgPSBQQVNTSVZFX0xFVkVMCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwlOb3RlOgorCQkxLikgVG8gdXNlIHRoaXMgcm91dGluZSwgbXVzdCBjYWxsIFJUTVBJbml0VGltZXIgYmVmb3JlLgorCQkyLikgUmVzZXQgTklDIHRvIGluaXRpYWwgc3RhdGUgQVMgSVMgc3lzdGVtIGJvb3QgdXAgdGltZS4KKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJUlRNUENhbmNlbFRpbWVyKAorCUlOCVBSQUxJTktfVElNRVJfU1RSVUNUCXBUaW1lciwKKwlPVVQJQk9PTEVBTgkJCQkJKnBDYW5jZWxsZWQpCit7CisJaWYgKHBUaW1lci0+VmFsaWQpCisJeworCQlpZiAocFRpbWVyLT5TdGF0ZSA9PSBGQUxTRSkKKwkJCXBUaW1lci0+UmVwZWF0ID0gRkFMU0U7CisJCQlSVE1QX09TX0RlbF9UaW1lcigmcFRpbWVyLT5UaW1lck9iaiwgcENhbmNlbGxlZCk7CisKKwkJaWYgKCpwQ2FuY2VsbGVkID09IFRSVUUpCisJCQlwVGltZXItPlN0YXRlID0gVFJVRTsKKworCX0KKwllbHNlCisJeworCQkvLworCQkvLyBOZGlzTUNhbmNlbFRpbWVyIGp1c3QgY2FuY2VkIHRoZSB0aW1lciBhbmQgbm90IG1lYW4gcmVsZWFzZSB0aGUgdGltZXIuCisJCS8vIEFuZCBkb24ndCBzZXQgdGhlICJWYWxpZCIgdG8gRmFsc2UuIFNvIHRoYXQgd2UgY2FuIHVzZSB0aGlzIHRpbWVyIGFnYWluLgorCQkvLworCQlEQkdQUklOVF9FUlIoKCJSVE1QQ2FuY2VsVGltZXIgZmFpbGVkLCBUaW1lciBoYXNuJ3QgYmVlbiBpbml0aWFsaXplIVxuIikpOworCX0KK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVNldCBMRUQgU3RhdHVzCisKKwlBcmd1bWVudHM6CisJCXBBZAkJCQkJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKwkJU3RhdHVzCQkJCQlMRUQgU3RhdHVzCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCUlSUUwgPSBQQVNTSVZFX0xFVkVMCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBSVE1QU2V0TEVEKAorCUlOIFBSVE1QX0FEQVBURVIgCXBBZCwKKwlJTiBVQ0hBUgkJCVN0YXR1cykKK3sKKwkvL1VMT05HCQkJZGF0YTsKKwlVQ0hBUgkJCUhpZ2hCeXRlID0gMDsKKwlVQ0hBUgkJCUxvd0J5dGU7CisKKy8vIEluIEFURSBtb2RlIG9mIFJUMjg2MCBBUC9TVEEsIHdlIGhhdmUgZXJhc2VkIDgwNTEgZmlybXdhcmUuCisvLyBTbyBMRUQgbW9kZSBpcyBub3Qgc3VwcG9ydGVkIHdoZW4gQVRFIGlzIHJ1bm5pbmcuCisjaWZkZWYgUkFMSU5LX0FURQorCWlmIChBVEVfT04ocEFkKSkKKwkJcmV0dXJuOworI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKworCUxvd0J5dGUgPSBwQWQtPkxlZENudGwuZmllbGQuTGVkTW9kZSYweDdmOworCXN3aXRjaCAoU3RhdHVzKQorCXsKKwkJY2FzZSBMRURfTElOS19ET1dOOgorCQkJSGlnaEJ5dGUgPSAweDIwOworCQkJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDUwLCAweGZmLCBMb3dCeXRlLCBIaWdoQnl0ZSk7CisJCQlwQWQtPkxlZEluZGljYXRvclN0cmVndGggPSAwOworCQkJYnJlYWs7CisJCWNhc2UgTEVEX0xJTktfVVA6CisJCQlpZiAocEFkLT5Db21tb25DZmcuQ2hhbm5lbCA+IDE0KQorCQkJCUhpZ2hCeXRlID0gMHhhMDsKKwkJCWVsc2UKKwkJCQlIaWdoQnl0ZSA9IDB4NjA7CisJCQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4NTAsIDB4ZmYsIExvd0J5dGUsIEhpZ2hCeXRlKTsKKwkJCWJyZWFrOworCQljYXNlIExFRF9SQURJT19PTjoKKwkJCUhpZ2hCeXRlID0gMHgyMDsKKwkJCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHg1MCwgMHhmZiwgTG93Qnl0ZSwgSGlnaEJ5dGUpOworCQkJYnJlYWs7CisJCWNhc2UgTEVEX0hBTFQ6CisJCQlMb3dCeXRlID0gMDsgLy8gRHJpdmVyIHNldHMgTUFDIHJlZ2lzdGVyIGFuZCBNQUMgY29udHJvbHMgTEVECisJCWNhc2UgTEVEX1JBRElPX09GRjoKKwkJCUhpZ2hCeXRlID0gMDsKKwkJCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHg1MCwgMHhmZiwgTG93Qnl0ZSwgSGlnaEJ5dGUpOworCQkJYnJlYWs7CisgICAgICAgIGNhc2UgTEVEX1dQUzoKKwkJCUhpZ2hCeXRlID0gMHgxMDsKKwkJCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHg1MCwgMHhmZiwgTG93Qnl0ZSwgSGlnaEJ5dGUpOworCQkJYnJlYWs7CisJCWNhc2UgTEVEX09OX1NJVEVfU1VSVkVZOgorCQkJSGlnaEJ5dGUgPSAweDA4OworCQkJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDUwLCAweGZmLCBMb3dCeXRlLCBIaWdoQnl0ZSk7CisJCQlicmVhazsKKwkJY2FzZSBMRURfUE9XRVJfVVA6CisJCQlIaWdoQnl0ZSA9IDB4MDQ7CisJCQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4NTAsIDB4ZmYsIExvd0J5dGUsIEhpZ2hCeXRlKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJREJHUFJJTlQoUlRfREVCVUdfV0FSTiwgKCJSVE1QU2V0TEVEOjpVbmtub3duIFN0YXR1cyAlZFxuIiwgU3RhdHVzKSk7CisJCQlicmVhazsKKwl9CisKKyAgICAvLworCS8vIEtlZXAgTEVEIHN0YXR1cyBmb3IgTEVEIFNpdGVTdXJ2ZXkgbW9kZS4KKwkvLyBBZnRlciBTaXRlU3VydmV5LCB3ZSB3aWxsIHNldCB0aGUgTEVEIG1vZGUgdG8gcHJldmlvdXMgc3RhdHVzLgorCS8vCisJaWYgKChTdGF0dXMgIT0gTEVEX09OX1NJVEVfU1VSVkVZKSAmJiAoU3RhdHVzICE9IExFRF9QT1dFUl9VUCkpCisJCXBBZC0+TGVkU3RhdHVzID0gU3RhdHVzOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlRNUFNldExFRDo6TW9kZT0lZCxIaWdoQnl0ZT0weCUwMngsTG93Qnl0ZT0weCUwMnhcbiIsIHBBZC0+TGVkQ250bC5maWVsZC5MZWRNb2RlLCBIaWdoQnl0ZSwgTG93Qnl0ZSkpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJU2V0IExFRCBTaWduYWwgU3RyZWd0aAorCisJQXJndW1lbnRzOgorCQlwQWQJCQkJCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisJCURibQkJCQkJCVNpZ25hbCBTdHJlZ3RoCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCUlSUUwgPSBQQVNTSVZFX0xFVkVMCisKKwlOb3RlOgorCQlDYW4gYmUgcnVuIG9uIGFueSBJUlFMIGxldmVsLgorCisJCUFjY29yZGluZyB0byBNaWNyb3NvZnQgWmVybyBDb25maWcgV2lyZWxlc3MgU2lnbmFsIFN0cmVndGggZGVmaW5pdGlvbiBhcyBiZWxvd3MuCisJCTw9IC05MCAgTm8gU2lnbmFsCisJCTw9IC04MSAgVmVyeSBMb3cKKwkJPD0gLTcxICBMb3cKKwkJPD0gLTY3ICBHb29kCisJCTw9IC01NyAgVmVyeSBHb29kCisJCSA+IC01NyAgRXhjZWxsZW50CisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBSVE1QU2V0U2lnbmFsTEVEKAorCUlOIFBSVE1QX0FEQVBURVIgCXBBZCwKKwlJTiBORElTXzgwMl8xMV9SU1NJIERibSkKK3sKKwlVQ0hBUgkJbkxlZCA9IDA7CisKKwkvLworCS8vIGlmIG5vdCBTaWduYWwgU3RyZWd0aCwgdGhlbiBkbyBub3RoaW5nLgorCS8vCisJaWYgKHBBZC0+TGVkQ250bC5maWVsZC5MZWRNb2RlICE9IExFRF9NT0RFX1NJR05BTF9TVFJFR1RIKQorCXsKKwkJcmV0dXJuOworCX0KKworCWlmIChEYm0gPD0gLTkwKQorCQluTGVkID0gMDsKKwllbHNlIGlmIChEYm0gPD0gLTgxKQorCQluTGVkID0gMTsKKwllbHNlIGlmIChEYm0gPD0gLTcxKQorCQluTGVkID0gMzsKKwllbHNlIGlmIChEYm0gPD0gLTY3KQorCQluTGVkID0gNzsKKwllbHNlIGlmIChEYm0gPD0gLTU3KQorCQluTGVkID0gMTU7CisJZWxzZQorCQluTGVkID0gMzE7CisKKwkvLworCS8vIFVwZGF0ZSBTaWduYWwgU3RyZWd0aCB0byBmaXJtd2FyZSBpZiBjaGFuZ2VkLgorCS8vCisJaWYgKHBBZC0+TGVkSW5kaWNhdG9yU3RyZWd0aCAhPSBuTGVkKQorCXsKKwkJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDUxLCAweGZmLCBuTGVkLCBwQWQtPkxlZENudGwuZmllbGQuUG9sYXJpdHkpOworCQlwQWQtPkxlZEluZGljYXRvclN0cmVndGggPSBuTGVkOworCX0KK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCUVuYWJsZSBSWAorCisJQXJndW1lbnRzOgorCQlwQWQJCQkJCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCUlSUUwgPD0gRElTUEFUQ0hfTEVWRUwKKworCU5vdGU6CisJCUJlZm9yZSBFbmFibGUgUlgsIG1ha2Ugc3VyZSB5b3UgaGF2ZSBlbmFibGVkIEludGVycnVwdC4KKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIFJUTVBFbmFibGVSeFR4KAorCUlOIFBSVE1QX0FEQVBURVIJcEFkKQoreworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PiBSVE1QRW5hYmxlUnhUeFxuIikpOworCisJLy8gRW5hYmxlIFJ4IERNQS4KKwlSVDI4WFhETUFFbmFibGUocEFkKTsKKworCS8vIGVuYWJsZSBSWCBvZiBNQUMgYmxvY2sKKwlpZiAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX0FQKQorCXsKKwkJVUlOVDMyIHJ4X2ZpbHRlcl9mbGFnID0gQVBOT1JNQUw7CisKKworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBSWF9GSUxUUl9DRkcsIHJ4X2ZpbHRlcl9mbGFnKTsgICAgIC8vIGVuYWJsZSBSWCBvZiBETUEgYmxvY2sKKwl9CisJZWxzZQorCXsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgUlhfRklMVFJfQ0ZHLCBTVEFOT1JNQUwpOyAgICAgLy8gU3RhaW9uIG5vdCBkcm9wIGNvbnRyb2wgZnJhbWUgd2lsbCBmYWlsIFdpRmkgQ2VydGlmaWNhdGlvbi4KKwl9CisKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIDB4Yyk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPD09IFJUTVBFbmFibGVSeFR4XG4iKSk7Cit9CisKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vcnRtcF90a2lwLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9ydG1wX3RraXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODdlYTNhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vcnRtcF90a2lwLmMKQEAgLTAsMCArMSwxNjA3IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCU1vZHVsZSBOYW1lOgorCXJ0bXBfdGtpcC5jCisKKwlBYnN0cmFjdDoKKworCVJldmlzaW9uIEhpc3Rvcnk6CisJV2hvCQkJV2hlbgkJCVdoYXQKKwktLS0tLS0tLQktLS0tLS0tLS0tCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJUGF1bCBXdQkJMDItMjUtMDIJCUluaXRpYWwKKyovCisKKyNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKKworLy8gUm90YXRpb24gZnVuY3Rpb25zIG9uIDMyIGJpdCB2YWx1ZXMKKyNkZWZpbmUgUk9MMzIoIEEsIG4gKSBcCisJKCAoKEEpIDw8IChuKSkgfCAoICgoQSk+PigzMi0obikpKSAmICggKDFVTCA8PCAobikpIC0gMSApICkgKQorI2RlZmluZSBST1IzMiggQSwgbiApIFJPTDMyKCAoQSksIDMyLShuKSApCisKK1VJTlQgVGtpcF9TYm94X0xvd2VyWzI1Nl0gPQoreworCTB4QTUsMHg4NCwweDk5LDB4OEQsMHgwRCwweEJELDB4QjEsMHg1NCwKKwkweDUwLDB4MDMsMHhBOSwweDdELDB4MTksMHg2MiwweEU2LDB4OUEsCisJMHg0NSwweDlELDB4NDAsMHg4NywweDE1LDB4RUIsMHhDOSwweDBCLAorCTB4RUMsMHg2NywweEZELDB4RUEsMHhCRiwweEY3LDB4OTYsMHg1QiwKKwkweEMyLDB4MUMsMHhBRSwweDZBLDB4NUEsMHg0MSwweDAyLDB4NEYsCisJMHg1QywweEY0LDB4MzQsMHgwOCwweDkzLDB4NzMsMHg1MywweDNGLAorCTB4MEMsMHg1MiwweDY1LDB4NUUsMHgyOCwweEExLDB4MEYsMHhCNSwKKwkweDA5LDB4MzYsMHg5QiwweDNELDB4MjYsMHg2OSwweENELDB4OUYsCisJMHgxQiwweDlFLDB4NzQsMHgyRSwweDJELDB4QjIsMHhFRSwweEZCLAorCTB4RjYsMHg0RCwweDYxLDB4Q0UsMHg3QiwweDNFLDB4NzEsMHg5NywKKwkweEY1LDB4NjgsMHgwMCwweDJDLDB4NjAsMHgxRiwweEM4LDB4RUQsCisJMHhCRSwweDQ2LDB4RDksMHg0QiwweERFLDB4RDQsMHhFOCwweDRBLAorCTB4NkIsMHgyQSwweEU1LDB4MTYsMHhDNSwweEQ3LDB4NTUsMHg5NCwKKwkweENGLDB4MTAsMHgwNiwweDgxLDB4RjAsMHg0NCwweEJBLDB4RTMsCisJMHhGMywweEZFLDB4QzAsMHg4QSwweEFELDB4QkMsMHg0OCwweDA0LAorCTB4REYsMHhDMSwweDc1LDB4NjMsMHgzMCwweDFBLDB4MEUsMHg2RCwKKwkweDRDLDB4MTQsMHgzNSwweDJGLDB4RTEsMHhBMiwweENDLDB4MzksCisJMHg1NywweEYyLDB4ODIsMHg0NywweEFDLDB4RTcsMHgyQiwweDk1LAorCTB4QTAsMHg5OCwweEQxLDB4N0YsMHg2NiwweDdFLDB4QUIsMHg4MywKKwkweENBLDB4MjksMHhEMywweDNDLDB4NzksMHhFMiwweDFELDB4NzYsCisJMHgzQiwweDU2LDB4NEUsMHgxRSwweERCLDB4MEEsMHg2QywweEU0LAorCTB4NUQsMHg2RSwweEVGLDB4QTYsMHhBOCwweEE0LDB4MzcsMHg4QiwKKwkweDMyLDB4NDMsMHg1OSwweEI3LDB4OEMsMHg2NCwweEQyLDB4RTAsCisJMHhCNCwweEZBLDB4MDcsMHgyNSwweEFGLDB4OEUsMHhFOSwweDE4LAorCTB4RDUsMHg4OCwweDZGLDB4NzIsMHgyNCwweEYxLDB4QzcsMHg1MSwKKwkweDIzLDB4N0MsMHg5QywweDIxLDB4REQsMHhEQywweDg2LDB4ODUsCisJMHg5MCwweDQyLDB4QzQsMHhBQSwweEQ4LDB4MDUsMHgwMSwweDEyLAorCTB4QTMsMHg1RiwweEY5LDB4RDAsMHg5MSwweDU4LDB4MjcsMHhCOSwKKwkweDM4LDB4MTMsMHhCMywweDMzLDB4QkIsMHg3MCwweDg5LDB4QTcsCisJMHhCNiwweDIyLDB4OTIsMHgyMCwweDQ5LDB4RkYsMHg3OCwweDdBLAorCTB4OEYsMHhGOCwweDgwLDB4MTcsMHhEQSwweDMxLDB4QzYsMHhCOCwKKwkweEMzLDB4QjAsMHg3NywweDExLDB4Q0IsMHhGQywweEQ2LDB4M0EKK307CisKK1VJTlQgVGtpcF9TYm94X1VwcGVyWzI1Nl0gPQoreworCTB4QzYsMHhGOCwweEVFLDB4RjYsMHhGRiwweEQ2LDB4REUsMHg5MSwKKwkweDYwLDB4MDIsMHhDRSwweDU2LDB4RTcsMHhCNSwweDRELDB4RUMsCisJMHg4RiwweDFGLDB4ODksMHhGQSwweEVGLDB4QjIsMHg4RSwweEZCLAorCTB4NDEsMHhCMywweDVGLDB4NDUsMHgyMywweDUzLDB4RTQsMHg5QiwKKwkweDc1LDB4RTEsMHgzRCwweDRDLDB4NkMsMHg3RSwweEY1LDB4ODMsCisJMHg2OCwweDUxLDB4RDEsMHhGOSwweEUyLDB4QUIsMHg2MiwweDJBLAorCTB4MDgsMHg5NSwweDQ2LDB4OUQsMHgzMCwweDM3LDB4MEEsMHgyRiwKKwkweDBFLDB4MjQsMHgxQiwweERGLDB4Q0QsMHg0RSwweDdGLDB4RUEsCisJMHgxMiwweDFELDB4NTgsMHgzNCwweDM2LDB4REMsMHhCNCwweDVCLAorCTB4QTQsMHg3NiwweEI3LDB4N0QsMHg1MiwweERELDB4NUUsMHgxMywKKwkweEE2LDB4QjksMHgwMCwweEMxLDB4NDAsMHhFMywweDc5LDB4QjYsCisJMHhENCwweDhELDB4NjcsMHg3MiwweDk0LDB4OTgsMHhCMCwweDg1LAorCTB4QkIsMHhDNSwweDRGLDB4RUQsMHg4NiwweDlBLDB4NjYsMHgxMSwKKwkweDhBLDB4RTksMHgwNCwweEZFLDB4QTAsMHg3OCwweDI1LDB4NEIsCisJMHhBMiwweDVELDB4ODAsMHgwNSwweDNGLDB4MjEsMHg3MCwweEYxLAorCTB4NjMsMHg3NywweEFGLDB4NDIsMHgyMCwweEU1LDB4RkQsMHhCRiwKKwkweDgxLDB4MTgsMHgyNiwweEMzLDB4QkUsMHgzNSwweDg4LDB4MkUsCisJMHg5MywweDU1LDB4RkMsMHg3QSwweEM4LDB4QkEsMHgzMiwweEU2LAorCTB4QzAsMHgxOSwweDlFLDB4QTMsMHg0NCwweDU0LDB4M0IsMHgwQiwKKwkweDhDLDB4QzcsMHg2QiwweDI4LDB4QTcsMHhCQywweDE2LDB4QUQsCisJMHhEQiwweDY0LDB4NzQsMHgxNCwweDkyLDB4MEMsMHg0OCwweEI4LAorCTB4OUYsMHhCRCwweDQzLDB4QzQsMHgzOSwweDMxLDB4RDMsMHhGMiwKKwkweEQ1LDB4OEIsMHg2RSwweERBLDB4MDEsMHhCMSwweDlDLDB4NDksCisJMHhEOCwweEFDLDB4RjMsMHhDRiwweENBLDB4RjQsMHg0NywweDEwLAorCTB4NkYsMHhGMCwweDRBLDB4NUMsMHgzOCwweDU3LDB4NzMsMHg5NywKKwkweENCLDB4QTEsMHhFOCwweDNFLDB4OTYsMHg2MSwweDBELDB4MEYsCisJMHhFMCwweDdDLDB4NzEsMHhDQywweDkwLDB4MDYsMHhGNywweDFDLAorCTB4QzIsMHg2QSwweEFFLDB4NjksMHgxNywweDk5LDB4M0EsMHgyNywKKwkweEQ5LDB4RUIsMHgyQiwweDIyLDB4RDIsMHhBOSwweDA3LDB4MzMsCisJMHgyRCwweDNDLDB4MTUsMHhDOSwweDg3LDB4QUEsMHg1MCwweEE1LAorCTB4MDMsMHg1OSwweDA5LDB4MUEsMHg2NSwweEQ3LDB4ODQsMHhEMCwKKwkweDgyLDB4MjksMHg1QSwweDFFLDB4N0IsMHhBOCwweDZELDB4MkMKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKiBTQk9YIFRhYmxlICoqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworVUNIQVIgU2JveFRhYmxlWzI1Nl0gPQoreworCTB4NjMsIDB4N2MsIDB4NzcsIDB4N2IsIDB4ZjIsIDB4NmIsIDB4NmYsIDB4YzUsCisJMHgzMCwgMHgwMSwgMHg2NywgMHgyYiwgMHhmZSwgMHhkNywgMHhhYiwgMHg3NiwKKwkweGNhLCAweDgyLCAweGM5LCAweDdkLCAweGZhLCAweDU5LCAweDQ3LCAweGYwLAorCTB4YWQsIDB4ZDQsIDB4YTIsIDB4YWYsIDB4OWMsIDB4YTQsIDB4NzIsIDB4YzAsCisJMHhiNywgMHhmZCwgMHg5MywgMHgyNiwgMHgzNiwgMHgzZiwgMHhmNywgMHhjYywKKwkweDM0LCAweGE1LCAweGU1LCAweGYxLCAweDcxLCAweGQ4LCAweDMxLCAweDE1LAorCTB4MDQsIDB4YzcsIDB4MjMsIDB4YzMsIDB4MTgsIDB4OTYsIDB4MDUsIDB4OWEsCisJMHgwNywgMHgxMiwgMHg4MCwgMHhlMiwgMHhlYiwgMHgyNywgMHhiMiwgMHg3NSwKKwkweDA5LCAweDgzLCAweDJjLCAweDFhLCAweDFiLCAweDZlLCAweDVhLCAweGEwLAorCTB4NTIsIDB4M2IsIDB4ZDYsIDB4YjMsIDB4MjksIDB4ZTMsIDB4MmYsIDB4ODQsCisJMHg1MywgMHhkMSwgMHgwMCwgMHhlZCwgMHgyMCwgMHhmYywgMHhiMSwgMHg1YiwKKwkweDZhLCAweGNiLCAweGJlLCAweDM5LCAweDRhLCAweDRjLCAweDU4LCAweGNmLAorCTB4ZDAsIDB4ZWYsIDB4YWEsIDB4ZmIsIDB4NDMsIDB4NGQsIDB4MzMsIDB4ODUsCisJMHg0NSwgMHhmOSwgMHgwMiwgMHg3ZiwgMHg1MCwgMHgzYywgMHg5ZiwgMHhhOCwKKwkweDUxLCAweGEzLCAweDQwLCAweDhmLCAweDkyLCAweDlkLCAweDM4LCAweGY1LAorCTB4YmMsIDB4YjYsIDB4ZGEsIDB4MjEsIDB4MTAsIDB4ZmYsIDB4ZjMsIDB4ZDIsCisJMHhjZCwgMHgwYywgMHgxMywgMHhlYywgMHg1ZiwgMHg5NywgMHg0NCwgMHgxNywKKwkweGM0LCAweGE3LCAweDdlLCAweDNkLCAweDY0LCAweDVkLCAweDE5LCAweDczLAorCTB4NjAsIDB4ODEsIDB4NGYsIDB4ZGMsIDB4MjIsIDB4MmEsIDB4OTAsIDB4ODgsCisJMHg0NiwgMHhlZSwgMHhiOCwgMHgxNCwgMHhkZSwgMHg1ZSwgMHgwYiwgMHhkYiwKKwkweGUwLCAweDMyLCAweDNhLCAweDBhLCAweDQ5LCAweDA2LCAweDI0LCAweDVjLAorCTB4YzIsIDB4ZDMsIDB4YWMsIDB4NjIsIDB4OTEsIDB4OTUsIDB4ZTQsIDB4NzksCisJMHhlNywgMHhjOCwgMHgzNywgMHg2ZCwgMHg4ZCwgMHhkNSwgMHg0ZSwgMHhhOSwKKwkweDZjLCAweDU2LCAweGY0LCAweGVhLCAweDY1LCAweDdhLCAweGFlLCAweDA4LAorCTB4YmEsIDB4NzgsIDB4MjUsIDB4MmUsIDB4MWMsIDB4YTYsIDB4YjQsIDB4YzYsCisJMHhlOCwgMHhkZCwgMHg3NCwgMHgxZiwgMHg0YiwgMHhiZCwgMHg4YiwgMHg4YSwKKwkweDcwLCAweDNlLCAweGI1LCAweDY2LCAweDQ4LCAweDAzLCAweGY2LCAweDBlLAorCTB4NjEsIDB4MzUsIDB4NTcsIDB4YjksIDB4ODYsIDB4YzEsIDB4MWQsIDB4OWUsCisJMHhlMSwgMHhmOCwgMHg5OCwgMHgxMSwgMHg2OSwgMHhkOSwgMHg4ZSwgMHg5NCwKKwkweDliLCAweDFlLCAweDg3LCAweGU5LCAweGNlLCAweDU1LCAweDI4LCAweGRmLAorCTB4OGMsIDB4YTEsIDB4ODksIDB4MGQsIDB4YmYsIDB4ZTYsIDB4NDIsIDB4NjgsCisJMHg0MSwgMHg5OSwgMHgyZCwgMHgwZiwgMHhiMCwgMHg1NCwgMHhiYiwgMHgxNgorfTsKKworVk9JRCB4b3JfMzIoCisJSU4gIFBVQ0hBUiAgICAgICAgICAgICAgYSwKKwlJTiAgUFVDSEFSICAgICAgICAgICAgICBiLAorCU9VVCBQVUNIQVIgICAgICAgICAgICAgIG91dCk7CisKK1ZPSUQgeG9yXzEyOCgKKwlJTiAgUFVDSEFSICAgICAgICAgICAgICBhLAorCUlOICBQVUNIQVIgICAgICAgICAgICAgIGIsCisJT1VUIFBVQ0hBUiAgICAgICAgICAgICAgb3V0KTsKKworVk9JRCBuZXh0X2tleSgKKwlJTiAgUFVDSEFSICAgICAgICAgICAgICBrZXksCisJSU4gIElOVCAgICAgICAgICAgICAgICAgcm91bmQpOworCitWT0lEIGJ5dGVfc3ViKAorCUlOICBQVUNIQVIgICAgICAgICAgICAgIGluLAorCU9VVCBQVUNIQVIgICAgICAgICAgICAgIG91dCk7CisKK1ZPSUQgc2hpZnRfcm93KAorCUlOICBQVUNIQVIgICAgICAgICAgICAgIGluLAorCU9VVCBQVUNIQVIgICAgICAgICAgICAgIG91dCk7CisKK1ZPSUQgbWl4X2NvbHVtbigKKwlJTiAgUFVDSEFSICAgICAgICAgICAgICBpbiwKKwlPVVQgUFVDSEFSICAgICAgICAgICAgICBvdXQpOworCitVQ0hBUiBSVE1QQ2tpcFNib3goCisJSU4gIFVDSEFSICAgICAgICAgICAgICAgYSk7CisvLworLy8gRXhwYW5kZWQgSVYgZm9yIFRLSVAgZnVuY3Rpb24uCisvLwordHlwZWRlZglzdHJ1Y3QJUEFDS0VEIF9JVl9DT05UUk9MXworeworCXVuaW9uIFBBQ0tFRAorCXsKKwkJc3RydWN0IFBBQ0tFRAorCQl7CisJCQlVQ0hBUgkJcmMwOworCQkJVUNIQVIJCXJjMTsKKwkJCVVDSEFSCQlyYzI7CisKKwkJCXVuaW9uIFBBQ0tFRAorCQkJeworCQkJCXN0cnVjdCBQQUNLRUQKKwkJCQl7CisjaWZkZWYgUlRfQklHX0VORElBTgorCQkJCQlVQ0hBUglLZXlJRDoyOworCQkJCQlVQ0hBUglFeHRJVjoxOworCQkJCQlVQ0hBUglSc3ZkOjU7CisjZWxzZQorCQkJCQlVQ0hBUglSc3ZkOjU7CisJCQkJCVVDSEFSCUV4dElWOjE7CisJCQkJCVVDSEFSCUtleUlEOjI7CisjZW5kaWYKKwkJCQl9CWZpZWxkOworCQkJCVVDSEFSCQlCeXRlOworCQkJfQlDT05UUk9MOworCQl9CWZpZWxkOworCisJCVVMT05HCXdvcmQ7CisJfQlJVjE2OworCisJVUxPTkcJSVYzMjsKK30JVEtJUF9JViwgKlBUS0lQX0lWOworCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lCURlc2NyaXB0aW9uOgorCQlDb252ZXJ0IGZyb20gVUNIQVJbXSB0byBVTE9ORyBpbiBhIHBvcnRhYmxlIHdheQorCisJQXJndW1lbnRzOgorICAgICAgcE1JQ0tleQkJcG9pbnRlciB0byBNSUMgS2V5CisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitVTE9ORwlSVE1QVGtpcEdldFVJbnQzMigKKwlJTglQVUNIQVIJcE1JQ0tleSkKK3sKKwlVTE9ORwlyZXMgPSAwOworCUlOVAkJaTsKKworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisJeworCQlyZXMgfD0gKCpwTUlDS2V5KyspIDw8ICg4ICogaSk7CisJfQorCisJcmV0dXJuIHJlczsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUJRGVzY3JpcHRpb246CisJCUNvbnZlcnQgZnJvbSBVTE9ORyB0byBVQ0hBUltdIGluIGEgcG9ydGFibGUgd2F5CisKKwlBcmd1bWVudHM6CisgICAgICBwRHN0CQkJcG9pbnRlciB0byBkZXN0aW5hdGlvbiBmb3IgY29udmVydCBVTE9ORyB0byBVQ0hBUltdCisgICAgICB2YWwJCQl0aGUgdmFsdWUgZm9yIGNvbnZlcnQKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlSVE1QVGtpcFB1dFVJbnQzMigKKwlJTiBPVVQJUFVDSEFSCQlwRHN0LAorCUlOCQlVTE9ORwkJdmFsKQoreworCUlOVCBpOworCisJZm9yKGkgPSAwOyBpIDwgNDsgaSsrKQorCXsKKwkJKnBEc3QrKyA9IChVQ0hBUikgKHZhbCAmIDB4ZmYpOworCQl2YWwgPj49IDg7CisJfQorfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZQlEZXNjcmlwdGlvbjoKKwkJU2V0IHRoZSBNSUMgS2V5LgorCisJQXJndW1lbnRzOgorICAgICAgcEFkCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisgICAgICBwTUlDS2V5CQlwb2ludGVyIHRvIE1JQyBLZXkKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBSVE1QVGtpcFNldE1JQ0tleSgKKwlJTglQVEtJUF9LRVlfSU5GTwlwVGtpcCwKKwlJTglQVUNIQVIJCQlwTUlDS2V5KQoreworCS8vIFNldCB0aGUga2V5CisJcFRraXAtPkswID0gUlRNUFRraXBHZXRVSW50MzIocE1JQ0tleSk7CisJcFRraXAtPksxID0gUlRNUFRraXBHZXRVSW50MzIocE1JQ0tleSArIDQpOworCS8vIGFuZCByZXNldCB0aGUgbWVzc2FnZQorCXBUa2lwLT5MID0gcFRraXAtPkswOworCXBUa2lwLT5SID0gcFRraXAtPksxOworCXBUa2lwLT5uQnl0ZXNJbk0gPSAwOworCXBUa2lwLT5NID0gMDsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUJRGVzY3JpcHRpb246CisJCUNhbGN1bGF0ZSB0aGUgTUlDIFZhbHVlLgorCisJQXJndW1lbnRzOgorICAgICAgcEFkCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisgICAgICB1Q2hhcgkJCUFwcGVuZCB0aGlzIHVDaGFyCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJUlRNUFRraXBBcHBlbmRCeXRlKAorCUlOCVBUS0lQX0tFWV9JTkZPCXBUa2lwLAorCUlOCVVDSEFSIAkJCXVDaGFyKQoreworCS8vIEFwcGVuZCB0aGUgYnl0ZSB0byBvdXIgd29yZC1zaXplZCBidWZmZXIKKwlwVGtpcC0+TSB8PSAodUNoYXIgPDwgKDgqIHBUa2lwLT5uQnl0ZXNJbk0pKTsKKwlwVGtpcC0+bkJ5dGVzSW5NKys7CisJLy8gUHJvY2VzcyB0aGUgd29yZCBpZiBpdCBpcyBmdWxsLgorCWlmKCBwVGtpcC0+bkJ5dGVzSW5NID49IDQgKQorCXsKKwkJcFRraXAtPkwgXj0gcFRraXAtPk07CisJCXBUa2lwLT5SIF49IFJPTDMyKCBwVGtpcC0+TCwgMTcgKTsKKwkJcFRraXAtPkwgKz0gcFRraXAtPlI7CisJCXBUa2lwLT5SIF49ICgocFRraXAtPkwgJiAweGZmMDBmZjAwKSA+PiA4KSB8ICgocFRraXAtPkwgJiAweDAwZmYwMGZmKSA8PCA4KTsKKwkJcFRraXAtPkwgKz0gcFRraXAtPlI7CisJCXBUa2lwLT5SIF49IFJPTDMyKCBwVGtpcC0+TCwgMyApOworCQlwVGtpcC0+TCArPSBwVGtpcC0+UjsKKwkJcFRraXAtPlIgXj0gUk9SMzIoIHBUa2lwLT5MLCAyICk7CisJCXBUa2lwLT5MICs9IHBUa2lwLT5SOworCQkvLyBDbGVhciB0aGUgYnVmZmVyCisJCXBUa2lwLT5NID0gMDsKKwkJcFRraXAtPm5CeXRlc0luTSA9IDA7CisJfQorfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZQlEZXNjcmlwdGlvbjoKKwkJQ2FsY3VsYXRlIHRoZSBNSUMgVmFsdWUuCisKKwlBcmd1bWVudHM6CisgICAgICBwQWQJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKyAgICAgIHBTcmMJCQlQb2ludGVyIHRvIHNvdXJjZSBkYXRhIGZvciBDYWxjdWxhdGUgTUlDIFZhbHVlCisgICAgICBMZW4JCQlJbmRpY2F0ZSB0aGUgbGVuZ3RoIG9mIHRoZSBzb3VyY2UgZGF0YQorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECVJUTVBUa2lwQXBwZW5kKAorCUlOCVBUS0lQX0tFWV9JTkZPCXBUa2lwLAorCUlOCVBVQ0hBUgkJCXBTcmMsCisJSU4JVUlOVAkJCW5CeXRlcykKK3sKKwkvLyBUaGlzIGlzIHNpbXBsZQorCXdoaWxlKG5CeXRlcyA+IDApCisJeworCQlSVE1QVGtpcEFwcGVuZEJ5dGUocFRraXAsICpwU3JjKyspOworCQluQnl0ZXMtLTsKKwl9Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lCURlc2NyaXB0aW9uOgorCQlHZXQgdGhlIE1JQyBWYWx1ZS4KKworCUFyZ3VtZW50czoKKyAgICAgIHBBZAkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCU5vdGU6CisJCXRoZSBNSUMgVmFsdWUgaXMgc3RvcmUgaW4gcEFkLT5Qcml2YXRlSW5mby5NSUMKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECVJUTVBUa2lwR2V0TUlDKAorCUlOCVBUS0lQX0tFWV9JTkZPCXBUa2lwKQoreworCS8vIEFwcGVuZCB0aGUgbWluaW11bSBwYWRkaW5nCisJUlRNUFRraXBBcHBlbmRCeXRlKHBUa2lwLCAweDVhICk7CisJUlRNUFRraXBBcHBlbmRCeXRlKHBUa2lwLCAwICk7CisJUlRNUFRraXBBcHBlbmRCeXRlKHBUa2lwLCAwICk7CisJUlRNUFRraXBBcHBlbmRCeXRlKHBUa2lwLCAwICk7CisJUlRNUFRraXBBcHBlbmRCeXRlKHBUa2lwLCAwICk7CisJLy8gYW5kIHRoZW4gemVyb2VzIHVudGlsIHRoZSBsZW5ndGggaXMgYSBtdWx0aXBsZSBvZiA0CisJd2hpbGUoIHBUa2lwLT5uQnl0ZXNJbk0gIT0gMCApCisJeworCQlSVE1QVGtpcEFwcGVuZEJ5dGUocFRraXAsIDAgKTsKKwl9CisJLy8gVGhlIGFwcGVuZEJ5dGUgZnVuY3Rpb24gaGFzIGFscmVhZHkgY29tcHV0ZWQgdGhlIHJlc3VsdC4KKwlSVE1QVGtpcFB1dFVJbnQzMihwVGtpcC0+TUlDLCBwVGtpcC0+TCk7CisJUlRNUFRraXBQdXRVSW50MzIocFRraXAtPk1JQyArIDQsIHBUa2lwLT5SKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUJRGVzY3JpcHRpb246CisJCUluaXQgVGtpcCBmdW5jdGlvbi4KKworCUFyZ3VtZW50czoKKyAgICAgIHBBZAkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCQlwVEtleSAgICAgICBQb2ludGVyIHRvIHRoZSBUZW1wb3JhbCBLZXkgKFRLKSwgVEsgc2hhbGwgYmUgMTI4Yml0cy4KKwkJS2V5SWQJCVRLIEtleSBJRAorCQlwVEEJCQlQb2ludGVyIHRvIHRyYW5zbWl0dGVyIGFkZHJlc3MKKwkJcE1JQ0tleQkJcG9pbnRlciB0byBNSUMgS2V5CisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJUlRNUEluaXRUa2lwRW5naW5lKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCXBLZXksCisJSU4JVUNIQVIJCQlLZXlJZCwKKwlJTglQVUNIQVIJCQlwVEEsCisJSU4JUFVDSEFSCQkJcE1JQ0tleSwKKwlJTglQVUNIQVIJCQlwVFNDLAorCU9VVAlQVUxPTkcJCQlwSVYxNiwKKwlPVVQJUFVMT05HCQkJcElWMzIpCit7CisJVEtJUF9JVgl0a2lwSXY7CisKKwkvLyBQcmVwYXJlIDggYnl0ZXMgVEtJUCBlbmNhcHN1bGF0aW9uIGZvciBNUERVCisJTmRpc1plcm9NZW1vcnkoJnRraXBJdiwgc2l6ZW9mKFRLSVBfSVYpKTsKKwl0a2lwSXYuSVYxNi5maWVsZC5yYzAgPSAqKHBUU0MgKyAxKTsKKwl0a2lwSXYuSVYxNi5maWVsZC5yYzEgPSAodGtpcEl2LklWMTYuZmllbGQucmMwIHwgMHgyMCkgJiAweDdmOworCXRraXBJdi5JVjE2LmZpZWxkLnJjMiA9ICpwVFNDOworCXRraXBJdi5JVjE2LmZpZWxkLkNPTlRST0wuZmllbGQuRXh0SVYgPSAxOyAgLy8gMDogbm9uLWV4dGVuZGVkIElWLCAxOiBhbiBleHRlbmRlZCBJVgorCXRraXBJdi5JVjE2LmZpZWxkLkNPTlRST0wuZmllbGQuS2V5SUQgPSBLZXlJZDsKKwlOZGlzTW92ZU1lbW9yeSgmdGtpcEl2LklWMzIsIChwVFNDICsgMiksIDQpOyAgIC8vIENvcHkgSVYKKworCSpwSVYxNiA9IHRraXBJdi5JVjE2LndvcmQ7CisJKnBJVjMyID0gdGtpcEl2LklWMzI7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lCURlc2NyaXB0aW9uOgorCQlJbml0IE1JQyBWYWx1ZSBjYWxjdWxhdGlvbiBmdW5jdGlvbiB3aGljaCBpbmNsdWRlIHNldCBNSUMga2V5ICYKKwkJY2FsY3VsYXRlIGZpcnN0IDE2IGJ5dGVzIChEQSArIFNBICsgcHJpb3JpdHkgKyAgMCkKKworCUFyZ3VtZW50czoKKyAgICAgIHBBZAkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCQlwVEtleSAgICAgICBQb2ludGVyIHRvIHRoZSBUZW1wb3JhbCBLZXkgKFRLKSwgVEsgc2hhbGwgYmUgMTI4Yml0cy4KKwkJcERBCQkJUG9pbnRlciB0byBEQSBhZGRyZXNzCisJCXBTQQkJCVBvaW50ZXIgdG8gU0EgYWRkcmVzcworCQlwTUlDS2V5CQlwb2ludGVyIHRvIE1JQyBLZXkKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJUlRNUEluaXRNSUNFbmdpbmUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJcEtleSwKKwlJTglQVUNIQVIJCQlwREEsCisJSU4JUFVDSEFSCQkJcFNBLAorCUlOICBVQ0hBUiAgICAgICAgICAgVXNlclByaW9yaXR5LAorCUlOCVBVQ0hBUgkJCXBNSUNLZXkpCit7CisJVUxPTkcgUHJpb3JpdHkgPSBVc2VyUHJpb3JpdHk7CisKKwkvLyBJbml0IE1JQyB2YWx1ZSBjYWxjdWxhdGlvbgorCVJUTVBUa2lwU2V0TUlDS2V5KCZwQWQtPlByaXZhdGVJbmZvLlR4LCBwTUlDS2V5KTsKKwkvLyBEQQorCVJUTVBUa2lwQXBwZW5kKCZwQWQtPlByaXZhdGVJbmZvLlR4LCBwREEsIE1BQ19BRERSX0xFTik7CisJLy8gU0EKKwlSVE1QVGtpcEFwcGVuZCgmcEFkLT5Qcml2YXRlSW5mby5UeCwgcFNBLCBNQUNfQUREUl9MRU4pOworCS8vIFByaW9yaXR5ICsgMyBieXRlcyBvZiAwCisJUlRNUFRraXBBcHBlbmQoJnBBZC0+UHJpdmF0ZUluZm8uVHgsIChQVUNIQVIpJlByaW9yaXR5LCA0KTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUJRGVzY3JpcHRpb246CisJCUNvbXBhcmUgTUlDIHZhbHVlIG9mIHJlY2VpdmVkIE1TRFUKKworCUFyZ3VtZW50czoKKwkJcEFkCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKwkJcFNyYyAgICAgICAgUG9pbnRlciB0byB0aGUgcmVjZWl2ZWQgUGxhaW4gdGV4dCBkYXRhCisJCXBEQQkJCVBvaW50ZXIgdG8gREEgYWRkcmVzcworCQlwU0EJCQlQb2ludGVyIHRvIFNBIGFkZHJlc3MKKwkJcE1JQ0tleQkJcG9pbnRlciB0byBNSUMgS2V5CisJCUxlbiAgICAgICAgIHRoZSBsZW5ndGggb2YgdGhlIHJlY2VpdmVkIHBsYWluIHRleHQgZGF0YSBleGNsdWRlIE1JQyB2YWx1ZQorCisJUmV0dXJuIFZhbHVlOgorCQlUUlVFICAgICAgICBNSUMgdmFsdWUgbWF0Y2hlZAorCQlGQUxTRSAgICAgICBNSUMgdmFsdWUgbWlzbWF0Y2hlZAorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworQk9PTEVBTglSVE1QVGtpcENvbXBhcmVNSUNWYWx1ZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlwU3JjLAorCUlOCVBVQ0hBUgkJCXBEQSwKKwlJTglQVUNIQVIJCQlwU0EsCisJSU4JUFVDSEFSCQkJcE1JQ0tleSwKKwlJTglVQ0hBUgkJCVVzZXJQcmlvcml0eSwKKwlJTglVSU5UCQkJTGVuKQoreworCVVDSEFSCU9sZE1pY1s4XTsKKwlVTE9ORwlQcmlvcml0eSA9IFVzZXJQcmlvcml0eTsKKworCS8vIEluaXQgTUlDIHZhbHVlIGNhbGN1bGF0aW9uCisJUlRNUFRraXBTZXRNSUNLZXkoJnBBZC0+UHJpdmF0ZUluZm8uUngsIHBNSUNLZXkpOworCS8vIERBCisJUlRNUFRraXBBcHBlbmQoJnBBZC0+UHJpdmF0ZUluZm8uUngsIHBEQSwgTUFDX0FERFJfTEVOKTsKKwkvLyBTQQorCVJUTVBUa2lwQXBwZW5kKCZwQWQtPlByaXZhdGVJbmZvLlJ4LCBwU0EsIE1BQ19BRERSX0xFTik7CisJLy8gUHJpb3JpdHkgKyAzIGJ5dGVzIG9mIDAKKwlSVE1QVGtpcEFwcGVuZCgmcEFkLT5Qcml2YXRlSW5mby5SeCwgKFBVQ0hBUikmUHJpb3JpdHksIDQpOworCisJLy8gQ2FsY3VsYXRlIE1JQyB2YWx1ZSBmcm9tIHBsYWluIHRleHQgZGF0YQorCVJUTVBUa2lwQXBwZW5kKCZwQWQtPlByaXZhdGVJbmZvLlJ4LCBwU3JjLCBMZW4pOworCisJLy8gR2V0IE1JQyB2YWx1ZGUgZnJvbSByZWNlaXZlZCBmcmFtZQorCU5kaXNNb3ZlTWVtb3J5KE9sZE1pYywgcFNyYyArIExlbiwgOCk7CisKKwkvLyBHZXQgTUlDIHZhbHVlIGZyb20gZGVjcnlwdGVkIHBsYWluIGRhdGEKKwlSVE1QVGtpcEdldE1JQygmcEFkLT5Qcml2YXRlSW5mby5SeCk7CisKKwkvLyBNb3ZlIE1JQyB2YWx1ZSBmcm9tIE1TRFUsIHRoaXMgc3RlcHMgc2hvdWxkIG1vdmUgdG8gZGF0YSBwYXRoLgorCS8vIFNpbmNlIHRoZSBNSUMgdmFsdWUgbWlnaHQgY3Jvc3MgTVBEVXMuCisJaWYoIU5kaXNFcXVhbE1lbW9yeShwQWQtPlByaXZhdGVJbmZvLlJ4Lk1JQywgT2xkTWljLCA4KSkKKwl7CisJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwgKCJSVE1QVGtpcENvbXBhcmVNSUNWYWx1ZSgpOiBUS0lQIE1JQyBFcnJvciAhXG4iKSk7ICAvL01JQyBlcnJvci4KKworCisJCXJldHVybiAoRkFMU0UpOworCX0KKwlyZXR1cm4gKFRSVUUpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZQlEZXNjcmlwdGlvbjoKKwkJQ29tcGFyZSBNSUMgdmFsdWUgb2YgcmVjZWl2ZWQgTVNEVQorCisJQXJndW1lbnRzOgorCQlwQWQJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCQlwTExDCQlMTEMgaGVhZGVyCisJCXBTcmMgICAgICAgIFBvaW50ZXIgdG8gdGhlIHJlY2VpdmVkIFBsYWluIHRleHQgZGF0YQorCQlwREEJCQlQb2ludGVyIHRvIERBIGFkZHJlc3MKKwkJcFNBCQkJUG9pbnRlciB0byBTQSBhZGRyZXNzCisJCXBNSUNLZXkJCXBvaW50ZXIgdG8gTUlDIEtleQorCQlMZW4gICAgICAgICB0aGUgbGVuZ3RoIG9mIHRoZSByZWNlaXZlZCBwbGFpbiB0ZXh0IGRhdGEgZXhjbHVkZSBNSUMgdmFsdWUKKworCVJldHVybiBWYWx1ZToKKwkJVFJVRSAgICAgICAgTUlDIHZhbHVlIG1hdGNoZWQKKwkJRkFMU0UgICAgICAgTUlDIHZhbHVlIG1pc21hdGNoZWQKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0JPT0xFQU4JUlRNUFRraXBDb21wYXJlTUlDVmFsdWVXaXRoTExDKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCXBMTEMsCisJSU4JUFVDSEFSCQkJcFNyYywKKwlJTglQVUNIQVIJCQlwREEsCisJSU4JUFVDSEFSCQkJcFNBLAorCUlOCVBVQ0hBUgkJCXBNSUNLZXksCisJSU4JVUlOVAkJCUxlbikKK3sKKwlVQ0hBUglPbGRNaWNbOF07CisJVUxPTkcJUHJpb3JpdHkgPSAwOworCisJLy8gSW5pdCBNSUMgdmFsdWUgY2FsY3VsYXRpb24KKwlSVE1QVGtpcFNldE1JQ0tleSgmcEFkLT5Qcml2YXRlSW5mby5SeCwgcE1JQ0tleSk7CisJLy8gREEKKwlSVE1QVGtpcEFwcGVuZCgmcEFkLT5Qcml2YXRlSW5mby5SeCwgcERBLCBNQUNfQUREUl9MRU4pOworCS8vIFNBCisJUlRNUFRraXBBcHBlbmQoJnBBZC0+UHJpdmF0ZUluZm8uUngsIHBTQSwgTUFDX0FERFJfTEVOKTsKKwkvLyBQcmlvcml0eSArIDMgYnl0ZXMgb2YgMAorCVJUTVBUa2lwQXBwZW5kKCZwQWQtPlByaXZhdGVJbmZvLlJ4LCAoUFVDSEFSKSZQcmlvcml0eSwgNCk7CisKKwkvLyBTdGFydCB3aXRoIExMQyBoZWFkZXIKKwlSVE1QVGtpcEFwcGVuZCgmcEFkLT5Qcml2YXRlSW5mby5SeCwgcExMQywgOCk7CisKKwkvLyBDYWxjdWxhdGUgTUlDIHZhbHVlIGZyb20gcGxhaW4gdGV4dCBkYXRhCisJUlRNUFRraXBBcHBlbmQoJnBBZC0+UHJpdmF0ZUluZm8uUngsIHBTcmMsIExlbik7CisKKwkvLyBHZXQgTUlDIHZhbHVkZSBmcm9tIHJlY2VpdmVkIGZyYW1lCisJTmRpc01vdmVNZW1vcnkoT2xkTWljLCBwU3JjICsgTGVuLCA4KTsKKworCS8vIEdldCBNSUMgdmFsdWUgZnJvbSBkZWNyeXB0ZWQgcGxhaW4gZGF0YQorCVJUTVBUa2lwR2V0TUlDKCZwQWQtPlByaXZhdGVJbmZvLlJ4KTsKKworCS8vIE1vdmUgTUlDIHZhbHVlIGZyb20gTVNEVSwgdGhpcyBzdGVwcyBzaG91bGQgbW92ZSB0byBkYXRhIHBhdGguCisJLy8gU2luY2UgdGhlIE1JQyB2YWx1ZSBtaWdodCBjcm9zcyBNUERVcy4KKwlpZighTmRpc0VxdWFsTWVtb3J5KHBBZC0+UHJpdmF0ZUluZm8uUnguTUlDLCBPbGRNaWMsIDgpKQorCXsKKwkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCAoIlJUTVBUa2lwQ29tcGFyZU1JQ1ZhbHVlV2l0aExMQygpOiBUS0lQIE1JQyBFcnJvciAhXG4iKSk7ICAvL01JQyBlcnJvci4KKworCisJCXJldHVybiAoRkFMU0UpOworCX0KKwlyZXR1cm4gKFRSVUUpOworfQorLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUJRGVzY3JpcHRpb246CisJCUNvcHkgZnJhbWUgZnJvbSB3YWl0aW5nIHF1ZXVlIGludG8gcmVsYXRpdmUgcmluZyBidWZmZXIgYW5kIHNldAorCWFwcHJvcHJpYXRlIEFTSUMgcmVnaXN0ZXIgdG8ga2ljayBoYXJkd2FyZSB0cmFuc21pdCBmdW5jdGlvbgorCisJQXJndW1lbnRzOgorCQlwQWQJCVBvaW50ZXIJdG8gb3VyIGFkYXB0ZXIKKwkJUE5ESVNfUEFDS0VUCVBvaW50ZXIgdG8gTmRpcyBQYWNrZXQgZm9yIE1JQyBjYWxjdWxhdGlvbgorCQlwRW5jYXAJCQlQb2ludGVyIHRvIExMQyBlbmNhcCBkYXRhCisJCUxlbkVuY2FwCQlUb3RhbCBlbmNhcCBsZW5ndGgsIG1pZ2h0IGJlIDAgd2hpY2ggaW5kaWNhdGVzIG5vIGVuY2FwCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJUlRNUENhbGN1bGF0ZU1JQ1ZhbHVlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBORElTX1BBQ0tFVAlwUGFja2V0LAorCUlOCVBVQ0hBUgkJCXBFbmNhcCwKKwlJTglQQ0lQSEVSX0tFWQkJcEtleSwKKwlJTglVQ0hBUgkJCWFwaWR4KQoreworCVBBQ0tFVF9JTkZPCQlQYWNrZXRJbmZvOworCVBVQ0hBUgkJCXBTcmNCdWZWQTsKKwlVSU5UCQkJU3JjQnVmTGVuOworCVBVQ0hBUgkJCXBTcmM7CisgICAgVUNIQVIgICAgICAgICAgIFVzZXJQcmlvcml0eTsKKwlVQ0hBUgkJCXZsYW5fb2Zmc2V0ID0gMDsKKworCVJUTVBfUXVlcnlQYWNrZXRJbmZvKHBQYWNrZXQsICZQYWNrZXRJbmZvLCAmcFNyY0J1ZlZBLCAmU3JjQnVmTGVuKTsKKworCVVzZXJQcmlvcml0eSA9IFJUTVBfR0VUX1BBQ0tFVF9VUChwUGFja2V0KTsKKwlwU3JjID0gcFNyY0J1ZlZBOworCisJLy8gZGV0ZXJtaW5lIGlmIHRoaXMgaXMgYSB2bGFuIHBhY2tldAorCWlmICgoKCoocFNyYyArIDEyKSA8PCA4KSArICoocFNyYyArIDEzKSkgPT0gMHg4MTAwKQorCQl2bGFuX29mZnNldCA9IDQ7CisKKwl7CisJCVJUTVBJbml0TUlDRW5naW5lKAorCQkJcEFkLAorCQkJcEtleS0+S2V5LAorCQkJcFNyYywKKwkJCXBTcmMgKyA2LAorCQkJVXNlclByaW9yaXR5LAorCQkJcEtleS0+VHhNaWMpOworCX0KKworCisJaWYgKHBFbmNhcCAhPSBOVUxMKQorCXsKKwkJLy8gTExDIGVuY2Fwc3VsYXRpb24KKwkJUlRNUFRraXBBcHBlbmQoJnBBZC0+UHJpdmF0ZUluZm8uVHgsIHBFbmNhcCwgNik7CisJCS8vIFByb3RvY29sIFR5cGUKKwkJUlRNUFRraXBBcHBlbmQoJnBBZC0+UHJpdmF0ZUluZm8uVHgsIHBTcmMgKyAxMiArIHZsYW5fb2Zmc2V0LCAyKTsKKwl9CisJU3JjQnVmTGVuIC09ICgxNCArIHZsYW5fb2Zmc2V0KTsKKwlwU3JjICs9ICgxNCArIHZsYW5fb2Zmc2V0KTsKKwlkbworCXsKKwkJaWYgKFNyY0J1ZkxlbiA+IDApCisJCXsKKwkJCVJUTVBUa2lwQXBwZW5kKCZwQWQtPlByaXZhdGVJbmZvLlR4LCBwU3JjLCBTcmNCdWZMZW4pOworCQl9CisKKwkJYnJlYWs7CS8vIE5vIG5lZWQgaGFuZGxlIG5leHQgcGFja2V0CisKKwl9CXdoaWxlIChUUlVFKTsJCS8vIEVuZCBvZiBjb3B5aW5nIHBheWxvYWQKKworCS8vIENvbXB1dGUgdGhlIGZpbmFsIE1JQyBWYWx1ZQorCVJUTVBUa2lwR2V0TUlDKCZwQWQtPlByaXZhdGVJbmZvLlR4KTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogdGtpcF9zYm94KCkJCQkJCQkJCQkJCQkJCQkJKi8KKy8qIFJldHVybnMgYSAxNiBiaXQgdmFsdWUgZnJvbSBhIDY0SyBlbnRyeSB0YWJsZS4gVGhlIFRhYmxlICovCisvKiBpcyBzeW50aGVzaXplZCBmcm9tIHR3byAyNTYgZW50cnkgYnl0ZSB3aWRlIHRhYmxlcy4JCSovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitVSU5UIHRraXBfc2JveChVSU5UIGluZGV4KQoreworCVVJTlQgaW5kZXhfbG93OworCVVJTlQgaW5kZXhfaGlnaDsKKwlVSU5UIGxlZnQsIHJpZ2h0OworCisJaW5kZXhfbG93ID0gKGluZGV4ICUgMjU2KTsKKwlpbmRleF9oaWdoID0gKChpbmRleCA+PiA4KSAlIDI1Nik7CisKKwlsZWZ0ID0gVGtpcF9TYm94X0xvd2VyW2luZGV4X2xvd10gKyAoVGtpcF9TYm94X1VwcGVyW2luZGV4X2xvd10gKiAyNTYpOworCXJpZ2h0ID0gVGtpcF9TYm94X1VwcGVyW2luZGV4X2hpZ2hdICsgKFRraXBfU2JveF9Mb3dlcltpbmRleF9oaWdoXSAqIDI1Nik7CisKKwlyZXR1cm4gKGxlZnQgXiByaWdodCk7Cit9CisKK1VJTlQgcm90cjEoVUlOVCBhKQoreworCXVuc2lnbmVkIGludCBiOworCisJaWYgKChhICYgMHgwMSkgPT0gMHgwMSkKKwl7CisJCWIgPSAoYSA+PiAxKSB8IDB4ODAwMDsKKwl9CisJZWxzZQorCXsKKwkJYiA9IChhID4+IDEpICYgMHg3ZmZmOworCX0KKwliID0gYiAlIDY1NTM2OworCXJldHVybiBiOworfQorCitWT0lEIFJUTVBUa2lwTWl4S2V5KAorCVVDSEFSICprZXksCisJVUNIQVIgKnRhLAorCVVMT05HIHBubCwgLyogTGVhc3Qgc2lnbmlmaWNhbnQgMTYgYml0cyBvZiBQTiAqLworCVVMT05HIHBuaCwgLyogTW9zdCBzaWduaWZpY2FudCAzMiBiaXRzIG9mIFBOICovCisJVUNIQVIgKnJjNGtleSwKKwlVSU5UICpwMWspCit7CisKKwlVSU5UIHRzYzA7CisJVUlOVCB0c2MxOworCVVJTlQgdHNjMjsKKworCVVJTlQgcHBrMDsKKwlVSU5UIHBwazE7CisJVUlOVCBwcGsyOworCVVJTlQgcHBrMzsKKwlVSU5UIHBwazQ7CisJVUlOVCBwcGs1OworCisJSU5UIGk7CisJSU5UIGo7CisKKwl0c2MwID0gKHVuc2lnbmVkIGludCkoKHBuaCA+PiAxNikgJSA2NTUzNik7IC8qIG1zYiAqLworCXRzYzEgPSAodW5zaWduZWQgaW50KShwbmggJSA2NTUzNik7CisJdHNjMiA9ICh1bnNpZ25lZCBpbnQpKHBubCAlIDY1NTM2KTsgLyogbHNiICovCisKKwkvKiBQaGFzZSAxLCBzdGVwIDEgKi8KKwlwMWtbMF0gPSB0c2MxOworCXAxa1sxXSA9IHRzYzA7CisJcDFrWzJdID0gKFVJTlQpKHRhWzBdICsgKHRhWzFdKjI1NikpOworCXAxa1szXSA9IChVSU5UKSh0YVsyXSArICh0YVszXSoyNTYpKTsKKwlwMWtbNF0gPSAoVUlOVCkodGFbNF0gKyAodGFbNV0qMjU2KSk7CisKKwkvKiBQaGFzZSAxLCBzdGVwIDIgKi8KKwlmb3IgKGk9MDsgaTw4OyBpKyspCisJeworCQlqID0gMiooaSAmIDEpOworCQlwMWtbMF0gPSAocDFrWzBdICsgdGtpcF9zYm94KCAocDFrWzRdIF4gKCgyNTYqa2V5WzEral0pICsga2V5W2pdKSkgJSA2NTUzNiApKSAlIDY1NTM2OworCQlwMWtbMV0gPSAocDFrWzFdICsgdGtpcF9zYm94KCAocDFrWzBdIF4gKCgyNTYqa2V5WzUral0pICsga2V5WzQral0pKSAlIDY1NTM2ICkpICUgNjU1MzY7CisJCXAxa1syXSA9IChwMWtbMl0gKyB0a2lwX3Nib3goIChwMWtbMV0gXiAoKDI1NiprZXlbOStqXSkgKyBrZXlbOCtqXSkpICUgNjU1MzYgKSkgJSA2NTUzNjsKKwkJcDFrWzNdID0gKHAxa1szXSArIHRraXBfc2JveCggKHAxa1syXSBeICgoMjU2KmtleVsxMytqXSkgKyBrZXlbMTIral0pKSAlIDY1NTM2ICkpICUgNjU1MzY7CisJCXAxa1s0XSA9IChwMWtbNF0gKyB0a2lwX3Nib3goIChwMWtbM10gXiAoKCgyNTYqa2V5WzEral0pICsga2V5W2pdKSkpICUgNjU1MzYgKSkgJSA2NTUzNjsKKwkJcDFrWzRdID0gKHAxa1s0XSArIGkpICUgNjU1MzY7CisJfQorCisJLyogUGhhc2UgMiwgU3RlcCAxICovCisJcHBrMCA9IHAxa1swXTsKKwlwcGsxID0gcDFrWzFdOworCXBwazIgPSBwMWtbMl07CisJcHBrMyA9IHAxa1szXTsKKwlwcGs0ID0gcDFrWzRdOworCXBwazUgPSAocDFrWzRdICsgdHNjMikgJSA2NTUzNjsKKworCS8qIFBoYXNlMiwgU3RlcCAyICovCisJcHBrMCA9IHBwazAgKyB0a2lwX3Nib3goIChwcGs1IF4gKCgyNTYqa2V5WzFdKSArIGtleVswXSkpICUgNjU1MzYpOworCXBwazEgPSBwcGsxICsgdGtpcF9zYm94KCAocHBrMCBeICgoMjU2KmtleVszXSkgKyBrZXlbMl0pKSAlIDY1NTM2KTsKKwlwcGsyID0gcHBrMiArIHRraXBfc2JveCggKHBwazEgXiAoKDI1NiprZXlbNV0pICsga2V5WzRdKSkgJSA2NTUzNik7CisJcHBrMyA9IHBwazMgKyB0a2lwX3Nib3goIChwcGsyIF4gKCgyNTYqa2V5WzddKSArIGtleVs2XSkpICUgNjU1MzYpOworCXBwazQgPSBwcGs0ICsgdGtpcF9zYm94KCAocHBrMyBeICgoMjU2KmtleVs5XSkgKyBrZXlbOF0pKSAlIDY1NTM2KTsKKwlwcGs1ID0gcHBrNSArIHRraXBfc2JveCggKHBwazQgXiAoKDI1NiprZXlbMTFdKSArIGtleVsxMF0pKSAlIDY1NTM2KTsKKworCXBwazAgPSBwcGswICsgcm90cjEocHBrNSBeICgoMjU2KmtleVsxM10pICsga2V5WzEyXSkpOworCXBwazEgPSBwcGsxICsgcm90cjEocHBrMCBeICgoMjU2KmtleVsxNV0pICsga2V5WzE0XSkpOworCXBwazIgPSBwcGsyICsgcm90cjEocHBrMSk7CisJcHBrMyA9IHBwazMgKyByb3RyMShwcGsyKTsKKwlwcGs0ID0gcHBrNCArIHJvdHIxKHBwazMpOworCXBwazUgPSBwcGs1ICsgcm90cjEocHBrNCk7CisKKwkvKiBQaGFzZSAyLCBTdGVwIDMgKi8KKyAgICAvKiBQaGFzZSAyLCBTdGVwIDMgKi8KKworCXRzYzAgPSAodW5zaWduZWQgaW50KSgocG5oID4+IDE2KSAlIDY1NTM2KTsgLyogbXNiICovCisJdHNjMSA9ICh1bnNpZ25lZCBpbnQpKHBuaCAlIDY1NTM2KTsKKwl0c2MyID0gKHVuc2lnbmVkIGludCkocG5sICUgNjU1MzYpOyAvKiBsc2IgKi8KKworCXJjNGtleVswXSA9ICh0c2MyID4+IDgpICUgMjU2OworCXJjNGtleVsxXSA9ICgoKHRzYzIgPj4gOCkgJSAyNTYpIHwgMHgyMCkgJiAweDdmOworCXJjNGtleVsyXSA9IHRzYzIgJSAyNTY7CisJcmM0a2V5WzNdID0gKChwcGs1IF4gKCgyNTYqa2V5WzFdKSArIGtleVswXSkpID4+IDEpICUgMjU2OworCisJcmM0a2V5WzRdID0gcHBrMCAlIDI1NjsKKwlyYzRrZXlbNV0gPSAocHBrMCA+PiA4KSAlIDI1NjsKKworCXJjNGtleVs2XSA9IHBwazEgJSAyNTY7CisJcmM0a2V5WzddID0gKHBwazEgPj4gOCkgJSAyNTY7CisKKwlyYzRrZXlbOF0gPSBwcGsyICUgMjU2OworCXJjNGtleVs5XSA9IChwcGsyID4+IDgpICUgMjU2OworCisJcmM0a2V5WzEwXSA9IHBwazMgJSAyNTY7CisJcmM0a2V5WzExXSA9IChwcGszID4+IDgpICUgMjU2OworCisJcmM0a2V5WzEyXSA9IHBwazQgJSAyNTY7CisJcmM0a2V5WzEzXSA9IChwcGs0ID4+IDgpICUgMjU2OworCisJcmM0a2V5WzE0XSA9IHBwazUgJSAyNTY7CisJcmM0a2V5WzE1XSA9IChwcGs1ID4+IDgpICUgMjU2OworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBjb25zdHJ1Y3RfbWljX2hlYWRlcjEoKSAgICAgICAgICAgICAgICAgICAgICAqLworLyogQnVpbGRzIHRoZSBmaXJzdCBNSUMgaGVhZGVyIGJsb2NrIGZyb20gICAgICAgKi8KKy8qIGhlYWRlciBmaWVsZHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIGNvbnN0cnVjdF9taWNfaGVhZGVyMSgKKwl1bnNpZ25lZCBjaGFyICptaWNfaGVhZGVyMSwKKwlpbnQgaGVhZGVyX2xlbmd0aCwKKwl1bnNpZ25lZCBjaGFyICptcGR1KQoreworCW1pY19oZWFkZXIxWzBdID0gKHVuc2lnbmVkIGNoYXIpKChoZWFkZXJfbGVuZ3RoIC0gMikgLyAyNTYpOworCW1pY19oZWFkZXIxWzFdID0gKHVuc2lnbmVkIGNoYXIpKChoZWFkZXJfbGVuZ3RoIC0gMikgJSAyNTYpOworCW1pY19oZWFkZXIxWzJdID0gbXBkdVswXSAmIDB4Y2Y7ICAgIC8qIE11dGUgQ0YgcG9sbCAmIENGIGFjayBiaXRzICovCisJbWljX2hlYWRlcjFbM10gPSBtcGR1WzFdICYgMHhjNzsgICAgLyogTXV0ZSByZXRyeSwgbW9yZSBkYXRhIGFuZCBwd3IgbWd0IGJpdHMgKi8KKwltaWNfaGVhZGVyMVs0XSA9IG1wZHVbNF07ICAgICAgIC8qIEExICovCisJbWljX2hlYWRlcjFbNV0gPSBtcGR1WzVdOworCW1pY19oZWFkZXIxWzZdID0gbXBkdVs2XTsKKwltaWNfaGVhZGVyMVs3XSA9IG1wZHVbN107CisJbWljX2hlYWRlcjFbOF0gPSBtcGR1WzhdOworCW1pY19oZWFkZXIxWzldID0gbXBkdVs5XTsKKwltaWNfaGVhZGVyMVsxMF0gPSBtcGR1WzEwXTsgICAgIC8qIEEyICovCisJbWljX2hlYWRlcjFbMTFdID0gbXBkdVsxMV07CisJbWljX2hlYWRlcjFbMTJdID0gbXBkdVsxMl07CisJbWljX2hlYWRlcjFbMTNdID0gbXBkdVsxM107CisJbWljX2hlYWRlcjFbMTRdID0gbXBkdVsxNF07CisJbWljX2hlYWRlcjFbMTVdID0gbXBkdVsxNV07Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBjb25zdHJ1Y3RfbWljX2hlYWRlcjIoKSAgICAgICAgICAgICAgICAgICAgICAqLworLyogQnVpbGRzIHRoZSBsYXN0IE1JQyBoZWFkZXIgYmxvY2sgZnJvbSAgICAgICAgKi8KKy8qIGhlYWRlciBmaWVsZHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIGNvbnN0cnVjdF9taWNfaGVhZGVyMigKKwl1bnNpZ25lZCBjaGFyICptaWNfaGVhZGVyMiwKKwl1bnNpZ25lZCBjaGFyICptcGR1LAorCWludCBhNF9leGlzdHMsCisJaW50IHFjX2V4aXN0cykKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGk8MTY7IGkrKykgbWljX2hlYWRlcjJbaV09MHgwMDsKKworCW1pY19oZWFkZXIyWzBdID0gbXBkdVsxNl07ICAgIC8qIEEzICovCisJbWljX2hlYWRlcjJbMV0gPSBtcGR1WzE3XTsKKwltaWNfaGVhZGVyMlsyXSA9IG1wZHVbMThdOworCW1pY19oZWFkZXIyWzNdID0gbXBkdVsxOV07CisJbWljX2hlYWRlcjJbNF0gPSBtcGR1WzIwXTsKKwltaWNfaGVhZGVyMls1XSA9IG1wZHVbMjFdOworCisJLy8gSW4gU2VxdWVuY2UgQ29udHJvbCBmaWVsZCwgbXV0ZSBzZXF1ZW5jZSBudW1lciBiaXRzICgxMi1iaXQpCisJbWljX2hlYWRlcjJbNl0gPSBtcGR1WzIyXSAmIDB4MGY7ICAgLyogU0MgKi8KKwltaWNfaGVhZGVyMls3XSA9IDB4MDA7IC8qIG1wZHVbMjNdOyAqLworCisJaWYgKCghcWNfZXhpc3RzKSAmIGE0X2V4aXN0cykKKwl7CisJCWZvciAoaT0wO2k8NjtpKyspIG1pY19oZWFkZXIyWzgraV0gPSBtcGR1WzI0K2ldOyAgIC8qIEE0ICovCisKKwl9CisKKwlpZiAocWNfZXhpc3RzICYmICghYTRfZXhpc3RzKSkKKwl7CisJCW1pY19oZWFkZXIyWzhdID0gbXBkdVsyNF0gJiAweDBmOyAvKiBtdXRlIGJpdHMgMTUgLSA0ICovCisJCW1pY19oZWFkZXIyWzldID0gbXBkdVsyNV0gJiAweDAwOworCX0KKworCWlmIChxY19leGlzdHMgJiYgYTRfZXhpc3RzKQorCXsKKwkJZm9yIChpPTA7aTw2O2krKykgbWljX2hlYWRlcjJbOCtpXSA9IG1wZHVbMjQraV07ICAgLyogQTQgKi8KKworCQltaWNfaGVhZGVyMlsxNF0gPSBtcGR1WzMwXSAmIDB4MGY7CisJCW1pY19oZWFkZXIyWzE1XSA9IG1wZHVbMzFdICYgMHgwMDsKKwl9Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIGNvbnN0cnVjdF9taWNfaXYoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBCdWlsZHMgdGhlIE1JQyBJViBmcm9tIGhlYWRlciBmaWVsZHMgYW5kIFBOICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBjb25zdHJ1Y3RfbWljX2l2KAorCXVuc2lnbmVkIGNoYXIgKm1pY19pdiwKKwlpbnQgcWNfZXhpc3RzLAorCWludCBhNF9leGlzdHMsCisJdW5zaWduZWQgY2hhciAqbXBkdSwKKwl1bnNpZ25lZCBpbnQgcGF5bG9hZF9sZW5ndGgsCisJdW5zaWduZWQgY2hhciAqcG5fdmVjdG9yKQoreworCWludCBpOworCisJbWljX2l2WzBdID0gMHg1OTsKKwlpZiAocWNfZXhpc3RzICYmIGE0X2V4aXN0cykKKwkJbWljX2l2WzFdID0gbXBkdVszMF0gJiAweDBmOyAgICAvKiBRb1NfVEMgICAgICAgICAgICovCisJaWYgKHFjX2V4aXN0cyAmJiAhYTRfZXhpc3RzKQorCQltaWNfaXZbMV0gPSBtcGR1WzI0XSAmIDB4MGY7ICAgLyogbXV0ZSBiaXRzIDctNCAgICAqLworCWlmICghcWNfZXhpc3RzKQorCQltaWNfaXZbMV0gPSAweDAwOworCWZvciAoaSA9IDI7IGkgPCA4OyBpKyspCisJCW1pY19pdltpXSA9IG1wZHVbaSArIDhdOyAgICAgICAgICAgICAgICAgICAgLyogbWljX2l2WzI6N10gPSBBMlswOjVdID0gbXBkdVsxMDoxNV0gKi8KKyNpZmRlZiBDT05TSVNURU5UX1BOX09SREVSCisJCWZvciAoaSA9IDg7IGkgPCAxNDsgaSsrKQorCQkJbWljX2l2W2ldID0gcG5fdmVjdG9yW2kgLSA4XTsgICAgICAgICAgIC8qIG1pY19pdls4OjEzXSA9IFBOWzA6NV0gKi8KKyNlbHNlCisJCWZvciAoaSA9IDg7IGkgPCAxNDsgaSsrKQorCQkJbWljX2l2W2ldID0gcG5fdmVjdG9yWzEzIC0gaV07ICAgICAgICAgIC8qIG1pY19pdls4OjEzXSA9IFBOWzU6MF0gKi8KKyNlbmRpZgorCWkgPSAocGF5bG9hZF9sZW5ndGggLyAyNTYpOworCWkgPSAocGF5bG9hZF9sZW5ndGggJSAyNTYpOworCW1pY19pdlsxNF0gPSAodW5zaWduZWQgY2hhcikgKHBheWxvYWRfbGVuZ3RoIC8gMjU2KTsKKwltaWNfaXZbMTVdID0gKHVuc2lnbmVkIGNoYXIpIChwYXlsb2FkX2xlbmd0aCAlIDI1Nik7CisKK30KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBiaXR3aXNlX3hvcigpICAgICAgICAgICAgICAgICAgICAqLworLyogQSAxMjggYml0LCBiaXR3aXNlIGV4Y2x1c2l2ZSBvciAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgYml0d2lzZV94b3IodW5zaWduZWQgY2hhciAqaW5hLCB1bnNpZ25lZCBjaGFyICppbmIsIHVuc2lnbmVkIGNoYXIgKm91dCkKK3sKKwlpbnQgaTsKKwlmb3IgKGk9MDsgaTwxNjsgaSsrKQorCXsKKwkJb3V0W2ldID0gaW5hW2ldIF4gaW5iW2ldOworCX0KK30KKworCit2b2lkIGFlczEyOGsxMjhkKHVuc2lnbmVkIGNoYXIgKmtleSwgdW5zaWduZWQgY2hhciAqZGF0YSwgdW5zaWduZWQgY2hhciAqY2lwaGVydGV4dCkKK3sKKwlpbnQgcm91bmQ7CisJaW50IGk7CisJdW5zaWduZWQgY2hhciBpbnRlcm1lZGlhdGVhWzE2XTsKKwl1bnNpZ25lZCBjaGFyIGludGVybWVkaWF0ZWJbMTZdOworCXVuc2lnbmVkIGNoYXIgcm91bmRfa2V5WzE2XTsKKworCWZvcihpPTA7IGk8MTY7IGkrKykgcm91bmRfa2V5W2ldID0ga2V5W2ldOworCisJZm9yIChyb3VuZCA9IDA7IHJvdW5kIDwgMTE7IHJvdW5kKyspCisJeworCQlpZiAocm91bmQgPT0gMCkKKwkJeworCQkJeG9yXzEyOChyb3VuZF9rZXksIGRhdGEsIGNpcGhlcnRleHQpOworCQkJbmV4dF9rZXkocm91bmRfa2V5LCByb3VuZCk7CisJCX0KKwkJZWxzZSBpZiAocm91bmQgPT0gMTApCisJCXsKKwkJCWJ5dGVfc3ViKGNpcGhlcnRleHQsIGludGVybWVkaWF0ZWEpOworCQkJc2hpZnRfcm93KGludGVybWVkaWF0ZWEsIGludGVybWVkaWF0ZWIpOworCQkJeG9yXzEyOChpbnRlcm1lZGlhdGViLCByb3VuZF9rZXksIGNpcGhlcnRleHQpOworCQl9CisJCWVsc2UgICAgLyogMSAtIDkgKi8KKwkJeworCQkJYnl0ZV9zdWIoY2lwaGVydGV4dCwgaW50ZXJtZWRpYXRlYSk7CisJCQlzaGlmdF9yb3coaW50ZXJtZWRpYXRlYSwgaW50ZXJtZWRpYXRlYik7CisJCQltaXhfY29sdW1uKCZpbnRlcm1lZGlhdGViWzBdLCAmaW50ZXJtZWRpYXRlYVswXSk7CisJCQltaXhfY29sdW1uKCZpbnRlcm1lZGlhdGViWzRdLCAmaW50ZXJtZWRpYXRlYVs0XSk7CisJCQltaXhfY29sdW1uKCZpbnRlcm1lZGlhdGViWzhdLCAmaW50ZXJtZWRpYXRlYVs4XSk7CisJCQltaXhfY29sdW1uKCZpbnRlcm1lZGlhdGViWzEyXSwgJmludGVybWVkaWF0ZWFbMTJdKTsKKwkJCXhvcl8xMjgoaW50ZXJtZWRpYXRlYSwgcm91bmRfa2V5LCBjaXBoZXJ0ZXh0KTsKKwkJCW5leHRfa2V5KHJvdW5kX2tleSwgcm91bmQpOworCQl9CisJfQorCit9CisKK3ZvaWQgY29uc3RydWN0X2N0cl9wcmVsb2FkKAorCXVuc2lnbmVkIGNoYXIgKmN0cl9wcmVsb2FkLAorCWludCBhNF9leGlzdHMsCisJaW50IHFjX2V4aXN0cywKKwl1bnNpZ25lZCBjaGFyICptcGR1LAorCXVuc2lnbmVkIGNoYXIgKnBuX3ZlY3RvciwKKwlpbnQgYykKK3sKKworCWludCBpID0gMDsKKwlmb3IgKGk9MDsgaTwxNjsgaSsrKSBjdHJfcHJlbG9hZFtpXSA9IDB4MDA7CisJaSA9IDA7CisKKwljdHJfcHJlbG9hZFswXSA9IDB4MDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZsYWcgKi8KKwlpZiAocWNfZXhpc3RzICYmIGE0X2V4aXN0cykgY3RyX3ByZWxvYWRbMV0gPSBtcGR1WzMwXSAmIDB4MGY7ICAgLyogUW9DX0NvbnRyb2wgICovCisJaWYgKHFjX2V4aXN0cyAmJiAhYTRfZXhpc3RzKSBjdHJfcHJlbG9hZFsxXSA9IG1wZHVbMjRdICYgMHgwZjsKKworCWZvciAoaSA9IDI7IGkgPCA4OyBpKyspCisJCWN0cl9wcmVsb2FkW2ldID0gbXBkdVtpICsgOF07ICAgICAgICAgICAgICAgICAgICAgICAvKiBjdHJfcHJlbG9hZFsyOjddID0gQTJbMDo1XSA9IG1wZHVbMTA6MTVdICovCisjaWZkZWYgQ09OU0lTVEVOVF9QTl9PUkRFUgorCSAgZm9yIChpID0gODsgaSA8IDE0OyBpKyspCisJCQljdHJfcHJlbG9hZFtpXSA9ICAgIHBuX3ZlY3RvcltpIC0gOF07ICAgICAgICAgICAvKiBjdHJfcHJlbG9hZFs4OjEzXSA9IFBOWzA6NV0gKi8KKyNlbHNlCisJICBmb3IgKGkgPSA4OyBpIDwgMTQ7IGkrKykKKwkJCWN0cl9wcmVsb2FkW2ldID0gICAgcG5fdmVjdG9yWzEzIC0gaV07ICAgICAgICAgIC8qIGN0cl9wcmVsb2FkWzg6MTNdID0gUE5bNTowXSAqLworI2VuZGlmCisJY3RyX3ByZWxvYWRbMTRdID0gICh1bnNpZ25lZCBjaGFyKSAoYyAvIDI1Nik7IC8vIEN0cgorCWN0cl9wcmVsb2FkWzE1XSA9ICAodW5zaWduZWQgY2hhcikgKGMgJSAyNTYpOworCit9CisKKworLy8KKy8vIFRSVUU6IFN1Y2Nlc3MhCisvLyBGQUxTRTogRGVjcnlwdCBFcnJvciEKKy8vCitCT09MRUFOIFJUTVBTb2Z0RGVjcnlwdFRLSVAoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gUFVDSEFSCXBEYXRhLAorCUlOIFVMT05HCURhdGFCeXRlQ250LAorCUlOIFVDSEFSICAgIFVzZXJQcmlvcml0eSwKKwlJTiBQQ0lQSEVSX0tFWQlwV3BhS2V5KQoreworCVVDSEFSCQkJS2V5SUQ7CisJVUlOVAkJCUhlYWRlckxlbjsKKyAgICBVQ0hBUgkJCWZjMDsKKwlVQ0hBUgkJCWZjMTsKKwlVU0hPUlQJCQlmYzsKKwlVSU5UCQkJZnJhbWVfdHlwZTsKKwlVSU5UCQkJZnJhbWVfc3VidHlwZTsKKyAgICBVSU5UCQkJZnJvbV9kczsKKyAgICBVSU5UCQkJdG9fZHM7CisJSU5UCQkJCWE0X2V4aXN0czsKKwlJTlQJCQkJcWNfZXhpc3RzOworCVVTSE9SVAkJCWR1cmF0aW9uOworCVVTSE9SVAkJCXNlcV9jb250cm9sOworCVVTSE9SVAkJCXFvc19jb250cm9sOworCVVDSEFSCQkJVEFbTUFDX0FERFJfTEVOXTsKKwlVQ0hBUgkJCURBW01BQ19BRERSX0xFTl07CisJVUNIQVIJCQlTQVtNQUNfQUREUl9MRU5dOworCVVDSEFSCQkJUkM0S2V5WzE2XTsKKwlVSU5UCQkJcDFrWzVdOyAvL2ZvciBtaXhfa2V5OworCVVMT05HCQkJcG5sOy8qIExlYXN0IHNpZ25pZmljYW50IDE2IGJpdHMgb2YgUE4gKi8KKwlVTE9ORwkJCXBuaDsvKiBNb3N0IHNpZ25pZmljYW50IDMyIGJpdHMgb2YgUE4gKi8KKwlVSU5UCQkJbnVtX2Jsb2NrczsKKwlVSU5UCQkJcGF5bG9hZF9yZW1haW5kZXI7CisJQVJDRk9VUkNPTlRFWFQgCUFyY0ZvdXJDb250ZXh0OworCVVJTlQJCQljcmMzMiA9IDA7CisJVUlOVAkJCXRyYWlsZmNzID0gMDsKKwlVQ0hBUgkJCU1JQ1s4XTsKKwlVQ0hBUgkJCVRyYWlsTUlDWzhdOworCisjaWZkZWYgUlRfQklHX0VORElBTgorCVJUTVBGcmFtZUVuZGlhbkNoYW5nZShwQWQsIChQVUNIQVIpcERhdGEsIERJUl9SRUFELCBGQUxTRSk7CisjZW5kaWYKKworCWZjMCA9ICpwRGF0YTsKKwlmYzEgPSAqKHBEYXRhICsgMSk7CisKKwlmYyA9ICooKFBVU0hPUlQpcERhdGEpOworCisJZnJhbWVfdHlwZSA9ICgoZmMwID4+IDIpICYgMHgwMyk7CisJZnJhbWVfc3VidHlwZSA9ICgoZmMwID4+IDQpICYgMHgwZik7CisKKyAgICBmcm9tX2RzID0gKGZjMSAmIDB4MikgPj4gMTsKKyAgICB0b19kcyA9IChmYzEgJiAweDEpOworCisgICAgYTRfZXhpc3RzID0gKGZyb21fZHMgJiB0b19kcyk7CisgICAgcWNfZXhpc3RzID0gKChmcmFtZV9zdWJ0eXBlID09IDB4MDgpIHx8ICAgIC8qIEFzc3VtZWQgUW9TIHN1YnR5cGVzICovCisgICAgICAgICAgICAgICAgICAoZnJhbWVfc3VidHlwZSA9PSAweDA5KSB8fCAgIC8qIExpa2VseSB0byBjaGFuZ2UuICAgICovCisgICAgICAgICAgICAgICAgICAoZnJhbWVfc3VidHlwZSA9PSAweDBhKSB8fAorICAgICAgICAgICAgICAgICAgKGZyYW1lX3N1YnR5cGUgPT0gMHgwYikKKyAgICAgICAgICAgICAgICAgKTsKKworCUhlYWRlckxlbiA9IDI0OworCWlmIChhNF9leGlzdHMpCisJCUhlYWRlckxlbiArPSA2OworCisJS2V5SUQgPSAqKChQVUNIQVIpKHBEYXRhKyBIZWFkZXJMZW4gKyAzKSk7CisJS2V5SUQgPSBLZXlJRCA+PiA2OworCisJaWYgKHBXcGFLZXlbS2V5SURdLktleUxlbiA9PSAwKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlRNUFNvZnREZWNyeXB0VEtJUCBmYWlsZWQhKEtleUlEWyVkXSBMZW5ndGggY2FuIG5vdCBiZSAwKVxuIiwgS2V5SUQpKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCWR1cmF0aW9uID0gKigoUFVTSE9SVCkocERhdGErMikpOworCisJc2VxX2NvbnRyb2wgPSAqKChQVVNIT1JUKShwRGF0YSsyMikpOworCisJaWYgKHFjX2V4aXN0cykKKwl7CisJCWlmIChhNF9leGlzdHMpCisJCXsKKwkJCXFvc19jb250cm9sID0gKigoUFVTSE9SVCkocERhdGErMzApKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXFvc19jb250cm9sID0gKigoUFVTSE9SVCkocERhdGErMjQpKTsKKwkJfQorCX0KKworCWlmICh0b19kcyA9PSAwICYmIGZyb21fZHMgPT0gMSkKKwl7CisJCU5kaXNNb3ZlTWVtb3J5KERBLCBwRGF0YSs0LCBNQUNfQUREUl9MRU4pOworCQlOZGlzTW92ZU1lbW9yeShTQSwgcERhdGErMTYsIE1BQ19BRERSX0xFTik7CisJCU5kaXNNb3ZlTWVtb3J5KFRBLCBwRGF0YSsxMCwgTUFDX0FERFJfTEVOKTsgIC8vQlNTSUQKKwl9CisJZWxzZSBpZiAodG9fZHMgPT0gMCAmJiBmcm9tX2RzID09IDAgKQorCXsKKwkJTmRpc01vdmVNZW1vcnkoVEEsIHBEYXRhKzEwLCBNQUNfQUREUl9MRU4pOworCQlOZGlzTW92ZU1lbW9yeShEQSwgcERhdGErNCwgTUFDX0FERFJfTEVOKTsKKwkJTmRpc01vdmVNZW1vcnkoU0EsIHBEYXRhKzEwLCBNQUNfQUREUl9MRU4pOworCX0KKwllbHNlIGlmICh0b19kcyA9PSAxICYmIGZyb21fZHMgPT0gMCkKKwl7CisJCU5kaXNNb3ZlTWVtb3J5KFNBLCBwRGF0YSsxMCwgTUFDX0FERFJfTEVOKTsKKwkJTmRpc01vdmVNZW1vcnkoVEEsIHBEYXRhKzEwLCBNQUNfQUREUl9MRU4pOworCQlOZGlzTW92ZU1lbW9yeShEQSwgcERhdGErMTYsIE1BQ19BRERSX0xFTik7CisJfQorCWVsc2UgaWYgKHRvX2RzID09IDEgJiYgZnJvbV9kcyA9PSAxKQorCXsKKwkJTmRpc01vdmVNZW1vcnkoVEEsIHBEYXRhKzEwLCBNQUNfQUREUl9MRU4pOworCQlOZGlzTW92ZU1lbW9yeShEQSwgcERhdGErMTYsIE1BQ19BRERSX0xFTik7CisJCU5kaXNNb3ZlTWVtb3J5KFNBLCBwRGF0YSsyMiwgTUFDX0FERFJfTEVOKTsKKwl9CisKKwludW1fYmxvY2tzID0gKERhdGFCeXRlQ250IC0gMTYpIC8gMTY7CisJcGF5bG9hZF9yZW1haW5kZXIgPSAoRGF0YUJ5dGVDbnQgLSAxNikgJSAxNjsKKworCXBubCA9ICgqKHBEYXRhICsgSGVhZGVyTGVuKSkgKiAyNTYgKyAqKHBEYXRhICsgSGVhZGVyTGVuICsgMik7CisJcG5oID0gKigoUFVMT05HKShwRGF0YSArIEhlYWRlckxlbiArIDQpKTsKKwlwbmggPSBjcHUybGUzMihwbmgpOworCVJUTVBUa2lwTWl4S2V5KHBXcGFLZXlbS2V5SURdLktleSwgVEEsIHBubCwgcG5oLCBSQzRLZXksIHAxayk7CisKKwlBUkNGT1VSX0lOSVQoJkFyY0ZvdXJDb250ZXh0LCBSQzRLZXksIDE2KTsKKworCUFSQ0ZPVVJfREVDUllQVCgmQXJjRm91ckNvbnRleHQsIHBEYXRhICsgSGVhZGVyTGVuLCBwRGF0YSArIEhlYWRlckxlbiArIDgsIERhdGFCeXRlQ250IC0gSGVhZGVyTGVuIC0gOCk7CisJTmRpc01vdmVNZW1vcnkoJnRyYWlsZmNzLCBwRGF0YSArIERhdGFCeXRlQ250IC0gOCAtIDQsIDQpOworCWNyYzMyID0gUlRNUF9DQUxDX0ZDUzMyKFBQUElOSVRGQ1MzMiwgcERhdGEgKyBIZWFkZXJMZW4sIERhdGFCeXRlQ250IC0gSGVhZGVyTGVuIC0gOCAtIDQpOyAgLy9Ta2lwIElWK0VJViA4IGJ5dGVzICYgU2tpcCBsYXN0IDQgYnl0ZXMoRkNTKS4KKwljcmMzMiBePSAweGZmZmZmZmZmOyAgICAgICAgICAgICAvKiBjb21wbGVtZW50ICovCisKKyAgICBpZihjcmMzMiAhPSBjcHUybGUzMih0cmFpbGZjcykpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVE1QU29mdERlY3J5cHRUS0lQLCBXRVAgRGF0YSBJQ1YgRXJyb3IgIVxuIikpOwkgLy9JQ1YgZXJyb3IuCisKKwkJcmV0dXJuIChGQUxTRSk7CisJfQorCisJTmRpc01vdmVNZW1vcnkoVHJhaWxNSUMsIHBEYXRhICsgRGF0YUJ5dGVDbnQgLSA4IC0gOCAtIDQsIDgpOworCVJUTVBJbml0TUlDRW5naW5lKHBBZCwgcFdwYUtleVtLZXlJRF0uS2V5LCBEQSwgU0EsIFVzZXJQcmlvcml0eSwgcFdwYUtleVtLZXlJRF0uUnhNaWMpOworCVJUTVBUa2lwQXBwZW5kKCZwQWQtPlByaXZhdGVJbmZvLlR4LCBwRGF0YSArIEhlYWRlckxlbiwgRGF0YUJ5dGVDbnQgLSBIZWFkZXJMZW4gLSA4IC0gMTIpOworCVJUTVBUa2lwR2V0TUlDKCZwQWQtPlByaXZhdGVJbmZvLlR4KTsKKwlOZGlzTW92ZU1lbW9yeShNSUMsIHBBZC0+UHJpdmF0ZUluZm8uVHguTUlDLCA4KTsKKworCWlmICghTmRpc0VxdWFsTWVtb3J5KE1JQywgVHJhaWxNSUMsIDgpKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiUlRNUFNvZnREZWNyeXB0VEtJUCwgV0VQIERhdGEgTUlDIEVycm9yICFcbiIpKTsJIC8vTUlDIGVycm9yLgorCQlyZXR1cm4gKEZBTFNFKTsKKwl9CisKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJUlRNUEZyYW1lRW5kaWFuQ2hhbmdlKHBBZCwgKFBVQ0hBUilwRGF0YSwgRElSX1JFQUQsIEZBTFNFKTsKKyNlbmRpZgorCXJldHVybiBUUlVFOworfQorCisKKworCitCT09MRUFOIFJUTVBTb2Z0RGVjcnlwdEFFUygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBQVUNIQVIJcERhdGEsCisJSU4gVUxPTkcJRGF0YUJ5dGVDbnQsCisJSU4gUENJUEhFUl9LRVkJcFdwYUtleSkKK3sKKwlVQ0hBUgkJCUtleUlEOworCVVJTlQJCQlIZWFkZXJMZW47CisJVUNIQVIJCQlQTls2XTsKKwlVSU5UCQkJcGF5bG9hZF9sZW47CisJVUlOVAkJCW51bV9ibG9ja3M7CisJVUlOVAkJCXBheWxvYWRfcmVtYWluZGVyOworCVVTSE9SVAkJCWZjOworCVVDSEFSCQkJZmMwOworCVVDSEFSCQkJZmMxOworCVVJTlQJCQlmcmFtZV90eXBlOworCVVJTlQJCQlmcmFtZV9zdWJ0eXBlOworCVVJTlQJCQlmcm9tX2RzOworCVVJTlQJCQl0b19kczsKKwlJTlQJCQkJYTRfZXhpc3RzOworCUlOVAkJCQlxY19leGlzdHM7CisJVUNIQVIJCQlhZXNfb3V0WzE2XTsKKwlpbnQgCQkJcGF5bG9hZF9pbmRleDsKKwlVSU5UIAkJCWk7CisJVUNIQVIgCQkJY3RyX3ByZWxvYWRbMTZdOworCVVDSEFSIAkJCWNoYWluX2J1ZmZlclsxNl07CisJVUNIQVIgCQkJcGFkZGVkX2J1ZmZlclsxNl07CisJVUNIQVIgCQkJbWljX2l2WzE2XTsKKwlVQ0hBUiAJCQltaWNfaGVhZGVyMVsxNl07CisJVUNIQVIgCQkJbWljX2hlYWRlcjJbMTZdOworCVVDSEFSCQkJTUlDWzhdOworCVVDSEFSCQkJVHJhaWxNSUNbOF07CisKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJUlRNUEZyYW1lRW5kaWFuQ2hhbmdlKHBBZCwgKFBVQ0hBUilwRGF0YSwgRElSX1JFQUQsIEZBTFNFKTsKKyNlbmRpZgorCisJZmMwID0gKnBEYXRhOworCWZjMSA9ICoocERhdGEgKyAxKTsKKworCWZjID0gKigoUFVTSE9SVClwRGF0YSk7CisKKwlmcmFtZV90eXBlID0gKChmYzAgPj4gMikgJiAweDAzKTsKKwlmcmFtZV9zdWJ0eXBlID0gKChmYzAgPj4gNCkgJiAweDBmKTsKKworCWZyb21fZHMgPSAoZmMxICYgMHgyKSA+PiAxOworCXRvX2RzID0gKGZjMSAmIDB4MSk7CisKKwlhNF9leGlzdHMgPSAoZnJvbV9kcyAmIHRvX2RzKTsKKwlxY19leGlzdHMgPSAoKGZyYW1lX3N1YnR5cGUgPT0gMHgwOCkgfHwgICAgLyogQXNzdW1lZCBRb1Mgc3VidHlwZXMgKi8KKwkJCQkgIChmcmFtZV9zdWJ0eXBlID09IDB4MDkpIHx8ICAgLyogTGlrZWx5IHRvIGNoYW5nZS4gICAgKi8KKwkJCQkgIChmcmFtZV9zdWJ0eXBlID09IDB4MGEpIHx8CisJCQkJICAoZnJhbWVfc3VidHlwZSA9PSAweDBiKQorCQkJCSApOworCisJSGVhZGVyTGVuID0gMjQ7CisJaWYgKGE0X2V4aXN0cykKKwkJSGVhZGVyTGVuICs9IDY7CisKKwlLZXlJRCA9ICooKFBVQ0hBUikocERhdGErIEhlYWRlckxlbiArIDMpKTsKKwlLZXlJRCA9IEtleUlEID4+IDY7CisKKwlpZiAocFdwYUtleVtLZXlJRF0uS2V5TGVuID09IDApCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVE1QU29mdERlY3J5cHRBRVMgZmFpbGVkIShLZXlJRFslZF0gTGVuZ3RoIGNhbiBub3QgYmUgMClcbiIsIEtleUlEKSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlQTlswXSA9ICoocERhdGErIEhlYWRlckxlbik7CisJUE5bMV0gPSAqKHBEYXRhKyBIZWFkZXJMZW4gKyAxKTsKKwlQTlsyXSA9ICoocERhdGErIEhlYWRlckxlbiArIDQpOworCVBOWzNdID0gKihwRGF0YSsgSGVhZGVyTGVuICsgNSk7CisJUE5bNF0gPSAqKHBEYXRhKyBIZWFkZXJMZW4gKyA2KTsKKwlQTls1XSA9ICoocERhdGErIEhlYWRlckxlbiArIDcpOworCisJcGF5bG9hZF9sZW4gPSBEYXRhQnl0ZUNudCAtIEhlYWRlckxlbiAtIDggLSA4OwkvLyA4IGJ5dGVzIGZvciBDQ01QIGhlYWRlciAsIDggYnl0ZXMgZm9yIE1JQworCXBheWxvYWRfcmVtYWluZGVyID0gKHBheWxvYWRfbGVuKSAlIDE2OworCW51bV9ibG9ja3MgPSAocGF5bG9hZF9sZW4pIC8gMTY7CisKKworCisJLy8gRmluZCBzdGFydCBvZiBwYXlsb2FkCisJcGF5bG9hZF9pbmRleCA9IEhlYWRlckxlbiArIDg7IC8vSVYrRUlWCisKKwlmb3IgKGk9MDsgaTwgbnVtX2Jsb2NrczsgaSsrKQorCXsKKwkJY29uc3RydWN0X2N0cl9wcmVsb2FkKGN0cl9wcmVsb2FkLAorCQkJCQkJCQlhNF9leGlzdHMsCisJCQkJCQkJCXFjX2V4aXN0cywKKwkJCQkJCQkJcERhdGEsCisJCQkJCQkJCVBOLAorCQkJCQkJCQlpKzEgKTsKKworCQlhZXMxMjhrMTI4ZChwV3BhS2V5W0tleUlEXS5LZXksIGN0cl9wcmVsb2FkLCBhZXNfb3V0KTsKKworCQliaXR3aXNlX3hvcihhZXNfb3V0LCBwRGF0YSArIHBheWxvYWRfaW5kZXgsIGNoYWluX2J1ZmZlcik7CisJCU5kaXNNb3ZlTWVtb3J5KHBEYXRhICsgcGF5bG9hZF9pbmRleCAtIDgsIGNoYWluX2J1ZmZlciwgMTYpOworCQlwYXlsb2FkX2luZGV4ICs9IDE2OworCX0KKworCS8vCisJLy8gSWYgdGhlcmUgaXMgYSBzaG9ydCBmaW5hbCBibG9jaywgdGhlbiBwYWQgaXQKKwkvLyBlbmNyeXB0IGl0IGFuZCBjb3B5IHRoZSB1bnBhZGRlZCBwYXJ0IGJhY2sKKwkvLworCWlmIChwYXlsb2FkX3JlbWFpbmRlciA+IDApCisJeworCQljb25zdHJ1Y3RfY3RyX3ByZWxvYWQoY3RyX3ByZWxvYWQsCisJCQkJCQkJCWE0X2V4aXN0cywKKwkJCQkJCQkJcWNfZXhpc3RzLAorCQkJCQkJCQlwRGF0YSwKKwkJCQkJCQkJUE4sCisJCQkJCQkJCW51bV9ibG9ja3MgKyAxKTsKKworCQlOZGlzWmVyb01lbW9yeShwYWRkZWRfYnVmZmVyLCAxNik7CisJCU5kaXNNb3ZlTWVtb3J5KHBhZGRlZF9idWZmZXIsIHBEYXRhICsgcGF5bG9hZF9pbmRleCwgcGF5bG9hZF9yZW1haW5kZXIpOworCisJCWFlczEyOGsxMjhkKHBXcGFLZXlbS2V5SURdLktleSwgY3RyX3ByZWxvYWQsIGFlc19vdXQpOworCisJCWJpdHdpc2VfeG9yKGFlc19vdXQsIHBhZGRlZF9idWZmZXIsIGNoYWluX2J1ZmZlcik7CisJCU5kaXNNb3ZlTWVtb3J5KHBEYXRhICsgcGF5bG9hZF9pbmRleCAtIDgsIGNoYWluX2J1ZmZlciwgcGF5bG9hZF9yZW1haW5kZXIpOworCQlwYXlsb2FkX2luZGV4ICs9IHBheWxvYWRfcmVtYWluZGVyOworCX0KKworCS8vCisJLy8gRGVzY3J5cHQgdGhlIE1JQworCS8vCisJY29uc3RydWN0X2N0cl9wcmVsb2FkKGN0cl9wcmVsb2FkLAorCQkJCQkJCWE0X2V4aXN0cywKKwkJCQkJCQlxY19leGlzdHMsCisJCQkJCQkJcERhdGEsCisJCQkJCQkJUE4sCisJCQkJCQkJMCk7CisJTmRpc1plcm9NZW1vcnkocGFkZGVkX2J1ZmZlciwgMTYpOworCU5kaXNNb3ZlTWVtb3J5KHBhZGRlZF9idWZmZXIsIHBEYXRhICsgcGF5bG9hZF9pbmRleCwgOCk7CisKKwlhZXMxMjhrMTI4ZChwV3BhS2V5W0tleUlEXS5LZXksIGN0cl9wcmVsb2FkLCBhZXNfb3V0KTsKKworCWJpdHdpc2VfeG9yKGFlc19vdXQsIHBhZGRlZF9idWZmZXIsIGNoYWluX2J1ZmZlcik7CisKKwlOZGlzTW92ZU1lbW9yeShUcmFpbE1JQywgY2hhaW5fYnVmZmVyLCA4KTsKKworCS8vCisJLy8gQ2FsY3VsYXRlIE1JQworCS8vCisKKwkvL0ZvcmNlIHRoZSBwcm90ZWN0ZWQgZnJhbWUgYml0IG9uCisJKihwRGF0YSArIDEpID0gKihwRGF0YSArIDEpIHwgMHg0MDsKKworCS8vIEZpbmQgc3RhcnQgb2YgcGF5bG9hZAorCS8vIEJlY2F1c2UgdGhlIENDTVAgaGVhZGVyIGhhcyBiZWVuIHJlbW92ZWQKKwlwYXlsb2FkX2luZGV4ID0gSGVhZGVyTGVuOworCisJY29uc3RydWN0X21pY19pdigKKwkJCQkJbWljX2l2LAorCQkJCQlxY19leGlzdHMsCisJCQkJCWE0X2V4aXN0cywKKwkJCQkJcERhdGEsCisJCQkJCXBheWxvYWRfbGVuLAorCQkJCQlQTik7CisKKwljb25zdHJ1Y3RfbWljX2hlYWRlcjEoCisJCQkJCQltaWNfaGVhZGVyMSwKKwkJCQkJCUhlYWRlckxlbiwKKwkJCQkJCXBEYXRhKTsKKworCWNvbnN0cnVjdF9taWNfaGVhZGVyMigKKwkJCQkJCW1pY19oZWFkZXIyLAorCQkJCQkJcERhdGEsCisJCQkJCQlhNF9leGlzdHMsCisJCQkJCQlxY19leGlzdHMpOworCisJYWVzMTI4azEyOGQocFdwYUtleVtLZXlJRF0uS2V5LCBtaWNfaXYsIGFlc19vdXQpOworCWJpdHdpc2VfeG9yKGFlc19vdXQsIG1pY19oZWFkZXIxLCBjaGFpbl9idWZmZXIpOworCWFlczEyOGsxMjhkKHBXcGFLZXlbS2V5SURdLktleSwgY2hhaW5fYnVmZmVyLCBhZXNfb3V0KTsKKwliaXR3aXNlX3hvcihhZXNfb3V0LCBtaWNfaGVhZGVyMiwgY2hhaW5fYnVmZmVyKTsKKwlhZXMxMjhrMTI4ZChwV3BhS2V5W0tleUlEXS5LZXksIGNoYWluX2J1ZmZlciwgYWVzX291dCk7CisKKwkvLyBpdGVyYXRlIHRocm91Z2ggZWFjaCAxNiBieXRlIHBheWxvYWQgYmxvY2sKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2Jsb2NrczsgaSsrKQorCXsKKwkJYml0d2lzZV94b3IoYWVzX291dCwgcERhdGEgKyBwYXlsb2FkX2luZGV4LCBjaGFpbl9idWZmZXIpOworCQlwYXlsb2FkX2luZGV4ICs9IDE2OworCQlhZXMxMjhrMTI4ZChwV3BhS2V5W0tleUlEXS5LZXksIGNoYWluX2J1ZmZlciwgYWVzX291dCk7CisJfQorCisJLy8gQWRkIG9uIHRoZSBmaW5hbCBwYXlsb2FkIGJsb2NrIGlmIGl0IG5lZWRzIHBhZGRpbmcKKwlpZiAocGF5bG9hZF9yZW1haW5kZXIgPiAwKQorCXsKKwkJTmRpc1plcm9NZW1vcnkocGFkZGVkX2J1ZmZlciwgMTYpOworCQlOZGlzTW92ZU1lbW9yeShwYWRkZWRfYnVmZmVyLCBwRGF0YSArIHBheWxvYWRfaW5kZXgsIHBheWxvYWRfcmVtYWluZGVyKTsKKworCQliaXR3aXNlX3hvcihhZXNfb3V0LCBwYWRkZWRfYnVmZmVyLCBjaGFpbl9idWZmZXIpOworCQlhZXMxMjhrMTI4ZChwV3BhS2V5W0tleUlEXS5LZXksIGNoYWluX2J1ZmZlciwgYWVzX291dCk7CisJfQorCS8vIGFlc19vdXQgY29udGFpbnMgcGFkZGVkIG1pYywgZGlzY2FyZCBtb3N0IHNpZ25pZmljYW50CisJLy8gOCBieXRlcyB0byBnZW5lcmF0ZSA2NCBiaXQgTUlDCisJZm9yIChpID0gMCA7IGkgPCA4OyBpKyspIE1JQ1tpXSA9IGFlc19vdXRbaV07CisKKwlpZiAoIU5kaXNFcXVhbE1lbW9yeShNSUMsIFRyYWlsTUlDLCA4KSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlJUTVBTb2Z0RGVjcnlwdEFFUywgTUlDIEVycm9yICFcbiIpKTsJIC8vTUlDIGVycm9yLgorCQlyZXR1cm4gRkFMU0U7CisJfQorCisjaWZkZWYgUlRfQklHX0VORElBTgorCVJUTVBGcmFtZUVuZGlhbkNoYW5nZShwQWQsIChQVUNIQVIpcERhdGEsIERJUl9SRUFELCBGQUxTRSk7CisjZW5kaWYKKworCXJldHVybiBUUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIGFlczEyOGsxMjhkKCkgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUGVyZm9ybXMgYSAxMjggYml0IEFFUyBlbmNyeXB0IHdpdGggICovCisvKiAxMjggYml0IGRhdGEuICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworVk9JRCB4b3JfMTI4KAorCUlOICBQVUNIQVIgIGEsCisJSU4gIFBVQ0hBUiAgYiwKKwlPVVQgUFVDSEFSICBvdXQpCit7CisJSU5UIGk7CisKKwlmb3IgKGk9MDtpPDE2OyBpKyspCisJeworCQlvdXRbaV0gPSBhW2ldIF4gYltpXTsKKwl9Cit9CisKK1ZPSUQgbmV4dF9rZXkoCisJSU4gIFBVQ0hBUiAga2V5LAorCUlOICBJTlQgICAgIHJvdW5kKQoreworCVVDSEFSICAgICAgIHJjb247CisJVUNIQVIgICAgICAgc2JveF9rZXlbNF07CisJVUNIQVIgICAgICAgcmNvbl90YWJsZVsxMl0gPQorCXsKKwkJMHgwMSwgMHgwMiwgMHgwNCwgMHgwOCwgMHgxMCwgMHgyMCwgMHg0MCwgMHg4MCwKKwkJMHgxYiwgMHgzNiwgMHgzNiwgMHgzNgorCX07CisKKwlzYm94X2tleVswXSA9IFJUTVBDa2lwU2JveChrZXlbMTNdKTsKKwlzYm94X2tleVsxXSA9IFJUTVBDa2lwU2JveChrZXlbMTRdKTsKKwlzYm94X2tleVsyXSA9IFJUTVBDa2lwU2JveChrZXlbMTVdKTsKKwlzYm94X2tleVszXSA9IFJUTVBDa2lwU2JveChrZXlbMTJdKTsKKworCXJjb24gPSByY29uX3RhYmxlW3JvdW5kXTsKKworCXhvcl8zMigma2V5WzBdLCBzYm94X2tleSwgJmtleVswXSk7CisJa2V5WzBdID0ga2V5WzBdIF4gcmNvbjsKKworCXhvcl8zMigma2V5WzRdLCAma2V5WzBdLCAma2V5WzRdKTsKKwl4b3JfMzIoJmtleVs4XSwgJmtleVs0XSwgJmtleVs4XSk7CisJeG9yXzMyKCZrZXlbMTJdLCAma2V5WzhdLCAma2V5WzEyXSk7Cit9CisKK1ZPSUQgeG9yXzMyKAorCUlOICBQVUNIQVIgIGEsCisJSU4gIFBVQ0hBUiAgYiwKKwlPVVQgUFVDSEFSICBvdXQpCit7CisJSU5UIGk7CisKKwlmb3IgKGk9MDtpPDQ7IGkrKykKKwl7CisJCW91dFtpXSA9IGFbaV0gXiBiW2ldOworCX0KK30KKworVk9JRCBieXRlX3N1YigKKwlJTiAgUFVDSEFSICBpbiwKKwlPVVQgUFVDSEFSICBvdXQpCit7CisJSU5UIGk7CisKKwlmb3IgKGk9MDsgaTwgMTY7IGkrKykKKwl7CisJCW91dFtpXSA9IFJUTVBDa2lwU2JveChpbltpXSk7CisJfQorfQorCitVQ0hBUiBSVE1QQ2tpcFNib3goCisJSU4gIFVDSEFSICAgYSkKK3sKKwlyZXR1cm4gU2JveFRhYmxlWyhpbnQpYV07Cit9CisKK1ZPSUQgc2hpZnRfcm93KAorCUlOICBQVUNIQVIgIGluLAorCU9VVCBQVUNIQVIgIG91dCkKK3sKKwlvdXRbMF0gPSAgaW5bMF07CisJb3V0WzFdID0gIGluWzVdOworCW91dFsyXSA9ICBpblsxMF07CisJb3V0WzNdID0gIGluWzE1XTsKKwlvdXRbNF0gPSAgaW5bNF07CisJb3V0WzVdID0gIGluWzldOworCW91dFs2XSA9ICBpblsxNF07CisJb3V0WzddID0gIGluWzNdOworCW91dFs4XSA9ICBpbls4XTsKKwlvdXRbOV0gPSAgaW5bMTNdOworCW91dFsxMF0gPSBpblsyXTsKKwlvdXRbMTFdID0gaW5bN107CisJb3V0WzEyXSA9IGluWzEyXTsKKwlvdXRbMTNdID0gaW5bMV07CisJb3V0WzE0XSA9IGluWzZdOworCW91dFsxNV0gPSBpblsxMV07Cit9CisKK1ZPSUQgbWl4X2NvbHVtbigKKwlJTiAgUFVDSEFSICBpbiwKKwlPVVQgUFVDSEFSICBvdXQpCit7CisJSU5UICAgICAgICAgaTsKKwlVQ0hBUiAgICAgICBhZGQxYls0XTsKKwlVQ0hBUiAgICAgICBhZGQxYmY3WzRdOworCVVDSEFSICAgICAgIHJvdGxbNF07CisJVUNIQVIgICAgICAgc3dhcF9oYWxmc1s0XTsKKwlVQ0hBUiAgICAgICBhbmRmN1s0XTsKKwlVQ0hBUiAgICAgICByb3RyWzRdOworCVVDSEFSICAgICAgIHRlbXBbNF07CisJVUNIQVIgICAgICAgdGVtcGJbNF07CisKKwlmb3IgKGk9MCA7IGk8NDsgaSsrKQorCXsKKwkJaWYgKChpbltpXSAmIDB4ODApPT0gMHg4MCkKKwkJCWFkZDFiW2ldID0gMHgxYjsKKwkJZWxzZQorCQkJYWRkMWJbaV0gPSAweDAwOworCX0KKworCXN3YXBfaGFsZnNbMF0gPSBpblsyXTsgICAgLyogU3dhcCBoYWxmcyAqLworCXN3YXBfaGFsZnNbMV0gPSBpblszXTsKKwlzd2FwX2hhbGZzWzJdID0gaW5bMF07CisJc3dhcF9oYWxmc1szXSA9IGluWzFdOworCisJcm90bFswXSA9IGluWzNdOyAgICAgICAgLyogUm90YXRlIGxlZnQgOCBiaXRzICovCisJcm90bFsxXSA9IGluWzBdOworCXJvdGxbMl0gPSBpblsxXTsKKwlyb3RsWzNdID0gaW5bMl07CisKKwlhbmRmN1swXSA9IGluWzBdICYgMHg3ZjsKKwlhbmRmN1sxXSA9IGluWzFdICYgMHg3ZjsKKwlhbmRmN1syXSA9IGluWzJdICYgMHg3ZjsKKwlhbmRmN1szXSA9IGluWzNdICYgMHg3ZjsKKworCWZvciAoaSA9IDM7IGk+MDsgaS0tKSAgICAvKiBsb2dpY2FsIHNoaWZ0IGxlZnQgMSBiaXQgKi8KKwl7CisJCWFuZGY3W2ldID0gYW5kZjdbaV0gPDwgMTsKKwkJaWYgKChhbmRmN1tpLTFdICYgMHg4MCkgPT0gMHg4MCkKKwkJeworCQkJYW5kZjdbaV0gPSAoYW5kZjdbaV0gfCAweDAxKTsKKwkJfQorCX0KKwlhbmRmN1swXSA9IGFuZGY3WzBdIDw8IDE7CisJYW5kZjdbMF0gPSBhbmRmN1swXSAmIDB4ZmU7CisKKwl4b3JfMzIoYWRkMWIsIGFuZGY3LCBhZGQxYmY3KTsKKworCXhvcl8zMihpbiwgYWRkMWJmNywgcm90cik7CisKKwl0ZW1wWzBdID0gcm90clswXTsgICAgICAgICAvKiBSb3RhdGUgcmlnaHQgOCBiaXRzICovCisJcm90clswXSA9IHJvdHJbMV07CisJcm90clsxXSA9IHJvdHJbMl07CisJcm90clsyXSA9IHJvdHJbM107CisJcm90clszXSA9IHRlbXBbMF07CisKKwl4b3JfMzIoYWRkMWJmNywgcm90ciwgdGVtcCk7CisJeG9yXzMyKHN3YXBfaGFsZnMsIHJvdGwsdGVtcGIpOworCXhvcl8zMih0ZW1wLCB0ZW1wYiwgb3V0KTsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vcnRtcF93ZXAuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL3J0bXBfd2VwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmZlMjZjMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL3J0bXBfd2VwLmMKQEAgLTAsMCArMSw0OTkgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJTW9kdWxlIE5hbWU6CisJcnRtcF93ZXAuYworCisJQWJzdHJhY3Q6CisKKwlSZXZpc2lvbiBIaXN0b3J5OgorCVdobwkJCVdoZW4JCQlXaGF0CisJLS0tLS0tLS0JLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCVBhdWwgV3UJCTEwLTI4LTAyCQlJbml0aWFsCisqLworCisjaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCisKK1VJTlQgRkNTVEFCXzMyWzI1Nl0gPQoreworCTB4MDAwMDAwMDAsIDB4NzcwNzMwOTYsIDB4ZWUwZTYxMmMsIDB4OTkwOTUxYmEsCisJMHgwNzZkYzQxOSwgMHg3MDZhZjQ4ZiwgMHhlOTYzYTUzNSwgMHg5ZTY0OTVhMywKKwkweDBlZGI4ODMyLCAweDc5ZGNiOGE0LCAweGUwZDVlOTFlLCAweDk3ZDJkOTg4LAorCTB4MDliNjRjMmIsIDB4N2ViMTdjYmQsIDB4ZTdiODJkMDcsIDB4OTBiZjFkOTEsCisJMHgxZGI3MTA2NCwgMHg2YWIwMjBmMiwgMHhmM2I5NzE0OCwgMHg4NGJlNDFkZSwKKwkweDFhZGFkNDdkLCAweDZkZGRlNGViLCAweGY0ZDRiNTUxLCAweDgzZDM4NWM3LAorCTB4MTM2Yzk4NTYsIDB4NjQ2YmE4YzAsIDB4ZmQ2MmY5N2EsIDB4OGE2NWM5ZWMsCisJMHgxNDAxNWM0ZiwgMHg2MzA2NmNkOSwgMHhmYTBmM2Q2MywgMHg4ZDA4MGRmNSwKKwkweDNiNmUyMGM4LCAweDRjNjkxMDVlLCAweGQ1NjA0MWU0LCAweGEyNjc3MTcyLAorCTB4M2MwM2U0ZDEsIDB4NGIwNGQ0NDcsIDB4ZDIwZDg1ZmQsIDB4YTUwYWI1NmIsCisJMHgzNWI1YThmYSwgMHg0MmIyOTg2YywgMHhkYmJiYzlkNiwgMHhhY2JjZjk0MCwKKwkweDMyZDg2Y2UzLCAweDQ1ZGY1Yzc1LCAweGRjZDYwZGNmLCAweGFiZDEzZDU5LAorCTB4MjZkOTMwYWMsIDB4NTFkZTAwM2EsIDB4YzhkNzUxODAsIDB4YmZkMDYxMTYsCisJMHgyMWI0ZjRiNSwgMHg1NmIzYzQyMywgMHhjZmJhOTU5OSwgMHhiOGJkYTUwZiwKKwkweDI4MDJiODllLCAweDVmMDU4ODA4LCAweGM2MGNkOWIyLCAweGIxMGJlOTI0LAorCTB4MmY2ZjdjODcsIDB4NTg2ODRjMTEsIDB4YzE2MTFkYWIsIDB4YjY2NjJkM2QsCisJMHg3NmRjNDE5MCwgMHgwMWRiNzEwNiwgMHg5OGQyMjBiYywgMHhlZmQ1MTAyYSwKKwkweDcxYjE4NTg5LCAweDA2YjZiNTFmLCAweDlmYmZlNGE1LCAweGU4YjhkNDMzLAorCTB4NzgwN2M5YTIsIDB4MGYwMGY5MzQsIDB4OTYwOWE4OGUsIDB4ZTEwZTk4MTgsCisJMHg3ZjZhMGRiYiwgMHgwODZkM2QyZCwgMHg5MTY0NmM5NywgMHhlNjYzNWMwMSwKKwkweDZiNmI1MWY0LCAweDFjNmM2MTYyLCAweDg1NjUzMGQ4LCAweGYyNjIwMDRlLAorCTB4NmMwNjk1ZWQsIDB4MWIwMWE1N2IsIDB4ODIwOGY0YzEsIDB4ZjUwZmM0NTcsCisJMHg2NWIwZDljNiwgMHgxMmI3ZTk1MCwgMHg4YmJlYjhlYSwgMHhmY2I5ODg3YywKKwkweDYyZGQxZGRmLCAweDE1ZGEyZDQ5LCAweDhjZDM3Y2YzLCAweGZiZDQ0YzY1LAorCTB4NGRiMjYxNTgsIDB4M2FiNTUxY2UsIDB4YTNiYzAwNzQsIDB4ZDRiYjMwZTIsCisJMHg0YWRmYTU0MSwgMHgzZGQ4OTVkNywgMHhhNGQxYzQ2ZCwgMHhkM2Q2ZjRmYiwKKwkweDQzNjllOTZhLCAweDM0NmVkOWZjLCAweGFkNjc4ODQ2LCAweGRhNjBiOGQwLAorCTB4NDQwNDJkNzMsIDB4MzMwMzFkZTUsIDB4YWEwYTRjNWYsIDB4ZGQwZDdjYzksCisJMHg1MDA1NzEzYywgMHgyNzAyNDFhYSwgMHhiZTBiMTAxMCwgMHhjOTBjMjA4NiwKKwkweDU3NjhiNTI1LCAweDIwNmY4NWIzLCAweGI5NjZkNDA5LCAweGNlNjFlNDlmLAorCTB4NWVkZWY5MGUsIDB4MjlkOWM5OTgsIDB4YjBkMDk4MjIsIDB4YzdkN2E4YjQsCisJMHg1OWIzM2QxNywgMHgyZWI0MGQ4MSwgMHhiN2JkNWMzYiwgMHhjMGJhNmNhZCwKKwkweGVkYjg4MzIwLCAweDlhYmZiM2I2LCAweDAzYjZlMjBjLCAweDc0YjFkMjlhLAorCTB4ZWFkNTQ3MzksIDB4OWRkMjc3YWYsIDB4MDRkYjI2MTUsIDB4NzNkYzE2ODMsCisJMHhlMzYzMGIxMiwgMHg5NDY0M2I4NCwgMHgwZDZkNmEzZSwgMHg3YTZhNWFhOCwKKwkweGU0MGVjZjBiLCAweDkzMDlmZjlkLCAweDBhMDBhZTI3LCAweDdkMDc5ZWIxLAorCTB4ZjAwZjkzNDQsIDB4ODcwOGEzZDIsIDB4MWUwMWYyNjgsIDB4NjkwNmMyZmUsCisJMHhmNzYyNTc1ZCwgMHg4MDY1NjdjYiwgMHgxOTZjMzY3MSwgMHg2ZTZiMDZlNywKKwkweGZlZDQxYjc2LCAweDg5ZDMyYmUwLCAweDEwZGE3YTVhLCAweDY3ZGQ0YWNjLAorCTB4ZjliOWRmNmYsIDB4OGViZWVmZjksIDB4MTdiN2JlNDMsIDB4NjBiMDhlZDUsCisJMHhkNmQ2YTNlOCwgMHhhMWQxOTM3ZSwgMHgzOGQ4YzJjNCwgMHg0ZmRmZjI1MiwKKwkweGQxYmI2N2YxLCAweGE2YmM1NzY3LCAweDNmYjUwNmRkLCAweDQ4YjIzNjRiLAorCTB4ZDgwZDJiZGEsIDB4YWYwYTFiNGMsIDB4MzYwMzRhZjYsIDB4NDEwNDdhNjAsCisJMHhkZjYwZWZjMywgMHhhODY3ZGY1NSwgMHgzMTZlOGVlZiwgMHg0NjY5YmU3OSwKKwkweGNiNjFiMzhjLCAweGJjNjY4MzFhLCAweDI1NmZkMmEwLCAweDUyNjhlMjM2LAorCTB4Y2MwYzc3OTUsIDB4YmIwYjQ3MDMsIDB4MjIwMjE2YjksIDB4NTUwNTI2MmYsCisJMHhjNWJhM2JiZSwgMHhiMmJkMGIyOCwgMHgyYmI0NWE5MiwgMHg1Y2IzNmEwNCwKKwkweGMyZDdmZmE3LCAweGI1ZDBjZjMxLCAweDJjZDk5ZThiLCAweDViZGVhZTFkLAorCTB4OWI2NGMyYjAsIDB4ZWM2M2YyMjYsIDB4NzU2YWEzOWMsIDB4MDI2ZDkzMGEsCisJMHg5YzA5MDZhOSwgMHhlYjBlMzYzZiwgMHg3MjA3Njc4NSwgMHgwNTAwNTcxMywKKwkweDk1YmY0YTgyLCAweGUyYjg3YTE0LCAweDdiYjEyYmFlLCAweDBjYjYxYjM4LAorCTB4OTJkMjhlOWIsIDB4ZTVkNWJlMGQsIDB4N2NkY2VmYjcsIDB4MGJkYmRmMjEsCisJMHg4NmQzZDJkNCwgMHhmMWQ0ZTI0MiwgMHg2OGRkYjNmOCwgMHgxZmRhODM2ZSwKKwkweDgxYmUxNmNkLCAweGY2YjkyNjViLCAweDZmYjA3N2UxLCAweDE4Yjc0Nzc3LAorCTB4ODgwODVhZTYsIDB4ZmYwZjZhNzAsIDB4NjYwNjNiY2EsIDB4MTEwMTBiNWMsCisJMHg4ZjY1OWVmZiwgMHhmODYyYWU2OSwgMHg2MTZiZmZkMywgMHgxNjZjY2Y0NSwKKwkweGEwMGFlMjc4LCAweGQ3MGRkMmVlLCAweDRlMDQ4MzU0LCAweDM5MDNiM2MyLAorCTB4YTc2NzI2NjEsIDB4ZDA2MDE2ZjcsIDB4NDk2OTQ3NGQsIDB4M2U2ZTc3ZGIsCisJMHhhZWQxNmE0YSwgMHhkOWQ2NWFkYywgMHg0MGRmMGI2NiwgMHgzN2Q4M2JmMCwKKwkweGE5YmNhZTUzLCAweGRlYmI5ZWM1LCAweDQ3YjJjZjdmLCAweDMwYjVmZmU5LAorCTB4YmRiZGYyMWMsIDB4Y2FiYWMyOGEsIDB4NTNiMzkzMzAsIDB4MjRiNGEzYTYsCisJMHhiYWQwMzYwNSwgMHhjZGQ3MDY5MywgMHg1NGRlNTcyOSwgMHgyM2Q5NjdiZiwKKwkweGIzNjY3YTJlLCAweGM0NjE0YWI4LCAweDVkNjgxYjAyLCAweDJhNmYyYjk0LAorCTB4YjQwYmJlMzcsIDB4YzMwYzhlYTEsIDB4NWEwNWRmMWIsIDB4MmQwMmVmOGQKK307CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lCURlc2NyaXB0aW9uOgorCQlJbml0IFdFUCBmdW5jdGlvbi4KKworCUFyZ3VtZW50czoKKyAgICAgIHBBZAkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCQlwS2V5ICAgICAgICBQb2ludGVyIHRvIHRoZSBXRVAgS0VZCisJCUtleUlkCQkgICBXRVAgS2V5IElECisJCUtleUxlbiAgICAgIHRoZSBsZW5ndGggb2YgV0VQIEtFWQorCQlwRGVzdCAgICAgICBQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiB3aGljaCBFbmNyeXB0aW9uIGRhdGEgd2lsbCBzdG9yZSBpbi4KKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlSVE1QSW5pdFdlcEVuZ2luZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlwS2V5LAorCUlOCVVDSEFSCQkJS2V5SWQsCisJSU4JVUNIQVIJCQlLZXlMZW4sCisJSU4gT1VUCVBVQ0hBUgkJcERlc3QpCit7CisJVUlOVCBpOworCVVDSEFSICAgV0VQS0VZW10gPSB7CisJCS8vSVYKKwkJMHgwMCwgMHgxMSwgMHgyMiwKKwkJLy9XRVAgS0VZCisJCTB4MDAsIDB4MTEsIDB4MjIsIDB4MzMsIDB4NDQsIDB4NTUsIDB4NjYsIDB4NzcsIDB4ODgsIDB4OTksIDB4QUEsIDB4QkIsIDB4Q0MKKwl9OworCisJcEFkLT5Qcml2YXRlSW5mby5GQ1NDUkMzMiA9IFBQUElOSVRGQ1MzMjsgICAvL0luaXQgY3JjMzIuCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKyAgICBpZiAocEFkLT5TdGFDZmcuYkNraXBPbiAmJiAocEFkLT5TdGFDZmcuQ2tpcEZsYWcgJiAweDEwKSAmJiAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkpCisgICAgeworICAgICAgICBBUkNGT1VSX0lOSVQoJnBBZC0+UHJpdmF0ZUluZm8uV0VQQ09OVEVYVCwgcEtleSwgS2V5TGVuKTsgIC8vSU5JVCBTQk9YLCBLRVlMRU4rMyhJVikKKyAgICAgICAgTmRpc01vdmVNZW1vcnkocERlc3QsIHBLZXksIDMpOyAgLy9BcHBlbmQgSW5pdCBWZWN0b3IKKyAgICB9CisgICAgZWxzZQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworICAgIHsKKwkJTmRpc01vdmVNZW1vcnkoV0VQS0VZICsgMywgcEtleSwgS2V5TGVuKTsKKworICAgICAgICBmb3IoaSA9IDA7IGkgPCAzOyBpKyspCisJCQlXRVBLRVlbaV0gPSBSYW5kb21CeXRlKHBBZCk7ICAgLy9DYWxsIG1sbWUgUmFuZG9tQnl0ZSgpIGZ1bmN0aW9uLgorCQlBUkNGT1VSX0lOSVQoJnBBZC0+UHJpdmF0ZUluZm8uV0VQQ09OVEVYVCwgV0VQS0VZLCBLZXlMZW4gKyAzKTsgIC8vSU5JVCBTQk9YLCBLRVlMRU4rMyhJVikKKworCQlOZGlzTW92ZU1lbW9yeShwRGVzdCwgV0VQS0VZLCAzKTsgIC8vQXBwZW5kIEluaXQgVmVjdG9yCisgICAgfQorCSoocERlc3QrMykgPSAoS2V5SWQgPDwgNik7ICAgICAgIC8vQXBwZW5kIEtFWUlECisKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUJRGVzY3JpcHRpb246CisJCUVuY3J5cHQgdHJhbnNpbWl0dGVkIGRhdGEKKworCUFyZ3VtZW50czoKKyAgICAgIHBBZAkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorICAgICAgcFNyYyAgICAgICAgUG9pbnRlciB0byB0aGUgdHJhbnNpbWl0dGVkIHNvdXJjZSBkYXRhIHRoYXQgd2lsbCBiZSBlbmNyeXB0CisgICAgICBwRGVzdCAgICAgICBQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiB3aGVyZSBlbnRyeXB0aW9uIGRhdGEgd2lsbCBiZSBzdG9yZSBpbi4KKyAgICAgIExlbgkJCUluZGljYXRlIHRoZSBsZW5ndGggb2YgdGhlIHNvdXJjZSBkYXRhCisKKwlSZXR1cm4gVmFsdWU6CisgICAgICBOb25lCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECVJUTVBFbmNyeXB0RGF0YSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlwU3JjLAorCUlOCVBVQ0hBUgkJCXBEZXN0LAorCUlOCVVJTlQJCQlMZW4pCit7CisJcEFkLT5Qcml2YXRlSW5mby5GQ1NDUkMzMiA9IFJUTVBfQ0FMQ19GQ1MzMihwQWQtPlByaXZhdGVJbmZvLkZDU0NSQzMyLCBwU3JjLCBMZW4pOworCUFSQ0ZPVVJfRU5DUllQVCgmcEFkLT5Qcml2YXRlSW5mby5XRVBDT05URVhULCBwRGVzdCwgcFNyYywgTGVuKTsKK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZQlEZXNjcmlwdGlvbjoKKwkJRGVjcnlwdCByZWNlaXZlZCBXRVAgZGF0YQorCisJQXJndW1lbnRzOgorCQlwQWRhcHRlcgkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCQlwU3JjICAgICAgICBQb2ludGVyIHRvIHRoZSByZWNlaXZlZCBkYXRhCisJCUxlbiAgICAgICAgIHRoZSBsZW5ndGggb2YgdGhlIHJlY2VpdmVkIGRhdGEKKworCVJldHVybiBWYWx1ZToKKwkJVFJVRSAgICAgICAgRGVjcnlwdCBXRVAgZGF0YSBzdWNjZXNzCisJCUZBTFNFICAgICAgIERlY3J5cHQgV0VQIGRhdGEgZmFpbGVkCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworQk9PTEVBTglSVE1QU29mdERlY3J5cHRXRVAoCisJSU4gUFJUTVBfQURBUFRFUiAJcEFkLAorCUlOIFBVQ0hBUgkJCXBEYXRhLAorCUlOIFVMT05HCQkJRGF0YUJ5dGVDbnQsCisJSU4gUENJUEhFUl9LRVkJCXBHcm91cEtleSkKK3sKKwlVSU5UCXRyYWlsZmNzOworCVVJTlQgICAgY3JjMzI7CisJVUNIQVIJS2V5SWR4OworCVVDSEFSICAgV0VQS0VZW10gPSB7CisJCS8vSVYKKwkJMHgwMCwgMHgxMSwgMHgyMiwKKwkJLy9XRVAgS0VZCisJCTB4MDAsIDB4MTEsIDB4MjIsIDB4MzMsIDB4NDQsIDB4NTUsIDB4NjYsIDB4NzcsIDB4ODgsIDB4OTksIDB4QUEsIDB4QkIsIDB4Q0MKKwl9OworCVVDSEFSIAkqcFBheWxvYWQgPSAoVUNIQVIgKilwRGF0YSArIExFTkdUSF84MDJfMTE7CisJVUxPTkcJcGF5bG9hZF9sZW4gPSBEYXRhQnl0ZUNudCAtIExFTkdUSF84MDJfMTE7CisKKwlOZGlzTW92ZU1lbW9yeShXRVBLRVksIHBQYXlsb2FkLCAzKTsgICAgLy9HZXQgV0VQIElWCisKKwlLZXlJZHggPSAoKihwUGF5bG9hZCArIDMpICYgMHhjMCkgPj4gNjsKKwlpZiAocEdyb3VwS2V5W0tleUlkeF0uS2V5TGVuID09IDApCisJCXJldHVybiAoRkFMU0UpOworCisJTmRpc01vdmVNZW1vcnkoV0VQS0VZICsgMywgcEdyb3VwS2V5W0tleUlkeF0uS2V5LCBwR3JvdXBLZXlbS2V5SWR4XS5LZXlMZW4pOworCUFSQ0ZPVVJfSU5JVCgmcEFkLT5Qcml2YXRlSW5mby5XRVBDT05URVhULCBXRVBLRVksIHBHcm91cEtleVtLZXlJZHhdLktleUxlbiArIDMpOworCUFSQ0ZPVVJfREVDUllQVCgmcEFkLT5Qcml2YXRlSW5mby5XRVBDT05URVhULCBwUGF5bG9hZCwgcFBheWxvYWQgKyA0LCBwYXlsb2FkX2xlbiAtIDQpOworCU5kaXNNb3ZlTWVtb3J5KCZ0cmFpbGZjcywgcFBheWxvYWQgKyBwYXlsb2FkX2xlbiAtIDgsIDQpOworCWNyYzMyID0gUlRNUF9DQUxDX0ZDUzMyKFBQUElOSVRGQ1MzMiwgcFBheWxvYWQsIHBheWxvYWRfbGVuIC0gOCk7ICAvL1NraXAgbGFzdCA0IGJ5dGVzKEZDUykuCisJY3JjMzIgXj0gMHhmZmZmZmZmZjsgICAgICAgICAgICAgLyogY29tcGxlbWVudCAqLworCisgICAgaWYoY3JjMzIgIT0gY3B1MmxlMzIodHJhaWxmY3MpKQorICAgIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISBXRVAgRGF0YSBDUkMgRXJyb3IgIVxuIikpOwkgLy9DUkMgZXJyb3IuCisJCXJldHVybiAoRkFMU0UpOworCX0KKwlyZXR1cm4gKFRSVUUpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZQlEZXNjcmlwdGlvbjoKKwkJVGhlIFN0cmVhbSBDaXBoZXIgRW5jcnlwdGlvbiBBbGdvcml0aG0gIkFSQ0ZPVVIiIGluaXRpYWxpemUKKworCUFyZ3VtZW50czoKKwkgICBDdHggICAgICAgICBQb2ludGVyIHRvIEFSQ0ZPVVIgQ09OVEVYVCAoU0JPWCkKKwkJcEtleSAgICAgICAgUG9pbnRlciB0byB0aGUgV0VQIEtFWQorCQlLZXlMZW4gICAgICBJbmRpY2F0ZSB0aGUgbGVuZ3RoIGZvIHRoZSBXRVAgS0VZCisKKwlSZXR1cm4gVmFsdWU6CisJICAgTm9uZQorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlBUkNGT1VSX0lOSVQoCisJSU4JUEFSQ0ZPVVJDT05URVhUCUN0eCwKKwlJTglQVUNIQVIJCQlwS2V5LAorCUlOCVVJTlQJCQlLZXlMZW4pCit7CisJVUNIQVIJdCwgdTsKKwlVSU5UCWtleWluZGV4OworCVVJTlQJc3RhdGVpbmRleDsKKwlQVUNIQVIJc3RhdGU7CisJVUlOVAljb3VudGVyOworCisJc3RhdGUgPSBDdHgtPlNUQVRFOworCUN0eC0+WCA9IDA7CisJQ3R4LT5ZID0gMDsKKwlmb3IgKGNvdW50ZXIgPSAwOyBjb3VudGVyIDwgMjU2OyBjb3VudGVyKyspCisJCXN0YXRlW2NvdW50ZXJdID0gKFVDSEFSKWNvdW50ZXI7CisJa2V5aW5kZXggPSAwOworCXN0YXRlaW5kZXggPSAwOworCWZvciAoY291bnRlciA9IDA7IGNvdW50ZXIgPCAyNTY7IGNvdW50ZXIrKykKKwl7CisJCXQgPSBzdGF0ZVtjb3VudGVyXTsKKwkJc3RhdGVpbmRleCA9IChzdGF0ZWluZGV4ICsgcEtleVtrZXlpbmRleF0gKyB0KSAmIDB4ZmY7CisJCXUgPSBzdGF0ZVtzdGF0ZWluZGV4XTsKKwkJc3RhdGVbc3RhdGVpbmRleF0gPSB0OworCQlzdGF0ZVtjb3VudGVyXSA9IHU7CisJCWlmICgrK2tleWluZGV4ID49IEtleUxlbikKKwkJCWtleWluZGV4ID0gMDsKKwl9Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lCURlc2NyaXB0aW9uOgorCQlHZXQgYnl0ZXMgZnJvbSBBUkNGT1VSIENPTlRFWFQgKFMtQk9YKQorCisJQXJndW1lbnRzOgorCSAgIEN0eCAgICAgICAgIFBvaW50ZXIgdG8gQVJDRk9VUiBDT05URVhUIChTQk9YKQorCisJUmV0dXJuIFZhbHVlOgorCSAgIFVDSEFSICAtIHRoZSB2YWx1ZSBvZiB0aGUgQVJDRk9VUiBDT05URVhUIChTLUJPWCkKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitVQ0hBUglBUkNGT1VSX0JZVEUoCisJSU4JUEFSQ0ZPVVJDT05URVhUCQlDdHgpCit7CisgIFVJTlQgeDsKKyAgVUlOVCB5OworICBVQ0hBUiBzeCwgc3k7CisgIFBVQ0hBUiBzdGF0ZTsKKworICBzdGF0ZSA9IEN0eC0+U1RBVEU7CisgIHggPSAoQ3R4LT5YICsgMSkgJiAweGZmOworICBzeCA9IHN0YXRlW3hdOworICB5ID0gKHN4ICsgQ3R4LT5ZKSAmIDB4ZmY7CisgIHN5ID0gc3RhdGVbeV07CisgIEN0eC0+WCA9IHg7CisgIEN0eC0+WSA9IHk7CisgIHN0YXRlW3ldID0gc3g7CisgIHN0YXRlW3hdID0gc3k7CisKKyAgcmV0dXJuKHN0YXRlWyhzeCArIHN5KSAmIDB4ZmZdKTsKKworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZQlEZXNjcmlwdGlvbjoKKwkJVGhlIFN0cmVhbSBDaXBoZXIgRGVjcnlwdGlvbiBBbGdvcml0aG0KKworCUFyZ3VtZW50czoKKwkJQ3R4ICAgICAgICAgUG9pbnRlciB0byBBUkNGT1VSIENPTlRFWFQgKFNCT1gpCisJCXBEZXN0CQkJUG9pbnRlciB0byB0aGUgRGVzdGluYXRpb24KKwkJcFNyYyAgICAgICAgUG9pbnRlciB0byB0aGUgU291cmNlIGRhdGEKKwkJTGVuICAgICAgICAgSW5kaWNhdGUgdGhlIGxlbmd0aCBvZiB0aGUgU291cmNlIGRhdGEKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJQVJDRk9VUl9ERUNSWVBUKAorCUlOCVBBUkNGT1VSQ09OVEVYVAlDdHgsCisJSU4JUFVDSEFSCQkJcERlc3QsCisJSU4JUFVDSEFSCQkJcFNyYywKKwlJTglVSU5UCQkJTGVuKQoreworCVVJTlQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBMZW47IGkrKykKKwkJcERlc3RbaV0gPSBwU3JjW2ldIF4gQVJDRk9VUl9CWVRFKEN0eCk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lCURlc2NyaXB0aW9uOgorCQlUaGUgU3RyZWFtIENpcGhlciBFbmNyeXB0aW9uIEFsZ29yaXRobQorCisJQXJndW1lbnRzOgorCQlDdHggICAgICAgICBQb2ludGVyIHRvIEFSQ0ZPVVIgQ09OVEVYVCAoU0JPWCkKKwkJcERlc3QJCQlQb2ludGVyIHRvIHRoZSBEZXN0aW5hdGlvbgorCQlwU3JjICAgICAgICBQb2ludGVyIHRvIHRoZSBTb3VyY2UgZGF0YQorCQlMZW4gICAgICAgICBJbmRpY2F0ZSB0aGUgbGVuZ3RoIG9mIHRoZSBTb3VyY2UgZHRhCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJQVJDRk9VUl9FTkNSWVBUKAorCUlOCVBBUkNGT1VSQ09OVEVYVAlDdHgsCisJSU4JUFVDSEFSCQkJcERlc3QsCisJSU4JUFVDSEFSCQkJcFNyYywKKwlJTglVSU5UCQkJTGVuKQoreworCVVJTlQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBMZW47IGkrKykKKwkJcERlc3RbaV0gPSBwU3JjW2ldIF4gQVJDRk9VUl9CWVRFKEN0eCk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lCURlc2NyaXB0aW9uOgorCQlUaGUgU3RyZWFtIENpcGhlciBFbmNyeXB0aW9uIEFsZ29yaXRobSB3aGljaCBjb25mb3JtIHRvIHRoZSBzcGVjaWFsIHJlcXVpcmVtZW50IHRvIGVuY3J5cHQgIEdUSy4KKworCUFyZ3VtZW50czoKKwkJQ3R4ICAgICAgICAgUG9pbnRlciB0byBBUkNGT1VSIENPTlRFWFQgKFNCT1gpCisJCXBEZXN0CQkJUG9pbnRlciB0byB0aGUgRGVzdGluYXRpb24KKwkJcFNyYyAgICAgICAgUG9pbnRlciB0byB0aGUgU291cmNlIGRhdGEKKwkJTGVuICAgICAgICAgSW5kaWNhdGUgdGhlIGxlbmd0aCBvZiB0aGUgU291cmNlIGR0YQorCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCisKK1ZPSUQJV1BBQVJDRk9VUl9FTkNSWVBUKAorCUlOCVBBUkNGT1VSQ09OVEVYVAlDdHgsCisJSU4JUFVDSEFSCQkJcERlc3QsCisJSU4JUFVDSEFSCQkJcFNyYywKKwlJTglVSU5UCQkJTGVuKQoreworCVVJTlQgaTsKKyAgICAgICAgLy9kaXNjYXJkIGZpcnN0IDI1NiBieXRlcworCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKKyAgICAgICAgICAgIEFSQ0ZPVVJfQllURShDdHgpOworCisJZm9yIChpID0gMDsgaSA8IExlbjsgaSsrKQorCQlwRGVzdFtpXSA9IHBTcmNbaV0gXiBBUkNGT1VSX0JZVEUoQ3R4KTsKK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZQlEZXNjcmlwdGlvbjoKKwkJQ2FsY3VsYXRlIGEgbmV3IEZDUyBnaXZlbiB0aGUgY3VycmVudCBGQ1MgYW5kIHRoZSBuZXcgZGF0YS4KKworCUFyZ3VtZW50czoKKwkJRmNzCSAgICAgIHRoZSBvcmlnaW5hbCBGQ1MgdmFsdWUKKwkJQ3AgICAgICAgICAgcG9pbnRlciB0byB0aGUgZGF0YSB3aGljaCB3aWxsIGJlIGNhbGN1bGF0ZSB0aGUgRkNTCisJCUxlbiAgICAgICAgIHRoZSBsZW5ndGggb2YgdGhlIGRhdGEKKworCVJldHVybiBWYWx1ZToKKwkJVUlOVCAtIEZDUyAzMiBiaXRzCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitVSU5UCVJUTVBfQ0FMQ19GQ1MzMigKKwlJTglVSU5UCUZjcywKKwlJTglQVUNIQVIJQ3AsCisJSU4JSU5UCQlMZW4pCit7CisJd2hpbGUgKExlbi0tKQorCSAgIEZjcyA9ICgoKEZjcykgPj4gOCkgXiBGQ1NUQUJfMzJbKChGY3MpIF4gKCpDcCsrKSkgJiAweGZmXSk7CisKKwlyZXR1cm4gKEZjcyk7Cit9CisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUJRGVzY3JpcHRpb246CisJCUdldCBsYXN0IEZDUyBhbmQgZW5jcnlwdCBpdCB0byB0aGUgZGVzdGluYXRpb24KKworCUFyZ3VtZW50czoKKwkJcERlc3QJCQlQb2ludGVyIHRvIHRoZSBEZXN0aW5hdGlvbgorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlSVE1QU2V0SUNWKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUglwRGVzdCkKK3sKKwlwQWQtPlByaXZhdGVJbmZvLkZDU0NSQzMyIF49IDB4ZmZmZmZmZmY7ICAgICAgICAgICAgIC8qIGNvbXBsZW1lbnQgKi8KKwlwQWQtPlByaXZhdGVJbmZvLkZDU0NSQzMyID0gY3B1MmxlMzIocEFkLT5Qcml2YXRlSW5mby5GQ1NDUkMzMik7CisKKwlBUkNGT1VSX0VOQ1JZUFQoJnBBZC0+UHJpdmF0ZUluZm8uV0VQQ09OVEVYVCwgcERlc3QsIChQVUNIQVIpICZwQWQtPlByaXZhdGVJbmZvLkZDU0NSQzMyLCA0KTsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vc3BlY3RydW0uYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL3NwZWN0cnVtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDI2NWE2ZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL3NwZWN0cnVtLmMKQEAgLTAsMCArMSwxODc3IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCisgICAgTW9kdWxlIE5hbWU6CisJYWN0aW9uLmMKKworICAgIEFic3RyYWN0OgorICAgIEhhbmRsZSBhc3NvY2lhdGlvbiByZWxhdGVkIHJlcXVlc3RzIGVpdGhlciBmcm9tIFdTVEEgb3IgZnJvbSBsb2NhbCBNTE1FCisKKyAgICBSZXZpc2lvbiBIaXN0b3J5OgorICAgIFdobyAgICAgICAgICBXaGVuICAgICAgICAgIFdoYXQKKyAgICAtLS0tLS0tLS0gICAgLS0tLS0tLS0tLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJRm9uY2hpIFd1ICAgIDIwMDgJICAJICAgY3JlYXRlZCBmb3IgODAyLjExaAorICovCisKKyNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKKyNpbmNsdWRlICJhY3Rpb24uaCIKKworVk9JRCBNZWFzdXJlUmVxVGFiSW5pdCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlOZGlzQWxsb2NhdGVTcGluTG9jaygmcEFkLT5Db21tb25DZmcuTWVhc3VyZVJlcVRhYkxvY2spOworCisJcEFkLT5Db21tb25DZmcucE1lYXN1cmVSZXFUYWIgPSBrbWFsbG9jKHNpemVvZihNRUFTVVJFX1JFUV9UQUIpLCBHRlBfQVRPTUlDKTsKKwlpZiAocEFkLT5Db21tb25DZmcucE1lYXN1cmVSZXFUYWIpCisJCU5kaXNaZXJvTWVtb3J5KHBBZC0+Q29tbW9uQ2ZnLnBNZWFzdXJlUmVxVGFiLCBzaXplb2YoTUVBU1VSRV9SRVFfVEFCKSk7CisJZWxzZQorCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlcyBGYWlsIHRvIGFsbG9jIG1lbW9yeSBmb3IgcEFkLT5Db21tb25DZmcucE1lYXN1cmVSZXFUYWIuXG4iLCBfX2Z1bmNfXykpOworCisJcmV0dXJuOworfQorCitWT0lEIE1lYXN1cmVSZXFUYWJFeGl0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCU5kaXNGcmVlU3BpbkxvY2socEFkLT5Db21tb25DZmcuTWVhc3VyZVJlcVRhYkxvY2spOworCisJaWYgKHBBZC0+Q29tbW9uQ2ZnLnBNZWFzdXJlUmVxVGFiKQorCQlrZnJlZShwQWQtPkNvbW1vbkNmZy5wTWVhc3VyZVJlcVRhYik7CisJcEFkLT5Db21tb25DZmcucE1lYXN1cmVSZXFUYWIgPSBOVUxMOworCisJcmV0dXJuOworfQorCitzdGF0aWMgUE1FQVNVUkVfUkVRX0VOVFJZIE1lYXN1cmVSZXFMb29rVXAoCisJSU4gUFJUTVBfQURBUFRFUglwQWQsCisJSU4gVUlOVDgJCQlEaWFsb2dUb2tlbikKK3sKKwlVSU5UIEhhc2hJZHg7CisJUE1FQVNVUkVfUkVRX1RBQiBwVGFiID0gcEFkLT5Db21tb25DZmcucE1lYXN1cmVSZXFUYWI7CisJUE1FQVNVUkVfUkVRX0VOVFJZIHBFbnRyeSA9IE5VTEw7CisJUE1FQVNVUkVfUkVRX0VOVFJZIHBQcmV2RW50cnkgPSBOVUxMOworCisJaWYgKHBUYWIgPT0gTlVMTCkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzOiBwTWVhc3VyZVJlcVRhYiBkb2Vzbid0IGV4aXN0LlxuIiwgX19mdW5jX18pKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJUlRNUF9TRU1fTE9DSygmcEFkLT5Db21tb25DZmcuTWVhc3VyZVJlcVRhYkxvY2spOworCisJSGFzaElkeCA9IE1RX0RJQUxPR1RPS0VOX0hBU0hfSU5ERVgoRGlhbG9nVG9rZW4pOworCXBFbnRyeSA9IHBUYWItPkhhc2hbSGFzaElkeF07CisKKwl3aGlsZSAocEVudHJ5KQorCXsKKwkJaWYgKHBFbnRyeS0+RGlhbG9nVG9rZW4gPT0gRGlhbG9nVG9rZW4pCisJCQlicmVhazsKKwkJZWxzZQorCQl7CisJCQlwUHJldkVudHJ5ID0gcEVudHJ5OworCQkJcEVudHJ5ID0gcEVudHJ5LT5wTmV4dDsKKwkJfQorCX0KKworCVJUTVBfU0VNX1VOTE9DSygmcEFkLT5Db21tb25DZmcuTWVhc3VyZVJlcVRhYkxvY2spOworCisJcmV0dXJuIHBFbnRyeTsKK30KKworc3RhdGljIFBNRUFTVVJFX1JFUV9FTlRSWSBNZWFzdXJlUmVxSW5zZXJ0KAorCUlOIFBSVE1QX0FEQVBURVIJcEFkLAorCUlOIFVJTlQ4CQkJRGlhbG9nVG9rZW4pCit7CisJSU5UIGk7CisJVUxPTkcgSGFzaElkeDsKKwlQTUVBU1VSRV9SRVFfVEFCIHBUYWIgPSBwQWQtPkNvbW1vbkNmZy5wTWVhc3VyZVJlcVRhYjsKKwlQTUVBU1VSRV9SRVFfRU5UUlkgcEVudHJ5ID0gTlVMTCwgcEN1cnJFbnRyeTsKKwlVTE9ORyBOb3c7CisKKwlpZihwVGFiID09IE5VTEwpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlczogcE1lYXN1cmVSZXFUYWIgZG9lc24ndCBleGlzdC5cbiIsIF9fZnVuY19fKSk7CisJCXJldHVybiBOVUxMOworCX0KKworCXBFbnRyeSA9IE1lYXN1cmVSZXFMb29rVXAocEFkLCBEaWFsb2dUb2tlbik7CisJaWYgKHBFbnRyeSA9PSBOVUxMKQorCXsKKwkJUlRNUF9TRU1fTE9DSygmcEFkLT5Db21tb25DZmcuTWVhc3VyZVJlcVRhYkxvY2spOworCQlmb3IgKGkgPSAwOyBpIDwgTUFYX01FQVNVUkVfUkVRX1RBQl9TSVpFOyBpKyspCisJCXsKKwkJCU5kaXNHZXRTeXN0ZW1VcFRpbWUoJk5vdyk7CisJCQlwRW50cnkgPSAmcFRhYi0+Q29udGVudFtpXTsKKworCQkJaWYgKChwRW50cnktPlZhbGlkID09IFRSVUUpCisJCQkJJiYgUlRNUF9USU1FX0FGVEVSKCh1bnNpZ25lZCBsb25nKU5vdywgKHVuc2lnbmVkIGxvbmcpKHBFbnRyeS0+bGFzdFRpbWUgKyBNUV9SRVFfQUdFX09VVCkpKQorCQkJeworCQkJCVBNRUFTVVJFX1JFUV9FTlRSWSBwUHJldkVudHJ5ID0gTlVMTDsKKwkJCQlVTE9ORyBIYXNoSWR4ID0gTVFfRElBTE9HVE9LRU5fSEFTSF9JTkRFWChwRW50cnktPkRpYWxvZ1Rva2VuKTsKKwkJCQlQTUVBU1VSRV9SRVFfRU5UUlkgcFByb2JlRW50cnkgPSBwVGFiLT5IYXNoW0hhc2hJZHhdOworCisJCQkJLy8gdXBkYXRlIEhhc2ggbGlzdAorCQkJCWRvCisJCQkJeworCQkJCQlpZiAocFByb2JlRW50cnkgPT0gcEVudHJ5KQorCQkJCQl7CisJCQkJCQlpZiAocFByZXZFbnRyeSA9PSBOVUxMKQorCQkJCQkJeworCQkJCQkJCXBUYWItPkhhc2hbSGFzaElkeF0gPSBwRW50cnktPnBOZXh0OworCQkJCQkJfQorCQkJCQkJZWxzZQorCQkJCQkJeworCQkJCQkJCXBQcmV2RW50cnktPnBOZXh0ID0gcEVudHJ5LT5wTmV4dDsKKwkJCQkJCX0KKwkJCQkJCWJyZWFrOworCQkJCQl9CisKKwkJCQkJcFByZXZFbnRyeSA9IHBQcm9iZUVudHJ5OworCQkJCQlwUHJvYmVFbnRyeSA9IHBQcm9iZUVudHJ5LT5wTmV4dDsKKwkJCQl9IHdoaWxlIChwUHJvYmVFbnRyeSk7CisKKwkJCQlOZGlzWmVyb01lbW9yeShwRW50cnksIHNpemVvZihNRUFTVVJFX1JFUV9FTlRSWSkpOworCQkJCXBUYWItPlNpemUtLTsKKworCQkJCWJyZWFrOworCQkJfQorCisJCQlpZiAocEVudHJ5LT5WYWxpZCA9PSBGQUxTRSkKKwkJCQlicmVhazsKKwkJfQorCisJCWlmIChpIDwgTUFYX01FQVNVUkVfUkVRX1RBQl9TSVpFKQorCQl7CisJCQlOZGlzR2V0U3lzdGVtVXBUaW1lKCZOb3cpOworCQkJcEVudHJ5LT5sYXN0VGltZSA9IE5vdzsKKwkJCXBFbnRyeS0+VmFsaWQgPSBUUlVFOworCQkJcEVudHJ5LT5EaWFsb2dUb2tlbiA9IERpYWxvZ1Rva2VuOworCQkJcFRhYi0+U2l6ZSsrOworCQl9CisJCWVsc2UKKwkJeworCQkJcEVudHJ5ID0gTlVMTDsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzOiBwTWVhc3VyZVJlcVRhYiB0YWIgZnVsbC5cbiIsIF9fZnVuY19fKSk7CisJCX0KKworCQkvLyBhZGQgdGhpcyBOZWlnaGJvciBlbnRyeSBpbnRvIEhBU0ggdGFibGUKKwkJaWYgKHBFbnRyeSkKKwkJeworCQkJSGFzaElkeCA9IE1RX0RJQUxPR1RPS0VOX0hBU0hfSU5ERVgoRGlhbG9nVG9rZW4pOworCQkJaWYgKHBUYWItPkhhc2hbSGFzaElkeF0gPT0gTlVMTCkKKwkJCXsKKwkJCQlwVGFiLT5IYXNoW0hhc2hJZHhdID0gcEVudHJ5OworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXBDdXJyRW50cnkgPSBwVGFiLT5IYXNoW0hhc2hJZHhdOworCQkJCXdoaWxlIChwQ3VyckVudHJ5LT5wTmV4dCAhPSBOVUxMKQorCQkJCQlwQ3VyckVudHJ5ID0gcEN1cnJFbnRyeS0+cE5leHQ7CisJCQkJcEN1cnJFbnRyeS0+cE5leHQgPSBwRW50cnk7CisJCQl9CisJCX0KKworCQlSVE1QX1NFTV9VTkxPQ0soJnBBZC0+Q29tbW9uQ2ZnLk1lYXN1cmVSZXFUYWJMb2NrKTsKKwl9CisKKwlyZXR1cm4gcEVudHJ5OworfQorCitzdGF0aWMgVk9JRCBNZWFzdXJlUmVxRGVsZXRlKAorCUlOIFBSVE1QX0FEQVBURVIJcEFkLAorCUlOIFVJTlQ4CQkJRGlhbG9nVG9rZW4pCit7CisJUE1FQVNVUkVfUkVRX1RBQiBwVGFiID0gcEFkLT5Db21tb25DZmcucE1lYXN1cmVSZXFUYWI7CisJUE1FQVNVUkVfUkVRX0VOVFJZIHBFbnRyeSA9IE5VTEw7CisKKwlpZihwVGFiID09IE5VTEwpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlczogcE1lYXN1cmVSZXFUYWIgZG9lc24ndCBleGlzdC5cbiIsIF9fZnVuY19fKSk7CisJCXJldHVybjsKKwl9CisKKwkvLyBpZiBlbXB0eSwgcmV0dXJuCisJaWYgKHBUYWItPlNpemUgPT0gMCkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoInBNZWFzdXJlUmVxVGFiIGVtcHR5LlxuIikpOworCQlyZXR1cm47CisJfQorCisJcEVudHJ5ID0gTWVhc3VyZVJlcUxvb2tVcChwQWQsIERpYWxvZ1Rva2VuKTsKKwlpZiAocEVudHJ5ICE9IE5VTEwpCisJeworCQlQTUVBU1VSRV9SRVFfRU5UUlkgcFByZXZFbnRyeSA9IE5VTEw7CisJCVVMT05HIEhhc2hJZHggPSBNUV9ESUFMT0dUT0tFTl9IQVNIX0lOREVYKHBFbnRyeS0+RGlhbG9nVG9rZW4pOworCQlQTUVBU1VSRV9SRVFfRU5UUlkgcFByb2JlRW50cnkgPSBwVGFiLT5IYXNoW0hhc2hJZHhdOworCisJCVJUTVBfU0VNX0xPQ0soJnBBZC0+Q29tbW9uQ2ZnLk1lYXN1cmVSZXFUYWJMb2NrKTsKKwkJLy8gdXBkYXRlIEhhc2ggbGlzdAorCQlkbworCQl7CisJCQlpZiAocFByb2JlRW50cnkgPT0gcEVudHJ5KQorCQkJeworCQkJCWlmIChwUHJldkVudHJ5ID09IE5VTEwpCisJCQkJeworCQkJCQlwVGFiLT5IYXNoW0hhc2hJZHhdID0gcEVudHJ5LT5wTmV4dDsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJcFByZXZFbnRyeS0+cE5leHQgPSBwRW50cnktPnBOZXh0OworCQkJCX0KKwkJCQlicmVhazsKKwkJCX0KKworCQkJcFByZXZFbnRyeSA9IHBQcm9iZUVudHJ5OworCQkJcFByb2JlRW50cnkgPSBwUHJvYmVFbnRyeS0+cE5leHQ7CisJCX0gd2hpbGUgKHBQcm9iZUVudHJ5KTsKKworCQlOZGlzWmVyb01lbW9yeShwRW50cnksIHNpemVvZihNRUFTVVJFX1JFUV9FTlRSWSkpOworCQlwVGFiLT5TaXplLS07CisKKwkJUlRNUF9TRU1fVU5MT0NLKCZwQWQtPkNvbW1vbkNmZy5NZWFzdXJlUmVxVGFiTG9jayk7CisJfQorCisJcmV0dXJuOworfQorCitWT0lEIFRwY1JlcVRhYkluaXQoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJTmRpc0FsbG9jYXRlU3BpbkxvY2soJnBBZC0+Q29tbW9uQ2ZnLlRwY1JlcVRhYkxvY2spOworCisJcEFkLT5Db21tb25DZmcucFRwY1JlcVRhYiA9IGttYWxsb2Moc2l6ZW9mKFRQQ19SRVFfVEFCKSwgR0ZQX0FUT01JQyk7CisJaWYgKHBBZC0+Q29tbW9uQ2ZnLnBUcGNSZXFUYWIpCisJCU5kaXNaZXJvTWVtb3J5KHBBZC0+Q29tbW9uQ2ZnLnBUcGNSZXFUYWIsIHNpemVvZihUUENfUkVRX1RBQikpOworCWVsc2UKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXMgRmFpbCB0byBhbGxvYyBtZW1vcnkgZm9yIHBBZC0+Q29tbW9uQ2ZnLnBUcGNSZXFUYWIuXG4iLCBfX2Z1bmNfXykpOworCisJcmV0dXJuOworfQorCitWT0lEIFRwY1JlcVRhYkV4aXQoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJTmRpc0ZyZWVTcGluTG9jayhwQWQtPkNvbW1vbkNmZy5UcGNSZXFUYWJMb2NrKTsKKworCWlmIChwQWQtPkNvbW1vbkNmZy5wVHBjUmVxVGFiKQorCQlrZnJlZShwQWQtPkNvbW1vbkNmZy5wVHBjUmVxVGFiKTsKKwlwQWQtPkNvbW1vbkNmZy5wVHBjUmVxVGFiID0gTlVMTDsKKworCXJldHVybjsKK30KKworc3RhdGljIFBUUENfUkVRX0VOVFJZIFRwY1JlcUxvb2tVcCgKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiBVSU5UOAkJCURpYWxvZ1Rva2VuKQoreworCVVJTlQgSGFzaElkeDsKKwlQVFBDX1JFUV9UQUIgcFRhYiA9IHBBZC0+Q29tbW9uQ2ZnLnBUcGNSZXFUYWI7CisJUFRQQ19SRVFfRU5UUlkgcEVudHJ5ID0gTlVMTDsKKwlQVFBDX1JFUV9FTlRSWSBwUHJldkVudHJ5ID0gTlVMTDsKKworCWlmIChwVGFiID09IE5VTEwpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlczogcFRwY1JlcVRhYiBkb2Vzbid0IGV4aXN0LlxuIiwgX19mdW5jX18pKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJUlRNUF9TRU1fTE9DSygmcEFkLT5Db21tb25DZmcuVHBjUmVxVGFiTG9jayk7CisKKwlIYXNoSWR4ID0gVFBDX0RJQUxPR1RPS0VOX0hBU0hfSU5ERVgoRGlhbG9nVG9rZW4pOworCXBFbnRyeSA9IHBUYWItPkhhc2hbSGFzaElkeF07CisKKwl3aGlsZSAocEVudHJ5KQorCXsKKwkJaWYgKHBFbnRyeS0+RGlhbG9nVG9rZW4gPT0gRGlhbG9nVG9rZW4pCisJCQlicmVhazsKKwkJZWxzZQorCQl7CisJCQlwUHJldkVudHJ5ID0gcEVudHJ5OworCQkJcEVudHJ5ID0gcEVudHJ5LT5wTmV4dDsKKwkJfQorCX0KKworCVJUTVBfU0VNX1VOTE9DSygmcEFkLT5Db21tb25DZmcuVHBjUmVxVGFiTG9jayk7CisKKwlyZXR1cm4gcEVudHJ5OworfQorCisKK3N0YXRpYyBQVFBDX1JFUV9FTlRSWSBUcGNSZXFJbnNlcnQoCisJSU4gUFJUTVBfQURBUFRFUglwQWQsCisJSU4gVUlOVDgJCQlEaWFsb2dUb2tlbikKK3sKKwlJTlQgaTsKKwlVTE9ORyBIYXNoSWR4OworCVBUUENfUkVRX1RBQiBwVGFiID0gcEFkLT5Db21tb25DZmcucFRwY1JlcVRhYjsKKwlQVFBDX1JFUV9FTlRSWSBwRW50cnkgPSBOVUxMLCBwQ3VyckVudHJ5OworCVVMT05HIE5vdzsKKworCWlmKHBUYWIgPT0gTlVMTCkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzOiBwVHBjUmVxVGFiIGRvZXNuJ3QgZXhpc3QuXG4iLCBfX2Z1bmNfXykpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlwRW50cnkgPSBUcGNSZXFMb29rVXAocEFkLCBEaWFsb2dUb2tlbik7CisJaWYgKHBFbnRyeSA9PSBOVUxMKQorCXsKKwkJUlRNUF9TRU1fTE9DSygmcEFkLT5Db21tb25DZmcuVHBjUmVxVGFiTG9jayk7CisJCWZvciAoaSA9IDA7IGkgPCBNQVhfVFBDX1JFUV9UQUJfU0laRTsgaSsrKQorCQl7CisJCQlOZGlzR2V0U3lzdGVtVXBUaW1lKCZOb3cpOworCQkJcEVudHJ5ID0gJnBUYWItPkNvbnRlbnRbaV07CisKKwkJCWlmICgocEVudHJ5LT5WYWxpZCA9PSBUUlVFKQorCQkJCSYmIFJUTVBfVElNRV9BRlRFUigodW5zaWduZWQgbG9uZylOb3csICh1bnNpZ25lZCBsb25nKShwRW50cnktPmxhc3RUaW1lICsgVFBDX1JFUV9BR0VfT1VUKSkpCisJCQl7CisJCQkJUFRQQ19SRVFfRU5UUlkgcFByZXZFbnRyeSA9IE5VTEw7CisJCQkJVUxPTkcgSGFzaElkeCA9IFRQQ19ESUFMT0dUT0tFTl9IQVNIX0lOREVYKHBFbnRyeS0+RGlhbG9nVG9rZW4pOworCQkJCVBUUENfUkVRX0VOVFJZIHBQcm9iZUVudHJ5ID0gcFRhYi0+SGFzaFtIYXNoSWR4XTsKKworCQkJCS8vIHVwZGF0ZSBIYXNoIGxpc3QKKwkJCQlkbworCQkJCXsKKwkJCQkJaWYgKHBQcm9iZUVudHJ5ID09IHBFbnRyeSkKKwkJCQkJeworCQkJCQkJaWYgKHBQcmV2RW50cnkgPT0gTlVMTCkKKwkJCQkJCXsKKwkJCQkJCQlwVGFiLT5IYXNoW0hhc2hJZHhdID0gcEVudHJ5LT5wTmV4dDsKKwkJCQkJCX0KKwkJCQkJCWVsc2UKKwkJCQkJCXsKKwkJCQkJCQlwUHJldkVudHJ5LT5wTmV4dCA9IHBFbnRyeS0+cE5leHQ7CisJCQkJCQl9CisJCQkJCQlicmVhazsKKwkJCQkJfQorCisJCQkJCXBQcmV2RW50cnkgPSBwUHJvYmVFbnRyeTsKKwkJCQkJcFByb2JlRW50cnkgPSBwUHJvYmVFbnRyeS0+cE5leHQ7CisJCQkJfSB3aGlsZSAocFByb2JlRW50cnkpOworCisJCQkJTmRpc1plcm9NZW1vcnkocEVudHJ5LCBzaXplb2YoVFBDX1JFUV9FTlRSWSkpOworCQkJCXBUYWItPlNpemUtLTsKKworCQkJCWJyZWFrOworCQkJfQorCisJCQlpZiAocEVudHJ5LT5WYWxpZCA9PSBGQUxTRSkKKwkJCQlicmVhazsKKwkJfQorCisJCWlmIChpIDwgTUFYX1RQQ19SRVFfVEFCX1NJWkUpCisJCXsKKwkJCU5kaXNHZXRTeXN0ZW1VcFRpbWUoJk5vdyk7CisJCQlwRW50cnktPmxhc3RUaW1lID0gTm93OworCQkJcEVudHJ5LT5WYWxpZCA9IFRSVUU7CisJCQlwRW50cnktPkRpYWxvZ1Rva2VuID0gRGlhbG9nVG9rZW47CisJCQlwVGFiLT5TaXplKys7CisJCX0KKwkJZWxzZQorCQl7CisJCQlwRW50cnkgPSBOVUxMOworCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXM6IHBUcGNSZXFUYWIgdGFiIGZ1bGwuXG4iLCBfX2Z1bmNfXykpOworCQl9CisKKwkJLy8gYWRkIHRoaXMgTmVpZ2hib3IgZW50cnkgaW50byBIQVNIIHRhYmxlCisJCWlmIChwRW50cnkpCisJCXsKKwkJCUhhc2hJZHggPSBUUENfRElBTE9HVE9LRU5fSEFTSF9JTkRFWChEaWFsb2dUb2tlbik7CisJCQlpZiAocFRhYi0+SGFzaFtIYXNoSWR4XSA9PSBOVUxMKQorCQkJeworCQkJCXBUYWItPkhhc2hbSGFzaElkeF0gPSBwRW50cnk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJcEN1cnJFbnRyeSA9IHBUYWItPkhhc2hbSGFzaElkeF07CisJCQkJd2hpbGUgKHBDdXJyRW50cnktPnBOZXh0ICE9IE5VTEwpCisJCQkJCXBDdXJyRW50cnkgPSBwQ3VyckVudHJ5LT5wTmV4dDsKKwkJCQlwQ3VyckVudHJ5LT5wTmV4dCA9IHBFbnRyeTsKKwkJCX0KKwkJfQorCisJCVJUTVBfU0VNX1VOTE9DSygmcEFkLT5Db21tb25DZmcuVHBjUmVxVGFiTG9jayk7CisJfQorCisJcmV0dXJuIHBFbnRyeTsKK30KKworc3RhdGljIFZPSUQgVHBjUmVxRGVsZXRlKAorCUlOIFBSVE1QX0FEQVBURVIJcEFkLAorCUlOIFVJTlQ4CQkJRGlhbG9nVG9rZW4pCit7CisJUFRQQ19SRVFfVEFCIHBUYWIgPSBwQWQtPkNvbW1vbkNmZy5wVHBjUmVxVGFiOworCVBUUENfUkVRX0VOVFJZIHBFbnRyeSA9IE5VTEw7CisKKwlpZihwVGFiID09IE5VTEwpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlczogcFRwY1JlcVRhYiBkb2Vzbid0IGV4aXN0LlxuIiwgX19mdW5jX18pKTsKKwkJcmV0dXJuOworCX0KKworCS8vIGlmIGVtcHR5LCByZXR1cm4KKwlpZiAocFRhYi0+U2l6ZSA9PSAwKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgicFRwY1JlcVRhYiBlbXB0eS5cbiIpKTsKKwkJcmV0dXJuOworCX0KKworCXBFbnRyeSA9IFRwY1JlcUxvb2tVcChwQWQsIERpYWxvZ1Rva2VuKTsKKwlpZiAocEVudHJ5ICE9IE5VTEwpCisJeworCQlQVFBDX1JFUV9FTlRSWSBwUHJldkVudHJ5ID0gTlVMTDsKKwkJVUxPTkcgSGFzaElkeCA9IFRQQ19ESUFMT0dUT0tFTl9IQVNIX0lOREVYKHBFbnRyeS0+RGlhbG9nVG9rZW4pOworCQlQVFBDX1JFUV9FTlRSWSBwUHJvYmVFbnRyeSA9IHBUYWItPkhhc2hbSGFzaElkeF07CisKKwkJUlRNUF9TRU1fTE9DSygmcEFkLT5Db21tb25DZmcuVHBjUmVxVGFiTG9jayk7CisJCS8vIHVwZGF0ZSBIYXNoIGxpc3QKKwkJZG8KKwkJeworCQkJaWYgKHBQcm9iZUVudHJ5ID09IHBFbnRyeSkKKwkJCXsKKwkJCQlpZiAocFByZXZFbnRyeSA9PSBOVUxMKQorCQkJCXsKKwkJCQkJcFRhYi0+SGFzaFtIYXNoSWR4XSA9IHBFbnRyeS0+cE5leHQ7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCXBQcmV2RW50cnktPnBOZXh0ID0gcEVudHJ5LT5wTmV4dDsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCXBQcmV2RW50cnkgPSBwUHJvYmVFbnRyeTsKKwkJCXBQcm9iZUVudHJ5ID0gcFByb2JlRW50cnktPnBOZXh0OworCQl9IHdoaWxlIChwUHJvYmVFbnRyeSk7CisKKwkJTmRpc1plcm9NZW1vcnkocEVudHJ5LCBzaXplb2YoVFBDX1JFUV9FTlRSWSkpOworCQlwVGFiLT5TaXplLS07CisKKwkJUlRNUF9TRU1fVU5MT0NLKCZwQWQtPkNvbW1vbkNmZy5UcGNSZXFUYWJMb2NrKTsKKwl9CisKKwlyZXR1cm47Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJR2V0IEN1cnJlbnQgVGltZVMgdGFtcC4KKworCVBhcmFtZXRyczoKKworCVJldHVybgk6IEN1cnJlbnQgVGltZSBTdGFtcC4KKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitzdGF0aWMgVUlOVDY0IEdldEN1cnJlbnRUaW1lU3RhbXAoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJLy8gZ2V0IGN1cnJlbnQgdGltZSBzdGFtcC4KKwlyZXR1cm4gMDsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlHZXQgQ3VycmVudCBUcmFuc21pdCBQb3dlci4KKworCVBhcmFtZXRyczoKKworCVJldHVybgk6IEN1cnJlbnQgVGltZSBTdGFtcC4KKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitzdGF0aWMgVUlOVDggR2V0Q3VyVHhQd3IoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVUlOVDggV2NpZCkKK3sKKwlyZXR1cm4gMTY7IC8qIDE2IGRCbSAqLworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCUluc2VydCBEaWFsb2cgVG9rZW4gaW50byBmcmFtZS4KKworCVBhcmFtZXRyczoKKwkJMS4gZnJhbWUgYnVmZmVyIHBvaW50ZXIuCisJCTIuIGZyYW1lIGxlbmd0aC4KKwkJMy4gRGlhbG9nIHRva2VuLgorCisJUmV0dXJuCTogTm9uZS4KKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitzdGF0aWMgVk9JRCBJbnNlcnREaWFsb2dUb2tlbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlPVVQgUFVDSEFSIHBGcmFtZUJ1ZiwKKwlPVVQgUFVMT05HIHBGcmFtZUxlbiwKKwlJTiBVSU5UOCBEaWFsb2dUb2tlbikKK3sKKwlVTE9ORyBUZW1wTGVuOworCU1ha2VPdXRnb2luZ0ZyYW1lKHBGcmFtZUJ1ZiwJJlRlbXBMZW4sCisJCQkJCTEsCQkJCSZEaWFsb2dUb2tlbiwKKwkJCQkJRU5EX09GX0FSR1MpOworCisJKnBGcmFtZUxlbiA9ICpwRnJhbWVMZW4gKyBUZW1wTGVuOworCisJcmV0dXJuOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCUluc2VydCBUUEMgUmVxdWVzdCBJRSBpbnRvIGZyYW1lLgorCisJUGFyYW1ldHJzOgorCQkxLiBmcmFtZSBidWZmZXIgcG9pbnRlci4KKwkJMi4gZnJhbWUgbGVuZ3RoLgorCisJUmV0dXJuCTogTm9uZS4KKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisgc3RhdGljIFZPSUQgSW5zZXJ0VHBjUmVxSUUoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJT1VUIFBVQ0hBUiBwRnJhbWVCdWYsCisJT1VUIFBVTE9ORyBwRnJhbWVMZW4pCit7CisJVUxPTkcgVGVtcExlbjsKKwlVTE9ORyBMZW4gPSAwOworCVVJTlQ4IEVsZW1lbnRJRCA9IElFX1RQQ19SRVFVRVNUOworCisJTWFrZU91dGdvaW5nRnJhbWUocEZyYW1lQnVmLAkJCQkJJlRlbXBMZW4sCisJCQkJCQkxLAkJCQkJCQkmRWxlbWVudElELAorCQkJCQkJMSwJCQkJCQkJJkxlbiwKKwkJCQkJCUVORF9PRl9BUkdTKTsKKworCSpwRnJhbWVMZW4gPSAqcEZyYW1lTGVuICsgVGVtcExlbjsKKworCXJldHVybjsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlJbnNlcnQgVFBDIFJlcG9ydCBJRSBpbnRvIGZyYW1lLgorCisJUGFyYW1ldHJzOgorCQkxLiBmcmFtZSBidWZmZXIgcG9pbnRlci4KKwkJMi4gZnJhbWUgbGVuZ3RoLgorCQkzLiBUcmFuc21pdCBQb3dlci4KKwkJNC4gTGluayBNYXJnaW4uCisKKwlSZXR1cm4JOiBOb25lLgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKyBzdGF0aWMgVk9JRCBJbnNlcnRUcGNSZXBvcnRJRSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlPVVQgUFVDSEFSIHBGcmFtZUJ1ZiwKKwlPVVQgUFVMT05HIHBGcmFtZUxlbiwKKwlJTiBVSU5UOCBUeFB3ciwKKwlJTiBVSU5UOCBMaW5rTWFyZ2luKQoreworCVVMT05HIFRlbXBMZW47CisJVUxPTkcgTGVuID0gc2l6ZW9mKFRQQ19SRVBPUlRfSU5GTyk7CisJVUlOVDggRWxlbWVudElEID0gSUVfVFBDX1JFUE9SVDsKKwlUUENfUkVQT1JUX0lORk8gVHBjUmVwb3J0SUU7CisKKwlUcGNSZXBvcnRJRS5UeFB3ciA9IFR4UHdyOworCVRwY1JlcG9ydElFLkxpbmtNYXJnaW4gPSBMaW5rTWFyZ2luOworCisJTWFrZU91dGdvaW5nRnJhbWUocEZyYW1lQnVmLAkJCQkJJlRlbXBMZW4sCisJCQkJCQkxLAkJCQkJCQkmRWxlbWVudElELAorCQkJCQkJMSwJCQkJCQkJJkxlbiwKKwkJCQkJCUxlbiwJCQkJCQkmVHBjUmVwb3J0SUUsCisJCQkJCQlFTkRfT0ZfQVJHUyk7CisKKwkqcEZyYW1lTGVuID0gKnBGcmFtZUxlbiArIFRlbXBMZW47CisKKworCXJldHVybjsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlJbnNlcnQgQ2hhbm5lbCBTd2l0Y2ggQW5ub3VuY2VtZW50IElFIGludG8gZnJhbWUuCisKKwlQYXJhbWV0cnM6CisJCTEuIGZyYW1lIGJ1ZmZlciBwb2ludGVyLgorCQkyLiBmcmFtZSBsZW5ndGguCisJCTMuIGNoYW5uZWwgc3dpdGNoIGFubm91bmNlbWVudCBtb2RlLgorCQk0LiBuZXcgc2VsZWN0ZWQgY2hhbm5lbC4KKwkJNS4gY2hhbm5lbCBzd2l0Y2ggYW5ub3VuY2VtZW50IGNvdW50LgorCisJUmV0dXJuCTogTm9uZS4KKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitzdGF0aWMgVk9JRCBJbnNlcnRDaFN3QW5uSUUoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJT1VUIFBVQ0hBUiBwRnJhbWVCdWYsCisJT1VUIFBVTE9ORyBwRnJhbWVMZW4sCisJSU4gVUlOVDggQ2hTd01vZGUsCisJSU4gVUlOVDggTmV3Q2hhbm5lbCwKKwlJTiBVSU5UOCBDaFN3Q250KQoreworCVVMT05HIFRlbXBMZW47CisJVUxPTkcgTGVuID0gc2l6ZW9mKENIX1NXX0FOTl9JTkZPKTsKKwlVSU5UOCBFbGVtZW50SUQgPSBJRV9DSEFOTkVMX1NXSVRDSF9BTk5PVU5DRU1FTlQ7CisJQ0hfU1dfQU5OX0lORk8gQ2hTd0FubklFOworCisJQ2hTd0FubklFLkNoU3dNb2RlID0gQ2hTd01vZGU7CisJQ2hTd0FubklFLkNoYW5uZWwgPSBOZXdDaGFubmVsOworCUNoU3dBbm5JRS5DaFN3Q250ID0gQ2hTd0NudDsKKworCU1ha2VPdXRnb2luZ0ZyYW1lKHBGcmFtZUJ1ZiwJCQkJJlRlbXBMZW4sCisJCQkJCQkxLAkJCQkJCSZFbGVtZW50SUQsCisJCQkJCQkxLAkJCQkJCSZMZW4sCisJCQkJCQlMZW4sCQkJCQkmQ2hTd0FubklFLAorCQkJCQkJRU5EX09GX0FSR1MpOworCisJKnBGcmFtZUxlbiA9ICpwRnJhbWVMZW4gKyBUZW1wTGVuOworCisKKwlyZXR1cm47Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJSW5zZXJ0IE1lYXN1cmUgUmVxdWVzdCBJRSBpbnRvIGZyYW1lLgorCisJUGFyYW1ldHJzOgorCQkxLiBmcmFtZSBidWZmZXIgcG9pbnRlci4KKwkJMi4gZnJhbWUgbGVuZ3RoLgorCQkzLiBNZWFzdXJlIFRva2VuLgorCQk0LiBNZWFzdXJlIFJlcXVlc3QgTW9kZS4KKwkJNS4gTWVhc3VyZSBSZXF1ZXN0IFR5cGUuCisJCTYuIE1lYXN1cmUgQ2hhbm5lbC4KKwkJNy4gTWVhc3VyZSBTdGFydCB0aW1lLgorCQk4LiBNZWFzdXJlIER1cmF0aW9uLgorCisKKwlSZXR1cm4JOiBOb25lLgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK3N0YXRpYyBWT0lEIEluc2VydE1lYXN1cmVSZXFJRSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlPVVQgUFVDSEFSIHBGcmFtZUJ1ZiwKKwlPVVQgUFVMT05HIHBGcmFtZUxlbiwKKwlJTiBQTUVBU1VSRV9SRVFfSU5GTyBwTWVhc3VyZVJlcUlFKQoreworCVVMT05HIFRlbXBMZW47CisJVUlOVDggTGVuID0gc2l6ZW9mKE1FQVNVUkVfUkVRX0lORk8pOworCVVJTlQ4IEVsZW1lbnRJRCA9IElFX01FQVNVUkVNRU5UX1JFUVVFU1Q7CisKKwlNYWtlT3V0Z29pbmdGcmFtZShwRnJhbWVCdWYsCQkJCQkmVGVtcExlbiwKKwkJCQkJCTEsCQkJCQkJCSZFbGVtZW50SUQsCisJCQkJCQkxLAkJCQkJCQkmTGVuLAorCQkJCQkJTGVuLAkJCQkJCXBNZWFzdXJlUmVxSUUsCisJCQkJCQlFTkRfT0ZfQVJHUyk7CisKKwkqcEZyYW1lTGVuID0gKnBGcmFtZUxlbiArIFRlbXBMZW47CisKKwlyZXR1cm47Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJSW5zZXJ0IE1lYXN1cmUgUmVwb3J0IElFIGludG8gZnJhbWUuCisKKwlQYXJhbWV0cnM6CisJCTEuIGZyYW1lIGJ1ZmZlciBwb2ludGVyLgorCQkyLiBmcmFtZSBsZW5ndGguCisJCTMuIE1lYXN1cmUgVG9rZW4uCisJCTQuIE1lYXN1cmUgUmVxdWVzdCBNb2RlLgorCQk1LiBNZWFzdXJlIFJlcXVlc3QgVHlwZS4KKwkJNi4gTGVuZ3RoIG9mIFJlcG9ydCBJbmZvbWF0aW9uCisJCTcuIFBvaW50ZXIgb2YgUmVwb3J0IEluZm9tYXRpb24gQnVmZmVyLgorCisJUmV0dXJuCTogTm9uZS4KKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitzdGF0aWMgVk9JRCBJbnNlcnRNZWFzdXJlUmVwb3J0SUUoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJT1VUIFBVQ0hBUiBwRnJhbWVCdWYsCisJT1VUIFBVTE9ORyBwRnJhbWVMZW4sCisJSU4gUE1FQVNVUkVfUkVQT1JUX0lORk8gcE1lYXN1cmVSZXBvcnRJRSwKKwlJTiBVSU5UOCBSZXBvcnRMbmZvTGVuLAorCUlOIFBVSU5UOCBwUmVwb3J0SW5mbykKK3sKKwlVTE9ORyBUZW1wTGVuOworCVVMT05HIExlbjsKKwlVSU5UOCBFbGVtZW50SUQgPSBJRV9NRUFTVVJFTUVOVF9SRVBPUlQ7CisKKwlMZW4gPSBzaXplb2YoTUVBU1VSRV9SRVBPUlRfSU5GTykgKyBSZXBvcnRMbmZvTGVuOworCisJTWFrZU91dGdvaW5nRnJhbWUocEZyYW1lQnVmLAkJCQkJJlRlbXBMZW4sCisJCQkJCQkxLAkJCQkJCQkmRWxlbWVudElELAorCQkJCQkJMSwJCQkJCQkJJkxlbiwKKwkJCQkJCUxlbiwJCQkJCQlwTWVhc3VyZVJlcG9ydElFLAorCQkJCQkJRU5EX09GX0FSR1MpOworCisJKnBGcmFtZUxlbiA9ICpwRnJhbWVMZW4gKyBUZW1wTGVuOworCisJaWYgKChSZXBvcnRMbmZvTGVuID4gMCkgJiYgKHBSZXBvcnRJbmZvICE9IE5VTEwpKQorCXsKKwkJTWFrZU91dGdvaW5nRnJhbWUocEZyYW1lQnVmICsgKnBGcmFtZUxlbiwJCSZUZW1wTGVuLAorCQkJCQkJCVJlcG9ydExuZm9MZW4sCQkJCXBSZXBvcnRJbmZvLAorCQkJCQkJCUVORF9PRl9BUkdTKTsKKworCQkqcEZyYW1lTGVuID0gKnBGcmFtZUxlbiArIFRlbXBMZW47CisJfQorCXJldHVybjsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlQcmVwYXJlIE1lYXN1cmVtZW50IHJlcXVlc3QgYWN0aW9uIGZyYW1lIGFuZCBlbnF1ZXVlIGl0IGludG8KKwkJbWFuYWdlbWVudCBxdWV1ZSB3YWl0aW5nIGZvciB0cmFuc21pdGlvbi4KKworCVBhcmFtZXRyczoKKwkJMS4gdGhlIGRlc3RpbmF0aW9uIG1hYyBhZGRyZXNzIG9mIHRoZSBmcmFtZS4KKworCVJldHVybgk6IE5vbmUuCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBFbnF1ZXVlTWVhc3VyZW1lbnRSZXEoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gUFVDSEFSIHBEQSwKKwlJTiBVSU5UOCBNZWFzdXJlVG9rZW4sCisJSU4gVUlOVDggTWVhc3VyZVJlcU1vZGUsCisJSU4gVUlOVDggTWVhc3VyZVJlcVR5cGUsCisJSU4gVUlOVDggTWVhc3VyZUNoLAorCUlOIFVJTlQxNiBNZWFzdXJlRHVyYXRpb24pCit7CisJUFVDSEFSIHBPdXRCdWZmZXIgPSBOVUxMOworCU5ESVNfU1RBVFVTIE5TdGF0dXM7CisJVUxPTkcgRnJhbWVMZW47CisJSEVBREVSXzgwMl8xMSBBY3RIZHI7CisJTUVBU1VSRV9SRVFfSU5GTyBNZWFzdXJlUmVxSUU7CisJVUlOVDggUm1SZXFEYWlsb2dUb2tlbiA9IFJhbmRvbUJ5dGUocEFkKTsKKwlVSU5UNjQgTWVhc3VyZVN0YXJ0VGltZSA9IEdldEN1cnJlbnRUaW1lU3RhbXAocEFkKTsKKworCS8vIGJ1aWxkIGFjdGlvbiBmcmFtZSBoZWFkZXIuCisJTWd0TWFjSGVhZGVySW5pdChwQWQsICZBY3RIZHIsIFNVQlRZUEVfQUNUSU9OLCAwLCBwREEsCisJCQkJCQlwQWQtPkN1cnJlbnRBZGRyZXNzKTsKKworCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAoUFZPSUQpJnBPdXRCdWZmZXIpOyAgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQorCWlmKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxlZCBcbiIsIF9fZnVuY19fKSk7CisJCXJldHVybjsKKwl9CisJTmRpc01vdmVNZW1vcnkocE91dEJ1ZmZlciwgKFBDSEFSKSZBY3RIZHIsIHNpemVvZihIRUFERVJfODAyXzExKSk7CisJRnJhbWVMZW4gPSBzaXplb2YoSEVBREVSXzgwMl8xMSk7CisKKwlJbnNlcnRBY3RGaWVsZChwQWQsIChwT3V0QnVmZmVyICsgRnJhbWVMZW4pLCAmRnJhbWVMZW4sIENBVEVHT1JZX1NQRUNUUlVNLCBTUEVDX01SUSk7CisKKwkvLyBmaWxsIERpYWxvZyBUb2tlbgorCUluc2VydERpYWxvZ1Rva2VuKHBBZCwgKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiksICZGcmFtZUxlbiwgTWVhc3VyZVRva2VuKTsKKworCS8vIHByZXBhcmUgTWVhc3VyZW1lbnQgSUUuCisJTmRpc1plcm9NZW1vcnkoJk1lYXN1cmVSZXFJRSwgc2l6ZW9mKE1FQVNVUkVfUkVRX0lORk8pKTsKKwlNZWFzdXJlUmVxSUUuVG9rZW4gPSBSbVJlcURhaWxvZ1Rva2VuOworCU1lYXN1cmVSZXFJRS5SZXFNb2RlLndvcmQgPSBNZWFzdXJlUmVxTW9kZTsKKwlNZWFzdXJlUmVxSUUuUmVxVHlwZSA9IE1lYXN1cmVSZXFUeXBlOworCU1lYXN1cmVSZXFJRS5NZWFzdXJlUmVxLkNoTnVtID0gTWVhc3VyZUNoOworCU1lYXN1cmVSZXFJRS5NZWFzdXJlUmVxLk1lYXN1cmVTdGFydFRpbWUgPSBjcHUybGU2NChNZWFzdXJlU3RhcnRUaW1lKTsKKwlNZWFzdXJlUmVxSUUuTWVhc3VyZVJlcS5NZWFzdXJlRHVyYXRpb24gPSBjcHUybGUxNihNZWFzdXJlRHVyYXRpb24pOworCUluc2VydE1lYXN1cmVSZXFJRShwQWQsIChwT3V0QnVmZmVyICsgRnJhbWVMZW4pLCAmRnJhbWVMZW4sICZNZWFzdXJlUmVxSUUpOworCisJTWluaXBvcnRNTVJlcXVlc3QocEFkLCBRSURfQUNfQkUsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKKwlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOworCisJcmV0dXJuOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVByZXBhcmUgTWVhc3VyZW1lbnQgcmVwb3J0IGFjdGlvbiBmcmFtZSBhbmQgZW5xdWV1ZSBpdCBpbnRvCisJCW1hbmFnZW1lbnQgcXVldWUgd2FpdGluZyBmb3IgdHJhbnNtaXRpb24uCisKKwlQYXJhbWV0cnM6CisJCTEuIHRoZSBkZXN0aW5hdGlvbiBtYWMgYWRkcmVzcyBvZiB0aGUgZnJhbWUuCisKKwlSZXR1cm4JOiBOb25lLgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgRW5xdWV1ZU1lYXN1cmVtZW50UmVwKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFBVQ0hBUiBwREEsCisJSU4gVUlOVDggRGlhbG9nVG9rZW4sCisJSU4gVUlOVDggTWVhc3VyZVRva2VuLAorCUlOIFVJTlQ4IE1lYXN1cmVSZXFNb2RlLAorCUlOIFVJTlQ4IE1lYXN1cmVSZXFUeXBlLAorCUlOIFVJTlQ4IFJlcG9ydEluZm9MZW4sCisJSU4gUFVJTlQ4IHBSZXBvcnRJbmZvKQoreworCVBVQ0hBUiBwT3V0QnVmZmVyID0gTlVMTDsKKwlORElTX1NUQVRVUyBOU3RhdHVzOworCVVMT05HIEZyYW1lTGVuOworCUhFQURFUl84MDJfMTEgQWN0SGRyOworCU1FQVNVUkVfUkVQT1JUX0lORk8gTWVhc3VyZVJlcElFOworCisJLy8gYnVpbGQgYWN0aW9uIGZyYW1lIGhlYWRlci4KKwlNZ3RNYWNIZWFkZXJJbml0KHBBZCwgJkFjdEhkciwgU1VCVFlQRV9BQ1RJT04sIDAsIHBEQSwKKwkJCQkJCXBBZC0+Q3VycmVudEFkZHJlc3MpOworCisJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsIChQVk9JRCkmcE91dEJ1ZmZlcik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5CisJaWYoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXMoKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkIFxuIiwgX19mdW5jX18pKTsKKwkJcmV0dXJuOworCX0KKwlOZGlzTW92ZU1lbW9yeShwT3V0QnVmZmVyLCAoUENIQVIpJkFjdEhkciwgc2l6ZW9mKEhFQURFUl84MDJfMTEpKTsKKwlGcmFtZUxlbiA9IHNpemVvZihIRUFERVJfODAyXzExKTsKKworCUluc2VydEFjdEZpZWxkKHBBZCwgKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiksICZGcmFtZUxlbiwgQ0FURUdPUllfU1BFQ1RSVU0sIFNQRUNfTVJQKTsKKworCS8vIGZpbGwgRGlhbG9nIFRva2VuCisJSW5zZXJ0RGlhbG9nVG9rZW4ocEFkLCAocE91dEJ1ZmZlciArIEZyYW1lTGVuKSwgJkZyYW1lTGVuLCBEaWFsb2dUb2tlbik7CisKKwkvLyBwcmVwYXJlIE1lYXN1cmVtZW50IElFLgorCU5kaXNaZXJvTWVtb3J5KCZNZWFzdXJlUmVwSUUsIHNpemVvZihNRUFTVVJFX1JFUE9SVF9JTkZPKSk7CisJTWVhc3VyZVJlcElFLlRva2VuID0gTWVhc3VyZVRva2VuOworCU1lYXN1cmVSZXBJRS5SZXBvcnRNb2RlLndvcmQgPSBNZWFzdXJlUmVxTW9kZTsKKwlNZWFzdXJlUmVwSUUuUmVwb3J0VHlwZSA9IE1lYXN1cmVSZXFUeXBlOworCUluc2VydE1lYXN1cmVSZXBvcnRJRShwQWQsIChwT3V0QnVmZmVyICsgRnJhbWVMZW4pLCAmRnJhbWVMZW4sICZNZWFzdXJlUmVwSUUsIFJlcG9ydEluZm9MZW4sIHBSZXBvcnRJbmZvKTsKKworCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgUUlEX0FDX0JFLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7CisJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKKworCXJldHVybjsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlQcmVwYXJlIFRQQyBSZXF1ZXN0IGFjdGlvbiBmcmFtZSBhbmQgZW5xdWV1ZSBpdCBpbnRvCisJCW1hbmFnZW1lbnQgcXVldWUgd2FpdGluZyBmb3IgdHJhbnNtaXRpb24uCisKKwlQYXJhbWV0cnM6CisJCTEuIHRoZSBkZXN0aW5hdGlvbiBtYWMgYWRkcmVzcyBvZiB0aGUgZnJhbWUuCisKKwlSZXR1cm4JOiBOb25lLgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgRW5xdWV1ZVRQQ1JlcSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBQVUNIQVIgcERBLAorCUlOIFVDSEFSIERpYWxvZ1Rva2VuKQoreworCVBVQ0hBUiBwT3V0QnVmZmVyID0gTlVMTDsKKwlORElTX1NUQVRVUyBOU3RhdHVzOworCVVMT05HIEZyYW1lTGVuOworCisJSEVBREVSXzgwMl8xMSBBY3RIZHI7CisKKwkvLyBidWlsZCBhY3Rpb24gZnJhbWUgaGVhZGVyLgorCU1ndE1hY0hlYWRlckluaXQocEFkLCAmQWN0SGRyLCBTVUJUWVBFX0FDVElPTiwgMCwgcERBLAorCQkJCQkJcEFkLT5DdXJyZW50QWRkcmVzcyk7CisKKwlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgKFBWT0lEKSZwT3V0QnVmZmVyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKKwlpZihOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcygpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWQgXG4iLCBfX2Z1bmNfXykpOworCQlyZXR1cm47CisJfQorCU5kaXNNb3ZlTWVtb3J5KHBPdXRCdWZmZXIsIChQQ0hBUikmQWN0SGRyLCBzaXplb2YoSEVBREVSXzgwMl8xMSkpOworCUZyYW1lTGVuID0gc2l6ZW9mKEhFQURFUl84MDJfMTEpOworCisJSW5zZXJ0QWN0RmllbGQocEFkLCAocE91dEJ1ZmZlciArIEZyYW1lTGVuKSwgJkZyYW1lTGVuLCBDQVRFR09SWV9TUEVDVFJVTSwgU1BFQ19UUENSUSk7CisKKwkvLyBmaWxsIERpYWxvZyBUb2tlbgorCUluc2VydERpYWxvZ1Rva2VuKHBBZCwgKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiksICZGcmFtZUxlbiwgRGlhbG9nVG9rZW4pOworCisJLy8gSW5zZXJ0IFRQQyBSZXF1ZXN0IElFLgorCUluc2VydFRwY1JlcUlFKHBBZCwgKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiksICZGcmFtZUxlbik7CisKKwlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIFFJRF9BQ19CRSwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOworCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7CisKKwlyZXR1cm47Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJUHJlcGFyZSBUUEMgUmVwb3J0IGFjdGlvbiBmcmFtZSBhbmQgZW5xdWV1ZSBpdCBpbnRvCisJCW1hbmFnZW1lbnQgcXVldWUgd2FpdGluZyBmb3IgdHJhbnNtaXRpb24uCisKKwlQYXJhbWV0cnM6CisJCTEuIHRoZSBkZXN0aW5hdGlvbiBtYWMgYWRkcmVzcyBvZiB0aGUgZnJhbWUuCisKKwlSZXR1cm4JOiBOb25lLgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgRW5xdWV1ZVRQQ1JlcCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBQVUNIQVIgcERBLAorCUlOIFVJTlQ4IERpYWxvZ1Rva2VuLAorCUlOIFVJTlQ4IFR4UHdyLAorCUlOIFVJTlQ4IExpbmtNYXJnaW4pCit7CisJUFVDSEFSIHBPdXRCdWZmZXIgPSBOVUxMOworCU5ESVNfU1RBVFVTIE5TdGF0dXM7CisJVUxPTkcgRnJhbWVMZW47CisKKwlIRUFERVJfODAyXzExIEFjdEhkcjsKKworCS8vIGJ1aWxkIGFjdGlvbiBmcmFtZSBoZWFkZXIuCisJTWd0TWFjSGVhZGVySW5pdChwQWQsICZBY3RIZHIsIFNVQlRZUEVfQUNUSU9OLCAwLCBwREEsCisJCQkJCQlwQWQtPkN1cnJlbnRBZGRyZXNzKTsKKworCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAoUFZPSUQpJnBPdXRCdWZmZXIpOyAgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQorCWlmKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxlZCBcbiIsIF9fZnVuY19fKSk7CisJCXJldHVybjsKKwl9CisJTmRpc01vdmVNZW1vcnkocE91dEJ1ZmZlciwgKFBDSEFSKSZBY3RIZHIsIHNpemVvZihIRUFERVJfODAyXzExKSk7CisJRnJhbWVMZW4gPSBzaXplb2YoSEVBREVSXzgwMl8xMSk7CisKKwlJbnNlcnRBY3RGaWVsZChwQWQsIChwT3V0QnVmZmVyICsgRnJhbWVMZW4pLCAmRnJhbWVMZW4sIENBVEVHT1JZX1NQRUNUUlVNLCBTUEVDX1RQQ1JQKTsKKworCS8vIGZpbGwgRGlhbG9nIFRva2VuCisJSW5zZXJ0RGlhbG9nVG9rZW4ocEFkLCAocE91dEJ1ZmZlciArIEZyYW1lTGVuKSwgJkZyYW1lTGVuLCBEaWFsb2dUb2tlbik7CisKKwkvLyBJbnNlcnQgVFBDIFJlcXVlc3QgSUUuCisJSW5zZXJ0VHBjUmVwb3J0SUUocEFkLCAocE91dEJ1ZmZlciArIEZyYW1lTGVuKSwgJkZyYW1lTGVuLCBUeFB3ciwgTGlua01hcmdpbik7CisKKwlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIFFJRF9BQ19CRSwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOworCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7CisKKwlyZXR1cm47Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJUHJlcGFyZSBDaGFubmVsIFN3aXRjaCBBbm5vdW5jZW1lbnQgYWN0aW9uIGZyYW1lIGFuZCBlbnF1ZXVlIGl0IGludG8KKwkJbWFuYWdlbWVudCBxdWV1ZSB3YWl0aW5nIGZvciB0cmFuc21pdGlvbi4KKworCVBhcmFtZXRyczoKKwkJMS4gdGhlIGRlc3RpbmF0aW9uIG1hYyBhZGRyZXNzIG9mIHRoZSBmcmFtZS4KKwkJMi4gQ2hhbm5lbCBzd2l0Y2ggYW5ub3VuY2VtZW50IG1vZGUuCisJCTIuIGEgTmV3IHNlbGVjdGVkIGNoYW5uZWwuCisKKwlSZXR1cm4JOiBOb25lLgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgRW5xdWV1ZUNoU3dBbm4oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gUFVDSEFSIHBEQSwKKwlJTiBVSU5UOCBDaFN3TW9kZSwKKwlJTiBVSU5UOCBOZXdDaCkKK3sKKwlQVUNIQVIgcE91dEJ1ZmZlciA9IE5VTEw7CisJTkRJU19TVEFUVVMgTlN0YXR1czsKKwlVTE9ORyBGcmFtZUxlbjsKKworCUhFQURFUl84MDJfMTEgQWN0SGRyOworCisJLy8gYnVpbGQgYWN0aW9uIGZyYW1lIGhlYWRlci4KKwlNZ3RNYWNIZWFkZXJJbml0KHBBZCwgJkFjdEhkciwgU1VCVFlQRV9BQ1RJT04sIDAsIHBEQSwKKwkJCQkJCXBBZC0+Q3VycmVudEFkZHJlc3MpOworCisJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsIChQVk9JRCkmcE91dEJ1ZmZlcik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5CisJaWYoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXMoKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkIFxuIiwgX19mdW5jX18pKTsKKwkJcmV0dXJuOworCX0KKwlOZGlzTW92ZU1lbW9yeShwT3V0QnVmZmVyLCAoUENIQVIpJkFjdEhkciwgc2l6ZW9mKEhFQURFUl84MDJfMTEpKTsKKwlGcmFtZUxlbiA9IHNpemVvZihIRUFERVJfODAyXzExKTsKKworCUluc2VydEFjdEZpZWxkKHBBZCwgKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiksICZGcmFtZUxlbiwgQ0FURUdPUllfU1BFQ1RSVU0sIFNQRUNfQ0hBTk5FTF9TV0lUQ0gpOworCisJSW5zZXJ0Q2hTd0FubklFKHBBZCwgKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiksICZGcmFtZUxlbiwgQ2hTd01vZGUsIE5ld0NoLCAwKTsKKworCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgUUlEX0FDX0JFLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7CisJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKKworCXJldHVybjsKK30KKworc3RhdGljIEJPT0xFQU4gRGZzUmVxdWlyZW1lbnRDaGVjaygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVSU5UOCBDaGFubmVsKQoreworCUJPT0xFQU4gUmVzdWx0ID0gRkFMU0U7CisJSU5UIGk7CisKKwlkbworCXsKKwkJLy8gY2hlY2sgREZTIHByb2NlZHVyZSBpcyBydW5uaW5nLgorCQkvLyBtYWtlIHN1cmUgREZTIHByb2NlZHVyZSB3b24ndCBzdGFydCB0d2ljZS4KKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJETW9kZSAhPSBSRF9OT1JNQUxfTU9ERSkKKwkJeworCQkJUmVzdWx0ID0gRkFMU0U7CisJCQlicmVhazsKKwkJfQorCisJCS8vIGNoZWNrIHRoZSBuZXcgY2hhbm5lbCBjYXJyaWVkIGZyb20gQ2hhbm5lbCBTd2l0Y2ggQW5ub3VuY2VtbmV0IGlzIHZhbGlkLgorCQlmb3IgKGk9MDsgaTxwQWQtPkNoYW5uZWxMaXN0TnVtOyBpKyspCisJCXsKKwkJCWlmICgoQ2hhbm5lbCA9PSBwQWQtPkNoYW5uZWxMaXN0W2ldLkNoYW5uZWwpCisJCQkJJiYocEFkLT5DaGFubmVsTGlzdFtpXS5SZW1haW5pbmdUaW1lRm9yVXNlID09IDApKQorCQkJeworCQkJCS8vIGZvdW5kIHJhZGFyIHNpZ25hbCBpbiB0aGUgY2hhbm5lbC4gdGhlIGNoYW5uZWwgY2FuJ3QgdXNlIGF0IGxlYXN0IGZvciAzMCBtaW51dGVzLgorCQkJCXBBZC0+Q2hhbm5lbExpc3RbaV0uUmVtYWluaW5nVGltZUZvclVzZSA9IDE4MDA7Ly8zMCBtaW4gPSAxODAwIHNlYworCQkJCVJlc3VsdCA9IFRSVUU7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9IHdoaWxlKEZBTFNFKTsKKworCXJldHVybiBSZXN1bHQ7Cit9CisKK1ZPSUQgTm90aWZ5Q2hTd0FublRvUGVlckFQcygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBQVUNIQVIgcFJBLAorCUlOIFBVQ0hBUiBwVEEsCisJSU4gVUlOVDggQ2hTd01vZGUsCisJSU4gVUlOVDggQ2hhbm5lbCkKK3sKKyNpZmRlZiBXRFNfU1VQUE9SVAorCWlmICghKChwUkFbMF0gJiAweGZmKSA9PSAweGZmKSkgLy8gaXMgcFJBIGEgYnJvYWRjYXNlIGFkZHJlc3MuCisJeworCQlJTlQgaTsKKwkJLy8gaW5mbyBuZWlnaGJvciBBUHMgdGhhdCBSYWRhciBzaWduYWwgZm91bmQgdGhyb2doIFdEUyBsaW5rLgorCQlmb3IgKGkgPSAwOyBpIDwgTUFYX1dEU19FTlRSWTsgaSsrKQorCQl7CisJCQlpZiAoVmFsaWRXZHNFbnRyeShwQWQsIGkpKQorCQkJeworCQkJCVBVQ0hBUiBwREEgPSBwQWQtPldkc1RhYi5XZHNFbnRyeVtpXS5QZWVyV2RzQWRkcjsKKworCQkJCS8vIERBIGVxdWFsIHRvIFNBLiBoYXZlIG5vIG5lY2Vzc2FyeSBvcmlnbmFsIEFQIHdoaWNoIGZvdW5kIFJhZGFyIHNpZ25hbC4KKwkJCQlpZiAoTUFDX0FERFJfRVFVQUwocFRBLCBwREEpKQorCQkJCQljb250aW51ZTsKKworCQkJCS8vIHNlbmQgQ2hhbm5lbCBTd2l0Y2ggQWN0aW9uIGZyYW1lIHRvIGluZm8gTmVpZ2hicm8gQVBzLgorCQkJCUVucXVldWVDaFN3QW5uKHBBZCwgcERBLCBDaFN3TW9kZSwgQ2hhbm5lbCk7CisJCQl9CisJCX0KKwl9CisjZW5kaWYgLy8gV0RTX1NVUFBPUlQgLy8KK30KKworc3RhdGljIFZPSUQgU3RhcnRERlNQcm9jZWR1cmUoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVUNIQVIgQ2hhbm5lbCwKKwlJTiBVSU5UOCBDaFN3TW9kZSkKK3sKKwkvLyBzdGFydCBERlMgcHJvY2VkdXJlCisJcEFkLT5Db21tb25DZmcuQ2hhbm5lbCA9IENoYW5uZWw7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJTl9DaGFubmVsQ2hlY2socEFkKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5SRE1vZGUgPSBSRF9TV0lUQ0hJTkdfTU9ERTsKKwlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5DU0NvdW50ID0gMDsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlDaGFubmVsIFN3aXRjaCBBbm5vdW5jZW1lbnQgYWN0aW9uIGZyYW1lIHNhbml0eSBjaGVjay4KKworCVBhcmFtZXRyczoKKwkJMS4gTUxNRSBtZXNzYWdlIGNvbnRhaW5pbmcgdGhlIHJlY2VpdmVkIGZyYW1lCisJCTIuIG1lc3NhZ2UgbGVuZ3RoLgorCQkzLiBDaGFubmVsIHN3aXRjaCBhbm5vdW5jZW1lbnQgaW5mb21hdGlvbiBidWZmZXIuCisKKworCVJldHVybgk6IE5vbmUuCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisvKgorICBDaGFubmVsIFN3aXRjaCBBbm5vdW5jZW1lbnQgSUUuCisgICstLS0tKy0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLSsKKyAgfCBJRCB8IExlbiB8Q2ggU3cgTW9kZSB8IE5ldyBDaCBOdW0gfCBDaCBTdyBDbnQgfAorICArLS0tLSstLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rCisgICAgMSAgICAxICAgICAgICAxICAgICAgICAgICAxICAgICAgICAgICAgMQorKi8KK3N0YXRpYyBCT09MRUFOIFBlZXJDaFN3QW5uU2FuaXR5KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFZPSUQgKnBNc2csCisJSU4gVUxPTkcgTXNnTGVuLAorCU9VVCBQQ0hfU1dfQU5OX0lORk8gcENoU3dBbm5JbmZvKQoreworCVBGUkFNRV84MDJfMTEgRnIgPSAoUEZSQU1FXzgwMl8xMSlwTXNnOworCVBVQ0hBUiBwRnJhbWVQdHIgPSBGci0+T2N0ZXQ7CisJQk9PTEVBTiByZXN1bHQgPSBGQUxTRTsKKwlQRUlEX1NUUlVDVCBlaWRfcHRyOworCisJLy8gc2tpcCA4MDIuMTEgaGVhZGVyLgorCU1zZ0xlbiAtPSBzaXplb2YoSEVBREVSXzgwMl8xMSk7CisKKwkvLyBza2lwIGNhdGVnb3J5IGFuZCBhY3Rpb24gY29kZS4KKwlwRnJhbWVQdHIgKz0gMjsKKwlNc2dMZW4gLT0gMjsKKworCWlmIChwQ2hTd0FubkluZm8gPT0gTlVMTCkKKwkJcmV0dXJuIHJlc3VsdDsKKworCWVpZF9wdHIgPSAoUEVJRF9TVFJVQ1QpcEZyYW1lUHRyOworCXdoaWxlICgoKFVDSEFSKillaWRfcHRyICsgZWlkX3B0ci0+TGVuICsgMSkgPCAoKFBVQ0hBUilwRnJhbWVQdHIgKyBNc2dMZW4pKQorCXsKKwkJc3dpdGNoKGVpZF9wdHItPkVpZCkKKwkJeworCQkJY2FzZSBJRV9DSEFOTkVMX1NXSVRDSF9BTk5PVU5DRU1FTlQ6CisJCQkJTmRpc01vdmVNZW1vcnkoJnBDaFN3QW5uSW5mby0+Q2hTd01vZGUsIGVpZF9wdHItPk9jdGV0LCAxKTsKKwkJCQlOZGlzTW92ZU1lbW9yeSgmcENoU3dBbm5JbmZvLT5DaGFubmVsLCBlaWRfcHRyLT5PY3RldCArIDEsIDEpOworCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQ2hTd0FubkluZm8tPkNoU3dDbnQsIGVpZF9wdHItPk9jdGV0ICsgMiwgMSk7CisKKwkJCQlyZXN1bHQgPSBUUlVFOworICAgICAgICAgICAgICAgIGJyZWFrOworCisJCQlkZWZhdWx0OgorCQkJCWJyZWFrOworCQl9CisJCWVpZF9wdHIgPSAoUEVJRF9TVFJVQ1QpKChVQ0hBUiopZWlkX3B0ciArIDIgKyBlaWRfcHRyLT5MZW4pOworCX0KKworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJTWVhc3VyZW1lbnQgcmVxdWVzdCBhY3Rpb24gZnJhbWUgc2FuaXR5IGNoZWNrLgorCisJUGFyYW1ldHJzOgorCQkxLiBNTE1FIG1lc3NhZ2UgY29udGFpbmluZyB0aGUgcmVjZWl2ZWQgZnJhbWUKKwkJMi4gbWVzc2FnZSBsZW5ndGguCisJCTMuIE1lYXN1cmVtZW50IHJlcXVlc3QgaW5mb21hdGlvbiBidWZmZXIuCisKKwlSZXR1cm4JOiBOb25lLgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK3N0YXRpYyBCT09MRUFOIFBlZXJNZWFzdXJlUmVxU2FuaXR5KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFZPSUQgKnBNc2csCisJSU4gVUxPTkcgTXNnTGVuLAorCU9VVCBQVUlOVDggcERpYWxvZ1Rva2VuLAorCU9VVCBQTUVBU1VSRV9SRVFfSU5GTyBwTWVhc3VyZVJlcUluZm8pCit7CisJUEZSQU1FXzgwMl8xMSBGciA9IChQRlJBTUVfODAyXzExKXBNc2c7CisJUFVDSEFSIHBGcmFtZVB0ciA9IEZyLT5PY3RldDsKKwlCT09MRUFOIHJlc3VsdCA9IEZBTFNFOworCVBFSURfU1RSVUNUIGVpZF9wdHI7CisJUFVDSEFSIHB0cjsKKwlVSU5UNjQgTWVhc3VyZVN0YXJ0VGltZTsKKwlVSU5UMTYgTWVhc3VyZUR1cmF0aW9uOworCisJLy8gc2tpcCA4MDIuMTEgaGVhZGVyLgorCU1zZ0xlbiAtPSBzaXplb2YoSEVBREVSXzgwMl8xMSk7CisKKwkvLyBza2lwIGNhdGVnb3J5IGFuZCBhY3Rpb24gY29kZS4KKwlwRnJhbWVQdHIgKz0gMjsKKwlNc2dMZW4gLT0gMjsKKworCWlmIChwTWVhc3VyZVJlcUluZm8gPT0gTlVMTCkKKwkJcmV0dXJuIHJlc3VsdDsKKworCU5kaXNNb3ZlTWVtb3J5KHBEaWFsb2dUb2tlbiwgcEZyYW1lUHRyLCAxKTsKKwlwRnJhbWVQdHIgKz0gMTsKKwlNc2dMZW4gLT0gMTsKKworCWVpZF9wdHIgPSAoUEVJRF9TVFJVQ1QpcEZyYW1lUHRyOworCXdoaWxlICgoKFVDSEFSKillaWRfcHRyICsgZWlkX3B0ci0+TGVuICsgMSkgPCAoKFBVQ0hBUilwRnJhbWVQdHIgKyBNc2dMZW4pKQorCXsKKwkJc3dpdGNoKGVpZF9wdHItPkVpZCkKKwkJeworCQkJY2FzZSBJRV9NRUFTVVJFTUVOVF9SRVFVRVNUOgorCQkJCU5kaXNNb3ZlTWVtb3J5KCZwTWVhc3VyZVJlcUluZm8tPlRva2VuLCBlaWRfcHRyLT5PY3RldCwgMSk7CisJCQkJTmRpc01vdmVNZW1vcnkoJnBNZWFzdXJlUmVxSW5mby0+UmVxTW9kZS53b3JkLCBlaWRfcHRyLT5PY3RldCArIDEsIDEpOworCQkJCU5kaXNNb3ZlTWVtb3J5KCZwTWVhc3VyZVJlcUluZm8tPlJlcVR5cGUsIGVpZF9wdHItPk9jdGV0ICsgMiwgMSk7CisJCQkJcHRyID0gZWlkX3B0ci0+T2N0ZXQgKyAzOworCQkJCU5kaXNNb3ZlTWVtb3J5KCZwTWVhc3VyZVJlcUluZm8tPk1lYXN1cmVSZXEuQ2hOdW0sIHB0ciwgMSk7CisJCQkJTmRpc01vdmVNZW1vcnkoJk1lYXN1cmVTdGFydFRpbWUsIHB0ciArIDEsIDgpOworCQkJCXBNZWFzdXJlUmVxSW5mby0+TWVhc3VyZVJlcS5NZWFzdXJlU3RhcnRUaW1lID0gU1dBUDY0KE1lYXN1cmVTdGFydFRpbWUpOworCQkJCU5kaXNNb3ZlTWVtb3J5KCZNZWFzdXJlRHVyYXRpb24sIHB0ciArIDksIDIpOworCQkJCXBNZWFzdXJlUmVxSW5mby0+TWVhc3VyZVJlcS5NZWFzdXJlRHVyYXRpb24gPSBTV0FQMTYoTWVhc3VyZUR1cmF0aW9uKTsKKworCQkJCXJlc3VsdCA9IFRSVUU7CisJCQkJYnJlYWs7CisKKwkJCWRlZmF1bHQ6CisJCQkJYnJlYWs7CisJCX0KKwkJZWlkX3B0ciA9IChQRUlEX1NUUlVDVCkoKFVDSEFSKillaWRfcHRyICsgMiArIGVpZF9wdHItPkxlbik7CisJfQorCisJcmV0dXJuIHJlc3VsdDsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlNZWFzdXJlbWVudCByZXBvcnQgYWN0aW9uIGZyYW1lIHNhbml0eSBjaGVjay4KKworCVBhcmFtZXRyczoKKwkJMS4gTUxNRSBtZXNzYWdlIGNvbnRhaW5pbmcgdGhlIHJlY2VpdmVkIGZyYW1lCisJCTIuIG1lc3NhZ2UgbGVuZ3RoLgorCQkzLiBNZWFzdXJlbWVudCByZXBvcnQgaW5mb21hdGlvbiBidWZmZXIuCisJCTQuIGJhc2ljIHJlcG9ydCBpbmZvbWF0aW9uIGJ1ZmZlci4KKworCVJldHVybgk6IE5vbmUuCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisvKgorICBNZWFzdXJlbWVudCBSZXBvcnQgSUUuCisgICstLS0tKy0tLS0tKy0tLS0tLS0rLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKworICB8IElEIHwgTGVuIHwgVG9rZW4gfCBSZXBvcnQgTW9kZSB8IE1lYXN1cmUgVHlwZSB8IE1lYXN1cmUgUmVwb3J0IHwKKyAgKy0tLS0rLS0tLS0rLS0tLS0tLSstLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisgICAgMSAgICAgMSAgICAgIDEgICAgICAgICAgMSAgICAgICAgICAgICAxICAgICAgICAgICAgdmFyaWFibGUKKworICBCYXNpYyBSZXBvcnQuCisgICstLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLSstLS0tLSsKKyAgfCBDaCBOdW0gfCBTdGFydCBUaW1lIHwgRHVyYXRpb24gfCBNYXAgfAorICArLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0rLS0tLS0rCisgICAgICAxICAgICAgICAgIDggICAgICAgICAgIDIgICAgICAgIDEKKworICBNYXAgRmllbGQgQml0IEZvcm1hdC4KKyAgKy0tLS0tKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLSsKKyAgfCBCc3MgfCBPRkRNIFByZWFtYmxlIHwgVW5pZGVudGlmaWVkIHNpZ25hbCB8IFJhZGFyIHwgVW5tZWFzdXJlZCB8IFJlc2VydmVkIHwKKyAgKy0tLS0tKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLSsKKyAgICAgMCAgICAgICAgICAxICAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgMyAgICAgICAgIDQgICAgICAgICAgNS03CisqLworc3RhdGljIEJPT0xFQU4gUGVlck1lYXN1cmVSZXBvcnRTYW5pdHkoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVk9JRCAqcE1zZywKKwlJTiBVTE9ORyBNc2dMZW4sCisJT1VUIFBVSU5UOCBwRGlhbG9nVG9rZW4sCisJT1VUIFBNRUFTVVJFX1JFUE9SVF9JTkZPIHBNZWFzdXJlUmVwb3J0SW5mbywKKwlPVVQgUFVJTlQ4IHBSZXBvcnRCdWYpCit7CisJUEZSQU1FXzgwMl8xMSBGciA9IChQRlJBTUVfODAyXzExKXBNc2c7CisJUFVDSEFSIHBGcmFtZVB0ciA9IEZyLT5PY3RldDsKKwlCT09MRUFOIHJlc3VsdCA9IEZBTFNFOworCVBFSURfU1RSVUNUIGVpZF9wdHI7CisJUFVDSEFSIHB0cjsKKworCS8vIHNraXAgODAyLjExIGhlYWRlci4KKwlNc2dMZW4gLT0gc2l6ZW9mKEhFQURFUl84MDJfMTEpOworCisJLy8gc2tpcCBjYXRlZ29yeSBhbmQgYWN0aW9uIGNvZGUuCisJcEZyYW1lUHRyICs9IDI7CisJTXNnTGVuIC09IDI7CisKKwlpZiAocE1lYXN1cmVSZXBvcnRJbmZvID09IE5VTEwpCisJCXJldHVybiByZXN1bHQ7CisKKwlOZGlzTW92ZU1lbW9yeShwRGlhbG9nVG9rZW4sIHBGcmFtZVB0ciwgMSk7CisJcEZyYW1lUHRyICs9IDE7CisJTXNnTGVuIC09IDE7CisKKwllaWRfcHRyID0gKFBFSURfU1RSVUNUKXBGcmFtZVB0cjsKKwl3aGlsZSAoKChVQ0hBUiopZWlkX3B0ciArIGVpZF9wdHItPkxlbiArIDEpIDwgKChQVUNIQVIpcEZyYW1lUHRyICsgTXNnTGVuKSkKKwl7CisJCXN3aXRjaChlaWRfcHRyLT5FaWQpCisJCXsKKwkJCWNhc2UgSUVfTUVBU1VSRU1FTlRfUkVQT1JUOgorCQkJCU5kaXNNb3ZlTWVtb3J5KCZwTWVhc3VyZVJlcG9ydEluZm8tPlRva2VuLCBlaWRfcHRyLT5PY3RldCwgMSk7CisJCQkJTmRpc01vdmVNZW1vcnkoJnBNZWFzdXJlUmVwb3J0SW5mby0+UmVwb3J0TW9kZSwgZWlkX3B0ci0+T2N0ZXQgKyAxLCAxKTsKKwkJCQlOZGlzTW92ZU1lbW9yeSgmcE1lYXN1cmVSZXBvcnRJbmZvLT5SZXBvcnRUeXBlLCBlaWRfcHRyLT5PY3RldCArIDIsIDEpOworCQkJCWlmIChwTWVhc3VyZVJlcG9ydEluZm8tPlJlcG9ydFR5cGUgPT0gUk1fQkFTSUMpCisJCQkJeworCQkJCQlQTUVBU1VSRV9CQVNJQ19SRVBPUlQgcFJlcG9ydCA9IChQTUVBU1VSRV9CQVNJQ19SRVBPUlQpcFJlcG9ydEJ1ZjsKKwkJCQkJcHRyID0gZWlkX3B0ci0+T2N0ZXQgKyAzOworCQkJCQlOZGlzTW92ZU1lbW9yeSgmcFJlcG9ydC0+Q2hOdW0sIHB0ciwgMSk7CisJCQkJCU5kaXNNb3ZlTWVtb3J5KCZwUmVwb3J0LT5NZWFzdXJlU3RhcnRUaW1lLCBwdHIgKyAxLCA4KTsKKwkJCQkJTmRpc01vdmVNZW1vcnkoJnBSZXBvcnQtPk1lYXN1cmVEdXJhdGlvbiwgcHRyICsgOSwgMik7CisJCQkJCU5kaXNNb3ZlTWVtb3J5KCZwUmVwb3J0LT5NYXAsIHB0ciArIDExLCAxKTsKKworCQkJCX0KKwkJCQllbHNlIGlmIChwTWVhc3VyZVJlcG9ydEluZm8tPlJlcG9ydFR5cGUgPT0gUk1fQ0NBKQorCQkJCXsKKwkJCQkJUE1FQVNVUkVfQ0NBX1JFUE9SVCBwUmVwb3J0ID0gKFBNRUFTVVJFX0NDQV9SRVBPUlQpcFJlcG9ydEJ1ZjsKKwkJCQkJcHRyID0gZWlkX3B0ci0+T2N0ZXQgKyAzOworCQkJCQlOZGlzTW92ZU1lbW9yeSgmcFJlcG9ydC0+Q2hOdW0sIHB0ciwgMSk7CisJCQkJCU5kaXNNb3ZlTWVtb3J5KCZwUmVwb3J0LT5NZWFzdXJlU3RhcnRUaW1lLCBwdHIgKyAxLCA4KTsKKwkJCQkJTmRpc01vdmVNZW1vcnkoJnBSZXBvcnQtPk1lYXN1cmVEdXJhdGlvbiwgcHRyICsgOSwgMik7CisJCQkJCU5kaXNNb3ZlTWVtb3J5KCZwUmVwb3J0LT5DQ0FfQnVzeV9GcmFjdGlvbiwgcHRyICsgMTEsIDEpOworCisJCQkJfQorCQkJCWVsc2UgaWYgKHBNZWFzdXJlUmVwb3J0SW5mby0+UmVwb3J0VHlwZSA9PSBSTV9SUElfSElTVE9HUkFNKQorCQkJCXsKKwkJCQkJUE1FQVNVUkVfUlBJX1JFUE9SVCBwUmVwb3J0ID0gKFBNRUFTVVJFX1JQSV9SRVBPUlQpcFJlcG9ydEJ1ZjsKKwkJCQkJcHRyID0gZWlkX3B0ci0+T2N0ZXQgKyAzOworCQkJCQlOZGlzTW92ZU1lbW9yeSgmcFJlcG9ydC0+Q2hOdW0sIHB0ciwgMSk7CisJCQkJCU5kaXNNb3ZlTWVtb3J5KCZwUmVwb3J0LT5NZWFzdXJlU3RhcnRUaW1lLCBwdHIgKyAxLCA4KTsKKwkJCQkJTmRpc01vdmVNZW1vcnkoJnBSZXBvcnQtPk1lYXN1cmVEdXJhdGlvbiwgcHRyICsgOSwgMik7CisJCQkJCU5kaXNNb3ZlTWVtb3J5KCZwUmVwb3J0LT5SUElfRGVuc2l0eSwgcHRyICsgMTEsIDgpOworCQkJCX0KKwkJCQlyZXN1bHQgPSBUUlVFOworICAgICAgICAgICAgICAgIGJyZWFrOworCisJCQlkZWZhdWx0OgorCQkJCWJyZWFrOworCQl9CisJCWVpZF9wdHIgPSAoUEVJRF9TVFJVQ1QpKChVQ0hBUiopZWlkX3B0ciArIDIgKyBlaWRfcHRyLT5MZW4pOworCX0KKworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJVFBDIFJlcXVlc3QgYWN0aW9uIGZyYW1lIHNhbml0eSBjaGVjay4KKworCVBhcmFtZXRyczoKKwkJMS4gTUxNRSBtZXNzYWdlIGNvbnRhaW5pbmcgdGhlIHJlY2VpdmVkIGZyYW1lCisJCTIuIG1lc3NhZ2UgbGVuZ3RoLgorCQkzLiBEaWFsb2cgVG9rZW4uCisKKwlSZXR1cm4JOiBOb25lLgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK3N0YXRpYyBCT09MRUFOIFBlZXJUcGNSZXFTYW5pdHkoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVk9JRCAqcE1zZywKKwlJTiBVTE9ORyBNc2dMZW4sCisJT1VUIFBVSU5UOCBwRGlhbG9nVG9rZW4pCit7CisJUEZSQU1FXzgwMl8xMSBGciA9IChQRlJBTUVfODAyXzExKXBNc2c7CisJUFVDSEFSIHBGcmFtZVB0ciA9IEZyLT5PY3RldDsKKwlCT09MRUFOIHJlc3VsdCA9IEZBTFNFOworCVBFSURfU1RSVUNUIGVpZF9wdHI7CisKKwlNc2dMZW4gLT0gc2l6ZW9mKEhFQURFUl84MDJfMTEpOworCisJLy8gc2tpcCBjYXRlZ29yeSBhbmQgYWN0aW9uIGNvZGUuCisJcEZyYW1lUHRyICs9IDI7CisJTXNnTGVuIC09IDI7CisKKwlpZiAocERpYWxvZ1Rva2VuID09IE5VTEwpCisJCXJldHVybiByZXN1bHQ7CisKKwlOZGlzTW92ZU1lbW9yeShwRGlhbG9nVG9rZW4sIHBGcmFtZVB0ciwgMSk7CisJcEZyYW1lUHRyICs9IDE7CisJTXNnTGVuIC09IDE7CisKKwllaWRfcHRyID0gKFBFSURfU1RSVUNUKXBGcmFtZVB0cjsKKwl3aGlsZSAoKChVQ0hBUiopZWlkX3B0ciArIGVpZF9wdHItPkxlbiArIDEpIDwgKChQVUNIQVIpcEZyYW1lUHRyICsgTXNnTGVuKSkKKwl7CisJCXN3aXRjaChlaWRfcHRyLT5FaWQpCisJCXsKKwkJCWNhc2UgSUVfVFBDX1JFUVVFU1Q6CisJCQkJcmVzdWx0ID0gVFJVRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworCQkJZGVmYXVsdDoKKwkJCQlicmVhazsKKwkJfQorCQllaWRfcHRyID0gKFBFSURfU1RSVUNUKSgoVUNIQVIqKWVpZF9wdHIgKyAyICsgZWlkX3B0ci0+TGVuKTsKKwl9CisKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVRQQyBSZXBvcnQgYWN0aW9uIGZyYW1lIHNhbml0eSBjaGVjay4KKworCVBhcmFtZXRyczoKKwkJMS4gTUxNRSBtZXNzYWdlIGNvbnRhaW5pbmcgdGhlIHJlY2VpdmVkIGZyYW1lCisJCTIuIG1lc3NhZ2UgbGVuZ3RoLgorCQkzLiBEaWFsb2cgVG9rZW4uCisJCTQuIFRQQyBSZXBvcnQgSUUuCisKKwlSZXR1cm4JOiBOb25lLgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK3N0YXRpYyBCT09MRUFOIFBlZXJUcGNSZXBTYW5pdHkoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVk9JRCAqcE1zZywKKwlJTiBVTE9ORyBNc2dMZW4sCisJT1VUIFBVSU5UOCBwRGlhbG9nVG9rZW4sCisJT1VUIFBUUENfUkVQT1JUX0lORk8gcFRwY1JlcEluZm8pCit7CisJUEZSQU1FXzgwMl8xMSBGciA9IChQRlJBTUVfODAyXzExKXBNc2c7CisJUFVDSEFSIHBGcmFtZVB0ciA9IEZyLT5PY3RldDsKKwlCT09MRUFOIHJlc3VsdCA9IEZBTFNFOworCVBFSURfU1RSVUNUIGVpZF9wdHI7CisKKwlNc2dMZW4gLT0gc2l6ZW9mKEhFQURFUl84MDJfMTEpOworCisJLy8gc2tpcCBjYXRlZ29yeSBhbmQgYWN0aW9uIGNvZGUuCisJcEZyYW1lUHRyICs9IDI7CisJTXNnTGVuIC09IDI7CisKKwlpZiAocERpYWxvZ1Rva2VuID09IE5VTEwpCisJCXJldHVybiByZXN1bHQ7CisKKwlOZGlzTW92ZU1lbW9yeShwRGlhbG9nVG9rZW4sIHBGcmFtZVB0ciwgMSk7CisJcEZyYW1lUHRyICs9IDE7CisJTXNnTGVuIC09IDE7CisKKwllaWRfcHRyID0gKFBFSURfU1RSVUNUKXBGcmFtZVB0cjsKKwl3aGlsZSAoKChVQ0hBUiopZWlkX3B0ciArIGVpZF9wdHItPkxlbiArIDEpIDwgKChQVUNIQVIpcEZyYW1lUHRyICsgTXNnTGVuKSkKKwl7CisJCXN3aXRjaChlaWRfcHRyLT5FaWQpCisJCXsKKwkJCWNhc2UgSUVfVFBDX1JFUE9SVDoKKwkJCQlOZGlzTW92ZU1lbW9yeSgmcFRwY1JlcEluZm8tPlR4UHdyLCBlaWRfcHRyLT5PY3RldCwgMSk7CisJCQkJTmRpc01vdmVNZW1vcnkoJnBUcGNSZXBJbmZvLT5MaW5rTWFyZ2luLCBlaWRfcHRyLT5PY3RldCArIDEsIDEpOworCQkJCXJlc3VsdCA9IFRSVUU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKwkJCWRlZmF1bHQ6CisJCQkJYnJlYWs7CisJCX0KKwkJZWlkX3B0ciA9IChQRUlEX1NUUlVDVCkoKFVDSEFSKillaWRfcHRyICsgMiArIGVpZF9wdHItPkxlbik7CisJfQorCisJcmV0dXJuIHJlc3VsdDsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlDaGFubmVsIFN3aXRjaCBBbm5vdW5jZW1lbnQgYWN0aW9uIGZyYW1lIGhhbmRsZXIuCisKKwlQYXJhbWV0cnM6CisJCUVsbWUgLSBNTE1FIG1lc3NhZ2UgY29udGFpbmluZyB0aGUgcmVjZWl2ZWQgZnJhbWUKKworCVJldHVybgk6IE5vbmUuCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworc3RhdGljIFZPSUQgUGVlckNoU3dBbm5BY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCUNIX1NXX0FOTl9JTkZPIENoU3dBbm5JbmZvOworCVBGUkFNRV84MDJfMTEgcEZyID0gKFBGUkFNRV84MDJfMTEpRWxlbS0+TXNnOworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCVVDSEFSIGluZGV4ID0gMCwgQ2hhbm5lbCA9IDAsIE5ld0NoYW5uZWwgPSAwOworCVVMT05HIEJzc2lkeCA9IDA7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlOZGlzWmVyb01lbW9yeSgmQ2hTd0FubkluZm8sIHNpemVvZihDSF9TV19BTk5fSU5GTykpOworCWlmICghIFBlZXJDaFN3QW5uU2FuaXR5KHBBZCwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4sICZDaFN3QW5uSW5mbykpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJbnZhbGlkIENoYW5uZWwgU3dpdGNoIEFjdGlvbiBGcmFtZS5cbiIpKTsKKwkJcmV0dXJuOworCX0KKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJaWYgKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpCisJeworCQlCc3NpZHggPSBCc3NUYWJsZVNlYXJjaCgmcEFkLT5TY2FuVGFiLCBwRnItPkhkci5BZGRyMywgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCk7CisJCWlmIChCc3NpZHggPT0gQlNTX05PVF9GT1VORCkKKwkJeworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGVlckNoU3dBbm5BY3Rpb24gLSBCc3NpZHggaXMgbm90IGZvdW5kXG4iKSk7CisJCQlyZXR1cm47CisJCX0KKworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJcbioqKipCc3NpZHggaXMgJWQsIENoYW5uZWwgPSAlZFxuIiwgaW5kZXgsIHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NpZHhdLkNoYW5uZWwpKTsKKwkJaGV4X2R1bXAoIlNTSUQiLHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NpZHhdLkJzc2lkICw2KTsKKworCQlDaGFubmVsID0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbDsKKwkJTmV3Q2hhbm5lbCA9IENoU3dBbm5JbmZvLkNoYW5uZWw7CisKKwkJaWYgKChwQWQtPkNvbW1vbkNmZy5iSUVFRTgwMjExSCA9PSAxKSAmJiAoTmV3Q2hhbm5lbCAhPSAwKSAmJiAoQ2hhbm5lbCAhPSBOZXdDaGFubmVsKSkKKwkJeworCQkJLy8gU3dpdGNoaW5nIHRvIGNoYW5uZWwgMSBjYW4gcHJldmVudCBmcm9tIHJlc2Nhbm5pbmcgdGhlIGN1cnJlbnQgY2hhbm5lbCBpbW1lZGlhdGVseSAoYnkgYXV0byByZWNvbm5lY3Rpb24pLgorCQkJLy8gSW4gYWRkaXRpb24sIGNsZWFyIHRoZSBNTE1FIHF1ZXVlIGFuZCB0aGUgc2NhbiB0YWJsZSB0byBkaXNjYXJkIHRoZSBSWCBwYWNrZXRzIGFuZCBwcmV2aW91cyBzY2FubmluZyByZXN1bHRzLgorCQkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCAxLCBGQUxTRSk7CisJCQlBc2ljTG9ja0NoYW5uZWwocEFkLCAxKTsKKwkJICAgIExpbmtEb3duKHBBZCwgRkFMU0UpOworCQkJTWxtZVF1ZXVlSW5pdCgmcEFkLT5NbG1lLlF1ZXVlKTsKKwkJCUJzc1RhYmxlSW5pdCgmcEFkLT5TY2FuVGFiKTsKKwkJICAgIFJUTVB1c2VjRGVsYXkoMTAwMDAwMCk7CQkvLyB1c2UgZGVsYXkgdG8gcHJldmVudCBTVEEgZG8gcmVhc3NvYworCisJCQkvLyBjaGFubmVsIHNhbml0eSBjaGVjaworCQkJZm9yIChpbmRleCA9IDAgOyBpbmRleCA8IHBBZC0+Q2hhbm5lbExpc3ROdW07IGluZGV4KyspCisJCQl7CisJCQkJaWYgKHBBZC0+Q2hhbm5lbExpc3RbaW5kZXhdLkNoYW5uZWwgPT0gTmV3Q2hhbm5lbCkKKwkJCQl7CisJCQkJCXBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NpZHhdLkNoYW5uZWwgPSBOZXdDaGFubmVsOworCQkJCQlwQWQtPkNvbW1vbkNmZy5DaGFubmVsID0gTmV3Q2hhbm5lbDsKKwkJCQkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsLCBGQUxTRSk7CisJCQkJCUFzaWNMb2NrQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpOworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCImJiYmJiYmJiYmJiYmJiYmUGVlckNoU3dBbm5BY3Rpb24gLSBTVEEgcmVjZWl2ZSBjaGFubmVsIHN3aXRjaCBhbm5vdW5jZW1lbnQgSUUgKE5ldyBDaGFubmVsID0lZClcbiIsIE5ld0NoYW5uZWwpKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCisJCQlpZiAoaW5kZXggPj0gcEFkLT5DaGFubmVsTGlzdE51bSkKKwkJCXsKKwkJCQlEQkdQUklOVF9FUlIoKCImJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJlBlZXJDaFN3QW5uQWN0aW9uKGNhbiBub3QgZmluZCBOZXcgQ2hhbm5lbD0lZCBpbiBDaGFubmVsTGlzdFslZF1cbiIsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwsIHBBZC0+Q2hhbm5lbExpc3ROdW0pKTsKKwkJCX0KKwkJfQorCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCXJldHVybjsKK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCU1lYXN1cmVtZW50IFJlcXVlc3QgYWN0aW9uIGZyYW1lIGhhbmRsZXIuCisKKwlQYXJhbWV0cnM6CisJCUVsbWUgLSBNTE1FIG1lc3NhZ2UgY29udGFpbmluZyB0aGUgcmVjZWl2ZWQgZnJhbWUKKworCVJldHVybgk6IE5vbmUuCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworc3RhdGljIFZPSUQgUGVlck1lYXN1cmVSZXFBY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCVBGUkFNRV84MDJfMTEgcEZyID0gKFBGUkFNRV84MDJfMTEpRWxlbS0+TXNnOworCVVJTlQ4IERpYWxvZ1Rva2VuOworCU1FQVNVUkVfUkVRX0lORk8gTWVhc3VyZVJlcUluZm87CisJTUVBU1VSRV9SRVBPUlRfTU9ERSBSZXBvcnRNb2RlOworCisJaWYoUGVlck1lYXN1cmVSZXFTYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbiwgJkRpYWxvZ1Rva2VuLCAmTWVhc3VyZVJlcUluZm8pKQorCXsKKwkJUmVwb3J0TW9kZS53b3JkID0gMDsKKwkJUmVwb3J0TW9kZS5maWVsZC5JbmNhcGFibGUgPSAxOworCQlFbnF1ZXVlTWVhc3VyZW1lbnRSZXAocEFkLCBwRnItPkhkci5BZGRyMiwgRGlhbG9nVG9rZW4sIE1lYXN1cmVSZXFJbmZvLlRva2VuLCBSZXBvcnRNb2RlLndvcmQsIE1lYXN1cmVSZXFJbmZvLlJlcVR5cGUsIDAsIE5VTEwpOworCX0KKworCXJldHVybjsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlNZWFzdXJlbWVudCBSZXBvcnQgYWN0aW9uIGZyYW1lIGhhbmRsZXIuCisKKwlQYXJhbWV0cnM6CisJCUVsbWUgLSBNTE1FIG1lc3NhZ2UgY29udGFpbmluZyB0aGUgcmVjZWl2ZWQgZnJhbWUKKworCVJldHVybgk6IE5vbmUuCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworc3RhdGljIFZPSUQgUGVlck1lYXN1cmVSZXBvcnRBY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCU1FQVNVUkVfUkVQT1JUX0lORk8gTWVhc3VyZVJlcG9ydEluZm87CisJUEZSQU1FXzgwMl8xMSBwRnIgPSAoUEZSQU1FXzgwMl8xMSlFbGVtLT5Nc2c7CisJVUlOVDggRGlhbG9nVG9rZW47CisJUFVJTlQ4IHBNZWFzdXJlUmVwb3J0SW5mbzsKKworLy8JaWYgKHBBZC0+Q29tbW9uQ2ZnLmJJRUVFODAyMTFIICE9IFRSVUUpCisvLwkJcmV0dXJuOworCisJaWYgKChwTWVhc3VyZVJlcG9ydEluZm8gPSBrbWFsbG9jKHNpemVvZihNRUFTVVJFX1JQSV9SRVBPUlQpLCBHRlBfQVRPTUlDKSkgPT0gTlVMTCkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzIHVuYWJsZSB0byBhbGxvYyBtZW1vcnkgZm9yIG1lYXN1cmUgcmVwb3J0IGJ1ZmZlciAoc2l6ZT0lZCkuXG4iLCBfX2Z1bmNfXywgc2l6ZW9mKE1FQVNVUkVfUlBJX1JFUE9SVCkpKTsKKwkJcmV0dXJuOworCX0KKworCU5kaXNaZXJvTWVtb3J5KCZNZWFzdXJlUmVwb3J0SW5mbywgc2l6ZW9mKE1FQVNVUkVfUkVQT1JUX0lORk8pKTsKKwlOZGlzWmVyb01lbW9yeShwTWVhc3VyZVJlcG9ydEluZm8sIHNpemVvZihNRUFTVVJFX1JQSV9SRVBPUlQpKTsKKwlpZiAoUGVlck1lYXN1cmVSZXBvcnRTYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbiwgJkRpYWxvZ1Rva2VuLCAmTWVhc3VyZVJlcG9ydEluZm8sIHBNZWFzdXJlUmVwb3J0SW5mbykpCisJeworCQlkbyB7CisJCQlQTUVBU1VSRV9SRVFfRU5UUlkgcEVudHJ5ID0gTlVMTDsKKworCQkJLy8gTm90IGEgYXV0b25vbW91cyBtZWFzdXJlIHJlcG9ydC4KKwkJCS8vIGNoZWNrIHRoZSBkaWFsb2cgdG9rZW4gZmllbGQuIGRyb3AgaXQgaWYgdGhlIGRpYWxvZyB0b2tlbiBkb2Vzbid0IG1hdGNoLgorCQkJaWYgKChEaWFsb2dUb2tlbiAhPSAwKQorCQkJCSYmICgocEVudHJ5ID0gTWVhc3VyZVJlcUxvb2tVcChwQWQsIERpYWxvZ1Rva2VuKSkgPT0gTlVMTCkpCisJCQkJYnJlYWs7CisKKwkJCWlmIChwRW50cnkgIT0gTlVMTCkKKwkJCQlNZWFzdXJlUmVxRGVsZXRlKHBBZCwgcEVudHJ5LT5EaWFsb2dUb2tlbik7CisKKwkJCWlmIChNZWFzdXJlUmVwb3J0SW5mby5SZXBvcnRUeXBlID09IFJNX0JBU0lDKQorCQkJeworCQkJCVBNRUFTVVJFX0JBU0lDX1JFUE9SVCBwQmFzaWNSZXBvcnQgPSAoUE1FQVNVUkVfQkFTSUNfUkVQT1JUKXBNZWFzdXJlUmVwb3J0SW5mbzsKKwkJCQlpZiAoKHBCYXNpY1JlcG9ydC0+TWFwLmZpZWxkLlJhZGFyKQorCQkJCQkmJiAoRGZzUmVxdWlyZW1lbnRDaGVjayhwQWQsIHBCYXNpY1JlcG9ydC0+Q2hOdW0pID09IFRSVUUpKQorCQkJCXsKKwkJCQkJTm90aWZ5Q2hTd0FublRvUGVlckFQcyhwQWQsIHBGci0+SGRyLkFkZHIxLCBwRnItPkhkci5BZGRyMiwgMSwgcEJhc2ljUmVwb3J0LT5DaE51bSk7CisJCQkJCVN0YXJ0REZTUHJvY2VkdXJlKHBBZCwgcEJhc2ljUmVwb3J0LT5DaE51bSwgMSk7CisJCQkJfQorCQkJfQorCQl9IHdoaWxlIChGQUxTRSk7CisJfQorCWVsc2UKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSW52YWxpZCBNZWFzdXJlbWVudCBSZXBvcnQgRnJhbWUuXG4iKSk7CisKKwlrZnJlZShwTWVhc3VyZVJlcG9ydEluZm8pOworCisJcmV0dXJuOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVRQQyBSZXF1ZXN0IGFjdGlvbiBmcmFtZSBoYW5kbGVyLgorCisJUGFyYW1ldHJzOgorCQlFbG1lIC0gTUxNRSBtZXNzYWdlIGNvbnRhaW5pbmcgdGhlIHJlY2VpdmVkIGZyYW1lCisKKwlSZXR1cm4JOiBOb25lLgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK3N0YXRpYyBWT0lEIFBlZXJUcGNSZXFBY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCVBGUkFNRV84MDJfMTEgcEZyID0gKFBGUkFNRV84MDJfMTEpRWxlbS0+TXNnOworCVBVQ0hBUiBwRnJhbWVQdHIgPSBwRnItPk9jdGV0OworCVVJTlQ4IERpYWxvZ1Rva2VuOworCVVJTlQ4IFR4UHdyID0gR2V0Q3VyVHhQd3IocEFkLCBFbGVtLT5XY2lkKTsKKwlVSU5UOCBMaW5rTWFyZ2luID0gMDsKKwlDSEFSIFJlYWxSc3NpOworCisJLy8gbGluayBtYXJnaW46IFJhdGlvIG9mIHRoZSByZWNlaXZlZCBzaWduYWwgcG93ZXIgdG8gdGhlIG1pbmltdW0gZGVzaXJlZCBieSB0aGUgc3RhdGlvbiAoU1RBKS4gVGhlCisJLy8JCQkJU1RBIG1heSBpbmNvcnBvcmF0ZSByYXRlIGluZm9ybWF0aW9uIGFuZCBjaGFubmVsIGNvbmRpdGlvbnMsIGluY2x1ZGluZyBpbnRlcmZlcmVuY2UsIGludG8gaXRzIGNvbXB1dGF0aW9uCisJLy8JCQkJb2YgbGluayBtYXJnaW4uCisKKwlSZWFsUnNzaSA9IFJUTVBNYXhSc3NpKHBBZCwgQ29udmVydFRvUnNzaShwQWQsIEVsZW0tPlJzc2kwLCBSU1NJXzApLAorCQkJCQkJCQlDb252ZXJ0VG9Sc3NpKHBBZCwgRWxlbS0+UnNzaTEsIFJTU0lfMSksCisJCQkJCQkJCUNvbnZlcnRUb1Jzc2kocEFkLCBFbGVtLT5Sc3NpMiwgUlNTSV8yKSk7CisKKwkvLyBza2lwIENhdGVnb3J5IGFuZCBhY3Rpb24gY29kZS4KKwlwRnJhbWVQdHIgKz0gMjsKKworCS8vIERpYWxvZyB0b2tlbi4KKwlOZGlzTW92ZU1lbW9yeSgmRGlhbG9nVG9rZW4sIHBGcmFtZVB0ciwgMSk7CisKKwlMaW5rTWFyZ2luID0gKFJlYWxSc3NpIC8gTUlOX1JDVl9QV1IpOworCWlmIChQZWVyVHBjUmVxU2FuaXR5KHBBZCwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4sICZEaWFsb2dUb2tlbikpCisJCUVucXVldWVUUENSZXAocEFkLCBwRnItPkhkci5BZGRyMiwgRGlhbG9nVG9rZW4sIFR4UHdyLCBMaW5rTWFyZ2luKTsKKworCXJldHVybjsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlUUEMgUmVwb3J0IGFjdGlvbiBmcmFtZSBoYW5kbGVyLgorCisJUGFyYW1ldHJzOgorCQlFbG1lIC0gTUxNRSBtZXNzYWdlIGNvbnRhaW5pbmcgdGhlIHJlY2VpdmVkIGZyYW1lCisKKwlSZXR1cm4JOiBOb25lLgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK3N0YXRpYyBWT0lEIFBlZXJUcGNSZXBBY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCVVJTlQ4IERpYWxvZ1Rva2VuOworCVRQQ19SRVBPUlRfSU5GTyBUcGNSZXBJbmZvOworCVBUUENfUkVRX0VOVFJZIHBFbnRyeSA9IE5VTEw7CisKKwlOZGlzWmVyb01lbW9yeSgmVHBjUmVwSW5mbywgc2l6ZW9mKFRQQ19SRVBPUlRfSU5GTykpOworCWlmIChQZWVyVHBjUmVwU2FuaXR5KHBBZCwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4sICZEaWFsb2dUb2tlbiwgJlRwY1JlcEluZm8pKQorCXsKKwkJaWYgKChwRW50cnkgPSBUcGNSZXFMb29rVXAocEFkLCBEaWFsb2dUb2tlbikpICE9IE5VTEwpCisJCXsKKwkJCVRwY1JlcURlbGV0ZShwQWQsIHBFbnRyeS0+RGlhbG9nVG9rZW4pOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6IERpYWxvZ1Rva2VuPSV4LCBUeFB3cj0lZCwgTGlua01hcmdpbj0lZFxuIiwKKwkJCQlfX2Z1bmNfXywgRGlhbG9nVG9rZW4sIFRwY1JlcEluZm8uVHhQd3IsIFRwY1JlcEluZm8uTGlua01hcmdpbikpOworCQl9CisJfQorCisJcmV0dXJuOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVNwZWN0cnVuIGFjdGlvbiBmcmFtZXMgSGFuZGxlciBzdWNoIGFzIGNoYW5uZWwgc3dpdGNoIGFubm91Y2VtZW50LAorCQltZWFzdXJlbWVudCByZXBvcnQsIG1lYXN1cmVtZW50IHJlcXVlc3QgYWN0aW9ucyBmcmFtZXMuCisKKwlQYXJhbWV0cnM6CisJCUVsbWUgLSBNTE1FIG1lc3NhZ2UgY29udGFpbmluZyB0aGUgcmVjZWl2ZWQgZnJhbWUKKworCVJldHVybgk6IE5vbmUuCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBQZWVyU3BlY3RydW1BY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCisJVUNIQVIJQWN0aW9uID0gRWxlbS0+TXNnW0xFTkdUSF84MDJfMTErMV07CisKKwlpZiAocEFkLT5Db21tb25DZmcuYklFRUU4MDIxMUggIT0gVFJVRSkKKwkJcmV0dXJuOworCisJc3dpdGNoKEFjdGlvbikKKwl7CisJCWNhc2UgU1BFQ19NUlE6CisJCQkvLyBjdXJyZW50IHJ0Mjg2MCB1bmFibGUgZG8gc3VjaCBtZWFzdXJlIHNwZWNpZmllZCBpbiBNZWFzdXJlbWVudCBSZXF1ZXN0LgorCQkJLy8gcmVqZWN0IGFsbCBtZWFzdXJlbWVudCByZXF1ZXN0LgorCQkJUGVlck1lYXN1cmVSZXFBY3Rpb24ocEFkLCBFbGVtKTsKKwkJCWJyZWFrOworCisJCWNhc2UgU1BFQ19NUlA6CisJCQlQZWVyTWVhc3VyZVJlcG9ydEFjdGlvbihwQWQsIEVsZW0pOworCQkJYnJlYWs7CisKKwkJY2FzZSBTUEVDX1RQQ1JROgorCQkJUGVlclRwY1JlcUFjdGlvbihwQWQsIEVsZW0pOworCQkJYnJlYWs7CisKKwkJY2FzZSBTUEVDX1RQQ1JQOgorCQkJUGVlclRwY1JlcEFjdGlvbihwQWQsIEVsZW0pOworCQkJYnJlYWs7CisKKwkJY2FzZSBTUEVDX0NIQU5ORUxfU1dJVENIOgoreworI2lmZGVmIERPVDExTl9EUkFGVDMKKwkJCQlTRUNfQ0hBX09GRlNFVF9JRQlTZWNvbmRhcnk7CisJCQkJQ0hBX1NXSVRDSF9BTk5PVU5DRV9JRQlDaGFubmVsU3dpdGNoOworCisJCQkJLy8gODAyLjExaCBvbmx5IGhhcyBDaGFubmVsIFN3aXRjaCBBbm5vdW5jZW1lbnQgSUUuCisJCQkJUlRNUE1vdmVNZW1vcnkoJkNoYW5uZWxTd2l0Y2gsICZFbGVtLT5Nc2dbTEVOR1RIXzgwMl8xMSs0XSwgc2l6ZW9mIChDSEFfU1dJVENIX0FOTk9VTkNFX0lFKSk7CisKKwkJCQkvLyA4MDIuMTFuIEQzLjAzIGFkZHMgc2Vjb25kYXJ5IGNoYW5uZWwgb2Zmc2V0IGVsZW1lbnQgaW4gdGhlIGVuZC4KKwkJCQlpZiAoRWxlbS0+TXNnTGVuID09ICAoTEVOR1RIXzgwMl8xMSArIDIgKyBzaXplb2YgKENIQV9TV0lUQ0hfQU5OT1VOQ0VfSUUpICsgc2l6ZW9mIChTRUNfQ0hBX09GRlNFVF9JRSkpKQorCQkJCXsKKwkJCQkJUlRNUE1vdmVNZW1vcnkoJlNlY29uZGFyeSwgJkVsZW0tPk1zZ1tMRU5HVEhfODAyXzExKzldLCBzaXplb2YgKFNFQ19DSEFfT0ZGU0VUX0lFKSk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCVNlY29uZGFyeS5TZWNvbmRhcnlDaGFubmVsT2Zmc2V0ID0gMDsKKwkJCQl9CisKKwkJCQlpZiAoKEVsZW0tPk1zZ1tMRU5HVEhfODAyXzExKzJdID09IElFX0NIQU5ORUxfU1dJVENIX0FOTk9VTkNFTUVOVCkgJiYgKEVsZW0tPk1zZ1tMRU5HVEhfODAyXzExKzNdID09IDMpKQorCQkJCXsKKwkJCQkJQ2hhbm5lbFN3aXRjaEFjdGlvbihwQWQsIEVsZW0tPldjaWQsIENoYW5uZWxTd2l0Y2guTmV3Q2hhbm5lbCwgU2Vjb25kYXJ5LlNlY29uZGFyeUNoYW5uZWxPZmZzZXQpOworCQkJCX0KKyNlbmRpZiAvLyBET1QxMU5fRFJBRlQzIC8vCit9CisJCQlQZWVyQ2hTd0FubkFjdGlvbihwQWQsIEVsZW0pOworCQkJYnJlYWs7CisJfQorCisJcmV0dXJuOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisKKwlQYXJhbWV0cnM6CisKKwlSZXR1cm4JOiBOb25lLgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK0lOVCBTZXRfTWVhc3VyZVJlcV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVSU5UIEFpZCA9IDE7CisJVUlOVCBBcmdJZHg7CisJUFVDSEFSIHRoaXNDaGFyOworCisJTUVBU1VSRV9SRVFfTU9ERSBNZWFzdXJlUmVxTW9kZTsKKwlVSU5UOCBNZWFzdXJlUmVxVG9rZW4gPSBSYW5kb21CeXRlKHBBZCk7CisJVUlOVDggTWVhc3VyZVJlcVR5cGUgPSBSTV9CQVNJQzsKKwlVSU5UOCBNZWFzdXJlQ2ggPSAxOworCisJQXJnSWR4ID0gMTsKKwl3aGlsZSAoKHRoaXNDaGFyID0gc3Ryc2VwKChjaGFyICoqKSZhcmcsICItIikpICE9IE5VTEwpCisJeworCQlzd2l0Y2goQXJnSWR4KQorCQl7CisJCQljYXNlIDE6CS8vIEFpZC4KKwkJCQlBaWQgPSBzaW1wbGVfc3RydG9sKHRoaXNDaGFyLCAwLCAxNik7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgMjogLy8gTWVhc3VyZW1lbnQgUmVxdWVzdCBUeXBlLgorCQkJCU1lYXN1cmVSZXFUeXBlID0gc2ltcGxlX3N0cnRvbCh0aGlzQ2hhciwgMCwgMTYpOworCQkJCWlmIChNZWFzdXJlUmVxVHlwZSA+IDMpCisJCQkJeworCQkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlczogdW5rbm93IE1lYXN1cmVSZXFUeXBlKCVkKVxuIiwgX19mdW5jX18sIE1lYXN1cmVSZXFUeXBlKSk7CisJCQkJCXJldHVybiBUUlVFOworCQkJCX0KKwkJCQlicmVhazsKKworCQkJY2FzZSAzOiAvLyBNZWFzdXJlbWVudCBjaGFubmVsLgorCQkJCU1lYXN1cmVDaCA9IHNpbXBsZV9zdHJ0b2wodGhpc0NoYXIsIDAsIDE2KTsKKwkJCQlicmVhazsKKwkJfQorCQlBcmdJZHgrKzsKKwl9CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6QWlkID0gJWQsIE1lYXN1cmVSZXFUeXBlPSVkIE1lYXN1cmVDaD0lZFxuIiwgX19mdW5jX18sIEFpZCwgTWVhc3VyZVJlcVR5cGUsIE1lYXN1cmVDaCkpOworCWlmICghVkFMSURfV0NJRChBaWQpKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXM6IHVua25vdyBzdGEgb2YgQWlkKCVkKVxuIiwgX19mdW5jX18sIEFpZCkpOworCQlyZXR1cm4gVFJVRTsKKwl9CisKKwlNZWFzdXJlUmVxTW9kZS53b3JkID0gMDsKKwlNZWFzdXJlUmVxTW9kZS5maWVsZC5FbmFibGUgPSAxOworCisJTWVhc3VyZVJlcUluc2VydChwQWQsIE1lYXN1cmVSZXFUb2tlbik7CisKKwlFbnF1ZXVlTWVhc3VyZW1lbnRSZXEocEFkLCBwQWQtPk1hY1RhYi5Db250ZW50W0FpZF0uQWRkciwKKwkJTWVhc3VyZVJlcVRva2VuLCBNZWFzdXJlUmVxTW9kZS53b3JkLCBNZWFzdXJlUmVxVHlwZSwgTWVhc3VyZUNoLCAyMDAwKTsKKworCXJldHVybiBUUlVFOworfQorCitJTlQgU2V0X1RwY1JlcV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVSU5UIEFpZDsKKworCVVJTlQ4IFRwY1JlcVRva2VuID0gUmFuZG9tQnl0ZShwQWQpOworCisJQWlkID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDE2KTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpBaWQgPSAlZFxuIiwgX19mdW5jX18sIEFpZCkpOworCWlmICghVkFMSURfV0NJRChBaWQpKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXM6IHVua25vdyBzdGEgb2YgQWlkKCVkKVxuIiwgX19mdW5jX18sIEFpZCkpOworCQlyZXR1cm4gVFJVRTsKKwl9CisKKwlUcGNSZXFJbnNlcnQocEFkLCBUcGNSZXFUb2tlbik7CisKKwlFbnF1ZXVlVFBDUmVxKHBBZCwgcEFkLT5NYWNUYWIuQ29udGVudFtBaWRdLkFkZHIsIFRwY1JlcVRva2VuKTsKKworCXJldHVybiBUUlVFOworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbmZpZy5tayBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29uZmlnLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1N2Q3YmIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbmZpZy5tawpAQCAtMCwwICsxLDI0NSBAQAorIyBTdXBwb3J0IEFURSBmdW5jdGlvbgorSEFTX0FURT1uCisKKyMgU3VwcG9ydCAyOHh4IFFBIEFURSBmdW5jdGlvbgorSEFTXzI4eHhfUUE9bgorCisjIFN1cHBvcnQgV3BhX1N1cHBsaWNhbnQKK0hBU19XUEFfU1VQUExJQ0FOVD1uCisKKyMgU3VwcG9ydCBOYXRpdmUgV3BhU3VwcGxpY2FudCBmb3IgTmV0d29yayBNYWdhbmdlcgorSEFTX05BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUPW4KKworI1N1cHBvcnQgTmV0IGludGVyZmFjZSBibG9jayB3aGlsZSBUeC1TdyBxdWV1ZSBmdWxsCitIQVNfQkxPQ0tfTkVUX0lGPW4KKworI1N1cHBvcnQgREZTIGZ1bmN0aW9uCitIQVNfREZTX1NVUFBPUlQ9bgorCisjU3VwcG9ydCBDYXJyaWVyLVNlbnNlIGZ1bmN0aW9uCitIQVNfQ1NfU1VQUE9SVD1uCisKKyNpZmRlZiBNVUxUSV9DQVJECisjIFN1cHBvcnQgZm9yIE11bHRpcGxlIENhcmRzCitIQVNfTUNfU1VQUE9SVD1uCisjZW5kaWYgLy8gTVVMVElfQ0FSRCAvLworCisjU3VwcG9ydCBmb3IgSUVFRTgwMi4xMWUgRExTCitIQVNfUU9TX0RMU19TVVBQT1JUPW4KKworI1N1cHBvcnQgZm9yIEVYVF9DSEFOTkVMCitIQVNfRVhUX0JVSUxEX0NIQU5ORUxfTElTVD1uCisKKyNTdXBwb3J0IGZvciBOZXQtU05NUAorSEFTX1NOTVBfU1VQUE9SVD1uCisKKyNTdXBwb3J0IGZlYXR1cmVzIG9mIFNpbmdsZSBTS1UuCitIQVNfU0lOR0xFX1NLVV9TVVBQT1JUPW4KKworI1N1cHBvcnQgZmVhdHVyZXMgb2YgODAyLjExbgorSEFTX0RPVDExX05fU1VQUE9SVD15CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitDQyA6PSAkKENST1NTX0NPTVBJTEUpZ2NjCitMRCA6PSAkKENST1NTX0NPTVBJTEUpbGQKKworV0ZMQUdTIDo9IC1EQUdHUkVHQVRJT05fU1VQUE9SVCAtRFBJR0dZQkFDS19TVVBQT1JUIC1EV01NX1NVUFBPUlQgIC1ETElOVVggLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXRyaWdyYXBocworCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorIyBjb25maWcgZm9yIFNUQSBtb2RlCisKK2lmZXEgKCQoUlQyOHh4X01PREUpLFNUQSkKK1dGTEFHUyArPSAtRENPTkZJR19TVEFfU1VQUE9SVCAtRERCRworCitpZmVxICgkKEhBU19XUEFfU1VQUExJQ0FOVCkseSkKK1dGTEFHUyArPSAtRFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKK2VuZGlmCisKK2lmZXEgKCQoSEFTX05BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUKSx5KQorV0ZMQUdTICs9IC1ETkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQKK2VuZGlmCisKK2lmZXEgKCQoSEFTX0FURSkseSkKK1dGTEFHUyArPSAtRFJBTElOS19BVEUKK2lmZXEgKCQoSEFTXzI4eHhfUUEpLHkpCitXRkxBR1MgKz0gLURSQUxJTktfMjh4eF9RQQorZW5kaWYKK2VuZGlmCisKK2lmZXEgKCQoSEFTX1NOTVBfU1VQUE9SVCkseSkKK1dGTEFHUyArPSAtRFNOTVBfU1VQUE9SVAorZW5kaWYKKworaWZlcSAoJChIQVNfUU9TX0RMU19TVVBQT1JUKSx5KQorV0ZMQUdTICs9IC1EUU9TX0RMU19TVVBQT1JUCitlbmRpZgorCitpZmVxICgkKEhBU19ET1QxMV9OX1NVUFBPUlQpLHkpCitXRkxBR1MgKz0gLURET1QxMV9OX1NVUFBPUlQKK2VuZGlmCisKK2lmZXEgKCQoSEFTX0NTX1NVUFBPUlQpLHkpCitXRkxBR1MgKz0gLURDQVJSSUVSX0RFVEVDVElPTl9TVVBQT1JUCitlbmRpZgorCitpZmVxICgkKEhBU19TSU5HTEVfU0tVX1NVUFBPUlQpLHkpCitXRkxBR1MgKz0gLURTSU5HTEVfU0tVCitlbmRpZgorCitlbmRpZgorIyBlbmRpZiBvZiBpZmVxICgkKFJUMjh4eF9NT0RFKSxTVEEpCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjCisjIENvbW1vbiBjb21waWxlciBmbGFnCisjCisKKworaWZlcSAoJChIQVNfRVhUX0JVSUxEX0NIQU5ORUxfTElTVCkseSkKK1dGTEFHUyArPSAtREVYVF9CVUlMRF9DSEFOTkVMX0xJU1QKK2VuZGlmCisKK2lmZXEgKCQoQ0hJUFNFVCksMjg2MCkKK1dGTEFHUyArPS1EUlQyODYwCitlbmRpZgorCitpZmVxICgkKENISVBTRVQpLDI4NzApCitXRkxBR1MgKz0tRFJUMjg3MAorZW5kaWYKKworaWZlcSAoJChQTEFURk9STSksNVZUKQorI1dGTEFHUyArPSAtRENPTkZJR181VlRfRU5IQU5DRQorZW5kaWYKKworaWZlcSAoJChIQVNfQkxPQ0tfTkVUX0lGKSx5KQorV0ZMQUdTICs9IC1EQkxPQ0tfTkVUX0lGCitlbmRpZgorCitpZmVxICgkKEhBU19ERlNfU1VQUE9SVCkseSkKK1dGTEFHUyArPSAtRERGU19TVVBQT1JUCitlbmRpZgorCisjaWZkZWYgTVVMVElfQ0FSRAoraWZlcSAoJChIQVNfTUNfU1VQUE9SVCkseSkKK1dGTEFHUyArPSAtRE1VTFRJUExFX0NBUkRfU1VQUE9SVAorZW5kaWYKKyNlbmRpZiAvLyBNVUxUSV9DQVJEIC8vCisKK2lmZXEgKCQoSEFTX0xMVEQpLHkpCitXRkxBR1MgKz0gLURMTFREX1NVUFBPUlQKK2VuZGlmCisKK2lmZXEgKCQoUExBVEZPUk0pLElYUCkKK1dGTEFHUyArPSAtRFJUX0JJR19FTkRJQU4KK2VuZGlmCisKK2lmZXEgKCQoUExBVEZPUk0pLElLQU5PU19WMTYwKQorV0ZMQUdTICs9IC1EUlRfQklHX0VORElBTiAtRElLQU5PU19WWF8xWDAKK2VuZGlmCisKK2lmZXEgKCQoUExBVEZPUk0pLElLQU5PU19WMTgwKQorV0ZMQUdTICs9IC1EUlRfQklHX0VORElBTiAtRElLQU5PU19WWF8xWDAKK2VuZGlmCisKK2lmZXEgKCQoUExBVEZPUk0pLElORl9UV0lOUEFTUykKK1dGTEFHUyArPSAtRFJUX0JJR19FTkRJQU4gLURJTkZfVFdJTlBBU1MKK2VuZGlmCisKK2lmZXEgKCQoUExBVEZPUk0pLElORl9EQU5VQkUpCitXRkxBR1MgKz0gLURJTkZfREFOVUJFIC1EUlRfQklHX0VORElBTgorZW5kaWYKKworaWZlcSAoJChQTEFURk9STSksQ0FWTV9PQ1RFT04pCitXRkxBR1MgKz0gLURSVF9CSUdfRU5ESUFOCitlbmRpZgorCitpZmVxICgkKFBMQVRGT1JNKSxCUkNNXzYzNTgpCitXRkxBR1MgKz0gLURSVF9CSUdfRU5ESUFOCitlbmRpZgorCitpZmVxICgkKFBMQVRGT1JNKSxJTkZfQU1BWk9OX1NFKQorI1dGTEFHUyArPSAtRFJUX0JJR19FTkRJQU4gLURJTkZfQU1BWk9OX1NFIC1EQkdfRlRfU1VQUE9SVAorV0ZMQUdTICs9IC1EUlRfQklHX0VORElBTiAtRElORl9BTUFaT05fU0UKK2VuZGlmCisKKyNrZXJuZWwgYnVpbGQgb3B0aW9ucyBmb3IgMi40CisjIG1vdmUgdG8gTWFrZWZpbGUgb3V0c2lkZSBMSU5VWF9TUkMgOj0gL29wdC9zdGFyL2tlcm5lbC9saW51eC0yLjQuMjctc3RhcgorCitpZmVxICgkKFBMQVRGT1JNKSxTVEFSKQorQ0ZMQUdTIDo9IC1EX19LRVJORUxfXyAtSSQoTElOVVhfU1JDKS9pbmNsdWRlIC1JJChSVDI4eHhfRElSKS9pbmNsdWRlIC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby10cmlncmFwaHMgLU8yIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1mbm8tY29tbW9uIC1VYXJtIC1mbm8tY29tbW9uIC1waXBlIC1tYXBjcy0zMiAtRF9fTElOVVhfQVJNX0FSQ0hfXz00IC1tYXJjaD1hcm12NCAgLW1zaG9ydC1sb2FkLWJ5dGVzIC1tc29mdC1mbG9hdCAtVWFybSAtRE1PRFVMRSAtRE1PRFZFUlNJT05TIC1pbmNsdWRlICQoTElOVVhfU1JDKS9pbmNsdWRlL2xpbnV4L21vZHZlcnNpb25zLmggJChXRkxBR1MpCisKK2V4cG9ydCBDRkxBR1MKK2VuZGlmCisKK2lmZXEgKCQoUExBVEZPUk0pLFNJR01BKQorQ0ZMQUdTIDo9IC1EX19LRVJORUxfXyAtSSQoUlQyOHh4X0RJUikvaW5jbHVkZSAtSSQoTElOVVhfU1JDKS9pbmNsdWRlIC1JJChMSU5VWF9TUkMpL2luY2x1ZGUvYXNtL2djYyAtSSQoTElOVVhfU1JDKS9pbmNsdWRlL2FzbS1taXBzL21hY2gtdGFuZ28yIC1JJChMSU5VWF9TUkMpL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC10YW5nbzIgLURFTTg2WFhfQ0hJUD1FTTg2WFhfQ0hJUElEX1RBTkdPMiAtREVNODZYWF9SRVZJU0lPTj02IC1JJChMSU5VWF9TUkMpL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC1nZW5lcmljIC1JJChSVDI4NjBfRElSKS9pbmNsdWRlIC1XYWxsIC1XdW5kZWYgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXRyaWdyYXBocyAtZm5vLXN0cmljdC1hbGlhc2luZyAtZm5vLWNvbW1vbiAtZmZyZWVzdGFuZGluZyAtTzIgICAgIC1mb21pdC1mcmFtZS1wb2ludGVyIC1HIDAgLW1uby1hYmljYWxscyAtZm5vLXBpYyAtcGlwZSAgLW1hYmk9MzIgLW1hcmNoPW1pcHMzMnIyIC1XYSwtMzIgLVdhLC1tYXJjaD1taXBzMzJyMiAtV2EsLW1pcHMzMnIyIC1XYSwtLXRyYXAgLURNT0RVTEUgJChXRkxBR1MpCisKK2V4cG9ydCBDRkxBR1MKK2VuZGlmCisKK2lmZXEgKCQoUExBVEZPUk0pLFNJR01BXzg2MjIpCitDRkxBR1MgOj0gLURfX0tFUk5FTF9fIC1JJChDUk9TU19DT01QSUxFX0lOQ0xVREUpL2luY2x1ZGUgLUkkKExJTlVYX1NSQykvaW5jbHVkZSAtSSQoUlQyOHh4X0RJUikvaW5jbHVkZSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdHJpZ3JhcGhzIC1PMiAtZm5vLXN0cmljdC1hbGlhc2luZyAtZm5vLWNvbW1vbiAtZm5vLWNvbW1vbiAtcGlwZSAtZm5vLWJ1aWx0aW4gLURfX2xpbnV4X18gLUROT19NTSAtbWFwY3MtMzIgLW1hcmNoPWFybXY0IC1tdHVuZT1hcm03dGRtaSAtbXNvZnQtZmxvYXQgLURNT0RVTEUgLW1zaG9ydC1sb2FkLWJ5dGVzIC1ub3N0ZGluYyAtaXdpdGhwcmVmaXggLURNT0RVTEUgJChXRkxBR1MpCitleHBvcnQgQ0ZMQUdTCitlbmRpZgorCitpZmVxICgkKFBMQVRGT1JNKSw1VlQpCitDRkxBR1MgOj0gLURfX0tFUk5FTF9fIC1JJChMSU5VWF9TUkMpL2luY2x1ZGUgLUkkKFJUMjh4eF9ESVIpL2luY2x1ZGUgLW1saXR0bGUtZW5kaWFuIC1XYWxsIC1XdW5kZWYgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXRyaWdyYXBocyAtZm5vLXN0cmljdC1hbGlhc2luZyAtZm5vLWNvbW1vbiAtTzMgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1tYXBjcyAtbW5vLXNjaGVkLXByb2xvZyAtbWFiaT1hcGNzLWdudSAtbW5vLXRodW1iLWludGVyd29yayAtRF9fTElOVVhfQVJNX0FSQ0hfXz01IC1tYXJjaD1hcm12NXRlIC1tdHVuZT1hcm05MjZlai1zIC0tcGFyYW0gbWF4LWlubGluZS1pbnNucy1zaW5nbGU9NDAwMDAgIC1VYXJtIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50IC1Xbm8tcG9pbnRlci1zaWduIC1ETU9EVUxFICQoV0ZMQUdTKQorCitleHBvcnQgQ0ZMQUdTCitlbmRpZgorCitpZmVxICgkKFBMQVRGT1JNKSxJS0FOT1NfVjE2MCkKK0NGTEFHUyA6PSAtRF9fS0VSTkVMX18gLUkkKExJTlVYX1NSQykvaW5jbHVkZSAtSSQoTElOVVhfU1JDKS9pbmNsdWRlL2FzbS9nY2MgLUkkKExJTlVYX1NSQykvaW5jbHVkZS9hc20tbWlwcy9tYWNoLXRhbmdvMiAtSSQoTElOVVhfU1JDKS9pbmNsdWRlL2FzbS1taXBzL21hY2gtdGFuZ28yIC1JJChMSU5VWF9TUkMpL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC1nZW5lcmljIC1JJChSVDI4eHhfRElSKS9pbmNsdWRlIC1XYWxsIC1XdW5kZWYgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXRyaWdyYXBocyAtZm5vLXN0cmljdC1hbGlhc2luZyAtZm5vLWNvbW1vbiAtZmZyZWVzdGFuZGluZyAtTzIgLWZvbWl0LWZyYW1lLXBvaW50ZXIgLUcgMCAtbW5vLWFiaWNhbGxzIC1mbm8tcGljIC1waXBlIC1tYXJjaD1seDQxODkgLVdhLCAtRE1PRFVMRSAkKFdGTEFHUykKK2V4cG9ydCBDRkxBR1MKK2VuZGlmCisKK2lmZXEgKCQoUExBVEZPUk0pLElLQU5PU19WMTgwKQorQ0ZMQUdTIDo9IC1EX19LRVJORUxfXyAtSSQoTElOVVhfU1JDKS9pbmNsdWRlIC1JJChMSU5VWF9TUkMpL2luY2x1ZGUvYXNtL2djYyAtSSQoTElOVVhfU1JDKS9pbmNsdWRlL2FzbS1taXBzL21hY2gtdGFuZ28yIC1JJChMSU5VWF9TUkMpL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC10YW5nbzIgLUkkKExJTlVYX1NSQykvaW5jbHVkZS9hc20tbWlwcy9tYWNoLWdlbmVyaWMgLUkkKFJUMjh4eF9ESVIpL2luY2x1ZGUgLVdhbGwgLVd1bmRlZiAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdHJpZ3JhcGhzIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1mbm8tY29tbW9uIC1mZnJlZXN0YW5kaW5nIC1PMiAtZm9taXQtZnJhbWUtcG9pbnRlciAtRyAwIC1tbm8tYWJpY2FsbHMgLWZuby1waWMgLXBpcGUgLW1pcHMzMnIyIC1XYSwgLURNT0RVTEUgJChXRkxBR1MpCitleHBvcnQgQ0ZMQUdTCitlbmRpZgorCitpZmVxICgkKFBMQVRGT1JNKSxJTkZfVFdJTlBBU1MpCitDRkxBR1MgOj0gLURfX0tFUk5FTF9fIC1ETU9EVUxFIC1JJChMSU5VWF9TUkMpL2luY2x1ZGUgLUkkKFJUMjh4eF9ESVIpL2luY2x1ZGUgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXRyaWdyYXBocyAtTzIgLWZvbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1zdHJpY3QtYWxpYXNpbmcgLWZuby1jb21tb24gLUcgMCAtbW5vLWFiaWNhbGxzIC1mbm8tcGljIC1tYXJjaD00a2MgLW1pcHMzMiAtV2EsLS10cmFwIC1waXBlIC1tbG9uZy1jYWxscyAkKFdGTEFHUykKK2V4cG9ydCBDRkxBR1MKK2VuZGlmCisKK2lmZXEgKCQoUExBVEZPUk0pLElORl9EQU5VQkUpCitDRkxBR1MgOj0gLUkkKFJUMjh4eF9ESVIpL2luY2x1ZGUgJChXRkxBR1MpIC1XdW5kZWYgLWZuby1zdHJpY3QtYWxpYXNpbmcgLWZuby1jb21tb24gLWZmcmVlc3RhbmRpbmcgLU9zIC1mb21pdC1mcmFtZS1wb2ludGVyIC1HIDAgLW1uby1hYmljYWxscyAtZm5vLXBpYyAtcGlwZSAtbXNvZnQtZmxvYXQgIC1tYWJpPTMyIC1tYXJjaD1taXBzMzIgLVdhLC0zMiAtV2EsLW1hcmNoPW1pcHMzMiAtV2EsLW1pcHMzMiAtV2EsLS10cmFwIC1JJChMSU5VWF9TUkMpL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC1nZW5lcmljCitleHBvcnQgQ0ZMQUdTCitlbmRpZgorCitpZmVxICgkKFBMQVRGT1JNKSxCUkNNXzYzNTgpCitDRkxBR1MgOj0gJChXRkxBR1MpIC1JJChSVDI4eHhfRElSKS9pbmNsdWRlIC1ub3N0ZGluYyAtaXdpdGhwcmVmaXggaW5jbHVkZSAtRF9fS0VSTkVMX18gLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXRyaWdyYXBocyAtZm5vLXN0cmljdC1hbGlhc2luZyAtZm5vLWNvbW1vbiAtSSAkKExJTlVYX1NSQykvaW5jbHVkZS9hc20vZ2NjIC1HIDAgLW1uby1hYmljYWxscyAtZm5vLXBpYyAtcGlwZSAgLWZpbmxpbmUtbGltaXQ9MTAwMDAwIC1tYWJpPTMyIC1tYXJjaD1taXBzMzIgLVdhLC0zMiAtV2EsLW1hcmNoPW1pcHMzMiAtV2EsLW1pcHMzMiAtV2EsLS10cmFwIC1JJChMSU5VWF9TUkMpL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC1iY205NjN4eCAtSSQoTElOVVhfU1JDKS9pbmNsdWRlL2FzbS1taXBzL21hY2gtZ2VuZXJpYyAgLU9zIC1mb21pdC1mcmFtZS1wb2ludGVyIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAtRE1PRFVMRSAtbWxvbmctY2FsbHMKK2V4cG9ydCBDRkxBR1MKK2VuZGlmCisKK2lmZXEgKCQoUExBVEZPUk0pLFBDKQorICAgIGlmbmVxICgsJChmaW5kc3RyaW5nIDIuNCwkKExJTlVYX1NSQykpKQorCSMgTGludXggMi40CisJQ0ZMQUdTIDo9IC1EX19LRVJORUxfXyAtSSQoTElOVVhfU1JDKS9pbmNsdWRlIC1JJChSVDI4eHhfRElSKS9pbmNsdWRlIC1PMiAtZm9taXQtZnJhbWUtcG9pbnRlciAtZm5vLXN0cmljdC1hbGlhc2luZyAtZm5vLWNvbW1vbiAtcGlwZSAtbXByZWZlcnJlZC1zdGFjay1ib3VuZGFyeT0yIC1tYXJjaD1pNjg2IC1ETU9EVUxFIC1ETU9EVkVSU0lPTlMgLWluY2x1ZGUgJChMSU5VWF9TUkMpL2luY2x1ZGUvbGludXgvbW9kdmVyc2lvbnMuaCAkKFdGTEFHUykKKwlleHBvcnQgQ0ZMQUdTCisgICAgZWxzZQorCSMgTGludXggMi42CisJRVhUUkFfQ0ZMQUdTIDo9ICQoV0ZMQUdTKSAtSSQoUlQyOHh4X0RJUikvaW5jbHVkZQorICAgIGVuZGlmCitlbmRpZgorCitpZmVxICgkKFBMQVRGT1JNKSxJWFApCisgICAgICAgIEVYVFJBX0NGTEFHUyA6PSAtdiAkKFdGTEFHUykgLUkkKFJUMjh4eF9ESVIpL2luY2x1ZGUgLW1iaWctZW5kaWFuCitlbmRpZgorCitpZmVxICgkKFBMQVRGT1JNKSxDQVZNX09DVEVPTikKKwlFWFRSQV9DRkxBR1MgOj0gJChXRkxBR1MpIC1JJChSVDI4eHhfRElSKS9pbmNsdWRlIFwKKwkJCQkgICAgLW1hYmk9NjQgJChXRkxBR1MpCitleHBvcnQgQ0ZMQUdTCitlbmRpZgorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2Rmcy5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9kZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTJhNjM1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9kZnMuaApAQCAtMCwwICsxLDEwMCBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICBNb2R1bGUgTmFtZToKKyAgICBkZnMuaAorCisgICAgQWJzdHJhY3Q6CisgICAgU3VwcG9ydCBERlMgZnVuY3Rpb24uCisKKyAgICBSZXZpc2lvbiBIaXN0b3J5OgorICAgIFdobyAgICAgICBXaGVuICAgICAgICAgICAgV2hhdAorICAgIC0tLS0tLS0tICAtLS0tLS0tLS0tICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEZvbmNoaSAgICAwMy0xMi0yMDA3ICAgICAgY3JlYXRlZAorKi8KKworI2RlZmluZSBSQURBUl9QVUxTRSAxCisjZGVmaW5lIFJBREFSX1dJRFRIIDIKKworI2RlZmluZSBXSURUSF9SRF9JRExFIDAKKyNkZWZpbmUgV0lEVEhfUkRfQ0hFQ0sgMQorCisKK1ZPSUQgQmJwUmFkYXJEZXRlY3Rpb25TdGFydCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK1ZPSUQgQmJwUmFkYXJEZXRlY3Rpb25TdG9wKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKworVk9JRCBSYWRhckRldGVjdGlvblN0YXJ0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIEJPT0xFQU4gQ1RTX1Byb3RlY3QsCisJSU4gVUlOVDggQ1RTUGVyaW9kKTsKKworVk9JRCBSYWRhckRldGVjdGlvblN0b3AoCisJSU4gUFJUTVBfQURBUFRFUglwQWQpOworCitWT0lEIFJhZGFyRGV0ZWN0UGVyaW9kaWMoCisJSU4gUFJUTVBfQURBUFRFUglwQWQpOworCisKK0JPT0xFQU4gUmFkYXJDaGFubmVsQ2hlY2soCisJSU4gUFJUTVBfQURBUFRFUglwQWQsCisJSU4gVUNIQVIJCQlDaCk7CisKK1VMT05HIEphcFJhZGFyVHlwZSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK1VMT05HIFJUTVBCYnBSZWFkUmFkYXJEdXJhdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCk7CisKK1VMT05HIFJUTVBSZWFkUmFkYXJEdXJhdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCk7CisKK1ZPSUQgUlRNUENsZWFuUmFkYXJEdXJhdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCk7CisKK1ZPSUQgUlRNUFByZXBhcmVSRENUU0ZyYW1lKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCXBEQSwKKwlJTglVTE9ORwkJCUR1cmF0aW9uLAorCUlOICBVQ0hBUiAgICAgICAgICAgUlRTUmF0ZSwKKwlJTiAgVUxPTkcgICAgICAgICAgIENUU0Jhc2VBZGRyLAorCUlOICBVQ0hBUgkJCUZyYW1lR2FwKTsKKworVk9JRCBSVE1QUHJlcGFyZVJhZGFyRGV0ZWN0UGFyYW1zKAorCUlOIFBSVE1QX0FEQVBURVIJcEFkKTsKKworCitJTlQgU2V0X0NoTW92aW5nVGltZV9Qcm9jKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFBVQ0hBUiBhcmcpOworCitJTlQgU2V0X0xvbmdQdWxzZVJhZGFyVGhfUHJvYygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBQVUNIQVIgYXJnKTsKKworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2xlYXAuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvbGVhcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4MThjMWYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2xlYXAuaApAQCAtMCwwICsxLDIxNSBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwlNb2R1bGUgTmFtZToKKwlsZWFwLmgKKworCUFic3RyYWN0OgorCisJUmV2aXNpb24gSGlzdG9yeToKKwlXaG8JCQlXaGVuCQkJV2hhdAorCS0tLS0tLS0tCS0tLS0tLS0tLS0JCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlOYW1lCQlEYXRlCQkJTW9kaWZpY2F0aW9uIGxvZ3MKKyovCisjaWZuZGVmIF9fTEVBUF9IX18KKyNkZWZpbmUgX19MRUFQX0hfXworCisvLyBNZXNzYWdlcyBmb3IgQXNzb2NpYXRlIHN0YXRlIG1hY2hpbmUKKyNkZWZpbmUgTEVBUF9NQUNISU5FX0JBU0UgICAgICAgICAgICAgICAgICAgMzAKKworI2RlZmluZSBMRUFQX01TR19SRVFVRVNUX0lERU5USVRZICAgICAgICAgICAzMQorI2RlZmluZSBMRUFQX01TR19SRVFVRVNUX0xFQVAgICAgICAgICAgICAgICAzMgorI2RlZmluZSBMRUFQX01TR19TVUNDRVNTICAgICAgICAgICAgICAgICAgICAzMworI2RlZmluZSBMRUFQX01TR19GQUlMRUQgICAgICAgICAgICAgICAgICAgICAzNAorI2RlZmluZSBMRUFQX01TR19SRVNQT05TRV9MRUFQICAgICAgICAgICAgICAzNQorI2RlZmluZSBMRUFQX01TR19FQVBPTEtFWSAgICAgICAgICAgICAgICAgICAzNgorI2RlZmluZSBMRUFQX01TR19VTktOT1dOICAgICAgICAgICAgICAgICAgICAzNworI2RlZmluZSBMRUFQX01TRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAzOAorLy8hIGFzc29jIHN0YXRlLW1hY2hpbmUgc3RhdGVzCisjZGVmaW5lIExFQVBfSURMRSAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgTEVBUF9XQUlUX0lERU5USVRZX1JFUVVFU1QgICAgICAgICAgMQorI2RlZmluZSBMRUFQX1dBSVRfQ0hBTkxMRU5HRV9SRVFVRVNUICAgICAgICAyCisjZGVmaW5lIExFQVBfV0FJVF9TVUNDRVNTICAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgTEVBUF9XQUlUX0NIQU5MTEVOR0VfUkVTUE9OU0UgICAgICAgNAorI2RlZmluZSBMRUFQX1dBSVRfRUFQT0xLRVkgICAgICAgICAgICAgICAgICA1CisKKyNkZWZpbmUgTEVBUF9SRUFTT05fSU5WQUxJRF9BVVRIICAgICAgICAgICAgICAgICAgICAweDAxCisjZGVmaW5lIExFQVBfUkVBU09OX0FVVEhfVElNRU9VVCAgICAgICAgICAgICAgICAgICAgMHgwMgorI2RlZmluZSBMRUFQX1JFQVNPTl9DSEFMTEVOR0VfRlJPTV9BUF9GQUlMRUQgICAgICAgIDB4MDMKKyNkZWZpbmUgTEVBUF9SRUFTT05fQ0hBTExFTkdFX1RPX0FQX0ZBSUxFRCAgICAgICAgICAweDA0CisKKyNkZWZpbmUgQ0lTQ09fQXV0aE1vZGVMRUFQICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwCisjZGVmaW5lIENJU0NPX0F1dGhNb2RlTEVBUE5vbmUgICAgICAgICAgICAgICAgICAgICAgMHgwMAorI2RlZmluZSBMRUFQX0FVVEhfVElNRU9VVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDMwMDAwCisjZGVmaW5lIExFQVBfQ0hBTExFTkdFX1JFU1BPTlNFX0xFTkdUSCAgICAgICAgICAgICAgMjQKKyNkZWZpbmUgTEVBUF9DSEFMTEVOR0VfUkVRVUVTVF9MRU5HVEggICAgICAgICAgICAgICA4CisKK3R5cGVkZWYgc3RydWN0IF9MRUFQX0VBUE9MX0hFQURFUl8geworICAgIFVDSEFSICAgICAgIFZlcnNpb247CisgICAgVUNIQVIgICAgICAgVHlwZTsKKyAgICBVQ0hBUiAgICAgICBMZW5ndGhbMl07Cit9IExFQVBfRUFQT0xfSEVBREVSLCAqUExFQVBfRUFQT0xfSEVBREVSOworCit0eXBlZGVmIHN0cnVjdCBfTEVBUF9FQVBPTF9QQUNLRVRfIHsKKyAgICBVQ0hBUiAgICAgICBDb2RlOworICAgIFVDSEFSICAgICAgIElkZW50aWZpZXI7CisgICAgVUNIQVIgICAgICAgTGVuZ3RoWzJdOworICAgIFVDSEFSICAgICAgIFR5cGU7Cit9IExFQVBfRUFQT0xfUEFDS0VULCAqUExFQVBfRUFQT0xfUEFDS0VUOworCit0eXBlZGVmIHN0cnVjdCBfTEVBUF9FQVBfQ09OVEVOVFNfIHsKKyAgICBVQ0hBUiAgICAgICBWZXJzaW9uOworICAgIFVDSEFSICAgICAgIFJlc2VydmVkOworICAgIFVDSEFSICAgICAgIExlbmd0aDsKK30gTEVBUF9FQVBfQ09OVEVOVFMsICpQTEVBUF9FQVBfQ09OVEVOVFM7CisKKy8qKiogRUFQT0wga2V5ICoqKi8KK3R5cGVkZWYgc3RydWN0IF9FQVBPTF9LRVlfSEVBREVSXyB7CisgICAgVUNIQVIgICAgICAgVHlwZTsKKyAgICBVQ0hBUiAgICAgICBMZW5ndGhbMl07CisgICAgVUNIQVIgICAgICAgQ291bnRlcls4XTsKKyAgICBVQ0hBUiAgICAgICBJVlsxNl07CisgICAgVUNIQVIgICAgICAgSW5kZXg7CisgICAgVUNIQVIgICAgICAgU2lnbmF0dXJlWzE2XTsKK30gRUFQT0xfS0VZX0hFQURFUiwgKlBFQVBPTF9LRVlfSEVBREVSOworCitCT09MRUFOIExlYXBNc2dUeXBlU3Vic3QoCisgICAgSU4gIFVDSEFSICAgRUFQVHlwZSwKKyAgICBPVVQgVUxPTkcgICAqTXNnVHlwZSk7CisKK1ZPSUQgTGVhcE1hY2hpbmVQZXJmb3JtQWN0aW9uKAorICAgIElOIFBSVE1QX0FEQVBURVIgICAgcEFkLAorICAgIElOIFNUQVRFX01BQ0hJTkUgICAgKlMsCisgICAgSU4gTUxNRV9RVUVVRV9FTEVNICAqRWxlbSk7CisKK1ZPSUQgTGVhcE1hY0hlYWRlckluaXQoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICAgICAgcEFkLAorICAgIElOICBPVVQgUEhFQURFUl84MDJfMTEgIHBIZHI4MDIxMSwKKyAgICBJTiAgVUNIQVIgICAgICAgICAgICAgICB3ZXAsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICAgICAgcEFkZHIzKTsKKworVk9JRCBMZWFwU3RhcnRBY3Rpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUiAgICBwQWQsCisgICAgSU4gTUxNRV9RVUVVRV9FTEVNICAqRWxlbSk7CisKK1ZPSUQgTGVhcElkZW50aXR5QWN0aW9uKAorICAgIElOIFBSVE1QX0FEQVBURVIgICAgcEFkLAorICAgIElOIE1MTUVfUVVFVUVfRUxFTSAgKkVsZW0pOworCitWT0lEIExlYXBQZWVyQ2hhbGxlbmdlQWN0aW9uKAorICAgIElOIFBSVE1QX0FEQVBURVIgICAgcEFkLAorICAgIElOIE1MTUVfUVVFVUVfRUxFTSAgKkVsZW0pOworCitWT0lEIEhhc2hQd2QoCisgICAgSU4gIFBVQ0hBUiAgcHdkLAorICAgIElOICBJTlQgICAgIHB3ZGxlbiwKKyAgICBPVVQgUFVDSEFSICBoYXNoKTsKKworVk9JRCBQZWVyQ2hhbGxlbmdlUmVzcG9uc2UoCisgICAgSU4gIFBVQ0hBUiAgc3pDaGFsbGVuZ2UsCisgICAgSU4gIFBVQ0hBUiAgc21iUGFzc3dkLAorICAgIE9VVCBQVUNIQVIgIHN6UmVzcG9uc2UpOworCitWT0lEIFBhcml0eUtleSgKKyAgICBPVVQgUFVDSEFSICBzek91dCwKKyAgICBJTiAgUFVDSEFSICBzekluKTsKKworVk9JRCBEZXNLZXkoCisgICAgT1VUIFVMT05HICAga1sxNl1bMl0sCisgICAgSU4gIFBVQ0hBUiAga2V5LAorICAgIElOICBJTlQgICAgIGRlY3J5cHQpOworCitWT0lEIERlcygKKyAgICBJTiAgVUxPTkcgICBrc1sxNl1bMl0sCisgICAgT1VUIFVDSEFSICAgYmxvY2tbOF0pOworCitWT0lEIERlc0VuY3J5cHQoCisgICAgSU4gIFBVQ0hBUiAgc3pDbGVhciwKKyAgICBJTiAgUFVDSEFSICBzektleSwKKyAgICBPVVQgUFVDSEFSICBzek91dCk7CisKK1ZPSUQgTGVhcE5ldHdvcmtDaGFsbGVuZ2VBY3Rpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUiAgICBwQWQsCisgICAgSU4gTUxNRV9RVUVVRV9FTEVNICAqRWxlbSk7CisKK1ZPSUQgTGVhcE5ldHdvcmtDaGFsbGVuZ2VSZXNwb25zZSgKKyAgICBJTiBQUlRNUF9BREFQVEVSICAgIHBBZCwKKyAgICBJTiBNTE1FX1FVRVVFX0VMRU0gICpFbGVtKTsKKworVk9JRCBIYXNocHdkSGFzaCgKKyAgICBJTiAgUFVDSEFSICBoYXNoLAorICAgIElOICBQVUNIQVIgIGhhc2hoYXNoKTsKKworVk9JRCBQcm9jZXNzU2Vzc2lvbktleSgKKyAgICBPVVQgUFVDSEFSICBTZXNzaW9uS2V5LAorICAgIElOICBQVUNIQVIgIGhhc2gyLAorICAgIElOICBQVUNIQVIgIENoYWxsZW5nZVRvUmFkaXVzLAorICAgIElOICBQVUNIQVIgIENoYWxsZW5nZVJlc3BvbnNlRnJvbVJhZGl1cywKKyAgICBJTiAgUFVDSEFSICBDaGFsbGVuZ2VGcm9tUmFkaXVzLAorICAgIElOICBQVUNIQVIgIENoYWxsZW5nZVJlc3BvbnNlVG9SYWRpdXMpOworCitWT0lEIExlYXBFYXBvbEtleUFjdGlvbigKKyAgICBJTiBQUlRNUF9BREFQVEVSICAgIHBBZCwKKyAgICBJTiBNTE1FX1FVRVVFX0VMRU0gICpFbGVtKTsKKworVk9JRCBSb2d1ZUFwVGFibGVJbml0KAorICAgIElOIFJPR1VFQVBfVEFCTEUgICAgKlRhYik7CisKK1VMT05HIFJvZ3VlQXBUYWJsZVNlYXJjaCgKKyAgICBJTiBST0dVRUFQX1RBQkxFICAgICpUYWIsCisgICAgSU4gUFVDSEFSICAgICAgICAgICBwQWRkcik7CisKK1ZPSUQgUm9ndWVBcEVudHJ5U2V0KAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorICAgIE9VVCBST0dVRUFQX0VOVFJZICAgKnBSb2d1ZUFwLAorICAgIElOIFBVQ0hBUiAgICAgICAgICAgcEFkZHIsCisgICAgSU4gVUNIQVIgICAgICAgICAgICBGYWlsZUNvZGUpOworCitVTE9ORyBSb2d1ZUFwVGFibGVTZXRFbnRyeSgKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKyAgICBPVVQgUk9HVUVBUF9UQUJMRSAgKlRhYiwKKyAgICBJTiBQVUNIQVIgICAgICAgICAgIHBBZGRyLAorICAgIElOIFVDSEFSICAgICAgICAgICAgRmFpbGVDb2RlKTsKKworVk9JRCBSb2d1ZUFwVGFibGVEZWxldGVFbnRyeSgKKyAgICBJTiBPVVQgUk9HVUVBUF9UQUJMRSAqVGFiLAorICAgIElOIFBVQ0hBUiAgICAgICAgICBwQWRkcik7CisKK1ZPSUQgTGVhcEF1dGhUaW1lb3V0KAorICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKKyAgICBJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCisgICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAorICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMyk7CisKK1ZPSUQgTGVhcFNlbmRSb2d1ZUFQUmVwb3J0KAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworQk9PTEVBTiBDQ0tNQXNzb2NSc3BTYW5pdHkoCisgICAgSU4gUFJUTVBfQURBUFRFUiAgICBwQWQsCisgICAgSU4gVk9JRCAgICAgICAgICAgICAqTXNnLAorICAgIElOIFVMT05HICAgICAgICAgICAgTXNnTGVuKTsKKworI2VuZGlmICAvLyBfX0xFQVBfSF9fCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2xpbmtfbGlzdC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9saW5rX2xpc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjUyMTEzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9saW5rX2xpc3QuaApAQCAtMCwwICsxLDEzNCBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworI2lmbmRlZiBfX0xJTktfTElTVF9IX18KKyNkZWZpbmUgX19MSU5LX0xJU1RfSF9fCisKK3R5cGVkZWYgc3RydWN0IF9MSVNUX0VOVFJZCit7CisJc3RydWN0IF9MSVNUX0VOVFJZICpwTmV4dDsKK30gTElTVF9FTlRSWSwgKlBMSVNUX0VOVFJZOworCit0eXBlZGVmIHN0cnVjdCBfTElTVF9IRUFEUgoreworCVBMSVNUX0VOVFJZIHBIZWFkOworCVBMSVNUX0VOVFJZIHBUYWlsOworCVVDSEFSIHNpemU7Cit9IExJU1RfSEVBREVSLCAqUExJU1RfSEVBREVSOworCitzdGF0aWMgaW5saW5lIFZPSUQgaW5pdExpc3QoCisJSU4gUExJU1RfSEVBREVSIHBMaXN0KQoreworCXBMaXN0LT5wSGVhZCA9IHBMaXN0LT5wVGFpbCA9IE5VTEw7CisJcExpc3QtPnNpemUgPSAwOworCXJldHVybjsKK30KKworc3RhdGljIGlubGluZSBWT0lEIGluc2VydFRhaWxMaXN0KAorCUlOIFBMSVNUX0hFQURFUiBwTGlzdCwKKwlJTiBQTElTVF9FTlRSWSBwRW50cnkpCit7CisJcEVudHJ5LT5wTmV4dCA9IE5VTEw7CisJaWYgKHBMaXN0LT5wVGFpbCkKKwkJcExpc3QtPnBUYWlsLT5wTmV4dCA9IHBFbnRyeTsKKwllbHNlCisJCXBMaXN0LT5wSGVhZCA9IHBFbnRyeTsKKwlwTGlzdC0+cFRhaWwgPSBwRW50cnk7CisJcExpc3QtPnNpemUrKzsKKworCXJldHVybjsKK30KKworc3RhdGljIGlubGluZSBQTElTVF9FTlRSWSByZW1vdmVIZWFkTGlzdCgKKwlJTiBQTElTVF9IRUFERVIgcExpc3QpCit7CisJUExJU1RfRU5UUlkgcE5leHQ7CisJUExJU1RfRU5UUlkgcEVudHJ5OworCisJcEVudHJ5ID0gcExpc3QtPnBIZWFkOworCWlmIChwTGlzdC0+cEhlYWQgIT0gTlVMTCkKKwl7CisJCXBOZXh0ID0gcExpc3QtPnBIZWFkLT5wTmV4dDsKKwkJcExpc3QtPnBIZWFkID0gcE5leHQ7CisJCWlmIChwTmV4dCA9PSBOVUxMKQorCQkJcExpc3QtPnBUYWlsID0gTlVMTDsKKwkJcExpc3QtPnNpemUtLTsKKwl9CisJcmV0dXJuIHBFbnRyeTsKK30KKworc3RhdGljIGlubGluZSBpbnQgZ2V0TGlzdFNpemUoCisJSU4gUExJU1RfSEVBREVSIHBMaXN0KQoreworCXJldHVybiBwTGlzdC0+c2l6ZTsKK30KKworc3RhdGljIGlubGluZSBQTElTVF9FTlRSWSBkZWxFbnRyeUxpc3QoCisJSU4gUExJU1RfSEVBREVSIHBMaXN0LAorCUlOIFBMSVNUX0VOVFJZIHBFbnRyeSkKK3sKKwlQTElTVF9FTlRSWSBwQ3VyRW50cnk7CisJUExJU1RfRU5UUlkgcFBydkVudHJ5OworCisJaWYocExpc3QtPnBIZWFkID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJaWYocEVudHJ5ID09IHBMaXN0LT5wSGVhZCkKKwl7CisJCXBDdXJFbnRyeSA9IHBMaXN0LT5wSGVhZDsKKwkJcExpc3QtPnBIZWFkID0gcEN1ckVudHJ5LT5wTmV4dDsKKworCQlpZihwTGlzdC0+cEhlYWQgPT0gTlVMTCkKKwkJCXBMaXN0LT5wVGFpbCA9IE5VTEw7CisKKwkJcExpc3QtPnNpemUtLTsKKwkJcmV0dXJuIHBDdXJFbnRyeTsKKwl9CisKKwlwUHJ2RW50cnkgPSBwTGlzdC0+cEhlYWQ7CisJcEN1ckVudHJ5ID0gcFBydkVudHJ5LT5wTmV4dDsKKwl3aGlsZShwQ3VyRW50cnkgIT0gTlVMTCkKKwl7CisJCWlmIChwRW50cnkgPT0gcEN1ckVudHJ5KQorCQl7CisJCQlwUHJ2RW50cnktPnBOZXh0ID0gcEN1ckVudHJ5LT5wTmV4dDsKKworCQkJaWYocEVudHJ5ID09IHBMaXN0LT5wVGFpbCkKKwkJCQlwTGlzdC0+cFRhaWwgPSBwUHJ2RW50cnk7CisKKwkJCXBMaXN0LT5zaXplLS07CisJCQlicmVhazsKKwkJfQorCQlwUHJ2RW50cnkgPSBwQ3VyRW50cnk7CisJCXBDdXJFbnRyeSA9IHBQcnZFbnRyeS0+cE5leHQ7CisJfQorCisJcmV0dXJuIHBDdXJFbnRyeTsKK30KKworI2VuZGlmIC8vIF9fX0xJTktfTElTVF9IX18gLy8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9tZDQuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvbWQ0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFlNWI1MgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvbWQ0LmgKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworI2lmbmRlZiBfX01ENF9IX18KKyNkZWZpbmUgX19NRDRfSF9fCisKKy8qIE1ENCBjb250ZXh0LiAqLwordHlwZWRlZglzdHJ1Y3QJX01ENF9DVFhfCXsKKwlVTE9ORwlzdGF0ZVs0XTsgICAgICAgIC8qIHN0YXRlIChBQkNEKSAqLworCVVMT05HCWNvdW50WzJdOyAgICAgICAgLyogbnVtYmVyIG9mIGJpdHMsIG1vZHVsbyAyXjY0IChsc2IgZmlyc3QpICovCisJVUNIQVIJYnVmZmVyWzY0XTsgICAgICAvKiBpbnB1dCBidWZmZXIgKi8KK30JTUQ0X0NUWDsKKworVk9JRCBNRDRJbml0IChNRDRfQ1RYICopOworVk9JRCBNRDRVcGRhdGUgKE1ENF9DVFggKiwgUFVDSEFSLCBVSU5UKTsKK1ZPSUQgTUQ0RmluYWwgKFVDSEFSIFsxNl0sIE1ENF9DVFggKik7CisKKyNlbmRpZiAvL19fTUQ0X0hfXwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvbWQ1LmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL21kNS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4NWRiMTIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL21kNS5oCkBAIC0wLDAgKzEsMTA3IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCU1vZHVsZSBOYW1lOgorCW1kNS5oCisKKwlBYnN0cmFjdDoKKworCVJldmlzaW9uIEhpc3Rvcnk6CisJV2hvCQkJV2hlbgkJCVdoYXQKKwktLS0tLS0tLQktLS0tLS0tLS0tCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJTmFtZQkJRGF0ZQkJCU1vZGlmaWNhdGlvbiBsb2dzCisJamFuCQkJMTAtMjgtMDMJCUluaXRpYWwKKwlSaXRhICAgIAkxMS0yMy0wNAkJTW9kaWZ5IE1ENSBhbmQgU0hBLTEKKyovCisKKyNpZm5kZWYJdWludDgKKyNkZWZpbmUJdWludDggIHVuc2lnbmVkCWNoYXIKKyNlbmRpZgorCisjaWZuZGVmCXVpbnQzMgorI2RlZmluZQl1aW50MzIgdW5zaWduZWQJbG9uZyBpbnQKKyNlbmRpZgorCisKKyNpZm5kZWYJX19NRDVfSF9fCisjZGVmaW5lCV9fTUQ1X0hfXworCisjZGVmaW5lIE1ENV9NQUNfTEVOIDE2CisKK3R5cGVkZWYgc3RydWN0IF9NRDVfQ1RYIHsKKyAgICBVSU5UMzIgICBCdWZbNF07ICAgICAgICAgICAgIC8vIGJ1ZmZlcnMgb2YgZm91ciBzdGF0ZXMKKwlVQ0hBUiAgIElucHV0WzY0XTsgICAgICAgICAgLy8gaW5wdXQgbWVzc2FnZQorCVVJTlQzMiAgIExlbkluQml0Q291bnRbMl07ICAgLy8gbGVuZ3RoIGNvdW50ZXIgZm9yIGlucHV0IG1lc3NhZ2UsIDAgdXAgdG8gNjQgYml0cworfSAgIE1ENV9DVFg7CisKK1ZPSUQgTUQ1SW5pdChNRDVfQ1RYICpwQ3R4KTsKK1ZPSUQgTUQ1VXBkYXRlKE1ENV9DVFggKnBDdHgsIFVDSEFSICpwRGF0YSwgVUlOVDMyIExlbkluQnl0ZXMpOworVk9JRCBNRDVGaW5hbChVQ0hBUiBEaWdlc3RbMTZdLCBNRDVfQ1RYICpwQ3R4KTsKK1ZPSUQgTUQ1VHJhbnNmb3JtKFVJTlQzMiBCdWZbNF0sIFVJTlQzMiBNZXNbMTZdKTsKKwordm9pZCBtZDVfbWFjKHU4ICprZXksIHNpemVfdCBrZXlfbGVuLCB1OCAqZGF0YSwgc2l6ZV90IGRhdGFfbGVuLCB1OCAqbWFjKTsKK3ZvaWQgaG1hY19tZDUodTggKmtleSwgc2l6ZV90IGtleV9sZW4sIHU4ICpkYXRhLCBzaXplX3QgZGF0YV9sZW4sIHU4ICptYWMpOworCisvLworLy8gU0hBIGNvbnRleHQKKy8vCit0eXBlZGVmCXN0cnVjdCBfU0hBX0NUWAoreworCVVJTlQzMiAgIEJ1Zls1XTsgICAgICAgICAgICAgLy8gYnVmZmVycyBvZiBmaXZlIHN0YXRlcworCVVDSEFSICAgSW5wdXRbODBdOyAgICAgICAgICAvLyBpbnB1dCBtZXNzYWdlCisJVUlOVDMyICAgTGVuSW5CaXRDb3VudFsyXTsgICAvLyBsZW5ndGggY291bnRlciBmb3IgaW5wdXQgbWVzc2FnZSwgMCB1cCB0byA2NCBiaXRzCisKK30JU0hBX0NUWDsKKworVk9JRCBTSEFJbml0KFNIQV9DVFggKnBDdHgpOworVUNIQVIgU0hBVXBkYXRlKFNIQV9DVFggKnBDdHgsIFVDSEFSICpwRGF0YSwgVUlOVDMyIExlbkluQnl0ZXMpOworVk9JRCBTSEFGaW5hbChTSEFfQ1RYICpwQ3R4LCBVQ0hBUiBEaWdlc3RbMjBdKTsKK1ZPSUQgU0hBVHJhbnNmb3JtKFVJTlQzMiBCdWZbNV0sIFVJTlQzMiBNZXNbMjBdKTsKKworI2RlZmluZSBTSEFfRElHRVNUX0xFTiAyMAorI2VuZGlmIC8vIF9fTUQ1X0hfXworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZglfQUVTX0gKKyNkZWZpbmUJX0FFU19ICisKK3R5cGVkZWYJc3RydWN0Cit7CisJdWludDMyIGVya1s2NF07CQkvKiBlbmNyeXB0aW9uIHJvdW5kCWtleXMgKi8KKwl1aW50MzIgZHJrWzY0XTsJCS8qIGRlY3J5cHRpb24gcm91bmQJa2V5cyAqLworCWludAlucjsJCQkJLyogbnVtYmVyIG9mIHJvdW5kcwkqLworfQorYWVzX2NvbnRleHQ7CisKK2ludAkgcnRtcF9hZXNfc2V0X2tleSggYWVzX2NvbnRleHQgKmN0eCwJdWludDggKmtleSwJaW50CW5iaXRzICk7Cit2b2lkIHJ0bXBfYWVzX2VuY3J5cHQoIGFlc19jb250ZXh0ICpjdHgsCXVpbnQ4IGlucHV0WzE2XSwgdWludDggb3V0cHV0WzE2XSApOwordm9pZCBydG1wX2Flc19kZWNyeXB0KCBhZXNfY29udGV4dCAqY3R4LAl1aW50OCBpbnB1dFsxNl0sIHVpbnQ4IG91dHB1dFsxNl0gKTsKKwordm9pZCBGKGNoYXIgKnBhc3N3b3JkLCB1bnNpZ25lZCBjaGFyICpzc2lkLCBpbnQgc3NpZGxlbmd0aCwgaW50IGl0ZXJhdGlvbnMsIGludCBjb3VudCwgdW5zaWduZWQgY2hhciAqb3V0cHV0KTsKK2ludCBQYXNzd29yZEhhc2goY2hhciAqcGFzc3dvcmQsIHVuc2lnbmVkIGNoYXIgKnNzaWQsIGludCBzc2lkbGVuZ3RoLCB1bnNpZ25lZCBjaGFyICpvdXRwdXQpOworCisjZW5kaWYgLyogYWVzLmgJKi8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9tbG1lLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL21sbWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Y2I2MTY1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9tbG1lLmgKQEAgLTAsMCArMSwxNDQ3IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCU1vZHVsZSBOYW1lOgorCW1sbWUuaAorCisJQWJzdHJhY3Q6CisKKwlSZXZpc2lvbiBIaXN0b3J5OgorCVdobwkJCVdoZW4JCQlXaGF0CisJLS0tLS0tLS0JLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCUpvaG4gQ2hhbmcJMjAwMy0wOC0yOAkJQ3JlYXRlZAorCUpvaG4gQ2hhbmcgIDIwMDQtMDktMDYgICAgICBtb2RpZmllZCBmb3IgUlQyNjAwCisKKyovCisjaWZuZGVmIF9fTUxNRV9IX18KKyNkZWZpbmUgX19NTE1FX0hfXworCisvLyBtYXhpbXVtIHN1cHBvcnRlZCBjYXBhYmlsaXR5IGluZm9ybWF0aW9uIC0KKy8vIEVTUywgSUJTUywgUHJpdmFjeSwgU2hvcnQgUHJlYW1ibGUsIFNwZWN0cnVtIG1nbXQsIFNob3J0IFNsb3QKKyNkZWZpbmUgU1VQUE9SVEVEX0NBUEFCSUxJVFlfSU5GTyAgIDB4MDUzMworCisjZGVmaW5lIEVORF9PRl9BUkdTICAgICAgICAgICAgICAgICAtMQorI2RlZmluZSBMRlNSX01BU0sgICAgICAgICAgICAgICAgICAgMHg4MDAwMDA1NworI2RlZmluZSBNTE1FX1RBU0tfRVhFQ19JTlRWICAgICAgICAgMTAwLyoyMDAqLyAgICAgICAvLworI2RlZmluZSBMRUFEX1RJTUUgICAgICAgICAgICAgICAgICAgNQorI2RlZmluZSBNTE1FX1RBU0tfRVhFQ19NVUxUSVBMRSAgICAgICAxMCAgLyo1Ki8gICAgICAgLy8gTUxNRV9UQVNLX0VYRUNfTVVMVElQTEUgKiBNTE1FX1RBU0tfRVhFQ19JTlRWID0gMSBzZWMKKyNkZWZpbmUgUkVPUkRFUl9FWEVDX0lOVFYgICAgICAgICAJMTAwICAgICAgIC8vIDAuMSBzZWMKKworLy8gVGhlIGRlZmluaXRpb24gb2YgUmFkYXIgZGV0ZWN0aW9uIGR1cmF0aW9uIHJlZ2lvbgorI2RlZmluZSBDRQkJMAorI2RlZmluZSBGQ0MJCTEKKyNkZWZpbmUgSkFQCQkyCisjZGVmaW5lIEpBUF9XNTMJMworI2RlZmluZSBKQVBfVzU2CTQKKyNkZWZpbmUgTUFYX1JEX1JFR0lPTiA1CisKKyNpZmRlZglORElTNTFfTUlOSVBPUlQKKyNkZWZpbmUgQkVBQ09OX0xPU1RfVElNRSAgICAgICAgICAgIDQwMDAgICAgICAgLy8gMjA0OCBtc2VjID0gMiBzZWMKKyNlbHNlCisjZGVmaW5lIEJFQUNPTl9MT1NUX1RJTUUgICAgICAgICAgICA0ICogT1NfSFogICAgLy8gMjA0OCBtc2VjID0gMiBzZWMKKyNlbmRpZgorCisjZGVmaW5lIERMU19USU1FT1VUICAgICAgICAgICAgICAgICAxMjAwICAgICAgLy8gdW5pdDogbXNlYworI2RlZmluZSBBVVRIX1RJTUVPVVQgICAgICAgICAgICAgICAgMzAwICAgICAgIC8vIHVuaXQ6IG1zZWMKKyNkZWZpbmUgQVNTT0NfVElNRU9VVCAgICAgICAgICAgICAgIDMwMCAgICAgICAvLyB1bml0OiBtc2VjCisjZGVmaW5lIEpPSU5fVElNRU9VVCAgICAgICAgICAgICAgICAyICogT1NfSFogICAgICAvLyB1bml0OiBtc2VjCisjZGVmaW5lIFNIT1JUX0NIQU5ORUxfVElNRSAgICAgICAgICA5MCAgICAgICAgLy8gdW5pdDogbXNlYworI2RlZmluZSBNSU5fQ0hBTk5FTF9USU1FICAgICAgICAgICAgMTEwICAgICAgICAvLyB1bml0OiBtc2VjLCBmb3IgZHVhbCBiYW5kIHNjYW4KKyNkZWZpbmUgTUFYX0NIQU5ORUxfVElNRSAgICAgICAgICAgIDE0MCAgICAgICAvLyB1bml0OiBtc2VjLCBmb3Igc2luZ2xlIGJhbmQgc2NhbgorI2RlZmluZQlGQVNUX0FDVElWRV9TQ0FOX1RJTUUJICAgIDMwIAkJICAvLyBBY3RpdmUgc2NhbiB3YWl0aW5nIGZvciBwcm9iZSByZXNwb25zZSB0aW1lCisjZGVmaW5lIENXX01JTl9JTl9CSVRTICAgICAgICAgICAgICA0ICAgICAgICAgLy8gYWN0dWFsIEN3TWluID0gMl5DV19NSU5fSU5fQklUUyAtIDEKKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisjaWZuZGVmIENPTkZJR19BUF9TVVBQT1JUCisjZGVmaW5lIENXX01BWF9JTl9CSVRTICAgICAgICAgICAgICAxMCAgICAgICAgLy8gYWN0dWFsIEN3TWF4ID0gMl5DV19NQVhfSU5fQklUUyAtIDEKKyNlbmRpZgorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisjaWZkZWYgQ09ORklHX0FQU1RBX01JWEVEX1NVUFBPUlQKK2V4dGVybiBVSU5UMzIgQ1dfTUFYX0lOX0JJVFM7CisjZW5kaWYgLy8gQ09ORklHX0FQU1RBX01JWEVEX1NVUFBPUlQgLy8KKworLy8gTm90ZTogUlNTSV9UT19EQk1fT0ZGU0VUIGhhcyBiZWVuIGNoYW5nZWQgdG8gdmFyaWFibGUgZm9yIG5ldyBSRiAoMjAwNC0wNzIwKS4KKy8vIFNIb3VsZCBub3QgcmVmZXIgdG8gdGhpcyBjb25zdGFudCBhbnltb3JlCisvLyNkZWZpbmUgUlNTSV9UT19EQk1fT0ZGU0VUICAgICAgICAgIDEyMCAvLyBmb3IgUlQyNTMwIFJTU0ktMTE1ID0gZEJtCisjZGVmaW5lIFJTU0lfRk9SX01JRF9UWF9QT1dFUiAgICAgICAtNTUgIC8vIC01NSBkYiBpcyBjb25zaWRlcmVkIG1pZC1kaXN0YW5jZQorI2RlZmluZSBSU1NJX0ZPUl9MT1dfVFhfUE9XRVIgICAgICAgLTQ1ICAvLyAtNDUgZGIgaXMgY29uc2lkZXJlZCB2ZXJ5IHNob3J0IGRpc3RhbmNlIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVsaWdpYmxlIHRvIHVzZSBhIGxvd2VyIFRYIHBvd2VyCisjZGVmaW5lIFJTU0lfRk9SX0xPV0VTVF9UWF9QT1dFUiAgICAtMzAKKy8vI2RlZmluZSBNSURfVFhfUE9XRVJfREVMVEEgICAgICAgICAgMCAgIC8vIDAgZGIgZnJvbSBmdWxsIFRYIHBvd2VyIHVwb24gbWlkLWRpc3RhbmNlIHRvIEFQCisjZGVmaW5lIExPV19UWF9QT1dFUl9ERUxUQSAgICAgICAgICA2ICAgIC8vIC0zIGRiIGZyb20gZnVsbCBUWCBwb3dlciB1cG9uIHZlcnkgc2hvcnQgZGlzdGFuY2UuIDEgZ3JhZGUgaXMgMC41IGRiCisjZGVmaW5lIExPV0VTVF9UWF9QT1dFUl9ERUxUQSAgICAgICAxNiAgIC8vIC04IGRiIGZyb20gZnVsbCBUWCBwb3dlciB1cG9uIHNob3J0ZXN0IGRpc3RhbmNlLiAxIGdyYWRlIGlzIDAuNSBkYgorCisjZGVmaW5lIFJTU0lfVFJJR0dFUkVEX1VQT05fQkVMT1dfVEhSRVNIT0xEICAgICAwCisjZGVmaW5lIFJTU0lfVFJJR0dFUkVEX1VQT05fRVhDQ0VFRF9USFJFU0hPTEQgICAxCisjZGVmaW5lIFJTU0lfVEhSRVNIT0xEX0ZPUl9ST0FNSU5HICAgICAgICAgICAgICAyNQorI2RlZmluZSBSU1NJX0RFTFRBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNQorCisvLyBDaGFubmVsIFF1YWxpdHkgSW5kaWNhdGlvbgorI2RlZmluZSBDUUlfSVNfR09PRChjcWkpICAgICAgICAgICAgKChjcWkpID49IDUwKQorLy8jZGVmaW5lIENRSV9JU19GQUlSKGNxaSkgICAgICAgICAgKCgoY3FpKSA+PSAyMCkgJiYgKChjcWkpIDwgNTApKQorI2RlZmluZSBDUUlfSVNfUE9PUihjcWkpICAgICAgICAgICAgKGNxaSA8IDUwKSAgLy8oKChjcWkpID49IDUpICYmICgoY3FpKSA8IDIwKSkKKyNkZWZpbmUgQ1FJX0lTX0JBRChjcWkpICAgICAgICAgICAgIChjcWkgPCA1KQorI2RlZmluZSBDUUlfSVNfREVBRChjcWkpICAgICAgICAgICAgKGNxaSA9PSAwKQorCisvLyB3ZWlnaHRpbmcgZmFjdG9yIHRvIGNhbGN1bGF0ZSBDaGFubmVsIHF1YWxpdHksIHRvdGFsIHNob3VsZCBiZSAxMDAlCisjZGVmaW5lIFJTU0lfV0VJR0hUSU5HICAgICAgICAgICAgICAgICAgIDUwCisjZGVmaW5lIFRYX1dFSUdIVElORyAgICAgICAgICAgICAgICAgICAgIDMwCisjZGVmaW5lIFJYX1dFSUdIVElORyAgICAgICAgICAgICAgICAgICAgIDIwCisKKyNkZWZpbmUgQlNTX05PVF9GT1VORCAgICAgICAgICAgICAgICAgICAgMHhGRkZGRkZGRgorCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKyNkZWZpbmUgTUFYX0xFTl9PRl9NTE1FX1FVRVVFICAgICAgICAgICAgNDAgLy8xMAorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisjZGVmaW5lIFNDQU5fUEFTU0lWRSAgICAgICAgICAgICAgICAgICAgIDE4CQkvLyBzY2FuIHdpdGggbm8gcHJvYmUgcmVxdWVzdCwgb25seSB3YWl0IGJlYWNvbiBhbmQgcHJvYmUgcmVzcG9uc2UKKyNkZWZpbmUgU0NBTl9BQ1RJVkUgICAgICAgICAgICAgICAgICAgICAgMTkJCS8vIHNjYW4gd2l0aCBwcm9iZSByZXF1ZXN0LCBhbmQgd2FpdCBiZWFjb24gYW5kIHByb2JlIHJlc3BvbnNlCisjZGVmaW5lCVNDQU5fQ0lTQ09fUEFTU0lWRQkJCQkgMjAJCS8vIFNpbmdsZSBjaGFubmVsIHBhc3NpdmUgc2NhbgorI2RlZmluZQlTQ0FOX0NJU0NPX0FDVElWRQkJCQkgMjEJCS8vIFNpbmdsZSBjaGFubmVsIGFjdGl2ZSBzY2FuCisjZGVmaW5lCVNDQU5fQ0lTQ09fTk9JU0UJCQkJIDIyCQkvLyBTaW5nbGUgY2hhbm5lbCBwYXNzaXZlIHNjYW4gZm9yIG5vaXNlIGhpc3RvZ3JhbSBjb2xsZWN0aW9uCisjZGVmaW5lCVNDQU5fQ0lTQ09fQ0hBTk5FTF9MT0FECQkJIDIzCQkvLyBTaW5nbGUgY2hhbm5lbCBwYXNzaXZlIHNjYW4gZm9yIGNoYW5uZWwgbG9hZCBjb2xsZWN0aW9uCisjZGVmaW5lIEZBU1RfU0NBTl9BQ1RJVkUgICAgICAgICAgICAgICAgIDI0CQkvLyBzY2FuIHdpdGggcHJvYmUgcmVxdWVzdCwgYW5kIHdhaXQgYmVhY29uIGFuZCBwcm9iZSByZXNwb25zZQorCisjaWZkZWYgRE9UMTFOX0RSQUZUMworI2RlZmluZSBTQ0FOXzIwNDBfQlNTX0NPRVhJU1QgICAgICAgICAgICAgICAgICAyNgorI2VuZGlmIC8vIERPVDExTl9EUkFGVDMgLy8KKworI2RlZmluZSBNQUNfQUREUl9JU19HUk9VUChBZGRyKSAgICAgICAoKChBZGRyWzBdKSAmIDB4MDEpKQorI2RlZmluZSBNQUNfQUREUl9IQVNIKEFkZHIpICAgICAgICAgICAgKEFkZHJbMF0gXiBBZGRyWzFdIF4gQWRkclsyXSBeIEFkZHJbM10gXiBBZGRyWzRdIF4gQWRkcls1XSkKKyNkZWZpbmUgTUFDX0FERFJfSEFTSF9JTkRFWChBZGRyKSAgICAgIChNQUNfQUREUl9IQVNIKEFkZHIpICUgSEFTSF9UQUJMRV9TSVpFKQorI2RlZmluZSBUSURfTUFDX0hBU0goQWRkcixUSUQpICAgICAgICAgICAgKFRJRF5BZGRyWzBdIF4gQWRkclsxXSBeIEFkZHJbMl0gXiBBZGRyWzNdIF4gQWRkcls0XSBeIEFkZHJbNV0pCisjZGVmaW5lIFRJRF9NQUNfSEFTSF9JTkRFWChBZGRyLFRJRCkgICAgICAoVElEX01BQ19IQVNIKEFkZHIsVElEKSAlIEhBU0hfVEFCTEVfU0laRSkKKworLy8gTEVEIENvbnRyb2wKKy8vIGFzc29pYXRpb24gT04uIG9uZSBMRUQgT04uIGFub3RoZXIgYmxpbmtpbmcgd2hlbiBUWCwgT0ZGIHdoZW4gaWRsZQorLy8gbm8gYXNzb2NpYXRpb24sIGJvdGggTEVEIG9mZgorI2RlZmluZSBBU0lDX0xFRF9BQ1RfT04ocEFkKSAgICAgICAgUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX0NTUjE0LCAweDAwMDMxZTQ2KQorI2RlZmluZSBBU0lDX0xFRF9BQ1RfT0ZGKHBBZCkgICAgICAgUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX0NTUjE0LCAweDAwMDAxZTQ2KQorCisvLyBiaXQgZGVmaW5pdGlvbiBvZiB0aGUgMi1ieXRlIHBCRUFDT04tPkNhcGFiaWxpdHkgZmllbGQKKyNkZWZpbmUgQ0FQX0lTX0VTU19PTih4KSAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDAwMDEpICE9IDApCisjZGVmaW5lIENBUF9JU19JQlNTX09OKHgpICAgICAgICAgICAgICAgICgoKHgpICYgMHgwMDAyKSAhPSAwKQorI2RlZmluZSBDQVBfSVNfQ0ZfUE9MTEFCTEVfT04oeCkgICAgICAgICAoKCh4KSAmIDB4MDAwNCkgIT0gMCkKKyNkZWZpbmUgQ0FQX0lTX0NGX1BPTExfUkVRX09OKHgpICAgICAgICAgKCgoeCkgJiAweDAwMDgpICE9IDApCisjZGVmaW5lIENBUF9JU19QUklWQUNZX09OKHgpICAgICAgICAgICAgICgoKHgpICYgMHgwMDEwKSAhPSAwKQorI2RlZmluZSBDQVBfSVNfU0hPUlRfUFJFQU1CTEVfT04oeCkgICAgICAoKCh4KSAmIDB4MDAyMCkgIT0gMCkKKyNkZWZpbmUgQ0FQX0lTX1BCQ0NfT04oeCkgICAgICAgICAgICAgICAgKCgoeCkgJiAweDAwNDApICE9IDApCisjZGVmaW5lIENBUF9JU19BR0lMSVRZX09OKHgpICAgICAgICAgICAgICgoKHgpICYgMHgwMDgwKSAhPSAwKQorI2RlZmluZSBDQVBfSVNfU1BFQ1RSVU1fTUdNVCh4KSAgICAgICAgICAoKCh4KSAmIDB4MDEwMCkgIT0gMCkgIC8vIDgwMi4xMWUgZDkKKyNkZWZpbmUgQ0FQX0lTX1FPUyh4KSAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDAyMDApICE9IDApICAvLyA4MDIuMTFlIGQ5CisjZGVmaW5lIENBUF9JU19TSE9SVF9TTE9UKHgpICAgICAgICAgICAgICgoKHgpICYgMHgwNDAwKSAhPSAwKQorI2RlZmluZSBDQVBfSVNfQVBTRCh4KSAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MDgwMCkgIT0gMCkgIC8vIDgwMi4xMWUgZDkKKyNkZWZpbmUgQ0FQX0lTX0lNTUVEX0JBKHgpICAgICAgICAgICAgICAgKCgoeCkgJiAweDEwMDApICE9IDApICAvLyA4MDIuMTFlIGQ5CisjZGVmaW5lIENBUF9JU19EU1NTX09GRE0oeCkgICAgICAgICAgICAgICgoKHgpICYgMHgyMDAwKSAhPSAwKQorI2RlZmluZSBDQVBfSVNfREVMQVlfQkEoeCkgICAgICAgICAgICAgICAoKCh4KSAmIDB4NDAwMCkgIT0gMCkgIC8vIDgwMi4xMWUgZDkKKworI2RlZmluZSBDQVBfR0VORVJBVEUoZXNzLGlic3MscHJpdixzX3ByZSxzX3Nsb3Qsc3BlY3RydW0pICAoKChlc3MpID8gMHgwMDAxIDogMHgwMDAwKSB8ICgoaWJzcykgPyAweDAwMDIgOiAweDAwMDApIHwgKChwcml2KSA/IDB4MDAxMCA6IDB4MDAwMCkgfCAoKHNfcHJlKSA/IDB4MDAyMCA6IDB4MDAwMCkgfCAoKHNfc2xvdCkgPyAweDA0MDAgOiAweDAwMDApIHwgKChzcGVjdHJ1bSkgPyAweDAxMDAgOiAweDAwMDApKQorCisjZGVmaW5lIEVSUF9JU19OT05fRVJQX1BSRVNFTlQoeCkgICAgICAgICgoKHgpICYgMHgwMSkgIT0gMCkgICAgLy8gODAyLjExZworI2RlZmluZSBFUlBfSVNfVVNFX1BST1RFQ1RJT04oeCkgICAgICAgICAoKCh4KSAmIDB4MDIpICE9IDApICAgIC8vIDgwMi4xMWcKKyNkZWZpbmUgRVJQX0lTX1VTRV9CQVJLRVJfUFJFQU1CTEUoeCkgICAgKCgoeCkgJiAweDA0KSAhPSAwKSAgICAvLyA4MDIuMTFnCisKKyNkZWZpbmUgRFJTX1RYX1FVQUxJVFlfV09SU1RfQk9VTkQgICAgICAgOC8vIDMgIC8vIGp1c3QgdGVzdCBieSBnYXJ5CisjZGVmaW5lIERSU19QRU5BTFRZICAgICAgICAgICAgICAgICAgICAgIDgKKworI2RlZmluZSBCQV9OT1RVU0UgCTIKKy8vQkEgUG9saWN5IHN1YmZpbGVkIHZhbHVlIGluIEFEREJBIGZyYW1lCisjZGVmaW5lIElNTUVEX0JBIAkxCisjZGVmaW5lIERFTEFZX0JBCTAKKworLy8gQkEgSW5pdGlhdG9yIHN1YmZpZWxkIGluIERFTEJBIGZyYW1lCisjZGVmaW5lIE9SSUdJTkFUT1IJMQorI2RlZmluZSBSRUNJUElFTlQJMAorCisvLyBBRERCQSBTdGF0dXMgQ29kZQorI2RlZmluZSBBRERCQV9SRVNVTFRDT0RFX1NVQ0NFU1MJCQkJCTAKKyNkZWZpbmUgQUREQkFfUkVTVUxUQ09ERV9SRUZVU0VECQkJCQkzNworI2RlZmluZSBBRERCQV9SRVNVTFRDT0RFX0lOVkFMSURfUEFSQU1FVEVSUwkJCTM4CisKKy8vIERFTEJBIFJlYXNvbiBDb2RlCisjZGVmaW5lIERFTEJBX1JFQVNPTkNPREVfUVNUQV9MRUFWSU5HCQkJCTM2CisjZGVmaW5lIERFTEJBX1JFQVNPTkNPREVfRU5EX0JBCQkJCQkJMzcKKyNkZWZpbmUgREVMQkFfUkVBU09OQ09ERV9VTktOT1dOX0JBCQkJCQkzOAorI2RlZmluZSBERUxCQV9SRUFTT05DT0RFX1RJTUVPVVQJCQkJCTM5CisKKy8vIHJlc2V0IGFsbCBPbmVTZWNUeCBjb3VudGVycworI2RlZmluZSBSRVNFVF9PTkVfU0VDX1RYX0NOVChfX3BFbnRyeSkgXAoraWYgKCgoX19wRW50cnkpKSAhPSBOVUxMKSBcCit7IFwKKwkoX19wRW50cnkpLT5PbmVTZWNUeFJldHJ5T2tDb3VudCA9IDA7IFwKKwkoX19wRW50cnkpLT5PbmVTZWNUeEZhaWxDb3VudCA9IDA7IFwKKwkoX19wRW50cnkpLT5PbmVTZWNUeE5vUmV0cnlPa0NvdW50ID0gMDsgXAorfQorCisvLworLy8gODAyLjExIGZyYW1lIGZvcm1hdHMKKy8vCisvLyAgSFQgQ2FwYWJpbGl0eSBJTkZPIGZpZWxkIGluIEhUIENhcCBJRSAuCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgeworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwlVU0hPUlQJTFNJR1R4b3BQcm9TdXA6MTsKKwlVU0hPUlQJRm9ydHlfTWh6X0ludG9sZXJhbnQ6MTsKKwlVU0hPUlQJUFNNUDoxOworCVVTSE9SVAlDQ0ttb2RlaW40MDoxOworCVVTSE9SVAlBTXNkdVNpemU6MTsKKwlVU0hPUlQJRGVsYXllZEJBOjE7CS8vcnQyODYwYyBub3Qgc3VwcG9ydAorCVVTSE9SVAlSeFNUQkM6MjsKKwlVU0hPUlQJVHhTVEJDOjE7CisJVVNIT1JUCVNob3J0R0lmb3I0MDoxOwkvL2ZvcjQwTUh6CisJVVNIT1JUCVNob3J0R0lmb3IyMDoxOworCVVTSE9SVAlHRjoxOwkvL2dyZWVuIGZpZWxkCisJVVNIT1JUCU1pbW9QczoyOy8vbW9taSBwb3dlciBzYWZlCisJVVNIT1JUCUNoYW5uZWxXaWR0aDoxOworCVVTSE9SVAlBZHZDb2Rpbmc6MTsKKyNlbHNlCisJVVNIT1JUCUFkdkNvZGluZzoxOworCVVTSE9SVAlDaGFubmVsV2lkdGg6MTsKKwlVU0hPUlQJTWltb1BzOjI7Ly9tb21pIHBvd2VyIHNhZmUKKwlVU0hPUlQJR0Y6MTsJLy9ncmVlbiBmaWVsZAorCVVTSE9SVAlTaG9ydEdJZm9yMjA6MTsKKwlVU0hPUlQJU2hvcnRHSWZvcjQwOjE7CS8vZm9yNDBNSHoKKwlVU0hPUlQJVHhTVEJDOjE7CisJVVNIT1JUCVJ4U1RCQzoyOworCVVTSE9SVAlEZWxheWVkQkE6MTsJLy9ydDI4NjBjIG5vdCBzdXBwb3J0CisJVVNIT1JUCUFNc2R1U2l6ZToxOwkvLyBvbmx5IHN1cHBvcnQgYXMgemVybworCVVTSE9SVAlDQ0ttb2RlaW40MDoxOworCVVTSE9SVAlQU01QOjE7CisJVVNIT1JUCUZvcnR5X01oel9JbnRvbGVyYW50OjE7CisJVVNIT1JUCUxTSUdUeG9wUHJvU3VwOjE7CisjZW5kaWYJLyogIVJUX0JJR19FTkRJQU4gKi8KK30gSFRfQ0FQX0lORk8sICpQSFRfQ0FQX0lORk87CisKKy8vICBIVCBDYXBhYmlsaXR5IElORk8gZmllbGQgaW4gSFQgQ2FwIElFIC4KK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCB7CisjaWZkZWYgUlRfQklHX0VORElBTgorCVVDSEFSCXJzdjozOy8vbW9taSBwb3dlciBzYWZlCisJVUNIQVIJTXBkdURlbnNpdHk6MzsKKwlVQ0hBUglNYXhSQW1wZHVGYWN0b3I6MjsKKyNlbHNlCisJVUNIQVIJTWF4UkFtcGR1RmFjdG9yOjI7CisJVUNIQVIJTXBkdURlbnNpdHk6MzsKKwlVQ0hBUglyc3Y6MzsvL21vbWkgcG93ZXIgc2FmZQorI2VuZGlmIC8qICFSVF9CSUdfRU5ESUFOICovCit9IEhUX0NBUF9QQVJNLCAqUEhUX0NBUF9QQVJNOworCisvLyAgSFQgQ2FwYWJpbGl0eSBJTkZPIGZpZWxkIGluIEhUIENhcCBJRSAuCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgeworCVVDSEFSCU1DU1NldFsxMF07CisJVUNIQVIJU3VwUmF0ZVsyXTsgIC8vIHVuaXQgOiAxTWJwcworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwlVQ0hBUglyc3Y6MzsKKwlVQ0hBUglNcGR1RGVuc2l0eToxOworCVVDSEFSCVR4U3RyZWFtOjI7CisJVUNIQVIJVHhSeE5vdEVxdWFsOjE7CisJVUNIQVIJVHhNQ1NTZXREZWZpbmVkOjE7CisjZWxzZQorCVVDSEFSCVR4TUNTU2V0RGVmaW5lZDoxOworCVVDSEFSCVR4UnhOb3RFcXVhbDoxOworCVVDSEFSCVR4U3RyZWFtOjI7CisJVUNIQVIJTXBkdURlbnNpdHk6MTsKKwlVQ0hBUglyc3Y6MzsKKyNlbmRpZiAvLyBSVF9CSUdfRU5ESUFOIC8vCisJVUNIQVIJcnN2M1szXTsKK30gSFRfTUNTX1NFVCwgKlBIVF9NQ1NfU0VUOworCisvLyAgSFQgQ2FwYWJpbGl0eSBJTkZPIGZpZWxkIGluIEhUIENhcCBJRSAuCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgeworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwlVU0hPUlQJcnN2Mjo0OworCVVTSE9SVAlSREdTdXBwb3J0OjE7CS8vcmV2ZXJzZSBEaXJlY3Rpb24gR3JhbnQgIHN1cHBvcnQKKwlVU0hPUlQJUGx1c0hUQzoxOwkvLytIVEMgY29udHJvbCBmaWVsZCBzdXBwb3J0CisJVVNIT1JUCU1DU0ZlZWRiYWNrOjI7CS8vMDpubyBNQ1MgZmVlZGJhY2ssIDI6dW5zb2xpY2l0ZWQgTUNTIGZlZWRiYWNrLCAzOkZ1bGwgTUNTIGZlZWRiYWNrLCAgMTpyc3YuCisJVVNIT1JUCXJzdjo1Oy8vbW9taSBwb3dlciBzYWZlCisJVVNIT1JUCVRyYW5UaW1lOjI7CisJVVNIT1JUCVBjbzoxOworI2Vsc2UKKwlVU0hPUlQJUGNvOjE7CisJVVNIT1JUCVRyYW5UaW1lOjI7CisJVVNIT1JUCXJzdjo1Oy8vbW9taSBwb3dlciBzYWZlCisJVVNIT1JUCU1DU0ZlZWRiYWNrOjI7CS8vMDpubyBNQ1MgZmVlZGJhY2ssIDI6dW5zb2xpY2l0ZWQgTUNTIGZlZWRiYWNrLCAzOkZ1bGwgTUNTIGZlZWRiYWNrLCAgMTpyc3YuCisJVVNIT1JUCVBsdXNIVEM6MTsJLy8rSFRDIGNvbnRyb2wgZmllbGQgc3VwcG9ydAorCVVTSE9SVAlSREdTdXBwb3J0OjE7CS8vcmV2ZXJzZSBEaXJlY3Rpb24gR3JhbnQgIHN1cHBvcnQKKwlVU0hPUlQJcnN2Mjo0OworI2VuZGlmIC8qIFJUX0JJR19FTkRJQU4gKi8KK30gRVhUX0hUX0NBUF9JTkZPLCAqUEVYVF9IVF9DQVBfSU5GTzsKKworLy8gIEhUIEJlYW1mb3JtaW5nIGZpZWxkIGluIEhUIENhcCBJRSAuCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX0hUX0JGX0NBUHsKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJVUxPTkcJcnN2OjM7CisJVUxPTkcJQ2hhbkVzdGltYXRpb246MjsKKwlVTE9ORwlDU0lSb3dCRlN1cDoyOworCVVMT05HCUNvbVN0ZWVyQkZBbnRTdXA6MjsKKwlVTE9ORwlOb0NvbVN0ZWVyQkZBbnRTdXA6MjsKKwlVTE9ORwlDU0lCRkFudFN1cDoyOworCVVMT05HCU1pbkdyb3VwaW5nOjI7CisJVUxPTkcJRXhwQ29tQkY6MjsKKwlVTE9ORwlFeHBOb0NvbUJGOjI7CisJVUxPTkcJRXhwQ1NJRmJrOjI7CisJVUxPTkcJRXhwQ29tU3RlZXJDYXBhYmxlOjE7CisJVUxPTkcJRXhwTm9Db21TdGVlckNhcGFibGU6MTsKKwlVTE9ORwlFeHBDU0lDYXBhYmxlOjE7CisJVUxPTkcJQ2FsaWJyYXRpb246MjsKKwlVTE9ORwlJbXBUeEJGQ2FwYWJsZToxOworCVVMT05HCVR4TkRQQ2FwYWJsZToxOworCVVMT05HCVJ4TkRQQ2FwYWJsZToxOworCVVMT05HCVR4U291bmRDYXBhYmxlOjE7CisJVUxPTkcJUnhTb3VuZENhcGFibGU6MTsKKwlVTE9ORwlUeEJGUmVjQ2FwYWJsZToxOworI2Vsc2UKKwlVTE9ORwlUeEJGUmVjQ2FwYWJsZToxOworCVVMT05HCVJ4U291bmRDYXBhYmxlOjE7CisJVUxPTkcJVHhTb3VuZENhcGFibGU6MTsKKwlVTE9ORwlSeE5EUENhcGFibGU6MTsKKwlVTE9ORwlUeE5EUENhcGFibGU6MTsKKwlVTE9ORwlJbXBUeEJGQ2FwYWJsZToxOworCVVMT05HCUNhbGlicmF0aW9uOjI7CisJVUxPTkcJRXhwQ1NJQ2FwYWJsZToxOworCVVMT05HCUV4cE5vQ29tU3RlZXJDYXBhYmxlOjE7CisJVUxPTkcJRXhwQ29tU3RlZXJDYXBhYmxlOjE7CisJVUxPTkcJRXhwQ1NJRmJrOjI7CisJVUxPTkcJRXhwTm9Db21CRjoyOworCVVMT05HCUV4cENvbUJGOjI7CisJVUxPTkcJTWluR3JvdXBpbmc6MjsKKwlVTE9ORwlDU0lCRkFudFN1cDoyOworCVVMT05HCU5vQ29tU3RlZXJCRkFudFN1cDoyOworCVVMT05HCUNvbVN0ZWVyQkZBbnRTdXA6MjsKKwlVTE9ORwlDU0lSb3dCRlN1cDoyOworCVVMT05HCUNoYW5Fc3RpbWF0aW9uOjI7CisJVUxPTkcJcnN2OjM7CisjZW5kaWYgLy8gUlRfQklHX0VORElBTiAvLworfSBIVF9CRl9DQVAsICpQSFRfQkZfQ0FQOworCisvLyAgSFQgYW50ZW5uYSBzZWxlY3Rpb24gZmllbGQgaW4gSFQgQ2FwIElFIC4KK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfSFRfQVNfQ0FQeworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwlVQ0hBUglyc3Y6MTsKKwlVQ0hBUglUeFNvdW5kUFBEVToxOworCVVDSEFSCVJ4QVNlbDoxOworCVVDSEFSCUFudEluZEZiazoxOworCVVDSEFSCUV4cENTSUZiazoxOworCVVDSEFSCUFudEluZEZia1R4QVNFTDoxOworCVVDSEFSCUV4cENTSUZia1R4QVNFTDoxOworCVVDSEFSCUFudFNlbGVjdDoxOworI2Vsc2UKKwlVQ0hBUglBbnRTZWxlY3Q6MTsKKwlVQ0hBUglFeHBDU0lGYmtUeEFTRUw6MTsKKwlVQ0hBUglBbnRJbmRGYmtUeEFTRUw6MTsKKwlVQ0hBUglFeHBDU0lGYms6MTsKKwlVQ0hBUglBbnRJbmRGYms6MTsKKwlVQ0hBUglSeEFTZWw6MTsKKwlVQ0hBUglUeFNvdW5kUFBEVToxOworCVVDSEFSCXJzdjoxOworI2VuZGlmIC8vIFJUX0JJR19FTkRJQU4gLy8KK30gSFRfQVNfQ0FQLCAqUEhUX0FTX0NBUDsKKworLy8gRHJhZnQgMS4wIHNldCBJRSBsZW5ndGggMjYsIGJ1dCBpcyBleHRlbnNpYmxlLi4KKyNkZWZpbmUgU0laRV9IVF9DQVBfSUUJCTI2CisvLyBUaGUgc3RydWN0dXJlIGZvciBIVCBDYXBhYmlsaXR5IElFLgordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9IVF9DQVBBQklMSVRZX0lFeworCUhUX0NBUF9JTkZPCQlIdENhcEluZm87CisJSFRfQ0FQX1BBUk0JCUh0Q2FwUGFybTsKKy8vCUhUX01DU19TRVQJCUh0TUNTU2V0OworCVVDSEFSCQkJTUNTU2V0WzE2XTsKKwlFWFRfSFRfQ0FQX0lORk8JRXh0SHRDYXBJbmZvOworCUhUX0JGX0NBUAkJVHhCRkNhcDsJLy8gYmVhbWZvcm1pbmcgY2FwLiBydDI4NjBjIG5vdCBzdXBwb3J0IGJlYW1mb3JtaW5nLgorCUhUX0FTX0NBUAkJQVNDYXA7CS8vYW50ZW5uYSBzZWxlY3Rpb24uCit9IEhUX0NBUEFCSUxJVFlfSUUsICpQSFRfQ0FQQUJJTElUWV9JRTsKKworCisvLyA4MDIuMTFuIGRyYWZ0MyByZWxhdGVkIHN0cnVjdHVyZSBkZWZpbml0aW9ucy4KKy8vIDcuMy4yLjYwCisjZGVmaW5lIGRvdDExT0JTU1NjYW5QYXNzaXZlRHdlbGwJCQkJCQkJMjAJLy8gaW4gVFUuIG1pbiBhbW91bnQgb2YgdGltZSB0aGF0IHRoZSBTVEEgY29udGlub3VzbHkgc2NhbnMgZWFjaCBjaGFubmVsIHdoZW4gcGVyZm9ybWluZyBhbiBhY3RpdmUgT0JTUyBzY2FuLgorI2RlZmluZSBkb3QxMU9CU1NTY2FuQWN0aXZlRHdlbGwJCQkJCQkJMTAJLy8gaW4gVFUubWluIGFtb3VudCBvZiB0aW1lIHRoYXQgdGhlIFNUQSBjb250aW5vdXNseSBzY2FucyBlYWNoIGNoYW5uZWwgd2hlbiBwZXJmb3JtaW5nIGFuIHBhc3NpdmUgT0JTUyBzY2FuLgorI2RlZmluZSBkb3QxMUJTU1dpZHRoVHJpZ2dlclNjYW5JbnRlcnZhbAkJCQkJMzAwICAvLyBpbiBzZWMuIG1heCBpbnRlcnZhbCBiZXR3ZWVuIHNjYW4gb3BlcmF0aW9ucyB0byBiZSBwZXJmb3JtZWQgdG8gZGV0ZWN0IEJTUyBjaGFubmVsIHdpZHRoIHRyaWdnZXIgZXZlbnRzLgorI2RlZmluZSBkb3QxMU9CU1NTY2FuUGFzc2l2ZVRvdGFsUGVyQ2hhbm5lbAkJCQkJMjAwCS8vIGluIFRVLiBtaW4gdG90YWwgYW1vdW50IG9mIHRpbWUgdGhhdCB0aGUgU1RBIHNjYW5zIGVhY2ggY2hhbm5lbCB3aGVuIHBlcmZvcm1pbmcgYSBwYXNzaXZlIE9CU1Mgc2Nhbi4KKyNkZWZpbmUgZG90MTFPQlNTU2NhbkFjdGl2ZVRvdGFsUGVyQ2hhbm5lbAkJCQkJMjAJLy9pbiBUVS4gbWluIHRvdGFsIGFtb3VudCBvZiB0aW1lIHRoYXQgdGhlIFNUQSBzY2FucyBlYWNoIGNoYW5uZWwgd2hlbiBwZXJmb3JtaW5nIGEgYWN0aXZlIE9CU1Mgc2NhbgorI2RlZmluZSBkb3QxMUJTU1dpZHRoQ2hhbm5lbFRyYW5zYWN0aW9uRGVsYXlGYWN0b3IJCQk1CS8vIG1pbiByYXRpbyBiZXR3ZWVuIHRoZSBkZWxheSB0aW1lIGluIHBlcmZvcm1pbmcgYSBzd2l0Y2ggZnJvbSAyME1IeiBCU1MgdG8gMjAvNDAgQlNTIG9wZXJhdGlvbiBhbmQgdGhlIG1heGltYQorCQkJCQkJCQkJCQkJCQkJCS8vCWludGVydmFsIGJldHdlZW4gb3ZlcmxhcHBpbmcgQlNTIHNjYW4gb3BlcmF0aW9ucy4KKyNkZWZpbmUgZG90MTFCU1NTY2FuQWN0aXZpdHlUaHJlc2hvbGQJCQkJCQkyNQkvLyBpbiAlJSwgbWF4IHRvdGFsIHRpbWUgdGhhdCBhIFNUQSBtYXkgYmUgYWN0aXZlIG9uIHRoZSBtZWRpdW0gZHVyaW5nIGEgcGVyaW9kIG9mCisJCQkJCQkJCQkJCQkJCQkJLy8JKGRvdDExQlNTV2lkdGhDaGFubmVsVHJhbnNhY3Rpb25EZWxheUZhY3RvciAqIGRvdDExQlNTV2lkdGhUcmlnZ2VyU2NhbkludGVydmFsKSBzZWNvbmRzIHdpdGhvdXQKKwkJCQkJCQkJCQkJCQkJCQkvLwliZWluZyBvYmxpZ2F0ZWQgdG8gcGVyZm9ybSBPQlNTIFNjYW4gb3BlcmF0aW9ucy4gZGVmYXVsdCBpcyAyNSg9PSAwLjI1JSkKKwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9PVkVSTEFQX0JTU19TQ0FOX0lFeworCVVTSE9SVAkJU2NhblBhc3NpdmVEd2VsbDsKKwlVU0hPUlQJCVNjYW5BY3RpdmVEd2VsbDsKKwlVU0hPUlQJCVRyaWdnZXJTY2FuSW50OwkJCQkvLyBUcmlnZ2VyIHNjYW4gaW50ZXJ2YWwKKwlVU0hPUlQJCVBhc3NpdmVUYWxQZXJDaGFubmVsOwkJLy8gcGFzc2l2ZSB0b3RhbCBwZXIgY2hhbm5lbAorCVVTSE9SVAkJQWN0aXZlVGFsUGVyQ2hhbm5lbDsJCS8vIGFjdGl2ZSB0b3RhbCBwZXIgY2hhbm5lbAorCVVTSE9SVAkJRGVsYXlGYWN0b3I7CQkJCS8vIEJTUyB3aWR0aCBjaGFubmVsIHRyYW5zaXRpb24gZGVsYXkgZmFjdG9yCisJVVNIT1JUCQlTY2FuQWN0VGhyZTsJCQkJLy8gU2NhbiBBY3Rpdml0eSB0aHJlc2hvbGQKK31PVkVSTEFQX0JTU19TQ0FOX0lFLCAqUE9WRVJMQVBfQlNTX1NDQU5fSUU7CisKKworLy8gIDcuMy4yLjU2LiAyMC80MCBDb2V4aXN0ZW5jZSBlbGVtZW50IHVzZWQgaW4gIEVsZW1lbnQgSUQgPSA3MiA9IElFXzIwNDBfQlNTX0NPRVhJU1QKK3R5cGVkZWYgdW5pb24gUEFDS0VEIF9CU1NfMjA0MF9DT0VYSVNUX0lFeworIHN0cnVjdCBQQUNLRUQgeworICNpZmRlZiBSVF9CSUdfRU5ESUFOCisJVUNIQVIJcnN2OjU7CisJVUNIQVIJQlNTMjBXaWR0aFJlcToxOworCVVDSEFSCUludG9sZXJhbnQ0MDoxOworCVVDSEFSCUluZm9SZXE6MTsKKyAjZWxzZQorCVVDSEFSCUluZm9SZXE6MTsKKwlVQ0hBUglJbnRvbGVyYW50NDA6MTsJCQkvLyBJbnRlci1CU1MuIHNldCAxIHdoZW4gcHJvaGliaXRzIGEgcmVjZWl2aW5nIEJTUyBmcm9tIG9wZXJhdGluZyBhcyBhIDIwLzQwIE1oeiBCU1MuCisJVUNIQVIJQlNTMjBXaWR0aFJlcToxOwkJLy8gSW50cmEtQlNTIHNldCAxIHdoZW4gcHJvaGliaXRzIGEgcmVjZWl2aW5nIEFQIGZyb20gb3BlcmF0aW5nIGl0cyBCU1MgYXMgYSAyMC80ME1IeiBCU1MuCisJVUNIQVIJcnN2OjU7CisjZW5kaWYgLy8gUlRfQklHX0VORElBTiAvLworICAgIH0gZmllbGQ7CisgVUNIQVIgICB3b3JkOworfSBCU1NfMjA0MF9DT0VYSVNUX0lFLCAqUEJTU18yMDQwX0NPRVhJU1RfSUU7CisKKwordHlwZWRlZiBzdHJ1Y3QgIF9UUklHR0VSX0VWRU5UQXsKKwlCT09MRUFOCQkJYlZhbGlkOworCVVDSEFSCUJTU0lEWzZdOworCVVDSEFSCVJlZ0NsYXNzOwkvLyBSZWd1bGF0b3J5IENsYXNzCisJVVNIT1JUCUNoYW5uZWw7CisJVUxPTkcJQ0RDb3VudGVyOyAgIC8vIE1haW50YWluIGEgc2VwZXJhdGUgY291bnQgZG93biBjb3VudGVyIGZvciBlYWNoIEV2ZW50IEEuCit9IFRSSUdHRVJfRVZFTlRBLCAqUFRSSUdHRVJfRVZFTlRBOworCisvLyAyMC80MCB0cmlnZ2VyIGV2ZW50IHRhYmxlCisvLyBJZiBvbmUgRXZlbnQgQSBkZWxldGUgb3IgY3JlYXRlZCwgb3IgaWYgRXZlbnQgQiBpcyBkZXRlY3RlZCBvciBub3QgZGV0ZWN0ZWQsIFNUQSBzaG91bGQgc2VuZCAyMDQwQlNTQ29leGlzdGVuY2UgdG8gQVAuCisjZGVmaW5lIE1BWF9UUklHR0VSX0VWRU5UCQk2NAordHlwZWRlZiBzdHJ1Y3QgIF9UUklHR0VSX0VWRU5UX1RBQnsKKwlVQ0hBUglFdmVudEFObzsKKwlUUklHR0VSX0VWRU5UQQlFdmVudEFbTUFYX1RSSUdHRVJfRVZFTlRdOworCVVMT05HCQkJRXZlbnRCQ291bnREb3duOwkvLyBDb3VudCBkb3duIGNvdW50ZXIgZm9yIEV2ZW50IEIuCit9IFRSSUdHRVJfRVZFTlRfVEFCLCAqUFRSSUdHRVJfRVZFTlRfVEFCOworCisvLyA3LjMuMjcgMjAvNDAgQnNzIENvZXhpc3RlbmNlIE1nbXQgY2FwYWJpbGl0eSB1c2VkIGluIGV4dGVuZGVkIGNhcGFiaWxpdGllcyBpbmZvcm1hdGlvbiBJRSggSUQgPSAxMjcgPSBJRV9FWFRfQ0FQQUJJTElUWSkuCisvLwlUaGlzIGlzIHRoZSBmaXJzdCBvY3RldCBhbmQgd2FzIGRlZmluZWQgaW4gODAyLjExbiBEMy4wMyBhbmQgODAyLjExeUQ5LjAKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfRVhUX0NBUF9JTkZPX0VMRU1FTlR7CisjaWZkZWYgUlRfQklHX0VORElBTgorCVVDSEFSCXJzdjI6NTsKKwlVQ0hBUglFeHRlbmRDaGFubmVsU3dpdGNoOjE7CisJVUNIQVIJcnN2OjE7CisJVUNIQVIJQnNzQ29leGlzdE1nbXRTdXBwb3J0OjE7CisjZWxzZQorCVVDSEFSCUJzc0NvZXhpc3RNZ210U3VwcG9ydDoxOworCVVDSEFSCXJzdjoxOworCVVDSEFSCUV4dGVuZENoYW5uZWxTd2l0Y2g6MTsKKwlVQ0hBUglyc3YyOjU7CisjZW5kaWYgLy8gUlRfQklHX0VORElBTiAvLworfUVYVF9DQVBfSU5GT19FTEVNRU5ULCAqUEVYVF9DQVBfSU5GT19FTEVNRU5UOworCisKKy8vIDgwMi4xMW4gNy4zLjIuNjEKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfQlNTXzIwNDBfQ09FWElTVF9FTEVNRU5UeworCVVDSEFSCQkJCQlFbGVtZW50SUQ7CQkvLyBJRCA9IElFXzIwNDBfQlNTX0NPRVhJU1QgPSA3MgorCVVDSEFSCQkJCQlMZW47CisJQlNTXzIwNDBfQ09FWElTVF9JRQkJQnNzQ29leGlzdEllOworfUJTU18yMDQwX0NPRVhJU1RfRUxFTUVOVCwgKlBCU1NfMjA0MF9DT0VYSVNUX0VMRU1FTlQ7CisKKworLy84MDIuMTFuIDcuMy4yLjU5Cit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX0JTU18yMDQwX0lOVE9MRVJBTlRfQ0hfUkVQT1JUeworCVVDSEFSCQkJCUVsZW1lbnRJRDsJCS8vIElEID0gSUVfMjA0MF9CU1NfSU5UT0xFUkFOVF9SRVBPUlQgPSA3MworCVVDSEFSCQkJCUxlbjsKKwlVQ0hBUgkJCQlSZWd1bGF0b3J5Q2xhc3M7CisJVUNIQVIJCQkJQ2hMaXN0WzBdOworfUJTU18yMDQwX0lOVE9MRVJBTlRfQ0hfUkVQT1JULCAqUEJTU18yMDQwX0lOVE9MRVJBTlRfQ0hfUkVQT1JUOworCisKKy8vIFRoZSBzdHJ1Y3R1cmUgZm9yIGNoYW5uZWwgc3dpdGNoIGFubm91Y2VtZW50IElFLiBUaGlzIGlzIGluIDgwMi4xMW4gRDMuMDMKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfQ0hBX1NXSVRDSF9BTk5PVU5DRV9JRXsKKwlVQ0hBUgkJCVN3aXRjaE1vZGU7CS8vY2hhbm5lbCBzd2l0Y2ggbW9kZQorCVVDSEFSCQkJTmV3Q2hhbm5lbDsJLy8KKwlVQ0hBUgkJCVN3aXRjaENvdW50OwkvLworfSBDSEFfU1dJVENIX0FOTk9VTkNFX0lFLCAqUENIQV9TV0lUQ0hfQU5OT1VOQ0VfSUU7CisKKworLy8gVGhlIHN0cnVjdHVyZSBmb3IgY2hhbm5lbCBzd2l0Y2ggYW5ub3VjZW1lbnQgSUUuIFRoaXMgaXMgaW4gODAyLjExbiBEMy4wMwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9TRUNfQ0hBX09GRlNFVF9JRXsKKwlVQ0hBUgkJCVNlY29uZGFyeUNoYW5uZWxPZmZzZXQ7CSAvLyAxOiBTZWNvbmRhcnkgYWJvdmUsIDM6IFNlY29uZGFyeSBiZWxvdywgMDogbm8gU2Vjb25kYXJ5Cit9IFNFQ19DSEFfT0ZGU0VUX0lFLCAqUFNFQ19DSEFfT0ZGU0VUX0lFOworCisKKy8vIFRoaXMgc3RydWN0dXJlIGlzIGV4dHJhY3RlZCBmcm9tIHN0cnVjdCBSVF9IVF9DQVBBQklMSVRZCit0eXBlZGVmIHN0cnVjdCB7CisJQk9PTEVBTgkJCWJIdEVuYWJsZTsJIC8vIElmIHdlIHNob3VsZCB1c2UgaHQgcmF0ZS4KKwlCT09MRUFOCQkJYlByZU5IdDsJIC8vIElmIHdlIHNob3VsZCB1c2UgaHQgcmF0ZS4KKwkvL1N1YnN0cmFjdCBmcm9tIEhUIENhcGFiaWxpdHkgSUUKKwlVQ0hBUgkJCU1DU1NldFsxNl07CS8vb25seSBzdXBvb3J0IE1DUz0wLTE1LDMyICwKK30gUlRfSFRfUEhZX0lORk8sICpQUlRfSFRfUEhZX0lORk87CisKKy8vVGhpcyBzdHJ1Y3R1cmUgc3Vic3RyYWN0cyByYWxpbmsgc3VwcG9ydHMgZnJvbSBhbGwgODAyLjExbi1yZWxhdGVkIGZlYXR1cmVzLgorLy9GZWF0dXJlcyBub3QgbGlzdGVkIGhlcmUgYnV0IGNvbnRhaW5lZCBpbiA4MDIuMTFuIHNwZWMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gcnQyODYwLgordHlwZWRlZiBzdHJ1Y3QgeworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwlVU0hPUlQJcnN2OjU7CisJVVNIT1JUCUFtc2R1U2l6ZToxOwkvLyBNYXggcmVjZWl2aW5nIEEtTVNEVSBzaXplCisJVVNIT1JUCUFtc2R1RW5hYmxlOjE7CS8vIEVuYWJsZSB0byB0cmFuc21pdCBBLU1TRFUuIFN1Z2dlc3QgZGlzYWJsZS4gV2Ugc2hvdWxkIHVzZSBBLU1QRFUgdG8gZ2FpbiBiZXN0IGJlbmlmaXQgb2YgODAyLjExbgorCVVTSE9SVAlSeFNUQkM6MjsJLy8gMiBiaXRzCisJVVNIT1JUCVR4U1RCQzoxOworCVVTSE9SVAlTaG9ydEdJZm9yNDA6MTsJLy9mb3I0ME1IegorCVVTSE9SVAlTaG9ydEdJZm9yMjA6MTsKKwlVU0hPUlQJR0Y6MTsJLy9ncmVlbiBmaWVsZAorCVVTSE9SVAlNaW1vUHM6MjsvL21pbW8gcG93ZXIgc2FmZSBNTVBTXworCVVTSE9SVAlDaGFubmVsV2lkdGg6MTsKKyNlbHNlCisJVVNIT1JUCUNoYW5uZWxXaWR0aDoxOworCVVTSE9SVAlNaW1vUHM6MjsvL21pbW8gcG93ZXIgc2FmZSBNTVBTXworCVVTSE9SVAlHRjoxOwkvL2dyZWVuIGZpZWxkCisJVVNIT1JUCVNob3J0R0lmb3IyMDoxOworCVVTSE9SVAlTaG9ydEdJZm9yNDA6MTsJLy9mb3I0ME1IegorCVVTSE9SVAlUeFNUQkM6MTsKKwlVU0hPUlQJUnhTVEJDOjI7CS8vIDIgYml0cworCVVTSE9SVAlBbXNkdUVuYWJsZToxOwkvLyBFbmFibGUgdG8gdHJhbnNtaXQgQS1NU0RVLiBTdWdnZXN0IGRpc2FibGUuIFdlIHNob3VsZCB1c2UgQS1NUERVIHRvIGdhaW4gYmVzdCBiZW5pZml0IG9mIDgwMi4xMW4KKwlVU0hPUlQJQW1zZHVTaXplOjE7CS8vIE1heCByZWNlaXZpbmcgQS1NU0RVIHNpemUKKwlVU0hPUlQJcnN2OjU7CisjZW5kaWYKKworCS8vU3Vic3RyYWN0IGZyb20gQWRkaW9udCBIVCBJTkZPIElFCisjaWZkZWYgUlRfQklHX0VORElBTgorCVVDSEFSCVJlY29tV2lkdGg6MTsKKwlVQ0hBUglFeHRDaGFuT2Zmc2V0OjI7CS8vIFBsZWFzZSBub3QgdGhlIGRpZmZlcmVuY2Ugd2l0aCBmb2xsb3dpbmcgCVVDSEFSCU5ld0V4dENoYW5uZWxPZmZzZXQ7IGZyb20gODAyLjExbgorCVVDSEFSCU1wZHVEZW5zaXR5OjM7CisJVUNIQVIJTWF4UkFtcGR1RmFjdG9yOjI7CisjZWxzZQorCVVDSEFSCU1heFJBbXBkdUZhY3RvcjoyOworCVVDSEFSCU1wZHVEZW5zaXR5OjM7CisJVUNIQVIJRXh0Q2hhbk9mZnNldDoyOwkvLyBQbGVhc2Ugbm90IHRoZSBkaWZmZXJlbmNlIHdpdGggZm9sbG93aW5nIAlVQ0hBUglOZXdFeHRDaGFubmVsT2Zmc2V0OyBmcm9tIDgwMi4xMW4KKwlVQ0hBUglSZWNvbVdpZHRoOjE7CisjZW5kaWYKKworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwlVU0hPUlQJcnN2MjoxMTsKKwlVU0hPUlQJT0JTU19Ob25IVEV4aXN0OjE7CisJVVNIT1JUCXJzdjM6MTsKKwlVU0hPUlQJTm9uR2ZQcmVzZW50OjE7CisJVVNIT1JUCU9wZXJhaW9uTW9kZToyOworI2Vsc2UKKwlVU0hPUlQJT3BlcmFpb25Nb2RlOjI7CisJVVNIT1JUCU5vbkdmUHJlc2VudDoxOworCVVTSE9SVAlyc3YzOjE7CisJVVNIT1JUCU9CU1NfTm9uSFRFeGlzdDoxOworCVVTSE9SVAlyc3YyOjExOworI2VuZGlmCisKKwkvLyBOZXcgRXh0ZW5zaW9uIENoYW5uZWwgT2Zmc2V0IElFCisJVUNIQVIJTmV3RXh0Q2hhbm5lbE9mZnNldDsKKwkvLyBFeHRlbnNpb24gQ2FwYWJpbGl0eSBJRSA9IDEyNworCVVDSEFSCUJTU0NvZXhpc3QyMDQwOworfSBSVF9IVF9DQVBBQklMSVRZLCAqUFJUX0hUX0NBUEFCSUxJVFk7CisKKy8vICAgZmllbGQgaW4gQWRkdGlvbmFsIEhUIEluZm9ybWF0aW9uIElFIC4KK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCB7CisjaWZkZWYgUlRfQklHX0VORElBTgorCVVDSEFSCVNlckludGVyR3JhbnU6MzsKKwlVQ0hBUglTX1BTTVBTdXA6MTsKKwlVQ0hBUglSaWZzTW9kZToxOworCVVDSEFSCVJlY29tV2lkdGg6MTsKKwlVQ0hBUglFeHRDaGFuT2Zmc2V0OjI7CisjZWxzZQorCVVDSEFSCUV4dENoYW5PZmZzZXQ6MjsKKwlVQ0hBUglSZWNvbVdpZHRoOjE7CisJVUNIQVIJUmlmc01vZGU6MTsKKwlVQ0hBUglTX1BTTVBTdXA6MTsJIC8vSW5kaWNhdGUgc3VwcG9ydCBmb3Igc2NoZWR1bGVkIFBTTVAKKwlVQ0hBUglTZXJJbnRlckdyYW51OjM7CSAvL3NlcnZpY2UgaW50ZXJ2YWwgZ3JhbnVsYXJpdHkKKyNlbmRpZgorfSBBRERfSFRJTkZPLCAqUEFERF9IVElORk87CisKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRHsKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJVVNIT1JUCXJzdjI6MTE7CisJVVNIT1JUCU9CU1NfTm9uSFRFeGlzdDoxOworCVVTSE9SVAlyc3Y6MTsKKwlVU0hPUlQJTm9uR2ZQcmVzZW50OjE7CisJVVNIT1JUCU9wZXJhaW9uTW9kZToyOworI2Vsc2UKKwlVU0hPUlQJT3BlcmFpb25Nb2RlOjI7CisJVVNIT1JUCU5vbkdmUHJlc2VudDoxOworCVVTSE9SVAlyc3Y6MTsKKwlVU0hPUlQJT0JTU19Ob25IVEV4aXN0OjE7CisJVVNIT1JUCXJzdjI6MTE7CisjZW5kaWYKK30gQUREX0hUSU5GTzIsICpQQUREX0hUSU5GTzI7CisKKworLy8gVE9ETzogTmVlZCBzeW5jIHdpdGggc3BlYyBhYm91dCB0aGUgZGVmaW5pdGlvbiBvZiBTdGJjTWNzLiBJbiBEcmFmdCAzLjAzLCBpdCdzIHJlc2VydmVkLgordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEeworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwlVU0hPUlQJcnN2OjQ7CisJVVNIT1JUCVBjb1BoYXNlOjE7CisJVVNIT1JUCVBjb0FjdGl2ZToxOworCVVTSE9SVAlMc2lnVHhvcFByb3Q6MTsKKwlVU0hPUlQJU1RCQ0JlYWNvbjoxOworCVVTSE9SVAlEdWFsQ1RTUHJvdGVjdDoxOworCVVTSE9SVAlEdWFsQmVhY29uOjE7CisJVVNIT1JUCVN0YmNNY3M6NjsKKyNlbHNlCisJVVNIT1JUCVN0YmNNY3M6NjsKKwlVU0hPUlQJRHVhbEJlYWNvbjoxOworCVVTSE9SVAlEdWFsQ1RTUHJvdGVjdDoxOworCVVTSE9SVAlTVEJDQmVhY29uOjE7CisJVVNIT1JUCUxzaWdUeG9wUHJvdDoxOwkvLyBMLVNJRyBUWE9QIHByb3RlY3Rpb24gZnVsbCBzdXBwb3J0CisJVVNIT1JUCVBjb0FjdGl2ZToxOworCVVTSE9SVAlQY29QaGFzZToxOworCVVTSE9SVAlyc3Y6NDsKKyNlbmRpZiAvLyBSVF9CSUdfRU5ESUFOIC8vCit9IEFERF9IVElORk8zLCAqUEFERF9IVElORk8zOworCisjZGVmaW5lIFNJWkVfQUREX0hUX0lORk9fSUUJCTIyCit0eXBlZGVmIHN0cnVjdCAgUEFDS0VEeworCVVDSEFSCQkJCUNvbnRyb2xDaGFuOworCUFERF9IVElORk8JCQlBZGRIdEluZm87CisJQUREX0hUSU5GTzIJCQlBZGRIdEluZm8yOworCUFERF9IVElORk8zCQkJQWRkSHRJbmZvMzsKKwlVQ0hBUgkJCQlNQ1NTZXRbMTZdOwkJLy8gQmFzaWMgTUNTIHNldAorfSBBRERfSFRfSU5GT19JRSwgKlBBRERfSFRfSU5GT19JRTsKKwordHlwZWRlZiBzdHJ1Y3QgIFBBQ0tFRHsKKwlVQ0hBUgkJCQlOZXdFeHRDaGFuT2Zmc2V0OworfSBORVdfRVhUX0NIQU5fSUUsICpQTkVXX0VYVF9DSEFOX0lFOworCisKKy8vIDQtYnl0ZSBIVEMgZmllbGQuICBtYXliZSBpbmNsdWRlZCBpbiBhbnkgZnJhbWUgZXhjZXB0IG5vbi1RT1MgZGF0YSBmcmFtZS4gIFRoZSBPcmRlciBiaXQgbXVzdCBzZXQgMS4KK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCB7CisjaWZkZWYgUlRfQklHX0VORElBTgorICAgIFVJTlQzMgkJUkRHOjE7CS8vUkRHIC8gTW9yZSBQUERVCisgICAgVUlOVDMyCQlBQ0NvbnN0cmFpbnQ6MTsJLy9mZWVkYmFjayByZXF1ZXN0CisgICAgVUlOVDMyCQlyc3Y6NTsgIC8vY2FsaWJyYXRpb24gc2VxdWVuY2UKKyAgICBVSU5UMzIJCVpMRkFubm91Y2U6MTsJLy8gWkxGIGFubm91bmNlbWVudAorICAgIFVJTlQzMgkJQ1NJU1RFRVJJTkc6MjsJLy9DU0kvIFNURUVSSU5HCisgICAgVUlOVDMyCQlGQktSZXE6MjsJLy9mZWVkYmFjayByZXF1ZXN0CisgICAgVUlOVDMyCQlDYWxTZXE6MjsgIC8vY2FsaWJyYXRpb24gc2VxdWVuY2UKKyAgICBVSU5UMzIJCUNhbFBvczoyOwkvLyBjYWxpYnJhdGlvbiBwb3NpdGlvbgorICAgIFVJTlQzMgkJTUZCb3JBU0M6NzsJLy9MaW5rIGFkYXB0YXRpb24gZmVlZGJhY2sgY29udGFpbmluZyByZWNvbW1lbmRlZCBNQ1MuIDB4N2YgZm9yIG5vIGZlZWRiYWNrIG9yIG5vdCBhdmFpbGFibGUKKyAgICBVSU5UMzIJCU1GUzozOwkvL1NFVCB0byB0aGUgcmVjZWl2ZWQgdmFsdWUgb2YgTVJTLiAweDExMSBmb3IgdW5zb2xpY2l0ZWQgTUZCLgorICAgIFVJTlQzMgkJTVJTb3JBU0k6MzsJLy8gTVJRIFNlcXVlbmNlIGlkZW50aWZpZXIuIHVuY2hhbmdlZCBkdXJpbmcgZW50aXJlIHByb2NlZHVyZS4gMHgwMDAtMHgxMTAuCisgICAgVUlOVDMyCQlNUlE6MTsJLy9NQ1MgZmVlZGJhY2suIFJlcXVlc3QgZm9yIGEgTUNTIGZlZWRiYWNrCisgICAgVUlOVDMyCQlUUlE6MTsJLy9zb3VuZGluZyByZXF1ZXN0CisgICAgVUlOVDMyCQlNQToxOwkvL21hbmFnZW1lbnQgYWN0aW9uIHBheWxvYWQgZXhpc3QgaW4gKFFvUyBOdWxsK0hUQykKKyNlbHNlCisgICAgVUlOVDMyCQlNQToxOwkvL21hbmFnZW1lbnQgYWN0aW9uIHBheWxvYWQgZXhpc3QgaW4gKFFvUyBOdWxsK0hUQykKKyAgICBVSU5UMzIJCVRSUToxOwkvL3NvdW5kaW5nIHJlcXVlc3QKKyAgICBVSU5UMzIJCU1SUToxOwkvL01DUyBmZWVkYmFjay4gUmVxdWVzdCBmb3IgYSBNQ1MgZmVlZGJhY2sKKyAgICBVSU5UMzIJCU1SU29yQVNJOjM7CS8vIE1SUSBTZXF1ZW5jZSBpZGVudGlmaWVyLiB1bmNoYW5nZWQgZHVyaW5nIGVudGlyZSBwcm9jZWR1cmUuIDB4MDAwLTB4MTEwLgorICAgIFVJTlQzMgkJTUZTOjM7CS8vU0VUIHRvIHRoZSByZWNlaXZlZCB2YWx1ZSBvZiBNUlMuIDB4MTExIGZvciB1bnNvbGljaXRlZCBNRkIuCisgICAgVUlOVDMyCQlNRkJvckFTQzo3OwkvL0xpbmsgYWRhcHRhdGlvbiBmZWVkYmFjayBjb250YWluaW5nIHJlY29tbWVuZGVkIE1DUy4gMHg3ZiBmb3Igbm8gZmVlZGJhY2sgb3Igbm90IGF2YWlsYWJsZQorICAgIFVJTlQzMgkJQ2FsUG9zOjI7CS8vIGNhbGlicmF0aW9uIHBvc2l0aW9uCisgICAgVUlOVDMyCQlDYWxTZXE6MjsgIC8vY2FsaWJyYXRpb24gc2VxdWVuY2UKKyAgICBVSU5UMzIJCUZCS1JlcToyOwkvL2ZlZWRiYWNrIHJlcXVlc3QKKyAgICBVSU5UMzIJCUNTSVNURUVSSU5HOjI7CS8vQ1NJLyBTVEVFUklORworICAgIFVJTlQzMgkJWkxGQW5ub3VjZToxOwkvLyBaTEYgYW5ub3VuY2VtZW50CisgICAgVUlOVDMyCQlyc3Y6NTsgIC8vY2FsaWJyYXRpb24gc2VxdWVuY2UKKyAgICBVSU5UMzIJCUFDQ29uc3RyYWludDoxOwkvL2ZlZWRiYWNrIHJlcXVlc3QKKyAgICBVSU5UMzIJCVJERzoxOwkvL1JERyAvIE1vcmUgUFBEVQorI2VuZGlmIC8qICFSVF9CSUdfRU5ESUFOICovCit9IEhUX0NPTlRST0wsICpQSFRfQ09OVFJPTDsKKworLy8gMi1ieXRlIFFPUyBDT05UUk9MIGZpZWxkCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgeworI2lmZGVmIFJUX0JJR19FTkRJQU4KKyAgICBVU0hPUlQgICAgICBUeG9wX1F1ZXVlU2l6ZTo4OworICAgIFVTSE9SVCAgICAgIEFNc2R1UHJlc2VudDoxOworICAgIFVTSE9SVCAgICAgIEFja1BvbGljeToyOyAgLy8wOiBub3JtYWwgQUNLIDE6Tm8gQUNLIDI6c2NoZWR1bGVkIHVuZGVyIE1UQkEvUFNNUCAgMzogQkEKKyAgICBVU0hPUlQgICAgICBFT1NQOjE7CisgICAgVVNIT1JUICAgICAgVElEOjQ7CisjZWxzZQorICAgIFVTSE9SVCAgICAgIFRJRDo0OworICAgIFVTSE9SVCAgICAgIEVPU1A6MTsKKyAgICBVU0hPUlQgICAgICBBY2tQb2xpY3k6MjsgIC8vMDogbm9ybWFsIEFDSyAxOk5vIEFDSyAyOnNjaGVkdWxlZCB1bmRlciBNVEJBL1BTTVAgIDM6IEJBCisgICAgVVNIT1JUICAgICAgQU1zZHVQcmVzZW50OjE7CisgICAgVVNIT1JUICAgICAgVHhvcF9RdWV1ZVNpemU6ODsKKyNlbmRpZiAvKiAhUlRfQklHX0VORElBTiAqLworfSBRT1NfQ09OVFJPTCwgKlBRT1NfQ09OVFJPTDsKKworLy8gMi1ieXRlIEZyYW1lIGNvbnRyb2wgZmllbGQKK3R5cGVkZWYJc3RydWN0CVBBQ0tFRCB7CisjaWZkZWYgUlRfQklHX0VORElBTgorCVVTSE9SVAkJT3JkZXI6MTsJCQkvLyBTdHJpY3Qgb3JkZXIgZXhwZWN0ZWQKKwlVU0hPUlQJCVdlcDoxOwkJCQkvLyBXZXAgZGF0YQorCVVTSE9SVAkJTW9yZURhdGE6MTsJCQkvLyBNb3JlIGRhdGEgYml0CisJVVNIT1JUCQlQd3JNZ210OjE7CQkJLy8gUG93ZXIgbWFuYWdlbWVudCBiaXQKKwlVU0hPUlQJCVJldHJ5OjE7CQkJLy8gUmV0cnkgc3RhdHVzIGJpdAorCVVTSE9SVAkJTW9yZUZyYWc6MTsJCQkvLyBNb3JlIGZyYWdtZW50IGJpdAorCVVTSE9SVAkJRnJEczoxOwkJCQkvLyBGcm9tIERTIGluZGljYXRpb24KKwlVU0hPUlQJCVRvRHM6MTsJCQkJLy8gVG8gRFMgaW5kaWNhdGlvbgorCVVTSE9SVAkJU3ViVHlwZTo0OwkJCS8vIE1TRFUgc3VidHlwZQorCVVTSE9SVAkJVHlwZToyOwkJCQkvLyBNU0RVIHR5cGUKKwlVU0hPUlQJCVZlcjoyOwkJCQkvLyBQcm90b2NvbCB2ZXJzaW9uCisjZWxzZQorCVVTSE9SVAkJVmVyOjI7CQkJCS8vIFByb3RvY29sIHZlcnNpb24KKwlVU0hPUlQJCVR5cGU6MjsJCQkJLy8gTVNEVSB0eXBlCisJVVNIT1JUCQlTdWJUeXBlOjQ7CQkJLy8gTVNEVSBzdWJ0eXBlCisJVVNIT1JUCQlUb0RzOjE7CQkJCS8vIFRvIERTIGluZGljYXRpb24KKwlVU0hPUlQJCUZyRHM6MTsJCQkJLy8gRnJvbSBEUyBpbmRpY2F0aW9uCisJVVNIT1JUCQlNb3JlRnJhZzoxOwkJCS8vIE1vcmUgZnJhZ21lbnQgYml0CisJVVNIT1JUCQlSZXRyeToxOwkJCS8vIFJldHJ5IHN0YXR1cyBiaXQKKwlVU0hPUlQJCVB3ck1nbXQ6MTsJCQkvLyBQb3dlciBtYW5hZ2VtZW50IGJpdAorCVVTSE9SVAkJTW9yZURhdGE6MTsJCQkvLyBNb3JlIGRhdGEgYml0CisJVVNIT1JUCQlXZXA6MTsJCQkJLy8gV2VwIGRhdGEKKwlVU0hPUlQJCU9yZGVyOjE7CQkJLy8gU3RyaWN0IG9yZGVyIGV4cGVjdGVkCisjZW5kaWYgLyogIVJUX0JJR19FTkRJQU4gKi8KK30gRlJBTUVfQ09OVFJPTCwgKlBGUkFNRV9DT05UUk9MOworCit0eXBlZGVmCXN0cnVjdAlQQUNLRUQgX0hFQURFUl84MDJfMTEJeworICAgIEZSQU1FX0NPTlRST0wgICBGQzsKKyAgICBVU0hPUlQgICAgICAgICAgRHVyYXRpb247CisgICAgVUNIQVIgICAgICAgICAgIEFkZHIxW01BQ19BRERSX0xFTl07CisgICAgVUNIQVIgICAgICAgICAgIEFkZHIyW01BQ19BRERSX0xFTl07CisJVUNIQVIJCQlBZGRyM1tNQUNfQUREUl9MRU5dOworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwlVU0hPUlQJCQlTZXF1ZW5jZToxMjsKKwlVU0hPUlQJCQlGcmFnOjQ7CisjZWxzZQorCVVTSE9SVAkJCUZyYWc6NDsKKwlVU0hPUlQJCQlTZXF1ZW5jZToxMjsKKyNlbmRpZiAvKiAhUlRfQklHX0VORElBTiAqLworCVVDSEFSCQkJT2N0ZXRbMF07Cit9CUhFQURFUl84MDJfMTEsICpQSEVBREVSXzgwMl8xMTsKKwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9GUkFNRV84MDJfMTEgeworICAgIEhFQURFUl84MDJfMTEgICBIZHI7CisgICAgVUNIQVIgICAgICAgICAgICBPY3RldFsxXTsKK30gICBGUkFNRV84MDJfMTEsICpQRlJBTUVfODAyXzExOworCisvLyBRb1NOdWxsIGVtYmVkZGluZyBvZiBtYW5hZ2VtZW50IGFjdGlvbi4gV2hlbiBIVCBDb250cm9sIE1BIGZpZWxkIHNldCB0byAxLgordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9NQV9CT0RZIHsKKyAgICBVQ0hBUiAgICAgICAgICAgIENhdGVnb3J5OworICAgIFVDSEFSICAgICAgICAgICAgQWN0aW9uOworICAgIFVDSEFSICAgICAgICAgICAgT2N0ZXRbMV07Cit9ICAgTUFfQk9EWSwgKlBNQV9CT0RZOworCit0eXBlZGVmCXN0cnVjdAlQQUNLRUQgX0hFQURFUl84MDJfMwl7CisgICAgVUNIQVIgICAgICAgICAgIERBQWRkcjFbTUFDX0FERFJfTEVOXTsKKyAgICBVQ0hBUiAgICAgICAgICAgU0FBZGRyMltNQUNfQUREUl9MRU5dOworICAgIFVDSEFSICAgICAgICAgICBPY3RldFsyXTsKK30JSEVBREVSXzgwMl8zLCAqUEhFQURFUl84MDJfMzsKKy8vLy9CbG9jayBBQ0sgcmVsYXRlZCBmb3JtYXQKKy8vIDItYnl0ZSBCQSBQYXJhbWV0ZXIgIGZpZWxkICBpbiAJREVMQkEgZnJhbWVzIHRvIHRlcm1pbmF0ZSBhbiBhbHJlYWR5IHNldCB1cCBiQQordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEeworI2lmZGVmIFJUX0JJR19FTkRJQU4KKyAgICBVU0hPUlQgICAgICBUSUQ6NDsJLy8gdmFsdWUgb2YgVEMgb3MgVFMKKyAgICBVU0hPUlQgICAgICBJbml0aWF0b3I6MTsJLy8gMTogb3JpZ2luYXRvciAgICAwOnJlY2lwaWVudAorICAgIFVTSE9SVCAgICAgIFJzdjoxMTsJLy8gYWx3YXlzIHNldCB0byAwCisjZWxzZQorICAgIFVTSE9SVCAgICAgIFJzdjoxMTsJLy8gYWx3YXlzIHNldCB0byAwCisgICAgVVNIT1JUICAgICAgSW5pdGlhdG9yOjE7CS8vIDE6IG9yaWdpbmF0b3IgICAgMDpyZWNpcGllbnQKKyAgICBVU0hPUlQgICAgICBUSUQ6NDsJLy8gdmFsdWUgb2YgVEMgb3MgVFMKKyNlbmRpZiAvKiAhUlRfQklHX0VORElBTiAqLworfSBERUxCQV9QQVJNLCAqUERFTEJBX1BBUk07CisKKy8vIDItYnl0ZSBCQSBQYXJhbWV0ZXIgU2V0IGZpZWxkICBpbiBBRERCQSBmcmFtZXMgdG8gc2lnbmFsIHBhcm0gZm9yIHNldHRpbmcgdXAgYSBCQQordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIHsKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisgICAgVVNIT1JUICAgICAgQnVmU2l6ZToxMDsJLy8gbnVtYmVyIG9mIGJ1ZmZlIG9mIHNpemUgMjMwNCBvY3RldHNyCisgICAgVVNIT1JUICAgICAgVElEOjQ7CS8vIHZhbHVlIG9mIFRDIG9zIFRTCisgICAgVVNIT1JUICAgICAgQkFQb2xpY3k6MTsJLy8gMTogaW1tZWRpYXRlbHkgQkEgICAgMDpkZWxheWVkIEJBCisgICAgVVNIT1JUICAgICAgQU1TRFVTdXBwb3J0ZWQ6MTsJLy8gMDogbm90IHBlcm1pdHRlZAkJMTogcGVybWl0dGVkCisjZWxzZQorICAgIFVTSE9SVCAgICAgIEFNU0RVU3VwcG9ydGVkOjE7CS8vIDA6IG5vdCBwZXJtaXR0ZWQJCTE6IHBlcm1pdHRlZAorICAgIFVTSE9SVCAgICAgIEJBUG9saWN5OjE7CS8vIDE6IGltbWVkaWF0ZWx5IEJBICAgIDA6ZGVsYXllZCBCQQorICAgIFVTSE9SVCAgICAgIFRJRDo0OwkvLyB2YWx1ZSBvZiBUQyBvcyBUUworICAgIFVTSE9SVCAgICAgIEJ1ZlNpemU6MTA7CS8vIG51bWJlciBvZiBidWZmZSBvZiBzaXplIDIzMDQgb2N0ZXRzcgorI2VuZGlmIC8qICFSVF9CSUdfRU5ESUFOICovCit9IEJBX1BBUk0sICpQQkFfUEFSTTsKKworLy8gMi1ieXRlIEJBIFN0YXJ0aW5nIFNlcSBDT05UUk9MIGZpZWxkCit0eXBlZGVmIHVuaW9uIFBBQ0tFRCB7CisgICAgc3RydWN0IFBBQ0tFRCB7CisjaWZkZWYgUlRfQklHX0VORElBTgorICAgIFVTSE9SVCAgICAgIFN0YXJ0U2VxOjEyOyAgIC8vIHNlcXVlbmNlIG51bWJlciBvZiB0aGUgMXN0IE1TRFUgZm9yIHdoaWNoIHRoaXMgQkFSIGlzIHNlbnQKKwlVU0hPUlQgICAgICBGcmFnTnVtOjQ7CS8vIGFsd2F5cyBzZXQgdG8gMAorI2Vsc2UKKyAgICBVU0hPUlQgICAgICBGcmFnTnVtOjQ7CS8vIGFsd2F5cyBzZXQgdG8gMAorCVVTSE9SVCAgICAgIFN0YXJ0U2VxOjEyOyAgIC8vIHNlcXVlbmNlIG51bWJlciBvZiB0aGUgMXN0IE1TRFUgZm9yIHdoaWNoIHRoaXMgQkFSIGlzIHNlbnQKKyNlbmRpZiAvKiBSVF9CSUdfRU5ESUFOICovCisgICAgfSAgIGZpZWxkOworICAgIFVTSE9SVCAgICAgICAgICAgd29yZDsKK30gQkFTRVFfQ09OVFJPTCwgKlBCQVNFUV9DT05UUk9MOworCisvL0JBQ29udHJvbCBhbmQgQkFSQ29udHJvbCBhcmUgdGhlIHNhbWUKKy8vIDItYnl0ZSBCQSBDT05UUk9MIGZpZWxkIGluIEJBIGZyYW1lCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgeworI2lmZGVmIFJUX0JJR19FTkRJQU4KKyAgICBVU0hPUlQgICAgICBUSUQ6NDsKKyAgICBVU0hPUlQgICAgICBSc3Y6OTsKKyAgICBVU0hPUlQgICAgICBDb21wcmVzc2VkOjE7CisgICAgVVNIT1JUICAgICAgTVRJRDoxOwkJLy9FV0MgVjEuMjQKKyAgICBVU0hPUlQgICAgICBBQ0tQb2xpY3k6MTsgLy8gb25seSByZWxhdGVkIHRvIE4tRGVsYXllZCBCQS4gQnV0IG5vdCBzdXBwb3J0IGluIFJUMjg2MGIuIDA6Tm9ybWFsQUNLICAxOk5vIEFDSworI2Vsc2UKKyAgICBVU0hPUlQgICAgICBBQ0tQb2xpY3k6MTsgLy8gb25seSByZWxhdGVkIHRvIE4tRGVsYXllZCBCQS4gQnV0IG5vdCBzdXBwb3J0IGluIFJUMjg2MGIuIDA6Tm9ybWFsQUNLICAxOk5vIEFDSworICAgIFVTSE9SVCAgICAgIE1USUQ6MTsJCS8vRVdDIFYxLjI0CisgICAgVVNIT1JUICAgICAgQ29tcHJlc3NlZDoxOworICAgIFVTSE9SVCAgICAgIFJzdjo5OworICAgIFVTSE9SVCAgICAgIFRJRDo0OworI2VuZGlmIC8qICFSVF9CSUdfRU5ESUFOICovCit9IEJBX0NPTlRST0wsICpQQkFfQ09OVFJPTDsKKworLy8gMi1ieXRlIEJBUiBDT05UUk9MIGZpZWxkIGluIEJBUiBmcmFtZQordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIHsKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisgICAgVVNIT1JUICAgICAgVElEOjQ7CisgICAgVVNIT1JUICAgICAgUnN2MTo5OworICAgIFVTSE9SVCAgICAgIENvbXByZXNzZWQ6MTsKKyAgICBVU0hPUlQgICAgICBNVElEOjE7CQkvL2lmIHRoaXMgYml0MSwgdXNlICBGUkFNRV9NVEJBX1JFUSwgIGlmIDAsIHVzZSBGUkFNRV9CQV9SRVEKKyAgICBVU0hPUlQgICAgICBBQ0tQb2xpY3k6MTsKKyNlbHNlCisgICAgVVNIT1JUICAgICAgQUNLUG9saWN5OjE7IC8vIDA6bm9ybWFsIGFjaywgIDE6bm8gYWNrLgorICAgIFVTSE9SVCAgICAgIE1USUQ6MTsJCS8vaWYgdGhpcyBiaXQxLCB1c2UgIEZSQU1FX01UQkFfUkVRLCAgaWYgMCwgdXNlIEZSQU1FX0JBX1JFUQorICAgIFVTSE9SVCAgICAgIENvbXByZXNzZWQ6MTsKKyAgICBVU0hPUlQgICAgICBSc3YxOjk7CisgICAgVVNIT1JUICAgICAgVElEOjQ7CisjZW5kaWYgLyogIVJUX0JJR19FTkRJQU4gKi8KK30gQkFSX0NPTlRST0wsICpQQkFSX0NPTlRST0w7CisKKy8vIEJBUkNvbnRyb2wgaW4gTVRCQVIgZnJhbWUKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCB7CisjaWZkZWYgUlRfQklHX0VORElBTgorICAgIFVTSE9SVCAgICAgIE51bVRJRDo0OworICAgIFVTSE9SVCAgICAgIFJzdjE6OTsKKyAgICBVU0hPUlQgICAgICBDb21wcmVzc2VkOjE7CisgICAgVVNIT1JUICAgICAgTVRJRDoxOworICAgIFVTSE9SVCAgICAgIEFDS1BvbGljeToxOworI2Vsc2UKKyAgICBVU0hPUlQgICAgICBBQ0tQb2xpY3k6MTsKKyAgICBVU0hPUlQgICAgICBNVElEOjE7CisgICAgVVNIT1JUICAgICAgQ29tcHJlc3NlZDoxOworICAgIFVTSE9SVCAgICAgIFJzdjE6OTsKKyAgICBVU0hPUlQgICAgICBOdW1USUQ6NDsKKyNlbmRpZiAvKiAhUlRfQklHX0VORElBTiAqLworfSBNVEJBUl9DT05UUk9MLCAqUE1UQkFSX0NPTlRST0w7CisKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCB7CisjaWZkZWYgUlRfQklHX0VORElBTgorICAgIFVTSE9SVCAgICAgIFRJRDo0OworICAgIFVTSE9SVCAgICAgIFJzdjE6MTI7CisjZWxzZQorICAgIFVTSE9SVCAgICAgIFJzdjE6MTI7CisgICAgVVNIT1JUICAgICAgVElEOjQ7CisjZW5kaWYgLyogIVJUX0JJR19FTkRJQU4gKi8KK30gUEVSX1RJRF9JTkZPLCAqUFBFUl9USURfSU5GTzsKKwordHlwZWRlZiBzdHJ1Y3QgeworCVBFUl9USURfSU5GTyAgICAgIFBlclRJRDsKKwlCQVNFUV9DT05UUk9MIAkgQkFTdGFydGluZ1NlcTsKK30gRUFDSF9USUQsICpQRUFDSF9USUQ7CisKKwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9QU1BPTExfRlJBTUUgeworICAgIEZSQU1FX0NPTlRST0wgICBGQzsKKyAgICBVU0hPUlQgICAgICAgICAgQWlkOworICAgIFVDSEFSICAgICAgICAgICBCc3NpZFtNQUNfQUREUl9MRU5dOworICAgIFVDSEFSICAgICAgICAgICBUYVtNQUNfQUREUl9MRU5dOworfSAgIFBTUE9MTF9GUkFNRSwgKlBQU1BPTExfRlJBTUU7CisKK3R5cGVkZWYJc3RydWN0CVBBQ0tFRCBfUlRTX0ZSQU1FCXsKKyAgICBGUkFNRV9DT05UUk9MICAgRkM7CisgICAgVVNIT1JUICAgICAgICAgIER1cmF0aW9uOworICAgIFVDSEFSICAgICAgICAgICBBZGRyMVtNQUNfQUREUl9MRU5dOworICAgIFVDSEFSICAgICAgICAgICBBZGRyMltNQUNfQUREUl9MRU5dOworfVJUU19GUkFNRSwgKlBSVFNfRlJBTUU7CisKKy8vIEJBUkVRIEFORCBNVEJBUkVRIGhhdmUgdGhlIHNhbWUgc3VidHlwZSBCQVIsIDgwMi4xMW4gQkFSIHVzZSBjb21wcmVzc2VkIGJpdG1hcC4KK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfRlJBTUVfQkFfUkVRIHsKKwlGUkFNRV9DT05UUk9MICAgRkM7CisJVVNIT1JUICAgICAgICAgIER1cmF0aW9uOworCVVDSEFSICAgICAgICAgICBBZGRyMVtNQUNfQUREUl9MRU5dOworCVVDSEFSICAgICAgICAgICBBZGRyMltNQUNfQUREUl9MRU5dOworCUJBUl9DT05UUk9MICBCQVJDb250cm9sOworCUJBU0VRX0NPTlRST0wgCSBCQVN0YXJ0aW5nU2VxOworfSAgIEZSQU1FX0JBX1JFUSwgKlBGUkFNRV9CQV9SRVE7CisKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfRlJBTUVfTVRCQV9SRVEgeworCUZSQU1FX0NPTlRST0wgICBGQzsKKwlVU0hPUlQgICAgICAgICAgRHVyYXRpb247CisJVUNIQVIgICAgICAgICAgIEFkZHIxW01BQ19BRERSX0xFTl07CisJVUNIQVIgICAgICAgICAgIEFkZHIyW01BQ19BRERSX0xFTl07CisJTVRCQVJfQ09OVFJPTCAgTVRCQVJDb250cm9sOworCVBFUl9USURfSU5GTwlQZXJUSURJbmZvOworCUJBU0VRX0NPTlRST0wgCSBCQVN0YXJ0aW5nU2VxOworfSAgIEZSQU1FX01UQkFfUkVRLCAqUEZSQU1FX01UQkFfUkVROworCisvLyBDb21wcmVzc2VkIGZvcm1hdCBpcyBtYW5kYW50b3J5IGluIEhUIFNUQQordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9GUkFNRV9NVEJBIHsKKwlGUkFNRV9DT05UUk9MICAgRkM7CisJVVNIT1JUICAgICAgICAgIER1cmF0aW9uOworCVVDSEFSICAgICAgICAgICBBZGRyMVtNQUNfQUREUl9MRU5dOworCVVDSEFSICAgICAgICAgICBBZGRyMltNQUNfQUREUl9MRU5dOworCUJBX0NPTlRST0wgIEJBQ29udHJvbDsKKwlCQVNFUV9DT05UUk9MIAkgQkFTdGFydGluZ1NlcTsKKwlVQ0hBUgkJQml0TWFwWzhdOworfSAgIEZSQU1FX01UQkEsICpQRlJBTUVfTVRCQTsKKwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9GUkFNRV9QU01QX0FDVElPTiB7CisJSEVBREVSXzgwMl8xMSAgIEhkcjsKKwlVQ0hBUglDYXRlZ29yeTsKKwlVQ0hBUglBY3Rpb247CisJVUNIQVIJUHNtcDsJLy8gNy4zLjEuMjUKK30gICBGUkFNRV9QU01QX0FDVElPTiwgKlBGUkFNRV9QU01QX0FDVElPTjsKKwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9GUkFNRV9BQ1RJT05fSERSIHsKKwlIRUFERVJfODAyXzExICAgSGRyOworCVVDSEFSCUNhdGVnb3J5OworCVVDSEFSCUFjdGlvbjsKK30gICBGUkFNRV9BQ1RJT05fSERSLCAqUEZSQU1FX0FDVElPTl9IRFI7CisKKy8vQWN0aW9uIEZyYW1lCisvL0FjdGlvbiBGcmFtZSAgQ2F0ZWdvcnk6U3BlY3RydW0sICBBY3Rpb246Q2hhbm5lbCBTd2l0Y2guIDcuMy4yLjIwCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX0NIQU5fU1dJVENIX0FOTk9VTkNFIHsKKwlVQ0hBUgkJCQkJRWxlbWVudElEOwkvLyBJRCA9IElFX0NIQU5ORUxfU1dJVENIX0FOTk9VTkNFTUVOVCA9IDM3CisJVUNIQVIJCQkJCUxlbjsKKwlDSEFfU1dJVENIX0FOTk9VTkNFX0lFCUNTQW5ub3VuY2VJZTsKK30gICBDSEFOX1NXSVRDSF9BTk5PVU5DRSwgKlBDSEFOX1NXSVRDSF9BTk5PVU5DRTsKKworCisvLzgwMi4xMW4gOiA3LjMuMi4yMGEKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfU0VDT05EX0NIQU5fT0ZGU0VUIHsKKwlVQ0hBUgkJCQlFbGVtZW50SUQ7CQkvLyBJRCA9IElFX1NFQ09OREFSWV9DSF9PRkZTRVQgPSA2MgorCVVDSEFSCQkJCUxlbjsKKwlTRUNfQ0hBX09GRlNFVF9JRQlTZWNDaE9mZnNldEllOworfSAgIFNFQ09ORF9DSEFOX09GRlNFVCwgKlBTRUNPTkRfQ0hBTl9PRkZTRVQ7CisKKwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9GUkFNRV9TUEVUUlVNX0NTIHsKKwlIRUFERVJfODAyXzExICAgSGRyOworCVVDSEFSCUNhdGVnb3J5OworCVVDSEFSCUFjdGlvbjsKKwlDSEFOX1NXSVRDSF9BTk5PVU5DRQlDU0Fubm91bmNlOworCVNFQ09ORF9DSEFOX09GRlNFVAkJU2Vjb25kQ2hhbm5lbDsKK30gICBGUkFNRV9TUEVUUlVNX0NTLCAqUEZSQU1FX1NQRVRSVU1fQ1M7CisKKwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9GUkFNRV9BRERCQV9SRVEgeworCUhFQURFUl84MDJfMTEgICBIZHI7CisJVUNIQVIJQ2F0ZWdvcnk7CisJVUNIQVIJQWN0aW9uOworCVVDSEFSCVRva2VuOwkvLyAxCisJQkFfUEFSTQkJQmFQYXJtOwkgICAgICAvLyAgMiAtIDEwCisJVVNIT1JUCQlUaW1lT3V0VmFsdWU7CS8vIDAgLSAwCisJQkFTRVFfQ09OVFJPTAlCYVN0YXJ0U2VxOyAvLyAwLTAKK30gICBGUkFNRV9BRERCQV9SRVEsICpQRlJBTUVfQUREQkFfUkVROworCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX0ZSQU1FX0FEREJBX1JTUCB7CisJSEVBREVSXzgwMl8xMSAgIEhkcjsKKwlVQ0hBUglDYXRlZ29yeTsKKwlVQ0hBUglBY3Rpb247CisJVUNIQVIJVG9rZW47CisJVVNIT1JUCVN0YXR1c0NvZGU7CisJQkFfUEFSTQkJQmFQYXJtOyAvLzAgLSAyCisJVVNIT1JUCQlUaW1lT3V0VmFsdWU7Cit9ICAgRlJBTUVfQUREQkFfUlNQLCAqUEZSQU1FX0FEREJBX1JTUDsKKwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9GUkFNRV9ERUxCQV9SRVEgeworCUhFQURFUl84MDJfMTEgICBIZHI7CisJVUNIQVIJQ2F0ZWdvcnk7CisJVUNIQVIJQWN0aW9uOworCURFTEJBX1BBUk0JCURlbGJhUGFybTsKKwlVU0hPUlQJUmVhc29uQ29kZTsKK30gICBGUkFNRV9ERUxCQV9SRVEsICpQRlJBTUVfREVMQkFfUkVROworCisKKy8vNy4yLjEuNwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9GUkFNRV9CQVIgeworCUZSQU1FX0NPTlRST0wgICBGQzsKKwlVU0hPUlQgICAgICAgICAgRHVyYXRpb247CisJVUNIQVIgICAgICAgICAgIEFkZHIxW01BQ19BRERSX0xFTl07CisJVUNIQVIgICAgICAgICAgIEFkZHIyW01BQ19BRERSX0xFTl07CisJQkFSX0NPTlRST0wJCUJhckNvbnRyb2w7CisJQkFTRVFfQ09OVFJPTAlTdGFydGluZ1NlcTsKK30gICBGUkFNRV9CQVIsICpQRlJBTUVfQkFSOworCisvLzcuMi4xLjcKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfRlJBTUVfQkEgeworCUZSQU1FX0NPTlRST0wgICBGQzsKKwlVU0hPUlQgICAgICAgICAgRHVyYXRpb247CisJVUNIQVIgICAgICAgICAgIEFkZHIxW01BQ19BRERSX0xFTl07CisJVUNIQVIgICAgICAgICAgIEFkZHIyW01BQ19BRERSX0xFTl07CisJQkFSX0NPTlRST0wJCUJhckNvbnRyb2w7CisJQkFTRVFfQ09OVFJPTAlTdGFydGluZ1NlcTsKKwlVQ0hBUgkJYml0bWFza1s4XTsKK30gICBGUkFNRV9CQSwgKlBGUkFNRV9CQTsKKworCisvLyBSYWRpbyBNZWFzdWVtZW50IFJlcXVlc3QgRnJhbWUgRm9ybWF0Cit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX0ZSQU1FX1JNX1JFUV9BQ1RJT04geworCUhFQURFUl84MDJfMTEgICBIZHI7CisJVUNIQVIJQ2F0ZWdvcnk7CisJVUNIQVIJQWN0aW9uOworCVVDSEFSCVRva2VuOworCVVTSE9SVAlSZXBldGl0aW9uOworCVVDSEFSICAgZGF0YVswXTsKK30gICBGUkFNRV9STV9SRVFfQUNUSU9OLCAqUEZSQU1FX1JNX1JFUV9BQ1RJT047CisKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCB7CisJVUNIQVIJCUlEOworCVVDSEFSCQlMZW5ndGg7CisJVUNIQVIJCUNoYW5uZWxTd2l0Y2hNb2RlOworCVVDSEFSCQlOZXdSZWdDbGFzczsKKwlVQ0hBUgkJTmV3Q2hhbm5lbE51bTsKKwlVQ0hBUgkJQ2hhbm5lbFN3aXRjaENvdW50OworfSBIVF9FWFRfQ0hBTk5FTF9TV0lUQ0hfQU5OT1VOQ0VNRU5UX0lFLCAqUEhUX0VYVF9DSEFOTkVMX1NXSVRDSF9BTk5PVU5DRU1FTlRfSUU7CisKKworLy8KKy8vIF9MaW1pdCBtdXN0IGJlIHRoZSAyKipuIC0gMQorLy8gX1NFUTEgLCBfU0VRMiBtdXN0IGJlIHdpdGhpbiAwIH4gX0xpbWl0CisvLworI2RlZmluZSBTRVFfU1RFUE9ORShfU0VRMSwgX1NFUTIsIF9MaW1pdCkJKChfU0VRMSA9PSAoKF9TRVEyKzEpICYgX0xpbWl0KSkpCisjZGVmaW5lIFNFUV9TTUFMTEVSKF9TRVExLCBfU0VRMiwgX0xpbWl0KQkoKChfU0VRMS1fU0VRMikgJiAoKF9MaW1pdCsxKT4+MSkpKQorI2RlZmluZSBTRVFfTEFSR0VSKF9TRVExLCBfU0VRMiwgX0xpbWl0KQkoKF9TRVExICE9IF9TRVEyKSAmJiAhKCgoX1NFUTEtX1NFUTIpICYgKChfTGltaXQrMSk+PjEpKSkpCisjZGVmaW5lIFNFUV9XSVRISU5fV0lOKF9TRVExLCBfU0VRMiwgX1dJTiwgX0xpbWl0KSAoU0VRX0xBUkdFUihfU0VRMSwgX1NFUTIsIF9MaW1pdCkgJiYgIFwKKwkJCQkJCQkJCQkJCVNFUV9TTUFMTEVSKF9TRVExLCAoKF9TRVEyK19XSU4rMSkmX0xpbWl0KSwgX0xpbWl0KSkKKworLy8KKy8vIENvbnRlbnRpb24tZnJlZSBwYXJhbWV0ZXIgKHdpdGhvdXQgSUQgYW5kIExlbmd0aCkKKy8vCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgeworICAgIEJPT0xFQU4gICAgIGJWYWxpZDsgICAgICAgICAvLyAxOiB2YXJpYWJsZSBjb250YWlucyB2YWxpZCB2YWx1ZQorICAgIFVDSEFSICAgICAgIENmcENvdW50OworICAgIFVDSEFSICAgICAgIENmcFBlcmlvZDsKKyAgICBVU0hPUlQgICAgICBDZnBNYXhEdXJhdGlvbjsKKyAgICBVU0hPUlQgICAgICBDZnBEdXJSZW1haW5pbmc7Cit9IENGX1BBUk0sICpQQ0ZfUEFSTTsKKwordHlwZWRlZglzdHJ1Y3QJX0NJUEhFUl9TVUlURQl7CisJTkRJU184MDJfMTFfRU5DUllQVElPTl9TVEFUVVMJUGFpckNpcGhlcjsJCS8vIFVuaWNhc3QgY2lwaGVyIDEsIHRoaXMgb25lIGhhcyBtb3JlIHNlY3VyZWQgY2lwaGVyIHN1aXRlCisJTkRJU184MDJfMTFfRU5DUllQVElPTl9TVEFUVVMJUGFpckNpcGhlckF1eDsJLy8gVW5pY2FzdCBjaXBoZXIgMiBpZiBBUCBhbm5vdW5jZSB0d28gdW5pY2FzdCBjaXBoZXIgc3VpdGUKKwlORElTXzgwMl8xMV9FTkNSWVBUSU9OX1NUQVRVUwlHcm91cENpcGhlcjsJLy8gR3JvdXAgY2lwaGVyCisJVVNIT1JUCQkJCQkJCVJzbkNhcGFiaWxpdHk7CS8vIFJTTiBjYXBhYmlsaXR5IGZyb20gYmVhY29uCisJQk9PTEVBTgkJCQkJCQliTWl4TW9kZTsJCS8vIEluZGljYXRlIFBhaXIgJiBHcm91cCBjaXBoZXIgbWlnaHQgYmUgZGlmZmVyZW50Cit9CUNJUEhFUl9TVUlURSwgKlBDSVBIRVJfU1VJVEU7CisKKy8vIEVEQ0EgY29uZmlndXJhdGlvbiBmcm9tIEFQJ3MgQkVBQ09OL1Byb2JlUnNwCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQk9PTEVBTiAgICAgYlZhbGlkOyAgICAgICAgIC8vIDE6IHZhcmlhYmxlIGNvbnRhaW5zIHZhbGlkIHZhbHVlCisgICAgQk9PTEVBTiAgICAgYkFkZDsgICAgICAgICAvLyAxOiB2YXJpYWJsZSBjb250YWlucyB2YWxpZCB2YWx1ZQorICAgIEJPT0xFQU4gICAgIGJRQWNrOworICAgIEJPT0xFQU4gICAgIGJRdWV1ZVJlcXVlc3Q7CisgICAgQk9PTEVBTiAgICAgYlR4b3BSZXF1ZXN0OworICAgIEJPT0xFQU4gICAgIGJBUFNEQ2FwYWJsZTsKKy8vICBCT09MRUFOICAgICBiTW9yZURhdGFBY2s7CisgICAgVUNIQVIgICAgICAgRWRjYVVwZGF0ZUNvdW50OworICAgIFVDSEFSICAgICAgIEFpZnNuWzRdOyAgICAgICAvLyAwOkFDX0JLLCAxOkFDX0JFLCAyOkFDX1ZJLCAzOkFDX1ZPCisgICAgVUNIQVIgICAgICAgQ3dtaW5bNF07CisgICAgVUNIQVIgICAgICAgQ3dtYXhbNF07CisgICAgVVNIT1JUICAgICAgVHhvcFs0XTsgICAgICAvLyBpbiB1bml0IG9mIDMyLXVzCisgICAgQk9PTEVBTiAgICAgYkFDTVs0XTsgICAgICAvLyAxOiBBZG1pc3Npb24gQ29udHJvbCBvZiBBQ19CSyBpcyBtYW5kYXR0b3J5Cit9IEVEQ0FfUEFSTSwgKlBFRENBX1BBUk07CisKKy8vIFFCU1MgTE9BRCBpbmZvcm1hdGlvbiBmcm9tIFFBUCdzIEJFQUNPTi9Qcm9iZVJzcAordHlwZWRlZiBzdHJ1Y3QgeworICAgIEJPT0xFQU4gICAgIGJWYWxpZDsgICAgICAgICAgICAgICAgICAgICAvLyAxOiB2YXJpYWJsZSBjb250YWlucyB2YWxpZCB2YWx1ZQorICAgIFVTSE9SVCAgICAgIFN0YU51bTsKKyAgICBVQ0hBUiAgICAgICBDaGFubmVsVXRpbGl6YXRpb247CisgICAgVVNIT1JUICAgICAgUmVtYWluaW5nQWRtaXNzaW9uQ29udHJvbDsgIC8vIGluIHVuaXQgb2YgMzItdXMKK30gUUJTU19MT0FEX1BBUk0sICpQUUJTU19MT0FEX1BBUk07CisKKy8vIFFCU1MgSW5mbyBmaWVsZCBpbiBRU1RBJ3MgYXNzb2MgcmVxCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgeworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwlVQ0hBUgkJUnN2MjoxOworCVVDSEFSCQlNYXhTUExlbmd0aDoyOworCVVDSEFSCQlSc3YxOjE7CisJVUNIQVIJCVVBUFNEX0FDX0JFOjE7CisJVUNIQVIJCVVBUFNEX0FDX0JLOjE7CisJVUNIQVIJCVVBUFNEX0FDX1ZJOjE7CisJVUNIQVIJCVVBUFNEX0FDX1ZPOjE7CisjZWxzZQorICAgIFVDSEFSCQlVQVBTRF9BQ19WTzoxOworCVVDSEFSCQlVQVBTRF9BQ19WSToxOworCVVDSEFSCQlVQVBTRF9BQ19CSzoxOworCVVDSEFSCQlVQVBTRF9BQ19CRToxOworCVVDSEFSCQlSc3YxOjE7CisJVUNIQVIJCU1heFNQTGVuZ3RoOjI7CisJVUNIQVIJCVJzdjI6MTsKKyNlbmRpZiAvKiAhUlRfQklHX0VORElBTiAqLworfSBRQlNTX1NUQV9JTkZPX1BBUk0sICpQUUJTU19TVEFfSU5GT19QQVJNOworCisvLyBRQlNTIEluZm8gZmllbGQgaW4gUUFQJ3MgQmVhY29uL1Byb2JlUnNwCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgeworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwlVQ0hBUgkJVUFQU0Q6MTsKKwlVQ0hBUgkJUnN2OjM7CisgICAgVUNIQVIJCVBhcmFtU2V0Q291bnQ6NDsKKyNlbHNlCisgICAgVUNIQVIJCVBhcmFtU2V0Q291bnQ6NDsKKwlVQ0hBUgkJUnN2OjM7CisJVUNIQVIJCVVBUFNEOjE7CisjZW5kaWYgLyogIVJUX0JJR19FTkRJQU4gKi8KK30gUUJTU19BUF9JTkZPX1BBUk0sICpQUUJTU19BUF9JTkZPX1BBUk07CisKKy8vIFFPUyBDYXBhYmlsaXR5IHJlcG9ydGVkIGluIFFBUCdzIEJFQUNPTi9Qcm9iZVJzcAorLy8gUU9TIENhcGFiaWxpdHkgc2VudCBvdXQgaW4gUVNUQSdzIEFzc29jaWF0ZVJlcS9SZUFzc29jaWF0ZVJlcQordHlwZWRlZiBzdHJ1Y3QgeworICAgIEJPT0xFQU4gICAgIGJWYWxpZDsgICAgICAgICAgICAgICAgICAgICAvLyAxOiB2YXJpYWJsZSBjb250YWlucyB2YWxpZCB2YWx1ZQorICAgIEJPT0xFQU4gICAgIGJRQWNrOworICAgIEJPT0xFQU4gICAgIGJRdWV1ZVJlcXVlc3Q7CisgICAgQk9PTEVBTiAgICAgYlR4b3BSZXF1ZXN0OworLy8gIEJPT0xFQU4gICAgIGJNb3JlRGF0YUFjazsKKyAgICBVQ0hBUiAgICAgICBFZGNhVXBkYXRlQ291bnQ7Cit9IFFPU19DQVBBQklMSVRZX1BBUk0sICpQUU9TX0NBUEFCSUxJVFlfUEFSTTsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAordHlwZWRlZiBzdHJ1Y3QgeworICAgIFVDSEFSICAgICAgIElFTGVuOworICAgIFVDSEFSICAgICAgIElFW01BWF9DVVNUT01fTEVOXTsKK30gV1BBX0lFXzsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgVUNIQVIgICBCc3NpZFtNQUNfQUREUl9MRU5dOworICAgIFVDSEFSICAgQ2hhbm5lbDsKKwlVQ0hBUiAgIENlbnRyYWxDaGFubmVsOwkvL1N0b3JlIHRoZSB3aWRlLWJhbmQgY2VudHJhbCBjaGFubmVsIGZvciA0ME1Iei4gIC51c2VkIGluIDQwTUh6IEFQLiBPciB0aGlzIGlzIHRoZSBzYW1lIGFzIENoYW5uZWwuCisgICAgVUNIQVIgICBCc3NUeXBlOworICAgIFVTSE9SVCAgQXRpbVdpbjsKKyAgICBVU0hPUlQgIEJlYWNvblBlcmlvZDsKKworICAgIFVDSEFSICAgU3VwUmF0ZVtNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFU107CisgICAgVUNIQVIgICBTdXBSYXRlTGVuOworICAgIFVDSEFSICAgRXh0UmF0ZVtNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFU107CisgICAgVUNIQVIgICBFeHRSYXRlTGVuOworCUhUX0NBUEFCSUxJVFlfSUUgSHRDYXBhYmlsaXR5OworCVVDSEFSCQkJSHRDYXBhYmlsaXR5TGVuOworCUFERF9IVF9JTkZPX0lFIEFkZEh0SW5mbzsJLy8gQVAgbWlnaHQgdXNlIHRoaXMgYWRkaXRpb25hbCBodCBpbmZvIElFCisJVUNIQVIJCQlBZGRIdEluZm9MZW47CisJVUNIQVIJCQlOZXdFeHRDaGFuT2Zmc2V0OworCUNIQVIgICAgUnNzaTsKKyAgICBVQ0hBUiAgIFByaXZhY3k7CQkJLy8gSW5kaWNhdGUgc2VjdXJpdHkgZnVuY3Rpb24gT04vT0ZGLiBEb24ndCBtZXNzIHVwIHdpdGggYXV0aCBtb2RlLgorCVVDSEFSCUhpZGRlbjsKKworICAgIFVTSE9SVCAgRHRpbVBlcmlvZDsKKyAgICBVU0hPUlQgIENhcGFiaWxpdHlJbmZvOworCisgICAgVVNIT1JUICBDZnBDb3VudDsKKyAgICBVU0hPUlQgIENmcFBlcmlvZDsKKyAgICBVU0hPUlQgIENmcE1heER1cmF0aW9uOworICAgIFVTSE9SVCAgQ2ZwRHVyUmVtYWluaW5nOworICAgIFVDSEFSICAgU3NpZExlbjsKKyAgICBDSEFSICAgIFNzaWRbTUFYX0xFTl9PRl9TU0lEXTsKKworICAgIFVMT05HICAgTGFzdEJlYWNvblJ4VGltZTsgLy8gT1MncyB0aW1lc3RhbXAKKworCUJPT0xFQU4JYlNFUzsKKworCS8vIE5ldyBmb3IgV1BBMgorCUNJUEhFUl9TVUlURQkJCQkJV1BBOwkJCS8vIEFQIGFubm91bmNlZCBXUEEgY2lwaGVyIHN1aXRlCisJQ0lQSEVSX1NVSVRFCQkJCQlXUEEyOwkJCS8vIEFQIGFubm91bmNlZCBXUEEyIGNpcGhlciBzdWl0ZQorCisJLy8gTmV3IGZvciBtaWNyb3NvZnQgV1BBIHN1cHBvcnQKKwlORElTXzgwMl8xMV9GSVhFRF9JRXMJRml4SUVzOworCU5ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREUJQXV0aE1vZGVBdXg7CS8vIEFkZGl0aW9uIG1vZGUgZm9yIFdQQTIgLyBXUEEgY2FwYWJsZSBBUAorCU5ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREUJQXV0aE1vZGU7CisJTkRJU184MDJfMTFfV0VQX1NUQVRVUwlXZXBTdGF0dXM7CQkJCS8vIFVuaWNhc3QgRW5jcnlwdGlvbiBBbGdvcml0aG0gZXh0cmFjdCBmcm9tIFZBUl9JRQorCVVTSE9SVAkJCQkJVmFySUVMZW47CQkJCS8vIExlbmd0aCBvZiBuZXh0IFZJRSBpbmNsdWRlIEVJRCAmIExlbmd0aAorCVVDSEFSCQkJCQlWYXJJRXNbTUFYX1ZJRV9MRU5dOworCisJLy8gQ0NYIENraXAgaW5mb3JtYXRpb24KKyAgICBVQ0hBUiAgIENraXBGbGFnOworCisJLy8gQ0NYIDIgVFNGCisJVUNIQVIJUFRTRls0XTsJCS8vIFBhcmVudCBUU0YKKwlVQ0hBUglUVFNGWzhdOwkJLy8gVGFyZ2V0IFRTRgorCisgICAgLy8gODAyLjExZSBkOSwgYW5kIFdNTQorCUVEQ0FfUEFSTSAgICAgICAgICAgRWRjYVBhcm07CisJUU9TX0NBUEFCSUxJVFlfUEFSTSBRb3NDYXBhYmlsaXR5OworCVFCU1NfTE9BRF9QQVJNICAgICAgUWJzc0xvYWQ7CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisgICAgV1BBX0lFXyAgICAgV3BhSUU7CisgICAgV1BBX0lFXyAgICAgUnNuSUU7CisjaWZkZWYgRVhUX0JVSUxEX0NIQU5ORUxfTElTVAorCVVDSEFSCQlDb3VudHJ5U3RyaW5nWzNdOworCUJPT0xFQU4JCWJIYXNDb3VudHJ5SUU7CisjZW5kaWYgLy8gRVhUX0JVSUxEX0NIQU5ORUxfTElTVCAvLworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworfSBCU1NfRU5UUlksICpQQlNTX0VOVFJZOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgVUNIQVIgICAgICAgICAgIEJzc05yOworICAgIFVDSEFSICAgICAgICAgICBCc3NPdmVybGFwTnI7CisgICAgQlNTX0VOVFJZICAgICAgIEJzc0VudHJ5W01BWF9MRU5fT0ZfQlNTX1RBQkxFXTsKK30gQlNTX1RBQkxFLCAqUEJTU19UQUJMRTsKKworCit0eXBlZGVmIHN0cnVjdCBfTUxNRV9RVUVVRV9FTEVNIHsKKyAgICBVTE9ORyAgICAgICAgICAgICBNYWNoaW5lOworICAgIFVMT05HICAgICAgICAgICAgIE1zZ1R5cGU7CisgICAgVUxPTkcgICAgICAgICAgICAgTXNnTGVuOworICAgIFVDSEFSICAgICAgICAgICAgIE1zZ1tNR01UX0RNQV9CVUZGRVJfU0laRV07CisgICAgTEFSR0VfSU5URUdFUiAgICAgVGltZVN0YW1wOworICAgIFVDSEFSICAgICAgICAgICAgIFJzc2kwOworICAgIFVDSEFSICAgICAgICAgICAgIFJzc2kxOworICAgIFVDSEFSICAgICAgICAgICAgIFJzc2kyOworICAgIFVDSEFSICAgICAgICAgICAgIFNpZ25hbDsKKyAgICBVQ0hBUiAgICAgICAgICAgICBDaGFubmVsOworICAgIFVDSEFSICAgICAgICAgICAgIFdjaWQ7CisgICAgQk9PTEVBTiAgICAgICAgICAgT2NjdXBpZWQ7Cit9IE1MTUVfUVVFVUVfRUxFTSwgKlBNTE1FX1FVRVVFX0VMRU07CisKK3R5cGVkZWYgc3RydWN0IF9NTE1FX1FVRVVFIHsKKyAgICBVTE9ORyAgICAgICAgICAgICBOdW07CisgICAgVUxPTkcgICAgICAgICAgICAgSGVhZDsKKyAgICBVTE9ORyAgICAgICAgICAgICBUYWlsOworICAgIE5ESVNfU1BJTl9MT0NLICAgTG9jazsKKyAgICBNTE1FX1FVRVVFX0VMRU0gIEVudHJ5W01BWF9MRU5fT0ZfTUxNRV9RVUVVRV07Cit9IE1MTUVfUVVFVUUsICpQTUxNRV9RVUVVRTsKKwordHlwZWRlZiBWT0lEICgqU1RBVEVfTUFDSElORV9GVU5DKShWT0lEICpBZGFwdG9yLCBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCit0eXBlZGVmIHN0cnVjdCBfU1RBVEVfTUFDSElORSB7CisgICAgVUxPTkcgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNlOworICAgIFVMT05HICAgICAgICAgICAgICAgICAgICAgICAgICAgTnJTdGF0ZTsKKyAgICBVTE9ORyAgICAgICAgICAgICAgICAgICAgICAgICAgIE5yTXNnOworICAgIFVMT05HICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3VyclN0YXRlOworICAgIFNUQVRFX01BQ0hJTkVfRlVOQyAgICAgICAgICAgICAqVHJhbnNGdW5jOworfSBTVEFURV9NQUNISU5FLCAqUFNUQVRFX01BQ0hJTkU7CisKKworLy8gTUxNRSBBVVggZGF0YSBzdHJ1Y3R1cmUgdGhhdCBob2xkIHRlbXBvcmFybGl5IHNldHRpbmdzIGR1cmluZyBhIGNvbm5lY3Rpb24gYXR0ZW1wdC4KKy8vIE9uY2UgdGhpcyBhdHRlbXAgc3VjY2VlZHMsIGFsbCBzZXR0aW5ncyB3aWxsIGJlIGNvcHkgdG8gcEFkLT5TdGFBY3RpdmUuCisvLyBBIGNvbm5lY3Rpb24gYXR0ZW1wdCAodXNlciBzZXQgT0lELCByb2FtaW5nLCBDQ1ggZmFzdCByb2FtaW5nLC4uKSBjb25zaXN0cyBvZgorLy8gc2V2ZXJhbCBzdGVwcyAoSk9JTiwgQVVUSCwgQVNTT0Mgb3IgUkVBU1NPQykgYW5kIG1heSBmYWlsIGF0IGFueSBzdGVwLiBXZSBwdXJwb3NlbHkKKy8vIHNlcGFyYXRlIHRoaXMgdW5kZXItdHJpYWwgc2V0dGluZ3MgYXdheSBmcm9tIHBBZC0+U3RhQWN0aXZlIHNvIHRoYXQgb25jZQorLy8gdGhpcyBuZXcgYXR0ZW1wdCBmYWlsZWQsIGRyaXZlciBjYW4gYXV0by1yZWNvdmVyIGJhY2sgdG8gdGhlIGFjdGl2ZSBzZXR0aW5ncy4KK3R5cGVkZWYgc3RydWN0IF9NTE1FX0FVWCB7CisgICAgVUNIQVIgICAgICAgICAgICAgICBCc3NUeXBlOworICAgIFVDSEFSICAgICAgICAgICAgICAgU3NpZFtNQVhfTEVOX09GX1NTSURdOworICAgIFVDSEFSICAgICAgICAgICAgICAgU3NpZExlbjsKKyAgICBVQ0hBUiAgICAgICAgICAgICAgIEJzc2lkW01BQ19BRERSX0xFTl07CisJVUNIQVIJCQkJQXV0b1JlY29ubmVjdFNzaWRbTUFYX0xFTl9PRl9TU0lEXTsKKwlVQ0hBUgkJCQlBdXRvUmVjb25uZWN0U3NpZExlbjsKKyAgICBVU0hPUlQgICAgICAgICAgICAgIEFsZzsKKyAgICBVQ0hBUiAgICAgICAgICAgICAgIFNjYW5UeXBlOworICAgIFVDSEFSICAgICAgICAgICAgICAgQ2hhbm5lbDsKKwlVQ0hBUiAgICAgICAgICAgICAgIENlbnRyYWxDaGFubmVsOworICAgIFVTSE9SVCAgICAgICAgICAgICAgQWlkOworICAgIFVTSE9SVCAgICAgICAgICAgICAgQ2FwYWJpbGl0eUluZm87CisgICAgVVNIT1JUICAgICAgICAgICAgICBCZWFjb25QZXJpb2Q7CisgICAgVVNIT1JUICAgICAgICAgICAgICBDZnBNYXhEdXJhdGlvbjsKKyAgICBVU0hPUlQgICAgICAgICAgICAgIENmcFBlcmlvZDsKKyAgICBVU0hPUlQgICAgICAgICAgICAgIEF0aW1XaW47CisKKwkvLyBDb3B5IHN1cHBvcnRlZCByYXRlIGZyb20gZGVzaXJlZCBBUCdzIGJlYWNvbi4gV2UgYXJlIHRyeWluZyB0byBtYXRjaAorCS8vIEFQJ3Mgc3VwcG9ydGVkIGFuZCBleHRlbmRlZCByYXRlIHNldHRpbmdzLgorCVVDSEFSCQkgICAgICAgIFN1cFJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdOworCVVDSEFSCQkgICAgICAgIEV4dFJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdOworCVVDSEFSCQkgICAgICAgIFN1cFJhdGVMZW47CisJVUNIQVIJCSAgICAgICAgRXh0UmF0ZUxlbjsKKwlIVF9DQVBBQklMSVRZX0lFCQlIdENhcGFiaWxpdHk7CisJVUNIQVIJCSAgICAgICAgCUh0Q2FwYWJpbGl0eUxlbjsKKwlBRERfSFRfSU5GT19JRQkJQWRkSHRJbmZvOwkvLyBBUCBtaWdodCB1c2UgdGhpcyBhZGRpdGlvbmFsIGh0IGluZm8gSUUKKwlVQ0hBUgkJCU5ld0V4dENoYW5uZWxPZmZzZXQ7CisJLy9SVF9IVF9DQVBBQklMSVRZCVN1cHBvcnRlZEh0UGh5OworCisgICAgLy8gbmV3IGZvciBRT1MKKyAgICBRT1NfQ0FQQUJJTElUWV9QQVJNIEFQUW9zQ2FwYWJpbGl0eTsgICAgLy8gUU9TIGNhcGFiaWxpdHkgb2YgdGhlIGN1cnJlbnQgYXNzb2NpYXRlZCBBUAorICAgIEVEQ0FfUEFSTSAgICAgICAgICAgQVBFZGNhUGFybTsgICAgICAgICAvLyBFRENBIHBhcmFtZXRlcnMgb2YgdGhlIGN1cnJlbnQgYXNzb2NpYXRlZCBBUAorICAgIFFCU1NfTE9BRF9QQVJNICAgICAgQVBRYnNzTG9hZDsgICAgICAgICAvLyBRQlNTIGxvYWQgb2YgdGhlIGN1cnJlbnQgYXNzb2NpYXRlZCBBUAorCisgICAgLy8gbmV3IHRvIGtlZXAgUmFsaW5rIHNwZWNpZmljIGZlYXR1cmUKKyAgICBVTE9ORyAgICAgICAgICAgICAgIEFQUmFsaW5rSWU7CisKKyAgICBCU1NfVEFCTEUgICAgICAgICAgIFNzaWRCc3NUYWI7ICAgICAvLyBBUCBsaXN0IGZvciB0aGUgc2FtZSBTU0lECisgICAgQlNTX1RBQkxFICAgICAgICAgICBSb2FtVGFiOyAgICAgICAgLy8gQVAgbGlzdCBlbGlnaWJsZSBmb3Igcm9hbWluZworICAgIFVMT05HICAgICAgICAgICAgICAgQnNzSWR4OworICAgIFVMT05HICAgICAgICAgICAgICAgUm9hbUlkeDsKKworCUJPT0xFQU4JCQkJQ3VyclJlcUlzRnJvbU5kaXM7CisKKyAgICBSQUxJTktfVElNRVJfU1RSVUNUIEJlYWNvblRpbWVyLCBTY2FuVGltZXI7CisgICAgUkFMSU5LX1RJTUVSX1NUUlVDVCBBdXRoVGltZXI7CisgICAgUkFMSU5LX1RJTUVSX1NUUlVDVCBBc3NvY1RpbWVyLCBSZWFzc29jVGltZXIsIERpc2Fzc29jVGltZXI7Cit9IE1MTUVfQVVYLCAqUE1MTUVfQVVYOworCit0eXBlZGVmIHN0cnVjdCBfTUxNRV9BRERCQV9SRVFfU1RSVUNUeworCVVDSEFSICAgV2NpZDsJLy8KKwlVQ0hBUiAgIHBBZGRyW01BQ19BRERSX0xFTl07CisJVUNIQVIgICBCYUJ1ZlNpemU7CisJVVNIT1JUCVRpbWVPdXRWYWx1ZTsKKwlVQ0hBUiAgIFRJRDsKKwlVQ0hBUiAgIFRva2VuOworCVVTSE9SVAlCYVN0YXJ0U2VxOworfSBNTE1FX0FEREJBX1JFUV9TVFJVQ1QsICpQTUxNRV9BRERCQV9SRVFfU1RSVUNUOworCisKK3R5cGVkZWYgc3RydWN0IF9NTE1FX0RFTEJBX1JFUV9TVFJVQ1R7CisJVUNIQVIgICBXY2lkOwkvLworCVVDSEFSICAgICBBZGRyW01BQ19BRERSX0xFTl07CisJVUNIQVIgICBUSUQ7CisJVUNIQVIJSW5pdGlhdG9yOworfSBNTE1FX0RFTEJBX1JFUV9TVFJVQ1QsICpQTUxNRV9ERUxCQV9SRVFfU1RSVUNUOworCisvLyBhc3NvYyBzdHJ1Y3QgaXMgZXF1YWwgdG8gcmVhc3NvYwordHlwZWRlZiBzdHJ1Y3QgX01MTUVfQVNTT0NfUkVRX1NUUlVDVHsKKyAgICBVQ0hBUiAgICAgQWRkcltNQUNfQUREUl9MRU5dOworICAgIFVTSE9SVCAgICBDYXBhYmlsaXR5SW5mbzsKKyAgICBVU0hPUlQgICAgTGlzdGVuSW50djsKKyAgICBVTE9ORyAgICAgVGltZW91dDsKK30gTUxNRV9BU1NPQ19SRVFfU1RSVUNULCAqUE1MTUVfQVNTT0NfUkVRX1NUUlVDVCwgTUxNRV9SRUFTU09DX1JFUV9TVFJVQ1QsICpQTUxNRV9SRUFTU09DX1JFUV9TVFJVQ1Q7CisKK3R5cGVkZWYgc3RydWN0IF9NTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1R7CisgICAgVUNIQVIgICAgIEFkZHJbTUFDX0FERFJfTEVOXTsKKyAgICBVU0hPUlQgICAgUmVhc29uOworfSBNTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1QsICpQTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNUOworCit0eXBlZGVmIHN0cnVjdCBfTUxNRV9BVVRIX1JFUV9TVFJVQ1QgeworICAgIFVDSEFSICAgICAgICBBZGRyW01BQ19BRERSX0xFTl07CisgICAgVVNIT1JUICAgICAgIEFsZzsKKyAgICBVTE9ORyAgICAgICAgVGltZW91dDsKK30gTUxNRV9BVVRIX1JFUV9TVFJVQ1QsICpQTUxNRV9BVVRIX1JFUV9TVFJVQ1Q7CisKK3R5cGVkZWYgc3RydWN0IF9NTE1FX0RFQVVUSF9SRVFfU1RSVUNUIHsKKyAgICBVQ0hBUiAgICAgICAgQWRkcltNQUNfQUREUl9MRU5dOworICAgIFVTSE9SVCAgICAgICBSZWFzb247Cit9IE1MTUVfREVBVVRIX1JFUV9TVFJVQ1QsICpQTUxNRV9ERUFVVEhfUkVRX1NUUlVDVDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFVMT05HICAgICAgQnNzSWR4OworfSBNTE1FX0pPSU5fUkVRX1NUUlVDVDsKKwordHlwZWRlZiBzdHJ1Y3QgX01MTUVfU0NBTl9SRVFfU1RSVUNUIHsKKyAgICBVQ0hBUiAgICAgIEJzc2lkW01BQ19BRERSX0xFTl07CisgICAgVUNIQVIgICAgICBCc3NUeXBlOworICAgIFVDSEFSICAgICAgU2NhblR5cGU7CisgICAgVUNIQVIgICAgICBTc2lkTGVuOworICAgIENIQVIgICAgICAgU3NpZFtNQVhfTEVOX09GX1NTSURdOworfSBNTE1FX1NDQU5fUkVRX1NUUlVDVCwgKlBNTE1FX1NDQU5fUkVRX1NUUlVDVDsKKwordHlwZWRlZiBzdHJ1Y3QgX01MTUVfU1RBUlRfUkVRX1NUUlVDVCB7CisgICAgQ0hBUiAgICAgICAgU3NpZFtNQVhfTEVOX09GX1NTSURdOworICAgIFVDSEFSICAgICAgIFNzaWRMZW47Cit9IE1MTUVfU1RBUlRfUkVRX1NUUlVDVCwgKlBNTE1FX1NUQVJUX1JFUV9TVFJVQ1Q7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKy8vIHN0cnVjdHVyZSBmb3IgRExTCit0eXBlZGVmIHN0cnVjdCBfUlRfODAyXzExX0RMUyB7CisJVVNIT1JUCQkJCQkJVGltZU91dDsJCS8vIFVzZSB0byB0aW1lIG91dCB3aGlsZSBzbGllbmNlLCB1bml0OiBzZWNvbmQgLCBzZXQgYnkgVUkKKwlVU0hPUlQJCQkJCQlDb3VudERvd25UaW1lcjsJLy8gVXNlIHRvIHRpbWUgb3V0IHdoaWxlIHNsaWVuY2UsdW5pdDogc2Vjb25kICwgdXNlZCBieSBkcml2ZXIgb25seQorCU5ESVNfODAyXzExX01BQ19BRERSRVNTCQlNYWNBZGRyOwkJLy8gc2V0IGJ5IFVJCisJVUNIQVIJCQkJCQlTdGF0dXM7CQkJLy8gMDogbm9uZSAsIDE6IHdhaXQgU1RBa2V5LCAyOiBmaW5pc2ggRExTIHNldHVwICwgc2V0IGJ5IGRyaXZlciBvbmx5CisJQk9PTEVBTgkJCQkJCVZhbGlkOwkJCS8vIDE6IHZhbGlkICwgMDogaW52YWxpZCAsIHNldCBieSBVSSwgdXNlIHRvIHNldHVwIG9yIHRlYXIgZG93biBETFMgbGluaworCVJBTElOS19USU1FUl9TVFJVQ1QJCQlUaW1lcjsJCQkvLyBVc2UgdG8gdGltZSBvdXQgd2hpbGUgaGFuZHNoYWtlCisJVVNIT1JUCQkJCQkJU2VxdWVuY2U7CisJVVNIT1JUCQkJCQkJTWFjVGFiTWF0Y2hXQ0lEOwkvLyBBU0lDCisJQk9PTEVBTgkJCQkJCWJIVENhcDsKKwlQVk9JRAkJCQkJCXBBZDsKK30gUlRfODAyXzExX0RMUywgKlBSVF84MDJfMTFfRExTOworCit0eXBlZGVmIHN0cnVjdCBfTUxNRV9ETFNfUkVRX1NUUlVDVCB7CisgICAgUFJUXzgwMl8xMV9ETFMJcERMUzsKKyAgICBVU0hPUlQJCQlSZWFzb247Cit9IE1MTUVfRExTX1JFUV9TVFJVQ1QsICpQTUxNRV9ETFNfUkVRX1NUUlVDVDsKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIHsKKyAgICBVQ0hBUiAgIEVpZDsKKyAgICBVQ0hBUiAgIExlbjsKKyAgICBDSEFSICAgT2N0ZXRbMV07Cit9IEVJRF9TVFJVQ1QsKlBFSURfU1RSVUNULCBCRUFDT05fRUlEX1NUUlVDVCwgKlBCRUFDT05fRUlEX1NUUlVDVDsKKwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9SVE1QX1RYX1JBVEVfU1dJVENICit7CisJVUNIQVIgICBJdGVtTm87CisjaWZkZWYgUlRfQklHX0VORElBTgorCVVDSEFSCVJzdjI6MjsKKwlVQ0hBUglNb2RlOjI7CisJVUNIQVIJUnN2MToxOworCVVDSEFSCUJXOjE7CisJVUNIQVIJU2hvcnRHSToxOworCVVDSEFSCVNUQkM6MTsKKyNlbHNlCisJVUNIQVIJU1RCQzoxOworCVVDSEFSCVNob3J0R0k6MTsKKwlVQ0hBUglCVzoxOworCVVDSEFSCVJzdjE6MTsKKwlVQ0hBUglNb2RlOjI7CisJVUNIQVIJUnN2MjoyOworI2VuZGlmCisJVUNIQVIgICBDdXJyTUNTOworCVVDSEFSICAgVHJhaW5VcDsKKwlVQ0hBUiAgIFRyYWluRG93bjsKK30gUlJUTVBfVFhfUkFURV9TV0lUQ0gsICpQUlRNUF9UWF9SQVRFX1NXSVRDSDsKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT0gQVAgbWxtZS5oID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyNkZWZpbmUgVEJUVF9QUkVMT0FEX1RJTUUgICAgICAgMzg0ICAgICAgICAvLyB1c2VjLiBMb21nUHJlYW1ibGUgKyAyNC1ieXRlIGF0IDFNYnBzCisjZGVmaW5lIERFRkFVTFRfRFRJTV9QRVJJT0QgICAgIDEKKworI2RlZmluZSBNQUNfVEFCTEVfQUdFT1VUX1RJTUUJCQkzMDAJCQkvLyB1bml0OiBzZWMKKyNkZWZpbmUgTUFDX1RBQkxFX0FTU09DX1RJTUVPVVQJCQk1CQkJLy8gdW5pdDogc2VjCisjZGVmaW5lIE1BQ19UQUJMRV9GVUxMKFRhYikJCQkJKChUYWIpLnNpemUgPT0gTUFYX0xFTl9PRl9NQUNfVEFCTEUpCisKKy8vIEFQIHNoYWxsIGRyb3AgdGhlIHN0YSBpZiBjb250aW5lIFR4IGZhaWwgY291bnQgcmVhY2ggaXQuCisjZGVmaW5lIE1BQ19FTlRSWV9MSUZFX0NIRUNLX0NOVAkJMjAJCQkvLyBwYWNrZXQgY250LgorCisvLyBWYWx1ZSBkb21haW4gb2YgcE1hY0VudHJ5LT5Tc3QKK3R5cGVkZWYgZW51bSBfU3N0IHsKKyAgICBTU1RfTk9UX0FVVEgsICAgLy8gMDogZXF1aXZhbGVudCB0byBJRUVFIDgwMi4xMS8xOTk5IHN0YXRlIDEKKyAgICBTU1RfQVVUSCwgICAgICAgLy8gMTogZXF1aXZhbGVudCB0byBJRUVFIDgwMi4xMS8xOTk5IHN0YXRlIDIKKyAgICBTU1RfQVNTT0MgICAgICAgLy8gMjogZXF1aXZhbGVudCB0byBJRUVFIDgwMi4xMS8xOTk5IHN0YXRlIDMKK30gU1NUOworCisvLyB2YWx1ZSBkb21haW4gb2YgcE1hY0VudHJ5LT5BdXRoU3RhdGUKK3R5cGVkZWYgZW51bSBfQXV0aFN0YXRlIHsKKyAgICBBU19OT1RfQVVUSCwKKyAgICBBU19BVVRIX09QRU4sICAgICAgIC8vIFNUQSBoYXMgYmVlbiBhdXRoZW50aWNhdGVkIHVzaW5nIE9QRU4gU1lTVEVNCisgICAgQVNfQVVUSF9LRVksICAgICAgICAvLyBTVEEgaGFzIGJlZW4gYXV0aGVudGljYXRlZCB1c2luZyBTSEFSRUQgS0VZCisgICAgQVNfQVVUSEVOVElDQVRJTkcgICAvLyBTVEEgaXMgd2FpdGluZyBmb3IgQVVUSCBzZXEjMyB1c2luZyBTSEFSRUQgS0VZCit9IEFVVEhfU1RBVEU7CisKKy8vZm9yLXdwYSB2YWx1ZSBkb21haW4gb2YgcE1hY0VudHJ5LT5XcGFTdGF0ZSAgODAyLjFpIEQzICAgcC4xMTQKK3R5cGVkZWYgZW51bSBfQXBXcGFTdGF0ZSB7CisgICAgQVNfTk9UVVNFLCAgICAgICAgICAgICAgLy8gMAorICAgIEFTX0RJU0NPTk5FQ1QsICAgICAgICAgIC8vIDEKKyAgICBBU19ESVNDT05ORUNURUQsICAgICAgICAvLyAyCisgICAgQVNfSU5JVElBTElaRSwgICAgICAgICAgLy8gMworICAgIEFTX0FVVEhFTlRJQ0FUSU9OLCAgICAgIC8vIDQKKyAgICBBU19BVVRIRU5USUNBVElPTjIsICAgICAvLyA1CisgICAgQVNfSU5JVFBNSywgICAgICAgICAgICAgLy8gNgorICAgIEFTX0lOSVRQU0ssICAgICAgICAgICAgIC8vIDcKKyAgICBBU19QVEtTVEFSVCwgICAgICAgICAgICAvLyA4CisgICAgQVNfUFRLSU5JVF9ORUdPVElBVElORywgLy8gOQorICAgIEFTX1BUS0lOSVRET05FLCAgICAgICAgIC8vIDEwCisgICAgQVNfVVBEQVRFS0VZUywgICAgICAgICAgLy8gMTEKKyAgICBBU19JTlRFR1JJVFlfRkFJTFVSRSwgICAvLyAxMgorICAgIEFTX0tFWVVQREFURSwgICAgICAgICAgIC8vIDEzCit9IEFQX1dQQV9TVEFURTsKKworLy8gZm9yLXdwYSB2YWx1ZSBkb21haW4gb2YgcE1hY0VudHJ5LT5XcGFTdGF0ZSAgODAyLjFpIEQzICAgcC4xMTQKK3R5cGVkZWYgZW51bSBfR1RLU3RhdGUgeworICAgIFJFS0VZX05FR09USUFUSU5HLAorICAgIFJFS0VZX0VTVEFCTElTSEVELAorICAgIEtFWUVSUk9SLAorfSBHVEtfU1RBVEU7CisKKy8vICBmb3Itd3BhICB2YWx1ZSBkb21haW4gb2YgcE1hY0VudHJ5LT5XcGFTdGF0ZSAgODAyLjFpIEQzICAgcC4xMTQKK3R5cGVkZWYgZW51bSBfV3BhR1RLU3RhdGUgeworICAgIFNFVEtFWVMsCisgICAgU0VUS0VZU19ET05FLAorfSBXUEFfR1RLX1NUQVRFOworLy8gPT09PT09PT09PT09PT09PT09PT09PSBlbmQgb2YgQVAgbWxtZS5oID09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCisjZW5kaWYJLy8gTUxNRV9IX18KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvb2lkLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL29pZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyZjkxYjYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL29pZC5oCkBAIC0wLDAgKzEsOTk1IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCU1vZHVsZSBOYW1lOgorCW9pZC5oCisKKwlBYnN0cmFjdDoKKworCVJldmlzaW9uIEhpc3Rvcnk6CisJV2hvCQkJV2hlbgkJCVdoYXQKKwktLS0tLS0tLQktLS0tLS0tLS0tCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJTmFtZQkJRGF0ZQkJCU1vZGlmaWNhdGlvbiBsb2dzCisqLworI2lmbmRlZiBfT0lEX0hfCisjZGVmaW5lIF9PSURfSF8KKworCisjZGVmaW5lIFRSVUUJCQkJMQorI2RlZmluZSBGQUxTRQkJCQkwCisvLworLy8gSUVFRSA4MDIuMTEgU3RydWN0dXJlcyBhbmQgZGVmaW5pdGlvbnMKKy8vCisjZGVmaW5lIE1BWF9UWF9QT1dFUl9MRVZFTCAgICAgICAgICAgICAgMTAwICAgLyogbVcgKi8KKyNkZWZpbmUgTUFYX1JTU0lfVFJJR0dFUiAgICAgICAgICAgICAgICAtMTAgICAgLyogZEJtICovCisjZGVmaW5lIE1JTl9SU1NJX1RSSUdHRVIgICAgICAgICAgICAgICAgLTIwMCAgIC8qIGRCbSAqLworI2RlZmluZSBNQVhfRlJBR19USFJFU0hPTEQgICAgICAgICAgICAgIDIzNDYgIC8qIGJ5dGUgY291bnQgKi8KKyNkZWZpbmUgTUlOX0ZSQUdfVEhSRVNIT0xEICAgICAgICAgICAgICAyNTYgICAvKiBieXRlIGNvdW50ICovCisjZGVmaW5lIE1BWF9SVFNfVEhSRVNIT0xEICAgICAgICAgICAgICAgMjM0NyAgLyogYnl0ZSBjb3VudCAqLworCisvLyBuZXcgdHlwZXMgZm9yIE1lZGlhIFNwZWNpZmljIEluZGljYXRpb25zCisvLyBFeHRlbnNpb24gY2hhbm5lbCBvZmZzZXQKKyNkZWZpbmUgRVhUQ0hBX05PTkUJCQkwCisjZGVmaW5lIEVYVENIQV9BQk9WRQkJMHgxCisjZGVmaW5lIEVYVENIQV9CRUxPVwkJMHgzCisKKy8vIEJXCisjZGVmaW5lIEJBTkRfV0lEVEhfMjAJCTAKKyNkZWZpbmUgQkFORF9XSURUSF80MAkJMQorI2RlZmluZSBCQU5EX1dJRFRIX0JPVEgJCTIKKyNkZWZpbmUgQkFORF9XSURUSF8xMAkJMwkvLyA4MDIuMTFqIGhhcyAxME1Iei4gVGhpcyBkZWZpbml0aW9uIGlzIGZvciBpbnRlcm5hbCB1c2FnZS4gZG9lc24ndCBmaWxsIGluIHRoZSBJRSBvciBvdGhlciBmaWVsZC4KKy8vIFNIT1JUR0kKKyNkZWZpbmUgR0FQX0lOVEVSVkFMXzQwMAkxCS8vIG9ubHkgc3VwcG9ydCBpbiBIVCBtb2RlCisjZGVmaW5lIEdBUF9JTlRFUlZBTF84MDAJMAorI2RlZmluZSBHQVBfSU5URVJWQUxfQk9USAkyCisKKyNkZWZpbmUgTmRpc01lZGlhU3RhdGVDb25uZWN0ZWQJCQkxCisjZGVmaW5lIE5kaXNNZWRpYVN0YXRlRGlzY29ubmVjdGVkCQkwCisKKyNkZWZpbmUgTkRJU184MDJfMTFfTEVOR1RIX1NTSUQgICAgICAgICAzMgorI2RlZmluZSBORElTXzgwMl8xMV9MRU5HVEhfUkFURVMgICAgICAgIDgKKyNkZWZpbmUgTkRJU184MDJfMTFfTEVOR1RIX1JBVEVTX0VYICAgICAxNgorI2RlZmluZSBNQUNfQUREUl9MRU5HVEggICAgICAgICAgICAgICAgIDYKKyNkZWZpbmUgTUFYX05VTV9PRl9DSFMJCQkJCTQ5IC8vIDE0IGNoYW5uZWxzIEAyLjRHICsgIDEyQFVOSUkgKyA0IEBNTUFDICsgMTEgQEhpcGVyTEFOMiArIDcgQEphcGFuICsgMSBhcyBOVUxMIHRlcm1pbmF0aW9uYworI2RlZmluZSBNQVhfTlVNQkVSX09GX0VWRU5UCQkJCTEwICAvLyBlbnRyeSAjIGluIEVWRU5UIHRhYmxlCisjZGVmaW5lIE1BWF9OVU1CRVJfT0ZfTUFDCQkJCTMyIC8vIGlmIE1BWF9NQlNTSURfTlVNIGlzIDgsIHRoaXMgdmFsdWUgY2FuJ3QgYmUgbGFyZ2VyIHRoYW4gMjExCisjZGVmaW5lIE1BWF9OVU1CRVJfT0ZfQUNMCQkJCTY0CisjZGVmaW5lIE1BWF9MRU5HVEhfT0ZfU1VQUE9SVF9SQVRFUwkJMTIgICAgLy8gMSwgMiwgNS41LCAxMSwgNiwgOSwgMTIsIDE4LCAyNCwgMzYsIDQ4LCA1NAorI2RlZmluZSBNQVhfTlVNQkVSX09GX0RMU19FTlRSWQkJCTQKKworI2lmbmRlZiBVTkRFUl9DRQorCisjZGVmaW5lIE9JRF9HRU5fTUFDSElORV9OQU1FICAgICAgICAgICAgICAgMHgwMDAxMDIxQQorCisjaWZkZWYgUkFMSU5LX0FURQorI2RlZmluZSBSVF9RVUVSWV9BVEVfVFhET05FX0NPVU5UCQkJMHgwNDAxCisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworI2RlZmluZSBSVF9RVUVSWV9TSUdOQUxfQ09OVEVYVAkJCQkweDA0MDIKKyNkZWZpbmUgUlRfU0VUX0lBUFBfUElEICAgICAgICAgICAgICAgICAJMHgwNDA0CisjZGVmaW5lIFJUX1NFVF9BUERfUElECQkJCQkJMHgwNDA1CisjZGVmaW5lIFJUX1NFVF9ERUxfTUFDX0VOVFJZCQkJCTB4MDQwNgorCisvLworLy8gSUVFRSA4MDIuMTEgT0lEcworLy8KKyNkZWZpbmUJT0lEX0dFVF9TRVRfVE9HR0xFCQkJMHg4MDAwCisKKyNkZWZpbmUJT0lEXzgwMl8xMV9ORVRXT1JLX1RZUEVTX1NVUFBPUlRFRAkJCTB4MDEwMworI2RlZmluZQlPSURfODAyXzExX05FVFdPUktfVFlQRV9JTl9VU0UJCQkJMHgwMTA0CisjZGVmaW5lCU9JRF84MDJfMTFfUlNTSV9UUklHR0VSCQkJCQkJMHgwMTA3CisjZGVmaW5lCVJUX09JRF84MDJfMTFfUlNTSQkJCQkJCQkweDAxMDggLy9ydDI4NjAJb25seSAsIGthdGh5CisjZGVmaW5lCVJUX09JRF84MDJfMTFfUlNTSV8xCQkJCQkJMHgwMTA5IC8vcnQyODYwCW9ubHkgLCBrYXRoeQorI2RlZmluZQlSVF9PSURfODAyXzExX1JTU0lfMgkJCQkJCTB4MDEwQSAvL3J0Mjg2MAlvbmx5ICwga2F0aHkKKyNkZWZpbmUJT0lEXzgwMl8xMV9OVU1CRVJfT0ZfQU5URU5OQVMJCQkJMHgwMTBCCisjZGVmaW5lCU9JRF84MDJfMTFfUlhfQU5URU5OQV9TRUxFQ1RFRAkJCQkweDAxMEMKKyNkZWZpbmUJT0lEXzgwMl8xMV9UWF9BTlRFTk5BX1NFTEVDVEVECQkJCTB4MDEwRAorI2RlZmluZQlPSURfODAyXzExX1NVUFBPUlRFRF9SQVRFUwkJCQkJMHgwMTBFCisjZGVmaW5lCU9JRF84MDJfMTFfQUREX1dFUAkJCQkJCQkweDAxMTIKKyNkZWZpbmUJT0lEXzgwMl8xMV9SRU1PVkVfV0VQCQkJCQkJMHgwMTEzCisjZGVmaW5lCU9JRF84MDJfMTFfRElTQVNTT0NJQVRFCQkJCQkJMHgwMTE0CisjZGVmaW5lCU9JRF84MDJfMTFfUFJJVkFDWV9GSUxURVIJCQkJCTB4MDExOAorI2RlZmluZQlPSURfODAyXzExX0FTU09DSUFUSU9OX0lORk9STUFUSU9OCQkJMHgwMTFFCisjZGVmaW5lCU9JRF84MDJfMTFfVEVTVAkJCQkJCQkJMHgwMTFGCisjZGVmaW5lCVJUX09JRF84MDJfMTFfQ09VTlRSWV9SRUdJT04JCQkJMHgwNTA3CisjZGVmaW5lCU9JRF84MDJfMTFfQlNTSURfTElTVF9TQ0FOCQkJCQkweDA1MDgKKyNkZWZpbmUJT0lEXzgwMl8xMV9TU0lECQkJCQkJCQkweDA1MDkKKyNkZWZpbmUJT0lEXzgwMl8xMV9CU1NJRAkJCQkJCQkweDA1MEEKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9SQURJTwkJCQkJCQkweDA1MEIKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9QSFlfTU9ERQkJCQkJCTB4MDUwQworI2RlZmluZQlSVF9PSURfODAyXzExX1NUQV9DT05GSUcJCQkJCTB4MDUwRAorI2RlZmluZQlPSURfODAyXzExX0RFU0lSRURfUkFURVMJCQkJCTB4MDUwRQorI2RlZmluZQlSVF9PSURfODAyXzExX1BSRUFNQkxFCQkJCQkJMHgwNTBGCisjZGVmaW5lCU9JRF84MDJfMTFfV0VQX1NUQVRVUwkJCQkJCTB4MDUxMAorI2RlZmluZQlPSURfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREUJCQkJMHgwNTExCisjZGVmaW5lCU9JRF84MDJfMTFfSU5GUkFTVFJVQ1RVUkVfTU9ERQkJCQkweDA1MTIKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9SRVNFVF9DT1VOVEVSUwkJCQkweDA1MTMKKyNkZWZpbmUJT0lEXzgwMl8xMV9SVFNfVEhSRVNIT0xECQkJCQkweDA1MTQKKyNkZWZpbmUJT0lEXzgwMl8xMV9GUkFHTUVOVEFUSU9OX1RIUkVTSE9MRAkJCTB4MDUxNQorI2RlZmluZQlPSURfODAyXzExX1BPV0VSX01PREUJCQkJCQkweDA1MTYKKyNkZWZpbmUJT0lEXzgwMl8xMV9UWF9QT1dFUl9MRVZFTAkJCQkJMHgwNTE3CisjZGVmaW5lCVJUX09JRF84MDJfMTFfQUREX1dQQQkJCQkJCTB4MDUxOAorI2RlZmluZQlPSURfODAyXzExX1JFTU9WRV9LRVkJCQkJCQkweDA1MTkKKyNkZWZpbmUJT0lEXzgwMl8xMV9BRERfS0VZCQkJCQkJCTB4MDUyMAorI2RlZmluZQlPSURfODAyXzExX0NPTkZJR1VSQVRJT04JCQkJCTB4MDUyMQorI2RlZmluZQlPSURfODAyXzExX1RYX1BBQ0tFVF9CVVJTVAkJCQkJMHgwNTIyCisjZGVmaW5lCVJUX09JRF84MDJfMTFfUVVFUllfTk9JU0VfTEVWRUwJCQkJMHgwNTIzCisjZGVmaW5lCVJUX09JRF84MDJfMTFfRVhUUkFfSU5GTwkJCQkJMHgwNTI0CisjaWZkZWYJREJHCisjZGVmaW5lCVJUX09JRF84MDJfMTFfSEFSRFdBUkVfUkVHSVNURVIJCQkJMHgwNTI1CisjZW5kaWYKKyNkZWZpbmUgT0lEXzgwMl8xMV9FTkNSWVBUSU9OX1NUQVRVUyAgICAgICAgICAgIE9JRF84MDJfMTFfV0VQX1NUQVRVUworI2RlZmluZSBPSURfODAyXzExX0RFQVVUSEVOVElDQVRJT04gICAgICAgICAgICAgICAgIDB4MDUyNgorI2RlZmluZSBPSURfODAyXzExX0RST1BfVU5FTkNSWVBURUQgICAgICAgICAgICAgICAgIDB4MDUyNworI2RlZmluZSBPSURfODAyXzExX01JQ19GQUlMVVJFX1JFUE9SVF9GUkFNRSAgICAgICAgIDB4MDUyOAorCisvLyBGb3IgODAyLjF4IGRhZW1pbiB1c2luZyB0byByZXF1aXJlIGN1cnJlbnQgZHJpdmVyIGNvbmZpZ3VyYXRpb24KKyNkZWZpbmUgT0lEXzgwMl8xMV9SQURJVVNfUVVFUllfU0VUVElORwkJCQkweDA1NDAKKworI2RlZmluZQlSVF9PSURfREVWSUNFX05BTUUJCQkJCQkJMHgwNjA3CisjZGVmaW5lCVJUX09JRF9WRVJTSU9OX0lORk8JCQkJCQkJMHgwNjA4CisjZGVmaW5lCU9JRF84MDJfMTFfQlNTSURfTElTVAkJCQkJCTB4MDYwOQorI2RlZmluZQlPSURfODAyXzNfQ1VSUkVOVF9BRERSRVNTCQkJCQkweDA2MEEKKyNkZWZpbmUJT0lEX0dFTl9NRURJQV9DT05ORUNUX1NUQVRVUwkJCQkweDA2MEIKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9RVUVSWV9MSU5LX1NUQVRVUwkJCQkweDA2MEMKKyNkZWZpbmUJT0lEXzgwMl8xMV9SU1NJCQkJCQkJCQkweDA2MEQKKyNkZWZpbmUJT0lEXzgwMl8xMV9TVEFUSVNUSUNTCQkJCQkJMHgwNjBFCisjZGVmaW5lCU9JRF9HRU5fUkNWX09LCQkJCQkJCQkweDA2MEYKKyNkZWZpbmUJT0lEX0dFTl9SQ1ZfTk9fQlVGRkVSCQkJCQkJMHgwNjEwCisjZGVmaW5lCVJUX09JRF84MDJfMTFfUVVFUllfRUVQUk9NX1ZFUlNJT04JCQkweDA2MTEKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9RVUVSWV9GSVJNV0FSRV9WRVJTSU9OCQkweDA2MTIKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9RVUVSWV9MQVNUX1JYX1JBVEUJCQkweDA2MTMKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9UWF9QT1dFUl9MRVZFTF8xCQkJCTB4MDYxNAorI2RlZmluZQlSVF9PSURfODAyXzExX1FVRVJZX1BJRFZJRAkJCQkJMHgwNjE1CisvL2ZvciBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisjZGVmaW5lIE9JRF9TRVRfQ09VTlRFUk1FQVNVUkVTICAgICAgICAgICAgICAgICAgICAgMHgwNjE2CisjZGVmaW5lIE9JRF84MDJfMTFfU0VUX0lFRUU4MDIxWCAgICAgICAgICAgICAgICAgICAgMHgwNjE3CisjZGVmaW5lIE9JRF84MDJfMTFfU0VUX0lFRUU4MDIxWF9SRVFVSVJFX0tFWSAgICAgICAgMHgwNjE4CisjZGVmaW5lIE9JRF84MDJfMTFfUE1LSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjIwCisjZGVmaW5lIFJUX09JRF9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUICAgICAgICAgICAgICAgMHgwNjIxCisjZGVmaW5lIFJUX09JRF9XRV9WRVJTSU9OX0NPTVBJTEVEICAgICAgICAgICAgICAgICAgMHgwNjIyCisjZGVmaW5lIFJUX09JRF9ORVdfRFJJVkVSICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjIzCisKKworLy9ydDI4NjAgLCBrYXRoeQorI2RlZmluZQlSVF9PSURfODAyXzExX1NOUl8wCQkJCQkJCTB4MDYzMAorI2RlZmluZQlSVF9PSURfODAyXzExX1NOUl8xCQkJCQkJCTB4MDYzMQorI2RlZmluZQlSVF9PSURfODAyXzExX1FVRVJZX0xBU1RfVFhfUkFURQkJCTB4MDYzMgorI2RlZmluZQlSVF9PSURfODAyXzExX1FVRVJZX0hUX1BIWU1PREUJCQkJMHgwNjMzCisjZGVmaW5lCVJUX09JRF84MDJfMTFfU0VUX0hUX1BIWU1PREUJCQkJMHgwNjM0CisjZGVmaW5lCU9JRF84MDJfMTFfUkVMT0FEX0RFRkFVTFRTCQkJCQkweDA2MzUKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9RVUVSWV9BUFNEX1NFVFRJTkcJCQkweDA2MzYKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9TRVRfQVBTRF9TRVRUSU5HCQkJCTB4MDYzNworI2RlZmluZQlSVF9PSURfODAyXzExX1FVRVJZX0FQU0RfUFNNCQkJCTB4MDYzOAorI2RlZmluZQlSVF9PSURfODAyXzExX1NFVF9BUFNEX1BTTQkJCQkJMHgwNjM5CisjZGVmaW5lCVJUX09JRF84MDJfMTFfUVVFUllfRExTCQkJCQkJMHgwNjNBCisjZGVmaW5lCVJUX09JRF84MDJfMTFfU0VUX0RMUwkJCQkJCTB4MDYzQgorI2RlZmluZQlSVF9PSURfODAyXzExX1FVRVJZX0RMU19QQVJBTQkJCQkweDA2M0MKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9TRVRfRExTX1BBUkFNCQkJCQkweDA2M0QKKyNkZWZpbmUgUlRfT0lEXzgwMl8xMV9RVUVSWV9XTU0gICAgICAgICAgICAgIAkJMHgwNjNFCisjZGVmaW5lIFJUX09JRF84MDJfMTFfU0VUX1dNTSAgICAgIAkJCQkJMHgwNjNGCisjZGVmaW5lIFJUX09JRF84MDJfMTFfUVVFUllfSU1NRV9CQV9DQVAJCQkJMHgwNjQwCisjZGVmaW5lIFJUX09JRF84MDJfMTFfU0VUX0lNTUVfQkFfQ0FQCQkJCTB4MDY0MQorI2RlZmluZSBSVF9PSURfODAyXzExX1FVRVJZX0JBVEFCTEUJCQkJCTB4MDY0MgorI2RlZmluZSBSVF9PSURfODAyXzExX0FERF9JTU1FX0JBCQkJCQkweDA2NDMKKyNkZWZpbmUgUlRfT0lEXzgwMl8xMV9URUFSX0lNTUVfQkEJCQkJCTB4MDY0NAorI2RlZmluZSBSVF9PSURfRFJJVkVSX0RFVklDRV9OQU1FICAgICAgICAgICAgICAgICAgIDB4MDY0NQorI2RlZmluZSBSVF9PSURfODAyXzExX1FVRVJZX0RBVF9IVF9QSFlNT0RFICAgICAgICAgIDB4MDY0NgorI2RlZmluZSBSVF9PSURfUVVFUllfTVVMVElQTEVfQ0FSRF9TVVBQT1JUICAgICAgICAgIDB4MDY0NworCisvLyBSYWxpbmsgZGVmaW5lZCBPSURzCisvLyBEZW5uaXMgTGVlIG1vdmUgdG8gcGxhdGZvcm0gc3BlY2lmaWMKKworI2RlZmluZQlSVF9PSURfODAyXzExX0JTU0lECQkJCQkgIChPSURfR0VUX1NFVF9UT0dHTEUgfAlPSURfODAyXzExX0JTU0lEKQorI2RlZmluZQlSVF9PSURfODAyXzExX1NTSUQJCQkJCSAgKE9JRF9HRVRfU0VUX1RPR0dMRSB8CU9JRF84MDJfMTFfU1NJRCkKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9JTkZSQVNUUlVDVFVSRV9NT0RFCSAgKE9JRF9HRVRfU0VUX1RPR0dMRSB8CU9JRF84MDJfMTFfSU5GUkFTVFJVQ1RVUkVfTU9ERSkKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9BRERfV0VQCQkJCSAgKE9JRF9HRVRfU0VUX1RPR0dMRSB8CU9JRF84MDJfMTFfQUREX1dFUCkKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9BRERfS0VZCQkJCSAgKE9JRF9HRVRfU0VUX1RPR0dMRSB8CU9JRF84MDJfMTFfQUREX0tFWSkKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9SRU1PVkVfV0VQCQkJICAoT0lEX0dFVF9TRVRfVE9HR0xFIHwJT0lEXzgwMl8xMV9SRU1PVkVfV0VQKQorI2RlZmluZQlSVF9PSURfODAyXzExX1JFTU9WRV9LRVkJCQkgIChPSURfR0VUX1NFVF9UT0dHTEUgfAlPSURfODAyXzExX1JFTU9WRV9LRVkpCisjZGVmaW5lCVJUX09JRF84MDJfMTFfRElTQVNTT0NJQVRFCQkJICAoT0lEX0dFVF9TRVRfVE9HR0xFIHwJT0lEXzgwMl8xMV9ESVNBU1NPQ0lBVEUpCisjZGVmaW5lCVJUX09JRF84MDJfMTFfQVVUSEVOVElDQVRJT05fTU9ERQkgIChPSURfR0VUX1NFVF9UT0dHTEUgfAlPSURfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREUpCisjZGVmaW5lCVJUX09JRF84MDJfMTFfUFJJVkFDWV9GSUxURVIJCSAgKE9JRF9HRVRfU0VUX1RPR0dMRSB8CU9JRF84MDJfMTFfUFJJVkFDWV9GSUxURVIpCisjZGVmaW5lCVJUX09JRF84MDJfMTFfQlNTSURfTElTVF9TQ0FOCQkgIChPSURfR0VUX1NFVF9UT0dHTEUgfAlPSURfODAyXzExX0JTU0lEX0xJU1RfU0NBTikKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9XRVBfU1RBVFVTCQkJICAoT0lEX0dFVF9TRVRfVE9HR0xFIHwJT0lEXzgwMl8xMV9XRVBfU1RBVFVTKQorI2RlZmluZQlSVF9PSURfODAyXzExX1JFTE9BRF9ERUZBVUxUUwkJICAoT0lEX0dFVF9TRVRfVE9HR0xFIHwJT0lEXzgwMl8xMV9SRUxPQURfREVGQVVMVFMpCisjZGVmaW5lCVJUX09JRF84MDJfMTFfTkVUV09SS19UWVBFX0lOX1VTRQkgIChPSURfR0VUX1NFVF9UT0dHTEUgfAlPSURfODAyXzExX05FVFdPUktfVFlQRV9JTl9VU0UpCisjZGVmaW5lCVJUX09JRF84MDJfMTFfVFhfUE9XRVJfTEVWRUwJCSAgKE9JRF9HRVRfU0VUX1RPR0dMRSB8CU9JRF84MDJfMTFfVFhfUE9XRVJfTEVWRUwpCisjZGVmaW5lCVJUX09JRF84MDJfMTFfUlNTSV9UUklHR0VSCQkJICAoT0lEX0dFVF9TRVRfVE9HR0xFIHwJT0lEXzgwMl8xMV9SU1NJX1RSSUdHRVIpCisjZGVmaW5lCVJUX09JRF84MDJfMTFfRlJBR01FTlRBVElPTl9USFJFU0hPTEQgKE9JRF9HRVRfU0VUX1RPR0dMRSB8CU9JRF84MDJfMTFfRlJBR01FTlRBVElPTl9USFJFU0hPTEQpCisjZGVmaW5lCVJUX09JRF84MDJfMTFfUlRTX1RIUkVTSE9MRAkJCSAgKE9JRF9HRVRfU0VUX1RPR0dMRSB8CU9JRF84MDJfMTFfUlRTX1RIUkVTSE9MRCkKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9SWF9BTlRFTk5BX1NFTEVDVEVECSAgKE9JRF9HRVRfU0VUX1RPR0dMRSB8CU9JRF84MDJfMTFfUlhfQU5URU5OQV9TRUxFQ1RFRCkKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9UWF9BTlRFTk5BX1NFTEVDVEVECSAgKE9JRF9HRVRfU0VUX1RPR0dMRSB8CU9JRF84MDJfMTFfVFhfQU5URU5OQV9TRUxFQ1RFRCkKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9TVVBQT1JURURfUkFURVMJCSAgKE9JRF9HRVRfU0VUX1RPR0dMRSB8CU9JRF84MDJfMTFfU1VQUE9SVEVEX1JBVEVTKQorI2RlZmluZQlSVF9PSURfODAyXzExX0RFU0lSRURfUkFURVMJCQkgIChPSURfR0VUX1NFVF9UT0dHTEUgfAlPSURfODAyXzExX0RFU0lSRURfUkFURVMpCisjZGVmaW5lCVJUX09JRF84MDJfMTFfQ09ORklHVVJBVElPTgkJCSAgKE9JRF9HRVRfU0VUX1RPR0dMRSB8CU9JRF84MDJfMTFfQ09ORklHVVJBVElPTikKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9QT1dFUl9NT0RFCQkJICAoT0lEX0dFVF9TRVRfVE9HR0xFIHwJT0lEXzgwMl8xMV9QT1dFUl9NT0RFKQorCit0eXBlZGVmIGVudW0gX05ESVNfODAyXzExX1NUQVRVU19UWVBFCit7CisgICAgTmRpczgwMl8xMVN0YXR1c1R5cGVfQXV0aGVudGljYXRpb24sCisgICAgTmRpczgwMl8xMVN0YXR1c1R5cGVfTWVkaWFTdHJlYW1Nb2RlLAorICAgIE5kaXM4MDJfMTFTdGF0dXNUeXBlX1BNS0lEX0NhbmRpZGF0ZUxpc3QsCisgICAgTmRpczgwMl8xMVN0YXR1c1R5cGVNYXggICAgLy8gbm90IGEgcmVhbCB0eXBlLCBkZWZpbmVkIGFzIGFuIHVwcGVyIGJvdW5kCit9IE5ESVNfODAyXzExX1NUQVRVU19UWVBFLCAqUE5ESVNfODAyXzExX1NUQVRVU19UWVBFOworCit0eXBlZGVmIFVDSEFSICAgTkRJU184MDJfMTFfTUFDX0FERFJFU1NbNl07CisKK3R5cGVkZWYgc3RydWN0IF9ORElTXzgwMl8xMV9TVEFUVVNfSU5ESUNBVElPTgoreworICAgIE5ESVNfODAyXzExX1NUQVRVU19UWVBFIFN0YXR1c1R5cGU7Cit9IE5ESVNfODAyXzExX1NUQVRVU19JTkRJQ0FUSU9OLCAqUE5ESVNfODAyXzExX1NUQVRVU19JTkRJQ0FUSU9OOworCisvLyBtYXNrIGZvciBhdXRoZW50aWNhdGlvbi9pbnRlZ3JpdHkgZmllbGRzCisjZGVmaW5lIE5ESVNfODAyXzExX0FVVEhfUkVRVUVTVF9BVVRIX0ZJRUxEUyAgICAgICAgMHgwZgorCisjZGVmaW5lIE5ESVNfODAyXzExX0FVVEhfUkVRVUVTVF9SRUFVVEggICAgICAgICAgICAgMHgwMQorI2RlZmluZSBORElTXzgwMl8xMV9BVVRIX1JFUVVFU1RfS0VZVVBEQVRFICAgICAgICAgIDB4MDIKKyNkZWZpbmUgTkRJU184MDJfMTFfQVVUSF9SRVFVRVNUX1BBSVJXSVNFX0VSUk9SICAgICAweDA2CisjZGVmaW5lIE5ESVNfODAyXzExX0FVVEhfUkVRVUVTVF9HUk9VUF9FUlJPUiAgICAgICAgMHgwRQorCit0eXBlZGVmIHN0cnVjdCBfTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fUkVRVUVTVAoreworICAgIFVMT05HIExlbmd0aDsgICAgICAgICAgICAvLyBMZW5ndGggb2Ygc3RydWN0dXJlCisgICAgTkRJU184MDJfMTFfTUFDX0FERFJFU1MgQnNzaWQ7CisgICAgVUxPTkcgRmxhZ3M7Cit9IE5ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX1JFUVVFU1QsICpQTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fUkVRVUVTVDsKKworLy9BZGRlZCBuZXcgdHlwZXMgZm9yIFBNS0lEIENhbmRpZGF0ZSBsaXN0cy4KK3R5cGVkZWYgc3RydWN0IF9QTUtJRF9DQU5ESURBVEUgeworICAgIE5ESVNfODAyXzExX01BQ19BRERSRVNTIEJTU0lEOworICAgIFVMT05HIEZsYWdzOworfSBQTUtJRF9DQU5ESURBVEUsICpQUE1LSURfQ0FORElEQVRFOworCit0eXBlZGVmIHN0cnVjdCBfTkRJU184MDJfMTFfUE1LSURfQ0FORElEQVRFX0xJU1QKK3sKKyAgICBVTE9ORyBWZXJzaW9uOyAgICAgICAvLyBWZXJzaW9uIG9mIHRoZSBzdHJ1Y3R1cmUKKyAgICBVTE9ORyBOdW1DYW5kaWRhdGVzOyAvLyBOby4gb2YgcG1raWQgY2FuZGlkYXRlcworICAgIFBNS0lEX0NBTkRJREFURSBDYW5kaWRhdGVMaXN0WzFdOworfSBORElTXzgwMl8xMV9QTUtJRF9DQU5ESURBVEVfTElTVCwgKlBORElTXzgwMl8xMV9QTUtJRF9DQU5ESURBVEVfTElTVDsKKworLy9GbGFncyBmb3IgUE1LSUQgQ2FuZGlkYXRlIGxpc3Qgc3RydWN0dXJlCisjZGVmaW5lIE5ESVNfODAyXzExX1BNS0lEX0NBTkRJREFURV9QUkVBVVRIX0VOQUJMRUQJMHgwMQorCisvLyBBZGRlZCBuZXcgdHlwZXMgZm9yIE9GRE0gNUcgYW5kIDIuNEcKK3R5cGVkZWYgZW51bSBfTkRJU184MDJfMTFfTkVUV09SS19UWVBFCit7CisgICBOZGlzODAyXzExRkgsCisgICBOZGlzODAyXzExRFMsCisgICAgTmRpczgwMl8xMU9GRE01LAorICAgIE5kaXM4MDJfMTFPRkRNNV9OLAorICAgIE5kaXM4MDJfMTFPRkRNMjQsCisgICAgTmRpczgwMl8xMU9GRE0yNF9OLAorICAgTmRpczgwMl8xMUF1dG9tb2RlLAorICAgIE5kaXM4MDJfMTFOZXR3b3JrVHlwZU1heCAgICAvLyBub3QgYSByZWFsIHR5cGUsIGRlZmluZWQgYXMgYW4gdXBwZXIgYm91bmQKK30gTkRJU184MDJfMTFfTkVUV09SS19UWVBFLCAqUE5ESVNfODAyXzExX05FVFdPUktfVFlQRTsKKwordHlwZWRlZiBzdHJ1Y3QgX05ESVNfODAyXzExX05FVFdPUktfVFlQRV9MSVNUCit7CisgICAgVUlOVCAgICAgICAgICAgICAgICAgICAgICAgTnVtYmVyT2ZJdGVtczsgIC8vIGluIGxpc3QgYmVsb3csIGF0IGxlYXN0IDEKKyAgIE5ESVNfODAyXzExX05FVFdPUktfVFlQRSAgICBOZXR3b3JrVHlwZSBbMV07Cit9IE5ESVNfODAyXzExX05FVFdPUktfVFlQRV9MSVNULCAqUE5ESVNfODAyXzExX05FVFdPUktfVFlQRV9MSVNUOworCit0eXBlZGVmIGVudW0gX05ESVNfODAyXzExX1BPV0VSX01PREUKK3sKKyAgICBOZGlzODAyXzExUG93ZXJNb2RlQ0FNLAorICAgIE5kaXM4MDJfMTFQb3dlck1vZGVNQVhfUFNQLAorICAgIE5kaXM4MDJfMTFQb3dlck1vZGVGYXN0X1BTUCwKKyAgICBOZGlzODAyXzExUG93ZXJNb2RlTGVnYWN5X1BTUCwKKyAgICBOZGlzODAyXzExUG93ZXJNb2RlTWF4ICAgICAgLy8gbm90IGEgcmVhbCBtb2RlLCBkZWZpbmVkIGFzIGFuIHVwcGVyIGJvdW5kCit9IE5ESVNfODAyXzExX1BPV0VSX01PREUsICpQTkRJU184MDJfMTFfUE9XRVJfTU9ERTsKKwordHlwZWRlZiBVTE9ORyAgIE5ESVNfODAyXzExX1RYX1BPV0VSX0xFVkVMOyAvLyBpbiBtaWxsaXdhdHRzCisKKy8vCisvLyBSZWNlaXZlZCBTaWduYWwgU3RyZW5ndGggSW5kaWNhdGlvbgorLy8KK3R5cGVkZWYgTE9ORyAgICBORElTXzgwMl8xMV9SU1NJOyAgICAgICAgICAgLy8gaW4gZEJtCisKK3R5cGVkZWYgc3RydWN0IF9ORElTXzgwMl8xMV9DT05GSUdVUkFUSU9OX0ZICit7CisgICBVTE9ORyAgICAgICAgICAgTGVuZ3RoOyAgICAgICAgICAgIC8vIExlbmd0aCBvZiBzdHJ1Y3R1cmUKKyAgIFVMT05HICAgICAgICAgICBIb3BQYXR0ZXJuOyAgICAgICAgLy8gQXMgZGVmaW5lZCBieSA4MDIuMTEsIE1TQiBzZXQKKyAgIFVMT05HICAgICAgICAgICBIb3BTZXQ7ICAgICAgICAgICAgLy8gdG8gb25lIGlmIG5vbi04MDIuMTEKKyAgIFVMT05HICAgICAgICAgICBEd2VsbFRpbWU7ICAgICAgICAgLy8gdW5pdHMgYXJlIEt1c2VjCit9IE5ESVNfODAyXzExX0NPTkZJR1VSQVRJT05fRkgsICpQTkRJU184MDJfMTFfQ09ORklHVVJBVElPTl9GSDsKKwordHlwZWRlZiBzdHJ1Y3QgX05ESVNfODAyXzExX0NPTkZJR1VSQVRJT04KK3sKKyAgIFVMT05HICAgICAgICAgICAgICAgICAgICAgICAgICAgTGVuZ3RoOyAgICAgICAgICAgICAvLyBMZW5ndGggb2Ygc3RydWN0dXJlCisgICBVTE9ORyAgICAgICAgICAgICAgICAgICAgICAgICAgIEJlYWNvblBlcmlvZDsgICAgICAgLy8gdW5pdHMgYXJlIEt1c2VjCisgICBVTE9ORyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFUSU1XaW5kb3c7ICAgICAgICAgLy8gdW5pdHMgYXJlIEt1c2VjCisgICBVTE9ORyAgICAgICAgICAgICAgICAgICAgICAgICAgIERTQ29uZmlnOyAgICAgICAgICAgLy8gRnJlcXVlbmN5LCB1bml0cyBhcmUga0h6CisgICBORElTXzgwMl8xMV9DT05GSUdVUkFUSU9OX0ZIICAgIEZIQ29uZmlnOworfSBORElTXzgwMl8xMV9DT05GSUdVUkFUSU9OLCAqUE5ESVNfODAyXzExX0NPTkZJR1VSQVRJT047CisKK3R5cGVkZWYgc3RydWN0IF9ORElTXzgwMl8xMV9TVEFUSVNUSUNTCit7CisgICBVTE9ORyAgICAgICAgICAgTGVuZ3RoOyAgICAgICAgICAgICAvLyBMZW5ndGggb2Ygc3RydWN0dXJlCisgICBMQVJHRV9JTlRFR0VSICAgVHJhbnNtaXR0ZWRGcmFnbWVudENvdW50OworICAgTEFSR0VfSU5URUdFUiAgIE11bHRpY2FzdFRyYW5zbWl0dGVkRnJhbWVDb3VudDsKKyAgIExBUkdFX0lOVEVHRVIgICBGYWlsZWRDb3VudDsKKyAgIExBUkdFX0lOVEVHRVIgICBSZXRyeUNvdW50OworICAgTEFSR0VfSU5URUdFUiAgIE11bHRpcGxlUmV0cnlDb3VudDsKKyAgIExBUkdFX0lOVEVHRVIgICBSVFNTdWNjZXNzQ291bnQ7CisgICBMQVJHRV9JTlRFR0VSICAgUlRTRmFpbHVyZUNvdW50OworICAgTEFSR0VfSU5URUdFUiAgIEFDS0ZhaWx1cmVDb3VudDsKKyAgIExBUkdFX0lOVEVHRVIgICBGcmFtZUR1cGxpY2F0ZUNvdW50OworICAgTEFSR0VfSU5URUdFUiAgIFJlY2VpdmVkRnJhZ21lbnRDb3VudDsKKyAgIExBUkdFX0lOVEVHRVIgICBNdWx0aWNhc3RSZWNlaXZlZEZyYW1lQ291bnQ7CisgICBMQVJHRV9JTlRFR0VSICAgRkNTRXJyb3JDb3VudDsKKyAgIExBUkdFX0lOVEVHRVIgICBUS0lQTG9jYWxNSUNGYWlsdXJlczsKKyAgIExBUkdFX0lOVEVHRVIgICBUS0lQUmVtb3RlTUlDRXJyb3JzOworICAgTEFSR0VfSU5URUdFUiAgIFRLSVBJQ1ZFcnJvcnM7CisgICBMQVJHRV9JTlRFR0VSICAgVEtJUENvdW50ZXJNZWFzdXJlc0ludm9rZWQ7CisgICBMQVJHRV9JTlRFR0VSICAgVEtJUFJlcGxheXM7CisgICBMQVJHRV9JTlRFR0VSICAgQ0NNUEZvcm1hdEVycm9yczsKKyAgIExBUkdFX0lOVEVHRVIgICBDQ01QUmVwbGF5czsKKyAgIExBUkdFX0lOVEVHRVIgICBDQ01QRGVjcnlwdEVycm9yczsKKyAgIExBUkdFX0lOVEVHRVIgICBGb3VyV2F5SGFuZHNoYWtlRmFpbHVyZXM7Cit9IE5ESVNfODAyXzExX1NUQVRJU1RJQ1MsICpQTkRJU184MDJfMTFfU1RBVElTVElDUzsKKwordHlwZWRlZiAgVUxPTkcgIE5ESVNfODAyXzExX0tFWV9JTkRFWDsKK3R5cGVkZWYgVUxPTkdMT05HICAgTkRJU184MDJfMTFfS0VZX1JTQzsKKworI2RlZmluZSBNQVhfUkFESVVTX1NSVl9OVU0JCQkyCSAgLy8gODAyLjF4IGZhaWxvdmVyIG51bWJlcgorCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX1JBRElVU19TUlZfSU5GTyB7CisJVUlOVDMyCQkJcmFkaXVzX2lwOworCVVJTlQzMgkJCXJhZGl1c19wb3J0OworCVVDSEFSCQkJcmFkaXVzX2tleVs2NF07CisJVUNIQVIJCQlyYWRpdXNfa2V5X2xlbjsKK30gUkFESVVTX1NSVl9JTkZPLCAqUFJBRElVU19TUlZfSU5GTzsKKwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9SQURJVVNfS0VZX0lORk8KK3sKKwlVQ0hBUgkJCXJhZGl1c19zcnZfbnVtOworCVJBRElVU19TUlZfSU5GTwlyYWRpdXNfc3J2X2luZm9bTUFYX1JBRElVU19TUlZfTlVNXTsKKwlVQ0hBUgkJCWllZWU4MDIxeFdFUDsJCSAvLyBkeW5hbWljIFdFUAorICAgIFVDSEFSICAgICAgICAgICBrZXlfaW5kZXg7CisgICAgVUNIQVIgICAgICAgICAgIGtleV9sZW5ndGg7ICAgICAgICAgIC8vIGxlbmd0aCBvZiBrZXkgaW4gYnl0ZXMKKyAgICBVQ0hBUiAgICAgICAgICAga2V5X21hdGVyaWFsWzEzXTsKK30gUkFESVVTX0tFWV9JTkZPLCAqUFJBRElVU19LRVlfSU5GTzsKKworLy8gSXQncyB1c2VkIGJ5IDgwMi4xeCBkYWVtb24gdG8gcmVxdWlyZSByZWxhdGl2ZSBjb25maWd1cmF0aW9uCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX1JBRElVU19DT05GCit7CisgICAgVUlOVDMyICAgICAgICAgIExlbmd0aDsgICAgICAgICAgICAgLy8gTGVuZ3RoIG9mIHRoaXMgc3RydWN0dXJlCisgICAgVUNIQVIJCQltYnNzX251bTsJCQkvLyBpbmRpY2F0ZSBtdWx0aXBsZSBCU1MgbnVtYmVyCisJVUlOVDMyCQkJb3duX2lwX2FkZHI7CisJVUlOVDMyCQkJcmV0cnlfaW50ZXJ2YWw7CisJVUlOVDMyCQkJc2Vzc2lvbl90aW1lb3V0X2ludGVydmFsOworCVVDSEFSCQkJRUFQaWZuYW1lW0lGTkFNU0laXTsKKwlVQ0hBUgkJCUVBUGlmbmFtZV9sZW47CisJVUNIQVIgCQkJUHJlQXV0aGlmbmFtZVtJRk5BTVNJWl07CisJVUNIQVIJCQlQcmVBdXRoaWZuYW1lX2xlbjsKKwlSQURJVVNfS0VZX0lORk8JUmFkaXVzSW5mb1s4LypNQVhfTUJTU0lEX05VTSovXTsKK30gUkFESVVTX0NPTkYsICpQUkFESVVTX0NPTkY7CisKKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisvLyBLZXkgbWFwcGluZyBrZXlzIHJlcXVpcmUgYSBCU1NJRAordHlwZWRlZiBzdHJ1Y3QgX05ESVNfODAyXzExX0tFWQoreworICAgIFVJTlQgICAgICAgICAgIExlbmd0aDsgICAgICAgICAgICAgLy8gTGVuZ3RoIG9mIHRoaXMgc3RydWN0dXJlCisgICAgVUlOVCAgICAgICAgICAgS2V5SW5kZXg7CisgICAgVUlOVCAgICAgICAgICAgS2V5TGVuZ3RoOyAgICAgICAgICAvLyBsZW5ndGggb2Yga2V5IGluIGJ5dGVzCisgICAgTkRJU184MDJfMTFfTUFDX0FERFJFU1MgQlNTSUQ7CisgICAgTkRJU184MDJfMTFfS0VZX1JTQyBLZXlSU0M7CisgICAgVUNIQVIgICAgICAgICAgIEtleU1hdGVyaWFsWzFdOyAgICAgLy8gdmFyaWFibGUgbGVuZ3RoIGRlcGVuZGluZyBvbiBhYm92ZSBmaWVsZAorfSBORElTXzgwMl8xMV9LRVksICpQTkRJU184MDJfMTFfS0VZOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCit0eXBlZGVmIHN0cnVjdCBfTkRJU184MDJfMTFfUkVNT1ZFX0tFWQoreworICAgIFVJTlQgICAgICAgICAgIExlbmd0aDsgICAgICAgICAgICAgLy8gTGVuZ3RoIG9mIHRoaXMgc3RydWN0dXJlCisgICAgVUlOVCAgICAgICAgICAgS2V5SW5kZXg7CisgICAgTkRJU184MDJfMTFfTUFDX0FERFJFU1MgQlNTSUQ7Cit9IE5ESVNfODAyXzExX1JFTU9WRV9LRVksICpQTkRJU184MDJfMTFfUkVNT1ZFX0tFWTsKKwordHlwZWRlZiBzdHJ1Y3QgX05ESVNfODAyXzExX1dFUAoreworICAgVUlOVCAgICAgTGVuZ3RoOyAgICAgICAgLy8gTGVuZ3RoIG9mIHRoaXMgc3RydWN0dXJlCisgICBVSU5UICAgICBLZXlJbmRleDsgICAgICAgICAgIC8vIDAgaXMgdGhlIHBlci1jbGllbnQga2V5LCAxLU4gYXJlIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdsb2JhbCBrZXlzCisgICBVSU5UICAgICBLZXlMZW5ndGg7ICAgICAvLyBsZW5ndGggb2Yga2V5IGluIGJ5dGVzCisgICBVQ0hBUiAgICAgS2V5TWF0ZXJpYWxbMV07Ly8gdmFyaWFibGUgbGVuZ3RoIGRlcGVuZGluZyBvbiBhYm92ZSBmaWVsZAorfSBORElTXzgwMl8xMV9XRVAsICpQTkRJU184MDJfMTFfV0VQOworCisKK3R5cGVkZWYgZW51bSBfTkRJU184MDJfMTFfTkVUV09SS19JTkZSQVNUUlVDVFVSRQoreworICAgTmRpczgwMl8xMUlCU1MsCisgICBOZGlzODAyXzExSW5mcmFzdHJ1Y3R1cmUsCisgICBOZGlzODAyXzExQXV0b1Vua25vd24sCisgICBOZGlzODAyXzExTW9uaXRvciwKKyAgIE5kaXM4MDJfMTFJbmZyYXN0cnVjdHVyZU1heCAgICAgLy8gTm90IGEgcmVhbCB2YWx1ZSwgZGVmaW5lZCBhcyB1cHBlciBib3VuZAorfSBORElTXzgwMl8xMV9ORVRXT1JLX0lORlJBU1RSVUNUVVJFLCAqUE5ESVNfODAyXzExX05FVFdPUktfSU5GUkFTVFJVQ1RVUkU7CisKKy8vIEFkZCBuZXcgYXV0aGVudGljYXRpb24gbW9kZXMKK3R5cGVkZWYgZW51bSBfTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fTU9ERQoreworICAgTmRpczgwMl8xMUF1dGhNb2RlT3BlbiwKKyAgIE5kaXM4MDJfMTFBdXRoTW9kZVNoYXJlZCwKKyAgIE5kaXM4MDJfMTFBdXRoTW9kZUF1dG9Td2l0Y2gsCisgICAgTmRpczgwMl8xMUF1dGhNb2RlV1BBLAorICAgIE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSywKKyAgICBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lLAorICAgTmRpczgwMl8xMUF1dGhNb2RlV1BBMiwKKyAgIE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0ssCisgICAJTmRpczgwMl8xMUF1dGhNb2RlV1BBMVdQQTIsCisJTmRpczgwMl8xMUF1dGhNb2RlV1BBMVBTS1dQQTJQU0ssCisgICBOZGlzODAyXzExQXV0aE1vZGVNYXggICAgICAgICAgIC8vIE5vdCBhIHJlYWwgbW9kZSwgZGVmaW5lZCBhcyB1cHBlciBib3VuZAorfSBORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9NT0RFLCAqUE5ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREU7CisKK3R5cGVkZWYgVUNIQVIgICBORElTXzgwMl8xMV9SQVRFU1tORElTXzgwMl8xMV9MRU5HVEhfUkFURVNdOyAgICAgICAgLy8gU2V0IG9mIDggZGF0YSByYXRlcwordHlwZWRlZiBVQ0hBUiAgIE5ESVNfODAyXzExX1JBVEVTX0VYW05ESVNfODAyXzExX0xFTkdUSF9SQVRFU19FWF07ICAvLyBTZXQgb2YgMTYgZGF0YSByYXRlcworCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX05ESVNfODAyXzExX1NTSUQKK3sKKyAgICBVSU5UICAgU3NpZExlbmd0aDsgICAgICAgICAvLyBsZW5ndGggb2YgU1NJRCBmaWVsZCBiZWxvdywgaW4gYnl0ZXM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgY2FuIGJlIHplcm8uCisgICAgVUNIQVIgICBTc2lkW05ESVNfODAyXzExX0xFTkdUSF9TU0lEXTsgICAgICAgICAgIC8vIFNTSUQgaW5mb3JtYXRpb24gZmllbGQKK30gTkRJU184MDJfMTFfU1NJRCwgKlBORElTXzgwMl8xMV9TU0lEOworCisKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfTkRJU19XTEFOX0JTU0lECit7CisgICBVTE9ORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMZW5ndGg7ICAgICAvLyBMZW5ndGggb2YgdGhpcyBzdHJ1Y3R1cmUKKyAgIE5ESVNfODAyXzExX01BQ19BRERSRVNTICAgICAgICAgICAgIE1hY0FkZHJlc3M7IC8vIEJTU0lECisgICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZFsyXTsKKyAgIE5ESVNfODAyXzExX1NTSUQgICAgICAgICAgICAgICAgICAgIFNzaWQ7ICAgICAgIC8vIFNTSUQKKyAgIFVMT05HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaXZhY3k7ICAgIC8vIFdFUCBlbmNyeXB0aW9uIHJlcXVpcmVtZW50CisgICBORElTXzgwMl8xMV9SU1NJICAgICAgICAgICAgICAgICAgICBSc3NpOyAgICAgICAvLyByZWNlaXZlIHNpZ25hbCBzdHJlbmd0aCBpbiBkQm0KKyAgIE5ESVNfODAyXzExX05FVFdPUktfVFlQRSAgICAgICAgICAgIE5ldHdvcmtUeXBlSW5Vc2U7CisgICBORElTXzgwMl8xMV9DT05GSUdVUkFUSU9OICAgICAgICAgICBDb25maWd1cmF0aW9uOworICAgTkRJU184MDJfMTFfTkVUV09SS19JTkZSQVNUUlVDVFVSRSAgSW5mcmFzdHJ1Y3R1cmVNb2RlOworICAgTkRJU184MDJfMTFfUkFURVMgICAgICAgICAgICAgICAgICAgU3VwcG9ydGVkUmF0ZXM7Cit9IE5ESVNfV0xBTl9CU1NJRCwgKlBORElTX1dMQU5fQlNTSUQ7CisKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfTkRJU184MDJfMTFfQlNTSURfTElTVAoreworICAgVUlOVCAgICAgICAgICAgTnVtYmVyT2ZJdGVtczsgICAgICAvLyBpbiBsaXN0IGJlbG93LCBhdCBsZWFzdCAxCisgICBORElTX1dMQU5fQlNTSUQgQnNzaWRbMV07Cit9IE5ESVNfODAyXzExX0JTU0lEX0xJU1QsICpQTkRJU184MDJfMTFfQlNTSURfTElTVDsKKworLy8gQWRkZWQgQ2FwYWJpbGl0aWVzLCBJRUxlbmd0aCBhbmQgSUVzIGZvciBlYWNoIEJTU0lECit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX05ESVNfV0xBTl9CU1NJRF9FWAoreworICAgIFVMT05HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExlbmd0aDsgICAgICAgICAgICAgLy8gTGVuZ3RoIG9mIHRoaXMgc3RydWN0dXJlCisgICAgTkRJU184MDJfMTFfTUFDX0FERFJFU1MgICAgICAgICAgICAgTWFjQWRkcmVzczsgICAgICAgICAvLyBCU1NJRAorICAgIFVDSEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkWzJdOworICAgIE5ESVNfODAyXzExX1NTSUQgICAgICAgICAgICAgICAgICAgIFNzaWQ7ICAgICAgICAgICAgICAgLy8gU1NJRAorICAgIFVJTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaXZhY3k7ICAgICAgICAgICAgLy8gV0VQIGVuY3J5cHRpb24gcmVxdWlyZW1lbnQKKyAgICBORElTXzgwMl8xMV9SU1NJICAgICAgICAgICAgICAgICAgICBSc3NpOyAgICAgICAgICAgICAgIC8vIHJlY2VpdmUgc2lnbmFsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdHJlbmd0aCBpbiBkQm0KKyAgICBORElTXzgwMl8xMV9ORVRXT1JLX1RZUEUgICAgICAgICAgICBOZXR3b3JrVHlwZUluVXNlOworICAgIE5ESVNfODAyXzExX0NPTkZJR1VSQVRJT04gICAgICAgICAgIENvbmZpZ3VyYXRpb247CisgICAgTkRJU184MDJfMTFfTkVUV09SS19JTkZSQVNUUlVDVFVSRSAgSW5mcmFzdHJ1Y3R1cmVNb2RlOworICAgIE5ESVNfODAyXzExX1JBVEVTX0VYICAgICAgICAgICAgICAgIFN1cHBvcnRlZFJhdGVzOworICAgIFVMT05HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElFTGVuZ3RoOworICAgIFVDSEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElFc1sxXTsKK30gTkRJU19XTEFOX0JTU0lEX0VYLCAqUE5ESVNfV0xBTl9CU1NJRF9FWDsKKwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9ORElTXzgwMl8xMV9CU1NJRF9MSVNUX0VYCit7CisgICAgVUlOVCAgICAgICAgICAgICAgICAgICBOdW1iZXJPZkl0ZW1zOyAgICAgIC8vIGluIGxpc3QgYmVsb3csIGF0IGxlYXN0IDEKKyAgICBORElTX1dMQU5fQlNTSURfRVggICAgICBCc3NpZFsxXTsKK30gTkRJU184MDJfMTFfQlNTSURfTElTVF9FWCwgKlBORElTXzgwMl8xMV9CU1NJRF9MSVNUX0VYOworCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX05ESVNfODAyXzExX0ZJWEVEX0lFcworeworICAgIFVDSEFSIFRpbWVzdGFtcFs4XTsKKyAgICBVU0hPUlQgQmVhY29uSW50ZXJ2YWw7CisgICAgVVNIT1JUIENhcGFiaWxpdGllczsKK30gTkRJU184MDJfMTFfRklYRURfSUVzLCAqUE5ESVNfODAyXzExX0ZJWEVEX0lFczsKKwordHlwZWRlZiBzdHJ1Y3QgX05ESVNfODAyXzExX1ZBUklBQkxFX0lFcworeworICAgIFVDSEFSIEVsZW1lbnRJRDsKKyAgICBVQ0hBUiBMZW5ndGg7ICAgIC8vIE51bWJlciBvZiBieXRlcyBpbiBkYXRhIGZpZWxkCisgICAgVUNIQVIgZGF0YVsxXTsKK30gTkRJU184MDJfMTFfVkFSSUFCTEVfSUVzLCAqUE5ESVNfODAyXzExX1ZBUklBQkxFX0lFczsKKwordHlwZWRlZiAgVUxPTkcgICBORElTXzgwMl8xMV9GUkFHTUVOVEFUSU9OX1RIUkVTSE9MRDsKKwordHlwZWRlZiAgVUxPTkcgICBORElTXzgwMl8xMV9SVFNfVEhSRVNIT0xEOworCit0eXBlZGVmICBVTE9ORyAgIE5ESVNfODAyXzExX0FOVEVOTkE7CisKK3R5cGVkZWYgZW51bSBfTkRJU184MDJfMTFfUFJJVkFDWV9GSUxURVIKK3sKKyAgIE5kaXM4MDJfMTFQcml2RmlsdGVyQWNjZXB0QWxsLAorICAgTmRpczgwMl8xMVByaXZGaWx0ZXI4MDIxeFdFUAorfSBORElTXzgwMl8xMV9QUklWQUNZX0ZJTFRFUiwgKlBORElTXzgwMl8xMV9QUklWQUNZX0ZJTFRFUjsKKworLy8gQWRkZWQgbmV3IGVuY3J5cHRpb24gdHlwZXMKKy8vIEFsc28gYWxpYXNlZCB0eXBlZGVmIHRvIG5ldyBuYW1lCit0eXBlZGVmIGVudW0gX05ESVNfODAyXzExX1dFUF9TVEFUVVMKK3sKKyAgIE5kaXM4MDJfMTFXRVBFbmFibGVkLAorICAgIE5kaXM4MDJfMTFFbmNyeXB0aW9uMUVuYWJsZWQgPSBOZGlzODAyXzExV0VQRW5hYmxlZCwKKyAgIE5kaXM4MDJfMTFXRVBEaXNhYmxlZCwKKyAgICBOZGlzODAyXzExRW5jcnlwdGlvbkRpc2FibGVkID0gTmRpczgwMl8xMVdFUERpc2FibGVkLAorICAgTmRpczgwMl8xMVdFUEtleUFic2VudCwKKyAgICBOZGlzODAyXzExRW5jcnlwdGlvbjFLZXlBYnNlbnQgPSBOZGlzODAyXzExV0VQS2V5QWJzZW50LAorICAgTmRpczgwMl8xMVdFUE5vdFN1cHBvcnRlZCwKKyAgICBOZGlzODAyXzExRW5jcnlwdGlvbk5vdFN1cHBvcnRlZCA9IE5kaXM4MDJfMTFXRVBOb3RTdXBwb3J0ZWQsCisgICAgTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCwKKyAgICBOZGlzODAyXzExRW5jcnlwdGlvbjJLZXlBYnNlbnQsCisgICAgTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCwKKyAgICBOZGlzODAyXzExRW5jcnlwdGlvbjNLZXlBYnNlbnQsCisgICAgTmRpczgwMl8xMUVuY3J5cHRpb240RW5hYmxlZCwJLy8gVEtJUCBvciBBRVMgbWl4CisgICAgTmRpczgwMl8xMUVuY3J5cHRpb240S2V5QWJzZW50LAorfSBORElTXzgwMl8xMV9XRVBfU1RBVFVTLCAqUE5ESVNfODAyXzExX1dFUF9TVEFUVVMsCisgIE5ESVNfODAyXzExX0VOQ1JZUFRJT05fU1RBVFVTLCAqUE5ESVNfODAyXzExX0VOQ1JZUFRJT05fU1RBVFVTOworCit0eXBlZGVmIGVudW0gX05ESVNfODAyXzExX1JFTE9BRF9ERUZBVUxUUworeworICAgTmRpczgwMl8xMVJlbG9hZFdFUEtleXMKK30gTkRJU184MDJfMTFfUkVMT0FEX0RFRkFVTFRTLCAqUE5ESVNfODAyXzExX1JFTE9BRF9ERUZBVUxUUzsKKworI2RlZmluZSBORElTXzgwMl8xMV9BSV9SRVFGSV9DQVBBQklMSVRJRVMgICAgICAxCisjZGVmaW5lIE5ESVNfODAyXzExX0FJX1JFUUZJX0xJU1RFTklOVEVSVkFMICAgIDIKKyNkZWZpbmUgTkRJU184MDJfMTFfQUlfUkVRRklfQ1VSUkVOVEFQQUREUkVTUyAgNAorCisjZGVmaW5lIE5ESVNfODAyXzExX0FJX1JFU0ZJX0NBUEFCSUxJVElFUyAgICAgIDEKKyNkZWZpbmUgTkRJU184MDJfMTFfQUlfUkVTRklfU1RBVFVTQ09ERSAgICAgICAgMgorI2RlZmluZSBORElTXzgwMl8xMV9BSV9SRVNGSV9BU1NPQ0lBVElPTklEICAgICA0CisKK3R5cGVkZWYgc3RydWN0IF9ORElTXzgwMl8xMV9BSV9SRVFGSQoreworICAgIFVTSE9SVCBDYXBhYmlsaXRpZXM7CisgICAgVVNIT1JUIExpc3RlbkludGVydmFsOworICAgIE5ESVNfODAyXzExX01BQ19BRERSRVNTICBDdXJyZW50QVBBZGRyZXNzOworfSBORElTXzgwMl8xMV9BSV9SRVFGSSwgKlBORElTXzgwMl8xMV9BSV9SRVFGSTsKKwordHlwZWRlZiBzdHJ1Y3QgX05ESVNfODAyXzExX0FJX1JFU0ZJCit7CisgICAgVVNIT1JUIENhcGFiaWxpdGllczsKKyAgICBVU0hPUlQgU3RhdHVzQ29kZTsKKyAgICBVU0hPUlQgQXNzb2NpYXRpb25JZDsKK30gTkRJU184MDJfMTFfQUlfUkVTRkksICpQTkRJU184MDJfMTFfQUlfUkVTRkk7CisKK3R5cGVkZWYgc3RydWN0IF9ORElTXzgwMl8xMV9BU1NPQ0lBVElPTl9JTkZPUk1BVElPTgoreworICAgIFVMT05HICAgICAgICAgICAgICAgICAgIExlbmd0aDsKKyAgICBVU0hPUlQgICAgICAgICAgICAgICAgICBBdmFpbGFibGVSZXF1ZXN0Rml4ZWRJRXM7CisgICAgTkRJU184MDJfMTFfQUlfUkVRRkkgICAgUmVxdWVzdEZpeGVkSUVzOworICAgIFVMT05HICAgICAgICAgICAgICAgICAgIFJlcXVlc3RJRUxlbmd0aDsKKyAgICBVTE9ORyAgICAgICAgICAgICAgICAgICBPZmZzZXRSZXF1ZXN0SUVzOworICAgIFVTSE9SVCAgICAgICAgICAgICAgICAgIEF2YWlsYWJsZVJlc3BvbnNlRml4ZWRJRXM7CisgICAgTkRJU184MDJfMTFfQUlfUkVTRkkgICAgUmVzcG9uc2VGaXhlZElFczsKKyAgICBVTE9ORyAgICAgICAgICAgICAgICAgICBSZXNwb25zZUlFTGVuZ3RoOworICAgIFVMT05HICAgICAgICAgICAgICAgICAgIE9mZnNldFJlc3BvbnNlSUVzOworfSBORElTXzgwMl8xMV9BU1NPQ0lBVElPTl9JTkZPUk1BVElPTiwgKlBORElTXzgwMl8xMV9BU1NPQ0lBVElPTl9JTkZPUk1BVElPTjsKKwordHlwZWRlZiBzdHJ1Y3QgX05ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX0VWRU5UCit7CisgICAgTkRJU184MDJfMTFfU1RBVFVTX0lORElDQVRJT04gICAgICAgU3RhdHVzOworICAgIE5ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX1JFUVVFU1QgIFJlcXVlc3RbMV07Cit9IE5ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX0VWRU5ULCAqUE5ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX0VWRU5UOworCisvLyA4MDIuMTEgTWVkaWEgc3RyZWFtIGNvbnN0cmFpbnRzLCBhc3NvY2lhdGVkIHdpdGggT0lEXzgwMl8xMV9NRURJQV9TVFJFQU1fTU9ERQordHlwZWRlZiBlbnVtIF9ORElTXzgwMl8xMV9NRURJQV9TVFJFQU1fTU9ERQoreworICAgIE5kaXM4MDJfMTFNZWRpYVN0cmVhbU9mZiwKKyAgICBOZGlzODAyXzExTWVkaWFTdHJlYW1PbiwKK30gTkRJU184MDJfMTFfTUVESUFfU1RSRUFNX01PREUsICpQTkRJU184MDJfMTFfTUVESUFfU1RSRUFNX01PREU7CisKKy8vIFBNS0lEIFN0cnVjdHVyZXMKK3R5cGVkZWYgVUNIQVIgICBORElTXzgwMl8xMV9QTUtJRF9WQUxVRVsxNl07CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKK3R5cGVkZWYgc3RydWN0IF9CU1NJRF9JTkZPCit7CisgICAgTkRJU184MDJfMTFfTUFDX0FERFJFU1MgQlNTSUQ7CisgICAgTkRJU184MDJfMTFfUE1LSURfVkFMVUUgUE1LSUQ7Cit9IEJTU0lEX0lORk8sICpQQlNTSURfSU5GTzsKKwordHlwZWRlZiBzdHJ1Y3QgX05ESVNfODAyXzExX1BNS0lECit7CisgICAgVUlOVCAgICBMZW5ndGg7CisgICAgVUlOVCAgICBCU1NJREluZm9Db3VudDsKKyAgICBCU1NJRF9JTkZPIEJTU0lESW5mb1sxXTsKK30gTkRJU184MDJfMTFfUE1LSUQsICpQTkRJU184MDJfMTFfUE1LSUQ7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwordHlwZWRlZiBzdHJ1Y3QgX05ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX0VOQ1JZUFRJT04KK3sKKyAgICBORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9NT0RFIEF1dGhNb2RlU3VwcG9ydGVkOworICAgIE5ESVNfODAyXzExX0VOQ1JZUFRJT05fU1RBVFVTIEVuY3J5cHRTdGF0dXNTdXBwb3J0ZWQ7Cit9IE5ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX0VOQ1JZUFRJT04sICpQTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fRU5DUllQVElPTjsKKwordHlwZWRlZiBzdHJ1Y3QgX05ESVNfODAyXzExX0NBUEFCSUxJVFkKK3sKKyAgICAgVUxPTkcgTGVuZ3RoOworICAgICBVTE9ORyBWZXJzaW9uOworICAgICBVTE9ORyBOb09mUE1LSURzOworICAgICBVTE9ORyBOb09mQXV0aEVuY3J5cHRQYWlyc1N1cHBvcnRlZDsKKyAgICAgTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fRU5DUllQVElPTiBBdXRoZW50aWNhdGlvbkVuY3J5cHRpb25TdXBwb3J0ZWRbMV07Cit9IE5ESVNfODAyXzExX0NBUEFCSUxJVFksICpQTkRJU184MDJfMTFfQ0FQQUJJTElUWTsKKworLy8jZW5kaWYgLy9vZiBXSU4gMmsKKyNlbmRpZiAvL1VOREVSX0NFCisKKyNpZiBXSVJFTEVTU19FWFQgPD0gMTEKKyNpZm5kZWYgU0lPQ0RFVlBSSVZBVEUKKyNkZWZpbmUgU0lPQ0RFVlBSSVZBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhCRTAKKyNlbmRpZgorI2RlZmluZSBTSU9DSVdGSVJTVFBSSVYJCQkJCQkJCVNJT0NERVZQUklWQVRFCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorI2RlZmluZSBSVFBSSVZfSU9DVExfU0VUCQkJCQkJCShTSU9DSVdGSVJTVFBSSVYgKyAweDAyKQorCisjaWZkZWYgREJHCisjZGVmaW5lIFJUUFJJVl9JT0NUTF9CQlAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFNJT0NJV0ZJUlNUUFJJViArIDB4MDMpCisjZGVmaW5lIFJUUFJJVl9JT0NUTF9NQUMgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFNJT0NJV0ZJUlNUUFJJViArIDB4MDUpCisjZGVmaW5lIFJUUFJJVl9JT0NUTF9FMlAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFNJT0NJV0ZJUlNUUFJJViArIDB4MDcpCisjZW5kaWYKKworI2lmZGVmIFJBTElOS19BVEUKKyNpZmRlZiBSQUxJTktfMjh4eF9RQQorI2RlZmluZSBSVFBSSVZfSU9DVExfQVRFCQkJCQkJCShTSU9DSVdGSVJTVFBSSVYgKyAweDA4KQorI2VuZGlmIC8vIFJBTElOS18yOHh4X1FBIC8vCisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCisjZGVmaW5lIFJUUFJJVl9JT0NUTF9TVEFUSVNUSUNTICAgICAgICAgICAgICAgICAgICAgKFNJT0NJV0ZJUlNUUFJJViArIDB4MDkpCisjZGVmaW5lIFJUUFJJVl9JT0NUTF9BRERfUE1LSURfQ0FDSEUgICAgICAgICAgICAgICAgKFNJT0NJV0ZJUlNUUFJJViArIDB4MEEpCisjZGVmaW5lIFJUUFJJVl9JT0NUTF9SQURJVVNfREFUQSAgICAgICAgICAgICAgICAgICAgKFNJT0NJV0ZJUlNUUFJJViArIDB4MEMpCisjZGVmaW5lIFJUUFJJVl9JT0NUTF9HU0lURVNVUlZFWQkJCQkJKFNJT0NJV0ZJUlNUUFJJViArIDB4MEQpCisjZGVmaW5lIFJUX1BSSVZfSU9DVEwJCQkJCQkJCShTSU9DSVdGSVJTVFBSSVYgKyAweDBFKSAvLyBTeW5jLiB3aXRoIFJUNjEgKGZvciB3cGFfc3VwcGxpY2FudCkKKyNkZWZpbmUgUlRQUklWX0lPQ1RMX0dFVF9NQUNfVEFCTEUJCQkJCShTSU9DSVdGSVJTVFBSSVYgKyAweDBGKQorCisjZGVmaW5lIFJUUFJJVl9JT0NUTF9TSE9XCQkJCQkJCShTSU9DSVdGSVJTVFBSSVYgKyAweDExKQorZW51bSB7CisgICAgU0hPV19DT05OX1NUQVRVUyA9IDQsCisgICAgU0hPV19EUlZJRVJfVkVSSU9OID0gNSwKKyAgICBTSE9XX0JBX0lORk8gPSA2LAorCVNIT1dfREVTQ19JTkZPID0gNywKKyAgICBSQUlPX09GRiA9IDEwLAorICAgIFJBSU9fT04gPSAxMSwKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwlTSE9XX0RMU19FTlRSWV9JTkZPID0gMTksCisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisJU0hPV19DRkdfVkFMVUUgPSAyMCwKK307CisKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworI2lmZGVmIFNOTVBfU1VQUE9SVAorLy9TTk1QIGllZWUgODAyZG90MTEsIGthdGh5ICwgMjAwOF8wMjIwCisvLyBkb3QxMXJlcygzKQorI2RlZmluZSBSVF9PSURfODAyXzExX01BTlVGQUNUVVJFUk9VSQkJCTB4MDcwMAorI2RlZmluZSBSVF9PSURfODAyXzExX01BTlVGQUNUVVJFUk5BTUUJCQkweDA3MDEKKyNkZWZpbmUgUlRfT0lEXzgwMl8xMV9SRVNPVVJDRVRZUEVJRE5BTUUJCTB4MDcwMgorCisvLyBkb3QxMXNtdCgxKQorI2RlZmluZSBSVF9PSURfODAyXzExX1BSSVZBQ1lPUFRJT05JTVBMRU1FTlRFRAkweDA3MDMKKyNkZWZpbmUgUlRfT0lEXzgwMl8xMV9QT1dFUk1BTkFHRU1FTlRNT0RFCQkweDA3MDQKKyNkZWZpbmUgT0lEXzgwMl8xMV9XRVBERUZBVUxUS0VZVkFMVUUJCQkweDA3MDUgLy8gcmVhZCAsIHdyaXRlCisjZGVmaW5lIE9JRF84MDJfMTFfV0VQREVGQVVMVEtFWUlECQkJCTB4MDcwNgorI2RlZmluZSBSVF9PSURfODAyXzExX1dFUEtFWU1BUFBJTkdMRU5HVEgJCTB4MDcwNworI2RlZmluZSBPSURfODAyXzExX1NIT1JUUkVUUllMSU1JVAkJCQkweDA3MDgKKyNkZWZpbmUgT0lEXzgwMl8xMV9MT05HUkVUUllMSU1JVAkJCQkweDA3MDkKKyNkZWZpbmUgUlRfT0lEXzgwMl8xMV9QUk9EVUNUSUQJCQkJCTB4MDcxMAorI2RlZmluZSBSVF9PSURfODAyXzExX01BTlVGQUNUVVJFSUQJCQkJMHgwNzExCisKKy8vIC8vZG90MTFQaHkoNCkKKyNkZWZpbmUgT0lEXzgwMl8xMV9DVVJSRU5UQ0hBTk5FTAkJCQkweDA3MTIKKworLy9kb3QxMW1hYworI2RlZmluZSBSVF9PSURfODAyXzExX01BQ19BRERSRVNTCQkJCTB4MDcxMworI2VuZGlmIC8vIFNOTVBfU1VQUE9SVCAvLworCisjZGVmaW5lIE9JRF84MDJfMTFfQlVJTERfQ0hBTk5FTF9FWAkJCQkweDA3MTQKKyNkZWZpbmUgT0lEXzgwMl8xMV9HRVRfQ0hfTElTVAkJCQkJMHgwNzE1CisjZGVmaW5lIE9JRF84MDJfMTFfR0VUX0NPVU5UUllfQ09ERQkJCQkweDA3MTYKKyNkZWZpbmUgT0lEXzgwMl8xMV9HRVRfQ0hBTk5FTF9HRU9HUkFQSFkJCTB4MDcxNworCisjaWZkZWYgTExURF9TVVBQT1JUCisvLyBmb3IgY29uc2lzdGVuY3kgd2l0aCBSVDYxCisjZGVmaW5lIFJUX09JRF9HRVRfUEhZX01PREUgICAgICAgICAgICAgICAgICAgICAgICAgMHg3NjEKKyNlbmRpZiAvLyBMTFREX1NVUFBPUlQgLy8KKworLy8gTmV3IGZvciBNZWV0aW5nSG91c2UgQXBpIHN1cHBvcnQKKyNkZWZpbmUgT0lEX01IXzgwMl8xWF9TVVBQT1JURUQgICAgICAgICAgICAgICAweEZGRURDMTAwCisKKy8vIE1JTU8gVHggcGFyYW1ldGVyLCBTaG9ydEdJLCBNQ1MsIFNUQkMsIGV0Yy4gIHRoZXNlIGFyZSBmaWVsZHMgaW4gVFhXSS4gRG9uJ3QgY2hhbmdlIHRoaXMgZGVmaW5pdGlvbiEhIQordHlwZWRlZiB1bmlvbiAgX0hUVFJBTlNNSVRfU0VUVElORyB7CisjaWZkZWYgUlRfQklHX0VORElBTgorCXN0cnVjdAl7CisJVVNIT1JUCQlNT0RFOjI7CS8vIFVzZSBkZWZpbml0aW9uIE1PREVfeHh4LgorCVVTSE9SVAkJVHhCRjoxOworCVVTSE9SVAkJcnN2OjI7CisJVVNIT1JUCQlTVEJDOjI7CS8vU1BBQ0UKKwlVU0hPUlQJCVNob3J0R0k6MTsKKwlVU0hPUlQJCUJXOjE7CS8vY2hhbm5lbCBiYW5kd2lkdGggMjBNSHogb3IgNDAgTUh6CisJVVNIT1JUICAgCU1DUzo3OyAgICAgICAgICAgICAgICAgLy8gTUNTCisJfQlmaWVsZDsKKyNlbHNlCisJc3RydWN0CXsKKwlVU0hPUlQgICAJTUNTOjc7ICAgICAgICAgICAgICAgICAvLyBNQ1MKKwlVU0hPUlQJCUJXOjE7CS8vY2hhbm5lbCBiYW5kd2lkdGggMjBNSHogb3IgNDAgTUh6CisJVVNIT1JUCQlTaG9ydEdJOjE7CisJVVNIT1JUCQlTVEJDOjI7CS8vU1BBQ0UKKwlVU0hPUlQJCXJzdjoyOworCVVTSE9SVAkJVHhCRjoxOworCVVTSE9SVAkJTU9ERToyOwkvLyBVc2UgZGVmaW5pdGlvbiBNT0RFX3h4eC4KKwl9CWZpZWxkOworI2VuZGlmCisJVVNIT1JUCQl3b3JkOworIH0gSFRUUkFOU01JVF9TRVRUSU5HLCAqUEhUVFJBTlNNSVRfU0VUVElORzsKKwordHlwZWRlZiBlbnVtIF9SVF84MDJfMTFfUFJFQU1CTEUgeworICAgIFJ0ODAyXzExUHJlYW1ibGVMb25nLAorICAgIFJ0ODAyXzExUHJlYW1ibGVTaG9ydCwKKyAgICBSdDgwMl8xMVByZWFtYmxlQXV0bworfSBSVF84MDJfMTFfUFJFQU1CTEUsICpQUlRfODAyXzExX1BSRUFNQkxFOworCisvLyBPbmx5IGZvciBTVEEsIG5lZWQgdG8gc3luYyB3aXRoIEFQCisvLyAyMDA1LTAzLTA4IG1hdGNoIGN1cnJlbnQgUmFDb25maWcuCit0eXBlZGVmIGVudW0gX1JUXzgwMl8xMV9QSFlfTU9ERSB7CisJUEhZXzExQkdfTUlYRUQgPSAwLAorCVBIWV8xMUIsCisJUEhZXzExQSwKKwlQSFlfMTFBQkdfTUlYRUQsCisJUEhZXzExRywKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwlQSFlfMTFBQkdOX01JWEVELAkvLyBib3RoIGJhbmQgICA1CisJUEhZXzExTl8yXzRHLAkJLy8gMTFuLW9ubHkgd2l0aCAyLjRHIGJhbmQgICAJNgorCVBIWV8xMUdOX01JWEVELAkvLyAyLjRHIGJhbmQgICAgICA3CisJUEhZXzExQU5fTUlYRUQsCS8vIDVHICBiYW5kICAgICAgIDgKKwlQSFlfMTFCR05fTUlYRUQsCS8vIGlmIGNoZWNrIDgwMi4xMWIuICAgICAgOQorCVBIWV8xMUFHTl9NSVhFRCwJLy8gaWYgY2hlY2sgODAyLjExYi4gICAgICAxMAorCVBIWV8xMU5fNUcsCQkJLy8gMTFuLW9ubHkgd2l0aCA1RyBiYW5kCQkxMQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworfSBSVF84MDJfMTFfUEhZX01PREU7CisKKy8vIHB1dCBhbGwgcHJvcHJpZXRlcnkgZm9yLXF1ZXJ5IG9iamVjdHMgaGVyZSB0byByZWR1Y2UgIyBvZiBRdWVyeV9PSUQKK3R5cGVkZWYgc3RydWN0IF9SVF84MDJfMTFfTElOS19TVEFUVVMgeworICAgIFVMT05HICAgQ3VyclR4UmF0ZTsgICAgICAgICAvLyBpbiB1bml0cyBvZiAwLjVNYnBzCisgICAgVUxPTkcgICBDaGFubmVsUXVhbGl0eTsgICAgIC8vIDAuLjEwMCAlCisgICAgVUxPTkcgICBUeEJ5dGVDb3VudDsgICAgICAgIC8vIGJvdGggb2sgYW5kIGZhaWwKKyAgICBVTE9ORyAgIFJ4Qnl0ZUNvdW50OyAgICAgICAgLy8gYm90aCBvayBhbmQgZmFpbAorICAgIFVMT05HCUNlbnRyYWxDaGFubmVsOwkJLy8gNDBNSHogY2VudHJhbCBjaGFubmVsIG51bWJlcgorfSBSVF84MDJfMTFfTElOS19TVEFUVVMsICpQUlRfODAyXzExX0xJTktfU1RBVFVTOworCit0eXBlZGVmIHN0cnVjdCBfUlRfODAyXzExX0VWRU5UX0xPRyB7CisgICAgTEFSR0VfSU5URUdFUiAgIFN5c3RlbVRpbWU7ICAvLyB0aW1lc3RhbW1wIHZpYSBOZGlzR2V0Q3VycmVudFN5c3RlbVRpbWUoKQorICAgIFVDSEFSICAgICAgICAgICBBZGRyW01BQ19BRERSX0xFTkdUSF07CisgICAgVVNIT1JUICAgICAgICAgIEV2ZW50OyAgICAgICAvLyBFVkVOVF94eHgKK30gUlRfODAyXzExX0VWRU5UX0xPRywgKlBSVF84MDJfMTFfRVZFTlRfTE9HOworCit0eXBlZGVmIHN0cnVjdCBfUlRfODAyXzExX0VWRU5UX1RBQkxFIHsKKyAgICBVTE9ORyAgICAgICBOdW07CisgICAgVUxPTkcgICAgICAgUnN2OyAgICAgLy8gdG8gYWxpZ24gTG9nW10gYXQgTEFSR0VfSU5FR0VSIGJvdW5kYXJ5CisgICAgUlRfODAyXzExX0VWRU5UX0xPRyAgIExvZ1tNQVhfTlVNQkVSX09GX0VWRU5UXTsKK30gUlRfODAyXzExX0VWRU5UX1RBQkxFLCBQUlRfODAyXzExX0VWRU5UX1RBQkxFOworCisvLyBNSU1PIFR4IHBhcmFtZXRlciwgU2hvcnRHSSwgTUNTLCBTVEJDLCBldGMuICB0aGVzZSBhcmUgZmllbGRzIGluIFRYV0kuIERvbid0IGNoYW5nZSB0aGlzIGRlZmluaXRpb24hISEKK3R5cGVkZWYgdW5pb24gIF9NQUNIVFRSQU5TTUlUX1NFVFRJTkcgeworCXN0cnVjdAl7CisJVVNIT1JUICAgCU1DUzo3OyAgICAgICAgICAgICAgICAgLy8gTUNTCisJVVNIT1JUCQlCVzoxOwkvL2NoYW5uZWwgYmFuZHdpZHRoIDIwTUh6IG9yIDQwIE1IegorCVVTSE9SVAkJU2hvcnRHSToxOworCVVTSE9SVAkJU1RCQzoyOwkvL1NQQUNFCisJVVNIT1JUCQlyc3Y6MzsKKwlVU0hPUlQJCU1PREU6MjsJLy8gVXNlIGRlZmluaXRpb24gTU9ERV94eHguCisJfQlmaWVsZDsKKwlVU0hPUlQJCXdvcmQ7CisgfSBNQUNIVFRSQU5TTUlUX1NFVFRJTkcsICpQTUFDSFRUUkFOU01JVF9TRVRUSU5HOworCit0eXBlZGVmIHN0cnVjdCBfUlRfODAyXzExX01BQ19FTlRSWSB7CisgICAgVUNIQVIgICAgICAgQWRkcltNQUNfQUREUl9MRU5HVEhdOworICAgIFVDSEFSICAgICAgIEFpZDsKKyAgICBVQ0hBUiAgICAgICBQc207ICAgICAvLyAwOlBXUl9BQ1RJVkUsIDE6UFdSX1NBVkUKKyAgICBVQ0hBUgkJTWltb1BzOyAgLy8gMDpNTVBTX1NUQVRJQywgMTpNTVBTX0RZTkFNSUMsIDM6TU1QU19FbmFibGVkCisgICAgQ0hBUgkJQXZnUnNzaTA7CisJQ0hBUgkJQXZnUnNzaTE7CisJQ0hBUgkJQXZnUnNzaTI7CisJVUlOVDMyCQlDb25uZWN0ZWRUaW1lOworICAgIE1BQ0hUVFJBTlNNSVRfU0VUVElORwlUeFJhdGU7Cit9IFJUXzgwMl8xMV9NQUNfRU5UUlksICpQUlRfODAyXzExX01BQ19FTlRSWTsKKwordHlwZWRlZiBzdHJ1Y3QgX1JUXzgwMl8xMV9NQUNfVEFCTEUgeworICAgIFVMT05HICAgICAgIE51bTsKKyAgICBSVF84MDJfMTFfTUFDX0VOVFJZIEVudHJ5W01BWF9OVU1CRVJfT0ZfTUFDXTsKK30gUlRfODAyXzExX01BQ19UQUJMRSwgKlBSVF84MDJfMTFfTUFDX1RBQkxFOworCisvLyBzdHJ1Y3R1cmUgZm9yIHF1ZXJ5L3NldCBoYXJkd2FyZSByZWdpc3RlciAtIE1BQywgQkJQLCBSRiByZWdpc3RlcgordHlwZWRlZiBzdHJ1Y3QgX1JUXzgwMl8xMV9IQVJEV0FSRV9SRUdJU1RFUiB7CisgICAgVUxPTkcgICBIYXJkd2FyZVR5cGU7ICAgICAgIC8vIDA6TUFDLCAxOkJCUCwgMjpSRiByZWdpc3RlciwgMzpFRVBST00KKyAgICBVTE9ORyAgIE9mZnNldDsgICAgICAgICAgICAgLy8gUS9TIHJlZ2lzdGVyIG9mZnNldCBhZGRyCisgICAgVUxPTkcgICBEYXRhOyAgICAgICAgICAgICAgIC8vIFIvVyBkYXRhIGJ1ZmZlcgorfSBSVF84MDJfMTFfSEFSRFdBUkVfUkVHSVNURVIsICpQUlRfODAyXzExX0hBUkRXQVJFX1JFR0lTVEVSOworCit0eXBlZGVmIHN0cnVjdCBfUlRfODAyXzExX0FQX0NPTkZJRyB7CisgICAgVUxPTkcgICBFbmFibGVUeEJ1cnN0OyAgICAgIC8vIDAtZGlzYWJsZSwgMS1lbmFibGUKKyAgICBVTE9ORyAgIEVuYWJsZVR1cmJvUmF0ZTsgICAgLy8gMC1kaXNhYmxlLCAxLWVuYWJsZSA3Mi8xMDBtYnBzIHR1cmJvIHJhdGUKKyAgICBVTE9ORyAgIElzb2xhdGVJbnRlclN0YVRyYWZmaWM7ICAgICAvLyAwLWRpc2FibGUsIDEtZW5hYmxlIGlzb2xhdGlvbgorICAgIFVMT05HICAgSGlkZVNzaWQ7ICAgICAgICAgICAvLyAwLWRpc2FibGUsIDEtZW5hYmxlIGhpZGluZworICAgIFVMT05HICAgVXNlQkdQcm90ZWN0aW9uOyAgICAvLyAwLUFVVE8sIDEtYWx3YXlzIE9OLCAyLWFsd2F5cyBPRkYKKyAgICBVTE9ORyAgIFVzZVNob3J0U2xvdFRpbWU7ICAgLy8gMC1ubyB1c2UsIDEtdXNlIDktdXMgc2hvcnQgc2xvdCB0aW1lCisgICAgVUxPTkcgICBSc3YxOyAgICAgICAgICAgICAgIC8vIG11c3QgYmUgMAorICAgIFVMT05HICAgU3lzdGVtRXJyb3JCaXRtYXA7ICAvLyBpZ25vcmUgdXBvbiBTRVQsIHJldHVybiBzeXN0ZW0gZXJyb3IgdXBvbiBRVUVSWQorfSBSVF84MDJfMTFfQVBfQ09ORklHLCAqUFJUXzgwMl8xMV9BUF9DT05GSUc7CisKKy8vIHN0cnVjdHVyZSB0byBxdWVyeS9zZXQgU1RBX0NPTkZJRwordHlwZWRlZiBzdHJ1Y3QgX1JUXzgwMl8xMV9TVEFfQ09ORklHIHsKKyAgICBVTE9ORyAgIEVuYWJsZVR4QnVyc3Q7ICAgICAgLy8gMC1kaXNhYmxlLCAxLWVuYWJsZQorICAgIFVMT05HICAgRW5hYmxlVHVyYm9SYXRlOyAgICAvLyAwLWRpc2FibGUsIDEtZW5hYmxlIDcyLzEwMG1icHMgdHVyYm8gcmF0ZQorICAgIFVMT05HICAgVXNlQkdQcm90ZWN0aW9uOyAgICAvLyAwLUFVVE8sIDEtYWx3YXlzIE9OLCAyLWFsd2F5cyBPRkYKKyAgICBVTE9ORyAgIFVzZVNob3J0U2xvdFRpbWU7ICAgLy8gMC1ubyB1c2UsIDEtdXNlIDktdXMgc2hvcnQgc2xvdCB0aW1lIHdoZW4gYXBwbGljYWJsZQorICAgIFVMT05HICAgQWRob2NNb2RlOyAJCQkvLyAwLTExYiByYXRlcyBvbmx5IChXSUZJIHNwZWMpLCAxIC0gYi9nIG1peGVkLCAyIC0gZyBvbmx5CisgICAgVUxPTkcgICBId1JhZGlvU3RhdHVzOyAgICAgIC8vIDAtT0ZGLCAxLU9OLCBkZWZhdWx0IGlzIDEsIFJlYWQtT25seQorICAgIFVMT05HICAgUnN2MTsgICAgICAgICAgICAgICAvLyBtdXN0IGJlIDAKKyAgICBVTE9ORyAgIFN5c3RlbUVycm9yQml0bWFwOyAgLy8gaWdub3JlIHVwb24gU0VULCByZXR1cm4gc3lzdGVtIGVycm9yIHVwb24gUVVFUlkKK30gUlRfODAyXzExX1NUQV9DT05GSUcsICpQUlRfODAyXzExX1NUQV9DT05GSUc7CisKKy8vCisvLyAgRm9yIE9JRCBRdWVyeSBvciBTZXQgYWJvdXQgQkEgc3RydWN0dXJlCisvLwordHlwZWRlZglzdHJ1Y3QJX09JRF9CQUNBUF9TVFJVQwl7CisJCVVDSEFSCQlSeEJBV2luTGltaXQ7CisJCVVDSEFSCQlUeEJBV2luTGltaXQ7CisJCVVDSEFSCQlQb2xpY3k7CS8vIDA6IERFTEFZX0JBIDE6SU1NRURfQkEgICgvL0JBIFBvbGljeSBzdWJmaWxlZCB2YWx1ZSBpbiBBRERCQSBmcmFtZSkgICAyOkJBLW5vdCB1c2UuIG90aGVyIHZhbHVlIGludmFsaWQKKwkJVUNIQVIJCU1wZHVEZW5zaXR5OwkvLyAwOiBERUxBWV9CQSAxOklNTUVEX0JBICAoLy9CQSBQb2xpY3kgc3ViZmlsZWQgdmFsdWUgaW4gQUREQkEgZnJhbWUpICAgMjpCQS1ub3QgdXNlLiBvdGhlciB2YWx1ZSBpbnZhbGlkCisJCVVDSEFSICAgICAgIAlBbXNkdUVuYWJsZTsJLy9FbmFibGUgQU1TRFUgdHJhbnNtaXNzdGlvbgorCQlVQ0hBUiAgICAgICAJQW1zZHVTaXplOwkvLyAwOjM4MzksIDE6NzkzNSBieXRlcy4gVUlOVCAgTVNEVVNpemVUb0J5dGVzW10JPSB7IDM4MzksIDc5MzV9OworCQlVQ0hBUiAgICAgICAJTU1QU21vZGU7CS8vIE1JTU8gcG93ZXIgc2F2ZSBtb3JlLCAwOnN0YXRpYywgMTpkeW5hbWljLCAyOnJzdiwgMzptaW1vIGVuYWJsZQorCQlCT09MRUFOCQlBdXRvQkE7CS8vIEF1dG8gQkEgd2lsbCBhdXRvbWF0aWNhbGx5Cit9IE9JRF9CQUNBUF9TVFJVQywgKlBPSURfQkFDQVBfU1RSVUM7CisKK3R5cGVkZWYgc3RydWN0IF9SVF84MDJfMTFfQUNMX0VOVFJZIHsKKyAgICBVQ0hBUiAgIEFkZHJbTUFDX0FERFJfTEVOR1RIXTsKKyAgICBVU0hPUlQgIFJzdjsKK30gUlRfODAyXzExX0FDTF9FTlRSWSwgKlBSVF84MDJfMTFfQUNMX0VOVFJZOworCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX1JUXzgwMl8xMV9BQ0wgeworICAgIFVMT05HICAgUG9saWN5OyAgICAgICAgICAgICAvLyAwLWRpc2FibGUsIDEtcG9zaXRpdmUgbGlzdCwgMi1uZWdhdGl2ZSBsaXN0CisgICAgVUxPTkcgICBOdW07CisgICAgUlRfODAyXzExX0FDTF9FTlRSWSBFbnRyeVtNQVhfTlVNQkVSX09GX0FDTF07Cit9IFJUXzgwMl8xMV9BQ0wsICpQUlRfODAyXzExX0FDTDsKKwordHlwZWRlZiBzdHJ1Y3QgX1JUXzgwMl8xMV9XRFMgeworICAgIFVMT05HCQkJCQkJTnVtOworICAgIE5ESVNfODAyXzExX01BQ19BRERSRVNTCQlFbnRyeVsyNC8qTUFYX05VTV9PRl9XRFNfTElOSyovXTsKKwlVTE9ORwkJCQkJCUtleUxlbmd0aDsKKwlVQ0hBUgkJCQkJCUtleU1hdGVyaWFsWzMyXTsKK30gUlRfODAyXzExX1dEUywgKlBSVF84MDJfMTFfV0RTOworCit0eXBlZGVmIHN0cnVjdCBfUlRfODAyXzExX1RYX1JBVEVTXyB7CisgICAgVUNIQVIgICAgICAgU3VwUmF0ZUxlbjsKKyAgICBVQ0hBUiAgICAgICBTdXBSYXRlW01BWF9MRU5HVEhfT0ZfU1VQUE9SVF9SQVRFU107CisgICAgVUNIQVIgICAgICAgRXh0UmF0ZUxlbjsKKyAgICBVQ0hBUiAgICAgICBFeHRSYXRlW01BWF9MRU5HVEhfT0ZfU1VQUE9SVF9SQVRFU107Cit9IFJUXzgwMl8xMV9UWF9SQVRFUywgKlBSVF84MDJfMTFfVFhfUkFURVM7CisKKworLy8gRGVmaW5pdGlvbiBvZiBleHRyYSBpbmZvcm1hdGlvbiBjb2RlCisjZGVmaW5lCUdFTkVSQUxfTElOS19VUAkJCTB4MAkJCS8vIExpbmsgaXMgVXAKKyNkZWZpbmUJR0VORVJBTF9MSU5LX0RPV04JCTB4MQkJCS8vIExpbmsgaXMgRG93bgorI2RlZmluZQlIV19SQURJT19PRkYJCQkweDIJCQkvLyBIYXJkd2FyZSByYWRpbyBvZmYKKyNkZWZpbmUJU1dfUkFESU9fT0ZGCQkJMHgzCQkJLy8gU29mdHdhcmUgcmFkaW8gb2ZmCisjZGVmaW5lCUFVVEhfRkFJTAkJCQkweDQJCQkvLyBPcGVuIGF1dGhlbnRpY2F0aW9uIGZhaWwKKyNkZWZpbmUJQVVUSF9GQUlMX0tFWVMJCQkweDUJCQkvLyBTaGFyZWQgYXV0aGVudGljYXRpb24gZmFpbAorI2RlZmluZQlBU1NPQ19GQUlMCQkJCTB4NgkJCS8vIEFzc29jaWF0aW9uIGZhaWxlZAorI2RlZmluZQlFQVBfTUlDX0ZBSUxVUkUJCQkweDcJCQkvLyBEZWF1dGhlbmNhdGlvbiBiZWNhdXNlIE1JQyBmYWlsdXJlCisjZGVmaW5lCUVBUF80V0FZX1RJTUVPVVQJCTB4OAkJCS8vIERlYXV0aGVuY2F0aW9uIG9uIDQtd2F5IGhhbmRzaGFrZSB0aW1lb3V0CisjZGVmaW5lCUVBUF9HUk9VUF9LRVlfVElNRU9VVAkweDkJCQkvLyBEZWF1dGhlbmNhdGlvbiBvbiBncm91cCBrZXkgaGFuZHNoYWtlIHRpbWVvdXQKKyNkZWZpbmUJRUFQX1NVQ0NFU1MJCQkJMHhhCQkJLy8gRUFQIHN1Y2NlZWQKKyNkZWZpbmUJREVURUNUX1JBREFSX1NJR05BTAkJMHhiICAgICAgICAgLy8gUmFkYXIgc2lnbmFsIG9jY3VyIGluIGN1cnJlbnQgY2hhbm5lbAorI2RlZmluZSBFWFRSQV9JTkZPX01BWAkJCTB4YgkJCS8vIEluZGljYXRlIExhc3QgT0lECisKKyNkZWZpbmUgRVhUUkFfSU5GT19DTEVBUgkJMHhmZmZmZmZmZgorCisvLyBUaGlzIGlzIE9JRCBzZXR0aW5nIHN0cnVjdHVyZS4gU28gb25seSBHRiBvciBNTSBhcyBNb2RlLiBUaGlzIGlzIHZhbGlkIHdoZW4gb3VyIHdpcmVsc3MgbW9kZSBoYXMgODAyLjExbiBpbiB1c2UuCit0eXBlZGVmIHN0cnVjdCB7CisJUlRfODAyXzExX1BIWV9NT0RFCQlQaHlNb2RlOyAJLy8KKwlVQ0hBUgkJVHJhbnNtaXRObzsKKwlVQ0hBUgkJSHRNb2RlOyAJLy9IVE1PREVfR0Ygb3IgSFRNT0RFX01NCisJVUNIQVIJCUV4dE9mZnNldDsJLy9leHRlbnNpb24gY2hhbm5lbCBhYm92ZSBvciBiZWxvdworCVVDSEFSCQlNQ1M7CisJVUNIQVIgICAJQlc7CisJVUNIQVIJCVNUQkM7CisJVUNIQVIJCVNIT1JUR0k7CisJVUNIQVIJCXJzdjsKK30gT0lEX1NFVF9IVF9QSFlNT0RFLCAqUE9JRF9TRVRfSFRfUEhZTU9ERTsKKworI2lmZGVmIExMVERfU1VQUE9SVAordHlwZWRlZiBzdHJ1Y3QgX1JUX0xMVERfQVNTT0lDQVRJT05fRU5UUlkgeworICAgIFVDSEFSICAgICAgICAgICBBZGRyW0VUSF9MRU5HVEhfT0ZfQUREUkVTU107CisgICAgdW5zaWduZWQgc2hvcnQgIE1PUjsgICAgICAgIC8vIG1heGltdW0gb3BlcmF0aW9uYWwgcmF0ZQorICAgIFVDSEFSICAgICAgICAgICBwaHlNb2RlOworfSBSVF9MTFREX0FTU09JQ0FUSU9OX0VOVFJZLCAqUFJUX0xMVERfQVNTT0lDQVRJT05fRU5UUlk7CisKK3R5cGVkZWYgc3RydWN0IF9SVF9MTFREX0FTU09JQ0FUSU9OX1RBQkxFIHsKKyAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgICAgICAgTnVtOworICAgIFJUX0xMVERfQVNTT0lDQVRJT05fRU5UUlkgICBFbnRyeVtNQVhfTlVNQkVSX09GX01BQ107Cit9IFJUX0xMVERfQVNTT0lDQVRJT05fVEFCTEUsICpQUlRfTExURF9BU1NPSUNBVElPTl9UQUJMRTsKKyNlbmRpZiAvLyBMTFREX1NVUFBPUlQgLy8KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorLy9ydDI4NjAsIGthdGh5IDIwMDctMDExOAorLy8gc3RydWN0dXJlIGZvciBETFMKK3R5cGVkZWYgc3RydWN0IF9SVF84MDJfMTFfRExTX1VJIHsKKwlVU0hPUlQJCQkJCQlUaW1lT3V0OwkJLy8gdW5pdDogc2Vjb25kICwgc2V0IGJ5IFVJCisJVVNIT1JUCQkJCQkJQ291bnREb3duVGltZXI7CS8vIHVuaXQ6IHNlY29uZCAsIHVzZWQgYnkgZHJpdmVyIG9ubHkKKwlORElTXzgwMl8xMV9NQUNfQUREUkVTUwkJTWFjQWRkcjsJCS8vIHNldCBieSBVSQorCVVDSEFSCQkJCQkJU3RhdHVzOwkJCS8vIDA6IG5vbmUgLCAxOiB3YWl0IFNUQWtleSwgMjogZmluaXNoIERMUyBzZXR1cCAsIHNldCBieSBkcml2ZXIgb25seQorCUJPT0xFQU4JCQkJCQlWYWxpZDsJCQkvLyAxOiB2YWxpZCAsIDA6IGludmFsaWQgLCBzZXQgYnkgVUksIHVzZSB0byBzZXR1cCBvciB0ZWFyIGRvd24gRExTIGxpbmsKK30gUlRfODAyXzExX0RMU19VSSwgKlBSVF84MDJfMTFfRExTX1VJOworCit0eXBlZGVmIHN0cnVjdCBfUlRfODAyXzExX0RMU19JTkZPIHsKKwlSVF84MDJfMTFfRExTX1VJCUVudHJ5W01BWF9OVU1CRVJfT0ZfRExTX0VOVFJZXTsKKwlVQ0hBUgkJCQludW07Cit9IFJUXzgwMl8xMV9ETFNfSU5GTywgKlBSVF84MDJfMTFfRExTX0lORk87CisKK3R5cGVkZWYgZW51bSBfUlRfODAyXzExX0RMU19NT0RFIHsKKyAgICBETFNfTk9ORSwKKyAgICBETFNfV0FJVF9LRVksCisgICAgRExTX0ZJTklTSAorfSBSVF84MDJfMTFfRExTX01PREU7CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisjaWZuZGVmIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisjZGVmaW5lCVJUX0FTU09DX0VWRU5UX0ZMQUcgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAxCisjZGVmaW5lCVJUX0RJU0FTU09DX0VWRU5UX0ZMQUcgICAgICAgICAgICAgICAgICAgICAgMHgwMTAyCisjZGVmaW5lCVJUX1JFUUlFX0VWRU5UX0ZMQUcgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAzCisjZGVmaW5lCVJUX1JFU1BJRV9FVkVOVF9GTEFHICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTA0CisjZGVmaW5lCVJUX0FTU09DSU5GT19FVkVOVF9GTEFHICAgICAgICAgICAgICAgICAgICAgMHgwMTA1CisjZGVmaW5lIFJUX1BNS0lEQ0FORF9GTEFHICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTA2CisjZGVmaW5lIFJUX0lOVEVSRkFDRV9ET1dOICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTA3CisjZGVmaW5lIFJUX0lOVEVSRkFDRV9VUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTA4CisjZW5kaWYgLy8gTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKyNkZWZpbmUgTUFYX0NVU1RPTV9MRU4gMTI4CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKK3R5cGVkZWYgZW51bSBfUlRfODAyXzExX0RfQ0xJRU5UX01PREUKK3sKKyAgIFJ0ODAyXzExX0RfTm9uZSwKKyAgIFJ0ODAyXzExX0RfRmxleGlibGUsCisgICBSdDgwMl8xMV9EX1N0cmljdCwKK30gUlRfODAyXzExX0RfQ0xJRU5UX01PREUsICpQUlRfODAyXzExX0RfQ0xJRU5UX01PREU7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKK3R5cGVkZWYgc3RydWN0IF9SVF9DSEFOTkVMX0xJU1RfSU5GTworeworCVVDSEFSIENoYW5uZWxMaXN0W01BWF9OVU1fT0ZfQ0hTXTsgICAvLyBsaXN0IGFsbCBzdXBwb3J0ZWQgY2hhbm5lbHMgZm9yIHNpdGUgc3VydmV5CisJVUNIQVIgQ2hhbm5lbExpc3ROdW07IC8vIG51bWJlciBvZiBjaGFubmVsIGluIENoYW5uZWxMaXN0W10KK30gUlRfQ0hBTk5FTF9MSVNUX0lORk8sICpQUlRfQ0hBTk5FTF9MSVNUX0lORk87CisKKworI2VuZGlmIC8vIF9PSURfSF8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydDI4NjAuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnQyODYwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDE3MjAxOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnQyODYwLmgKQEAgLTAsMCArMSwzNDkgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKyNpZm5kZWYgX19SVDI4NjBfSF9fCisjZGVmaW5lIF9fUlQyODYwX0hfXworCisjZGVmaW5lIFJUMjh4eF9DSElQX05BTUUJIlJUMjg2MCIKKworI2RlZmluZSBUWElORk9fU0laRSAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgVFhQQURESU5HX1NJWkUgICAgICAJICAwCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tIEVFUFJPTSBSZWxhdGVkIE1BQ1JPIC0tLS0tLS0tLS0tLS0tLS0tICovCisjZGVmaW5lIFJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgb2Zmc2V0LCB2YXIpCQlcCisJdmFyID0gUlRNUF9FRVBST01fUkVBRDE2KHBBZCwgb2Zmc2V0KQorCisjZGVmaW5lIFJUMjh4eF9FRVBST01fV1JJVEUxNihwQWQsIG9mZnNldCwgdmFyKQkJXAorCVJUTVBfRUVQUk9NX1dSSVRFMTYocEFkLCBvZmZzZXQsIHZhcikKKworLyogLS0tLS0tLS0tLS0tLS0tLS0gVEFTSy9USFJFQUQgUmVsYXRlZCBNQUNSTyAtLS0tLS0tLS0tLS0tLS0tLSAqLworI2RlZmluZSBSVDI4WFhfVEFTS19USFJFQURfSU5JVChwQWQsIFN0YXR1cykJCVwKKwlpbml0X3RocmVhZF90YXNrKHBBZCk7IE5JQ0luaXRUeFJ4UmluZ0FuZEJhY2tsb2dRdWV1ZShwQWQpOwlcCisJU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKworLyogZnVuY3Rpb24gZGVjbGFyYXRpb25zICovCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQorI2RlZmluZSBJUlFfSEFORExFX1RZUEUgIGlycXJldHVybl90CisjZWxzZQorI2RlZmluZSBJUlFfSEFORExFX1RZUEUgIHZvaWQKKyNlbmRpZgorCitJUlFfSEFORExFX1RZUEUKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwxOSkpCitydDI4NjBfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pbnN0YW5jZSk7CisjZWxzZQorcnQyODYwX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaW5zdGFuY2UsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKKyNlbmRpZgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLSBGcmltd2FyZSBSZWxhdGVkIE1BQ1JPIC0tLS0tLS0tLS0tLS0tLS0tICovCisjZGVmaW5lIFJUMjhYWF9XUklURV9GSVJNV0FSRShfcEFkLCBfcEZ3SW1hZ2UsIF9Gd0xlbikJCQkJXAorCWRvewkJCQkJCQkJCQkJCQkJCQlcCisJCVVMT05HCV9pLCBfZmlybTsJCQkJCQkJCQkJCVwKKwkJUlRNUF9JT19XUklURTMyKF9wQWQsIFBCRl9TWVNfQ1RSTCwgMHgxMDAwMCk7CQkJCVwKKwkJCQkJCQkJCQkJCQkJCQkJXAorCQlmb3IoX2k9MDsgX2k8X0Z3TGVuOyBfaSs9NCkJCQkJCQkJCQlcCisJCXsJCQkJCQkJCQkJCQkJCQlcCisJCQlfZmlybSA9IF9wRndJbWFnZVtfaV0gKwkJCQkJCQkJCVwKKwkJCSAgIChfcEZ3SW1hZ2VbX2krM10gPDwgMjQpICsJCQkJCQkJXAorCQkJICAgKF9wRndJbWFnZVtfaSsyXSA8PCAxNikgKwkJCQkJCQlcCisJCQkgICAoX3BGd0ltYWdlW19pKzFdIDw8IDgpOwkJCQkJCQkJXAorCQkJUlRNUF9JT19XUklURTMyKF9wQWQsIEZJUk1XQVJFX0lNQUdFX0JBU0UgKyBfaSwgX2Zpcm0pOwlcCisJCX0JCQkJCQkJCQkJCQkJCQlcCisJCVJUTVBfSU9fV1JJVEUzMihfcEFkLCBQQkZfU1lTX0NUUkwsIDB4MDAwMDApOwkJCQlcCisJCVJUTVBfSU9fV1JJVEUzMihfcEFkLCBQQkZfU1lTX0NUUkwsIDB4MDAwMDEpOwkJCQlcCisJCQkJCQkJCQkJCQkJCQkJCVwKKwkJLyogaW5pdGlhbGl6ZSBCQlAgUi9XIGFjY2VzcyBhZ2VudCAqLwkJCQkJCVwKKwkJUlRNUF9JT19XUklURTMyKF9wQWQsIEgyTV9CQlBfQUdFTlQsIDApOwkJCQkJXAorCQlSVE1QX0lPX1dSSVRFMzIoX3BBZCwgSDJNX01BSUxCT1hfQ1NSLCAwKTsJCQkJCVwKKwl9d2hpbGUoMCkKKworLyogLS0tLS0tLS0tLS0tLS0tLS0gVFggUmVsYXRlZCBNQUNSTyAtLS0tLS0tLS0tLS0tLS0tLSAqLworI2RlZmluZSBSVDI4WFhfU1RBUlRfREVRVUVVRShwQWQsIFF1ZUlkeCwgaXJxRmxhZ3MpCQlkb3t9d2hpbGUoMCkKKyNkZWZpbmUgUlQyOFhYX1NUT1BfREVRVUVVRShwQWQsIFF1ZUlkeCwgaXJxRmxhZ3MpCQlkb3t9d2hpbGUoMCkKKworCisjZGVmaW5lIFJUMjhYWF9IQVNfRU5PVUdIX0ZSRUVfREVTQyhwQWQsIHBUeEJsaywgZnJlZU51bSwgcFBhY2tldCkgXAorCQkoKGZyZWVOdW0pID49IChVTE9ORykocFR4QmxrLT5Ub3RhbEZyYWdOdW0gKyBSVE1QX0dFVF9QQUNLRVRfRlJBR01FTlRTKHBQYWNrZXQpICsgMykpIC8qIHJvdWdoIGVzdGltYXRlIHdlIHdpbGwgdXNlIDMgbW9yZSBkZXNjcmlwdG9yLiAqLworI2RlZmluZSBSVDI4WFhfUkVMRUFTRV9ERVNDX1JFU09VUkNFKHBBZCwgUXVlSWR4KQkJCQkJXAorCQlkb3t9d2hpbGUoMCkKKworI2RlZmluZSBORUVEX1FVRVVFX0JBQ0tfRk9SX0FHRyhwQWQsIFF1ZUlkeCwgZnJlZU51bSwgX1R4RnJhbWVUeXBlKSBcCisJCSgoKGZyZWVOdW0gIT0gKFRYX1JJTkdfU0laRS0xKSkgJiYgKHBBZC0+VHhTd1F1ZXVlW1F1ZUlkeF0uTnVtYmVyID09IDApKSB8fCAoZnJlZU51bTwzKSkKKwkJLy8oKChmcmVlTnVtKSAhPSAoVFhfUklOR19TSVpFLTEpKSAmJiAocEFkLT5UeFN3UXVldWVbUXVlSWR4XS5OdW1iZXIgPT0gMSAvKjAqLykpCisKKworI2RlZmluZSBIQUxfS2lja091dE1nbXRUeChfcEFkLCBfUXVlSWR4LCBfcFBhY2tldCwgX3BTcmNCdWZWQSwgX1NyY0J1ZkxlbikJXAorCQkJUnRtcFBDSU1nbXRLaWNrT3V0KF9wQWQsIF9RdWVJZHgsIF9wUGFja2V0LCBfcFNyY0J1ZlZBLCBfU3JjQnVmTGVuKQorCisjZGVmaW5lIFJUTVBfUEtUX1RBSUxfUEFERElORyAwCisKKyNkZWZpbmUgZlJUTVBfQURBUFRFUl9ORUVEX1NUT1BfVFgJMAorCisjZGVmaW5lIEhBTF9Xcml0ZVN1YlR4UmVzb3VyY2UocEFkLCBwVHhCbGssIGJJc0xhc3QsIHBGcmVlTnVtYmVyKQlcCisJCS8qIFJ0bXBQQ0lfV3JpdGVTdWJUeFJlc291cmNlKHBBZCwgcFR4QmxrLCBiSXNMYXN0LCBwRnJlZU51bWJlcikqLworCisjZGVmaW5lIEhBTF9Xcml0ZVR4UmVzb3VyY2UocEFkLCBwVHhCbGssYklzTGFzdCwgcEZyZWVOdW1iZXIpCVwKKwkJCVJ0bXBQQ0lfV3JpdGVTaW5nbGVUeFJlc291cmNlKHBBZCwgcFR4QmxrLCBiSXNMYXN0LCBwRnJlZU51bWJlcikKKworI2RlZmluZSBIQUxfV3JpdGVGcmFnVHhSZXNvdXJjZShwQWQsIHBUeEJsaywgZnJhZ051bSwgcEZyZWVOdW1iZXIpIFwKKwkJCVJ0bXBQQ0lfV3JpdGVGcmFnVHhSZXNvdXJjZShwQWQsIHBUeEJsaywgZnJhZ051bSwgcEZyZWVOdW1iZXIpCisKKyNkZWZpbmUgSEFMX1dyaXRlTXVsdGlUeFJlc291cmNlKHBBZCwgcFR4QmxrLGZyYW1lTnVtLCBwRnJlZU51bWJlcikJXAorCQkJUnRtcFBDSV9Xcml0ZU11bHRpVHhSZXNvdXJjZShwQWQsIHBUeEJsaywgZnJhbWVOdW0sIHBGcmVlTnVtYmVyKQorCisjZGVmaW5lIEhBTF9GaW5hbFdyaXRlVHhSZXNvdXJjZShfcEFkLCBfcFR4QmxrLCBfVG90YWxNUERVU2l6ZSwgX0ZpcnN0VHhJZHgpCVwKKwkJCVJ0bXBQQ0lfRmluYWxXcml0ZVR4UmVzb3VyY2UoX3BBZCwgX3BUeEJsaywgX1RvdGFsTVBEVVNpemUsIF9GaXJzdFR4SWR4KQorCisjZGVmaW5lIEhBTF9MYXN0VHhJZHgoX3BBZCwgX1F1ZUlkeCxfTGFzdFR4SWR4KSBcCisJCQkvKlJ0bXBQQ0lEYXRhTGFzdFR4SWR4KF9wQWQsIF9RdWVJZHgsX0xhc3RUeElkeCkqLworCisjZGVmaW5lIEhBTF9LaWNrT3V0VHgoX3BBZCwgX3BUeEJsaywgX1F1ZUlkeCkJXAorCQkJUlRNUF9JT19XUklURTMyKChfcEFkKSwgVFhfQ1RYX0lEWDArKChfUXVlSWR4KSoweDEwKSwgKF9wQWQpLT5UeFJpbmdbKF9RdWVJZHgpXS5UeENwdUlkeCkKKy8qCQkJUnRtcFBDSURhdGFLaWNrT3V0KF9wQWQsIF9wVHhCbGssIF9RdWVJZHgpKi8KKworI2RlZmluZSBIQUxfS2lja091dE51bGxGcmFtZVR4KF9wQWQsIF9RdWVJZHgsIF9wTnVsbEZyYW1lLCBfZnJhbWVMZW4pCVwKKwkJCU1pbmlwb3J0TU1SZXF1ZXN0KF9wQWQsIF9RdWVJZHgsIF9wTnVsbEZyYW1lLCBfZnJhbWVMZW4pCisKKyNkZWZpbmUgR0VUX1RYUklOR19GUkVFTk8oX3BBZCwgX1F1ZUlkeCkgXAorCShfcEFkLT5UeFJpbmdbX1F1ZUlkeF0uVHhTd0ZyZWVJZHggPiBfcEFkLT5UeFJpbmdbX1F1ZUlkeF0uVHhDcHVJZHgpCT8gXAorCQkJKF9wQWQtPlR4UmluZ1tfUXVlSWR4XS5UeFN3RnJlZUlkeCAtIF9wQWQtPlR4UmluZ1tfUXVlSWR4XS5UeENwdUlkeCAtIDEpIFwKKwkJCSA6CVwKKwkJCShfcEFkLT5UeFJpbmdbX1F1ZUlkeF0uVHhTd0ZyZWVJZHggKyBUWF9SSU5HX1NJWkUgLSBfcEFkLT5UeFJpbmdbX1F1ZUlkeF0uVHhDcHVJZHggLSAxKTsKKworCisjZGVmaW5lIEdFVF9NR01UUklOR19GUkVFTk8oX3BBZCkgXAorCShfcEFkLT5NZ210UmluZy5UeFN3RnJlZUlkeCA+IF9wQWQtPk1nbXRSaW5nLlR4Q3B1SWR4KQk/IFwKKwkJCShfcEFkLT5NZ210UmluZy5UeFN3RnJlZUlkeCAtIF9wQWQtPk1nbXRSaW5nLlR4Q3B1SWR4IC0gMSkgXAorCQkJIDoJXAorCQkJKF9wQWQtPk1nbXRSaW5nLlR4U3dGcmVlSWR4ICsgTUdNVF9SSU5HX1NJWkUgLSBfcEFkLT5NZ210UmluZy5UeENwdUlkeCAtIDEpOworCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tIFJYIFJlbGF0ZWQgTUFDUk8gLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLy8gbm8gdXNlCisjZGVmaW5lIFJUMjhYWF9SQ1ZfUEtUX0dFVF9JTklUKHBBZCkKKyNkZWZpbmUgUlQyOFhYX1JWX0FfQlVGX0VORAorLy8jZGVmaW5lIFJUMjhYWF9SVl9BTExfQlVGX0VORAorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tIEFTSUMgUmVsYXRlZCBNQUNSTyAtLS0tLS0tLS0tLS0tLS0tLSAqLworLy8gbm8gdXNlCisjZGVmaW5lIFJUMjhYWF9ETUFfUE9TVF9XUklURShwQWQpCisKKy8vIHJlc2V0IE1BQyBvZiBhIHN0YXRpb24gZW50cnkgdG8gMHgwMDAwMDAwMDAwMDAKKyNkZWZpbmUgUlQyOFhYX1NUQV9FTlRSWV9NQUNfUkVTRVQocEFkLCBXY2lkKQkJCQkJCVwKKwlBc2ljRGVsV2NpZFRhYihwQWQsIFdjaWQpOworCisvLyBhZGQgdGhpcyBlbnRyeSBpbnRvIEFTSUMgUlggV0NJRCBzZWFyY2ggdGFibGUKKyNkZWZpbmUgUlQyOFhYX1NUQV9FTlRSWV9BREQocEFkLCBwRW50cnkpCQkJCQkJCVwKKwlBc2ljVXBkYXRlUnhXQ0lEVGFibGUocEFkLCBwRW50cnktPkFpZCwgcEVudHJ5LT5BZGRyKTsKKworLy8gcmVtb3ZlIFBhaXItd2lzZSBrZXkgbWF0ZXJpYWwgZnJvbSBBU0lDCisjZGVmaW5lIFJUMjhYWF9TVEFfRU5UUllfS0VZX0RFTChwQWQsIEJzc0lkeCwgV2NpZCkJCQkJCVwKKwlBc2ljUmVtb3ZlUGFpcndpc2VLZXlFbnRyeShwQWQsIEJzc0lkeCwgKFVDSEFSKVdjaWQpOworCisvLyBhZGQgQ2xpZW50IHNlY3VyaXR5IGluZm9ybWF0aW9uIGludG8gQVNJQyBXQ0lEIHRhYmxlIGFuZCBJVkVJViB0YWJsZQorI2RlZmluZSBSVDI4WFhfU1RBX1NFQ1VSSVRZX0lORk9fQUREKHBBZCwgYXBpZHgsIEtleUlELCBwRW50cnkpCQlcCisJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWQsIGFwaWR4LCBLZXlJRCwgCQkJCQlcCisJCQkJCQkJcEFkLT5TaGFyZWRLZXlbYXBpZHhdW0tleUlEXS5DaXBoZXJBbGcsIHBFbnRyeSk7CisKKyNkZWZpbmUgUlQyOFhYX1NFQ1VSSVRZX0tFWV9BREQocEFkLCBhcGlkeCwgS2V5SUQsIHBFbnRyeSkJCQkJXAorCXsJLyogdXBkYXRlIHBhaXJ3aXNlIGtleSBpbmZvcm1hdGlvbiB0byBBU0lDIFNoYXJlZCBLZXkgVGFibGUgKi8JXAorCQlBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkLCBhcGlkeCwgS2V5SUQsCQkJCQkJXAorCQkJCQkJICBwQWQtPlNoYXJlZEtleVthcGlkeF1bS2V5SURdLkNpcGhlckFsZywJCVwKKwkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbYXBpZHhdW0tleUlEXS5LZXksCQkJCVwKKwkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbYXBpZHhdW0tleUlEXS5UeE1pYywJCQlcCisJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W2FwaWR4XVtLZXlJRF0uUnhNaWMpOwkJCVwKKwkJLyogdXBkYXRlIEFTSUMgV0NJRCBhdHRyaWJ1dGUgdGFibGUgYW5kIElWRUlWIHRhYmxlICovCQkJXAorCQlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZCwgYXBpZHgsIEtleUlELAkJCQkJXAorCQkJCQkJICBwQWQtPlNoYXJlZEtleVthcGlkeF1bS2V5SURdLkNpcGhlckFsZywJCVwKKwkJCQkJCSAgcEVudHJ5KTsgfQorCisKKy8vIEluc2VydCB0aGUgQkEgYml0bWFwIHRvIEFTSUMgZm9yIHRoZSBXY2lkIGVudHJ5CisjZGVmaW5lIFJUMjhYWF9BRERfQkFfU0VTU0lPTl9UT19BU0lDKF9wQWQsIF9BaWQsIF9USUQpCQkJCQlcCisJCWRvewkJCQkJCQkJCQkJCQkJCQlcCisJCQlVSU5UMzIJX1ZhbHVlID0gMCwgX09mZnNldDsJCQkJCQkJCQlcCisJCQlfT2Zmc2V0ID0gTUFDX1dDSURfQkFTRSArIChfQWlkKSAqIEhXX1dDSURfRU5UUllfU0laRSArIDQ7CVwKKwkJCVJUTVBfSU9fUkVBRDMyKChfcEFkKSwgX09mZnNldCwgJl9WYWx1ZSk7CQkJCQlcCisJCQlfVmFsdWUgfD0gKDB4MTAwMDA8PChfVElEKSk7CQkJCQkJCQlcCisJCQlSVE1QX0lPX1dSSVRFMzIoKF9wQWQpLCBfT2Zmc2V0LCBfVmFsdWUpOwkJCQkJXAorCQl9d2hpbGUoMCkKKworCisvLyBSZW1vdmUgdGhlIEJBIGJpdG1hcCBmcm9tIEFTSUMgZm9yIHRoZSBXY2lkIGVudHJ5CisvLwkJYml0bWFwIGZpZWxkIHN0YXJ0cyBhdCAweDEwMDAwIGluIEFTSUMgV0NJRCB0YWJsZQorI2RlZmluZSBSVDI4WFhfREVMX0JBX1NFU1NJT05fRlJPTV9BU0lDKF9wQWQsIF9XY2lkLCBfVElEKQkJCQlcCisJCWRvewkJCQkJCQkJCQkJCQkJCQlcCisJCQlVSU5UMzIJX1ZhbHVlID0gMCwgX09mZnNldDsJCQkJCQkJCQlcCisJCQlfT2Zmc2V0ID0gTUFDX1dDSURfQkFTRSArIChfV2NpZCkgKiBIV19XQ0lEX0VOVFJZX1NJWkUgKyA0OwlcCisJCQlSVE1QX0lPX1JFQUQzMigoX3BBZCksIF9PZmZzZXQsICZfVmFsdWUpOwkJCQkJXAorCQkJX1ZhbHVlICY9ICh+KDB4MTAwMDAgPDwgKF9USUQpKSk7CQkJCQkJCVwKKwkJCVJUTVBfSU9fV1JJVEUzMigoX3BBZCksIF9PZmZzZXQsIF9WYWx1ZSk7CQkJXAorCQl9d2hpbGUoMCkKKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLSBQQ0kvVVNCIFJlbGF0ZWQgTUFDUk8gLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBSVDI4WFhfSEFORExFX0RFVl9BU1NJR04oaGFuZGxlLCBkZXZfcCkJCQkJXAorCSgoUE9TX0NPT0tJRSloYW5kbGUpLT5wY2lfZGV2ID0gZGV2X3A7CisKKy8vIHNldCBkcml2ZXIgZGF0YQorI2RlZmluZSBSVDI4WFhfRFJWREFUQV9TRVQoX2EpCQkJcGNpX3NldF9kcnZkYXRhKF9hLCBuZXRfZGV2KTsKKworI2RlZmluZSBSVDI4WFhfVU5NQVAoKQkJCQkJCQkJCQlcCit7CWlmIChuZXRfZGV2LT5iYXNlX2FkZHIpCXsJCQkJCQkJCVwKKwkJaW91bm1hcCgodm9pZCAqKShuZXRfZGV2LT5iYXNlX2FkZHIpKTsJCQkJXAorCQlyZWxlYXNlX21lbV9yZWdpb24ocGNpX3Jlc291cmNlX3N0YXJ0KGRldl9wLCAwKSwJXAorCQkJCQkJCXBjaV9yZXNvdXJjZV9sZW4oZGV2X3AsIDApKTsgfQlcCisJaWYgKG5ldF9kZXYtPmlycSkgcGNpX3JlbGVhc2VfcmVnaW9ucyhkZXZfcCk7IH0KKworI2lmZGVmIFBDSV9NU0lfU1VQUE9SVAorI2RlZmluZSBSVE1QX01TSV9FTkFCTEUoX3BBZCkgXAoreyAJUE9TX0NPT0tJRSBfcE9iaiA9IChQT1NfQ09PS0lFKShfcEFkLT5PU19Db29raWUpOyBcCisJKF9wQWQpLT5IYXZlTXNpID0JcGNpX2VuYWJsZV9tc2koX3BPYmotPnBjaV9kZXYpID09IDAgPyBUUlVFIDogRkFMU0U7IH0KKworI2RlZmluZSBSVE1QX01TSV9ESVNBQkxFKF9wQWQpIFwKK3sgCVBPU19DT09LSUUgX3BPYmogPSAoUE9TX0NPT0tJRSkoX3BBZC0+T1NfQ29va2llKTsgXAorCWlmIChfcEFkLT5IYXZlTXNpID09IFRSVUUpIFwKKwkJcGNpX2Rpc2FibGVfbXNpKF9wT2JqLT5wY2lfZGV2KTsgXAorCV9wQWQtPkhhdmVNc2kgPSBGQUxTRTsJfQorI2Vsc2UKKyNkZWZpbmUgUlRNUF9NU0lfRU5BQkxFKF9wQWQpCisjZGVmaW5lIFJUTVBfTVNJX0RJU0FCTEUoX3BBZCkKKyNlbmRpZiAvLyBQQ0lfTVNJX1NVUFBPUlQgLy8KKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMjQpCisjZGVmaW5lIFNBX1NISVJRIElSUUZfU0hBUkVECisjZW5kaWYKKworI2RlZmluZSBSVDI4WFhfSVJRX1JFUVVFU1QobmV0X2RldikJCQkJCQkJXAorewlQUlRNUF9BREFQVEVSIF9wQWQgPSAoUFJUTVBfQURBUFRFUikoKG5ldF9kZXYpLT5tbF9wcml2KTsJXAorCVBPU19DT09LSUUgX3BPYmogPSAoUE9TX0NPT0tJRSkoX3BBZC0+T1NfQ29va2llKTsJCVwKKwlSVE1QX01TSV9FTkFCTEUoX3BBZCk7CQkJCQkJCQkJXAorCWlmICgocmV0dmFsID0gcmVxdWVzdF9pcnEoX3BPYmotPnBjaV9kZXYtPmlycSwgCQlcCisJCQkJCQkJcnQyODYwX2ludGVycnVwdCwgU0FfU0hJUlEsCQlcCisJCQkJCQkJKG5ldF9kZXYpLT5uYW1lLCAobmV0X2RldikpKSkgewlcCisJCXByaW50aygiUlQyODYwOiByZXF1ZXN0X2lycSAgRVJST1IoJWQpXG4iLCByZXR2YWwpOwlcCisJcmV0dXJuIHJldHZhbDsgfSB9CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApCisjZGVmaW5lIFJUMjhYWF9JUlFfUkVMRUFTRShuZXRfZGV2KQkJCQkJCQkJXAorewlQUlRNUF9BREFQVEVSIF9wQWQgPSAoUFJUTVBfQURBUFRFUikoKG5ldF9kZXYpLT5tbF9wcml2KTsJCVwKKwlQT1NfQ09PS0lFIF9wT2JqID0gKFBPU19DT09LSUUpKF9wQWQtPk9TX0Nvb2tpZSk7CQkJXAorCXN5bmNocm9uaXplX2lycShfcE9iai0+cGNpX2Rldi0+aXJxKTsJCQkJCQlcCisJZnJlZV9pcnEoX3BPYmotPnBjaV9kZXYtPmlycSwgKG5ldF9kZXYpKTsJCQkJCVwKKwlSVE1QX01TSV9ESVNBQkxFKF9wQWQpOyB9CisjZWxzZQorI2RlZmluZSBSVDI4WFhfSVJRX1JFTEVBU0UobmV0X2RldikJCQkJCQkJCVwKK3sJUFJUTVBfQURBUFRFUiBfcEFkID0gKFBSVE1QX0FEQVBURVIpKChuZXRfZGV2KS0+cHJpdik7CQlcCisJUE9TX0NPT0tJRSBfcE9iaiA9IChQT1NfQ09PS0lFKShfcEFkLT5PU19Db29raWUpOwkJCVwKKwlmcmVlX2lycShfcE9iai0+cGNpX2Rldi0+aXJxLCAobmV0X2RldikpOwkJCQkJXAorCVJUTVBfTVNJX0RJU0FCTEUoX3BBZCk7IH0KKyNlbmRpZgorCisjZGVmaW5lIFJUMjhYWF9JUlFfSU5JVChwQWQpCQkJCQkJCQkJCVwKKwl7CXBBZC0+aW50X2VuYWJsZV9yZWcgPSAoKERFTEFZSU5UTUFTSykgfAkJCQkJCVwKKwkJCQkJCQkoUnhJTlR8VHhEYXRhSW50fFR4TWdtdEludCkpICYgfigweDAzKTsJXAorCQlwQWQtPmludF9kaXNhYmxlX21hc2sgPSAwOwkJCQkJCQkJCVwKKwkJcEFkLT5pbnRfcGVuZGluZyA9IDA7IH0KKworI2RlZmluZSBSVDI4WFhfSVJRX0VOQUJMRShwQWQpCQkJCQkJCQkJXAorCXsJLyogY2xlYXIgZ2FyYmFnZSBpbnRzICovCQkJCQkJCQlcCisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIElOVF9TT1VSQ0VfQ1NSLCAweGZmZmZmZmZmKTsJCVwKKwkJTklDRW5hYmxlSW50ZXJydXB0KHBBZCk7IH0KKworI2RlZmluZSBSVDI4WFhfUFVUX0RFVklDRShkZXZfcCkKKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLSBNTE1FIFJlbGF0ZWQgTUFDUk8gLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyNkZWZpbmUgUlQyOFhYX01MTUVfSEFORExFUihwQWQpCQkJTWxtZUhhbmRsZXIocEFkKQorCisjZGVmaW5lIFJUMjhYWF9NTE1FX1BSRV9TQU5JVFlfQ0hFQ0socEFkKQorCisjZGVmaW5lIFJUMjhYWF9NTE1FX1NUQV9RVUlDS19SU1BfV0FLRV9VUChwQWQpCVwKKwlSVE1QU2V0VGltZXIoJnBBZC0+U3RhQ2ZnLlN0YVF1aWNrUmVzcG9uZUZvclJhdGVVcFRpbWVyLCAxMDApOworCisjZGVmaW5lIFJUMjhYWF9NTE1FX1JFU0VUX1NUQVRFX01BQ0hJTkUocEFkKQlcCisJCU1sbWVSZXN0YXJ0U3RhdGVNYWNoaW5lKHBBZCkKKworI2RlZmluZSBSVDI4WFhfSEFORExFX0NPVU5URVJfTUVBU1VSRShfcEFkLCBfcEVudHJ5KQkJXAorCQlIYW5kbGVDb3VudGVyTWVhc3VyZShfcEFkLCBfcEVudHJ5KQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLSBQb3dlciBTYXZlIFJlbGF0ZWQgTUFDUk8gLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyNkZWZpbmUgUlQyOFhYX1BTX1BPTExfRU5RVUVVRShwQWQpCQkJCUVucXVldWVQc1BvbGwocEFkKQorCisvLworLy8gRGV2aWNlIElEICYgVmVuZG9yIElELCB0aGVzZSB2YWx1ZXMgc2hvdWxkIG1hdGNoIEVFUFJPTSB2YWx1ZQorLy8KKyNkZWZpbmUgTklDMjg2MF9QQ0lfREVWSUNFX0lEICAgMHgwNjAxCisjZGVmaW5lIE5JQzI4NjBfUENJZV9ERVZJQ0VfSUQgIDB4MDY4MQorI2RlZmluZSBOSUMyNzYwX1BDSV9ERVZJQ0VfSUQgICAweDA3MDEJCS8vIDFULzJSIENhcmRidXMgPz8/CisjZGVmaW5lIE5JQzI3OTBfUENJZV9ERVZJQ0VfSUQgIDB4MDc4MQkgICAgLy8gMVQvMlIgbWluaUNhcmQKKworI2RlZmluZSBOSUNfUENJX1ZFTkRPUl9JRCAgICAgICAweDE4MTQKKworI2RlZmluZSBWRU5fQVdUX1BDSWVfREVWSUNFX0lECTB4MTA1OQorI2RlZmluZSBWRU5fQVdUX1BDSV9WRU5ET1JfSUQJMHgxQTNCCisKKy8vIEZvciBSVE1QUENJZVBvd2VyTGlua0N0cmxSZXN0b3JlICgpIGZ1bmN0aW9uCisjZGVmaW5lIFJFU1RPUkVfSEFMVAkJICAgIDEKKyNkZWZpbmUgUkVTVE9SRV9XQUtFVVAJCSAgICAyCisjZGVmaW5lIFJFU1RPUkVfQ0xPU0UgICAgICAgICAgIDMKKworI2RlZmluZSBQb3dlclNhZmVDSUQJCTEKKyNkZWZpbmUgUG93ZXJSYWRpb09mZkNJRAkJMgorI2RlZmluZSBQb3dlcldha2VDSUQJCTMKKyNkZWZpbmUgQ0lEME1BU0sJCTB4MDAwMDAwZmYKKyNkZWZpbmUgQ0lEMU1BU0sJCTB4MDAwMGZmMDAKKyNkZWZpbmUgQ0lEMk1BU0sJCTB4MDBmZjAwMDAKKyNkZWZpbmUgQ0lEM01BU0sJCTB4ZmYwMDAwMDAKKworI2RlZmluZSBQQ0lfUkVHX1JFQURfV09SRChwY2lfZGV2LCBvZmZzZXQsIENvbmZpZ3VyYXRpb24pICAgXAorICAgIGlmIChwY2lfcmVhZF9jb25maWdfd29yZChwY2lfZGV2LCBvZmZzZXQsICZyZWcxNikgPT0gMCkgICAgIFwKKyAgICAgICAgQ29uZmlndXJhdGlvbiA9IGxlMmNwdTE2KHJlZzE2KTsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBDb25maWd1cmF0aW9uID0gMDsKKworI2RlZmluZSBQQ0lfUkVHX1dJUlRFX1dPUkQocGNpX2Rldiwgb2Zmc2V0LCBDb25maWd1cmF0aW9uKSAgXAorICAgIHJlZzE2ID0gY3B1MmxlMTYoQ29uZmlndXJhdGlvbik7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHBjaV93cml0ZV9jb25maWdfd29yZChwY2lfZGV2LCBvZmZzZXQsIHJlZzE2KTsgICAgICAgICAgXAorCisjZGVmaW5lIFJUMjhYWF9TVEFfRk9SQ0VfV0FLRVVQKHBBZCwgYkZyb21UeCkgXAorICAgIFJUMjh4eFBjaVN0YUFzaWNGb3JjZVdha2V1cChwQWQsIGJGcm9tVHgpOworCisjZGVmaW5lIFJUMjhYWF9TVEFfU0xFRVBfVEhFTl9BVVRPX1dBS0VVUChwQWQsIFRidHROdW1Ub05leHRXYWtlVXApIFwKKyAgICBSVDI4eHhQY2lTdGFBc2ljU2xlZXBUaGVuQXV0b1dha2V1cChwQWQsIFRidHROdW1Ub05leHRXYWtlVXApOworCisjZGVmaW5lIFJUMjhYWF9NTE1FX1JBRElPX09OKHBBZCkgXAorICAgIFJUMjh4eFBjaU1sbWVSYWRpb09uKHBBZCk7CisKKyNkZWZpbmUgUlQyOFhYX01MTUVfUkFESU9fT0ZGKHBBZCkgXAorICAgIFJUMjh4eFBjaU1sbWVSYWRpb09GRihwQWQpOworCisjZW5kaWYgLy9fX1JUMjg2MF9IX18KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydDI4eHguaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnQyOHh4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmYyMzA0MwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnQyOHh4LmgKQEAgLTAsMCArMSwyNzE0IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCU1vZHVsZSBOYW1lOgorCXJ0Mjh4eC5oCisKKwlBYnN0cmFjdDoKKwlSVDI4eHggQVNJQyByZWxhdGVkIGRlZmluaXRpb24gJiBzdHJ1Y3R1cmVzCisKKwlSZXZpc2lvbiBIaXN0b3J5OgorCVdobwkJCVdoZW4JCSAgV2hhdAorCS0tLS0tLS0tCS0tLS0tLS0tLS0JICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgSmFuIExlZSAgICAgICAgICAgSmFuLTMtMjAwNiAgICAgY3JlYXRlZCBmb3IgUlQyODYwYworKi8KKworI2lmbmRlZglfX1JUMjhYWF9IX18KKyNkZWZpbmUJX19SVDI4WFhfSF9fCisKKworLy8KKy8vIFBDSSByZWdpc3RlcnMgLSBiYXNlIGFkZHJlc3MgMHgwMDAwCisvLworI2RlZmluZSBQQ0lfQ0ZHCQkJMHgwMDAwCisjZGVmaW5lIFBDSV9FRUNUUkwJCQkweDAwMDQKKyNkZWZpbmUgUENJX01DVUNUUkwJCQkweDAwMDgKKworLy8KKy8vIFNDSC9ETUEgcmVnaXN0ZXJzIC0gYmFzZSBhZGRyZXNzIDB4MDIwMAorLy8KKy8vIElOVF9TT1VSQ0VfQ1NSOiBJbnRlcnJ1cHQgc291cmNlIHJlZ2lzdGVyLiBXcml0ZSBvbmUgdG8gY2xlYXIgY29ycmVzcG9uZGluZyBiaXQKKy8vCisjZGVmaW5lIERNQV9DU1IwICAgICAgMHgyMDAKKyNkZWZpbmUgSU5UX1NPVVJDRV9DU1IgICAgICAweDIwMAorI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX0lOVF9TT1VSQ0VfQ1NSX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVSU5UMzIgICAgICAgCToxNDsKKwkJVUlOVDMyICAgICAgIAlUeENvaGVyZW50OjE7CisJCVVJTlQzMiAgICAgICAJUnhDb2hlcmVudDoxOworCQlVSU5UMzIgICAgICAgCUdQVGltZXI6MTsKKwkJVUlOVDMyICAgICAgIAlBdXRvV2FrZXVwOjE7Ly9iaXQxNAorCQlVSU5UMzIgICAgICAgCVRYRmlmb1N0YXR1c0ludDoxOy8vRklGTyBTdGF0aXN0aWNzIGlzIGZ1bGwsIHN3IHNob3VsZCByZWFkIDB4MTcxYworCQlVSU5UMzIgICAgICAgCVByZVRCVFQ6MTsKKwkJVUlOVDMyICAgICAgIAlUQlRUSW50OjE7CisJCVVJTlQzMiAgICAgICAJUnhUeENvaGVyZW50OjE7CisJCVVJTlQzMiAgICAgICAJTUNVQ29tbWFuZElOVDoxOworCQlVSU5UMzIgICAgICAgCU1nbXREbWFEb25lOjE7CisJCVVJTlQzMiAgICAgICAJSGNjYURtYURvbmU6MTsKKwkJVUlOVDMyICAgICAgIAlBYzNEbWFEb25lOjE7CisJCVVJTlQzMiAgICAgICAJQWMyRG1hRG9uZToxOworCQlVSU5UMzIgICAgICAgCUFjMURtYURvbmU6MTsKKwkJVUlOVDMyCQlBYzBEbWFEb25lOjE7CisJCVVJTlQzMgkJUnhEb25lOjE7CisJCVVJTlQzMgkJVHhEZWxheUlOVDoxOwkvL2RlbGF5ZWQgaW50ZXJydXB0LCBub3QgaW50ZXJydXB0IHVudGlsIHNldmVyYWwgaW50IG9yIHRpbWUgbGltaXQgaGl0CisJCVVJTlQzMgkJUnhEZWxheUlOVDoxOyAvL2RlYWx5ZWQgaW50ZXJydXB0CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlJTlRfU09VUkNFX0NTUl9TVFJVQywgKlBJTlRfU09VUkNFX0NTUl9TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9JTlRfU09VUkNFX0NTUl9TVFJVQwl7CisJc3RydWN0CXsKKwkJVUlOVDMyCQlSeERlbGF5SU5UOjE7CisJCVVJTlQzMgkJVHhEZWxheUlOVDoxOworCQlVSU5UMzIJCVJ4RG9uZToxOworCQlVSU5UMzIJCUFjMERtYURvbmU6MTsvLzQKKwkJVUlOVDMyICAgICAgIAlBYzFEbWFEb25lOjE7CisJCVVJTlQzMiAgICAgICAJQWMyRG1hRG9uZToxOworCQlVSU5UMzIgICAgICAgCUFjM0RtYURvbmU6MTsKKwkJVUlOVDMyICAgICAgIAlIY2NhRG1hRG9uZToxOyAvLyBiaXQ3CisJCVVJTlQzMiAgICAgICAJTWdtdERtYURvbmU6MTsKKwkJVUlOVDMyICAgICAgIAlNQ1VDb21tYW5kSU5UOjE7Ly9iaXQgOQorCQlVSU5UMzIgICAgICAgCVJ4VHhDb2hlcmVudDoxOworCQlVSU5UMzIgICAgICAgCVRCVFRJbnQ6MTsKKwkJVUlOVDMyICAgICAgIAlQcmVUQlRUOjE7CisJCVVJTlQzMiAgICAgICAJVFhGaWZvU3RhdHVzSW50OjE7Ly9GSUZPIFN0YXRpc3RpY3MgaXMgZnVsbCwgc3cgc2hvdWxkIHJlYWQgMHgxNzFjCisJCVVJTlQzMiAgICAgICAJQXV0b1dha2V1cDoxOy8vYml0MTQKKwkJVUlOVDMyICAgICAgIAlHUFRpbWVyOjE7CisJCVVJTlQzMiAgICAgICAJUnhDb2hlcmVudDoxOy8vYml0MTYKKwkJVUlOVDMyICAgICAgIAlUeENvaGVyZW50OjE7CisJCVVJTlQzMiAgICAgICAJOjE0OworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30gSU5UX1NPVVJDRV9DU1JfU1RSVUMsICpQSU5UX1NPVVJDRV9DU1JfU1RSVUM7CisjZW5kaWYKKworLy8KKy8vIElOVF9NQVNLX0NTUjogICBJbnRlcnJ1cHQgTUFTSyByZWdpc3Rlci4gICAxOiB0aGUgaW50ZXJydXB0IGlzIG1hc2sgT0ZGCisvLworI2RlZmluZSBJTlRfTUFTS19DU1IgICAgICAgIDB4MjA0CisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfSU5UX01BU0tfQ1NSX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVSU5UMzIgICAgICAgCVR4Q29oZXJlbnQ6MTsKKwkJVUlOVDMyICAgICAgIAlSeENvaGVyZW50OjE7CisJCVVJTlQzMiAgICAgICAJOjIwOworCQlVSU5UMzIgICAgICAgCU1DVUNvbW1hbmRJTlQ6MTsKKwkJVUlOVDMyICAgICAgIAlNZ210RG1hRG9uZToxOworCQlVSU5UMzIgICAgICAgCUhjY2FEbWFEb25lOjE7CisJCVVJTlQzMiAgICAgICAJQWMzRG1hRG9uZToxOworCQlVSU5UMzIgICAgICAgCUFjMkRtYURvbmU6MTsKKwkJVUlOVDMyICAgICAgIAlBYzFEbWFEb25lOjE7CisJCVVJTlQzMgkJQWMwRG1hRG9uZToxOworCQlVSU5UMzIJCVJ4RG9uZToxOworCQlVSU5UMzIJCVR4RGVsYXk6MTsKKwkJVUlOVDMyCQlSWERlbGF5X0lOVF9NU0s6MTsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9SU5UX01BU0tfQ1NSX1NUUlVDLCAqUElOVF9NQVNLX0NTUl9TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9JTlRfTUFTS19DU1JfU1RSVUMJeworCXN0cnVjdAl7CisJCVVJTlQzMgkJUlhEZWxheV9JTlRfTVNLOjE7CisJCVVJTlQzMgkJVHhEZWxheToxOworCQlVSU5UMzIJCVJ4RG9uZToxOworCQlVSU5UMzIJCUFjMERtYURvbmU6MTsKKwkJVUlOVDMyICAgICAgIAlBYzFEbWFEb25lOjE7CisJCVVJTlQzMiAgICAgICAJQWMyRG1hRG9uZToxOworCQlVSU5UMzIgICAgICAgCUFjM0RtYURvbmU6MTsKKwkJVUlOVDMyICAgICAgIAlIY2NhRG1hRG9uZToxOworCQlVSU5UMzIgICAgICAgCU1nbXREbWFEb25lOjE7CisJCVVJTlQzMiAgICAgICAJTUNVQ29tbWFuZElOVDoxOworCQlVSU5UMzIgICAgICAgCToyMDsKKwkJVUlOVDMyICAgICAgIAlSeENvaGVyZW50OjE7CisJCVVJTlQzMiAgICAgICAJVHhDb2hlcmVudDoxOworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30gSU5UX01BU0tfQ1NSX1NUUlVDLCAqUElOVF9NQVNLX0NTUl9TVFJVQzsKKyNlbmRpZgorI2RlZmluZSBXUERNQV9HTE9fQ0ZHIAkweDIwOAorI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX1dQRE1BX0dMT19DRkdfU1RSVUMJeworCXN0cnVjdAl7CisJCVVJTlQzMiAgICAgICAJSERSX1NFR19MRU46MTY7CisJCVVJTlQzMiAgICAgICAJUlhIZHJTY2F0ZXI6ODsKKwkJVUlOVDMyICAgICAgIAlCaWdFbmRpYW46MTsKKwkJVUlOVDMyICAgICAgIAlFblRYV3JpdGVCYWNrRERPTkU6MTsKKwkJVUlOVDMyICAgICAgIAlXUERNQUJ1cnN0U0laRToyOworCQlVSU5UMzIJCVJ4RE1BQnVzeToxOworCQlVSU5UMzIJCUVuYWJsZVJ4RE1BOjE7CisJCVVJTlQzMgkJVHhETUFCdXN5OjE7CisJCVVJTlQzMgkJRW5hYmxlVHhETUE6MTsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9V1BETUFfR0xPX0NGR19TVFJVQywgKlBXUERNQV9HTE9fQ0ZHX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX1dQRE1BX0dMT19DRkdfU1RSVUMJeworCXN0cnVjdAl7CisJCVVJTlQzMgkJRW5hYmxlVHhETUE6MTsKKwkJVUlOVDMyCQlUeERNQUJ1c3k6MTsKKwkJVUlOVDMyCQlFbmFibGVSeERNQToxOworCQlVSU5UMzIJCVJ4RE1BQnVzeToxOworCQlVSU5UMzIgICAgICAgCVdQRE1BQnVyc3RTSVpFOjI7CisJCVVJTlQzMiAgICAgICAJRW5UWFdyaXRlQmFja0RET05FOjE7CisJCVVJTlQzMiAgICAgICAJQmlnRW5kaWFuOjE7CisJCVVJTlQzMiAgICAgICAJUlhIZHJTY2F0ZXI6ODsKKwkJVUlOVDMyICAgICAgIAlIRFJfU0VHX0xFTjoxNjsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9IFdQRE1BX0dMT19DRkdfU1RSVUMsICpQV1BETUFfR0xPX0NGR19TVFJVQzsKKyNlbmRpZgorI2RlZmluZSBXUERNQV9SU1RfSURYIAkweDIwYworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX1dQRE1BX1JTVF9JRFhfU1RSVUMJeworCXN0cnVjdAl7CisJCVVJTlQzMiAgICAgICAJOjE1OworCQlVSU5UMzIgICAgICAgCVJTVF9EUlhfSURYMDoxOworCQlVSU5UMzIgICAgICAgCXJzdjoxMDsKKwkJVUlOVDMyICAgICAgIAlSU1RfRFRYX0lEWDU6MTsKKwkJVUlOVDMyICAgICAgIAlSU1RfRFRYX0lEWDQ6MTsKKwkJVUlOVDMyCQlSU1RfRFRYX0lEWDM6MTsKKwkJVUlOVDMyCQlSU1RfRFRYX0lEWDI6MTsKKwkJVUlOVDMyCQlSU1RfRFRYX0lEWDE6MTsKKwkJVUlOVDMyCQlSU1RfRFRYX0lEWDA6MTsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9V1BETUFfUlNUX0lEWF9TVFJVQywgKlBXUERNQV9SU1RfSURYX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX1dQRE1BX1JTVF9JRFhfU1RSVUMJeworCXN0cnVjdAl7CisJCVVJTlQzMgkJUlNUX0RUWF9JRFgwOjE7CisJCVVJTlQzMgkJUlNUX0RUWF9JRFgxOjE7CisJCVVJTlQzMgkJUlNUX0RUWF9JRFgyOjE7CisJCVVJTlQzMgkJUlNUX0RUWF9JRFgzOjE7CisJCVVJTlQzMiAgICAgICAJUlNUX0RUWF9JRFg0OjE7CisJCVVJTlQzMiAgICAgICAJUlNUX0RUWF9JRFg1OjE7CisJCVVJTlQzMiAgICAgICAJcnN2OjEwOworCQlVSU5UMzIgICAgICAgCVJTVF9EUlhfSURYMDoxOworCQlVSU5UMzIgICAgICAgCToxNTsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9IFdQRE1BX1JTVF9JRFhfU1RSVUMsICpQV1BETUFfUlNUX0lEWF9TVFJVQzsKKyNlbmRpZgorI2RlZmluZSBERUxBWV9JTlRfQ0ZHICAweDAyMTAKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9ERUxBWV9JTlRfQ0ZHX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVSU5UMzIgICAgICAgCVRYRExZX0lOVF9FTjoxOworCQlVSU5UMzIgICAgICAgCVRYTUFYX1BJTlQ6NzsKKwkJVUlOVDMyICAgICAgIAlUWE1BWF9QVElNRTo4OworCQlVSU5UMzIgICAgICAgCVJYRExZX0lOVF9FTjoxOworCQlVSU5UMzIgICAgICAgCVJYTUFYX1BJTlQ6NzsKKwkJVUlOVDMyCQlSWE1BWF9QVElNRTo4OworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK31ERUxBWV9JTlRfQ0ZHX1NUUlVDLCAqUERFTEFZX0lOVF9DRkdfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfREVMQVlfSU5UX0NGR19TVFJVQwl7CisJc3RydWN0CXsKKwkJVUlOVDMyCQlSWE1BWF9QVElNRTo4OworCQlVSU5UMzIgICAgICAgCVJYTUFYX1BJTlQ6NzsKKwkJVUlOVDMyICAgICAgIAlSWERMWV9JTlRfRU46MTsKKwkJVUlOVDMyICAgICAgIAlUWE1BWF9QVElNRTo4OworCQlVSU5UMzIgICAgICAgCVRYTUFYX1BJTlQ6NzsKKwkJVUlOVDMyICAgICAgIAlUWERMWV9JTlRfRU46MTsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9IERFTEFZX0lOVF9DRkdfU1RSVUMsICpQREVMQVlfSU5UX0NGR19TVFJVQzsKKyNlbmRpZgorI2RlZmluZSBXTU1fQUlGU05fQ0ZHICAgMHgwMjE0CisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfQUlGU05fQ1NSX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVSU5UMzIgICBSc3Y6MTY7CisJICAgIFVJTlQzMiAgIEFpZnNuMzo0OyAgICAgICAvLyBmb3IgQUNfVk8KKwkgICAgVUlOVDMyICAgQWlmc24yOjQ7ICAgICAgIC8vIGZvciBBQ19WSQorCSAgICBVSU5UMzIgICBBaWZzbjE6NDsgICAgICAgLy8gZm9yIEFDX0JLCisJICAgIFVJTlQzMiAgIEFpZnNuMDo0OyAgICAgICAvLyBmb3IgQUNfQkUKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CUFJRlNOX0NTUl9TVFJVQywgKlBBSUZTTl9DU1JfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfQUlGU05fQ1NSX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVSU5UMzIgICBBaWZzbjA6NDsgICAgICAgLy8gZm9yIEFDX0JFCisJICAgIFVJTlQzMiAgIEFpZnNuMTo0OyAgICAgICAvLyBmb3IgQUNfQksKKwkgICAgVUlOVDMyICAgQWlmc24yOjQ7ICAgICAgIC8vIGZvciBBQ19WSQorCSAgICBVSU5UMzIgICBBaWZzbjM6NDsgICAgICAgLy8gZm9yIEFDX1ZPCisJICAgIFVJTlQzMiAgIFJzdjoxNjsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CUFJRlNOX0NTUl9TVFJVQywgKlBBSUZTTl9DU1JfU1RSVUM7CisjZW5kaWYKKy8vCisvLyBDV01JTl9DU1I6IENXbWluIGZvciBlYWNoIEVEQ0EgQUMKKy8vCisjZGVmaW5lIFdNTV9DV01JTl9DRkcgICAweDAyMTgKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9DV01JTl9DU1JfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVJTlQzMiAgIFJzdjoxNjsKKwkgICAgVUlOVDMyICAgQ3dtaW4zOjQ7ICAgICAgIC8vIGZvciBBQ19WTworCSAgICBVSU5UMzIgICBDd21pbjI6NDsgICAgICAgLy8gZm9yIEFDX1ZJCisJICAgIFVJTlQzMiAgIEN3bWluMTo0OyAgICAgICAvLyBmb3IgQUNfQksKKwkgICAgVUlOVDMyICAgQ3dtaW4wOjQ7ICAgICAgIC8vIGZvciBBQ19CRQorCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JQ1dNSU5fQ1NSX1NUUlVDLCAqUENXTUlOX0NTUl9TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9DV01JTl9DU1JfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVJTlQzMiAgIEN3bWluMDo0OyAgICAgICAvLyBmb3IgQUNfQkUKKwkgICAgVUlOVDMyICAgQ3dtaW4xOjQ7ICAgICAgIC8vIGZvciBBQ19CSworCSAgICBVSU5UMzIgICBDd21pbjI6NDsgICAgICAgLy8gZm9yIEFDX1ZJCisJICAgIFVJTlQzMiAgIEN3bWluMzo0OyAgICAgICAvLyBmb3IgQUNfVk8KKwkgICAgVUlOVDMyICAgUnN2OjE2OworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JQ1dNSU5fQ1NSX1NUUlVDLCAqUENXTUlOX0NTUl9TVFJVQzsKKyNlbmRpZgorCisvLworLy8gQ1dNQVhfQ1NSOiBDV21pbiBmb3IgZWFjaCBFRENBIEFDCisvLworI2RlZmluZSBXTU1fQ1dNQVhfQ0ZHICAgMHgwMjFjCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfQ1dNQVhfQ1NSX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVSU5UMzIgICBSc3Y6MTY7CisJICAgIFVJTlQzMiAgIEN3bWF4Mzo0OyAgICAgICAvLyBmb3IgQUNfVk8KKwkgICAgVUlOVDMyICAgQ3dtYXgyOjQ7ICAgICAgIC8vIGZvciBBQ19WSQorCSAgICBVSU5UMzIgICBDd21heDE6NDsgICAgICAgLy8gZm9yIEFDX0JLCisJICAgIFVJTlQzMiAgIEN3bWF4MDo0OyAgICAgICAvLyBmb3IgQUNfQkUKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CUNXTUFYX0NTUl9TVFJVQywgKlBDV01BWF9DU1JfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfQ1dNQVhfQ1NSX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVSU5UMzIgICBDd21heDA6NDsgICAgICAgLy8gZm9yIEFDX0JFCisJICAgIFVJTlQzMiAgIEN3bWF4MTo0OyAgICAgICAvLyBmb3IgQUNfQksKKwkgICAgVUlOVDMyICAgQ3dtYXgyOjQ7ICAgICAgIC8vIGZvciBBQ19WSQorCSAgICBVSU5UMzIgICBDd21heDM6NDsgICAgICAgLy8gZm9yIEFDX1ZPCisJICAgIFVJTlQzMiAgIFJzdjoxNjsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CUNXTUFYX0NTUl9TVFJVQywgKlBDV01BWF9DU1JfU1RSVUM7CisjZW5kaWYKKworCisvLworLy8gQUNfVFhPUF9DU1IwOiBBQ19CSy9BQ19CRSBUWE9QIHJlZ2lzdGVyCisvLworI2RlZmluZSBXTU1fVFhPUDBfQ0ZHICAgIDB4MDIyMAorI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX0FDX1RYT1BfQ1NSMF9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVVNIT1JUICBBYzFUeG9wOyAgICAgICAgLy8gZm9yIEFDX0JFLCBpbiB1bml0IG9mIDMydXMKKwkgICAgVVNIT1JUICBBYzBUeG9wOyAgICAgICAgLy8gZm9yIEFDX0JLLCBpbiB1bml0IG9mIDMydXMKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CUFDX1RYT1BfQ1NSMF9TVFJVQywgKlBBQ19UWE9QX0NTUjBfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfQUNfVFhPUF9DU1IwX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVU0hPUlQgIEFjMFR4b3A7ICAgICAgICAvLyBmb3IgQUNfQkssIGluIHVuaXQgb2YgMzJ1cworCSAgICBVU0hPUlQgIEFjMVR4b3A7ICAgICAgICAvLyBmb3IgQUNfQkUsIGluIHVuaXQgb2YgMzJ1cworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JQUNfVFhPUF9DU1IwX1NUUlVDLCAqUEFDX1RYT1BfQ1NSMF9TVFJVQzsKKyNlbmRpZgorCisvLworLy8gQUNfVFhPUF9DU1IxOiBBQ19WTy9BQ19WSSBUWE9QIHJlZ2lzdGVyCisvLworI2RlZmluZSBXTU1fVFhPUDFfQ0ZHICAgIDB4MDIyNAorI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX0FDX1RYT1BfQ1NSMV9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVVNIT1JUICBBYzNUeG9wOyAgICAgICAgLy8gZm9yIEFDX1ZPLCBpbiB1bml0IG9mIDMydXMKKwkgICAgVVNIT1JUICBBYzJUeG9wOyAgICAgICAgLy8gZm9yIEFDX1ZJLCBpbiB1bml0IG9mIDMydXMKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CUFDX1RYT1BfQ1NSMV9TVFJVQywgKlBBQ19UWE9QX0NTUjFfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfQUNfVFhPUF9DU1IxX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVU0hPUlQgIEFjMlR4b3A7ICAgICAgICAvLyBmb3IgQUNfVkksIGluIHVuaXQgb2YgMzJ1cworCSAgICBVU0hPUlQgIEFjM1R4b3A7ICAgICAgICAvLyBmb3IgQUNfVk8sIGluIHVuaXQgb2YgMzJ1cworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JQUNfVFhPUF9DU1IxX1NUUlVDLCAqUEFDX1RYT1BfQ1NSMV9TVFJVQzsKKyNlbmRpZgorI2RlZmluZSBSSU5HUkVHX0RJRkYJCQkweDEwCisjZGVmaW5lIEdQSU9fQ1RSTF9DRkcgICAgMHgwMjI4CS8vTUFDX0NTUjEzCisjZGVmaW5lIE1DVV9DTURfQ0ZHICAgIDB4MDIyYworI2RlZmluZSBUWF9CQVNFX1BUUjAgICAgIDB4MDIzMAkvL0FDX0JLIGJhc2UgYWRkcmVzcworI2RlZmluZSBUWF9NQVhfQ05UMCAgICAgIDB4MDIzNAorI2RlZmluZSBUWF9DVFhfSURYMCAgICAgICAweDAyMzgKKyNkZWZpbmUgVFhfRFRYX0lEWDAgICAgICAweDAyM2MKKyNkZWZpbmUgVFhfQkFTRV9QVFIxICAgICAweDAyNDAgCS8vQUNfQkUgYmFzZSBhZGRyZXNzCisjZGVmaW5lIFRYX01BWF9DTlQxICAgICAgMHgwMjQ0CisjZGVmaW5lIFRYX0NUWF9JRFgxICAgICAgIDB4MDI0OAorI2RlZmluZSBUWF9EVFhfSURYMSAgICAgIDB4MDI0YworI2RlZmluZSBUWF9CQVNFX1BUUjIgICAgIDB4MDI1MCAJLy9BQ19WSSBiYXNlIGFkZHJlc3MKKyNkZWZpbmUgVFhfTUFYX0NOVDIgICAgICAweDAyNTQKKyNkZWZpbmUgVFhfQ1RYX0lEWDIgICAgICAgMHgwMjU4CisjZGVmaW5lIFRYX0RUWF9JRFgyICAgICAgMHgwMjVjCisjZGVmaW5lIFRYX0JBU0VfUFRSMyAgICAgMHgwMjYwIAkvL0FDX1ZPIGJhc2UgYWRkcmVzcworI2RlZmluZSBUWF9NQVhfQ05UMyAgICAgIDB4MDI2NAorI2RlZmluZSBUWF9DVFhfSURYMyAgICAgICAweDAyNjgKKyNkZWZpbmUgVFhfRFRYX0lEWDMgICAgICAweDAyNmMKKyNkZWZpbmUgVFhfQkFTRV9QVFI0ICAgICAweDAyNzAgCS8vSENDQSBiYXNlIGFkZHJlc3MKKyNkZWZpbmUgVFhfTUFYX0NOVDQgICAgICAweDAyNzQKKyNkZWZpbmUgVFhfQ1RYX0lEWDQgICAgICAgMHgwMjc4CisjZGVmaW5lIFRYX0RUWF9JRFg0ICAgICAgMHgwMjdjCisjZGVmaW5lIFRYX0JBU0VfUFRSNSAgICAgMHgwMjgwIAkvL01HTVQgYmFzZSBhZGRyZXNzCisjZGVmaW5lICBUWF9NQVhfQ05UNSAgICAgMHgwMjg0CisjZGVmaW5lIFRYX0NUWF9JRFg1ICAgICAgIDB4MDI4OAorI2RlZmluZSBUWF9EVFhfSURYNSAgICAgIDB4MDI4YworI2RlZmluZSBUWF9NR01UTUFYX0NOVCAgICAgIFRYX01BWF9DTlQ1CisjZGVmaW5lIFRYX01HTVRDVFhfSURYICAgICAgIFRYX0NUWF9JRFg1CisjZGVmaW5lIFRYX01HTVREVFhfSURYICAgICAgVFhfRFRYX0lEWDUKKyNkZWZpbmUgUlhfQkFTRV9QVFIgICAgIDB4MDI5MCAJLy9SWCBiYXNlIGFkZHJlc3MKKyNkZWZpbmUgUlhfTUFYX0NOVCAgICAgIDB4MDI5NAorI2RlZmluZSBSWF9DUlhfSURYICAgICAgIDB4MDI5OAorI2RlZmluZSBSWF9EUlhfSURYICAgICAgMHgwMjljCisjZGVmaW5lIFVTQl9ETUFfQ0ZHICAgICAgMHgwMmEwCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfVVNCX0RNQV9DRkdfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVJTlQzMiAgVHhCdXN5OjE7ICAgCS8vVVNCIERNQSBUWCBGU00gYnVzeSAuIGRlYnVnIG9ubHkKKwkgICAgVUlOVDMyICBSeEJ1c3k6MTsgICAgICAgIC8vVVNCIERNQSBSWCBGU00gYnVzeSAuIGRlYnVnIG9ubHkKKwkgICAgVUlOVDMyICBFcG91dFZhbGlkOjY7ICAgICAgICAvL09VVCBlbmRwb2ludCBkYXRhIHZhbGlkLiBkZWJ1ZyBvbmx5CisJICAgIFVJTlQzMiAgVHhCdWxrRW46MTsgICAgICAgIC8vRW5hYmxlIFVTQiBETUEgVHgKKwkgICAgVUlOVDMyICBSeEJ1bGtFbjoxOyAgICAgICAgLy9FbmFibGUgVVNCIERNQSBSeAorCSAgICBVSU5UMzIgIFJ4QnVsa0FnZ0VuOjE7ICAgICAgICAvL0VuYWJsZSBSeCBCdWxrIEFnZ3JlZ2F0aW9uCisJICAgIFVJTlQzMiAgVHhvcEhhbHQ6MTsgICAgICAgIC8vSGFsdCBUWE9QIGNvdW50IGRvd24gd2hlbiBUWCBidWZmZXIgaXMgZnVsbC4KKwkgICAgVUlOVDMyICBUeENsZWFyOjE7ICAgICAgICAvL0NsZWFyIFVTQiBETUEgVFggcGF0aAorCSAgICBVSU5UMzIgIHJzdjoyOworCSAgICBVSU5UMzIgIHBoeWNsZWFyOjE7ICAgICAgICAJCS8vcGh5IHdhdGNoIGRvZyBlbmFibGUuIHdyaXRlIDEKKwkgICAgVUlOVDMyICBSeEJ1bGtBZ2dMbXQ6ODsgICAgICAgIC8vUnggQnVsayBBZ2dyZWdhdGlvbiBMaW1pdCAgaW4gdW5pdCBvZiAxMDI0IGJ5dGVzCisJICAgIFVJTlQzMiAgUnhCdWxrQWdnVE91dDo4OyAgICAgICAgLy9SeCBCdWxrIEFnZ3JlZ2F0aW9uIFRpbWVPdXQgIGluIHVuaXQgb2YgMzNucworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JVVNCX0RNQV9DRkdfU1RSVUMsICpQVVNCX0RNQV9DRkdfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfVVNCX0RNQV9DRkdfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVJTlQzMiAgUnhCdWxrQWdnVE91dDo4OyAgICAgICAgLy9SeCBCdWxrIEFnZ3JlZ2F0aW9uIFRpbWVPdXQgIGluIHVuaXQgb2YgMzNucworCSAgICBVSU5UMzIgIFJ4QnVsa0FnZ0xtdDo4OyAgICAgICAgLy9SeCBCdWxrIEFnZ3JlZ2F0aW9uIExpbWl0ICBpbiB1bml0IG9mIDI1NiBieXRlcworCSAgICBVSU5UMzIgIHBoeWNsZWFyOjE7ICAgICAgICAJCS8vcGh5IHdhdGNoIGRvZyBlbmFibGUuIHdyaXRlIDEKKwkgICAgVUlOVDMyICByc3Y6MjsKKwkgICAgVUlOVDMyICBUeENsZWFyOjE7ICAgICAgICAvL0NsZWFyIFVTQiBETUEgVFggcGF0aAorCSAgICBVSU5UMzIgIFR4b3BIYWx0OjE7ICAgICAgICAvL0hhbHQgVFhPUCBjb3VudCBkb3duIHdoZW4gVFggYnVmZmVyIGlzIGZ1bGwuCisJICAgIFVJTlQzMiAgUnhCdWxrQWdnRW46MTsgICAgICAgIC8vRW5hYmxlIFJ4IEJ1bGsgQWdncmVnYXRpb24KKwkgICAgVUlOVDMyICBSeEJ1bGtFbjoxOyAgICAgICAgLy9FbmFibGUgVVNCIERNQSBSeAorCSAgICBVSU5UMzIgIFR4QnVsa0VuOjE7ICAgICAgICAvL0VuYWJsZSBVU0IgRE1BIFR4CisJICAgIFVJTlQzMiAgRXBvdXRWYWxpZDo2OyAgICAgICAgLy9PVVQgZW5kcG9pbnQgZGF0YSB2YWxpZAorCSAgICBVSU5UMzIgIFJ4QnVzeToxOyAgICAgICAgLy9VU0IgRE1BIFJYIEZTTSBidXN5CisJICAgIFVJTlQzMiAgVHhCdXN5OjE7ICAgCS8vVVNCIERNQSBUWCBGU00gYnVzeQorCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JVVNCX0RNQV9DRkdfU1RSVUMsICpQVVNCX0RNQV9DRkdfU1RSVUM7CisjZW5kaWYKKworLy8KKy8vICAzICBQQkYgIHJlZ2lzdGVycworLy8KKy8vCisvLyBNb3N0IGFyZSBmb3IgZGVidWcuIERyaXZlciBkb2Vzbid0IHRvdWNoIFBCRiByZWdpc3Rlci4KKyNkZWZpbmUgCVBCRl9TWVNfQ1RSTCAJIDB4MDQwMAorI2RlZmluZSAgICAgUEJGX0NGRyAgICAgICAgICAgICAgICAgMHgwNDA4CisjZGVmaW5lIAlQQkZfTUFYX1BDTlQgCSAweDA0MEMKKyNkZWZpbmUgCVBCRl9DVFJMCSAJMHgwNDEwCisjZGVmaW5lIAlQQkZfSU5UX1NUQQkgMHgwNDE0CisjZGVmaW5lIAlQQkZfSU5UX0VOQQkgMHgwNDE4CisjZGVmaW5lIAlUWFJYUV9QQ05UICAJIDB4MDQzOAorI2RlZmluZSAJUEJGX0RCRyAJIAkgMHgwNDNjCisjZGVmaW5lICAgICBQQkZfQ0FQX0NUUkwgICAgIDB4MDQ0MAorCisvLworLy8gIDQgIE1BQyAgcmVnaXN0ZXJzCisvLworLy8KKy8vICA0LjEgTUFDIFNZU1RFTSAgY29uZmlndXJhdGlvbiByZWdpc3RlcnMgKG9mZnNldDoweDEwMDApCisvLworI2RlZmluZSBNQUNfQ1NSMCAgICAgICAgICAgIDB4MTAwMAorI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX0FTSUNfVkVSX0lEX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVU0hPUlQgIEFTSUNWZXI7ICAgICAgICAvLyB2ZXJzaW9uIDogMjg2MAorCSAgICBVU0hPUlQgIEFTSUNSZXY7ICAgICAgICAvLyByZXZlcnNpb24gIDogMAorCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JQVNJQ19WRVJfSURfU1RSVUMsICpQQVNJQ19WRVJfSURfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfQVNJQ19WRVJfSURfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVTSE9SVCAgQVNJQ1JldjsgICAgICAgIC8vIHJldmVyc2lvbiAgOiAwCisJICAgIFVTSE9SVCAgQVNJQ1ZlcjsgICAgICAgIC8vIHZlcnNpb24gOiAyODYwCisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlBU0lDX1ZFUl9JRF9TVFJVQywgKlBBU0lDX1ZFUl9JRF9TVFJVQzsKKyNlbmRpZgorI2RlZmluZSBNQUNfU1lTX0NUUkwgICAgICAgICAgICAweDEwMDQJCS8vTUFDX0NTUjEKKyNkZWZpbmUgTUFDX0FERFJfRFcwICAgICAgICAgICAgCQkweDEwMDgJCS8vIE1BQyBBRERSIERXMAorI2RlZmluZSBNQUNfQUREUl9EVzEgICAgICAgICAgIAkJIDB4MTAwYwkJLy8gTUFDIEFERFIgRFcxCisvLworLy8gTUFDX0NTUjI6IFNUQSBNQUMgcmVnaXN0ZXIgMAorLy8KKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9NQUNfRFcwX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVQ0hBUgkJQnl0ZTM7CQkvLyBNQUMgYWRkcmVzcyBieXRlIDMKKwkJVUNIQVIJCUJ5dGUyOwkJLy8gTUFDIGFkZHJlc3MgYnl0ZSAyCisJCVVDSEFSCQlCeXRlMTsJCS8vIE1BQyBhZGRyZXNzIGJ5dGUgMQorCQlVQ0hBUgkJQnl0ZTA7CQkvLyBNQUMgYWRkcmVzcyBieXRlIDAKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CU1BQ19EVzBfU1RSVUMsICpQTUFDX0RXMF9TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9NQUNfRFcwX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVQ0hBUgkJQnl0ZTA7CQkvLyBNQUMgYWRkcmVzcyBieXRlIDAKKwkJVUNIQVIJCUJ5dGUxOwkJLy8gTUFDIGFkZHJlc3MgYnl0ZSAxCisJCVVDSEFSCQlCeXRlMjsJCS8vIE1BQyBhZGRyZXNzIGJ5dGUgMgorCQlVQ0hBUgkJQnl0ZTM7CQkvLyBNQUMgYWRkcmVzcyBieXRlIDMKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CU1BQ19EVzBfU1RSVUMsICpQTUFDX0RXMF9TVFJVQzsKKyNlbmRpZgorCisvLworLy8gTUFDX0NTUjM6IFNUQSBNQUMgcmVnaXN0ZXIgMQorLy8KKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9NQUNfRFcxX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVQ0hBUgkJUnN2ZDE7CisJCVVDSEFSCQlVMk1lTWFzazsKKwkJVUNIQVIJCUJ5dGU1OwkJLy8gTUFDIGFkZHJlc3MgYnl0ZSA1CisJCVVDSEFSCQlCeXRlNDsJCS8vIE1BQyBhZGRyZXNzIGJ5dGUgNAorCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JTUFDX0RXMV9TVFJVQywgKlBNQUNfRFcxX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX01BQ19EVzFfU1RSVUMJeworCXN0cnVjdAl7CisJCVVDSEFSCQlCeXRlNDsJCS8vIE1BQyBhZGRyZXNzIGJ5dGUgNAorCQlVQ0hBUgkJQnl0ZTU7CQkvLyBNQUMgYWRkcmVzcyBieXRlIDUKKwkJVUNIQVIJCVUyTWVNYXNrOworCQlVQ0hBUgkJUnN2ZDE7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlNQUNfRFcxX1NUUlVDLCAqUE1BQ19EVzFfU1RSVUM7CisjZW5kaWYKKworI2RlZmluZSBNQUNfQlNTSURfRFcwICAgICAgICAgICAgCQkweDEwMTAJCS8vIE1BQyBCU1NJRCBEVzAKKyNkZWZpbmUgTUFDX0JTU0lEX0RXMSAgICAgICAgICAgIAkJMHgxMDE0CQkvLyBNQUMgQlNTSUQgRFcxCisKKy8vCisvLyBNQUNfQ1NSNTogQlNTSUQgcmVnaXN0ZXIgMQorLy8KKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9NQUNfQ1NSNV9TVFJVQwl7CisJc3RydWN0CXsKKwkJVVNIT1JUCQlSc3ZkOjExOworCQlVU0hPUlQJCU1Cc3NCY25OdW06MzsKKwkJVVNIT1JUCQlCc3NJZE1vZGU6MjsgLy8gMDogb25lIEJTU0lELCAxMDogNCBCU1NJRCwgIDAxOiAyIEJTU0lEICwgMTE6IDhCU1NJRAorCQlVQ0hBUgkJQnl0ZTU7CQkgLy8gQlNTSUQgYnl0ZSA1CisJCVVDSEFSCQlCeXRlNDsJCSAvLyBCU1NJRCBieXRlIDQKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CU1BQ19DU1I1X1NUUlVDLCAqUE1BQ19DU1I1X1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX01BQ19DU1I1X1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVQ0hBUgkJQnl0ZTQ7CQkgLy8gQlNTSUQgYnl0ZSA0CisJCVVDSEFSCQlCeXRlNTsJCSAvLyBCU1NJRCBieXRlIDUKKwkJVVNIT1JUICAgICAgCUJzc0lkTWFzazoyOyAvLyAwOiBvbmUgQlNTSUQsIDEwOiA0IEJTU0lELCAgMDE6IDIgQlNTSUQgLCAxMTogOEJTU0lECisJCVVTSE9SVAkJTUJzc0Jjbk51bTozOworCQlVU0hPUlQJCVJzdmQ6MTE7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlNQUNfQ1NSNV9TVFJVQywgKlBNQUNfQ1NSNV9TVFJVQzsKKyNlbmRpZgorCisjZGVmaW5lIE1BWF9MRU5fQ0ZHICAgICAgICAgICAgICAweDEwMTgJCS8vIHJ0Mjg2MGIgbWF4IDE2ayBieXRlcy4gYml0MTI6MTMgTWF4aW11bSBQU0RVIGxlbmd0aCAocG93ZXIgZmFjdG9yKSAwOjJeMTMsIDE6Ml4xNCwgMjoyXjE1LCAzOjJeMTYKKyNkZWZpbmUgQkJQX0NTUl9DRkcgICAgICAgICAgICAJCTB4MTAxYwkJLy8KKy8vCisvLyBCQlBfQ1NSX0NGRzogQkJQIHNlcmlhbCBjb250cm9sIHJlZ2lzdGVyCisvLworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX0JCUF9DU1JfQ0ZHX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVSU5UMzIJCToxMjsKKwkJVUlOVDMyCQlCQlBfUldfTU9ERToxOwkJLy8gMDogdXNlIHNlcmlhbCBtb2RlICAxOnBhcmFsbGVsCisJCVVJTlQzMgkJQkJQX1BBUl9EVVI6MTsJCSAgICAvLyAwOiA0IE1BQyBjbG9jayBjeWNsZXMgIDE6IDggTUFDIGNsb2NrIGN5Y2xlcworCQlVSU5UMzIJCUJ1c3k6MTsJCQkJLy8gMTogQVNJQyBpcyBidXN5IGV4ZWN1dGUgQkJQIHByb2dyYW1taW5nLgorCQlVSU5UMzIJCWZSZWFkOjE7CQkgICAgLy8gMDogV3JpdGUJQkJQLCAxOglSZWFkIEJCUAorCQlVSU5UMzIJCVJlZ051bTo4OwkJCS8vIFNlbGVjdGVkCUJCUAlyZWdpc3RlcgorCQlVSU5UMzIJCVZhbHVlOjg7CQkJLy8gUmVnaXN0ZXIJdmFsdWUgdG8gcHJvZ3JhbSBpbnRvIEJCUAorCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JQkJQX0NTUl9DRkdfU1RSVUMsICpQQkJQX0NTUl9DRkdfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfQkJQX0NTUl9DRkdfU1RSVUMJeworCXN0cnVjdAl7CisJCVVJTlQzMgkJVmFsdWU6ODsJCQkvLyBSZWdpc3Rlcgl2YWx1ZSB0byBwcm9ncmFtIGludG8gQkJQCisJCVVJTlQzMgkJUmVnTnVtOjg7CQkJLy8gU2VsZWN0ZWQJQkJQCXJlZ2lzdGVyCisJCVVJTlQzMgkJZlJlYWQ6MTsJCSAgICAvLyAwOiBXcml0ZQlCQlAsIDE6CVJlYWQgQkJQCisJCVVJTlQzMgkJQnVzeToxOwkJCQkvLyAxOiBBU0lDIGlzIGJ1c3kgZXhlY3V0ZSBCQlAgcHJvZ3JhbW1pbmcuCisJCVVJTlQzMgkJQkJQX1BBUl9EVVI6MTsJCSAgICAgLy8gMDogNCBNQUMgY2xvY2sgY3ljbGVzICAxOiA4IE1BQyBjbG9jayBjeWNsZXMKKwkJVUlOVDMyCQlCQlBfUldfTU9ERToxOwkJLy8gMDogdXNlIHNlcmlhbCBtb2RlICAxOnBhcmFsbGVsCisJCVVJTlQzMgkJOjEyOworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JQkJQX0NTUl9DRkdfU1RSVUMsICpQQkJQX0NTUl9DRkdfU1RSVUM7CisjZW5kaWYKKyNkZWZpbmUgUkZfQ1NSX0NGRzAgICAgICAgICAgICAJCTB4MTAyMAorLy8KKy8vIFJGX0NTUl9DRkc6IFJGIGNvbnRyb2wgcmVnaXN0ZXIKKy8vCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfUkZfQ1NSX0NGRzBfU1RSVUMJeworCXN0cnVjdAl7CisJCVVJTlQzMgkJQnVzeToxOwkJICAgIC8vIDA6IGlkbGUgMTogOGJ1c3kKKwkJVUlOVDMyCQlTZWw6MTsJCQkJLy8gMDpSRl9MRTAgYWN0aXZhdGUgIDE6UkZfTEUxIGFjdGl2YXRlCisJCVVJTlQzMgkJU3RhbmRieU1vZGU6MTsJCSAgICAvLyAwOiBoaWdoIHdoZW4gc3RhbmQgYnkgMToJbG93IHdoZW4gc3RhbmRieQorCQlVSU5UMzIJCWJpdHdpZHRoOjU7CQkJLy8gU2VsZWN0ZWQJQkJQCXJlZ2lzdGVyCisJCVVJTlQzMgkJUmVnSWRBbmRDb250ZW50OjI0OwkJCS8vIFJlZ2lzdGVyCXZhbHVlIHRvIHByb2dyYW0gaW50byBCQlAKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVJGX0NTUl9DRkcwX1NUUlVDLCAqUFJGX0NTUl9DRkcwX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX1JGX0NTUl9DRkcwX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVSU5UMzIJCVJlZ0lkQW5kQ29udGVudDoyNDsJCQkvLyBSZWdpc3Rlcgl2YWx1ZSB0byBwcm9ncmFtIGludG8gQkJQCisJCVVJTlQzMgkJYml0d2lkdGg6NTsJCQkvLyBTZWxlY3RlZAlCQlAJcmVnaXN0ZXIKKwkJVUlOVDMyCQlTdGFuZGJ5TW9kZToxOwkJICAgIC8vIDA6IGhpZ2ggd2hlbiBzdGFuZCBieSAxOglsb3cgd2hlbiBzdGFuZGJ5CisJCVVJTlQzMgkJU2VsOjE7CQkJCS8vIDA6UkZfTEUwIGFjdGl2YXRlICAxOlJGX0xFMSBhY3RpdmF0ZQorCQlVSU5UMzIJCUJ1c3k6MTsJCSAgICAvLyAwOiBpZGxlIDE6IDhidXN5CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlSRl9DU1JfQ0ZHMF9TVFJVQywgKlBSRl9DU1JfQ0ZHMF9TVFJVQzsKKyNlbmRpZgorI2RlZmluZSBSRl9DU1JfQ0ZHMSAgICAgICAgICAgCQkweDEwMjQKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9SRl9DU1JfQ0ZHMV9TVFJVQwl7CisJc3RydWN0CXsKKwkJVUlOVDMyCQlyc3Y6NzsJCSAgICAvLyAwOiBpZGxlIDE6IDhidXN5CisJCVVJTlQzMgkJUkZHYXA6NTsJCQkvLyBHYXAgYmV0d2VlbiBCQl9DT05UUk9MX1JGIGFuZCBSRl9MRS4gMDogMyBzeXN0ZW0gY2xvY2sgY3ljbGUgKDM3LjV1c2VjKSAxOiA1IHN5c3RlbSBjbG9jayBjeWNsZSAoNjIuNXVzZWMpCisJCVVJTlQzMgkJUmVnSWRBbmRDb250ZW50OjI0OwkJCS8vIFJlZ2lzdGVyCXZhbHVlIHRvIHByb2dyYW0gaW50byBCQlAKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVJGX0NTUl9DRkcxX1NUUlVDLCAqUFJGX0NTUl9DRkcxX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX1JGX0NTUl9DRkcxX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVSU5UMzIJCVJlZ0lkQW5kQ29udGVudDoyNDsJCQkvLyBSZWdpc3Rlcgl2YWx1ZSB0byBwcm9ncmFtIGludG8gQkJQCisJCVVJTlQzMgkJUkZHYXA6NTsJCQkvLyBHYXAgYmV0d2VlbiBCQl9DT05UUk9MX1JGIGFuZCBSRl9MRS4gMDogMyBzeXN0ZW0gY2xvY2sgY3ljbGUgKDM3LjV1c2VjKSAxOiA1IHN5c3RlbSBjbG9jayBjeWNsZSAoNjIuNXVzZWMpCisJCVVJTlQzMgkJcnN2Ojc7CQkgICAgLy8gMDogaWRsZSAxOiA4YnVzeQorCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JUkZfQ1NSX0NGRzFfU1RSVUMsICpQUkZfQ1NSX0NGRzFfU1RSVUM7CisjZW5kaWYKKyNkZWZpbmUgUkZfQ1NSX0NGRzIgICAgICAgICAgIAkJMHgxMDI4CQkvLworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX1JGX0NTUl9DRkcyX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVSU5UMzIJCXJzdjo4OwkJICAgIC8vIDA6IGlkbGUgMTogOGJ1c3kKKwkJVUlOVDMyCQlSZWdJZEFuZENvbnRlbnQ6MjQ7CQkJLy8gUmVnaXN0ZXIJdmFsdWUgdG8gcHJvZ3JhbSBpbnRvIEJCUAorCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JUkZfQ1NSX0NGRzJfU1RSVUMsICpQUkZfQ1NSX0NGRzJfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfUkZfQ1NSX0NGRzJfU1RSVUMJeworCXN0cnVjdAl7CisJCVVJTlQzMgkJUmVnSWRBbmRDb250ZW50OjI0OwkJCS8vIFJlZ2lzdGVyCXZhbHVlIHRvIHByb2dyYW0gaW50byBCQlAKKwkJVUlOVDMyCQlyc3Y6ODsJCSAgICAvLyAwOiBpZGxlIDE6IDhidXN5CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlSRl9DU1JfQ0ZHMl9TVFJVQywgKlBSRl9DU1JfQ0ZHMl9TVFJVQzsKKyNlbmRpZgorI2RlZmluZSBMRURfQ0ZHICAgICAgICAgICAJCTB4MTAyYwkJLy8gIE1BQ19DU1IxNAorI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX0xFRF9DRkdfU1RSVUMJeworCXN0cnVjdAl7CisJCVVJTlQzMgkJOjE7CisJCVVJTlQzMgkJTGVkUG9sYXI6MTsJCQkvLyBMZWQgUG9sYXJpdHkuICAwOiBhY3RpdmUgbG93MTogYWN0aXZlIGhpZ2gKKwkJVUlOVDMyCQlZTGVkTW9kZToyOwkJCS8vIHllbGxvdyBMZWQgTW9kZQorCQlVSU5UMzIJCUdMZWRNb2RlOjI7CQkJLy8gZ3JlZW4gTGVkIE1vZGUKKwkJVUlOVDMyCQlSTGVkTW9kZToyOwkJCS8vIHJlZCBMZWQgTW9kZSAgICAwOiBvZmYxOiBibGlua2luZyB1cG9uIFRYMjogcGVyaW9kaWMgc2xvdyBibGlua2luZzM6IGFsd2F5cyBvbgorCQlVSU5UMzIJCXJzdjoyOworCQlVSU5UMzIJCVNsb3dCbGlua1BlcmlvZDo2OwkJCS8vIHNsb3cgYmxpbmtpbmcgcGVyaW9kLiB1bml0OjFtcworCQlVSU5UMzIJCU9mZlBlcmlvZDo4OwkJCS8vIGJsaW5raW5nIG9mZiBwZXJpb2QgdW5pdCAxbXMKKwkJVUlOVDMyCQlPblBlcmlvZDo4OwkJCS8vIGJsaW5raW5nIG9uIHBlcmlvZCB1bml0IDFtcworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JTEVEX0NGR19TVFJVQywgKlBMRURfQ0ZHX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX0xFRF9DRkdfU1RSVUMJeworCXN0cnVjdAl7CisJCVVJTlQzMgkJT25QZXJpb2Q6ODsJCQkvLyBibGlua2luZyBvbiBwZXJpb2QgdW5pdCAxbXMKKwkJVUlOVDMyCQlPZmZQZXJpb2Q6ODsJCQkvLyBibGlua2luZyBvZmYgcGVyaW9kIHVuaXQgMW1zCisJCVVJTlQzMgkJU2xvd0JsaW5rUGVyaW9kOjY7CQkJLy8gc2xvdyBibGlua2luZyBwZXJpb2QuIHVuaXQ6MW1zCisJCVVJTlQzMgkJcnN2OjI7CisJCVVJTlQzMgkJUkxlZE1vZGU6MjsJCQkvLyByZWQgTGVkIE1vZGUgICAgMDogb2ZmMTogYmxpbmtpbmcgdXBvbiBUWDI6IHBlcmlvZGljIHNsb3cgYmxpbmtpbmczOiBhbHdheXMgb24KKwkJVUlOVDMyCQlHTGVkTW9kZToyOwkJCS8vIGdyZWVuIExlZCBNb2RlCisJCVVJTlQzMgkJWUxlZE1vZGU6MjsJCQkvLyB5ZWxsb3cgTGVkIE1vZGUKKwkJVUlOVDMyCQlMZWRQb2xhcjoxOwkJCS8vIExlZCBQb2xhcml0eS4gIDA6IGFjdGl2ZSBsb3cxOiBhY3RpdmUgaGlnaAorCQlVSU5UMzIJCToxOworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JTEVEX0NGR19TVFJVQywgKlBMRURfQ0ZHX1NUUlVDOworI2VuZGlmCisvLworLy8gIDQuMiBNQUMgVElNSU5HICBjb25maWd1cmF0aW9uIHJlZ2lzdGVycyAob2Zmc2V0OjB4MTEwMCkKKy8vCisjZGVmaW5lIFhJRlNfVElNRV9DRkcgICAgICAgICAgICAgMHgxMTAwCQkgLy8gTUFDX0NTUjggIE1BQ19DU1I5CisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfSUZTX1NMT1RfQ0ZHX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVSU5UMzIgIHJzdjoyOworCSAgICBVSU5UMzIgIEJCUnhlbmRFbmFibGU6MTsgICAgICAgIC8vICByZWZlcmVuY2UgUlhFTkQgc2lnbmFsIHRvIGJlZ2luIFhJRlMgZGVmZXIKKwkgICAgVUlOVDMyICBFSUZTOjk7ICAgICAgICAvLyAgdW5pdCAxdXMKKwkgICAgVUlOVDMyICBPZmRtWGlmc1RpbWU6NDsgICAgICAgIC8vT0ZETSBTSUZTLiB1bml0IDF1cy4gQXBwbGllZCBhZnRlciBPRkRNIFJYIHdoZW4gTUFDIGRvZXNuJ3QgcmVmZXJlbmNlIEJCUCBzaWduYWwgQkJSWEVORAorCSAgICBVSU5UMzIgIE9mZG1TaWZzVGltZTo4OyAgICAgICAgLy8gIHVuaXQgMXVzLiBBcHBsaWVkIGFmdGVyIE9GRE0gUlgvVFgKKwkgICAgVUlOVDMyICBDY2ttU2lmc1RpbWU6ODsgICAgICAgIC8vICB1bml0IDF1cy4gQXBwbGllZCBhZnRlciBDQ0sgUlgvVFgKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CUlGU19TTE9UX0NGR19TVFJVQywgKlBJRlNfU0xPVF9DRkdfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfSUZTX1NMT1RfQ0ZHX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVSU5UMzIgIENja21TaWZzVGltZTo4OyAgICAgICAgLy8gIHVuaXQgMXVzLiBBcHBsaWVkIGFmdGVyIENDSyBSWC9UWAorCSAgICBVSU5UMzIgIE9mZG1TaWZzVGltZTo4OyAgICAgICAgLy8gIHVuaXQgMXVzLiBBcHBsaWVkIGFmdGVyIE9GRE0gUlgvVFgKKwkgICAgVUlOVDMyICBPZmRtWGlmc1RpbWU6NDsgICAgICAgIC8vT0ZETSBTSUZTLiB1bml0IDF1cy4gQXBwbGllZCBhZnRlciBPRkRNIFJYIHdoZW4gTUFDIGRvZXNuJ3QgcmVmZXJlbmNlIEJCUCBzaWduYWwgQkJSWEVORAorCSAgICBVSU5UMzIgIEVJRlM6OTsgICAgICAgIC8vICB1bml0IDF1cworCSAgICBVSU5UMzIgIEJCUnhlbmRFbmFibGU6MTsgICAgICAgIC8vICByZWZlcmVuY2UgUlhFTkQgc2lnbmFsIHRvIGJlZ2luIFhJRlMgZGVmZXIKKwkgICAgVUlOVDMyICByc3Y6MjsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CUlGU19TTE9UX0NGR19TVFJVQywgKlBJRlNfU0xPVF9DRkdfU1RSVUM7CisjZW5kaWYKKworI2RlZmluZSBCS09GRl9TTE9UX0NGRyAgICAgICAgICAgICAweDExMDQJCSAvLyAgbWFjX2NzcjkgbGFzdCA4IGJpdHMKKyNkZWZpbmUgTkFWX1RJTUVfQ0ZHICAgICAgICAgICAgIDB4MTEwOAkJIC8vIE5BViAgKE1BQ19DU1IxNSkKKyNkZWZpbmUgQ0hfVElNRV9DRkcgICAgICAgICAgICAgMHgxMTBDCQkgCS8vIENvdW50IGFzIGNoYW5uZWwgYnVzeQorI2RlZmluZSBQQkZfTElGRV9USU1FUiAgICAgICAgICAgICAweDExMTAJCSAvL1RYL1JYIE1QRFUgdGltZXN0YW1wIHRpbWVyIChmcmVlIHJ1bilVbml0OiAxdXMKKyNkZWZpbmUgQkNOX1RJTUVfQ0ZHICAgICAgICAgICAgIDB4MTExNAkJIC8vIFRYUlhfQ1NSOQorCisjZGVmaW5lIEJDTl9PRkZTRVQwCQkJCTB4MDQyQworI2RlZmluZSBCQ05fT0ZGU0VUMQkJCQkweDA0MzAKKworLy8KKy8vIEJDTl9USU1FX0NGRyA6IFN5bmNocm9uaXphdGlvbiBjb250cm9sIHJlZ2lzdGVyCisvLworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX0JDTl9USU1FX0NGR19TVFJVQwl7CisJc3RydWN0CXsKKwkJVUlOVDMyCQlUeFRpbWVzdGFtcENvbXBlbnNhdGU6ODsKKyAgICAgICAgVUlOVDMyICAgICAgIDozOworCQlVSU5UMzIJCWJCZWFjb25HZW46MTsJCS8vIEVuYWJsZSBiZWFjb24gZ2VuZXJhdG9yCisgICAgICAgIFVJTlQzMiAgICAgICBiVEJUVEVuYWJsZToxOworCQlVSU5UMzIJCVRzZlN5bmNNb2RlOjI7CQkvLyBFbmFibGUgVFNGIHN5bmMsIDAwOiBkaXNhYmxlLCAwMTogaW5mcmEgbW9kZSwgMTA6IGFkLWhvYyBtb2RlCisJCVVJTlQzMgkJYlRzZlRpY2tpbmc6MTsJCS8vIEVuYWJsZSBUU0YgYXV0byBjb3VudGluZworCQlVSU5UMzIgICAgICAgQmVhY29uSW50ZXJ2YWw6MTY7ICAvLyBpbiB1bml0IG9mIDEvMTYgVFUKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CUJDTl9USU1FX0NGR19TVFJVQywgKlBCQ05fVElNRV9DRkdfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfQkNOX1RJTUVfQ0ZHX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVSU5UMzIgICAgICAgQmVhY29uSW50ZXJ2YWw6MTY7ICAvLyBpbiB1bml0IG9mIDEvMTYgVFUKKwkJVUlOVDMyCQliVHNmVGlja2luZzoxOwkJLy8gRW5hYmxlIFRTRiBhdXRvIGNvdW50aW5nCisJCVVJTlQzMgkJVHNmU3luY01vZGU6MjsJCS8vIEVuYWJsZSBUU0Ygc3luYywgMDA6IGRpc2FibGUsIDAxOiBpbmZyYSBtb2RlLCAxMDogYWQtaG9jIG1vZGUKKyAgICAgICAgVUlOVDMyICAgICAgIGJUQlRURW5hYmxlOjE7CisJCVVJTlQzMgkJYkJlYWNvbkdlbjoxOwkJLy8gRW5hYmxlIGJlYWNvbiBnZW5lcmF0b3IKKyAgICAgICAgVUlOVDMyICAgICAgIDozOworCQlVSU5UMzIJCVR4VGltZXN0YW1wQ29tcGVuc2F0ZTo4OworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JQkNOX1RJTUVfQ0ZHX1NUUlVDLCAqUEJDTl9USU1FX0NGR19TVFJVQzsKKyNlbmRpZgorI2RlZmluZSBUQlRUX1NZTkNfQ0ZHICAgICAgICAgICAgMHgxMTE4ICAJCS8vIHR4cnhfY3NyMTAKKyNkZWZpbmUgVFNGX1RJTUVSX0RXMCAgICAgICAgICAgICAweDExMUMgIAkJLy8gTG9jYWwgVFNGIHRpbWVyIGxzYiAzMiBiaXRzLiBSZWFkLW9ubHkKKyNkZWZpbmUgVFNGX1RJTUVSX0RXMSAgICAgICAgICAgICAweDExMjAgIAkJLy8gbXNiIDMyIGJpdHMuIFJlYWQtb25seS4KKyNkZWZpbmUgVEJUVF9USU1FUiAgICAgICAgICAgICAJMHgxMTI0ICAJCS8vIFRJbWVyIHJlbWFpbnMgdGlsbCBuZXh0IFRCVFQuIFJlYWQtb25seS4gIFRYUlhfQ1NSMTQKKyNkZWZpbmUgSU5UX1RJTUVSX0NGRyAgICAgICAgICAgICAgCTB4MTEyOCAgCQkvLworI2RlZmluZSBJTlRfVElNRVJfRU4gICAgICAgICAgICAgCTB4MTEyYyAgCQkvLyAgR1AtdGltZXIgYW5kIHByZS10YnR0IEludCBlbmFibGUKKyNkZWZpbmUgQ0hfSURMRV9TVEEgICAgICAgICAgICAgIAkweDExMzAgIAkJLy8gIGNoYW5uZWwgaWRsZSB0aW1lCisjZGVmaW5lIENIX0JVU1lfU1RBICAgICAgICAgICAgICAJMHgxMTM0ICAJCS8vICBjaGFubmxlIGJ1c3kgdGltZQorLy8KKy8vICA0LjIgTUFDIFBPV0VSICBjb25maWd1cmF0aW9uIHJlZ2lzdGVycyAob2Zmc2V0OjB4MTIwMCkKKy8vCisjZGVmaW5lIE1BQ19TVEFUVVNfQ0ZHICAgICAgICAgICAgIDB4MTIwMAkJIC8vIG9sZCBNQUNfQ1NSMTIKKyNkZWZpbmUgUFdSX1BJTl9DRkcgICAgICAgICAgICAgMHgxMjA0CQkgLy8gb2xkIE1BQ19DU1IxMgorI2RlZmluZSBBVVRPX1dBS0VVUF9DRkcgICAgICAgICAgICAgMHgxMjA4CQkgLy8gb2xkIE1BQ19DU1IxMAorLy8KKy8vIEFVVE9fV0FLRVVQX0NGRzogTWFudWFsIHBvd2VyIGNvbnRyb2wgLyBzdGF0dXMgcmVnaXN0ZXIKKy8vCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfQVVUT19XQUtFVVBfU1RSVUMJeworCXN0cnVjdAl7CisJCVVJTlQzMgkJOjE2OworCQlVSU5UMzIJCUVuYWJsZUF1dG9XYWtldXA6MTsJLy8gMDpzbGVlcCwgMTphd2FrZQorCQlVSU5UMzIgICAgICAgTnVtb2ZTbGVlcGluZ1RidHQ6NzsgICAgICAgICAgLy8gRm9yY2VXYWtlIGhhcyBoaWdoIHByaXZpbGVnZSB0aGFuIFB1dFRvU2xlZXAgd2hlbiBib3RoIHNldAorCQlVSU5UMzIgICAgICAgQXV0b0xlYWRUaW1lOjg7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlBVVRPX1dBS0VVUF9TVFJVQywgKlBBVVRPX1dBS0VVUF9TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9BVVRPX1dBS0VVUF9TVFJVQwl7CisJc3RydWN0CXsKKwkJVUlOVDMyICAgICAgIEF1dG9MZWFkVGltZTo4OworCQlVSU5UMzIgICAgICAgTnVtb2ZTbGVlcGluZ1RidHQ6NzsgICAgICAgICAgLy8gRm9yY2VXYWtlIGhhcyBoaWdoIHByaXZpbGVnZSB0aGFuIFB1dFRvU2xlZXAgd2hlbiBib3RoIHNldAorCQlVSU5UMzIJCUVuYWJsZUF1dG9XYWtldXA6MTsJLy8gMDpzbGVlcCwgMTphd2FrZQorCQlVSU5UMzIJCToxNjsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CUFVVE9fV0FLRVVQX1NUUlVDLCAqUEFVVE9fV0FLRVVQX1NUUlVDOworI2VuZGlmCisvLworLy8gIDQuMyBNQUMgVFggIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzIChvZmZzZXQ6MHgxMzAwKQorLy8KKworI2RlZmluZSBFRENBX0FDMF9DRkcJMHgxMzAwCQkvL0FDX1RYT1BfQ1NSMCAweDM0NzQKKyNkZWZpbmUgRURDQV9BQzFfQ0ZHCTB4MTMwNAorI2RlZmluZSBFRENBX0FDMl9DRkcJMHgxMzA4CisjZGVmaW5lIEVEQ0FfQUMzX0NGRwkweDEzMGMKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9FRENBX0FDX0NGR19TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVUlOVDMyICA6MTI7ICAgICAgICAvLworCSAgICBVSU5UMzIgIEN3bWF4OjQ7ICAgICAgICAvL3VuaXQgcG93ZXIgb2YgMgorCSAgICBVSU5UMzIgIEN3bWluOjQ7ICAgICAgICAvLworCSAgICBVSU5UMzIgIEFpZnNuOjQ7ICAgICAgICAvLyAjIG9mIHNsb3QgdGltZQorCSAgICBVSU5UMzIgIEFjVHhvcDo4OyAgICAgICAgLy8gIGluIHVuaXQgb2YgMzJ1cworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JRURDQV9BQ19DRkdfU1RSVUMsICpQRURDQV9BQ19DRkdfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfRURDQV9BQ19DRkdfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVJTlQzMiAgQWNUeG9wOjg7ICAgICAgICAvLyAgaW4gdW5pdCBvZiAzMnVzCisJICAgIFVJTlQzMiAgQWlmc246NDsgICAgICAgIC8vICMgb2Ygc2xvdCB0aW1lCisJICAgIFVJTlQzMiAgQ3dtaW46NDsgICAgICAgIC8vCisJICAgIFVJTlQzMiAgQ3dtYXg6NDsgICAgICAgIC8vdW5pdCBwb3dlciBvZiAyCisJICAgIFVJTlQzMiAgOjEyOyAgICAgICAvLworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JRURDQV9BQ19DRkdfU1RSVUMsICpQRURDQV9BQ19DRkdfU1RSVUM7CisjZW5kaWYKKworI2RlZmluZSBFRENBX1RJRF9BQ19NQVAJMHgxMzEwCisjZGVmaW5lIFRYX1BXUl9DRkdfMAkweDEzMTQKKyNkZWZpbmUgVFhfUFdSX0NGR18xCTB4MTMxOAorI2RlZmluZSBUWF9QV1JfQ0ZHXzIJMHgxMzFDCisjZGVmaW5lIFRYX1BXUl9DRkdfMwkweDEzMjAKKyNkZWZpbmUgVFhfUFdSX0NGR180CTB4MTMyNAorI2RlZmluZSBUWF9QSU5fQ0ZHCQkweDEzMjgKKyNkZWZpbmUgVFhfQkFORF9DRkcJMHgxMzJjCQkvLyAweDEgdXNlIHVwcGVyIDIwTUh6LiAwIGp1c2UgbG93ZXIgMjBNSHoKKyNkZWZpbmUgVFhfU1dfQ0ZHMAkJMHgxMzMwCisjZGVmaW5lIFRYX1NXX0NGRzEJCTB4MTMzNAorI2RlZmluZSBUWF9TV19DRkcyCQkweDEzMzgKKyNkZWZpbmUgVFhPUF9USFJFU19DRkcJCTB4MTMzYworI2RlZmluZSBUWE9QX0NUUkxfQ0ZHCQkweDEzNDAKKyNkZWZpbmUgVFhfUlRTX0NGRwkJMHgxMzQ0CisKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9UWF9SVFNfQ0ZHX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVSU5UMzIgICAgICAgcnN2Ojc7CisJICAgIFVJTlQzMiAgICAgICBSdHNGYmtFbjoxOyAgICAvLyBlbmFibGUgcnRzIHJhdGUgZmFsbGJhY2sKKwkgICAgVUlOVDMyICAgICAgIFJ0c1RocmVzOjE2OyAgICAvLyB1bml0OmJ5dGUKKwkgICAgVUlOVDMyICAgICAgIEF1dG9SdHNSZXRyeUxpbWl0Ojg7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlUWF9SVFNfQ0ZHX1NUUlVDLCAqUFRYX1JUU19DRkdfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfVFhfUlRTX0NGR19TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVUlOVDMyICAgICAgIEF1dG9SdHNSZXRyeUxpbWl0Ojg7CisJICAgIFVJTlQzMiAgICAgICBSdHNUaHJlczoxNjsgICAgLy8gdW5pdDpieXRlCisJICAgIFVJTlQzMiAgICAgICBSdHNGYmtFbjoxOyAgICAvLyBlbmFibGUgcnRzIHJhdGUgZmFsbGJhY2sKKwkgICAgVUlOVDMyICAgICAgIHJzdjo3OyAgICAgLy8gMTogSFQgbm9uLVNUQkMgY29udHJvbCBmcmFtZSBlbmFibGUKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVRYX1JUU19DRkdfU1RSVUMsICpQVFhfUlRTX0NGR19TVFJVQzsKKyNlbmRpZgorI2RlZmluZSBUWF9USU1FT1VUX0NGRwkweDEzNDgKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9UWF9USU1FT1VUX0NGR19TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVUlOVDMyICAgICAgIHJzdjI6ODsKKwkgICAgVUlOVDMyICAgICAgIFR4b3BUaW1lb3V0Ojg7CS8vVFhPUCB0aW1lb3V0IHZhbHVlIGZvciBUWE9QIHRydW5jYXRpb24uICBJdCBpcyByZWNvbW1lbmRlZCB0aGF0IChTTE9UX1RJTUUpID4gKFRYX09QX1RJTUVPVVQpID4gKFJYX0FDS19USU1FT1VUKQorCSAgICBVSU5UMzIgICAgICAgUnhBY2tUaW1lb3V0Ojg7CS8vIHVuaXQ6c2xvdC4gVXNlZCBmb3IgVFggcHJlY2VkdXJlCisJICAgIFVJTlQzMiAgICAgICBNcGR1TGlmZVRpbWU6NDsgICAgLy8gIGV4cGlyYXRpb24gdGltZSA9IDJeKDkrTVBEVSBMSUZFIFRJTUUpICB1cworCSAgICBVSU5UMzIgICAgICAgcnN2OjQ7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlUWF9USU1FT1VUX0NGR19TVFJVQywgKlBUWF9USU1FT1VUX0NGR19TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9UWF9USU1FT1VUX0NGR19TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVUlOVDMyICAgICAgIHJzdjo0OworCSAgICBVSU5UMzIgICAgICAgTXBkdUxpZmVUaW1lOjQ7ICAgIC8vICBleHBpcmF0aW9uIHRpbWUgPSAyXig5K01QRFUgTElGRSBUSU1FKSAgdXMKKwkgICAgVUlOVDMyICAgICAgIFJ4QWNrVGltZW91dDo4OwkvLyB1bml0OnNsb3QuIFVzZWQgZm9yIFRYIHByZWNlZHVyZQorCSAgICBVSU5UMzIgICAgICAgVHhvcFRpbWVvdXQ6ODsJLy9UWE9QIHRpbWVvdXQgdmFsdWUgZm9yIFRYT1AgdHJ1bmNhdGlvbi4gIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgKFNMT1RfVElNRSkgPiAoVFhfT1BfVElNRU9VVCkgPiAoUlhfQUNLX1RJTUVPVVQpCisJICAgIFVJTlQzMiAgICAgICByc3YyOjg7ICAgICAvLyAxOiBIVCBub24tU1RCQyBjb250cm9sIGZyYW1lIGVuYWJsZQorCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JVFhfVElNRU9VVF9DRkdfU1RSVUMsICpQVFhfVElNRU9VVF9DRkdfU1RSVUM7CisjZW5kaWYKKyNkZWZpbmUgVFhfUlRZX0NGRwkweDEzNGMKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uIFBBQ0tFRCBfVFhfUlRZX0NGR19TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVUlOVDMyICAgICAgIHJzdjoxOworCSAgICBVSU5UMzIgICAgICAgVHhhdXRvRkJFbmFibGU6MTsgICAgLy8gVHggcmV0cnkgUEhZIHJhdGUgYXV0byBmYWxsYmFjayBlbmFibGUKKwkgICAgVUlOVDMyICAgICAgIEFnZ1J0eU1vZGU6MTsJLy8gQWdncmVnYXRlIE1QRFUgcmV0cnkgbW9kZS4gIDA6ZXhwaXJlZCBieSByZXRyeSBsaW1pdCwgMTogZXhwaXJlZCBieSBtcGR1IGxpZmUgdGltZXIKKwkgICAgVUlOVDMyICAgICAgIE5vbkFnZ1J0eU1vZGU6MTsJLy8gTm9uLUFnZ3JlZ2F0ZSBNUERVIHJldHJ5IG1vZGUuICAwOmV4cGlyZWQgYnkgcmV0cnkgbGltaXQsIDE6IGV4cGlyZWQgYnkgbXBkdSBsaWZlIHRpbWVyCisJICAgIFVJTlQzMiAgICAgICBMb25nUnR5VGhyZToxMjsJLy8gTG9uZyByZXRyeSB0aHJlc2hvb2xkCisJICAgIFVJTlQzMiAgICAgICBMb25nUnR5TGltaXQ6ODsJLy9sb25nIHJldHJ5IGxpbWl0CisJICAgIFVJTlQzMiAgICAgICBTaG9ydFJ0eUxpbWl0Ojg7CS8vICBzaG9ydCByZXRyeSBsaW1pdAorCisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlUWF9SVFlfQ0ZHX1NUUlVDLCAqUFRYX1JUWV9DRkdfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbiBQQUNLRUQgX1RYX1JUWV9DRkdfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVJTlQzMiAgICAgICBTaG9ydFJ0eUxpbWl0Ojg7CS8vICBzaG9ydCByZXRyeSBsaW1pdAorCSAgICBVSU5UMzIgICAgICAgTG9uZ1J0eUxpbWl0Ojg7CS8vbG9uZyByZXRyeSBsaW1pdAorCSAgICBVSU5UMzIgICAgICAgTG9uZ1J0eVRocmU6MTI7CS8vIExvbmcgcmV0cnkgdGhyZXNob29sZAorCSAgICBVSU5UMzIgICAgICAgTm9uQWdnUnR5TW9kZToxOwkvLyBOb24tQWdncmVnYXRlIE1QRFUgcmV0cnkgbW9kZS4gIDA6ZXhwaXJlZCBieSByZXRyeSBsaW1pdCwgMTogZXhwaXJlZCBieSBtcGR1IGxpZmUgdGltZXIKKwkgICAgVUlOVDMyICAgICAgIEFnZ1J0eU1vZGU6MTsJLy8gQWdncmVnYXRlIE1QRFUgcmV0cnkgbW9kZS4gIDA6ZXhwaXJlZCBieSByZXRyeSBsaW1pdCwgMTogZXhwaXJlZCBieSBtcGR1IGxpZmUgdGltZXIKKwkgICAgVUlOVDMyICAgICAgIFR4YXV0b0ZCRW5hYmxlOjE7ICAgIC8vIFR4IHJldHJ5IFBIWSByYXRlIGF1dG8gZmFsbGJhY2sgZW5hYmxlCisJICAgIFVJTlQzMiAgICAgICByc3Y6MTsgICAgIC8vIDE6IEhUIG5vbi1TVEJDIGNvbnRyb2wgZnJhbWUgZW5hYmxlCisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlUWF9SVFlfQ0ZHX1NUUlVDLCAqUFRYX1JUWV9DRkdfU1RSVUM7CisjZW5kaWYKKyNkZWZpbmUgVFhfTElOS19DRkcJMHgxMzUwCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglQQUNLRUQgX1RYX0xJTktfQ0ZHX1NUUlVDCXsKKwlzdHJ1Y3QgUEFDS0VEIHsKKwkgICAgVUlOVDMyICAgICAgIFJlbW90TUZTOjg7CS8vcmVtb3RlIE1DUyBmZWVkYmFjayBzZXF1ZW5jZSBudW1iZXIKKwkgICAgVUlOVDMyICAgICAgIFJlbW90TUZCOjg7ICAgIC8vICByZW1vdGUgTUNTIGZlZWRiYWNrCisJICAgIFVJTlQzMiAgICAgICByc3Y6MzsJLy8KKwkgICAgVUlOVDMyICAgICAgIFR4Q0ZBY2tFbjoxOwkvLyAgIFBpZ2d5YmFjayBDRi1BQ0sgZW5hYmxlCisJICAgIFVJTlQzMiAgICAgICBUeFJER0VuOjE7CS8vIFJERyBUWCBlbmFibGUKKwkgICAgVUlOVDMyICAgICAgIFR4TVJRRW46MTsJLy8gIE1DUyByZXF1ZXN0IFRYIGVuYWJsZQorCSAgICBVSU5UMzIgICAgICAgUmVtb3RlVU1GU0VuYWJsZToxOwkvLyAgcmVtb3RlIHVuc29saWNpdCAgTUZCIGVuYWJsZS4gIDA6IG5vdCBhcHBseSByZW1vdGUgcmVtb3RlIHVuc29saWNpdCAoTUZTPTcpCisJICAgIFVJTlQzMiAgICAgICBNRkJFbmFibGU6MTsJLy8gIFRYIGFwcGx5IHJlbW90ZSBNRkIgMTplbmFibGUKKwkgICAgVUlOVDMyICAgICAgIFJlbW90ZU1GQkxpZmVUaW1lOjg7CS8vcmVtb3RlIE1GQiBsaWZlIHRpbWUuIHVuaXQgOiAzMnVzCisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlUWF9MSU5LX0NGR19TVFJVQywgKlBUWF9MSU5LX0NGR19TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCVBBQ0tFRCBfVFhfTElOS19DRkdfU1RSVUMJeworCXN0cnVjdCBQQUNLRUQgeworCSAgICBVSU5UMzIgICAgICAgUmVtb3RlTUZCTGlmZVRpbWU6ODsJLy9yZW1vdGUgTUZCIGxpZmUgdGltZS4gdW5pdCA6IDMydXMKKwkgICAgVUlOVDMyICAgICAgIE1GQkVuYWJsZToxOwkvLyAgVFggYXBwbHkgcmVtb3RlIE1GQiAxOmVuYWJsZQorCSAgICBVSU5UMzIgICAgICAgUmVtb3RlVU1GU0VuYWJsZToxOwkvLyAgcmVtb3RlIHVuc29saWNpdCAgTUZCIGVuYWJsZS4gIDA6IG5vdCBhcHBseSByZW1vdGUgcmVtb3RlIHVuc29saWNpdCAoTUZTPTcpCisJICAgIFVJTlQzMiAgICAgICBUeE1SUUVuOjE7CS8vICBNQ1MgcmVxdWVzdCBUWCBlbmFibGUKKwkgICAgVUlOVDMyICAgICAgIFR4UkRHRW46MTsJLy8gUkRHIFRYIGVuYWJsZQorCSAgICBVSU5UMzIgICAgICAgVHhDRkFja0VuOjE7CS8vICAgUGlnZ3liYWNrIENGLUFDSyBlbmFibGUKKwkgICAgVUlOVDMyICAgICAgIHJzdjozOwkvLworCSAgICBVSU5UMzIgICAgICAgUmVtb3RNRkI6ODsgICAgLy8gIHJlbW90ZSBNQ1MgZmVlZGJhY2sKKwkgICAgVUlOVDMyICAgICAgIFJlbW90TUZTOjg7CS8vcmVtb3RlIE1DUyBmZWVkYmFjayBzZXF1ZW5jZSBudW1iZXIKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVRYX0xJTktfQ0ZHX1NUUlVDLCAqUFRYX0xJTktfQ0ZHX1NUUlVDOworI2VuZGlmCisjZGVmaW5lIEhUX0ZCS19DRkcwCTB4MTM1NAorI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24gUEFDS0VEIF9IVF9GQktfQ0ZHMF9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVUlOVDMyICAgICAgIEhUTUNTN0ZCSzo0OworCSAgICBVSU5UMzIgICAgICAgSFRNQ1M2RkJLOjQ7CisJICAgIFVJTlQzMiAgICAgICBIVE1DUzVGQks6NDsKKwkgICAgVUlOVDMyICAgICAgIEhUTUNTNEZCSzo0OworCSAgICBVSU5UMzIgICAgICAgSFRNQ1MzRkJLOjQ7CisJICAgIFVJTlQzMiAgICAgICBIVE1DUzJGQks6NDsKKwkgICAgVUlOVDMyICAgICAgIEhUTUNTMUZCSzo0OworCSAgICBVSU5UMzIgICAgICAgSFRNQ1MwRkJLOjQ7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlIVF9GQktfQ0ZHMF9TVFJVQywgKlBIVF9GQktfQ0ZHMF9TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uIFBBQ0tFRCBfSFRfRkJLX0NGRzBfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVJTlQzMiAgICAgICBIVE1DUzBGQks6NDsKKwkgICAgVUlOVDMyICAgICAgIEhUTUNTMUZCSzo0OworCSAgICBVSU5UMzIgICAgICAgSFRNQ1MyRkJLOjQ7CisJICAgIFVJTlQzMiAgICAgICBIVE1DUzNGQks6NDsKKwkgICAgVUlOVDMyICAgICAgIEhUTUNTNEZCSzo0OworCSAgICBVSU5UMzIgICAgICAgSFRNQ1M1RkJLOjQ7CisJICAgIFVJTlQzMiAgICAgICBIVE1DUzZGQks6NDsKKwkgICAgVUlOVDMyICAgICAgIEhUTUNTN0ZCSzo0OworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JSFRfRkJLX0NGRzBfU1RSVUMsICpQSFRfRkJLX0NGRzBfU1RSVUM7CisjZW5kaWYKKyNkZWZpbmUgSFRfRkJLX0NGRzEJMHgxMzU4CisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfSFRfRkJLX0NGRzFfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVJTlQzMiAgICAgICBIVE1DUzE1RkJLOjQ7CisJICAgIFVJTlQzMiAgICAgICBIVE1DUzE0RkJLOjQ7CisJICAgIFVJTlQzMiAgICAgICBIVE1DUzEzRkJLOjQ7CisJICAgIFVJTlQzMiAgICAgICBIVE1DUzEyRkJLOjQ7CisJICAgIFVJTlQzMiAgICAgICBIVE1DUzExRkJLOjQ7CisJICAgIFVJTlQzMiAgICAgICBIVE1DUzEwRkJLOjQ7CisJICAgIFVJTlQzMiAgICAgICBIVE1DUzlGQks6NDsKKwkgICAgVUlOVDMyICAgICAgIEhUTUNTOEZCSzo0OworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JSFRfRkJLX0NGRzFfU1RSVUMsICpQSFRfRkJLX0NGRzFfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfSFRfRkJLX0NGRzFfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVJTlQzMiAgICAgICBIVE1DUzhGQks6NDsKKwkgICAgVUlOVDMyICAgICAgIEhUTUNTOUZCSzo0OworCSAgICBVSU5UMzIgICAgICAgSFRNQ1MxMEZCSzo0OworCSAgICBVSU5UMzIgICAgICAgSFRNQ1MxMUZCSzo0OworCSAgICBVSU5UMzIgICAgICAgSFRNQ1MxMkZCSzo0OworCSAgICBVSU5UMzIgICAgICAgSFRNQ1MxM0ZCSzo0OworCSAgICBVSU5UMzIgICAgICAgSFRNQ1MxNEZCSzo0OworCSAgICBVSU5UMzIgICAgICAgSFRNQ1MxNUZCSzo0OworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JSFRfRkJLX0NGRzFfU1RSVUMsICpQSFRfRkJLX0NGRzFfU1RSVUM7CisjZW5kaWYKKyNkZWZpbmUgTEdfRkJLX0NGRzAJMHgxMzVjCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfTEdfRkJLX0NGRzBfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVJTlQzMiAgICAgICBPRkRNTUNTN0ZCSzo0OwkvL2luaXRpYWwgdmFsdWUgaXMgNgorCSAgICBVSU5UMzIgICAgICAgT0ZETU1DUzZGQks6NDsJLy9pbml0aWFsIHZhbHVlIGlzIDUKKwkgICAgVUlOVDMyICAgICAgIE9GRE1NQ1M1RkJLOjQ7CS8vaW5pdGlhbCB2YWx1ZSBpcyA0CisJICAgIFVJTlQzMiAgICAgICBPRkRNTUNTNEZCSzo0OwkvL2luaXRpYWwgdmFsdWUgaXMgMworCSAgICBVSU5UMzIgICAgICAgT0ZETU1DUzNGQks6NDsJLy9pbml0aWFsIHZhbHVlIGlzIDIKKwkgICAgVUlOVDMyICAgICAgIE9GRE1NQ1MyRkJLOjQ7CS8vaW5pdGlhbCB2YWx1ZSBpcyAxCisJICAgIFVJTlQzMiAgICAgICBPRkRNTUNTMUZCSzo0OwkvL2luaXRpYWwgdmFsdWUgaXMgMAorCSAgICBVSU5UMzIgICAgICAgT0ZETU1DUzBGQks6NDsJLy9pbml0aWFsIHZhbHVlIGlzIDAKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CUxHX0ZCS19DRkcwX1NUUlVDLCAqUExHX0ZCS19DRkcwX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX0xHX0ZCS19DRkcwX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVSU5UMzIgICAgICAgT0ZETU1DUzBGQks6NDsJLy9pbml0aWFsIHZhbHVlIGlzIDAKKwkgICAgVUlOVDMyICAgICAgIE9GRE1NQ1MxRkJLOjQ7CS8vaW5pdGlhbCB2YWx1ZSBpcyAwCisJICAgIFVJTlQzMiAgICAgICBPRkRNTUNTMkZCSzo0OwkvL2luaXRpYWwgdmFsdWUgaXMgMQorCSAgICBVSU5UMzIgICAgICAgT0ZETU1DUzNGQks6NDsJLy9pbml0aWFsIHZhbHVlIGlzIDIKKwkgICAgVUlOVDMyICAgICAgIE9GRE1NQ1M0RkJLOjQ7CS8vaW5pdGlhbCB2YWx1ZSBpcyAzCisJICAgIFVJTlQzMiAgICAgICBPRkRNTUNTNUZCSzo0OwkvL2luaXRpYWwgdmFsdWUgaXMgNAorCSAgICBVSU5UMzIgICAgICAgT0ZETU1DUzZGQks6NDsJLy9pbml0aWFsIHZhbHVlIGlzIDUKKwkgICAgVUlOVDMyICAgICAgIE9GRE1NQ1M3RkJLOjQ7CS8vaW5pdGlhbCB2YWx1ZSBpcyA2CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlMR19GQktfQ0ZHMF9TVFJVQywgKlBMR19GQktfQ0ZHMF9TVFJVQzsKKyNlbmRpZgorI2RlZmluZSBMR19GQktfQ0ZHMQkJMHgxMzYwCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfTEdfRkJLX0NGRzFfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVJTlQzMiAgICAgICByc3Y6MTY7CisJICAgIFVJTlQzMiAgICAgICBDQ0tNQ1MzRkJLOjQ7CS8vaW5pdGlhbCB2YWx1ZSBpcyAyCisJICAgIFVJTlQzMiAgICAgICBDQ0tNQ1MyRkJLOjQ7CS8vaW5pdGlhbCB2YWx1ZSBpcyAxCisJICAgIFVJTlQzMiAgICAgICBDQ0tNQ1MxRkJLOjQ7CS8vaW5pdGlhbCB2YWx1ZSBpcyAwCisJICAgIFVJTlQzMiAgICAgICBDQ0tNQ1MwRkJLOjQ7CS8vaW5pdGlhbCB2YWx1ZSBpcyAwCisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlMR19GQktfQ0ZHMV9TVFJVQywgKlBMR19GQktfQ0ZHMV9TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9MR19GQktfQ0ZHMV9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVUlOVDMyICAgICAgIENDS01DUzBGQks6NDsJLy9pbml0aWFsIHZhbHVlIGlzIDAKKwkgICAgVUlOVDMyICAgICAgIENDS01DUzFGQks6NDsJLy9pbml0aWFsIHZhbHVlIGlzIDAKKwkgICAgVUlOVDMyICAgICAgIENDS01DUzJGQks6NDsJLy9pbml0aWFsIHZhbHVlIGlzIDEKKwkgICAgVUlOVDMyICAgICAgIENDS01DUzNGQks6NDsJLy9pbml0aWFsIHZhbHVlIGlzIDIKKwkgICAgVUlOVDMyICAgICAgIHJzdjoxNjsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CUxHX0ZCS19DRkcxX1NUUlVDLCAqUExHX0ZCS19DRkcxX1NUUlVDOworI2VuZGlmCisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy89PT09PT09PT09PT09PT09IFByb3RlY3Rpb24gUGFyYW1hdGVyPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorI2RlZmluZSBDQ0tfUFJPVF9DRkcJMHgxMzY0CQkvL0NDSyBQcm90ZWN0aW9uCisjZGVmaW5lIEFTSUNfU0hPUlROQVYJCTEKKyNkZWZpbmUgQVNJQ19MT05HTkFWCQkyCisjZGVmaW5lIEFTSUNfUlRTCQkxCisjZGVmaW5lIEFTSUNfQ1RTCQkyCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfUFJPVF9DRkdfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVJTlQzMiAgICAgICByc3Y6NTsKKwkgICAgVUlOVDMyICAgICAgIFJUU1RoRW46MTsJLy9SVFMgdGhyZXNob2xkIGVuYWJsZSBvbiBDQ0sgVFgKKwkgICAgVUlOVDMyICAgICAgIFR4b3BBbGxvd0dGNDA6MTsJLy9DQ0sgVFhPUCBhbGxvd2FuY2UuMDpkaXNhbGxvdy4KKwkgICAgVUlOVDMyICAgICAgIFR4b3BBbGxvd0dGMjA6MTsJLy9DQ0sgVFhPUCBhbGxvd2FuY2UuMDpkaXNhbGxvdy4KKwkgICAgVUlOVDMyICAgICAgIFR4b3BBbGxvd01NNDA6MTsJLy9DQ0sgVFhPUCBhbGxvd2FuY2UuMDpkaXNhbGxvdy4KKwkgICAgVUlOVDMyICAgICAgIFR4b3BBbGxvd01NMjA6MTsJLy9DQ0sgVFhPUCBhbGxvd2FuY2UuIDA6ZGlzYWxsb3cuCisJICAgIFVJTlQzMiAgICAgICBUeG9wQWxsb3dPZmRtOjE7CS8vQ0NLIFRYT1AgYWxsb3dhbmNlLjA6ZGlzYWxsb3cuCisJICAgIFVJTlQzMiAgICAgICBUeG9wQWxsb3dDY2s6MTsJLy9DQ0sgVFhPUCBhbGxvd2FuY2UuMDpkaXNhbGxvdy4KKwkgICAgVUlOVDMyICAgICAgIFByb3RlY3ROYXY6MjsJLy9UWE9QIHByb3RlY3Rpb24gdHlwZSBmb3IgQ0NLIFRYLiAwOk5vbmUsIDE6U2hvcnROQVZwcm90ZWN0LCAgMjpMb25nTkFWUHJvdGVjdCwgMzpyc3YKKwkgICAgVUlOVDMyICAgICAgIFByb3RlY3RDdHJsOjI7CS8vUHJvdGVjdGlvbiBjb250cm9sIGZyYW1lIHR5cGUgZm9yIENDSyBUWC4gMTpSVFMvQ1RTLCAyOkNUUy10by1zZWxmLCAwOk5vbmUsIDM6cnN2CisJICAgIFVJTlQzMiAgICAgICBQcm90ZWN0UmF0ZToxNjsJLy9Qcm90ZWN0aW9uIGNvbnRyb2wgZnJhbWUgcmF0ZSBmb3IgQ0NLIFRYKFJUUy9DVFMvQ0ZFbmQpLgorCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JUFJPVF9DRkdfU1RSVUMsICpQUFJPVF9DRkdfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfUFJPVF9DRkdfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVJTlQzMiAgICAgICBQcm90ZWN0UmF0ZToxNjsJLy9Qcm90ZWN0aW9uIGNvbnRyb2wgZnJhbWUgcmF0ZSBmb3IgQ0NLIFRYKFJUUy9DVFMvQ0ZFbmQpLgorCSAgICBVSU5UMzIgICAgICAgUHJvdGVjdEN0cmw6MjsJLy9Qcm90ZWN0aW9uIGNvbnRyb2wgZnJhbWUgdHlwZSBmb3IgQ0NLIFRYLiAxOlJUUy9DVFMsIDI6Q1RTLXRvLXNlbGYsIDA6Tm9uZSwgMzpyc3YKKwkgICAgVUlOVDMyICAgICAgIFByb3RlY3ROYXY6MjsJLy9UWE9QIHByb3RlY3Rpb24gdHlwZSBmb3IgQ0NLIFRYLiAwOk5vbmUsIDE6U2hvcnROQVZwcm90ZWN0LCAgMjpMb25nTkFWUHJvdGVjdCwgMzpyc3YKKwkgICAgVUlOVDMyICAgICAgIFR4b3BBbGxvd0NjazoxOwkvL0NDSyBUWE9QIGFsbG93YW5jZS4wOmRpc2FsbG93LgorCSAgICBVSU5UMzIgICAgICAgVHhvcEFsbG93T2ZkbToxOwkvL0NDSyBUWE9QIGFsbG93YW5jZS4wOmRpc2FsbG93LgorCSAgICBVSU5UMzIgICAgICAgVHhvcEFsbG93TU0yMDoxOwkvL0NDSyBUWE9QIGFsbG93YW5jZS4gMDpkaXNhbGxvdy4KKwkgICAgVUlOVDMyICAgICAgIFR4b3BBbGxvd01NNDA6MTsJLy9DQ0sgVFhPUCBhbGxvd2FuY2UuMDpkaXNhbGxvdy4KKwkgICAgVUlOVDMyICAgICAgIFR4b3BBbGxvd0dGMjA6MTsJLy9DQ0sgVFhPUCBhbGxvd2FuY2UuMDpkaXNhbGxvdy4KKwkgICAgVUlOVDMyICAgICAgIFR4b3BBbGxvd0dGNDA6MTsJLy9DQ0sgVFhPUCBhbGxvd2FuY2UuMDpkaXNhbGxvdy4KKwkgICAgVUlOVDMyICAgICAgIFJUU1RoRW46MTsJLy9SVFMgdGhyZXNob2xkIGVuYWJsZSBvbiBDQ0sgVFgKKwkgICAgVUlOVDMyICAgICAgIHJzdjo1OworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JUFJPVF9DRkdfU1RSVUMsICpQUFJPVF9DRkdfU1RSVUM7CisjZW5kaWYKKworI2RlZmluZSBPRkRNX1BST1RfQ0ZHCTB4MTM2OAkJLy9PRkRNIFByb3RlY3Rpb24KKyNkZWZpbmUgTU0yMF9QUk9UX0NGRwkweDEzNkMJCS8vTU0yMCBQcm90ZWN0aW9uCisjZGVmaW5lIE1NNDBfUFJPVF9DRkcJMHgxMzcwCQkvL01NNDAgUHJvdGVjdGlvbgorI2RlZmluZSBHRjIwX1BST1RfQ0ZHCTB4MTM3NAkJLy9HRjIwIFByb3RlY3Rpb24KKyNkZWZpbmUgR0Y0MF9QUk9UX0NGRwkweDEzNzgJCS8vR1I0MCBQcm90ZWN0aW9uCisjZGVmaW5lIEVYUF9DVFNfVElNRQkweDEzN0MJCS8vCisjZGVmaW5lIEVYUF9BQ0tfVElNRQkweDEzODAJCS8vCisKKy8vCisvLyAgNC40IE1BQyBSWCBjb25maWd1cmF0aW9uIHJlZ2lzdGVycyAob2Zmc2V0OjB4MTQwMCkKKy8vCisjZGVmaW5lIFJYX0ZJTFRSX0NGRwkweDE0MDAJCQkvL1RYUlhfQ1NSMAorI2RlZmluZSBBVVRPX1JTUF9DRkcJMHgxNDA0CQkJLy9UWFJYX0NTUjQKKy8vCisvLyBUWFJYX0NTUjQ6IEF1dG8tUmVzcG9uZGVyLworLy8KKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmIHVuaW9uIF9BVVRPX1JTUF9DRkdfU1RSVUMgeworIHN0cnVjdCB7CisgICAgIFVJTlQzMiAgICAgICAgOjI0OworICAgICBVSU5UMzIgICAgICAgQWNrQ3RzUHNtQml0OjE7ICAgLy8gUG93ZXIgYml0IHZhbHVlIGluIGNvbnJ0cm9sIGZyYW1lCisgICAgIFVJTlQzMiAgICAgICBEdWFsQ1RTRW46MTsgICAvLyBQb3dlciBiaXQgdmFsdWUgaW4gY29ucnRyb2wgZnJhbWUKKyAgICAgVUlOVDMyICAgICAgIHJzdjoxOyAgIC8vIFBvd2VyIGJpdCB2YWx1ZSBpbiBjb25ydHJvbCBmcmFtZQorICAgICBVSU5UMzIgICAgICAgQXV0b1Jlc3BvbmRlclByZWFtYmxlOjE7ICAgIC8vIDA6bG9uZywgMTpzaG9ydCBwcmVhbWJsZQorICAgICBVSU5UMzIgICAgICAgQ1RTNDBNUmVmOjE7ICAvLyBSZXNwb25zZSBDVFMgNDBNSHogZHVwbGljYXRlIG1vZGUKKyAgICAgVUlOVDMyICAgICAgIENUUzQwTU1vZGU6MTsgIC8vIFJlc3BvbnNlIENUUyA0ME1IeiBkdXBsaWNhdGUgbW9kZQorICAgICBVSU5UMzIgICAgICAgQkFDQWNrUG9saWN5RW5hYmxlOjE7ICAgIC8vIDA6bG9uZywgMTpzaG9ydCBwcmVhbWJsZQorICAgICBVSU5UMzIgICAgICAgQXV0b1Jlc3BvbmRlckVuYWJsZToxOworIH0gZmllbGQ7CisgVUlOVDMyICAgd29yZDsKK30gQVVUT19SU1BfQ0ZHX1NUUlVDLCAqUEFVVE9fUlNQX0NGR19TVFJVQzsKKyNlbHNlCit0eXBlZGVmIHVuaW9uIF9BVVRPX1JTUF9DRkdfU1RSVUMgeworIHN0cnVjdCB7CisgICAgIFVJTlQzMiAgICAgICBBdXRvUmVzcG9uZGVyRW5hYmxlOjE7CisgICAgIFVJTlQzMiAgICAgICBCQUNBY2tQb2xpY3lFbmFibGU6MTsgICAgLy8gMDpsb25nLCAxOnNob3J0IHByZWFtYmxlCisgICAgIFVJTlQzMiAgICAgICBDVFM0ME1Nb2RlOjE7ICAvLyBSZXNwb25zZSBDVFMgNDBNSHogZHVwbGljYXRlIG1vZGUKKyAgICAgVUlOVDMyICAgICAgIENUUzQwTVJlZjoxOyAgLy8gUmVzcG9uc2UgQ1RTIDQwTUh6IGR1cGxpY2F0ZSBtb2RlCisgICAgIFVJTlQzMiAgICAgICBBdXRvUmVzcG9uZGVyUHJlYW1ibGU6MTsgICAgLy8gMDpsb25nLCAxOnNob3J0IHByZWFtYmxlCisgICAgIFVJTlQzMiAgICAgICByc3Y6MTsgICAvLyBQb3dlciBiaXQgdmFsdWUgaW4gY29ucnRyb2wgZnJhbWUKKyAgICAgVUlOVDMyICAgICAgIER1YWxDVFNFbjoxOyAgIC8vIFBvd2VyIGJpdCB2YWx1ZSBpbiBjb25ydHJvbCBmcmFtZQorICAgICBVSU5UMzIgICAgICAgQWNrQ3RzUHNtQml0OjE7ICAgLy8gUG93ZXIgYml0IHZhbHVlIGluIGNvbnJ0cm9sIGZyYW1lCisgICAgIFVJTlQzMiAgICAgICAgOjI0OworIH0gZmllbGQ7CisgVUlOVDMyICAgd29yZDsKK30gQVVUT19SU1BfQ0ZHX1NUUlVDLCAqUEFVVE9fUlNQX0NGR19TVFJVQzsKKyNlbmRpZgorCisjZGVmaW5lIExFR0FDWV9CQVNJQ19SQVRFCTB4MTQwOAkvLyAgVFhSWF9DU1I1ICAgICAgICAgICAweDMwNTQKKyNkZWZpbmUgSFRfQkFTSUNfUkFURQkJMHgxNDBjCisjZGVmaW5lIEhUX0NUUkxfQ0ZHCQkweDE0MTAKKyNkZWZpbmUgU0lGU19DT1NUX0NGRwkJMHgxNDE0CisjZGVmaW5lIFJYX1BBUlNFUl9DRkcJCTB4MTQxOAkvL1NldCBOQVYgZm9yIGFsbCByZWNlaXZlZCBmcmFtZXMKKworLy8KKy8vICA0LjUgTUFDIFNlY3VyaXR5IGNvbmZpZ3VyYXRpb24gKG9mZnNldDoweDE1MDApCisvLworI2RlZmluZSBUWF9TRUNfQ05UMAkJMHgxNTAwCQkvLworI2RlZmluZSBSWF9TRUNfQ05UMAkJMHgxNTA0CQkvLworI2RlZmluZSBDQ01QX0ZDX01VVEUJCTB4MTUwOAkJLy8KKy8vCisvLyAgNC42IEhDQ0EvUFNNUCAob2Zmc2V0OjB4MTYwMCkKKy8vCisjZGVmaW5lIFRYT1BfSExEUl9BRERSMAkJMHgxNjAwCisjZGVmaW5lIFRYT1BfSExEUl9BRERSMQkJMHgxNjA0CisjZGVmaW5lIFRYT1BfSExEUl9FVAkJMHgxNjA4CisjZGVmaW5lIFFPU19DRlBPTExfUkFfRFcwCQkweDE2MGMKKyNkZWZpbmUgUU9TX0NGUE9MTF9BMV9EVzEJCTB4MTYxMAorI2RlZmluZSBRT1NfQ0ZQT0xMX1FDCQkweDE2MTQKKy8vCisvLyAgNC43IE1BQyBTdGF0aXN0aXMgcmVnaXN0ZXJzIChvZmZzZXQ6MHgxNzAwKQorLy8KKyNkZWZpbmUgUlhfU1RBX0NOVDAJCTB4MTcwMAkJLy8KKyNkZWZpbmUgUlhfU1RBX0NOVDEJCTB4MTcwNAkJLy8KKyNkZWZpbmUgUlhfU1RBX0NOVDIJCTB4MTcwOAkJLy8KKworLy8KKy8vIFJYX1NUQV9DTlQwX1NUUlVDOiBSWCBQTENQIGVycm9yIGNvdW50ICYgUlggQ1JDIGVycm9yIGNvdW50CisvLworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX1JYX1NUQV9DTlQwX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVU0hPUlQgIFBoeUVycjsKKwkgICAgVVNIT1JUICBDcmNFcnI7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlSWF9TVEFfQ05UMF9TVFJVQywgKlBSWF9TVEFfQ05UMF9TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9SWF9TVEFfQ05UMF9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVVNIT1JUICBDcmNFcnI7CisJICAgIFVTSE9SVCAgUGh5RXJyOworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JUlhfU1RBX0NOVDBfU1RSVUMsICpQUlhfU1RBX0NOVDBfU1RSVUM7CisjZW5kaWYKKworLy8KKy8vIFJYX1NUQV9DTlQxX1NUUlVDOiBSWCBGYWxzZSBDQ0EgY291bnQgJiBSWCBMT05HIGZyYW1lIGNvdW50CisvLworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX1JYX1NUQV9DTlQxX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVU0hPUlQgIFBsY3BFcnI7CisJICAgIFVTSE9SVCAgRmFsc2VDY2E7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlSWF9TVEFfQ05UMV9TVFJVQywgKlBSWF9TVEFfQ05UMV9TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9SWF9TVEFfQ05UMV9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVVNIT1JUICBGYWxzZUNjYTsKKwkgICAgVVNIT1JUICBQbGNwRXJyOworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JUlhfU1RBX0NOVDFfU1RSVUMsICpQUlhfU1RBX0NOVDFfU1RSVUM7CisjZW5kaWYKKworLy8KKy8vIFJYX1NUQV9DTlQyX1NUUlVDOgorLy8KKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9SWF9TVEFfQ05UMl9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVVNIT1JUICBSeEZpZm9PdmVyZmxvd0NvdW50OworCSAgICBVU0hPUlQgIFJ4RHVwbGlDb3VudDsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVJYX1NUQV9DTlQyX1NUUlVDLCAqUFJYX1NUQV9DTlQyX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX1JYX1NUQV9DTlQyX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVU0hPUlQgIFJ4RHVwbGlDb3VudDsKKwkgICAgVVNIT1JUICBSeEZpZm9PdmVyZmxvd0NvdW50OworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JUlhfU1RBX0NOVDJfU1RSVUMsICpQUlhfU1RBX0NOVDJfU1RSVUM7CisjZW5kaWYKKyNkZWZpbmUgVFhfU1RBX0NOVDAJCTB4MTcwQwkJLy8KKy8vCisvLyBTVEFfQ1NSMzogVFggQmVhY29uIGNvdW50CisvLworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX1RYX1NUQV9DTlQwX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVU0hPUlQgIFR4QmVhY29uQ291bnQ7CisJICAgIFVTSE9SVCAgVHhGYWlsQ291bnQ7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlUWF9TVEFfQ05UMF9TVFJVQywgKlBUWF9TVEFfQ05UMF9TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9UWF9TVEFfQ05UMF9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVVNIT1JUICBUeEZhaWxDb3VudDsKKwkgICAgVVNIT1JUICBUeEJlYWNvbkNvdW50OworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JVFhfU1RBX0NOVDBfU1RSVUMsICpQVFhfU1RBX0NOVDBfU1RSVUM7CisjZW5kaWYKKyNkZWZpbmUgVFhfU1RBX0NOVDEJCTB4MTcxMAkJLy8KKy8vCisvLyBUWF9TVEFfQ05UMTogVFggdHggY291bnQKKy8vCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfVFhfU1RBX0NOVDFfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVTSE9SVCAgVHhSZXRyYW5zbWl0OworCSAgICBVU0hPUlQgIFR4U3VjY2VzczsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVRYX1NUQV9DTlQxX1NUUlVDLCAqUFRYX1NUQV9DTlQxX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX1RYX1NUQV9DTlQxX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVU0hPUlQgIFR4U3VjY2VzczsKKwkgICAgVVNIT1JUICBUeFJldHJhbnNtaXQ7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlUWF9TVEFfQ05UMV9TVFJVQywgKlBUWF9TVEFfQ05UMV9TVFJVQzsKKyNlbmRpZgorI2RlZmluZSBUWF9TVEFfQ05UMgkJMHgxNzE0CQkvLworLy8KKy8vIFRYX1NUQV9DTlQyOiBUWCB0eCBjb3VudAorLy8KKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9UWF9TVEFfQ05UMl9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVVNIT1JUICBUeFVuZGVyRmxvd0NvdW50OworCSAgICBVU0hPUlQgIFR4WmVyb0xlbkNvdW50OworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JVFhfU1RBX0NOVDJfU1RSVUMsICpQVFhfU1RBX0NOVDJfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfVFhfU1RBX0NOVDJfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVTSE9SVCAgVHhaZXJvTGVuQ291bnQ7CisJICAgIFVTSE9SVCAgVHhVbmRlckZsb3dDb3VudDsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVRYX1NUQV9DTlQyX1NUUlVDLCAqUFRYX1NUQV9DTlQyX1NUUlVDOworI2VuZGlmCisjZGVmaW5lIFRYX1NUQV9GSUZPCQkweDE3MTgJCS8vCisvLworLy8gVFhfU1RBX0ZJRk9fU1RSVUM6IFRYIFJlc3VsdCBmb3Igc3BlY2lmaWMgUElEIHN0YXR1cyBmaWZvIHJlZ2lzdGVyCisvLworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24gUEFDS0VEIF9UWF9TVEFfRklGT19TVFJVQwl7CisJc3RydWN0CXsKKwkJVUlOVDMyCQlSZXNlcnZlOjI7CisJCVVJTlQzMgkJVHhCRjoxOyAvLyAzKjMKKwkJVUlOVDMyCQlTdWNjZXNzUmF0ZToxMzsJLy9pbmNsdWRlIE1DUywgbW9kZSAsc2hvcnRHSSwgQlcgc2V0dGluZ1NhbWUgZm9ybWF0IGFzIFRYV0kgV29yZCAwIEJpdCAzMS0xNi4KKy8vCQlVSU5UMzIJCVN1Y2Nlc3NSYXRlOjE2OwkvL2luY2x1ZGUgTUNTLCBtb2RlICxzaG9ydEdJLCBCVyBzZXR0aW5nU2FtZSBmb3JtYXQgYXMgVFhXSSBXb3JkIDAgQml0IDMxLTE2LgorCQlVSU5UMzIJCXdjaWQ6ODsJCS8vd2lyZWxlc3MgY2xpZW50IGluZGV4CisJCVVJTlQzMiAgICAgICAJVHhBY2tSZXF1aXJlZDoxOyAgICAvLyBhY2sgcmVxdWlyZWQKKwkJVUlOVDMyICAgICAgIAlUeEFnZ3JlOjE7ICAgIC8vIFR4IGlzIGFnZ3JlZ2F0ZWQKKwkJVUlOVDMyICAgICAgIAlUeFN1Y2Nlc3M6MTsgICAvLyBUeCBzdWNjZXNzLiB3aGV0aGVyIHN1Y2Nlc3Mgb3Igbm90CisJCVVJTlQzMiAgICAgICAJUGlkVHlwZTo0OworCQlVSU5UMzIgICAgICAgCWJWYWxpZDoxOyAgIC8vIDE6VGhpcyByZWdpc3RlciBjb250YWlucyBhIHZhbGlkIFRYIHJlc3VsdAorCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JVFhfU1RBX0ZJRk9fU1RSVUMsICpQVFhfU1RBX0ZJRk9fU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbiBQQUNLRUQgX1RYX1NUQV9GSUZPX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVSU5UMzIgICAgICAgCWJWYWxpZDoxOyAgIC8vIDE6VGhpcyByZWdpc3RlciBjb250YWlucyBhIHZhbGlkIFRYIHJlc3VsdAorCQlVSU5UMzIgICAgICAgCVBpZFR5cGU6NDsKKwkJVUlOVDMyICAgICAgIAlUeFN1Y2Nlc3M6MTsgICAvLyBUeCBObyByZXRyeSBzdWNjZXNzCisJCVVJTlQzMiAgICAgICAJVHhBZ2dyZToxOyAgICAvLyBUeCBSZXRyeSBTdWNjZXNzCisJCVVJTlQzMiAgICAgICAJVHhBY2tSZXF1aXJlZDoxOyAgICAvLyBUeCBmYWlsCisJCVVJTlQzMgkJd2NpZDo4OwkJLy93aXJlbGVzcyBjbGllbnQgaW5kZXgKKy8vCQlVSU5UMzIJCVN1Y2Nlc3NSYXRlOjE2OwkvL2luY2x1ZGUgTUNTLCBtb2RlICxzaG9ydEdJLCBCVyBzZXR0aW5nU2FtZSBmb3JtYXQgYXMgVFhXSSBXb3JkIDAgQml0IDMxLTE2LgorCQlVSU5UMzIJCVN1Y2Nlc3NSYXRlOjEzOwkvL2luY2x1ZGUgTUNTLCBtb2RlICxzaG9ydEdJLCBCVyBzZXR0aW5nU2FtZSBmb3JtYXQgYXMgVFhXSSBXb3JkIDAgQml0IDMxLTE2LgorCQlVSU5UMzIJCVR4QkY6MTsKKwkJVUlOVDMyCQlSZXNlcnZlOjI7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlUWF9TVEFfRklGT19TVFJVQywgKlBUWF9TVEFfRklGT19TVFJVQzsKKyNlbmRpZgorLy8gRGVidWcgY291bnRlcgorI2RlZmluZSBUWF9BR0dfQ05UCTB4MTcxYworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX1RYX0FHR19DTlRfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVTSE9SVCAgQWdnVHhDb3VudDsKKwkgICAgVVNIT1JUICBOb25BZ2dUeENvdW50OworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JVFhfQUdHX0NOVF9TVFJVQywgKlBUWF9BR0dfQ05UX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX1RYX0FHR19DTlRfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVTSE9SVCAgTm9uQWdnVHhDb3VudDsKKwkgICAgVVNIT1JUICBBZ2dUeENvdW50OworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JVFhfQUdHX0NOVF9TVFJVQywgKlBUWF9BR0dfQ05UX1NUUlVDOworI2VuZGlmCisvLyBEZWJ1ZyBjb3VudGVyCisjZGVmaW5lIFRYX0FHR19DTlQwCTB4MTcyMAorI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX1RYX0FHR19DTlQwX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVU0hPUlQgIEFnZ1NpemUyQ291bnQ7CisJICAgIFVTSE9SVCAgQWdnU2l6ZTFDb3VudDsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVRYX0FHR19DTlQwX1NUUlVDLCAqUFRYX0FHR19DTlQwX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX1RYX0FHR19DTlQwX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVU0hPUlQgIEFnZ1NpemUxQ291bnQ7CisJICAgIFVTSE9SVCAgQWdnU2l6ZTJDb3VudDsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVRYX0FHR19DTlQwX1NUUlVDLCAqUFRYX0FHR19DTlQwX1NUUlVDOworI2VuZGlmCisvLyBEZWJ1ZyBjb3VudGVyCisjZGVmaW5lIFRYX0FHR19DTlQxCTB4MTcyNAorI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX1RYX0FHR19DTlQxX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVU0hPUlQgIEFnZ1NpemU0Q291bnQ7CisJICAgIFVTSE9SVCAgQWdnU2l6ZTNDb3VudDsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVRYX0FHR19DTlQxX1NUUlVDLCAqUFRYX0FHR19DTlQxX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX1RYX0FHR19DTlQxX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVU0hPUlQgIEFnZ1NpemUzQ291bnQ7CisJICAgIFVTSE9SVCAgQWdnU2l6ZTRDb3VudDsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVRYX0FHR19DTlQxX1NUUlVDLCAqUFRYX0FHR19DTlQxX1NUUlVDOworI2VuZGlmCisjZGVmaW5lIFRYX0FHR19DTlQyCTB4MTcyOAorI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX1RYX0FHR19DTlQyX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVU0hPUlQgIEFnZ1NpemU2Q291bnQ7CisJICAgIFVTSE9SVCAgQWdnU2l6ZTVDb3VudDsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVRYX0FHR19DTlQyX1NUUlVDLCAqUFRYX0FHR19DTlQyX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX1RYX0FHR19DTlQyX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVU0hPUlQgIEFnZ1NpemU1Q291bnQ7CisJICAgIFVTSE9SVCAgQWdnU2l6ZTZDb3VudDsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVRYX0FHR19DTlQyX1NUUlVDLCAqUFRYX0FHR19DTlQyX1NUUlVDOworI2VuZGlmCisvLyBEZWJ1ZyBjb3VudGVyCisjZGVmaW5lIFRYX0FHR19DTlQzCTB4MTcyYworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX1RYX0FHR19DTlQzX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVU0hPUlQgIEFnZ1NpemU4Q291bnQ7CisJICAgIFVTSE9SVCAgQWdnU2l6ZTdDb3VudDsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVRYX0FHR19DTlQzX1NUUlVDLCAqUFRYX0FHR19DTlQzX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX1RYX0FHR19DTlQzX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVU0hPUlQgIEFnZ1NpemU3Q291bnQ7CisJICAgIFVTSE9SVCAgQWdnU2l6ZThDb3VudDsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVRYX0FHR19DTlQzX1NUUlVDLCAqUFRYX0FHR19DTlQzX1NUUlVDOworI2VuZGlmCisvLyBEZWJ1ZyBjb3VudGVyCisjZGVmaW5lIFRYX0FHR19DTlQ0CTB4MTczMAorI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX1RYX0FHR19DTlQ0X1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVU0hPUlQgIEFnZ1NpemUxMENvdW50OworCSAgICBVU0hPUlQgIEFnZ1NpemU5Q291bnQ7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlUWF9BR0dfQ05UNF9TVFJVQywgKlBUWF9BR0dfQ05UNF9TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9UWF9BR0dfQ05UNF9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVVNIT1JUICBBZ2dTaXplOUNvdW50OworCSAgICBVU0hPUlQgIEFnZ1NpemUxMENvdW50OworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JVFhfQUdHX0NOVDRfU1RSVUMsICpQVFhfQUdHX0NOVDRfU1RSVUM7CisjZW5kaWYKKyNkZWZpbmUgVFhfQUdHX0NOVDUJMHgxNzM0CisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfVFhfQUdHX0NOVDVfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVTSE9SVCAgQWdnU2l6ZTEyQ291bnQ7CisJICAgIFVTSE9SVCAgQWdnU2l6ZTExQ291bnQ7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlUWF9BR0dfQ05UNV9TVFJVQywgKlBUWF9BR0dfQ05UNV9TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9UWF9BR0dfQ05UNV9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVVNIT1JUICBBZ2dTaXplMTFDb3VudDsKKwkgICAgVVNIT1JUICBBZ2dTaXplMTJDb3VudDsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVRYX0FHR19DTlQ1X1NUUlVDLCAqUFRYX0FHR19DTlQ1X1NUUlVDOworI2VuZGlmCisjZGVmaW5lIFRYX0FHR19DTlQ2CQkweDE3MzgKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9UWF9BR0dfQ05UNl9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVVNIT1JUICBBZ2dTaXplMTRDb3VudDsKKwkgICAgVVNIT1JUICBBZ2dTaXplMTNDb3VudDsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVRYX0FHR19DTlQ2X1NUUlVDLCAqUFRYX0FHR19DTlQ2X1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX1RYX0FHR19DTlQ2X1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVU0hPUlQgIEFnZ1NpemUxM0NvdW50OworCSAgICBVU0hPUlQgIEFnZ1NpemUxNENvdW50OworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JVFhfQUdHX0NOVDZfU1RSVUMsICpQVFhfQUdHX0NOVDZfU1RSVUM7CisjZW5kaWYKKyNkZWZpbmUgVFhfQUdHX0NOVDcJCTB4MTczYworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX1RYX0FHR19DTlQ3X1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVU0hPUlQgIEFnZ1NpemUxNkNvdW50OworCSAgICBVU0hPUlQgIEFnZ1NpemUxNUNvdW50OworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JVFhfQUdHX0NOVDdfU1RSVUMsICpQVFhfQUdHX0NOVDdfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfVFhfQUdHX0NOVDdfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVTSE9SVCAgQWdnU2l6ZTE1Q291bnQ7CisJICAgIFVTSE9SVCAgQWdnU2l6ZTE2Q291bnQ7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlUWF9BR0dfQ05UN19TVFJVQywgKlBUWF9BR0dfQ05UN19TVFJVQzsKKyNlbmRpZgorI2RlZmluZSBNUERVX0RFTlNJVFlfQ05UCQkweDE3NDAKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9NUERVX0RFTl9DTlRfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVTSE9SVCAgUlhaZXJvRGVsQ291bnQ7CS8vUlggemVybyBsZW5ndGggZGVsaW1pdGVyIGNvdW50CisJICAgIFVTSE9SVCAgVFhaZXJvRGVsQ291bnQ7CS8vVFggemVybyBsZW5ndGggZGVsaW1pdGVyIGNvdW50CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlNUERVX0RFTl9DTlRfU1RSVUMsICpQTVBEVV9ERU5fQ05UX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX01QRFVfREVOX0NOVF9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVVNIT1JUICBUWFplcm9EZWxDb3VudDsJLy9UWCB6ZXJvIGxlbmd0aCBkZWxpbWl0ZXIgY291bnQKKwkgICAgVVNIT1JUICBSWFplcm9EZWxDb3VudDsJLy9SWCB6ZXJvIGxlbmd0aCBkZWxpbWl0ZXIgY291bnQKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CU1QRFVfREVOX0NOVF9TVFJVQywgKlBNUERVX0RFTl9DTlRfU1RSVUM7CisjZW5kaWYKKy8vCisvLyBUWFJYIGNvbnRyb2wgcmVnaXN0ZXJzIC0gYmFzZSBhZGRyZXNzIDB4MzAwMAorLy8KKy8vIHJ0Mjg2MGIgIFVOS05PV04gcmVnIHVzZSBSL08gUmVnIEFkZHIgMHg3N2QwIGZpcnN0Li4KKyNkZWZpbmUgVFhSWF9DU1IxICAgICAgICAgICAweDc3ZDAKKworLy8KKy8vIFNlY3VyaXR5IGtleSB0YWJsZSBtZW1vcnksIGJhc2UgYWRkcmVzcyA9IDB4MTAwMAorLy8KKyNkZWZpbmUgTUFDX1dDSURfQkFTRQkJMHgxODAwIC8vOC1ieXRlcyh1c2Ugb25seSA2LWJ5dGVzKSAqIDI1NiBlbnRyeSA9CisjZGVmaW5lIEhXX1dDSURfRU5UUllfU0laRSAgIDgKKyNkZWZpbmUgUEFJUldJU0VfS0VZX1RBQkxFX0JBU0UgICAgIDB4NDAwMCAgICAgIC8vIDMyLWJ5dGUgKiAyNTYtZW50cnkgPSAgLWJ5dGUKKyNkZWZpbmUgSFdfS0VZX0VOVFJZX1NJWkUgICAgICAgICAgIDB4MjAKKyNkZWZpbmUgUEFJUldJU0VfSVZFSVZfVEFCTEVfQkFTRSAgICAgMHg2MDAwICAgICAgLy8gOC1ieXRlICogMjU2LWVudHJ5ID0gIC1ieXRlCisjZGVmaW5lIE1BQ19JVkVJVl9UQUJMRV9CQVNFICAgICAweDYwMDAgICAgICAvLyA4LWJ5dGUgKiAyNTYtZW50cnkgPSAgLWJ5dGUKKyNkZWZpbmUgSFdfSVZFSVZfRU5UUllfU0laRSAgIDgKKyNkZWZpbmUgTUFDX1dDSURfQVRUUklCVVRFX0JBU0UgICAgIDB4NjgwMCAgICAgIC8vIDQtYnl0ZSAqIDI1Ni1lbnRyeSA9ICAtYnl0ZQorI2RlZmluZSBIV19XQ0lEX0FUVFJJX1NJWkUgICA0CisjZGVmaW5lIFdDSURfUkVTRVJWRUQgICAgICAgICAgCQkweDZiZmMKKyNkZWZpbmUgU0hBUkVEX0tFWV9UQUJMRV9CQVNFICAgICAgIDB4NmMwMCAgICAgIC8vIDMyLWJ5dGUgKiAxNi1lbnRyeSA9IDUxMi1ieXRlCisjZGVmaW5lIFNIQVJFRF9LRVlfTU9ERV9CQVNFICAgICAgIDB4NzAwMCAgICAgIC8vIDMyLWJ5dGUgKiAxNi1lbnRyeSA9IDUxMi1ieXRlCisjZGVmaW5lIEhXX1NIQVJFRF9LRVlfTU9ERV9TSVpFICAgNAorI2RlZmluZSBTSEFSRURLRVlUQUJMRQkJCTAKKyNkZWZpbmUgUEFJUldJU0VLRVlUQUJMRQkJCTEKKworCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfU0hBUkVES0VZX01PREVfU1RSVUMJeworCXN0cnVjdAl7CisJCVVJTlQzMiAgICAgICA6MTsKKwkJVUlOVDMyICAgICAgIEJzczFLZXkzQ2lwaGVyQWxnOjM7CisJCVVJTlQzMiAgICAgICA6MTsKKwkJVUlOVDMyICAgICAgIEJzczFLZXkyQ2lwaGVyQWxnOjM7CisJCVVJTlQzMiAgICAgICA6MTsKKwkJVUlOVDMyICAgICAgIEJzczFLZXkxQ2lwaGVyQWxnOjM7CisJCVVJTlQzMiAgICAgICA6MTsKKwkJVUlOVDMyICAgICAgIEJzczFLZXkwQ2lwaGVyQWxnOjM7CisJCVVJTlQzMiAgICAgICA6MTsKKwkJVUlOVDMyICAgICAgIEJzczBLZXkzQ2lwaGVyQWxnOjM7CisJCVVJTlQzMiAgICAgICA6MTsKKwkJVUlOVDMyICAgICAgIEJzczBLZXkyQ2lwaGVyQWxnOjM7CisJCVVJTlQzMiAgICAgICA6MTsKKwkJVUlOVDMyICAgICAgIEJzczBLZXkxQ2lwaGVyQWxnOjM7CisJCVVJTlQzMiAgICAgICA6MTsKKwkJVUlOVDMyICAgICAgIEJzczBLZXkwQ2lwaGVyQWxnOjM7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlTSEFSRURLRVlfTU9ERV9TVFJVQywgKlBTSEFSRURLRVlfTU9ERV9TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9TSEFSRURLRVlfTU9ERV9TVFJVQwl7CisJc3RydWN0CXsKKwkJVUlOVDMyICAgICAgIEJzczBLZXkwQ2lwaGVyQWxnOjM7CisJCVVJTlQzMiAgICAgICA6MTsKKwkJVUlOVDMyICAgICAgIEJzczBLZXkxQ2lwaGVyQWxnOjM7CisJCVVJTlQzMiAgICAgICA6MTsKKwkJVUlOVDMyICAgICAgIEJzczBLZXkyQ2lwaGVyQWxnOjM7CisJCVVJTlQzMiAgICAgICA6MTsKKwkJVUlOVDMyICAgICAgIEJzczBLZXkzQ2lwaGVyQWxnOjM7CisJCVVJTlQzMiAgICAgICA6MTsKKwkJVUlOVDMyICAgICAgIEJzczFLZXkwQ2lwaGVyQWxnOjM7CisJCVVJTlQzMiAgICAgICA6MTsKKwkJVUlOVDMyICAgICAgIEJzczFLZXkxQ2lwaGVyQWxnOjM7CisJCVVJTlQzMiAgICAgICA6MTsKKwkJVUlOVDMyICAgICAgIEJzczFLZXkyQ2lwaGVyQWxnOjM7CisJCVVJTlQzMiAgICAgICA6MTsKKwkJVUlOVDMyICAgICAgIEJzczFLZXkzQ2lwaGVyQWxnOjM7CisJCVVJTlQzMiAgICAgICA6MTsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVNIQVJFREtFWV9NT0RFX1NUUlVDLCAqUFNIQVJFREtFWV9NT0RFX1NUUlVDOworI2VuZGlmCisvLyA2NC1lbnRyeSBmb3IgcGFpcndpc2Uga2V5IHRhYmxlCit0eXBlZGVmIHN0cnVjdCBfSFdfV0NJRF9FTlRSWSB7ICAvLyA4LWJ5dGUgcGVyIGVudHJ5CisgICAgVUNIQVIgICBBZGRyZXNzWzZdOworICAgIFVDSEFSICAgUnN2WzJdOworfSBIV19XQ0lEX0VOVFJZLCBQSFdfV0NJRF9FTlRSWTsKKworCisKKy8vCisvLyBPdGhlciBvbi1jaGlwIHNoYXJlZCBtZW1vcnkgc3BhY2UsIGJhc2UgPSAweDIwMDAKKy8vCisKKy8vIENJUyBzcGFjZSAtIGJhc2UgYWRkcmVzcyA9IDB4MjAwMAorI2RlZmluZSBIV19DSVNfQkFTRSAgICAgICAgICAgICAweDIwMDAKKworLy8gQ2Fycmllci1zZW5zZSBDVFMgZnJhbWUgYmFzZSBhZGRyZXNzLiBJdCdzIHdoZXJlIG1hYyBzdG9yZXMgY2Fycmllci1zZW5zZSBmcmFtZSBmb3IgY2Fycmllci1zZW5zZSBmdW5jdGlvbi4KKyNkZWZpbmUgSFdfQ1NfQ1RTX0JBU0UJCQkweDc3MDAKKy8vIERGUyBDVFMgZnJhbWUgYmFzZSBhZGRyZXNzLiBJdCdzIHdoZXJlIG1hYyBzdG9yZXMgQ1RTIGZyYW1lIGZvciBERlMuCisjZGVmaW5lIEhXX0RGU19DVFNfQkFTRQkJCTB4Nzc4MAorI2RlZmluZSBIV19DVFNfRlJBTUVfU0laRQkJMHg4MAorCisvLyAyMDA0LTExLTA4IGpvaG4gLSBzaW5jZSBOVUxMIGZyYW1lIHdvbid0IGJlIHRoYXQgbG9uZyAoMjU2IGJ5dGUpLiBXZSBzdGVhbCAxNiB0YWlsIGJ5dGVzCisvLyB0byBzYXZlIGRlYnVnZ2luZyBzZXR0aW5ncworI2RlZmluZSBIV19ERUJVR19TRVRUSU5HX0JBU0UgICAweDc3ZjAgIC8vIDB4NzdmMH4weDc3ZmYgdG90YWwgMTYgYnl0ZXMKKyNkZWZpbmUgSFdfREVCVUdfU0VUVElOR19CQVNFMiAgIDB4Nzc3MCAgLy8gMHg3N2YwfjB4NzdmZiB0b3RhbCAxNiBieXRlcworCisvLyBJbiBvcmRlciB0byBzdXBwb3J0IG1heGltdW0gOCBNQlNTIGFuZCBpdHMgbWF4aW11bSBsZW5ndGggaXMgNTEyIGZvciBlYWNoIGJlYWNvbgorLy8gVGhyZWUgc2VjdGlvbiBkaXNjb250aW51ZSBtZW1vcnkgc2VnbWVudHMgd2lsbCBiZSB1c2VkLgorLy8gMS4gVGhlIG9yaWdpbmFsIHJlZ2lvbiBmb3IgQkNOIDB+MworLy8gMi4gRXh0cmFjdCBtZW1vcnkgZnJvbSBGQ0UgdGFibGUgZm9yIEJDTiA0fjUKKy8vIDMuIEV4dHJhY3QgbWVtb3J5IGZyb20gUGFpci13aXNlIGtleSB0YWJsZSBmb3IgQkNOIDZ+NworLy8JICBJdCBvY2N1cGllZCB0aG9zZSBtZW1vcnkgb2Ygd2NpZCAyMzh+MjUzIGZvciBCQ04gNgorLy8JCQkJCQkgICAgICBhbmQgd2NpZCAyMjJ+MjM3IGZvciBCQ04gNworI2RlZmluZSBIV19CRUFDT05fTUFYX1NJWkUgICAgICAweDEwMDAgLyogdW5pdDogYnl0ZSAqLworI2RlZmluZSBIV19CRUFDT05fQkFTRTAgICAgICAgICAweDc4MDAKKyNkZWZpbmUgSFdfQkVBQ09OX0JBU0UxICAgICAgICAgMHg3QTAwCisjZGVmaW5lIEhXX0JFQUNPTl9CQVNFMiAgICAgICAgIDB4N0MwMAorI2RlZmluZSBIV19CRUFDT05fQkFTRTMgICAgICAgICAweDdFMDAKKyNkZWZpbmUgSFdfQkVBQ09OX0JBU0U0ICAgICAgICAgMHg3MjAwCisjZGVmaW5lIEhXX0JFQUNPTl9CQVNFNSAgICAgICAgIDB4NzQwMAorI2RlZmluZSBIV19CRUFDT05fQkFTRTYgICAgICAgICAweDVEQzAKKyNkZWZpbmUgSFdfQkVBQ09OX0JBU0U3ICAgICAgICAgMHg1QkMwCisKKyNkZWZpbmUgSFdfQkVBQ09OX01BWF9DT1VOVCAgICAgOAorI2RlZmluZSBIV19CRUFDT05fT0ZGU0VUCQkweDAyMDAKKyNkZWZpbmUgSFdfQkVBQ09OX0NPTlRFTlRfTEVOCShIV19CRUFDT05fT0ZGU0VUIC0gVFhXSV9TSVpFKQorCisvLyBIT1NULU1DVSBzaGFyZWQgbWVtb3J5IC0gYmFzZSBhZGRyZXNzID0gMHgyMTAwCisjZGVmaW5lIEhPU1RfQ01EX0NTUgkJMHg0MDQKKyNkZWZpbmUgSDJNX01BSUxCT1hfQ1NSICAgICAgICAgMHg3MDEwCisjZGVmaW5lIEgyTV9NQUlMQk9YX0NJRCAgICAgICAgIDB4NzAxNAorI2RlZmluZSBIMk1fTUFJTEJPWF9TVEFUVVMgICAgICAweDcwMWMKKyNkZWZpbmUgSDJNX0lOVF9TUkMgICAgICAgICAgICAgMHg3MDI0CisjZGVmaW5lIEgyTV9CQlBfQUdFTlQgICAgICAgICAgIDB4NzAyOAorI2RlZmluZSBNMkhfQ01EX0RPTkVfQ1NSICAgICAgICAweDAwMGMKKyNkZWZpbmUgTUNVX1RYT1BfQVJSQVlfQkFTRSAgICAgMHgwMDBjICAgLy8gVE9ETzogdG8gYmUgcHJvdmlkZWQgYnkgQWxiZXJ0CisjZGVmaW5lIE1DVV9UWE9QX0VOVFJZX1NJWkUgICAgIDMyICAgICAgIC8vIFRPRE86IHRvIGJlIHByb3ZpZGVkIGJ5IEFsYmVydAorI2RlZmluZSBNQVhfTlVNX09GX1RYT1BfRU5UUlkgICAxNiAgICAgICAvLyBUT0RPOiBtdXN0IGJlIHNhbWUgd2l0aCA4MDUxIGZpcm13YXJlCisjZGVmaW5lIE1DVV9NQk9YX1ZFUlNJT04gICAgICAgIDB4MDEgICAgIC8vIFRPRE86IHRvIGJlIGNvbmZpcm1lZCBieSBBbGJlcnQKKyNkZWZpbmUgTUNVX01CT1hfVkVSU0lPTl9PRkZTRVQgNSAgICAgICAgLy8gVE9ETzogdG8gYmUgcHJvdmlkZWQgYnkgQWxiZXJ0CisKKy8vCisvLyBIb3N0IERNQSByZWdpc3RlcnMgLSBiYXNlIGFkZHJlc3MgMHgyMDAgLiAgVFgwLTM9RURDQVFpZDAtMywgVFg0PUhDQ0EsIFRYNT1NR01ULAorLy8KKy8vCisvLyAgRE1BIFJJTkcgREVTQ1JJUFRPUgorLy8KKyNkZWZpbmUgRTJQUk9NX0NTUiAgICAgICAgICAweDAwMDQKKyNkZWZpbmUgSU9fQ05UTF9DU1IgICAgICAgICAweDc3ZDAKKworI2lmZGVmIFJUMjg2MAorLy8gODA1MSBmaXJtd2FyZSBpbWFnZSBmb3IgUlQyODYwIC0gYmFzZSBhZGRyZXNzID0gMHg0MDAwCisjZGVmaW5lIEZJUk1XQVJFX0lNQUdFX0JBU0UgICAgIDB4MjAwMAorI2RlZmluZSBNQVhfRklSTVdBUkVfSU1BR0VfU0laRSAweDIwMDAgICAgLy8gOGtieXRlCisjZW5kaWYgLy8gUlQyODYwIC8vCisKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gVHggLwlSeCAvIE1nbXQgcmluZyBkZXNjcmlwdG9yIGRlZmluaXRpb24KKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLy8gdGhlIGZvbGxvd2luZyBQSUQgdmFsdWVzIGFyZSB1c2VkIHRvIG1hcmsgb3V0Z29pbmcgZnJhbWUgdHlwZSBpbiBUWEQtPlBJRCBzbyB0aGF0CisvLyBwcm9wZXIgVFggc3RhdGlzdGljcyBjYW4gYmUgY29sbGVjdGVkIGJhc2VkIG9uIHRoZXNlIGNhdGVnb3JpZXMKKy8vIGIzLTIgb2YgUElEIGZpZWxkIC0KKyNkZWZpbmUgUElEX01HTVQJCQkweDA1CisjZGVmaW5lIFBJRF9CRUFDT04JCQkweDBjCisjZGVmaW5lIFBJRF9EQVRBX05PUk1BTFVDQVNUCSAJMHgwMgorI2RlZmluZSBQSURfREFUQV9BTVBEVQkgCTB4MDQKKyNkZWZpbmUgUElEX0RBVEFfTk9fQUNLICAgIAkweDA4CisjZGVmaW5lIFBJRF9EQVRBX05PVF9OT1JNX0FDSwkgCTB4MDMKKy8vIHZhbHVlIGRvbWFpbiBvZiBwVHhELT5Ib3N0UUlkICg0LWJpdDogMH4xNSkKKyNkZWZpbmUgUUlEX0FDX0JLICAgICAgICAgICAgICAgMSAgIC8vIG1lZXQgQUNJIGRlZmluaXRpb24gaW4gODAyLjExZQorI2RlZmluZSBRSURfQUNfQkUgICAgICAgICAgICAgICAwICAgLy8gbWVldCBBQ0kgZGVmaW5pdGlvbiBpbiA4MDIuMTFlCisjZGVmaW5lIFFJRF9BQ19WSSAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgUUlEX0FDX1ZPICAgICAgICAgICAgICAgMworI2RlZmluZSBRSURfSENDQSAgICAgICAgICAgICAgICA0CisjZGVmaW5lIE5VTV9PRl9UWF9SSU5HICAgICAgICAgIDUKKyNkZWZpbmUgUUlEX01HTVQgICAgICAgICAgICAgICAgMTMKKyNkZWZpbmUgUUlEX1JYICAgICAgICAgICAgICAgICAgMTQKKyNkZWZpbmUgUUlEX09USEVSICAgICAgICAgICAgICAgMTUKKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEJCUCAmIFJGCWRlZmluaXRpb24KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2RlZmluZQlCVVNZCQkgICAgICAgICAgICAgICAgMQorI2RlZmluZQlJRExFCQkgICAgICAgICAgICAgICAgMAorCisjZGVmaW5lCVJGX1IwMAkJCQkJICAgIDAKKyNkZWZpbmUJUkZfUjAxCQkJCQkgICAgMQorI2RlZmluZQlSRl9SMDIJCQkJCSAgICAyCisjZGVmaW5lCVJGX1IwMwkJCQkJICAgIDMKKyNkZWZpbmUJUkZfUjA0CQkJCQkgICAgNAorI2RlZmluZQlSRl9SMDUJCQkJCSAgICA1CisjZGVmaW5lCVJGX1IwNgkJCQkJICAgIDYKKyNkZWZpbmUJUkZfUjA3CQkJCQkgICAgNworI2RlZmluZQlSRl9SMDgJCQkJCSAgICA4CisjZGVmaW5lCVJGX1IwOQkJCQkJICAgIDkKKyNkZWZpbmUJUkZfUjEwCQkJCQkgICAgMTAKKyNkZWZpbmUJUkZfUjExCQkJCQkgICAgMTEKKyNkZWZpbmUJUkZfUjEyCQkJCQkgICAgMTIKKyNkZWZpbmUJUkZfUjEzCQkJCQkgICAgMTMKKyNkZWZpbmUJUkZfUjE0CQkJCQkgICAgMTQKKyNkZWZpbmUJUkZfUjE1CQkJCQkgICAgMTUKKyNkZWZpbmUJUkZfUjE2CQkJCQkgICAgMTYKKyNkZWZpbmUJUkZfUjE3CQkJCQkgICAgMTcKKyNkZWZpbmUJUkZfUjE4CQkJCQkgICAgMTgKKyNkZWZpbmUJUkZfUjE5CQkJCQkgICAgMTkKKyNkZWZpbmUJUkZfUjIwCQkJCQkgICAgMjAKKyNkZWZpbmUJUkZfUjIxCQkJCQkgICAgMjEKKyNkZWZpbmUJUkZfUjIyCQkJCQkgICAgMjIKKyNkZWZpbmUJUkZfUjIzCQkJCQkgICAgMjMKKyNkZWZpbmUJUkZfUjI0CQkJCQkgICAgMjQKKyNkZWZpbmUJUkZfUjI1CQkJCQkgICAgMjUKKyNkZWZpbmUJUkZfUjI2CQkJCQkgICAgMjYKKyNkZWZpbmUJUkZfUjI3CQkJCQkgICAgMjcKKyNkZWZpbmUJUkZfUjI4CQkJCQkgICAgMjgKKyNkZWZpbmUJUkZfUjI5CQkJCQkgICAgMjkKKyNkZWZpbmUJUkZfUjMwCQkJCQkgICAgMzAKKyNkZWZpbmUJUkZfUjMxCQkJCQkgICAgMzEKKworI2RlZmluZQlCQlBfUjAJCQkJCSAgICAwICAvLyB2ZXJzaW9uCisjZGVmaW5lCUJCUF9SMQkJCQkgICAgICAgIDEgIC8vIFRTU0kKKyNkZWZpbmUJQkJQX1IyICAgICAgICAgIAkJCTIgIC8vIFRYIGNvbmZpZ3VyZQorI2RlZmluZSBCQlBfUjMgICAgICAgICAgICAgICAgICAgICAgMworI2RlZmluZSBCQlBfUjQgICAgICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBCQlBfUjUgICAgICAgICAgICAgICAgICAgICAgNQorI2RlZmluZSBCQlBfUjYgICAgICAgICAgICAgICAgICAgICAgNgorI2RlZmluZQlCQlBfUjE0CQkJICAgICAgICAgICAgMTQgLy8gUlggY29uZmlndXJlCisjZGVmaW5lIEJCUF9SMTYgICAgICAgICAgICAgICAgICAgICAxNgorI2RlZmluZSBCQlBfUjE3ICAgICAgICAgICAgICAgICAgICAgMTcgLy8gUlggc2Vuc2liaWxpdHkKKyNkZWZpbmUgQkJQX1IxOCAgICAgICAgICAgICAgICAgICAgIDE4CisjZGVmaW5lIEJCUF9SMjEgICAgICAgICAgICAgICAgICAgICAyMQorI2RlZmluZSBCQlBfUjIyICAgICAgICAgICAgICAgICAgICAgMjIKKyNkZWZpbmUgQkJQX1IyNCAgICAgICAgICAgICAgICAgICAgIDI0CisjZGVmaW5lIEJCUF9SMjUgICAgICAgICAgICAgICAgICAgICAyNQorI2RlZmluZSBCQlBfUjQ5ICAgICAgICAgICAgICAgICAgICAgNDkgLy9UU1NJCisjZGVmaW5lIEJCUF9SNTAgICAgICAgICAgICAgICAgICAgICA1MAorI2RlZmluZSBCQlBfUjUxICAgICAgICAgICAgICAgICAgICAgNTEKKyNkZWZpbmUgQkJQX1I1MiAgICAgICAgICAgICAgICAgICAgIDUyCisjZGVmaW5lIEJCUF9SNTUgICAgICAgICAgICAgICAgICAgICA1NQorI2RlZmluZSBCQlBfUjYyICAgICAgICAgICAgICAgICAgICAgNjIgLy8gUnggU1EwIFRocmVzaG9sZCBISUdICisjZGVmaW5lIEJCUF9SNjMgICAgICAgICAgICAgICAgICAgICA2MworI2RlZmluZSBCQlBfUjY0ICAgICAgICAgICAgICAgICAgICAgNjQKKyNkZWZpbmUgQkJQX1I2NSAgICAgICAgICAgICAgICAgICAgIDY1CisjZGVmaW5lIEJCUF9SNjYgICAgICAgICAgICAgICAgICAgICA2NgorI2RlZmluZSBCQlBfUjY3ICAgICAgICAgICAgICAgICAgICAgNjcKKyNkZWZpbmUgQkJQX1I2OCAgICAgICAgICAgICAgICAgICAgIDY4CisjZGVmaW5lIEJCUF9SNjkgICAgICAgICAgICAgICAgICAgICA2OQorI2RlZmluZSBCQlBfUjcwICAgICAgICAgICAgICAgICAgICAgNzAgLy8gUnggQUdDIFNRIENDSyBYY29yciB0aHJlc2hvbGQKKyNkZWZpbmUgQkJQX1I3MyAgICAgICAgICAgICAgICAgICAgIDczCisjZGVmaW5lIEJCUF9SNzUJCQkJCQk3NQorI2RlZmluZSBCQlBfUjc3ICAgICAgICAgICAgICAgICAgICAgNzcKKyNkZWZpbmUgQkJQX1I4MSAgICAgICAgICAgICAgICAgICAgIDgxCisjZGVmaW5lIEJCUF9SODIgICAgICAgICAgICAgICAgICAgICA4MgorI2RlZmluZSBCQlBfUjgzICAgICAgICAgICAgICAgICAgICAgODMKKyNkZWZpbmUgQkJQX1I4NCAgICAgICAgICAgICAgICAgICAgIDg0CisjZGVmaW5lIEJCUF9SODYJCQkJCQk4NgorI2RlZmluZSBCQlBfUjkxCQkJCQkJOTEKKyNkZWZpbmUgQkJQX1I5MgkJCQkJCTkyCisjZGVmaW5lIEJCUF9SOTQgICAgICAgICAgICAgICAgICAgICA5NCAvLyBUeCBHYWluIENvbnRyb2wKKyNkZWZpbmUgQkJQX1IxMDMgICAgICAgICAgICAgICAgICAgIDEwMworI2RlZmluZSBCQlBfUjEwNSAgICAgICAgICAgICAgICAgICAgMTA1CisjZGVmaW5lIEJCUF9SMTEzICAgICAgICAgICAgICAgICAgICAxMTMKKyNkZWZpbmUgQkJQX1IxMTQgICAgICAgICAgICAgICAgICAgIDExNAorI2RlZmluZSBCQlBfUjExNSAgICAgICAgICAgICAgICAgICAgMTE1CisjZGVmaW5lIEJCUF9SMTE2ICAgICAgICAgICAgICAgICAgICAxMTYKKyNkZWZpbmUgQkJQX1IxMTcgICAgICAgICAgICAgICAgICAgIDExNworI2RlZmluZSBCQlBfUjExOCAgICAgICAgICAgICAgICAgICAgMTE4CisjZGVmaW5lIEJCUF9SMTE5ICAgICAgICAgICAgICAgICAgICAxMTkKKyNkZWZpbmUgQkJQX1IxMjAgICAgICAgICAgICAgICAgICAgIDEyMAorI2RlZmluZSBCQlBfUjEyMSAgICAgICAgICAgICAgICAgICAgMTIxCisjZGVmaW5lIEJCUF9SMTIyICAgICAgICAgICAgICAgICAgICAxMjIKKyNkZWZpbmUgQkJQX1IxMjMgICAgICAgICAgICAgICAgICAgIDEyMworCisKKyNkZWZpbmUgQkJQUjk0X0RFRkFVTFQgICAgICAgICAgICAgIDB4MDYgLy8gQWRkIDEgdmFsdWUgd2lsbCBnYWluIDFkYgorCisjZGVmaW5lIFJTU0lfRk9SX1ZFUllfTE9XX1NFTlNJQklMSVRZIC0zNQorI2RlZmluZSBSU1NJX0ZPUl9MT1dfU0VOU0lCSUxJVFkgICAgICAtNTgKKyNkZWZpbmUgUlNTSV9GT1JfTUlEX0xPV19TRU5TSUJJTElUWSAgLTgwCisjZGVmaW5lIFJTU0lfRk9SX01JRF9TRU5TSUJJTElUWSAgICAgIC05MAorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEVFUFJPTSBkZWZpbml0aW9uCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgRUVETyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDgKKyNkZWZpbmUgRUVESSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQKKyNkZWZpbmUgRUVDUyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgRUVTSyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgRUVSTCAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAKKworI2RlZmluZSBFRVBST01fV1JJVEVfT1BDT0RFICAgICAgICAgMHgwNQorI2RlZmluZSBFRVBST01fUkVBRF9PUENPREUgICAgICAgICAgMHgwNgorI2RlZmluZSBFRVBST01fRVdEU19PUENPREUgICAgICAgICAgMHgxMAorI2RlZmluZSBFRVBST01fRVdFTl9PUENPREUgICAgICAgICAgMHgxMworCisjZGVmaW5lCU5VTV9FRVBST01fQkJQX1BBUk1TCQkxOQkJCS8vIEluY2x1ZGUgTklDIENvbmZpZyAwLCAxLCBDUiwgVFggQUxDIHN0ZXAsIEJCUHMKKyNkZWZpbmUJTlVNX0VFUFJPTV9UWF9HX1BBUk1TCQk3CisjZGVmaW5lCUVFUFJPTV9OSUMxX09GRlNFVCAgICAgICAgICAweDM0CQkvLyBUaGUgYWRkcmVzcyBpcyBmcm9tIE5JQyBjb25maWcgMCwgbm90IEJCUCByZWdpc3RlciBJRAorI2RlZmluZQlFRVBST01fTklDMl9PRkZTRVQgICAgICAgICAgMHgzNgkJLy8gVGhlIGFkZHJlc3MgaXMgZnJvbSBOSUMgY29uZmlnIDAsIG5vdCBCQlAgcmVnaXN0ZXIgSUQKKyNkZWZpbmUJRUVQUk9NX0JCUF9CQVNFX09GRlNFVAkJMHhmMAkJLy8gVGhlIGFkZHJlc3MgaXMgZnJvbSBOSUMgY29uZmlnIDAsIG5vdCBCQlAgcmVnaXN0ZXIgSUQKKyNkZWZpbmUJRUVQUk9NX0dfVFhfUFdSX09GRlNFVAkJMHg1MgorI2RlZmluZQlFRVBST01fR19UWDJfUFdSX09GRlNFVAkJMHg2MAorI2RlZmluZSBFRVBST01fTEVEMV9PRkZTRVQJCQkweDNjCisjZGVmaW5lIEVFUFJPTV9MRUQyX09GRlNFVAkJCTB4M2UKKyNkZWZpbmUgRUVQUk9NX0xFRDNfT0ZGU0VUCQkJMHg0MAorI2RlZmluZSBFRVBST01fTE5BX09GRlNFVAkJCTB4NDQKKyNkZWZpbmUgRUVQUk9NX1JTU0lfQkdfT0ZGU0VUCQkweDQ2CisjZGVmaW5lIEVFUFJPTV9SU1NJX0FfT0ZGU0VUCQkweDRhCisjZGVmaW5lIEVFUFJPTV9ERUZJTkVfTUFYX1RYUFdSCQkweDRlCisjZGVmaW5lIEVFUFJPTV9UWFBPV0VSX0JZUkFURV8yME1IWl8yXzRHCTB4ZGUJLy8gMjBNSFogMi40RyB0eCBwb3dlci4KKyNkZWZpbmUgRUVQUk9NX1RYUE9XRVJfQllSQVRFXzQwTUhaXzJfNEcJMHhlZQkvLyA0ME1IWiAyLjRHIHR4IHBvd2VyLgorI2RlZmluZSBFRVBST01fVFhQT1dFUl9CWVJBVEVfMjBNSFpfNUcJCTB4ZmEJLy8gMjBNSFogNUcgdHggcG93ZXIuCisjZGVmaW5lIEVFUFJPTV9UWFBPV0VSX0JZUkFURV80ME1IWl81RwkJMHgxMGEJLy8gNDBNSFogNUcgdHggcG93ZXIuCisjZGVmaW5lIEVFUFJPTV9BX1RYX1BXUl9PRkZTRVQgICAgICAweDc4CisjZGVmaW5lIEVFUFJPTV9BX1RYMl9QV1JfT0ZGU0VUICAgICAgMHhhNgorI2RlZmluZSBFRVBST01fVkVSU0lPTl9PRkZTRVQgICAgICAgMHgwMgorI2RlZmluZQlFRVBST01fRlJFUV9PRkZTRVQJCQkweDNhCisjZGVmaW5lIEVFUFJPTV9UWFBPV0VSX0JZUkFURSAJMHhkZQkvLyAyME1IWiBwb3dlci4KKyNkZWZpbmUgRUVQUk9NX1RYUE9XRVJfREVMVEEJCTB4NTAJLy8gMjBNSFogQU5EIDQwIE1IWiB1c2UgZGlmZmVyZW50IHBvd2VyLiBUaGlzIGlzIGRlbHRhIGluIDQwTUhaLgorI2RlZmluZSBWQUxJRF9FRVBST01fVkVSU0lPTiAgICAgICAgMQorCisvLyBQYWlyS2V5TW9kZSBkZWZpbml0aW9uCisjZGVmaW5lIFBLTU9ERV9OT05FICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFBLTU9ERV9XRVA2NCAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFBLTU9ERV9XRVAxMjggICAgICAgICAgICAgICAyCisjZGVmaW5lIFBLTU9ERV9US0lQICAgICAgICAgICAgICAgICAzCisjZGVmaW5lIFBLTU9ERV9BRVMgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIFBLTU9ERV9DS0lQNjQgICAgICAgICAgICAgICA1CisjZGVmaW5lIFBLTU9ERV9DS0lQMTI4ICAgICAgICAgICAgICA2CisjZGVmaW5lIFBLTU9ERV9US0lQX05PX01JQyAgICAgICAgICA3ICAgICAgIC8vIE1JQyBhcHBlbmRlZCBieSBkcml2ZXI6IG5vdCBhIHZhbGlkIHZhbHVlIGluIGhhcmR3YXJlIGtleSB0YWJsZQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIFdDSUQgIGZvcm1hdAorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLzcuMQlXQ0lEICBFTlRSWSAgZm9ybWF0ICA6IDhieXRlcwordHlwZWRlZglzdHJ1Y3QJX1dDSURfRU5UUllfU1RSVUMgeworCVVDSEFSCQlSWEJBQml0bWFwNzsgICAgLy8gYml0MCBmb3IgVElEOCwgYml0NyBmb3IgVElEIDE1CisJVUNIQVIJCVJYQkFCaXRtYXAwOyAgICAvLyBiaXQwIGZvciBUSUQwLCBiaXQ3IGZvciBUSUQgNworCVVDSEFSCQlNQUNbNl07CS8vIDAgZm9yIHNoYXJlZCBrZXkgdGFibGUuICAxIGZvciBwYWlyd2lzZSBrZXkgdGFibGUKK30JV0NJRF9FTlRSWV9TVFJVQywgKlBXQ0lEX0VOVFJZX1NUUlVDOworCisvLzguMS4xCVNFQ1VSSVRZICBLRVkgIGZvcm1hdCAgOiA4RFcKKy8vIDMyLWJ5dGUgcGVyIGVudHJ5LCB0b3RhbCAxNi1lbnRyeSBmb3Igc2hhcmVkIGtleSB0YWJsZSwgNjQtZW50cnkgZm9yIHBhaXJ3aXNlIGtleSB0YWJsZQordHlwZWRlZiBzdHJ1Y3QgX0hXX0tFWV9FTlRSWSB7ICAgICAgICAgIC8vIDMyLWJ5dGUgcGVyIGVudHJ5CisgICAgVUNIQVIgICBLZXlbMTZdOworICAgIFVDSEFSICAgVHhNaWNbOF07CisgICAgVUNIQVIgICBSeE1pY1s4XTsKK30gSFdfS0VZX0VOVFJZLCAqUEhXX0tFWV9FTlRSWTsKKworLy84LjEuMglJVi9FSVYgIGZvcm1hdCAgOiAyRFcKKworLy84LjEuMwlSWCBhdHRyaWJ1dGUgZW50cnkgZm9ybWF0ICA6IDFEVworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJc3RydWN0CV9NQUNfQVRUUklCVVRFX1NUUlVDIHsKKwlVSU5UMzIJCXJzdjoyMjsKKwlVSU5UMzIJCVJYV0lVREY6MzsKKwlVSU5UMzIJCUJTU0lESWR4OjM7IC8vbXVsdGlwbGVCU1MgaW5kZXggZm9yIHRoZSBXQ0lECisJVUlOVDMyCQlQYWlyS2V5TW9kZTozOworCVVJTlQzMgkJS2V5VGFiOjE7CS8vIDAgZm9yIHNoYXJlZCBrZXkgdGFibGUuICAxIGZvciBwYWlyd2lzZSBrZXkgdGFibGUKK30JTUFDX0FUVFJJQlVURV9TVFJVQywgKlBNQUNfQVRUUklCVVRFX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJc3RydWN0CV9NQUNfQVRUUklCVVRFX1NUUlVDIHsKKwlVSU5UMzIJCUtleVRhYjoxOwkvLyAwIGZvciBzaGFyZWQga2V5IHRhYmxlLiAgMSBmb3IgcGFpcndpc2Uga2V5IHRhYmxlCisJVUlOVDMyCQlQYWlyS2V5TW9kZTozOworCVVJTlQzMgkJQlNTSURJZHg6MzsgLy9tdWx0aXBsZUJTUyBpbmRleCBmb3IgdGhlIFdDSUQKKwlVSU5UMzIJCVJYV0lVREY6MzsKKwlVSU5UMzIJCXJzdjoyMjsKK30JTUFDX0FUVFJJQlVURV9TVFJVQywgKlBNQUNfQVRUUklCVVRFX1NUUlVDOworI2VuZGlmCisKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBUWCAvIFJYIHJpbmcgZGVzY3JpcHRvciBmb3JtYXQKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisvLyB0aGUgZmlyc3QgMjQtYnl0ZSBpbiBUWEQgaXMgY2FsbGVkIFRYSU5GTyBhbmQgd2lsbCBiZSBETUFlZCB0byBNQUMgYmxvY2sgdGhyb3VnaCBUWEZJRk8uCisvLyBNQUMgYmxvY2sgdXNlIHRoaXMgVFhJTkZPIHRvIGNvbnRyb2wgdGhlIHRyYW5zbWlzc2lvbiBiZWhhdmlvciBvZiB0aGlzIGZyYW1lLgorI2RlZmluZSBGSUZPX01HTVQgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgRklGT19IQ0NBICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEZJRk9fRURDQSAgICAgICAgICAgICAgICAgMgorCisvLworLy8gVFggZGVzY3JpcHRvciBmb3JtYXQsIFR4CXJpbmcsIE1nbXQgUmluZworLy8KKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXN0cnVjdAlQQUNLRUQgX1RYRF9TVFJVQyB7CisJLy8gV29yZCAwCisJVUlOVDMyCQlTRFB0cjA7CisJLy8gV29yZCAxCisJVUlOVDMyCQlETUFET05FOjE7CisJVUlOVDMyCQlMYXN0U2VjMDoxOworCVVJTlQzMgkJU0RMZW4wOjE0OworCVVJTlQzMgkJQnVyc3Q6MTsKKwlVSU5UMzIJCUxhc3RTZWMxOjE7CisJVUlOVDMyCQlTRExlbjE6MTQ7CisJLy8gV29yZCAyCisJVUlOVDMyCQlTRFB0cjE7CisJLy8gV29yZCAzCisJVUlOVDMyCQlJQ086MTsKKwlVSU5UMzIJCVVDTzoxOworCVVJTlQzMgkJVENPOjE7CisJVUlOVDMyCQlyc3Y6MjsKKwlVSU5UMzIJCVFTRUw6MjsJLy8gc2VsZWN0IG9uLWNoaXAgRklGTyBJRCBmb3IgMm5kLXN0YWdlIG91dHB1dCBzY2hlZHVsZXIuMDpNR01ULCAxOkhDQ0EgMjpFRENBCisJVUlOVDMyCQlXSVY6MTsJLy8gV2lyZWxlc3MgSW5mbyBWYWxpZC4gMSBpZiBEcml2ZXIgYWxyZWFkeSBmaWxsIFdJLCAgbyBpZiBETUEgbmVlZHMgdG8gY29weSBXSSB0byBjb3JyZWN0cG9zaXRpb24KKwlVSU5UMzIJCXJzdjI6MjQ7Cit9CVRYRF9TVFJVQywgKlBUWERfU1RSVUM7CisjZWxzZQordHlwZWRlZglzdHJ1Y3QJUEFDS0VEIF9UWERfU1RSVUMgeworCS8vIFdvcmQJMAorCVVJTlQzMgkJU0RQdHIwOworCS8vIFdvcmQJMQorCVVJTlQzMgkJU0RMZW4xOjE0OworCVVJTlQzMgkJTGFzdFNlYzE6MTsKKwlVSU5UMzIJCUJ1cnN0OjE7CisJVUlOVDMyCQlTRExlbjA6MTQ7CisJVUlOVDMyCQlMYXN0U2VjMDoxOworCVVJTlQzMgkJRE1BRE9ORToxOworCS8vV29yZDIKKwlVSU5UMzIJCVNEUHRyMTsKKwkvL1dvcmQzCisJVUlOVDMyCQlyc3YyOjI0OworCVVJTlQzMgkJV0lWOjE7CS8vIFdpcmVsZXNzIEluZm8gVmFsaWQuIDEgaWYgRHJpdmVyIGFscmVhZHkgZmlsbCBXSSwgIG8gaWYgRE1BIG5lZWRzIHRvIGNvcHkgV0kgdG8gY29ycmVjdHBvc2l0aW9uCisJVUlOVDMyCQlRU0VMOjI7CS8vIHNlbGVjdCBvbi1jaGlwIEZJRk8gSUQgZm9yIDJuZC1zdGFnZSBvdXRwdXQgc2NoZWR1bGVyLjA6TUdNVCwgMTpIQ0NBIDI6RURDQQorCVVJTlQzMgkJcnN2OjI7CisJVUlOVDMyCQlUQ086MTsJLy8KKwlVSU5UMzIJCVVDTzoxOwkvLworCVVJTlQzMgkJSUNPOjE7CS8vCit9CVRYRF9TVFJVQywgKlBUWERfU1RSVUM7CisjZW5kaWYKKworCisvLworLy8gVFhEIFdpcmVsZXNzIEluZm9ybWF0aW9uIGZvcm1hdCBmb3IgVHggcmluZyBhbmQgTWdtdCBSaW5nCisvLworLy90eG9wIDogZm9yIHR4b3AgbW9kZQorLy8gMDp0eG9wIGZvciB0aGUgTVBEVSBmcmFtZSB3aWxsIGJlIGhhbmRsZXMgYnkgQVNJQyBieSByZWdpc3RlcgorLy8gMS8yLzM6dGhlIE1QRFUgZnJhbWUgaXMgc2VuZCBhZnRlciBQSUZTL2JhY2tvZmYvU0lGUworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJc3RydWN0CVBBQ0tFRCBfVFhXSV9TVFJVQyB7CisJLy8gV29yZCAwCisJVUlOVDMyCQlQSFlNT0RFOjI7CisJVUlOVDMyCQlUeEJGOjE7CS8vIDMqMworCVVJTlQzMgkJcnN2MjoxOworCVVJTlQzMgkJSWZzOjE7CS8vCisJVUlOVDMyCQlTVEJDOjI7CS8vY2hhbm5lbCBiYW5kd2lkdGggMjBNSHogb3IgNDAgTUh6CisJVUlOVDMyCQlTaG9ydEdJOjE7CisJVUlOVDMyCQlCVzoxOwkvL2NoYW5uZWwgYmFuZHdpZHRoIDIwTUh6IG9yIDQwIE1IegorCVVJTlQzMgkJTUNTOjc7CisKKwlVSU5UMzIJCXJzdjo2OworCVVJTlQzMgkJdHhvcDoyOwkvL3R4IGJhY2sgb2ZmIG1vZGUgMDpIVCBUWE9QIHJ1bGUgLCAxOlBJRlMgVFggLDI6QmFja29mZiwgMzpzaWZzIG9ubHkgd2hlbiBwcmV2aW91cyBmcmFtZSBleGNoYW5nZSBpcyBzdWNjZXNzZnVsLgorCVVJTlQzMgkJTXBkdURlbnNpdHk6MzsKKwlVSU5UMzIJCUFNUERVOjE7CisKKwlVSU5UMzIJCVRTOjE7CisJVUlOVDMyCQlDRkFDSzoxOworCVVJTlQzMgkJTUlNT3BzOjE7CS8vIHRoZSByZW1vdGUgcGVlciBpcyBpbiBkeW5hbWljIE1JTU8tUFMgbW9kZQorCVVJTlQzMgkJRlJBRzoxOwkJLy8gMSB0byBpbmZvcm0gVEtJUCBlbmdpbmUgdGhpcyBpcyBhIGZyYWdtZW50LgorCS8vIFdvcmQgMQorCVVJTlQzMgkJUGFja2V0SWQ6NDsKKwlVSU5UMzIJCU1QRFV0b3RhbEJ5dGVDb3VudDoxMjsKKwlVSU5UMzIJCVdpcmVsZXNzQ2xpSUQ6ODsKKwlVSU5UMzIJCUJBV2luU2l6ZTo2OworCVVJTlQzMgkJTlNFUToxOworCVVJTlQzMgkJQUNLOjE7CisJLy8gV29yZCAyCisJVUlOVDMyCQlJVjsKKwkvLyBXb3JkIDMKKwlVSU5UMzIJCUVJVjsKK30JVFhXSV9TVFJVQywgKlBUWFdJX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJc3RydWN0CVBBQ0tFRCBfVFhXSV9TVFJVQyB7CisJLy8gV29yZAkwCisJVUlOVDMyCQlGUkFHOjE7CQkvLyAxIHRvIGluZm9ybSBUS0lQIGVuZ2luZSB0aGlzIGlzIGEgZnJhZ21lbnQuCisJVUlOVDMyCQlNSU1PcHM6MTsJLy8gdGhlIHJlbW90ZSBwZWVyIGlzIGluIGR5bmFtaWMgTUlNTy1QUyBtb2RlCisJVUlOVDMyCQlDRkFDSzoxOworCVVJTlQzMgkJVFM6MTsKKworCVVJTlQzMgkJQU1QRFU6MTsKKwlVSU5UMzIJCU1wZHVEZW5zaXR5OjM7CisJVUlOVDMyCQl0eG9wOjI7CS8vRk9SICJUSElTIiBmcmFtZS4gMDpIVCBUWE9QIHJ1bGUgLCAxOlBJRlMgVFggLDI6QmFja29mZiwgMzpzaWZzIG9ubHkgd2hlbiBwcmV2aW91cyBmcmFtZSBleGNoYW5nZSBpcyBzdWNjZXNzZnVsLgorCVVJTlQzMgkJcnN2OjY7CisKKwlVSU5UMzIJCU1DUzo3OworCVVJTlQzMgkJQlc6MTsJLy9jaGFubmVsIGJhbmR3aWR0aCAyME1IeiBvciA0MCBNSHoKKwlVSU5UMzIJCVNob3J0R0k6MTsKKwlVSU5UMzIJCVNUQkM6MjsJLy8gMTogU1RCQyBzdXBwb3J0IE1DUyA9MC03LCAgIDIsMyA6IFJFU0VSVkUKKwlVSU5UMzIJCUlmczoxOwkvLworCVVJTlQzMgkJcnN2MjoxOworCVVJTlQzMgkJVHhCRjoxOwkvLyAzKjMKKwlVSU5UMzIJCVBIWU1PREU6MjsKKwkvLyBXb3JkCTEKKwlVSU5UMzIJCUFDSzoxOworCVVJTlQzMgkJTlNFUToxOworCVVJTlQzMgkJQkFXaW5TaXplOjY7CisJVUlOVDMyCQlXaXJlbGVzc0NsaUlEOjg7CisJVUlOVDMyCQlNUERVdG90YWxCeXRlQ291bnQ6MTI7CisJVUlOVDMyCQlQYWNrZXRJZDo0OworCS8vV29yZDIKKwlVSU5UMzIJCUlWOworCS8vV29yZDMKKwlVSU5UMzIJCUVJVjsKK30JVFhXSV9TVFJVQywgKlBUWFdJX1NUUlVDOworI2VuZGlmCisvLworLy8gUnggZGVzY3JpcHRvciBmb3JtYXQsIFJ4CVJpbmcKKy8vCisjaWZkZWYgUlQyODYwCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZglzdHJ1Y3QJUEFDS0VEIF9SWERfU1RSVUMJeworCS8vIFdvcmQgMAorCVVJTlQzMgkJU0RQMDsKKwkvLyBXb3JkIDEKKwlVSU5UMzIJCURET05FOjE7CisJVUlOVDMyCQlMUzA6MTsKKwlVSU5UMzIJCVNETDA6MTQ7CisJVUlOVDMyCQlSc3Y6MjsKKwlVSU5UMzIJCVNETDE6MTQ7CisJLy8gV29yZCAyCisJVUlOVDMyCQlTRFAxOworCS8vIFdvcmQgMworCVVJTlQzMgkJUnN2MToxMzsKKwlVSU5UMzIJCVBsY3BSc3NpbDoxOy8vIFRvIGJlIG1vdmVkCisJVUlOVDMyCQlQbGNwU2lnbmFsOjE7CQkvLyBUbyBiZSBtb3ZlZAorCVVJTlQzMgkJRGVjcnlwdGVkOjE7CS8vIHRoaXMgZnJhbWUgaXMgYmVpbmcgZGVjcnlwdGVkLgorCVVJTlQzMgkJQU1QRFU6MTsKKwlVSU5UMzIJCUwyUEFEOjE7CisJVUlOVDMyCQlSU1NJOjE7CisJVUlOVDMyCQlIVEM6MTsKKwlVSU5UMzIJCUFNU0RVOjE7CQkvLyByeCB3aXRoIDgwMi4zIGhlYWRlciwgbm90IDgwMi4xMSBoZWFkZXIuIG9ic29sZXRlLgorCVVJTlQzMgkJQ2lwaGVyRXJyOjI7ICAgICAgICAvLyAwOiBkZWNyeXB0aW9uIG9rYXksIDE6SUNWIGVycm9yLCAyOk1JQyBlcnJvciwgMzpLRVkgbm90IHZhbGlkCisJVUlOVDMyCQlDcmM6MTsgICAgICAgICAgICAgIC8vIDE6IENSQyBlcnJvcgorCVVJTlQzMgkJTXlCc3M6MTsgIAkvLyAxOiB0aGlzIGZyYW1lIGJlbG9uZ3MgdG8gdGhlIHNhbWUgQlNTSUQKKwlVSU5UMzIJCUJjYXN0OjE7ICAgICAgICAgICAgLy8gMTogdGhpcyBpcyBhIGJyb2FkY2FzdCBmcmFtZQorCVVJTlQzMgkJTWNhc3Q6MTsgICAgICAgICAgICAvLyAxOiB0aGlzIGlzIGEgbXVsdGljYXN0IGZyYW1lCisJVUlOVDMyCQlVMk06MTsgICAgICAgICAgICAgIC8vIDE6IHRoaXMgUlggZnJhbWUgaXMgdW5pY2FzdCB0byBtZQorCVVJTlQzMgkJRlJBRzoxOworCVVJTlQzMgkJTlVMTERBVEE6MTsKKwlVSU5UMzIJCURBVEE6MTsKKwlVSU5UMzIJCUJBOjE7CisKK30JUlhEX1NUUlVDLCAqUFJYRF9TVFJVQywgUlQyOFhYX1JYRF9TVFJVQywgKlBSVDI4WFhfUlhEX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJc3RydWN0CVBBQ0tFRCBfUlhEX1NUUlVDCXsKKwkvLyBXb3JkCTAKKwlVSU5UMzIJCVNEUDA7CisJLy8gV29yZAkxCisJVUlOVDMyCQlTREwxOjE0OworCVVJTlQzMgkJUnN2OjI7CisJVUlOVDMyCQlTREwwOjE0OworCVVJTlQzMgkJTFMwOjE7CisJVUlOVDMyCQlERE9ORToxOworCS8vIFdvcmQJMgorCVVJTlQzMgkJU0RQMTsKKwkvLyBXb3JkCTMKKwlVSU5UMzIJCUJBOjE7CisJVUlOVDMyCQlEQVRBOjE7CisJVUlOVDMyCQlOVUxMREFUQToxOworCVVJTlQzMgkJRlJBRzoxOworCVVJTlQzMgkJVTJNOjE7ICAgICAgICAgICAgICAvLyAxOiB0aGlzIFJYIGZyYW1lIGlzIHVuaWNhc3QgdG8gbWUKKwlVSU5UMzIJCU1jYXN0OjE7ICAgICAgICAgICAgLy8gMTogdGhpcyBpcyBhIG11bHRpY2FzdCBmcmFtZQorCVVJTlQzMgkJQmNhc3Q6MTsgICAgICAgICAgICAvLyAxOiB0aGlzIGlzIGEgYnJvYWRjYXN0IGZyYW1lCisJVUlOVDMyCQlNeUJzczoxOyAgCS8vIDE6IHRoaXMgZnJhbWUgYmVsb25ncyB0byB0aGUgc2FtZSBCU1NJRAorCVVJTlQzMgkJQ3JjOjE7ICAgICAgICAgICAgICAvLyAxOiBDUkMgZXJyb3IKKwlVSU5UMzIJCUNpcGhlckVycjoyOyAgICAgICAgLy8gMDogZGVjcnlwdGlvbiBva2F5LCAxOklDViBlcnJvciwgMjpNSUMgZXJyb3IsIDM6S0VZIG5vdCB2YWxpZAorCVVJTlQzMgkJQU1TRFU6MTsJCS8vIHJ4IHdpdGggODAyLjMgaGVhZGVyLCBub3QgODAyLjExIGhlYWRlci4KKwlVSU5UMzIJCUhUQzoxOworCVVJTlQzMgkJUlNTSToxOworCVVJTlQzMgkJTDJQQUQ6MTsKKwlVSU5UMzIJCUFNUERVOjE7CisJVUlOVDMyCQlEZWNyeXB0ZWQ6MTsJLy8gdGhpcyBmcmFtZSBpcyBiZWluZyBkZWNyeXB0ZWQuCisJVUlOVDMyCQlQbGNwU2lnbmFsOjE7CQkvLyBUbyBiZSBtb3ZlZAorCVVJTlQzMgkJUGxjcFJzc2lsOjE7Ly8gVG8gYmUgbW92ZWQKKwlVSU5UMzIJCVJzdjE6MTM7Cit9CVJYRF9TVFJVQywgKlBSWERfU1RSVUMsIFJUMjhYWF9SWERfU1RSVUMsICpQUlQyOFhYX1JYRF9TVFJVQzsKKyNlbmRpZgorI2VuZGlmIC8vIFJUMjg2MCAvLworLy8KKy8vIFJYV0kgd2lyZWxlc3MgaW5mb3JtYXRpb24gZm9ybWF0LCBpbiBQQkYuIGludmlzaWJsZSBpbiBkcml2ZXIuCisvLworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJc3RydWN0CVBBQ0tFRCBfUlhXSV9TVFJVQyB7CisJLy8gV29yZCAwCisJVUlOVDMyCQlUSUQ6NDsKKwlVSU5UMzIJCU1QRFV0b3RhbEJ5dGVDb3VudDoxMjsKKwlVSU5UMzIJCVVERjozOworCVVJTlQzMgkJQlNTSUQ6MzsKKwlVSU5UMzIJCUtleUluZGV4OjI7CisJVUlOVDMyCQlXaXJlbGVzc0NsaUlEOjg7CisJLy8gV29yZCAxCisJVUlOVDMyCQlQSFlNT0RFOjI7ICAgICAgICAgICAgICAvLyAxOiB0aGlzIFJYIGZyYW1lIGlzIHVuaWNhc3QgdG8gbWUKKwlVSU5UMzIJCXJzdjozOworCVVJTlQzMgkJU1RCQzoyOworCVVJTlQzMgkJU2hvcnRHSToxOworCVVJTlQzMgkJQlc6MTsKKwlVSU5UMzIJCU1DUzo3OworCVVJTlQzMgkJU0VRVUVOQ0U6MTI7CisJVUlOVDMyCQlGUkFHOjQ7CisJLy8gV29yZCAyCisJVUlOVDMyCQlyc3YxOjg7CisJVUlOVDMyCQlSU1NJMjo4OworCVVJTlQzMgkJUlNTSTE6ODsKKwlVSU5UMzIJCVJTU0kwOjg7CisJLy8gV29yZCAzCisJVUlOVDMyCQlyc3YyOjE2OworCVVJTlQzMgkJU05SMTo4OworCVVJTlQzMgkJU05SMDo4OworfQlSWFdJX1NUUlVDLCAqUFJYV0lfU1RSVUM7CisjZWxzZQordHlwZWRlZglzdHJ1Y3QJUEFDS0VEIF9SWFdJX1NUUlVDIHsKKwkvLyBXb3JkCTAKKwlVSU5UMzIJCVdpcmVsZXNzQ2xpSUQ6ODsKKwlVSU5UMzIJCUtleUluZGV4OjI7CisJVUlOVDMyCQlCU1NJRDozOworCVVJTlQzMgkJVURGOjM7CisJVUlOVDMyCQlNUERVdG90YWxCeXRlQ291bnQ6MTI7CisJVUlOVDMyCQlUSUQ6NDsKKwkvLyBXb3JkCTEKKwlVSU5UMzIJCUZSQUc6NDsKKwlVSU5UMzIJCVNFUVVFTkNFOjEyOworCVVJTlQzMgkJTUNTOjc7CisJVUlOVDMyCQlCVzoxOworCVVJTlQzMgkJU2hvcnRHSToxOworCVVJTlQzMgkJU1RCQzoyOworCVVJTlQzMgkJcnN2OjM7CisJVUlOVDMyCQlQSFlNT0RFOjI7ICAgICAgICAgICAgICAvLyAxOiB0aGlzIFJYIGZyYW1lIGlzIHVuaWNhc3QgdG8gbWUKKwkvL1dvcmQyCisJVUlOVDMyCQlSU1NJMDo4OworCVVJTlQzMgkJUlNTSTE6ODsKKwlVSU5UMzIJCVJTU0kyOjg7CisJVUlOVDMyCQlyc3YxOjg7CisJLy9Xb3JkMworCVVJTlQzMgkJU05SMDo4OworCVVJTlQzMgkJU05SMTo4OworCVVJTlQzMgkJcnN2MjoxNjsKK30JUlhXSV9TVFJVQywgKlBSWFdJX1NUUlVDOworI2VuZGlmCisKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBIT1NULU1DVSBjb21tdW5pY2F0aW9uIGRhdGEgc3RydWN0dXJlCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLy8KKy8vIEgyTV9NQUlMQk9YX0NTUjogSG9zdC10by1NQ1UgTWFpbGJveAorLy8KKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmIHVuaW9uICBfSDJNX01BSUxCT1hfU1RSVUMgeworICAgIHN0cnVjdCB7CisgICAgICAgIFVJTlQzMiAgICAgICBPd25lcjo4OworICAgICAgICBVSU5UMzIgICAgICAgQ21kVG9rZW46ODsgICAgLy8gMHhmZiB0ZWxscyBNQ1Ugbm90IHRvIHJlcG9ydCBDbWREb25lSW50IGFmdGVyIGV4Y3V0aW5nIHRoZSBjb21tYW5kCisgICAgICAgIFVJTlQzMiAgICAgICBIaWdoQnl0ZTo4OworICAgICAgICBVSU5UMzIgICAgICAgTG93Qnl0ZTo4OworICAgIH0gICBmaWVsZDsKKyAgICBVSU5UMzIgICAgICAgICAgIHdvcmQ7Cit9IEgyTV9NQUlMQk9YX1NUUlVDLCAqUEgyTV9NQUlMQk9YX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYgdW5pb24gIF9IMk1fTUFJTEJPWF9TVFJVQyB7CisgICAgc3RydWN0IHsKKyAgICAgICAgVUlOVDMyICAgICAgIExvd0J5dGU6ODsKKyAgICAgICAgVUlOVDMyICAgICAgIEhpZ2hCeXRlOjg7CisgICAgICAgIFVJTlQzMiAgICAgICBDbWRUb2tlbjo4OworICAgICAgICBVSU5UMzIgICAgICAgT3duZXI6ODsKKyAgICB9ICAgZmllbGQ7CisgICAgVUlOVDMyICAgICAgICAgICB3b3JkOworfSBIMk1fTUFJTEJPWF9TVFJVQywgKlBIMk1fTUFJTEJPWF9TVFJVQzsKKyNlbmRpZgorCisvLworLy8gTTJIX0NNRF9ET05FX0NTUjogTUNVLXRvLUhvc3QgY29tbWFuZCBjb21wbGV0ZSBpbmRpY2F0aW9uCisvLworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYgdW5pb24gX00ySF9DTURfRE9ORV9TVFJVQyB7CisgICAgc3RydWN0ICB7CisgICAgICAgIFVJTlQzMiAgICAgICBDbWRUb2tlbjM7CisgICAgICAgIFVJTlQzMiAgICAgICBDbWRUb2tlbjI7CisgICAgICAgIFVJTlQzMiAgICAgICBDbWRUb2tlbjE7CisgICAgICAgIFVJTlQzMiAgICAgICBDbWRUb2tlbjA7CisgICAgfSBmaWVsZDsKKyAgICBVSU5UMzIgICAgICAgICAgIHdvcmQ7Cit9IE0ySF9DTURfRE9ORV9TVFJVQywgKlBNMkhfQ01EX0RPTkVfU1RSVUM7CisjZWxzZQordHlwZWRlZiB1bmlvbiBfTTJIX0NNRF9ET05FX1NUUlVDIHsKKyAgICBzdHJ1Y3QgIHsKKyAgICAgICAgVUlOVDMyICAgICAgIENtZFRva2VuMDsKKyAgICAgICAgVUlOVDMyICAgICAgIENtZFRva2VuMTsKKyAgICAgICAgVUlOVDMyICAgICAgIENtZFRva2VuMjsKKyAgICAgICAgVUlOVDMyICAgICAgIENtZFRva2VuMzsKKyAgICB9IGZpZWxkOworICAgIFVJTlQzMiAgICAgICAgICAgd29yZDsKK30gTTJIX0NNRF9ET05FX1NUUlVDLCAqUE0ySF9DTURfRE9ORV9TVFJVQzsKKyNlbmRpZgorCisKKworLy8KKy8vIE1DVV9MRURDUzogTUNVIExFRCBDb250cm9sIFNldHRpbmcuCisvLworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYgdW5pb24gIF9NQ1VfTEVEQ1NfU1RSVUMgeworCXN0cnVjdAl7CisJCVVDSEFSCQlQb2xhcml0eToxOworCQlVQ0hBUgkJTGVkTW9kZTo3OworCX0gZmllbGQ7CisJVUNIQVIJCQkJd29yZDsKK30gTUNVX0xFRENTX1NUUlVDLCAqUE1DVV9MRURDU19TVFJVQzsKKyNlbHNlCit0eXBlZGVmIHVuaW9uICBfTUNVX0xFRENTX1NUUlVDIHsKKwlzdHJ1Y3QJeworCQlVQ0hBUgkJTGVkTW9kZTo3OworCQlVQ0hBUgkJUG9sYXJpdHk6MTsKKwl9IGZpZWxkOworCVVDSEFSCQkJd29yZDsKK30gTUNVX0xFRENTX1NUUlVDLCAqUE1DVV9MRURDU19TVFJVQzsKKyNlbmRpZgorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBSZWdpc3RlciBmb3JtYXQKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisKKworLy9OQVZfVElNRV9DRkcgOk5BVgorI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX05BVl9USU1FX0NGR19TVFJVQwl7CisJc3RydWN0CXsKKwkJVVNIT1JUCQlyc3Y6NjsKKwkJVVNIT1JUCQlaZXJvU2lmczoxOyAgICAgICAgICAgICAgIC8vIEFwcGxpZWQgemVybyBTSUZTIHRpbWVyIGFmdGVyIE9GRE0gUlggMDogZGlzYWJsZQorCQlVU0hPUlQJCUVpZnM6OTsgICAgICAgICAgICAgICAvLyBpbiB1bml0IG9mIDEtdXMKKwkJVUNIQVIgICAgICAgU2xvdFRpbWU7ICAgIC8vIGluIHVuaXQgb2YgMS11cworCQlVQ0hBUgkJU2lmczsgICAgICAgICAgICAgICAvLyBpbiB1bml0IG9mIDEtdXMKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CU5BVl9USU1FX0NGR19TVFJVQywgKlBOQVZfVElNRV9DRkdfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfTkFWX1RJTUVfQ0ZHX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVQ0hBUgkJU2lmczsgICAgICAgICAgICAgICAvLyBpbiB1bml0IG9mIDEtdXMKKwkJVUNIQVIgICAgICAgU2xvdFRpbWU7ICAgIC8vIGluIHVuaXQgb2YgMS11cworCQlVU0hPUlQJCUVpZnM6OTsgICAgICAgICAgICAgICAvLyBpbiB1bml0IG9mIDEtdXMKKwkJVVNIT1JUCQlaZXJvU2lmczoxOyAgICAgICAgICAgICAgIC8vIEFwcGxpZWQgemVybyBTSUZTIHRpbWVyIGFmdGVyIE9GRE0gUlggMDogZGlzYWJsZQorCQlVU0hPUlQJCXJzdjo2OworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JTkFWX1RJTUVfQ0ZHX1NUUlVDLCAqUE5BVl9USU1FX0NGR19TVFJVQzsKKyNlbmRpZgorCisKKworCisKKy8vCisvLyBSWF9GSUxUUl9DRkc6ICAvUlggY29uZmlndXJhdGlvbiByZWdpc3RlcgorLy8KKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCVJYX0ZJTFRSX0NGR19TVFJVQwl7CisJc3RydWN0CXsKKwkJVUlOVDMyCQk6MTU7CisJCVVJTlQzMiAgICAgICBEcm9wUnN2Q250bFR5cGU6MTsKKworICAgICAgICAJVUlOVDMyICAgICAgIAlEcm9wQkFSOjE7ICAgICAgIC8vCisJCVVJTlQzMgkJRHJvcEJBOjE7CQkvLworCQlVSU5UMzIJCURyb3BQc1BvbGw6MTsJCS8vIERyb3AgUHMtUG9sbAorCQlVSU5UMzIJCURyb3BSdHM6MTsJCS8vIERyb3AgUHMtUG9sbAorCisJCVVJTlQzMgkJRHJvcEN0czoxOwkJLy8gRHJvcCBQcy1Qb2xsCisJCVVJTlQzMgkJRHJvcEFjazoxOwkJLy8gRHJvcCBQcy1Qb2xsCisJCVVJTlQzMgkJRHJvcENGRW5kOjE7CQkvLyBEcm9wIFBzLVBvbGwKKwkJVUlOVDMyCQlEcm9wQ0ZFbmRBY2s6MTsJCS8vIERyb3AgUHMtUG9sbAorCisJCVVJTlQzMgkJRHJvcER1cGxpY2F0ZToxOwkJLy8gRHJvcCBkdXBsaWNhdGUgZnJhbWUKKwkJVUlOVDMyCQlEcm9wQmNhc3Q6MTsJCS8vIERyb3AgYnJvYWRjYXN0IGZyYW1lcworCQlVSU5UMzIJCURyb3BNY2FzdDoxOwkJLy8gRHJvcCBtdWx0aWNhc3QgZnJhbWVzCisJCVVJTlQzMgkJRHJvcFZlckVycjoxOwkgICAgLy8gRHJvcCB2ZXJzaW9uIGVycm9yIGZyYW1lCisKKwkJVUlOVDMyCQlEcm9wTm90TXlCU1NJRDoxOwkJCS8vIERyb3AgZnJhbSBUb0RzIGJpdCBpcyB0cnVlCisJCVVJTlQzMgkJRHJvcE5vdFRvTWU6MTsJCS8vIERyb3Agbm90IHRvIG1lIHVuaWNhc3QgZnJhbWUKKwkJVUlOVDMyCQlEcm9wUGh5RXJyOjE7CQkvLyBEcm9wIHBoeXNpY2FsIGVycm9yCisJCVVJTlQzMgkJRHJvcENSQ0VycjoxOwkJLy8gRHJvcCBDUkMgZXJyb3IKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVJYX0ZJTFRSX0NGR19TVFJVQywgKlBSWF9GSUxUUl9DRkdfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfUlhfRklMVFJfQ0ZHX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVSU5UMzIJCURyb3BDUkNFcnI6MTsJCS8vIERyb3AgQ1JDIGVycm9yCisJCVVJTlQzMgkJRHJvcFBoeUVycjoxOwkJLy8gRHJvcCBwaHlzaWNhbCBlcnJvcgorCQlVSU5UMzIJCURyb3BOb3RUb01lOjE7CQkvLyBEcm9wIG5vdCB0byBtZSB1bmljYXN0IGZyYW1lCisJCVVJTlQzMgkJRHJvcE5vdE15QlNTSUQ6MTsJCQkvLyBEcm9wIGZyYW0gVG9EcyBiaXQgaXMgdHJ1ZQorCisJCVVJTlQzMgkJRHJvcFZlckVycjoxOwkgICAgLy8gRHJvcCB2ZXJzaW9uIGVycm9yIGZyYW1lCisJCVVJTlQzMgkJRHJvcE1jYXN0OjE7CQkvLyBEcm9wIG11bHRpY2FzdCBmcmFtZXMKKwkJVUlOVDMyCQlEcm9wQmNhc3Q6MTsJCS8vIERyb3AgYnJvYWRjYXN0IGZyYW1lcworCQlVSU5UMzIJCURyb3BEdXBsaWNhdGU6MTsJCS8vIERyb3AgZHVwbGljYXRlIGZyYW1lCisKKwkJVUlOVDMyCQlEcm9wQ0ZFbmRBY2s6MTsJCS8vIERyb3AgUHMtUG9sbAorCQlVSU5UMzIJCURyb3BDRkVuZDoxOwkJLy8gRHJvcCBQcy1Qb2xsCisJCVVJTlQzMgkJRHJvcEFjazoxOwkJLy8gRHJvcCBQcy1Qb2xsCisJCVVJTlQzMgkJRHJvcEN0czoxOwkJLy8gRHJvcCBQcy1Qb2xsCisKKwkJVUlOVDMyCQlEcm9wUnRzOjE7CQkvLyBEcm9wIFBzLVBvbGwKKwkJVUlOVDMyCQlEcm9wUHNQb2xsOjE7CQkvLyBEcm9wIFBzLVBvbGwKKwkJVUlOVDMyCQlEcm9wQkE6MTsJCS8vCisgICAgICAgIAlVSU5UMzIgICAgICAgCURyb3BCQVI6MTsgICAgICAgLy8KKworCQlVSU5UMzIgICAgICAgCURyb3BSc3ZDbnRsVHlwZToxOworCQlVSU5UMzIJCToxNTsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVJYX0ZJTFRSX0NGR19TVFJVQywgKlBSWF9GSUxUUl9DRkdfU1RSVUM7CisjZW5kaWYKKworCisKKworLy8KKy8vIFBIWV9DU1I0OiBSRiBzZXJpYWwgY29udHJvbCByZWdpc3RlcgorLy8KKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9QSFlfQ1NSNF9TVFJVQwl7CisJc3RydWN0CXsKKwkJVUlOVDMyCQlCdXN5OjE7CQkJCS8vIDE6IEFTSUMgaXMgYnVzeSBleGVjdXRlIFJGIHByb2dyYW1taW5nLgorCQlVSU5UMzIJCVBMTF9MRDoxOwkJCS8vIFJGIFBMTF9MRCBzdGF0dXMKKwkJVUlOVDMyCQlJRlNlbGVjdDoxOwkJCS8vIDE6IHNlbGVjdCBJRgl0byBwcm9ncmFtLAkwOiBzZWxlY3QgUkYgdG8JcHJvZ3JhbQorCQlVSU5UMzIJCU51bWJlck9mQml0czo1OwkJLy8gTnVtYmVyIG9mIGJpdHMgdXNlZCBpbiBSRlJlZ1ZhbHVlIChJOjIwLAlSRk1EOjIyKQorCQlVSU5UMzIJCVJGUmVnVmFsdWU6MjQ7CQkvLyBSZWdpc3Rlcgl2YWx1ZSAoaW5jbHVkZSByZWdpc3RlcglpZCkJc2VyaWFsIG91dCB0byBSRi9JRgljaGlwLgorCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JUEhZX0NTUjRfU1RSVUMsICpQUEhZX0NTUjRfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfUEhZX0NTUjRfU1RSVUMJeworCXN0cnVjdAl7CisJCVVJTlQzMgkJUkZSZWdWYWx1ZToyNDsJCS8vIFJlZ2lzdGVyCXZhbHVlIChpbmNsdWRlIHJlZ2lzdGVyCWlkKQlzZXJpYWwgb3V0IHRvIFJGL0lGCWNoaXAuCisJCVVJTlQzMgkJTnVtYmVyT2ZCaXRzOjU7CQkvLyBOdW1iZXIgb2YgYml0cyB1c2VkIGluIFJGUmVnVmFsdWUgKEk6MjAsCVJGTUQ6MjIpCisJCVVJTlQzMgkJSUZTZWxlY3Q6MTsJCQkvLyAxOiBzZWxlY3QgSUYJdG8gcHJvZ3JhbSwJMDogc2VsZWN0IFJGIHRvCXByb2dyYW0KKwkJVUlOVDMyCQlQTExfTEQ6MTsJCQkvLyBSRiBQTExfTEQgc3RhdHVzCisJCVVJTlQzMgkJQnVzeToxOwkJCQkvLyAxOiBBU0lDIGlzIGJ1c3kgZXhlY3V0ZSBSRiBwcm9ncmFtbWluZy4KKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVBIWV9DU1I0X1NUUlVDLCAqUFBIWV9DU1I0X1NUUlVDOworI2VuZGlmCisKKworLy8KKy8vIFNFQ19DU1I1OiBzaGFyZWQga2V5IHRhYmxlIHNlY3VyaXR5IG1vZGUgcmVnaXN0ZXIKKy8vCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfU0VDX0NTUjVfU1RSVUMJeworCXN0cnVjdAl7CisgICAgICAgIFVJTlQzMiAgICAgICA6MTsKKyAgICAgICAgVUlOVDMyICAgICAgIEJzczNLZXkzQ2lwaGVyQWxnOjM7CisgICAgICAgIFVJTlQzMiAgICAgICA6MTsKKyAgICAgICAgVUlOVDMyICAgICAgIEJzczNLZXkyQ2lwaGVyQWxnOjM7CisgICAgICAgIFVJTlQzMiAgICAgICA6MTsKKyAgICAgICAgVUlOVDMyICAgICAgIEJzczNLZXkxQ2lwaGVyQWxnOjM7CisgICAgICAgIFVJTlQzMiAgICAgICA6MTsKKyAgICAgICAgVUlOVDMyICAgICAgIEJzczNLZXkwQ2lwaGVyQWxnOjM7CisgICAgICAgIFVJTlQzMiAgICAgICA6MTsKKyAgICAgICAgVUlOVDMyICAgICAgIEJzczJLZXkzQ2lwaGVyQWxnOjM7CisgICAgICAgIFVJTlQzMiAgICAgICA6MTsKKyAgICAgICAgVUlOVDMyICAgICAgIEJzczJLZXkyQ2lwaGVyQWxnOjM7CisgICAgICAgIFVJTlQzMiAgICAgICA6MTsKKyAgICAgICAgVUlOVDMyICAgICAgIEJzczJLZXkxQ2lwaGVyQWxnOjM7CisgICAgICAgIFVJTlQzMiAgICAgICA6MTsKKyAgICAgICAgVUlOVDMyICAgICAgIEJzczJLZXkwQ2lwaGVyQWxnOjM7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlTRUNfQ1NSNV9TVFJVQywgKlBTRUNfQ1NSNV9TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9TRUNfQ1NSNV9TVFJVQwl7CisJc3RydWN0CXsKKyAgICAgICAgVUlOVDMyICAgICAgIEJzczJLZXkwQ2lwaGVyQWxnOjM7CisgICAgICAgIFVJTlQzMiAgICAgICA6MTsKKyAgICAgICAgVUlOVDMyICAgICAgIEJzczJLZXkxQ2lwaGVyQWxnOjM7CisgICAgICAgIFVJTlQzMiAgICAgICA6MTsKKyAgICAgICAgVUlOVDMyICAgICAgIEJzczJLZXkyQ2lwaGVyQWxnOjM7CisgICAgICAgIFVJTlQzMiAgICAgICA6MTsKKyAgICAgICAgVUlOVDMyICAgICAgIEJzczJLZXkzQ2lwaGVyQWxnOjM7CisgICAgICAgIFVJTlQzMiAgICAgICA6MTsKKyAgICAgICAgVUlOVDMyICAgICAgIEJzczNLZXkwQ2lwaGVyQWxnOjM7CisgICAgICAgIFVJTlQzMiAgICAgICA6MTsKKyAgICAgICAgVUlOVDMyICAgICAgIEJzczNLZXkxQ2lwaGVyQWxnOjM7CisgICAgICAgIFVJTlQzMiAgICAgICA6MTsKKyAgICAgICAgVUlOVDMyICAgICAgIEJzczNLZXkyQ2lwaGVyQWxnOjM7CisgICAgICAgIFVJTlQzMiAgICAgICA6MTsKKyAgICAgICAgVUlOVDMyICAgICAgIEJzczNLZXkzQ2lwaGVyQWxnOjM7CisgICAgICAgIFVJTlQzMiAgICAgICA6MTsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVNFQ19DU1I1X1NUUlVDLCAqUFNFQ19DU1I1X1NUUlVDOworI2VuZGlmCisKKworLy8KKy8vIEhPU1RfQ01EX0NTUjogRm9yIEhPU1QgdG8gaW50ZXJydXB0IGVtYmVkZGVkIHByb2Nlc3NvcgorLy8KKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9IT1NUX0NNRF9DU1JfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVJTlQzMiAgIFJzdjoyNDsKKwkgICAgVUlOVDMyICAgSG9zdENvbW1hbmQ6ODsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CUhPU1RfQ01EX0NTUl9TVFJVQywgKlBIT1NUX0NNRF9DU1JfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfSE9TVF9DTURfQ1NSX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVSU5UMzIgICBIb3N0Q29tbWFuZDo4OworCSAgICBVSU5UMzIgICBSc3Y6MjQ7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlIT1NUX0NNRF9DU1JfU1RSVUMsICpQSE9TVF9DTURfQ1NSX1NUUlVDOworI2VuZGlmCisKKworLy8KKy8vIEFJRlNOX0NTUjogQUlGU04gZm9yIGVhY2ggRURDQSBBQworLy8KKworCisKKy8vCisvLyBFMlBST01fQ1NSOiBFRVBST00gY29udHJvbCByZWdpc3RlcgorLy8KKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9FMlBST01fQ1NSX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVSU5UMzIJCVJzdmQ6MjU7CisJCVVJTlQzMiAgICAgICBMb2FkU3RhdHVzOjE7ICAgLy8gMTpsb2FkaW5nLCAwOmRvbmUKKwkJVUlOVDMyCQlUeXBlOjE7CQkJLy8gMTogOTNDNDYsIDA6OTNDNjYKKwkJVUlOVDMyCQlFZXByb21ETzoxOworCQlVSU5UMzIJCUVlcHJvbURJOjE7CisJCVVJTlQzMgkJRWVwcm9tQ1M6MTsKKwkJVUlOVDMyCQlFZXByb21TSzoxOworCQlVSU5UMzIJCVJlbG9hZDoxOwkJLy8gUmVsb2FkIEVFUFJPTSBjb250ZW50LCB3cml0ZSBvbmUgdG8gcmVsb2FkLCBzZWxmLWNsZWFyZWQuCisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlFMlBST01fQ1NSX1NUUlVDLCAqUEUyUFJPTV9DU1JfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfRTJQUk9NX0NTUl9TVFJVQwl7CisJc3RydWN0CXsKKwkJVUlOVDMyCQlSZWxvYWQ6MTsJCS8vIFJlbG9hZCBFRVBST00gY29udGVudCwgd3JpdGUgb25lIHRvIHJlbG9hZCwgc2VsZi1jbGVhcmVkLgorCQlVSU5UMzIJCUVlcHJvbVNLOjE7CisJCVVJTlQzMgkJRWVwcm9tQ1M6MTsKKwkJVUlOVDMyCQlFZXByb21ESToxOworCQlVSU5UMzIJCUVlcHJvbURPOjE7CisJCVVJTlQzMgkJVHlwZToxOwkJCS8vIDE6IDkzQzQ2LCAwOjkzQzY2CisJCVVJTlQzMiAgICAgICBMb2FkU3RhdHVzOjE7ICAgLy8gMTpsb2FkaW5nLCAwOmRvbmUKKwkJVUlOVDMyCQlSc3ZkOjI1OworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JRTJQUk9NX0NTUl9TVFJVQywgKlBFMlBST01fQ1NSX1NUUlVDOworI2VuZGlmCisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIEUyUFJPTSBkYXRhIGxheW91dAorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLworLy8gRUVQUk9NIGFudGVubmEgc2VsZWN0IGZvcm1hdAorLy8KKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9FRVBST01fQU5URU5OQV9TVFJVQwl7CisJc3RydWN0CXsKKwkJVVNIT1JUICAgICAgUnN2OjQ7CisJCVVTSE9SVCAgICAgIFJmSWNUeXBlOjQ7ICAgICAgICAgICAgIC8vIHNlZSBFMlBST00gZG9jdW1lbnQKKwkJVVNIT1JUCQlUeFBhdGg6NDsJLy8gMTogMVQsIDI6IDJUCisJCVVTSE9SVAkJUnhQYXRoOjQ7CS8vIDE6IDFSLCAyOiAyUiwgMzogM1IKKwl9CWZpZWxkOworCVVTSE9SVAkJCXdvcmQ7Cit9CUVFUFJPTV9BTlRFTk5BX1NUUlVDLCAqUEVFUFJPTV9BTlRFTk5BX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX0VFUFJPTV9BTlRFTk5BX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVU0hPUlQJCVJ4UGF0aDo0OwkvLyAxOiAxUiwgMjogMlIsIDM6IDNSCisJCVVTSE9SVAkJVHhQYXRoOjQ7CS8vIDE6IDFULCAyOiAyVAorCQlVU0hPUlQgICAgICBSZkljVHlwZTo0OyAgICAgICAgICAgICAvLyBzZWUgRTJQUk9NIGRvY3VtZW50CisJCVVTSE9SVCAgICAgIFJzdjo0OworCX0JZmllbGQ7CisJVVNIT1JUCQkJd29yZDsKK30JRUVQUk9NX0FOVEVOTkFfU1RSVUMsICpQRUVQUk9NX0FOVEVOTkFfU1RSVUM7CisjZW5kaWYKKworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24gX0VFUFJPTV9OSUNfQ0lORklHMl9TVFJVQwl7CisJc3RydWN0CXsKKyAgICAgICAgVVNIT1JUCQlSc3YyOjY7CQkJCQkvLyBtdXN0IGJlIDAKKwkJVVNIT1JUCQlCVzQwTUF2YWlsRm9yQToxOwkJCS8vIDA6ZW5hYmxlLCAxOmRpc2FibGUKKwkJVVNIT1JUCQlCVzQwTUF2YWlsRm9yRzoxOwkJCS8vIDA6ZW5hYmxlLCAxOmRpc2FibGUKKwkJVVNIT1JUCQlFbmFibGVXUFNQQkM6MTsgICAgICAgICAgICAgICAgIC8vIFdQUyBQQkMgQ29udHJvbCBiaXQKKwkJVVNIT1JUCQlCVzQwTVNpZGViYW5kRm9yQToxOworCQlVU0hPUlQJCUJXNDBNU2lkZWJhbmRGb3JHOjE7CisJCVVTSE9SVAkJQ2FyZGJ1c0FjY2VsZXJhdGlvbjoxOwkvLyAhISEgTk9URTogMCAtIGVuYWJsZSwgMSAtIGRpc2FibGUKKwkJVVNIT1JUCQlFeHRlcm5hbExOQUZvckE6MTsJCQkvLyBleHRlcm5hbCBMTkEgZW5hYmxlIGZvciA1RworCQlVU0hPUlQJCUV4dGVybmFsTE5BRm9yRzoxOwkJCS8vIGV4dGVybmFsIExOQSBlbmFibGUgZm9yIDIuNEcKKwkJVVNIT1JUCQlEeW5hbWljVHhBZ2NDb250cm9sOjE7CQkJLy8KKwkJVVNIT1JUCQlIYXJkd2FyZVJhZGlvQ29udHJvbDoxOwkvLyBXaGV0aGVyIFJGIGlzIGNvbnRyb2xsZWQgYnkgZHJpdmVyIG9yIEhXLiAxOmVuYWJsZSBodyBjb250cm9sLCAwOmRpc2FibGUKKwl9CWZpZWxkOworCVVTSE9SVAkJCXdvcmQ7Cit9CUVFUFJPTV9OSUNfQ09ORklHMl9TVFJVQywgKlBFRVBST01fTklDX0NPTkZJRzJfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbiBfRUVQUk9NX05JQ19DSU5GSUcyX1NUUlVDCXsKKwlzdHJ1Y3QgeworCQlVU0hPUlQJCUhhcmR3YXJlUmFkaW9Db250cm9sOjE7CS8vIDE6ZW5hYmxlLCAwOmRpc2FibGUKKwkJVVNIT1JUCQlEeW5hbWljVHhBZ2NDb250cm9sOjE7CQkJLy8KKwkJVVNIT1JUCQlFeHRlcm5hbExOQUZvckc6MTsJCQkJLy8KKwkJVVNIT1JUCQlFeHRlcm5hbExOQUZvckE6MTsJCQkvLyBleHRlcm5hbCBMTkEgZW5hYmxlIGZvciAyLjRHCisJCVVTSE9SVAkJQ2FyZGJ1c0FjY2VsZXJhdGlvbjoxOwkvLyAhISEgTk9URTogMCAtIGVuYWJsZSwgMSAtIGRpc2FibGUKKwkJVVNIT1JUCQlCVzQwTVNpZGViYW5kRm9yRzoxOworCQlVU0hPUlQJCUJXNDBNU2lkZWJhbmRGb3JBOjE7CisJCVVTSE9SVAkJRW5hYmxlV1BTUEJDOjE7ICAgICAgICAgICAgICAgICAvLyBXUFMgUEJDIENvbnRyb2wgYml0CisJCVVTSE9SVAkJQlc0ME1BdmFpbEZvckc6MTsJCQkvLyAwOmVuYWJsZSwgMTpkaXNhYmxlCisJCVVTSE9SVAkJQlc0ME1BdmFpbEZvckE6MTsJCQkvLyAwOmVuYWJsZSwgMTpkaXNhYmxlCisJCVVTSE9SVAkJUnN2Mjo2OyAgICAgICAgICAgICAgICAgLy8gbXVzdCBiZSAwCisJfQlmaWVsZDsKKwlVU0hPUlQJCQl3b3JkOworfQlFRVBST01fTklDX0NPTkZJRzJfU1RSVUMsICpQRUVQUk9NX05JQ19DT05GSUcyX1NUUlVDOworI2VuZGlmCisKKy8vCisvLyBUWF9QV1IgVmFsdWUgdmFsaWQgcmFuZ2UgMHhGQSgtNikgfiAweDI0KDM2KQorLy8KKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9FRVBST01fVFhfUFdSX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlDSEFSCUJ5dGUxOwkJCQkvLyBIaWdoIEJ5dGUKKwkJQ0hBUglCeXRlMDsJCQkJLy8gTG93IEJ5dGUKKwl9CWZpZWxkOworCVVTSE9SVAl3b3JkOworfQlFRVBST01fVFhfUFdSX1NUUlVDLCAqUEVFUFJPTV9UWF9QV1JfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfRUVQUk9NX1RYX1BXUl9TVFJVQwl7CisJc3RydWN0CXsKKwkJQ0hBUglCeXRlMDsJCQkJLy8gTG93IEJ5dGUKKwkJQ0hBUglCeXRlMTsJCQkJLy8gSGlnaCBCeXRlCisJfQlmaWVsZDsKKwlVU0hPUlQJd29yZDsKK30JRUVQUk9NX1RYX1BXUl9TVFJVQywgKlBFRVBST01fVFhfUFdSX1NUUlVDOworI2VuZGlmCisKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9FRVBST01fVkVSU0lPTl9TVFJVQwl7CisJc3RydWN0CXsKKwkJVUNIQVIJVmVyc2lvbjsJCQkvLyBIaWdoIEJ5dGUKKwkJVUNIQVIJRmFlUmVsZWFzZU51bWJlcjsJLy8gTG93IEJ5dGUKKwl9CWZpZWxkOworCVVTSE9SVAl3b3JkOworfQlFRVBST01fVkVSU0lPTl9TVFJVQywgKlBFRVBST01fVkVSU0lPTl9TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9FRVBST01fVkVSU0lPTl9TVFJVQwl7CisJc3RydWN0CXsKKwkJVUNIQVIJRmFlUmVsZWFzZU51bWJlcjsJLy8gTG93IEJ5dGUKKwkJVUNIQVIJVmVyc2lvbjsJCQkvLyBIaWdoIEJ5dGUKKwl9CWZpZWxkOworCVVTSE9SVAl3b3JkOworfQlFRVBST01fVkVSU0lPTl9TVFJVQywgKlBFRVBST01fVkVSU0lPTl9TVFJVQzsKKyNlbmRpZgorCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfRUVQUk9NX0xFRF9TVFJVQwl7CisJc3RydWN0CXsKKwkJVVNIT1JUCVJzdmQ6MzsJCQkJLy8gUmVzZXJ2ZWQKKwkJVVNIT1JUCUxlZE1vZGU6NTsJCQkvLyBMZWQgbW9kZS4KKwkJVVNIT1JUCVBvbGFyaXR5R1BJT180OjE7CS8vIFBvbGFyaXR5IEdQSU8jNCBzZXR0aW5nLgorCQlVU0hPUlQJUG9sYXJpdHlHUElPXzM6MTsJLy8gUG9sYXJpdHkgR1BJTyMzIHNldHRpbmcuCisJCVVTSE9SVAlQb2xhcml0eUdQSU9fMjoxOwkvLyBQb2xhcml0eSBHUElPIzIgc2V0dGluZy4KKwkJVVNIT1JUCVBvbGFyaXR5R1BJT18xOjE7CS8vIFBvbGFyaXR5IEdQSU8jMSBzZXR0aW5nLgorCQlVU0hPUlQJUG9sYXJpdHlHUElPXzA6MTsJLy8gUG9sYXJpdHkgR1BJTyMwIHNldHRpbmcuCisJCVVTSE9SVAlQb2xhcml0eUFDVDoxOwkJLy8gUG9sYXJpdHkgQUNUIHNldHRpbmcuCisJCVVTSE9SVAlQb2xhcml0eVJEWV9BOjE7CQkvLyBQb2xhcml0eSBSRFlfQSBzZXR0aW5nLgorCQlVU0hPUlQJUG9sYXJpdHlSRFlfRzoxOwkJLy8gUG9sYXJpdHkgUkRZX0cgc2V0dGluZy4KKwl9CWZpZWxkOworCVVTSE9SVAl3b3JkOworfQlFRVBST01fTEVEX1NUUlVDLCAqUEVFUFJPTV9MRURfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfRUVQUk9NX0xFRF9TVFJVQwl7CisJc3RydWN0CXsKKwkJVVNIT1JUCVBvbGFyaXR5UkRZX0c6MTsJCS8vIFBvbGFyaXR5IFJEWV9HIHNldHRpbmcuCisJCVVTSE9SVAlQb2xhcml0eVJEWV9BOjE7CQkvLyBQb2xhcml0eSBSRFlfQSBzZXR0aW5nLgorCQlVU0hPUlQJUG9sYXJpdHlBQ1Q6MTsJCS8vIFBvbGFyaXR5IEFDVCBzZXR0aW5nLgorCQlVU0hPUlQJUG9sYXJpdHlHUElPXzA6MTsJLy8gUG9sYXJpdHkgR1BJTyMwIHNldHRpbmcuCisJCVVTSE9SVAlQb2xhcml0eUdQSU9fMToxOwkvLyBQb2xhcml0eSBHUElPIzEgc2V0dGluZy4KKwkJVVNIT1JUCVBvbGFyaXR5R1BJT18yOjE7CS8vIFBvbGFyaXR5IEdQSU8jMiBzZXR0aW5nLgorCQlVU0hPUlQJUG9sYXJpdHlHUElPXzM6MTsJLy8gUG9sYXJpdHkgR1BJTyMzIHNldHRpbmcuCisJCVVTSE9SVAlQb2xhcml0eUdQSU9fNDoxOwkvLyBQb2xhcml0eSBHUElPIzQgc2V0dGluZy4KKwkJVVNIT1JUCUxlZE1vZGU6NTsJCQkvLyBMZWQgbW9kZS4KKwkJVVNIT1JUCVJzdmQ6MzsJCQkJLy8gUmVzZXJ2ZWQKKwl9CWZpZWxkOworCVVTSE9SVAl3b3JkOworfQlFRVBST01fTEVEX1NUUlVDLCAqUEVFUFJPTV9MRURfU1RSVUM7CisjZW5kaWYKKworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX0VFUFJPTV9UWFBPV0VSX0RFTFRBX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVQ0hBUglUeFBvd2VyRW5hYmxlOjE7Ly8gRW5hYmxlCisJCVVDSEFSCVR5cGU6MTsJCQkvLyAxOiBwbHVzIHRoZSBkZWx0YSB2YWx1ZSwgMDogbWludXMgdGhlIGRlbHRhIHZhbHVlCisJCVVDSEFSCURlbHRhVmFsdWU6NjsJLy8gVHggUG93ZXIgZGFsdGEgdmFsdWUgKE1BWD00KQorCX0JZmllbGQ7CisJVUNIQVIJdmFsdWU7Cit9CUVFUFJPTV9UWFBPV0VSX0RFTFRBX1NUUlVDLCAqUEVFUFJPTV9UWFBPV0VSX0RFTFRBX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX0VFUFJPTV9UWFBPV0VSX0RFTFRBX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVQ0hBUglEZWx0YVZhbHVlOjY7CS8vIFR4IFBvd2VyIGRhbHRhIHZhbHVlIChNQVg9NCkKKwkJVUNIQVIJVHlwZToxOwkJCS8vIDE6IHBsdXMgdGhlIGRlbHRhIHZhbHVlLCAwOiBtaW51cyB0aGUgZGVsdGEgdmFsdWUKKwkJVUNIQVIJVHhQb3dlckVuYWJsZToxOy8vIEVuYWJsZQorCX0JZmllbGQ7CisJVUNIQVIJdmFsdWU7Cit9CUVFUFJPTV9UWFBPV0VSX0RFTFRBX1NUUlVDLCAqUEVFUFJPTV9UWFBPV0VSX0RFTFRBX1NUUlVDOworI2VuZGlmCisKKy8vCisvLyBRT1NfQ1NSMDogVFhPUCBob2xkZXIgYWRkcmVzczAgcmVnaXN0ZXIKKy8vCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfUU9TX0NTUjBfU1RSVUMJeworCXN0cnVjdAl7CisJCVVDSEFSCQlCeXRlMzsJCS8vIE1BQyBhZGRyZXNzIGJ5dGUgMworCQlVQ0hBUgkJQnl0ZTI7CQkvLyBNQUMgYWRkcmVzcyBieXRlIDIKKwkJVUNIQVIJCUJ5dGUxOwkJLy8gTUFDIGFkZHJlc3MgYnl0ZSAxCisJCVVDSEFSCQlCeXRlMDsJCS8vIE1BQyBhZGRyZXNzIGJ5dGUgMAorCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JUU9TX0NTUjBfU1RSVUMsICpQUU9TX0NTUjBfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfUU9TX0NTUjBfU1RSVUMJeworCXN0cnVjdAl7CisJCVVDSEFSCQlCeXRlMDsJCS8vIE1BQyBhZGRyZXNzIGJ5dGUgMAorCQlVQ0hBUgkJQnl0ZTE7CQkvLyBNQUMgYWRkcmVzcyBieXRlIDEKKwkJVUNIQVIJCUJ5dGUyOwkJLy8gTUFDIGFkZHJlc3MgYnl0ZSAyCisJCVVDSEFSCQlCeXRlMzsJCS8vIE1BQyBhZGRyZXNzIGJ5dGUgMworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JUU9TX0NTUjBfU1RSVUMsICpQUU9TX0NTUjBfU1RSVUM7CisjZW5kaWYKKworLy8KKy8vIFFPU19DU1IxOiBUWE9QIGhvbGRlciBhZGRyZXNzMSByZWdpc3RlcgorLy8KKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9RT1NfQ1NSMV9TVFJVQwl7CisJc3RydWN0CXsKKwkJVUNIQVIJCVJzdmQxOworCQlVQ0hBUgkJUnN2ZDA7CisJCVVDSEFSCQlCeXRlNTsJCS8vIE1BQyBhZGRyZXNzIGJ5dGUgNQorCQlVQ0hBUgkJQnl0ZTQ7CQkvLyBNQUMgYWRkcmVzcyBieXRlIDQKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVFPU19DU1IxX1NUUlVDLCAqUFFPU19DU1IxX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX1FPU19DU1IxX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVQ0hBUgkJQnl0ZTQ7CQkvLyBNQUMgYWRkcmVzcyBieXRlIDQKKwkJVUNIQVIJCUJ5dGU1OwkJLy8gTUFDIGFkZHJlc3MgYnl0ZSA1CisJCVVDSEFSCQlSc3ZkMDsKKwkJVUNIQVIJCVJzdmQxOworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JUU9TX0NTUjFfU1RSVUMsICpQUU9TX0NTUjFfU1RSVUM7CisjZW5kaWYKKworI2RlZmluZQlSRl9DU1JfQ0ZHCTB4NTAwCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfUkZfQ1NSX0NGR19TVFJVQwl7CisJc3RydWN0CXsKKwkJVUlOVAlSc3ZkMToxNDsJCQkJLy8gUmVzZXJ2ZWQKKwkJVUlOVAlSRl9DU1JfS0lDSzoxOwkJCS8vIGtpY2sgUkYgcmVnaXN0ZXIgcmVhZC93cml0ZQorCQlVSU5UCVJGX0NTUl9XUjoxOwkJCS8vIDA6IHJlYWQgIDE6IHdyaXRlCisJCVVJTlQJUnN2ZDI6MzsJCQkJLy8gUmVzZXJ2ZWQKKwkJVUlOVAlURVNUQ1NSX1JGQUNDX1JFR05VTTo1OwkvLyBSRiByZWdpc3RlciBJRAorCQlVSU5UCVJGX0NTUl9EQVRBOjg7CQkJLy8gREFUQQorCX0JZmllbGQ7CisJVUlOVAl3b3JkOworfQlSRl9DU1JfQ0ZHX1NUUlVDLCAqUFJGX0NTUl9DRkdfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfUkZfQ1NSX0NGR19TVFJVQwl7CisJc3RydWN0CXsKKwkJVUlOVAlSRl9DU1JfREFUQTo4OwkJCS8vIERBVEEKKwkJVUlOVAlURVNUQ1NSX1JGQUNDX1JFR05VTTo1OwkvLyBSRiByZWdpc3RlciBJRAorCQlVSU5UCVJzdmQyOjM7CQkJCS8vIFJlc2VydmVkCisJCVVJTlQJUkZfQ1NSX1dSOjE7CQkJLy8gMDogcmVhZCAgMTogd3JpdGUKKwkJVUlOVAlSRl9DU1JfS0lDSzoxOwkJCS8vIGtpY2sgUkYgcmVnaXN0ZXIgcmVhZC93cml0ZQorCQlVSU5UCVJzdmQxOjE0OwkJCQkvLyBSZXNlcnZlZAorCX0JZmllbGQ7CisJVUlOVAl3b3JkOworfQlSRl9DU1JfQ0ZHX1NUUlVDLCAqUFJGX0NTUl9DRkdfU1RSVUM7CisjZW5kaWYKKworI2VuZGlmCS8vIF9fUlQyOFhYX0hfXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydF9hdGUuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRfYXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjMzMTZlYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRfYXRlLmMKQEAgLTAsMCArMSw2MDI1IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisjaW5jbHVkZSAicnRfY29uZmlnLmgiCisKKyNpZmRlZiBSQUxJTktfQVRFCitVQ0hBUiBUZW1wbGF0ZUZyYW1lWzI0XSA9IHsweDA4LyogRGF0YSB0eXBlICovLDB4MDAsMHgwMCwweDAwLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4MDAsMHhBQSwweEJCLDB4MTIsMHgzNCwweDU2LDB4MDAsMHgxMSwweDIyLDB4QUEsMHhCQiwweENDLDB4MDAsMHgwMH07CS8vIDgwMi4xMSBNQUMgSGVhZGVyLCBUeXBlOkRhdGEsIExlbmd0aDoyNGJ5dGVzCitleHRlcm4gUlRNUF9SRl9SRUdTIFJGMjg1MFJlZ1RhYmxlW107CitleHRlcm4gVUNIQVIgTlVNX09GXzI4NTBfQ0hOTDsKKworc3RhdGljIENIQVIgQ0NLUmF0ZVRhYmxlW10gPSB7MCwgMSwgMiwgMywgOCwgOSwgMTAsIDExLCAtMX07IC8qIENDSyBNb2RlLiAqLworc3RhdGljIENIQVIgT0ZETVJhdGVUYWJsZVtdID0gezAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIC0xfTsgLyogT0ZETSBNb2RlLiAqLworc3RhdGljIENIQVIgSFRNSVhSYXRlVGFibGVbXSA9IHswLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LCAtMX07IC8qIEhUIE1peCBNb2RlLiAqLworCitzdGF0aWMgSU5UIFR4RG1hQnVzeSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK3N0YXRpYyBJTlQgUnhEbWFCdXN5KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKworc3RhdGljIFZPSUQgUnRtcERtYUVuYWJsZSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBJTlQgRW5hYmxlKTsKKworc3RhdGljIFZPSUQgQmJwU29mdFJlc2V0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKworc3RhdGljIFZPSUQgUnRtcFJmSW9Xcml0ZSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK3N0YXRpYyBJTlQgQVRFU2V0VXBGcmFtZSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVSU5UMzIgVHhJZHgpOworCitzdGF0aWMgSU5UIEFURVR4UHdySGFuZGxlcigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBjaGFyIGluZGV4KTsKKworc3RhdGljIElOVCBBVEVDbWRIYW5kbGVyKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK3N0YXRpYyBpbnQgQ2hlY2tNQ1NWYWxpZCgKKwlJTiBVQ0hBUiBNb2RlLAorCUlOIFVDSEFSIE1jcyk7CisKKyNpZmRlZiBSVDI4NjAKK3N0YXRpYyBWT0lEIEFURVdyaXRlVHhXSSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVFhXSV9TVFJVQyAJcE91dFR4V0ksCisJSU4JQk9PTEVBTgkJCUZSQUcsCisJSU4JQk9PTEVBTgkJCUNGQUNLLAorCUlOCUJPT0xFQU4JCQlJbnNUaW1lc3RhbXAsCisJSU4JQk9PTEVBTiAJCUFNUERVLAorCUlOCUJPT0xFQU4gCQlBY2ssCisJSU4JQk9PTEVBTiAJCU5TZXEsCQkvLyBIVyBuZXcgYSBzZXF1ZW5jZS4KKwlJTglVQ0hBUgkJCUJBU2l6ZSwKKwlJTglVQ0hBUgkJCVdDSUQsCisJSU4JVUxPTkcJCQlMZW5ndGgsCisJSU4JVUNIQVIgCQkJUElELAorCUlOCVVDSEFSCQkJVElELAorCUlOCVVDSEFSCQkJVHhSYXRlLAorCUlOCVVDSEFSCQkJVHhvcG1vZGUsCisJSU4JQk9PTEVBTgkJCUNmQWNrLAorCUlOCUhUVFJBTlNNSVRfU0VUVElORwkqcFRyYW5zbWl0KTsKKyNlbmRpZiAvLyBSVDI4NjAgLy8KKworCitzdGF0aWMgVk9JRCBTZXRKYXBhbkZpbHRlcigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCk7CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PWVuZCBvZiBwcm90b3R5cGU9PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2lmZGVmIFJUMjg2MAorc3RhdGljIElOVCBUeERtYUJ1c3koCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJSU5UIHJlc3VsdDsKKwlXUERNQV9HTE9fQ0ZHX1NUUlVDIEdsb0NmZzsKKworCVJUTVBfSU9fUkVBRDMyKHBBZCwgV1BETUFfR0xPX0NGRywgJkdsb0NmZy53b3JkKTsJLy8gZGlzYWJsZSBETUEKKwlpZiAoR2xvQ2ZnLmZpZWxkLlR4RE1BQnVzeSkKKwkJcmVzdWx0ID0gMTsKKwllbHNlCisJCXJlc3VsdCA9IDA7CisKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgSU5UIFJ4RG1hQnVzeSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlJTlQgcmVzdWx0OworCVdQRE1BX0dMT19DRkdfU1RSVUMgR2xvQ2ZnOworCisJUlRNUF9JT19SRUFEMzIocEFkLCBXUERNQV9HTE9fQ0ZHLCAmR2xvQ2ZnLndvcmQpOwkvLyBkaXNhYmxlIERNQQorCWlmIChHbG9DZmcuZmllbGQuUnhETUFCdXN5KQorCQlyZXN1bHQgPSAxOworCWVsc2UKKwkJcmVzdWx0ID0gMDsKKworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBWT0lEIFJ0bXBEbWFFbmFibGUoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gSU5UIEVuYWJsZSkKK3sKKwlCT09MRUFOIHZhbHVlOworCVVMT05HIFdhaXRDbnQ7CisJV1BETUFfR0xPX0NGR19TVFJVQyBHbG9DZmc7CisKKwl2YWx1ZSA9IEVuYWJsZSA+IDAgPyAxIDogMDsKKworCS8vIGNoZWNrIERNQSBpcyBpbiBidXN5IG1vZGUuCisJV2FpdENudCA9IDA7CisJd2hpbGUgKFR4RG1hQnVzeShwQWQpIHx8IFJ4RG1hQnVzeShwQWQpKQorCXsKKwkJUlRNUHVzZWNEZWxheSgxMCk7CisJCWlmIChXYWl0Q250KysgPiAxMDApCisJCQlicmVhazsKKwl9CisKKwlSVE1QX0lPX1JFQUQzMihwQWQsIFdQRE1BX0dMT19DRkcsICZHbG9DZmcud29yZCk7CS8vIGRpc2FibGUgRE1BCisJR2xvQ2ZnLmZpZWxkLkVuYWJsZVR4RE1BID0gdmFsdWU7CisJR2xvQ2ZnLmZpZWxkLkVuYWJsZVJ4RE1BID0gdmFsdWU7CisJUlRNUF9JT19XUklURTMyKHBBZCwgV1BETUFfR0xPX0NGRywgR2xvQ2ZnLndvcmQpOwkvLyBhYm9ydCBhbGwgVFggcmluZ3MKKwlSVE1QdXNlY0RlbGF5KDUwMDApOworCisJcmV0dXJuOworfQorI2VuZGlmIC8vIFJUMjg2MCAvLworCisKK3N0YXRpYyBWT0lEIEJicFNvZnRSZXNldCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlVQ0hBUiBCYnBEYXRhID0gMDsKKworCS8vIFNvZnQgcmVzZXQsIHNldCBCQlAgUjIxIGJpdDA9MS0+MAorCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IyMSwgJkJicERhdGEpOworCUJicERhdGEgfD0gMHgwMDAwMDAwMTsgLy9zZXQgYml0MD0xCisJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IyMSwgQmJwRGF0YSk7CisKKwlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMjEsICZCYnBEYXRhKTsKKwlCYnBEYXRhICY9IH4oMHgwMDAwMDAwMSk7IC8vc2V0IGJpdDA9MAorCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMjEsIEJicERhdGEpOworCisJcmV0dXJuOworfQorCitzdGF0aWMgVk9JRCBSdG1wUmZJb1dyaXRlKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCS8vIFNldCBSRiB2YWx1ZSAxJ3Mgc2V0IFIzW2JpdDJdID0gWzBdCisJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgcEFkLT5MYXRjaFJmUmVncy5SMSk7CisJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgcEFkLT5MYXRjaFJmUmVncy5SMik7CisJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgKHBBZC0+TGF0Y2hSZlJlZ3MuUjMgJiAofjB4MDQpKSk7CisJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgcEFkLT5MYXRjaFJmUmVncy5SNCk7CisKKwlSVE1QdXNlY0RlbGF5KDIwMCk7CisKKwkvLyBTZXQgUkYgdmFsdWUgMidzIHNldCBSM1tiaXQyXSA9IFsxXQorCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIHBBZC0+TGF0Y2hSZlJlZ3MuUjEpOworCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIHBBZC0+TGF0Y2hSZlJlZ3MuUjIpOworCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIChwQWQtPkxhdGNoUmZSZWdzLlIzIHwgMHgwNCkpOworCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIHBBZC0+TGF0Y2hSZlJlZ3MuUjQpOworCisJUlRNUHVzZWNEZWxheSgyMDApOworCisJLy8gU2V0IFJGIHZhbHVlIDMncyBzZXQgUjNbYml0Ml0gPSBbMF0KKwlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCBwQWQtPkxhdGNoUmZSZWdzLlIxKTsKKwlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCBwQWQtPkxhdGNoUmZSZWdzLlIyKTsKKwlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCAocEFkLT5MYXRjaFJmUmVncy5SMyAmICh+MHgwNCkpKTsKKwlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCBwQWQtPkxhdGNoUmZSZWdzLlI0KTsKKworCXJldHVybjsKK30KKworc3RhdGljIGludCBDaGVja01DU1ZhbGlkKAorCVVDSEFSIE1vZGUsCisJVUNIQVIgTWNzKQoreworCWludCBpOworCVBDSEFSIHBSYXRlVGFiOworCisJc3dpdGNoKE1vZGUpCisJeworCQljYXNlIDA6CisJCQlwUmF0ZVRhYiA9IENDS1JhdGVUYWJsZTsKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQlwUmF0ZVRhYiA9IE9GRE1SYXRlVGFibGU7CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQljYXNlIDM6CisJCQlwUmF0ZVRhYiA9IEhUTUlYUmF0ZVRhYmxlOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJ1bnJlY29nbml6YWJsZSBUeCBNb2RlICVkXG4iLCBNb2RlKSk7CisJCQlyZXR1cm4gLTE7CisJCQlicmVhazsKKwl9CisKKwlpID0gMDsKKwl3aGlsZShwUmF0ZVRhYltpXSAhPSAtMSkKKwl7CisJCWlmIChwUmF0ZVRhYltpXSA9PSBNY3MpCisJCQlyZXR1cm4gMDsKKwkJaSsrOworCX0KKworCXJldHVybiAtMTsKK30KKworI2lmIDEKK3N0YXRpYyBJTlQgQVRFVHhQd3JIYW5kbGVyKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIGNoYXIgaW5kZXgpCit7CisJVUxPTkcgUjsKKwlDSEFSIFR4UG93ZXI7CisJVUNIQVIgQmJwOTQgPSAwOworCUJPT0xFQU4gYlBvd2VyUmVkdWNlID0gRkFMU0U7CisKKyNpZmRlZiBSQUxJTktfMjh4eF9RQQorCWlmICgocEFkLT5hdGUuYlFBVHhTdGFydCA9PSBUUlVFKSB8fCAocEFkLT5hdGUuYlFBUnhTdGFydCA9PSBUUlVFKSkKKwl7CisJCS8qIFdoZW4gUUEgaXMgdXNlZCBmb3IgVHgsIHBBZC0+YXRlLlR4UG93ZXIwLzEgYW5kIHJlYWwgdHggcG93ZXIKKwkJKiogYXJlIG5vdCBzeW5jaHJvbml6ZWQuCisJCSovCisvKgorCQlwQWQtPmF0ZS5UeFBvd2VyMCA9IHBBZC0+TGF0Y2hSZlJlZ3MueHh4OworCQlwQWQtPmF0ZS5UeFBvd2VyMSA9IHBBZC0+TGF0Y2hSZlJlZ3MueHh4OworKi8KKwkJcmV0dXJuIDA7CisJfQorCWVsc2UKKyNlbmRpZiAvLyBSQUxJTktfMjh4eF9RQSAvLworCXsKKwkJVHhQb3dlciA9IGluZGV4ID09IDAgPyBwQWQtPmF0ZS5UeFBvd2VyMCA6IHBBZC0+YXRlLlR4UG93ZXIxOworCisJCWlmIChwQWQtPmF0ZS5DaGFubmVsIDw9IDE0KQorCQl7CisJCQlpZiAoVHhQb3dlciA+IDMxKQorCQkJeworCQkJCS8vCisJCQkJLy8gUjMsIFI0IGNhbid0IGxhcmdlIHRoYW4gMzEgKDB4MjQpLCAzMSB+IDM2IHVzZWQgYnkgQkJQIDk0CisJCQkJLy8KKwkJCQlSID0gMzE7CisJCQkJaWYgKFR4UG93ZXIgPD0gMzYpCisJCQkJCUJicDk0ID0gQkJQUjk0X0RFRkFVTFQgKyAoVUNIQVIpKFR4UG93ZXIgLSAzMSk7CisJCQl9CisJCQllbHNlIGlmIChUeFBvd2VyIDwgMCkKKwkJCXsKKwkJCQkvLworCQkJCS8vIFIzLCBSNCBjYW4ndCBsZXNzIHRoYW4gMCwgLTEgfiAtNiB1c2VkIGJ5IEJCUCA5NAorCQkJCS8vCisJCQkJUiA9IDA7CisJCQkJaWYgKFR4UG93ZXIgPj0gLTYpCisJCQkJCUJicDk0ID0gQkJQUjk0X0RFRkFVTFQgKyBUeFBvd2VyOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCS8vIDAgfiAzMQorCQkJCVIgPSAoVUxPTkcpIFR4UG93ZXI7CisJCQkJQmJwOTQgPSBCQlBSOTRfREVGQVVMVDsKKwkJCX0KKworCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXMgKFR4UG93ZXI9JWQsIFI9JWxkLCBCQlBfUjk0PSVkKVxuIiwgX19mdW5jX18sIFR4UG93ZXIsIFIsIEJicDk0KSk7CisJCX0KKwkJZWxzZS8vIDUuNSBHSHoKKwkJeworCQkJaWYgKFR4UG93ZXIgPiAxNSkKKwkJCXsKKwkJCQkvLworCQkJCS8vIFIzLCBSNCBjYW4ndCBsYXJnZSB0aGFuIDE1ICgweDBGKQorCQkJCS8vCisJCQkJUiA9IDE1OworCQkJfQorCQkJZWxzZSBpZiAoVHhQb3dlciA8IDApCisJCQl7CisJCQkJLy8KKwkJCQkvLyBSMywgUjQgY2FuJ3QgbGVzcyB0aGFuIDAKKwkJCQkvLworCQkJCS8vIC0xIH4gLTcKKwkJCQlBU1NFUlQoKFR4UG93ZXIgPj0gLTcpKTsKKwkJCQlSID0gKFVMT05HKShUeFBvd2VyICsgNyk7CisJCQkJYlBvd2VyUmVkdWNlID0gVFJVRTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQkvLyAwIH4gMTUKKwkJCQlSID0gKFVMT05HKSBUeFBvd2VyOworCQkJfQorCisJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcyAoVHhQb3dlcj0lZCwgUj0lbHUpXG4iLCBfX2Z1bmNfXywgVHhQb3dlciwgUikpOworCQl9CisKKwkJaWYgKHBBZC0+YXRlLkNoYW5uZWwgPD0gMTQpCisJCXsKKwkJCWlmIChpbmRleCA9PSAwKQorCQkJeworCQkJCVIgPSBSIDw8IDk7CQkvLyBzaGlmdCBUWCBwb3dlciBjb250cm9sIHRvIGNvcnJlY3QgUkYoUjMpIHJlZ2lzdGVyIGJpdCBwb3NpdGlvbgorCQkJCVIgfD0gKHBBZC0+TGF0Y2hSZlJlZ3MuUjMgJiAweGZmZmZjMWZmKTsKKwkJCQlwQWQtPkxhdGNoUmZSZWdzLlIzID0gUjsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlSID0gUiA8PCA2OwkJLy8gc2hpZnQgVFggcG93ZXIgY29udHJvbCB0byBjb3JyZWN0IFJGKFI0KSByZWdpc3RlciBiaXQgcG9zaXRpb24KKwkJCQlSIHw9IChwQWQtPkxhdGNoUmZSZWdzLlI0ICYgMHhmZmZmZjgzZik7CisJCQkJcEFkLT5MYXRjaFJmUmVncy5SNCA9IFI7CisJCQl9CisJCX0KKwkJZWxzZS8vIDUuNUdIegorCQl7CisJCQlpZiAoYlBvd2VyUmVkdWNlID09IEZBTFNFKQorCQkJeworCQkJCWlmIChpbmRleCA9PSAwKQorCQkJCXsKKwkJCQkJUiA9IChSIDw8IDEwKSB8ICgxIDw8IDkpOwkJLy8gc2hpZnQgVFggcG93ZXIgY29udHJvbCB0byBjb3JyZWN0IFJGKFIzKSByZWdpc3RlciBiaXQgcG9zaXRpb24KKwkJCQkJUiB8PSAocEFkLT5MYXRjaFJmUmVncy5SMyAmIDB4ZmZmZmMxZmYpOworCQkJCQlwQWQtPkxhdGNoUmZSZWdzLlIzID0gUjsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJUiA9IChSIDw8IDcpIHwgKDEgPDwgNik7CQkvLyBzaGlmdCBUWCBwb3dlciBjb250cm9sIHRvIGNvcnJlY3QgUkYoUjQpIHJlZ2lzdGVyIGJpdCBwb3NpdGlvbgorCQkJCQlSIHw9IChwQWQtPkxhdGNoUmZSZWdzLlI0ICYgMHhmZmZmZjgzZik7CisJCQkJCXBBZC0+TGF0Y2hSZlJlZ3MuUjQgPSBSOworCQkJCX0KKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlpZiAoaW5kZXggPT0gMCkKKwkJCQl7CisJCQkJCVIgPSAoUiA8PCAxMCk7CQkvLyBzaGlmdCBUWCBwb3dlciBjb250cm9sIHRvIGNvcnJlY3QgUkYoUjMpIHJlZ2lzdGVyIGJpdCBwb3NpdGlvbgorCQkJCQlSIHw9IChwQWQtPkxhdGNoUmZSZWdzLlIzICYgMHhmZmZmYzFmZik7CisKKwkJCQkJLyogQ2xlYXIgYml0IDkgb2YgUjMgdG8gcmVkdWNlIDdkQi4gKi8KKwkJCQkJcEFkLT5MYXRjaFJmUmVncy5SMyA9IChSICYgKH4oMSA8PCA5KSkpOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlSID0gKFIgPDwgNyk7CQkvLyBzaGlmdCBUWCBwb3dlciBjb250cm9sIHRvIGNvcnJlY3QgUkYoUjQpIHJlZ2lzdGVyIGJpdCBwb3NpdGlvbgorCQkJCQlSIHw9IChwQWQtPkxhdGNoUmZSZWdzLlI0ICYgMHhmZmZmZjgzZik7CisKKwkJCQkJLyogQ2xlYXIgYml0IDYgb2YgUjQgdG8gcmVkdWNlIDdkQi4gKi8KKwkJCQkJcEFkLT5MYXRjaFJmUmVncy5SNCA9IChSICYgKH4oMSA8PCA2KSkpOworCQkJCX0KKwkJCX0KKwkJfQorCisJCVJ0bXBSZklvV3JpdGUocEFkKTsKKworCQlyZXR1cm4gMDsKKwl9Cit9CisjZWxzZS8vIDEgLy8KK3N0YXRpYyBJTlQgQVRFVHhQd3JIYW5kbGVyKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIGNoYXIgaW5kZXgpCit7CisJVUxPTkcgUjsKKwlDSEFSIFR4UG93ZXI7CisJVUNIQVIgQmJwOTQgPSAwOworCisjaWZkZWYgUkFMSU5LXzI4eHhfUUEKKwlpZiAoKHBBZC0+YXRlLmJRQVR4U3RhcnQgPT0gVFJVRSkgfHwgKHBBZC0+YXRlLmJRQVJ4U3RhcnQgPT0gVFJVRSkpCisJeworCQkvLyBUT0RPOiBob3cgdG8gZ2V0IGN1cnJlbnQgVHhQb3dlcjAvMSBmcm9tIHBBZC0+TGF0Y2hSZlJlZ3MgPworCQkvKiBXaGVuIFFBIGlzIHVzZWQgZm9yIFR4LCBwQWQtPmF0ZS5UeFBvd2VyMC8xIGFuZCByZWFsIHR4IHBvd2VyCisJCSoqIGFyZSBub3Qgc3luY2hyb25pemVkLgorCQkqLworLyoKKwkJcEFkLT5hdGUuVHhQb3dlcjAgPSBwQWQtPkxhdGNoUmZSZWdzLnh4eDsKKwkJcEFkLT5hdGUuVHhQb3dlcjEgPSBwQWQtPkxhdGNoUmZSZWdzLnh4eDsKKyovCisJCXJldHVybiAwOworCX0KKwllbHNlCisjZW5kaWYgLy8gUkFMSU5LXzI4eHhfUUEgLy8KKwl7CisJCVR4UG93ZXIgPSBpbmRleCA9PSAwID8gcEFkLT5hdGUuVHhQb3dlcjAgOiBwQWQtPmF0ZS5UeFBvd2VyMTsKKworCWlmIChUeFBvd2VyID4gMzEpCisJeworCQkvLworCQkvLyBSMywgUjQgY2FuJ3QgbGFyZ2UgdGhhbiAzNiAoMHgyNCksIDMxIH4gMzYgdXNlZCBieSBCQlAgOTQKKwkJLy8KKwkJUiA9IDMxOworCQlpZiAoVHhQb3dlciA8PSAzNikKKwkJCUJicDk0ID0gQkJQUjk0X0RFRkFVTFQgKyAoVUNIQVIpKFR4UG93ZXIgLSAzMSk7CisJfQorCWVsc2UgaWYgKFR4UG93ZXIgPCAwKQorCXsKKwkJLy8KKwkJLy8gUjMsIFI0IGNhbid0IGxlc3MgdGhhbiAwLCAtMSB+IC02IHVzZWQgYnkgQkJQIDk0CisJCS8vCisJCVIgPSAwOworCQlpZiAoVHhQb3dlciA+PSAtNikKKwkJCUJicDk0ID0gQkJQUjk0X0RFRkFVTFQgKyBUeFBvd2VyOworCX0KKwllbHNlCisJeworCQkvLyAwIH4gMzEKKwkJUiA9IChVTE9ORykgVHhQb3dlcjsKKwkJQmJwOTQgPSBCQlBSOTRfREVGQVVMVDsKKwl9CisKKwlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcyAoVHhQb3dlcj0lZCwgUjM9JWxkLCBCQlBfUjk0PSVkKVxuIiwgX19mdW5jX18sIFR4UG93ZXIsIFIsIEJicDk0KSk7CisKKwkJaWYgKHBBZC0+YXRlLkNoYW5uZWwgPD0gMTQpCisJCXsKKwlpZiAoaW5kZXggPT0gMCkKKwl7CisJCVIgPSBSIDw8IDk7CQkvLyBzaGlmdCBUWCBwb3dlciBjb250cm9sIHRvIGNvcnJlY3QgUkYoUjMpIHJlZ2lzdGVyIGJpdCBwb3NpdGlvbgorCQlSIHw9IChwQWQtPkxhdGNoUmZSZWdzLlIzICYgMHhmZmZmYzFmZik7CisJCXBBZC0+TGF0Y2hSZlJlZ3MuUjMgPSBSOworCX0KKwllbHNlCisJeworCQlSID0gUiA8PCA2OwkJLy8gc2hpZnQgVFggcG93ZXIgY29udHJvbCB0byBjb3JyZWN0IFJGKFI0KSByZWdpc3RlciBiaXQgcG9zaXRpb24KKwkJUiB8PSAocEFkLT5MYXRjaFJmUmVncy5SNCAmIDB4ZmZmZmY4M2YpOworCQlwQWQtPkxhdGNoUmZSZWdzLlI0ID0gUjsKKwl9CisJCX0KKwkJZWxzZQorCQl7CisJCQlpZiAoaW5kZXggPT0gMCkKKwkJCXsKKwkJCQlSID0gKFIgPDwgMTApIHwgKDEgPDwgOSk7CQkvLyBzaGlmdCBUWCBwb3dlciBjb250cm9sIHRvIGNvcnJlY3QgUkYoUjMpIHJlZ2lzdGVyIGJpdCBwb3NpdGlvbgorCQkJCVIgfD0gKHBBZC0+TGF0Y2hSZlJlZ3MuUjMgJiAweGZmZmZjMWZmKTsKKwkJCQlwQWQtPkxhdGNoUmZSZWdzLlIzID0gUjsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlSID0gKFIgPDwgNykgfCAoMSA8PCA2KTsJCS8vIHNoaWZ0IFRYIHBvd2VyIGNvbnRyb2wgdG8gY29ycmVjdCBSRihSNCkgcmVnaXN0ZXIgYml0IHBvc2l0aW9uCisJCQkJUiB8PSAocEFkLT5MYXRjaFJmUmVncy5SNCAmIDB4ZmZmZmY4M2YpOworCQkJCXBBZC0+TGF0Y2hSZlJlZ3MuUjQgPSBSOworCQkJfQorCQl9CisKKwlSdG1wUmZJb1dyaXRlKHBBZCk7CisKKwlyZXR1cm4gMDsKKwl9Cit9CisjZW5kaWYgLy8gMSAvLworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgQVRFIG9wZXJhdGlvbiBtb2RlIHRvCisgICAgICAgIDAuIEFURVNUQVJUICA9IFN0YXJ0IEFURSBNb2RlCisgICAgICAgIDEuIEFURVNUT1AgICA9IFN0b3AgQVRFIE1vZGUKKyAgICAgICAgMi4gVFhDT05UICAgID0gQ29udGludW91cyBUcmFuc21pdAorICAgICAgICAzLiBUWENBUlIgICAgPSBUcmFuc21pdCBDYXJyaWVyCisgICAgICAgIDQuIFRYRlJBTUUgICA9IFRyYW5zbWl0IEZyYW1lcworICAgICAgICA1LiBSWEZSQU1FICAgPSBSZWNlaXZlIEZyYW1lcworI2lmZGVmIFJBTElOS18yOHh4X1FBCisgICAgICAgIDYuIFRYU1RPUCAgICA9IFN0b3AgQW55IFR5cGUgb2YgVHJhbnNtaXRpb24KKyAgICAgICAgNy4gUlhTVE9QICAgID0gU3RvcCBSZWNlaXZpbmcgRnJhbWVzCisjZW5kaWYgLy8gUkFMSU5LXzI4eHhfUUEgLy8KKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KKyNpZmRlZiBSVDI4NjAKK3N0YXRpYyBJTlQJQVRFQ21kSGFuZGxlcigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJVUlOVDMyCQkJVmFsdWUgPSAwOworCVVDSEFSCQkJQmJwRGF0YTsKKwlVSU5UMzIJCQlNYWNEYXRhID0gMDsKKwlQVFhEX1NUUlVDCQlwVHhEOworCUlOVAkJCQlpbmRleDsKKwlVSU5UCQkJaT0wLCBhdGVtb2RlOworCVBSWERfU1RSVUMJCXBSeEQ7CisJUFJUTVBfVFhfUklORyAJcFR4UmluZyA9ICZwQWQtPlR4UmluZ1tRSURfQUNfQkVdOworI2lmbmRlZiBVQ09TCisJTkRJU19TVEFUVVMJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisjZW5kaWYgLy8gVUNPUyAvLworI2lmZGVmCVJUX0JJR19FTkRJQU4KKyAgICBQVFhEX1NUUlVDICAgICAgcERlc3RUeEQ7CisgICAgVFhEX1NUUlVDICAgICAgIFR4RDsKKyNlbmRpZgorCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT4gQVRFQ21kSGFuZGxlcigpXG4iKSk7CisKKwlBVEVBc2ljU3dpdGNoQ2hhbm5lbChwQWQpOworCUFzaWNMb2NrQ2hhbm5lbChwQWQsIHBBZC0+YXRlLkNoYW5uZWwpOworCisJUlRNUHVzZWNEZWxheSg1MDAwKTsKKworCS8vIHJlYWQgTUFDX1NZU19DVFJMIGFuZCBiYWNrdXAgTUFDX1NZU19DVFJMIHZhbHVlLgorCVJUTVBfSU9fUkVBRDMyKHBBZCwgTUFDX1NZU19DVFJMLCAmTWFjRGF0YSk7CisKKwkvLyBEZWZhdWx0IHZhbHVlIGluIEJCUCBSMjIgaXMgMHgwLgorCUJicERhdGEgPSAwOworCisJLy8gY2xlYW4gYml0NCB0byBzdG9wIGNvbnRpbnVvdXMgVHggcHJvZHVjdGlvbiB0ZXN0LgorCU1hY0RhdGEgJj0gMHhGRkZGRkZFRjsKKworCWlmICghc3RyY21wKGFyZywgIkFURVNUQVJUIikpIAkJLy9FbnRlciBBVEUgbW9kZSBhbmQgc2V0IFR4L1J4IElkbGUKKwl7CisJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFURTogQVRFU1RBUlRcbiIpKTsKKworI2lmbmRlZiBVQ09TCisJCS8vIGNoZWNrIGlmIHdlIGhhdmUgcmVtb3ZlZCB0aGUgZmlybXdhcmUKKwkJaWYgKCEoQVRFX09OKHBBZCkpKQorCQl7CisJCQlOSUNFcmFzZUZpcm13YXJlKHBBZCk7CisJCX0KKyNlbmRpZiAvLyAhVUNPUyAvLworCQlhdGVtb2RlID0gcEFkLT5hdGUuTW9kZTsKKwkJcEFkLT5hdGUuTW9kZSA9IEFURV9TVEFSVDsKKy8vCQlwQWQtPmF0ZS5UeERvbmVDb3VudCA9IHBBZC0+YXRlLlR4Q291bnQ7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgTWFjRGF0YSk7CisKKwkJaWYgKGF0ZW1vZGUgJiBBVEVfVFhDQVJSKQorCQl7CisJCQkvLyBObyBDYXJyaWVyIFRlc3Qgc2V0IEJCUCBSMjIgYml0Nz0wLCBiaXQ2PTAsIGJpdFs1fjBdPTB4MAorCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjIyLCAmQmJwRGF0YSk7CisJCQlCYnBEYXRhICY9IDB4RkZGRkZGMDA7IC8vY2xlYXIgYml0NywgYml0NiwgYml0WzV+MF0KKwkJICAgIEFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMjIsIEJicERhdGEpOworCQl9CisJCWVsc2UgaWYgKGF0ZW1vZGUgJiBBVEVfVFhDQVJSU1VQUCkKKwkJeworCQkJLy8gTm8gQ29udC4gVFggc2V0IEJCUCBSMjIgYml0Nz0wCisJCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMjIsICZCYnBEYXRhKTsKKwkJCUJicERhdGEgJj0gfigxIDw8IDcpOyAvL3NldCBiaXQ3PTAKKwkJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMjIsIEJicERhdGEpOworCisJCQkvLyBObyBDYXJyaWVyIFN1cHByZXNzaW9uIHNldCBCQlAgUjI0IGJpdDA9MAorCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjI0LCAmQmJwRGF0YSk7CisJCQlCYnBEYXRhICY9IDB4RkZGRkZGRkU7IC8vY2xlYXIgYml0MAorCQkgICAgQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IyNCwgQmJwRGF0YSk7CisJCX0KKwkJLy8gV2Ugc2hvdWxkIGZyZWUgc29tZSByZXNvdXJjZSB3aGljaCB3YXMgYWxsb2NhdGVkIHdoZW4gQVRFX1RYRlJBTUUgLCBBVEVfU1RPUCwgYW5kIEFURV9UWENPTlQuCisJCWVsc2UgaWYgKChhdGVtb2RlICYgQVRFX1RYRlJBTUUpIHx8IChhdGVtb2RlID09IEFURV9TVE9QKSkKKwkJeworCQkJUFJUTVBfVFhfUklORyBwVHhSaW5nID0gJnBBZC0+VHhSaW5nW1FJRF9BQ19CRV07CisKKwkJCWlmIChhdGVtb2RlICYgQVRFX1RYQ09OVCkKKwkJCXsKKwkJCQkvLyBObyBDb250LiBUWCBzZXQgQkJQIFIyMiBiaXQ3PTAKKwkJCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMjIsICZCYnBEYXRhKTsKKwkJCQlCYnBEYXRhICY9IH4oMSA8PCA3KTsgLy9zZXQgYml0Nz0wCisJCQkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IyMiwgQmJwRGF0YSk7CisJCQl9CisJCQkvLyBBYm9ydCBUeCwgUnggRE1BLgorCQkJUnRtcERtYUVuYWJsZShwQWQsIDApOworCQkJZm9yIChpPTA7IGk8VFhfUklOR19TSVpFOyBpKyspCisJCQl7CisJCQkJUE5ESVNfUEFDS0VUICBwUGFja2V0OworCisjaWZuZGVmIFJUX0JJR19FTkRJQU4KKwkJCSAgICBwVHhEID0gKFBUWERfU1RSVUMpcEFkLT5UeFJpbmdbUUlEX0FDX0JFXS5DZWxsW2ldLkFsbG9jVmE7CisjZWxzZQorICAgICAgICAJCXBEZXN0VHhEID0gKFBUWERfU1RSVUMpcEFkLT5UeFJpbmdbUUlEX0FDX0JFXS5DZWxsW2ldLkFsbG9jVmE7CisgICAgICAgIAkJVHhEID0gKnBEZXN0VHhEOworICAgICAgICAJCXBUeEQgPSAmVHhEOworICAgICAgICAJCVJUTVBEZXNjcmlwdG9yRW5kaWFuQ2hhbmdlKChQVUNIQVIpcFR4RCwgVFlQRV9UWEQpOworI2VuZGlmCisJCQkJcFR4RC0+RE1BRE9ORSA9IDA7CisJCQkJcFBhY2tldCA9IHBUeFJpbmctPkNlbGxbaV0ucE5kaXNQYWNrZXQ7CisJCQkJaWYgKHBQYWNrZXQpCisJCQkJeworCQkJCQlQQ0lfVU5NQVBfU0lOR0xFKHBBZCwgcFR4RC0+U0RQdHIwLCBwVHhELT5TRExlbjAsIFBDSV9ETUFfVE9ERVZJQ0UpOworCQkJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFBhY2tldCwgTkRJU19TVEFUVVNfU1VDQ0VTUyk7CisJCQkJfQorCQkJCS8vQWx3YXlzIGFzc2lnbiBwTmRpc1BhY2tldCBhcyBOVUxMIGFmdGVyIGNsZWFyCisJCQkJcFR4UmluZy0+Q2VsbFtpXS5wTmRpc1BhY2tldCA9IE5VTEw7CisKKwkJCQlwUGFja2V0ID0gcFR4UmluZy0+Q2VsbFtpXS5wTmV4dE5kaXNQYWNrZXQ7CisJCQkJaWYgKHBQYWNrZXQpCisJCQkJeworCQkJCQlQQ0lfVU5NQVBfU0lOR0xFKHBBZCwgcFR4RC0+U0RQdHIxLCBwVHhELT5TRExlbjEsIFBDSV9ETUFfVE9ERVZJQ0UpOworCQkJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFBhY2tldCwgTkRJU19TVEFUVVNfU1VDQ0VTUyk7CisJCQkJfQorCQkJCS8vQWx3YXlzIGFzc2lnbiBwTmV4dE5kaXNQYWNrZXQgYXMgTlVMTCBhZnRlciBjbGVhcgorCQkJCXBUeFJpbmctPkNlbGxbaV0ucE5leHROZGlzUGFja2V0ID0gTlVMTDsKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJCQkJUlRNUERlc2NyaXB0b3JFbmRpYW5DaGFuZ2UoKFBVQ0hBUilwVHhELCBUWVBFX1RYRCk7CisJCQkJV3JpdGVCYWNrVG9EZXNjcmlwdG9yKChQVUNIQVIpcERlc3RUeEQsIChQVUNIQVIpcFR4RCwgRkFMU0UsIFRZUEVfVFhEKTsKKyNlbmRpZgorCQkJfQorCQkJLy8gU3RhcnQgVHgsIFJYIERNQQorCQkJUnRtcERtYUVuYWJsZShwQWQsIDEpOworCQl9CisJCS8vIHJlc2V0IFJ4IHN0YXRpc3RpY3MuCisJCXBBZC0+YXRlLkxhc3RTTlIwID0gMDsKKwkJcEFkLT5hdGUuTGFzdFNOUjEgPSAwOworCQlwQWQtPmF0ZS5MYXN0UnNzaTAgPSAwOworCQlwQWQtPmF0ZS5MYXN0UnNzaTEgPSAwOworCQlwQWQtPmF0ZS5MYXN0UnNzaTIgPSAwOworCQlwQWQtPmF0ZS5BdmdSc3NpMCA9IDA7CisJCXBBZC0+YXRlLkF2Z1Jzc2kxID0gMDsKKwkJcEFkLT5hdGUuQXZnUnNzaTIgPSAwOworCQlwQWQtPmF0ZS5BdmdSc3NpMFg4ID0gMDsKKwkJcEFkLT5hdGUuQXZnUnNzaTFYOCA9IDA7CisJCXBBZC0+YXRlLkF2Z1Jzc2kyWDggPSAwOworCQlwQWQtPmF0ZS5OdW1PZkF2Z1Jzc2lTYW1wbGUgPSAwOworCisjaWZkZWYgUkFMSU5LXzI4eHhfUUEKKwkJLy8gVHggZnJhbWUKKwkJcEFkLT5hdGUuYlFBVHhTdGFydCA9IEZBTFNFOworCQlwQWQtPmF0ZS5iUUFSeFN0YXJ0ID0gRkFMU0U7CisJCXBBZC0+YXRlLnNlcSA9IDA7CisKKwkJLy8gY291bnRlcnMKKwkJcEFkLT5hdGUuVTJNID0gMDsKKwkJcEFkLT5hdGUuT3RoZXJEYXRhID0gMDsKKwkJcEFkLT5hdGUuQmVhY29uID0gMDsKKwkJcEFkLT5hdGUuT3RoZXJDb3VudCA9IDA7CisJCXBBZC0+YXRlLlR4QWMwID0gMDsKKwkJcEFkLT5hdGUuVHhBYzEgPSAwOworCQlwQWQtPmF0ZS5UeEFjMiA9IDA7CisJCXBBZC0+YXRlLlR4QWMzID0gMDsKKwkJcEFkLT5hdGUuVHhIQ0NBID0gMDsKKwkJcEFkLT5hdGUuVHhNZ210ID0gMDsKKwkJcEFkLT5hdGUuUlNTSTAgPSAwOworCQlwQWQtPmF0ZS5SU1NJMSA9IDA7CisJCXBBZC0+YXRlLlJTU0kyID0gMDsKKwkJcEFkLT5hdGUuU05SMCA9IDA7CisJCXBBZC0+YXRlLlNOUjEgPSAwOworCisJCS8vIGNvbnRyb2wKKwkJcEFkLT5hdGUuVHhEb25lQ291bnQgPSAwOworCQlwQWQtPmF0ZS5UeFN0YXR1cyA9IDA7IC8vIHRhc2sgVHggc3RhdHVzIC8vIDAgLS0+IHRhc2sgaXMgaWRsZSwgMSAtLT4gdGFzayBpcyBydW5uaW5nCisjZW5kaWYgLy8gUkFMSU5LXzI4eHhfUUEgLy8KKworCQkvLyBTb2Z0IHJlc2V0IEJCUC4KKwkJQmJwU29mdFJlc2V0KHBBZCk7CisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQkvLworCQkvLyBMaW5rRG93bigpIGhhcyAiQXNpY0Rpc2FibGVTeW5jKCk7IiBhbmQgIlJUTVBfQkJQX0lPX1IvVzhfQllfUkVHX0lEKCk7IiBpbnNpZGUuCisJCS8vCisvLyAgICAgIExpbmtEb3duKHBBZCwgRkFMU0UpOworLy8JCUFzaWNFbmFibGVCc3NTeW5jKHBBZCk7CisjaWZuZGVmIFVDT1MKKwkJbmV0aWZfc3RvcF9xdWV1ZShwQWQtPm5ldF9kZXYpOworI2VuZGlmIC8vICFVQ09TIC8vCisJCS8vCisJCS8vIElmIHdlIHNraXAgIkxpbmtEb3duKCkiLCB3ZSBzaG91bGQgZGlzYWJsZSBwcm90ZWN0aW9uCisJCS8vIHRvIHByZXZlbnQgZnJvbSBzZW5kaW5nIG91dCBSVFMgb3IgQ1RTLXRvLXNlbGYuCisJCS8vCisJCUFURURpc2FibGVBc2ljUHJvdGVjdChwQWQpOworCQlSVE1QU3RhdGlvblN0b3AocEFkKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCQkvKiBEaXNhYmxlIFR4ICovCisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgTUFDX1NZU19DVFJMLCAmVmFsdWUpOworCQlWYWx1ZSAmPSB+KDEgPDwgMik7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgVmFsdWUpOworCisJCS8qIERpc2FibGUgUnggKi8KKwkJUlRNUF9JT19SRUFEMzIocEFkLCBNQUNfU1lTX0NUUkwsICZWYWx1ZSk7CisJCVZhbHVlICY9IH4oMSA8PCAzKTsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCBWYWx1ZSk7CisJfQorCWVsc2UgaWYgKCFzdHJjbXAoYXJnLCAiQVRFU1RPUCIpKQorCXsKKwkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVRFOiBBVEVTVE9QXG4iKSk7CisKKwkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IyMiwgQmJwRGF0YSk7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgTWFjRGF0YSk7IC8vIHJlY292ZXIgdGhlIE1BQ19TWVNfQ1RSTCByZWdpc3RlciBiYWNrLgorCisJCS8vIERpc2FibGUgVHgsIFJ4CisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgTUFDX1NZU19DVFJMLCAmVmFsdWUpOworCQlWYWx1ZSAmPSAoMHhmZmZmZmZmMyk7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgVmFsdWUpOworCisJCS8vIEFib3J0IFR4LCBSWCBETUEuCisJCVJ0bXBEbWFFbmFibGUocEFkLCAwKTsKKworI2lmbmRlZiBVQ09TCisJCXBBZC0+YXRlLmJGV0xvYWRpbmcgPSBUUlVFOworCQlTdGF0dXMgPSBOSUNMb2FkRmlybXdhcmUocEFkKTsKKwkJaWYgKFN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCQl7CisJCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJOSUNMb2FkRmlybXdhcmUgZmFpbGVkLCBTdGF0dXNbPTB4JTA4eF1cbiIsIFN0YXR1cykpOworCQkJcmV0dXJuIEZBTFNFOworCQl9CisjZW5kaWYgLy8gIVVDT1MgLy8KKwkJcEFkLT5hdGUuTW9kZSA9IEFURV9TVE9QOworCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJLy8KKwkJLy8gRXZlbiB0aGUgZmlybXdhcmUgaGFzIGJlZW4gbG9hZGVkLAorCQkvLyB3ZSBzdGlsbCBjb3VsZCB1c2UgQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQoKS4KKwkJLy8gQnV0IHRoaXMgaXMgbm90IHN1Z2dlc3RlZC4KKwkJLy8KKwkJQmJwU29mdFJlc2V0KHBBZCk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwkJTklDRGlzYWJsZUludGVycnVwdChwQWQpOworCisJCU5JQ0luaXRpYWxpemVBZGFwdGVyKHBBZCwgVFJVRSk7CisKKworCQkvLyBSZWluaXRpYWxpemUgUnggUmluZyBiZWZvcmUgUnggRE1BIGlzIGVuYWJsZWQuCisJCS8vIFRoZSBuaWdodG1hcmUgb2YgPj4+UnhDb2hlcmVudDw8PCB3YXMgZ29uZSAhCisJCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IFJYX1JJTkdfU0laRTsgaW5kZXgrKykKKwkJeworCQkJcFJ4RCA9IChQUlhEX1NUUlVDKSBwQWQtPlJ4UmluZy5DZWxsW2luZGV4XS5BbGxvY1ZhOworCQkJcFJ4RC0+RERPTkUgPSAwOworCQl9CisKKwkJLy8gV2Ugc2hvdWxkIHJlYWQgRUVQUk9NIGZvciBhbGwgY2FzZXMuCisJCU5JQ1JlYWRFRVBST01QYXJhbWV0ZXJzKHBBZCwgTlVMTCk7CisJCU5JQ0luaXRBc2ljRnJvbUVFUFJPTShwQWQpOworCisJCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCwgRkFMU0UpOworCQlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKTsKKworCQkvLworCQkvLyBFbmFibGUgSW50ZXJydXB0CisJCS8vCisKKwkJLy8KKwkJLy8gVGhlc2Ugc3RlcHMgYXJlIG9ubHkgZm9yIEFQQXV0b1NlbGVjdENoYW5uZWwoKS4KKwkJLy8KKyNpZiAwCisJCS8vcEFkLT5iU3RhRmlmb1Rlc3QgPSBUUlVFOworCQlwQWQtPmludF9lbmFibGVfcmVnID0gKChERUxBWUlOVE1BU0spICB8IChSeElOVHxUeERhdGFJbnR8VHhNZ210SW50KSkgJiB+KDB4MDMpOworCQlwQWQtPmludF9kaXNhYmxlX21hc2sgPSAwOworCQlwQWQtPmludF9wZW5kaW5nID0gMDsKKyNlbmRpZgorCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBJTlRfU09VUkNFX0NTUiwgMHhmZmZmZmZmZik7ICAvLyBjbGVhciBnYXJiYWdlIGludGVycnVwdHMKKwkJTklDRW5hYmxlSW50ZXJydXB0KHBBZCk7CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKwkJLyogcmVzdG9yZSBSWF9GSUxUUl9DRkcgKi8KKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJLyogcmVzdG9yZSBSWF9GSUxUUl9DRkcgZHVlIHRvIHRoYXQgUUEgbWF5YmUgc2V0IGl0IHRvIDB4MyAqLworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBSWF9GSUxUUl9DRkcsIFNUQU5PUk1BTCk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisJCS8vIEVuYWJsZSBUeAorCQlSVE1QX0lPX1JFQUQzMihwQWQsIE1BQ19TWVNfQ1RSTCwgJlZhbHVlKTsKKwkJVmFsdWUgfD0gKDEgPDwgMik7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgVmFsdWUpOworCisJCS8vIEVuYWJsZSBUeCwgUnggRE1BLgorCQlSdG1wRG1hRW5hYmxlKHBBZCwgMSk7CisKKwkJLy8gRW5hYmxlIFJ4CisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgTUFDX1NZU19DVFJMLCAmVmFsdWUpOworCQlWYWx1ZSB8PSAoMSA8PCAzKTsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCBWYWx1ZSk7CisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQlSVE1QU3RhdGlvblN0YXJ0KHBBZCk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisjaWZuZGVmIFVDT1MKKwkJbmV0aWZfc3RhcnRfcXVldWUocEFkLT5uZXRfZGV2KTsKKyNlbmRpZiAvLyAhVUNPUyAvLworCX0KKwllbHNlIGlmICghc3RyY21wKGFyZywgIlRYQ0FSUiIpKQkvLyBUeCBDYXJyaWVyCisJeworCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBVEU6IFRYQ0FSUlxuIikpOworCQlwQWQtPmF0ZS5Nb2RlIHw9IEFURV9UWENBUlI7CisKKwkJLy8gUUEgaGFzIGRvbmUgdGhlIGZvbGxvd2luZyBzdGVwcyBpZiBpdCBpcyB1c2VkLgorCQlpZiAocEFkLT5hdGUuYlFBVHhTdGFydCA9PSBGQUxTRSkKKwkJeworCQkJLy8gU29mdCByZXNldCBCQlAuCisJCQlCYnBTb2Z0UmVzZXQocEFkKTsKKworCQkJLy8gQ2FycmllciBUZXN0IHNldCBCQlAgUjIyIGJpdDc9MSwgYml0Nj0xLCBiaXRbNX4wXT0weDAxCisJCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMjIsICZCYnBEYXRhKTsKKwkJCUJicERhdGEgJj0gMHhGRkZGRkYwMDsgLy9jbGVhciBiaXQ3LCBiaXQ2LCBiaXRbNX4wXQorCQkJQmJwRGF0YSB8PSAweDAwMDAwMEMxOyAvL3NldCBiaXQ3PTEsIGJpdDY9MSwgYml0WzV+MF09MHgwMQorCQkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IyMiwgQmJwRGF0YSk7CisKKwkJCS8vIHNldCBNQUNfU1lTX0NUUkwoMHgxMDA0KSBDb250aW51b3VzIFR4IFByb2R1Y3Rpb24gVGVzdCAoYml0NCkgPSAxCisJCQlSVE1QX0lPX1JFQUQzMihwQWQsIE1BQ19TWVNfQ1RSTCwgJlZhbHVlKTsKKwkJCVZhbHVlID0gVmFsdWUgfCAweDAwMDAwMDEwOworCQkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCBWYWx1ZSk7CisJCX0KKwl9CisJZWxzZSBpZiAoIXN0cmNtcChhcmcsICJUWENPTlQiKSkJLy8gVHggQ29udGludWUKKwl7CisJCWlmIChwQWQtPmF0ZS5iUUFUeFN0YXJ0ID09IFRSVUUpCisJCXsKKwkJCS8qIHNldCBNQUNfU1lTX0NUUkwoMHgxMDA0KSBiaXQ0KENvbnRpbnVvdXMgVHggUHJvZHVjdGlvbiBUZXN0KQorCQkJICAgYW5kIGJpdDIoTUFDIFRYIGVuYWJsZSkgYmFjayB0byB6ZXJvLiAqLworCQkJUlRNUF9JT19SRUFEMzIocEFkLCBNQUNfU1lTX0NUUkwsICZNYWNEYXRhKTsKKwkJCU1hY0RhdGEgJj0gMHhGRkZGRkZFQjsKKwkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgTWFjRGF0YSk7CisKKwkJCS8vIHNldCBCQlAgUjIyIGJpdDc9MAorCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjIyLCAmQmJwRGF0YSk7CisJCQlCYnBEYXRhICY9IDB4RkZGRkZGN0Y7IC8vc2V0IGJpdDc9MAorCQkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IyMiwgQmJwRGF0YSk7CisJCX0KKworCQkvKiBmb3IgVHhDb250IG1vZGUuCisJCSoqIFN0ZXAgMTogU2VuZCA1MCBwYWNrZXRzIGZpcnN0IHRoZW4gd2FpdCBmb3IgYSBtb21lbnQuCisJCSoqIFN0ZXAgMjogU2VuZCBtb3JlIDUwIHBhY2tldCB0aGVuIHN0YXJ0IGNvbnRpbnVlIG1vZGUuCisJCSovCisJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFURTogVFhDT05UXG4iKSk7CisJCS8vIFN0ZXAgMTogc2VuZCA1MCBwYWNrZXRzIGZpcnN0LgorCQlwQWQtPmF0ZS5Nb2RlIHw9IEFURV9UWENPTlQ7CisJCXBBZC0+YXRlLlR4Q291bnQgPSA1MDsKKyAgICAgICAgICAgICAgICAvKiBEbyBpdCBhZnRlciBUeC9SeCBETUEgaXMgYWJvcnRlZC4gKi8KKy8vCQlwQWQtPmF0ZS5UeERvbmVDb3VudCA9IDA7CisKKwkJLy8gU29mdCByZXNldCBCQlAuCisJCUJicFNvZnRSZXNldChwQWQpOworCisJCS8vIEFib3J0IFR4LCBSWCBETUEuCisJCVJ0bXBEbWFFbmFibGUocEFkLCAwKTsKKworCQkvLyBGaXggY2FuJ3Qgc21vb3RoIGtpY2sKKwkJeworCQkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9EVFhfSURYMCArIFFJRF9BQ19CRSAqIDB4MTAsICAmcFR4UmluZy0+VHhEbWFJZHgpOworCQkJcFR4UmluZy0+VHhTd0ZyZWVJZHggPSBwVHhSaW5nLT5UeERtYUlkeDsKKwkJCXBUeFJpbmctPlR4Q3B1SWR4ID0gcFR4UmluZy0+VHhEbWFJZHg7CisJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9DVFhfSURYMCArIFFJRF9BQ19CRSAqIDB4MTAsIHBUeFJpbmctPlR4Q3B1SWR4KTsKKwkJfQorCisJCXBBZC0+YXRlLlR4RG9uZUNvdW50ID0gMDsKKworCQkvKiBPbmx5IG5lZWRlZCBpZiB3ZSBoYXZlIHRvIHNlbmQgc29tZSBub3JtYWwgZnJhbWVzLiAqLworCQlTZXRKYXBhbkZpbHRlcihwQWQpOworCisJCWZvciAoaSA9IDA7IChpIDwgVFhfUklOR19TSVpFLTEpICYmIChpIDwgcEFkLT5hdGUuVHhDb3VudCk7IGkrKykKKwkJeworCQkJUE5ESVNfUEFDS0VUIHBQYWNrZXQ7CisJCQlVSU5UMzIgVHhJZHggPSBwVHhSaW5nLT5UeENwdUlkeDsKKworI2lmbmRlZiBSVF9CSUdfRU5ESUFOCisJCQlwVHhEID0gKFBUWERfU1RSVUMpcFR4UmluZy0+Q2VsbFtUeElkeF0uQWxsb2NWYTsKKyNlbHNlCisJCQlwRGVzdFR4RCA9IChQVFhEX1NUUlVDKXBUeFJpbmctPkNlbGxbVHhJZHhdLkFsbG9jVmE7CisJCQlUeEQgPSAqcERlc3RUeEQ7CisJCQlwVHhEID0gJlR4RDsKKwkJCVJUTVBEZXNjcmlwdG9yRW5kaWFuQ2hhbmdlKChQVUNIQVIpcFR4RCwgVFlQRV9UWEQpOworI2VuZGlmCisJCQkvLyBDbGVhbiBjdXJyZW50IGNlbGwuCisJCQlwUGFja2V0ID0gcFR4UmluZy0+Q2VsbFtUeElkeF0ucE5kaXNQYWNrZXQ7CisJCQlpZiAocFBhY2tldCkKKwkJCXsKKwkJCQlQQ0lfVU5NQVBfU0lOR0xFKHBBZCwgcFR4RC0+U0RQdHIwLCBwVHhELT5TRExlbjAsIFBDSV9ETUFfVE9ERVZJQ0UpOworCQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19TVUNDRVNTKTsKKwkJCX0KKwkJCS8vQWx3YXlzIGFzc2lnbiBwTmRpc1BhY2tldCBhcyBOVUxMIGFmdGVyIGNsZWFyCisJCQlwVHhSaW5nLT5DZWxsW1R4SWR4XS5wTmRpc1BhY2tldCA9IE5VTEw7CisKKwkJCXBQYWNrZXQgPSBwVHhSaW5nLT5DZWxsW1R4SWR4XS5wTmV4dE5kaXNQYWNrZXQ7CisJCQlpZiAocFBhY2tldCkKKwkJCXsKKwkJCQlQQ0lfVU5NQVBfU0lOR0xFKHBBZCwgcFR4RC0+U0RQdHIxLCBwVHhELT5TRExlbjEsIFBDSV9ETUFfVE9ERVZJQ0UpOworCQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19TVUNDRVNTKTsKKwkJCX0KKwkJCS8vQWx3YXlzIGFzc2lnbiBwTmV4dE5kaXNQYWNrZXQgYXMgTlVMTCBhZnRlciBjbGVhcgorCQkJcFR4UmluZy0+Q2VsbFtUeElkeF0ucE5leHROZGlzUGFja2V0ID0gTlVMTDsKKworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwkJCVJUTVBEZXNjcmlwdG9yRW5kaWFuQ2hhbmdlKChQVUNIQVIpcFR4RCwgVFlQRV9UWEQpOworCQkJV3JpdGVCYWNrVG9EZXNjcmlwdG9yKChQVUNIQVIpcERlc3RUeEQsIChQVUNIQVIpcFR4RCwgRkFMU0UsIFRZUEVfVFhEKTsKKyNlbmRpZgorCisJCQlpZiAoQVRFU2V0VXBGcmFtZShwQWQsIFR4SWR4KSAhPSAwKQorCQkJCWJyZWFrOworCisJCQlJTkNfUklOR19JTkRFWChwVHhSaW5nLT5UeENwdUlkeCwgVFhfUklOR19TSVpFKTsKKwkJfQorCisgICAgICAgICAgICAgICAgLy8gU2V0dXAgZnJhbWUgZm9ybWF0LgorCQlBVEVTZXRVcEZyYW1lKHBBZCwgcFR4UmluZy0+VHhDcHVJZHgpOworCisJCS8vIFN0YXJ0IFR4LCBSWCBETUEuCisJCVJ0bXBEbWFFbmFibGUocEFkLCAxKTsKKworCQkvLyBFbmFibGUgVHgKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBNQUNfU1lTX0NUUkwsICZWYWx1ZSk7CisJCVZhbHVlIHw9ICgxIDw8IDIpOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIFZhbHVlKTsKKworCQkvLyBEaXNhYmxlIFJ4CisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgTUFDX1NZU19DVFJMLCAmVmFsdWUpOworCQlWYWx1ZSAmPSB+KDEgPDwgMyk7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgVmFsdWUpOworCisjaWZkZWYgUkFMSU5LXzI4eHhfUUEKKwkJaWYgKHBBZC0+YXRlLmJRQVR4U3RhcnQgPT0gVFJVRSkKKwkJeworCQkJcEFkLT5hdGUuVHhTdGF0dXMgPSAxOworCQkJLy9wQWQtPmF0ZS5SZXBlYXQgPSAwOworCQl9CisjZW5kaWYgLy8gUkFMSU5LXzI4eHhfUUEgLy8KKworCQkvLyBraWNrIFR4LVJpbmcuCisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX0NUWF9JRFgwICsgUUlEX0FDX0JFICogUklOR1JFR19ESUZGLCBwQWQtPlR4UmluZ1tRSURfQUNfQkVdLlR4Q3B1SWR4KTsKKworCQlSVE1QdXNlY0RlbGF5KDUwMDApOworCisKKwkJLy8gU3RlcCAyOiBzZW5kIG1vcmUgNTAgcGFja2V0cyB0aGVuIHN0YXJ0IGNvbnRpbnVlIG1vZGUuCisJCS8vIEFib3J0IFR4LCBSWCBETUEuCisJCVJ0bXBEbWFFbmFibGUocEFkLCAwKTsKKworCQkvLyBDb250LiBUWCBzZXQgQkJQIFIyMiBiaXQ3PTEKKwkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjIyLCAmQmJwRGF0YSk7CisJCUJicERhdGEgfD0gMHgwMDAwMDA4MDsgLy9zZXQgYml0Nz0xCisJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMjIsIEJicERhdGEpOworCisJCXBBZC0+YXRlLlR4Q291bnQgPSA1MDsKKworCQkvLyBGaXggY2FuJ3Qgc21vb3RoIGtpY2sKKwkJeworCQkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9EVFhfSURYMCArIFFJRF9BQ19CRSAqIDB4MTAsICAmcFR4UmluZy0+VHhEbWFJZHgpOworCQkJcFR4UmluZy0+VHhTd0ZyZWVJZHggPSBwVHhSaW5nLT5UeERtYUlkeDsKKwkJCXBUeFJpbmctPlR4Q3B1SWR4ID0gcFR4UmluZy0+VHhEbWFJZHg7CisJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9DVFhfSURYMCArIFFJRF9BQ19CRSAqIDB4MTAsIHBUeFJpbmctPlR4Q3B1SWR4KTsKKwkJfQorCisJCXBBZC0+YXRlLlR4RG9uZUNvdW50ID0gMDsKKworCQlTZXRKYXBhbkZpbHRlcihwQWQpOworCisJCWZvciAoaSA9IDA7IChpIDwgVFhfUklOR19TSVpFLTEpICYmIChpIDwgcEFkLT5hdGUuVHhDb3VudCk7IGkrKykKKwkJeworCQkJUE5ESVNfUEFDS0VUIHBQYWNrZXQ7CisJCQlVSU5UMzIgVHhJZHggPSBwVHhSaW5nLT5UeENwdUlkeDsKKworI2lmbmRlZiBSVF9CSUdfRU5ESUFOCisJCQlwVHhEID0gKFBUWERfU1RSVUMpcFR4UmluZy0+Q2VsbFtUeElkeF0uQWxsb2NWYTsKKyNlbHNlCisJCQlwRGVzdFR4RCA9IChQVFhEX1NUUlVDKXBUeFJpbmctPkNlbGxbVHhJZHhdLkFsbG9jVmE7CisJCQlUeEQgPSAqcERlc3RUeEQ7CisJCQlwVHhEID0gJlR4RDsKKwkJCVJUTVBEZXNjcmlwdG9yRW5kaWFuQ2hhbmdlKChQVUNIQVIpcFR4RCwgVFlQRV9UWEQpOworI2VuZGlmCisJCQkvLyBjbGVhbiBjdXJyZW50IGNlbGwuCisJCQlwUGFja2V0ID0gcFR4UmluZy0+Q2VsbFtUeElkeF0ucE5kaXNQYWNrZXQ7CisJCQlpZiAocFBhY2tldCkKKwkJCXsKKwkJCQlQQ0lfVU5NQVBfU0lOR0xFKHBBZCwgcFR4RC0+U0RQdHIwLCBwVHhELT5TRExlbjAsIFBDSV9ETUFfVE9ERVZJQ0UpOworCQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19TVUNDRVNTKTsKKwkJCX0KKwkJCS8vQWx3YXlzIGFzc2lnbiBwTmRpc1BhY2tldCBhcyBOVUxMIGFmdGVyIGNsZWFyCisJCQlwVHhSaW5nLT5DZWxsW1R4SWR4XS5wTmRpc1BhY2tldCA9IE5VTEw7CisKKwkJCXBQYWNrZXQgPSBwVHhSaW5nLT5DZWxsW1R4SWR4XS5wTmV4dE5kaXNQYWNrZXQ7CisJCQlpZiAocFBhY2tldCkKKwkJCXsKKwkJCQlQQ0lfVU5NQVBfU0lOR0xFKHBBZCwgcFR4RC0+U0RQdHIxLCBwVHhELT5TRExlbjEsIFBDSV9ETUFfVE9ERVZJQ0UpOworCQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19TVUNDRVNTKTsKKwkJCX0KKwkJCS8vQWx3YXlzIGFzc2lnbiBwTmV4dE5kaXNQYWNrZXQgYXMgTlVMTCBhZnRlciBjbGVhcgorCQkJcFR4UmluZy0+Q2VsbFtUeElkeF0ucE5leHROZGlzUGFja2V0ID0gTlVMTDsKKworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwkJCVJUTVBEZXNjcmlwdG9yRW5kaWFuQ2hhbmdlKChQVUNIQVIpcFR4RCwgVFlQRV9UWEQpOworCQkJV3JpdGVCYWNrVG9EZXNjcmlwdG9yKChQVUNIQVIpcERlc3RUeEQsIChQVUNIQVIpcFR4RCwgRkFMU0UsIFRZUEVfVFhEKTsKKyNlbmRpZgorCisJCQlpZiAoQVRFU2V0VXBGcmFtZShwQWQsIFR4SWR4KSAhPSAwKQorCQkJCWJyZWFrOworCisJCQlJTkNfUklOR19JTkRFWChwVHhSaW5nLT5UeENwdUlkeCwgVFhfUklOR19TSVpFKTsKKwkJfQorCisJCUFURVNldFVwRnJhbWUocEFkLCBwVHhSaW5nLT5UeENwdUlkeCk7CisKKwkJLy8gU3RhcnQgVHgsIFJYIERNQS4KKwkJUnRtcERtYUVuYWJsZShwQWQsIDEpOworCisJCS8vIEVuYWJsZSBUeAorCQlSVE1QX0lPX1JFQUQzMihwQWQsIE1BQ19TWVNfQ1RSTCwgJlZhbHVlKTsKKwkJVmFsdWUgfD0gKDEgPDwgMik7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgVmFsdWUpOworCisJCS8vIERpc2FibGUgUngKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBNQUNfU1lTX0NUUkwsICZWYWx1ZSk7CisJCVZhbHVlICY9IH4oMSA8PCAzKTsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCBWYWx1ZSk7CisKKyNpZmRlZiBSQUxJTktfMjh4eF9RQQorCQlpZiAocEFkLT5hdGUuYlFBVHhTdGFydCA9PSBUUlVFKQorCQl7CisJCQlwQWQtPmF0ZS5UeFN0YXR1cyA9IDE7CisJCQkvL3BBZC0+YXRlLlJlcGVhdCA9IDA7CisJCX0KKyNlbmRpZiAvLyBSQUxJTktfMjh4eF9RQSAvLworCisJCS8vIGtpY2sgVHgtUmluZy4KKwkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfQ1RYX0lEWDAgKyBRSURfQUNfQkUgKiBSSU5HUkVHX0RJRkYsIHBBZC0+VHhSaW5nW1FJRF9BQ19CRV0uVHhDcHVJZHgpOworCisJCVJUTVB1c2VjRGVsYXkoNTAwKTsKKworCQlSVE1QX0lPX1JFQUQzMihwQWQsIE1BQ19TWVNfQ1RSTCwgJk1hY0RhdGEpOworCQlNYWNEYXRhIHw9IDB4MDAwMDAwMTA7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgTWFjRGF0YSk7CisJfQorCWVsc2UgaWYgKCFzdHJjbXAoYXJnLCAiVFhGUkFNRSIpKSAvLyBUeCBGcmFtZXMKKwl7CisJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFURTogVFhGUkFNRShDb3VudD0lZClcbiIsIHBBZC0+YXRlLlR4Q291bnQpKTsKKwkJcEFkLT5hdGUuTW9kZSB8PSBBVEVfVFhGUkFNRTsKKwkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IyMiwgQmJwRGF0YSk7CisKKwkJLy8gU29mdCByZXNldCBCQlAuCisJCUJicFNvZnRSZXNldChwQWQpOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIE1hY0RhdGEpOworCisJCS8vIEFib3J0IFR4LCBSWCBETUEuCisJCVJ0bXBEbWFFbmFibGUocEFkLCAwKTsKKworCQkvLyBGaXggY2FuJ3Qgc21vb3RoIGtpY2sKKwkJeworCQkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9EVFhfSURYMCArIFFJRF9BQ19CRSAqIDB4MTAsICAmcFR4UmluZy0+VHhEbWFJZHgpOworCQkJcFR4UmluZy0+VHhTd0ZyZWVJZHggPSBwVHhSaW5nLT5UeERtYUlkeDsKKwkJCXBUeFJpbmctPlR4Q3B1SWR4ID0gcFR4UmluZy0+VHhEbWFJZHg7CisJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9DVFhfSURYMCArIFFJRF9BQ19CRSAqIDB4MTAsIHBUeFJpbmctPlR4Q3B1SWR4KTsKKwkJfQorCisJCXBBZC0+YXRlLlR4RG9uZUNvdW50ID0gMDsKKworCQlTZXRKYXBhbkZpbHRlcihwQWQpOworCisJCWZvciAoaSA9IDA7IChpIDwgVFhfUklOR19TSVpFLTEpICYmIChpIDwgcEFkLT5hdGUuVHhDb3VudCk7IGkrKykKKwkJeworCQkJUE5ESVNfUEFDS0VUIHBQYWNrZXQ7CisJCQlVSU5UMzIgVHhJZHggPSBwVHhSaW5nLT5UeENwdUlkeDsKKworI2lmbmRlZiBSVF9CSUdfRU5ESUFOCisJCQlwVHhEID0gKFBUWERfU1RSVUMpcFR4UmluZy0+Q2VsbFtUeElkeF0uQWxsb2NWYTsKKyNlbHNlCisJCQlwRGVzdFR4RCA9IChQVFhEX1NUUlVDKXBUeFJpbmctPkNlbGxbVHhJZHhdLkFsbG9jVmE7CisJCQlUeEQgPSAqcERlc3RUeEQ7CisJCQlwVHhEID0gJlR4RDsKKwkJCVJUTVBEZXNjcmlwdG9yRW5kaWFuQ2hhbmdlKChQVUNIQVIpcFR4RCwgVFlQRV9UWEQpOworI2VuZGlmCisJCQkvLyBDbGVhbiBjdXJyZW50IGNlbGwuCisJCQlwUGFja2V0ID0gcFR4UmluZy0+Q2VsbFtUeElkeF0ucE5kaXNQYWNrZXQ7CisJCQlpZiAocFBhY2tldCkKKwkJCXsKKwkJCQlQQ0lfVU5NQVBfU0lOR0xFKHBBZCwgcFR4RC0+U0RQdHIwLCBwVHhELT5TRExlbjAsIFBDSV9ETUFfVE9ERVZJQ0UpOworCQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19TVUNDRVNTKTsKKwkJCX0KKwkJCS8vQWx3YXlzIGFzc2lnbiBwTmRpc1BhY2tldCBhcyBOVUxMIGFmdGVyIGNsZWFyCisJCQlwVHhSaW5nLT5DZWxsW1R4SWR4XS5wTmRpc1BhY2tldCA9IE5VTEw7CisKKwkJCXBQYWNrZXQgPSBwVHhSaW5nLT5DZWxsW1R4SWR4XS5wTmV4dE5kaXNQYWNrZXQ7CisJCQlpZiAocFBhY2tldCkKKwkJCXsKKwkJCQlQQ0lfVU5NQVBfU0lOR0xFKHBBZCwgcFR4RC0+U0RQdHIxLCBwVHhELT5TRExlbjEsIFBDSV9ETUFfVE9ERVZJQ0UpOworCQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19TVUNDRVNTKTsKKwkJCX0KKwkJCS8vQWx3YXlzIGFzc2lnbiBwTmV4dE5kaXNQYWNrZXQgYXMgTlVMTCBhZnRlciBjbGVhcgorCQkJcFR4UmluZy0+Q2VsbFtUeElkeF0ucE5leHROZGlzUGFja2V0ID0gTlVMTDsKKworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwkJCVJUTVBEZXNjcmlwdG9yRW5kaWFuQ2hhbmdlKChQVUNIQVIpcFR4RCwgVFlQRV9UWEQpOworCQkJV3JpdGVCYWNrVG9EZXNjcmlwdG9yKChQVUNIQVIpcERlc3RUeEQsIChQVUNIQVIpcFR4RCwgRkFMU0UsIFRZUEVfVFhEKTsKKyNlbmRpZgorCisJCQlpZiAoQVRFU2V0VXBGcmFtZShwQWQsIFR4SWR4KSAhPSAwKQorCQkJCWJyZWFrOworCisJCQlJTkNfUklOR19JTkRFWChwVHhSaW5nLT5UeENwdUlkeCwgVFhfUklOR19TSVpFKTsKKworCQl9CisKKwkJQVRFU2V0VXBGcmFtZShwQWQsIHBUeFJpbmctPlR4Q3B1SWR4KTsKKworCQkvLyBTdGFydCBUeCwgUnggRE1BLgorCQlSdG1wRG1hRW5hYmxlKHBBZCwgMSk7CisKKwkJLy8gRW5hYmxlIFR4CisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgTUFDX1NZU19DVFJMLCAmVmFsdWUpOworCQlWYWx1ZSB8PSAoMSA8PCAyKTsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCBWYWx1ZSk7CisjaWZkZWYgUkFMSU5LXzI4eHhfUUEKKwkJLy8gYWRkIHRoaXMgZm9yIExvb3BCYWNrIG1vZGUKKwkJaWYgKHBBZC0+YXRlLmJRQVJ4U3RhcnQgPT0gRkFMU0UpCisJCXsKKwkJCS8vIERpc2FibGUgUngKKwkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgTUFDX1NZU19DVFJMLCAmVmFsdWUpOworCQkJVmFsdWUgJj0gfigxIDw8IDMpOworCQkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCBWYWx1ZSk7CisJCX0KKworCQlpZiAocEFkLT5hdGUuYlFBVHhTdGFydCA9PSBUUlVFKQorCQl7CisJCQlwQWQtPmF0ZS5UeFN0YXR1cyA9IDE7CisJCQkvL3BBZC0+YXRlLlJlcGVhdCA9IDA7CisJCX0KKyNlbHNlCisJCS8vIERpc2FibGUgUngKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBNQUNfU1lTX0NUUkwsICZWYWx1ZSk7CisJCVZhbHVlICY9IH4oMSA8PCAzKTsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCBWYWx1ZSk7CisjZW5kaWYgLy8gUkFMSU5LXzI4eHhfUUEgLy8KKworCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0RUWF9JRFgwICsgUUlEX0FDX0JFICogUklOR1JFR19ESUZGLCAmcEFkLT5UeFJpbmdbUUlEX0FDX0JFXS5UeERtYUlkeCk7CisJCS8vIGtpY2sgVHgtUmluZy4KKwkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfQ1RYX0lEWDAgKyBRSURfQUNfQkUgKiBSSU5HUkVHX0RJRkYsIHBBZC0+VHhSaW5nW1FJRF9BQ19CRV0uVHhDcHVJZHgpOworCisJCXBBZC0+UmFsaW5rQ291bnRlcnMuS2lja1R4Q291bnQrKzsKKwl9CisjaWZkZWYgUkFMSU5LXzI4eHhfUUEKKwllbHNlIGlmICghc3RyY21wKGFyZywgIlRYU1RPUCIpKQorCXsKKwkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVRFOiBUWFNUT1BcbiIpKTsKKwkJYXRlbW9kZSA9IHBBZC0+YXRlLk1vZGU7CisJCXBBZC0+YXRlLk1vZGUgJj0gQVRFX1RYU1RPUDsKKwkJcEFkLT5hdGUuYlFBVHhTdGFydCA9IEZBTFNFOworLy8JCXBBZC0+YXRlLlR4RG9uZUNvdW50ID0gcEFkLT5hdGUuVHhDb3VudDsKKworCQlpZiAoYXRlbW9kZSAmIEFURV9UWENBUlIpCisJCXsKKwkJCS8vIE5vIENhcnJpZXIgVGVzdCBzZXQgQkJQIFIyMiBiaXQ3PTAsIGJpdDY9MCwgYml0WzV+MF09MHgwCisJCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMjIsICZCYnBEYXRhKTsKKwkJCUJicERhdGEgJj0gMHhGRkZGRkYwMDsgLy9jbGVhciBiaXQ3LCBiaXQ2LCBiaXRbNX4wXQorCQkgICAgQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IyMiwgQmJwRGF0YSk7CisJCX0KKwkJZWxzZSBpZiAoYXRlbW9kZSAmIEFURV9UWENBUlJTVVBQKQorCQl7CisJCQkvLyBObyBDb250LiBUWCBzZXQgQkJQIFIyMiBiaXQ3PTAKKwkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IyMiwgJkJicERhdGEpOworCQkJQmJwRGF0YSAmPSB+KDEgPDwgNyk7IC8vc2V0IGJpdDc9MAorCQkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IyMiwgQmJwRGF0YSk7CisKKwkJCS8vIE5vIENhcnJpZXIgU3VwcHJlc3Npb24gc2V0IEJCUCBSMjQgYml0MD0wCisJCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMjQsICZCYnBEYXRhKTsKKwkJCUJicERhdGEgJj0gMHhGRkZGRkZGRTsgLy9jbGVhciBiaXQwCisJCSAgICBBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjI0LCBCYnBEYXRhKTsKKwkJfQorCQkvLyBXZSBzaG91bGQgZnJlZSBzb21lIHJlc291cmNlIHdoaWNoIGFsbG9jYXRlIHdoZW4gQVRFX1RYRlJBTUUgLCBBVEVfU1RPUCwgYW5kIEFURV9UWENPTlQuCisJCWVsc2UgaWYgKChhdGVtb2RlICYgQVRFX1RYRlJBTUUpIHx8IChhdGVtb2RlID09IEFURV9TVE9QKSkKKwkJeworCisJCQlQUlRNUF9UWF9SSU5HIHBUeFJpbmcgPSAmcEFkLT5UeFJpbmdbUUlEX0FDX0JFXTsKKworCQkJaWYgKGF0ZW1vZGUgJiBBVEVfVFhDT05UKQorCQkJeworCQkJCS8vIE5vIENvbnQuIFRYIHNldCBCQlAgUjIyIGJpdDc9MAorCQkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IyMiwgJkJicERhdGEpOworCQkJCUJicERhdGEgJj0gfigxIDw8IDcpOyAvL3NldCBiaXQ3PTAKKwkJCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjIyLCBCYnBEYXRhKTsKKwkJCX0KKworCQkJLy8gQWJvcnQgVHgsIFJ4IERNQS4KKwkJCVJ0bXBEbWFFbmFibGUocEFkLCAwKTsKKwkJCWZvciAoaT0wOyBpPFRYX1JJTkdfU0laRTsgaSsrKQorCQkJeworCQkJCVBORElTX1BBQ0tFVCAgcFBhY2tldDsKKworI2lmbmRlZiBSVF9CSUdfRU5ESUFOCisJCQkgICAgcFR4RCA9IChQVFhEX1NUUlVDKXBBZC0+VHhSaW5nW1FJRF9BQ19CRV0uQ2VsbFtpXS5BbGxvY1ZhOworI2Vsc2UKKyAgICAgICAgCQlwRGVzdFR4RCA9IChQVFhEX1NUUlVDKXBBZC0+VHhSaW5nW1FJRF9BQ19CRV0uQ2VsbFtpXS5BbGxvY1ZhOworICAgICAgICAJCVR4RCA9ICpwRGVzdFR4RDsKKyAgICAgICAgCQlwVHhEID0gJlR4RDsKKyAgICAgICAgCQlSVE1QRGVzY3JpcHRvckVuZGlhbkNoYW5nZSgoUFVDSEFSKXBUeEQsIFRZUEVfVFhEKTsKKyNlbmRpZgorCQkJCXBUeEQtPkRNQURPTkUgPSAwOworCQkJCXBQYWNrZXQgPSBwVHhSaW5nLT5DZWxsW2ldLnBOZGlzUGFja2V0OworCQkJCWlmIChwUGFja2V0KQorCQkJCXsKKwkJCQkJUENJX1VOTUFQX1NJTkdMRShwQWQsIHBUeEQtPlNEUHRyMCwgcFR4RC0+U0RMZW4wLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOworCQkJCX0KKwkJCQkvL0Fsd2F5cyBhc3NpZ24gcE5kaXNQYWNrZXQgYXMgTlVMTCBhZnRlciBjbGVhcgorCQkJCXBUeFJpbmctPkNlbGxbaV0ucE5kaXNQYWNrZXQgPSBOVUxMOworCisJCQkJcFBhY2tldCA9IHBUeFJpbmctPkNlbGxbaV0ucE5leHROZGlzUGFja2V0OworCQkJCWlmIChwUGFja2V0KQorCQkJCXsKKwkJCQkJUENJX1VOTUFQX1NJTkdMRShwQWQsIHBUeEQtPlNEUHRyMSwgcFR4RC0+U0RMZW4xLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOworCQkJCX0KKwkJCQkvL0Fsd2F5cyBhc3NpZ24gcE5leHROZGlzUGFja2V0IGFzIE5VTEwgYWZ0ZXIgY2xlYXIKKwkJCQlwVHhSaW5nLT5DZWxsW2ldLnBOZXh0TmRpc1BhY2tldCA9IE5VTEw7CisjaWZkZWYgUlRfQklHX0VORElBTgorCQkJCVJUTVBEZXNjcmlwdG9yRW5kaWFuQ2hhbmdlKChQVUNIQVIpcFR4RCwgVFlQRV9UWEQpOworCQkJCVdyaXRlQmFja1RvRGVzY3JpcHRvcigoUFVDSEFSKXBEZXN0VHhELCAoUFVDSEFSKXBUeEQsIEZBTFNFLCBUWVBFX1RYRCk7CisjZW5kaWYKKwkJCX0KKwkJCS8vIEVuYWJsZSBUeCwgUnggRE1BCisJCQlSdG1wRG1hRW5hYmxlKHBBZCwgMSk7CisKKwkJfQorCisJCS8vIGNvbnRyb2wKKy8vCQlwQWQtPmF0ZS5UeERvbmVDb3VudCA9IDA7CisJCXBBZC0+YXRlLlR4U3RhdHVzID0gMDsgLy8gdGFzayBUeCBzdGF0dXMgLy8gMCAtLT4gdGFzayBpcyBpZGxlLCAxIC0tPiB0YXNrIGlzIHJ1bm5pbmcKKworCQkvLyBTb2Z0IHJlc2V0IEJCUC4KKwkJQmJwU29mdFJlc2V0KHBBZCk7CisKKwkJLy8gRGlzYWJsZSBUeAorCQlSVE1QX0lPX1JFQUQzMihwQWQsIE1BQ19TWVNfQ1RSTCwgJlZhbHVlKTsKKwkJVmFsdWUgJj0gfigxIDw8IDIpOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIFZhbHVlKTsKKwl9CisJZWxzZSBpZiAoIXN0cmNtcChhcmcsICJSWFNUT1AiKSkKKwl7CisJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFURTogUlhTVE9QXG4iKSk7CisJCWF0ZW1vZGUgPSBwQWQtPmF0ZS5Nb2RlOworCQlwQWQtPmF0ZS5Nb2RlICY9IEFURV9SWFNUT1A7CisJCXBBZC0+YXRlLmJRQVJ4U3RhcnQgPSBGQUxTRTsKKy8vCQlwQWQtPmF0ZS5UeERvbmVDb3VudCA9IHBBZC0+YXRlLlR4Q291bnQ7CisKKwkJaWYgKGF0ZW1vZGUgJiBBVEVfVFhDQVJSKQorCQl7CisJCQk7CisJCX0KKwkJZWxzZSBpZiAoYXRlbW9kZSAmIEFURV9UWENBUlJTVVBQKQorCQl7CisJCQk7CisJCX0KKworCQkvLyBXZSBzaG91bGQgZnJlZSBzb21lIHJlc291cmNlIHdoaWNoIHdhcyBhbGxvY2F0ZWQgd2hlbiBBVEVfVFhGUkFNRSAsIEFURV9TVE9QLCBhbmQgQVRFX1RYQ09OVC4KKwkJZWxzZSBpZiAoKGF0ZW1vZGUgJiBBVEVfVFhGUkFNRSkgfHwgKGF0ZW1vZGUgPT0gQVRFX1NUT1ApKQorCQl7CisJCQlpZiAoYXRlbW9kZSAmIEFURV9UWENPTlQpCisJCQl7CisJCQkJOworCQkJfQorCQl9CisKKwkJLy8gY29udHJvbAorLy8JCXBBZC0+YXRlLlR4RG9uZUNvdW50ID0gMDsKKy8vCQlwQWQtPmF0ZS5UeFN0YXR1cyA9IDA7IC8vIHRhc2sgVHggc3RhdHVzIC8vIDAgLS0+IHRhc2sgaXMgaWRsZSwgMSAtLT4gdGFzayBpcyBydW5uaW5nCisKKwkJLy8gU29mdCByZXNldCBCQlAuCisJCUJicFNvZnRSZXNldChwQWQpOworCisJCS8vIERpc2FibGUgUngKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBNQUNfU1lTX0NUUkwsICZWYWx1ZSk7CisJCVZhbHVlICY9IH4oMSA8PCAzKTsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCBWYWx1ZSk7CisJfQorI2VuZGlmIC8vIFJBTElOS18yOHh4X1FBIC8vCisJZWxzZSBpZiAoIXN0cmNtcChhcmcsICJSWEZSQU1FIikpIC8vIFJ4IEZyYW1lcworCXsKKwkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVRFOiBSWEZSQU1FXG4iKSk7CisKKwkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IyMiwgQmJwRGF0YSk7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgTWFjRGF0YSk7CisKKwkJcEFkLT5hdGUuTW9kZSB8PSBBVEVfUlhGUkFNRTsKKworCQkvLyBEaXNhYmxlIFR4IG9mIE1BQyBibG9jay4KKwkJUlRNUF9JT19SRUFEMzIocEFkLCBNQUNfU1lTX0NUUkwsICZWYWx1ZSk7CisJCVZhbHVlICY9IH4oMSA8PCAyKTsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCBWYWx1ZSk7CisKKwkJLy8gRW5hYmxlIFJ4IG9mIE1BQyBibG9jay4KKwkJUlRNUF9JT19SRUFEMzIocEFkLCBNQUNfU1lTX0NUUkwsICZWYWx1ZSk7CisJCVZhbHVlIHw9ICgxIDw8IDMpOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIFZhbHVlKTsKKwl9CisJZWxzZQorCXsKKwkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVRFOiBJbnZhbGlkIGFyZyFcbiIpKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKwlSVE1QdXNlY0RlbGF5KDUwMDApOworCisJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPD09PSBBVEVDbWRIYW5kbGVyKClcbiIpKTsKKworCXJldHVybiBUUlVFOworfQorI2VuZGlmIC8vIFJUMjg2MCAvLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qPT09PT09PT09PT09PT09PT09PT09PT1FbmQgb2YgUlQyODYwPT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKy8qPT09PT09PT09PT09PT09PT09PT09PVN0YXJ0IG9mIFJUMjg3MD09PT09PT09PT09PT09PT09PT09PT0qLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworCitJTlQJU2V0X0FURV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlpZiAoQVRFQ21kSGFuZGxlcihwQWQsIGFyZykpCisJeworCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSYWxpbms6IFNldF9BVEVfUHJvYyBTdWNjZXNzXG4iKSk7CisKKworCQlyZXR1cm4gVFJVRTsKKwl9CisJZWxzZQorCXsKKwkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmFsaW5rOiBTZXRfQVRFX1Byb2MgRmFpbGVkXG4iKSk7CisJCXJldHVybiBGQUxTRTsKKwl9Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IEFURSBBRERSMT1EQSBmb3IgVHhGcmFtZShBUCAgOiBUbyBEUyA9IDAgOyBGcm9tIERTID0gMSkKKyAgICAgICAgb3IKKyAgICAgICAgU2V0IEFURSBBRERSMz1EQSBmb3IgVHhGcmFtZShTVEEgOiBUbyBEUyA9IDEgOyBGcm9tIERTID0gMCkKKworICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UCVNldF9BVEVfREFfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJQ0hBUgkJCQkqdmFsdWU7CisJSU5UCQkJCQlpOworCisJaWYoc3RybGVuKGFyZykgIT0gMTcpICAvL01hYyBhZGRyZXNzIGFjY2VwdGFibGUgZm9ybWF0IDAxOjAyOjAzOjA0OjA1OjA2IGxlbmd0aCAxNworCQlyZXR1cm4gRkFMU0U7CisKKyAgICBmb3IgKGk9MCwgdmFsdWUgPSByc3RydG9rKGFyZywgIjoiKTsgdmFsdWU7IHZhbHVlID0gcnN0cnRvayhOVUxMLCAiOiIpKQorCXsKKwkJaWYoKHN0cmxlbih2YWx1ZSkgIT0gMikgfHwgKCFpc3hkaWdpdCgqdmFsdWUpKSB8fCAoIWlzeGRpZ2l0KCoodmFsdWUrMSkpKSApCisJCQlyZXR1cm4gRkFMU0U7ICAvL0ludmFsaWQKKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCUF0b0godmFsdWUsICZwQWQtPmF0ZS5BZGRyM1tpKytdLCAxKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwl9CisKKwlpZihpICE9IDYpCisJCXJldHVybiBGQUxTRTsgIC8vSW52YWxpZAorCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfQVRFX0RBX1Byb2MgKERBID0gJTJYOiUyWDolMlg6JTJYOiUyWDolMlgpXG4iLCBwQWQtPmF0ZS5BZGRyM1swXSwKKwkJcEFkLT5hdGUuQWRkcjNbMV0sIHBBZC0+YXRlLkFkZHIzWzJdLCBwQWQtPmF0ZS5BZGRyM1szXSwgcEFkLT5hdGUuQWRkcjNbNF0sIHBBZC0+YXRlLkFkZHIzWzVdKSk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSYWxpbms6IFNldF9BVEVfREFfUHJvYyBTdWNjZXNzXG4iKSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgQVRFIEFERFIzPVNBIGZvciBUeEZyYW1lKEFQICA6IFRvIERTID0gMCA7IEZyb20gRFMgPSAxKQorICAgICAgICBvcgorICAgICAgICBTZXQgQVRFIEFERFIyPVNBIGZvciBUeEZyYW1lKFNUQSA6IFRvIERTID0gMSA7IEZyb20gRFMgPSAwKQorCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQJU2V0X0FURV9TQV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlDSEFSCQkJCSp2YWx1ZTsKKwlJTlQJCQkJCWk7CisKKwlpZihzdHJsZW4oYXJnKSAhPSAxNykgIC8vTWFjIGFkZHJlc3MgYWNjZXB0YWJsZSBmb3JtYXQgMDE6MDI6MDM6MDQ6MDU6MDYgbGVuZ3RoIDE3CisJCXJldHVybiBGQUxTRTsKKworICAgIGZvciAoaT0wLCB2YWx1ZSA9IHJzdHJ0b2soYXJnLCAiOiIpOyB2YWx1ZTsgdmFsdWUgPSByc3RydG9rKE5VTEwsICI6IikpCisJeworCQlpZigoc3RybGVuKHZhbHVlKSAhPSAyKSB8fCAoIWlzeGRpZ2l0KCp2YWx1ZSkpIHx8ICghaXN4ZGlnaXQoKih2YWx1ZSsxKSkpICkKKwkJCXJldHVybiBGQUxTRTsgIC8vSW52YWxpZAorCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJQXRvSCh2YWx1ZSwgJnBBZC0+YXRlLkFkZHIyW2krK10sIDEpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCX0KKworCWlmKGkgIT0gNikKKwkJcmV0dXJuIEZBTFNFOyAgLy9JbnZhbGlkCisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9BVEVfU0FfUHJvYyAoU0EgPSAlMlg6JTJYOiUyWDolMlg6JTJYOiUyWClcbiIsIHBBZC0+YXRlLkFkZHIyWzBdLAorCQlwQWQtPmF0ZS5BZGRyMlsxXSwgcEFkLT5hdGUuQWRkcjJbMl0sIHBBZC0+YXRlLkFkZHIyWzNdLCBwQWQtPmF0ZS5BZGRyMls0XSwgcEFkLT5hdGUuQWRkcjJbNV0pKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJhbGluazogU2V0X0FURV9TQV9Qcm9jIFN1Y2Nlc3NcbiIpKTsKKworCXJldHVybiBUUlVFOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBBVEUgQUREUjI9QlNTSUQgZm9yIFR4RnJhbWUoQVAgIDogVG8gRFMgPSAwIDsgRnJvbSBEUyA9IDEpCisgICAgICAgIG9yCisgICAgICAgIFNldCBBVEUgQUREUjE9QlNTSUQgZm9yIFR4RnJhbWUoU1RBIDogVG8gRFMgPSAxIDsgRnJvbSBEUyA9IDApCisKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVAlTZXRfQVRFX0JTU0lEX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCUNIQVIJCQkJKnZhbHVlOworCUlOVAkJCQkJaTsKKworCWlmKHN0cmxlbihhcmcpICE9IDE3KSAgLy9NYWMgYWRkcmVzcyBhY2NlcHRhYmxlIGZvcm1hdCAwMTowMjowMzowNDowNTowNiBsZW5ndGggMTcKKwkJcmV0dXJuIEZBTFNFOworCisgICAgZm9yIChpPTAsIHZhbHVlID0gcnN0cnRvayhhcmcsICI6Iik7IHZhbHVlOyB2YWx1ZSA9IHJzdHJ0b2soTlVMTCwgIjoiKSkKKwl7CisJCWlmKChzdHJsZW4odmFsdWUpICE9IDIpIHx8ICghaXN4ZGlnaXQoKnZhbHVlKSkgfHwgKCFpc3hkaWdpdCgqKHZhbHVlKzEpKSkgKQorCQkJcmV0dXJuIEZBTFNFOyAgLy9JbnZhbGlkCisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQlBdG9IKHZhbHVlLCAmcEFkLT5hdGUuQWRkcjFbaSsrXSwgMSk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJfQorCisJaWYoaSAhPSA2KQorCQlyZXR1cm4gRkFMU0U7ICAvL0ludmFsaWQKKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0FURV9CU1NJRF9Qcm9jIChCU1NJRCA9ICUyWDolMlg6JTJYOiUyWDolMlg6JTJYKVxuIiwJcEFkLT5hdGUuQWRkcjFbMF0sCisJCXBBZC0+YXRlLkFkZHIxWzFdLCBwQWQtPmF0ZS5BZGRyMVsyXSwgcEFkLT5hdGUuQWRkcjFbM10sIHBBZC0+YXRlLkFkZHIxWzRdLCBwQWQtPmF0ZS5BZGRyMVs1XSkpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmFsaW5rOiBTZXRfQVRFX0JTU0lEX1Byb2MgU3VjY2Vzc1xuIikpOworCisJcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IEFURSBUeCBDaGFubmVsCisKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVAlTZXRfQVRFX0NIQU5ORUxfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJVUNIQVIgY2hhbm5lbDsKKworCWNoYW5uZWwgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCisJaWYgKChjaGFubmVsIDwgMSkgfHwgKGNoYW5uZWwgPiAyMTYpKS8vIHRvIGFsbG93IEEgYmFuZCBjaGFubmVsIDogKChjaGFubmVsIDwgMSkgfHwgKGNoYW5uZWwgPiAxNCkpCisJeworCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJTZXRfQVRFX0NIQU5ORUxfUHJvYzo6T3V0IG9mIHJhbmdlLCBpdCBzaG91bGQgYmUgaW4gcmFuZ2Ugb2YgMX4xNC5cbiIpKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKwlwQWQtPmF0ZS5DaGFubmVsID0gY2hhbm5lbDsKKworCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9BVEVfQ0hBTk5FTF9Qcm9jIChBVEUgQ2hhbm5lbCA9ICVkKVxuIiwgcEFkLT5hdGUuQ2hhbm5lbCkpOworCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJhbGluazogU2V0X0FURV9DSEFOTkVMX1Byb2MgU3VjY2Vzc1xuIikpOworCisKKwlyZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgQVRFIFR4IFBvd2VyMAorCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQJU2V0X0FURV9UWF9QT1dFUjBfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJQ0hBUiBUeFBvd2VyOworCisJVHhQb3dlciA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisKKwlpZiAocEFkLT5hdGUuQ2hhbm5lbCA8PSAxNCkKKwl7CisJCWlmICgoVHhQb3dlciA+IDMxKSB8fCAoVHhQb3dlciA8IDApKQorCQl7CisJCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJTZXRfQVRFX1RYX1BPV0VSMF9Qcm9jOjpPdXQgb2YgcmFuZ2UgKFZhbHVlPSVkKVxuIiwgVHhQb3dlcikpOworCQkJcmV0dXJuIEZBTFNFOworCQl9CisJfQorCWVsc2UvLyA1LjVHSHoKKwl7CisJCWlmICgoVHhQb3dlciA+IDE1KSB8fCAoVHhQb3dlciA8IC03KSkKKwkJeworCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiU2V0X0FURV9UWF9QT1dFUjBfUHJvYzo6T3V0IG9mIHJhbmdlIChWYWx1ZT0lZClcbiIsIFR4UG93ZXIpKTsKKwkJCXJldHVybiBGQUxTRTsKKwkJfQorCX0KKworCXBBZC0+YXRlLlR4UG93ZXIwID0gVHhQb3dlcjsKKwlBVEVUeFB3ckhhbmRsZXIocEFkLCAwKTsKKwlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSYWxpbms6IFNldF9BVEVfVFhfUE9XRVIwX1Byb2MgU3VjY2Vzc1xuIikpOworCisKKwlyZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgQVRFIFR4IFBvd2VyMQorCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQJU2V0X0FURV9UWF9QT1dFUjFfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJQ0hBUiBUeFBvd2VyOworCisJVHhQb3dlciA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisKKwlpZiAocEFkLT5hdGUuQ2hhbm5lbCA8PSAxNCkKKwl7CisJaWYgKChUeFBvd2VyID4gMzEpIHx8IChUeFBvd2VyIDwgMCkpCisJeworCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJTZXRfQVRFX1RYX1BPV0VSMV9Qcm9jOjpPdXQgb2YgcmFuZ2UgKFZhbHVlPSVkKVxuIiwgVHhQb3dlcikpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCX0KKwllbHNlCisJeworCQlpZiAoKFR4UG93ZXIgPiAxNSkgfHwgKFR4UG93ZXIgPCAtNykpCisJCXsKKwkJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlNldF9BVEVfVFhfUE9XRVIxX1Byb2M6Ok91dCBvZiByYW5nZSAoVmFsdWU9JWQpXG4iLCBUeFBvd2VyKSk7CisJCQlyZXR1cm4gRkFMU0U7CisJCX0KKwl9CisKKwlwQWQtPmF0ZS5UeFBvd2VyMSA9IFR4UG93ZXI7CisJQVRFVHhQd3JIYW5kbGVyKHBBZCwgMSk7CisJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmFsaW5rOiBTZXRfQVRFX1RYX1BPV0VSMV9Qcm9jIFN1Y2Nlc3NcbiIpKTsKKworCisJcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IEFURSBUeCBBbnRlbm5hCisKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVAlTZXRfQVRFX1RYX0FudGVubmFfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJQ0hBUiB2YWx1ZTsKKworCXZhbHVlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKworCWlmICgodmFsdWUgPiAyKSB8fCAodmFsdWUgPCAwKSkKKwl7CisJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlNldF9BVEVfVFhfQW50ZW5uYV9Qcm9jOjpPdXQgb2YgcmFuZ2UgKFZhbHVlPSVkKVxuIiwgdmFsdWUpKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCXBBZC0+YXRlLlR4QW50ZW5uYVNlbCA9IHZhbHVlOworCisJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0FURV9UWF9BbnRlbm5hX1Byb2MgKEFudGVubmEgPSAlZClcbiIsIHBBZC0+YXRlLlR4QW50ZW5uYVNlbCkpOworCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUmFsaW5rOiBTZXRfQVRFX1RYX0FudGVubmFfUHJvYyBTdWNjZXNzXG4iKSk7CisKKworCXJldHVybiBUUlVFOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBBVEUgUnggQW50ZW5uYQorCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQJU2V0X0FURV9SWF9BbnRlbm5hX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCUNIQVIgdmFsdWU7CisKKwl2YWx1ZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisKKwlpZiAoKHZhbHVlID4gMykgfHwgKHZhbHVlIDwgMCkpCisJeworCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJTZXRfQVRFX1JYX0FudGVubmFfUHJvYzo6T3V0IG9mIHJhbmdlIChWYWx1ZT0lZClcbiIsIHZhbHVlKSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlwQWQtPmF0ZS5SeEFudGVubmFTZWwgPSB2YWx1ZTsKKworCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9BVEVfUlhfQW50ZW5uYV9Qcm9jIChBbnRlbm5hID0gJWQpXG4iLCBwQWQtPmF0ZS5SeEFudGVubmFTZWwpKTsKKwlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSYWxpbms6IFNldF9BVEVfUlhfQW50ZW5uYV9Qcm9jIFN1Y2Nlc3NcbiIpKTsKKworCisJcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IEFURSBSRiBmcmVxdWVuY2Ugb2Zmc2V0CisKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVAlTZXRfQVRFX1RYX0ZSRVFPRkZTRVRfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJVUNIQVIgUkZGcmVxT2Zmc2V0OworCVVMT05HIFI0OworCisJUkZGcmVxT2Zmc2V0ID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKworCWlmKFJGRnJlcU9mZnNldCA+PSA2NCkKKwl7CisJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlNldF9BVEVfVFhfRlJFUU9GRlNFVF9Qcm9jOjpPdXQgb2YgcmFuZ2UsIGl0IHNob3VsZCBiZSBpbiByYW5nZSBvZiAwfjYzLlxuIikpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJcEFkLT5hdGUuUkZGcmVxT2Zmc2V0ID0gUkZGcmVxT2Zmc2V0OworCVI0ID0gcEFkLT5hdGUuUkZGcmVxT2Zmc2V0IDw8IDE1OwkJLy8gc2hpZnQgVFggcG93ZXIgY29udHJvbCB0byBjb3JyZWN0IFJGIHJlZ2lzdGVyIGJpdCBwb3NpdGlvbgorCVI0IHw9IChwQWQtPkxhdGNoUmZSZWdzLlI0ICYgKCh+MHgwMDFmODAwMCkpKTsKKwlwQWQtPkxhdGNoUmZSZWdzLlI0ID0gUjQ7CisKKwlSdG1wUmZJb1dyaXRlKHBBZCk7CisKKwlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfQVRFX1RYX0ZSRVFPRkZTRVRfUHJvYyAoUkZGcmVxT2Zmc2V0ID0gJWQpXG4iLCBwQWQtPmF0ZS5SRkZyZXFPZmZzZXQpKTsKKwlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSYWxpbms6IFNldF9BVEVfVFhfRlJFUU9GRlNFVF9Qcm9jIFN1Y2Nlc3NcbiIpKTsKKworCisJcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IEFURSBSRiBCVworCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQJU2V0X0FURV9UWF9CV19Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlpbnQgaTsKKwlVQ0hBUiB2YWx1ZSA9IDA7CisJVUNIQVIgQkJQQ3VycmVudEJXOworCisJQkJQQ3VycmVudEJXID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKworCWlmKEJCUEN1cnJlbnRCVyA9PSAwKQorCQlwQWQtPmF0ZS5UeFdJLkJXID0gQldfMjA7CisJZWxzZQorCQlwQWQtPmF0ZS5UeFdJLkJXID0gQldfNDA7CisKKwlpZihwQWQtPmF0ZS5UeFdJLkJXID09IEJXXzIwKQorCXsKKwkJaWYocEFkLT5hdGUuQ2hhbm5lbCA8PSAxNCkKKwkJeworIAkJZm9yIChpPTA7IGk8NTsgaSsrKQorIAkJeworCQkJCWlmIChwQWQtPlR4MjBNUHdyQ2ZnR0JhbmRbaV0gIT0gMHhmZmZmZmZmZikKKwkJCQl7CisJCQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX1BXUl9DRkdfMCArIGkqNCwgcEFkLT5UeDIwTVB3ckNmZ0dCYW5kW2ldKTsKKwkJCQkJUlRNUHVzZWNEZWxheSg1MDAwKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQlmb3IgKGk9MDsgaTw1OyBpKyspCisJCQl7CisJCQkJaWYgKHBBZC0+VHgyME1Qd3JDZmdBQmFuZFtpXSAhPSAweGZmZmZmZmZmKQorIAkJCXsKKwkJCQkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfUFdSX0NGR18wICsgaSo0LCBwQWQtPlR4MjBNUHdyQ2ZnQUJhbmRbaV0pOworIAkJCQlSVE1QdXNlY0RlbGF5KDUwMDApOworIAkJCX0KKyAJCX0KKwkJfQorCisJCS8vU2V0IEJCUCBSNCBiaXRbNDozXT0wOjAKKyAJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCAmdmFsdWUpOworIAkJdmFsdWUgJj0gKH4weDE4KTsKKyAJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgdmFsdWUpOworCisgIAkJLy9TZXQgQkJQIFI2Nj0weDNDCisgCQl2YWx1ZSA9IDB4M0M7CisgCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY2LCB2YWx1ZSk7CisJCS8vU2V0IEJCUCBSNjg9MHgwQgorCQkvL3RvIGltcHJvdmUgUnggc2Vuc2l0aXZpdHkuCisJCXZhbHVlID0gMHgwQjsKKwkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2OCwgdmFsdWUpOworCQkvL1NldCBCQlAgUjY5PTB4MTYKKwkJdmFsdWUgPSAweDE2OworIAkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2OSwgdmFsdWUpOworCQkvL1NldCBCQlAgUjcwPTB4MDgKKwkJdmFsdWUgPSAweDA4OworIAkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I3MCwgdmFsdWUpOworCQkvL1NldCBCQlAgUjczPTB4MTEKKwkJdmFsdWUgPSAweDExOworIAkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I3MywgdmFsdWUpOworCisJICAgIC8vIElmIENoYW5uZWw9MTQsIEJhbmR3aWR0aD0yME0gYW5kIE1vZGU9Q0NLLCBTZXQgQkJQIFI0IGJpdDU9MQorCSAgICAvLyAoSmFwYW4gZmlsdGVyIGNvZWZmaWNpZW50cykKKwkgICAgLy8gVGhpcyBzZWdtZW50IG9mIGNvZGUgd2lsbCBvbmx5IHdvcmtzIHdoZW4gQVRFVFhNT0RFIGFuZCBBVEVDSEFOTkVMCisJICAgIC8vIHdlcmUgc2V0IHRvIE1PREVfQ0NLIGFuZCAxNCByZXNwZWN0aXZlbHkgYmVmb3JlIEFURVRYQlcgaXMgc2V0IHRvIDAuCisJICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJCWlmIChwQWQtPmF0ZS5DaGFubmVsID09IDE0KQorCQl7CisJCQlpbnQgVHhNb2RlID0gcEFkLT5hdGUuVHhXSS5QSFlNT0RFOworCQkJaWYgKFR4TW9kZSA9PSBNT0RFX0NDSykKKwkJCXsKKwkJCQkvLyB3aGVuIENoYW5uZWw9PTE0ICYmIE1vZGU9PUNDSyAmJiBCYW5kV2lkdGg9PTIwTSwgQkJQIFI0IGJpdDU9MQorIAkJCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgJnZhbHVlKTsKKwkJCQl2YWx1ZSB8PSAweDIwOyAvL3NldCBiaXQ1PTEKKyAJCQkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCB2YWx1ZSk7CisJCQl9CisJCX0KKworCSAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCQkvLyBJZiBiYW5kd2lkdGggIT0gNDBNLCBSRiBSZWc0IGJpdCAyMSA9IDAuCisJCXBBZC0+TGF0Y2hSZlJlZ3MuUjQgJj0gfjB4MDAyMDAwMDA7CisJCVJ0bXBSZklvV3JpdGUocEFkKTsKKwl9CisJZWxzZSBpZihwQWQtPmF0ZS5UeFdJLkJXID09IEJXXzQwKQorCXsKKwkJaWYocEFkLT5hdGUuQ2hhbm5lbCA8PSAxNCkKKwkJeworCQkJZm9yIChpPTA7IGk8NTsgaSsrKQorCQkJeworCQkJCWlmIChwQWQtPlR4NDBNUHdyQ2ZnR0JhbmRbaV0gIT0gMHhmZmZmZmZmZikKKwkJCQl7CisJCQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX1BXUl9DRkdfMCArIGkqNCwgcEFkLT5UeDQwTVB3ckNmZ0dCYW5kW2ldKTsKKwkJCQkJUlRNUHVzZWNEZWxheSg1MDAwKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQlmb3IgKGk9MDsgaTw1OyBpKyspCisJCQl7CisJCQkJaWYgKHBBZC0+VHg0ME1Qd3JDZmdBQmFuZFtpXSAhPSAweGZmZmZmZmZmKQorCQkJCXsKKwkJCQkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfUFdSX0NGR18wICsgaSo0LCBwQWQtPlR4NDBNUHdyQ2ZnQUJhbmRbaV0pOworCQkJCQlSVE1QdXNlY0RlbGF5KDUwMDApOworCQkJCX0KKwkJCX0KKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCWlmICgocEFkLT5hdGUuVHhXSS5QSFlNT0RFID49IE1PREVfSFRNSVgpICYmIChwQWQtPmF0ZS5UeFdJLk1DUyA9PSA3KSkKKwkJCXsKKyAgICAJCQl2YWx1ZSA9IDB4Mjg7CisgICAgCQkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2NywgdmFsdWUpOworCQkJfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQl9CisKKwkJLy9TZXQgQkJQIFI0IGJpdFs0OjNdPTE6MAorCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgJnZhbHVlKTsKKwkJdmFsdWUgJj0gKH4weDE4KTsKKwkJdmFsdWUgfD0gMHgxMDsKKwkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCB2YWx1ZSk7CisKKwkJLy9TZXQgQkJQIFI2Nj0weDNDCisJCXZhbHVlID0gMHgzQzsKKwkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2NiwgdmFsdWUpOworCQkvL1NldCBCQlAgUjY4PTB4MEMKKwkJLy90byBpbXByb3ZlIFJ4IHNlbnNpdGl2aXR5LgorCQl2YWx1ZSA9IDB4MEM7CisJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjgsIHZhbHVlKTsKKwkJLy9TZXQgQkJQIFI2OT0weDFBCisJCXZhbHVlID0gMHgxQTsKKwkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2OSwgdmFsdWUpOworCQkvL1NldCBCQlAgUjcwPTB4MEEKKwkJdmFsdWUgPSAweDBBOworCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjcwLCB2YWx1ZSk7CisJCS8vU2V0IEJCUCBSNzM9MHgxNgorCQl2YWx1ZSA9IDB4MTY7CisJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNzMsIHZhbHVlKTsKKworCQkvLyBJZiBiYW5kd2lkdGggPSA0ME0sIHNldCBSRiBSZWc0IGJpdCAyMSA9IDEuCisJCXBBZC0+TGF0Y2hSZlJlZ3MuUjQgfD0gMHgwMDIwMDAwMDsKKwkJUnRtcFJmSW9Xcml0ZShwQWQpOworCX0KKworCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9BVEVfVFhfQldfUHJvYyAoQkJQQ3VycmVudEJXID0gJWQpXG4iLCBwQWQtPmF0ZS5UeFdJLkJXKSk7CisJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmFsaW5rOiBTZXRfQVRFX1RYX0JXX1Byb2MgU3VjY2Vzc1xuIikpOworCisKKwlyZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgQVRFIFR4IGZyYW1lIGxlbmd0aAorCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQJU2V0X0FURV9UWF9MRU5HVEhfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJcEFkLT5hdGUuVHhMZW5ndGggPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCisJaWYoKHBBZC0+YXRlLlR4TGVuZ3RoIDwgMjQpIHx8IChwQWQtPmF0ZS5UeExlbmd0aCA+IChNQVhfRlJBTUVfU0laRSAtIDM0LyogPT0gMjMxMiAqLykpKQorCXsKKwkJcEFkLT5hdGUuVHhMZW5ndGggPSAoTUFYX0ZSQU1FX1NJWkUgLSAzNC8qID09IDIzMTIgKi8pOworCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJTZXRfQVRFX1RYX0xFTkdUSF9Qcm9jOjpPdXQgb2YgcmFuZ2UsIGl0IHNob3VsZCBiZSBpbiByYW5nZSBvZiAyNH4lZC5cbiIsIChNQVhfRlJBTUVfU0laRSAtIDM0LyogPT0gMjMxMiAqLykpKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9BVEVfVFhfTEVOR1RIX1Byb2MgKFR4TGVuZ3RoID0gJWQpXG4iLCBwQWQtPmF0ZS5UeExlbmd0aCkpOworCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJhbGluazogU2V0X0FURV9UWF9MRU5HVEhfUHJvYyBTdWNjZXNzXG4iKSk7CisKKworCXJldHVybiBUUlVFOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBBVEUgVHggZnJhbWUgY291bnQKKworICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UCVNldF9BVEVfVFhfQ09VTlRfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJcEFkLT5hdGUuVHhDb3VudCA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisKKwlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfQVRFX1RYX0NPVU5UX1Byb2MgKFR4Q291bnQgPSAlZClcbiIsIHBBZC0+YXRlLlR4Q291bnQpKTsKKwlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSYWxpbms6IFNldF9BVEVfVFhfQ09VTlRfUHJvYyBTdWNjZXNzXG4iKSk7CisKKworCXJldHVybiBUUlVFOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBBVEUgVHggZnJhbWUgTUNTCisKKyAgICAgICAgUmV0dXJuOgorICAgICAgICAJVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UCVNldF9BVEVfVFhfTUNTX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCVVDSEFSIE1DUzsKKwlpbnQgcmVzdWx0OworCisJTUNTID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKwlyZXN1bHQgPSBDaGVja01DU1ZhbGlkKHBBZC0+YXRlLlR4V0kuUEhZTU9ERSwgTUNTKTsKKworCWlmIChyZXN1bHQgIT0gLTEpCisJeworCQlwQWQtPmF0ZS5UeFdJLk1DUyA9IChVQ0hBUilNQ1M7CisJfQorCWVsc2UKKwl7CisJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlNldF9BVEVfVFhfTUNTX1Byb2M6Ok91dCBvZiByYW5nZSwgcmVmZXIgdG8gcmF0ZSB0YWJsZS5cbiIpKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9BVEVfVFhfTUNTX1Byb2MgKE1DUyA9ICVkKVxuIiwgcEFkLT5hdGUuVHhXSS5NQ1MpKTsKKwlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSYWxpbms6IFNldF9BVEVfVFhfTUNTX1Byb2MgU3VjY2Vzc1xuIikpOworCisKKwlyZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgQVRFIFR4IGZyYW1lIE1vZGUKKyAgICAgICAgMDogTU9ERV9DQ0sKKyAgICAgICAgMTogTU9ERV9PRkRNCisgICAgICAgIDI6IE1PREVfSFRNSVgKKyAgICAgICAgMzogTU9ERV9IVEdSRUVORklFTEQKKworICAgICAgICBSZXR1cm46CisgICAgICAgIAlUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQJU2V0X0FURV9UWF9NT0RFX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCXBBZC0+YXRlLlR4V0kuUEhZTU9ERSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisKKwlpZihwQWQtPmF0ZS5UeFdJLlBIWU1PREUgPiAzKQorCXsKKwkJcEFkLT5hdGUuVHhXSS5QSFlNT0RFID0gMDsKKwkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiU2V0X0FURV9UWF9NT0RFX1Byb2M6Ok91dCBvZiByYW5nZS4gaXQgc2hvdWxkIGJlIGluIHJhbmdlIG9mIDB+M1xuIikpOworCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIwOiBDQ0ssIDE6IE9GRE0sIDI6IEhUX01JWCwgMzogSFRfR1JFRU5fRklFTEQuXG4iKSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfQVRFX1RYX01PREVfUHJvYyAoVHhNb2RlID0gJWQpXG4iLCBwQWQtPmF0ZS5UeFdJLlBIWU1PREUpKTsKKwlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSYWxpbms6IFNldF9BVEVfVFhfTU9ERV9Qcm9jIFN1Y2Nlc3NcbiIpKTsKKworCisJcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IEFURSBUeCBmcmFtZSBHSQorCisgICAgICAgIFJldHVybjoKKyAgICAgICAgCVRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVAlTZXRfQVRFX1RYX0dJX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCXBBZC0+YXRlLlR4V0kuU2hvcnRHSSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisKKwlpZihwQWQtPmF0ZS5UeFdJLlNob3J0R0kgPiAxKQorCXsKKwkJcEFkLT5hdGUuVHhXSS5TaG9ydEdJID0gMDsKKwkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiU2V0X0FURV9UWF9HSV9Qcm9jOjpPdXQgb2YgcmFuZ2VcbiIpKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9BVEVfVFhfR0lfUHJvYyAoR0kgPSAlZClcbiIsIHBBZC0+YXRlLlR4V0kuU2hvcnRHSSkpOworCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJhbGluazogU2V0X0FURV9UWF9HSV9Qcm9jIFN1Y2Nlc3NcbiIpKTsKKworCisJcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitJTlQJU2V0X0FURV9SWF9GRVJfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJcEFkLT5hdGUuYlJ4RmVyID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKworCWlmIChwQWQtPmF0ZS5iUnhGZXIgPT0gMSkKKwl7CisJCXBBZC0+YXRlLlJ4Q250UGVyU2VjID0gMDsKKwkJcEFkLT5hdGUuUnhUb3RhbENudCA9IDA7CisJfQorCisJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0FURV9SWF9GRVJfUHJvYyAoYlJ4RmVyID0gJWQpXG4iLCBwQWQtPmF0ZS5iUnhGZXIpKTsKKwlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSYWxpbms6IFNldF9BVEVfUlhfRkVSX1Byb2MgU3VjY2Vzc1xuIikpOworCisKKwlyZXR1cm4gVFJVRTsKK30KKworSU5UIFNldF9BVEVfUmVhZF9SRl9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlhdGVfcHJpbnQoS0VSTl9FTUVSRyAiUjEgPSAlbHhcbiIsIHBBZC0+TGF0Y2hSZlJlZ3MuUjEpOworCWF0ZV9wcmludChLRVJOX0VNRVJHICJSMiA9ICVseFxuIiwgcEFkLT5MYXRjaFJmUmVncy5SMik7CisJYXRlX3ByaW50KEtFUk5fRU1FUkcgIlIzID0gJWx4XG4iLCBwQWQtPkxhdGNoUmZSZWdzLlIzKTsKKwlhdGVfcHJpbnQoS0VSTl9FTUVSRyAiUjQgPSAlbHhcbiIsIHBBZC0+TGF0Y2hSZlJlZ3MuUjQpOworCisJcmV0dXJuIFRSVUU7Cit9CisKK0lOVCBTZXRfQVRFX1dyaXRlX1JGMV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVSU5UMzIgdmFsdWUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTYpOworCisJcEFkLT5MYXRjaFJmUmVncy5SMSA9IHZhbHVlOworCVJ0bXBSZklvV3JpdGUocEFkKTsKKworCXJldHVybiBUUlVFOworfQorCitJTlQgU2V0X0FURV9Xcml0ZV9SRjJfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJVUlOVDMyIHZhbHVlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDE2KTsKKworCXBBZC0+TGF0Y2hSZlJlZ3MuUjIgPSB2YWx1ZTsKKwlSdG1wUmZJb1dyaXRlKHBBZCk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworSU5UIFNldF9BVEVfV3JpdGVfUkYzX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCVVJTlQzMiB2YWx1ZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxNik7CisKKwlwQWQtPkxhdGNoUmZSZWdzLlIzID0gdmFsdWU7CisJUnRtcFJmSW9Xcml0ZShwQWQpOworCisJcmV0dXJuIFRSVUU7Cit9CisKK0lOVCBTZXRfQVRFX1dyaXRlX1JGNF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVSU5UMzIgdmFsdWUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTYpOworCisJcEFkLT5MYXRjaFJmUmVncy5SNCA9IHZhbHVlOworCVJ0bXBSZklvV3JpdGUocEFkKTsKKworCXJldHVybiBUUlVFOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIExvYWQgYW5kIFdyaXRlIEVFUFJPTSBmcm9tIGEgYmluYXJ5IGZpbGUgcHJlcGFyZWQgaW4gYWR2YW5jZS4KKworICAgICAgICBSZXR1cm46CisgICAgICAgIAlUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCisjaWZuZGVmIFVDT1MKK0lOVCBTZXRfQVRFX0xvYWRfRTJQX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCUJPT0xFQU4JCSAgICByZXQgPSBGQUxTRTsKKwlQVUNIQVIJCQlzcmMgPSBFRVBST01fQklOX0ZJTEVfTkFNRTsKKwlzdHJ1Y3QgZmlsZQkJKnNyY2Y7CisJSU5UMzIgCQkJcmV0dmFsLCBvcmdmc3VpZCwgb3JnZnNnaWQ7CisgICAJbW1fc2VnbWVudF90CW9yZ2ZzOworCVVTSE9SVCAJCQlXcml0ZUVFUFJPTVsoRUVQUk9NX1NJWkUvMildOworCVVJTlQzMgkJCUZpbGVMZW5ndGggPSAwOworCVVJTlQzMiAJCQl2YWx1ZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisKKwlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCI9PT0+ICVzICh2YWx1ZT0lZClcblxuIiwgX19mdW5jX18sIHZhbHVlKSk7CisKKwlpZiAodmFsdWUgPiAwKQorCXsKKwkJLyogemVybyB0aGUgZTJwIGJ1ZmZlciAqLworCQlOZGlzWmVyb01lbW9yeSgoUFVDSEFSKVdyaXRlRUVQUk9NLCBFRVBST01fU0laRSk7CisKKwkJLyogc2F2ZSB1aWQgYW5kIGdpZCB1c2VkIGZvciBmaWxlc3lzdGVtIGFjY2Vzcy4KKwkgICAgKiogc2V0IHVzZXIgYW5kIGdyb3VwIHRvIDAgKHJvb3QpCisJICAgICovCisJCW9yZ2ZzdWlkID0gY3VycmVudC0+ZnN1aWQ7CisJCW9yZ2ZzZ2lkID0gY3VycmVudC0+ZnNnaWQ7CisJCS8qIGFzIHJvb3QgKi8KKwkJY3VycmVudC0+ZnN1aWQgPSBjdXJyZW50LT5mc2dpZCA9IDA7CisgICAgCW9yZ2ZzID0gZ2V0X2ZzKCk7CisgICAgCXNldF9mcyhLRVJORUxfRFMpOworCisJCWRvCisJCXsKKwkJCS8qIG9wZW4gdGhlIGJpbiBmaWxlICovCisJCQlzcmNmID0gZmlscF9vcGVuKHNyYywgT19SRE9OTFksIDApOworCisJCQlpZiAoSVNfRVJSKHNyY2YpKQorCQkJeworCQkJCWF0ZV9wcmludCgiJXMgLSBFcnJvciAlbGQgb3BlbmluZyAlc1xuIiwgX19mdW5jX18sIC1QVFJfRVJSKHNyY2YpLCBzcmMpOworCQkJCWJyZWFrOworCQkJfQorCisJCQkvKiB0aGUgb2JqZWN0IG11c3QgaGF2ZSBhIHJlYWQgbWV0aG9kICovCisJCQlpZiAoKHNyY2YtPmZfb3AgPT0gTlVMTCkgfHwgKHNyY2YtPmZfb3AtPnJlYWQgPT0gTlVMTCkpCisJCQl7CisJCQkJYXRlX3ByaW50KCIlcyAtICVzIGRvZXMgbm90IGhhdmUgYSByZWFkIG1ldGhvZFxuIiwgX19mdW5jX18sIHNyYyk7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCS8qIHJlYWQgdGhlIGZpcm13YXJlIGZyb20gdGhlIGZpbGUgKi5iaW4gKi8KKwkJCUZpbGVMZW5ndGggPSBzcmNmLT5mX29wLT5yZWFkKHNyY2YsCisJCQkJCQkJCQkJICAoUFVDSEFSKVdyaXRlRUVQUk9NLAorCQkJCQkJCQkJCSAgRUVQUk9NX1NJWkUsCisJCQkJCQkJCQkJICAmc3JjZi0+Zl9wb3MpOworCisJCQlpZiAoRmlsZUxlbmd0aCAhPSBFRVBST01fU0laRSkKKwkJCXsKKwkJCQlhdGVfcHJpbnQoIiVzOiBlcnJvciBmaWxlIGxlbmd0aCAoPSVkKSBpbiBlMnAuYmluXG4iLAorCQkJCQkgICBfX2Z1bmNfXywgRmlsZUxlbmd0aCk7CisJCQkJYnJlYWs7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJLyogd3JpdGUgdGhlIGNvbnRlbnQgb2YgLmJpbiBmaWxlIHRvIEVFUFJPTSAqLworCQkJCXJ0X2VlX3dyaXRlX2FsbChwQWQsIFdyaXRlRUVQUk9NKTsKKwkJCQlyZXQgPSBUUlVFOworCQkJfQorCQkJYnJlYWs7CisJCX0gd2hpbGUoVFJVRSk7CisKKwkJLyogY2xvc2UgZmlybXdhcmUgZmlsZSAqLworCQlpZiAoSVNfRVJSKHNyY2YpKQorCQl7CisJCQkJOworCQl9CisJCWVsc2UKKwkJeworCQkJcmV0dmFsID0gZmlscF9jbG9zZShzcmNmLCBOVUxMKTsKKwkJCWlmIChyZXR2YWwpCisJCQl7CisJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiLS0+IEVycm9yICVkIGNsb3NpbmcgJXNcbiIsIC1yZXR2YWwsIHNyYykpOworCisJCQl9CisJCX0KKworCQkvKiByZXN0b3JlICovCisJCXNldF9mcyhvcmdmcyk7CisJCWN1cnJlbnQtPmZzdWlkID0gb3JnZnN1aWQ7CisJCWN1cnJlbnQtPmZzZ2lkID0gb3JnZnNnaWQ7CisJfQorICAgIEFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIjw9PT0gJXMgKHJldD0lZClcbiIsIF9fZnVuY19fLCByZXQpKTsKKworICAgIHJldHVybiByZXQ7CisKK30KKyNlbHNlCitJTlQgU2V0X0FURV9Mb2FkX0UyUF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVU0hPUlQgCQkJV3JpdGVFRVBST01bKEVFUFJPTV9TSVpFLzIpXTsKKwlzdHJ1Y3QgaXdyZXEJKndycSA9IChzdHJ1Y3QgaXdyZXEgKilhcmc7CisKKwlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT0+ICVzICh3cnEtPnUuZGF0YS5sZW5ndGggPSAlZClcblxuIiwgX19mdW5jX18sIHdycS0+dS5kYXRhLmxlbmd0aCkpOworCisJaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBFRVBST01fU0laRSkKKwl7CisJCWF0ZV9wcmludCgiJXM6IGVycm9yIGxlbmd0aCAoPSVkKSBmcm9tIGhvc3RcbiIsCisJCQkgICBfX2Z1bmNfXywgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKwllbHNlLyogKHdycS0+dS5kYXRhLmxlbmd0aCA9PSBFRVBST01fU0laRSkgKi8KKwl7CisJCS8qIHplcm8gdGhlIGUycCBidWZmZXIgKi8KKwkJTmRpc1plcm9NZW1vcnkoKFBVQ0hBUilXcml0ZUVFUFJPTSwgRUVQUk9NX1NJWkUpOworCisJCS8qIGZpbGwgdGhlIGxvY2FsIGJ1ZmZlciAqLworCQlOZGlzTW92ZU1lbW9yeSgoUFVDSEFSKVdyaXRlRUVQUk9NLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCisJCWRvCisJCXsKKwkJCQkvKiB3cml0ZSB0aGUgY29udGVudCBvZiAuYmluIGZpbGUgdG8gRUVQUk9NICovCisJCQkJcnRfZWVfd3JpdGVfYWxsKHBBZCwgV3JpdGVFRVBST00pOworCisJCX0gd2hpbGUoRkFMU0UpOworCQl9CisKKyAgICBBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT09ICVzXG4iLCBfX2Z1bmNfXykpOworCisgICAgcmV0dXJuIFRSVUU7CisKK30KKyNlbmRpZiAvLyAhVUNPUyAvLworCitJTlQgU2V0X0FURV9SZWFkX0UyUF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVU0hPUlQgYnVmZmVyW0VFUFJPTV9TSVpFLzJdOworCVVTSE9SVCAqcDsKKwlpbnQgaTsKKworCXJ0X2VlX3JlYWRfYWxsKHBBZCwgKFVTSE9SVCAqKWJ1ZmZlcik7CisJcCA9IGJ1ZmZlcjsKKwlmb3IgKGkgPSAwOyBpIDwgKEVFUFJPTV9TSVpFLzIpOyBpKyspCisJeworCQlhdGVfcHJpbnQoIiU0LjR4ICIsICpwKTsKKwkJaWYgKCgoaSsxKSAlIDE2KSA9PSAwKQorCQkJYXRlX3ByaW50KCJcbiIpOworCQlwKys7CisJfQorCXJldHVybiBUUlVFOworfQorCitJTlQJU2V0X0FURV9TaG93X1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCWF0ZV9wcmludCgiTW9kZT0lZFxuIiwgcEFkLT5hdGUuTW9kZSk7CisJYXRlX3ByaW50KCJUeFBvd2VyMD0lZFxuIiwgcEFkLT5hdGUuVHhQb3dlcjApOworCWF0ZV9wcmludCgiVHhQb3dlcjE9JWRcbiIsIHBBZC0+YXRlLlR4UG93ZXIxKTsKKwlhdGVfcHJpbnQoIlR4QW50ZW5uYVNlbD0lZFxuIiwgcEFkLT5hdGUuVHhBbnRlbm5hU2VsKTsKKwlhdGVfcHJpbnQoIlJ4QW50ZW5uYVNlbD0lZFxuIiwgcEFkLT5hdGUuUnhBbnRlbm5hU2VsKTsKKwlhdGVfcHJpbnQoIkJCUEN1cnJlbnRCVz0lZFxuIiwgcEFkLT5hdGUuVHhXSS5CVyk7CisJYXRlX3ByaW50KCJHST0lZFxuIiwgcEFkLT5hdGUuVHhXSS5TaG9ydEdJKTsKKwlhdGVfcHJpbnQoIk1DUz0lZFxuIiwgcEFkLT5hdGUuVHhXSS5NQ1MpOworCWF0ZV9wcmludCgiVHhNb2RlPSVkXG4iLCBwQWQtPmF0ZS5UeFdJLlBIWU1PREUpOworCWF0ZV9wcmludCgiQWRkcjE9JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisJCXBBZC0+YXRlLkFkZHIxWzBdLCBwQWQtPmF0ZS5BZGRyMVsxXSwgcEFkLT5hdGUuQWRkcjFbMl0sIHBBZC0+YXRlLkFkZHIxWzNdLCBwQWQtPmF0ZS5BZGRyMVs0XSwgcEFkLT5hdGUuQWRkcjFbNV0pOworCWF0ZV9wcmludCgiQWRkcjI9JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisJCXBBZC0+YXRlLkFkZHIyWzBdLCBwQWQtPmF0ZS5BZGRyMlsxXSwgcEFkLT5hdGUuQWRkcjJbMl0sIHBBZC0+YXRlLkFkZHIyWzNdLCBwQWQtPmF0ZS5BZGRyMls0XSwgcEFkLT5hdGUuQWRkcjJbNV0pOworCWF0ZV9wcmludCgiQWRkcjM9JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisJCXBBZC0+YXRlLkFkZHIzWzBdLCBwQWQtPmF0ZS5BZGRyM1sxXSwgcEFkLT5hdGUuQWRkcjNbMl0sIHBBZC0+YXRlLkFkZHIzWzNdLCBwQWQtPmF0ZS5BZGRyM1s0XSwgcEFkLT5hdGUuQWRkcjNbNV0pOworCWF0ZV9wcmludCgiQ2hhbm5lbD0lZFxuIiwgcEFkLT5hdGUuQ2hhbm5lbCk7CisJYXRlX3ByaW50KCJUeExlbmd0aD0lZFxuIiwgcEFkLT5hdGUuVHhMZW5ndGgpOworCWF0ZV9wcmludCgiVHhDb3VudD0ldVxuIiwgcEFkLT5hdGUuVHhDb3VudCk7CisJYXRlX3ByaW50KCJSRkZyZXFPZmZzZXQ9JWRcbiIsIHBBZC0+YXRlLlJGRnJlcU9mZnNldCk7CisJYXRlX3ByaW50KEtFUk5fRU1FUkcgIlNldF9BVEVfU2hvd19Qcm9jIFN1Y2Nlc3NcbiIpOworCXJldHVybiBUUlVFOworfQorCitJTlQJU2V0X0FURV9IZWxwX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCWF0ZV9wcmludCgiQVRFPUFURVNUQVJULCBBVEVTVE9QLCBUWENPTlQsIFRYQ0FSUiwgVFhGUkFNRSwgUlhGUkFNRVxuIik7CisJYXRlX3ByaW50KCJBVEVEQVxuIik7CisJYXRlX3ByaW50KCJBVEVTQVxuIik7CisJYXRlX3ByaW50KCJBVEVCU1NJRFxuIik7CisJYXRlX3ByaW50KCJBVEVDSEFOTkVMLCByYW5nZTowfjE0KHVubGVzcyBBIGJhbmQgISlcbiIpOworCWF0ZV9wcmludCgiQVRFVFhQT1cwLCBzZXQgcG93ZXIgbGV2ZWwgb2YgYW50ZW5uYSAxLlxuIik7CisJYXRlX3ByaW50KCJBVEVUWFBPVzEsIHNldCBwb3dlciBsZXZlbCBvZiBhbnRlbm5hIDIuXG4iKTsKKwlhdGVfcHJpbnQoIkFURVRYQU5ULCBzZXQgVFggYW50ZW5uYS4gMDphbGwsIDE6YW50ZW5uYSBvbmUsIDI6YW50ZW5uYSB0d28uXG4iKTsKKwlhdGVfcHJpbnQoIkFURVJYQU5ULCBzZXQgUlggYW50ZW5uYS4wOmFsbCwgMTphbnRlbm5hIG9uZSwgMjphbnRlbm5hIHR3bywgMzphbnRlbm5hIHRocmVlLlxuIik7CisJYXRlX3ByaW50KCJBVEVUWEZSRVFPRkZTRVQsIHNldCBmcmVxdWVuY3kgb2Zmc2V0LCByYW5nZSAwfjYzXG4iKTsKKwlhdGVfcHJpbnQoIkFURVRYQlcsIHNldCBCYW5kV2lkdGgsIDA6MjBNSHosIDE6NDBNSHouXG4iKTsKKwlhdGVfcHJpbnQoIkFURVRYTEVOLCBzZXQgRnJhbWUgbGVuZ3RoLCByYW5nZSAyNH4lZFxuIiwgKE1BWF9GUkFNRV9TSVpFIC0gMzQvKiA9PSAyMzEyICovKSk7CisJYXRlX3ByaW50KCJBVEVUWENOVCwgc2V0IGhvdyBtYW55IGZyYW1lIGdvaW5nIHRvIHRyYW5zbWl0LlxuIik7CisJYXRlX3ByaW50KCJBVEVUWE1DUywgc2V0IE1DUywgcmVmZXJlbmNlIHRvIHJhdGUgdGFibGUuXG4iKTsKKwlhdGVfcHJpbnQoIkFURVRYTU9ERSwgc2V0IE1vZGUgMDpDQ0ssIDE6T0ZETSwgMjpIVC1NaXgsIDM6R3JlZW5GaWVsZCwgcmVmZXJlbmNlIHRvIHJhdGUgdGFibGUuXG4iKTsKKwlhdGVfcHJpbnQoIkFURVRYR0ksIHNldCBHSSBpbnRlcnZhbCwgMDpMb25nLCAxOlNob3J0XG4iKTsKKwlhdGVfcHJpbnQoIkFURVJYRkVSLCAwOmRpc2FibGUgUnggRnJhbWUgZXJyb3IgcmF0ZS4gMTplbmFibGUgUnggRnJhbWUgZXJyb3IgcmF0ZS5cbiIpOworCWF0ZV9wcmludCgiQVRFUlJGLCBzaG93IGFsbCBSRiByZWdpc3RlcnMuXG4iKTsKKwlhdGVfcHJpbnQoIkFURVdSRjEsIHNldCBSRjEgcmVnaXN0ZXIuXG4iKTsKKwlhdGVfcHJpbnQoIkFURVdSRjIsIHNldCBSRjIgcmVnaXN0ZXIuXG4iKTsKKwlhdGVfcHJpbnQoIkFURVdSRjMsIHNldCBSRjMgcmVnaXN0ZXIuXG4iKTsKKwlhdGVfcHJpbnQoIkFURVdSRjQsIHNldCBSRjQgcmVnaXN0ZXIuXG4iKTsKKwlhdGVfcHJpbnQoIkFURUxERTJQLCBsb2FkIEVFUFJPTSBmcm9tIC5iaW4gZmlsZS5cbiIpOworCWF0ZV9wcmludCgiQVRFUkUyUCwgZGlzcGxheSBhbGwgRUVQUk9NIGNvbnRlbnQuXG4iKTsKKwlhdGVfcHJpbnQoIkFURVNIT1csIGRpc3BsYXkgYWxsIHBhcmFtZXRlcnMgb2YgQVRFLlxuIik7CisJYXRlX3ByaW50KCJBVEVIRUxQLCBvbmxpbmUgaGVscC5cbiIpOworCisJcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKworCUFzaWNTd2l0Y2hDaGFubmVsKCkgZGVkaWNhdGVkIGZvciBBVEUuCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgQVRFQXNpY1N3aXRjaENoYW5uZWwoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJVUlOVDMyIFIyID0gMCwgUjMgPSBERUZBVUxUX1JGX1RYX1BPV0VSLCBSNCA9IDAsIFZhbHVlID0gMDsKKwlDSEFSIFR4UHdlciA9IDAsIFR4UHdlcjIgPSAwOworCVVDSEFSIGluZGV4LCBCYnBWYWx1ZSA9IDAsIFI2NiA9IDB4MzA7CisJUlRNUF9SRl9SRUdTICpSRlJlZ1RhYmxlOworCVVDSEFSIENoYW5uZWw7CisKKyNpZmRlZiBSQUxJTktfMjh4eF9RQQorCWlmICgocEFkLT5hdGUuYlFBVHhTdGFydCA9PSBUUlVFKSB8fCAocEFkLT5hdGUuYlFBUnhTdGFydCA9PSBUUlVFKSkKKwl7CisJCWlmIChwQWQtPmF0ZS5DaGFubmVsICE9IHBBZC0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbCkKKwkJeworCQkJcEFkLT5hdGUuQ2hhbm5lbCA9IHBBZC0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbDsKKwkJfQorCQlyZXR1cm47CisJfQorCWVsc2UKKyNlbmRpZiAvLyBSQUxJTktfMjh4eF9RQSAvLworCUNoYW5uZWwgPSBwQWQtPmF0ZS5DaGFubmVsOworCisJLy8gU2VsZWN0IGFudGVubmEKKwlBc2ljQW50ZW5uYVNlbGVjdChwQWQsIENoYW5uZWwpOworCisJLy8gZmlsbCBUeCBwb3dlciB2YWx1ZQorCVR4UHdlciA9IHBBZC0+YXRlLlR4UG93ZXIwOworCVR4UHdlcjIgPSBwQWQtPmF0ZS5UeFBvd2VyMTsKKworCVJGUmVnVGFibGUgPSBSRjI4NTBSZWdUYWJsZTsKKworCXN3aXRjaCAocEFkLT5SZkljVHlwZSkKKwl7CisJCS8qIEJ1dCBvbmx5IDI4NTAgYW5kIDI3NTAgc3VwcG9ydCA1LjVHSHogYmFuZC4uLiAqLworCQljYXNlIFJGSUNfMjgyMDoKKwkJY2FzZSBSRklDXzI4NTA6CisJCWNhc2UgUkZJQ18yNzIwOgorCQljYXNlIFJGSUNfMjc1MDoKKworCQkJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgTlVNX09GXzI4NTBfQ0hOTDsgaW5kZXgrKykKKwkJCXsKKwkJCQlpZiAoQ2hhbm5lbCA9PSBSRlJlZ1RhYmxlW2luZGV4XS5DaGFubmVsKQorCQkJCXsKKwkJCQkJUjIgPSBSRlJlZ1RhYmxlW2luZGV4XS5SMjsKKwkJCQkJaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGggPT0gMSkKKwkJCQkJeworCQkJCQkJUjIgfD0gMHg0MDAwOwkvLyBJZiBUWHBhdGggaXMgMSwgYml0IDE0ID0gMTsKKwkJCQkJfQorCisJCQkJCWlmIChwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDIpCisJCQkJCXsKKwkJCQkJCXN3aXRjaCAocEFkLT5hdGUuUnhBbnRlbm5hU2VsKQorCQkJCQkJeworCQkJCQkJCWNhc2UgMToKKwkJCQkJCQkJUjIgfD0gMHgyMDA0MDsKKwkJCQkJCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsICZCYnBWYWx1ZSk7CisJCQkJCQkJCUJicFZhbHVlICY9IDB4RTQ7CisJCQkJCQkJCUJicFZhbHVlIHw9IDB4MDA7CisJCQkJCQkJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgQmJwVmFsdWUpOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQljYXNlIDI6CisJCQkJCQkJCVIyIHw9IDB4MTAwNDA7CisJCQkJCQkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCAmQmJwVmFsdWUpOworCQkJCQkJCQlCYnBWYWx1ZSAmPSAweEU0OworCQkJCQkJCQlCYnBWYWx1ZSB8PSAweDAxOworCQkJCQkJCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsIEJicFZhbHVlKTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJZGVmYXVsdDoKKwkJCQkJCQkJUjIgfD0gMHg0MDsKKwkJCQkJCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsICZCYnBWYWx1ZSk7CisJCQkJCQkJCUJicFZhbHVlICY9IDB4RTQ7CisJCQkJCQkJCS8qIE9ubHkgZW5hYmxlIHR3byBBbnRlbm5hIHRvIHJlY2VpdmUuICovCisJCQkJCQkJCUJicFZhbHVlIHw9IDB4MDg7CisJCQkJCQkJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgQmJwVmFsdWUpOworCQkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQllbHNlIGlmIChwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDEpCisJCQkJCXsKKwkJCQkJCVIyIHw9IDB4MjAwNDA7CS8vIHdyaXRlIDEgdG8gb2ZmIFJ4UGF0aAorCQkJCQl9CisKKwkJCQkJaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGggPT0gMikKKwkJCQkJeworCQkJCQkJaWYgKHBBZC0+YXRlLlR4QW50ZW5uYVNlbCA9PSAxKQorCQkJCQkJeworCQkJCQkJCVIyIHw9IDB4NDAwMDsJLy8gSWYgVFggQW50ZW5uYSBzZWxlY3QgaXMgMSAsIGJpdCAxNCA9IDE7IERpc2FibGUgQW50IDIKKwkJCQkJCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMSwgJkJicFZhbHVlKTsKKwkJCQkJCQlCYnBWYWx1ZSAmPSAweEU3OwkJLy8xMTEwMDExMUIKKwkJCQkJCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjEsIEJicFZhbHVlKTsKKwkJCQkJCX0KKwkJCQkJCWVsc2UgaWYgKHBBZC0+YXRlLlR4QW50ZW5uYVNlbCA9PSAyKQorCQkJCQkJeworCQkJCQkJCVIyIHw9IDB4ODAwMDsJLy8gSWYgVFggQW50ZW5uYSBzZWxlY3QgaXMgMiAsIGJpdCAxNSA9IDE7IERpc2FibGUgQW50IDEKKwkJCQkJCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMSwgJkJicFZhbHVlKTsKKwkJCQkJCQlCYnBWYWx1ZSAmPSAweEU3OworCQkJCQkJCUJicFZhbHVlIHw9IDB4MDg7CisJCQkJCQkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IxLCBCYnBWYWx1ZSk7CisJCQkJCQl9CisJCQkJCQllbHNlCisJCQkJCQl7CisJCQkJCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjEsICZCYnBWYWx1ZSk7CisJCQkJCQkJQmJwVmFsdWUgJj0gMHhFNzsKKwkJCQkJCQlCYnBWYWx1ZSB8PSAweDEwOworCQkJCQkJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMSwgQmJwVmFsdWUpOworCQkJCQkJfQorCQkJCQl9CisJCQkJCWlmIChwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDMpCisJCQkJCXsKKwkJCQkJCXN3aXRjaCAocEFkLT5hdGUuUnhBbnRlbm5hU2VsKQorCQkJCQkJeworCQkJCQkJCWNhc2UgMToKKwkJCQkJCQkJUjIgfD0gMHgyMDA0MDsKKwkJCQkJCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsICZCYnBWYWx1ZSk7CisJCQkJCQkJCUJicFZhbHVlICY9IDB4RTQ7CisJCQkJCQkJCUJicFZhbHVlIHw9IDB4MDA7CisJCQkJCQkJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgQmJwVmFsdWUpOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQljYXNlIDI6CisJCQkJCQkJCVIyIHw9IDB4MTAwNDA7CisJCQkJCQkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCAmQmJwVmFsdWUpOworCQkJCQkJCQlCYnBWYWx1ZSAmPSAweEU0OworCQkJCQkJCQlCYnBWYWx1ZSB8PSAweDAxOworCQkJCQkJCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsIEJicFZhbHVlKTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSAzOgorCQkJCQkJCQlSMiB8PSAweDMwMDAwOworCQkJCQkJCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgJkJicFZhbHVlKTsKKwkJCQkJCQkJQmJwVmFsdWUgJj0gMHhFNDsKKwkJCQkJCQkJQmJwVmFsdWUgfD0gMHgwMjsKKwkJCQkJCQkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCBCYnBWYWx1ZSk7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWRlZmF1bHQ6CisJCQkJCQkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCAmQmJwVmFsdWUpOworCQkJCQkJCQlCYnBWYWx1ZSAmPSAweEU0OworCQkJCQkJCQlCYnBWYWx1ZSB8PSAweDEwOworCQkJCQkJCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsIEJicFZhbHVlKTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCX0KKworCQkJCQlpZiAoQ2hhbm5lbCA+IDE0KQorCQkJCQl7CisJCQkJCQkvLyBpbml0aWFsaXplIFIzLCBSNAorCQkJCQkJUjMgPSAoUkZSZWdUYWJsZVtpbmRleF0uUjMgJiAweGZmZmZjMWZmKTsKKwkJCQkJCVI0ID0gKFJGUmVnVGFibGVbaW5kZXhdLlI0ICYgKH4weDAwMWY4N2MwKSkgfCAocEFkLT5hdGUuUkZGcmVxT2Zmc2V0IDw8IDE1KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWNjb3JkaW5nIHRoZSBSb3J5J3Mgc3VnZ2VzdGlvbiB0byBzb2x2ZSB0aGUgbWlkZGxlIHJhbmdlIGlzc3VlLgorCQkJCQkJLy8gNS41RyBiYW5kIHBvd2VyIHJhbmdlOiAweEY5fjBYMEYsIFRYMCBSZWczIGJpdDkvVFgxIFJlZzQgYml0Nj0iMCIgbWVhbnMgdGhlIFRYIHBvd2VyIHJlZHVjZSA3ZEIKKwkJCQkJCS8vIFIzCisJCQkJCQlpZiAoKFR4UHdlciA+PSAtNykgJiYgKFR4UHdlciA8IDApKQorCQkJCQkJeworCQkJCQkJCVR4UHdlciA9ICg3K1R4UHdlcik7CisJCQkJCQkJVHhQd2VyID0gKFR4UHdlciA+IDB4RikgPyAoMHhGKSA6IChUeFB3ZXIpOworCQkJCQkJCVIzIHw9IChUeFB3ZXIgPDwgMTApOworCQkJCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFURUFzaWNTd2l0Y2hDaGFubmVsOiBUeFB3ZXI9JWQgXG4iLCBUeFB3ZXIpKTsKKwkJCQkJCX0KKwkJCQkJCWVsc2UKKwkJCQkJCXsKKwkJCQkJCQlUeFB3ZXIgPSAoVHhQd2VyID4gMHhGKSA/ICgweEYpIDogKFR4UHdlcik7CisJCQkJCQkJUjMgfD0gKFR4UHdlciA8PCAxMCkgfCAoMSA8PCA5KTsKKwkJCQkJCX0KKworCQkJCQkJLy8gUjQKKwkJCQkJCWlmICgoVHhQd2VyMiA+PSAtNykgJiYgKFR4UHdlcjIgPCAwKSkKKwkJCQkJCXsKKwkJCQkJCQlUeFB3ZXIyID0gKDcrVHhQd2VyMik7CisJCQkJCQkJVHhQd2VyMiA9IChUeFB3ZXIyID4gMHhGKSA/ICgweEYpIDogKFR4UHdlcjIpOworCQkJCQkJCVI0IHw9IChUeFB3ZXIyIDw8IDcpOworCQkJCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFURUFzaWNTd2l0Y2hDaGFubmVsOiBUeFB3ZXIyPSVkIFxuIiwgVHhQd2VyMikpOworCQkJCQkJfQorCQkJCQkJZWxzZQorCQkJCQkJeworCQkJCQkJCVR4UHdlcjIgPSAoVHhQd2VyMiA+IDB4RikgPyAoMHhGKSA6IChUeFB3ZXIyKTsKKwkJCQkJCQlSNCB8PSAoVHhQd2VyMiA8PCA3KSB8ICgxIDw8IDYpOworCQkJCQkJfQorCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJUjMgPSAoUkZSZWdUYWJsZVtpbmRleF0uUjMgJiAweGZmZmZjMWZmKSB8IChUeFB3ZXIgPDwgOSk7IC8vIHNldCBUWCBwb3dlcjAKKwkJCQkJCVI0ID0gKFJGUmVnVGFibGVbaW5kZXhdLlI0ICYgKH4weDAwMWY4N2MwKSkgfCAocEFkLT5hdGUuUkZGcmVxT2Zmc2V0IDw8IDE1KSB8IChUeFB3ZXIyIDw8Nik7Ly8gU2V0IGZyZXEgb2Zmc2V0ICYgVHhQd3IxCisJCQkJCX0KKworCQkJCQkvLyBCYXNlZCBvbiBCQlAgY3VycmVudCBtb2RlIGJlZm9yZSBjaGFuZ2luZyBSRiBjaGFubmVsLgorCQkJCQlpZiAocEFkLT5hdGUuVHhXSS5CVyA9PSBCV180MCkKKwkJCQkJeworCQkJCQkJUjQgfD0weDIwMDAwMDsKKwkJCQkJfQorCisJCQkJCS8vIFVwZGF0ZSB2YXJpYWJsZXMKKwkJCQkJcEFkLT5MYXRjaFJmUmVncy5DaGFubmVsID0gQ2hhbm5lbDsKKwkJCQkJcEFkLT5MYXRjaFJmUmVncy5SMSA9IFJGUmVnVGFibGVbaW5kZXhdLlIxOworCQkJCQlwQWQtPkxhdGNoUmZSZWdzLlIyID0gUjI7CisJCQkJCXBBZC0+TGF0Y2hSZlJlZ3MuUjMgPSBSMzsKKwkJCQkJcEFkLT5MYXRjaFJmUmVncy5SNCA9IFI0OworCisJCQkJCVJ0bXBSZklvV3JpdGUocEFkKTsKKworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJfQorCisJLy8gQ2hhbmdlIEJCUCBzZXR0aW5nIGR1cmluZyBzd2l0Y2ggZnJvbSBhLT5nLCBnLT5hCisJaWYgKENoYW5uZWwgPD0gMTQpCisJeworCSAgICBVTE9ORwlUeFBpbkNmZyA9IDB4MDAwNTBGMEE7Ly8gMjAwNy4xMC4wOSBieSBCcmlhbiA6IDB4MDAwNTA1MEEgPT0+IDB4MDAwNTBGMEEKKworCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjYyLCAoMHgzNyAtIEdFVF9MTkFfR0FJTihwQWQpKSk7CisJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjMsICgweDM3IC0gR0VUX0xOQV9HQUlOKHBBZCkpKTsKKwkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2NCwgKDB4MzcgLSBHRVRfTE5BX0dBSU4ocEFkKSkpOworCisJCS8qIEZvciAxVC8yUiBjaGlwIG9ubHkuLi4gKi8KKwkgICAgaWYgKHBBZC0+TmljQ29uZmlnMi5maWVsZC5FeHRlcm5hbExOQUZvckcpCisJICAgIHsKKwkgICAgICAgIEFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SODIsIDB4NjIpOworCSAgICB9CisJICAgIGVsc2UKKwkgICAgeworCSAgICAgICAgQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I4MiwgMHg4NCk7CisJICAgIH0KKworICAgICAgICAvLyBBY2NvcmRpbmcgdGhlIFJvcnkncyBzdWdnZXN0aW9uIHRvIHNvbHZlIHRoZSBtaWRkbGUgcmFuZ2UgaXNzdWUuCisJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I4NiwgJkJicFZhbHVlKTsKKwkJQVNTRVJUKChCYnBWYWx1ZSA9PSAweDAwKSk7CisJCWlmICgoQmJwVmFsdWUgIT0gMHgwMCkpCisJCXsKKwkJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SODYsIDB4MDApOworCQl9CisKKwkJLy8gNS41R0h6IGJhbmQgc2VsZWN0aW9uIFBJTiwgYml0MSBhbmQgYml0MiBhcmUgY29tcGxlbWVudAorCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0JBTkRfQ0ZHLCAmVmFsdWUpOworCQlWYWx1ZSAmPSAofjB4Nik7CisJCVZhbHVlIHw9ICgweDA0KTsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfQkFORF9DRkcsIFZhbHVlKTsKKworICAgICAgICAvLyBUdXJuIG9mZiB1bnVzZWQgUEEgb3IgTE5BIHdoZW4gb25seSAxVCBvciAxUi4KKwkJaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGggPT0gMSkKKwkJeworCQkJVHhQaW5DZmcgJj0gMHhGRkZGRkZGMzsKKwkJfQorCQlpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAxKQorCQl7CisJCQlUeFBpbkNmZyAmPSAweEZGRkZGM0ZGOworCQl9CisKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfUElOX0NGRywgVHhQaW5DZmcpOworCX0KKwllbHNlCisJeworCSAgICBVTE9ORwlUeFBpbkNmZyA9IDB4MDAwNTBGMDU7Ly8yMDA3LjEwLjA5IGJ5IEJyaWFuIDogMHgwMDA1MDUwNSA9PT4gMHgwMDA1MEYwNQorCisJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjIsICgweDM3IC0gR0VUX0xOQV9HQUlOKHBBZCkpKTsKKwkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2MywgKDB4MzcgLSBHRVRfTE5BX0dBSU4ocEFkKSkpOworCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY0LCAoMHgzNyAtIEdFVF9MTkFfR0FJTihwQWQpKSk7CisJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SODIsIDB4RjIpOworCisgICAgICAgIC8vIEFjY29yZGluZyB0aGUgUm9yeSdzIHN1Z2dlc3Rpb24gdG8gc29sdmUgdGhlIG1pZGRsZSByYW5nZSBpc3N1ZS4KKwkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjg2LCAmQmJwVmFsdWUpOworCQlBU1NFUlQoKEJicFZhbHVlID09IDB4MDApKTsKKwkJaWYgKChCYnBWYWx1ZSAhPSAweDAwKSkKKwkJeworCQkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I4NiwgMHgwMCk7CisJCX0KKwkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjkxLCAmQmJwVmFsdWUpOworCQlBU1NFUlQoKEJicFZhbHVlID09IDB4MDQpKTsKKworCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SOTIsICZCYnBWYWx1ZSk7CisJCUFTU0VSVCgoQmJwVmFsdWUgPT0gMHgwMCkpOworCisJCS8vIDUuNUdIeiBiYW5kIHNlbGVjdGlvbiBQSU4sIGJpdDEgYW5kIGJpdDIgYXJlIGNvbXBsZW1lbnQKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9CQU5EX0NGRywgJlZhbHVlKTsKKwkJVmFsdWUgJj0gKH4weDYpOworCQlWYWx1ZSB8PSAoMHgwMik7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX0JBTkRfQ0ZHLCBWYWx1ZSk7CisKKyAgICAgICAgLy8gVHVybiBvZmYgdW51c2VkIFBBIG9yIExOQSB3aGVuIG9ubHkgMVQgb3IgMVIuCisJCWlmIChwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoID09IDEpCisJCXsKKwkJCVR4UGluQ2ZnICY9IDB4RkZGRkZGRjM7CisJICAgIH0KKwkJaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPT0gMSkKKwkJeworCQkJVHhQaW5DZmcgJj0gMHhGRkZGRjNGRjsKKwkJfQorCisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX1BJTl9DRkcsIFR4UGluQ2ZnKTsKKwl9CisKKyAgICAvLyBSNjYgc2hvdWxkIGJlIHNldCBhY2NvcmRpbmcgdG8gQ2hhbm5lbCBhbmQgdXNlIDIwTUh6IHdoZW4gc2Nhbm5pbmcKKwlpZiAoQ2hhbm5lbCA8PSAxNCkKKwl7CisJCS8vIEJHIGJhbmQKKwkJUjY2ID0gMHgyRSArIEdFVF9MTkFfR0FJTihwQWQpOworCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY2LCBSNjYpOworCX0KKwllbHNlCisJeworCQkvLyA1LjUgR0h6IGJhbmQKKwkJaWYgKHBBZC0+YXRlLlR4V0kuQlcgPT0gQldfMjApCisJCXsKKwkJCVI2NiA9IChVQ0hBUikoMHgzMiArIChHRVRfTE5BX0dBSU4ocEFkKSo1KS8zKTsKKyAgICAJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjYsIFI2Nik7CisJCX0KKwkJZWxzZQorCQl7CisJCQlSNjYgPSAoVUNIQVIpKDB4M0EgKyAoR0VUX0xOQV9HQUlOKHBBZCkqNSkvMyk7CisJCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY2LCBSNjYpOworCQl9CisJfQorCisJLy8KKwkvLyBPbiAxMUEsIFdlIHNob3VsZCBkZWxheSBhbmQgd2FpdCBSRi9CQlAgdG8gYmUgc3RhYmxlCisJLy8gYW5kIHRoZSBhcHByb3ByaWF0ZSB0aW1lIHNob3VsZCBiZSAxMDAwIG1pY3JvIHNlY29uZHMKKwkvLyAyMDA1LzA2LzA1IC0gT24gMTFHLCBXZSBhbHNvIG5lZWQgdGhpcyBkZWxheSB0aW1lLiBPdGhlcndpc2UgaXQncyBkaWZmaWN1bHQgdG8gcGFzcyB0aGUgV0hRTC4KKwkvLworCVJUTVB1c2VjRGVsYXkoMTAwMCk7CisKKwlpZiAoQ2hhbm5lbCA+IDE0KQorCXsKKwkJLy8gV2hlbiA1LjVHSHogYmFuZCB0aGUgTFNCIG9mIFR4UHdyIHdpbGwgYmUgdXNlZCB0byByZWR1Y2VkIDdkQiBvciBub3QuCisJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlN3aXRjaENoYW5uZWwjJWQoUkY9JWQsICVkVCkgdG8gLCBSMT0weCUwOGx4LCBSMj0weCUwOGx4LCBSMz0weCUwOGx4LCBSND0weCUwOGx4XG4iLAorCQkJCQkJCQkgIENoYW5uZWwsCisJCQkJCQkJCSAgcEFkLT5SZkljVHlwZSwKKwkJCQkJCQkJICBwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoLAorCQkJCQkJCQkgIHBBZC0+TGF0Y2hSZlJlZ3MuUjEsCisJCQkJCQkJCSAgcEFkLT5MYXRjaFJmUmVncy5SMiwKKwkJCQkJCQkJICBwQWQtPkxhdGNoUmZSZWdzLlIzLAorCQkJCQkJCQkgIHBBZC0+TGF0Y2hSZlJlZ3MuUjQpKTsKKwl9CisJZWxzZQorCXsKKwkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU3dpdGNoQ2hhbm5lbCMlZChSRj0lZCwgUHdyMD0ldSwgUHdyMT0ldSwgJWRUKSB0byAsIFIxPTB4JTA4bHgsIFIyPTB4JTA4bHgsIFIzPTB4JTA4bHgsIFI0PTB4JTA4bHhcbiIsCisJCQkJCQkJCSAgQ2hhbm5lbCwKKwkJCQkJCQkJICBwQWQtPlJmSWNUeXBlLAorCQkJCQkJCQkgIChSMyAmIDB4MDAwMDNlMDApID4+IDksCisJCQkJCQkJCSAgKFI0ICYgMHgwMDAwMDdjMCkgPj4gNiwKKwkJCQkJCQkJICBwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoLAorCQkJCQkJCQkgIHBBZC0+TGF0Y2hSZlJlZ3MuUjEsCisJCQkJCQkJCSAgcEFkLT5MYXRjaFJmUmVncy5SMiwKKwkJCQkJCQkJICBwQWQtPkxhdGNoUmZSZWdzLlIzLAorCQkJCQkJCQkgIHBBZC0+TGF0Y2hSZlJlZ3MuUjQpKTsKKyAgICB9Cit9CisKKy8vCisvLyBJbiBmYWN0LCBubyBvbmUgd2lsbCBjYWxsIHRoaXMgcm91dGluZSBzbyBmYXIgIQorLy8KKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJR2l2ZXMgQ0NLIFRYIHJhdGUgMiBtb3JlIGRCIFRYIHBvd2VyLgorCQlUaGlzIHJvdXRpbmUgd29ya3Mgb25seSBpbiBBVEUgbW9kZS4KKworCQljYWxjdWxhdGUgZGVzaXJlZCBUeCBwb3dlciBpbiBSRiBSMy5UeDB+NSwJc2hvdWxkIGNvbnNpZGVyIC0KKwkJMC4gaWYgY3VycmVudCByYWRpbyBpcyBhIG5vaXN5IGVudmlyb25tZW50IChwQWQtPkRyc0NvdW50ZXJzLmZOb2lzeUVudmlyb25tZW50KQorCQkxLiBUeFBvd2VyUGVyY2VudGFnZQorCQkyLiBhdXRvIGNhbGlicmF0aW9uIGJhc2VkIG9uIFRTU0kgZmVlZGJhY2sKKwkJMy4gZXh0cmEgMiBkYiBmb3IgQ0NLCisJCTQuIC0xMCBkYiB1cG9uIHZlcnktc2hvcnQgZGlzdGFuY2UgKEF2Z1JTU0kgPj0gLTQwZGIpIHRvIEFQCisKKwlOT1RFOiBTaW5jZSB0aGlzIHJvdXRpbmUgcmVxdWlyZXMgdGhlIHZhbHVlIG9mIChwQWQtPkRyc0NvdW50ZXJzLmZOb2lzeUVudmlyb25tZW50KSwKKwkJaXQgc2hvdWxkIGJlIGNhbGxlZCBBRlRFUiBNbG1lRHluYW1pY1R4UmF0ZVN3aXRjaGluZygpCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBBVEVBc2ljQWRqdXN0VHhQb3dlcigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlJTlQJCQlpLCBqOworCUNIQVIJCURlbHRhUHdyID0gMDsKKwlCT09MRUFOCQliQXV0b1R4QWdjID0gRkFMU0U7CisJVUNIQVIJCVRzc2lSZWYsICpwVHNzaU1pbnVzQm91bmRhcnksICpwVHNzaVBsdXNCb3VuZGFyeSwgVHhBZ2NTdGVwOworCVVDSEFSCQlCYnBSNDkgPSAwLCBpZHg7CisJUENIQVIJCXBUeEFnY0NvbXBlbnNhdGU7CisJVUxPTkcJCVR4UHdyWzVdOworCUNIQVIJCVZhbHVlOworCisJLyogbm8gb25lIGNhbGxzIHRoaXMgcHJvY2VkdXJlIHNvIGZhciAqLworCWlmIChwQWQtPmF0ZS5UeFdJLkJXID09IEJXXzQwKQorCXsKKwkJaWYgKHBBZC0+YXRlLkNoYW5uZWwgPiAxNCkKKwkJeworCQkJVHhQd3JbMF0gPSBwQWQtPlR4NDBNUHdyQ2ZnQUJhbmRbMF07CisJCQlUeFB3clsxXSA9IHBBZC0+VHg0ME1Qd3JDZmdBQmFuZFsxXTsKKwkJCVR4UHdyWzJdID0gcEFkLT5UeDQwTVB3ckNmZ0FCYW5kWzJdOworCQkJVHhQd3JbM10gPSBwQWQtPlR4NDBNUHdyQ2ZnQUJhbmRbM107CisJCQlUeFB3cls0XSA9IHBBZC0+VHg0ME1Qd3JDZmdBQmFuZFs0XTsKKwkJfQorCQllbHNlCisJCXsKKwkJCVR4UHdyWzBdID0gcEFkLT5UeDQwTVB3ckNmZ0dCYW5kWzBdOworCQkJVHhQd3JbMV0gPSBwQWQtPlR4NDBNUHdyQ2ZnR0JhbmRbMV07CisJCQlUeFB3clsyXSA9IHBBZC0+VHg0ME1Qd3JDZmdHQmFuZFsyXTsKKwkJCVR4UHdyWzNdID0gcEFkLT5UeDQwTVB3ckNmZ0dCYW5kWzNdOworCQkJVHhQd3JbNF0gPSBwQWQtPlR4NDBNUHdyQ2ZnR0JhbmRbNF07CisJCX0KKwl9CisJZWxzZQorCXsKKwkJaWYgKHBBZC0+YXRlLkNoYW5uZWwgPiAxNCkKKwkJeworCQkJVHhQd3JbMF0gPSBwQWQtPlR4MjBNUHdyQ2ZnQUJhbmRbMF07CisJCQlUeFB3clsxXSA9IHBBZC0+VHgyME1Qd3JDZmdBQmFuZFsxXTsKKwkJCVR4UHdyWzJdID0gcEFkLT5UeDIwTVB3ckNmZ0FCYW5kWzJdOworCQkJVHhQd3JbM10gPSBwQWQtPlR4MjBNUHdyQ2ZnQUJhbmRbM107CisJCQlUeFB3cls0XSA9IHBBZC0+VHgyME1Qd3JDZmdBQmFuZFs0XTsKKwkJfQorCQllbHNlCisJCXsKKwkJCVR4UHdyWzBdID0gcEFkLT5UeDIwTVB3ckNmZ0dCYW5kWzBdOworCQkJVHhQd3JbMV0gPSBwQWQtPlR4MjBNUHdyQ2ZnR0JhbmRbMV07CisJCQlUeFB3clsyXSA9IHBBZC0+VHgyME1Qd3JDZmdHQmFuZFsyXTsKKwkJCVR4UHdyWzNdID0gcEFkLT5UeDIwTVB3ckNmZ0dCYW5kWzNdOworCQkJVHhQd3JbNF0gPSBwQWQtPlR4MjBNUHdyQ2ZnR0JhbmRbNF07CisJCX0KKwl9CisKKwkvLyBUWCBwb3dlciBjb21wZW5zYXRpb24gZm9yIHRlbXBlcmF0dXJlIHZhcmlhdGlvbiBiYXNlZCBvbiBUU1NJLgorCS8vIERvIGl0IHBlciA0IHNlY29uZHMuCisJaWYgKHBBZC0+TWxtZS5PbmVTZWNQZXJpb2RpY1JvdW5kICUgNCA9PSAwKQorCXsKKwkJaWYgKHBBZC0+YXRlLkNoYW5uZWwgPD0gMTQpCisJCXsKKwkJCS8qIGJnIGNoYW5uZWwgKi8KKwkJCWJBdXRvVHhBZ2MgICAgICAgICA9IHBBZC0+YkF1dG9UeEFnY0c7CisJCQlUc3NpUmVmICAgICAgICAgICAgPSBwQWQtPlRzc2lSZWZHOworCQkJcFRzc2lNaW51c0JvdW5kYXJ5ID0gJnBBZC0+VHNzaU1pbnVzQm91bmRhcnlHWzBdOworCQkJcFRzc2lQbHVzQm91bmRhcnkgID0gJnBBZC0+VHNzaVBsdXNCb3VuZGFyeUdbMF07CisJCQlUeEFnY1N0ZXAgICAgICAgICAgPSBwQWQtPlR4QWdjU3RlcEc7CisJCQlwVHhBZ2NDb21wZW5zYXRlICAgPSAmcEFkLT5UeEFnY0NvbXBlbnNhdGVHOworCQl9CisJCWVsc2UKKwkJeworCQkJLyogYSBjaGFubmVsICovCisJCQliQXV0b1R4QWdjICAgICAgICAgPSBwQWQtPmJBdXRvVHhBZ2NBOworCQkJVHNzaVJlZiAgICAgICAgICAgID0gcEFkLT5Uc3NpUmVmQTsKKwkJCXBUc3NpTWludXNCb3VuZGFyeSA9ICZwQWQtPlRzc2lNaW51c0JvdW5kYXJ5QVswXTsKKwkJCXBUc3NpUGx1c0JvdW5kYXJ5ICA9ICZwQWQtPlRzc2lQbHVzQm91bmRhcnlBWzBdOworCQkJVHhBZ2NTdGVwICAgICAgICAgID0gcEFkLT5UeEFnY1N0ZXBBOworCQkJcFR4QWdjQ29tcGVuc2F0ZSAgID0gJnBBZC0+VHhBZ2NDb21wZW5zYXRlQTsKKwkJfQorCisJCWlmIChiQXV0b1R4QWdjKQorCQl7CisJCQkvKiBCYnBSNDkgaXMgdW5zaWduZWQgY2hhciAqLworCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQ5LCAmQmJwUjQ5KTsKKworCQkJLyogKHApIFRzc2lQbHVzQm91bmRhcnlHWzBdID0gMCA9IChtKSBUc3NpTWludXNCb3VuZGFyeUdbMF0gKi8KKwkJCS8qIGNvbXBlbnNhdGU6ICs0ICAgICArMyAgICsyICAgKzEgICAgMCAgIC0xICAgLTIgICAtMyAgIC00ICogc3RlcHMgKi8KKwkJCS8qIHN0ZXAgdmFsdWUgaXMgZGVmaW5lZCBpbiBwQWQtPlR4QWdjU3RlcEcgZm9yIHR4IHBvd2VyIHZhbHVlICovCisKKwkJCS8qIFs0XSsxK1s0XSAgIHA0ICAgICBwMyAgIHAyICAgcDEgICBvMSAgIG0xICAgbTIgICBtMyAgIG00ICovCisJCQkvKiBleDogICAgICAgICAweDAwIDB4MTUgMHgyNSAweDQ1IDB4ODggMHhBMCAweEI1IDB4RDAgMHhGMAorCQkJICAgYWJvdmUgdmFsdWUgYXJlIGV4YW1pbmVkIGluIG1hc3MgZmFjdG9yeSBwcm9kdWN0aW9uICovCisJCQkvKiAgICAgICAgICAgICBbNF0gICAgWzNdICBbMl0gIFsxXSAgWzBdICBbMV0gIFsyXSAgWzNdICBbNF0gKi8KKworCQkJLyogcGx1cyBpcyAweDEwIH4gMHg0MCwgbWludXMgaXMgMHg2MCB+IDB4OTAgKi8KKwkJCS8qIGlmIHZhbHVlIGlzIGJldHdlZW4gcDEgfiBvMSBvciBvMSB+IHMxLCBubyBuZWVkIHRvIGFkanVzdCB0eCBwb3dlciAqLworCQkJLyogaWYgdmFsdWUgaXMgMHg2NSwgdHggcG93ZXIgd2lsbCBiZSAtPSBUeEFnY1N0ZXAqKDItMSkgKi8KKworCQkJaWYgKEJicFI0OSA+IHBUc3NpTWludXNCb3VuZGFyeVsxXSkKKwkJCXsKKwkJCQkvLyBSZWFkaW5nIGlzIGxhcmdlciB0aGFuIHRoZSByZWZlcmVuY2UgdmFsdWUuCisJCQkJLy8gQ2hlY2sgZm9yIGhvdyBsYXJnZSB3ZSBuZWVkIHRvIGRlY3JlYXNlIHRoZSBUeCBwb3dlci4KKwkJCQlmb3IgKGlkeCA9IDE7IGlkeCA8IDU7IGlkeCsrKQorCQkJCXsKKwkJCQkJaWYgKEJicFI0OSA8PSBwVHNzaU1pbnVzQm91bmRhcnlbaWR4XSkgIC8vIEZvdW5kIHRoZSByYW5nZQorCQkJCQkJYnJlYWs7CisJCQkJfQorCQkJCS8vIFRoZSBpbmRleCBpcyB0aGUgc3RlcCB3ZSBzaG91bGQgZGVjcmVhc2UsIGlkeCA9IDAgbWVhbnMgdGhlcmUgaXMgbm90aGluZyB0byBjb21wZW5zYXRlCisvLwkJCQlpZiAoUjMgPiAoVUxPTkcpIChUeEFnY1N0ZXAgKiAoaWR4LTEpKSkKKwkJCQkJKnBUeEFnY0NvbXBlbnNhdGUgPSAtKFR4QWdjU3RlcCAqIChpZHgtMSkpOworLy8JCQkJZWxzZQorLy8JCQkJCSpwVHhBZ2NDb21wZW5zYXRlID0gLSgoVUNIQVIpUjMpOworCisJCQkJRGVsdGFQd3IgKz0gKCpwVHhBZ2NDb21wZW5zYXRlKTsKKwkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLSBUeCBQb3dlciwgQkJQIFIxPSV4LCBUc3NpUmVmPSV4LCBUeEFnY1N0ZXA9JXgsIHN0ZXAgPSAtJWRcbiIsCisJCQkJCUJicFI0OSwgVHNzaVJlZiwgVHhBZ2NTdGVwLCBpZHgtMSkpOworCQkJfQorCQkJZWxzZSBpZiAoQmJwUjQ5IDwgcFRzc2lQbHVzQm91bmRhcnlbMV0pCisJCQl7CisJCQkJLy8gUmVhZGluZyBpcyBzbWFsbGVyIHRoYW4gdGhlIHJlZmVyZW5jZSB2YWx1ZQorCQkJCS8vIGNoZWNrIGZvciBob3cgbGFyZ2Ugd2UgbmVlZCB0byBpbmNyZWFzZSB0aGUgVHggcG93ZXIKKwkJCQlmb3IgKGlkeCA9IDE7IGlkeCA8IDU7IGlkeCsrKQorCQkJCXsKKwkJCQkJaWYgKEJicFI0OSA+PSBwVHNzaVBsdXNCb3VuZGFyeVtpZHhdKSAgIC8vIEZvdW5kIHRoZSByYW5nZQorCQkJCQkJYnJlYWs7CisJCQkJfQorCQkJCS8vIFRoZSBpbmRleCBpcyB0aGUgc3RlcCB3ZSBzaG91bGQgaW5jcmVhc2UsIGlkeCA9IDAgbWVhbnMgdGhlcmUgaXMgbm90aGluZyB0byBjb21wZW5zYXRlCisJCQkJKnBUeEFnY0NvbXBlbnNhdGUgPSBUeEFnY1N0ZXAgKiAoaWR4LTEpOworCQkJCURlbHRhUHdyICs9ICgqcFR4QWdjQ29tcGVuc2F0ZSk7CisJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiKysgVHggUG93ZXIsIEJCUCBSMT0leCwgVHNzaVJlZj0leCwgVHhBZ2NTdGVwPSV4LCBzdGVwID0gKyVkXG4iLAorCQkJCQlCYnBSNDksIFRzc2lSZWYsIFR4QWdjU3RlcCwgaWR4LTEpKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQkqcFR4QWdjQ29tcGVuc2F0ZSA9IDA7CisJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiICAgVHggUG93ZXIsIEJCUCBSMT0leCwgVHNzaVJlZj0leCwgVHhBZ2NTdGVwPSV4LCBzdGVwID0gKyVkXG4iLAorCQkJCQlCYnBSNDksIFRzc2lSZWYsIFR4QWdjU3RlcCwgMCkpOworCQkJfQorCQl9CisJfQorCWVsc2UKKwl7CisJCWlmIChwQWQtPmF0ZS5DaGFubmVsIDw9IDE0KQorCQl7CisJCQliQXV0b1R4QWdjICAgICAgICAgPSBwQWQtPmJBdXRvVHhBZ2NHOworCQkJcFR4QWdjQ29tcGVuc2F0ZSAgID0gJnBBZC0+VHhBZ2NDb21wZW5zYXRlRzsKKwkJfQorCQllbHNlCisJCXsKKwkJCWJBdXRvVHhBZ2MgICAgICAgICA9IHBBZC0+YkF1dG9UeEFnY0E7CisJCQlwVHhBZ2NDb21wZW5zYXRlICAgPSAmcEFkLT5UeEFnY0NvbXBlbnNhdGVBOworCQl9CisKKwkJaWYgKGJBdXRvVHhBZ2MpCisJCQlEZWx0YVB3ciArPSAoKnBUeEFnY0NvbXBlbnNhdGUpOworCX0KKworCS8qIGNhbGN1bGF0ZSBkZWx0YSBwb3dlciBiYXNlZCBvbiB0aGUgcGVyY2VudGFnZSBzcGVjaWZpZWQgZnJvbSBVSSAqLworCS8vIEUyUFJPTSBzZXR0aW5nIGlzIGNhbGlicmF0ZWQgZm9yIG1heGltdW0gVFggcG93ZXIgKGkuZS4gMTAwJSkKKwkvLyBXZSBsb3dlciBUWCBwb3dlciBoZXJlIGFjY29yZGluZyB0byB0aGUgcGVyY2VudGFnZSBzcGVjaWZpZWQgZnJvbSBVSQorCWlmIChwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA9PSAweGZmZmZmZmZmKSAgICAgICAvLyBBVVRPIFRYIFBPV0VSIGNvbnRyb2wKKwkJOworCWVsc2UgaWYgKHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID4gOTApICAvLyA5MSB+IDEwMCUgJiBBVVRPLCB0cmVhdCBhcyAxMDAlIGluIHRlcm1zIG9mIG1XCisJCTsKKwllbHNlIGlmIChwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA+IDYwKSAgLy8gNjEgfiA5MCUsIHRyZWF0IGFzIDc1JSBpbiB0ZXJtcyBvZiBtVworCXsKKwkJRGVsdGFQd3IgLT0gMTsKKwl9CisJZWxzZSBpZiAocEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UgPiAzMCkgIC8vIDMxIH4gNjAlLCB0cmVhdCBhcyA1MCUgaW4gdGVybXMgb2YgbVcKKwl7CisJCURlbHRhUHdyIC09IDM7CisJfQorCWVsc2UgaWYgKHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID4gMTUpICAvLyAxNiB+IDMwJSwgdHJlYXQgYXMgMjUlIGluIHRlcm1zIG9mIG1XCisJeworCQlEZWx0YVB3ciAtPSA2OworCX0KKwllbHNlIGlmIChwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA+IDkpICAgLy8gMTAgfiAxNSUsIHRyZWF0IGFzIDEyLjUlIGluIHRlcm1zIG9mIG1XCisJeworCQlEZWx0YVB3ciAtPSA5OworCX0KKwllbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAgfiA5ICUsIHRyZWF0IGFzIE1JTih+MyUpIGluIHRlcm1zIG9mIG1XCisJeworCQlEZWx0YVB3ciAtPSAxMjsKKwl9CisKKwkvKiByZXNldCBkaWZmZXJlbnQgbmV3IHR4IHBvd2VyIGZvciBkaWZmZXJlbnQgVFggcmF0ZSAqLworCWZvcihpPTA7IGk8NTsgaSsrKQorCXsKKwkJaWYgKFR4UHdyW2ldICE9IDB4ZmZmZmZmZmYpCisJCXsKKwkJCWZvciAoaj0wOyBqPDg7IGorKykKKwkJCXsKKwkJCQlWYWx1ZSA9IChDSEFSKSgoVHhQd3JbaV0gPj4gaio0KSAmIDB4MEYpOyAvKiAwIH4gMTUgKi8KKworCQkJCWlmICgoVmFsdWUgKyBEZWx0YVB3cikgPCAwKQorCQkJCXsKKwkJCQkJVmFsdWUgPSAwOyAvKiBtaW4gKi8KKwkJCQl9CisJCQkJZWxzZSBpZiAoKFZhbHVlICsgRGVsdGFQd3IpID4gMHhGKQorCQkJCXsKKwkJCQkJVmFsdWUgPSAweEY7IC8qIG1heCAqLworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlWYWx1ZSArPSBEZWx0YVB3cjsgLyogdGVtcGVyYXR1cmUgY29tcGVuc2F0aW9uICovCisJCQkJfQorCisJCQkJLyogZmlsbCBuZXcgdmFsdWUgdG8gQ1NSIG9mZnNldCAqLworCQkJCVR4UHdyW2ldID0gKFR4UHdyW2ldICYgfigweDAwMDAwMDBGIDw8IGoqNCkpIHwgKFZhbHVlIDw8IGoqNCk7CisJCQl9CisKKwkJCS8qIHdyaXRlIHR4IHBvd2VyIHZhbHVlIHRvIENTUiAqLworCQkJLyogVFhfUFdSX0NGR18wICg4IHR4IHJhdGUpIGZvcglUWCBwb3dlciBmb3IgT0ZETSAxMk0vMThNCisJCQkJCQkJCQkJCVRYIHBvd2VyIGZvciBPRkRNIDZNLzlNCisJCQkJCQkJCQkJCVRYIHBvd2VyIGZvciBDQ0s1LjVNLzExTQorCQkJCQkJCQkJCQlUWCBwb3dlciBmb3IgQ0NLMU0vMk0gKi8KKwkJCS8qIFRYX1BXUl9DRkdfMSB+IFRYX1BXUl9DRkdfNCAqLworCQkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfUFdSX0NGR18wICsgaSo0LCBUeFB3cltpXSk7CisKKworCQl9CisJfQorCit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJV3JpdGUgVHhXSSBmb3IgQVRFIG1vZGUuCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCisjaWZkZWYgUlQyODYwCitzdGF0aWMgVk9JRCBBVEVXcml0ZVR4V0koCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFRYV0lfU1RSVUMgCXBPdXRUeFdJLAorCUlOCUJPT0xFQU4JCQlGUkFHLAorCUlOCUJPT0xFQU4JCQlDRkFDSywKKwlJTglCT09MRUFOCQkJSW5zVGltZXN0YW1wLAorCUlOCUJPT0xFQU4gCQlBTVBEVSwKKwlJTglCT09MRUFOIAkJQWNrLAorCUlOCUJPT0xFQU4gCQlOU2VxLAkJLy8gSFcgbmV3IGEgc2VxdWVuY2UuCisJSU4JVUNIQVIJCQlCQVNpemUsCisJSU4JVUNIQVIJCQlXQ0lELAorCUlOCVVMT05HCQkJTGVuZ3RoLAorCUlOCVVDSEFSIAkJCVBJRCwKKwlJTglVQ0hBUgkJCVRJRCwKKwlJTglVQ0hBUgkJCVR4UmF0ZSwKKwlJTglVQ0hBUgkJCVR4b3Btb2RlLAorCUlOCUJPT0xFQU4JCQlDZkFjaywKKwlJTglIVFRSQU5TTUlUX1NFVFRJTkcJKnBUcmFuc21pdCkKK3sKKwlUWFdJX1NUUlVDIAkJVHhXSTsKKwlQVFhXSV9TVFJVQyAJcFR4V0k7CisKKwkvLworCS8vIEFsd2F5cyB1c2UgTG9uZyBwcmVhbWJsZSBiZWZvcmUgdmVyaWZpYXRpb24gc2hvcnQgcHJlYW1ibGUgZnVuY3Rpb25hbGl0eSB3b3JrcyB3ZWxsLgorCS8vIFRvZG86IHJlbW92ZSB0aGUgZm9sbG93aW5nIGxpbmUgaWYgc2hvcnQgcHJlYW1ibGUgZnVuY3Rpb25hbGl0eSB3b3JrcworCS8vCisJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfU0hPUlRfUFJFQU1CTEVfSU5VU0VEKTsKKwlOZGlzWmVyb01lbW9yeSgmVHhXSSwgVFhXSV9TSVpFKTsKKwlwVHhXSSA9ICZUeFdJOworCisJcFR4V0ktPkZSQUc9IEZSQUc7CisKKwlwVHhXSS0+Q0ZBQ0sgPSBDRkFDSzsKKwlwVHhXSS0+VFM9IEluc1RpbWVzdGFtcDsKKwlwVHhXSS0+QU1QRFUgPSBBTVBEVTsKKwlwVHhXSS0+QUNLID0gQWNrOworCXBUeFdJLT50eG9wPSBUeG9wbW9kZTsKKworCXBUeFdJLT5OU0VRID0gTlNlcTsKKwkvLyBKb2huIHR1bmUgdGhlIHBlcmZvcm1hY2Ugd2l0aCBJbnRlbCBDbGllbnQgaW4gMjAgTUh6IHBlcmZvcm1hbmNlCisJaWYoIEJBU2l6ZSA+NyApCisJCUJBU2l6ZSA9NzsKKworCXBUeFdJLT5CQVdpblNpemUgPSBCQVNpemU7CisJcFR4V0ktPldpcmVsZXNzQ2xpSUQgPSBXQ0lEOworCXBUeFdJLT5NUERVdG90YWxCeXRlQ291bnQgPSBMZW5ndGg7CisJcFR4V0ktPlBhY2tldElkID0gUElEOworCisJLy8gSWYgQ0NLIG9yIE9GRE0sIEJXIG11c3QgYmUgMjAKKwlwVHhXSS0+QlcgPSAocFRyYW5zbWl0LT5maWVsZC5NT0RFIDw9IE1PREVfT0ZETSkgPyAoQldfMjApIDogKHBUcmFuc21pdC0+ZmllbGQuQlcpOworCXBUeFdJLT5TaG9ydEdJID0gcFRyYW5zbWl0LT5maWVsZC5TaG9ydEdJOworCXBUeFdJLT5TVEJDID0gcFRyYW5zbWl0LT5maWVsZC5TVEJDOworCisJcFR4V0ktPk1DUyA9IHBUcmFuc21pdC0+ZmllbGQuTUNTOworCXBUeFdJLT5QSFlNT0RFID0gcFRyYW5zbWl0LT5maWVsZC5NT0RFOworCXBUeFdJLT5DRkFDSyA9IENmQWNrOworCXBUeFdJLT5NSU1PcHMgPSAwOworCXBUeFdJLT5NcGR1RGVuc2l0eSA9IDA7CisKKwlwVHhXSS0+UGFja2V0SWQgPSBwVHhXSS0+TUNTOworCU5kaXNNb3ZlTWVtb3J5KHBPdXRUeFdJLCAmVHhXSSwgc2l6ZW9mKFRYV0lfU1RSVUMpKTsKKworICAgICAgICByZXR1cm47Cit9CisjZW5kaWYgLy8gUlQyODYwIC8vCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlEaXNhYmxlIHByb3RlY3Rpb24gZm9yIEFURS4KKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIEFURURpc2FibGVBc2ljUHJvdGVjdCgKKwlJTgkJUFJUTVBfQURBUFRFUglwQWQpCit7CisJUFJPVF9DRkdfU1RSVUMJUHJvdENmZywgUHJvdENmZzQ7CisJVUlOVDMyIFByb3RlY3RbNl07CisJVVNIT1JUCQkJb2Zmc2V0OworCVVDSEFSCQkJaTsKKwlVSU5UMzIgTWFjUmVnID0gMDsKKworCS8vIENvbmZpZyBBU0lDIFJUUyB0aHJlc2hvbGQgcmVnaXN0ZXIKKwlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX1JUU19DRkcsICZNYWNSZWcpOworCU1hY1JlZyAmPSAweEZGMDAwMEZGOworCU1hY1JlZyB8PSAocEFkLT5Db21tb25DZmcuUnRzVGhyZXNob2xkIDw8IDgpOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX1JUU19DRkcsIE1hY1JlZyk7CisKKwkvLyBJbml0aWFsIGNvbW1vbiBwcm90ZWN0aW9uIHNldHRpbmdzCisJUlRNUFplcm9NZW1vcnkoUHJvdGVjdCwgc2l6ZW9mKFByb3RlY3QpKTsKKwlQcm90Q2ZnNC53b3JkID0gMDsKKwlQcm90Q2ZnLndvcmQgPSAwOworCVByb3RDZmcuZmllbGQuVHhvcEFsbG93R0Y0MCA9IDE7CisJUHJvdENmZy5maWVsZC5UeG9wQWxsb3dHRjIwID0gMTsKKwlQcm90Q2ZnLmZpZWxkLlR4b3BBbGxvd01NNDAgPSAxOworCVByb3RDZmcuZmllbGQuVHhvcEFsbG93TU0yMCA9IDE7CisJUHJvdENmZy5maWVsZC5UeG9wQWxsb3dPZmRtID0gMTsKKwlQcm90Q2ZnLmZpZWxkLlR4b3BBbGxvd0NjayA9IDE7CisJUHJvdENmZy5maWVsZC5SVFNUaEVuID0gMTsKKwlQcm90Q2ZnLmZpZWxkLlByb3RlY3ROYXYgPSBBU0lDX1NIT1JUTkFWOworCisJLy8gSGFuZGxlIGxlZ2FjeShCL0cpIHByb3RlY3Rpb24KKwlQcm90Q2ZnLmZpZWxkLlByb3RlY3RSYXRlID0gcEFkLT5Db21tb25DZmcuUnRzUmF0ZTsKKwlQcm90Q2ZnLmZpZWxkLlByb3RlY3RDdHJsID0gMDsKKwlQcm90ZWN0WzBdID0gUHJvdENmZy53b3JkOworCVByb3RlY3RbMV0gPSBQcm90Q2ZnLndvcmQ7CisKKwkvLyBOTyBQUk9URUNUCisJLy8gMS5BbGwgU1RBcyBpbiB0aGUgQlNTIGFyZSAyMC80MCBNSHogSFQKKwkvLyAyLiBpbiBhaSAyMC80ME1IeiBCU1MKKwkvLyAzLiBhbGwgU1RBcyBhcmUgMjBNSHogaW4gYSAyME1IeiBCU1MKKwkvLyBQdXJlIEhULiBubyBwcm90ZWN0aW9uLgorCisJLy8gTU0yMF9QUk9UX0NGRworCS8vCVJlc2VydmVkICgzMToyNykKKwkvLyAJUFJPVF9UWE9QKDI1OjIwKSAtLSAwMTAxMTEKKwkvLwlQUk9UX05BVigxOToxOCkgIC0tIDAxIChTaG9ydCBOQVYgcHJvdGVjdGlvbikKKwkvLyAgUFJPVF9DVFJMKDE3OjE2KSAtLSAwMCAoTm9uZSkKKwkvLyAJUFJPVF9SQVRFKDE1OjApICAtLSAweDQwMDQgKE9GRE0gMjRNKQorCVByb3RlY3RbMl0gPSAweDAxNzQ0MDA0OworCisJLy8gTU00MF9QUk9UX0NGRworCS8vCVJlc2VydmVkICgzMToyNykKKwkvLyAJUFJPVF9UWE9QKDI1OjIwKSAtLSAxMTExMTEKKwkvLwlQUk9UX05BVigxOToxOCkgIC0tIDAxIChTaG9ydCBOQVYgcHJvdGVjdGlvbikKKwkvLyAgUFJPVF9DVFJMKDE3OjE2KSAtLSAwMCAoTm9uZSkKKwkvLyAJUFJPVF9SQVRFKDE1OjApICAtLSAweDQwODQgKGR1cGxpY2F0ZSBPRkRNIDI0TSkKKwlQcm90ZWN0WzNdID0gMHgwM2Y0NDA4NDsKKworCS8vIENGMjBfUFJPVF9DRkcKKwkvLwlSZXNlcnZlZCAoMzE6MjcpCisJLy8gCVBST1RfVFhPUCgyNToyMCkgLS0gMDEwMTExCisJLy8JUFJPVF9OQVYoMTk6MTgpICAtLSAwMSAoU2hvcnQgTkFWIHByb3RlY3Rpb24pCisJLy8gIFBST1RfQ1RSTCgxNzoxNikgLS0gMDAgKE5vbmUpCisJLy8gCVBST1RfUkFURSgxNTowKSAgLS0gMHg0MDA0IChPRkRNIDI0TSkKKwlQcm90ZWN0WzRdID0gMHgwMTc0NDAwNDsKKworCS8vIENGNDBfUFJPVF9DRkcKKwkvLwlSZXNlcnZlZCAoMzE6MjcpCisJLy8gCVBST1RfVFhPUCgyNToyMCkgLS0gMTExMTExCisJLy8JUFJPVF9OQVYoMTk6MTgpICAtLSAwMSAoU2hvcnQgTkFWIHByb3RlY3Rpb24pCisJLy8gIFBST1RfQ1RSTCgxNzoxNikgLS0gMDAgKE5vbmUpCisJLy8gCVBST1RfUkFURSgxNTowKSAgLS0gMHg0MDg0IChkdXBsaWNhdGUgT0ZETSAyNE0pCisJUHJvdGVjdFs1XSA9IDB4MDNmNDQwODQ7CisKKwlwQWQtPkNvbW1vbkNmZy5JT1Rlc3RQYXJtLmJSVFNMb25nUHJvdE9uID0gRkFMU0U7CisKKwlvZmZzZXQgPSBDQ0tfUFJPVF9DRkc7CisJZm9yIChpID0gMDtpIDwgNjtpKyspCisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIG9mZnNldCArIGkqNCwgUHJvdGVjdFtpXSk7CisKK30KKworCisvKiBUaGVyZSBhcmUgdHdvIHdheXMgdG8gY29udmVydCBSc3NpICovCisjaWYgMQorLy8KKy8vIFRoZSB3YXkgdXNlZCB3aXRoIEdFVF9MTkFfR0FJTigpLgorLy8KK0NIQVIgQVRFQ29udmVydFRvUnNzaSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTglDSEFSCVJzc2ksCisJSU4gIFVDSEFSICAgUnNzaU51bWJlcikKK3sKKwlVQ0hBUglSc3NpT2Zmc2V0LCBMTkFHYWluOworCisJLy8gUnNzaSBlcXVhbHMgdG8gemVybyBzaG91bGQgYmUgYW4gaW52YWxpZCB2YWx1ZQorCWlmIChSc3NpID09IDApCisJCXJldHVybiAtOTk7CisKKwlMTkFHYWluID0gR0VUX0xOQV9HQUlOKHBBZCk7CisJaWYgKHBBZC0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbCA+IDE0KQorCXsKKwkJaWYgKFJzc2lOdW1iZXIgPT0gMCkKKwkJCVJzc2lPZmZzZXQgPSBwQWQtPkFSc3NpT2Zmc2V0MDsKKwkJZWxzZSBpZiAoUnNzaU51bWJlciA9PSAxKQorCQkJUnNzaU9mZnNldCA9IHBBZC0+QVJzc2lPZmZzZXQxOworCQllbHNlCisJCQlSc3NpT2Zmc2V0ID0gcEFkLT5BUnNzaU9mZnNldDI7CisJfQorCWVsc2UKKwl7CisJCWlmIChSc3NpTnVtYmVyID09IDApCisJCQlSc3NpT2Zmc2V0ID0gcEFkLT5CR1Jzc2lPZmZzZXQwOworCQllbHNlIGlmIChSc3NpTnVtYmVyID09IDEpCisJCQlSc3NpT2Zmc2V0ID0gcEFkLT5CR1Jzc2lPZmZzZXQxOworCQllbHNlCisJCQlSc3NpT2Zmc2V0ID0gcEFkLT5CR1Jzc2lPZmZzZXQyOworCX0KKworCXJldHVybiAoLTEyIC0gUnNzaU9mZnNldCAtIExOQUdhaW4gLSBSc3NpKTsKK30KKyNlbHNlCisvLworLy8gVGhlIHdheSBvcmlnaW5hbGx5IHVzZWQgaW4gQVRFIG9mIHJ0Mjg2MGFwLgorLy8KK0NIQVIgQVRFQ29udmVydFRvUnNzaSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTglDSEFSCQkJUnNzaSwKKwlJTiAgVUNIQVIgICBSc3NpTnVtYmVyKQoreworCVVDSEFSCVJzc2lPZmZzZXQsIExOQUdhaW47CisKKwkvLyBSc3NpIGVxdWFscyB0byB6ZXJvIHNob3VsZCBiZSBhbiBpbnZhbGlkIHZhbHVlCisJaWYgKFJzc2kgPT0gMCkKKwkJcmV0dXJuIC05OTsKKworICAgIGlmIChwQWQtPkxhdGNoUmZSZWdzLkNoYW5uZWwgPiAxNCkKKyAgICB7CisgICAgICAgIExOQUdhaW4gPSBwQWQtPkFMTkFHYWluOworICAgICAgICBpZiAoUnNzaU51bWJlciA9PSAwKQorCQkJUnNzaU9mZnNldCA9IHBBZC0+QVJzc2lPZmZzZXQwOworCQllbHNlIGlmIChSc3NpTnVtYmVyID09IDEpCisJCQlSc3NpT2Zmc2V0ID0gcEFkLT5BUnNzaU9mZnNldDE7CisJCWVsc2UKKwkJCVJzc2lPZmZzZXQgPSBwQWQtPkFSc3NpT2Zmc2V0MjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgTE5BR2FpbiA9IHBBZC0+QkxOQUdhaW47CisgICAgICAgIGlmIChSc3NpTnVtYmVyID09IDApCisJCQlSc3NpT2Zmc2V0ID0gcEFkLT5CR1Jzc2lPZmZzZXQwOworCQllbHNlIGlmIChSc3NpTnVtYmVyID09IDEpCisJCQlSc3NpT2Zmc2V0ID0gcEFkLT5CR1Jzc2lPZmZzZXQxOworCQllbHNlCisJCQlSc3NpT2Zmc2V0ID0gcEFkLT5CR1Jzc2lPZmZzZXQyOworICAgIH0KKworICAgIHJldHVybiAoLTMyIC0gUnNzaU9mZnNldCArIExOQUdhaW4gLSBSc3NpKTsKK30KKyNlbmRpZiAvKiBlbmQgb2YgI2lmIDEgKi8KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVNldCBKYXBhbiBmaWx0ZXIgY29lZmZpY2llbnRzIGlmIG5lZWRlZC4KKwlOb3RlOgorCQlUaGlzIHJvdXRpbmUgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIHdoZW4KKwkJZW50ZXJpbmcgVFhGUkFNRSBtb2RlIG9yIFRYQ09OVCBtb2RlLgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworc3RhdGljIFZPSUQgU2V0SmFwYW5GaWx0ZXIoCisJSU4JCVBSVE1QX0FEQVBURVIJcEFkKQoreworCVVDSEFSCQkJQmJwRGF0YSA9IDA7CisKKwkvLworCS8vIElmIENoYW5uZWw9MTQgYW5kIEJhbmR3aWR0aD0yME0gYW5kIE1vZGU9Q0NLLCBzZXQgQkJQIFI0IGJpdDU9MQorCS8vIChKYXBhbiBUeCBmaWx0ZXIgY29lZmZpY2llbnRzKXdoZW4gKFRYRlJBTUUgb3IgVFhDT05UKS4KKwkvLworCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCAmQmJwRGF0YSk7CisKKyAgICBpZiAoKHBBZC0+YXRlLlR4V0kuUEhZTU9ERSA9PSBNT0RFX0NDSykgJiYgKHBBZC0+YXRlLkNoYW5uZWwgPT0gMTQpICYmIChwQWQtPmF0ZS5UeFdJLkJXID09IEJXXzIwKSkKKyAgICB7CisgICAgICAgIEJicERhdGEgfD0gMHgyMDsgICAgLy8gdHVybiBvbgorICAgICAgICBBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRKYXBhbkZpbHRlciEhIVxuIikpOworICAgIH0KKyAgICBlbHNlCisgICAgeworCQlCYnBEYXRhICY9IDB4ZGY7ICAgIC8vIHR1cm4gb2ZmCisJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNsZWFySmFwYW5GaWx0ZXIhISFcbiIpKTsKKyAgICB9CisKKwlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsIEJicERhdGEpOworfQorCitWT0lEIEFURVNhbXBsZVJzc2koCisJSU4gUFJUTVBfQURBUFRFUglwQWQsCisJSU4gUFJYV0lfU1RSVUMJCXBSeFdJKQoreworCS8qIFRoZXJlIGFyZSB0d28gd2F5cyB0byBjb2xsZWN0IFJTU0kuICovCisjaWYgMQorCS8vcEFkLT5MYXN0UnhSYXRlID0gKFVTSE9SVCkoKHBSeFdJLT5NQ1MpICsgKHBSeFdJLT5CVyA8PDcpICsgKHBSeFdJLT5TaG9ydEdJIDw8OCkrIChwUnhXSS0+UEhZTU9ERSA8PDE0KSkgOworCWlmIChwUnhXSS0+UlNTSTAgIT0gMCkKKwl7CisJCXBBZC0+YXRlLkxhc3RSc3NpMAk9IEFURUNvbnZlcnRUb1Jzc2kocEFkLCAoQ0hBUikgcFJ4V0ktPlJTU0kwLCBSU1NJXzApOworCQlwQWQtPmF0ZS5BdmdSc3NpMFg4CT0gKHBBZC0+YXRlLkF2Z1Jzc2kwWDggLSBwQWQtPmF0ZS5BdmdSc3NpMCkgKyBwQWQtPmF0ZS5MYXN0UnNzaTA7CisJCXBBZC0+YXRlLkF2Z1Jzc2kwICAJPSBwQWQtPmF0ZS5BdmdSc3NpMFg4ID4+IDM7CisJfQorCWlmIChwUnhXSS0+UlNTSTEgIT0gMCkKKwl7CisJCXBBZC0+YXRlLkxhc3RSc3NpMQk9IEFURUNvbnZlcnRUb1Jzc2kocEFkLCAoQ0hBUikgcFJ4V0ktPlJTU0kxLCBSU1NJXzEpOworCQlwQWQtPmF0ZS5BdmdSc3NpMVg4CT0gKHBBZC0+YXRlLkF2Z1Jzc2kxWDggLSBwQWQtPmF0ZS5BdmdSc3NpMSkgKyBwQWQtPmF0ZS5MYXN0UnNzaTE7CisJCXBBZC0+YXRlLkF2Z1Jzc2kxCT0gcEFkLT5hdGUuQXZnUnNzaTFYOCA+PiAzOworCX0KKwlpZiAocFJ4V0ktPlJTU0kyICE9IDApCisJeworCQlwQWQtPmF0ZS5MYXN0UnNzaTIJPSBBVEVDb252ZXJ0VG9Sc3NpKHBBZCwgKENIQVIpIHBSeFdJLT5SU1NJMiwgUlNTSV8yKTsKKwkJcEFkLT5hdGUuQXZnUnNzaTJYOAk9IChwQWQtPmF0ZS5BdmdSc3NpMlg4IC0gcEFkLT5hdGUuQXZnUnNzaTIpICsgcEFkLT5hdGUuTGFzdFJzc2kyOworCQlwQWQtPmF0ZS5BdmdSc3NpMgk9IHBBZC0+YXRlLkF2Z1Jzc2kyWDggPj4gMzsKKwl9CisKKwlwQWQtPmF0ZS5MYXN0U05SMCA9IChDSEFSKShwUnhXSS0+U05SMCk7Ly8gQ0hBUiA9PT4gVUNIQVIgPworCXBBZC0+YXRlLkxhc3RTTlIxID0gKENIQVIpKHBSeFdJLT5TTlIxKTsvLyBDSEFSID09PiBVQ0hBUiA/CisKKwlwQWQtPmF0ZS5OdW1PZkF2Z1Jzc2lTYW1wbGUgKys7CisjZWxzZQorCXBBZC0+YXRlLkxhc3RTTlIwID0gKENIQVIpKHBSeFdJLT5TTlIwKTsKKwlwQWQtPmF0ZS5MYXN0U05SMSA9IChDSEFSKShwUnhXSS0+U05SMSk7CisJcEFkLT5hdGUuUnhDbnRQZXJTZWMrKzsKKwlwQWQtPmF0ZS5MYXN0UnNzaTAgPSBBVEVDb252ZXJ0VG9Sc3NpKHBBZCwgKENIQVIpIHBSeFdJLT5SU1NJMCwgUlNTSV8wKTsKKwlwQWQtPmF0ZS5MYXN0UnNzaTEgPSBBVEVDb252ZXJ0VG9Sc3NpKHBBZCwgKENIQVIpIHBSeFdJLT5SU1NJMSwgUlNTSV8xKTsKKwlwQWQtPmF0ZS5MYXN0UnNzaTIgPSBBVEVDb252ZXJ0VG9Sc3NpKHBBZCwgKENIQVIpIHBSeFdJLT5SU1NJMiwgUlNTSV8yKTsKKwlwQWQtPmF0ZS5BdmdSc3NpMFg4ID0gKHBBZC0+YXRlLkF2Z1Jzc2kwWDggLSBwQWQtPmF0ZS5BdmdSc3NpMCkgKyBwQWQtPmF0ZS5MYXN0UnNzaTA7CisJcEFkLT5hdGUuQXZnUnNzaTAgPSBwQWQtPmF0ZS5BdmdSc3NpMFg4ID4+IDM7CisJcEFkLT5hdGUuQXZnUnNzaTFYOCA9IChwQWQtPmF0ZS5BdmdSc3NpMVg4IC0gcEFkLT5hdGUuQXZnUnNzaTEpICsgcEFkLT5hdGUuTGFzdFJzc2kxOworCXBBZC0+YXRlLkF2Z1Jzc2kxID0gcEFkLT5hdGUuQXZnUnNzaTFYOCA+PiAzOworCXBBZC0+YXRlLkF2Z1Jzc2kyWDggPSAocEFkLT5hdGUuQXZnUnNzaTJYOCAtIHBBZC0+YXRlLkF2Z1Jzc2kyKSArIHBBZC0+YXRlLkxhc3RSc3NpMjsKKwlwQWQtPmF0ZS5BdmdSc3NpMiA9IHBBZC0+YXRlLkF2Z1Jzc2kyWDggPj4gMzsKKwlwQWQtPmF0ZS5OdW1PZkF2Z1Jzc2lTYW1wbGUgKys7CisjZW5kaWYKK30KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorVk9JRCBSVE1QU3RhdGlvblN0b3AoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpCit7CisvLwlCT09MRUFOICAgICAgIENhbmNlbGxlZDsKKworICAgIEFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PiBSVE1QU3RhdGlvblN0b3BcbiIpKTsKKworI2lmIDAKKwlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5Bc3NvY1RpbWVyLCAgICAgICZDYW5jZWxsZWQpOworCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LlJlYXNzb2NUaW1lciwgICAgJkNhbmNlbGxlZCk7CisJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguRGlzYXNzb2NUaW1lciwgICAmQ2FuY2VsbGVkKTsKKwlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5BdXRoVGltZXIsICAgICAgICZDYW5jZWxsZWQpOworCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LkJlYWNvblRpbWVyLCAgICAgJkNhbmNlbGxlZCk7CisJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguU2NhblRpbWVyLCAgICAgICAmQ2FuY2VsbGVkKTsKKyNlbmRpZgorCS8vIEZvciByeCBzdGF0aXN0aWNzLCB3ZSBuZWVkIHRvIGtlZXAgdGhpcyB0aW1lciBydW5uaW5nLgorLy8JUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWUuUGVyaW9kaWNUaW1lciwgICAgICAmQ2FuY2VsbGVkKTsKKworICAgIEFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PSBSVE1QU3RhdGlvblN0b3BcbiIpKTsKK30KKworVk9JRCBSVE1QU3RhdGlvblN0YXJ0KAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkKQoreworICAgIEFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PiBSVE1QU3RhdGlvblN0YXJ0XG4iKSk7CisjaWZkZWYgUlQyODYwCisJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfSURMRTsKKwkvLworCS8vIFdlIGRpZCBub3QgY2FuY2VsIHRoaXMgdGltZXIgd2hlbiBlbnRlcmluZyBBVEUgbW9kZS4KKwkvLworLy8JUlRNUFNldFRpbWVyKCZwQWQtPk1sbWUuUGVyaW9kaWNUaW1lciwgTUxNRV9UQVNLX0VYRUNfSU5UVik7CisjZW5kaWYgLy8gUlQyODYwIC8vCisJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPD09IFJUTVBTdGF0aW9uU3RhcnRcbiIpKTsKK30KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlTZXR1cCBGcmFtZSBmb3JtYXQuCisJTk9URToKKwkJVGhpcyByb3V0aW5lIHNob3VsZCBvbmx5IGJlIHVzZWQgaW4gQVRFIG1vZGUuCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworI2lmZGVmIFJUMjg2MAorc3RhdGljIElOVCBBVEVTZXRVcEZyYW1lKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVJTlQzMiBUeElkeCkKK3sKKwlVSU5UIGo7CisJUFRYRF9TVFJVQyBwVHhEOworI2lmZGVmIFJUX0JJR19FTkRJQU4KKyAgICBQVFhEX1NUUlVDICAgICAgcERlc3RUeEQ7CisgICAgVFhEX1NUUlVDICAgICAgIFR4RDsKKyNlbmRpZgorCVBORElTX1BBQ0tFVCBwUGFja2V0OworCVBVQ0hBUiBwRGVzdDsKKwlQVk9JRCBBbGxvY1ZhOworCU5ESVNfUEhZU0lDQUxfQUREUkVTUyBBbGxvY1BhOworCUhUVFJBTlNNSVRfU0VUVElORwlUeEhUUGh5TW9kZTsKKworCVBSVE1QX1RYX1JJTkcgcFR4UmluZyA9ICZwQWQtPlR4UmluZ1tRSURfQUNfQkVdOworCVBUWFdJX1NUUlVDIHBUeFdJID0gKFBUWFdJX1NUUlVDKSBwVHhSaW5nLT5DZWxsW1R4SWR4XS5EbWFCdWYuQWxsb2NWYTsKKwlQVUNIQVIgcERNQUhlYWRlckJ1ZlZBID0gKFBVQ0hBUikgcFR4UmluZy0+Q2VsbFtUeElkeF0uRG1hQnVmLkFsbG9jVmE7CisKKyNpZmRlZiBSQUxJTktfMjh4eF9RQQorCVBIRUFERVJfODAyXzExCXBIZWFkZXI4MDIxMTsKKyNlbmRpZiAvLyBSQUxJTktfMjh4eF9RQSAvLworCisJaWYgKHBBZC0+YXRlLmJRQVR4U3RhcnQgPT0gVFJVRSkKKwl7CisJCS8vIGFsd2F5cyB1c2UgUUlEX0FDX0JFIGFuZCBGSUZPX0VEQ0EKKworCQkvLyBmaWxsIFR4V0kKKwkJVHhIVFBoeU1vZGUuZmllbGQuQlcgPSBwQWQtPmF0ZS5UeFdJLkJXOworCQlUeEhUUGh5TW9kZS5maWVsZC5TaG9ydEdJID0gcEFkLT5hdGUuVHhXSS5TaG9ydEdJOworCQlUeEhUUGh5TW9kZS5maWVsZC5TVEJDID0gMDsKKwkJVHhIVFBoeU1vZGUuZmllbGQuTUNTID0gcEFkLT5hdGUuVHhXSS5NQ1M7CisJCVR4SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBwQWQtPmF0ZS5UeFdJLlBIWU1PREU7CisJCUFURVdyaXRlVHhXSShwQWQsIHBUeFdJLCBwQWQtPmF0ZS5UeFdJLkZSQUcsIHBBZC0+YXRlLlR4V0kuQ0ZBQ0ssIHBBZC0+YXRlLlR4V0kuVFMsICBwQWQtPmF0ZS5UeFdJLkFNUERVLCBwQWQtPmF0ZS5UeFdJLkFDSywgcEFkLT5hdGUuVHhXSS5OU0VRLAorCQkJcEFkLT5hdGUuVHhXSS5CQVdpblNpemUsIDAsIHBBZC0+YXRlLlR4V0kuTVBEVXRvdGFsQnl0ZUNvdW50LCBwQWQtPmF0ZS5UeFdJLlBhY2tldElkLCAwLCAwLCBwQWQtPmF0ZS5UeFdJLnR4b3AvKklGU19IVFRYT1AqLywgcEFkLT5hdGUuVHhXSS5DRkFDSy8qRkFMU0UqLywgJlR4SFRQaHlNb2RlKTsKKwl9CisJZWxzZQorCXsKKwkJVHhIVFBoeU1vZGUuZmllbGQuQlcgPSBwQWQtPmF0ZS5UeFdJLkJXOworCQlUeEhUUGh5TW9kZS5maWVsZC5TaG9ydEdJID0gcEFkLT5hdGUuVHhXSS5TaG9ydEdJOworCQlUeEhUUGh5TW9kZS5maWVsZC5TVEJDID0gMDsKKwkJVHhIVFBoeU1vZGUuZmllbGQuTUNTID0gcEFkLT5hdGUuVHhXSS5NQ1M7CisJCVR4SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBwQWQtPmF0ZS5UeFdJLlBIWU1PREU7CisJCUFURVdyaXRlVHhXSShwQWQsIHBUeFdJLCBGQUxTRSwgRkFMU0UsIEZBTFNFLCAgRkFMU0UsIEZBTFNFLCBGQUxTRSwKKwkJCTQsIDAsIHBBZC0+YXRlLlR4TGVuZ3RoLCAwLCAwLCAwLCBJRlNfSFRUWE9QLCBGQUxTRSwgJlR4SFRQaHlNb2RlKTsKKwl9CisKKwkvLyBmaWxsIDgwMi4xMSBoZWFkZXIuCisjaWZkZWYgUkFMSU5LXzI4eHhfUUEKKwlpZiAocEFkLT5hdGUuYlFBVHhTdGFydCA9PSBUUlVFKQorCXsKKwkJTmRpc01vdmVNZW1vcnkocERNQUhlYWRlckJ1ZlZBK1RYV0lfU0laRSwgcEFkLT5hdGUuSGVhZGVyLCBwQWQtPmF0ZS5ITGVuKTsKKwl9CisJZWxzZQorI2VuZGlmIC8vIFJBTElOS18yOHh4X1FBIC8vCisJeworCQlOZGlzTW92ZU1lbW9yeShwRE1BSGVhZGVyQnVmVkErVFhXSV9TSVpFLCBUZW1wbGF0ZUZyYW1lLCBMRU5HVEhfODAyXzExKTsKKwkJTmRpc01vdmVNZW1vcnkocERNQUhlYWRlckJ1ZlZBK1RYV0lfU0laRSs0LCBwQWQtPmF0ZS5BZGRyMSwgRVRIX0xFTkdUSF9PRl9BRERSRVNTKTsKKwkJTmRpc01vdmVNZW1vcnkocERNQUhlYWRlckJ1ZlZBK1RYV0lfU0laRSsxMCwgcEFkLT5hdGUuQWRkcjIsIEVUSF9MRU5HVEhfT0ZfQUREUkVTUyk7CisJCU5kaXNNb3ZlTWVtb3J5KHBETUFIZWFkZXJCdWZWQStUWFdJX1NJWkUrMTYsIHBBZC0+YXRlLkFkZHIzLCBFVEhfTEVOR1RIX09GX0FERFJFU1MpOworCX0KKworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwlSVE1QRnJhbWVFbmRpYW5DaGFuZ2UocEFkLCAoKChQVUNIQVIpcERNQUhlYWRlckJ1ZlZBKStUWFdJX1NJWkUpLCBESVJfUkVBRCwgRkFMU0UpOworI2VuZGlmIC8vIFJUX0JJR19FTkRJQU4gLy8KKworCS8qIGFsbG9jIGJ1ZmZlciBmb3IgcGF5bG9hZCAqLworI2lmZGVmIFJBTElOS18yOHh4X1FBCisJaWYgKHBBZC0+YXRlLmJRQVR4U3RhcnQgPT0gVFJVRSkKKwl7CisJCS8qIFdoeSBub3QgdXNlIFJUTVBfQWxsb2NhdGVUeFBhY2tldEJ1ZmZlcigpIGluc3RlYWQgb2YgUlRNUF9BbGxvY2F0ZVJ4UGFja2V0QnVmZmVyKCk/ICovCisJCXBQYWNrZXQgPSBSVE1QX0FsbG9jYXRlUnhQYWNrZXRCdWZmZXIocEFkLCBwQWQtPmF0ZS5ETGVuICsgMHgxMDAsIEZBTFNFLCAmQWxsb2NWYSwgJkFsbG9jUGEpOworCX0KKwllbHNlCisjZW5kaWYgLy8gUkFMSU5LXzI4eHhfUUEgLy8KKwl7CisJCS8qIFdoeSBub3QgdXNlIFJUTVBfQWxsb2NhdGVUeFBhY2tldEJ1ZmZlcigpIGluc3RlYWQgb2YgUlRNUF9BbGxvY2F0ZVJ4UGFja2V0QnVmZmVyKCk/ICovCisJCXBQYWNrZXQgPSBSVE1QX0FsbG9jYXRlUnhQYWNrZXRCdWZmZXIocEFkLCBwQWQtPmF0ZS5UeExlbmd0aCwgRkFMU0UsICZBbGxvY1ZhLCAmQWxsb2NQYSk7CisJfQorCisJaWYgKHBQYWNrZXQgPT0gTlVMTCkKKwl7CisJCXBBZC0+YXRlLlR4Q291bnQgPSAwOworCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcyBmYWlsIHRvIGFsbG9jIHBhY2tldCBzcGFjZS5cbiIsIF9fZnVuY19fKSk7CisJCXJldHVybiAtMTsKKwl9CisJcFR4UmluZy0+Q2VsbFtUeElkeF0ucE5leHROZGlzUGFja2V0ID0gcFBhY2tldDsKKworCXBEZXN0ID0gKFBVQ0hBUikgQWxsb2NWYTsKKworI2lmZGVmIFJBTElOS18yOHh4X1FBCisJaWYgKHBBZC0+YXRlLmJRQVR4U3RhcnQgPT0gVFJVRSkKKwl7CisJCVJUUEtUX1RPX09TUEtUKHBQYWNrZXQpLT5sZW4gPSBwQWQtPmF0ZS5ETGVuOworCX0KKwllbHNlCisjZW5kaWYgLy8gUkFMSU5LXzI4eHhfUUEgLy8KKwl7CisJCVJUUEtUX1RPX09TUEtUKHBQYWNrZXQpLT5sZW4gPSBwQWQtPmF0ZS5UeExlbmd0aCAtIExFTkdUSF84MDJfMTE7CisJfQorCisJLy8gUHJlcGFyZSBmcmFtZSBwYXlsb2FkCisjaWZkZWYgUkFMSU5LXzI4eHhfUUEKKwlpZiAocEFkLT5hdGUuYlFBVHhTdGFydCA9PSBUUlVFKQorCXsKKwkJLy8gY29weSBwYXR0ZXJuCisJCWlmICgocEFkLT5hdGUuUExlbiAhPSAwKSkKKwkJeworCQkJaW50IGo7CisKKwkJCWZvciAoaiA9IDA7IGogPCBwQWQtPmF0ZS5ETGVuOyBqKz1wQWQtPmF0ZS5QTGVuKQorCQkJeworCQkJCW1lbWNweShSVFBLVF9UT19PU1BLVChwUGFja2V0KS0+ZGF0YSArIGosIHBBZC0+YXRlLlBhdHRlcm4sIHBBZC0+YXRlLlBMZW4pOworCQkJfQorCQl9CisJfQorCWVsc2UKKyNlbmRpZiAvLyBSQUxJTktfMjh4eF9RQSAvLworCXsKKwkJZm9yKGogPSAwOyBqIDwgUlRQS1RfVE9fT1NQS1QocFBhY2tldCktPmxlbjsgaisrKQorCQkJcERlc3Rbal0gPSAweEE1OworCX0KKworCS8vCisJLy8gYnVpbGQgVHggRGVzY3JpcHRvcgorCS8vCisjaWZuZGVmIFJUX0JJR19FTkRJQU4KKwlwVHhEID0gKFBUWERfU1RSVUMpIHBUeFJpbmctPkNlbGxbVHhJZHhdLkFsbG9jVmE7CisjZWxzZQorICAgIHBEZXN0VHhEICA9IChQVFhEX1NUUlVDKXBUeFJpbmctPkNlbGxbVHhJZHhdLkFsbG9jVmE7CisgICAgVHhEID0gKnBEZXN0VHhEOworICAgIHBUeEQgPSAmVHhEOworI2VuZGlmIC8vICFSVF9CSUdfRU5ESUFOIC8vCisKKyNpZmRlZiBSQUxJTktfMjh4eF9RQQorCWlmIChwQWQtPmF0ZS5iUUFUeFN0YXJ0ID09IFRSVUUpCisJeworCQkvLyBwcmVwYXJlIFR4RAorCQlOZGlzWmVyb01lbW9yeShwVHhELCBUWERfU0laRSk7CisJCVJUTVBXcml0ZVR4RGVzY3JpcHRvcihwQWQsIHBUeEQsIEZBTFNFLCBGSUZPX0VEQ0EpOworCQkvLyBidWlsZCBUWCBERVNDCisJCXBUeEQtPlNEUHRyMCA9IFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzTG93KHBUeFJpbmctPkNlbGxbVHhJZHhdLkRtYUJ1Zi5BbGxvY1BhKTsKKwkJcFR4RC0+U0RMZW4wID0gVFhXSV9TSVpFICsgcEFkLT5hdGUuSExlbjsKKwkJcFR4RC0+TGFzdFNlYzAgPSAwOworCQlwVHhELT5TRFB0cjEgPSBBbGxvY1BhOworCQlwVHhELT5TRExlbjEgPSBSVFBLVF9UT19PU1BLVChwUGFja2V0KS0+bGVuOworCQlwVHhELT5MYXN0U2VjMSA9IDE7CisKKwkJcERlc3QgPSAoUFVDSEFSKXBUeFdJOworCQlwRGVzdCArPSBUWFdJX1NJWkU7CisJCXBIZWFkZXI4MDIxMSA9IChQSEVBREVSXzgwMl8xMSlwRGVzdDsKKworCQkvLyBtb2RpZnkgc2VxdWVuY2UgbnVtYmVyLi4uLgorCQlpZiAocEFkLT5hdGUuVHhEb25lQ291bnQgPT0gMCkKKwkJeworCQkJcEFkLT5hdGUuc2VxID0gcEhlYWRlcjgwMjExLT5TZXF1ZW5jZTsKKwkJfQorCQllbHNlCisJCQlwSGVhZGVyODAyMTEtPlNlcXVlbmNlID0gKytwQWQtPmF0ZS5zZXE7CisJfQorCWVsc2UKKyNlbmRpZiAvLyBSQUxJTktfMjh4eF9RQSAvLworCXsKKwkJTmRpc1plcm9NZW1vcnkocFR4RCwgVFhEX1NJWkUpOworCQlSVE1QV3JpdGVUeERlc2NyaXB0b3IocEFkLCBwVHhELCBGQUxTRSwgRklGT19FRENBKTsKKwkJLy8gYnVpbGQgVFggREVTQworCQlwVHhELT5TRFB0cjAgPSBSVE1QX0dldFBoeXNpY2FsQWRkcmVzc0xvdyAocFR4UmluZy0+Q2VsbFtUeElkeF0uRG1hQnVmLkFsbG9jUGEpOworCQlwVHhELT5TRExlbjAgPSBUWFdJX1NJWkUgKyBMRU5HVEhfODAyXzExOworCQlwVHhELT5MYXN0U2VjMCA9IDA7CisJCXBUeEQtPlNEUHRyMSA9IEFsbG9jUGE7CisJCXBUeEQtPlNETGVuMSA9IFJUUEtUX1RPX09TUEtUKHBQYWNrZXQpLT5sZW47CisJCXBUeEQtPkxhc3RTZWMxID0gMTsKKwl9CisKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJUlRNUFdJRW5kaWFuQ2hhbmdlKChQVUNIQVIpcFR4V0ksIFRZUEVfVFhXSSk7CisJUlRNUEZyYW1lRW5kaWFuQ2hhbmdlKHBBZCwgKCgoUFVDSEFSKXBETUFIZWFkZXJCdWZWQSkrVFhXSV9TSVpFKSwgRElSX1dSSVRFLCBGQUxTRSk7CisgICAgUlRNUERlc2NyaXB0b3JFbmRpYW5DaGFuZ2UoKFBVQ0hBUilwVHhELCBUWVBFX1RYRCk7CisgICAgV3JpdGVCYWNrVG9EZXNjcmlwdG9yKChQVUNIQVIpcERlc3RUeEQsIChQVUNIQVIpcFR4RCwgRkFMU0UsIFRZUEVfVFhEKTsKKyNlbmRpZiAvLyBSVF9CSUdfRU5ESUFOIC8vCisJcmV0dXJuIDA7Cit9CisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyo9PT09PT09PT09PT09PT09PT09PT09PUVuZCBvZiBSVDI4NjA9PT09PT09PT09PT09PT09PT09PT09PSovCisjZW5kaWYgLy8gUlQyODYwIC8vCisKKworVk9JRCBydF9lZV9yZWFkX2FsbChQUlRNUF9BREFQVEVSIHBBZCwgVVNIT1JUICpEYXRhKQoreworCVVTSE9SVCBpOworCVVTSE9SVCB2YWx1ZTsKKworCWZvciAoaSA9IDAgOyBpIDwgRUVQUk9NX1NJWkUvMiA7ICkKKwl7CisJCS8qICJ2YWx1ZSIgaXMgZXhwZWNpYWxseSBmb3Igc29tZSBjb21waWxlcnMuLi4gKi8KKwkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBpKjIsIHZhbHVlKTsKKwkJRGF0YVtpXSA9IHZhbHVlOworCQlpKys7CisJfQorfQorCitWT0lEIHJ0X2VlX3dyaXRlX2FsbChQUlRNUF9BREFQVEVSIHBBZCwgVVNIT1JUICpEYXRhKQoreworCVVTSE9SVCBpOworCVVTSE9SVCB2YWx1ZTsKKworCWZvciAoaSA9IDAgOyBpIDwgRUVQUk9NX1NJWkUvMiA7ICkKKwl7CisJCS8qICJ2YWx1ZSIgaXMgZXhwZWNpYWxseSBmb3Igc29tZSBjb21waWxlcnMuLi4gKi8KKwkJdmFsdWUgPSBEYXRhW2ldOworCQlSVDI4eHhfRUVQUk9NX1dSSVRFMTYocEFkLCBpKjIsIHZhbHVlKTsKKwkJaSArKzsKKwl9Cit9CisjaWZkZWYgUkFMSU5LXzI4eHhfUUEKK1ZPSUQgQVRFX1FBX1N0YXRpc3RpY3MoCisJSU4gUFJUTVBfQURBUFRFUgkJCXBBZCwKKwlJTiBQUlhXSV9TVFJVQwkJCQlwUnhXSSwKKwlJTiBQUlQyOFhYX1JYRF9TVFJVQwkJcFJ4RCwKKwlJTiBQSEVBREVSXzgwMl8xMQkJCXBIZWFkZXIpCit7CisJLy8gdXBkYXRlIGNvdW50ZXIgZmlyc3QKKwlpZiAocEhlYWRlciAhPSBOVUxMKQorCXsKKwkJaWYgKHBIZWFkZXItPkZDLlR5cGUgPT0gQlRZUEVfREFUQSkKKwkJeworCQkJaWYgKHBSeEQtPlUyTSkKKwkJCQlwQWQtPmF0ZS5VMk0rKzsKKwkJCWVsc2UKKwkJCQlwQWQtPmF0ZS5PdGhlckRhdGErKzsKKwkJfQorCQllbHNlIGlmIChwSGVhZGVyLT5GQy5UeXBlID09IEJUWVBFX01HTVQpCisJCXsKKwkJCWlmIChwSGVhZGVyLT5GQy5TdWJUeXBlID09IFNVQlRZUEVfQkVBQ09OKQorCQkJCXBBZC0+YXRlLkJlYWNvbisrOworCQkJZWxzZQorCQkJCXBBZC0+YXRlLk90aGVyQ291bnQrKzsKKwkJfQorCQllbHNlIGlmIChwSGVhZGVyLT5GQy5UeXBlID09IEJUWVBFX0NOVEwpCisJCXsKKwkJCXBBZC0+YXRlLk90aGVyQ291bnQrKzsKKwkJfQorCX0KKwlwQWQtPmF0ZS5SU1NJMCA9IHBSeFdJLT5SU1NJMDsKKwlwQWQtPmF0ZS5SU1NJMSA9IHBSeFdJLT5SU1NJMTsKKwlwQWQtPmF0ZS5SU1NJMiA9IHBSeFdJLT5SU1NJMjsKKwlwQWQtPmF0ZS5TTlIwID0gcFJ4V0ktPlNOUjA7CisJcEFkLT5hdGUuU05SMSA9IHBSeFdJLT5TTlIxOworfQorCisvKiBjb21tYW5kIGlkIHdpdGggQ21kIFR5cGUgPT0gMHgwMDA4KGZvciAyOHh4KS8weDAwMDUoZm9yIGlOSUMpICovCisjZGVmaW5lIFJBQ0ZHX0NNRF9SRl9XUklURV9BTEwJCTB4MDAwMAorI2RlZmluZSBSQUNGR19DTURfRTJQUk9NX1JFQUQxNgkJMHgwMDAxCisjZGVmaW5lIFJBQ0ZHX0NNRF9FMlBST01fV1JJVEUxNgkweDAwMDIKKyNkZWZpbmUgUkFDRkdfQ01EX0UyUFJPTV9SRUFEX0FMTAkweDAwMDMKKyNkZWZpbmUgUkFDRkdfQ01EX0UyUFJPTV9XUklURV9BTEwJMHgwMDA0CisjZGVmaW5lIFJBQ0ZHX0NNRF9JT19SRUFECQkJMHgwMDA1CisjZGVmaW5lIFJBQ0ZHX0NNRF9JT19XUklURQkJCTB4MDAwNgorI2RlZmluZSBSQUNGR19DTURfSU9fUkVBRF9CVUxLCQkweDAwMDcKKyNkZWZpbmUgUkFDRkdfQ01EX0JCUF9SRUFEOAkJCTB4MDAwOAorI2RlZmluZSBSQUNGR19DTURfQkJQX1dSSVRFOAkJMHgwMDA5CisjZGVmaW5lIFJBQ0ZHX0NNRF9CQlBfUkVBRF9BTEwJCTB4MDAwYQorI2RlZmluZSBSQUNGR19DTURfR0VUX0NPVU5URVIJCTB4MDAwYgorI2RlZmluZSBSQUNGR19DTURfQ0xFQVJfQ09VTlRFUgkJMHgwMDBjCisKKyNkZWZpbmUgUkFDRkdfQ01EX1JTVjEJCQkJMHgwMDBkCisjZGVmaW5lIFJBQ0ZHX0NNRF9SU1YyCQkJCTB4MDAwZQorI2RlZmluZSBSQUNGR19DTURfUlNWMwkJCQkweDAwMGYKKworI2RlZmluZSBSQUNGR19DTURfVFhfU1RBUlQJCQkweDAwMTAKKyNkZWZpbmUgUkFDRkdfQ01EX0dFVF9UWF9TVEFUVVMJCTB4MDAxMQorI2RlZmluZSBSQUNGR19DTURfVFhfU1RPUAkJCTB4MDAxMgorI2RlZmluZSBSQUNGR19DTURfUlhfU1RBUlQJCQkweDAwMTMKKyNkZWZpbmUgUkFDRkdfQ01EX1JYX1NUT1AJCQkweDAwMTQKKyNkZWZpbmUgUkFDRkdfQ01EX0dFVF9OT0lTRV9MRVZFTAkweDAwMTUKKworI2RlZmluZSBSQUNGR19DTURfQVRFX1NUQVJUCQkJMHgwMDgwCisjZGVmaW5lIFJBQ0ZHX0NNRF9BVEVfU1RPUAkJCTB4MDA4MQorCisjZGVmaW5lIFJBQ0ZHX0NNRF9BVEVfU1RBUlRfVFhfQ0FSUklFUgkJMHgwMTAwCisjZGVmaW5lIFJBQ0ZHX0NNRF9BVEVfU1RBUlRfVFhfQ09OVAkJCTB4MDEwMQorI2RlZmluZSBSQUNGR19DTURfQVRFX1NUQVJUX1RYX0ZSQU1FCQkweDAxMDIKKyNkZWZpbmUgUkFDRkdfQ01EX0FURV9TRVRfQlcJICAgICAgICAgICAgMHgwMTAzCisjZGVmaW5lIFJBQ0ZHX0NNRF9BVEVfU0VUX1RYX1BPV0VSMAkgICAgICAgIDB4MDEwNAorI2RlZmluZSBSQUNGR19DTURfQVRFX1NFVF9UWF9QT1dFUjEJCQkweDAxMDUKKyNkZWZpbmUgUkFDRkdfQ01EX0FURV9TRVRfRlJFUV9PRkZTRVQJCTB4MDEwNgorI2RlZmluZSBSQUNGR19DTURfQVRFX0dFVF9TVEFUSVNUSUNTCQkweDAxMDcKKyNkZWZpbmUgUkFDRkdfQ01EX0FURV9SRVNFVF9DT1VOVEVSCQkJMHgwMTA4CisjZGVmaW5lIFJBQ0ZHX0NNRF9BVEVfU0VMX1RYX0FOVEVOTkEJCTB4MDEwOQorI2RlZmluZSBSQUNGR19DTURfQVRFX1NFTF9SWF9BTlRFTk5BCQkweDAxMGEKKyNkZWZpbmUgUkFDRkdfQ01EX0FURV9TRVRfUFJFQU1CTEUJCQkweDAxMGIKKyNkZWZpbmUgUkFDRkdfQ01EX0FURV9TRVRfQ0hBTk5FTAkJCTB4MDEwYworI2RlZmluZSBSQUNGR19DTURfQVRFX1NFVF9BRERSMQkJCQkweDAxMGQKKyNkZWZpbmUgUkFDRkdfQ01EX0FURV9TRVRfQUREUjIJCQkJMHgwMTBlCisjZGVmaW5lIFJBQ0ZHX0NNRF9BVEVfU0VUX0FERFIzCQkJCTB4MDEwZgorI2RlZmluZSBSQUNGR19DTURfQVRFX1NFVF9SQVRFCQkJCTB4MDExMAorI2RlZmluZSBSQUNGR19DTURfQVRFX1NFVF9UWF9GUkFNRV9MRU4JCTB4MDExMQorI2RlZmluZSBSQUNGR19DTURfQVRFX1NFVF9UWF9GUkFNRV9DT1VOVAkweDAxMTIKKyNkZWZpbmUgUkFDRkdfQ01EX0FURV9TVEFSVF9SWF9GUkFNRQkJMHgwMTEzCisjZGVmaW5lIFJBQ0ZHX0NNRF9BVEVfRTJQUk9NX1JFQURfQlVMSwkweDAxMTQKKyNkZWZpbmUgUkFDRkdfQ01EX0FURV9FMlBST01fV1JJVEVfQlVMSwkweDAxMTUKKyNkZWZpbmUgUkFDRkdfQ01EX0FURV9JT19XUklURV9CVUxLCQkweDAxMTYKKyNkZWZpbmUgUkFDRkdfQ01EX0FURV9CQlBfUkVBRF9CVUxLCQkweDAxMTcKKyNkZWZpbmUgUkFDRkdfQ01EX0FURV9CQlBfV1JJVEVfQlVMSwkweDAxMTgKKyNkZWZpbmUgUkFDRkdfQ01EX0FURV9SRl9SRUFEX0JVTEsJCTB4MDExOQorI2RlZmluZSBSQUNGR19DTURfQVRFX1JGX1dSSVRFX0JVTEsJCTB4MDExYQorCisKKworI2RlZmluZSBBMkhleChfWCwgX3ApIAkJCQlcCit7CQkJCQkJCQkJXAorCVVDSEFSICpwOwkJCQkJCVwKKwlfWCA9IDA7CQkJCQkJCVwKKwlwID0gX3A7CQkJCQkJCVwKKwl3aGlsZSAoKCgqcCA+PSAnYScpICYmICgqcCA8PSAnZicpKSB8fCAoKCpwID49ICdBJykgJiYgKCpwIDw9ICdGJykpIHx8ICgoKnAgPj0gJzAnKSAmJiAoKnAgPD0gJzknKSkpCQlcCisJewkJCQkJCQkJCQkJCVwKKwkJaWYgKCgqcCA+PSAnYScpICYmICgqcCA8PSAnZicpKQkJCQlcCisJCQlfWCA9IF9YICogMTYgKyAqcCAtIDg3OwkJCQkJXAorCQllbHNlIGlmICgoKnAgPj0gJ0EnKSAmJiAoKnAgPD0gJ0YnKSkJCVwKKwkJCV9YID0gX1ggKiAxNiArICpwIC0gNTU7CQkJCQlcCisJCWVsc2UgaWYgKCgqcCA+PSAnMCcpICYmICgqcCA8PSAnOScpKQkJXAorCQkJX1ggPSBfWCAqIDE2ICsgKnAgLSA0ODsJCQkJCVwKKwkJcCsrOwkJCQkJCQkJCQlcCisJfQkJCQkJCQkJCQkJCVwKK30KKworCitzdGF0aWMgVk9JRCBtZW1jcHlfZXhsKFBSVE1QX0FEQVBURVIgcEFkLCBVQ0hBUiAqZHN0LCBVQ0hBUiAqc3JjLCBVTE9ORyBsZW4pOworc3RhdGljIFZPSUQgbWVtY3B5X2V4cyhQUlRNUF9BREFQVEVSIHBBZCwgVUNIQVIgKmRzdCwgVUNIQVIgKnNyYywgVUxPTkcgbGVuKTsKK3N0YXRpYyBWT0lEIFJUTVBfSU9fUkVBRF9CVUxLKFBSVE1QX0FEQVBURVIgcEFkLCBVQ0hBUiAqZHN0LCBVQ0hBUiAqc3JjLCBVSU5UMzIgbGVuKTsKKworI2lmZGVmIFVDT1MKK2ludCBhdGVfY29weV90b191c2VyKAorCUlOIFBVQ0hBUiBwYXlsb2FkLAorCUlOIFBVQ0hBUiBtc2csCisJSU4gSU5UICAgIGxlbikKK3sKKwltZW1tb3ZlKHBheWxvYWQsIG1zZywgbGVuKTsKKwlyZXR1cm4gMDsKK30KKworI3VuZGVmCWNvcHlfdG9fdXNlcgorI2RlZmluZSBjb3B5X3RvX3VzZXIoeCx5LHopIGF0ZV9jb3B5X3RvX3VzZXIoKFBVQ0hBUil4LCAoUFVDSEFSKXksIHopCisjZW5kaWYgLy8gVUNPUyAvLworCisjZGVmaW5lCUxFTl9PRl9BUkcgMTYKKworVk9JRCBSdG1wRG9BdGUoCisJSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKKwlJTglzdHJ1Y3QgaXdyZXEJKndycSkKK3sKKwl1bnNpZ25lZCBzaG9ydCBDb21tYW5kX0lkOworCXN0cnVjdCBhdGVfcmFjZmdoZHIgKnBSYUNmZzsKKwlJTlQJU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKworCisKKwlpZigocFJhQ2ZnID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGF0ZV9yYWNmZ2hkciksIEdGUF9LRVJORUwpKSA9PSBOVUxMKQorCXsKKwkJU3RhdHVzID0gLUVJTlZBTDsKKwkJcmV0dXJuOworCX0KKworCU5kaXNaZXJvTWVtb3J5KHBSYUNmZywgc2l6ZW9mKHN0cnVjdCBhdGVfcmFjZmdoZHIpKTsKKworICAgIGlmIChjb3B5X2Zyb21fdXNlcigoUFVDSEFSKXBSYUNmZywgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKSkKKwl7CisJCVN0YXR1cyA9IC1FRkFVTFQ7CisJCWtmcmVlKHBSYUNmZyk7CisJCXJldHVybjsKKwl9CisKKworCUNvbW1hbmRfSWQgPSBudG9ocyhwUmFDZmctPmNvbW1hbmRfaWQpOworCisJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJcbiVzOiBDb21tYW5kX0lkID0gMHglMDR4ICFcbiIsIF9fZnVuY19fLCBDb21tYW5kX0lkKSk7CisKKwlzd2l0Y2ggKENvbW1hbmRfSWQpCisJeworIAkJLy8gV2Ugd2lsbCBnZXQgdGhpcyBjb21tYW5kIHdoZW4gUUEgc3RhcnRzLgorCQljYXNlIFJBQ0ZHX0NNRF9BVEVfU1RBUlQ6CisJCQl7CisJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSQUNGR19DTURfQVRFX1NUQVJUXG4iKSk7CisKKwkJCQkvLyBwcmVwYXJlIGZlZWRiYWNrIGFzIHNvb24gYXMgd2UgY2FuIHRvIGF2b2lkIFFBIHRpbWVvdXQuCisJCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygyKTsKKwkJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDApOworCisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBSYUNmZy0+bWFnaWNfbm8pICsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF90eXBlKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX2lkKSArIHNpemVvZihwUmFDZmctPmxlbmd0aCkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworCisJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgid3JxLT51LmRhdGEubGVuZ3RoID0gJWRcbiIsIHdycS0+dS5kYXRhLmxlbmd0aCkpOworCisgICAgICAgICAgICAJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwUmFDZmcsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJjb3B5X3RvX3VzZXIoKSBmYWlsIGluIGNhc2UgUkFDRkdfQ01EX0FURV9TVEFSVFxuIikpOworICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgCX0KKwkJCQllbHNlCisJCQkJeworICAgICAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSQUNGR19DTURfQVRFX1NUQVJUIGlzIGRvbmUgIVxuIikpOworCQkJCX0KKwkJCQlTZXRfQVRFX1Byb2MocEFkYXB0ZXIsICJBVEVTVEFSVCIpOworCQkJfQorCQkJYnJlYWs7CisKKyAJCS8vIFdlIHdpbGwgZ2V0IHRoaXMgY29tbWFuZCBlaXRoZXIgUUEgaXMgY2xvc2VkIG9yIGF0ZWQgaXMga2lsbGVkIGJ5IHVzZXIuCisJCWNhc2UgUkFDRkdfQ01EX0FURV9TVE9QOgorCQkJeworI2lmbmRlZiBVQ09TCisJCQkJSU5UMzIgcmV0OworI2VuZGlmIC8vICFVQ09TIC8vCisKKwkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJBQ0ZHX0NNRF9BVEVfU1RPUFxuIikpOworCisJCQkJLy8gRGlzdGluZ3Vpc2ggdGhpcyBjb21tYW5kIGNhbWUgZnJvbSBRQSh2aWEgYXRlZCkKKwkJCQkvLyBvciBhdGUgZGFlbW9uIGFjY29yZGluZyB0byB0aGUgZXhpc3RlbmNlIG9mIHBpZCBpbiBwYXlsb2FkLgorCQkJCS8vIE5vIG5lZWQgdG8gcHJlcGFyZSBmZWVkYmFjayBpZiB0aGlzIGNtZCBjYW1lIGRpcmVjdGx5IGZyb20gYXRlIGRhZW1vbi4KKwkJCQlwUmFDZmctPmxlbmd0aCA9IG50b2hzKHBSYUNmZy0+bGVuZ3RoKTsKKworCQkJCWlmIChwUmFDZmctPmxlbmd0aCA9PSBzaXplb2YocEFkYXB0ZXItPmF0ZS5BdGVQaWQpKQorCQkJCXsKKwkJCQkJLy8gVGhpcyBjb21tYW5kIGNhbWUgZnJvbSBRQS4KKwkJCQkJLy8gR2V0IHRoZSBwaWQgb2YgQVRFIGRhZW1vbi4KKwkJCQkJbWVtY3B5KChVQ0hBUiAqKSZwQWRhcHRlci0+YXRlLkF0ZVBpZCwKKwkJCQkJCSgmcFJhQ2ZnLT5kYXRhWzBdKSAtIDIvKiA9PSAmKHBSYUNmZy0+c3RhdHVzKSAqLywKKwkJCQkJCXNpemVvZihwQWRhcHRlci0+YXRlLkF0ZVBpZCkpOworCisJCQkJCS8vIHByZXBhcmUgZmVlZGJhY2sgYXMgc29vbiBhcyB3ZSBjYW4gdG8gYXZvaWQgUUEgdGltZW91dC4KKwkJCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygyKTsKKwkJCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKworCQkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX2lkKSArIHNpemVvZihwUmFDZmctPmxlbmd0aCkKKwkJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPnNlcXVlbmNlKSArIG50b2hzKHBSYUNmZy0+bGVuZ3RoKTsKKworCQkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJ3cnEtPnUuZGF0YS5sZW5ndGggPSAlZFxuIiwgd3JxLT51LmRhdGEubGVuZ3RoKSk7CisKKwkgICAgICAgICAgICAJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwUmFDZmcsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisJICAgICAgICAgICAgCXsKKwkgICAgICAgICAgICAJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfQVRFX1NUT1BcbiIpKTsKKwkgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisJICAgICAgICAgICAgCX0KKworCQkJCQkvLworCQkJCQkvLyBraWxsIEFURSBkYWVtb24gd2hlbiBsZWF2aW5nIEFURSBtb2RlLgorCQkJCQkvLyBXZSBtdXN0IGtpbGwgQVRFIGRhZW1vbiBmaXJzdCBiZWZvcmUgc2V0dGluZyBBVEVTVE9QLAorCQkJCQkvLyBvciBNaWNyb3NvZnQgd2lsbCByZXBvcnQgc3RoLiB3cm9uZy4KKyNpZm5kZWYgVUNPUworCQkJCQlyZXQgPSBLSUxMX1RIUkVBRF9QSUQocEFkYXB0ZXItPmF0ZS5BdGVQaWQsIFNJR1RFUk0sIDEpOworCQkJCQlpZiAocmV0KQorCQkJCQl7CisJCQkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlczogdW5hYmxlIHRvIHNpZ25hbCB0aHJlYWRcbiIsIHBBZGFwdGVyLT5uZXRfZGV2LT5uYW1lKSk7CisJCQkJCX0KKyNlbmRpZiAvLyAhVUNPUyAvLworCQkJCX0KKworCQkJCS8vIEFQIG1pZ2h0IGhhdmUgaW4gQVRFX1NUT1AgbW9kZSBkdWUgdG8gY21kIGZyb20gUUEuCisJCQkJaWYgKEFURV9PTihwQWRhcHRlcikpCisJCQkJeworCQkJCQkvLyBTb21lb25lIGhhcyBraWxsZWQgYXRlIGRhZW1vbiB3aGlsZSBRQSBHVUkgaXMgc3RpbGwgb3Blbi4KKwkJCQkJU2V0X0FURV9Qcm9jKHBBZGFwdGVyLCAiQVRFU1RPUCIpOworCQkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSQUNGR19DTURfQVBfU1RBUlQgaXMgZG9uZSAhXG4iKSk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSQUNGR19DTURfUkZfV1JJVEVfQUxMOgorCQkJeworCQkJCVVJTlQzMiBSMSwgUjIsIFIzLCBSNDsKKwkJCQlVU0hPUlQgY2hhbm5lbDsKKworCQkJCW1lbWNweSgmUjEsIHBSYUNmZy0+ZGF0YS0yLCA0KTsKKwkJCQltZW1jcHkoJlIyLCBwUmFDZmctPmRhdGErMiwgNCk7CisJCQkJbWVtY3B5KCZSMywgcFJhQ2ZnLT5kYXRhKzYsIDQpOworCQkJCW1lbWNweSgmUjQsIHBSYUNmZy0+ZGF0YSsxMCwgNCk7CisJCQkJbWVtY3B5KCZjaGFubmVsLCBwUmFDZmctPmRhdGErMTQsIDIpOworCisJCQkJcEFkYXB0ZXItPkxhdGNoUmZSZWdzLlIxID0gbnRvaGwoUjEpOworCQkJCXBBZGFwdGVyLT5MYXRjaFJmUmVncy5SMiA9IG50b2hsKFIyKTsKKwkJCQlwQWRhcHRlci0+TGF0Y2hSZlJlZ3MuUjMgPSBudG9obChSMyk7CisJCQkJcEFkYXB0ZXItPkxhdGNoUmZSZWdzLlI0ID0gbnRvaGwoUjQpOworCQkJCXBBZGFwdGVyLT5MYXRjaFJmUmVncy5DaGFubmVsID0gbnRvaHMoY2hhbm5lbCk7CisKKwkJCQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkYXB0ZXIsIHBBZGFwdGVyLT5MYXRjaFJmUmVncy5SMSk7CisJCQkJUlRNUF9SRl9JT19XUklURTMyKHBBZGFwdGVyLCBwQWRhcHRlci0+TGF0Y2hSZlJlZ3MuUjIpOworCQkJCVJUTVBfUkZfSU9fV1JJVEUzMihwQWRhcHRlciwgcEFkYXB0ZXItPkxhdGNoUmZSZWdzLlIzKTsKKwkJCQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkYXB0ZXIsIHBBZGFwdGVyLT5MYXRjaFJmUmVncy5SNCk7CisKKwkJCQkvLyBwcmVwYXJlIGZlZWRiYWNrCisJCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygyKTsKKwkJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDApOworCisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBSYUNmZy0+bWFnaWNfbm8pICsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF90eXBlKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX2lkKSArIHNpemVvZihwUmFDZmctPmxlbmd0aCkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworCisJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgid3JxLT51LmRhdGEubGVuZ3RoID0gJWRcbiIsIHdycS0+dS5kYXRhLmxlbmd0aCkpOworICAgICAgICAgICAgCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFJhQ2ZnLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY29weV90b191c2VyKCkgZmFpbCBpbiBjYXNlIFJBQ0ZHX0NNRF9SRl9XUklURV9BTExcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIAl9CisJCQkJZWxzZQorCQkJCXsKKyAgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX1JGX1dSSVRFX0FMTCBpcyBkb25lICFcbiIpKTsKKwkJCQl9CisJCQl9CisgICAgICAgICAgICBicmVhazsKKworCQljYXNlIFJBQ0ZHX0NNRF9FMlBST01fUkVBRDE2OgorCQkJeworCQkJCVVTSE9SVAlvZmZzZXQsIHZhbHVlLCB0bXA7CisKKwkJCQlvZmZzZXQgPSBudG9ocyhwUmFDZmctPnN0YXR1cyk7CisJCQkJLyogInRtcCIgaXMgZXhwZWNpYWxseSBmb3Igc29tZSBjb21waWxlcnMuLi4gKi8KKwkJCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWRhcHRlciwgb2Zmc2V0LCB0bXApOworCQkJCXZhbHVlID0gdG1wOworCQkJCXZhbHVlID0gaHRvbnModmFsdWUpOworCisJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJFRVBST00gUmVhZCBvZmZzZXQgPSAweCUwNHgsIHZhbHVlID0gMHglMDR4XG4iLCBvZmZzZXQsIHZhbHVlKSk7CisKKwkJCQkvLyBwcmVwYXJlIGZlZWRiYWNrCisJCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucyg0KTsKKwkJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDApOworCQkJCW1lbWNweShwUmFDZmctPmRhdGEsICZ2YWx1ZSwgMik7CisKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKwkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJzaXplb2Yoc3RydWN0IGF0ZV9yYWNmZ2hkcikgPSAlZFxuIiwgc2l6ZW9mKHN0cnVjdCBhdGVfcmFjZmdoZHIpKSk7CisJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgid3JxLT51LmRhdGEubGVuZ3RoID0gJWRcbiIsIHdycS0+dS5kYXRhLmxlbmd0aCkpOworCisgICAgICAgICAgICAJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwUmFDZmcsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjb3B5X3RvX3VzZXIoKSBmYWlsIGluIGNhc2UgUkFDRkdfQ01EX0UyUFJPTV9SRUFEMTZcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIAl9CisJCQkJZWxzZQorCQkJCXsKKyAgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX0UyUFJPTV9SRUFEMTYgaXMgZG9uZSAhXG4iKSk7CisJCQkJfQorICAgICAgICAgICAJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSQUNGR19DTURfRTJQUk9NX1dSSVRFMTY6CisJCQl7CisJCQkJVVNIT1JUCW9mZnNldCwgdmFsdWU7CisKKwkJCQlvZmZzZXQgPSBudG9ocyhwUmFDZmctPnN0YXR1cyk7CisJCQkJbWVtY3B5KCZ2YWx1ZSwgcFJhQ2ZnLT5kYXRhLCAyKTsKKwkJCQl2YWx1ZSA9IG50b2hzKHZhbHVlKTsKKwkJCQlSVDI4eHhfRUVQUk9NX1dSSVRFMTYocEFkYXB0ZXIsIG9mZnNldCwgdmFsdWUpOworCisJCQkJLy8gcHJlcGFyZSBmZWVkYmFjaworCQkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoMik7CisJCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKyAgICAgICAgICAgIAlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfRTJQUk9NX1dSSVRFMTZcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIAl9CisJCQkJZWxzZQorCQkJCXsKKyAgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX0UyUFJPTV9XUklURTE2IGlzIGRvbmUgIVxuIikpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUkFDRkdfQ01EX0UyUFJPTV9SRUFEX0FMTDoKKwkJCXsKKwkJCQlVU0hPUlQgYnVmZmVyW0VFUFJPTV9TSVpFLzJdOworCisJCQkJcnRfZWVfcmVhZF9hbGwocEFkYXB0ZXIsKFVTSE9SVCAqKWJ1ZmZlcik7CisJCQkJbWVtY3B5X2V4cyhwQWRhcHRlciwgcFJhQ2ZnLT5kYXRhLCAoVUNIQVIgKilidWZmZXIsIEVFUFJPTV9TSVpFKTsKKworCQkJCS8vIHByZXBhcmUgZmVlZGJhY2sKKwkJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDIrRUVQUk9NX1NJWkUpOworCQkJCXBSYUNmZy0+c3RhdHVzID0gaHRvbnMoMCk7CisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBSYUNmZy0+bWFnaWNfbm8pICsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF90eXBlKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX2lkKSArIHNpemVvZihwUmFDZmctPmxlbmd0aCkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworCisgICAgICAgICAgICAJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwUmFDZmcsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjb3B5X3RvX3VzZXIoKSBmYWlsIGluIGNhc2UgUkFDRkdfQ01EX0UyUFJPTV9SRUFEX0FMTFxuIikpOworICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgCX0KKwkJCQllbHNlCisJCQkJeworICAgICAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSQUNGR19DTURfRTJQUk9NX1JFQURfQUxMIGlzIGRvbmUgIVxuIikpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUkFDRkdfQ01EX0UyUFJPTV9XUklURV9BTEw6CisJCQl7CisJCQkJVVNIT1JUIGJ1ZmZlcltFRVBST01fU0laRS8yXTsKKworCQkJCU5kaXNaZXJvTWVtb3J5KChVQ0hBUiAqKWJ1ZmZlciwgRUVQUk9NX1NJWkUpOworCQkJCW1lbWNweV9leHMocEFkYXB0ZXIsIChVQ0hBUiAqKWJ1ZmZlciwgKFVDSEFSICopJnBSYUNmZy0+c3RhdHVzLCBFRVBST01fU0laRSk7CisJCQkJcnRfZWVfd3JpdGVfYWxsKHBBZGFwdGVyLChVU0hPUlQgKilidWZmZXIpOworCisJCQkJLy8gcHJlcGFyZSBmZWVkYmFjaworCQkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoMik7CisJCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKyAgICAgICAgICAgIAlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfRTJQUk9NX1dSSVRFX0FMTFxuIikpOworICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgCX0KKwkJCQllbHNlCisJCQkJeworICAgICAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJSQUNGR19DTURfRTJQUk9NX1dSSVRFX0FMTCBpcyBkb25lICFcbiIpKTsKKwkJCQl9CisKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUkFDRkdfQ01EX0lPX1JFQUQ6CisJCQl7CisJCQkJVUlOVDMyCW9mZnNldDsKKwkJCQlVSU5UMzIJdmFsdWU7CisKKwkJCQltZW1jcHkoJm9mZnNldCwgJnBSYUNmZy0+c3RhdHVzLCA0KTsKKwkJCQlvZmZzZXQgPSBudG9obChvZmZzZXQpOworCisJCQkJLy8gV2UgZG8gbm90IG5lZWQgdGhlIGJhc2UgYWRkcmVzcy4KKwkJCQkvLyBTbyBqdXN0IGV4dHJhY3QgdGhlIG9mZnNldCBvdXQuCisJCQkJb2Zmc2V0ICY9IDB4MDAwMEZGRkY7CisJCQkJUlRNUF9JT19SRUFEMzIocEFkYXB0ZXIsIG9mZnNldCwgJnZhbHVlKTsKKwkJCQl2YWx1ZSA9IGh0b25sKHZhbHVlKTsKKworCQkJCS8vIHByZXBhcmUgZmVlZGJhY2sKKwkJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDYpOworCQkJCXBSYUNmZy0+c3RhdHVzID0gaHRvbnMoMCk7CisJCQkJbWVtY3B5KHBSYUNmZy0+ZGF0YSwgJnZhbHVlLCA0KTsKKworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihwUmFDZmctPm1hZ2ljX25vKSArIHNpemVvZihwUmFDZmctPmNvbW1hbmRfdHlwZSkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF9pZCkgKyBzaXplb2YocFJhQ2ZnLT5sZW5ndGgpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPnNlcXVlbmNlKSArIG50b2hzKHBSYUNmZy0+bGVuZ3RoKTsKKworICAgICAgICAgICAgCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFJhQ2ZnLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY29weV90b191c2VyKCkgZmFpbCBpbiBjYXNlIFJBQ0ZHX0NNRF9JT19SRUFEXG4iKSk7CisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICAJfQorCQkJCWVsc2UKKwkJCQl7CisgICAgICAgICAgICAgICAgCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJBQ0ZHX0NNRF9JT19SRUFEIGlzIGRvbmUgIVxuIikpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUkFDRkdfQ01EX0lPX1dSSVRFOgorCQkJeworCQkJCVVJTlQzMglvZmZzZXQsIHZhbHVlOworCisJCQkJbWVtY3B5KCZvZmZzZXQsIHBSYUNmZy0+ZGF0YS0yLCA0KTsKKwkJCQltZW1jcHkoJnZhbHVlLCBwUmFDZmctPmRhdGErMiwgNCk7CisKKwkJCQlvZmZzZXQgPSBudG9obChvZmZzZXQpOworCisJCQkJLy8gV2UgZG8gbm90IG5lZWQgdGhlIGJhc2UgYWRkcmVzcy4KKwkJCQkvLyBTbyBqdXN0IGV4dHJhY3Qgb3V0IHRoZSBvZmZzZXQuCisJCQkJb2Zmc2V0ICY9IDB4MDAwMEZGRkY7CisJCQkJdmFsdWUgPSBudG9obCh2YWx1ZSk7CisJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSQUNGR19DTURfSU9fV1JJVEU6IG9mZnNldCA9ICV4LCB2YWx1ZSA9ICV4XG4iLCBvZmZzZXQsIHZhbHVlKSk7CisJCQkJUlRNUF9JT19XUklURTMyKHBBZGFwdGVyLCBvZmZzZXQsIHZhbHVlKTsKKworCQkJCS8vIHByZXBhcmUgZmVlZGJhY2sKKwkJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDIpOworCQkJCXBSYUNmZy0+c3RhdHVzID0gaHRvbnMoMCk7CisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBSYUNmZy0+bWFnaWNfbm8pICsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF90eXBlKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX2lkKSArIHNpemVvZihwUmFDZmctPmxlbmd0aCkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworCisgICAgICAgICAgICAJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwUmFDZmcsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjb3B5X3RvX3VzZXIoKSBmYWlsIGluIGNhc2UgUkFDRkdfQ01EX0lPX1dSSVRFXG4iKSk7CisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICAJfQorCQkJCWVsc2UKKwkJCQl7CisgICAgICAgICAgICAgICAgCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJBQ0ZHX0NNRF9JT19XUklURSBpcyBkb25lICFcbiIpKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFJBQ0ZHX0NNRF9JT19SRUFEX0JVTEs6CisJCQl7CisJCQkJVUlOVDMyCW9mZnNldDsKKwkJCQlVU0hPUlQJbGVuOworCisJCQkJbWVtY3B5KCZvZmZzZXQsICZwUmFDZmctPnN0YXR1cywgNCk7CisJCQkJb2Zmc2V0ID0gbnRvaGwob2Zmc2V0KTsKKworCQkJCS8vIFdlIGRvIG5vdCBuZWVkIHRoZSBiYXNlIGFkZHJlc3MuCisJCQkJLy8gU28ganVzdCBleHRyYWN0IHRoZSBvZmZzZXQuCisJCQkJb2Zmc2V0ICY9IDB4MDAwMEZGRkY7CisJCQkJbWVtY3B5KCZsZW4sIHBSYUNmZy0+ZGF0YSsyLCAyKTsKKwkJCQlsZW4gPSBudG9ocyhsZW4pOworCisJCQkJaWYgKGxlbiA+IDM3MSkKKwkJCQl7CisJCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgibGVuIGlzIHRvbyBsYXJnZSwgbWFrZSBpdCBzbWFsbGVyXG4iKSk7CisJCQkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoMik7CisJCQkJCXBSYUNmZy0+c3RhdHVzID0gaHRvbnMoMSk7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCVJUTVBfSU9fUkVBRF9CVUxLKHBBZGFwdGVyLCBwUmFDZmctPmRhdGEsIChVQ0hBUiAqKW9mZnNldCwgbGVuKjQpOy8vIHVuaXQgaW4gZm91ciBieXRlcworCisJCQkJLy8gcHJlcGFyZSBmZWVkYmFjaworCQkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoMitsZW4qNCk7Ly8gdW5pdCBpbiBmb3VyIGJ5dGVzCisJCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKyAgICAgICAgICAgIAlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfSU9fUkVBRF9CVUxLXG4iKSk7CisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICAJfQorCQkJCWVsc2UKKwkJCQl7CisgICAgICAgICAgICAgICAgCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJBQ0ZHX0NNRF9JT19SRUFEX0JVTEsgaXMgZG9uZSAhXG4iKSk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSQUNGR19DTURfQkJQX1JFQUQ4OgorCQkJeworCQkJCVVTSE9SVAlvZmZzZXQ7CisJCQkJVUNIQVIJdmFsdWU7CisKKwkJCQl2YWx1ZSA9IDA7CisJCQkJb2Zmc2V0ID0gbnRvaHMocFJhQ2ZnLT5zdGF0dXMpOworCisJCQkJaWYgKEFURV9PTihwQWRhcHRlcikpCisJCQkJeworCQkJCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWRhcHRlciwgb2Zmc2V0LCAgJnZhbHVlKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZGFwdGVyLCBvZmZzZXQsICAmdmFsdWUpOworCQkJCX0KKwkJCQkvLyBwcmVwYXJlIGZlZWRiYWNrCisJCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygzKTsKKwkJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDApOworCQkJCXBSYUNmZy0+ZGF0YVswXSA9IHZhbHVlOworCisJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJCQlAgdmFsdWUgPSAleFxuIiwgdmFsdWUpKTsKKworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihwUmFDZmctPm1hZ2ljX25vKSArIHNpemVvZihwUmFDZmctPmNvbW1hbmRfdHlwZSkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF9pZCkgKyBzaXplb2YocFJhQ2ZnLT5sZW5ndGgpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPnNlcXVlbmNlKSArIG50b2hzKHBSYUNmZy0+bGVuZ3RoKTsKKworICAgICAgICAgICAgCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFJhQ2ZnLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY29weV90b191c2VyKCkgZmFpbCBpbiBjYXNlIFJBQ0ZHX0NNRF9CQlBfUkVBRDhcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIAl9CisJCQkJZWxzZQorCQkJCXsKKyAgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX0JCUF9SRUFEOCBpcyBkb25lICFcbiIpKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBSQUNGR19DTURfQkJQX1dSSVRFODoKKwkJCXsKKwkJCQlVU0hPUlQJb2Zmc2V0OworCQkJCVVDSEFSCXZhbHVlOworCisJCQkJb2Zmc2V0ID0gbnRvaHMocFJhQ2ZnLT5zdGF0dXMpOworCQkJCW1lbWNweSgmdmFsdWUsIHBSYUNmZy0+ZGF0YSwgMSk7CisKKwkJCQlpZiAoQVRFX09OKHBBZGFwdGVyKSkKKwkJCQl7CisJCQkJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWRhcHRlciwgb2Zmc2V0LCAgdmFsdWUpOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZGFwdGVyLCBvZmZzZXQsICB2YWx1ZSk7CisJCQkJfQorCisJCQkJaWYgKChvZmZzZXQgPT0gQkJQX1IxKSB8fCAob2Zmc2V0ID09IEJCUF9SMykpCisJCQkJeworCQkJCQlTeW5jVHhSeENvbmZpZyhwQWRhcHRlciwgb2Zmc2V0LCB2YWx1ZSk7CisJCQkJfQorCisJCQkJLy8gcHJlcGFyZSBmZWVkYmFjaworCQkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoMik7CisJCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKyAgICAgICAgICAgIAlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfQkJQX1dSSVRFOFxuIikpOworICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgCX0KKwkJCQllbHNlCisJCQkJeworICAgICAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSQUNGR19DTURfQkJQX1dSSVRFOCBpcyBkb25lICFcbiIpKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFJBQ0ZHX0NNRF9CQlBfUkVBRF9BTEw6CisJCQl7CisJCQkJVVNIT1JUIGo7CisKKwkJCQlmb3IgKGogPSAwOyBqIDwgMTM3OyBqKyspCisJCQkJeworCQkJCQlwUmFDZmctPmRhdGFbal0gPSAwOworCisJCQkJCWlmIChBVEVfT04ocEFkYXB0ZXIpKQorCQkJCQl7CisJCQkJCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWRhcHRlciwgaiwgICZwUmFDZmctPmRhdGFbal0pOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZGFwdGVyLCBqLCAgJnBSYUNmZy0+ZGF0YVtqXSk7CisJCQkJCX0KKwkJCQl9CisKKwkJCQkvLyBwcmVwYXJlIGZlZWRiYWNrCisJCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygyKzEzNyk7CisJCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihwUmFDZmctPm1hZ2ljX25vKSArIHNpemVvZihwUmFDZmctPmNvbW1hbmRfdHlwZSkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF9pZCkgKyBzaXplb2YocFJhQ2ZnLT5sZW5ndGgpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPnNlcXVlbmNlKSArIG50b2hzKHBSYUNmZy0+bGVuZ3RoKTsKKworICAgICAgICAgICAgCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFJhQ2ZnLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY29weV90b191c2VyKCkgZmFpbCBpbiBjYXNlIFJBQ0ZHX0NNRF9CQlBfUkVBRF9BTExcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIAl9CisJCQkJZWxzZQorCQkJCXsKKyAgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX0JCUF9SRUFEX0FMTCBpcyBkb25lICFcbiIpKTsKKwkJCQl9CisJCQl9CisKKwkJCWJyZWFrOworCisJCWNhc2UgUkFDRkdfQ01EX0FURV9FMlBST01fUkVBRF9CVUxLOgorCQl7CisJCQlVU0hPUlQgb2Zmc2V0OworCQkJVVNIT1JUIGxlbjsKKwkJCVVTSE9SVCBidWZmZXJbRUVQUk9NX1NJWkUvMl07CisKKwkJCW9mZnNldCA9IG50b2hzKHBSYUNmZy0+c3RhdHVzKTsKKwkJCW1lbWNweSgmbGVuLCBwUmFDZmctPmRhdGEsIDIpOworCQkJbGVuID0gbnRvaHMobGVuKTsKKworCQkJcnRfZWVfcmVhZF9hbGwocEFkYXB0ZXIsKFVTSE9SVCAqKWJ1ZmZlcik7CisJCQlpZiAob2Zmc2V0ICsgbGVuIDw9IEVFUFJPTV9TSVpFKQorCQkJCW1lbWNweV9leHMocEFkYXB0ZXIsIHBSYUNmZy0+ZGF0YSwgKFVDSEFSICopYnVmZmVyK29mZnNldCwgbGVuKTsKKwkJCWVsc2UKKwkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJleGNlZWQgRUVQUk9NIHNpemVcbiIpKTsKKworCQkJLy8gcHJlcGFyZSBmZWVkYmFjaworCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygyK2xlbik7CisJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDApOworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBSYUNmZy0+bWFnaWNfbm8pICsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF90eXBlKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX2lkKSArIHNpemVvZihwUmFDZmctPmxlbmd0aCkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworCisgICAgICAgICAgICBpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjb3B5X3RvX3VzZXIoKSBmYWlsIGluIGNhc2UgUkFDRkdfQ01EX0FURV9FMlBST01fUkVBRF9CVUxLXG4iKSk7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIH0KKwkJCWVsc2UKKwkJCXsKKyAgICAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSQUNGR19DTURfQVRFX0UyUFJPTV9SRUFEX0JVTEsgaXMgZG9uZSAhXG4iKSk7CisJCQl9CisKKwkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSQUNGR19DTURfQVRFX0UyUFJPTV9XUklURV9CVUxLOgorCQl7CisJCQlVU0hPUlQgb2Zmc2V0OworCQkJVVNIT1JUIGxlbjsKKwkJCVVTSE9SVCBidWZmZXJbRUVQUk9NX1NJWkUvMl07CisKKwkJCW9mZnNldCA9IG50b2hzKHBSYUNmZy0+c3RhdHVzKTsKKwkJCW1lbWNweSgmbGVuLCBwUmFDZmctPmRhdGEsIDIpOworCQkJbGVuID0gbnRvaHMobGVuKTsKKworCQkJcnRfZWVfcmVhZF9hbGwocEFkYXB0ZXIsKFVTSE9SVCAqKWJ1ZmZlcik7CisJCQltZW1jcHlfZXhzKHBBZGFwdGVyLCAoVUNIQVIgKilidWZmZXIgKyBvZmZzZXQsIChVQ0hBUiAqKXBSYUNmZy0+ZGF0YSArIDIsIGxlbik7CisJCQlydF9lZV93cml0ZV9hbGwocEFkYXB0ZXIsKFVTSE9SVCAqKWJ1ZmZlcik7CisKKwkJCS8vIHByZXBhcmUgZmVlZGJhY2sKKwkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoMik7CisJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDApOworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBSYUNmZy0+bWFnaWNfbm8pICsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF90eXBlKQorCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPnNlcXVlbmNlKSArIG50b2hzKHBSYUNmZy0+bGVuZ3RoKTsKKyAgICAgICAgICAgIGlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFJhQ2ZnLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfQVRFX0UyUFJPTV9XUklURV9CVUxLXG4iKSk7CisgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIH0KKwkJCWVsc2UKKwkJCXsKKyAgICAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJSQUNGR19DTURfQVRFX0UyUFJPTV9XUklURV9CVUxLIGlzIGRvbmUgIVxuIikpOworCQkJfQorCisJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUkFDRkdfQ01EX0FURV9JT19XUklURV9CVUxLOgorCQl7CisJCQlVSU5UMzIgb2Zmc2V0LCBpLCB2YWx1ZTsKKwkJCVVTSE9SVCBsZW47CisKKwkJCW1lbWNweSgmb2Zmc2V0LCAmcFJhQ2ZnLT5zdGF0dXMsIDQpOworCQkJb2Zmc2V0ID0gbnRvaGwob2Zmc2V0KTsKKwkJCW1lbWNweSgmbGVuLCBwUmFDZmctPmRhdGErMiwgMik7CisJCQlsZW4gPSBudG9ocyhsZW4pOworCisJCQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpICs9IDQpCisJCQl7CisJCQkJbWVtY3B5X2V4bChwQWRhcHRlciwgKFVDSEFSICopJnZhbHVlLCBwUmFDZmctPmRhdGErNCtpLCA0KTsKKwkJCQlwcmludGsoIldyaXRlICV4ICV4XG4iLCBvZmZzZXQgKyBpLCB2YWx1ZSk7CisJCQkJUlRNUF9JT19XUklURTMyKHBBZGFwdGVyLCAob2Zmc2V0ICtpKSAmIDB4ZmZmZiwgdmFsdWUpOworCQkJfQorCisJCQkvLyBwcmVwYXJlIGZlZWRiYWNrCisJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDIpOworCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihwUmFDZmctPm1hZ2ljX25vKSArIHNpemVvZihwUmFDZmctPmNvbW1hbmRfdHlwZSkKKwkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX2lkKSArIHNpemVvZihwUmFDZmctPmxlbmd0aCkKKwkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisgICAgICAgICAgICBpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjb3B5X3RvX3VzZXIoKSBmYWlsIGluIGNhc2UgUkFDRkdfQ01EX0FURV9JT19XUklURV9CVUxLXG4iKSk7CisgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIH0KKwkJCWVsc2UKKwkJCXsKKyAgICAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJSQUNGR19DTURfQVRFX0lPX1dSSVRFX0JVTEsgaXMgZG9uZSAhXG4iKSk7CisJCQl9CisKKwkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSQUNGR19DTURfQVRFX0JCUF9SRUFEX0JVTEs6CisJCXsKKwkJCVVTSE9SVCBvZmZzZXQ7CisJCQlVU0hPUlQgbGVuOworCQkJVVNIT1JUIGo7CisKKwkJCW9mZnNldCA9IG50b2hzKHBSYUNmZy0+c3RhdHVzKTsKKwkJCW1lbWNweSgmbGVuLCBwUmFDZmctPmRhdGEsIDIpOworCQkJbGVuID0gbnRvaHMobGVuKTsKKworCisJCQlmb3IgKGogPSBvZmZzZXQ7IGogPCAob2Zmc2V0K2xlbik7IGorKykKKwkJCXsKKwkJCQlwUmFDZmctPmRhdGFbaiAtIG9mZnNldF0gPSAwOworCisJCQkJaWYgKHBBZGFwdGVyLT5hdGUuTW9kZSA9PSBBVEVfU1RPUCkKKwkJCQl7CisJCQkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWRhcHRlciwgaiwgICZwUmFDZmctPmRhdGFbaiAtIG9mZnNldF0pOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWRhcHRlciwgaiwgICZwUmFDZmctPmRhdGFbaiAtIG9mZnNldF0pOworCQkJCX0KKwkJCX0KKworCQkJLy8gcHJlcGFyZSBmZWVkYmFjaworCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygyK2xlbik7CisJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDApOworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBSYUNmZy0+bWFnaWNfbm8pICsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF90eXBlKQorCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPnNlcXVlbmNlKSArIG50b2hzKHBSYUNmZy0+bGVuZ3RoKTsKKworICAgICAgICAgICAgaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwUmFDZmcsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY29weV90b191c2VyKCkgZmFpbCBpbiBjYXNlIFJBQ0ZHX0NNRF9BVEVfQkJQX1JFQURfQlVMS1xuIikpOworICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICB9CisJCQllbHNlCisJCQl7CisgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX0FURV9CQlBfUkVBRF9CVUxLIGlzIGRvbmUgIVxuIikpOworCQkJfQorCisJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUkFDRkdfQ01EX0FURV9CQlBfV1JJVEVfQlVMSzoKKwkJeworCQkJVVNIT1JUIG9mZnNldDsKKwkJCVVTSE9SVCBsZW47CisJCQlVU0hPUlQgajsKKwkJCVVDSEFSICp2YWx1ZTsKKworCQkJb2Zmc2V0ID0gbnRvaHMocFJhQ2ZnLT5zdGF0dXMpOworCQkJbWVtY3B5KCZsZW4sIHBSYUNmZy0+ZGF0YSwgMik7CisJCQlsZW4gPSBudG9ocyhsZW4pOworCisJCQlmb3IgKGogPSBvZmZzZXQ7IGogPCAob2Zmc2V0K2xlbik7IGorKykKKwkJCXsKKwkJCQl2YWx1ZSA9IHBSYUNmZy0+ZGF0YSArIDIgKyAoaiAtIG9mZnNldCk7CisJCQkJaWYgKHBBZGFwdGVyLT5hdGUuTW9kZSA9PSBBVEVfU1RPUCkKKwkJCQl7CisJCQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkYXB0ZXIsIGosICAqdmFsdWUpOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkYXB0ZXIsIGosICAqdmFsdWUpOworCQkJCX0KKwkJCX0KKworCQkJLy8gcHJlcGFyZSBmZWVkYmFjaworCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygyKTsKKwkJCXBSYUNmZy0+c3RhdHVzID0gaHRvbnMoMCk7CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF9pZCkgKyBzaXplb2YocFJhQ2ZnLT5sZW5ndGgpCisJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworCisgICAgICAgICAgICBpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjb3B5X3RvX3VzZXIoKSBmYWlsIGluIGNhc2UgUkFDRkdfQ01EX0FURV9CQlBfV1JJVEVfQlVMS1xuIikpOworICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICB9CisJCQllbHNlCisJCQl7CisgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX0FURV9CQlBfV1JJVEVfQlVMSyBpcyBkb25lICFcbiIpKTsKKwkJCX0KKwkJfQorCQkJYnJlYWs7CisKKyNpZmRlZiBDT05GSUdfUkFMSU5LX1JUMzA1MgorCQljYXNlIFJBQ0ZHX0NNRF9BVEVfUkZfUkVBRF9CVUxLOgorCQl7CisJCQlVU0hPUlQgb2Zmc2V0OworCQkJVVNIT1JUIGxlbjsKKwkJCVVTSE9SVCBqOworCisJCQlvZmZzZXQgPSBudG9ocyhwUmFDZmctPnN0YXR1cyk7CisJCQltZW1jcHkoJmxlbiwgcFJhQ2ZnLT5kYXRhLCAyKTsKKwkJCWxlbiA9IG50b2hzKGxlbik7CisKKwkJCWZvciAoaiA9IG9mZnNldDsgaiA8IChvZmZzZXQrbGVuKTsgaisrKQorCQkJeworCQkJCXBSYUNmZy0+ZGF0YVtqIC0gb2Zmc2V0XSA9IDA7CisJCQkJUlQzMHh4UmVhZFJGUmVnaXN0ZXIocEFkYXB0ZXIsIGosICAmcFJhQ2ZnLT5kYXRhW2ogLSBvZmZzZXRdKTsKKwkJCX0KKworCQkJLy8gcHJlcGFyZSBmZWVkYmFjaworCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygyK2xlbik7CisJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDApOworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBSYUNmZy0+bWFnaWNfbm8pICsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF90eXBlKQorCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPnNlcXVlbmNlKSArIG50b2hzKHBSYUNmZy0+bGVuZ3RoKTsKKworICAgICAgICAgICAgaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwUmFDZmcsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY29weV90b191c2VyKCkgZmFpbCBpbiBjYXNlIFJBQ0ZHX0NNRF9BVEVfUkZfUkVBRF9CVUxLXG4iKSk7CisgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIH0KKwkJCWVsc2UKKwkJCXsKKyAgICAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSQUNGR19DTURfQVRFX1JGX1JFQURfQlVMSyBpcyBkb25lICFcbiIpKTsKKwkJCX0KKworCQl9CisJCQlicmVhazsKKworCQljYXNlIFJBQ0ZHX0NNRF9BVEVfUkZfV1JJVEVfQlVMSzoKKwkJeworCQkJVVNIT1JUIG9mZnNldDsKKwkJCVVTSE9SVCBsZW47CisJCQlVU0hPUlQgajsKKwkJCVVDSEFSICp2YWx1ZTsKKworCQkJb2Zmc2V0ID0gbnRvaHMocFJhQ2ZnLT5zdGF0dXMpOworCQkJbWVtY3B5KCZsZW4sIHBSYUNmZy0+ZGF0YSwgMik7CisJCQlsZW4gPSBudG9ocyhsZW4pOworCisJCQlmb3IgKGogPSBvZmZzZXQ7IGogPCAob2Zmc2V0K2xlbik7IGorKykKKwkJCXsKKwkJCQl2YWx1ZSA9IHBSYUNmZy0+ZGF0YSArIDIgKyAoaiAtIG9mZnNldCk7CisJCQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZGFwdGVyLCBqLCAgKnZhbHVlKTsKKwkJCX0KKworCQkJLy8gcHJlcGFyZSBmZWVkYmFjaworCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygyKTsKKwkJCXBSYUNmZy0+c3RhdHVzID0gaHRvbnMoMCk7CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF9pZCkgKyBzaXplb2YocFJhQ2ZnLT5sZW5ndGgpCisJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworCisgICAgICAgICAgICBpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjb3B5X3RvX3VzZXIoKSBmYWlsIGluIGNhc2UgUkFDRkdfQ01EX0FURV9SRl9XUklURV9CVUxLXG4iKSk7CisgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIH0KKwkJCWVsc2UKKwkJCXsKKyAgICAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSQUNGR19DTURfQVRFX1JGX1dSSVRFX0JVTEsgaXMgZG9uZSAhXG4iKSk7CisJCQl9CisKKwkJfQorCQkJYnJlYWs7CisjZW5kaWYKKworCisJCWNhc2UgUkFDRkdfQ01EX0dFVF9OT0lTRV9MRVZFTDoKKwkJCXsKKwkJCQlVQ0hBUgljaGFubmVsOworCQkJCUlOVDMyICAgYnVmZmVyWzNdWzEwXTsvKiAzIDogUnhQYXRoIDsgMTAgOiBuby4gb2YgcGVyIHJzc2kgc2FtcGxlcyAqLworCisJCQkJY2hhbm5lbCA9IChudG9ocyhwUmFDZmctPnN0YXR1cykgJiAweDAwRkYpOworCQkJCUNhbE5vaXNlTGV2ZWwocEFkYXB0ZXIsIGNoYW5uZWwsIGJ1ZmZlcik7CisJCQkJbWVtY3B5X2V4bChwQWRhcHRlciwgKFVDSEFSICopcFJhQ2ZnLT5kYXRhLCAoVUNIQVIgKikmKGJ1ZmZlclswXVswXSksIChzaXplb2YoSU5UMzIpKjMqMTApKTsKKworCQkJCS8vIHByZXBhcmUgZmVlZGJhY2sKKwkJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDIgKyAoc2l6ZW9mKElOVDMyKSozKjEwKSk7CisJCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKyAgICAgICAgICAgIAlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfR0VUX05PSVNFX0xFVkVMXG4iKSk7CisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICAJfQorCQkJCWVsc2UKKwkJCQl7CisgICAgICAgICAgICAgICAgCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJBQ0ZHX0NNRF9HRVRfTk9JU0VfTEVWRUwgaXMgZG9uZSAhXG4iKSk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSQUNGR19DTURfR0VUX0NPVU5URVI6CisJCQl7CisJCQkJbWVtY3B5X2V4bChwQWRhcHRlciwgJnBSYUNmZy0+ZGF0YVswXSwgKFVDSEFSICopJnBBZGFwdGVyLT5hdGUuVTJNLCA0KTsKKwkJCQltZW1jcHlfZXhsKHBBZGFwdGVyLCAmcFJhQ2ZnLT5kYXRhWzRdLCAoVUNIQVIgKikmcEFkYXB0ZXItPmF0ZS5PdGhlckRhdGEsIDQpOworCQkJCW1lbWNweV9leGwocEFkYXB0ZXIsICZwUmFDZmctPmRhdGFbOF0sIChVQ0hBUiAqKSZwQWRhcHRlci0+YXRlLkJlYWNvbiwgNCk7CisJCQkJbWVtY3B5X2V4bChwQWRhcHRlciwgJnBSYUNmZy0+ZGF0YVsxMl0sIChVQ0hBUiAqKSZwQWRhcHRlci0+YXRlLk90aGVyQ291bnQsIDQpOworCQkJCW1lbWNweV9leGwocEFkYXB0ZXIsICZwUmFDZmctPmRhdGFbMTZdLCAoVUNIQVIgKikmcEFkYXB0ZXItPmF0ZS5UeEFjMCwgNCk7CisJCQkJbWVtY3B5X2V4bChwQWRhcHRlciwgJnBSYUNmZy0+ZGF0YVsyMF0sIChVQ0hBUiAqKSZwQWRhcHRlci0+YXRlLlR4QWMxLCA0KTsKKwkJCQltZW1jcHlfZXhsKHBBZGFwdGVyLCAmcFJhQ2ZnLT5kYXRhWzI0XSwgKFVDSEFSICopJnBBZGFwdGVyLT5hdGUuVHhBYzIsIDQpOworCQkJCW1lbWNweV9leGwocEFkYXB0ZXIsICZwUmFDZmctPmRhdGFbMjhdLCAoVUNIQVIgKikmcEFkYXB0ZXItPmF0ZS5UeEFjMywgNCk7CisJCQkJbWVtY3B5X2V4bChwQWRhcHRlciwgJnBSYUNmZy0+ZGF0YVszMl0sIChVQ0hBUiAqKSZwQWRhcHRlci0+YXRlLlR4SENDQSwgNCk7CisJCQkJbWVtY3B5X2V4bChwQWRhcHRlciwgJnBSYUNmZy0+ZGF0YVszNl0sIChVQ0hBUiAqKSZwQWRhcHRlci0+YXRlLlR4TWdtdCwgNCk7CisJCQkJbWVtY3B5X2V4bChwQWRhcHRlciwgJnBSYUNmZy0+ZGF0YVs0MF0sIChVQ0hBUiAqKSZwQWRhcHRlci0+YXRlLlJTU0kwLCA0KTsKKwkJCQltZW1jcHlfZXhsKHBBZGFwdGVyLCAmcFJhQ2ZnLT5kYXRhWzQ0XSwgKFVDSEFSICopJnBBZGFwdGVyLT5hdGUuUlNTSTEsIDQpOworCQkJCW1lbWNweV9leGwocEFkYXB0ZXIsICZwUmFDZmctPmRhdGFbNDhdLCAoVUNIQVIgKikmcEFkYXB0ZXItPmF0ZS5SU1NJMiwgNCk7CisJCQkJbWVtY3B5X2V4bChwQWRhcHRlciwgJnBSYUNmZy0+ZGF0YVs1Ml0sIChVQ0hBUiAqKSZwQWRhcHRlci0+YXRlLlNOUjAsIDQpOworCQkJCW1lbWNweV9leGwocEFkYXB0ZXIsICZwUmFDZmctPmRhdGFbNTZdLCAoVUNIQVIgKikmcEFkYXB0ZXItPmF0ZS5TTlIxLCA0KTsKKworCQkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoMis2MCk7CisJCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKyAgICAgICAgICAgIAlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfR0VUX0NPVU5URVJcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIAl9CisJCQkJZWxzZQorCQkJCXsKKyAgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX0dFVF9DT1VOVEVSIGlzIGRvbmUgIVxuIikpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUkFDRkdfQ01EX0NMRUFSX0NPVU5URVI6CisJCQl7CisJCQkJcEFkYXB0ZXItPmF0ZS5VMk0gPSAwOworCQkJCXBBZGFwdGVyLT5hdGUuT3RoZXJEYXRhID0gMDsKKwkJCQlwQWRhcHRlci0+YXRlLkJlYWNvbiA9IDA7CisJCQkJcEFkYXB0ZXItPmF0ZS5PdGhlckNvdW50ID0gMDsKKwkJCQlwQWRhcHRlci0+YXRlLlR4QWMwID0gMDsKKwkJCQlwQWRhcHRlci0+YXRlLlR4QWMxID0gMDsKKwkJCQlwQWRhcHRlci0+YXRlLlR4QWMyID0gMDsKKwkJCQlwQWRhcHRlci0+YXRlLlR4QWMzID0gMDsKKwkJCQlwQWRhcHRlci0+YXRlLlR4SENDQSA9IDA7CisJCQkJcEFkYXB0ZXItPmF0ZS5UeE1nbXQgPSAwOworCQkJCXBBZGFwdGVyLT5hdGUuVHhEb25lQ291bnQgPSAwOworCisJCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygyKTsKKwkJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDApOworCisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBSYUNmZy0+bWFnaWNfbm8pICsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF90eXBlKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX2lkKSArIHNpemVvZihwUmFDZmctPmxlbmd0aCkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworCisgICAgICAgICAgICAJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwUmFDZmcsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjb3B5X3RvX3VzZXIoKSBmYWlsIGluIGNhc2UgUkFDRkdfQ01EX0NMRUFSX0NPVU5URVJcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIAl9CisJCQkJZWxzZQorCQkJCXsKKyAgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX0NMRUFSX0NPVU5URVIgaXMgZG9uZSAhXG4iKSk7CisJCQkJfQorCQkJfQorCisJCQlicmVhazsKKworCQljYXNlIFJBQ0ZHX0NNRF9UWF9TVEFSVDoKKwkJCXsKKwkJCQlVU0hPUlQgKnA7CisJCQkJVVNIT1JUCWVyciA9IDE7CisJCQkJVUNIQVIgICBCYnAyMlZhbHVlID0gMCwgQmJwMjRWYWx1ZSA9IDA7CisKKwkJCQlpZiAoKHBBZGFwdGVyLT5hdGUuVHhTdGF0dXMgIT0gMCkgJiYgKHBBZGFwdGVyLT5hdGUuTW9kZSAmIEFURV9UWEZSQU1FKSkKKwkJCQl7CisJCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQXRlIFR4IGlzIGFscmVhZHkgcnVubmluZywgdG8gcnVuIG5leHQgVHgsIHlvdSBtdXN0IHN0b3AgaXQgZmlyc3RcbiIpKTsKKwkJCQkJZXJyID0gMjsKKwkJCQkJZ290byBUWF9TVEFSVF9FUlJPUjsKKwkJCQl9CisJCQkJZWxzZSBpZiAoKHBBZGFwdGVyLT5hdGUuVHhTdGF0dXMgIT0gMCkgJiYgIShwQWRhcHRlci0+YXRlLk1vZGUgJiBBVEVfVFhGUkFNRSkpCisJCQkJeworCQkJCQlpbnQgaSA9IDA7CisKKwkJCQkJd2hpbGUgKChpKysgPCAxMCkgJiYgKHBBZGFwdGVyLT5hdGUuVHhTdGF0dXMgIT0gMCkpCisJCQkJCXsKKwkJCQkJCVJUTVB1c2VjRGVsYXkoNTAwMCk7CisJCQkJCX0KKworCQkJCQkvLyBmb3JjZSBpdCB0byBzdG9wCisJCQkJCXBBZGFwdGVyLT5hdGUuVHhTdGF0dXMgPSAwOworCQkJCQlwQWRhcHRlci0+YXRlLlR4RG9uZUNvdW50ID0gMDsKKwkJCQkJLy9wQWRhcHRlci0+YXRlLlJlcGVhdCA9IDA7CisJCQkJCXBBZGFwdGVyLT5hdGUuYlFBVHhTdGFydCA9IEZBTFNFOworCQkJCX0KKworCQkJCS8vIElmIHBSYUNmZy0+bGVuZ3RoID09IDAsIHRoaXMgIlJBQ0ZHX0NNRF9UWF9TVEFSVCIgaXMgZm9yIENhcnJpZXIgdGVzdCBvciBDYXJyaWVyIFN1cHByZXNzaW9uLgorCQkJCWlmIChudG9ocyhwUmFDZmctPmxlbmd0aCkgIT0gMCkKKwkJCQl7CisJCQkJCS8vIEdldCBmcmFtZSBpbmZvCisKKwkJCQkJTmRpc01vdmVNZW1vcnkoJnBBZGFwdGVyLT5hdGUuVHhXSSwgcFJhQ2ZnLT5kYXRhICsgMiwgMTYpOworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwkJCQkJUlRNUFdJRW5kaWFuQ2hhbmdlKChQVUNIQVIpJnBBZGFwdGVyLT5hdGUuVHhXSSwgVFlQRV9UWFdJKTsKKyNlbmRpZiAvLyBSVF9CSUdfRU5ESUFOIC8vCisKKwkJCQkJTmRpc01vdmVNZW1vcnkoJnBBZGFwdGVyLT5hdGUuVHhDb3VudCwgcFJhQ2ZnLT5kYXRhICsgMTgsIDQpOworCQkJCQlwQWRhcHRlci0+YXRlLlR4Q291bnQgPSBudG9obChwQWRhcHRlci0+YXRlLlR4Q291bnQpOworCisJCQkJCXAgPSAoVVNIT1JUICopKCZwUmFDZmctPmRhdGFbMjJdKTsKKwkJCQkJLy9wID0gcFJhQ2ZnLT5kYXRhICsgMjI7CisJCQkJCS8vIGFsd2F5cyB1c2UgUUlEX0FDX0JFCisJCQkJCXBBZGFwdGVyLT5hdGUuUUlEID0gMDsKKwkJCQkJcCA9IChVU0hPUlQgKikoJnBSYUNmZy0+ZGF0YVsyNF0pOworCQkJCQkvL3AgPSBwUmFDZmctPmRhdGEgKyAyNDsKKwkJCQkJcEFkYXB0ZXItPmF0ZS5ITGVuID0gbnRvaHMoKnApOworCisJCQkJCWlmIChwQWRhcHRlci0+YXRlLkhMZW4gPiAzMikKKwkJCQkJeworCQkJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJwQWRhcHRlci0+YXRlLkhMZW4gPiAzMlxuIikpOworCQkJCQkJZXJyID0gMzsKKwkJCQkJCWdvdG8gVFhfU1RBUlRfRVJST1I7CisJCQkJCX0KKworCQkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkYXB0ZXItPmF0ZS5IZWFkZXIsIHBSYUNmZy0+ZGF0YSArIDI2LCBwQWRhcHRlci0+YXRlLkhMZW4pOworCisKKwkJCQkJcEFkYXB0ZXItPmF0ZS5QTGVuID0gbnRvaHMocFJhQ2ZnLT5sZW5ndGgpIC0gKHBBZGFwdGVyLT5hdGUuSExlbiArIDI4KTsKKworCQkJCQlpZiAocEFkYXB0ZXItPmF0ZS5QTGVuID4gMzIpCisJCQkJCXsKKwkJCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgicEFkYXB0ZXItPmF0ZS5QTGVuID4gMzJcbiIpKTsKKwkJCQkJCWVyciA9IDQ7CisJCQkJCQlnb3RvIFRYX1NUQVJUX0VSUk9SOworCQkJCQl9CisKKwkJCQkJTmRpc01vdmVNZW1vcnkoJnBBZGFwdGVyLT5hdGUuUGF0dGVybiwgcFJhQ2ZnLT5kYXRhICsgMjYgKyBwQWRhcHRlci0+YXRlLkhMZW4sIHBBZGFwdGVyLT5hdGUuUExlbik7CisJCQkJCXBBZGFwdGVyLT5hdGUuRExlbiA9IHBBZGFwdGVyLT5hdGUuVHhXSS5NUERVdG90YWxCeXRlQ291bnQgLSBwQWRhcHRlci0+YXRlLkhMZW47CisJCQkJfQorCisJCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkYXB0ZXIsIEJCUF9SMjIsICZCYnAyMlZhbHVlKTsKKworCQkJCXN3aXRjaCAoQmJwMjJWYWx1ZSkKKwkJCQl7CisJCQkJCWNhc2UgQkJQMjJfVFhGUkFNRToKKwkJCQkJCXsKKwkJCQkJCQlpZiAocEFkYXB0ZXItPmF0ZS5UeENvdW50ID09IDApCisJCQkJCQkJeworI2lmZGVmIFJUMjg2MAorCQkJCQkJCQlwQWRhcHRlci0+YXRlLlR4Q291bnQgPSAweEZGRkZGRkZGOworI2VuZGlmIC8vIFJUMjg2MCAvLworCQkJCQkJCX0KKwkJCQkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlNUQVJUIFRYRlJBTUVcbiIpKTsKKwkJCQkJCQlwQWRhcHRlci0+YXRlLmJRQVR4U3RhcnQgPSBUUlVFOworCQkJCQkJCVNldF9BVEVfUHJvYyhwQWRhcHRlciwgIlRYRlJBTUUiKTsKKwkJCQkJCX0KKwkJCQkJCWJyZWFrOworCisJCQkJCWNhc2UgQkJQMjJfVFhDT05UX09SX0NBUlJTVVBQOgorCQkJCQkJeworCQkJCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQkJQMjJfVFhDT05UX09SX0NBUlJTVVBQXG4iKSk7CisJCQkJCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkYXB0ZXIsIDI0LCAmQmJwMjRWYWx1ZSk7CisKKwkJCQkJCQlzd2l0Y2ggKEJicDI0VmFsdWUpCisJCQkJCQkJeworCQkJCQkJCQljYXNlIEJCUDI0X1RYQ09OVDoKKwkJCQkJCQkJCXsKKwkJCQkJCQkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlNUQVJUIFRYQ09OVFxuIikpOworCQkJCQkJCQkJCXBBZGFwdGVyLT5hdGUuYlFBVHhTdGFydCA9IFRSVUU7CisJCQkJCQkJCQkJU2V0X0FURV9Qcm9jKHBBZGFwdGVyLCAiVFhDT05UIik7CisJCQkJCQkJCQl9CisJCQkJCQkJCQlicmVhazsKKworCQkJCQkJCQljYXNlIEJCUDI0X0NBUlJTVVBQOgorCQkJCQkJCQkJeworCQkJCQkJCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiU1RBUlQgVFhDQVJSU1VQUFxuIikpOworCQkJCQkJCQkJCXBBZGFwdGVyLT5hdGUuYlFBVHhTdGFydCA9IFRSVUU7CisJCQkJCQkJCQkJcEFkYXB0ZXItPmF0ZS5Nb2RlIHw9IEFURV9UWENBUlJTVVBQOworCQkJCQkJCQkJfQorCQkJCQkJCQkJYnJlYWs7CisKKwkJCQkJCQkJZGVmYXVsdDoKKwkJCQkJCQkJCXsKKwkJCQkJCQkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIlVua25vd24gU3RhcnQgVFggc3VidHlwZSAhIikpOworCQkJCQkJCQkJfQorCQkJCQkJCQkJYnJlYWs7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQkJYnJlYWs7CisKKwkJCQkJY2FzZSBCQlAyMl9UWENBUlI6CisJCQkJCQl7CisJCQkJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJTVEFSVCBUWENBUlJcbiIpKTsKKwkJCQkJCQlwQWRhcHRlci0+YXRlLmJRQVR4U3RhcnQgPSBUUlVFOworCQkJCQkJCVNldF9BVEVfUHJvYyhwQWRhcHRlciwgIlRYQ0FSUiIpOworCQkJCQkJfQorCQkJCQkJYnJlYWs7CisKKwkJCQkJZGVmYXVsdDoKKwkJCQkJCXsKKwkJCQkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIlVua25vd24gU3RhcnQgVFggc3VidHlwZSAhIikpOworCQkJCQkJfQorCQkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJaWYgKHBBZGFwdGVyLT5hdGUuYlFBVHhTdGFydCA9PSBUUlVFKQorCQkJCXsKKwkJCQkJLy8gcHJlcGFyZSBmZWVkYmFjaworCQkJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDIpOworCQkJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDApOworCisJCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihwUmFDZmctPm1hZ2ljX25vKSArIHNpemVvZihwUmFDZmctPmNvbW1hbmRfdHlwZSkKKwkJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworCisJICAgICAgICAgICAgCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFJhQ2ZnLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorCSAgICAgICAgICAgIAl7CisJICAgICAgICAgICAgCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjb3B5X3RvX3VzZXIoKSB3YXMgZmFpbGVkIGluIGNhc2UgUkFDRkdfQ01EX1RYX1NUQVJUXG4iKSk7CisJICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworCSAgICAgICAgICAgIAl9CisJCQkJCWVsc2UKKwkJCQkJeworCSAgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX1RYX1NUQVJUIGlzIGRvbmUgIVxuIikpOworCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCX0KKworVFhfU1RBUlRfRVJST1I6CisJCQkJLy8gcHJlcGFyZSBmZWVkYmFjaworCQkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoMik7CisJCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucyhlcnIpOworCisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBSYUNmZy0+bWFnaWNfbm8pICsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF90eXBlKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX2lkKSArIHNpemVvZihwUmFDZmctPmxlbmd0aCkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworICAgICAgICAgICAgCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFJhQ2ZnLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY29weV90b191c2VyKCkgZmFpbCBpbiBjYXNlIFJBQ0ZHX0NNRF9UWF9TVEFSVFxuIikpOworICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgCX0KKwkJCQllbHNlCisJCQkJeworICAgICAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJmZWVkYmFjayBvZiBUWF9TVEFSVF9FUlJPUiBpcyBkb25lICFcbiIpKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFJBQ0ZHX0NNRF9HRVRfVFhfU1RBVFVTOgorCQkJeworCQkJCVVJTlQzMiBjb3VudDsKKworCQkJCS8vIHByZXBhcmUgZmVlZGJhY2sKKwkJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDYpOworCQkJCXBSYUNmZy0+c3RhdHVzID0gaHRvbnMoMCk7CisJCQkJY291bnQgPSBodG9ubChwQWRhcHRlci0+YXRlLlR4RG9uZUNvdW50KTsKKwkJCQlOZGlzTW92ZU1lbW9yeShwUmFDZmctPmRhdGEsICZjb3VudCwgNCk7CisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBSYUNmZy0+bWFnaWNfbm8pICsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF90eXBlKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX2lkKSArIHNpemVvZihwUmFDZmctPmxlbmd0aCkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworCisgICAgICAgICAgICAJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwUmFDZmcsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjb3B5X3RvX3VzZXIoKSBmYWlsIGluIGNhc2UgUkFDRkdfQ01EX0dFVF9UWF9TVEFUVVNcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIAl9CisJCQkJZWxzZQorCQkJCXsKKyAgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX0dFVF9UWF9TVEFUVVMgaXMgZG9uZSAhXG4iKSk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSQUNGR19DTURfVFhfU1RPUDoKKwkJCXsKKwkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJBQ0ZHX0NNRF9UWF9TVE9QXG4iKSk7CisKKwkJCQlTZXRfQVRFX1Byb2MocEFkYXB0ZXIsICJUWFNUT1AiKTsKKworCQkJCS8vIHByZXBhcmUgZmVlZGJhY2sKKwkJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDIpOworCQkJCXBSYUNmZy0+c3RhdHVzID0gaHRvbnMoMCk7CisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBSYUNmZy0+bWFnaWNfbm8pICsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF90eXBlKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX2lkKSArIHNpemVvZihwUmFDZmctPmxlbmd0aCkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworCisgICAgICAgICAgICAJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwUmFDZmcsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJjb3B5X3RvX3VzZXIoKSBmYWlsIGluIGNhc2UgUkFDRkdfQ01EX1RYX1NUT1BcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIAl9CisJCQkJZWxzZQorCQkJCXsKKyAgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX1RYX1NUT1AgaXMgZG9uZSAhXG4iKSk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSQUNGR19DTURfUlhfU1RBUlQ6CisJCQl7CisJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSQUNGR19DTURfUlhfU1RBUlRcbiIpKTsKKworCQkJCXBBZGFwdGVyLT5hdGUuYlFBUnhTdGFydCA9IFRSVUU7CisJCQkJU2V0X0FURV9Qcm9jKHBBZGFwdGVyLCAiUlhGUkFNRSIpOworCisJCQkJLy8gcHJlcGFyZSBmZWVkYmFjaworCQkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoMik7CisJCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKyAgICAgICAgICAgIAlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfUlhfU1RBUlRcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIAl9CisJCQkJZWxzZQorCQkJCXsKKyAgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX1JYX1NUQVJUIGlzIGRvbmUgIVxuIikpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUkFDRkdfQ01EX1JYX1NUT1A6CisJCQl7CisJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSQUNGR19DTURfUlhfU1RPUFxuIikpOworCisJCQkJU2V0X0FURV9Qcm9jKHBBZGFwdGVyLCAiUlhTVE9QIik7CisKKwkJCQkvLyBwcmVwYXJlIGZlZWRiYWNrCisJCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygyKTsKKwkJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDApOworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihwUmFDZmctPm1hZ2ljX25vKSArIHNpemVvZihwUmFDZmctPmNvbW1hbmRfdHlwZSkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF9pZCkgKyBzaXplb2YocFJhQ2ZnLT5sZW5ndGgpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPnNlcXVlbmNlKSArIG50b2hzKHBSYUNmZy0+bGVuZ3RoKTsKKworICAgICAgICAgICAgCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFJhQ2ZnLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY29weV90b191c2VyKCkgZmFpbCBpbiBjYXNlIFJBQ0ZHX0NNRF9SWF9TVE9QXG4iKSk7CisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICAJfQorCQkJCWVsc2UKKwkJCQl7CisgICAgICAgICAgICAgICAgCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJBQ0ZHX0NNRF9SWF9TVE9QIGlzIGRvbmUgIVxuIikpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCS8qIFRoZSBmb2xsb3dpbmcgY2FzZXMgYXJlIGZvciBuZXcgQVRFIEdVSShub3QgUUEpLiAqLworCQkvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKwkJY2FzZSBSQUNGR19DTURfQVRFX1NUQVJUX1RYX0NBUlJJRVI6CisJCQl7CisJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSQUNGR19DTURfQVRFX1NUQVJUX1RYX0NBUlJJRVJcbiIpKTsKKworCQkJCVNldF9BVEVfUHJvYyhwQWRhcHRlciwgIlRYQ0FSUiIpOworCisJCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygyKTsKKwkJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDApOworCisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBSYUNmZy0+bWFnaWNfbm8pICsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF90eXBlKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX2lkKSArIHNpemVvZihwUmFDZmctPmxlbmd0aCkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworCisJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgid3JxLT51LmRhdGEubGVuZ3RoID0gJWRcbiIsIHdycS0+dS5kYXRhLmxlbmd0aCkpOworCisgICAgICAgICAgICAJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwUmFDZmcsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjb3B5X3RvX3VzZXIoKSBmYWlsIGluIGNhc2UgUkFDRkdfQ01EX0FURV9TVEFSVF9UWF9DQVJSSUVSXG4iKSk7CisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICAJfQorCQkJCWVsc2UKKwkJCQl7CisgICAgICAgICAgICAgICAgCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJBQ0ZHX0NNRF9BVEVfU1RBUlRfVFhfQ0FSUklFUiBpcyBkb25lICFcbiIpKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFJBQ0ZHX0NNRF9BVEVfU1RBUlRfVFhfQ09OVDoKKwkJCXsKKwkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJBQ0ZHX0NNRF9BVEVfU1RBUlRfVFhfQ09OVFxuIikpOworCisJCQkJU2V0X0FURV9Qcm9jKHBBZGFwdGVyLCAiVFhDT05UIik7CisKKwkJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDIpOworCQkJCXBSYUNmZy0+c3RhdHVzID0gaHRvbnMoMCk7CisKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKwkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJ3cnEtPnUuZGF0YS5sZW5ndGggPSAlZFxuIiwgd3JxLT51LmRhdGEubGVuZ3RoKSk7CisKKyAgICAgICAgICAgIAlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfQVRFX1NUQVJUX1RYX0NPTlRcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIAl9CisJCQkJZWxzZQorCQkJCXsKKyAgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX0FURV9TVEFSVF9UWF9DT05UIGlzIGRvbmUgIVxuIikpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUkFDRkdfQ01EX0FURV9TVEFSVF9UWF9GUkFNRToKKwkJCXsKKwkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJBQ0ZHX0NNRF9BVEVfU1RBUlRfVFhfRlJBTUVcbiIpKTsKKworCQkJCVNldF9BVEVfUHJvYyhwQWRhcHRlciwgIlRYRlJBTUUiKTsKKworCQkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoMik7CisJCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihwUmFDZmctPm1hZ2ljX25vKSArIHNpemVvZihwUmFDZmctPmNvbW1hbmRfdHlwZSkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF9pZCkgKyBzaXplb2YocFJhQ2ZnLT5sZW5ndGgpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPnNlcXVlbmNlKSArIG50b2hzKHBSYUNmZy0+bGVuZ3RoKTsKKworCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIndycS0+dS5kYXRhLmxlbmd0aCA9ICVkXG4iLCB3cnEtPnUuZGF0YS5sZW5ndGgpKTsKKworICAgICAgICAgICAgCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFJhQ2ZnLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY29weV90b191c2VyKCkgZmFpbCBpbiBjYXNlIFJBQ0ZHX0NNRF9BVEVfU1RBUlRfVFhfRlJBTUVcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIAl9CisJCQkJZWxzZQorCQkJCXsKKyAgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX0FURV9TVEFSVF9UWF9GUkFNRSBpcyBkb25lICFcbiIpKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFJBQ0ZHX0NNRF9BVEVfU0VUX0JXOgorCQkJeworCQkJCVNIT1JUICAgIHZhbHVlID0gMDsKKwkJCQlVQ0hBUiAgICBzdHJbTEVOX09GX0FSR107CisKKwkJCQlOZGlzWmVyb01lbW9yeShzdHIsIExFTl9PRl9BUkcpOworCisJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSQUNGR19DTURfQVRFX1NFVF9CV1xuIikpOworCisJCQkJbWVtY3B5KChQVUNIQVIpJnZhbHVlLCAoUFVDSEFSKSYocFJhQ2ZnLT5zdGF0dXMpLCAyKTsKKwkJCQl2YWx1ZSA9IG50b2hzKHZhbHVlKTsKKwkJCQlzcHJpbnRmKChQQ0hBUilzdHIsICIlZCIsIHZhbHVlKTsKKworCQkJCVNldF9BVEVfVFhfQldfUHJvYyhwQWRhcHRlciwgc3RyKTsKKworCQkJCS8vIHByZXBhcmUgZmVlZGJhY2sKKwkJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDIpOworCQkJCXBSYUNmZy0+c3RhdHVzID0gaHRvbnMoMCk7CisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBSYUNmZy0+bWFnaWNfbm8pICsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF90eXBlKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX2lkKSArIHNpemVvZihwUmFDZmctPmxlbmd0aCkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworCisgICAgICAgICAgICAJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwUmFDZmcsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjb3B5X3RvX3VzZXIoKSBmYWlsIGluIGNhc2UgUkFDRkdfQ01EX0FURV9TRVRfQldcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIAl9CisJCQkJZWxzZQorCQkJCXsKKyAgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX0FURV9TRVRfQlcgaXMgZG9uZSAhXG4iKSk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSQUNGR19DTURfQVRFX1NFVF9UWF9QT1dFUjA6CisJCQl7CisJCQkJU0hPUlQgICAgdmFsdWUgPSAwOworCQkJCVVDSEFSICAgIHN0cltMRU5fT0ZfQVJHXTsKKworCQkJCU5kaXNaZXJvTWVtb3J5KHN0ciwgTEVOX09GX0FSRyk7CisKKwkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJBQ0ZHX0NNRF9BVEVfU0VUX1RYX1BPV0VSMFxuIikpOworCisJCQkJbWVtY3B5KChQVUNIQVIpJnZhbHVlLCAoUFVDSEFSKSYocFJhQ2ZnLT5zdGF0dXMpLCAyKTsKKwkJCQl2YWx1ZSA9IG50b2hzKHZhbHVlKTsKKwkJCQlzcHJpbnRmKChQQ0hBUilzdHIsICIlZCIsIHZhbHVlKTsKKwkJCQlTZXRfQVRFX1RYX1BPV0VSMF9Qcm9jKHBBZGFwdGVyLCBzdHIpOworCisJCQkJLy8gcHJlcGFyZSBmZWVkYmFjaworCQkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoMik7CisJCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKyAgICAgICAgICAgIAlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfQVRFX1NFVF9UWF9QT1dFUjBcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIAl9CisJCQkJZWxzZQorCQkJCXsKKyAgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX0FURV9TRVRfVFhfUE9XRVIwIGlzIGRvbmUgIVxuIikpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUkFDRkdfQ01EX0FURV9TRVRfVFhfUE9XRVIxOgorCQkJeworCQkJCVNIT1JUICAgIHZhbHVlID0gMDsKKwkJCQlVQ0hBUiAgICBzdHJbTEVOX09GX0FSR107CisKKwkJCQlOZGlzWmVyb01lbW9yeShzdHIsIExFTl9PRl9BUkcpOworCisJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSQUNGR19DTURfQVRFX1NFVF9UWF9QT1dFUjFcbiIpKTsKKworCQkJCW1lbWNweSgoUFVDSEFSKSZ2YWx1ZSwgKFBVQ0hBUikmKHBSYUNmZy0+c3RhdHVzKSwgMik7CisJCQkJdmFsdWUgPSBudG9ocyh2YWx1ZSk7CisJCQkJc3ByaW50ZigoUENIQVIpc3RyLCAiJWQiLCB2YWx1ZSk7CisJCQkJU2V0X0FURV9UWF9QT1dFUjFfUHJvYyhwQWRhcHRlciwgc3RyKTsKKworCQkJCS8vIHByZXBhcmUgZmVlZGJhY2sKKwkJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDIpOworCQkJCXBSYUNmZy0+c3RhdHVzID0gaHRvbnMoMCk7CisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBSYUNmZy0+bWFnaWNfbm8pICsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF90eXBlKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX2lkKSArIHNpemVvZihwUmFDZmctPmxlbmd0aCkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworCisgICAgICAgICAgICAJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwUmFDZmcsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjb3B5X3RvX3VzZXIoKSBmYWlsIGluIGNhc2UgUkFDRkdfQ01EX0FURV9TRVRfVFhfUE9XRVIxXG4iKSk7CisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICAJfQorCQkJCWVsc2UKKwkJCQl7CisgICAgICAgICAgICAgICAgCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJBQ0ZHX0NNRF9BVEVfU0VUX1RYX1BPV0VSMSBpcyBkb25lICFcbiIpKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFJBQ0ZHX0NNRF9BVEVfU0VUX0ZSRVFfT0ZGU0VUOgorCQkJeworCQkJCVNIT1JUICAgIHZhbHVlID0gMDsKKwkJCQlVQ0hBUiAgICBzdHJbTEVOX09GX0FSR107CisKKwkJCQlOZGlzWmVyb01lbW9yeShzdHIsIExFTl9PRl9BUkcpOworCisJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSQUNGR19DTURfQVRFX1NFVF9GUkVRX09GRlNFVFxuIikpOworCisJCQkJbWVtY3B5KChQVUNIQVIpJnZhbHVlLCAoUFVDSEFSKSYocFJhQ2ZnLT5zdGF0dXMpLCAyKTsKKwkJCQl2YWx1ZSA9IG50b2hzKHZhbHVlKTsKKwkJCQlzcHJpbnRmKChQQ0hBUilzdHIsICIlZCIsIHZhbHVlKTsKKwkJCQlTZXRfQVRFX1RYX0ZSRVFPRkZTRVRfUHJvYyhwQWRhcHRlciwgc3RyKTsKKworCQkJCS8vIHByZXBhcmUgZmVlZGJhY2sKKwkJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDIpOworCQkJCXBSYUNmZy0+c3RhdHVzID0gaHRvbnMoMCk7CisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBSYUNmZy0+bWFnaWNfbm8pICsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF90eXBlKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX2lkKSArIHNpemVvZihwUmFDZmctPmxlbmd0aCkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworCisgICAgICAgICAgICAJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwUmFDZmcsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjb3B5X3RvX3VzZXIoKSBmYWlsIGluIGNhc2UgUkFDRkdfQ01EX0FURV9TRVRfRlJFUV9PRkZTRVRcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIAl9CisJCQkJZWxzZQorCQkJCXsKKyAgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX0FURV9TRVRfRlJFUV9PRkZTRVQgaXMgZG9uZSAhXG4iKSk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSQUNGR19DTURfQVRFX0dFVF9TVEFUSVNUSUNTOgorCQkJeworCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUkFDRkdfQ01EX0FURV9HRVRfU1RBVElTVElDU1xuIikpOworCisJCQkJbWVtY3B5X2V4bChwQWRhcHRlciwgJnBSYUNmZy0+ZGF0YVswXSwgKFVDSEFSICopJnBBZGFwdGVyLT5hdGUuVHhEb25lQ291bnQsIDQpOworCQkJCW1lbWNweV9leGwocEFkYXB0ZXIsICZwUmFDZmctPmRhdGFbNF0sIChVQ0hBUiAqKSZwQWRhcHRlci0+V2xhbkNvdW50ZXJzLlJldHJ5Q291bnQudS5Mb3dQYXJ0LCA0KTsKKwkJCQltZW1jcHlfZXhsKHBBZGFwdGVyLCAmcFJhQ2ZnLT5kYXRhWzhdLCAoVUNIQVIgKikmcEFkYXB0ZXItPldsYW5Db3VudGVycy5GYWlsZWRDb3VudC51Lkxvd1BhcnQsIDQpOworCQkJCW1lbWNweV9leGwocEFkYXB0ZXIsICZwUmFDZmctPmRhdGFbMTJdLCAoVUNIQVIgKikmcEFkYXB0ZXItPldsYW5Db3VudGVycy5SVFNTdWNjZXNzQ291bnQudS5Mb3dQYXJ0LCA0KTsKKwkJCQltZW1jcHlfZXhsKHBBZGFwdGVyLCAmcFJhQ2ZnLT5kYXRhWzE2XSwgKFVDSEFSICopJnBBZGFwdGVyLT5XbGFuQ291bnRlcnMuUlRTRmFpbHVyZUNvdW50LnUuTG93UGFydCwgNCk7CisJCQkJbWVtY3B5X2V4bChwQWRhcHRlciwgJnBSYUNmZy0+ZGF0YVsyMF0sIChVQ0hBUiAqKSZwQWRhcHRlci0+V2xhbkNvdW50ZXJzLlJlY2VpdmVkRnJhZ21lbnRDb3VudC5RdWFkUGFydCwgNCk7CisJCQkJbWVtY3B5X2V4bChwQWRhcHRlciwgJnBSYUNmZy0+ZGF0YVsyNF0sIChVQ0hBUiAqKSZwQWRhcHRlci0+V2xhbkNvdW50ZXJzLkZDU0Vycm9yQ291bnQudS5Mb3dQYXJ0LCA0KTsKKwkJCQltZW1jcHlfZXhsKHBBZGFwdGVyLCAmcFJhQ2ZnLT5kYXRhWzI4XSwgKFVDSEFSICopJnBBZGFwdGVyLT5Db3VudGVyczgwMjMuUnhOb0J1ZmZlciwgNCk7CisJCQkJbWVtY3B5X2V4bChwQWRhcHRlciwgJnBSYUNmZy0+ZGF0YVszMl0sIChVQ0hBUiAqKSZwQWRhcHRlci0+V2xhbkNvdW50ZXJzLkZyYW1lRHVwbGljYXRlQ291bnQudS5Mb3dQYXJ0LCA0KTsKKwkJCQltZW1jcHlfZXhsKHBBZGFwdGVyLCAmcFJhQ2ZnLT5kYXRhWzM2XSwgKFVDSEFSICopJnBBZGFwdGVyLT5SYWxpbmtDb3VudGVycy5PbmVTZWNGYWxzZUNDQUNudCwgNCk7CisKKwkJCQlpZiAocEFkYXB0ZXItPmF0ZS5SeEFudGVubmFTZWwgPT0gMCkKKwkJCQl7CisJCQkJCUlOVDMyIFJTU0kwID0gMDsKKwkJCQkJSU5UMzIgUlNTSTEgPSAwOworCQkJCQlJTlQzMiBSU1NJMiA9IDA7CisKKwkJCQkJUlNTSTAgPSAoSU5UMzIpKHBBZGFwdGVyLT5hdGUuTGFzdFJzc2kwIC0gcEFkYXB0ZXItPkJicFJzc2lUb0RibURlbHRhKTsKKwkJCQkJUlNTSTEgPSAoSU5UMzIpKHBBZGFwdGVyLT5hdGUuTGFzdFJzc2kxIC0gcEFkYXB0ZXItPkJicFJzc2lUb0RibURlbHRhKTsKKwkJCQkJUlNTSTIgPSAoSU5UMzIpKHBBZGFwdGVyLT5hdGUuTGFzdFJzc2kyIC0gcEFkYXB0ZXItPkJicFJzc2lUb0RibURlbHRhKTsKKwkJCQkJbWVtY3B5X2V4bChwQWRhcHRlciwgJnBSYUNmZy0+ZGF0YVs0MF0sIChVQ0hBUiAqKSZSU1NJMCwgNCk7CisJCQkJCW1lbWNweV9leGwocEFkYXB0ZXIsICZwUmFDZmctPmRhdGFbNDRdLCAoVUNIQVIgKikmUlNTSTEsIDQpOworCQkJCQltZW1jcHlfZXhsKHBBZGFwdGVyLCAmcFJhQ2ZnLT5kYXRhWzQ4XSwgKFVDSEFSICopJlJTU0kyLCA0KTsKKwkJCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygyKzUyKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJSU5UMzIgUlNTSTAgPSAwOworCisJCQkJCVJTU0kwID0gKElOVDMyKShwQWRhcHRlci0+YXRlLkxhc3RSc3NpMCAtIHBBZGFwdGVyLT5CYnBSc3NpVG9EYm1EZWx0YSk7CisJCQkJCW1lbWNweV9leGwocEFkYXB0ZXIsICZwUmFDZmctPmRhdGFbNDBdLCAoVUNIQVIgKikmUlNTSTAsIDQpOworCQkJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDIrNDQpOworCQkJCX0KKwkJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDApOworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihwUmFDZmctPm1hZ2ljX25vKSArIHNpemVvZihwUmFDZmctPmNvbW1hbmRfdHlwZSkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF9pZCkgKyBzaXplb2YocFJhQ2ZnLT5sZW5ndGgpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPnNlcXVlbmNlKSArIG50b2hzKHBSYUNmZy0+bGVuZ3RoKTsKKworICAgICAgICAgICAgCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFJhQ2ZnLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY29weV90b191c2VyKCkgZmFpbCBpbiBjYXNlIFJBQ0ZHX0NNRF9BVEVfR0VUX1NUQVRJU1RJQ1NcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIAl9CisJCQkJZWxzZQorCQkJCXsKKyAgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX0FURV9HRVRfU1RBVElTVElDUyBpcyBkb25lICFcbiIpKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFJBQ0ZHX0NNRF9BVEVfUkVTRVRfQ09VTlRFUjoKKwkJCXsKKwkJCQlTSE9SVCAgICB2YWx1ZSA9IDE7CisJCQkJVUNIQVIgICAgc3RyW0xFTl9PRl9BUkddOworCisJCQkJTmRpc1plcm9NZW1vcnkoc3RyLCBMRU5fT0ZfQVJHKTsKKworCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUkFDRkdfQ01EX0FURV9SRVNFVF9DT1VOVEVSXG4iKSk7CisKKwkJCQlzcHJpbnRmKChQQ0hBUilzdHIsICIlZCIsIHZhbHVlKTsKKwkJCQlTZXRfUmVzZXRTdGF0Q291bnRlcl9Qcm9jKHBBZGFwdGVyLCBzdHIpOworCisJCQkJcEFkYXB0ZXItPmF0ZS5UeERvbmVDb3VudCA9IDA7CisKKwkJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDIpOworCQkJCXBSYUNmZy0+c3RhdHVzID0gaHRvbnMoMCk7CisKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKyAgICAgICAgICAgIAlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfQVRFX1JFU0VUX0NPVU5URVJcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIAl9CisJCQkJZWxzZQorCQkJCXsKKyAgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX0FURV9SRVNFVF9DT1VOVEVSIGlzIGRvbmUgIVxuIikpOworCQkJCX0KKwkJCX0KKworCQkJYnJlYWs7CisKKwkJY2FzZSBSQUNGR19DTURfQVRFX1NFTF9UWF9BTlRFTk5BOgorCQkJeworCQkJCVNIT1JUICAgIHZhbHVlID0gMDsKKwkJCQlVQ0hBUiAgICBzdHJbTEVOX09GX0FSR107CisKKwkJCQlOZGlzWmVyb01lbW9yeShzdHIsIExFTl9PRl9BUkcpOworCisJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSQUNGR19DTURfQVRFX1NFTF9UWF9BTlRFTk5BXG4iKSk7CisKKwkJCQltZW1jcHkoKFBVQ0hBUikmdmFsdWUsIChQVUNIQVIpJihwUmFDZmctPnN0YXR1cyksIDIpOworCQkJCXZhbHVlID0gbnRvaHModmFsdWUpOworCQkJCXNwcmludGYoKFBDSEFSKXN0ciwgIiVkIiwgdmFsdWUpOworCQkJCVNldF9BVEVfVFhfQW50ZW5uYV9Qcm9jKHBBZGFwdGVyLCBzdHIpOworCisJCQkJLy8gcHJlcGFyZSBmZWVkYmFjaworCQkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoMik7CisJCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKyAgICAgICAgICAgIAlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfQVRFX1NFTF9UWF9BTlRFTk5BXG4iKSk7CisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICAJfQorCQkJCWVsc2UKKwkJCQl7CisgICAgICAgICAgICAgICAgCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJBQ0ZHX0NNRF9BVEVfU0VMX1RYX0FOVEVOTkEgaXMgZG9uZSAhXG4iKSk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSQUNGR19DTURfQVRFX1NFTF9SWF9BTlRFTk5BOgorCQkJeworCQkJCVNIT1JUICAgIHZhbHVlID0gMDsKKwkJCQlVQ0hBUiAgICBzdHJbTEVOX09GX0FSR107CisKKwkJCQlOZGlzWmVyb01lbW9yeShzdHIsIExFTl9PRl9BUkcpOworCisJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSQUNGR19DTURfQVRFX1NFTF9SWF9BTlRFTk5BXG4iKSk7CisKKwkJCQltZW1jcHkoKFBVQ0hBUikmdmFsdWUsIChQVUNIQVIpJihwUmFDZmctPnN0YXR1cyksIDIpOworCQkJCXZhbHVlID0gbnRvaHModmFsdWUpOworCQkJCXNwcmludGYoKFBDSEFSKXN0ciwgIiVkIiwgdmFsdWUpOworCQkJCVNldF9BVEVfUlhfQW50ZW5uYV9Qcm9jKHBBZGFwdGVyLCBzdHIpOworCisJCQkJLy8gcHJlcGFyZSBmZWVkYmFjaworCQkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoMik7CisJCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKyAgICAgICAgICAgIAlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfQVRFX1NFTF9SWF9BTlRFTk5BXG4iKSk7CisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICAJfQorCQkJCWVsc2UKKwkJCQl7CisgICAgICAgICAgICAgICAgCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJBQ0ZHX0NNRF9BVEVfU0VMX1JYX0FOVEVOTkEgaXMgZG9uZSAhXG4iKSk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSQUNGR19DTURfQVRFX1NFVF9QUkVBTUJMRToKKwkJCXsKKwkJCQlTSE9SVCAgICB2YWx1ZSA9IDA7CisJCQkJVUNIQVIgICAgc3RyW0xFTl9PRl9BUkddOworCisJCQkJTmRpc1plcm9NZW1vcnkoc3RyLCBMRU5fT0ZfQVJHKTsKKworCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUkFDRkdfQ01EX0FURV9TRVRfUFJFQU1CTEVcbiIpKTsKKworCQkJCW1lbWNweSgoUFVDSEFSKSZ2YWx1ZSwgKFBVQ0hBUikmKHBSYUNmZy0+c3RhdHVzKSwgMik7CisJCQkJdmFsdWUgPSBudG9ocyh2YWx1ZSk7CisJCQkJc3ByaW50ZigoUENIQVIpc3RyLCAiJWQiLCB2YWx1ZSk7CisJCQkJU2V0X0FURV9UWF9NT0RFX1Byb2MocEFkYXB0ZXIsIHN0cik7CisKKwkJCQkvLyBwcmVwYXJlIGZlZWRiYWNrCisJCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygyKTsKKwkJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDApOworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihwUmFDZmctPm1hZ2ljX25vKSArIHNpemVvZihwUmFDZmctPmNvbW1hbmRfdHlwZSkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF9pZCkgKyBzaXplb2YocFJhQ2ZnLT5sZW5ndGgpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPnNlcXVlbmNlKSArIG50b2hzKHBSYUNmZy0+bGVuZ3RoKTsKKworICAgICAgICAgICAgCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFJhQ2ZnLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY29weV90b191c2VyKCkgZmFpbCBpbiBjYXNlIFJBQ0ZHX0NNRF9BVEVfU0VUX1BSRUFNQkxFXG4iKSk7CisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICAJfQorCQkJCWVsc2UKKwkJCQl7CisgICAgICAgICAgICAgICAgCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJBQ0ZHX0NNRF9BVEVfU0VUX1BSRUFNQkxFIGlzIGRvbmUgIVxuIikpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUkFDRkdfQ01EX0FURV9TRVRfQ0hBTk5FTDoKKwkJCXsKKwkJCQlTSE9SVCAgICB2YWx1ZSA9IDA7CisJCQkJVUNIQVIgICAgc3RyW0xFTl9PRl9BUkddOworCisJCQkJTmRpc1plcm9NZW1vcnkoc3RyLCBMRU5fT0ZfQVJHKTsKKworCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUkFDRkdfQ01EX0FURV9TRVRfQ0hBTk5FTFxuIikpOworCisJCQkJbWVtY3B5KChQVUNIQVIpJnZhbHVlLCAoUFVDSEFSKSYocFJhQ2ZnLT5zdGF0dXMpLCAyKTsKKwkJCQl2YWx1ZSA9IG50b2hzKHZhbHVlKTsKKwkJCQlzcHJpbnRmKChQQ0hBUilzdHIsICIlZCIsIHZhbHVlKTsKKwkJCQlTZXRfQVRFX0NIQU5ORUxfUHJvYyhwQWRhcHRlciwgc3RyKTsKKworCQkJCS8vIHByZXBhcmUgZmVlZGJhY2sKKwkJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDIpOworCQkJCXBSYUNmZy0+c3RhdHVzID0gaHRvbnMoMCk7CisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBSYUNmZy0+bWFnaWNfbm8pICsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF90eXBlKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX2lkKSArIHNpemVvZihwUmFDZmctPmxlbmd0aCkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworCisgICAgICAgICAgICAJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwUmFDZmcsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjb3B5X3RvX3VzZXIoKSBmYWlsIGluIGNhc2UgUkFDRkdfQ01EX0FURV9TRVRfQ0hBTk5FTFxuIikpOworICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgCX0KKwkJCQllbHNlCisJCQkJeworICAgICAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSQUNGR19DTURfQVRFX1NFVF9DSEFOTkVMIGlzIGRvbmUgIVxuIikpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUkFDRkdfQ01EX0FURV9TRVRfQUREUjE6CisJCQl7CisJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSQUNGR19DTURfQVRFX1NFVF9BRERSMVxuIikpOworCisJCQkJLy8gQWRkciBpcyBhbiBhcnJheSBvZiBVQ0hBUiwKKwkJCQkvLyBzbyBubyBuZWVkIHRvIHBlcmZvcm0gZW5kaWFuIHN3YXAuCisJCQkJbWVtY3B5KHBBZGFwdGVyLT5hdGUuQWRkcjEsIChQVUNIQVIpKHBSYUNmZy0+ZGF0YSAtIDIpLCBNQUNfQUREUl9MRU4pOworCisJCQkJLy8gcHJlcGFyZSBmZWVkYmFjaworCQkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoMik7CisJCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKyAgICAgICAgICAgIAlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfQVRFX1NFVF9BRERSMVxuIikpOworICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSQUNGR19DTURfQVRFX1NFVF9BRERSMSBpcyBkb25lICFcbiAoQUREUjEgPSAlMlg6JTJYOiUyWDolMlg6JTJYOiUyWClcbiIsIHBBZGFwdGVyLT5hdGUuQWRkcjFbMF0sCisJCQkJCQlwQWRhcHRlci0+YXRlLkFkZHIxWzFdLCBwQWRhcHRlci0+YXRlLkFkZHIxWzJdLCBwQWRhcHRlci0+YXRlLkFkZHIxWzNdLCBwQWRhcHRlci0+YXRlLkFkZHIxWzRdLCBwQWRhcHRlci0+YXRlLkFkZHIxWzVdKSk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSQUNGR19DTURfQVRFX1NFVF9BRERSMjoKKwkJCXsKKwkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJBQ0ZHX0NNRF9BVEVfU0VUX0FERFIyXG4iKSk7CisKKwkJCQkvLyBBZGRyIGlzIGFuIGFycmF5IG9mIFVDSEFSLAorCQkJCS8vIHNvIG5vIG5lZWQgdG8gcGVyZm9ybSBlbmRpYW4gc3dhcC4KKwkJCQltZW1jcHkocEFkYXB0ZXItPmF0ZS5BZGRyMiwgKFBVQ0hBUikocFJhQ2ZnLT5kYXRhIC0gMiksIE1BQ19BRERSX0xFTik7CisKKwkJCQkvLyBwcmVwYXJlIGZlZWRiYWNrCisJCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygyKTsKKwkJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDApOworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihwUmFDZmctPm1hZ2ljX25vKSArIHNpemVvZihwUmFDZmctPmNvbW1hbmRfdHlwZSkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF9pZCkgKyBzaXplb2YocFJhQ2ZnLT5sZW5ndGgpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPnNlcXVlbmNlKSArIG50b2hzKHBSYUNmZy0+bGVuZ3RoKTsKKworICAgICAgICAgICAgCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFJhQ2ZnLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY29weV90b191c2VyKCkgZmFpbCBpbiBjYXNlIFJBQ0ZHX0NNRF9BVEVfU0VUX0FERFIyXG4iKSk7CisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICAJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJBQ0ZHX0NNRF9BVEVfU0VUX0FERFIyIGlzIGRvbmUgIVxuIChBRERSMiA9ICUyWDolMlg6JTJYOiUyWDolMlg6JTJYKVxuIiwgcEFkYXB0ZXItPmF0ZS5BZGRyMlswXSwKKwkJCQkJCXBBZGFwdGVyLT5hdGUuQWRkcjJbMV0sIHBBZGFwdGVyLT5hdGUuQWRkcjJbMl0sIHBBZGFwdGVyLT5hdGUuQWRkcjJbM10sIHBBZGFwdGVyLT5hdGUuQWRkcjJbNF0sIHBBZGFwdGVyLT5hdGUuQWRkcjJbNV0pKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFJBQ0ZHX0NNRF9BVEVfU0VUX0FERFIzOgorCQkJeworCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUkFDRkdfQ01EX0FURV9TRVRfQUREUjNcbiIpKTsKKworCQkJCS8vIEFkZHIgaXMgYW4gYXJyYXkgb2YgVUNIQVIsCisJCQkJLy8gc28gbm8gbmVlZCB0byBwZXJmb3JtIGVuZGlhbiBzd2FwLgorCQkJCW1lbWNweShwQWRhcHRlci0+YXRlLkFkZHIzLCAoUFVDSEFSKShwUmFDZmctPmRhdGEgLSAyKSwgTUFDX0FERFJfTEVOKTsKKworCQkJCS8vIHByZXBhcmUgZmVlZGJhY2sKKwkJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDIpOworCQkJCXBSYUNmZy0+c3RhdHVzID0gaHRvbnMoMCk7CisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBSYUNmZy0+bWFnaWNfbm8pICsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF90eXBlKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX2lkKSArIHNpemVvZihwUmFDZmctPmxlbmd0aCkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworCisgICAgICAgICAgICAJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwUmFDZmcsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjb3B5X3RvX3VzZXIoKSBmYWlsIGluIGNhc2UgUkFDRkdfQ01EX0FURV9TRVRfQUREUjNcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIAl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX0FURV9TRVRfQUREUjMgaXMgZG9uZSAhXG4gKEFERFIzID0gJTJYOiUyWDolMlg6JTJYOiUyWDolMlgpXG4iLCBwQWRhcHRlci0+YXRlLkFkZHIzWzBdLAorCQkJCQkJcEFkYXB0ZXItPmF0ZS5BZGRyM1sxXSwgcEFkYXB0ZXItPmF0ZS5BZGRyM1syXSwgcEFkYXB0ZXItPmF0ZS5BZGRyM1szXSwgcEFkYXB0ZXItPmF0ZS5BZGRyM1s0XSwgcEFkYXB0ZXItPmF0ZS5BZGRyM1s1XSkpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUkFDRkdfQ01EX0FURV9TRVRfUkFURToKKwkJCXsKKwkJCQlTSE9SVCAgICB2YWx1ZSA9IDA7CisJCQkJVUNIQVIgICAgc3RyW0xFTl9PRl9BUkddOworCisJCQkJTmRpc1plcm9NZW1vcnkoc3RyLCBMRU5fT0ZfQVJHKTsKKworCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUkFDRkdfQ01EX0FURV9TRVRfUkFURVxuIikpOworCisJCQkJbWVtY3B5KChQVUNIQVIpJnZhbHVlLCAoUFVDSEFSKSYocFJhQ2ZnLT5zdGF0dXMpLCAyKTsKKwkJCQl2YWx1ZSA9IG50b2hzKHZhbHVlKTsKKwkJCQlzcHJpbnRmKChQQ0hBUilzdHIsICIlZCIsIHZhbHVlKTsKKwkJCQlTZXRfQVRFX1RYX01DU19Qcm9jKHBBZGFwdGVyLCBzdHIpOworCisJCQkJLy8gcHJlcGFyZSBmZWVkYmFjaworCQkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoMik7CisJCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKyAgICAgICAgICAgIAlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfQVRFX1NFVF9SQVRFXG4iKSk7CisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICAJfQorCQkJCWVsc2UKKwkJCQl7CisgICAgICAgICAgICAgICAgCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJBQ0ZHX0NNRF9BVEVfU0VUX1JBVEUgaXMgZG9uZSAhXG4iKSk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSQUNGR19DTURfQVRFX1NFVF9UWF9GUkFNRV9MRU46CisJCQl7CisJCQkJU0hPUlQgICAgdmFsdWUgPSAwOworCQkJCVVDSEFSICAgIHN0cltMRU5fT0ZfQVJHXTsKKworCQkJCU5kaXNaZXJvTWVtb3J5KHN0ciwgTEVOX09GX0FSRyk7CisKKwkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJBQ0ZHX0NNRF9BVEVfU0VUX1RYX0ZSQU1FX0xFTlxuIikpOworCisJCQkJbWVtY3B5KChQVUNIQVIpJnZhbHVlLCAoUFVDSEFSKSYocFJhQ2ZnLT5zdGF0dXMpLCAyKTsKKwkJCQl2YWx1ZSA9IG50b2hzKHZhbHVlKTsKKwkJCQlzcHJpbnRmKChQQ0hBUilzdHIsICIlZCIsIHZhbHVlKTsKKwkJCQlTZXRfQVRFX1RYX0xFTkdUSF9Qcm9jKHBBZGFwdGVyLCBzdHIpOworCisJCQkJLy8gcHJlcGFyZSBmZWVkYmFjaworCQkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoMik7CisJCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKyAgICAgICAgICAgIAlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfQVRFX1NFVF9UWF9GUkFNRV9MRU5cbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIAl9CisJCQkJZWxzZQorCQkJCXsKKyAgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX0FURV9TRVRfVFhfRlJBTUVfTEVOIGlzIGRvbmUgIVxuIikpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUkFDRkdfQ01EX0FURV9TRVRfVFhfRlJBTUVfQ09VTlQ6CisJCQl7CisJCQkJVVNIT1JUICAgIHZhbHVlID0gMDsKKwkJCQlVQ0hBUiAgICBzdHJbTEVOX09GX0FSR107CisKKwkJCQlOZGlzWmVyb01lbW9yeShzdHIsIExFTl9PRl9BUkcpOworCisJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSQUNGR19DTURfQVRFX1NFVF9UWF9GUkFNRV9DT1VOVFxuIikpOworCisJCQkJbWVtY3B5KChQVUNIQVIpJnZhbHVlLCAoUFVDSEFSKSYocFJhQ2ZnLT5zdGF0dXMpLCAyKTsKKwkJCQl2YWx1ZSA9IG50b2hzKHZhbHVlKTsKKyNpZmRlZiBSVDI4NjAKKwkJCQkvKiBUWF9GUkFNRV9DT1VOVCA9PSAwIG1lYW5zIHR4IGluZmluaXRlbHkgKi8KKwkJCQlpZiAodmFsdWUgPT0gMCkKKwkJCQl7CisJCQkJCS8qIFVzZSBUeENvdW50ID0gMHhGRkZGRkZGRiB0byBhcHByb3hpbWF0ZSB0aGUgaW5maW5pdHkuICovCisJCQkJCXBBZGFwdGVyLT5hdGUuVHhDb3VudCA9IDB4RkZGRkZGRkY7CisJCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9BVEVfVFhfQ09VTlRfUHJvYyAoVHhDb3VudCA9ICVkKVxuIiwgcEFkYXB0ZXItPmF0ZS5UeENvdW50KSk7CisJCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJhbGluazogU2V0X0FURV9UWF9DT1VOVF9Qcm9jIFN1Y2Nlc3NcbiIpKTsKKworCisJCQkJfQorCQkJCWVsc2UKKyNlbmRpZiAvLyBSVDI4NjAgLy8KKwkJCQl7CisJCQkJCXNwcmludGYoKFBDSEFSKXN0ciwgIiVkIiwgdmFsdWUpOworCQkJCQlTZXRfQVRFX1RYX0NPVU5UX1Byb2MocEFkYXB0ZXIsIHN0cik7CisJCQkJfQorCisJCQkJLy8gcHJlcGFyZSBmZWVkYmFjaworCQkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoMik7CisJCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKyAgICAgICAgICAgIAlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfQVRFX1NFVF9UWF9GUkFNRV9DT1VOVFxuIikpOworICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgCX0KKwkJCQllbHNlCisJCQkJeworICAgICAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSQUNGR19DTURfQVRFX1NFVF9UWF9GUkFNRV9DT1VOVCBpcyBkb25lICFcbiIpKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFJBQ0ZHX0NNRF9BVEVfU1RBUlRfUlhfRlJBTUU6CisJCQl7CisJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSQUNGR19DTURfUlhfU1RBUlRcbiIpKTsKKworCQkJCVNldF9BVEVfUHJvYyhwQWRhcHRlciwgIlJYRlJBTUUiKTsKKworCQkJCS8vIHByZXBhcmUgZmVlZGJhY2sKKwkJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDIpOworCQkJCXBSYUNmZy0+c3RhdHVzID0gaHRvbnMoMCk7CisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBSYUNmZy0+bWFnaWNfbm8pICsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF90eXBlKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX2lkKSArIHNpemVvZihwUmFDZmctPmxlbmd0aCkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworCisgICAgICAgICAgICAJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwUmFDZmcsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjb3B5X3RvX3VzZXIoKSBmYWlsIGluIGNhc2UgUkFDRkdfQ01EX1JYX1NUQVJUXG4iKSk7CisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICAJfQorCQkJCWVsc2UKKwkJCQl7CisgICAgICAgICAgICAgICAgCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJBQ0ZHX0NNRF9SWF9TVEFSVCBpcyBkb25lICFcbiIpKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCX0KKyAgICBBU1NFUlQocFJhQ2ZnICE9IE5VTEwpOworICAgIGlmIChwUmFDZmcgIT0gTlVMTCkKKyAgICB7CisgICAga2ZyZWUocFJhQ2ZnKTsKKyAgICB9CisJcmV0dXJuOworfQorCitWT0lEIEJ1YmJsZVNvcnQoSU5UMzIgbiwgSU5UMzIgYVtdKQoreworCUlOVDMyIGssIGosIHRlbXA7CisKKwlmb3IgKGsgPSBuLTE7ICBrPjA7ICBrLS0pCisJeworCQlmb3IgKGogPSAwOyBqPGs7IGorKykKKwkJeworCQkJaWYoYVtqXSA+IGFbaisxXSkKKwkJCXsKKwkJCQl0ZW1wID0gYVtqXTsKKwkJCQlhW2pdPWFbaisxXTsKKwkJCQlhW2orMV09dGVtcDsKKwkJCX0KKwkJfQorCX0KK30KKworVk9JRCBDYWxOb2lzZUxldmVsKFBSVE1QX0FEQVBURVIgcEFkLCBVQ0hBUiBjaGFubmVsLCBJTlQzMiBSU1NJWzNdWzEwXSkKK3sKKwlJTlQzMgkJUlNTSTAsIFJTU0kxLCBSU1NJMjsKKyAJQ0hBUgkJUnNzaTBPZmZzZXQsIFJzc2kxT2Zmc2V0LCBSc3NpMk9mZnNldDsKKwlVQ0hBUgkJQmJwUjUwUnNzaTAgPSAwLCBCYnBSNTFSc3NpMSA9IDAsIEJicFI1MlJzc2kyID0gMDsKKwlVQ0hBUgkJT3JnX0JCUDY2dmFsdWUgPSAwLCBPcmdfQkJQNjl2YWx1ZSA9IDAsIE9yZ19CQlA3MHZhbHVlID0gMCwgZGF0YSA9IDA7CisJVVNIT1JUCQlMTkFfR2FpbiA9IDA7CisJSU5UMzIgICAgICAgaiA9IDA7CisJVUNIQVIJCU9yZ19DaGFubmVsID0gcEFkLT5hdGUuQ2hhbm5lbDsKKwlVU0hPUlQJICAgIEdhaW5WYWx1ZSA9IDAsIE9mZnNldFZhbHVlID0gMDsKKworCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I2NiwgJk9yZ19CQlA2NnZhbHVlKTsKKwlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNjksICZPcmdfQkJQNjl2YWx1ZSk7CisJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjcwLCAmT3JnX0JCUDcwdmFsdWUpOworCisJLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJLy8gUmVhZCB0aGUgdmFsdWUgb2YgTE5BIGdhaW4gYW5kIFJzc2kgb2Zmc2V0CisJLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fTE5BX09GRlNFVCwgR2FpblZhbHVlKTsKKworCS8vIGZvciBOb2lzZSBMZXZlbAorCWlmIChjaGFubmVsIDw9IDE0KQorCXsKKwkJTE5BX0dhaW4gPSBHYWluVmFsdWUgJiAweDAwRkY7CisKKwkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fUlNTSV9CR19PRkZTRVQsIE9mZnNldFZhbHVlKTsKKwkJUnNzaTBPZmZzZXQgPSBPZmZzZXRWYWx1ZSAmIDB4MDBGRjsKKwkJUnNzaTFPZmZzZXQgPSAoT2Zmc2V0VmFsdWUgJiAweEZGMDApID4+IDg7CisJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgKEVFUFJPTV9SU1NJX0JHX09GRlNFVCArIDIpLyogMHg0OCAqLywgT2Zmc2V0VmFsdWUpOworCQlSc3NpMk9mZnNldCA9IE9mZnNldFZhbHVlICYgMHgwMEZGOworCX0KKwllbHNlCisJeworCQlMTkFfR2FpbiA9IChHYWluVmFsdWUgJiAweEZGMDApID4+IDg7CisKKwkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fUlNTSV9BX09GRlNFVCwgT2Zmc2V0VmFsdWUpOworCQlSc3NpME9mZnNldCA9IE9mZnNldFZhbHVlICYgMHgwMEZGOworCQlSc3NpMU9mZnNldCA9IChPZmZzZXRWYWx1ZSAmIDB4RkYwMCkgPj4gODsKKwkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCAoRUVQUk9NX1JTU0lfQV9PRkZTRVQgKyAyKS8qIDB4NEMgKi8sIE9mZnNldFZhbHVlKTsKKwkJUnNzaTJPZmZzZXQgPSBPZmZzZXRWYWx1ZSAmIDB4MDBGRjsKKwl9CisJLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJeworCQlwQWQtPmF0ZS5DaGFubmVsID0gY2hhbm5lbDsKKwkJQVRFQXNpY1N3aXRjaENoYW5uZWwocEFkKTsKKwkJbWRlbGF5KDUpOworCisJCWRhdGEgPSAweDEwOworCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY2LCBkYXRhKTsKKwkJZGF0YSA9IDB4NDA7CisJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjksIGRhdGEpOworCQlkYXRhID0gMHg0MDsKKwkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I3MCwgZGF0YSk7CisJCW1kZWxheSg1KTsKKworCQkvLyBTdGFydCBSeAorCQlwQWQtPmF0ZS5iUUFSeFN0YXJ0ID0gVFJVRTsKKwkJU2V0X0FURV9Qcm9jKHBBZCwgIlJYRlJBTUUiKTsKKworCQltZGVsYXkoNSk7CisKKwkJZm9yIChqID0gMDsgaiA8IDEwOyBqKyspCisJCXsKKwkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I1MCwgJkJicFI1MFJzc2kwKTsKKwkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I1MSwgJkJicFI1MVJzc2kxKTsKKwkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I1MiwgJkJicFI1MlJzc2kyKTsKKworCQkJbWRlbGF5KDEwKTsKKworCQkJLy8gQ2FsY3VsYXRlIFJTU0kgMAorCQkJaWYgKEJicFI1MFJzc2kwID09IDApCisJCQl7CisJCQkJUlNTSTAgPSAtMTAwOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCVJTU0kwID0gKElOVDMyKSgtMTIgLSBCYnBSNTBSc3NpMCAtIExOQV9HYWluIC0gUnNzaTBPZmZzZXQpOworCQkJfQorCQkJUlNTSVswXVtqXSA9IFJTU0kwOworCisJCQlpZiAoIHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPj0gMiApIC8vIDJSCisJCQl7CisJCQkJLy8gQ2FsY3VsYXRlIFJTU0kgMQorCQkJCWlmIChCYnBSNTFSc3NpMSA9PSAwKQorCQkJCXsKKwkJCQkJUlNTSTEgPSAtMTAwOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlSU1NJMSA9IChJTlQzMikoLTEyIC0gQmJwUjUxUnNzaTEgLSBMTkFfR2FpbiAtIFJzc2kxT2Zmc2V0KTsKKwkJCQl9CisJCQkJUlNTSVsxXVtqXSA9IFJTU0kxOworCQkJfQorCisJCQlpZiAoIHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPj0gMyApIC8vIDNSCisJCQl7CisJCQkJLy8gQ2FsY3VsYXRlIFJTU0kgMgorCQkJCWlmIChCYnBSNTJSc3NpMiA9PSAwKQorCQkJCQlSU1NJMiA9IC0xMDA7CisJCQkJZWxzZQorCQkJCQlSU1NJMiA9IChJTlQzMikoLTEyIC0gQmJwUjUyUnNzaTIgLSBMTkFfR2FpbiAtIFJzc2kyT2Zmc2V0KTsKKworCQkJCVJTU0lbMl1bal0gPSBSU1NJMjsKKwkJCX0KKwkJfQorCisJCS8vIFN0b3AgUngKKwkJU2V0X0FURV9Qcm9jKHBBZCwgIlJYU1RPUCIpOworCisJCW1kZWxheSg1KTsKKworI2lmIDAvLyBEZWJ1ZyBNZXNzYWdlLi4uLi4uLi4uLi4uLi4uLgorCQlhdGVfcHJpbnQoIlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuIik7CisJCWF0ZV9wcmludCgiTm9pc2UgTGV2ZWw6IENoYW5uZWwgJWRcbiIsIGNoYW5uZWwpOworCQlhdGVfcHJpbnQoIlJTU0kwID0gJWQsICVkLCAlZCwgJWQsICVkLCAlZCwgJWQsICVkLCAlZCwgJWRcbiIsCisJCQlSU1NJWzBdWzBdLCBSU1NJWzBdWzFdLCBSU1NJWzBdWzJdLAorCQkJUlNTSVswXVszXSwgUlNTSVswXVs0XSwgUlNTSVswXVs1XSwKKwkJCVJTU0lbMF1bNl0sIFJTU0lbMF1bN10sIFJTU0lbMF1bOF0sCisJCQlSU1NJWzBdWzldKTsKKwkJaWYgKCBwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID49IDIgKSAvLyAyUgorCQl7CisJCQlhdGVfcHJpbnQoIlJTU0kxID0gJWQsICVkLCAlZCwgJWQsICVkLCAlZCwgJWQsICVkLCAlZCwgJWRcbiIsCisJCQkJUlNTSVsxXVswXSwgUlNTSVsxXVsxXSwgUlNTSVsxXVsyXSwKKwkJCQlSU1NJWzFdWzNdLCBSU1NJWzFdWzRdLCBSU1NJWzFdWzVdLAorCQkJCVJTU0lbMV1bNl0sIFJTU0lbMV1bN10sIFJTU0lbMV1bOF0sCisJCQkJUlNTSVsxXVs5XSk7CisJCX0KKwkJaWYgKCBwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID49IDMgKSAvLyAzUgorCQl7CisJCQlhdGVfcHJpbnQoIlJTU0kyID0gJWQsICVkLCAlZCwgJWQsICVkLCAlZCwgJWQsICVkLCAlZCwgJWRcbiIsCisJCQkJUlNTSVsyXVswXSwgUlNTSVsyXVsxXSwgUlNTSVsyXVsyXSwKKwkJCQlSU1NJWzJdWzNdLCBSU1NJWzJdWzRdLCBSU1NJWzJdWzVdLAorCQkJCVJTU0lbMl1bNl0sIFJTU0lbMl1bN10sIFJTU0lbMl1bOF0sCisJCQkJUlNTSVsyXVs5XSk7CisJCX0KKyNlbmRpZiAvLyAwIC8vCisJCUJ1YmJsZVNvcnQoMTAsIFJTU0lbMF0pOwkvLyAxUgorCisJCWlmICggcEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA+PSAyICkgLy8gMlIKKwkJeworCQkJQnViYmxlU29ydCgxMCwgUlNTSVsxXSk7CisJCX0KKworCQlpZiAoIHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPj0gMyApIC8vIDNSCisJCXsKKwkJCUJ1YmJsZVNvcnQoMTAsIFJTU0lbMl0pOworCQl9CisKKyNpZiAwLy8gRGVidWcgTWVzc2FnZS4uLi4uLi4uLi4uLi4uLi4KKwkJYXRlX3ByaW50KCJcbkFmdGVyIFNvcnRpbmcuLi4uQ2hhbm5lbCAlZFxuIiwgY2hhbm5lbCk7CisJCWF0ZV9wcmludCgiUlNTSTAgPSAlZCwgJWQsICVkLCAlZCwgJWQsICVkLCAlZCwgJWQsICVkLCAlZFxuIiwKKwkJCVJTU0lbMF1bMF0sIFJTU0lbMF1bMV0sIFJTU0lbMF1bMl0sCisJCQlSU1NJWzBdWzNdLCBSU1NJWzBdWzRdLCBSU1NJWzBdWzVdLAorCQkJUlNTSVswXVs2XSwgUlNTSVswXVs3XSwgUlNTSVswXVs4XSwKKwkJCVJTU0lbMF1bOV0pOworCQlpZiAoIHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPj0gMiApIC8vIDJSCisJCXsKKwkJCWF0ZV9wcmludCgiUlNTSTEgPSAlZCwgJWQsICVkLCAlZCwgJWQsICVkLCAlZCwgJWQsICVkLCAlZFxuIiwKKwkJCQlSU1NJWzFdWzBdLCBSU1NJWzFdWzFdLCBSU1NJWzFdWzJdLAorCQkJCVJTU0lbMV1bM10sIFJTU0lbMV1bNF0sIFJTU0lbMV1bNV0sCisJCQkJUlNTSVsxXVs2XSwgUlNTSVsxXVs3XSwgUlNTSVsxXVs4XSwKKwkJCQlSU1NJWzFdWzldKTsKKwkJfQorCQlpZiAoIHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPj0gMyApIC8vIDNSCisJCXsKKwkJCWF0ZV9wcmludCgiUlNTSTIgPSAlZCwgJWQsICVkLCAlZCwgJWQsICVkLCAlZCwgJWQsICVkLCAlZFxuIiwKKwkJCQlSU1NJWzJdWzBdLCBSU1NJWzJdWzFdLCBSU1NJWzJdWzJdLAorCQkJCVJTU0lbMl1bM10sIFJTU0lbMl1bNF0sIFJTU0lbMl1bNV0sCisJCQkJUlNTSVsyXVs2XSwgUlNTSVsyXVs3XSwgUlNTSVsyXVs4XSwKKwkJCQlSU1NJWzJdWzldKTsKKwkJfQorCQlhdGVfcHJpbnQoIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiIpOworI2VuZGlmIC8vIDAgLy8KKwl9CisKKwlwQWQtPmF0ZS5DaGFubmVsID0gT3JnX0NoYW5uZWw7CisJQVRFQXNpY1N3aXRjaENoYW5uZWwocEFkKTsKKworCS8vIFJlc3RvcmUgb3JpZ2luYWwgdmFsdWUKKyAgICBBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY2LCBPcmdfQkJQNjZ2YWx1ZSk7CisgICAgQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2OSwgT3JnX0JCUDY5dmFsdWUpOworICAgIEFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNzAsIE9yZ19CQlA3MHZhbHVlKTsKKworCXJldHVybjsKK30KKworQk9PTEVBTiBTeW5jVHhSeENvbmZpZyhQUlRNUF9BREFQVEVSIHBBZCwgVVNIT1JUIG9mZnNldCwgVUNIQVIgdmFsdWUpCit7CisJVUNIQVIgdG1wID0gMCwgYmJwX2RhdGEgPSAwOworCisJaWYgKEFURV9PTihwQWQpKQorCXsKKwkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBvZmZzZXQsICZiYnBfZGF0YSk7CisJfQorCWVsc2UKKwl7CisJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIG9mZnNldCwgJmJicF9kYXRhKTsKKwl9CisKKwkvKiBjb25maXJtIGFnYWluICovCisJQVNTRVJUKGJicF9kYXRhID09IHZhbHVlKTsKKworCXN3aXRjaChvZmZzZXQpCisJeworCQljYXNlIEJCUF9SMToKKwkJCS8qIE5lZWQgdG8gc3luYy4gdHggY29uZmlndXJhdGlvbiB3aXRoIGxlZ2FjeSBBVEUuICovCisJCQl0bXAgPSAoYmJwX2RhdGEgJiAoKDEgPDwgNCkgfCAoMSA8PCAzKSkvKiAweDE4ICovKSA+PiAzOworCQkgICAgc3dpdGNoKHRtcCkKKwkJICAgIHsKKwkJCQkvKiBUaGUgQkJQIFIxIGJpdFs0OjNdID0gMiA6OiBCb3RoIERBQ3Mgd2lsbCBiZSB1c2VkIGJ5IFFBLiAqLworCQkgICAgICAgIGNhc2UgMjoKKwkJCQkJLyogQWxsICovCisJCQkJCXBBZC0+YXRlLlR4QW50ZW5uYVNlbCA9IDA7CisJCSAgICAgICAgICAgIGJyZWFrOworCQkJCS8qIFRoZSBCQlAgUjEgYml0WzQ6M10gPSAwIDo6IERBQyAwIHdpbGwgYmUgdXNlZCBieSBRQS4gKi8KKwkJICAgICAgICBjYXNlIDA6CisJCQkJCS8qIEFudGVubmEgb25lICovCisJCQkJCXBBZC0+YXRlLlR4QW50ZW5uYVNlbCA9IDE7CisJCSAgICAgICAgICAgIGJyZWFrOworCQkJCS8qIFRoZSBCQlAgUjEgYml0WzQ6M10gPSAxIDo6IERBQyAxIHdpbGwgYmUgdXNlZCBieSBRQS4gKi8KKwkJICAgICAgICBjYXNlIDE6CisJCQkJCS8qIEFudGVubmEgdHdvICovCisJCQkJCXBBZC0+YXRlLlR4QW50ZW5uYVNlbCA9IDI7CisJCSAgICAgICAgICAgIGJyZWFrOworCQkgICAgICAgIGRlZmF1bHQ6CisJCSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzIC0tIFN0aC4gd3JvbmchICA6IHJldHVybiBGQUxTRTsgXG4iLCBfX2Z1bmNfXykpOworCQkgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisJCSAgICB9CisJCQlicmVhazsvKiBjYXNlIEJCUF9SMSAqLworCisJCWNhc2UgQkJQX1IzOgorCQkJLyogTmVlZCB0byBzeW5jLiByeCBjb25maWd1cmF0aW9uIHdpdGggbGVnYWN5IEFURS4gKi8KKwkJCXRtcCA9IChiYnBfZGF0YSAmICgoMSA8PCAxKSB8ICgxIDw8IDApKS8qIDB4MDMgKi8pOworCQkgICAgc3dpdGNoKHRtcCkKKwkJICAgIHsKKwkJCQkvKiBUaGUgQkJQIFIzIGJpdFsxOjBdID0gMyA6OiBBbGwgQURDcyB3aWxsIGJlIHVzZWQgYnkgUUEuICovCisJCSAgICAgICAgY2FzZSAzOgorCQkJCQkvKiBBbGwgKi8KKwkJCQkJcEFkLT5hdGUuUnhBbnRlbm5hU2VsID0gMDsKKwkJICAgICAgICAgICAgYnJlYWs7CisJCQkJLyogVGhlIEJCUCBSMyBiaXRbMTowXSA9IDAgOjogQURDIDAgd2lsbCBiZSB1c2VkIGJ5IFFBLCAqLworCQkJCS8qIHVubGVzcyB0aGUgQkJQIFIzIGJpdFs0OjNdID0gMiAqLworCQkgICAgICAgIGNhc2UgMDoKKwkJCQkJLyogQW50ZW5uYSBvbmUgKi8KKwkJCQkJcEFkLT5hdGUuUnhBbnRlbm5hU2VsID0gMTsKKwkJCQkJdG1wID0gKChiYnBfZGF0YSAmICgoMSA8PCA0KSB8ICgxIDw8IDMpKS8qIDB4MDMgKi8pID4+IDMpOworCQkJCQlpZiAodG1wID09IDIpLy8gM1IKKwkJCQkJeworCQkJCQkJLyogRGVmYXVsdCA6IEFsbCBBRENzIHdpbGwgYmUgdXNlZCBieSBRQSAqLworCQkJCQkJcEFkLT5hdGUuUnhBbnRlbm5hU2VsID0gMDsKKwkJCQkJfQorCQkgICAgICAgICAgICBicmVhazsKKwkJCQkvKiBUaGUgQkJQIFIzIGJpdFsxOjBdID0gMSA6OiBBREMgMSB3aWxsIGJlIHVzZWQgYnkgUUEuICovCisJCSAgICAgICAgY2FzZSAxOgorCQkJCQkvKiBBbnRlbm5hIHR3byAqLworCQkJCQlwQWQtPmF0ZS5SeEFudGVubmFTZWwgPSAyOworCQkgICAgICAgICAgICBicmVhazsKKwkJCQkvKiBUaGUgQkJQIFIzIGJpdFsxOjBdID0gMiA6OiBBREMgMiB3aWxsIGJlIHVzZWQgYnkgUUEuICovCisJCSAgICAgICAgY2FzZSAyOgorCQkJCQkvKiBBbnRlbm5hIHRocmVlICovCisJCQkJCXBBZC0+YXRlLlJ4QW50ZW5uYVNlbCA9IDM7CisJCSAgICAgICAgICAgIGJyZWFrOworCQkgICAgICAgIGRlZmF1bHQ6CisJCSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzIC0tIEltcG9zc2libGUhICA6IHJldHVybiBGQUxTRTsgXG4iLCBfX2Z1bmNfXykpOworCQkgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisJCSAgICB9CisJCQlicmVhazsvKiBjYXNlIEJCUF9SMyAqLworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlcyAtLSBTdGguIHdyb25nISAgOiByZXR1cm4gRkFMU0U7IFxuIiwgX19mdW5jX18pKTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKworCX0KKwlyZXR1cm4gVFJVRTsKK30KKworc3RhdGljIFZPSUQgbWVtY3B5X2V4bChQUlRNUF9BREFQVEVSIHBBZCwgVUNIQVIgKmRzdCwgVUNIQVIgKnNyYywgVUxPTkcgbGVuKQoreworCVVMT05HIGksIFZhbHVlID0gMDsKKwlVTE9ORyAqcERzdCwgKnBTcmM7CisJVUNIQVIgKnA4OworCisJcDggPSBzcmM7CisJcERzdCA9IChVTE9ORyAqKSBkc3Q7CisJcFNyYyA9IChVTE9ORyAqKSBzcmM7CisKKwlmb3IgKGkgPSAwIDsgaSA8IChsZW4vNCk7IGkrKykKKwl7CisJCS8qIEZvciBhbGlnbm1lbnQgaXNzdWUsIHdlIG5lZWQgYSB2YXJpYWJsZSAiVmFsdWUiLiAqLworCQltZW1tb3ZlKCZWYWx1ZSwgcFNyYywgNCk7CisJCVZhbHVlID0gaHRvbmwoVmFsdWUpOworCQltZW1tb3ZlKHBEc3QsICZWYWx1ZSwgNCk7CisJCXBEc3QrKzsKKwkJcFNyYysrOworCX0KKwlpZiAoKGxlbiAlIDQpICE9IDApCisJeworCQkvKiB3aXNoIHRoYXQgaXQgd2lsbCBuZXZlciByZWFjaCBoZXJlICovCisJCW1lbW1vdmUoJlZhbHVlLCBwU3JjLCAobGVuICUgNCkpOworCQlWYWx1ZSA9IGh0b25sKFZhbHVlKTsKKwkJbWVtbW92ZShwRHN0LCAmVmFsdWUsIChsZW4gJSA0KSk7CisJfQorfQorCitzdGF0aWMgVk9JRCBtZW1jcHlfZXhzKFBSVE1QX0FEQVBURVIgcEFkLCBVQ0hBUiAqZHN0LCBVQ0hBUiAqc3JjLCBVTE9ORyBsZW4pCit7CisJVUxPTkcgaTsKKwlVQ0hBUiAqcERzdCwgKnBTcmM7CisKKwlwRHN0ID0gZHN0OworCXBTcmMgPSBzcmM7CisKKwlmb3IgKGkgPSAwOyBpIDwgKGxlbi8yKTsgaSsrKQorCXsKKwkJbWVtbW92ZShwRHN0LCBwU3JjLCAyKTsKKwkJKigoVVNIT1JUICopcERzdCkgPSBodG9ucygqKChVU0hPUlQgKilwRHN0KSk7CisJCXBEc3QrPTI7CisJCXBTcmMrPTI7CisJfQorCisJaWYgKChsZW4gJSAyKSAhPSAwKQorCXsKKwkJbWVtbW92ZShwRHN0LCBwU3JjLCAxKTsKKwl9Cit9CisKK3N0YXRpYyBWT0lEIFJUTVBfSU9fUkVBRF9CVUxLKFBSVE1QX0FEQVBURVIgcEFkLCBVQ0hBUiAqZHN0LCBVQ0hBUiAqc3JjLCBVSU5UMzIgbGVuKQoreworCVVJTlQzMiBpLCBWYWx1ZTsKKwlVSU5UMzIgKnBEc3QsICpwU3JjOworCisJcERzdCA9IChVSU5UMzIgKikgZHN0OworCXBTcmMgPSAoVUlOVDMyICopIHNyYzsKKworCWZvciAoaSA9IDAgOyBpIDwgKGxlbi80KTsgaSsrKQorCXsKKwkJUlRNUF9JT19SRUFEMzIocEFkLCAoVUxPTkcpcFNyYywgJlZhbHVlKTsKKwkJVmFsdWUgPSBodG9ubChWYWx1ZSk7CisJCW1lbW1vdmUocERzdCwgJlZhbHVlLCA0KTsKKwkJcERzdCsrOworCQlwU3JjKys7CisJfQorCXJldHVybjsKK30KKworLy8gVE9ETzoKKyNpZiAwCisvKiBUaGVzZSB3b3JrIG9ubHkgd2hlbiBSQUxJTktfQVRFIGlzIGRlZmluZWQgKi8KK0lOVCBTZXRfVHhTdGFydF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVTE9ORyB2YWx1ZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisJVUNIQVIgYnVmZmVyWzI2XSA9IHsweDg4LCAweDAyLCAweDJjLCAweDAwLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweDAwLCAweDExLCAweDIyLCAweDMzLCAweDQ0LCAweDU1LCAweDAwLCAweDU1LCAweDQ0LCAweDMzLCAweDIyLCAweDExLCAweGMwLCAweDIyLCAweDAwLCAweDAwfTsKKwlQT1NfQ09PS0lFIHBPYmo7CisKKwlpZiAocEFkLT5hdGUuVHhTdGF0dXMgIT0gMCkKKwkJcmV0dXJuIEZBTFNFOworCisJcEFkLT5hdGUuVHhJbmZvID0gMHgwNDAwMDAwMDsKKwliemVybygmcEFkLT5hdGUuVHhXSSwgc2l6ZW9mKFRYV0lfU1RSVUMpKTsKKwlwQWQtPmF0ZS5UeFdJLlBIWU1PREUgPSAwOy8vIE1PREVfQ0NLCisJcEFkLT5hdGUuVHhXSS5NUERVdG90YWxCeXRlQ291bnQgPSAxMjI2OworCXBBZC0+YXRlLlR4V0kuTUNTID0gMzsKKwkvL3BBZC0+YXRlLk1vZGUgPSBBVEVfU1RBUlQ7CisJcEFkLT5hdGUuTW9kZSB8PSBBVEVfVFhGUkFNRTsKKwlwQWQtPmF0ZS5UeENvdW50ID0gdmFsdWU7CisJcEFkLT5hdGUuUUlEID0gMDsKKwlwQWQtPmF0ZS5ITGVuID0gMjY7CisJcEFkLT5hdGUuUExlbiA9IDA7CisJcEFkLT5hdGUuRExlbiA9IDEyMDA7CisJbWVtY3B5KHBBZC0+YXRlLkhlYWRlciwgYnVmZmVyLCAyNik7CisJcEFkLT5hdGUuYlFBVHhTdGFydCA9IFRSVUU7CisJLy9wT2JqID0gKFBPU19DT09LSUUpIHBBZC0+T1NfQ29va2llOworCS8vdGFza2xldF9oaV9zY2hlZHVsZSgmcE9iai0+QXRlVHhUYXNrKTsKKwlyZXR1cm4gVFJVRTsKK30KKyNlbmRpZiAgLyogZW5kIG9mICNpZiAwICovCisKK0lOVCBTZXRfVHhTdG9wX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiU2V0X1R4U3RvcF9Qcm9jXG4iKSk7CisKKwlpZiAoU2V0X0FURV9Qcm9jKHBBZCwgIlRYU1RPUCIpKQorCXsKKwlyZXR1cm4gVFJVRTsKK30KKwllbHNlCisJeworCQlyZXR1cm4gRkFMU0U7CisJfQorfQorCitJTlQgU2V0X1J4U3RvcF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlNldF9SeFN0b3BfUHJvY1xuIikpOworCisJaWYgKFNldF9BVEVfUHJvYyhwQWQsICJSWFNUT1AiKSkKKwl7CisJcmV0dXJuIFRSVUU7Cit9CisJZWxzZQorCXsKKwkJcmV0dXJuIEZBTFNFOworCX0KK30KKworI2lmIDAKK0lOVCBTZXRfRUVXcml0ZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVU0hPUlQgb2Zmc2V0ID0gMCwgdmFsdWU7CisJUFVDSEFSIHAyID0gYXJnOworCisJd2hpbGUoKCpwMiAhPSAnOicpICYmICgqcDIgIT0gJ1wwJykpCisJeworCQlwMisrOworCX0KKworCWlmICgqcDIgPT0gJzonKQorCXsKKwkJQTJIZXgob2Zmc2V0LCBhcmcpOworCQlBMkhleCh2YWx1ZSwgcDIrIDEpOworCX0KKwllbHNlCisJeworCQlBMkhleCh2YWx1ZSwgYXJnKTsKKwl9CisKKwlpZiAob2Zmc2V0ID49IEVFUFJPTV9TSVpFKQorCXsKKwkJYXRlX3ByaW50KCJPZmZzZXQgY2FuIG5vdCBleGNlZWQgRUVQUk9NX1NJWkUoID09IDB4JTA0eClcbiIsIEVFUFJPTV9TSVpFKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCVJUTVBfRUVQUk9NX1dSSVRFMTYocEFkLCBvZmZzZXQsIHZhbHVlKTsKKworCXJldHVybiBUUlVFOworfQorCitJTlQgU2V0X0JCUFJlYWRfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJVUNIQVIgdmFsdWUgPSAwLCBvZmZzZXQ7CisKKwlBMkhleChvZmZzZXQsIGFyZyk7CisKKwlpZiAoQVRFX09OKHBBZCkpCisJeworCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIG9mZnNldCwgICZ2YWx1ZSk7CisJfQorCWVsc2UKKwl7CisJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIG9mZnNldCwgICZ2YWx1ZSk7CisJfQorCisJYXRlX3ByaW50KCIleFxuIiwgdmFsdWUpOworCisJcmV0dXJuIFRSVUU7Cit9CisKKworSU5UIFNldF9CQlBXcml0ZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVU0hPUlQgb2Zmc2V0ID0gMDsKKwlQVUNIQVIgcDIgPSBhcmc7CisJVUNIQVIgdmFsdWU7CisKKwl3aGlsZSgoKnAyICE9ICc6JykgJiYgKCpwMiAhPSAnXDAnKSkKKwl7CisJCXAyKys7CisJfQorCisJaWYgKCpwMiA9PSAnOicpCisJeworCQlBMkhleChvZmZzZXQsIGFyZyk7CisJCUEySGV4KHZhbHVlLCBwMisgMSk7CisJfQorCWVsc2UKKwl7CisJCUEySGV4KHZhbHVlLCBhcmcpOworCX0KKworCWlmIChBVEVfT04ocEFkKSkKKwl7CisJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIG9mZnNldCwgIHZhbHVlKTsKKwl9CisJZWxzZQorCXsKKwkJUlROUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIG9mZnNldCwgIHZhbHVlKTsKKwl9CisKKwlyZXR1cm4gVFJVRTsKK30KKworSU5UIFNldF9SRldyaXRlX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCVBVQ0hBUiBwMiwgcDMsIHA0OworCVVMT05HIFIxLCBSMiwgUjMsIFI0OworCisJcDIgPSBhcmc7CisKKwl3aGlsZSgoKnAyICE9ICc6JykgJiYgKCpwMiAhPSAnXDAnKSkKKwl7CisJCXAyKys7CisJfQorCisJaWYgKCpwMiAhPSAnOicpCisJCXJldHVybiBGQUxTRTsKKworCXAzID0gcDIgKyAxOworCisJd2hpbGUoKCpwMyAhPSAnOicpICYmICgqcDMgIT0gJ1wwJykpCisJeworCQlwMysrOworCX0KKworCWlmICgqcDMgIT0gJzonKQorCQlyZXR1cm4gRkFMU0U7CisKKwlwNCA9IHAzICsgMTsKKworCXdoaWxlKCgqcDQgIT0gJzonKSAmJiAoKnA0ICE9ICdcMCcpKQorCXsKKwkJcDQrKzsKKwl9CisKKwlpZiAoKnA0ICE9ICc6JykKKwkJcmV0dXJuIEZBTFNFOworCisKKwlBMkhleChSMSwgYXJnKTsKKwlBMkhleChSMiwgcDIgKyAxKTsKKwlBMkhleChSMywgcDMgKyAxKTsKKwlBMkhleChSNCwgcDQgKyAxKTsKKworCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIFIxKTsKKwlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCBSMik7CisJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgUjMpOworCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIFI0KTsKKworCXJldHVybiBUUlVFOworfQorI2VuZGlmICAvLyBlbmQgb2YgI2lmIDAgLy8KKyNlbmRpZgkvLyBSQUxJTktfMjh4eF9RQSAvLworCisjZW5kaWYJLy8gUkFMSU5LX0FURSAvLworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0X2F0ZS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydF9hdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OGFhNzBkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydF9hdGUuaApAQCAtMCwwICsxLDM1MyBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworI2lmbmRlZiBfX0FURV9IX18KKyNkZWZpbmUgX19BVEVfSF9fCisKKyNpZm5kZWYgVUNPUworI2RlZmluZSBhdGVfcHJpbnQgcHJpbnRrCisjZGVmaW5lIEFURURCR1BSSU5UIERCR1BSSU5UCisjaWZkZWYgUlQyODYwCisjZGVmaW5lIEVFUFJPTV9TSVpFCQkJCQkJCQkweDIwMAorI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorI2RlZmluZSBFRVBST01fQklOX0ZJTEVfTkFNRSAgIi9ldGMvV2lyZWxlc3MvUlQyODYwU1RBL2UycC5iaW4iCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisjZW5kaWYgLy8gUlQyODYwIC8vCisKKyNlbHNlIC8vICFVQ09TIC8vCisjZGVmaW5lIGZBVEVfTE9BRF9FRVBST00JCQkJCQkweDBDNDMKKyNpZmRlZiBDT05GSUdfUFJJTlRLCitleHRlcm4gSU5UIENvbnNvbGVSZXNwb25zZShJTiBQVUNIQVIgYnVmZik7CitleHRlcm4gaW50ICgqcmVtb3RlX2Rpc3BsYXkpKGNoYXIgKik7CitleHRlcm4gdm9pZCBwdXRzIChjb25zdCBjaGFyICpzKTsKKworLyogc3BlY2lmaWNseSBkZWZpbmVkIHRvIHJlZGlyZWN0IGFuZCBzaG93IGF0ZS1yZWxhdGVkIG1lc3NhZ2VzIHRvIGhvc3QuICovCisvKiBUcnkgdG8gZGVmaW5lIGF0ZV9wcmludCBhcyBhIG1hY3JvLiAqLworI2RlZmluZSBhdGVfcHJpbnQoZm10LCBhcmdzLi4uKSAgICAgICAgICAgICAgICAgXAorZG97ICAgaW50ICgqb3JnX3JlbW90ZV9kaXNwbGF5KShjaGFyICopID0gTlVMTDsgICBcCisJb3JnX3JlbW90ZV9kaXNwbGF5ID0gcmVtb3RlX2Rpc3BsYXk7XAorCS8qIFNhdmUgb3JpZ2luYWwgInJlbW90ZV9kaXNwbGF5IiAqL1wKKwlyZW1vdGVfZGlzcGxheSA9IChpbnQgKCopKGNoYXIgKikpQ29uc29sZVJlc3BvbnNlOyAgICAgICAgICAgXAorCXByaW50ayhmbXQsICMjIGFyZ3MpOyAgICAgICAgICAgICAgICAgICAgICAgXAorCS8qIFJlc3RvcmUgdGhlIHJlbW90ZV9kaXNwbGF5IGZ1bmN0aW9uIHBvaW50ZXIgKi8gICAgICAgIFwKKwlyZW1vdGVfZGlzcGxheSA9IG9yZ19yZW1vdGVfZGlzcGxheTsgfXdoaWxlKDApCisKKyNkZWZpbmUgQVRFREJHUFJJTlQoTGV2ZWwsIEZtdCkgICAgCVwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoKExldmVsKSA8PSBSVERlYnVnTGV2ZWwpICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBhdGVfcHJpbnQgRm10OwkJCQkJXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorI2VuZGlmIC8vIENPTkZJR19QUklOVEsgLy8KKyNlbmRpZiAvLyAhVUNPUyAvLworCisjZGVmaW5lIEFURV9PTihfcCkgICAgICAgICAgICAgICgoKF9wKS0+YXRlLk1vZGUpICE9IEFURV9TVE9QKQorCisvKiBSVDI4ODBfaU5JQyB3aWxsIGRlZmluZSAiUlQyODYwIi4gKi8KKyNpZmRlZiBSVDI4NjAKKyNkZWZpbmUgQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQoX0EsIF9JLCBfcFYpICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBCQlBfQ1NSX0NGR19TVFJVQyAgQmJwQ3NyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCAgICAgICAgICAgICBpLCBrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yIChpPTA7IGk8TUFYX0JVU1lfQ09VTlQ7IGkrKykgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBSVE1QX0lPX1JFQUQzMihfQSwgQkJQX0NTUl9DRkcsICZCYnBDc3Iud29yZCk7ICAgICBcCisgICAgICAgIGlmIChCYnBDc3IuZmllbGQuQnVzeSA9PSBCVVNZKSAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgY29udGludWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQmJwQ3NyLndvcmQgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBCYnBDc3IuZmllbGQuZlJlYWQgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEJicENzci5maWVsZC5CQlBfUldfTU9ERSA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQmJwQ3NyLmZpZWxkLkJ1c3kgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBCYnBDc3IuZmllbGQuUmVnTnVtID0gX0k7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFJUTVBfSU9fV1JJVEUzMihfQSwgQkJQX0NTUl9DRkcsIEJicENzci53b3JkKTsgICAgIFwKKyAgICAgICAgZm9yIChrPTA7IGs8TUFYX0JVU1lfQ09VTlQ7IGsrKykgICAgICAgICAgICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBSVE1QX0lPX1JFQUQzMihfQSwgQkJQX0NTUl9DRkcsICZCYnBDc3Iud29yZCk7IFwKKyAgICAgICAgICAgIGlmIChCYnBDc3IuZmllbGQuQnVzeSA9PSBJRExFKSAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKChCYnBDc3IuZmllbGQuQnVzeSA9PSBJRExFKSAmJiAgICAgICAgICAgICAgXAorICAgICAgICAgICAgKEJicENzci5maWVsZC5SZWdOdW0gPT0gX0kpKSAgICAgICAgICAgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICooX3BWKSA9IChVQ0hBUilCYnBDc3IuZmllbGQuVmFsdWU7ICAgICAgICAgXAorICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChCYnBDc3IuZmllbGQuQnVzeSA9PSBCVVNZKSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiQkJQIHJlYWQgUiVkIGZhaWxcbiIsIF9JKSk7ICAgICAgXAorICAgICAgICAqKF9wVikgPSAoX0EpLT5CYnBXcml0ZUxhdGNoW19JXTsgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI2RlZmluZSBBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQoX0EsIF9JLCBfVikgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEJCUF9DU1JfQ0ZHX1NUUlVDICBCYnBDc3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50ICAgICAgICAgICAgIEJ1c3lDbnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IgKEJ1c3lDbnQ9MDsgQnVzeUNudDxNQVhfQlVTWV9DT1VOVDsgQnVzeUNudCsrKSAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFJUTVBfSU9fUkVBRDMyKF9BLCBCQlBfQ1NSX0NGRywgJkJicENzci53b3JkKTsgICAgIFwKKyAgICAgICAgaWYgKEJicENzci5maWVsZC5CdXN5ID09IEJVU1kpICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgY29udGludWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEJicENzci53b3JkID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQmJwQ3NyLmZpZWxkLmZSZWFkID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBCYnBDc3IuZmllbGQuQkJQX1JXX01PREUgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEJicENzci5maWVsZC5CdXN5ID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQmJwQ3NyLmZpZWxkLlZhbHVlID0gX1Y7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBCYnBDc3IuZmllbGQuUmVnTnVtID0gX0k7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFJUTVBfSU9fV1JJVEUzMihfQSwgQkJQX0NTUl9DRkcsIEJicENzci53b3JkKTsgICAgIFwKKyAgICAgICAgKF9BKS0+QmJwV3JpdGVMYXRjaFtfSV0gPSBfVjsgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoQnVzeUNudCA9PSBNQVhfQlVTWV9DT1VOVCkgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkJCUCB3cml0ZSBSJWQgZmFpbFxuIiwgX0kpKTsgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorI2VuZGlmIC8vIFJUMjg2MCAvLworCisvKiBSVDI4ODBfaU5JQyB3aWxsIGRlZmluZSBSVDI4NjAuICovCisjaWZkZWYgUlQyODYwCisjZGVmaW5lIEVFUFJPTV9TSVpFCQkJCQkJCQkweDIwMAorLyogaU5JQyBoYXMgaXRzIG93biBFRVBST01fQklOX0ZJTEVfTkFNRSAqLworI2lmbmRlZiBVQ09TCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisjZGVmaW5lIEVFUFJPTV9CSU5fRklMRV9OQU1FICAiL2V0Yy9XaXJlbGVzcy9SVDI4NjBTVEEvZTJwLmJpbiIKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKyNlbmRpZiAvLyAhVUNPUyAvLworI2VuZGlmIC8vIFJUMjg2MCAvLworCisKKworVk9JRCBydF9lZV9yZWFkX2FsbCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlPVVQgVVNIT1JUICpEYXRhKTsKKworCitWT0lEIHJ0X2VlX3dyaXRlX2FsbCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgVVNIT1JUICpEYXRhKTsKKworSU5UIFNldF9BVEVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQJU2V0X0FURV9EQV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVAlTZXRfQVRFX1NBX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UCVNldF9BVEVfQlNTSURfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQJU2V0X0FURV9DSEFOTkVMX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UCVNldF9BVEVfVFhfUE9XRVIwX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UCVNldF9BVEVfVFhfUE9XRVIxX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UCVNldF9BVEVfVFhfQW50ZW5uYV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVAlTZXRfQVRFX1JYX0FudGVubmFfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQJU2V0X0FURV9UWF9GUkVRT0ZGU0VUX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UCVNldF9BVEVfVFhfQldfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQJU2V0X0FURV9UWF9MRU5HVEhfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQJU2V0X0FURV9UWF9DT1VOVF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVAlTZXRfQVRFX1RYX01DU19Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVAlTZXRfQVRFX1RYX01PREVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQJU2V0X0FURV9UWF9HSV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKKworSU5UCVNldF9BVEVfUlhfRkVSX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UIFNldF9BVEVfUmVhZF9SRl9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVCBTZXRfQVRFX1dyaXRlX1JGMV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVCBTZXRfQVRFX1dyaXRlX1JGMl9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVCBTZXRfQVRFX1dyaXRlX1JGM19Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVCBTZXRfQVRFX1dyaXRlX1JGNF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVCBTZXRfQVRFX0xvYWRfRTJQX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UIFNldF9BVEVfUmVhZF9FMlBfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQJU2V0X0FURV9TaG93X1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UCVNldF9BVEVfSGVscF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKKyNpZmRlZiBSQUxJTktfQVRFCisjaWZkZWYgUkFMSU5LXzI4eHhfUUEKK1ZPSUQgQVRFX1FBX1N0YXRpc3RpY3MoCisJSU4gUFJUTVBfQURBUFRFUgkJcEFkLAorCUlOIFBSWFdJX1NUUlVDCQkJcFJ4V0ksCisJSU4gUFJUMjhYWF9SWERfU1RSVUMgICAgcDI4eHhSeEQsCisJSU4gUEhFQURFUl84MDJfMTEJCXBIZWFkZXIpOworCitWT0lEIFJ0bXBEb0F0ZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAorCUlOCXN0cnVjdCBpd3JlcQkqd3JxKTsKKworVk9JRCBCdWJibGVTb3J0KAorCUlOICBJTlQzMiBuLAorCUlOICBJTlQzMiBhW10pOworCitWT0lEIENhbE5vaXNlTGV2ZWwoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKwlJTiAgVUNIQVIgICAgICAgICAgIGNoYW5uZWwsCisJT1VUIElOVDMyICAgICAgICAgICBidWZmZXJbM11bMTBdKTsKKworQk9PTEVBTiBTeW5jVHhSeENvbmZpZygKKwlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAorCUlOCVVTSE9SVAkJCW9mZnNldCwKKwlJTglVQ0hBUgkJCXZhbHVlKTsKKworI2lmIDAKK0lOVCBTZXRfVHhTdGFydF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisjZW5kaWYgIC8vIDAgLy8KKworSU5UIFNldF9UeFN0b3BfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQgU2V0X1J4U3RvcF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKKyNpZiAwCitJTlQgU2V0X0VFUmVhZF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVCBTZXRfRUVXcml0ZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVCBTZXRfQkJQUmVhZF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVCBTZXRfQkJQV3JpdGVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQgU2V0X1JGV3JpdGVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworI2VuZGlmIC8vIGVuZCBvZiAjaWYgMCAvLworI2VuZGlmIC8vIFJBTElOS18yOHh4X1FBIC8vCisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCitWT0lEIEFURUFzaWNTd2l0Y2hDaGFubmVsKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKworVk9JRCBBVEVBc2ljQWRqdXN0VHhQb3dlcigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK1ZPSUQgQVRFRGlzYWJsZUFzaWNQcm90ZWN0KAorCUlOCQlQUlRNUF9BREFQVEVSCXBBZCk7CisKK0NIQVIgQVRFQ29udmVydFRvUnNzaSgKKwlJTiBQUlRNUF9BREFQVEVSICBwQWQsCisJSU4gQ0hBUgkJCQlSc3NpLAorCUlOIFVDSEFSICAgIFJzc2lOdW1iZXIpOworCitWT0lEIEFURVNhbXBsZVJzc2koCisJSU4gUFJUTVBfQURBUFRFUglwQWQsCisJSU4gUFJYV0lfU1RSVUMJCXBSeFdJKTsKKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCitWT0lEIFJUTVBTdGF0aW9uU3RvcCgKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK1ZPSUQgUlRNUFN0YXRpb25TdGFydCgKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisjZW5kaWYgLy8gX19BVEVfSF9fIC8vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0X2NvbmZpZy5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydF9jb25maWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZWU3YTQwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydF9jb25maWcuaApAQCAtMCwwICsxLDEwMSBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwlNb2R1bGUgTmFtZToKKwlydF9jb25maWcuaAorCisJQWJzdHJhY3Q6CisJQ2VudHJhbCBoZWFkZXIgZmlsZSB0byBtYWludGFpbiBhbGwgaW5jbHVkZSBmaWxlcyBmb3IgYWxsIE5ESVMKKwltaW5pcG9ydCBkcml2ZXIgcm91dGluZXMuCisKKwlSZXZpc2lvbiBIaXN0b3J5OgorCVdobyAgICAgICAgIFdoZW4gICAgICAgICAgV2hhdAorCS0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCVBhdWwgTGluICAgIDA4LTAxLTIwMDIgICAgY3JlYXRlZAorCisqLworI2lmbmRlZglfX1JUX0NPTkZJR19IX18KKyNkZWZpbmUJX19SVF9DT05GSUdfSF9fCisKKyNpbmNsdWRlICAgICJydG1wX3R5cGUuaCIKKyNpZmRlZiBVQ09TCisjaW5jbHVkZSAiaW5jbHVkZXMuaCIKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgCSJydF91Y29zLmgiCisjZW5kaWYKKworI2lmZGVmIExJTlVYCisjaW5jbHVkZQkicnRfbGludXguaCIKKyNlbmRpZgorI2luY2x1ZGUgICAgInJ0bXBfZGVmLmgiCisjaW5jbHVkZSAgICAicnQyOHh4LmgiCisKKyNpZmRlZiBSVDI4NjAKKyNpbmNsdWRlCSJydDI4NjAuaCIKKyNlbmRpZiAvLyBSVDI4NjAgLy8KKworCisjaW5jbHVkZSAgICAib2lkLmgiCisjaW5jbHVkZSAgICAibWxtZS5oIgorI2luY2x1ZGUgICAgIndwYS5oIgorI2luY2x1ZGUgICAgIm1kNS5oIgorI2luY2x1ZGUgICAgInJ0bXAuaCIKKyNpbmNsdWRlCSJhcC5oIgorI2luY2x1ZGUJImRmcy5oIgorI2luY2x1ZGUJImNobGlzdC5oIgorI2luY2x1ZGUJInNwZWN0cnVtLmgiCisKKyNpZmRlZiBMRUFQX1NVUFBPUlQKKyNpbmNsdWRlICAgICJsZWFwLmgiCisjZW5kaWYgLy8gTEVBUF9TVVBQT1JUIC8vCisKKyNpZmRlZiBCTE9DS19ORVRfSUYKKyNpbmNsdWRlICJuZXRpZl9ibG9jay5oIgorI2VuZGlmIC8vIEJMT0NLX05FVF9JRiAvLworCisjaWZkZWYgSUdNUF9TTk9PUF9TVVBQT1JUCisjaW5jbHVkZSAiaWdtcF9zbm9vcC5oIgorI2VuZGlmIC8vIElHTVBfU05PT1BfU1VQUE9SVCAvLworCisjaWZkZWYgUkFMSU5LX0FURQorI2luY2x1ZGUgInJ0X2F0ZS5oIgorI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorI2lmZGVmIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisjaWZuZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyNlcnJvciAiQnVpbGQgZm9yIGJlaW5nIGNvbnRyb2xsZWQgYnkgTmV0d29ya01hbmFnZXIgb3Igd2V4dCwgcGxlYXNlIHNldCBIQVNfV1BBX1NVUFBMSUNBTlQ9eSBhbmQgSEFTX05BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUPXkiCisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworI2VuZGlmIC8vIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworI2lmZGVmIElLQU5PU19WWF8xWDAKKyNpbmNsdWRlCSJ2cl9pa2Fucy5oIgorI2VuZGlmIC8vIElLQU5PU19WWF8xWDAgLy8KKworI2VuZGlmCS8vIF9fUlRfQ09ORklHX0hfXworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0X2xpbnV4LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0X2xpbnV4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE0NTAwOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRfbGludXguYwpAQCAtMCwwICsxLDEwNTQgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKyNpbmNsdWRlICJydF9jb25maWcuaCIKKworVUxPTkcJUlREZWJ1Z0xldmVsID0gUlRfREVCVUdfRVJST1I7CisKK0JVSUxEX1RJTUVSX0ZVTkNUSU9OKE1sbWVQZXJpb2RpY0V4ZWMpOworQlVJTERfVElNRVJfRlVOQ1RJT04oQXNpY1J4QW50RXZhbFRpbWVvdXQpOworQlVJTERfVElNRVJfRlVOQ1RJT04oQVBTRFBlcmlvZGljRXhlYyk7CitCVUlMRF9USU1FUl9GVU5DVElPTihBc2ljUmZUdW5pbmdFeGVjKTsKKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCitCVUlMRF9USU1FUl9GVU5DVElPTihCZWFjb25UaW1lb3V0KTsKK0JVSUxEX1RJTUVSX0ZVTkNUSU9OKFNjYW5UaW1lb3V0KTsKK0JVSUxEX1RJTUVSX0ZVTkNUSU9OKEF1dGhUaW1lb3V0KTsKK0JVSUxEX1RJTUVSX0ZVTkNUSU9OKEFzc29jVGltZW91dCk7CitCVUlMRF9USU1FUl9GVU5DVElPTihSZWFzc29jVGltZW91dCk7CitCVUlMRF9USU1FUl9GVU5DVElPTihEaXNhc3NvY1RpbWVvdXQpOworQlVJTERfVElNRVJfRlVOQ1RJT04oTGlua0Rvd25FeGVjKTsKKyNpZmRlZiBMRUFQX1NVUFBPUlQKK0JVSUxEX1RJTUVSX0ZVTkNUSU9OKExlYXBBdXRoVGltZW91dCk7CisjZW5kaWYKK0JVSUxEX1RJTUVSX0ZVTkNUSU9OKFN0YVF1aWNrUmVzcG9uZUZvclJhdGVVcEV4ZWMpOworQlVJTERfVElNRVJfRlVOQ1RJT04oV3BhRGlzYXNzb2NBcEFuZEJsb2NrQXNzb2MpOworI2lmZGVmIFJUMjg2MAorQlVJTERfVElNRVJfRlVOQ1RJT04oUHNQb2xsV2FrZUV4ZWMpOworQlVJTERfVElNRVJfRlVOQ1RJT04oUmFkaW9PbkV4ZWMpOworI2VuZGlmIC8vIFJUMjg2MCAvLworI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorQlVJTERfVElNRVJfRlVOQ1RJT04oRGxzVGltZW91dEFjdGlvbik7CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKy8vIGZvciB3aXJlbGVzcyBzeXN0ZW0gZXZlbnQgbWVzc2FnZQorY2hhciBjb25zdCAqcFdpcmVsZXNzU3lzRXZlbnRUZXh0W0lXX1NZU19FVkVOVF9UWVBFX05VTV0gPSB7CisJLy8gc3lzdGVtIHN0YXR1cyBldmVudAorICAgICJoYWQgYXNzb2NpYXRlZCBzdWNjZXNzZnVsbHkiLAkJCQkJCQkvKiBJV19BU1NPQ19FVkVOVF9GTEFHICovCisgICAgImhhZCBkaXNhc3NvY2lhdGVkIiwJCQkJCQkJCQkvKiBJV19ESVNBU1NPQ19FVkVOVF9GTEFHICovCisgICAgImhhZCBkZWF1dGhlbnRpY2F0ZWQiLAkJCQkJCQkJCS8qIElXX0RFQVVUSF9FVkVOVF9GTEFHICovCisgICAgImhhZCBiZWVuIGFnZWQtb3V0IGFuZCBkaXNhc3NvY2lhdGVkIiwJCQkJCS8qIElXX0FHRU9VVF9FVkVOVF9GTEFHICovCisgICAgIm9jY3VycmVkIENvdW50ZXJNZWFzdXJlcyBhdHRhY2siLAkJCQkJCS8qIElXX0NPVU5URVJfTUVBU1VSRVNfRVZFTlRfRkxBRyAqLworICAgICJvY2N1cnJlZCByZXBsYXkgY291bnRlciBkaWZmZXJlbnQgaW4gS2V5IEhhbmRzaGFraW5nIiwJLyogSVdfUkVQTEFZX0NPVU5URVJfRElGRl9FVkVOVF9GTEFHICovCisgICAgIm9jY3VycmVkIFJTTklFIGRpZmZlcmVudCBpbiBLZXkgSGFuZHNoYWtpbmciLAkJCS8qIElXX1JTTklFX0RJRkZfRVZFTlRfRkxBRyAqLworICAgICJvY2N1cnJlZCBNSUMgZGlmZmVyZW50IGluIEtleSBIYW5kc2hha2luZyIsCQkJLyogSVdfTUlDX0RJRkZfRVZFTlRfRkxBRyAqLworICAgICJvY2N1cnJlZCBJQ1YgZXJyb3IgaW4gUlgiLAkJCQkJCQkJLyogSVdfSUNWX0VSUk9SX0VWRU5UX0ZMQUcgKi8KKyAgICAib2NjdXJyZWQgTUlDIGVycm9yIGluIFJYIiwJCQkJCQkJCS8qIElXX01JQ19FUlJPUl9FVkVOVF9GTEFHICovCisJIkdyb3VwIEtleSBIYW5kc2hha2luZyB0aW1lb3V0IiwJCQkJCQkvKiBJV19HUk9VUF9IU19USU1FT1VUX0VWRU5UX0ZMQUcgKi8KKwkiUGFpcndpc2UgS2V5IEhhbmRzaGFraW5nIHRpbWVvdXQiLAkJCQkJCS8qIElXX1BBSVJXSVNFX0hTX1RJTUVPVVRfRVZFTlRfRkxBRyAqLworCSJSU04gSUUgc2FuaXR5IGNoZWNrIGZhaWx1cmUiLAkJCQkJCQkvKiBJV19SU05JRV9TQU5JVFlfRkFJTF9FVkVOVF9GTEFHICovCisJInNldCBrZXkgZG9uZSBpbiBXUEEvV1BBUFNLIiwJCQkJCQkJLyogSVdfU0VUX0tFWV9ET05FX1dQQTFfRVZFTlRfRkxBRyAqLworCSJzZXQga2V5IGRvbmUgaW4gV1BBMi9XUEEyUFNLIiwgICAgICAgICAgICAgICAgICAgICAgICAgLyogSVdfU0VUX0tFWV9ET05FX1dQQTJfRVZFTlRfRkxBRyAqLworCSJjb25uZWN0cyB3aXRoIG91ciB3aXJlbGVzcyBjbGllbnQiLCAgICAgICAgICAgICAgICAgICAgLyogSVdfU1RBX0xJTktVUF9FVkVOVF9GTEFHICovCisJImRpc2Nvbm5lY3RzIHdpdGggb3VyIHdpcmVsZXNzIGNsaWVudCIsICAgICAgICAgICAgICAgICAvKiBJV19TVEFfTElOS0RPV05fRVZFTlRfRkxBRyAqLworCSJzY2FuIGNvbXBsZXRlZCIJCQkJCQkJCQkJLyogSVdfU0NBTl9DT01QTEVURURfRVZFTlRfRkxBRyAqLworCSJzY2FuIHRlcm1pbmF0ZSEhIEJ1c3khISBFbnF1ZXVlIGZhaWwhISIJCQkJLyogSVdfU0NBTl9FTlFVRVVFX0ZBSUxfRVZFTlRfRkxBRyAqLworCX07CisKKy8vIGZvciB3aXJlbGVzcyBJRFNfc3Bvb2ZfYXR0YWNrIGV2ZW50IG1lc3NhZ2UKK2NoYXIgY29uc3QgKnBXaXJlbGVzc1Nwb29mRXZlbnRUZXh0W0lXX1NQT09GX0VWRU5UX1RZUEVfTlVNXSA9IHsKKyAgICAiZGV0ZWN0ZWQgY29uZmxpY3QgU1NJRCIsCQkJCQkJCQkvKiBJV19DT05GTElDVF9TU0lEX0VWRU5UX0ZMQUcgKi8KKyAgICAiZGV0ZWN0ZWQgc3Bvb2ZlZCBhc3NvY2lhdGlvbiByZXNwb25zZSIsCQkJCS8qIElXX1NQT09GX0FTU09DX1JFU1BfRVZFTlRfRkxBRyAqLworICAgICJkZXRlY3RlZCBzcG9vZmVkIHJlYXNzb2NpYXRpb24gcmVzcG9uc2VzIiwJCQkJLyogSVdfU1BPT0ZfUkVBU1NPQ19SRVNQX0VWRU5UX0ZMQUcgKi8KKyAgICAiZGV0ZWN0ZWQgc3Bvb2ZlZCBwcm9iZSByZXNwb25zZSIsCQkJCQkJLyogSVdfU1BPT0ZfUFJPQkVfUkVTUF9FVkVOVF9GTEFHICovCisgICAgImRldGVjdGVkIHNwb29mZWQgYmVhY29uIiwJCQkJCQkJCS8qIElXX1NQT09GX0JFQUNPTl9FVkVOVF9GTEFHICovCisgICAgImRldGVjdGVkIHNwb29mZWQgZGlzYXNzb2NpYXRpb24iLAkJCQkJCS8qIElXX1NQT09GX0RJU0FTU09DX0VWRU5UX0ZMQUcgKi8KKyAgICAiZGV0ZWN0ZWQgc3Bvb2ZlZCBhdXRoZW50aWNhdGlvbiIsCQkJCQkJLyogSVdfU1BPT0ZfQVVUSF9FVkVOVF9GTEFHICovCisgICAgImRldGVjdGVkIHNwb29mZWQgZGVhdXRoZW50aWNhdGlvbiIsCQkJCQkvKiBJV19TUE9PRl9ERUFVVEhfRVZFTlRfRkxBRyAqLworICAgICJkZXRlY3RlZCBzcG9vZmVkIHVua25vd24gbWFuYWdlbWVudCBmcmFtZSIsCQkJLyogSVdfU1BPT0ZfVU5LTk9XTl9NR01UX0VWRU5UX0ZMQUcgKi8KKwkiZGV0ZWN0ZWQgcmVwbGF5IGF0dGFjayIJCQkJCQkJCS8qIElXX1JFUExBWV9BVFRBQ0tfRVZFTlRfRkxBRyAqLworCX07CisKKy8vIGZvciB3aXJlbGVzcyBJRFNfZmxvb2RpbmdfYXR0YWNrIGV2ZW50IG1lc3NhZ2UKK2NoYXIgY29uc3QgKnBXaXJlbGVzc0Zsb29kRXZlbnRUZXh0W0lXX0ZMT09EX0VWRU5UX1RZUEVfTlVNXSA9IHsKKwkiZGV0ZWN0ZWQgYXV0aGVudGljYXRpb24gZmxvb2RpbmciLAkJCQkJCS8qIElXX0ZMT09EX0FVVEhfRVZFTlRfRkxBRyAqLworICAgICJkZXRlY3RlZCBhc3NvY2lhdGlvbiByZXF1ZXN0IGZsb29kaW5nIiwJCQkJLyogSVdfRkxPT0RfQVNTT0NfUkVRX0VWRU5UX0ZMQUcgKi8KKyAgICAiZGV0ZWN0ZWQgcmVhc3NvY2lhdGlvbiByZXF1ZXN0IGZsb29kaW5nIiwJCQkJLyogSVdfRkxPT0RfUkVBU1NPQ19SRVFfRVZFTlRfRkxBRyAqLworICAgICJkZXRlY3RlZCBwcm9iZSByZXF1ZXN0IGZsb29kaW5nIiwJCQkJCQkvKiBJV19GTE9PRF9QUk9CRV9SRVFfRVZFTlRfRkxBRyAqLworICAgICJkZXRlY3RlZCBkaXNhc3NvY2lhdGlvbiBmbG9vZGluZyIsCQkJCQkJLyogSVdfRkxPT0RfRElTQVNTT0NfRVZFTlRfRkxBRyAqLworICAgICJkZXRlY3RlZCBkZWF1dGhlbnRpY2F0aW9uIGZsb29kaW5nIiwJCQkJCS8qIElXX0ZMT09EX0RFQVVUSF9FVkVOVF9GTEFHICovCisgICAgImRldGVjdGVkIDgwMi4xeCBlYXAtcmVxdWVzdCBmbG9vZGluZyIJCQkJCS8qIElXX0ZMT09EX0VBUF9SRVFfRVZFTlRfRkxBRyAqLworCX07CisKKy8qIHRpbWVvdXQgLS0gbXMgKi8KK1ZPSUQgUlRNUF9TZXRQZXJpb2RpY1RpbWVyKAorCUlOCU5ESVNfTUlOSVBPUlRfVElNRVIgKnBUaW1lciwKKwlJTgl1bnNpZ25lZCBsb25nIHRpbWVvdXQpCit7CisJdGltZW91dCA9ICgodGltZW91dCpIWikgLyAxMDAwKTsKKwlwVGltZXItPmV4cGlyZXMgPSBqaWZmaWVzICsgdGltZW91dDsKKwlhZGRfdGltZXIocFRpbWVyKTsKK30KKworLyogY29udmVydCBOZGlzTUluaXRpYWxpemVUaW1lciAtLT4gUlRNUF9PU19Jbml0X1RpbWVyICovCitWT0lEIFJUTVBfT1NfSW5pdF9UaW1lcigKKwlJTglQUlRNUF9BREFQVEVSIHBBZCwKKwlJTglORElTX01JTklQT1JUX1RJTUVSICpwVGltZXIsCisJSU4JVElNRVJfRlVOQ1RJT04gZnVuY3Rpb24sCisJSU4JUFZPSUQgZGF0YSkKK3sKKwlpbml0X3RpbWVyKHBUaW1lcik7CisgICAgcFRpbWVyLT5kYXRhID0gKHVuc2lnbmVkIGxvbmcpZGF0YTsKKyAgICBwVGltZXItPmZ1bmN0aW9uID0gZnVuY3Rpb247Cit9CisKKworVk9JRCBSVE1QX09TX0FkZF9UaW1lcigKKwlJTglORElTX01JTklQT1JUX1RJTUVSCQkqcFRpbWVyLAorCUlOCXVuc2lnbmVkIGxvbmcgdGltZW91dCkKK3sKKwlpZiAodGltZXJfcGVuZGluZyhwVGltZXIpKQorCQlyZXR1cm47CisKKwl0aW1lb3V0ID0gKCh0aW1lb3V0KkhaKSAvIDEwMDApOworCXBUaW1lci0+ZXhwaXJlcyA9IGppZmZpZXMgKyB0aW1lb3V0OworCWFkZF90aW1lcihwVGltZXIpOworfQorCitWT0lEIFJUTVBfT1NfTW9kX1RpbWVyKAorCUlOCU5ESVNfTUlOSVBPUlRfVElNRVIJCSpwVGltZXIsCisJSU4JdW5zaWduZWQgbG9uZyB0aW1lb3V0KQoreworCXRpbWVvdXQgPSAoKHRpbWVvdXQqSFopIC8gMTAwMCk7CisJbW9kX3RpbWVyKHBUaW1lciwgamlmZmllcyArIHRpbWVvdXQpOworfQorCitWT0lEIFJUTVBfT1NfRGVsX1RpbWVyKAorCUlOCU5ESVNfTUlOSVBPUlRfVElNRVIJCSpwVGltZXIsCisJT1VUCUJPT0xFQU4JCQkJCSpwQ2FuY2VsbGVkKQoreworCWlmICh0aW1lcl9wZW5kaW5nKHBUaW1lcikpCisJeworCQkqcENhbmNlbGxlZCA9IGRlbF90aW1lcl9zeW5jKHBUaW1lcik7CisJfQorCWVsc2UKKwl7CisJCSpwQ2FuY2VsbGVkID0gVFJVRTsKKwl9CisKK30KKworVk9JRCBSVE1QX09TX1JlbGVhc2VfUGFja2V0KAorCUlOCVBSVE1QX0FEQVBURVIgcEFkLAorCUlOCVBRVUVVRV9FTlRSWSAgcEVudHJ5KQoreworCS8vUlRNUEZyZWVOZGlzUGFja2V0KHBBZCwgKHN0cnVjdCBza19idWZmICopcEVudHJ5KTsKK30KKworLy8gVW5pZnkgYWxsIGRlbGF5IHJvdXRpbmUgYnkgdXNpbmcgdWRlbGF5CitWT0lEIFJUTVB1c2VjRGVsYXkoCisJSU4JVUxPTkcJdXNlYykKK3sKKwlVTE9ORwlpOworCisJZm9yIChpID0gMDsgaSA8ICh1c2VjIC8gNTApOyBpKyspCisJCXVkZWxheSg1MCk7CisKKwlpZiAodXNlYyAlIDUwKQorCQl1ZGVsYXkodXNlYyAlIDUwKTsKK30KKwordm9pZCBSVE1QX0dldEN1cnJlbnRTeXN0ZW1UaW1lKExBUkdFX0lOVEVHRVIgKnRpbWUpCit7CisJdGltZS0+dS5Mb3dQYXJ0ID0gamlmZmllczsKK30KKworLy8gcEFkIE1VU1QgYWxsb3cgdG8gYmUgTlVMTAorTkRJU19TVEFUVVMgb3NfYWxsb2NfbWVtKAorCUlOCVBSVE1QX0FEQVBURVIgcEFkLAorCU9VVAlQVUNIQVIgKm1lbSwKKwlJTglVTE9ORyAgc2l6ZSkKK3sKKwkqbWVtID0gKFBVQ0hBUikga21hbGxvYyhzaXplLCBHRlBfQVRPTUlDKTsKKwlpZiAoKm1lbSkKKwkJcmV0dXJuIChORElTX1NUQVRVU19TVUNDRVNTKTsKKwllbHNlCisJCXJldHVybiAoTkRJU19TVEFUVVNfRkFJTFVSRSk7Cit9CisKKy8vIHBBZCBNVVNUIGFsbG93IHRvIGJlIE5VTEwKK05ESVNfU1RBVFVTIG9zX2ZyZWVfbWVtKAorCUlOCVBSVE1QX0FEQVBURVIgcEFkLAorCUlOCVBVQ0hBUiBtZW0pCit7CisKKwlBU1NFUlQobWVtKTsKKwlrZnJlZShtZW0pOworCXJldHVybiAoTkRJU19TVEFUVVNfU1VDQ0VTUyk7Cit9CisKKworUE5ESVNfUEFDS0VUIFJUTVBfQWxsb2NhdGVGcmFnUGFja2V0QnVmZmVyKAorCUlOCVBSVE1QX0FEQVBURVIgcEFkLAorCUlOCVVMT05HCUxlbmd0aCkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqcGt0OworCisJcGt0ID0gZGV2X2FsbG9jX3NrYihMZW5ndGgpOworCisJaWYgKHBrdCA9PSBOVUxMKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY2FuJ3QgYWxsb2NhdGUgZnJhZyByeCAlbGQgc2l6ZSBwYWNrZXRcbiIsTGVuZ3RoKSk7CisJfQorCisJaWYgKHBrdCkKKwl7CisJCVJUTVBfU0VUX1BBQ0tFVF9TT1VSQ0UoT1NQS1RfVE9fUlRQS1QocGt0KSwgUEtUU1JDX05ESVMpOworCX0KKworCXJldHVybiAoUE5ESVNfUEFDS0VUKSBwa3Q7Cit9CisKKworUE5ESVNfUEFDS0VUIFJUTVBfQWxsb2NhdGVUeFBhY2tldEJ1ZmZlcigKKwlJTglQUlRNUF9BREFQVEVSIHBBZCwKKwlJTglVTE9ORwlMZW5ndGgsCisJSU4JQk9PTEVBTglDYWNoZWQsCisJT1VUCVBWT0lECSpWaXJ0dWFsQWRkcmVzcykKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqcGt0OworCisJcGt0ID0gZGV2X2FsbG9jX3NrYihMZW5ndGgpOworCisJaWYgKHBrdCA9PSBOVUxMKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY2FuJ3QgYWxsb2NhdGUgdHggJWxkIHNpemUgcGFja2V0XG4iLExlbmd0aCkpOworCX0KKworCWlmIChwa3QpCisJeworCQlSVE1QX1NFVF9QQUNLRVRfU09VUkNFKE9TUEtUX1RPX1JUUEtUKHBrdCksIFBLVFNSQ19ORElTKTsKKwkJKlZpcnR1YWxBZGRyZXNzID0gKFBWT0lEKSBwa3QtPmRhdGE7CisJfQorCWVsc2UKKwl7CisJCSpWaXJ0dWFsQWRkcmVzcyA9IChQVk9JRCkgTlVMTDsKKwl9CisKKwlyZXR1cm4gKFBORElTX1BBQ0tFVCkgcGt0OworfQorCisKK1ZPSUQgYnVpbGRfdHhfcGFja2V0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBORElTX1BBQ0tFVAlwUGFja2V0LAorCUlOCVBVQ0hBUglwRnJhbWUsCisJSU4JVUxPTkcJRnJhbWVMZW4pCit7CisKKwlzdHJ1Y3Qgc2tfYnVmZgkqcFR4UGt0OworCisJQVNTRVJUKHBQYWNrZXQpOworCXBUeFBrdCA9IFJUUEtUX1RPX09TUEtUKHBQYWNrZXQpOworCisJTmRpc01vdmVNZW1vcnkoc2tiX3B1dChwVHhQa3QsIEZyYW1lTGVuKSwgcEZyYW1lLCBGcmFtZUxlbik7Cit9CisKK1ZPSUQJUlRNUEZyZWVBZGFwdGVyKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKQoreworICAgIFBPU19DT09LSUUgb3NfY29va2llOworCWludCBpbmRleDsKKworCW9zX2Nvb2tpZT0oUE9TX0NPT0tJRSlwQWQtPk9TX0Nvb2tpZTsKKworCWtmcmVlKHBBZC0+QmVhY29uQnVmKTsKKworCisJTmRpc0ZyZWVTcGluTG9jaygmcEFkLT5NZ210UmluZ0xvY2spOworCisjaWZkZWYgUlQyODYwCisJTmRpc0ZyZWVTcGluTG9jaygmcEFkLT5SeFJpbmdMb2NrKTsKKyNlbmRpZiAvLyBSVDI4NjAgLy8KKworCWZvciAoaW5kZXggPTAgOyBpbmRleCA8IE5VTV9PRl9UWF9SSU5HOyBpbmRleCsrKQorCXsKKyAgICAJTmRpc0ZyZWVTcGluTG9jaygmcEFkLT5UeFN3UXVldWVMb2NrW2luZGV4XSk7CisJCU5kaXNGcmVlU3BpbkxvY2soJnBBZC0+RGVRdWV1ZUxvY2tbaW5kZXhdKTsKKwkJcEFkLT5EZVF1ZXVlUnVubmluZ1tpbmRleF0gPSBGQUxTRTsKKwl9CisKKwlOZGlzRnJlZVNwaW5Mb2NrKCZwQWQtPmlycV9sb2NrKTsKKworCXZmcmVlKHBBZCk7IC8vIHBjaV9mcmVlX2NvbnNpc3RlbnQob3NfY29va2llLT5wY2lfZGV2LHNpemVvZihSVE1QX0FEQVBURVIpLHBBZCxvc19jb29raWUtPnBBZF9wYSk7CisJa2ZyZWUob3NfY29va2llKTsKK30KKworQk9PTEVBTiBPU19OZWVkX0Nsb25lX1BhY2tldCh2b2lkKQoreworCXJldHVybiAoRkFMU0UpOworfQorCisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCWNsb25lIGFuIGlucHV0IE5ESVMgUEFDS0VUIHRvIGFub3RoZXIgb25lLiBUaGUgbmV3IGludGVybmFsbHkgY3JlYXRlZCBORElTIFBBQ0tFVAorCQltdXN0IGhhdmUgb25seSBvbmUgTkRJUyBCVUZGRVIKKwkJcmV0dXJuIC0gYnl0ZSBjb3BpZWQuIDAgbWVhbnMgY2FuJ3QgY3JlYXRlIE5ESVMgUEFDS0VUCisJCU5PVEU6IGludGVybmFsbHkgY3JlYXRlZCBORElTX1BBQ0tFVCBzaG91bGQgYmUgZGVzdHJveWVkIGJ5IFJUTVBGcmVlTmRpc1BhY2tldAorCisJQXJndW1lbnRzOgorCQlwQWQgCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKwkJcEluc0FNU0RVSGRyCUVXQyBBLU1TRFUgZm9ybWF0IGhhcyBleHRyYSAxNC1ieXRlcyBoZWFkZXIuIGlmIFRSVUUsIGluc2VydCB0aGlzIDE0LWJ5dGUgaGRyIGluIGZyb250IG9mIE1TRFUuCisJCSpwU3JjVG90YWxMZW4JCQlyZXR1cm4gdG90YWwgcGFja2V0IGxlbmd0aC4gVGhpcyBsZW5naHQgaXMgY2FsY3VsYXRlZCB3aXRoIDgwMi4zIGZvcm1hdCBwYWNrZXQuCisKKwlSZXR1cm4gVmFsdWU6CisJCU5ESVNfU1RBVFVTX1NVQ0NFU1MKKwkJTkRJU19TVEFUVVNfRkFJTFVSRQorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK05ESVNfU1RBVFVTIFJUTVBDbG9uZU5kaXNQYWNrZXQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JQk9PTEVBTgkJCXBJbnNBTVNEVUhkciwKKwlJTglQTkRJU19QQUNLRVQJcEluUGFja2V0LAorCU9VVCBQTkRJU19QQUNLRVQgICAqcHBPdXRQYWNrZXQpCit7CisKKwlzdHJ1Y3Qgc2tfYnVmZiAqcGt0OworCisJQVNTRVJUKHBJblBhY2tldCk7CisJQVNTRVJUKHBwT3V0UGFja2V0KTsKKworCS8vIDEuIEFsbG9jYXRlIGEgcGFja2V0CisJcGt0ID0gZGV2X2FsbG9jX3NrYigyMDQ4KTsKKworCWlmIChwa3QgPT0gTlVMTCkKKwl7CisJCXJldHVybiBORElTX1NUQVRVU19GQUlMVVJFOworCX0KKworIAlza2JfcHV0KHBrdCwgR0VUX09TX1BLVF9MRU4ocEluUGFja2V0KSk7CisJTmRpc01vdmVNZW1vcnkocGt0LT5kYXRhLCBHRVRfT1NfUEtUX0RBVEFQVFIocEluUGFja2V0KSwgR0VUX09TX1BLVF9MRU4ocEluUGFja2V0KSk7CisJKnBwT3V0UGFja2V0ID0gT1NQS1RfVE9fUlRQS1QocGt0KTsKKworCisJUlRNUF9TRVRfUEFDS0VUX1NPVVJDRShPU1BLVF9UT19SVFBLVChwa3QpLCBQS1RTUkNfTkRJUyk7CisKKwlwcmludGsoIiMjI0Nsb25lIyMjXG4iKTsKKworCXJldHVybiBORElTX1NUQVRVU19TVUNDRVNTOworfQorCisKKy8vIHRoZSBhbGxvY2F0ZWQgTkRJUyBQQUNLRVQgbXVzdCBiZSBmcmVlZCB2aWEgUlRNUEZyZWVOZGlzUGFja2V0KCkKK05ESVNfU1RBVFVTIFJUTVBBbGxvY2F0ZU5kaXNQYWNrZXQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUIFBORElTX1BBQ0tFVCAgICpwcFBhY2tldCwKKwlJTglQVUNIQVIJCQlwSGVhZGVyLAorCUlOCVVJTlQJCQlIZWFkZXJMZW4sCisJSU4JUFVDSEFSCQkJcERhdGEsCisJSU4JVUlOVAkJCURhdGFMZW4pCit7CisJUE5ESVNfUEFDS0VUCXBQYWNrZXQ7CisJQVNTRVJUKHBEYXRhKTsKKwlBU1NFUlQoRGF0YUxlbik7CisKKwkvLyAxLiBBbGxvY2F0ZSBhIHBhY2tldAorCXBQYWNrZXQgPSAoUE5ESVNfUEFDS0VUICopIGRldl9hbGxvY19za2IoSGVhZGVyTGVuICsgRGF0YUxlbiArIFRYUEFERElOR19TSVpFKTsKKwlpZiAocFBhY2tldCA9PSBOVUxMKQorIAl7CisJCSpwcFBhY2tldCA9IE5VTEw7CisjaWZkZWYgREVCVUcKKwkJcHJpbnRrKCJSVE1QQWxsb2NhdGVOZGlzUGFja2V0IEZhaWxcblxuIik7CisjZW5kaWYKKwkJcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkU7CisJfQorCisJLy8gMi4gY2xvbmUgdGhlIGZyYW1lIGNvbnRlbnQKKwlpZiAoSGVhZGVyTGVuID4gMCkKKwkJTmRpc01vdmVNZW1vcnkoR0VUX09TX1BLVF9EQVRBUFRSKHBQYWNrZXQpLCBwSGVhZGVyLCBIZWFkZXJMZW4pOworCWlmIChEYXRhTGVuID4gMCkKKwkJTmRpc01vdmVNZW1vcnkoR0VUX09TX1BLVF9EQVRBUFRSKHBQYWNrZXQpICsgSGVhZGVyTGVuLCBwRGF0YSwgRGF0YUxlbik7CisKKwkvLyAzLiB1cGRhdGUgbGVuZ3RoIG9mIHBhY2tldAorIAlza2JfcHV0KEdFVF9PU19QS1RfVFlQRShwUGFja2V0KSwgSGVhZGVyTGVuK0RhdGFMZW4pOworCisJUlRNUF9TRVRfUEFDS0VUX1NPVVJDRShwUGFja2V0LCBQS1RTUkNfTkRJUyk7CisvLwlwcmludGsoIiVzIDogcFBhY2tldCA9ICVwLCBsZW4gPSAlZFxuIiwgX19mdW5jX18sIHBQYWNrZXQsIEdFVF9PU19QS1RfTEVOKHBQYWNrZXQpKTsKKwkqcHBQYWNrZXQgPSBwUGFja2V0OworCXJldHVybiBORElTX1NUQVRVU19TVUNDRVNTOworfQorCisvKgorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRGVzY3JpcHRpb246CisJVGhpcyByb3V0aW5lIGZyZWVzIGEgbWluaXBvcnQgaW50ZXJuYWxseSBhbGxvY2F0ZWQgTkRJU19QQUNLRVQgYW5kIGl0cworCWNvcnJlc3BvbmRpbmcgTkRJU19CVUZGRVIgYW5kIGFsbG9jYXRlZCBtZW1vcnkuCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgUlRNUEZyZWVOZGlzUGFja2V0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFBORElTX1BBQ0tFVCAgcFBhY2tldCkKK3sKKwlkZXZfa2ZyZWVfc2tiX2FueShSVFBLVF9UT19PU1BLVChwUGFja2V0KSk7Cit9CisKKworLy8gSVJRTCA9IERJU1BBVENIX0xFVkVMCisvLyBOT1RFOiB3ZSBkbyBoYXZlIGFuIGFzc3VtcHRpb24gaGVyZSwgdGhhdCBCeXRlMCBhbmQgQnl0ZTEgYWx3YXlzIHJlYXNpZCBhdCB0aGUgc2FtZQorLy8JCQkgc2NhdHRlciBnYXRoZXIgYnVmZmVyCitORElTX1NUQVRVUyBTbmlmZjJCeXRlc0Zyb21OZGlzQnVmZmVyKAorCUlOCVBORElTX0JVRkZFUglwRmlyc3RCdWZmZXIsCisJSU4JVUNIQVIJCQlEZXNpcmVkT2Zmc2V0LAorCU9VVCBQVUNIQVIJCQlwQnl0ZTAsCisJT1VUIFBVQ0hBUgkJCXBCeXRlMSkKK3sKKyAgICAqcEJ5dGUwID0gKihQVUNIQVIpKHBGaXJzdEJ1ZmZlciArIERlc2lyZWRPZmZzZXQpOworICAgICpwQnl0ZTEgPSAqKFBVQ0hBUikocEZpcnN0QnVmZmVyICsgRGVzaXJlZE9mZnNldCArIDEpOworCisJcmV0dXJuIE5ESVNfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKwordm9pZCBSVE1QX1F1ZXJ5UGFja2V0SW5mbygKKwlJTiAgUE5ESVNfUEFDS0VUIHBQYWNrZXQsCisJT1VUIFBBQ0tFVF9JTkZPICAqcFBhY2tldEluZm8sCisJT1VUIFBVQ0hBUgkJICpwU3JjQnVmVkEsCisJT1VUCVVJTlQJCSAqcFNyY0J1ZkxlbikKK3sKKwlwUGFja2V0SW5mby0+QnVmZmVyQ291bnQgPSAxOworCXBQYWNrZXRJbmZvLT5wRmlyc3RCdWZmZXIgPSBHRVRfT1NfUEtUX0RBVEFQVFIocFBhY2tldCk7CisJcFBhY2tldEluZm8tPlBoeXNpY2FsQnVmZmVyQ291bnQgPSAxOworCXBQYWNrZXRJbmZvLT5Ub3RhbFBhY2tldExlbmd0aCA9IEdFVF9PU19QS1RfTEVOKHBQYWNrZXQpOworCisJKnBTcmNCdWZWQSA9IEdFVF9PU19QS1RfREFUQVBUUihwUGFja2V0KTsKKwkqcFNyY0J1ZkxlbiA9IEdFVF9PU19QS1RfTEVOKHBQYWNrZXQpOworfQorCit2b2lkIFJUTVBfUXVlcnlOZXh0UGFja2V0SW5mbygKKwlJTiAgUE5ESVNfUEFDS0VUICpwcFBhY2tldCwKKwlPVVQgUEFDS0VUX0lORk8gICpwUGFja2V0SW5mbywKKwlPVVQgUFVDSEFSCQkgKnBTcmNCdWZWQSwKKwlPVVQJVUlOVAkJICpwU3JjQnVmTGVuKQoreworCVBORElTX1BBQ0tFVCBwUGFja2V0ID0gTlVMTDsKKworCWlmICgqcHBQYWNrZXQpCisJCXBQYWNrZXQgPSBHRVRfT1NfUEtUX05FWFQoKnBwUGFja2V0KTsKKworCWlmIChwUGFja2V0KQorCXsKKwkJcFBhY2tldEluZm8tPkJ1ZmZlckNvdW50ID0gMTsKKwkJcFBhY2tldEluZm8tPnBGaXJzdEJ1ZmZlciA9IEdFVF9PU19QS1RfREFUQVBUUihwUGFja2V0KTsKKwkJcFBhY2tldEluZm8tPlBoeXNpY2FsQnVmZmVyQ291bnQgPSAxOworCQlwUGFja2V0SW5mby0+VG90YWxQYWNrZXRMZW5ndGggPSBHRVRfT1NfUEtUX0xFTihwUGFja2V0KTsKKworCQkqcFNyY0J1ZlZBID0gR0VUX09TX1BLVF9EQVRBUFRSKHBQYWNrZXQpOworCQkqcFNyY0J1ZkxlbiA9IEdFVF9PU19QS1RfTEVOKHBQYWNrZXQpOworCQkqcHBQYWNrZXQgPSBHRVRfT1NfUEtUX05FWFQocFBhY2tldCk7CisJfQorCWVsc2UKKwl7CisJCXBQYWNrZXRJbmZvLT5CdWZmZXJDb3VudCA9IDA7CisJCXBQYWNrZXRJbmZvLT5wRmlyc3RCdWZmZXIgPSBOVUxMOworCQlwUGFja2V0SW5mby0+UGh5c2ljYWxCdWZmZXJDb3VudCA9IDA7CisJCXBQYWNrZXRJbmZvLT5Ub3RhbFBhY2tldExlbmd0aCA9IDA7CisKKwkJKnBTcmNCdWZWQSA9IE5VTEw7CisJCSpwU3JjQnVmTGVuID0gMDsKKwkJKnBwUGFja2V0ID0gTlVMTDsKKwl9Cit9CisKKy8vIG5vdCB5ZXQgc3VwcG9ydCBNQlNTCitQTkVUX0RFViBnZXRfbmV0ZGV2X2Zyb21fYnNzaWQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCkKK3sKKyAgICBQTkVUX0RFViBkZXZfcCA9IE5VTEw7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCXsKKwkJZGV2X3AgPSBwQWQtPm5ldF9kZXY7CisJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJQVNTRVJUKGRldl9wKTsKKwlyZXR1cm4gZGV2X3A7IC8qIHJldHVybiBvbmUgb2YgTUJTUyAqLworfQorCitQTkRJU19QQUNLRVQgRHVwbGljYXRlUGFja2V0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBORElTX1BBQ0tFVAlwUGFja2V0LAorCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpCit7CisJc3RydWN0IHNrX2J1ZmYJKnNrYjsKKwlQTkRJU19QQUNLRVQJcFJldFBhY2tldCA9IE5VTEw7CisJVVNIT1JUCQkJRGF0YVNpemU7CisJVUNIQVIJCQkqcERhdGE7CisKKwlEYXRhU2l6ZSA9IChVU0hPUlQpIEdFVF9PU19QS1RfTEVOKHBQYWNrZXQpOworCXBEYXRhID0gKFBVQ0hBUikgR0VUX09TX1BLVF9EQVRBUFRSKHBQYWNrZXQpOworCisKKwlza2IgPSBza2JfY2xvbmUoUlRQS1RfVE9fT1NQS1QocFBhY2tldCksIE1FTV9BTExPQ19GTEFHKTsKKwlpZiAoc2tiKQorCXsKKwkJc2tiLT5kZXYgPSBnZXRfbmV0ZGV2X2Zyb21fYnNzaWQocEFkLCBGcm9tV2hpY2hCU1NJRCk7CisJCXBSZXRQYWNrZXQgPSBPU1BLVF9UT19SVFBLVChza2IpOworCX0KKworCXJldHVybiBwUmV0UGFja2V0OworCit9CisKK1BORElTX1BBQ0tFVCBkdXBsaWNhdGVfcGt0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCXBIZWFkZXI4MDJfMywKKyAgICBJTiAgVUlOVCAgICAgICAgICAgIEhkckxlbiwKKwlJTglQVUNIQVIJCQlwRGF0YSwKKwlJTglVTE9ORwkJCURhdGFTaXplLAorCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpCit7CisJc3RydWN0IHNrX2J1ZmYJKnNrYjsKKwlQTkRJU19QQUNLRVQJcFBhY2tldCA9IE5VTEw7CisKKworCWlmICgoc2tiID0gX19kZXZfYWxsb2Nfc2tiKEhkckxlbiArIERhdGFTaXplICsgMiwgTUVNX0FMTE9DX0ZMQUcpKSAhPSBOVUxMKQorCXsKKwkJc2tiX3Jlc2VydmUoc2tiLCAyKTsKKwkJTmRpc01vdmVNZW1vcnkoc2tiLT50YWlsLCBwSGVhZGVyODAyXzMsIEhkckxlbik7CisJCXNrYl9wdXQoc2tiLCBIZHJMZW4pOworCQlOZGlzTW92ZU1lbW9yeShza2ItPnRhaWwsIHBEYXRhLCBEYXRhU2l6ZSk7CisJCXNrYl9wdXQoc2tiLCBEYXRhU2l6ZSk7CisJCXNrYi0+ZGV2ID0gZ2V0X25ldGRldl9mcm9tX2Jzc2lkKHBBZCwgRnJvbVdoaWNoQlNTSUQpOworCQlwUGFja2V0ID0gT1NQS1RfVE9fUlRQS1Qoc2tiKTsKKwl9CisKKwlyZXR1cm4gcFBhY2tldDsKK30KKworCisjZGVmaW5lIFRLSVBfVFhfTUlDX1NJWkUJCTgKK1BORElTX1BBQ0tFVCBkdXBsaWNhdGVfcGt0X3dpdGhfVEtJUF9NSUMoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUE5ESVNfUEFDS0VUCXBQYWNrZXQpCit7CisJc3RydWN0IHNrX2J1ZmYJKnNrYiwgKm5ld3NrYjsKKworCisJc2tiID0gUlRQS1RfVE9fT1NQS1QocFBhY2tldCk7CisJaWYgKHNrYl90YWlscm9vbShza2IpIDwgVEtJUF9UWF9NSUNfU0laRSkKKwl7CisJCS8vIGFsbG9jIGEgbmV3IHNrYiBhbmQgY29weSB0aGUgcGFja2V0CisJCW5ld3NrYiA9IHNrYl9jb3B5X2V4cGFuZChza2IsIHNrYl9oZWFkcm9vbShza2IpLCBUS0lQX1RYX01JQ19TSVpFLCBHRlBfQVRPTUlDKTsKKwkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwkJaWYgKG5ld3NrYiA9PSBOVUxMKQorCQl7CisJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJFeHRlbmQgVHguTUlDIGZvciBwYWNrZXQgZmFpbGVkISwgZHJvcHBpbmcgcGFja2V0IVxuIikpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJc2tiID0gbmV3c2tiOworCX0KKworCXJldHVybiBPU1BLVF9UT19SVFBLVChza2IpOworfQorCisKKworCitQTkRJU19QQUNLRVQgQ2xvbmVQYWNrZXQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUE5ESVNfUEFDS0VUCXBQYWNrZXQsCisJSU4JUFVDSEFSCQkJcERhdGEsCisJSU4JVUxPTkcJCQlEYXRhU2l6ZSkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZgkqcFJ4UGt0OworCXN0cnVjdCBza19idWZmCSpwQ2xvbmVkUGt0OworCisJQVNTRVJUKHBQYWNrZXQpOworCXBSeFBrdCA9IFJUUEtUX1RPX09TUEtUKHBQYWNrZXQpOworCisJLy8gY2xvbmUgdGhlIHBhY2tldAorCXBDbG9uZWRQa3QgPSBza2JfY2xvbmUocFJ4UGt0LCBNRU1fQUxMT0NfRkxBRyk7CisKKwlpZiAocENsb25lZFBrdCkKKwl7CisgICAgCS8vIHNldCB0aGUgY29ycmVjdCBkYXRhcHRyIGFuZCBkYXRhIGxlbgorICAgIAlwQ2xvbmVkUGt0LT5kZXYgPSBwUnhQa3QtPmRldjsKKyAgICAJcENsb25lZFBrdC0+ZGF0YSA9IHBEYXRhOworICAgIAlwQ2xvbmVkUGt0LT5sZW4gPSBEYXRhU2l6ZTsKKyAgICAJcENsb25lZFBrdC0+dGFpbCA9IHBDbG9uZWRQa3QtPmRhdGEgKyBwQ2xvbmVkUGt0LT5sZW47CisJCUFTU0VSVChEYXRhU2l6ZSA8IDE1MzApOworCX0KKwlyZXR1cm4gcENsb25lZFBrdDsKK30KKworLy8KKy8vIGNoYW5nZSBPUyBwYWNrZXQgRGF0YVB0ciBhbmQgRGF0YUxlbgorLy8KK3ZvaWQgIHVwZGF0ZV9vc19wYWNrZXRfaW5mbygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglSWF9CTEsJCQkqcFJ4QmxrLAorCUlOICBVQ0hBUgkJCUZyb21XaGljaEJTU0lEKQoreworCXN0cnVjdCBza19idWZmCSpwT1NQa3Q7CisKKwlBU1NFUlQocFJ4QmxrLT5wUnhQYWNrZXQpOworCXBPU1BrdCA9IFJUUEtUX1RPX09TUEtUKHBSeEJsay0+cFJ4UGFja2V0KTsKKworCXBPU1BrdC0+ZGV2ID0gZ2V0X25ldGRldl9mcm9tX2Jzc2lkKHBBZCwgRnJvbVdoaWNoQlNTSUQpOworCXBPU1BrdC0+ZGF0YSA9IHBSeEJsay0+cERhdGE7CisJcE9TUGt0LT5sZW4gPSBwUnhCbGstPkRhdGFTaXplOworCXBPU1BrdC0+dGFpbCA9IHBPU1BrdC0+ZGF0YSArIHBPU1BrdC0+bGVuOworfQorCisKK3ZvaWQgd2xhbl84MDJfMTFfdG9fODAyXzNfcGFja2V0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVJYX0JMSwkJCSpwUnhCbGssCisJSU4JUFVDSEFSCQkJcEhlYWRlcjgwMl8zLAorCUlOICBVQ0hBUgkJCUZyb21XaGljaEJTU0lEKQoreworCXN0cnVjdCBza19idWZmCSpwT1NQa3Q7CisKKwlBU1NFUlQocFJ4QmxrLT5wUnhQYWNrZXQpOworCUFTU0VSVChwSGVhZGVyODAyXzMpOworCisJcE9TUGt0ID0gUlRQS1RfVE9fT1NQS1QocFJ4QmxrLT5wUnhQYWNrZXQpOworCisJcE9TUGt0LT5kZXYgPSBnZXRfbmV0ZGV2X2Zyb21fYnNzaWQocEFkLCBGcm9tV2hpY2hCU1NJRCk7CisJcE9TUGt0LT5kYXRhID0gcFJ4QmxrLT5wRGF0YTsKKwlwT1NQa3QtPmxlbiA9IHBSeEJsay0+RGF0YVNpemU7CisJcE9TUGt0LT50YWlsID0gcE9TUGt0LT5kYXRhICsgcE9TUGt0LT5sZW47CisKKwkvLworCS8vIGNvcHkgODAyLjMgaGVhZGVyCisJLy8KKwkvLworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJTmRpc01vdmVNZW1vcnkoc2tiX3B1c2gocE9TUGt0LCBMRU5HVEhfODAyXzMpLCBwSGVhZGVyODAyXzMsIExFTkdUSF84MDJfMyk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJfQorCisKKwordm9pZCBhbm5vdW5jZV84MDJfM19wYWNrZXQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUE5ESVNfUEFDS0VUCXBQYWNrZXQpCit7CisKKwlzdHJ1Y3Qgc2tfYnVmZgkqcFJ4UGt0OworCisJQVNTRVJUKHBQYWNrZXQpOworCisJcFJ4UGt0ID0gUlRQS1RfVE9fT1NQS1QocFBhY2tldCk7CisKKyAgICAvKiBQdXNoIHVwIHRoZSBwcm90b2NvbCBzdGFjayAqLworI2lmZGVmIElLQU5PU19WWF8xWDAKKwlJS0FOT1NfRGF0YUZyYW1lUngocEFkLCBwUnhQa3QtPmRldiwgcFJ4UGt0LCBwUnhQa3QtPmxlbik7CisjZWxzZQorCXBSeFBrdC0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhwUnhQa3QsIHBSeFBrdC0+ZGV2KTsKKworCW5ldGlmX3J4KHBSeFBrdCk7CisjZW5kaWYgLy8gSUtBTk9TX1ZYXzFYMCAvLworfQorCisKK1BSVE1QX1NDQVRURVJfR0FUSEVSX0xJU1QKK3J0X2dldF9zZ19saXN0X2Zyb21fcGFja2V0KFBORElTX1BBQ0tFVCBwUGFja2V0LCBSVE1QX1NDQVRURVJfR0FUSEVSX0xJU1QgKnNnKQoreworCXNnLT5OdW1iZXJPZkVsZW1lbnRzID0gMTsKKwlzZy0+RWxlbWVudHNbMF0uQWRkcmVzcyA9ICBHRVRfT1NfUEtUX0RBVEFQVFIocFBhY2tldCk7CisJc2ctPkVsZW1lbnRzWzBdLkxlbmd0aCA9IEdFVF9PU19QS1RfTEVOKHBQYWNrZXQpOworCXJldHVybiAoc2cpOworfQorCit2b2lkIGhleF9kdW1wKGNoYXIgKnN0ciwgdW5zaWduZWQgY2hhciAqcFNyY0J1ZlZBLCB1bnNpZ25lZCBpbnQgU3JjQnVmTGVuKQoreworCXVuc2lnbmVkIGNoYXIgKnB0OworCWludCB4OworCisJaWYgKFJURGVidWdMZXZlbCA8IFJUX0RFQlVHX1RSQUNFKQorCQlyZXR1cm47CisKKwlwdCA9IHBTcmNCdWZWQTsKKwlwcmludGsoIiVzOiAlcCwgbGVuID0gJWRcbiIsc3RyLCAgcFNyY0J1ZlZBLCBTcmNCdWZMZW4pOworCWZvciAoeD0wOyB4PFNyY0J1ZkxlbjsgeCsrKQorCXsKKwkJaWYgKHggJSAxNiA9PSAwKQorCQkJcHJpbnRrKCIweCUwNHggOiAiLCB4KTsKKwkJcHJpbnRrKCIlMDJ4ICIsICgodW5zaWduZWQgY2hhcilwdFt4XSkpOworCQlpZiAoeCUxNiA9PSAxNSkgcHJpbnRrKCJcbiIpOworCX0KKwlwcmludGsoIlxuIik7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlTZW5kIGxvZyBtZXNzYWdlIHRocm91Z2ggd2lyZWxlc3MgZXZlbnQKKworCQlTdXBwb3J0IHN0YW5kYXJkIGl3X2V2ZW50IHdpdGggSVdFVkNVU1RPTS4gSXQgaXMgdXNlZCBiZWxvdy4KKworCQlpd3JlcV9kYXRhLmRhdGEuZmxhZ3MgaXMgdXNlZCB0byBzdG9yZSBldmVudF9mbGFnIHRoYXQgaXMgZGVmaW5lZCBieSB1c2VyLgorCQlpd3JlcV9kYXRhLmRhdGEubGVuZ3RoIGlzIHRoZSBsZW5ndGggb2YgdGhlIGV2ZW50IGxvZy4KKworCQlUaGUgZm9ybWF0IG9mIHRoZSBldmVudCBsb2cgaXMgY29tcG9zZWQgb2YgdGhlIGVudHJ5J3MgTUFDIGFkZHJlc3MgYW5kCisJCXRoZSBkZXNpcmVkIGxvZyBtZXNzYWdlIChyZWZlciB0byBwV2lyZWxlc3NFdmVudFRleHQpLgorCisJCQlleDogMTE6MjI6MzM6NDQ6NTU6NjYgaGFzIGFzc29jaWF0ZWQgc3VjY2Vzc2Z1bGx5CisKKwkJcC5zLiBUaGUgcmVxdWlyZW1lbnQgb2YgV2lyZWxlc3MgRXh0ZW5zaW9uIGlzIHYxNSBvciBuZXdlci4KKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgUlRNUFNlbmRXaXJlbGVzc0V2ZW50KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVTSE9SVAkJCUV2ZW50X2ZsYWcsCisJSU4JUFVDSEFSIAkJCXBBZGRyLAorCUlOCVVDSEFSCQkJQnNzSWR4LAorCUlOCUNIQVIJCQlSc3NpKQoreworI2lmIFdJUkVMRVNTX0VYVCA+PSAxNQorCisJdW5pb24gCWl3cmVxX2RhdGEgICAgICB3cnF1OworCVBVQ0hBUiAJcEJ1ZiA9IE5VTEwsIHBCdWZQdHIgPSBOVUxMOworCVVTSE9SVAlldmVudCwgdHlwZSwgQnVmTGVuOworCVVDSEFSCWV2ZW50X3RhYmxlX2xlbiA9IDA7CisKKwl0eXBlID0gRXZlbnRfZmxhZyAmIDB4RkYwMDsKKwlldmVudCA9IEV2ZW50X2ZsYWcgJiAweDAwRkY7CisKKwlzd2l0Y2ggKHR5cGUpCisJeworCQljYXNlIElXX1NZU19FVkVOVF9GTEFHX1NUQVJUOgorCQkJZXZlbnRfdGFibGVfbGVuID0gSVdfU1lTX0VWRU5UX1RZUEVfTlVNOworCQkJYnJlYWs7CisKKwkJY2FzZSBJV19TUE9PRl9FVkVOVF9GTEFHX1NUQVJUOgorCQkJZXZlbnRfdGFibGVfbGVuID0gSVdfU1BPT0ZfRVZFTlRfVFlQRV9OVU07CisJCQlicmVhazsKKworCQljYXNlIElXX0ZMT09EX0VWRU5UX0ZMQUdfU1RBUlQ6CisJCQlldmVudF90YWJsZV9sZW4gPSBJV19GTE9PRF9FVkVOVF9UWVBFX05VTTsKKwkJCWJyZWFrOworCX0KKworCWlmIChldmVudF90YWJsZV9sZW4gPT0gMCkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzIDogVGhlIHR5cGUoJTB4MDJ4KSBpcyBub3QgdmFsaWQuXG4iLCBfX2Z1bmNfXywgdHlwZSkpOworCQlyZXR1cm47CisJfQorCisJaWYgKGV2ZW50ID49IGV2ZW50X3RhYmxlX2xlbikKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzIDogVGhlIGV2ZW50KCUweDAyeCkgaXMgbm90IHZhbGlkLlxuIiwgX19mdW5jX18sIGV2ZW50KSk7CisJCXJldHVybjsKKwl9CisKKwkvL0FsbG9jYXRlIG1lbW9yeSBhbmQgY29weSB0aGUgbXNnLgorCWlmKChwQnVmID0ga21hbGxvYyhJV19DVVNUT01fTUFYX0xFTiwgR0ZQX0FUT01JQykpICE9IE5VTEwpCisJeworCQkvL1ByZXBhcmUgdGhlIHBheWxvYWQKKwkJbWVtc2V0KHBCdWYsIDAsIElXX0NVU1RPTV9NQVhfTEVOKTsKKworCQlwQnVmUHRyID0gcEJ1ZjsKKworCQlpZiAocEFkZHIpCisJCQlwQnVmUHRyICs9IHNwcmludGYocEJ1ZlB0ciwgIihSVDI4NjApIFNUQSglMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCkgIiwgUFJJTlRfTUFDKHBBZGRyKSk7CisJCWVsc2UgaWYgKEJzc0lkeCA8IE1BWF9NQlNTSURfTlVNKQorCQkJcEJ1ZlB0ciArPSBzcHJpbnRmKHBCdWZQdHIsICIoUlQyODYwKSBCU1MocmElZCkgIiwgQnNzSWR4KTsKKwkJZWxzZQorCQkJcEJ1ZlB0ciArPSBzcHJpbnRmKHBCdWZQdHIsICIoUlQyODYwKSAiKTsKKworCQlpZiAodHlwZSA9PSBJV19TWVNfRVZFTlRfRkxBR19TVEFSVCkKKwkJCXBCdWZQdHIgKz0gc3ByaW50ZihwQnVmUHRyLCAiJXMiLCBwV2lyZWxlc3NTeXNFdmVudFRleHRbZXZlbnRdKTsKKwkJZWxzZSBpZiAodHlwZSA9PSBJV19TUE9PRl9FVkVOVF9GTEFHX1NUQVJUKQorCQkJcEJ1ZlB0ciArPSBzcHJpbnRmKHBCdWZQdHIsICIlcyAoUlNTST0lZCkiLCBwV2lyZWxlc3NTcG9vZkV2ZW50VGV4dFtldmVudF0sIFJzc2kpOworCQllbHNlIGlmICh0eXBlID09IElXX0ZMT09EX0VWRU5UX0ZMQUdfU1RBUlQpCisJCQlwQnVmUHRyICs9IHNwcmludGYocEJ1ZlB0ciwgIiVzIiwgcFdpcmVsZXNzRmxvb2RFdmVudFRleHRbZXZlbnRdKTsKKwkJZWxzZQorCQkJcEJ1ZlB0ciArPSBzcHJpbnRmKHBCdWZQdHIsICIlcyIsICJ1bmtub3duIGV2ZW50Iik7CisKKwkJcEJ1ZlB0cltwQnVmUHRyIC0gcEJ1Zl0gPSAnXDAnOworCQlCdWZMZW4gPSBwQnVmUHRyIC0gcEJ1ZjsKKworCQltZW1zZXQoJndycXUsIDAsIHNpemVvZih3cnF1KSk7CisJICAgIHdycXUuZGF0YS5mbGFncyA9IEV2ZW50X2ZsYWc7CisJCXdycXUuZGF0YS5sZW5ndGggPSBCdWZMZW47CisKKwkJLy9zZW5kIHdpcmVsZXNzIGV2ZW50CisJICAgIHdpcmVsZXNzX3NlbmRfZXZlbnQocEFkLT5uZXRfZGV2LCBJV0VWQ1VTVE9NLCAmd3JxdSwgcEJ1Zik7CisKKwkJLy9EQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcyA6ICVzXG4iLCBfX2Z1bmNfXywgcEJ1ZikpOworCisJCWtmcmVlKHBCdWYpOworCX0KKwllbHNlCisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzIDogQ2FuJ3QgYWxsb2NhdGUgbWVtb3J5IGZvciB3aXJlbGVzcyBldmVudC5cbiIsIF9fZnVuY19fKSk7CisjZWxzZQorCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzIDogVGhlIFdpcmVsZXNzIEV4dGVuc2lvbiBNVVNUIGJlIHYxNSBvciBuZXdlci5cbiIsIF9fZnVuY19fKSk7CisjZW5kaWYgIC8qIFdJUkVMRVNTX0VYVCA+PSAxNSAqLworfQorCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKK3ZvaWQgc2VuZF9tb25pdG9yX3BhY2tldHMoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUlhfQkxLCQkJKnBSeEJsaykKK3sKKyAgICBzdHJ1Y3Qgc2tfYnVmZgkqcE9TUGt0OworICAgIHdsYW5fbmdfcHJpc20yX2hlYWRlciAqcGg7CisgICAgaW50IHJhdGVfaW5kZXggPSAwOworICAgIFVTSE9SVCBoZWFkZXJfbGVuID0gMDsKKyAgICBVQ0hBUiB0ZW1wX2hlYWRlcls0MF0gPSB7MH07CisKKyAgICB1X2ludDMyX3QgcmFsaW5rcmF0ZVsyNTZdID0gezIsNCwxMSwyMiwgMTIsMTgsMjQsMzYsNDgsNzIsOTYsICAxMDgsICAgMTA5LCAxMTAsIDExMSwgMTEyLCAxMywgMjYsIDM5LCA1Miw3OCwxMDQsIDExNywgMTMwLCAyNiwgNTIsIDc4LDEwNCwgMTU2LCAyMDgsIDIzNCwgMjYwLCAyNywgNTQsODEsMTA4LDE2MiwgMjE2LCAyNDMsIDI3MCwgLy8gTGFzdCAzOAorCTU0LCAxMDgsIDE2MiwgMjE2LCAzMjQsIDQzMiwgNDg2LCA1NDAsICAxNCwgMjksIDQzLCA1NywgODcsIDExNSwgMTMwLCAxNDQsIDI5LCA1OSw4NywxMTUsIDE3MywgMjMwLDI2MCwgMjg4LCAzMCwgNjAsOTAsMTIwLDE4MCwyNDAsMjcwLDMwMCw2MCwxMjAsMTgwLDI0MCwzNjAsNDgwLDU0MCw2MDAsIDAsMSwyLDMsNCw1LDYsNyw4LDksMTAsCisJMTEsMTIsMTMsMTQsMTUsMTYsMTcsMTgsMTksMjAsMjEsMjIsMjMsMjQsMjUsMjYsMjcsMjgsMjksMzAsMzEsMzIsMzMsMzQsMzUsMzYsMzcsMzgsMzksNDAsNDEsNDIsNDMsNDQsNDUsNDYsNDcsNDgsNDksNTAsNTEsNTIsNTMsNTQsNTUsNTYsNTcsNTgsNTksNjAsNjEsNjIsNjMsNjQsNjUsNjYsNjcsNjgsNjksNzAsNzEsNzIsNzMsNzQsNzUsNzYsNzcsNzgsNzksODB9OworCisKKyAgICBBU1NFUlQocFJ4QmxrLT5wUnhQYWNrZXQpOworICAgIGlmIChwUnhCbGstPkRhdGFTaXplIDwgMTApCisgICAgeworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlcyA6IFNpemUgaXMgdG9vIHNtYWxsISAoJWQpXG4iLCBfX2Z1bmNfXywgcFJ4QmxrLT5EYXRhU2l6ZSkpOworCQlnb3RvIGVycl9mcmVlX3NrX2J1ZmY7CisgICAgfQorCisgICAgaWYgKHBSeEJsay0+RGF0YVNpemUgKyBzaXplb2Yod2xhbl9uZ19wcmlzbTJfaGVhZGVyKSA+IFJYX0JVRkZFUl9BR0dSRVNJWkUpCisgICAgeworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlcyA6IFNpemUgaXMgdG9vIGxhcmdlISAoJWQpXG4iLCBfX2Z1bmNfXywgcFJ4QmxrLT5EYXRhU2l6ZSArIHNpemVvZih3bGFuX25nX3ByaXNtMl9oZWFkZXIpKSk7CisJCWdvdG8gZXJyX2ZyZWVfc2tfYnVmZjsKKyAgICB9CisKKyAgICBwT1NQa3QgPSBSVFBLVF9UT19PU1BLVChwUnhCbGstPnBSeFBhY2tldCk7CisJcE9TUGt0LT5kZXYgPSBnZXRfbmV0ZGV2X2Zyb21fYnNzaWQocEFkLCBCU1MwKTsKKyAgICBpZiAocFJ4QmxrLT5wSGVhZGVyLT5GQy5UeXBlID09IEJUWVBFX0RBVEEpCisgICAgeworICAgICAgICBwUnhCbGstPkRhdGFTaXplIC09IExFTkdUSF84MDJfMTE7CisgICAgICAgIGlmICgocFJ4QmxrLT5wSGVhZGVyLT5GQy5Ub0RzID09IDEpICYmCisgICAgICAgICAgICAocFJ4QmxrLT5wSGVhZGVyLT5GQy5GckRzID09IDEpKQorICAgICAgICAgICAgaGVhZGVyX2xlbiA9IExFTkdUSF84MDJfMTFfV0lUSF9BRERSNDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgaGVhZGVyX2xlbiA9IExFTkdUSF84MDJfMTE7CisKKyAgICAgICAgLy8gUU9TCisgICAgCWlmIChwUnhCbGstPnBIZWFkZXItPkZDLlN1YlR5cGUgJiAweDA4KQorICAgIAl7CisgICAgCSAgICBoZWFkZXJfbGVuICs9IDI7CisgICAgCQkvLyBEYXRhIHNraXAgUU9TIGNvbnRvcmwgZmllbGQKKyAgICAJCXBSeEJsay0+RGF0YVNpemUgLT0yOworICAgIAl9CisKKyAgICAJLy8gT3JkZXIgYml0OiBBLVJhbGluayBvciBIVEMrCisgICAgCWlmIChwUnhCbGstPnBIZWFkZXItPkZDLk9yZGVyKQorICAgIAl7CisgICAgCSAgICBoZWFkZXJfbGVuICs9IDQ7CisJCQkvLyBEYXRhIHNraXAgSFRDIGNvbnRvcmwgZmllbGQKKwkJCXBSeEJsay0+RGF0YVNpemUgLT0gNDsKKyAgICAJfQorCisgICAgICAgIC8vIENvcHkgSGVhZGVyCisgICAgICAgIGlmIChoZWFkZXJfbGVuIDw9IDQwKQorICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkodGVtcF9oZWFkZXIsIHBSeEJsay0+cERhdGEsIGhlYWRlcl9sZW4pOworCisgICAgICAgIC8vIHNraXAgSFcgcGFkZGluZworICAgIAlpZiAocFJ4QmxrLT5SeEQuTDJQQUQpCisgICAgCSAgICBwUnhCbGstPnBEYXRhICs9IChoZWFkZXJfbGVuICsgMik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHBSeEJsay0+cERhdGEgKz0gaGVhZGVyX2xlbjsKKyAgICB9IC8vZW5kIGlmCisKKworCWlmIChwUnhCbGstPkRhdGFTaXplIDwgcE9TUGt0LT5sZW4pIHsKKyAgICAgICAgc2tiX3RyaW0ocE9TUGt0LHBSeEJsay0+RGF0YVNpemUpOworICAgIH0gZWxzZSB7CisgICAgICAgIHNrYl9wdXQocE9TUGt0LChwUnhCbGstPkRhdGFTaXplIC0gcE9TUGt0LT5sZW4pKTsKKyAgICB9IC8vZW5kIGlmCisKKyAgICBpZiAoKHBSeEJsay0+cERhdGEgLSBwT1NQa3QtPmRhdGEpID4gMCkgeworCSAgICBza2JfcHV0KHBPU1BrdCwocFJ4QmxrLT5wRGF0YSAtIHBPU1BrdC0+ZGF0YSkpOworCSAgICBza2JfcHVsbChwT1NQa3QsKHBSeEJsay0+cERhdGEgLSBwT1NQa3QtPmRhdGEpKTsKKyAgICB9IC8vZW5kIGlmCisKKyAgICBpZiAoc2tiX2hlYWRyb29tKHBPU1BrdCkgPCAoc2l6ZW9mKHdsYW5fbmdfcHJpc20yX2hlYWRlcikrIGhlYWRlcl9sZW4pKSB7CisgICAgICAgIGlmIChwc2tiX2V4cGFuZF9oZWFkKHBPU1BrdCwgKHNpemVvZih3bGFuX25nX3ByaXNtMl9oZWFkZXIpICsgaGVhZGVyX2xlbiksIDAsIEdGUF9BVE9NSUMpKSB7CisJICAgICAgICBEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlcyA6IFJlYWxsb2NhdGUgaGVhZGVyIHNpemUgb2Ygc2tfYnVmZiBmYWlsIVxuIiwgX19mdW5jX18pKTsKKwkJCWdvdG8gZXJyX2ZyZWVfc2tfYnVmZjsKKwkgICAgfSAvL2VuZCBpZgorICAgIH0gLy9lbmQgaWYKKworICAgIGlmIChoZWFkZXJfbGVuID4gMCkKKyAgICAgICAgTmRpc01vdmVNZW1vcnkoc2tiX3B1c2gocE9TUGt0LCBoZWFkZXJfbGVuKSwgdGVtcF9oZWFkZXIsIGhlYWRlcl9sZW4pOworCisgICAgcGggPSAod2xhbl9uZ19wcmlzbTJfaGVhZGVyICopIHNrYl9wdXNoKHBPU1BrdCwgc2l6ZW9mKHdsYW5fbmdfcHJpc20yX2hlYWRlcikpOworCU5kaXNaZXJvTWVtb3J5KHBoLCBzaXplb2Yod2xhbl9uZ19wcmlzbTJfaGVhZGVyKSk7CisKKyAgICBwaC0+bXNnY29kZQkJICAgID0gRElEbXNnX2xueGluZF93bGFuc25pZmZybTsKKwlwaC0+bXNnbGVuCQkgICAgPSBzaXplb2Yod2xhbl9uZ19wcmlzbTJfaGVhZGVyKTsKKwlzdHJjcHkocGgtPmRldm5hbWUsIHBBZC0+bmV0X2Rldi0+bmFtZSk7CisKKyAgICBwaC0+aG9zdHRpbWUuZGlkID0gRElEbXNnX2xueGluZF93bGFuc25pZmZybV9ob3N0dGltZTsKKwlwaC0+aG9zdHRpbWUuc3RhdHVzID0gMDsKKwlwaC0+aG9zdHRpbWUubGVuID0gNDsKKwlwaC0+aG9zdHRpbWUuZGF0YSA9IGppZmZpZXM7CisKKwlwaC0+bWFjdGltZS5kaWQgPSBESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX21hY3RpbWU7CisJcGgtPm1hY3RpbWUuc3RhdHVzID0gMDsKKwlwaC0+bWFjdGltZS5sZW4gPSAwOworCXBoLT5tYWN0aW1lLmRhdGEgPSAwOworCisgICAgcGgtPmlzdHguZGlkID0gRElEbXNnX2xueGluZF93bGFuc25pZmZybV9pc3R4OworCXBoLT5pc3R4LnN0YXR1cyA9IDA7CisJcGgtPmlzdHgubGVuID0gMDsKKwlwaC0+aXN0eC5kYXRhID0gMDsKKworICAgIHBoLT5jaGFubmVsLmRpZCA9IERJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm1fY2hhbm5lbDsKKwlwaC0+Y2hhbm5lbC5zdGF0dXMgPSAwOworCXBoLT5jaGFubmVsLmxlbiA9IDQ7CisKKyAgICBwaC0+Y2hhbm5lbC5kYXRhID0gKHVfaW50MzJfdClwQWQtPkNvbW1vbkNmZy5DaGFubmVsOworCisgICAgcGgtPnJzc2kuZGlkID0gRElEbXNnX2xueGluZF93bGFuc25pZmZybV9yc3NpOworCXBoLT5yc3NpLnN0YXR1cyA9IDA7CisJcGgtPnJzc2kubGVuID0gNDsKKyAgICBwaC0+cnNzaS5kYXRhID0gKHVfaW50MzJfdClSVE1QTWF4UnNzaShwQWQsIENvbnZlcnRUb1Jzc2kocEFkLCBwUnhCbGstPnBSeFdJLT5SU1NJMCwgUlNTSV8wKSwgQ29udmVydFRvUnNzaShwQWQsIHBSeEJsay0+cFJ4V0ktPlJTU0kxLCBSU1NJXzEpLCBDb252ZXJ0VG9Sc3NpKHBBZCwgcFJ4QmxrLT5wUnhXSS0+UlNTSTIsIFJTU0lfMikpOzsKKworCXBoLT5zaWduYWwuZGlkID0gRElEbXNnX2xueGluZF93bGFuc25pZmZybV9zaWduYWw7CisJcGgtPnNpZ25hbC5zdGF0dXMgPSAwOworCXBoLT5zaWduYWwubGVuID0gNDsKKwlwaC0+c2lnbmFsLmRhdGEgPSAwOyAvL3Jzc2kgKyBub2lzZTsKKworCXBoLT5ub2lzZS5kaWQgPSBESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX25vaXNlOworCXBoLT5ub2lzZS5zdGF0dXMgPSAwOworCXBoLT5ub2lzZS5sZW4gPSA0OworCXBoLT5ub2lzZS5kYXRhID0gMDsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorICAgIGlmIChwUnhCbGstPnBSeFdJLT5QSFlNT0RFID49IE1PREVfSFRNSVgpCisgICAgeworICAgIAlyYXRlX2luZGV4ID0gMTYgKyAoKFVDSEFSKXBSeEJsay0+cFJ4V0ktPkJXICoxNikgKyAoKFVDSEFSKXBSeEJsay0+cFJ4V0ktPlNob3J0R0kgKjMyKSArICgoVUNIQVIpcFJ4QmxrLT5wUnhXSS0+TUNTKTsKKyAgICB9CisgICAgZWxzZQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCWlmIChwUnhCbGstPnBSeFdJLT5QSFlNT0RFID09IE1PREVfT0ZETSkKKyAgICAJcmF0ZV9pbmRleCA9IChVQ0hBUikocFJ4QmxrLT5wUnhXSS0+TUNTKSArIDQ7CisgICAgZWxzZQorICAgIAlyYXRlX2luZGV4ID0gKFVDSEFSKShwUnhCbGstPnBSeFdJLT5NQ1MpOworICAgIGlmIChyYXRlX2luZGV4IDwgMCkKKyAgICAgICAgcmF0ZV9pbmRleCA9IDA7CisgICAgaWYgKHJhdGVfaW5kZXggPiAyNTUpCisgICAgICAgIHJhdGVfaW5kZXggPSAyNTU7CisKKwlwaC0+cmF0ZS5kaWQgPSBESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX3JhdGU7CisJcGgtPnJhdGUuc3RhdHVzID0gMDsKKwlwaC0+cmF0ZS5sZW4gPSA0OworICAgIHBoLT5yYXRlLmRhdGEgPSByYWxpbmtyYXRlW3JhdGVfaW5kZXhdOworCisJcGgtPmZybWxlbi5kaWQgPSBESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX2ZybWxlbjsKKyAgICBwaC0+ZnJtbGVuLnN0YXR1cyA9IDA7CisJcGgtPmZybWxlbi5sZW4gPSA0OworCXBoLT5mcm1sZW4uZGF0YQk9ICh1X2ludDMyX3QpcFJ4QmxrLT5EYXRhU2l6ZTsKKworCisgICAgcE9TUGt0LT5wa3RfdHlwZSA9IFBBQ0tFVF9PVEhFUkhPU1Q7CisgICAgcE9TUGt0LT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHBPU1BrdCwgcE9TUGt0LT5kZXYpOworICAgIHBPU1BrdC0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsKKyAgICBuZXRpZl9yeChwT1NQa3QpOworCisgICAgcmV0dXJuOworCitlcnJfZnJlZV9za19idWZmOgorCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhCbGstPnBSeFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJcmV0dXJuOworCit9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwordm9pZCBydG1wX29zX3RocmVhZF9pbml0KFBVQ0hBUiBwVGhyZWFkTmFtZSwgUFZPSUQgcE5vdGlmeSkKK3sKKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDUsMCkKKwlkYWVtb25pemUocFRocmVhZE5hbWUgLyoiJXMiLHBBZC0+bmV0X2Rldi0+bmFtZSovKTsKKworCWFsbG93X3NpZ25hbChTSUdURVJNKTsKKwlhbGxvd19zaWduYWwoU0lHS0lMTCk7CisJY3VycmVudC0+ZmxhZ3MgfD0gUEZfTk9GUkVFWkU7CisjZWxzZQorCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlkYWVtb25pemUoKTsKKwlyZXBhcmVudF90b19pbml0KCk7CisJc3RyY3B5KGN1cnJlbnQtPmNvbW0sIHBUaHJlYWROYW1lKTsKKworCXNpZ2luaXRzZXRpbnYoJmN1cnJlbnQtPmJsb2NrZWQsIHNpZ21hc2soU0lHVEVSTSkgfCBzaWdtYXNrKFNJR0tJTEwpKTsKKworCS8qIEFsbG93IGludGVyY2VwdGlvbiBvZiBTSUdLSUxMIG9ubHkKKwkgKiBEb24ndCBhbGxvdyBvdGhlciBzaWduYWxzIHRvIGludGVycnVwdCB0aGUgdHJhbnNtaXNzaW9uICovCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw0LDIyKQorCXNwaW5fbG9ja19pcnFzYXZlKCZjdXJyZW50LT5zaWdtYXNrX2xvY2ssIGZsYWdzKTsKKwlmbHVzaF9zaWduYWxzKGN1cnJlbnQpOworCXJlY2FsY19zaWdwZW5kaW5nKGN1cnJlbnQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmN1cnJlbnQtPnNpZ21hc2tfbG9jaywgZmxhZ3MpOworI2VuZGlmCisjZW5kaWYKKworICAgIC8qIHNpZ25hbCB0aGF0IHdlJ3ZlIHN0YXJ0ZWQgdGhlIHRocmVhZCAqLworCWNvbXBsZXRlKHBOb3RpZnkpOworCit9CisKK3ZvaWQgUlRNUF9JbmRpY2F0ZU1lZGlhU3RhdGUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQpCit7CisJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJXaXJlbGVzc0V2ZW50KQorCXsKKwkJaWYgKHBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID09IE5kaXNNZWRpYVN0YXRlQ29ubmVjdGVkKQorCQl7CisJCQlSVE1QU2VuZFdpcmVsZXNzRXZlbnQocEFkLCBJV19TVEFfTElOS1VQX0VWRU5UX0ZMQUcsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQWRkciwgQlNTMCwgMCk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlSVE1QU2VuZFdpcmVsZXNzRXZlbnQocEFkLCBJV19TVEFfTElOS0RPV05fRVZFTlRfRkxBRywgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5BZGRyLCBCU1MwLCAwKTsKKwkJfQorCX0KK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydF9saW51eC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydF9saW51eC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmZDU4ZjUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0X2xpbnV4LmgKQEAgLTAsMCArMSw5MjYgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgUHJvZ3JhbTogICAgcnRfbGludXguYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgQ3JlYXRlZDogICAgNC8yMS8yMDA2IDE6MTc6MzggUE0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgQXV0aG9yOiAgICAgV3UgWGktS3VuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgQ29tbWVudHM6ICAgYGRlc2NyaXB0aW9uYCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEhpc3Rvcnk6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIFJldmlzaW9uIDEuMSA0LzIxLzIwMDYgMToxNzozOCBQTSAgeHNpa3VuICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEluaXRpYWwgcmV2aXNpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgInJ0bXBfdHlwZS5oIgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKworI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CisjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKworCisjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KKyNpbmNsdWRlIDxuZXQvaXdfaGFuZGxlci5oPgorCisvLyBsb2FkIGZpcm13YXJlCisjZGVmaW5lIF9fS0VSTkVMX1NZU0NBTExTX18KKyNpbmNsdWRlIDxsaW51eC91bmlzdGQuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisKKyNkZWZpbmUgTUVNX0FMTE9DX0ZMQUcgICAgICAoR0ZQX0FUT01JQykgLy8oR0ZQX0RNQSB8IEdGUF9BVE9NSUMpCisKKyNpZm5kZWYgSUZOQU1TSVoKKyNkZWZpbmUgSUZOQU1TSVogMTYKKyNlbmRpZgorCisvLyNkZWZpbmUgQ09ORklHX0NLSVBfU1VQUE9SVAorCisjdW5kZWYgX19pbmxpbmUKKyNkZWZpbmUgX19pbmxpbmUJICAgc3RhdGljIGlubGluZQorCit0eXBlZGVmIGludCAoKkhBUkRfU1RBUlRfWE1JVF9GVU5DKShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2Rldik7CisKKy8vIGFkZCBieSBrYXRoeQorCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisjaWZkZWYgUlQyODYwCisjZGVmaW5lIFNUQV9QUk9GSUxFX1BBVEgJCQkiL2V0Yy9XaXJlbGVzcy9SVDI4NjBTVEEvUlQyODYwU1RBLmRhdCIKKyNkZWZpbmUgU1RBX1JUTVBfRklSTVdBUkVfRklMRV9OQU1FICIvZXRjL1dpcmVsZXNzL1JUMjg2MFNUQS9SVDI4NjBTVEEuYmluIgorI2RlZmluZSBTVEFfTklDX0RFVklDRV9OQU1FCQkJIlJUMjg2MFNUQSIKKyNkZWZpbmUgU1RBX0RSSVZFUl9WRVJTSU9OCQkJIjEuOC4wLjAiCisjaWZkZWYgTVVMVElQTEVfQ0FSRF9TVVBQT1JUCisjZGVmaW5lIENBUkRfSU5GT19QQVRICQkJIi9ldGMvV2lyZWxlc3MvUlQyODYwU1RBL1JUMjg2MFNUQUNhcmQuZGF0IgorI2VuZGlmIC8vIE1VTFRJUExFX0NBUkRfU1VQUE9SVCAvLworI2VuZGlmIC8vIFJUMjg2MCAvLworCisKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworI2lmZGVmIFJUMjg2MAorI2lmbmRlZiBQQ0lfREVWSUNFCisjZGVmaW5lIFBDSV9ERVZJQ0UodmVuZCxkZXYpIFwKKwkudmVuZG9yID0gKHZlbmQpLCAuZGV2aWNlID0gKGRldiksIFwKKwkuc3VidmVuZG9yID0gUENJX0FOWV9JRCwgLnN1YmRldmljZSA9IFBDSV9BTllfSUQKKyNlbmRpZiAvLyBQQ0lfREVWSUNFIC8vCisjZW5kaWYgLy8gUlQyODYwIC8vCisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApCisKKyNkZWZpbmUgUlRNUF9USU1FX0FGVEVSKGEsYikJCVwKKwkodHlwZWNoZWNrKHVuc2lnbmVkIGxvbmcsICh1bnNpZ25lZCBsb25nKWEpICYmIFwKKwkgdHlwZWNoZWNrKHVuc2lnbmVkIGxvbmcsICh1bnNpZ25lZCBsb25nKWIpICYmIFwKKwkgKChsb25nKShiKSAtIChsb25nKShhKSA8IDApKQorCisjZGVmaW5lIFJUTVBfVElNRV9BRlRFUl9FUShhLGIpCVwKKwkodHlwZWNoZWNrKHVuc2lnbmVkIGxvbmcsICh1bnNpZ25lZCBsb25nKWEpICYmIFwKKwkgdHlwZWNoZWNrKHVuc2lnbmVkIGxvbmcsICh1bnNpZ25lZCBsb25nKWIpICYmIFwKKwkgKChsb25nKShhKSAtIChsb25nKShiKSA+PSAwKSkKKyNkZWZpbmUgUlRNUF9USU1FX0JFRk9SRShhLGIpCVJUTVBfVElNRV9BRlRFUl9FUShiLGEpCisjZWxzZQorI2RlZmluZSBSVE1QX1RJTUVfQUZURVIoYSxiKSB0aW1lX2FmdGVyKGEsIGIpCisjZW5kaWYKKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDUsMCkKKyNkZWZpbmUgUlRfTU9EX0lOQ19VU0VfQ09VTlQoKSBcCisJaWYgKCF0cnlfbW9kdWxlX2dldChUSElTX01PRFVMRSkpIFwKKwl7IFwKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXM6IGNhbm5vdCByZXNlcnZlIG1vZHVsZVxuIiwgX19mdW5jX18pKTsgXAorCQlyZXR1cm4gLTE7IFwKKwl9CisKKyNkZWZpbmUgUlRfTU9EX0RFQ19VU0VfQ09VTlQoKSBtb2R1bGVfcHV0KFRISVNfTU9EVUxFKTsKKyNlbHNlCisjZGVmaW5lIFJUX01PRF9JTkNfVVNFX0NPVU5UKCkJTU9EX0lOQ19VU0VfQ09VTlQ7CisjZGVmaW5lIFJUX01PRF9ERUNfVVNFX0NPVU5UKCkgTU9EX0RFQ19VU0VfQ09VTlQ7CisjZW5kaWYKKworI2RlZmluZSBPU19IWgkJCUhaCisKKyNkZWZpbmUgRVRIX0xFTkdUSF9PRl9BRERSRVNTCTYKKworI2RlZmluZSBJTgorI2RlZmluZSBPVVQKKworI2RlZmluZSBORElTX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UCisjZGVmaW5lIE5ESVNfU1RBVFVTX1NVQ0NFU1MgICAgICAgICAgICAgICAgICAgICAweDAwCisjZGVmaW5lIE5ESVNfU1RBVFVTX0ZBSUxVUkUgICAgICAgICAgICAgICAgICAgICAweDAxCisjZGVmaW5lIE5ESVNfU1RBVFVTX0lOVkFMSURfREFUQQkJCQkweDAyCisjZGVmaW5lIE5ESVNfU1RBVFVTX1JFU09VUkNFUyAgICAgICAgICAgICAgICAgICAweDAzCisKKyNkZWZpbmUgTUlOX05FVF9ERVZJQ0VfRk9SX0FJRAkJCTB4MDAJCS8vMHgwMH4weDNmCisjZGVmaW5lIE1JTl9ORVRfREVWSUNFX0ZPUl9NQlNTSUQJCTB4MDAJCS8vMHgwMCwweDEwLDB4MjAsMHgzMAorI2RlZmluZSBNSU5fTkVUX0RFVklDRV9GT1JfV0RTCQkJMHgxMAkJLy8weDQwLDB4NTAsMHg2MCwweDcwCisjZGVmaW5lIE1JTl9ORVRfREVWSUNFX0ZPUl9BUENMSQkJMHgyMAorI2RlZmluZSBNSU5fTkVUX0RFVklDRV9GT1JfTUVTSAkJCTB4MzAKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKyNkZWZpbmUgTUlOX05FVF9ERVZJQ0VfRk9SX0RMUwkJCTB4NDAKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisjZGVmaW5lIE5ESVNfUEFDS0VUX1RZUEVfRElSRUNURUQJCTAKKyNkZWZpbmUgTkRJU19QQUNLRVRfVFlQRV9NVUxUSUNBU1QJCTEKKyNkZWZpbmUgTkRJU19QQUNLRVRfVFlQRV9CUk9BRENBU1QJCTIKKyNkZWZpbmUgTkRJU19QQUNLRVRfVFlQRV9BTExfTVVMVElDQVNUCTMKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMjcpCit0eXBlZGVmCXN0cnVjdCBwaWQgKglUSFJFQURfUElEOworI2RlZmluZQlUSFJFQURfUElEX0lOSVRfVkFMVUUJTlVMTAorI2RlZmluZQlHRVRfUElEKF92KQlmaW5kX2dldF9waWQoX3YpCisjZGVmaW5lCUdFVF9QSURfTlVNQkVSKF92KQlwaWRfbnIoX3YpCisjZGVmaW5lIENIRUNLX1BJRF9MRUdBTElUWShfcGlkKQlpZiAocGlkX25yKF9waWQpID49IDApCisjZGVmaW5lIEtJTExfVEhSRUFEX1BJRChfQSwgX0IsIF9DKQlraWxsX3BpZChfQSwgX0IsIF9DKQorI2Vsc2UKK3R5cGVkZWYJcGlkX3QJVEhSRUFEX1BJRDsKKyNkZWZpbmUJVEhSRUFEX1BJRF9JTklUX1ZBTFVFCS0xCisjZGVmaW5lCUdFVF9QSUQoX3YpCV92CisjZGVmaW5lCUdFVF9QSURfTlVNQkVSKF92KQlfdgorI2RlZmluZSBDSEVDS19QSURfTEVHQUxJVFkoX3BpZCkJaWYgKF9waWQgPj0gMCkKKyNkZWZpbmUgS0lMTF9USFJFQURfUElEKF9BLCBfQiwgX0MpCWtpbGxfcHJvYyhfQSwgX0IsIF9DKQorI2VuZGlmCisKK3N0cnVjdCBvc19sb2NrICB7CisJc3BpbmxvY2tfdAkJbG9jazsKKwl1bnNpZ25lZCBsb25nICAJZmxhZ3M7Cit9OworCisKK3N0cnVjdCBvc19jb29raWUgeworI2lmZGVmIFJUMjg2MAorCXN0cnVjdCBwY2lfZGV2IAkJCSpwY2lfZGV2OworCXN0cnVjdCBwY2lfZGV2IAkJCSpwYXJlbnRfcGNpX2RldjsKKwlkbWFfYWRkcl90CQkgIAkJcEFkX3BhOworI2VuZGlmIC8vIFJUMjg2MCAvLworCisKKwlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgCXJ4X2RvbmVfdGFzazsKKwlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgCW1nbXRfZG1hX2RvbmVfdGFzazsKKwlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgCWFjMF9kbWFfZG9uZV90YXNrOworCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCAJYWMxX2RtYV9kb25lX3Rhc2s7CisJc3RydWN0IHRhc2tsZXRfc3RydWN0IAlhYzJfZG1hX2RvbmVfdGFzazsKKwlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgCWFjM19kbWFfZG9uZV90YXNrOworCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCAJaGNjYV9kbWFfZG9uZV90YXNrOworCXN0cnVjdCB0YXNrbGV0X3N0cnVjdAl0YnR0X3Rhc2s7CisjaWZkZWYgUlQyODYwCisJc3RydWN0IHRhc2tsZXRfc3RydWN0CWZpZm9fc3RhdGlzdGljX2Z1bGxfdGFzazsKKyNlbmRpZiAvLyBSVDI4NjAgLy8KKworCisJdW5zaWduZWQgbG9uZwkJCWFwZF9waWQ7IC8vODAyLjF4IGRhZW1vbiBwaWQKKwlJTlQJCQkJCQlpb2N0bF9pZl90eXBlOworCUlOVCAJCQkJCWlvY3RsX2lmOworfTsKKwordHlwZWRlZiBzdHJ1Y3QgX1ZJUlRVQUxfQURBUFRFUgoreworCXN0cnVjdCBuZXRfZGV2aWNlCQkqUnRtcERldjsKKwlzdHJ1Y3QgbmV0X2RldmljZQkJKlZpcnR1YWxEZXY7Cit9IFZJUlRVQUxfQURBUFRFUiwgUFZJUlRVQUxfQURBUFRFUjsKKworI3VuZGVmICBBU1NFUlQKKyNkZWZpbmUgQVNTRVJUKHgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCEoeCkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBwcmludGsoS0VSTl9XQVJOSU5HIF9fRklMRV9fICI6JWQgYXNzZXJ0ICIgI3ggImZhaWxlZFxuIiwgX19MSU5FX18pOyAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKwordHlwZWRlZiBzdHJ1Y3Qgb3NfY29va2llCSogUE9TX0NPT0tJRTsKK3R5cGVkZWYgc3RydWN0IHBjaV9kZXYgCQkqIFBQQ0lfREVWOwordHlwZWRlZiBzdHJ1Y3QgbmV0X2RldmljZQkqIFBORVRfREVWOwordHlwZWRlZiB2b2lkCQkJCSogUE5ESVNfUEFDS0VUOwordHlwZWRlZiBjaGFyCQkJCU5ESVNfUEFDS0VUOwordHlwZWRlZiBQTkRJU19QQUNLRVQJCSogUFBORElTX1BBQ0tFVDsKK3R5cGVkZWYJZG1hX2FkZHJfdAkJCU5ESVNfUEhZU0lDQUxfQUREUkVTUzsKK3R5cGVkZWYJZG1hX2FkZHJfdAkJCSogUE5ESVNfUEhZU0lDQUxfQUREUkVTUzsKK3R5cGVkZWYgc3BpbmxvY2tfdAkJCU5ESVNfU1BJTl9MT0NLOwordHlwZWRlZiBzdHJ1Y3QgdGltZXJfbGlzdAlORElTX01JTklQT1JUX1RJTUVSOwordHlwZWRlZiB2b2lkCQkJCSogTkRJU19IQU5ETEU7Cit0eXBlZGVmIGNoYXIgCQkJCSogUE5ESVNfQlVGRkVSOworCisKKwordm9pZCBoZXhfZHVtcChjaGFyICpzdHIsIHVuc2lnbmVkIGNoYXIgKnBTcmNCdWZWQSwgdW5zaWduZWQgaW50IFNyY0J1Zkxlbik7CisKK2RtYV9hZGRyX3QgbGludXhfcGNpX21hcF9zaW5nbGUodm9pZCAqaGFuZGxlLCB2b2lkICpwdHIsIHNpemVfdCBzaXplLCBpbnQgc2RfaWR4LCBpbnQgZGlyZWN0aW9uKTsKK3ZvaWQgbGludXhfcGNpX3VubWFwX3NpbmdsZSh2b2lkICpoYW5kbGUsIGRtYV9hZGRyX3QgZG1hX2FkZHIsIHNpemVfdCBzaXplLCBpbnQgZGlyZWN0aW9uKTsKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBNT1ZFIFRPIHJ0bXAuaCA/CisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworI2RlZmluZSBQS1RTUkNfTkRJUyAgICAgICAgICAgICAweDdmCisjZGVmaW5lIFBLVFNSQ19EUklWRVIgICAgICAgICAgIDB4MGYKKyNkZWZpbmUgUFJJTlRfTUFDKGFkZHIpCVwKKwlhZGRyWzBdLCBhZGRyWzFdLCBhZGRyWzJdLCBhZGRyWzNdLCBhZGRyWzRdLCBhZGRyWzVdCisKKworI2RlZmluZSBSVDI4NjBfUENJX0RFVklDRV9JRAkJMHgwNjAxCisKKyNpZmRlZiBSVDI4NjAKKyNkZWZpbmUgUENJX01BUF9TSU5HTEUoX2hhbmRsZSwgX3B0ciwgX3NpemUsIF9zZF9pZHgsIF9kaXIpIFwKKwlsaW51eF9wY2lfbWFwX3NpbmdsZShfaGFuZGxlLCBfcHRyLCBfc2l6ZSwgX3NkX2lkeCwgX2RpcikKKworI2RlZmluZSBQQ0lfVU5NQVBfU0lOR0xFKF9oYW5kbGUsIF9wdHIsIF9zaXplLCBfZGlyKSBcCisJbGludXhfcGNpX3VubWFwX3NpbmdsZShfaGFuZGxlLCBfcHRyLCBfc2l6ZSwgX2RpcikKKworI2RlZmluZSBQQ0lfQUxMT0NfQ09OU0lTVEVOVChfcGNpX2RldiwgX3NpemUsIF9wdHIpIFwKKwlwY2lfYWxsb2NfY29uc2lzdGVudChfcGNpX2RldiwgX3NpemUsIF9wdHIpCisKKyNkZWZpbmUgUENJX0ZSRUVfQ09OU0lTVEVOVChfcGNpX2RldiwgX3NpemUsIF92aXJ0dWFsX2FkZHIsIF9waHlzaWNhbF9hZGRyKSBcCisJcGNpX2ZyZWVfY29uc2lzdGVudChfcGNpX2RldiwgX3NpemUsIF92aXJ0dWFsX2FkZHIsIF9waHlzaWNhbF9hZGRyKQorCisjZGVmaW5lIERFVl9BTExPQ19TS0IoX2xlbmd0aCkgXAorCWRldl9hbGxvY19za2IoX2xlbmd0aCkKKyNlbmRpZiAvLyBSVDI4NjAgLy8KKworCisKKyNkZWZpbmUgQkVBQ09OX0ZSQU1FX0RNQV9DQUNIRV9XQkFDSyhfcHRyLCBfc2l6ZSkJXAorCWRtYV9jYWNoZV93YmFjayhfcHRyLCBfc2l6ZSkKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCisjZGVmaW5lIE5kaXNNSW5kaWNhdGVTdGF0dXMoX3csIF94LCBfeSwgX3opCisKKwordHlwZWRlZiBzdHJ1Y3QgdGltZXJfbGlzdAlSVE1QX09TX1RJTUVSOworCisKKwordHlwZWRlZiBzdHJ1Y3QgIF9SQUxJTktfVElNRVJfU1RSVUNUICAgIHsKKyAgICBSVE1QX09TX1RJTUVSCQlUaW1lck9iajsgICAgICAgLy8gTmRpcyBUaW1lciBvYmplY3QKKwlCT09MRUFOCQkJCVZhbGlkOwkJCS8vIFNldCB0byBUcnVlIHdoZW4gY2FsbCBSVE1QSW5pdFRpbWVyCisgICAgQk9PTEVBTiAgICAgICAgICAgICBTdGF0ZTsgICAgICAgICAgLy8gVHJ1ZSBpZiB0aW1lciBjYW5jZWxsZWQKKyAgICBCT09MRUFOCSAgICAgIAkJUGVyaW9kaWNUeXBlOwkvLyBUcnVlIGlmIHRpbWVyIGlzIHBlcmlvZGljIHRpbWVyCisgICAgQk9PTEVBTiAgICAgICAgICAgICBSZXBlYXQ7ICAgICAgICAgLy8gVHJ1ZSBpZiBwZXJpb2RpYyB0aW1lcgorICAgIFVMT05HICAgICAgICAgICAgICAgVGltZXJWYWx1ZTsgICAgIC8vIFRpbWVyIHZhbHVlIGluIG1pbGxpc2Vjb25kcworCVVMT05HCQkJCWNvb2tpZTsJCQkvLyBvcyBzcGVjaWZpYyBvYmplY3QKK30gICBSQUxJTktfVElNRVJfU1RSVUNULCAqUFJBTElOS19USU1FUl9TVFJVQ1Q7CisKKworCisKKy8vI2RlZmluZSBEQkcJMQorCisvLworLy8gIE1BQ1JPIGZvciBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24KKy8vCisKKyNpZmRlZiBEQkcKK2V4dGVybiBVTE9ORyAgICBSVERlYnVnTGV2ZWw7CisKKyNkZWZpbmUgREJHUFJJTlRfUkFXKExldmVsLCBGbXQpICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoTGV2ZWwgPD0gUlREZWJ1Z0xldmVsKSAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcHJpbnRrIEZtdDsgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKyNkZWZpbmUgREJHUFJJTlQoTGV2ZWwsIEZtdCkgICAgREJHUFJJTlRfUkFXKExldmVsLCBGbXQpCisKKworI2RlZmluZSBEQkdQUklOVF9FUlIoRm10KSAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHByaW50aygiRVJST1IhISEgIik7ICAgICAgICAgIFwKKyAgICBwcmludGsgRm10OyAgICAgICAgICAgICAgICAgIFwKK30KKworI2RlZmluZSBEQkdQUklOVF9TKFN0YXR1cywgRm10KQkJXAorewkJCQkJCQkJCVwKKwlwcmludGsgRm10OwkJCQkJXAorfQorCisKKyNlbHNlCisjZGVmaW5lIERCR1BSSU5UKExldmVsLCBGbXQpCisjZGVmaW5lIERCR1BSSU5UX1JBVyhMZXZlbCwgRm10KQorI2RlZmluZSBEQkdQUklOVF9TKFN0YXR1cywgRm10KQorI2RlZmluZSBEQkdQUklOVF9FUlIoRm10KQorI2VuZGlmCisKKworLy8KKy8vICBzcGluX2xvY2sgZW5oYW5jZWQgZm9yIE5lc3RlZCBzcGluIGxvY2sKKy8vCisjZGVmaW5lIE5kaXNBbGxvY2F0ZVNwaW5Mb2NrKF9fbG9jaykgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHNwaW5fbG9ja19pbml0KChzcGlubG9ja190ICopKF9fbG9jaykpOyAgICAgICAgICAgICAgIFwKK30KKworI2RlZmluZSBOZGlzRnJlZVNwaW5Mb2NrKGxvY2spICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKworI2RlZmluZSBSVE1QX1NFTV9MT0NLKF9fbG9jaykJCQkJCVwKK3sJCQkJCQkJCQkJCQlcCisJc3Bpbl9sb2NrX2JoKChzcGlubG9ja190ICopKF9fbG9jaykpOwkJCQlcCit9CisKKyNkZWZpbmUgUlRNUF9TRU1fVU5MT0NLKF9fbG9jaykJCQkJCVwKK3sJCQkJCQkJCQkJCQlcCisJc3Bpbl91bmxvY2tfYmgoKHNwaW5sb2NrX3QgKikoX19sb2NrKSk7CQkJCVwKK30KKworLy8gc2FtcGxlLCB1c2Ugc2VtYXBob3JlIGxvY2sgdG8gcmVwbGFjZSBJUlEgbG9jaywgMjAwNy8xMS8xNQorI2RlZmluZSBSVE1QX0lSUV9MT0NLKF9fbG9jaywgX19pcnFmbGFncykJCQlcCit7CQkJCQkJCQkJCQkJCVwKKwlfX2lycWZsYWdzID0gMDsJCQkJCQkJCQlcCisJc3Bpbl9sb2NrX2JoKChzcGlubG9ja190ICopKF9fbG9jaykpOwkJCVwKKwlwQWQtPmlycV9kaXNhYmxlZCB8PSAxOyBcCit9CisKKyNkZWZpbmUgUlRNUF9JUlFfVU5MT0NLKF9fbG9jaywgX19pcnFmbGFnKQkJCVwKK3sJCQkJCQkJCQkJCQkJXAorCXBBZC0+aXJxX2Rpc2FibGVkICY9IDA7IFwKKwlzcGluX3VubG9ja19iaCgoc3BpbmxvY2tfdCAqKShfX2xvY2spKTsJCQlcCit9CisKKyNkZWZpbmUgUlRNUF9JTlRfTE9DSyhfX2xvY2ssIF9faXJxZmxhZ3MpCQkJXAorewkJCQkJCQkJCQkJCQlcCisJc3Bpbl9sb2NrX2lycXNhdmUoKHNwaW5sb2NrX3QgKilfX2xvY2ssIF9faXJxZmxhZ3MpOwlcCit9CisKKyNkZWZpbmUgUlRNUF9JTlRfVU5MT0NLKF9fbG9jaywgX19pcnFmbGFnKQkJCVwKK3sJCQkJCQkJCQkJCQkJXAorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoKHNwaW5sb2NrX3QgKikoX19sb2NrKSwgKCh1bnNpZ25lZCBsb25nKV9faXJxZmxhZykpOwlcCit9CisKKyNpZmRlZiBSVDI4NjAKKyNpZiBkZWZpbmVkKElORl9UV0lOUEFTUykgfHwgZGVmaW5lZChJTkZfREFOVUJFKSB8fCBkZWZpbmVkKElLQU5PU19WWF8xWDApCisvL1BhdGNoIGZvciBBU0lDIHR1cnN0IHJlYWQvd3JpdGUgYnVnLCBuZWVkcyB0byByZW1vdmUgYWZ0ZXIgbWV0ZWwgZml4CisjZGVmaW5lIFJUTVBfSU9fUkVBRDMyKF9BLCBfUiwgX3BWKQkJCQkJCQkJCVwKK3sJCQkJCQkJCQkJCQkJCQkJCVwKKyAgICBpZiAoKF9BKS0+YlBDSWNsa09mZiA9PSBGQUxTRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkoKl9wViA9IHJlYWRsKCh2b2lkICopKChfQSktPkNTUkJhc2VBZGRyZXNzICsgTUFDX0NTUjApKSk7CQlcCisJKCpfcFYgPSByZWFkbCgodm9pZCAqKSgoX0EpLT5DU1JCYXNlQWRkcmVzcyArIChfUikpKSk7CQkJXAorCSgqX3BWID0gU1dBUDMyKCooKFVJTlQzMiAqKShfcFYpKSkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKyNkZWZpbmUgUlRNUF9JT19SRUFEOChfQSwgX1IsIF9wVikJCQkJCQkJCQlcCit7CQkJCQkJCQkJCQkJCQkJCQlcCisJKCpfcFYgPSByZWFkbCgodm9pZCAqKSgoX0EpLT5DU1JCYXNlQWRkcmVzcyArIE1BQ19DU1IwKSkpOwkJXAorCSgqX3BWID0gcmVhZGIoKHZvaWQgKikoKF9BKS0+Q1NSQmFzZUFkZHJlc3MgKyAoX1IpKSkpOwkJCVwKK30KKyNkZWZpbmUgUlRNUF9JT19XUklURTMyKF9BLCBfUiwgX1YpCQkJCQkJCQkJXAorewkJCQkJCQkJCQkJCQkJCQkJXAorICAgIGlmICgoX0EpLT5iUENJY2xrT2ZmID09IEZBTFNFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCVVJTlQzMglfVmFsOwkJCQkJCQkJCQkJCQlcCisJX1ZhbCA9IHJlYWRsKCh2b2lkICopKChfQSktPkNTUkJhc2VBZGRyZXNzICsgTUFDX0NTUjApKTsJCVwKKwlfVmFsID0gU1dBUDMyKF9WKTsJCQkJCQkJCQkJCQlcCisJd3JpdGVsKF9WYWwsICh2b2lkICopKChfQSktPkNTUkJhc2VBZGRyZXNzICsgKF9SKSkpOwkJCVwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKyNkZWZpbmUgUlRNUF9JT19XUklURTgoX0EsIF9SLCBfVikJCQkJCQkJCQlcCit7CQkJCQkJCQkJCQkJCQkJCQlcCisJVUlOVAlWYWw7CQkJCQkJCQkJCQkJCVwKKwlWYWwgPSByZWFkbCgodm9pZCAqKSgoX0EpLT5DU1JCYXNlQWRkcmVzcyArIE1BQ19DU1IwKSk7CQlcCisJd3JpdGViKChfViksIChQVUNIQVIpKChfQSktPkNTUkJhc2VBZGRyZXNzICsgKF9SKSkpOwkJCVwKK30KKyNkZWZpbmUgUlRNUF9JT19XUklURTE2KF9BLCBfUiwgX1YpCQkJCQkJCQkJXAorewkJCQkJCQkJCQkJCQkJCQkJXAorCVVJTlQJVmFsOwkJCQkJCQkJCQkJCQlcCisJVmFsID0gcmVhZGwoKHZvaWQgKikoKF9BKS0+Q1NSQmFzZUFkZHJlc3MgKyBNQUNfQ1NSMCkpOwkJXAorCXdyaXRldyhTV0FQMTYoKF9WKSksIChQVVNIT1JUKSgoX0EpLT5DU1JCYXNlQWRkcmVzcyArIChfUikpKTsJXAorfQorI2Vsc2UKKy8vUGF0Y2ggZm9yIEFTSUMgdHVyc3QgcmVhZC93cml0ZSBidWcsIG5lZWRzIHRvIHJlbW92ZSBhZnRlciBtZXRlbCBmaXgKKyNkZWZpbmUgUlRNUF9JT19SRUFEMzIoX0EsIF9SLCBfcFYpCQkJCQkJCQlcCit7CQkJCQkJCQkJCQkJCQkJCVwKKyAgICBpZiAoKF9BKS0+YlBDSWNsa09mZiA9PSBGQUxTRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCSgqX3BWID0gcmVhZGwoKHZvaWQgKikoKF9BKS0+Q1NSQmFzZUFkZHJlc3MgKyBNQUNfQ1NSMCkpKTsJCVwKKwkJKCpfcFYgPSByZWFkbCgodm9pZCAqKSgoX0EpLT5DU1JCYXNlQWRkcmVzcyArIChfUikpKSk7CQkJXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZWxzZQkJCQkJCQkJCQkJCQkJCVwKKwkJKl9wViA9IDA7CQkJCQkJCQkJCQkJCVwKK30KKyNkZWZpbmUgUlRNUF9JT19SRUFEOChfQSwgX1IsIF9wVikJCQkJCQkJCVwKK3sJCQkJCQkJCQkJCQkJCQkJXAorCSgqX3BWID0gcmVhZGwoKHZvaWQgKikoKF9BKS0+Q1NSQmFzZUFkZHJlc3MgKyBNQUNfQ1NSMCkpKTsJCQlcCisJKCpfcFYgPSByZWFkYigodm9pZCAqKSgoX0EpLT5DU1JCYXNlQWRkcmVzcyArIChfUikpKSk7CQkJCVwKK30KKyNkZWZpbmUgUlRNUF9JT19XUklURTMyKF9BLCBfUiwgX1YpCQkJCQkJCQkJCQkJXAorewkJCQkJCQkJCQkJCQkJCQkJCQkJXAorICAgIGlmICgoX0EpLT5iUENJY2xrT2ZmID09IEZBTFNFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlVSU5UCVZhbDsJCQkJCQkJCQkJCQkJCQkJXAorCVZhbCA9IHJlYWRsKCh2b2lkICopKChfQSktPkNTUkJhc2VBZGRyZXNzICsgTUFDX0NTUjApKTsJCQlcCisJd3JpdGVsKF9WLCAodm9pZCAqKSgoX0EpLT5DU1JCYXNlQWRkcmVzcyArIChfUikpKTsJCQkJCQkJCVwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorI2lmIGRlZmluZWQoQlJDTV82MzU4KQorI2RlZmluZSBSVE1QX0lPX1dSSVRFOChfQSwgX1IsIF9WKSAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgIFwKKwlVTE9ORyBWYWw7ICAgICAgICAgICAgICAgIFwKKwlVQ0hBUiBfaTsgICAgICAgICAgICAgICAgXAorCV9pID0gKF9SICYgMHgzKTsgICAgICAgICAgICAgXAorCVZhbCA9IHJlYWRsKCh2b2lkICopKChfQSktPkNTUkJhc2VBZGRyZXNzICsgKF9SIC0gX2kpKSk7ICAgXAorCVZhbCA9IFZhbCAmICh+KDB4MDAwMDAwZmYgPDwgKChfaSkqOCkpKTsgICAgICAgICBcCisJVmFsID0gVmFsIHwgKChVTE9ORylfViA8PCAoKF9pKSo4KSk7ICAgICAgICAgXAorCXdyaXRlbCgoVmFsKSwgKHZvaWQgKikoKF9BKS0+Q1NSQmFzZUFkZHJlc3MgKyAoX1IgLSBfaSkpKTsgICAgXAorfQorI2Vsc2UKKyNkZWZpbmUgUlRNUF9JT19XUklURTgoX0EsIF9SLCBfVikJCQkJCQkJCQkJCQlcCit7CQkJCQkJCQkJCQkJCQkJCQkJCQlcCisJVUlOVAlWYWw7CQkJCQkJCQkJCQkJCQkJCVwKKwlWYWwgPSByZWFkbCgodm9pZCAqKSgoX0EpLT5DU1JCYXNlQWRkcmVzcyArIE1BQ19DU1IwKSk7CQkJXAorCXdyaXRlYigoX1YpLCAoUFVDSEFSKSgoX0EpLT5DU1JCYXNlQWRkcmVzcyArIChfUikpKTsJCVwKK30KKyNlbmRpZgorI2RlZmluZSBSVE1QX0lPX1dSSVRFMTYoX0EsIF9SLCBfVikJCQkJCQkJCQkJCQlcCit7CQkJCQkJCQkJCQkJCQkJCQkJCQlcCisJVUlOVAlWYWw7CQkJCQkJCQkJCQkJCQkJCVwKKwlWYWwgPSByZWFkbCgodm9pZCAqKSgoX0EpLT5DU1JCYXNlQWRkcmVzcyArIE1BQ19DU1IwKSk7CQkJXAorCXdyaXRldygoX1YpLCAoUFVTSE9SVCkoKF9BKS0+Q1NSQmFzZUFkZHJlc3MgKyAoX1IpKSk7CVwKK30KKyNlbmRpZgorI2VuZGlmIC8vIFJUMjg2MCAvLworCisKKyNpZm5kZWYgd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQKKyNkZWZpbmUgX193YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dCh3cSwgY29uZGl0aW9uLCByZXQpIFwKK2RvIHsgXAorICAgICAgICB3YWl0X3F1ZXVlX3QgX193YWl0OyBcCisgICAgICAgIGluaXRfd2FpdHF1ZXVlX2VudHJ5KCZfX3dhaXQsIGN1cnJlbnQpOyBcCisgICAgICAgIGFkZF93YWl0X3F1ZXVlKCZ3cSwgJl9fd2FpdCk7IFwKKyAgICAgICAgZm9yICg7OykgeyBcCisgICAgICAgICAgICAgICAgc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsgXAorICAgICAgICAgICAgICAgIGlmIChjb25kaXRpb24pIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyBcCisgICAgICAgICAgICAgICAgaWYgKCFzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeyBcCisgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSBzY2hlZHVsZV90aW1lb3V0KHJldCk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmV0KSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyBcCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsgXAorICAgICAgICAgICAgICAgIH0gXAorICAgICAgICAgICAgICAgIHJldCA9IC1FUkVTVEFSVFNZUzsgXAorICAgICAgICAgICAgICAgIGJyZWFrOyBcCisgICAgICAgIH0gXAorICAgICAgICBjdXJyZW50LT5zdGF0ZSA9IFRBU0tfUlVOTklORzsgXAorICAgICAgICByZW1vdmVfd2FpdF9xdWV1ZSgmd3EsICZfX3dhaXQpOyBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KHdxLCBjb25kaXRpb24sIHRpbWVvdXQpIFwKKyh7IFwKKyAgICAgICAgbG9uZyBfX3JldCA9IHRpbWVvdXQ7IFwKKyAgICAgICAgaWYgKCEoY29uZGl0aW9uKSkgXAorICAgICAgICAgICAgICAgIF9fd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQod3EsIGNvbmRpdGlvbiwgX19yZXQpOyBcCisgICAgICAgIF9fcmV0OyBcCit9KQorI2VuZGlmCisjZGVmaW5lIE9ORV9USUNLIDEKKyNkZWZpbmUgT1NfV0FJVChfdGltZSkgXAorewlpbnQgX2k7IFwKKwlsb25nIF9sb29wID0gKChfdGltZSkvKDEwMDAvT1NfSFopKSA+IDAgPyAoKF90aW1lKS8oMTAwMC9PU19IWikpIDogMTtcCisJd2FpdF9xdWV1ZV9oZWFkX3QgX3dhaXQ7IFwKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZfd2FpdCk7IFwKKwlmb3IgKF9pPTA7IF9pPChfbG9vcCk7IF9pKyspIFwKKwkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoX3dhaXQsIDAsIE9ORV9USUNLKTsgfQorCisKKy8qIE1vZGlmaWVkIGJ5IFd1IFhpLUt1biA0LzIxLzIwMDYgKi8KK3R5cGVkZWYgdm9pZCAoKlRJTUVSX0ZVTkNUSU9OKSh1bnNpZ25lZCBsb25nKTsKKworI2RlZmluZSBDT1BZX01BQ19BRERSKEFkZHIxLCBBZGRyMikgICAgICAgICAgICAgbWVtY3B5KChBZGRyMSksIChBZGRyMiksIE1BQ19BRERSX0xFTikKKworI2RlZmluZSBNbG1lQWxsb2NhdGVNZW1vcnkoX3BBZCwgX3BwVkEpIG9zX2FsbG9jX21lbShfcEFkLCBfcHBWQSwgTUdNVF9ETUFfQlVGRkVSX1NJWkUpCisjZGVmaW5lIE1sbWVGcmVlTWVtb3J5KF9wQWQsIF9wVkEpICAgICBvc19mcmVlX21lbShfcEFkLCBfcFZBKQorCisjaWZkZWYgUlQyODYwCisjZGVmaW5lIEJVSUxEX1RJTUVSX0ZVTkNUSU9OKF9mdW5jKQkJCQkJCQkJCQkJCVwKK3ZvaWQgbGludXhfIyNfZnVuYyh1bnNpZ25lZCBsb25nIGRhdGEpCQkJCQkJCQkJCQlcCit7CQkJCQkJCQkJCQkJCQkJCQkJCQlcCisJUFJBTElOS19USU1FUl9TVFJVQ1QJcFRpbWVyID0gKFBSQUxJTktfVElNRVJfU1RSVUNUKSBkYXRhOwkJCQlcCisJCQkJCQkJCQkJCQkJCQkJCQkJCVwKKwlfZnVuYyhOVUxMLCAoUFZPSUQpIHBUaW1lci0+Y29va2llLCBOVUxMLCBwVGltZXIpOyAJCQkJCQkJXAorCWlmIChwVGltZXItPlJlcGVhdCkJCQkJCQkJCQkJCQkJCQlcCisJCVJUTVBfT1NfQWRkX1RpbWVyKCZwVGltZXItPlRpbWVyT2JqLCBwVGltZXItPlRpbWVyVmFsdWUpOwkJCQlcCit9CisjZW5kaWYgLy8gUlQyODYwIC8vCisKKworCisjZGVmaW5lIERFQ0xBUkVfVElNRVJfRlVOQ1RJT04oX2Z1bmMpCQkJXAordm9pZCBsaW51eF8jI19mdW5jKHVuc2lnbmVkIGxvbmcgZGF0YSkKKworI2RlZmluZSBHRVRfVElNRVJfRlVOQ1RJT04oX2Z1bmMpCQkJCVwKKwkJbGludXhfIyNfZnVuYworCitERUNMQVJFX1RJTUVSX0ZVTkNUSU9OKE1sbWVQZXJpb2RpY0V4ZWMpOworREVDTEFSRV9USU1FUl9GVU5DVElPTihNbG1lUnNzaVJlcG9ydEV4ZWMpOworREVDTEFSRV9USU1FUl9GVU5DVElPTihBc2ljUnhBbnRFdmFsVGltZW91dCk7CitERUNMQVJFX1RJTUVSX0ZVTkNUSU9OKEFQU0RQZXJpb2RpY0V4ZWMpOworREVDTEFSRV9USU1FUl9GVU5DVElPTihBc2ljUmZUdW5pbmdFeGVjKTsKKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCitERUNMQVJFX1RJTUVSX0ZVTkNUSU9OKEJlYWNvblRpbWVvdXQpOworREVDTEFSRV9USU1FUl9GVU5DVElPTihTY2FuVGltZW91dCk7CitERUNMQVJFX1RJTUVSX0ZVTkNUSU9OKEF1dGhUaW1lb3V0KTsKK0RFQ0xBUkVfVElNRVJfRlVOQ1RJT04oQXNzb2NUaW1lb3V0KTsKK0RFQ0xBUkVfVElNRVJfRlVOQ1RJT04oUmVhc3NvY1RpbWVvdXQpOworREVDTEFSRV9USU1FUl9GVU5DVElPTihEaXNhc3NvY1RpbWVvdXQpOworREVDTEFSRV9USU1FUl9GVU5DVElPTihMaW5rRG93bkV4ZWMpOworI2lmZGVmIExFQVBfU1VQUE9SVAorREVDTEFSRV9USU1FUl9GVU5DVElPTihMZWFwQXV0aFRpbWVvdXQpOworI2VuZGlmCitERUNMQVJFX1RJTUVSX0ZVTkNUSU9OKFN0YVF1aWNrUmVzcG9uZUZvclJhdGVVcEV4ZWMpOworREVDTEFSRV9USU1FUl9GVU5DVElPTihXcGFEaXNhc3NvY0FwQW5kQmxvY2tBc3NvYyk7CitERUNMQVJFX1RJTUVSX0ZVTkNUSU9OKFBzUG9sbFdha2VFeGVjKTsKK0RFQ0xBUkVfVElNRVJfRlVOQ1RJT04oUmFkaW9PbkV4ZWMpOworCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCitERUNMQVJFX1RJTUVSX0ZVTkNUSU9OKERsc1RpbWVvdXRBY3Rpb24pOworI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCit2b2lkIFJUTVBfR2V0Q3VycmVudFN5c3RlbVRpbWUoTEFSR0VfSU5URUdFUiAqdGltZSk7CisKKworLyoKKyAqIHBhY2tldCBoZWxwZXIKKyAqIAktIGNvbnZlcnQgaW50ZXJuYWwgcnQgcGFja2V0IHRvIG9zIHBhY2tldCBvcgorICogICAgICAgICAgICAgb3MgcGFja2V0IHRvIHJ0IHBhY2tldAorICovCisjZGVmaW5lIFJUUEtUX1RPX09TUEtUKF9wKQkJKChzdHJ1Y3Qgc2tfYnVmZiAqKShfcCkpCisjZGVmaW5lIE9TUEtUX1RPX1JUUEtUKF9wKQkJKChQTkRJU19QQUNLRVQpKF9wKSkKKworI2RlZmluZSBHRVRfT1NfUEtUX0RBVEFQVFIoX3BrdCkgXAorCQkoUlRQS1RfVE9fT1NQS1QoX3BrdCktPmRhdGEpCisKKyNkZWZpbmUgR0VUX09TX1BLVF9MRU4oX3BrdCkgXAorCQkoUlRQS1RfVE9fT1NQS1QoX3BrdCktPmxlbikKKworI2RlZmluZSBHRVRfT1NfUEtUX0RBVEFUQUlMKF9wa3QpIFwKKwkJKFJUUEtUX1RPX09TUEtUKF9wa3QpLT50YWlsKQorCisjZGVmaW5lIEdFVF9PU19QS1RfSEVBRChfcGt0KSBcCisJCShSVFBLVF9UT19PU1BLVChfcGt0KS0+aGVhZCkKKworI2RlZmluZSBHRVRfT1NfUEtUX0VORChfcGt0KSBcCisJCShSVFBLVF9UT19PU1BLVChfcGt0KS0+ZW5kKQorCisjZGVmaW5lIEdFVF9PU19QS1RfTkVUREVWKF9wa3QpIFwKKwkJKFJUUEtUX1RPX09TUEtUKF9wa3QpLT5kZXYpCisKKyNkZWZpbmUgR0VUX09TX1BLVF9UWVBFKF9wa3QpIFwKKwkJKFJUUEtUX1RPX09TUEtUKF9wa3QpKQorCisjZGVmaW5lIEdFVF9PU19QS1RfTkVYVChfcGt0KSBcCisJCShSVFBLVF9UT19PU1BLVChfcGt0KS0+bmV4dCkKKworCisjZGVmaW5lIE9TX05UT0hTKF9WYWwpIFwKKwkJKG50b2hzKF9WYWwpKQorI2RlZmluZSBPU19IVE9OUyhfVmFsKSBcCisJCShodG9ucyhfVmFsKSkKKyNkZWZpbmUgT1NfTlRPSEwoX1ZhbCkgXAorCQkobnRvaGwoX1ZhbCkpCisjZGVmaW5lIE9TX0hUT05MKF9WYWwpIFwKKwkJKGh0b25sKF9WYWwpKQorCisvKiBzdGF0aXN0aWNzIGNvdW50ZXIgKi8KKyNkZWZpbmUgU1RBVFNfSU5DX1JYX1BBQ0tFVFMoX3BBZCwgX2RldikKKyNkZWZpbmUgU1RBVFNfSU5DX1RYX1BBQ0tFVFMoX3BBZCwgX2RldikKKworI2RlZmluZSBTVEFUU19JTkNfUlhfQllURVNTKF9wQWQsIF9kZXYsIGxlbikKKyNkZWZpbmUgU1RBVFNfSU5DX1RYX0JZVEVTUyhfcEFkLCBfZGV2LCBsZW4pCisKKyNkZWZpbmUgU1RBVFNfSU5DX1JYX0VSUk9SUyhfcEFkLCBfZGV2KQorI2RlZmluZSBTVEFUU19JTkNfVFhfRVJST1JTKF9wQWQsIF9kZXYpCisKKyNkZWZpbmUgU1RBVFNfSU5DX1JYX0RST1BQRUQoX3BBZCwgX2RldikKKyNkZWZpbmUgU1RBVFNfSU5DX1RYX0RST1BQRUQoX3BBZCwgX2RldikKKworCisjZGVmaW5lIENCX09GRiAgMTAKKworCisvLyAgIGNoZWNrIERESyBORElTX1BBQ0tFVCBkYXRhIHN0cnVjdHVyZSBhbmQgZmluZCBvdXQgb25seSBNaW5pcG9ydFJlc2VydmVkRXhbMC4uN10gY2FuIGJlIHVzZWQgYnkgb3VyIGRyaXZlciB3aXRob3V0CisvLyAgIGFtYmlndWl0eS4gRmllbGRzIGFmdGVyIHBQYWNrZXQtPk1pbmlwb3J0UmVzZXJ2ZWRFeFs4XSBtYXkgYmUgdXNlZCBieSBvdGhlciB3cmFwcGVyIGxheWVyIHRodXMgY3Jhc2hlcyB0aGUgZHJpdmVyCisvLworCisvLyBVc2VyIFByaW9yaXR5CisjZGVmaW5lIFJUTVBfU0VUX1BBQ0tFVF9VUChfcCwgX3ByaW8pCQkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzBdID0gX3ByaW8pCisjZGVmaW5lIFJUTVBfR0VUX1BBQ0tFVF9VUChfcCkJCQkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRiswXSkKKworLy8gRnJhZ21lbnQgIworI2RlZmluZSBSVE1QX1NFVF9QQUNLRVRfRlJBR01FTlRTKF9wLCBfbnVtKQkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzFdID0gX251bSkKKyNkZWZpbmUgUlRNUF9HRVRfUEFDS0VUX0ZSQUdNRU5UUyhfcCkJCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMV0pCisKKy8vIDB4MCB+MHg3ZjogVFggdG8gQVAncyBvd24gQlNTIHdoaWNoIGhhcyB0aGUgc3BlY2lmaWVkIEFJRC4gaWYgQUlEPjEyNywgc2V0IGJpdCA3IGluIFJUTVBfU0VUX1BBQ0tFVF9FTUFDVEFCIHRvby4KKy8vKHRoaXMgdmFsdWUgYWxzbyBhcyBNQUMob24tY2hpcCBXQ0lEKSB0YWJsZSBpbmRleCkKKy8vIDB4ODB+MHhmZjogVFggdG8gYSBXRFMgbGluay4gYjB+NjogV0RTIGluZGV4CisjZGVmaW5lIFJUTVBfU0VUX1BBQ0tFVF9XQ0lEKF9wLCBfd2RzaWR4KQkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzJdID0gX3dkc2lkeCkKKyNkZWZpbmUgUlRNUF9HRVRfUEFDS0VUX1dDSUQoX3ApICAgICAgICAgIAkJKChVQ0hBUikoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMl0pKQorCisvLyAweGZmOiBQS1RTUkNfTkRJUywgb3RoZXJzOiBsb2NhbCBUWCBidWZmZXIgaW5kZXguIFRoaXMgdmFsdWUgYWZmZWN0cyBob3cgdG8gYSBwYWNrZXQKKyNkZWZpbmUgUlRNUF9TRVRfUEFDS0VUX1NPVVJDRShfcCwgX3BrdHNyYykJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRiszXSA9IF9wa3RzcmMpCisjZGVmaW5lIFJUTVBfR0VUX1BBQ0tFVF9TT1VSQ0UoX3ApICAgICAgIAkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzNdKQorCisvLyBSVFMvQ1RTLXRvLXNlbGYgcHJvdGVjdGlvbiBtZXRob2QKKyNkZWZpbmUgUlRNUF9TRVRfUEFDS0VUX1JUUyhfcCwgX251bSkgICAgICAJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRis0XSA9IF9udW0pCisjZGVmaW5lIFJUTVBfR0VUX1BBQ0tFVF9SVFMoX3ApICAgICAgICAgIAkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzRdKQorLy8gc2VlIFJUTVBfUyhHKUVUX1BBQ0tFVF9FTUFDVEFCCisKKy8vIFRYIHJhdGUgaW5kZXgKKyNkZWZpbmUgUlRNUF9TRVRfUEFDS0VUX1RYUkFURShfcCwgX3JhdGUpCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrNV0gPSBfcmF0ZSkKKyNkZWZpbmUgUlRNUF9HRVRfUEFDS0VUX1RYUkFURShfcCkJCSAgCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrNV0pCisKKy8vIEZyb20gd2hpY2ggSW50ZXJmYWNlCisjZGVmaW5lIFJUTVBfU0VUX1BBQ0tFVF9JRihfcCwgX2lmZHgpCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrNl0gPSBfaWZkeCkKKyNkZWZpbmUgUlRNUF9HRVRfUEFDS0VUX0lGKF9wKQkJICAJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRis2XSkKKyNkZWZpbmUgUlRNUF9TRVRfUEFDS0VUX05FVF9ERVZJQ0VfTUJTU0lEKF9wLCBfYnNzKQkJUlRNUF9TRVRfUEFDS0VUX0lGKChfcCksIChfYnNzKSkKKyNkZWZpbmUgUlRNUF9TRVRfUEFDS0VUX05FVF9ERVZJQ0VfV0RTKF9wLCBfYnNzKQkJUlRNUF9TRVRfUEFDS0VUX0lGKChfcCksICgoX2JzcykgKyBNSU5fTkVUX0RFVklDRV9GT1JfV0RTKSkKKyNkZWZpbmUgUlRNUF9TRVRfUEFDS0VUX05FVF9ERVZJQ0VfQVBDTEkoX3AsIF9pZHgpICAgCVJUTVBfU0VUX1BBQ0tFVF9JRigoX3ApLCAoKF9pZHgpICsgTUlOX05FVF9ERVZJQ0VfRk9SX0FQQ0xJKSkKKyNkZWZpbmUgUlRNUF9TRVRfUEFDS0VUX05FVF9ERVZJQ0VfTUVTSChfcCwgX2lkeCkgICAJUlRNUF9TRVRfUEFDS0VUX0lGKChfcCksICgoX2lkeCkgKyBNSU5fTkVUX0RFVklDRV9GT1JfTUVTSCkpCisjZGVmaW5lIFJUTVBfR0VUX1BBQ0tFVF9ORVRfREVWSUNFX01CU1NJRChfcCkJCQlSVE1QX0dFVF9QQUNLRVRfSUYoKF9wKSkKKyNkZWZpbmUgUlRNUF9HRVRfUEFDS0VUX05FVF9ERVZJQ0UoX3ApCQkJCQlSVE1QX0dFVF9QQUNLRVRfSUYoKF9wKSkKKworI2RlZmluZSBSVE1QX1NFVF9QQUNLRVRfTU9SRURBVEEoX3AsIF9tb3JlYml0KQkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzddID0gX21vcmViaXQpCisjZGVmaW5lIFJUTVBfR0VUX1BBQ0tFVF9NT1JFREFUQShfcCkJCQkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzddKQorCisKKyNpZiAwCisvLyNkZWZpbmUgUlRNUF9TRVRfUEFDS0VUX0RIQ1AoX3AsIF9mbGcpICAgCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRisxMV0gPSBfZmxnKQorLy8jZGVmaW5lIFJUTVBfR0VUX1BBQ0tFVF9ESENQKF9wKSAgICAgICAgIAkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMTFdKQorI2Vsc2UKKy8vCisvLwlTZXBjaWZpYyBQYWtjZXQgVHlwZSBkZWZpbml0aW9uCisvLworI2RlZmluZSBSVE1QX1BBQ0tFVF9TUEVDSUZJQ19DQl9PRkZTRVQJMTEKKworI2RlZmluZSBSVE1QX1BBQ0tFVF9TUEVDSUZJQ19ESENQCQkweDAxCisjZGVmaW5lIFJUTVBfUEFDS0VUX1NQRUNJRklDX0VBUE9MCQkweDAyCisjZGVmaW5lIFJUTVBfUEFDS0VUX1NQRUNJRklDX0lQVjQJCTB4MDQKKyNkZWZpbmUgUlRNUF9QQUNLRVRfU1BFQ0lGSUNfV0FJCQkweDA4CisjZGVmaW5lIFJUTVBfUEFDS0VUX1NQRUNJRklDX1ZMQU4JCTB4MTAKKyNkZWZpbmUgUlRNUF9QQUNLRVRfU1BFQ0lGSUNfTExDU05BUAkweDIwCisKKy8vU3BlY2lmaWMKKyNkZWZpbmUgUlRNUF9TRVRfUEFDS0VUX1NQRUNJRklDKF9wLCBfZmxnKQkgICAJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzExXSA9IF9mbGcpCisKKy8vREhDUAorI2RlZmluZSBSVE1QX1NFVF9QQUNLRVRfREhDUChfcCwgX2ZsZykgICAJCQkJCQkJCQkJCQkJXAorCQkJZG97CQkJCQkJCQkJCQkJCQkJCQkJCQlcCisJCQkJaWYgKF9mbGcpCQkJCQkJCQkJCQkJCQkJCQlcCisJCQkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRisxMV0pIHw9IChSVE1QX1BBQ0tFVF9TUEVDSUZJQ19ESENQKTsJCVwKKwkJCQllbHNlCQkJCQkJCQkJCQkJCQkJCQkJXAorCQkJCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMTFdKSAmPSAoIVJUTVBfUEFDS0VUX1NQRUNJRklDX0RIQ1ApOwlcCisJCQl9d2hpbGUoMCkKKyNkZWZpbmUgUlRNUF9HRVRfUEFDS0VUX0RIQ1AoX3ApCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMTFdICYgUlRNUF9QQUNLRVRfU1BFQ0lGSUNfREhDUCkKKworLy9FQVBPTAorI2RlZmluZSBSVE1QX1NFVF9QQUNLRVRfRUFQT0woX3AsIF9mbGcpICAgCQkJCQkJCQkJCQkJCVwKKwkJCWRvewkJCQkJCQkJCQkJCQkJCQkJCQkJXAorCQkJCWlmIChfZmxnKQkJCQkJCQkJCQkJCQkJCQkJXAorCQkJCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMTFdKSB8PSAoUlRNUF9QQUNLRVRfU1BFQ0lGSUNfRUFQT0wpOwkJXAorCQkJCWVsc2UJCQkJCQkJCQkJCQkJCQkJCQlcCisJCQkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRisxMV0pICY9ICghUlRNUF9QQUNLRVRfU1BFQ0lGSUNfRUFQT0wpOwlcCisJCQl9d2hpbGUoMCkKKyNkZWZpbmUgUlRNUF9HRVRfUEFDS0VUX0VBUE9MKF9wKQkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzExXSAmIFJUTVBfUEFDS0VUX1NQRUNJRklDX0VBUE9MKQorCisvL1dBSQorI2RlZmluZSBSVE1QX1NFVF9QQUNLRVRfV0FJKF9wLCBfZmxnKSAgIAkJCQkJCQkJCQkJCQlcCisJCQlkb3sJCQkJCQkJCQkJCQkJCQkJCQkJCVwKKwkJCQlpZiAoX2ZsZykJCQkJCQkJCQkJCQkJCQkJCVwKKwkJCQkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzExXSkgfD0gKFJUTVBfUEFDS0VUX1NQRUNJRklDX1dBSSk7CQlcCisJCQkJZWxzZQkJCQkJCQkJCQkJCQkJCQkJCVwKKwkJCQkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzExXSkgJj0gKCFSVE1QX1BBQ0tFVF9TUEVDSUZJQ19XQUkpOwlcCisJCQl9d2hpbGUoMCkKKyNkZWZpbmUgUlRNUF9HRVRfUEFDS0VUX1dBSShfcCkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRisxMV0gJiBSVE1QX1BBQ0tFVF9TUEVDSUZJQ19XQUkpCisKKyNkZWZpbmUgUlRNUF9HRVRfUEFDS0VUX0xPV1JBVEUoX3ApCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMTFdICYgKFJUTVBfUEFDS0VUX1NQRUNJRklDX0VBUE9MIHwgUlRNUF9QQUNLRVRfU1BFQ0lGSUNfREhDUCB8IFJUTVBfUEFDS0VUX1NQRUNJRklDX1dBSSkpCisKKy8vVkxBTgorI2RlZmluZSBSVE1QX1NFVF9QQUNLRVRfVkxBTihfcCwgX2ZsZykgICAJCQkJCQkJCQkJCQkJXAorCQkJZG97CQkJCQkJCQkJCQkJCQkJCQkJCQlcCisJCQkJaWYgKF9mbGcpCQkJCQkJCQkJCQkJCQkJCQlcCisJCQkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRisxMV0pIHw9IChSVE1QX1BBQ0tFVF9TUEVDSUZJQ19WTEFOKTsJCVwKKwkJCQllbHNlCQkJCQkJCQkJCQkJCQkJCQkJXAorCQkJCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMTFdKSAmPSAoIVJUTVBfUEFDS0VUX1NQRUNJRklDX1ZMQU4pOwlcCisJCQl9d2hpbGUoMCkKKyNkZWZpbmUgUlRNUF9HRVRfUEFDS0VUX1ZMQU4oX3ApCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMTFdICYgUlRNUF9QQUNLRVRfU1BFQ0lGSUNfVkxBTikKKworLy9MTEMvU05BUAorI2RlZmluZSBSVE1QX1NFVF9QQUNLRVRfTExDU05BUChfcCwgX2ZsZykgICAJCQkJCQkJCQkJCQkJXAorCQkJZG97CQkJCQkJCQkJCQkJCQkJCQkJCQlcCisJCQkJaWYgKF9mbGcpCQkJCQkJCQkJCQkJCQkJCQlcCisJCQkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRisxMV0pIHw9IChSVE1QX1BBQ0tFVF9TUEVDSUZJQ19MTENTTkFQKTsJCVwKKwkJCQllbHNlCQkJCQkJCQkJCQkJCQkJCQkJXAorCQkJCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMTFdKSAmPSAoIVJUTVBfUEFDS0VUX1NQRUNJRklDX0xMQ1NOQVApOwkJXAorCQkJfXdoaWxlKDApCisKKyNkZWZpbmUgUlRNUF9HRVRfUEFDS0VUX0xMQ1NOQVAoX3ApCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMTFdICYgUlRNUF9QQUNLRVRfU1BFQ0lGSUNfTExDU05BUCkKKworLy8gSVAKKyNkZWZpbmUgUlRNUF9TRVRfUEFDS0VUX0lQVjQoX3AsIF9mbGcpCQkJCQkJCQkJCQkJCQlcCisJCQlkb3sJCQkJCQkJCQkJCQkJCQkJCQkJCVwKKwkJCQlpZiAoX2ZsZykJCQkJCQkJCQkJCQkJCQkJCVwKKwkJCQkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzExXSkgfD0gKFJUTVBfUEFDS0VUX1NQRUNJRklDX0lQVjQpOwkJXAorCQkJCWVsc2UJCQkJCQkJCQkJCQkJCQkJCQlcCisJCQkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRisxMV0pICY9ICghUlRNUF9QQUNLRVRfU1BFQ0lGSUNfSVBWNCk7CVwKKwkJCX13aGlsZSgwKQorCisjZGVmaW5lIFJUTVBfR0VUX1BBQ0tFVF9JUFY0KF9wKQkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzExXSAmIFJUTVBfUEFDS0VUX1NQRUNJRklDX0lQVjQpCisKKyNlbmRpZgorCisKKy8vIElmIHRoaXMgZmxhZyBpcyBzZXQsIGl0IGluZGljYXRlcyB0aGF0IHRoaXMgRUFQb0wgZnJhbWUgTVVTVCBiZSBjbGVhci4KKyNkZWZpbmUgUlRNUF9TRVRfUEFDS0VUX0NMRUFSX0VBUF9GUkFNRShfcCwgX2ZsZykgICAoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMTJdID0gX2ZsZykKKyNkZWZpbmUgUlRNUF9HRVRfUEFDS0VUX0NMRUFSX0VBUF9GUkFNRShfcCkgICAgICAgICAoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMTJdKQorCisjZGVmaW5lIFJUTVBfU0VUX1BBQ0tFVF81VlQoX3AsIF9mbGcpICAgKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzIyXSA9IF9mbGcpCisjZGVmaW5lIFJUTVBfR0VUX1BBQ0tFVF81VlQoX3ApICAgICAgICAgKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzIyXSkKKworI2lmZGVmIENPTkZJR181VlRfRU5IQU5DRQorI2RlZmluZSBCUklER0VfVEFHIDB4MzU1NjQyNTIgICAgLy8gZGVwZW5kcyBvbiA1VlQgZGVmaW5lIGluIGJyX2lucHV0LmMKKyNlbmRpZgorCisKKyNkZWZpbmUgTkRJU19TRVRfUEFDS0VUX1NUQVRVUyhfcCwgX3N0YXR1cykKKworCisjZGVmaW5lIEdFVF9TR19MSVNUX0ZST01fUEFDS0VUKF9wLCBfc2MpCVwKKyAgICBydF9nZXRfc2dfbGlzdF9mcm9tX3BhY2tldChfcCwgX3NjKQorCisjZGVmaW5lIE5kaXNNb3ZlTWVtb3J5KERlc3RpbmF0aW9uLCBTb3VyY2UsIExlbmd0aCkgbWVtbW92ZShEZXN0aW5hdGlvbiwgU291cmNlLCBMZW5ndGgpCisjZGVmaW5lIE5kaXNaZXJvTWVtb3J5KERlc3RpbmF0aW9uLCBMZW5ndGgpICAgICAgICAgbWVtc2V0KERlc3RpbmF0aW9uLCAwLCBMZW5ndGgpCisjZGVmaW5lIE5kaXNGaWxsTWVtb3J5KERlc3RpbmF0aW9uLCBMZW5ndGgsIEZpbGwpICAgbWVtc2V0KERlc3RpbmF0aW9uLCBGaWxsLCBMZW5ndGgpCisjZGVmaW5lIE5kaXNFcXVhbE1lbW9yeShTb3VyY2UxLCBTb3VyY2UyLCBMZW5ndGgpICAgKCFtZW1jbXAoU291cmNlMSwgU291cmNlMiwgTGVuZ3RoKSkKKyNkZWZpbmUgUlRNUEVxdWFsTWVtb3J5KFNvdXJjZTEsIFNvdXJjZTIsIExlbmd0aCkJKCFtZW1jbXAoU291cmNlMSwgU291cmNlMiwgTGVuZ3RoKSkKKworCisjZGVmaW5lIFJUTVBfSU5DX1JFRihfQSkJCTAKKyNkZWZpbmUgUlRNUF9ERUNfUkVGKF9BKQkJMAorI2RlZmluZSBSVE1QX0dFVF9SRUYoX0EpCQkwCisKKworCisvKgorICogVUxPTkcKKyAqIFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzTG93KAorICogICBJTiBORElTX1BIWVNJQ0FMX0FERFJFU1MgIFBoeXNpY2FsQWRkcmVzcyk7CisgKi8KKyNkZWZpbmUgUlRNUF9HZXRQaHlzaWNhbEFkZHJlc3NMb3coUGh5c2ljYWxBZGRyZXNzKQkJKFBoeXNpY2FsQWRkcmVzcykKKworLyoKKyAqIFVMT05HCisgKiBSVE1QX0dldFBoeXNpY2FsQWRkcmVzc0hpZ2goCisgKiAgIElOIE5ESVNfUEhZU0lDQUxfQUREUkVTUyAgUGh5c2ljYWxBZGRyZXNzKTsKKyAqLworI2RlZmluZSBSVE1QX0dldFBoeXNpY2FsQWRkcmVzc0hpZ2goUGh5c2ljYWxBZGRyZXNzKQkJKDApCisKKy8qCisgKiBWT0lECisgKiBSVE1QX1NldFBoeXNpY2FsQWRkcmVzc0xvdygKKyAqICAgSU4gTkRJU19QSFlTSUNBTF9BRERSRVNTICBQaHlzaWNhbEFkZHJlc3MsCisgKiAgIElOIFVMT05HICBWYWx1ZSk7CisgKi8KKyNkZWZpbmUgUlRNUF9TZXRQaHlzaWNhbEFkZHJlc3NMb3coUGh5c2ljYWxBZGRyZXNzLCBWYWx1ZSkJXAorCQkJUGh5c2ljYWxBZGRyZXNzID0gVmFsdWU7CisKKy8qCisgKiBWT0lECisgKiBSVE1QX1NldFBoeXNpY2FsQWRkcmVzc0hpZ2goCisgKiAgIElOIE5ESVNfUEhZU0lDQUxfQUREUkVTUyAgUGh5c2ljYWxBZGRyZXNzLAorICogICBJTiBVTE9ORyAgVmFsdWUpOworICovCisjZGVmaW5lIFJUTVBfU2V0UGh5c2ljYWxBZGRyZXNzSGlnaChQaHlzaWNhbEFkZHJlc3MsIFZhbHVlKQorCisKKy8vQ09OVEFJTklOR19SRUNPUkQocEVudHJ5LCBORElTX1BBQ0tFVCwgTWluaXBvcnRSZXNlcnZlZEV4KTsKKyNkZWZpbmUgUVVFVUVfRU5UUllfVE9fUEFDS0VUKHBFbnRyeSkgXAorCShQTkRJU19QQUNLRVQpKHBFbnRyeSkKKworI2RlZmluZSBQQUNLRVRfVE9fUVVFVUVfRU5UUlkocFBhY2tldCkgXAorCShQUVVFVUVfRU5UUlkpKHBQYWNrZXQpCisKKworI2lmbmRlZiBDT05UQUlOSU5HX1JFQ09SRAorI2RlZmluZSBDT05UQUlOSU5HX1JFQ09SRChhZGRyZXNzLCB0eXBlLCBmaWVsZCkJCQlcCisoKHR5cGUgKikoKFBDSEFSKShhZGRyZXNzKSAtIG9mZnNldG9mKHR5cGUsIGZpZWxkKSkpCisjZW5kaWYKKworCisjZGVmaW5lIFJFTEVBU0VfTkRJU19QQUNLRVQoX3BBZCwgX3BQYWNrZXQsIF9TdGF0dXMpICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFJUTVBGcmVlTmRpc1BhY2tldChfcEFkLCBfcFBhY2tldCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKworI2RlZmluZSBTV0lUQ0hfUGh5QUIoX3BBQSwgX3BCQikgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBVTE9ORwlBQUJhc2VQYUhpZ2g7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFVMT05HCUFBQmFzZVBhTG93OyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBVTE9ORwlCQkJhc2VQYUhpZ2g7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFVMT05HCUJCQmFzZVBhTG93OyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBCQkJhc2VQYUhpZ2ggPSBSVE1QX0dldFBoeXNpY2FsQWRkcmVzc0hpZ2goX3BCQik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBCQkJhc2VQYUxvdyA9IFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzTG93KF9wQkIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQUFCYXNlUGFIaWdoID0gUlRNUF9HZXRQaHlzaWNhbEFkZHJlc3NIaWdoKF9wQUEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQUFCYXNlUGFMb3cgPSBSVE1QX0dldFBoeXNpY2FsQWRkcmVzc0xvdyhfcEFBKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFJUTVBfU2V0UGh5c2ljYWxBZGRyZXNzSGlnaChfcEFBLCBCQkJhc2VQYUhpZ2gpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgUlRNUF9TZXRQaHlzaWNhbEFkZHJlc3NMb3coX3BBQSwgQkJCYXNlUGFMb3cpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgUlRNUF9TZXRQaHlzaWNhbEFkZHJlc3NIaWdoKF9wQkIsIEFBQmFzZVBhSGlnaCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBSVE1QX1NldFBoeXNpY2FsQWRkcmVzc0xvdyhfcEJCLCBBQUJhc2VQYUxvdyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworCisjZGVmaW5lIE5kaXNXcml0ZUVycm9yTG9nRW50cnkoX2EsIF9iLCBfYywgX2QpCisjZGVmaW5lIE5kaXNNQWxsb2NhdGVNYXBSZWdpc3RlcnMoX2EsIF9iLCBfYywgX2QsIF9lKQkJTkRJU19TVEFUVVNfU1VDQ0VTUworCisKKyNkZWZpbmUgTmRpc0FjcXVpcmVTcGluTG9jawkJUlRNUF9TRU1fTE9DSworI2RlZmluZSBOZGlzUmVsZWFzZVNwaW5Mb2NrCQlSVE1QX1NFTV9VTkxPQ0sKKworc3RhdGljIGlubGluZSB2b2lkIE5kaXNHZXRTeXN0ZW1VcFRpbWUoVUxPTkcgKnRpbWUpCit7CisJKnRpbWUgPSBqaWZmaWVzOworfQorCisvL3BQYWNrZXQgPSBDT05UQUlOSU5HX1JFQ09SRChwRW50cnksIE5ESVNfUEFDS0VULCBNaW5pcG9ydFJlc2VydmVkRXgpOworI2RlZmluZSBRVUVVRV9FTlRSWV9UT19QS1QocEVudHJ5KSBcCisJCSgoUE5ESVNfUEFDS0VUKSAocEVudHJ5KSkKKworaW50IHJ0Mjh4eF9wYWNrZXRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKKworCisKK3ZvaWQgcnRtcF9vc190aHJlYWRfaW5pdChQVUNIQVIgcFRocmVhZE5hbWUsIFBWT0lEIHBOb3RpZnkpOworCisjaWZkZWYgUlQyODYwCisjaWYgIWRlZmluZWQoUENJX0NBUF9JRF9FWFApCisjZGVmaW5lIFBDSV9DQVBfSURfRVhQCQkJICAgIDB4MTAKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoUENJX0VYUF9MTktDVEwpCisjZGVmaW5lIFBDSV9FWFBfTE5LQ1RMCQkJICAgIDB4MTAKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoUENJX0NMQVNTX0JSSURHRV9QQ0kpCisjZGVmaW5lIFBDSV9DTEFTU19CUklER0VfUENJCQkweDA2MDQKKyNlbmRpZgorCisjZGVmaW5lIFBDSUJVU19JTlRFTF9WRU5ET1IgICAgICAgICAweDgwODYKKyNlbmRpZiAvLyBSVDI4NjAgLy8KKworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0X21haW5fZGV2LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0X21haW5fZGV2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzg3M2M0NwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRfbWFpbl9kZXYuYwpAQCAtMCwwICsxLDE2ODYgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgTW9kdWxlIE5hbWU6CisgICAgcnRfbWFpbl9kZXYuYworCisgICAgQWJzdHJhY3Q6CisgICAgQ3JlYXRlIGFuZCByZWdpc3RlciBuZXR3b3JrIGludGVyZmFjZS4KKworICAgIFJldmlzaW9uIEhpc3Rvcnk6CisgICAgV2hvICAgICAgICAgV2hlbiAgICAgICAgICAgIFdoYXQKKyAgICAtLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCVNhbXBsZQkJTWFyLzIxLzA3CQlNZXJnZSBSVDI4NzAgYW5kIFJUMjg2MCBkcml2ZXJzLgorKi8KKworI2luY2x1ZGUgInJ0X2NvbmZpZy5oIgorCisjZGVmaW5lIEZPUlRZX01IWl9JTlRPTEVSQU5UX0lOVEVSVkFMCSg2MCoxMDAwKSAvLyAxIG1pbgorCisjaWZkZWYgTVVMVElQTEVfQ0FSRF9TVVBQT1JUCisvLyByZWNvcmQgd2hldGhlciB0aGUgY2FyZCBpbiB0aGUgY2FyZCBsaXN0IGlzIHVzZWQgaW4gdGhlIGNhcmQgZmlsZQorVUlOVDggIE1DX0NhcmRVc2VkW01BWF9OVU1fT0ZfTVVMVElQTEVfQ0FSRF07CisvLyByZWNvcmQgdXNlZCBjYXJkIG1hYyBhZGRyZXNzIGluIHRoZSBjYXJkIGxpc3QKK3N0YXRpYyBVSU5UOCAgTUNfQ2FyZE1hY1tNQVhfTlVNX09GX01VTFRJUExFX0NBUkRdWzZdOworI2VuZGlmIC8vIE1VTFRJUExFX0NBUkRfU1VQUE9SVCAvLworCisjaWZkZWYgQ09ORklHX0FQU1RBX01JWEVEX1NVUFBPUlQKK1VJTlQzMiBDV19NQVhfSU5fQklUUzsKKyNlbmRpZiAvLyBDT05GSUdfQVBTVEFfTUlYRURfU1VQUE9SVCAvLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIFZhcmlhYmxlcyBVc2VkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvL3N0YXRpYyBSQUxJTktfVElNRVJfU1RSVUNUICAgICBQZXJpb2RpY1RpbWVyOworCitjaGFyICptYWMgPSAiIjsJCSAgIC8vIGRlZmF1bHQgMDA6MDA6MDA6MDA6MDA6MDAKK2NoYXIgKmhvc3RuYW1lID0gIiI7CQkgICAvLyBkZWZhdWx0IENNUEMKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPD0gS0VSTkVMX1ZFUlNJT04oMiw2LDEyKQorTU9EVUxFX1BBUk0gKG1hYywgInMiKTsKKyNlbHNlCittb2R1bGVfcGFyYW0gKG1hYywgY2hhcnAsIDApOworI2VuZGlmCitNT0RVTEVfUEFSTV9ERVNDIChtYWMsICJydDI4eHg6IHdpcmVsZXNzIG1hYyBhZGRyIik7CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJvdG90eXBlcyBvZiBGdW5jdGlvbnMgVXNlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmZGVmIERPVDExX05fU1VQUE9SVAorZXh0ZXJuIEJPT0xFQU4gYmFfcmVvcmRlcmluZ19yZXNvdXJjZV9pbml0KFBSVE1QX0FEQVBURVIgcEFkLCBpbnQgbnVtKTsKK2V4dGVybiB2b2lkIGJhX3Jlb3JkZXJpbmdfcmVzb3VyY2VfcmVsZWFzZShQUlRNUF9BREFQVEVSIHBBZCk7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCitleHRlcm4gTkRJU19TVEFUVVMgTklDTG9hZFJhdGVTd2l0Y2hpbmdQYXJhbXMoSU4gUFJUTVBfQURBUFRFUiBwQWQpOworCisjaWZkZWYgUlQyODYwCitleHRlcm4gdm9pZCBpbml0X3RocmVhZF90YXNrKFBSVE1QX0FEQVBURVIgcEFkKTsKKyNlbmRpZiAvLyBSVDI4NjAgLy8KKworLy8gcHVibGljIGZ1bmN0aW9uIHByb3RvdHlwZQorSU5UIF9fZGV2aW5pdCBydDI4eHhfcHJvYmUoSU4gdm9pZCAqX2Rldl9wLCBJTiB2b2lkICpfZGV2X2lkX3AsCisJCQkJCQkJSU4gVUlOVCBhcmdjLCBPVVQgUFJUTVBfQURBUFRFUiAqcHBBZCk7CisKKy8vIHByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlCitzdGF0aWMgaW50IHJ0Mjh4eF9pbml0KElOIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2KTsKK0lOVCBydDI4eHhfc2VuZF9wYWNrZXRzKElOIHN0cnVjdCBza19idWZmICpza2JfcCwgSU4gc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpOworCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDw9IDB4MjA0MDIJLy8gUmVkIEhhdCA3LjEKK3N0cnVjdCBuZXRfZGV2aWNlICphbGxvY19uZXRkZXYoCisJaW50IHNpemVvZl9wcml2LAorCWNvbnN0IGNoYXIgKm1hc2ssCisJdm9pZCAoKnNldHVwKShzdHJ1Y3QgbmV0X2RldmljZSAqKSk7CisjZW5kaWYgLy8gTElOVVhfVkVSU0lPTl9DT0RFIC8vCisKK3N0YXRpYyB2b2lkIENmZ0luaXRIb29rKFBSVE1QX0FEQVBURVIgcEFkKTsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorZXh0ZXJuCWNvbnN0IHN0cnVjdCBpd19oYW5kbGVyX2RlZiBydDI4eHhfaXdfaGFuZGxlcl9kZWY7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKyNpZmRlZiBDT05GSUdfQVBTVEFfTUlYRURfU1VQUE9SVAorZXh0ZXJuCWNvbnN0IHN0cnVjdCBpd19oYW5kbGVyX2RlZiBydDI4eHhfYXBfaXdfaGFuZGxlcl9kZWY7CisjZW5kaWYgLy8gQ09ORklHX0FQU1RBX01JWEVEX1NVUFBPUlQgLy8KKworI2lmIFdJUkVMRVNTX0VYVCA+PSAxMgorLy8gVGhpcyBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCB3aGVuIHF1ZXJ5IC9wcm9jCitzdHJ1Y3QgaXdfc3RhdGlzdGljcyAqcnQyOHh4X2dldF93aXJlbGVzc19zdGF0cygKKyAgICBJTiBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2Rldik7CisjZW5kaWYKKworc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKlJUMjh4eF9nZXRfZXRoZXJfc3RhdHMoCisgICAgSU4gIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2KTsKKworLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICBDbG9zZSByYXh4IGludGVyZmFjZS4KKworQXJndW1lbnRzOgorCSpuZXRfZGV2CQkJdGhlIHJheHggaW50ZXJmYWNlIHBvaW50ZXIKKworUmV0dXJuIFZhbHVlOgorICAgIDAJCQkJCU9wZW4gT0sKKwlvdGhlcndpc2UJCQlPcGVuIEZhaWwKKworTm90ZToKKwkxLiBpZiBvcGVuIGZhaWwsIGtlcm5lbCB3aWxsIG5vdCBjYWxsIHRoZSBjbG9zZSBmdW5jdGlvbi4KKwkyLiBGcmVlIG1lbW9yeSBmb3IKKwkJKDEpIE1sbWUgTWVtb3J5IEhhbmRsZXI6CQlNbG1lSGFsdCgpCisJCSgyKSBUWCAmIFJYOgkJCQkJUlRNUEZyZWVUeFJ4UmluZ01lbW9yeSgpCisJCSgzKSBCQSBSZW9yZGVyaW5nOiAJCQkJYmFfcmVvcmRlcmluZ19yZXNvdXJjZV9yZWxlYXNlKCkKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK2ludCBNYWluVmlydHVhbElGX2Nsb3NlKElOIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2KQoreworICAgIFJUTVBfQURBUFRFUiAqcEFkID0gbmV0X2Rldi0+bWxfcHJpdjsKKworCS8vIFNhbml0eSBjaGVjayBmb3IgcEFkCisJaWYgKHBBZCA9PSBOVUxMKQorCQlyZXR1cm4gMDsgLy8gY2xvc2Ugb2sKKworCW5ldGlmX2NhcnJpZXJfb2ZmKHBBZC0+bmV0X2Rldik7CisJbmV0aWZfc3RvcF9xdWV1ZShwQWQtPm5ldF9kZXYpOworCisKKwlWSVJUVUFMX0lGX0RPV04ocEFkKTsKKworCVJUX01PRF9ERUNfVVNFX0NPVU5UKCk7CisKKwlyZXR1cm4gMDsgLy8gY2xvc2Ugb2sKK30KKworLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICBPcGVuIHJheHggaW50ZXJmYWNlLgorCitBcmd1bWVudHM6CisJKm5ldF9kZXYJCQl0aGUgcmF4eCBpbnRlcmZhY2UgcG9pbnRlcgorCitSZXR1cm4gVmFsdWU6CisgICAgMAkJCQkJT3BlbiBPSworCW90aGVyd2lzZQkJCU9wZW4gRmFpbAorCitOb3RlOgorCTEuIGlmIG9wZW4gZmFpbCwga2VybmVsIHdpbGwgbm90IGNhbGwgdGhlIGNsb3NlIGZ1bmN0aW9uLgorCTIuIEZyZWUgbWVtb3J5IGZvcgorCQkoMSkgTWxtZSBNZW1vcnkgSGFuZGxlcjoJCU1sbWVIYWx0KCkKKwkJKDIpIFRYICYgUlg6CQkJCQlSVE1QRnJlZVR4UnhSaW5nTWVtb3J5KCkKKwkJKDMpIEJBIFJlb3JkZXJpbmc6IAkJCQliYV9yZW9yZGVyaW5nX3Jlc291cmNlX3JlbGVhc2UoKQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworaW50IE1haW5WaXJ0dWFsSUZfb3BlbihJTiBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldikKK3sKKyAgICBSVE1QX0FEQVBURVIgKnBBZCA9IG5ldF9kZXYtPm1sX3ByaXY7CisKKwkvLyBTYW5pdHkgY2hlY2sgZm9yIHBBZAorCWlmIChwQWQgPT0gTlVMTCkKKwkJcmV0dXJuIDA7IC8vIGNsb3NlIG9rCisKKwlpZiAoVklSVFVBTF9JRl9VUChwQWQpICE9IDApCisJCXJldHVybiAtMTsKKworCS8vIGluY3JlYXNlIE1PRFVMRSB1c2UgY291bnQKKwlSVF9NT0RfSU5DX1VTRV9DT1VOVCgpOworCisJbmV0aWZfc3RhcnRfcXVldWUobmV0X2Rldik7CisJbmV0aWZfY2Fycmllcl9vbihuZXRfZGV2KTsKKwluZXRpZl93YWtlX3F1ZXVlKG5ldF9kZXYpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1JvdXRpbmUgRGVzY3JpcHRpb246CisgICAgQ2xvc2UgcmF4eCBpbnRlcmZhY2UuCisKK0FyZ3VtZW50czoKKwkqbmV0X2RldgkJCXRoZSByYXh4IGludGVyZmFjZSBwb2ludGVyCisKK1JldHVybiBWYWx1ZToKKyAgICAwCQkJCQlPcGVuIE9LCisJb3RoZXJ3aXNlCQkJT3BlbiBGYWlsCisKK05vdGU6CisJMS4gaWYgb3BlbiBmYWlsLCBrZXJuZWwgd2lsbCBub3QgY2FsbCB0aGUgY2xvc2UgZnVuY3Rpb24uCisJMi4gRnJlZSBtZW1vcnkgZm9yCisJCSgxKSBNbG1lIE1lbW9yeSBIYW5kbGVyOgkJTWxtZUhhbHQoKQorCQkoMikgVFggJiBSWDoJCQkJCVJUTVBGcmVlVHhSeFJpbmdNZW1vcnkoKQorCQkoMykgQkEgUmVvcmRlcmluZzogCQkJCWJhX3Jlb3JkZXJpbmdfcmVzb3VyY2VfcmVsZWFzZSgpCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitpbnQgcnQyOHh4X2Nsb3NlKElOIFBORVRfREVWIGRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqIG5ldF9kZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilkZXY7CisgICAgUlRNUF9BREFQVEVSCSpwQWQgPSBuZXRfZGV2LT5tbF9wcml2OworCUJPT0xFQU4gCQlDYW5jZWxsZWQgPSBGQUxTRTsKKwlVSU5UMzIJCQlpID0gMDsKKworCisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PiBydDI4eHhfY2xvc2VcbiIpKTsKKworCS8vIFNhbml0eSBjaGVjayBmb3IgcEFkCisJaWYgKHBBZCA9PSBOVUxMKQorCQlyZXR1cm4gMDsgLy8gY2xvc2Ugb2sKKworCisjaWZkZWYgV0RTX1NVUFBPUlQKKwlXZHNEb3duKHBBZCk7CisjZW5kaWYgLy8gV0RTX1NVUFBPUlQgLy8KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJeworI2lmZGVmIFJUMjg2MAorCQlSVE1QUENJZUxpbmtDdHJsVmFsdWVSZXN0b3JlKHBBZCwgUkVTVE9SRV9DTE9TRSk7CisjZW5kaWYgLy8gUlQyODYwIC8vCisKKwkJLy8gSWYgZGlydmVyIGRvZXNuJ3Qgd2FrZSB1cCBmaXJtd2FyZSBoZXJlLAorCQkvLyBOSUNMb2FkRmlybXdhcmUgd2lsbCBoYW5nIGZvcmV2ZXIgd2hlbiBpbnRlcmZhY2UgaXMgdXAgYWdhaW4uCisJCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0RPWkUpKQorICAgICAgICB7CisJCSAgICBBc2ljRm9yY2VXYWtldXAocEFkLCBUUlVFKTsKKyAgICAgICAgfQorCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJCS8vIHNlbmQgRExTLVRFQVJfRE9XTiBtZXNzYWdlLAorCQlpZiAocEFkLT5Db21tb25DZmcuYkRMU0NhcGFibGUpCisJCXsKKwkJCVVDSEFSIGk7CisKKwkJCS8vIHRlYXIgZG93biBsb2NhbCBkbHMgdGFibGUgZW50cnkKKwkJCWZvciAoaT0wOyBpPE1BWF9OVU1fT0ZfSU5JVF9ETFNfRU5UUlk7IGkrKykKKwkJCXsKKwkJCQlpZiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQgJiYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9PSBETFNfRklOSVNIKSkKKwkJCQl7CisJCQkJCVJUTVBTZW5kRExTVGVhckRvd25GcmFtZShwQWQsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpOworCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMJPSBETFNfTk9ORTsKKwkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQJPSBGQUxTRTsKKwkJCQl9CisJCQl9CisKKwkJCS8vIHRlYXIgZG93biBwZWVyIGRscyB0YWJsZSBlbnRyeQorCQkJZm9yIChpPU1BWF9OVU1fT0ZfSU5JVF9ETFNfRU5UUlk7IGk8TUFYX05VTV9PRl9ETFNfRU5UUlk7IGkrKykKKwkJCXsKKwkJCQlpZiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQgJiYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9PSBETFNfRklOSVNIKSkKKwkJCQl7CisJCQkJCVJUTVBTZW5kRExTVGVhckRvd25GcmFtZShwQWQsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpOworCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPSBETFNfTk9ORTsKKwkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQJPSBGQUxTRTsKKwkJCQl9CisJCQl9CisJCQlSVDI4WFhfTUxNRV9IQU5ETEVSKHBBZCk7CisJCX0KKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKworCQlpZiAoSU5GUkFfT04ocEFkKSAmJgorCQkJKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpKQorCQl7CisJCQlNTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1QJRGlzUmVxOworCQkJTUxNRV9RVUVVRV9FTEVNICpNc2dFbGVtID0gKE1MTUVfUVVFVUVfRUxFTSAqKSBrbWFsbG9jKHNpemVvZihNTE1FX1FVRVVFX0VMRU0pLCBNRU1fQUxMT0NfRkxBRyk7CisKKwkJCUNPUFlfTUFDX0FERFIoRGlzUmVxLkFkZHIsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKwkJCURpc1JlcS5SZWFzb24gPSAgUkVBU09OX0RFQVVUSF9TVEFfTEVBVklORzsKKworCQkJTXNnRWxlbS0+TWFjaGluZSA9IEFTU09DX1NUQVRFX01BQ0hJTkU7CisJCQlNc2dFbGVtLT5Nc2dUeXBlID0gTVQyX01MTUVfRElTQVNTT0NfUkVROworCQkJTXNnRWxlbS0+TXNnTGVuID0gc2l6ZW9mKE1MTUVfRElTQVNTT0NfUkVRX1NUUlVDVCk7CisJCQlOZGlzTW92ZU1lbW9yeShNc2dFbGVtLT5Nc2csICZEaXNSZXEsIHNpemVvZihNTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1QpKTsKKworCQkJLy8gUHJldmVudCB0byBjb25uZWN0IEFQIGFnYWluIGluIFNUQU1sbWVQZXJpb2RpY0V4ZWMKKwkJCXBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbj0gMzI7CisJCQlOZGlzWmVyb01lbW9yeShwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWQsIHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbik7CisKKwkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX1dBSVRfT0lEX0RJU0FTU09DOworCQkJTWxtZURpc2Fzc29jUmVxQWN0aW9uKHBBZCwgTXNnRWxlbSk7CisJCQlrZnJlZShNc2dFbGVtKTsKKworCQkJUlRNUHVzZWNEZWxheSgxMDAwKTsKKwkJfQorCisKKyNpZmRlZiBDQ1hfU1VQUE9SVAorCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+U3RhQ2ZnLkxlYXBBdXRoVGltZXIsICZDYW5jZWxsZWQpOworI2VuZGlmCisKKwkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPlN0YUNmZy5TdGFRdWlja1Jlc3BvbmVGb3JSYXRlVXBUaW1lciwgJkNhbmNlbGxlZCk7CisJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5TdGFDZmcuV3BhRGlzYXNzb2NBbmRCbG9ja0Fzc29jVGltZXIsICZDYW5jZWxsZWQpOworCisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorI2lmbmRlZiBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorCQl7CisJCQl1bmlvbiBpd3JlcV9kYXRhICAgIHdycXU7CisJCQkvLyBzZW5kIHdpcmVsZXNzIGV2ZW50IHRvIHdwYV9zdXBwbGljYW50IGZvciBpbmZyb21pbmcgaW50ZXJmYWNlIGRvd24uCisJCQltZW1zZXQoJndycXUsIDAsIHNpemVvZih3cnF1KSk7CisJCQl3cnF1LmRhdGEuZmxhZ3MgPSBSVF9JTlRFUkZBQ0VfRE9XTjsKKwkJCXdpcmVsZXNzX3NlbmRfZXZlbnQocEFkLT5uZXRfZGV2LCBJV0VWQ1VTVE9NLCAmd3JxdSwgTlVMTCk7CisJCX0KKyNlbmRpZiAvLyBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKworCQlNbG1lUmFkaW9PZmYocEFkKTsKKyNpZmRlZiBSVDI4NjAKKwkJcEFkLT5iUENJY2xrT2ZmID0gRkFMU0U7CisjZW5kaWYgLy8gUlQyODYwIC8vCisJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyk7CisKKwlmb3IgKGkgPSAwIDsgaSA8IE5VTV9PRl9UWF9SSU5HOyBpKyspCisJeworCQl3aGlsZSAocEFkLT5EZVF1ZXVlUnVubmluZ1tpXSA9PSBUUlVFKQorCQl7CisJCQlwcmludGsoIldhaXRpbmcgZm9yIFR4UXVldWVbJWRdIGRvbmUuLi4uLi4uLi4uXG4iLCBpKTsKKwkJCVJUTVB1c2VjRGVsYXkoMTAwMCk7CisJCX0KKwl9CisKKwkvLyBTdG9wIE1sbWUgc3RhdGUgbWFjaGluZQorCU1sbWVIYWx0KHBBZCk7CisKKwkvLyBDbG9zZSBrZXJuZWwgdGhyZWFkcyBvciB0YXNrbGV0cworCWtpbGxfdGhyZWFkX3Rhc2socEFkKTsKKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwl7CisJCU1hY1RhYmxlUmVzZXQocEFkKTsKKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKworCU1lYXN1cmVSZXFUYWJFeGl0KHBBZCk7CisJVHBjUmVxVGFiRXhpdChwQWQpOworCisKKyNpZmRlZiBSVDI4NjAKKwlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9BQ1RJVkUpKQorCXsKKwkJTklDRGlzYWJsZUludGVycnVwdChwQWQpOworCX0KKworCS8vIERpc2FibGUgUngsIHJlZ2lzdGVyIHZhbHVlIHN1cHBvc2VkIHdpbGwgcmVtYWluIGFmdGVyIHJlc2V0CisJTklDSXNzdWVSZXNldChwQWQpOworCisJLy8gRnJlZSBJUlEKKwlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQorCXsKKwkJLy8gRGVyZWdpc3RlciBpbnRlcnJ1cHQgZnVuY3Rpb24KKwkJUlQyOFhYX0lSUV9SRUxFQVNFKG5ldF9kZXYpCisJCVJUTVBfQ0xFQVJfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSk7CisJfQorI2VuZGlmIC8vIFJUMjg2MCAvLworCisKKwkvLyBGcmVlIFJpbmcgb3IgVVNCIGJ1ZmZlcnMKKwlSVE1QRnJlZVR4UnhSaW5nTWVtb3J5KHBBZCk7CisKKwlSVE1QX0NMRUFSX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MpOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJLy8gRnJlZSBCQSByZW9yZGVyIHJlc291cmNlCisJYmFfcmVvcmRlcmluZ19yZXNvdXJjZV9yZWxlYXNlKHBBZCk7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKworCVJUTVBfQ0xFQVJfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfU1RBUlRfVVApOworCisJcmV0dXJuIDA7IC8vIGNsb3NlIG9rCit9IC8qIEVuZCBvZiBydDI4eHhfY2xvc2UgKi8KKworc3RhdGljIGludCBydDI4eHhfaW5pdChJTiBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldikKK3sKKwlQUlRNUF9BREFQVEVSIAkJCXBBZCA9IChQUlRNUF9BREFQVEVSKW5ldF9kZXYtPm1sX3ByaXY7CisJVUlOVAkJCQkJaW5kZXg7CisJVUNIQVIJCQkJCVRtcFBoeTsKKwlORElTX1NUQVRVUwkJCQlTdGF0dXM7CisJVUlOVDMyIAkJTWFjQ3NyMCA9IDA7CisKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCS8vIEFsbG9jYXRlIEJBIFJlb3JkZXJpbmcgbWVtb3J5CisJYmFfcmVvcmRlcmluZ19yZXNvdXJjZV9pbml0KHBBZCwgTUFYX1JFT1JERVJJTkdfTVBEVV9OVU0pOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJLy8gTWFrZSBzdXJlIE1BQyBnZXRzIHJlYWR5LgorCWluZGV4ID0gMDsKKwlkbworCXsKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBNQUNfQ1NSMCwgJk1hY0NzcjApOworCQlwQWQtPk1BQ1ZlcnNpb24gPSBNYWNDc3IwOworCisJCWlmICgocEFkLT5NQUNWZXJzaW9uICE9IDB4MDApICYmIChwQWQtPk1BQ1ZlcnNpb24gIT0gMHhGRkZGRkZGRikpCisJCQlicmVhazsKKworCQlSVE1QdXNlY0RlbGF5KDEwKTsKKwl9IHdoaWxlIChpbmRleCsrIDwgMTAwKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1BQ19DU1IwICBbIFZlcjpSZXY9MHglMDh4XVxuIiwgcEFkLT5NQUNWZXJzaW9uKSk7CisKKwkvLyBEaXNhYmxlIERNQQorCVJUMjhYWERNQURpc2FibGUocEFkKTsKKworCisJLy8gTG9hZCA4MDUxIGZpcm13YXJlCisJU3RhdHVzID0gTklDTG9hZEZpcm13YXJlKHBBZCk7CisJaWYgKFN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCXsKKwkJREJHUFJJTlRfRVJSKCgiTklDTG9hZEZpcm13YXJlIGZhaWxlZCwgU3RhdHVzWz0weCUwOHhdXG4iLCBTdGF0dXMpKTsKKwkJZ290byBlcnIxOworCX0KKworCU5JQ0xvYWRSYXRlU3dpdGNoaW5nUGFyYW1zKHBBZCk7CisKKwkvLyBEaXNhYmxlIGludGVycnVwdHMgaGVyZSB3aGljaCBpcyBhcyBzb29uIGFzIHBvc3NpYmxlCisJLy8gVGhpcyBzdGF0ZW1lbnQgc2hvdWxkIG5ldmVyIGJlIHRydWUuIFdlIG1pZ2h0IGNvbnNpZGVyIHRvIHJlbW92ZSBpdCBsYXRlcgorI2lmZGVmIFJUMjg2MAorCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0FDVElWRSkpCisJeworCQlOSUNEaXNhYmxlSW50ZXJydXB0KHBBZCk7CisJfQorI2VuZGlmIC8vIFJUMjg2MCAvLworCisJU3RhdHVzID0gUlRNUEFsbG9jVHhSeFJpbmdNZW1vcnkocEFkKTsKKwlpZiAoU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJeworCQlEQkdQUklOVF9FUlIoKCJSVE1QQWxsb2NETUFNZW1vcnkgZmFpbGVkLCBTdGF0dXNbPTB4JTA4eF1cbiIsIFN0YXR1cykpOworCQlnb3RvIGVycjE7CisJfQorCisJUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSk7CisKKwkvLyBpbml0aWFsaXplIE1MTUUKKwkvLworCisJU3RhdHVzID0gTWxtZUluaXQocEFkKTsKKwlpZiAoU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJeworCQlEQkdQUklOVF9FUlIoKCJNbG1lSW5pdCBmYWlsZWQsIFN0YXR1c1s9MHglMDh4XVxuIiwgU3RhdHVzKSk7CisJCWdvdG8gZXJyMjsKKwl9CisKKwkvLyBJbml0aWFsaXplIHBBZC0+U3RhQ2ZnLCBwQWQtPkFwQ2ZnLCBwQWQtPkNvbW1vbkNmZyB0byBtYW51ZmFjdHVyZSBkZWZhdWx0CisJLy8KKwlVc2VyQ2ZnSW5pdChwQWQpOworCisKKwlSVDI4WFhfVEFTS19USFJFQURfSU5JVChwQWQsIFN0YXR1cyk7CisJaWYgKFN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCQlnb3RvIGVycjE7CisKKwlDZmdJbml0SG9vayhwQWQpOworCisKKyNpZmRlZiBCTE9DS19ORVRfSUYKKwlpbml0YmxvY2tRdWV1ZVRhYihwQWQpOworI2VuZGlmIC8vIEJMT0NLX05FVF9JRiAvLworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJTmRpc0FsbG9jYXRlU3BpbkxvY2soJnBBZC0+TWFjVGFiTG9jayk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlNZWFzdXJlUmVxVGFiSW5pdChwQWQpOworCVRwY1JlcVRhYkluaXQocEFkKTsKKworCS8vCisJLy8gSW5pdCB0aGUgaGFyZHdhcmUsIHdlIG5lZWQgdG8gaW5pdCBhc2ljIGJlZm9yZSByZWFkIHJlZ2lzdHJ5LCBvdGhlcndpc2UgbWFjIHJlZ2lzdGVyIHdpbGwgYmUgcmVzZXQKKwkvLworCVN0YXR1cyA9IE5JQ0luaXRpYWxpemVBZGFwdGVyKHBBZCwgVFJVRSk7CisJaWYgKFN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCXsKKwkJREJHUFJJTlRfRVJSKCgiTklDSW5pdGlhbGl6ZUFkYXB0ZXIgZmFpbGVkLCBTdGF0dXNbPTB4JTA4eF1cbiIsIFN0YXR1cykpOworCQlpZiAoU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJCWdvdG8gZXJyMzsKKwl9CisKKwkvLyBSZWFkIHBhcmFtZXRlcnMgZnJvbSBDb25maWcgRmlsZQorCVN0YXR1cyA9IFJUTVBSZWFkUGFyYW1ldGVyc0hvb2socEFkKTsKKworCXByaW50aygiMS4gUGh5IE1vZGUgPSAlZFxuIiwgcEFkLT5Db21tb25DZmcuUGh5TW9kZSk7CisJaWYgKFN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCXsKKwkJREJHUFJJTlRfRVJSKCgiTklDUmVhZFJlZ1BhcmFtZXRlcnMgZmFpbGVkLCBTdGF0dXNbPTB4JTA4eF1cbiIsU3RhdHVzKSk7CisJCWdvdG8gZXJyNDsKKwl9CisKKworCisgICAJLy9Jbml0IEJhIENhcGFiaWxpdHkgcGFyYW1ldGVycy4KKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuTXBkdURlbnNpdHkgPSAoVUNIQVIpcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1wZHVEZW5zaXR5OworCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5BbXNkdUVuYWJsZSA9IChVU0hPUlQpcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkFtc2R1RW5hYmxlOworCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5BbXNkdVNpemUgPSAoVVNIT1JUKXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BbXNkdVNpemU7CisJcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5Lk1pbW9QcyA9IChVU0hPUlQpcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1NUFNtb2RlOworCS8vIFVQZGF0YSB0byBIVCBJRQorCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uTWltb1BzID0gKFVTSE9SVClwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTU1QU21vZGU7CisJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5BTXNkdVNpemUgPSAoVVNIT1JUKXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BbXNkdVNpemU7CisJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwUGFybS5NcGR1RGVuc2l0eSA9IChVQ0hBUilwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTXBkdURlbnNpdHk7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwlwcmludGsoIjIuIFBoeSBNb2RlID0gJWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUpOworCisJLy8gV2Ugc2hvdWxkIHJlYWQgRUVQUk9NIGZvciBhbGwgY2FzZXMuICBydDI4NjBiCisJTklDUmVhZEVFUFJPTVBhcmFtZXRlcnMocEFkLCBtYWMpOworCisJcHJpbnRrKCIzLiBQaHkgTW9kZSA9ICVkXG4iLCBwQWQtPkNvbW1vbkNmZy5QaHlNb2RlKTsKKworCU5JQ0luaXRBc2ljRnJvbUVFUFJPTShwQWQpOyAvL3J0Mjg2MGIKKworCS8vIFNldCBQSFkgdG8gYXBwcm9wcmlhdGUgbW9kZQorCVRtcFBoeSA9IHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGU7CisJcEFkLT5Db21tb25DZmcuUGh5TW9kZSA9IDB4ZmY7CisJUlRNUFNldFBoeU1vZGUocEFkLCBUbXBQaHkpOworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCVNldENvbW1vbkhUKHBBZCk7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwkvLyBObyB2YWxpZCBjaGFubmVscy4KKwlpZiAocEFkLT5DaGFubmVsTGlzdE51bSA9PSAwKQorCXsKKwkJcHJpbnRrKCJXcm9uZyBjb25maWd1cmF0aW9uLiBObyB2YWxpZCBjaGFubmVsIGZvdW5kLiBDaGVjayBcIkNvbnRyeUNvZGVcIiBhbmQgXCJDaGFubmVsR2VvZ3JhcGh5XCIgc2V0dGluZy5cbiIpOworCQlnb3RvIGVycjQ7CisJfQorCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJcHJpbnRrKCJNQ1MgU2V0ID0gJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4XG4iLCBwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuTUNTU2V0WzBdLAorICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuTUNTU2V0WzFdLCBwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuTUNTU2V0WzJdLAorICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuTUNTU2V0WzNdLCBwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuTUNTU2V0WzRdKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworI2lmZGVmIElLQU5PU19WWF8xWDAKKwlWUl9JS0FOT1NfRlBfSW5pdChwQWQtPkFwQ2ZnLkJzc2lkTnVtLCBwQWQtPlBlcm1hbmVudEFkZHJlc3MpOworI2VuZGlmIC8vIElLQU5PU19WWF8xWDAgLy8KKworCQkvLworCS8vIEluaXRpYWxpemUgUkYgcmVnaXN0ZXIgdG8gZGVmYXVsdCB2YWx1ZQorCS8vCisJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsLCBGQUxTRSk7CisJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCk7CisKKwkvLyA4MDUxIGZpcm13YXJlIHJlcXVpcmUgdGhlIHNpZ25hbCBkdXJpbmcgYm9vdGluZyB0aW1lLgorCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHg3MiwgMHhGRiwgMHgwMCwgMHgwMCk7CisKKwlpZiAocEFkICYmIChTdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykpCisJeworCQkvLworCQkvLyBVbmRvIGV2ZXJ5dGhpbmcgaWYgaXQgZmFpbGVkCisJCS8vCisJCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCisJCXsKKwkJCVJUTVBfQ0xFQVJfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSk7CisJCX0KKwl9CisJZWxzZSBpZiAocEFkKQorCXsKKwkJLy8gTWljcm9zb2Z0IEhDVCByZXF1aXJlIGRyaXZlciBzZW5kIGEgZGlzY29ubmVjdCBldmVudCBhZnRlciBkcml2ZXIgaW5pdGlhbGl6YXRpb24uCisJCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCk7CisJCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX01FRElBX1NUQVRFX0NIQU5HRSk7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk5ESVNfU1RBVFVTX01FRElBX0RJU0NPTk5FQ1QgRXZlbnQgQiFcbiIpKTsKKworCisJfS8vIGVuZCBvZiBlbHNlCisKKworCURCR1BSSU5UX1MoU3RhdHVzLCAoIjw9PT09IFJUTVBJbml0aWFsaXplLCBTdGF0dXM9JXhcbiIsIFN0YXR1cykpOworCisJcmV0dXJuIFRSVUU7CisKKworZXJyNDoKK2VycjM6CisJTWxtZUhhbHQocEFkKTsKK2VycjI6CisJUlRNUEZyZWVUeFJ4UmluZ01lbW9yeShwQWQpOworZXJyMToKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCW9zX2ZyZWVfbWVtKHBBZCwgcEFkLT5tcGR1X2Jsa19wb29sLm1lbSk7IC8vIGZyZWUgQkEgcG9vbAorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCVJUMjhYWF9JUlFfUkVMRUFTRShuZXRfZGV2KTsKKworCS8vIHNoYWxsIG5vdCBzZXQgbWxfcHJpdiB0byBOVUxMIGhlcmUgYmVjYXVzZSB0aGUgbWxfcHJpdiBkaWRuJ3QgYmVlbiBmcmVlIHlldC4KKwkvL25ldF9kZXYtPm1sX3ByaXYgPSAwOworI2lmZGVmIElORl9BTUFaT05fU0UKK2VycjA6CisjZW5kaWYgLy8gSU5GX0FNQVpPTl9TRSAvLworCXByaW50aygiISEhICVzIEluaXRpYWxpemVkIGZhaWwgISEhXG4iLCBSVDI4eHhfQ0hJUF9OQU1FKTsKKwlyZXR1cm4gRkFMU0U7Cit9IC8qIEVuZCBvZiBydDI4eHhfaW5pdCAqLworCisKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1JvdXRpbmUgRGVzY3JpcHRpb246CisgICAgT3BlbiByYXh4IGludGVyZmFjZS4KKworQXJndW1lbnRzOgorCSpuZXRfZGV2CQkJdGhlIHJheHggaW50ZXJmYWNlIHBvaW50ZXIKKworUmV0dXJuIFZhbHVlOgorICAgIDAJCQkJCU9wZW4gT0sKKwlvdGhlcndpc2UJCQlPcGVuIEZhaWwKKworTm90ZToKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK2ludCBydDI4eHhfb3BlbihJTiBQTkVUX0RFViBkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKiBuZXRfZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopZGV2OworCVBSVE1QX0FEQVBURVIgcEFkID0gbmV0X2Rldi0+bWxfcHJpdjsKKwlpbnQgcmV0dmFsID0gMDsKKyAJUE9TX0NPT0tJRSBwT2JqOworCisKKwkvLyBTYW5pdHkgY2hlY2sgZm9yIHBBZAorCWlmIChwQWQgPT0gTlVMTCkKKwl7CisJCS8qIGlmIDFzdCBvcGVuIGZhaWwsIHBBZCB3aWxsIGJlIGZyZWU7CisJCSAgIFNvIHRoZSBuZXRfZGV2LT5tbF9wcml2IHdpbGwgYmUgTlVMTCBpbiAycmQgb3BlbiAqLworCQlyZXR1cm4gLTE7CisJfQorCisjaWZkZWYgQ09ORklHX0FQU1RBX01JWEVEX1NVUFBPUlQKKwlpZiAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX0FQKQorCXsKKwkJQ1dfTUFYX0lOX0JJVFMgPSA2OworCX0KKwllbHNlIGlmIChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKQorCXsKKwkJQ1dfTUFYX0lOX0JJVFMgPSAxMDsKKwl9CisKKyNpZiBXSVJFTEVTU19FWFQgPj0gMTIKKwlpZiAobmV0X2Rldi0+cHJpdl9mbGFncyA9PSBJTlRfTUFJTikKKwl7CisJCWlmIChwQWQtPk9wTW9kZSA9PSBPUE1PREVfQVApCisJCQluZXRfZGV2LT53aXJlbGVzc19oYW5kbGVycyA9IChzdHJ1Y3QgaXdfaGFuZGxlcl9kZWYgKikgJnJ0Mjh4eF9hcF9pd19oYW5kbGVyX2RlZjsKKwkJZWxzZSBpZiAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkKKwkJCW5ldF9kZXYtPndpcmVsZXNzX2hhbmRsZXJzID0gKHN0cnVjdCBpd19oYW5kbGVyX2RlZiAqKSAmcnQyOHh4X2l3X2hhbmRsZXJfZGVmOworCX0KKyNlbmRpZiAvLyBXSVJFTEVTU19FWFQgPj0gMTIgLy8KKyNlbmRpZiAvLyBDT05GSUdfQVBTVEFfTUlYRURfU1VQUE9SVCAvLworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisjaWZkZWYgUlQyODYwCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwl7CisgICAgCS8vIElmIGRpcnZlciBkb2Vzbid0IHdha2UgdXAgZmlybXdhcmUgaGVyZSwKKyAgICAJLy8gTklDTG9hZEZpcm13YXJlIHdpbGwgaGFuZyBmb3JldmVyIHdoZW4gaW50ZXJmYWNlIGlzIHVwIGFnYWluLgorICAgIAkvLyBSVDI4NjAgUENJCisgICAgCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0RPWkUpICYmCisgICAgICAgIAlPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0FEVkFOQ0VfUE9XRVJfU0FWRV9QQ0lFX0RFVklDRSkpCisgICAgCXsKKyAgICAgICAgCUFVVE9fV0FLRVVQX1NUUlVDIEF1dG9XYWtldXBDZmc7CisJCQlBc2ljRm9yY2VXYWtldXAocEFkLCBUUlVFKTsKKyAgICAgICAgCUF1dG9XYWtldXBDZmcud29yZCA9IDA7CisJICAgIAlSVE1QX0lPX1dSSVRFMzIocEFkLCBBVVRPX1dBS0VVUF9DRkcsIEF1dG9XYWtldXBDZmcud29yZCk7CisgICAgICAgIAlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKTsKKyAgICAJfQorCX0KKyNlbmRpZiAvLyBSVDI4NjAgLy8KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCS8vIEluaXQKKyAJcE9iaiA9IChQT1NfQ09PS0lFKXBBZC0+T1NfQ29va2llOworCisJLy8gcmVzZXQgQWRhcHRlciBmbGFncworCVJUTVBfQ0xFQVJfRkxBR1MocEFkKTsKKworCS8vIFJlcXVlc3QgaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZSBmb3IgUENJIGRldmljZQorCS8vIHJlZ2lzdGVyIHRoZSBpbnRlcnJ1cHQgcm91dGluZSB3aXRoIHRoZSBvcworCVJUMjhYWF9JUlFfUkVRVUVTVChuZXRfZGV2KTsKKworCisJLy8gSW5pdCBCc3NUYWIgJiBDaGFubmVsSW5mbyB0YWJibGVzIGZvciBhdXRvIGNoYW5uZWwgc2VsZWN0LgorCisKKwkvLyBDaGlwICYgb3RoZXIgaW5pdAorCWlmIChydDI4eHhfaW5pdChuZXRfZGV2KSA9PSBGQUxTRSkKKwkJZ290byBlcnI7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCXsKKwkJTmRpc1plcm9NZW1vcnkocEFkLT5TdGFDZmcuZGV2X25hbWUsIDE2KTsKKwkJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuZGV2X25hbWUsIG5ldF9kZXYtPm5hbWUsIHN0cmxlbihuZXRfZGV2LT5uYW1lKSk7CisJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJLy8gU2V0IHVwIHRoZSBNYWMgYWRkcmVzcworCU5kaXNNb3ZlTWVtb3J5KG5ldF9kZXYtPmRldl9hZGRyLCAodm9pZCAqKSBwQWQtPkN1cnJlbnRBZGRyZXNzLCA2KTsKKworCS8vIEluaXQgSVJRIHBhcmFtZXRlcnMKKwlSVDI4WFhfSVJRX0lOSVQocEFkKTsKKworCS8vIFZhcmlvdXMgQVAgZnVuY3Rpb24gaW5pdAorCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwl7CisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorI2lmbmRlZiBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorCQl7CisJCQl1bmlvbiBpd3JlcV9kYXRhICAgIHdycXU7CisJCQkvLyBzZW5kIHdpcmVsZXNzIGV2ZW50IHRvIHdwYV9zdXBwbGljYW50IGZvciBpbmZyb21pbmcgaW50ZXJmYWNlIGRvd24uCisJCQltZW1zZXQoJndycXUsIDAsIHNpemVvZih3cnF1KSk7CisJCQl3cnF1LmRhdGEuZmxhZ3MgPSBSVF9JTlRFUkZBQ0VfVVA7CisJCQl3aXJlbGVzc19zZW5kX2V2ZW50KHBBZC0+bmV0X2RldiwgSVdFVkNVU1RPTSwgJndycXUsIE5VTEwpOworCQl9CisjZW5kaWYgLy8gTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisKKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwkvLyBFbmFibGUgSW50ZXJydXB0CisJUlQyOFhYX0lSUV9FTkFCTEUocEFkKTsKKworCS8vIE5vdyBFbmFibGUgUnhUeAorCVJUTVBFbmFibGVSeFR4KHBBZCk7CisJUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfU1RBUlRfVVApOworCisJeworCVVJTlQzMiByZWcgPSAwOworCVJUTVBfSU9fUkVBRDMyKHBBZCwgMHgxMzAwLCAmcmVnKTsgIC8vIGNsZWFyIGdhcmJhZ2UgaW50ZXJydXB0cworCXByaW50aygiMHgxMzAwID0gJTA4eFxuIiwgcmVnKTsKKwl9CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKyNpZmRlZiBSVDI4NjAKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorICAgICAgICBSVE1QSW5pdFBDSWVMaW5rQ3RybFZhbHVlKHBBZCk7CisjZW5kaWYgLy8gUlQyODYwIC8vCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlyZXR1cm4gKHJldHZhbCk7CisKK2VycjoKKwlyZXR1cm4gKC0xKTsKK30gLyogRW5kIG9mIHJ0Mjh4eF9vcGVuICovCisKKworLyogTXVzdCBub3QgYmUgY2FsbGVkIGZvciBtZGV2IGFuZCBhcGRldiAqLworc3RhdGljIE5ESVNfU1RBVFVTIHJ0X2llZWU4MDIxMV9pZl9zZXR1cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlORElTX1NUQVRVUyBTdGF0dXM7CisJSU5UICAgICBpPTA7CisJQ0hBUiAgICBzbG90X25hbWVbSUZOQU1TSVpdOworCXN0cnVjdCBuZXRfZGV2aWNlICAgKmRldmljZTsKKworCisJLy9ldGhlcl9zZXR1cChkZXYpOworCWRldi0+aGFyZF9zdGFydF94bWl0ID0gcnQyOHh4X3NlbmRfcGFja2V0czsKKworI2lmZGVmIElLQU5PU19WWF8xWDAKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9IElLQU5PU19EYXRhRnJhbWVzVHg7CisjZW5kaWYgLy8gSUtBTk9TX1ZYXzFYMCAvLworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisjaWYgV0lSRUxFU1NfRVhUID49IDEyCisJaWYgKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpCisJeworCQlkZXYtPndpcmVsZXNzX2hhbmRsZXJzID0gJnJ0Mjh4eF9pd19oYW5kbGVyX2RlZjsKKwl9CisjZW5kaWYgLy9XSVJFTEVTU19FWFQgPj0gMTIKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworI2lmZGVmIENPTkZJR19BUFNUQV9NSVhFRF9TVVBQT1JUCisjaWYgV0lSRUxFU1NfRVhUID49IDEyCisJaWYgKHBBZC0+T3BNb2RlID09IE9QTU9ERV9BUCkKKwl7CisJCWRldi0+d2lyZWxlc3NfaGFuZGxlcnMgPSAmcnQyOHh4X2FwX2l3X2hhbmRsZXJfZGVmOworCX0KKyNlbmRpZiAvL1dJUkVMRVNTX0VYVCA+PSAxMgorI2VuZGlmIC8vIENPTkZJR19BUFNUQV9NSVhFRF9TVVBQT1JUIC8vCisKKyNpZiBXSVJFTEVTU19FWFQgPCAyMQorCQlkZXYtPmdldF93aXJlbGVzc19zdGF0cyA9IHJ0Mjh4eF9nZXRfd2lyZWxlc3Nfc3RhdHM7CisjZW5kaWYKKwlkZXYtPmdldF9zdGF0cyA9IFJUMjh4eF9nZXRfZXRoZXJfc3RhdHM7CisJZGV2LT5vcGVuID0gTWFpblZpcnR1YWxJRl9vcGVuOyAvL3J0Mjh4eF9vcGVuOworCWRldi0+c3RvcCA9IE1haW5WaXJ0dWFsSUZfY2xvc2U7IC8vcnQyOHh4X2Nsb3NlOworCWRldi0+cHJpdl9mbGFncyA9IElOVF9NQUlOOworCWRldi0+ZG9faW9jdGwgPSBydDI4eHhfaW9jdGw7CisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwyNCkKKyAgICBkZXYtPnZhbGlkYXRlX2FkZHIgPSBOVUxMOworI2VuZGlmCisJLy8gZmluZCBhdmFpbGFibGUgZGV2aWNlIG5hbWUKKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorCXsKKyNpZmRlZiBNVUxUSVBMRV9DQVJEX1NVUFBPUlQKKwkJaWYgKHBBZC0+TUNfUm93SUQgPj0gMCkKKwkJCXNwcmludGYoc2xvdF9uYW1lLCAicmElMDJkXyVkIiwgcEFkLT5NQ19Sb3dJRCwgaSk7CisJCWVsc2UKKyNlbmRpZiAvLyBNVUxUSVBMRV9DQVJEX1NVUFBPUlQgLy8KKwkJc3ByaW50ZihzbG90X25hbWUsICJyYSVkIiwgaSk7CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwyNCkKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDI2KQorICAgICAgICBkZXZpY2UgPSBkZXZfZ2V0X2J5X25hbWUoZGV2X25ldChkZXYpLCBzbG90X25hbWUpOworI2Vsc2UKKyAgICAgICAgZGV2aWNlID0gZGV2X2dldF9ieV9uYW1lKGRldi0+bmRfbmV0LCBzbG90X25hbWUpOworI2VuZGlmCisjZWxzZQorCQlkZXZpY2UgPSBkZXZfZ2V0X2J5X25hbWUoc2xvdF9uYW1lKTsKKyNlbmRpZgorCQlpZiAoZGV2aWNlICE9IE5VTEwpIGRldl9wdXQoZGV2aWNlKTsKKyNlbHNlCisJCWZvciAoZGV2aWNlID0gZGV2X2Jhc2U7IGRldmljZSAhPSBOVUxMOyBkZXZpY2UgPSBkZXZpY2UtPm5leHQpCisJCXsKKwkJCWlmIChzdHJuY21wKGRldmljZS0+bmFtZSwgc2xvdF9uYW1lLCA0KSA9PSAwKQorCQkJCWJyZWFrOworCQl9CisjZW5kaWYKKwkJaWYoZGV2aWNlID09IE5VTEwpCisJCQlicmVhazsKKwl9CisKKwlpZihpID09IDgpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJObyBhdmFpbGFibGUgc2xvdCBuYW1lXG4iKSk7CisJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX0ZBSUxVUkU7CisJfQorCWVsc2UKKwl7CisjaWZkZWYgTVVMVElQTEVfQ0FSRF9TVVBQT1JUCisJCWlmIChwQWQtPk1DX1Jvd0lEID49IDApCisJICAgICAgICBzcHJpbnRmKGRldi0+bmFtZSwgInJhJTAyZF8lZCIsIHBBZC0+TUNfUm93SUQsIGkpOworCQllbHNlCisjZW5kaWYgLy8gTVVMVElQTEVfQ0FSRF9TVVBQT1JUIC8vCisJCXNwcmludGYoZGV2LT5uYW1lLCAicmElZCIsIGkpOworCQlTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworCX0KKworCXJldHVybiBTdGF0dXM7CisKK30KKworCisjaWZkZWYgTVVMVElQTEVfQ0FSRF9TVVBQT1JUCisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgIEdldCBjYXJkIHByb2ZpbGUgcGF0aC4KKworQXJndW1lbnRzOgorICAgIHBBZAorCitSZXR1cm4gVmFsdWU6CisgICAgVFJVRQkJLSBGaW5kIGEgY2FyZCBwcm9maWxlCisJRkFMU0UJCS0gdXNlIGRlZmF1bHQgcHJvZmlsZQorCitOb3RlOgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworZXh0ZXJuIElOVCBSVE1QR2V0S2V5UGFyYW1ldGVyKAorICAgIElOICBQQ0hBUiAgIGtleSwKKyAgICBPVVQgUENIQVIgICBkZXN0LAorICAgIElOICBJTlQgICAgIGRlc3RzaXplLAorICAgIElOICBQQ0hBUiAgIGJ1ZmZlcik7CisKK0JPT0xFQU4gUlRNUF9DYXJkSW5mb1JlYWQoCisJSU4JUFJUTVBfQURBUFRFUiBwQWQpCit7CisjZGVmaW5lIE1DX1NFTEVDVF9DQVJESUQJCTAJLyogdXNlIENBUkQgSUQgKDAgfiAzMSkgdG8gaWRlbnRpZnkgZGlmZmVyZW50IGNhcmRzICovCisjZGVmaW5lIE1DX1NFTEVDVF9NQUMJCQkxCS8qIHVzZSBDQVJEIE1BQyB0byBpZGVudGlmeSBkaWZmZXJlbnQgY2FyZHMgKi8KKyNkZWZpbmUgTUNfU0VMRUNUX0NBUkRUWVBFCQkyCS8qIHVzZSBDQVJEIHR5cGUgKGFiZ24gb3IgYmduKSB0byBpZGVudGlmeSBkaWZmZXJlbnQgY2FyZHMgKi8KKworI2RlZmluZSBMRVRURVJfQ0FTRV9UUkFOU0xBVEUodHh0X3AsIGNhcmRfaWQpCQkJXAorCXsJVUlOVDMyIF9sZW47IGNoYXIgX2NoYXI7CQkJCQkJXAorCQlmb3IoX2xlbj0wOyBfbGVuPHN0cmxlbihjYXJkX2lkKTsgX2xlbisrKSB7CQlcCisJCQlfY2hhciA9ICoodHh0X3AgKyBfbGVuKTsJCQkJCVwKKwkJCWlmICgoJ0EnIDw9IF9jaGFyKSAmJiAoX2NoYXIgPD0gJ1onKSkJCVwKKwkJCQkqKHR4dF9wK19sZW4pID0gJ2EnKyhfY2hhci0nQScpOwkJXAorCQl9IH0KKworCXN0cnVjdCBmaWxlICpzcmNmOworCUlOVCByZXR2YWwsIG9yZ2ZzdWlkLCBvcmdmc2dpZDsKKyAgIAltbV9zZWdtZW50X3Qgb3JnZnM7CisJQ0hBUiAqYnVmZmVyLCAqdG1wYnVmLCBjYXJkX2lkX2J1ZlszMF0sIFJGSUNfd29yZFszMF07CisJQk9PTEVBTiBmbGdfbWF0Y2hfb2sgPSBGQUxTRTsKKwlJTlQzMiBjYXJkX3NlbGVjdF9tZXRob2Q7CisJSU5UMzIgY2FyZF9mcmVlX2lkLCBjYXJkX25vdXNlX2lkLCBjYXJkX3NhbWVfbWFjX2lkLCBjYXJkX21hdGNoX2lkOworCUVFUFJPTV9BTlRFTk5BX1NUUlVDIGFudGVubmE7CisJVVNIT1JUIGFkZHIwMSwgYWRkcjIzLCBhZGRyNDU7CisJVUlOVDggbWFjWzZdOworCVVJTlQzMiBkYXRhLCBjYXJkX2luZGV4OworCVVDSEFSICpzdGFydF9wdHI7CisKKworCS8vIGluaXQKKwlidWZmZXIgPSBrbWFsbG9jKE1BWF9JTklfQlVGRkVSX1NJWkUsIE1FTV9BTExPQ19GTEFHKTsKKwlpZiAoYnVmZmVyID09IE5VTEwpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworCXRtcGJ1ZiA9IGttYWxsb2MoTUFYX1BBUkFNX0JVRkZFUl9TSVpFLCBNRU1fQUxMT0NfRkxBRyk7CisJaWYodG1wYnVmID09IE5VTEwpCisJeworCQlrZnJlZShidWZmZXIpOworICAgICAgICByZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRTsKKwl9CisKKwlvcmdmc3VpZCA9IGN1cnJlbnQtPmZzdWlkOworCW9yZ2ZzZ2lkID0gY3VycmVudC0+ZnNnaWQ7CisJY3VycmVudC0+ZnN1aWQgPSBjdXJyZW50LT5mc2dpZCA9IDA7CisgICAgb3JnZnMgPSBnZXRfZnMoKTsKKyAgICBzZXRfZnMoS0VSTkVMX0RTKTsKKworCS8vIGdldCBSRiBJQyB0eXBlCisJUlRNUF9JT19SRUFEMzIocEFkLCBFMlBST01fQ1NSLCAmZGF0YSk7CisKKwlpZiAoKGRhdGEgJiAweDMwKSA9PSAwKQorCQlwQWQtPkVFUFJPTUFkZHJlc3NOdW0gPSA2OwkvLyA5M0M0NgorCWVsc2UgaWYgKChkYXRhICYgMHgzMCkgPT0gMHgxMCkKKwkJcEFkLT5FRVBST01BZGRyZXNzTnVtID0gODsJLy8gOTNDNjYKKwllbHNlCisJCXBBZC0+RUVQUk9NQWRkcmVzc051bSA9IDg7CS8vIDkzQzg2CisKKwlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9OSUMxX09GRlNFVCwgYW50ZW5uYS53b3JkKTsKKworCWlmICgoYW50ZW5uYS5maWVsZC5SZkljVHlwZSA9PSBSRklDXzI4NTApIHx8CisJCShhbnRlbm5hLmZpZWxkLlJmSWNUeXBlID09IFJGSUNfMjc1MCkpCisJeworCQkvKiBBQkdOIGNhcmQgKi8KKwkJc3RyY3B5KFJGSUNfd29yZCwgImFiZ24iKTsKKwl9CisJZWxzZQorCXsKKwkJLyogQkdOIGNhcmQgKi8KKwkJc3RyY3B5KFJGSUNfd29yZCwgImJnbiIpOworCX0KKworCS8vIGdldCBNQUMgYWRkcmVzcworCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgMHgwNCwgYWRkcjAxKTsKKwlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIDB4MDYsIGFkZHIyMyk7CisJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCAweDA4LCBhZGRyNDUpOworCisJbWFjWzBdID0gKFVDSEFSKShhZGRyMDEgJiAweGZmKTsKKwltYWNbMV0gPSAoVUNIQVIpKGFkZHIwMSA+PiA4KTsKKwltYWNbMl0gPSAoVUNIQVIpKGFkZHIyMyAmIDB4ZmYpOworCW1hY1szXSA9IChVQ0hBUikoYWRkcjIzID4+IDgpOworCW1hY1s0XSA9IChVQ0hBUikoYWRkcjQ1ICYgMHhmZik7CisJbWFjWzVdID0gKFVDSEFSKShhZGRyNDUgPj4gOCk7CisKKwkvLyBvcGVuIGNhcmQgaW5mb3JtYXRpb24gZmlsZQorCXNyY2YgPSBmaWxwX29wZW4oQ0FSRF9JTkZPX1BBVEgsIE9fUkRPTkxZLCAwKTsKKwlpZiAoSVNfRVJSKHNyY2YpKQorCXsKKwkJLyogY2FyZCBpbmZvcm1hdGlvbiBmaWxlIGRvZXMgbm90IGV4aXN0ICovCisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkoIi0tPiBFcnJvciAlbGQgb3BlbmluZyAlc1xuIiwgLVBUUl9FUlIoc3JjZiksIENBUkRfSU5GT19QQVRIKSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlpZiAoc3JjZi0+Zl9vcCAmJiBzcmNmLT5mX29wLT5yZWFkKQorCXsKKwkJLyogY2FyZCBpbmZvcm1hdGlvbiBmaWxlIGV4aXN0cyBzbyByZWFkaW5nIHRoZSBjYXJkIGluZm9ybWF0aW9uICovCisJCW1lbXNldChidWZmZXIsIDB4MDAsIE1BWF9JTklfQlVGRkVSX1NJWkUpOworCQlyZXR2YWwgPSBzcmNmLT5mX29wLT5yZWFkKHNyY2YsIGJ1ZmZlciwgTUFYX0lOSV9CVUZGRVJfU0laRSwgJnNyY2YtPmZfcG9zKTsKKwkJaWYgKHJldHZhbCA8IDApCisJCXsKKwkJCS8qIHJlYWQgZmFpbCAqLworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCQkoIi0tPiBSZWFkICVzIGVycm9yICVkXG4iLCBDQVJEX0lORk9fUEFUSCwgLXJldHZhbCkpOworCQl9CisJCWVsc2UKKwkJeworCQkJLyogZ2V0IGNhcmQgc2VsZWN0aW9uIG1ldGhvZCAqLworCQkJbWVtc2V0KHRtcGJ1ZiwgMHgwMCwgTUFYX1BBUkFNX0JVRkZFUl9TSVpFKTsKKwkJCWNhcmRfc2VsZWN0X21ldGhvZCA9IE1DX1NFTEVDVF9DQVJEVFlQRTsgLy8gZGVmYXVsdAorCisJCQlpZiAoUlRNUEdldEtleVBhcmFtZXRlcigiU0VMRUNUIiwgdG1wYnVmLCAyNTYsIGJ1ZmZlcikpCisJCQl7CisJCQkJaWYgKHN0cmNtcCh0bXBidWYsICJDQVJESUQiKSA9PSAwKQorCQkJCQljYXJkX3NlbGVjdF9tZXRob2QgPSBNQ19TRUxFQ1RfQ0FSRElEOworCQkJCWVsc2UgaWYgKHN0cmNtcCh0bXBidWYsICJNQUMiKSA9PSAwKQorCQkJCQljYXJkX3NlbGVjdF9tZXRob2QgPSBNQ19TRUxFQ1RfTUFDOworCQkJCWVsc2UgaWYgKHN0cmNtcCh0bXBidWYsICJDQVJEVFlQRSIpID09IDApCisJCQkJCWNhcmRfc2VsZWN0X21ldGhvZCA9IE1DX1NFTEVDVF9DQVJEVFlQRTsKKwkJCX0KKworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJCSgiTUM+IENhcmQgU2VsZWN0aW9uID0gJWRcbiIsIGNhcmRfc2VsZWN0X21ldGhvZCkpOworCisJCQkvLyBpbml0CisJCQljYXJkX2ZyZWVfaWQgPSAtMTsKKwkJCWNhcmRfbm91c2VfaWQgPSAtMTsKKwkJCWNhcmRfc2FtZV9tYWNfaWQgPSAtMTsKKwkJCWNhcmRfbWF0Y2hfaWQgPSAtMTsKKworCQkJLy8gc2VhcmNoIGN1cnJlbnQgY2FyZCBpbmZvcm1hdGlvbiByZWNvcmRzCisJCQlmb3IoY2FyZF9pbmRleD0wOworCQkJCWNhcmRfaW5kZXg8TUFYX05VTV9PRl9NVUxUSVBMRV9DQVJEOworCQkJCWNhcmRfaW5kZXgrKykKKwkJCXsKKwkJCQlpZiAoKCooVUlOVDMyICopJk1DX0NhcmRNYWNbY2FyZF9pbmRleF1bMF0gPT0gMCkgJiYKKwkJCQkJKCooVUlOVDE2ICopJk1DX0NhcmRNYWNbY2FyZF9pbmRleF1bNF0gPT0gMCkpCisJCQkJeworCQkJCQkvLyBNQUMgaXMgYWxsLTAgc28gdGhlIGVudHJ5IGlzIGF2YWlsYWJsZQorCQkJCQlNQ19DYXJkVXNlZFtjYXJkX2luZGV4XSA9IDA7CisKKwkJCQkJaWYgKGNhcmRfZnJlZV9pZCA8IDApCisJCQkJCQljYXJkX2ZyZWVfaWQgPSBjYXJkX2luZGV4OyAvLyAxc3QgZnJlZSBlbnRyeQorCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlpZiAobWVtY21wKE1DX0NhcmRNYWNbY2FyZF9pbmRleF0sIG1hYywgNikgPT0gMCkKKwkJCQkJeworCQkJCQkJLy8gd2UgZmluZCB0aGUgZW50cnkgd2l0aCBzYW1lIE1BQworCQkJCQkJaWYgKGNhcmRfc2FtZV9tYWNfaWQgPCAwKQorCQkJCQkJCWNhcmRfc2FtZV9tYWNfaWQgPSBjYXJkX2luZGV4OyAvLyAxc3Qgc2FtZSBlbnRyeQorCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJLy8gTUFDIGlzIG5vdCBhbGwtMCBidXQgdXNlZCBmbGFnID09IDAKKwkJCQkJCWlmICgoTUNfQ2FyZFVzZWRbY2FyZF9pbmRleF0gPT0gMCkgJiYKKwkJCQkJCQkoY2FyZF9ub3VzZV9pZCA8IDApKQorCQkJCQkJeworCQkJCQkJCWNhcmRfbm91c2VfaWQgPSBjYXJkX2luZGV4OyAvLyAxc3QgYXZhaWxhYmxlIGVudHJ5CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCQkoIk1DPiBGcmVlID0gJWQsIFNhbWUgPSAlZCwgTk9VU0UgPSAlZFxuIiwKKwkJCQkJY2FyZF9mcmVlX2lkLCBjYXJkX3NhbWVfbWFjX2lkLCBjYXJkX25vdXNlX2lkKSk7CisKKwkJCWlmICgoY2FyZF9zYW1lX21hY19pZCA+PSAwKSAmJgorCQkJCSgoY2FyZF9zZWxlY3RfbWV0aG9kID09IE1DX1NFTEVDVF9DQVJESUQpIHx8CisJCQkJKGNhcmRfc2VsZWN0X21ldGhvZCA9PSBNQ19TRUxFQ1RfQ0FSRFRZUEUpKSkKKwkJCXsKKwkJCQkvLyBzYW1lIE1BQyBlbnRyeSBpcyBmb3VuZAorCQkJCWNhcmRfbWF0Y2hfaWQgPSBjYXJkX3NhbWVfbWFjX2lkOworCisJCQkJaWYgKGNhcmRfc2VsZWN0X21ldGhvZCA9PSBNQ19TRUxFQ1RfQ0FSRFRZUEUpCisJCQkJeworCQkJCQkvLyBmb3IgQ0FSRFRZUEUKKwkJCQkJc3ByaW50ZihjYXJkX2lkX2J1ZiwgIiUwMmRDQVJEVFlQRSVzIiwKKwkJCQkJCQljYXJkX21hdGNoX2lkLCBSRklDX3dvcmQpOworCisJCQkJCWlmICgoc3RhcnRfcHRyPXJ0c3Ryc3RydW5jYXNlY21wKGJ1ZmZlciwgY2FyZF9pZF9idWYpKSAhPSBOVUxMKQorCQkJCQl7CisJCQkJCQkvLyB3ZSBmb3VuZCB0aGUgY2FyZCBJRAorCQkJCQkJTEVUVEVSX0NBU0VfVFJBTlNMQVRFKHN0YXJ0X3B0ciwgY2FyZF9pZF9idWYpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJZWxzZQorCQkJeworCQkJCS8vIHRoZSBjYXJkIGlzIDFzdCBwbHVnLWluLCB0cnkgdG8gZmluZCB0aGUgbWF0Y2ggY2FyZCBwcm9maWxlCisJCQkJc3dpdGNoKGNhcmRfc2VsZWN0X21ldGhvZCkKKwkJCQl7CisJCQkJCWNhc2UgTUNfU0VMRUNUX0NBUkRJRDogLy8gQ0FSRElECisJCQkJCWRlZmF1bHQ6CisJCQkJCQlpZiAoY2FyZF9mcmVlX2lkID49IDApCisJCQkJCQkJY2FyZF9tYXRjaF9pZCA9IGNhcmRfZnJlZV9pZDsKKwkJCQkJCWVsc2UKKwkJCQkJCQljYXJkX21hdGNoX2lkID0gY2FyZF9ub3VzZV9pZDsKKwkJCQkJCWJyZWFrOworCisJCQkJCWNhc2UgTUNfU0VMRUNUX01BQzogLy8gTUFDCisJCQkJCQlzcHJpbnRmKGNhcmRfaWRfYnVmLCAiTUFDJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMngiLAorCQkJCQkJCQltYWNbMF0sIG1hY1sxXSwgbWFjWzJdLAorCQkJCQkJCQltYWNbM10sIG1hY1s0XSwgbWFjWzVdKTsKKworCQkJCQkJLyogdHJ5IHRvIGZpbmQgdGhlIGtleSB3b3JkIGluIHRoZSBjYXJkIGZpbGUgKi8KKwkJCQkJCWlmICgoc3RhcnRfcHRyPXJ0c3Ryc3RydW5jYXNlY21wKGJ1ZmZlciwgY2FyZF9pZF9idWYpKSAhPSBOVUxMKQorCQkJCQkJeworCQkJCQkJCUxFVFRFUl9DQVNFX1RSQU5TTEFURShzdGFydF9wdHIsIGNhcmRfaWRfYnVmKTsKKworCQkJCQkJCS8qIGdldCB0aGUgcm93IElEICgyIEFTQ0lJIGNoYXJhY3RlcnMpICovCisJCQkJCQkJc3RhcnRfcHRyIC09IDI7CisJCQkJCQkJY2FyZF9pZF9idWZbMF0gPSAqKHN0YXJ0X3B0cik7CisJCQkJCQkJY2FyZF9pZF9idWZbMV0gPSAqKHN0YXJ0X3B0cisxKTsKKwkJCQkJCQljYXJkX2lkX2J1ZlsyXSA9IDB4MDA7CisKKwkJCQkJCQljYXJkX21hdGNoX2lkID0gc2ltcGxlX3N0cnRvbChjYXJkX2lkX2J1ZiwgMCwgMTApOworCQkJCQkJfQorCQkJCQkJYnJlYWs7CisKKwkJCQkJY2FzZSBNQ19TRUxFQ1RfQ0FSRFRZUEU6IC8vIENBUkRUWVBFCisJCQkJCQljYXJkX25vdXNlX2lkID0gLTE7CisKKwkJCQkJCWZvcihjYXJkX2luZGV4PTA7CisJCQkJCQkJY2FyZF9pbmRleDxNQVhfTlVNX09GX01VTFRJUExFX0NBUkQ7CisJCQkJCQkJY2FyZF9pbmRleCsrKQorCQkJCQkJeworCQkJCQkJCXNwcmludGYoY2FyZF9pZF9idWYsICIlMDJkQ0FSRFRZUEUlcyIsCisJCQkJCQkJCQljYXJkX2luZGV4LCBSRklDX3dvcmQpOworCisJCQkJCQkJaWYgKChzdGFydF9wdHI9cnRzdHJzdHJ1bmNhc2VjbXAoYnVmZmVyLAorCQkJCQkJCQkJCQkJCQljYXJkX2lkX2J1ZikpICE9IE5VTEwpCisJCQkJCQkJeworCQkJCQkJCQlMRVRURVJfQ0FTRV9UUkFOU0xBVEUoc3RhcnRfcHRyLCBjYXJkX2lkX2J1Zik7CisKKwkJCQkJCQkJaWYgKE1DX0NhcmRVc2VkW2NhcmRfaW5kZXhdID09IDApCisJCQkJCQkJCXsKKwkJCQkJCQkJCS8qIGN1cnJlbnQgdGhlIGNhcmQgcHJvZmlsZSBpcyBub3QgdXNlZCAqLworCQkJCQkJCQkJaWYgKCgqKFVJTlQzMiAqKSZNQ19DYXJkTWFjW2NhcmRfaW5kZXhdWzBdID09IDApICYmCisJCQkJCQkJCQkJKCooVUlOVDE2ICopJk1DX0NhcmRNYWNbY2FyZF9pbmRleF1bNF0gPT0gMCkpCisJCQkJCQkJCQl7CisJCQkJCQkJCQkJLy8gZmluZCBpdCBhbmQgbm8gcHJldmlvdXMgY2FyZCB1c2UgaXQKKwkJCQkJCQkJCQljYXJkX21hdGNoX2lkID0gY2FyZF9pbmRleDsKKwkJCQkJCQkJCQlicmVhazsKKwkJCQkJCQkJCX0KKwkJCQkJCQkJCWVsc2UKKwkJCQkJCQkJCXsKKwkJCQkJCQkJCQkvLyBldmVyIGEgY2FyZCB1c2UgaXQKKwkJCQkJCQkJCQlpZiAoY2FyZF9ub3VzZV9pZCA8IDApCisJCQkJCQkJCQkJCWNhcmRfbm91c2VfaWQgPSBjYXJkX2luZGV4OworCQkJCQkJCQkJfQorCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJfQorCisJCQkJCQkvLyBpZiBub3QgZmluZCBhIGZyZWUgb25lLCB1c2UgdGhlIGF2YWlsYWJsZSBvbmUKKwkJCQkJCWlmIChjYXJkX21hdGNoX2lkIDwgMCkKKwkJCQkJCQljYXJkX21hdGNoX2lkID0gY2FyZF9ub3VzZV9pZDsKKwkJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKworCQkJaWYgKGNhcmRfbWF0Y2hfaWQgPj0gMCkKKwkJCXsKKwkJCQkvLyBtYWtlIHVwIHNlYXJjaCBrZXl3b3JkCisJCQkJc3dpdGNoKGNhcmRfc2VsZWN0X21ldGhvZCkKKwkJCQl7CisJCQkJCWNhc2UgTUNfU0VMRUNUX0NBUkRJRDogLy8gQ0FSRElECisJCQkJCQlzcHJpbnRmKGNhcmRfaWRfYnVmLCAiJTAyZENBUkRJRCIsIGNhcmRfbWF0Y2hfaWQpOworCQkJCQkJYnJlYWs7CisKKwkJCQkJY2FzZSBNQ19TRUxFQ1RfTUFDOiAvLyBNQUMKKwkJCQkJCXNwcmludGYoY2FyZF9pZF9idWYsCisJCQkJCQkJCSIlMDJkbWFjJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMngiLAorCQkJCQkJCQljYXJkX21hdGNoX2lkLAorCQkJCQkJCQltYWNbMF0sIG1hY1sxXSwgbWFjWzJdLAorCQkJCQkJCQltYWNbM10sIG1hY1s0XSwgbWFjWzVdKTsKKwkJCQkJCWJyZWFrOworCisJCQkJCWNhc2UgTUNfU0VMRUNUX0NBUkRUWVBFOiAvLyBDQVJEVFlQRQorCQkJCQlkZWZhdWx0OgorCQkJCQkJc3ByaW50ZihjYXJkX2lkX2J1ZiwgIiUwMmRjYXJkdHlwZSVzIiwKKwkJCQkJCQkJY2FyZF9tYXRjaF9pZCwgUkZJQ193b3JkKTsKKwkJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNlYXJjaCBLZXl3b3JkID0gJXNcbiIsIGNhcmRfaWRfYnVmKSk7CisKKwkJCQkvLyByZWFkIGNhcmQgZmlsZSBwYXRoCisJCQkJaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIoY2FyZF9pZF9idWYsIHRtcGJ1ZiwgMjU2LCBidWZmZXIpKQorCQkJCXsKKwkJCQkJaWYgKHN0cmxlbih0bXBidWYpIDwgc2l6ZW9mKHBBZC0+TUNfRmlsZU5hbWUpKQorCQkJCQl7CisJCQkJCQkvLyBiYWNrdXAgY2FyZCBpbmZvcm1hdGlvbgorCQkJCQkJcEFkLT5NQ19Sb3dJRCA9IGNhcmRfbWF0Y2hfaWQ7IC8qIGJhc2UgMCAqLworCQkJCQkJTUNfQ2FyZFVzZWRbY2FyZF9tYXRjaF9pZF0gPSAxOworCQkJCQkJbWVtY3B5KE1DX0NhcmRNYWNbY2FyZF9tYXRjaF9pZF0sIG1hYywgc2l6ZW9mKG1hYykpOworCisJCQkJCQkvLyBiYWNrdXAgY2FyZCBmaWxlIHBhdGgKKwkJCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+TUNfRmlsZU5hbWUsIHRtcGJ1ZiAsIHN0cmxlbih0bXBidWYpKTsKKwkJCQkJCXBBZC0+TUNfRmlsZU5hbWVbc3RybGVuKHRtcGJ1ZildID0gJ1wwJzsKKwkJCQkJCWZsZ19tYXRjaF9vayA9IFRSVUU7CisKKwkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCQkJCQkoIkNhcmQgUHJvZmlsZSBOYW1lID0gJXNcbiIsIHBBZC0+TUNfRmlsZU5hbWUpKTsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJCQkJCQkoIkNhcmQgUHJvZmlsZSBOYW1lIGxlbmd0aCB0b28gbGFyZ2UhXG4iKSk7CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkJCQkJKCJDYW4gbm90IGZpbmQgc2VhcmNoIGtleSB3b3JkIGluIGNhcmQuZGF0IVxuIikpOworCQkJCX0KKworCQkJCWlmICgoZmxnX21hdGNoX29rICE9IFRSVUUpICYmCisJCQkJCShjYXJkX21hdGNoX2lkIDwgTUFYX05VTV9PRl9NVUxUSVBMRV9DQVJEKSkKKwkJCQl7CisJCQkJCU1DX0NhcmRVc2VkW2NhcmRfbWF0Y2hfaWRdID0gMDsKKwkJCQkJbWVtc2V0KE1DX0NhcmRNYWNbY2FyZF9tYXRjaF9pZF0sIDAsIHNpemVvZihtYWMpKTsKKwkJCQl9CisJCQl9IC8vIGlmIChjYXJkX21hdGNoX2lkID49IDApCisJCX0KKwl9CisKKwkvLyBjbG9zZSBmaWxlCisJcmV0dmFsID0gZmlscF9jbG9zZShzcmNmLCBOVUxMKTsKKwlzZXRfZnMob3JnZnMpOworCWN1cnJlbnQtPmZzdWlkID0gb3JnZnN1aWQ7CisJY3VycmVudC0+ZnNnaWQgPSBvcmdmc2dpZDsKKwlrZnJlZShidWZmZXIpOworCWtmcmVlKHRtcGJ1Zik7CisJcmV0dXJuIGZsZ19tYXRjaF9vazsKK30KKyNlbmRpZiAvLyBNVUxUSVBMRV9DQVJEX1NVUFBPUlQgLy8KKworCisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgIFByb2JlIFJUMjhYWCBjaGlwc2V0LgorCitBcmd1bWVudHM6CisgICAgX2Rldl9wCQkJCVBvaW50IHRvIHRoZSBQQ0kgb3IgVVNCIGRldmljZQorCV9kZXZfaWRfcAkJCVBvaW50IHRvIHRoZSBQQ0kgb3IgVVNCIGRldmljZSBJRAorCitSZXR1cm4gVmFsdWU6CisgICAgMAkJCQkJUHJvYmUgT0sKKwktRU5PREVWCQkJCVByb2JlIEZhaWwKKworTm90ZToKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVCBfX2RldmluaXQgICBydDI4eHhfcHJvYmUoCisgICAgSU4gIHZvaWQgKl9kZXZfcCwKKyAgICBJTiAgdm9pZCAqX2Rldl9pZF9wLAorCUlOICBVSU5UIGFyZ2MsCisJT1VUIFBSVE1QX0FEQVBURVIgKnBwQWQpCit7CisgICAgc3RydWN0ICBuZXRfZGV2aWNlCSpuZXRfZGV2OworICAgIFBSVE1QX0FEQVBURVIgICAgICAgcEFkID0gKFBSVE1QX0FEQVBURVIpIE5VTEw7CisgICAgSU5UICAgICAgICAgICAgICAgICBzdGF0dXM7CisJUFZPSUQJCQkJaGFuZGxlOworI2lmZGVmIFJUMjg2MAorCXN0cnVjdCBwY2lfZGV2ICpkZXZfcCA9IChzdHJ1Y3QgcGNpX2RldiAqKV9kZXZfcDsKKyNlbmRpZiAvLyBSVDI4NjAgLy8KKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU1RBIERyaXZlciB2ZXJzaW9uLSVzXG4iLCBTVEFfRFJJVkVSX1ZFUlNJT04pKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8PSAweDIwNDAyICAgICAgIC8vIFJlZCBIYXQgNy4xCisgICAgbmV0X2RldiA9IGFsbG9jX25ldGRldihzaXplb2YoUFJUTVBfQURBUFRFUiksICJldGglZCIsIGV0aGVyX3NldHVwKTsKKyNlbHNlCisgICAgbmV0X2RldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihQUlRNUF9BREFQVEVSKSk7CisjZW5kaWYKKyAgICBpZiAobmV0X2RldiA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgcHJpbnRrKCJhbGxvY19uZXRkZXYgZmFpbGVkXG4iKTsKKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDUsMCkKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMTUpCisJCW1vZHVsZV9wdXQoVEhJU19NT0RVTEUpOworI2VuZGlmIC8vTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDE1KQorI2Vsc2UKKwkJTU9EX0RFQ19VU0VfQ09VTlQ7CisjZW5kaWYKKyAgICAgICAgZ290byBlcnJfb3V0OworICAgIH0KKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwyNCkKKyAgICBTRVRfTU9EVUxFX09XTkVSKG5ldF9kZXYpOworI2VuZGlmCisKKwluZXRpZl9zdG9wX3F1ZXVlKG5ldF9kZXYpOworI2lmZGVmIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisvKiBmb3Igc3VwcG9ydGluZyBOZXR3b3JrIE1hbmFnZXIgKi8KKy8qIFNldCB0aGUgc3lzZnMgcGh5c2ljYWwgZGV2aWNlIHJlZmVyZW5jZSBmb3IgdGhlIG5ldHdvcmsgbG9naWNhbCBkZXZpY2UKKyAqIGlmIHNldCBwcmlvciB0byByZWdpc3RyYXRpb24gd2lsbCBjYXVzZSBhIHN5bWxpbmsgZHVyaW5nIGluaXRpYWxpemF0aW9uLgorICovCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMCkpCisgICAgU0VUX05FVERFVl9ERVYobmV0X2RldiwgJihkZXZfcC0+ZGV2KSk7CisjZW5kaWYKKyNlbmRpZiAvLyBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCisJLy8gQWxsb2NhdGUgUlRNUF9BREFQVEVSIG1pbmlwb3J0IGFkYXB0ZXIgc3RydWN0dXJlCisJaGFuZGxlID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IG9zX2Nvb2tpZSksIEdGUF9LRVJORUwpOworCVJUMjhYWF9IQU5ETEVfREVWX0FTU0lHTihoYW5kbGUsIGRldl9wKTsKKworCXN0YXR1cyA9IFJUTVBBbGxvY0FkYXB0ZXJCbG9jayhoYW5kbGUsICZwQWQpOworCWlmIChzdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJZ290byBlcnJfb3V0X2ZyZWVfbmV0ZGV2OworCisJbmV0X2Rldi0+bWxfcHJpdiA9IChQVk9JRClwQWQ7CisgICAgcEFkLT5uZXRfZGV2ID0gbmV0X2RldjsgLy8gbXVzdCBiZSBiZWZvcmUgUlQyOFhYTmV0RGV2SW5pdCgpCisKKwlSVDI4WFhOZXREZXZJbml0KF9kZXZfcCwgbmV0X2RldiwgcEFkKTsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorICAgIHBBZC0+U3RhQ2ZnLk9yaURldlR5cGUgPSBuZXRfZGV2LT50eXBlOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJLy8gUG9zdCBjb25maWcKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkKKwlpZiAoUlQyOFhYUHJvYmVQb3N0Q29uZmlnKF9kZXZfcCwgcEFkLCBhcmdjKSA9PSBGQUxTRSkKKwkJZ290byBlcnJfb3V0X3VubWFwOworI2Vsc2UKKwlpZiAoUlQyOFhYUHJvYmVQb3N0Q29uZmlnKF9kZXZfcCwgcEFkLCAwKSA9PSBGQUxTRSkKKwkJZ290byBlcnJfb3V0X3VubWFwOworI2VuZGlmIC8vIExJTlVYX1ZFUlNJT05fQ09ERSAvLworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJcEFkLT5PcE1vZGUgPSBPUE1PREVfU1RBOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisKKyNpZmRlZiBNVUxUSVBMRV9DQVJEX1NVUFBPUlQKKwkvLyBmaW5kIGl0cyBwcm9maWxlIHBhdGgKKwlwQWQtPk1DX1Jvd0lEID0gLTE7IC8vIHVzZSBkZWZhdWx0IHByb2ZpbGUgcGF0aAorCVJUTVBfQ2FyZEluZm9SZWFkKHBBZCk7CisKKwlpZiAocEFkLT5NQ19Sb3dJRCA9PSAtMSkKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJc3RyY3B5KHBBZC0+TUNfRmlsZU5hbWUsIFNUQV9QUk9GSUxFX1BBVEgpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkoIk1DPiBST1cgPSAlZCwgUEFUSCA9ICVzXG4iLCBwQWQtPk1DX1Jvd0lELCBwQWQtPk1DX0ZpbGVOYW1lKSk7CisjZW5kaWYgLy8gTVVMVElQTEVfQ0FSRF9TVVBQT1JUIC8vCisKKwkvLyBzYW1wbGUgbW92ZQorCWlmIChydF9pZWVlODAyMTFfaWZfc2V0dXAobmV0X2RldiwgcEFkKSAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCQlnb3RvIGVycl9vdXRfdW5tYXA7CisKKyAgICAvLyBSZWdpc3RlciB0aGlzIGRldmljZQorICAgIHN0YXR1cyA9IHJlZ2lzdGVyX25ldGRldihuZXRfZGV2KTsKKyAgICBpZiAoc3RhdHVzKQorICAgICAgICBnb3RvIGVycl9vdXRfdW5tYXA7CisKKyAgICAvLyBTZXQgZHJpdmVyIGRhdGEKKwlSVDI4WFhfRFJWREFUQV9TRVQoX2Rldl9wKTsKKworCSpwcEFkID0gcEFkOworICAgIHJldHVybiAwOyAvLyBwcm9iZSBvaworCisKKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRVJST1IgSEFORExFIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworZXJyX291dF91bm1hcDoKKwlSVE1QRnJlZUFkYXB0ZXIocEFkKTsKKwlSVDI4WFhfVU5NQVAoKTsKKworZXJyX291dF9mcmVlX25ldGRldjoKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApCisgICAgZnJlZV9uZXRkZXYobmV0X2Rldik7CisjZWxzZQorCWtmcmVlKG5ldF9kZXYpOworI2VuZGlmCisKK2Vycl9vdXQ6CisJUlQyOFhYX1BVVF9ERVZJQ0UoZGV2X3ApOworCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDApCisJcmV0dXJuIChMT05HKU5VTEw7CisjZWxzZQorICAgIHJldHVybiAtRU5PREVWOyAvKiBwcm9iZSBmYWlsICovCisjZW5kaWYgLy8gTElOVVhfVkVSU0lPTl9DT0RFIC8vCit9IC8qIEVuZCBvZiBydDI4eHhfcHJvYmUgKi8KKworCisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgIFRoZSBlbnRyeSBwb2ludCBmb3IgTGludXgga2VybmVsIHNlbnQgcGFja2V0IHRvIG91ciBkcml2ZXIuCisKK0FyZ3VtZW50czoKKyAgICBza19idWZmICpza2IJCXRoZSBwb2ludGVyIHJlZmVyIHRvIGEgc2tfYnVmZmVyLgorCitSZXR1cm4gVmFsdWU6CisgICAgMAorCitOb3RlOgorCVRoaXMgZnVuY3Rpb24gaXMgdGhlIGVudHJ5IHBvaW50IG9mIFR4IFBhdGggZm9yIE9zIGRlbGl2ZXJ5IHBhY2tldCB0bworCW91ciBkcml2ZXIuIFlvdSBvbmx5IGNhbiBwdXQgT1MtZGVwZW5lZCAmIFNUQS9BUCBjb21tb24gaGFuZGxlIHByb2NlZHVyZXMKKwlpbiBoZXJlLgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworaW50IHJ0Mjh4eF9wYWNrZXRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2ID0gc2tiLT5kZXY7CisJUFJUTVBfQURBUFRFUiBwQWQgPSBuZXRfZGV2LT5tbF9wcml2OworCWludCBzdGF0dXMgPSAwOworCVBORElTX1BBQ0tFVCBwUGFja2V0ID0gKFBORElTX1BBQ0tFVCkgc2tiOworCisJLyogUlQyODcwU1RBIGRvZXMgdGhpcyBpbiBSVE1QU2VuZFBhY2tldHMoKSAqLworI2lmZGVmIFJBTElOS19BVEUKKwlpZiAoQVRFX09OKHBBZCkpCisJeworCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFBhY2tldCwgTkRJU19TVEFUVVNfUkVTT1VSQ0VTKTsKKwkJcmV0dXJuIDA7CisJfQorI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJeworCQkvLyBEcm9wIHNlbmQgcmVxdWVzdCBzaW5jZSB3ZSBhcmUgaW4gbW9uaXRvciBtb2RlCisJCWlmIChNT05JVE9SX09OKHBBZCkpCisJCXsKKwkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworICAgICAgICAvLyBFYXBvbFN0YXJ0IHNpemUgaXMgMTgKKwlpZiAoc2tiLT5sZW4gPCAxNCkKKwl7CisJCS8vcHJpbnRrKCJiYWQgcGFja2V0IHNpemU6ICVkXG4iLCBwa3QtPmxlbik7CisJCWhleF9kdW1wKCJiYWQgcGFja2V0Iiwgc2tiLT5kYXRhLCBza2ItPmxlbik7CisJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJZ290byBkb25lOworCX0KKworCVJUTVBfU0VUX1BBQ0tFVF81VlQocFBhY2tldCwgMCk7CisjaWZkZWYgQ09ORklHXzVWVF9FTkhBTkNFCisgICAgaWYgKCooaW50Kikoc2tiLT5jYikgPT0gQlJJREdFX1RBRykgeworCQlSVE1QX1NFVF9QQUNLRVRfNVZUKHBQYWNrZXQsIDEpOworICAgIH0KKyNlbmRpZgorCisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJeworCisJCVNUQVNlbmRQYWNrZXRzKChORElTX0hBTkRMRSlwQWQsIChQUE5ESVNfUEFDS0VUKSAmcFBhY2tldCwgMSk7CisJfQorCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlzdGF0dXMgPSAwOworZG9uZToKKworCXJldHVybiBzdGF0dXM7Cit9CisKKworLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICBTZW5kIGEgcGFja2V0IHRvIFdMQU4uCisKK0FyZ3VtZW50czoKKyAgICBza2JfcCAgICAgICAgICAgcG9pbnRzIHRvIG91ciBhZGFwdGVyCisgICAgZGV2X3AgICAgICAgICAgIHdoaWNoIFdMQU4gbmV0d29yayBpbnRlcmZhY2UKKworUmV0dXJuIFZhbHVlOgorICAgIDA6IHRyYW5zbWl0IHN1Y2Nlc3NmdWxseQorICAgIG90aGVyd2lzZTogdHJhbnNtaXQgZmFpbAorCitOb3RlOgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UIHJ0Mjh4eF9zZW5kX3BhY2tldHMoCisJSU4gc3RydWN0IHNrX2J1ZmYgCQkqc2tiX3AsCisJSU4gc3RydWN0IG5ldF9kZXZpY2UgCSpuZXRfZGV2KQoreworICAgIFJUTVBfQURBUFRFUiAqcEFkID0gbmV0X2Rldi0+bWxfcHJpdjsKKwlpZiAoIShuZXRfZGV2LT5mbGFncyAmIElGRl9VUCkpCisJeworCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgKFBORElTX1BBQ0tFVClza2JfcCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCXJldHVybiAwOworCX0KKworCU5kaXNaZXJvTWVtb3J5KChQVUNIQVIpJnNrYl9wLT5jYltDQl9PRkZdLCAxNSk7CisJUlRNUF9TRVRfUEFDS0VUX05FVF9ERVZJQ0VfTUJTU0lEKHNrYl9wLCBNQUlOX01CU1NJRCk7CisKKwlyZXR1cm4gcnQyOHh4X3BhY2tldF94bWl0KHNrYl9wKTsKKworfSAvKiBFbmQgb2YgTUJTU19WaXJ0dWFsSUZfUGFja2V0U2VuZCAqLworCisKKworCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDw9IDB4MjA0MDIJLy8gUmVkIEhhdCA3LjEKK3N0cnVjdCBuZXRfZGV2aWNlICphbGxvY19uZXRkZXYoCisJaW50IHNpemVvZl9wcml2LAorCWNvbnN0IGNoYXIgKm1hc2ssCisJdm9pZCAoKnNldHVwKShzdHJ1Y3QgbmV0X2RldmljZSAqKSkKK3sKKyAgICBzdHJ1Y3QgbmV0X2RldmljZQkqZGV2OworICAgIElOVAkJCQkJYWxsb2Nfc2l6ZTsKKworCisgICAgLyogZW5zdXJlIDMyLWJ5dGUgYWxpZ25tZW50IG9mIHRoZSBwcml2YXRlIGFyZWEgKi8KKyAgICBhbGxvY19zaXplID0gc2l6ZW9mICgqZGV2KSArIHNpemVvZl9wcml2ICsgMzE7CisKKyAgICBkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKikga21hbGxvYyhhbGxvY19zaXplLCBHRlBfS0VSTkVMKTsKKyAgICBpZiAoZGV2ID09IE5VTEwpCisgICAgeworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCQkoImFsbG9jX25ldGRldjogVW5hYmxlIHRvIGFsbG9jYXRlIGRldmljZSBtZW1vcnkuXG4iKSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIG1lbXNldChkZXYsIDAsIGFsbG9jX3NpemUpOworCisgICAgaWYgKHNpemVvZl9wcml2KQorICAgICAgICBkZXYtPnByaXYgPSAodm9pZCAqKSAoKChsb25nKShkZXYgKyAxKSArIDMxKSAmIH4zMSk7CisKKyAgICBzZXR1cChkZXYpOworICAgIHN0cmNweShkZXYtPm5hbWUsIG1hc2spOworCisgICAgcmV0dXJuIGRldjsKK30KKyNlbmRpZiAvLyBMSU5VWF9WRVJTSU9OX0NPREUgLy8KKworCit2b2lkIENmZ0luaXRIb29rKFBSVE1QX0FEQVBURVIgcEFkKQoreworCXBBZC0+YkJyb2FkQ29tSFQgPSBUUlVFOworfSAvKiBFbmQgb2YgQ2ZnSW5pdEhvb2sgKi8KKworCisjaWYgV0lSRUxFU1NfRVhUID49IDEyCisvLyBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIHdoZW4gcXVlcnkgL3Byb2MKK3N0cnVjdCBpd19zdGF0aXN0aWNzICpydDI4eHhfZ2V0X3dpcmVsZXNzX3N0YXRzKAorICAgIElOIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2KQoreworCVBSVE1QX0FEQVBURVIgcEFkID0gbmV0X2Rldi0+bWxfcHJpdjsKKworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgicnQyOHh4X2dldF93aXJlbGVzc19zdGF0cyAtLS0+XG4iKSk7CisKKwlwQWQtPml3X3N0YXRzLnN0YXR1cyA9IDA7IC8vIFN0YXR1cyAtIGRldmljZSBkZXBlbmRlbnQgZm9yIG5vdworCisJLy8gbGluayBxdWFsaXR5CisJcEFkLT5pd19zdGF0cy5xdWFsLnF1YWwgPSAoKHBBZC0+TWxtZS5DaGFubmVsUXVhbGl0eSAqIDEyKS8xMCArIDEwKTsKKwlpZihwQWQtPml3X3N0YXRzLnF1YWwucXVhbCA+IDEwMCkKKwkJcEFkLT5pd19zdGF0cy5xdWFsLnF1YWwgPSAxMDA7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlpZiAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkKKwkJcEFkLT5pd19zdGF0cy5xdWFsLmxldmVsID0gUlRNUE1heFJzc2kocEFkLCBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMCwgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTEsIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kyKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCXBBZC0+aXdfc3RhdHMucXVhbC5ub2lzZSA9IHBBZC0+QmJwV3JpdGVMYXRjaFs2Nl07IC8vIG5vaXNlIGxldmVsIChkQm0pCisKKwlwQWQtPml3X3N0YXRzLnF1YWwubm9pc2UgKz0gMjU2IC0gMTQzOworCXBBZC0+aXdfc3RhdHMucXVhbC51cGRhdGVkID0gMTsgICAgIC8vIEZsYWdzIHRvIGtub3cgaWYgdXBkYXRlZAorI2lmZGVmIElXX1FVQUxfREJNCisJcEFkLT5pd19zdGF0cy5xdWFsLnVwZGF0ZWQgfD0gSVdfUVVBTF9EQk07CS8vIExldmVsICsgTm9pc2UgYXJlIGRCbQorI2VuZGlmIC8vIElXX1FVQUxfREJNIC8vCisKKwlwQWQtPml3X3N0YXRzLmRpc2NhcmQubndpZCA9IDA7ICAgICAvLyBSeCA6IFdyb25nIG53aWQvZXNzaWQKKwlwQWQtPml3X3N0YXRzLm1pc3MuYmVhY29uID0gMDsgICAgICAvLyBNaXNzZWQgYmVhY29ucy9zdXBlcmZyYW1lCisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8LS0tIHJ0Mjh4eF9nZXRfd2lyZWxlc3Nfc3RhdHNcbiIpKTsKKwlyZXR1cm4gJnBBZC0+aXdfc3RhdHM7Cit9IC8qIEVuZCBvZiBydDI4eHhfZ2V0X3dpcmVsZXNzX3N0YXRzICovCisjZW5kaWYgLy8gV0lSRUxFU1NfRVhUIC8vCisKKworCit2b2lkIHRidHRfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisjZGVmaW5lIE1BWF9UWF9JTl9UQlRUCQkoMTYpCisKK30KKworSU5UIHJ0Mjh4eF9pb2N0bCgKKwlJTglzdHJ1Y3QgbmV0X2RldmljZQkqbmV0X2RldiwKKwlJTglPVVQJc3RydWN0IGlmcmVxCSpycSwKKwlJTglJTlQJCQkJCWNtZCkKK3sKKwlWSVJUVUFMX0FEQVBURVIJKnBWaXJ0dWFsQWQgPSBOVUxMOworCVJUTVBfQURBUFRFUgkqcEFkID0gTlVMTDsKKwlJTlQJCQkJcmV0ID0gMDsKKworCWlmIChuZXRfZGV2LT5wcml2X2ZsYWdzID09IElOVF9NQUlOKQorCXsKKwkJcEFkID0gbmV0X2Rldi0+bWxfcHJpdjsKKwl9CisJZWxzZQorCXsKKwkJcFZpcnR1YWxBZCA9IG5ldF9kZXYtPm1sX3ByaXY7CisJCXBBZCA9IHBWaXJ0dWFsQWQtPlJ0bXBEZXYtPm1sX3ByaXY7CisJfQorCisJaWYgKHBBZCA9PSBOVUxMKQorCXsKKwkJLyogaWYgMXN0IG9wZW4gZmFpbCwgcEFkIHdpbGwgYmUgZnJlZTsKKwkJICAgU28gdGhlIG5ldF9kZXYtPm1sX3ByaXYgd2lsbCBiZSBOVUxMIGluIDJyZCBvcGVuICovCisJCXJldHVybiAtRU5FVERPV047CisJfQorCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCXsKKwkJcmV0ID0gcnQyOHh4X3N0YV9pb2N0bChuZXRfZGV2LCBycSwgY21kKTsKKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlyZXR1cm4gcmV0OworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICAgICAgcmV0dXJuIGV0aGVybmV0IHN0YXRpc3RpY3MgY291bnRlcgorCisgICAgQXJndW1lbnRzOgorICAgICAgICBuZXRfZGV2ICAgICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byBuZXRfZGV2aWNlCisKKyAgICBSZXR1cm4gVmFsdWU6CisgICAgICAgIG5ldF9kZXZpY2Vfc3RhdHMqCisKKyAgICBOb3RlOgorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKlJUMjh4eF9nZXRfZXRoZXJfc3RhdHMoCisgICAgSU4gIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2KQoreworICAgIFJUTVBfQURBUFRFUiAqcEFkID0gTlVMTDsKKworCWlmIChuZXRfZGV2KQorCQlwQWQgPSBuZXRfZGV2LT5tbF9wcml2OworCisJaWYgKHBBZCkKKwl7CisKKwkJcEFkLT5zdGF0cy5yeF9wYWNrZXRzID0gcEFkLT5XbGFuQ291bnRlcnMuUmVjZWl2ZWRGcmFnbWVudENvdW50LlF1YWRQYXJ0OworCQlwQWQtPnN0YXRzLnR4X3BhY2tldHMgPSBwQWQtPldsYW5Db3VudGVycy5UcmFuc21pdHRlZEZyYWdtZW50Q291bnQuUXVhZFBhcnQ7CisKKwkJcEFkLT5zdGF0cy5yeF9ieXRlcyA9IHBBZC0+UmFsaW5rQ291bnRlcnMuUmVjZWl2ZWRCeXRlQ291bnQ7CisJCXBBZC0+c3RhdHMudHhfYnl0ZXMgPSBwQWQtPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkQnl0ZUNvdW50OworCisJCXBBZC0+c3RhdHMucnhfZXJyb3JzID0gcEFkLT5Db3VudGVyczgwMjMuUnhFcnJvcnM7CisJCXBBZC0+c3RhdHMudHhfZXJyb3JzID0gcEFkLT5Db3VudGVyczgwMjMuVHhFcnJvcnM7CisKKwkJcEFkLT5zdGF0cy5yeF9kcm9wcGVkID0gMDsKKwkJcEFkLT5zdGF0cy50eF9kcm9wcGVkID0gMDsKKworCSAgICBwQWQtPnN0YXRzLm11bHRpY2FzdCA9IHBBZC0+V2xhbkNvdW50ZXJzLk11bHRpY2FzdFJlY2VpdmVkRnJhbWVDb3VudC5RdWFkUGFydDsgICAvLyBtdWx0aWNhc3QgcGFja2V0cyByZWNlaXZlZAorCSAgICBwQWQtPnN0YXRzLmNvbGxpc2lvbnMgPSBwQWQtPkNvdW50ZXJzODAyMy5PbmVDb2xsaXNpb24gKyBwQWQtPkNvdW50ZXJzODAyMy5Nb3JlQ29sbGlzaW9uczsgIC8vIENvbGxpc2lvbiBwYWNrZXRzCisKKwkgICAgcEFkLT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzID0gMDsKKwkgICAgcEFkLT5zdGF0cy5yeF9vdmVyX2Vycm9ycyA9IHBBZC0+Q291bnRlcnM4MDIzLlJ4Tm9CdWZmZXI7ICAgICAgICAgICAgICAgICAgIC8vIHJlY2VpdmVyIHJpbmcgYnVmZiBvdmVyZmxvdworCSAgICBwQWQtPnN0YXRzLnJ4X2NyY19lcnJvcnMgPSAwOy8vcEFkLT5XbGFuQ291bnRlcnMuRkNTRXJyb3JDb3VudDsgICAgIC8vIHJlY3ZlZCBwa3Qgd2l0aCBjcmMgZXJyb3IKKwkgICAgcEFkLT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMgPSBwQWQtPkNvdW50ZXJzODAyMy5SY3ZBbGlnbm1lbnRFcnJvcnM7ICAgICAgICAgIC8vIHJlY3YnZCBmcmFtZSBhbGlnbm1lbnQgZXJyb3IKKwkgICAgcEFkLT5zdGF0cy5yeF9maWZvX2Vycm9ycyA9IHBBZC0+Q291bnRlcnM4MDIzLlJ4Tm9CdWZmZXI7ICAgICAgICAgICAgICAgICAgIC8vIHJlY3YnciBmaWZvIG92ZXJydW4KKwkgICAgcEFkLT5zdGF0cy5yeF9taXNzZWRfZXJyb3JzID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlY2VpdmVyIG1pc3NlZCBwYWNrZXQKKworCSAgICAvLyBkZXRhaWxlZCB0eF9lcnJvcnMKKwkgICAgcEFkLT5zdGF0cy50eF9hYm9ydGVkX2Vycm9ycyA9IDA7CisJICAgIHBBZC0+c3RhdHMudHhfY2Fycmllcl9lcnJvcnMgPSAwOworCSAgICBwQWQtPnN0YXRzLnR4X2ZpZm9fZXJyb3JzID0gMDsKKwkgICAgcEFkLT5zdGF0cy50eF9oZWFydGJlYXRfZXJyb3JzID0gMDsKKwkgICAgcEFkLT5zdGF0cy50eF93aW5kb3dfZXJyb3JzID0gMDsKKworCSAgICAvLyBmb3IgY3NsaXAgZXRjCisJICAgIHBBZC0+c3RhdHMucnhfY29tcHJlc3NlZCA9IDA7CisJICAgIHBBZC0+c3RhdHMudHhfY29tcHJlc3NlZCA9IDA7CisKKwkJcmV0dXJuICZwQWQtPnN0YXRzOworCX0KKwllbHNlCisgICAgCXJldHVybiBOVUxMOworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0X3Byb2ZpbGUuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRfcHJvZmlsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyNmEzY2IKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0X3Byb2ZpbGUuYwpAQCAtMCwwICsxLDE5ODEgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKyNpbmNsdWRlICJydF9jb25maWcuaCIKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorc3RhdGljIHZvaWQgSFRQYXJhbWV0ZXJzSG9vaygKKwlJTglQUlRNUF9BREFQVEVSIHBBZCwKKwlJTglDSEFSCQkgICpwVmFsdWVTdHIsCisJSU4JQ0hBUgkJICAqcElucHV0KTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworI2RlZmluZSBFVEhfTUFDX0FERFJfU1RSX0xFTiAxNyAgLy8gaW4gZm9ybWF0IG9mIHh4Onh4Onh4Onh4Onh4Onh4CisKKy8vIFdlIGFzc3VtZSB0aGUgczEgaXMgYSBzdGluZywgczIgaXMgYSBtZW1vcnkgc3BhY2Ugd2l0aCA2IGJ5dGVzLiBhbmQgY29udGVudCBvZiBzMSB3aWxsIGJlIGNoYW5nZWQuCitCT09MRUFOIHJ0c3RybWFjdG9oZXgoY2hhciAqczEsIGNoYXIgKnMyKQoreworCWludCBpID0gMDsKKwljaGFyICpwdG9rUyA9IHMxLCAqcHRva0UgPSBzMTsKKworCWlmIChzdHJsZW4oczEpICE9IEVUSF9NQUNfQUREUl9TVFJfTEVOKQorCQlyZXR1cm4gRkFMU0U7CisKKwl3aGlsZSgoKnB0b2tTKSAhPSAnXDAnKQorCXsKKwkJaWYoKHB0b2tFID0gc3RyY2hyKHB0b2tTLCAnOicpKSAhPSBOVUxMKQorCQkJKnB0b2tFKysgPSAnXDAnOworCQlpZiAoKHN0cmxlbihwdG9rUykgIT0gMikgfHwgKCFpc3hkaWdpdCgqcHRva1MpKSB8fCAoIWlzeGRpZ2l0KCoocHRva1MrMSkpKSkKKwkJCWJyZWFrOyAvLyBmYWlsCisJCUF0b0gocHRva1MsICZzMltpKytdLCAxKTsKKwkJcHRva1MgPSBwdG9rRTsKKwkJaWYgKGkgPT0gNikKKwkJCWJyZWFrOyAvLyBwYXJzaW5nIGZpbmlzaGVkCisJfQorCisJcmV0dXJuICggaSA9PSA2ID8gVFJVRSA6IEZBTFNFKTsKKworfQorCisKKy8vIHdlIGFzc3VtZSB0aGUgczEgYW5kIHMyIGJvdGggYXJlIHN0cmluZ3MuCitCT09MRUFOIHJ0c3RyY2FzZWNtcChjaGFyICpzMSwgY2hhciAqczIpCit7CisJY2hhciAqcDEgPSBzMSwgKnAyID0gczI7CisKKwlpZiAoc3RybGVuKHMxKSAhPSBzdHJsZW4oczIpKQorCQlyZXR1cm4gRkFMU0U7CisKKwl3aGlsZSgqcDEgIT0gJ1wwJykKKwl7CisJCWlmKCgqcDEgIT0gKnAyKSAmJiAoKCpwMSBeICpwMikgIT0gMHgyMCkpCisJCQlyZXR1cm4gRkFMU0U7CisJCXAxKys7CisJCXAyKys7CisJfQorCisJcmV0dXJuIFRSVUU7Cit9CisKKy8vIHdlIGFzc3VtZSB0aGUgczEgKGJ1ZmZlcikgYW5kIHMyIChrZXkpIGJvdGggYXJlIHN0cmluZ3MuCitjaGFyICogcnRzdHJzdHJ1bmNhc2VjbXAoY2hhciAqIHMxLCBjaGFyICogczIpCit7CisJSU5UIGwxLCBsMiwgaTsKKwljaGFyIHRlbXAxLCB0ZW1wMjsKKworCWwyID0gc3RybGVuKHMyKTsKKwlpZiAoIWwyKQorCQlyZXR1cm4gKGNoYXIgKikgczE7CisKKwlsMSA9IHN0cmxlbihzMSk7CisKKwl3aGlsZSAobDEgPj0gbDIpCisJeworCQlsMS0tOworCisJCWZvcihpPTA7IGk8bDI7IGkrKykKKwkJeworCQkJdGVtcDEgPSAqKHMxK2kpOworCQkJdGVtcDIgPSAqKHMyK2kpOworCisJCQlpZiAoKCdhJyA8PSB0ZW1wMSkgJiYgKHRlbXAxIDw9ICd6JykpCisJCQkJdGVtcDEgPSAnQScrKHRlbXAxLSdhJyk7CisJCQlpZiAoKCdhJyA8PSB0ZW1wMikgJiYgKHRlbXAyIDw9ICd6JykpCisJCQkJdGVtcDIgPSAnQScrKHRlbXAyLSdhJyk7CisKKwkJCWlmICh0ZW1wMSAhPSB0ZW1wMikKKwkJCQlicmVhazsKKwkJfQorCisJCWlmIChpID09IGwyKQorCQkJcmV0dXJuIChjaGFyICopIHMxOworCisJCXMxKys7CisJfQorCisJcmV0dXJuIE5VTEw7IC8vIG5vdCBmb3VuZAorfQorCisvL2FkZCBieSBrYXRoeQorCisgLyoqCisgICogc3Ryc3RyIC0gRmluZCB0aGUgZmlyc3Qgc3Vic3RyaW5nIGluIGEgJU5VTCB0ZXJtaW5hdGVkIHN0cmluZworICAqIEBzMTogVGhlIHN0cmluZyB0byBiZSBzZWFyY2hlZAorICAqIEBzMjogVGhlIHN0cmluZyB0byBzZWFyY2ggZm9yCisgICovCitjaGFyICogcnRzdHJzdHIoY29uc3QgY2hhciAqIHMxLGNvbnN0IGNoYXIgKiBzMikKK3sKKwlJTlQgbDEsIGwyOworCisJbDIgPSBzdHJsZW4oczIpOworCWlmICghbDIpCisJCXJldHVybiAoY2hhciAqKSBzMTsKKworCWwxID0gc3RybGVuKHMxKTsKKworCXdoaWxlIChsMSA+PSBsMikKKwl7CisJCWwxLS07CisJCWlmICghbWVtY21wKHMxLHMyLGwyKSkKKwkJCXJldHVybiAoY2hhciAqKSBzMTsKKwkJczErKzsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworLyoqCisgKiByc3RydG9rIC0gU3BsaXQgYSBzdHJpbmcgaW50byB0b2tlbnMKKyAqIEBzOiBUaGUgc3RyaW5nIHRvIGJlIHNlYXJjaGVkCisgKiBAY3Q6IFRoZSBjaGFyYWN0ZXJzIHRvIHNlYXJjaCBmb3IKKyAqICogV0FSTklORzogc3RydG9rIGlzIGRlcHJlY2F0ZWQsIHVzZSBzdHJzZXAgaW5zdGVhZC4gSG93ZXZlciBzdHJzZXAgaXMgbm90IGNvbXBhdGlibGUgd2l0aCBvbGQgYXJjaGl0ZWN0dXJlLgorICovCitjaGFyICogX19yc3RydG9rOworY2hhciAqIHJzdHJ0b2soY2hhciAqIHMsY29uc3QgY2hhciAqIGN0KQoreworCWNoYXIgKnNiZWdpbiwgKnNlbmQ7CisKKwlzYmVnaW4gID0gcyA/IHMgOiBfX3JzdHJ0b2s7CisJaWYgKCFzYmVnaW4pCisJeworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlzYmVnaW4gKz0gc3Ryc3BuKHNiZWdpbixjdCk7CisJaWYgKCpzYmVnaW4gPT0gJ1wwJykKKwl7CisJCV9fcnN0cnRvayA9IE5VTEw7CisJCXJldHVybiggTlVMTCApOworCX0KKworCXNlbmQgPSBzdHJwYnJrKCBzYmVnaW4sIGN0KTsKKwlpZiAoc2VuZCAmJiAqc2VuZCAhPSAnXDAnKQorCQkqc2VuZCsrID0gJ1wwJzsKKworCV9fcnN0cnRvayA9IHNlbmQ7CisKKwlyZXR1cm4gKHNiZWdpbik7Cit9CisKKy8qKgorICogZGVsaW1pdGNudCAtIHJldHVybiB0aGUgY291bnQgb2YgYSBnaXZlbiBkZWxpbWl0ZXIgaW4gYSBnaXZlbiBzdHJpbmcuCisgKiBAczogVGhlIHN0cmluZyB0byBiZSBzZWFyY2hlZC4KKyAqIEBjdDogVGhlIGRlbGltaXRlciB0byBzZWFyY2ggZm9yLgorICogTm90aWNlIDogV2Ugc3VwcG9zZSB0aGUgZGVsaW1pdGVyIGlzIGEgc2luZ2xlLWNoYXIgc3RyaW5nKGZvciBleGFtcGxlIDogIjsiKS4KKyAqLworSU5UIGRlbGltaXRjbnQoY2hhciAqIHMsY29uc3QgY2hhciAqIGN0KQoreworCUlOVCBjb3VudCA9IDA7CisJLyogcG9pbnQgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbGluZSAqLworCWNvbnN0IGNoYXIgKnRva2VuID0gczsKKworCWZvciAoIDs7ICkKKwl7CisJCXRva2VuID0gc3RycGJyayh0b2tlbiwgY3QpOyAvKiBzZWFyY2ggZm9yIGRlbGltaXRlcnMgKi8KKworICAgICAgICBpZiAoIHRva2VuID09IE5VTEwgKQorCQl7CisJCQkvKiBhZHZhbmNlZCB0byB0aGUgdGVybWluYXRpbmcgbnVsbCBjaGFyYWN0ZXIgKi8KKwkJCWJyZWFrOworCQl9CisJCS8qIHNraXAgdGhlIGRlbGltaXRlciAqLworCSAgICArK3Rva2VuOworCisJCS8qCisJCSAqIFByaW50IHRoZSBmb3VuZCB0ZXh0OiB1c2UgbGVuIHdpdGggJS4qcyB0byBzcGVjaWZ5IGZpZWxkIHdpZHRoLgorCQkgKi8KKworCQkvKiBhY2N1bXVsYXRlIGRlbGltaXRlciBjb3VudCAqLworCSAgICArK2NvdW50OworCX0KKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qCisgICogY29udmVydHMgdGhlIEludGVybmV0IGhvc3QgYWRkcmVzcyBmcm9tIHRoZSBzdGFuZGFyZCBudW1iZXJzLWFuZC1kb3RzIG5vdGF0aW9uCisgICogaW50byBiaW5hcnkgZGF0YS4KKyAgKiByZXR1cm5zIG5vbnplcm8gaWYgdGhlIGFkZHJlc3MgaXMgdmFsaWQsIHplcm8gaWYgbm90LgorICAqLworaW50IHJ0aW5ldF9hdG9uKGNvbnN0IGNoYXIgKmNwLCB1bnNpZ25lZCBpbnQgKmFkZHIpCit7CisJdW5zaWduZWQgaW50IAl2YWw7CisJaW50ICAgICAgICAgCWJhc2UsIG47CisJY2hhciAgICAgICAgCWM7CisJdW5zaWduZWQgaW50ICAgIHBhcnRzWzRdOworCXVuc2lnbmVkIGludCAgICAqcHAgPSBwYXJ0czsKKworCWZvciAoOzspCisgICAgeworICAgICAgICAgLyoKKyAgICAgICAgICAqIENvbGxlY3QgbnVtYmVyIHVwIHRvIGBgLicnLgorICAgICAgICAgICogVmFsdWVzIGFyZSBzcGVjaWZpZWQgYXMgZm9yIEM6CisgICAgICAgICAgKgkweD1oZXgsIDA9b2N0YWwsIG90aGVyPWRlY2ltYWwuCisgICAgICAgICAgKi8KKyAgICAgICAgIHZhbCA9IDA7CisgICAgICAgICBiYXNlID0gMTA7CisgICAgICAgICBpZiAoKmNwID09ICcwJykKKyAgICAgICAgIHsKKyAgICAgICAgICAgICBpZiAoKisrY3AgPT0gJ3gnIHx8ICpjcCA9PSAnWCcpCisgICAgICAgICAgICAgICAgIGJhc2UgPSAxNiwgY3ArKzsKKyAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgIGJhc2UgPSA4OworICAgICAgICAgfQorICAgICAgICAgd2hpbGUgKChjID0gKmNwKSAhPSAnXDAnKQorICAgICAgICAgeworICAgICAgICAgICAgIGlmIChpc2RpZ2l0KCh1bnNpZ25lZCBjaGFyKSBjKSkKKyAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgIHZhbCA9ICh2YWwgKiBiYXNlKSArIChjIC0gJzAnKTsKKyAgICAgICAgICAgICAgICAgY3ArKzsKKyAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgfQorICAgICAgICAgICAgIGlmIChiYXNlID09IDE2ICYmIGlzeGRpZ2l0KCh1bnNpZ25lZCBjaGFyKSBjKSkKKyAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgIHZhbCA9ICh2YWwgPDwgNCkgKworICAgICAgICAgICAgICAgICAgICAgKGMgKyAxMCAtIChpc2xvd2VyKCh1bnNpZ25lZCBjaGFyKSBjKSA/ICdhJyA6ICdBJykpOworICAgICAgICAgICAgICAgICBjcCsrOworICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICB9CisgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICB9CisgICAgICAgICBpZiAoKmNwID09ICcuJykKKyAgICAgICAgIHsKKyAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAqIEludGVybmV0IGZvcm1hdDogYS5iLmMuZCBhLmIuYyAgICh3aXRoIGMgdHJlYXRlZCBhcyAxNi1iaXRzKQorICAgICAgICAgICAgICAqIGEuYiAgICAgKHdpdGggYiB0cmVhdGVkIGFzIDI0IGJpdHMpCisgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgaWYgKHBwID49IHBhcnRzICsgMyB8fCB2YWwgPiAweGZmKQorICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAqcHArKyA9IHZhbCwgY3ArKzsKKyAgICAgICAgIH0KKyAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICBicmVhazsKKyAgICAgfQorCisgICAgIC8qCisgICAgICAqIENoZWNrIGZvciB0cmFpbGluZyBqdW5rLgorICAgICAgKi8KKyAgICAgd2hpbGUgKCpjcCkKKyAgICAgICAgIGlmICghaXNzcGFjZSgodW5zaWduZWQgY2hhcikgKmNwKyspKQorICAgICAgICAgICAgIHJldHVybiAwOworCisgICAgIC8qCisgICAgICAqIENvbmNvY3QgdGhlIGFkZHJlc3MgYWNjb3JkaW5nIHRvIHRoZSBudW1iZXIgb2YgcGFydHMgc3BlY2lmaWVkLgorICAgICAgKi8KKyAgICAgbiA9IHBwIC0gcGFydHMgKyAxOworICAgICBzd2l0Y2ggKG4pCisgICAgIHsKKworICAgICAgICAgY2FzZSAxOiAgICAgICAgIC8qIGEgLS0gMzIgYml0cyAqLworICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICBjYXNlIDI6ICAgICAgICAgLyogYS5iIC0tIDguMjQgYml0cyAqLworICAgICAgICAgICAgIGlmICh2YWwgPiAweGZmZmZmZikKKyAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgdmFsIHw9IHBhcnRzWzBdIDw8IDI0OworICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICBjYXNlIDM6ICAgICAgICAgLyogYS5iLmMgLS0gOC44LjE2IGJpdHMgKi8KKyAgICAgICAgICAgICBpZiAodmFsID4gMHhmZmZmKQorICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICB2YWwgfD0gKHBhcnRzWzBdIDw8IDI0KSB8IChwYXJ0c1sxXSA8PCAxNik7CisgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgIGNhc2UgNDogICAgICAgICAvKiBhLmIuYy5kIC0tIDguOC44LjggYml0cyAqLworICAgICAgICAgICAgIGlmICh2YWwgPiAweGZmKQorICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICB2YWwgfD0gKHBhcnRzWzBdIDw8IDI0KSB8IChwYXJ0c1sxXSA8PCAxNikgfCAocGFydHNbMl0gPDwgOCk7CisgICAgICAgICAgICAgYnJlYWs7CisgICAgIH0KKworICAgICAqYWRkciA9IGh0b25sKHZhbCk7CisgICAgIHJldHVybiAxOworCit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICBSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgICAgICBGaW5kIGtleSBzZWN0aW9uIGZvciBHZXQga2V5IHBhcmFtZXRlci4KKworICAgIEFyZ3VtZW50czoKKyAgICAgICAgYnVmZmVyICAgICAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byBzdGFydCBmaW5kIHRoZSBrZXkgc2VjdGlvbgorICAgICAgICBzZWN0aW9uICAgICAgICAgICAgICAgICAgICAgdGhlIGtleSBvZiB0aGUgc2VjaW9uIHRvIGJlIGZpbmQKKworICAgIFJldHVybiBWYWx1ZToKKyAgICAgICAgTlVMTCAgICAgICAgICAgICAgICAgICAgICAgIEZhaWwKKyAgICAgICAgT3RoZXJzICAgICAgICAgICAgICAgICAgICAgIFN1Y2Nlc3MKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitQVUNIQVIgIFJUTVBGaW5kU2VjdGlvbigKKyAgICBJTiAgUENIQVIgICBidWZmZXIpCit7CisgICAgQ0hBUiB0ZW1wX2J1ZlszMl07CisgICAgUFVDSEFSICBwdHI7CisKKyAgICBzdHJjcHkodGVtcF9idWYsICJEZWZhdWx0Iik7CisKKyAgICBpZigocHRyID0gcnRzdHJzdHIoYnVmZmVyLCB0ZW1wX2J1ZikpICE9IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gKHB0citzdHJsZW4oIlxuIikpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIFJvdXRpbmUgRGVzY3JpcHRpb246CisgICAgICAgIEdldCBrZXkgcGFyYW1ldGVyLgorCisgICAgQXJndW1lbnRzOgorICAgICAgICBrZXkgICAgICAgICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byBrZXkgc3RyaW5nCisgICAgICAgIGRlc3QgICAgICAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIGRlc3RpbmF0aW9uCisgICAgICAgIGRlc3RzaXplICAgICAgICAgICAgICAgICAgICBUaGUgZGF0YXNpemUgb2YgdGhlIGRlc3RpbmF0aW9uCisgICAgICAgIGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gc3RhcnQgZmluZCB0aGUga2V5CisKKyAgICBSZXR1cm4gVmFsdWU6CisgICAgICAgIFRSVUUgICAgICAgICAgICAgICAgICAgICAgICBTdWNjZXNzCisgICAgICAgIEZBTFNFICAgICAgICAgICAgICAgICAgICAgICBGYWlsCisKKyAgICBOb3RlOgorICAgICAgICBUaGlzIHJvdXRpbmUgZ2V0IHRoZSB2YWx1ZSB3aXRoIHRoZSBtYXRjaGVkIGtleSAoY2FzZSBjYXNlLXNlbnNpdGl2ZSkKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQgUlRNUEdldEtleVBhcmFtZXRlcigKKyAgICBJTiAgUENIQVIgICBrZXksCisgICAgT1VUIFBDSEFSICAgZGVzdCwKKyAgICBJTiAgSU5UICAgICBkZXN0c2l6ZSwKKyAgICBJTiAgUENIQVIgICBidWZmZXIpCit7CisgICAgVUNIQVIgKnRlbXBfYnVmMSA9IE5VTEw7CisgICAgVUNIQVIgKnRlbXBfYnVmMiA9IE5VTEw7CisgICAgQ0hBUiAqc3RhcnRfcHRyOworICAgIENIQVIgKmVuZF9wdHI7CisgICAgQ0hBUiAqcHRyOworICAgIENIQVIgKm9mZnNldCA9IDA7CisgICAgSU5UICBsZW47CisKKwkvL3RlbXBfYnVmMSA9IGttYWxsb2MoTUFYX1BBUkFNX0JVRkZFUl9TSVpFLCBNRU1fQUxMT0NfRkxBRyk7CisJb3NfYWxsb2NfbWVtKE5VTEwsICZ0ZW1wX2J1ZjEsIE1BWF9QQVJBTV9CVUZGRVJfU0laRSk7CisKKwlpZih0ZW1wX2J1ZjEgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIChGQUxTRSk7CisKKwkvL3RlbXBfYnVmMiA9IGttYWxsb2MoTUFYX1BBUkFNX0JVRkZFUl9TSVpFLCBNRU1fQUxMT0NfRkxBRyk7CisJb3NfYWxsb2NfbWVtKE5VTEwsICZ0ZW1wX2J1ZjIsIE1BWF9QQVJBTV9CVUZGRVJfU0laRSk7CisJaWYodGVtcF9idWYyID09IE5VTEwpCisJeworCQlvc19mcmVlX21lbShOVUxMLCB0ZW1wX2J1ZjEpOworICAgICAgICByZXR1cm4gKEZBTFNFKTsKKwl9CisKKyAgICAvL2ZpbmQgc2VjdGlvbgorICAgIGlmKChvZmZzZXQgPSBSVE1QRmluZFNlY3Rpb24oYnVmZmVyKSkgPT0gTlVMTCkKKyAgICB7CisgICAgCW9zX2ZyZWVfbWVtKE5VTEwsIHRlbXBfYnVmMSk7CisgICAgCW9zX2ZyZWVfbWVtKE5VTEwsIHRlbXBfYnVmMik7CisgICAgICAgIHJldHVybiAoRkFMU0UpOworICAgIH0KKworICAgIHN0cmNweSh0ZW1wX2J1ZjEsICJcbiIpOworICAgIHN0cmNhdCh0ZW1wX2J1ZjEsIGtleSk7CisgICAgc3RyY2F0KHRlbXBfYnVmMSwgIj0iKTsKKworICAgIC8vc2VhcmNoIGtleQorICAgIGlmKChzdGFydF9wdHI9cnRzdHJzdHIob2Zmc2V0LCB0ZW1wX2J1ZjEpKT09TlVMTCkKKyAgICB7CisJCW9zX2ZyZWVfbWVtKE5VTEwsIHRlbXBfYnVmMSk7CisgICAgCW9zX2ZyZWVfbWVtKE5VTEwsIHRlbXBfYnVmMik7CisgICAgICAgIHJldHVybiAoRkFMU0UpOworICAgIH0KKworICAgIHN0YXJ0X3B0cis9c3RybGVuKCJcbiIpOworICAgIGlmKChlbmRfcHRyPXJ0c3Ryc3RyKHN0YXJ0X3B0ciwgIlxuIikpPT1OVUxMKQorICAgICAgIGVuZF9wdHI9c3RhcnRfcHRyK3N0cmxlbihzdGFydF9wdHIpOworCisgICAgaWYgKGVuZF9wdHI8c3RhcnRfcHRyKQorICAgIHsKKwkJb3NfZnJlZV9tZW0oTlVMTCwgdGVtcF9idWYxKTsKKyAgICAJb3NfZnJlZV9tZW0oTlVMTCwgdGVtcF9idWYyKTsKKyAgICAgICAgcmV0dXJuIChGQUxTRSk7CisgICAgfQorCisgICAgTmRpc01vdmVNZW1vcnkodGVtcF9idWYyLCBzdGFydF9wdHIsIGVuZF9wdHItc3RhcnRfcHRyKTsKKyAgICB0ZW1wX2J1ZjJbZW5kX3B0ci1zdGFydF9wdHJdPSdcMCc7CisgICAgbGVuID0gc3RybGVuKHRlbXBfYnVmMik7CisgICAgc3RyY3B5KHRlbXBfYnVmMSwgdGVtcF9idWYyKTsKKyAgICBpZigoc3RhcnRfcHRyPXJ0c3Ryc3RyKHRlbXBfYnVmMSwgIj0iKSkgPT0gTlVMTCkKKyAgICB7CisJCW9zX2ZyZWVfbWVtKE5VTEwsIHRlbXBfYnVmMSk7CisgICAgCW9zX2ZyZWVfbWVtKE5VTEwsIHRlbXBfYnVmMik7CisgICAgICAgIHJldHVybiAoRkFMU0UpOworICAgIH0KKworICAgIHN0cmNweSh0ZW1wX2J1ZjIsIHN0YXJ0X3B0cisxKTsKKyAgICBwdHIgPSB0ZW1wX2J1ZjI7CisgICAgLy90cmltIHNwYWNlIG9yIHRhYgorICAgIHdoaWxlKCpwdHIgIT0gMHgwMCkKKyAgICB7CisgICAgICAgIGlmKCAoKnB0ciA9PSAnICcpIHx8ICgqcHRyID09ICdcdCcpICkKKyAgICAgICAgICAgIHB0cisrOworICAgICAgICBlbHNlCisgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGxlbiA9IHN0cmxlbihwdHIpOworICAgIG1lbXNldChkZXN0LCAweDAwLCBkZXN0c2l6ZSk7CisgICAgc3RybmNweShkZXN0LCBwdHIsIGxlbiA+PSBkZXN0c2l6ZSA/ICBkZXN0c2l6ZTogbGVuKTsKKworCW9zX2ZyZWVfbWVtKE5VTEwsIHRlbXBfYnVmMSk7CisgICAgb3NfZnJlZV9tZW0oTlVMTCwgdGVtcF9idWYyKTsKKyAgICByZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIFJvdXRpbmUgRGVzY3JpcHRpb246CisgICAgICAgIEdldCBrZXkgcGFyYW1ldGVyLgorCisgICAgQXJndW1lbnRzOgorICAgICAgICBrZXkgICAgICAgICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byBrZXkgc3RyaW5nCisgICAgICAgIGRlc3QgICAgICAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIGRlc3RpbmF0aW9uCisgICAgICAgIGRlc3RzaXplICAgICAgICAgICAgICAgICAgICBUaGUgZGF0YXNpemUgb2YgdGhlIGRlc3RpbmF0aW9uCisgICAgICAgIGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gc3RhcnQgZmluZCB0aGUga2V5CisKKyAgICBSZXR1cm4gVmFsdWU6CisgICAgICAgIFRSVUUgICAgICAgICAgICAgICAgICAgICAgICBTdWNjZXNzCisgICAgICAgIEZBTFNFICAgICAgICAgICAgICAgICAgICAgICBGYWlsCisKKyAgICBOb3RlOgorICAgICAgICBUaGlzIHJvdXRpbmUgZ2V0IHRoZSB2YWx1ZSB3aXRoIHRoZSBtYXRjaGVkIGtleSAoY2FzZSBjYXNlLXNlbnNpdGl2ZSkuCisgICAgICAgIEl0IGlzIGNhbGxlZCBmb3IgcGFyc2luZyBTU0lEIGFuZCBhbnkga2V5IHN0cmluZy4KKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQgUlRNUEdldENyaXRpY2FsUGFyYW1ldGVyKAorICAgIElOICBQQ0hBUiAgIGtleSwKKyAgICBPVVQgUENIQVIgICBkZXN0LAorICAgIElOICBJTlQgICAgIGRlc3RzaXplLAorICAgIElOICBQQ0hBUiAgIGJ1ZmZlcikKK3sKKyAgICBVQ0hBUiAqdGVtcF9idWYxID0gTlVMTDsKKyAgICBVQ0hBUiAqdGVtcF9idWYyID0gTlVMTDsKKyAgICBDSEFSICpzdGFydF9wdHI7CisgICAgQ0hBUiAqZW5kX3B0cjsKKyAgICBDSEFSICpwdHI7CisgICAgQ0hBUiAqb2Zmc2V0ID0gMDsKKyAgICBJTlQgIGxlbjsKKworCS8vdGVtcF9idWYxID0ga21hbGxvYyhNQVhfUEFSQU1fQlVGRkVSX1NJWkUsIE1FTV9BTExPQ19GTEFHKTsKKwlvc19hbGxvY19tZW0oTlVMTCwgJnRlbXBfYnVmMSwgTUFYX1BBUkFNX0JVRkZFUl9TSVpFKTsKKworCWlmKHRlbXBfYnVmMSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gKEZBTFNFKTsKKworCS8vdGVtcF9idWYyID0ga21hbGxvYyhNQVhfUEFSQU1fQlVGRkVSX1NJWkUsIE1FTV9BTExPQ19GTEFHKTsKKwlvc19hbGxvY19tZW0oTlVMTCwgJnRlbXBfYnVmMiwgTUFYX1BBUkFNX0JVRkZFUl9TSVpFKTsKKwlpZih0ZW1wX2J1ZjIgPT0gTlVMTCkKKwl7CisJCW9zX2ZyZWVfbWVtKE5VTEwsIHRlbXBfYnVmMSk7CisgICAgICAgIHJldHVybiAoRkFMU0UpOworCX0KKworICAgIC8vZmluZCBzZWN0aW9uCisgICAgaWYoKG9mZnNldCA9IFJUTVBGaW5kU2VjdGlvbihidWZmZXIpKSA9PSBOVUxMKQorICAgIHsKKyAgICAJb3NfZnJlZV9tZW0oTlVMTCwgdGVtcF9idWYxKTsKKyAgICAJb3NfZnJlZV9tZW0oTlVMTCwgdGVtcF9idWYyKTsKKyAgICAgICAgcmV0dXJuIChGQUxTRSk7CisgICAgfQorCisgICAgc3RyY3B5KHRlbXBfYnVmMSwgIlxuIik7CisgICAgc3RyY2F0KHRlbXBfYnVmMSwga2V5KTsKKyAgICBzdHJjYXQodGVtcF9idWYxLCAiPSIpOworCisgICAgLy9zZWFyY2gga2V5CisgICAgaWYoKHN0YXJ0X3B0cj1ydHN0cnN0cihvZmZzZXQsIHRlbXBfYnVmMSkpPT1OVUxMKQorICAgIHsKKwkJb3NfZnJlZV9tZW0oTlVMTCwgdGVtcF9idWYxKTsKKyAgICAJb3NfZnJlZV9tZW0oTlVMTCwgdGVtcF9idWYyKTsKKyAgICAgICAgcmV0dXJuIChGQUxTRSk7CisgICAgfQorCisgICAgc3RhcnRfcHRyKz1zdHJsZW4oIlxuIik7CisgICAgaWYoKGVuZF9wdHI9cnRzdHJzdHIoc3RhcnRfcHRyLCAiXG4iKSk9PU5VTEwpCisgICAgICAgZW5kX3B0cj1zdGFydF9wdHIrc3RybGVuKHN0YXJ0X3B0cik7CisKKyAgICBpZiAoZW5kX3B0cjxzdGFydF9wdHIpCisgICAgeworCQlvc19mcmVlX21lbShOVUxMLCB0ZW1wX2J1ZjEpOworICAgIAlvc19mcmVlX21lbShOVUxMLCB0ZW1wX2J1ZjIpOworICAgICAgICByZXR1cm4gKEZBTFNFKTsKKyAgICB9CisKKyAgICBOZGlzTW92ZU1lbW9yeSh0ZW1wX2J1ZjIsIHN0YXJ0X3B0ciwgZW5kX3B0ci1zdGFydF9wdHIpOworICAgIHRlbXBfYnVmMltlbmRfcHRyLXN0YXJ0X3B0cl09J1wwJzsKKyAgICBsZW4gPSBzdHJsZW4odGVtcF9idWYyKTsKKyAgICBzdHJjcHkodGVtcF9idWYxLCB0ZW1wX2J1ZjIpOworICAgIGlmKChzdGFydF9wdHI9cnRzdHJzdHIodGVtcF9idWYxLCAiPSIpKSA9PSBOVUxMKQorICAgIHsKKwkJb3NfZnJlZV9tZW0oTlVMTCwgdGVtcF9idWYxKTsKKyAgICAJb3NfZnJlZV9tZW0oTlVMTCwgdGVtcF9idWYyKTsKKyAgICAgICAgcmV0dXJuIChGQUxTRSk7CisgICAgfQorCisgICAgc3RyY3B5KHRlbXBfYnVmMiwgc3RhcnRfcHRyKzEpOworICAgIHB0ciA9IHRlbXBfYnVmMjsKKworICAgIC8vdHJpbSB0YWIKKyAgICAvKiBXZSBjYW5ub3QgdHJpbSBzcGFjZSgnICcpIGZvciBTU0lEIGFuZCBrZXkgc3RyaW5nLiAqLworICAgIHdoaWxlKCpwdHIgIT0gMHgwMCkKKyAgICB7CisgICAgICAgIC8vaWYoICgqcHRyID09ICcgJykgfHwgKCpwdHIgPT0gJ1x0JykgKQorICAgICAgICBpZiggKCpwdHIgPT0gJ1x0JykgKQorICAgICAgICAgICAgcHRyKys7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgbGVuID0gc3RybGVuKHB0cik7CisgICAgbWVtc2V0KGRlc3QsIDB4MDAsIGRlc3RzaXplKTsKKyAgICBzdHJuY3B5KGRlc3QsIHB0ciwgbGVuID49IGRlc3RzaXplID8gIGRlc3RzaXplOiBsZW4pOworCisJb3NfZnJlZV9tZW0oTlVMTCwgdGVtcF9idWYxKTsKKyAgICBvc19mcmVlX21lbShOVUxMLCB0ZW1wX2J1ZjIpOworICAgIHJldHVybiBUUlVFOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICAgICAgR2V0IG11bHRpcGxlIGtleSBwYXJhbWV0ZXIuCisKKyAgICBBcmd1bWVudHM6CisgICAgICAgIGtleSAgICAgICAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIGtleSBzdHJpbmcKKyAgICAgICAgZGVzdCAgICAgICAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gZGVzdGluYXRpb24KKyAgICAgICAgZGVzdHNpemUgICAgICAgICAgICAgICAgICAgIFRoZSBkYXRhc2l6ZSBvZiB0aGUgZGVzdGluYXRpb24KKyAgICAgICAgYnVmZmVyICAgICAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byBzdGFydCBmaW5kIHRoZSBrZXkKKworICAgIFJldHVybiBWYWx1ZToKKyAgICAgICAgVFJVRSAgICAgICAgICAgICAgICAgICAgICAgIFN1Y2Nlc3MKKyAgICAgICAgRkFMU0UgICAgICAgICAgICAgICAgICAgICAgIEZhaWwKKworICAgIE5vdGU6CisgICAgICAgIFRoaXMgcm91dGluZSBnZXQgdGhlIHZhbHVlIHdpdGggdGhlIG1hdGNoZWQga2V5IChjYXNlIGNhc2Utc2Vuc2l0aXZlKQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVCBSVE1QR2V0S2V5UGFyYW1ldGVyV2l0aE9mZnNldCgKKyAgICBJTiAgUENIQVIgICBrZXksCisgICAgT1VUIFBDSEFSICAgZGVzdCwKKyAgICBPVVQJVVNIT1JUCSplbmRfb2Zmc2V0LAorICAgIElOICBJTlQgICAgIGRlc3RzaXplLAorICAgIElOICBQQ0hBUiAgIGJ1ZmZlciwKKyAgICBJTglCT09MRUFOCWJUcmltU3BhY2UpCit7CisgICAgVUNIQVIgKnRlbXBfYnVmMSA9IE5VTEw7CisgICAgVUNIQVIgKnRlbXBfYnVmMiA9IE5VTEw7CisgICAgQ0hBUiAqc3RhcnRfcHRyOworICAgIENIQVIgKmVuZF9wdHI7CisgICAgQ0hBUiAqcHRyOworICAgIENIQVIgKm9mZnNldCA9IDA7CisgICAgSU5UICBsZW47CisKKwlpZiAoKmVuZF9vZmZzZXQgPj0gTUFYX0lOSV9CVUZGRVJfU0laRSkKKwkJcmV0dXJuIChGQUxTRSk7CisKKwlvc19hbGxvY19tZW0oTlVMTCwgJnRlbXBfYnVmMSwgTUFYX1BBUkFNX0JVRkZFUl9TSVpFKTsKKworCWlmKHRlbXBfYnVmMSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gKEZBTFNFKTsKKworCW9zX2FsbG9jX21lbShOVUxMLCAmdGVtcF9idWYyLCBNQVhfUEFSQU1fQlVGRkVSX1NJWkUpOworCWlmKHRlbXBfYnVmMiA9PSBOVUxMKQorCXsKKwkJb3NfZnJlZV9tZW0oTlVMTCwgdGVtcF9idWYxKTsKKyAgICAgICAgcmV0dXJuIChGQUxTRSk7CisJfQorCisgICAgLy9maW5kIHNlY3Rpb24KKwlpZigqZW5kX29mZnNldCA9PSAwKQorICAgIHsKKwkJaWYgKChvZmZzZXQgPSBSVE1QRmluZFNlY3Rpb24oYnVmZmVyKSkgPT0gTlVMTCkKKwkJeworCQkJb3NfZnJlZV9tZW0oTlVMTCwgdGVtcF9idWYxKTsKKwkgICAgCW9zX2ZyZWVfbWVtKE5VTEwsIHRlbXBfYnVmMik7CisgICAgCSAgICByZXR1cm4gKEZBTFNFKTsKKwkJfQorICAgIH0KKwllbHNlCisJCW9mZnNldCA9IGJ1ZmZlciArICgqZW5kX29mZnNldCk7CisKKyAgICBzdHJjcHkodGVtcF9idWYxLCAiXG4iKTsKKyAgICBzdHJjYXQodGVtcF9idWYxLCBrZXkpOworICAgIHN0cmNhdCh0ZW1wX2J1ZjEsICI9Iik7CisKKyAgICAvL3NlYXJjaCBrZXkKKyAgICBpZigoc3RhcnRfcHRyPXJ0c3Ryc3RyKG9mZnNldCwgdGVtcF9idWYxKSk9PU5VTEwpCisgICAgeworCQlvc19mcmVlX21lbShOVUxMLCB0ZW1wX2J1ZjEpOworICAgIAlvc19mcmVlX21lbShOVUxMLCB0ZW1wX2J1ZjIpOworICAgICAgICByZXR1cm4gKEZBTFNFKTsKKyAgICB9CisKKyAgICBzdGFydF9wdHIrPXN0cmxlbigiXG4iKTsKKyAgICBpZigoZW5kX3B0cj1ydHN0cnN0cihzdGFydF9wdHIsICJcbiIpKT09TlVMTCkKKyAgICAgICBlbmRfcHRyPXN0YXJ0X3B0citzdHJsZW4oc3RhcnRfcHRyKTsKKworICAgIGlmIChlbmRfcHRyPHN0YXJ0X3B0cikKKyAgICB7CisJCW9zX2ZyZWVfbWVtKE5VTEwsIHRlbXBfYnVmMSk7CisgICAgCW9zX2ZyZWVfbWVtKE5VTEwsIHRlbXBfYnVmMik7CisgICAgICAgIHJldHVybiAoRkFMU0UpOworICAgIH0KKworCSplbmRfb2Zmc2V0ID0gZW5kX3B0ciAtIGJ1ZmZlcjsKKworICAgIE5kaXNNb3ZlTWVtb3J5KHRlbXBfYnVmMiwgc3RhcnRfcHRyLCBlbmRfcHRyLXN0YXJ0X3B0cik7CisgICAgdGVtcF9idWYyW2VuZF9wdHItc3RhcnRfcHRyXT0nXDAnOworICAgIGxlbiA9IHN0cmxlbih0ZW1wX2J1ZjIpOworICAgIHN0cmNweSh0ZW1wX2J1ZjEsIHRlbXBfYnVmMik7CisgICAgaWYoKHN0YXJ0X3B0cj1ydHN0cnN0cih0ZW1wX2J1ZjEsICI9IikpID09IE5VTEwpCisgICAgeworCQlvc19mcmVlX21lbShOVUxMLCB0ZW1wX2J1ZjEpOworICAgIAlvc19mcmVlX21lbShOVUxMLCB0ZW1wX2J1ZjIpOworICAgICAgICByZXR1cm4gKEZBTFNFKTsKKyAgICB9CisKKyAgICBzdHJjcHkodGVtcF9idWYyLCBzdGFydF9wdHIrMSk7CisgICAgcHRyID0gdGVtcF9idWYyOworICAgIC8vdHJpbSBzcGFjZSBvciB0YWIKKyAgICB3aGlsZSgqcHRyICE9IDB4MDApCisgICAgeworICAgICAgICBpZigoYlRyaW1TcGFjZSAmJiAoKnB0ciA9PSAnICcpKSB8fCAoKnB0ciA9PSAnXHQnKSApCisgICAgICAgICAgICBwdHIrKzsKKyAgICAgICAgZWxzZQorICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBsZW4gPSBzdHJsZW4ocHRyKTsKKyAgICBtZW1zZXQoZGVzdCwgMHgwMCwgZGVzdHNpemUpOworICAgIHN0cm5jcHkoZGVzdCwgcHRyLCBsZW4gPj0gZGVzdHNpemUgPyAgZGVzdHNpemU6IGxlbik7CisKKwlvc19mcmVlX21lbShOVUxMLCB0ZW1wX2J1ZjEpOworICAgIG9zX2ZyZWVfbWVtKE5VTEwsIHRlbXBfYnVmMik7CisgICAgcmV0dXJuIFRSVUU7Cit9CisKKworc3RhdGljIGludCBydG1wX3BhcnNlX2tleV9idWZmZXJfZnJvbV9maWxlKElOICBQUlRNUF9BREFQVEVSIHBBZCxJTiAgY2hhciAqYnVmZmVyLElOICBVTE9ORyBLZXlUeXBlLElOICBJTlQgQlNTSWR4LElOICBJTlQgS2V5SWR4KQoreworCVBVQ0hBUgkJa2V5YnVmZjsKKwlJTlQJCQlpID0gQlNTSWR4LCBpZHggPSBLZXlJZHg7CisJVUxPTkcJCUtleUxlbjsKKwlVQ0hBUgkJQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OworCisJa2V5YnVmZiA9IGJ1ZmZlcjsKKwlLZXlMZW4gPSBzdHJsZW4oa2V5YnVmZik7CisKKwlpZiAoS2V5VHlwZSA9PSAxKQorCXsvL0FzY2lpCisJCWlmKCAoS2V5TGVuID09IDUpIHx8IChLZXlMZW4gPT0gMTMpKQorCQl7CisJCQlwQWQtPlNoYXJlZEtleVtpXVtpZHhdLktleUxlbiA9IEtleUxlbjsKKwkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W2ldW2lkeF0uS2V5LCBrZXlidWZmLCBLZXlMZW4pOworCQkJaWYgKEtleUxlbiA9PSA1KQorCQkJCUNpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKKwkJCWVsc2UKKwkJCQlDaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OworCQkJcEFkLT5TaGFyZWRLZXlbaV1baWR4XS5DaXBoZXJBbGcgPSBDaXBoZXJBbGc7CisKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkkvRihyYSVkKSBLZXklZFN0cj0lcyBhbmQgdHlwZT0lc1xuIiwgaSwgaWR4KzEsIGtleWJ1ZmYsIChLZXlUeXBlID09IDApID8gIkhleCI6IkFzY2lpIikpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJZWxzZQorCQl7Ly9JbnZhbGlkIGtleSBsZW5ndGgKKwkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIktleSVkU3RyIGlzIEludmFsaWQga2V5IGxlbmd0aCEgS2V5TGVuID0gJWxkIVxuIiwgaWR4KzEsIEtleUxlbikpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJZWxzZQorCXsvL0hleCB0eXBlCisJCWlmKCAoS2V5TGVuID09IDEwKSB8fCAoS2V5TGVuID09IDI2KSkKKwkJeworCQkJcEFkLT5TaGFyZWRLZXlbaV1baWR4XS5LZXlMZW4gPSBLZXlMZW4gLyAyOworCQkJQXRvSChrZXlidWZmLCBwQWQtPlNoYXJlZEtleVtpXVtpZHhdLktleSwgS2V5TGVuIC8gMik7CisJCQlpZiAoS2V5TGVuID09IDEwKQorCQkJCUNpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKKwkJCWVsc2UKKwkJCQlDaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OworCQkJcEFkLT5TaGFyZWRLZXlbaV1baWR4XS5DaXBoZXJBbGcgPSBDaXBoZXJBbGc7CisKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkkvRihyYSVkKSBLZXklZFN0cj0lcyBhbmQgdHlwZT0lc1xuIiwgaSwgaWR4KzEsIGtleWJ1ZmYsIChLZXlUeXBlID09IDApID8gIkhleCI6IkFzY2lpIikpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJZWxzZQorCQl7Ly9JbnZhbGlkIGtleSBsZW5ndGgKKwkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkkvRihyYSVkKSBLZXklZFN0ciBpcyBJbnZhbGlkIGtleSBsZW5ndGghIEtleUxlbiA9ICVsZCFcbiIsIGksIGlkeCsxLCBLZXlMZW4pKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorfQorc3RhdGljIHZvaWQgcnRtcF9yZWFkX2tleV9wYXJtc19mcm9tX2ZpbGUoSU4gIFBSVE1QX0FEQVBURVIgcEFkLCBjaGFyICp0bXBidWYsIGNoYXIgKmJ1ZmZlcikKK3sKKwljaGFyCQl0b2tfc3RyWzE2XTsKKwlQVUNIQVIJCW1hY3B0cjsKKwlJTlQJCQlpID0gMCwgaWR4OworCVVMT05HCQlLZXlUeXBlW01BWF9NQlNTSURfTlVNXTsKKwlVTE9ORwkJS2V5SWR4OworCisJTmRpc1plcm9NZW1vcnkoS2V5VHlwZSwgTUFYX01CU1NJRF9OVU0pOworCisJLy9EZWZhdWx0S2V5SUQKKwlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJEZWZhdWx0S2V5SUQiLCB0bXBidWYsIDI1LCBidWZmZXIpKQorCXsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQl7CisJCQlLZXlJZHggPSBzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApOworCQkJaWYoKEtleUlkeCA+PSAxICkgJiYgKEtleUlkeCA8PSA0KSkKKwkJCQlwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQgPSAoVUNIQVIpIChLZXlJZHggLSAxKTsKKwkJCWVsc2UKKwkJCQlwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQgPSAwOworCisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJEZWZhdWx0S2V5SUQoMH4zKT0lZFxuIiwgcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkKSk7CisJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwl9CisKKworCWZvciAoaWR4ID0gMDsgaWR4IDwgNDsgaWR4KyspCisJeworCQlzcHJpbnRmKHRva19zdHIsICJLZXklZFR5cGUiLCBpZHggKyAxKTsKKwkJLy9LZXkxVHlwZQorCQlpZiAoUlRNUEdldEtleVBhcmFtZXRlcih0b2tfc3RyLCB0bXBidWYsIDEyOCwgYnVmZmVyKSkKKwkJeworCQkgICAgZm9yIChpID0gMCwgbWFjcHRyID0gcnN0cnRvayh0bXBidWYsIjsiKTsgbWFjcHRyOyBtYWNwdHIgPSByc3RydG9rKE5VTEwsIjsiKSwgaSsrKQorCQkgICAgeworCQkJICAgIEtleVR5cGVbaV0gPSBzaW1wbGVfc3RydG9sKG1hY3B0ciwgMCwgMTApOworCQkgICAgfQorCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQkJeworCQkJCXNwcmludGYodG9rX3N0ciwgIktleSVkU3RyIiwgaWR4ICsgMSk7CisJCQkJaWYgKFJUTVBHZXRDcml0aWNhbFBhcmFtZXRlcih0b2tfc3RyLCB0bXBidWYsIDEyOCwgYnVmZmVyKSkKKwkJCQl7CisJCQkJCXJ0bXBfcGFyc2Vfa2V5X2J1ZmZlcl9mcm9tX2ZpbGUocEFkLCB0bXBidWYsIEtleVR5cGVbQlNTMF0sIEJTUzAsIGlkeCk7CisJCQkJfQorCQkJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCQl9CisJfQorfQorCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKK3N0YXRpYyB2b2lkIHJ0bXBfcmVhZF9zdGFfd21tX3Bhcm1zX2Zyb21fZmlsZShJTiAgUFJUTVBfQURBUFRFUiBwQWQsIGNoYXIgKnRtcGJ1ZiwgY2hhciAqYnVmZmVyKQoreworCVBVQ0hBUgkJCQkJbWFjcHRyOworCUlOVAkJCQkJCWk9MDsKKwlCT09MRUFOCQkJCQliV21tRW5hYmxlID0gRkFMU0U7CisKKwkvL1dtbUNhcGFibGUKKwlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJXbW1DYXBhYmxlIiwgdG1wYnVmLCAzMiwgYnVmZmVyKSkKKwl7CisJCWlmKHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCkgIT0gMCkgLy9FbmFibGUKKwkJeworCQkJcEFkLT5Db21tb25DZmcuYldtbUNhcGFibGUgPSBUUlVFOworCQkJYldtbUVuYWJsZSA9IFRSVUU7CisJCX0KKwkJZWxzZSAvL0Rpc2FibGUKKwkJeworCQkJcEFkLT5Db21tb25DZmcuYldtbUNhcGFibGUgPSBGQUxTRTsKKwkJfQorCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIldtbUNhcGFibGU9JWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLmJXbW1DYXBhYmxlKSk7CisJfQorCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJLy9ETFNDYXBhYmxlCisJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiRExTQ2FwYWJsZSIsIHRtcGJ1ZiwgMzIsIGJ1ZmZlcikpCisJeworCQlpZihzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApICE9IDApICAvL0VuYWJsZQorCQl7CisJCQlwQWQtPkNvbW1vbkNmZy5iRExTQ2FwYWJsZSA9IFRSVUU7CisJCX0KKwkJZWxzZSAvL0Rpc2FibGUKKwkJeworCQkJcEFkLT5Db21tb25DZmcuYkRMU0NhcGFibGUgPSBGQUxTRTsKKwkJfQorCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoImJETFNDYXBhYmxlPSVkXG4iLCBwQWQtPkNvbW1vbkNmZy5iRExTQ2FwYWJsZSkpOworCX0KKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKworCS8vQWNrUG9saWN5IGZvciBBQ19CSywgQUNfQkUsIEFDX1ZJLCBBQ19WTworCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkFja1BvbGljeSIsIHRtcGJ1ZiwgMzIsIGJ1ZmZlcikpCisJeworCQlmb3IgKGkgPSAwLCBtYWNwdHIgPSByc3RydG9rKHRtcGJ1ZiwiOyIpOyBtYWNwdHI7IG1hY3B0ciA9IHJzdHJ0b2soTlVMTCwiOyIpLCBpKyspCisJCXsKKwkJCXBBZC0+Q29tbW9uQ2ZnLkFja1BvbGljeVtpXSA9IChVQ0hBUilzaW1wbGVfc3RydG9sKG1hY3B0ciwgMCwgMTApOworCisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBY2tQb2xpY3lbJWRdPSVkXG4iLCBpLCBwQWQtPkNvbW1vbkNmZy5BY2tQb2xpY3lbaV0pKTsKKwkJfQorCX0KKworCWlmIChiV21tRW5hYmxlKQorCXsKKwkJLy9BUFNEQ2FwYWJsZQorCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJBUFNEQ2FwYWJsZSIsIHRtcGJ1ZiwgMTAsIGJ1ZmZlcikpCisJCXsKKwkJCWlmKHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCkgIT0gMCkgIC8vRW5hYmxlCisJCQkJcEFkLT5Db21tb25DZmcuYkFQU0RDYXBhYmxlID0gVFJVRTsKKwkJCWVsc2UKKwkJCQlwQWQtPkNvbW1vbkNmZy5iQVBTRENhcGFibGUgPSBGQUxTRTsKKworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVBTRENhcGFibGU9JWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLmJBUFNEQ2FwYWJsZSkpOworCQl9CisKKwkJLy9BUFNEQUMgZm9yIEFDX0JFLCBBQ19CSywgQUNfVkksIEFDX1ZPCisJCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkFQU0RBQyIsIHRtcGJ1ZiwgMzIsIGJ1ZmZlcikpCisJCXsKKwkJCUJPT0xFQU4gYXBzZF9hY1s0XTsKKworCQkJZm9yIChpID0gMCwgbWFjcHRyID0gcnN0cnRvayh0bXBidWYsIjsiKTsgbWFjcHRyOyBtYWNwdHIgPSByc3RydG9rKE5VTEwsIjsiKSwgaSsrKQorCQkJeworCQkJCWFwc2RfYWNbaV0gPSAoQk9PTEVBTilzaW1wbGVfc3RydG9sKG1hY3B0ciwgMCwgMTApOworCisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVBTREFDJWQgICVkXG4iLCBpLCAgYXBzZF9hY1tpXSkpOworCQkJfQorCisJCQlwQWQtPkNvbW1vbkNmZy5iQVBTREFDX0JFID0gYXBzZF9hY1swXTsKKwkJCXBBZC0+Q29tbW9uQ2ZnLmJBUFNEQUNfQksgPSBhcHNkX2FjWzFdOworCQkJcEFkLT5Db21tb25DZmcuYkFQU0RBQ19WSSA9IGFwc2RfYWNbMl07CisJCQlwQWQtPkNvbW1vbkNmZy5iQVBTREFDX1ZPID0gYXBzZF9hY1szXTsKKwkJfQorCX0KKworfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisKK05ESVNfU1RBVFVTCVJUTVBSZWFkUGFyYW1ldGVyc0hvb2soCisJSU4JUFJUTVBfQURBUFRFUiBwQWQpCit7CisJUFVDSEFSCQkJCQlzcmMgPSBOVUxMOworCXN0cnVjdCBmaWxlCQkJCSpzcmNmOworCUlOVCAJCQkJCXJldHZhbCwgb3JnZnN1aWQsIG9yZ2ZzZ2lkOworICAgCW1tX3NlZ21lbnRfdAkJCW9yZ2ZzOworCUNIQVIJCQkJCSpidWZmZXI7CisJQ0hBUgkJCQkJKnRtcGJ1ZjsKKwlVTE9ORwkJCQkJUnRzVGhyZXNoOworCVVMT05HCQkJCQlGcmFnVGhyZXNoOworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCVVDSEFSCSAgICAgICAgICAgICAgICBrZXlNYXRlcmlhbFs0MF07CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKworCVBVQ0hBUgkJCQkJbWFjcHRyOworCUlOVAkJCQkJCWkgPSAwOworCisJYnVmZmVyID0ga21hbGxvYyhNQVhfSU5JX0JVRkZFUl9TSVpFLCBNRU1fQUxMT0NfRkxBRyk7CisJaWYoYnVmZmVyID09IE5VTEwpCisgICAgICAgIHJldHVybiBORElTX1NUQVRVU19GQUlMVVJFOworCisJdG1wYnVmID0ga21hbGxvYyhNQVhfUEFSQU1fQlVGRkVSX1NJWkUsIE1FTV9BTExPQ19GTEFHKTsKKwlpZih0bXBidWYgPT0gTlVMTCkKKwl7CisJCWtmcmVlKGJ1ZmZlcik7CisgICAgICAgIHJldHVybiBORElTX1NUQVRVU19GQUlMVVJFOworCX0KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCXNyYyA9IFNUQV9QUk9GSUxFX1BBVEg7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisjaWZkZWYgTVVMVElQTEVfQ0FSRF9TVVBQT1JUCisJc3JjID0gcEFkLT5NQ19GaWxlTmFtZTsKKyNlbmRpZiAvLyBNVUxUSVBMRV9DQVJEX1NVUFBPUlQgLy8KKworCS8vIFNhdmUgdWlkIGFuZCBnaWQgdXNlZCBmb3IgZmlsZXN5c3RlbSBhY2Nlc3MuCisJLy8gU2V0IHVzZXIgYW5kIGdyb3VwIHRvIDAgKHJvb3QpCisJb3JnZnN1aWQgPSBjdXJyZW50X2ZzdWlkKCk7CisJb3JnZnNnaWQgPSBjdXJyZW50X2ZzZ2lkKCk7CisJLyogSG0sIGNhbid0IHJlYWxseSBkbyB0aGlzIG5pY2VseSBhbnltb3JlLCBzbyByZWx5IG9uIHRoZXNlIGZpbGVzCisJICogYmVpbmcgc2V0IHRvIHRoZSBwcm9wZXIgcGVybWlzc2lvbiB0byByZWFkIHRoZW0uLi4gKi8KKwkvKiBjdXJyZW50LT5jcmVkLT5mc3VpZCA9IGN1cnJlbnQtPmNyZWQtPmZzZ2lkID0gMDsgKi8KKyAgICBvcmdmcyA9IGdldF9mcygpOworICAgIHNldF9mcyhLRVJORUxfRFMpOworCisJaWYgKHNyYyAmJiAqc3JjKQorCXsKKwkJc3JjZiA9IGZpbHBfb3BlbihzcmMsIE9fUkRPTkxZLCAwKTsKKwkJaWYgKElTX0VSUihzcmNmKSkKKwkJeworCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiLS0+IEVycm9yICVsZCBvcGVuaW5nICVzXG4iLCAtUFRSX0VSUihzcmNmKSxzcmMpKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCS8vIFRoZSBvYmplY3QgbXVzdCBoYXZlIGEgcmVhZCBtZXRob2QKKwkJCWlmIChzcmNmLT5mX29wICYmIHNyY2YtPmZfb3AtPnJlYWQpCisJCQl7CisJCQkJbWVtc2V0KGJ1ZmZlciwgMHgwMCwgTUFYX0lOSV9CVUZGRVJfU0laRSk7CisJCQkJcmV0dmFsPXNyY2YtPmZfb3AtPnJlYWQoc3JjZiwgYnVmZmVyLCBNQVhfSU5JX0JVRkZFUl9TSVpFLCAmc3JjZi0+Zl9wb3MpOworCQkJCWlmIChyZXR2YWwgPCAwKQorCQkJCXsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+IFJlYWQgJXMgZXJyb3IgJWRcbiIsIHNyYywgLXJldHZhbCkpOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQkvLyBzZXQgZmlsZSBwYXJhbWV0ZXIgdG8gcG9ydGNmZworCQkJCQkvL0NvdW50cnlSZWdpb24KKwkJCQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiQ291bnRyeVJlZ2lvbiIsIHRtcGJ1ZiwgMjUsIGJ1ZmZlcikpCisJCQkJCXsKKwkJCQkJCXBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb24gPSAoVUNIQVIpIHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCk7CisJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDb3VudHJ5UmVnaW9uPSVkXG4iLCBwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uKSk7CisJCQkJCX0KKwkJCQkJLy9Db3VudHJ5UmVnaW9uQUJhbmQKKwkJCQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiQ291bnRyeVJlZ2lvbkFCYW5kIiwgdG1wYnVmLCAyNSwgYnVmZmVyKSkKKwkJCQkJeworCQkJCQkJcEFkLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbkZvckFCYW5kPSAoVUNIQVIpIHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCk7CisJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDb3VudHJ5UmVnaW9uQUJhbmQ9JWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb25Gb3JBQmFuZCkpOworCQkJCQl9CisJCQkJCS8vQ291bnRyeUNvZGUKKwkJCQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiQ291bnRyeUNvZGUiLCB0bXBidWYsIDI1LCBidWZmZXIpKQorCQkJCQl7CisJCQkJCQlOZGlzTW92ZU1lbW9yeShwQWQtPkNvbW1vbkNmZy5Db3VudHJ5Q29kZSwgdG1wYnVmICwgMik7CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisjaWZkZWYgRVhUX0JVSUxEX0NIQU5ORUxfTElTVAorCQkJCQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJCQkJCQlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5TdGFPcmlDb3VudHJ5Q29kZSwgdG1wYnVmICwgMik7CisjZW5kaWYgLy8gRVhUX0JVSUxEX0NIQU5ORUxfTElTVCAvLworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCQkJCQkJaWYgKHN0cmxlbihwQWQtPkNvbW1vbkNmZy5Db3VudHJ5Q29kZSkgIT0gMCkKKwkJCQkJCXsKKwkJCQkJCQlwQWQtPkNvbW1vbkNmZy5iQ291bnRyeUZsYWcgPSBUUlVFOworCQkJCQkJfQorCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ291bnRyeUNvZGU9JXNcbiIsIHBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlDb2RlKSk7CisJCQkJCX0KKwkJCQkJLy9DaGFubmVsR2VvZ3JhcGh5CisJCQkJCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkNoYW5uZWxHZW9ncmFwaHkiLCB0bXBidWYsIDI1LCBidWZmZXIpKQorCQkJCQl7CisJCQkJCQlVQ0hBUiBHZW9ncmFwaHkgPSAoVUNIQVIpIHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCk7CisJCQkJCQlpZiAoR2VvZ3JhcGh5IDw9IEJPVEgpCisJCQkJCQl7CisJCQkJCQkJcEFkLT5Db21tb25DZmcuR2VvZ3JhcGh5ID0gR2VvZ3JhcGh5OworCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlDb2RlWzJdID0KKwkJCQkJCQkJKHBBZC0+Q29tbW9uQ2ZnLkdlb2dyYXBoeSA9PSBCT1RIKSA/ICcgJyA6ICgocEFkLT5Db21tb25DZmcuR2VvZ3JhcGh5ID09IElET1IpID8gJ0knIDogJ08nKTsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKyNpZmRlZiBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUCisJCQkJCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQkJCQkJCXBBZC0+U3RhQ2ZnLlN0YU9yaUdlb2dyYXBoeSA9IHBBZC0+Q29tbW9uQ2ZnLkdlb2dyYXBoeTsKKyNlbmRpZiAvLyBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUIC8vCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ2hhbm5lbEdlb2dyYXBoeT0lZFxuIiwgcEFkLT5Db21tb25DZmcuR2VvZ3JhcGh5KSk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlwQWQtPkNvbW1vbkNmZy5HZW9ncmFwaHkgPSBCT1RIOworCQkJCQkJcEFkLT5Db21tb25DZmcuQ291bnRyeUNvZGVbMl0gPSAnICc7CisJCQkJCX0KKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCQkJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCQkJCXsKKwkJCQkJCS8vU1NJRAorCQkJCQkJaWYgKFJUTVBHZXRDcml0aWNhbFBhcmFtZXRlcigiU1NJRCIsIHRtcGJ1ZiwgMjU2LCBidWZmZXIpKQorCQkJCQkJeworCQkJCQkJCWlmIChzdHJsZW4odG1wYnVmKSA8PSAzMikKKwkJCQkJCQl7CisJCQkgCQkJCQlwQWQtPkNvbW1vbkNmZy5Tc2lkTGVuID0gKFVDSEFSKSBzdHJsZW4odG1wYnVmKTsKKwkJCQkJCQkJTmRpc1plcm9NZW1vcnkocEFkLT5Db21tb25DZmcuU3NpZCwgTkRJU184MDJfMTFfTEVOR1RIX1NTSUQpOworCQkJCQkJCQlOZGlzTW92ZU1lbW9yeShwQWQtPkNvbW1vbkNmZy5Tc2lkLCB0bXBidWYsIHBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW4pOworCQkJCQkJCQlwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWRMZW4gPSBwQWQtPkNvbW1vbkNmZy5Tc2lkTGVuOworCQkJCQkJCQlOZGlzWmVyb01lbW9yeShwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWQsIE5ESVNfODAyXzExX0xFTkdUSF9TU0lEKTsKKwkJCQkJCQkJTmRpc01vdmVNZW1vcnkocEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkLCB0bXBidWYsIHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbik7CisJCQkJCQkJCXBBZC0+TWxtZUF1eC5Tc2lkTGVuID0gcEFkLT5Db21tb25DZmcuU3NpZExlbjsKKwkJCQkJCQkJTmRpc1plcm9NZW1vcnkocEFkLT5NbG1lQXV4LlNzaWQsIE5ESVNfODAyXzExX0xFTkdUSF9TU0lEKTsKKwkJCQkJCQkJTmRpc01vdmVNZW1vcnkocEFkLT5NbG1lQXV4LlNzaWQsIHRtcGJ1ZiwgcEFkLT5NbG1lQXV4LlNzaWRMZW4pOworCQkJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6KFNTSUQ9JXMpXG4iLCBfX2Z1bmNfXywgdG1wYnVmKSk7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJCQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJCQkJeworCQkJCQkJLy9OZXR3b3JrVHlwZQorCQkJCQkJaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIk5ldHdvcmtUeXBlIiwgdG1wYnVmLCAyNSwgYnVmZmVyKSkKKwkJCQkJCXsKKwkJCQkJCQlwQWQtPmJDb25maWdDaGFuZ2VkID0gVFJVRTsKKwkJCQkJCQlpZiAoc3RyY21wKHRtcGJ1ZiwgIkFkaG9jIikgPT0gMCkKKwkJCQkJCQkJcEFkLT5TdGFDZmcuQnNzVHlwZSA9IEJTU19BREhPQzsKKwkJCQkJCQllbHNlIC8vRGVmYXVsdCBJbmZyYXN0cnVjdHVyZSBtb2RlCisJCQkJCQkJCXBBZC0+U3RhQ2ZnLkJzc1R5cGUgPSBCU1NfSU5GUkE7CisJCQkJCQkJLy8gUmVzZXQgUmFsaW5rIHN1cHBsaWNhbnQgdG8gbm90IHVzZSwgaXQgd2lsbCBiZSBzZXQgdG8gc3RhcnQgd2hlbiBVSSBzZXQgUE1LIGtleQorCQkJCQkJCXBBZC0+U3RhQ2ZnLldwYVN0YXRlID0gU1NfTk9UVVNFOworCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjooTmV0d29ya1R5cGU9JWQpXG4iLCBfX2Z1bmNfXywgcEFkLT5TdGFDZmcuQnNzVHlwZSkpOworCQkJCQkJfQorCQkJCQl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJCQkJCS8vQ2hhbm5lbAorCQkJCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJDaGFubmVsIiwgdG1wYnVmLCAxMCwgYnVmZmVyKSkKKwkJCQkJeworCQkJCQkJcEFkLT5Db21tb25DZmcuQ2hhbm5lbCA9IChVQ0hBUikgc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKTsKKwkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNoYW5uZWw9JWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpKTsKKwkJCQkJfQorCQkJCQkvL1dpcmVsZXNzTW9kZQorCQkJCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJXaXJlbGVzc01vZGUiLCB0bXBidWYsIDEwLCBidWZmZXIpKQorCQkJCQl7CisJCQkJCQlpbnQgdmFsdWUgID0gMCwgbWF4UGh5TW9kZSA9IFBIWV8xMUc7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCQkJCW1heFBoeU1vZGUgPSBQSFlfMTFOXzVHOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJCQkJCQl2YWx1ZSA9IHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCk7CisKKwkJCQkJCWlmICh2YWx1ZSA8PSBtYXhQaHlNb2RlKQorCQkJCQkJeworCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPSB2YWx1ZTsKKwkJCQkJCX0KKwkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBoeU1vZGU9JWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUpKTsKKwkJCQkJfQorICAgICAgICAgICAgICAgICAgICAvL0Jhc2ljUmF0ZQorCQkJCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJCYXNpY1JhdGUiLCB0bXBidWYsIDEwLCBidWZmZXIpKQorCQkJCQl7CisJCQkJCQlwQWQtPkNvbW1vbkNmZy5CYXNpY1JhdGVCaXRtYXAgPSAoVUxPTkcpIHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCk7CisJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJCYXNpY1JhdGU9JWxkXG4iLCBwQWQtPkNvbW1vbkNmZy5CYXNpY1JhdGVCaXRtYXApKTsKKwkJCQkJfQorCQkJCQkvL0JlYWNvblBlcmlvZAorCQkJCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJCZWFjb25QZXJpb2QiLCB0bXBidWYsIDEwLCBidWZmZXIpKQorCQkJCQl7CisJCQkJCQlwQWQtPkNvbW1vbkNmZy5CZWFjb25QZXJpb2QgPSAoVVNIT1JUKSBzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApOworCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQmVhY29uUGVyaW9kPSVkXG4iLCBwQWQtPkNvbW1vbkNmZy5CZWFjb25QZXJpb2QpKTsKKwkJCQkJfQorICAgICAgICAgICAgICAgICAgICAvL1R4UG93ZXIKKwkJCQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiVHhQb3dlciIsIHRtcGJ1ZiwgMTAsIGJ1ZmZlcikpCisJCQkJCXsKKwkJCQkJCXBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID0gKFVMT05HKSBzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApOworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQkJCQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJCQkJCQlwQWQtPkNvbW1vbkNmZy5UeFBvd2VyRGVmYXVsdCA9IHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiVHhQb3dlcj0lbGRcbiIsIHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlKSk7CisJCQkJCX0KKwkJCQkJLy9CR1Byb3RlY3Rpb24KKwkJCQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiQkdQcm90ZWN0aW9uIiwgdG1wYnVmLCAxMCwgYnVmZmVyKSkKKwkJCQkJeworCQkJCQkJc3dpdGNoIChzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApKQorCQkJCQkJeworCQkJCQkJCWNhc2UgMTogLy9BbHdheXMgT24KKwkJCQkJCQkJcEFkLT5Db21tb25DZmcuVXNlQkdQcm90ZWN0aW9uID0gMTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSAyOiAvL0Fsd2F5cyBPRkYKKwkJCQkJCQkJcEFkLT5Db21tb25DZmcuVXNlQkdQcm90ZWN0aW9uID0gMjsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSAwOiAvL0FVVE8KKwkJCQkJCQlkZWZhdWx0OgorCQkJCQkJCQlwQWQtPkNvbW1vbkNmZy5Vc2VCR1Byb3RlY3Rpb24gPSAwOworCQkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkJHUHJvdGVjdGlvbj0lbGRcbiIsIHBBZC0+Q29tbW9uQ2ZnLlVzZUJHUHJvdGVjdGlvbikpOworCQkJCQl9CisJCQkJCS8vT0xCQ0RldGVjdGlvbgorCQkJCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJEaXNhYmxlT0xCQyIsIHRtcGJ1ZiwgMTAsIGJ1ZmZlcikpCisJCQkJCXsKKwkJCQkJCXN3aXRjaCAoc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKSkKKwkJCQkJCXsKKwkJCQkJCQljYXNlIDE6IC8vZGlzYWJsZSBPTEJDIERldGVjdGlvbgorCQkJCQkJCQlwQWQtPkNvbW1vbkNmZy5EaXNhYmxlT0xCQ0RldGVjdCA9IDE7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgMDogLy9lbmFibGUgT0xCQyBEZXRlY3Rpb24KKwkJCQkJCQkJcEFkLT5Db21tb25DZmcuRGlzYWJsZU9MQkNEZXRlY3QgPSAwOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQlkZWZhdWx0OgorCQkJCQkJCQlwQWQtPkNvbW1vbkNmZy5EaXNhYmxlT0xCQ0RldGVjdD0gMDsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJPTEJDRGV0ZWN0aW9uPSVsZFxuIiwgcEFkLT5Db21tb25DZmcuRGlzYWJsZU9MQkNEZXRlY3QpKTsKKwkJCQkJfQorCQkJCQkvL1R4UHJlYW1ibGUKKwkJCQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiVHhQcmVhbWJsZSIsIHRtcGJ1ZiwgMTAsIGJ1ZmZlcikpCisJCQkJCXsKKwkJCQkJCXN3aXRjaCAoc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKSkKKwkJCQkJCXsKKwkJCQkJCQljYXNlIFJ0ODAyXzExUHJlYW1ibGVTaG9ydDoKKwkJCQkJCQkJcEFkLT5Db21tb25DZmcuVHhQcmVhbWJsZSA9IFJ0ODAyXzExUHJlYW1ibGVTaG9ydDsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSBSdDgwMl8xMVByZWFtYmxlTG9uZzoKKwkJCQkJCQlkZWZhdWx0OgorCQkJCQkJCQlwQWQtPkNvbW1vbkNmZy5UeFByZWFtYmxlID0gUnQ4MDJfMTFQcmVhbWJsZUxvbmc7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiVHhQcmVhbWJsZT0lbGRcbiIsIHBBZC0+Q29tbW9uQ2ZnLlR4UHJlYW1ibGUpKTsKKwkJCQkJfQorCQkJCQkvL1JUU1RocmVzaG9sZAorCQkJCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJSVFNUaHJlc2hvbGQiLCB0bXBidWYsIDEwLCBidWZmZXIpKQorCQkJCQl7CisJCQkJCQlSdHNUaHJlc2ggPSBzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApOworCQkJCQkJaWYoIChSdHNUaHJlc2ggPj0gMSkgJiYgKFJ0c1RocmVzaCA8PSBNQVhfUlRTX1RIUkVTSE9MRCkgKQorCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLlJ0c1RocmVzaG9sZCAgPSAoVVNIT1JUKVJ0c1RocmVzaDsKKwkJCQkJCWVsc2UKKwkJCQkJCQlwQWQtPkNvbW1vbkNmZy5SdHNUaHJlc2hvbGQgPSBNQVhfUlRTX1RIUkVTSE9MRDsKKworCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlRTVGhyZXNob2xkPSVkXG4iLCBwQWQtPkNvbW1vbkNmZy5SdHNUaHJlc2hvbGQpKTsKKwkJCQkJfQorCQkJCQkvL0ZyYWdUaHJlc2hvbGQKKwkJCQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiRnJhZ1RocmVzaG9sZCIsIHRtcGJ1ZiwgMTAsIGJ1ZmZlcikpCisJCQkJCXsKKwkJCQkJCUZyYWdUaHJlc2ggPSBzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApOworCQkJCQkJcEFkLT5Db21tb25DZmcuYlVzZVplcm9Ub0Rpc2FibGVGcmFnbWVudCA9IEZBTFNFOworCisJCQkJCQlpZiAoRnJhZ1RocmVzaCA+IE1BWF9GUkFHX1RIUkVTSE9MRCB8fCBGcmFnVGhyZXNoIDwgTUlOX0ZSQUdfVEhSRVNIT0xEKQorCQkJCQkJeyAvL2lsbGVnYWwgRnJhZ1RocmVzaCBzbyB3ZSBzZXQgaXQgdG8gZGVmYXVsdAorCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLkZyYWdtZW50VGhyZXNob2xkID0gTUFYX0ZSQUdfVEhSRVNIT0xEOworCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLmJVc2VaZXJvVG9EaXNhYmxlRnJhZ21lbnQgPSBUUlVFOworCQkJCQkJfQorCQkJCQkJZWxzZSBpZiAoRnJhZ1RocmVzaCAlIDIgPT0gMSkKKwkJCQkJCXsKKwkJCQkJCQkvLyBUaGUgbGVuZ3RoIG9mIGVhY2ggZnJhZ21lbnQgc2hhbGwgYWx3YXlzIGJlIGFuIGV2ZW4gbnVtYmVyIG9mIG9jdGV0cywgZXhjZXB0IGZvciB0aGUgbGFzdCBmcmFnbWVudAorCQkJCQkJCS8vIG9mIGFuIE1TRFUgb3IgTU1QRFUsIHdoaWNoIG1heSBiZSBlaXRoZXIgYW4gZXZlbiBvciBhbiBvZGQgbnVtYmVyIG9mIG9jdGV0cy4KKwkJCQkJCQlwQWQtPkNvbW1vbkNmZy5GcmFnbWVudFRocmVzaG9sZCA9IChVU0hPUlQpKEZyYWdUaHJlc2ggLSAxKTsKKwkJCQkJCX0KKwkJCQkJCWVsc2UKKwkJCQkJCXsKKwkJCQkJCQlwQWQtPkNvbW1vbkNmZy5GcmFnbWVudFRocmVzaG9sZCA9IChVU0hPUlQpRnJhZ1RocmVzaDsKKwkJCQkJCX0KKwkJCQkJCS8vcEFkLT5Db21tb25DZmcuQWxsb3dGcmFnU2l6ZSA9IChwQWQtPkNvbW1vbkNmZy5GcmFnbWVudFRocmVzaG9sZCkgLSBMRU5HVEhfODAyXzExIC0gTEVOR1RIX0NSQzsKKwkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkZyYWdUaHJlc2hvbGQ9JWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLkZyYWdtZW50VGhyZXNob2xkKSk7CisJCQkJCX0KKwkJCQkJLy9UeEJ1cnN0CisJCQkJCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIlR4QnVyc3QiLCB0bXBidWYsIDEwLCBidWZmZXIpKQorCQkJCQl7CisJCQkJCQlpZihzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApICE9IDApICAvL0VuYWJsZQorCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLmJFbmFibGVUeEJ1cnN0ID0gVFJVRTsKKwkJCQkJCWVsc2UgLy9EaXNhYmxlCisJCQkJCQkJcEFkLT5Db21tb25DZmcuYkVuYWJsZVR4QnVyc3QgPSBGQUxTRTsKKwkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlR4QnVyc3Q9JWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLmJFbmFibGVUeEJ1cnN0KSk7CisJCQkJCX0KKworI2lmZGVmIEFHR1JFR0FUSU9OX1NVUFBPUlQKKwkJCQkJLy9Qa3RBZ2dyZWdhdGUKKwkJCQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiUGt0QWdncmVnYXRlIiwgdG1wYnVmLCAxMCwgYnVmZmVyKSkKKwkJCQkJeworCQkJCQkJaWYoc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKSAhPSAwKSAgLy9FbmFibGUKKwkJCQkJCQlwQWQtPkNvbW1vbkNmZy5iQWdncmVnYXRpb25DYXBhYmxlID0gVFJVRTsKKwkJCQkJCWVsc2UgLy9EaXNhYmxlCisJCQkJCQkJcEFkLT5Db21tb25DZmcuYkFnZ3JlZ2F0aW9uQ2FwYWJsZSA9IEZBTFNFOworI2lmZGVmIFBJR0dZQkFDS19TVVBQT1JUCisJCQkJCQlwQWQtPkNvbW1vbkNmZy5iUGlnZ3lCYWNrQ2FwYWJsZSA9IHBBZC0+Q29tbW9uQ2ZnLmJBZ2dyZWdhdGlvbkNhcGFibGU7CisjZW5kaWYgLy8gUElHR1lCQUNLX1NVUFBPUlQgLy8KKwkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBrdEFnZ3JlZ2F0ZT0lZFxuIiwgcEFkLT5Db21tb25DZmcuYkFnZ3JlZ2F0aW9uQ2FwYWJsZSkpOworCQkJCQl9CisjZWxzZQorCQkJCQlwQWQtPkNvbW1vbkNmZy5iQWdncmVnYXRpb25DYXBhYmxlID0gRkFMU0U7CisJCQkJCXBBZC0+Q29tbW9uQ2ZnLmJQaWdneUJhY2tDYXBhYmxlID0gRkFMU0U7CisjZW5kaWYgLy8gQUdHUkVHQVRJT05fU1VQUE9SVCAvLworCisJCQkJCS8vIFdtbUNhcGFibGUKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQkJCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQkJCQkJcnRtcF9yZWFkX3N0YV93bW1fcGFybXNfZnJvbV9maWxlKHBBZCwgdG1wYnVmLCBidWZmZXIpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJCQkJCS8vU2hvcnRTbG90CisJCQkJCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIlNob3J0U2xvdCIsIHRtcGJ1ZiwgMTAsIGJ1ZmZlcikpCisJCQkJCXsKKwkJCQkJCWlmKHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCkgIT0gMCkgIC8vRW5hYmxlCisJCQkJCQkJcEFkLT5Db21tb25DZmcuYlVzZVNob3J0U2xvdFRpbWUgPSBUUlVFOworCQkJCQkJZWxzZSAvL0Rpc2FibGUKKwkJCQkJCQlwQWQtPkNvbW1vbkNmZy5iVXNlU2hvcnRTbG90VGltZSA9IEZBTFNFOworCisJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTaG9ydFNsb3Q9JWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLmJVc2VTaG9ydFNsb3RUaW1lKSk7CisJCQkJCX0KKwkJCQkJLy9JRUVFODAyMTFICisJCQkJCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIklFRUU4MDIxMUgiLCB0bXBidWYsIDEwLCBidWZmZXIpKQorCQkJCQl7CisJCQkJCSAgICBmb3IgKGkgPSAwLCBtYWNwdHIgPSByc3RydG9rKHRtcGJ1ZiwiOyIpOyBtYWNwdHI7IG1hY3B0ciA9IHJzdHJ0b2soTlVMTCwiOyIpLCBpKyspCisJCQkJCSAgICB7CisgICAgCQkJCQkJaWYoc2ltcGxlX3N0cnRvbChtYWNwdHIsIDAsIDEwKSAhPSAwKSAgLy9FbmFibGUKKyAgICAJCQkJCQkJcEFkLT5Db21tb25DZmcuYklFRUU4MDIxMUggPSBUUlVFOworICAgIAkJCQkJCWVsc2UgLy9EaXNhYmxlCisgICAgCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLmJJRUVFODAyMTFIID0gRkFMU0U7CisKKyAgICAJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJRUVFODAyMTFIPSVkXG4iLCBwQWQtPkNvbW1vbkNmZy5iSUVFRTgwMjExSCkpOworCQkJCQkgICAgfQorCQkJCQl9CisJCQkJCS8vQ1NQZXJpb2QKKwkJCQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiQ1NQZXJpb2QiLCB0bXBidWYsIDEwLCBidWZmZXIpKQorCQkJCQl7CisJCQkJCSAgICBpZihzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApICE9IDApCisJCQkJCQkJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuQ1NQZXJpb2QgPSBzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApOworCQkJCQkJZWxzZQorCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LkNTUGVyaW9kID0gMDsKKworICAgCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ1NQZXJpb2Q9JWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LkNTUGVyaW9kKSk7CisJCQkJCX0KKworCQkJCQkvL1JEUmVnaW9uCisJCQkJCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIlJEUmVnaW9uIiwgdG1wYnVmLCAxMjgsIGJ1ZmZlcikpCisJCQkJCXsKKwkJCQkJCWlmICgoc3RybmNtcCh0bXBidWYsICJKQVBfVzUzIiwgNykgPT0gMCkgfHwgKHN0cm5jbXAodG1wYnVmLCAiamFwX3c1MyIsIDcpID09IDApKQorCQkJCQkJeworCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJERHVyUmVnaW9uID0gSkFQX1c1MzsKKwkJCQkJCQlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5EZnNTZXNzaW9uVGltZSA9IDE1OworCQkJCQkJfQorCQkJCQkJZWxzZSBpZiAoKHN0cm5jbXAodG1wYnVmLCAiSkFQX1c1NiIsIDcpID09IDApIHx8IChzdHJuY21wKHRtcGJ1ZiwgImphcF93NTYiLCA3KSA9PSAwKSkKKwkJCQkJCXsKKwkJCQkJCQlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5SRER1clJlZ2lvbiA9IEpBUF9XNTY7CisJCQkJCQkJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuRGZzU2Vzc2lvblRpbWUgPSAxMzsKKwkJCQkJCX0KKwkJCQkJCWVsc2UgaWYgKChzdHJuY21wKHRtcGJ1ZiwgIkpBUCIsIDMpID09IDApIHx8IChzdHJuY21wKHRtcGJ1ZiwgImphcCIsIDMpID09IDApKQorCQkJCQkJeworCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJERHVyUmVnaW9uID0gSkFQOworCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LkRmc1Nlc3Npb25UaW1lID0gNTsKKwkJCQkJCX0KKwkJCQkJCWVsc2UgIGlmICgoc3RybmNtcCh0bXBidWYsICJGQ0MiLCAzKSA9PSAwKSB8fCAoc3RybmNtcCh0bXBidWYsICJmY2MiLCAzKSA9PSAwKSkKKwkJCQkJCXsKKwkJCQkJCQlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5SRER1clJlZ2lvbiA9IEZDQzsKKwkJCQkJCQlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5EZnNTZXNzaW9uVGltZSA9IDU7CisJCQkJCQl9CisJCQkJCQllbHNlIGlmICgoc3RybmNtcCh0bXBidWYsICJDRSIsIDIpID09IDApIHx8IChzdHJuY21wKHRtcGJ1ZiwgImNlIiwgMikgPT0gMCkpCisJCQkJCQl7CisJCQkJCQkJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkREdXJSZWdpb24gPSBDRTsKKwkJCQkJCQlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5EZnNTZXNzaW9uVGltZSA9IDEzOworCQkJCQkJfQorCQkJCQkJZWxzZQorCQkJCQkJeworCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJERHVyUmVnaW9uID0gQ0U7CisJCQkJCQkJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuRGZzU2Vzc2lvblRpbWUgPSAxMzsKKwkJCQkJCX0KKworCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkRSZWdpb249JWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJERHVyUmVnaW9uKSk7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5SRER1clJlZ2lvbiA9IENFOworCQkJCQkJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuRGZzU2Vzc2lvblRpbWUgPSAxMzsKKwkJCQkJfQorCisJCQkJCS8vV2lyZWxlc3NFdmVudAorCQkJCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJXaXJlbGVzc0V2ZW50IiwgdG1wYnVmLCAxMCwgYnVmZmVyKSkKKwkJCQkJeworI2lmIFdJUkVMRVNTX0VYVCA+PSAxNQorCQkJCQkgICAgaWYoc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKSAhPSAwKQorCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLmJXaXJlbGVzc0V2ZW50ID0gc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKTsKKwkJCQkJCWVsc2UKKwkJCQkJCQlwQWQtPkNvbW1vbkNmZy5iV2lyZWxlc3NFdmVudCA9IDA7CS8vIGRpc2FibGUKKyNlbHNlCisJCQkJCQlwQWQtPkNvbW1vbkNmZy5iV2lyZWxlc3NFdmVudCA9IDA7CS8vIGRpc2FibGUKKyNlbmRpZgorICAgCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiV2lyZWxlc3NFdmVudD0lZFxuIiwgcEFkLT5Db21tb25DZmcuYldpcmVsZXNzRXZlbnQpKTsKKwkJCQkJfQorCQkJCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJXaUZpVGVzdCIsIHRtcGJ1ZiwgMTAsIGJ1ZmZlcikpCisJCQkJCXsKKwkJCQkJICAgIGlmKHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCkgIT0gMCkKKwkJCQkJCQlwQWQtPkNvbW1vbkNmZy5iV2lGaVRlc3Q9IHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCk7CisJCQkJCQllbHNlCisJCQkJCQkJcEFkLT5Db21tb25DZmcuYldpRmlUZXN0ID0gMDsJLy8gZGlzYWJsZQorCisgICAJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJXaUZpVGVzdD0lZFxuIiwgcEFkLT5Db21tb25DZmcuYldpRmlUZXN0KSk7CisJCQkJCX0KKwkJCQkJLy9BdXRoTW9kZQorCQkJCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJBdXRoTW9kZSIsIHRtcGJ1ZiwgMTI4LCBidWZmZXIpKQorCQkJCQl7CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCQkJCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQkJCQkJeworCQkJCQkJCWlmICgoc3RyY21wKHRtcGJ1ZiwgIldFUEFVVE8iKSA9PSAwKSB8fCAoc3RyY21wKHRtcGJ1ZiwgIndlcGF1dG8iKSA9PSAwKSkKKwkJCQkJCQkgICAgcEFkLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVBdXRvU3dpdGNoOworCQkJCQkJCWVsc2UgaWYgKChzdHJjbXAodG1wYnVmLCAiU0hBUkVEIikgPT0gMCkgfHwgKHN0cmNtcCh0bXBidWYsICJzaGFyZWQiKSA9PSAwKSkKKwkJCQkJCQkgICAgcEFkLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVTaGFyZWQ7CisJCQkJCQkJZWxzZSBpZiAoKHN0cmNtcCh0bXBidWYsICJXUEFQU0siKSA9PSAwKSB8fCAoc3RyY21wKHRtcGJ1ZiwgIndwYXBzayIpID09IDApKQorCQkJCQkJCSAgICBwQWQtPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSzsKKwkJCQkJCQllbHNlIGlmICgoc3RyY21wKHRtcGJ1ZiwgIldQQU5PTkUiKSA9PSAwKSB8fCAoc3RyY21wKHRtcGJ1ZiwgIndwYW5vbmUiKSA9PSAwKSkKKwkJCQkJCQkgICAgcEFkLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lOworCQkJCQkJCWVsc2UgaWYgKChzdHJjbXAodG1wYnVmLCAiV1BBMlBTSyIpID09IDApIHx8IChzdHJjbXAodG1wYnVmLCAid3BhMnBzayIpID09IDApKQorCQkJCQkJCSAgICBwQWQtPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0s7CisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorCQkJCQkJCWVsc2UgaWYgKChzdHJjbXAodG1wYnVmLCAiV1BBIikgPT0gMCkgfHwgKHN0cmNtcCh0bXBidWYsICJ3cGEiKSA9PSAwKSkKKwkJCQkJCQkgICAgcEFkLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVXUEE7CisJCQkJCQkJZWxzZSBpZiAoKHN0cmNtcCh0bXBidWYsICJXUEEyIikgPT0gMCkgfHwgKHN0cmNtcCh0bXBidWYsICJ3cGEyIikgPT0gMCkpCisJCQkJCQkJICAgIHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMjsKKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisJCQkJICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorCQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWQtPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZU9wZW47CisKKwkJCQkgICAgICAgICAgICAgICAgICAgICAgICBwQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9OT1RfU0VDVVJFRDsKKworCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjooRW5jcnlwVHlwZT0lZClcbiIsIF9fZnVuY19fLCBwQWQtPlN0YUNmZy5XZXBTdGF0dXMpKTsKKwkJCQkJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwkJCQkJfQorCQkJCQkvL0VuY3J5cFR5cGUKKwkJCQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiRW5jcnlwVHlwZSIsIHRtcGJ1ZiwgMTI4LCBidWZmZXIpKQorCQkJCQl7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJCQkJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCQkJCQl7CisJCQkJCQkJaWYgKChzdHJjbXAodG1wYnVmLCAiV0VQIikgPT0gMCkgfHwgKHN0cmNtcCh0bXBidWYsICJ3ZXAiKSA9PSAwKSkKKwkJCQkJCQkJcEFkLT5TdGFDZmcuV2VwU3RhdHVzCT0gTmRpczgwMl8xMVdFUEVuYWJsZWQ7CisJCQkJCQkJZWxzZSBpZiAoKHN0cmNtcCh0bXBidWYsICJUS0lQIikgPT0gMCkgfHwgKHN0cmNtcCh0bXBidWYsICJ0a2lwIikgPT0gMCkpCisJCQkJCQkJCXBBZC0+U3RhQ2ZnLldlcFN0YXR1cwk9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ7CisJCQkJCQkJZWxzZSBpZiAoKHN0cmNtcCh0bXBidWYsICJBRVMiKSA9PSAwKSB8fCAoc3RyY21wKHRtcGJ1ZiwgImFlcyIpID09IDApKQorCQkJCQkJCQlwQWQtPlN0YUNmZy5XZXBTdGF0dXMJPSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkOworCQkJCQkJCWVsc2UKKwkJCQkJCQkJcEFkLT5TdGFDZmcuV2VwU3RhdHVzCT0gTmRpczgwMl8xMVdFUERpc2FibGVkOworCisJCQkJCQkJLy8gVXBkYXRlIGFsbCB3ZXBzdGF0dXMgcmVsYXRlZAorCQkJCQkJCXBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIJCT0gcEFkLT5TdGFDZmcuV2VwU3RhdHVzOworCQkJCQkJCXBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyIAk9IHBBZC0+U3RhQ2ZnLldlcFN0YXR1czsKKwkJCQkJCQlwQWQtPlN0YUNmZy5PcmlnV2VwU3RhdHVzIAk9IHBBZC0+U3RhQ2ZnLldlcFN0YXR1czsKKwkJCQkJCQlwQWQtPlN0YUNmZy5iTWl4Q2lwaGVyIAkJPSBGQUxTRTsKKworCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjooRW5jcnlwVHlwZT0lZClcbiIsIF9fZnVuY19fLCBwQWQtPlN0YUNmZy5XZXBTdGF0dXMpKTsKKwkJCQkJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwkJCQkJfQorCisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQkJCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQkJCQl7CisJCQkJCQlpZihSVE1QR2V0Q3JpdGljYWxQYXJhbWV0ZXIoIldQQVBTSyIsIHRtcGJ1ZiwgNTEyLCBidWZmZXIpKQorCQkJCQkJeworCQkJCQkJCWludCAgICAgZXJyPTA7CisKKwkJCQkJCQl0bXBidWZbc3RybGVuKHRtcGJ1ZildID0gJ1wwJzsgLy8gbWFrZSBTVEEgY2FuIHByb2Nlc3MgLiReJiBmb3IgV1BBUFNLIGlucHV0CisKKwkJCQkJCQlpZiAoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlICE9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykgJiYKKwkJCQkJCQkJKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlICE9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spICYmCisJCQkJCQkJCShwQWQtPlN0YUNmZy5BdXRoTW9kZSAhPSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lKQorCQkJCQkJCQkpCisJCQkJCQkJeworCQkJCQkJCQllcnIgPSAxOworCQkJCQkJCX0KKwkJCQkJCQllbHNlIGlmICgoc3RybGVuKHRtcGJ1ZikgPj0gOCkgJiYgKHN0cmxlbih0bXBidWYpIDwgNjQpKQorCQkJCQkJCXsKKwkJCQkJCQkJUGFzc3dvcmRIYXNoKChjaGFyICopdG1wYnVmLCBwQWQtPkNvbW1vbkNmZy5Tc2lkLCBwQWQtPkNvbW1vbkNmZy5Tc2lkTGVuLCBrZXlNYXRlcmlhbCk7CisJCQkJCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLlBNSywga2V5TWF0ZXJpYWwsIDMyKTsKKworCQkJCQkJCX0KKwkJCQkJCQllbHNlIGlmIChzdHJsZW4odG1wYnVmKSA9PSA2NCkKKwkJCQkJCQl7CisJCQkJCQkJCUF0b0godG1wYnVmLCBrZXlNYXRlcmlhbCwgMzIpOworCQkJCQkJCQlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5QTUssIGtleU1hdGVyaWFsLCAzMik7CisJCQkJCQkJfQorCQkJCQkJCWVsc2UKKwkJCQkJCQl7CisJCQkJCQkJCWVyciA9IDE7CisJCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzOjooV1BBUFNLIGtleS1zdHJpbmcgcmVxdWlyZWQgOCB+IDY0IGNoYXJhY3RlcnMhKVxuIiwgX19mdW5jX18pKTsKKwkJCQkJCQl9CisKKwkJCQkJCQlpZiAoZXJyID09IDApCisJICAgICAgICAgICAgICAgICAgICAgICAgCQkJeworCSAgICAgICAgICAgICAgICAgICAgICAgIAkJCQlpZiAoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykgfHwKKwkJCQkJCQkJCShwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKSkKKwkJCQkJCQkJeworCQkJCQkJCQkJLy8gU3RhcnQgU1RBIHN1cHBsaWNhbnQgc3RhdGUgbWFjaGluZQorCQkJCQkJCQkJcEFkLT5TdGFDZmcuV3BhU3RhdGUgPSBTU19TVEFSVDsKKwkJCQkJCQkJfQorCQkJCQkJCQllbHNlIGlmIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lKQorCQkJCQkJCQl7CisJCQkJCQkJCQlwQWQtPlN0YUNmZy5XcGFTdGF0ZSA9IFNTX05PVFVTRTsKKwkJCQkJCQkJfQorCisJCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjooV1BBUFNLPSVzKVxuIiwgX19mdW5jX18sIHRtcGJ1ZikpOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJCQkJCS8vRGVmYXVsdEtleUlELCBLZXlUeXBlLCBLZXlTdHIKKwkJCQkJcnRtcF9yZWFkX2tleV9wYXJtc19mcm9tX2ZpbGUocEFkLCB0bXBidWYsIGJ1ZmZlcik7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCQkJSFRQYXJhbWV0ZXJzSG9vayhwQWQsIHRtcGJ1ZiwgYnVmZmVyKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCisjaWZkZWYgQ0FSUklFUl9ERVRFQ1RJT05fU1VQUE9SVAorCQkJCQkJLy9DYXJyaWVyRGV0ZWN0CisJCQkJCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJDYXJyaWVyRGV0ZWN0IiwgdG1wYnVmLCAxMjgsIGJ1ZmZlcikpCisJCQkJCQl7CisJCQkJCQkJaWYgKChzdHJuY21wKHRtcGJ1ZiwgIjAiLCAxKSA9PSAwKSkKKwkJCQkJCQkJcEFkLT5Db21tb25DZmcuQ2FycmllckRldGVjdC5FbmFibGUgPSBGQUxTRTsKKwkJCQkJCQllbHNlIGlmICgoc3RybmNtcCh0bXBidWYsICIxIiwgMSkgPT0gMCkpCisJCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLkNhcnJpZXJEZXRlY3QuRW5hYmxlID0gVFJVRTsKKwkJCQkJCQllbHNlCisJCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLkNhcnJpZXJEZXRlY3QuRW5hYmxlID0gRkFMU0U7CisKKwkJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDYXJyaWVyRGV0ZWN0LkVuYWJsZT0lZFxuIiwgcEFkLT5Db21tb25DZmcuQ2FycmllckRldGVjdC5FbmFibGUpKTsKKwkJCQkJCX0KKwkJCQkJCWVsc2UKKwkJCQkJCQlwQWQtPkNvbW1vbkNmZy5DYXJyaWVyRGV0ZWN0LkVuYWJsZSA9IEZBTFNFOworI2VuZGlmIC8vIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQgLy8KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQkJCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQkJCQl7CisJCQkJCQkvL1BTTW9kZQorCQkJCQkJaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIlBTTW9kZSIsIHRtcGJ1ZiwgMTAsIGJ1ZmZlcikpCisJCQkJCQl7CisJCQkJCQkJaWYgKHBBZC0+U3RhQ2ZnLkJzc1R5cGUgPT0gQlNTX0lORlJBKQorCQkJCQkJCXsKKwkJCQkJCQkJaWYgKChzdHJjbXAodG1wYnVmLCAiTUFYX1BTUCIpID09IDApIHx8IChzdHJjbXAodG1wYnVmLCAibWF4X3BzcCIpID09IDApKQorCQkJCQkJCQl7CisJCQkJCQkJCQkvLyBkbyBOT1QgdHVybiBvbiBQU00gYml0IGhlcmUsIHdhaXQgdW50aWwgTWxtZUNoZWNrRm9yUHNtQ2hhbmdlKCkKKwkJCQkJCQkJCS8vIHRvIGV4Y2x1ZGUgY2VydGFpbiBzaXR1YXRpb25zLgorCQkJCQkJCQkJLy8JICAgTWxtZVNldFBzbShwQWQsIFBXUl9TQVZFKTsKKwkJCQkJCQkJCU9QU1RBVFVTX1NFVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19SRUNFSVZFX0RUSU0pOworCQkJCQkJCQkJaWYgKHBBZC0+U3RhQ2ZnLmJXaW5kb3dzQUNDQU1FbmFibGUgPT0gRkFMU0UpCisJCQkJCQkJCQkJcEFkLT5TdGFDZmcuV2luZG93c1Bvd2VyTW9kZSA9IE5kaXM4MDJfMTFQb3dlck1vZGVNQVhfUFNQOworCQkJCQkJCQkJcEFkLT5TdGFDZmcuV2luZG93c0JhdHRlcnlQb3dlck1vZGUgPSBOZGlzODAyXzExUG93ZXJNb2RlTUFYX1BTUDsKKwkJCQkJCQkJCXBBZC0+U3RhQ2ZnLkRlZmF1bHRMaXN0ZW5Db3VudCA9IDU7CisJCQkJCQkJCX0KKwkJCQkJCQkJZWxzZSBpZiAoKHN0cmNtcCh0bXBidWYsICJGYXN0X1BTUCIpID09IDApIHx8IChzdHJjbXAodG1wYnVmLCAiZmFzdF9wc3AiKSA9PSAwKQorCQkJCQkJCQkJfHwgKHN0cmNtcCh0bXBidWYsICJGQVNUX1BTUCIpID09IDApKQorCQkJCQkJCQl7CisJCQkJCQkJCQkvLyBkbyBOT1QgdHVybiBvbiBQU00gYml0IGhlcmUsIHdhaXQgdW50aWwgTWxtZUNoZWNrRm9yUHNtQ2hhbmdlKCkKKwkJCQkJCQkJCS8vIHRvIGV4Y2x1ZGUgY2VydGFpbiBzaXR1YXRpb25zLgorCQkJCQkJCQkJLy8JICAgTWxtZVNldFBzbUJpdChwQWQsIFBXUl9TQVZFKTsKKwkJCQkJCQkJCU9QU1RBVFVTX1NFVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19SRUNFSVZFX0RUSU0pOworCQkJCQkJCQkJaWYgKHBBZC0+U3RhQ2ZnLmJXaW5kb3dzQUNDQU1FbmFibGUgPT0gRkFMU0UpCisJCQkJCQkJCQkJcEFkLT5TdGFDZmcuV2luZG93c1Bvd2VyTW9kZSA9IE5kaXM4MDJfMTFQb3dlck1vZGVGYXN0X1BTUDsKKwkJCQkJCQkJCXBBZC0+U3RhQ2ZnLldpbmRvd3NCYXR0ZXJ5UG93ZXJNb2RlID0gTmRpczgwMl8xMVBvd2VyTW9kZUZhc3RfUFNQOworCQkJCQkJCQkJcEFkLT5TdGFDZmcuRGVmYXVsdExpc3RlbkNvdW50ID0gMzsKKwkJCQkJCQkJfQorCQkJCQkJCQllbHNlIGlmICgoc3RyY21wKHRtcGJ1ZiwgIkxlZ2FjeV9QU1AiKSA9PSAwKSB8fCAoc3RyY21wKHRtcGJ1ZiwgImxlZ2FjeV9wc3AiKSA9PSAwKQorCQkJCQkJCQkJfHwgKHN0cmNtcCh0bXBidWYsICJMRUdBQ1lfUFNQIikgPT0gMCkpCisJCQkJCQkJCXsKKwkJCQkJCQkJCS8vIGRvIE5PVCB0dXJuIG9uIFBTTSBiaXQgaGVyZSwgd2FpdCB1bnRpbCBNbG1lQ2hlY2tGb3JQc21DaGFuZ2UoKQorCQkJCQkJCQkJLy8gdG8gZXhjbHVkZSBjZXJ0YWluIHNpdHVhdGlvbnMuCisJCQkJCQkJCQkvLwkgICBNbG1lU2V0UHNtQml0KHBBZCwgUFdSX1NBVkUpOworCQkJCQkJCQkJT1BTVEFUVVNfU0VUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1JFQ0VJVkVfRFRJTSk7CisJCQkJCQkJCQlpZiAocEFkLT5TdGFDZmcuYldpbmRvd3NBQ0NBTUVuYWJsZSA9PSBGQUxTRSkKKwkJCQkJCQkJCQlwQWQtPlN0YUNmZy5XaW5kb3dzUG93ZXJNb2RlID0gTmRpczgwMl8xMVBvd2VyTW9kZUxlZ2FjeV9QU1A7CisJCQkJCQkJCQlwQWQtPlN0YUNmZy5XaW5kb3dzQmF0dGVyeVBvd2VyTW9kZSA9IE5kaXM4MDJfMTFQb3dlck1vZGVMZWdhY3lfUFNQOworCQkJCQkJCQkJcEFkLT5TdGFDZmcuRGVmYXVsdExpc3RlbkNvdW50ID0gMzsKKwkJCQkJCQkJfQorCQkJCQkJCQllbHNlCisJCQkJCQkJCXsgLy9EZWZhdWx0IE5kaXM4MDJfMTFQb3dlck1vZGVDQU0KKwkJCQkJCQkJCS8vIGNsZWFyIFBTTSBiaXQgaW1tZWRpYXRlbHkKKwkJCQkJCQkJCU1sbWVTZXRQc21CaXQocEFkLCBQV1JfQUNUSVZFKTsKKwkJCQkJCQkJCU9QU1RBVFVTX1NFVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19SRUNFSVZFX0RUSU0pOworCQkJCQkJCQkJaWYgKHBBZC0+U3RhQ2ZnLmJXaW5kb3dzQUNDQU1FbmFibGUgPT0gRkFMU0UpCisJCQkJCQkJCQkJcEFkLT5TdGFDZmcuV2luZG93c1Bvd2VyTW9kZSA9IE5kaXM4MDJfMTFQb3dlck1vZGVDQU07CisJCQkJCQkJCQlwQWQtPlN0YUNmZy5XaW5kb3dzQmF0dGVyeVBvd2VyTW9kZSA9IE5kaXM4MDJfMTFQb3dlck1vZGVDQU07CisJCQkJCQkJCX0KKwkJCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUFNNb2RlPSVsZFxuIiwgcEFkLT5TdGFDZmcuV2luZG93c1Bvd2VyTW9kZSkpOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJCS8vIEZhc3RSb2FtaW5nCisJCQkJCQlpZiAoUlRNUEdldEtleVBhcmFtZXRlcigiRmFzdFJvYW1pbmciLCB0bXBidWYsIDMyLCBidWZmZXIpKQorCQkJCQkJeworCQkJCQkJCWlmIChzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApID09IDApCisJCQkJCQkJCXBBZC0+U3RhQ2ZnLmJGYXN0Um9hbWluZyA9IEZBTFNFOworCQkJCQkJCWVsc2UKKwkJCQkJCQkJcEFkLT5TdGFDZmcuYkZhc3RSb2FtaW5nID0gVFJVRTsKKworCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkZhc3RSb2FtaW5nPSVkXG4iLCBwQWQtPlN0YUNmZy5iRmFzdFJvYW1pbmcpKTsKKwkJCQkJCX0KKwkJCQkJCS8vIFJvYW1UaHJlc2hvbGQKKwkJCQkJCWlmIChSVE1QR2V0S2V5UGFyYW1ldGVyKCJSb2FtVGhyZXNob2xkIiwgdG1wYnVmLCAzMiwgYnVmZmVyKSkKKwkJCQkJCXsKKwkJCQkJCQlsb25nIGxJbmZvID0gc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKTsKKworCQkJCQkJCWlmIChsSW5mbyA+IDkwIHx8IGxJbmZvIDwgNjApCisJCQkJCQkJCXBBZC0+U3RhQ2ZnLmRCbVRvUm9hbSA9IC03MDsKKwkJCQkJCQllbHNlCisJCQkJCQkJCXBBZC0+U3RhQ2ZnLmRCbVRvUm9hbSA9IChDSEFSKSgtMSkqbEluZm87CisKKwkJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSb2FtVGhyZXNob2xkPSVkICBkQm1cbiIsIHBBZC0+U3RhQ2ZnLmRCbVRvUm9hbSkpOworCQkJCQkJfQorCisJCQkJCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJUR25XaWZpVGVzdCIsIHRtcGJ1ZiwgMTAsIGJ1ZmZlcikpCisJCQkJCQl7CisJCQkJCQkJaWYoc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKSA9PSAwKQorCQkJCQkJCQlwQWQtPlN0YUNmZy5iVEduV2lmaVRlc3QgPSBGQUxTRTsKKwkJCQkJCQllbHNlCisJCQkJCQkJCXBBZC0+U3RhQ2ZnLmJUR25XaWZpVGVzdCA9IFRSVUU7CisJCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlRHbldpZmlUZXN0PSVkXG4iLCBwQWQtPlN0YUNmZy5iVEduV2lmaVRlc3QpKTsKKwkJCQkJCX0KKwkJCQkJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJCQkJfQorCQkJfQorCQkJZWxzZQorCQkJeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPiAlcyBkb2VzIG5vdCBoYXZlIGEgd3JpdGUgbWV0aG9kXG4iLCBzcmMpKTsKKwkJCX0KKworCQkJcmV0dmFsPWZpbHBfY2xvc2Uoc3JjZixOVUxMKTsKKworCQkJaWYgKHJldHZhbCkKKwkJCXsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLT4gRXJyb3IgJWQgY2xvc2luZyAlc1xuIiwgLXJldHZhbCwgc3JjKSk7CisJCQl9CisJCX0KKwl9CisKKwlzZXRfZnMob3JnZnMpOworCisjaWYgMAorCWN1cnJlbnQtPmNyZWQtPmZzdWlkID0gb3JnZnN1aWQ7CisJY3VycmVudC0+Y3JlZC0+ZnNnaWQgPSBvcmdmc2dpZDsKKyNlbmRpZgorCisJa2ZyZWUoYnVmZmVyKTsKKwlrZnJlZSh0bXBidWYpOworCisJcmV0dXJuIChORElTX1NUQVRVU19TVUNDRVNTKTsKK30KKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorc3RhdGljIHZvaWQJSFRQYXJhbWV0ZXJzSG9vaygKKwlJTglQUlRNUF9BREFQVEVSIHBBZCwKKwlJTglDSEFSCQkgICpwVmFsdWVTdHIsCisJSU4JQ0hBUgkJICAqcElucHV0KQoreworCisJSU5UIFZhbHVlOworCisgICAgaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkhUX1BST1RFQ1QiLCBwVmFsdWVTdHIsIDI1LCBwSW5wdXQpKQorICAgIHsKKyAgICAgICAgVmFsdWUgPSBzaW1wbGVfc3RydG9sKHBWYWx1ZVN0ciwgMCwgMTApOworICAgICAgICBpZiAoVmFsdWUgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuYkhUUHJvdGVjdCA9IEZBTFNFOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuYkhUUHJvdGVjdCA9IFRSVUU7CisgICAgICAgIH0KKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSFQ6IFByb3RlY3Rpb24gID0gJXNcbiIsIChWYWx1ZT09MCkgPyAiRGlzYWJsZSIgOiAiRW5hYmxlIikpOworICAgIH0KKworICAgIGlmIChSVE1QR2V0S2V5UGFyYW1ldGVyKCJIVF9NSU1PUFNFbmFibGUiLCBwVmFsdWVTdHIsIDI1LCBwSW5wdXQpKQorICAgIHsKKyAgICAgICAgVmFsdWUgPSBzaW1wbGVfc3RydG9sKHBWYWx1ZVN0ciwgMCwgMTApOworICAgICAgICBpZiAoVmFsdWUgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuYk1JTU9QU0VuYWJsZSA9IEZBTFNFOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuYk1JTU9QU0VuYWJsZSA9IFRSVUU7CisgICAgICAgIH0KKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSFQ6IE1JTU9QU0VuYWJsZSAgPSAlc1xuIiwgKFZhbHVlPT0wKSA/ICJEaXNhYmxlIiA6ICJFbmFibGUiKSk7CisgICAgfQorCisKKyAgICBpZiAoUlRNUEdldEtleVBhcmFtZXRlcigiSFRfTUlNT1BTTW9kZSIsIHBWYWx1ZVN0ciwgMjUsIHBJbnB1dCkpCisgICAgeworICAgICAgICBWYWx1ZSA9IHNpbXBsZV9zdHJ0b2wocFZhbHVlU3RyLCAwLCAxMCk7CisgICAgICAgIGlmIChWYWx1ZSA+IE1NUFNfRU5BQkxFKQorICAgICAgICB7CisJCQlwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTU1QU21vZGUgPSBNTVBTX0VOQUJMRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vVE9ETzogYWRkIG1pbW8gcG93ZXIgc2F2aW5nIG1lY2hhbmlzbQorICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1NUFNtb2RlID0gTU1QU19FTkFCTEU7CisJCQkvL3BBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5NTVBTbW9kZSA9IFZhbHVlOworICAgICAgICB9CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkhUOiBNSU1PUFMgTW9kZSAgPSAlZFxuIiwgVmFsdWUpKTsKKyAgICB9CisKKyAgICBpZiAoUlRNUEdldEtleVBhcmFtZXRlcigiSFRfQkFEZWNsaW5lIiwgcFZhbHVlU3RyLCAyNSwgcElucHV0KSkKKyAgICB7CisgICAgICAgIFZhbHVlID0gc2ltcGxlX3N0cnRvbChwVmFsdWVTdHIsIDAsIDEwKTsKKyAgICAgICAgaWYgKFZhbHVlID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLmJCQURlY2xpbmUgPSBGQUxTRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLmJCQURlY2xpbmUgPSBUUlVFOworICAgICAgICB9CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkhUOiBCQSBEZWNsaW5lICA9ICVzXG4iLCAoVmFsdWU9PTApID8gIkRpc2FibGUiIDogIkVuYWJsZSIpKTsKKyAgICB9CisKKworICAgIGlmIChSVE1QR2V0S2V5UGFyYW1ldGVyKCJIVF9EaXNhYmxlUmVvcmRlcmluZyIsIHBWYWx1ZVN0ciwgMjUsIHBJbnB1dCkpCisgICAgeworICAgICAgICBWYWx1ZSA9IHNpbXBsZV9zdHJ0b2wocFZhbHVlU3RyLCAwLCAxMCk7CisgICAgICAgIGlmIChWYWx1ZSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5iRGlzYWJsZVJlb3JkZXJpbmcgPSBGQUxTRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLmJEaXNhYmxlUmVvcmRlcmluZyA9IFRSVUU7CisgICAgICAgIH0KKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSFQ6IERpc2FibGVSZW9yZGVyaW5nICA9ICVzXG4iLCAoVmFsdWU9PTApID8gIkRpc2FibGUiIDogIkVuYWJsZSIpKTsKKyAgICB9CisKKyAgICBpZiAoUlRNUEdldEtleVBhcmFtZXRlcigiSFRfQXV0b0JBIiwgcFZhbHVlU3RyLCAyNSwgcElucHV0KSkKKyAgICB7CisgICAgICAgIFZhbHVlID0gc2ltcGxlX3N0cnRvbChwVmFsdWVTdHIsIDAsIDEwKTsKKyAgICAgICAgaWYgKFZhbHVlID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BdXRvQkEgPSBGQUxTRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BdXRvQkEgPSBUUlVFOworICAgICAgICB9CisgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLlJFR0JBQ2FwYWJpbGl0eS5maWVsZC5BdXRvQkEgPSBwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQXV0b0JBOworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJIVDogQXV0byBCQSAgPSAlc1xuIiwgKFZhbHVlPT0wKSA/ICJEaXNhYmxlIiA6ICJFbmFibGUiKSk7CisgICAgfQorCisJLy8gVHhfK0hUQyBmcmFtZQorICAgIGlmIChSVE1QR2V0S2V5UGFyYW1ldGVyKCJIVF9IVEMiLCBwVmFsdWVTdHIsIDI1LCBwSW5wdXQpKQorCXsKKwkJVmFsdWUgPSBzaW1wbGVfc3RydG9sKHBWYWx1ZVN0ciwgMCwgMTApOworCQlpZiAoVmFsdWUgPT0gMCkKKwkJeworCQkJcEFkLT5IVENFbmFibGUgPSBGQUxTRTsKKwkJfQorCQllbHNlCisJCXsKKyAgICAgICAgICAgIAkJcEFkLT5IVENFbmFibGUgPSBUUlVFOworCQl9CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkhUOiBUeCArSFRDIGZyYW1lID0gJXNcbiIsIChWYWx1ZT09MCkgPyAiRGlzYWJsZSIgOiAiRW5hYmxlIikpOworCX0KKworCS8vIEVuYWJsZSBIVCBMaW5rIEFkYXB0YXRpb24gQ29udHJvbAorCWlmIChSVE1QR2V0S2V5UGFyYW1ldGVyKCJIVF9MaW5rQWRhcHQiLCBwVmFsdWVTdHIsIDI1LCBwSW5wdXQpKQorCXsKKwkJVmFsdWUgPSBzaW1wbGVfc3RydG9sKHBWYWx1ZVN0ciwgMCwgMTApOworCQlpZiAoVmFsdWUgPT0gMCkKKwkJeworCQkJcEFkLT5iTGlua0FkYXB0ID0gRkFMU0U7CisJCX0KKwkJZWxzZQorCQl7CisJCQlwQWQtPkhUQ0VuYWJsZSA9IFRSVUU7CisJCQlwQWQtPmJMaW5rQWRhcHQgPSBUUlVFOworCQl9CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkhUOiBMaW5rIEFkYXB0YXRpb24gQ29udHJvbCA9ICVzXG4iLCAoVmFsdWU9PTApID8gIkRpc2FibGUiIDogIkVuYWJsZSgrSFRDKSIpKTsKKwl9CisKKwkvLyBSZXZlcnNlIERpcmVjdGlvbiBNZWNoYW5pc20KKyAgICBpZiAoUlRNUEdldEtleVBhcmFtZXRlcigiSFRfUkRHIiwgcFZhbHVlU3RyLCAyNSwgcElucHV0KSkKKwl7CisJCVZhbHVlID0gc2ltcGxlX3N0cnRvbChwVmFsdWVTdHIsIDAsIDEwKTsKKwkJaWYgKFZhbHVlID09IDApCisJCXsKKwkJCXBBZC0+Q29tbW9uQ2ZnLmJSZGcgPSBGQUxTRTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXBBZC0+SFRDRW5hYmxlID0gVFJVRTsKKyAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLmJSZGcgPSBUUlVFOworCQl9CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkhUOiBSREcgPSAlc1xuIiwgKFZhbHVlPT0wKSA/ICJEaXNhYmxlIiA6ICJFbmFibGUoK0hUQykiKSk7CisJfQorCisKKworCisJLy8gVHggQS1NU1VEID8KKyAgICBpZiAoUlRNUEdldEtleVBhcmFtZXRlcigiSFRfQU1TRFUiLCBwVmFsdWVTdHIsIDI1LCBwSW5wdXQpKQorCXsKKwkJVmFsdWUgPSBzaW1wbGVfc3RydG9sKHBWYWx1ZVN0ciwgMCwgMTApOworCQlpZiAoVmFsdWUgPT0gMCkKKwkJeworCQkJcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkFtc2R1RW5hYmxlID0gRkFMU0U7CisJCX0KKwkJZWxzZQorCQl7CisgICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQW1zZHVFbmFibGUgPSBUUlVFOworCQl9CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkhUOiBUeCBBLU1TRFUgPSAlc1xuIiwgKFZhbHVlPT0wKSA/ICJEaXNhYmxlIiA6ICJFbmFibGUiKSk7CisJfQorCisJLy8gTVBEVSBEZW5zaXR5CisgICAgaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkhUX01wZHVEZW5zaXR5IiwgcFZhbHVlU3RyLCAyNSwgcElucHV0KSkKKwl7CisJCVZhbHVlID0gc2ltcGxlX3N0cnRvbChwVmFsdWVTdHIsIDAsIDEwKTsKKwkJaWYgKFZhbHVlIDw9NyAmJiBWYWx1ZSA+PSAwKQorCQl7CisJCQlwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTXBkdURlbnNpdHkgPSBWYWx1ZTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkhUOiBNUERVIERlbnNpdHkgPSAlZFxuIiwgVmFsdWUpKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5NcGR1RGVuc2l0eSA9IDQ7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJIVDogTVBEVSBEZW5zaXR5ID0gJWQgKERlZmF1bHQpXG4iLCA0KSk7CisJCX0KKwl9CisKKwkvLyBNYXggUnggQkEgV2luZG93IFNpemUKKyAgICBpZiAoUlRNUEdldEtleVBhcmFtZXRlcigiSFRfQkFXaW5TaXplIiwgcFZhbHVlU3RyLCAyNSwgcElucHV0KSkKKwl7CisJCVZhbHVlID0gc2ltcGxlX3N0cnRvbChwVmFsdWVTdHIsIDAsIDEwKTsKKworCQlpZiAoVmFsdWUgPj0xICYmIFZhbHVlIDw9IDY0KQorCQl7CisJCQlwQWQtPkNvbW1vbkNmZy5SRUdCQUNhcGFiaWxpdHkuZmllbGQuUnhCQVdpbkxpbWl0ID0gVmFsdWU7CisJCQlwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuUnhCQVdpbkxpbWl0ID0gVmFsdWU7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJIVDogQkEgV2luZHcgU2l6ZSA9ICVkXG4iLCBWYWx1ZSkpOworCQl9CisJCWVsc2UKKwkJeworICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuUkVHQkFDYXBhYmlsaXR5LmZpZWxkLlJ4QkFXaW5MaW1pdCA9IDY0OworCQkJcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlJ4QkFXaW5MaW1pdCA9IDY0OworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSFQ6IEJBIFdpbmR3IFNpemUgPSA2NCAoRGVmdWFsdClcbiIpKTsKKwkJfQorCisJfQorCisJLy8gR3VhcmQgSW50ZXJ2YWwKKwlpZiAoUlRNUEdldEtleVBhcmFtZXRlcigiSFRfR0kiLCBwVmFsdWVTdHIsIDI1LCBwSW5wdXQpKQorCXsKKwkJVmFsdWUgPSBzaW1wbGVfc3RydG9sKHBWYWx1ZVN0ciwgMCwgMTApOworCisJCWlmIChWYWx1ZSA9PSBHSV80MDApCisJCXsKKwkJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5TaG9ydEdJID0gR0lfNDAwOworCQl9CisJCWVsc2UKKwkJeworCQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLlNob3J0R0kgPSBHSV84MDA7CisJCX0KKworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJIVDogR3VhcmQgSW50ZXJ2YWwgPSAlc1xuIiwgKFZhbHVlPT1HSV80MDApID8gIjQwMCIgOiAiODAwIiApKTsKKwl9CisKKwkvLyBIVCBPcGVyYXRpb24gTW9kZSA6IE1peGVkIE1vZGUgLCBHcmVlbiBGaWVsZAorCWlmIChSVE1QR2V0S2V5UGFyYW1ldGVyKCJIVF9PcE1vZGUiLCBwVmFsdWVTdHIsIDI1LCBwSW5wdXQpKQorCXsKKwkJVmFsdWUgPSBzaW1wbGVfc3RydG9sKHBWYWx1ZVN0ciwgMCwgMTApOworCisJCWlmIChWYWx1ZSA9PSBIVE1PREVfR0YpCisJCXsKKworCQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkhUTU9ERSAgPSBIVE1PREVfR0Y7CisJCX0KKwkJZWxzZQorCQl7CisJCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuSFRNT0RFICA9IEhUTU9ERV9NTTsKKwkJfQorCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkhUOiBPcGVyYXRlIE1vZGUgPSAlc1xuIiwgKFZhbHVlPT1IVE1PREVfR0YpID8gIkdyZWVuIEZpZWxkIiA6ICJNaXhlZCBNb2RlIiApKTsKKwl9CisKKwkvLyBGaXhlZCBUeCBtb2RlIDogQ0NLLCBPRkRNCisJaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkZpeGVkVHhNb2RlIiwgcFZhbHVlU3RyLCAyNSwgcElucHV0KSkKKwl7CisJCVVDSEFSCWZpeF90eF9tb2RlOworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCXsKKwkJCWZpeF90eF9tb2RlID0gRklYRURfVFhNT0RFX0hUOworCisJCQlpZiAoc3RyY21wKHBWYWx1ZVN0ciwgIk9GRE0iKSA9PSAwIHx8IHN0cmNtcChwVmFsdWVTdHIsICJvZmRtIikgPT0gMCkKKwkJCXsKKwkJCQlmaXhfdHhfbW9kZSA9IEZJWEVEX1RYTU9ERV9PRkRNOworCQkJfQorCQkJZWxzZSBpZiAoc3RyY21wKHBWYWx1ZVN0ciwgIkNDSyIpID09IDAgfHwgc3RyY21wKHBWYWx1ZVN0ciwgImNjayIpID09IDApCisJCQl7CisJCSAgICAgICAgZml4X3R4X21vZGUgPSBGSVhFRF9UWE1PREVfQ0NLOworCQkJfQorCQkJZWxzZSBpZiAoc3RyY21wKHBWYWx1ZVN0ciwgIkhUIikgPT0gMCB8fCBzdHJjbXAocFZhbHVlU3RyLCAiaHQiKSA9PSAwKQorCQkJeworCQkgICAgICAgIGZpeF90eF9tb2RlID0gRklYRURfVFhNT0RFX0hUOworCQl9CisJCWVsc2UKKwkJeworCQkJCVZhbHVlID0gc2ltcGxlX3N0cnRvbChwVmFsdWVTdHIsIDAsIDEwKTsKKwkJCQkvLyAxIDogQ0NLCisJCQkJLy8gMiA6IE9GRE0KKwkJCQkvLyBvdGhlcndpc2UgOiBIVAorCQkJCWlmIChWYWx1ZSA9PSBGSVhFRF9UWE1PREVfQ0NLIHx8IFZhbHVlID09IEZJWEVEX1RYTU9ERV9PRkRNKQorCQkJCQlmaXhfdHhfbW9kZSA9IFZhbHVlOworCQkJCWVsc2UKKwkJCQkJZml4X3R4X21vZGUgPSBGSVhFRF9UWE1PREVfSFQ7CisJCX0KKworCQkJcEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5GaXhlZFR4TW9kZSA9IGZpeF90eF9tb2RlOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiRml4ZWQgVHggTW9kZSA9ICVkXG4iLCBmaXhfdHhfbW9kZSkpOworCisJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwl9CisKKworCS8vIENoYW5uZWwgV2lkdGgKKwlpZiAoUlRNUEdldEtleVBhcmFtZXRlcigiSFRfQlciLCBwVmFsdWVTdHIsIDI1LCBwSW5wdXQpKQorCXsKKwkJVmFsdWUgPSBzaW1wbGVfc3RydG9sKHBWYWx1ZVN0ciwgMCwgMTApOworCisJCWlmIChWYWx1ZSA9PSBCV180MCkKKwkJeworCQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXICA9IEJXXzQwOworCQl9CisJCWVsc2UKKwkJeworICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXICA9IEJXXzIwOworCQl9CisKKyNpZmRlZiBNQ0FTVF9SQVRFX1NQRUNJRklDCisJCXBBZC0+Q29tbW9uQ2ZnLk1DYXN0UGh5TW9kZS5maWVsZC5CVyA9IHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5CVzsKKyNlbmRpZiAvLyBNQ0FTVF9SQVRFX1NQRUNJRklDIC8vCisKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSFQ6IENoYW5uZWwgV2lkdGggPSAlc1xuIiwgKFZhbHVlPT1CV180MCkgPyAiNDAgTUh6IiA6ICIyMCBNSHoiICkpOworCX0KKworCWlmIChSVE1QR2V0S2V5UGFyYW1ldGVyKCJIVF9FWFRDSEEiLCBwVmFsdWVTdHIsIDI1LCBwSW5wdXQpKQorCXsKKwkJVmFsdWUgPSBzaW1wbGVfc3RydG9sKHBWYWx1ZVN0ciwgMCwgMTApOworCisJCWlmIChWYWx1ZSA9PSAwKQorCQl7CisKKwkJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5FWFRDSEEgID0gRVhUQ0hBX0JFTE9XOworCQl9CisJCWVsc2UKKwkJeworICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkVYVENIQSA9IEVYVENIQV9BQk9WRTsKKwkJfQorCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkhUOiBFeHQgQ2hhbm5lbCA9ICVzXG4iLCAoVmFsdWU9PTApID8gIkJFTE9XIiA6ICJBQk9WRSIgKSk7CisJfQorCisJLy8gTVNDCisJaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkhUX01DUyIsIHBWYWx1ZVN0ciwgNTAsIHBJbnB1dCkpCisJeworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCXsKKwkJCVZhbHVlID0gc2ltcGxlX3N0cnRvbChwVmFsdWVTdHIsIDAsIDEwKTsKKworCQkJaWYgKChWYWx1ZSA+PSAwICYmIFZhbHVlIDw9IDIzKSB8fCAoVmFsdWUgPT0gMzIpKSAvLyAzKjMKKwkJeworCQkJCXBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTICA9IFZhbHVlOworCQkJCXBBZC0+U3RhQ2ZnLmJBdXRvVHhSYXRlU3dpdGNoID0gRkFMU0U7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSFQ6IE1DUyA9ICVkXG4iLCBwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUykpOworCQl9CisJCWVsc2UKKwkJeworCQkJCXBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTICA9IE1DU19BVVRPOworCQkJCXBBZC0+U3RhQ2ZnLmJBdXRvVHhSYXRlU3dpdGNoID0gVFJVRTsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJIVDogTUNTID0gQVVUT1xuIikpOworCQl9CisJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCX0KKworCS8vIFNUQkMKKyAgICBpZiAoUlRNUEdldEtleVBhcmFtZXRlcigiSFRfU1RCQyIsIHBWYWx1ZVN0ciwgMjUsIHBJbnB1dCkpCisJeworCQlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2wocFZhbHVlU3RyLCAwLCAxMCk7CisJCWlmIChWYWx1ZSA9PSBTVEJDX1VTRSkKKwkJeworCQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLlNUQkMgPSBTVEJDX1VTRTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5TVEJDID0gU1RCQ19OT05FOworCQl9CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkhUOiBTVEJDID0gJWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5TVEJDKSk7CisJfQorCisJLy8gNDBfTWh6X0ludG9sZXJhbnQKKwlpZiAoUlRNUEdldEtleVBhcmFtZXRlcigiSFRfNDBNSFpfSU5UT0xFUkFOVCIsIHBWYWx1ZVN0ciwgMjUsIHBJbnB1dCkpCisJeworCQlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2wocFZhbHVlU3RyLCAwLCAxMCk7CisJCWlmIChWYWx1ZSA9PSAwKQorCQl7CisJCQlwQWQtPkNvbW1vbkNmZy5iRm9ydHlfTWh6X0ludG9sZXJhbnQgPSBGQUxTRTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXBBZC0+Q29tbW9uQ2ZnLmJGb3J0eV9NaHpfSW50b2xlcmFudCA9IFRSVUU7CisJCX0KKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSFQ6IDQwTUhaIElOVE9MRVJBTlQgPSAlZFxuIiwgcEFkLT5Db21tb25DZmcuYkZvcnR5X01oel9JbnRvbGVyYW50KSk7CisJfQorCS8vSFRfVHhTdHJlYW0KKwlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJIVF9UeFN0cmVhbSIsIHBWYWx1ZVN0ciwgMTAsIHBJbnB1dCkpCisJeworCQlzd2l0Y2ggKHNpbXBsZV9zdHJ0b2wocFZhbHVlU3RyLCAwLCAxMCkpCisJCXsKKwkJCWNhc2UgMToKKwkJCQlwQWQtPkNvbW1vbkNmZy5UeFN0cmVhbSA9IDE7CisJCQkJYnJlYWs7CisJCQljYXNlIDI6CisJCQkJcEFkLT5Db21tb25DZmcuVHhTdHJlYW0gPSAyOworCQkJCWJyZWFrOworCQkJY2FzZSAzOiAvLyAzKjMKKwkJCWRlZmF1bHQ6CisJCQkJcEFkLT5Db21tb25DZmcuVHhTdHJlYW0gPSAzOworCisJCQkJaWYgKHBBZC0+TUFDVmVyc2lvbiA8IFJBTElOS18yODgzX1ZFUlNJT04pCisJCQkJCXBBZC0+Q29tbW9uQ2ZnLlR4U3RyZWFtID0gMjsgLy8gb25seSAyIHR4IHN0cmVhbXMgZm9yIFJUMjg2MCBzZXJpZXMKKwkJCQlicmVhazsKKwkJfQorCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJIVDogVHggU3RyZWFtID0gJWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLlR4U3RyZWFtKSk7CisJfQorCS8vSFRfUnhTdHJlYW0KKwlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJIVF9SeFN0cmVhbSIsIHBWYWx1ZVN0ciwgMTAsIHBJbnB1dCkpCisJeworCQlzd2l0Y2ggKHNpbXBsZV9zdHJ0b2wocFZhbHVlU3RyLCAwLCAxMCkpCisJCXsKKwkJCWNhc2UgMToKKwkJCQlwQWQtPkNvbW1vbkNmZy5SeFN0cmVhbSA9IDE7CisJCQkJYnJlYWs7CisJCQljYXNlIDI6CisJCQkJcEFkLT5Db21tb25DZmcuUnhTdHJlYW0gPSAyOworCQkJCWJyZWFrOworCQkJY2FzZSAzOgorCQkJZGVmYXVsdDoKKwkJCQlwQWQtPkNvbW1vbkNmZy5SeFN0cmVhbSA9IDM7CisKKwkJCQlpZiAocEFkLT5NQUNWZXJzaW9uIDwgUkFMSU5LXzI4ODNfVkVSU0lPTikKKwkJCQkJcEFkLT5Db21tb25DZmcuUnhTdHJlYW0gPSAyOyAvLyBvbmx5IDIgcnggc3RyZWFtcyBmb3IgUlQyODYwIHNlcmllcworCQkJCWJyZWFrOworCQl9CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkhUOiBSeCBTdHJlYW0gPSAlZFxuIiwgcEFkLT5Db21tb25DZmcuUnhTdHJlYW0pKTsKKwl9CisKK30KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydG1wLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0bXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTE5NTQyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydG1wLmgKQEAgLTAsMCArMSw3MTc3IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgIE1vZHVsZSBOYW1lOgorICAgIHJ0bXAuaAorCisgICAgQWJzdHJhY3Q6CisgICAgTWluaXBvcnQgZ2VuZXJpYyBwb3J0aW9uIGhlYWRlciBmaWxlCisKKyAgICBSZXZpc2lvbiBIaXN0b3J5OgorICAgIFdobyAgICAgICAgIFdoZW4gICAgICAgICAgV2hhdAorICAgIC0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFBhdWwgTGluICAgIDIwMDItMDgtMDEgICAgY3JlYXRlZAorICAgIEphbWVzIFRhbiAgIDIwMDItMDktMDYgICAgbW9kaWZpZWQgKFJldmlzZSBOVENSZWdUYWJsZSkKKyAgICBKb2huIENoYW5nICAyMDA0LTA5LTA2ICAgIG1vZGlmaWVkIGZvciBSVDI2MDAKKyovCisjaWZuZGVmIF9fUlRNUF9IX18KKyNkZWZpbmUgX19SVE1QX0hfXworCisjaW5jbHVkZSAibGlua19saXN0LmgiCisjaW5jbHVkZSAic3BlY3RydW1fZGVmLmgiCisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorI2luY2x1ZGUgImFpcm9uZXQuaCIKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworLy8jZGVmaW5lIERCR19ESUFHTk9TRQkJMQorCisjaWYgZGVmaW5lZChDT05GSUdfQVBfU1VQUE9SVCkgJiYgZGVmaW5lZChDT05GSUdfU1RBX1NVUFBPUlQpCisjZGVmaW5lIElGX0RFVl9DT05GSUdfT1BNT0RFX09OX0FQKF9wQWQpCWlmKF9wQWQtPk9wTW9kZSA9PSBPUE1PREVfQVApCisjZGVmaW5lIElGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShfcEFkKQlpZihfcEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkKKyNlbHNlCisjZGVmaW5lIElGX0RFVl9DT05GSUdfT1BNT0RFX09OX0FQKF9wQWQpCisjZGVmaW5lIElGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShfcEFkKQorI2VuZGlmCisKKyNkZWZpbmUgVklSVFVBTF9JRl9JTkMoX19wQWQpICgoX19wQWQpLT5WaXJ0dWFsSWZDbnQrKykKKyNkZWZpbmUgVklSVFVBTF9JRl9ERUMoX19wQWQpICgoX19wQWQpLT5WaXJ0dWFsSWZDbnQtLSkKKyNkZWZpbmUgVklSVFVBTF9JRl9OVU0oX19wQWQpICgoX19wQWQpLT5WaXJ0dWFsSWZDbnQpCisKKworCisvLworLy8gIE5ESVMgVmVyc2lvbiBkZWZpbml0aW9ucworLy8KKyNpZmRlZiAgTkRJUzUwX01JTklQT1JUCisjZGVmaW5lIFJUTVBfTkRJU19NQUpPUl9WRVJTSU9OICAgICA1CisjZGVmaW5lIFJUTVBfTkRJU19NSU5PUl9WRVJTSU9OICAgICAwCisjZW5kaWYKKworI2lmZGVmICBORElTNTFfTUlOSVBPUlQKKyNkZWZpbmUgUlRNUF9ORElTX01BSk9SX1ZFUlNJT04gICAgIDUKKyNkZWZpbmUgUlRNUF9ORElTX01JTk9SX1ZFUlNJT04gICAgIDEKKyNlbmRpZgorCitleHRlcm4gIGNoYXIgICAgTklDX1ZFTkRPUl9ERVNDW107CitleHRlcm4gIGludCAgICAgTklDX1ZFTkRPUl9ERVNDX0xFTjsKKworZXh0ZXJuICB1bnNpZ25lZCBjaGFyICAgU05BUF9BSVJPTkVUW107CitleHRlcm4gIHVuc2lnbmVkIGNoYXIgICBDaXBoZXJTdWl0ZUNpc2NvQ0NLTVtdOworZXh0ZXJuICB1bnNpZ25lZCBjaGFyICAgQ2lwaGVyU3VpdGVDaXNjb0NDS01MZW47CitleHRlcm4JdW5zaWduZWQgY2hhcglDaXBoZXJTdWl0ZUNpc2NvQ0NLTTI0W107CitleHRlcm4JdW5zaWduZWQgY2hhcglDaXBoZXJTdWl0ZUNpc2NvQ0NLTTI0TGVuOworZXh0ZXJuICB1bnNpZ25lZCBjaGFyICAgQ2lwaGVyU3VpdGVDQ1hUa2lwW107CitleHRlcm4gIHVuc2lnbmVkIGNoYXIgICBDaXBoZXJTdWl0ZUNDWFRraXBMZW47CitleHRlcm4gIHVuc2lnbmVkIGNoYXIgICBDSVNDT19PVUlbXTsKK2V4dGVybiAgVUNIQVIJQmFTaXplQXJyYXlbNF07CisKK2V4dGVybiBVQ0hBUiBCUk9BRENBU1RfQUREUltNQUNfQUREUl9MRU5dOworZXh0ZXJuIFVDSEFSIE1VTFRJQ0FTVF9BRERSW01BQ19BRERSX0xFTl07CitleHRlcm4gVUNIQVIgWkVST19NQUNfQUREUltNQUNfQUREUl9MRU5dOworZXh0ZXJuIFVMT05HIEJJVDMyWzMyXTsKK2V4dGVybiBVQ0hBUiBCSVQ4WzhdOworZXh0ZXJuIGNoYXIqIENpcGhlck5hbWVbXTsKK2V4dGVybiBjaGFyKiBNQ1NUb01icHNbXTsKK2V4dGVybiBVQ0hBUgkgUnh3aU1DU1RvT2ZkbVJhdGVbMTJdOworZXh0ZXJuIFVDSEFSIFNOQVBfODAyXzFIWzZdOworZXh0ZXJuIFVDSEFSIFNOQVBfQlJJREdFX1RVTk5FTFs2XTsKK2V4dGVybiBVQ0hBUiBTTkFQX0FJUk9ORVRbOF07CitleHRlcm4gVUNIQVIgQ0tJUF9MTENfU05BUFs4XTsKK2V4dGVybiBVQ0hBUiBFQVBPTF9MTENfU05BUFs4XTsKK2V4dGVybiBVQ0hBUiBFQVBPTFsyXTsKK2V4dGVybiBVQ0hBUiBJUFhbMl07CitleHRlcm4gVUNIQVIgQVBQTEVfVEFMS1syXTsKK2V4dGVybiBVQ0hBUiBSYXRlSWRUb1BsY3BTaWduYWxbMTJdOyAvLyBzZWUgSUVFRTgwMi4xMWEtMTk5OSBwLjE0CitleHRlcm4gVUNIQVIJIE9mZG1SYXRlVG9SeHdpTUNTW107CitleHRlcm4gVUNIQVIgT2ZkbVNpZ25hbFRvUmF0ZUlkWzE2XSA7CitleHRlcm4gVUNIQVIgZGVmYXVsdF9jd21pbls0XTsKK2V4dGVybiBVQ0hBUiBkZWZhdWx0X2N3bWF4WzRdOworZXh0ZXJuIFVDSEFSIGRlZmF1bHRfc3RhX2FpZnNuWzRdOworZXh0ZXJuIFVDSEFSIE1hcFVzZXJQcmlvcml0eVRvQWNjZXNzQ2F0ZWdvcnlbOF07CisKK2V4dGVybiBVU0hPUlQgUmF0ZVVwUEVSW107CitleHRlcm4gVVNIT1JUIFJhdGVEb3duUEVSW107CitleHRlcm4gVUNIQVIgIFBoeTExQk5leHRSYXRlRG93bndhcmRbXTsKK2V4dGVybiBVQ0hBUiAgUGh5MTFCTmV4dFJhdGVVcHdhcmRbXTsKK2V4dGVybiBVQ0hBUiAgUGh5MTFCR05leHRSYXRlRG93bndhcmRbXTsKK2V4dGVybiBVQ0hBUiAgUGh5MTFCR05leHRSYXRlVXB3YXJkW107CitleHRlcm4gVUNIQVIgIFBoeTExQU5leHRSYXRlRG93bndhcmRbXTsKK2V4dGVybiBVQ0hBUiAgUGh5MTFBTmV4dFJhdGVVcHdhcmRbXTsKK2V4dGVybiBDSEFSICAgUnNzaVNhZmVMZXZlbEZvclR4UmF0ZVtdOworZXh0ZXJuIFVDSEFSICBSYXRlSWRUb01icHNbXTsKK2V4dGVybiBVU0hPUlQgUmF0ZUlkVG81MDBLYnBzW107CisKK2V4dGVybiBVQ0hBUiAgQ2lwaGVyU3VpdGVXcGFOb25lVGtpcFtdOworZXh0ZXJuIFVDSEFSICBDaXBoZXJTdWl0ZVdwYU5vbmVUa2lwTGVuOworCitleHRlcm4gVUNIQVIgIENpcGhlclN1aXRlV3BhTm9uZUFlc1tdOworZXh0ZXJuIFVDSEFSICBDaXBoZXJTdWl0ZVdwYU5vbmVBZXNMZW47CisKK2V4dGVybiBVQ0hBUiAgU3NpZEllOworZXh0ZXJuIFVDSEFSICBTdXBSYXRlSWU7CitleHRlcm4gVUNIQVIgIEV4dFJhdGVJZTsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorZXh0ZXJuIFVDSEFSICBIdENhcEllOworZXh0ZXJuIFVDSEFSICBBZGRIdEluZm9JZTsKK2V4dGVybiBVQ0hBUiAgTmV3RXh0Q2hhbkllOworI2lmZGVmIERPVDExTl9EUkFGVDMKK2V4dGVybiBVQ0hBUiAgRXh0SHRDYXBJZTsKKyNlbmRpZiAvLyBET1QxMU5fRFJBRlQzIC8vCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKK2V4dGVybiBVQ0hBUiAgRXJwSWU7CitleHRlcm4gVUNIQVIgIERzSWU7CitleHRlcm4gVUNIQVIgIFRpbUllOworZXh0ZXJuIFVDSEFSICBXcGFJZTsKK2V4dGVybiBVQ0hBUiAgV3BhMkllOworZXh0ZXJuIFVDSEFSICBJYnNzSWU7CitleHRlcm4gVUNIQVIgIENjeDJJZTsKKworZXh0ZXJuIFVDSEFSICBXUEFfT1VJW107CitleHRlcm4gVUNIQVIgIFJTTl9PVUlbXTsKK2V4dGVybiBVQ0hBUiAgV01FX0lORk9fRUxFTVtdOworZXh0ZXJuIFVDSEFSICBXTUVfUEFSTV9FTEVNW107CitleHRlcm4gVUNIQVIgIENjeDJRb3NJbmZvW107CitleHRlcm4gVUNIQVIgIENjeDJJZUluZm9bXTsKK2V4dGVybiBVQ0hBUiAgUkFMSU5LX09VSVtdOworZXh0ZXJuIFVDSEFSICBQb3dlckNvbnN0cmFpbnRJRVtdOworCisKK2V4dGVybiBVQ0hBUiAgUmF0ZVN3aXRjaFRhYmxlW107CitleHRlcm4gVUNIQVIgIFJhdGVTd2l0Y2hUYWJsZTExQltdOworZXh0ZXJuIFVDSEFSICBSYXRlU3dpdGNoVGFibGUxMUdbXTsKK2V4dGVybiBVQ0hBUiAgUmF0ZVN3aXRjaFRhYmxlMTFCR1tdOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCitleHRlcm4gVUNIQVIgIFJhdGVTd2l0Y2hUYWJsZTExQkdOMVNbXTsKK2V4dGVybiBVQ0hBUiAgUmF0ZVN3aXRjaFRhYmxlMTFCR04yU1tdOworZXh0ZXJuIFVDSEFSICBSYXRlU3dpdGNoVGFibGUxMUJHTjJTRm9yQUJhbmRbXTsKK2V4dGVybiBVQ0hBUiAgUmF0ZVN3aXRjaFRhYmxlMTFOMVNbXTsKK2V4dGVybiBVQ0hBUiAgUmF0ZVN3aXRjaFRhYmxlMTFOMlNbXTsKK2V4dGVybiBVQ0hBUiAgUmF0ZVN3aXRjaFRhYmxlMTFOMlNGb3JBQmFuZFtdOworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCitleHRlcm4gVUNIQVIgIFBSRV9OX0hUX09VSVtdOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisjZGVmaW5lCU1BWFNFUQkJKDB4RkZGKQorCisjaWZkZWYgUkFMSU5LX0FURQordHlwZWRlZglzdHJ1Y3QgX0FURV9JTkZPIHsKKwlVQ0hBUglNb2RlOworCUNIQVIJVHhQb3dlcjA7CisJQ0hBUglUeFBvd2VyMTsKKwlDSEFSICAgIFR4QW50ZW5uYVNlbDsKKwlDSEFSICAgIFJ4QW50ZW5uYVNlbDsKKwlUWFdJX1NUUlVDICBUeFdJOyAJICAvLyBUWFdJCisJVVNIT1JUCVFJRDsKKwlVQ0hBUglBZGRyMVtNQUNfQUREUl9MRU5dOworCVVDSEFSCUFkZHIyW01BQ19BRERSX0xFTl07CisJVUNIQVIJQWRkcjNbTUFDX0FERFJfTEVOXTsKKwlVQ0hBUglDaGFubmVsOworCVVJTlQzMglUeExlbmd0aDsKKwlVSU5UMzIJVHhDb3VudDsKKwlVSU5UMzIJVHhEb25lQ291bnQ7IC8vIFR4IERNQSBEb25lCisJVUlOVDMyCVJGRnJlcU9mZnNldDsKKwlCT09MRUFOCWJSeEZlcjsKKwlCT09MRUFOCWJRQVR4U3RhcnQ7IC8vIEhhdmUgY29tcGlsZWQgUUEgaW4gYW5kIHVzZSBpdCB0byBBVEUgdHguCisJQk9PTEVBTgliUUFSeFN0YXJ0OwkvLyBIYXZlIGNvbXBpbGVkIFFBIGluIGFuZCB1c2UgaXQgdG8gQVRFIHJ4LgorI2lmZGVmIFJUMjg2MAorCUJPT0xFQU4JYkZXTG9hZGluZzsJLy8gUmVsb2FkIGZpcm13YXJlIHdoZW4gQVRFIGlzIGRvbmUuCisjZW5kaWYgLy8gUlQyODYwIC8vCisJVUlOVDMyCVJ4VG90YWxDbnQ7CisJVUlOVDMyCVJ4Q250UGVyU2VjOworCisJQ0hBUglMYXN0U05SMDsgICAgICAgICAgICAgLy8gbGFzdCByZWNlaXZlZCBTTlIKKwlDSEFSICAgIExhc3RTTlIxOyAgICAgICAgICAgICAvLyBsYXN0IHJlY2VpdmVkIFNOUiBmb3IgMm5kICBhbnRlbm5hCisJQ0hBUiAgICBMYXN0UnNzaTA7ICAgICAgICAgICAgLy8gbGFzdCByZWNlaXZlZCBSU1NJCisJQ0hBUiAgICBMYXN0UnNzaTE7ICAgICAgICAgICAgLy8gbGFzdCByZWNlaXZlZCBSU1NJIGZvciAybmQgIGFudGVubmEKKwlDSEFSICAgIExhc3RSc3NpMjsgICAgICAgICAgICAvLyBsYXN0IHJlY2VpdmVkIFJTU0kgZm9yIDNyZCAgYW50ZW5uYQorCUNIQVIgICAgQXZnUnNzaTA7ICAgICAgICAgICAgIC8vIGxhc3QgOCBmcmFtZXMnIGF2ZXJhZ2UgUlNTSQorCUNIQVIgICAgQXZnUnNzaTE7ICAgICAgICAgICAgIC8vIGxhc3QgOCBmcmFtZXMnIGF2ZXJhZ2UgUlNTSQorCUNIQVIgICAgQXZnUnNzaTI7ICAgICAgICAgICAgIC8vIGxhc3QgOCBmcmFtZXMnIGF2ZXJhZ2UgUlNTSQorCVNIT1JUICAgQXZnUnNzaTBYODsgICAgICAgICAgIC8vIHN1bSBvZiBsYXN0IDggZnJhbWVzJyBSU1NJCisJU0hPUlQgICBBdmdSc3NpMVg4OyAgICAgICAgICAgLy8gc3VtIG9mIGxhc3QgOCBmcmFtZXMnIFJTU0kKKwlTSE9SVCAgIEF2Z1Jzc2kyWDg7ICAgICAgICAgICAvLyBzdW0gb2YgbGFzdCA4IGZyYW1lcycgUlNTSQorCisJVUlOVDMyCU51bU9mQXZnUnNzaVNhbXBsZTsKKworI2lmZGVmIFJBTElOS18yOHh4X1FBCisJLy8gVHggZnJhbWUKKwlVU0hPUlQJCUhMZW47IC8vIEhlYWRlciBMZW5ndGgKKwlVU0hPUlQJCVBMZW47IC8vIFBhdHRlcm4gTGVuZ3RoCisJVUNIQVIgCQlIZWFkZXJbMzJdOyAvLyBIZWFkZXIgYnVmZmVyCisJVUNIQVIJCVBhdHRlcm5bMzJdOyAvLyBQYXR0ZXJuIGJ1ZmZlcgorCVVTSE9SVAkJRExlbjsgLy8gRGF0YSBMZW5ndGgKKwlVU0hPUlQJCXNlcTsKKwlVSU5UMzIJCUNJRDsKKwlUSFJFQURfUElEIAkJQXRlUGlkOworCS8vIGNvdW50ZXJzCisJVUlOVDMyCQlVMk07CisJVUlOVDMyCQlPdGhlckRhdGE7CisJVUlOVDMyCQlCZWFjb247CisJVUlOVDMyCQlPdGhlckNvdW50OworCVVJTlQzMgkJVHhBYzA7CisJVUlOVDMyCQlUeEFjMTsKKwlVSU5UMzIJCVR4QWMyOworCVVJTlQzMgkJVHhBYzM7CisJVUlOVDMyCQlUeEhDQ0E7CisJVUlOVDMyCQlUeE1nbXQ7CisJVUlOVDMyCQlSU1NJMDsKKwlVSU5UMzIJCVJTU0kxOworCVVJTlQzMgkJUlNTSTI7CisJVUlOVDMyCQlTTlIwOworCVVJTlQzMgkJU05SMTsKKwkvLyBjb250cm9sCisJLy9VSU5UMzIJCVJlcGVhdDsgLy8gVHggQ3B1IGNvdW50CisJVUNIQVIJCVR4U3RhdHVzOyAvLyB0YXNrIFR4IHN0YXR1cyAvLyAwIC0tPiB0YXNrIGlzIGlkbGUsIDEgLS0+IHRhc2sgaXMgcnVubmluZworI2VuZGlmIC8vIFJBTElOS18yOHh4X1FBIC8vCit9CUFURV9JTkZPLCAqUEFURV9JTkZPOworCisjaWZkZWYgUkFMSU5LXzI4eHhfUUEKK3N0cnVjdCBhdGVfcmFjZmdoZHIgeworIAlVSU5UMzIJCW1hZ2ljX25vOworCVVTSE9SVAkJY29tbWFuZF90eXBlOworCVVTSE9SVAkJY29tbWFuZF9pZDsKKwlVU0hPUlQJCWxlbmd0aDsKKwlVU0hPUlQJCXNlcXVlbmNlOworCVVTSE9SVAkJc3RhdHVzOworCVVDSEFSCQlkYXRhWzIwNDZdOworfSAgX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisjZW5kaWYgLy8gUkFMSU5LXzI4eHhfUUEgLy8KKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKK3N0cnVjdCByZW9yZGVyaW5nX21wZHUKK3sKKwlzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1CSpuZXh0OworCVBORElTX1BBQ0tFVAkJCXBQYWNrZXQ7CQkvKiBjb3ZlcnRlZCB0byA4MDIuMyBmcmFtZSAqLworCWludAkJCQkJCVNlcXVlbmNlOwkJLyogc2VxdWVuY2UgbnVtYmVyIG9mIE1QRFUgKi8KKwlCT09MRUFOCQkJCQliQU1TRFU7Cit9OworCitzdHJ1Y3QgcmVvcmRlcmluZ19saXN0Cit7CisJc3RydWN0IHJlb3JkZXJpbmdfbXBkdSAqbmV4dDsKKwlpbnQgCXFsZW47Cit9OworCitzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1X3Bvb2wKK3sKKwlQVk9JRAkJCQkJbWVtOworCU5ESVNfU1BJTl9MT0NLCQkJbG9jazsKKwlzdHJ1Y3QgcmVvcmRlcmluZ19saXN0IAlmcmVlbGlzdDsKK307CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKK3R5cGVkZWYgc3RydWN0IAlfUlNTSV9TQU1QTEUgeworCUNIQVIJCQlMYXN0UnNzaTA7ICAgICAgICAgICAgIC8vIGxhc3QgcmVjZWl2ZWQgUlNTSQorCUNIQVIJCQlMYXN0UnNzaTE7ICAgICAgICAgICAgIC8vIGxhc3QgcmVjZWl2ZWQgUlNTSQorCUNIQVIJCQlMYXN0UnNzaTI7ICAgICAgICAgICAgIC8vIGxhc3QgcmVjZWl2ZWQgUlNTSQorCUNIQVIJCQlBdmdSc3NpMDsKKwlDSEFSCQkJQXZnUnNzaTE7CisJQ0hBUgkJCUF2Z1Jzc2kyOworCVNIT1JUCQkJQXZnUnNzaTBYODsKKwlTSE9SVAkJCUF2Z1Jzc2kxWDg7CisJU0hPUlQJCQlBdmdSc3NpMlg4OworfSBSU1NJX1NBTVBMRTsKKworLy8KKy8vICBRdWV1ZSBzdHJ1Y3R1cmUgYW5kIG1hY3JvcworLy8KK3R5cGVkZWYgc3RydWN0ICBfUVVFVUVfRU5UUlkgICAgeworCXN0cnVjdCBfUVVFVUVfRU5UUlkgICAgICpOZXh0OworfSAgIFFVRVVFX0VOVFJZLCAqUFFVRVVFX0VOVFJZOworCisvLyBRdWV1ZSBzdHJ1Y3R1cmUKK3R5cGVkZWYgc3RydWN0ICBfUVVFVUVfSEVBREVSICAgeworCVBRVUVVRV9FTlRSWSAgICBIZWFkOworCVBRVUVVRV9FTlRSWSAgICBUYWlsOworCVVMT05HICAgICAgICAgICBOdW1iZXI7Cit9ICAgUVVFVUVfSEVBREVSLCAqUFFVRVVFX0hFQURFUjsKKworI2RlZmluZSBJbml0aWFsaXplUXVldWVIZWFkZXIoUXVldWVIZWFkZXIpICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkoUXVldWVIZWFkZXIpLT5IZWFkID0gKFF1ZXVlSGVhZGVyKS0+VGFpbCA9IE5VTEw7ICAgXAorCShRdWV1ZUhlYWRlciktPk51bWJlciA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKyNkZWZpbmUgUmVtb3ZlSGVhZFF1ZXVlKFF1ZXVlSGVhZGVyKSAgICAgICAgICAgICAgICBcCisoUXVldWVIZWFkZXIpLT5IZWFkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlQUVVFVUVfRU5UUlkgcE5leHQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJaWYgKChRdWV1ZUhlYWRlciktPkhlYWQgIT0gTlVMTCkJCQkJXAorCXsJCQkJCQkJCQkJCQlcCisJCXBOZXh0ID0gKFF1ZXVlSGVhZGVyKS0+SGVhZC0+TmV4dDsgICAgICAgICAgXAorCQkoUXVldWVIZWFkZXIpLT5IZWFkID0gcE5leHQ7ICAgICAgICAgICAgICAgIFwKKwkJaWYgKHBOZXh0ID09IE5VTEwpICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCQkoUXVldWVIZWFkZXIpLT5UYWlsID0gTlVMTDsgICAgICAgICAgICAgXAorCQkoUXVldWVIZWFkZXIpLT5OdW1iZXItLTsgICAgICAgICAgICAgICAgICAgIFwKKwl9CQkJCQkJCQkJCQkJXAorfQorCisjZGVmaW5lIEluc2VydEhlYWRRdWV1ZShRdWV1ZUhlYWRlciwgUXVldWVFbnRyeSkgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCSgoUFFVRVVFX0VOVFJZKVF1ZXVlRW50cnkpLT5OZXh0ID0gKFF1ZXVlSGVhZGVyKS0+SGVhZDsgXAorCQkoUXVldWVIZWFkZXIpLT5IZWFkID0gKFBRVUVVRV9FTlRSWSkoUXVldWVFbnRyeSk7ICAgICAgIFwKKwkJaWYgKChRdWV1ZUhlYWRlciktPlRhaWwgPT0gTlVMTCkgICAgICAgICAgICAgICAgICAgICAgICBcCisJCQkoUXVldWVIZWFkZXIpLT5UYWlsID0gKFBRVUVVRV9FTlRSWSkoUXVldWVFbnRyeSk7ICAgXAorCQkoUXVldWVIZWFkZXIpLT5OdW1iZXIrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI2RlZmluZSBJbnNlcnRUYWlsUXVldWUoUXVldWVIZWFkZXIsIFF1ZXVlRW50cnkpICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJKChQUVVFVUVfRU5UUlkpUXVldWVFbnRyeSktPk5leHQgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgXAorCWlmICgoUXVldWVIZWFkZXIpLT5UYWlsKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJKFF1ZXVlSGVhZGVyKS0+VGFpbC0+TmV4dCA9IChQUVVFVUVfRU5UUlkpKFF1ZXVlRW50cnkpOyBcCisJZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkoUXVldWVIZWFkZXIpLT5IZWFkID0gKFBRVUVVRV9FTlRSWSkoUXVldWVFbnRyeSk7ICAgICAgIFwKKwkoUXVldWVIZWFkZXIpLT5UYWlsID0gKFBRVUVVRV9FTlRSWSkoUXVldWVFbnRyeSk7ICAgICAgICAgICBcCisJKFF1ZXVlSGVhZGVyKS0+TnVtYmVyKys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisvLworLy8gIE1hY3JvcyBmb3IgZmxhZyBhbmQgcmVmIGNvdW50IG9wZXJhdGlvbnMKKy8vCisjZGVmaW5lIFJUTVBfU0VUX0ZMQUcoX00sIF9GKSAgICAgICAoKF9NKS0+RmxhZ3MgfD0gKF9GKSkKKyNkZWZpbmUgUlRNUF9DTEVBUl9GTEFHKF9NLCBfRikgICAgICgoX00pLT5GbGFncyAmPSB+KF9GKSkKKyNkZWZpbmUgUlRNUF9DTEVBUl9GTEFHUyhfTSkgICAgICAgICgoX00pLT5GbGFncyA9IDApCisjZGVmaW5lIFJUTVBfVEVTVF9GTEFHKF9NLCBfRikgICAgICAoKChfTSktPkZsYWdzICYgKF9GKSkgIT0gMCkKKyNkZWZpbmUgUlRNUF9URVNUX0ZMQUdTKF9NLCBfRikgICAgICgoKF9NKS0+RmxhZ3MgJiAoX0YpKSA9PSAoX0YpKQorCisjZGVmaW5lIE9QU1RBVFVTX1NFVF9GTEFHKF9wQWQsIF9GKSAgICAgKChfcEFkKS0+Q29tbW9uQ2ZnLk9wU3RhdHVzRmxhZ3MgfD0gKF9GKSkKKyNkZWZpbmUgT1BTVEFUVVNfQ0xFQVJfRkxBRyhfcEFkLCBfRikgICAoKF9wQWQpLT5Db21tb25DZmcuT3BTdGF0dXNGbGFncyAmPSB+KF9GKSkKKyNkZWZpbmUgT1BTVEFUVVNfVEVTVF9GTEFHKF9wQWQsIF9GKSAgICAoKChfcEFkKS0+Q29tbW9uQ2ZnLk9wU3RhdHVzRmxhZ3MgJiAoX0YpKSAhPSAwKQorCisjZGVmaW5lIENMSUVOVF9TVEFUVVNfU0VUX0ZMQUcoX3BFbnRyeSxfRikgICAgICAoKF9wRW50cnkpLT5DbGllbnRTdGF0dXNGbGFncyB8PSAoX0YpKQorI2RlZmluZSBDTElFTlRfU1RBVFVTX0NMRUFSX0ZMQUcoX3BFbnRyeSxfRikgICAgKChfcEVudHJ5KS0+Q2xpZW50U3RhdHVzRmxhZ3MgJj0gfihfRikpCisjZGVmaW5lIENMSUVOVF9TVEFUVVNfVEVTVF9GTEFHKF9wRW50cnksX0YpICAgICAoKChfcEVudHJ5KS0+Q2xpZW50U3RhdHVzRmxhZ3MgJiAoX0YpKSAhPSAwKQorCisjZGVmaW5lIFJYX0ZJTFRFUl9TRVRfRkxBRyhfcEFkLCBfRikgICAgKChfcEFkKS0+Q29tbW9uQ2ZnLlBhY2tldEZpbHRlciB8PSAoX0YpKQorI2RlZmluZSBSWF9GSUxURVJfQ0xFQVJfRkxBRyhfcEFkLCBfRikgICgoX3BBZCktPkNvbW1vbkNmZy5QYWNrZXRGaWx0ZXIgJj0gfihfRikpCisjZGVmaW5lIFJYX0ZJTFRFUl9URVNUX0ZMQUcoX3BBZCwgX0YpICAgKCgoX3BBZCktPkNvbW1vbkNmZy5QYWNrZXRGaWx0ZXIgJiAoX0YpKSAhPSAwKQorCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisjZGVmaW5lIFNUQV9OT19TRUNVUklUWV9PTihfcCkgICAgICAgICAgKF9wLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uRGlzYWJsZWQpCisjZGVmaW5lIFNUQV9XRVBfT04oX3ApICAgICAgICAgICAgICAgICAgKF9wLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMUVuYWJsZWQpCisjZGVmaW5lIFNUQV9US0lQX09OKF9wKSAgICAgICAgICAgICAgICAgKF9wLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpCisjZGVmaW5lIFNUQV9BRVNfT04oX3ApICAgICAgICAgICAgICAgICAgKF9wLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCisKKyNkZWZpbmUgU1RBX1RHTl9XSUZJX09OKF9wKSAgICAgICAgICAgICAoX3AtPlN0YUNmZy5iVEduV2lmaVRlc3QgPT0gVFJVRSkKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworI2RlZmluZSBDS0lQX0tQX09OKF9wKQkJCQkoKCgoX3ApLT5TdGFDZmcuQ2tpcEZsYWcpICYgMHgxMCkgJiYgKChfcCktPlN0YUNmZy5iQ2tpcENtaWNPbiA9PSBUUlVFKSkKKyNkZWZpbmUgQ0tJUF9DTUlDX09OKF9wKQkJCSgoKChfcCktPlN0YUNmZy5Da2lwRmxhZykgJiAweDA4KSAmJiAoKF9wKS0+U3RhQ2ZnLmJDa2lwQ21pY09uID09IFRSVUUpKQorCisKKyNkZWZpbmUgSU5DX1JJTkdfSU5ERVgoX2lkeCwgX1JpbmdTaXplKSAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIChfaWR4KSA9IChfaWR4KzEpICUgKF9SaW5nU2l6ZSk7ICAgICAgIFwKK30KKworI2RlZmluZSBJU19SVDMwNzAoX3BBZCkJCQkJKCgoX3BBZCktPk1BQ1ZlcnNpb24gJiAweGZmZmYwMDAwKSA9PSAweDMwNzAwMDAwKQorCisjZGVmaW5lIFJJTkdfUEFDS0VUX0lOSVQoX1R4UmluZywgX2lkeCkgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfVHhSaW5nLT5DZWxsW19pZHhdLnBOZGlzUGFja2V0ID0gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX1R4UmluZy0+Q2VsbFtfaWR4XS5wTmV4dE5kaXNQYWNrZXQgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI2RlZmluZSBUWERUX0lOSVQoX1R4RCkgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlOZGlzWmVyb01lbW9yeShfVHhELCBUWERfU0laRSk7CVwKKwlfVHhELT5ETUFET05FID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKy8vU2V0IGxhc3QgZGF0YSBzZWdtZW50CisjZGVmaW5lIFJJTkdfU0VUX0xBU1REUyhfVHhELCBfSXNTRDApICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKF9Jc1NEMCkge19UeEQtPkxhc3RTZWMwID0gMTt9ICAgICBcCisgICAgZWxzZSB7X1R4RC0+TGFzdFNlYzEgPSAxO30gICAgIFwKK30KKworLy8gSW5jcmVhc2UgVHhUc2MgdmFsdWUgZm9yIG5leHQgdHJhbnNtaXNzaW9uCisvLyBUT0RPOgorLy8gV2hlbiBpPT02LCBtZWFucyBUU0MgaGFzIGRvbmUgb25lIGZ1bGwgY3ljbGUsIGRvIHJlLWtleWluZyBzdHVmZiBmb2xsb3cgc3BlY3MKKy8vIFNob3VsZCBzZW5kIGEgc3BlY2lhbCBldmVudCBtaWNyb3NvZnQgZGVmaW5lZCB0byByZXF1ZXN0IHJlLWtleQorI2RlZmluZSBJTkNfVFhfVFNDKF90c2MpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgaT0wOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHdoaWxlICgrK190c2NbaV0gPT0gMHgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaSsrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoaSA9PSA2KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisvLyBTdGFBY3RpdmUuU3VwcG9ydGVkSHRQaHkuTUNTU2V0IGlzIGNvcGllZCBmcm9tIEFQIGJlYWNvbi4gIERvbid0IG5lZWQgdG8gdXBkYXRlIGhlcmUuCisjZGVmaW5lIENPUFlfSFRTRVRUSU5HU19GUk9NX01MTUVfQVVYX1RPX0FDVElWRV9DRkcoX3BBZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCV9wQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRIdFBoeS5DaGFubmVsV2lkdGggPSBfcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQ2hhbm5lbFdpZHRoOyAgICAgIFwKKwlfcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkSHRQaHkuTWltb1BzID0gX3BBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLk1pbW9QczsgICAgICBcCisJX3BBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZEh0UGh5LkdGID0gX3BBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkdGOyAgICAgIFwKKwlfcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkSHRQaHkuU2hvcnRHSWZvcjIwID0gX3BBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLlNob3J0R0lmb3IyMDsgICAgICBcCisJX3BBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZEh0UGh5LlNob3J0R0lmb3I0MCA9IF9wQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5TaG9ydEdJZm9yNDA7ICAgICAgXAorCV9wQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRIdFBoeS5UeFNUQkMgPSBfcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uVHhTVEJDOyAgICAgIFwKKwlfcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkSHRQaHkuUnhTVEJDID0gX3BBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLlJ4U1RCQzsgICAgICBcCisJX3BBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZEh0UGh5LkV4dENoYW5PZmZzZXQgPSBfcEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8uRXh0Q2hhbk9mZnNldDsgICAgICBcCisJX3BBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZEh0UGh5LlJlY29tV2lkdGggPSBfcEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8uUmVjb21XaWR0aDsgICAgICBcCisJX3BBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZEh0UGh5Lk9wZXJhaW9uTW9kZSA9IF9wQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzIuT3BlcmFpb25Nb2RlOyAgICAgIFwKKwlfcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkSHRQaHkuTm9uR2ZQcmVzZW50ID0gX3BBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi5Ob25HZlByZXNlbnQ7ICAgICAgXAorCU5kaXNNb3ZlTWVtb3J5KChfcEFkKS0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRDYXBhYmlsaXR5Lk1DU1NldCwgKF9wQWQpLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5NQ1NTZXQsIHNpemVvZihVQ0hBUikgKiAxNik7XAorfQorCisjZGVmaW5lIENPUFlfQVBfSFRTRVRUSU5HU19GUk9NX0JFQUNPTihfcEFkLCBfcEh0Q2FwYWJpbGl0eSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCV9wQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkFNc2R1U2l6ZSA9IChVQ0hBUikoX3BIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5BTXNkdVNpemUpOwlcCisJX3BBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uTW1wc01vZGU9IChVQ0hBUikoX3BIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5NaW1vUHMpOwlcCisJX3BBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uTWF4UkFtcGR1RmFjdG9yID0gKFVDSEFSKShfcEh0Q2FwYWJpbGl0eS0+SHRDYXBQYXJtLk1heFJBbXBkdUZhY3Rvcik7CVwKK30KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworLy8KKy8vIE1BQ1JPIGZvciAzMi1iaXQgUENJIHJlZ2lzdGVyIHJlYWQgLyB3cml0ZQorLy8KKy8vIFVzYWdlIDogUlRNUF9JT19SRUFEMzIoCisvLyAgICAgICAgICAgICAgUFJUTVBfQURBUFRFUiBwQWQsCisvLyAgICAgICAgICAgICAgVUxPTkcgUmVnaXN0ZXJfT2Zmc2V0LAorLy8gICAgICAgICAgICAgIFBVTE9ORyAgcFZhbHVlKQorLy8KKy8vICAgICAgICAgUlRNUF9JT19XUklURTMyKAorLy8gICAgICAgICAgICAgIFBSVE1QX0FEQVBURVIgcEFkLAorLy8gICAgICAgICAgICAgIFVMT05HIFJlZ2lzdGVyX09mZnNldCwKKy8vICAgICAgICAgICAgICBVTE9ORyBWYWx1ZSkKKy8vCisKKy8vCisvLyBCQlAgJiBSRiBhcmUgdXNpbmcgaW5kaXJlY3QgYWNjZXNzLiBCZWZvcmUgd3JpdGUgYW55IHZhbHVlIGludG8gaXQuCisvLyBXZSBoYXZlIHRvIG1ha2Ugc3VyZSB0aGVyZSBpcyBubyBvdXRzdGFuZGluZyBjb21tYW5kIHBlbmRpbmcgdmlhIGNoZWNraW5nIGJ1c3kgYml0LgorLy8KKyNkZWZpbmUgTUFYX0JVU1lfQ09VTlQgIDEwMCAgICAgICAgIC8vIE51bWJlciBvZiByZXRyeSBiZWZvcmUgZmFpbGluZyBhY2Nlc3MgQkJQICYgUkYgaW5kaXJlY3QgcmVnaXN0ZXIKKy8vCisjaWZkZWYgUlQyODYwCisjZGVmaW5lIFJUTVBfUkZfSU9fV1JJVEUzMihfQSwgX1YpICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBQSFlfQ1NSNF9TVFJVQyAgVmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVUxPTkcgICAgICAgICAgIEJ1c3lDbnQgPSAwOyAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICgoX0EpLT5iUENJY2xrT2ZmKSAJICAgICAgICAgICAgICAgIFwKKyAgICB7CQkJCQkJCQkJCQkJXAorICAgICAgICByZXR1cm47CQkJCQkJCQkJCVwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBSVE1QX0lPX1JFQUQzMihfQSwgUkZfQ1NSX0NGRzAsICZWYWx1ZS53b3JkKTsgIFwKKyAgICAgICAgaWYgKFZhbHVlLmZpZWxkLkJ1c3kgPT0gSURMRSkgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBCdXN5Q250Kys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgd2hpbGUgKEJ1c3lDbnQgPCBNQVhfQlVTWV9DT1VOVCk7ICAgICAgICAgICBcCisgICAgaWYgKEJ1c3lDbnQgPCBNQVhfQlVTWV9DT1VOVCkgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgUlRNUF9JT19XUklURTMyKF9BLCBSRl9DU1JfQ0ZHMCwgX1YpOyAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjZGVmaW5lIEJCUF9JT19SRUFEOF9CWV9SRUdfSUQoX0EsIF9JLCBfcFYpICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBCQlBfQ1NSX0NGR19TVFJVQyAgQmJwQ3NyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCAgICAgICAgICAgICBpLCBrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yIChpPTA7IGk8TUFYX0JVU1lfQ09VTlQ7IGkrKykgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBSVE1QX0lPX1JFQUQzMihfQSwgQkJQX0NTUl9DRkcsICZCYnBDc3Iud29yZCk7ICAgICBcCisgICAgICAgIGlmIChCYnBDc3IuZmllbGQuQnVzeSA9PSBCVVNZKSAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgY29udGludWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQmJwQ3NyLndvcmQgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBCYnBDc3IuZmllbGQuZlJlYWQgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEJicENzci5maWVsZC5CQlBfUldfTU9ERSA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQmJwQ3NyLmZpZWxkLkJ1c3kgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBCYnBDc3IuZmllbGQuUmVnTnVtID0gX0k7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFJUTVBfSU9fV1JJVEUzMihfQSwgQkJQX0NTUl9DRkcsIEJicENzci53b3JkKTsgICAgIFwKKyAgICAgICAgZm9yIChrPTA7IGs8TUFYX0JVU1lfQ09VTlQ7IGsrKykgICAgICAgICAgICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBSVE1QX0lPX1JFQUQzMihfQSwgQkJQX0NTUl9DRkcsICZCYnBDc3Iud29yZCk7IFwKKyAgICAgICAgICAgIGlmIChCYnBDc3IuZmllbGQuQnVzeSA9PSBJRExFKSAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKChCYnBDc3IuZmllbGQuQnVzeSA9PSBJRExFKSAmJiAgICAgICAgICAgICAgXAorICAgICAgICAgICAgKEJicENzci5maWVsZC5SZWdOdW0gPT0gX0kpKSAgICAgICAgICAgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICooX3BWKSA9IChVQ0hBUilCYnBDc3IuZmllbGQuVmFsdWU7ICAgICAgICAgXAorICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChCYnBDc3IuZmllbGQuQnVzeSA9PSBCVVNZKSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgREJHUFJJTlRfRVJSKCgiREZTIEJCUCByZWFkIFIlZCBmYWlsXG4iLCBfSSkpOyAgICAgIFwKKyAgICAgICAgKihfcFYpID0gKF9BKS0+QmJwV3JpdGVMYXRjaFtfSV07ICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKy8vI2RlZmluZSBSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQoX0EsIF9JLCBfcFYpICAgIHt9CisvLyBSZWFkIEJCUCByZWdpc3RlciBieSByZWdpc3RlcidzIElELiBHZW5lcmF0ZSBQRVIgdG8gdGVzdCBCQQorI2RlZmluZSBSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQoX0EsIF9JLCBfcFYpICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBCQlBfQ1NSX0NGR19TVFJVQyAgQmJwQ3NyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCAgICAgICAgICAgICBpLCBrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKChfQSktPmJQQ0ljbGtPZmYgPT0gRkFMU0UpICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yIChpPTA7IGk8TUFYX0JVU1lfQ09VTlQ7IGkrKykgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQlSVE1QX0lPX1JFQUQzMihfQSwgSDJNX0JCUF9BR0VOVCwgJkJicENzci53b3JkKTsJCQkJXAorICAgICAgICBpZiAoQmJwQ3NyLmZpZWxkLkJ1c3kgPT0gQlVTWSkgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGNvbnRpbnVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEJicENzci53b3JkID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQmJwQ3NyLmZpZWxkLmZSZWFkID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBCYnBDc3IuZmllbGQuQkJQX1JXX01PREUgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEJicENzci5maWVsZC5CdXN5ID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQmJwQ3NyLmZpZWxkLlJlZ051bSA9IF9JOyAgICAgICAgICAgICAgICAgICAgICAgXAorCQlSVE1QX0lPX1dSSVRFMzIoX0EsIEgyTV9CQlBfQUdFTlQsIEJicENzci53b3JkKTsJCQkJXAorCQlBc2ljU2VuZENvbW1hbmRUb01jdShfQSwgMHg4MCwgMHhmZiwgMHgwLCAweDApOwkJCQkJXAorCQlSVE1QdXNlY0RlbGF5KDEwMDApOwkJCQkJCQlcCisgICAgICAgIGZvciAoaz0wOyBrPE1BWF9CVVNZX0NPVU5UOyBrKyspICAgICAgICAgICAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJUlRNUF9JT19SRUFEMzIoX0EsIEgyTV9CQlBfQUdFTlQsICZCYnBDc3Iud29yZCk7CQkJXAorICAgICAgICAgICAgaWYgKEJicENzci5maWVsZC5CdXN5ID09IElETEUpICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoKEJicENzci5maWVsZC5CdXN5ID09IElETEUpICYmICAgICAgICAgICAgICBcCisgICAgICAgICAgICAoQmJwQ3NyLmZpZWxkLlJlZ051bSA9PSBfSSkpICAgICAgICAgICAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgKihfcFYpID0gKFVDSEFSKUJicENzci5maWVsZC5WYWx1ZTsgICAgICAgICBcCisgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKEJicENzci5maWVsZC5CdXN5ID09IEJVU1kpICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQlEQkdQUklOVF9FUlIoKCJCQlAgcmVhZCBSJWQ9MHgleCBmYWlsXG4iLCBfSSwgQmJwQ3NyLndvcmQpKTsJXAorICAgICAgICAqKF9wVikgPSAoX0EpLT5CYnBXcml0ZUxhdGNoW19JXTsgICAgICAgICAgICAgICBcCisJCVJUTVBfSU9fUkVBRDMyKF9BLCBIMk1fQkJQX0FHRU5ULCAmQmJwQ3NyLndvcmQpOwkJCQlcCisJCUJicENzci5maWVsZC5CdXN5ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJUlRNUF9JT19XUklURTMyKF9BLCBIMk1fQkJQX0FHRU5ULCBCYnBDc3Iud29yZCk7CQkJCVwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgXAorfQorCisjZGVmaW5lIEJCUF9JT19XUklURThfQllfUkVHX0lEKF9BLCBfSSwgX1YpICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBCQlBfQ1NSX0NGR19TVFJVQyAgQmJwQ3NyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCAgICAgICAgICAgICBCdXN5Q250OyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yIChCdXN5Q250PTA7IEJ1c3lDbnQ8TUFYX0JVU1lfQ09VTlQ7IEJ1c3lDbnQrKykgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBSVE1QX0lPX1JFQUQzMihfQSwgQkJQX0NTUl9DRkcsICZCYnBDc3Iud29yZCk7ICAgICBcCisgICAgICAgIGlmIChCYnBDc3IuZmllbGQuQnVzeSA9PSBCVVNZKSAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGNvbnRpbnVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBCYnBDc3Iud29yZCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEJicENzci5maWVsZC5mUmVhZCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQmJwQ3NyLmZpZWxkLkJCUF9SV19NT0RFID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBCYnBDc3IuZmllbGQuQnVzeSA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEJicENzci5maWVsZC5WYWx1ZSA9IF9WOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQmJwQ3NyLmZpZWxkLlJlZ051bSA9IF9JOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBSVE1QX0lPX1dSSVRFMzIoX0EsIEJCUF9DU1JfQ0ZHLCBCYnBDc3Iud29yZCk7ICAgICBcCisgICAgICAgIChfQSktPkJicFdyaXRlTGF0Y2hbX0ldID0gX1Y7ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKEJ1c3lDbnQgPT0gTUFYX0JVU1lfQ09VTlQpICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBEQkdQUklOVF9FUlIoKCJCQlAgd3JpdGUgUiVkIGZhaWxcbiIsIF9JKSk7ICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworLy8gV3JpdGUgQkJQIHJlZ2lzdGVyIGJ5IHJlZ2lzdGVyJ3MgSUQgJiB2YWx1ZQorI2RlZmluZSBSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKF9BLCBfSSwgX1YpICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBCQlBfQ1NSX0NGR19TVFJVQyAgQmJwQ3NyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCAgICAgICAgICAgICBCdXN5Q250OyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKChfQSktPmJQQ0ljbGtPZmYgPT0gRkFMU0UpICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yIChCdXN5Q250PTA7IEJ1c3lDbnQ8TUFYX0JVU1lfQ09VTlQ7IEJ1c3lDbnQrKykgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQlSVE1QX0lPX1JFQUQzMihfQSwgSDJNX0JCUF9BR0VOVCwgJkJicENzci53b3JkKTsJCQkJXAorICAgICAgICBpZiAoQmJwQ3NyLmZpZWxkLkJ1c3kgPT0gQlVTWSkgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBjb250aW51ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQmJwQ3NyLndvcmQgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBCYnBDc3IuZmllbGQuZlJlYWQgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEJicENzci5maWVsZC5CQlBfUldfTU9ERSA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQmJwQ3NyLmZpZWxkLkJ1c3kgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBCYnBDc3IuZmllbGQuVmFsdWUgPSBfVjsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEJicENzci5maWVsZC5SZWdOdW0gPSBfSTsgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJUlRNUF9JT19XUklURTMyKF9BLCBIMk1fQkJQX0FHRU5ULCBCYnBDc3Iud29yZCk7CQkJCVwKKwkJQXNpY1NlbmRDb21tYW5kVG9NY3UoX0EsIDB4ODAsIDB4ZmYsIDB4MCwgMHgwKTsJCQkJCVwKKyAgICAgICAgICAgIGlmIChfQS0+T3BNb2RlID09IE9QTU9ERV9BUCkgICAgICAgICAgICAgICAgICAgIFwKKwkJUlRNUHVzZWNEZWxheSgxMDAwKTsJCQkJCQkJXAorICAgICAgICAoX0EpLT5CYnBXcml0ZUxhdGNoW19JXSA9IF9WOyAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChCdXN5Q250ID09IE1BWF9CVVNZX0NPVU5UKSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJREJHUFJJTlRfRVJSKCgiQkJQIHdyaXRlIFIlZD0weCV4IGZhaWxcbiIsIF9JLCBCYnBDc3Iud29yZCkpOwlcCisJCVJUTVBfSU9fUkVBRDMyKF9BLCBIMk1fQkJQX0FHRU5ULCAmQmJwQ3NyLndvcmQpOwkJCQlcCisJCUJicENzci5maWVsZC5CdXN5ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJUlRNUF9JT19XUklURTMyKF9BLCBIMk1fQkJQX0FHRU5ULCBCYnBDc3Iud29yZCk7CQkJCVwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisjZW5kaWYgLy8gUlQyODYwIC8vCisKKworI2RlZmluZSAgICAgTUFQX0NIQU5ORUxfSURfVE9fS0haKGNoLCBraHopICB7ICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHN3aXRjaCAoY2gpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDE6ICAgICBraHogPSAyNDEyMDAwOyAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDI6ICAgICBraHogPSAyNDE3MDAwOyAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDM6ICAgICBraHogPSAyNDIyMDAwOyAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6ICAgICBraHogPSAyNDI3MDAwOyAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDU6ICAgICBraHogPSAyNDMyMDAwOyAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDY6ICAgICBraHogPSAyNDM3MDAwOyAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDc6ICAgICBraHogPSAyNDQyMDAwOyAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDg6ICAgICBraHogPSAyNDQ3MDAwOyAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDk6ICAgICBraHogPSAyNDUyMDAwOyAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDEwOiAgICBraHogPSAyNDU3MDAwOyAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDExOiAgICBraHogPSAyNDYyMDAwOyAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDEyOiAgICBraHogPSAyNDY3MDAwOyAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDEzOiAgICBraHogPSAyNDcyMDAwOyAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDE0OiAgICBraHogPSAyNDg0MDAwOyAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDM2OiAgLyogVU5JSSAqLyAga2h6ID0gNTE4MDAwMDsgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA0MDogIC8qIFVOSUkgKi8gIGtoeiA9IDUyMDAwMDA7ICAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNDQ6ICAvKiBVTklJICovICBraHogPSA1MjIwMDAwOyAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDQ4OiAgLyogVU5JSSAqLyAga2h6ID0gNTI0MDAwMDsgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA1MjogIC8qIFVOSUkgKi8gIGtoeiA9IDUyNjAwMDA7ICAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNTY6ICAvKiBVTklJICovICBraHogPSA1MjgwMDAwOyAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDYwOiAgLyogVU5JSSAqLyAga2h6ID0gNTMwMDAwMDsgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA2NDogIC8qIFVOSUkgKi8gIGtoeiA9IDUzMjAwMDA7ICAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMTQ5OiAvKiBVTklJICovICBraHogPSA1NzQ1MDAwOyAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDE1MzogLyogVU5JSSAqLyAga2h6ID0gNTc2NTAwMDsgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxNTc6IC8qIFVOSUkgKi8gIGtoeiA9IDU3ODUwMDA7ICAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMTYxOiAvKiBVTklJICovICBraHogPSA1ODA1MDAwOyAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDE2NTogLyogVU5JSSAqLyAga2h6ID0gNTgyNTAwMDsgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDA6IC8qIEhpcGVyTEFOMiAqLyAga2h6ID0gNTUwMDAwMDsgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDQ6IC8qIEhpcGVyTEFOMiAqLyAga2h6ID0gNTUyMDAwMDsgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDg6IC8qIEhpcGVyTEFOMiAqLyAga2h6ID0gNTU0MDAwMDsgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxMTI6IC8qIEhpcGVyTEFOMiAqLyAga2h6ID0gNTU2MDAwMDsgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxMTY6IC8qIEhpcGVyTEFOMiAqLyAga2h6ID0gNTU4MDAwMDsgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjA6IC8qIEhpcGVyTEFOMiAqLyAga2h6ID0gNTYwMDAwMDsgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjQ6IC8qIEhpcGVyTEFOMiAqLyAga2h6ID0gNTYyMDAwMDsgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjg6IC8qIEhpcGVyTEFOMiAqLyAga2h6ID0gNTY0MDAwMDsgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzI6IC8qIEhpcGVyTEFOMiAqLyAga2h6ID0gNTY2MDAwMDsgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzY6IC8qIEhpcGVyTEFOMiAqLyAga2h6ID0gNTY4MDAwMDsgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxNDA6IC8qIEhpcGVyTEFOMiAqLyAga2h6ID0gNTcwMDAwMDsgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAzNDogIC8qIEphcGFuIE1NQUMgKi8gICBraHogPSA1MTcwMDAwOyAgIGJyZWFrOyAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAzODogIC8qIEphcGFuIE1NQUMgKi8gICBraHogPSA1MTkwMDAwOyAgIGJyZWFrOyAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA0MjogIC8qIEphcGFuIE1NQUMgKi8gICBraHogPSA1MjEwMDAwOyAgIGJyZWFrOyAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA0NjogIC8qIEphcGFuIE1NQUMgKi8gICBraHogPSA1MjMwMDAwOyAgIGJyZWFrOyAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxODQ6IC8qIEphcGFuICovICAga2h6ID0gNDkyMDAwMDsgICBicmVhazsgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMTg4OiAvKiBKYXBhbiAqLyAgIGtoeiA9IDQ5NDAwMDA7ICAgYnJlYWs7ICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDE5MjogLyogSmFwYW4gKi8gICBraHogPSA0OTYwMDAwOyAgIGJyZWFrOyAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxOTY6IC8qIEphcGFuICovICAga2h6ID0gNDk4MDAwMDsgICBicmVhazsgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjA4OiAvKiBKYXBhbiwgbWVhbnMgSjA4ICovICAga2h6ID0gNTA0MDAwMDsgICBicmVhazsgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjEyOiAvKiBKYXBhbiwgbWVhbnMgSjEyICovICAga2h6ID0gNTA2MDAwMDsgICBicmVhazsgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjE2OiAvKiBKYXBhbiwgbWVhbnMgSjE2ICovICAga2h6ID0gNTA4MDAwMDsgICBicmVhazsgICBcCisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6ICAgIGtoeiA9IDI0MTIwMDA7ICAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9CisKKyNkZWZpbmUgICAgIE1BUF9LSFpfVE9fQ0hBTk5FTF9JRChraHosIGNoKSAgeyAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGtoeikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDEyMDAwOiAgICBjaCA9IDE7ICAgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDE3MDAwOiAgICBjaCA9IDI7ICAgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDIyMDAwOiAgICBjaCA9IDM7ICAgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDI3MDAwOiAgICBjaCA9IDQ7ICAgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDMyMDAwOiAgICBjaCA9IDU7ICAgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDM3MDAwOiAgICBjaCA9IDY7ICAgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDQyMDAwOiAgICBjaCA9IDc7ICAgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDQ3MDAwOiAgICBjaCA9IDg7ICAgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDUyMDAwOiAgICBjaCA9IDk7ICAgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDU3MDAwOiAgICBjaCA9IDEwOyAgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDYyMDAwOiAgICBjaCA9IDExOyAgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDY3MDAwOiAgICBjaCA9IDEyOyAgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDcyMDAwOiAgICBjaCA9IDEzOyAgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDg0MDAwOiAgICBjaCA9IDE0OyAgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA1MTgwMDAwOiAgICBjaCA9IDM2OyAgLyogVU5JSSAqLyAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNTIwMDAwMDogICAgY2ggPSA0MDsgIC8qIFVOSUkgKi8gIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDUyMjAwMDA6ICAgIGNoID0gNDQ7ICAvKiBVTklJICovICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA1MjQwMDAwOiAgICBjaCA9IDQ4OyAgLyogVU5JSSAqLyAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNTI2MDAwMDogICAgY2ggPSA1MjsgIC8qIFVOSUkgKi8gIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDUyODAwMDA6ICAgIGNoID0gNTY7ICAvKiBVTklJICovICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA1MzAwMDAwOiAgICBjaCA9IDYwOyAgLyogVU5JSSAqLyAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNTMyMDAwMDogICAgY2ggPSA2NDsgIC8qIFVOSUkgKi8gIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDU3NDUwMDA6ICAgIGNoID0gMTQ5OyAvKiBVTklJICovICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA1NzY1MDAwOiAgICBjaCA9IDE1MzsgLyogVU5JSSAqLyAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNTc4NTAwMDogICAgY2ggPSAxNTc7IC8qIFVOSUkgKi8gIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDU4MDUwMDA6ICAgIGNoID0gMTYxOyAvKiBVTklJICovICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA1ODI1MDAwOiAgICBjaCA9IDE2NTsgLyogVU5JSSAqLyAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNTUwMDAwMDogICAgY2ggPSAxMDA7IC8qIEhpcGVyTEFOMiAqLyAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNTUyMDAwMDogICAgY2ggPSAxMDQ7IC8qIEhpcGVyTEFOMiAqLyAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNTU0MDAwMDogICAgY2ggPSAxMDg7IC8qIEhpcGVyTEFOMiAqLyAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNTU2MDAwMDogICAgY2ggPSAxMTI7IC8qIEhpcGVyTEFOMiAqLyAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNTU4MDAwMDogICAgY2ggPSAxMTY7IC8qIEhpcGVyTEFOMiAqLyAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNTYwMDAwMDogICAgY2ggPSAxMjA7IC8qIEhpcGVyTEFOMiAqLyAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNTYyMDAwMDogICAgY2ggPSAxMjQ7IC8qIEhpcGVyTEFOMiAqLyAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNTY0MDAwMDogICAgY2ggPSAxMjg7IC8qIEhpcGVyTEFOMiAqLyAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNTY2MDAwMDogICAgY2ggPSAxMzI7IC8qIEhpcGVyTEFOMiAqLyAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNTY4MDAwMDogICAgY2ggPSAxMzY7IC8qIEhpcGVyTEFOMiAqLyAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNTcwMDAwMDogICAgY2ggPSAxNDA7IC8qIEhpcGVyTEFOMiAqLyAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNTE3MDAwMDogICAgY2ggPSAzNDsgIC8qIEphcGFuIE1NQUMgKi8gICBicmVhazsgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNTE5MDAwMDogICAgY2ggPSAzODsgIC8qIEphcGFuIE1NQUMgKi8gICBicmVhazsgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNTIxMDAwMDogICAgY2ggPSA0MjsgIC8qIEphcGFuIE1NQUMgKi8gICBicmVhazsgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNTIzMDAwMDogICAgY2ggPSA0NjsgIC8qIEphcGFuIE1NQUMgKi8gICBicmVhazsgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNDkyMDAwMDogICAgY2ggPSAxODQ7IC8qIEphcGFuICovICBicmVhazsgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNDk0MDAwMDogICAgY2ggPSAxODg7IC8qIEphcGFuICovICBicmVhazsgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNDk2MDAwMDogICAgY2ggPSAxOTI7IC8qIEphcGFuICovICBicmVhazsgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNDk4MDAwMDogICAgY2ggPSAxOTY7IC8qIEphcGFuICovICBicmVhazsgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNTA0MDAwMDogICAgY2ggPSAyMDg7IC8qIEphcGFuLCBtZWFucyBKMDggKi8gIGJyZWFrOyAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA1MDYwMDAwOiAgICBjaCA9IDIxMjsgLyogSmFwYW4sIG1lYW5zIEoxMiAqLyAgYnJlYWs7ICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDUwODAwMDA6ICAgIGNoID0gMjE2OyAvKiBKYXBhbiwgbWVhbnMgSjE2ICovICBicmVhazsgICBcCisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgY2ggPSAxOyAgICAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9CisKKy8vCisvLyBDb21tb24gZnJhZ21lbnQgbGlzdCBzdHJ1Y3R1cmUgLSAgSWRlbnRpY2FsIHRvIHRoZSBzY2F0dGVyIGdhdGhlciBmcmFnIGxpc3Qgc3RydWN0dXJlCisvLworI2RlZmluZSBOSUNfTUFYX1BIWVNfQlVGX0NPVU5UICAgICAgICAgICAgICA4CisKK3R5cGVkZWYgc3RydWN0IF9SVE1QX1NDQVRURVJfR0FUSEVSX0VMRU1FTlQgeworICAgIFBWT0lECQlBZGRyZXNzOworICAgIFVMT05HCQlMZW5ndGg7CisgICAgUFVMT05HCQlSZXNlcnZlZDsKK30gUlRNUF9TQ0FUVEVSX0dBVEhFUl9FTEVNRU5ULCAqUFJUTVBfU0NBVFRFUl9HQVRIRVJfRUxFTUVOVDsKKworCit0eXBlZGVmIHN0cnVjdCBfUlRNUF9TQ0FUVEVSX0dBVEhFUl9MSVNUIHsKKyAgICBVTE9ORyAgTnVtYmVyT2ZFbGVtZW50czsKKyAgICBQVUxPTkcgUmVzZXJ2ZWQ7CisgICAgUlRNUF9TQ0FUVEVSX0dBVEhFUl9FTEVNRU5UIEVsZW1lbnRzW05JQ19NQVhfUEhZU19CVUZfQ09VTlRdOworfSBSVE1QX1NDQVRURVJfR0FUSEVSX0xJU1QsICpQUlRNUF9TQ0FUVEVSX0dBVEhFUl9MSVNUOworCisvLworLy8gIFNvbWUgdXRpbGl0eSBtYWNyb3MKKy8vCisjaWZuZGVmIG1pbgorI2RlZmluZSBtaW4oX2EsIF9iKSAgICAgKCgoX2EpIDwgKF9iKSkgPyAoX2EpIDogKF9iKSkKKyNlbmRpZgorCisjaWZuZGVmIG1heAorI2RlZmluZSBtYXgoX2EsIF9iKSAgICAgKCgoX2EpID4gKF9iKSkgPyAoX2EpIDogKF9iKSkKKyNlbmRpZgorCisjZGVmaW5lIEdFVF9MTkFfR0FJTihfcEFkKQkoKF9wQWQtPkxhdGNoUmZSZWdzLkNoYW5uZWwgPD0gMTQpID8gKF9wQWQtPkJMTkFHYWluKSA6ICgoX3BBZC0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbCA8PSA2NCkgPyAoX3BBZC0+QUxOQUdhaW4wKSA6ICgoX3BBZC0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbCA8PSAxMjgpID8gKF9wQWQtPkFMTkFHYWluMSkgOiAoX3BBZC0+QUxOQUdhaW4yKSkpKQorCisjZGVmaW5lIElOQ19DT1VOVEVSNjQoVmFsKSAgICAgICAgICAoVmFsLlF1YWRQYXJ0KyspCisKKyNkZWZpbmUgSU5GUkFfT04oX3ApICAgICAgICAgICAgICAgIChPUFNUQVRVU19URVNUX0ZMQUcoX3AsIGZPUF9TVEFUVVNfSU5GUkFfT04pKQorI2RlZmluZSBBREhPQ19PTihfcCkgICAgICAgICAgICAgICAgKE9QU1RBVFVTX1RFU1RfRkxBRyhfcCwgZk9QX1NUQVRVU19BREhPQ19PTikpCisjZGVmaW5lIE1PTklUT1JfT04oX3ApICAgICAgICAgICAgICAoKChfcCktPlN0YUNmZy5Cc3NUeXBlKSA9PSBCU1NfTU9OSVRPUikKKyNkZWZpbmUgSURMRV9PTihfcCkgICAgICAgICAgICAgICAgICghSU5GUkFfT04oX3ApICYmICFBREhPQ19PTihfcCkpCisKKy8vIENoZWNrIExFQVAgJiBDQ0tNIGZsYWdzCisjZGVmaW5lIExFQVBfT04oX3ApICAgICAgICAgICAgICAgICAoKChfcCktPlN0YUNmZy5MZWFwQXV0aE1vZGUpID09IENJU0NPX0F1dGhNb2RlTEVBUCkKKyNkZWZpbmUgTEVBUF9DQ0tNX09OKF9wKSAgICAgICAgICAgICgoKChfcCktPlN0YUNmZy5MZWFwQXV0aE1vZGUpID09IENJU0NPX0F1dGhNb2RlTEVBUCkgJiYgKChfcCktPlN0YUNmZy5MZWFwQXV0aEluZm8uQ0NLTSA9PSBUUlVFKSkKKworLy8gaWYgb3JnaW5hbCBFdGhlcm5ldCBmcmFtZSBjb250YWlucyBubyBMTEMvU05BUCwgdGhlbiBhbiBleHRyYSBMTEMvU05BUCBlbmNhcCBpcyByZXF1aXJlZAorI2RlZmluZSBFWFRSQV9MTENTTkFQX0VOQ0FQX0ZST01fUEtUX1NUQVJUKF9wQnVmVkEsIF9wRXh0cmFMbGNTbmFwRW5jYXApCQlcCit7CQkJCQkJCQkJCQkJCQkJCVwKKwlpZiAoKCgqKF9wQnVmVkEgKyAxMikgPDwgOCkgKyAqKF9wQnVmVkEgKyAxMykpID4gMTUwMCkJCVwKKwl7CQkJCQkJCQkJCQkJCQkJXAorCQlfcEV4dHJhTGxjU25hcEVuY2FwID0gU05BUF84MDJfMUg7CQkJCQkJXAorCQlpZiAoTmRpc0VxdWFsTWVtb3J5KElQWCwgX3BCdWZWQSArIDEyLCAyKSB8fCAJCQlcCisJCQlOZGlzRXF1YWxNZW1vcnkoQVBQTEVfVEFMSywgX3BCdWZWQSArIDEyLCAyKSkJCVwKKwkJewkJCQkJCQkJCQkJCQkJXAorCQkJX3BFeHRyYUxsY1NuYXBFbmNhcCA9IFNOQVBfQlJJREdFX1RVTk5FTDsJCQlcCisJCX0JCQkJCQkJCQkJCQkJCVwKKwl9CQkJCQkJCQkJCQkJCQkJXAorCWVsc2UJCQkJCQkJCQkJCQkJCVwKKwl7CQkJCQkJCQkJCQkJCQkJXAorCQlfcEV4dHJhTGxjU25hcEVuY2FwID0gTlVMTDsJCQkJCQkJCVwKKwl9CQkJCQkJCQkJCQkJCQkJXAorfQorCisvLyBOZXcgRGVmaW5lIGZvciBuZXcgVHggUGF0aC4KKyNkZWZpbmUgRVhUUkFfTExDU05BUF9FTkNBUF9GUk9NX1BLVF9PRkZTRVQoX3BCdWZWQSwgX3BFeHRyYUxsY1NuYXBFbmNhcCkJXAorewkJCQkJCQkJCQkJCQkJCQlcCisJaWYgKCgoKihfcEJ1ZlZBKSA8PCA4KSArICooX3BCdWZWQSArIDEpKSA+IDE1MDApCQkJXAorCXsJCQkJCQkJCQkJCQkJCQlcCisJCV9wRXh0cmFMbGNTbmFwRW5jYXAgPSBTTkFQXzgwMl8xSDsJCQkJCQlcCisJCWlmIChOZGlzRXF1YWxNZW1vcnkoSVBYLCBfcEJ1ZlZBLCAyKSB8fCAJCQkJXAorCQkJTmRpc0VxdWFsTWVtb3J5KEFQUExFX1RBTEssIF9wQnVmVkEsIDIpKQkJCVwKKwkJewkJCQkJCQkJCQkJCQkJXAorCQkJX3BFeHRyYUxsY1NuYXBFbmNhcCA9IFNOQVBfQlJJREdFX1RVTk5FTDsJCQlcCisJCX0JCQkJCQkJCQkJCQkJCVwKKwl9CQkJCQkJCQkJCQkJCQkJXAorCWVsc2UJCQkJCQkJCQkJCQkJCVwKKwl7CQkJCQkJCQkJCQkJCQkJXAorCQlfcEV4dHJhTGxjU25hcEVuY2FwID0gTlVMTDsJCQkJCQkJCVwKKwl9CQkJCQkJCQkJCQkJCQkJXAorfQorCisKKyNkZWZpbmUgTUFLRV84MDJfM19IRUFERVIoX3AsIF9wTWFjMSwgX3BNYWMyLCBfcFR5cGUpICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBOZGlzTW92ZU1lbW9yeShfcCwgX3BNYWMxLCBNQUNfQUREUl9MRU4pOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBOZGlzTW92ZU1lbW9yeSgoX3AgKyBNQUNfQUREUl9MRU4pLCBfcE1hYzIsIE1BQ19BRERSX0xFTik7ICAgICAgICAgIFwKKyAgICBOZGlzTW92ZU1lbW9yeSgoX3AgKyBNQUNfQUREUl9MRU4gKiAyKSwgX3BUeXBlLCBMRU5HVEhfODAyXzNfVFlQRSk7IFwKK30KKworLy8gaWYgcERhdGEgaGFzIG5vIExMQy9TTkFQIChuZWl0aGVyIFJGQzEwNDIgbm9yIEJyaWRnZSB0dW5uZWwpLCBrZWVwIGl0IHRoYXQgd2F5LgorLy8gZWxzZSBpZiB0aGUgcmVjZWl2ZWQgZnJhbWUgaXMgTExDL1NOQVAtZW5jYXBlZCBJUFggb3IgQVBQTEVUQUxLLCBwcmVzZXJ2ZSB0aGUgTExDL1NOQVAgZmllbGQKKy8vIGVsc2UgcmVtb3ZlIHRoZSBMTEMvU05BUCBmaWVsZCBmcm9tIHRoZSByZXN1bHQgRXRoZXJuZXQgZnJhbWUKKy8vIFBhdGNoIGZvciBXSFFMIG9ubHksIHdoaWNoIGRpZCBub3QgdHVybiBvbiBOZXRiaW9zIGJ1dCB1c2UgSVBYIHdpdGhpbiBpdHMgcGF5bG9hZAorLy8gTm90ZToKKy8vICAgICBfcERhdGEgJiBfRGF0YVNpemUgbWF5IGJlIGFsdGVyZWQgKHJlbW92ZSA4LWJ5dGUgTExDL1NOQVApIGJ5IHRoaXMgTUFDUk8KKy8vICAgICBfcFJlbW92ZWRMTENTTkFQOiBwb2ludGVyIHRvIHJlbW92ZWQgTExDL1NOQVA7IE5VTEwgaXMgbm90IHJlbW92ZWQKKyNkZWZpbmUgQ09OVkVSVF9UT184MDJfMyhfcDgwMjNoZHIsIF9wREEsIF9wU0EsIF9wRGF0YSwgX0RhdGFTaXplLCBfcFJlbW92ZWRMTENTTkFQKSAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjaGFyIExMQ19MZW5bMl07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfcFJlbW92ZWRMTENTTkFQID0gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoTmRpc0VxdWFsTWVtb3J5KFNOQVBfODAyXzFILCBfcERhdGEsIDYpICB8fCAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgTmRpc0VxdWFsTWVtb3J5KFNOQVBfQlJJREdFX1RVTk5FTCwgX3BEYXRhLCA2KSkgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgUFVDSEFSIHBQcm90byA9IF9wRGF0YSArIDY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKChOZGlzRXF1YWxNZW1vcnkoSVBYLCBwUHJvdG8sIDIpIHx8IE5kaXNFcXVhbE1lbW9yeShBUFBMRV9UQUxLLCBwUHJvdG8sIDIpKSAmJiAgXAorICAgICAgICAgICAgTmRpc0VxdWFsTWVtb3J5KFNOQVBfODAyXzFILCBfcERhdGEsIDYpKSAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgTExDX0xlblswXSA9IChVQ0hBUikoX0RhdGFTaXplIC8gMjU2KTsgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgTExDX0xlblsxXSA9IChVQ0hBUikoX0RhdGFTaXplICUgMjU2KTsgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgTUFLRV84MDJfM19IRUFERVIoX3A4MDIzaGRyLCBfcERBLCBfcFNBLCBMTENfTGVuKTsgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgTUFLRV84MDJfM19IRUFERVIoX3A4MDIzaGRyLCBfcERBLCBfcFNBLCBwUHJvdG8pOyAgICAgICAgICAgXAorICAgICAgICAgICAgX3BSZW1vdmVkTExDU05BUCA9IF9wRGF0YTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgX0RhdGFTaXplIC09IExFTkdUSF84MDJfMV9IOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgX3BEYXRhICs9IExFTkdUSF84MDJfMV9IOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBMTENfTGVuWzBdID0gKFVDSEFSKShfRGF0YVNpemUgLyAyNTYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBMTENfTGVuWzFdID0gKFVDSEFSKShfRGF0YVNpemUgJSAyNTYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBNQUtFXzgwMl8zX0hFQURFUihfcDgwMjNoZHIsIF9wREEsIF9wU0EsIExMQ19MZW4pOyAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjZGVmaW5lIFNXSVRDSF9BQiggX3BBQSwgX3BCQikgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBQVk9JRCBwQ0M7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBwQ0MgPSBfcEJCOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX3BCQiA9IF9wQUE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfcEFBID0gcENDOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKy8vIEVucXVldWUgdGhpcyBmcmFtZSB0byBNTE1FIGVuZ2luZQorLy8gV2UgbmVlZCB0byBlbnF1ZXVlIHRoZSB3aG9sZSBmcmFtZSBiZWNhdXNlIE1MTUUgbmVlZCB0byBwYXNzIGRhdGEgdHlwZQorLy8gaW5mb3JtYXRpb24gZnJvbSA4MDIuMTEgaGVhZGVyCisjaWZkZWYgUlQyODYwCisjZGVmaW5lIFJFUE9SVF9NR01UX0ZSQU1FX1RPX01MTUUoX3BBZCwgV2NpZCwgX3BGcmFtZSwgX0ZyYW1lU2l6ZSwgX1Jzc2kwLCBfUnNzaTEsIF9Sc3NpMiwgX1BsY3BTaWduYWwpICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFVJTlQzMiBIaWdoMzJUU0YsIExvdzMyVFNGOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgUlRNUF9JT19SRUFEMzIoX3BBZCwgVFNGX1RJTUVSX0RXMSwgJkhpZ2gzMlRTRik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFJUTVBfSU9fUkVBRDMyKF9wQWQsIFRTRl9USU1FUl9EVzAsICZMb3czMlRTRik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBNbG1lRW5xdWV1ZUZvclJlY3YoX3BBZCwgV2NpZCwgSGlnaDMyVFNGLCBMb3czMlRTRiwgKFVDSEFSKV9Sc3NpMCwgKFVDSEFSKV9Sc3NpMSwoVUNIQVIpX1Jzc2kyLF9GcmFtZVNpemUsIF9wRnJhbWUsIChVQ0hBUilfUGxjcFNpZ25hbCk7ICAgXAorfQorI2VuZGlmIC8vIFJUMjg2MCAvLworCisjZGVmaW5lIE5ESVNfUVVFUllfQlVGRkVSKF9OZGlzQnVmLCBfcHBWQSwgX3BCdWZMZW4pICAgICAgICAgICAgICAgICAgICBcCisgICAgTmRpc1F1ZXJ5QnVmZmVyKF9OZGlzQnVmLCBfcHBWQSwgX3BCdWZMZW4pCisKKyNkZWZpbmUgTUFDX0FERFJfRVFVQUwocEFkZHIxLHBBZGRyMikgICAgICAgICAgIFJUTVBFcXVhbE1lbW9yeSgoUFZPSUQpKHBBZGRyMSksIChQVk9JRCkocEFkZHIyKSwgTUFDX0FERFJfTEVOKQorI2RlZmluZSBTU0lEX0VRVUFMKHNzaWQxLCBsZW4xLCBzc2lkMiwgbGVuMikgICAgKChsZW4xPT1sZW4yKSAmJiAoUlRNUEVxdWFsTWVtb3J5KHNzaWQxLCBzc2lkMiwgbGVuMSkpKQorCisvLworLy8gQ2hlY2sgaWYgaXQgaXMgSmFwYW4gVzUzKGNoNTIsNTYsNjAsNjQpIGNoYW5uZWwuCisvLworI2RlZmluZSBKYXBhbkNoYW5uZWxDaGVjayhjaGFubmVsKSAgKChjaGFubmVsID09IDUyKSB8fCAoY2hhbm5lbCA9PSA1NikgfHwgKGNoYW5uZWwgPT0gNjApIHx8IChjaGFubmVsID09IDY0KSkKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorI2RlZmluZSBTVEFfUE9SVF9TRUNVUkVEKF9wQWQpIFwKK3sgXAorCV9wQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEOyBcCisJTmRpc0FjcXVpcmVTcGluTG9jaygmX3BBZC0+TWFjVGFiTG9jayk7IFwKKwlfcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5Qb3J0U2VjdXJlZCA9IF9wQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZDsgXAorCU5kaXNSZWxlYXNlU3BpbkxvY2soJl9wQWQtPk1hY1RhYkxvY2spOyBcCit9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKworLy8KKy8vIFJlZ2lzdGVyIHNldCBwYWlyIGZvciBpbml0aWFsemF0aW9uIHJlZ2lzdGVyIHNldCBkZWZpbml0aW9uCisvLwordHlwZWRlZiBzdHJ1Y3QgIF9SVE1QX1JFR19QQUlSCit7CisJVUxPTkcgICBSZWdpc3RlcjsKKwlVTE9ORyAgIFZhbHVlOworfSBSVE1QX1JFR19QQUlSLCAqUFJUTVBfUkVHX1BBSVI7CisKK3R5cGVkZWYgc3RydWN0ICBfUkVHX1BBSVIKK3sKKwlVQ0hBUiAgIFJlZ2lzdGVyOworCVVDSEFSICAgVmFsdWU7Cit9IFJFR19QQUlSLCAqUFJFR19QQUlSOworCisvLworLy8gUmVnaXN0ZXIgc2V0IHBhaXIgZm9yIGluaXRpYWx6YXRpb24gcmVnaXN0ZXIgc2V0IGRlZmluaXRpb24KKy8vCit0eXBlZGVmIHN0cnVjdCAgX1JUTVBfUkZfUkVHUworeworCVVDSEFSICAgQ2hhbm5lbDsKKwlVTE9ORyAgIFIxOworCVVMT05HICAgUjI7CisJVUxPTkcgICBSMzsKKwlVTE9ORyAgIFI0OworfSBSVE1QX1JGX1JFR1MsICpQUlRNUF9SRl9SRUdTOworCit0eXBlZGVmIHN0cnVjdCBfRlJFUVVFTkNZX0lURU0geworCVVDSEFSCUNoYW5uZWw7CisJVUNIQVIJTjsKKwlVQ0hBUglSOworCVVDSEFSCUs7Cit9IEZSRVFVRU5DWV9JVEVNLCAqUEZSRVFVRU5DWV9JVEVNOworCisvLworLy8gIERhdGEgYnVmZmVyIGZvciBETUEgb3BlcmF0aW9uLCB0aGUgYnVmZmVyIG11c3QgYmUgY29udGlndW91cyBwaHlzaWNhbCBtZW1vcnkKKy8vICBCb3RoIERNQSB0byAvIGZyb20gQ1BVIHVzZSB0aGUgc2FtZSBzdHJ1Y3R1cmUuCisvLwordHlwZWRlZiBzdHJ1Y3QgIF9SVE1QX0RNQUJVRgoreworCVVMT05HICAgICAgICAgICAgICAgICAgIEFsbG9jU2l6ZTsKKwlQVk9JRCAgICAgICAgICAgICAgICAgICBBbGxvY1ZhOyAgICAgICAgICAgIC8vIFR4QnVmIHZpcnR1YWwgYWRkcmVzcworCU5ESVNfUEhZU0lDQUxfQUREUkVTUyAgIEFsbG9jUGE7ICAgICAgICAgICAgLy8gVHhCdWYgcGh5c2ljYWwgYWRkcmVzcworfSBSVE1QX0RNQUJVRiwgKlBSVE1QX0RNQUJVRjsKKworCit0eXBlZGVmCXVuaW9uCV9IRUFERVJfODAyXzExX1NFUXsKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisgICAgc3RydWN0IHsKKyAgIAlVU0hPUlQJCQlTZXF1ZW5jZToxMjsKKwlVU0hPUlQJCQlGcmFnOjQ7CisgICAgfSAgIGZpZWxkOworI2Vsc2UKKyAgICBzdHJ1Y3QgeworCVVTSE9SVAkJCUZyYWc6NDsKKwlVU0hPUlQJCQlTZXF1ZW5jZToxMjsKKyAgICB9ICAgZmllbGQ7CisjZW5kaWYKKyAgICBVU0hPUlQgICAgICAgICAgIHZhbHVlOworfQlIRUFERVJfODAyXzExX1NFUSwgKlBIRUFERVJfODAyXzExX1NFUTsKKworLy8KKy8vICBEYXRhIGJ1ZmZlciBmb3IgRE1BIG9wZXJhdGlvbiwgdGhlIGJ1ZmZlciBtdXN0IGJlIGNvbnRpZ3VvdXMgcGh5c2ljYWwgbWVtb3J5CisvLyAgQm90aCBETUEgdG8gLyBmcm9tIENQVSB1c2UgdGhlIHNhbWUgc3RydWN0dXJlLgorLy8KK3R5cGVkZWYgc3RydWN0ICBfUlRNUF9SRU9SREVSQlVGCit7CisJQk9PTEVBTgkJCUlzRnVsbDsKKwlQVk9JRCAgICAgICAgICAgICAgICAgICBBbGxvY1ZhOyAgICAgICAgICAgIC8vIFR4QnVmIHZpcnR1YWwgYWRkcmVzcworCVVDSEFSCQkJSGVhZGVyODAyXzNbMTRdOworCUhFQURFUl84MDJfMTFfU0VRCQkJU2VxdWVuY2U7CS8vc3VwcG9ydCBjb21wcmVzc2VkIGJpdG1hcCBCQSwgc28gbm8gY29uc2lkZXIgZnJhZ21lbnQgaW4gQkEKKwlVQ0hBUiAJCURhdGFPZmZzZXQ7CisJVVNIT1JUIAkJRGF0YXNpemU7CisJVUxPTkcgICAgICAgICAgICAgICAgICAgQWxsb2NTaXplOworI2lmZGVmIFJUMjg2MAorCU5ESVNfUEhZU0lDQUxfQUREUkVTUyAgIEFsbG9jUGE7ICAgICAgICAgICAgLy8gVHhCdWYgcGh5c2ljYWwgYWRkcmVzcworI2VuZGlmIC8vIFJUMjg2MCAvLworfSAgIFJUTVBfUkVPUkRFUkJVRiwgKlBSVE1QX1JFT1JERVJCVUY7CisKKy8vCisvLyBDb250cm9sIGJsb2NrIChEZXNjcmlwdG9yKSBmb3IgYWxsIHJpbmcgZGVzY3JpcHRvciBETUEgb3BlcmF0aW9uLCBidWZmZXIgbXVzdCBiZQorLy8gY29udGlndW91cyBwaHlzaWNhbCBtZW1vcnkuIE5ESVNfUEFDS0VUIHN0b3JlZCB0aGUgYmluZGluZyBSeCBwYWNrZXQgZGVzY3JpcHRvcgorLy8gd2hpY2ggd29uJ3QgYmUgcmVsZWFzZWQsIGRyaXZlciBoYXMgdG8gd2FpdCB1bnRpbCB1cHBlciBsYXllciByZXR1cm4gdGhlIHBhY2tldAorLy8gYmVmb3JlIGdpdmVpbmcgdXAgdGhpcyByeCByaW5nIGRlc2NyaXB0b3IgdG8gQVNJQy4gTkRJU19CVUZGRVIgaXMgYXNzb2NhaXRlZCBwYWlyCisvLyB0byBkZXNjcmliZSB0aGUgcGFja2V0IGJ1ZmZlci4gRm9yIFR4LCBORElTX1BBQ0tFVCBzdG9yZWQgdGhlIHR4IHBhY2tldCBkZXNjcmlwdG9yCisvLyB3aGljaCBkcml2ZXIgc2hvdWxkIEFDSyB1cHBlciBsYXllciB3aGVuIHRoZSB0eCBpcyBwaHlzaWNhbGx5IGRvbmUgb3IgZmFpbGVkLgorLy8KK3R5cGVkZWYgc3RydWN0IF9SVE1QX0RNQUNCCit7CisJVUxPTkcgICAgICAgICAgICAgICAgICAgQWxsb2NTaXplOyAgICAgICAgICAvLyBDb250cm9sIGJsb2NrIHNpemUKKwlQVk9JRCAgICAgICAgICAgICAgICAgICBBbGxvY1ZhOyAgICAgICAgICAgIC8vIENvbnRyb2wgYmxvY2sgdmlydHVhbCBhZGRyZXNzCisJTkRJU19QSFlTSUNBTF9BRERSRVNTICAgQWxsb2NQYTsgICAgICAgICAgICAvLyBDb250cm9sIGJsb2NrIHBoeXNpY2FsIGFkZHJlc3MKKwlQTkRJU19QQUNLRVQgcE5kaXNQYWNrZXQ7CisJUE5ESVNfUEFDS0VUIHBOZXh0TmRpc1BhY2tldDsKKworCVJUTVBfRE1BQlVGICAgICAgICAgICAgIERtYUJ1ZjsgICAgICAgICAgICAgLy8gQXNzb2NpYXRlZCBETUEgYnVmZmVyIHN0cnVjdHVyZQorfSBSVE1QX0RNQUNCLCAqUFJUTVBfRE1BQ0I7CisKK3R5cGVkZWYgc3RydWN0IF9SVE1QX1RYX0JVRgoreworCVBRVUVVRV9FTlRSWSAgICBOZXh0OworCVVDSEFSICAgICAgICAgICBJbmRleDsKKwlVTE9ORyAgICAgICAgICAgICAgICAgICBBbGxvY1NpemU7ICAgICAgICAgIC8vIENvbnRyb2wgYmxvY2sgc2l6ZQorCVBWT0lEICAgICAgICAgICAgICAgICAgIEFsbG9jVmE7ICAgICAgICAgICAgLy8gQ29udHJvbCBibG9jayB2aXJ0dWFsIGFkZHJlc3MKKwlORElTX1BIWVNJQ0FMX0FERFJFU1MgICBBbGxvY1BhOyAgICAgICAgICAgIC8vIENvbnRyb2wgYmxvY2sgcGh5c2ljYWwgYWRkcmVzcworfSBSVE1QX1RYQlVGLCAqUFJUTVBfVFhCVUY7CisKK3R5cGVkZWYgc3RydWN0IF9SVE1QX1JYX0JVRgoreworCUJPT0xFQU4gICAgICAgICAgIEluVXNlOworCVVMT05HICAgICAgICAgICAJQnlCYVJlY0luZGV4OworCVJUTVBfUkVPUkRFUkJVRglNQVBfUlhCdWZbTUFYX1JYX1JFT1JERVJCVUZdOworfSBSVE1QX1JYQlVGLCAqUFJUTVBfUlhCVUY7Cit0eXBlZGVmIHN0cnVjdCBfUlRNUF9UWF9SSU5HCit7CisJUlRNUF9ETUFDQiAgQ2VsbFtUWF9SSU5HX1NJWkVdOworCVVJTlQzMgkJVHhDcHVJZHg7CisJVUlOVDMyCQlUeERtYUlkeDsKKwlVSU5UMzIJCVR4U3dGcmVlSWR4OyAJLy8gc29mdHdhcmUgbmV4dCBmcmVlIHR4IGluZGV4Cit9IFJUTVBfVFhfUklORywgKlBSVE1QX1RYX1JJTkc7CisKK3R5cGVkZWYgc3RydWN0IF9SVE1QX1JYX1JJTkcKK3sKKwlSVE1QX0RNQUNCICBDZWxsW1JYX1JJTkdfU0laRV07CisJVUlOVDMyCQlSeENwdUlkeDsKKwlVSU5UMzIJCVJ4RG1hSWR4OworCUlOVDMyCQlSeFN3UmVhZElkeDsgCS8vIHNvZnR3YXJlIG5leHQgcmVhZCBpbmRleAorfSBSVE1QX1JYX1JJTkcsICpQUlRNUF9SWF9SSU5HOworCit0eXBlZGVmIHN0cnVjdCBfUlRNUF9NR01UX1JJTkcKK3sKKwlSVE1QX0RNQUNCICBDZWxsW01HTVRfUklOR19TSVpFXTsKKwlVSU5UMzIJCVR4Q3B1SWR4OworCVVJTlQzMgkJVHhEbWFJZHg7CisJVUlOVDMyCQlUeFN3RnJlZUlkeDsgLy8gc29mdHdhcmUgbmV4dCBmcmVlIHR4IGluZGV4Cit9IFJUTVBfTUdNVF9SSU5HLCAqUFJUTVBfTUdNVF9SSU5HOworCisvLworLy8gIFN0YXRpc3RpYyBjb3VudGVyIHN0cnVjdHVyZQorLy8KK3R5cGVkZWYgc3RydWN0IF9DT1VOVEVSXzgwMl8zCit7CisJLy8gR2VuZXJhbCBTdGF0cworCVVMT05HICAgICAgIEdvb2RUcmFuc21pdHM7CisJVUxPTkcgICAgICAgR29vZFJlY2VpdmVzOworCVVMT05HICAgICAgIFR4RXJyb3JzOworCVVMT05HICAgICAgIFJ4RXJyb3JzOworCVVMT05HICAgICAgIFJ4Tm9CdWZmZXI7CisKKwkvLyBFdGhlcm5ldCBTdGF0cworCVVMT05HICAgICAgIFJjdkFsaWdubWVudEVycm9yczsKKwlVTE9ORyAgICAgICBPbmVDb2xsaXNpb247CisJVUxPTkcgICAgICAgTW9yZUNvbGxpc2lvbnM7CisKK30gQ09VTlRFUl84MDJfMywgKlBDT1VOVEVSXzgwMl8zOworCit0eXBlZGVmIHN0cnVjdCBfQ09VTlRFUl84MDJfMTEgeworCVVMT05HICAgICAgICAgICBMZW5ndGg7CisJTEFSR0VfSU5URUdFUiAgIExhc3RUcmFuc21pdHRlZEZyYWdtZW50Q291bnQ7CisJTEFSR0VfSU5URUdFUiAgIFRyYW5zbWl0dGVkRnJhZ21lbnRDb3VudDsKKwlMQVJHRV9JTlRFR0VSICAgTXVsdGljYXN0VHJhbnNtaXR0ZWRGcmFtZUNvdW50OworCUxBUkdFX0lOVEVHRVIgICBGYWlsZWRDb3VudDsKKwlMQVJHRV9JTlRFR0VSICAgUmV0cnlDb3VudDsKKwlMQVJHRV9JTlRFR0VSICAgTXVsdGlwbGVSZXRyeUNvdW50OworCUxBUkdFX0lOVEVHRVIgICBSVFNTdWNjZXNzQ291bnQ7CisJTEFSR0VfSU5URUdFUiAgIFJUU0ZhaWx1cmVDb3VudDsKKwlMQVJHRV9JTlRFR0VSICAgQUNLRmFpbHVyZUNvdW50OworCUxBUkdFX0lOVEVHRVIgICBGcmFtZUR1cGxpY2F0ZUNvdW50OworCUxBUkdFX0lOVEVHRVIgICBSZWNlaXZlZEZyYWdtZW50Q291bnQ7CisJTEFSR0VfSU5URUdFUiAgIE11bHRpY2FzdFJlY2VpdmVkRnJhbWVDb3VudDsKKwlMQVJHRV9JTlRFR0VSICAgRkNTRXJyb3JDb3VudDsKK30gQ09VTlRFUl84MDJfMTEsICpQQ09VTlRFUl84MDJfMTE7CisKK3R5cGVkZWYgc3RydWN0IF9DT1VOVEVSX1JBTElOSyB7CisJVUxPTkcgICAgICAgICAgIFRyYW5zbWl0dGVkQnl0ZUNvdW50OyAgIC8vIGJvdGggc3VjY2Vzc2Z1bCBhbmQgZmFpbHVyZSwgdXNlZCB0byBjYWxjdWxhdGUgVFggdGhyb3VnaHB1dAorCVVMT05HICAgICAgICAgICBSZWNlaXZlZEJ5dGVDb3VudDsgICAgICAvLyBib3RoIENSQyBva2F5IGFuZCBDUkMgZXJyb3IsIHVzZWQgdG8gY2FsY3VsYXRlIFJYIHRocm91Z2hwdXQKKwlVTE9ORyAgICAgICAgICAgQmVlbkRpc2Fzc29jaWF0ZWRDb3VudDsKKwlVTE9ORyAgICAgICAgICAgQmFkQ1FJQXV0b1JlY292ZXJ5Q291bnQ7CisJVUxPTkcgICAgICAgICAgIFBvb3JDUUlSb2FtaW5nQ291bnQ7CisJVUxPTkcgICAgICAgICAgIE1nbXRSaW5nRnVsbENvdW50OworCVVMT05HICAgICAgICAgICBSeENvdW50U2luY2VMYXN0TlVMTDsKKwlVTE9ORyAgICAgICAgICAgUnhDb3VudDsKKwlVTE9ORyAgICAgICAgICAgUnhSaW5nRXJyQ291bnQ7CisJVUxPTkcgICAgICAgICAgIEtpY2tUeENvdW50OworCVVMT05HICAgICAgICAgICBUeFJpbmdFcnJDb3VudDsKKwlMQVJHRV9JTlRFR0VSICAgUmVhbEZjc0VyckNvdW50OworCVVMT05HICAgICAgICAgICBQZW5kaW5nTmRpc1BhY2tldENvdW50OworCisJVUxPTkcgICAgICAgICAgIE9uZVNlY09zVHhDb3VudFtOVU1fT0ZfVFhfUklOR107CisJVUxPTkcgICAgICAgICAgIE9uZVNlY0RtYURvbmVDb3VudFtOVU1fT0ZfVFhfUklOR107CisJVUlOVDMyICAgICAgICAgIE9uZVNlY1R4RG9uZUNvdW50OworCVVMT05HICAgICAgICAgICBPbmVTZWNSeENvdW50OworCVVJTlQzMiAgICAgICAgICBPbmVTZWNUeEFnZ3JlZ2F0aW9uQ291bnQ7CisJVUlOVDMyICAgICAgICAgIE9uZVNlY1J4QWdncmVnYXRpb25Db3VudDsKKworCVVJTlQzMiAgIAkJT25lU2VjRnJhbWVEdXBsaWNhdGVDb3VudDsKKworCisJVUlOVDMyICAgICAgICAgIE9uZVNlY1R4Tm9SZXRyeU9rQ291bnQ7CisJVUlOVDMyICAgICAgICAgIE9uZVNlY1R4UmV0cnlPa0NvdW50OworCVVJTlQzMiAgICAgICAgICBPbmVTZWNUeEZhaWxDb3VudDsKKwlVSU5UMzIgICAgICAgICAgT25lU2VjRmFsc2VDQ0FDbnQ7ICAgICAgLy8gQ0NBIGVycm9yIGNvdW50LCBmb3IgZGVidWcgcHVycG9zZSwgbWlnaHQgbW92ZSB0byBnbG9iYWwgY291bnRlcgorCVVJTlQzMiAgICAgICAgICBPbmVTZWNSeE9rQ250OyAgICAgICAgICAvLyBSWCB3aXRob3V0IGVycm9yCisJVUlOVDMyICAgICAgICAgIE9uZVNlY1J4T2tEYXRhQ250OyAgICAgIC8vIHVuaWNhc3QtdG8tbWUgREFUQSBmcmFtZSBjb3VudAorCVVJTlQzMiAgICAgICAgICBPbmVTZWNSeEZjc0VyckNudDsgICAgICAvLyBDUkMgZXJyb3IKKwlVSU5UMzIgICAgICAgICAgT25lU2VjQmVhY29uU2VudENudDsKKwlVSU5UMzIgICAgICAgICAgTGFzdE9uZVNlY1RvdGFsVHhDb3VudDsgLy8gT25lU2VjVHhOb1JldHJ5T2tDb3VudCArIE9uZVNlY1R4UmV0cnlPa0NvdW50ICsgT25lU2VjVHhGYWlsQ291bnQKKwlVSU5UMzIgICAgICAgICAgTGFzdE9uZVNlY1J4T2tEYXRhQ250OyAgLy8gT25lU2VjUnhPa0RhdGFDbnQKKwlVTE9ORwkJRHVwbGljYXRlUmN2OworCVVMT05HCQlUeEFnZ0NvdW50OworCVVMT05HCQlUeE5vbkFnZ0NvdW50OworCVVMT05HCQlUeEFnZzFNUERVQ291bnQ7CisJVUxPTkcJCVR4QWdnMk1QRFVDb3VudDsKKwlVTE9ORwkJVHhBZ2czTVBEVUNvdW50OworCVVMT05HCQlUeEFnZzRNUERVQ291bnQ7CisJVUxPTkcJCVR4QWdnNU1QRFVDb3VudDsKKwlVTE9ORwkJVHhBZ2c2TVBEVUNvdW50OworCVVMT05HCQlUeEFnZzdNUERVQ291bnQ7CisJVUxPTkcJCVR4QWdnOE1QRFVDb3VudDsKKwlVTE9ORwkJVHhBZ2c5TVBEVUNvdW50OworCVVMT05HCQlUeEFnZzEwTVBEVUNvdW50OworCVVMT05HCQlUeEFnZzExTVBEVUNvdW50OworCVVMT05HCQlUeEFnZzEyTVBEVUNvdW50OworCVVMT05HCQlUeEFnZzEzTVBEVUNvdW50OworCVVMT05HCQlUeEFnZzE0TVBEVUNvdW50OworCVVMT05HCQlUeEFnZzE1TVBEVUNvdW50OworCVVMT05HCQlUeEFnZzE2TVBEVUNvdW50OworCisJTEFSR0VfSU5URUdFUiAgICAgICBUcmFuc21pdHRlZE9jdGV0c0luQU1TRFU7CisJTEFSR0VfSU5URUdFUiAgICAgICBUcmFuc21pdHRlZEFNU0RVQ291bnQ7CisJTEFSR0VfSU5URUdFUiAgICAgICBSZWNlaXZlZE9jdGVzSW5BTVNEVUNvdW50OworCUxBUkdFX0lOVEVHRVIgICAgICAgUmVjZWl2ZWRBTVNEVUNvdW50OworCUxBUkdFX0lOVEVHRVIgICAgICAgVHJhbnNtaXR0ZWRBTVBEVUNvdW50OworCUxBUkdFX0lOVEVHRVIgICAgICAgVHJhbnNtaXR0ZWRNUERVc0luQU1QRFVDb3VudDsKKwlMQVJHRV9JTlRFR0VSICAgICAgIFRyYW5zbWl0dGVkT2N0ZXRzSW5BTVBEVUNvdW50OworCUxBUkdFX0lOVEVHRVIgICAgICAgTVBEVUluUmVjZWl2ZWRBTVBEVUNvdW50OworfSBDT1VOVEVSX1JBTElOSywgKlBDT1VOVEVSX1JBTElOSzsKKwordHlwZWRlZiBzdHJ1Y3QgX1BJRF9DT1VOVEVSIHsKKwlVTE9ORyAgICAgICAgICAgVHhBY2tSZXF1aXJlZENvdW50OyAgICAgIC8vIENSQyBlcnJvcgorCVVMT05HICAgICAgICAgICBUeEFnZ3JlQ291bnQ7CisJVUxPTkcgICAgICAgICAgIFR4U3VjY2Vzc0NvdW50OyAvLyBPbmVTZWNUeE5vUmV0cnlPa0NvdW50ICsgT25lU2VjVHhSZXRyeU9rQ291bnQgKyBPbmVTZWNUeEZhaWxDb3VudAorCVVMT05HCQlMYXN0U3VjY2Vzc1JhdGU7Cit9IFBJRF9DT1VOVEVSLCAqUFBJRF9DT1VOVEVSOworCit0eXBlZGVmIHN0cnVjdCBfQ09VTlRFUl9EUlMgeworCS8vIHRvIHJlY29yZCB0aGUgZWFjaCBUWCByYXRlJ3MgcXVhbGl0eS4gMCBpcyBiZXN0LCB0aGUgYmlnZ2VyIHRoZSB3b3JzZS4KKwlVU0hPUlQgICAgICAgICAgVHhRdWFsaXR5W01BWF9TVEVQX09GX1RYX1JBVEVfU1dJVENIXTsKKwlVQ0hBUiAgICAgICAgICAgUEVSW01BWF9TVEVQX09GX1RYX1JBVEVfU1dJVENIXTsKKwlVQ0hBUiAgICAgICAgICAgVHhSYXRlVXBQZW5hbHR5OyAgICAgIC8vIGV4dHJhICMgb2Ygc2Vjb25kIHBlbmFsdHkgZHVlIHRvIGxhc3QgdW5zdGFibGUgY29uZGl0aW9uCisJVUxPTkcgICAgICAgICAgIEN1cnJUeFJhdGVTdGFibGVUaW1lOyAvLyAjIG9mIHNlY29uZCBpbiBjdXJyZW50IFRYIHJhdGUKKwlCT09MRUFOICAgICAgICAgZk5vaXN5RW52aXJvbm1lbnQ7CisJQk9PTEVBTiAgICAgICAgIGZMYXN0U2VjQWNjb3JkaW5nUlNTSTsKKwlVQ0hBUiAgICAgICAgICAgTGFzdFNlY1R4UmF0ZUNoYW5nZUFjdGlvbjsgLy8gMDogbm8gY2hhbmdlLCAxOnJhdGUgVVAsIDI6cmF0ZSBkb3duCisJVUNIQVIJCQlMYXN0VGltZVR4UmF0ZUNoYW5nZUFjdGlvbjsgLy9LZWVwIGxhc3QgdGltZSB2YWx1ZSBvZiBMYXN0U2VjVHhSYXRlQ2hhbmdlQWN0aW9uCisJVUxPTkcJCQlMYXN0VHhPa0NvdW50OworfSBDT1VOVEVSX0RSUywgKlBDT1VOVEVSX0RSUzsKKworLy8KKy8vICBBcmNmb3VyIFN0cnVjdHVyZSBBZGRlZCBieSBQYXVsV3UKKy8vCit0eXBlZGVmIHN0cnVjdCAgX0FSQ0ZPVVIKK3sKKwlVSU5UICAgICAgICAgICAgWDsKKwlVSU5UICAgICAgICAgICAgWTsKKwlVQ0hBUiAgICAgICAgICAgU1RBVEVbMjU2XTsKK30gQVJDRk9VUkNPTlRFWFQsICpQQVJDRk9VUkNPTlRFWFQ7CisKKy8vIE1JTU8gVHggcGFyYW1ldGVyLCBTaG9ydEdJLCBNQ1MsIFNUQkMsIGV0Yy4gIHRoZXNlIGFyZSBmaWVsZHMgaW4gVFhXSSB0b28uIGp1c3QgY29weSB0byBUWFdJLgordHlwZWRlZiBzdHJ1Y3QgIF9SRUNFSVZFX1NFVFRJTkcgeworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwlVU0hPUlQJCU1JTU86MTsKKwlVU0hPUlQJCU9GRE06MTsKKwlVU0hPUlQJCXJzdjozOworCVVTSE9SVAkJU1RCQzoyOwkvL1NQQUNFCisJVVNIT1JUCQlTaG9ydEdJOjE7CisJVVNIT1JUCQlNb2RlOjI7CS8vY2hhbm5lbCBiYW5kd2lkdGggMjBNSHogb3IgNDAgTUh6CisJVVNIT1JUICAgCU51bU9mUlg6MjsgICAgICAgICAgICAgICAgIC8vIE1JTU8uIFdFIEhBVkUgM1IKKyNlbHNlCisJVVNIT1JUICAgCU51bU9mUlg6MjsgICAgICAgICAgICAgICAgIC8vIE1JTU8uIFdFIEhBVkUgM1IKKwlVU0hPUlQJCU1vZGU6MjsJLy9jaGFubmVsIGJhbmR3aWR0aCAyME1IeiBvciA0MCBNSHoKKwlVU0hPUlQJCVNob3J0R0k6MTsKKwlVU0hPUlQJCVNUQkM6MjsJLy9TUEFDRQorCVVTSE9SVAkJcnN2OjM7CisJVVNIT1JUCQlPRkRNOjE7CisJVVNIT1JUCQlNSU1POjE7CisjZW5kaWYKKyB9IFJFQ0VJVkVfU0VUVElORywgKlBSRUNFSVZFX1NFVFRJTkc7CisKKy8vIFNoYXJlZCBrZXkgZGF0YSBzdHJ1Y3R1cmUKK3R5cGVkZWYgc3RydWN0ICBfV0VQX0tFWSB7CisJVUNIQVIgICBLZXlMZW47ICAgICAgICAgICAgICAgICAgICAgLy8gS2V5IGxlbmd0aCBmb3IgZWFjaCBrZXksIDA6IGVudHJ5IGlzIGludmFsaWQKKwlVQ0hBUiAgIEtleVtNQVhfTEVOX09GX0tFWV07ICAgICAgICAvLyByaWdodCBub3cgd2UgaW1wbGVtZW50IDQga2V5cywgMTI4IGJpdHMgbWF4Cit9IFdFUF9LRVksICpQV0VQX0tFWTsKKwordHlwZWRlZiBzdHJ1Y3QgX0NJUEhFUl9LRVkgeworCVVDSEFSICAgS2V5WzE2XTsgICAgICAgICAgICAvLyByaWdodCBub3cgd2UgaW1wbGVtZW50IDQga2V5cywgMTI4IGJpdHMgbWF4CisJVUNIQVIgICBSeE1pY1s4XTsJCQkvLyBtYWtlIGFsaWdubWVudAorCVVDSEFSICAgVHhNaWNbOF07CisJVUNIQVIgICBUeFRzY1s2XTsgICAgICAgICAgIC8vIDQ4Yml0IFRTQyB2YWx1ZQorCVVDSEFSICAgUnhUc2NbNl07ICAgICAgICAgICAvLyA0OGJpdCBUU0MgdmFsdWUKKwlVQ0hBUiAgIENpcGhlckFsZzsgICAgICAgICAgLy8gMC1ub25lLCAxOldFUDY0LCAyOldFUDEyOCwgMzpUS0lQLCA0OkFFUywgNTpDS0lQNjQsIDY6Q0tJUDEyOAorCVVDSEFSICAgS2V5TGVuOworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCVVDSEFSICAgQnNzSWRbNl07CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisgICAgICAgICAgICAvLyBLZXkgbGVuZ3RoIGZvciBlYWNoIGtleSwgMDogZW50cnkgaXMgaW52YWxpZAorCVVDSEFSICAgVHlwZTsgICAgICAgICAgICAgICAvLyBJbmRpY2F0ZSBQYWlyd2lzZS9Hcm91cCB3aGVuIHJlcG9ydGluZyBNSUMgZXJyb3IKK30gQ0lQSEVSX0tFWSwgKlBDSVBIRVJfS0VZOworCit0eXBlZGVmIHN0cnVjdCBfQkJQX1RVTklOR19TVFJVQ1QgeworCUJPT0xFQU4gICAgIEVuYWJsZTsKKwlVQ0hBUiAgICAgICBGYWxzZUNjYUNvdW50VXBwZXJCb3VuZDsgIC8vIDEwMCBwZXIgc2VjCisJVUNIQVIgICAgICAgRmFsc2VDY2FDb3VudExvd2VyQm91bmQ7ICAvLyAxMCBwZXIgc2VjCisJVUNIQVIgICAgICAgUjE3TG93ZXJCb3VuZDsgICAgICAgICAgICAvLyBzcGVjaWZpZWQgaW4gRTJQUk9NCisJVUNIQVIgICAgICAgUjE3VXBwZXJCb3VuZDsgICAgICAgICAgICAvLyAweDY4IGFjY29yZGluZyB0byBEYXZpZCBUdW5nCisJVUNIQVIgICAgICAgQ3VycmVudFIxN1ZhbHVlOworfSBCQlBfVFVOSU5HLCAqUEJCUF9UVU5JTkc7CisKK3R5cGVkZWYgc3RydWN0IF9TT0ZUX1JYX0FOVF9ESVZFUlNJVFlfU1RSVUNUIHsKKwlVQ0hBUiAgICAgRXZhbHVhdGVQZXJpb2Q7CQkgLy8gMDpub3QgZXZhbHV0ZSBzdGF0dXMsIDE6IGV2YWx1YXRlIHN0YXR1cywgMjogc3dpdGNoaW5nIHN0YXR1cworCVVDSEFSICAgICBQYWlyMVByaW1hcnlSeEFudDsgICAgIC8vIDA6QW50LUUxLCAxOkFudC1FMgorCVVDSEFSICAgICBQYWlyMVNlY29uZGFyeVJ4QW50OyAgIC8vIDA6QW50LUUxLCAxOkFudC1FMgorCVVDSEFSICAgICBQYWlyMlByaW1hcnlSeEFudDsgICAgIC8vIDA6QW50LUUzLCAxOkFudC1FNAorCVVDSEFSICAgICBQYWlyMlNlY29uZGFyeVJ4QW50OyAgIC8vIDA6QW50LUUzLCAxOkFudC1FNAorCVNIT1JUICAgICBQYWlyMUF2Z1Jzc2lbMl07ICAgICAgIC8vIEF2Z1Jzc2lbMF06RTEsIEF2Z1Jzc2lbMV06RTIKKwlTSE9SVCAgICAgUGFpcjJBdmdSc3NpWzJdOyAgICAgICAvLyBBdmdSc3NpWzBdOkUzLCBBdmdSc3NpWzFdOkU0CisJU0hPUlQgICAgIFBhaXIxTGFzdEF2Z1Jzc2k7ICAgICAgLy8KKwlTSE9SVCAgICAgUGFpcjJMYXN0QXZnUnNzaTsgICAgICAvLworCVVMT05HICAgICBSY3ZQa3ROdW1XaGVuRXZhbHVhdGU7CisJQk9PTEVBTiAgIEZpcnN0UGt0QXJyaXZlZFdoZW5FdmFsdWF0ZTsKKwlSQUxJTktfVElNRVJfU1RSVUNUICAgIFJ4QW50RGl2ZXJzaXR5VGltZXI7Cit9IFNPRlRfUlhfQU5UX0RJVkVSU0lUWSwgKlBTT0ZUX1JYX0FOVF9ESVZFUlNJVFk7CisKK3R5cGVkZWYgc3RydWN0IF9MRUFQX0FVVEhfSU5GTyB7CisJQk9PTEVBTiAgICAgICAgIEVuYWJsZWQ7ICAgICAgICAvL1R1cmU6IEVuYWJsZSBMRUFQIEF1dGhlbnRpY2F0aW9uCisJQk9PTEVBTiAgICAgICAgIENDS007ICAgICAgICAgICAvL1R1cmU6IFVzZSBGYXN0IFJlYXV0aGVudGljYXRpb24gd2l0aCBDQ0tNCisJVUNIQVIgICAgICAgICAgIFJlc2VydmVbMl07CisJVUNIQVIgICAgICAgICAgIFVzZXJOYW1lWzI1Nl07ICAvL0xFQVAsIFVzZXIgbmFtZQorCVVMT05HICAgICAgICAgICBVc2VyTmFtZUxlbjsKKwlVQ0hBUiAgICAgICAgICAgUGFzc3dvcmRbMjU2XTsgIC8vTEVBUCwgVXNlciBQYXNzd29yZAorCVVMT05HICAgICAgICAgICBQYXNzd29yZExlbjsKK30gTEVBUF9BVVRIX0lORk8sICpQTEVBUF9BVVRIX0lORk87CisKK3R5cGVkZWYgc3RydWN0IHsKKwlVQ0hBUiAgICAgICAgQWRkcltNQUNfQUREUl9MRU5dOworCVVDSEFSICAgICAgICBFcnJvckNvZGVbMl07ICAvLzAwIDAxLUludmFsaWQgYXV0aGVudGljYXRpb24gdHlwZQorCQkJCQkJCQkvLzAwIDAyLUF1dGhlbnRpY2F0aW9uIHRpbWVvdXQKKwkJCQkJCQkJLy8wMCAwMy1DaGFsbGVuZ2UgZnJvbSBBUCBmYWlsZWQKKwkJCQkJCQkJLy8wMCAwNC1DaGFsbGVuZ2UgdG8gQVAgZmFpbGVkCisJQk9PTEVBTiAgICAgIFJlcG9ydGVkOworfSBST0dVRUFQX0VOVFJZLCAqUFJPR1VFQVBfRU5UUlk7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlVQ0hBUiAgICAgICAgICAgICAgIFJvZ3VlQXBOcjsKKwlST0dVRUFQX0VOVFJZICAgICAgIFJvZ3VlQXBFbnRyeVtNQVhfTEVOX09GX0JTU19UQUJMRV07Cit9IFJPR1VFQVBfVEFCTEUsICpQUk9HVUVBUF9UQUJMRTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCUJPT0xFQU4gICAgIEVuYWJsZTsKKwlVQ0hBUiAgICAgICBEZWx0YTsKKwlCT09MRUFOICAgICBQbHVzU2lnbjsKK30gQ0NLX1RYX1BPV0VSX0NBTElCUkFURSwgKlBDQ0tfVFhfUE9XRVJfQ0FMSUJSQVRFOworCisvLworLy8gUmVjZWl2ZSBUdXBsZSBDYWNoZSBGb3JtYXQKKy8vCit0eXBlZGVmIHN0cnVjdCAgX1RVUExFX0NBQ0hFICAgIHsKKwlCT09MRUFOICAgICAgICAgVmFsaWQ7CisJVUNIQVIgICAgICAgICAgIE1hY0FkZHJlc3NbTUFDX0FERFJfTEVOXTsKKwlVU0hPUlQgICAgICAgICAgU2VxdWVuY2U7CisJVVNIT1JUICAgICAgICAgIEZyYWc7Cit9IFRVUExFX0NBQ0hFLCAqUFRVUExFX0NBQ0hFOworCisvLworLy8gRnJhZ21lbnQgRnJhbWUgc3RydWN0dXJlCisvLwordHlwZWRlZiBzdHJ1Y3QgIF9GUkFHTUVOVF9GUkFNRSB7CisJUE5ESVNfUEFDS0VUICAgIHBGcmFnUGFja2V0OworCVVMT05HICAgICAgIFJ4U2l6ZTsKKwlVU0hPUlQgICAgICBTZXF1ZW5jZTsKKwlVU0hPUlQgICAgICBMYXN0RnJhZzsKKwlVTE9ORyAgICAgICBGbGFnczsgICAgICAgICAgLy8gU29tZSBleHRyYSBmcmFtZSBpbmZvcm1hdGlvbi4gYml0IDA6IExMQyBwcmVzZW50ZWQKK30gRlJBR01FTlRfRlJBTUUsICpQRlJBR01FTlRfRlJBTUU7CisKKworLy8KKy8vIFBhY2tldCBpbmZvcm1hdGlvbiBmb3IgTmRpc1F1ZXJ5UGFja2V0CisvLwordHlwZWRlZiBzdHJ1Y3QgIF9QQUNLRVRfSU5GTyAgICB7CisJVUlOVCAgICAgICAgICAgIFBoeXNpY2FsQnVmZmVyQ291bnQ7ICAgIC8vIFBoeXNpY2FsIGJyZWFrcyBvZiBidWZmZXIgZGVzY3JpcG9yIGNoYWluZWQKKwlVSU5UICAgICAgICAgICAgQnVmZmVyQ291bnQgOyAgICAgICAgICAgLy8gTnVtYmVyIG9mIEJ1ZmZlciBkZXNjcmlwdG9yIGNoYWluZWQKKwlVSU5UICAgICAgICAgICAgVG90YWxQYWNrZXRMZW5ndGggOyAgICAgLy8gU2VsZiBleHBsYWluZWQKKwlQTkRJU19CVUZGRVIgICAgcEZpcnN0QnVmZmVyOyAgICAgICAgICAgLy8gUG9pbnRlciB0byBmaXJzdCBidWZmZXIgZGVzY3JpcHRvcgorfSBQQUNLRVRfSU5GTywgKlBQQUNLRVRfSU5GTzsKKworLy8KKy8vIFRraXAgS2V5IHN0cnVjdHVyZSB3aGljaCBSQzQga2V5ICYgTUlDIGNhbGN1bGF0aW9uCisvLwordHlwZWRlZiBzdHJ1Y3QgIF9US0lQX0tFWV9JTkZPICB7CisJVUlOVCAgICAgICAgbkJ5dGVzSW5NOyAgLy8gIyBieXRlcyBpbiBNIGZvciBNSUNLRVkKKwlVTE9ORyAgICAgICBJVjE2OworCVVMT05HICAgICAgIElWMzI7CisJVUxPTkcgICAgICAgSzA7ICAgICAgICAgLy8gZm9yIE1JQ0tFWSBMb3cKKwlVTE9ORyAgICAgICBLMTsgICAgICAgICAvLyBmb3IgTUlDS0VZIEhpZworCVVMT05HICAgICAgIEw7ICAgICAgICAgIC8vIEN1cnJlbnQgc3RhdGUgZm9yIE1JQ0tFWQorCVVMT05HICAgICAgIFI7ICAgICAgICAgIC8vIEN1cnJlbnQgc3RhdGUgZm9yIE1JQ0tFWQorCVVMT05HICAgICAgIE07ICAgICAgICAgIC8vIE1lc3NhZ2UgYWNjdW11bGF0b3IgZm9yIE1JQ0tFWQorCVVDSEFSICAgICAgIFJDNEtFWVsxNl07CisJVUNIQVIgICAgICAgTUlDWzhdOworfSBUS0lQX0tFWV9JTkZPLCAqUFRLSVBfS0VZX0lORk87CisKKy8vCisvLyBQcml2YXRlIC8gTWlzYyBkYXRhLCBjb3VudGVycyBmb3IgZHJpdmVyIGludGVybmFsIHVzZQorLy8KK3R5cGVkZWYgc3RydWN0ICBfX1BSSVZBVEVfU1RSVUMgeworCVVJTlQgICAgICAgU3lzdGVtUmVzZXRDbnQ7ICAgICAgICAgLy8gU3lzdGVtIHJlc2V0IGNvdW50ZXIKKwlVSU5UICAgICAgIFR4UmluZ0Z1bGxDbnQ7ICAgICAgICAgIC8vIFR4IHJpbmcgZnVsbCBvY2N1cnJhbmNlIG51bWJlcgorCVVJTlQgICAgICAgUGh5UnhFcnJDbnQ7ICAgICAgICAgICAgLy8gUEhZIFJ4IGVycm9yIGNvdW50LCBmb3IgZGVidWcgcHVycG9zZSwgbWlnaHQgbW92ZSB0byBnbG9iYWwgY291bnRlcgorCS8vIFZhcmlhYmxlcyBmb3IgV0VQIGVuY3J5cHRpb24gLyBkZWNyeXB0aW9uIGluIHJ0bXBfd2VwLmMKKwlVSU5UICAgICAgIEZDU0NSQzMyOworCUFSQ0ZPVVJDT05URVhUICBXRVBDT05URVhUOworCS8vIFRraXAgc3R1ZmYKKwlUS0lQX0tFWV9JTkZPICAgVHg7CisJVEtJUF9LRVlfSU5GTyAgIFJ4OworfSBQUklWQVRFX1NUUlVDLCAqUFBSSVZBVEVfU1RSVUM7CisKKy8vIHN0cnVjdHVyZSB0byB0dW5lIEJCUCBSNjYgKEJCUCBUVU5JTkcpCit0eXBlZGVmIHN0cnVjdCBfQkJQX1I2Nl9UVU5JTkcgeworCUJPT0xFQU4gICAgIGJFbmFibGU7CisJVVNIT1JUICAgICAgRmFsc2VDY2FMb3dlclRocmVzaG9sZDsgIC8vIGRlZmF1bHQgMTAwCisJVVNIT1JUICAgICAgRmFsc2VDY2FVcHBlclRocmVzaG9sZDsgIC8vIGRlZmF1bHQgNTEyCisJVUNIQVIgICAgICAgUjY2RGVsdGE7CisJVUNIQVIgICAgICAgUjY2Q3VycmVudFZhbHVlOworCUJPT0xFQU4JCVI2Nkxvd2VyVXBwZXJTZWxlY3Q7IC8vQmVmb3JlIExpbmtVcCwgVXNlZCBMb3dlckJvdW5kIG9yIFVwcGVyQm91bmQgYXMgUjY2IHZhbHVlLgorfSBCQlBfUjY2X1RVTklORywgKlBCQlBfUjY2X1RVTklORzsKKworLy8gc3RydWN0dXJlIHRvIHN0b3JlIGNoYW5uZWwgVFggcG93ZXIKK3R5cGVkZWYgc3RydWN0IF9DSEFOTkVMX1RYX1BPV0VSIHsKKwlVU0hPUlQgICAgIFJlbWFpbmluZ1RpbWVGb3JVc2U7CQkvL3VuaXQ6IHNlYworCVVDSEFSICAgICAgQ2hhbm5lbDsKKyNpZmRlZiBET1QxMU5fRFJBRlQzCisJQk9PTEVBTiAgICAgICBiRWZmZWN0ZWRDaGFubmVsOwkvLyBGb3IgQlcgNDAgb3BlcmF0aW5nIGluIDIuNEdIeiAsIHRoZSAiZWZmZWN0ZWQgY2hhbm5lbCIgaXMgdGhlIGNoYW5uZWwgdGhhdCBpcyBjb3ZlcmVkIGluIDQwTWh6LgorI2VuZGlmIC8vIERPVDExTl9EUkFGVDMgLy8KKwlDSEFSICAgICAgIFBvd2VyOworCUNIQVIgICAgICAgUG93ZXIyOworCVVDSEFSICAgICAgTWF4VHhQd3I7CisJVUNIQVIgICAgICBEZnNSZXE7Cit9IENIQU5ORUxfVFhfUE9XRVIsICpQQ0hBTk5FTF9UWF9QT1dFUjsKKworLy8gc3RydWN0dXJlIHRvIHN0b3JlIDgwMi4xMWogY2hhbm5lbCBUWCBwb3dlcgordHlwZWRlZiBzdHJ1Y3QgX0NIQU5ORUxfMTFKX1RYX1BPV0VSIHsKKwlVQ0hBUiAgICAgIENoYW5uZWw7CisJVUNIQVIgICAgICBCVzsJLy8gQldfMTAgb3IgQldfMjAKKwlDSEFSICAgICAgIFBvd2VyOworCUNIQVIgICAgICAgUG93ZXIyOworCVVTSE9SVCAgICAgUmVtYWluaW5nVGltZUZvclVzZTsJCS8vdW5pdDogc2VjCit9IENIQU5ORUxfMTFKX1RYX1BPV0VSLCAqUENIQU5ORUxfMTFKX1RYX1BPV0VSOworCit0eXBlZGVmIGVudW0gX0FCR0JBTkRfU1RBVEVfIHsKKwlVTktOT1dOX0JBTkQsCisJQkdfQkFORCwKKwlBX0JBTkQsCit9IEFCR0JBTkRfU1RBVEU7CisKK3R5cGVkZWYgc3RydWN0IF9NTE1FX1NUUlVDVCB7CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJLy8gU1RBIHN0YXRlIG1hY2hpbmVzCisJU1RBVEVfTUFDSElORSAgICAgICAgICAgQ250bE1hY2hpbmU7CisJU1RBVEVfTUFDSElORSAgICAgICAgICAgQXNzb2NNYWNoaW5lOworCVNUQVRFX01BQ0hJTkUgICAgICAgICAgIEF1dGhNYWNoaW5lOworCVNUQVRFX01BQ0hJTkUgICAgICAgICAgIEF1dGhSc3BNYWNoaW5lOworCVNUQVRFX01BQ0hJTkUgICAgICAgICAgIFN5bmNNYWNoaW5lOworCVNUQVRFX01BQ0hJTkUgICAgICAgICAgIFdwYVBza01hY2hpbmU7CisJU1RBVEVfTUFDSElORSAgICAgICAgICAgTGVhcE1hY2hpbmU7CisJU1RBVEVfTUFDSElORSAgICAgICAgICAgQWlyb25ldE1hY2hpbmU7CisJU1RBVEVfTUFDSElORV9GVU5DICAgICAgQXNzb2NGdW5jW0FTU09DX0ZVTkNfU0laRV07CisJU1RBVEVfTUFDSElORV9GVU5DICAgICAgQXV0aEZ1bmNbQVVUSF9GVU5DX1NJWkVdOworCVNUQVRFX01BQ0hJTkVfRlVOQyAgICAgIEF1dGhSc3BGdW5jW0FVVEhfUlNQX0ZVTkNfU0laRV07CisJU1RBVEVfTUFDSElORV9GVU5DICAgICAgU3luY0Z1bmNbU1lOQ19GVU5DX1NJWkVdOworCVNUQVRFX01BQ0hJTkVfRlVOQyAgICAgIFdwYVBza0Z1bmNbV1BBX1BTS19GVU5DX1NJWkVdOworCVNUQVRFX01BQ0hJTkVfRlVOQyAgICAgIEFpcm9uZXRGdW5jW0FJUk9ORVRfRlVOQ19TSVpFXTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwlTVEFURV9NQUNISU5FX0ZVTkMgICAgICBBY3RGdW5jW0FDVF9GVU5DX1NJWkVdOworCS8vIEFjdGlvbgorCVNUQVRFX01BQ0hJTkUgICAgICAgICAgIEFjdE1hY2hpbmU7CisKKworI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCVNUQVRFX01BQ0hJTkUJCQlEbHNNYWNoaW5lOworCVNUQVRFX01BQ0hJTkVfRlVOQyAgICAgIERsc0Z1bmNbRExTX0ZVTkNfU0laRV07CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisKKworCisKKwlVTE9ORyAgICAgICAgICAgICAgICAgICBDaGFubmVsUXVhbGl0eTsgIC8vIDAuLjEwMCwgQ2hhbm5lbCBRdWFsaXR5IEluZGljYXRpb24gZm9yIFJvYW1pbmcKKwlVTE9ORyAgICAgICAgICAgICAgICAgICBOb3czMjsgICAgICAgICAgIC8vIGxhdGNoIHRoZSB2YWx1ZSBvZiBOZGlzR2V0U3lzdGVtVXBUaW1lKCkKKwlVTE9ORyAgICAgICAgICAgICAgICAgICBMYXN0U2VuZE5VTExwc21UaW1lOworCisJQk9PTEVBTiAgICAgICAgICAgICAgICAgYlJ1bm5pbmc7CisJTkRJU19TUElOX0xPQ0sgICAgICAgICAgVGFza0xvY2s7CisJTUxNRV9RVUVVRSAgICAgICAgICAgICAgUXVldWU7CisKKwlVSU5UICAgICAgICAgICAgICAgICAgICBTaGlmdFJlZzsKKworCVJBTElOS19USU1FUl9TVFJVQ1QgICAgIFBlcmlvZGljVGltZXI7CisJUkFMSU5LX1RJTUVSX1NUUlVDVCAgICAgQVBTRFBlcmlvZGljVGltZXI7CisJUkFMSU5LX1RJTUVSX1NUUlVDVCAgICAgTGlua0Rvd25UaW1lcjsKKwlSQUxJTktfVElNRVJfU1RSVUNUICAgICBMaW5rVXBUaW1lcjsKKyNpZmRlZiBSVDI4NjAKKyAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICBiUHNQb2xsVGltZXJSdW5uaW5nOworICAgIFJBTElOS19USU1FUl9TVFJVQ1QgICAgIFBzUG9sbFRpbWVyOworCVJBTElOS19USU1FUl9TVFJVQ1QgICAgIFJhZGlvT25PZmZUaW1lcjsKKyNlbmRpZiAvLyBSVDI4NjAgLy8KKwlVTE9ORyAgICAgICAgICAgICAgICAgICBQZXJpb2RpY1JvdW5kOworCVVMT05HICAgICAgICAgICAgICAgICAgIE9uZVNlY1BlcmlvZGljUm91bmQ7CisKKwlVQ0hBUgkJCQkJUmVhbFJ4UGF0aDsKKwlCT09MRUFOCQkJCQliTG93VGhyb3VnaHB1dDsKKwlCT09MRUFOCQkJCQliRW5hYmxlQXV0b0FudGVubmFDaGVjazsKKwlSQUxJTktfVElNRVJfU1RSVUNUCQlSeEFudEV2YWxUaW1lcjsKKworCit9IE1MTUVfU1RSVUNULCAqUE1MTUVfU1RSVUNUOworCisvLyBzdHJ1Y3R1cmUgZm9yIHJhZGFyIGRldGVjdGlvbiBhbmQgY2hhbm5lbCBzd2l0Y2gKK3R5cGVkZWYgc3RydWN0IF9SQURBUl9ERVRFQ1RfU1RSVUNUIHsKKwlVQ0hBUgkJQ1NDb3VudDsJCQkvL0NoYW5uZWwgc3dpdGNoIGNvdW50ZXIKKwlVQ0hBUgkJQ1NQZXJpb2Q7CQkJLy9DaGFubmVsIHN3aXRjaCBwZXJpb2QgKGJlYWNvbiBjb3VudCkKKwlVQ0hBUgkJUkRDb3VudDsJCQkvL1JhZGFyIGRldGVjdGlvbiBjb3VudGVyCisJVUNIQVIJCVJETW9kZTsJCQkJLy9SYWRhciBEZXRlY3Rpb24gbW9kZQorCVVDSEFSCQlSRER1clJlZ2lvbjsJCS8vUmFkYXIgZGV0ZWN0aW9uIGR1cmF0aW9uIHJlZ2lvbgorCVVDSEFSCQlCQlBSMTY7CisJVUNIQVIJCUJCUFIxNzsKKwlVQ0hBUgkJQkJQUjE4OworCVVDSEFSCQlCQlBSMjE7CisJVUNIQVIJCUJCUFIyMjsKKwlVQ0hBUgkJQkJQUjY0OworCVVMT05HCQlJblNlcnZpY2VNb25pdG9yQ291bnQ7IC8vIHVuaXQ6IHNlYworCVVJTlQ4CQlEZnNTZXNzaW9uVGltZTsKKwlCT09MRUFOCQliRmFzdERmczsKKwlVSU5UOAkJQ2hNb3ZpbmdUaW1lOworCVVJTlQ4CQlMb25nUHVsc2VSYWRhclRoOworfSBSQURBUl9ERVRFQ1RfU1RSVUNULCAqUFJBREFSX0RFVEVDVF9TVFJVQ1Q7CisKKyNpZmRlZiBDQVJSSUVSX0RFVEVDVElPTl9TVVBQT1JUCit0eXBlZGVmIGVudW0gQ0RfU1RBVEVfbgoreworCUNEX05PUk1BTCwKKwlDRF9TSUxFTkNFLAorCUNEX01BWF9TVEFURQorfSBDRF9TVEFURTsKKwordHlwZWRlZiBzdHJ1Y3QgQ0FSUklFUl9ERVRFQ1RJT05fcworeworCUJPT0xFQU4JCQkJCUVuYWJsZTsKKwlVSU5UOAkJCQkJQ0RTZXNzaW9uVGltZTsKKwlVSU5UOAkJCQkJQ0RQZXJpb2Q7CisJQ0RfU1RBVEUJCQkJQ0RfU3RhdGU7Cit9IENBUlJJRVJfREVURUNUSU9OLCAqUENBUlJJRVJfREVURUNUSU9OOworI2VuZGlmIC8vIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQgLy8KKwordHlwZWRlZiBlbnVtIF9SRUNfQkxPQ0tBQ0tfU1RBVFVTCit7CisgICAgUmVjaXBpZW50X05PTkU9MCwKKwlSZWNpcGllbnRfVVNFRCwKKwlSZWNpcGllbnRfSGFuZGxlUmVzLAorICAgIFJlY2lwaWVudF9BY2NlcHQKK30gUkVDX0JMT0NLQUNLX1NUQVRVUywgKlBSRUNfQkxPQ0tBQ0tfU1RBVFVTOworCit0eXBlZGVmIGVudW0gX09SSV9CTE9DS0FDS19TVEFUVVMKK3sKKyAgICBPcmlnaW5hdG9yX05PTkU9MCwKKwlPcmlnaW5hdG9yX1VTRUQsCisgICAgT3JpZ2luYXRvcl9XYWl0UmVzLAorICAgIE9yaWdpbmF0b3JfRG9uZQorfSBPUklfQkxPQ0tBQ0tfU1RBVFVTLCAqUE9SSV9CTE9DS0FDS19TVEFUVVM7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKK3R5cGVkZWYgc3RydWN0IF9CQV9PUklfRU5UUll7CisJVUNIQVIgICBXY2lkOworCVVDSEFSICAgVElEOworCVVDSEFSICAgQkFXaW5TaXplOworCVVDSEFSICAgVG9rZW47CisvLyBTZXF1ZW5jZSBpcyB0byBmaWxsIGV2ZXJ5IG91dGdvaW5nIFFvUyBEQVRBIGZyYW1lJ3Mgc2VxdWVuY2UgZmllbGQgaW4gODAyLjExIGhlYWRlci4KKwlVU0hPUlQJU2VxdWVuY2U7CisJVVNIT1JUCVRpbWVPdXRWYWx1ZTsKKwlPUklfQkxPQ0tBQ0tfU1RBVFVTICBPUklfQkFfU3RhdHVzOworCVJBTElOS19USU1FUl9TVFJVQ1QgT1JJQkFUaW1lcjsKKwlQVk9JRAlwQWRhcHRlcjsKK30gQkFfT1JJX0VOVFJZLCAqUEJBX09SSV9FTlRSWTsKKwordHlwZWRlZiBzdHJ1Y3QgX0JBX1JFQ19FTlRSWSB7CisJVUNIQVIgICBXY2lkOworCVVDSEFSICAgVElEOworCVVDSEFSICAgQkFXaW5TaXplOwkvLyA3LjMuMS4xNC4gZWFjaCBidWZmZXIgaXMgY2FwYWJsZSBvZiBob2xkaW5nIGEgbWF4IEFNU0RVIG9yIE1TRFUuCisJVVNIT1JUCQlMYXN0SW5kU2VxOworCVVTSE9SVAkJVGltZU91dFZhbHVlOworCVJBTElOS19USU1FUl9TVFJVQ1QgUkVDQkFUaW1lcjsKKwlVTE9ORwkJTGFzdEluZFNlcUF0VGltZXI7CisJVUxPTkcJCW5Ecm9wUGFja2V0OworCVVMT05HCQlyY3ZTZXE7CisJUkVDX0JMT0NLQUNLX1NUQVRVUyAgUkVDX0JBX1N0YXR1czsKKwlORElTX1NQSU5fTE9DSyAgICAgICAgICBSeFJlUmluZ0xvY2s7ICAgICAgICAgICAgICAgICAvLyBSeCBSaW5nIHNwaW5sb2NrCisJUFZPSUQJcEFkYXB0ZXI7CisJc3RydWN0IHJlb3JkZXJpbmdfbGlzdAlsaXN0OworfSBCQV9SRUNfRU5UUlksICpQQkFfUkVDX0VOVFJZOworCisKK3R5cGVkZWYgc3RydWN0IHsKKwlVTE9ORwkJbnVtQXNSZWNpcGllbnQ7CQkvLyBJIGFtIHJlY2lwaWVudCBvZiBudW1Bc1JlY2lwaWVudCBjbGllbnRzLiBUaGVzZSBjbGllbnQgYXJlIGluIHRoZSBCQVJlY0VudHJ5W10KKwlVTE9ORwkJbnVtQXNPcmlnaW5hdG9yOwkvLyBJIGFtIG9yaWdpbmF0b3Igb2YgCW51bUFzT3JpZ2luYXRvciBjbGllbnRzLiBUaGVzZSBjbGllbnRzIGFyZSBpbiB0aGUgQkFPcmlFbnRyeVtdCisJQkFfT1JJX0VOVFJZICAgICAgIEJBT3JpRW50cnlbTUFYX0xFTl9PRl9CQV9PUklfVEFCTEVdOworCUJBX1JFQ19FTlRSWSAgICAgICBCQVJlY0VudHJ5W01BWF9MRU5fT0ZfQkFfUkVDX1RBQkxFXTsKK30gQkFfVEFCTEUsICpQQkFfVEFCTEU7CisKKy8vRm9yIFF1cmV5QkFUYWJsZU9JRCB1c2U7Cit0eXBlZGVmIHN0cnVjdCAgUEFDS0VEIF9PSURfQkFfUkVDX0VOVFJZeworCVVDSEFSICAgTUFDQWRkcltNQUNfQUREUl9MRU5dOworCVVDSEFSICAgQmFCaXRtYXA7ICAgLy8gaWYgKEJhQml0bWFwJigxPDxUSUQpKSwgdGhpcyBzZXNzaW9uIHdpdGh7TUFDQWRkciwgVElEfWV4aXN0cywgc28gcmVhZCBCdWZTaXplW1RJRF0gZm9yIEJ1ZmZlclNpemUKKwlVQ0hBUiAgIHJzdjsKKwlVQ0hBUiAgIEJ1ZlNpemVbOF07CisJUkVDX0JMT0NLQUNLX1NUQVRVUwlSRUNfQkFfU3RhdHVzWzhdOworfSBPSURfQkFfUkVDX0VOVFJZLCAqUE9JRF9CQV9SRUNfRU5UUlk7CisKKy8vRm9yIFF1cmV5QkFUYWJsZU9JRCB1c2U7Cit0eXBlZGVmIHN0cnVjdCAgUEFDS0VEIF9PSURfQkFfT1JJX0VOVFJZeworCVVDSEFSICAgTUFDQWRkcltNQUNfQUREUl9MRU5dOworCVVDSEFSICAgQmFCaXRtYXA7ICAvLyBpZiAoQmFCaXRtYXAmKDE8PFRJRCkpLCB0aGlzIHNlc3Npb24gd2l0aHtNQUNBZGRyLCBUSUR9ZXhpc3RzLCBzbyByZWFkIEJ1ZlNpemVbVElEXSBmb3IgQnVmZmVyU2l6ZSwgcmVhZCBPUklfQkFfU3RhdHVzW1RJRF0gZm9yIHN0YXR1cworCVVDSEFSICAgcnN2OworCVVDSEFSICAgQnVmU2l6ZVs4XTsKKwlPUklfQkxPQ0tBQ0tfU1RBVFVTICBPUklfQkFfU3RhdHVzWzhdOworfSBPSURfQkFfT1JJX0VOVFJZLCAqUE9JRF9CQV9PUklfRU5UUlk7CisKK3R5cGVkZWYgc3RydWN0IF9RVUVSWUJBX1RBQkxFeworCU9JRF9CQV9PUklfRU5UUlkgICAgICAgQkFPcmlFbnRyeVszMl07CisJT0lEX0JBX1JFQ19FTlRSWSAgICAgICBCQVJlY0VudHJ5WzMyXTsKKwlVQ0hBUiAgIE9yaU51bTsvLyBOdW1iZXIgb2YgYmVsb3cgQkFPcmlFbnRyeQorCVVDSEFSICAgUmVjTnVtOy8vIE51bWJlciBvZiBiZWxvdyBCQVJlY0VudHJ5Cit9IFFVRVJZQkFfVEFCTEUsICpQUVVFUllCQV9UQUJMRTsKKwordHlwZWRlZgl1bmlvbglfQkFDQVBfU1RSVUMJeworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwlzdHJ1Y3QJeworCQlVSU5UMzIgICAgIDo0OworCQlVSU5UMzIgICAgIGIyMDQwQ29leGlzdFNjYW5TdXA6MTsJCS8vQXMgU3RhLCBzdXBwb3J0IGRvIDIwNDAgY29leGlzdGVuY2Ugc2NhbiBmb3IgQVAuIEFzIEFwLCBzdXBwb3J0IG1vbml0b3IgdHJpZ2dlciBldmVudCB0byBjaGVjayBpZiBjYW4gdXNlIEJXIDQwTUh6LgorCQlVSU5UMzIgICAgIGJIdEFkaG9jOjE7CQkJLy8gYWRob2MgY2FuIHVzZSBodCByYXRlLgorCQlVSU5UMzIgICAgIE1NUFNtb2RlOjI7CS8vIE1JTU8gcG93ZXIgc2F2ZSBtb3JlLCAwOnN0YXRpYywgMTpkeW5hbWljLCAyOnJzdiwgMzptaW1vIGVuYWJsZQorCQlVSU5UMzIgICAgIEFtc2R1U2l6ZToxOwkvLyAwOjM4MzksIDE6NzkzNSBieXRlcy4gVUlOVCAgTVNEVVNpemVUb0J5dGVzW10JPSB7IDM4MzksIDc5MzV9OworCQlVSU5UMzIgICAgIEFtc2R1RW5hYmxlOjE7CS8vRW5hYmxlIEFNU0RVIHRyYW5zbWlzc3Rpb24KKwkJVUlOVDMyCQlNcGR1RGVuc2l0eTozOworCQlVSU5UMzIJCVBvbGljeToyOwkvLyAwOiBERUxBWV9CQSAxOklNTUVEX0JBICAoLy9CQSBQb2xpY3kgc3ViZmlsZWQgdmFsdWUgaW4gQUREQkEgZnJhbWUpICAgMjpCQS1ub3QgdXNlCisJCVVJTlQzMgkJQXV0b0JBOjE7CS8vIGF1dG9tYXRpY2FsbHkgQkEKKwkJVUlOVDMyCQlUeEJBV2luTGltaXQ6ODsKKwkJVUlOVDMyCQlSeEJBV2luTGltaXQ6ODsKKwl9CWZpZWxkOworI2Vsc2UKKwlzdHJ1Y3QJeworCQlVSU5UMzIJCVJ4QkFXaW5MaW1pdDo4OworCQlVSU5UMzIJCVR4QkFXaW5MaW1pdDo4OworCQlVSU5UMzIJCUF1dG9CQToxOwkvLyBhdXRvbWF0aWNhbGx5IEJBCisJCVVJTlQzMgkJUG9saWN5OjI7CS8vIDA6IERFTEFZX0JBIDE6SU1NRURfQkEgICgvL0JBIFBvbGljeSBzdWJmaWxlZCB2YWx1ZSBpbiBBRERCQSBmcmFtZSkgICAyOkJBLW5vdCB1c2UKKwkJVUlOVDMyCQlNcGR1RGVuc2l0eTozOworCQlVSU5UMzIgICAgICAgCUFtc2R1RW5hYmxlOjE7CS8vRW5hYmxlIEFNU0RVIHRyYW5zbWlzc3Rpb24KKwkJVUlOVDMyICAgICAgIAlBbXNkdVNpemU6MTsJLy8gMDozODM5LCAxOjc5MzUgYnl0ZXMuIFVJTlQgIE1TRFVTaXplVG9CeXRlc1tdCT0geyAzODM5LCA3OTM1fTsKKwkJVUlOVDMyICAgICAgIAlNTVBTbW9kZToyOwkvLyBNSU1PIHBvd2VyIHNhdmUgbW9yZSwgMDpzdGF0aWMsIDE6ZHluYW1pYywgMjpyc3YsIDM6bWltbyBlbmFibGUKKwkJVUlOVDMyICAgICAgIAliSHRBZGhvYzoxOwkJCS8vIGFkaG9jIGNhbiB1c2UgaHQgcmF0ZS4KKwkJVUlOVDMyICAgICAgIAliMjA0MENvZXhpc3RTY2FuU3VwOjE7CQkvL0FzIFN0YSwgc3VwcG9ydCBkbyAyMDQwIGNvZXhpc3RlbmNlIHNjYW4gZm9yIEFQLiBBcyBBcCwgc3VwcG9ydCBtb25pdG9yIHRyaWdnZXIgZXZlbnQgdG8gY2hlY2sgaWYgY2FuIHVzZSBCVyA0ME1Iei4KKwkJVUlOVDMyICAgICAgIAk6NDsKKwl9CWZpZWxkOworI2VuZGlmCisJVUlOVDMyCQkJd29yZDsKK30gQkFDQVBfU1RSVUMsICpQQkFDQVBfU1RSVUM7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKy8vVGhpcyBzdHJ1Y3R1cmUgaXMgZm9yIGFsbCA4MDIuMTFuIGNhcmQgSW50ZXJPcHRpYmlsaXR5VGVzdCBhY3Rpb24uIFJlc2V0IGFsbCBOdW0gZXZlcnkgbiBzZWNvbmQuICAoRGV0YWlscyBzZWUgTUxNRVBlcmlvZGljKQordHlwZWRlZglzdHJ1Y3QJX0lPVF9TVFJVQwl7CisJVUNIQVIJCQlUaHJlc2hvbGRbMl07CisJVUNIQVIJCQlSZW9yZGVyVGltZU91dE51bVtNQVhfTEVOX09GX0JBX1JFQ19UQUJMRV07CS8vIGNvbXBhcmUgd2l0aCB0aHJlc2hvbGRbMF0KKwlVQ0hBUgkJCVJlZnJlc2hOdW1bTUFYX0xFTl9PRl9CQV9SRUNfVEFCTEVdOwkvLyBjb21wYXJlIHdpdGggdGhyZXNob2xkWzFdCisJVUxPTkcJCQlPbmVTZWNJbldpbmRvd0NvdW50OworCVVMT05HCQkJT25lU2VjRnJhbWVEdXBsaWNhdGVDb3VudDsKKwlVTE9ORwkJCU9uZVNlY091dFdpbmRvd0NvdW50OworCVVDSEFSCQkJRGVsT3JpQWN0OworCVVDSEFSCQkJRGVsUmVjQWN0OworCVVDSEFSCQkJUlRTU2hvcnRQcm90OworCVVDSEFSCQkJUlRTTG9uZ1Byb3Q7CisJQk9PTEVBTgkJCWJSVFNMb25nUHJvdE9uOworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUJPT0xFQU4JCQliTGFzdEF0aGVyb3M7CisgICAgQk9PTEVBTgkJCWJDdXJyZW50QXRoZXJvczsKKyAgICBCT09MRUFOICAgICAgICAgYk5vd0F0aGVyb3NCdXJzdE9uOworCUJPT0xFQU4JCQliTmV4dERpc2FibGVSeEJBOworICAgIEJPT0xFQU4JCQliVG9nZ2xlOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworfSBJT1RfU1RSVUMsICpQSU9UX1NUUlVDOworCisvLyBUaGlzIGlzIHRoZSByZWdpc3RyeSBzZXR0aW5nIGZvciA4MDIuMTFuIHRyYW5zbWl0IHNldHRpbmcuICBVc2VkIGluIGFkdmFuY2VkIHBhZ2UuCit0eXBlZGVmIHVuaW9uIF9SRUdfVFJBTlNNSVRfU0VUVElORyB7CisjaWZkZWYgUlRfQklHX0VORElBTgorIHN0cnVjdCB7CisgICAgICAgICBVSU5UMzIgIHJzdjoxMzsKKwkJIFVJTlQzMiAgRVhUQ0hBOjI7CisJCSBVSU5UMzIgIEhUTU9ERToxOworCQkgVUlOVDMyICBUUkFOU05POjI7CisJCSBVSU5UMzIgIFNUQkM6MTsgLy9TUEFDRQorCQkgVUlOVDMyICBTaG9ydEdJOjE7CisJCSBVSU5UMzIgIEJXOjE7IC8vY2hhbm5lbCBiYW5kd2lkdGggMjBNSHogb3IgNDAgTUh6CisJCSBVSU5UMzIgIFR4QkY6MTsgLy8gMyozCisJCSBVSU5UMzIgIHJzdjA6MTA7CisgICAgfSBmaWVsZDsKKyNlbHNlCisgc3RydWN0IHsKKwkJIFVJTlQzMiAgcnN2MDoxMDsKKwkJIFVJTlQzMiAgVHhCRjoxOworICAgICAgICAgVUlOVDMyICBCVzoxOyAvL2NoYW5uZWwgYmFuZHdpZHRoIDIwTUh6IG9yIDQwIE1IegorICAgICAgICAgVUlOVDMyICBTaG9ydEdJOjE7CisgICAgICAgICBVSU5UMzIgIFNUQkM6MTsgLy9TUEFDRQorICAgICAgICAgVUlOVDMyICBUUkFOU05POjI7CisgICAgICAgICBVSU5UMzIgIEhUTU9ERToxOworICAgICAgICAgVUlOVDMyICBFWFRDSEE6MjsKKyAgICAgICAgIFVJTlQzMiAgcnN2OjEzOworICAgIH0gZmllbGQ7CisjZW5kaWYKKyBVSU5UMzIgICB3b3JkOworfSBSRUdfVFJBTlNNSVRfU0VUVElORywgKlBSRUdfVFJBTlNNSVRfU0VUVElORzsKKwordHlwZWRlZiB1bmlvbiAgX0RFU0lSRURfVFJBTlNNSVRfU0VUVElORyB7CisjaWZkZWYgUlRfQklHX0VORElBTgorCXN0cnVjdAl7CisJCQlVU0hPUlQJCXJzdjozOworCQkJVVNIT1JUCQlGaXhlZFR4TW9kZToyOwkJCS8vIElmIE1DUyBpc24ndCBBVVRPLCBmaXggcmF0ZSBpbiBDQ0ssIE9GRE0gb3IgSFQgbW9kZS4KKwkJCVVTSE9SVAkJUGh5TW9kZTo0OworCQkJVVNIT1JUICAgCU1DUzo3OyAgICAgICAgICAgICAgICAgLy8gTUNTCisJfQlmaWVsZDsKKyNlbHNlCisJc3RydWN0CXsKKwkJCVVTSE9SVCAgIAlNQ1M6NzsgICAgICAgICAgICAgICAgIAkvLyBNQ1MKKwkJCVVTSE9SVAkJUGh5TW9kZTo0OworCQkJVVNIT1JUCSAJRml4ZWRUeE1vZGU6MjsJCQkvLyBJZiBNQ1MgaXNuJ3QgQVVUTywgZml4IHJhdGUgaW4gQ0NLLCBPRkRNIG9yIEhUIG1vZGUuCisJCQlVU0hPUlQJCXJzdjozOworCX0JZmllbGQ7CisjZW5kaWYKKwlVU0hPUlQJCXdvcmQ7CisgfSBERVNJUkVEX1RSQU5TTUlUX1NFVFRJTkcsICpQREVTSVJFRF9UUkFOU01JVF9TRVRUSU5HOworCit0eXBlZGVmIHN0cnVjdCB7CisJQk9PTEVBTgkJSXNSZWNpcGllbnQ7CisJVUNIQVIgICBNQUNBZGRyW01BQ19BRERSX0xFTl07CisJVUNIQVIgICBUSUQ7CisJVUNIQVIgICBuTVNEVTsKKwlVU0hPUlQgICBUaW1lT3V0OworCUJPT0xFQU4gYkFsbFRpZDsgIC8vIElmIFRydWUsIGRlbGV0ZSBhbGwgVElEIGZvciBCQSBzZXNzaW9ucyB3aXRoIHRoaXMgTUFDYWRkci4KK30gT0lEX0FERF9CQV9FTlRSWSwgKlBPSURfQUREX0JBX0VOVFJZOworCisvLworLy8gTXVsdGlwbGUgU1NJRCBzdHJ1Y3R1cmUKKy8vCisjZGVmaW5lIFdMQU5fTUFYX05VTV9PRl9USU0JCQkoKE1BWF9MRU5fT0ZfTUFDX1RBQkxFID4+IDMpICsgMSkgLyogLzggKyAxICovCisjZGVmaW5lIFdMQU5fQ1RfVElNX0JDTUNfT0ZGU0VUCQkwIC8qIHVuaXQ6IDMyQiAqLworCisvKiBjbGVhciBiY21jIFRJTSBiaXQgKi8KKyNkZWZpbmUgV0xBTl9NUl9USU1fQkNNQ19DTEVBUihhcGlkeCkgXAorCXBBZC0+QXBDZmcuTUJTU0lEW2FwaWR4XS5UaW1CaXRtYXBzW1dMQU5fQ1RfVElNX0JDTUNfT0ZGU0VUXSAmPSB+QklUOFswXTsKKworLyogc2V0IGJjbWMgVElNIGJpdCAqLworI2RlZmluZSBXTEFOX01SX1RJTV9CQ01DX1NFVChhcGlkeCkgXAorCXBBZC0+QXBDZmcuTUJTU0lEW2FwaWR4XS5UaW1CaXRtYXBzW1dMQU5fQ1RfVElNX0JDTUNfT0ZGU0VUXSB8PSBCSVQ4WzBdOworCisvKiBjbGVhciBhIHN0YXRpb24gUFMgVElNIGJpdCAqLworI2RlZmluZSBXTEFOX01SX1RJTV9CSVRfQ0xFQVIoYWRfcCwgYXBpZHgsIHdjaWQpIFwKKwl7CVVDSEFSIHRpbV9vZmZzZXQgPSB3Y2lkID4+IDM7IFwKKwkJVUNIQVIgYml0X29mZnNldCA9IHdjaWQgJiAweDc7IFwKKwkJYWRfcC0+QXBDZmcuTUJTU0lEW2FwaWR4XS5UaW1CaXRtYXBzW3RpbV9vZmZzZXRdICY9ICh+QklUOFtiaXRfb2Zmc2V0XSk7IH0KKworLyogc2V0IGEgc3RhdGlvbiBQUyBUSU0gYml0ICovCisjZGVmaW5lIFdMQU5fTVJfVElNX0JJVF9TRVQoYWRfcCwgYXBpZHgsIHdjaWQpIFwKKwl7CVVDSEFSIHRpbV9vZmZzZXQgPSB3Y2lkID4+IDM7IFwKKwkJVUNIQVIgYml0X29mZnNldCA9IHdjaWQgJiAweDc7IFwKKwkJYWRfcC0+QXBDZmcuTUJTU0lEW2FwaWR4XS5UaW1CaXRtYXBzW3RpbV9vZmZzZXRdIHw9IEJJVDhbYml0X29mZnNldF07IH0KKworCit0eXBlZGVmIHN0cnVjdCBfTVVMVElTU0lEX1NUUlVDVCB7CisJVUNIQVIJCQkJCQkJCUJzc2lkW01BQ19BRERSX0xFTl07CisgICAgVUNIQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3NpZExlbjsKKyAgICBDSEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTc2lkW01BWF9MRU5fT0ZfU1NJRF07CisgICAgVVNIT1JUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FwYWJpbGl0eUluZm87CisKKyAgICBQTkVUX0RFViAgICAgICAgICAgICAgICAgICAJCQlNU1NJRERldjsKKworCU5ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREUgICAgIEF1dGhNb2RlOworCU5ESVNfODAyXzExX1dFUF9TVEFUVVMgICAgICAgICAgICAgIFdlcFN0YXR1czsKKwlORElTXzgwMl8xMV9XRVBfU1RBVFVTCQkJCUdyb3VwS2V5V2VwU3RhdHVzOworCVdQQV9NSVhfUEFJUl9DSVBIRVIJCQkJCVdwYU1peFBhaXJDaXBoZXI7CisKKwlVTE9ORwkJCQkJCQkJVHhDb3VudDsKKwlVTE9ORwkJCQkJCQkJUnhDb3VudDsKKwlVTE9ORwkJCQkJCQkJUmVjZWl2ZWRCeXRlQ291bnQ7CisJVUxPTkcJCQkJCQkJCVRyYW5zbWl0dGVkQnl0ZUNvdW50OworCVVMT05HCQkJCQkJCQlSeEVycm9yQ291bnQ7CisJVUxPTkcJCQkJCQkJCVJ4RHJvcENvdW50OworCisJSFRUUkFOU01JVF9TRVRUSU5HCQkJCQlIVFBoeU1vZGUsIE1heEhUUGh5TW9kZSwgTWluSFRQaHlNb2RlOy8vIEZvciB0cmFuc21pdCBwaHkgc2V0dGluZyBpbiBUWFdJLgorCVJUX0hUX1BIWV9JTkZPCQkJCQkJRGVzaXJlZEh0UGh5SW5mbzsKKwlERVNJUkVEX1RSQU5TTUlUX1NFVFRJTkcgICAgICAgIAlEZXNpcmVkVHJhbnNtaXRTZXR0aW5nOyAvLyBEZXNpcmVkIHRyYW5zbWl0IHNldHRpbmcuIHRoaXMgaXMgZm9yIHJlYWRpbmcgcmVnaXN0cnkgc2V0dGluZyBvbmx5LiBub3QgdXNlZnVsLgorCUJPT0xFQU4JCQkJCQkJCWJBdXRvVHhSYXRlU3dpdGNoOworCisJVUNIQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdEtleUlkOworCisJVUNIQVIJCQkJCQkJCVR4UmF0ZTsgICAgICAgLy8gUkFURV8xLCBSQVRFXzIsIFJBVEVfNV81LCBSQVRFXzExLCAuLi4KKwlVQ0hBUiAgICAgCQkJCQkJCURlc2lyZWRSYXRlc1tNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFU107Ly8gT0lEXzgwMl8xMV9ERVNJUkVEX1JBVEVTCisJVUNIQVIJCQkJCQkJCURlc2lyZWRSYXRlc0luZGV4OworCVVDSEFSICAgICAJCQkJCQkJTWF4VHhSYXRlOyAgICAgICAgICAgIC8vIFJBVEVfMSwgUkFURV8yLCBSQVRFXzVfNSwgUkFURV8xMQorCisJVUNIQVIJCQkJCQkJCVRpbUJpdG1hcHNbV0xBTl9NQVhfTlVNX09GX1RJTV07CisKKyAgICAvLyBXUEEKKyAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTUtbMzJdOworICAgIFVDSEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBNS1szMl07CisJVUNIQVIJCQkJCQkJCUdUS1szMl07CisgICAgQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUVFRTgwMjFYOworICAgIEJPT0xFQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByZUF1dGg7CisgICAgVUNIQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR05vbmNlWzMyXTsKKyAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb3J0U2VjdXJlZDsKKyAgICBORElTXzgwMl8xMV9QUklWQUNZX0ZJTFRFUiAgICAgICAgICBQcml2YWN5RmlsdGVyOworICAgIFVDSEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJBTkNsYXNzM0RhdGE7CisgICAgVUxPTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSXNvbGF0ZUludGVyU3RhVHJhZmZpYzsKKworICAgIFVDSEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJTTklFX0xlblsyXTsKKyAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSU05fSUVbMl1bTUFYX0xFTl9PRl9SU05JRV07CisKKworICAgIFVDSEFSICAgICAgICAgICAgICAgICAgIAkJCVRpbUlFTG9jYXRpb25JbkJlYWNvbjsKKyAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICAJCQlDYXBhYmlsaXR5SW5mb0xvY2F0aW9uSW5CZWFjb247CisgICAgLy8gb3V0Z29pbmcgQkVBQ09OIGZyYW1lIGJ1ZmZlciBhbmQgY29ycmVzcG9uZGluZyBUWFdJCisJLy8gUFRYV0lfU1RSVUMgICAgICAgICAgICAgICAgICAgICAgICAgICBCZWFjb25UeFdJOyAvLworICAgIENIQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJlYWNvbkJ1ZltNQVhfQkVBQ09OX1NJWkVdOyAvLyBOT1RFOiBCZWFjb25CdWYgc2hvdWxkIGJlIDQtYnl0ZSBhbGlnbmVkCisKKyAgICBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiSGlkZVNzaWQ7CisJVUlOVDE2CQkJCQkJCQlTdGF0aW9uS2VlcEFsaXZlVGltZTsgLy8gdW5pdDogc2Vjb25kCisKKyAgICBVU0hPUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWTEFOX1ZJRDsKKyAgICBVU0hPUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWTEFOX1ByaW9yaXR5OworCisgICAgUlRfODAyXzExX0FDTAkJCQkJCUFjY2Vzc0NvbnRyb2xMaXN0OworCisJLy8gRURDQSBRb3MKKyAgICBCT09MRUFOCQkJCQkJCQliV21tQ2FwYWJsZTsJLy8gMDpkaXNhYmxlIFdNTSwgMTplbmFibGUgV01NCisgICAgQk9PTEVBTgkJCQkJCQkJYkRMU0NhcGFibGU7CS8vIDA6ZGlzYWJsZSBETFMsIDE6ZW5hYmxlIERMUworCisJVUNIQVIgICAgICAgICAgIAkJCQkJRGxzUFRLWzY0XTsJCS8vIER1ZSB0byB3aW5kb3dzIGRpcnZlciBjb3VudCBvbiBtZWV0aW5naG91c2UgdG8gaGFuZGxlIDQtd2F5IHNoYWtlCisKKwkvLyBGb3IgODAyLjF4IGRhZW1vbiBzZXR0aW5nIHBlciBCU1MKKwlVQ0hBUgkJCQkJCQkJcmFkaXVzX3Nydl9udW07CisJUkFESVVTX1NSVl9JTkZPCQkJCQkJcmFkaXVzX3Nydl9pbmZvW01BWF9SQURJVVNfU1JWX05VTV07CisKKyNpZmRlZiBSVEw4NjVYX1NPQworCXVuc2lnbmVkIGludAkJCQkJCW15bGlua2lkOworI2VuZGlmCisKKworCVVJTlQzMgkJCQkJUmN2ZENvbmZsaWN0U3NpZENvdW50OworCVVJTlQzMgkJCQkJUmN2ZFNwb29mZWRBc3NvY1Jlc3BDb3VudDsKKwlVSU5UMzIJCQkJCVJjdmRTcG9vZmVkUmVhc3NvY1Jlc3BDb3VudDsKKwlVSU5UMzIJCQkJCVJjdmRTcG9vZmVkUHJvYmVSZXNwQ291bnQ7CisJVUlOVDMyCQkJCQlSY3ZkU3Bvb2ZlZEJlYWNvbkNvdW50OworCVVJTlQzMgkJCQkJUmN2ZFNwb29mZWREaXNhc3NvY0NvdW50OworCVVJTlQzMgkJCQkJUmN2ZFNwb29mZWRBdXRoQ291bnQ7CisJVUlOVDMyCQkJCQlSY3ZkU3Bvb2ZlZERlYXV0aENvdW50OworCVVJTlQzMgkJCQkJUmN2ZFNwb29mZWRVbmtub3duTWdtdENvdW50OworCVVJTlQzMgkJCQkJUmN2ZFJlcGxheUF0dGFja0NvdW50OworCisJQ0hBUgkJCQkJUnNzaU9mUmN2ZENvbmZsaWN0U3NpZDsKKwlDSEFSCQkJCQlSc3NpT2ZSY3ZkU3Bvb2ZlZEFzc29jUmVzcDsKKwlDSEFSCQkJCQlSc3NpT2ZSY3ZkU3Bvb2ZlZFJlYXNzb2NSZXNwOworCUNIQVIJCQkJCVJzc2lPZlJjdmRTcG9vZmVkUHJvYmVSZXNwOworCUNIQVIJCQkJCVJzc2lPZlJjdmRTcG9vZmVkQmVhY29uOworCUNIQVIJCQkJCVJzc2lPZlJjdmRTcG9vZmVkRGlzYXNzb2M7CisJQ0hBUgkJCQkJUnNzaU9mUmN2ZFNwb29mZWRBdXRoOworCUNIQVIJCQkJCVJzc2lPZlJjdmRTcG9vZmVkRGVhdXRoOworCUNIQVIJCQkJCVJzc2lPZlJjdmRTcG9vZmVkVW5rbm93bk1nbXQ7CisJQ0hBUgkJCQkJUnNzaU9mUmN2ZFJlcGxheUF0dGFjazsKKworCUJPT0xFQU4JCQkJCWJCY25TbnRSZXE7CisJVUNIQVIJCQkJCUJjbkJ1ZklkeDsKK30gTVVMVElTU0lEX1NUUlVDVCwgKlBNVUxUSVNTSURfU1RSVUNUOworCisKKworI2lmZGVmIERPVDExTl9EUkFGVDMKK3R5cGVkZWYgZW51bSBfQlNTMjA0MENPRVhJU1RfRkxBR3sKKwlCU1NfMjA0MF9DT0VYSVNUX0RJU0FCTEUgPSAwLAorCUJTU18yMDQwX0NPRVhJU1RfVElNRVJfRklSRUQgID0gMSwKKwlCU1NfMjA0MF9DT0VYSVNUX0lORk9fU1lOQyA9IDIsCisJQlNTXzIwNDBfQ09FWElTVF9JTkZPX05PVElGWSA9IDQsCit9QlNTMjA0MENPRVhJU1RfRkxBRzsKKyNlbmRpZiAvLyBET1QxMU5fRFJBRlQzIC8vCisKKy8vIGNvbmZpZ3VyYXRpb24gY29tbW9uIHRvIE9QTU9ERV9BUCBhcyB3ZWxsIGFzIE9QTU9ERV9TVEEKK3R5cGVkZWYgc3RydWN0IF9DT01NT05fQ09ORklHIHsKKworCUJPT0xFQU4JCWJDb3VudHJ5RmxhZzsKKwlVQ0hBUgkJQ291bnRyeUNvZGVbM107CisJVUNIQVIJCUdlb2dyYXBoeTsKKwlVQ0hBUiAgICAgICBDb3VudHJ5UmVnaW9uOyAgICAgIC8vIEVudW0gb2YgY291bnRyeSByZWdpb24sIDA6RkNDLCAxOklDLCAyOkVUU0ksIDM6U1BBSU4sIDQ6RnJhbmNlLCA1Ok1LSywgNjpNS0sxLCA3OklzcmFlbAorCVVDSEFSICAgICAgIENvdW50cnlSZWdpb25Gb3JBQmFuZDsJLy8gRW51bSBvZiBjb3VudHJ5IHJlZ2lvbiBmb3IgQSBiYW5kCisJVUNIQVIgICAgICAgUGh5TW9kZTsgICAgICAgICAgICAvLyBQSFlfMTFBLCBQSFlfMTFCLCBQSFlfMTFCR19NSVhFRCwgUEhZX0FCR19NSVhFRAorCVVTSE9SVCAgICAgIERzaWZzOyAgICAgICAgICAgICAgLy8gaW4gdW5pdHMgb2YgdXNlYworCVVMT05HICAgICAgIFBhY2tldEZpbHRlcjsgICAgICAgLy8gUGFja2V0IGZpbHRlciBmb3IgcmVjZWl2aW5nCisKKwlDSEFSICAgICAgICBTc2lkW01BWF9MRU5fT0ZfU1NJRF07IC8vIE5PVCBOVUxMLXRlcm1pbmF0ZWQKKwlVQ0hBUiAgICAgICBTc2lkTGVuOyAgICAgICAgICAgICAgIC8vIHRoZSBhY3R1YWwgc3NpZCBsZW5ndGggaW4gdXNlZAorCVVDSEFSICAgICAgIExhc3RTc2lkTGVuOyAgICAgICAgICAgICAgIC8vIHRoZSBhY3R1YWwgc3NpZCBsZW5ndGggaW4gdXNlZAorCUNIQVIgICAgICAgIExhc3RTc2lkW01BWF9MRU5fT0ZfU1NJRF07IC8vIE5PVCBOVUxMLXRlcm1pbmF0ZWQKKwlVQ0hBUgkJTGFzdEJzc2lkW01BQ19BRERSX0xFTl07CisKKwlVQ0hBUiAgICAgICBCc3NpZFtNQUNfQUREUl9MRU5dOworCVVTSE9SVCAgICAgIEJlYWNvblBlcmlvZDsKKwlVQ0hBUiAgICAgICBDaGFubmVsOworCVVDSEFSICAgICAgIENlbnRyYWxDaGFubmVsOyAgICAJLy8gQ2VudHJhbCBDaGFubmVsIHdoZW4gdXNpbmcgNDBNSHogaXMgaW5kaWNhdGluZy4gbm90IHJlYWwgY2hhbm5lbC4KKworCVVDSEFSICAgICAgIFN1cFJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdOworCVVDSEFSICAgICAgIFN1cFJhdGVMZW47CisJVUNIQVIgICAgICAgRXh0UmF0ZVtNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFU107CisJVUNIQVIgICAgICAgRXh0UmF0ZUxlbjsKKwlVQ0hBUiAgICAgICBEZXNpcmVSYXRlW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXTsgICAgICAvLyBPSURfODAyXzExX0RFU0lSRURfUkFURVMKKwlVQ0hBUiAgICAgICBNYXhEZXNpcmVkUmF0ZTsKKwlVQ0hBUiAgICAgICBFeHBlY3RlZEFDS1JhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdOworCisJVUxPTkcgICAgICAgQmFzaWNSYXRlQml0bWFwOyAgICAgICAgLy8gYmFja3VwIGJhc2ljIHJhdGViaXRtYXAKKworCUJPT0xFQU4JCWJBUFNEQ2FwYWJsZTsKKwlCT09MRUFOCQliSW5TZXJ2aWNlUGVyaW9kOworCUJPT0xFQU4JCWJBUFNEQUNfQkU7CisJQk9PTEVBTgkJYkFQU0RBQ19CSzsKKwlCT09MRUFOCQliQVBTREFDX1ZJOworCUJPT0xFQU4JCWJBUFNEQUNfVk87CisJQk9PTEVBTgkJYk5lZWRTZW5kVHJpZ2dlckZyYW1lOworCUJPT0xFQU4JCWJBUFNERm9yY2VQb3dlclNhdmU7CS8vIEZvcmNlIHBvd2VyIHNhdmUgbW9kZSwgc2hvdWxkIG9ubHkgdXNlIGluIEFQU0QtU1RBVVQKKwlVTE9ORwkJVHJpZ2dlclRpbWVyQ291bnQ7CisJVUNIQVIJCU1heFNQTGVuZ3RoOworCVVDSEFSCQlCQlBDdXJyZW50Qlc7CS8vIEJXXzEwLCAJQldfMjAsIEJXXzQwCisJUkVHX1RSQU5TTUlUX1NFVFRJTkcgICAgICAgIFJlZ1RyYW5zbWl0U2V0dGluZzsgLy9yZWdpc3RyeSB0cmFuc21pdCBzZXR0aW5nLiB0aGlzIGlzIGZvciByZWFkaW5nIHJlZ2lzdHJ5IHNldHRpbmcgb25seS4gbm90IHVzZWZ1bC4KKwlVQ0hBUiAgICAgICBUeFJhdGU7ICAgICAgICAgICAgICAgICAvLyBTYW1lIHZhbHVlIHRvIGZpbGwgaW4gVFhELiBUeFJhdGUgaXMgNi1iaXQKKwlVQ0hBUiAgICAgICBNYXhUeFJhdGU7ICAgICAgICAgICAgICAvLyBSQVRFXzEsIFJBVEVfMiwgUkFURV81XzUsIFJBVEVfMTEKKwlVQ0hBUiAgICAgICBUeFJhdGVJbmRleDsgICAgICAgICAgICAvLyBUeCByYXRlIGluZGV4IGluIFJhdGVTd2l0Y2hUYWJsZQorCVVDSEFSICAgICAgIFR4UmF0ZVRhYmxlU2l6ZTsgICAgICAgIC8vIFZhbGlkIFR4IHJhdGUgdGFibGUgc2l6ZSBpbiBSYXRlU3dpdGNoVGFibGUKKwlVQ0hBUiAgICAgICBNaW5UeFJhdGU7ICAgICAgICAgICAgICAvLyBSQVRFXzEsIFJBVEVfMiwgUkFURV81XzUsIFJBVEVfMTEKKwlVQ0hBUiAgICAgICBSdHNSYXRlOyAgICAgICAgICAgICAgICAvLyBSQVRFX3h4eAorCUhUVFJBTlNNSVRfU0VUVElORwlNbG1lVHJhbnNtaXQ7ICAgLy8gTUdNVCBmcmFtZSBQSFkgcmF0ZSBzZXR0aW5nIHdoZW4gb3BlcmF0aW4gYXQgSHQgcmF0ZS4KKwlVQ0hBUiAgICAgICBNbG1lUmF0ZTsgICAgICAgICAgICAgICAvLyBSQVRFX3h4eCwgdXNlZCB0byBzZW5kIE1MTUUgZnJhbWVzCisJVUNIQVIgICAgICAgQmFzaWNNbG1lUmF0ZTsgICAgICAgICAgLy8gRGVmYXVsdCBSYXRlIGZvciBzZW5kaW5nIE1MTUUgZnJhbWVzCisKKwlVU0hPUlQgICAgICBSdHNUaHJlc2hvbGQ7ICAgICAgICAgICAvLyBpbiB1bml0IG9mIEJZVEUKKwlVU0hPUlQgICAgICBGcmFnbWVudFRocmVzaG9sZDsgICAgICAvLyBpbiB1bml0IG9mIEJZVEUKKworCVVDSEFSICAgICAgIFR4UG93ZXI7ICAgICAgICAgICAgICAgIC8vIGluIHVuaXQgb2YgbVcKKwlVTE9ORyAgICAgICBUeFBvd2VyUGVyY2VudGFnZTsgICAgICAvLyAwfjEwMCAlCisJVUxPTkcgICAgICAgVHhQb3dlckRlZmF1bHQ7ICAgICAgICAgLy8ga2VlcCBmb3IgVHhQb3dlclBlcmNlbnRhZ2UKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCUJBQ0FQX1NUUlVDICAgICAgICBCQUNhcGFiaWxpdHk7IC8vICAgTk8gVVNFID0gMFhGRiAgOyAgSU1NRURfQkEgPTEgIDsgIERFTEFZX0JBPTAKKwlCQUNBUF9TVFJVQyAgICAgICAgUkVHQkFDYXBhYmlsaXR5OyAvLyAgIE5PIFVTRSA9IDBYRkYgIDsgIElNTUVEX0JBID0xICA7ICBERUxBWV9CQT0wCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJSU9UX1NUUlVDCQlJT1Rlc3RQYXJtOwkvLyA4MDIuMTFuIEludGVyT3BiaWxpdHkgVGVzdCBQYXJhbWV0ZXI7CisJVUxPTkcgICAgICAgVHhQcmVhbWJsZTsgICAgICAgICAgICAgLy8gUnQ4MDJfMTFQcmVhbWJsZUxvbmcsIFJ0ODAyXzExUHJlYW1ibGVTaG9ydCwgUnQ4MDJfMTFQcmVhbWJsZUF1dG8KKwlCT09MRUFOICAgICBiVXNlWmVyb1RvRGlzYWJsZUZyYWdtZW50OyAgICAgLy8gTWljcm9zb2Z0IHVzZSAwIGFzIGRpc2FibGUKKwlVTE9ORyAgICAgICBVc2VCR1Byb3RlY3Rpb247ICAgICAgICAvLyAwOiBhdXRvLCAxOiBhbHdheXMgdXNlLCAyOiBhbHdheXMgbm90IHVzZQorCUJPT0xFQU4gICAgIGJVc2VTaG9ydFNsb3RUaW1lOyAgICAgIC8vIDA6IGRpc2FibGUsIDEgLSB1c2Ugc2hvcnQgc2xvdCAoOXVzKQorCUJPT0xFQU4gICAgIGJFbmFibGVUeEJ1cnN0OyAgICAgICAgIC8vIDE6IGVuYmxlIFRYIFBBQ0tFVCBCVVJTVCwgMDogZGlzYWJsZSBUWCBQQUNLRVQgQlVSU1QKKwlCT09MRUFOICAgICBiQWdncmVnYXRpb25DYXBhYmxlOyAgICAgIC8vIDE6IGVuYWJsZSBUWCBhZ2dyZWdhdGlvbiB3aGVuIHRoZSBwZWVyIHN1cHBvcnRzIGl0CisJQk9PTEVBTiAgICAgYlBpZ2d5QmFja0NhcGFibGU7CQkvLyAxOiBlbmFibGUgVFggcGlnZ3ktYmFjayBhY2NvcmRpbmcgTUFDJ3MgdmVyc2lvbgorCUJPT0xFQU4gICAgIGJJRUVFODAyMTFIOwkJCS8vIDE6IGVuYWJsZSBJRUVFODAyLjExaCBzcGVjLgorCVVMT05HCQlEaXNhYmxlT0xCQ0RldGVjdDsJCS8vIDA6IGVuYWJsZSBPTEJDIGRldGVjdDsgMSBkaXNhYmxlIE9MQkMgZGV0ZWN0CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwlCT09MRUFOCQkJCWJSZGc7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJQk9PTEVBTiAgICAgICAgICAgICBiV21tQ2FwYWJsZTsgICAgICAgIC8vIDA6ZGlzYWJsZSBXTU0sIDE6ZW5hYmxlIFdNTQorCVFPU19DQVBBQklMSVRZX1BBUk0gQVBRb3NDYXBhYmlsaXR5OyAgICAvLyBRT1MgY2FwYWJpbGl0eSBvZiB0aGUgY3VycmVudCBhc3NvY2lhdGVkIEFQCisJRURDQV9QQVJNICAgICAgICAgICBBUEVkY2FQYXJtOyAgICAgICAgIC8vIEVEQ0EgcGFyYW1ldGVycyBvZiB0aGUgY3VycmVudCBhc3NvY2lhdGVkIEFQCisJUUJTU19MT0FEX1BBUk0gICAgICBBUFFic3NMb2FkOyAgICAgICAgIC8vIFFCU1MgbG9hZCBvZiB0aGUgY3VycmVudCBhc3NvY2lhdGVkIEFQCisJVUNIQVIgICAgICAgICAgICAgICBBY2tQb2xpY3lbNF07ICAgICAgIC8vIEFDSyBwb2xpY3kgb2YgdGhlIHNwZWNpZmllZCBBQy4gc2VlIEFDS194eHgKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlCT09MRUFOCQkJCWJETFNDYXBhYmxlOwkJLy8gMDpkaXNhYmxlIERMUywgMTplbmFibGUgRExTCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJLy8gYSBiaXRtYXAgb2YgQk9PTEVBTiBmbGFncy4gZWFjaCBiaXQgcmVwcmVzZW50IGFuIG9wZXJhdGlvbiBzdGF0dXMgb2YgYSBwYXJ0aWN1bGFyCisJLy8gQk9PTEVBTiBjb250cm9sLCBlaXRoZXIgT04gb3IgT0ZGLiBUaGVzZSBmbGFncyBzaG91bGQgYWx3YXlzIGJlIGFjY2Vzc2VkIHZpYQorCS8vIE9QU1RBVFVTX1RFU1RfRkxBRygpLCBPUFNUQVRVU19TRVRfRkxBRygpLCBPUF9TVEFUVVNfQ0xFQVJfRkxBRygpIG1hY3Jvcy4KKwkvLyBzZWUgZk9QX1NUQVRVU194eHggaW4gUlRNUF9ERUYuQyBmb3IgZGV0YWlsIGJpdCBkZWZpbml0aW9uCisJVUxPTkcgICAgICAgICAgICAgICBPcFN0YXR1c0ZsYWdzOworCisJQk9PTEVBTgkJCQlOZGlzUmFkaW9TdGF0ZU9mZjsgLy9Gb3IgSENUIDEyLjAsIHNldCB0aGlzIGZsYWcgdG8gVFJVRSBpbnN0ZWFkIG9mIGNhbGxlZCBNbG1lUmFkaW9PZmYuCisJQUJHQkFORF9TVEFURQkJQmFuZFN0YXRlOwkJLy8gRm9yIHNldHRpbmcgQkJQIHVzZWQgb24gQi9HIG9yIEEgbW9kZS4KKworCS8vIElFRUU4MDIuMTFILS1ERlMuCisJUkFEQVJfREVURUNUX1NUUlVDVAlSYWRhckRldGVjdDsKKworI2lmZGVmIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQKKwlDQVJSSUVSX0RFVEVDVElPTgkJQ2FycmllckRldGVjdDsKKyNlbmRpZiAvLyBDQVJSSUVSX0RFVEVDVElPTl9TVVBQT1JUIC8vCisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkvLyBIVAorCVVDSEFSCQkJQkFTaXplOwkJLy8gVVNlciBkZXNpcmVkIEJBV2luZG93U2l6ZS4gU2hvdWxkIG5vdCBleGNlZWQgb3VyIG1heCBjYXBhYmlsaXR5CisJLy9SVF9IVF9DQVBBQklMSVRZCVN1cHBvcnRlZEh0UGh5OworCVJUX0hUX0NBUEFCSUxJVFkJRGVzaXJlZEh0UGh5OworCUhUX0NBUEFCSUxJVFlfSUUJCUh0Q2FwYWJpbGl0eTsKKwlBRERfSFRfSU5GT19JRQkJQWRkSFRJbmZvOwkvLyBVc2VmdWwgYXMgQVAuCisJLy9UaGlzIElFIGlzIHVzZWQgd2l0aCBjaGFubmVsIHN3aXRjaCBhbm5vdW5jZW1lbnQgZWxlbWVudCB3aGVuIGNoYW5naW5nIHRvIGEgbmV3IDQwTUh6LgorCS8vVGhpcyBJRSBpcyBpbmNsdWRlZCBpbiBjaGFubmVsIHN3aXRjaCBhbW1vdW5jZW1lbnQgZnJhbWVzIDcuNC4xLjUsIGJlYWNvbnMsIHByb2JlIFJzcC4KKwlORVdfRVhUX0NIQU5fSUUJTmV3RXh0Q2hhbk9mZnNldDsJLy83LjMuMi4yMEEsIDEgaWYgZXh0ZW5zaW9uIGNoYW5uZWwgaXMgYWJvdmUgdGhlIGNvbnRyb2wgY2hhbm5lbCwgMyBpZiBiZWxvdywgMCBpZiBub3QgcHJlc2VudAorCisjaWZkZWYgRE9UMTFOX0RSQUZUMworCVVDSEFSCQkJCQlCc3MyMDQwQ29leGlzdEZsYWc7CQkvLyBiaXQgMDogYkJzc0NvZXhpc3RUaW1lclJ1bm5pbmcsIGJpdCAxOiBOZWVkU3luY0FkZEh0SW5mby4KKwlSQUxJTktfVElNRVJfU1RSVUNUCUJzczIwNDBDb2V4aXN0VGltZXI7CisKKwkvL1RoaXMgSUUgaXMgdXNlZCBmb3IgMjAvNDAgQlNTIENvZXhpc3RlbmNlLgorCUJTU18yMDQwX0NPRVhJU1RfSUUJCUJTUzIwNDBDb2V4aXN0SW5mbzsKKwkvLyA9PT09PT0gMTFuIEQzLjAgPT09PT09PT09PT09PT09PT09PT09PT0+CisJVVNIT1JUCQkJCQlEb3QxMU9Cc3NTY2FuUGFzc2l2ZUR3ZWxsOwkJCQkvLyBVbml0IDogVFUuIDV+MTAwMAorCVVTSE9SVAkJCQkJRG90MTFPQnNzU2NhbkFjdGl2ZUR3ZWxsOwkJCQkvLyBVbml0IDogVFUuIDEwfjEwMDAKKwlVU0hPUlQJCQkJCURvdDExQnNzV2lkdGhUcmlnZ2VyU2NhbkludDsJCQkvLyBVbml0IDogU2Vjb25kCisJVVNIT1JUCQkJCQlEb3QxMU9Cc3NTY2FuUGFzc2l2ZVRvdGFsUGVyQ2hhbm5lbDsJLy8gVW5pdCA6IFRVLiAyMDB+MTAwMDAKKwlVU0hPUlQJCQkJCURvdDExT0Jzc1NjYW5BY3RpdmVUb3RhbFBlckNoYW5uZWw7CS8vIFVuaXQgOiBUVS4gMjB+MTAwMDAKKwlVU0hPUlQJCQkJCURvdDExQnNzV2lkdGhDaGFuVHJhbkRlbGF5RmFjdG9yOworCVVTSE9SVAkJCQkJRG90MTFPQnNzU2NhbkFjdGl2aXR5VGhyZTsJCQkJLy8gVW5pdCA6IHBlcmNlbnRhZ2UKKworCVVMT05HCQkJCQlEb3QxMUJzc1dpZHRoQ2hhblRyYW5EZWxheTsJCQkvLyBtdWx0aXBsZSBvZiAoRG90MTFCc3NXaWR0aFRyaWdnZXJTY2FuSW50ICogRG90MTFCc3NXaWR0aENoYW5UcmFuRGVsYXlGYWN0b3IpCisJVUxPTkcJCQkJCUNvdW50RG93bkN0cjsJLy8gQ291bnREb3duIENvdW50ZXIgZnJvbSAoRG90MTFCc3NXaWR0aFRyaWdnZXJTY2FuSW50ICogRG90MTFCc3NXaWR0aENoYW5UcmFuRGVsYXlGYWN0b3IpCisKKwlORElTX1NQSU5fTE9DSyAgICAgICAgICBUcmlnZ2VyRXZlbnRUYWJMb2NrOworCUJTU18yMDQwX0NPRVhJU1RfSUUJCUxhc3RCU1NDb2V4aXN0MjA0MDsKKwlCU1NfMjA0MF9DT0VYSVNUX0lFCQlCU1NDb2V4aXN0MjA0MDsKKwlUUklHR0VSX0VWRU5UX1RBQgkJVHJpZ2dlckV2ZW50VGFiOworCVVDSEFSCQkJCQlDaGFubmVsTGlzdElkeDsKKwkvLyA8PT09PT09IDExbiBEMy4wID09PT09PT09PT09PT09PT09PT09PT09CisJQk9PTEVBTgkJCQkJYk92ZXJsYXBTY2FubmluZzsKKyNlbmRpZiAvLyBET1QxMU5fRFJBRlQzIC8vCisKKyAgICBCT09MRUFOICAgICAgICAgICAgICAgICBiSFRQcm90ZWN0OworICAgIEJPT0xFQU4gICAgICAgICAgICAgICAgIGJNSU1PUFNFbmFibGU7CisgICAgQk9PTEVBTgkJCQkJYkJBRGVjbGluZTsKKwlCT09MRUFOCQkJCQliRGlzYWJsZVJlb3JkZXJpbmc7CisJQk9PTEVBTgkJCQkJYkZvcnR5X01oel9JbnRvbGVyYW50OworCUJPT0xFQU4JCQkJCWJFeHRDaGFubmVsU3dpdGNoQW5ub3VuY2VtZW50OworCUJPT0xFQU4JCQkJCWJSY3ZCU1NXaWR0aFRyaWdnZXJFdmVudHM7CisJVUxPTkcJCQkJCUxhc3RSY3ZCU1NXaWR0aFRyaWdnZXJFdmVudHNUaW1lOworCisJVUNIQVIJCQkJCVR4QkFTaXplOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJLy8gRW5hYmxlIHdpcmVsZXNzIGV2ZW50CisJQk9PTEVBTgkJCQliV2lyZWxlc3NFdmVudDsKKwlCT09MRUFOCQkJCWJXaUZpVGVzdDsJCQkJLy8gRW5hYmxlIHRoaXMgcGFyYW1ldGVyIGZvciBXaUZpIHRlc3QKKworCS8vIFR4ICYgUnggU3RyZWFtIG51bWJlciBzZWxlY3Rpb24KKwlVQ0hBUgkJCQlUeFN0cmVhbTsKKwlVQ0hBUgkJCQlSeFN0cmVhbTsKKworCS8vIHRyYW5zbWl0IHBoeSBtb2RlLCB0cmFzbWl0IHJhdGUgZm9yIE11bHRpY2FzdC4KKyNpZmRlZiBNQ0FTVF9SQVRFX1NQRUNJRklDCisJVUNIQVIJCQkJTWNhc3RUcmFuc21pdE1jczsKKwlVQ0hBUgkJCQlNY2FzdFRyYW5zbWl0UGh5TW9kZTsKKyNlbmRpZiAvLyBNQ0FTVF9SQVRFX1NQRUNJRklDIC8vCisKKwlCT09MRUFOICAgICAJCWJIYXJkd2FyZVJhZGlvOyAgICAgLy8gSGFyZHdhcmUgY29udHJvbGxlZCBSYWRpbyBlbmFibGVkCisKKworCisgCU5ESVNfU1BJTl9MT0NLCQkJTWVhc3VyZVJlcVRhYkxvY2s7CisJUE1FQVNVUkVfUkVRX1RBQgkJcE1lYXN1cmVSZXFUYWI7CisKKwlORElTX1NQSU5fTE9DSwkJCVRwY1JlcVRhYkxvY2s7CisJUFRQQ19SRVFfVEFCCQkJcFRwY1JlcVRhYjsKKworCS8vIHRyYW5zbWl0IHBoeSBtb2RlLCB0cmFzbWl0IHJhdGUgZm9yIE11bHRpY2FzdC4KKyNpZmRlZiBNQ0FTVF9SQVRFX1NQRUNJRklDCisJSFRUUkFOU01JVF9TRVRUSU5HCQlNQ2FzdFBoeU1vZGU7CisjZW5kaWYgLy8gTUNBU1RfUkFURV9TUEVDSUZJQyAvLworCisjaWZkZWYgU0lOR0xFX1NLVQorCVVJTlQxNgkJCQkJRGVmaW5lTWF4VHhQd3I7CisjZW5kaWYgLy8gU0lOR0xFX1NLVSAvLworCisKK30gQ09NTU9OX0NPTkZJRywgKlBDT01NT05fQ09ORklHOworCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKy8qIE1vZGlmaWVkIGJ5IFd1IFhpLUt1biA0LzIxLzIwMDYgKi8KKy8vIFNUQSBjb25maWd1cmF0aW9uIGFuZCBzdGF0dXMKK3R5cGVkZWYgc3RydWN0IF9TVEFfQURNSU5fQ09ORklHIHsKKwkvLyBHUk9VUCAxIC0KKwkvLyAgIFVzZXIgY29uZmlndXJhdGlvbiBsb2FkZWQgZnJvbSBSZWdpc3RyeSwgRTJQUk9NIG9yIE9JRF94eHguIFRoZXNlIHNldHRpbmdzIGRlc2NyaWJlCisJLy8gICB0aGUgdXNlciBpbnRlbmRlZCBjb25maWd1cmF0aW9uLCBidXQgbm90IG5lY2Vzc2FyeSBmdWxseSBlcXVhbCB0byB0aGUgZmluYWwKKwkvLyAgIHNldHRpbmdzIGluIEFDVElWRSBCU1MgYWZ0ZXIgbmVnb3RpYXRpb24vY29tcHJvbWl6ZSB3aXRoIHRoZSBCU1MgaG9sZGVyIChlaXRoZXIKKwkvLyAgIEFQIG9yIElCU1MgaG9sZGVyKS4KKwkvLyAgIE9uY2UgaW5pdGlhbGl6ZWQsIHVzZXIgY29uZmlndXJhdGlvbiBjYW4gb25seSBiZSBjaGFuZ2VkIHZpYSBPSURfeHh4CisJVUNIQVIgICAgICAgQnNzVHlwZTsgICAgICAgICAgICAgIC8vIEJTU19JTkZSQSBvciBCU1NfQURIT0MKKwlVU0hPUlQgICAgICBBdGltV2luOyAgICAgICAgICAvLyB1c2VkIHdoZW4gc3RhcnRpbmcgYSBuZXcgSUJTUworCisJLy8gR1JPVVAgMiAtCisJLy8gICBVc2VyIGNvbmZpZ3VyYXRpb24gbG9hZGVkIGZyb20gUmVnaXN0cnksIEUyUFJPTSBvciBPSURfeHh4LiBUaGVzZSBzZXR0aW5ncyBkZXNjcmliZQorCS8vICAgdGhlIHVzZXIgaW50ZW5kZWQgY29uZmlndXJhdGlvbiwgYW5kIHNob3VsZCBiZSBhbHdheXMgYXBwbGllZCB0byB0aGUgZmluYWwKKwkvLyAgIHNldHRpbmdzIGluIEFDVElWRSBCU1Mgd2l0aG91dCBjb21wcm9taXNpbmcgd2l0aCB0aGUgQlNTIGhvbGRlci4KKwkvLyAgIE9uY2UgaW5pdGlhbGl6ZWQsIHVzZXIgY29uZmlndXJhdGlvbiBjYW4gb25seSBiZSBjaGFuZ2VkIHZpYSBPSURfeHh4CisJVUNIQVIgICAgICAgUnNzaVRyaWdnZXI7CisJVUNIQVIgICAgICAgUnNzaVRyaWdnZXJNb2RlOyAgICAgIC8vIFJTU0lfVFJJR0dFUkVEX1VQT05fQkVMT1dfVEhSRVNIT0xEIG9yIFJTU0lfVFJJR0dFUkVEX1VQT05fRVhDQ0VFRF9USFJFU0hPTEQKKwlVU0hPUlQgICAgICBEZWZhdWx0TGlzdGVuQ291bnQ7ICAgLy8gZGVmYXVsdCBsaXN0ZW4gY291bnQ7CisJVUxPTkcgICAgICAgV2luZG93c1Bvd2VyTW9kZTsgICAgICAgICAgIC8vIFBvd2VyIG1vZGUgZm9yIEFDIHBvd2VyCisJVUxPTkcgICAgICAgV2luZG93c0JhdHRlcnlQb3dlck1vZGU7ICAgIC8vIFBvd2VyIG1vZGUgZm9yIGJhdHRlcnkgaWYgZXhpc3RzCisJQk9PTEVBTiAgICAgYldpbmRvd3NBQ0NBTUVuYWJsZTsgICAgICAgIC8vIEVuYWJsZSBDQU0gcG93ZXIgbW9kZSB3aGVuIEFDIG9uCisJQk9PTEVBTiAgICAgYkF1dG9SZWNvbm5lY3Q7ICAgICAgICAgLy8gU2V0IHRvIFRSVUUgd2hlbiBzZXR0aW5nIE9JRF84MDJfMTFfU1NJRCB3aXRoIG5vIG1hdGNoaW5nIEJTU0lECisJVUxPTkcgICAgICAgV2luZG93c1Bvd2VyUHJvZmlsZTsgICAgLy8gV2luZG93cyBwb3dlciBwcm9maWxlLCBmb3IgTkRJUzUuMSBQblAKKworCS8vIE1JQjppZWVlODAyZG90MTEuZG90MTFzbXQoMSkuZG90MTFTdGF0aW9uQ29uZmlnVGFibGUoMSkKKwlVU0hPUlQgICAgICBQc207ICAgICAgICAgICAgICAgICAgLy8gcG93ZXIgbWFuYWdlbWVudCBtb2RlICAgKFBXUl9BQ1RJVkV8UFdSX1NBVkUpCisJVVNIT1JUICAgICAgRGlzYXNzb2NSZWFzb247CisJVUNIQVIgICAgICAgRGlzYXNzb2NTdGFbTUFDX0FERFJfTEVOXTsKKwlVU0hPUlQgICAgICBEZWF1dGhSZWFzb247CisJVUNIQVIgICAgICAgRGVhdXRoU3RhW01BQ19BRERSX0xFTl07CisJVVNIT1JUICAgICAgQXV0aEZhaWxSZWFzb247CisJVUNIQVIgICAgICAgQXV0aEZhaWxTdGFbTUFDX0FERFJfTEVOXTsKKworCU5ESVNfODAyXzExX1BSSVZBQ1lfRklMVEVSICAgICAgICAgIFByaXZhY3lGaWx0ZXI7ICAvLyBQcml2YWN5RmlsdGVyIGVudW0gZm9yIDgwMi4xWAorCU5ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREUgICAgIEF1dGhNb2RlOyAgICAgICAvLyBUaGlzIHNob3VsZCBtYXRjaCB0byB3aGF0ZXZlciBtaWNyb3NvZnQgZGVmaW5lZAorCU5ESVNfODAyXzExX1dFUF9TVEFUVVMgICAgICAgICAgICAgIFdlcFN0YXR1czsKKwlORElTXzgwMl8xMV9XRVBfU1RBVFVTCQkJCU9yaWdXZXBTdGF0dXM7CS8vIE9yaWdpbmFsIHdlcCBzdGF0dXMgc2V0IGZyb20gT0lECisKKwkvLyBBZGQgdG8gc3VwcG9ydCBkaWZmZXJlbnQgY2lwaGVyIHN1aXRlIGZvciBXUEEyL1dQQSBtb2RlCisJTkRJU184MDJfMTFfRU5DUllQVElPTl9TVEFUVVMJCUdyb3VwQ2lwaGVyOwkJLy8gTXVsdGljYXN0IGNpcGhlciBzdWl0ZQorCU5ESVNfODAyXzExX0VOQ1JZUFRJT05fU1RBVFVTCQlQYWlyQ2lwaGVyOwkJCS8vIFVuaWNhc3QgY2lwaGVyIHN1aXRlCisJQk9PTEVBTgkJCQkJCQkJYk1peENpcGhlcjsJCQkvLyBJbmRpY2F0ZSBjdXJyZW50IFBhaXIgJiBHcm91cCB1c2UgZGlmZmVyZW50IGNpcGhlciBzdWl0ZXMKKwlVU0hPUlQJCQkJCQkJCVJzbkNhcGFiaWxpdHk7CisKKwlORElTXzgwMl8xMV9XRVBfU1RBVFVTICAgICAgICAgICAgICBHcm91cEtleVdlcFN0YXR1czsKKworCVVDSEFSCQlQTUtbMzJdOyAgICAgICAgICAgICAgICAvLyBXUEEgUFNLIG1vZGUgUE1LCisJVUNIQVIgICAgICAgUFRLWzY0XTsgICAgICAgICAgICAgICAgLy8gV1BBIFBTSyBtb2RlIFBUSworCVVDSEFSCQlHVEtbMzJdOwkJCQkvLyBHVEsgZnJvbSBhdXRoZW50aWNhdG9yCisJQlNTSURfSU5GTwlTYXZlZFBNS1tQTUtJRF9OT107CisJVUlOVAkJU2F2ZWRQTUtOdW07CQkJLy8gU2F2ZWQgUE1LSUQgbnVtYmVyCisKKwlVQ0hBUgkJRGVmYXVsdEtleUlkOworCisKKwkvLyBXUEEgODAyLjF4IHBvcnQgY29udHJvbCwgV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQsIFdQQV84MDJfMVhfUE9SVF9OT1RfU0VDVVJFRAorCVVDSEFSICAgICAgIFBvcnRTZWN1cmVkOworCisJLy8gRm9yIFdQQSBjb3VudGVybWVhc3VyZXMKKwlVTE9ORyAgICAgICBMYXN0TWljRXJyb3JUaW1lOyAgIC8vIHJlY29yZCBsYXN0IE1JQyBlcnJvciB0aW1lCisJVUxPTkcgICAgICAgTWljRXJyQ250OyAgICAgICAgICAvLyBTaG91bGQgYmUgMCwgMSwgMiwgdGhlbiByZXNldCB0byB6ZXJvIChhZnRlciBkaXNhc3NvaWNpYXRpb24pLgorCUJPT0xFQU4gICAgIGJCbG9ja0Fzc29jOyAgICAgICAgLy8gQmxvY2sgYXNzb2NpYXRlIGF0dGVtcHQgZm9yIDYwIHNlY29uZHMgYWZ0ZXIgY291bnRlciBtZWFzdXJlIG9jY3VycmVkLgorCS8vIEZvciBXUEEtUFNLIHN1cHBsaWNhbnQgc3RhdGUKKwlXUEFfU1RBVEUgICBXcGFTdGF0ZTsgICAgICAgICAgIC8vIERlZmF1bHQgaXMgU1NfTk9UVVNFIGFuZCBoYW5kbGVkIGJ5IG1pY3Jvc29mdCA4MDIuMXgKKwlVQ0hBUiAgICAgICBSZXBsYXlDb3VudGVyWzhdOworCVVDSEFSICAgICAgIEFOb25jZVszMl07ICAgICAgICAgLy8gQU5vbmNlIGZvciBXUEEtUFNLIGZyb20gYXVyaGVudGljYXRvcgorCVVDSEFSICAgICAgIFNOb25jZVszMl07ICAgICAgICAgLy8gU05vbmNlIGZvciBXUEEtUFNLCisKKwlVQ0hBUiAgICAgICBMYXN0U05SMDsgICAgICAgICAgICAgLy8gbGFzdCByZWNlaXZlZCBCRUFDT04ncyBTTlIKKwlVQ0hBUiAgICAgICBMYXN0U05SMTsgICAgICAgICAgICAvLyBsYXN0IHJlY2VpdmVkIEJFQUNPTidzIFNOUiBmb3IgMm5kICBhbnRlbm5hCisJUlNTSV9TQU1QTEUgUnNzaVNhbXBsZTsKKwlVTE9ORyAgICAgICBOdW1PZkF2Z1Jzc2lTYW1wbGU7CisKKwlVTE9ORyAgICAgICBMYXN0QmVhY29uUnhUaW1lOyAgICAgLy8gT1MncyB0aW1lc3RhbXAgb2YgdGhlIGxhc3QgQkVBQ09OIFJYIHRpbWUKKwlVTE9ORyAgICAgICBMYXN0MTFiQmVhY29uUnhUaW1lOyAgLy8gT1MncyB0aW1lc3RhbXAgb2YgdGhlIGxhc3QgMTFCIEJFQUNPTiBSWCB0aW1lCisJVUxPTkcJCUxhc3QxMWdCZWFjb25SeFRpbWU7CS8vIE9TJ3MgdGltZXN0YW1wIG9mIHRoZSBsYXN0IDExRyBCRUFDT04gUlggdGltZQorCVVMT05HCQlMYXN0MjBOQmVhY29uUnhUaW1lOwkvLyBPUydzIHRpbWVzdGFtcCBvZiB0aGUgbGFzdCAyME1IeiBOIEJFQUNPTiBSWCB0aW1lCisKKwlVTE9ORyAgICAgICBMYXN0U2NhblRpbWU7ICAgICAgIC8vIFJlY29yZCBsYXN0IHNjYW4gdGltZSBmb3IgaXNzdWUgQlNTSURfU0NBTl9MSVNUCisJVUxPTkcgICAgICAgU2NhbkNudDsgICAgICAgICAgICAvLyBTY2FuIGNvdW50cyBzaW5jZSBtb3N0IHJlY2VudCBTU0lELCBCU1NJRCwgU0NBTiBPSUQgcmVxdWVzdAorCUJPT0xFQU4gICAgIGJTd1JhZGlvOyAgICAgICAgICAgLy8gU29mdHdhcmUgY29udHJvbGxlZCBSYWRpbyBPbi9PZmYsIFRSVUU6IE9uCisJQk9PTEVBTiAgICAgYkh3UmFkaW87ICAgICAgICAgICAvLyBIYXJkd2FyZSBjb250cm9sbGVkIFJhZGlvIE9uL09mZiwgVFJVRTogT24KKwlCT09MRUFOICAgICBiUmFkaW87ICAgICAgICAgICAgIC8vIFJhZGlvIHN0YXRlLCBBbmQgb2YgU3cgJiBIdyByYWRpbyBzdGF0ZQorCUJPT0xFQU4gICAgIGJIYXJkd2FyZVJhZGlvOyAgICAgLy8gSGFyZHdhcmUgY29udHJvbGxlZCBSYWRpbyBlbmFibGVkCisJQk9PTEVBTiAgICAgYlNob3dIaWRkZW5TU0lEOyAgICAvLyBTaG93IGFsbCBrbm93biBTU0lEIGluIFNTSUQgbGlzdCBnZXQgb3BlcmF0aW9uCisKKyAgICBCT09MRUFOCQlBZGhvY0JPbmx5Sm9pbmVkOwkvLyBJbmRpY2F0ZSBBZGhvYyBCIEpvaW4uCisgICAgQk9PTEVBTgkJQWRob2NCR0pvaW5lZDsJCS8vIEluZGljYXRlIEFkaG9jIEIvRyBKb2luLgorICAgIEJPT0xFQU4JCUFkaG9jMjBOSm9pbmVkOwkJLy8gSW5kaWNhdGUgQWRob2MgMjBNSHogTiBKb2luLgorCisJLy8gTmV3IGZvciBXUEEsIHdpbmRvd3Mgd2FudCB1cyB0byB0byBrZWVwIGFzc29jaWF0aW9uIGluZm9ybWF0aW9uIGFuZAorCS8vIEZpeGVkIElFcyBmcm9tIGxhc3QgYXNzb2NpYXRpb24gcmVzcG9uc2UKKwlORElTXzgwMl8xMV9BU1NPQ0lBVElPTl9JTkZPUk1BVElPTiAgICAgQXNzb2NJbmZvOworCVVTSE9SVCAgICAgICBSZXFWYXJJRUxlbjsgICAgICAgICAgICAgICAgLy8gTGVuZ3RoIG9mIG5leHQgVklFIGluY2x1ZGUgRUlEICYgTGVuZ3RoCisJVUNIQVIgICAgICAgUmVxVmFySUVzW01BWF9WSUVfTEVOXTsJCS8vIFRoZSBjb250ZW50IHNhdmVkIGhlcmUgc2hvdWxkIGJlIGxpdHRsZS1lbmRpYW4gZm9ybWF0LgorCVVTSE9SVCAgICAgICBSZXNWYXJJRUxlbjsgICAgICAgICAgICAgICAgLy8gTGVuZ3RoIG9mIG5leHQgVklFIGluY2x1ZGUgRUlEICYgTGVuZ3RoCisJVUNIQVIgICAgICAgUmVzVmFySUVzW01BWF9WSUVfTEVOXTsKKworCVVDSEFSICAgICAgIFJTTklFX0xlbjsKKwlVQ0hBUiAgICAgICBSU05fSUVbTUFYX0xFTl9PRl9SU05JRV07CS8vIFRoZSBjb250ZW50IHNhdmVkIGhlcmUgc2hvdWxkIGJlIGxpdHRsZS1lbmRpYW4gZm9ybWF0LgorCisJLy8gTmV3IHZhcmlhYmxlcyB1c2VkIGZvciBDQ1ggMS4wCisJQk9PTEVBTiAgICAgICAgICAgICBiQ2tpcE9uOworCUJPT0xFQU4gICAgICAgICAgICAgYkNraXBDbWljT247CisJVUNIQVIgICAgICAgICAgICAgICBDa2lwRmxhZzsKKwlVQ0hBUiAgICAgICAgICAgICAgIEdJVlszXTsgIC8vZm9yIENDWCBpdgorCVVDSEFSICAgICAgICAgICAgICAgUnhTRVFbNF07CisJVUNIQVIgICAgICAgICAgICAgICBUeFNFUVs0XTsKKwlVQ0hBUiAgICAgICAgICAgICAgIENLSVBNSUNbNF07CisJVUNIQVIgICAgICAgICAgICAgICBMZWFwQXV0aE1vZGU7CisJTEVBUF9BVVRIX0lORk8gICAgICBMZWFwQXV0aEluZm87CisJVUNIQVIgICAgICAgICAgICAgICBIYXNoUHdkWzE2XTsKKwlVQ0hBUiAgICAgICAgICAgICAgIE5ldHdvcmtDaGFsbGVuZ2VbOF07CisJVUNIQVIgICAgICAgICAgICAgICBOZXR3b3JrQ2hhbGxlbmdlUmVzcG9uc2VbMjRdOworCVVDSEFSICAgICAgICAgICAgICAgUGVlckNoYWxsZW5nZVs4XTsKKworCVVDSEFSICAgICAgICAgICAgICAgUGVlckNoYWxsZW5nZVJlc3BvbnNlWzI0XTsKKwlVQ0hBUiAgICAgICAgICAgICAgIFNlc3Npb25LZXlbMTZdOyAvL05ldHdvcmsgc2Vzc2lvbiBrZXlzIChOU0spCisJUkFMSU5LX1RJTUVSX1NUUlVDVCBMZWFwQXV0aFRpbWVyOworCVJPR1VFQVBfVEFCTEUgICAgICAgUm9ndWVBcFRhYjsgICAvL0Npc2NvIENDWDEgUm9ndWUgQVAgRGV0ZWN0aW9uCisKKwkvLyBOZXcgY29udHJvbCBmbGFncyBmb3IgQ0NYCisJQ0NYX0NPTlRST0wgICAgICAgICBDQ1hDb250cm9sOyAgICAgICAgICAgICAgICAgLy8gTWFzdGVyIGFkbWluaXN0cmF0aW9uIHN0YXRlCisJQk9PTEVBTiAgICAgICAgICAgICBDQ1hFbmFibGU7ICAgICAgICAgICAgICAgICAgLy8gQWN0dWFsIENDWCBzdGF0ZQorCVVDSEFSICAgICAgICAgICAgICAgQ0NYU2NhbkNoYW5uZWw7ICAgICAgICAgICAgIC8vIFNlbGVjdGVkIGNoYW5uZWwgZm9yIENDWCBiZWFjb24gcmVxdWVzdAorCVVTSE9SVCAgICAgICAgICAgICAgQ0NYU2NhblRpbWU7ICAgICAgICAgICAgICAgIC8vIFRpbWUgb3V0IHRvIHdhaXQgZm9yIGJlYWNvbiBhbmQgcHJvYmUgcmVzcG9uc2UKKwlVQ0hBUiAgICAgICAgICAgICAgIENDWFJlcVR5cGU7ICAgICAgICAgICAgICAgICAvLyBDdXJyZW50IHByb2Nlc3NpbmcgQ0NYIHJlcXVlc3QgdHlwZQorCUJTU19UQUJMRSAgICAgICAgICAgQ0NYQnNzVGFiOyAgICAgICAgICAgICAgICAgIC8vIEJTUyBUYWJsZQorCVVDSEFSICAgICAgICAgICAgICAgRnJhbWVSZXBvcnRCdWZbMjA0OF07ICAgICAgIC8vIEJ1ZmZlciBmb3IgY3JlYXRpbmcgZnJhbWUgcmVwb3J0CisJVVNIT1JUICAgICAgICAgICAgICBGcmFtZVJlcG9ydExlbjsgICAgICAgICAgICAgLy8gQ3VycmVudCBGcmFtZSByZXBvcnQgbGVuZ3RoCisJVUxPTkcgICAgICAgICAgICAgICBDTEJ1c3lCeXRlczsgICAgICAgICAgICAgICAgLy8gU2F2ZSB0aGUgdG90YWwgYnl0ZXMgcmVjZWl2ZWQgZHVybmluZyBjaGFubmVsIGxvYWQgc2NhbiB0aW1lCisJVVNIT1JUICAgICAgICAgICAgICBSUElEZW5zaXR5WzhdOyAgICAgICAgICAgICAgLy8gQXJyYXkgZm9yIFJQSSBkZW5zaXR5IGNvbGxlY3Rpb24KKwkvLyBTdGFydCBhZGRyZXNzIG9mIGVhY2ggQlNTIHRhYmxlIHdpdGhpbiBGcmFtZVJlcG9ydEJ1ZgorCS8vIEl0J3MgaW1wb3J0YW50IHRvIHVwZGF0ZSB0aGUgUnhQb3dlciBvZiB0aGUgY29ycmVzcG9uZGluZyBCc3MKKwlVU0hPUlQgICAgICAgICAgICAgIEJzc1JlcG9ydE9mZnNldFtNQVhfTEVOX09GX0JTU19UQUJMRV07CisJVVNIT1JUICAgICAgICAgICAgICBCZWFjb25Ub2tlbjsgICAgICAgICAgICAgICAgLy8gVG9rZW4gZm9yIGJlYWNvbiByZXBvcnQKKwlVTE9ORyAgICAgICAgICAgICAgIExhc3RCc3NJbmRleDsgICAgICAgICAgICAgICAvLyBNb3N0IGN1cnJlbnQgcmVwb3J0ZWQgQnNzIGluZGV4CisJUk1fUkVRVUVTVF9BQ1RJT04gICBNZWFzdXJlbWVudFJlcXVlc3RbMTZdOyAgICAgLy8gU2F2ZWQgbWVhc3VyZW1lbnQgcmVxdWVzdAorCVVDSEFSICAgICAgICAgICAgICAgUk1SZXFDbnQ7ICAgICAgICAgICAgICAgICAgIC8vIE51bWJlciBvZiBtZWFzdXJlbWVudCByZXF1ZXN0IHNhdmVkLgorCVVDSEFSICAgICAgICAgICAgICAgQ3VycmVudFJNUmVxSWR4OyAgICAgICAgICAgIC8vIE51bWJlciBvZiBtZWFzdXJlbWVudCByZXF1ZXN0IHNhdmVkLgorCUJPT0xFQU4gICAgICAgICAgICAgUGFyYWxsZWxSZXE7ICAgICAgICAgICAgICAgIC8vIFBhcmFsbGVsIG1lYXN1cmVtZW50LCBvbmx5IG9uZSByZXF1ZXN0IHBlcmZvcm1lZCwKKwkJCQkJCQkJCQkJCQkvLyBJdCBtdXN0IGJlIHRoZSBzYW1lIGNoYW5uZWwgd2l0aCBtYXhpbXVtIGR1cmF0aW9uCisJVVNIT1JUICAgICAgICAgICAgICBQYXJhbGxlbER1cmF0aW9uOyAgICAgICAgICAgLy8gTWF4aW11bSBkdXJhdGlvbiBmb3IgcGFyYWxsZWwgbWVhc3VyZW1lbnQKKwlVQ0hBUiAgICAgICAgICAgICAgIFBhcmFsbGVsQ2hhbm5lbDsgICAgICAgICAgICAvLyBPbmx5IG9uZSBjaGFubmVsIHdpdGggcGFyYWxsZWwgbWVhc3VyZW1lbnQKKwlVU0hPUlQgICAgICAgICAgICAgIElBUFBUb2tlbjsgICAgICAgICAgICAgICAgICAvLyBJQVBQIGRpYWxvZyB0b2tlbgorCVVDSEFSICAgICAgICAgICAgICAgQ0NYUW9zRUNXTWluOyAgICAgICAgICAgICAgIC8vIENpc2NvIFFPUyBFQ1dNaW4gZm9yIEFDIDAKKwlVQ0hBUiAgICAgICAgICAgICAgIENDWFFvc0VDV01heDsgICAgICAgICAgICAgICAvLyBDaXNjbyBRT1MgRUNXTWF4IGZvciBBQyAwCisJLy8gSGFjayBmb3IgY2hhbm5lbCBsb2FkIGFuZCBub2lzZSBoaXN0b2dyYW0gcGFyYW1ldGVycworCVVDSEFSICAgICAgICAgICAgICAgTkhGYWN0b3I7ICAgICAgICAgICAgICAgICAgIC8vIFBhcmFtZXRlciBmb3IgTm9pc2UgaGlzdG9ncmFtCisJVUNIQVIgICAgICAgICAgICAgICBDTEZhY3RvcjsgICAgICAgICAgICAgICAgICAgLy8gUGFyYW1ldGVyIGZvciBjaGFubmVsIGxvYWQKKworCVVDSEFSICAgICAgICAgICAgICAgS1JLWzE2XTsgICAgICAgIC8vS2V5IFJlZnJlc2ggS2V5LgorCVVDSEFSICAgICAgICAgICAgICAgQlRLWzMyXTsgICAgICAgIC8vQmFzZSBUcmFuc2llbnQgS2V5CisJQk9PTEVBTiAgICAgICAgICAgICBDQ0tNTGlua1VwRmxhZzsKKwlVTE9ORyAgICAgICAgICAgICAgIENDS01STjsgICAgLy8oUmUpQXNzb2NpYXRpb24gcmVxdWVzdCBudW1iZXIuCisJTEFSR0VfSU5URUdFUiAgICAgICBDQ0tNQmVhY29uQXRKb2luVGltZVN0YW1wOyAgLy9UU0YgdGltZXIgZm9yIFJlLWFzc29jYWl0ZSB0byB0aGUgbmV3IEFQCisJVUNIQVIgICAgICAgICAgICAgICBBaXJvbmV0Q2VsbFBvd2VyTGltaXQ7ICAgICAgLy9pbiBkQm0KKwlVQ0hBUiAgICAgICAgICAgICAgIEFpcm9uZXRJUEFkZHJlc3NbNF07ICAgICAgICAvL2VnLiAxOTIuMTY4LjEuMQorCUJPT0xFQU4gICAgICAgICAgICAgQ0NYQWRqYWNlbnRBUFJlcG9ydEZsYWc7ICAgIC8vZmxhZyBmb3IgZGV0ZXJtaW5pbmcgcmVwb3J0IEFzc29jIExvc3QgdGltZQorCUNIQVIgICAgICAgICAgICAgICAgQ0NYQWRqYWNlbnRBUFNzaWRbTUFYX0xFTl9PRl9TU0lEXTsgLy9BZGphY2VudCBBUCdzIFNTSUQgcmVwb3J0CisJVUNIQVIgICAgICAgICAgICAgICBDQ1hBZGphY2VudEFQU3NpZExlbjsgICAgICAgICAgICAgICAvLyB0aGUgYWN0dWFsIHNzaWQgbGVuZ3RoIGluIHVzZWQKKwlVQ0hBUiAgICAgICAgICAgICAgIENDWEFkamFjZW50QVBCc3NpZFtNQUNfQUREUl9MRU5dOyAgICAgICAgIC8vQWRqYWNlbnQgQVAncyBCU1NJRCByZXBvcnQKKwlVU0hPUlQgICAgICAgICAgICAgIENDWEFkamFjZW50QVBDaGFubmVsOworCVVMT05HICAgICAgICAgICAgICAgQ0NYQWRqYWNlbnRBUExpbmtEb3duVGltZTsgIC8vZm9yIFNwZWMgUzMyLgorCisJUkFMSU5LX1RJTUVSX1NUUlVDVAlTdGFRdWlja1Jlc3BvbmVGb3JSYXRlVXBUaW1lcjsKKwlCT09MRUFOCQkJCVN0YVF1aWNrUmVzcG9uZUZvclJhdGVVcFRpbWVyUnVubmluZzsKKworCVVDSEFSICAgICAgICAgICAJRHRpbUNvdW50OyAgICAgIC8vIDAuLiBEdGltUGVyaW9kLTEKKwlVQ0hBUiAgICAgICAgICAgCUR0aW1QZXJpb2Q7ICAgICAvLyBkZWZhdWx0ID0gMworCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJUlRfODAyXzExX0RMUwkJRExTRW50cnlbTUFYX05VTV9PRl9ETFNfRU5UUlldOworCVVDSEFSCQkJCURsc1JlcGxheUNvdW50ZXJbOF07CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIFRoaXMgaXMgb25seSBmb3IgV0hRTCB0ZXN0LgorCUJPT0xFQU4JCQkJV2hxbFRlc3Q7CisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgUkFMSU5LX1RJTUVSX1NUUlVDVCBXcGFEaXNhc3NvY0FuZEJsb2NrQXNzb2NUaW1lcjsKKyAgICAvLyBGYXN0IFJvYW1pbmcKKwlCT09MRUFOCQkgICAgICAgIGJGYXN0Um9hbWluZzsgICAgICAgLy8gMDpkaXNhYmxlIGZhc3Qgcm9hbWluZywgMTplbmFibGUgZmFzdCByb2FtaW5nCisJQ0hBUgkJICAgICAgICBkQm1Ub1JvYW07ICAgICAgICAgIC8vIHRoZSBjb25kaXRpb24gdG8gcm9hbSB3aGVuIHJlY2VpdmluZyBSc3NpIGxlc3MgdGhhbiB0aGlzIHZhbHVlLiBJdCdzIG5lZ2F0aXZlIHZhbHVlLgorCisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgIEJPT0xFQU4gICAgICAgICAgICAgSUVFRTgwMjFYOworICAgIEJPT0xFQU4gICAgICAgICAgICAgSUVFRTgwMjF4X3JlcXVpcmVkX2tleXM7CisgICAgQ0lQSEVSX0tFWQkgICAgICAgIERlc2lyZVNoYXJlZEtleVs0XTsJLy8gUmVjb3JkIHVzZXIgZGVzaXJlZCBXRVAga2V5cworICAgIFVDSEFSICAgICAgICAgICAgICAgRGVzaXJlU2hhcmVkS2V5SWQ7CisKKyAgICAvLyAwOiBkcml2ZXIgaWdub3JlcyB3cGFfc3VwcGxpY2FudAorICAgIC8vIDE6IHdwYV9zdXBwbGljYW50IGluaXRpYXRlcyBzY2FubmluZyBhbmQgQVAgc2VsZWN0aW9uCisgICAgLy8gMjogZHJpdmVyIHRha2VzIGNhcmUgb2Ygc2Nhbm5pbmcsIEFQIHNlbGVjdGlvbiwgYW5kIElFRUUgODAyLjExIGFzc29jaWF0aW9uIHBhcmFtZXRlcnMKKyAgICBVQ0hBUiAgICAgICAgICAgICAgIFdwYVN1cHBsaWNhbnRVUDsKKwlVQ0hBUgkJCQlXcGFTdXBwbGljYW50U2NhbkNvdW50OworI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKworICAgIENIQVIgICAgICAgICAgICAgICAgZGV2X25hbWVbMTZdOworICAgIFVTSE9SVCAgICAgICAgICAgICAgT3JpRGV2VHlwZTsKKworICAgIEJPT0xFQU4gICAgICAgICAgICAgYlRHbldpZmlUZXN0OworCUJPT0xFQU4JCQkgICAgYlNjYW5SZXFJc0Zyb21XZWJVSTsKKworCUhUVFJBTlNNSVRfU0VUVElORwkJCQlIVFBoeU1vZGUsIE1heEhUUGh5TW9kZSwgTWluSFRQaHlNb2RlOy8vIEZvciB0cmFuc21pdCBwaHkgc2V0dGluZyBpbiBUWFdJLgorCURFU0lSRURfVFJBTlNNSVRfU0VUVElORyAgICAgICAJRGVzaXJlZFRyYW5zbWl0U2V0dGluZzsKKwlSVF9IVF9QSFlfSU5GTwkJCQkJRGVzaXJlZEh0UGh5SW5mbzsKKwlCT09MRUFOCQkJCQkJCWJBdXRvVHhSYXRlU3dpdGNoOworCisjaWZkZWYgUlQyODYwCisgICAgVUNIQVIgICAgICAgQkJQUjM7CisjZW5kaWYgLy8gUlQyODYwIC8vCisKKyNpZmRlZiBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUCisJVUNIQVIJCQkJSUVFRTgwMjExZENsaWVudE1vZGU7CisJVUNIQVIJCQkJU3RhT3JpQ291bnRyeUNvZGVbM107CisJVUNIQVIJCQkJU3RhT3JpR2VvZ3JhcGh5OworI2VuZGlmIC8vIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QgLy8KK30gU1RBX0FETUlOX0NPTkZJRywgKlBTVEFfQURNSU5fQ09ORklHOworCisvLyBUaGlzIGRhdGEgc3RydWN0dXJlIGtlZXAgdGhlIGN1cnJlbnQgYWN0aXZlIEJTUy9JQlNTJ3MgY29uZmlndXJhdGlvbiB0aGF0IHRoaXMgU1RBCisvLyBoYWQgYWdyZWVkIHVwb24gam9pbmluZyB0aGUgbmV0d29yay4gV2hpY2ggbWVhbnMgdGhlc2UgcGFyYW1ldGVycyBhcmUgdXN1YWxseSBkZWNpZGVkCisvLyBieSB0aGUgQlNTL0lCU1MgY3JlYXRvciBpbnN0ZWFkIG9mIHVzZXIgY29uZmlndXJhdGlvbi4gRGF0YSBpbiB0aGlzIGRhdGEgc3RydWN0dXJyZQorLy8gaXMgdmFsaWQgb25seSB3aGVuIGVpdGhlciBBREhPQ19PTihwQWQpIG9yIElORlJBX09OKHBBZCkgaXMgVFJVRS4KKy8vIE5vcm1hbGx5LCBhZnRlciBTQ0FOIG9yIGZhaWxlZCByb2FtaW5nIGF0dGVtcHRzLCB3ZSBuZWVkIHRvIHJlY292ZXIgYmFjayB0bworLy8gdGhlIGN1cnJlbnQgYWN0aXZlIHNldHRpbmdzLgordHlwZWRlZiBzdHJ1Y3QgX1NUQV9BQ1RJVkVfQ09ORklHIHsKKwlVU0hPUlQgICAgICBBaWQ7CisJVVNIT1JUICAgICAgQXRpbVdpbjsgICAgICAgICAgICAgICAgLy8gaW4ga3VzZWM7IElCU1MgcGFyYW1ldGVyIHNldCBlbGVtZW50CisJVVNIT1JUICAgICAgQ2FwYWJpbGl0eUluZm87CisJVVNIT1JUICAgICAgQ2ZwTWF4RHVyYXRpb247CisJVVNIT1JUICAgICAgQ2ZwUGVyaW9kOworCisJLy8gQ29weSBzdXBwb3J0ZWQgcmF0ZSBmcm9tIGRlc2lyZWQgQVAncyBiZWFjb24uIFdlIGFyZSB0cnlpbmcgdG8gbWF0Y2gKKwkvLyBBUCdzIHN1cHBvcnRlZCBhbmQgZXh0ZW5kZWQgcmF0ZSBzZXR0aW5ncy4KKwlVQ0hBUiAgICAgICBTdXBSYXRlW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXTsKKwlVQ0hBUiAgICAgICBFeHRSYXRlW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXTsKKwlVQ0hBUiAgICAgICBTdXBSYXRlTGVuOworCVVDSEFSICAgICAgIEV4dFJhdGVMZW47CisJLy8gQ29weSBzdXBwb3J0ZWQgaHQgZnJvbSBkZXNpcmVkIEFQJ3MgYmVhY29uLiBXZSBhcmUgdHJ5aW5nIHRvIG1hdGNoCisJUlRfSFRfUEhZX0lORk8JCVN1cHBvcnRlZFBoeUluZm87CisJUlRfSFRfQ0FQQUJJTElUWQlTdXBwb3J0ZWRIdFBoeTsKK30gU1RBX0FDVElWRV9DT05GSUcsICpQU1RBX0FDVElWRV9DT05GSUc7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKy8vIC0tLS0tLS0tLS0tIHN0YXJ0IG9mIEFQIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBBVVRILVJTUCBTdGF0ZSBNYWNoaW5lIEF1eCBkYXRhIHN0cnVjdHVyZQordHlwZWRlZiBzdHJ1Y3QgX0FQX01MTUVfQVVYIHsKKwlVQ0hBUiAgICAgICAgICAgICAgIEFkZHJbTUFDX0FERFJfTEVOXTsKKwlVU0hPUlQgICAgICAgICAgICAgIEFsZzsKKwlDSEFSICAgICAgICAgICAgICAgIENoYWxsZW5nZVtDSVBIRVJfVEVYVF9MRU5dOworfSBBUF9NTE1FX0FVWCwgKlBBUF9NTE1FX0FVWDsKKworLy8gc3RydWN0dXJlIHRvIGRlZmluZSBXUEEgR3JvdXAgS2V5IFJla2V5IEludGVydmFsCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX1JUXzgwMl8xMV9XUEFfUkVLRVkgeworCVVMT05HIFJlS2V5TWV0aG9kOyAgICAgICAgICAvLyBtZWNoYW5pc20gZm9yIHJla2V5aW5nOiAwOmRpc2FibGUsIDE6IHRpbWUtYmFzZWQsIDI6IHBhY2tldC1iYXNlZAorCVVMT05HIFJlS2V5SW50ZXJ2YWw7ICAgICAgICAvLyB0aW1lLWJhc2VkOiBzZWNvbmRzLCBwYWNrZXQtYmFzZWQ6IGtpbG8tcGFja2V0cworfSBSVF9XUEFfUkVLRVksKlBSVF9XUEFfUkVLRVksIFJUXzgwMl8xMV9XUEFfUkVLRVksICpQUlRfODAyXzExX1dQQV9SRUtFWTsKKwordHlwZWRlZiBzdHJ1Y3QgX01BQ19UQUJMRV9FTlRSWSB7CisJLy9DaG9vc2UgMSBmcm9tIFZhbGlkQXNXRFMgYW5kIFZhbGlkQXNDTEkgIHRvIHZhbGlkaXplLgorCUJPT0xFQU4JCVZhbGlkQXNDTEk7CQkvLyBTdGEgbW9kZSwgc2V0IHRoaXMgVFJVRSBhZnRlciBMaW5rdXAsdG9vLgorCUJPT0xFQU4JCVZhbGlkQXNXRFM7CS8vIFRoaXMgaXMgV0RTIEVudHJ5LiBvbmx5IGZvciBBUCBtb2RlLgorCUJPT0xFQU4JCVZhbGlkQXNBcENsaTsgICAvL1RoaXMgaXMgYSBBUC1DbGllbnQgZW50cnksIG9ubHkgZm9yIEFQIG1vZGUgd2hpY2ggZW5hYmxlIEFQLUNsaWVudCBmdW5jdGlvbnMuCisJQk9PTEVBTgkJVmFsaWRBc01lc2g7CisJQk9PTEVBTgkJVmFsaWRBc0RsczsJLy8gVGhpcyBpcyBETFMgRW50cnkuIG9ubHkgZm9yIFNUQSBtb2RlLgorCUJPT0xFQU4JCWlzQ2FjaGVkOworCUJPT0xFQU4JCWJJQW1CYWRBdGhlcm9zOwkvLyBGbGFnIGlmIHRoaXMgaXMgQXRoZXJvcyBjaGlwIHRoYXQgaGFzIElPVCBwcm9ibGVtLiAgV2UgbmVlZCB0byB0dXJuIG9uIFJUUy9DVFMgcHJvdGVjdGlvbi4KKworCVVDSEFSICAgICAgICAgCUVucXVldWVFYXBvbFN0YXJ0VGltZXJSdW5uaW5nOyAgLy8gRW5xdWV1ZSBFQVBvTC1TdGFydCBmb3IgdHJpZ2dlcmluZyBFQVAgU00KKwkvL2phbiBmb3Igd3BhCisJLy8gcmVjb3JkIHdoaWNoIGVudHJ5IHJldm9rZSBNSUMgRmFpbHVyZSAsIGlmIGl0IGxlYXZlcyB0aGUgQlNTIGl0c2VsZiwgQVAgd29uJ3QgdXBkYXRlIGFNSUNGYWlsVGltZSBNSUIKKwlVQ0hBUiAgICAgICAgICAgQ01UaW1lclJ1bm5pbmc7CisJVUNIQVIgICAgICAgICAgIGFwaWR4OwkJCS8vIE1CU1MgbnVtYmVyCisJVUNIQVIgICAgICAgICAgIFJTTklFX0xlbjsKKwlVQ0hBUiAgICAgICAgICAgUlNOX0lFW01BWF9MRU5fT0ZfUlNOSUVdOworCVVDSEFSICAgICAgICAgICBBTm9uY2VbTEVOX0tFWV9ERVNDX05PTkNFXTsKKwlVQ0hBUiAgICAgICAgICAgUl9Db3VudGVyW0xFTl9LRVlfREVTQ19SRVBMQVldOworCVVDSEFSICAgICAgICAgICBQVEtbNjRdOworCVVDSEFSICAgICAgICAgICBSZVRyeUNvdW50ZXI7CisJUkFMSU5LX1RJTUVSX1NUUlVDVCAgICAgICAgICAgICAgICAgUmV0cnlUaW1lcjsKKwlSQUxJTktfVElNRVJfU1RSVUNUCQkJCQlFbnF1ZXVlU3RhcnRGb3JQU0tUaW1lcjsJLy8gQSB0aW1lciB3aGljaCBlbnF1ZXVlIEVBUG9MLVN0YXJ0IGZvciB0cmlnZ2VyaW5nIFBTSyBTTQorCU5ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREUgICAgIEF1dGhNb2RlOyAgIC8vIFRoaXMgc2hvdWxkIG1hdGNoIHRvIHdoYXRldmVyIG1pY3Jvc29mdCBkZWZpbmVkCisJTkRJU184MDJfMTFfV0VQX1NUQVRVUyAgICAgICAgICAgICAgV2VwU3RhdHVzOworCUFQX1dQQV9TVEFURSAgICBXcGFTdGF0ZTsKKwlHVEtfU1RBVEUgICAgICAgR1RLU3RhdGU7CisJVVNIT1JUICAgICAgICAgIFBvcnRTZWN1cmVkOworCU5ESVNfODAyXzExX1BSSVZBQ1lfRklMVEVSICBQcml2YWN5RmlsdGVyOyAgICAgIC8vIFByaXZhY3lGaWx0ZXIgZW51bSBmb3IgODAyLjFYCisJQ0lQSEVSX0tFWSAgICAgIFBhaXJ3aXNlS2V5OworCVBWT0lEICAgICAgICAgICBwQWQ7CisgICAgSU5UCQkJCVBNS0lEX0NhY2hlSWR4OworICAgIFVDSEFSCQkJUE1LSURbTEVOX1BNS0lEXTsKKworCisJVUNIQVIgICAgICAgICAgIEFkZHJbTUFDX0FERFJfTEVOXTsKKwlVQ0hBUiAgICAgICAgICAgUHNNb2RlOworCVNTVCAgICAgICAgICAgICBTc3Q7CisJQVVUSF9TVEFURSAgICAgIEF1dGhTdGF0ZTsgLy8gZm9yIFNIQVJFRCBLRVkgYXV0aGVudGljYXRpb24gc3RhdGUgbWFjaGluZSB1c2VkIG9ubHkKKwlCT09MRUFOCQkJSXNSZWFzc29jU3RhOwkvLyBJbmRpY2F0ZSB3aGV0aGVyIHRoaXMgaXMgYSByZWFzc29jaWF0aW9uIHByb2NlZHVyZQorCVVTSE9SVCAgICAgICAgICBBaWQ7CisJVVNIT1JUICAgICAgICAgIENhcGFiaWxpdHlJbmZvOworCVVDSEFSICAgICAgICAgICBMYXN0UnNzaTsKKwlVTE9ORyAgICAgICAgICAgTm9EYXRhSWRsZUNvdW50OworCVVJTlQxNgkJCVN0YXRpb25LZWVwQWxpdmVDb3VudDsgLy8gdW5pdDogc2Vjb25kCisJVUxPTkcgICAgICAgICAgIFBzUUlkbGVDb3VudDsKKwlRVUVVRV9IRUFERVIgICAgUHNRdWV1ZTsKKworCVVJTlQzMgkJCVN0YUNvbm5lY3RUaW1lOwkJLy8gdGhlIGxpdmUgdGltZSBvZiB0aGlzIHN0YXRpb24gc2luY2UgYXNzb2NpYXRlZCB3aXRoIEFQCisKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCUJPT0xFQU4JCQliU2VuZEJBUjsKKwlVU0hPUlQJCQlOb0JBRGF0YUNvdW50RG93bjsKKworCVVJTlQzMiAgIAkJQ2FjaGVkQnVmWzE2XTsJCS8vIFVJTlQgKDQgYnl0ZXMpIGZvciBhbGlnbm1lbnQKKwlVSU5UCQkJVHhCRkNvdW50OyAvLyAzKjMKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwlVSU5UCQkJRklGT0NvdW50OworCVVJTlQJCQlEZWJ1Z0ZJRk9Db3VudDsKKwlVSU5UCQkJRGVidWdUeENvdW50OworICAgIEJPT0xFQU4JCQliRGxzSW5pdDsKKworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vV0RTIGVudHJ5IG5lZWRzIHRoZXNlCisvLyBydDI4NjAgYWRkIHRoaXMuIGlmIFZhbGlkQXNXRFM9PVRSVUUsIE1hdGNoV0RTVGFiSWR4IGlzIHRoZSBpbmRleCBpbiBXZHNUYWIuTWFjVGFiCisJVUlOVAkJCU1hdGNoV0RTVGFiSWR4OworCVVDSEFSICAgICAgICAgICBNYXhTdXBwb3J0ZWRSYXRlOworCVVDSEFSICAgICAgICAgICBDdXJyVHhSYXRlOworCVVDSEFSICAgICAgICAgICBDdXJyVHhSYXRlSW5kZXg7CisJLy8gdG8gcmVjb3JkIHRoZSBlYWNoIFRYIHJhdGUncyBxdWFsaXR5LiAwIGlzIGJlc3QsIHRoZSBiaWdnZXIgdGhlIHdvcnNlLgorCVVTSE9SVCAgICAgICAgICBUeFF1YWxpdHlbTUFYX1NURVBfT0ZfVFhfUkFURV9TV0lUQ0hdOworCVVJTlQzMgkJCU9uZVNlY1R4Tm9SZXRyeU9rQ291bnQ7CisJVUlOVDMyICAgICAgICAgIE9uZVNlY1R4UmV0cnlPa0NvdW50OworCVVJTlQzMiAgICAgICAgICBPbmVTZWNUeEZhaWxDb3VudDsKKwlVSU5UMzIJCQlDb250aW51ZVR4RmFpbENudDsKKwlVSU5UMzIgICAgICAgICAgQ3VyclR4UmF0ZVN0YWJsZVRpbWU7IC8vICMgb2Ygc2Vjb25kIGluIGN1cnJlbnQgVFggcmF0ZQorCVVDSEFSICAgICAgICAgICBUeFJhdGVVcFBlbmFsdHk7ICAgICAgLy8gZXh0cmEgIyBvZiBzZWNvbmQgcGVuYWx0eSBkdWUgdG8gbGFzdCB1bnN0YWJsZSBjb25kaXRpb24KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCVVJTlQJCQlNYXRjaERsc0VudHJ5SWR4OyAvLyBpbmRpY2F0ZSB0aGUgaW5kZXggaW4gcEFkLT5TdGFDZmcuRExTRW50cnkKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCUJPT0xFQU4gICAgICAgICBmTm9pc3lFbnZpcm9ubWVudDsKKwlCT09MRUFOCQkJZkxhc3RTZWNBY2NvcmRpbmdSU1NJOworCVVDSEFSICAgICAgICAgICBMYXN0U2VjVHhSYXRlQ2hhbmdlQWN0aW9uOyAvLyAwOiBubyBjaGFuZ2UsIDE6cmF0ZSBVUCwgMjpyYXRlIGRvd24KKwlDSEFSCQkJTGFzdFRpbWVUeFJhdGVDaGFuZ2VBY3Rpb247IC8vS2VlcCBsYXN0IHRpbWUgdmFsdWUgb2YgTGFzdFNlY1R4UmF0ZUNoYW5nZUFjdGlvbgorCVVMT05HCQkJTGFzdFR4T2tDb3VudDsKKwlVQ0hBUiAgICAgICAgICAgUEVSW01BWF9TVEVQX09GX1RYX1JBVEVfU1dJVENIXTsKKworCS8vIGEgYml0bWFwIG9mIEJPT0xFQU4gZmxhZ3MuIGVhY2ggYml0IHJlcHJlc2VudCBhbiBvcGVyYXRpb24gc3RhdHVzIG9mIGEgcGFydGljdWxhcgorCS8vIEJPT0xFQU4gY29udHJvbCwgZWl0aGVyIE9OIG9yIE9GRi4gVGhlc2UgZmxhZ3Mgc2hvdWxkIGFsd2F5cyBiZSBhY2Nlc3NlZCB2aWEKKwkvLyBDTElFTlRfU1RBVFVTX1RFU1RfRkxBRygpLCBDTElFTlRfU1RBVFVTX1NFVF9GTEFHKCksIENMSUVOVF9TVEFUVVNfQ0xFQVJfRkxBRygpIG1hY3Jvcy4KKwkvLyBzZWUgZk9QX1NUQVRVU194eHggaW4gUlRNUF9ERUYuQyBmb3IgZGV0YWlsIGJpdCBkZWZpbml0aW9uLiBmQ0xJRU5UX1NUQVRVU19BTVNEVV9JTlVTRUQKKwlVTE9ORyAgICAgICAgICAgQ2xpZW50U3RhdHVzRmxhZ3M7CisKKwkvLyBUT0RPOiBTaGFsbCB3ZSBtb3ZlIHRoYXQgdG8gRE9UMTFfTl9TVVBQT1JUPz8/CisJSFRUUkFOU01JVF9TRVRUSU5HCUhUUGh5TW9kZSwgTWF4SFRQaHlNb2RlLCBNaW5IVFBoeU1vZGU7Ly8gRm9yIHRyYW5zbWl0IHBoeSBzZXR0aW5nIGluIFRYV0kuCisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkvLyBIVCBFV0MgTUlNTy1OIHVzZWQgcGFyYW1ldGVycworCVVTSE9SVAkJUlhCQWJpdG1hcDsJLy8gZmlsbCB0byBvbi1jaGlwICBSWFdJX0JBX0JJVE1BU0sgaW4gOC4xLjNSWCBhdHRyaWJ1dGUgZW50cnkgZm9ybWF0CisJVVNIT1JUCQlUWEJBYml0bWFwOwkvLyBUaGlzIGJpdG1hcCBhcyBvcmlnaW5hdG9yLCBvbmx5IGtlZXAgaW4gc29mdHdhcmUgdXNlZCB0byBtYXJrIEFNUERVIGJpdCBpbiBUWFdJCisJVVNIT1JUCQlUWEF1dG9CQWJpdG1hcDsKKwlVU0hPUlQJCUJBRGVjbGluZUJpdG1hcDsKKwlVU0hPUlQJCUJBUmVjV2NpZEFycmF5W05VTV9PRl9USURdOwkvLyBUaGUgbWFwcGluZyB3Y2lkIG9mIHJlY2lwaWVudCBzZXNzaW9uLiBpZiBSWEJBYml0bWFwIGJpdCBpcyBtYXNrZWQKKwlVU0hPUlQJCUJBT3JpV2NpZEFycmF5W05VTV9PRl9USURdOyAvLyBUaGUgbWFwcGluZyB3Y2lkIG9mIG9yaWdpbmF0b3Igc2Vzc2lvbi4gaWYgVFhCQWJpdG1hcCBiaXQgaXMgbWFza2VkCisJVVNIT1JUCQlCQU9yaVNlcXVlbmNlW05VTV9PRl9USURdOyAvLyBUaGUgbWFwcGluZyB3Y2lkIG9mIG9yaWdpbmF0b3Igc2Vzc2lvbi4gaWYgVFhCQWJpdG1hcCBiaXQgaXMgbWFza2VkCisKKwkvLyA4MDIuMTFuIGZlYXR1cmVzLgorCVVDSEFSCQlNcGR1RGVuc2l0eTsKKwlVQ0hBUgkJTWF4UkFtcGR1RmFjdG9yOworCVVDSEFSCQlBTXNkdVNpemU7CisJVUNIQVIJCU1tcHNNb2RlOwkvLyBNSU1PIHBvd2VyIHNhdmUgbW9yZS4KKworCUhUX0NBUEFCSUxJVFlfSUUJCUhUQ2FwYWJpbGl0eTsKKworI2lmZGVmIERPVDExTl9EUkFGVDMKKwlVQ0hBUgkJQlNTMjA0MENvZXhpc3RlbmNlTWdtdFN1cHBvcnQ7CisjZW5kaWYgLy8gRE9UMTFOX0RSQUZUMyAvLworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJQk9PTEVBTgkJYkF1dG9UeFJhdGVTd2l0Y2g7CisKKwlVQ0hBUiAgICAgICBSYXRlTGVuOworCXN0cnVjdCBfTUFDX1RBQkxFX0VOVFJZICpwTmV4dDsKKyAgICBVU0hPUlQgICAgICBUeFNlcVtOVU1fT0ZfVElEXTsKKwlVU0hPUlQJCU5vblFvc0RhdGFTZXE7CisKKwlSU1NJX1NBTVBMRQlSc3NpU2FtcGxlOworCisJVUlOVDMyCQkJVFhNQ1NFeHBlY3RlZFsxNl07CisJVUlOVDMyCQkJVFhNQ1NTdWNjZXNzZnVsWzE2XTsKKwlVSU5UMzIJCQlUWE1DU0ZhaWxlZFsxNl07CisJVUlOVDMyCQkJVFhNQ1NBdXRvRmFsbEJhY2tbMTZdWzE2XTsKK30gTUFDX1RBQkxFX0VOVFJZLCAqUE1BQ19UQUJMRV9FTlRSWTsKKwordHlwZWRlZiBzdHJ1Y3QgX01BQ19UQUJMRSB7CisJVVNIT1JUCQkJU2l6ZTsKKwlNQUNfVEFCTEVfRU5UUlkgKkhhc2hbSEFTSF9UQUJMRV9TSVpFXTsKKwlNQUNfVEFCTEVfRU5UUlkgQ29udGVudFtNQVhfTEVOX09GX01BQ19UQUJMRV07CisJUVVFVUVfSEVBREVSICAgIE1jYXN0UHNRdWV1ZTsKKwlVTE9ORyAgICAgICAgICAgUHNRSWRsZUNvdW50OworCUJPT0xFQU4gICAgICAgICBmQW55U3RhdGlvbkluUHNtOworCUJPT0xFQU4gICAgICAgICBmQW55U3RhdGlvbkJhZEF0aGVyb3M7CS8vIENoZWNrIGlmIGFueSBTdGF0aW9uIGlzIGF0aGVyb3MgODAyLjExbiBDaGlwLiAgV2UgbmVlZCB0byB1c2UgUlRTL0NUUyB3aXRoIEF0aGVyb3MgODAyLC4xMW4gY2hpcC4KKwlCT09MRUFOCQkJZkFueVR4T1BGb3JjZURpc2FibGU7CS8vIENoZWNrIGlmIGl0IGlzIG5lY2Vzc2FyeSB0byBkaXNhYmxlIEJFIFR4T1AKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwlCT09MRUFOICAgICAgICAgZkFueVN0YXRpb25Jc0xlZ2FjeTsJLy8gQ2hlY2sgaWYgSSB1c2UgbGVnYWN5IHJhdGUgdG8gdHJhbnNtaXQgdG8gbXkgQlNTIFN0YXRpb24vCisJQk9PTEVBTiAgICAgICAgIGZBbnlTdGF0aW9uTm9uR0Y7CQkvLyBDaGVjayBpZiBhbnkgU3RhdGlvbiBjYW4ndCBzdXBwb3J0IEdGLgorCUJPT0xFQU4gICAgICAgICBmQW55U3RhdGlvbjIwT25seTsJCS8vIENoZWNrIGlmIGFueSBTdGF0aW9uIGNhbid0IHN1cHBvcnQgR0YuCisJQk9PTEVBTgkJCWZBbnlTdGF0aW9uTUlNT1BTRHluYW1pYzsgLy8gQ2hlY2sgaWYgYW55IFN0YXRpb24gaXMgTUlNTyBEeW5hbWljCisJQk9PTEVBTiAgICAgICAgIGZBbnlCQVNlc3Npb247ICAgLy8gQ2hlY2sgaWYgdGhlcmUgaXMgQkEgc2Vzc2lvbi4gIEZvcmNlIHR1cm4gb24gUlRTL0NUUworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworfSBNQUNfVEFCTEUsICpQTUFDX1RBQkxFOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisjZGVmaW5lIElTX0hUX1NUQShfcE1hY0VudHJ5KQlcCisJKF9wTWFjRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NT0RFID49IE1PREVfSFRNSVgpCisKKyNkZWZpbmUgSVNfSFRfUkFURShfcE1hY0VudHJ5KQlcCisJKF9wTWFjRW50cnktPkhUUGh5TW9kZS5maWVsZC5NT0RFID49IE1PREVfSFRNSVgpCisKKyNkZWZpbmUgUEVFUl9JU19IVF9SQVRFKF9wTWFjRW50cnkpCVwKKwkoX3BNYWNFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1PREUgPj0gTU9ERV9IVE1JWCkKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwordHlwZWRlZiBzdHJ1Y3QgX1dEU19FTlRSWSB7CisJQk9PTEVBTiAgICAgICAgIFZhbGlkOworCVVDSEFSICAgICAgICAgICBBZGRyW01BQ19BRERSX0xFTl07CisJVUxPTkcgICAgICAgICAgIE5vRGF0YUlkbGVDb3VudDsKKwlzdHJ1Y3QgX1dEU19FTlRSWSAqcE5leHQ7Cit9IFdEU19FTlRSWSwgKlBXRFNfRU5UUlk7CisKK3R5cGVkZWYgc3RydWN0ICBfV0RTX1RBQkxFX0VOVFJZIHsKKwlVU0hPUlQJCQlTaXplOworCVVDSEFSICAgICAgICAgICBXZHNBZGRyW01BQ19BRERSX0xFTl07CisJV0RTX0VOVFJZICAgICAgICpIYXNoW0hBU0hfVEFCTEVfU0laRV07CisJV0RTX0VOVFJZICAgICAgIENvbnRlbnRbTUFYX0xFTl9PRl9NQUNfVEFCTEVdOworCVVDSEFSICAgICAgICAgICBNYXhTdXBwb3J0ZWRSYXRlOworCVVDSEFSICAgICAgICAgICBDdXJyVHhSYXRlOworCVVTSE9SVCAgICAgICAgICBUeFF1YWxpdHlbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdOworCVVTSE9SVCAgICAgICAgICBPbmVTZWNUeE9rQ291bnQ7CisJVVNIT1JUICAgICAgICAgIE9uZVNlY1R4UmV0cnlPa0NvdW50OworCVVTSE9SVCAgICAgICAgICBPbmVTZWNUeEZhaWxDb3VudDsKKwlVTE9ORyAgICAgICAgICAgQ3VyclR4UmF0ZVN0YWJsZVRpbWU7IC8vICMgb2Ygc2Vjb25kIGluIGN1cnJlbnQgVFggcmF0ZQorCVVDSEFSICAgICAgICAgICBUeFJhdGVVcFBlbmFsdHk7ICAgICAgLy8gZXh0cmEgIyBvZiBzZWNvbmQgcGVuYWx0eSBkdWUgdG8gbGFzdCB1bnN0YWJsZSBjb25kaXRpb24KK30gV0RTX1RBQkxFX0VOVFJZLCAqUFdEU19UQUJMRV9FTlRSWTsKKwordHlwZWRlZiBzdHJ1Y3QgX1JUXzgwMl8xMV9XRFNfRU5UUlkgeworCVBORVRfREVWCQkJZGV2OworCVVDSEFSCQkJCVZhbGlkOworCVVDSEFSCQkJCVBoeU1vZGU7CisJVUNIQVIJCQkJUGVlcldkc0FkZHJbTUFDX0FERFJfTEVOXTsKKwlVQ0hBUgkJCQlNYWNUYWJNYXRjaFdDSUQ7CS8vIEFTSUMKKwlORElTXzgwMl8xMV9XRVBfU1RBVFVTICBXZXBTdGF0dXM7CisJVUNIQVIJCQkJCUtleUlkeDsKKwlDSVBIRVJfS0VZICAgICAgICAgIAlXZHNLZXk7CisJSFRUUkFOU01JVF9TRVRUSU5HCQkJCUhUUGh5TW9kZSwgTWF4SFRQaHlNb2RlLCBNaW5IVFBoeU1vZGU7CisJUlRfSFRfUEhZX0lORk8JCQkJCURlc2lyZWRIdFBoeUluZm87CisJQk9PTEVBTgkJCQkJCQliQXV0b1R4UmF0ZVN3aXRjaDsKKwlERVNJUkVEX1RSQU5TTUlUX1NFVFRJTkcgICAgICAgCURlc2lyZWRUcmFuc21pdFNldHRpbmc7IC8vIERlc2lyZWQgdHJhbnNtaXQgc2V0dGluZy4KK30gUlRfODAyXzExX1dEU19FTlRSWSwgKlBSVF84MDJfMTFfV0RTX0VOVFJZOworCit0eXBlZGVmIHN0cnVjdCBfV0RTX1RBQkxFIHsKKwlVQ0hBUiAgICAgICAgICAgICAgIE1vZGU7CisJVUxPTkcgICAgICAgICAgICAgICBTaXplOworCVJUXzgwMl8xMV9XRFNfRU5UUlkJV2RzRW50cnlbTUFYX1dEU19FTlRSWV07Cit9IFdEU19UQUJMRSwgKlBXRFNfVEFCTEU7CisKK3R5cGVkZWYgc3RydWN0IF9BUENMSV9TVFJVQ1QgeworCVBORVRfREVWCQkJCWRldjsKKyNpZmRlZiBSVEw4NjVYX1NPQworCXVuc2lnbmVkIGludCAgICAgICAgICAgIG15bGlua2lkOworI2VuZGlmCisJQk9PTEVBTiAgICAgICAgICAgICAgICAgRW5hYmxlOwkvLyBTZXQgaXQgYXMgMSBpZiB0aGUgYXBjbGkgaW50ZXJmYWNlIHdhcyBjb25maWd1cmVkIHRvICIxIiAgb3IgYnkgaXdwcml2IGNtZCAiQXBDbGlFbmFibGUiCisJQk9PTEVBTiAgICAgICAgICAgICAgICAgVmFsaWQ7CS8vIFNldCBpdCBhcyAxIGlmIHRoZSBhcGNsaSBpbnRlcmZhY2UgYXNzb2NpYXRlZCBzdWNjZXNzIHRvIHJlbW90ZSBBUC4KKwlVQ0hBUgkJCQkJTWFjVGFiV0NJRDsJLy9XQ0lEIHZhbHVlLCB3aGljaCBwb2ludCB0byB0aGUgZW50cnkgb2YgQVNJQyBNYWMgdGFibGUuCisJVUNIQVIgICAgICAgICAgICAgICAgICAgU3NpZExlbjsKKwlDSEFSICAgICAgICAgICAgICAgICAgICBTc2lkW01BWF9MRU5fT0ZfU1NJRF07CisKKwlVQ0hBUiAgICAgICAgICAgICAgICAgICBDZmdTc2lkTGVuOworCUNIQVIgICAgICAgICAgICAgICAgICAgIENmZ1NzaWRbTUFYX0xFTl9PRl9TU0lEXTsKKwlVQ0hBUiAgICAgICAgICAgICAgICAgICBDZmdBcENsaUJzc2lkW0VUSF9MRU5HVEhfT0ZfQUREUkVTU107CisJVUNIQVIgICAgICAgICAgICAgICAgICAgQ3VycmVudEFkZHJlc3NbRVRIX0xFTkdUSF9PRl9BRERSRVNTXTsKKworCVVMT05HICAgICAgICAgICAgICAgICAgIEFwQ2xpUmN2QmVhY29uVGltZTsKKworCVVMT05HICAgICAgICAgICAgICAgICAgIEN0cmxDdXJyU3RhdGU7CisJVUxPTkcgICAgICAgICAgICAgICAgICAgU3luY0N1cnJTdGF0ZTsKKwlVTE9ORyAgICAgICAgICAgICAgICAgICBBdXRoQ3VyclN0YXRlOworCVVMT05HICAgICAgICAgICAgICAgICAgIEFzc29jQ3VyclN0YXRlOworCVVMT05HCQkJCQlXcGFQc2tDdXJyU3RhdGU7CisKKwlVU0hPUlQgICAgICAgICAgICAgICAgICBBdXRoUmVxQ250OworCVVTSE9SVCAgICAgICAgICAgICAgICAgIEFzc29jUmVxQ250OworCisJVUxPTkcgICAgICAgICAgICAgICAgICAgQ2xpZW50U3RhdHVzRmxhZ3M7CisJVUNIQVIgICAgICAgICAgICAgICAgICAgTXBkdURlbnNpdHk7CisKKwlORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9NT0RFICAgICBBdXRoTW9kZTsgICAvLyBUaGlzIHNob3VsZCBtYXRjaCB0byB3aGF0ZXZlciBtaWNyb3NvZnQgZGVmaW5lZAorCU5ESVNfODAyXzExX1dFUF9TVEFUVVMgICAgICAgICAgICAgIFdlcFN0YXR1czsKKworCS8vIEFkZCB0byBzdXBwb3J0IGRpZmZlcmVudCBjaXBoZXIgc3VpdGUgZm9yIFdQQTIvV1BBIG1vZGUKKwlORElTXzgwMl8xMV9FTkNSWVBUSU9OX1NUQVRVUwkJR3JvdXBDaXBoZXI7CQkvLyBNdWx0aWNhc3QgY2lwaGVyIHN1aXRlCisJTkRJU184MDJfMTFfRU5DUllQVElPTl9TVEFUVVMJCVBhaXJDaXBoZXI7CQkJLy8gVW5pY2FzdCBjaXBoZXIgc3VpdGUKKwlCT09MRUFOCQkJCQkJCQliTWl4Q2lwaGVyOwkJCS8vIEluZGljYXRlIGN1cnJlbnQgUGFpciAmIEdyb3VwIHVzZSBkaWZmZXJlbnQgY2lwaGVyIHN1aXRlcworCVVTSE9SVAkJCQkJCQkJUnNuQ2FwYWJpbGl0eTsKKworCVVDSEFSCQlQU0tbMTAwXTsJCQkJLy8gcmVzZXJ2ZSBQU0sga2V5IG1hdGVyaWFsCisJVUNIQVIgICAgICAgUFNLTGVuOworCVVDSEFSICAgICAgIFBNS1szMl07ICAgICAgICAgICAgICAgIC8vIFdQQSBQU0sgbW9kZSBQTUsKKwlVQ0hBUgkJR1RLWzMyXTsJCQkJLy8gR1RLIGZyb20gYXV0aGVudGljYXRvcgorCisJQ0lQSEVSX0tFWSAgICAgIFNoYXJlZEtleVtTSEFSRV9LRVlfTlVNXTsKKwlVQ0hBUiAgICAgICAgICAgRGVmYXVsdEtleUlkOworCisJLy8gc3RvcmUgUlNOX0lFIGJ1aWx0IGJ5IGRyaXZlcgorCVVDSEFSCQlSU05fSUVbTUFYX0xFTl9PRl9SU05JRV07ICAvLyBUaGUgY29udGVudCBzYXZlZCBoZXJlIHNob3VsZCBiZSBjb252ZXJ0IHRvIGxpdHRsZS1lbmRpYW4gZm9ybWF0LgorCVVDSEFSCQlSU05JRV9MZW47CisKKwkvLyBGb3IgV1BBIGNvdW50ZXJtZWFzdXJlcworCVVMT05HICAgICAgIExhc3RNaWNFcnJvclRpbWU7ICAgLy8gcmVjb3JkIGxhc3QgTUlDIGVycm9yIHRpbWUKKwlCT09MRUFOICAgICAgICAgICAgICAgICBiQmxvY2tBc3NvYzsgLy8gQmxvY2sgYXNzb2NpYXRlIGF0dGVtcHQgZm9yIDYwIHNlY29uZHMgYWZ0ZXIgY291bnRlciBtZWFzdXJlIG9jY3VycmVkLgorCisJLy8gRm9yIFdQQS1QU0sgc3VwcGxpY2FudCBzdGF0ZQorCVVDSEFSICAgICAgIAlTTm9uY2VbMzJdOyAgICAgICAgIC8vIFNOb25jZSBmb3IgV1BBLVBTSworCVVDSEFSCQkJR05vbmNlWzMyXTsJCQkvLyBHTm9uY2UgZm9yIFdQQS1QU0sgZnJvbSBhdXRoZW50aWNhdG9yCisKKyNpZmRlZiBXU0NfQVBfU1VQUE9SVAorCVdTQ19DVFJMCSAgICAgICAgICAgV3NjQ29udHJvbDsKKyNlbmRpZiAvLyBXU0NfQVBfU1VQUE9SVCAvLworCisJSFRUUkFOU01JVF9TRVRUSU5HCQkJCUhUUGh5TW9kZSwgTWF4SFRQaHlNb2RlLCBNaW5IVFBoeU1vZGU7CisJUlRfSFRfUEhZX0lORk8JCQkJCURlc2lyZWRIdFBoeUluZm87CisJQk9PTEVBTgkJCQkJCQliQXV0b1R4UmF0ZVN3aXRjaDsKKwlERVNJUkVEX1RSQU5TTUlUX1NFVFRJTkcgICAgICAgCURlc2lyZWRUcmFuc21pdFNldHRpbmc7IC8vIERlc2lyZWQgdHJhbnNtaXQgc2V0dGluZy4KK30gQVBDTElfU1RSVUNULCAqUEFQQ0xJX1NUUlVDVDsKKworLy8gLS0tLS0tLS0tLS0gZW5kIG9mIEFQIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmZGVmIEJMT0NLX05FVF9JRgordHlwZWRlZiBzdHJ1Y3QgX0JMT0NLX1FVRVVFX0VOVFJZCit7CisJQk9PTEVBTiBTd1R4UXVldWVCbG9ja0ZsYWc7CisJTElTVF9IRUFERVIgTmV0SWZMaXN0OworfSBCTE9DS19RVUVVRV9FTlRSWSwgKlBCTE9DS19RVUVVRV9FTlRSWTsKKyNlbmRpZiAvLyBCTE9DS19ORVRfSUYgLy8KKworc3RydWN0IHdpZmljb25mCit7CisJQk9PTEVBTgliU2hvcnRHSTsKKwlCT09MRUFOIGJHcmVlbkZpZWxkOworfTsKKworCisKKwordHlwZWRlZiBzdHJ1Y3QgX0lORl9QQ0lfQ09ORklHCit7CisJUFVDSEFSICAgICAgICAgICAgICAgICAgQ1NSQmFzZUFkZHJlc3M7ICAgICAvLyBQQ0kgTU1JTyBCYXNlIEFkZHJlc3MsIGFsbCBhY2Nlc3Mgd2lsbCB1c2UKK31JTkZfUENJX0NPTkZJRzsKKwordHlwZWRlZiBzdHJ1Y3QgX0lORl9VU0JfQ09ORklHCit7CisJVUlOVCAgICAgICAgICAgICAgICBCdWxrSW5FcEFkZHI7CQkvLyBidWxrLWluIGVuZHBvaW50IGFkZHJlc3MKKwlVSU5UICAgICAgICAgICAgICAgIEJ1bGtPdXRFcEFkZHJbNl07CS8vIGJ1bGstb3V0IGVuZHBvaW50IGFkZHJlc3MKKworfUlORl9VU0JfQ09ORklHOworCisjaWZkZWYgSUtBTk9TX1ZYXzFYMAorCXR5cGVkZWYgdm9pZCAoKklrYW5vc1dsYW5UeENiRnVuY1ApKHZvaWQgKiwgdm9pZCAqKTsKKworCXN0cnVjdCBJS0FOT1NfVFhfSU5GTworCXsKKwkJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKKwkJSWthbm9zV2xhblR4Q2JGdW5jUCAqZnA7CisJfTsKKyNlbmRpZiAvLyBJS0FOT1NfVlhfMVgwIC8vCisKKyNpZmRlZiBOSU5URU5ET19BUAordHlwZWRlZiBzdHJ1Y3QgX05JTkRPX0NUUkxfQkxPQ0sgeworCisJUlRfTklOVEVORE9fVEFCTEUJRFNfVEFCTEU7CisKKyNpZmRlZiBDSElQMjVYWAorCXNwaW5sb2NrX3QJCQlOSU5URU5ET19UQUJMRV9Mb2NrOworI2Vsc2UKKwlORElTX1NQSU5fTE9DSwkJTklOVEVORE9fVEFCTEVfTG9jazsKKyNlbmRpZiAvLyBDSElQMjVYWCAvLworCisJVUNIQVIJCQkJTklOVEVORE9fVVBfQlVGRkVSWzUxMl07CisJVUNIQVIJCQkJTG9jYWxfS2V5SWR4OworCUNJUEhFUl9LRVkJCQlMb2NhbF9TaGFyZWRLZXk7CisJVUNIQVIJCQkJTG9jYWxfYkhpZGVTc2lkOworCVVDSEFSCQkJCUxvY2FsX0F1dGhNb2RlOworCVVDSEFSCQkJCUxvY2FsX1dlcFN0YXR1czsKKwlVU0hPUlQJCQkJTG9jYWxfQ2FwYWJpbGl0eUluZm87Cit9IE5JTkRPX0NUUkxfQkxPQ0s7CisjZW5kaWYgLy8gTklOVEVORE9fQVAgLy8KKworCisjaWZkZWYgREJHX0RJQUdOT1NFCisjZGVmaW5lIERJQUdOT1NFX1RJTUUJMTAgICAvLyAxMCBzZWMKK3R5cGVkZWYgc3RydWN0IF9SdG1wRGlhZ1N0cmN1dF8KK3sJLy8gRGlhZ25vc2lzIFJlbGF0ZWQgZWxlbWVudAorCXVuc2lnbmVkIGNoYXIJCWluaXRlZDsKKwl1bnNpZ25lZCBjaGFyIAlxSWR4OworCXVuc2lnbmVkIGNoYXIgCUFycmF5U3RhcnRJZHg7CisJdW5zaWduZWQgY2hhcgkJQXJyYXlDdXJJZHg7CisJLy8gVHggUmVsYXRlZCBDb3VudAorCVVTSE9SVAkJCVR4RGF0YUNudFtESUFHTk9TRV9USU1FXTsKKwlVU0hPUlQJCQlUeEZhaWxDbnRbRElBR05PU0VfVElNRV07CisJVVNIT1JUCQkJVHhEZXNjQ250W0RJQUdOT1NFX1RJTUVdWzI0XTsgLy8gMyozCS8vIFR4RGVzYyBxdWV1ZSBsZW5ndGggaW4gc2NhbGUgb2YgMH4xNCwgPj0xNQorCVVTSE9SVAkJCVR4TWNzQ250W0RJQUdOT1NFX1RJTUVdWzI0XTsgLy8gMyozCisJVVNIT1JUCQkJVHhTV1F1ZUNudFtESUFHTk9TRV9USU1FXVs5XTsJCS8vIFR4U3dRdWV1ZSBsZW5ndGggaW4gc2NhbGUgb2YgMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgPj04CisKKwlVU0hPUlQJCQlUeEFnZ0NudFtESUFHTk9TRV9USU1FXTsKKwlVU0hPUlQJCQlUeE5vbkFnZ0NudFtESUFHTk9TRV9USU1FXTsKKwlVU0hPUlQJCQlUeEFNUERVQ250W0RJQUdOT1NFX1RJTUVdWzI0XTsgLy8gMyozIC8vIDEwIHNlYywgVHhETUEgQVBNRFUgQWdncmVnYXRpb24gY291bnQgaW4gcmFuZ2UgZnJvbSAwIHRvIDE1LCBpbiBzZXRwIG9mIDEuCisJVVNIT1JUCQkJVHhSYWxpbmtDbnRbRElBR05PU0VfVElNRV07CQkJLy8gVHhSYWxpbmsgQWdncmVnYXRpb24gQ291bnQgaW4gMSBzZWMgc2NhbGUuCisJVVNIT1JUCQkJVHhBTVNEVUNudFtESUFHTk9TRV9USU1FXTsJCQkvLyBUeEFNU1VEIEFnZ3JlZ2F0aW9uIENvdW50IGluIDEgc2VjIHNjYWxlLgorCisJLy8gUnggUmVsYXRlZCBDb3VudAorCVVTSE9SVAkJCVJ4RGF0YUNudFtESUFHTk9TRV9USU1FXTsJCQkvLyBSeCBUb3RhbCBEYXRhIGNvdW50LgorCVVTSE9SVAkJCVJ4Q3JjRXJyQ250W0RJQUdOT1NFX1RJTUVdOworCVVTSE9SVAkJCVJ4TWNzQ250W0RJQUdOT1NFX1RJTUVdWzI0XTsgLy8gMyozCit9UnRtcERpYWdTdHJ1Y3Q7CisjZW5kaWYgLy8gREJHX0RJQUdOT1NFIC8vCisKKworLy8KKy8vICBUaGUgbWluaXBvcnQgYWRhcHRlciBzdHJ1Y3R1cmUKKy8vCit0eXBlZGVmIHN0cnVjdCBfUlRNUF9BREFQVEVSCit7CisJUFZPSUQJCQkJCU9TX0Nvb2tpZTsJLy8gc2F2ZSBzcGVjaWZpYyBzdHJ1Y3R1cmUgcmVsYXRpdmUgdG8gT1MKKwlQTkVUX0RFVgkJCQluZXRfZGV2OworCVVMT05HCQkJCQlWaXJ0dWFsSWZDbnQ7CisKKyNpZmRlZiBSVDI4NjAKKyAgICBVU0hPUlQJCSAgICAgICAgICAgIExua0N0cmxCaXRNYXNrOworICAgIFVTSE9SVAkJICAgICAgICAgICAgUkxua0N0cmxDb25maWd1cmF0aW9uOworICAgIFVTSE9SVCAgICAgICAgICAgICAgICAgIFJMbmtDdHJsT2Zmc2V0OworICAgIFVTSE9SVAkJICAgICAgICAgICAgSG9zdExua0N0cmxDb25maWd1cmF0aW9uOworICAgIFVTSE9SVCAgICAgICAgICAgICAgICAgIEhvc3RMbmtDdHJsT2Zmc2V0OworCVVTSE9SVAkJICAgICAgICAgICAgUENJZVBvd2VyU2F2ZUxldmVsOworICAgCUJPT0xFQU4JCQkJCWJQQ0ljbGtPZmY7CQkJCQkJLy8gZmxhZyB0aGF0IGluZGljYXRlIGlmIHRoZSBQSUNFIHBvd2VyIHN0YXR1cyBpbiBDb25maWd1cmF0aW9uIFNQYWNlLi4KKwlCT09MRUFOCQkJCQliUENJY2xrT2ZmRGlzYWJsZVR4OwkJCS8vCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICBQQ0kgcmVsYXRlZCBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCVBVQ0hBUiAgICAgICAgICAgICAgICAgIENTUkJhc2VBZGRyZXNzOyAgICAgLy8gUENJIE1NSU8gQmFzZSBBZGRyZXNzLCBhbGwgYWNjZXNzIHdpbGwgdXNlCisKKwlVSU5UCQkJCQlpbnRfZW5hYmxlX3JlZzsKKwlVSU5UCQkJCQlpbnRfZGlzYWJsZV9tYXNrOworCVVJTlQJCQkJCWludF9wZW5kaW5nOworCisKKwlSVE1QX0RNQUJVRiAgICAgICAgICAgICBUeEJ1ZlNwYWNlW05VTV9PRl9UWF9SSU5HXTsgLy8gU2hhcmVkIG1lbW9yeSBvZiBhbGwgMXN0IHByZS1hbGxvY2F0ZWQgVHhCdWYgYXNzb2NpYXRlZCB3aXRoIGVhY2ggVFhECisJUlRNUF9ETUFCVUYgICAgICAgICAgICAgUnhEZXNjUmluZzsgICAgICAgICAgICAgICAgIC8vIFNoYXJlZCBtZW1vcnkgZm9yIFJYIGRlc2NyaXB0b3JzCisJUlRNUF9ETUFCVUYgICAgICAgICAgICAgVHhEZXNjUmluZ1tOVU1fT0ZfVFhfUklOR107IAkvLyBTaGFyZWQgbWVtb3J5IGZvciBUeCBkZXNjcmlwdG9ycworCVJUTVBfVFhfUklORyAgICAgICAgICAgIFR4UmluZ1tOVU1fT0ZfVFhfUklOR107ICAgICAJLy8gQUMwfjQgKyBIQ0NBCisjZW5kaWYgLy8gUlQyODYwIC8vCisKKworCU5ESVNfU1BJTl9MT0NLICAgICAgICAgIGlycV9sb2NrOworCVVDSEFSICAgICAgICAgICAgICAgICAgIGlycV9kaXNhYmxlZDsKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwkvKiAgICAgIEJvdGggUENJL1VTQiByZWxhdGVkIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICBUeCByZWxhdGVkIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisJQk9PTEVBTiAgICAgICAgICAgICAgICAgRGVRdWV1ZVJ1bm5pbmdbTlVNX09GX1RYX1JJTkddOyAgLy8gZm9yIGVuc3VyaW5nIFJUVVNCRGVRdWV1ZVBhY2tldCBnZXQgY2FsbCBvbmNlCisJTkRJU19TUElOX0xPQ0sgICAgICAgICAgRGVRdWV1ZUxvY2tbTlVNX09GX1RYX1JJTkddOworCisKKwkvLyByZXNvdXJjZSBmb3Igc29mdHdhcmUgYmFja2xvZyBxdWV1ZXMKKwlRVUVVRV9IRUFERVIgICAgICAgICAgICBUeFN3UXVldWVbTlVNX09GX1RYX1JJTkddOyAgLy8gNCBBQyArIDEgSENDQQorCU5ESVNfU1BJTl9MT0NLICAgICAgICAgIFR4U3dRdWV1ZUxvY2tbTlVNX09GX1RYX1JJTkddOwkvLyBUeFN3UXVldWUgc3BpbmxvY2sKKworCVJUTVBfRE1BQlVGICAgICAgICAgICAgIE1nbXREZXNjUmluZzsgICAgICAgICAgICAgICAJLy8gU2hhcmVkIG1lbW9yeSBmb3IgTUdNVCBkZXNjcmlwdG9ycworCVJUTVBfTUdNVF9SSU5HICAgICAgICAgIE1nbXRSaW5nOworCU5ESVNfU1BJTl9MT0NLICAgICAgICAgIE1nbXRSaW5nTG9jazsgICAgICAgICAgICAgICAJLy8gUHJpbyBSaW5nIHNwaW5sb2NrCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICBSeCByZWxhdGVkIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZmRlZiBSVDI4NjAKKwlSVE1QX1JYX1JJTkcgICAgICAgICAgICBSeFJpbmc7CisJTkRJU19TUElOX0xPQ0sgICAgICAgICAgUnhSaW5nTG9jazsgICAgICAgICAgICAgICAgIC8vIFJ4IFJpbmcgc3BpbmxvY2sKKyNlbmRpZiAvLyBSVDI4NjAgLy8KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgQVNJQyByZWxhdGVkIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwlVSU5UMzIgICAgICAgICAgICAgICAJTUFDVmVyc2lvbjsgICAgICAJLy8gTUFDIHZlcnNpb24uIFJlY29yZCBydDI4NjBDKDB4Mjg2MDAxMDApIG9yIHJ0Mjg2MEQgKDB4Mjg2MDAxMDEpLi4KKworCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCS8vIEUyUFJPTQorCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCVVMT05HICAgICAgICAgICAgICAgICAgIEVlcHJvbVZlcnNpb247ICAgICAgICAgIC8vIGJ5dGUgMDogdmVyc2lvbiwgYnl0ZSAxOiByZXZpc2lvbiwgYnl0ZSAyfjM6IHVudXNlZAorCVVDSEFSICAgICAgICAgICAgICAgICAgIEVFUFJPTUFkZHJlc3NOdW07ICAgICAgIC8vIDkzYzQ2PTYgIDkzYzY2PTgKKwlVU0hPUlQgICAgICAgICAgICAgICAgICBFRVBST01EZWZhdWx0VmFsdWVbTlVNX0VFUFJPTV9CQlBfUEFSTVNdOworCVVMT05HICAgICAgICAgICAgICAgICAgIEZpcm13YXJlVmVyc2lvbjsgICAgICAgIC8vIGJ5dGUgMDogTWlub3IgdmVyc2lvbiwgYnl0ZSAxOiBNYWpvciB2ZXJzaW9uLCBvdGhlcndpc2UgdW51c2VkLgorCisJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJLy8gQkJQIENvbnRyb2wKKwkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlVQ0hBUiAgICAgICAgICAgICAgICAgICBCYnBXcml0ZUxhdGNoWzE0MF07ICAgICAvLyByZWNvcmQgbGFzdCBCQlAgcmVnaXN0ZXIgdmFsdWUgd3JpdHRlbiB2aWEgQkJQX0lPX1dSSVRFL0JCUF9JT19XUklURV9WWV9SRUdfSUQKKwlVQ0hBUiAgICAgICAgICAgICAgICAgICBCYnBSc3NpVG9EYm1EZWx0YTsKKwlCQlBfUjY2X1RVTklORyAgICAgICAgICBCYnBUdW5pbmc7CisKKwkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJLy8gUkZJQyBjb250cm9sCisJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCVVDSEFSICAgICAgICAgICAgICAgICAgIFJmSWNUeXBlOyAgICAgICAvLyBSRklDX3h4eAorCVVMT05HICAgICAgICAgICAgICAgICAgIFJmRnJlcU9mZnNldDsgICAvLyBGcmVxdWVuY3kgb2Zmc2V0IGZvciBjaGFubmVsIHN3aXRjaGluZworCVJUTVBfUkZfUkVHUyAgICAgICAgICAgIExhdGNoUmZSZWdzOyAgICAvLyBsYXRjaCB0aCBsYXRlc3QgUkYgcHJvZ3JhbW1pbmcgdmFsdWUgc2luY2UgUkYgSUMgZG9lc24ndCBzdXBwb3J0IFJFQUQKKworCUVFUFJPTV9BTlRFTk5BX1NUUlVDICAgIEFudGVubmE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNpbmNlIEFOdGVubmEgZGVmaW5pdGlvbiBpcyBkaWZmZXJlbnQgZm9yIGEgJiBnLiBXZSBuZWVkIHRvIHNhdmUgaXQgZm9yIGZ1dHVyZSByZWZlcmVuY2UuCisJRUVQUk9NX05JQ19DT05GSUcyX1NUUlVDICAgIE5pY0NvbmZpZzI7CisKKwkvLyBUaGlzIHNvZnQgUnggQW50ZW5uYSBEaXZlcnNpdHkgbWVjaGFuaXNtIGlzIHVzZWQgb25seSB3aGVuIHVzZXIgc2V0CisJLy8gUlggQW50ZW5uYSA9IERJVkVSU0lUWSBPTgorCVNPRlRfUlhfQU5UX0RJVkVSU0lUWSAgIFJ4QW50OworCisJVUNIQVIgICAgICAgICAgICAgICAgICAgUkZQcm9nU2VxOworCUNIQU5ORUxfVFhfUE9XRVIgICAgICAgIFR4UG93ZXJbTUFYX05VTV9PRl9DSEFOTkVMU107ICAgICAgIC8vIFN0b3JlIFR4IHBvd2VyIHZhbHVlIGZvciBhbGwgY2hhbm5lbHMuCisJQ0hBTk5FTF9UWF9QT1dFUiAgICAgICAgQ2hhbm5lbExpc3RbTUFYX05VTV9PRl9DSEFOTkVMU107ICAgLy8gbGlzdCBhbGwgc3VwcG9ydGVkIGNoYW5uZWxzIGZvciBzaXRlIHN1cnZleQorCUNIQU5ORUxfMTFKX1RYX1BPV0VSICAgIFR4UG93ZXIxMUpbTUFYX05VTV9PRl8xMUpDSEFOTkVMU107ICAgICAgIC8vIDgwMi4xMWogY2hhbm5lbCBhbmQgYncKKwlDSEFOTkVMXzExSl9UWF9QT1dFUiAgICBDaGFubmVsTGlzdDExSltNQVhfTlVNX09GXzExSkNIQU5ORUxTXTsgICAvLyBsaXN0IGFsbCBzdXBwb3J0ZWQgY2hhbm5lbHMgZm9yIHNpdGUgc3VydmV5CisKKwlVQ0hBUiAgICAgICAgICAgICAgICAgICBDaGFubmVsTGlzdE51bTsgICAgICAgICAgICAgICAgICAgICAvLyBudW1iZXIgb2YgY2hhbm5lbCBpbiBDaGFubmVsTGlzdFtdCisJVUNIQVIJCQkJCUJicDk0OworCUJPT0xFQU4JCQkJCUJicEZvckNDSzsKKwlVTE9ORwkJVHgyME1Qd3JDZmdBQmFuZFs1XTsKKwlVTE9ORwkJVHgyME1Qd3JDZmdHQmFuZFs1XTsKKwlVTE9ORwkJVHg0ME1Qd3JDZmdBQmFuZFs1XTsKKwlVTE9ORwkJVHg0ME1Qd3JDZmdHQmFuZFs1XTsKKworCUJPT0xFQU4gICAgIGJBdXRvVHhBZ2NBOyAgICAgICAgICAgICAgICAvLyBFbmFibGUgZHJpdmVyIGF1dG8gVHggQWdjIGNvbnRyb2wKKwlVQ0hBUgkgICAgVHNzaVJlZkE7CQkJCQkvLyBTdG9yZSBUc3NpIHJlZmVyZW5jZSB2YWx1ZSBhcyAyNSB0ZW1wZXJhdHVyZS4KKwlVQ0hBUgkgICAgVHNzaVBsdXNCb3VuZGFyeUFbNV07CQkvLyBUc3NpIGJvdW5kYXJ5IGZvciBpbmNyZWFzZSBUeCBwb3dlciB0byBjb21wZW5zYXRlLgorCVVDSEFSCSAgICBUc3NpTWludXNCb3VuZGFyeUFbNV07CQkvLyBUc3NpIGJvdW5kYXJ5IGZvciBkZWNyZWFzZSBUeCBwb3dlciB0byBjb21wZW5zYXRlLgorCVVDSEFSCSAgICBUeEFnY1N0ZXBBOwkJCQkJLy8gU3RvcmUgVHggVFNTSSBkZWx0YSBpbmNyZW1lbnQgLyBkZWNyZW1lbnQgdmFsdWUKKwlDSEFSCQlUeEFnY0NvbXBlbnNhdGVBOwkJCS8vIFN0b3JlIHRoZSBjb21wZW5zYXRpb24gKFR4QWdjU3RlcCAqIChpZHgtMSkpCisKKwlCT09MRUFOICAgICBiQXV0b1R4QWdjRzsgICAgICAgICAgICAgICAgLy8gRW5hYmxlIGRyaXZlciBhdXRvIFR4IEFnYyBjb250cm9sCisJVUNIQVIJICAgIFRzc2lSZWZHOwkJCQkJLy8gU3RvcmUgVHNzaSByZWZlcmVuY2UgdmFsdWUgYXMgMjUgdGVtcGVyYXR1cmUuCisJVUNIQVIJICAgIFRzc2lQbHVzQm91bmRhcnlHWzVdOwkJLy8gVHNzaSBib3VuZGFyeSBmb3IgaW5jcmVhc2UgVHggcG93ZXIgdG8gY29tcGVuc2F0ZS4KKwlVQ0hBUgkgICAgVHNzaU1pbnVzQm91bmRhcnlHWzVdOwkJLy8gVHNzaSBib3VuZGFyeSBmb3IgZGVjcmVhc2UgVHggcG93ZXIgdG8gY29tcGVuc2F0ZS4KKwlVQ0hBUgkgICAgVHhBZ2NTdGVwRzsJCQkJCS8vIFN0b3JlIFR4IFRTU0kgZGVsdGEgaW5jcmVtZW50IC8gZGVjcmVtZW50IHZhbHVlCisJQ0hBUgkJVHhBZ2NDb21wZW5zYXRlRzsJCQkvLyBTdG9yZSB0aGUgY29tcGVuc2F0aW9uIChUeEFnY1N0ZXAgKiAoaWR4LTEpKQorCisJLy8rKytGb3IgUlQyODcwLCB0aGUgcGFyYW1ldGVyZXMgaXMgc3RhcnQgZnJvbSBCR1Jzc2lPZmZzZXQxIH4gQkdSc3NpT2Zmc2V0MworCUNIQVIJCUJHUnNzaU9mZnNldDA7CQkJCS8vIFN0b3JlIEIvRyBSU1NJIzAgT2Zmc2V0IHZhbHVlIG9uIEVFUFJPTSAweDQ2aAorCUNIQVIJCUJHUnNzaU9mZnNldDE7CQkJCS8vIFN0b3JlIEIvRyBSU1NJIzEgT2Zmc2V0IHZhbHVlCisJQ0hBUgkJQkdSc3NpT2Zmc2V0MjsJCQkJLy8gU3RvcmUgQi9HIFJTU0kjMiBPZmZzZXQgdmFsdWUKKwkvLy0tLQorCisJLy8rKytGb3IgUlQyODcwLCB0aGUgcGFyYW1ldGVyZXMgaXMgc3RhcnQgZnJvbSBBUnNzaU9mZnNldDEgfiBBUnNzaU9mZnNldDMKKwlDSEFSCQlBUnNzaU9mZnNldDA7CQkJCS8vIFN0b3JlIEEgUlNTSSMwIE9mZnNldCB2YWx1ZSBvbiBFRVBST00gMHg0QWgKKwlDSEFSCQlBUnNzaU9mZnNldDE7CQkJCS8vIFN0b3JlIEEgUlNTSSMxIE9mZnNldCB2YWx1ZQorCUNIQVIJCUFSc3NpT2Zmc2V0MjsJCQkJLy8gU3RvcmUgQSBSU1NJIzIgT2Zmc2V0IHZhbHVlCisJLy8tLS0KKworCUNIQVIJCUJMTkFHYWluOwkJCQkJLy8gU3RvcmUgQi9HIGV4dGVybmFsIExOQSMwIHZhbHVlIG9uIEVFUFJPTSAweDQ0aAorCUNIQVIJCUFMTkFHYWluMDsJCQkJCS8vIFN0b3JlIEEgZXh0ZXJuYWwgTE5BIzAgdmFsdWUgZm9yIGNoMzZ+NjQKKwlDSEFSCQlBTE5BR2FpbjE7CQkJCQkvLyBTdG9yZSBBIGV4dGVybmFsIExOQSMxIHZhbHVlIGZvciBjaDEwMH4xMjgKKwlDSEFSCQlBTE5BR2FpbjI7CQkJCQkvLyBTdG9yZSBBIGV4dGVybmFsIExOQSMyIHZhbHVlIGZvciBjaDEzMn4xNjUKKworCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkvLyBMRUQgY29udHJvbAorCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlNQ1VfTEVEQ1NfU1RSVUMJCUxlZENudGw7CisJVVNIT1JUCQkJCUxlZDE7CS8vIHJlYWQgZnJvbSBFRVBST00gMHgzYworCVVTSE9SVAkJCQlMZWQyOwkvLyBFRVBST00gMHgzZQorCVVTSE9SVAkJCQlMZWQzOwkvLyBFRVBST00gMHg0MAorCVVDSEFSCQkJCUxlZEluZGljYXRvclN0cmVndGg7CisJVUNIQVIJCQkJUnNzaVNpbmdhbHN0cmVuZ3RoT2ZmZXQ7CisgICAgQk9PTEVBTgkJCQliTGVkT25TY2FubmluZzsKKwlVQ0hBUgkJCQlMZWRTdGF0dXM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgODAyLjExIHJlbGF0ZWQgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwkvLyBvdXRnb2luZyBCRUFDT04gZnJhbWUgYnVmZmVyIGFuZCBjb3JyZXNwb25kaW5nIFRYRAorCVRYV0lfU1RSVUMgICAgICAgICAgICAgIAlCZWFjb25UeFdJOworCVBVQ0hBUgkJCQkJCUJlYWNvbkJ1ZjsKKwlVU0hPUlQJCQkJCQlCZWFjb25PZmZzZXRbSFdfQkVBQ09OX01BWF9DT1VOVF07CisKKwkvLyBwcmUtYnVpbGQgUFMtUE9MTCBhbmQgTlVMTCBmcmFtZSB1cG9uIGxpbmsgdXAuIGZvciBlZmZpY2llbmN5IHB1cnBvc2UuCisJUFNQT0xMX0ZSQU1FICAgICAgICAgICAgCVBzUG9sbEZyYW1lOworCUhFQURFUl84MDJfMTEgICAgICAgICAgIAlOdWxsRnJhbWU7CisKKy8vPT09PT09PT09QVA9PT09PT09PT09PQorCisKKy8vPT09PT09PVNUQT09PT09PT09PT09CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisvKiBNb2RpZmllZCBieSBXdSBYaS1LdW4gNC8yMS8yMDA2ICovCisJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkvLyBTVEEgc3BlY2lmaWMgY29uZmlndXJhdGlvbiAmIG9wZXJhdGlvbiBzdGF0dXMKKwkvLyB1c2VkIG9ubHkgd2hlbiBwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBCisJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlTVEFfQURNSU5fQ09ORklHICAgICAgICBTdGFDZmc7ICAgICAgICAgICAvLyB1c2VyIGRlc2lyZWQgc2V0dGluZ3MKKwlTVEFfQUNUSVZFX0NPTkZJRyAgICAgICBTdGFBY3RpdmU7ICAgICAgICAgLy8gdmFsaWQgb25seSB3aGVuIEFESE9DX09OKHBBZCkgfHwgSU5GUkFfT04ocEFkKQorCUNIQVIgICAgICAgICAgICAgICAgICAgIG5pY2tuYW1lW0lXX0VTU0lEX01BWF9TSVpFKzFdOyAvLyBuaWNrbmFtZSwgb25seSB1c2VkIGluIHRoZSBpd2NvbmZpZyBpL2YKKwlORElTX01FRElBX1NUQVRFICAgICAgICBQcmVNZWRpYVN0YXRlOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisvLz09PT09PT1Db21tb249PT09PT09PT09PQorCS8vIE9QIG1vZGU6IGVpdGhlciBBUCBvciBTVEEKKwlVQ0hBUiAgICAgICAgICAgICAgICAgICBPcE1vZGU7ICAgICAgICAgICAgICAgICAgICAgLy8gT1BNT0RFX1NUQSwgT1BNT0RFX0FQCisKKwlORElTX01FRElBX1NUQVRFICAgICAgICBJbmRpY2F0ZU1lZGlhU3RhdGU7CQkJLy8gQmFzZSBvbiBJbmRpY2F0aW9uIHN0YXRlLCBkZWZhdWx0IGlzIE5kaXNNZWRpYVN0YXRlRGlzQ29ubmVjdGVkCisKKwkvLyBNQVQgcmVsYXRlZCBwYXJhbWV0ZXJzCisKKwkvLyBjb25maWd1cmF0aW9uOiByZWFkIGZyb20gUmVnaXN0cnkgJiBFMlBST00KKwlCT09MRUFOICAgICAgICAgICAgICAgICBiTG9jYWxBZG1pbk1BQzsgICAgICAgICAgICAgLy8gVXNlIHVzZXIgY2hhbmdlZCBNQUMKKwlVQ0hBUiAgICAgICAgICAgICAgICAgICBQZXJtYW5lbnRBZGRyZXNzW01BQ19BRERSX0xFTl07ICAgIC8vIEZhY3RvcnkgZGVmYXVsdCBNQUMgYWRkcmVzcworCVVDSEFSICAgICAgICAgICAgICAgICAgIEN1cnJlbnRBZGRyZXNzW01BQ19BRERSX0xFTl07ICAgICAgLy8gVXNlciBjaGFuZ2VkIE1BQyBhZGRyZXNzCisKKwkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkvLyBjb21tb24gY29uZmlndXJhdGlvbiB0byBib3RoIE9QTU9ERV9TVEEgYW5kIE9QTU9ERV9BUAorCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCUNPTU1PTl9DT05GSUcgICAgICAgICAgIENvbW1vbkNmZzsKKwlNTE1FX1NUUlVDVCAgICAgICAgICAgICBNbG1lOworCisJLy8gQVAgbmVlZHMgdGhvc2UgdmFpYWJsZXMgZm9yIHNpdGUgc3VydmV5IGZlYXR1cmUuCisJTUxNRV9BVVggICAgICAgICAgICAgICAgTWxtZUF1eDsgICAgICAgICAgIC8vIHRlbXBvcmFyeSBzZXR0aW5ncyB1c2VkIGR1cmluZyBNTE1FIHN0YXRlIG1hY2hpbmUKKwlCU1NfVEFCTEUgICAgICAgICAgICAgICBTY2FuVGFiOyAgICAgICAgICAgLy8gc3RvcmUgdGhlIGxhdGVzdCBTQ0FOIHJlc3VsdAorCisJLy9BYm91dCBNYWNUYWIsIHRoZSBzdGEgZHJpdmVyIHdpbGwgdXNlICMwIGFuZCAjMSBmb3IgbXVsdGljYXN0IGFuZCBBUC4KKwlNQUNfVEFCTEUgICAgICAgICAgICAgICAgIE1hY1RhYjsgICAgIC8vIEFTSUMgb24tY2hpcCBXQ0lEIGVudHJ5IHRhYmxlLiAgQXQgVFgsIEFTSUMgYWx3YXlzIHVzZSBrZXkgYWNjb3JkaW5nIHRvIHRoaXMgb24tY2hpcCB0YWJsZS4KKwlORElTX1NQSU5fTE9DSyAgICAgICAgICBNYWNUYWJMb2NrOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJQkFfVEFCTEUJCQlCQVRhYmxlOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCU5ESVNfU1BJTl9MT0NLICAgICAgICAgIEJBVGFiTG9jazsKKwlSQUxJTktfVElNRVJfU1RSVUNUIFJFQ0JBVGltZXI7CisKKwkvLyBlbmNyeXB0aW9uL2RlY3J5cHRpb24gS0VZIHRhYmxlcworCUNJUEhFUl9LRVkgICAgICAgICAgICAgIFNoYXJlZEtleVtNQVhfTUJTU0lEX05VTV1bNF07IC8vIFNUQSBhbHdheXMgdXNlIFNoYXJlZEtleVtCU1MwXVswLi4zXQorCisJCS8vIFJYIHJlLWFzc2VtYmx5IGJ1ZmZlciBmb3IgZnJhZ21lbnRhdGlvbgorCUZSQUdNRU5UX0ZSQU1FICAgICAgICAgIEZyYWdGcmFtZTsgICAgICAgICAgICAgICAgICAvLyBGcmFtZSBzdG9yYWdlIGZvciBmcmFnbWVudCBmcmFtZQorCisJLy8gdmFyaW91cyBDb3VudGVycworCUNPVU5URVJfODAyXzMgICAgICAgICAgIENvdW50ZXJzODAyMzsgICAgICAgICAgICAgICAvLyA4MDIuMyBjb3VudGVycworCUNPVU5URVJfODAyXzExICAgICAgICAgIFdsYW5Db3VudGVyczsgICAgICAgICAgICAgICAvLyA4MDIuMTEgTUlCIGNvdW50ZXJzCisJQ09VTlRFUl9SQUxJTksgICAgICAgICAgUmFsaW5rQ291bnRlcnM7ICAgICAgICAgICAgIC8vIFJhbGluayBwcm9wcmlldHkgY291bnRlcnMKKwlDT1VOVEVSX0RSUyAgICAgICAgICAgICBEcnNDb3VudGVyczsgICAgICAgICAgICAgICAgLy8gY291bnRlcnMgZm9yIER5bmFtaWMgVFggUmF0ZSBTd2l0Y2hpbmcKKwlQUklWQVRFX1NUUlVDICAgICAgICAgICBQcml2YXRlSW5mbzsgICAgICAgICAgICAgICAgLy8gUHJpdmF0ZSBpbmZvcm1hdGlvbiAmIGNvdW50ZXJzCisKKwkvLyBmbGFncywgc2VlIGZSVE1QX0FEQVBURVJfeHh4IGZsYWdzCisJVUxPTkcgICAgICAgICAgICAgICAgICAgRmxhZ3M7ICAgICAgICAgICAgICAgICAgICAgIC8vIFJlcHJlc2VudCBjdXJyZW50IGRldmljZSBzdGF0dXMKKworCS8vIGN1cnJlbnQgVFggc2VxdWVuY2UgIworCVVTSE9SVCAgICAgICAgICAgICAgICAgIFNlcXVlbmNlOworCisjaWZkZWYgVU5ERVJfQ0UKKwlORElTX0hBTkRMRSAgICAgICAgICAgICBoR2lJU1I7CisjZW5kaWYKKworCisJLy8gQ29udHJvbCBkaXNjb25uZWN0IC8gY29ubmVjdCBldmVudCBnZW5lcmF0aW9uCisJLy8rKytEaWRuJ3QgdXNlZCBhbnltb3JlCisJVUxPTkcgICAgICAgICAgICAgICAgICAgTGlua0Rvd25UaW1lOworCS8vLS0tCisJVUxPTkcgICAgICAgICAgICAgICAgICAgTGFzdFJ4UmF0ZTsKKwlVTE9ORyAgICAgICAgICAgICAgICAgICBMYXN0VHhSYXRlOworCS8vKysrVXNlZCBvbmx5IGZvciBTdGF0aW9uCisJQk9PTEVBTiAgICAgICAgICAgICAgICAgYkNvbmZpZ0NoYW5nZWQ7ICAgICAgICAgLy8gQ29uZmlnIENoYW5nZSBmbGFnIGZvciB0aGUgc2FtZSBTU0lEIHNldHRpbmcKKwkvLy0tLQorCisJVUxPTkcgICAgICAgICAgICAgICAgICAgRXh0cmFJbmZvOyAgICAgICAgICAgICAgLy8gRXh0cmEgaW5mb3JtYXRpb24gZm9yIGRpc3BsYXlpbmcgc3RhdHVzCisJVUxPTkcgICAgICAgICAgICAgICAgICAgU3lzdGVtRXJyb3JCaXRtYXA7ICAgICAgLy8gYjA6IEUyUFJPTSB2ZXJzaW9uIGVycm9yCisKKwkvLysrK0RpZG4ndCB1c2VkIGFueW1vcmUKKwlVTE9ORyAgICAgICAgICAgICAgICAgICBNYWNJY1ZlcnNpb247ICAgICAgICAgICAvLyBNQUMvQkJQIHNlcmlhbCBpbnRlcmZhY2UgaXNzdWUgc29sdmVkIGFmdGVyIHZlci5ECisJLy8tLS0KKworCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCS8vIFN5c3RlbSBldmVudCBsb2cKKwkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlSVF84MDJfMTFfRVZFTlRfVEFCTEUgICBFdmVudFRhYjsKKworCisJQk9PTEVBTgkJSFRDRW5hYmxlOworCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCS8qICAgICAgU3RhdGlzdGljIHJlbGF0ZWQgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKwlCT09MRUFOCQkJCQkJYlVwZGF0ZUJjbkNudERvbmU7CisJVUxPTkcJCQkJCQl3YXRjaERvZ01hY0RlYWRsb2NrOwkvLyBwcmV2ZW50IE1BQy9CQlAgaW50byBkZWFkbG9jayBjb25kaXRpb24KKwkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJLy8gREVCVUcgcGFyYW1lcnRzCisJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCUJPT0xFQU4JCWJCYW5BbGxCYVNldHVwOworCUJPT0xFQU4JCWJQcm9taXNjdW91czsKKworCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkvLyBydDI4NjBjIGVtdWxhdGlvbi11c2UgUGFyYW1ldGVycworCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlVTE9ORwkJcnRzYWNjdVszMF07CisJVUxPTkcJCWN0c2FjY3VbMzBdOworCVVMT05HCQljZmVuZGFjY3VbMzBdOworCVVMT05HCQliYWNvbnRlbnRbMTZdOworCVVMT05HCQlyeGludFtSWF9SSU5HX1NJWkUrMV07CisJVUNIQVIJCXJjdmJhWzYwXTsKKwlCT09MRUFOCQliTGlua0FkYXB0OworCUJPT0xFQU4JCWJGb3JjZVByaW50VFg7CisJQk9PTEVBTgkJYkZvcmNlUHJpbnRSWDsKKwlCT09MRUFOCQliRGlzYWJsZXNjYW5uaW5nOwkJLy9kZWZpbmVkIGluIFJUMjg3MCBVU0IKKwlCT09MRUFOCQliU3RhRmlmb1Rlc3Q7CisJQk9PTEVBTgkJYlByb3RlY3Rpb25UZXN0OworCUJPT0xFQU4JCWJIQ0NBVGVzdDsKKwlCT09MRUFOCQliR2VuT25lSENDQTsKKwlCT09MRUFOCQliQnJvYWRDb21IVDsKKwkvLysrK0ZvbGxvd2luZyBhZGQgZnJvbSBSVDI4NzAgVVNCLgorCVVMT05HCQlCdWxrT3V0UmVxOworCVVMT05HCQlCdWxrT3V0Q29tcGxldGU7CisJVUxPTkcJCUJ1bGtPdXRDb21wbGV0ZU90aGVyOworCVVMT05HCQlCdWxrT3V0Q29tcGxldGVDYW5jZWw7CS8vIHNlZW1zIG5vdCB1c2Ugbm93PworCVVMT05HCQlCdWxrSW5SZXE7CisJVUxPTkcJCUJ1bGtJbkNvbXBsZXRlOworCVVMT05HCQlCdWxrSW5Db21wbGV0ZUZhaWw7CisJLy8tLS0KKworICAgIHN0cnVjdCB3aWZpY29uZgkJCVdJRkl0ZXN0YmVkOworCisjaWZkZWYgUkFMSU5LX0FURQorCUFURV9JTkZPCQkJCWF0ZTsKKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwlzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1X3Bvb2wgbXBkdV9ibGtfcG9vbDsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCVVMT05HCQkJCQlPbmVTZWNvbmRub25CRXBhY2tldHM7CQkvLyByZWNvcmQgbm9uIEJFIHBhY2tldHMgcGVyIHNlY29uZAorCisjaWYgV0lSRUxFU1NfRVhUID49IDEyCisgICAgc3RydWN0IGl3X3N0YXRpc3RpY3MgICAgaXdfc3RhdHM7CisjZW5kaWYKKworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzCXN0YXRzOworCisjaWZkZWYgQkxPQ0tfTkVUX0lGCisJQkxPQ0tfUVVFVUVfRU5UUlkJCWJsb2NrUXVldWVUYWJbTlVNX09GX1RYX1JJTkddOworI2VuZGlmIC8vIEJMT0NLX05FVF9JRiAvLworCisKKworI2lmZGVmIE1VTFRJUExFX0NBUkRfU1VQUE9SVAorCUlOVDMyCQkJCQlNQ19Sb3dJRDsKKwlVQ0hBUgkJCQkJTUNfRmlsZU5hbWVbMjU2XTsKKyNlbmRpZiAvLyBNVUxUSVBMRV9DQVJEX1NVUFBPUlQgLy8KKworCVVMT05HCQkJCQlUYnR0VGlja0NvdW50OworI2lmZGVmIFBDSV9NU0lfU1VQUE9SVAorCUJPT0xFQU4JCQkJCUhhdmVNc2k7CisjZW5kaWYgLy8gUENJX01TSV9TVVBQT1JUIC8vCisKKworCVVDSEFSCQkJCQlpc19vbjsKKworI2RlZmluZSBUSU1FX0JBU0UJCQkoMTAwMDAwMC9PU19IWikKKyNkZWZpbmUgVElNRV9PTkVfU0VDT05ECQkoMTAwMDAwMC9USU1FX0JBU0UpCisJVUNIQVIJCQkJCWZsZ19iZV9hZGp1c3Q7CisJVUxPTkcJCQkJCWJlX2FkanVzdF9sYXN0X3RpbWU7CisKKyNpZmRlZiBOSU5URU5ET19BUAorCU5JTkRPX0NUUkxfQkxPQ0sJCW5pbmRvX2N0cmxfYmxvY2s7CisjZW5kaWYgLy8gTklOVEVORE9fQVAgLy8KKworCisjaWZkZWYgSUtBTk9TX1ZYXzFYMAorCXN0cnVjdCBJS0FOT1NfVFhfSU5GTwlJa2Fub3NUeEluZm87CisJc3RydWN0IElLQU5PU19UWF9JTkZPCUlrYW5vc1J4SW5mb1tNQVhfTUJTU0lEX05VTSArIE1BWF9XRFNfRU5UUlkgKyBNQVhfQVBDTElfTlVNICsgTUFYX01FU0hfTlVNXTsKKyNlbmRpZiAvLyBJS0FOT1NfVlhfMVgwIC8vCisKKworI2lmZGVmIERCR19ESUFHTk9TRQorCVJ0bXBEaWFnU3RydWN0CURpYWdTdHJ1Y3Q7CisjZW5kaWYgLy8gREJHX0RJQUdOT1NFIC8vCisKKworCVVJTlQ4CQkJCQlQTV9GbGdTdXNwZW5kOworfSBSVE1QX0FEQVBURVIsICpQUlRNUF9BREFQVEVSOworCisvLworLy8gQ2lzY28gSUFQUCBmb3JtYXQKKy8vCit0eXBlZGVmIHN0cnVjdCAgX0NJU0NPX0lBUFBfQ09OVEVOVF8KK3sKKwlVU0hPUlQgICAgIExlbmd0aDsgICAgICAgIC8vSUFQUCBMZW5ndGgKKwlVQ0hBUiAgICAgIE1lc3NhZ2VUeXBlOyAgICAgIC8vSUFQUCB0eXBlCisJVUNIQVIgICAgICBGdW5jdGlvbkNvZGU7ICAgICAvL0lBUFAgZnVuY3Rpb24gdHlwZQorCVVDSEFSICAgICAgRGVzdGluYWlvbk1BQ1tNQUNfQUREUl9MRU5dOworCVVDSEFSICAgICAgU291cmNlTUFDW01BQ19BRERSX0xFTl07CisJVVNIT1JUICAgICBUYWc7ICAgICAgICAgICAvL1RhZyhlbGVtZW50IElFKSAtIEFkamFjZW50IEFQIHJlcG9ydAorCVVTSE9SVCAgICAgVGFnTGVuZ3RoOyAgICAgLy9MZW5ndGggb2YgZWxlbWVudCBub3QgaW5jbHVkaW5nIDQgYnl0ZSBoZWFkZXIKKwlVQ0hBUiAgICAgIE9VSVs0XTsgICAgICAgICAgIC8vMHgwMCwgMHg0MCwgMHg5NiwgMHgwMAorCVVDSEFSICAgICAgUHJldmlvdXNBUFtNQUNfQUREUl9MRU5dOyAgICAgICAvL01BQyBBZGRyZXNzIG9mIGFjY2VzcyBwb2ludAorCVVTSE9SVCAgICAgQ2hhbm5lbDsKKwlVU0hPUlQgICAgIFNzaWRMZW47CisJVUNIQVIgICAgICBTc2lkW01BWF9MRU5fT0ZfU1NJRF07CisJVVNIT1JUICAgICBTZWNvbmRzOyAgICAgICAgICAvL1NlY29uZHMgdGhhdCB0aGUgY2xpZW50IGhhcyBiZWVuIGRpc2Fzc29jaWF0ZWQuCit9IENJU0NPX0lBUFBfQ09OVEVOVCwgKlBDSVNDT19JQVBQX0NPTlRFTlQ7CisKKyNkZWZpbmUgREVMQVlJTlRNQVNLCQkweDAwMDNmZmZiCisjZGVmaW5lIElOVE1BU0sJCQkJMHgwMDAzZmZmYgorI2RlZmluZSBJbmRNYXNrCQkJCTB4MDAwM2ZmZmMKKyNkZWZpbmUgUnhJTlQJCQkJMHgwMDAwMDAwNQkvLyBEZWxheWVkIFJ4IG9yIGluZGl2aSByeAorI2RlZmluZSBUeERhdGFJbnQJCQkweDAwMDAwMGZhCS8vIERlbGF5ZWQgVHggb3IgaW5kaXZpIHR4CisjZGVmaW5lIFR4TWdtdEludAkJCTB4MDAwMDAxMDIJLy8gRGVsYXllZCBUeCBvciBpbmRpdmkgdHgKKyNkZWZpbmUgVHhDb2hlcmVudAkJCTB4MDAwMjAwMDAJLy8gdHggY29oZXJlbnQKKyNkZWZpbmUgUnhDb2hlcmVudAkJCTB4MDAwMTAwMDAJLy8gcnggY29oZXJlbnQKKyNkZWZpbmUgTWN1Q29tbWFuZAkJCTB4MDAwMDAyMDAJLy8gbWN1CisjZGVmaW5lIFByZVRCVFRJbnQJCQkweDAwMDAxMDAwCS8vIFByZS1UQlRUIGludGVycnVwdAorI2RlZmluZSBUQlRUSW50CQkJCTB4MDAwMDA4MDAJCS8vIFRCVFQgaW50ZXJydXB0CisjZGVmaW5lIEdQVGltZU91dEludAkJCTB4MDAwMDgwMDAJCS8vIEdQdGltZW91dCBpbnRlcnJ1cHQKKyNkZWZpbmUgQXV0b1dha2V1cEludAkJMHgwMDAwNDAwMAkJLy8gQXV0b1dha2V1cEludCBpbnRlcnJ1cHQKKyNkZWZpbmUgRmlmb1N0YUZ1bGxJbnQJCQkweDAwMDAyMDAwCS8vICBmaWZvIHN0YXRpc3RpY3MgZnVsbCBpbnRlcnJ1cHQKKworCit0eXBlZGVmIHN0cnVjdCBfUlhfQkxLXworeworCVJUMjhYWF9SWERfU1RSVUMJUnhEOworCVBSWFdJX1NUUlVDCQkJcFJ4V0k7CisJUEhFQURFUl84MDJfMTEJCXBIZWFkZXI7CisJUE5ESVNfUEFDS0VUCQlwUnhQYWNrZXQ7CisJVUNIQVIJCQkJKnBEYXRhOworCVVTSE9SVAkJCQlEYXRhU2l6ZTsKKwlVU0hPUlQJCQkJRmxhZ3M7CisJVUNIQVIJCQkJVXNlclByaW9yaXR5OwkvLyBmb3IgY2FsY3VsYXRlIFRLSVAgTUlDIHVzaW5nCit9IFJYX0JMSzsKKworCisjZGVmaW5lIFJYX0JMS19TRVRfRkxBRyhfcFJ4QmxrLCBfZmxhZykJCShfcFJ4QmxrLT5GbGFncyB8PSBfZmxhZykKKyNkZWZpbmUgUlhfQkxLX1RFU1RfRkxBRyhfcFJ4QmxrLCBfZmxhZykJKF9wUnhCbGstPkZsYWdzICYgX2ZsYWcpCisjZGVmaW5lIFJYX0JMS19DTEVBUl9GTEFHKF9wUnhCbGssIF9mbGFnKQkoX3BSeEJsay0+RmxhZ3MgJj0gfihfZmxhZykpCisKKworI2RlZmluZSBmUlhfV0RTCQkJMHgwMDAxCisjZGVmaW5lIGZSWF9BTVNEVSAgICAgICAweDAwMDIKKyNkZWZpbmUgZlJYX0FSQUxJTksgICAgIDB4MDAwNAorI2RlZmluZSBmUlhfSFRDICAgICAgICAgMHgwMDA4CisjZGVmaW5lIGZSWF9QQUQgICAgICAgICAweDAwMTAKKyNkZWZpbmUgZlJYX0FNUERVICAgICAgIDB4MDAyMAorI2RlZmluZSBmUlhfUU9TCQkJMHgwMDQwCisjZGVmaW5lIGZSWF9JTkZSQQkJMHgwMDgwCisjZGVmaW5lIGZSWF9FQVAJCQkweDAxMDAKKyNkZWZpbmUgZlJYX01FU0gJCTB4MDIwMAorI2RlZmluZSBmUlhfQVBDTEkJCTB4MDQwMAorI2RlZmluZSBmUlhfRExTCQkJMHgwODAwCisjZGVmaW5lIGZSWF9XUEkJCQkweDEwMDAKKworI2RlZmluZSBMRU5HVEhfQU1TRFVfU1VCRlJBTUVIRUFECTE0CisjZGVmaW5lIExFTkdUSF9BUkFMSU5LX1NVQkZSQU1FSEVBRAkxNAorI2RlZmluZSBMRU5HVEhfQVJBTElOS19IRUFERVJfRklFTEQJIDIKKworI2RlZmluZSBUWF9VTktPV05fRlJBTUUJCQkweDAwCisjZGVmaW5lIFRYX01DQVNUX0ZSQU1FCQkJMHgwMQorI2RlZmluZSBUWF9MRUdBQ1lfRlJBTUUJCQkweDAyCisjZGVmaW5lIFRYX0FNUERVX0ZSQU1FCQkJMHgwNAorI2RlZmluZSBUWF9BTVNEVV9GUkFNRQkJCTB4MDgKKyNkZWZpbmUgVFhfUkFMSU5LX0ZSQU1FCQkJMHgxMAorI2RlZmluZSBUWF9GUkFHX0ZSQU1FCQkJMHgyMAorCisKKy8vCUN1cnJlbnRseSB0aGUgc2l6ZW9mKFRYX0JMSykgaXMgMTQ4IGJ5dGVzLgordHlwZWRlZiBzdHJ1Y3QgX1RYX0JMS18KK3sKKwlVQ0hBUgkJCQlRdWVJZHg7CisJVUNIQVIJCQkJVHhGcmFtZVR5cGU7CQkJCS8vIEluZGljYXRlIHRoZSBUcmFuc21pc3Npb24gdHlwZSBvZiB0aGUgYWxsIGZyYW1lcyBpbiBvbmUgYmF0Y2gKKwlVQ0hBUgkJCQlUb3RhbEZyYW1lTnVtOwkJCQkvLyBUb3RhbCBmcmFtZSBudW1iZXIgd2FudCB0byBzZW5kLW91dCBpbiBvbmUgYmF0Y2gKKwlVU0hPUlQJCQkJVG90YWxGcmFnTnVtOwkJCQkvLyBUb3RhbCBmcmFtZSBmcmFnbWVudHMgcmVxdWlyZWQgaW4gb25lIGJhdGNoCisJVVNIT1JUCQkJCVRvdGFsRnJhbWVMZW47CQkJCS8vIFRvdGFsIGxlbmd0aCBvZiBhbGwgZnJhbWVzIHdhbnQgdG8gc2VuZC1vdXQgaW4gb25lIGJhdGNoCisKKwlRVUVVRV9IRUFERVIJCVR4UGFja2V0TGlzdDsKKwlNQUNfVEFCTEVfRU5UUlkJCSpwTWFjRW50cnk7CQkJCQkvLyBOVUxMOiBwYWNrZXQgd2l0aCA4MDIuMTEgUkEgZmllbGQgaXMgbXVsdGljYXN0L2Jyb2FkY2FzdCBhZGRyZXNzCisJSFRUUkFOU01JVF9TRVRUSU5HCSpwVHJhbnNtaXQ7CisKKwkvLyBGb2xsb3dpbmcgc3RydWN0dXJlIHVzZWQgZm9yIHRoZSBjaGFyYWN0ZXJpc3RpY3Mgb2YgYSBzcGVjaWZpYyBwYWNrZXQuCisJUE5ESVNfUEFDS0VUCQlwUGFja2V0OworCVBVQ0hBUgkJCQlwU3JjQnVmSGVhZGVyOwkJCQkvLyBSZWZlcmVuY2UgdG8gdGhlIGhlYWQgb2Ygc2tfYnVmZi0+ZGF0YQorCVBVQ0hBUgkJCQlwU3JjQnVmRGF0YTsJCQkJLy8gUmVmZXJlbmNlIHRvIHRoZSBza19idWZmLT5kYXRhLCB3aWxsIGNoYW5nZWQgZGVwZW5kcyBvbiBoYW5sZGluZyBwcm9ncmVzc3MKKwlVSU5UCQkJCVNyY0J1ZkxlbjsJCQkJCS8vIExlbmd0aCBvZiBwYWNrZXQgcGF5bG9hZCB3aGljaCBub3QgaW5jbHVkaW5nIExheWVyIDIgaGVhZGVyCisJUFVDSEFSCQkJCXBFeHRyYUxsY1NuYXBFbmNhcDsJCQkvLyBOVUxMIG1lYW5zIG5vIGV4dHJhIExMQy9TTkFQIGlzIHJlcXVpcmVkCisJVUNIQVIJCQkJSGVhZGVyQnVmWzgwXTsJCQkJLy8gVGVtcEJ1ZmZlciBmb3IgVFhfSU5GTyArIFRYX1dJICsgODAyLjExIEhlYWRlciArIHBhZGRpbmcgKyBBTVNEVSBTdWJIZWFkZXIgKyBMTEMvU05BUAorCVVDSEFSCQkJCU1wZHVIZWFkZXJMZW47CQkJCS8vIDgwMi4xMSBoZWFkZXIgbGVuZ3RoIE5PVCBpbmNsdWRpbmcgdGhlIHBhZGRpbmcKKwlVQ0hBUgkJCQlIZHJQYWRMZW47CQkJCQkvLyByZWNvcmRpbmcgSGVhZGVyIFBhZGRpbmcgTGVuZ3RoOworCVVDSEFSCQkJCWFwaWR4OwkJCQkJCS8vIFRoZSBpbnRlcmZhY2UgYXNzb2NpYXRlZCB0byB0aGlzIHBhY2tldAorCVVDSEFSCQkJCVdjaWQ7CQkJCQkJLy8gVGhlIE1BQyBlbnRyeSBhc3NvY2lhdGVkIHRvIHRoaXMgcGFja2V0CisJVUNIQVIJCQkJVXNlclByaW9yaXR5OwkJCQkvLyBwcmlvcml0eSBjbGFzcyBvZiBwYWNrZXQKKwlVQ0hBUgkJCQlGcmFtZUdhcDsJCQkJCS8vIHdoYXQga2luZCBvZiBJRlMgdGhpcyBwYWNrZXQgdXNlCisJVUNIQVIJCQkJTXBkdVJlcU51bTsJCQkJCS8vIG51bWJlciBvZiBmcmFnbWVudHMgb2YgdGhpcyBmcmFtZQorCVVDSEFSCQkJCVR4UmF0ZTsJCQkJCQkvLyBUT0RPOiBPYnNvbGV0ZWQ/IFNob3VsZCBjaGFuZ2UgdG8gTUNTPworCVVDSEFSCQkJCUNpcGhlckFsZzsJCQkJCS8vIGNpcGhlciBhbG9ncml0aG0KKwlQQ0lQSEVSX0tFWQkJCXBLZXk7CisKKworCisJVVNIT1JUCQkJCUZsYWdzOwkJCQkJCS8vU2VlIGZvbGxvd2luZyBkZWZpbml0aW9ucyBmb3IgZGV0YWlsLgorCisJLy9ZT1UgU0hPVUxEIE5PVCBUT1VDSCBJVCEgRm9sbG93aW5nIHBhcmFtZXRlcnMgYXJlIHVzZWQgZm9yIGhhcmR3YXJlLWRlcGVuZGVkIGxheWVyLgorCVVMT05HCQkJCVByaXY7CQkJCQkJLy8gSGFyZHdhcmUgc3BlY2lmaWMgdmFsdWUgc2F2ZWQgaW4gaGVyZS4KK30gVFhfQkxLLCAqUFRYX0JMSzsKKworCisjZGVmaW5lIGZUWF9iUnRzUmVxdWlyZWQJCTB4MDAwMQkvLyBJbmRpY2F0ZSBpZiBuZWVkIHNlbmQgUlRTIGZyYW1lIGZvciBwcm90ZWN0aW9uLiBOb3QgdXNlZCBpbiBSVDI4NjAvUlQyODcwLgorI2RlZmluZSBmVFhfYkFja1JlcXVpcmVkICAgICAgIAkweDAwMDIJLy8gdGhlIHBhY2tldCBuZWVkIGFjayByZXNwb25zZQorI2RlZmluZSBmVFhfYlBpZ2d5QmFjayAgICAgCQkweDAwMDQJLy8gTGVnYWN5IGRldmljZSB1c2UgUGlnZ2JhY2sgb3Igbm90CisjZGVmaW5lIGZUWF9iSFRSYXRlICAgICAgICAgCTB4MDAwOAkvLyBhbGxvdyB0byB1c2UgSFQgcmF0ZQorI2RlZmluZSBmVFhfYkZvcmNlTm9uUW9TICAgICAgIAkweDAwMTAJLy8gZm9yY2UgdG8gdHJhbnNtaXQgZnJhbWUgd2l0aG91dCBXTU0tUW9TIGluIEhUIG1vZGUKKyNkZWZpbmUgZlRYX2JBbGxvd0ZyYWcgICAgICAgCTB4MDAyMAkvLyBhbGxvdyB0byBmcmFnbWVudCB0aGUgcGFja2V0LCBBLU1QRFUsIEEtTVNEVSwgQS1SYWxpbmsgaXMgbm90IGFsbG93ZWQgdG8gZnJhZ21lbnQKKyNkZWZpbmUgZlRYX2JNb3JlRGF0YQkJCTB4MDA0MAkvLyB0aGVyZSBhcmUgbW9yZSBkYXRhIHBhY2tldHMgaW4gUG93ZXJTYXZlIFF1ZXVlCisjZGVmaW5lIGZUWF9iV01NCQkJCTB4MDA4MAkvLyBRT1MgRGF0YQorCisjZGVmaW5lIGZUWF9iQ2xlYXJFQVBGcmFtZQkJMHgwMTAwCisKKyNkZWZpbmUgVFhfQkxLX0FTU0lHTl9GTEFHKF9wVHhCbGssIF9mbGFnLCB2YWx1ZSkJXAorCQlkbyB7CQkJCQkJCQkJCVwKKwkJCWlmICh2YWx1ZSkgCQkJCQkJCQlcCisJCQkJKF9wVHhCbGstPkZsYWdzIHw9IF9mbGFnKSAJCQlcCisJCQllbHNlIAkJCQkJCQkJCVwKKwkJCQkoX3BUeEJsay0+RmxhZ3MgJj0gfihfZmxhZykpCQlcCisJCX13aGlsZSgwKQorCisjZGVmaW5lIFRYX0JMS19TRVRfRkxBRyhfcFR4QmxrLCBfZmxhZykJCShfcFR4QmxrLT5GbGFncyB8PSBfZmxhZykKKyNkZWZpbmUgVFhfQkxLX1RFU1RfRkxBRyhfcFR4QmxrLCBfZmxhZykJKCgoX3BUeEJsay0+RmxhZ3MgJiBfZmxhZykgPT0gX2ZsYWcpID8gMSA6IDApCisjZGVmaW5lIFRYX0JMS19DTEVBUl9GTEFHKF9wVHhCbGssIF9mbGFnKQkoX3BUeEJsay0+RmxhZ3MgJj0gfihfZmxhZykpCisKKworCisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCisjaWZkZWYgUlQyODYwCisvLworLy8gRW5hYmxlICYgRGlzYWJsZSBOSUMgaW50ZXJydXB0IHZpYSB3cml0aW5nIGludGVycnVwdCBtYXNrIHJlZ2lzdGVyCisvLyBTaW5jZSBpdCB1c2UgQURBUFRFUiBzdHJ1Y3R1cmUsIGl0IGhhdmUgdG8gYmUgcHV0IGFmdGVyIHN0cnVjdHVyZSBkZWZpbml0aW9uLgorLy8KK19faW5saW5lICAgIFZPSUQgICAgTklDRGlzYWJsZUludGVycnVwdCgKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCkKK3sKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBJTlRfTUFTS19DU1IsIDB4MCk7ICAgICAvLyAwOiBkaXNhYmxlCisJLy9SVE1QX0lPX1dSSVRFMzIocEFkLCBQQkZfSU5UX0VOQSwgMHgwKTsJIAkvLyAweDQxOCBpcyBmb3IgZmlybXdhcmUgLiBTVyBkb2Vzbid0IGhhbmRsZSBoZXJlLgorCVJUTVBfQ0xFQVJfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0FDVElWRSk7Cit9CisKK19faW5saW5lICAgIFZPSUQgICAgTklDRW5hYmxlSW50ZXJydXB0KAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkKQoreworCS8vCisJLy8gRmxhZyAiZk9QX1NUQVRVU19ET1pFIiBPbiwgbWVhbnMgQVNJQyBwdXQgdG8gc2xlZXAsIGVsc2UgbWVhbnMgQVNJQyBXYWtlVXAKKwkvLyBUbyBwcmV2ZW50IFN5c3RlbSBoYW5nLCB3ZSBzaG91bGQgZW5hbGJlIHRoZSBpbnRlcnJ1cHQgd2hlbgorCS8vIEFTSUMgaXMgYWxyZWFkeSBXYWtlIFVwLgorCS8vCisgICAgLy8gUlQyNjYxID0+IHdoZW4gQVNJQyBpcyBzbGVlcGluZywgTUFDIHJlZ2lzdGVyIGNhbm5vdCBiZSByZWFkIGFuZCB3cml0dGVuLgorCS8vIFJUMjg2MCA9PiB3aGVuIEFTSUMgaXMgc2xlZXBpbmcsIE1BQyByZWdpc3RlciBjYW4gYmUgcmVhZCBhbmQgd3JpdHRlbi4KKwkvL2lmICghT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKSkKKwl7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIElOVF9NQVNLX0NTUiwgcEFkLT5pbnRfZW5hYmxlX3JlZyAvKkRFTEFZSU5UTUFTSyovKTsgICAgIC8vIDE6ZW5hYmxlCisJfQorCS8vZWxzZQorCS8vCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoImZPUF9TVEFUVVNfRE9aRSAhXG4iKSk7CisKKwkvL1JUTVBfSU9fV1JJVEUzMihwQWQsIFBCRl9JTlRfRU5BLCAweDAwMDAwMDMwKTsgLy8gMSA6IGVuYWJsZQorCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9BQ1RJVkUpOworfQorI2VuZGlmIC8vIFJUMjg2MCAvLworCisjaWZkZWYgUlRfQklHX0VORElBTgorc3RhdGljIGlubGluZSBWT0lECVdyaXRlQmFja1RvRGVzY3JpcHRvcigKKwlJTiAgUFVDSEFSCQkJRGVzdCwKKyAJSU4JUFVDSEFSCQkJU3JjLAorICAgIElOICBCT09MRUFOCQkJRG9FbmNyeXB0LAorCUlOICBVTE9ORyAgICAgICAgICAgRGVzY3JpcHRvclR5cGUpCit7CisJVUlOVDMyICpwMSwgKnAyOworCisJcDEgPSAoKFVJTlQzMiAqKURlc3QpOworCXAyID0gKChVSU5UMzIgKilTcmMpOworCisJKnAxID0gKnAyOworCSoocDErMikgPSAqKHAyKzIpOworCSoocDErMykgPSAqKHAyKzMpOworCSoocDErMSkgPSAqKHAyKzEpOyAvLyBXb3JkIDE7IHRoaXMgbXVzdCBiZSB3cml0dGVuIGJhY2sgbGFzdAorfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJRW5kaWFuIGNvbnZlcnNpb24gb2YgVHgvUnggZGVzY3JpcHRvciAuCisKKwlBcmd1bWVudHM6CisJCXBBZCAJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCQlwRGF0YQkJCVBvaW50ZXIgdG8gVHgvUnggZGVzY3JpcHRvcgorCQlEZXNjcmlwdG9yVHlwZQlEaXJlY3Rpb24gb2YgdGhlIGZyYW1lCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCU5vdGU6CisJCUNhbGwgdGhpcyBmdW5jdGlvbiB3aGVuIHJlYWQgb3IgdXBkYXRlIGRlc2NyaXB0b3IKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitzdGF0aWMgaW5saW5lIFZPSUQJUlRNUFdJRW5kaWFuQ2hhbmdlKAorCUlOCVBVQ0hBUgkJCXBEYXRhLAorCUlOCVVMT05HCQkJRGVzY3JpcHRvclR5cGUpCit7CisJaW50IHNpemU7CisJaW50IGk7CisKKwlzaXplID0gKChEZXNjcmlwdG9yVHlwZSA9PSBUWVBFX1RYV0kpID8gVFhXSV9TSVpFIDogUlhXSV9TSVpFKTsKKworCWlmKERlc2NyaXB0b3JUeXBlID09IFRZUEVfVFhXSSkKKwl7CisJCSooKFVJTlQzMiAqKShwRGF0YSkpID0gU1dBUDMyKCooKFVJTlQzMiAqKShwRGF0YSkpKTsJCS8vIEJ5dGUgMH4zCisJCSooKFVJTlQzMiAqKShwRGF0YSArIDQpKSA9IFNXQVAzMigqKChVSU5UMzIgKikocERhdGErNCkpKTsJLy8gQnl0ZSA0fjcKKwl9CisJZWxzZQorCXsKKwkJZm9yKGk9MDsgaSA8IHNpemUvNCA7IGkrKykKKwkJCSooKChVSU5UMzIgKilwRGF0YSkgK2kpID0gU1dBUDMyKCooKChVSU5UMzIgKilwRGF0YSkraSkpOworCX0KK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCUVuZGlhbiBjb252ZXJzaW9uIG9mIFR4L1J4IGRlc2NyaXB0b3IgLgorCisJQXJndW1lbnRzOgorCQlwQWQgCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKwkJcERhdGEJCQlQb2ludGVyIHRvIFR4L1J4IGRlc2NyaXB0b3IKKwkJRGVzY3JpcHRvclR5cGUJRGlyZWN0aW9uIG9mIHRoZSBmcmFtZQorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlOb3RlOgorCQlDYWxsIHRoaXMgZnVuY3Rpb24gd2hlbiByZWFkIG9yIHVwZGF0ZSBkZXNjcmlwdG9yCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworI2lmZGVmIFJUMjg2MAorc3RhdGljIGlubGluZSBWT0lECVJUTVBEZXNjcmlwdG9yRW5kaWFuQ2hhbmdlKAorCUlOCVBVQ0hBUgkJCXBEYXRhLAorCUlOCVVMT05HCQkJRGVzY3JpcHRvclR5cGUpCit7CisJKigoVUlOVDMyICopKHBEYXRhKSkgPSBTV0FQMzIoKigoVUlOVDMyICopKHBEYXRhKSkpOwkJLy8gQnl0ZSAwfjMKKwkqKChVSU5UMzIgKikocERhdGEgKyA4KSkgPSBTV0FQMzIoKigoVUlOVDMyICopKHBEYXRhKzgpKSk7CS8vIEJ5dGUgOH4xMQorCSooKFVJTlQzMiAqKShwRGF0YSArMTIpKSA9IFNXQVAzMigqKChVSU5UMzIgKikocERhdGEgKyAxMikpKTsJLy8gQnl0ZSAxMn4xNQorCSooKFVJTlQzMiAqKShwRGF0YSArIDQpKSA9IFNXQVAzMigqKChVSU5UMzIgKikocERhdGEgKyA0KSkpOwkJCQkvLyBCeXRlIDR+NywgdGhpcyBtdXN0IGJlIHN3YXBwZWQgbGFzdAorfQorI2VuZGlmIC8vIFJUMjg2MCAvLworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJRW5kaWFuIGNvbnZlcnNpb24gb2YgYWxsIGtpbmRzIG9mIDgwMi4xMSBmcmFtZXMgLgorCisJQXJndW1lbnRzOgorCQlwQWQgCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKwkJcERhdGEJCQlQb2ludGVyIHRvIHRoZSA4MDIuMTEgZnJhbWUgc3RydWN0dXJlCisJCURpciAJCQlEaXJlY3Rpb24gb2YgdGhlIGZyYW1lCisJCUZyb21SeERvbmVJbnQJQ2FsbGVyIGlzIGZyb20gUnhEb25lIGludGVycnVwdAorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlOb3RlOgorCQlDYWxsIHRoaXMgZnVuY3Rpb24gd2hlbiByZWFkIG9yIHVwZGF0ZSBidWZmZXIgZGF0YQorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK3N0YXRpYyBpbmxpbmUgVk9JRAlSVE1QRnJhbWVFbmRpYW5DaGFuZ2UoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJcERhdGEsCisJSU4JVUxPTkcJCQlEaXIsCisJSU4JQk9PTEVBTiAJCUZyb21SeERvbmVJbnQpCit7CisJUEhFQURFUl84MDJfMTEgcEZyYW1lOworCVBVQ0hBUglwTWFjSGRyOworCisJLy8gc3dhYiAxNiBiaXQgZmllbGRzIC0gRnJhbWUgQ29udHJvbCBmaWVsZAorCWlmKERpciA9PSBESVJfUkVBRCkKKwl7CisJCSooVVNIT1JUICopcERhdGEgPSBTV0FQMTYoKihVU0hPUlQgKilwRGF0YSk7CisJfQorCisJcEZyYW1lID0gKFBIRUFERVJfODAyXzExKSBwRGF0YTsKKwlwTWFjSGRyID0gKFBVQ0hBUikgcEZyYW1lOworCisJLy8gc3dhYiAxNiBiaXQgZmllbGRzIC0gRHVyYXRpb24vSUQgZmllbGQKKwkqKFVTSE9SVCAqKShwTWFjSGRyICsgMikgPSBTV0FQMTYoKihVU0hPUlQgKikocE1hY0hkciArIDIpKTsKKworCS8vIHN3YWIgMTYgYml0IGZpZWxkcyAtIFNlcXVlbmNlIENvbnRyb2wgZmllbGQKKwkqKFVTSE9SVCAqKShwTWFjSGRyICsgMjIpID0gU1dBUDE2KCooVVNIT1JUICopKHBNYWNIZHIgKyAyMikpOworCisJaWYocEZyYW1lLT5GQy5UeXBlID09IEJUWVBFX01HTVQpCisJeworCQlzd2l0Y2gocEZyYW1lLT5GQy5TdWJUeXBlKQorCQl7CisJCQljYXNlIFNVQlRZUEVfQVNTT0NfUkVROgorCQkJY2FzZSBTVUJUWVBFX1JFQVNTT0NfUkVROgorCQkJCS8vIHN3YWIgMTYgYml0IGZpZWxkcyAtIENhcGFiaWxpdHlJbmZvIGZpZWxkCisJCQkJcE1hY0hkciArPSBzaXplb2YoSEVBREVSXzgwMl8xMSk7CisJCQkJKihVU0hPUlQgKilwTWFjSGRyID0gU1dBUDE2KCooVVNIT1JUICopcE1hY0hkcik7CisKKwkJCQkvLyBzd2FiIDE2IGJpdCBmaWVsZHMgLSBMaXN0ZW4gSW50ZXJ2YWwgZmllbGQKKwkJCQlwTWFjSGRyICs9IDI7CisJCQkJKihVU0hPUlQgKilwTWFjSGRyID0gU1dBUDE2KCooVVNIT1JUICopcE1hY0hkcik7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgU1VCVFlQRV9BU1NPQ19SU1A6CisJCQljYXNlIFNVQlRZUEVfUkVBU1NPQ19SU1A6CisJCQkJLy8gc3dhYiAxNiBiaXQgZmllbGRzIC0gQ2FwYWJpbGl0eUluZm8gZmllbGQKKwkJCQlwTWFjSGRyICs9IHNpemVvZihIRUFERVJfODAyXzExKTsKKwkJCQkqKFVTSE9SVCAqKXBNYWNIZHIgPSBTV0FQMTYoKihVU0hPUlQgKilwTWFjSGRyKTsKKworCQkJCS8vIHN3YWIgMTYgYml0IGZpZWxkcyAtIFN0YXR1cyBDb2RlIGZpZWxkCisJCQkJcE1hY0hkciArPSAyOworCQkJCSooVVNIT1JUICopcE1hY0hkciA9IFNXQVAxNigqKFVTSE9SVCAqKXBNYWNIZHIpOworCisJCQkJLy8gc3dhYiAxNiBiaXQgZmllbGRzIC0gQUlEIGZpZWxkCisJCQkJcE1hY0hkciArPSAyOworCQkJCSooVVNIT1JUICopcE1hY0hkciA9IFNXQVAxNigqKFVTSE9SVCAqKXBNYWNIZHIpOworCQkJCWJyZWFrOworCisJCQljYXNlIFNVQlRZUEVfQVVUSDoKKwkJCQkvLyBJZiBmcm9tIEFQSGFuZGxlUnhEb25lSW50ZXJydXB0IHJvdXRpbmUsIGl0IGlzIHN0aWxsIGEgZW5jcnlwdCBmb3JtYXQuCisJCQkJLy8gVGhlIGNvbnZlcnRpb24gaXMgZGVsYXllZCB0byBSVE1QSGFuZGxlRGVjcnlwdGlvbkRvbmVJbnRlcnJ1cHQuCisJCQkJaWYoIUZyb21SeERvbmVJbnQgJiYgcEZyYW1lLT5GQy5XZXAgPT0gMSkKKwkJCQkJYnJlYWs7CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJLy8gc3dhYiAxNiBiaXQgZmllbGRzIC0gQXV0aCBBbGcgTm8uIGZpZWxkCisJCQkJCXBNYWNIZHIgKz0gc2l6ZW9mKEhFQURFUl84MDJfMTEpOworCQkJCQkqKFVTSE9SVCAqKXBNYWNIZHIgPSBTV0FQMTYoKihVU0hPUlQgKilwTWFjSGRyKTsKKworCQkJCQkvLyBzd2FiIDE2IGJpdCBmaWVsZHMgLSBBdXRoIFNlcSBOby4gZmllbGQKKwkJCQkJcE1hY0hkciArPSAyOworCQkJCQkqKFVTSE9SVCAqKXBNYWNIZHIgPSBTV0FQMTYoKihVU0hPUlQgKilwTWFjSGRyKTsKKworCQkJCQkvLyBzd2FiIDE2IGJpdCBmaWVsZHMgLSBTdGF0dXMgQ29kZSBmaWVsZAorCQkJCQlwTWFjSGRyICs9IDI7CisJCQkJCSooVVNIT1JUICopcE1hY0hkciA9IFNXQVAxNigqKFVTSE9SVCAqKXBNYWNIZHIpOworCQkJCX0KKwkJCQlicmVhazsKKworCQkJY2FzZSBTVUJUWVBFX0JFQUNPTjoKKwkJCWNhc2UgU1VCVFlQRV9QUk9CRV9SU1A6CisJCQkJLy8gc3dhYiAxNiBiaXQgZmllbGRzIC0gQmVhY29uSW50ZXJ2YWwgZmllbGQKKwkJCQlwTWFjSGRyICs9IChzaXplb2YoSEVBREVSXzgwMl8xMSkgKyBUSU1FU1RBTVBfTEVOKTsKKwkJCQkqKFVTSE9SVCAqKXBNYWNIZHIgPSBTV0FQMTYoKihVU0hPUlQgKilwTWFjSGRyKTsKKworCQkJCS8vIHN3YWIgMTYgYml0IGZpZWxkcyAtIENhcGFiaWxpdHlJbmZvIGZpZWxkCisJCQkJcE1hY0hkciArPSBzaXplb2YoVVNIT1JUKTsKKwkJCQkqKFVTSE9SVCAqKXBNYWNIZHIgPSBTV0FQMTYoKihVU0hPUlQgKilwTWFjSGRyKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBTVUJUWVBFX0RFQVVUSDoKKwkJCWNhc2UgU1VCVFlQRV9ESVNBU1NPQzoKKwkJCQkvLyBzd2FiIDE2IGJpdCBmaWVsZHMgLSBSZWFzb24gY29kZSBmaWVsZAorCQkJCXBNYWNIZHIgKz0gc2l6ZW9mKEhFQURFUl84MDJfMTEpOworCQkJCSooVVNIT1JUICopcE1hY0hkciA9IFNXQVAxNigqKFVTSE9SVCAqKXBNYWNIZHIpOworCQkJCWJyZWFrOworCQl9CisJfQorCWVsc2UgaWYoIHBGcmFtZS0+RkMuVHlwZSA9PSBCVFlQRV9EQVRBICkKKwl7CisJfQorCWVsc2UgaWYocEZyYW1lLT5GQy5UeXBlID09IEJUWVBFX0NOVEwpCisJeworCQlzd2l0Y2gocEZyYW1lLT5GQy5TdWJUeXBlKQorCQl7CisJCQljYXNlIFNVQlRZUEVfQkxPQ0tfQUNLX1JFUToKKwkJCQl7CisJCQkJCVBGUkFNRV9CQV9SRVEgcEJBUmVxID0gKFBGUkFNRV9CQV9SRVEpcEZyYW1lOworCQkJCQkqKFVTSE9SVCAqKSgmcEJBUmVxLT5CQVJDb250cm9sKSA9IFNXQVAxNigqKFVTSE9SVCAqKSgmcEJBUmVxLT5CQVJDb250cm9sKSk7CisJCQkJCXBCQVJlcS0+QkFTdGFydGluZ1NlcS53b3JkID0gU1dBUDE2KHBCQVJlcS0+QkFTdGFydGluZ1NlcS53b3JkKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIFNVQlRZUEVfQkxPQ0tfQUNLOgorCQkJCS8vIEZvciBCbG9jayBBY2sgcGFja2V0LCB0aGUgSFRfQ09OVFJPTCBmaWVsZCBpcyBpbiB0aGUgc2FtZSBvZmZzZXQgd2l0aCBBZGRyMworCQkJCSooVUlOVDMyICopKCZwRnJhbWUtPkFkZHIzWzBdKSA9IFNXQVAzMigqKFVJTlQzMiAqKSgmcEZyYW1lLT5BZGRyM1swXSkpOworCQkJCWJyZWFrOworCisJCQljYXNlIFNVQlRZUEVfQUNLOgorCQkJCS8vRm9yIEFDSyBwYWNrZXQsIHRoZSBIVF9DT05UUk9MIGZpZWxkIGlzIGluIHRoZSBzYW1lIG9mZnNldCB3aXRoIEFkZHIyCisJCQkJKihVSU5UMzIgKikoJnBGcmFtZS0+QWRkcjJbMF0pPQlTV0FQMzIoKihVSU5UMzIgKikoJnBGcmFtZS0+QWRkcjJbMF0pKTsKKwkJCQlicmVhazsKKwkJfQorCX0KKwllbHNlCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIkludmFsaWQgRnJhbWUgVHlwZSEhIVxuIikpOworCX0KKworCS8vIHN3YWIgMTYgYml0IGZpZWxkcyAtIEZyYW1lIENvbnRyb2wKKwlpZihEaXIgPT0gRElSX1dSSVRFKQorCXsKKwkJKihVU0hPUlQgKilwRGF0YSA9IFNXQVAxNigqKFVTSE9SVCAqKXBEYXRhKTsKKwl9Cit9CisjZW5kaWYgLy8gUlRfQklHX0VORElBTiAvLworCisKK3N0YXRpYyBpbmxpbmUgVk9JRCBDb252ZXJ0TXVsdGljYXN0SVAyTUFDKAorCUlOIFBVQ0hBUiBwSXBBZGRyLAorCUlOIFBVQ0hBUiAqcHBNYWNBZGRyLAorCUlOIFVJTlQxNiBQcm90b1R5cGUpCit7CisJaWYgKHBJcEFkZHIgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJaWYgKHBwTWFjQWRkciA9PSBOVUxMIHx8ICpwcE1hY0FkZHIgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJc3dpdGNoIChQcm90b1R5cGUpCisJeworCQljYXNlIEVUSF9QX0lQVjY6CisvLwkJCW1lbXNldCgqcHBNYWNBZGRyLCAwLCBFVEhfTEVOR1RIX09GX0FERFJFU1MpOworCQkJKigqcHBNYWNBZGRyKSA9IDB4MzM7CisJCQkqKCpwcE1hY0FkZHIgKyAxKSA9IDB4MzM7CisJCQkqKCpwcE1hY0FkZHIgKyAyKSA9IHBJcEFkZHJbMTJdOworCQkJKigqcHBNYWNBZGRyICsgMykgPSBwSXBBZGRyWzEzXTsKKwkJCSooKnBwTWFjQWRkciArIDQpID0gcElwQWRkclsxNF07CisJCQkqKCpwcE1hY0FkZHIgKyA1KSA9IHBJcEFkZHJbMTVdOworCQkJYnJlYWs7CisKKwkJY2FzZSBFVEhfUF9JUDoKKwkJZGVmYXVsdDoKKy8vCQkJbWVtc2V0KCpwcE1hY0FkZHIsIDAsIEVUSF9MRU5HVEhfT0ZfQUREUkVTUyk7CisJCQkqKCpwcE1hY0FkZHIpID0gMHgwMTsKKwkJCSooKnBwTWFjQWRkciArIDEpID0gMHgwMDsKKwkJCSooKnBwTWFjQWRkciArIDIpID0gMHg1ZTsKKwkJCSooKnBwTWFjQWRkciArIDMpID0gcElwQWRkclsxXSAmIDB4N2Y7CisJCQkqKCpwcE1hY0FkZHIgKyA0KSA9IHBJcEFkZHJbMl07CisJCQkqKCpwcE1hY0FkZHIgKyA1KSA9IHBJcEFkZHJbM107CisJCQlicmVhazsKKwl9CisKKwlyZXR1cm47Cit9CisKK0JPT0xFQU4gUlRNUENoZWNrRm9ySGFuZygKKwlJTiAgTkRJU19IQU5ETEUgTWluaXBvcnRBZGFwdGVyQ29udGV4dAorCSk7CisKK1ZPSUQgIFJUTVBIYWx0KAorCUlOICBORElTX0hBTkRMRSBNaW5pcG9ydEFkYXB0ZXJDb250ZXh0CisJKTsKKworLy8KKy8vICBQcml2YXRlIHJvdXRpbmVzIGluIHJ0bXBfaW5pdC5jCisvLworTkRJU19TVEFUVVMgUlRNUEFsbG9jQWRhcHRlckJsb2NrKAorCUlOIFBWT0lECQkJaGFuZGxlLAorCU9VVCBQUlRNUF9BREFQVEVSICAgKnBwQWRhcHRlcgorCSk7CisKK05ESVNfU1RBVFVTIFJUTVBBbGxvY1R4UnhSaW5nTWVtb3J5KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkCisJKTsKKworTkRJU19TVEFUVVMgUlRNUEZpbmRBZGFwdGVyKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBORElTX0hBTkRMRSAgICAgV3JhcHBlckNvbmZpZ3VyYXRpb25Db250ZXh0CisJKTsKKworTkRJU19TVEFUVVMJUlRNUFJlYWRQYXJhbWV0ZXJzSG9vaygKKwlJTglQUlRNUF9BREFQVEVSIHBBZAorCSk7CisKK1ZPSUQgUlRNUEZyZWVBZGFwdGVyKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkCisJKTsKKworTkRJU19TVEFUVVMgTklDUmVhZFJlZ1BhcmFtZXRlcnMoCisJSU4gIFBSVE1QX0FEQVBURVIgICAgICAgcEFkLAorCUlOICBORElTX0hBTkRMRSAgICAgICAgIFdyYXBwZXJDb25maWd1cmF0aW9uQ29udGV4dAorCSk7CisKKworVk9JRCBOSUNSZWFkRUVQUk9NUGFyYW1ldGVycygKKwlJTiAgUFJUTVBfQURBUFRFUiAgICAgICBwQWQsCisJSU4JUFVDSEFSCQkJCW1hY19hZGRyKTsKKworVk9JRCBOSUNJbml0QXNpY0Zyb21FRVBST00oCisJSU4gIFBSVE1QX0FEQVBURVIgICAgICAgcEFkKTsKKworVk9JRCBOSUNJbml0VHhSeFJpbmdBbmRCYWNrbG9nUXVldWUoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitORElTX1NUQVRVUyBOSUNJbml0aWFsaXplQWRhcHRlcigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgIEJPT0xFQU4gICAgYkhhcmRSZXNldCk7CisKK05ESVNfU1RBVFVTIE5JQ0luaXRpYWxpemVBc2ljKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBCT09MRUFOCQliSGFyZFJlc2V0KTsKKworVk9JRCBOSUNJc3N1ZVJlc2V0KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworVk9JRCBSVE1QUmluZ0NsZWFuVXAoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFVDSEFSICAgICAgICAgICBSaW5nVHlwZSk7CisKK1ZPSUQgUnhUZXN0KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworTkRJU19TVEFUVVMgRGJnU2VuZFBhY2tldCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgUE5ESVNfUEFDS0VUICAgIHBQYWNrZXQpOworCitWT0lEIFVzZXJDZmdJbml0KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworVk9JRCBOSUNSZXNldEZyb21FcnJvcigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK1ZPSUQgTklDRXJhc2VGaXJtd2FyZSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK05ESVNfU1RBVFVTIE5JQ0xvYWRGaXJtd2FyZSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK05ESVNfU1RBVFVTIE5JQ0xvYWRSYXRlU3dpdGNoaW5nUGFyYW1zKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKworQk9PTEVBTiBOSUNDaGVja0ZvckhhbmcoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitWT0lEIE5JQ1VwZGF0ZUZpZm9TdGFDb3VudGVycygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK1ZPSUQgTklDVXBkYXRlUmF3Q291bnRlcnMoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitVTE9ORwlSVE1QTm90QWxsWmVybygKKwlJTglQVk9JRAlwU3JjMSwKKwlJTglVTE9ORwlMZW5ndGgpOworCitWT0lEIFJUTVBaZXJvTWVtb3J5KAorCUlOICBQVk9JRCAgIHBTcmMsCisJSU4gIFVMT05HICAgTGVuZ3RoKTsKKworVUxPTkcgUlRNUENvbXBhcmVNZW1vcnkoCisJSU4gIFBWT0lEICAgcFNyYzEsCisJSU4gIFBWT0lEICAgcFNyYzIsCisJSU4gIFVMT05HICAgTGVuZ3RoKTsKKworVk9JRCBSVE1QTW92ZU1lbW9yeSgKKwlPVVQgUFZPSUQgICBwRGVzdCwKKwlJTiAgUFZPSUQgICBwU3JjLAorCUlOICBVTE9ORyAgIExlbmd0aCk7CisKK1ZPSUQgQXRvSCgKKwljaGFyCSpzcmMsCisJVUNIQVIJKmRlc3QsCisJaW50CQlkZXN0bGVuKTsKKworVUNIQVIgQnRvSCgKKwljaGFyIGNoKTsKKworVk9JRCBSVE1QUGF0Y2hNYWNCYnBCdWcoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitWT0lEIFJUTVBQYXRjaENhcmRCdXMoCisJSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlcik7CisKK1ZPSUQgUlRNUFBhdGNoUmFsaW5rQ2FyZEJ1cygKKwlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAorCUlOCVVMT05HCQkJQnVzKTsKKworVUxPTkcgUlRNUFJlYWRDQkNvbmZpZygKKwlJTglVTE9ORwlCdXMsCisJSU4JVUxPTkcJU2xvdCwKKwlJTglVTE9ORwlGdW5jLAorCUlOCVVMT05HCU9mZnNldCk7CisKK1ZPSUQgUlRNUFdyaXRlQ0JDb25maWcoCisJSU4JVUxPTkcJQnVzLAorCUlOCVVMT05HCVNsb3QsCisJSU4JVUxPTkcJRnVuYywKKwlJTglVTE9ORwlPZmZzZXQsCisJSU4JVUxPTkcJVmFsdWUpOworCitWT0lEIFJUTVBJbml0VGltZXIoCisJSU4gIFBSVE1QX0FEQVBURVIgICAgICAgICAgIHBBZCwKKwlJTiAgUFJBTElOS19USU1FUl9TVFJVQ1QgICAgcFRpbWVyLAorCUlOICBQVk9JRCAgICAgICAgICAgICAgICAgICBwVGltZXJGdW5jLAorCUlOCVBWT0lECQkJCQlwRGF0YSwKKwlJTiAgQk9PTEVBTiAgICAgICAgICAgICAgICAgUmVwZWF0KTsKKworVk9JRCBSVE1QU2V0VGltZXIoCisJSU4gIFBSQUxJTktfVElNRVJfU1RSVUNUICAgIHBUaW1lciwKKwlJTiAgVUxPTkcgICAgICAgICAgICAgICAgICAgVmFsdWUpOworCisKK1ZPSUQgUlRNUE1vZFRpbWVyKAorCUlOCVBSQUxJTktfVElNRVJfU1RSVUNUCXBUaW1lciwKKwlJTglVTE9ORwkJCQkJVmFsdWUpOworCitWT0lEIFJUTVBDYW5jZWxUaW1lcigKKwlJTiAgUFJBTElOS19USU1FUl9TVFJVQ1QgICAgcFRpbWVyLAorCU9VVCBCT09MRUFOICAgICAgICAgICAgICAgICAqcENhbmNlbGxlZCk7CisKK1ZPSUQgUlRNUFNldExFRCgKKwlJTiBQUlRNUF9BREFQVEVSIAlwQWQsCisJSU4gVUNIQVIJCQlTdGF0dXMpOworCitWT0lEIFJUTVBTZXRTaWduYWxMRUQoCisJSU4gUFJUTVBfQURBUFRFUiAJcEFkLAorCUlOIE5ESVNfODAyXzExX1JTU0kgRGJtKTsKKworVk9JRCBSVE1QRW5hYmxlUnhUeCgKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCk7CisKKy8vCisvLyBwcm90b3R5cGUgaW4gYWN0aW9uLmMKKy8vCitWT0lEIEFjdGlvblN0YXRlTWFjaGluZUluaXQoCisgICAgSU4JUFJUTVBfQURBUFRFUglwQWQsCisgICAgSU4gIFNUQVRFX01BQ0hJTkUgKlMsCisgICAgT1VUIFNUQVRFX01BQ0hJTkVfRlVOQyBUcmFuc1tdKTsKKworVk9JRCBNbG1lQUREQkFBY3Rpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBNbG1lREVMQkFBY3Rpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBNbG1lRExTQWN0aW9uKAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgTWxtZUludmFsaWRBY3Rpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBNbG1lUU9TQWN0aW9uKAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKK1ZPSUQgUGVlckFkZEJBUmVxQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgUGVlckFkZEJBUnNwQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgUGVlckRlbEJBQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgUGVlckJBQWN0aW9uKAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKK1ZPSUQgU2VuZFBTTVBBY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUglwQWQsCisJSU4gVUNIQVIJCQlXY2lkLAorCUlOIFVDSEFSCQkJUHNtcCk7CisKKworI2lmZGVmIERPVDExTl9EUkFGVDMKK1ZPSUQgU2VuZEJTUzIwNDBDb2V4aXN0TWdtdEFjdGlvbigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVQ0hBUglXY2lkLAorCUlOCVVDSEFSCWFwaWR4LAorCUlOCVVDSEFSCUluZm9SZXEpOworCitWT0lEIFNlbmROb3RpZnlCV0FjdGlvbkZyYW1lKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVDSEFSICBXY2lkLAorCUlOIFVDSEFSIGFwaWR4KTsKKworQk9PTEVBTiBDaGFubmVsU3dpdGNoU2FuaXR5Q2hlY2soCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4gICAgVUNIQVIgIFdjaWQsCisJSU4gICAgVUNIQVIgIE5ld0NoYW5uZWwsCisJSU4gICAgVUNIQVIgIFNlY29uZGFyeSk7CisKK1ZPSUQgQ2hhbm5lbFN3aXRjaEFjdGlvbigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiAgICBVQ0hBUiAgV2NpZCwKKwlJTiAgICBVQ0hBUiAgQ2hhbm5lbCwKKwlJTiAgICBVQ0hBUiAgU2Vjb25kYXJ5KTsKKworVUxPTkcgQnVpbGRJbnRvbGVyYW50Q2hhbm5lbFJlcCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiAgICBQVUNIQVIgIHBEZXN0KTsKKworVk9JRCBVcGRhdGUyMDQwQ29leGlzdEZyYW1lQW5kTm90aWZ5KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOICAgIFVDSEFSICBXY2lkLAorCUlOCUJPT0xFQU4JYkFkZEludG9sZXJhbnRDaGEpOworCitWT0lEIFNlbmQyMDQwQ29leGlzdEFjdGlvbigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiAgICBVQ0hBUiAgV2NpZCwKKwlJTglCT09MRUFOCWJBZGRJbnRvbGVyYW50Q2hhKTsKKyNlbmRpZiAvLyBET1QxMU5fRFJBRlQzIC8vCisKK1ZPSUQgUGVlclJNQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgUGVlclB1YmxpY0FjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCitWT0lEIFN0YVB1YmxpY0FjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVQ0hBUiBCc3MyMDQwQ29leGlzdCk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKworVk9JRCBQZWVyQlNTVHJhbkFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCitWT0lEIFBlZXJIVEFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCitWT0lEIFBlZXJRT1NBY3Rpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorVk9JRCBQZWVyRExTQWN0aW9uKAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKK1ZPSUQgRGxzUGFybUZpbGwoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gT1VUIE1MTUVfRExTX1JFUV9TVFJVQ1QgKnBEbHNSZXEsCisJSU4gUFJUXzgwMl8xMV9ETFMgcERscywKKwlJTiBVU0hPUlQgcmVhc29uKTsKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorVk9JRCBSRUNCQVRpbWVyVGltZW91dCgKKyAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCisgICAgSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAorICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKKyAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpOworCitWT0lEIE9SSUJBVGltZXJUaW1lb3V0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKTsKKworVk9JRCBTZW5kUmVmcmVzaEJBUigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglNQUNfVEFCTEVfRU5UUlkJKnBFbnRyeSk7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKK1ZPSUQgQWN0SGVhZGVySW5pdCgKKyAgICBJTglQUlRNUF9BREFQVEVSCXBBZCwKKyAgICBJTiBPVVQgUEhFQURFUl84MDJfMTEgcEhkcjgwMjExLAorICAgIElOIFBVQ0hBUiBBZGRyMSwKKyAgICBJTiBQVUNIQVIgQWRkcjIsCisgICAgSU4gUFVDSEFSIEFkZHIzKTsKKworVk9JRCBCYXJIZWFkZXJJbml0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOIE9VVCBQRlJBTUVfQkFSIHBDbnRsQmFyLAorCUlOIFBVQ0hBUiBwREEsCisJSU4gUFVDSEFSIHBTQSk7CisKK1ZPSUQgSW5zZXJ0QWN0RmllbGQoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJT1VUIFBVQ0hBUiBwRnJhbWVCdWYsCisJT1VUIFBVTE9ORyBwRnJhbWVMZW4sCisJSU4gVUlOVDggQ2F0ZWdvcnksCisJSU4gVUlOVDggQWN0Q29kZSk7CisKK0JPT0xFQU4gUW9zQkFEYXRhUGFyc2UoCisJSU4gUFJUTVBfQURBUFRFUglwQWQsCisJSU4gQk9PTEVBTiBiQU1TRFUsCisJSU4gUFVDSEFSIHA4MDIzSGVhZGVyLAorCUlOIFVDSEFSCVdDSUQsCisJSU4gVUNIQVIJVElELAorCUlOIFVTSE9SVCBTZXF1ZW5jZSwKKwlJTiBVQ0hBUiBEYXRhT2Zmc2V0LAorCUlOIFVTSE9SVCBEYXRhc2l6ZSwKKwlJTiBVSU5UICAgQ3VyUnhJbmRleCk7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKK0JPT0xFQU4gQ250bEVucXVldWVGb3JSZWN2KAorICAgIElOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOIFVMT05HIFdjaWQsCisgICAgSU4gVUxPTkcgTXNnTGVuLAorCUlOIFBGUkFNRV9CQV9SRVEgcE1zZyk7CisKK1ZPSUQgQmFBdXRvTWFuU3dpdGNoKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworVk9JRCBIVElPVENoZWNrKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOICAgIFVDSEFSICAgICBCYXRSZWNJZHgpOworCisvLworLy8gUHJpdmF0ZSByb3V0aW5lcyBpbiBydG1wX2RhdGEuYworLy8KK0JPT0xFQU4gUlRNUEhhbmRsZVJ4RG9uZUludGVycnVwdCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK1ZPSUQgUlRNUEhhbmRsZVR4RG9uZUludGVycnVwdCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK0JPT0xFQU4gUlRNUEhhbmRsZVR4UmluZ0RtYURvbmVJbnRlcnJ1cHQoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIElOVF9TT1VSQ0VfQ1NSX1NUUlVDIFR4UmluZ0JpdG1hcCk7CisKK1ZPSUQgUlRNUEhhbmRsZU1nbXRSaW5nRG1hRG9uZUludGVycnVwdCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK1ZPSUQgUlRNUEhhbmRsZVRCVFRJbnRlcnJ1cHQoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitWT0lEIFJUTVBIYW5kbGVQcmVUQlRUSW50ZXJydXB0KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKwordm9pZCBSVE1QSGFuZGxlVHdha2V1cEludGVycnVwdCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK1ZPSUQJUlRNUEhhbmRsZVJ4Q29oZXJlbnRJbnRlcnJ1cHQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQpOworCitCT09MRUFOIFR4RnJhbWVJc0FnZ3JlZ2F0aWJsZSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBQcmV2QWRkcjEsCisJSU4gIFBVQ0hBUiAgICAgICAgICBwODAyM2hkcik7CisKK0JPT0xFQU4gUGVlcklzQWdncmVPbigKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKyAgICBJTiAgVUxPTkcgICAgICAgICAgVHhSYXRlLAorICAgIElOICBQTUFDX1RBQkxFX0VOVFJZIHBNYWNFbnRyeSk7CisKK05ESVNfU1RBVFVTIFNuaWZmMkJ5dGVzRnJvbU5kaXNCdWZmZXIoCisJSU4gIFBORElTX0JVRkZFUiAgICBwRmlyc3RCdWZmZXIsCisJSU4gIFVDSEFSICAgICAgICAgICBEZXNpcmVkT2Zmc2V0LAorCU9VVCBQVUNIQVIgICAgICAgICAgcEJ5dGUwLAorCU9VVCBQVUNIQVIgICAgICAgICAgcEJ5dGUxKTsKKworTkRJU19TVEFUVVMgU1RBU2VuZFBhY2tldCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgUE5ESVNfUEFDS0VUICAgIHBQYWNrZXQpOworCitWT0lEIFNUQVNlbmRQYWNrZXRzKAorCUlOICBORElTX0hBTkRMRSAgICAgTWluaXBvcnRBZGFwdGVyQ29udGV4dCwKKwlJTiAgUFBORElTX1BBQ0tFVCAgIHBwUGFja2V0QXJyYXksCisJSU4gIFVJTlQgICAgICAgICAgICBOdW1iZXJPZlBhY2tldHMpOworCitWT0lEIFJUTVBEZVF1ZXVlUGFja2V0KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorICAgCUlOCUJPT0xFQU4JCQliSW50Q29udGV4dCwKKwlJTiAgVUNIQVIJCQlRdWVJZHgsCisJSU4JVUNIQVIJCQlNYXhfVHhfUGFja2V0cyk7CisKK05ESVNfU1RBVFVTCVJUTVBIYXJkVHJhbnNtaXQoCisJSU4gUFJUTVBfQURBUFRFUglwQWQsCisJSU4gUE5ESVNfUEFDS0VUCQlwUGFja2V0LAorCUlOICBVQ0hBUgkJCVF1ZUlkeCwKKwlPVVQJUFVMT05HCQkJcEZyZWVUWERMZWZ0KTsKKworTkRJU19TVEFUVVMJU1RBSGFyZFRyYW5zbWl0KAorCUlOIFBSVE1QX0FEQVBURVIJcEFkLAorCUlOIFRYX0JMSwkJCSpwVHhCbGssCisJSU4gIFVDSEFSCQkJUXVlSWR4KTsKKworVk9JRCBTVEFSeEVBUE9MRnJhbWVJbmRpY2F0ZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglNQUNfVEFCTEVfRU5UUlkJKnBFbnRyeSwKKwlJTglSWF9CTEsJCQkqcFJ4QmxrLAorCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpOworCitORElTX1NUQVRVUyBSVE1QRnJlZVRYRFJlcXVlc3QoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFVDSEFSICAgICAgICAgICBSaW5nVHlwZSwKKwlJTiAgVUNIQVIgICAgICAgICAgIE51bWJlclJlcXVpcmVkLAorCUlOIAlQVUNIQVIgICAgICAgICAgRnJlZU51bWJlcklzKTsKKworTkRJU19TVEFUVVMgTWxtZUhhcmRUcmFuc21pdCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgVUNIQVIJUXVlSWR4LAorCUlOICBQTkRJU19QQUNLRVQgICAgcFBhY2tldCk7CisKK05ESVNfU1RBVFVTIE1sbWVIYXJkVHJhbnNtaXRNZ210UmluZygKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgVUNIQVIJUXVlSWR4LAorCUlOICBQTkRJU19QQUNLRVQgICAgcFBhY2tldCk7CisKK05ESVNfU1RBVFVTIE1sbWVIYXJkVHJhbnNtaXRUeFJpbmcoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFVDSEFSCVF1ZUlkeCwKKwlJTiAgUE5ESVNfUEFDS0VUICAgIHBQYWNrZXQpOworCitVU0hPUlQgIFJUTVBDYWxjRHVyYXRpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFVDSEFSICAgICAgICAgICBSYXRlLAorCUlOICBVTE9ORyAgICAgICAgICAgU2l6ZSk7CisKK1ZPSUQgUlRNUFdyaXRlVHhXSSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVFhXSV9TVFJVQwkJcFR4V0ksCisJSU4gIEJPT0xFQU4gICAgCQlGUkFHLAorCUlOICBCT09MRUFOICAgIAkJQ0ZBQ0ssCisJSU4gIEJPT0xFQU4gICAgCQlJbnNUaW1lc3RhbXAsCisJSU4JQk9PTEVBTgkJCUFNUERVLAorCUlOCUJPT0xFQU4JCQlBY2ssCisJSU4JQk9PTEVBTgkJCU5TZXEsCQkvLyBIVyBuZXcgYSBzZXF1ZW5jZS4KKwlJTglVQ0hBUgkJCUJBU2l6ZSwKKwlJTglVQ0hBUgkJCVdDSUQsCisJSU4JVUxPTkcJCQlMZW5ndGgsCisJSU4gIFVDSEFSICAgICAgCQlQSUQsCisJSU4JVUNIQVIJCQlUSUQsCisJSU4JVUNIQVIJCQlUeFJhdGUsCisJSU4JVUNIQVIJCQlUeG9wbW9kZSwKKwlJTglCT09MRUFOCQkJQ2ZBY2ssCisJSU4JSFRUUkFOU01JVF9TRVRUSU5HCSpwVHJhbnNtaXQpOworCisKK1ZPSUQgUlRNUFdyaXRlVHhXSV9EYXRhKAorCUlOCVBSVE1QX0FEQVBURVIJCXBBZCwKKwlJTglPVVQgUFRYV0lfU1RSVUMJCXBUeFdJLAorCUlOCVRYX0JMSwkJCQkqcFR4QmxrKTsKKworCitWT0lEIFJUTVBXcml0ZVR4V0lfQ2FjaGUoCisJSU4JUFJUTVBfQURBUFRFUgkJcEFkLAorCUlOCU9VVCBQVFhXSV9TVFJVQwkJcFR4V0ksCisJSU4JVFhfQkxLCQkJCSpwVHhCbGspOworCitWT0lEIFJUTVBXcml0ZVR4RGVzY3JpcHRvcigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVFhEX1NUUlVDCQlwVHhELAorCUlOCUJPT0xFQU4JCQliV0lWLAorCUlOCVVDSEFSCQkJUVNFTCk7CisKK1ZPSUQgUlRNUFN1c3BlbmRNc2R1VHJhbnNtaXNzaW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworVk9JRCBSVE1QUmVzdW1lTXNkdVRyYW5zbWlzc2lvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK05ESVNfU1RBVFVTIE1pbmlwb3J0TU1SZXF1ZXN0KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOCVVDSEFSCQkJUXVlSWR4LAorCUlOCVBVQ0hBUgkJCXBEYXRhLAorCUlOICBVSU5UICAgICAgICAgICAgTGVuZ3RoKTsKKworVk9JRCBSVE1QU2VuZE51bGxGcmFtZSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgVUNIQVIgICAgICAgICAgIFR4UmF0ZSwKKwlJTglCT09MRUFOCQkJYlFvc051bGwpOworCitWT0lEIFJUTVBTZW5kRGlzYXNzb2NpYXRpb25GcmFtZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCk7CisKK1ZPSUQgUlRNUFNlbmRSVFNGcmFtZSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBEQSwKKwlJTgl1bnNpZ25lZCBpbnQJTmV4dE1wZHVTaXplLAorCUlOICBVQ0hBUiAgICAgICAgICAgVHhSYXRlLAorCUlOICBVQ0hBUiAgICAgICAgICAgUlRTUmF0ZSwKKwlJTiAgVVNIT1JUICAgICAgICAgIEFja0R1cmF0aW9uLAorCUlOICBVQ0hBUiAgICAgICAgICAgUXVlSWR4LAorCUlOICBVQ0hBUgkJCUZyYW1lR2FwKTsKKworCitORElTX1NUQVRVUyBSVE1QQXBwbHlQYWNrZXRGaWx0ZXIoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFBSVDI4WFhfUlhEX1NUUlVDICAgICAgcFJ4RCwKKwlJTiAgUEhFQURFUl84MDJfMTEgIHBIZWFkZXIpOworCitQUVVFVUVfSEVBREVSICAgUlRNUENoZWNrVHhTd1F1ZXVlKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCU9VVCBVQ0hBUiAgICAgICAgICAgKlF1ZUlkeCk7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKK1ZPSUQgUlRNUFJlcG9ydE1pY0Vycm9yKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBQQ0lQSEVSX0tFWSAgICAgcFdwYUtleSk7CisKK1ZPSUQJV3BhTWljRmFpbHVyZVJlcG9ydEZyYW1lKAorCUlOICBQUlRNUF9BREFQVEVSICAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCAgICBXcGFEaXNhc3NvY0FwQW5kQmxvY2tBc3NvYygKKyAgICBJTiAgUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorICAgIElOICBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCisgICAgSU4gIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKKyAgICBJTiAgUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworTkRJU19TVEFUVVMgUlRNUENsb25lTmRpc1BhY2tldCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTglCT09MRUFOICAgIHBJbnNBTVNEVUhkciwKKwlJTiAgUE5ESVNfUEFDS0VUICAgIHBJblBhY2tldCwKKwlPVVQgUE5ESVNfUEFDS0VUICAgKnBwT3V0UGFja2V0KTsKKworTkRJU19TVEFUVVMgUlRNUEFsbG9jYXRlTmRpc1BhY2tldCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgUE5ESVNfUEFDS0VUICAgICpwUGFja2V0LAorCUlOICBQVUNIQVIgICAgICAgICAgcEhlYWRlciwKKwlJTiAgVUlOVCAgICAgICAgICAgIEhlYWRlckxlbiwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBEYXRhLAorCUlOICBVSU5UICAgICAgICAgICAgRGF0YUxlbik7CisKK1ZPSUQgUlRNUEZyZWVOZGlzUGFja2V0KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBQTkRJU19QQUNLRVQgICAgcFBhY2tldCk7CisKK0JPT0xFQU4gUlRNUEZyZWVUWERVcG9uVHhEbWFEb25lKAorCUlOIFBSVE1QX0FEQVBURVIgICAgcEFkLAorCUlOIFVDSEFSICAgICAgICAgICAgUXVlSWR4KTsKKworQk9PTEVBTiBSVE1QQ2hlY2tESENQRnJhbWUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUE5ESVNfUEFDS0VUCXBQYWNrZXQpOworCisKK0JPT0xFQU4gUlRNUENoZWNrRXRoZXJUeXBlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBORElTX1BBQ0tFVAlwUGFja2V0KTsKKworCitWT0lEIFJUTVBDY2tCYnBUdW5pbmcoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVUlOVAkJCVR4UmF0ZSk7CisKKy8vCisvLyBQcml2YXRlIHJvdXRpbmVzIGluIHJ0bXBfd2VwLmMKKy8vCitWT0lEIFJUTVBJbml0V2VwRW5naW5lKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBQVUNIQVIgICAgICAgICAgcEtleSwKKwlJTiAgVUNIQVIgICAgICAgICAgIEtleUlkLAorCUlOICBVQ0hBUiAgICAgICAgICAgS2V5TGVuLAorCUlOICBQVUNIQVIgICAgICAgICAgcERlc3QpOworCitWT0lEIFJUTVBFbmNyeXB0RGF0YSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBTcmMsCisJSU4gIFBVQ0hBUiAgICAgICAgICBwRGVzdCwKKwlJTiAgVUlOVCAgICAgICAgICAgIExlbik7CisKK0JPT0xFQU4JUlRNUERlY3J5cHREYXRhKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCisJSU4JUFVDSEFSCQkJcFNyYywKKwlJTglVSU5UCQkJTGVuLAorCUlOCVVJTlQJCQlpZHgpOworCitCT09MRUFOCVJUTVBTb2Z0RGVjcnlwdFdFUCgKKwlJTiBQUlRNUF9BREFQVEVSIAlwQWQsCisJSU4gUFVDSEFSCQkJcERhdGEsCisJSU4gVUxPTkcJCQlEYXRhQnl0ZUNudCwKKwlJTiBQQ0lQSEVSX0tFWQkJcEdyb3VwS2V5KTsKKworVk9JRCBSVE1QU2V0SUNWKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBQVUNIQVIgICAgICAgICAgcERlc3QpOworCitWT0lEIEFSQ0ZPVVJfSU5JVCgKKwlJTiAgUEFSQ0ZPVVJDT05URVhUIEN0eCwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBLZXksCisJSU4gIFVJTlQgICAgICAgICAgICBLZXlMZW4pOworCitVQ0hBUiAgIEFSQ0ZPVVJfQllURSgKKwlJTiAgUEFSQ0ZPVVJDT05URVhUICAgICBDdHgpOworCitWT0lEIEFSQ0ZPVVJfREVDUllQVCgKKwlJTiAgUEFSQ0ZPVVJDT05URVhUIEN0eCwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBEZXN0LAorCUlOICBQVUNIQVIgICAgICAgICAgcFNyYywKKwlJTiAgVUlOVCAgICAgICAgICAgIExlbik7CisKK1ZPSUQgQVJDRk9VUl9FTkNSWVBUKAorCUlOICBQQVJDRk9VUkNPTlRFWFQgQ3R4LAorCUlOICBQVUNIQVIgICAgICAgICAgcERlc3QsCisJSU4gIFBVQ0hBUiAgICAgICAgICBwU3JjLAorCUlOICBVSU5UICAgICAgICAgICAgTGVuKTsKKworVk9JRCBXUEFBUkNGT1VSX0VOQ1JZUFQoCisJSU4gIFBBUkNGT1VSQ09OVEVYVCBDdHgsCisJSU4gIFBVQ0hBUiAgICAgICAgICBwRGVzdCwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBTcmMsCisJSU4gIFVJTlQgICAgICAgICAgICBMZW4pOworCitVSU5UIFJUTVBfQ0FMQ19GQ1MzMigKKwlJTiAgVUlOVCAgIEZjcywKKwlJTiAgUFVDSEFSICBDcCwKKwlJTiAgSU5UICAgICBMZW4pOworCisvLworLy8gTUxNRSByb3V0aW5lcworLy8KKworLy8gQXNpYy9SRi9CQlAgcmVsYXRlZCBmdW5jdGlvbnMKKworVk9JRCBBc2ljQWRqdXN0VHhQb3dlcigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK1ZPSUQgCUFzaWNVcGRhdGVQcm90ZWN0KAorCUlOCQlQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiAJCVVTSE9SVAkJCU9wZXJhaW9uTW9kZSwKKwlJTiAJCVVDSEFSCQkJU2V0TWFzaywKKwlJTgkJQk9PTEVBTgkJCWJEaXNhYmxlQkdQcm90ZWN0LAorCUlOCQlCT09MRUFOCQkJYk5vbkdGRXhpc3QpOworCitWT0lEIEFzaWNTd2l0Y2hDaGFubmVsKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOCVVDSEFSCQkJQ2hhbm5lbCwKKwlJTglCT09MRUFOCQkJYlNjYW4pOworCitWT0lEIEFzaWNMb2NrQ2hhbm5lbCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVQ0hBUiBDaGFubmVsKSA7CisKK1ZPSUQgQXNpY0FudGVubmFTZWxlY3QoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFVDSEFSICAgICAgICAgICBDaGFubmVsKTsKKworVk9JRCBBc2ljQW50ZW5uYVNldHRpbmcoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JQUJHQkFORF9TVEFURQlCYW5kU3RhdGUpOworCitWT0lEIEFzaWNSZlR1bmluZ0V4ZWMoCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorVk9JRCBBc2ljU2xlZXBUaGVuQXV0b1dha2V1cCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgVVNIT1JUIFRidHROdW1Ub05leHRXYWtlVXApOworCitWT0lEIEFzaWNGb3JjZVNsZWVwKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKworVk9JRCBBc2ljRm9yY2VXYWtldXAoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gQk9PTEVBTiAgICBiRnJvbVR4KTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworVk9JRCBBc2ljU2V0QnNzaWQoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFBVQ0hBUiBwQnNzaWQpOworCitWT0lEIEFzaWNTZXRNY2FzdFdDKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKworVk9JRCBBc2ljRGVsV2NpZFRhYigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVQ0hBUglXY2lkKTsKKworVk9JRCBBc2ljRW5hYmxlUkRHKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKworVk9JRCBBc2ljRGlzYWJsZVJERygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK1ZPSUQgQXNpY0Rpc2FibGVTeW5jKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworVk9JRCBBc2ljRW5hYmxlQnNzU3luYygKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK1ZPSUQgQXNpY0VuYWJsZUlic3NTeW5jKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworVk9JRCBBc2ljU2V0RWRjYVBhcm0oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gUEVEQ0FfUEFSTSAgICBwRWRjYVBhcm0pOworCitWT0lEIEFzaWNTZXRTbG90VGltZSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBCT09MRUFOIGJVc2VTaG9ydFNsb3RUaW1lKTsKKworVk9JRCBBc2ljQWRkU2hhcmVkS2V5RW50cnkoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVUNIQVIgICAgICAgICBCc3NJbmRleCwKKwlJTiBVQ0hBUiAgICAgICAgIEtleUlkeCwKKwlJTiBVQ0hBUiAgICAgICAgIENpcGhlckFsZywKKwlJTiBQVUNIQVIgICAgICAgIHBLZXksCisJSU4gUFVDSEFSICAgICAgICBwVHhNaWMsCisJSU4gUFVDSEFSICAgICAgICBwUnhNaWMpOworCitWT0lEIEFzaWNSZW1vdmVTaGFyZWRLZXlFbnRyeSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVQ0hBUiAgICAgICAgIEJzc0luZGV4LAorCUlOIFVDSEFSICAgICAgICAgS2V5SWR4KTsKKworVk9JRCBBc2ljVXBkYXRlV0NJREF0dHJpYnV0ZSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVU0hPUlQJCVdDSUQsCisJSU4gVUNIQVIJCUJzc0luZGV4LAorCUlOIFVDSEFSICAgICAgICBDaXBoZXJBbGcsCisJSU4gQk9PTEVBTgkJYlVzZVBhaXJld2lzZUtleVRhYmxlKTsKKworVk9JRCBBc2ljVXBkYXRlV0NJRElWRUlWKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVTSE9SVAkJV0NJRCwKKwlJTiBVTE9ORyAgICAgICAgdUlWLAorCUlOIFVMT05HICAgICAgICB1RUlWKTsKKworVk9JRCBBc2ljVXBkYXRlUnhXQ0lEVGFibGUoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVVNIT1JUCQlXQ0lELAorCUlOIFBVQ0hBUiAgICAgICAgcEFkZHIpOworCitWT0lEIEFzaWNBZGRLZXlFbnRyeSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVU0hPUlQJCVdDSUQsCisJSU4gVUNIQVIJCUJzc0luZGV4LAorCUlOIFVDSEFSCQlLZXlJZHgsCisJSU4gUENJUEhFUl9LRVkJcENpcGhlcktleSwKKwlJTiBCT09MRUFOCQliVXNlUGFpcmV3aXNlS2V5VGFibGUsCisJSU4gQk9PTEVBTgkJYlR4S2V5KTsKKworVk9JRCBBc2ljQWRkUGFpcndpc2VLZXlFbnRyeSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBQVUNIQVIgICAgICAgIHBBZGRyLAorCUlOIFVDSEFSCQlXQ0lELAorCUlOIENJUEhFUl9LRVkJCSAqcENpcGhlcktleSk7CisKK1ZPSUQgQXNpY1JlbW92ZVBhaXJ3aXNlS2V5RW50cnkoCisJSU4gUFJUTVBfQURBUFRFUiAgcEFkLAorCUlOIFVDSEFSCQkgQnNzSWR4LAorCUlOIFVDSEFSCQkgV2NpZCk7CisKK0JPT0xFQU4gQXNpY1NlbmRDb21tYW5kVG9NY3UoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVUNIQVIgICAgICAgICBDb21tYW5kLAorCUlOIFVDSEFSICAgICAgICAgVG9rZW4sCisJSU4gVUNIQVIgICAgICAgICBBcmcwLAorCUlOIFVDSEFSICAgICAgICAgQXJnMSk7CisKKyNpZmRlZiBSVDI4NjAKK0JPT0xFQU4gQXNpY0NoZWNrQ29tbWFuT2soCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVUNIQVIJCSBDb21tYW5kKTsKKyNlbmRpZiAvLyBSVDI4NjAgLy8KKworVk9JRCBNYWNBZGRyUmFuZG9tQnNzaWQoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJT1VUIFBVQ0hBUiBwQWRkcik7CisKK1ZPSUQgTWd0TWFjSGVhZGVySW5pdCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgICAgcEFkLAorCUlOIE9VVCBQSEVBREVSXzgwMl8xMSBwSGRyODAyMTEsCisJSU4gVUNIQVIgU3ViVHlwZSwKKwlJTiBVQ0hBUiBUb0RzLAorCUlOIFBVQ0hBUiBwREEsCisJSU4gUFVDSEFSIHBCc3NpZCk7CisKK1ZPSUQgTWxtZVJhZGlvT2ZmKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKworVk9JRCBNbG1lUmFkaW9PbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKKworVk9JRCBCc3NUYWJsZUluaXQoCisJSU4gQlNTX1RBQkxFICpUYWIpOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCitWT0lEIEJBVGFibGVJbml0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIEJBX1RBQkxFICpUYWIpOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCitVTE9ORyBCc3NUYWJsZVNlYXJjaCgKKwlJTiBCU1NfVEFCTEUgKlRhYiwKKwlJTiBQVUNIQVIgcEJzc2lkLAorCUlOIFVDSEFSIENoYW5uZWwpOworCitVTE9ORyBCc3NTc2lkVGFibGVTZWFyY2goCisJSU4gQlNTX1RBQkxFICpUYWIsCisJSU4gUFVDSEFSICAgIHBCc3NpZCwKKwlJTiBQVUNIQVIgICAgcFNzaWQsCisJSU4gVUNIQVIgICAgIFNzaWRMZW4sCisJSU4gVUNIQVIgICAgIENoYW5uZWwpOworCitVTE9ORyBCc3NUYWJsZVNlYXJjaFdpdGhTU0lEKAorCUlOIEJTU19UQUJMRSAqVGFiLAorCUlOIFBVQ0hBUiAgICBCc3NpZCwKKwlJTiBQVUNIQVIgICAgcFNzaWQsCisJSU4gVUNIQVIgICAgIFNzaWRMZW4sCisJSU4gVUNIQVIgICAgIENoYW5uZWwpOworCitWT0lEIEJzc1RhYmxlRGVsZXRlRW50cnkoCisJSU4gT1VUICBQQlNTX1RBQkxFIHBUYWIsCisJSU4gICAgICBQVUNIQVIgcEJzc2lkLAorCUlOICAgICAgVUNIQVIgQ2hhbm5lbCk7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKK1ZPSUQgQkFUYWJsZURlbGV0ZU9SSUVudHJ5KAorCUlOIE9VVAlQUlRNUF9BREFQVEVSIHBBZCwKKwlJTgkJQkFfT1JJX0VOVFJZCSpwQkFPUklFbnRyeSk7CisKK1ZPSUQgQkFUYWJsZURlbGV0ZVJFQ0VudHJ5KAorCUlOIE9VVAlQUlRNUF9BREFQVEVSIHBBZCwKKwlJTgkJQkFfUkVDX0VOVFJZCSpwQkFSRUNFbnRyeSk7CisKK1ZPSUQgQkFUYWJsZVRlYXJPUklFbnRyeSgKKwlJTiBPVVQJUFJUTVBfQURBUFRFUiBwQWQsCisJSU4JCVVDSEFSIFRJRCwKKwlJTgkJVUNIQVIgV2NpZCwKKwlJTgkJQk9PTEVBTiBiRm9yY2VEZWxldGUsCisJSU4JCUJPT0xFQU4gQUxMKTsKKworVk9JRCBCQVRhYmxlVGVhclJFQ0VudHJ5KAorCUlOIE9VVAlQUlRNUF9BREFQVEVSIHBBZCwKKwlJTgkJVUNIQVIgVElELAorCUlOCQlVQ0hBUiBXQ0lELAorCUlOCQlCT09MRUFOIEFMTCk7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKK1ZPSUQgIEJzc0VudHJ5U2V0KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCU9VVCBQQlNTX0VOVFJZIHBCc3MsCisJSU4gUFVDSEFSIHBCc3NpZCwKKwlJTiBDSEFSIFNzaWRbXSwKKwlJTiBVQ0hBUiBTc2lkTGVuLAorCUlOIFVDSEFSIEJzc1R5cGUsCisJSU4gVVNIT1JUIEJlYWNvblBlcmlvZCwKKwlJTiBQQ0ZfUEFSTSBDZlBhcm0sCisJSU4gVVNIT1JUIEF0aW1XaW4sCisJSU4gVVNIT1JUIENhcGFiaWxpdHlJbmZvLAorCUlOIFVDSEFSIFN1cFJhdGVbXSwKKwlJTiBVQ0hBUiBTdXBSYXRlTGVuLAorCUlOIFVDSEFSIEV4dFJhdGVbXSwKKwlJTiBVQ0hBUiBFeHRSYXRlTGVuLAorCUlOIEhUX0NBUEFCSUxJVFlfSUUgKnBIdENhcGFiaWxpdHksCisJSU4gQUREX0hUX0lORk9fSUUgKnBBZGRIdEluZm8sCS8vIEFQIG1pZ2h0IHVzZSB0aGlzIGFkZGl0aW9uYWwgaHQgaW5mbyBJRQorCUlOIFVDSEFSCQkJSHRDYXBhYmlsaXR5TGVuLAorCUlOIFVDSEFSCQkJQWRkSHRJbmZvTGVuLAorCUlOIFVDSEFSCQkJTmV3RXh0Q2hhbk9mZnNldCwKKwlJTiBVQ0hBUiBDaGFubmVsLAorCUlOIENIQVIgUnNzaSwKKwlJTiBMQVJHRV9JTlRFR0VSIFRpbWVTdGFtcCwKKwlJTiBVQ0hBUiBDa2lwRmxhZywKKwlJTiBQRURDQV9QQVJNIHBFZGNhUGFybSwKKwlJTiBQUU9TX0NBUEFCSUxJVFlfUEFSTSBwUW9zQ2FwYWJpbGl0eSwKKwlJTiBQUUJTU19MT0FEX1BBUk0gcFFic3NMb2FkLAorCUlOIFVTSE9SVCBMZW5ndGhWSUUsCisJSU4gUE5ESVNfODAyXzExX1ZBUklBQkxFX0lFcyBwVklFKTsKKworVUxPTkcgIEJzc1RhYmxlU2V0RW50cnkoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJT1VUIFBCU1NfVEFCTEUgcFRhYiwKKwlJTiBQVUNIQVIgcEJzc2lkLAorCUlOIENIQVIgU3NpZFtdLAorCUlOIFVDSEFSIFNzaWRMZW4sCisJSU4gVUNIQVIgQnNzVHlwZSwKKwlJTiBVU0hPUlQgQmVhY29uUGVyaW9kLAorCUlOIENGX1BBUk0gKkNmUGFybSwKKwlJTiBVU0hPUlQgQXRpbVdpbiwKKwlJTiBVU0hPUlQgQ2FwYWJpbGl0eUluZm8sCisJSU4gVUNIQVIgU3VwUmF0ZVtdLAorCUlOIFVDSEFSIFN1cFJhdGVMZW4sCisJSU4gVUNIQVIgRXh0UmF0ZVtdLAorCUlOIFVDSEFSIEV4dFJhdGVMZW4sCisJSU4gSFRfQ0FQQUJJTElUWV9JRSAqcEh0Q2FwYWJpbGl0eSwKKwlJTiBBRERfSFRfSU5GT19JRSAqcEFkZEh0SW5mbywJLy8gQVAgbWlnaHQgdXNlIHRoaXMgYWRkaXRpb25hbCBodCBpbmZvIElFCisJSU4gVUNIQVIJCQlIdENhcGFiaWxpdHlMZW4sCisJSU4gVUNIQVIJCQlBZGRIdEluZm9MZW4sCisJSU4gVUNIQVIJCQlOZXdFeHRDaGFuT2Zmc2V0LAorCUlOIFVDSEFSIENoYW5uZWwsCisJSU4gQ0hBUiBSc3NpLAorCUlOIExBUkdFX0lOVEVHRVIgVGltZVN0YW1wLAorCUlOIFVDSEFSIENraXBGbGFnLAorCUlOIFBFRENBX1BBUk0gcEVkY2FQYXJtLAorCUlOIFBRT1NfQ0FQQUJJTElUWV9QQVJNIHBRb3NDYXBhYmlsaXR5LAorCUlOIFBRQlNTX0xPQURfUEFSTSBwUWJzc0xvYWQsCisJSU4gVVNIT1JUIExlbmd0aFZJRSwKKwlJTiBQTkRJU184MDJfMTFfVkFSSUFCTEVfSUVzIHBWSUUpOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCitWT0lEIEJBVGFibGVJbnNlcnRFbnRyeSgKKyAgICBJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiBVU0hPUlQgQWlkLAorICAgIElOIFVTSE9SVAkJVGltZU91dFZhbHVlLAorCUlOIFVTSE9SVAkJU3RhcnRpbmdTZXEsCisgICAgSU4gVUNIQVIgVElELAorCUlOIFVDSEFSIEJBV2luU2l6ZSwKKwlJTiBVQ0hBUiBPcmlnaW5hdG9yU3RhdHVzLAorICAgIElOIEJPT0xFQU4gSXNSZWNpcGllbnQpOworCisjaWZkZWYgRE9UMTFOX0RSQUZUMworVk9JRCBCc3MyMDQwQ29leGlzdFRpbWVPdXQoCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKKworCitWT0lEICBUcmlFdmVudEluaXQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQpOworCitVTE9ORyBUcmlFdmVudFRhYmxlU2V0RW50cnkoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUIFRSSUdHRVJfRVZFTlRfVEFCICpUYWIsCisJSU4gUFVDSEFSIHBCc3NpZCwKKwlJTiBIVF9DQVBBQklMSVRZX0lFICpwSHRDYXBhYmlsaXR5LAorCUlOIFVDSEFSCQkJSHRDYXBhYmlsaXR5TGVuLAorCUlOIFVDSEFSCQkJUmVnQ2xhc3MsCisJSU4gVUNIQVIgQ2hhbm5lbE5vKTsKKworVk9JRCBUcmlFdmVudENvdW50ZXJNYWludGVuYW5jZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCk7CisjZW5kaWYgLy8gRE9UMTFOX0RSQUZUMyAvLworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCitWT0lEIEJzc1RhYmxlU3NpZFNvcnQoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJT1VUIEJTU19UQUJMRSAqT3V0VGFiLAorCUlOICBDSEFSIFNzaWRbXSwKKwlJTiAgVUNIQVIgU3NpZExlbik7CisKK1ZPSUQgIEJzc1RhYmxlU29ydEJ5UnNzaSgKKwlJTiBPVVQgQlNTX1RBQkxFICpPdXRUYWIpOworCitWT0lEIEJzc0NpcGhlclBhcnNlKAorCUlOIE9VVCAgUEJTU19FTlRSWSAgcEJzcyk7CisKK05ESVNfU1RBVFVTICBNbG1lUXVldWVJbml0KAorCUlOIE1MTUVfUVVFVUUgKlF1ZXVlKTsKKworVk9JRCAgTWxtZVF1ZXVlRGVzdHJveSgKKwlJTiBNTE1FX1FVRVVFICpRdWV1ZSk7CisKK0JPT0xFQU4gTWxtZUVucXVldWUoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVUxPTkcgTWFjaGluZSwKKwlJTiBVTE9ORyBNc2dUeXBlLAorCUlOIFVMT05HIE1zZ0xlbiwKKwlJTiBWT0lEICpNc2cpOworCitCT09MRUFOIE1sbWVFbnF1ZXVlRm9yUmVjdigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiBVTE9ORyBXY2lkLAorCUlOIFVMT05HIFRpbWVTdGFtcEhpZ2gsCisJSU4gVUxPTkcgVGltZVN0YW1wTG93LAorCUlOIFVDSEFSIFJzc2kwLAorCUlOIFVDSEFSIFJzc2kxLAorCUlOIFVDSEFSIFJzc2kyLAorCUlOIFVMT05HIE1zZ0xlbiwKKwlJTiBQVk9JRCBNc2csCisJSU4gVUNIQVIgU2lnbmFsKTsKKworCitCT09MRUFOIE1sbWVEZXF1ZXVlKAorCUlOIE1MTUVfUVVFVUUgKlF1ZXVlLAorCU9VVCBNTE1FX1FVRVVFX0VMRU0gKipFbGVtKTsKKworVk9JRCAgICBNbG1lUmVzdGFydFN0YXRlTWFjaGluZSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK0JPT0xFQU4gIE1sbWVRdWV1ZUVtcHR5KAorCUlOIE1MTUVfUVVFVUUgKlF1ZXVlKTsKKworQk9PTEVBTiAgTWxtZVF1ZXVlRnVsbCgKKwlJTiBNTE1FX1FVRVVFICpRdWV1ZSk7CisKK0JPT0xFQU4gIE1zZ1R5cGVTdWJzdCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBQRlJBTUVfODAyXzExIHBGcmFtZSwKKwlPVVQgSU5UICpNYWNoaW5lLAorCU9VVCBJTlQgKk1zZ1R5cGUpOworCitWT0lEIFN0YXRlTWFjaGluZUluaXQoCisJSU4gU1RBVEVfTUFDSElORSAqU20sCisJSU4gU1RBVEVfTUFDSElORV9GVU5DIFRyYW5zW10sCisJSU4gVUxPTkcgU3ROciwKKwlJTiBVTE9ORyBNc2dOciwKKwlJTiBTVEFURV9NQUNISU5FX0ZVTkMgRGVmRnVuYywKKwlJTiBVTE9ORyBJbml0U3RhdGUsCisJSU4gVUxPTkcgQmFzZSk7CisKK1ZPSUQgU3RhdGVNYWNoaW5lU2V0QWN0aW9uKAorCUlOIFNUQVRFX01BQ0hJTkUgKlMsCisJSU4gVUxPTkcgU3QsCisJVUxPTkcgTXNnLAorCUlOIFNUQVRFX01BQ0hJTkVfRlVOQyBGKTsKKworVk9JRCBTdGF0ZU1hY2hpbmVQZXJmb3JtQWN0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOIFNUQVRFX01BQ0hJTkUgKlMsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBEcm9wKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgQXNzb2NTdGF0ZU1hY2hpbmVJbml0KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBTVEFURV9NQUNISU5FICpTbSwKKwlPVVQgU1RBVEVfTUFDSElORV9GVU5DIFRyYW5zW10pOworCitWT0lEIFJlYXNzb2NUaW1lb3V0KAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKKwlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMyk7CisKK1ZPSUQgQXNzb2NUaW1lb3V0KAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKKwlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMyk7CisKK1ZPSUQgRGlzYXNzb2NUaW1lb3V0KAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKKwlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMyk7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorVk9JRCBNbG1lRGlzYXNzb2NSZXFBY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgTWxtZUFzc29jUmVxQWN0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIE1sbWVSZWFzc29jUmVxQWN0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIE1sbWVEaXNhc3NvY1JlcUFjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBQZWVyQXNzb2NSc3BBY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgUGVlclJlYXNzb2NSc3BBY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgUGVlckRpc2Fzc29jQWN0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIERpc2Fzc29jVGltZW91dEFjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBBc3NvY1RpbWVvdXRBY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgIFJlYXNzb2NUaW1lb3V0QWN0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEICBDbHMzZXJyQWN0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBQVUNIQVIgcEFkZHIpOworCitWT0lEIFN3aXRjaEJldHdlZW5XZXBBbmRDa2lwKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKworVk9JRCAgSW52YWxpZFN0YXRlV2hlbkFzc29jKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEICBJbnZhbGlkU3RhdGVXaGVuUmVhc3NvYygKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBJbnZhbGlkU3RhdGVXaGVuRGlzYXNzb2NpYXRlKAorCUlOICBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworCitWT0lEICBDb21wb3NlUHNQb2xsKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworVk9JRCAgQ29tcG9zZU51bGxGcmFtZSgKKwlJTiAgUFJUTVBfQURBUFRFUiBwQWQpOworCitWT0lEICBBc3NvY1Bvc3RQcm9jKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBQVUNIQVIgcEFkZHIyLAorCUlOICBVU0hPUlQgQ2FwYWJpbGl0eUluZm8sCisJSU4gIFVTSE9SVCBBaWQsCisJSU4gIFVDSEFSIFN1cFJhdGVbXSwKKwlJTiAgVUNIQVIgU3VwUmF0ZUxlbiwKKwlJTiAgVUNIQVIgRXh0UmF0ZVtdLAorCUlOICBVQ0hBUiBFeHRSYXRlTGVuLAorCUlOIFBFRENBX1BBUk0gcEVkY2FQYXJtLAorCUlOIEhUX0NBUEFCSUxJVFlfSUUJCSpwSHRDYXBhYmlsaXR5LAorCUlOICBVQ0hBUiBIdENhcGFiaWxpdHlMZW4sCisJSU4gQUREX0hUX0lORk9fSUUJCSpwQWRkSHRJbmZvKTsKKworVk9JRCBBdXRoU3RhdGVNYWNoaW5lSW5pdCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiBQU1RBVEVfTUFDSElORSBzbSwKKwlPVVQgU1RBVEVfTUFDSElORV9GVU5DIFRyYW5zW10pOworCitWT0lEIEF1dGhUaW1lb3V0KAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKKwlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMyk7CisKK1ZPSUQgTWxtZUF1dGhSZXFBY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgUGVlckF1dGhSc3BBdFNlcTJBY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgUGVlckF1dGhSc3BBdFNlcTRBY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgQXV0aFRpbWVvdXRBY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgQ2xzMmVyckFjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgUFVDSEFSIHBBZGRyKTsKKworVk9JRCBNbG1lRGVhdXRoUmVxQWN0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIEludmFsaWRTdGF0ZVdoZW5BdXRoKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitWT0lEIEF1dGhSc3BTdGF0ZU1hY2hpbmVJbml0KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBQU1RBVEVfTUFDSElORSBTbSwKKwlJTiAgU1RBVEVfTUFDSElORV9GVU5DIFRyYW5zW10pOworCitWT0lEIFBlZXJEZWF1dGhBY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBQZWVyQXV0aFNpbXBsZVJzcEdlbkFuZFNlbmQoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFBIRUFERVJfODAyXzExICBwSGRyODAyMTEsCisJSU4gIFVTSE9SVCBBbGcsCisJSU4gIFVTSE9SVCBTZXEsCisJSU4gIFVTSE9SVCBSZWFzb24sCisJSU4gIFVTSE9SVCBTdGF0dXMpOworCisvLworLy8gUHJpdmF0ZSByb3V0aW5lcyBpbiBkbHMuYworLy8KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorI2lmZGVmIFFPU19ETFNfU1VQUE9SVAordm9pZCBEbHNTdGF0ZU1hY2hpbmVJbml0KAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIFNUQVRFX01BQ0hJTkUgKlNtLAorICAgIE9VVCBTVEFURV9NQUNISU5FX0ZVTkMgVHJhbnNbXSk7CisKK1ZPSUQgTWxtZURsc1JlcUFjdGlvbigKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIFBlZXJEbHNSZXFBY3Rpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUglwQWQsCisgICAgSU4gTUxNRV9RVUVVRV9FTEVNCSpFbGVtKTsKKworVk9JRCBQZWVyRGxzUnNwQWN0aW9uKAorICAgIElOIFBSVE1QX0FEQVBURVIJcEFkLAorICAgIElOIE1MTUVfUVVFVUVfRUxFTQkqRWxlbSk7CisKK1ZPSUQgTWxtZURsc1RlYXJEb3duQWN0aW9uKAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgUGVlckRsc1RlYXJEb3duQWN0aW9uKAorICAgIElOIFBSVE1QX0FEQVBURVIJcEFkLAorICAgIElOIE1MTUVfUVVFVUVfRUxFTQkqRWxlbSk7CisKK1ZPSUQgUlRNUENoZWNrRExTVGltZU91dCgKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCk7CisKK0JPT0xFQU4gUlRNUFJjdkZyYW1lRExTQ2hlY2soCisJSU4gUFJUTVBfQURBUFRFUglwQWQsCisJSU4gUEhFQURFUl84MDJfMTEJcEhlYWRlciwKKwlJTiBVTE9ORwkJCUxlbiwKKwlJTiBQUlQyOFhYX1JYRF9TVFJVQwlwUnhEKTsKKworSU5UCVJUTVBDaGVja0RMU0ZyYW1lKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOICBQVUNIQVIgICAgICAgICAgcERBKTsKKworVk9JRCBSVE1QU2VuZERMU1RlYXJEb3duRnJhbWUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4gIFBVQ0hBUiAgICAgICAgICBwREEpOworCitORElTX1NUQVRVUyBSVE1QU2VuZFNUQUtleVJlcXVlc3QoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJcERBKTsKKworTkRJU19TVEFUVVMgUlRNUFNlbmRTVEFLZXlIYW5kU2hha2UoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJcERBKTsKKworVk9JRCBEbHNUaW1lb3V0QWN0aW9uKAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKKwlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMyk7CisKK0JPT0xFQU4gTWxtZURsc1JlcVNhbml0eSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBWT0lEICpNc2csCisgICAgSU4gVUxPTkcgTXNnTGVuLAorICAgIE9VVCBQUlRfODAyXzExX0RMUyAqcERMUywKKyAgICBPVVQgUFVTSE9SVCBwUmVhc29uKTsKKworSU5UIFNldF9EbHNFbnRyeUluZm9fRGlzcGxheV9Qcm9jKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFBVQ0hBUiBhcmcpOworCitNQUNfVEFCTEVfRU5UUlkgKk1hY1RhYmxlSW5zZXJ0RGxzRW50cnkoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFBVQ0hBUglwQWRkciwKKwlJTiAgVUlOVAlEbHNFbnRyeUlkeCk7CisKK0JPT0xFQU4gTWFjVGFibGVEZWxldGVEbHNFbnRyeSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVU0hPUlQgd2NpZCwKKwlJTiBQVUNIQVIgcEFkZHIpOworCitNQUNfVEFCTEVfRU5UUlkgKkRsc0VudHJ5VGFibGVMb29rdXAoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gUFVDSEFSCXBBZGRyLAorCUlOIEJPT0xFQU4JYlJlc2V0SWRlbENvdW50KTsKKworTUFDX1RBQkxFX0VOVFJZICpEbHNFbnRyeVRhYmxlTG9va3VwQnlXY2lkKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVDSEFSCXdjaWQsCisJSU4gUFVDSEFSCXBBZGRyLAorCUlOIEJPT0xFQU4JYlJlc2V0SWRlbENvdW50KTsKKworSU5UCVNldF9EbHNBZGRFbnRyeV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVAlTZXRfRGxzVGVhckRvd25FbnRyeV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKK0JPT0xFQU4gUGVlckRsc1JlcVNhbml0eSgKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBWT0lEICpNc2csCisgICAgSU4gVUxPTkcgTXNnTGVuLAorICAgIE9VVCBQVUNIQVIgcERBLAorICAgIE9VVCBQVUNIQVIgcFNBLAorICAgIE9VVCBVU0hPUlQgKnBDYXBhYmlsaXR5SW5mbywKKyAgICBPVVQgVVNIT1JUICpwRGxzVGltZW91dCwKKyAgICBPVVQgVUNIQVIgKnBSYXRlc0xlbiwKKyAgICBPVVQgVUNIQVIgUmF0ZXNbXSwKKyAgICBPVVQgVUNIQVIgKnBIdENhcGFiaWxpdHlMZW4sCisgICAgT1VUIEhUX0NBUEFCSUxJVFlfSUUgKnBIdENhcGFiaWxpdHkpOworCitCT09MRUFOIFBlZXJEbHNSc3BTYW5pdHkoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gVk9JRCAqTXNnLAorICAgIElOIFVMT05HIE1zZ0xlbiwKKyAgICBPVVQgUFVDSEFSIHBEQSwKKyAgICBPVVQgUFVDSEFSIHBTQSwKKyAgICBPVVQgVVNIT1JUICpwQ2FwYWJpbGl0eUluZm8sCisgICAgT1VUIFVTSE9SVCAqcFN0YXR1cywKKyAgICBPVVQgVUNIQVIgKnBSYXRlc0xlbiwKKyAgICBPVVQgVUNIQVIgUmF0ZXNbXSwKKyAgICBPVVQgVUNIQVIgKnBIdENhcGFiaWxpdHlMZW4sCisgICAgT1VUIEhUX0NBUEFCSUxJVFlfSUUgKnBIdENhcGFiaWxpdHkpOworCitCT09MRUFOIFBlZXJEbHNUZWFyRG93blNhbml0eSgKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBWT0lEICpNc2csCisgICAgSU4gVUxPTkcgTXNnTGVuLAorICAgIE9VVCBQVUNIQVIgcERBLAorICAgIE9VVCBQVUNIQVIgcFNBLAorICAgIE9VVCBVU0hPUlQgKnBSZWFzb24pOworI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVk9JRCBTeW5jU3RhdGVNYWNoaW5lSW5pdCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgU1RBVEVfTUFDSElORSAqU20sCisJT1VUIFNUQVRFX01BQ0hJTkVfRlVOQyBUcmFuc1tdKTsKKworVk9JRCBCZWFjb25UaW1lb3V0KAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKKwlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMyk7CisKK1ZPSUQgU2NhblRpbWVvdXQoCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKKworVk9JRCBNbG1lU2NhblJlcUFjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBJbnZhbGlkU3RhdGVXaGVuU2NhbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBJbnZhbGlkU3RhdGVXaGVuSm9pbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBJbnZhbGlkU3RhdGVXaGVuU3RhcnQoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgUGVlckJlYWNvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBFbnF1ZXVlUHJvYmVSZXF1ZXN0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKworQk9PTEVBTiBTY2FuUnVubmluZygKKwkJSU4gUFJUTVBfQURBUFRFUiBwQWQpOworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitWT0lEIE1sbWVDbnRsSW5pdCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgU1RBVEVfTUFDSElORSAqUywKKwlPVVQgU1RBVEVfTUFDSElORV9GVU5DIFRyYW5zW10pOworCitWT0lEIE1sbWVDbnRsTWFjaGluZVBlcmZvcm1BY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFNUQVRFX01BQ0hJTkUgKlMsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgQ250bElkbGVQcm9jKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIENudGxPaWRTY2FuUHJvYygKKwlJTiAgUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgQ250bE9pZFNzaWRQcm9jKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKiBFbGVtKTsKKworVk9JRCBDbnRsT2lkUlRCc3NpZFByb2MoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqIEVsZW0pOworCitWT0lEIENudGxNbG1lUm9hbWluZ1Byb2MoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqIEVsZW0pOworCitWT0lEIENudGxXYWl0RGlzYXNzb2NQcm9jKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIENudGxXYWl0Sm9pblByb2MoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgQ250bFdhaXRSZWFzc29jUHJvYygKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBDbnRsV2FpdFN0YXJ0UHJvYygKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBDbnRsV2FpdEF1dGhQcm9jKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIENudGxXYWl0QXV0aFByb2MyKAorCUlOICBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBDbnRsV2FpdEFzc29jUHJvYygKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorVk9JRCBDbnRsT2lkRExTU2V0dXBQcm9jKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisKK1ZPSUQgTGlua1VwKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBVQ0hBUiBCc3NUeXBlKTsKKworVk9JRCBMaW5rRG93bigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgQk9PTEVBTiAgICAgICAgIElzUmVxRnJvbUFQKTsKKworVk9JRCBJdGVyYXRlT25Cc3NUYWIoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitWT0lEIEl0ZXJhdGVPbkJzc1RhYjIoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOzsKKworVk9JRCBKb2luUGFybUZpbGwoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE9VVCBNTE1FX0pPSU5fUkVRX1NUUlVDVCAqSm9pblJlcSwKKwlJTiAgVUxPTkcgQnNzSWR4KTsKKworVk9JRCBBc3NvY1Bhcm1GaWxsKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOIE9VVCBNTE1FX0FTU09DX1JFUV9TVFJVQ1QgKkFzc29jUmVxLAorCUlOICBQVUNIQVIgcEFkZHIsCisJSU4gIFVTSE9SVCBDYXBhYmlsaXR5SW5mbywKKwlJTiAgVUxPTkcgVGltZW91dCwKKwlJTiAgVVNIT1JUIExpc3RlbkludHYpOworCitWT0lEIFNjYW5QYXJtRmlsbCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgT1VUIE1MTUVfU0NBTl9SRVFfU1RSVUNUICpTY2FuUmVxLAorCUlOICBDSEFSIFNzaWRbXSwKKwlJTiAgVUNIQVIgU3NpZExlbiwKKwlJTiAgVUNIQVIgQnNzVHlwZSwKKwlJTiAgVUNIQVIgU2NhblR5cGUpOworCitWT0lEIERpc2Fzc29jUGFybUZpbGwoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE9VVCBNTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1QgKkRpc2Fzc29jUmVxLAorCUlOICBQVUNIQVIgcEFkZHIsCisJSU4gIFVTSE9SVCBSZWFzb24pOworCitWT0lEIFN0YXJ0UGFybUZpbGwoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE9VVCBNTE1FX1NUQVJUX1JFUV9TVFJVQ1QgKlN0YXJ0UmVxLAorCUlOICBDSEFSIFNzaWRbXSwKKwlJTiAgVUNIQVIgU3NpZExlbik7CisKK1ZPSUQgQXV0aFBhcm1GaWxsKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBPVVQgTUxNRV9BVVRIX1JFUV9TVFJVQ1QgKkF1dGhSZXEsCisJSU4gIFBVQ0hBUiBwQWRkciwKKwlJTiAgVVNIT1JUIEFsZyk7CisKK1ZPSUQgRW5xdWV1ZVBzUG9sbCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK1ZPSUQgRW5xdWV1ZUJlYWNvbkZyYW1lKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworVk9JRCBNbG1lSm9pblJlcUFjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBNbG1lU2NhblJlcUFjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBNbG1lU3RhcnRSZXFBY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgU2NhblRpbWVvdXRBY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgQmVhY29uVGltZW91dEF0Sm9pbkFjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBQZWVyQmVhY29uQXRTY2FuQWN0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIFBlZXJCZWFjb25BdEpvaW5BY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgUGVlckJlYWNvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBQZWVyUHJvYmVSZXFBY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIFNjYW5OZXh0Q2hhbm5lbCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK1VMT05HIE1ha2VJYnNzQmVhY29uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworVk9JRCBDQ1hBZGphY2VudEFQUmVwb3J0KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworQk9PTEVBTiBNbG1lU2NhblJlcVNhbml0eSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgVk9JRCAqTXNnLAorCUlOICBVTE9ORyBNc2dMZW4sCisJT1VUIFVDSEFSICpCc3NUeXBlLAorCU9VVCBDSEFSIHNzaWRbXSwKKwlPVVQgVUNIQVIgKlNzaWRMZW4sCisJT1VUIFVDSEFSICpTY2FuVHlwZSk7CisKK0JPT0xFQU4gUGVlckJlYWNvbkFuZFByb2JlUnNwU2FuaXR5KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBWT0lEICpNc2csCisJSU4gIFVMT05HIE1zZ0xlbiwKKwlJTiAgVUNIQVIgTXNnQ2hhbm5lbCwKKwlPVVQgUFVDSEFSIHBBZGRyMiwKKwlPVVQgUFVDSEFSIHBCc3NpZCwKKwlPVVQgQ0hBUiBTc2lkW10sCisJT1VUIFVDSEFSICpwU3NpZExlbiwKKwlPVVQgVUNIQVIgKnBCc3NUeXBlLAorCU9VVCBVU0hPUlQgKnBCZWFjb25QZXJpb2QsCisJT1VUIFVDSEFSICpwQ2hhbm5lbCwKKwlPVVQgVUNIQVIgKnBOZXdDaGFubmVsLAorCU9VVCBMQVJHRV9JTlRFR0VSICpwVGltZXN0YW1wLAorCU9VVCBDRl9QQVJNICpwQ2ZQYXJtLAorCU9VVCBVU0hPUlQgKnBBdGltV2luLAorCU9VVCBVU0hPUlQgKnBDYXBhYmlsaXR5SW5mbywKKwlPVVQgVUNIQVIgKnBFcnAsCisJT1VUIFVDSEFSICpwRHRpbUNvdW50LAorCU9VVCBVQ0hBUiAqcER0aW1QZXJpb2QsCisJT1VUIFVDSEFSICpwQmNhc3RGbGFnLAorCU9VVCBVQ0hBUiAqcE1lc3NhZ2VUb01lLAorCU9VVCBVQ0hBUiBTdXBSYXRlW10sCisJT1VUIFVDSEFSICpwU3VwUmF0ZUxlbiwKKwlPVVQgVUNIQVIgRXh0UmF0ZVtdLAorCU9VVCBVQ0hBUiAqcEV4dFJhdGVMZW4sCisJT1VUCVVDSEFSICpwQ2tpcEZsYWcsCisJT1VUCVVDSEFSICpwQWlyb25ldENlbGxQb3dlckxpbWl0LAorCU9VVCBQRURDQV9QQVJNICAgICAgIHBFZGNhUGFybSwKKwlPVVQgUFFCU1NfTE9BRF9QQVJNICBwUWJzc0xvYWQsCisJT1VUIFBRT1NfQ0FQQUJJTElUWV9QQVJNIHBRb3NDYXBhYmlsaXR5LAorCU9VVCBVTE9ORyAqcFJhbGlua0llLAorCU9VVCBVQ0hBUgkJICpwSHRDYXBhYmlsaXR5TGVuLAorI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCU9VVCBVQ0hBUgkJICpwUHJlTkh0Q2FwYWJpbGl0eUxlbiwKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwlPVVQgSFRfQ0FQQUJJTElUWV9JRSAqcEh0Q2FwYWJpbGl0eSwKKwlPVVQgVUNIQVIJCSAqQWRkSHRJbmZvTGVuLAorCU9VVCBBRERfSFRfSU5GT19JRSAqQWRkSHRJbmZvLAorCU9VVCBVQ0hBUiAqTmV3RXh0Q2hhbm5lbCwKKwlPVVQgVVNIT1JUICpMZW5ndGhWSUUsCisJT1VUIFBORElTXzgwMl8xMV9WQVJJQUJMRV9JRXMgcFZJRSk7CisKK0JPT0xFQU4gUGVlckFkZEJBUmVxQWN0aW9uU2FuaXR5KAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIFZPSUQgKnBNc2csCisgICAgSU4gVUxPTkcgTXNnTGVuLAorCU9VVCBQVUNIQVIgcEFkZHIyKTsKKworQk9PTEVBTiBQZWVyQWRkQkFSc3BBY3Rpb25TYW5pdHkoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gVk9JRCAqcE1zZywKKyAgICBJTiBVTE9ORyBNc2dMZW4pOworCitCT09MRUFOIFBlZXJEZWxCQUFjdGlvblNhbml0eSgKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBVQ0hBUiBXY2lkLAorICAgIElOIFZPSUQgKnBNc2csCisgICAgSU4gVUxPTkcgTXNnTGVuKTsKKworQk9PTEVBTiBNbG1lQXNzb2NSZXFTYW5pdHkoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFZPSUQgKk1zZywKKwlJTiAgVUxPTkcgTXNnTGVuLAorCU9VVCBQVUNIQVIgcEFwQWRkciwKKwlPVVQgVVNIT1JUICpDYXBhYmlsaXR5SW5mbywKKwlPVVQgVUxPTkcgKlRpbWVvdXQsCisJT1VUIFVTSE9SVCAqTGlzdGVuSW50dik7CisKK0JPT0xFQU4gTWxtZUF1dGhSZXFTYW5pdHkoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFZPSUQgKk1zZywKKwlJTiAgVUxPTkcgTXNnTGVuLAorCU9VVCBQVUNIQVIgcEFkZHIsCisJT1VUIFVMT05HICpUaW1lb3V0LAorCU9VVCBVU0hPUlQgKkFsZyk7CisKK0JPT0xFQU4gTWxtZVN0YXJ0UmVxU2FuaXR5KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBWT0lEICpNc2csCisJSU4gIFVMT05HIE1zZ0xlbiwKKwlPVVQgQ0hBUiBTc2lkW10sCisJT1VUIFVDSEFSICpTc2lkbGVuKTsKKworQk9PTEVBTiBQZWVyQXV0aFNhbml0eSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgVk9JRCAqTXNnLAorCUlOICBVTE9ORyBNc2dMZW4sCisJT1VUIFBVQ0hBUiBwQWRkciwKKwlPVVQgVVNIT1JUICpBbGcsCisJT1VUIFVTSE9SVCAqU2VxLAorCU9VVCBVU0hPUlQgKlN0YXR1cywKKwlPVVQgQ0hBUiBDaGxnVGV4dFtdKTsKKworQk9PTEVBTiBQZWVyQXNzb2NSc3BTYW5pdHkoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisgICAgSU4gVk9JRCAqcE1zZywKKwlJTiAgVUxPTkcgTXNnTGVuLAorCU9VVCBQVUNIQVIgcEFkZHIyLAorCU9VVCBVU0hPUlQgKnBDYXBhYmlsaXR5SW5mbywKKwlPVVQgVVNIT1JUICpwU3RhdHVzLAorCU9VVCBVU0hPUlQgKnBBaWQsCisJT1VUIFVDSEFSIFN1cFJhdGVbXSwKKwlPVVQgVUNIQVIgKnBTdXBSYXRlTGVuLAorCU9VVCBVQ0hBUiBFeHRSYXRlW10sCisJT1VUIFVDSEFSICpwRXh0UmF0ZUxlbiwKKyAgICBPVVQgSFRfQ0FQQUJJTElUWV9JRQkJKnBIdENhcGFiaWxpdHksCisgICAgT1VUIEFERF9IVF9JTkZPX0lFCQkqcEFkZEh0SW5mbywJLy8gQVAgbWlnaHQgdXNlIHRoaXMgYWRkaXRpb25hbCBodCBpbmZvIElFCisgICAgT1VUIFVDSEFSCQkJKnBIdENhcGFiaWxpdHlMZW4sCisgICAgT1VUIFVDSEFSCQkJKnBBZGRIdEluZm9MZW4sCisgICAgT1VUIFVDSEFSCQkJKnBOZXdFeHRDaGFubmVsT2Zmc2V0LAorCU9VVCBQRURDQV9QQVJNIHBFZGNhUGFybSwKKwlPVVQgVUNIQVIgKnBDa2lwRmxhZyk7CisKK0JPT0xFQU4gUGVlckRpc2Fzc29jU2FuaXR5KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBWT0lEICpNc2csCisJSU4gIFVMT05HIE1zZ0xlbiwKKwlPVVQgUFVDSEFSIHBBZGRyMiwKKwlPVVQgVVNIT1JUICpSZWFzb24pOworCitCT09MRUFOIFBlZXJXcGFNZXNzYWdlU2FuaXR5KAorICAgIElOIAlQUlRNUF9BREFQVEVSIAkJcEFkLAorICAgIElOIAlQRUFQT0xfUEFDS0VUIAkJcE1zZywKKyAgICBJTiAJVUxPTkcgCQkJCU1zZ0xlbiwKKyAgICBJTiAJVUNIQVIJCQkJTXNnVHlwZSwKKyAgICBJTiAJTUFDX1RBQkxFX0VOVFJZICAJKnBFbnRyeSk7CisKK0JPT0xFQU4gUGVlckRlYXV0aFNhbml0eSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgVk9JRCAqTXNnLAorCUlOICBVTE9ORyBNc2dMZW4sCisJT1VUIFBVQ0hBUiBwQWRkcjIsCisJT1VUIFVTSE9SVCAqUmVhc29uKTsKKworQk9PTEVBTiBQZWVyUHJvYmVSZXFTYW5pdHkoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFZPSUQgKk1zZywKKwlJTiAgVUxPTkcgTXNnTGVuLAorCU9VVCBQVUNIQVIgcEFkZHIyLAorCU9VVCBDSEFSIFNzaWRbXSwKKwlPVVQgVUNIQVIgKnBTc2lkTGVuKTsKKworQk9PTEVBTiBHZXRUaW1CaXQoCisJSU4gIENIQVIgKlB0ciwKKwlJTiAgVVNIT1JUIEFpZCwKKwlPVVQgVUNIQVIgKlRpbUxlbiwKKwlPVVQgVUNIQVIgKkJjYXN0RmxhZywKKwlPVVQgVUNIQVIgKkR0aW1Db3VudCwKKwlPVVQgVUNIQVIgKkR0aW1QZXJpb2QsCisJT1VUIFVDSEFSICpNZXNzYWdlVG9NZSk7CisKK1VDSEFSIENoYW5uZWxTYW5pdHkoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVUNIQVIgY2hhbm5lbCk7CisKK05ESVNfODAyXzExX05FVFdPUktfVFlQRSBOZXR3b3JrVHlwZUluVXNlU2FuaXR5KAorCUlOIFBCU1NfRU5UUlkgcEJzcyk7CisKK0JPT0xFQU4gTWxtZURlbEJBUmVxU2FuaXR5KAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIFZPSUQgKk1zZywKKyAgICBJTiBVTE9ORyBNc2dMZW4pOworCitCT09MRUFOIE1sbWVBZGRCQVJlcVNhbml0eSgKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBWT0lEICpNc2csCisgICAgSU4gVUxPTkcgTXNnTGVuLAorICAgIE9VVCBQVUNIQVIgcEFkZHIyKTsKKworVUxPTkcgTWFrZU91dGdvaW5nRnJhbWUoCisJT1VUIENIQVIgKkJ1ZmZlciwKKwlPVVQgVUxPTkcgKkxlbmd0aCwgLi4uKTsKKworVk9JRCAgTGZzckluaXQoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFVMT05HIFNlZWQpOworCitVQ0hBUiBSYW5kb21CeXRlKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworVk9JRCBBc2ljVXBkYXRlQXV0b0ZhbGxCYWNrVGFibGUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJcFR4UmF0ZSk7CisKK1ZPSUQgIE1sbWVQZXJpb2RpY0V4ZWMoCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKKworVk9JRCBMaW5rRG93bkV4ZWMoCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKKworVk9JRCBMaW5rVXBFeGVjKAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKKwlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMyk7CisKK1ZPSUQgU1RBTWxtZVBlcmlvZGljRXhlYygKKwlQUlRNUF9BREFQVEVSIHBBZCk7CisKK1ZPSUQgTWxtZUF1dG9TY2FuKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKworVk9JRCBNbG1lQXV0b1JlY29ubmVjdExhc3RTU0lEKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKworQk9PTEVBTiBNbG1lVmFsaWRhdGVTU0lEKAorCUlOIFBVQ0hBUiBwU3NpZCwKKwlJTiBVQ0hBUiAgU3NpZExlbik7CisKK1ZPSUQgTWxtZUNoZWNrRm9yUm9hbWluZygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVTE9ORyAgICBOb3czMik7CisKK1ZPSUQgTWxtZUNoZWNrRm9yRmFzdFJvYW1pbmcoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFVMT05HICAgICAgICAgICBOb3cpOworCitWT0lEIE1sbWVEeW5hbWljVHhSYXRlU3dpdGNoaW5nKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKworVk9JRCBNbG1lU2V0VHhSYXRlKAorCUlOIFBSVE1QX0FEQVBURVIJCXBBZCwKKwlJTiBQTUFDX1RBQkxFX0VOVFJZCQlwRW50cnksCisJSU4gUFJUTVBfVFhfUkFURV9TV0lUQ0gJcFR4UmF0ZSk7CisKK1ZPSUQgTWxtZVNlbGVjdFR4UmF0ZVRhYmxlKAorCUlOIFBSVE1QX0FEQVBURVIJCXBBZCwKKwlJTiBQTUFDX1RBQkxFX0VOVFJZCQlwRW50cnksCisJSU4gUFVDSEFSCQkJCSpwcFRhYmxlLAorCUlOIFBVQ0hBUgkJCQlwVGFibGVTaXplLAorCUlOIFBVQ0hBUgkJCQlwSW5pdFR4UmF0ZUlkeCk7CisKK1ZPSUQgTWxtZUNhbGN1bGF0ZUNoYW5uZWxRdWFsaXR5KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVMT05HIE5vdyk7CisKK1ZPSUQgTWxtZUNoZWNrUHNtQ2hhbmdlKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVMT05HICAgIE5vdzMyKTsKKworVk9JRCBNbG1lU2V0UHNtQml0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVTSE9SVCBwc20pOworCitWT0lEIE1sbWVTZXRUeFByZWFtYmxlKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVTSE9SVCBUeFByZWFtYmxlKTsKKworVk9JRCBVcGRhdGVCYXNpY1JhdGVCaXRtYXAoCisJSU4JUFJUTVBfQURBUFRFUglwQWQpOworCitWT0lEIE1sbWVVcGRhdGVUeFJhdGVzKAorCUlOIFBSVE1QX0FEQVBURVIgCXBBZCwKKwlJTiAJQk9PTEVBTgkJIAliTGlua1VwLAorCUlOCVVDSEFSCQkJYXBpZHgpOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCitWT0lEIE1sbWVVcGRhdGVIdFR4UmF0ZXMoCisJSU4gUFJUTVBfQURBUFRFUiAJCXBBZCwKKwlJTglVQ0hBUgkJCQlhcGlkeCk7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKK1ZPSUQgICAgUlRNUENoZWNrUmF0ZXMoCisJSU4gICAgICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOIE9VVCAgVUNIQVIgICAgICAgICAgIFN1cFJhdGVbXSwKKwlJTiBPVVQgIFVDSEFSICAgICAgICAgICAqU3VwUmF0ZUxlbik7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKK0JPT0xFQU4gUlRNUENoZWNrQ2hhbm5lbCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVQ0hBUgkJQ2VudHJhbENoYW5uZWwsCisJSU4gVUNIQVIJCUNoYW5uZWwpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCitCT09MRUFOIAlSVE1QQ2hlY2tIdCgKKwlJTgkJUFJUTVBfQURBUFRFUglwQWQsCisJSU4JCVVDSEFSCVdjaWQsCisJSU4gT1VUCUhUX0NBUEFCSUxJVFlfSUUJCQkqcEh0Q2FwYWJpbGl0eSwKKwlJTiBPVVQJQUREX0hUX0lORk9fSUUJCQkqcEFkZEh0SW5mbyk7CisKK1ZPSUQgU3RhUXVpY2tSZXNwb25lRm9yUmF0ZVVwRXhlYygKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCisJSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpOworCitWT0lEIEFzaWNCYnBUdW5pbmcxKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKworVk9JRCBBc2ljQmJwVHVuaW5nMigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK1ZPSUQgUlRNUFVwZGF0ZU1sbWVSYXRlKAorCUlOIFBSVE1QX0FEQVBURVIJcEFkKTsKKworQ0hBUiBSVE1QTWF4UnNzaSgKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiBDSEFSCQkJCVJzc2kwLAorCUlOIENIQVIJCQkJUnNzaTEsCisJSU4gQ0hBUgkJCQlSc3NpMik7CisKK1ZPSUQgQXNpY0V2YWx1YXRlUnhBbnQoCisJSU4gUFJUTVBfQURBUFRFUglwQWQpOworCitWT0lEIEFzaWNSeEFudEV2YWxUaW1lb3V0KAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKKwlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMyk7CisKK1ZPSUQgQVBTRFBlcmlvZGljRXhlYygKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCisJSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpOworCitCT09MRUFOIFJUTVBDaGVja0VudHJ5RW5hYmxlQXV0b1JhdGVTd2l0Y2goCisJSU4gUFJUTVBfQURBUFRFUiAgICBwQWQsCisJSU4gUE1BQ19UQUJMRV9FTlRSWQlwRW50cnkpOworCitVQ0hBUiBSVE1QU3RhRml4ZWRUeE1vZGUoCisJSU4gUFJUTVBfQURBUFRFUiAgICBwQWQsCisJSU4gUE1BQ19UQUJMRV9FTlRSWQlwRW50cnkpOworCitWT0lEIFJUTVBVcGRhdGVMZWdhY3lUeFNldHRpbmcoCisJCVVDSEFSCQkJCWZpeGVkX3R4X21vZGUsCisJCVBNQUNfVEFCTEVfRU5UUlkJcEVudHJ5KTsKKworQk9PTEVBTiBSVE1QQXV0b1JhdGVTd2l0Y2hDaGVjaygKKwlJTiBQUlRNUF9BREFQVEVSICAgIHBBZCk7CisKK05ESVNfU1RBVFVTIE1sbWVJbml0KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworVk9JRCBNbG1lSGFuZGxlcigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK1ZPSUQgTWxtZUhhbHQoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitWT0lEIE1sbWVSZXNldFJhbGlua0NvdW50ZXJzKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworVk9JRCBCdWlsZENoYW5uZWxMaXN0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKworVUNIQVIgRmlyc3RDaGFubmVsKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworVUNIQVIgTmV4dENoYW5uZWwoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFVDSEFSIGNoYW5uZWwpOworCitWT0lEIENoYW5nZVRvQ2VsbFBvd2VyTGltaXQoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVUNIQVIgICAgICAgICBBaXJvbmV0Q2VsbFBvd2VyTGltaXQpOworCitWT0lEIFJhaXNlQ2xvY2soCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFVJTlQzMiAqeCk7CisKK1ZPSUQgTG93ZXJDbG9jaygKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgVUlOVDMyICp4KTsKKworVVNIT1JUIFNoaWZ0SW5CaXRzKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworVk9JRCBTaGlmdE91dEJpdHMoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFVTSE9SVCBkYXRhLAorCUlOICBVU0hPUlQgY291bnQpOworCitWT0lEIEVFcHJvbUNsZWFudXAoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitWT0lEIEVXRFMoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitWT0lEIEVXRU4oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitVU0hPUlQgUlRNUF9FRVBST01fUkVBRDE2KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBVU0hPUlQgT2Zmc2V0KTsKKworVk9JRCBSVE1QX0VFUFJPTV9XUklURTE2KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBVU0hPUlQgT2Zmc2V0LAorCUlOICBVU0hPUlQgRGF0YSk7CisKKy8vCisvLyBQcm90b3R5cGVzIG9mIGZ1bmN0aW9uIGRlZmluaXRpb24gaW4gcnRtcF90a2lwLmMKKy8vCitWT0lEICAgIFJUTVBJbml0VGtpcEVuZ2luZSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBUS2V5LAorCUlOICBVQ0hBUiAgICAgICAgICAgS2V5SWQsCisJSU4gIFBVQ0hBUiAgICAgICAgICBwVEEsCisJSU4gIFBVQ0hBUiAgICAgICAgICBwTUlDS2V5LAorCUlOICBQVUNIQVIgICAgICAgICAgcFRTQywKKwlPVVQgUFVMT05HICAgICAgICAgIHBJVjE2LAorCU9VVCBQVUxPTkcgICAgICAgICAgcElWMzIpOworCitWT0lEICAgIFJUTVBJbml0TUlDRW5naW5lKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBQVUNIQVIgICAgICAgICAgcEtleSwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBEQSwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBTQSwKKwlJTiAgVUNIQVIgICAgICAgICAgIFVzZXJQcmlvcml0eSwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBNSUNLZXkpOworCitCT09MRUFOIFJUTVBUa2lwQ29tcGFyZU1JQ1ZhbHVlKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBQVUNIQVIgICAgICAgICAgcFNyYywKKwlJTiAgUFVDSEFSICAgICAgICAgIHBEQSwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBTQSwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBNSUNLZXksCisJSU4JVUNIQVIJCQlVc2VyUHJpb3JpdHksCisJSU4gIFVJTlQgICAgICAgICAgICBMZW4pOworCitWT0lEICAgIFJUTVBDYWxjdWxhdGVNSUNWYWx1ZSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgUE5ESVNfUEFDS0VUICAgIHBQYWNrZXQsCisJSU4gIFBVQ0hBUiAgICAgICAgICBwRW5jYXAsCisJSU4gIFBDSVBIRVJfS0VZICAgICBwS2V5LAorCUlOCVVDSEFSCQkJYXBpZHgpOworCitCT09MRUFOIFJUTVBUa2lwQ29tcGFyZU1JQ1ZhbHVlV2l0aExMQygKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBMTEMsCisJSU4gIFBVQ0hBUiAgICAgICAgICBwU3JjLAorCUlOICBQVUNIQVIgICAgICAgICAgcERBLAorCUlOICBQVUNIQVIgICAgICAgICAgcFNBLAorCUlOICBQVUNIQVIgICAgICAgICAgcE1JQ0tleSwKKwlJTiAgVUlOVCAgICAgICAgICAgIExlbik7CisKK1ZPSUQgICAgUlRNUFRraXBBcHBlbmRCeXRlKAorCUlOICBQVEtJUF9LRVlfSU5GTyAgcFRraXAsCisJSU4gIFVDSEFSICAgICAgICAgICB1Q2hhcik7CisKK1ZPSUQgICAgUlRNUFRraXBBcHBlbmQoCisJSU4gIFBUS0lQX0tFWV9JTkZPICBwVGtpcCwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBTcmMsCisJSU4gIFVJTlQgICAgICAgICAgICBuQnl0ZXMpOworCitWT0lEICAgIFJUTVBUa2lwR2V0TUlDKAorCUlOICBQVEtJUF9LRVlfSU5GTyAgcFRraXApOworCitCT09MRUFOIFJUTVBTb2Z0RGVjcnlwdFRLSVAoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gUFVDSEFSCXBEYXRhLAorCUlOIFVMT05HCURhdGFCeXRlQ250LAorCUlOIFVDSEFSICAgIFVzZXJQcmlvcml0eSwKKwlJTiBQQ0lQSEVSX0tFWQlwV3BhS2V5KTsKKworQk9PTEVBTiBSVE1QU29mdERlY3J5cHRBRVMoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gUFVDSEFSCXBEYXRhLAorCUlOIFVMT05HCURhdGFCeXRlQ250LAorCUlOIFBDSVBIRVJfS0VZCXBXcGFLZXkpOworCisvLworLy8gUHJvdG90eXBlcyBvZiBmdW5jdGlvbiBkZWZpbml0aW9uIGluIGNtbV9pbmZvLmMKKy8vCitORElTX1NUQVRVUyBSVE1QV1BBUmVtb3ZlS2V5UHJvYygKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgUFZPSUQgICAgICAgICAgIHBCdWYpOworCitWT0lEICAgIFJUTVBXUEFSZW1vdmVBbGxLZXlzKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworQk9PTEVBTiBSVE1QQ2hlY2tTdHJQcmludEFibGUoCisgICAgSU4gIENIQVIgKnBJblB1dFN0ciwKKyAgICBJTiAgVUNIQVIgc3RyTGVuKTsKKworVk9JRCAgICBSVE1QU2V0UGh5TW9kZSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgVUxPTkcgcGh5bW9kZSk7CisKK1ZPSUQJUlRNUFVwZGF0ZUhUSUUoCisJSU4JUlRfSFRfQ0FQQUJJTElUWQkqcFJ0SHQsCisJSU4JCVVDSEFSCQkJCSpwTWNzU2V0LAorCU9VVAkJSFRfQ0FQQUJJTElUWV9JRSAqcEh0Q2FwYWJpbGl0eSwKKwlPVVQJCUFERF9IVF9JTkZPX0lFCQkqcEFkZEh0SW5mbyk7CisKK1ZPSUQJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVQ0hBUgkJCUJzc0lkeCwKKwlJTiAJVUNIQVIJCSAJS2V5SWR4LAorCUlOIAlVQ0hBUgkJIAlDaXBoZXJBbGcsCisJSU4gCU1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5KTsKKworQ0hBUiAqR2V0RW5jcnlwdFR5cGUoCisJQ0hBUiBlbmMpOworCitDSEFSICpHZXRBdXRoTW9kZSgKKwlDSEFSIGF1dGgpOworCitWT0lEIFJUTVBJb2N0bEdldFNpdGVTdXJ2ZXkoCisJSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKKwlJTglzdHJ1Y3QgaXdyZXEJKndycSk7CisKK1ZPSUQgUlRNUElvY3RsR2V0TWFjVGFibGUoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gc3RydWN0IGl3cmVxICp3cnEpOworCitWT0lEIFJUTVBJbmRpY2F0ZVdQQTJTdGF0dXMoCisJSU4gIFBSVE1QX0FEQVBURVIgIHBBZGFwdGVyKTsKKworVk9JRAlSVE1QT1BNb2RlU3dpdGNoaW5nKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKTsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorVk9JRCAgICBSVE1QQWRkQlNTSURDaXBoZXIoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4JVUNIQVIJQWlkLAorICAgIElOICBQTkRJU184MDJfMTFfS0VZICAgIHBLZXksCisgICAgSU4gIFVDSEFSICAgQ2lwaGVyQWxnKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorVk9JRAlSVE1QU2V0SFQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JT0lEX1NFVF9IVF9QSFlNT0RFICpwSFRQaHlNb2RlKTsKKworVk9JRAlSVE1QU2V0SW5kaXZpZHVhbEhUKAorCUlOCVBSVE1QX0FEQVBURVIJCXBBZCwKKwlJTglVQ0hBUgkJCQlhcGlkeCk7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKK1ZPSUQgUlRNUFNlbmRXaXJlbGVzc0V2ZW50KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVTSE9SVAkJCUV2ZW50X2ZsYWcsCisJSU4JUFVDSEFSIAkJCXBBZGRyLAorCUlOICBVQ0hBUgkJCUJzc0lkeCwKKwlJTglDSEFSCQkJUnNzaSk7CisKK1ZPSUQJTklDVXBkYXRlQ250bENvdW50ZXJzKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBIRUFERVJfODAyXzExCXBIZWFkZXIsCisJSU4gICAgVUNIQVIJCQlTdWJUeXBlLAorCUlOCVBSWFdJX1NUUlVDIAlwUnhXSSk7CisvLworLy8gcHJvdG90eXBlIGluIHdwYS5jCisvLworQk9PTEVBTiBXcGFNc2dUeXBlU3Vic3QoCisJSU4gIFVDSEFSICAgRUFQVHlwZSwKKwlPVVQgSU5UCQkqTXNnVHlwZSk7CisKK1ZPSUQgV3BhUHNrU3RhdGVNYWNoaW5lSW5pdCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgICAgICBwQWQsCisJSU4gIFNUQVRFX01BQ0hJTkUgICAgICAgKlMsCisJT1VUIFNUQVRFX01BQ0hJTkVfRlVOQyBUcmFuc1tdKTsKKworVk9JRCBXcGFFQVBPTEtleUFjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCAgICBXcGFQYWlyTXNnMUFjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCAgICBXcGFQYWlyTXNnM0FjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCAgICBXcGFHcm91cE1zZzFBY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgICAgV3BhTWFjSGVhZGVySW5pdCgKKwlJTiAgICAgIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gT1VUICBQSEVBREVSXzgwMl8xMSAgcEhkcjgwMjExLAorCUlOICAgICAgVUNIQVIgICAgICAgICAgIHdlcCwKKwlJTiAgICAgIFBVQ0hBUiAgICAgICAgICBwQWRkcjEpOworCitWT0lEICAgIFdwYTJQYWlyTXNnMUFjdGlvbigKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKyAgICBJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCAgICBXcGEyUGFpck1zZzNBY3Rpb24oCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisgICAgSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK0JPT0xFQU4gUGFyc2VLZXlEYXRhKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorICAgIElOICBQVUNIQVIgICAgICAgICAgcEtleURhdGEsCisgICAgSU4gIFVDSEFSICAgICAgICAgICBLZXlEYXRhTGVuLAorCUlOCVVDSEFSCQkJYlBhaXJld2lzZSk7CisKK1ZPSUQgICAgUlRNUFRvV2lyZWxlc3NTdGEoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFBVQ0hBUiAgICAgICAgICBwSGVhZGVyODAyXzMsCisgICAgSU4gIFVJTlQgICAgICAgICAgICBIZHJMZW4sCisJSU4gIFBVQ0hBUiAgICAgICAgICBwRGF0YSwKKyAgICBJTiAgVUlOVCAgICAgICAgICAgIERhdGFMZW4sCisgICAgSU4JQk9PTEVBTgkJCWlzNHdheUZyYW1lKTsKKworVk9JRCAgICBITUFDX1NIQTEoCisJSU4gIFVDSEFSICAgKnRleHQsCisJSU4gIFVJTlQgICAgdGV4dF9sZW4sCisJSU4gIFVDSEFSICAgKmtleSwKKwlJTiAgVUlOVCAgICBrZXlfbGVuLAorCUlOICBVQ0hBUiAgICpkaWdlc3QpOworCitWT0lEICAgIFBSRigKKwlJTiAgVUNIQVIgICAqa2V5LAorCUlOICBJTlQgICAgIGtleV9sZW4sCisJSU4gIFVDSEFSICAgKnByZWZpeCwKKwlJTiAgSU5UICAgICBwcmVmaXhfbGVuLAorCUlOICBVQ0hBUiAgICpkYXRhLAorCUlOICBJTlQgICAgIGRhdGFfbGVuLAorCU9VVCBVQ0hBUiAgICpvdXRwdXQsCisJSU4gIElOVCAgICAgbGVuKTsKKworVk9JRCAgICBDQ0tNUFJGKAorCUlOICBVQ0hBUiAgICprZXksCisJSU4gIElOVCAgICAga2V5X2xlbiwKKwlJTiAgVUNIQVIgICAqZGF0YSwKKwlJTiAgSU5UICAgICBkYXRhX2xlbiwKKwlPVVQgVUNIQVIgICAqb3V0cHV0LAorCUlOICBJTlQgICAgIGxlbik7CisKK1ZPSUQgV3BhQ291bnRQVEsoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFVDSEFSICAgKlBNSywKKwlJTiAgVUNIQVIgICAqQU5vbmNlLAorCUlOICBVQ0hBUiAgICpBQSwKKwlJTiAgVUNIQVIgICAqU05vbmNlLAorCUlOICBVQ0hBUiAgICpTQSwKKwlPVVQgVUNIQVIgICAqb3V0cHV0LAorCUlOICBVSU5UICAgIGxlbik7CisKK1ZPSUQgICAgR2VuUmFuZG9tKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOCVVDSEFSCQkJKm1hY0FkZHIsCisJT1VUCVVDSEFSCQkJKnJhbmRvbSk7CisKKy8vCisvLyBwcm90b3R5cGUgaW4gYWlyb25ldC5jCisvLworVk9JRCAgICBBaXJvbmV0U3RhdGVNYWNoaW5lSW5pdCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgICAgICBwQWQsCisJSU4gIFNUQVRFX01BQ0hJTkUgICAgICAgKlMsCisJT1VUIFNUQVRFX01BQ0hJTkVfRlVOQyAgVHJhbnNbXSk7CisKK1ZPSUQgICAgQWlyb25ldE1zZ0FjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCAgICBBaXJvbmV0UmVxdWVzdEFjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCAgICBDaGFubmVsTG9hZFJlcXVlc3RBY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFVDSEFSICAgICAgICAgICBJbmRleCk7CisKK1ZPSUQgICAgTm9pc2VIaXN0UmVxdWVzdEFjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgVUNIQVIgICAgICAgICAgIEluZGV4KTsKKworVk9JRCAgICBCZWFjb25SZXF1ZXN0QWN0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBVQ0hBUiAgICAgICAgICAgSW5kZXgpOworCitWT0lEICAgIEFpcm9uZXRSZXBvcnRBY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgICAgQ2hhbm5lbExvYWRSZXBvcnRBY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFVDSEFSICAgICAgICAgICBJbmRleCk7CisKK1ZPSUQgICAgTm9pc2VIaXN0UmVwb3J0QWN0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBVQ0hBUiAgICAgICAgICAgSW5kZXgpOworCitWT0lEICAgIEFpcm9uZXRGaW5hbFJlcG9ydEFjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK1ZPSUQgICAgQmVhY29uUmVwb3J0QWN0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBVQ0hBUiAgICAgICAgICAgSW5kZXgpOworCitWT0lEICAgIEFpcm9uZXRBZGRCZWFjb25SZXBvcnQoCisJSU4gIFBSVE1QX0FEQVBURVIgICAgICAgcEFkLAorCUlOICBVTE9ORyAgICAgICAgICAgICAgIEluZGV4LAorCUlOICBQTUxNRV9RVUVVRV9FTEVNICAgIHBFbGVtKTsKKworVk9JRCAgICBBaXJvbmV0Q3JlYXRlQmVhY29uUmVwb3J0RnJvbUJzc1RhYmxlKAorCUlOICBQUlRNUF9BREFQVEVSICAgICAgIHBBZCk7CisKK1ZPSUQgICAgREJHUFJJTlRfVFhfUklORygKKwlJTiBQUlRNUF9BREFQVEVSICBwQWQsCisJSU4gVUNIQVIgICAgICAgICAgUXVlSWR4KTsKKworVk9JRCBEQkdQUklOVF9SWF9SSU5HKAorCUlOIFBSVE1QX0FEQVBURVIgIHBBZCk7CisKK0NIQVIgICAgQ29udmVydFRvUnNzaSgKKwlJTiBQUlRNUF9BREFQVEVSICBwQWQsCisJSU4gQ0hBUgkJCQlSc3NpLAorCUlOIFVDSEFSICAgIFJzc2lOdW1iZXIpOworCisKKyNpZmRlZiBET1QxMU5fRFJBRlQzCitWT0lEIEJ1aWxkRWZmZWN0ZWRDaGFubmVsTGlzdCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisjZW5kaWYgLy8gRE9UMTFOX0RSQUZUMyAvLworCisKK1ZPSUQgQVBBc2ljRXZhbHVhdGVSeEFudCgKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCk7CisKKworVk9JRCBBUEFzaWNSeEFudEV2YWxUaW1lb3V0KAorCUlOIFBSVE1QX0FEQVBURVIJcEFkKTsKKworLy8KKy8vIGZ1bmN0aW9uIHByb3RvdHlwZSBpbiBjbW1fd3BhLmMKKy8vCitCT09MRUFOIFJUTVBDaGVja1dQQWZyYW1lKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFBNQUNfVEFCTEVfRU5UUlkJcEVudHJ5LAorCUlOIFBVQ0hBUiAJCQlwRGF0YSwKKwlJTiBVTE9ORyAJCQlEYXRhQnl0ZUNvdW50LAorCUlOIFVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpOworCitWT0lEIEFFU19HVEtfS0VZX1VOV1JBUCgKKwlJTiAgVUNIQVIgICAqa2V5LAorCU9VVCBVQ0hBUiAgICpwbGFpbnRleHQsCisJSU4JVUNIQVIJY19sZW4sCisJSU4gIFVDSEFSICAgKmNpcGhlcnRleHQpOworCitCT09MRUFOIFJUTVBDaGVja1JTTklFKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBQVUNIQVIgICAgICAgICAgcERhdGEsCisJSU4gIFVDSEFSICAgICAgICAgICBEYXRhTGVuLAorCUlOICBNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeSwKKwlPVVQJVUNIQVIJCQkqT2Zmc2V0KTsKKworQk9PTEVBTiBSVE1QUGFyc2VFYXBvbEtleURhdGEoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFBVQ0hBUiAgICAgICAgICBwS2V5RGF0YSwKKwlJTiAgVUNIQVIgICAgICAgICAgIEtleURhdGFMZW4sCisJSU4JVUNIQVIJCQlHcm91cEtleUluZGV4LAorCUlOCVVDSEFSCQkJTXNnVHlwZSwKKwlJTglCT09MRUFOCQkJYldQQTIsCisJSU4gIE1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5KTsKKworVk9JRAlDb25zdHJ1Y3RFYXBvbE1zZygKKwlJTiAJUFJUTVBfQURBUFRFUiAgICAJcEFkLAorICAgIElOIAlVQ0hBUgkJCQlQZWVyQXV0aE1vZGUsCisgICAgSU4gCVVDSEFSCQkJCVBlZXJXZXBTdGF0dXMsCisgICAgSU4gCVVDSEFSCQkJCU15R3JvdXBLZXlXZXBTdGF0dXMsCisgICAgSU4gCVVDSEFSCQkJCU1zZ1R5cGUsCisgICAgSU4JVUNIQVIJCQkJRGVmYXVsdEtleUlkeCwKKyAgICBJTiAJVUNIQVIJCQkJKlJlcGxheUNvdW50ZXIsCisJSU4gCVVDSEFSCQkJCSpLZXlOb25jZSwKKwlJTglVQ0hBUgkJCQkqVHhSU0MsCisJSU4JVUNIQVIJCQkJKlBUSywKKwlJTglVQ0hBUgkJCQkqR1RLLAorCUlOCVVDSEFSCQkJCSpSU05JRSwKKwlJTglVQ0hBUgkJCQlSU05JRV9MZW4sCisgICAgT1VUIFBFQVBPTF9QQUNLRVQgICAgICAgcE1zZyk7CisKK1ZPSUQJQ2FsY3VsYXRlTUlDKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVDSEFSCQkJUGVlcldlcFN0YXR1cywKKwlJTglVQ0hBUgkJCSpQVEssCisJT1VUIFBFQVBPTF9QQUNLRVQgICBwTXNnKTsKKworTkRJU19TVEFUVVMJUlRNUFNvZnREZWNyeXB0QnJvYWRDYXN0RGF0YSgKKwlJTglQUlRNUF9BREFQVEVSCQkJCQlwQWQsCisJSU4JUlhfQkxLCQkJCQkJCSpwUnhCbGssCisJSU4gIE5ESVNfODAyXzExX0VOQ1JZUFRJT05fU1RBVFVTIAlHcm91cENpcGhlciwKKwlJTiAgUENJUEhFUl9LRVkJCQkJCQlwU2hhcmRfa2V5KTsKKworVk9JRAlDb25zdHJ1Y3RFYXBvbEtleURhdGEoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVUNIQVIJCQlQZWVyQXV0aE1vZGUsCisJSU4JVUNIQVIJCQlQZWVyV2VwU3RhdHVzLAorCUlOCVVDSEFSCQkJR3JvdXBLZXlXZXBTdGF0dXMsCisJSU4gCVVDSEFSCQkJTXNnVHlwZSwKKwlJTglVQ0hBUgkJCURlZmF1bHRLZXlJZHgsCisJSU4JQk9PTEVBTgkJCWJXUEEyQ2FwYWJsZSwKKwlJTglVQ0hBUgkJCSpQVEssCisJSU4JVUNIQVIJCQkqR1RLLAorCUlOCVVDSEFSCQkJKlJTTklFLAorCUlOCVVDSEFSCQkJUlNOSUVfTEVOLAorCU9VVCBQRUFQT0xfUEFDS0VUICAgcE1zZyk7CisKK1ZPSUQgUlRNUE1ha2VSU05JRSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgVUlOVCAgICAgICAgICAgIEF1dGhNb2RlLAorCUlOICBVSU5UICAgICAgICAgICAgV2VwU3RhdHVzLAorCUlOCVVDSEFSCQkJYXBpZHgpOworCisvLworLy8gZnVuY3Rpb24gcHJvdG90eXBlIGluIGFwX3dwYS5jCisvLworCitCT09MRUFOIEFQV3BhTXNnVHlwZVN1YnN0KAorCUlOIFVDSEFSICAgIEVBUFR5cGUsCisJT1VUIElOVCAqTXNnVHlwZSkgOworCitNQUNfVEFCTEVfRU5UUlkgKlBBQ0lucXVpcnkoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFVMT05HICAgICAgICAgICBXY2lkKTsKKworQk9PTEVBTiBSVE1QQ2hlY2tNY2FzdCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBQRUlEX1NUUlVDVCAgICAgIGVpZF9wdHIsCisJSU4gTUFDX1RBQkxFX0VOVFJZICAqcEVudHJ5KTsKKworQk9PTEVBTiBSVE1QQ2hlY2tVY2FzdCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBQRUlEX1NUUlVDVCAgICAgIGVpZF9wdHIsCisJSU4gTUFDX1RBQkxFX0VOVFJZICAqcEVudHJ5KTsKKworQk9PTEVBTiBSVE1QQ2hlY2tBVVRIKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFBFSURfU1RSVUNUICAgICAgZWlkX3B0ciwKKwlJTiBNQUNfVEFCTEVfRU5UUlkgICpwRW50cnkpOworCitWT0lEIFdQQVN0YXJ0NFdheUhTKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeSwKKwlJTglVTE9ORwkJCVRpbWVJbnRlcnZhbCk7CisKK1ZPSUQgV1BBU3RhcnQyV2F5R3JvdXBIUygKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUFDX1RBQkxFX0VOVFJZICpwRW50cnkpOworCitWT0lEIEFQV3BhRUFQUGFja2V0QWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgQVBXcGFFQVBPTFN0YXJ0QWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgQVBXcGFFQVBPTExvZ29mZkFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIEFQV3BhRUFQT0xLZXlBY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBBUFdwYUVBUE9MQVNGQWxlcnRBY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gICpFbGVtKTsKKworVk9JRCBIYW5kbGVDb3VudGVyTWVhc3VyZSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNQUNfVEFCTEVfRU5UUlkgICpwRW50cnkpOworCitWT0lEIFBlZXJQYWlyTXNnMkFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNQUNfVEFCTEVfRU5UUlkgICpwRW50cnksCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBQZWVyUGFpck1zZzRBY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUFDX1RBQkxFX0VOVFJZICAqcEVudHJ5LAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgQ01UaW1lckV4ZWMoCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKKworVk9JRCBXUEFSZXRyeUV4ZWMoCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKKworVk9JRCBFbnF1ZXVlU3RhcnRGb3JQU0tFeGVjKAorICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKKyAgICBJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCisgICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAorICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMyk7CisKK1ZPSUQgUlRNUEhhbmRsZVNUQUtleSgKKyAgICBJTiBQUlRNUF9BREFQVEVSICAgIHBBZGFwdGVyLAorICAgIElOIE1BQ19UQUJMRV9FTlRSWSAgKnBFbnRyeSwKKyAgICBJTiBNTE1FX1FVRVVFX0VMRU0gICpFbGVtKTsKKworVk9JRCBQZWVyR3JvdXBNc2cyQWN0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgIHBBZCwKKwlJTiAgUE1BQ19UQUJMRV9FTlRSWSBwRW50cnksCisJSU4gIFZPSUQgICAgICAgICAgICAgKk1zZywKKwlJTiAgVUlOVCAgICAgICAgICAgICBNc2dMZW4pOworCitWT0lEIFBhaXJEaXNBc3NvY0FjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgICBwQWQsCisJSU4gIFBNQUNfVEFCTEVfRU5UUlkgcEVudHJ5LAorCUlOICBVU0hPUlQgICAgICAgICAgIFJlYXNvbik7CisKK1ZPSUQgTWxtZURlQXV0aEFjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgICBwQWQsCisJSU4gIFBNQUNfVEFCTEVfRU5UUlkgcEVudHJ5LAorCUlOICBVU0hPUlQgICAgICAgICAgIFJlYXNvbik7CisKK1ZPSUQgR1JFS0VZUGVyaW9kaWNFeGVjKAorCUlOICBQVk9JRCAgIFN5c3RlbVNwZWNpZmljMSwKKwlJTiAgUFZPSUQgICBGdW5jdGlvbkNvbnRleHQsCisJSU4gIFBWT0lEICAgU3lzdGVtU3BlY2lmaWMyLAorCUlOICBQVk9JRCAgIFN5c3RlbVNwZWNpZmljMyk7CisKK1ZPSUQgQ291bnRHVEsoCisJSU4gIFVDSEFSICAgKlBNSywKKwlJTiAgVUNIQVIgICAqR05vbmNlLAorCUlOICBVQ0hBUiAgICpBQSwKKwlPVVQgVUNIQVIgICAqb3V0cHV0LAorCUlOICBVSU5UICAgIGxlbik7CisKK1ZPSUQgICAgR2V0U21hbGwoCisJSU4gIFBWT0lEICAgcFNyYzEsCisJSU4gIFBWT0lEICAgcFNyYzIsCisJT1VUIFBVQ0hBUiAgb3V0LAorCUlOICBVTE9ORyAgIExlbmd0aCk7CisKK1ZPSUQgICAgR2V0TGFyZ2UoCisJSU4gIFBWT0lEICAgcFNyYzEsCisJSU4gIFBWT0lEICAgcFNyYzIsCisJT1VUIFBVQ0hBUiAgb3V0LAorCUlOICBVTE9ORyAgIExlbmd0aCk7CisKK1ZPSUQgQVBHZW5SYW5kb20oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJT1VUIFVDSEFSICAgICAgICpyYW5kb20pOworCitWT0lEIEFFU19HVEtfS0VZX1dSQVAoCisJSU4gVUNIQVIgKmtleSwKKwlJTiBVQ0hBUiAqcGxhaW50ZXh0LAorCUlOIFVDSEFSIHBfbGVuLAorCU9VVCBVQ0hBUiAqY2lwaGVydGV4dCk7CisKK1ZPSUQgICAgV3BhU2VuZCgKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgcFBhY2tldCwKKyAgICBJTiAgVUxPTkcgICAgICAgICAgIExlbik7CisKK1ZPSUQgICAgQVBUb1dpcmVsZXNzU3RhKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeSwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBIZWFkZXI4MDJfMywKKwlJTiAgVUlOVCAgICAgICAgICAgIEhkckxlbiwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBEYXRhLAorCUlOICBVSU5UICAgICAgICAgICAgRGF0YUxlbiwKKyAgICBJTglCT09MRUFOCQkJYkNsZWFyRnJhbWUpOworCitWT0lEIFJUTVBBZGRQTUtJRENhY2hlKAorCUlOICBQUlRNUF9BREFQVEVSICAgCQlwQWQsCisJSU4JSU5UCQkJCQkJYXBpZHgsCisJSU4JUFVDSEFSCQkJCXBBZGRyLAorCUlOCVVDSEFSCQkJCQkqUE1LSUQsCisJSU4JVUNIQVIJCQkJCSpQTUspOworCitJTlQgUlRNUFNlYXJjaFBNS0lEQ2FjaGUoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4JSU5UCQkJCWFwaWR4LAorCUlOCVBVQ0hBUgkJcEFkZHIpOworCitWT0lEIFJUTVBEZWxldGVQTUtJRENhY2hlKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOCUlOVAkJCQlhcGlkeCwKKwlJTiAgSU5UCQkJCWlkeCk7CisKK1ZPSUQgUlRNUE1haW50YWluUE1LSURDYWNoZSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK1ZPSUQJUlRNUFNlbmRUcmlnZ2VyRnJhbWUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFZPSUQJCQlwQnVmZmVyLAorCUlOCVVMT05HCQkJTGVuZ3RoLAorCUlOICBVQ0hBUiAgICAgICAgICAgVHhSYXRlLAorCUlOCUJPT0xFQU4JCQliUW9zTnVsbCk7CisKKworLyogdGltZW91dCAtLSBtcyAqLworVk9JRCBSVE1QX1NldFBlcmlvZGljVGltZXIoCisJSU4JTkRJU19NSU5JUE9SVF9USU1FUiAqcFRpbWVyLAorCUlOCXVuc2lnbmVkIGxvbmcgdGltZW91dCk7CisKK1ZPSUQgUlRNUF9PU19Jbml0X1RpbWVyKAorCUlOCVBSVE1QX0FEQVBURVIgcEFkLAorCUlOCU5ESVNfTUlOSVBPUlRfVElNRVIgKnBUaW1lciwKKwlJTglUSU1FUl9GVU5DVElPTiBmdW5jdGlvbiwKKwlJTglQVk9JRCBkYXRhKTsKKworVk9JRCBSVE1QX09TX0FkZF9UaW1lcigKKwlJTglORElTX01JTklQT1JUX1RJTUVSCSpwVGltZXIsCisJSU4JdW5zaWduZWQgbG9uZyB0aW1lb3V0KTsKKworVk9JRCBSVE1QX09TX01vZF9UaW1lcigKKwlJTglORElTX01JTklQT1JUX1RJTUVSCSpwVGltZXIsCisJSU4JdW5zaWduZWQgbG9uZyB0aW1lb3V0KTsKKworCitWT0lEIFJUTVBfT1NfRGVsX1RpbWVyKAorCUlOCU5ESVNfTUlOSVBPUlRfVElNRVIJKnBUaW1lciwKKwlPVVQJQk9PTEVBTgkJCQkgKnBDYW5jZWxsZWQpOworCisKK1ZPSUQgUlRNUF9PU19SZWxlYXNlX1BhY2tldCgKKwlJTglQUlRNUF9BREFQVEVSIHBBZCwKKwlJTglQUVVFVUVfRU5UUlkgIHBFbnRyeSk7CisKK1ZPSUQgUlRNUHVzZWNEZWxheSgKKwlJTglVTE9ORwl1c2VjKTsKKworTkRJU19TVEFUVVMgb3NfYWxsb2NfbWVtKAorCUlOCVBSVE1QX0FEQVBURVIgcEFkLAorCU9VVAlQVUNIQVIgKm1lbSwKKwlJTglVTE9ORyAgc2l6ZSk7CisKK05ESVNfU1RBVFVTIG9zX2ZyZWVfbWVtKAorCUlOCVBSVE1QX0FEQVBURVIgcEFkLAorCUlOCVBVQ0hBUiBtZW0pOworCisKK3ZvaWQgUlRNUF9BbGxvY2F0ZVNoYXJlZE1lbW9yeSgKKwlJTglQUlRNUF9BREFQVEVSIHBBZCwKKwlJTglVTE9ORwlMZW5ndGgsCisJSU4JQk9PTEVBTglDYWNoZWQsCisJT1VUCVBWT0lECSpWaXJ0dWFsQWRkcmVzcywKKwlPVVQJUE5ESVNfUEhZU0lDQUxfQUREUkVTUyBQaHlzaWNhbEFkZHJlc3MpOworCitWT0lEIFJUTVBGcmVlVHhSeFJpbmdNZW1vcnkoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitORElTX1NUQVRVUyBBZGFwdGVyQmxvY2tBbGxvY2F0ZU1lbW9yeSgKKwlJTiBQVk9JRAloYW5kbGUsCisJT1VUCVBWT0lECSpwcEFkKTsKKwordm9pZCBSVE1QX0FsbG9jYXRlVHhEZXNjTWVtb3J5KAorCUlOCVBSVE1QX0FEQVBURVIgcEFkLAorCUlOCVVJTlQJSW5kZXgsCisJSU4JVUxPTkcJTGVuZ3RoLAorCUlOCUJPT0xFQU4JQ2FjaGVkLAorCU9VVAlQVk9JRAkqVmlydHVhbEFkZHJlc3MsCisJT1VUCVBORElTX1BIWVNJQ0FMX0FERFJFU1MgUGh5c2ljYWxBZGRyZXNzKTsKKwordm9pZCBSVE1QX0FsbG9jYXRlRmlyc3RUeEJ1ZmZlcigKKwlJTglQUlRNUF9BREFQVEVSIHBBZCwKKwlJTglVSU5UCUluZGV4LAorCUlOCVVMT05HCUxlbmd0aCwKKwlJTglCT09MRUFOCUNhY2hlZCwKKwlPVVQJUFZPSUQJKlZpcnR1YWxBZGRyZXNzLAorCU9VVAlQTkRJU19QSFlTSUNBTF9BRERSRVNTIFBoeXNpY2FsQWRkcmVzcyk7CisKK3ZvaWQgUlRNUF9BbGxvY2F0ZU1nbXREZXNjTWVtb3J5KAorCUlOCVBSVE1QX0FEQVBURVIgcEFkLAorCUlOCVVMT05HCUxlbmd0aCwKKwlJTglCT09MRUFOCUNhY2hlZCwKKwlPVVQJUFZPSUQJKlZpcnR1YWxBZGRyZXNzLAorCU9VVAlQTkRJU19QSFlTSUNBTF9BRERSRVNTIFBoeXNpY2FsQWRkcmVzcyk7CisKK3ZvaWQgUlRNUF9BbGxvY2F0ZVJ4RGVzY01lbW9yeSgKKwlJTglQUlRNUF9BREFQVEVSIHBBZCwKKwlJTglVTE9ORwlMZW5ndGgsCisJSU4JQk9PTEVBTglDYWNoZWQsCisJT1VUCVBWT0lECSpWaXJ0dWFsQWRkcmVzcywKKwlPVVQJUE5ESVNfUEhZU0lDQUxfQUREUkVTUyBQaHlzaWNhbEFkZHJlc3MpOworCitQTkRJU19QQUNLRVQgUlRNUF9BbGxvY2F0ZVJ4UGFja2V0QnVmZmVyKAorCUlOCVBSVE1QX0FEQVBURVIgcEFkLAorCUlOCVVMT05HCUxlbmd0aCwKKwlJTglCT09MRUFOCUNhY2hlZCwKKwlPVVQJUFZPSUQJKlZpcnR1YWxBZGRyZXNzLAorCU9VVAlQTkRJU19QSFlTSUNBTF9BRERSRVNTIFBoeXNpY2FsQWRkcmVzcyk7CisKK1BORElTX1BBQ0tFVCBSVE1QX0FsbG9jYXRlVHhQYWNrZXRCdWZmZXIoCisJSU4JUFJUTVBfQURBUFRFUiBwQWQsCisJSU4JVUxPTkcJTGVuZ3RoLAorCUlOCUJPT0xFQU4JQ2FjaGVkLAorCU9VVAlQVk9JRAkqVmlydHVhbEFkZHJlc3MpOworCitQTkRJU19QQUNLRVQgUlRNUF9BbGxvY2F0ZUZyYWdQYWNrZXRCdWZmZXIoCisJSU4JUFJUTVBfQURBUFRFUiBwQWQsCisJSU4JVUxPTkcJTGVuZ3RoKTsKKwordm9pZCBSVE1QX1F1ZXJ5UGFja2V0SW5mbygKKwlJTiAgUE5ESVNfUEFDS0VUIHBQYWNrZXQsCisJT1VUIFBBQ0tFVF9JTkZPICAqcFBhY2tldEluZm8sCisJT1VUIFBVQ0hBUgkJICpwU3JjQnVmVkEsCisJT1VUCVVJTlQJCSAqcFNyY0J1Zkxlbik7CisKK3ZvaWQgUlRNUF9RdWVyeU5leHRQYWNrZXRJbmZvKAorCUlOICBQTkRJU19QQUNLRVQgKnBwUGFja2V0LAorCU9VVCBQQUNLRVRfSU5GTyAgKnBQYWNrZXRJbmZvLAorCU9VVCBQVUNIQVIJCSAqcFNyY0J1ZlZBLAorCU9VVAlVSU5UCQkgKnBTcmNCdWZMZW4pOworCisKK0JPT0xFQU4gUlRNUF9GaWxsVHhCbGtJbmZvKAorCUlOIFJUTVBfQURBUFRFUiAqcEFkLAorCUlOIFRYX0JMSyAqcFR4QmxrKTsKKworCitQUlRNUF9TQ0FUVEVSX0dBVEhFUl9MSVNUCitydF9nZXRfc2dfbGlzdF9mcm9tX3BhY2tldChQTkRJU19QQUNLRVQgcFBhY2tldCwgUlRNUF9TQ0FUVEVSX0dBVEhFUl9MSVNUICpzZyk7CisKKworIHZvaWQgYW5ub3VuY2VfODAyXzNfcGFja2V0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBORElTX1BBQ0tFVAlwUGFja2V0KTsKKworCitVSU5UIEJBX1Jlb3JkZXJfQU1TRFVfQW5ubm91bmNlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBORElTX1BBQ0tFVAlwUGFja2V0KTsKKworCitVSU5UIEhhbmRsZV9BTVNEVV9QYWNrZXQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJcERhdGEsCisJSU4JVUxPTkcJCQlEYXRhU2l6ZSwKKwlJTiAgVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCk7CisKKwordm9pZCBjb252ZXJ0XzgwMl8xMV90b184MDJfM19wYWNrZXQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUE5ESVNfUEFDS0VUCXBQYWNrZXQsCisJSU4JUFVDSEFSCQkJcDgwMjNoZHIsCisJSU4JUFVDSEFSCQkJcERhdGEsCisJSU4JVUxPTkcJCQlEYXRhU2l6ZSwKKwlJTiAgVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCk7CisKKworUE5FVF9ERVYgZ2V0X25ldGRldl9mcm9tX2Jzc2lkKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpOworCisKK1BORElTX1BBQ0tFVCBkdXBsaWNhdGVfcGt0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCXBIZWFkZXI4MDJfMywKKyAgICBJTiAgVUlOVCAgICAgICAgICAgIEhkckxlbiwKKwlJTglQVUNIQVIJCQlwRGF0YSwKKwlJTglVTE9ORwkJCURhdGFTaXplLAorCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpOworCisKK1BORElTX1BBQ0tFVCBkdXBsaWNhdGVfcGt0X3dpdGhfVEtJUF9NSUMoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUE5ESVNfUEFDS0VUCXBPbGRQa3QpOworCitQTkRJU19QQUNLRVQgZHVwbGljYXRlX3BrdF93aXRoX1ZMQU4oCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJcEhlYWRlcjgwMl8zLAorICAgIElOICBVSU5UICAgICAgICAgICAgSGRyTGVuLAorCUlOCVBVQ0hBUgkJCXBEYXRhLAorCUlOCVVMT05HCQkJRGF0YVNpemUsCisJSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCk7CisKK1BORElTX1BBQ0tFVCBkdXBsaWNhdGVfcGt0X3dpdGhfV1BJKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBORElTX1BBQ0tFVAlwUGFja2V0LAorCUlOCVVJTlQzMgkJCWV4dF9oZWFkX2xlbiwKKwlJTglVSU5UMzIJCQlleHRfdGFpbF9sZW4pOworCitVQ0hBUiBWTEFOXzgwMjNfSGVhZGVyX0NvcHkoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJcEhlYWRlcjgwMl8zLAorCUlOCVVJTlQgICAgICAgICAgICBIZHJMZW4sCisJT1VUIFBVQ0hBUgkJCXBEYXRhLAorCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCit2b2lkIGJhX2ZsdXNoX3Jlb3JkZXJpbmdfdGltZW91dF9tcGR1cygKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiBQQkFfUkVDX0VOVFJZCXBCQUVudHJ5LAorCUlOIFVMT05HCQkJTm93MzIpOworCisKK1ZPSUQgQkFPcmlTZXNzaW9uU2V0VXAoCisJCQlJTiBQUlRNUF9BREFQVEVSICAgIHBBZCwKKwkJCUlOIE1BQ19UQUJMRV9FTlRSWQkqcEVudHJ5LAorCQkJSU4gVUNIQVIJCQlUSUQsCisJCQlJTiBVU0hPUlQJCQlUaW1lT3V0LAorCQkJSU4gVUxPTkcJCQlEZWxheVRpbWUsCisJCQlJTiBCT09MRUFOCQlpc0ZvcmNlZCk7CisKK1ZPSUQgQkFTZXNzaW9uVGVhckRvd25BTEwoCisJSU4gT1VUCVBSVE1QX0FEQVBURVIgcEFkLAorCUlOCQlVQ0hBUiBXY2lkKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworQk9PTEVBTiBPU19OZWVkX0Nsb25lX1BhY2tldCh2b2lkKTsKKworCitWT0lEIGJ1aWxkX3R4X3BhY2tldCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQTkRJU19QQUNLRVQJcFBhY2tldCwKKwlJTglQVUNIQVIJcEZyYW1lLAorCUlOCVVMT05HCUZyYW1lTGVuKTsKKworCitWT0lEIEJBT3JpU2Vzc2lvblRlYXJEb3duKAorCUlOIE9VVAlQUlRNUF9BREFQVEVSCXBBZCwKKwlJTgkJVUNIQVIJCQlXY2lkLAorCUlOCQlVQ0hBUgkJCVRJRCwKKwlJTgkJQk9PTEVBTgkJCWJQYXNzaXZlLAorCUlOCQlCT09MRUFOCQkJYkZvcmNlU2VuZCk7CisKK1ZPSUQgQkFSZWNTZXNzaW9uVGVhckRvd24oCisJSU4gT1VUCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCQlVQ0hBUgkJCVdjaWQsCisJSU4JCVVDSEFSCQkJVElELAorCUlOCQlCT09MRUFOCQkJYlBhc3NpdmUpOworCitCT09MRUFOIGJhX3Jlb3JkZXJpbmdfcmVzb3VyY2VfaW5pdChQUlRNUF9BREFQVEVSIHBBZCwgaW50IG51bSk7Cit2b2lkIGJhX3Jlb3JkZXJpbmdfcmVzb3VyY2VfcmVsZWFzZShQUlRNUF9BREFQVEVSIHBBZCk7CisKK1VMT05HIEF1dG9DaEJzc0luc2VydEVudHJ5KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFBVQ0hBUiBwQnNzaWQsCisJSU4gQ0hBUiBTc2lkW10sCisJSU4gVUNIQVIgU3NpZExlbiwKKwlJTiBVQ0hBUiBDaGFubmVsTm8sCisJSU4gQ0hBUiBSc3NpKTsKKwordm9pZCBBdXRvQ2hCc3NUYWJsZUluaXQoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpOworCit2b2lkIENoYW5uZWxJbmZvSW5pdCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK3ZvaWQgQXV0b0NoQnNzVGFibGVEZXN0cm95KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKwordm9pZCBDaGFubmVsSW5mb0Rlc3Ryb3koCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpOworCitVQ0hBUiBOZXdfQXBBdXRvU2VsZWN0Q2hhbm5lbCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK0JPT0xFQU4gcnRzdHJtYWN0b2hleCgKKwlJTiBjaGFyICpzMSwKKwlJTiBjaGFyICpzMik7CisKK0JPT0xFQU4gcnRzdHJjYXNlY21wKAorCUlOIGNoYXIgKnMxLAorCUlOIGNoYXIgKnMyKTsKKworY2hhciAqcnRzdHJzdHJ1bmNhc2VjbXAoCisJSU4gY2hhciAqczEsCisJSU4gY2hhciAqczIpOworCitjaGFyICAgICpydHN0cnN0cigKKwlJTgljb25zdCBjaGFyICogczEsCisJSU4JY29uc3QgY2hhciAqIHMyKTsKKworY2hhciAqcnN0cnRvaygKKwlJTiBjaGFyICogcywKKwlJTiBjb25zdCBjaGFyICogY3QpOworCitpbnQgcnRpbmV0X2F0b24oCisJY29uc3QgY2hhciAqY3AsCisJdW5zaWduZWQgaW50ICphZGRyKTsKKworLy8vLy8vLy8vLyBjb21tb24gaW9jdGwgZnVuY3Rpb25zIC8vLy8vLy8vLy8KK0lOVCBTZXRfRHJpdmVyVmVyc2lvbl9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVCBTZXRfQ291bnRyeVJlZ2lvbl9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVCBTZXRfQ291bnRyeVJlZ2lvbkFCYW5kX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UIFNldF9XaXJlbGVzc01vZGVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQgU2V0X0NoYW5uZWxfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQJU2V0X1Nob3J0U2xvdF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVAlTZXRfVHhQb3dlcl9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVCBTZXRfQkdQcm90ZWN0aW9uX1Byb2MoCisJSU4gIFBSVE1QX0FEQVBURVIJCXBBZCwKKwlJTiAgUFVDSEFSCQkJYXJnKTsKKworSU5UIFNldF9UeFByZWFtYmxlX1Byb2MoCisJSU4gIFBSVE1QX0FEQVBURVIJCXBBZCwKKwlJTiAgUFVDSEFSCQkJYXJnKTsKKworSU5UIFNldF9SVFNUaHJlc2hvbGRfUHJvYygKKwlJTiAgUFJUTVBfQURBUFRFUgkJcEFkLAorCUlOICBQVUNIQVIJCQlhcmcpOworCitJTlQgU2V0X0ZyYWdUaHJlc2hvbGRfUHJvYygKKwlJTiAgUFJUTVBfQURBUFRFUgkJcEFkLAorCUlOICBQVUNIQVIJCQlhcmcpOworCitJTlQgU2V0X1R4QnVyc3RfUHJvYygKKwlJTiAgUFJUTVBfQURBUFRFUgkJcEFkLAorCUlOICBQVUNIQVIJCQlhcmcpOworCisjaWZkZWYgQUdHUkVHQVRJT05fU1VQUE9SVAorSU5UCVNldF9Qa3RBZ2dyZWdhdGVfUHJvYygKKwlJTiAgUFJUTVBfQURBUFRFUgkJcEFkLAorCUlOICBQVUNIQVIJCQlhcmcpOworI2VuZGlmCisKK0lOVAlTZXRfSUVFRTgwMjExSF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKKyNpZmRlZiBEQkcKK0lOVAlTZXRfRGVidWdfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworI2VuZGlmCisKK0lOVAlTaG93X0Rlc2NJbmZvX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UCVNldF9SZXNldFN0YXRDb3VudGVyX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorSU5UCVNldF9CQVNldHVwX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UCVNldF9CQURlY2xpbmVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQJU2V0X0JBT3JpVGVhckRvd25fUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQJU2V0X0JBUmVjVGVhckRvd25fUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQJU2V0X0h0QndfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQJU2V0X0h0TWNzX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UCVNldF9IdEdpX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UCVNldF9IdE9wTW9kZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVAlTZXRfSHRTdGJjX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UCVNldF9IdEh0Y19Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVAlTZXRfSHRFeHRjaGFfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQJU2V0X0h0TXBkdURlbnNpdHlfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQJU2V0X0h0QmFXaW5TaXplX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UCVNldF9IdFJkZ19Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVAlTZXRfSHRMaW5rQWRhcHRfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQJU2V0X0h0QW1zZHVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQJU2V0X0h0QXV0b0JhX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UCVNldF9IdFByb3RlY3RfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQJU2V0X0h0TWltb1BzX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworCitJTlQJU2V0X0ZvcmNlU2hvcnRHSV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVAlTZXRfRm9yY2VHRl9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVAlTZXRDb21tb25IVCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCk7CisKK0lOVAlTZXRfU2VuZFBTTVBBY3Rpb25fUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQJU2V0X0h0TUlNT1BTbW9kZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKKworSU5UCVNldF9IdFR4QkFTaXplX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKy8vRGxzICwJa2F0aHkKK1ZPSUQgUlRNUFNlbmRETFNUZWFyRG93bkZyYW1lKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCXBEQSk7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKy8vQmxvY2sgQUNLCitWT0lEIFF1ZXJ5QkFUQUJMRSgKKwlJTiAgUFJUTVBfQURBUFRFUiBwQWQsCisJT1VUIFBRVUVSWUJBX1RBQkxFIHBCQVQpOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorSU5UCSAgICBXcGFDaGVja0VhcENvZGUoCisJSU4gIFBSVE1QX0FEQVBURVIgICAJcEFkLAorCUlOICBQVUNIQVIJCQkJcEZyYW1lLAorCUlOICBVU0hPUlQJCQkJRnJhbWVMZW4sCisJSU4gIFVTSE9SVAkJCQlPZmZTZXQpOworCitWT0lEICAgIFdwYVNlbmRNaWNGYWlsdXJlVG9XcGFTdXBwbGljYW50KAorICAgIElOICBQUlRNUF9BREFQVEVSICAgICAgIHBBZCwKKyAgICBJTiAgQk9PTEVBTiAgICAgICAgICAgICBiVW5pY2FzdCk7CisKK1ZPSUQgICAgU2VuZEFzc29jSUVzVG9XcGFTdXBwbGljYW50KAorICAgIElOICBQUlRNUF9BREFQVEVSICAgICAgIHBBZCk7CisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCisjaWZkZWYgTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQKK2ludCB3ZXh0X25vdGlmeV9ldmVudF9hc3NvYygKKwlJTiAgUlRNUF9BREFQVEVSICpwQWQpOworI2VuZGlmIC8vIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKK1ZPSUQgSGFuZGxlX0JTU19XaWR0aF9UcmlnZ2VyX0V2ZW50cygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK3ZvaWQgYnVpbGRfZXh0X2NoYW5uZWxfc3dpdGNoX2llKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIEhUX0VYVF9DSEFOTkVMX1NXSVRDSF9BTk5PVU5DRU1FTlRfSUUgKnBJRSk7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKworQk9PTEVBTiBBUFJ4RG9uZUludGVycnVwdEhhbmRsZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCk7CisKK0JPT0xFQU4gU1RBUnhEb25lSW50ZXJydXB0SGFuZGxlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCUJPT0xFQU4JCQlhcmdjKTsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorLy8gQU1QRFUgcGFja2V0IGluZGljYXRpb24KK1ZPSUQgSW5kaWNhdGVfQU1QRFVfUGFja2V0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVJYX0JMSwkJCSpwUnhCbGssCisJSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCk7CisKKy8vIEFNU0RVIHBhY2tldCBpbmRpY2F0aW9uCitWT0lEIEluZGljYXRlX0FNU0RVX1BhY2tldCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglSWF9CTEsJCQkqcFJ4QmxrLAorCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisvLyBOb3JtYWwgbGVnYWN5IFJ4IHBhY2tldCBpbmRpY2F0aW9uCitWT0lEIEluZGljYXRlX0xlZ2FjeV9QYWNrZXQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUlhfQkxLCQkJKnBSeEJsaywKKwlJTglVQ0hBUgkJCUZyb21XaGljaEJTU0lEKTsKKworVk9JRCBJbmRpY2F0ZV9FQVBPTF9QYWNrZXQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUlhfQkxLCQkJKnBSeEJsaywKKwlJTglVQ0hBUgkJCUZyb21XaGljaEJTU0lEKTsKKwordm9pZCAgdXBkYXRlX29zX3BhY2tldF9pbmZvKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVJYX0JMSwkJCSpwUnhCbGssCisJSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCk7CisKK3ZvaWQgd2xhbl84MDJfMTFfdG9fODAyXzNfcGFja2V0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVJYX0JMSwkJCSpwUnhCbGssCisJSU4JUFVDSEFSCQkJcEhlYWRlcjgwMl8zLAorCUlOICBVQ0hBUgkJCUZyb21XaGljaEJTU0lEKTsKKworVUlOVCBkZWFnZ3JlZ2F0ZV9BTVNEVV9hbm5vdW5jZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlQTkRJU19QQUNLRVQJCXBQYWNrZXQsCisJSU4JUFVDSEFSCQkJcERhdGEsCisJSU4JVUxPTkcJCQlEYXRhU2l6ZSk7CisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorLy8gcmVtb3ZlIExMQyBhbmQgZ2V0IDgwMl8zIEhlYWRlcgorI2RlZmluZSAgUlRNUF84MDJfMTFfUkVNT1ZFX0xMQ19BTkRfQ09OVkVSVF9UT184MDJfMyhfcFJ4QmxrLCBfcEhlYWRlcjgwMl8zKQlcCit7CQkJCQkJCQkJCQkJCQkJCQkJCQlcCisJUFVDSEFSIF9wUmVtb3ZlZExMQ1NOQVAgPSBOVUxMLCBfcERBLCBfcFNBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJCQkJCQkJCQkJCQkJCQkJCQkJXAorCWlmIChSWF9CTEtfVEVTVF9GTEFHKF9wUnhCbGssIGZSWF9NRVNIKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJX3BEQSA9IF9wUnhCbGstPnBIZWFkZXItPkFkZHIzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQlfcFNBID0gKFBVQ0hBUilfcFJ4QmxrLT5wSGVhZGVyICsgc2l6ZW9mKEhFQURFUl84MDJfMTEpOyAgICAgICAgICAgICAgICBcCisJfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwllbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCWlmIChSWF9CTEtfVEVTVF9GTEFHKF9wUnhCbGssIGZSWF9JTkZSQSkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCVwKKwkJeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJX3BEQSA9IF9wUnhCbGstPnBIZWFkZXItPkFkZHIxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCWlmIChSWF9CTEtfVEVTVF9GTEFHKF9wUnhCbGssIGZSWF9ETFMpKQkJCQkJCQkJCVwKKwkJCV9wU0EgPSBfcFJ4QmxrLT5wSGVhZGVyLT5BZGRyMjsJCQkJCQkJCQkJXAorCQllbHNlCQkJCQkJCQkJCQkJCQkJCQlcCisJCQlfcFNBID0gX3BSeEJsay0+cEhlYWRlci0+QWRkcjM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQllbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJCV9wREEgPSBfcFJ4QmxrLT5wSGVhZGVyLT5BZGRyMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJX3BTQSA9IF9wUnhCbGstPnBIZWFkZXItPkFkZHIyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJCQkJCQkJCQkJCQkJCQkJCQlcCisJQ09OVkVSVF9UT184MDJfMyhfcEhlYWRlcjgwMl8zLCBfcERBLCBfcFNBLCBfcFJ4QmxrLT5wRGF0YSwgCQkJCVwKKwkJX3BSeEJsay0+RGF0YVNpemUsIF9wUmVtb3ZlZExMQ1NOQVApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisKK0JPT0xFQU4gQVBGb3dhcmRXaXJlbGVzc1N0YVRvV2lyZWxlc3NTdGEoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUE5ESVNfUEFDS0VUCXBQYWNrZXQsCisJSU4JVUxPTkcJCQlGcm9tV2hpY2hCU1NJRCk7CisKK1ZPSUQgQW5ub3VuY2Vfb3JfRm9yd2FyZF84MDJfM19QYWNrZXQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUE5ESVNfUEFDS0VUCXBQYWNrZXQsCisJSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCk7CisKK1ZPSUQgU3RhX0Fubm91bmNlX29yX0ZvcndhcmRfODAyXzNfUGFja2V0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBORElTX1BBQ0tFVAlwUGFja2V0LAorCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpOworCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKyNkZWZpbmUgQU5OT1VOQ0VfT1JfRk9SV0FSRF84MDJfM19QQUNLRVQoX3BBZCwgX3BQYWNrZXQsIF9Gcm9tV2hpY2hCU1MpXAorCQkJU3RhX0Fubm91bmNlX29yX0ZvcndhcmRfODAyXzNfUGFja2V0KF9wQWQsIF9wUGFja2V0LCBfRnJvbVdoaWNoQlNTKTsKKwkJCS8vYW5ub3VuY2VfODAyXzNfcGFja2V0KF9wQWQsIF9wUGFja2V0KTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCitQTkRJU19QQUNLRVQgRHVwbGljYXRlUGFja2V0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBORElTX1BBQ0tFVAlwUGFja2V0LAorCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpOworCisKK1BORElTX1BBQ0tFVCBDbG9uZVBhY2tldCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQTkRJU19QQUNLRVQJcFBhY2tldCwKKwlJTglQVUNIQVIJCQlwRGF0YSwKKwlJTglVTE9ORwkJCURhdGFTaXplKTsKKworCisvLyBOb3JtYWwsIEFNUERVIG9yIEFNU0RVCitWT0lEIENtbVJ4bm9uUmFsaW5rRnJhbWVJbmRpY2F0ZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglSWF9CTEsJCQkqcFJ4QmxrLAorCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpOworCitWT0lEIENtbVJ4UmFsaW5rRnJhbWVJbmRpY2F0ZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglNQUNfVEFCTEVfRU5UUlkJKnBFbnRyeSwKKwlJTglSWF9CTEsJCQkqcFJ4QmxrLAorCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpOworCitWT0lEIFVwZGF0ZV9Sc3NpX1NhbXBsZSgKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiBSU1NJX1NBTVBMRQkJKnBSc3NpLAorCUlOIFBSWFdJX1NUUlVDCQlwUnhXSSk7CisKK1BORElTX1BBQ0tFVCBHZXRQYWNrZXRGcm9tUnhSaW5nKAorCUlOCQlQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJCVBSVDI4WFhfUlhEX1NUUlVDCQlwU2F2ZVJ4RCwKKwlPVVQJCUJPT0xFQU4JCQkqcGJSZXNjaGVkdWxlLAorCUlOIE9VVAlVSU5UMzIJCQkqcFJ4UGVuZGluZyk7CisKK1BORElTX1BBQ0tFVCBSVE1QRGVGcmFnbWVudERhdGFGcmFtZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglSWF9CTEsJCQkqcFJ4QmxrKTsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisKKworCisKKyNpZmRlZiBTTk1QX1NVUFBPUlQKKy8vZm9yIHNubXAgLCBrYXRoeQordHlwZWRlZiBzdHJ1Y3QgX0RlZmF1bHRLZXlJZHhWYWx1ZQoreworCVVDSEFSCUtleUlkeDsKKwlVQ0hBUglWYWx1ZVsxNl07Cit9IERlZmF1bHRLZXlJZHhWYWx1ZSwgKlBEZWZhdWx0S2V5SWR4VmFsdWU7CisjZW5kaWYKKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCitlbnVtIHsKKwlESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtCQk9IDB4MDAwMDAwNDQsCisJRElEbXNnX2xueGluZF93bGFuc25pZmZybV9ob3N0dGltZQk9IDB4MDAwMTAwNDQsCisJRElEbXNnX2xueGluZF93bGFuc25pZmZybV9tYWN0aW1lCT0gMHgwMDAyMDA0NCwKKwlESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX2NoYW5uZWwJPSAweDAwMDMwMDQ0LAorCURJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm1fcnNzaQkJPSAweDAwMDQwMDQ0LAorCURJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm1fc3EJCT0gMHgwMDA1MDA0NCwKKwlESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX3NpZ25hbAk9IDB4MDAwNjAwNDQsCisJRElEbXNnX2xueGluZF93bGFuc25pZmZybV9ub2lzZQkJPSAweDAwMDcwMDQ0LAorCURJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm1fcmF0ZQkJPSAweDAwMDgwMDQ0LAorCURJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm1faXN0eAkJPSAweDAwMDkwMDQ0LAorCURJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm1fZnJtbGVuCT0gMHgwMDBBMDA0NAorfTsKK2VudW0geworCVA4MDIxMUVOVU1fbXNnaXRlbV9zdGF0dXNfbm9fdmFsdWUJPSAweDAwCit9OworZW51bSB7CisJUDgwMjExRU5VTV90cnV0aF9mYWxzZQkJCT0gMHgwMCwKKwlQODAyMTFFTlVNX3RydXRoX3RydWUJCQk9IDB4MDEKK307CisKKy8qIERlZmluaXRpb24gZnJvbSBtYWR3aWZpICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgICAgIFVJTlQzMiBkaWQ7CisgICAgICAgIFVJTlQxNiBzdGF0dXM7CisgICAgICAgIFVJTlQxNiBsZW47CisgICAgICAgIFVJTlQzMiBkYXRhOworfSBwODAyMTFpdGVtX3VpbnQzMl90OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgICAgIFVJTlQzMiBtc2djb2RlOworICAgICAgICBVSU5UMzIgbXNnbGVuOworI2RlZmluZSBXTEFOX0RFVk5BTUVMRU5fTUFYIDE2CisgICAgICAgIFVJTlQ4IGRldm5hbWVbV0xBTl9ERVZOQU1FTEVOX01BWF07CisgICAgICAgIHA4MDIxMWl0ZW1fdWludDMyX3QgaG9zdHRpbWU7CisgICAgICAgIHA4MDIxMWl0ZW1fdWludDMyX3QgbWFjdGltZTsKKyAgICAgICAgcDgwMjExaXRlbV91aW50MzJfdCBjaGFubmVsOworICAgICAgICBwODAyMTFpdGVtX3VpbnQzMl90IHJzc2k7CisgICAgICAgIHA4MDIxMWl0ZW1fdWludDMyX3Qgc3E7CisgICAgICAgIHA4MDIxMWl0ZW1fdWludDMyX3Qgc2lnbmFsOworICAgICAgICBwODAyMTFpdGVtX3VpbnQzMl90IG5vaXNlOworICAgICAgICBwODAyMTFpdGVtX3VpbnQzMl90IHJhdGU7CisgICAgICAgIHA4MDIxMWl0ZW1fdWludDMyX3QgaXN0eDsKKyAgICAgICAgcDgwMjExaXRlbV91aW50MzJfdCBmcm1sZW47Cit9IHdsYW5fbmdfcHJpc20yX2hlYWRlcjsKKworLyogVGhlIHJhZGlvIGNhcHR1cmUgaGVhZGVyIHByZWNlZGVzIHRoZSA4MDIuMTEgaGVhZGVyLiAqLwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9pZWVlODAyMTFfcmFkaW90YXBfaGVhZGVyIHsKKyAgICBVSU5UOAlpdF92ZXJzaW9uOwkvKiBWZXJzaW9uIDAuIE9ubHkgaW5jcmVhc2VzCisJCQkJICogZm9yIGRyYXN0aWMgY2hhbmdlcywKKwkJCQkgKiBpbnRyb2R1Y3Rpb24gb2YgY29tcGF0aWJsZQorCQkJCSAqIG5ldyBmaWVsZHMgZG9lcyBub3QgY291bnQuCisJCQkJICovCisgICAgVUlOVDgJaXRfcGFkOworICAgIFVJTlQxNiAgICAgaXRfbGVuOyAgICAgICAgIC8qIGxlbmd0aCBvZiB0aGUgd2hvbGUKKwkJCQkgKiBoZWFkZXIgaW4gYnl0ZXMsIGluY2x1ZGluZworCQkJCSAqIGl0X3ZlcnNpb24sIGl0X3BhZCwKKwkJCQkgKiBpdF9sZW4sIGFuZCBkYXRhIGZpZWxkcy4KKwkJCQkgKi8KKyAgICBVSU5UMzIgICBpdF9wcmVzZW50OwkvKiBBIGJpdG1hcCB0ZWxsaW5nIHdoaWNoCisJCQkJCSAqIGZpZWxkcyBhcmUgcHJlc2VudC4gU2V0IGJpdCAzMQorCQkJCQkgKiAoMHg4MDAwMDAwMCkgdG8gZXh0ZW5kIHRoZQorCQkJCQkgKiBiaXRtYXAgYnkgYW5vdGhlciAzMiBiaXRzLgorCQkJCQkgKiBBZGRpdGlvbmFsIGV4dGVuc2lvbnMgYXJlIG1hZGUKKwkJCQkJICogYnkgc2V0dGluZyBiaXQgMzEuCisJCQkJCSAqLworfWllZWU4MDIxMV9yYWRpb3RhcF9oZWFkZXIgOworCitlbnVtIGllZWU4MDIxMV9yYWRpb3RhcF90eXBlIHsKKyAgICBJRUVFODAyMTFfUkFESU9UQVBfVFNGVCA9IDAsCisgICAgSUVFRTgwMjExX1JBRElPVEFQX0ZMQUdTID0gMSwKKyAgICBJRUVFODAyMTFfUkFESU9UQVBfUkFURSA9IDIsCisgICAgSUVFRTgwMjExX1JBRElPVEFQX0NIQU5ORUwgPSAzLAorICAgIElFRUU4MDIxMV9SQURJT1RBUF9GSFNTID0gNCwKKyAgICBJRUVFODAyMTFfUkFESU9UQVBfREJNX0FOVFNJR05BTCA9IDUsCisgICAgSUVFRTgwMjExX1JBRElPVEFQX0RCTV9BTlROT0lTRSA9IDYsCisgICAgSUVFRTgwMjExX1JBRElPVEFQX0xPQ0tfUVVBTElUWSA9IDcsCisgICAgSUVFRTgwMjExX1JBRElPVEFQX1RYX0FUVEVOVUFUSU9OID0gOCwKKyAgICBJRUVFODAyMTFfUkFESU9UQVBfREJfVFhfQVRURU5VQVRJT04gPSA5LAorICAgIElFRUU4MDIxMV9SQURJT1RBUF9EQk1fVFhfUE9XRVIgPSAxMCwKKyAgICBJRUVFODAyMTFfUkFESU9UQVBfQU5URU5OQSA9IDExLAorICAgIElFRUU4MDIxMV9SQURJT1RBUF9EQl9BTlRTSUdOQUwgPSAxMiwKKyAgICBJRUVFODAyMTFfUkFESU9UQVBfREJfQU5UTk9JU0UgPSAxMworfTsKKworI2RlZmluZSBXTEFOX1JBRElPVEFQX1BSRVNFTlQgKAkJCVwKKwkoMSA8PCBJRUVFODAyMTFfUkFESU9UQVBfVFNGVCkJfAlcCisJKDEgPDwgSUVFRTgwMjExX1JBRElPVEFQX0ZMQUdTKSB8CVwKKwkoMSA8PCBJRUVFODAyMTFfUkFESU9UQVBfUkFURSkgIHwgCVwKKwkgMCkKKwordHlwZWRlZiBzdHJ1Y3QgX3dsYW5fcmFkaW90YXBfaGVhZGVyIHsKKwlpZWVlODAyMTFfcmFkaW90YXBfaGVhZGVyIHd0X2loZHI7CisJSU5UNjQgd3RfdHNmdDsKKwlVSU5UOCB3dF9mbGFnczsKKwlVSU5UOCB3dF9yYXRlOworfSB3bGFuX3JhZGlvdGFwX2hlYWRlcjsKKy8qIERlZmluaXRpb24gZnJvbSBtYWR3aWZpICovCisKK3ZvaWQgc2VuZF9tb25pdG9yX3BhY2tldHMoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUlhfQkxLCQkJKnBSeEJsayk7CisKKyNpZiBXSVJFTEVTU19FWFQgPj0gMTIKKy8vIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgd2hlbiBxdWVyeSAvcHJvYworc3RydWN0IGl3X3N0YXRpc3RpY3MgKnJ0Mjh4eF9nZXRfd2lyZWxlc3Nfc3RhdHMoCisgICAgSU4gc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpOworI2VuZGlmCisKK1ZPSUQgICAgUlRNUFNldERlc2lyZWRSYXRlcygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBMT05HICAgICAgICAgICAgUmF0ZXMpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCitJTlQJU2V0X0ZpeGVkVHhNb2RlX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworI2lmZGVmIENPTkZJR19BUFNUQV9NSVhFRF9TVVBQT1JUCitJTlQJU2V0X09wTW9kZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisjZW5kaWYgLy8gQ09ORklHX0FQU1RBX01JWEVEX1NVUFBPUlQgLy8KKworc3RhdGljIGlubGluZSBjaGFyKiBHZXRQaHlNb2RlKAorCWludCBNb2RlKQoreworCXN3aXRjaChNb2RlKQorCXsKKwkJY2FzZSBNT0RFX0NDSzoKKwkJCXJldHVybiAiQ0NLIjsKKworCQljYXNlIE1PREVfT0ZETToKKwkJCXJldHVybiAiT0ZETSI7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCWNhc2UgTU9ERV9IVE1JWDoKKwkJCXJldHVybiAiSFRNSVgiOworCisJCWNhc2UgTU9ERV9IVEdSRUVORklFTEQ6CisJCQlyZXR1cm4gIkdSRUVOIjsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJZGVmYXVsdDoKKwkJCXJldHVybiAiTi9BIjsKKwl9Cit9CisKKworc3RhdGljIGlubGluZSBjaGFyKiBHZXRCVygKKwlpbnQgQlcpCit7CisJc3dpdGNoKEJXKQorCXsKKwkJY2FzZSBCV18xMDoKKwkJCXJldHVybiAiMTBNIjsKKworCQljYXNlIEJXXzIwOgorCQkJcmV0dXJuICIyME0iOworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQljYXNlIEJXXzQwOgorCQkJcmV0dXJuICI0ME0iOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQlkZWZhdWx0OgorCQkJcmV0dXJuICJOL0EiOworCX0KK30KKworCitWT0lEIFJUMjh4eFRocmVhZFRlcm1pbmF0ZSgKKwlJTiBSVE1QX0FEQVBURVIgKnBBZCk7CisKK0JPT0xFQU4gUlQyOFhYQ2hpcHNldENoZWNrKAorCUlOIHZvaWQgKl9kZXZfcCk7CisKK0JPT0xFQU4gUlQyOFhYTmV0RGV2SW5pdCgKKwlJTiB2b2lkIAkJCQkqX2Rldl9wLAorCUlOIHN0cnVjdCAgbmV0X2RldmljZQkqbmV0X2RldiwKKwlJTiBSVE1QX0FEQVBURVIgCQkqcEFkKTsKKworQk9PTEVBTiBSVDI4WFhQcm9iZVBvc3RDb25maWcoCisJSU4gdm9pZCAJCQkJKl9kZXZfcCwKKwlJTiBSVE1QX0FEQVBURVIgCQkqcEFkLAorCUlOIElOVDMyCQkJCWFyZ2MpOworCitWT0lEIFJUMjhYWERNQURpc2FibGUoCisJSU4gUlRNUF9BREFQVEVSIAkJKnBBZCk7CisKK1ZPSUQgUlQyOFhYRE1BRW5hYmxlKAorCUlOIFJUTVBfQURBUFRFUiAJCSpwQWQpOworCitWT0lEIFJUMjh4eF9VcGRhdGVCZWFjb25Ub0FzaWMoCisJSU4gUlRNUF9BREFQVEVSICogcEFkLAorCUlOIElOVCBhcGlkeCwKKwlJTiBVTE9ORyBCZWFjb25MZW4sCisJSU4gVUxPTkcgVXBkYXRlUG9zKTsKKworSU5UIHJ0Mjh4eF9pb2N0bCgKKwlJTglzdHJ1Y3QgbmV0X2RldmljZQkqbmV0X2RldiwKKwlJTglPVVQJc3RydWN0IGlmcmVxCSpycSwKKwlJTglJTlQJCQljbWQpOworCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKK0lOVCBydDI4eHhfc3RhX2lvY3RsKAorCUlOCXN0cnVjdCBuZXRfZGV2aWNlCSpuZXRfZGV2LAorCUlOCU9VVAlzdHJ1Y3QgaWZyZXEJKnJxLAorCUlOCUlOVAkJCWNtZCk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKK0JPT0xFQU4gUlQyOFhYU2VjdXJpdHlLZXlBZGQoCisJSU4JCVBSVE1QX0FEQVBURVIJCXBBZCwKKwlJTgkJVUxPTkcJCQkJYXBpZHgsCisJSU4JCVVMT05HCQkJCUtleUlkeCwKKwlJTgkJTUFDX1RBQkxFX0VOVFJZIAkqcEVudHJ5KTsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworUE5ESVNfUEFDS0VUIEdldFBhY2tldEZyb21SeFJpbmcoCisJSU4JCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAkJUFJUMjhYWF9SWERfU1RSVUMJcFNhdmVSeEQsCisJT1VUCQlCT09MRUFOCQkJKnBiUmVzY2hlZHVsZSwKKwlJTiBPVVQJVUlOVDMyCQkJKnBSeFBlbmRpbmcpOworCisKK3ZvaWQga2lsbF90aHJlYWRfdGFzayhQUlRNUF9BREFQVEVSIHBBZCk7CisKK3ZvaWQgdGJ0dF90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSk7CisKKyNpZmRlZiBSVDI4NjAKKy8vCisvLyBGdW5jdGlvbiBQcm90b3R5cGUgaW4gY21tX2RhdGFfMjg2MC5jCisvLworVVNIT1JUIFJ0bXBQQ0lfV3JpdGVUeFJlc291cmNlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVRYX0JMSwkJCSpwVHhCbGssCisJSU4JQk9PTEVBTgkJCWJJc0xhc3QsCisJT1VUCVVTSE9SVAkJCSpGcmVlTnVtYmVyKTsKKworVVNIT1JUIFJ0bXBQQ0lfV3JpdGVTaW5nbGVUeFJlc291cmNlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVRYX0JMSwkJCSpwVHhCbGssCisJSU4JQk9PTEVBTgkJCWJJc0xhc3QsCisJT1VUCVVTSE9SVAkJCSpGcmVlTnVtYmVyKTsKKworVVNIT1JUIFJ0bXBQQ0lfV3JpdGVNdWx0aVR4UmVzb3VyY2UoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVFhfQkxLCQkJKnBUeEJsaywKKwlJTglVQ0hBUgkJCWZyYW1lTnVtLAorCU9VVAlVU0hPUlQJCQkqRnJlZU51bWJlcik7CisKK1VTSE9SVAlSdG1wUENJX1dyaXRlRnJhZ1R4UmVzb3VyY2UoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVFhfQkxLCQkJKnBUeEJsaywKKwlJTglVQ0hBUgkJCWZyYWdOdW0sCisJT1VUCVVTSE9SVAkJCSpGcmVlTnVtYmVyKTsKKworVVNIT1JUIFJ0bXBQQ0lfV3JpdGVTdWJUeFJlc291cmNlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVRYX0JMSwkJCSpwVHhCbGssCisJSU4JQk9PTEVBTgkJCWJJc0xhc3QsCisJT1VUCVVTSE9SVAkJCSpGcmVlTnVtYmVyKTsKKworVk9JRCBSdG1wUENJX0ZpbmFsV3JpdGVUeFJlc291cmNlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVRYX0JMSwkJCSpwVHhCbGssCisJSU4JVVNIT1JUCQkJdG90YWxNUERVU2l6ZSwKKwlJTglVU0hPUlQJCQlGaXJzdFR4SWR4KTsKKworVk9JRCBSdG1wUENJRGF0YUxhc3RUeElkeCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVQ0hBUgkJCVF1ZUlkeCwKKwlJTglVU0hPUlQJCQlMYXN0VHhJZHgpOworCitWT0lEIFJ0bXBQQ0lEYXRhS2lja091dCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglUWF9CTEsJCQkqcFR4QmxrLAorCUlOCVVDSEFSCQkJUXVlSWR4KTsKKworCitpbnQgUnRtcFBDSU1nbXRLaWNrT3V0KAorCUlOIFJUTVBfQURBUFRFUiAJKnBBZCwKKwlJTiBVQ0hBUiAJCQlRdWVJZHgsCisJSU4gUE5ESVNfUEFDS0VUCQlwUGFja2V0LAorCUlOIFBVQ0hBUgkJCXBTcmNCdWZWQSwKKwlJTiBVSU5UIAkJCVNyY0J1Zkxlbik7CisKKworTkRJU19TVEFUVVMgUlRNUENoZWNrUnhFcnJvcigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgUEhFQURFUl84MDJfMTEgIHBIZWFkZXIsCisJSU4JUFJYV0lfU1RSVUMJcFJ4V0ksCisJSU4gIFBSVDI4WFhfUlhEX1NUUlVDICAgICAgcFJ4RCk7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKK1ZPSUQgUlRNUEluaXRQQ0llTGlua0N0cmxWYWx1ZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCk7CisKK1ZPSUQgUlRNUEZpbmRIb3N0UENJRGV2KAorICAgIElOCVBSVE1QX0FEQVBURVIJcEFkKTsKKworVk9JRCBSVE1QUENJZUxpbmtDdHJsVmFsdWVSZXN0b3JlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOICAgVUNIQVIJCUxldmVsKTsKKworVk9JRCBSVE1QUENJZUxpbmtDdHJsU2V0dGluZygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiAJVVNIT1JUCQlNYXgpOworCitWT0lEIFJUMjh4eFBjaUFzaWNSYWRpb09mZigKKwlJTiBQUlRNUF9BREFQVEVSICAgIHBBZCwKKwlJTiBVQ0hBUiAgICAgICAgICAgIExldmVsLAorCUlOIFVTSE9SVCAgICAgICAgICAgVGJ0dE51bVRvTmV4dFdha2VVcCk7CisKK0JPT0xFQU4gUlQyOHh4UGNpQXNpY1JhZGlvT24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVUNIQVIgICAgIExldmVsKTsKKworVk9JRCBSVDI4eHhQY2lTdGFBc2ljRm9yY2VXYWtldXAoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gQk9PTEVBTiAgICAgICBiRnJvbVR4KTsKKworVk9JRCBSVDI4eHhQY2lTdGFBc2ljU2xlZXBUaGVuQXV0b1dha2V1cCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVU0hPUlQgVGJ0dE51bVRvTmV4dFdha2VVcCk7CisKK1ZPSUQgUHNQb2xsV2FrZUV4ZWMoCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKKworVk9JRCAgUmFkaW9PbkV4ZWMoCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworVk9JRCBSVDI4eHhQY2lNbG1lUmFkaW9PbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK1ZPSUQgUlQyOHh4UGNpTWxtZVJhZGlvT0ZGKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKyNlbmRpZiAvLyBSVDI4NjAgLy8KKworVk9JRCBBc2ljVHVybk9mZlJGQ2xrKAorCUlOIFBSVE1QX0FEQVBURVIgICAgcEFkLAorCUlOCVVDSEFSICAgICAgICAgICBDaGFubmVsKTsKKworVk9JRCBBc2ljVHVybk9uUkZDbGsoCisJSU4gUFJUTVBfQURBUFRFUiAJcEFkLAorCUlOCVVDSEFSCQkJQ2hhbm5lbCk7CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitWT0lEIFFCU1NfTG9hZEluaXQoCisgCUlOCQlSVE1QX0FEQVBURVIJKnBBZCk7CisKK1VJTlQzMiBRQlNTX0xvYWRFbGVtZW50QXBwZW5kKAorIAlJTgkJUlRNUF9BREFQVEVSCSpwQWQsCisJT1VUCQlVSU5UOAkJCSpidWZfcCk7CisKK1ZPSUQgUUJTU19Mb2FkVXBkYXRlKAorIAlJTgkJUlRNUF9BREFQVEVSCSpwQWQpOworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KK0lOVCBSVE1QU2hvd0NmZ1ZhbHVlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCXBOYW1lLAorCUlOCVBVQ0hBUgkJCXBCdWYpOworCitQQ0hBUiAgIFJUTVBHZXRSYWxpbmtBdXRoTW9kZVN0cigKKyAgICBJTiAgTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fTU9ERSBhdXRoTW9kZSk7CisKK1BDSEFSICAgUlRNUEdldFJhbGlua0VuY3J5TW9kZVN0cigKKyAgICBJTiAgVVNIT1JUIGVuY3J5TW9kZSk7CisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCitWT0lEIEFzaWNTdGFCYnBUdW5pbmcoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCit2b2lkIFJUTVBfSW5kaWNhdGVNZWRpYVN0YXRlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKTsKKworVk9JRCBSZVN5bmNCZWFjb25UaW1lKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworVk9JRCBSVE1QU2V0QUdDSW5pdFZhbHVlKAorCUlOIFBSVE1QX0FEQVBURVIJcEFkLAorCUlOIFVDSEFSCQkJQmFuZFdpZHRoKTsKKworaW50IHJ0Mjh4eF9jbG9zZShJTiBQTkVUX0RFViBkZXYpOworaW50IHJ0Mjh4eF9vcGVuKElOIFBORVRfREVWIGRldik7CisKK19faW5saW5lIElOVCBWSVJUVUFMX0lGX1VQKFBSVE1QX0FEQVBURVIgcEFkKQoreworZXh0ZXJuIFZPSUQgTWVzaE1ha2VCZWFjb24oSU4gUFJUTVBfQURBUFRFUiBwQWQsIElOIFVDSEFSIGlkeCk7CitleHRlcm4gVk9JRCBNZXNoVXBkYXRlQmVhY29uRnJhbWUoSU4gUFJUTVBfQURBUFRFUiBwQWQsIElOIFVDSEFSIGlkeCk7CisKKwlpZiAoVklSVFVBTF9JRl9OVU0ocEFkKSA9PSAwKQorCXsKKwkJaWYgKHJ0Mjh4eF9vcGVuKHBBZC0+bmV0X2RldikgIT0gMCkKKwkJCXJldHVybiAtMTsKKwl9CisJZWxzZQorCXsKKwl9CisJVklSVFVBTF9JRl9JTkMocEFkKTsKKwlyZXR1cm4gMDsKK30KKworX19pbmxpbmUgVk9JRCBWSVJUVUFMX0lGX0RPV04oUFJUTVBfQURBUFRFUiBwQWQpCit7CisJVklSVFVBTF9JRl9ERUMocEFkKTsKKwlpZiAoVklSVFVBTF9JRl9OVU0ocEFkKSA9PSAwKQorCQlydDI4eHhfY2xvc2UocEFkLT5uZXRfZGV2KTsKKwlyZXR1cm47Cit9CisKKworI2VuZGlmICAvLyBfX1JUTVBfSF9fCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRtcF9ja2lwbWljLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0bXBfY2tpcG1pYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzZDk0OWEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0bXBfY2tpcG1pYy5oCkBAIC0wLDAgKzEsMTEzIEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCU1vZHVsZSBOYW1lOgorCXJ0bXBfY2tpcG1pYy5oCisKKwlBYnN0cmFjdDoKKworCVJldmlzaW9uIEhpc3Rvcnk6CisJV2hvCQkJV2hlbgkJCVdoYXQKKwktLS0tLS0tLQktLS0tLS0tLS0tCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJTmFtZQkJRGF0ZQkJCU1vZGlmaWNhdGlvbiBsb2dzCisqLworI2lmbmRlZglfX1JUTVBfQ0tJUE1JQ19IX18KKyNkZWZpbmUJX19SVE1QX0NLSVBNSUNfSF9fCisKK3R5cGVkZWYJc3RydWN0CV9NSUNfQ09OVEVYVAl7CisJLyogLS0tIE1NSCBjb250ZXh0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisJVUNIQVIJCUNLWzE2XTsJCQkJLyogdGhlIGtleSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisJVUNIQVIJCWNvZWZmaWNpZW50WzE2XTsJLyogY3VycmVudCBhZXMgY291bnRlciBtb2RlIGNvZWZmaWNpZW50cyAgICAgICovCisJVUxPTkdMT05HCWFjY3VtOwkJCQkvKiBhY2N1bXVsYXRlZCBtaWMsIHJlZHVjZWQgdG8gdTMyIGluIGZpbmFsKCkgKi8KKwlVSU5UCQlwb3NpdGlvbjsJCQkvKiBjdXJyZW50IHBvc2l0aW9uIChieXRlIG9mZnNldCkgaW4gbWVzc2FnZSAgKi8KKwlVQ0hBUgkJcGFydFs0XTsJCQkvKiBmb3IgY29udmVyc2lvbiBvZiBtZXNzYWdlIHRvIHUzMiBmb3IgbW1oICAgKi8KK30JTUlDX0NPTlRFWFQsICpQTUlDX0NPTlRFWFQ7CisKK1ZPSUQJQ0tJUF9rZXlfcGVybXV0ZSgKKwlPVVQJVUNIQVIJKlBLLAkJCS8qIG91dHB1dCBwZXJtdXRlZCBrZXkgKi8KKwlJTglVQ0hBUgkqQ0ssCQkJLyogaW5wdXQgQ0tJUCBrZXkgKi8KKwlJTglVQ0hBUgl0b0RzRnJvbURzLAkJLyogaW5wdXQgdG9Ecy9Gcm9tRHMgYml0cyAqLworCUlOCVVDSEFSCSpwaXYpOwkJCS8qIGlucHV0IHBvaW50ZXIgdG8gSVYgKi8KKworVk9JRAlSVE1QQ2tpcE1pY0luaXQoCisJSU4JUE1JQ19DT05URVhUCQlwQ29udGV4dCwKKwlJTglQVUNIQVIJCQkJQ0spOworCitWT0lEIFJUTVBNaWNVcGRhdGUoCisgICAgSU4gIFBNSUNfQ09OVEVYVCAgICAgICAgcENvbnRleHQsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICAgICAgcE9jdGV0cywKKyAgICBJTiAgSU5UICAgICAgICAgICAgICAgICBsZW4pOworCitVTE9ORyBSVE1QTWljR2V0Q29lZmZpY2llbnQoCisgICAgSU4gIFBNSUNfQ09OVEVYVCAgICAgICAgIHBDb250ZXh0KTsKKworVk9JRCB4b3JfMTI4KAorICAgIElOICBQVUNIQVIgICAgICAgICAgICAgIGEsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICAgICAgYiwKKyAgICBPVVQgUFVDSEFSICAgICAgICAgICAgICBvdXQpOworCitVQ0hBUiBSVE1QQ2tpcFNib3goCisgICAgSU4gIFVDSEFSICAgICAgICAgICAgICAgYSk7CisKK1ZPSUQgeG9yXzMyKAorICAgIElOICBQVUNIQVIgICAgICAgICAgICAgIGEsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICAgICAgYiwKKyAgICBPVVQgUFVDSEFSICAgICAgICAgICAgICBvdXQpOworCitWT0lEIG5leHRfa2V5KAorICAgIElOICBQVUNIQVIgICAgICAgICAgICAgIGtleSwKKyAgICBJTiAgSU5UICAgICAgICAgICAgICAgICByb3VuZCk7CisKK1ZPSUQgYnl0ZV9zdWIoCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICAgICAgaW4sCisgICAgT1VUIFBVQ0hBUiAgICAgICAgICAgICAgb3V0KTsKKworVk9JRCBzaGlmdF9yb3coCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICAgICAgaW4sCisgICAgT1VUIFBVQ0hBUiAgICAgICAgICAgICAgb3V0KTsKKworVk9JRCBtaXhfY29sdW1uKAorICAgIElOICBQVUNIQVIgICAgICAgICAgICAgIGluLAorICAgIE9VVCBQVUNIQVIgICAgICAgICAgICAgIG91dCk7CisKK1ZPSUQgUlRNUEFlc0VuY3J5cHQoCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICAgICAga2V5LAorICAgIElOICBQVUNIQVIgICAgICAgICAgICAgIGRhdGEsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICAgICAgY2lwaGVydGV4dCk7CisKK1ZPSUQgUlRNUE1pY0ZpbmFsKAorICAgIElOICBQTUlDX0NPTlRFWFQgICAgICAgIHBDb250ZXh0LAorICAgIE9VVCBVQ0hBUiAgICAgICAgICAgICAgIGRpZ2VzdFs0XSk7CisKK1ZPSUQgUlRNUENraXBJbnNlcnRDTUlDKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorICAgIE9VVCBQVUNIQVIgICAgICAgICAgcE1JQywKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIHA4MDIxMWhkciwKKyAgICBJTiAgUE5ESVNfUEFDS0VUICAgIHBQYWNrZXQsCisgICAgSU4gIFBDSVBIRVJfS0VZICAgICBwS2V5LAorICAgIElOICBQVUNIQVIgICAgICAgICAgbWljX3NuYXApOworCisjZW5kaWYgLy9fX1JUTVBfQ0tJUE1JQ19IX18KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRtcF9kZWYuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRtcF9kZWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTk4MjE0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydG1wX2RlZi5oCkBAIC0wLDAgKzEsMTU4OCBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICBNb2R1bGUgTmFtZToKKyAgICBydG1wX2RlZi5oCisKKyAgICBBYnN0cmFjdDoKKyAgICBNaW5pcG9ydCByZWxhdGVkIGRlZmluaXRpb24gaGVhZGVyCisKKyAgICBSZXZpc2lvbiBIaXN0b3J5OgorICAgIFdobyAgICAgICAgIFdoZW4gICAgICAgICAgV2hhdAorICAgIC0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFBhdWwgTGluICAgIDA4LTAxLTIwMDIgICAgY3JlYXRlZAorICAgIEpvaG4gQ2hhbmcgIDA4LTA1LTIwMDMgICAgYWRkIGRlZmluaXRpb24gZm9yIDExZyAmIG90aGVyIGRyYWZ0cworKi8KKyNpZm5kZWYgX19SVE1QX0RFRl9IX18KKyNkZWZpbmUgX19SVE1QX0RFRl9IX18KKworI2luY2x1ZGUgIm9pZC5oIgorCisvLworLy8gIERlYnVnIGluZm9ybWF0aW9uIHZlcmJvc2l0eTogbG93ZXIgdmFsdWVzIGluZGljYXRlIGhpZ2hlciB1cmdlbmN5CisvLworI2RlZmluZSBSVF9ERUJVR19PRkYgICAgICAgIDAKKyNkZWZpbmUgUlRfREVCVUdfRVJST1IgICAgICAxCisjZGVmaW5lIFJUX0RFQlVHX1dBUk4gICAgICAgMgorI2RlZmluZSBSVF9ERUJVR19UUkFDRSAgICAgIDMKKyNkZWZpbmUgUlRfREVCVUdfSU5GTyAgICAgICA0CisjZGVmaW5lIFJUX0RFQlVHX0xPVUQgICAgICAgNQorCisjZGVmaW5lIE5JQ19UQUcgICAgICAgICAgICAgKChVTE9ORyknMDY4MicpCisjZGVmaW5lIE5JQ19EQkdfU1RSSU5HICAgICAgKCIqKlJUMjh4eCoqIikKKworI2lmZGVmIFNOTVBfU1VQUE9SVAorLy8gZm9yIHNubXAKKy8vIHRvIGdldCBtYW51ZmFjdHVyZXIgT1VJLCBrYXRoeSwgMjAwOF8wMjIwCisjZGVmaW5lIE1hbnVmYWN0dXJlck9VSV9MRU4JCQkzCisjZGVmaW5lIE1hbnVmYWN0dXJlck5BTUUJCQkoIlJhbGluayBUZWNobm9sb2d5IENvbXBhbnkuIikKKyNkZWZpbmUJUmVzb3VyY2VUeXBlSWROYW1lCQkJKCJSYWxpbmtfSUQiKQorI2VuZGlmCisKKworI2RlZmluZSBSQUxJTktfMjg4M19WRVJTSU9OCQkoKFVJTlQzMikweDI4ODMwMzAwKQorI2RlZmluZSBSQUxJTktfMjg4MEVfVkVSU0lPTgkoKFVJTlQzMikweDI4NzIwMjAwKQorI2RlZmluZSBSQUxJTktfMzA3MF9WRVJTSU9OCQkoKFVJTlQzMikweDMwNzAwMjAwKQorCisvLworLy8gTkRJUyB2ZXJzaW9uIGluIHVzZSBieSB0aGUgTklDIGRyaXZlci4KKy8vIFRoZSBoaWdoIGJ5dGUgaXMgdGhlIG1ham9yIHZlcnNpb24uIFRoZSBsb3cgYnl0ZSBpcyB0aGUgbWlub3IgdmVyc2lvbi4KKy8vCisjaWZkZWYgIE5ESVM1MV9NSU5JUE9SVAorI2RlZmluZSBOSUNfRFJJVkVSX1ZFUlNJT04gICAgICAweDA1MDEKKyNlbHNlCisjZGVmaW5lIE5JQ19EUklWRVJfVkVSU0lPTiAgICAgIDB4MDUwMAorI2VuZGlmCisKKy8vCisvLyBORElTIG1lZGlhIHR5cGUsIGN1cnJlbnQgaXMgZXRoZXJuZXQsIGNoYW5nZSBpZiBuYXRpdmUgd2lyZWxlc3Mgc3VwcG9ydGVkCisvLworI2RlZmluZSBOSUNfTUVESUFfVFlQRSAgICAgICAgICBOZGlzTWVkaXVtODAyXzMKKyNkZWZpbmUgTklDX1BDSV9IRFJfTEVOR1RIICAgICAgMHhlMgorI2RlZmluZSBOSUNfTUFYX1BBQ0tFVF9TSVpFICAgICAyMzA0CisjZGVmaW5lIE5JQ19IRUFERVJfU0laRSAgICAgICAgIDE0CisjZGVmaW5lIE1BWF9NQVBfUkVHSVNURVJTX05FRURFRCAzMgorI2RlZmluZSBNSU5fTUFQX1JFR0lTVEVSU19ORUVERUQgMiAgIC8vVG9kbzogc2hvdWxkIGNvbnNpZGVyIGZyYWdtZW50IGlzc3VlLgorCisvLworLy8gaW50ZXJmYWNlIHR5cGUsIHdlIHVzZSBQQ0kKKy8vCisjZGVmaW5lIE5JQ19JTlRFUkZBQ0VfVFlQRSAgICAgIE5kaXNJbnRlcmZhY2VQY2kKKyNkZWZpbmUgTklDX0lOVEVSUlVQVF9NT0RFICAgICAgTmRpc0ludGVycnVwdExldmVsU2Vuc2l0aXZlCisKKy8vCisvLyBidWZmZXIgc2l6ZSBwYXNzZWQgaW4gTmRpc01RdWVyeUFkYXB0ZXJSZXNvdXJjZXMKKy8vIFdlIHNob3VsZCBvbmx5IG5lZWQgdGhyZWUgYWRhcHRlciByZXNvdXJjZXMgKElPLCBpbnRlcnJ1cHQgYW5kIG1lbW9yeSksCisvLyBTb21lIGRldmljZXMgZ2V0IGV4dHJhIHJlc291cmNlcywgc28gaGF2ZSByb29tIGZvciAxMCByZXNvdXJjZXMKKy8vICAgICAgICAgICAgICAgICAgICBVRl9TSVpFICAgKHNpemVvZihORElTX1JFU09VUkNFX0xJU1QpICsgKDEwKnNpemVvZihDTV9QQVJUSUFMX1JFU09VUkNFX0RFU0NSSVBUT1IpKSkKKworCisjZGVmaW5lIE5JQ19SRVNPVVJDRV9CLy8KKy8vIElPIHNwYWNlIGxlbmd0aAorLy8KKyNkZWZpbmUgTklDX01BUF9JT1NQQUNFX0xFTkdUSCAgc2l6ZW9mKENTUl9TVFJVQykKKworI2RlZmluZSBNQVhfUlhfUEtUX0xFTgkxNTIwCisKKy8vCisvLyBFbnRyeSBudW1iZXIgZm9yIGVhY2ggRE1BIGRlc2NyaXB0b3IgcmluZworLy8KKworI2lmZGVmIFJUMjg2MAorI2RlZmluZSBUWF9SSU5HX1NJWkUgICAgICAgICAgICA2NCAvLzY0CisjZGVmaW5lIE1HTVRfUklOR19TSVpFICAgICAgICAgIDEyOAorI2RlZmluZSBSWF9SSU5HX1NJWkUgICAgICAgICAgICAxMjggLy82NAorI2RlZmluZSBNQVhfVFhfUFJPQ0VTUyAgICAgICAgICBUWF9SSU5HX1NJWkUgLy84CisjZGVmaW5lIE1BWF9ETUFfRE9ORV9QUk9DRVNTICAgIFRYX1JJTkdfU0laRQorI2RlZmluZSBNQVhfVFhfRE9ORV9QUk9DRVNTICAgICBUWF9SSU5HX1NJWkUgLy84CisjZGVmaW5lIExPQ0FMX1RYQlVGX1NJWkUgICAgICAgIDIKKyNlbmRpZiAvLyBSVDI4NjAgLy8KKworCisjaWZkZWYgTVVMVElQTEVfQ0FSRF9TVVBQT1JUCisvLyBNQzogTXVsdHBsZSBDYXJkcworI2RlZmluZSBNQVhfTlVNX09GX01VTFRJUExFX0NBUkQJCTMyCisjZW5kaWYgLy8gTVVMVElQTEVfQ0FSRF9TVVBQT1JUIC8vCisKKyNkZWZpbmUgTUFYX1JYX1BST0NFU1MgICAgICAgICAgMTI4IC8vNjQgLy8zMgorI2RlZmluZSBOVU1fT0ZfTE9DQUxfVFhCVUYgICAgICAyCisjZGVmaW5lIFRYRF9TSVpFICAgICAgICAgICAgICAgIDE2CisjZGVmaW5lIFRYV0lfU0laRSAgICAgICAgICAgICAgIDE2CisjZGVmaW5lIFJYRF9TSVpFICAgICAgICAgICAgICAgCTE2CisjZGVmaW5lIFJYV0lfU0laRSAgICAgICAgICAgICAJMTYKKy8vIFRYSU5GT19TSVpFICsgVFhXSV9TSVpFICsgODAyLjExIEhlYWRlciBTaXplICsgQU1TRFUgc3ViIGZyYW1lIGhlYWRlcgorI2RlZmluZSBUWF9ETUFfMVNUX0JVRkZFUl9TSVpFICA5NiAgICAvLyBvbmx5IHRoZSAxc3QgcGh5c2ljYWwgYnVmZmVyIGlzIHByZS1hbGxvY2F0ZWQKKyNkZWZpbmUgTUdNVF9ETUFfQlVGRkVSX1NJWkUgICAgMTUzNiAvLzIwNDgKKyNkZWZpbmUgUlhfQlVGRkVSX0FHR1JFU0laRSAgICAgMzg0MCAvLzM5MDQgLy8zOTY4IC8vNDA5NiAvLzIwNDggLy80MDk2CisjZGVmaW5lIFJYX0JVRkZFUl9OT1JNU0laRSAgICAgIDM4NDAgLy8zOTA0IC8vMzk2OCAvLzQwOTYgLy8yMDQ4IC8vNDA5NgorI2RlZmluZSBUWF9CVUZGRVJfTk9STVNJWkUJCVJYX0JVRkZFUl9OT1JNU0laRQorI2RlZmluZSBNQVhfRlJBTUVfU0laRSAgICAgICAgICAyMzQ2ICAgICAgICAgICAgICAgICAgICAvLyBNYXhpbXVtIDgwMi4xMSBmcmFtZSBzaXplCisjZGVmaW5lIE1BWF9BR0dSRUdBVElPTl9TSVpFICAgIDM4NDAgLy8zOTA0IC8vMzk2OCAvLzQwOTYKKyNkZWZpbmUgTUFYX05VTV9PRl9UVVBMRV9DQUNIRSAgMgorI2RlZmluZSBNQVhfTUNBU1RfTElTVF9TSVpFICAgICAzMgorI2RlZmluZSBNQVhfTEVOX09GX1ZFTkRPUl9ERVNDICA2NAorLy8jZGVmaW5lIE1BWF9TSVpFX09GX01DQVNUX1BTUSAgIChOVU1fT0ZfTE9DQUxfVFhCVUYgPj4gMikgLy8gQVAgd29uJ3Qgc3BlbmQgbW9yZSB0aGFuIDEvNCBvZiB0b3RhbCBidWZmZXJzIG9uIE0vQkNBU1QgUFNRCisjZGVmaW5lIE1BWF9TSVpFX09GX01DQVNUX1BTUSAgICAgICAgICAgICAgIDMyCisKKyNkZWZpbmUgTUFYX1JYX1BST0NFU1NfQ05UCShSWF9SSU5HX1NJWkUpCisKKworI2RlZmluZSBNQVhfUEFDS0VUU19JTl9RVUVVRQkJCQkoNTEyKSAvLyg1MTIpICAgIC8vIHRvIHBhc3MgV01NIEE1LVdQQVBTSworI2RlZmluZSBNQVhfUEFDS0VUU19JTl9NQ0FTVF9QU19RVUVVRQkJMzIKKyNkZWZpbmUgTUFYX1BBQ0tFVFNfSU5fUFNfUVVFVUUJCQkJMTI4CS8vMzIKKyNkZWZpbmUgV01NX05VTV9PRl9BQyAgICAgICAgICAgICAgICAgICAgICAgNCAgLyogQUMwLCBBQzEsIEFDMiwgYW5kIEFDMyAqLworCisKKworLy8gUnhGaWx0ZXIKKyNkZWZpbmUgU1RBTk9STUFMCSAweDE3Zjk3CisjZGVmaW5lIEFQTk9STUFMCSAweDE1Zjk3CisvLworLy8gIFJUTVBfQURBUFRFUiBmbGFncworLy8KKyNkZWZpbmUgZlJUTVBfQURBUFRFUl9NQVBfUkVHSVNURVIgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIGZSVE1QX0FEQVBURVJfSEFSRFdBUkVfRVJST1IgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgZlJUTVBfQURBUFRFUl9TQ0FUVEVSX0dBVEhFUiAgICAgICAgMHgwMDAwMDAwOAorI2RlZmluZSBmUlRNUF9BREFQVEVSX1NFTkRfUEFDS0VUX0VSUk9SICAgICAweDAwMDAwMDEwCisjZGVmaW5lIGZSVE1QX0FEQVBURVJfTUxNRV9SRVNFVF9JTl9QUk9HUkVTUyAweDAwMDAwMDIwCisjZGVmaW5lIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyAgICAgIDB4MDAwMDAwNDAKKyNkZWZpbmUgZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUyAgICAgMHgwMDAwMDA4MAorI2RlZmluZSBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QgICAgICAgICAweDAwMDAwMTAwCisjZGVmaW5lIGZSVE1QX0FEQVBURVJfVFhfUklOR19BTExPQ0FURUQgICAgIDB4MDAwMDAyMDAKKyNkZWZpbmUgZlJUTVBfQURBUFRFUl9SRU1PVkVfSU5fUFJPR1JFU1MgICAgMHgwMDAwMDQwMAorI2RlZmluZSBmUlRNUF9BREFQVEVSX01JTU9SQVRFX0lOVVNFRCAgICAgICAweDAwMDAwODAwCisjZGVmaW5lIGZSVE1QX0FEQVBURVJfUlhfUklOR19BTExPQ0FURUQgICAgIDB4MDAwMDEwMDAKKyNkZWZpbmUgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfQUNUSVZFICAgICAgMHgwMDAwMjAwMAorI2RlZmluZSBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTICAweDAwMDA0MDAwCisjZGVmaW5lCWZSVE1QX0FEQVBURVJfUkVBU1NPQ19JTl9QUk9HUkVTUwkweDAwMDA4MDAwCisjZGVmaW5lCWZSVE1QX0FEQVBURVJfTUVESUFfU1RBVEVfUEVORElORwkweDAwMDEwMDAwCisjZGVmaW5lCWZSVE1QX0FEQVBURVJfUkFESU9fT0ZGCQkJCTB4MDAwMjAwMDAKKyNkZWZpbmUgZlJUTVBfQURBUFRFUl9CVUxLT1VUX1JFU0VUCQkJMHgwMDA0MDAwMAorI2RlZmluZQlmUlRNUF9BREFQVEVSX0JVTEtJTl9SRVNFVAkJCTB4MDAwODAwMDAKKyNkZWZpbmUgZlJUTVBfQURBUFRFUl9SREdfQUNUSVZFCQkJMHgwMDEwMDAwMAorI2RlZmluZSBmUlRNUF9BREFQVEVSX0RZTkFNSUNfQkVfVFhPUF9BQ1RJVkUgMHgwMDIwMDAwMAorI2RlZmluZSBmUlRNUF9BREFQVEVSX1NDQU5fMjA0MCAJCQkweDA0MDAwMDAwCisjZGVmaW5lCWZSVE1QX0FEQVBURVJfUkFESU9fTUVBU1VSRU1FTlQJCTB4MDgwMDAwMDAKKworI2RlZmluZSBmUlRNUF9BREFQVEVSX1NUQVJUX1VQICAgICAgICAgCQkweDEwMDAwMDAwCS8vRGV2aXZlIGFscmVhZHkgaW5pdGlhbGl6ZWQgYW5kIGVuYWJsZWQgVHgvUnguCisjZGVmaW5lIGZSVE1QX0FEQVBURVJfTUVESUFfU1RBVEVfQ0hBTkdFICAgIDB4MjAwMDAwMDAKKyNkZWZpbmUgZlJUTVBfQURBUFRFUl9JRExFX1JBRElPX09GRiAgICAgICAgMHg0MDAwMDAwMAorCisvLworLy8gIFNUQSBvcGVyYXRpb24gc3RhdHVzIGZsYWdzCisvLworI2RlZmluZSBmT1BfU1RBVFVTX0lORlJBX09OICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIGZPUF9TVEFUVVNfQURIT0NfT04gICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgZk9QX1NUQVRVU19CR19QUk9URUNUSU9OX0lOVVNFRCAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBmT1BfU1RBVFVTX1NIT1JUX1NMT1RfSU5VU0VEICAgICAgICAweDAwMDAwMDA4CisjZGVmaW5lIGZPUF9TVEFUVVNfU0hPUlRfUFJFQU1CTEVfSU5VU0VEICAgIDB4MDAwMDAwMTAKKyNkZWZpbmUgZk9QX1NUQVRVU19SRUNFSVZFX0RUSU0gICAgICAgICAgICAgMHgwMDAwMDAyMAorI2RlZmluZSBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCAgICAweDAwMDAwMDgwCisjZGVmaW5lIGZPUF9TVEFUVVNfV01NX0lOVVNFRCAgICAgICAgICAgICAgIDB4MDAwMDAxMDAKKyNkZWZpbmUgZk9QX1NUQVRVU19BR0dSRUdBVElPTl9JTlVTRUQgICAgICAgMHgwMDAwMDIwMAorI2RlZmluZSBmT1BfU1RBVFVTX0RPWkUgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNDAwICAvLyBkZWJ1ZyBwdXJwb3NlCisjZGVmaW5lIGZPUF9TVEFUVVNfUElHR1lCQUNLX0lOVVNFRCAgICAgICAgIDB4MDAwMDA4MDAgIC8vIHBpZ2d5LWJhY2ssIGFuZCBhZ2dyZWdhdGlvbgorI2RlZmluZSBmT1BfU1RBVFVTX0FQU0RfSU5VU0VECQkJCTB4MDAwMDEwMDAKKyNkZWZpbmUgZk9QX1NUQVRVU19UWF9BTVNEVV9JTlVTRUQJCQkweDAwMDAyMDAwCisjZGVmaW5lIGZPUF9TVEFUVVNfTUFYX1JFVFJZX0VOQUJMRUQJCTB4MDAwMDQwMDAKKyNkZWZpbmUgZk9QX1NUQVRVU19XQUtFVVBfTk9XICAgICAgICAgICAgICAgMHgwMDAwODAwMAorI2RlZmluZSBmT1BfU1RBVFVTX0FEVkFOQ0VfUE9XRVJfU0FWRV9QQ0lFX0RFVklDRSAgICAgICAweDAwMDIwMDAwCisKKyNpZmRlZiBET1QxMU5fRFJBRlQzCisjZGVmaW5lIGZPUF9TVEFUVVNfU0NBTl8yMDQwICAgICAgICAgICAgICAgCSAgICAweDAwMDQwMDAwCisjZW5kaWYgLy8gRE9UMTFOX0RSQUZUMyAvLworCisjZGVmaW5lIENDS1NFVFBST1RFQ1QJCTB4MQorI2RlZmluZSBPRkRNU0VUUFJPVEVDVAkJMHgyCisjZGVmaW5lIE1NMjBTRVRQUk9URUNUCQkweDQKKyNkZWZpbmUgTU00MFNFVFBST1RFQ1QJCTB4OAorI2RlZmluZSBHRjIwU0VUUFJPVEVDVAkJMHgxMAorI2RlZmluZSBHUjQwU0VUUFJPVEVDVAkJMHgyMAorI2RlZmluZSBBTExOX1NFVFBST1RFQ1QJCShHUjQwU0VUUFJPVEVDVCB8IEdGMjBTRVRQUk9URUNUIHwgTU00MFNFVFBST1RFQ1QgfCBNTTIwU0VUUFJPVEVDVCkKKworLy8KKy8vICBBUCdzIGNsaWVudCB0YWJsZSBvcGVyYXRpb24gc3RhdHVzIGZsYWdzCisvLworI2RlZmluZSBmQ0xJRU5UX1NUQVRVU19XTU1fQ0FQQUJMRSAgICAgICAgICAweDAwMDAwMDAxICAvLyBDTElFTlQgY2FuIHBhcnNlIFFPUyBEQVRBIGZyYW1lCisjZGVmaW5lIGZDTElFTlRfU1RBVFVTX0FHR1JFR0FUSU9OX0NBUEFCTEUgIDB4MDAwMDAwMDIgIC8vIENMSUVOVCBjYW4gcmVjZWl2ZSBSYWxpbmsncyBwcm9wcmlldGFyeSBUWCBhZ2dyZWdhdGlvbiBmcmFtZQorI2RlZmluZSBmQ0xJRU5UX1NUQVRVU19QSUdHWUJBQ0tfQ0FQQUJMRSAgICAweDAwMDAwMDA0ICAvLyBDTElFTlQgc3VwcG9ydCBwaWdneS1iYWNrCisjZGVmaW5lIGZDTElFTlRfU1RBVFVTX0FNU0RVX0lOVVNFRAkJCTB4MDAwMDAwMDgKKyNkZWZpbmUgZkNMSUVOVF9TVEFUVVNfU0dJMjBfQ0FQQUJMRQkJMHgwMDAwMDAxMAorI2RlZmluZSBmQ0xJRU5UX1NUQVRVU19TR0k0MF9DQVBBQkxFCQkweDAwMDAwMDIwCisjZGVmaW5lIGZDTElFTlRfU1RBVFVTX1R4U1RCQ19DQVBBQkxFCQkweDAwMDAwMDQwCisjZGVmaW5lIGZDTElFTlRfU1RBVFVTX1J4U1RCQ19DQVBBQkxFCQkweDAwMDAwMDgwCisjZGVmaW5lIGZDTElFTlRfU1RBVFVTX0hUQ19DQVBBQkxFCQkJMHgwMDAwMDEwMAorI2RlZmluZSBmQ0xJRU5UX1NUQVRVU19SREdfQ0FQQUJMRQkJCTB4MDAwMDAyMDAKKyNkZWZpbmUgZkNMSUVOVF9TVEFUVVNfTUNTRkVFREJBQ0tfQ0FQQUJMRSAgMHgwMDAwMDQwMAorI2RlZmluZSBmQ0xJRU5UX1NUQVRVU19BUFNEX0NBUEFCTEUgICAgICAgICAweDAwMDAwODAwICAvKiBVQVBTRCBTVEFUSU9OICovCisKKyNpZmRlZiBET1QxMU5fRFJBRlQzCisjZGVmaW5lIGZDTElFTlRfU1RBVFVTX0JTU0NPRVhJU1RfQ0FQQUJMRQkweDAwMDAxMDAwCisjZW5kaWYgLy8gRE9UMTFOX0RSQUZUMyAvLworCisjZGVmaW5lIGZDTElFTlRfU1RBVFVTX1JBTElOS19DSElQU0VUCQkweDAwMTAwMDAwCisvLworLy8gIFNUQSBjb25maWd1cmF0aW9uIGZsYWdzCisvLworCisvLyA4MDIuMTFuIE9wZXJhdGluZyBNb2RlIERlZmluaXRpb24uIDAtMyBhbHNvIHVzZWQgaW4gQVNJQ1VQZGF0ZVByb3RlY3Qgc3dpdGNoIGNhc2UKKyNkZWZpbmUgSFRfTk9fUFJPVEVDVAkwCisjZGVmaW5lIEhUX0xFR0FDWV9QUk9URUNUCTEKKyNkZWZpbmUgSFRfNDBfUFJPVEVDVAkyCisjZGVmaW5lIEhUXzIwNDBfUFJPVEVDVAkzCisjZGVmaW5lIEhUX1JUU0NUU182TQk3CisvL2ZvbGxvd2luZyBpcyBvdXIgb3duIGRlZmluaXRpb24gaW4gb3JkZXIgdG8gdHVybiBvbiBvdXIgQVNJQyBwcm90ZWN0aW9uIHJlZ2lzdGVyIGluIElORlJBU1RSVUNUVVJFLgorI2RlZmluZSBIVF9BVEhFUk9TCTgJLy8gcnQyODYwYyBoYXMgcHJvYmxlbSB3aXRoIGF0aGVyb3MgY2hpcC4gd2UgbmVlZCB0byB0dXJuIG9uIFJUUy9DVFMgLgorI2RlZmluZSBIVF9GT1JDRVJUU0NUUwk5CS8vIEZvcmNlIHR1cm4gb24gUlRTL0NUUyBmaXJzdC4gdGhlbiBnbyB0byBldmFsdWF0ZSBpZiB0aGlzIGZvcmNlIFJUUyBpcyBuZWNlc3NhcnkuCisKKy8vCisvLyBSWCBQYWNrZXQgRmlsdGVyIGNvbnRyb2wgZmxhZ3MuIEFwcGx5IG9uIHBBZC0+UGFja2V0RmlsdGVyCisvLworI2RlZmluZSBmUlhfRklMVEVSX0FDQ0VQVF9ESVJFQ1QgICAgICAgICAgICBORElTX1BBQ0tFVF9UWVBFX0RJUkVDVEVECisjZGVmaW5lIGZSWF9GSUxURVJfQUNDRVBUX01VTFRJQ0FTVCAgICAgICAgIE5ESVNfUEFDS0VUX1RZUEVfTVVMVElDQVNUCisjZGVmaW5lIGZSWF9GSUxURVJfQUNDRVBUX0JST0FEQ0FTVCAgICAgICAgIE5ESVNfUEFDS0VUX1RZUEVfQlJPQURDQVNUCisjZGVmaW5lIGZSWF9GSUxURVJfQUNDRVBUX0FMTF9NVUxUSUNBU1QgICAgIE5ESVNfUEFDS0VUX1RZUEVfQUxMX01VTFRJQ0FTVAorCisvLworLy8gRXJyb3IgY29kZSBzZWN0aW9uCisvLworLy8gTkRJU19FUlJPUl9DT0RFX0FEQVBURVJfTk9UX0ZPVU5ECisjZGVmaW5lIEVSUkxPR19SRUFEX1BDSV9TTE9UX0ZBSUxFRCAgICAgMHgwMDAwMDEwMUwKKyNkZWZpbmUgRVJSTE9HX1dSSVRFX1BDSV9TTE9UX0ZBSUxFRCAgICAweDAwMDAwMTAyTAorI2RlZmluZSBFUlJMT0dfVkVORE9SX0RFVklDRV9OT01BVENIICAgIDB4MDAwMDAxMDNMCisKKy8vIE5ESVNfRVJST1JfQ09ERV9BREFQVEVSX0RJU0FCTEVECisjZGVmaW5lIEVSUkxPR19CVVNfTUFTVEVSX0RJU0FCTEVEICAgICAgMHgwMDAwMDIwMUwKKworLy8gTkRJU19FUlJPUl9DT0RFX1VOU1VQUE9SVEVEX0NPTkZJR1VSQVRJT04KKyNkZWZpbmUgRVJSTE9HX0lOVkFMSURfU1BFRURfRFVQTEVYICAgICAweDAwMDAwMzAxTAorI2RlZmluZSBFUlJMT0dfU0VUX1NFQ09OREFSWV9GQUlMRUQgICAgIDB4MDAwMDAzMDJMCisKKy8vIE5ESVNfRVJST1JfQ09ERV9PVVRfT0ZfUkVTT1VSQ0VTCisjZGVmaW5lIEVSUkxPR19PVVRfT0ZfTUVNT1JZICAgICAgICAgICAgMHgwMDAwMDQwMUwKKyNkZWZpbmUgRVJSTE9HX09VVF9PRl9TSEFSRURfTUVNT1JZICAgICAweDAwMDAwNDAyTAorI2RlZmluZSBFUlJMT0dfT1VUX09GX01BUF9SRUdJU1RFUlMgICAgIDB4MDAwMDA0MDNMCisjZGVmaW5lIEVSUkxPR19PVVRfT0ZfQlVGRkVSX1BPT0wgICAgICAgMHgwMDAwMDQwNEwKKyNkZWZpbmUgRVJSTE9HX09VVF9PRl9ORElTX0JVRkZFUiAgICAgICAweDAwMDAwNDA1TAorI2RlZmluZSBFUlJMT0dfT1VUX09GX1BBQ0tFVF9QT09MICAgICAgIDB4MDAwMDA0MDZMCisjZGVmaW5lIEVSUkxPR19PVVRfT0ZfTkRJU19QQUNLRVQgICAgICAgMHgwMDAwMDQwN0wKKyNkZWZpbmUgRVJSTE9HX09VVF9PRl9MT09LQVNJREVfTUVNT1JZICAweDAwMDAwNDA4TAorCisvLyBORElTX0VSUk9SX0NPREVfSEFSRFdBUkVfRkFJTFVSRQorI2RlZmluZSBFUlJMT0dfU0VMRlRFU1RfRkFJTEVEICAgICAgICAgIDB4MDAwMDA1MDFMCisjZGVmaW5lIEVSUkxPR19JTklUSUFMSVpFX0FEQVBURVIgICAgICAgMHgwMDAwMDUwMkwKKyNkZWZpbmUgRVJSTE9HX1JFTU9WRV9NSU5JUE9SVCAgICAgICAgICAweDAwMDAwNTAzTAorCisvLyBORElTX0VSUk9SX0NPREVfUkVTT1VSQ0VfQ09ORkxJQ1QKKyNkZWZpbmUgRVJSTE9HX01BUF9JT19TUEFDRSAgICAgICAgICAgICAweDAwMDAwNjAxTAorI2RlZmluZSBFUlJMT0dfUVVFUllfQURBUFRFUl9SRVNPVVJDRVMgIDB4MDAwMDA2MDJMCisjZGVmaW5lIEVSUkxPR19OT19JT19SRVNPVVJDRSAgICAgICAgICAgMHgwMDAwMDYwM0wKKyNkZWZpbmUgRVJSTE9HX05PX0lOVEVSUlVQVF9SRVNPVVJDRSAgICAweDAwMDAwNjA0TAorI2RlZmluZSBFUlJMT0dfTk9fTUVNT1JZX1JFU09VUkNFICAgICAgIDB4MDAwMDA2MDVMCisKKworLy8gV0RTIGRlZmluaXRpb24KKyNkZWZpbmUJTUFYX1dEU19FTlRSWSAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgV0RTX1BBSVJXSVNFX0tFWV9PRkZTRVQgICAgIDYwICAgIC8vIFdEUyBsaW5rcyB1c2VzIHBhaXJ3aXNlIGtleSM2MCB+IDYzIGluIEFTSUMgcGFpcndpc2Uga2V5IHRhYmxlCisKKyNkZWZpbmUJV0RTX0RJU0FCTEVfTU9ERSAgICAgICAgICAgIDAKKyNkZWZpbmUJV0RTX1JFU1RSSUNUX01PREUgICAgICAgICAgIDEKKyNkZWZpbmUJV0RTX0JSSURHRV9NT0RFICAgICAgICAgICAgIDIKKyNkZWZpbmUJV0RTX1JFUEVBVEVSX01PREUgICAgICAgICAgIDMKKyNkZWZpbmUJV0RTX0xBWllfTU9ERSAgICAgICAgICAgICAgIDQKKworCisjZGVmaW5lIE1BWF9NRVNIX05VTQkJCQkwCisKKyNkZWZpbmUgTUFYX0FQQ0xJX05VTQkJCQkwCisjaWZkZWYgQVBDTElfU1VQUE9SVAorI3VuZGVmCU1BWF9BUENMSV9OVU0KKyNkZWZpbmUgTUFYX0FQQ0xJX05VTQkJCQkxCisjZW5kaWYgLy8gQVBDTElfU1VQUE9SVCAvLworCisjZGVmaW5lIE1BWF9NQlNTSURfTlVNCQkJCTEKKyNpZmRlZiBNQlNTX1NVUFBPUlQKKyN1bmRlZglNQVhfTUJTU0lEX05VTQorI2RlZmluZSBNQVhfTUJTU0lEX05VTQkJCQkoOCAtIE1BWF9NRVNIX05VTSAtIE1BWF9BUENMSV9OVU0pCisjZW5kaWYgLy8gTUJTU19TVVBQT1JUIC8vCisKKy8qIHNhbml0eSBjaGVjayBmb3IgYXBpZHggKi8KKyNkZWZpbmUgTUJTU19NUl9BUElEWF9TQU5JVFlfQ0hFQ0soYXBpZHgpIFwKKyAgICB7IGlmIChhcGlkeCA+IE1BWF9NQlNTSURfTlVNKSB7IFwKKyAgICAgICAgICBwcmludGsoIiVzPiBFcnJvciEgYXBpZHggPSAlZCA+IE1BWF9NQlNTSURfTlVNIVxuIiwgX19mdW5jX18sIGFwaWR4KTsgXAorCSAgYXBpZHggPSBNQUlOX01CU1NJRDsgfSB9CisKKyNkZWZpbmUgVkFMSURfV0NJRChfd2NpZCkJKChfd2NpZCkgPiAwICYmIChfd2NpZCkgPCBNQVhfTEVOX09GX01BQ19UQUJMRSApCisKKyNkZWZpbmUgTUFJTl9NQlNTSUQgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgRklSU1RfTUJTU0lEICAgICAgICAgICAgICAgIDEKKworCisjZGVmaW5lIE1BWF9CRUFDT05fU0laRQkJCQk1MTIKKy8vIElmIHRoZSBNQVhfTUJTU0lEX05VTSBpcyBsYXJnZXIgdGhhbiA2LAorLy8gaXQgc2hhbGwgcmVzZXJ2ZSBzb21lIFdDSUQgc3BhY2Uod2NpZCAyMjJ+MjUzKSBmb3IgYmVhY29uIGZyYW1lcy4KKy8vIC0JdGhlc2Ugd2NpZCAyMzh+MjUzIGFyZSByZXNlcnZlZCBmb3IgYmVhY29uIzYocmE2KS4KKy8vIC0JdGhlc2Ugd2NpZCAyMjJ+MjM3IGFyZSByZXNlcnZlZCBmb3IgYmVhY29uIzcocmE3KS4KKyNpZiBkZWZpbmVkKE1BWF9NQlNTSURfTlVNKSAmJiAoTUFYX01CU1NJRF9OVU0gPT0gOCkKKyNkZWZpbmUgSFdfUkVTRVJWRURfV0NJRAkyMjIKKyNlbGlmIGRlZmluZWQoTUFYX01CU1NJRF9OVU0pICYmIChNQVhfTUJTU0lEX05VTSA9PSA3KQorI2RlZmluZSBIV19SRVNFUlZFRF9XQ0lECTIzOAorI2Vsc2UKKyNkZWZpbmUgSFdfUkVTRVJWRURfV0NJRAkyNTUKKyNlbmRpZgorCisvLyBUaGVuIGRlZGljYXRlIHdjaWQgb2YgREZTIGFuZCBDYXJyaWVyLVNlbnNlLgorI2RlZmluZSBERlNfQ1RTX1dDSUQgCQkoSFdfUkVTRVJWRURfV0NJRCAtIDEpCisjZGVmaW5lIENTX0NUU19XQ0lEIAkJKEhXX1JFU0VSVkVEX1dDSUQgLSAyKQorI2RlZmluZSBMQVNUX1NQRUNJRklDX1dDSUQJKEhXX1JFU0VSVkVEX1dDSUQgLSAyKQorCisvLyBJZiBNQVhfTUJTU0lEX05VTSBpcyA4LCB0aGUgbWF4aW11bSBhdmFpbGFibGUgd2NpZCBmb3IgdGhlIGFzc29jaWF0ZWQgU1RBIGlzIDIxMS4KKy8vIElmIE1BWF9NQlNTSURfTlVNIGlzIDcsIHRoZSBtYXhpbXVtIGF2YWlsYWJsZSB3Y2lkIGZvciB0aGUgYXNzb2NpYXRlZCBTVEEgaXMgMjI4LgorI2RlZmluZSBNQVhfQVZBSUxBQkxFX0NMSUVOVF9XQ0lECShMQVNUX1NQRUNJRklDX1dDSUQgLSBNQVhfTUJTU0lEX05VTSAtIDEpCisKKy8vIFRYIG5lZWQgV0NJRCB0byBmaW5kIENpcGhlciBLZXkKKy8vIHRoZXNlIHdjaWQgMjEyIH4gMjE5IGFyZSByZXNlcnZlZCBmb3IgYmMvbWMgcGFja2V0cyBpZiBNQVhfTUJTU0lEX05VTSBpcyA4LgorI2RlZmluZSBHRVRfR3JvdXBLZXlfV0NJRChfX3djaWQsIF9fYnNzaWR4KSBcCisJewkJCQkJCQkJCQlcCisJCV9fd2NpZCA9IExBU1RfU1BFQ0lGSUNfV0NJRCAtIChNQVhfTUJTU0lEX05VTSkgKyBfX2Jzc2lkeDsJXAorCX0KKworI2RlZmluZSBJc0dyb3VwS2V5V0NJRChfX3djaWQpICgoKF9fd2NpZCkgPCBMQVNUX1NQRUNJRklDX1dDSUQpICYmICgoX193Y2lkKSA+PSAoTEFTVF9TUEVDSUZJQ19XQ0lEIC0gKE1BWF9NQlNTSURfTlVNKSkpKQorCisKKy8vIGRlZmluaXRpb24gdG8gc3VwcG9ydCBtdWx0aXBsZSBCU1NJRAorI2RlZmluZSBCU1MwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQlNTMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEJTUzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBCU1MzICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgQlNTNCAgICAgICAgICAgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIEJTUzUgICAgICAgICAgICAgICAgICAgICAgICAgICAgNQorI2RlZmluZSBCU1M2ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYKKyNkZWZpbmUgQlNTNyAgICAgICAgICAgICAgICAgICAgICAgICAgICA3CisKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIExlbmd0aCBkZWZpbml0aW9ucworI2RlZmluZSBQRUVSX0tFWV9OTyAgICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgTUFDX0FERFJfTEVOICAgICAgICAgICAgICAgICAgICA2CisjZGVmaW5lIFRJTUVTVEFNUF9MRU4gICAgICAgICAgICAgICAgICAgOAorI2RlZmluZSBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUyAgICAgIE1BWF9MRU5HVEhfT0ZfU1VQUE9SVF9SQVRFUyAvLyAxLCAyLCA1LjUsIDExLCA2LCA5LCAxMiwgMTgsIDI0LCAzNiwgNDgsIDU0CisjZGVmaW5lIE1BWF9MRU5fT0ZfS0VZICAgICAgICAgICAgICAgICAgMzIgICAgICAvLyAzMiBvY3RldHMgPT0gMjU2IGJpdHMsIFJlZGVmaW5lIGZvciBXUEEKKyNkZWZpbmUgTUFYX05VTV9PRl9DSEFOTkVMUyAgICAgICAgICAgICBNQVhfTlVNX09GX0NIUyAgICAgIC8vIDE0IGNoYW5uZWxzIEAyLjRHICsgIDEyQFVOSUkgKyA0IEBNTUFDICsgMTEgQEhpcGVyTEFOMiArIDcgQEphcGFuICsgMSBhcyBOVUxMIHRlcm1pbmF0aW9uCisjZGVmaW5lIE1BWF9OVU1fT0ZfMTFKQ0hBTk5FTFMgICAgICAgICAgICAgMjAgICAgICAvLyAxNCBjaGFubmVscyBAMi40RyArICAxMkBVTklJICsgNCBATU1BQyArIDExIEBIaXBlckxBTjIgKyA3IEBKYXBhbiArIDEgYXMgTlVMTCB0ZXJtaW5hdGlvbgorI2RlZmluZSBNQVhfTEVOX09GX1NTSUQgICAgICAgICAgICAgICAgIDMyCisjZGVmaW5lIENJUEhFUl9URVhUX0xFTiAgICAgICAgICAgICAgICAgMTI4CisjZGVmaW5lIEhBU0hfVEFCTEVfU0laRSAgICAgICAgICAgICAgICAgMjU2CisjZGVmaW5lIE1BWF9WSUVfTEVOICAgICAgICAgICAgICAgICAgICAgMTAyNCAgIC8vIE5ldyBmb3IgV1BBIGNpcGhlciBzdWl0ZSB2YXJpYWJsZSBJRSBzaXplcy4KKyNkZWZpbmUgTUFYX1NVUFBPUlRfTUNTICAgICAgICAgICAgIDMyCisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBBU0lDIFdDSUQgVGFibGUgZGVmaW5pdGlvbi4KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjZGVmaW5lIEJTU0lEX1dDSUQJCTEJLy8gaW4gaW5mcmEgbW9kZSwgYWx3YXlzIHB1dCBic3NpZCB3aXRoIHRoaXMgV0NJRAorI2RlZmluZSBNQ0FTVF9XQ0lECTB4MAorI2RlZmluZSBCU1MwTWNhc3RfV0NJRAkweDAKKyNkZWZpbmUgQlNTMU1jYXN0X1dDSUQJMHhmOAorI2RlZmluZSBCU1MyTWNhc3RfV0NJRAkweGY5CisjZGVmaW5lIEJTUzNNY2FzdF9XQ0lECTB4ZmEKKyNkZWZpbmUgQlNTNE1jYXN0X1dDSUQJMHhmYgorI2RlZmluZSBCU1M1TWNhc3RfV0NJRAkweGZjCisjZGVmaW5lIEJTUzZNY2FzdF9XQ0lECTB4ZmQKKyNkZWZpbmUgQlNTN01jYXN0X1dDSUQJMHhmZQorI2RlZmluZSBSRVNFUlZFRF9XQ0lECQkweGZmCisKKyNkZWZpbmUgTUFYX05VTV9PRl9BQ0xfTElTVAkJCQlNQVhfTlVNQkVSX09GX0FDTAorCisjZGVmaW5lIE1BWF9MRU5fT0ZfTUFDX1RBQkxFICAgICAgICAgICAgTUFYX05VTUJFUl9PRl9NQUMgLy8gaWYgTUFYX01CU1NJRF9OVU0gaXMgOCwgdGhpcyB2YWx1ZSBjYW4ndCBiZSBsYXJnZXIgdGhhbiAyMTEKKworI2lmIE1BWF9MRU5fT0ZfTUFDX1RBQkxFPk1BWF9BVkFJTEFCTEVfQ0xJRU5UX1dDSUQKKyNlcnJvciBNQVhfTEVOX09GX01BQ19UQUJMRSBjYW4gbm90IGJlIGxhcmdlciB0aGFuIE1BWF9BVkFJTEFCTEVfQ0xJRU5UX1dDSUQhISEhCisjZW5kaWYKKworI2RlZmluZSBNQVhfTlVNX09GX1dEU19MSU5LX1BFUkJTU0lECSAgICAgICAgICAgIDMKKyNkZWZpbmUgTUFYX05VTV9PRl9XRFNfTElOSwkgICAgICAgICAgICAoTUFYX05VTV9PRl9XRFNfTElOS19QRVJCU1NJRCpNQVhfTUJTU0lEX05VTSkKKyNkZWZpbmUgTUFYX05VTV9PRl9FVkVOVCAgICAgICAgICAgICAgICBNQVhfTlVNQkVSX09GX0VWRU5UCisjZGVmaW5lIFdEU19MSU5LX1NUQVJUX1dDSUQJCQkJKE1BWF9MRU5fT0ZfTUFDX1RBQkxFLTEpCisKKyNkZWZpbmUgTlVNX09GX1RJRAkJCTgKKyNkZWZpbmUgTUFYX0FJRF9CQSAgICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBNQVhfTEVOX09GX0JBX1JFQ19UQUJMRSAgICAgICAgICAoKE5VTV9PRl9USUQgKiBNQVhfTEVOX09GX01BQ19UQUJMRSkvMikvLyAgIChOVU1fT0ZfVElEKk1BWF9BSURfQkEgKyAzMikJIC8vQmxvY2sgQUNLIHJlY2lwaWVudAorI2RlZmluZSBNQVhfTEVOX09GX0JBX09SSV9UQUJMRSAgICAgICAgICAoKE5VTV9PRl9USUQgKiBNQVhfTEVOX09GX01BQ19UQUJMRSkvMikvLyAgIChOVU1fT0ZfVElEKk1BWF9BSURfQkEgKyAzMikgICAvLyBCbG9jayBBQ0sgb3JpZ2luYXRvcgorI2RlZmluZSBNQVhfTEVOX09GX0JTU19UQUJMRSAgICAgICAgICAgICA2NAorI2RlZmluZSBNQVhfUkVPUkRFUklOR19NUERVX05VTQkJCSA1MTIKKworLy8ga2V5IHJlbGF0ZWQgZGVmaW5pdGlvbnMKKyNkZWZpbmUgU0hBUkVfS0VZX05VTSAgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIE1BWF9MRU5fT0ZfU0hBUkVfS0VZICAgICAgICAgICAgMTYgICAgLy8gYnl0ZSBjb3VudAorI2RlZmluZSBNQVhfTEVOX09GX1BFRVJfS0VZICAgICAgICAgICAgIDE2ICAgIC8vIGJ5dGUgY291bnQKKyNkZWZpbmUgUEFJUldJU0VfS0VZX05VTSAgICAgICAgICAgICAgICA2NCAgICAvLyBpbiBNQUMgQVNJQyBwYWlyd2lzZSBrZXkgdGFibGUKKyNkZWZpbmUgR1JPVVBfS0VZX05VTSAgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIFBNS19MRU4gICAgICAgICAgICAgICAgICAgICAgICAgMzIKKyNkZWZpbmUgV0RTX1BBSVJXSVNFX0tFWV9PRkZTRVQgICAgICAgICA2MCAgICAvLyBXRFMgbGlua3MgdXNlcyBwYWlyd2lzZSBrZXkjNjAgfiA2MyBpbiBBU0lDIHBhaXJ3aXNlIGtleSB0YWJsZQorI2RlZmluZQlQTUtJRF9OTyAgICAgICAgICAgICAgICAgICAgICAgIDQgICAgIC8vIE51bWJlciBvZiBQTUtJRCBzYXZlZCBzdXBwb3J0ZWQKKyNkZWZpbmUgTUFYX0xFTl9PRl9NTE1FX0JVRkZFUiAgICAgICAgICAyMDQ4CisKKy8vIHBvd2VyIHN0YXR1cyByZWxhdGVkIGRlZmluaXRpb25zCisjZGVmaW5lIFBXUl9BQ1RJVkUgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBQV1JfU0FWRSAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgUFdSX01NUFMgICAgICAgICAgICAgICAgICAgICAgICAyCQkJLy9NSU1PIHBvd2VyIHNhdmUKKworLy8gQXV0aCBhbmQgQXNzb2MgbW9kZSByZWxhdGVkIGRlZmluaXRpb25zCisjZGVmaW5lIEFVVEhfTU9ERV9PUEVOICAgICAgICAgICAgICAgICAgMHgwMAorI2RlZmluZSBBVVRIX01PREVfS0VZICAgICAgICAgICAgICAgICAgIDB4MDEKKworLy8gQlNTIFR5cGUgZGVmaW5pdGlvbnMKKyNkZWZpbmUgQlNTX0FESE9DICAgICAgICAgICAgICAgICAgICAgICAwICAvLyA9IE5kaXM4MDJfMTFJQlNTCisjZGVmaW5lIEJTU19JTkZSQSAgICAgICAgICAgICAgICAgICAgICAgMSAgLy8gPSBOZGlzODAyXzExSW5mcmFzdHJ1Y3R1cmUKKyNkZWZpbmUgQlNTX0FOWSAgICAgICAgICAgICAgICAgICAgICAgICAyICAvLyA9IE5kaXM4MDJfMTFBdXRvVW5rbm93bgorI2RlZmluZSBCU1NfTU9OSVRPUgkJCSAgICAgICAgICAgIDMgIC8vID0gTmRpczgwMl8xMU1vbml0b3IKKworCisvLyBSZWFzb24gY29kZSBkZWZpbml0aW9ucworI2RlZmluZSBSRUFTT05fUkVTRVJWRUQgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgUkVBU09OX1VOU1BFQ0lGWSAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFJFQVNPTl9OT19MT05HRVJfVkFMSUQgICAgICAgICAgMgorI2RlZmluZSBSRUFTT05fREVBVVRIX1NUQV9MRUFWSU5HICAgICAgIDMKKyNkZWZpbmUgUkVBU09OX0RJU0FTU09DX0lOQUNUSVZFICAgICAgICA0CisjZGVmaW5lIFJFQVNPTl9ESVNBU1NQQ19BUF9VTkFCTEUgICAgICAgNQorI2RlZmluZSBSRUFTT05fQ0xTMkVSUiAgICAgICAgICAgICAgICAgIDYKKyNkZWZpbmUgUkVBU09OX0NMUzNFUlIgICAgICAgICAgICAgICAgICA3CisjZGVmaW5lIFJFQVNPTl9ESVNBU1NPQ19TVEFfTEVBVklORyAgICAgOAorI2RlZmluZSBSRUFTT05fU1RBX1JFUV9BU1NPQ19OT1RfQVVUSCAgIDkKKyNkZWZpbmUgUkVBU09OX0lOVkFMSURfSUUgICAgICAgICAgICAgICAxMworI2RlZmluZSBSRUFTT05fTUlDX0ZBSUxVUkUgICAgICAgICAgICAgIDE0CisjZGVmaW5lIFJFQVNPTl80X1dBWV9USU1FT1VUICAgICAgICAgICAgMTUKKyNkZWZpbmUgUkVBU09OX0dST1VQX0tFWV9IU19USU1FT1VUICAgICAxNgorI2RlZmluZSBSRUFTT05fSUVfRElGRkVSRU5UICAgICAgICAgICAgIDE3CisjZGVmaW5lIFJFQVNPTl9NQ0lQSEVSX05PVF9WQUxJRCAgICAgICAgMTgKKyNkZWZpbmUgUkVBU09OX1VDSVBIRVJfTk9UX1ZBTElEICAgICAgICAxOQorI2RlZmluZSBSRUFTT05fQUtNUF9OT1RfVkFMSUQgICAgICAgICAgIDIwCisjZGVmaW5lIFJFQVNPTl9VTlNVUFBPUlRfUlNORV9WRVIgICAgICAgMjEKKyNkZWZpbmUgUkVBU09OX0lOVkFMSURfUlNORV9DQVAgICAgICAgICAyMgorI2RlZmluZSBSRUFTT05fODAyMVhfQVVUSF9GQUlMICAgICAgICAgIDIzCisjZGVmaW5lIFJFQVNPTl9DSVBIRVJfU1VJVEVfUkVKRUNURUQgICAgMjQKKyNkZWZpbmUgUkVBU09OX0RFQ0xJTkVEICAgICAgICAgICAgICAgICAzNworCisjZGVmaW5lIFJFQVNPTl9RT1NfVU5TUEVDSUZZICAgICAgICAgICAgICAzMgorI2RlZmluZSBSRUFTT05fUU9TX0xBQ0tfQkFORFdJRFRIICAgICAgICAgMzMKKyNkZWZpbmUgUkVBU09OX1BPT1JfQ0hBTk5FTF9DT05ESVRJT04gICAgIDM0CisjZGVmaW5lIFJFQVNPTl9RT1NfT1VUU0lERV9UWE9QX0xJTUlUSU9OICAzNQorI2RlZmluZSBSRUFTT05fUU9TX1FTVEFfTEVBVklOR19RQlNTICAgICAgMzYKKyNkZWZpbmUgUkVBU09OX1FPU19VTldBTlRFRF9NRUNIQU5JU00gICAgIDM3CisjZGVmaW5lIFJFQVNPTl9RT1NfTUVDSF9TRVRVUF9SRVFVSVJFRCAgICAzOAorI2RlZmluZSBSRUFTT05fUU9TX1JFUVVFU1RfVElNRU9VVCAgICAgICAgMzkKKyNkZWZpbmUgUkVBU09OX1FPU19DSVBIRVJfTk9UX1NVUFBPUlQgICAgIDQ1CisKKy8vIFN0YXR1cyBjb2RlIGRlZmluaXRpb25zCisjZGVmaW5lIE1MTUVfU1VDQ0VTUyAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBNTE1FX1VOU1BFQ0lGWV9GQUlMICAgICAgICAgICAgIDEKKyNkZWZpbmUgTUxNRV9DQU5OT1RfU1VQUE9SVF9DQVAgICAgICAgICAxMAorI2RlZmluZSBNTE1FX1JFQVNTT0NfREVOWV9BU1NPQ19FWElTVCAgIDExCisjZGVmaW5lIE1MTUVfQVNTT0NfREVOWV9PVVRfU0NPUEUgICAgICAgMTIKKyNkZWZpbmUgTUxNRV9BTEdfTk9UX1NVUFBPUlQgICAgICAgICAgICAxMworI2RlZmluZSBNTE1FX1NFUV9OUl9PVVRfT0ZfU0VRVUVOQ0UgICAgIDE0CisjZGVmaW5lIE1MTUVfUkVKX0NIQUxMRU5HRV9GQUlMVVJFICAgICAgMTUKKyNkZWZpbmUgTUxNRV9SRUpfVElNRU9VVCAgICAgICAgICAgICAgICAgIDE2CisjZGVmaW5lIE1MTUVfQVNTT0NfUkVKX1VOQUJMRV9IQU5ETEVfU1RBICAxNworI2RlZmluZSBNTE1FX0FTU09DX1JFSl9EQVRBX1JBVEUgICAgICAgICAgMTgKKworI2RlZmluZSBNTE1FX0FTU09DX1JFSl9OT19FWFRfUkFURSAgICAgICAgMjIKKyNkZWZpbmUgTUxNRV9BU1NPQ19SRUpfTk9fRVhUX1JBVEVfUEJDQyAgIDIzCisjZGVmaW5lIE1MTUVfQVNTT0NfUkVKX05PX0NDS19PRkRNICAgICAgICAyNAorCisjZGVmaW5lIE1MTUVfUU9TX1VOU1BFQ0lGWSAgICAgICAgICAgICAgICAzMgorI2RlZmluZSBNTE1FX1JFUVVFU1RfREVDTElORUQgICAgICAgICAgICAgMzcKKyNkZWZpbmUgTUxNRV9SRVFVRVNUX1dJVEhfSU5WQUxJRF9QQVJBTSAgIDM4CisjZGVmaW5lIE1MTUVfRExTX05PVF9BTExPV19JTl9RQlNTICAgICAgICA0OAorI2RlZmluZSBNTE1FX0RFU1RfU1RBX05PVF9JTl9RQlNTICAgICAgICAgNDkKKyNkZWZpbmUgTUxNRV9ERVNUX1NUQV9JU19OT1RfQV9RU1RBICAgICAgIDUwCisKKyNkZWZpbmUgTUxNRV9JTlZBTElEX0ZPUk1BVCAgICAgICAgICAgICAweDUxCisjZGVmaW5lIE1MTUVfRkFJTF9OT19SRVNPVVJDRSAgICAgICAgICAgMHg1MgorI2RlZmluZSBNTE1FX1NUQVRFX01BQ0hJTkVfUkVKRUNUICAgICAgIDB4NTMKKyNkZWZpbmUgTUxNRV9NQUNfVEFCTEVfRkFJTCAgICAgICAgICAgICAweDU0CisKKy8vIElFIGNvZGUKKyNkZWZpbmUgSUVfU1NJRCAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIElFX1NVUFBfUkFURVMgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBJRV9GSF9QQVJNICAgICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgSUVfRFNfUEFSTSAgICAgICAgICAgICAgICAgICAgICAzCisjZGVmaW5lIElFX0NGX1BBUk0gICAgICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBJRV9USU0gICAgICAgICAgICAgICAgICAgICAgICAgIDUKKyNkZWZpbmUgSUVfSUJTU19QQVJNICAgICAgICAgICAgICAgICAgICA2CisjZGVmaW5lIElFX0NPVU5UUlkgICAgICAgICAgICAgICAgICAgICAgNyAgICAgLy8gODAyLjExZAorI2RlZmluZSBJRV84MDJfMTFEX1JFUVVFU1QgICAgICAgICAgICAgIDEwICAgIC8vIDgwMi4xMWQKKyNkZWZpbmUgSUVfUUJTU19MT0FEICAgICAgICAgICAgICAgICAgICAxMSAgICAvLyA4MDIuMTFlIGQ5CisjZGVmaW5lIElFX0VEQ0FfUEFSQU1FVEVSICAgICAgICAgICAgICAgMTIgICAgLy8gODAyLjExZSBkOQorI2RlZmluZSBJRV9UU1BFQyAgICAgICAgICAgICAgICAgICAgICAgIDEzICAgIC8vIDgwMi4xMWUgZDkKKyNkZWZpbmUgSUVfVENMQVMgICAgICAgICAgICAgICAgICAgICAgICAxNCAgICAvLyA4MDIuMTFlIGQ5CisjZGVmaW5lIElFX1NDSEVEVUxFICAgICAgICAgICAgICAgICAgICAgMTUgICAgLy8gODAyLjExZSBkOQorI2RlZmluZSBJRV9DSEFMTEVOR0VfVEVYVCAgICAgICAgICAgICAgIDE2CisjZGVmaW5lIElFX1BPV0VSX0NPTlNUUkFJTlQgICAgICAgICAgICAgMzIgICAgLy8gODAyLjExaCBkMy4zCisjZGVmaW5lIElFX1BPV0VSX0NBUEFCSUxJVFkgICAgICAgICAgICAgMzMgICAgLy8gODAyLjExaCBkMy4zCisjZGVmaW5lIElFX1RQQ19SRVFVRVNUICAgICAgICAgICAgICAgICAgMzQgICAgLy8gODAyLjExaCBkMy4zCisjZGVmaW5lIElFX1RQQ19SRVBPUlQgICAgICAgICAgICAgICAgICAgMzUgICAgLy8gODAyLjExaCBkMy4zCisjZGVmaW5lIElFX1NVUFBfQ0hBTk5FTFMgICAgICAgICAgICAgICAgMzYgICAgLy8gODAyLjExaCBkMy4zCisjZGVmaW5lIElFX0NIQU5ORUxfU1dJVENIX0FOTk9VTkNFTUVOVCAgMzcgICAgLy8gODAyLjExaCBkMy4zCisjZGVmaW5lIElFX01FQVNVUkVNRU5UX1JFUVVFU1QgICAgICAgICAgMzggICAgLy8gODAyLjExaCBkMy4zCisjZGVmaW5lIElFX01FQVNVUkVNRU5UX1JFUE9SVCAgICAgICAgICAgMzkgICAgLy8gODAyLjExaCBkMy4zCisjZGVmaW5lIElFX1FVSUVUICAgICAgICAgICAgICAgICAgICAgICAgNDAgICAgLy8gODAyLjExaCBkMy4zCisjZGVmaW5lIElFX0lCU1NfREZTICAgICAgICAgICAgICAgICAgICAgNDEgICAgLy8gODAyLjExaCBkMy4zCisjZGVmaW5lIElFX0VSUCAgICAgICAgICAgICAgICAgICAgICAgICAgNDIgICAgLy8gODAyLjExZworI2RlZmluZSBJRV9UU19ERUxBWSAgICAgICAgICAgICAgICAgICAgIDQzICAgIC8vIDgwMi4xMWUgZDkKKyNkZWZpbmUgSUVfVENMQVNfUFJPQ0VTU0lORyAgICAgICAgICAgICA0NCAgICAvLyA4MDIuMTFlIGQ5CisjZGVmaW5lIElFX1FPU19DQVBBQklMSVRZICAgICAgICAgICAgICAgNDYgICAgLy8gODAyLjExZSBkNgorI2RlZmluZSBJRV9IVF9DQVAgICAgICAgICAgICAgICAgICAgICAgIDQ1ICAgIC8vIDgwMi4xMW4gZDEuIEhUIENBUEFCSUxJVFkuIEVMRU1FTlQgSUQgVEJECisjZGVmaW5lIElFX0FQX0NIQU5ORUxfUkVQT1JUCQkJNTEgICAgLy8gODAyLjExayBkNgorI2RlZmluZSBJRV9IVF9DQVAyICAgICAgICAgICAgICAgICAgICAgICAgIDUyICAgIC8vIDgwMi4xMW4gZDEuIEhUIENBUEFCSUxJVFkuIEVMRU1FTlQgSUQgVEJECisjZGVmaW5lIElFX1JTTiAgICAgICAgICAgICAgICAgICAgICAgICAgNDggICAgLy8gODAyLjExaSBkMy4wCisjZGVmaW5lIElFX1dQQTIgICAgICAgICAgICAgICAgICAgICAgICAgNDggICAgLy8gV1BBMgorI2RlZmluZSBJRV9FWFRfU1VQUF9SQVRFUyAgICAgICAgICAgICAgIDUwICAgIC8vIDgwMi4xMWcKKyNkZWZpbmUgSUVfU1VQUF9SRUdfQ0xBU1MgICAgICAgICAgICAgICA1OSAgICAvLyA4MDIuMTF5LiBTdXBwb3J0ZWQgcmVndWxhdG9yeSBjbGFzc2VzLgorI2RlZmluZSBJRV9FWFRfQ0hBTk5FTF9TV0lUQ0hfQU5OT1VOQ0VNRU5UCTYwCS8vIDgwMi4xMW4KKyNkZWZpbmUgSUVfQUREX0hUICAgICAgICAgICAgICAgICAgICAgICAgIDYxICAgIC8vIDgwMi4xMW4gZDEuIEFERElUSU9OQUwgSFQgQ0FQQUJJTElUWS4gRUxFTUVOVCBJRCBUQkQKKyNkZWZpbmUgSUVfQUREX0hUMiAgICAgICAgICAgICAgICAgICAgICAgIDUzICAgIC8vIDgwMi4xMW4gZDEuIEFERElUSU9OQUwgSFQgQ0FQQUJJTElUWS4gRUxFTUVOVCBJRCBUQkQKKworCisvLyBGb3IgODAyLjExbiBEMy4wMworLy8jZGVmaW5lIElFX05FV19FWFRfQ0hBX09GRlNFVCAgICAgICAgICAgICA2MiAgICAvLyA4MDIuMTFuIGQxLiBOZXcgZXh0ZW5zaW9uIGNoYW5uZWwgb2Zmc2V0IGVsZW1ldAorI2RlZmluZSBJRV9TRUNPTkRBUllfQ0hfT0ZGU0VUCQk2MgkvLyA4MDIuMTFuIEQzLjAzCVNlY29uZGFyeSBDaGFubmVsIE9mZnNldCBlbGVtZW50CisjZGVmaW5lIElFXzIwNDBfQlNTX0NPRVhJU1QgICAgICAgICAgICAgICA3MiAgICAvLyA4MDIuMTFuIEQzLjAuMworI2RlZmluZSBJRV8yMDQwX0JTU19JTlRPTEVSQU5UX1JFUE9SVCAgICAgNzMgICAgLy8gODAyLjExbiBEMy4wMworI2RlZmluZSBJRV9PVkVSTEFQQlNTX1NDQU5fUEFSTSAgICAgICAgICAgNzQgICAgLy8gODAyLjExbiBEMy4wMworI2RlZmluZSBJRV9FWFRfQ0FQQUJJTElUWSAgICAgICAgICAgICAgICAxMjcgICAvLyA4MDIuMTFuIEQzLjAzCisKKworI2RlZmluZSBJRV9XUEEgICAgICAgICAgICAgICAgICAgICAgICAgIDIyMSAgIC8vIFdQQQorI2RlZmluZSBJRV9WRU5ET1JfU1BFQ0lGSUMgICAgICAgICAgICAgIDIyMSAgIC8vIFdpZmkgV01NIChXTUUpCisKKyNkZWZpbmUgT1VJX0JST0FEQ09NX0hUICAgICAgICAgICAgICA1MSAgIC8vCisjZGVmaW5lIE9VSV9CUk9BRENPTV9IVEFERCAgICAgICAgICAgICAgNTIgICAvLworI2RlZmluZSBPVUlfUFJFTl9IVF9DQVAgICAgICAgICAgICAgIDUxICAgLy8KKyNkZWZpbmUgT1VJX1BSRU5fQUREX0hUICAgICAgICAgICAgICA1MiAgIC8vCisKKy8vIENDWCBpbmZvcm1hdGlvbgorI2RlZmluZSBJRV9BSVJPTkVUX0NLSVAgICAgICAgICAgICAgICAgIDEzMyAgIC8vIENDWDEuMCBJRCA4NUggZm9yIENLSVAKKyNkZWZpbmUgSUVfQVBfVFhfUE9XRVIgICAgICAgICAgICAgICAgICAxNTAgICAvLyBDQ1ggMi4wIGZvciBBUCB0cmFuc21pdCBwb3dlcgorI2RlZmluZSBJRV9NRUFTVVJFTUVOVF9DQVBBQklMSVRZICAgICAgIDIyMSAgIC8vIENDWCAyLjAKKyNkZWZpbmUgSUVfQ0NYX1YyICAgICAgICAgICAgICAgICAgICAgICAyMjEKKyNkZWZpbmUgSUVfQUlST05FVF9JUEFERFJFU1MgICAgICAgICAgICAxNDkgICAvLyBDQ1ggSUQgOTVIIGZvciBJUCBBZGRyZXNzCisjZGVmaW5lIElFX0FJUk9ORVRfQ0NLTVJFQVNTT0MgICAgICAgICAgMTU2ICAgLy8gQ0NYIElEIDlDSCBmb3IgQ0NLTSBSZWFzc29jaWF0aW9uIFJlcXVlc3QgZWxlbWVudAorI2RlZmluZSBDS0lQX05FR09USUFUSU9OX0xFTkdUSCAgICAgICAgIDMwCisjZGVmaW5lIEFJUk9ORVRfSVBBRERSRVNTX0xFTkdUSCAgICAgICAgMTAKKyNkZWZpbmUgQUlST05FVF9DQ0tNUkVBU1NPQ19MRU5HVEggICAgICAyNAorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gTUxNRSBzdGF0ZSBtYWNoaW5lIGRlZmluaXRpb24KKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKy8vIFNUQSBNTE1FIHN0YXRlIG1haGNpbmVzCisjZGVmaW5lIEFTU09DX1NUQVRFX01BQ0hJTkUgICAgICAgICAgICAgMQorI2RlZmluZSBBVVRIX1NUQVRFX01BQ0hJTkUgICAgICAgICAgICAgIDIKKyNkZWZpbmUgQVVUSF9SU1BfU1RBVEVfTUFDSElORSAgICAgICAgICAzCisjZGVmaW5lIFNZTkNfU1RBVEVfTUFDSElORSAgICAgICAgICAgICAgNAorI2RlZmluZSBNTE1FX0NOVExfU1RBVEVfTUFDSElORSAgICAgICAgIDUKKyNkZWZpbmUgV1BBX1BTS19TVEFURV9NQUNISU5FICAgICAgICAgICA2CisjZGVmaW5lIExFQVBfU1RBVEVfTUFDSElORSAgICAgICAgICAgICAgNworI2RlZmluZSBBSVJPTkVUX1NUQVRFX01BQ0hJTkUgICAgICAgICAgIDgKKyNkZWZpbmUgQUNUSU9OX1NUQVRFX01BQ0hJTkUgICAgICAgICAgIDkKKworLy8gQVAgTUxNRSBzdGF0ZSBtYWNoaW5lcworI2RlZmluZSBBUF9BU1NPQ19TVEFURV9NQUNISU5FICAgICAgICAgIDExCisjZGVmaW5lIEFQX0FVVEhfU1RBVEVfTUFDSElORSAgICAgICAgICAgMTIKKyNkZWZpbmUgQVBfQVVUSF9SU1BfU1RBVEVfTUFDSElORSAgICAgICAxMworI2RlZmluZSBBUF9TWU5DX1NUQVRFX01BQ0hJTkUgICAgICAgICAgIDE0CisjZGVmaW5lIEFQX0NOVExfU1RBVEVfTUFDSElORSAgICAgICAgICAgMTUKKyNkZWZpbmUgQVBfV1BBX1NUQVRFX01BQ0hJTkUgICAgICAgICAgICAxNgorCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisjZGVmaW5lIERMU19TVEFURV9NQUNISU5FICAgICAgICAgICAgICAgMjYKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKworLy8KKy8vIFNUQSdzIENPTlRST0wvQ09OTkVDVCBzdGF0ZSBtYWNoaW5lOiBzdGF0ZXMsIGV2ZW50cywgdG90YWwgZnVuY3Rpb24gIworLy8KKyNkZWZpbmUgQ05UTF9JRExFICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIENOVExfV0FJVF9ESVNBU1NPQyAgICAgICAgICAgICAgMQorI2RlZmluZSBDTlRMX1dBSVRfSk9JTiAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgQ05UTF9XQUlUX1JFQVNTT0MgICAgICAgICAgICAgICAzCisjZGVmaW5lIENOVExfV0FJVF9TVEFSVCAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBDTlRMX1dBSVRfQVVUSCAgICAgICAgICAgICAgICAgIDUKKyNkZWZpbmUgQ05UTF9XQUlUX0FTU09DICAgICAgICAgICAgICAgICA2CisjZGVmaW5lIENOVExfV0FJVF9BVVRIMiAgICAgICAgICAgICAgICAgNworI2RlZmluZSBDTlRMX1dBSVRfT0lEX0xJU1RfU0NBTiAgICAgICAgIDgKKyNkZWZpbmUgQ05UTF9XQUlUX09JRF9ESVNBU1NPQyAgICAgICAgICA5CisKKyNkZWZpbmUgTVQyX0FTU09DX0NPTkYgICAgICAgICAgICAgICAgICAzNAorI2RlZmluZSBNVDJfQVVUSF9DT05GICAgICAgICAgICAgICAgICAgIDM1CisjZGVmaW5lIE1UMl9ERUFVVEhfQ09ORiAgICAgICAgICAgICAgICAgMzYKKyNkZWZpbmUgTVQyX0RJU0FTU09DX0NPTkYgICAgICAgICAgICAgICAzNworI2RlZmluZSBNVDJfUkVBU1NPQ19DT05GICAgICAgICAgICAgICAgIDM4CisjZGVmaW5lIE1UMl9QV1JfTUdNVF9DT05GICAgICAgICAgICAgICAgMzkKKyNkZWZpbmUgTVQyX0pPSU5fQ09ORiAgICAgICAgICAgICAgICAgICA0MAorI2RlZmluZSBNVDJfU0NBTl9DT05GICAgICAgICAgICAgICAgICAgIDQxCisjZGVmaW5lIE1UMl9TVEFSVF9DT05GICAgICAgICAgICAgICAgICAgNDIKKyNkZWZpbmUgTVQyX0dFVF9DT05GICAgICAgICAgICAgICAgICAgICA0MworI2RlZmluZSBNVDJfU0VUX0NPTkYgICAgICAgICAgICAgICAgICAgIDQ0CisjZGVmaW5lIE1UMl9SRVNFVF9DT05GICAgICAgICAgICAgICAgICAgNDUKKyNkZWZpbmUgTVQyX01MTUVfUk9BTUlOR19SRVEgICAgICAgICAgICA1MgorCisjZGVmaW5lIENOVExfRlVOQ19TSVpFICAgICAgICAgICAgICAgICAgMQorCisvLworLy8gU1RBJ3MgQVNTT0Mgc3RhdGUgbWFjaGluZTogc3RhdGVzLCBldmVudHMsIHRvdGFsIGZ1bmN0aW9uICMKKy8vCisjZGVmaW5lIEFTU09DX0lETEUgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBBU1NPQ19XQUlUX1JTUCAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgUkVBU1NPQ19XQUlUX1JTUCAgICAgICAgICAgICAgICAyCisjZGVmaW5lIERJU0FTU09DX1dBSVRfUlNQICAgICAgICAgICAgICAgMworI2RlZmluZSBNQVhfQVNTT0NfU1RBVEUgICAgICAgICAgICAgICAgIDQKKworI2RlZmluZSBBU1NPQ19NQUNISU5FX0JBU0UgICAgICAgICAgICAgIDAKKyNkZWZpbmUgTVQyX01MTUVfQVNTT0NfUkVRICAgICAgICAgICAgICAwCisjZGVmaW5lIE1UMl9NTE1FX1JFQVNTT0NfUkVRICAgICAgICAgICAgMQorI2RlZmluZSBNVDJfTUxNRV9ESVNBU1NPQ19SRVEgICAgICAgICAgIDIKKyNkZWZpbmUgTVQyX1BFRVJfRElTQVNTT0NfUkVRICAgICAgICAgICAzCisjZGVmaW5lIE1UMl9QRUVSX0FTU09DX1JFUSAgICAgICAgICAgICAgNAorI2RlZmluZSBNVDJfUEVFUl9BU1NPQ19SU1AgICAgICAgICAgICAgIDUKKyNkZWZpbmUgTVQyX1BFRVJfUkVBU1NPQ19SRVEgICAgICAgICAgICA2CisjZGVmaW5lIE1UMl9QRUVSX1JFQVNTT0NfUlNQICAgICAgICAgICAgNworI2RlZmluZSBNVDJfRElTQVNTT0NfVElNRU9VVCAgICAgICAgICAgIDgKKyNkZWZpbmUgTVQyX0FTU09DX1RJTUVPVVQgICAgICAgICAgICAgICA5CisjZGVmaW5lIE1UMl9SRUFTU09DX1RJTUVPVVQgICAgICAgICAgICAgMTAKKyNkZWZpbmUgTUFYX0FTU09DX01TRyAgICAgICAgICAgICAgICAgICAxMQorCisjZGVmaW5lIEFTU09DX0ZVTkNfU0laRSAgICAgICAgICAgICAgICAgKE1BWF9BU1NPQ19TVEFURSAqIE1BWF9BU1NPQ19NU0cpCisKKy8vCisvLyBBQ1Qgc3RhdGUgbWFjaGluZTogc3RhdGVzLCBldmVudHMsIHRvdGFsIGZ1bmN0aW9uICMKKy8vCisjZGVmaW5lIEFDVF9JRExFICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgTUFYX0FDVF9TVEFURSAgICAgICAgICAgICAgICAgMQorCisjZGVmaW5lIEFDVF9NQUNISU5FX0JBU0UgICAgICAgICAgICAgIDAKKworLy9UaG9zZSBQRUVSX3h4X0NBVEUgbnVtYmVyIGlzIGJhc2VkIG9uIHJlYWwgQ2F0ZWdhcnkgdmFsdWUgaW4gSUVFRSBzcGVjLiBQbGVhc2UgZG9uJ2VzIG1vZGlmeSBpdCBieSB5b3VyIHNlbGYuCisvL0NhdGVnb3J5CisjZGVmaW5lIE1UMl9QRUVSX1NQRUNUUlVNX0NBVEUgICAgICAgICAgICAgIDAKKyNkZWZpbmUgTVQyX1BFRVJfUU9TX0NBVEUgICAgICAgICAgICAgIDEKKyNkZWZpbmUgTVQyX1BFRVJfRExTX0NBVEUgICAgICAgICAgICAgMgorI2RlZmluZSBNVDJfUEVFUl9CQV9DQVRFICAgICAgICAgICAgIDMKKyNkZWZpbmUgTVQyX1BFRVJfUFVCTElDX0NBVEUgICAgICAgICAgICAgNAorI2RlZmluZSBNVDJfUEVFUl9STV9DQVRFICAgICAgICAgICAgIDUKKyNkZWZpbmUgTVQyX1BFRVJfSFRfQ0FURSAgICAgICAgICAgICA3CS8vCTcuNC43CisjZGVmaW5lIE1BWF9QRUVSX0NBVEVfTVNHICAgICAgICAgICAgICAgICAgIDcKKyNkZWZpbmUgTVQyX01MTUVfQUREX0JBX0NBVEUgICAgICAgICAgICAgOAorI2RlZmluZSBNVDJfTUxNRV9PUklfREVMQkFfQ0FURSAgICAgICAgICAgICA5CisjZGVmaW5lIE1UMl9NTE1FX1JFQ19ERUxCQV9DQVRFICAgICAgICAgICAgIDEwCisjZGVmaW5lIE1UMl9NTE1FX1FPU19DQVRFICAgICAgICAgICAgICAxMQorI2RlZmluZSBNVDJfTUxNRV9ETFNfQ0FURSAgICAgICAgICAgICAxMgorI2RlZmluZSBNVDJfQUNUX0lOVkFMSUQgICAgICAgICAgICAgMTMKKyNkZWZpbmUgTUFYX0FDVF9NU0cgICAgICAgICAgICAgICAgICAgMTQKKworLy9DYXRlZ29yeSBmaWVsZAorI2RlZmluZSBDQVRFR09SWV9TUEVDVFJVTQkJMAorI2RlZmluZSBDQVRFR09SWV9RT1MJCQkxCisjZGVmaW5lIENBVEVHT1JZX0RMUwkJCTIKKyNkZWZpbmUgQ0FURUdPUllfQkEJCQkzCisjZGVmaW5lIENBVEVHT1JZX1BVQkxJQwkJNAorI2RlZmluZSBDQVRFR09SWV9STQkJCTUKKyNkZWZpbmUgQ0FURUdPUllfSFQJCQk3CisKKworLy8gRExTIEFjdGlvbiBmcmFtZSBkZWZpbml0aW9uCisjZGVmaW5lIEFDVElPTl9ETFNfUkVRVUVTVAkJCTAKKyNkZWZpbmUgQUNUSU9OX0RMU19SRVNQT05TRQkJCTEKKyNkZWZpbmUgQUNUSU9OX0RMU19URUFSRE9XTgkJCTIKKworLy9TcGVjdHJ1bSAgQWN0aW9uIGZpZWxkIHZhbHVlIDgwMi4xMWggNy40LjEKKyNkZWZpbmUgU1BFQ19NUlEJMAkvLyBSZXF1ZXN0CisjZGVmaW5lIFNQRUNfTVJQCTEJLy9SZXBvcnQKKyNkZWZpbmUgU1BFQ19UUENSUQkyCisjZGVmaW5lIFNQRUNfVFBDUlAJMworI2RlZmluZSBTUEVDX0NIQU5ORUxfU1dJVENICTQKKworCisvL0JBICBBY3Rpb24gZmllbGQgdmFsdWUKKyNkZWZpbmUgQUREQkFfUkVRCTAKKyNkZWZpbmUgQUREQkFfUkVTUAkxCisjZGVmaW5lIERFTEJBICAgMgorCisvL1B1YmxpYydzICBBY3Rpb24gZmllbGQgdmFsdWUgaW4gUHVibGljIENhdGVnb3J5LiAgU29tZSBpbiA4MDIuMTF5IGFuZCBzb21lIGluIDExbgorI2RlZmluZSBBQ1RJT05fQlNTXzIwNDBfQ09FWElTVAkJCQkwCS8vIDExbgorI2RlZmluZSBBQ1RJT05fRFNFX0VOQUJMRU1FTlQJCQkJCTEJLy8gMTF5IEQ5LjAKKyNkZWZpbmUgQUNUSU9OX0RTRV9ERUVOQUJMRU1FTlQJCQkJMgkvLyAxMXkgRDkuMAorI2RlZmluZSBBQ1RJT05fRFNFX1JFR19MT0NBVElPTl9BTk5PVU5DRQkzCS8vIDExeSBEOS4wCisjZGVmaW5lIEFDVElPTl9FWFRfQ0hfU1dJVENIX0FOTk9VTkNFCQk0CS8vIDExeSBEOS4wCisjZGVmaW5lIEFDVElPTl9EU0VfTUVBU1VSRU1FTlRfUkVRCQkJNQkvLyAxMXkgRDkuMAorI2RlZmluZSBBQ1RJT05fRFNFX01FQVNVUkVNRU5UX1JFUE9SVAkJNgkvLyAxMXkgRDkuMAorI2RlZmluZSBBQ1RJT05fTUVBU1VSRU1FTlRfUElMT1RfQUNUSU9OCQk3ICAJLy8gMTF5IEQ5LjAKKyNkZWZpbmUgQUNUSU9OX0RTRV9QT1dFUl9DT05TVFJBSU5UCQkJOAkvLyAxMXkgRDkuMAorCisKKy8vSFQgIEFjdGlvbiBmaWVsZCB2YWx1ZQorI2RlZmluZSBOT1RJRllfQldfQUNUSU9OCQkJCTAKKyNkZWZpbmUgU01QU19BQ1RJT04JCQkJCQkxCisjZGVmaW5lIFBTTVBfQUNUSU9OICAgCQkJCQkyCisjZGVmaW5lIFNFVFBDT19BQ1RJT04JCQkJCTMKKyNkZWZpbmUgTUlNT19DSEFfTUVBU1VSRV9BQ1RJT04JCQk0CisjZGVmaW5lIE1JTU9fTl9CRUFDT05GT1JNCQkJCTUKKyNkZWZpbmUgTUlNT19CRUFDT05GT1JNCQkJCQk2CisjZGVmaW5lIEFOVEVOTkFfU0VMRUNUCQkJCQk3CisjZGVmaW5lIEhUX0lORk9fRVhDSEFOR0UJCQkJOAorCisjZGVmaW5lIEFDVF9GVU5DX1NJWkUgICAgICAgICAgICAgICAgIChNQVhfQUNUX1NUQVRFICogTUFYX0FDVF9NU0cpCisvLworLy8gU1RBJ3MgQVVUSEVOVElDQVRJT04gc3RhdGUgbWFjaGluZTogc3RhdGVzLCBldnZlbnRzLCB0b3RhbCBmdW5jdGlvbiAjCisvLworI2RlZmluZSBBVVRIX1JFUV9JRExFICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQVVUSF9XQUlUX1NFUTIgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEFVVEhfV0FJVF9TRVE0ICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBNQVhfQVVUSF9TVEFURSAgICAgICAgICAgICAgICAgIDMKKworI2RlZmluZSBBVVRIX01BQ0hJTkVfQkFTRSAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgTVQyX01MTUVfQVVUSF9SRVEgICAgICAgICAgICAgICAwCisjZGVmaW5lIE1UMl9QRUVSX0FVVEhfRVZFTiAgICAgICAgICAgICAgMQorI2RlZmluZSBNVDJfQVVUSF9USU1FT1VUICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgTUFYX0FVVEhfTVNHICAgICAgICAgICAgICAgICAgICAzCisKKyNkZWZpbmUgQVVUSF9GVU5DX1NJWkUgICAgICAgICAgICAgICAgICAoTUFYX0FVVEhfU1RBVEUgKiBNQVhfQVVUSF9NU0cpCisKKy8vCisvLyBTVEEncyBBVVRIX1JTUCBzdGF0ZSBtYWNoaW5lOiBzdGF0ZXMsIGV2ZW50cywgdG90YWwgZnVuY3Rpb24gIworLy8KKyNkZWZpbmUgQVVUSF9SU1BfSURMRSAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEFVVEhfUlNQX1dBSVRfQ0hBTCAgICAgICAgICAgICAgMQorI2RlZmluZSBNQVhfQVVUSF9SU1BfU1RBVEUgICAgICAgICAgICAgIDIKKworI2RlZmluZSBBVVRIX1JTUF9NQUNISU5FX0JBU0UgICAgICAgICAgIDAKKyNkZWZpbmUgTVQyX0FVVEhfQ0hBTExFTkdFX1RJTUVPVVQgICAgICAwCisjZGVmaW5lIE1UMl9QRUVSX0FVVEhfT0REICAgICAgICAgICAgICAgMQorI2RlZmluZSBNVDJfUEVFUl9ERUFVVEggICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgTUFYX0FVVEhfUlNQX01TRyAgICAgICAgICAgICAgICAzCisKKyNkZWZpbmUgQVVUSF9SU1BfRlVOQ19TSVpFICAgICAgICAgICAgICAoTUFYX0FVVEhfUlNQX1NUQVRFICogTUFYX0FVVEhfUlNQX01TRykKKworLy8KKy8vIFNUQSdzIFNZTkMgc3RhdGUgbWFjaGluZTogc3RhdGVzLCBldmVudHMsIHRvdGFsIGZ1bmN0aW9uICMKKy8vCisjZGVmaW5lIFNZTkNfSURMRSAgICAgICAgICAgICAgICAgICAgICAgMCAgLy8gbWVyZ2UgTk9fQlNTLElCU1NfSURMRSxJQlNTX0FDVElWRSBhbmQgQlNTIGluIHRvIDEgc3RhdGUKKyNkZWZpbmUgSk9JTl9XQUlUX0JFQUNPTiAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFNDQU5fTElTVEVOICAgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBNQVhfU1lOQ19TVEFURSAgICAgICAgICAgICAgICAgIDMKKworI2RlZmluZSBTWU5DX01BQ0hJTkVfQkFTRSAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgTVQyX01MTUVfU0NBTl9SRVEgICAgICAgICAgICAgICAwCisjZGVmaW5lIE1UMl9NTE1FX0pPSU5fUkVRICAgICAgICAgICAgICAgMQorI2RlZmluZSBNVDJfTUxNRV9TVEFSVF9SRVEgICAgICAgICAgICAgIDIKKyNkZWZpbmUgTVQyX1BFRVJfQkVBQ09OICAgICAgICAgICAgICAgICAzCisjZGVmaW5lIE1UMl9QRUVSX1BST0JFX1JTUCAgICAgICAgICAgICAgNAorI2RlZmluZSBNVDJfUEVFUl9BVElNICAgICAgICAgICAgICAgICAgIDUKKyNkZWZpbmUgTVQyX1NDQU5fVElNRU9VVCAgICAgICAgICAgICAgICA2CisjZGVmaW5lIE1UMl9CRUFDT05fVElNRU9VVCAgICAgICAgICAgICAgNworI2RlZmluZSBNVDJfQVRJTV9USU1FT1VUICAgICAgICAgICAgICAgIDgKKyNkZWZpbmUgTVQyX1BFRVJfUFJPQkVfUkVRICAgICAgICAgICAgICA5CisjZGVmaW5lIE1BWF9TWU5DX01TRyAgICAgICAgICAgICAgICAgICAgMTAKKworI2RlZmluZSBTWU5DX0ZVTkNfU0laRSAgICAgICAgICAgICAgICAgIChNQVhfU1lOQ19TVEFURSAqIE1BWF9TWU5DX01TRykKKworLy9NZXNzYWdlcyBmb3IgdGhlIERMUyBzdGF0ZSBtYWNoaW5lCisjZGVmaW5lIERMU19JRExFCQkJCQkJMAorI2RlZmluZSBNQVhfRExTX1NUQVRFCQkJCQkxCisKKyNkZWZpbmUgRExTX01BQ0hJTkVfQkFTRQkJCQkwCisjZGVmaW5lIE1UMl9NTE1FX0RMU19SRVEJCQkgICAgMAorI2RlZmluZSBNVDJfUEVFUl9ETFNfUkVRCQkJICAgIDEKKyNkZWZpbmUgTVQyX1BFRVJfRExTX1JTUAkJCSAgICAyCisjZGVmaW5lIE1UMl9NTE1FX0RMU19URUFSX0RPV04JCSAgICAzCisjZGVmaW5lIE1UMl9QRUVSX0RMU19URUFSX0RPV04JCSAgICA0CisjZGVmaW5lIE1BWF9ETFNfTVNHCQkJCSAgICAgICAgNQorCisjZGVmaW5lIERMU19GVU5DX1NJWkUJCQkJCShNQVhfRExTX1NUQVRFICogTUFYX0RMU19NU0cpCisKKy8vCisvLyBTVEEncyBXUEEtUFNLIFN0YXRlIG1hY2hpbmU6IHN0YXRlcywgZXZlbnRzLCB0b3RhbCBmdW5jdGlvbiAjCisvLworI2RlZmluZSBXUEFfUFNLX0lETEUJCQkJCTAKKyNkZWZpbmUgTUFYX1dQQV9QU0tfU1RBVEUJCQkJMQorCisjZGVmaW5lIFdQQV9NQUNISU5FX0JBU0UgICAgICAgICAgICAgICAgMAorI2RlZmluZSBNVDJfRUFQUGFja2V0ICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgTVQyX0VBUE9MU3RhcnQgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIE1UMl9FQVBPTExvZ29mZiAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBNVDJfRUFQT0xLZXkgICAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgTVQyX0VBUE9MQVNGQWxlcnQgICAgICAgICAgICAgICA0CisjZGVmaW5lIE1BWF9XUEFfUFNLX01TRyAgICAgICAgICAgICAgICAgNQorCisjZGVmaW5lCVdQQV9QU0tfRlVOQ19TSVpFCQkJCShNQVhfV1BBX1BTS19TVEFURSAqIE1BWF9XUEFfUFNLX01TRykKKworLy8KKy8vIFNUQSdzIENJU0NPLUFJUk9ORVQgU3RhdGUgbWFjaGluZTogc3RhdGVzLCBldmVudHMsIHRvdGFsIGZ1bmN0aW9uICMKKy8vCisjZGVmaW5lIEFJUk9ORVRfSURMRQkJCQkJMAorI2RlZmluZQlBSVJPTkVUX1NDQU5OSU5HCQkJCTEKKyNkZWZpbmUgTUFYX0FJUk9ORVRfU1RBVEUJCQkJMgorCisjZGVmaW5lIEFJUk9ORVRfTUFDSElORV9CQVNFCQkgICAgMAorI2RlZmluZSBNVDJfQUlST05FVF9NU0cJCQkJICAgIDAKKyNkZWZpbmUgTVQyX0FJUk9ORVRfU0NBTl9SRVEJCSAgICAxCisjZGVmaW5lIE1UMl9BSVJPTkVUX1NDQU5fRE9ORQkJICAgIDIKKyNkZWZpbmUgTUFYX0FJUk9ORVRfTVNHCQkJCSAgICAzCisKKyNkZWZpbmUJQUlST05FVF9GVU5DX1NJWkUJCQkJKE1BWF9BSVJPTkVUX1NUQVRFICogTUFYX0FJUk9ORVRfTVNHKQorCisvLworLy8gQVAncyBDT05UUk9ML0NPTk5FQ1Qgc3RhdGUgbWFjaGluZTogc3RhdGVzLCBldmVudHMsIHRvdGFsIGZ1bmN0aW9uICMKKy8vCisjZGVmaW5lIEFQX0NOVExfRlVOQ19TSVpFICAgICAgICAgICAgICAgMQorCisvLworLy8gQVAncyBBU1NPQyBzdGF0ZSBtYWNoaW5lOiBzdGF0ZXMsIGV2ZW50cywgdG90YWwgZnVuY3Rpb24gIworLy8KKyNkZWZpbmUgQVBfQVNTT0NfSURMRSAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEFQX01BWF9BU1NPQ19TVEFURSAgICAgICAgICAgICAgMQorCisjZGVmaW5lIEFQX0FTU09DX01BQ0hJTkVfQkFTRSAgICAgICAgICAgMAorI2RlZmluZSBBUE1UMl9NTE1FX0RJU0FTU09DX1JFUSAgICAgICAgIDAKKyNkZWZpbmUgQVBNVDJfUEVFUl9ESVNBU1NPQ19SRVEgICAgICAgICAxCisjZGVmaW5lIEFQTVQyX1BFRVJfQVNTT0NfUkVRICAgICAgICAgICAgMgorI2RlZmluZSBBUE1UMl9QRUVSX1JFQVNTT0NfUkVRICAgICAgICAgIDMKKyNkZWZpbmUgQVBNVDJfQ0xTM0VSUiAgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIEFQX01BWF9BU1NPQ19NU0cgICAgICAgICAgICAgICAgNQorCisjZGVmaW5lIEFQX0FTU09DX0ZVTkNfU0laRSAgICAgICAgICAgICAgKEFQX01BWF9BU1NPQ19TVEFURSAqIEFQX01BWF9BU1NPQ19NU0cpCisKKy8vCisvLyBBUCdzIEFVVEhFTlRJQ0FUSU9OIHN0YXRlIG1hY2hpbmU6IHN0YXRlcywgZXZlbnRzLCB0b3RhbCBmdW5jdGlvbiAjCisvLworI2RlZmluZSBBUF9BVVRIX1JFUV9JRExFICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQVBfTUFYX0FVVEhfU1RBVEUgICAgICAgICAgICAgICAxCisKKyNkZWZpbmUgQVBfQVVUSF9NQUNISU5FX0JBU0UgICAgICAgICAgICAwCisjZGVmaW5lIEFQTVQyX01MTUVfREVBVVRIX1JFUSAgICAgICAgICAgMAorI2RlZmluZSBBUE1UMl9DTFMyRVJSICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgQVBfTUFYX0FVVEhfTVNHICAgICAgICAgICAgICAgICAyCisKKyNkZWZpbmUgQVBfQVVUSF9GVU5DX1NJWkUgICAgICAgICAgICAgICAoQVBfTUFYX0FVVEhfU1RBVEUgKiBBUF9NQVhfQVVUSF9NU0cpCisKKy8vCisvLyBBUCdzIEFVVEgtUlNQIHN0YXRlIG1hY2hpbmU6IHN0YXRlcywgZXZlbnRzLCB0b3RhbCBmdW5jdGlvbiAjCisvLworI2RlZmluZSBBUF9BVVRIX1JTUF9JRExFICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQVBfTUFYX0FVVEhfUlNQX1NUQVRFICAgICAgICAgICAxCisKKyNkZWZpbmUgQVBfQVVUSF9SU1BfTUFDSElORV9CQVNFICAgICAgICAwCisjZGVmaW5lIEFQTVQyX0FVVEhfQ0hBTExFTkdFX1RJTUVPVVQgICAgMAorI2RlZmluZSBBUE1UMl9QRUVSX0FVVEhfT0REICAgICAgICAgICAgIDEKKyNkZWZpbmUgQVBNVDJfUEVFUl9ERUFVVEggICAgICAgICAgICAgICAyCisjZGVmaW5lIEFQX01BWF9BVVRIX1JTUF9NU0cgICAgICAgICAgICAgMworCisjZGVmaW5lIEFQX0FVVEhfUlNQX0ZVTkNfU0laRSAgICAgICAgICAgKEFQX01BWF9BVVRIX1JTUF9TVEFURSAqIEFQX01BWF9BVVRIX1JTUF9NU0cpCisKKy8vCisvLyBBUCdzIFNZTkMgc3RhdGUgbWFjaGluZTogc3RhdGVzLCBldmVudHMsIHRvdGFsIGZ1bmN0aW9uICMKKy8vCisjZGVmaW5lIEFQX1NZTkNfSURMRSAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBBUF9TQ0FOX0xJU1RFTgkJCQkJMQorI2RlZmluZSBBUF9NQVhfU1lOQ19TVEFURSAgICAgICAgICAgICAgIDIKKworI2RlZmluZSBBUF9TWU5DX01BQ0hJTkVfQkFTRSAgICAgICAgICAgIDAKKyNkZWZpbmUgQVBNVDJfUEVFUl9QUk9CRV9SRVEgICAgICAgICAgICAwCisjZGVmaW5lIEFQTVQyX1BFRVJfQkVBQ09OICAgICAgICAgICAgICAgMQorI2RlZmluZSBBUE1UMl9NTE1FX1NDQU5fUkVRCQkJCTIKKyNkZWZpbmUgQVBNVDJfUEVFUl9QUk9CRV9SU1AJCQkzCisjZGVmaW5lIEFQTVQyX1NDQU5fVElNRU9VVAkJCQk0CisjZGVmaW5lIEFQTVQyX01MTUVfU0NBTl9DTkNMCQkJNQorI2RlZmluZSBBUF9NQVhfU1lOQ19NU0cgICAgICAgICAgICAgICAgIDYKKworI2RlZmluZSBBUF9TWU5DX0ZVTkNfU0laRSAgICAgICAgICAgICAgIChBUF9NQVhfU1lOQ19TVEFURSAqIEFQX01BWF9TWU5DX01TRykKKworLy8KKy8vIEFQJ3MgV1BBIHN0YXRlIG1hY2hpbmU6IHN0YXRlcywgZXZlbnRzLCB0b3RhbCBmdW5jdGlvbiAjCisvLworI2RlZmluZSBBUF9XUEFfUFRLICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQVBfTUFYX1dQQV9QVEtfU1RBVEUgICAgICAgICAgICAxCisKKyNkZWZpbmUgQVBfV1BBX01BQ0hJTkVfQkFTRSAgICAgICAgICAgICAwCisjZGVmaW5lIEFQTVQyX0VBUFBhY2tldCAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBBUE1UMl9FQVBPTFN0YXJ0ICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgQVBNVDJfRUFQT0xMb2dvZmYgICAgICAgICAgICAgICAyCisjZGVmaW5lIEFQTVQyX0VBUE9MS2V5ICAgICAgICAgICAgICAgICAgMworI2RlZmluZSBBUE1UMl9FQVBPTEFTRkFsZXJ0ICAgICAgICAgICAgIDQKKyNkZWZpbmUgQVBfTUFYX1dQQV9NU0cgICAgICAgICAgICAgICAgICA1CisKKyNkZWZpbmUgQVBfV1BBX0ZVTkNfU0laRSAgICAgICAgICAgICAgICAoQVBfTUFYX1dQQV9QVEtfU1RBVEUgKiBBUF9NQVhfV1BBX01TRykKKworI2lmZGVmIEFQQ0xJX1NVUFBPUlQKKy8vQXBDbGkgYXV0aGVudGljYXRpb24gc3RhdGUgbWFjaGluZQorI2RlZmluZSBBUENMSV9BVVRIX1JFUV9JRExFICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQVBDTElfQVVUSF9XQUlUX1NFUTIgICAgICAgICAgICAgICAxCisjZGVmaW5lIEFQQ0xJX0FVVEhfV0FJVF9TRVE0ICAgICAgICAgICAgICAgMgorI2RlZmluZSBBUENMSV9NQVhfQVVUSF9TVEFURSAgICAgICAgICAgICAgIDMKKworI2RlZmluZSBBUENMSV9BVVRIX01BQ0hJTkVfQkFTRSAgICAgICAgICAgIDAKKyNkZWZpbmUgQVBDTElfTVQyX01MTUVfQVVUSF9SRVEgICAgICAgICAgICAwCisjZGVmaW5lIEFQQ0xJX01UMl9NTE1FX0RFQVVUSF9SRVEgICAgICAgICAgMQorI2RlZmluZSBBUENMSV9NVDJfUEVFUl9BVVRIX0VWRU4gICAgICAgICAgIDIKKyNkZWZpbmUgQVBDTElfTVQyX1BFRVJfREVBVVRIICAgICAgICAgICAgICAzCisjZGVmaW5lIEFQQ0xJX01UMl9BVVRIX1RJTUVPVVQgICAgICAgICAgICAgNAorI2RlZmluZSBBUENMSV9NQVhfQVVUSF9NU0cgICAgICAgICAgICAgICAgIDUKKworI2RlZmluZSBBUENMSV9BVVRIX0ZVTkNfU0laRSAgICAgICAgICAgICAgIChBUENMSV9NQVhfQVVUSF9TVEFURSAqIEFQQ0xJX01BWF9BVVRIX01TRykKKworLy9BcENsaSBhc3NvY2lhdGlvbiBzdGF0ZSBtYWNoaW5lCisjZGVmaW5lIEFQQ0xJX0FTU09DX0lETEUgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBBUENMSV9BU1NPQ19XQUlUX1JTUCAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgQVBDTElfTUFYX0FTU09DX1NUQVRFICAgICAgICAgICAgICAyCisKKyNkZWZpbmUgQVBDTElfQVNTT0NfTUFDSElORV9CQVNFICAgICAgICAgICAwCisjZGVmaW5lIEFQQ0xJX01UMl9NTE1FX0FTU09DX1JFUSAgICAgICAgICAgMAorI2RlZmluZSBBUENMSV9NVDJfTUxNRV9ESVNBU1NPQ19SRVEgICAgICAgIDEKKyNkZWZpbmUgQVBDTElfTVQyX1BFRVJfRElTQVNTT0NfUkVRICAgICAgICAyCisjZGVmaW5lIEFQQ0xJX01UMl9QRUVSX0FTU09DX1JTUCAgICAgICAgICAgMworI2RlZmluZSBBUENMSV9NVDJfQVNTT0NfVElNRU9VVCAgICAgICAgICAgIDQKKyNkZWZpbmUgQVBDTElfTUFYX0FTU09DX01TRyAgICAgICAgICAgICAgICA1CisKKyNkZWZpbmUgQVBDTElfQVNTT0NfRlVOQ19TSVpFICAgICAgICAgICAgICAoQVBDTElfTUFYX0FTU09DX1NUQVRFICogQVBDTElfTUFYX0FTU09DX01TRykKKworLy9BcENsaSBzeW5jIHN0YXRlIG1hY2hpbmUKKyNkZWZpbmUgQVBDTElfU1lOQ19JRExFICAgICAgICAgICAgICAgICAgIDAgIC8vIG1lcmdlIE5PX0JTUyxJQlNTX0lETEUsSUJTU19BQ1RJVkUgYW5kIEJTUyBpbiB0byAxIHN0YXRlCisjZGVmaW5lIEFQQ0xJX0pPSU5fV0FJVF9QUk9CRV9SU1AgICAgICAgICAxCisjZGVmaW5lIEFQQ0xJX01BWF9TWU5DX1NUQVRFICAgICAgICAgICAgICAyCisKKyNkZWZpbmUgQVBDTElfU1lOQ19NQUNISU5FX0JBU0UgICAgICAgICAgIDAKKyNkZWZpbmUgQVBDTElfTVQyX01MTUVfUFJPQkVfUkVRICAgICAgICAgIDAKKyNkZWZpbmUgQVBDTElfTVQyX1BFRVJfUFJPQkVfUlNQICAgICAgICAgIDEKKyNkZWZpbmUgQVBDTElfTVQyX1BST0JFX1RJTUVPVVQgICAgICAgICAgIDIKKyNkZWZpbmUgQVBDTElfTUFYX1NZTkNfTVNHICAgICAgICAgICAgICAgIDMKKworI2RlZmluZSBBUENMSV9TWU5DX0ZVTkNfU0laRSAgICAgICAgICAgICAgKEFQQ0xJX01BWF9TWU5DX1NUQVRFICogQVBDTElfTUFYX1NZTkNfTVNHKQorCisvL0FwQ2xpIGN0cmwgc3RhdGUgbWFjaGluZQorI2RlZmluZSBBUENMSV9DVFJMX0RJU0NPTk5FQ1RFRCAgICAgICAgICAgMCAgLy8gbWVyZ2UgTk9fQlNTLElCU1NfSURMRSxJQlNTX0FDVElWRSBhbmQgQlNTIGluIHRvIDEgc3RhdGUKKyNkZWZpbmUgQVBDTElfQ1RSTF9QUk9CRSAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgQVBDTElfQ1RSTF9BVVRIICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgQVBDTElfQ1RSTF9BVVRIXzIgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgQVBDTElfQ1RSTF9BU1NPQyAgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgQVBDTElfQ1RSTF9ERUFTU09DICAgICAgICAgICAgICAgIDUKKyNkZWZpbmUgQVBDTElfQ1RSTF9DT05ORUNURUQgICAgICAgICAgICAgIDYKKyNkZWZpbmUgQVBDTElfTUFYX0NUUkxfU1RBVEUgICAgICAgICAgICAgIDcKKworI2RlZmluZSBBUENMSV9DVFJMX01BQ0hJTkVfQkFTRSAgICAgICAgICAgMAorI2RlZmluZSBBUENMSV9DVFJMX0pPSU5fUkVRICAgICAgICAgICAgICAgMAorI2RlZmluZSBBUENMSV9DVFJMX1BST0JFX1JTUCAgICAgICAgICAgICAgMQorI2RlZmluZSBBUENMSV9DVFJMX0FVVEhfUlNQICAgICAgICAgICAgICAgMgorI2RlZmluZSBBUENMSV9DVFJMX0RJU0NPTk5FQ1RfUkVRICAgICAgICAgMworI2RlZmluZSBBUENMSV9DVFJMX1BFRVJfRElTQ09OTkVDVF9SRVEgICAgNAorI2RlZmluZSBBUENMSV9DVFJMX0FTU09DX1JTUCAgICAgICAgICAgICAgNQorI2RlZmluZSBBUENMSV9DVFJMX0RFQVNTT0NfUlNQICAgICAgICAgICAgNgorI2RlZmluZSBBUENMSV9DVFJMX0pPSU5fUkVRX1RJTUVPVVQgICAgICAgNworI2RlZmluZSBBUENMSV9DVFJMX0FVVEhfUkVRX1RJTUVPVVQgICAgICAgOAorI2RlZmluZSBBUENMSV9DVFJMX0FTU09DX1JFUV9USU1FT1VUICAgICAgOQorI2RlZmluZSBBUENMSV9NQVhfQ1RSTF9NU0cgICAgICAgICAgICAgICAgMTAKKworI2RlZmluZSBBUENMSV9DVFJMX0ZVTkNfU0laRSAgICAgICAgICAgICAgKEFQQ0xJX01BWF9DVFJMX1NUQVRFICogQVBDTElfTUFYX0NUUkxfTVNHKQorCisjZW5kaWYJLy8gQVBDTElfU1VQUE9SVCAvLworCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKy8vIHZhbHVlIGRvbWFpbiBvZiA4MDIuMTEgaGVhZGVyIEZDLlR5dGUsIHdoaWNoIGlzIGIzLi5iMiBvZiB0aGUgMXN0LWJ5dGUgb2YgTUFDIGhlYWRlcgorI2RlZmluZSBCVFlQRV9NR01UICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBCVFlQRV9DTlRMICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBCVFlQRV9EQVRBICAgICAgICAgICAgICAgICAgMgorCisvLyB2YWx1ZSBkb21haW4gb2YgODAyLjExIE1HTVQgZnJhbWUncyBGQy5zdWJ0eXBlLCB3aGljaCBpcyBiNy4uNCBvZiB0aGUgMXN0LWJ5dGUgb2YgTUFDIGhlYWRlcgorI2RlZmluZSBTVUJUWVBFX0FTU09DX1JFUSAgICAgICAgICAgMAorI2RlZmluZSBTVUJUWVBFX0FTU09DX1JTUCAgICAgICAgICAgMQorI2RlZmluZSBTVUJUWVBFX1JFQVNTT0NfUkVRICAgICAgICAgMgorI2RlZmluZSBTVUJUWVBFX1JFQVNTT0NfUlNQICAgICAgICAgMworI2RlZmluZSBTVUJUWVBFX1BST0JFX1JFUSAgICAgICAgICAgNAorI2RlZmluZSBTVUJUWVBFX1BST0JFX1JTUCAgICAgICAgICAgNQorI2RlZmluZSBTVUJUWVBFX0JFQUNPTiAgICAgICAgICAgICAgOAorI2RlZmluZSBTVUJUWVBFX0FUSU0gICAgICAgICAgICAgICAgOQorI2RlZmluZSBTVUJUWVBFX0RJU0FTU09DICAgICAgICAgICAgMTAKKyNkZWZpbmUgU1VCVFlQRV9BVVRIICAgICAgICAgICAgICAgIDExCisjZGVmaW5lIFNVQlRZUEVfREVBVVRIICAgICAgICAgICAgICAxMgorI2RlZmluZSBTVUJUWVBFX0FDVElPTiAgICAgICAgICAgICAgMTMKKyNkZWZpbmUgU1VCVFlQRV9BQ1RJT05fTk9fQUNLICAgICAgICAgICAgICAxNAorCisvLyB2YWx1ZSBkb21haW4gb2YgODAyLjExIENOVEwgZnJhbWUncyBGQy5zdWJ0eXBlLCB3aGljaCBpcyBiNy4uNCBvZiB0aGUgMXN0LWJ5dGUgb2YgTUFDIGhlYWRlcgorI2RlZmluZSBTVUJUWVBFX1dSQVBQRVIgICAgICAgCTcKKyNkZWZpbmUgU1VCVFlQRV9CTE9DS19BQ0tfUkVRICAgICAgIDgKKyNkZWZpbmUgU1VCVFlQRV9CTE9DS19BQ0sgICAgICAgICAgIDkKKyNkZWZpbmUgU1VCVFlQRV9QU19QT0xMICAgICAgICAgICAgIDEwCisjZGVmaW5lIFNVQlRZUEVfUlRTICAgICAgICAgICAgICAgICAxMQorI2RlZmluZSBTVUJUWVBFX0NUUyAgICAgICAgICAgICAgICAgMTIKKyNkZWZpbmUgU1VCVFlQRV9BQ0sgICAgICAgICAgICAgICAgIDEzCisjZGVmaW5lIFNVQlRZUEVfQ0ZFTkQgICAgICAgICAgICAgICAxNAorI2RlZmluZSBTVUJUWVBFX0NGRU5EX0NGQUNLICAgICAgICAgMTUKKworLy8gdmFsdWUgZG9tYWluIG9mIDgwMi4xMSBEQVRBIGZyYW1lJ3MgRkMuc3VidHlwZSwgd2hpY2ggaXMgYjcuLjQgb2YgdGhlIDFzdC1ieXRlIG9mIE1BQyBoZWFkZXIKKyNkZWZpbmUgU1VCVFlQRV9EQVRBICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgU1VCVFlQRV9EQVRBX0NGQUNLICAgICAgICAgIDEKKyNkZWZpbmUgU1VCVFlQRV9EQVRBX0NGUE9MTCAgICAgICAgIDIKKyNkZWZpbmUgU1VCVFlQRV9EQVRBX0NGQUNLX0NGUE9MTCAgIDMKKyNkZWZpbmUgU1VCVFlQRV9OVUxMX0ZVTkMgICAgICAgICAgIDQKKyNkZWZpbmUgU1VCVFlQRV9DRkFDSyAgICAgICAgICAgICAgIDUKKyNkZWZpbmUgU1VCVFlQRV9DRlBPTEwgICAgICAgICAgICAgIDYKKyNkZWZpbmUgU1VCVFlQRV9DRkFDS19DRlBPTEwgICAgICAgIDcKKyNkZWZpbmUgU1VCVFlQRV9RREFUQSAgICAgICAgICAgICAgIDgKKyNkZWZpbmUgU1VCVFlQRV9RREFUQV9DRkFDSyAgICAgICAgIDkKKyNkZWZpbmUgU1VCVFlQRV9RREFUQV9DRlBPTEwgICAgICAgIDEwCisjZGVmaW5lIFNVQlRZUEVfUURBVEFfQ0ZBQ0tfQ0ZQT0xMICAxMQorI2RlZmluZSBTVUJUWVBFX1FPU19OVUxMICAgICAgICAgICAgMTIKKyNkZWZpbmUgU1VCVFlQRV9RT1NfQ0ZBQ0sgICAgICAgICAgIDEzCisjZGVmaW5lIFNVQlRZUEVfUU9TX0NGUE9MTCAgICAgICAgICAxNAorI2RlZmluZSBTVUJUWVBFX1FPU19DRkFDS19DRlBPTEwgICAgMTUKKworLy8gQUNLIHBvbGljeSBvZiBRT1MgQ29udHJvbCBmaWVsZCBiaXQgNjo1CisjZGVmaW5lIE5PUk1BTF9BQ0sgICAgICAgICAgICAgICAgICAweDAwICAvLyBiNjo1ID0gMDAKKyNkZWZpbmUgTk9fQUNLICAgICAgICAgICAgICAgICAgICAgIDB4MjAgIC8vIGI2OjUgPSAwMQorI2RlZmluZSBOT19FWFBMSUNJVF9BQ0sgICAgICAgICAgICAgMHg0MCAgLy8gYjY6NSA9IDEwCisjZGVmaW5lIEJMT0NLX0FDSyAgICAgICAgICAgICAgICAgICAweDYwICAvLyBiNjo1ID0gMTEKKworLy8KKy8vIHJ0bXBfZGF0YS5jIHVzZSB0aGVzZSBkZWZpbml0aW9uCisvLworI2RlZmluZSBMRU5HVEhfODAyXzExICAgICAgICAgICAgICAgMjQKKyNkZWZpbmUgTEVOR1RIXzgwMl8xMV9BTkRfSCAgICAgICAgIDMwCisjZGVmaW5lIExFTkdUSF84MDJfMTFfQ1JDX0ggICAgICAgICAzNAorI2RlZmluZSBMRU5HVEhfODAyXzExX0NSQyAgICAgICAgICAgMjgKKyNkZWZpbmUgTEVOR1RIXzgwMl8xMV9XSVRIX0FERFI0ICAgIDMwCisjZGVmaW5lIExFTkdUSF84MDJfMyAgICAgICAgICAgICAgICAxNAorI2RlZmluZSBMRU5HVEhfODAyXzNfVFlQRSAgICAgICAgICAgMgorI2RlZmluZSBMRU5HVEhfODAyXzFfSCAgICAgICAgICAgICAgOAorI2RlZmluZSBMRU5HVEhfRUFQT0xfSCAgICAgICAgICAgICAgNAorI2RlZmluZSBMRU5HVEhfV01NUU9TX0gJCQkJMgorI2RlZmluZSBMRU5HVEhfQ1JDICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBNQVhfU0VRX05VTUJFUiAgICAgICAgICAgICAgMHgwZmZmCisjZGVmaW5lIExFTkdUSF84MDJfM19OT19UWVBFCQkxMgorI2RlZmluZSBMRU5HVEhfODAyXzFRCQkJCTQgLyogVkxBTiByZWxhdGVkICovCisKKy8vIFNUQV9DU1I0LmZpZWxkLlR4UmVzdWx0CisjZGVmaW5lIFRYX1JFU1VMVF9TVUNDRVNTICAgICAgICAgICAwCisjZGVmaW5lIFRYX1JFU1VMVF9aRVJPX0xFTkdUSCAgICAgICAxCisjZGVmaW5lIFRYX1JFU1VMVF9VTkRFUl9SVU4gICAgICAgICAyCisjZGVmaW5lIFRYX1JFU1VMVF9PSFlfRVJST1IgICAgICAgICA0CisjZGVmaW5lIFRYX1JFU1VMVF9SRVRSWV9GQUlMICAgICAgICA2CisKKy8vIEFsbCBQSFkgcmF0ZSBzdW1tYXJ5IGluIFRYRAorLy8gUHJlYW1ibGUgTU9ERSBpbiBUeEQKKyNkZWZpbmUgTU9ERV9DQ0sJMAorI2RlZmluZSBNT0RFX09GRE0gICAxCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisjZGVmaW5lIE1PREVfSFRNSVgJMgorI2RlZmluZSBNT0RFX0hUR1JFRU5GSUVMRAkzCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisvLyBNQ1MgZm9yIENDSy4gIEJXLlNHSS5TVEJDIGFyZSByZXNlcnZlZAorI2RlZmluZSBNQ1NfTE9OR1BfUkFURV8xICAgICAgICAgICAgICAgICAgICAgIDAJIC8vIGxvbmcgcHJlYW1ibGUgQ0NLIDFNYnBzCisjZGVmaW5lIE1DU19MT05HUF9SQVRFXzIgICAgICAgICAgICAgICAgICAgICAgMQkvLyBsb25nIHByZWFtYmxlIENDSyAxTWJwcworI2RlZmluZSBNQ1NfTE9OR1BfUkFURV81XzUgICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgTUNTX0xPTkdQX1JBVEVfMTEgICAgICAgICAgICAgICAgICAgICAzCisjZGVmaW5lIE1DU19TSE9SVFBfUkFURV8xICAgICAgICAgICAgICAgICAgICAgIDQJIC8vIGxvbmcgcHJlYW1ibGUgQ0NLIDFNYnBzLiBzaG9ydCBpcyBmb3JiaWRkZW4gaW4gMU1icHMKKyNkZWZpbmUgTUNTX1NIT1JUUF9SQVRFXzIgICAgICAgICAgICAgICAgICAgICAgNQkvLyBzaG9ydCBwcmVhbWJsZSBDQ0sgMk1icHMKKyNkZWZpbmUgTUNTX1NIT1JUUF9SQVRFXzVfNSAgICAgICAgICAgICAgICAgICAgNgorI2RlZmluZSBNQ1NfU0hPUlRQX1JBVEVfMTEgICAgICAgICAgICAgICAgICAgICA3CisvLyBUbyBzZW5kIGR1cGxpY2F0ZSBsZWdhY3kgT0ZETS4gc2V0IEJXPUJXXzQwLiAgU0dJLlNUQkMgYXJlIHJlc2VydmVkCisjZGVmaW5lIE1DU19SQVRFXzYgICAgICAgICAgICAgICAgICAgICAgMCAgIC8vIGxlZ2FjeSBPRkRNCisjZGVmaW5lIE1DU19SQVRFXzkgICAgICAgICAgICAgICAgICAgICAgMSAgIC8vIE9GRE0KKyNkZWZpbmUgTUNTX1JBVEVfMTIgICAgICAgICAgICAgICAgICAgICAyICAgLy8gT0ZETQorI2RlZmluZSBNQ1NfUkFURV8xOCAgICAgICAgICAgICAgICAgICAgIDMgICAvLyBPRkRNCisjZGVmaW5lIE1DU19SQVRFXzI0ICAgICAgICAgICAgICAgICAgICAgNCAgLy8gT0ZETQorI2RlZmluZSBNQ1NfUkFURV8zNiAgICAgICAgICAgICAgICAgICAgIDUgICAvLyBPRkRNCisjZGVmaW5lIE1DU19SQVRFXzQ4ICAgICAgICAgICAgICAgICAgICAgNiAgLy8gT0ZETQorI2RlZmluZSBNQ1NfUkFURV81NCAgICAgICAgICAgICAgICAgICAgIDcgLy8gT0ZETQorLy8gSFQKKyNkZWZpbmUgTUNTXzAJCTAJLy8gMVMKKyNkZWZpbmUgTUNTXzEJCTEKKyNkZWZpbmUgTUNTXzIJCTIKKyNkZWZpbmUgTUNTXzMJCTMKKyNkZWZpbmUgTUNTXzQJCTQKKyNkZWZpbmUgTUNTXzUJCTUKKyNkZWZpbmUgTUNTXzYJCTYKKyNkZWZpbmUgTUNTXzcJCTcKKyNkZWZpbmUgTUNTXzgJCTgJLy8gMlMKKyNkZWZpbmUgTUNTXzkJCTkKKyNkZWZpbmUgTUNTXzEwCQkxMAorI2RlZmluZSBNQ1NfMTEJCTExCisjZGVmaW5lIE1DU18xMgkJMTIKKyNkZWZpbmUgTUNTXzEzCQkxMworI2RlZmluZSBNQ1NfMTQJCTE0CisjZGVmaW5lIE1DU18xNQkJMTUKKyNkZWZpbmUgTUNTXzE2CQkxNgkvLyAzKjMKKyNkZWZpbmUgTUNTXzE3CQkxNworI2RlZmluZSBNQ1NfMTgJCTE4CisjZGVmaW5lIE1DU18xOQkJMTkKKyNkZWZpbmUgTUNTXzIwCQkyMAorI2RlZmluZSBNQ1NfMjEJCTIxCisjZGVmaW5lIE1DU18yMgkJMjIKKyNkZWZpbmUgTUNTXzIzCQkyMworI2RlZmluZSBNQ1NfMzIJCTMyCisjZGVmaW5lIE1DU19BVVRPCQkzMworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisvLyBPSURfSFRQSFlNT0RFCisvLyBNT0RFCisjZGVmaW5lIEhUTU9ERV9NTQkwCisjZGVmaW5lIEhUTU9ERV9HRgkxCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKy8vIEZpeGVkIFR4IE1PREUgLSBIVCwgQ0NLIG9yIE9GRE0KKyNkZWZpbmUgRklYRURfVFhNT0RFX0hUCQkwCisjZGVmaW5lIEZJWEVEX1RYTU9ERV9DQ0sJMQorI2RlZmluZSBGSVhFRF9UWE1PREVfT0ZETSAJMgorLy8gQlcKKyNkZWZpbmUgQldfMjAJCUJBTkRfV0lEVEhfMjAKKyNkZWZpbmUgQldfNDAJCUJBTkRfV0lEVEhfNDAKKyNkZWZpbmUgQldfQk9USAkJQkFORF9XSURUSF9CT1RICisjZGVmaW5lIEJXXzEwCQlCQU5EX1dJRFRIXzEwCS8vIDgwMi4xMWogaGFzIDEwTUh6LiBUaGlzIGRlZmluaXRpb24gaXMgZm9yIGludGVybmFsIHVzYWdlLiBkb2Vzbid0IGZpbGwgaW4gdGhlIElFIG9yIG90aGVyIGZpZWxkLgorCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisvLyBTSE9SVEdJCisjZGVmaW5lIEdJXzQwMAkJR0FQX0lOVEVSVkFMXzQwMAkvLyBvbmx5IHN1cHBvcnQgaW4gSFQgbW9kZQorI2RlZmluZSBHSV9CT1RICQlHQVBfSU5URVJWQUxfQk9USAorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworI2RlZmluZSBHSV84MDAJCUdBUF9JTlRFUlZBTF84MDAKKy8vIFNUQkMKKyNkZWZpbmUgU1RCQ19OT05FCTAKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKyNkZWZpbmUgU1RCQ19VU0UJMQkvLyBsaW1pdGVkIHVzZSBpbiBydDI4NjBiIHBoeQorI2RlZmluZSBSWFNUQkNfT05FCTEJLy8gcnggc3VwcG9ydCBvZiBvbmUgc3BhdGlhbCBzdHJlYW0KKyNkZWZpbmUgUlhTVEJDX1RXTwkyCS8vIHJ4IHN1cHBvcnQgb2YgMSBhbmQgMiBzcGF0aWFsIHN0cmVhbQorI2RlZmluZSBSWFNUQkNfVEhSCTMJLy8gcnggc3VwcG9ydCBvZiAxfjMgc3BhdGlhbCBzdHJlYW0KKy8vIE1DUyBGRUVEQkFDSworI2RlZmluZSBNQ1NGQktfTk9ORQkwICAvLyBub3Qgc3VwcG9ydCBtY3MgZmVlZGJhY2sgLworI2RlZmluZSBNQ1NGQktfUlNWCTEJLy8gcmVzZXJ2ZWQKKyNkZWZpbmUgTUNTRkJLX1VOU09MSUNJVAkyCS8vIG9ubHkgc3VwcG9ydCB1bnNvbGljdCBtY3MgZmVlZGJhY2sKKyNkZWZpbmUgTUNTRkJLX01SUQkzCS8vIHJlc3BvbnNlIHRvIGJvdGggTVJRIGFuZCB1bnNvbGljdCBtY3MgZmVlZGJhY2sKKworLy8gTUlNTyBwb3dlciBzYWZlCisjZGVmaW5lCU1NUFNfU1RBVElDCTAKKyNkZWZpbmUJTU1QU19EWU5BTUlDCQkxCisjZGVmaW5lICAgTU1QU19SU1YJCTIKKyNkZWZpbmUgTU1QU19FTkFCTEUJCTMKKworCisvLyBBLU1TRFUgc2l6ZQorI2RlZmluZQlBTVNEVV8wCTAKKyNkZWZpbmUJQU1TRFVfMQkJMQorCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKy8vIE1DUyB1c2UgNyBiaXRzCisjZGVmaW5lIFRYUkFURU1JTU8JCTB4ODAKKyNkZWZpbmUgVFhSQVRFTUNTCQkweDdGCisjZGVmaW5lIFRYUkFURU9GRE0JCTB4N0YKKyNkZWZpbmUgUkFURV8xICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgUkFURV8yICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgUkFURV81XzUgICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgUkFURV8xMSAgICAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgUkFURV82ICAgICAgICAgICAgICAgICAgICAgIDQgICAvLyBPRkRNCisjZGVmaW5lIFJBVEVfOSAgICAgICAgICAgICAgICAgICAgICA1ICAgLy8gT0ZETQorI2RlZmluZSBSQVRFXzEyICAgICAgICAgICAgICAgICAgICAgNiAgIC8vIE9GRE0KKyNkZWZpbmUgUkFURV8xOCAgICAgICAgICAgICAgICAgICAgIDcgICAvLyBPRkRNCisjZGVmaW5lIFJBVEVfMjQgICAgICAgICAgICAgICAgICAgICA4ICAgLy8gT0ZETQorI2RlZmluZSBSQVRFXzM2ICAgICAgICAgICAgICAgICAgICAgOSAgIC8vIE9GRE0KKyNkZWZpbmUgUkFURV80OCAgICAgICAgICAgICAgICAgICAgIDEwICAvLyBPRkRNCisjZGVmaW5lIFJBVEVfNTQgICAgICAgICAgICAgICAgICAgICAxMSAgLy8gT0ZETQorI2RlZmluZSBSQVRFX0ZJUlNUX09GRE1fUkFURSAgICAgICAgUkFURV82CisjZGVmaW5lIFJBVEVfTEFTVF9PRkRNX1JBVEUgICAgICAgIAlSQVRFXzU0CisjZGVmaW5lIFJBVEVfNl81ICAgICAgICAgICAgICAgICAgICAxMiAgLy8gSFQgbWl4CisjZGVmaW5lIFJBVEVfMTMgICAgICAgICAgICAgICAgICAgICAxMyAgLy8gSFQgbWl4CisjZGVmaW5lIFJBVEVfMTlfNSAgICAgICAgICAgICAgICAgICAxNCAgLy8gSFQgbWl4CisjZGVmaW5lIFJBVEVfMjYgICAgICAgICAgICAgICAgICAgICAxNSAgLy8gSFQgbWl4CisjZGVmaW5lIFJBVEVfMzkgICAgICAgICAgICAgICAgICAgICAxNiAgLy8gSFQgbWl4CisjZGVmaW5lIFJBVEVfNTIgICAgICAgICAgICAgICAgICAgICAxNyAgLy8gSFQgbWl4CisjZGVmaW5lIFJBVEVfNThfNSAgICAgICAgICAgICAgICAgICAxOCAgLy8gSFQgbWl4CisjZGVmaW5lIFJBVEVfNjUgICAgICAgICAgICAgICAgICAgICAxOSAgLy8gSFQgbWl4CisjZGVmaW5lIFJBVEVfNzggICAgICAgICAgICAgICAgICAgICAyMCAgLy8gSFQgbWl4CisjZGVmaW5lIFJBVEVfMTA0ICAgICAgICAgICAgICAgICAgICAyMSAgLy8gSFQgbWl4CisjZGVmaW5lIFJBVEVfMTE3ICAgICAgICAgICAgICAgICAgICAyMiAgLy8gSFQgbWl4CisjZGVmaW5lIFJBVEVfMTMwICAgICAgICAgICAgICAgICAgICAyMyAgLy8gSFQgbWl4CisvLyNkZWZpbmUgUkFURV9BVVRPX1NXSVRDSCAgICAgICAgICAgIDI1NSAvLyBmb3IgU3RhQ2ZnLkZpeGVkVHhSYXRlIG9ubHkKKyNkZWZpbmUgSFRSQVRFXzAgICAgICAgICAgICAgICAgICAgICAgMTIKKyNkZWZpbmUgUkFURV9GSVJTVF9NTV9SQVRFICAgICAgICBIVFJBVEVfMAorI2RlZmluZSBSQVRFX0ZJUlNUX0hUX1JBVEUgICAgICAgIEhUUkFURV8wCisjZGVmaW5lIFJBVEVfTEFTVF9IVF9SQVRFICAgICAgICBIVFJBVEVfMAorCisvLyBwVHhXSS0+dHhvcAorI2RlZmluZSBJRlNfSFRUWE9QICAgICAgICAgICAgICAgICAwCS8vIFRoZSB0eG9wIHdpbGwgYmUgaGFuZGxlcyBieSBBU0lDLgorI2RlZmluZSBJRlNfUElGUyAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBJRlNfU0lGUyAgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBJRlNfQkFDS09GRiAgICAgICAgICAgICAgICAgMworCisvLyBwVHhELT5SZXRyeU1vZGUKKyNkZWZpbmUgTE9OR19SRVRSWSAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgU0hPUlRfUkVUUlkgICAgICAgICAgICAgICAgIDAKKworLy8gQ291bnRyeSBSZWdpb24gZGVmaW5pdGlvbgorI2RlZmluZSBSRUdJT05fTUlOSU1VTV9CR19CQU5EICAgICAgICAgICAgMAorI2RlZmluZSBSRUdJT05fMF9CR19CQU5EICAgICAgICAgICAgICAgICAgMCAgICAgICAvLyAxLTExCisjZGVmaW5lIFJFR0lPTl8xX0JHX0JBTkQgICAgICAgICAgICAgICAgICAxICAgICAgIC8vIDEtMTMKKyNkZWZpbmUgUkVHSU9OXzJfQkdfQkFORCAgICAgICAgICAgICAgICAgIDIgICAgICAgLy8gMTAtMTEKKyNkZWZpbmUgUkVHSU9OXzNfQkdfQkFORCAgICAgICAgICAgICAgICAgIDMgICAgICAgLy8gMTAtMTMKKyNkZWZpbmUgUkVHSU9OXzRfQkdfQkFORCAgICAgICAgICAgICAgICAgIDQgICAgICAgLy8gMTQKKyNkZWZpbmUgUkVHSU9OXzVfQkdfQkFORCAgICAgICAgICAgICAgICAgIDUgICAgICAgLy8gMS0xNAorI2RlZmluZSBSRUdJT05fNl9CR19CQU5EICAgICAgICAgICAgICAgICAgNiAgICAgICAvLyAzLTkKKyNkZWZpbmUgUkVHSU9OXzdfQkdfQkFORCAgICAgICAgICAgICAgICAgIDcgICAgICAgLy8gNS0xMworI2RlZmluZSBSRUdJT05fMzFfQkdfQkFORCAgICAgICAgICAgICAgICAgMzEgICAgICAgLy8gNS0xMworI2RlZmluZSBSRUdJT05fTUFYSU1VTV9CR19CQU5EICAgICAgICAgICAgNworCisjZGVmaW5lIFJFR0lPTl9NSU5JTVVNX0FfQkFORCAgICAgICAgICAgICAwCisjZGVmaW5lIFJFR0lPTl8wX0FfQkFORCAgICAgICAgICAgICAgICAgICAwICAgICAgIC8vIDM2LCA0MCwgNDQsIDQ4LCA1MiwgNTYsIDYwLCA2NCwgMTQ5LCAxNTMsIDE1NywgMTYxLCAxNjUKKyNkZWZpbmUgUkVHSU9OXzFfQV9CQU5EICAgICAgICAgICAgICAgICAgIDEgICAgICAgLy8gMzYsIDQwLCA0NCwgNDgsIDUyLCA1NiwgNjAsIDY0LCAxMDAsIDEwNCwgMTA4LCAxMTIsIDExNiwgMTIwLCAxMjQsIDEyOCwgMTMyLCAxMzYsIDE0MAorI2RlZmluZSBSRUdJT05fMl9BX0JBTkQgICAgICAgICAgICAgICAgICAgMiAgICAgICAvLyAzNiwgNDAsIDQ0LCA0OCwgNTIsIDU2LCA2MCwgNjQKKyNkZWZpbmUgUkVHSU9OXzNfQV9CQU5EICAgICAgICAgICAgICAgICAgIDMgICAgICAgLy8gNTIsIDU2LCA2MCwgNjQsIDE0OSwgMTUzLCAxNTcsIDE2MQorI2RlZmluZSBSRUdJT05fNF9BX0JBTkQgICAgICAgICAgICAgICAgICAgNCAgICAgICAvLyAxNDksIDE1MywgMTU3LCAxNjEsIDE2NQorI2RlZmluZSBSRUdJT05fNV9BX0JBTkQgICAgICAgICAgICAgICAgICAgNSAgICAgICAvLyAxNDksIDE1MywgMTU3LCAxNjEKKyNkZWZpbmUgUkVHSU9OXzZfQV9CQU5EICAgICAgICAgICAgICAgICAgIDYgICAgICAgLy8gMzYsIDQwLCA0NCwgNDgKKyNkZWZpbmUgUkVHSU9OXzdfQV9CQU5EICAgICAgICAgICAgICAgICAgIDcgICAgICAgLy8gMzYsIDQwLCA0NCwgNDgsIDUyLCA1NiwgNjAsIDY0LCAxMDAsIDEwNCwgMTA4LCAxMTIsIDExNiwgMTIwLCAxMjQsIDEyOCwgMTMyLCAxMzYsIDE0MCwgMTQ5LCAxNTMsIDE1NywgMTYxLCAxNjUKKyNkZWZpbmUgUkVHSU9OXzhfQV9CQU5EICAgICAgICAgICAgICAgICAgIDggICAgICAgLy8gNTIsIDU2LCA2MCwgNjQKKyNkZWZpbmUgUkVHSU9OXzlfQV9CQU5EICAgICAgICAgICAgICAgICAgIDkgICAgICAgLy8gMzYsIDQwLCA0NCwgNDgsIDUyLCA1NiwgNjAsIDY0LCAxMDAsIDEwNCwgMTA4LCAxMTIsIDExNiwgMTMyLCAxMzYsIDE0MCwgMTQ5LCAxNTMsIDE1NywgMTYxLCAxNjUKKyNkZWZpbmUgUkVHSU9OXzEwX0FfQkFORCAgICAgICAgICAgICAgICAgIDEwCSAgLy8gMzYsIDQwLCA0NCwgNDgsIDE0OSwgMTUzLCAxNTcsIDE2MSwgMTY1CisjZGVmaW5lIFJFR0lPTl8xMV9BX0JBTkQgICAgICAgICAgICAgICAgICAxMQkgIC8vIDM2LCA0MCwgNDQsIDQ4LCA1MiwgNTYsIDYwLCA2NCwgMTAwLCAxMDQsIDEwOCwgMTEyLCAxMTYsIDEyMCwgMTQ5LCAxNTMsIDE1NywgMTYxCisjZGVmaW5lIFJFR0lPTl9NQVhJTVVNX0FfQkFORCAgICAgICAgICAgICAxMQorCisvLyBwVHhELT5DaXBoZXJBbGcKKyNkZWZpbmUgQ0lQSEVSX05PTkUgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQ0lQSEVSX1dFUDY0ICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgQ0lQSEVSX1dFUDEyOCAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgQ0lQSEVSX1RLSVAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgQ0lQSEVSX0FFUyAgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgQ0lQSEVSX0NLSVA2NCAgICAgICAgICAgICAgIDUKKyNkZWZpbmUgQ0lQSEVSX0NLSVAxMjggICAgICAgICAgICAgIDYKKyNkZWZpbmUgQ0lQSEVSX1RLSVBfTk9fTUlDICAgICAgICAgIDcgICAgICAgLy8gTUlDIGFwcGVuZGVkIGJ5IGRyaXZlcjogbm90IGEgdmFsaWQgdmFsdWUgaW4gaGFyZHdhcmUga2V5IHRhYmxlCisjZGVmaW5lIENJUEhFUl9TTVM0CQkJCQk4CisKKy8vIHZhbHVlIGRvbWFpbiBvZiBwQWQtPlJmSWNUeXBlCisjZGVmaW5lIFJGSUNfMjgyMCAgICAgICAgICAgICAgICAgICAxICAgICAgIC8vIDIuNEcgMlQzUgorI2RlZmluZSBSRklDXzI4NTAgICAgICAgICAgICAgICAgICAgMiAgICAgICAvLyAyLjRHLzVHIDJUM1IKKyNkZWZpbmUgUkZJQ18yNzIwICAgICAgICAgICAgICAgICAgIDMgICAgICAgLy8gMi40RyAxVDJSCisjZGVmaW5lIFJGSUNfMjc1MCAgICAgICAgICAgICAgICAgICA0ICAgICAgIC8vIDIuNEcvNUcgMVQyUgorI2RlZmluZSBSRklDXzMwMjAgICAgICAgICAgICAgICAgICAgNSAgICAgICAvLyAyLjRHIDFUMVIKKyNkZWZpbmUgUkZJQ18yMDIwICAgICAgICAgICAgICAgICAgIDYgICAgICAgLy8gMi40RyBCL0cKKworLy8gTEVEIFN0YXR1cy4KKyNkZWZpbmUgTEVEX0xJTktfRE9XTiAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgTEVEX0xJTktfVVAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgTEVEX1JBRElPX09GRiAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgTEVEX1JBRElPX09OICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgTEVEX0hBTFQgICAgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgTEVEX1dQUyAgICAgICAgICAgICAgICAgICAgIDUKKyNkZWZpbmUgTEVEX09OX1NJVEVfU1VSVkVZICAgICAgICAgIDYKKyNkZWZpbmUgTEVEX1BPV0VSX1VQICAgICAgICAgICAgICAgIDcKKworLy8gdmFsdWUgZG9tYWluIG9mIHBBZC0+TGVkQ250bC5MZWRNb2RlIGFuZCBFMlBST00KKyNkZWZpbmUgTEVEX01PREVfREVGQVVMVCAgICAgICAgICAgIDAKKyNkZWZpbmUgTEVEX01PREVfVFdPX0xFRAkJCTEKKyNkZWZpbmUgTEVEX01PREVfU0lHTkFMX1NUUkVHVEgJCTggIC8vIEVFUFJPTSBkZWZpbmUgPTgKKworLy8gUkM0IGluaXQgdmFsdWUsIHVzZWQgZnJvIFdFUCAmIFRLSVAKKyNkZWZpbmUgUFBQSU5JVEZDUzMyICAgICAgICAgICAgICAgIDB4ZmZmZmZmZmYgICAvKiBJbml0aWFsIEZDUyB2YWx1ZSAqLworCisvLyB2YWx1ZSBkb21haW4gb2YgcEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQuIDgwMi4xWCBjb250cm9sbGVkIHBvcnQgZGVmaW5pdGlvbgorI2RlZmluZSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRCAgICAgMQorI2RlZmluZSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQgMgorCisjZGVmaW5lIFBBSVJXSVNFX0tFWSAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEdST1VQX0tFWSAgICAgICAgICAgICAgICAgICAyCisKKy8vZGVmaW5pdGlvbiBvZiBEUlMKKyNkZWZpbmUgTUFYX1NURVBfT0ZfVFhfUkFURV9TV0lUQ0gJMzIKKworCisvLyBwcmUtYWxsb2NhdGVkIGZyZWUgTkRJUyBQQUNLRVQvQlVGRkVSIHBvbGwgZm9yIGludGVybmFsIHVzYWdlCisjZGVmaW5lIE1BWF9OVU1fT0ZfRlJFRV9ORElTX1BBQ0tFVCAxMjgKKworLy9CbG9jayBBQ0sKKyNkZWZpbmUgTUFYX1RYX1JFT1JERVJCVUYgICA2NAorI2RlZmluZSBNQVhfUlhfUkVPUkRFUkJVRiAgIDY0CisjZGVmaW5lIERFRkFVTFRfVFhfVElNRU9VVCAgIDMwCisjZGVmaW5lIERFRkFVTFRfUlhfVElNRU9VVCAgIDMwCisKKy8vIGRlZmluaXRpb24gb2YgUmVjaXBpZW50IG9yIE9yaWdpbmF0b3IKKyNkZWZpbmUgSV9SRUNJUElFTlQgICAgICAgICAgICAgICAgICBUUlVFCisjZGVmaW5lIElfT1JJR0lOQVRPUiAgICAgICAgICAgICAgICAgICBGQUxTRQorCisjZGVmaW5lIERFRkFVTFRfQkJQX1RYX1BPV0VSICAgICAgICAwCisjZGVmaW5lIERFRkFVTFRfUkZfVFhfUE9XRVIgICAgICAgICA1CisKKyNkZWZpbmUgTUFYX0lOSV9CVUZGRVJfU0laRQkJCTQwOTYKKyNkZWZpbmUgTUFYX1BBUkFNX0JVRkZFUl9TSVpFCQkoMjA0OCkgLy8gZW5vdWdoIGZvciBBQ0wgKDE4KjY0KQorCQkJCQkJCQkJCQkvLzE4IDogdGhlIGxlbmd0aCBvZiBNYWMgYWRkcmVzcyBhY2NlcHRhYmxlIGZvcm1hdCAiMDE6MDI6MDM6MDQ6MDU6MDY7IikKKwkJCQkJCQkJCQkJLy82NCA6IE1BWF9OVU1fT0ZfQUNMX0xJU1QKKy8vIGRlZmluaXRpb24gb2YgcEFkLT5PcE1vZGUKKyNkZWZpbmUgT1BNT0RFX1NUQSAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgT1BNT0RFX0FQICAgICAgICAgICAgICAgICAgIDEKKy8vI2RlZmluZSBPUE1PREVfTDNfQlJHICAgICAgICAgICAgICAgMiAgICAgICAvLyBhcyBBUCBhbmQgU1RBIGF0IHRoZSBzYW1lIHRpbWUKKworI2lmZGVmIFJUX0JJR19FTkRJQU4KKyNkZWZpbmUgRElSX1JFQUQgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgRElSX1dSSVRFICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgVFlQRV9UWEQgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgVFlQRV9SWEQgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgVFlQRV9UWElORk8JCQkJCTAKKyNkZWZpbmUgVFlQRV9SWElORk8JCQkJCTEKKyNkZWZpbmUgVFlQRV9UWFdJCQkJCQkwCisjZGVmaW5lIFRZUEVfUlhXSQkJCQkJMQorI2VuZGlmCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT0gQVAgcnRtcF9kZWYuaCA9PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIHZhbHVlIGRvbWFpbiBmb3IgcEFkLT5FdmVudFRhYi5Mb2dbXS5FdmVudAorI2RlZmluZSBFVkVOVF9SRVNFVF9BQ0NFU1NfUE9JTlQgICAgMCAvLyBMb2cgPSAiaGg6bW06c3MgICBSZXN0YXJ0IEFjY2VzcyBQb2ludCIKKyNkZWZpbmUgRVZFTlRfQVNTT0NJQVRFRCAgICAgICAgICAgIDEgLy8gTG9nID0gImhoOm1tOnNzICAgU1RBIDAwOjAxOjAyOjAzOjA0OjA1IGFzc29jaWF0ZWQiCisjZGVmaW5lIEVWRU5UX0RJU0FTU09DSUFURUQgICAgICAgICAyIC8vIExvZyA9ICJoaDptbTpzcyAgIFNUQSAwMDowMTowMjowMzowNDowNSBsZWZ0IHRoaXMgQlNTIgorI2RlZmluZSBFVkVOVF9BR0VEX09VVCAgICAgICAgICAgICAgMyAvLyBMb2cgPSAiaGg6bW06c3MgICBTVEEgMDA6MDE6MDI6MDM6MDQ6MDUgd2FzIGFnZWQtb3V0IGFuZCByZW1vdmVkIGZyb20gdGhpcyBCU1MiCisjZGVmaW5lIEVWRU5UX0NPVU5URVJfTSAgICAgICAgICAgICA0CisjZGVmaW5lIEVWRU5UX0lOVkFMSURfUFNLICAgICAgICAgICA1CisjZGVmaW5lIEVWRU5UX01BWF9FVkVOVF9UWVBFICAgICAgICA2CisvLyA9PT09IGVuZCBvZiBBUCBydG1wX2RlZi5oID09PT09PT09PT09PQorCisvLyBkZWZpbml0aW9uIFJTU0kgTnVtYmVyCisjZGVmaW5lIFJTU0lfMAkJCQkJMAorI2RlZmluZSBSU1NJXzEJCQkJCTEKKyNkZWZpbmUgUlNTSV8yCQkJCQkyCisKKy8vIGRlZmluaXRpb24gb2YgcmFkYXIgZGV0ZWN0aW9uCisjZGVmaW5lIFJEX05PUk1BTF9NT0RFCQkJCTAJLy8gTm90IGZvdW5kIHJhZGFyIHNpZ25hbAorI2RlZmluZSBSRF9TV0lUQ0hJTkdfTU9ERQkJCTEJLy8gRm91bmQgcmFkYXIgc2lnbmFsLCBhbmQgZG9pbmcgY2hhbm5lbCBzd2l0Y2gKKyNkZWZpbmUgUkRfU0lMRU5DRV9NT0RFCQkJCTIJLy8gQWZ0ZXIgY2hhbm5lbCBzd2l0Y2gsIG5lZWQgdG8gYmUgc2lsZW5jZSBhIHdoaWxlIHRvIGVuc3VyZSByYWRhciBub3QgZm91bmQKKworLy9Ecml2ZXIgZGVmaW5lZCBjaWQgZm9yIG1hcHBpbmcgc3RhdHVzIGFuZCBjb21tYW5kLgorI2RlZmluZSAgU0xFRVBDSUQJMHgxMQorI2RlZmluZSAgV0FLRUNJRAkweDIyCisjZGVmaW5lICBRVUVSWVBPV0VSQ0lECTB4MzMKKyNkZWZpbmUgIE9XTkVSTUNVCTB4MQorI2RlZmluZSAgT1dORVJDUFUJMHgwCisKKy8vIE1CU1NJRCBkZWZpbml0aW9uCisjZGVmaW5lIEVOVFJZX05PVF9GT1VORCAgICAgICAgICAgICAweEZGCisKKworLyogQWZ0ZXIgTGludXggMi42LjksCisgKiBWTEFOIG1vZHVsZSB1c2UgUHJpdmF0ZSAoZnJvbSB1c2VyKSBpbnRlcmZhY2UgZmxhZ3MgKG5ldGRldmljZS0+cHJpdl9mbGFncykuCisgKiAjZGVmaW5lIElGRl84MDJfMVFfVkxBTiAweDEgICAgICAgICAtLSAgICA4MDIuMVEgVkxBTiBkZXZpY2UuICBpbiBpZi5oCisgKiByZWYgdG8gaXBfc2Fib3RhZ2Vfb3V0KCkgWyBvdXQtPnByaXZfZmxhZ3MgJiBJRkZfODAyXzFRX1ZMQU4gXSBpbiBicl9uZXRmaWx0ZXIuYworICoKKyAqIEZvciB0aGlzIHJlYXNvbiwgd2UgTVVTVCB1c2UgRVZFTiB2YWx1ZSBpbiBwcml2X2ZsYWdzCisgKi8KKyNkZWZpbmUgSU5UX01BSU4gICAgICAgICAgICAgICAgICAgIDB4MDEwMAorI2RlZmluZSBJTlRfTUJTU0lEICAgICAgICAgICAgICAgICAgMHgwMjAwCisjZGVmaW5lIElOVF9XRFMgICAgICAgICAgICAgICAgICAgICAweDAzMDAKKyNkZWZpbmUgSU5UX0FQQ0xJICAgICAgICAgICAgICAgICAgIDB4MDQwMAorI2RlZmluZSBJTlRfTUVTSCAgICAgICAgICAgICAgICAgICAJMHgwNTAwCisKKy8vIFVzZSBiaXRtYXAgdG8gYWxsb3cgY29leGlzdCBvZiBBVEVfVFhGUkFNRSBhbmQgQVRFX1JYRlJBTUUoaS5lLix0byBzdXBwb3J0IExvb3BCYWNrIG1vZGUpCisjaWZkZWYgUkFMSU5LX0FURQorI2RlZmluZQlBVEVfU1RBUlQgICAgICAgICAgICAgICAgICAgMHgwMCAgIC8vIFN0YXJ0IEFURQorI2RlZmluZQlBVEVfU1RPUCAgICAgICAgICAgICAgICAgICAgMHg4MCAgIC8vIFN0b3AgQVRFCisjZGVmaW5lCUFURV9UWENPTlQgICAgICAgICAgICAgICAgICAweDA1ICAgLy8gQ29udGludW91cyBUcmFuc21pdAorI2RlZmluZQlBVEVfVFhDQVJSICAgICAgICAgICAgICAgICAgMHgwOSAgIC8vIFRyYW5zbWl0IENhcnJpZXIKKyNkZWZpbmUJQVRFX1RYQ0FSUlNVUFAgICAgICAgICAgICAgIDB4MTEgICAvLyBUcmFuc21pdCBDYXJyaWVyIFN1cHByZXNzaW9uCisjZGVmaW5lCUFURV9UWEZSQU1FICAgICAgICAgICAgICAgICAweDAxICAgLy8gVHJhbnNtaXQgRnJhbWVzCisjZGVmaW5lCUFURV9SWEZSQU1FICAgICAgICAgICAgICAgICAweDAyICAgLy8gUmVjZWl2ZSBGcmFtZXMKKyNpZmRlZiBSQUxJTktfMjh4eF9RQQorI2RlZmluZSBBVEVfVFhTVE9QICAgICAgICAgICAgICAgICAgMHhlMiAgIC8vIFN0b3AgVHJhbnNtaXRpb24oaS5lLiwgVFhDT05ULCBUWENBUlIsIFRYQ0FSUlNVUFAsIGFuZCBUWEZSQU1FKQorI2RlZmluZSBBVEVfUlhTVE9QCQkJCQkweGZkICAgLy8gU3RvcCByZWNlaXZpbmcgRnJhbWVzCisjZGVmaW5lCUJCUDIyX1RYRlJBTUUgICAgIAkJCTB4MDAgICAvLyBUcmFuc21pdCBGcmFtZXMKKyNkZWZpbmUJQkJQMjJfVFhDT05UX09SX0NBUlJTVVBQICAgIDB4ODAgICAvLyBDb250aW51b3VzIFRyYW5zbWl0IG9yIENhcnJpZXIgU3VwcHJlc3Npb24KKyNkZWZpbmUJQkJQMjJfVFhDQVJSICAgICAgICAgICAgICAgIDB4YzEgICAvLyBUcmFuc21pdCBDYXJyaWVyCisjZGVmaW5lCUJCUDI0X1RYQ09OVCAgICAgICAgICAgICAgICAweDAwICAgLy8gQ29udGludW91cyBUcmFuc21pdAorI2RlZmluZQlCQlAyNF9DQVJSU1VQUCAgICAgICAgICAgICAgMHgwMSAgIC8vIENhcnJpZXIgU3VwcHJlc3Npb24KKyNlbmRpZiAvLyBSQUxJTktfMjh4eF9RQSAvLworI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKworLy8gV0VQIEtleSBUWVBFCisjZGVmaW5lIFdFUF9IRVhBREVDSU1BTF9UWVBFICAgIDAKKyNkZWZpbmUgV0VQX0FTQ0lJX1RZUEUgICAgICAgICAgMQorCisKKworLy8gV0lSRUxFU1MgRVZFTlRTIGRlZmluaXRpb24KKy8qIE1heCBudW1iZXIgb2YgY2hhciBpbiBjdXN0b20gZXZlbnQsIHJlZmVyIHRvIHdpcmVsZXNzX3Rvb2xzLjI4L3dpcmVsZXNzLjIwLmggKi8KKyNkZWZpbmUgSVdfQ1VTVE9NX01BWF9MRU4JCQkJICAJCQkyNTUJLyogSW4gYnl0ZXMgKi8KKworLy8gRm9yIHN5c3RlbSBldmVudCAtIHN0YXJ0CisjZGVmaW5lCUlXX1NZU19FVkVOVF9GTEFHX1NUQVJUICAgICAgICAgICAgICAgICAgICAgMHgwMjAwCisjZGVmaW5lCUlXX0FTU09DX0VWRU5UX0ZMQUcgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjAwCisjZGVmaW5lCUlXX0RJU0FTU09DX0VWRU5UX0ZMQUcgICAgICAgICAgICAgICAgICAgICAgMHgwMjAxCisjZGVmaW5lCUlXX0RFQVVUSF9FVkVOVF9GTEFHICAgICAgICAgICAgICAgICAgICAgIAkweDAyMDIKKyNkZWZpbmUJSVdfQUdFT1VUX0VWRU5UX0ZMQUcgICAgICAgICAgICAgICAgICAgICAgCTB4MDIwMworI2RlZmluZQlJV19DT1VOVEVSX01FQVNVUkVTX0VWRU5UX0ZMQUcgICAgICAgICAgICAgIDB4MDIwNAorI2RlZmluZQlJV19SRVBMQVlfQ09VTlRFUl9ESUZGX0VWRU5UX0ZMQUcgICAgICAgICAgIDB4MDIwNQorI2RlZmluZQlJV19SU05JRV9ESUZGX0VWRU5UX0ZMQUcgICAgICAgICAgIAkJCTB4MDIwNgorI2RlZmluZQlJV19NSUNfRElGRl9FVkVOVF9GTEFHICAgICAgICAgICAJCQkweDAyMDcKKyNkZWZpbmUgSVdfSUNWX0VSUk9SX0VWRU5UX0ZMQUcJCQkJCQkweDAyMDgKKyNkZWZpbmUgSVdfTUlDX0VSUk9SX0VWRU5UX0ZMQUcJCQkJCQkweDAyMDkKKyNkZWZpbmUgSVdfR1JPVVBfSFNfVElNRU9VVF9FVkVOVF9GTEFHCQkJCTB4MDIwQQorI2RlZmluZQlJV19QQUlSV0lTRV9IU19USU1FT1VUX0VWRU5UX0ZMQUcJCQkweDAyMEIKKyNkZWZpbmUgSVdfUlNOSUVfU0FOSVRZX0ZBSUxfRVZFTlRfRkxBRwkJCQkweDAyMEMKKyNkZWZpbmUgSVdfU0VUX0tFWV9ET05FX1dQQTFfRVZFTlRfRkxBRwkJCQkweDAyMEQKKyNkZWZpbmUgSVdfU0VUX0tFWV9ET05FX1dQQTJfRVZFTlRfRkxBRwkJCQkweDAyMEUKKyNkZWZpbmUgSVdfU1RBX0xJTktVUF9FVkVOVF9GTEFHCQkJCQkweDAyMEYKKyNkZWZpbmUgSVdfU1RBX0xJTktET1dOX0VWRU5UX0ZMQUcJCQkJCTB4MDIxMAorI2RlZmluZSBJV19TQ0FOX0NPTVBMRVRFRF9FVkVOVF9GTEFHCQkJCTB4MDIxMQorI2RlZmluZSBJV19TQ0FOX0VOUVVFVUVfRkFJTF9FVkVOVF9GTEFHCQkJCTB4MDIxMgorLy8gaWYgYWRkIG5ldyBzeXN0ZW0gZXZlbnQgZmxhZywgcGxlYXNlIHVwYWR0ZSB0aGUgSVdfU1lTX0VWRU5UX0ZMQUdfRU5ECisjZGVmaW5lCUlXX1NZU19FVkVOVF9GTEFHX0VORCAgICAgICAgICAgICAgICAgICAgICAgMHgwMjEyCisjZGVmaW5lCUlXX1NZU19FVkVOVF9UWVBFX05VTQkJCQkJCShJV19TWVNfRVZFTlRfRkxBR19FTkQgLSBJV19TWVNfRVZFTlRfRkxBR19TVEFSVCArIDEpCisvLyBGb3Igc3lzdGVtIGV2ZW50IC0gZW5kCisKKy8vIEZvciBzcG9vZiBhdHRhY2sgZXZlbnQgLSBzdGFydAorI2RlZmluZQlJV19TUE9PRl9FVkVOVF9GTEFHX1NUQVJUICAgICAgICAgICAgICAgICAgIDB4MDMwMAorI2RlZmluZSBJV19DT05GTElDVF9TU0lEX0VWRU5UX0ZMQUcJCQkJCTB4MDMwMAorI2RlZmluZSBJV19TUE9PRl9BU1NPQ19SRVNQX0VWRU5UX0ZMQUcJCQkJMHgwMzAxCisjZGVmaW5lIElXX1NQT09GX1JFQVNTT0NfUkVTUF9FVkVOVF9GTEFHCQkJMHgwMzAyCisjZGVmaW5lIElXX1NQT09GX1BST0JFX1JFU1BfRVZFTlRfRkxBRwkJCQkweDAzMDMKKyNkZWZpbmUgSVdfU1BPT0ZfQkVBQ09OX0VWRU5UX0ZMQUcJCQkJCTB4MDMwNAorI2RlZmluZSBJV19TUE9PRl9ESVNBU1NPQ19FVkVOVF9GTEFHCQkJCTB4MDMwNQorI2RlZmluZSBJV19TUE9PRl9BVVRIX0VWRU5UX0ZMQUcJCQkJCTB4MDMwNgorI2RlZmluZSBJV19TUE9PRl9ERUFVVEhfRVZFTlRfRkxBRwkJCQkJMHgwMzA3CisjZGVmaW5lIElXX1NQT09GX1VOS05PV05fTUdNVF9FVkVOVF9GTEFHCQkJMHgwMzA4CisjZGVmaW5lIElXX1JFUExBWV9BVFRBQ0tfRVZFTlRfRkxBRwkJCQkJMHgwMzA5CisvLyBpZiBhZGQgbmV3IHNwb29mIGF0dGFjayBldmVudCBmbGFnLCBwbGVhc2UgdXBhZHRlIHRoZSBJV19TUE9PRl9FVkVOVF9GTEFHX0VORAorI2RlZmluZQlJV19TUE9PRl9FVkVOVF9GTEFHX0VORCAgICAgICAgICAgICAgICAgICAgIDB4MDMwOQorI2RlZmluZQlJV19TUE9PRl9FVkVOVF9UWVBFX05VTQkJCQkJCShJV19TUE9PRl9FVkVOVF9GTEFHX0VORCAtIElXX1NQT09GX0VWRU5UX0ZMQUdfU1RBUlQgKyAxKQorLy8gRm9yIHNwb29mIGF0dGFjayBldmVudCAtIGVuZAorCisvLyBGb3IgZmxvb2RpbmcgYXR0YWNrIGV2ZW50IC0gc3RhcnQKKyNkZWZpbmUJSVdfRkxPT0RfRVZFTlRfRkxBR19TVEFSVCAgICAgICAgICAgICAgICAgICAweDA0MDAKKyNkZWZpbmUgSVdfRkxPT0RfQVVUSF9FVkVOVF9GTEFHCQkJCQkweDA0MDAKKyNkZWZpbmUgSVdfRkxPT0RfQVNTT0NfUkVRX0VWRU5UX0ZMQUcJCQkJMHgwNDAxCisjZGVmaW5lIElXX0ZMT09EX1JFQVNTT0NfUkVRX0VWRU5UX0ZMQUcJCQkJMHgwNDAyCisjZGVmaW5lIElXX0ZMT09EX1BST0JFX1JFUV9FVkVOVF9GTEFHCQkJCTB4MDQwMworI2RlZmluZSBJV19GTE9PRF9ESVNBU1NPQ19FVkVOVF9GTEFHCQkJCTB4MDQwNAorI2RlZmluZSBJV19GTE9PRF9ERUFVVEhfRVZFTlRfRkxBRwkJCQkJMHgwNDA1CisjZGVmaW5lIElXX0ZMT09EX0VBUF9SRVFfRVZFTlRfRkxBRwkJCQkJMHgwNDA2CisvLyBpZiBhZGQgbmV3IGZsb29kaW5nIGF0dGFjayBldmVudCBmbGFnLCBwbGVhc2UgdXBhZHRlIHRoZSBJV19GTE9PRF9FVkVOVF9GTEFHX0VORAorI2RlZmluZQlJV19GTE9PRF9FVkVOVF9GTEFHX0VORCAgICAgICAgICAgICAgICAgICAJMHgwNDA2CisjZGVmaW5lCUlXX0ZMT09EX0VWRU5UX1RZUEVfTlVNCQkJCQkJKElXX0ZMT09EX0VWRU5UX0ZMQUdfRU5EIC0gSVdfRkxPT0RfRVZFTlRfRkxBR19TVEFSVCArIDEpCisvLyBGb3IgZmxvb2RpbmcgYXR0YWNrIC0gZW5kCisKKy8vIEVuZCAtIFdJUkVMRVNTIEVWRU5UUyBkZWZpbml0aW9uCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKy8vIGRlZmluaXRpb24gZm9yIERMUywga2F0aHkKKyNkZWZpbmUJTUFYX05VTV9PRl9JTklUX0RMU19FTlRSWSAgIDEKKyNkZWZpbmUJTUFYX05VTV9PRl9ETFNfRU5UUlkgICAgICAgIE1BWF9OVU1CRVJfT0ZfRExTX0VOVFJZCisKKy8vQmxvY2sgQUNLICwgcnQyODYwLCBrYXRoeQorI2RlZmluZSBNQVhfVFhfUkVPUkRFUkJVRgkJNjQKKyNkZWZpbmUgTUFYX1JYX1JFT1JERVJCVUYJCTY0CisjZGVmaW5lIERFRkFVTFRfVFhfVElNRU9VVAkJMzAKKyNkZWZpbmUgREVGQVVMVF9SWF9USU1FT1VUCQkzMAorI2lmbmRlZiBDT05GSUdfQVBfU1VQUE9SVAorI2RlZmluZSBNQVhfQkFSRUNJX1NFU1NJT04JCTgKKyNlbmRpZgorCisjaWZuZGVmIElXX0VTU0lEX01BWF9TSVpFCisvKiBNYXhpbXVtIHNpemUgb2YgdGhlIEVTU0lEIGFuZCBwQWQtPm5pY2tuYW1lIHN0cmluZ3MgKi8KKyNkZWZpbmUgSVdfRVNTSURfTUFYX1NJWkUgICAJCTMyCisjZW5kaWYKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworI2lmZGVmIE1DQVNUX1JBVEVfU1BFQ0lGSUMKKyNkZWZpbmUgTUNBU1RfRElTQUJMRQkwCisjZGVmaW5lIE1DQVNUX0NDSwkJMQorI2RlZmluZSBNQ0FTVF9PRkRNCQkyCisjZGVmaW5lIE1DQVNUX0hUTUlYCQkzCisjZW5kaWYgLy8gTUNBU1RfUkFURV9TUEVDSUZJQyAvLworCisvLyBGb3IgQXNpY1JhZGlvT2ZmL0FzaWNSYWRpb09uIGZ1bmN0aW9uCisjZGVmaW5lIERPVDExUE9XRVJTQVZFCQkwCisjZGVmaW5lIEdVSVJBRElPX09GRgkJMQorI2RlZmluZSBSVE1QX0hBTFQJCSAgICAyCisjZGVmaW5lIEdVSV9JRExFX1BPV0VSX1NBVkUJCTMKKy8vIC0tCisKKworLy8gZGVmaW5pdGlvbiBmb3IgV3BhU3VwcG9ydCBmbGFnCisjZGVmaW5lIFdQQV9TVVBQTElDQU5UX0RJU0FCTEUJCQkJMAorI2RlZmluZSBXUEFfU1VQUExJQ0FOVF9FTkFCTEUJCQkJMQorI2RlZmluZQlXUEFfU1VQUExJQ0FOVF9FTkFCTEVfV0lUSF9XRUJfVUkJMgorCisvLyBFbmRpYW4gYnl0ZSBzd2FwcGluZyBjb2RlcworI2RlZmluZSBTV0FQMTYoeCkgXAorICAgICgoVUlOVDE2KSggXAorICAgICgoKFVJTlQxNikoeCkgJiAoVUlOVDE2KSAweDAwZmZVKSA8PCA4KSB8IFwKKyAgICAoKChVSU5UMTYpKHgpICYgKFVJTlQxNikgMHhmZjAwVSkgPj4gOCkgKSkKKworI2RlZmluZSBTV0FQMzIoeCkgXAorICAgICgoVUlOVDMyKSggXAorICAgICgoKFVJTlQzMikoeCkgJiAoVUlOVDMyKSAweDAwMDAwMGZmVUwpIDw8IDI0KSB8IFwKKyAgICAoKChVSU5UMzIpKHgpICYgKFVJTlQzMikgMHgwMDAwZmYwMFVMKSA8PCAgOCkgfCBcCisgICAgKCgoVUlOVDMyKSh4KSAmIChVSU5UMzIpIDB4MDBmZjAwMDBVTCkgPj4gIDgpIHwgXAorICAgICgoKFVJTlQzMikoeCkgJiAoVUlOVDMyKSAweGZmMDAwMDAwVUwpID4+IDI0KSApKQorCisjZGVmaW5lIFNXQVA2NCh4KSBcCisgICAgKChVSU5UNjQpKCBcCisgICAgKFVJTlQ2NCkoKChVSU5UNjQpKHgpICYgKFVJTlQ2NCkgMHgwMDAwMDAwMDAwMDAwMGZmVUxMKSA8PCA1NikgfCBcCisgICAgKFVJTlQ2NCkoKChVSU5UNjQpKHgpICYgKFVJTlQ2NCkgMHgwMDAwMDAwMDAwMDBmZjAwVUxMKSA8PCA0MCkgfCBcCisgICAgKFVJTlQ2NCkoKChVSU5UNjQpKHgpICYgKFVJTlQ2NCkgMHgwMDAwMDAwMDAwZmYwMDAwVUxMKSA8PCAyNCkgfCBcCisgICAgKFVJTlQ2NCkoKChVSU5UNjQpKHgpICYgKFVJTlQ2NCkgMHgwMDAwMDAwMGZmMDAwMDAwVUxMKSA8PCAgOCkgfCBcCisgICAgKFVJTlQ2NCkoKChVSU5UNjQpKHgpICYgKFVJTlQ2NCkgMHgwMDAwMDBmZjAwMDAwMDAwVUxMKSA+PiAgOCkgfCBcCisgICAgKFVJTlQ2NCkoKChVSU5UNjQpKHgpICYgKFVJTlQ2NCkgMHgwMDAwZmYwMDAwMDAwMDAwVUxMKSA+PiAyNCkgfCBcCisgICAgKFVJTlQ2NCkoKChVSU5UNjQpKHgpICYgKFVJTlQ2NCkgMHgwMGZmMDAwMDAwMDAwMDAwVUxMKSA+PiA0MCkgfCBcCisgICAgKFVJTlQ2NCkoKChVSU5UNjQpKHgpICYgKFVJTlQ2NCkgMHhmZjAwMDAwMDAwMDAwMDAwVUxMKSA+PiA1NikgKSkKKworI2lmZGVmIFJUX0JJR19FTkRJQU4KKworI2RlZmluZSBjcHUybGU2NCh4KSBTV0FQNjQoKHgpKQorI2RlZmluZSBsZTJjcHU2NCh4KSBTV0FQNjQoKHgpKQorI2RlZmluZSBjcHUybGUzMih4KSBTV0FQMzIoKHgpKQorI2RlZmluZSBsZTJjcHUzMih4KSBTV0FQMzIoKHgpKQorI2RlZmluZSBjcHUybGUxNih4KSBTV0FQMTYoKHgpKQorI2RlZmluZSBsZTJjcHUxNih4KSBTV0FQMTYoKHgpKQorI2RlZmluZSBjcHUyYmU2NCh4KSAoKFVJTlQ2NCkoeCkpCisjZGVmaW5lIGJlMmNwdTY0KHgpICgoVUlOVDY0KSh4KSkKKyNkZWZpbmUgY3B1MmJlMzIoeCkgKChVSU5UMzIpKHgpKQorI2RlZmluZSBiZTJjcHUzMih4KSAoKFVJTlQzMikoeCkpCisjZGVmaW5lIGNwdTJiZTE2KHgpICgoVUlOVDE2KSh4KSkKKyNkZWZpbmUgYmUyY3B1MTYoeCkgKChVSU5UMTYpKHgpKQorCisjZWxzZSAgIC8vIExpdHRsZV9FbmRpYW4KKworI2RlZmluZSBjcHUybGU2NCh4KSAoKFVJTlQ2NCkoeCkpCisjZGVmaW5lIGxlMmNwdTY0KHgpICgoVUlOVDY0KSh4KSkKKyNkZWZpbmUgY3B1MmxlMzIoeCkgKChVSU5UMzIpKHgpKQorI2RlZmluZSBsZTJjcHUzMih4KSAoKFVJTlQzMikoeCkpCisjZGVmaW5lIGNwdTJsZTE2KHgpICgoVUlOVDE2KSh4KSkKKyNkZWZpbmUgbGUyY3B1MTYoeCkgKChVSU5UMTYpKHgpKQorI2RlZmluZSBjcHUyYmU2NCh4KSBTV0FQNjQoKHgpKQorI2RlZmluZSBiZTJjcHU2NCh4KSBTV0FQNjQoKHgpKQorI2RlZmluZSBjcHUyYmUzMih4KSBTV0FQMzIoKHgpKQorI2RlZmluZSBiZTJjcHUzMih4KSBTV0FQMzIoKHgpKQorI2RlZmluZSBjcHUyYmUxNih4KSBTV0FQMTYoKHgpKQorI2RlZmluZSBiZTJjcHUxNih4KSBTV0FQMTYoKHgpKQorCisjZW5kaWYgIC8vIFJUX0JJR19FTkRJQU4KKworI2VuZGlmICAvLyBfX1JUTVBfREVGX0hfXworCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRtcF90eXBlLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0bXBfdHlwZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmZDdkZjEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0bXBfdHlwZS5oCkBAIC0wLDAgKzEsOTQgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgTW9kdWxlIE5hbWU6CisgICAgcnRtcF90eXBlLmgKKworICAgIEFic3RyYWN0OgorCisgICAgUmV2aXNpb24gSGlzdG9yeToKKyAgICBXaG8gICAgICAgICBXaGVuICAgICAgICAgICAgV2hhdAorICAgIC0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgTmFtZSAgICAgICAgRGF0ZSAgICAgICAgICAgIE1vZGlmaWNhdGlvbiBsb2dzCisgICAgUGF1bCBMaW4gICAgMS0yLTIwMDQKKyovCisjaWZuZGVmIF9fUlRNUF9UWVBFX0hfXworI2RlZmluZSBfX1JUTVBfVFlQRV9IX18KKworI2RlZmluZSBQQUNLRUQgIF9fYXR0cmlidXRlX18gKChwYWNrZWQpKQorCisvLyBQdXQgcGxhdGZvcm0gZGVwZW5kZW50IGRlY2xhcmF0aW9uIGhlcmUKKy8vIEZvciBleGFtcGxlLCBsaW51eCB0eXBlIGRlZmluaXRpb24KK3R5cGVkZWYgdW5zaWduZWQgY2hhcgkJVUlOVDg7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0CQlVSU5UMTY7Cit0eXBlZGVmIHVuc2lnbmVkIGludAkJVUlOVDMyOwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcJVUlOVDY0OwordHlwZWRlZiBpbnQJCQkJCUlOVDMyOwordHlwZWRlZiBsb25nIGxvbmcgCQkJSU5UNjQ7CisKK3R5cGVkZWYgdW5zaWduZWQgY2hhciAqCQkJUFVJTlQ4OwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCAqCQlQVUlOVDE2OwordHlwZWRlZiB1bnNpZ25lZCBpbnQgKgkJCVBVSU5UMzI7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyAqCVBVSU5UNjQ7Cit0eXBlZGVmIGludAkqCQkJCQlQSU5UMzI7Cit0eXBlZGVmIGxvbmcgbG9uZyAqIAkJCVBJTlQ2NDsKKwordHlwZWRlZiBzaWduZWQgY2hhcgkJCUNIQVI7Cit0eXBlZGVmIHNpZ25lZCBzaG9ydAkJU0hPUlQ7Cit0eXBlZGVmIHNpZ25lZCBpbnQJCQlJTlQ7Cit0eXBlZGVmIHNpZ25lZCBsb25nCQkJTE9ORzsKK3R5cGVkZWYgc2lnbmVkIGxvbmcgbG9uZwlMT05HTE9ORzsKKworCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIJCVVDSEFSOwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydAkJVVNIT1JUOwordHlwZWRlZiB1bnNpZ25lZCBpbnQJCVVJTlQ7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcJCVVMT05HOwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcJVUxPTkdMT05HOworCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIJCUJPT0xFQU47Cit0eXBlZGVmIHZvaWQJCQkJVk9JRDsKKwordHlwZWRlZiBWT0lEICoJCQkJUFZPSUQ7Cit0eXBlZGVmIENIQVIgKgkJCQlQQ0hBUjsKK3R5cGVkZWYgVUNIQVIgKiAJCQlQVUNIQVI7Cit0eXBlZGVmIFVTSE9SVCAqCQkJUFVTSE9SVDsKK3R5cGVkZWYgTE9ORyAqCQkJCVBMT05HOwordHlwZWRlZiBVTE9ORyAqCQkJCVBVTE9ORzsKK3R5cGVkZWYgVUlOVCAqCQkJCVBVSU5UOworCit0eXBlZGVmIHVuc2lnbmVkIGludAlORElTX01FRElBX1NUQVRFOworCit0eXBlZGVmIHVuaW9uIF9MQVJHRV9JTlRFR0VSIHsKKyAgICBzdHJ1Y3QgeworICAgICAgICBVSU5UIExvd1BhcnQ7CisgICAgICAgIElOVDMyIEhpZ2hQYXJ0OworICAgIH0gdTsKKyAgICBJTlQ2NCBRdWFkUGFydDsKK30gTEFSR0VfSU5URUdFUjsKKworI2VuZGlmICAvLyBfX1JUTVBfVFlQRV9IX18KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zcGVjdHJ1bS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zcGVjdHJ1bS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwZjI1ZGIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3NwZWN0cnVtLmgKQEAgLTAsMCArMSwzMjIgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KKworI2lmbmRlZiBfX1NQRUNUUlVNX0hfXworI2RlZmluZSBfX1NQRUNUUlVNX0hfXworCisjaW5jbHVkZSAicnRtcF90eXBlLmgiCisjaW5jbHVkZSAic3BlY3RydW1fZGVmLmgiCisKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfVFBDX1JFUE9SVF9JTkZPCit7CisJVUlOVDggVHhQd3I7CisJVUlOVDggTGlua01hcmdpbjsKK30gVFBDX1JFUE9SVF9JTkZPLCAqUFRQQ19SRVBPUlRfSU5GTzsKKwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9DSF9TV19BTk5fSU5GTworeworCVVJTlQ4IENoU3dNb2RlOworCVVJTlQ4IENoYW5uZWw7CisJVUlOVDggQ2hTd0NudDsKK30gQ0hfU1dfQU5OX0lORk8sICpQQ0hfU1dfQU5OX0lORk87CisKK3R5cGVkZWYgdW5pb24gUEFDS0VEIF9NRUFTVVJFX1JFUV9NT0RFCit7CisjaWZkZWYgUlRfQklHX0VORElBTgorCXN0cnVjdCBQQUNLRUQKKwl7CisJCVVJTlQ4IFJldjE6NDsKKwkJVUlOVDggUmVwb3J0OjE7CisJCVVJTlQ4IFJlcXVlc3Q6MTsKKwkJVUlOVDggRW5hYmxlOjE7CisJCVVJTlQ4IFJldjA6MTsKKwl9IGZpZWxkOworI2Vsc2UKKwlzdHJ1Y3QgUEFDS0VECisJeworCQlVSU5UOCBSZXYwOjE7CisJCVVJTlQ4IEVuYWJsZToxOworCQlVSU5UOCBSZXF1ZXN0OjE7CisJCVVJTlQ4IFJlcG9ydDoxOworCQlVSU5UOCBSZXYxOjQ7CisJfSBmaWVsZDsKKyNlbmRpZiAvLyBSVF9CSUdfRU5ESUFOIC8vCisJVUlOVDggd29yZDsKK30gTUVBU1VSRV9SRVFfTU9ERSwgKlBNRUFTVVJFX1JFUV9NT0RFOworCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX01FQVNVUkVfUkVRCit7CisJVUlOVDggQ2hOdW07CisJVUlOVDY0IE1lYXN1cmVTdGFydFRpbWU7CisJVUlOVDE2IE1lYXN1cmVEdXJhdGlvbjsKK30gTUVBU1VSRV9SRVEsICpQTUVBU1VSRV9SRVE7CisKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfTUVBU1VSRV9SRVFfSU5GTworeworCVVJTlQ4IFRva2VuOworCU1FQVNVUkVfUkVRX01PREUgUmVxTW9kZTsKKwlVSU5UOCBSZXFUeXBlOworCU1FQVNVUkVfUkVRIE1lYXN1cmVSZXE7Cit9IE1FQVNVUkVfUkVRX0lORk8sICpQTUVBU1VSRV9SRVFfSU5GTzsKKwordHlwZWRlZiB1bmlvbiBQQUNLRUQgX01FQVNVUkVfQkFTSUNfUkVQT1JUX01BUAoreworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwlzdHJ1Y3QgUEFDS0VECisJeworCQlVSU5UOCBSZXY6MzsKKwkJVUlOVDggVW5tZWFzdXJlOjE7CisJCVVJTlQ4IFJhZGFyOjE7CisJCVVJTlQ4IFVuaWRlbnRpZmllZFNpZ25hbDoxOworCQlVSU5UOCBPZmRtUHJlYW1ibGU6MTsKKwkJVUlOVDggQlNTOjE7CisJfSBmaWVsZDsKKyNlbHNlCisJc3RydWN0IFBBQ0tFRAorCXsKKwkJVUlOVDggQlNTOjE7CisJCVVJTlQ4IE9mZG1QcmVhbWJsZToxOworCQlVSU5UOCBVbmlkZW50aWZpZWRTaWduYWw6MTsKKwkJVUlOVDggUmFkYXI6MTsKKwkJVUlOVDggVW5tZWFzdXJlOjE7CisJCVVJTlQ4IFJldjozOworCX0gZmllbGQ7CisjZW5kaWYgLy8gUlRfQklHX0VORElBTiAvLworCVVJTlQ4IHdvcmQ7Cit9IE1FQVNVUkVfQkFTSUNfUkVQT1JUX01BUCwgKlBNRUFTVVJFX0JBU0lDX1JFUE9SVF9NQVA7CisKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfTUVBU1VSRV9CQVNJQ19SRVBPUlQKK3sKKwlVSU5UOCBDaE51bTsKKwlVSU5UNjQgTWVhc3VyZVN0YXJ0VGltZTsKKwlVSU5UMTYgTWVhc3VyZUR1cmF0aW9uOworCU1FQVNVUkVfQkFTSUNfUkVQT1JUX01BUCBNYXA7Cit9IE1FQVNVUkVfQkFTSUNfUkVQT1JULCAqUE1FQVNVUkVfQkFTSUNfUkVQT1JUOworCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX01FQVNVUkVfQ0NBX1JFUE9SVAoreworCVVJTlQ4IENoTnVtOworCVVJTlQ2NCBNZWFzdXJlU3RhcnRUaW1lOworCVVJTlQxNiBNZWFzdXJlRHVyYXRpb247CisJVUlOVDggQ0NBX0J1c3lfRnJhY3Rpb247Cit9IE1FQVNVUkVfQ0NBX1JFUE9SVCwgKlBNRUFTVVJFX0NDQV9SRVBPUlQ7CisKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfTUVBU1VSRV9SUElfUkVQT1JUCit7CisJVUlOVDggQ2hOdW07CisJVUlOVDY0IE1lYXN1cmVTdGFydFRpbWU7CisJVUlOVDE2IE1lYXN1cmVEdXJhdGlvbjsKKwlVSU5UOCBSUElfRGVuc2l0eVs4XTsKK30gTUVBU1VSRV9SUElfUkVQT1JULCAqUE1FQVNVUkVfUlBJX1JFUE9SVDsKKwordHlwZWRlZiB1bmlvbiBQQUNLRUQgX01FQVNVUkVfUkVQT1JUX01PREUKK3sKKwlzdHJ1Y3QgUEFDS0VECisJeworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwkJVUlOVDggUmV2OjU7CisJCVVJTlQ4IFJlZnVzZWQ6MTsKKwkJVUlOVDggSW5jYXBhYmxlOjE7CisJCVVJTlQ4IExhdGU6MTsKKyNlbHNlCisJCVVJTlQ4IExhdGU6MTsKKwkJVUlOVDggSW5jYXBhYmxlOjE7CisJCVVJTlQ4IFJlZnVzZWQ6MTsKKwkJVUlOVDggUmV2OjU7CisjZW5kaWYgLy8gUlRfQklHX0VORElBTiAvLworCX0gZmllbGQ7CisJVUlOVDggd29yZDsKK30gTUVBU1VSRV9SRVBPUlRfTU9ERSwgKlBNRUFTVVJFX1JFUE9SVF9NT0RFOworCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX01FQVNVUkVfUkVQT1JUX0lORk8KK3sKKwlVSU5UOCBUb2tlbjsKKwlNRUFTVVJFX1JFUE9SVF9NT0RFIFJlcG9ydE1vZGU7CisJVUlOVDggUmVwb3J0VHlwZTsKKwlVSU5UOCBPY3RlY3RbMF07Cit9IE1FQVNVUkVfUkVQT1JUX0lORk8sICpQTUVBU1VSRV9SRVBPUlRfSU5GTzsKKwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9RVUlFVF9JTkZPCit7CisJVUlOVDggUXVpZXRDbnQ7CisJVUlOVDggUXVpZXRQZXJpb2Q7CisJVUlOVDggUXVpZXREdXJhdGlvbjsKKwlVSU5UOCBRdWlldE9mZnNldDsKK30gUVVJRVRfSU5GTywgKlBRVUlFVF9JTkZPOworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVByZXBhcmUgTWVhc3VyZW1lbnQgcmVxdWVzdCBhY3Rpb24gZnJhbWUgYW5kIGVucXVldWUgaXQgaW50bworCQltYW5hZ2VtZW50IHF1ZXVlIHdhaXRpbmcgZm9yIHRyYW5zbWl0aW9uLgorCisJUGFyYW1ldHJzOgorCQkxLiB0aGUgZGVzdGluYXRpb24gbWFjIGFkZHJlc3Mgb2YgdGhlIGZyYW1lLgorCisJUmV0dXJuCTogTm9uZS4KKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIEVucXVldWVNZWFzdXJlbWVudFJlcSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBQVUNIQVIgcERBLAorCUlOIFVJTlQ4IE1lYXN1cmVUb2tlbiwKKwlJTiBVSU5UOCBNZWFzdXJlUmVxTW9kZSwKKwlJTiBVSU5UOCBNZWFzdXJlUmVxVHlwZSwKKwlJTiBVSU5UOCBNZWFzdXJlQ2gsCisJSU4gVUlOVDE2IE1lYXN1cmVEdXJhdGlvbik7CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJUHJlcGFyZSBNZWFzdXJlbWVudCByZXBvcnQgYWN0aW9uIGZyYW1lIGFuZCBlbnF1ZXVlIGl0IGludG8KKwkJbWFuYWdlbWVudCBxdWV1ZSB3YWl0aW5nIGZvciB0cmFuc21pdGlvbi4KKworCVBhcmFtZXRyczoKKwkJMS4gdGhlIGRlc3RpbmF0aW9uIG1hYyBhZGRyZXNzIG9mIHRoZSBmcmFtZS4KKworCVJldHVybgk6IE5vbmUuCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBFbnF1ZXVlTWVhc3VyZW1lbnRSZXAoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gUFVDSEFSIHBEQSwKKwlJTiBVSU5UOCBEaWFsb2dUb2tlbiwKKwlJTiBVSU5UOCBNZWFzdXJlVG9rZW4sCisJSU4gVUlOVDggTWVhc3VyZVJlcU1vZGUsCisJSU4gVUlOVDggTWVhc3VyZVJlcVR5cGUsCisJSU4gVUlOVDggUmVwb3J0SW5mb0xlbiwKKwlJTiBQVUlOVDggcFJlcG9ydEluZm8pOworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVByZXBhcmUgVFBDIFJlcXVlc3QgYWN0aW9uIGZyYW1lIGFuZCBlbnF1ZXVlIGl0IGludG8KKwkJbWFuYWdlbWVudCBxdWV1ZSB3YWl0aW5nIGZvciB0cmFuc21pdGlvbi4KKworCVBhcmFtZXRyczoKKwkJMS4gdGhlIGRlc3RpbmF0aW9uIG1hYyBhZGRyZXNzIG9mIHRoZSBmcmFtZS4KKworCVJldHVybgk6IE5vbmUuCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBFbnF1ZXVlVFBDUmVxKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFBVQ0hBUiBwREEsCisJSU4gVUNIQVIgRGlhbG9nVG9rZW4pOworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVByZXBhcmUgVFBDIFJlcG9ydCBhY3Rpb24gZnJhbWUgYW5kIGVucXVldWUgaXQgaW50bworCQltYW5hZ2VtZW50IHF1ZXVlIHdhaXRpbmcgZm9yIHRyYW5zbWl0aW9uLgorCisJUGFyYW1ldHJzOgorCQkxLiB0aGUgZGVzdGluYXRpb24gbWFjIGFkZHJlc3Mgb2YgdGhlIGZyYW1lLgorCisJUmV0dXJuCTogTm9uZS4KKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIEVucXVldWVUUENSZXAoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gUFVDSEFSIHBEQSwKKwlJTiBVSU5UOCBEaWFsb2dUb2tlbiwKKwlJTiBVSU5UOCBUeFB3ciwKKwlJTiBVSU5UOCBMaW5rTWFyZ2luKTsKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlQcmVwYXJlIENoYW5uZWwgU3dpdGNoIEFubm91bmNlbWVudCBhY3Rpb24gZnJhbWUgYW5kIGVucXVldWUgaXQgaW50bworCQltYW5hZ2VtZW50IHF1ZXVlIHdhaXRpbmcgZm9yIHRyYW5zbWl0aW9uLgorCisJUGFyYW1ldHJzOgorCQkxLiB0aGUgZGVzdGluYXRpb24gbWFjIGFkZHJlc3Mgb2YgdGhlIGZyYW1lLgorCQkyLiBDaGFubmVsIHN3aXRjaCBhbm5vdW5jZW1lbnQgbW9kZS4KKwkJMi4gYSBOZXcgc2VsZWN0ZWQgY2hhbm5lbC4KKworCVJldHVybgk6IE5vbmUuCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBFbnF1ZXVlQ2hTd0FubigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBQVUNIQVIgcERBLAorCUlOIFVJTlQ4IENoU3dNb2RlLAorCUlOIFVJTlQ4IE5ld0NoKTsKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlTcGVjdHJ1biBhY3Rpb24gZnJhbWVzIEhhbmRsZXIgc3VjaCBhcyBjaGFubmVsIHN3aXRjaCBhbm5vdWNlbWVudCwKKwkJbWVhc3VyZW1lbnQgcmVwb3J0LCBtZWFzdXJlbWVudCByZXF1ZXN0IGFjdGlvbnMgZnJhbWVzLgorCisJUGFyYW1ldHJzOgorCQlFbG1lIC0gTUxNRSBtZXNzYWdlIGNvbnRhaW5pbmcgdGhlIHJlY2VpdmVkIGZyYW1lCisKKwlSZXR1cm4JOiBOb25lLgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgUGVlclNwZWN0cnVtQWN0aW9uKAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKworCVBhcmFtZXRyczoKKworCVJldHVybgk6IE5vbmUuCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworSU5UIFNldF9NZWFzdXJlUmVxX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UIFNldF9UcGNSZXFfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitWT0lEIE1lYXN1cmVSZXFUYWJJbml0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKworVk9JRCBNZWFzdXJlUmVxVGFiRXhpdCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK1ZPSUQgVHBjUmVxVGFiSW5pdCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK1ZPSUQgVHBjUmVxVGFiRXhpdCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK1ZPSUQgTm90aWZ5Q2hTd0FublRvUGVlckFQcygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBQVUNIQVIgcFJBLAorCUlOIFBVQ0hBUiBwVEEsCisJSU4gVUlOVDggQ2hTd01vZGUsCisJSU4gVUlOVDggQ2hhbm5lbCk7CisjZW5kaWYgLy8gX19TUEVDVFJVTV9IX18gLy8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zcGVjdHJ1bV9kZWYuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3BlY3RydW1fZGVmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNhNDgxNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3BlY3RydW1fZGVmLmgKQEAgLTAsMCArMSw5NSBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICBNb2R1bGUgTmFtZToKKwlzcGVjdHJ1bV9kZWYuaAorCisgICAgQWJzdHJhY3Q6CisgICAgSGFuZGxlIGFzc29jaWF0aW9uIHJlbGF0ZWQgcmVxdWVzdHMgZWl0aGVyIGZyb20gV1NUQSBvciBmcm9tIGxvY2FsIE1MTUUKKworICAgIFJldmlzaW9uIEhpc3Rvcnk6CisgICAgV2hvICAgICAgICAgIFdoZW4gICAgICAgICAgV2hhdAorICAgIC0tLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlGb25jaGkgV3UgICAgMjAwOAkgIAkgICBjcmVhdGVkIGZvciA4MDIuMTFoCisgKi8KKworI2lmbmRlZiBfX1NQRUNUUlVNX0RFRl9IX18KKyNkZWZpbmUgX19TUEVDVFJVTV9ERUZfSF9fCisKKyNkZWZpbmUgTUFYX01FQVNVUkVfUkVRX1RBQl9TSVpFCQkzCisjZGVmaW5lIE1BWF9IQVNIX01FQVNVUkVfUkVRX1RBQl9TSVpFCU1BWF9NRUFTVVJFX1JFUV9UQUJfU0laRQorCisjZGVmaW5lIE1BWF9UUENfUkVRX1RBQl9TSVpFCQkJMworI2RlZmluZSBNQVhfSEFTSF9UUENfUkVRX1RBQl9TSVpFCQlNQVhfVFBDX1JFUV9UQUJfU0laRQorCisjZGVmaW5lIE1JTl9SQ1ZfUFdSCQkJCTEwMAkJLyogTmVnYXRpdmUgdmFsdWUgKChkQm0pICovCisKKyNkZWZpbmUgUk1fVFBDX1JFUQkJCQkwCisjZGVmaW5lIFJNX01FQVNVUkVfUkVRCQkJMQorCisjZGVmaW5lIFJNX0JBU0lDCQkJCTAKKyNkZWZpbmUgUk1fQ0NBCQkJCQkxCisjZGVmaW5lIFJNX1JQSV9ISVNUT0dSQU0JCTIKKworI2RlZmluZSBUUENfUkVRX0FHRV9PVVQJCQk1MDAJCS8qIG1zICovCisjZGVmaW5lIE1RX1JFUV9BR0VfT1VUCQkJNTAwCQkvKiBtcyAqLworCisjZGVmaW5lIFRQQ19ESUFMT0dUT0tFTl9IQVNIX0lOREVYKF9EaWFsb2dUb2tlbikJKChfRGlhbG9nVG9rZW4pICUgTUFYX0hBU0hfVFBDX1JFUV9UQUJfU0laRSkKKyNkZWZpbmUgTVFfRElBTE9HVE9LRU5fSEFTSF9JTkRFWChfRGlhbG9nVG9rZW4pCQkoKF9EaWFsb2dUb2tlbikgJSBNQVhfTUVBU1VSRV9SRVFfVEFCX1NJWkUpCisKK3R5cGVkZWYgc3RydWN0IF9NRUFTVVJFX1JFUV9FTlRSWQoreworCXN0cnVjdCBfTUVBU1VSRV9SRVFfRU5UUlkgKnBOZXh0OworCVVMT05HIGxhc3RUaW1lOworCUJPT0xFQU4JVmFsaWQ7CisJVUlOVDggRGlhbG9nVG9rZW47CisJVUlOVDggTWVhc3VyZURpYWxvZ1Rva2VuWzNdOwkvLyAwOmJhc2ljIG1lYXN1cmUsIDE6IENDQSBtZWFzdXJlLCAyOiBSUElfSGlzdG9ncmFtIG1lYXN1cmUuCit9IE1FQVNVUkVfUkVRX0VOVFJZLCAqUE1FQVNVUkVfUkVRX0VOVFJZOworCit0eXBlZGVmIHN0cnVjdCBfTUVBU1VSRV9SRVFfVEFCCit7CisJVUNIQVIgU2l6ZTsKKwlQTUVBU1VSRV9SRVFfRU5UUlkgSGFzaFtNQVhfSEFTSF9NRUFTVVJFX1JFUV9UQUJfU0laRV07CisJTUVBU1VSRV9SRVFfRU5UUlkgQ29udGVudFtNQVhfTUVBU1VSRV9SRVFfVEFCX1NJWkVdOworfSBNRUFTVVJFX1JFUV9UQUIsICpQTUVBU1VSRV9SRVFfVEFCOworCit0eXBlZGVmIHN0cnVjdCBfVFBDX1JFUV9FTlRSWQoreworCXN0cnVjdCBfVFBDX1JFUV9FTlRSWSAqcE5leHQ7CisJVUxPTkcgbGFzdFRpbWU7CisJQk9PTEVBTiBWYWxpZDsKKwlVSU5UOCBEaWFsb2dUb2tlbjsKK30gVFBDX1JFUV9FTlRSWSwgKlBUUENfUkVRX0VOVFJZOworCit0eXBlZGVmIHN0cnVjdCBfVFBDX1JFUV9UQUIKK3sKKwlVQ0hBUiBTaXplOworCVBUUENfUkVRX0VOVFJZIEhhc2hbTUFYX0hBU0hfVFBDX1JFUV9UQUJfU0laRV07CisJVFBDX1JFUV9FTlRSWSBDb250ZW50W01BWF9UUENfUkVRX1RBQl9TSVpFXTsKK30gVFBDX1JFUV9UQUIsICpQVFBDX1JFUV9UQUI7CisKKyNlbmRpZiAvLyBfX1NQRUNUUlVNX0RFRl9IX18gLy8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zdGEvYWlyb25ldC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zdGEvYWlyb25ldC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhZjRhMTkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3N0YS9haXJvbmV0LmMKQEAgLTAsMCArMSwxMzEyIEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCU1vZHVsZSBOYW1lOgorCWFpcm9uZXQuYworCisJQWJzdHJhY3Q6CisKKwlSZXZpc2lvbiBIaXN0b3J5OgorCVdobwkJCVdoZW4JCQlXaGF0CisJLS0tLS0tLS0JLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCVBhdWwgTGluCTA0LTA2LTE1CQlJbml0aWFsCisqLworI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCWFzc29jaWF0aW9uCXN0YXRlIG1hY2hpbmUgaW5pdCwJaW5jbHVkaW5nIHN0YXRlCXRyYW5zaXRpb24gYW5kIHRpbWVyIGluaXQKKwlQYXJhbWV0ZXJzOgorCQlTIC0JcG9pbnRlcgl0byB0aGUgYXNzb2NpYXRpb24gc3RhdGUgbWFjaGluZQorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQJQWlyb25ldFN0YXRlTWFjaGluZUluaXQoCisJSU4JUFJUTVBfQURBUFRFUgkJcEFkLAorCUlOCVNUQVRFX01BQ0hJTkUJCSpTLAorCU9VVAlTVEFURV9NQUNISU5FX0ZVTkMJVHJhbnNbXSkKK3sKKwlTdGF0ZU1hY2hpbmVJbml0KFMsCVRyYW5zLCBNQVhfQUlST05FVF9TVEFURSwgTUFYX0FJUk9ORVRfTVNHLCAoU1RBVEVfTUFDSElORV9GVU5DKURyb3AsIEFJUk9ORVRfSURMRSwgQUlST05FVF9NQUNISU5FX0JBU0UpOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBSVJPTkVUX0lETEUsIE1UMl9BSVJPTkVUX01TRywgKFNUQVRFX01BQ0hJTkVfRlVOQylBaXJvbmV0TXNnQWN0aW9uKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQUlST05FVF9JRExFLCBNVDJfQUlST05FVF9TQ0FOX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylBaXJvbmV0UmVxdWVzdEFjdGlvbik7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFJUk9ORVRfU0NBTk5JTkcsIE1UMl9BSVJPTkVUX1NDQU5fRE9ORSwgKFNUQVRFX01BQ0hJTkVfRlVOQylBaXJvbmV0UmVwb3J0QWN0aW9uKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlUaGlzIGlzCXN0YXRlIG1hY2hpbmUgZnVuY3Rpb24uCisJCVdoZW4gcmVjZWl2aW5nIEVBUE9MIHBhY2tldHMgd2hpY2ggaXMgIGZvciA4MDIuMXgga2V5IG1hbmFnZW1lbnQuCisJCVVzZQlib3RoIGluCVdQQSwgYW5kIFdQQVBTSwljYXNlLgorCQlJbiB0aGlzCWZ1bmN0aW9uLCBmdXJ0aGVyIGRpc3BhdGNoIHRvIGRpZmZlcmVudAlmdW5jdGlvbnMgYWNjb3JkaW5nCXRvIHRoZSByZWNlaXZlZAlwYWNrZXQuCSAzIGNhdGVnb3JpZXMgYXJlIDoKKwkJICAxLiAgbm9ybWFsIDQtd2F5IHBhaXJ3aXNla2V5IGFuZCAyLXdheSBncm91cGtleSBoYW5kc2hha2UKKwkJICAyLiAgTUlDIGVycm9yCShDb3VudGVybWVhc3VyZXMgYXR0YWNrKSAgcmVwb3J0IHBhY2tldAlmcm9tIFNUQS4KKwkJICAzLiAgUmVxdWVzdCBmb3IgcGFpcndpc2UvZ3JvdXAga2V5IHVwZGF0ZQlmcm9tIFNUQQorCVJldHVybjoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJQWlyb25ldE1zZ0FjdGlvbigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglNTE1FX1FVRVVFX0VMRU0JKkVsZW0pCit7CisJVVNIT1JUCQkJCQkJCUxlbmd0aDsKKwlVQ0hBUgkJCQkJCQlJbmRleCwgaTsKKwlQVUNIQVIJCQkJCQkJcERhdGE7CisJUEFJUk9ORVRfUk1fUkVRVUVTVF9GUkFNRQkJcFJNUmVxOworCVBSTV9SRVFVRVNUX0FDVElPTgkJCQlwUmVxRWxlbTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tLS0tPiBBaXJvbmV0TXNnQWN0aW9uXG4iKSk7CisKKwkvLyAwLiBHZXQgQWlyb25ldCBJQVBQIGhlYWRlciBmaXJzdAorCXBSTVJlcSA9IChQQUlST05FVF9STV9SRVFVRVNUX0ZSQU1FKSAmRWxlbS0+TXNnW0xFTkdUSF84MDJfMTFdOworCXBEYXRhICA9IChQVUNIQVIpICZFbGVtLT5Nc2dbTEVOR1RIXzgwMl8xMV07CisKKwkvLyAxLiBDaGFuZ2UgZW5kaWFuIGZvcm1hdCBmb3JtIG5ldHdvcmsgdG8gbGl0dGxlIGVuZGlhbgorCUxlbmd0aCA9IGJlMmNwdTE2KHBSTVJlcS0+SUFQUC5MZW5ndGgpOworCisJLy8gMi4wIFNhbml0eSBjaGVjaywgdGhpcyBzaG91bGQgb25seSBoYXBwZW4gd2hlbiBDQ1ggMi4wIHN1cHBvcnQgaXMgZW5hYmxlZAorCWlmIChwQWQtPlN0YUNmZy5DQ1hFbmFibGUgIT0gVFJVRSkKKwkJcmV0dXJuOworCisJLy8gMi4xIFJhZGlvIG1lYXN1cmVtZW50IG11c3QgYmUgb24KKwlpZiAocEFkLT5TdGFDZmcuQ0NYQ29udHJvbC5maWVsZC5STUVuYWJsZSAhPSAxKQorCQlyZXR1cm47CisKKwkvLyAyLjIuIERlYnVnIHByaW50IGFsbCBiaXQgaW5mb3JtYXRpb24KKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJQVBQIElEICYgTGVuZ3RoICVkXG4iLCBMZW5ndGgpKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJQVBQIFR5cGUgJXhcbiIsIHBSTVJlcS0+SUFQUC5UeXBlKSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSUFQUCBTdWJUeXBlICV4XG4iLCBwUk1SZXEtPklBUFAuU3ViVHlwZSkpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklBUFAgRGlhbG9nIFRva2VuICV4XG4iLCBwUk1SZXEtPklBUFAuVG9rZW4pKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJQVBQIEFjdGl2YXRpb24gRGVsYXkgJXhcbiIsIHBSTVJlcS0+RGVsYXkpKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJQVBQIE1lYXN1cmVtZW50IE9mZnNldCAleFxuIiwgcFJNUmVxLT5PZmZzZXQpKTsKKworCS8vIDMuIENoZWNrIElBUFAgZnJhbWUgdHlwZSwgaXQgbXVzdCBiZSAweDMyIGZvciBDaXNjbyBBaXJvbmV0IGV4dGVuc2lvbgorCWlmIChwUk1SZXEtPklBUFAuVHlwZSAhPSBBSVJPTkVUX0lBUFBfVFlQRSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIldyb25nIElBUFAgdHlwZSBmb3IgQ2lzY28gQWlyb25ldCBleHRlbnNpb25cbiIpKTsKKwkJcmV0dXJuOworCX0KKworCS8vIDQuIENoZWNrIElBUFAgZnJhbWUgc3VidHlwZSwgaXQgbXVzdCBiZSAweDAxIGZvciBDaXNjbyBBaXJvbmV0IGV4dGVuc2lvbiByZXF1ZXN0LgorCS8vICAgIFNpbmNlIHdlIGFyZSBhY3RpbmcgYXMgY2xpZW50IG9ubHksIHdlIHdpbGwgZGlzcmVnYXJkcyByZXBseSBzdWJ0eXBlLgorCWlmIChwUk1SZXEtPklBUFAuU3ViVHlwZSAhPSBBSVJPTkVUX0lBUFBfU1VCVFlQRV9SRVFVRVNUKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiV3JvbmcgSUFQUCBzdWJ0eXBlIGZvciBDaXNjbyBBaXJvbmV0IGV4dGVuc2lvblxuIikpOworCQlyZXR1cm47CisJfQorCisJLy8gNS4gVmVyaWZ5IERlc3RpbmF0aW9uIE1BQyBhbmQgU291cmNlIE1BQywgYm90aCBzaG91bGQgYmUgYWxsIHplcm9zLgorCWlmICghIE1BQ19BRERSX0VRVUFMKHBSTVJlcS0+SUFQUC5EQSwgWkVST19NQUNfQUREUikpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJXcm9uZyBJQVBQIERBIGZvciBDaXNjbyBBaXJvbmV0IGV4dGVuc2lvbiwgaXQncyBub3QgWmVyb1xuIikpOworCQlyZXR1cm47CisJfQorCisJaWYgKCEgTUFDX0FERFJfRVFVQUwocFJNUmVxLT5JQVBQLlNBLCBaRVJPX01BQ19BRERSKSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIldyb25nIElBUFAgU0EgZm9yIENpc2NvIEFpcm9uZXQgZXh0ZW5zaW9uLCBpdCdzIG5vdCBaZXJvXG4iKSk7CisJCXJldHVybjsKKwl9CisKKwkvLyA2LiBSZWluaXQgYWxsIHJlcG9ydCByZWxhdGVkIGZpZWxkcworCU5kaXNaZXJvTWVtb3J5KHBBZC0+U3RhQ2ZnLkZyYW1lUmVwb3J0QnVmLCAyMDQ4KTsKKwlOZGlzWmVyb01lbW9yeShwQWQtPlN0YUNmZy5Cc3NSZXBvcnRPZmZzZXQsIHNpemVvZihVU0hPUlQpICogTUFYX0xFTl9PRl9CU1NfVEFCTEUpOworCU5kaXNaZXJvTWVtb3J5KHBBZC0+U3RhQ2ZnLk1lYXN1cmVtZW50UmVxdWVzdCwgc2l6ZW9mKFJNX1JFUVVFU1RfQUNUSU9OKSAqIDQpOworCisJLy8gNy4gUG9pbnQgdG8gdGhlIHN0YXJ0IG9mIGZpcnN0IGVsZW1lbnQgcmVwb3J0IGVsZW1lbnQKKwlwQWQtPlN0YUNmZy5GcmFtZVJlcG9ydExlbiAgID0gTEVOR1RIXzgwMl8xMSArIHNpemVvZihBSVJPTkVUX0lBUFBfSEVBREVSKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJGUiBsZW4gPSAlZFxuIiwgcEFkLT5TdGFDZmcuRnJhbWVSZXBvcnRMZW4pKTsKKwlwQWQtPlN0YUNmZy5MYXN0QnNzSW5kZXggICAgID0gMHhmZjsKKwlwQWQtPlN0YUNmZy5STVJlcUNudCAgICAgICAgID0gMDsKKwlwQWQtPlN0YUNmZy5QYXJhbGxlbFJlcSAgICAgID0gRkFMU0U7CisJcEFkLT5TdGFDZmcuUGFyYWxsZWxEdXJhdGlvbiA9IDA7CisJcEFkLT5TdGFDZmcuUGFyYWxsZWxDaGFubmVsICA9IDA7CisJcEFkLT5TdGFDZmcuSUFQUFRva2VuICAgICAgICA9IHBSTVJlcS0+SUFQUC5Ub2tlbjsKKwlwQWQtPlN0YUNmZy5DdXJyZW50Uk1SZXFJZHggID0gMDsKKwlwQWQtPlN0YUNmZy5DTEJ1c3lCeXRlcyAgICAgID0gMDsKKwkvLyBSZXNldCB0aGUgc3RhdGlzdGljcworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJCXBBZC0+U3RhQ2ZnLlJQSURlbnNpdHlbaV0gPSAwOworCisJSW5kZXggPSAwOworCisJLy8gOC4gU2F2ZSBkaWFsb2cgdG9rZW4gZm9yIHJlcG9ydAorCXBBZC0+U3RhQ2ZnLklBUFBUb2tlbiA9IHBSTVJlcS0+SUFQUC5Ub2tlbjsKKworCS8vIFNhdmUgQWN0aXZhdGlvbiBkZWxheSAmIG1lYXN1cmVtZW50IG9mZnNldCwgTm90IHJlYWxseSBuZWVkZWQKKworCS8vIDkuIFBvaW50IHRvIHRoZSBmaXJzdCByZXF1ZXN0IGVsZW1lbnQKKwlwRGF0YSArPSBzaXplb2YoQUlST05FVF9STV9SRVFVRVNUX0ZSQU1FKTsKKwkvLyAgICBMZW5ndGggc2hvdWxkIGV4Y2x1ZGUgdGhlIENJU0NPIEFpcm9uZXQgU05BUCBoZWFkZXIKKwlMZW5ndGggLT0gKHNpemVvZihBSVJPTkVUX1JNX1JFUVVFU1RfRlJBTUUpIC0gTEVOR1RIXzgwMl8xX0gpOworCisJLy8gMTAuIFN0YXJ0IFBhcnNpbmcgdGhlIE1lYXN1cmVtZW50IGVsZW1lbnRzLgorCS8vICAgIEJlIGNhcmVmdWwgYWJvdXQgbXVsdGlwbGUgTVIgZWxlbWVudHMgd2l0aGluIG9uZSBmcmFtZXMuCisJd2hpbGUgKExlbmd0aCA+IDApCisJeworCQlwUmVxRWxlbSA9IChQUk1fUkVRVUVTVF9BQ1RJT04pIHBEYXRhOworCQlzd2l0Y2ggKHBSZXFFbGVtLT5SZXFFbGVtLkVpZCkKKwkJeworCQkJY2FzZSBJRV9NRUFTVVJFTUVOVF9SRVFVRVNUOgorCQkJCS8vIEZyb20gdGhlIGV4YW1wbGUsIGl0IHNlZW1zIHdlIG9ubHkgbmVlZCB0byBzdXBwb3J0IG9uZSByZXF1ZXN0IGluIG9uZSBmcmFtZQorCQkJCS8vIFRoZXJlIGlzIG5vIG11bHRpcGxlIHJlcXVlc3QgaW4gb25lIGZyYW1lLgorCQkJCS8vIEJlc2lkZXMsIGxvb2tzIGxpa2Ugd2UgbmVlZCB0byB0YWtlIGNhcmUgdGhlIG1lYXN1cmVtZW50IHJlcXVlc3Qgb25seS4KKwkJCQkvLyBUaGUgbWVhc3VyZW1lbnQgcmVxdWVzdCBpcyBhbHdheXMgNCBieXRlcy4KKworCQkJCS8vIFN0YXJ0IHBhcnNpbmcgdGhpcyB0eXBlIG9mIHJlcXVlc3QuCisJCQkJLy8gMC4gRWlkIGlzIElFX01FQVNVUkVNRU5UX1JFUVVFU1QKKwkJCQkvLyAxLiBMZW5ndGggZGlkbid0IGluY2x1ZGUgRWlkIGFuZCBMZW5ndGggZmllbGQsIGl0IGFsd2F5cyBiZSA4LgorCQkJCS8vIDIuIE1lYXN1cmVtZW50IFRva2VuLCB3ZSBubmVkIHRvIHNhdmUgaXQgZm9yIHRoZSBjb3JyZXNwb25kaW5nIHJlcG9ydC4KKwkJCQkvLyAzLiBNZWFzdXJlbWVudCBNb2RlLCBBbHRob3VnaCB0aGVyZSBhcmUgZGVmaW5pdGlvbnMsIGJ1dCB3ZSBkaW4ndCBzZWUgdmFsdWUgb3RoZXIgdGhhbgorCQkJCS8vICAgIDAgZnJvbSB0ZXN0IHNwZWNzIGV4YW1wbGVzLgorCQkJCS8vIDQuIE1lYXN1cmVtZW50IFR5cGUsIHRoaXMgaXMgd2hhdCB3ZSBuZWVkIHRvIGRvLgorCQkJCXN3aXRjaCAocFJlcUVsZW0tPlJlcUVsZW0uVHlwZSkKKwkJCQl7CisJCQkJCWNhc2UgTVNSTl9UWVBFX0NIQU5ORUxfTE9BRF9SRVE6CisJCQkJCWNhc2UgTVNSTl9UWVBFX05PSVNFX0hJU1RfUkVROgorCQkJCQljYXNlIE1TUk5fVFlQRV9CRUFDT05fUkVROgorCQkJCQkJLy8gQ2hlY2sgdGhlIEVuYWJsZSBub24tc2VydmluZyBjaGFubmVsIG1lYXN1cmVtZW50IGNvbnRyb2wKKwkJCQkJCWlmIChwQWQtPlN0YUNmZy5DQ1hDb250cm9sLmZpZWxkLkRDUk1FbmFibGUgPT0gMCkKKwkJCQkJCXsKKwkJCQkJCQkvLyBDaGVjayBjaGFubmVsIGJlZm9yZSBlbnF1ZXVlIHRoZSBhY3Rpb24KKwkJCQkJCQlpZiAocFJlcUVsZW0tPk1lYXN1cmVtZW50LkNoYW5uZWwgIT0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCQllbHNlCisJCQkJCQl7CisJCQkJCQkJLy8gSWYgb2ZmIGNoYW5uZWwgbWVhc3VyZW1lbnQsIGNoZWNrIHRoZSBUVSBkdXJhdGlvbiBsaW1pdAorCQkJCQkJCWlmIChwUmVxRWxlbS0+TWVhc3VyZW1lbnQuQ2hhbm5lbCAhPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKQorCQkJCQkJCQlpZiAocFJlcUVsZW0tPk1lYXN1cmVtZW50LkR1cmF0aW9uID4gcEFkLT5TdGFDZmcuQ0NYQ29udHJvbC5maWVsZC5UdUxpbWl0KQorCQkJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisKKwkJCQkJCS8vIFNhdmUgcmVxdWVzdHMgYW5kIGV4ZWN1dGUgYWN0aW9ucyBsYXRlcgorCQkJCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+U3RhQ2ZnLk1lYXN1cmVtZW50UmVxdWVzdFtJbmRleF0sIHBSZXFFbGVtLCBzaXplb2YoUk1fUkVRVUVTVF9BQ1RJT04pKTsKKwkJCQkJCUluZGV4ICs9IDE7CisJCQkJCQlicmVhazsKKworCQkJCQljYXNlIE1TUk5fVFlQRV9GUkFNRV9SRVE6CisJCQkJCQkvLyBTaW5jZSBpdCdzIG9wdGlvbiwgd2Ugd2lsbCBzdXBwb3J0IGxhdGVyCisJCQkJCQkvLyBGcmFtZVJlcXVlc3RBY3Rpb24ocEFkLCBwRGF0YSk7CisJCQkJCQlicmVhazsKKworCQkJCQlkZWZhdWx0OgorCQkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gUG9pbnQgdG8gbmV4dCBNZWFzdXJlbWVudCByZXF1ZXN0CisJCQkJcERhdGEgICs9IHNpemVvZihSTV9SRVFVRVNUX0FDVElPTik7CisJCQkJTGVuZ3RoIC09IHNpemVvZihSTV9SRVFVRVNUX0FDVElPTik7CisJCQkJYnJlYWs7CisKKwkJCS8vIFdlIGFjY2VwdCByZXF1ZXN0IG9ubHksIGFsbCBvdGhlcnMgYXJlIGRyb3BwZWQKKwkJCWNhc2UgSUVfTUVBU1VSRU1FTlRfUkVQT1JUOgorCQkJY2FzZSBJRV9BUF9UWF9QT1dFUjoKKwkJCWNhc2UgSUVfTUVBU1VSRU1FTlRfQ0FQQUJJTElUWToKKwkJCWRlZmF1bHQ6CisJCQkJcmV0dXJuOworCQl9CisJfQorCisJLy8gMTEuIFVwZGF0ZSBzb21lIGZsYWdzIGFuZCBpbmRleAorCXBBZC0+U3RhQ2ZnLlJNUmVxQ250ID0gSW5kZXg7CisKKwlpZiAoSW5kZXgpCisJeworCQlNbG1lRW5xdWV1ZShwQWQsIEFJUk9ORVRfU1RBVEVfTUFDSElORSwgTVQyX0FJUk9ORVRfU0NBTl9SRVEsIDAsIE5VTEwpOworCQlSVDI4WFhfTUxNRV9IQU5ETEVSKHBBZCk7CisJfQorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPC0tLS0tIEFpcm9uZXRNc2dBY3Rpb25cbiIpKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisKKwlBcmd1bWVudHM6CisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECUFpcm9uZXRSZXF1ZXN0QWN0aW9uKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCU1MTUVfUVVFVUVfRUxFTQkqRWxlbSkKK3sKKwlQUk1fUkVRVUVTVF9BQ1RJT04JcFJlcTsKKworCS8vIDEuIFBvaW50IHRvIG5leHQgcmVxdWVzdCBlbGVtZW50CisJcFJlcSA9IChQUk1fUkVRVUVTVF9BQ1RJT04pICZwQWQtPlN0YUNmZy5NZWFzdXJlbWVudFJlcXVlc3RbcEFkLT5TdGFDZmcuQ3VycmVudFJNUmVxSWR4XTsKKworCS8vIDIuIFBhcnNlIG1lYXN1cmVtZW50IHR5cGUgYW5kIGNhbGwgYXBwcm9wcmlhdGUgZnVuY3Rpb25zCisJaWYgKHBSZXEtPlJlcUVsZW0uVHlwZSA9PSBNU1JOX1RZUEVfQ0hBTk5FTF9MT0FEX1JFUSkKKwkJLy8gQ2hhbm5lbCBMb2FkIG1lYXN1cmVtZW50IHJlcXVlc3QKKwkJQ2hhbm5lbExvYWRSZXF1ZXN0QWN0aW9uKHBBZCwgcEFkLT5TdGFDZmcuQ3VycmVudFJNUmVxSWR4KTsKKwllbHNlIGlmIChwUmVxLT5SZXFFbGVtLlR5cGUgPT0gTVNSTl9UWVBFX05PSVNFX0hJU1RfUkVRKQorCQkvLyBOb2lzZSBIaXN0b2dyYW0gbWVhc3VyZW1lbnQgcmVxdWVzdAorCQlOb2lzZUhpc3RSZXF1ZXN0QWN0aW9uKHBBZCwgcEFkLT5TdGFDZmcuQ3VycmVudFJNUmVxSWR4KTsKKwllbHNlIGlmIChwUmVxLT5SZXFFbGVtLlR5cGUgPT0gTVNSTl9UWVBFX0JFQUNPTl9SRVEpCisJCS8vIEJlYWNvbiBtZWFzdXJlbWVudCByZXF1ZXN0CisJCUJlYWNvblJlcXVlc3RBY3Rpb24ocEFkLCBwQWQtPlN0YUNmZy5DdXJyZW50Uk1SZXFJZHgpOworCWVsc2UKKwkJLy8gVW5rbm93bi4gRG8gbm90aGluZyBhbmQgcmV0dXJuLCB0aGlzIHNob3VsZCBuZXZlciBoYXBwZW4KKwkJcmV0dXJuOworCisJLy8gMy4gUGVlayBpbnRvIHRoZSBuZXh0IHJlcXVlc3QsIGlmIGl0J3MgcGFyYWxsZWwsIHdlIHdpbGwgdXBkYXRlIHRoZSBzY2FuIHRpbWUgdG8gdGhlIGxhcmdlc3Qgb25lCisJaWYgKChwQWQtPlN0YUNmZy5DdXJyZW50Uk1SZXFJZHggKyAxKSA8IHBBZC0+U3RhQ2ZnLlJNUmVxQ250KQorCXsKKwkJcFJlcSA9IChQUk1fUkVRVUVTVF9BQ1RJT04pICZwQWQtPlN0YUNmZy5NZWFzdXJlbWVudFJlcXVlc3RbcEFkLT5TdGFDZmcuQ3VycmVudFJNUmVxSWR4ICsgMV07CisJCS8vIENoZWNrIGZvciBwYXJhbGxlbCBiaXQKKwkJaWYgKChwUmVxLT5SZXFFbGVtLk1vZGUgJiAweDAxKSAmJiAocFJlcS0+TWVhc3VyZW1lbnQuQ2hhbm5lbCA9PSBwQWQtPlN0YUNmZy5DQ1hTY2FuQ2hhbm5lbCkpCisJCXsKKwkJCS8vIFVwZGF0ZSBwYXJhbGxlbCBtb2RlIHJlcXVlc3QgaW5mb3JtYXRpb24KKwkJCXBBZC0+U3RhQ2ZnLlBhcmFsbGVsUmVxID0gVFJVRTsKKwkJCXBBZC0+U3RhQ2ZnLkNDWFNjYW5UaW1lID0gKChwUmVxLT5NZWFzdXJlbWVudC5EdXJhdGlvbiA+IHBBZC0+U3RhQ2ZnLkNDWFNjYW5UaW1lKSA/CisJCQkocFJlcS0+TWVhc3VyZW1lbnQuRHVyYXRpb24pIDogKHBBZC0+U3RhQ2ZnLkNDWFNjYW5UaW1lKSk7CisJCX0KKwl9CisKKwkvLyA0LiBDYWxsIFJUMjhYWF9NTE1FX0hBTkRMRVIgdG8gZXhlY3V0ZSB0aGUgcmVxdWVzdCBtbG1lIGNvbW1hbmRzLCBTY2FuIHJlcXVlc3QgaXMgdGhlIG9ubHkgb25lIHVzZWQKKwlSVDI4WFhfTUxNRV9IQU5ETEVSKHBBZCk7CisKK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJUHJlcGFyZSBjaGFubmVsIGxvYWQgcmVwb3J0IGFjdGlvbiwgc3BlY2lhbCBzY2FuIG9wZXJhdGlvbiBhZGRlZAorCQl0byBzdXBwb3J0CisKKwlBcmd1bWVudHM6CisJCXBBZAlQb2ludGVyCXRvIG91ciBhZGFwdGVyCisJCXBEYXRhCQlTdGFydCBmcm9tIGVsZW1lbnQgSUQKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJQ2hhbm5lbExvYWRSZXF1ZXN0QWN0aW9uKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVDSEFSCQkJSW5kZXgpCit7CisJUFJNX1JFUVVFU1RfQUNUSU9OCQkJCXBSZXE7CisJTUxNRV9TQ0FOX1JFUV9TVFJVQ1QJCQlTY2FuUmVxOworCVVDSEFSCQkJCQkJCVplcm9Tc2lkWzMyXTsKKwlORElTX1NUQVRVUwkJCQkJCU5TdGF0dXM7CisJUFVDSEFSCQkJCQkJCXBPdXRCdWZmZXIgPSBOVUxMOworCVBIRUFERVJfODAyXzExCQkJCQlwTnVsbEZyYW1lOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ2hhbm5lbExvYWRSZXF1ZXN0QWN0aW9uIC0tLS0tPlxuIikpOworCisJcFJlcSA9IChQUk1fUkVRVUVTVF9BQ1RJT04pICZwQWQtPlN0YUNmZy5NZWFzdXJlbWVudFJlcXVlc3RbSW5kZXhdOworCU5kaXNaZXJvTWVtb3J5KFplcm9Tc2lkLCAzMik7CisKKwkvLyBQcmVwYXJlIGZvciBzcGVjaWFsIHNjYW4gcmVxdWVzdAorCS8vIFRoZSBzY2FuIGRlZmluaXRpb24gaXMgZGlmZmVyZW50IHdpdGggb3VyIEFjdGl2ZSwgUGFzc2l2ZSBzY2FuIGRlZmluaXRpb24uCisJLy8gRm9yIENDWDIsIEFjdGl2ZSBtZWFucyBzZW5kIG91dCBwcm9iZSByZXF1ZXN0IHdpdGggYnJvYWRjYXN0IEJTU0lELgorCS8vIFBhc3NpdmUgbWVhbnMgbm8gcHJvYmUgcmVxdWVzdCBzZW50LCBvbmx5IGxpc3RlbiB0byB0aGUgYmVhY29ucy4KKwkvLyBUaGUgY2hhbm5lbCBzY2FubmVkIGlzIGZpeGVkIGFzIHNwZWNpZmllZCwgbm8gbmVlZCB0byBzY2FuIGFsbCBjaGFubmVscy4KKwkvLyBUaGUgc2NhbiB3YWl0IHRpbWUgaXMgc3BlY2lmaWVkIGluIHRoZSByZXF1ZXN0IHRvby4KKwkvLyBQYXNzaXZlIHNjYW4gTW9kZQorCisJLy8gQ29udHJvbCBzdGF0ZSBtYWNoaW5lIGlzIG5vdCBpZGxlLCByZWplY3QgdGhlIHJlcXVlc3QKKwlpZiAoKHBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgIT0gQ05UTF9JRExFKSAmJiAoSW5kZXggPT0gMCkpCisJCXJldHVybjsKKworCS8vIEZpbGwgb3V0IHN0dWZmIGZvciBzY2FuIHJlcXVlc3QKKwlTY2FuUGFybUZpbGwocEFkLCAmU2NhblJlcSwgWmVyb1NzaWQsIDAsIEJTU19BTlksIFNDQU5fQ0lTQ09fQ0hBTk5FTF9MT0FEKTsKKwlNbG1lRW5xdWV1ZShwQWQsIFNZTkNfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfU0NBTl9SRVEsIHNpemVvZihNTE1FX1NDQU5fUkVRX1NUUlVDVCksICZTY2FuUmVxKTsKKwlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX09JRF9MSVNUX1NDQU47CisKKwkvLyBSZXNldCBzb21lIGludGVybmFsIGNvbnRyb2wgZmxhZ3MgdG8gbWFrZSBzdXJlIHRoaXMgc2NhbiB3b3Jrcy4KKwlCc3NUYWJsZUluaXQoJnBBZC0+U3RhQ2ZnLkNDWEJzc1RhYik7CisJcEFkLT5TdGFDZmcuU2NhbkNudCAgICAgICAgPSAwOworCXBBZC0+U3RhQ2ZnLkNDWFNjYW5DaGFubmVsID0gcFJlcS0+TWVhc3VyZW1lbnQuQ2hhbm5lbDsKKwlwQWQtPlN0YUNmZy5DQ1hTY2FuVGltZSAgICA9IHBSZXEtPk1lYXN1cmVtZW50LkR1cmF0aW9uOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiRHVyYXRpb24gJWQsIENoYW5uZWwgJWQhXG4iLCBwUmVxLT5NZWFzdXJlbWVudC5EdXJhdGlvbiwgcFJlcS0+TWVhc3VyZW1lbnQuQ2hhbm5lbCkpOworCisJLy8gSWYgaXQncyBub24gc2VydmluZyBjaGFubmVsIHNjYW4sIHNlbmQgb3V0IGEgbnVsbCBmcmFtZSB3aXRoIFBTTSBiaXQgb24uCisJaWYgKHBBZC0+U3RhQ2ZnLkNDWFNjYW5DaGFubmVsICE9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpCisJeworCQkvLyBVc2UgTUxNRSBlbnF1ZXVlIG1ldGhvZAorCQlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgKFBWT0lEKSZwT3V0QnVmZmVyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKKwkJaWYgKE5TdGF0dXMJIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJCXJldHVybjsKKworCQlwTnVsbEZyYW1lID0gKFBIRUFERVJfODAyXzExKSBwT3V0QnVmZmVyOzsKKwkJLy8gTWFrZSB0aGUgcG93ZXIgc2F2ZSBOdWxsIGZyYW1lIHdpdGggUFNNIGJpdCBvbgorCQlNZ3RNYWNIZWFkZXJJbml0KHBBZCwgcE51bGxGcmFtZSwgU1VCVFlQRV9OVUxMX0ZVTkMsIDEsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisJCXBOdWxsRnJhbWUtPkR1cmF0aW9uIAk9IDA7CisJCXBOdWxsRnJhbWUtPkZDLlR5cGUgCT0gQlRZUEVfREFUQTsKKwkJcE51bGxGcmFtZS0+RkMuUHdyTWdtdAk9IFBXUl9TQVZFOworCisJCS8vIFNlbmQgdXNpbmcgcHJpb3JpdHkgcXVldWUKKwkJTWluaXBvcnRNTVJlcXVlc3QocEFkLCAwLCBwT3V0QnVmZmVyLCBzaXplb2YoSEVBREVSXzgwMl8xMSkpOworCQlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZW5kIFBTTSBEYXRhIGZyYW1lIGZvciBvZmYgY2hhbm5lbCBSTVxuIikpOworCQlSVE1QdXNlY0RlbGF5KDUwMDApOworCX0KKworCXBBZC0+U3RhQ2ZnLkNDWFJlcVR5cGUgICAgID0gTVNSTl9UWVBFX0NIQU5ORUxfTE9BRF9SRVE7CisJcEFkLT5TdGFDZmcuQ0xCdXN5Qnl0ZXMgICAgPSAwOworCS8vIEVuYWJsZSBSeCB3aXRoIHByb21pc2N1b3VzIHJlY2VwdGlvbgorCVJUTVBfSU9fV1JJVEUzMihwQWQsIFJYX0ZJTFRSX0NGRywgMHgxMDEwKTsKKworCS8vIFNldCBjaGFubmVsIGxvYWQgbWVhc3VyZW1lbnQgZmxhZworCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JBRElPX01FQVNVUkVNRU5UKTsKKworCXBBZC0+TWxtZS5BaXJvbmV0TWFjaGluZS5DdXJyU3RhdGUgPSBBSVJPTkVUX1NDQU5OSU5HOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ2hhbm5lbExvYWRSZXF1ZXN0QWN0aW9uIDwtLS0tLVxuIikpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJUHJlcGFyZSBub2lzZSBoaXN0b2dyYW0gcmVwb3J0IGFjdGlvbiwgc3BlY2lhbCBzY2FuIG9wZXJhdGlvbiBhZGRlZAorCQl0byBzdXBwb3J0CisKKwlBcmd1bWVudHM6CisJCXBBZAlQb2ludGVyCXRvIG91ciBhZGFwdGVyCisJCXBEYXRhCQlTdGFydCBmcm9tIGVsZW1lbnQgSUQKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJTm9pc2VIaXN0UmVxdWVzdEFjdGlvbigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVQ0hBUgkJCUluZGV4KQoreworCVBSTV9SRVFVRVNUX0FDVElPTgkJCQlwUmVxOworCU1MTUVfU0NBTl9SRVFfU1RSVUNUCQkJU2NhblJlcTsKKwlVQ0hBUgkJCQkJCQlaZXJvU3NpZFszMl0sIGk7CisJTkRJU19TVEFUVVMJCQkJCQlOU3RhdHVzOworCVBVQ0hBUgkJCQkJCQlwT3V0QnVmZmVyID0gTlVMTDsKKwlQSEVBREVSXzgwMl8xMQkJCQkJcE51bGxGcmFtZTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk5vaXNlSGlzdFJlcXVlc3RBY3Rpb24gLS0tLS0+XG4iKSk7CisKKwlwUmVxID0gKFBSTV9SRVFVRVNUX0FDVElPTikgJnBBZC0+U3RhQ2ZnLk1lYXN1cmVtZW50UmVxdWVzdFtJbmRleF07CisJTmRpc1plcm9NZW1vcnkoWmVyb1NzaWQsIDMyKTsKKworCS8vIFByZXBhcmUgZm9yIHNwZWNpYWwgc2NhbiByZXF1ZXN0CisJLy8gVGhlIHNjYW4gZGVmaW5pdGlvbiBpcyBkaWZmZXJlbnQgd2l0aCBvdXIgQWN0aXZlLCBQYXNzaXZlIHNjYW4gZGVmaW5pdGlvbi4KKwkvLyBGb3IgQ0NYMiwgQWN0aXZlIG1lYW5zIHNlbmQgb3V0IHByb2JlIHJlcXVlc3Qgd2l0aCBicm9hZGNhc3QgQlNTSUQuCisJLy8gUGFzc2l2ZSBtZWFucyBubyBwcm9iZSByZXF1ZXN0IHNlbnQsIG9ubHkgbGlzdGVuIHRvIHRoZSBiZWFjb25zLgorCS8vIFRoZSBjaGFubmVsIHNjYW5uZWQgaXMgZml4ZWQgYXMgc3BlY2lmaWVkLCBubyBuZWVkIHRvIHNjYW4gYWxsIGNoYW5uZWxzLgorCS8vIFRoZSBzY2FuIHdhaXQgdGltZSBpcyBzcGVjaWZpZWQgaW4gdGhlIHJlcXVlc3QgdG9vLgorCS8vIFBhc3NpdmUgc2NhbiBNb2RlCisKKwkvLyBDb250cm9sIHN0YXRlIG1hY2hpbmUgaXMgbm90IGlkbGUsIHJlamVjdCB0aGUgcmVxdWVzdAorCWlmICgocEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSAhPSBDTlRMX0lETEUpICYmIChJbmRleCA9PSAwKSkKKwkJcmV0dXJuOworCisJLy8gRmlsbCBvdXQgc3R1ZmYgZm9yIHNjYW4gcmVxdWVzdAorCVNjYW5QYXJtRmlsbChwQWQsICZTY2FuUmVxLCBaZXJvU3NpZCwgMCwgQlNTX0FOWSwgU0NBTl9DSVNDT19OT0lTRSk7CisJTWxtZUVucXVldWUocEFkLCBTWU5DX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX1NDQU5fUkVRLCBzaXplb2YoTUxNRV9TQ0FOX1JFUV9TVFJVQ1QpLCAmU2NhblJlcSk7CisJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9PSURfTElTVF9TQ0FOOworCisJLy8gUmVzZXQgc29tZSBpbnRlcm5hbCBjb250cm9sIGZsYWdzIHRvIG1ha2Ugc3VyZSB0aGlzIHNjYW4gd29ya3MuCisJQnNzVGFibGVJbml0KCZwQWQtPlN0YUNmZy5DQ1hCc3NUYWIpOworCXBBZC0+U3RhQ2ZnLlNjYW5DbnQgICAgICAgID0gMDsKKwlwQWQtPlN0YUNmZy5DQ1hTY2FuQ2hhbm5lbCA9IHBSZXEtPk1lYXN1cmVtZW50LkNoYW5uZWw7CisJcEFkLT5TdGFDZmcuQ0NYU2NhblRpbWUgICAgPSBwUmVxLT5NZWFzdXJlbWVudC5EdXJhdGlvbjsKKwlwQWQtPlN0YUNmZy5DQ1hSZXFUeXBlICAgICA9IE1TUk5fVFlQRV9OT0lTRV9ISVNUX1JFUTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkR1cmF0aW9uICVkLCBDaGFubmVsICVkIVxuIiwgcFJlcS0+TWVhc3VyZW1lbnQuRHVyYXRpb24sIHBSZXEtPk1lYXN1cmVtZW50LkNoYW5uZWwpKTsKKworCS8vIElmIGl0J3Mgbm9uIHNlcnZpbmcgY2hhbm5lbCBzY2FuLCBzZW5kIG91dCBhIG51bGwgZnJhbWUgd2l0aCBQU00gYml0IG9uLgorCWlmIChwQWQtPlN0YUNmZy5DQ1hTY2FuQ2hhbm5lbCAhPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKQorCXsKKwkJLy8gVXNlIE1MTUUgZW5xdWV1ZSBtZXRob2QKKwkJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsIChQVk9JRCkmcE91dEJ1ZmZlcik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5CisJCWlmIChOU3RhdHVzCSE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJCQlyZXR1cm47CisKKwkJcE51bGxGcmFtZSA9IChQSEVBREVSXzgwMl8xMSkgcE91dEJ1ZmZlcjsKKwkJLy8gTWFrZSB0aGUgcG93ZXIgc2F2ZSBOdWxsIGZyYW1lIHdpdGggUFNNIGJpdCBvbgorCQlNZ3RNYWNIZWFkZXJJbml0KHBBZCwgcE51bGxGcmFtZSwgU1VCVFlQRV9OVUxMX0ZVTkMsIDEsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisJCXBOdWxsRnJhbWUtPkR1cmF0aW9uIAk9IDA7CisJCXBOdWxsRnJhbWUtPkZDLlR5cGUgIAk9IEJUWVBFX0RBVEE7CisJCXBOdWxsRnJhbWUtPkZDLlB3ck1nbXQJPSBQV1JfU0FWRTsKKworCQkvLyBTZW5kIHVzaW5nIHByaW9yaXR5IHF1ZXVlCisJCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgMCwgcE91dEJ1ZmZlciwgc2l6ZW9mKEhFQURFUl84MDJfMTEpKTsKKwkJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2VuZCBQU00gRGF0YSBmcmFtZSBmb3Igb2ZmIGNoYW5uZWwgUk1cbiIpKTsKKwkJUlRNUHVzZWNEZWxheSg1MDAwKTsKKwl9CisKKwkvLyBSZXNldCB0aGUgc3RhdGlzdGljcworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJCXBBZC0+U3RhQ2ZnLlJQSURlbnNpdHlbaV0gPSAwOworCisJLy8gRW5hYmxlIFJ4IHdpdGggcHJvbWlzY3VvdXMgcmVjZXB0aW9uCisJUlRNUF9JT19XUklURTMyKHBBZCwgUlhfRklMVFJfQ0ZHLCAweDEwMTApOworCisJLy8gU2V0IGNoYW5uZWwgbG9hZCBtZWFzdXJlbWVudCBmbGFnCisJUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkFESU9fTUVBU1VSRU1FTlQpOworCisJcEFkLT5NbG1lLkFpcm9uZXRNYWNoaW5lLkN1cnJTdGF0ZSA9IEFJUk9ORVRfU0NBTk5JTkc7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJOb2lzZUhpc3RSZXF1ZXN0QWN0aW9uIDwtLS0tLVxuIikpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJUHJlcGFyZSBCZWFjb24gcmVwb3J0IGFjdGlvbiwgc3BlY2lhbCBzY2FuIG9wZXJhdGlvbiBhZGRlZAorCQl0byBzdXBwb3J0CisKKwlBcmd1bWVudHM6CisJCXBBZAlQb2ludGVyCXRvIG91ciBhZGFwdGVyCisJCXBEYXRhCQlTdGFydCBmcm9tIGVsZW1lbnQgSUQKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJQmVhY29uUmVxdWVzdEFjdGlvbigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVQ0hBUgkJCUluZGV4KQoreworCVBSTV9SRVFVRVNUX0FDVElPTgkJCQlwUmVxOworCU5ESVNfU1RBVFVTCQkJCQkJTlN0YXR1czsKKwlQVUNIQVIJCQkJCQkJcE91dEJ1ZmZlciA9IE5VTEw7CisJUEhFQURFUl84MDJfMTEJCQkJCXBOdWxsRnJhbWU7CisJTUxNRV9TQ0FOX1JFUV9TVFJVQ1QJCQlTY2FuUmVxOworCVVDSEFSCQkJCQkJCVplcm9Tc2lkWzMyXTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkJlYWNvblJlcXVlc3RBY3Rpb24gLS0tLS0+XG4iKSk7CisKKwlwUmVxID0gKFBSTV9SRVFVRVNUX0FDVElPTikgJnBBZC0+U3RhQ2ZnLk1lYXN1cmVtZW50UmVxdWVzdFtJbmRleF07CisJTmRpc1plcm9NZW1vcnkoWmVyb1NzaWQsIDMyKTsKKworCS8vIFByZXBhcmUgZm9yIHNwZWNpYWwgc2NhbiByZXF1ZXN0CisJLy8gVGhlIHNjYW4gZGVmaW5pdGlvbiBpcyBkaWZmZXJlbnQgd2l0aCBvdXIgQWN0aXZlLCBQYXNzaXZlIHNjYW4gZGVmaW5pdGlvbi4KKwkvLyBGb3IgQ0NYMiwgQWN0aXZlIG1lYW5zIHNlbmQgb3V0IHByb2JlIHJlcXVlc3Qgd2l0aCBicm9hZGNhc3QgQlNTSUQuCisJLy8gUGFzc2l2ZSBtZWFucyBubyBwcm9iZSByZXF1ZXN0IHNlbnQsIG9ubHkgbGlzdGVuIHRvIHRoZSBiZWFjb25zLgorCS8vIFRoZSBjaGFubmVsIHNjYW5uZWQgaXMgZml4ZWQgYXMgc3BlY2lmaWVkLCBubyBuZWVkIHRvIHNjYW4gYWxsIGNoYW5uZWxzLgorCS8vIFRoZSBzY2FuIHdhaXQgdGltZSBpcyBzcGVjaWZpZWQgaW4gdGhlIHJlcXVlc3QgdG9vLgorCWlmIChwUmVxLT5NZWFzdXJlbWVudC5TY2FuTW9kZSA9PSBNU1JOX1NDQU5fTU9ERV9QQVNTSVZFKQorCXsKKwkJLy8gUGFzc2l2ZSBzY2FuIE1vZGUKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGFzc2l2ZSBTY2FuIE1vZGUhXG4iKSk7CisKKwkJLy8gQ29udHJvbCBzdGF0ZSBtYWNoaW5lIGlzIG5vdCBpZGxlLCByZWplY3QgdGhlIHJlcXVlc3QKKwkJaWYgKChwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlICE9IENOVExfSURMRSkgJiYgKEluZGV4ID09IDApKQorCQkJcmV0dXJuOworCisJCS8vIEZpbGwgb3V0IHN0dWZmIGZvciBzY2FuIHJlcXVlc3QKKwkJU2NhblBhcm1GaWxsKHBBZCwgJlNjYW5SZXEsIFplcm9Tc2lkLCAwLCBCU1NfQU5ZLCBTQ0FOX0NJU0NPX1BBU1NJVkUpOworCQlNbG1lRW5xdWV1ZShwQWQsIFNZTkNfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfU0NBTl9SRVEsIHNpemVvZihNTE1FX1NDQU5fUkVRX1NUUlVDVCksICZTY2FuUmVxKTsKKwkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9PSURfTElTVF9TQ0FOOworCisJCS8vIFJlc2V0IHNvbWUgaW50ZXJuYWwgY29udHJvbCBmbGFncyB0byBtYWtlIHN1cmUgdGhpcyBzY2FuIHdvcmtzLgorCQlCc3NUYWJsZUluaXQoJnBBZC0+U3RhQ2ZnLkNDWEJzc1RhYik7CisJCXBBZC0+U3RhQ2ZnLlNjYW5DbnQgICAgICAgID0gMDsKKwkJcEFkLT5TdGFDZmcuQ0NYU2NhbkNoYW5uZWwgPSBwUmVxLT5NZWFzdXJlbWVudC5DaGFubmVsOworCQlwQWQtPlN0YUNmZy5DQ1hTY2FuVGltZSAgICA9IHBSZXEtPk1lYXN1cmVtZW50LkR1cmF0aW9uOworCQlwQWQtPlN0YUNmZy5DQ1hSZXFUeXBlICAgICA9IE1TUk5fVFlQRV9CRUFDT05fUkVROworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJEdXJhdGlvbiAlZCFcbiIsIHBSZXEtPk1lYXN1cmVtZW50LkR1cmF0aW9uKSk7CisKKwkJLy8gSWYgaXQncyBub24gc2VydmluZyBjaGFubmVsIHNjYW4sIHNlbmQgb3V0IGEgbnVsbCBmcmFtZSB3aXRoIFBTTSBiaXQgb24uCisJCWlmIChwQWQtPlN0YUNmZy5DQ1hTY2FuQ2hhbm5lbCAhPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKQorCQl7CisJCQkvLyBVc2UgTUxNRSBlbnF1ZXVlIG1ldGhvZAorCQkJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsIChQVk9JRCkmcE91dEJ1ZmZlcik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5CisJCQlpZiAoTlN0YXR1cwkhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCQkJCXJldHVybjsKKworCQkJcE51bGxGcmFtZSA9IChQSEVBREVSXzgwMl8xMSkgcE91dEJ1ZmZlcjsKKwkJCS8vIE1ha2UgdGhlIHBvd2VyIHNhdmUgTnVsbCBmcmFtZSB3aXRoIFBTTSBiaXQgb24KKwkJCU1ndE1hY0hlYWRlckluaXQocEFkLCBwTnVsbEZyYW1lLCBTVUJUWVBFX05VTExfRlVOQywgMSwgcEFkLT5Db21tb25DZmcuQnNzaWQsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKwkJCXBOdWxsRnJhbWUtPkR1cmF0aW9uIAk9IDA7CisJCQlwTnVsbEZyYW1lLT5GQy5UeXBlICAgICA9IEJUWVBFX0RBVEE7CisJCQlwTnVsbEZyYW1lLT5GQy5Qd3JNZ210ICA9IFBXUl9TQVZFOworCisJCQkvLyBTZW5kIHVzaW5nIHByaW9yaXR5IHF1ZXVlCisJCQlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIDAsIHBPdXRCdWZmZXIsIHNpemVvZihIRUFERVJfODAyXzExKSk7CisJCQlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2VuZCBQU00gRGF0YSBmcmFtZSBmb3Igb2ZmIGNoYW5uZWwgUk1cbiIpKTsKKwkJCVJUTVB1c2VjRGVsYXkoNTAwMCk7CisJCX0KKworCQlwQWQtPk1sbWUuQWlyb25ldE1hY2hpbmUuQ3VyclN0YXRlID0gQUlST05FVF9TQ0FOTklORzsKKwl9CisJZWxzZSBpZiAocFJlcS0+TWVhc3VyZW1lbnQuU2Nhbk1vZGUgPT0gTVNSTl9TQ0FOX01PREVfQUNUSVZFKQorCXsKKwkJLy8gQWN0aXZlIHNjYW4gTW9kZQorCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBY3RpdmUgU2NhbiBNb2RlIVxuIikpOworCisJCS8vIENvbnRyb2wgc3RhdGUgbWFjaGluZSBpcyBub3QgaWRsZSwgcmVqZWN0IHRoZSByZXF1ZXN0CisJCWlmIChwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlICE9IENOVExfSURMRSkKKwkJCXJldHVybjsKKworCQkvLyBGaWxsIG91dCBzdHVmZiBmb3Igc2NhbiByZXF1ZXN0CisJCVNjYW5QYXJtRmlsbChwQWQsICZTY2FuUmVxLCBaZXJvU3NpZCwgMCwgQlNTX0FOWSwgU0NBTl9DSVNDT19BQ1RJVkUpOworCQlNbG1lRW5xdWV1ZShwQWQsIFNZTkNfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfU0NBTl9SRVEsIHNpemVvZihNTE1FX1NDQU5fUkVRX1NUUlVDVCksICZTY2FuUmVxKTsKKwkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9PSURfTElTVF9TQ0FOOworCisJCS8vIFJlc2V0IHNvbWUgaW50ZXJuYWwgY29udHJvbCBmbGFncyB0byBtYWtlIHN1cmUgdGhpcyBzY2FuIHdvcmtzLgorCQlCc3NUYWJsZUluaXQoJnBBZC0+U3RhQ2ZnLkNDWEJzc1RhYik7CisJCXBBZC0+U3RhQ2ZnLlNjYW5DbnQgICAgICAgID0gMDsKKwkJcEFkLT5TdGFDZmcuQ0NYU2NhbkNoYW5uZWwgPSBwUmVxLT5NZWFzdXJlbWVudC5DaGFubmVsOworCQlwQWQtPlN0YUNmZy5DQ1hTY2FuVGltZSAgICA9IHBSZXEtPk1lYXN1cmVtZW50LkR1cmF0aW9uOworCQlwQWQtPlN0YUNmZy5DQ1hSZXFUeXBlICAgICA9IE1TUk5fVFlQRV9CRUFDT05fUkVROworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJEdXJhdGlvbiAlZCFcbiIsIHBSZXEtPk1lYXN1cmVtZW50LkR1cmF0aW9uKSk7CisKKwkJLy8gSWYgaXQncyBub24gc2VydmluZyBjaGFubmVsIHNjYW4sIHNlbmQgb3V0IGEgbnVsbCBmcmFtZSB3aXRoIFBTTSBiaXQgb24uCisJCWlmIChwQWQtPlN0YUNmZy5DQ1hTY2FuQ2hhbm5lbCAhPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKQorCQl7CisJCQkvLyBVc2UgTUxNRSBlbnF1ZXVlIG1ldGhvZAorCQkJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsIChQVk9JRCkmcE91dEJ1ZmZlcik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5CisJCQlpZiAoTlN0YXR1cwkhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCQkJCXJldHVybjsKKworCQkJcE51bGxGcmFtZSA9IChQSEVBREVSXzgwMl8xMSkgcE91dEJ1ZmZlcjsKKwkJCS8vIE1ha2UgdGhlIHBvd2VyIHNhdmUgTnVsbCBmcmFtZSB3aXRoIFBTTSBiaXQgb24KKwkJCU1ndE1hY0hlYWRlckluaXQocEFkLCBwTnVsbEZyYW1lLCBTVUJUWVBFX05VTExfRlVOQywgMSwgcEFkLT5Db21tb25DZmcuQnNzaWQsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKwkJCXBOdWxsRnJhbWUtPkR1cmF0aW9uIAk9IDA7CisJCQlwTnVsbEZyYW1lLT5GQy5UeXBlICAgICA9IEJUWVBFX0RBVEE7CisJCQlwTnVsbEZyYW1lLT5GQy5Qd3JNZ210ICA9IFBXUl9TQVZFOworCisJCQkvLyBTZW5kIHVzaW5nIHByaW9yaXR5IHF1ZXVlCisJCQlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIDAsIHBPdXRCdWZmZXIsIHNpemVvZihIRUFERVJfODAyXzExKSk7CisJCQlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2VuZCBQU00gRGF0YSBmcmFtZSBmb3Igb2ZmIGNoYW5uZWwgUk1cbiIpKTsKKwkJCVJUTVB1c2VjRGVsYXkoNTAwMCk7CisJCX0KKworCQlwQWQtPk1sbWUuQWlyb25ldE1hY2hpbmUuQ3VyclN0YXRlID0gQUlST05FVF9TQ0FOTklORzsKKwl9CisJZWxzZSBpZiAocFJlcS0+TWVhc3VyZW1lbnQuU2Nhbk1vZGUgPT0gTVNSTl9TQ0FOX01PREVfQkVBQ09OX1RBQkxFKQorCXsKKwkJLy8gQmVhY29uIHJlcG9ydCBNb2RlLCByZXBvcnQgYWxsIHRoZSBBUFMgaW4gY3VycmVudCBic3MgdGFibGUKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQmVhY29uIFJlcG9ydCBNb2RlIVxuIikpOworCisJCS8vIENvcHkgY3VycmVudCBCU1MgdGFibGUgdG8gQ0NYIHRhYmxlLCB3ZSBjYW4gb21pdCB0aGlzIHN0ZXAgbGF0ZXIgb24uCisJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPlN0YUNmZy5DQ1hCc3NUYWIsICZwQWQtPlNjYW5UYWIsIHNpemVvZihCU1NfVEFCTEUpKTsKKworCQkvLyBDcmVhdGUgYmVhY29uIHJlcG9ydCBmcm9tIEJzcyB0YWJsZQorCQlBaXJvbmV0Q3JlYXRlQmVhY29uUmVwb3J0RnJvbUJzc1RhYmxlKHBBZCk7CisKKwkJLy8gU2V0IHN0YXRlIHRvIHNjYW5uaW5nCisJCXBBZC0+TWxtZS5BaXJvbmV0TWFjaGluZS5DdXJyU3RhdGUgPSBBSVJPTkVUX1NDQU5OSU5HOworCisJCS8vIEVucXVldWUgcmVwb3J0IHJlcXVlc3QKKwkJLy8gQ2lzY28gc2NhbiByZXF1ZXN0IGlzIGZpbmlzaGVkLCBwcmVwYXJlIGJlYWNvbiByZXBvcnQKKwkJTWxtZUVucXVldWUocEFkLCBBSVJPTkVUX1NUQVRFX01BQ0hJTkUsIE1UMl9BSVJPTkVUX1NDQU5fRE9ORSwgMCwgTlVMTCk7CisJfQorCWVsc2UKKwl7CisJCS8vIFdyb25nIHNjYW4gTW9kZQorCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJXcm9uZyBTY2FuIE1vZGUhXG4iKSk7CisJfQorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQmVhY29uUmVxdWVzdEFjdGlvbiA8LS0tLS1cbiIpKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisKKwlBcmd1bWVudHM6CisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECUFpcm9uZXRSZXBvcnRBY3Rpb24oCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JTUxNRV9RVUVVRV9FTEVNCSpFbGVtKQoreworCVBSTV9SRVFVRVNUX0FDVElPTglwUmVxOworCVVMT05HCQkJCU5vdzMyOworCisgICAgTmRpc0dldFN5c3RlbVVwVGltZSgmTm93MzIpOworCXBBZC0+U3RhQ2ZnLkxhc3RCZWFjb25SeFRpbWUgPSBOb3czMjsKKworCXBSZXEgPSAoUFJNX1JFUVVFU1RfQUNUSU9OKSAmcEFkLT5TdGFDZmcuTWVhc3VyZW1lbnRSZXF1ZXN0W3BBZC0+U3RhQ2ZnLkN1cnJlbnRSTVJlcUlkeF07CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBaXJvbmV0UmVwb3J0QWN0aW9uIC0tLS0tPlxuIikpOworCisJLy8gMS4gUGFyc2UgbWVhc3VyZW1lbnQgdHlwZSBhbmQgY2FsbCBhcHByb3ByaWF0ZSBmdW5jdGlvbnMKKwlpZiAocFJlcS0+UmVxRWxlbS5UeXBlID09IE1TUk5fVFlQRV9DSEFOTkVMX0xPQURfUkVRKQorCQkvLyBDaGFubmVsIExvYWQgbWVhc3VyZW1lbnQgcmVxdWVzdAorCQlDaGFubmVsTG9hZFJlcG9ydEFjdGlvbihwQWQsIHBBZC0+U3RhQ2ZnLkN1cnJlbnRSTVJlcUlkeCk7CisJZWxzZSBpZiAocFJlcS0+UmVxRWxlbS5UeXBlID09IE1TUk5fVFlQRV9OT0lTRV9ISVNUX1JFUSkKKwkJLy8gTm9pc2UgSGlzdG9ncmFtIG1lYXN1cmVtZW50IHJlcXVlc3QKKwkJTm9pc2VIaXN0UmVwb3J0QWN0aW9uKHBBZCwgcEFkLT5TdGFDZmcuQ3VycmVudFJNUmVxSWR4KTsKKwllbHNlIGlmIChwUmVxLT5SZXFFbGVtLlR5cGUgPT0gTVNSTl9UWVBFX0JFQUNPTl9SRVEpCisJCS8vIEJlYWNvbiBtZWFzdXJlbWVudCByZXF1ZXN0CisJCUJlYWNvblJlcG9ydEFjdGlvbihwQWQsIHBBZC0+U3RhQ2ZnLkN1cnJlbnRSTVJlcUlkeCk7CisJZWxzZQorCQkvLyBVbmtub3duLiBEbyBub3RoaW5nIGFuZCByZXR1cm4KKwkJOworCisJLy8gMi4gUG9pbnQgdG8gdGhlIGNvcnJlY3QgaW5kZXggb2YgYWN0aW9uIGVsZW1lbnQsIHN0YXJ0IGZyb20gMAorCXBBZC0+U3RhQ2ZnLkN1cnJlbnRSTVJlcUlkeCsrOworCisJLy8gMy4gQ2hlY2sgZm9yIHBhcmFsbGVsIGFjdGlvbnMKKwlpZiAocEFkLT5TdGFDZmcuUGFyYWxsZWxSZXEgPT0gVFJVRSkKKwl7CisJCXBSZXEgPSAoUFJNX1JFUVVFU1RfQUNUSU9OKSAmcEFkLT5TdGFDZmcuTWVhc3VyZW1lbnRSZXF1ZXN0W3BBZC0+U3RhQ2ZnLkN1cnJlbnRSTVJlcUlkeF07CisKKwkJLy8gUHJvY2VzcyBuZXh0IGFjdGlvbiByaWdodCBhd2F5CisJCWlmIChwUmVxLT5SZXFFbGVtLlR5cGUgPT0gTVNSTl9UWVBFX0NIQU5ORUxfTE9BRF9SRVEpCisJCQkvLyBDaGFubmVsIExvYWQgbWVhc3VyZW1lbnQgcmVxdWVzdAorCQkJQ2hhbm5lbExvYWRSZXBvcnRBY3Rpb24ocEFkLCBwQWQtPlN0YUNmZy5DdXJyZW50Uk1SZXFJZHgpOworCQllbHNlIGlmIChwUmVxLT5SZXFFbGVtLlR5cGUgPT0gTVNSTl9UWVBFX05PSVNFX0hJU1RfUkVRKQorCQkJLy8gTm9pc2UgSGlzdG9ncmFtIG1lYXN1cmVtZW50IHJlcXVlc3QKKwkJCU5vaXNlSGlzdFJlcG9ydEFjdGlvbihwQWQsIHBBZC0+U3RhQ2ZnLkN1cnJlbnRSTVJlcUlkeCk7CisKKwkJcEFkLT5TdGFDZmcuUGFyYWxsZWxSZXEgPSBGQUxTRTsKKwkJcEFkLT5TdGFDZmcuQ3VycmVudFJNUmVxSWR4Kys7CisJfQorCisJaWYgKHBBZC0+U3RhQ2ZnLkN1cnJlbnRSTVJlcUlkeCA+PSBwQWQtPlN0YUNmZy5STVJlcUNudCkKKwl7CisJCS8vIDQuIFRoZXJlIGlzIG5vIG1vcmUgdW5wcm9jZXNzZWQgbWVhc3VyZW1lbnQgcmVxdWVzdCwgZ28gZm9yIHRyYW5zbWl0IHRoaXMgcmVwb3J0CisJCUFpcm9uZXRGaW5hbFJlcG9ydEFjdGlvbihwQWQpOworCQlwQWQtPk1sbWUuQWlyb25ldE1hY2hpbmUuQ3VyclN0YXRlID0gQUlST05FVF9JRExFOworCX0KKwllbHNlCisJeworCQlwUmVxID0gKFBSTV9SRVFVRVNUX0FDVElPTikgJnBBZC0+U3RhQ2ZnLk1lYXN1cmVtZW50UmVxdWVzdFtwQWQtPlN0YUNmZy5DdXJyZW50Uk1SZXFJZHhdOworCisJCWlmIChwUmVxLT5NZWFzdXJlbWVudC5DaGFubmVsICE9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpCisJCXsKKwkJCVJUTVB1c2VjRGVsYXkoMTAwMDAwKTsKKwkJfQorCisJCS8vIDUuIFRoZXJlIGFyZSBtb3JlIHJlcXVlc3RzIHRvIGJlIG1lYXN1cmUKKwkJTWxtZUVucXVldWUocEFkLCBBSVJPTkVUX1NUQVRFX01BQ0hJTkUsIE1UMl9BSVJPTkVUX1NDQU5fUkVRLCAwLCBOVUxMKTsKKwkJUlQyOFhYX01MTUVfSEFORExFUihwQWQpOworCX0KKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFpcm9uZXRSZXBvcnRBY3Rpb24gPC0tLS0tXG4iKSk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCisJQXJndW1lbnRzOgorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlBaXJvbmV0RmluYWxSZXBvcnRBY3Rpb24oCisJSU4JUFJUTVBfQURBUFRFUglwQWQpCit7CisJUFVDSEFSCQkJCQlwRGVzdDsKKwlQQUlST05FVF9JQVBQX0hFQURFUglwSUFQUDsKKwlQSEVBREVSXzgwMl8xMQkJCXBIZWFkZXI7CisJVUNIQVIJCQkJCUFja1JhdGUgPSBSQVRFXzI7CisJVVNIT1JUCQkJCQlBY2tEdXJhdGlvbiA9IDA7CisJTkRJU19TVEFUVVMJCQkJTlN0YXR1czsKKwlQVUNIQVIJCQkJCXBPdXRCdWZmZXIgPSBOVUxMOworCVVMT05HCQkJCQlGcmFtZUxlbiA9IDA7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBaXJvbmV0RmluYWxSZXBvcnRBY3Rpb24gLS0tLS0+XG4iKSk7CisKKwkvLyAwLiBTZXQgdXAgdGhlIGZyYW1lIHBvaW50ZXIsIEZyYW1lIHdhcyBpbml0ZWQgYXQgdGhlIGVuZCBvZiBtZXNzYWdlIGFjdGlvbgorCXBEZXN0ID0gJnBBZC0+U3RhQ2ZnLkZyYW1lUmVwb3J0QnVmW0xFTkdUSF84MDJfMTFdOworCisJLy8gMS4gVXBkYXRlIHJlcG9ydCBJQVBQIGZpZWxkcworCXBJQVBQID0gKFBBSVJPTkVUX0lBUFBfSEVBREVSKSBwRGVzdDsKKworCS8vIDIuIENvcHkgQ2lzY28gU05BUCBoZWFkZXIKKwlOZGlzTW92ZU1lbW9yeShwSUFQUC0+Q2lzY29TbmFwSGVhZGVyLCBTTkFQX0FJUk9ORVQsIExFTkdUSF84MDJfMV9IKTsKKworCS8vIDMuIG5ldHdvcmsgb3JkZXIgZm9yIHRoaXMgMTZiaXQgbGVuZ3RoCisJcElBUFAtPkxlbmd0aCAgPSBjcHUyYmUxNihwQWQtPlN0YUNmZy5GcmFtZVJlcG9ydExlbiAtIExFTkdUSF84MDJfMTEgLSBMRU5HVEhfODAyXzFfSCk7CisKKwkvLyAzLjEgc2FuaXR5IGNoZWNrIHRoZSByZXBvcnQgbGVuZ3RoLCBpZ25vcmUgaXQgaWYgdGhlcmUgaXMgbm90aGluZyB0byByZXBvcnQKKwlpZiAoYmUyY3B1MTYocElBUFAtPkxlbmd0aCkgPD0gMTgpCisJCXJldHVybjsKKworCS8vIDQuIFR5cGUgbXVzdCBiZSAweDMyCisJcElBUFAtPlR5cGUgICAgPSBBSVJPTkVUX0lBUFBfVFlQRTsKKworCS8vIDUuIFN1YlR5cGUgZm9yIHJlcG9ydCBtdXN0IGJlIDB4ODEKKwlwSUFQUC0+U3ViVHlwZSA9IEFJUk9ORVRfSUFQUF9TVUJUWVBFX1JFUE9SVDsKKworCS8vIDYuIERBIGlzIG5vdCB1c2VkIGFuZCBtdXN0IGJlIHplcm8sIGFsdGhvdWdoIHRoZSB3aG9sZSBmcmFtZSB3YXMgY2xlYXJlZCBhdCB0aGUgc3RhcnQgb2YgZnVuY3Rpb24KKwkvLyAgICBXZSB3aWxsIGRvIGl0IGFnYWluIGhlcmUuIFdlIGNhbiB1c2UgQlNTSUQgaW5zdGVhZAorCUNPUFlfTUFDX0FERFIocElBUFAtPkRBLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisKKwkvLyA3LiBTQSBpcyB0aGUgY2xpZW50IHJlcG9ydGluZyB3aGljaCBtdXN0IGJlIG91ciBNQUMKKwlDT1BZX01BQ19BRERSKHBJQVBQLT5TQSwgcEFkLT5DdXJyZW50QWRkcmVzcyk7CisKKwkvLyA4LiBDb3B5IHRoZSBzYXZlZCBkaWFsb2cgdG9rZW4KKwlwSUFQUC0+VG9rZW4gPSBwQWQtPlN0YUNmZy5JQVBQVG9rZW47CisKKwkvLyA5LiBNYWtlIHRoZSBSZXBvcnQgZnJhbWUgODAyLjExIGhlYWRlcgorCS8vICAgIFJldXNlIGZ1bmN0aW9uIGluIHdwYS5jCisJcEhlYWRlciA9IChQSEVBREVSXzgwMl8xMSkgcEFkLT5TdGFDZmcuRnJhbWVSZXBvcnRCdWY7CisJcEFkLT5TZXF1ZW5jZSArKzsKKwlXcGFNYWNIZWFkZXJJbml0KHBBZCwgcEhlYWRlciwgMCwgcEFkLT5Db21tb25DZmcuQnNzaWQpOworCisJLy8gQUNLIHNpemUJaXMgMTQgaW5jbHVkZSBDUkMsIGFuZCBpdHMgcmF0ZQlpcyBiYXNlZCBvbiByZWFsIHRpbWUgaW5mb3JtYXRpb24KKwlBY2tSYXRlICAgICA9IHBBZC0+Q29tbW9uQ2ZnLkV4cGVjdGVkQUNLUmF0ZVtwQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZV07CisJQWNrRHVyYXRpb24gPSBSVE1QQ2FsY0R1cmF0aW9uKHBBZCwgQWNrUmF0ZSwgMTQpOworCXBIZWFkZXItPkR1cmF0aW9uID0gcEFkLT5Db21tb25DZmcuRHNpZnMgKyBBY2tEdXJhdGlvbjsKKworCS8vIFVzZSBNTE1FIGVucXVldWUgbWV0aG9kCisJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKKwlpZiAoTlN0YXR1cwkhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCQlyZXR1cm47CisKKwkvLyAxMC4gUHJlcGFyZSByZXBvcnQgZnJhbWUgd2l0aCBkeW5hbWljIG91dGJ1ZmZlci4gSnVzdCBzaW1wbHkgY29weSBldmVyeXRoaW5nLgorCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAgICAgICAgICAgICAgICAmRnJhbWVMZW4sCisJICAgICAgICAgICAgICAgICAgcEFkLT5TdGFDZmcuRnJhbWVSZXBvcnRMZW4sIHBBZC0+U3RhQ2ZnLkZyYW1lUmVwb3J0QnVmLAorCQkgICAgICAgICAgICAgIEVORF9PRl9BUkdTKTsKKworCS8vIDExLiBTZW5kIHVzaW5nIHByaW9yaXR5IHF1ZXVlCisJTWluaXBvcnRNTVJlcXVlc3QocEFkLCAwLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7CisJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKKworCXBBZC0+U3RhQ2ZnLkNDWFJlcVR5cGUgPSBNU1JOX1RZUEVfVU5VU0VEOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQWlyb25ldEZpbmFsUmVwb3J0QWN0aW9uIDwtLS0tLVxuIikpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKworCUFyZ3VtZW50czoKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJQ2hhbm5lbExvYWRSZXBvcnRBY3Rpb24oCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVUNIQVIJCQlJbmRleCkKK3sKKwlQTUVBU1VSRU1FTlRfUkVQT1JUX0VMRU1FTlQJcFJlcG9ydDsKKwlQQ0hBTk5FTF9MT0FEX1JFUE9SVAkJcExvYWQ7CisJUFVDSEFSCQkJCQkJcERlc3Q7CisJVUNIQVIJCQkJCQlDQ0FCdXN5RnJhY3Rpb247CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDaGFubmVsTG9hZFJlcG9ydEFjdGlvbiAtLS0tLT5cbiIpKTsKKworCS8vIERpc2FibGUgUnggd2l0aCBwcm9taXNjdW91cyByZWNlcHRpb24sIG1ha2UgaXQgYmFjayB0byBub3JtYWwKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBSWF9GSUxUUl9DRkcsIFNUQU5PUk1BTCk7IC8vIFN0YWlvbiBub3QgZHJvcCBjb250cm9sIGZyYW1lIHdpbGwgZmFpbCBXaUZpIENlcnRpZmljYXRpb24uCisKKwkvLyAwLiBTZXR1cCBwb2ludGVyIGZvciBwcm9jZXNzaW5nIGJlYWNvbiAmIHByb2JlIHJlc3BvbnNlCisJcERlc3QgPSAoUFVDSEFSKSAmcEFkLT5TdGFDZmcuRnJhbWVSZXBvcnRCdWZbcEFkLT5TdGFDZmcuRnJhbWVSZXBvcnRMZW5dOworCXBSZXBvcnQgPSAoUE1FQVNVUkVNRU5UX1JFUE9SVF9FTEVNRU5UKSBwRGVzdDsKKworCS8vIDEuIEZpbGwgTWVhc3VyZW1lbnQgcmVwb3J0IGVsZW1lbnQgZmllbGQuCisJcFJlcG9ydC0+RWlkICAgID0gSUVfTUVBU1VSRU1FTlRfUkVQT1JUOworCS8vIEZpeGVkIExlbmd0aCBhdCA5LCBub3QgaW5jbHVkZSBFaWQgYW5kIGxlbmd0aCBmaWVsZHMKKwlwUmVwb3J0LT5MZW5ndGggPSA5OworCXBSZXBvcnQtPlRva2VuICA9IHBBZC0+U3RhQ2ZnLk1lYXN1cmVtZW50UmVxdWVzdFtJbmRleF0uUmVxRWxlbS5Ub2tlbjsKKwlwUmVwb3J0LT5Nb2RlICAgPSBwQWQtPlN0YUNmZy5NZWFzdXJlbWVudFJlcXVlc3RbSW5kZXhdLlJlcUVsZW0uTW9kZTsKKwlwUmVwb3J0LT5UeXBlICAgPSBNU1JOX1RZUEVfQ0hBTk5FTF9MT0FEX1JFUTsKKworCS8vIDIuIEZpbGwgY2hhbm5lbCByZXBvcnQgbWVhc3VyZW1lbnQgZGF0YQorCXBEZXN0ICs9IHNpemVvZihNRUFTVVJFTUVOVF9SRVBPUlRfRUxFTUVOVCk7CisJcExvYWQgID0gKFBDSEFOTkVMX0xPQURfUkVQT1JUKSBwRGVzdDsKKwlwTG9hZC0+Q2hhbm5lbCAgPSBwQWQtPlN0YUNmZy5NZWFzdXJlbWVudFJlcXVlc3RbSW5kZXhdLk1lYXN1cmVtZW50LkNoYW5uZWw7CisJcExvYWQtPlNwYXJlICAgID0gMDsKKwlwTG9hZC0+RHVyYXRpb24gPSBwQWQtPlN0YUNmZy5NZWFzdXJlbWVudFJlcXVlc3RbSW5kZXhdLk1lYXN1cmVtZW50LkR1cmF0aW9uOworCisJLy8gMy4gQ2FsY3VsYXRlIHRoZSBDQ0EgQnVzeSBGcmFjdGlvbgorCS8vICAgIChCeXRlcyArIEFDSyBzaXplKSAqIDggLyBUeCBzcGVlZCAqIDI1NSAvIDEwMDAgLyBtZWFzdXJlbWVudCBkdXJhdGlvbiwgdXNlIDI0IHVzIFR4IHNwZWVkCisJLy8gICAgID0gIChCeXRlcyArIEFDSykgLyAxMiAvIGR1cmF0aW9uCisJLy8gICAgIDkgaXMgdGhlIGdvb2QgdmFsdWUgZm9yIHBBZC0+U3RhQ2ZnLkNMRmFjdG9yCisJLy8gQ0NBQnVzeUZyYWN0aW9uID0gKFVDSEFSKSAocEFkLT5TdGFDZmcuQ0xCdXN5Qnl0ZXMgLyA5IC8gcExvYWQtPkR1cmF0aW9uKTsKKwlDQ0FCdXN5RnJhY3Rpb24gPSAoVUNIQVIpIChwQWQtPlN0YUNmZy5DTEJ1c3lCeXRlcyAvIHBBZC0+U3RhQ2ZnLkNMRmFjdG9yIC8gcExvYWQtPkR1cmF0aW9uKTsKKwlpZiAoQ0NBQnVzeUZyYWN0aW9uIDwgMTApCisJCQlDQ0FCdXN5RnJhY3Rpb24gPSAoVUNIQVIpIChwQWQtPlN0YUNmZy5DTEJ1c3lCeXRlcyAvIDMgLyBwTG9hZC0+RHVyYXRpb24pICsgMTsKKworCXBMb2FkLT5DQ0FCdXN5ID0gQ0NBQnVzeUZyYWN0aW9uOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNMQnVzeUJ5dGUgJWxkLCBEdXJhdGlvbiAlZCwgUmVzdWx0LCAlZFxuIiwgcEFkLT5TdGFDZmcuQ0xCdXN5Qnl0ZXMsIHBMb2FkLT5EdXJhdGlvbiwgQ0NBQnVzeUZyYWN0aW9uKSk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJGcmFtZVJlcG9ydExlbiAlZFxuIiwgcEFkLT5TdGFDZmcuRnJhbWVSZXBvcnRMZW4pKTsKKwlwQWQtPlN0YUNmZy5GcmFtZVJlcG9ydExlbiArPSAoc2l6ZW9mKE1FQVNVUkVNRU5UX1JFUE9SVF9FTEVNRU5UKSArIHNpemVvZihDSEFOTkVMX0xPQURfUkVQT1JUKSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiRnJhbWVSZXBvcnRMZW4gJWRcbiIsIHBBZC0+U3RhQ2ZnLkZyYW1lUmVwb3J0TGVuKSk7CisKKwkvLyA0LiBDbGVhciBjaGFubmVsIGxvYWQgbWVhc3VyZW1lbnQgZmxhZworCVJUTVBfQ0xFQVJfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkFESU9fTUVBU1VSRU1FTlQpOworCisJLy8gNS4gcmVzZXQgdG8gaWRsZSBzdGF0ZQorCXBBZC0+TWxtZS5BaXJvbmV0TWFjaGluZS5DdXJyU3RhdGUgPSBBSVJPTkVUX0lETEU7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDaGFubmVsTG9hZFJlcG9ydEFjdGlvbiA8LS0tLS1cbiIpKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisKKwlBcmd1bWVudHM6CisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECU5vaXNlSGlzdFJlcG9ydEFjdGlvbigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVQ0hBUgkJCUluZGV4KQoreworCVBNRUFTVVJFTUVOVF9SRVBPUlRfRUxFTUVOVAlwUmVwb3J0OworCVBOT0lTRV9ISVNUX1JFUE9SVAkJCXBOb2lzZTsKKwlQVUNIQVIJCQkJCQlwRGVzdDsKKwlVQ0hBUgkJCQkJCWksTm9pc2VDbnQ7CisJVVNIT1JUCQkJCQkJVG90YWxSUElDbnQsIFRvdGFsUlBJU3VtOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTm9pc2VIaXN0UmVwb3J0QWN0aW9uIC0tLS0tPlxuIikpOworCisJLy8gMC4gRGlzYWJsZSBSeCB3aXRoIHByb21pc2N1b3VzIHJlY2VwdGlvbiwgbWFrZSBpdCBiYWNrIHRvIG5vcm1hbAorCVJUTVBfSU9fV1JJVEUzMihwQWQsIFJYX0ZJTFRSX0NGRywgU1RBTk9STUFMKTsgLy8gU3RhaW9uIG5vdCBkcm9wIGNvbnRyb2wgZnJhbWUgd2lsbCBmYWlsIFdpRmkgQ2VydGlmaWNhdGlvbi4KKwkvLyAxLiBTZXR1cCBwb2ludGVyIGZvciBwcm9jZXNzaW5nIGJlYWNvbiAmIHByb2JlIHJlc3BvbnNlCisJcERlc3QgPSAoUFVDSEFSKSAmcEFkLT5TdGFDZmcuRnJhbWVSZXBvcnRCdWZbcEFkLT5TdGFDZmcuRnJhbWVSZXBvcnRMZW5dOworCXBSZXBvcnQgPSAoUE1FQVNVUkVNRU5UX1JFUE9SVF9FTEVNRU5UKSBwRGVzdDsKKworCS8vIDIuIEZpbGwgTWVhc3VyZW1lbnQgcmVwb3J0IGVsZW1lbnQgZmllbGQuCisJcFJlcG9ydC0+RWlkICAgID0gSUVfTUVBU1VSRU1FTlRfUkVQT1JUOworCS8vIEZpeGVkIExlbmd0aCBhdCAxNiwgbm90IGluY2x1ZGUgRWlkIGFuZCBsZW5ndGggZmllbGRzCisJcFJlcG9ydC0+TGVuZ3RoID0gMTY7CisJcFJlcG9ydC0+VG9rZW4gID0gcEFkLT5TdGFDZmcuTWVhc3VyZW1lbnRSZXF1ZXN0W0luZGV4XS5SZXFFbGVtLlRva2VuOworCXBSZXBvcnQtPk1vZGUgICA9IHBBZC0+U3RhQ2ZnLk1lYXN1cmVtZW50UmVxdWVzdFtJbmRleF0uUmVxRWxlbS5Nb2RlOworCXBSZXBvcnQtPlR5cGUgICA9IE1TUk5fVFlQRV9OT0lTRV9ISVNUX1JFUTsKKworCS8vIDMuIEZpbGwgbm9pc2UgaGlzdG9ncmFtIHJlcG9ydCBtZWFzdXJlbWVudCBkYXRhCisJcERlc3QgKz0gc2l6ZW9mKE1FQVNVUkVNRU5UX1JFUE9SVF9FTEVNRU5UKTsKKwlwTm9pc2UgID0gKFBOT0lTRV9ISVNUX1JFUE9SVCkgcERlc3Q7CisJcE5vaXNlLT5DaGFubmVsICA9IHBBZC0+U3RhQ2ZnLk1lYXN1cmVtZW50UmVxdWVzdFtJbmRleF0uTWVhc3VyZW1lbnQuQ2hhbm5lbDsKKwlwTm9pc2UtPlNwYXJlICAgID0gMDsKKwlwTm9pc2UtPkR1cmF0aW9uID0gcEFkLT5TdGFDZmcuTWVhc3VyZW1lbnRSZXF1ZXN0W0luZGV4XS5NZWFzdXJlbWVudC5EdXJhdGlvbjsKKwkvLyA0LiBGaWxsIE5vaXNlIGhpc3RvZ3JhbSwgdGhlIHRvdGFsIFJQSSBjb3VudHMgc2hvdWxkIGJlIDAuNCAqIFRVCisJLy8gICAgV2UgZXN0aW1hdGUgNDAwMCBub3JtYWwgcGFja2V0cyByZWNlaXZlZCBkdXJuaW5nIDEwIHNlY29uZHMgdGVzdC4KKwkvLyAgICBBZGp1c3QgaXQgaWYgcmVxdWlyZWQuCisJLy8gMyBpcyBhIGdvb2QgdmFsdWUgZm9yIHBBZC0+U3RhQ2ZnLk5IRmFjdG9yCisJLy8gVG90YWxSUElDbnQgPSBwTm9pc2UtPkR1cmF0aW9uICogMyAvIDEwOworCVRvdGFsUlBJQ250ID0gcE5vaXNlLT5EdXJhdGlvbiAqIHBBZC0+U3RhQ2ZnLk5IRmFjdG9yIC8gMTA7CisJVG90YWxSUElTdW0gPSAwOworCisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKwl7CisJCVRvdGFsUlBJU3VtICs9IHBBZC0+U3RhQ2ZnLlJQSURlbnNpdHlbaV07CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJQSSAlZCBDb251dHMgJWRcbiIsIGksIHBBZC0+U3RhQ2ZnLlJQSURlbnNpdHlbaV0pKTsKKwl9CisKKwkvLyBEb3VibGUgY2hlY2sgaWYgdGhlIGNvdW50ZXIgaXMgbGFyZ2VyIHRoYW4gb3VyIGV4cGVjdGF0aW9uLgorCS8vIFdlIHdpbGwgcmVwbGFjZSBpdCB3aXRoIHRoZSB0b3RhbCBudW1iZXIgcGx1cyBhIGZyYWN0aW9uLgorCWlmIChUb3RhbFJQSVN1bSA+IFRvdGFsUlBJQ250KQorCQlUb3RhbFJQSUNudCA9IFRvdGFsUlBJU3VtICsgcE5vaXNlLT5EdXJhdGlvbiAvIDIwOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiVG90YWwgUlBJIENvbnV0cyAlZFxuIiwgVG90YWxSUElDbnQpKTsKKworCS8vIDUuIEluaXRpYWxpemUgbm9pc2UgY291bnQgZm9yIHRoZSB0b3RhbCBzdW1tYXRpb24gb2YgMHhmZgorCU5vaXNlQ250ID0gMDsKKwlmb3IgKGkgPSAxOyBpIDwgODsgaSsrKQorCXsKKwkJcE5vaXNlLT5EZW5zaXR5W2ldID0gKFVDSEFSKSAocEFkLT5TdGFDZmcuUlBJRGVuc2l0eVtpXSAqIDI1NSAvIFRvdGFsUlBJQ250KTsKKwkJaWYgKChwTm9pc2UtPkRlbnNpdHlbaV0gPT0gMCkgJiYgKHBBZC0+U3RhQ2ZnLlJQSURlbnNpdHlbaV0gIT0gMCkpCisJCQlwTm9pc2UtPkRlbnNpdHlbaV0rKzsKKwkJTm9pc2VDbnQgKz0gcE5vaXNlLT5EZW5zaXR5W2ldOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSZXBvcnRlZCBSUElbJWRdICA9IDB4JTAyeFxuIiwgaSwgcE5vaXNlLT5EZW5zaXR5W2ldKSk7CisJfQorCisJLy8gNi4gUlBJWzBdIHJlcHJlc2VudHMgdGhlIHJlc3Qgb2YgY291bnRzCisJcE5vaXNlLT5EZW5zaXR5WzBdID0gMHhmZiAtIE5vaXNlQ250OworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJlcG9ydGVkIFJQSVswXSAgPSAweCUwMnhcbiIsIHBOb2lzZS0+RGVuc2l0eVswXSkpOworCisJcEFkLT5TdGFDZmcuRnJhbWVSZXBvcnRMZW4gKz0gKHNpemVvZihNRUFTVVJFTUVOVF9SRVBPUlRfRUxFTUVOVCkgKyBzaXplb2YoTk9JU0VfSElTVF9SRVBPUlQpKTsKKworCS8vIDcuIENsZWFyIGNoYW5uZWwgbG9hZCBtZWFzdXJlbWVudCBmbGFnCisJUlRNUF9DTEVBUl9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SQURJT19NRUFTVVJFTUVOVCk7CisKKwkvLyA4LiByZXNldCB0byBpZGxlIHN0YXRlCisJcEFkLT5NbG1lLkFpcm9uZXRNYWNoaW5lLkN1cnJTdGF0ZSA9IEFJUk9ORVRfSURMRTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk5vaXNlSGlzdFJlcG9ydEFjdGlvbiA8LS0tLS1cbiIpKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVByZXBhcmUgQmVhY29uIHJlcG9ydCBhY3Rpb24sCisKKwlBcmd1bWVudHM6CisJCXBBZAlQb2ludGVyCXRvIG91ciBhZGFwdGVyCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECUJlYWNvblJlcG9ydEFjdGlvbigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVQ0hBUgkJCUluZGV4KQoreworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkJlYWNvblJlcG9ydEFjdGlvbiAtLS0tLT5cbiIpKTsKKworCS8vIExvb2tzIGxpa2Ugd2UgZG9uJ3QgaGF2ZSBhbnl0aGluZyB0aGluZyBuZWVkIHRvIGRvIGhlcmUuCisJLy8gQWxsIG1lYXN1cmVtZW50IHJlcG9ydCBhbHJlYWR5IGZpbmlzaGVkIGluIEFkZEJlYWNvblJlcG9ydAorCS8vIFRoZSBsZW5ndGggaXMgaW4gdGhlIEZyYW1lUmVwb3J0TGVuCisKKwkvLyByZXNldCBCZWFjb24gaW5kZXggZm9yIG5leHQgYmVhY29uIHJlcXVlc3QKKwlwQWQtPlN0YUNmZy5MYXN0QnNzSW5kZXggPSAweGZmOworCisJLy8gcmVzZXQgdG8gaWRsZSBzdGF0ZQorCXBBZC0+TWxtZS5BaXJvbmV0TWFjaGluZS5DdXJyU3RhdGUgPSBBSVJPTkVUX0lETEU7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJCZWFjb25SZXBvcnRBY3Rpb24gPC0tLS0tXG4iKSk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCisJQXJndW1lbnRzOgorCQlJbmRleAkJQ3VycmVudCBCU1NJRCBpbiBDQ1hCc3N0YWIgZW50cnkgaW5kZXgKKworCVJldHVybiBWYWx1ZToKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECUFpcm9uZXRBZGRCZWFjb25SZXBvcnQoCisJSU4JUFJUTVBfQURBUFRFUgkJcEFkLAorCUlOCVVMT05HCQkJCUluZGV4LAorCUlOCVBNTE1FX1FVRVVFX0VMRU0JcEVsZW0pCit7CisJUFZPSUQJCQkJCQlwTXNnOworCVBVQ0hBUgkJCQkJCXBTcmMsIHBEZXN0OworCVVDSEFSCQkJCQkJUmVxSWR4OworCVVMT05HCQkJCQkJTXNnTGVuOworCVVTSE9SVAkJCQkJCUxlbmd0aDsKKwlQRlJBTUVfODAyXzExCQkJCXBGcmFtZTsKKwlQTUVBU1VSRU1FTlRfUkVQT1JUX0VMRU1FTlQJcFJlcG9ydDsKKwlQRUlEX1NUUlVDVAkJCSAgICAgICAgcEVpZDsKKwlQQkVBQ09OX1JFUE9SVAkJCQlwQmVhY29uUmVwb3J0OworCVBCU1NfRU5UUlkJCQkJCXBCc3M7CisKKwkvLyAwLiBTZXR1cCBwb2ludGVyIGZvciBwcm9jZXNzaW5nIGJlYWNvbiAmIHByb2JlIHJlc3BvbnNlCisJcE1zZyAgID0gcEVsZW0tPk1zZzsKKwlNc2dMZW4gPSBwRWxlbS0+TXNnTGVuOworCXBGcmFtZSA9IChQRlJBTUVfODAyXzExKSBwTXNnOworCXBTcmMgICA9IHBGcmFtZS0+T2N0ZXQ7CQkJCS8vIFN0YXJ0IGZyb20gQVAgVFNGCisJcEJzcyAgID0gKFBCU1NfRU5UUlkpICZwQWQtPlN0YUNmZy5DQ1hCc3NUYWIuQnNzRW50cnlbSW5kZXhdOworCVJlcUlkeCA9IHBBZC0+U3RhQ2ZnLkN1cnJlbnRSTVJlcUlkeDsKKworCS8vIDEgQ2hlY2sgdGhlIEluZGV4LCBpZiB3ZSBhbHJlYWR5IGNyZWF0ZSB0aGlzIGVudHJ5LCBvbmx5IHVwZGF0ZSB0aGUgYXZlcmFnZSBSU1NJCisJaWYgKChJbmRleCA8PSBwQWQtPlN0YUNmZy5MYXN0QnNzSW5kZXgpICYmIChwQWQtPlN0YUNmZy5MYXN0QnNzSW5kZXggIT0gMHhmZikpCisJeworCQlwRGVzdCAgPSAoUFVDSEFSKSAmcEFkLT5TdGFDZmcuRnJhbWVSZXBvcnRCdWZbcEFkLT5TdGFDZmcuQnNzUmVwb3J0T2Zmc2V0W0luZGV4XV07CisJCS8vIFBvaW50IHRvIGJzcyByZXBvcnQgaW5mb3JtYXRpb24KKwkJcERlc3QgKz0gc2l6ZW9mKE1FQVNVUkVNRU5UX1JFUE9SVF9FTEVNRU5UKTsKKwkJcEJlYWNvblJlcG9ydCA9IChQQkVBQ09OX1JFUE9SVCkgcERlc3Q7CisKKwkJLy8gVXBkYXRlIFJ4IHBvd2VyLCBpbiBkQm0KKwkJLy8gR2V0IHRoZSBvcmlnaW5hbCBSU1NJIHJlYWRiYWNrIGZyb20gQkJQCisJCXBCZWFjb25SZXBvcnQtPlJ4UG93ZXIgKz0gcEFkLT5CYnBSc3NpVG9EYm1EZWx0YTsKKwkJLy8gQXZlcmFnZSB0aGUgUnNzaSByZWFkaW5nCisJCXBCZWFjb25SZXBvcnQtPlJ4UG93ZXIgID0gKHBCZWFjb25SZXBvcnQtPlJ4UG93ZXIgKyBwQnNzLT5Sc3NpKSAvIDI7CisJCS8vIEdldCB0byBkQm0gZm9ybWF0CisJCXBCZWFjb25SZXBvcnQtPlJ4UG93ZXIgLT0gcEFkLT5CYnBSc3NpVG9EYm1EZWx0YTsKKworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJCc3NpZCAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCAiLAorCQkJcEJzcy0+QnNzaWRbMF0sIHBCc3MtPkJzc2lkWzFdLCBwQnNzLT5Cc3NpZFsyXSwKKwkJCXBCc3MtPkJzc2lkWzNdLCBwQnNzLT5Cc3NpZFs0XSwgcEJzcy0+QnNzaWRbNV0pKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUnhQb3dlclslbGRdIFJzc2kgJWQsIEF2ZyBSc3NpICVkXG4iLCBJbmRleCwgKHBCc3MtPlJzc2kgLSBwQWQtPkJicFJzc2lUb0RibURlbHRhKSwgcEJlYWNvblJlcG9ydC0+UnhQb3dlciAtIDI1NikpOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJGcmFtZVJlcG9ydExlbiA9ICVkXG4iLCBwQWQtPlN0YUNmZy5Cc3NSZXBvcnRPZmZzZXRbSW5kZXhdKSk7CisKKwkJLy8gVXBkYXRlIG90aGVyIGluZm9ybWF0aW9uIGhlcmUKKworCQkvLyBEb25lCisJCXJldHVybjsKKwl9CisKKwkvLyAyLiBVcGRhdGUgcmVwb3J0ZWQgSW5kZXgKKwlwQWQtPlN0YUNmZy5MYXN0QnNzSW5kZXggPSBJbmRleDsKKworCS8vIDMuIFNldHVwIHRoZSBidWZmZXIgYWRkcmVzcyBmb3IgY29weWluZyB0aGlzIEJTU0lEIGludG8gcmVwb3J0aW5nIGZyYW1lCisJLy8gICAgVGhlIG9mZnNldCBzaG91bGQgc3RhcnQgYWZ0ZXIgODAyLjExIGhlYWRlciBhbmQgcmVwb3J0IGZyYW1lIGhlYWRlci4KKwlwRGVzdCA9IChQVUNIQVIpICZwQWQtPlN0YUNmZy5GcmFtZVJlcG9ydEJ1ZltwQWQtPlN0YUNmZy5GcmFtZVJlcG9ydExlbl07CisKKwkvLyA0LiBTYXZlIHRoZSBzdGFydCBvZmZzZXQgb2YgZWFjaCBCc3MgaW4gcmVwb3J0IGZyYW1lCisJcEFkLT5TdGFDZmcuQnNzUmVwb3J0T2Zmc2V0W0luZGV4XSA9IHBBZC0+U3RhQ2ZnLkZyYW1lUmVwb3J0TGVuOworCisJLy8gNS4gRmlsbCBNZWFzdXJlbWVudCByZXBvcnQgZmllbGRzCisJcFJlcG9ydCA9IChQTUVBU1VSRU1FTlRfUkVQT1JUX0VMRU1FTlQpIHBEZXN0OworCXBSZXBvcnQtPkVpZCA9IElFX01FQVNVUkVNRU5UX1JFUE9SVDsKKwlwUmVwb3J0LT5MZW5ndGggPSAwOworCXBSZXBvcnQtPlRva2VuICA9IHBBZC0+U3RhQ2ZnLk1lYXN1cmVtZW50UmVxdWVzdFtSZXFJZHhdLlJlcUVsZW0uVG9rZW47CisJcFJlcG9ydC0+TW9kZSAgID0gcEFkLT5TdGFDZmcuTWVhc3VyZW1lbnRSZXF1ZXN0W1JlcUlkeF0uUmVxRWxlbS5Nb2RlOworCXBSZXBvcnQtPlR5cGUgICA9IE1TUk5fVFlQRV9CRUFDT05fUkVROworCUxlbmd0aCAgICAgICAgICA9IHNpemVvZihNRUFTVVJFTUVOVF9SRVBPUlRfRUxFTUVOVCk7CisJcERlc3QgICAgICAgICAgKz0gc2l6ZW9mKE1FQVNVUkVNRU5UX1JFUE9SVF9FTEVNRU5UKTsKKworCS8vIDYuIFN0YXJ0IHRoZWJlYWNvbiByZXBvcnQgZm9ybWF0CisJcEJlYWNvblJlcG9ydCA9IChQQkVBQ09OX1JFUE9SVCkgcERlc3Q7CisJcERlc3QgICAgICAgICs9IHNpemVvZihCRUFDT05fUkVQT1JUKTsKKwlMZW5ndGggICAgICAgKz0gc2l6ZW9mKEJFQUNPTl9SRVBPUlQpOworCisJLy8gNy4gQ29weSBDaGFubmVsIG51bWJlcgorCXBCZWFjb25SZXBvcnQtPkNoYW5uZWwgICAgICAgID0gcEJzcy0+Q2hhbm5lbDsKKwlwQmVhY29uUmVwb3J0LT5TcGFyZSAgICAgICAgICA9IDA7CisJcEJlYWNvblJlcG9ydC0+RHVyYXRpb24gICAgICAgPSBwQWQtPlN0YUNmZy5NZWFzdXJlbWVudFJlcXVlc3RbUmVxSWR4XS5NZWFzdXJlbWVudC5EdXJhdGlvbjsKKwlwQmVhY29uUmVwb3J0LT5QaHlUeXBlICAgICAgICA9ICgocEJzcy0+U3VwUmF0ZUxlbitwQnNzLT5FeHRSYXRlTGVuID4gNCkgPyBQSFlfRVJQIDogUEhZX0RTUyk7CisJLy8gOC4gUnggcG93ZXIsIGluIGRCbQorCXBCZWFjb25SZXBvcnQtPlJ4UG93ZXIgICAgICAgID0gcEJzcy0+UnNzaSAtIHBBZC0+QmJwUnNzaVRvRGJtRGVsdGE7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJCc3NpZCAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCAiLAorCQlwQnNzLT5Cc3NpZFswXSwgcEJzcy0+QnNzaWRbMV0sIHBCc3MtPkJzc2lkWzJdLAorCQlwQnNzLT5Cc3NpZFszXSwgcEJzcy0+QnNzaWRbNF0sIHBCc3MtPkJzc2lkWzVdKSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUnhQb3dlclslbGRdLCBSc3NpICVkXG4iLCBJbmRleCwgcEJlYWNvblJlcG9ydC0+UnhQb3dlciAtIDI1NikpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkZyYW1lUmVwb3J0TGVuID0gJWRcbiIsIHBBZC0+U3RhQ2ZnLkZyYW1lUmVwb3J0TGVuKSk7CisKKwlwQmVhY29uUmVwb3J0LT5CZWFjb25JbnRlcnZhbCA9IHBCc3MtPkJlYWNvblBlcmlvZDsKKwlDT1BZX01BQ19BRERSKHBCZWFjb25SZXBvcnQtPkJTU0lELCBwRnJhbWUtPkhkci5BZGRyMyk7CisJTmRpc01vdmVNZW1vcnkocEJlYWNvblJlcG9ydC0+UGFyZW50VFNGLCBwU3JjLCA0KTsKKwlOZGlzTW92ZU1lbW9yeShwQmVhY29uUmVwb3J0LT5UYXJnZXRUU0YsICZwRWxlbS0+VGltZVN0YW1wLnUuTG93UGFydCwgNCk7CisJTmRpc01vdmVNZW1vcnkoJnBCZWFjb25SZXBvcnQtPlRhcmdldFRTRls0XSwgJnBFbGVtLT5UaW1lU3RhbXAudS5IaWdoUGFydCwgNCk7CisKKwkvLyA5LiBTa2lwIHRoZSBiZWFjb24gZnJhbWUgYW5kIG9mZnNldCB0byBzdGFydCBvZiBjYXBhYmlsaXR5aW5mbyBzaW5jZSB3ZSBhbHJlYWR5IHByb2Nlc3NlZCBjYXBhYmlsaXR5aW5mbworCXBTcmMgKz0gKFRJTUVTVEFNUF9MRU4gKyAyKTsKKwlwQmVhY29uUmVwb3J0LT5DYXBhYmlsaXR5SW5mbyA9ICooVVNIT1JUICopcFNyYzsKKworCS8vIDEwLiBQb2ludCB0byBzdGFydCBvZiBlbGVtZW50IElECisJcFNyYyArPSAyOworCXBFaWQgPSAoUEVJRF9TVFJVQ1QpIHBTcmM7CisKKwkvLyAxMS4gU3RhcnQgcHJvY2VzcyBhbGwgdmFyaWFibGUgRWlkIG9heWxvYWQgYW5kIGFkZCB0aGUgYXBwcm9wcmlhdGUgdG8gdGhlIGZyYW1lIHJlcG9ydAorCXdoaWxlICgoKFBVQ0hBUikgcEVpZCArIHBFaWQtPkxlbiArIDEpIDwgKChQVUNIQVIpIHBGcmFtZSArIE1zZ0xlbikpCisJeworCQkvLyBPbmx5IGxpbWl0ZWQgRUlEIGFyZSByZXF1aXJlZCB0byByZXBvcnQgZm9yIENDWCAyLiBJdCBpbmNsdWRlcyBTU0lELCBTdXBwb3J0ZWQgcmF0ZSwKKwkJLy8gRkggcGFyYW1lbnRlciBzZXQsIERTIHBhcmFtZXRlciBzZXQsIENGIHBhcmFtZXRlciBzZXQsIElCU1MgcGFyYW1ldGVyIHNldCwKKwkJLy8gVElNIChyZXBvcnQgZmlyc3QgNCBieXRlcyBvbmx5LCByYWRpbyBtZWFzdXJlbWVudCBjYXBhYmlsaXR5CisJCXN3aXRjaCAocEVpZC0+RWlkKQorCQl7CisJCQljYXNlIElFX1NTSUQ6CisJCQljYXNlIElFX1NVUFBfUkFURVM6CisJCQljYXNlIElFX0ZIX1BBUk06CisJCQljYXNlIElFX0RTX1BBUk06CisJCQljYXNlIElFX0NGX1BBUk06CisJCQljYXNlIElFX0lCU1NfUEFSTToKKwkJCQlOZGlzTW92ZU1lbW9yeShwRGVzdCwgcEVpZCwgcEVpZC0+TGVuICsgMik7CisJCQkJcERlc3QgICs9IChwRWlkLT5MZW4gKyAyKTsKKwkJCQlMZW5ndGggKz0gKHBFaWQtPkxlbiArIDIpOworCQkJCWJyZWFrOworCisJCQljYXNlIElFX01FQVNVUkVNRU5UX0NBUEFCSUxJVFk6CisJCQkJLy8gU2luY2UgdGhpcyBJRSBpcyBkdXBsaWNhdGVkIHdpdGggV1BBIHNlY3VyaXR5IElFLCB3ZSBoYXMgdG8gZG8gc2FuaXR5IGNoZWNrIGJlZm9yZQorCQkJCS8vIHJlY29nbml6ZSBpdC4KKwkJCQkvLyAxLiBJdCBhbHNvIGhhcyBmaXhlZCA2IGJ5dGVzIElFIGxlbmd0aC4KKwkJCQlpZiAocEVpZC0+TGVuICE9IDYpCisJCQkJCWJyZWFrOworCQkJCS8vIDIuIENoZWNrIHRoZSBDaXNjbyBBaXJvbmV0IE9VSQorCQkJCWlmIChOZGlzRXF1YWxNZW1vcnkoQ0lTQ09fT1VJLCAocFNyYyArIDIpLCAzKSkKKwkJCQl7CisJCQkJCS8vIE1hdGNoZWQsIHRoaXMgaXMgd2hhdCB3ZSB3YW50CisJCQkJCU5kaXNNb3ZlTWVtb3J5KHBEZXN0LCBwRWlkLCBwRWlkLT5MZW4gKyAyKTsKKwkJCQkJcERlc3QgICs9IChwRWlkLT5MZW4gKyAyKTsKKwkJCQkJTGVuZ3RoICs9IChwRWlkLT5MZW4gKyAyKTsKKwkJCQl9CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgSUVfVElNOgorCQkJCWlmIChwRWlkLT5MZW4gPiA0KQorCQkJCXsKKwkJCQkJLy8gTWF5IHRydW5jYXRlIGFuZCByZXBvcnQgdGhlIGZpcnN0IDQgYnl0ZXMgb25seSwgd2l0aCB0aGUgZWlkICYgbGVuLCB0b3RhbCBzaG91bGQgYmUgNgorCQkJCQlOZGlzTW92ZU1lbW9yeShwRGVzdCwgcEVpZCwgNik7CisJCQkJCXBEZXN0ICArPSA2OworCQkJCQlMZW5ndGggKz0gNjsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJTmRpc01vdmVNZW1vcnkocERlc3QsIHBFaWQsIHBFaWQtPkxlbiArIDIpOworCQkJCQlwRGVzdCAgKz0gKHBFaWQtPkxlbiArIDIpOworCQkJCQlMZW5ndGggKz0gKHBFaWQtPkxlbiArIDIpOworCQkJCX0KKwkJCQlicmVhazsKKworCQkJZGVmYXVsdDoKKwkJCQlicmVhazsKKwkJfQorCQkvLyAxMi4gTW92ZSB0byBuZXh0IGVsZW1lbnQgSUQKKwkJcFNyYyArPSAoMiArIHBFaWQtPkxlbik7CisJCXBFaWQgPSAoUEVJRF9TVFJVQ1QpIHBTcmM7CisJfQorCisJLy8gMTMuIFVwZGF0ZSB0aGUgbGVuZ3RoIGluIHRoZSBoZWFkZXIsIG5vdCBpbmNsdWRlIEVJRCBhbmQgbGVuZ3RoCisJcFJlcG9ydC0+TGVuZ3RoID0gTGVuZ3RoIC0gNDsKKworCS8vIDE0LiBVcGRhdGUgdGhlIGZyYW1lIHJlcG9ydCBidWZmZXIgZGF0YSBsZW5ndGgKKwlwQWQtPlN0YUNmZy5GcmFtZVJlcG9ydExlbiArPSBMZW5ndGg7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiRlIgbGVuID0gJWRcbiIsIHBBZC0+U3RhQ2ZnLkZyYW1lUmVwb3J0TGVuKSk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCisJQXJndW1lbnRzOgorCQlJbmRleAkJQ3VycmVudCBCU1NJRCBpbiBDQ1hCc3N0YWIgZW50cnkgaW5kZXgKKworCVJldHVybiBWYWx1ZToKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECUFpcm9uZXRDcmVhdGVCZWFjb25SZXBvcnRGcm9tQnNzVGFibGUoCisJSU4JUFJUTVBfQURBUFRFUgkJcEFkKQoreworCVBNRUFTVVJFTUVOVF9SRVBPUlRfRUxFTUVOVAlwUmVwb3J0OworCVBCRUFDT05fUkVQT1JUCQkJCXBCZWFjb25SZXBvcnQ7CisJVUNIQVIJCQkJCQlJbmRleCwgUmVxSWR4OworCVVTSE9SVAkJCQkJCUxlbmd0aDsKKwlQVUNIQVIJCQkJCQlwRGVzdDsKKwlQQlNTX0VOVFJZCQkJCQlwQnNzOworCisJLy8gMC4gc2V0dXAgYmFzZSBwb2ludGVyCisJUmVxSWR4ID0gcEFkLT5TdGFDZmcuQ3VycmVudFJNUmVxSWR4OworCisJZm9yIChJbmRleCA9IDA7IEluZGV4IDwgcEFkLT5TdGFDZmcuQ0NYQnNzVGFiLkJzc05yOyBJbmRleCsrKQorCXsKKwkJLy8gMS4gU2V0dXAgdGhlIGJ1ZmZlciBhZGRyZXNzIGZvciBjb3B5aW5nIHRoaXMgQlNTSUQgaW50byByZXBvcnRpbmcgZnJhbWUKKwkJLy8gICAgVGhlIG9mZnNldCBzaG91bGQgc3RhcnQgYWZ0ZXIgODAyLjExIGhlYWRlciBhbmQgcmVwb3J0IGZyYW1lIGhlYWRlci4KKwkJcERlc3QgID0gKFBVQ0hBUikgJnBBZC0+U3RhQ2ZnLkZyYW1lUmVwb3J0QnVmW3BBZC0+U3RhQ2ZnLkZyYW1lUmVwb3J0TGVuXTsKKwkJcEJzcyAgID0gKFBCU1NfRU5UUlkpICZwQWQtPlN0YUNmZy5DQ1hCc3NUYWIuQnNzRW50cnlbSW5kZXhdOworCQlMZW5ndGggPSAwOworCisJCS8vIDIuIEZpbGwgTWVhc3VyZW1lbnQgcmVwb3J0IGZpZWxkcworCQlwUmVwb3J0ICAgICAgICAgPSAoUE1FQVNVUkVNRU5UX1JFUE9SVF9FTEVNRU5UKSBwRGVzdDsKKwkJcFJlcG9ydC0+RWlkICAgID0gSUVfTUVBU1VSRU1FTlRfUkVQT1JUOworCQlwUmVwb3J0LT5MZW5ndGggPSAwOworCQlwUmVwb3J0LT5Ub2tlbiAgPSBwQWQtPlN0YUNmZy5NZWFzdXJlbWVudFJlcXVlc3RbUmVxSWR4XS5SZXFFbGVtLlRva2VuOworCQlwUmVwb3J0LT5Nb2RlICAgPSBwQWQtPlN0YUNmZy5NZWFzdXJlbWVudFJlcXVlc3RbUmVxSWR4XS5SZXFFbGVtLk1vZGU7CisJCXBSZXBvcnQtPlR5cGUgICA9IE1TUk5fVFlQRV9CRUFDT05fUkVROworCQlMZW5ndGggICAgICAgICAgPSBzaXplb2YoTUVBU1VSRU1FTlRfUkVQT1JUX0VMRU1FTlQpOworCQlwRGVzdCAgICAgICAgICArPSBzaXplb2YoTUVBU1VSRU1FTlRfUkVQT1JUX0VMRU1FTlQpOworCisJCS8vIDMuIFN0YXJ0IHRoZSBiZWFjb24gcmVwb3J0IGZvcm1hdAorCQlwQmVhY29uUmVwb3J0ID0gKFBCRUFDT05fUkVQT1JUKSBwRGVzdDsKKwkJcERlc3QgICAgICAgICs9IHNpemVvZihCRUFDT05fUkVQT1JUKTsKKwkJTGVuZ3RoICAgICAgICs9IHNpemVvZihCRUFDT05fUkVQT1JUKTsKKworCQkvLyA0LiBDb3B5IENoYW5uZWwgbnVtYmVyCisJCXBCZWFjb25SZXBvcnQtPkNoYW5uZWwgICAgICAgID0gcEJzcy0+Q2hhbm5lbDsKKwkJcEJlYWNvblJlcG9ydC0+U3BhcmUgICAgICAgICAgPSAwOworCQlwQmVhY29uUmVwb3J0LT5EdXJhdGlvbiAgICAgICA9IHBBZC0+U3RhQ2ZnLk1lYXN1cmVtZW50UmVxdWVzdFtSZXFJZHhdLk1lYXN1cmVtZW50LkR1cmF0aW9uOworCQlwQmVhY29uUmVwb3J0LT5QaHlUeXBlICAgICAgICA9ICgocEJzcy0+U3VwUmF0ZUxlbitwQnNzLT5FeHRSYXRlTGVuID4gNCkgPyBQSFlfRVJQIDogUEhZX0RTUyk7CisJCXBCZWFjb25SZXBvcnQtPlJ4UG93ZXIgICAgICAgID0gcEJzcy0+UnNzaSAtIHBBZC0+QmJwUnNzaVRvRGJtRGVsdGE7CisJCXBCZWFjb25SZXBvcnQtPkJlYWNvbkludGVydmFsID0gcEJzcy0+QmVhY29uUGVyaW9kOworCQlwQmVhY29uUmVwb3J0LT5DYXBhYmlsaXR5SW5mbyA9IHBCc3MtPkNhcGFiaWxpdHlJbmZvOworCQlDT1BZX01BQ19BRERSKHBCZWFjb25SZXBvcnQtPkJTU0lELCBwQnNzLT5Cc3NpZCk7CisJCU5kaXNNb3ZlTWVtb3J5KHBCZWFjb25SZXBvcnQtPlBhcmVudFRTRiwgcEJzcy0+UFRTRiwgNCk7CisJCU5kaXNNb3ZlTWVtb3J5KHBCZWFjb25SZXBvcnQtPlRhcmdldFRTRiwgcEJzcy0+VFRTRiwgOCk7CisKKwkJLy8gNS4gQ3JlYXRlIFNTSUQKKwkJKnBEZXN0KysgPSAweDAwOworCQkqcERlc3QrKyA9IHBCc3MtPlNzaWRMZW47CisJCU5kaXNNb3ZlTWVtb3J5KHBEZXN0LCBwQnNzLT5Tc2lkLCBwQnNzLT5Tc2lkTGVuKTsKKwkJcERlc3QgICs9IHBCc3MtPlNzaWRMZW47CisJCUxlbmd0aCArPSAoMiArIHBCc3MtPlNzaWRMZW4pOworCisJCS8vIDYuIENyZWF0ZSBTdXBwb3J0UmF0ZXMKKwkJKnBEZXN0KysgPSAweDAxOworCQkqcERlc3QrKyA9IHBCc3MtPlN1cFJhdGVMZW47CisJCU5kaXNNb3ZlTWVtb3J5KHBEZXN0LCBwQnNzLT5TdXBSYXRlLCBwQnNzLT5TdXBSYXRlTGVuKTsKKwkJcERlc3QgICs9IHBCc3MtPlN1cFJhdGVMZW47CisJCUxlbmd0aCArPSAoMiArIHBCc3MtPlN1cFJhdGVMZW4pOworCisJCS8vIDcuIERTIFBhcmFtZXRlcgorCQkqcERlc3QrKyA9IDB4MDM7CisJCSpwRGVzdCsrID0gMTsKKwkJKnBEZXN0KysgPSBwQnNzLT5DaGFubmVsOworCQlMZW5ndGggICs9IDM7CisKKwkJLy8gOC4gSUJTUyBwYXJhbWV0ZXIgaWYgcHJlc2VudHMKKwkJaWYgKHBCc3MtPkJzc1R5cGUgPT0gQlNTX0FESE9DKQorCQl7CisJCQkqcERlc3QrKyA9IDB4MDY7CisJCQkqcERlc3QrKyA9IDI7CisJCQkqKFBVU0hPUlQpIHBEZXN0ID0gcEJzcy0+QXRpbVdpbjsKKwkJCXBEZXN0ICAgKz0gMjsKKwkJCUxlbmd0aCAgKz0gNDsKKwkJfQorCisJCS8vIDkuIFVwZGF0ZSBsZW5ndGggZmllbGQsIG5vdCBpbmNsdWRlIEVJRCBhbmQgbGVuZ3RoCisJCXBSZXBvcnQtPkxlbmd0aCA9IExlbmd0aCAtIDQ7CisKKwkJLy8gMTAuIFVwZGF0ZSB0b3RhbCBmcmFtZSBzaXplCisJCXBBZC0+U3RhQ2ZnLkZyYW1lUmVwb3J0TGVuICs9IExlbmd0aDsKKwl9Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3N0YS9hc3NvYy5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zdGEvYXNzb2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MmRiNzUzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zdGEvYXNzb2MuYwpAQCAtMCwwICsxLDE4MjYgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJTW9kdWxlIE5hbWU6CisJYXNzb2MuYworCisJQWJzdHJhY3Q6CisKKwlSZXZpc2lvbiBIaXN0b3J5OgorCVdobwkJCVdoZW4JCQlXaGF0CisJLS0tLS0tLS0JLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCUpvaG4JCTIwMDQtOS0zCQlwb3J0aW5nIGZyb20gUlQyNTAwCisqLworI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgorCitVQ0hBUglDaXBoZXJXcGFUZW1wbGF0ZVtdID0geworCQkweGRkLCAJCQkJCS8vIFdQQSBJRQorCQkweDE2LAkJCQkJLy8gTGVuZ3RoCisJCTB4MDAsIDB4NTAsIDB4ZjIsIDB4MDEsCS8vIG91aQorCQkweDAxLCAweDAwLAkJCQkvLyBWZXJzaW9uCisJCTB4MDAsIDB4NTAsIDB4ZjIsIDB4MDIsCS8vIE11bHRpY2FzdAorCQkweDAxLCAweDAwLAkJCQkvLyBOdW1iZXIgb2YgdW5pY2FzdAorCQkweDAwLCAweDUwLCAweGYyLCAweDAyLAkvLyB1bmljYXN0CisJCTB4MDEsIDB4MDAsCQkJCS8vIG51bWJlciBvZiBhdXRoZW50aWNhdGlvbiBtZXRob2QKKwkJMHgwMCwgMHg1MCwgMHhmMiwgMHgwMQkvLyBhdXRoZW50aWNhdGlvbgorCQl9OworCitVQ0hBUglDaXBoZXJXcGEyVGVtcGxhdGVbXSA9IHsKKwkJMHgzMCwJCQkJCS8vIFJTTiBJRQorCQkweDE0LAkJCQkJLy8gTGVuZ3RoCisJCTB4MDEsIDB4MDAsCQkJCS8vIFZlcnNpb24KKwkJMHgwMCwgMHgwZiwgMHhhYywgMHgwMiwJLy8gZ3JvdXAgY2lwaGVyLCBUS0lQCisJCTB4MDEsIDB4MDAsCQkJCS8vIG51bWJlciBvZiBwYWlyd2lzZQorCQkweDAwLCAweDBmLCAweGFjLCAweDAyLAkvLyB1bmljYXN0CisJCTB4MDEsIDB4MDAsCQkJCS8vIG51bWJlciBvZiBhdXRoZW50aWNhdGlvbiBtZXRob2QKKwkJMHgwMCwgMHgwZiwgMHhhYywgMHgwMiwJLy8gYXV0aGVudGljYXRpb24KKwkJMHgwMCwgMHgwMCwJCQkJLy8gUlNOIGNhcGFiaWxpdHkKKwkJfTsKKworVUNIQVIJQ2N4MkllSW5mb1tdID0geyAweDAwLCAweDQwLCAweDk2LCAweDAzLCAweDAyfTsKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlhc3NvY2lhdGlvbiBzdGF0ZSBtYWNoaW5lIGluaXQsIGluY2x1ZGluZyBzdGF0ZSB0cmFuc2l0aW9uIGFuZCB0aW1lciBpbml0CisJUGFyYW1ldGVyczoKKwkJUyAtIHBvaW50ZXIgdG8gdGhlIGFzc29jaWF0aW9uIHN0YXRlIG1hY2hpbmUKKworCUlSUUwgPSBQQVNTSVZFX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIEFzc29jU3RhdGVNYWNoaW5lSW5pdCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiAgU1RBVEVfTUFDSElORSAqUywKKwlPVVQgU1RBVEVfTUFDSElORV9GVU5DIFRyYW5zW10pCit7CisJU3RhdGVNYWNoaW5lSW5pdChTLCBUcmFucywgTUFYX0FTU09DX1NUQVRFLCBNQVhfQVNTT0NfTVNHLCAoU1RBVEVfTUFDSElORV9GVU5DKURyb3AsIEFTU09DX0lETEUsIEFTU09DX01BQ0hJTkVfQkFTRSk7CisKKwkvLyBmaXJzdCBjb2x1bW4KKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQVNTT0NfSURMRSwgTVQyX01MTUVfQVNTT0NfUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKU1sbWVBc3NvY1JlcUFjdGlvbik7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFTU09DX0lETEUsIE1UMl9NTE1FX1JFQVNTT0NfUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKU1sbWVSZWFzc29jUmVxQWN0aW9uKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQVNTT0NfSURMRSwgTVQyX01MTUVfRElTQVNTT0NfUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKU1sbWVEaXNhc3NvY1JlcUFjdGlvbik7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFTU09DX0lETEUsIE1UMl9QRUVSX0RJU0FTU09DX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyRGlzYXNzb2NBY3Rpb24pOworCisJLy8gc2Vjb25kIGNvbHVtbgorCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBU1NPQ19XQUlUX1JTUCwgTVQyX01MTUVfQVNTT0NfUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKUludmFsaWRTdGF0ZVdoZW5Bc3NvYyk7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFTU09DX1dBSVRfUlNQLCBNVDJfTUxNRV9SRUFTU09DX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylJbnZhbGlkU3RhdGVXaGVuUmVhc3NvYyk7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFTU09DX1dBSVRfUlNQLCBNVDJfTUxNRV9ESVNBU1NPQ19SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpSW52YWxpZFN0YXRlV2hlbkRpc2Fzc29jaWF0ZSk7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFTU09DX1dBSVRfUlNQLCBNVDJfUEVFUl9ESVNBU1NPQ19SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpUGVlckRpc2Fzc29jQWN0aW9uKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQVNTT0NfV0FJVF9SU1AsIE1UMl9QRUVSX0FTU09DX1JTUCwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyQXNzb2NSc3BBY3Rpb24pOworCS8vCisJLy8gUGF0Y2ggM0NvbSBBUCBNT2RlOjNDUldFNDU0RzcyCisJLy8gV2Ugc2VuZCBBc3NvYyByZXF1ZXN0IGZyYW1lIHRvIHRoaXMgQVAsIGl0IGFsd2F5cyBzZW5kIFJlYXNzb2MgUnNwIG5vdCBBc3NvY2lhdGUgUnNwLgorCS8vCisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFTU09DX1dBSVRfUlNQLCBNVDJfUEVFUl9SRUFTU09DX1JTUCwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyQXNzb2NSc3BBY3Rpb24pOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBU1NPQ19XQUlUX1JTUCwgTVQyX0FTU09DX1RJTUVPVVQsIChTVEFURV9NQUNISU5FX0ZVTkMpQXNzb2NUaW1lb3V0QWN0aW9uKTsKKworCS8vIHRoaXJkIGNvbHVtbgorCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBSRUFTU09DX1dBSVRfUlNQLCBNVDJfTUxNRV9BU1NPQ19SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpSW52YWxpZFN0YXRlV2hlbkFzc29jKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgUkVBU1NPQ19XQUlUX1JTUCwgTVQyX01MTUVfUkVBU1NPQ19SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpSW52YWxpZFN0YXRlV2hlblJlYXNzb2MpOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBSRUFTU09DX1dBSVRfUlNQLCBNVDJfTUxNRV9ESVNBU1NPQ19SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpSW52YWxpZFN0YXRlV2hlbkRpc2Fzc29jaWF0ZSk7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIFJFQVNTT0NfV0FJVF9SU1AsIE1UMl9QRUVSX0RJU0FTU09DX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyRGlzYXNzb2NBY3Rpb24pOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBSRUFTU09DX1dBSVRfUlNQLCBNVDJfUEVFUl9SRUFTU09DX1JTUCwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyUmVhc3NvY1JzcEFjdGlvbik7CisJLy8KKwkvLyBQYXRjaCwgQVAgZG9lc24ndCBzZW5kIFJlYXNzb2NpYXRlIFJzcCBmcmFtZSB0byBTdGF0aW9uLgorCS8vCisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIFJFQVNTT0NfV0FJVF9SU1AsIE1UMl9QRUVSX0FTU09DX1JTUCwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyUmVhc3NvY1JzcEFjdGlvbik7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIFJFQVNTT0NfV0FJVF9SU1AsIE1UMl9SRUFTU09DX1RJTUVPVVQsIChTVEFURV9NQUNISU5FX0ZVTkMpUmVhc3NvY1RpbWVvdXRBY3Rpb24pOworCisJLy8gZm91cnRoIGNvbHVtbgorCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBESVNBU1NPQ19XQUlUX1JTUCwgTVQyX01MTUVfQVNTT0NfUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKUludmFsaWRTdGF0ZVdoZW5Bc3NvYyk7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIERJU0FTU09DX1dBSVRfUlNQLCBNVDJfTUxNRV9SRUFTU09DX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylJbnZhbGlkU3RhdGVXaGVuUmVhc3NvYyk7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIERJU0FTU09DX1dBSVRfUlNQLCBNVDJfTUxNRV9ESVNBU1NPQ19SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpSW52YWxpZFN0YXRlV2hlbkRpc2Fzc29jaWF0ZSk7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIERJU0FTU09DX1dBSVRfUlNQLCBNVDJfUEVFUl9ESVNBU1NPQ19SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpUGVlckRpc2Fzc29jQWN0aW9uKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgRElTQVNTT0NfV0FJVF9SU1AsIE1UMl9ESVNBU1NPQ19USU1FT1VULCAoU1RBVEVfTUFDSElORV9GVU5DKURpc2Fzc29jVGltZW91dEFjdGlvbik7CisKKwkvLyBpbml0aWFsaXplIHRoZSB0aW1lcgorCVJUTVBJbml0VGltZXIocEFkLCAmcEFkLT5NbG1lQXV4LkFzc29jVGltZXIsIEdFVF9USU1FUl9GVU5DVElPTihBc3NvY1RpbWVvdXQpLCBwQWQsIEZBTFNFKTsKKwlSVE1QSW5pdFRpbWVyKHBBZCwgJnBBZC0+TWxtZUF1eC5SZWFzc29jVGltZXIsIEdFVF9USU1FUl9GVU5DVElPTihSZWFzc29jVGltZW91dCksIHBBZCwgRkFMU0UpOworCVJUTVBJbml0VGltZXIocEFkLCAmcEFkLT5NbG1lQXV4LkRpc2Fzc29jVGltZXIsIEdFVF9USU1FUl9GVU5DVElPTihEaXNhc3NvY1RpbWVvdXQpLCBwQWQsIEZBTFNFKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlBc3NvY2lhdGlvbiB0aW1lb3V0IHByb2NlZHVyZS4gQWZ0ZXIgYXNzb2NpYXRpb24gdGltZW91dCwgdGhpcyBmdW5jdGlvbgorCQl3aWxsIGJlIGNhbGxlZCBhbmQgaXQgd2lsbCBwdXQgYSBtZXNzYWdlIGludG8gdGhlIE1MTUUgcXVldWUKKwlQYXJhbWV0ZXJzOgorCQlTdGFuZGFyZCB0aW1lciBwYXJhbWV0ZXJzCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgQXNzb2NUaW1lb3V0KElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKKwkJCQkgSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAorCQkJCSBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisJCQkJIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMykKK3sKKwlSVE1QX0FEQVBURVIgKnBBZCA9IChSVE1QX0FEQVBURVIgKilGdW5jdGlvbkNvbnRleHQ7CisKKwkvLyBEbyBub3RoaW5nIGlmIHRoZSBkcml2ZXIgaXMgc3RhcnRpbmcgaGFsdCBzdGF0ZS4KKwkvLyBUaGlzIG1pZ2h0IGhhcHBlbiB3aGVuIHRpbWVyIGFscmVhZHkgYmVlbiBmaXJlZCBiZWZvcmUgY2FuY2VsIHRpbWVyIHdpdGggbWxtZWhhbHQKKwlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKQorCQlyZXR1cm47CisKKwlNbG1lRW5xdWV1ZShwQWQsIEFTU09DX1NUQVRFX01BQ0hJTkUsIE1UMl9BU1NPQ19USU1FT1VULCAwLCBOVUxMKTsKKwlSVDI4WFhfTUxNRV9IQU5ETEVSKHBBZCk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJUmVhc3NvY2lhdGlvbiB0aW1lb3V0IHByb2NlZHVyZS4gQWZ0ZXIgcmVhc3NvY2lhdGlvbiB0aW1lb3V0LCB0aGlzCisJCWZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIGFuZCBwdXQgYSBtZXNzYWdlIGludG8gdGhlIE1MTUUgcXVldWUKKwlQYXJhbWV0ZXJzOgorCQlTdGFuZGFyZCB0aW1lciBwYXJhbWV0ZXJzCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgUmVhc3NvY1RpbWVvdXQoSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorCQkJCQlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCisJCQkJCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKKwkJCQkJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKQoreworCVJUTVBfQURBUFRFUiAqcEFkID0gKFJUTVBfQURBUFRFUiAqKUZ1bmN0aW9uQ29udGV4dDsKKworCS8vIERvIG5vdGhpbmcgaWYgdGhlIGRyaXZlciBpcyBzdGFydGluZyBoYWx0IHN0YXRlLgorCS8vIFRoaXMgbWlnaHQgaGFwcGVuIHdoZW4gdGltZXIgYWxyZWFkeSBiZWVuIGZpcmVkIGJlZm9yZSBjYW5jZWwgdGltZXIgd2l0aCBtbG1laGFsdAorCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyB8IGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpCisJCXJldHVybjsKKworCU1sbWVFbnF1ZXVlKHBBZCwgQVNTT0NfU1RBVEVfTUFDSElORSwgTVQyX1JFQVNTT0NfVElNRU9VVCwgMCwgTlVMTCk7CisJUlQyOFhYX01MTUVfSEFORExFUihwQWQpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCURpc2Fzc29jaWF0aW9uIHRpbWVvdXQgcHJvY2VkdXJlLiBBZnRlciBkaXNhc3NvY2lhdGlvbiB0aW1lb3V0LCB0aGlzCisJCWZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIGFuZCBwdXQgYSBtZXNzYWdlIGludG8gdGhlIE1MTUUgcXVldWUKKwlQYXJhbWV0ZXJzOgorCQlTdGFuZGFyZCB0aW1lciBwYXJhbWV0ZXJzCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgRGlzYXNzb2NUaW1lb3V0KElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKKwkJCQkJSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAorCQkJCQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisJCQkJCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMykKK3sKKwlSVE1QX0FEQVBURVIgKnBBZCA9IChSVE1QX0FEQVBURVIgKilGdW5jdGlvbkNvbnRleHQ7CisKKwkvLyBEbyBub3RoaW5nIGlmIHRoZSBkcml2ZXIgaXMgc3RhcnRpbmcgaGFsdCBzdGF0ZS4KKwkvLyBUaGlzIG1pZ2h0IGhhcHBlbiB3aGVuIHRpbWVyIGFscmVhZHkgYmVlbiBmaXJlZCBiZWZvcmUgY2FuY2VsIHRpbWVyIHdpdGggbWxtZWhhbHQKKwlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKQorCQlyZXR1cm47CisKKwlNbG1lRW5xdWV1ZShwQWQsIEFTU09DX1NUQVRFX01BQ0hJTkUsIE1UMl9ESVNBU1NPQ19USU1FT1VULCAwLCBOVUxMKTsKKwlSVDI4WFhfTUxNRV9IQU5ETEVSKHBBZCk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJbWxtZSBhc3NvYyByZXEgaGFuZGxpbmcgcHJvY2VkdXJlCisJUGFyYW1ldGVyczoKKwkJQWRhcHRlciAtIEFkYXB0ZXIgcG9pbnRlcgorCQlFbGVtIC0gTUxNRSBRdWV1ZSBFbGVtZW50CisJUHJlOgorCQl0aGUgc3RhdGlvbiBoYXMgYmVlbiBhdXRoZW50aWNhdGVkIGFuZCB0aGUgZm9sbG93aW5nIGluZm9ybWF0aW9uIGlzIHN0b3JlZCBpbiB0aGUgY29uZmlnCisJCQktIyBTU0lECisJCQktIyBzdXBwb3J0ZWQgcmF0ZXMgYW5kIHRoZWlyIGxlbmd0aAorCQkJLSMgbGlzdGVuIGludGVydmFsIChBZGFwdGVyLT5TdGFDZmcuZGVmYXVsdF9saXN0ZW5fY291bnQpCisJCQktIyBUcmFuc21pdCBwb3dlciAgKEFkYXB0ZXItPlN0YUNmZy50eF9wb3dlcikKKwlQb3N0ICA6CisJCS0jIEFuIGFzc29jaWF0aW9uIHJlcXVlc3QgZnJhbWUgaXMgZ2VuZXJhdGVkIGFuZCBzZW50IHRvIHRoZSBhaXIKKwkJLSMgQXNzb2NpYXRpb24gdGltZXIgc3RhcnRzCisJCS0jIEFzc29jaWF0aW9uIHN0YXRlIC0+IEFTU09DX1dBSVRfUlNQCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgTWxtZUFzc29jUmVxQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlVQ0hBUgkJCUFwQWRkcls2XTsKKwlIRUFERVJfODAyXzExCUFzc29jSGRyOworCVVDSEFSCQkJQ2N4MkxlbiA9IDU7CisJVUNIQVIJCQlXbWVJZVs5XSA9IHtJRV9WRU5ET1JfU1BFQ0lGSUMsIDB4MDcsIDB4MDAsIDB4NTAsIDB4ZjIsIDB4MDIsIDB4MDAsIDB4MDEsIDB4MDB9OworCVVTSE9SVAkJCUxpc3RlbkludHY7CisJVUxPTkcJCQlUaW1lb3V0OworCVVTSE9SVAkJCUNhcGFiaWxpdHlJbmZvOworCUJPT0xFQU4JCQlUaW1lckNhbmNlbGxlZDsKKwlQVUNIQVIJCQlwT3V0QnVmZmVyID0gTlVMTDsKKwlORElTX1NUQVRVUwkJTlN0YXR1czsKKwlVTE9ORwkJCUZyYW1lTGVuID0gMDsKKwlVTE9ORwkJCXRtcDsKKwlVU0hPUlQJCQlWYXJJZXNPZmZzZXQ7CisJVUNIQVIJCQlDa2lwRmxhZzsKKwlVQ0hBUgkJCUNraXBOZWdvdGlhdGlvbkJ1ZmZlcltDS0lQX05FR09USUFUSU9OX0xFTkdUSF07CisJVUNIQVIJCQlBaXJvbmV0Q2tpcEllID0gSUVfQUlST05FVF9DS0lQOworCVVDSEFSCQkJQWlyb25ldENraXBMZW4gPSBDS0lQX05FR09USUFUSU9OX0xFTkdUSDsKKwlVQ0hBUgkJCUFpcm9uZXRJUEFkZHJlc3NJRSA9IElFX0FJUk9ORVRfSVBBRERSRVNTOworCVVDSEFSCQkJQWlyb25ldElQQWRkcmVzc0xlbiA9IEFJUk9ORVRfSVBBRERSRVNTX0xFTkdUSDsKKwlVQ0hBUgkJCUFpcm9uZXRJUEFkZHJlc3NCdWZmZXJbQUlST05FVF9JUEFERFJFU1NfTEVOR1RIXSA9IHsweDAwLCAweDQwLCAweDk2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAyLCAweDAwfTsKKwlVU0hPUlQJCQlTdGF0dXM7CisKKwkvLyBCbG9jayBhbGwgYXV0aGVudGljYXRpb24gcmVxdWVzdCBkdXJuaW5nIFdQQSBibG9jayBwZXJpb2QKKwlpZiAocEFkLT5TdGFDZmcuYkJsb2NrQXNzb2MgPT0gVFJVRSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFTU09DIC0gQmxvY2sgQXNzb2MgcmVxdWVzdCBkdXJuaW5nIFdQQSBibG9jayBwZXJpb2QhXG4iKSk7CisJCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlID0gQVNTT0NfSURMRTsKKwkJU3RhdHVzID0gTUxNRV9TVEFURV9NQUNISU5FX1JFSkVDVDsKKwkJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX0FTU09DX0NPTkYsIDIsICZTdGF0dXMpOworCX0KKwkvLyBjaGVjayBzYW5pdHkgZmlyc3QKKwllbHNlIGlmIChNbG1lQXNzb2NSZXFTYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbiwgQXBBZGRyLCAmQ2FwYWJpbGl0eUluZm8sICZUaW1lb3V0LCAmTGlzdGVuSW50dikpCisJeworCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5Bc3NvY1RpbWVyLCAmVGltZXJDYW5jZWxsZWQpOworCQlDT1BZX01BQ19BRERSKHBBZC0+TWxtZUF1eC5Cc3NpZCwgQXBBZGRyKTsKKworCQkvLyBHZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQorCQlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOworCQlpZiAoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCQl7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkFTU09DIC0gTWxtZUFzc29jUmVxQWN0aW9uKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxlZCBcbiIpKTsKKwkJCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlID0gQVNTT0NfSURMRTsKKwkJCVN0YXR1cyA9IE1MTUVfRkFJTF9OT19SRVNPVVJDRTsKKwkJCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9BU1NPQ19DT05GLCAyLCAmU3RhdHVzKTsKKwkJCXJldHVybjsKKwkJfQorCisJCS8vIEFkZCBieSBKYW1lcyAwMy8wNi8yNworCQlwQWQtPlN0YUNmZy5Bc3NvY0luZm8uTGVuZ3RoID0gc2l6ZW9mKE5ESVNfODAyXzExX0FTU09DSUFUSU9OX0lORk9STUFUSU9OKTsKKwkJLy8gQXNzb2NpYXRpb24gZG9uJ3QgbmVlZCB0byByZXBvcnQgTUFDIGFkZHJlc3MKKwkJcEFkLT5TdGFDZmcuQXNzb2NJbmZvLkF2YWlsYWJsZVJlcXVlc3RGaXhlZElFcyA9CisJCQlORElTXzgwMl8xMV9BSV9SRVFGSV9DQVBBQklMSVRJRVMgfCBORElTXzgwMl8xMV9BSV9SRVFGSV9MSVNURU5JTlRFUlZBTDsKKwkJcEFkLT5TdGFDZmcuQXNzb2NJbmZvLlJlcXVlc3RGaXhlZElFcy5DYXBhYmlsaXRpZXMgPSBDYXBhYmlsaXR5SW5mbzsKKwkJcEFkLT5TdGFDZmcuQXNzb2NJbmZvLlJlcXVlc3RGaXhlZElFcy5MaXN0ZW5JbnRlcnZhbCA9IExpc3RlbkludHY7CisJCS8vIE9ubHkgcmVhc3NvY2lhdGUgbmVlZCB0aGlzCisJCS8vQ09QWV9NQUNfQUREUihwQWQtPlN0YUNmZy5Bc3NvY0luZm8uUmVxdWVzdEZpeGVkSUVzLkN1cnJlbnRBUEFkZHJlc3MsIEFwQWRkcik7CisJCXBBZC0+U3RhQ2ZnLkFzc29jSW5mby5PZmZzZXRSZXF1ZXN0SUVzID0gc2l6ZW9mKE5ESVNfODAyXzExX0FTU09DSUFUSU9OX0lORk9STUFUSU9OKTsKKworICAgICAgICBOZGlzWmVyb01lbW9yeShwQWQtPlN0YUNmZy5SZXFWYXJJRXMsIE1BWF9WSUVfTEVOKTsKKwkJLy8gRmlyc3QgYWRkIFNTSUQKKwkJVmFySWVzT2Zmc2V0ID0gMDsKKwkJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuUmVxVmFySUVzICsgVmFySWVzT2Zmc2V0LCAmU3NpZEllLCAxKTsKKwkJVmFySWVzT2Zmc2V0ICs9IDE7CisJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLlJlcVZhcklFcyArIFZhckllc09mZnNldCwgJnBBZC0+TWxtZUF1eC5Tc2lkTGVuLCAxKTsKKwkJVmFySWVzT2Zmc2V0ICs9IDE7CisJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLlJlcVZhcklFcyArIFZhckllc09mZnNldCwgcEFkLT5NbG1lQXV4LlNzaWQsIHBBZC0+TWxtZUF1eC5Tc2lkTGVuKTsKKwkJVmFySWVzT2Zmc2V0ICs9IHBBZC0+TWxtZUF1eC5Tc2lkTGVuOworCisJCS8vIFNlY29uZCBhZGQgU3VwcG9ydGVkIHJhdGVzCisJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLlJlcVZhcklFcyArIFZhckllc09mZnNldCwgJlN1cFJhdGVJZSwgMSk7CisJCVZhckllc09mZnNldCArPSAxOworCQlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5SZXFWYXJJRXMgKyBWYXJJZXNPZmZzZXQsICZwQWQtPk1sbWVBdXguU3VwUmF0ZUxlbiwgMSk7CisJCVZhckllc09mZnNldCArPSAxOworCQlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5SZXFWYXJJRXMgKyBWYXJJZXNPZmZzZXQsIHBBZC0+TWxtZUF1eC5TdXBSYXRlLCBwQWQtPk1sbWVBdXguU3VwUmF0ZUxlbik7CisJCVZhckllc09mZnNldCArPSBwQWQtPk1sbWVBdXguU3VwUmF0ZUxlbjsKKwkJLy8gRW5kIEFkZCBieSBKYW1lcworCisgICAgICAgIGlmICgocEFkLT5Db21tb25DZmcuQ2hhbm5lbCA+IDE0KSAmJgorICAgICAgICAgICAgKHBBZC0+Q29tbW9uQ2ZnLmJJRUVFODAyMTFIID09IFRSVUUpKQorICAgICAgICAgICAgQ2FwYWJpbGl0eUluZm8gfD0gMHgwMTAwOworCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFTU09DIC0gU2VuZCBBU1NPQyByZXF1ZXN0Li4uXG4iKSk7CisJCU1ndE1hY0hlYWRlckluaXQocEFkLCAmQXNzb2NIZHIsIFNVQlRZUEVfQVNTT0NfUkVRLCAwLCBBcEFkZHIsIEFwQWRkcik7CisKKwkJLy8gQnVpbGQgYmFzaWMgZnJhbWUgZmlyc3QKKwkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwJCQkJJkZyYW1lTGVuLAorCQkJCQkJICBzaXplb2YoSEVBREVSXzgwMl8xMSksCSZBc3NvY0hkciwKKwkJCQkJCSAgMiwJCQkJCQkmQ2FwYWJpbGl0eUluZm8sCisJCQkJCQkgIDIsCQkJCQkJJkxpc3RlbkludHYsCisJCQkJCQkgIDEsCQkJCQkJJlNzaWRJZSwKKwkJCQkJCSAgMSwJCQkJCQkmcEFkLT5NbG1lQXV4LlNzaWRMZW4sCisJCQkJCQkgIHBBZC0+TWxtZUF1eC5Tc2lkTGVuLCAJcEFkLT5NbG1lQXV4LlNzaWQsCisJCQkJCQkgIDEsCQkJCQkJJlN1cFJhdGVJZSwKKwkJCQkJCSAgMSwJCQkJCQkmcEFkLT5NbG1lQXV4LlN1cFJhdGVMZW4sCisJCQkJCQkgIHBBZC0+TWxtZUF1eC5TdXBSYXRlTGVuLCAgcEFkLT5NbG1lQXV4LlN1cFJhdGUsCisJCQkJCQkgIEVORF9PRl9BUkdTKTsKKworCQlpZiAocEFkLT5NbG1lQXV4LkV4dFJhdGVMZW4gIT0gMCkKKwkJeworCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAgICAmdG1wLAorCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAmRXh0UmF0ZUllLAorCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAmcEFkLT5NbG1lQXV4LkV4dFJhdGVMZW4sCisJCQkJCQkJICBwQWQtPk1sbWVBdXguRXh0UmF0ZUxlbiwgIHBBZC0+TWxtZUF1eC5FeHRSYXRlLAorCQkJCQkJCSAgRU5EX09GX0FSR1MpOworCQkJRnJhbWVMZW4gKz0gdG1wOworCQl9CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJLy8gSFQKKwkJaWYgKChwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5TGVuID4gMCkgJiYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCkpCisJCXsKKwkJCVVMT05HIFRtcExlbjsKKwkJCVVDSEFSIEh0TGVuOworCQkJVUNIQVIgQlJPQURDT01bNF0gPSB7MHgwLCAweDkwLCAweDRjLCAweDMzfTsKKwkJCWlmIChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLmJQcmVOSHQgPT0gVFJVRSkKKwkJCXsKKwkJCQlIdExlbiA9IFNJWkVfSFRfQ0FQX0lFICsgNDsKKwkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sICAgICAgICAgICAgJlRtcExlbiwKKwkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmV3BhSWUsCisJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkh0TGVuLAorCQkJCQkJCSAgNCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZCUk9BRENPTVswXSwKKwkJCQkJCQkgcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eUxlbiwgICAgICAgICAgJnBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHksCisJCQkJCQkJICBFTkRfT0ZfQVJHUyk7CisJCQl9CisJCQllbHNlCisJCQl7CisjaWZkZWYgUlRfQklHX0VORElBTgorCQkgICAgICAgIEhUX0NBUEFCSUxJVFlfSUUgSHRDYXBhYmlsaXR5VG1wOworI2VuZGlmCisKKyNpZm5kZWYgUlRfQklHX0VORElBTgorCQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwgICAgICAgICAgICAmVG1wTGVuLAorCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZIdENhcEllLAorCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5TGVuLAorCQkJCQkJCSBwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5TGVuLCAgICAgICAgICAmcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eSwKKwkJCQkJCQkgIEVORF9PRl9BUkdTKTsKKyNlbHNlCisgICAgICAgICAgICAgICAgTmRpc1plcm9NZW1vcnkoJkh0Q2FwYWJpbGl0eVRtcCwgc2l6ZW9mKEhUX0NBUEFCSUxJVFlfSUUpKTsKKyAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeSgmSHRDYXBhYmlsaXR5VG1wLCAmcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eSwgcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eUxlbik7CisgICAgICAgIAkJKihVU0hPUlQgKikoJkh0Q2FwYWJpbGl0eVRtcC5IdENhcEluZm8pID0gU1dBUDE2KCooVVNIT1JUICopKCZIdENhcGFiaWxpdHlUbXAuSHRDYXBJbmZvKSk7CisgICAgICAgIAkJKihVU0hPUlQgKikoJkh0Q2FwYWJpbGl0eVRtcC5FeHRIdENhcEluZm8pID0gU1dBUDE2KCooVVNIT1JUICopKCZIdENhcGFiaWxpdHlUbXAuRXh0SHRDYXBJbmZvKSk7CisKKyAgICAgICAgCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sICAgICAgICAgJlRtcExlbiwKKyAgICAgICAgCQkJCQkJCTEsICAgICAgICAgICAgICAgICAgICAgICAgICAgJkh0Q2FwSWUsCisgICAgICAgIAkJCQkJCQkxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5TGVuLAorICAgICAgICAJCQkJCQkJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eUxlbiwmSHRDYXBhYmlsaXR5VG1wLAorICAgICAgICAJCQkJCQkJRU5EX09GX0FSR1MpOworI2VuZGlmCisJCQl9CisJCQlGcmFtZUxlbiArPSBUbXBMZW47CisJCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCQkvLyBhZGQgUmFsaW5rIHByb3ByaWV0YXJ5IElFIHRvIGluZm9ybSBBUCB0aGlzIFNUQSBpcyBnb2luZyB0byB1c2UgQUdHUkVHQVRJT04gb3IgUElHR1ktQkFDSytBR0dSRUdBVElPTgorCQkvLyBDYXNlIEk6IChBZ2dyZWdhdGlvbiArIFBpZ2d5LUJhY2spCisJCS8vIDEuIHVzZXIgZW5hYmxlIGFnZ3JlZ2F0aW9uLCBBTkQKKwkJLy8gMi4gTWFjIHN1cHBvcnQgcGlnZ3ktYmFjaworCQkvLyAzLiBBUCBhbm5vdWNlcyBpdCdzIFBJR0dZLUJBQ0srQUdHUkVHQVRJT04tY2FwYWJsZSBpbiBCRUFDT04KKwkJLy8gQ2FzZSBJSTogKEFnZ3JlZ2F0aW9uKQorCQkvLyAxLiB1c2VyIGVuYWJsZSBhZ2dyZWdhdGlvbiwgQU5ECisJCS8vIDIuIEFQIGFubm91Y2VzIGl0J3MgQUdHUkVHQVRJT04tY2FwYWJsZSBpbiBCRUFDT04KKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJBZ2dyZWdhdGlvbkNhcGFibGUpCisJCXsKKwkJCWlmICgocEFkLT5Db21tb25DZmcuYlBpZ2d5QmFja0NhcGFibGUpICYmICgocEFkLT5NbG1lQXV4LkFQUmFsaW5rSWUgJiAweDAwMDAwMDAzKSA9PSAzKSkKKwkJCXsKKwkJCQlVTE9ORyBUbXBMZW47CisJCQkJVUNIQVIgUmFsaW5rSWVbOV0gPSB7SUVfVkVORE9SX1NQRUNJRklDLCA3LCAweDAwLCAweDBjLCAweDQzLCAweDAzLCAweDAwLCAweDAwLCAweDAwfTsKKwkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyK0ZyYW1lTGVuLCAgICAgICAgICAgJlRtcExlbiwKKwkJCQkJCQkJICA5LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmFsaW5rSWUsCisJCQkJCQkJCSAgRU5EX09GX0FSR1MpOworCQkJCUZyYW1lTGVuICs9IFRtcExlbjsKKwkJCX0KKwkJCWVsc2UgaWYgKHBBZC0+TWxtZUF1eC5BUFJhbGlua0llICYgMHgwMDAwMDAwMSkKKwkJCXsKKwkJCQlVTE9ORyBUbXBMZW47CisJCQkJVUNIQVIgUmFsaW5rSWVbOV0gPSB7SUVfVkVORE9SX1NQRUNJRklDLCA3LCAweDAwLCAweDBjLCAweDQzLCAweDAxLCAweDAwLCAweDAwLCAweDAwfTsKKwkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyK0ZyYW1lTGVuLCAgICAgICAgICAgJlRtcExlbiwKKwkJCQkJCQkJICA5LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmFsaW5rSWUsCisJCQkJCQkJCSAgRU5EX09GX0FSR1MpOworCQkJCUZyYW1lTGVuICs9IFRtcExlbjsKKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCVVMT05HIFRtcExlbjsKKwkJCVVDSEFSIFJhbGlua0llWzldID0ge0lFX1ZFTkRPUl9TUEVDSUZJQywgNywgMHgwMCwgMHgwYywgMHg0MywgMHgwNiwgMHgwMCwgMHgwMCwgMHgwMH07CisJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyK0ZyYW1lTGVuLAkJICZUbXBMZW4sCisJCQkJCQkJICA5LAkJCQkJCSBSYWxpbmtJZSwKKwkJCQkJCQkgIEVORF9PRl9BUkdTKTsKKwkJCUZyYW1lTGVuICs9IFRtcExlbjsKKwkJfQorCisJCWlmIChwQWQtPk1sbWVBdXguQVBFZGNhUGFybS5iVmFsaWQpCisJCXsKKwkJCWlmIChwQWQtPkNvbW1vbkNmZy5iQVBTRENhcGFibGUgJiYgcEFkLT5NbG1lQXV4LkFQRWRjYVBhcm0uYkFQU0RDYXBhYmxlKQorCQkJeworCQkJCVFCU1NfU1RBX0lORk9fUEFSTSBRb3NJbmZvOworCisJCQkJTmRpc1plcm9NZW1vcnkoJlFvc0luZm8sIHNpemVvZihRQlNTX1NUQV9JTkZPX1BBUk0pKTsKKwkJCQlRb3NJbmZvLlVBUFNEX0FDX0JFID0gcEFkLT5Db21tb25DZmcuYkFQU0RBQ19CRTsKKwkJCQlRb3NJbmZvLlVBUFNEX0FDX0JLID0gcEFkLT5Db21tb25DZmcuYkFQU0RBQ19CSzsKKwkJCQlRb3NJbmZvLlVBUFNEX0FDX1ZJID0gcEFkLT5Db21tb25DZmcuYkFQU0RBQ19WSTsKKwkJCQlRb3NJbmZvLlVBUFNEX0FDX1ZPID0gcEFkLT5Db21tb25DZmcuYkFQU0RBQ19WTzsKKwkJCQlRb3NJbmZvLk1heFNQTGVuZ3RoID0gcEFkLT5Db21tb25DZmcuTWF4U1BMZW5ndGg7CisJCQkJV21lSWVbOF0gfD0gKihQVUNIQVIpJlFvc0luZm87CisJCQl9CisJCQllbHNlCisJCQl7CisgICAgICAgICAgICAgICAgLy8gVGhlIFBhcmFtZXRlciBTZXQgQ291bnQgaXMgc2V0IHRvIKGnMKGoIGluIHRoZSBhc3NvY2lhdGlvbiByZXF1ZXN0IGZyYW1lcworICAgICAgICAgICAgICAgIC8vIFdtZUllWzhdIHw9IChwQWQtPk1sbWVBdXguQVBFZGNhUGFybS5FZGNhVXBkYXRlQ291bnQgJiAweDBmKTsKKwkJCX0KKworCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAgICAmdG1wLAorCQkJCQkJCSAgOSwgICAgICAgICAgICAgICAgICAgICAgICAmV21lSWVbMF0sCisJCQkJCQkJICBFTkRfT0ZfQVJHUyk7CisJCQlGcmFtZUxlbiArPSB0bXA7CisJCX0KKworCQkvLworCQkvLyBMZXQgV1BBKCMyMjEpIEVsZW1lbnQgSUQgb24gdGhlIGVuZCBvZiB0aGlzIGFzc29jaWF0aW9uIGZyYW1lLgorCQkvLyBPdGhlcndpc2Ugc29tZSBBUCB3aWxsIGZhaWwgb24gcGFyc2luZyBFbGVtZW50IElEIGFuZCBzZXQgc3RhdHVzIGZhaWwgb24gQXNzb2MgUnNwLgorCQkvLyBGb3IgZXhhbXBsZTogUHV0IFZlbmRvciBTcGVjaWZpYyBJRSBvbiB0aGUgZnJvbnQgb2YgV1BBIElFLgorCQkvLyBUaGlzIGhhcHBlbnMgb24gQVAgKE1vZGVsIE5vOkxpbmtzeXMgV1JLNTRHKQorCQkvLworCQlpZiAoKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spIHx8CisgICAgICAgICAgICAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykgfHwKKyAgICAgICAgICAgIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpIHx8CisgICAgICAgICAgICAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikKKwkJCSkKKyAgICAgICAgICAgICkKKwkJeworCQkJVUNIQVIgUlNOSWUgPSBJRV9XUEE7CisKKwkJCWlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykgfHwKKyAgICAgICAgICAgICAgICAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikpCisJCQl7CisJCQkJUlNOSWUgPSBJRV9XUEEyOworCQkJfQorCisjaWZkZWYgTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyNpZmRlZiBTSU9DU0lXR0VOSUUKKwkJCWlmIChwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgIT0gMSkKKyNlbmRpZiAvLyBTSU9DU0lXR0VOSUUgLy8KKyNlbmRpZiAvLyBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworICAgICAgICAgICAgCVJUTVBNYWtlUlNOSUUocEFkLCBwQWQtPlN0YUNmZy5BdXRoTW9kZSwgcEFkLT5TdGFDZmcuV2VwU3RhdHVzLCBCU1MwKTsKKworICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIFdQQSBQTUsgY2FjaGUgbGlzdAorCQkJaWYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIpCisJCQl7CisJCQkgICAgSU5UICAgICBpZHg7CisgICAgICAgICAgICAgICAgQk9PTEVBTiBGb3VuZFBNSyA9IEZBTFNFOworCQkJCS8vIFNlYXJjaCBjaGNoZWQgUE1LSUQsIGFwcGVuZCBpdCBpZiBleGlzdGVkCisJCQkJZm9yIChpZHggPSAwOyBpZHggPCBQTUtJRF9OTzsgaWR4KyspCisJCQkJeworCQkJCQlpZiAoTmRpc0VxdWFsTWVtb3J5KEFwQWRkciwgJnBBZC0+U3RhQ2ZnLlNhdmVkUE1LW2lkeF0uQlNTSUQsIDYpKQorCQkJCQl7CisJCQkJCQlGb3VuZFBNSyA9IFRSVUU7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKworCQkJCWlmIChGb3VuZFBNSykKKwkJCQl7CisJCQkJCS8vIFNldCBQTUsgbnVtYmVyCisJCQkJCSooUFVTSE9SVCkgJnBBZC0+U3RhQ2ZnLlJTTl9JRVtwQWQtPlN0YUNmZy5SU05JRV9MZW5dID0gMTsKKwkJCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+U3RhQ2ZnLlJTTl9JRVtwQWQtPlN0YUNmZy5SU05JRV9MZW4gKyAyXSwgJnBBZC0+U3RhQ2ZnLlNhdmVkUE1LW2lkeF0uUE1LSUQsIDE2KTsKKyAgICAgICAgICAgICAgICAgICAgcEFkLT5TdGFDZmcuUlNOSUVfTGVuICs9IDE4OworCQkJCX0KKwkJCX0KKworI2lmZGVmIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisjaWZkZWYgU0lPQ1NJV0dFTklFCisJCQlpZiAocEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQID09IDEpCisJCQl7CisJCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAgICAJCSZ0bXAsCisJCSAgICAgICAgICAgICAgICAgICAgICAgIAlwQWQtPlN0YUNmZy5SU05JRV9MZW4sCQkJcEFkLT5TdGFDZmcuUlNOX0lFLAorCQkgICAgICAgICAgICAgICAgICAgICAgICAJRU5EX09GX0FSR1MpOworCQkJfQorCQkJZWxzZQorI2VuZGlmCisjZW5kaWYgLy8gTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKwkJCXsKKwkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sICAgIAkJJnRtcCwKKwkJCQkgICAgICAgICAgICAgIAkJMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmUlNOSWUsCisJCSAgICAgICAgICAgICAgICAgICAgICAgIAkxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQWQtPlN0YUNmZy5SU05JRV9MZW4sCisJCSAgICAgICAgICAgICAgICAgICAgICAgIAlwQWQtPlN0YUNmZy5SU05JRV9MZW4sCQkJcEFkLT5TdGFDZmcuUlNOX0lFLAorCQkgICAgICAgICAgICAgICAgICAgICAgICAJRU5EX09GX0FSR1MpOworCQkJfQorCisJCQlGcmFtZUxlbiArPSB0bXA7CisKKyNpZmRlZiBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorI2lmZGVmIFNJT0NTSVdHRU5JRQorCQkJaWYgKHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCAhPSAxKQorI2VuZGlmCisjZW5kaWYgLy8gTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKwkJCXsKKwkgICAgICAgICAgICAvLyBBcHBlbmQgVmFyaWFibGUgSUUKKwkgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5SZXFWYXJJRXMgKyBWYXJJZXNPZmZzZXQsICZSU05JZSwgMSk7CisJICAgICAgICAgICAgVmFySWVzT2Zmc2V0ICs9IDE7CisJICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuUmVxVmFySUVzICsgVmFySWVzT2Zmc2V0LCAmcEFkLT5TdGFDZmcuUlNOSUVfTGVuLCAxKTsKKwkgICAgICAgICAgICBWYXJJZXNPZmZzZXQgKz0gMTsKKwkJCX0KKwkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLlJlcVZhcklFcyArIFZhckllc09mZnNldCwgcEFkLT5TdGFDZmcuUlNOX0lFLCBwQWQtPlN0YUNmZy5SU05JRV9MZW4pOworCQkJVmFySWVzT2Zmc2V0ICs9IHBBZC0+U3RhQ2ZnLlJTTklFX0xlbjsKKworCQkJLy8gU2V0IFZhcmlhYmxlIElFcyBMZW5ndGgKKwkJCXBBZC0+U3RhQ2ZnLlJlcVZhcklFTGVuID0gVmFySWVzT2Zmc2V0OworCQl9CisKKwkJLy8gV2UgaGF2ZSB1cGRhdGUgdGhhdCBhdCBQZWVyQmVhY29uQXRKb2luUmVxdWVzdCgpCisJCUNraXBGbGFnID0gcEFkLT5TdGFDZmcuQ2tpcEZsYWc7CisJCWlmIChDa2lwRmxhZyAhPSAwKQorCQl7CisJCQlOZGlzWmVyb01lbW9yeShDa2lwTmVnb3RpYXRpb25CdWZmZXIsIENLSVBfTkVHT1RJQVRJT05fTEVOR1RIKTsKKwkJCUNraXBOZWdvdGlhdGlvbkJ1ZmZlclsyXSA9IDB4NjY7CisJCQkvLyBNYWtlIGl0IHRyeSBLUCAmIE1JQywgc2luY2Ugd2UgaGF2ZSB0byBmb2xsb3cgdGhlIHJlc3VsdCBmcm9tIEFzc29jUnNwCisJCQlDa2lwTmVnb3RpYXRpb25CdWZmZXJbOF0gPSAweDE4OworCQkJQ2tpcE5lZ290aWF0aW9uQnVmZmVyW0NLSVBfTkVHT1RJQVRJT05fTEVOR1RIIC0gMV0gPSAweDIyOworCQkJQ2tpcEZsYWcgPSAweDE4OworCisJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sIAkmdG1wLAorCQkJCQkJMSwJCQkJCQkgIAkJJkFpcm9uZXRDa2lwSWUsCisJCQkJCQkxLAkJCQkJCSAgCQkmQWlyb25ldENraXBMZW4sCisJCQkJCQlBaXJvbmV0Q2tpcExlbiwgCQkgIAkJQ2tpcE5lZ290aWF0aW9uQnVmZmVyLAorCQkJCQkJRU5EX09GX0FSR1MpOworCQkJRnJhbWVMZW4gKz0gdG1wOworCQl9CisKKwkJLy8gQWRkIENDWCB2MiByZXF1ZXN0IGlmIENDWDIgYWRtaW4gc3RhdGUgaXMgb24KKwkJaWYgKHBBZC0+U3RhQ2ZnLkNDWENvbnRyb2wuZmllbGQuRW5hYmxlID09IDEpCisJCXsKKworCQkJLy8KKwkJCS8vIEFkZCBBaXJvbmV0SVBBZGRyZXNzSUUgZm9yIENpc2NvIENDWCAyLlgKKwkJCS8vIEFkZCBDQ1ggVmVyc2lvbgorCQkJLy8KKwkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwgJnRtcCwKKwkJCQkJCTEsCQkJCQkJCSZBaXJvbmV0SVBBZGRyZXNzSUUsCisJCQkJCQkxLAkJCQkJCQkmQWlyb25ldElQQWRkcmVzc0xlbiwKKwkJCQkJCUFpcm9uZXRJUEFkZHJlc3NMZW4sCQlBaXJvbmV0SVBBZGRyZXNzQnVmZmVyLAorCQkJCQkJMSwJCQkJCQkJJkNjeDJJZSwKKwkJCQkJCTEsCQkJCQkJCSZDY3gyTGVuLAorCQkJCQkJQ2N4MkxlbiwJCQkJICAgIENjeDJJZUluZm8sCisJCQkJCQlFTkRfT0ZfQVJHUyk7CisJCQlGcmFtZUxlbiArPSB0bXA7CisKKwkJCS8vCisJCQkvLyBBZGQgQ2lwaGVyU3VpdGUgQ0NLTSBvciBMZWFwVGtpcCBpZiBzZXR0aW5nLgorCQkJLy8KKyNpZmRlZiBMRUFQX1NVUFBPUlQKKwkJCWlmIChMRUFQX0NDS01fT04ocEFkKSkKKwkJCXsKKwkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sCSZ0bXAsCisJCQkJCQlDaXBoZXJTdWl0ZUNpc2NvQ0NLTUxlbiwJCUNpcGhlclN1aXRlQ2lzY29DQ0tNLAorCQkJCQkJRU5EX09GX0FSR1MpOworCQkJCUZyYW1lTGVuICs9IHRtcDsKKworCQkJCS8vIFRoaXJkIGFkZCBSU04KKwkJCQlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5SZXFWYXJJRXMgKyBWYXJJZXNPZmZzZXQsIENpcGhlclN1aXRlQ2lzY29DQ0tNLCBDaXBoZXJTdWl0ZUNpc2NvQ0NLTUxlbik7IC8vU2F2ZSBDaXBoZXJTdWl0ZQorCQkJCVZhckllc09mZnNldCArPSBDaXBoZXJTdWl0ZUNpc2NvQ0NLTUxlbjsKKwkJCX0KKwkJCWVsc2UgaWYgKChwQWQtPlN0YUNmZy5MZWFwQXV0aE1vZGUgPT0gQ0lTQ09fQXV0aE1vZGVMRUFQKSAmJiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpKQorCQkJeworCQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwgJnRtcCwKKwkJCQkJCUNpcGhlclN1aXRlQ0NYVGtpcExlbiwJICAgIENpcGhlclN1aXRlQ0NYVGtpcCwKKwkJCQkJCUVORF9PRl9BUkdTKTsKKwkJCQlGcmFtZUxlbiArPSB0bXA7CisKKwkJCQkvLyBUaGlyZCBhZGQgUlNOCisJCQkJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuUmVxVmFySUVzICsgVmFySWVzT2Zmc2V0LCBDaXBoZXJTdWl0ZUNDWFRraXAsIENpcGhlclN1aXRlQ0NYVGtpcExlbik7CisJCQkJVmFySWVzT2Zmc2V0ICs9IENpcGhlclN1aXRlQ0NYVGtpcExlbjsKKwkJCX0KKyNlbmRpZiAvLyBMRUFQX1NVUFBPUlQgLy8KKworCQkJLy8gQWRkIGJ5IEphbWVzIDAzLzA2LzI3CisJCQkvLyBTZXQgVmFyaWFibGUgSUVzIExlbmd0aAorCQkJcEFkLT5TdGFDZmcuUmVxVmFySUVMZW4gPSBWYXJJZXNPZmZzZXQ7CisJCQlwQWQtPlN0YUNmZy5Bc3NvY0luZm8uUmVxdWVzdElFTGVuZ3RoID0gVmFySWVzT2Zmc2V0OworCisJCQkvLyBPZmZzZXRSZXNwb25zZUlFcyBmb2xsb3cgUmVxVmFySUUKKwkJCXBBZC0+U3RhQ2ZnLkFzc29jSW5mby5PZmZzZXRSZXNwb25zZUlFcyA9IHNpemVvZihORElTXzgwMl8xMV9BU1NPQ0lBVElPTl9JTkZPUk1BVElPTikgKyBwQWQtPlN0YUNmZy5SZXFWYXJJRUxlbjsKKwkJCS8vIEVuZCBBZGQgYnkgSmFtZXMKKwkJfQorCisKKwkJTWluaXBvcnRNTVJlcXVlc3QocEFkLCAwLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7CisJCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7CisKKwkJUlRNUFNldFRpbWVyKCZwQWQtPk1sbWVBdXguQXNzb2NUaW1lciwgVGltZW91dCk7CisJCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlID0gQVNTT0NfV0FJVF9SU1A7CisJfQorCWVsc2UKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQVNTT0MgLSBNbG1lQXNzb2NSZXFBY3Rpb24oKSBzYW5pdHkgY2hlY2sgZmFpbGVkLiBCVUchISEhISEgXG4iKSk7CisJCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlID0gQVNTT0NfSURMRTsKKwkJU3RhdHVzID0gTUxNRV9JTlZBTElEX0ZPUk1BVDsKKwkJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX0FTU09DX0NPTkYsIDIsICZTdGF0dXMpOworCX0KKworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCW1sbWUgcmVhc3NvYyByZXEgaGFuZGxpbmcgcHJvY2VkdXJlCisJUGFyYW1ldGVyczoKKwkJRWxlbSAtCisJUHJlOgorCQktIyBTU0lEICAoQWRhcHRlci0+U3RhQ2ZnLnNzaWRbXSkKKwkJLSMgQlNTSUQgKEFQIGFkZHJlc3MsIEFkYXB0ZXItPlN0YUNmZy5ic3NpZCkKKwkJLSMgU3VwcG9ydGVkIHJhdGVzIChBZGFwdGVyLT5TdGFDZmcuc3VwcG9ydGVkX3JhdGVzW10pCisJCS0jIFN1cHBvcnRlZCByYXRlcyBsZW5ndGggKEFkYXB0ZXItPlN0YUNmZy5zdXBwb3J0ZWRfcmF0ZXNfbGVuKQorCQktIyBUeCBwb3dlciAoQWRhcHRlci0+U3RhQ2ZnLnR4X3Bvd2VyKQorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIE1sbWVSZWFzc29jUmVxQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlVQ0hBUgkJCUFwQWRkcls2XTsKKwlIRUFERVJfODAyXzExCVJlYXNzb2NIZHI7CisJVUNIQVIJCQlDY3gyTGVuID0gNTsKKwlVQ0hBUgkJCVdtZUllWzldID0ge0lFX1ZFTkRPUl9TUEVDSUZJQywgMHgwNywgMHgwMCwgMHg1MCwgMHhmMiwgMHgwMiwgMHgwMCwgMHgwMSwgMHgwMH07CisJVVNIT1JUCQkJQ2FwYWJpbGl0eUluZm8sIExpc3RlbkludHY7CisJVUxPTkcJCQlUaW1lb3V0OworCVVMT05HCQkJRnJhbWVMZW4gPSAwOworCUJPT0xFQU4JCQlUaW1lckNhbmNlbGxlZDsKKwlORElTX1NUQVRVUwkJTlN0YXR1czsKKwlVTE9ORwkJCXRtcDsKKwlQVUNIQVIJCQlwT3V0QnVmZmVyID0gTlVMTDsKKy8vQ0NYIDIuWAorI2lmZGVmIExFQVBfU1VQUE9SVAorCVVDSEFSCQkJQ2tpcEZsYWc7CisJVUNIQVIJCQlDa2lwTmVnb3RpYXRpb25CdWZmZXJbQ0tJUF9ORUdPVElBVElPTl9MRU5HVEhdOworCVVDSEFSCQkJQWlyb25ldENraXBJZSA9IElFX0FJUk9ORVRfQ0tJUDsKKwlVQ0hBUgkJCUFpcm9uZXRDa2lwTGVuID0gQ0tJUF9ORUdPVElBVElPTl9MRU5HVEg7CisJVUNIQVIJCQlBaXJvbmV0SVBBZGRyZXNzSUUgPSBJRV9BSVJPTkVUX0lQQUREUkVTUzsKKwlVQ0hBUgkJCUFpcm9uZXRJUEFkZHJlc3NMZW4gPSBBSVJPTkVUX0lQQUREUkVTU19MRU5HVEg7CisJVUNIQVIJCQlBaXJvbmV0SVBBZGRyZXNzQnVmZmVyW0FJUk9ORVRfSVBBRERSRVNTX0xFTkdUSF0gPSB7MHgwMCwgMHg0MCwgMHg5NiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMiwgMHgwMH07CisJVUNIQVIJCQlBaXJvbmV0Q0NLTVJlYXNzb2NJRSA9IElFX0FJUk9ORVRfQ0NLTVJFQVNTT0M7CisJVUNIQVIJCQlBaXJvbmV0Q0NLTVJlYXNzb2NMZW4gPSBBSVJPTkVUX0NDS01SRUFTU09DX0xFTkdUSDsKKwlVQ0hBUgkJCUFpcm9uZXRDQ0tNUmVhc3NvY0J1ZmZlcltBSVJPTkVUX0NDS01SRUFTU09DX0xFTkdUSF07CisJVUNIQVIJCQlBaXJvbmV0T1VJW10gPSB7MHgwMCwgMHg0MCwgMHg5NiwgMHgwMH07CisJVUNIQVIJCQlNSUNNTlsxNl07CisJVUNIQVIJCQlDYWxjTWljQnVmZmVyWzgwXTsKKwlVTE9ORwkJCUNhbGNNaWNCdWZmZXJMZW4gPSAwOworI2VuZGlmIC8vIExFQVBfU1VQUE9SVCAvLworCVVTSE9SVAkJCVN0YXR1czsKKworCS8vIEJsb2NrIGFsbCBhdXRoZW50aWNhdGlvbiByZXF1ZXN0IGR1cm5pbmcgV1BBIGJsb2NrIHBlcmlvZAorCWlmIChwQWQtPlN0YUNmZy5iQmxvY2tBc3NvYyA9PSBUUlVFKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVNTT0MgLSBCbG9jayBSZUFzc29jIHJlcXVlc3QgZHVybmluZyBXUEEgYmxvY2sgcGVyaW9kIVxuIikpOworCQlwQWQtPk1sbWUuQXNzb2NNYWNoaW5lLkN1cnJTdGF0ZSA9IEFTU09DX0lETEU7CisJCVN0YXR1cyA9IE1MTUVfU1RBVEVfTUFDSElORV9SRUpFQ1Q7CisJCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9SRUFTU09DX0NPTkYsIDIsICZTdGF0dXMpOworCX0KKwkvLyB0aGUgcGFyYW1ldGVycyBhcmUgdGhlIHNhbWUgYXMgdGhlIGFzc29jaWF0aW9uCisJZWxzZSBpZihNbG1lQXNzb2NSZXFTYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbiwgQXBBZGRyLCAmQ2FwYWJpbGl0eUluZm8sICZUaW1lb3V0LCAmTGlzdGVuSW50dikpCisJeworCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5SZWFzc29jVGltZXIsICZUaW1lckNhbmNlbGxlZCk7CisKKwkJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKKwkJaWYoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCQl7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkFTU09DIC0gTWxtZVJlYXNzb2NSZXFBY3Rpb24oKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkIFxuIikpOworCQkJcEFkLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUgPSBBU1NPQ19JRExFOworCQkJU3RhdHVzID0gTUxNRV9GQUlMX05PX1JFU09VUkNFOworCQkJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX1JFQVNTT0NfQ09ORiwgMiwgJlN0YXR1cyk7CisJCQlyZXR1cm47CisJCX0KKworCQlDT1BZX01BQ19BRERSKHBBZC0+TWxtZUF1eC5Cc3NpZCwgQXBBZGRyKTsKKworCQkvLyBtYWtlIGZyYW1lLCB1c2UgYnNzaWQgYXMgdGhlIEFQIGFkZHJlc3M/PworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBU1NPQyAtIFNlbmQgUkUtQVNTT0MgcmVxdWVzdC4uLlxuIikpOworCQlNZ3RNYWNIZWFkZXJJbml0KHBBZCwgJlJlYXNzb2NIZHIsIFNVQlRZUEVfUkVBU1NPQ19SRVEsIDAsIEFwQWRkciwgQXBBZGRyKTsKKwkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICAgICAgICAmRnJhbWVMZW4sCisJCQkJCQkgIHNpemVvZihIRUFERVJfODAyXzExKSwgICAgJlJlYXNzb2NIZHIsCisJCQkJCQkgIDIsICAgICAgICAgICAgICAgICAgICAgICAgJkNhcGFiaWxpdHlJbmZvLAorCQkJCQkJICAyLCAgICAgICAgICAgICAgICAgICAgICAgICZMaXN0ZW5JbnR2LAorCQkJCQkJICBNQUNfQUREUl9MRU4sICAgICAgICAgICAgIEFwQWRkciwKKwkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAmU3NpZEllLAorCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICZwQWQtPk1sbWVBdXguU3NpZExlbiwKKwkJCQkJCSAgcEFkLT5NbG1lQXV4LlNzaWRMZW4sICAgICBwQWQtPk1sbWVBdXguU3NpZCwKKwkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAmU3VwUmF0ZUllLAorCQkJCQkJICAxLAkJCQkJCSZwQWQtPk1sbWVBdXguU3VwUmF0ZUxlbiwKKwkJCQkJCSAgcEFkLT5NbG1lQXV4LlN1cFJhdGVMZW4sICBwQWQtPk1sbWVBdXguU3VwUmF0ZSwKKwkJCQkJCSAgRU5EX09GX0FSR1MpOworCisJCWlmIChwQWQtPk1sbWVBdXguRXh0UmF0ZUxlbiAhPSAwKQorCQl7CisJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sICAgICAgICAmdG1wLAorCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkV4dFJhdGVJZSwKKwkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQWQtPk1sbWVBdXguRXh0UmF0ZUxlbiwKKwkJCQkJCQkgIHBBZC0+TWxtZUF1eC5FeHRSYXRlTGVuLAkgICAgcEFkLT5NbG1lQXV4LkV4dFJhdGUsCisJCQkJCQkJICBFTkRfT0ZfQVJHUyk7CisJCQlGcmFtZUxlbiArPSB0bXA7CisJCX0KKworCQlpZiAocEFkLT5NbG1lQXV4LkFQRWRjYVBhcm0uYlZhbGlkKQorCQl7CisJCQlpZiAocEFkLT5Db21tb25DZmcuYkFQU0RDYXBhYmxlICYmIHBBZC0+TWxtZUF1eC5BUEVkY2FQYXJtLmJBUFNEQ2FwYWJsZSkKKwkJCXsKKwkJCQlRQlNTX1NUQV9JTkZPX1BBUk0gUW9zSW5mbzsKKworCQkJCU5kaXNaZXJvTWVtb3J5KCZRb3NJbmZvLCBzaXplb2YoUUJTU19TVEFfSU5GT19QQVJNKSk7CisJCQkJUW9zSW5mby5VQVBTRF9BQ19CRSA9IHBBZC0+Q29tbW9uQ2ZnLmJBUFNEQUNfQkU7CisJCQkJUW9zSW5mby5VQVBTRF9BQ19CSyA9IHBBZC0+Q29tbW9uQ2ZnLmJBUFNEQUNfQks7CisJCQkJUW9zSW5mby5VQVBTRF9BQ19WSSA9IHBBZC0+Q29tbW9uQ2ZnLmJBUFNEQUNfVkk7CisJCQkJUW9zSW5mby5VQVBTRF9BQ19WTyA9IHBBZC0+Q29tbW9uQ2ZnLmJBUFNEQUNfVk87CisJCQkJUW9zSW5mby5NYXhTUExlbmd0aCA9IHBBZC0+Q29tbW9uQ2ZnLk1heFNQTGVuZ3RoOworCQkJCVdtZUllWzhdIHw9ICooUFVDSEFSKSZRb3NJbmZvOworCQkJfQorCisJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sICAgICZ0bXAsCisJCQkJCQkJICA5LCAgICAgICAgICAgICAgICAgICAgICAgICZXbWVJZVswXSwKKwkJCQkJCQkgIEVORF9PRl9BUkdTKTsKKwkJCUZyYW1lTGVuICs9IHRtcDsKKwkJfQorCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCS8vIEhUCisJCWlmICgocEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eUxlbiA+IDApICYmIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID49IFBIWV8xMUFCR05fTUlYRUQpKQorCQl7CisJCQlVTE9ORyBUbXBMZW47CisJCQlVQ0hBUiBIdExlbjsKKwkJCVVDSEFSIEJST0FEQ09NWzRdID0gezB4MCwgMHg5MCwgMHg0YywgMHgzM307CisJCQlpZiAocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5iUHJlTkh0ID09IFRSVUUpCisJCQl7CisJCQkJSHRMZW4gPSBTSVpFX0hUX0NBUF9JRSArIDQ7CisJCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAgICAgICAgICAgICZUbXBMZW4sCisJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJldwYUllLAorCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZIdExlbiwKKwkJCQkJCQkgIDQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQlJPQURDT01bMF0sCisJCQkJCQkJIHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHlMZW4sICAgICAgICAgICZwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5LAorCQkJCQkJCSAgRU5EX09GX0FSR1MpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwgICAgICAgICAgICAmVG1wTGVuLAorCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZIdENhcEllLAorCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5TGVuLAorCQkJCQkJCSBwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5TGVuLCAgICAgICAgICAmcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eSwKKwkJCQkJCQkgIEVORF9PRl9BUkdTKTsKKwkJCX0KKwkJCUZyYW1lTGVuICs9IFRtcExlbjsKKwkJfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJCS8vIGFkZCBSYWxpbmsgcHJvcHJpZXRhcnkgSUUgdG8gaW5mb3JtIEFQIHRoaXMgU1RBIGlzIGdvaW5nIHRvIHVzZSBBR0dSRUdBVElPTiBvciBQSUdHWS1CQUNLK0FHR1JFR0FUSU9OCisJCS8vIENhc2UgSTogKEFnZ3JlZ2F0aW9uICsgUGlnZ3ktQmFjaykKKwkJLy8gMS4gdXNlciBlbmFibGUgYWdncmVnYXRpb24sIEFORAorCQkvLyAyLiBNYWMgc3VwcG9ydCBwaWdneS1iYWNrCisJCS8vIDMuIEFQIGFubm91Y2VzIGl0J3MgUElHR1ktQkFDSytBR0dSRUdBVElPTi1jYXBhYmxlIGluIEJFQUNPTgorCQkvLyBDYXNlIElJOiAoQWdncmVnYXRpb24pCisJCS8vIDEuIHVzZXIgZW5hYmxlIGFnZ3JlZ2F0aW9uLCBBTkQKKwkJLy8gMi4gQVAgYW5ub3VjZXMgaXQncyBBR0dSRUdBVElPTi1jYXBhYmxlIGluIEJFQUNPTgorCQlpZiAocEFkLT5Db21tb25DZmcuYkFnZ3JlZ2F0aW9uQ2FwYWJsZSkKKwkJeworCQkJaWYgKChwQWQtPkNvbW1vbkNmZy5iUGlnZ3lCYWNrQ2FwYWJsZSkgJiYgKChwQWQtPk1sbWVBdXguQVBSYWxpbmtJZSAmIDB4MDAwMDAwMDMpID09IDMpKQorCQkJeworCQkJCVVMT05HIFRtcExlbjsKKwkJCQlVQ0hBUiBSYWxpbmtJZVs5XSA9IHtJRV9WRU5ET1JfU1BFQ0lGSUMsIDcsIDB4MDAsIDB4MGMsIDB4NDMsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDB9OworCQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIrRnJhbWVMZW4sICAgICAgICAgICAmVG1wTGVuLAorCQkJCQkJCQkgIDksICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSYWxpbmtJZSwKKwkJCQkJCQkJICBFTkRfT0ZfQVJHUyk7CisJCQkJRnJhbWVMZW4gKz0gVG1wTGVuOworCQkJfQorCQkJZWxzZSBpZiAocEFkLT5NbG1lQXV4LkFQUmFsaW5rSWUgJiAweDAwMDAwMDAxKQorCQkJeworCQkJCVVMT05HIFRtcExlbjsKKwkJCQlVQ0hBUiBSYWxpbmtJZVs5XSA9IHtJRV9WRU5ET1JfU1BFQ0lGSUMsIDcsIDB4MDAsIDB4MGMsIDB4NDMsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDB9OworCQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIrRnJhbWVMZW4sICAgICAgICAgICAmVG1wTGVuLAorCQkJCQkJCQkgIDksICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSYWxpbmtJZSwKKwkJCQkJCQkJICBFTkRfT0ZfQVJHUyk7CisJCQkJRnJhbWVMZW4gKz0gVG1wTGVuOworCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJVUxPTkcgVG1wTGVuOworCQkJVUNIQVIgUmFsaW5rSWVbOV0gPSB7SUVfVkVORE9SX1NQRUNJRklDLCA3LCAweDAwLCAweDBjLCAweDQzLCAweDA0LCAweDAwLCAweDAwLCAweDAwfTsKKwkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIrRnJhbWVMZW4sCQkgJlRtcExlbiwKKwkJCQkJCQkgIDksCQkJCQkJIFJhbGlua0llLAorCQkJCQkJCSAgRU5EX09GX0FSR1MpOworCQkJRnJhbWVMZW4gKz0gVG1wTGVuOworCQl9CisjaWZkZWYgTEVBUF9TVVBQT1JUCisJCWlmIChMRUFQX0NDS01fT04ocEFkKSAmJiAocEFkLT5TdGFDZmcuQ0NLTUxpbmtVcEZsYWcgPT0gVFJVRSkpCisJCXsKKwkJCUNraXBGbGFnID0gcEFkLT5TdGFDZmcuQ2tpcEZsYWc7CS8vIFdlIGhhdmUgdXBkYXRlIHRoYXQgYXQgUGVlckJlYWNvbkF0Sm9pblJlcXVlc3QoKQorCQkJaWYgKENraXBGbGFnICE9IDApCisJCQl7CisJCQkJTmRpc1plcm9NZW1vcnkoQ2tpcE5lZ290aWF0aW9uQnVmZmVyLCBDS0lQX05FR09USUFUSU9OX0xFTkdUSCk7CisJCQkJQ2tpcE5lZ290aWF0aW9uQnVmZmVyWzJdID0gMHg2NjsKKwkJCQkvLyBNYWtlIGl0IHRyeSBLUCAmIE1JQywgc2luY2Ugd2UgaGF2ZSB0byBmb2xsb3cgdGhlIHJlc3VsdCBmcm9tIEFzc29jUnNwCisJCQkJQ2tpcE5lZ290aWF0aW9uQnVmZmVyWzhdID0gMHgxODsKKwkJCQlDa2lwTmVnb3RpYXRpb25CdWZmZXJbQ0tJUF9ORUdPVElBVElPTl9MRU5HVEggLSAxXSA9IDB4MjI7CisKKwkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sICAgICAgICAgICAgJnRtcCwKKwkJCQkJCQkJCTEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkFpcm9uZXRDa2lwSWUsCisJCQkJCQkJCQkxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZBaXJvbmV0Q2tpcExlbiwKKwkJCQkJCQkJCUFpcm9uZXRDa2lwTGVuLCAgICAgICAgICAgICAgICAgQ2tpcE5lZ290aWF0aW9uQnVmZmVyLAorCQkJCQkJCQkJRU5EX09GX0FSR1MpOworCQkJCUZyYW1lTGVuICs9IHRtcDsKKwkJCX0KKworCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAmdG1wLAorCQkJCQkJCTEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkFpcm9uZXRJUEFkZHJlc3NJRSwKKwkJCQkJCQkxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZBaXJvbmV0SVBBZGRyZXNzTGVuLAorCQkJCQkJCUFpcm9uZXRJUEFkZHJlc3NMZW4sICAgICAgICAgICAgQWlyb25ldElQQWRkcmVzc0J1ZmZlciwKKwkJCQkJCQlFTkRfT0ZfQVJHUyk7CisJCQlGcmFtZUxlbiArPSB0bXA7CisKKwkJCS8vCisJCQkvLyBUaGUgUk4gaXMgaW5jcmVtZW50ZWQgYmVmb3JlIGVhY2ggcmVhc3NvY2lhdGlvbiByZXF1ZXN0LgorCQkJLy8KKwkJCXBBZC0+U3RhQ2ZnLkNDS01STisrOworCQkJLy8KKwkJCS8vIENhbGN1bGF0ZSBNSUMgPSBobWFjLW1kNShrcmssIFNUQS1JRHxCU1NJRHxSU05JRXxUU0Z8Uk4pOworCQkJLy8KKwkJCUNPUFlfTUFDX0FERFIoQ2FsY01pY0J1ZmZlciwgcEFkLT5DdXJyZW50QWRkcmVzcyk7CisJCQlDYWxjTWljQnVmZmVyTGVuID0gTUFDX0FERFJfTEVOOworCQkJQ09QWV9NQUNfQUREUihDYWxjTWljQnVmZmVyICsgQ2FsY01pY0J1ZmZlckxlbiwgcEFkLT5NbG1lQXV4LkJzc2lkKTsKKwkJCUNhbGNNaWNCdWZmZXJMZW4gKz0gTUFDX0FERFJfTEVOOworCQkJTmRpc01vdmVNZW1vcnkoQ2FsY01pY0J1ZmZlciArIENhbGNNaWNCdWZmZXJMZW4sIENpcGhlclN1aXRlQ2lzY29DQ0tNLCBDaXBoZXJTdWl0ZUNpc2NvQ0NLTUxlbik7CisJCQlDYWxjTWljQnVmZmVyTGVuICs9IENpcGhlclN1aXRlQ2lzY29DQ0tNTGVuOworCQkJTmRpc01vdmVNZW1vcnkoQ2FsY01pY0J1ZmZlciArIENhbGNNaWNCdWZmZXJMZW4sIChQVUNIQVIpICZwQWQtPlN0YUNmZy5DQ0tNQmVhY29uQXRKb2luVGltZVN0YW1wLCBzaXplb2YocEFkLT5TdGFDZmcuQ0NLTUJlYWNvbkF0Sm9pblRpbWVTdGFtcCkpOworCQkJQ2FsY01pY0J1ZmZlckxlbiArPSBzaXplb2YocEFkLT5TdGFDZmcuQ0NLTUJlYWNvbkF0Sm9pblRpbWVTdGFtcCk7CisJCQlOZGlzTW92ZU1lbW9yeShDYWxjTWljQnVmZmVyICsgQ2FsY01pY0J1ZmZlckxlbiwgKFBVQ0hBUikmcEFkLT5TdGFDZmcuQ0NLTVJOLCBzaXplb2YocEFkLT5TdGFDZmcuQ0NLTVJOKSk7CisJCQlDYWxjTWljQnVmZmVyTGVuICs9IHNpemVvZihwQWQtPlN0YUNmZy5DQ0tNUk4pOworCQkJaG1hY19tZDUocEFkLT5TdGFDZmcuS1JLLCBMRU5fRUFQX01JQ0ssIENhbGNNaWNCdWZmZXIsIENhbGNNaWNCdWZmZXJMZW4sIE1JQ01OKTsKKworCQkJLy8KKwkJCS8vIGZpbGwgdXAgQ0NLTSByZWFzc29jaWF0aW9uIHJlcXVlc3QgZWxlbWVudAorCQkJLy8KKwkJCU5kaXNNb3ZlTWVtb3J5KEFpcm9uZXRDQ0tNUmVhc3NvY0J1ZmZlciwgQWlyb25ldE9VSSwgNCk7CisJCQlOZGlzTW92ZU1lbW9yeShBaXJvbmV0Q0NLTVJlYXNzb2NCdWZmZXIgKyA0LCAoUFVDSEFSKSZwQWQtPlN0YUNmZy5DQ0tNQmVhY29uQXRKb2luVGltZVN0YW1wLCA4KTsKKwkJCU5kaXNNb3ZlTWVtb3J5KEFpcm9uZXRDQ0tNUmVhc3NvY0J1ZmZlciArIDEyLCAoUFVDSEFSKSAmcEFkLT5TdGFDZmcuQ0NLTVJOLCA0KTsKKwkJCU5kaXNNb3ZlTWVtb3J5KEFpcm9uZXRDQ0tNUmVhc3NvY0J1ZmZlciArMTYsIE1JQ01OLCA4KTsKKworCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAmdG1wLAorCQkJCQkJCTEsICAgICAgICAgICAgICAgICAgICAgICZBaXJvbmV0Q0NLTVJlYXNzb2NJRSwKKwkJCQkJCQkxLCAgICAgICAgICAgICAgICAgICAgICAmQWlyb25ldENDS01SZWFzc29jTGVuLAorCQkJCQkJCUFpcm9uZXRDQ0tNUmVhc3NvY0xlbiwgIEFpcm9uZXRDQ0tNUmVhc3NvY0J1ZmZlciwKKwkJCQkJCQlFTkRfT0ZfQVJHUyk7CisJCQlGcmFtZUxlbiArPSB0bXA7CisKKwkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwgJnRtcCwKKwkJCQkJCQlDaXBoZXJTdWl0ZUNpc2NvQ0NLTUxlbixDaXBoZXJTdWl0ZUNpc2NvQ0NLTSwKKwkJCQkJCQlFTkRfT0ZfQVJHUyk7CisJCQlGcmFtZUxlbiArPSB0bXA7CisJCX0KKyNlbmRpZiAvLyBMRUFQX1NVUFBPUlQgLy8KKworCQkvLyBBZGQgQ0NYIHYyIHJlcXVlc3QgaWYgQ0NYMiBhZG1pbiBzdGF0ZSBpcyBvbgorCQlpZiAocEFkLT5TdGFDZmcuQ0NYQ29udHJvbC5maWVsZC5FbmFibGUgPT0gMSkKKwkJeworCQkJLy8KKwkJCS8vIEFkZCBDQ1ggVmVyc2lvbgorCQkJLy8KKwkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwgJnRtcCwKKwkJCQkJCTEsCQkJCQkJCSZDY3gySWUsCisJCQkJCQkxLAkJCQkJCQkmQ2N4MkxlbiwKKwkJCQkJCUNjeDJMZW4sCQkJCSAgICBDY3gySWVJbmZvLAorCQkJCQkJRU5EX09GX0FSR1MpOworCQkJRnJhbWVMZW4gKz0gdG1wOworCQl9CisKKwkJTWluaXBvcnRNTVJlcXVlc3QocEFkLCAwLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7CisJCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7CisKKwkJUlRNUFNldFRpbWVyKCZwQWQtPk1sbWVBdXguUmVhc3NvY1RpbWVyLCBUaW1lb3V0KTsgLyogaW4gbVNlYyAqLworCQlwQWQtPk1sbWUuQXNzb2NNYWNoaW5lLkN1cnJTdGF0ZSA9IFJFQVNTT0NfV0FJVF9SU1A7CisJfQorCWVsc2UKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQVNTT0MgLSBNbG1lUmVhc3NvY1JlcUFjdGlvbigpIHNhbml0eSBjaGVjayBmYWlsZWQuIEJVRyEhISEgXG4iKSk7CisJCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlID0gQVNTT0NfSURMRTsKKwkJU3RhdHVzID0gTUxNRV9JTlZBTElEX0ZPUk1BVDsKKwkJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX1JFQVNTT0NfQ09ORiwgMiwgJlN0YXR1cyk7CisJfQorfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVVwcGVyIGxheWVyIGlzc3VlcyBkaXNhc3NvYyByZXF1ZXN0CisJUGFyYW1ldGVyczoKKwkJRWxlbSAtCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBNbG1lRGlzYXNzb2NSZXFBY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCVBNTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1QgcERpc2Fzc29jUmVxOworCUhFQURFUl84MDJfMTEgICAgICAgICBEaXNhc3NvY0hkcjsKKwlQSEVBREVSXzgwMl8xMSAgICAgICAgcERpc2Fzc29jSGRyOworCVBVQ0hBUiAgICAgICAgICAgICAgICBwT3V0QnVmZmVyID0gTlVMTDsKKwlVTE9ORyAgICAgICAgICAgICAgICAgRnJhbWVMZW4gPSAwOworCU5ESVNfU1RBVFVTICAgICAgICAgICBOU3RhdHVzOworCUJPT0xFQU4gICAgICAgICAgICAgICBUaW1lckNhbmNlbGxlZDsKKwlVTE9ORyAgICAgICAgICAgICAgICAgVGltZW91dCA9IDA7CisJVVNIT1JUICAgICAgICAgICAgICAgIFN0YXR1czsKKworI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCS8vIHNlbmQgRExTLVRFQVJfRE9XTiBtZXNzYWdlLAorCWlmIChwQWQtPkNvbW1vbkNmZy5iRExTQ2FwYWJsZSkKKwl7CisJCVVDSEFSIGk7CisKKwkJLy8gdGVhciBkb3duIGxvY2FsIGRscyB0YWJsZSBlbnRyeQorCQlmb3IgKGk9MDsgaTxNQVhfTlVNX09GX0lOSVRfRExTX0VOVFJZOyBpKyspCisJCXsKKwkJCWlmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZCAmJiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID09IERMU19GSU5JU0gpKQorCQkJeworCQkJCVJUTVBTZW5kRExTVGVhckRvd25GcmFtZShwQWQsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpOworCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cwk9IERMU19OT05FOworCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkCT0gRkFMU0U7CisJCQl9CisJCX0KKworCQkvLyB0ZWFyIGRvd24gcGVlciBkbHMgdGFibGUgZW50cnkKKwkJZm9yIChpPU1BWF9OVU1fT0ZfSU5JVF9ETFNfRU5UUlk7IGk8TUFYX05VTV9PRl9ETFNfRU5UUlk7IGkrKykKKwkJeworCQkJaWYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkICYmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPT0gRExTX0ZJTklTSCkpCisJCQl7CisJCQkJUlRNUFNlbmRETFNUZWFyRG93bkZyYW1lKHBBZCwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcik7CisJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID0gRExTX05PTkU7CisJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQJPSBGQUxTRTsKKwkJCX0KKwkJfQorCX0KKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKworCS8vIHNraXAgc2FuaXR5IGNoZWNrCisJcERpc2Fzc29jUmVxID0gKFBNTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1QpKEVsZW0tPk1zZyk7CisKKwlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOyAgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQorCWlmIChOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBU1NPQyAtIE1sbWVEaXNhc3NvY1JlcUFjdGlvbigpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWRcbiIpKTsKKwkJcEFkLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUgPSBBU1NPQ19JRExFOworCQlTdGF0dXMgPSBNTE1FX0ZBSUxfTk9fUkVTT1VSQ0U7CisJCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9ESVNBU1NPQ19DT05GLCAyLCAmU3RhdHVzKTsKKwkJcmV0dXJuOworCX0KKworCisKKwlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5EaXNhc3NvY1RpbWVyLCAmVGltZXJDYW5jZWxsZWQpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVNTT0MgLSBTZW5kIERJU0FTU09DIHJlcXVlc3RbQlNTSUQ6OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IChSZWFzb249JWQpXG4iLAorCQkJCXBEaXNhc3NvY1JlcS0+QWRkclswXSwgcERpc2Fzc29jUmVxLT5BZGRyWzFdLCBwRGlzYXNzb2NSZXEtPkFkZHJbMl0sCisJCQkJcERpc2Fzc29jUmVxLT5BZGRyWzNdLCBwRGlzYXNzb2NSZXEtPkFkZHJbNF0sIHBEaXNhc3NvY1JlcS0+QWRkcls1XSwgcERpc2Fzc29jUmVxLT5SZWFzb24pKTsKKwlNZ3RNYWNIZWFkZXJJbml0KHBBZCwgJkRpc2Fzc29jSGRyLCBTVUJUWVBFX0RJU0FTU09DLCAwLCBwRGlzYXNzb2NSZXEtPkFkZHIsIHBEaXNhc3NvY1JlcS0+QWRkcik7CS8vIHBhdGNoIHBlYXAgdHRscyBzd2l0Y2hpbmcgaXNzdWUKKwlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAgICAgICAgICAgJkZyYW1lTGVuLAorCQkJCQkgIHNpemVvZihIRUFERVJfODAyXzExKSwmRGlzYXNzb2NIZHIsCisJCQkJCSAgMiwgICAgICAgICAgICAgICAgICAgICZwRGlzYXNzb2NSZXEtPlJlYXNvbiwKKwkJCQkJICBFTkRfT0ZfQVJHUyk7CisJTWluaXBvcnRNTVJlcXVlc3QocEFkLCAwLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7CisKKwkvLyBUbyBwYXRjaCBJbnN0YW5jZSBhbmQgQnVmZmFsbyhOKSBBUAorCS8vIERyaXZlciBoYXMgdG8gc2VuZCBkZWF1dGggdG8gSW5zdGFuY2UgQVAsIGJ1dCBCdWZmYWxvKE4pIG5lZWRzIHRvIHNlbmQgZGlzYXNzb2MgdG8gcmVzZXQgQXV0aGVudGljYXRvcidzIHN0YXRlIG1hY2hpbmUKKwkvLyBUaGVyZWZvcmUsIHdlIHNlbmQgYm90aCBvZiB0aGVtLgorCXBEaXNhc3NvY0hkciA9IChQSEVBREVSXzgwMl8xMSlwT3V0QnVmZmVyOworCXBEaXNhc3NvY0hkci0+RkMuU3ViVHlwZSA9IFNVQlRZUEVfREVBVVRIOworCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgMCwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOworCisJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKKworCXBBZC0+U3RhQ2ZnLkRpc2Fzc29jUmVhc29uID0gUkVBU09OX0RJU0FTU09DX1NUQV9MRUFWSU5HOworCUNPUFlfTUFDX0FERFIocEFkLT5TdGFDZmcuRGlzYXNzb2NTdGEsIHBEaXNhc3NvY1JlcS0+QWRkcik7CisKKwlSVE1QU2V0VGltZXIoJnBBZC0+TWxtZUF1eC5EaXNhc3NvY1RpbWVyLCBUaW1lb3V0KTsgLyogaW4gbVNlYyAqLworCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlID0gRElTQVNTT0NfV0FJVF9SU1A7CisKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisjaWZuZGVmIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgaWYgKHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCAhPSBXUEFfU1VQUExJQ0FOVF9ESVNBQkxFKQorCXsKKyAgICAgICAgdW5pb24gaXdyZXFfZGF0YSAgICB3cnF1OworICAgICAgICAvL3NlbmQgZGlzYXNzb2NpYXRlIGV2ZW50IHRvIHdwYV9zdXBwbGljYW50CisgICAgICAgIG1lbXNldCgmd3JxdSwgMCwgc2l6ZW9mKHdycXUpKTsKKyAgICAgICAgd3JxdS5kYXRhLmZsYWdzID0gUlRfRElTQVNTT0NfRVZFTlRfRkxBRzsKKyAgICAgICAgd2lyZWxlc3Nfc2VuZF9ldmVudChwQWQtPm5ldF9kZXYsIElXRVZDVVNUT00sICZ3cnF1LCBOVUxMKTsKKyAgICB9CisjZW5kaWYgLy8gTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisKKyNpZmRlZiBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgIHsKKyAgICAgICAgdW5pb24gaXdyZXFfZGF0YSAgICB3cnF1OworICAgICAgICBtZW1zZXQod3JxdS5hcF9hZGRyLnNhX2RhdGEsIDAsIE1BQ19BRERSX0xFTik7CisgICAgICAgIHdpcmVsZXNzX3NlbmRfZXZlbnQocEFkLT5uZXRfZGV2LCBTSU9DR0lXQVAsICZ3cnF1LCBOVUxMKTsKKyAgICB9CisjZW5kaWYgLy8gTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCXBlZXIgc2VuZHMgYXNzb2MgcnNwIGJhY2sKKwlQYXJhbWV0ZXJzOgorCQlFbG1lIC0gTUxNRSBtZXNzYWdlIGNvbnRhaW5pbmcgdGhlIHJlY2VpdmVkIGZyYW1lCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgUGVlckFzc29jUnNwQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlVU0hPUlQgICAgICAgIENhcGFiaWxpdHlJbmZvLCBTdGF0dXMsIEFpZDsKKwlVQ0hBUiAgICAgICAgIFN1cFJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdLCBTdXBSYXRlTGVuOworCVVDSEFSICAgICAgICAgRXh0UmF0ZVtNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFU10sIEV4dFJhdGVMZW47CisJVUNIQVIgICAgICAgICBBZGRyMltNQUNfQUREUl9MRU5dOworCUJPT0xFQU4gICAgICAgVGltZXJDYW5jZWxsZWQ7CisJVUNIQVIgICAgICAgICBDa2lwRmxhZzsKKwlFRENBX1BBUk0gICAgIEVkY2FQYXJtOworCUhUX0NBUEFCSUxJVFlfSUUJCUh0Q2FwYWJpbGl0eTsKKwlBRERfSFRfSU5GT19JRQkJQWRkSHRJbmZvOwkvLyBBUCBtaWdodCB1c2UgdGhpcyBhZGRpdGlvbmFsIGh0IGluZm8gSUUKKwlVQ0hBUgkJCUh0Q2FwYWJpbGl0eUxlbjsKKwlVQ0hBUgkJCUFkZEh0SW5mb0xlbjsKKwlVQ0hBUgkJCU5ld0V4dENoYW5uZWxPZmZzZXQgPSAweGZmOworCisJaWYgKFBlZXJBc3NvY1JzcFNhbml0eShwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuLCBBZGRyMiwgJkNhcGFiaWxpdHlJbmZvLCAmU3RhdHVzLCAmQWlkLCBTdXBSYXRlLCAmU3VwUmF0ZUxlbiwgRXh0UmF0ZSwgJkV4dFJhdGVMZW4sCisJCSZIdENhcGFiaWxpdHksJkFkZEh0SW5mbywgJkh0Q2FwYWJpbGl0eUxlbiwmQWRkSHRJbmZvTGVuLCZOZXdFeHRDaGFubmVsT2Zmc2V0LCAmRWRjYVBhcm0sICZDa2lwRmxhZykpCisJeworCQkvLyBUaGUgZnJhbWUgaXMgZm9yIG1lID8KKwkJaWYoTUFDX0FERFJfRVFVQUwoQWRkcjIsIHBBZC0+TWxtZUF1eC5Cc3NpZCkpCisJCXsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXJBc3NvY1JzcEFjdGlvbigpOkFTU09DIC0gcmVjZWl2ZSBBU1NPQ19SU1AgdG8gbWUgKHN0YXR1cz0lZClcbiIsIFN0YXR1cykpOworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGVlckFzc29jUnNwQWN0aW9uKCk6TWFjVGFibGUgWyVkXS5BTXNkdVNpemUgPSAlZC4gQ2xpZW50U3RhdHVzRmxhZ3MgPSAweCVseCBcbiIsRWxlbS0+V2NpZCwgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5BTXNkdVNpemUsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQ2xpZW50U3RhdHVzRmxhZ3MpKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LkFzc29jVGltZXIsICZUaW1lckNhbmNlbGxlZCk7CisJCQlpZihTdGF0dXMgPT0gTUxNRV9TVUNDRVNTKQorCQkJeworCQkJCS8vIGdvIHRvIHByb2NlZHVyZSBsaXN0ZWQgb24gcGFnZSAzNzYKKwkJCQlBc3NvY1Bvc3RQcm9jKHBBZCwgQWRkcjIsIENhcGFiaWxpdHlJbmZvLCBBaWQsIFN1cFJhdGUsIFN1cFJhdGVMZW4sIEV4dFJhdGUsIEV4dFJhdGVMZW4sCisJCQkJCSZFZGNhUGFybSwgJkh0Q2FwYWJpbGl0eSwgSHRDYXBhYmlsaXR5TGVuLCAmQWRkSHRJbmZvKTsKKworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyNpZm5kZWYgTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyAgICAgICAgICAgICAgICBpZiAocEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQICE9IFdQQV9TVVBQTElDQU5UX0RJU0FCTEUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB1bmlvbiBpd3JlcV9kYXRhICAgIHdycXU7CisKKyAgICAgICAgICAgICAgICAgICAgU2VuZEFzc29jSUVzVG9XcGFTdXBwbGljYW50KHBBZCk7CisgICAgICAgICAgICAgICAgICAgIG1lbXNldCgmd3JxdSwgMCwgc2l6ZW9mKHdycXUpKTsKKyAgICAgICAgICAgICAgICAgICAgd3JxdS5kYXRhLmZsYWdzID0gUlRfQVNTT0NfRVZFTlRfRkxBRzsKKyAgICAgICAgICAgICAgICAgICAgd2lyZWxlc3Nfc2VuZF9ldmVudChwQWQtPm5ldF9kZXYsIElXRVZDVVNUT00sICZ3cnF1LCBOVUxMKTsKKyAgICAgICAgICAgICAgICB9CisjZW5kaWYgLy8gTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisKKyNpZmRlZiBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdW5pb24gaXdyZXFfZGF0YSAgICB3cnF1OworICAgICAgICAgICAgICAgICAgICB3ZXh0X25vdGlmeV9ldmVudF9hc3NvYyhwQWQpOworCisgICAgICAgICAgICAgICAgICAgIG1lbXNldCh3cnF1LmFwX2FkZHIuc2FfZGF0YSwgMCwgTUFDX0FERFJfTEVOKTsKKyAgICAgICAgICAgICAgICAgICAgbWVtY3B5KHdycXUuYXBfYWRkci5zYV9kYXRhLCBwQWQtPk1sbWVBdXguQnNzaWQsIE1BQ19BRERSX0xFTik7CisgICAgICAgICAgICAgICAgICAgIHdpcmVsZXNzX3NlbmRfZXZlbnQocEFkLT5uZXRfZGV2LCBTSU9DR0lXQVAsICZ3cnF1LCBOVUxMKTsKKworICAgICAgICAgICAgICAgIH0KKyNlbmRpZiAvLyBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCisKKwkJCQlwQWQtPlN0YUNmZy5Da2lwRmxhZyA9IENraXBGbGFnOworCQkJCWlmIChDa2lwRmxhZyAmIDB4MTgpCisJCQkJeworCQkJCQlOZGlzWmVyb01lbW9yeShwQWQtPlN0YUNmZy5UeFNFUSwgNCk7CisJCQkJCU5kaXNaZXJvTWVtb3J5KHBBZC0+U3RhQ2ZnLlJ4U0VRLCA0KTsKKwkJCQkJTmRpc1plcm9NZW1vcnkocEFkLT5TdGFDZmcuQ0tJUE1JQywgNCk7CisJCQkJCXBBZC0+U3RhQ2ZnLkdJVlswXSA9IFJhbmRvbUJ5dGUocEFkKTsKKwkJCQkJcEFkLT5TdGFDZmcuR0lWWzFdID0gUmFuZG9tQnl0ZShwQWQpOworCQkJCQlwQWQtPlN0YUNmZy5HSVZbMl0gPSBSYW5kb21CeXRlKHBBZCk7CisJCQkJCXBBZC0+U3RhQ2ZnLmJDa2lwT24gPSBUUlVFOworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8Q0NYPiBwQWQtPlN0YUNmZy5Da2lwRmxhZyA9IDB4JTAyeFxuIiwgcEFkLT5TdGFDZmcuQ2tpcEZsYWcpKTsKKwkJCQl9CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJLy8gRmFpbGUgb24gQXNzb2NpYXRpb24sIHdlIG5lZWQgdG8gY2hlY2sgdGhlIHN0YXR1cyBjb2RlCisJCQkJLy8gSXMgdGhhdCBhIFJvZ3VlIEFQPworI2lmZGVmIExFQVBfU1VQUE9SVAorCQkJCWlmICgocEFkLT5TdGFDZmcuTGVhcEF1dGhNb2RlID09IENJU0NPX0F1dGhNb2RlTEVBUCkgJiYgKFN0YXR1cyA9PSBNTE1FX0FMR19OT1RfU1VQUE9SVCkpCisJCQkJeyAvL1Bvc3NpYmx5IFJvZ3VlIEFQCisJCQkJCVJvZ3VlQXBUYWJsZVNldEVudHJ5KHBBZCwgJnBBZC0+U3RhQ2ZnLlJvZ3VlQXBUYWIsIHBBZC0+TWxtZUF1eC5Cc3NpZCwgTEVBUF9SRUFTT05fSU5WQUxJRF9BVVRIKTsKKwkJCQl9CisjZW5kaWYgLy8gTEVBUF9TVVBQT1JUIC8vCisJCQl9CisJCQlwQWQtPk1sbWUuQXNzb2NNYWNoaW5lLkN1cnJTdGF0ZSA9IEFTU09DX0lETEU7CisJCQlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfQVNTT0NfQ09ORiwgMiwgJlN0YXR1cyk7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVNTT0MgLSBQZWVyQXNzb2NSc3BBY3Rpb24oKSBzYW5pdHkgY2hlY2sgZmFpbFxuIikpOworCX0KK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlwZWVyIHNlbmRzIHJlYXNzb2MgcnNwCisJUGFyYW1ldHJzOgorCQlFbGVtIC0gTUxNRSBtZXNzYWdlIGNudGFpbmluZyB0aGUgcmVjZWl2ZWQgZnJhbWUKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBQZWVyUmVhc3NvY1JzcEFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisJVVNIT1JUICAgICAgQ2FwYWJpbGl0eUluZm87CisJVVNIT1JUICAgICAgU3RhdHVzOworCVVTSE9SVCAgICAgIEFpZDsKKwlVQ0hBUiAgICAgICBTdXBSYXRlW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXSwgU3VwUmF0ZUxlbjsKKwlVQ0hBUiAgICAgICBFeHRSYXRlW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXSwgRXh0UmF0ZUxlbjsKKwlVQ0hBUiAgICAgICBBZGRyMltNQUNfQUREUl9MRU5dOworCVVDSEFSICAgICAgIENraXBGbGFnOworCUJPT0xFQU4gICAgIFRpbWVyQ2FuY2VsbGVkOworCUVEQ0FfUEFSTSAgIEVkY2FQYXJtOworCUhUX0NBUEFCSUxJVFlfSUUJCUh0Q2FwYWJpbGl0eTsKKwlBRERfSFRfSU5GT19JRQkJQWRkSHRJbmZvOwkvLyBBUCBtaWdodCB1c2UgdGhpcyBhZGRpdGlvbmFsIGh0IGluZm8gSUUKKwlVQ0hBUgkJCUh0Q2FwYWJpbGl0eUxlbjsKKwlVQ0hBUgkJCUFkZEh0SW5mb0xlbjsKKwlVQ0hBUgkJCU5ld0V4dENoYW5uZWxPZmZzZXQgPSAweGZmOworCisJaWYoUGVlckFzc29jUnNwU2FuaXR5KHBBZCwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4sIEFkZHIyLCAmQ2FwYWJpbGl0eUluZm8sICZTdGF0dXMsICZBaWQsIFN1cFJhdGUsICZTdXBSYXRlTGVuLCBFeHRSYXRlLCAmRXh0UmF0ZUxlbiwKKwkJCQkJCQkJJkh0Q2FwYWJpbGl0eSwJJkFkZEh0SW5mbywgJkh0Q2FwYWJpbGl0eUxlbiwgJkFkZEh0SW5mb0xlbiwmTmV3RXh0Q2hhbm5lbE9mZnNldCwgJkVkY2FQYXJtLCAmQ2tpcEZsYWcpKQorCXsKKwkJaWYoTUFDX0FERFJfRVFVQUwoQWRkcjIsIHBBZC0+TWxtZUF1eC5Cc3NpZCkpIC8vIFRoZSBmcmFtZSBpcyBmb3IgbWUgPworCQl7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBU1NPQyAtIHJlY2VpdmUgUkVBU1NPQ19SU1AgdG8gbWUgKHN0YXR1cz0lZClcbiIsIFN0YXR1cykpOworCQkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguUmVhc3NvY1RpbWVyLCAmVGltZXJDYW5jZWxsZWQpOworCisJCQlpZihTdGF0dXMgPT0gTUxNRV9TVUNDRVNTKQorCQkJeworCQkJCS8vIGdvIHRvIHByb2NlZHVyZSBsaXN0ZWQgb24gcGFnZSAzNzYKKwkJCQlBc3NvY1Bvc3RQcm9jKHBBZCwgQWRkcjIsIENhcGFiaWxpdHlJbmZvLCBBaWQsIFN1cFJhdGUsIFN1cFJhdGVMZW4sIEV4dFJhdGUsIEV4dFJhdGVMZW4sCisJCQkJCSAmRWRjYVBhcm0sICZIdENhcGFiaWxpdHksIEh0Q2FwYWJpbGl0eUxlbiwgJkFkZEh0SW5mbyk7CisKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisjaWZuZGVmIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgICAgICAgICAgICAgaWYgKHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCAhPSBXUEFfU1VQUExJQ0FOVF9ESVNBQkxFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdW5pb24gaXdyZXFfZGF0YSAgICB3cnF1OworCisgICAgICAgICAgICAgICAgICAgIFNlbmRBc3NvY0lFc1RvV3BhU3VwcGxpY2FudChwQWQpOworICAgICAgICAgICAgICAgICAgICBtZW1zZXQoJndycXUsIDAsIHNpemVvZih3cnF1KSk7CisgICAgICAgICAgICAgICAgICAgIHdycXUuZGF0YS5mbGFncyA9IFJUX0FTU09DX0VWRU5UX0ZMQUc7CisgICAgICAgICAgICAgICAgICAgIHdpcmVsZXNzX3NlbmRfZXZlbnQocEFkLT5uZXRfZGV2LCBJV0VWQ1VTVE9NLCAmd3JxdSwgTlVMTCk7CisgICAgICAgICAgICAgICAgfQorI2VuZGlmIC8vIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCisjaWZkZWYgTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgICAgd3JxdTsKKyAgICAgICAgICAgICAgICAgICAgd2V4dF9ub3RpZnlfZXZlbnRfYXNzb2MocEFkKTsKKworICAgICAgICAgICAgICAgICAgICBtZW1zZXQod3JxdS5hcF9hZGRyLnNhX2RhdGEsIDAsIE1BQ19BRERSX0xFTik7CisgICAgICAgICAgICAgICAgICAgIG1lbWNweSh3cnF1LmFwX2FkZHIuc2FfZGF0YSwgcEFkLT5NbG1lQXV4LkJzc2lkLCBNQUNfQUREUl9MRU4pOworICAgICAgICAgICAgICAgICAgICB3aXJlbGVzc19zZW5kX2V2ZW50KHBBZC0+bmV0X2RldiwgU0lPQ0dJV0FQLCAmd3JxdSwgTlVMTCk7CisKKyAgICAgICAgICAgICAgICB9CisjZW5kaWYgLy8gTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKworCQkJfQorCisJCQkvLworCQkJLy8gQ2lzY28gTGVhcCBDQ0tNIHN1cHBvcnRlZCBSZS1hc3NvY2lhdGlvbi4KKwkJCS8vCisjaWZkZWYgTEVBUF9TVVBQT1JUCisJCQlpZiAoTEVBUF9DQ0tNX09OKHBBZCkgJiYgKHBBZC0+U3RhQ2ZnLkNDS01MaW5rVXBGbGFnID09IFRSVUUpKQorCQkJeworCQkJCWlmIChDQ0tNQXNzb2NSc3BTYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbikgPT0gVFJVRSkKKwkJCQl7CisJCQkJCXBBZC0+U3RhQ2ZnLkNraXBGbGFnID0gQ2tpcEZsYWc7CisJCQkJCWlmIChDa2lwRmxhZyAmIDB4MTgpCisJCQkJCXsKKwkJCQkJCU5kaXNaZXJvTWVtb3J5KHBBZC0+U3RhQ2ZnLlR4U0VRLCA0KTsKKwkJCQkJCU5kaXNaZXJvTWVtb3J5KHBBZC0+U3RhQ2ZnLlJ4U0VRLCA0KTsKKwkJCQkJCU5kaXNaZXJvTWVtb3J5KHBBZC0+U3RhQ2ZnLkNLSVBNSUMsIDQpOworCQkJCQkJcEFkLT5TdGFDZmcuR0lWWzBdID0gUmFuZG9tQnl0ZShwQWQpOworCQkJCQkJcEFkLT5TdGFDZmcuR0lWWzFdID0gUmFuZG9tQnl0ZShwQWQpOworCQkJCQkJcEFkLT5TdGFDZmcuR0lWWzJdID0gUmFuZG9tQnl0ZShwQWQpOworCQkJCQkJcEFkLT5TdGFDZmcuYkNraXBPbiA9IFRSVUU7CisJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8Q0NYPiBwQWQtPlN0YUNmZy5Da2lwRmxhZyA9IDB4JTAyeFxuIiwgcEFkLT5TdGFDZmcuQ2tpcEZsYWcpKTsKKwkJCQkJfQorCisJCQkJCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlID0gQVNTT0NfSURMRTsKKwkJCQkJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX1JFQVNTT0NfQ09ORiwgMiwgJlN0YXR1cyk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFTU09DIC0gQ0NLTUFzc29jUnNwU2FuaXR5KCkgc2FuaXR5IGNoZWNrIGZhaWxcbiIpKTsKKwkJCQl9CisJCQl9CisJCQllbHNlCisjZW5kaWYgLy8gTEVBUF9TVVBQT1JUIC8vCisJCQl7CisJCQkJLy8gQ2tpcEZsYWcgaXMgbm8gdXNlIGZvciByZWFzc29jaWF0ZQorCQkJCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlID0gQVNTT0NfSURMRTsKKwkJCQlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfUkVBU1NPQ19DT05GLCAyLCAmU3RhdHVzKTsKKwkJCX0KKwkJfQorCX0KKwllbHNlCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBU1NPQyAtIFBlZXJSZWFzc29jUnNwQWN0aW9uKCkgc2FuaXR5IGNoZWNrIGZhaWxcbiIpKTsKKwl9CisKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlwcm9jZWR1cmVzIG9uIElFRUUgODAyLjExLzE5OTkgcC4zNzYKKwlQYXJhbWV0cnM6CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgQXNzb2NQb3N0UHJvYygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBQVUNIQVIgcEFkZHIyLAorCUlOIFVTSE9SVCBDYXBhYmlsaXR5SW5mbywKKwlJTiBVU0hPUlQgQWlkLAorCUlOIFVDSEFSIFN1cFJhdGVbXSwKKwlJTiBVQ0hBUiBTdXBSYXRlTGVuLAorCUlOIFVDSEFSIEV4dFJhdGVbXSwKKwlJTiBVQ0hBUiBFeHRSYXRlTGVuLAorCUlOIFBFRENBX1BBUk0gcEVkY2FQYXJtLAorCUlOIEhUX0NBUEFCSUxJVFlfSUUJCSpwSHRDYXBhYmlsaXR5LAorCUlOIFVDSEFSIEh0Q2FwYWJpbGl0eUxlbiwKKwlJTiBBRERfSFRfSU5GT19JRQkJKnBBZGRIdEluZm8pCS8vIEFQIG1pZ2h0IHVzZSB0aGlzIGFkZGl0aW9uYWwgaHQgaW5mbyBJRQoreworCVVMT05HIElkeDsKKworCXBBZC0+TWxtZUF1eC5Cc3NUeXBlID0gQlNTX0lORlJBOworCUNPUFlfTUFDX0FERFIocEFkLT5NbG1lQXV4LkJzc2lkLCBwQWRkcjIpOworCXBBZC0+TWxtZUF1eC5BaWQgPSBBaWQ7CisJcEFkLT5NbG1lQXV4LkNhcGFiaWxpdHlJbmZvID0gQ2FwYWJpbGl0eUluZm8gJiBTVVBQT1JURURfQ0FQQUJJTElUWV9JTkZPOworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCS8vIFNvbWUgSFQgQVAgbWlnaHQgbG9zdCBXTU0gSUUuIFdlIGFkZCBXTU0gb3Vyc2VsdmVzLiBiZWFjdWFzZSBIVCByZXF1aXJlcyBRb1Mgb24uCisJaWYgKChIdENhcGFiaWxpdHlMZW4gPiAwKSAmJiAocEVkY2FQYXJtLT5iVmFsaWQgPT0gRkFMU0UpKQorCXsKKwkJcEVkY2FQYXJtLT5iVmFsaWQgPSBUUlVFOworCQlwRWRjYVBhcm0tPkFpZnNuWzBdID0gMzsKKwkJcEVkY2FQYXJtLT5BaWZzblsxXSA9IDc7CisJCXBFZGNhUGFybS0+QWlmc25bMl0gPSAyOworCQlwRWRjYVBhcm0tPkFpZnNuWzNdID0gMjsKKworCQlwRWRjYVBhcm0tPkN3bWluWzBdID0gNDsKKwkJcEVkY2FQYXJtLT5Dd21pblsxXSA9IDQ7CisJCXBFZGNhUGFybS0+Q3dtaW5bMl0gPSAzOworCQlwRWRjYVBhcm0tPkN3bWluWzNdID0gMjsKKworCQlwRWRjYVBhcm0tPkN3bWF4WzBdID0gMTA7CisJCXBFZGNhUGFybS0+Q3dtYXhbMV0gPSAxMDsKKwkJcEVkY2FQYXJtLT5Dd21heFsyXSA9IDQ7CisJCXBFZGNhUGFybS0+Q3dtYXhbM10gPSAzOworCisJCXBFZGNhUGFybS0+VHhvcFswXSAgPSAwOworCQlwRWRjYVBhcm0tPlR4b3BbMV0gID0gMDsKKwkJcEVkY2FQYXJtLT5UeG9wWzJdICA9IDk2OworCQlwRWRjYVBhcm0tPlR4b3BbM10gID0gNDg7CisKKwl9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwlOZGlzTW92ZU1lbW9yeSgmcEFkLT5NbG1lQXV4LkFQRWRjYVBhcm0sIHBFZGNhUGFybSwgc2l6ZW9mKEVEQ0FfUEFSTSkpOworCisJLy8gZmlsdGVyIG91dCB1bi1zdXBwb3J0ZWQgcmF0ZXMKKwlwQWQtPk1sbWVBdXguU3VwUmF0ZUxlbiA9IFN1cFJhdGVMZW47CisJTmRpc01vdmVNZW1vcnkocEFkLT5NbG1lQXV4LlN1cFJhdGUsIFN1cFJhdGUsIFN1cFJhdGVMZW4pOworCVJUTVBDaGVja1JhdGVzKHBBZCwgcEFkLT5NbG1lQXV4LlN1cFJhdGUsICZwQWQtPk1sbWVBdXguU3VwUmF0ZUxlbik7CisKKwkvLyBmaWx0ZXIgb3V0IHVuLXN1cHBvcnRlZCByYXRlcworCXBBZC0+TWxtZUF1eC5FeHRSYXRlTGVuID0gRXh0UmF0ZUxlbjsKKwlOZGlzTW92ZU1lbW9yeShwQWQtPk1sbWVBdXguRXh0UmF0ZSwgRXh0UmF0ZSwgRXh0UmF0ZUxlbik7CisJUlRNUENoZWNrUmF0ZXMocEFkLCBwQWQtPk1sbWVBdXguRXh0UmF0ZSwgJnBBZC0+TWxtZUF1eC5FeHRSYXRlTGVuKTsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCWlmIChIdENhcGFiaWxpdHlMZW4gPiAwKQorCXsKKwkJUlRNUENoZWNrSHQocEFkLCBCU1NJRF9XQ0lELCBwSHRDYXBhYmlsaXR5LCBwQWRkSHRJbmZvKTsKKwl9CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQXNzb2NQb3N0UHJvYz09PT4gIEFQLkFNc2R1U2l6ZSA9ICVkLiBDbGllbnRTdGF0dXNGbGFncyA9IDB4JWx4IFxuIiwgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5BTXNkdVNpemUsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQ2xpZW50U3RhdHVzRmxhZ3MpKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFzc29jUG9zdFByb2M9PT0+ICAgIChNbXBzPSVkLCBBbXNkdVNpemU9JWQsIClcbiIsCisJCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uTW1wc01vZGUsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQU1zZHVTaXplKSk7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwkvLyBTZXQgTmV3IFdQQSBpbmZvcm1hdGlvbgorCUlkeCA9IEJzc1RhYmxlU2VhcmNoKCZwQWQtPlNjYW5UYWIsIHBBZGRyMiwgcEFkLT5NbG1lQXV4LkNoYW5uZWwpOworCWlmIChJZHggPT0gQlNTX05PVF9GT1VORCkKKwl7CisJCURCR1BSSU5UX0VSUigoIkFTU09DIC0gQ2FuJ3QgZmluZCBCU1MgYWZ0ZXIgcmVjZWl2aW5nIEFzc29jIHJlc3BvbnNlXG4iKSk7CisJfQorCWVsc2UKKwl7CisJCS8vIEluaXQgdmFyaWFibGUKKwkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5SU05JRV9MZW4gPSAwOworCQlOZGlzWmVyb01lbW9yeShwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlJTTl9JRSwgTUFYX0xFTl9PRl9SU05JRSk7CisKKwkJLy8gU3RvcmUgYXBwcm9wcmlhdGUgUlNOX0lFIGZvciBXUEEgU00gbmVnb3RpYXRpb24gbGF0ZXIKKwkJaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpICYmIChwQWQtPlNjYW5UYWIuQnNzRW50cnlbSWR4XS5WYXJJRUxlbiAhPSAwKSkKKwkJeworCQkJUFVDSEFSICAgICAgICAgICAgICBwVklFOworCQkJVVNIT1JUICAgICAgICAgICAgICBsZW47CisJCQlQRUlEX1NUUlVDVCAgICAgICAgIHBFaWQ7CisKKwkJCXBWSUUgPSBwQWQtPlNjYW5UYWIuQnNzRW50cnlbSWR4XS5WYXJJRXM7CisJCQlsZW4JID0gcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0lkeF0uVmFySUVMZW47CisKKwkJCXdoaWxlIChsZW4gPiAwKQorCQkJeworCQkJCXBFaWQgPSAoUEVJRF9TVFJVQ1QpIHBWSUU7CisJCQkJLy8gRm9yIFdQQS9XUEFQU0sKKwkJCQlpZiAoKHBFaWQtPkVpZCA9PSBJRV9XUEEpICYmIChOZGlzRXF1YWxNZW1vcnkocEVpZC0+T2N0ZXQsIFdQQV9PVUksIDQpKQorCQkJCQkmJiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBIHx8IHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykpCisJCQkJeworCQkJCQlOZGlzTW92ZU1lbW9yeShwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlJTTl9JRSwgcFZJRSwgKHBFaWQtPkxlbiArIDIpKTsKKwkJCQkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5SU05JRV9MZW4gPSAocEVpZC0+TGVuICsgMik7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFzc29jUG9zdFByb2M9PT0+IFN0b3JlIFJTTl9JRSBmb3IgV1BBIFNNIG5lZ290aWF0aW9uIFxuIikpOworCQkJCX0KKwkJCQkvLyBGb3IgV1BBMi9XUEEyUFNLCisJCQkJZWxzZSBpZiAoKHBFaWQtPkVpZCA9PSBJRV9SU04pICYmIChOZGlzRXF1YWxNZW1vcnkocEVpZC0+T2N0ZXQgKyAyLCBSU05fT1VJLCAzKSkKKwkJCQkJJiYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIgfHwgcEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykpCisJCQkJeworCQkJCQlOZGlzTW92ZU1lbW9yeShwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlJTTl9JRSwgcFZJRSwgKHBFaWQtPkxlbiArIDIpKTsKKwkJCQkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5SU05JRV9MZW4gPSAocEVpZC0+TGVuICsgMik7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFzc29jUG9zdFByb2M9PT0+IFN0b3JlIFJTTl9JRSBmb3IgV1BBMiBTTSBuZWdvdGlhdGlvbiBcbiIpKTsKKwkJCQl9CisKKwkJCQlwVklFICs9IChwRWlkLT5MZW4gKyAyKTsKKwkJCQlsZW4gIC09IChwRWlkLT5MZW4gKyAyKTsKKwkJCX0KKwkJfQorCisJCWlmIChwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlJTTklFX0xlbiA9PSAwKQorCQl7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBc3NvY1Bvc3RQcm9jPT09PiBubyBSU05fSUUgXG4iKSk7CisJCX0KKwkJZWxzZQorCQl7CisJCQloZXhfZHVtcCgiUlNOX0lFIiwgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5SU05fSUUsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUlNOSUVfTGVuKTsKKwkJfQorCX0KK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlsZWZ0IHBhcnQgb2YgSUVFRSA4MDIuMTEvMTk5OSBwLjM3NAorCVBhcmFtZXRlcnM6CisJCUVsZW0gLSBNTE1FIG1lc3NhZ2UgY29udGFpbmluZyB0aGUgcmVjZWl2ZWQgZnJhbWUKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBQZWVyRGlzYXNzb2NBY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCVVDSEFSICAgICAgICAgQWRkcjJbTUFDX0FERFJfTEVOXTsKKwlVU0hPUlQgICAgICAgIFJlYXNvbjsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFTU09DIC0gUGVlckRpc2Fzc29jQWN0aW9uKClcbiIpKTsKKwlpZihQZWVyRGlzYXNzb2NTYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbiwgQWRkcjIsICZSZWFzb24pKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVNTT0MgLSBQZWVyRGlzYXNzb2NBY3Rpb24oKSBSZWFzb24gPSAlZFxuIiwgUmVhc29uKSk7CisJCWlmIChJTkZSQV9PTihwQWQpICYmIE1BQ19BRERSX0VRVUFMKHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBBZGRyMikpCisJCXsKKworCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJXaXJlbGVzc0V2ZW50KQorCQkJeworCQkJCVJUTVBTZW5kV2lyZWxlc3NFdmVudChwQWQsIElXX0RJU0FTU09DX0VWRU5UX0ZMQUcsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQWRkciwgQlNTMCwgMCk7CisJCQl9CisKKworI2lmZGVmIExFQVBfU1VQUE9SVAorCQkJaWYgKHBBZC0+U3RhQ2ZnLkxlYXBBdXRoTW9kZSA9PSBDSVNDT19BdXRoTW9kZUxFQVApCisJCQl7CisJCQkJLy8gQ2lzY29fTEVBUCBoYXMgc3RhcnQgYSB0aW1lcgorCQkJCS8vIFdlIHNob3VsZCBjYW5jZWwgaXQgaWYgdXNpbmcgTEVBUAorCQkJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5TdGFDZmcuTGVhcEF1dGhUaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKKwkJCQkvL0NoZWNrIGlzIGl0IG1hY2ggdGhlIExFQVAgQXV0aGVudGljYXRpb24gZmFpbGVkIGFzIHBvc3NpYmxlIGEgUm9ndWUgQVAKKwkJCQkvL29uIGl0J3MgUG9ydFNlY3VyZWQgbm90IGVxdWFsIHRvIFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEIHdoaWxlIHByb2Nlc3MgdGhlIEFzc29jaWF0aW9uLgorCQkJCWlmICgocEFkLT5NbG1lLkxlYXBNYWNoaW5lLkN1cnJTdGF0ZSAhPSBMRUFQX0lETEUpICYmIChwQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZCAhPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRCkpCisJCQkJeworCQkJCQlSb2d1ZUFwVGFibGVTZXRFbnRyeShwQWQsICZwQWQtPlN0YUNmZy5Sb2d1ZUFwVGFiLCBBZGRyMiwgTEVBUF9SRUFTT05fQVVUSF9USU1FT1VUKTsKKwkJCQl9CisJCQl9CisjZW5kaWYJLy8gTEVBUF9TVVBQT1JUIC8vCisJCQkvLworCQkJLy8gR2V0IEN1cnJlbnQgU3lzdGVtIHRpbWUgYW5kIFR1cm4gb24gQWRqYWNlbnRBUFJlcG9ydAorCQkJLy8KKwkJCU5kaXNHZXRTeXN0ZW1VcFRpbWUoJnBBZC0+U3RhQ2ZnLkNDWEFkamFjZW50QVBMaW5rRG93blRpbWUpOworCQkJcEFkLT5TdGFDZmcuQ0NYQWRqYWNlbnRBUFJlcG9ydEZsYWcgPSBUUlVFOworCQkJTGlua0Rvd24ocEFkLCBUUlVFKTsKKwkJCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlID0gQVNTT0NfSURMRTsKKworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyNpZm5kZWYgTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyAgICAgICAgICAgIGlmIChwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgIT0gV1BBX1NVUFBMSUNBTlRfRElTQUJMRSkKKwkJCXsKKyAgICAgICAgICAgICAgICB1bmlvbiBpd3JlcV9kYXRhICAgIHdycXU7CisgICAgICAgICAgICAgICAgLy9zZW5kIGRpc2Fzc29jaWF0ZSBldmVudCB0byB3cGFfc3VwcGxpY2FudAorICAgICAgICAgICAgICAgIG1lbXNldCgmd3JxdSwgMCwgc2l6ZW9mKHdycXUpKTsKKyAgICAgICAgICAgICAgICB3cnF1LmRhdGEuZmxhZ3MgPSBSVF9ESVNBU1NPQ19FVkVOVF9GTEFHOworICAgICAgICAgICAgICAgIHdpcmVsZXNzX3NlbmRfZXZlbnQocEFkLT5uZXRfZGV2LCBJV0VWQ1VTVE9NLCAmd3JxdSwgTlVMTCk7CisgICAgICAgICAgICB9CisjZW5kaWYgLy8gTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisKKyNpZmRlZiBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgICAgd3JxdTsKKyAgICAgICAgICAgICAgICBtZW1zZXQod3JxdS5hcF9hZGRyLnNhX2RhdGEsIDAsIE1BQ19BRERSX0xFTik7CisgICAgICAgICAgICAgICAgd2lyZWxlc3Nfc2VuZF9ldmVudChwQWQtPm5ldF9kZXYsIFNJT0NHSVdBUCwgJndycXUsIE5VTEwpOworICAgICAgICAgICAgfQorI2VuZGlmIC8vIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisJCX0KKwl9CisJZWxzZQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVNTT0MgLSBQZWVyRGlzYXNzb2NBY3Rpb24oKSBzYW5pdHkgY2hlY2sgZmFpbFxuIikpOworCX0KKworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCXdoYXQgdGhlIHN0YXRlIG1hY2hpbmUgd2lsbCBkbyBhZnRlciBhc3NvYyB0aW1lb3V0CisJUGFyYW1ldGVyczoKKwkJRWxtZSAtCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgQXNzb2NUaW1lb3V0QWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlVU0hPUlQgIFN0YXR1czsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBU1NPQyAtIEFzc29jVGltZW91dEFjdGlvblxuIikpOworCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlID0gQVNTT0NfSURMRTsKKwlTdGF0dXMgPSBNTE1FX1JFSl9USU1FT1VUOworCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9BU1NPQ19DT05GLCAyLCAmU3RhdHVzKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQl3aGF0IHRoZSBzdGF0ZSBtYWNoaW5lIHdpbGwgZG8gYWZ0ZXIgcmVhc3NvYyB0aW1lb3V0CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgUmVhc3NvY1RpbWVvdXRBY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCVVTSE9SVCAgU3RhdHVzOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFTU09DIC0gUmVhc3NvY1RpbWVvdXRBY3Rpb25cbiIpKTsKKwlwQWQtPk1sbWUuQXNzb2NNYWNoaW5lLkN1cnJTdGF0ZSA9IEFTU09DX0lETEU7CisJU3RhdHVzID0gTUxNRV9SRUpfVElNRU9VVDsKKwlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfUkVBU1NPQ19DT05GLCAyLCAmU3RhdHVzKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQl3aGF0IHRoZSBzdGF0ZSBtYWNoaW5lIHdpbGwgZG8gYWZ0ZXIgZGlzYXNzb2MgdGltZW91dAorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIERpc2Fzc29jVGltZW91dEFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisJVVNIT1JUICBTdGF0dXM7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVNTT0MgLSBEaXNhc3NvY1RpbWVvdXRBY3Rpb25cbiIpKTsKKwlwQWQtPk1sbWUuQXNzb2NNYWNoaW5lLkN1cnJTdGF0ZSA9IEFTU09DX0lETEU7CisJU3RhdHVzID0gTUxNRV9TVUNDRVNTOworCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9ESVNBU1NPQ19DT05GLCAyLCAmU3RhdHVzKTsKK30KKworVk9JRCBJbnZhbGlkU3RhdGVXaGVuQXNzb2MoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCVVTSE9SVCAgU3RhdHVzOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFTU09DIC0gSW52YWxpZFN0YXRlV2hlbkFzc29jKHN0YXRlPSVsZCksIHJlc2V0IEFTU09DIHN0YXRlIG1hY2hpbmVcbiIsCisJCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlKSk7CisJcEFkLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUgPSBBU1NPQ19JRExFOworCVN0YXR1cyA9IE1MTUVfU1RBVEVfTUFDSElORV9SRUpFQ1Q7CisJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX0FTU09DX0NPTkYsIDIsICZTdGF0dXMpOworfQorCitWT0lEIEludmFsaWRTdGF0ZVdoZW5SZWFzc29jKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlVU0hPUlQgU3RhdHVzOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFTU09DIC0gSW52YWxpZFN0YXRlV2hlblJlYXNzb2Moc3RhdGU9JWxkKSwgcmVzZXQgQVNTT0Mgc3RhdGUgbWFjaGluZVxuIiwKKwkJcEFkLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUpKTsKKwlwQWQtPk1sbWUuQXNzb2NNYWNoaW5lLkN1cnJTdGF0ZSA9IEFTU09DX0lETEU7CisJU3RhdHVzID0gTUxNRV9TVEFURV9NQUNISU5FX1JFSkVDVDsKKwlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfUkVBU1NPQ19DT05GLCAyLCAmU3RhdHVzKTsKK30KKworVk9JRCBJbnZhbGlkU3RhdGVXaGVuRGlzYXNzb2NpYXRlKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlVU0hPUlQgU3RhdHVzOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFTU09DIC0gSW52YWxpZFN0YXRlV2hlbkRpc2Fzc29jKHN0YXRlPSVsZCksIHJlc2V0IEFTU09DIHN0YXRlIG1hY2hpbmVcbiIsCisJCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlKSk7CisJcEFkLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUgPSBBU1NPQ19JRExFOworCVN0YXR1cyA9IE1MTUVfU1RBVEVfTUFDSElORV9SRUpFQ1Q7CisJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX0RJU0FTU09DX0NPTkYsIDIsICZTdGF0dXMpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCXJpZ2h0IHBhcnQgb2YgSUVFRSA4MDIuMTEvMTk5OSBwYWdlIDM3NAorCU5vdGU6CisJCVRoaXMgZXZlbnQgc2hvdWxkIG5ldmVyIGNhdXNlIEFTU09DIHN0YXRlIG1hY2hpbmUgcGVyZm9ybSBzdGF0ZQorCQl0cmFuc2l0aW9uLCBhbmQgaGFzIG5vIHJlbGF0aW9uc2hpcCB3aXRoIENOVEwgbWFjaGluZS4gU28gd2Ugc2VwYXJhdGUKKwkJdGhpcyByb3V0aW5lIGFzIGEgc2VydmljZSBvdXRzaWRlIG9mIEFTU09DIHN0YXRlIHRyYW5zaXRpb24gdGFibGUuCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgQ2xzM2VyckFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBQVUNIQVIgICAgICAgIHBBZGRyKQoreworCUhFQURFUl84MDJfMTEgICAgICAgICBEaXNhc3NvY0hkcjsKKwlQSEVBREVSXzgwMl8xMSAgICAgICAgcERpc2Fzc29jSGRyOworCVBVQ0hBUiAgICAgICAgICAgICAgICBwT3V0QnVmZmVyID0gTlVMTDsKKwlVTE9ORyAgICAgICAgICAgICAgICAgRnJhbWVMZW4gPSAwOworCU5ESVNfU1RBVFVTICAgICAgICAgICBOU3RhdHVzOworCVVTSE9SVCAgICAgICAgICAgICAgICBSZWFzb24gPSBSRUFTT05fQ0xTM0VSUjsKKworCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5CisJaWYgKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJcmV0dXJuOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVNTT0MgLSBDbGFzcyAzIEVycm9yLCBTZW5kIERJU0FTU09DIGZyYW1lXG4iKSk7CisJTWd0TWFjSGVhZGVySW5pdChwQWQsICZEaXNhc3NvY0hkciwgU1VCVFlQRV9ESVNBU1NPQywgMCwgcEFkZHIsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsJLy8gcGF0Y2ggcGVhcCB0dGxzIHN3aXRjaGluZyBpc3N1ZQorCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAgICAmRnJhbWVMZW4sCisJCQkJCSAgc2l6ZW9mKEhFQURFUl84MDJfMTEpLCZEaXNhc3NvY0hkciwKKwkJCQkJICAyLCAgICAgICAgICAgICAgICAgICAgJlJlYXNvbiwKKwkJCQkJICBFTkRfT0ZfQVJHUyk7CisJTWluaXBvcnRNTVJlcXVlc3QocEFkLCAwLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7CisKKwkvLyBUbyBwYXRjaCBJbnN0YW5jZSBhbmQgQnVmZmFsbyhOKSBBUAorCS8vIERyaXZlciBoYXMgdG8gc2VuZCBkZWF1dGggdG8gSW5zdGFuY2UgQVAsIGJ1dCBCdWZmYWxvKE4pIG5lZWRzIHRvIHNlbmQgZGlzYXNzb2MgdG8gcmVzZXQgQXV0aGVudGljYXRvcidzIHN0YXRlIG1hY2hpbmUKKwkvLyBUaGVyZWZvcmUsIHdlIHNlbmQgYm90aCBvZiB0aGVtLgorCXBEaXNhc3NvY0hkciA9IChQSEVBREVSXzgwMl8xMSlwT3V0QnVmZmVyOworCXBEaXNhc3NvY0hkci0+RkMuU3ViVHlwZSA9IFNVQlRZUEVfREVBVVRIOworCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgMCwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOworCisJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKKworCXBBZC0+U3RhQ2ZnLkRpc2Fzc29jUmVhc29uID0gUkVBU09OX0NMUzNFUlI7CisJQ09QWV9NQUNfQUREUihwQWQtPlN0YUNmZy5EaXNhc3NvY1N0YSwgcEFkZHIpOworfQorCisgLyoKKwkgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkgRGVzY3JpcHRpb246CisJCSBTd2l0Y2ggYmV0d2VlbiBXRVAgYW5kIENLSVAgdXBvbiBuZXcgYXNzb2NpYXRpb24gdXAuCisJIFBhcmFtZXRlcnM6CisKKwkgSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwkgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgKi8KK1ZPSUQgU3dpdGNoQmV0d2VlbldlcEFuZENraXAoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJaW50ICAgICAgICAgICAgaTsKKwlTSEFSRURLRVlfTU9ERV9TVFJVQyAgY3NyMTsKKworCS8vIGlmIEtQIGlzIHJlcXVpcmVkLiBjaGFuZ2UgdGhlIENpcGhlckFsZyBpbiBoYXJkd2FyZSBzaGFyZCBrZXkgdGFibGUgZnJvbSBXRVAKKwkvLyB0byBDS0lQLiBlbHNlIHJlbWFpbiBhcyBXRVAKKwlpZiAocEFkLT5TdGFDZmcuYkNraXBPbiAmJiAocEFkLT5TdGFDZmcuQ2tpcEZsYWcgJiAweDEwKSkKKwl7CisJCS8vIG1vZGlmeSBoYXJkd2FyZSBrZXkgdGFibGUgc28gdGhhdCBNQUMgdXNlIGNvcnJlY3QgYWxnb3JpdGhtIHRvIGRlY3J5cHQgUlgKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBTSEFSRURfS0VZX01PREVfQkFTRSwgJmNzcjEud29yZCk7CisJCWlmIChjc3IxLmZpZWxkLkJzczBLZXkwQ2lwaGVyQWxnID09IENJUEhFUl9XRVA2NCkKKwkJCWNzcjEuZmllbGQuQnNzMEtleTBDaXBoZXJBbGcgPSBDSVBIRVJfQ0tJUDY0OworCQllbHNlIGlmIChjc3IxLmZpZWxkLkJzczBLZXkwQ2lwaGVyQWxnID09IENJUEhFUl9XRVAxMjgpCisJCQljc3IxLmZpZWxkLkJzczBLZXkwQ2lwaGVyQWxnID0gQ0lQSEVSX0NLSVAxMjg7CisKKwkJaWYgKGNzcjEuZmllbGQuQnNzMEtleTFDaXBoZXJBbGcgPT0gQ0lQSEVSX1dFUDY0KQorCQkJY3NyMS5maWVsZC5Cc3MwS2V5MUNpcGhlckFsZyA9IENJUEhFUl9DS0lQNjQ7CisJCWVsc2UgaWYgKGNzcjEuZmllbGQuQnNzMEtleTFDaXBoZXJBbGcgPT0gQ0lQSEVSX1dFUDEyOCkKKwkJCWNzcjEuZmllbGQuQnNzMEtleTFDaXBoZXJBbGcgPSBDSVBIRVJfQ0tJUDEyODsKKworCQlpZiAoY3NyMS5maWVsZC5Cc3MwS2V5MkNpcGhlckFsZyA9PSBDSVBIRVJfV0VQNjQpCisJCQljc3IxLmZpZWxkLkJzczBLZXkyQ2lwaGVyQWxnID0gQ0lQSEVSX0NLSVA2NDsKKwkJZWxzZSBpZiAoY3NyMS5maWVsZC5Cc3MwS2V5MkNpcGhlckFsZyA9PSBDSVBIRVJfV0VQMTI4KQorCQkJY3NyMS5maWVsZC5Cc3MwS2V5MkNpcGhlckFsZyA9IENJUEhFUl9DS0lQMTI4OworCisJCWlmIChjc3IxLmZpZWxkLkJzczBLZXkzQ2lwaGVyQWxnID09IENJUEhFUl9XRVA2NCkKKwkJCWNzcjEuZmllbGQuQnNzMEtleTNDaXBoZXJBbGcgPSBDSVBIRVJfQ0tJUDY0OworCQllbHNlIGlmIChjc3IxLmZpZWxkLkJzczBLZXkzQ2lwaGVyQWxnID09IENJUEhFUl9XRVAxMjgpCisJCQljc3IxLmZpZWxkLkJzczBLZXkzQ2lwaGVyQWxnID0gQ0lQSEVSX0NLSVAxMjg7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFNIQVJFRF9LRVlfTU9ERV9CQVNFLCBjc3IxLndvcmQpOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTd2l0Y2hCZXR3ZWVuV2VwQW5kQ2tpcDogbW9kaWZ5IEJTUzAgY2lwaGVyIHRvICVzXG4iLCBDaXBoZXJOYW1lW2NzcjEuZmllbGQuQnNzMEtleTBDaXBoZXJBbGddKSk7CisKKwkJLy8gbW9kaWZ5IHNvZnR3YXJlIGtleSB0YWJsZSBzbyB0aGF0IGRyaXZlciBjYW4gc3BlY2lmeSBjb3JyZWN0IGFsZ29yaXRobSBpbiBUWEQgdXBvbiBUWAorCQlmb3IgKGk9MDsgaTxTSEFSRV9LRVlfTlVNOyBpKyspCisJCXsKKwkJCWlmIChwQWQtPlNoYXJlZEtleVtCU1MwXVtpXS5DaXBoZXJBbGcgPT0gQ0lQSEVSX1dFUDY0KQorCQkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW2ldLkNpcGhlckFsZyA9IENJUEhFUl9DS0lQNjQ7CisJCQllbHNlIGlmIChwQWQtPlNoYXJlZEtleVtCU1MwXVtpXS5DaXBoZXJBbGcgPT0gQ0lQSEVSX1dFUDEyOCkKKwkJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtpXS5DaXBoZXJBbGcgPSBDSVBIRVJfQ0tJUDEyODsKKwkJfQorCX0KKworCS8vIGVsc2UgaWYgS1AgTk9UIGludXNlZC4gY2hhbmdlIHRoZSBDaXBoZXJBbGcgaW4gaGFyZHdhcmUgc2hhcmQga2V5IHRhYmxlIGZyb20gQ0tJUAorCS8vIHRvIFdFUC4KKwllbHNlCisJeworCQkvLyBtb2RpZnkgaGFyZHdhcmUga2V5IHRhYmxlIHNvIHRoYXQgTUFDIHVzZSBjb3JyZWN0IGFsZ29yaXRobSB0byBkZWNyeXB0IFJYCisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgU0hBUkVEX0tFWV9NT0RFX0JBU0UsICZjc3IxLndvcmQpOworCQlpZiAoY3NyMS5maWVsZC5Cc3MwS2V5MENpcGhlckFsZyA9PSBDSVBIRVJfQ0tJUDY0KQorCQkJY3NyMS5maWVsZC5Cc3MwS2V5MENpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKKwkJZWxzZSBpZiAoY3NyMS5maWVsZC5Cc3MwS2V5MENpcGhlckFsZyA9PSBDSVBIRVJfQ0tJUDEyOCkKKwkJCWNzcjEuZmllbGQuQnNzMEtleTBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OworCisJCWlmIChjc3IxLmZpZWxkLkJzczBLZXkxQ2lwaGVyQWxnID09IENJUEhFUl9DS0lQNjQpCisJCQljc3IxLmZpZWxkLkJzczBLZXkxQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OworCQllbHNlIGlmIChjc3IxLmZpZWxkLkJzczBLZXkxQ2lwaGVyQWxnID09IENJUEhFUl9DS0lQMTI4KQorCQkJY3NyMS5maWVsZC5Cc3MwS2V5MUNpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7CisKKwkJaWYgKGNzcjEuZmllbGQuQnNzMEtleTJDaXBoZXJBbGcgPT0gQ0lQSEVSX0NLSVA2NCkKKwkJCWNzcjEuZmllbGQuQnNzMEtleTJDaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7CisJCWVsc2UgaWYgKGNzcjEuZmllbGQuQnNzMEtleTJDaXBoZXJBbGcgPT0gQ0lQSEVSX0NLSVAxMjgpCisJCQljc3IxLmZpZWxkLkJzczBLZXkyQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDEyODsKKworCQlpZiAoY3NyMS5maWVsZC5Cc3MwS2V5M0NpcGhlckFsZyA9PSBDSVBIRVJfQ0tJUDY0KQorCQkJY3NyMS5maWVsZC5Cc3MwS2V5M0NpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKKwkJZWxzZSBpZiAoY3NyMS5maWVsZC5Cc3MwS2V5M0NpcGhlckFsZyA9PSBDSVBIRVJfQ0tJUDEyOCkKKwkJCWNzcjEuZmllbGQuQnNzMEtleTNDaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OworCisJCS8vIG1vZGlmeSBzb2Z0d2FyZSBrZXkgdGFibGUgc28gdGhhdCBkcml2ZXIgY2FuIHNwZWNpZnkgY29ycmVjdCBhbGdvcml0aG0gaW4gVFhEIHVwb24gVFgKKwkJZm9yIChpPTA7IGk8U0hBUkVfS0VZX05VTTsgaSsrKQorCQl7CisJCQlpZiAocEFkLT5TaGFyZWRLZXlbQlNTMF1baV0uQ2lwaGVyQWxnID09IENJUEhFUl9DS0lQNjQpCisJCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1baV0uQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OworCQkJZWxzZSBpZiAocEFkLT5TaGFyZWRLZXlbQlNTMF1baV0uQ2lwaGVyQWxnID09IENJUEhFUl9DS0lQMTI4KQorCQkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW2ldLkNpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7CisJCX0KKworCQkvLworCQkvLyBPbiBXUEEtTk9ORSwgbXVzdCB1cGRhdGUgQ2lwaGVyQWxnLgorCQkvLyBCZWNhdXNlIHRoZSBPSURfODAyXzExX1dFUF9TVEFUVVMgd2FzIGJlZW4gc2V0IGFmdGVyIE9JRF84MDJfMTFfQUREX0tFWQorCQkvLyBhbmQgQ2lwaGVyQWxnIHdpbGwgYmUgQ0lQSEVSX05PTkUgYnkgV2luZG93cyBaZXJvQ29uZmlnLgorCQkvLyBTbyB3ZSBuZWVkIHRvIHVwZGF0ZSBDaXBoZXJBbGcgYWZ0ZXIgY29ubmVjdC4KKwkJLy8KKwkJaWYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmUpCisJCXsKKwkJCWZvciAoaSA9IDA7IGkgPCBTSEFSRV9LRVlfTlVNOyBpKyspCisJCQl7CisJCQkJaWYgKHBBZC0+U2hhcmVkS2V5W0JTUzBdW2ldLktleUxlbiAhPSAwKQorCQkJCXsKKwkJCQkJaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKQorCQkJCQl7CisJCQkJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtpXS5DaXBoZXJBbGcgPSBDSVBIRVJfVEtJUDsKKwkJCQkJfQorCQkJCQllbHNlIGlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKKwkJCQkJeworCQkJCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1baV0uQ2lwaGVyQWxnID0gQ0lQSEVSX0FFUzsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtpXS5DaXBoZXJBbGcgPSBDSVBIRVJfTk9ORTsKKwkJCQl9CisJCQl9CisKKwkJCWNzcjEuZmllbGQuQnNzMEtleTBDaXBoZXJBbGcgPSBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGc7CisJCQljc3IxLmZpZWxkLkJzczBLZXkxQ2lwaGVyQWxnID0gcEFkLT5TaGFyZWRLZXlbQlNTMF1bMV0uQ2lwaGVyQWxnOworCQkJY3NyMS5maWVsZC5Cc3MwS2V5MkNpcGhlckFsZyA9IHBBZC0+U2hhcmVkS2V5W0JTUzBdWzJdLkNpcGhlckFsZzsKKwkJCWNzcjEuZmllbGQuQnNzMEtleTNDaXBoZXJBbGcgPSBwQWQtPlNoYXJlZEtleVtCU1MwXVszXS5DaXBoZXJBbGc7CisJCX0KKwkJUlRNUF9JT19XUklURTMyKHBBZCwgU0hBUkVEX0tFWV9NT0RFX0JBU0UsIGNzcjEud29yZCk7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlN3aXRjaEJldHdlZW5XZXBBbmRDa2lwOiBtb2RpZnkgQlNTMCBjaXBoZXIgdG8gJXNcbiIsIENpcGhlck5hbWVbY3NyMS5maWVsZC5Cc3MwS2V5MENpcGhlckFsZ10pKTsKKwl9Cit9CisKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisjaWZuZGVmIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUCitWT0lEICAgIFNlbmRBc3NvY0lFc1RvV3BhU3VwcGxpY2FudCgKKyAgICBJTiAgUFJUTVBfQURBUFRFUiBwQWQpCit7CisgICAgdW5pb24gaXdyZXFfZGF0YSAgICB3cnF1OworICAgIHVuc2lnbmVkIGNoYXIgY3VzdG9tW0lXX0NVU1RPTV9NQVhdID0gezB9OworCisgICAgaWYgKChwQWQtPlN0YUNmZy5SZXFWYXJJRUxlbiArIDE3KSA8PSBJV19DVVNUT01fTUFYKQorICAgIHsKKyAgICAgICAgc3ByaW50ZihjdXN0b20sICJBU1NPQ0lORk9fUmVxSUVzPSIpOworCSAgICBOZGlzTW92ZU1lbW9yeShjdXN0b20rMTcsIHBBZC0+U3RhQ2ZnLlJlcVZhcklFcywgcEFkLT5TdGFDZmcuUmVxVmFySUVMZW4pOworCSAgICBtZW1zZXQoJndycXUsIDAsIHNpemVvZih3cnF1KSk7CisgICAgICAgIHdycXUuZGF0YS5sZW5ndGggPSBwQWQtPlN0YUNmZy5SZXFWYXJJRUxlbiArIDE3OworICAgICAgICB3cnF1LmRhdGEuZmxhZ3MgPSBSVF9SRVFJRV9FVkVOVF9GTEFHOworICAgICAgICB3aXJlbGVzc19zZW5kX2V2ZW50KHBBZC0+bmV0X2RldiwgSVdFVkNVU1RPTSwgJndycXUsIGN1c3RvbSk7CisKKyAgICAgICAgbWVtc2V0KCZ3cnF1LCAwLCBzaXplb2Yod3JxdSkpOworICAgICAgICB3cnF1LmRhdGEuZmxhZ3MgPSBSVF9BU1NPQ0lORk9fRVZFTlRfRkxBRzsKKyAgICAgICAgd2lyZWxlc3Nfc2VuZF9ldmVudChwQWQtPm5ldF9kZXYsIElXRVZDVVNUT00sICZ3cnF1LCBOVUxMKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJwQWQtPlN0YUNmZy5SZXFWYXJJRUxlbiArIDE3ID4gTUFYX0NVU1RPTV9MRU5cbiIpKTsKKworICAgIHJldHVybjsKK30KKyNlbmRpZiAvLyBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKworI2lmZGVmIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUCitpbnQgd2V4dF9ub3RpZnlfZXZlbnRfYXNzb2MoCisJSU4gIFJUTVBfQURBUFRFUiAqcEFkKQoreworICAgIHVuaW9uIGl3cmVxX2RhdGEgICAgd3JxdTsKKyAgICBjaGFyIGN1c3RvbVtJV19DVVNUT01fTUFYXSA9IHswfTsKKworI2lmIFdJUkVMRVNTX0VYVCA+IDE3CisgICAgaWYgKHBBZC0+U3RhQ2ZnLlJlcVZhcklFTGVuIDw9IElXX0NVU1RPTV9NQVgpCisgICAgeworICAgICAgICB3cnF1LmRhdGEubGVuZ3RoID0gcEFkLT5TdGFDZmcuUmVxVmFySUVMZW47CisgICAgICAgIG1lbWNweShjdXN0b20sIHBBZC0+U3RhQ2ZnLlJlcVZhcklFcywgcEFkLT5TdGFDZmcuUmVxVmFySUVMZW4pOworICAgICAgICB3aXJlbGVzc19zZW5kX2V2ZW50KHBBZC0+bmV0X2RldiwgSVdFVkFTU09DUkVRSUUsICZ3cnF1LCBjdXN0b20pOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoInBBZC0+U3RhQ2ZnLlJlcVZhcklFTGVuID4gTUFYX0NVU1RPTV9MRU5cbiIpKTsKKyNlbHNlCisgICAgaWYgKCgocEFkLT5TdGFDZmcuUmVxVmFySUVMZW4qMikgKyAxNykgPD0gSVdfQ1VTVE9NX01BWCkKKyAgICB7CisgICAgICAgIFVDSEFSICAgaWR4OworICAgICAgICB3cnF1LmRhdGEubGVuZ3RoID0gKHBBZC0+U3RhQ2ZnLlJlcVZhcklFTGVuKjIpICsgMTc7CisgICAgICAgIHNwcmludGYoY3VzdG9tLCAiQVNTT0NJTkZPKFJlcUlFcz0iKTsKKyAgICAgICAgZm9yIChpZHg9MDsgaWR4PHBBZC0+U3RhQ2ZnLlJlcVZhcklFTGVuOyBpZHgrKykKKyAgICAgICAgICAgICAgICBzcHJpbnRmKGN1c3RvbSwgIiVzJTAyeCIsIGN1c3RvbSwgcEFkLT5TdGFDZmcuUmVxVmFySUVzW2lkeF0pOworICAgICAgICB3aXJlbGVzc19zZW5kX2V2ZW50KHBBZC0+bmV0X2RldiwgSVdFVkNVU1RPTSwgJndycXUsIGN1c3RvbSk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiKHBBZC0+U3RhQ2ZnLlJlcVZhcklFTGVuKjIpICsgMTcgPiBNQVhfQ1VTVE9NX0xFTlxuIikpOworI2VuZGlmCisKKwlyZXR1cm4gMDsKKworfQorI2VuZGlmIC8vIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3RhL2F1dGguYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3RhL2F1dGguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43M2ZiOGQ2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zdGEvYXV0aC5jCkBAIC0wLDAgKzEsNDc0IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCU1vZHVsZSBOYW1lOgorCWF1dGguYworCisJQWJzdHJhY3Q6CisKKwlSZXZpc2lvbiBIaXN0b3J5OgorCVdobwkJCVdoZW4JCQlXaGF0CisJLS0tLS0tLS0JLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCUpvaG4JCTIwMDQtOS0zCQlwb3J0aW5nIGZyb20gUlQyNTAwCisqLworI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIGF1dGhlbnRpY2F0ZSBzdGF0ZSBtYWNoaW5lIGluaXQsIGluY2x1ZGluZyBzdGF0ZSB0cmFuc2l0aW9uIGFuZCB0aW1lciBpbml0CisgICAgUGFyYW1ldGVyczoKKyAgICAgICAgU20gLSBwb2ludGVyIHRvIHRoZSBhdXRoIHN0YXRlIG1hY2hpbmUKKyAgICBOb3RlOgorICAgICAgICBUaGUgc3RhdGUgbWFjaGluZSBsb29rcyBsaWtlIHRoaXMKKworICAgICAgICAgICAgICAgICAgICAgICAgQVVUSF9SRVFfSURMRSAgICAgICAgICAgQVVUSF9XQUlUX1NFUTIgICAgICAgICAgICAgICAgICAgQVVUSF9XQUlUX1NFUTQKKyAgICBNVDJfTUxNRV9BVVRIX1JFUSAgIG1sbWVfYXV0aF9yZXFfYWN0aW9uICAgIGludmFsaWRfc3RhdGVfd2hlbl9hdXRoICAgICAgICAgIGludmFsaWRfc3RhdGVfd2hlbl9hdXRoCisgICAgTVQyX1BFRVJfQVVUSF9FVkVOICBkcm9wICAgICAgICAgICAgICAgICAgICBwZWVyX2F1dGhfZXZlbl9hdF9zZXEyX2FjdGlvbiAgICBwZWVyX2F1dGhfZXZlbl9hdF9zZXE0X2FjdGlvbgorICAgIE1UMl9BVVRIX1RJTUVPVVQgICAgRHJvcCAgICAgICAgICAgICAgICAgICAgYXV0aF90aW1lb3V0X2FjdGlvbiAgICAgICAgICAgICAgYXV0aF90aW1lb3V0X2FjdGlvbgorCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKwordm9pZCBBdXRoU3RhdGVNYWNoaW5lSW5pdCgKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBTVEFURV9NQUNISU5FICpTbSwKKyAgICBPVVQgU1RBVEVfTUFDSElORV9GVU5DIFRyYW5zW10pCit7CisgICAgU3RhdGVNYWNoaW5lSW5pdChTbSwgVHJhbnMsIE1BWF9BVVRIX1NUQVRFLCBNQVhfQVVUSF9NU0csIChTVEFURV9NQUNISU5FX0ZVTkMpRHJvcCwgQVVUSF9SRVFfSURMRSwgQVVUSF9NQUNISU5FX0JBU0UpOworCisgICAgLy8gdGhlIGZpcnN0IGNvbHVtbgorICAgIFN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgQVVUSF9SRVFfSURMRSwgTVQyX01MTUVfQVVUSF9SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpTWxtZUF1dGhSZXFBY3Rpb24pOworCisgICAgLy8gdGhlIHNlY29uZCBjb2x1bW4KKyAgICBTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIEFVVEhfV0FJVF9TRVEyLCBNVDJfTUxNRV9BVVRIX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylJbnZhbGlkU3RhdGVXaGVuQXV0aCk7CisgICAgU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBBVVRIX1dBSVRfU0VRMiwgTVQyX1BFRVJfQVVUSF9FVkVOLCAoU1RBVEVfTUFDSElORV9GVU5DKVBlZXJBdXRoUnNwQXRTZXEyQWN0aW9uKTsKKyAgICBTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIEFVVEhfV0FJVF9TRVEyLCBNVDJfQVVUSF9USU1FT1VULCAoU1RBVEVfTUFDSElORV9GVU5DKUF1dGhUaW1lb3V0QWN0aW9uKTsKKworICAgIC8vIHRoZSB0aGlyZCBjb2x1bW4KKyAgICBTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIEFVVEhfV0FJVF9TRVE0LCBNVDJfTUxNRV9BVVRIX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylJbnZhbGlkU3RhdGVXaGVuQXV0aCk7CisgICAgU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBBVVRIX1dBSVRfU0VRNCwgTVQyX1BFRVJfQVVUSF9FVkVOLCAoU1RBVEVfTUFDSElORV9GVU5DKVBlZXJBdXRoUnNwQXRTZXE0QWN0aW9uKTsKKyAgICBTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIEFVVEhfV0FJVF9TRVE0LCBNVDJfQVVUSF9USU1FT1VULCAoU1RBVEVfTUFDSElORV9GVU5DKUF1dGhUaW1lb3V0QWN0aW9uKTsKKworCVJUTVBJbml0VGltZXIocEFkLCAmcEFkLT5NbG1lQXV4LkF1dGhUaW1lciwgR0VUX1RJTUVSX0ZVTkNUSU9OKEF1dGhUaW1lb3V0KSwgcEFkLCBGQUxTRSk7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgZnVuY3Rpb24gdG8gYmUgZXhlY3V0ZWQgYXQgdGltZXIgdGhyZWFkIHdoZW4gYXV0aCB0aW1lciBleHBpcmVzCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgQXV0aFRpbWVvdXQoCisgICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorICAgIElOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKKyAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisgICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKQoreworICAgIFJUTVBfQURBUFRFUiAqcEFkID0gKFJUTVBfQURBUFRFUiAqKUZ1bmN0aW9uQ29udGV4dDsKKworICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQVVUSCAtIEF1dGhUaW1lb3V0XG4iKSk7CisKKwkvLyBEbyBub3RoaW5nIGlmIHRoZSBkcml2ZXIgaXMgc3RhcnRpbmcgaGFsdCBzdGF0ZS4KKwkvLyBUaGlzIG1pZ2h0IGhhcHBlbiB3aGVuIHRpbWVyIGFscmVhZHkgYmVlbiBmaXJlZCBiZWZvcmUgY2FuY2VsIHRpbWVyIHdpdGggbWxtZWhhbHQKKwlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKQorCQlyZXR1cm47CisKKwkvLyBzZW5kIGEgZGUtYXV0aCB0byByZXNldCBBUCdzIHN0YXRlIG1hY2hpbmUgKFBhdGNoIEFQLURpcjYzNSkKKwlpZiAocEFkLT5NbG1lLkF1dGhNYWNoaW5lLkN1cnJTdGF0ZSA9PSBBVVRIX1dBSVRfU0VRMikKKwkJQ2xzMmVyckFjdGlvbihwQWQsIHBBZC0+TWxtZUF1eC5Cc3NpZCk7CisKKworICAgIE1sbWVFbnF1ZXVlKHBBZCwgQVVUSF9TVEFURV9NQUNISU5FLCBNVDJfQVVUSF9USU1FT1VULCAwLCBOVUxMKTsKKyAgICBSVDI4WFhfTUxNRV9IQU5ETEVSKHBBZCk7Cit9CisKKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIE1sbWVBdXRoUmVxQWN0aW9uKAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKyAgICBVQ0hBUiAgICAgICAgICAgICAgQWRkcls2XTsKKyAgICBVU0hPUlQgICAgICAgICAgICAgQWxnLCBTZXEsIFN0YXR1czsKKyAgICBVTE9ORyAgICAgICAgICAgICAgVGltZW91dDsKKyAgICBIRUFERVJfODAyXzExICAgICAgQXV0aEhkcjsKKyAgICBCT09MRUFOICAgICAgICAgICAgVGltZXJDYW5jZWxsZWQ7CisgICAgTkRJU19TVEFUVVMgICAgICAgIE5TdGF0dXM7CisgICAgUFVDSEFSICAgICAgICAgICAgIHBPdXRCdWZmZXIgPSBOVUxMOworICAgIFVMT05HICAgICAgICAgICAgICBGcmFtZUxlbiA9IDA7CisKKwkvLyBCbG9jayBhbGwgYXV0aGVudGljYXRpb24gcmVxdWVzdCBkdXJuaW5nIFdQQSBibG9jayBwZXJpb2QKKwlpZiAocEFkLT5TdGFDZmcuYkJsb2NrQXNzb2MgPT0gVFJVRSkKKwl7CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFVVEggLSBCbG9jayBBdXRoIHJlcXVlc3QgZHVybmluZyBXUEEgYmxvY2sgcGVyaW9kIVxuIikpOworICAgICAgICBwQWQtPk1sbWUuQXV0aE1hY2hpbmUuQ3VyclN0YXRlID0gQVVUSF9SRVFfSURMRTsKKyAgICAgICAgU3RhdHVzID0gTUxNRV9TVEFURV9NQUNISU5FX1JFSkVDVDsKKyAgICAgICAgTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX0FVVEhfQ09ORiwgMiwgJlN0YXR1cyk7CisJfQorICAgIGVsc2UgaWYoTWxtZUF1dGhSZXFTYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbiwgQWRkciwgJlRpbWVvdXQsICZBbGcpKQorICAgIHsKKyAgICAgICAgLy8gcmVzZXQgdGltZXIKKyAgICAgICAgUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguQXV0aFRpbWVyLCAmVGltZXJDYW5jZWxsZWQpOworICAgICAgICBDT1BZX01BQ19BRERSKHBBZC0+TWxtZUF1eC5Cc3NpZCwgQWRkcik7CisgICAgICAgIHBBZC0+TWxtZUF1eC5BbGcgID0gQWxnOworICAgICAgICBTZXEgPSAxOworICAgICAgICBTdGF0dXMgPSBNTE1FX1NVQ0NFU1M7CisKKyAgICAgICAgTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKKyAgICAgICAgaWYoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorICAgICAgICB7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBVVRIIC0gTWxtZUF1dGhSZXFBY3Rpb24oQWxnOiVkKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkXG4iLCBBbGcpKTsKKyAgICAgICAgICAgIHBBZC0+TWxtZS5BdXRoTWFjaGluZS5DdXJyU3RhdGUgPSBBVVRIX1JFUV9JRExFOworICAgICAgICAgICAgU3RhdHVzID0gTUxNRV9GQUlMX05PX1JFU09VUkNFOworICAgICAgICAgICAgTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX0FVVEhfQ09ORiwgMiwgJlN0YXR1cyk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBVVRIIC0gU2VuZCBBVVRIIHJlcXVlc3Qgc2VxIzEgKEFsZz0lZCkuLi5cbiIsIEFsZykpOworICAgICAgICBNZ3RNYWNIZWFkZXJJbml0KHBBZCwgJkF1dGhIZHIsIFNVQlRZUEVfQVVUSCwgMCwgQWRkciwgcEFkLT5NbG1lQXV4LkJzc2lkKTsKKyAgICAgICAgTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICAgICZGcmFtZUxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEhFQURFUl84MDJfMTEpLCZBdXRoSGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgJkFsZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICZTZXEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAmU3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBFTkRfT0ZfQVJHUyk7CisgICAgICAgIE1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgMCwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOworICAgIAlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOworCisgICAgICAgIFJUTVBTZXRUaW1lcigmcEFkLT5NbG1lQXV4LkF1dGhUaW1lciwgVGltZW91dCk7CisgICAgICAgIHBBZC0+TWxtZS5BdXRoTWFjaGluZS5DdXJyU3RhdGUgPSBBVVRIX1dBSVRfU0VRMjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgREJHUFJJTlRfRVJSKCgiQVVUSCAtIE1sbWVBdXRoUmVxQWN0aW9uKCkgc2FuaXR5IGNoZWNrIGZhaWxlZFxuIikpOworICAgICAgICBwQWQtPk1sbWUuQXV0aE1hY2hpbmUuQ3VyclN0YXRlID0gQVVUSF9SRVFfSURMRTsKKyAgICAgICAgU3RhdHVzID0gTUxNRV9JTlZBTElEX0ZPUk1BVDsKKyAgICAgICAgTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX0FVVEhfQ09ORiwgMiwgJlN0YXR1cyk7CisgICAgfQorfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgUGVlckF1dGhSc3BBdFNlcTJBY3Rpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworICAgIFVDSEFSICAgICAgICAgQWRkcjJbTUFDX0FERFJfTEVOXTsKKyAgICBVU0hPUlQgICAgICAgIFNlcSwgU3RhdHVzLCBSZW1vdGVTdGF0dXMsIEFsZzsKKyAgICBVQ0hBUiAgICAgICAgIENobGdUZXh0W0NJUEhFUl9URVhUX0xFTl07CisgICAgVUNIQVIgICAgICAgICBDeXBlckNobGdUZXh0W0NJUEhFUl9URVhUX0xFTiArIDggKyA4XTsKKyAgICBVQ0hBUiAgICAgICAgIEVsZW1lbnRbMl07CisgICAgSEVBREVSXzgwMl8xMSBBdXRoSGRyOworICAgIEJPT0xFQU4gICAgICAgVGltZXJDYW5jZWxsZWQ7CisgICAgUFVDSEFSICAgICAgICBwT3V0QnVmZmVyID0gTlVMTDsKKyAgICBORElTX1NUQVRVUyAgIE5TdGF0dXM7CisgICAgVUxPTkcgICAgICAgICBGcmFtZUxlbiA9IDA7CisgICAgVVNIT1JUICAgICAgICBTdGF0dXMyOworCisgICAgaWYgKFBlZXJBdXRoU2FuaXR5KHBBZCwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4sIEFkZHIyLCAmQWxnLCAmU2VxLCAmU3RhdHVzLCBDaGxnVGV4dCkpCisgICAgeworICAgICAgICBpZiAoTUFDX0FERFJfRVFVQUwocEFkLT5NbG1lQXV4LkJzc2lkLCBBZGRyMikgJiYgU2VxID09IDIpCisgICAgICAgIHsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFVVEggLSBSZWNlaXZlIEFVVEhfUlNQIHNlcSMyIHRvIG1lIChBbGc9JWQsIFN0YXR1cz0lZClcbiIsIEFsZywgU3RhdHVzKSk7CisgICAgICAgICAgICBSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5BdXRoVGltZXIsICZUaW1lckNhbmNlbGxlZCk7CisKKyAgICAgICAgICAgIGlmIChTdGF0dXMgPT0gTUxNRV9TVUNDRVNTKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIEF1dGhlbnRpY2F0aW9uIE1vZGUgIkxFQVAiIGhhcyBhbGxvdyBmb3IgQ0NYIDEuWAorICAgICAgICAgICAgICAgIGlmICgocEFkLT5NbG1lQXV4LkFsZyA9PSBOZGlzODAyXzExQXV0aE1vZGVPcGVuKQorI2lmZGVmIExFQVBfU1VQUE9SVAorCQkJCQl8fCAocEFkLT5TdGFDZmcuTGVhcEF1dGhNb2RlID09IENJU0NPX0F1dGhNb2RlTEVBUCkKKyNlbmRpZiAvLyBMRUFQX1NVUFBPUlQgLy8KKwkJCQkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwQWQtPk1sbWUuQXV0aE1hY2hpbmUuQ3VyclN0YXRlID0gQVVUSF9SRVFfSURMRTsKKyNpZmRlZiBMRUFQX1NVUFBPUlQKKyAgICAgICAgICAgICAgICAgICAgcEFkLT5NbG1lLkxlYXBNYWNoaW5lLkN1cnJTdGF0ZSA9IExFQVBfSURMRTsKKyNlbmRpZiAvLyBMRUFQX1NVUFBPUlQgLy8KKyAgICAgICAgICAgICAgICAgICAgTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX0FVVEhfQ09ORiwgMiwgJlN0YXR1cyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIDIuIHNoYXJlZCBrZXksIG5lZWQgdG8gYmUgY2hhbGxlbmdlZAorICAgICAgICAgICAgICAgICAgICBTZXErKzsKKyAgICAgICAgICAgICAgICAgICAgUmVtb3RlU3RhdHVzID0gTUxNRV9TVUNDRVNTOworCisJCQkJCS8vIEdldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5CisgICAgICAgICAgICAgICAgICAgIE5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcik7CisgICAgICAgICAgICAgICAgICAgIGlmKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVVUSCAtIFBlZXJBdXRoUnNwQXRTZXEyQWN0aW9uKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBBZC0+TWxtZS5BdXRoTWFjaGluZS5DdXJyU3RhdGUgPSBBVVRIX1JFUV9JRExFOworICAgICAgICAgICAgICAgICAgICAgICAgU3RhdHVzMiA9IE1MTUVfRkFJTF9OT19SRVNPVVJDRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIE1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9BVVRIX0NPTkYsIDIsICZTdGF0dXMyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFVVEggLSBTZW5kIEFVVEggcmVxdWVzdCBzZXEjMy4uLlxuIikpOworICAgICAgICAgICAgICAgICAgICBNZ3RNYWNIZWFkZXJJbml0KHBBZCwgJkF1dGhIZHIsIFNVQlRZUEVfQVVUSCwgMCwgQWRkcjIsIHBBZC0+TWxtZUF1eC5Cc3NpZCk7CisgICAgICAgICAgICAgICAgICAgIEF1dGhIZHIuRkMuV2VwID0gMTsKKyAgICAgICAgICAgICAgICAgICAgLy8gRW5jcnlwdCBjaGFsbGVuZ2UgdGV4dCAmIGF1dGggaW5mb3JtYXRpb24KKyAgICAgICAgICAgICAgICAgICAgUlRNUEluaXRXZXBFbmdpbmUoCisgICAgICAgICAgICAgICAgICAgIAlwQWQsCisgICAgICAgICAgICAgICAgICAgIAlwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLktleSwKKyAgICAgICAgICAgICAgICAgICAgCXBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCwKKyAgICAgICAgICAgICAgICAgICAgCXBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uS2V5TGVuLAorICAgICAgICAgICAgICAgICAgICAJQ3lwZXJDaGxnVGV4dCk7CisKKwkJCQkJQWxnID0gY3B1MmxlMTYoKihVU0hPUlQgKikmQWxnKTsKKwkJCQkJU2VxID0gY3B1MmxlMTYoKihVU0hPUlQgKikmU2VxKTsKKwkJCQkJUmVtb3RlU3RhdHVzPSBjcHUybGUxNigqKFVTSE9SVCAqKSZSZW1vdGVTdGF0dXMpOworCisJCQkJCVJUTVBFbmNyeXB0RGF0YShwQWQsIChQVUNIQVIpICZBbGcsIEN5cGVyQ2hsZ1RleHQgKyA0LCAyKTsKKwkJCQkJUlRNUEVuY3J5cHREYXRhKHBBZCwgKFBVQ0hBUikgJlNlcSwgQ3lwZXJDaGxnVGV4dCArIDYsIDIpOworCQkJCQlSVE1QRW5jcnlwdERhdGEocEFkLCAoUFVDSEFSKSAmUmVtb3RlU3RhdHVzLCBDeXBlckNobGdUZXh0ICsgOCwgMik7CisJCQkJCUVsZW1lbnRbMF0gPSAxNjsKKwkJCQkJRWxlbWVudFsxXSA9IDEyODsKKwkJCQkJUlRNUEVuY3J5cHREYXRhKHBBZCwgRWxlbWVudCwgQ3lwZXJDaGxnVGV4dCArIDEwLCAyKTsKKwkJCQkJUlRNUEVuY3J5cHREYXRhKHBBZCwgQ2hsZ1RleHQsIEN5cGVyQ2hsZ1RleHQgKyAxMiwgMTI4KTsKKwkJCQkJUlRNUFNldElDVihwQWQsIEN5cGVyQ2hsZ1RleHQgKyAxNDApOworICAgICAgICAgICAgICAgICAgICBNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAgICAgICAgICAgICAgICZGcmFtZUxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEhFQURFUl84MDJfMTEpLCAgICAmQXV0aEhkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0lQSEVSX1RFWFRfTEVOICsgMTYsICAgICBDeXBlckNobGdUZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkRfT0ZfQVJHUyk7CisgICAgICAgICAgICAgICAgICAgIE1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgMCwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOworICAgICAgICAgICAgICAgIAlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOworCisgICAgICAgICAgICAgICAgICAgIFJUTVBTZXRUaW1lcigmcEFkLT5NbG1lQXV4LkF1dGhUaW1lciwgQVVUSF9USU1FT1VUKTsKKyAgICAgICAgICAgICAgICAgICAgcEFkLT5NbG1lLkF1dGhNYWNoaW5lLkN1cnJTdGF0ZSA9IEFVVEhfV0FJVF9TRVE0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyNpZmRlZiBMRUFQX1NVUFBPUlQKKyAgICAgICAgICAgICAgICBpZiAocEFkLT5TdGFDZmcuTGVhcEF1dGhNb2RlID09IENJU0NPX0F1dGhNb2RlTEVBUCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vSW52YWxpZCBBdXRoZW50aWNhdGlvbiBwb3NzaWJsZSByb2d1ZSBBUAorICAgICAgICAgICAgICAgICAgICAvL0FkZCB0aGlzIEFwIHRvIFJvZ3VlIEFQLgorICAgICAgICAgICAgICAgICAgICBSb2d1ZUFwVGFibGVTZXRFbnRyeShwQWQsICZwQWQtPlN0YUNmZy5Sb2d1ZUFwVGFiLCBBZGRyMiwgTEVBUF9SRUFTT05fSU5WQUxJRF9BVVRIKTsKKwkJCQl9CisjZW5kaWYgLy8gTEVBUF9TVVBQT1JUIC8vCisgICAgICAgICAgICAgICAgcEFkLT5TdGFDZmcuQXV0aEZhaWxSZWFzb24gPSBTdGF0dXM7CisgICAgICAgICAgICAgICAgQ09QWV9NQUNfQUREUihwQWQtPlN0YUNmZy5BdXRoRmFpbFN0YSwgQWRkcjIpOworICAgICAgICAgICAgICAgIHBBZC0+TWxtZS5BdXRoTWFjaGluZS5DdXJyU3RhdGUgPSBBVVRIX1JFUV9JRExFOworICAgICAgICAgICAgICAgIE1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9BVVRIX0NPTkYsIDIsICZTdGF0dXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFVVEggLSBQZWVyQXV0aFNhbml0eSgpIHNhbml0eSBjaGVjayBmYWlsXG4iKSk7CisgICAgfQorfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgUGVlckF1dGhSc3BBdFNlcTRBY3Rpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworICAgIFVDSEFSICAgICAgICAgQWRkcjJbTUFDX0FERFJfTEVOXTsKKyAgICBVU0hPUlQgICAgICAgIEFsZywgU2VxLCBTdGF0dXM7CisgICAgQ0hBUiAgICAgICAgICBDaGxnVGV4dFtDSVBIRVJfVEVYVF9MRU5dOworICAgIEJPT0xFQU4gICAgICAgVGltZXJDYW5jZWxsZWQ7CisKKyAgICBpZihQZWVyQXV0aFNhbml0eShwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuLCBBZGRyMiwgJkFsZywgJlNlcSwgJlN0YXR1cywgQ2hsZ1RleHQpKQorICAgIHsKKyAgICAgICAgaWYoTUFDX0FERFJfRVFVQUwocEFkLT5NbG1lQXV4LkJzc2lkLCBBZGRyMikgJiYgU2VxID09IDQpCisgICAgICAgIHsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFVVEggLSBSZWNlaXZlIEFVVEhfUlNQIHNlcSM0IHRvIG1lXG4iKSk7CisgICAgICAgICAgICBSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5BdXRoVGltZXIsICZUaW1lckNhbmNlbGxlZCk7CisKKyAgICAgICAgICAgIGlmIChTdGF0dXMgIT0gTUxNRV9TVUNDRVNTKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBBZC0+U3RhQ2ZnLkF1dGhGYWlsUmVhc29uID0gU3RhdHVzOworICAgICAgICAgICAgICAgIENPUFlfTUFDX0FERFIocEFkLT5TdGFDZmcuQXV0aEZhaWxTdGEsIEFkZHIyKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcEFkLT5NbG1lLkF1dGhNYWNoaW5lLkN1cnJTdGF0ZSA9IEFVVEhfUkVRX0lETEU7CisgICAgICAgICAgICBNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfQVVUSF9DT05GLCAyLCAmU3RhdHVzKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBVVRIIC0gUGVlckF1dGhSc3BBdFNlcTRBY3Rpb24oKSBzYW5pdHkgY2hlY2sgZmFpbFxuIikpOworICAgIH0KK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIE1sbWVEZWF1dGhSZXFBY3Rpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworICAgIE1MTUVfREVBVVRIX1JFUV9TVFJVQ1QgKnBJbmZvOworICAgIEhFQURFUl84MDJfMTEgRGVhdXRoSGRyOworICAgIFBVQ0hBUiAgICAgICAgcE91dEJ1ZmZlciA9IE5VTEw7CisgICAgTkRJU19TVEFUVVMgICBOU3RhdHVzOworICAgIFVMT05HICAgICAgICAgRnJhbWVMZW4gPSAwOworICAgIFVTSE9SVCAgICAgICAgU3RhdHVzOworCisgICAgcEluZm8gPSAoTUxNRV9ERUFVVEhfUkVRX1NUUlVDVCAqKUVsZW0tPk1zZzsKKworICAgIE5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5CisgICAgaWYgKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFVVEggLSBNbG1lRGVhdXRoUmVxQWN0aW9uKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxcbiIpKTsKKyAgICAgICAgcEFkLT5NbG1lLkF1dGhNYWNoaW5lLkN1cnJTdGF0ZSA9IEFVVEhfUkVRX0lETEU7CisgICAgICAgIFN0YXR1cyA9IE1MTUVfRkFJTF9OT19SRVNPVVJDRTsKKyAgICAgICAgTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX0RFQVVUSF9DT05GLCAyLCAmU3RhdHVzKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFVVEggLSBTZW5kIERFLUFVVEggcmVxdWVzdCAoUmVhc29uPSVkKS4uLlxuIiwgcEluZm8tPlJlYXNvbikpOworICAgIE1ndE1hY0hlYWRlckluaXQocEFkLCAmRGVhdXRoSGRyLCBTVUJUWVBFX0RFQVVUSCwgMCwgcEluZm8tPkFkZHIsIHBBZC0+TWxtZUF1eC5Cc3NpZCk7CisgICAgTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICAgICZGcmFtZUxlbiwKKyAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoSEVBREVSXzgwMl8xMSksJkRlYXV0aEhkciwKKyAgICAgICAgICAgICAgICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgJnBJbmZvLT5SZWFzb24sCisgICAgICAgICAgICAgICAgICAgICAgRU5EX09GX0FSR1MpOworICAgIE1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgMCwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOworCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7CisKKyAgICBwQWQtPlN0YUNmZy5EZWF1dGhSZWFzb24gPSBwSW5mby0+UmVhc29uOworICAgIENPUFlfTUFDX0FERFIocEFkLT5TdGFDZmcuRGVhdXRoU3RhLCBwSW5mby0+QWRkcik7CisgICAgcEFkLT5NbG1lLkF1dGhNYWNoaW5lLkN1cnJTdGF0ZSA9IEFVVEhfUkVRX0lETEU7CisgICAgU3RhdHVzID0gTUxNRV9TVUNDRVNTOworICAgIE1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9ERUFVVEhfQ09ORiwgMiwgJlN0YXR1cyk7CisKKwkvLyBzZW5kIHdpcmVsZXNzIGV2ZW50IC0gZm9yIGRlYXV0aGVudGljYXRpb24KKwlpZiAocEFkLT5Db21tb25DZmcuYldpcmVsZXNzRXZlbnQpCisJCVJUTVBTZW5kV2lyZWxlc3NFdmVudChwQWQsIElXX0RFQVVUSF9FVkVOVF9GTEFHLCBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkFkZHIsIEJTUzAsIDApOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgQXV0aFRpbWVvdXRBY3Rpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworICAgIFVTSE9SVCBTdGF0dXM7CisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVVUSCAtIEF1dGhUaW1lb3V0QWN0aW9uXG4iKSk7CisgICAgcEFkLT5NbG1lLkF1dGhNYWNoaW5lLkN1cnJTdGF0ZSA9IEFVVEhfUkVRX0lETEU7CisgICAgU3RhdHVzID0gTUxNRV9SRUpfVElNRU9VVDsKKyAgICBNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfQVVUSF9DT05GLCAyLCAmU3RhdHVzKTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIEludmFsaWRTdGF0ZVdoZW5BdXRoKAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKyAgICBVU0hPUlQgU3RhdHVzOworICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFVVEggLSBJbnZhbGlkU3RhdGVXaGVuQXV0aCAoc3RhdGU9JWxkKSwgcmVzZXQgQVVUSCBzdGF0ZSBtYWNoaW5lXG4iLCBwQWQtPk1sbWUuQXV0aE1hY2hpbmUuQ3VyclN0YXRlKSk7CisgICAgcEFkLT5NbG1lLkF1dGhNYWNoaW5lLkN1cnJTdGF0ZSA9IEFVVEhfUkVRX0lETEU7CisgICAgU3RhdHVzID0gTUxNRV9TVEFURV9NQUNISU5FX1JFSkVDVDsKKyAgICBNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfQVVUSF9DT05GLCAyLCAmU3RhdHVzKTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTb21lIFNUQS9BUAorICAgIE5vdGU6CisgICAgICAgIFRoaXMgYWN0aW9uIHNob3VsZCBuZXZlciB0cmlnZ2VyIEFVVEggc3RhdGUgdHJhbnNpdGlvbiwgdGhlcmVmb3JlIHdlCisgICAgICAgIHNlcGFyYXRlIGl0IGZyb20gQVVUSCBzdGF0ZSBtYWNoaW5lLCBhbmQgbWFrZSBpdCBhcyBhIHN0YW5kYWxvbmUgc2VydmljZQorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIENsczJlcnJBY3Rpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gUFVDSEFSIHBBZGRyKQoreworICAgIEhFQURFUl84MDJfMTEgRGVhdXRoSGRyOworICAgIFBVQ0hBUiAgICAgICAgcE91dEJ1ZmZlciA9IE5VTEw7CisgICAgTkRJU19TVEFUVVMgICBOU3RhdHVzOworICAgIFVMT05HICAgICAgICAgRnJhbWVMZW4gPSAwOworICAgIFVTSE9SVCAgICAgICAgUmVhc29uID0gUkVBU09OX0NMUzJFUlI7CisKKyAgICBOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOyAgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQorICAgIGlmIChOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisgICAgICAgIHJldHVybjsKKworICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFVVEggLSBDbGFzcyAyIGVycm9yLCBTZW5kIERFQVVUSCBmcmFtZS4uLlxuIikpOworICAgIE1ndE1hY0hlYWRlckluaXQocEFkLCAmRGVhdXRoSGRyLCBTVUJUWVBFX0RFQVVUSCwgMCwgcEFkZHIsIHBBZC0+TWxtZUF1eC5Cc3NpZCk7CisgICAgTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICAgICZGcmFtZUxlbiwKKyAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoSEVBREVSXzgwMl8xMSksJkRlYXV0aEhkciwKKyAgICAgICAgICAgICAgICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgJlJlYXNvbiwKKyAgICAgICAgICAgICAgICAgICAgICBFTkRfT0ZfQVJHUyk7CisgICAgTWluaXBvcnRNTVJlcXVlc3QocEFkLCAwLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7CisJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKKworICAgIHBBZC0+U3RhQ2ZnLkRlYXV0aFJlYXNvbiA9IFJlYXNvbjsKKyAgICBDT1BZX01BQ19BRERSKHBBZC0+U3RhQ2ZnLkRlYXV0aFN0YSwgcEFkZHIpOworfQorCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3RhL2F1dGhfcnNwLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3N0YS9hdXRoX3JzcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3YWE0YjkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3N0YS9hdXRoX3JzcC5jCkBAIC0wLDAgKzEsMTY3IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCU1vZHVsZSBOYW1lOgorCWF1dGhfcnNwLmMKKworCUFic3RyYWN0OgorCisJUmV2aXNpb24gSGlzdG9yeToKKwlXaG8JCQlXaGVuCQkJV2hhdAorCS0tLS0tLS0tCS0tLS0tLS0tLS0JCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlKb2huCQkyMDA0LTEwLTEJCWNvcHkgZnJvbSBSVDI1NjAKKyovCisjaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgYXV0aGVudGljYXRpb24gc3RhdGUgbWFjaGluZSBpbml0IHByb2NlZHVyZQorICAgIFBhcmFtZXRlcnM6CisgICAgICAgIFNtIC0gdGhlIHN0YXRlIG1hY2hpbmUKKworCUlSUUwgPSBQQVNTSVZFX0xFVkVMCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIEF1dGhSc3BTdGF0ZU1hY2hpbmVJbml0KAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIFBTVEFURV9NQUNISU5FIFNtLAorICAgIElOIFNUQVRFX01BQ0hJTkVfRlVOQyBUcmFuc1tdKQoreworICAgIFN0YXRlTWFjaGluZUluaXQoU20sIFRyYW5zLCBNQVhfQVVUSF9SU1BfU1RBVEUsIE1BWF9BVVRIX1JTUF9NU0csIChTVEFURV9NQUNISU5FX0ZVTkMpRHJvcCwgQVVUSF9SU1BfSURMRSwgQVVUSF9SU1BfTUFDSElORV9CQVNFKTsKKworICAgIC8vIGNvbHVtbiAxCisgICAgU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBBVVRIX1JTUF9JRExFLCBNVDJfUEVFUl9ERUFVVEgsIChTVEFURV9NQUNISU5FX0ZVTkMpUGVlckRlYXV0aEFjdGlvbik7CisKKyAgICAvLyBjb2x1bW4gMgorICAgIFN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgQVVUSF9SU1BfV0FJVF9DSEFMLCBNVDJfUEVFUl9ERUFVVEgsIChTVEFURV9NQUNISU5FX0ZVTkMpUGVlckRlYXV0aEFjdGlvbik7CisKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgUGVlckF1dGhTaW1wbGVSc3BHZW5BbmRTZW5kKAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIFBIRUFERVJfODAyXzExIHBIZHI4MDIxMSwKKyAgICBJTiBVU0hPUlQgQWxnLAorICAgIElOIFVTSE9SVCBTZXEsCisgICAgSU4gVVNIT1JUIFJlYXNvbiwKKyAgICBJTiBVU0hPUlQgU3RhdHVzKQoreworICAgIEhFQURFUl84MDJfMTEgICAgIEF1dGhIZHI7CisgICAgVUxPTkcgICAgICAgICAgICAgRnJhbWVMZW4gPSAwOworICAgIFBVQ0hBUiAgICAgICAgICAgIHBPdXRCdWZmZXIgPSBOVUxMOworICAgIE5ESVNfU1RBVFVTICAgICAgIE5TdGF0dXM7CisKKyAgICBpZiAoUmVhc29uICE9IE1MTUVfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXIgQVVUSCBmYWlsLi4uXG4iKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKwkvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5CisgICAgTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsKKyAgICBpZiAoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorICAgICAgICByZXR1cm47CisKKyAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZW5kIEFVVEggcmVzcG9uc2UgKHNlcSMyKS4uLlxuIikpOworICAgIE1ndE1hY0hlYWRlckluaXQocEFkLCAmQXV0aEhkciwgU1VCVFlQRV9BVVRILCAwLCBwSGRyODAyMTEtPkFkZHIyLCBwQWQtPk1sbWVBdXguQnNzaWQpOworICAgIE1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAgICAgICAgJkZyYW1lTGVuLAorICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihIRUFERVJfODAyXzExKSwgICAgJkF1dGhIZHIsCisgICAgICAgICAgICAgICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICAgICAmQWxnLAorICAgICAgICAgICAgICAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAgICAgJlNlcSwKKyAgICAgICAgICAgICAgICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgICAgICZSZWFzb24sCisgICAgICAgICAgICAgICAgICAgICAgRU5EX09GX0FSR1MpOworICAgIE1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgMCwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOworCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIFBlZXJEZWF1dGhBY3Rpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gUE1MTUVfUVVFVUVfRUxFTSBFbGVtKQoreworICAgIFVDSEFSICAgICAgIEFkZHIyW01BQ19BRERSX0xFTl07CisgICAgVVNIT1JUICAgICAgUmVhc29uOworCisgICAgaWYgKFBlZXJEZWF1dGhTYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbiwgQWRkcjIsICZSZWFzb24pKQorICAgIHsKKyAgICAgICAgaWYgKElORlJBX09OKHBBZCkgJiYgTUFDX0FERFJfRVFVQUwoQWRkcjIsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKSkKKyAgICAgICAgeworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJBVVRIX1JTUCAtIHJlY2VpdmUgREUtQVVUSCBmcm9tIG91ciBBUCAoUmVhc29uPSVkKVxuIiwgUmVhc29uKSk7CisKKworI2lmZGVmIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdW5pb24gaXdyZXFfZGF0YSAgICB3cnF1OworICAgICAgICAgICAgICAgIG1lbXNldCh3cnF1LmFwX2FkZHIuc2FfZGF0YSwgMCwgTUFDX0FERFJfTEVOKTsKKyAgICAgICAgICAgICAgICB3aXJlbGVzc19zZW5kX2V2ZW50KHBBZC0+bmV0X2RldiwgU0lPQ0dJV0FQLCAmd3JxdSwgTlVMTCk7CisgICAgICAgICAgICB9CisjZW5kaWYgLy8gTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKworCisJCQkvLyBzZW5kIHdpcmVsZXNzIGV2ZW50IC0gZm9yIGRlYXV0aGVudGljYXRpb24KKwkJCWlmIChwQWQtPkNvbW1vbkNmZy5iV2lyZWxlc3NFdmVudCkKKwkJCQlSVE1QU2VuZFdpcmVsZXNzRXZlbnQocEFkLCBJV19ERUFVVEhfRVZFTlRfRkxBRywgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5BZGRyLCBCU1MwLCAwKTsKKworICAgICAgICAgICAgTGlua0Rvd24ocEFkLCBUUlVFKTsKKworICAgICAgICAgICAgLy8gQXV0aGVudGljYXRpb24gTW9kZSBDaXNjb19MRUFQIGhhcyBzdGFydCBhIHRpbWVyCisgICAgICAgICAgICAvLyBXZSBzaG91bGQgY2FuY2VsIGl0IGlmIHVzaW5nIExFQVAKKyNpZmRlZiBMRUFQX1NVUFBPUlQKKyAgICAgICAgICAgIGlmIChwQWQtPlN0YUNmZy5MZWFwQXV0aE1vZGUgPT0gQ0lTQ09fQXV0aE1vZGVMRUFQKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFJUTVBDYW5jZWxUaW1lcigmcEFkLT5TdGFDZmcuTGVhcEF1dGhUaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKKyAgICAgICAgICAgICAgICAvL0NoZWNrIGlzIGl0IG1hY2ggdGhlIExFQVAgQXV0aGVudGljYXRpb24gZmFpbGVkIGFzIHBvc3NpYmxlIGEgUm9ndWUgQVAKKyAgICAgICAgICAgICAgICAvL29uIGl0J3MgUG9ydFNlY3VyZWQgbm90IGVxdWFsIHRvIFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEIHdoaWxlIHByb2Nlc3MgdGhlIEF1dGhlbnRpY2F0b24uCisgICAgICAgICAgICAgICAgaWYgKChwQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZCAhPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRCkgJiYgKHBBZC0+TWxtZS5MZWFwTWFjaGluZS5DdXJyU3RhdGUgIT0gTEVBUF9JRExFKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFJvZ3VlQXBUYWJsZVNldEVudHJ5KHBBZCwgJnBBZC0+U3RhQ2ZnLlJvZ3VlQXBUYWIsIEFkZHIyLCBMRUFQX1JFQVNPTl9BVVRIX1RJTUVPVVQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyNlbmRpZiAvLyBMRUFQX1NVUFBPUlQgLy8KKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkFVVEhfUlNQIC0gUGVlckRlYXV0aEFjdGlvbigpIHNhbml0eSBjaGVjayBmYWlsXG4iKSk7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3N0YS9jb25uZWN0LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3N0YS9jb25uZWN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZmMjhmOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3RhL2Nvbm5lY3QuYwpAQCAtMCwwICsxLDI3NTEgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJTW9kdWxlIE5hbWU6CisJY29ubmVjdC5jCisKKwlBYnN0cmFjdDoKKworCVJldmlzaW9uIEhpc3Rvcnk6CisJV2hvCQkJV2hlbgkJCVdoYXQKKwktLS0tLS0tLQktLS0tLS0tLS0tCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJSm9obgkJCTIwMDQtMDgtMDgJCQlNYWpvciBtb2RpZmljYXRpb24gZnJvbSBSVDI1NjAKKyovCisjaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCisKK1VDSEFSCUNpcGhlclN1aXRlV3BhTm9uZVRraXBbXSA9IHsKKwkJMHgwMCwgMHg1MCwgMHhmMiwgMHgwMSwJLy8gb3VpCisJCTB4MDEsIDB4MDAsCQkJCS8vIFZlcnNpb24KKwkJMHgwMCwgMHg1MCwgMHhmMiwgMHgwMiwJLy8gTXVsdGljYXN0CisJCTB4MDEsIDB4MDAsCQkJCS8vIE51bWJlciBvZiB1bmljYXN0CisJCTB4MDAsIDB4NTAsIDB4ZjIsIDB4MDIsCS8vIHVuaWNhc3QKKwkJMHgwMSwgMHgwMCwJCQkJLy8gbnVtYmVyIG9mIGF1dGhlbnRpY2F0aW9uIG1ldGhvZAorCQkweDAwLCAweDUwLCAweGYyLCAweDAwCS8vIGF1dGhlbnRpY2F0aW9uCisJCX07CitVQ0hBUglDaXBoZXJTdWl0ZVdwYU5vbmVUa2lwTGVuID0gKHNpemVvZihDaXBoZXJTdWl0ZVdwYU5vbmVUa2lwKSAvIHNpemVvZihVQ0hBUikpOworCitVQ0hBUglDaXBoZXJTdWl0ZVdwYU5vbmVBZXNbXSA9IHsKKwkJMHgwMCwgMHg1MCwgMHhmMiwgMHgwMSwJLy8gb3VpCisJCTB4MDEsIDB4MDAsCQkJCS8vIFZlcnNpb24KKwkJMHgwMCwgMHg1MCwgMHhmMiwgMHgwNCwJLy8gTXVsdGljYXN0CisJCTB4MDEsIDB4MDAsCQkJCS8vIE51bWJlciBvZiB1bmljYXN0CisJCTB4MDAsIDB4NTAsIDB4ZjIsIDB4MDQsCS8vIHVuaWNhc3QKKwkJMHgwMSwgMHgwMCwJCQkJLy8gbnVtYmVyIG9mIGF1dGhlbnRpY2F0aW9uIG1ldGhvZAorCQkweDAwLCAweDUwLCAweGYyLCAweDAwCS8vIGF1dGhlbnRpY2F0aW9uCisJCX07CitVQ0hBUglDaXBoZXJTdWl0ZVdwYU5vbmVBZXNMZW4gPSAoc2l6ZW9mKENpcGhlclN1aXRlV3BhTm9uZUFlcykgLyBzaXplb2YoVUNIQVIpKTsKKworLy8gVGhlIGZvbGxvd2luZyBNQUNSTyBpcyBjYWxsZWQgYWZ0ZXIgMS4gc3RhcnRpbmcgYW4gbmV3IElCU1MsIDIuIHN1Y2Nlc2Z1bGx5IEpPSU4gYW4gSUJTUywKKy8vIG9yIDMuIHN1Y2Nlc2Z1bGx5IEFTU09DSUFURSB0byBhIEJTUywgNC4gc3VjY2Vzc2Z1bGx5IFJFX0FTU09DSUFURSB0byBhIEJTUworLy8gQWxsIHNldHRpbmdzIHN1Y2Nlc3NmdWx5IG5lZ290aWF0ZWQgZnVyaW5nIE1MTUUgc3RhdGUgbWFjaGluZXMgYmVjb21lIGZpbmFsIHNldHRpbmdzCisvLyBhbmQgYXJlIGNvcGllZCB0byBwQWQtPlN0YUFjdGl2ZQorI2RlZmluZSBDT1BZX1NFVFRJTkdTX0ZST01fTUxNRV9BVVhfVE9fQUNUSVZFX0NGRyhfcEFkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJKF9wQWQpLT5Db21tb25DZmcuU3NpZExlbiA9IChfcEFkKS0+TWxtZUF1eC5Tc2lkTGVuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCU5kaXNNb3ZlTWVtb3J5KChfcEFkKS0+Q29tbW9uQ2ZnLlNzaWQsIChfcEFkKS0+TWxtZUF1eC5Tc2lkLCAoX3BBZCktPk1sbWVBdXguU3NpZExlbik7IFwKKwlDT1BZX01BQ19BRERSKChfcEFkKS0+Q29tbW9uQ2ZnLkJzc2lkLCAoX3BBZCktPk1sbWVBdXguQnNzaWQpOyAgICAgICAgICAgICAgICAgICAgICBcCisJKF9wQWQpLT5Db21tb25DZmcuQ2hhbm5lbCA9IChfcEFkKS0+TWxtZUF1eC5DaGFubmVsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCShfcEFkKS0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsID0gKF9wQWQpLT5NbG1lQXV4LkNlbnRyYWxDaGFubmVsOyAgICAgICAgICAgICAgICAgIFwKKwkoX3BBZCktPlN0YUFjdGl2ZS5BaWQgPSAoX3BBZCktPk1sbWVBdXguQWlkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJKF9wQWQpLT5TdGFBY3RpdmUuQXRpbVdpbiA9IChfcEFkKS0+TWxtZUF1eC5BdGltV2luOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCShfcEFkKS0+U3RhQWN0aXZlLkNhcGFiaWxpdHlJbmZvID0gKF9wQWQpLT5NbG1lQXV4LkNhcGFiaWxpdHlJbmZvOyAgICAgICAgICAgICAgICAgIFwKKwkoX3BBZCktPkNvbW1vbkNmZy5CZWFjb25QZXJpb2QgPSAoX3BBZCktPk1sbWVBdXguQmVhY29uUGVyaW9kOyAgICAgICAgICAgICAgICAgICAgICBcCisJKF9wQWQpLT5TdGFBY3RpdmUuQ2ZwTWF4RHVyYXRpb24gPSAoX3BBZCktPk1sbWVBdXguQ2ZwTWF4RHVyYXRpb247ICAgICAgICAgICAgICAgICAgXAorCShfcEFkKS0+U3RhQWN0aXZlLkNmcFBlcmlvZCA9IChfcEFkKS0+TWxtZUF1eC5DZnBQZXJpb2Q7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkoX3BBZCktPlN0YUFjdGl2ZS5TdXBSYXRlTGVuID0gKF9wQWQpLT5NbG1lQXV4LlN1cFJhdGVMZW47ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJTmRpc01vdmVNZW1vcnkoKF9wQWQpLT5TdGFBY3RpdmUuU3VwUmF0ZSwgKF9wQWQpLT5NbG1lQXV4LlN1cFJhdGUsIChfcEFkKS0+TWxtZUF1eC5TdXBSYXRlTGVuKTtcCisJKF9wQWQpLT5TdGFBY3RpdmUuRXh0UmF0ZUxlbiA9IChfcEFkKS0+TWxtZUF1eC5FeHRSYXRlTGVuOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCU5kaXNNb3ZlTWVtb3J5KChfcEFkKS0+U3RhQWN0aXZlLkV4dFJhdGUsIChfcEFkKS0+TWxtZUF1eC5FeHRSYXRlLCAoX3BBZCktPk1sbWVBdXguRXh0UmF0ZUxlbik7XAorCU5kaXNNb3ZlTWVtb3J5KCYoX3BBZCktPkNvbW1vbkNmZy5BUEVkY2FQYXJtLCAmKF9wQWQpLT5NbG1lQXV4LkFQRWRjYVBhcm0sIHNpemVvZihFRENBX1BBUk0pKTtcCisJTmRpc01vdmVNZW1vcnkoJihfcEFkKS0+Q29tbW9uQ2ZnLkFQUW9zQ2FwYWJpbGl0eSwgJihfcEFkKS0+TWxtZUF1eC5BUFFvc0NhcGFiaWxpdHksIHNpemVvZihRT1NfQ0FQQUJJTElUWV9QQVJNKSk7XAorCU5kaXNNb3ZlTWVtb3J5KCYoX3BBZCktPkNvbW1vbkNmZy5BUFFic3NMb2FkLCAmKF9wQWQpLT5NbG1lQXV4LkFQUWJzc0xvYWQsIHNpemVvZihRQlNTX0xPQURfUEFSTSkpO1wKKwlDT1BZX01BQ19BRERSKChfcEFkKS0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQWRkciwgKF9wQWQpLT5NbG1lQXV4LkJzc2lkKTsgICAgICBcCisJKF9wQWQpLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5BaWQgPSAoX3BBZCktPk1sbWVBdXguQWlkOyAgICAgICAgICAgICAgICAgICAgICAgXAorCShfcEFkKS0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUGFpcndpc2VLZXkuQ2lwaGVyQWxnID0gKF9wQWQpLT5TdGFDZmcuUGFpckNpcGhlcjtcCisJQ09QWV9NQUNfQUREUigoX3BBZCktPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlBhaXJ3aXNlS2V5LkJzc0lkLCAoX3BBZCktPk1sbWVBdXguQnNzaWQpO1wKKwkoX3BBZCktPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlJhdGVMZW4gPSAoX3BBZCktPlN0YUFjdGl2ZS5TdXBSYXRlTGVuICsgKF9wQWQpLT5TdGFBY3RpdmUuRXh0UmF0ZUxlbjtcCit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKworCUlSUUwgPSBQQVNTSVZFX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgTWxtZUNudGxJbml0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFNUQVRFX01BQ0hJTkUgKlMsCisJT1VUIFNUQVRFX01BQ0hJTkVfRlVOQyBUcmFuc1tdKQoreworCS8vIENvbnRyb2wgc3RhdGUgbWFjaGluZSBkaWZmZXJzIGZyb20gb3RoZXIgc3RhdGUgbWFjaGluZXMsIHRoZSBpbnRlcmZhY2UKKwkvLyBmb2xsb3dzIHRoZSBzdGFuZGFyZCBpbnRlcmZhY2UKKwlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9JRExFOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBNbG1lQ250bE1hY2hpbmVQZXJmb3JtQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFNUQVRFX01BQ0hJTkUgKlMsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCXN3aXRjaChwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlKQorCXsKKwkJY2FzZSBDTlRMX0lETEU6CisJCQl7CisJCQkJQ250bElkbGVQcm9jKHBBZCwgRWxlbSk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBDTlRMX1dBSVRfRElTQVNTT0M6CisJCQlDbnRsV2FpdERpc2Fzc29jUHJvYyhwQWQsIEVsZW0pOworCQkJYnJlYWs7CisJCWNhc2UgQ05UTF9XQUlUX0pPSU46CisJCQlDbnRsV2FpdEpvaW5Qcm9jKHBBZCwgRWxlbSk7CisJCQlicmVhazsKKworCQkvLyBDTlRMX1dBSVRfUkVBU1NPQyBpcyB0aGUgb25seSBzdGF0ZSBpbiBDTlRMIG1hY2hpbmUgdGhhdCBkb2VzCisJCS8vIG5vdCB0cmlnZ2VyZWQgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSBieSAiUlRNUFNldEluZm9ybWF0aW9uKE9JRF94eHgpIi4KKwkJLy8gVGhlcmVmb3JlIG5vdCBwcm90ZWN0ZWQgYnkgTkRJUydzICJvbmx5IG9uZSBvdXRzdGFuZGluZyBPSUQgcmVxdWVzdCIKKwkJLy8gcnVsZS4gV2hpY2ggbWVhbnMgTkRJUyBtYXkgU0VUIE9JRCBpbiB0aGUgbWlkZGxlIG9mIFJPQU1pbmcgYXR0ZW1wdHMuCisJCS8vIEN1cnJlbnQgYXBwcm9hY2ggaXMgdG8gYmxvY2sgbmV3IFNFVCByZXF1ZXN0IGF0IFJUTVBTZXRJbmZvcm1hdGlvbigpCisJCS8vIHdoZW4gQ250bE1hY2hpbmUuQ3VyclN0YXRlIGlzIG5vdCBDTlRMX0lETEUKKwkJY2FzZSBDTlRMX1dBSVRfUkVBU1NPQzoKKwkJCUNudGxXYWl0UmVhc3NvY1Byb2MocEFkLCBFbGVtKTsKKwkJCWJyZWFrOworCisJCWNhc2UgQ05UTF9XQUlUX1NUQVJUOgorCQkJQ250bFdhaXRTdGFydFByb2MocEFkLCBFbGVtKTsKKwkJCWJyZWFrOworCQljYXNlIENOVExfV0FJVF9BVVRIOgorCQkJQ250bFdhaXRBdXRoUHJvYyhwQWQsIEVsZW0pOworCQkJYnJlYWs7CisJCWNhc2UgQ05UTF9XQUlUX0FVVEgyOgorCQkJQ250bFdhaXRBdXRoUHJvYzIocEFkLCBFbGVtKTsKKwkJCWJyZWFrOworCQljYXNlIENOVExfV0FJVF9BU1NPQzoKKwkJCUNudGxXYWl0QXNzb2NQcm9jKHBBZCwgRWxlbSk7CisJCQlicmVhazsKKworCQljYXNlIENOVExfV0FJVF9PSURfTElTVF9TQ0FOOgorCQkJaWYoRWxlbS0+TXNnVHlwZSA9PSBNVDJfU0NBTl9DT05GKQorCQkJeworCQkJCS8vIFJlc3VtZSBUeFJpbmcgYWZ0ZXIgU0NBTklORyBjb21wbGV0ZS4gV2UgaG9wZSB0aGUgb3V0LW9mLXNlcnZpY2UgdGltZQorCQkJCS8vIHdvbid0IGJlIHRvbyBsb25nIHRvIGxldCB1cHBlciBsYXllciB0aW1lLW91dCB0aGUgd2FpdGluZyBmcmFtZXMKKwkJCQlSVE1QUmVzdW1lTXNkdVRyYW5zbWlzc2lvbihwQWQpOworCQkJCWlmIChwQWQtPlN0YUNmZy5DQ1hSZXFUeXBlICE9IE1TUk5fVFlQRV9VTlVTRUQpCisJCQkJeworCQkJCQkvLyBDaXNjbyBzY2FuIHJlcXVlc3QgaXMgZmluaXNoZWQsIHByZXBhcmUgYmVhY29uIHJlcG9ydAorCQkJCQlNbG1lRW5xdWV1ZShwQWQsIEFJUk9ORVRfU1RBVEVfTUFDSElORSwgTVQyX0FJUk9ORVRfU0NBTl9ET05FLCAwLCBOVUxMKTsKKwkJCQl9CisJCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfSURMRTsKKworICAgICAgICAgICAgICAgIC8vCisJCQkJLy8gU2V0IExFRCBzdGF0dXMgdG8gcHJldmlvdXMgc3RhdHVzLgorCQkJCS8vCisJCQkJaWYgKHBBZC0+YkxlZE9uU2Nhbm5pbmcpCisJCQkJeworCQkJCQlwQWQtPmJMZWRPblNjYW5uaW5nID0gRkFMU0U7CisJCQkJCVJUTVBTZXRMRUQocEFkLCBwQWQtPkxlZFN0YXR1cyk7CisJCQkJfQorI2lmZGVmIERPVDExTl9EUkFGVDMKKwkJCQkvLyBBUCBzZW50IGEgMjA0MENvZXhpc3RlbmNlIG1nbXQgZnJhbWUsIHRoZW4gc3RhdGlvbiBwZXJmb3JtIGEgc2NhbiwgYW5kIHRoZW4gc2VuZCBiYWNrIHRoZSByZXNwb25lLgorCQkJCWlmIChwQWQtPkNvbW1vbkNmZy5CU1NDb2V4aXN0MjA0MC5maWVsZC5JbmZvUmVxID09IDEpCisJCQkJeworCQkJCQlVcGRhdGUyMDQwQ29leGlzdEZyYW1lQW5kTm90aWZ5KHBBZCwgQlNTSURfV0NJRCwgVFJVRSk7CisJCQkJfQorI2VuZGlmIC8vIERPVDExTl9EUkFGVDMgLy8KKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgQ05UTF9XQUlUX09JRF9ESVNBU1NPQzoKKwkJCWlmIChFbGVtLT5Nc2dUeXBlID09IE1UMl9ESVNBU1NPQ19DT05GKQorCQkJeworCQkJCUxpbmtEb3duKHBBZCwgRkFMU0UpOworCQkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX0lETEU7CisJCQl9CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCURCR1BSSU5UX0VSUigoIiFFUlJPUiEgQ05UTCAtIElsbGVnYWwgbWVzc2FnZSB0eXBlKD0lbGQpIiwgRWxlbS0+TXNnVHlwZSkpOworCQkJYnJlYWs7CisJfQorfQorCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIENudGxJZGxlUHJvYygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisJTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNUICAgRGlzYXNzb2NSZXE7CisKKwlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JBRElPX09GRikpCisJCXJldHVybjsKKworCXN3aXRjaChFbGVtLT5Nc2dUeXBlKQorCXsKKwkJY2FzZSBPSURfODAyXzExX1NTSUQ6CisJCQlDbnRsT2lkU3NpZFByb2MocEFkLCBFbGVtKTsKKwkJCWJyZWFrOworCisJCWNhc2UgT0lEXzgwMl8xMV9CU1NJRDoKKwkJCUNudGxPaWRSVEJzc2lkUHJvYyhwQWQsRWxlbSk7CisJCQlicmVhazsKKworCQljYXNlIE9JRF84MDJfMTFfQlNTSURfTElTVF9TQ0FOOgorCQkJQ250bE9pZFNjYW5Qcm9jKHBBZCxFbGVtKTsKKwkJCWJyZWFrOworCisJCWNhc2UgT0lEXzgwMl8xMV9ESVNBU1NPQ0lBVEU6CisjaWZkZWYgUkFMSU5LX0FURQorCQkJaWYoQVRFX09OKHBBZCkpCisJCQl7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiVGhlIGRyaXZlciBpcyBpbiBBVEUgbW9kZSBub3dcbiIpKTsKKwkJCQlicmVhazsKKwkJCX0KKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisJCQlEaXNhc3NvY1Bhcm1GaWxsKHBBZCwgJkRpc2Fzc29jUmVxLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgUkVBU09OX0RJU0FTU09DX1NUQV9MRUFWSU5HKTsKKwkJCU1sbWVFbnF1ZXVlKHBBZCwgQVNTT0NfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfRElTQVNTT0NfUkVRLCBzaXplb2YoTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNUKSwgJkRpc2Fzc29jUmVxKTsKKwkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX1dBSVRfT0lEX0RJU0FTU09DOworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyAgICAgICAgICAgIGlmIChwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgIT0gV1BBX1NVUFBMSUNBTlRfRU5BQkxFX1dJVEhfV0VCX1VJKQorI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKyAgICAgICAgICAgIHsKKyAgICAJCQkvLyBTZXQgdGhlIEF1dG9SZWNvbm5lY3RTc2lkIHRvIHByZXZlbnQgaXQgcmVjb25uZWN0IHRvIG9sZCBTU0lECisgICAgCQkJLy8gU2luY2UgY2FsbGluZyB0aGlzIGluZGljYXRlIHVzZXIgZG9uJ3Qgd2FudCB0byBjb25uZWN0IHRvIHRoYXQgU1NJRCBhbnltb3JlLgorICAgIAkJCXBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbj0gMzI7CisgICAgCQkJTmRpc1plcm9NZW1vcnkocEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkLCBwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWRMZW4pOworICAgICAgICAgICAgfQorCQkJYnJlYWs7CisKKwkJY2FzZSBNVDJfTUxNRV9ST0FNSU5HX1JFUToKKwkJCUNudGxNbG1lUm9hbWluZ1Byb2MocEFkLCBFbGVtKTsKKwkJCWJyZWFrOworCisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9NSUNfRkFJTFVSRV9SRVBPUlRfRlJBTUU6CisgICAgICAgICAgICBXcGFNaWNGYWlsdXJlUmVwb3J0RnJhbWUocEFkLCBFbGVtKTsKKyAgICAgICAgICAgIGJyZWFrOworCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJCWNhc2UgUlRfT0lEXzgwMl8xMV9TRVRfRExTX1BBUkFNOgorCQkJQ250bE9pZERMU1NldHVwUHJvYyhwQWQsIEVsZW0pOworCQkJYnJlYWs7CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisKKwkJZGVmYXVsdDoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBJbGxlZ2FsIG1lc3NhZ2UgaW4gQ250bElkbGVQcm9jKE1zZ1R5cGU9JWxkKVxuIixFbGVtLT5Nc2dUeXBlKSk7CisJCQlicmVhazsKKwl9Cit9CisKK1ZPSUQgQ250bE9pZFNjYW5Qcm9jKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlNTE1FX1NDQU5fUkVRX1NUUlVDVCAgICAgICBTY2FuUmVxOworCVVMT05HICAgICAgICAgICAgICAgICAgICAgIEJzc0lkeCA9IEJTU19OT1RfRk9VTkQ7CisJQlNTX0VOVFJZICAgICAgICAgICAgICAgICAgQ3VyckJzczsKKworI2lmZGVmIFJBTElOS19BVEUKKy8qIERpc2FibGUgc2Nhbm5pbmcgd2hlbiBBVEUgaXMgcnVubmluZy4gKi8KKwlpZiAoQVRFX09OKHBBZCkpCisJCXJldHVybjsKKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisKKworCS8vIHJlY29yZCBjdXJyZW50IEJTUyBpZiBuZXR3b3JrIGlzIGNvbm5lY3RlZC4KKwkvLyAyMDAzLTItMTMgZG8gbm90IGluY2x1ZGUgY3VycmVudCBJQlNTIGlmIHRoaXMgaXMgdGhlIG9ubHkgU1RBIGluIHRoaXMgSUJTUy4KKwlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpKQorCXsKKwkJQnNzSWR4ID0gQnNzU3NpZFRhYmxlU2VhcmNoKCZwQWQtPlNjYW5UYWIsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwQWQtPkNvbW1vbkNmZy5Tc2lkLCBwQWQtPkNvbW1vbkNmZy5Tc2lkTGVuLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKTsKKwkJaWYgKEJzc0lkeCAhPSBCU1NfTk9UX0ZPVU5EKQorCQl7CisJCQlOZGlzTW92ZU1lbW9yeSgmQ3VyckJzcywgJnBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NJZHhdLCBzaXplb2YoQlNTX0VOVFJZKSk7CisJCX0KKwl9CisKKwkvLyBjbGVhbiB1cCBwcmV2aW91cyBTQ0FOIHJlc3VsdCwgYWRkIGN1cnJlbnQgQlNTIGJhY2sgdG8gdGFibGUgaWYgYW55CisJQnNzVGFibGVJbml0KCZwQWQtPlNjYW5UYWIpOworCWlmIChCc3NJZHggIT0gQlNTX05PVF9GT1VORCkKKwl7CisJCS8vIERESyBOb3RlOiBJZiB0aGUgTklDIGlzIGFzc29jaWF0ZWQgd2l0aCBhIHBhcnRpY3VsYXIgQlNTSUQgYW5kIFNTSUQKKwkJLy8gICAgdGhhdCBhcmUgbm90IGNvbnRhaW5lZCBpbiB0aGUgbGlzdCBvZiBCU1NJRHMgZ2VuZXJhdGVkIGJ5IHRoaXMgc2NhbiwgdGhlCisJCS8vICAgIEJTU0lEIGRlc2NyaXB0aW9uIG9mIHRoZSBjdXJyZW50bHkgYXNzb2NpYXRlZCBCU1NJRCBhbmQgU1NJRCBzaG91bGQgYmUKKwkJLy8gICAgYXBwZW5kZWQgdG8gdGhlIGxpc3Qgb2YgQlNTSURzIGluIHRoZSBOSUMncyBkYXRhYmFzZS4KKwkJLy8gVG8gZW5zdXJlIHRoaXMsIHdlIGFwcGVuZCB0aGlzIEJTUyBhcyB0aGUgZmlyc3QgZW50cnkgaW4gU0NBTiByZXN1bHQKKwkJTmRpc01vdmVNZW1vcnkoJnBBZC0+U2NhblRhYi5Cc3NFbnRyeVswXSwgJkN1cnJCc3MsIHNpemVvZihCU1NfRU5UUlkpKTsKKwkJcEFkLT5TY2FuVGFiLkJzc05yID0gMTsKKwl9CisKKwlTY2FuUGFybUZpbGwocEFkLCAmU2NhblJlcSwgIiIsIDAsIEJTU19BTlksIFNDQU5fQUNUSVZFKTsKKwlNbG1lRW5xdWV1ZShwQWQsIFNZTkNfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfU0NBTl9SRVEsCisJCXNpemVvZihNTE1FX1NDQU5fUkVRX1NUUlVDVCksICZTY2FuUmVxKTsKKwlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX09JRF9MSVNUX1NDQU47Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJQmVmb3JlIGNhbGxpbmcgdGhpcyByb3V0aW5lLCB1c2VyIGRlc2lyZWQgU1NJRCBzaG91bGQgYWxyZWFkeSBiZWVuCisJCXJlY29yZGVkIGluIENvbW1vbkNmZy5Tc2lkW10KKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBDbnRsT2lkU3NpZFByb2MoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICogRWxlbSkKK3sKKwlQTkRJU184MDJfMTFfU1NJRCAgICAgICAgICBwT2lkU3NpZCA9IChORElTXzgwMl8xMV9TU0lEICopRWxlbS0+TXNnOworCU1MTUVfRElTQVNTT0NfUkVRX1NUUlVDVCAgIERpc2Fzc29jUmVxOworCVVMT05HCQkJCQkgICBOb3c7CisKKwkvLyBTdGVwIDEuIHJlY29yZCB0aGUgZGVzaXJlZCB1c2VyIHNldHRpbmdzIHRvIE1sbWVBdXgKKwlOZGlzWmVyb01lbW9yeShwQWQtPk1sbWVBdXguU3NpZCwgTUFYX0xFTl9PRl9TU0lEKTsKKwlOZGlzTW92ZU1lbW9yeShwQWQtPk1sbWVBdXguU3NpZCwgcE9pZFNzaWQtPlNzaWQsIHBPaWRTc2lkLT5Tc2lkTGVuZ3RoKTsKKwlwQWQtPk1sbWVBdXguU3NpZExlbiA9IChVQ0hBUilwT2lkU3NpZC0+U3NpZExlbmd0aDsKKwlOZGlzWmVyb01lbW9yeShwQWQtPk1sbWVBdXguQnNzaWQsIE1BQ19BRERSX0xFTik7CisJcEFkLT5NbG1lQXV4LkJzc1R5cGUgPSBwQWQtPlN0YUNmZy5Cc3NUeXBlOworCisKKwkvLworCS8vIFVwZGF0ZSBSZWNvbm5lY3QgU3NpZCwgdGhhdCB1c2VyIGRlc2lyZWQgdG8gY29ubmVjdC4KKwkvLworCU5kaXNaZXJvTWVtb3J5KHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZCwgTUFYX0xFTl9PRl9TU0lEKTsKKwlOZGlzTW92ZU1lbW9yeShwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWQsIHBBZC0+TWxtZUF1eC5Tc2lkLCBwQWQtPk1sbWVBdXguU3NpZExlbik7CisJcEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuID0gcEFkLT5NbG1lQXV4LlNzaWRMZW47CisKKwkvLyBzdGVwIDIuIGZpbmQgYWxsIG1hdGNoaW5nIEJTUyBpbiB0aGUgbGFzdGVzdCBTQ0FOIHJlc3VsdCAoaW5Cc3NUYWIpCisJLy8gICAgJiBsb2cgdGhlbSBpbnRvIE1sbWVBdXguU3NpZEJzc1RhYiBmb3IgbGF0ZXItb24gaXRlcmF0aW9uLiBTb3J0IGJ5IFJTU0kgb3JkZXIKKwlCc3NUYWJsZVNzaWRTb3J0KHBBZCwgJnBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLCBwQWQtPk1sbWVBdXguU3NpZCwgcEFkLT5NbG1lQXV4LlNzaWRMZW4pOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ250bE9pZFNzaWRQcm9jKCk6Q05UTCAtICVkIEJTUyBvZiAlZCBCU1MgbWF0Y2ggdGhlIGRlc2lyZSAoJWQpU1NJRCAtICVzXG4iLAorCQkJcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzTnIsIHBBZC0+U2NhblRhYi5Cc3NOciwgcEFkLT5NbG1lQXV4LlNzaWRMZW4sIHBBZC0+TWxtZUF1eC5Tc2lkKSk7CisJTmRpc0dldFN5c3RlbVVwVGltZSgmTm93KTsKKworCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCkgJiYKKwkJKHBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW4gPT0gcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzRW50cnlbMF0uU3NpZExlbikgJiYKKwkJTmRpc0VxdWFsTWVtb3J5KHBBZC0+Q29tbW9uQ2ZnLlNzaWQsIHBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLkJzc0VudHJ5WzBdLlNzaWQsIHBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW4pICYmCisJCU1BQ19BRERSX0VRVUFMKHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NFbnRyeVswXS5Cc3NpZCkpCisJeworCQkvLyBDYXNlIDEuIGFscmVhZHkgY29ubmVjdGVkIHdpdGggYW4gQVAgd2hvIGhhcyB0aGUgZGVzaXJlZCBTU0lECisJCS8vICAgICAgICAgd2l0aCBoaWdoZXN0IFJTU0kKKworCQkvLyBBZGQgY2hlY2tpbmcgTW9kZSAiTEVBUCIgZm9yIENDWCAxLjAKKwkJaWYgKCgocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKSB8fAorCQkJIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spIHx8CisJCQkgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIpIHx8CisJCQkgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spCisjaWZkZWYgTEVBUF9TVVBQT1JUCisJCQkgfHwgKHBBZC0+U3RhQ2ZnLkxlYXBBdXRoTW9kZSA9PSBDSVNDT19BdXRoTW9kZUxFQVApCisjZW5kaWYgLy8gTEVBUF9TVVBQT1JUIC8vCisJCQkgKSAmJgorCQkJKHBBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkID09IFdQQV84MDJfMVhfUE9SVF9OT1RfU0VDVVJFRCkpCisJCXsKKwkJCS8vIGNhc2UgMS4xIEZvciBXUEEsIFdQQS1QU0ssIGlmIHRoZSAxeCBwb3J0IGlzIG5vdCBzZWN1cmVkLCB3ZSBoYXZlIHRvIHJlZG8KKwkJCS8vICAgICAgICAgIGNvbm5lY3Rpb24gcHJvY2VzcworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ250bE9pZFNzaWRQcm9jKCk6Q05UTCAtIGRpc2Fzc29jaWF0ZSB3aXRoIGN1cnJlbnQgQVAuLi5cbiIpKTsKKwkJCURpc2Fzc29jUGFybUZpbGwocEFkLCAmRGlzYXNzb2NSZXEsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBSRUFTT05fRElTQVNTT0NfU1RBX0xFQVZJTkcpOworCQkJTWxtZUVucXVldWUocEFkLCBBU1NPQ19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9ESVNBU1NPQ19SRVEsCisJCQkJCQlzaXplb2YoTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNUKSwgJkRpc2Fzc29jUmVxKTsKKwkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX1dBSVRfRElTQVNTT0M7CisJCX0KKwkJZWxzZSBpZiAocEFkLT5iQ29uZmlnQ2hhbmdlZCA9PSBUUlVFKQorCQl7CisJCQkvLyBjYXNlIDEuMiBJbXBvcnRhbnQgQ29uZmlnIGhhcyBjaGFuZ2VkLCB3ZSBoYXZlIHRvIHJlY29ubmVjdCB0byB0aGUgc2FtZSBBUAorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ250bE9pZFNzaWRQcm9jKCk6Q05UTCAtIGRpc2Fzc29jaWF0ZSB3aXRoIGN1cnJlbnQgQVAgQmVjYXVzZSBjb25maWcgY2hhbmdlZC4uLlxuIikpOworCQkJRGlzYXNzb2NQYXJtRmlsbChwQWQsICZEaXNhc3NvY1JlcSwgcEFkLT5Db21tb25DZmcuQnNzaWQsIFJFQVNPTl9ESVNBU1NPQ19TVEFfTEVBVklORyk7CisJCQlNbG1lRW5xdWV1ZShwQWQsIEFTU09DX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX0RJU0FTU09DX1JFUSwKKwkJCQkJCXNpemVvZihNTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1QpLCAmRGlzYXNzb2NSZXEpOworCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9ESVNBU1NPQzsKKwkJfQorCQllbHNlCisJCXsKKwkJCS8vIGNhc2UgMS4zLiBhbHJlYWR5IGNvbm5lY3RlZCB0byB0aGUgU1NJRCB3aXRoIGhpZ2hlc3QgUlNTSS4KKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNudGxPaWRTc2lkUHJvYygpOkNOVEwgLSBhbHJlYWR5IHdpdGggdGhpcyBCU1NJRC4gaWdub3JlIHRoaXMgU0VUX1NTSUQgcmVxdWVzdFxuIikpOworCQkJLy8KKwkJCS8vIChIQ1QgMTIuMSkgMWNfd2xhbl9tZWRpYWV2ZW50cyByZXF1aXJlZAorCQkJLy8gbWVkaWEgY29ubmVjdCBldmVudHMgYXJlIGluZGljYXRlZCB3aGVuIGFzc29jaWF0aW5nIHdpdGggdGhlIHNhbWUgQVAKKwkJCS8vCisJCQlpZiAoSU5GUkFfT04ocEFkKSkKKwkJCXsKKwkJCQkvLworCQkJCS8vIFNpbmNlIE1lZGlhU3RhdGUgYWxyZWFkeSBpcyBOZGlzTWVkaWFTdGF0ZUNvbm5lY3RlZAorCQkJCS8vIFdlIGp1c3QgaW5kaWNhdGUgdGhlIGNvbm5lY3QgZXZlbnQgYWdhaW4gdG8gbWVldCB0aGUgV0hRTCByZXF1aXJlZC4KKwkJCQkvLworCQkJCXBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID0gTmRpc01lZGlhU3RhdGVDb25uZWN0ZWQ7CisJCQkJUlRNUF9JbmRpY2F0ZU1lZGlhU3RhdGUocEFkKTsKKyAgICAgICAgICAgICAgICBwQWQtPkV4dHJhSW5mbyA9IEdFTkVSQUxfTElOS19VUDsgICAvLyBVcGRhdGUgZXh0cmEgaW5mb3JtYXRpb24gdG8gbGluayBpcyB1cAorCQkJfQorCisJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9JRExFOworI2lmZGVmIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdW5pb24gaXdyZXFfZGF0YSAgICB3cnF1OworCisgICAgICAgICAgICAgICAgbWVtc2V0KHdycXUuYXBfYWRkci5zYV9kYXRhLCAwLCBNQUNfQUREUl9MRU4pOworICAgICAgICAgICAgICAgIG1lbWNweSh3cnF1LmFwX2FkZHIuc2FfZGF0YSwgcEFkLT5NbG1lQXV4LkJzc2lkLCBNQUNfQUREUl9MRU4pOworICAgICAgICAgICAgICAgIHdpcmVsZXNzX3NlbmRfZXZlbnQocEFkLT5uZXRfZGV2LCBTSU9DR0lXQVAsICZ3cnF1LCBOVUxMKTsKKworICAgICAgICAgICAgfQorI2VuZGlmIC8vIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisJCX0KKwl9CisJZWxzZSBpZiAoSU5GUkFfT04ocEFkKSkKKwl7CisJCS8vCisJCS8vIEZvciBSVDYxCisJCS8vIFs4ODg4OF0gT0lEXzgwMl8xMV9TU0lEIHNob3VsZCBoYXZlIHJldHVybmVkIE5EVEVTVF9XRVBfQVAyKFJldHVybmVkOiApCisJCS8vIFJUNjEgbWF5IGxvc3QgU1NJRCwgYW5kIG5vdCBjb25uZWN0IHRvIE5EVEVTVF9XRVBfQVAyIGFuZCB3aWxsIGNvbm5lY3QgdG8gTkRURVNUX1dFUF9BUDIgYnkgQXV0b3JlY29ubmVjdAorCQkvLyBCdXQgbWVkaWEgc3RhdHVzIGlzIGNvbm5lY3RlZCwgc28gdGhlIFNTSUQgbm90IHJlcG9ydCBjb3JyZWN0bHkuCisJCS8vCisJCWlmICghU1NJRF9FUVVBTChwQWQtPkNvbW1vbkNmZy5Tc2lkLCBwQWQtPkNvbW1vbkNmZy5Tc2lkTGVuLCBwQWQtPk1sbWVBdXguU3NpZCwgcEFkLT5NbG1lQXV4LlNzaWRMZW4pKQorCQl7CisJCQkvLworCQkJLy8gRGlmZmVyZW50IFNTSUQgbWVhbnMgbm90IFJvYW1pbmcgY2FzZSwgc28gd2UgbGV0IExpbmtEb3duKCkgdG8gSW5kaWNhdGUgYSBkaXNjb25uZWN0IGV2ZW50LgorCQkJLy8KKwkJCXBBZC0+TWxtZUF1eC5DdXJyUmVxSXNGcm9tTmRpcyA9IFRSVUU7CisJCX0KKwkJLy8gY2FzZSAyLiBhY3RpdmUgSU5GUkEgYXNzb2NpYXRpb24gZXhpc3RlbnQKKwkJLy8gICAgcm9hbWluZyBpcyBkb25lIHdpdGhpbiBtaW5pcG9ydCBkcml2ZXIsIG5vdGhpbmcgdG8gZG8gd2l0aCBjb25maWd1cmF0aW9uCisJCS8vICAgIHV0aWxpdHkuIHNvIHVwb24gYSBuZXcgU0VUKE9JRF84MDJfMTFfU1NJRCkgaXMgcmVjZWl2ZWQsIHdlIGp1c3QKKwkJLy8gICAgZGlzYXNzb2NpYXRlIHdpdGggdGhlIGN1cnJlbnQgYXNzb2NpYXRlZCBBUCwKKwkJLy8gICAgdGhlbiBwZXJmb3JtIGEgbmV3IGFzc29jaWF0aW9uIHdpdGggdGhpcyBuZXcgU1NJRCwgbm8gbWF0dGVyIHRoZQorCQkvLyAgICBuZXcvb2xkIFNTSUQgYXJlIHRoZSBzYW1lIG9yIG5vdC4KKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ250bE9pZFNzaWRQcm9jKCk6Q05UTCAtIGRpc2Fzc29jaWF0ZSB3aXRoIGN1cnJlbnQgQVAuLi5cbiIpKTsKKwkJRGlzYXNzb2NQYXJtRmlsbChwQWQsICZEaXNhc3NvY1JlcSwgcEFkLT5Db21tb25DZmcuQnNzaWQsIFJFQVNPTl9ESVNBU1NPQ19TVEFfTEVBVklORyk7CisJCU1sbWVFbnF1ZXVlKHBBZCwgQVNTT0NfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfRElTQVNTT0NfUkVRLAorCQkJCQlzaXplb2YoTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNUKSwgJkRpc2Fzc29jUmVxKTsKKwkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9ESVNBU1NPQzsKKwl9CisJZWxzZQorCXsKKwkJaWYgKEFESE9DX09OKHBBZCkpCisJCXsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNudGxPaWRTc2lkUHJvYygpOkNOVEwgLSBkcm9wIGN1cnJlbnQgQURIT0NcbiIpKTsKKwkJCUxpbmtEb3duKHBBZCwgRkFMU0UpOworCQkJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKTsKKwkJCXBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID0gTmRpc01lZGlhU3RhdGVEaXNjb25uZWN0ZWQ7CisJCQlSVE1QX0luZGljYXRlTWVkaWFTdGF0ZShwQWQpOworICAgICAgICAgICAgcEFkLT5FeHRyYUluZm8gPSBHRU5FUkFMX0xJTktfRE9XTjsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNudGxPaWRTc2lkUHJvYygpOk5ESVNfU1RBVFVTX01FRElBX0RJU0NPTk5FQ1QgRXZlbnQgQyFcbiIpKTsKKwkJfQorCisJCWlmICgocEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzTnIgPT0gMCkgJiYKKwkJCShwQWQtPlN0YUNmZy5iQXV0b1JlY29ubmVjdCA9PSBUUlVFKSAmJgorCQkJKHBBZC0+TWxtZUF1eC5Cc3NUeXBlID09IEJTU19JTkZSQSkgJiYKKwkJCShNbG1lVmFsaWRhdGVTU0lEKHBBZC0+TWxtZUF1eC5Tc2lkLCBwQWQtPk1sbWVBdXguU3NpZExlbikgPT0gVFJVRSkKKwkJCSkKKwkJeworCQkJTUxNRV9TQ0FOX1JFUV9TVFJVQ1QgICAgICAgU2NhblJlcTsKKworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ250bE9pZFNzaWRQcm9jKCk6Q05UTCAtIE5vIG1hdGNoaW5nIEJTUywgc3RhcnQgYSBuZXcgc2NhblxuIikpOworCQkJU2NhblBhcm1GaWxsKHBBZCwgJlNjYW5SZXEsIHBBZC0+TWxtZUF1eC5Tc2lkLCBwQWQtPk1sbWVBdXguU3NpZExlbiwgQlNTX0FOWSwgU0NBTl9BQ1RJVkUpOworCQkJTWxtZUVucXVldWUocEFkLCBTWU5DX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX1NDQU5fUkVRLCBzaXplb2YoTUxNRV9TQ0FOX1JFUV9TVFJVQ1QpLCAmU2NhblJlcSk7CisJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX09JRF9MSVNUX1NDQU47CisJCQkvLyBSZXNldCBNaXNzZWQgc2NhbiBudW1iZXIKKwkJCXBBZC0+U3RhQ2ZnLkxhc3RTY2FuVGltZSA9IE5vdzsKKwkJfQorCQllbHNlCisJCXsKKwkJCXBBZC0+TWxtZUF1eC5Cc3NJZHggPSAwOworCQkJSXRlcmF0ZU9uQnNzVGFiKHBBZCk7CisJCX0KKwl9Cit9CisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgQ250bE9pZFJUQnNzaWRQcm9jKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqIEVsZW0pCit7CisJVUxPTkcgICAgICAgQnNzSWR4OworCVBVQ0hBUiAgICAgIHBPaWRCc3NpZCA9IChQVUNIQVIpRWxlbS0+TXNnOworCU1MTUVfRElTQVNTT0NfUkVRX1NUUlVDVCAgICBEaXNhc3NvY1JlcTsKKwlNTE1FX0pPSU5fUkVRX1NUUlVDVCAgICAgICAgSm9pblJlcTsKKworI2lmZGVmIFJBTElOS19BVEUKKy8qIE5vIG5lZWQgdG8gcGVyZm9ybSB0aGlzIHJvdXRpbmUgd2hlbiBBVEUgaXMgcnVubmluZy4gKi8KKwlpZiAoQVRFX09OKHBBZCkpCisJCXJldHVybjsKKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisKKwkvLyByZWNvcmQgdXNlciBkZXNpcmVkIHNldHRpbmdzCisJQ09QWV9NQUNfQUREUihwQWQtPk1sbWVBdXguQnNzaWQsIHBPaWRCc3NpZCk7CisJcEFkLT5NbG1lQXV4LkJzc1R5cGUgPSBwQWQtPlN0YUNmZy5Cc3NUeXBlOworCisJLy8KKwkvLyBVcGRhdGUgUmVjb25uZWN0IFNzaWQsIHRoYXQgdXNlciBkZXNpcmVkIHRvIGNvbm5lY3QuCisJLy8KKwlOZGlzWmVyb01lbW9yeShwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWQsIE1BWF9MRU5fT0ZfU1NJRCk7CisJcEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuID0gcEFkLT5NbG1lQXV4LlNzaWRMZW47CisJTmRpc01vdmVNZW1vcnkocEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkLCBwQWQtPk1sbWVBdXguU3NpZCwgcEFkLT5NbG1lQXV4LlNzaWRMZW4pOworCisJLy8gZmluZCB0aGUgZGVzaXJlZCBCU1MgaW4gdGhlIGxhdGVzdCBTQ0FOIHJlc3VsdCB0YWJsZQorCUJzc0lkeCA9IEJzc1RhYmxlU2VhcmNoKCZwQWQtPlNjYW5UYWIsIHBPaWRCc3NpZCwgcEFkLT5NbG1lQXV4LkNoYW5uZWwpOworCWlmIChCc3NJZHggPT0gQlNTX05PVF9GT1VORCkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBCU1NJRCBub3QgZm91bmQuIHJlcGx5IE5ESVNfU1RBVFVTX05PVF9BQ0NFUFRFRFxuIikpOworCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9JRExFOworCQlyZXR1cm47CisJfQorCisJLy8gY29weSB0aGUgbWF0Y2hlZCBCU1MgZW50cnkgZnJvbSBTY2FuVGFiIHRvIE1sbWVBdXguU3NpZEJzc1RhYi4gV2h5PworCS8vIEJlY2F1c2Ugd2UgbmVlZCB0aGlzIGVudHJ5IHRvIGJlY29tZSB0aGUgSk9JTiB0YXJnZXQgaW4gbGF0ZXIgb24gU1lOQyBzdGF0ZSBtYWNoaW5lCisJcEFkLT5NbG1lQXV4LkJzc0lkeCA9IDA7CisJcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzTnIgPSAxOworCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NFbnRyeVswXSwgJnBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NJZHhdLCBzaXplb2YoQlNTX0VOVFJZKSk7CisKKwkvLyAyMDAyLTExLTI2IHNraXAgdGhlIGZvbGxvd2luZyBjaGVja2luZy4gaS5lLiBpZiB1c2VyIHdhbnRzIHRvIHJlLWNvbm5lY3QgdG8gc2FtZSBBUAorCS8vICAgd2UganVzdCBmb2xsb3cgbm9ybWFsIHByb2NlZHVyZS4gVGhlIHJlYXNvbiBvZiB1c2VyIGRvaW5nIHRoaXMgbWF5IGJlY2F1c2UgaGUvc2hlIGNoYW5nZWQKKwkvLyAgIEFQIHRvIGFub3RoZXIgY2hhbm5lbCwgYnV0IHdlIHN0aWxsIHJlY2VpdmVkIEJFQUNPTiBmcm9tIGl0IHRodXMgZG9uJ3QgY2xhaW0gTGluayBEb3duLgorCS8vICAgU2luY2UgdXNlciBrbm93cyBoZSdzIGNoYW5nZWQgQVAgY2hhbm5lbCwgaGUnbGwgcmUtY29ubmVjdCBhZ2Fpbi4gQnkgc2tpcHBpbmcgdGhlIGZvbGxvd2luZworCS8vICAgY2hlY2tpbmcsIHdlJ2xsIGRpc2Fzc29jaWF0ZSB0aGVuIHJlLWRvIG5vcm1hbCBhc3NvY2lhdGlvbiB3aXRoIHRoaXMgQVAgYXQgdGhlIG5ldyBjaGFubmVsLgorCS8vIDIwMDMtMS02IFJlLWVuYWJsZSB0aGlzIGZlYXR1cmUgYmFzZWQgb24gbWljcm9zb2Z0IHJlcXVpcmVtZW50IHdoaWNoIHByZWZlciBub3QgdG8gcmUtZG8KKwkvLyAgIGNvbm5lY3Rpb24gd2hlbiBzZXR0aW5nIHRoZSBzYW1lIEJTU0lELgorCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCkgJiYKKwkJTUFDX0FERFJfRVFVQUwocEFkLT5Db21tb25DZmcuQnNzaWQsIHBPaWRCc3NpZCkpCisJeworCQkvLyBhbHJlYWR5IGNvbm5lY3RlZCB0byB0aGUgc2FtZSBCU1NJRCwgZ28gYmFjayB0byBpZGxlIHN0YXRlIGRpcmVjdGx5CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBhbHJlYWR5IGluIHRoaXMgQlNTSUQuIGlnbm9yZSB0aGlzIFNFVF9CU1NJRCByZXF1ZXN0XG4iKSk7CisJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX0lETEU7CisjaWZkZWYgTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1bmlvbiBpd3JlcV9kYXRhICAgIHdycXU7CisKKyAgICAgICAgICAgICAgICBtZW1zZXQod3JxdS5hcF9hZGRyLnNhX2RhdGEsIDAsIE1BQ19BRERSX0xFTik7CisgICAgICAgICAgICAgICAgbWVtY3B5KHdycXUuYXBfYWRkci5zYV9kYXRhLCBwQWQtPk1sbWVBdXguQnNzaWQsIE1BQ19BRERSX0xFTik7CisgICAgICAgICAgICAgICAgd2lyZWxlc3Nfc2VuZF9ldmVudChwQWQtPm5ldF9kZXYsIFNJT0NHSVdBUCwgJndycXUsIE5VTEwpOworCisgICAgICAgICAgICB9CisjZW5kaWYgLy8gTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKwl9CisJZWxzZQorCXsKKwkJaWYgKElORlJBX09OKHBBZCkpCisJCXsKKwkJCS8vIGRpc2Fzc29jIGZyb20gY3VycmVudCBBUCBmaXJzdAorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ05UTCAtIGRpc2Fzc29jaWF0ZSB3aXRoIGN1cnJlbnQgQVAgLi4uXG4iKSk7CisJCQlEaXNhc3NvY1Bhcm1GaWxsKHBBZCwgJkRpc2Fzc29jUmVxLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgUkVBU09OX0RJU0FTU09DX1NUQV9MRUFWSU5HKTsKKwkJCU1sbWVFbnF1ZXVlKHBBZCwgQVNTT0NfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfRElTQVNTT0NfUkVRLAorCQkJCQkJc2l6ZW9mKE1MTUVfRElTQVNTT0NfUkVRX1NUUlVDVCksICZEaXNhc3NvY1JlcSk7CisKKwkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX1dBSVRfRElTQVNTT0M7CisJCX0KKwkJZWxzZQorCQl7CisJCQlpZiAoQURIT0NfT04ocEFkKSkKKwkJCXsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gZHJvcCBjdXJyZW50IEFESE9DXG4iKSk7CisJCQkJTGlua0Rvd24ocEFkLCBGQUxTRSk7CisJCQkJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKTsKKwkJCQlwQWQtPkluZGljYXRlTWVkaWFTdGF0ZSA9IE5kaXNNZWRpYVN0YXRlRGlzY29ubmVjdGVkOworCQkJCVJUTVBfSW5kaWNhdGVNZWRpYVN0YXRlKHBBZCk7CisgICAgICAgICAgICAgICAgcEFkLT5FeHRyYUluZm8gPSBHRU5FUkFMX0xJTktfRE9XTjsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJORElTX1NUQVRVU19NRURJQV9ESVNDT05ORUNUIEV2ZW50IEMhXG4iKSk7CisJCQl9CisKKwkJCS8vIENoYW5nZSB0aGUgd2Vwc3RhdHVzIHRvIG9yaWdpbmFsIHdlcHN0YXR1cworCQkJcEFkLT5TdGFDZmcuV2VwU3RhdHVzICAgPSBwQWQtPlN0YUNmZy5PcmlnV2VwU3RhdHVzOworCQkJcEFkLT5TdGFDZmcuUGFpckNpcGhlciAgPSBwQWQtPlN0YUNmZy5PcmlnV2VwU3RhdHVzOworCQkJcEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgPSBwQWQtPlN0YUNmZy5PcmlnV2VwU3RhdHVzOworCisJCQkvLyBDaGVjayBjaXBoZXIgc3VpdGUsIEFQIG11c3QgaGF2ZSBtb3JlIHNlY3VyZWQgY2lwaGVyIHRoYW4gc3RhdGlvbiBzZXR0aW5nCisJCQkvLyBTZXQgdGhlIFBhaXJ3aXNlIGFuZCBHcm91cCBjaXBoZXIgdG8gbWF0Y2ggdGhlIGludGVuZGVkIEFQIHNldHRpbmcKKwkJCS8vIFdlIGNhbiBvbmx5IGNvbm5lY3QgdG8gQVAgd2l0aCBsZXNzIHNlY3VyZWQgY2lwaGVyIHNldHRpbmcKKwkJCWlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKSB8fCAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKSkKKwkJCXsKKwkJCQlwQWQtPlN0YUNmZy5Hcm91cENpcGhlciA9IHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NJZHhdLldQQS5Hcm91cENpcGhlcjsKKworCQkJCWlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc0lkeF0uV1BBLlBhaXJDaXBoZXIpCisJCQkJCXBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPSBwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzSWR4XS5XUEEuUGFpckNpcGhlcjsKKwkJCQllbHNlIGlmIChwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzSWR4XS5XUEEuUGFpckNpcGhlckF1eCAhPSBOZGlzODAyXzExV0VQRGlzYWJsZWQpCisJCQkJCXBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPSBwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzSWR4XS5XUEEuUGFpckNpcGhlckF1eDsKKwkJCQllbHNlCS8vIFRoZXJlIGlzIG5vIFBhaXJDaXBoZXIgQXV4LCBkb3duZ3JhZGUgb3VyIGNhcGFiaWxpdHkgdG8gVEtJUAorCQkJCQlwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZDsKKwkJCX0KKwkJCWVsc2UgaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyKSB8fCAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykpCisJCQl7CisJCQkJcEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgPSBwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzSWR4XS5XUEEyLkdyb3VwQ2lwaGVyOworCisJCQkJaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzSWR4XS5XUEEyLlBhaXJDaXBoZXIpCisJCQkJCXBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPSBwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzSWR4XS5XUEEyLlBhaXJDaXBoZXI7CisJCQkJZWxzZSBpZiAocEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc0lkeF0uV1BBMi5QYWlyQ2lwaGVyQXV4ICE9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZCkKKwkJCQkJcEFkLT5TdGFDZmcuUGFpckNpcGhlciA9IHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NJZHhdLldQQTIuUGFpckNpcGhlckF1eDsKKwkJCQllbHNlCS8vIFRoZXJlIGlzIG5vIFBhaXJDaXBoZXIgQXV4LCBkb3duZ3JhZGUgb3VyIGNhcGFiaWxpdHkgdG8gVEtJUAorCQkJCQlwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZDsKKworCQkJCS8vIFJTTiBjYXBhYmlsaXR5CisJCQkJcEFkLT5TdGFDZmcuUnNuQ2FwYWJpbGl0eSA9IHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NJZHhdLldQQTIuUnNuQ2FwYWJpbGl0eTsKKwkJCX0KKworCQkJLy8gU2V0IE1peCBjaXBoZXIgZmxhZworCQkJcEFkLT5TdGFDZmcuYk1peENpcGhlciA9IChwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID09IHBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyKSA/IEZBTFNFIDogVFJVRTsKKwkJCWlmIChwQWQtPlN0YUNmZy5iTWl4Q2lwaGVyID09IFRSVUUpCisJCQl7CisJCQkJLy8gSWYgbWl4IGNpcGhlciwgcmUtYnVpbGQgUlNOSUUKKwkJCQlSVE1QTWFrZVJTTklFKHBBZCwgcEFkLT5TdGFDZmcuQXV0aE1vZGUsIHBBZC0+U3RhQ2ZnLldlcFN0YXR1cywgMCk7CisJCQl9CisJCQkvLyBObyBhY3RpdmUgYXNzb2NpYXRpb24sIGpvaW4gdGhlIEJTUyBpbW1lZGlhdGVseQorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ05UTCAtIGpvaW5pbmcgJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnggLi4uXG4iLAorCQkJCXBPaWRCc3NpZFswXSxwT2lkQnNzaWRbMV0scE9pZEJzc2lkWzJdLHBPaWRCc3NpZFszXSxwT2lkQnNzaWRbNF0scE9pZEJzc2lkWzVdKSk7CisKKwkJCUpvaW5QYXJtRmlsbChwQWQsICZKb2luUmVxLCBwQWQtPk1sbWVBdXguQnNzSWR4KTsKKwkJCU1sbWVFbnF1ZXVlKHBBZCwgU1lOQ19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9KT0lOX1JFUSwgc2l6ZW9mKE1MTUVfSk9JTl9SRVFfU1RSVUNUKSwgJkpvaW5SZXEpOworCisJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX0pPSU47CisJCX0KKwl9Cit9CisKKy8vIFJvYW1pbmcgaXMgdGhlIG9ubHkgZXh0ZXJuYWwgcmVxdWVzdCB0cmlnZ2VyaW5nIENOVEwgc3RhdGUgbWFjaGluZQorLy8gZGVzcGl0ZSBvZiBvdGhlciAiU0VUIE9JRCIgb3BlcmF0aW9uLiBBbGwgIlNFVCBPSUQiIHJlbGF0ZWQgb2VyYXRpb25zCisvLyBoYXBwZW4gaW4gc2VxdWVuY2UsIGJlY2F1c2Ugbm8gb3RoZXIgU0VUIE9JRCB3aWxsIGJlIHNlbnQgdG8gdGhpcyBkZXZpY2UKKy8vIHVudGlsIHRoZSB0aGUgcHJldmlvdXMgU0VUIG9wZXJhdGlvbiBpcyBjb21wbGV0ZSAoc3VjY2Vzc2Z1bCBvIGZhaWxlZCkuCisvLyBTbywgaG93IGRvIHdlIHF1YXJhbnRlZSB0aGlzIFJPQU1JTkcgcmVxdWVzdCB3b24ndCBjb3JydXB0IG90aGVyICJTRVQgT0lEIj8KKy8vIG9yIGJlZW4gY29ycnVwdGVkIGJ5IG90aGVyICJTRVQgT0lEIj8KKy8vCisvLyBJUlFMID0gRElTUEFUQ0hfTEVWRUwKK1ZPSUQgQ250bE1sbWVSb2FtaW5nUHJvYygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisJLy8gVE9ETzoKKwkvLyBBUCBpbiBkaWZmZXJlbnQgY2hhbm5lbCBtYXkgc2hvdyBsb3dlciBSU1NJIHRoYW4gYWN0dWFsIHZhbHVlPz8KKwkvLyBzaG91bGQgd2UgYWRkIGEgd2VpZ2h0aW5nIGZhY3RvciB0byBjb21wZW5zYXRlIGl0PworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQ05UTCAtIFJvYW1pbmcgaW4gTWxtZUF1eC5Sb2FtVGFiLi4uXG4iKSk7CisKKwlOZGlzTW92ZU1lbW9yeSgmcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIsICZwQWQtPk1sbWVBdXguUm9hbVRhYiwgc2l6ZW9mKHBBZC0+TWxtZUF1eC5Sb2FtVGFiKSk7CisJcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzTnIgPSBwQWQtPk1sbWVBdXguUm9hbVRhYi5Cc3NOcjsKKworCUJzc1RhYmxlU29ydEJ5UnNzaSgmcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIpOworCXBBZC0+TWxtZUF1eC5Cc3NJZHggPSAwOworCUl0ZXJhdGVPbkJzc1RhYihwQWQpOworfQorCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBDbnRsT2lkRExTU2V0dXBQcm9jKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlQUlRfODAyXzExX0RMUwkJcERMUyA9IChQUlRfODAyXzExX0RMUylFbGVtLT5Nc2c7CisJTUxNRV9ETFNfUkVRX1NUUlVDVAlNbG1lRGxzUmVxOworCUlOVAkJCQkJaTsKKwlVU0hPUlQJCQkJcmVhc29uID0gUkVBU09OX1VOU1BFQ0lGWTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQ05UTCAtIChPSUQgc2V0ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IHdpdGggVmFsaWQ9JWQsIFN0YXR1cz0lZCwgVGltZU91dD0lZCwgQ291bnREb3duVGltZXI9JWQpXG4iLAorCQlwRExTLT5NYWNBZGRyWzBdLCBwRExTLT5NYWNBZGRyWzFdLCBwRExTLT5NYWNBZGRyWzJdLCBwRExTLT5NYWNBZGRyWzNdLCBwRExTLT5NYWNBZGRyWzRdLCBwRExTLT5NYWNBZGRyWzVdLAorCQlwRExTLT5WYWxpZCwgcERMUy0+U3RhdHVzLCBwRExTLT5UaW1lT3V0LCBwRExTLT5Db3VudERvd25UaW1lcikpOworCisJaWYgKCFwQWQtPkNvbW1vbkNmZy5iRExTQ2FwYWJsZSkKKwkJcmV0dXJuOworCisJLy8gRExTIHdpbGwgbm90IGJlIHN1cHBvcnRlZCB3aGVuIEFkaG9jIG1vZGUKKwlpZiAoSU5GUkFfT04ocEFkKSkKKwl7CisJCWZvciAoaSA9IDA7IGkgPCBNQVhfTlVNX09GX0RMU19FTlRSWTsgaSsrKQorCQl7CisJCQlpZiAocERMUy0+VmFsaWQgJiYgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQgJiYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9PSBETFNfRklOSVNIKSAmJgorCQkJCShwRExTLT5UaW1lT3V0ID09IHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlRpbWVPdXQpICYmIE1BQ19BRERSX0VRVUFMKHBETFMtPk1hY0FkZHIsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpKQorCQkJeworCQkJCS8vIDEuIFNhbWUgc2V0dGluZywganVzdCBkcm9wIGl0CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJDTlRMIC0gc2V0dGluZyB1bmNoYW5nZWRcbiIpKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWVsc2UgaWYgKCFwRExTLT5WYWxpZCAmJiBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZCAmJiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID09IERMU19GSU5JU0gpICYmCisJCQkJTUFDX0FERFJfRVFVQUwocERMUy0+TWFjQWRkciwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcikpCisJCQl7CisJCQkJLy8gMi4gRGlzYWJsZSBETFMgbGluayBjYXNlLCBqdXN0IHRlYXIgZG93biBETFMgbGluaworCQkJCXJlYXNvbiA9IFJFQVNPTl9RT1NfVU5XQU5URURfTUVDSEFOSVNNOworCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkCT0gRkFMU0U7CisJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzCT0gRExTX05PTkU7CisJCQkJRGxzUGFybUZpbGwocEFkLCAmTWxtZURsc1JlcSwgJnBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLCByZWFzb24pOworCQkJCU1sbWVFbnF1ZXVlKHBBZCwgRExTX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX0RMU19URUFSX0RPV04sIHNpemVvZihNTE1FX0RMU19SRVFfU1RSVUNUKSwgJk1sbWVEbHNSZXEpOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQ05UTCAtIHN0YXJ0IHRlYXIgZG93biBwcm9jZWR1cmVcbiIpKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWVsc2UgaWYgKChpIDwgTUFYX05VTV9PRl9ETFNfRU5UUlkpICYmIHBETFMtPlZhbGlkICYmICFwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZCkKKwkJCXsKKwkJCQkvLyAzLiBFbmFibGUgY2FzZSwgc3RhcnQgRExTIHNldHVwIHByb2NlZHVyZQorCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXSwgcERMUywgc2l6ZW9mKFJUXzgwMl8xMV9ETFNfVUkpKTsKKworCQkJCS8vVXBkYXRlIGNvdW50ZG93biB0aW1lcgorCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLkNvdW50RG93blRpbWVyID0gcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVGltZU91dDsKKwkJCQlEbHNQYXJtRmlsbChwQWQsICZNbG1lRGxzUmVxLCAmcEFkLT5TdGFDZmcuRExTRW50cnlbaV0sIHJlYXNvbik7CisJCQkJTWxtZUVucXVldWUocEFkLCBETFNfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfRExTX1JFUSwgc2l6ZW9mKE1MTUVfRExTX1JFUV9TVFJVQ1QpLCAmTWxtZURsc1JlcSk7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJDTlRMIC0gRExTIHNldHVwIGNhc2VcbiIpKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWVsc2UgaWYgKChpIDwgTUFYX05VTV9PRl9ETFNfRU5UUlkpICYmIHBETFMtPlZhbGlkICYmIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkICYmCisJCQkJKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9PSBETFNfRklOSVNIKSAmJiAhTUFDX0FERFJfRVFVQUwocERMUy0+TWFjQWRkciwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcikpCisJCQl7CisJCQkJLy8gNC4gdXBkYXRlIG1hYyBjYXNlLCB0ZWFyIGRvd24gb2xkIERMUyBhbmQgc2V0dXAgbmV3IERMUworCQkJCXJlYXNvbiA9IFJFQVNPTl9RT1NfVU5XQU5URURfTUVDSEFOSVNNOworCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkCT0gRkFMU0U7CisJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzCT0gRExTX05PTkU7CisJCQkJRGxzUGFybUZpbGwocEFkLCAmTWxtZURsc1JlcSwgJnBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLCByZWFzb24pOworCQkJCU1sbWVFbnF1ZXVlKHBBZCwgRExTX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX0RMU19URUFSX0RPV04sIHNpemVvZihNTE1FX0RMU19SRVFfU1RSVUNUKSwgJk1sbWVEbHNSZXEpOworCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXSwgcERMUywgc2l6ZW9mKFJUXzgwMl8xMV9ETFNfVUkpKTsKKwkJCQlEbHNQYXJtRmlsbChwQWQsICZNbG1lRGxzUmVxLCAmcEFkLT5TdGFDZmcuRExTRW50cnlbaV0sIHJlYXNvbik7CisJCQkJTWxtZUVucXVldWUocEFkLCBETFNfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfRExTX1JFUSwgc2l6ZW9mKE1MTUVfRExTX1JFUV9TVFJVQ1QpLCAmTWxtZURsc1JlcSk7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJDTlRMIC0gRExTIHRlYXIgZG93biBhbmQgcmVzdGFydCBjYXNlXG4iKSk7CisJCQkJYnJlYWs7CisJCQl9CisJCQllbHNlIGlmIChwRExTLT5WYWxpZCAmJiBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZCAmJgorCQkJCU1BQ19BRERSX0VRVUFMKHBETFMtPk1hY0FkZHIsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpICYmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5UaW1lT3V0ICE9IHBETFMtPlRpbWVPdXQpKQorCQkJeworCQkJCS8vIDUuIHVwZGF0ZSB0aW1lb3V0IGNhc2UsIHN0YXJ0IERMUyBzZXR1cCBwcm9jZWR1cmUgKG5vIHRlYXIgZG93bikKKwkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5UaW1lT3V0CT0gcERMUy0+VGltZU91dDsKKwkJCQkvL1VwZGF0ZSBjb3VudGRvd24gdGltZXIKKwkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5Db3VudERvd25UaW1lciA9IHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlRpbWVPdXQ7CisJCQkJRGxzUGFybUZpbGwocEFkLCAmTWxtZURsc1JlcSwgJnBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLCByZWFzb24pOworCQkJCU1sbWVFbnF1ZXVlKHBBZCwgRExTX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX0RMU19SRVEsIHNpemVvZihNTE1FX0RMU19SRVFfU1RSVUNUKSwgJk1sbWVEbHNSZXEpOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQ05UTCAtIERMUyB1cGRhdGUgdGltZW91dCBjYXNlXG4iKSk7CisJCQkJYnJlYWs7CisJCQl9CisJCQllbHNlIGlmIChwRExTLT5WYWxpZCAmJiBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZCAmJgorCQkJCShwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgIT0gRExTX0ZJTklTSCkgJiYgTUFDX0FERFJfRVFVQUwocERMUy0+TWFjQWRkciwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcikpCisJCQl7CisJCQkJLy8gNi4gcmUtc2V0dXAgY2FzZSwgc3RhcnQgRExTIHNldHVwIHByb2NlZHVyZSAobm8gdGVhciBkb3duKQorCQkJCURsc1Bhcm1GaWxsKHBBZCwgJk1sbWVEbHNSZXEsICZwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXSwgcmVhc29uKTsKKwkJCQlNbG1lRW5xdWV1ZShwQWQsIERMU19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9ETFNfUkVRLCBzaXplb2YoTUxNRV9ETFNfUkVRX1NUUlVDVCksICZNbG1lRGxzUmVxKTsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkNOVEwgLSBETFMgcmV0cnkgc2V0dXAgcHJvY2VkdXJlXG4iKSk7CisJCQkJYnJlYWs7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfV0FSTiwoIkNOVEwgLSBETFMgbm90IGNoYW5nZWQgaW4gZW50cnkgLSAlZCAtIFZhbGlkPSVkLCBTdGF0dXM9JWQsIFRpbWVPdXQ9JWRcbiIsCisJCQkJCWksIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlRpbWVPdXQpKTsKKwkJCX0KKwkJfQorCX0KK30KKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgQ250bFdhaXREaXNhc3NvY1Byb2MoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCU1MTUVfU1RBUlRfUkVRX1NUUlVDVCAgICAgU3RhcnRSZXE7CisKKwlpZiAoRWxlbS0+TXNnVHlwZSA9PSBNVDJfRElTQVNTT0NfQ09ORikKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBEaXMtYXNzb2NpYXRlIHN1Y2Nlc3NmdWxcbiIpKTsKKworCSAgICBpZiAocEFkLT5Db21tb25DZmcuYldpcmVsZXNzRXZlbnQpCisJCXsKKwkJCVJUTVBTZW5kV2lyZWxlc3NFdmVudChwQWQsIElXX0RJU0FTU09DX0VWRU5UX0ZMQUcsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQWRkciwgQlNTMCwgMCk7CisJCX0KKworCQlMaW5rRG93bihwQWQsIEZBTFNFKTsKKworCQkvLyBjYXNlIDEuIG5vIG1hdGNoaW5nIEJTUywgYW5kIHVzZXIgd2FudHMgQURIT0MsIHNvIHdlIGp1c3Qgc3RhcnQgYSBuZXcgb25lCisJCWlmICgocEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzTnI9PTApICYmIChwQWQtPlN0YUNmZy5Cc3NUeXBlID09IEJTU19BREhPQykpCisJCXsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBObyBtYXRjaGluZyBCU1MsIHN0YXJ0IGEgbmV3IEFESE9DIChTc2lkPSVzKS4uLlxuIixwQWQtPk1sbWVBdXguU3NpZCkpOworCQkJU3RhcnRQYXJtRmlsbChwQWQsICZTdGFydFJlcSwgcEFkLT5NbG1lQXV4LlNzaWQsIHBBZC0+TWxtZUF1eC5Tc2lkTGVuKTsKKwkJCU1sbWVFbnF1ZXVlKHBBZCwgU1lOQ19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9TVEFSVF9SRVEsIHNpemVvZihNTE1FX1NUQVJUX1JFUV9TVFJVQ1QpLCAmU3RhcnRSZXEpOworCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9TVEFSVDsKKwkJfQorCQkvLyBjYXNlIDIuIHRyeSBlYWNoIG1hdGNoZWQgQlNTCisJCWVsc2UKKwkJeworCQkJcEFkLT5NbG1lQXV4LkJzc0lkeCA9IDA7CisKKwkJCUl0ZXJhdGVPbkJzc1RhYihwQWQpOworCQl9CisJfQorfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBDbnRsV2FpdEpvaW5Qcm9jKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlVU0hPUlQgICAgICAgICAgICAgICAgICAgICAgUmVhc29uOworCU1MTUVfQVVUSF9SRVFfU1RSVUNUICAgICAgICBBdXRoUmVxOworCisJaWYgKEVsZW0tPk1zZ1R5cGUgPT0gTVQyX0pPSU5fQ09ORikKKwl7CisJCU5kaXNNb3ZlTWVtb3J5KCZSZWFzb24sIEVsZW0tPk1zZywgc2l6ZW9mKFVTSE9SVCkpOworCQlpZiAoUmVhc29uID09IE1MTUVfU1VDQ0VTUykKKwkJeworCQkJLy8gMS4gam9pbmVkIGFuIElCU1MsIHdlIGFyZSBwcmV0dHkgbXVjaCBkb25lIGhlcmUKKwkJCWlmIChwQWQtPk1sbWVBdXguQnNzVHlwZSA9PSBCU1NfQURIT0MpCisJCQl7CisJCQkgICAgLy8KKwkJCQkvLyA1RyBiYW5kcyBydWxlcyBvZiBKYXBhbjoKKwkJCQkvLyBBZCBob2MgbXVzdCBiZSBkaXNhYmxlZCBpbiBXNTMoY2g1Miw1Niw2MCw2NCkgY2hhbm5lbHMuCisJCQkJLy8KKwkJCQlpZiAoIChwQWQtPkNvbW1vbkNmZy5iSUVFRTgwMjExSCA9PSAxKSAmJgorICAgICAgICAgICAgICAgICAgICAgIFJhZGFyQ2hhbm5lbENoZWNrKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkKKwkJCQkgICApCisJCQkJeworCQkJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9JRExFOworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gQ2hhbm5lbD0lZCwgSm9pbiBhZGhvYyBvbiBXNTMoNTIsNTYsNjAsNjQpIENoYW5uZWxzIGFyZSBub3QgYWNjZXB0ZWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpKTsKKwkJCQkJcmV0dXJuOworCQkJCX0KKworCQkJCUxpbmtVcChwQWQsIEJTU19BREhPQyk7CisJCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfSURMRTsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gam9pbiB0aGUgSUJTUyA9ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IC4uLlxuIiwKKwkJCQlwQWQtPkNvbW1vbkNmZy5Cc3NpZFswXSxwQWQtPkNvbW1vbkNmZy5Cc3NpZFsxXSxwQWQtPkNvbW1vbkNmZy5Cc3NpZFsyXSwKKwkJCQlwQWQtPkNvbW1vbkNmZy5Cc3NpZFszXSxwQWQtPkNvbW1vbkNmZy5Cc3NpZFs0XSxwQWQtPkNvbW1vbkNmZy5Cc3NpZFs1XSkpOworCisgICAgICAgICAgICAgICAgcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZUNvbm5lY3RlZDsKKyAgICAgICAgICAgICAgICBwQWQtPkV4dHJhSW5mbyA9IEdFTkVSQUxfTElOS19VUDsKKwkJCX0KKwkJCS8vIDIuIGpvaW5lZCBhIG5ldyBJTkZSQSBuZXR3b3JrLCBzdGFydCBmcm9tIGF1dGhlbnRpY2F0aW9uCisJCQllbHNlCisJCQl7CisjaWZkZWYgTEVBUF9TVVBQT1JUCisJCQkJLy8gQWRkIEF1dGhNb2RlICJMRUFQIiBmb3IgQ0NYIDEuWAorCQkJCWlmIChwQWQtPlN0YUNmZy5MZWFwQXV0aE1vZGUgPT0gQ0lTQ09fQXV0aE1vZGVMRUFQKQorCQkJCXsKKwkJCQkJQXV0aFBhcm1GaWxsKHBBZCwgJkF1dGhSZXEsIHBBZC0+TWxtZUF1eC5Cc3NpZCwgQ0lTQ09fQXV0aE1vZGVMRUFQKTsKKwkJCQl9CisJCQkJZWxzZQorI2VuZGlmIC8vIExFQVBfU1VQUE9SVCAvLworCQkJCXsKKwkJCQkJLy8gZWl0aGVyIE5kaXM4MDJfMTFBdXRoTW9kZVNoYXJlZCBvciBOZGlzODAyXzExQXV0aE1vZGVBdXRvU3dpdGNoLCB0cnkgc2hhcmVkIGtleSBmaXJzdAorCQkJCQlpZiAoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVNoYXJlZCkgfHwKKwkJCQkJCShwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVBdXRvU3dpdGNoKSkKKwkJCQkJeworCQkJCQkJQXV0aFBhcm1GaWxsKHBBZCwgJkF1dGhSZXEsIHBBZC0+TWxtZUF1eC5Cc3NpZCwgTmRpczgwMl8xMUF1dGhNb2RlU2hhcmVkKTsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCUF1dGhQYXJtRmlsbChwQWQsICZBdXRoUmVxLCBwQWQtPk1sbWVBdXguQnNzaWQsIE5kaXM4MDJfMTFBdXRoTW9kZU9wZW4pOworCQkJCQl9CisJCQkJfQorCQkJCU1sbWVFbnF1ZXVlKHBBZCwgQVVUSF9TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9BVVRIX1JFUSwKKwkJCQkJCQlzaXplb2YoTUxNRV9BVVRIX1JFUV9TVFJVQ1QpLCAmQXV0aFJlcSk7CisKKwkJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX0FVVEg7CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQkvLyAzLiBmYWlsZWQsIHRyeSBuZXh0IEJTUworCQkJcEFkLT5NbG1lQXV4LkJzc0lkeCsrOworCQkJSXRlcmF0ZU9uQnNzVGFiKHBBZCk7CisJCX0KKwl9Cit9CisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgQ250bFdhaXRTdGFydFByb2MoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCVVTSE9SVCAgICAgIFJlc3VsdDsKKworCWlmIChFbGVtLT5Nc2dUeXBlID09IE1UMl9TVEFSVF9DT05GKQorCXsKKwkJTmRpc01vdmVNZW1vcnkoJlJlc3VsdCwgRWxlbS0+TXNnLCBzaXplb2YoVVNIT1JUKSk7CisJCWlmIChSZXN1bHQgPT0gTUxNRV9TVUNDRVNTKQorCQl7CisJCSAgICAvLworCQkJLy8gNUcgYmFuZHMgcnVsZXMgb2YgSmFwYW46CisJCQkvLyBBZCBob2MgbXVzdCBiZSBkaXNhYmxlZCBpbiBXNTMoY2g1Miw1Niw2MCw2NCkgY2hhbm5lbHMuCisJCQkvLworCQkJaWYgKCAocEFkLT5Db21tb25DZmcuYklFRUU4MDIxMUggPT0gMSkgJiYKKyAgICAgICAgICAgICAgICAgIFJhZGFyQ2hhbm5lbENoZWNrKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkKKwkJCSAgICkKKwkJCXsKKwkJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9JRExFOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBDaGFubmVsPSVkLCBTdGFydCBhZGhvYyBvbiBXNTMoNTIsNTYsNjAsNjQpIENoYW5uZWxzIGFyZSBub3QgYWNjZXB0ZWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpKTsKKwkJCQlyZXR1cm47CisJCQl9CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQlpZiAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEKQorCQkJeworCQkJCU5fQ2hhbm5lbENoZWNrKHBBZCk7CisJCQkJU2V0Q29tbW9uSFQocEFkKTsKKwkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5NbG1lQXV4LkFkZEh0SW5mbywgJnBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mbywgc2l6ZW9mKEFERF9IVF9JTkZPX0lFKSk7CisJCQkJUlRNUENoZWNrSHQocEFkLCBCU1NJRF9XQ0lELCAmcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5LCAmcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvKTsKKwkJCQlwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLmJIdEVuYWJsZSA9IFRSVUU7CisJCQkJTmRpc1plcm9NZW1vcnkoJnBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uTUNTU2V0WzBdLCAxNik7CisJCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uTUNTU2V0WzBdLCAmcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lk1DU1NldFswXSwgMTYpOworCQkJCUNPUFlfSFRTRVRUSU5HU19GUk9NX01MTUVfQVVYX1RPX0FDVElWRV9DRkcocEFkKTsKKworCQkJCWlmICgocEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5DaGFubmVsV2lkdGggID09IEJXXzQwKSAmJgorCQkJCQkocEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLkFkZEh0SW5mby5FeHRDaGFuT2Zmc2V0ID09IEVYVENIQV9BQk9WRSkpCisJCQkJeworCQkJCQlwQWQtPk1sbWVBdXguQ2VudHJhbENoYW5uZWwgPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsICsgMjsKKwkJCQl9CisJCQkJZWxzZSBpZiAoKHBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQ2hhbm5lbFdpZHRoICA9PSBCV180MCkgJiYKKwkJCQkJCSAocEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLkFkZEh0SW5mby5FeHRDaGFuT2Zmc2V0ID09IEVYVENIQV9CRUxPVykpCisJCQkJeworCQkJCQlwQWQtPk1sbWVBdXguQ2VudHJhbENoYW5uZWwgPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsIC0gMjsKKwkJCQl9CisJCQl9CisJCQllbHNlCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCQl7CisJCQkJcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5iSHRFbmFibGUgPSBGQUxTRTsKKwkJCX0KKwkJCUxpbmtVcChwQWQsIEJTU19BREhPQyk7CisJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9JRExFOworCQkJLy8gQmVmb3JlIHNlbmQgYmVhY29uLCBkcml2ZXIgbmVlZCBkbyByYWRhciBkZXRlY3Rpb24KKwkJCWlmICgocEFkLT5Db21tb25DZmcuQ2hhbm5lbCA+IDE0ICkKKwkJCQkmJiAocEFkLT5Db21tb25DZmcuYklFRUU4MDIxMUggPT0gMSkKKwkJCQkmJiBSYWRhckNoYW5uZWxDaGVjayhwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpKQorCQkJeworCQkJCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJETW9kZSA9IFJEX1NJTEVOQ0VfTU9ERTsKKwkJCQlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5SRENvdW50ID0gMDsKKyNpZmRlZiBERlNfU1VQUE9SVAorCQkJCUJicFJhZGFyRGV0ZWN0aW9uU3RhcnQocEFkKTsKKyNlbmRpZiAvLyBERlNfU1VQUE9SVCAvLworCQkJfQorCisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gc3RhcnQgYSBuZXcgSUJTUyA9ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IC4uLlxuIiwKKwkJCQlwQWQtPkNvbW1vbkNmZy5Cc3NpZFswXSxwQWQtPkNvbW1vbkNmZy5Cc3NpZFsxXSxwQWQtPkNvbW1vbkNmZy5Cc3NpZFsyXSwKKwkJCQlwQWQtPkNvbW1vbkNmZy5Cc3NpZFszXSxwQWQtPkNvbW1vbkNmZy5Cc3NpZFs0XSxwQWQtPkNvbW1vbkNmZy5Cc3NpZFs1XSkpOworCQl9CisJCWVsc2UKKwkJeworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ05UTCAtIFN0YXJ0IElCU1MgZmFpbC4gQlVHISEhISFcbiIpKTsKKwkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX0lETEU7CisJCX0KKwl9Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIENudGxXYWl0QXV0aFByb2MoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCVVTSE9SVCAgICAgICAgICAgICAgICAgICAgICAgUmVhc29uOworCU1MTUVfQVNTT0NfUkVRX1NUUlVDVCAgICAgICAgQXNzb2NSZXE7CisJTUxNRV9BVVRIX1JFUV9TVFJVQ1QgICAgICAgICBBdXRoUmVxOworCisJaWYgKEVsZW0tPk1zZ1R5cGUgPT0gTVQyX0FVVEhfQ09ORikKKwl7CisJCU5kaXNNb3ZlTWVtb3J5KCZSZWFzb24sIEVsZW0tPk1zZywgc2l6ZW9mKFVTSE9SVCkpOworCQlpZiAoUmVhc29uID09IE1MTUVfU1VDQ0VTUykKKwkJeworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ05UTCAtIEFVVEggT0tcbiIpKTsKKwkJCUFzc29jUGFybUZpbGwocEFkLCAmQXNzb2NSZXEsIHBBZC0+TWxtZUF1eC5Cc3NpZCwgcEFkLT5NbG1lQXV4LkNhcGFiaWxpdHlJbmZvLAorCQkJCQkJICBBU1NPQ19USU1FT1VULCBwQWQtPlN0YUNmZy5EZWZhdWx0TGlzdGVuQ291bnQpOworCisjaWZkZWYgTEVBUF9TVVBQT1JUCisJCQkvLworCQkJLy8gQ2lzY28gTGVhcCBDQ0tNIHN1cHBvcnRlZCBSZS1hc3NvY2lhdGlvbi4KKwkJCS8vCisJCQlpZiAoTEVBUF9DQ0tNX09OKHBBZCkgJiYgKHBBZC0+U3RhQ2ZnLkNDS01MaW5rVXBGbGFnID09IFRSVUUpKQorCQkJeworCQkJCS8vaWYgQ0NLTSBpcyB0dXJuIG9uICwgdGhhdCdzIG1lYW4gRmFzdCBSZWF1dGhlbnRpY2F0aW9uCisJCQkJLy9Vc2UgQ0NLTSBSZWFzc29jaWF0aW9uIGluc3RlYWQgb2Ygbm9ybWFsIGFzc29jaWF0aW9uIGZvciBGYXN0IFJvYW1pbmcuCisJCQkJTWxtZUVucXVldWUocEFkLCBBU1NPQ19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9SRUFTU09DX1JFUSwKKwkJCQkJCQlzaXplb2YoTUxNRV9BU1NPQ19SRVFfU1RSVUNUKSwgJkFzc29jUmVxKTsKKworCQkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX1dBSVRfUkVBU1NPQzsKKwkJCX0KKwkJCWVsc2UKKyNlbmRpZiAvLyBMRUFQX1NVUFBPUlQgLy8KKwkJCXsKKwkJCQlNbG1lRW5xdWV1ZShwQWQsIEFTU09DX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX0FTU09DX1JFUSwKKwkJCQkJCQlzaXplb2YoTUxNRV9BU1NPQ19SRVFfU1RSVUNUKSwgJkFzc29jUmVxKTsKKworCQkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX1dBSVRfQVNTT0M7CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQkvLyBUaGlzIGZhaWwgbWF5IGJlY2F1c2Ugb2YgdGhlIEFQIGFscmVhZHkga2VlcCB1cyBpbiBpdHMgTUFDIHRhYmxlIHdpdGhvdXQKKwkJCS8vIGFnZWluZy1vdXQuIFRoZSBwcmV2aW91cyBhdXRoZW50aWNhdGlvbiBhdHRlbXB0IG11c3QgaGF2ZSBsZXQgaXQgcmVtb3ZlIHVzLgorCQkJLy8gc28gdHJ5IEF1dGhlbnRpY2F0aW9uIGFnYWluIG1heSBoZWxwLiBGb3IgRC1MaW5rIERXTC05MDBBUCsgY29tcGF0aWJpbGl0eS4KKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBBVVRIIEZBSUwsIHRyeSBhZ2Fpbi4uLlxuIikpOworI2lmZGVmIExFQVBfU1VQUE9SVAorCQkJLy9BZGQgQXV0aE1vZGUgIkxFQVAiIGZvciBDQ1ggMS5YCisJCQlpZiAocEFkLT5TdGFDZmcuTGVhcEF1dGhNb2RlID09IENJU0NPX0F1dGhNb2RlTEVBUCkKKwkJCXsKKwkJCQlBdXRoUGFybUZpbGwocEFkLCAmQXV0aFJlcSwgcEFkLT5NbG1lQXV4LkJzc2lkLCBDSVNDT19BdXRoTW9kZUxFQVApOworCQkJfQorCQkJZWxzZQorI2VuZGlmIC8vIExFQVBfU1VQUE9SVCAvLworCQkJeworCQkJCWlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlU2hhcmVkKSB8fAorCQkJCQkocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlQXV0b1N3aXRjaCkpCisJCQkJeworCQkJCQkvLyBlaXRoZXIgTmRpczgwMl8xMUF1dGhNb2RlU2hhcmVkIG9yIE5kaXM4MDJfMTFBdXRoTW9kZUF1dG9Td2l0Y2gsIHRyeSBzaGFyZWQga2V5IGZpcnN0CisJCQkJCUF1dGhQYXJtRmlsbChwQWQsICZBdXRoUmVxLCBwQWQtPk1sbWVBdXguQnNzaWQsIE5kaXM4MDJfMTFBdXRoTW9kZVNoYXJlZCk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCUF1dGhQYXJtRmlsbChwQWQsICZBdXRoUmVxLCBwQWQtPk1sbWVBdXguQnNzaWQsIE5kaXM4MDJfMTFBdXRoTW9kZU9wZW4pOworCQkJCX0KKwkJCX0KKwkJCU1sbWVFbnF1ZXVlKHBBZCwgQVVUSF9TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9BVVRIX1JFUSwKKwkJCQkJCXNpemVvZihNTE1FX0FVVEhfUkVRX1NUUlVDVCksICZBdXRoUmVxKTsKKworCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9BVVRIMjsKKwkJfQorCX0KK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgQ250bFdhaXRBdXRoUHJvYzIoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCVVTSE9SVCAgICAgICAgICAgICAgICAgICAgICAgUmVhc29uOworCU1MTUVfQVNTT0NfUkVRX1NUUlVDVCAgICAgICAgQXNzb2NSZXE7CisJTUxNRV9BVVRIX1JFUV9TVFJVQ1QgICAgICAgICBBdXRoUmVxOworCisJaWYgKEVsZW0tPk1zZ1R5cGUgPT0gTVQyX0FVVEhfQ09ORikKKwl7CisJCU5kaXNNb3ZlTWVtb3J5KCZSZWFzb24sIEVsZW0tPk1zZywgc2l6ZW9mKFVTSE9SVCkpOworCQlpZiAoUmVhc29uID09IE1MTUVfU1VDQ0VTUykKKwkJeworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ05UTCAtIEFVVEggT0tcbiIpKTsKKwkJCUFzc29jUGFybUZpbGwocEFkLCAmQXNzb2NSZXEsIHBBZC0+TWxtZUF1eC5Cc3NpZCwgcEFkLT5NbG1lQXV4LkNhcGFiaWxpdHlJbmZvLAorCQkJCQkJICBBU1NPQ19USU1FT1VULCBwQWQtPlN0YUNmZy5EZWZhdWx0TGlzdGVuQ291bnQpOworCQkJTWxtZUVucXVldWUocEFkLCBBU1NPQ19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9BU1NPQ19SRVEsCisJCQkJCQlzaXplb2YoTUxNRV9BU1NPQ19SRVFfU1RSVUNUKSwgJkFzc29jUmVxKTsKKworCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9BU1NPQzsKKwkJfQorCQllbHNlCisJCXsKKyNpZmRlZiBMRUFQX1NVUFBPUlQKKwkJCS8vIFByb2Nlc3MgTEVBUCBmaXJzdCwgc2luY2UgaXQgdXNlIGRpZmZlcmVudCBjb250cm9sIHZhcmlhYmxlCisJCQkvLyBXZSBkb24ndCB3YW50IHRvIGFmZmVjdCBvdGhlciBwb3ZlbiBvcGVyYXRpb24KKwkJCWlmIChwQWQtPlN0YUNmZy5MZWFwQXV0aE1vZGUgPT0gQ0lTQ09fQXV0aE1vZGVMRUFQKQorCQkJeworCQkJCS8vIExFQVAgQXV0aCBub3Qgc3VjY2VzcywgdHJ5IG5leHQgQlNTCisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ05UTCAtICpMRUFQKiBBVVRIIEZBSUwsIGdpdmUgdXA7IHRyeSBuZXh0IEJTU1xuIikpOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlRvdGFsIG1hdGNoIEJTU0lEIFs9JWRdXG4iLCBwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NOcikpOworCQkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX0lETEU7CisJCQkJcEFkLT5NbG1lQXV4LkJzc0lkeCsrOworCQkJCUl0ZXJhdGVPbkJzc1RhYihwQWQpOworCQkJfQorCQkJZWxzZQorI2VuZGlmIC8vIExFQVBfU1VQUE9SVCAvLworCQkJaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVBdXRvU3dpdGNoKSAmJgorCQkJCSAocEFkLT5NbG1lQXV4LkFsZyA9PSBOZGlzODAyXzExQXV0aE1vZGVTaGFyZWQpKQorCQkJeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBBVVRIIEZBSUwsIHRyeSBPUEVOIHN5c3RlbS4uLlxuIikpOworCQkJCUF1dGhQYXJtRmlsbChwQWQsICZBdXRoUmVxLCBwQWQtPk1sbWVBdXguQnNzaWQsIE5kaXM4MDJfMTFBdXRoTW9kZU9wZW4pOworCQkJCU1sbWVFbnF1ZXVlKHBBZCwgQVVUSF9TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9BVVRIX1JFUSwKKwkJCQkJCQlzaXplb2YoTUxNRV9BVVRIX1JFUV9TVFJVQ1QpLCAmQXV0aFJlcSk7CisKKwkJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX0FVVEgyOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCS8vIG5vdCBzdWNjZXNzLCB0cnkgbmV4dCBCU1MKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gQVVUSCBGQUlMLCBnaXZlIHVwOyB0cnkgbmV4dCBCU1NcbiIpKTsKKwkJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9JRExFOyAvLz8/Pz8/Pz8KKwkJCQlwQWQtPk1sbWVBdXguQnNzSWR4Kys7CisJCQkJSXRlcmF0ZU9uQnNzVGFiKHBBZCk7CisJCQl9CisJCX0KKwl9Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIENudGxXYWl0QXNzb2NQcm9jKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlVU0hPUlQgICAgICBSZWFzb247CisKKwlpZiAoRWxlbS0+TXNnVHlwZSA9PSBNVDJfQVNTT0NfQ09ORikKKwl7CisJCU5kaXNNb3ZlTWVtb3J5KCZSZWFzb24sIEVsZW0tPk1zZywgc2l6ZW9mKFVTSE9SVCkpOworCQlpZiAoUmVhc29uID09IE1MTUVfU1VDQ0VTUykKKwkJeworCQkJTGlua1VwKHBBZCwgQlNTX0lORlJBKTsKKwkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX0lETEU7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gQXNzb2NpYXRpb24gc3VjY2Vzc2Z1bCBvbiBCU1MgIyVsZFxuIixwQWQtPk1sbWVBdXguQnNzSWR4KSk7CisKKwkJCWlmIChwQWQtPkNvbW1vbkNmZy5iV2lyZWxlc3NFdmVudCkKKwkJCXsKKwkJCQlSVE1QU2VuZFdpcmVsZXNzRXZlbnQocEFkLCBJV19BU1NPQ19FVkVOVF9GTEFHLCBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkFkZHIsIEJTUzAsIDApOworCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJLy8gbm90IHN1Y2Nlc3MsIHRyeSBuZXh0IEJTUworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ05UTCAtIEFzc29jaWF0aW9uIGZhaWxzIG9uIEJTUyAjJWxkXG4iLHBBZC0+TWxtZUF1eC5Cc3NJZHgpKTsKKwkJCXBBZC0+TWxtZUF1eC5Cc3NJZHgrKzsKKwkJCUl0ZXJhdGVPbkJzc1RhYihwQWQpOworCQl9CisJfQorfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBDbnRsV2FpdFJlYXNzb2NQcm9jKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlVU0hPUlQgICAgICBSZXN1bHQ7CisKKwlpZiAoRWxlbS0+TXNnVHlwZSA9PSBNVDJfUkVBU1NPQ19DT05GKQorCXsKKwkJTmRpc01vdmVNZW1vcnkoJlJlc3VsdCwgRWxlbS0+TXNnLCBzaXplb2YoVVNIT1JUKSk7CisJCWlmIChSZXN1bHQgPT0gTUxNRV9TVUNDRVNTKQorCQl7CisJCQkvLworCQkJLy8gTkRJUyByZXF1aXJlcyBhIG5ldyBMaW5rIFVQIGluZGljYXRpb24gYnV0IG5vIExpbmsgRG93biBmb3IgUkUtQVNTT0MKKwkJCS8vCisJCQlMaW5rVXAocEFkLCBCU1NfSU5GUkEpOworCisJCQkvLyBzZW5kIHdpcmVsZXNzIGV2ZW50IC0gZm9yIGFzc29jaWF0aW9uCisJCQlpZiAocEFkLT5Db21tb25DZmcuYldpcmVsZXNzRXZlbnQpCisJCQkJUlRNUFNlbmRXaXJlbGVzc0V2ZW50KHBBZCwgSVdfQVNTT0NfRVZFTlRfRkxBRywgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5BZGRyLCBCU1MwLCAwKTsKKworCisjaWZkZWYgTEVBUF9TVVBQT1JUCisJCQlpZiAoTEVBUF9DQ0tNX09OKHBBZCkpCisJCQl7CisJCQkJU1RBX1BPUlRfU0VDVVJFRChwQWQpOworCQkJCXBBZC0+U3RhQ2ZnLldwYVN0YXRlID0gU1NfRklOSVNIOworCQkJfQorI2VuZGlmIC8vIExFQVBfU1VQUE9SVCAvLworCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfSURMRTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBSZS1hc3NvY2l0aW9uIHN1Y2Nlc3NmdWwgb24gQlNTICMlbGRcbiIsIHBBZC0+TWxtZUF1eC5Sb2FtSWR4KSk7CisJCX0KKwkJZWxzZQorCQl7CisJCQkvLyByZWFzc29jIGZhaWxlZCwgdHJ5IHRvIHBpY2sgbmV4dCBCU1MgaW4gdGhlIEJTUyBUYWJsZQorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ05UTCAtIFJlLWFzc29jaXRpb24gZmFpbHMgb24gQlNTICMlbGRcbiIsIHBBZC0+TWxtZUF1eC5Sb2FtSWR4KSk7CisJCQlwQWQtPk1sbWVBdXguUm9hbUlkeCsrOworCQkJSXRlcmF0ZU9uQnNzVGFiMihwQWQpOworCQl9CisJfQorfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBMaW5rVXAoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVUNIQVIgQnNzVHlwZSkKK3sKKwlVTE9ORwlOb3c7CisJVUlOVDMyCURhdGE7CisJQk9PTEVBTglDYW5jZWxsZWQ7CisJVUNIQVIJVmFsdWUgPSAwLCBpZHg7CisJTUFDX1RBQkxFX0VOVFJZICpwRW50cnkgPSBOVUxMLCAqcEN1cnJFbnRyeTsKKworCXBFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdOworCisJLy8KKwkvLyBBU1NPQyAtIERpc2Fzc29jVGltZW91dEFjdGlvbgorCS8vIENOVEwgLSBEaXMtYXNzb2NpYXRlIHN1Y2Nlc3NmdWwKKwkvLyAhISEgTElOSyBET1dOICEhIQorCS8vIFs4ODg4OF0gT0lEXzgwMl8xMV9TU0lEIHNob3VsZCBoYXZlIHJldHVybmVkIE5EVEVTVF9XRVBfQVAyKFJldHVybmVkOiApCisJLy8KKwkvLyBUbyBwcmV2ZW50IERpc2Fzc29jVGltZW91dEFjdGlvbiB0byBjYWxsIExpbmsgZG93biBhZnRlciB3ZSBsaW5rIHVwLAorCS8vIGNhbmNlbCB0aGUgRGlzYXNzb2NUaW1lciBubyBtYXR0ZXIgd2hhdCBpdCBzdGFydCBvciBub3QuCisJLy8KKwlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5EaXNhc3NvY1RpbWVyLCAgJkNhbmNlbGxlZCk7CisKKwlDT1BZX1NFVFRJTkdTX0ZST01fTUxNRV9BVVhfVE9fQUNUSVZFX0NGRyhwQWQpOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJQ09QWV9IVFNFVFRJTkdTX0ZST01fTUxNRV9BVVhfVE9fQUNUSVZFX0NGRyhwQWQpOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCS8vIEl0J3MgcXVpdGUgZGlmZmljdWx0IHRvIHRlbGwgaWYgYSBuZXdseSBhZGRlZCBLRVkgaXMgV0VQIG9yIENLSVAgdW50aWwgYSBuZXcgQlNTCisJLy8gaXMgZm9ybWVkIChlaXRoZXIgQVNTT0MvUkUtQVNTT0MgZG9uZSBvciBJQlNTIHN0YXJ0ZWQuIExpbmtVUCBzaG91bGQgYmUgYSBzYWZlIHBsYWNlCisJLy8gdG8gZXhhbWluZSBpZiBjaXBoZXIgYWxnb3JpdGhtIHN3aXRjaGluZyBpcyByZXF1aXJlZC4KKwkvL3J0Mjg2MGIuIERvbid0IGtub3cgd2h5IG5lZWQgdGhpcworCVN3aXRjaEJldHdlZW5XZXBBbmRDa2lwKHBBZCk7CisKKyNpZmRlZiBSVDI4NjAKKwkvLyBCZWZvcmUgcG93ZXIgc2F2ZSBiZWZvcmUgbGluayB1cCBmdW5jdGlvbiwgV2Ugd2lsbCBmb3JjZSB1c2UgMVIuCisJLy8gU28gYWZ0ZXIgbGluayB1cCwgY2hlY2sgUnggYW50ZW5uYSAjIGFnYWluLgorCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgJlZhbHVlKTsKKwlpZihwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDMpCisJeworCQlWYWx1ZSB8PSAoMHgxMCk7CisJfQorCWVsc2UgaWYocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAyKQorCXsKKwkJVmFsdWUgfD0gKDB4OCk7CisJfQorCWVsc2UgaWYocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAxKQorCXsKKwkJVmFsdWUgfD0gKDB4MCk7CisJfQorCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsIFZhbHVlKTsKKwlwQWQtPlN0YUNmZy5CQlBSMyA9IFZhbHVlOworI2VuZGlmIC8vIFJUMjg2MCAvLworCisJaWYgKEJzc1R5cGUgPT0gQlNTX0FESE9DKQorCXsKKwkJT1BTVEFUVVNfU0VUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0FESE9DX09OKTsKKwkJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfSU5GUkFfT04pOworCisjaWZkZWYgQ0FSUklFUl9ERVRFQ1RJT05fU1VQUE9SVCAvLyBSb2dlciBzeW5jIENhcnJpZXIKKwkJLy8gTm8gY2FycmllciBkZXRlY3Rpb24gd2hlbiBhZGhvYworCQkvLyBDYXJyaWVyRGV0ZWN0aW9uU3RvcChwQWQpOworCQlwQWQtPkNvbW1vbkNmZy5DYXJyaWVyRGV0ZWN0LkNEX1N0YXRlID0gQ0RfTk9STUFMOworI2VuZGlmIC8vIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQgLy8KKworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISFBZGhvYyBMSU5LIFVQICEhISBcbiIgKSk7CisJfQorCWVsc2UKKwl7CisJCU9QU1RBVFVTX1NFVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19JTkZSQV9PTik7CisJCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0FESE9DX09OKTsKKworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISFJbmZyYSBMSU5LIFVQICEhISBcbiIgKSk7CisJfQorCisJLy8gMyozCisJLy8gcmVzZXQgVHggYmVhbWZvcm1pbmcgYml0CisJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCAmVmFsdWUpOworCVZhbHVlICY9ICh+MHgwMSk7CisJVmFsdWUgfD0gcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLlR4QkY7CisJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgVmFsdWUpOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJLy8gQ2hhbmdlIHRvIEFQIGNoYW5uZWwKKyAgICBpZiAoKHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsID4gcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkgJiYgKHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkNoYW5uZWxXaWR0aCA9PSBCV180MCkpCisJeworCQkvLyBNdXN0IHVzaW5nIDQwTUh6LgorCQlwQWQtPkNvbW1vbkNmZy5CQlBDdXJyZW50QlcgPSBCV180MDsKKwkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCwgRkFMU0UpOworCQlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCk7CisKKwkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCAmVmFsdWUpOworCQlWYWx1ZSAmPSAofjB4MTgpOworCQlWYWx1ZSB8PSAweDEwOworCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCBWYWx1ZSk7CisKKwkJLy8gIFJYIDogY29udHJvbCBjaGFubmVsIGF0IGxvd2VyCisJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgJlZhbHVlKTsKKwkJVmFsdWUgJj0gKH4weDIwKTsKKwkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgVmFsdWUpOworI2lmZGVmIFJUMjg2MAorICAgICAgICBwQWQtPlN0YUNmZy5CQlBSMyA9IFZhbHVlOworI2VuZGlmIC8vIFJUMjg2MCAvLworCisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfQkFORF9DRkcsICZEYXRhKTsKKwkJRGF0YSAmPSAweGZmZmZmZmZlOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9CQU5EX0NGRywgRGF0YSk7CisKKwkJaWYgKHBBZC0+TUFDVmVyc2lvbiA9PSAweDI4NjAwMTAwKQorCQl7CisJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2OSwgMHgxQSk7CisJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I3MCwgMHgwQSk7CisJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I3MywgMHgxNik7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISFydDI4NjBDICEhISBcbiIgKSk7CisJCX0KKworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISE0ME1IeiBMb3dlciBMSU5LIFVQICEhISBDb250cm9sIENoYW5uZWwgYXQgQmVsb3cuIENlbnRyYWwgPSAlZCBcbiIsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsICkpOworCX0KKwllbHNlIGlmICgocEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKSAmJiAocEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQ2hhbm5lbFdpZHRoID09IEJXXzQwKSkKKyAgICB7CisJICAgIC8vIE11c3QgdXNpbmcgNDBNSHouCisJCXBBZC0+Q29tbW9uQ2ZnLkJCUEN1cnJlbnRCVyA9IEJXXzQwOworCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsLCBGQUxTRSk7CisJICAgIEFzaWNMb2NrQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsKTsKKworCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsICZWYWx1ZSk7CisJCVZhbHVlICY9ICh+MHgxOCk7CisJCVZhbHVlIHw9IDB4MTA7CisJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsIFZhbHVlKTsKKworCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0JBTkRfQ0ZHLCAmRGF0YSk7CisJCURhdGEgfD0gMHgxOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9CQU5EX0NGRywgRGF0YSk7CisKKwkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCAmVmFsdWUpOworCSAgICBWYWx1ZSB8PSAoMHgyMCk7CisJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsIFZhbHVlKTsKKyNpZmRlZiBSVDI4NjAKKyAgICAgICAgcEFkLT5TdGFDZmcuQkJQUjMgPSBWYWx1ZTsKKyNlbmRpZiAvLyBSVDI4NjAgLy8KKworCQlpZiAocEFkLT5NQUNWZXJzaW9uID09IDB4Mjg2MDAxMDApCisJCXsKKwkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY5LCAweDFBKTsKKwkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjcwLCAweDBBKTsKKwkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjczLCAweDE2KTsKKwkJCSAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISFydDI4NjBDICEhISBcbiIgKSk7CisJCX0KKworCSAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgNDBNSHogVXBwZXIgTElOSyBVUCAhISEgQ29udHJvbCBDaGFubmVsIGF0IFVwcGVyQ2VudHJhbCA9ICVkIFxuIiwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgKSk7CisgICAgfQorICAgIGVsc2UKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKyAgICB7CisJICAgIHBBZC0+Q29tbW9uQ2ZnLkJCUEN1cnJlbnRCVyA9IEJXXzIwOworCQlwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWw7CisJCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCwgRkFMU0UpOworCQlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKTsKKworCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsICZWYWx1ZSk7CisJCVZhbHVlICY9ICh+MHgxOCk7CisJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsIFZhbHVlKTsKKworCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0JBTkRfQ0ZHLCAmRGF0YSk7CisJCURhdGEgJj0gMHhmZmZmZmZmZTsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfQkFORF9DRkcsIERhdGEpOworCisJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgJlZhbHVlKTsKKwkJVmFsdWUgJj0gKH4weDIwKTsKKwkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgVmFsdWUpOworI2lmZGVmIFJUMjg2MAorICAgICAgICBwQWQtPlN0YUNmZy5CQlBSMyA9IFZhbHVlOworI2VuZGlmIC8vIFJUMjg2MCAvLworCisJCWlmIChwQWQtPk1BQ1ZlcnNpb24gPT0gMHgyODYwMDEwMCkKKwkJeworCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjksIDB4MTYpOworCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNzAsIDB4MDgpOworCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNzMsIDB4MTEpOworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhcnQyODYwQyAhISEgXG4iICkpOworCQl9CisKKwkgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIDIwTUh6IExJTksgVVAgISEhIFxuIiApKTsKKyAgICB9CisKKwlSVE1QU2V0QUdDSW5pdFZhbHVlKHBBZCwgcEFkLT5Db21tb25DZmcuQkJQQ3VycmVudEJXKTsKKwkvLworCS8vIFNhdmUgQkJQX1I2NiB2YWx1ZSwgaXQgd2lsbCBiZSB1c2VkIGluIFJUVVNCUmVzdW1lTXNkdVRyYW5zbWlzc2lvbgorCS8vCisJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I2NiwgJnBBZC0+QmJwVHVuaW5nLlI2NkN1cnJlbnRWYWx1ZSk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgTElOSyBVUCAhISEgKEJzc1R5cGU9JWQsIEFJRD0lZCwgc3NpZD0lcywgQ2hhbm5lbD0lZCwgQ2VudHJhbENoYW5uZWwgPSAlZClcbiIsCisJCUJzc1R5cGUsIHBBZC0+U3RhQWN0aXZlLkFpZCwgcEFkLT5Db21tb25DZmcuU3NpZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwpKTsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISBMSU5LIFVQICEhISAoRGVuc2l0eSA9JWQsIClcbiIsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uTXBkdURlbnNpdHkpKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCQlBc2ljU2V0QnNzaWQocEFkLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisKKwlBc2ljU2V0U2xvdFRpbWUocEFkLCBUUlVFKTsKKwlBc2ljU2V0RWRjYVBhcm0ocEFkLCAmcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybSk7CisKKwkvLyBDYWxsIHRoaXMgZm9yIFJUUyBwcm90ZWN0aW9uZm9yIGxlZ2FjeSByYXRlLCB3ZSB3aWxsIGFsd2F5cyBlbmFibGUgUlRTIHRocmVzaG9sZCwgYnV0IG5vcm1hbGx5IGl0IHdpbGwgbm90IGhpdAorCUFzaWNVcGRhdGVQcm90ZWN0KHBBZCwgMCwgKE9GRE1TRVRQUk9URUNUIHwgQ0NLU0VUUFJPVEVDVCksIFRSVUUsIEZBTFNFKTsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCWlmICgocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5iSHRFbmFibGUgPT0gVFJVRSkpCisJeworCQkvLyBVcGRhdGUgSFQgcHJvdGVjdGlvbmZvciBiYXNlZCBvbiBBUCdzIG9wZXJhdGluZyBtb2RlLgorICAgIAlpZiAocEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLk5vbkdmUHJlc2VudCA9PSAxKQorICAgIAl7CisgICAgCQlBc2ljVXBkYXRlUHJvdGVjdChwQWQsIHBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi5PcGVyYWlvbk1vZGUsICBBTExOX1NFVFBST1RFQ1QsIEZBTFNFLCBUUlVFKTsKKyAgICAJfQorICAgIAllbHNlCisgICAJCQlBc2ljVXBkYXRlUHJvdGVjdChwQWQsIHBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi5PcGVyYWlvbk1vZGUsICBBTExOX1NFVFBST1RFQ1QsIEZBTFNFLCBGQUxTRSk7CisJfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJTmRpc1plcm9NZW1vcnkoJnBBZC0+RHJzQ291bnRlcnMsIHNpemVvZihDT1VOVEVSX0RSUykpOworCisJTmRpc0dldFN5c3RlbVVwVGltZSgmTm93KTsKKwlwQWQtPlN0YUNmZy5MYXN0QmVhY29uUnhUaW1lID0gTm93OyAgIC8vIGxhc3QgUlggdGltZXN0YW1wCisKKwlpZiAoKHBBZC0+Q29tbW9uQ2ZnLlR4UHJlYW1ibGUgIT0gUnQ4MDJfMTFQcmVhbWJsZUxvbmcpICYmCisJCUNBUF9JU19TSE9SVF9QUkVBTUJMRV9PTihwQWQtPlN0YUFjdGl2ZS5DYXBhYmlsaXR5SW5mbykpCisJeworCQlNbG1lU2V0VHhQcmVhbWJsZShwQWQsIFJ0ODAyXzExUHJlYW1ibGVTaG9ydCk7CisJfQorCisJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQUdHUkVHQVRJT05fSU5VU0VEKTsKKworCWlmIChwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5SRE1vZGUgPT0gUkRfU0lMRU5DRV9NT0RFKQorCXsKKyNpZmRlZiBERlNfU1VQUE9SVAorCQlSYWRhckRldGVjdGlvblN0b3AocEFkKTsKKyNlbmRpZiAvLyBERlNfU1VQUE9SVCAvLworCX0KKwlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5SRE1vZGUgPSBSRF9OT1JNQUxfTU9ERTsKKworCWlmIChCc3NUeXBlID09IEJTU19BREhPQykKKwl7CisJCU1ha2VJYnNzQmVhY29uKHBBZCk7CisJCWlmICgocEFkLT5Db21tb25DZmcuQ2hhbm5lbCA+IDE0KQorCQkJJiYgKHBBZC0+Q29tbW9uQ2ZnLmJJRUVFODAyMTFIID09IDEpCisJCQkmJiBSYWRhckNoYW5uZWxDaGVjayhwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpKQorCQl7CisJCQk7IC8vRG8gbm90aGluZworCQl9CisJCWVsc2UKKwkJeworCQkJQXNpY0VuYWJsZUlic3NTeW5jKHBBZCk7CisJCX0KKworCQkvLyBJbiBhZCBob2MgbW9kZSwgdXNlIE1BQyB0YWJsZSBmcm9tIGluZGV4IDEuCisJCS8vIHAucyBBU0lDIHVzZSBhbGwgMHhmZiBhcyB0ZXJtaW5hdGlvbiBvZiBXQ0lEIHRhYmxlIHNlYXJjaC5UbyBwcmV2ZW50IGl0J3MgMHhmZi1mZi1mZi1mZi1mZi1mZiwgV3JpdGUgMCBoZXJlLgorCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfV0NJRF9CQVNFLCAweDAwKTsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgMHgxODA4LCAweDAwKTsKKworCQkvLyBJZiBXRVAgaXMgZW5hYmxlZCwgYWRkIGtleSBtYXRlcmlhbCBhbmQgY2lwaGVyQWxnIGludG8gQXNpYworCQkvLyBGaWxsIGluIFNoYXJlZCBLZXkgVGFibGUob2Zmc2V0OiAweDZjMDApIGFuZCBTaGFyZWQgS2V5IE1vZGUob2Zmc2V0OiAweDcwMDApCisKKwkJaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExV0VQRW5hYmxlZCkKKwkJeworCQkJUFVDSEFSCUtleTsKKwkJCVVDSEFSIAlDaXBoZXJBbGc7CisKKwkJCWZvciAoaWR4PTA7IGlkeCA8IFNIQVJFX0tFWV9OVU07IGlkeCsrKQorICAgICAgICAJeworCQkJCUNpcGhlckFsZyA9IHBBZC0+U2hhcmVkS2V5W0JTUzBdW2lkeF0uQ2lwaGVyQWxnOworICAgIAkJCUtleSA9IHBBZC0+U2hhcmVkS2V5W0JTUzBdW2lkeF0uS2V5OworCisJCQkJaWYgKHBBZC0+U2hhcmVkS2V5W0JTUzBdW2lkeF0uS2V5TGVuID4gMCkKKwkJCQl7CisJCQkJCS8vIFNldCBrZXkgbWF0ZXJpYWwgYW5kIGNpcGhlckFsZyB0byBBc2ljCisgICAgCQkJCUFzaWNBZGRTaGFyZWRLZXlFbnRyeShwQWQsIEJTUzAsIGlkeCwgQ2lwaGVyQWxnLCBLZXksIE5VTEwsIE5VTEwpOworCisgICAgICAgICAgICAgICAgICAgIGlmIChpZHggPT0gcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkKQorCQkJCQl7CisJCQkJCQkvLyBVcGRhdGUgV0NJRCBhdHRyaWJ1dGUgdGFibGUgYW5kIElWRUlWIHRhYmxlIGZvciB0aGlzIGdyb3VwIGtleSB0YWJsZQorCQkJCQkJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWQsIEJTUzAsIGlkeCwgQ2lwaGVyQWxnLCBOVUxMKTsKKwkJCQkJfQorCQkJCX0KKworCisJCQl9CisJCX0KKwkJLy8gSWYgV1BBTm9uZSBpcyBlbmFibGVkLCBhZGQga2V5IG1hdGVyaWFsIGFuZCBjaXBoZXJBbGcgaW50byBBc2ljCisJCS8vIEZpbGwgaW4gU2hhcmVkIEtleSBUYWJsZShvZmZzZXQ6IDB4NmMwMCkgYW5kIFNoYXJlZCBLZXkgTW9kZShvZmZzZXQ6IDB4NzAwMCkKKwkJZWxzZSBpZiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZSkKKwkJeworCQkJcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkID0gMDsJLy8gYWx3YXlzIGJlIHplcm8KKworICAgICAgICAgICAgTmRpc1plcm9NZW1vcnkoJnBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLCBzaXplb2YoQ0lQSEVSX0tFWSkpOworCQkJCQkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLktleUxlbiA9IExFTl9US0lQX0VLOworCQkJTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5LCBwQWQtPlN0YUNmZy5QTUssIExFTl9US0lQX0VLKTsKKworICAgICAgICAgICAgaWYgKHBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkKKyAgICAgICAgICAgIHsKKyAgICAJCQlOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5SeE1pYywgJnBBZC0+U3RhQ2ZnLlBNS1sxNl0sIExFTl9US0lQX1JYTUlDSyk7CisgICAgCQkJTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uVHhNaWMsICZwQWQtPlN0YUNmZy5QTUtbMTZdLCBMRU5fVEtJUF9UWE1JQ0spOworICAgICAgICAgICAgfQorCisJCQkvLyBEZWNpZGUgaXRzIENoaXBlckFsZworCQkJaWYgKHBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkKKwkJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcgPSBDSVBIRVJfVEtJUDsKKwkJCWVsc2UgaWYgKHBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKKwkJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcgPSBDSVBIRVJfQUVTOworCQkJZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlVua25vdyBDaXBoZXIgKD0lZCksIHNldCBDaXBoZXIgdG8gQUVTXG4iLCBwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyKSk7CisJCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnID0gQ0lQSEVSX0FFUzsKKyAgICAgICAgICAgIH0KKworCQkJLy8gU2V0IGtleSBtYXRlcmlhbCBhbmQgY2lwaGVyQWxnIHRvIEFzaWMKKwkJCUFzaWNBZGRTaGFyZWRLZXlFbnRyeShwQWQsCisJCQkJCQkJCSAgQlNTMCwKKwkJCQkJCQkJICAwLAorCQkJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZywKKwkJCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5LZXksCisJCQkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uVHhNaWMsCisJCQkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uUnhNaWMpOworCisgICAgICAgICAgICAvLyBVcGRhdGUgV0NJRCBhdHRyaWJ1dGUgdGFibGUgYW5kIElWRUlWIHRhYmxlIGZvciB0aGlzIGdyb3VwIGtleSB0YWJsZQorCQkJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWQsIEJTUzAsIDAsIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZywgTlVMTCk7CisKKwkJfQorCisJfQorCWVsc2UgLy8gQlNTX0lORlJBCisJeworCQkvLyBDaGVjayB0aGUgbmV3IFNTSUQgd2l0aCBsYXN0IFNTSUQKKwkJd2hpbGUgKENhbmNlbGxlZCA9PSBUUlVFKQorCQl7CisJCQlpZiAocEFkLT5Db21tb25DZmcuTGFzdFNzaWRMZW4gPT0gcEFkLT5Db21tb25DZmcuU3NpZExlbikKKwkJCXsKKwkJCQlpZiAoUlRNUENvbXBhcmVNZW1vcnkocEFkLT5Db21tb25DZmcuTGFzdFNzaWQsIHBBZC0+Q29tbW9uQ2ZnLlNzaWQsIHBBZC0+Q29tbW9uQ2ZnLkxhc3RTc2lkTGVuKSA9PSAwKQorCQkJCXsKKwkJCQkJLy8gTGluayB0byB0aGUgb2xkIG9uZSBubyBsaW5rZG93biBpcyByZXF1aXJlZC4KKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJLy8gU2VuZCBsaW5rIGRvd24gZXZlbnQgYmVmb3JlIHNldCB0byBsaW5rIHVwCisJCQlwQWQtPkluZGljYXRlTWVkaWFTdGF0ZSA9IE5kaXNNZWRpYVN0YXRlRGlzY29ubmVjdGVkOworCQkJUlRNUF9JbmRpY2F0ZU1lZGlhU3RhdGUocEFkKTsKKyAgICAgICAgICAgIHBBZC0+RXh0cmFJbmZvID0gR0VORVJBTF9MSU5LX0RPV047CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJORElTX1NUQVRVU19NRURJQV9ESVNDT05ORUNUIEV2ZW50IEFBIVxuIikpOworCQkJYnJlYWs7CisJCX0KKworCQkvLworCQkvLyBPbiBXUEEgbW9kZSwgUmVtb3ZlIEFsbCBLZXlzIGlmIG5vdCBjb25uZWN0IHRvIHRoZSBsYXN0IEJTU0lECisJCS8vIEtleSB3aWxsIGJlIHNldCBhZnRlciA0LXdheSBoYW5kc2hha2UuCisJCS8vCisJCWlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKSkKKwkJeworCQkJVUxPTkcgCQlJVjsKKworCQkJLy8gUmVtb3ZlIGFsbCBXUEEga2V5cworCQkJUlRNUFdQQVJlbW92ZUFsbEtleXMocEFkKTsKKwkJCXBBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX05PVF9TRUNVUkVEOworCQkJcEFkLT5TdGFDZmcuUHJpdmFjeUZpbHRlciA9IE5kaXM4MDJfMTFQcml2RmlsdGVyODAyMXhXRVA7CisKKwkJCS8vIEZpeGVkIGNvbm5lY3Rpb24gZmFpbGVkIHdpdGggUmFuZ2UgTWF4aW1pemVyIC0gNTE1IEFQIChNYXJ2ZWxsIENoaXApIHdoZW4gc2VjdXJpdHkgaXMgV1BBUFNLL1RLSVAKKwkJCS8vIElmIElWIHJlbGF0ZWQgdmFsdWVzIGFyZSB0b28gbGFyZ2UgaW4gR3JvdXBNc2cyLCBBUCB3b3VsZCBpZ25vcmUgdGhpcyBtZXNzYWdlLgorCQkJSVYgPSAwOworCQkJSVYgfD0gKHBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCA8PCAzMCk7CisJCQlBc2ljVXBkYXRlV0NJRElWRUlWKHBBZCwgQlNTSURfV0NJRCwgSVYsIDApOworCQl9CisJCS8vIE5PVEU6CisJCS8vIHRoZSBkZWNpc2lvbiBvZiB1c2luZyAic2hvcnQgc2xvdCB0aW1lIiBvciBub3QgbWF5IGNoYW5nZSBkeW5hbWljYWxseSBkdWUgdG8KKwkJLy8gbmV3IFNUQSBhc3NvY2lhdGlvbiB0byB0aGUgQVAuIHNvIHdlIGhhdmUgdG8gZGVjaWRlIHRoYXQgdXBvbiBwYXJzaW5nIEJFQUNPTiwgbm90IGhlcmUKKworCQkvLyBOT1RFOgorCQkvLyB0aGUgZGVjaXNpb24gdG8gdXNlICJSVEMvQ1RTIiBvciAiQ1RTLXRvLXNlbGYiIHByb3RlY3Rpb24gb3Igbm90IG1heSBjaGFuZ2UgZHluYW1pY2FsbHkKKwkJLy8gZHVlIHRvIG5ldyBTVEEgYXNzb2NpYXRpb24gdG8gdGhlIEFQLiBzbyB3ZSBoYXZlIHRvIGRlY2lkZSB0aGF0IHVwb24gcGFyc2luZyBCRUFDT04sIG5vdCBoZXJlCisKKwkJQ29tcG9zZVBzUG9sbChwQWQpOworCQlDb21wb3NlTnVsbEZyYW1lKHBBZCk7CisKKwkJCUFzaWNFbmFibGVCc3NTeW5jKHBBZCk7CisKKwkJLy8gQWRkIEJTU0lEIHRvIFdDSUQgc2VhcmNoIHRhYmxlCisJCUFzaWNVcGRhdGVSeFdDSURUYWJsZShwQWQsIEJTU0lEX1dDSUQsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKworCQlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPk1hY1RhYkxvY2spOworCQkvLyBhZGQgdGhpcyBCU1NJRCBlbnRyeSBpbnRvIEhBU0ggdGFibGUKKwkJeworCQkJVUNIQVIgSGFzaElkeDsKKworCQkJLy9wRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXTsKKwkJCUhhc2hJZHggPSBNQUNfQUREUl9IQVNIX0lOREVYKHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKwkJCWlmIChwQWQtPk1hY1RhYi5IYXNoW0hhc2hJZHhdID09IE5VTEwpCisJCQl7CisJCQkJcEFkLT5NYWNUYWIuSGFzaFtIYXNoSWR4XSA9IHBFbnRyeTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlwQ3VyckVudHJ5ID0gcEFkLT5NYWNUYWIuSGFzaFtIYXNoSWR4XTsKKwkJCQl3aGlsZSAocEN1cnJFbnRyeS0+cE5leHQgIT0gTlVMTCkKKwkJCQkJcEN1cnJFbnRyeSA9IHBDdXJyRW50cnktPnBOZXh0OworCQkJCXBDdXJyRW50cnktPnBOZXh0ID0gcEVudHJ5OworCQkJfQorCQl9CisJCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+TWFjVGFiTG9jayk7CisKKworCQkvLyBJZiBXRVAgaXMgZW5hYmxlZCwgYWRkIHBhaWV3aXNlIGFuZCBzaGFyZWQga2V5CisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgICAgICBpZiAoKChwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVApJiYKKyAgICAgICAgICAgICAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFXRVBFbmFibGVkKSYmCisgICAgICAgICAgICAgKHBBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkID09IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEKSkgfHwKKyAgICAgICAgICAgICgocEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQID09IFdQQV9TVVBQTElDQU5UX0RJU0FCTEUpJiYKKyAgICAgICAgICAgICAgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExV0VQRW5hYmxlZCkpKQorI2Vsc2UKKwkJaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExV0VQRW5hYmxlZCkKKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisJCXsKKwkJCVBVQ0hBUglLZXk7CisJCQlVQ0hBUiAJQ2lwaGVyQWxnOworCisJCQlmb3IgKGlkeD0wOyBpZHggPCBTSEFSRV9LRVlfTlVNOyBpZHgrKykKKyAgICAgICAgCXsKKwkJCQlDaXBoZXJBbGcgPSBwQWQtPlNoYXJlZEtleVtCU1MwXVtpZHhdLkNpcGhlckFsZzsKKyAgICAJCQlLZXkgPSBwQWQtPlNoYXJlZEtleVtCU1MwXVtpZHhdLktleTsKKworCQkJCWlmIChwQWQtPlNoYXJlZEtleVtCU1MwXVtpZHhdLktleUxlbiA+IDApCisJCQkJeworCQkJCQkvLyBTZXQga2V5IG1hdGVyaWFsIGFuZCBjaXBoZXJBbGcgdG8gQXNpYworICAgIAkJCQlBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkLCBCU1MwLCBpZHgsIENpcGhlckFsZywgS2V5LCBOVUxMLCBOVUxMKTsKKworCQkJCQlpZiAoaWR4ID09IHBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCkKKwkJCQkJeworCQkJCQkJLy8gQXNzaWduIGdyb3VwIGtleSBpbmZvCisJCQkJCQlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZCwgQlNTMCwgaWR4LCBDaXBoZXJBbGcsIE5VTEwpOworCisJCQkJCQkvLyBBc3NpZ24gcGFpcndpc2Uga2V5IGluZm8KKwkJCQkJCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkocEFkLCBCU1MwLCBpZHgsIENpcGhlckFsZywgcEVudHJ5KTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCisJCS8vIG9ubHkgSU5GUkFTVFJVQ1RVUkUgbW9kZSBuZWVkIHRvIGluZGljYXRlIGNvbm5lY3Rpdml0eSBpbW1lZGlhdGVseTsgQURIT0MgbW9kZQorCQkvLyBzaG91bGQgd2FpdCB1bnRpbCBhdCBsZWFzdCAyIGFjdGl2ZSBub2RlcyBpbiB0aGlzIEJTU0lELgorCQlPUFNUQVRVU19TRVRfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKTsKKworICAgICAgICAvLyBGb3IgR1VJICsrCisJCWlmIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA8IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKKwkJeworCQkJcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZUNvbm5lY3RlZDsKKwkJCXBBZC0+RXh0cmFJbmZvID0gR0VORVJBTF9MSU5LX1VQOworCQl9CisgICAgICAgIC8vIC0tCisJCVJUTVBfSW5kaWNhdGVNZWRpYVN0YXRlKHBBZCk7CisKKwkJLy8gQWRkIEJTU0lEIGluIG15IE1BQyBUYWJsZS4KKyAgICAgICAgTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5NYWNUYWJMb2NrKTsKKwkJUlRNUE1vdmVNZW1vcnkocEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5BZGRyLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgTUFDX0FERFJfTEVOKTsKKwkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5BaWQgPSBCU1NJRF9XQ0lEOworCQlwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLnBBZCA9IHBBZDsKKwkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5WYWxpZEFzQ0xJID0gVFJVRTsJLy9BbHRob3VnaCB0aGlzIGlzIGJzc2lkLi5zdGlsbCBzZXQgVmFsaWRBc0NsCisJCXBBZC0+TWFjVGFiLlNpemUgPSAxOwkvLyBpbmZyYSBtb2RlIGFsd2F5cyBzZXQgTUFDdGFiIHNpemUgPTEuCisJCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uU3N0ID0gU1NUX0FTU09DOworCQlwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkF1dGhTdGF0ZSA9IFNTVF9BU1NPQzsKKwkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5XZXBTdGF0dXMgPSBwQWQtPlN0YUNmZy5XZXBTdGF0dXM7CisgICAgICAgIE5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+TWFjVGFiTG9jayk7CisKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIExJTksgVVAgISEhICBDbGllbnRTdGF0dXNGbGFncz0lbHgpXG4iLAorCQkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5DbGllbnRTdGF0dXNGbGFncykpOworCisJCU1sbWVVcGRhdGVUeFJhdGVzKHBBZCwgVFJVRSwgQlNTMCk7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCU1sbWVVcGRhdGVIdFR4UmF0ZXMocEFkLCBCU1MwKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIExJTksgVVAgISEgKFN0YUFjdGl2ZS5iSHRFbmFibGUgPSVkLCApXG4iLCBwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLmJIdEVuYWJsZSkpOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJCS8vCisJCS8vIFJlcG9ydCBBZGphY2VudCBBUCByZXBvcnQuCisJCS8vCisjaWZkZWYgTEVBUF9TVVBQT1JUCisJCUNDWEFkamFjZW50QVBSZXBvcnQocEFkKTsKKyNlbmRpZiAvLyBMRUFQX1NVUFBPUlQgLy8KKworCQlpZiAocEFkLT5Db21tb25DZmcuYkFnZ3JlZ2F0aW9uQ2FwYWJsZSkKKwkJeworCQkJaWYgKChwQWQtPkNvbW1vbkNmZy5iUGlnZ3lCYWNrQ2FwYWJsZSkgJiYgKHBBZC0+TWxtZUF1eC5BUFJhbGlua0llICYgMHgwMDAwMDAwMykgPT0gMykKKwkJCXsKKworCQkJCU9QU1RBVFVTX1NFVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19QSUdHWUJBQ0tfSU5VU0VEKTsKKwkJCQlPUFNUQVRVU19TRVRfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQUdHUkVHQVRJT05fSU5VU0VEKTsKKyAgICAgICAgICAgICAgICBSVE1QU2V0UGlnZ3lCYWNrKHBBZCwgVFJVRSk7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiVHVybiBvbiBQaWdneS1CYWNrXG4iKSk7CisJCQl9CisJCQllbHNlIGlmIChwQWQtPk1sbWVBdXguQVBSYWxpbmtJZSAmIDB4MDAwMDAwMDEpCisJCQl7CisJCQkJT1BTVEFUVVNfU0VUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0FHR1JFR0FUSU9OX0lOVVNFRCk7CisJCQl9CisJCX0KKworCQlpZiAocEFkLT5NbG1lQXV4LkFQUmFsaW5rSWUgIT0gMHgwKQorCQl7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQlpZiAoQ0xJRU5UX1NUQVRVU19URVNUX0ZMQUcoJnBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0sIGZDTElFTlRfU1RBVFVTX1JER19DQVBBQkxFKSkKKwkJCXsKKwkJCQlBc2ljRW5hYmxlUkRHKHBBZCk7CisJCQl9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCQlPUFNUQVRVU19TRVRfRkxBRyhwQWQsIGZDTElFTlRfU1RBVFVTX1JBTElOS19DSElQU0VUKTsKKwkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcoJnBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0sIGZDTElFTlRfU1RBVFVTX1JBTElOS19DSElQU0VUKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmQ0xJRU5UX1NUQVRVU19SQUxJTktfQ0hJUFNFVCk7CisJCQlDTElFTlRfU1RBVFVTX0NMRUFSX0ZMQUcoJnBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0sIGZDTElFTlRfU1RBVFVTX1JBTElOS19DSElQU0VUKTsKKwkJfQorCX0KKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk5ESVNfU1RBVFVTX01FRElBX0NPTk5FQ1QgRXZlbnQgQiEuQkFDYXBhYmlsaXR5ID0gJXguIENsaWVudFN0YXR1c0ZsYWdzID0gJWx4XG4iLCBwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkud29yZCwgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5DbGllbnRTdGF0dXNGbGFncykpOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJLy8gU2V0IExFRAorCVJUTVBTZXRMRUQocEFkLCBMRURfTElOS19VUCk7CisKKwlwQWQtPk1sbWUuUGVyaW9kaWNSb3VuZCA9IDA7CisJcEFkLT5NbG1lLk9uZVNlY1BlcmlvZGljUm91bmQgPSAwOworCXBBZC0+YkNvbmZpZ0NoYW5nZWQgPSBGQUxTRTsgICAgICAgIC8vIFJlc2V0IGNvbmZpZyBmbGFnCisJcEFkLT5FeHRyYUluZm8gPSBHRU5FUkFMX0xJTktfVVA7ICAgLy8gVXBkYXRlIGV4dHJhIGluZm9ybWF0aW9uIHRvIGxpbmsgaXMgdXAKKworCS8vIFNldCBhc2ljIGF1dG8gZmFsbCBiYWNrCisJeworCQlQVUNIQVIJCQkJCXBUYWJsZTsKKwkJVUNIQVIJCQkJCVRhYmxlU2l6ZSA9IDA7CisKKwkJTWxtZVNlbGVjdFR4UmF0ZVRhYmxlKHBBZCwgJnBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0sICZwVGFibGUsICZUYWJsZVNpemUsICZwQWQtPkNvbW1vbkNmZy5UeFJhdGVJbmRleCk7CisJCUFzaWNVcGRhdGVBdXRvRmFsbEJhY2tUYWJsZShwQWQsIHBUYWJsZSk7CisJfQorCisJTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5NYWNUYWJMb2NrKTsKKyAgICBwRW50cnktPkhUUGh5TW9kZS53b3JkID0gcEFkLT5TdGFDZmcuSFRQaHlNb2RlLndvcmQ7CisgICAgcEVudHJ5LT5NYXhIVFBoeU1vZGUud29yZCA9IHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS53b3JkOworCWlmIChwQWQtPlN0YUNmZy5iQXV0b1R4UmF0ZVN3aXRjaCA9PSBGQUxTRSkKKwl7CisJCXBFbnRyeS0+YkF1dG9UeFJhdGVTd2l0Y2ggPSBGQUxTRTsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJaWYgKHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1DUyA9PSAzMikKKwkJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLlNob3J0R0kgPSBHSV84MDA7CisKKwkJaWYgKChwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NQ1MgPiBNQ1NfNykgfHwgKHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1DUyA9PSAzMikpCisJCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5TVEJDID0gU1RCQ19OT05FOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQkvLyBJZiB0aGUgbGVnYWN5IG1vZGUgaXMgc2V0LCBvdmVyd3JpdGUgdGhlIHRyYW5zbWl0IHNldHRpbmcgb2YgdGhpcyBlbnRyeS4KKwkJaWYgKHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1PREUgPD0gTU9ERV9PRkRNKQorCQkJUlRNUFVwZGF0ZUxlZ2FjeVR4U2V0dGluZygoVUNIQVIpcEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5GaXhlZFR4TW9kZSwgcEVudHJ5KTsKKwl9CisJZWxzZQorCQlwRW50cnktPmJBdXRvVHhSYXRlU3dpdGNoID0gVFJVRTsKKwlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPk1hY1RhYkxvY2spOworCisJLy8gIExldCBMaW5rIFN0YXR1cyBQYWdlIGRpc3BsYXkgZmlyc3QgaW5pdGlhbCByYXRlLgorCXBBZC0+TGFzdFR4UmF0ZSA9IChVU0hPUlQpKHBFbnRyeS0+SFRQaHlNb2RlLndvcmQpOworCS8vIFNlbGVjdCBEQUMgYWNjb3JkaW5nIHRvIEhUIG9yIExlZ2FjeQorCWlmIChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLk1DU1NldFswXSAhPSAweDAwKQorCXsKKwkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IxLCAmVmFsdWUpOworCQlWYWx1ZSAmPSAofjB4MTgpOworCQlpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCA9PSAyKQorCQl7CisJCSAgICBWYWx1ZSB8PSAweDEwOworCQl9CisJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjEsIFZhbHVlKTsKKwl9CisJZWxzZQorCXsKKwkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IxLCAmVmFsdWUpOworCQlWYWx1ZSAmPSAofjB4MTgpOworCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IxLCBWYWx1ZSk7CisJfQorCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJaWYgKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uYkh0RW5hYmxlID09IEZBTFNFKQorCXsKKwl9CisJZWxzZSBpZiAocEVudHJ5LT5NYXhSQW1wZHVGYWN0b3IgPT0gMCkKKwl7CisJICAgIC8vIElmIEhUIEFQIGRvZXNuJ3Qgc3VwcG9ydCBNYXhSQW1wZHVGYWN0b3IgPSAxLCB3ZSBuZWVkIHRvIHNldCBtYXggUFNEVSB0byAwLgorCSAgICAvLyBCZWNhdXNlIG91ciBJbml0IHZhbHVlIGlzIDEgYXQgTUFDUmVnVGFibGUuCisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BWF9MRU5fQ0ZHLCAweDBmZmYpOworCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCS8vIFBhdGNoIGZvciBNYXJ2ZWwgQVAgdG8gZ2FpbiBoaWdoIHRocm91Z2hwdXQKKwkvLyBOZWVkIHRvIHNldCBhcyBmb2xsb3dpbmcsCisJLy8gMS4gU2V0IHR4b3AgaW4gcmVnaXN0ZXItRURDQV9BQzBfQ0ZHIGFzIDB4NjAKKwkvLyAyLiBTZXQgRW5UWFdyaXRlQmFja0RET05FIGluIHJlZ2lzdGVyLVdQRE1BX0dMT19DRkcgYXMgemVybworCS8vIDMuIFBCRl9NQVhfUENOVCBhcyAweDFGM0ZCRjlGCisJLy8gNC4ga2ljayBwZXIgdHdvIHBhY2tldHMgd2hlbiBkZXF1ZXVlCisJLy8KKwkvLyBUeG9wIGNhbiBvbmx5IGJlIG1vZGlmaWVkIHdoZW4gUkRHIGlzIG9mZiwgV01NIGlzIGRpc2FibGUgYW5kIFR4QnVyc3QgaXMgZW5hYmxlCisJLy8KKwkvLyBpZiAxLiBMZWdhY3kgQVAgV01NIG9uLCAgb3IgMi4gMTFuIEFQLCBBTVBEVSBkaXNhYmxlLiAgRm9yY2UgdHVybiBvZmYgYnVyc3Qgbm8gbWF0dGVyIHdoYXQgYkVuYWJsZVR4QnVyc3QgaXMuCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJaWYgKCgocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5iSHRFbmFibGUgPT0gRkFMU0UpICYmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1dNTV9JTlVTRUQpKSkKKwkJfHwgKChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLmJIdEVuYWJsZSA9PSBUUlVFKSAmJiAocEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlBvbGljeSA9PSBCQV9OT1RVU0UpKSkKKwl7CisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgRURDQV9BQzBfQ0ZHLCAmRGF0YSk7CisJCURhdGEgICY9IDB4RkZGRkZGMDA7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIEVEQ0FfQUMwX0NGRywgRGF0YSk7CisKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgUEJGX01BWF9QQ05ULCAweDFGM0Y3RjlGKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiVHhidXJzdCAxXG4iKSk7CisJfQorCWVsc2UKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwlpZiAocEFkLT5Db21tb25DZmcuYkVuYWJsZVR4QnVyc3QpCisJeworCQlSVE1QX0lPX1JFQUQzMihwQWQsIEVEQ0FfQUMwX0NGRywgJkRhdGEpOworCQlEYXRhICAmPSAweEZGRkZGRjAwOworCQlEYXRhICB8PSAweDYwOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBFRENBX0FDMF9DRkcsIERhdGEpOworCQlwQWQtPkNvbW1vbkNmZy5JT1Rlc3RQYXJtLmJOb3dBdGhlcm9zQnVyc3RPbiA9IFRSVUU7CisKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgUEJGX01BWF9QQ05ULCAweDFGM0ZCRjlGKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiVHhidXJzdCAyXG4iKSk7CisJfQorCWVsc2UKKwl7CisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgRURDQV9BQzBfQ0ZHLCAmRGF0YSk7CisJCURhdGEgICY9IDB4RkZGRkZGMDA7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIEVEQ0FfQUMwX0NGRywgRGF0YSk7CisKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgUEJGX01BWF9QQ05ULCAweDFGM0Y3RjlGKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiVHhidXJzdCAzXG4iKSk7CisJfQorCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJLy8gUmUtY2hlY2sgdG8gdHVybiBvbiBUWCBidXJzdCBvciBub3QuCisJaWYgKChwQWQtPkNvbW1vbkNmZy5JT1Rlc3RQYXJtLmJMYXN0QXRoZXJvcyA9PSBUUlVFKSAmJiAoKFNUQV9XRVBfT04ocEFkKSl8fChTVEFfVEtJUF9PTihwQWQpKSkpCisJeworCQlwQWQtPkNvbW1vbkNmZy5JT1Rlc3RQYXJtLmJOZXh0RGlzYWJsZVJ4QkEgPSBUUlVFOworCQlpZiAocEFkLT5Db21tb25DZmcuYkVuYWJsZVR4QnVyc3QpCisJCXsKKwkJICAgIFVJTlQzMiBNQUNWYWx1ZSA9IDA7CisJCQkvLyBGb3JjZSBkaXNhYmxlICBUWE9QIHZhbHVlIGluIHRoaXMgY2FzZS4gVGhlIHNhbWUgYWN0aW9uIGluIE1MTUVVcGRhdGVQcm90ZWN0IHRvby4KKwkJCS8vIEkgZGlkbid0IGNoYW5nZSBQQkZfTUFYX1BDTlQgc2V0dGluZy4KKwkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgRURDQV9BQzBfQ0ZHLCAmTUFDVmFsdWUpOworCQkJTUFDVmFsdWUgICY9IDB4RkZGRkZGMDA7CisJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBFRENBX0FDMF9DRkcsIE1BQ1ZhbHVlKTsKKwkJCXBBZC0+Q29tbW9uQ2ZnLklPVGVzdFBhcm0uYk5vd0F0aGVyb3NCdXJzdE9uID0gRkFMU0U7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJcEFkLT5Db21tb25DZmcuSU9UZXN0UGFybS5iTmV4dERpc2FibGVSeEJBID0gRkFMU0U7CisJfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJcEFkLT5Db21tb25DZmcuSU9UZXN0UGFybS5iTGFzdEF0aGVyb3MgPSBGQUxTRTsKKwlDT1BZX01BQ19BRERSKHBBZC0+Q29tbW9uQ2ZnLkxhc3RCc3NpZCwgcEFkLT5Db21tb25DZmcuQnNzaWQpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhIXBBZC0+Yk5leHREaXNhYmxlUnhCQT0gJWQgXG4iLCBwQWQtPkNvbW1vbkNmZy5JT1Rlc3RQYXJtLmJOZXh0RGlzYWJsZVJ4QkEpKTsKKwkvLyBCU1NJRCBhZGQgaW4gb25lIE1BQyBlbnRyeSB0b28uICBCZWNhdXNlIGluIFR4LCBBU0lDIG5lZWQgdG8gY2hlY2sgQ2lwaGVyIGFuZCBJVi9FSVYsIEJBYml0bWFwCisJLy8gUHRoZXIgaW5mb3JtYXRpb24gaW4gTUFDVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0gaXMgbm90IG5lY2Vzc2FyeSBmb3IgZHJpdmVyLgorCS8vIE5vdGU6IEFzIFNUQSwgVGhlIE1BQ1RhYi5Db250ZW50W0JTU0lEX1dDSURdLiBQYWlyd2lzZUtleSBhbmQgU2hhcmVkIEtleSBmb3IgQlNTMCBhcmUgdGhlIHNhbWUuCisKKyAgICBpZiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzIDw9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZCkKKyAgICB7CisgICAgICAgIHBBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQ7CisJCXBBZC0+U3RhQ2ZnLlByaXZhY3lGaWx0ZXIgPSBOZGlzODAyXzExUHJpdkZpbHRlckFjY2VwdEFsbDsKKwl9CisKKwlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPk1hY1RhYkxvY2spOworCXBFbnRyeS0+UG9ydFNlY3VyZWQgPSBwQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZDsKKwlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPk1hY1RhYkxvY2spOworCisgICAgLy8KKwkvLyBQYXRjaCBBdGhlcm9zIEFQIFRYIHdpbGwgYnJlYWtkb3duIGlzc3VlLgorCS8vIEFQIE1vZGVsOiBETGluayBEV0wtODIwMEFQCisJLy8KKwlpZiAoSU5GUkFfT04ocEFkKSAmJiBPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1dNTV9JTlVTRUQpICYmIFNUQV9US0lQX09OKHBBZCkpCisJeworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBSWF9QQVJTRVJfQ0ZHLCAweDAxKTsKKwl9CisJZWxzZQorCXsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgUlhfUEFSU0VSX0NGRywgMHgwMCk7CisJfQorCisJUlRNUF9DTEVBUl9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUyk7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKyNpZmRlZiBET1QxMU5fRFJBRlQzCisJaWYgKChwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuYjIwNDBDb2V4aXN0U2NhblN1cCkgJiYgKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPD0gMTEpKQorCXsKKwkJT1BTVEFUVVNfU0VUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1NDQU5fMjA0MCk7CisJCUJ1aWxkRWZmZWN0ZWRDaGFubmVsTGlzdChwQWQpOworCX0KKyNlbmRpZiAvLyBET1QxMU5fRFJBRlQzIC8vCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUJRGVzY3JpcHRpb246CisJCURpc2Nvbm5lY3QgY3VycmVudCBCU1NJRAorCisJQXJndW1lbnRzOgorCQlwQWQJCQkJLSBQb2ludGVyIHRvIG91ciBhZGFwdGVyCisJCUlzUmVxRnJvbUFQCQktIFJlcXVlc3QgZnJvbSBBUAorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCU5vdGU6CisJCVdlIG5lZWQgbW9yZSBpbmZvcm1hdGlvbiB0byBrbm93IGl0J3MgdGhpcyByZXF1c3QgZnJvbSBBUC4KKwkJSWYgeWVzISB3ZSBuZWVkIHRvIGRvIGV4dHJhIGhhbmRsaW5nLCBmb3IgZXhhbXBsZSwgcmVtb3ZlIHRoZSBXUEEga2V5LgorCQlPdGhlcndpc2Ugb24gNC13YXkgaGFuZHNoYWtpbmcgd2lsbCBmYWllZCwgc2luY2UgdGhlIFdQQSBrZXkgZGlkbid0IGJlCisJCXJlbW92ZSB3aGlsZSBhdXRvIHJlY29ubmVjdC4KKwkJRGlzY29ubmVjdCByZXF1ZXN0IGZyb20gQVAsIGl0IG1lYW5zIHdlIHdpbGwgc3RhcnQgYWZyZXNoIDQtd2F5IGhhbmRzaGFraW5nCisJCW9uIFdQQSBtb2RlLgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIExpbmtEb3duKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOICBCT09MRUFOICAgICAgSXNSZXFGcm9tQVApCit7CisJVUNIQVIJCQkgICAgaSwgQnl0ZVZhbHVlID0gMDsKKworCS8vIERvIG5vdGhpbmcgaWYgbW9uaXRvciBtb2RlIGlzIG9uCisJaWYgKE1PTklUT1JfT04ocEFkKSkKKwkJcmV0dXJuOworCisjaWZkZWYgUkFMSU5LX0FURQorCS8vIE5vdGhpbmcgdG8gZG8gaW4gQVRFIG1vZGUuCisJaWYgKEFURV9PTihwQWQpKQorCQlyZXR1cm47CisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCisgICAgaWYgKHBBZC0+Q29tbW9uQ2ZnLmJXaXJlbGVzc0V2ZW50KQorCXsKKwkJUlRNUFNlbmRXaXJlbGVzc0V2ZW50KHBBZCwgSVdfU1RBX0xJTktET1dOX0VWRU5UX0ZMQUcsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQWRkciwgQlNTMCwgMCk7CisJfQorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIExJTksgRE9XTiAhISFcbiIpKTsKKwlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19BR0dSRUdBVElPTl9JTlVTRUQpOworCisjaWZkZWYgUlQyODYwCisgICAgaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQURWQU5DRV9QT1dFUl9TQVZFX1BDSUVfREVWSUNFKSkKKyAgICB7CisJICAgIEJPT0xFQU4gQ2FuY2VsbGVkOworICAgICAgICBwQWQtPk1sbWUuYlBzUG9sbFRpbWVyUnVubmluZyA9IEZBTFNFOworICAgICAgICBSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZS5Qc1BvbGxUaW1lciwJJkNhbmNlbGxlZCk7CisgICAgfQorCisgICAgaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSkpCisgICAgeworICAgICAgICBBVVRPX1dBS0VVUF9TVFJVQyBBdXRvV2FrZXVwQ2ZnOworCQlBc2ljRm9yY2VXYWtldXAocEFkLCBUUlVFKTsKKyAgICAgICAgQXV0b1dha2V1cENmZy53b3JkID0gMDsKKwkgICAgUlRNUF9JT19XUklURTMyKHBBZCwgQVVUT19XQUtFVVBfQ0ZHLCBBdXRvV2FrZXVwQ2ZnLndvcmQpOworICAgICAgICBPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKTsKKyAgICB9CisKKyAgICBwQWQtPmJQQ0ljbGtPZmYgPSBGQUxTRTsKKyNlbmRpZiAvLyBSVDI4NjAgLy8KKwlpZiAoQURIT0NfT04ocEFkKSkJCS8vIEFkaG9jIG1vZGUgbGluayBkb3duCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgTElOSyBET1dOIDEhISFcbiIpKTsKKworCQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19BREhPQ19PTik7CisJCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCk7CisJCXBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID0gTmRpc01lZGlhU3RhdGVEaXNjb25uZWN0ZWQ7CisJCVJUTVBfSW5kaWNhdGVNZWRpYVN0YXRlKHBBZCk7CisgICAgICAgIHBBZC0+RXh0cmFJbmZvID0gR0VORVJBTF9MSU5LX0RPV047CisJCUJzc1RhYmxlRGVsZXRlRW50cnkoJnBBZC0+U2NhblRhYiwgcEFkLT5Db21tb25DZmcuQnNzaWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgTWFjVGFiLlNpemU9JWQgISEhXG4iLCBwQWQtPk1hY1RhYi5TaXplKSk7CisJfQorCWVsc2UJCQkJCS8vIEluZnJhIHN0cnVjdHVyZSBtb2RlCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgTElOSyBET1dOIDIhISFcbiIpKTsKKworI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCQkvLyBETFMgdGVhciBkb3duIGZyYW1lIG11c3QgYmUgc2VudCBiZWZvcmUgbGluayBkb3duCisJCS8vIHNlbmQgRExTLVRFQVJfRE9XTiBtZXNzYWdlCisJCWlmIChwQWQtPkNvbW1vbkNmZy5iRExTQ2FwYWJsZSkKKwkJeworCQkJLy8gdGVhciBkb3duIGxvY2FsIGRscyB0YWJsZSBlbnRyeQorCQkJZm9yIChpPTA7IGk8TUFYX05VTV9PRl9JTklUX0RMU19FTlRSWTsgaSsrKQorCQkJeworCQkJCWlmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZCAmJiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID09IERMU19GSU5JU0gpKQorCQkJCXsKKwkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID0gRExTX05PTkU7CisJCQkJCVJUTVBTZW5kRExTVGVhckRvd25GcmFtZShwQWQsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpOworCQkJCX0KKwkJCX0KKworCQkJLy8gdGVhciBkb3duIHBlZXIgZGxzIHRhYmxlIGVudHJ5CisJCQlmb3IgKGk9TUFYX05VTV9PRl9JTklUX0RMU19FTlRSWTsgaTxNQVhfTlVNX09GX0RMU19FTlRSWTsgaSsrKQorCQkJeworCQkJCWlmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZCAmJiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID09ICBETFNfRklOSVNIKSkKKwkJCQl7CisJCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9IERMU19OT05FOworCQkJCQlSVE1QU2VuZERMU1RlYXJEb3duRnJhbWUocEFkLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKTsKKwkJCQl9CisJCQl9CisJCX0KKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKworCQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19JTkZSQV9PTik7CisJCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCk7CisKKwkJLy8gU2F2ZWQgbGFzdCBTU0lEIGZvciBsaW5rdXAgY29tcGFyaXNvbgorCQlwQWQtPkNvbW1vbkNmZy5MYXN0U3NpZExlbiA9IHBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW47CisJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+Q29tbW9uQ2ZnLkxhc3RTc2lkLCBwQWQtPkNvbW1vbkNmZy5Tc2lkLCBwQWQtPkNvbW1vbkNmZy5MYXN0U3NpZExlbik7CisJCUNPUFlfTUFDX0FERFIocEFkLT5Db21tb25DZmcuTGFzdEJzc2lkLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisJCWlmIChwQWQtPk1sbWVBdXguQ3VyclJlcUlzRnJvbU5kaXMgPT0gVFJVRSkKKwkJeworCQkJcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZURpc2Nvbm5lY3RlZDsKKwkJCVJUTVBfSW5kaWNhdGVNZWRpYVN0YXRlKHBBZCk7CisgICAgICAgICAgICBwQWQtPkV4dHJhSW5mbyA9IEdFTkVSQUxfTElOS19ET1dOOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTkRJU19TVEFUVVNfTUVESUFfRElTQ09OTkVDVCBFdmVudCBBIVxuIikpOworCQkJcEFkLT5NbG1lQXV4LkN1cnJSZXFJc0Zyb21OZGlzID0gRkFMU0U7CisJCX0KKwkJZWxzZQorCQl7CisgICAgICAgICAgICAvLworCQkJLy8gSWYgZGlzYXNzb2NpYXRpb24gcmVxdWVzdCBpcyBmcm9tIE5ESVMsIHRoZW4gd2UgZG9uJ3QgbmVlZCB0byBkZWxldGUgQlNTSUQgZnJvbSBlbnRyeS4KKwkJCS8vIE90aGVyd2lzZSBsb3N0IGJlYWNvbiBvciByZWNlaXZlIERlLUF1dGhlbnRpY2F0aW9uIGZyb20gQVAsCisJCQkvLyB0aGVuIHdlIHNob3VsZCBkZWxldGUgQlNTSUQgZnJvbSBCc3NUYWJsZS4KKwkJCS8vIElmIHdlIGRvbid0IGRlbGV0ZSBmcm9tIGVudHJ5LCByb2FtaW5nIHdpbGwgZmFpbC4KKwkJCS8vCisJCQlCc3NUYWJsZURlbGV0ZUVudHJ5KCZwQWQtPlNjYW5UYWIsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKTsKKwkJfQorCisJCS8vIHJlc3RvcmUgYmFjayB0byAtCisJCS8vICAgICAgMS4gbG9uZyBzbG90ICgyMCB1cykgb3Igc2hvcnQgc2xvdCAoOSB1cykgdGltZQorCQkvLyAgICAgIDIuIHR1cm4gb24vb2ZmIFJUUy9DVFMgYW5kL29yIENUUy10by1zZWxmIHByb3RlY3Rpb24KKwkJLy8gICAgICAzLiBzaG9ydCBwcmVhbWJsZQorCQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19CR19QUk9URUNUSU9OX0lOVVNFRCk7CisKKwkJaWYgKHBBZC0+U3RhQ2ZnLkNDWEFkamFjZW50QVBSZXBvcnRGbGFnID09IFRSVUUpCisJCXsKKwkJCS8vCisJCQkvLyBSZWNvcmQgY3VycmVudCBBUCdzIGluZm9ybWF0aW9uLgorCQkJLy8gZm9yIGxhdGVyIHVzZWQgcmVwb3J0aW5nIEFkamFjZW50IEFQIHJlcG9ydC4KKwkJCS8vCisJCQlwQWQtPlN0YUNmZy5DQ1hBZGphY2VudEFQQ2hhbm5lbCA9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWw7CisJCQlwQWQtPlN0YUNmZy5DQ1hBZGphY2VudEFQU3NpZExlbiA9IHBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW47CisJCQlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5DQ1hBZGphY2VudEFQU3NpZCwgcEFkLT5Db21tb25DZmcuU3NpZCwgcEFkLT5TdGFDZmcuQ0NYQWRqYWNlbnRBUFNzaWRMZW4pOworCQkJQ09QWV9NQUNfQUREUihwQWQtPlN0YUNmZy5DQ1hBZGphY2VudEFQQnNzaWQsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKwkJfQorCisjaWZkZWYgRVhUX0JVSUxEX0NIQU5ORUxfTElTVAorCQkvLyBDb3VudHJ5IElFIG9mIHRoZSBBUCB3aWxsIGJlIGV2YWx1YXRlZCBhbmQgd2lsbCBiZSB1c2VkLgorCQlpZiAocEFkLT5TdGFDZmcuSUVFRTgwMjExZENsaWVudE1vZGUgIT0gUnQ4MDJfMTFfRF9Ob25lKQorCQl7CisJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5Db21tb25DZmcuQ291bnRyeUNvZGVbMF0sICZwQWQtPlN0YUNmZy5TdGFPcmlDb3VudHJ5Q29kZVswXSwgMik7CisJCQlwQWQtPkNvbW1vbkNmZy5HZW9ncmFwaHkgPSBwQWQtPlN0YUNmZy5TdGFPcmlHZW9ncmFwaHk7CisJCQlCdWlsZENoYW5uZWxMaXN0RXgocEFkKTsKKwkJfQorI2VuZGlmIC8vIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QgLy8KKworCX0KKworCWZvciAoaT0xOyBpPE1BWF9MRU5fT0ZfTUFDX1RBQkxFOyBpKyspCisJeworCQlpZiAocEFkLT5NYWNUYWIuQ29udGVudFtpXS5WYWxpZEFzQ0xJID09IFRSVUUpCisJCQlNYWNUYWJsZURlbGV0ZUVudHJ5KHBBZCwgcEFkLT5NYWNUYWIuQ29udGVudFtpXS5BaWQsIHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uQWRkcik7CisJfQorCisJcEFkLT5TdGFDZmcuQ0NYUW9zRUNXTWluCT0gNDsKKwlwQWQtPlN0YUNmZy5DQ1hRb3NFQ1dNYXgJPSAxMDsKKworCUFzaWNTZXRTbG90VGltZShwQWQsIFRSVUUpOyAvL0ZBTFNFKTsKKwlBc2ljU2V0RWRjYVBhcm0ocEFkLCBOVUxMKTsKKworCS8vIFNldCBMRUQKKwlSVE1QU2V0TEVEKHBBZCwgTEVEX0xJTktfRE9XTik7CisgICAgcEFkLT5MZWRJbmRpY2F0b3JTdHJlZ3RoID0gMHhGMDsKKyAgICBSVE1QU2V0U2lnbmFsTEVEKHBBZCwgLTEwMCk7CS8vIEZvcmNlIHNpZ25hbCBzdHJlbmd0aCBMZWQgdG8gYmUgdHVybmVkIG9mZiwgZmlybXdhcmUgaXMgbm90IGRvbmUgaXQuCisKKwkJQXNpY0Rpc2FibGVTeW5jKHBBZCk7CisKKwlwQWQtPk1sbWUuUGVyaW9kaWNSb3VuZCA9IDA7CisJcEFkLT5NbG1lLk9uZVNlY1BlcmlvZGljUm91bmQgPSAwOworCisJaWYgKHBBZC0+U3RhQ2ZnLkJzc1R5cGUgPT0gQlNTX0lORlJBKQorCXsKKwkJLy8gUmVtb3ZlIFN0YUNmZyBJbmZvcm1hdGlvbiBhZnRlciBsaW5rIGRvd24KKwkJTmRpc1plcm9NZW1vcnkocEFkLT5Db21tb25DZmcuQnNzaWQsIE1BQ19BRERSX0xFTik7CisJCU5kaXNaZXJvTWVtb3J5KHBBZC0+Q29tbW9uQ2ZnLlNzaWQsIE1BWF9MRU5fT0ZfU1NJRCk7CisJCXBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW4gPSAwOworCX0KKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwlOZGlzWmVyb01lbW9yeSgmcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eSwgc2l6ZW9mKEhUX0NBUEFCSUxJVFlfSUUpKTsKKwlOZGlzWmVyb01lbW9yeSgmcEFkLT5NbG1lQXV4LkFkZEh0SW5mbywgc2l6ZW9mKEFERF9IVF9JTkZPX0lFKSk7CisJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eUxlbiA9IDA7CisJcEFkLT5NbG1lQXV4Lk5ld0V4dENoYW5uZWxPZmZzZXQgPSAweGZmOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJLy8gUmVzZXQgV1BBLVBTSyBzdGF0ZS4gT25seSByZXNldCB3aGVuIHN1cHBsaWNhbnQgZW5hYmxlZAorCWlmIChwQWQtPlN0YUNmZy5XcGFTdGF0ZSAhPSBTU19OT1RVU0UpCisJeworCQlwQWQtPlN0YUNmZy5XcGFTdGF0ZSA9IFNTX1NUQVJUOworCQkvLyBDbGVhciBSZXBsYXkgY291bnRlcgorCQlOZGlzWmVyb01lbW9yeShwQWQtPlN0YUNmZy5SZXBsYXlDb3VudGVyLCA4KTsKKworI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCQlpZiAocEFkLT5Db21tb25DZmcuYkRMU0NhcGFibGUpCisJCQlOZGlzWmVyb01lbW9yeShwQWQtPlN0YUNmZy5EbHNSZXBsYXlDb3VudGVyLCA4KTsKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKwl9CisKKworCS8vCisJLy8gaWYgbGluayBkb3duIGNvbWUgZnJvbSBBUCwgd2UgbmVlZCB0byByZW1vdmUgYWxsIFdQQSBrZXlzIG9uIFdQQSBtb2RlLgorCS8vIG90aGVyd2lzZSB3aWxsIGNhdXNlIDQtd2F5IGhhbmRzaGFraW5nIGZhaWxlZCwgc2luY2UgdGhlIFdQQSBrZXkgbm90IGVtcHR5LgorCS8vCisJaWYgKChJc1JlcUZyb21BUCkgJiYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkpCisJeworCQkvLyBSZW1vdmUgYWxsIFdQQSBrZXlzCisJCVJUTVBXUEFSZW1vdmVBbGxLZXlzKHBBZCk7CisJfQorCisJLy8gODAyLjF4IHBvcnQgY29udHJvbAorI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKwkvLyBQcmV2ZW50IGNsZWFyIFBvcnRTZWN1cmVkIGhlcmUgd2l0aCBzdGF0aWMgV0VQCisJLy8gTmV0d29ya01hbmdlciBzZXQgc2VjdXJpdHkgcG9saWN5IGZpcnN0IHRoZW4gc2V0IFNTSUQgdG8gY29ubmVjdCBBUC4KKwlpZiAocEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQICYmCisJCShwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMVdFUEVuYWJsZWQpICYmCisJCShwQWQtPlN0YUNmZy5JRUVFODAyMVggPT0gRkFMU0UpKQorCXsKKwkJcEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRDsKKwl9CisJZWxzZQorI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKwl7CisJCXBBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX05PVF9TRUNVUkVEOworCQlwQWQtPlN0YUNmZy5Qcml2YWN5RmlsdGVyID0gTmRpczgwMl8xMVByaXZGaWx0ZXI4MDIxeFdFUDsKKwl9CisKKwlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPk1hY1RhYkxvY2spOworCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUG9ydFNlY3VyZWQgPSBwQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZDsKKwlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPk1hY1RhYkxvY2spOworCisJcEFkLT5TdGFDZmcuTWljRXJyQ250ID0gMDsKKworCS8vIFR1cm4gb2ZmIENraXAgY29udHJvbCBmbGFnCisJcEFkLT5TdGFDZmcuYkNraXBPbiA9IEZBTFNFOworCXBBZC0+U3RhQ2ZnLkNDWEVuYWJsZSA9IEZBTFNFOworCisgICAgcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZURpc2Nvbm5lY3RlZDsKKwkvLyBVcGRhdGUgZXh0cmEgaW5mb3JtYXRpb24gdG8gbGluayBpcyB1cAorCXBBZC0+RXh0cmFJbmZvID0gR0VORVJBTF9MSU5LX0RPV047CisKKyAgICBwQWQtPlN0YUNmZy5BZGhvY0JPbmx5Sm9pbmVkID0gRkFMU0U7CisJcEFkLT5TdGFDZmcuQWRob2NCR0pvaW5lZCA9IEZBTFNFOworCXBBZC0+U3RhQ2ZnLkFkaG9jMjBOSm9pbmVkID0gRkFMU0U7CisgICAgcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5iSHRFbmFibGUgPSBGQUxTRTsKKworCS8vIFJlc2V0IHRoZSBDdXJyZW50IEFQJ3MgSVAgYWRkcmVzcworCU5kaXNaZXJvTWVtb3J5KHBBZC0+U3RhQ2ZnLkFpcm9uZXRJUEFkZHJlc3MsIDQpOworCisJLy8gQ2xlYW4gYXNzb2NpYXRpb24gaW5mb3JtYXRpb24KKwlOZGlzWmVyb01lbW9yeSgmcEFkLT5TdGFDZmcuQXNzb2NJbmZvLCBzaXplb2YoTkRJU184MDJfMTFfQVNTT0NJQVRJT05fSU5GT1JNQVRJT04pKTsKKwlwQWQtPlN0YUNmZy5Bc3NvY0luZm8uTGVuZ3RoID0gc2l6ZW9mKE5ESVNfODAyXzExX0FTU09DSUFUSU9OX0lORk9STUFUSU9OKTsKKwlwQWQtPlN0YUNmZy5SZXFWYXJJRUxlbiA9IDA7CisJcEFkLT5TdGFDZmcuUmVzVmFySUVMZW4gPSAwOworCisJLy8KKwkvLyBSZXNldCBSU1NJIHZhbHVlIGFmdGVyIGxpbmsgZG93bgorCS8vCisJcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMCA9IDA7CisJcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMFg4ID0gMDsKKwlwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kxID0gMDsKKwlwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kxWDggPSAwOworCXBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTIgPSAwOworCXBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTJYOCA9IDA7CisKKwkvLyBSZXN0b3JlIE1sbWVSYXRlCisJcEFkLT5Db21tb25DZmcuTWxtZVJhdGUgPSBwQWQtPkNvbW1vbkNmZy5CYXNpY01sbWVSYXRlOworCXBBZC0+Q29tbW9uQ2ZnLlJ0c1JhdGUgPSBwQWQtPkNvbW1vbkNmZy5CYXNpY01sbWVSYXRlOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJLy8KKwkvLyBBZnRlciBMaW5rIGRvd24sIHJlc2V0IHBpZ2d5LWJhY2sgc2V0dGluZyBpbiBBU0lDLiBEaXNhYmxlIFJERy4KKwkvLworCWlmIChwQWQtPkNvbW1vbkNmZy5CQlBDdXJyZW50QlcgPT0gQldfNDApCisJeworCQlwQWQtPkNvbW1vbkNmZy5CQlBDdXJyZW50QlcgPSBCV18yMDsKKwkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCAmQnl0ZVZhbHVlKTsKKwkJQnl0ZVZhbHVlICY9ICh+MHgxOCk7CisJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsIEJ5dGVWYWx1ZSk7CisJfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCS8vIFJlc2V0IERBQworCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMSwgJkJ5dGVWYWx1ZSk7CisJQnl0ZVZhbHVlICY9ICh+MHgxOCk7CisJaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGggPT0gMikKKwl7CisJCUJ5dGVWYWx1ZSB8PSAweDEwOworCX0KKwlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IxLCBCeXRlVmFsdWUpOworCisJUlRNUFNldFBpZ2d5QmFjayhwQWQsRkFMU0UpOworCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1BJR0dZQkFDS19JTlVTRUQpOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LndvcmQgPSBwQWQtPkNvbW1vbkNmZy5SRUdCQUNhcGFiaWxpdHkud29yZDsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCS8vIFJlc3RvcmUgYWxsIHNldHRpbmdzIGluIHRoZSBmb2xsb3dpbmcuCisJQXNpY1VwZGF0ZVByb3RlY3QocEFkLCAwLCAoQUxMTl9TRVRQUk9URUNUfENDS1NFVFBST1RFQ1R8T0ZETVNFVFBST1RFQ1QpLCBUUlVFLCBGQUxTRSk7CisJQXNpY0Rpc2FibGVSREcocEFkKTsKKwlwQWQtPkNvbW1vbkNmZy5JT1Rlc3RQYXJtLmJDdXJyZW50QXRoZXJvcyA9IEZBTFNFOworCXBBZC0+Q29tbW9uQ2ZnLklPVGVzdFBhcm0uYk5vd0F0aGVyb3NCdXJzdE9uID0gRkFMU0U7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKyNpZmRlZiBET1QxMU5fRFJBRlQzCisJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfU0NBTl8yMDQwKTsKKwlwQWQtPkNvbW1vbkNmZy5CU1NDb2V4aXN0MjA0MC53b3JkID0gMDsKKwlUcmlFdmVudEluaXQocEFkKTsKKwlmb3IgKGkgPSAwOyBpIDwgKHBBZC0+Q2hhbm5lbExpc3ROdW0gLSAxKTsgaSsrKQorCXsKKwkJcEFkLT5DaGFubmVsTGlzdFtpXS5iRWZmZWN0ZWRDaGFubmVsID0gRkFMU0U7CisJfQorI2VuZGlmIC8vIERPVDExTl9EUkFGVDMgLy8KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BWF9MRU5fQ0ZHLCAweDFmZmYpOworCVJUTVBfQ0xFQVJfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpOworCisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorI2lmbmRlZiBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorCWlmIChwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVApIHsKKwkJdW5pb24gaXdyZXFfZGF0YSAgICB3cnF1OworCQkvL3NlbmQgZGlzYXNzb2NpYXRlIGV2ZW50IHRvIHdwYV9zdXBwbGljYW50CisJCW1lbXNldCgmd3JxdSwgMCwgc2l6ZW9mKHdycXUpKTsKKwkJd3JxdS5kYXRhLmZsYWdzID0gUlRfRElTQVNTT0NfRVZFTlRfRkxBRzsKKwkJd2lyZWxlc3Nfc2VuZF9ldmVudChwQWQtPm5ldF9kZXYsIElXRVZDVVNUT00sICZ3cnF1LCBOVUxMKTsKKwl9CisjZW5kaWYgLy8gTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisKKyNpZmRlZiBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorCXsKKwkJdW5pb24gaXdyZXFfZGF0YSAgICB3cnF1OworCQltZW1zZXQod3JxdS5hcF9hZGRyLnNhX2RhdGEsIDAsIE1BQ19BRERSX0xFTik7CisJCXdpcmVsZXNzX3NlbmRfZXZlbnQocEFkLT5uZXRfZGV2LCBTSU9DR0lXQVAsICZ3cnF1LCBOVUxMKTsKKwl9CisjZW5kaWYgLy8gTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgSXRlcmF0ZU9uQnNzVGFiKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCU1MTUVfU1RBUlRfUkVRX1NUUlVDVCAgIFN0YXJ0UmVxOworCU1MTUVfSk9JTl9SRVFfU1RSVUNUICAgIEpvaW5SZXE7CisJVUxPTkcgICAgICAgICAgICAgICAgICAgQnNzSWR4OworCisJLy8gQ2hhbmdlIHRoZSB3ZXBzdGF0dXMgdG8gb3JpZ2luYWwgd2Vwc3RhdHVzCisJcEFkLT5TdGFDZmcuV2VwU3RhdHVzICAgPSBwQWQtPlN0YUNmZy5PcmlnV2VwU3RhdHVzOworCXBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgID0gcEFkLT5TdGFDZmcuT3JpZ1dlcFN0YXR1czsKKwlwQWQtPlN0YUNmZy5Hcm91cENpcGhlciA9IHBBZC0+U3RhQ2ZnLk9yaWdXZXBTdGF0dXM7CisKKwlCc3NJZHggPSBwQWQtPk1sbWVBdXguQnNzSWR4OworCWlmIChCc3NJZHggPCBwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NOcikKKwl7CisJCS8vIENoZWNrIGNpcGhlciBzdWl0ZSwgQVAgbXVzdCBoYXZlIG1vcmUgc2VjdXJlZCBjaXBoZXIgdGhhbiBzdGF0aW9uIHNldHRpbmcKKwkJLy8gU2V0IHRoZSBQYWlyd2lzZSBhbmQgR3JvdXAgY2lwaGVyIHRvIG1hdGNoIHRoZSBpbnRlbmRlZCBBUCBzZXR0aW5nCisJCS8vIFdlIGNhbiBvbmx5IGNvbm5lY3QgdG8gQVAgd2l0aCBsZXNzIHNlY3VyZWQgY2lwaGVyIHNldHRpbmcKKwkJaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpIHx8IChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spKQorCQl7CisJCQlwQWQtPlN0YUNmZy5Hcm91cENpcGhlciA9IHBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLkJzc0VudHJ5W0Jzc0lkeF0uV1BBLkdyb3VwQ2lwaGVyOworCisJCQlpZiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IHBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLkJzc0VudHJ5W0Jzc0lkeF0uV1BBLlBhaXJDaXBoZXIpCisJCQkJcEFkLT5TdGFDZmcuUGFpckNpcGhlciA9IHBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLkJzc0VudHJ5W0Jzc0lkeF0uV1BBLlBhaXJDaXBoZXI7CisJCQllbHNlIGlmIChwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NFbnRyeVtCc3NJZHhdLldQQS5QYWlyQ2lwaGVyQXV4ICE9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZCkKKwkJCQlwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID0gcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzRW50cnlbQnNzSWR4XS5XUEEuUGFpckNpcGhlckF1eDsKKwkJCWVsc2UJLy8gVGhlcmUgaXMgbm8gUGFpckNpcGhlciBBdXgsIGRvd25ncmFkZSBvdXIgY2FwYWJpbGl0eSB0byBUS0lQCisJCQkJcEFkLT5TdGFDZmcuUGFpckNpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ7CisJCX0KKwkJZWxzZSBpZiAoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIpIHx8IChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKSkKKwkJeworCQkJcEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgPSBwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NFbnRyeVtCc3NJZHhdLldQQTIuR3JvdXBDaXBoZXI7CisKKwkJCWlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzRW50cnlbQnNzSWR4XS5XUEEyLlBhaXJDaXBoZXIpCisJCQkJcEFkLT5TdGFDZmcuUGFpckNpcGhlciA9IHBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLkJzc0VudHJ5W0Jzc0lkeF0uV1BBMi5QYWlyQ2lwaGVyOworCQkJZWxzZSBpZiAocEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzRW50cnlbQnNzSWR4XS5XUEEyLlBhaXJDaXBoZXJBdXggIT0gTmRpczgwMl8xMVdFUERpc2FibGVkKQorCQkJCXBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPSBwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NFbnRyeVtCc3NJZHhdLldQQTIuUGFpckNpcGhlckF1eDsKKwkJCWVsc2UJLy8gVGhlcmUgaXMgbm8gUGFpckNpcGhlciBBdXgsIGRvd25ncmFkZSBvdXIgY2FwYWJpbGl0eSB0byBUS0lQCisJCQkJcEFkLT5TdGFDZmcuUGFpckNpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ7CisKKwkJCS8vIFJTTiBjYXBhYmlsaXR5CisJCQlwQWQtPlN0YUNmZy5Sc25DYXBhYmlsaXR5ID0gcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzRW50cnlbQnNzSWR4XS5XUEEyLlJzbkNhcGFiaWxpdHk7CisJCX0KKworCQkvLyBTZXQgTWl4IGNpcGhlciBmbGFnCisJCXBBZC0+U3RhQ2ZnLmJNaXhDaXBoZXIgPSAocEFkLT5TdGFDZmcuUGFpckNpcGhlciA9PSBwQWQtPlN0YUNmZy5Hcm91cENpcGhlcikgPyBGQUxTRSA6IFRSVUU7CisJCWlmIChwQWQtPlN0YUNmZy5iTWl4Q2lwaGVyID09IFRSVUUpCisJCXsKKwkJCS8vIElmIG1peCBjaXBoZXIsIHJlLWJ1aWxkIFJTTklFCisJCQlSVE1QTWFrZVJTTklFKHBBZCwgcEFkLT5TdGFDZmcuQXV0aE1vZGUsIHBBZC0+U3RhQ2ZnLldlcFN0YXR1cywgMCk7CisJCX0KKworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gaXRlcmF0ZSBCU1MgJWxkIG9mICVkXG4iLCBCc3NJZHgsIHBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLkJzc05yKSk7CisJCUpvaW5QYXJtRmlsbChwQWQsICZKb2luUmVxLCBCc3NJZHgpOworCQlNbG1lRW5xdWV1ZShwQWQsIFNZTkNfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfSk9JTl9SRVEsIHNpemVvZihNTE1FX0pPSU5fUkVRX1NUUlVDVCksCisJCQkJCSZKb2luUmVxKTsKKwkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9KT0lOOworCX0KKwllbHNlIGlmIChwQWQtPlN0YUNmZy5Cc3NUeXBlID09IEJTU19BREhPQykKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBBbGwgQlNTIGZhaWw7IHN0YXJ0IGEgbmV3IEFESE9DIChTc2lkPSVzKS4uLlxuIixwQWQtPk1sbWVBdXguU3NpZCkpOworCQlTdGFydFBhcm1GaWxsKHBBZCwgJlN0YXJ0UmVxLCBwQWQtPk1sbWVBdXguU3NpZCwgcEFkLT5NbG1lQXV4LlNzaWRMZW4pOworCQlNbG1lRW5xdWV1ZShwQWQsIFNZTkNfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfU1RBUlRfUkVRLCBzaXplb2YoTUxNRV9TVEFSVF9SRVFfU1RSVUNUKSwgJlN0YXJ0UmVxKTsKKwkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9TVEFSVDsKKwl9CisJZWxzZSAvLyBubyBtb3JlIEJTUworCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ05UTCAtIEFsbCByb2FtaW5nIGZhaWxlZCwgc3RheSBAIGNoICMlZFxuIiwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkpOworCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwsIEZBTFNFKTsKKwkJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCk7CisJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX0lETEU7CisJfQorfQorCisvLyBmb3IgcmUtYXNzb2NpYXRpb24gb25seQorLy8gSVJRTCA9IERJU1BBVENIX0xFVkVMCitWT0lEIEl0ZXJhdGVPbkJzc1RhYjIoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJTUxNRV9SRUFTU09DX1JFUV9TVFJVQ1QgUmVhc3NvY1JlcTsKKwlVTE9ORyAgICAgICAgICAgICAgICAgICBCc3NJZHg7CisJQlNTX0VOVFJZICAgICAgICAgICAgICAgKnBCc3M7CisKKwlCc3NJZHggPSBwQWQtPk1sbWVBdXguUm9hbUlkeDsKKwlwQnNzID0gJnBBZC0+TWxtZUF1eC5Sb2FtVGFiLkJzc0VudHJ5W0Jzc0lkeF07CisKKwlpZiAoQnNzSWR4IDwgcEFkLT5NbG1lQXV4LlJvYW1UYWIuQnNzTnIpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gaXRlcmF0ZSBCU1MgJWxkIG9mICVkXG4iLCBCc3NJZHgsIHBBZC0+TWxtZUF1eC5Sb2FtVGFiLkJzc05yKSk7CisKKwkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQnNzLT5DaGFubmVsLCBGQUxTRSk7CisJCUFzaWNMb2NrQ2hhbm5lbChwQWQsIHBCc3MtPkNoYW5uZWwpOworCisJCS8vIHJlYXNzb2NpYXRlIG1lc3NhZ2UgaGFzIHRoZSBzYW1lIHN0cnVjdHVyZSBhcyBhc3NvY2lhdGUgbWVzc2FnZQorCQlBc3NvY1Bhcm1GaWxsKHBBZCwgJlJlYXNzb2NSZXEsIHBCc3MtPkJzc2lkLCBwQnNzLT5DYXBhYmlsaXR5SW5mbywKKwkJCQkJICBBU1NPQ19USU1FT1VULCBwQWQtPlN0YUNmZy5EZWZhdWx0TGlzdGVuQ291bnQpOworCQlNbG1lRW5xdWV1ZShwQWQsIEFTU09DX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX1JFQVNTT0NfUkVRLAorCQkJCQlzaXplb2YoTUxNRV9SRUFTU09DX1JFUV9TVFJVQ1QpLCAmUmVhc3NvY1JlcSk7CisKKwkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9SRUFTU09DOworCX0KKwllbHNlIC8vIG5vIG1vcmUgQlNTCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gQWxsIGZhc3Qgcm9hbWluZyBmYWlsZWQsIGJhY2sgdG8gY2ggIyVkXG4iLHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpKTsKKwkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsLCBGQUxTRSk7CisJCUFzaWNMb2NrQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpOworCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9JRExFOworCX0KK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgSm9pblBhcm1GaWxsKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE9VVCBNTE1FX0pPSU5fUkVRX1NUUlVDVCAqSm9pblJlcSwKKwlJTiBVTE9ORyBCc3NJZHgpCit7CisJSm9pblJlcS0+QnNzSWR4ID0gQnNzSWR4OworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBTY2FuUGFybUZpbGwoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gT1VUIE1MTUVfU0NBTl9SRVFfU1RSVUNUICpTY2FuUmVxLAorCUlOIENIQVIgU3NpZFtdLAorCUlOIFVDSEFSIFNzaWRMZW4sCisJSU4gVUNIQVIgQnNzVHlwZSwKKwlJTiBVQ0hBUiBTY2FuVHlwZSkKK3sKKyAgICBOZGlzWmVyb01lbW9yeShTY2FuUmVxLT5Tc2lkLCBNQVhfTEVOX09GX1NTSUQpOworCVNjYW5SZXEtPlNzaWRMZW4gPSBTc2lkTGVuOworCU5kaXNNb3ZlTWVtb3J5KFNjYW5SZXEtPlNzaWQsIFNzaWQsIFNzaWRMZW4pOworCVNjYW5SZXEtPkJzc1R5cGUgPSBCc3NUeXBlOworCVNjYW5SZXEtPlNjYW5UeXBlID0gU2NhblR5cGU7Cit9CisKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIERsc1Bhcm1GaWxsKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE9VVCBNTE1FX0RMU19SRVFfU1RSVUNUICpwRGxzUmVxLAorCUlOIFBSVF84MDJfMTFfRExTIHBEbHMsCisJSU4gVVNIT1JUIHJlYXNvbikKK3sKKwlwRGxzUmVxLT5wRExTID0gcERsczsKKwlwRGxzUmVxLT5SZWFzb24gPSByZWFzb247Cit9CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIFN0YXJ0UGFybUZpbGwoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gT1VUIE1MTUVfU1RBUlRfUkVRX1NUUlVDVCAqU3RhcnRSZXEsCisJSU4gQ0hBUiBTc2lkW10sCisJSU4gVUNIQVIgU3NpZExlbikKK3sKKwlBU1NFUlQoU3NpZExlbiA8PSBNQVhfTEVOX09GX1NTSUQpOworCU5kaXNNb3ZlTWVtb3J5KFN0YXJ0UmVxLT5Tc2lkLCBTc2lkLCBTc2lkTGVuKTsKKwlTdGFydFJlcS0+U3NpZExlbiA9IFNzaWRMZW47Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIEF1dGhQYXJtRmlsbCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBPVVQgTUxNRV9BVVRIX1JFUV9TVFJVQ1QgKkF1dGhSZXEsCisJSU4gUFVDSEFSIHBBZGRyLAorCUlOIFVTSE9SVCBBbGcpCit7CisJQ09QWV9NQUNfQUREUihBdXRoUmVxLT5BZGRyLCBwQWRkcik7CisJQXV0aFJlcS0+QWxnID0gQWxnOworCUF1dGhSZXEtPlRpbWVvdXQgPSBBVVRIX1RJTUVPVVQ7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworI2lmZGVmIFJUMjg2MAorVk9JRCBDb21wb3NlUHNQb2xsKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCU5kaXNaZXJvTWVtb3J5KCZwQWQtPlBzUG9sbEZyYW1lLCBzaXplb2YoUFNQT0xMX0ZSQU1FKSk7CisJcEFkLT5Qc1BvbGxGcmFtZS5GQy5UeXBlID0gQlRZUEVfQ05UTDsKKwlwQWQtPlBzUG9sbEZyYW1lLkZDLlN1YlR5cGUgPSBTVUJUWVBFX1BTX1BPTEw7CisJcEFkLT5Qc1BvbGxGcmFtZS5BaWQgPSBwQWQtPlN0YUFjdGl2ZS5BaWQgfCAweEMwMDA7CisJQ09QWV9NQUNfQUREUihwQWQtPlBzUG9sbEZyYW1lLkJzc2lkLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisJQ09QWV9NQUNfQUREUihwQWQtPlBzUG9sbEZyYW1lLlRhLCBwQWQtPkN1cnJlbnRBZGRyZXNzKTsKK30KKworLy8gSVJRTCA9IERJU1BBVENIX0xFVkVMCitWT0lEIENvbXBvc2VOdWxsRnJhbWUoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJTmRpc1plcm9NZW1vcnkoJnBBZC0+TnVsbEZyYW1lLCBzaXplb2YoSEVBREVSXzgwMl8xMSkpOworCXBBZC0+TnVsbEZyYW1lLkZDLlR5cGUgPSBCVFlQRV9EQVRBOworCXBBZC0+TnVsbEZyYW1lLkZDLlN1YlR5cGUgPSBTVUJUWVBFX05VTExfRlVOQzsKKwlwQWQtPk51bGxGcmFtZS5GQy5Ub0RzID0gMTsKKwlDT1BZX01BQ19BRERSKHBBZC0+TnVsbEZyYW1lLkFkZHIxLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisJQ09QWV9NQUNfQUREUihwQWQtPk51bGxGcmFtZS5BZGRyMiwgcEFkLT5DdXJyZW50QWRkcmVzcyk7CisJQ09QWV9NQUNfQUREUihwQWQtPk51bGxGcmFtZS5BZGRyMywgcEFkLT5Db21tb25DZmcuQnNzaWQpOworfQorI2VuZGlmIC8vIFJUMjg2MCAvLworCisKKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVByZS1idWlsZCBhIEJFQUNPTiBmcmFtZSBpbiB0aGUgc2hhcmVkIG1lbW9yeQorCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVUxPTkcgTWFrZUlic3NCZWFjb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJVUNIQVIgICAgICAgICBEc0xlbiA9IDEsIElic3NMZW4gPSAyOworCVVDSEFSICAgICAgICAgTG9jYWxFcnBJZVszXSA9IHtJRV9FUlAsIDEsIDB4MDR9OworCUhFQURFUl84MDJfMTEgQmNuSGRyOworCVVTSE9SVCAgICAgICAgQ2FwYWJpbGl0eUluZm87CisJTEFSR0VfSU5URUdFUiBGYWtlVGltZXN0YW1wOworCVVMT05HICAgICAgICAgRnJhbWVMZW4gPSAwOworCVBUWFdJX1NUUlVDCSAgcFR4V0kgPSAmcEFkLT5CZWFjb25UeFdJOworCUNIQVIgICAgICAgICAqcEJlYWNvbkZyYW1lID0gcEFkLT5CZWFjb25CdWY7CisJQk9PTEVBTiAgICAgICBQcml2YWN5OworCVVDSEFSICAgICAgICAgU3VwUmF0ZVtNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFU107CisJVUNIQVIgICAgICAgICBTdXBSYXRlTGVuID0gMDsKKwlVQ0hBUiAgICAgICAgIEV4dFJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdOworCVVDSEFSICAgICAgICAgRXh0UmF0ZUxlbiA9IDA7CisJVUNIQVIgICAgICAgICBSU05JZSA9IElFX1dQQTsKKworCWlmICgocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFCKSAmJiAocEFkLT5Db21tb25DZmcuQ2hhbm5lbCA8PSAxNCkpCisJeworCQlTdXBSYXRlWzBdID0gMHg4MjsgLy8gMSBtYnBzCisJCVN1cFJhdGVbMV0gPSAweDg0OyAvLyAyIG1icHMKKwkJU3VwUmF0ZVsyXSA9IDB4OGI7IC8vIDUuNSBtYnBzCisJCVN1cFJhdGVbM10gPSAweDk2OyAvLyAxMSBtYnBzCisJCVN1cFJhdGVMZW4gPSA0OworCQlFeHRSYXRlTGVuID0gMDsKKwl9CisJZWxzZSBpZiAocEFkLT5Db21tb25DZmcuQ2hhbm5lbCA+IDE0KQorCXsKKwkJU3VwUmF0ZVswXSAgPSAweDhDOyAgICAvLyA2IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzLCBiYXNpYyByYXRlCisJCVN1cFJhdGVbMV0gID0gMHgxMjsgICAgLy8gOSBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQlTdXBSYXRlWzJdICA9IDB4OTg7ICAgIC8vIDEyIG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzLCBiYXNpYyByYXRlCisJCVN1cFJhdGVbM10gID0gMHgyNDsgICAgLy8gMTggbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJU3VwUmF0ZVs0XSAgPSAweGIwOyAgICAvLyAyNCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcywgYmFzaWMgcmF0ZQorCQlTdXBSYXRlWzVdICA9IDB4NDg7ICAgIC8vIDM2IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCisJCVN1cFJhdGVbNl0gID0gMHg2MDsgICAgLy8gNDggbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJU3VwUmF0ZVs3XSAgPSAweDZjOyAgICAvLyA1NCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQlTdXBSYXRlTGVuICA9IDg7CisJCUV4dFJhdGVMZW4gID0gMDsKKworCQkvLworCQkvLyBBbHNvIFVwZGF0ZSBNbG1lUmF0ZSAmIFJ0c1JhdGUgZm9yIEcgb25seSAmIEEgb25seQorCQkvLworCQlwQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZSA9IFJBVEVfNjsKKwkJcEFkLT5Db21tb25DZmcuUnRzUmF0ZSA9IFJBVEVfNjsKKwkJcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1PREUgPSBNT0RFX09GRE07CisJCXBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NQ1MgPSBPZmRtUmF0ZVRvUnh3aU1DU1twQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZV07CisJCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTME1jYXN0X1dDSURdLkhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9PRkRNOworCQlwQWQtPk1hY1RhYi5Db250ZW50W0JTUzBNY2FzdF9XQ0lEXS5IVFBoeU1vZGUuZmllbGQuTUNTID0gT2ZkbVJhdGVUb1J4d2lNQ1NbcEFkLT5Db21tb25DZmcuTWxtZVJhdGVdOworCX0KKwllbHNlCisJeworCQlTdXBSYXRlWzBdID0gMHg4MjsgLy8gMSBtYnBzCisJCVN1cFJhdGVbMV0gPSAweDg0OyAvLyAyIG1icHMKKwkJU3VwUmF0ZVsyXSA9IDB4OGI7IC8vIDUuNSBtYnBzCisJCVN1cFJhdGVbM10gPSAweDk2OyAvLyAxMSBtYnBzCisJCVN1cFJhdGVMZW4gPSA0OworCisJCUV4dFJhdGVbMF0gID0gMHgwQzsgICAgLy8gNiBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcywKKwkJRXh0UmF0ZVsxXSAgPSAweDEyOyAgICAvLyA5IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCisJCUV4dFJhdGVbMl0gID0gMHgxODsgICAgLy8gMTIgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMsCisJCUV4dFJhdGVbM10gID0gMHgyNDsgICAgLy8gMTggbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJRXh0UmF0ZVs0XSAgPSAweDMwOyAgICAvLyAyNCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcywKKwkJRXh0UmF0ZVs1XSAgPSAweDQ4OyAgICAvLyAzNiBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQlFeHRSYXRlWzZdICA9IDB4NjA7ICAgIC8vIDQ4IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCisJCUV4dFJhdGVbN10gID0gMHg2YzsgICAgLy8gNTQgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJRXh0UmF0ZUxlbiAgPSA4OworCX0KKworCXBBZC0+U3RhQWN0aXZlLlN1cFJhdGVMZW4gPSBTdXBSYXRlTGVuOworCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQWN0aXZlLlN1cFJhdGUsIFN1cFJhdGUsIFN1cFJhdGVMZW4pOworCXBBZC0+U3RhQWN0aXZlLkV4dFJhdGVMZW4gPSBFeHRSYXRlTGVuOworCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQWN0aXZlLkV4dFJhdGUsIEV4dFJhdGUsIEV4dFJhdGVMZW4pOworCisJLy8gY29tcG9zZSBJQlNTIGJlYWNvbiBmcmFtZQorCU1ndE1hY0hlYWRlckluaXQocEFkLCAmQmNuSGRyLCBTVUJUWVBFX0JFQUNPTiwgMCwgQlJPQURDQVNUX0FERFIsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKwlQcml2YWN5ID0gKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjFFbmFibGVkKSB8fAorCQkJICAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpIHx8CisJCQkgIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCk7CisJQ2FwYWJpbGl0eUluZm8gPSBDQVBfR0VORVJBVEUoMCwgMSwgUHJpdmFjeSwgKHBBZC0+Q29tbW9uQ2ZnLlR4UHJlYW1ibGUgPT0gUnQ4MDJfMTFQcmVhbWJsZVNob3J0KSwgMCwgMCk7CisKKwlNYWtlT3V0Z29pbmdGcmFtZShwQmVhY29uRnJhbWUsICAgICAgICAgICAgICAgICZGcmFtZUxlbiwKKwkJCQkJICBzaXplb2YoSEVBREVSXzgwMl8xMSksICAgICAgICAgICAmQmNuSGRyLAorCQkJCQkgIFRJTUVTVEFNUF9MRU4sICAgICAgICAgICAgICAgICAgICZGYWtlVGltZXN0YW1wLAorCQkJCQkgIDIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQWQtPkNvbW1vbkNmZy5CZWFjb25QZXJpb2QsCisJCQkJCSAgMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkNhcGFiaWxpdHlJbmZvLAorCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTc2lkSWUsCisJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW4sCisJCQkJCSAgcEFkLT5Db21tb25DZmcuU3NpZExlbiwgICAgICAgICAgcEFkLT5Db21tb25DZmcuU3NpZCwKKwkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3VwUmF0ZUllLAorCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdXBSYXRlTGVuLAorCQkJCQkgIFN1cFJhdGVMZW4sICAgICAgICAgICAgICAgICAgICAgIFN1cFJhdGUsCisJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkRzSWUsCisJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkRzTGVuLAorCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQWQtPkNvbW1vbkNmZy5DaGFubmVsLAorCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZJYnNzSWUsCisJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJklic3NMZW4sCisJCQkJCSAgMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBBZC0+U3RhQWN0aXZlLkF0aW1XaW4sCisJCQkJCSAgRU5EX09GX0FSR1MpOworCisJLy8gYWRkIEVSUF9JRSBhbmQgRVhUX1JBRSBJRSBvZiBpbiA4MDIuMTFnCisJaWYgKEV4dFJhdGVMZW4pCisJeworCQlVTE9ORwl0bXA7CisKKwkJTWFrZU91dGdvaW5nRnJhbWUocEJlYWNvbkZyYW1lICsgRnJhbWVMZW4sICAgICAgICAgJnRtcCwKKwkJCQkJCSAgMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9jYWxFcnBJZSwKKwkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkV4dFJhdGVJZSwKKwkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkV4dFJhdGVMZW4sCisJCQkJCQkgIEV4dFJhdGVMZW4sICAgICAgICAgICAgICAgICAgICAgIEV4dFJhdGUsCisJCQkJCQkgIEVORF9PRl9BUkdTKTsKKwkJRnJhbWVMZW4gKz0gdG1wOworCX0KKworCS8vIElmIGFkaG9jIHNlY3J1aXR5IGlzIHNldCBmb3IgV1BBLU5vbmUsIGFwcGVuZCB0aGUgY2lwaGVyIHN1aXRlIElFCisJaWYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmUpCisJeworCQlVTE9ORyB0bXA7CisgICAgICAgIFJUTVBNYWtlUlNOSUUocEFkLCBwQWQtPlN0YUNmZy5BdXRoTW9kZSwgcEFkLT5TdGFDZmcuV2VwU3RhdHVzLCBCU1MwKTsKKworCQlNYWtlT3V0Z29pbmdGcmFtZShwQmVhY29uRnJhbWUgKyBGcmFtZUxlbiwgICAgICAgIAkmdG1wLAorCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkmUlNOSWUsCisJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkmcEFkLT5TdGFDZmcuUlNOSUVfTGVuLAorCQkJCQkJICBwQWQtPlN0YUNmZy5SU05JRV9MZW4sICAgICAgCQlwQWQtPlN0YUNmZy5SU05fSUUsCisJCQkJCQkgIEVORF9PRl9BUkdTKTsKKwkJRnJhbWVMZW4gKz0gdG1wOworCX0KKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCWlmICgocEFkLT5Db21tb25DZmcuUGh5TW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEKSkKKwl7CisJCVVMT05HIFRtcExlbjsKKwkJVUNIQVIgSHRMZW4sIEh0TGVuMTsKKworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwkJSFRfQ0FQQUJJTElUWV9JRSBIdENhcGFiaWxpdHlUbXA7CisJCUFERF9IVF9JTkZPX0lFCWFkZEhUSW5mb1RtcDsKKwkJVVNIT1JUCWIybFRtcCwgYjJsVG1wMjsKKyNlbmRpZgorCisJCS8vIGFkZCBIVCBDYXBhYmlsaXR5IElFCisJCUh0TGVuID0gc2l6ZW9mKHBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eSk7CisJCUh0TGVuMSA9IHNpemVvZihwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8pOworI2lmbmRlZiBSVF9CSUdfRU5ESUFOCisJCU1ha2VPdXRnb2luZ0ZyYW1lKHBCZWFjb25GcmFtZStGcmFtZUxlbiwJJlRtcExlbiwKKwkJCQkJCSAgMSwJCQkJCQkmSHRDYXBJZSwKKwkJCQkJCSAgMSwJCQkJCQkmSHRMZW4sCisJCQkJCQkgIEh0TGVuLAkJCQkJJnBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eSwKKwkJCQkJCSAgMSwJCQkJCQkmQWRkSHRJbmZvSWUsCisJCQkJCQkgIDEsCQkJCQkJJkh0TGVuMSwKKwkJCQkJCSAgSHRMZW4xLAkJCQkJJnBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mbywKKwkJCQkJCSAgRU5EX09GX0FSR1MpOworI2Vsc2UKKwkJTmRpc01vdmVNZW1vcnkoJkh0Q2FwYWJpbGl0eVRtcCwgJnBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eSwgSHRMZW4pOworCQkqKFVTSE9SVCAqKSgmSHRDYXBhYmlsaXR5VG1wLkh0Q2FwSW5mbykgPSBTV0FQMTYoKihVU0hPUlQgKikoJkh0Q2FwYWJpbGl0eVRtcC5IdENhcEluZm8pKTsKKwkJKihVU0hPUlQgKikoJkh0Q2FwYWJpbGl0eVRtcC5FeHRIdENhcEluZm8pID0gU1dBUDE2KCooVVNIT1JUICopKCZIdENhcGFiaWxpdHlUbXAuRXh0SHRDYXBJbmZvKSk7CisKKwkJTmRpc01vdmVNZW1vcnkoJmFkZEhUSW5mb1RtcCwgJnBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mbywgSHRMZW4xKTsKKwkJKihVU0hPUlQgKikoJmFkZEhUSW5mb1RtcC5BZGRIdEluZm8yKSA9IFNXQVAxNigqKFVTSE9SVCAqKSgmYWRkSFRJbmZvVG1wLkFkZEh0SW5mbzIpKTsKKwkJKihVU0hPUlQgKikoJmFkZEhUSW5mb1RtcC5BZGRIdEluZm8zKSA9IFNXQVAxNigqKFVTSE9SVCAqKSgmYWRkSFRJbmZvVG1wLkFkZEh0SW5mbzMpKTsKKworCQlNYWtlT3V0Z29pbmdGcmFtZShwQmVhY29uRnJhbWUrRnJhbWVMZW4sCSZUbXBMZW4sCisJCQkJCQkgIDEsCQkJCQkJJkh0Q2FwSWUsCisJCQkJCQkgIDEsCQkJCQkJJkh0TGVuLAorCQkJCQkJICBIdExlbiwJCQkJCSZIdENhcGFiaWxpdHlUbXAsCisJCQkJCQkgIDEsCQkJCQkJJkFkZEh0SW5mb0llLAorCQkJCQkJICAxLAkJCQkJCSZIdExlbjEsCisJCQkJCQkgIEh0TGVuMSwJCQkJCSZhZGRIVEluZm9UbXAsCisJCQkJCQkgIEVORF9PRl9BUkdTKTsKKyNlbmRpZgorCQlGcmFtZUxlbiArPSBUbXBMZW47CisJfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJLy9iZWFjb24gdXNlIHJlc2VydmVkIFdDSUQgMHhmZgorICAgIGlmIChwQWQtPkNvbW1vbkNmZy5DaGFubmVsID4gMTQpCisgICAgeworCVJUTVBXcml0ZVR4V0kocEFkLCBwVHhXSSwgRkFMU0UsIEZBTFNFLCAgVFJVRSwgRkFMU0UsIEZBTFNFLCBUUlVFLCAwLCAweGZmLCBGcmFtZUxlbiwKKwkJUElEX01HTVQsIFBJRF9CRUFDT04sIFJBVEVfMSwgSUZTX0hUVFhPUCwgRkFMU0UsICZwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvLyBTZXQgdG8gdXNlIDFNYnBzIGZvciBBZGhvYyBiZWFjb24uCisJCUhUVFJBTlNNSVRfU0VUVElORyBUcmFuc21pdDsKKyAgICAgICAgVHJhbnNtaXQud29yZCA9IDA7CisgICAgICAgIFJUTVBXcml0ZVR4V0kocEFkLCBwVHhXSSwgRkFMU0UsIEZBTFNFLCAgVFJVRSwgRkFMU0UsIEZBTFNFLCBUUlVFLCAwLCAweGZmLCBGcmFtZUxlbiwKKyAgICAJCVBJRF9NR01ULCBQSURfQkVBQ09OLCBSQVRFXzEsIElGU19IVFRYT1AsIEZBTFNFLCAmVHJhbnNtaXQpOworICAgIH0KKworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwlSVE1QRnJhbWVFbmRpYW5DaGFuZ2UocEFkLCBwQmVhY29uRnJhbWUsIERJUl9XUklURSwgRkFMU0UpOworCVJUTVBXSUVuZGlhbkNoYW5nZSgoUFVDSEFSKXBUeFdJLCBUWVBFX1RYV0kpOworI2VuZGlmCisKKyAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNYWtlSWJzc0JlYWNvbiAobGVuPSVsZCksIFN1cFJhdGVMZW49JWQsIEV4dFJhdGVMZW49JWQsIENoYW5uZWw9JWQsIFBoeU1vZGU9JWRcbiIsCisJCQkJCUZyYW1lTGVuLCBTdXBSYXRlTGVuLCBFeHRSYXRlTGVuLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsLCBwQWQtPkNvbW1vbkNmZy5QaHlNb2RlKSk7CisJcmV0dXJuIEZyYW1lTGVuOworfQorCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3RhL2Rscy5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zdGEvZGxzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhmYjI4OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3RhL2Rscy5jCkBAIC0wLDAgKzEsMjIwMSBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICBNb2R1bGUgTmFtZToKKyAgICBkbHMuYworCisgICAgQWJzdHJhY3Q6CisgICAgSGFuZGxlIFdNTS1ETFMgc3RhdGUgbWFjaGluZQorCisgICAgUmV2aXNpb24gSGlzdG9yeToKKyAgICBXaG8gICAgICAgICBXaGVuICAgICAgICAgIFdoYXQKKyAgICAtLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBSb3J5IENoZW4gICAwMi0xNC0yMDA2CisJQXJ2aW4gVGFpCTA2LTAzLTIwMDgJICBNb2RpZmllZCBmb3IgUlQyOHh4CisgKi8KKworI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIGRscyBzdGF0ZSBtYWNoaW5lIGluaXQsIGluY2x1ZGluZyBzdGF0ZSB0cmFuc2l0aW9uIGFuZCB0aW1lciBpbml0CisgICAgUGFyYW1ldGVyczoKKyAgICAgICAgU20gLSBwb2ludGVyIHRvIHRoZSBkbHMgc3RhdGUgbWFjaGluZQorICAgIE5vdGU6CisgICAgICAgIFRoZSBzdGF0ZSBtYWNoaW5lIGxvb2tzIGxpa2UgdGhpcworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRExTX0lETEUKKyAgICBNVDJfTUxNRV9ETFNfUkVRVUVTVCAgIE1sbWVEbHNSZXFBY3Rpb24KKyAgICBNVDJfUEVFUl9ETFNfUkVRVUVTVCAgIFBlZXJEbHNSZXFBY3Rpb24KKyAgICBNVDJfUEVFUl9ETFNfUkVTUE9OU0UgIFBlZXJEbHNSc3BBY3Rpb24KKyAgICBNVDJfTUxNRV9ETFNfVEVBUkRPV04gIE1sbWVUZWFyRG93bkFjdGlvbgorICAgIE1UMl9QRUVSX0RMU19URUFSRE9XTiAgUGVlclRlYXJEb3duQWN0aW9uCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLwordm9pZCBEbHNTdGF0ZU1hY2hpbmVJbml0KAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIFNUQVRFX01BQ0hJTkUgKlNtLAorICAgIE9VVCBTVEFURV9NQUNISU5FX0ZVTkMgVHJhbnNbXSkKK3sKKwlVQ0hBUglpOworCisgICAgU3RhdGVNYWNoaW5lSW5pdChTbSwgKFNUQVRFX01BQ0hJTkVfRlVOQyopVHJhbnMsIE1BWF9ETFNfU1RBVEUsIE1BWF9ETFNfTVNHLCAoU1RBVEVfTUFDSElORV9GVU5DKURyb3AsIERMU19JRExFLCBETFNfTUFDSElORV9CQVNFKTsKKworICAgIC8vIHRoZSBmaXJzdCBjb2x1bW4KKyAgICBTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIERMU19JRExFLCBNVDJfTUxNRV9ETFNfUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKU1sbWVEbHNSZXFBY3Rpb24pOworICAgIFN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgRExTX0lETEUsIE1UMl9QRUVSX0RMU19SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpUGVlckRsc1JlcUFjdGlvbik7CisgICAgU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBETFNfSURMRSwgTVQyX1BFRVJfRExTX1JTUCwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyRGxzUnNwQWN0aW9uKTsKKyAgICBTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIERMU19JRExFLCBNVDJfTUxNRV9ETFNfVEVBUl9ET1dOLCAoU1RBVEVfTUFDSElORV9GVU5DKU1sbWVEbHNUZWFyRG93bkFjdGlvbik7CisgICAgU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBETFNfSURMRSwgTVQyX1BFRVJfRExTX1RFQVJfRE9XTiwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyRGxzVGVhckRvd25BY3Rpb24pOworCisJZm9yIChpPTA7IGk8TUFYX05VTV9PRl9ETFNfRU5UUlk7IGkrKykKKwl7CisJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLnBBZCA9IHBBZDsKKwkJUlRNUEluaXRUaW1lcihwQWQsICZwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5UaW1lciwgR0VUX1RJTUVSX0ZVTkNUSU9OKERsc1RpbWVvdXRBY3Rpb24pLCBwQWQsIEZBTFNFKTsKKwl9Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBNbG1lRGxzUmVxQWN0aW9uKAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlQVUNIQVIJCQlwT3V0QnVmZmVyID0gTlVMTDsKKwlORElTX1NUQVRVUwkJTlN0YXR1czsKKwlVTE9ORwkJCUZyYW1lTGVuID0gMDsKKwlIRUFERVJfODAyXzExCURsc1JlcUhkcjsKKwlQUlRfODAyXzExX0RMUwlwRExTID0gTlVMTDsKKwlVQ0hBUgkJCUNhdGVnb3J5ID0gQ0FURUdPUllfRExTOworCVVDSEFSCQkJQWN0aW9uID0gQUNUSU9OX0RMU19SRVFVRVNUOworCVVMT05HCQkJdG1wOworCVVTSE9SVAkJCXJlYXNvbjsKKwlVTE9ORwkJCVRpbWVvdXQ7CisJQk9PTEVBTgkJCVRpbWVyQ2FuY2VsbGVkOworCisJaWYoIU1sbWVEbHNSZXFTYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbiwgJnBETFMsICZyZWFzb24pKQorCQlyZXR1cm47CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkRMUyAtIE1sbWVEbHNSZXFBY3Rpb24oKSBcbiIpKTsKKworCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5CisJaWYgKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiRExTIC0gTWxtZURsc1JlcUFjdGlvbigpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWQgXG4iKSk7CisJCXJldHVybjsKKwl9CisKKwlBY3RIZWFkZXJJbml0KHBBZCwgJkRsc1JlcUhkciwgcEFkLT5Db21tb25DZmcuQnNzaWQsIHBBZC0+Q3VycmVudEFkZHJlc3MsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKworCS8vIEJ1aWxkIGJhc2ljIGZyYW1lIGZpcnN0CisJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwJCQkJJkZyYW1lTGVuLAorCQkJCQlzaXplb2YoSEVBREVSXzgwMl8xMSksCQkmRGxzUmVxSGRyLAorCQkJCQkxLAkJCQkJCQkmQ2F0ZWdvcnksCisJCQkJCTEsCQkJCQkJCSZBY3Rpb24sCisJCQkJCTYsCQkJCQkJCSZwRExTLT5NYWNBZGRyLAorCQkJCQk2LAkJCQkJCQlwQWQtPkN1cnJlbnRBZGRyZXNzLAorCQkJCQkyLAkJCQkJCQkmcEFkLT5TdGFBY3RpdmUuQ2FwYWJpbGl0eUluZm8sCisJCQkJCTIsCQkJCQkJCSZwRExTLT5UaW1lT3V0LAorCQkJCQkxLAkJCQkJCQkmU3VwUmF0ZUllLAorCQkJCQkxLAkJCQkJCQkmcEFkLT5NbG1lQXV4LlN1cFJhdGVMZW4sCisJCQkJCXBBZC0+TWxtZUF1eC5TdXBSYXRlTGVuLAlwQWQtPk1sbWVBdXguU3VwUmF0ZSwKKwkJCQkJRU5EX09GX0FSR1MpOworCisJaWYgKHBBZC0+TWxtZUF1eC5FeHRSYXRlTGVuICE9IDApCisJeworCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sCSZ0bXAsCisJCQkJCQkgIDEsCQkJCQkJJkV4dFJhdGVJZSwKKwkJCQkJCSAgMSwJCQkJCQkmcEFkLT5NbG1lQXV4LkV4dFJhdGVMZW4sCisJCQkJCQkgIHBBZC0+TWxtZUF1eC5FeHRSYXRlTGVuLAlwQWQtPk1sbWVBdXguRXh0UmF0ZSwKKwkJCQkJCSAgRU5EX09GX0FSR1MpOworCQlGcmFtZUxlbiArPSB0bXA7CisJfQorCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJaWYgKChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID49IFBIWV8xMUFCR05fTUlYRUQpKQorCXsKKwkJVUNIQVIgSHRMZW47CisKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJCUhUX0NBUEFCSUxJVFlfSUUgSHRDYXBhYmlsaXR5VG1wOworI2VuZGlmCisKKwkJLy8gYWRkIEhUIENhcGFiaWxpdHkgSUUKKwkJSHRMZW4gPSBzaXplb2YoSFRfQ0FQQUJJTElUWV9JRSk7CisjaWZuZGVmIFJUX0JJR19FTkRJQU4KKwkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLAkmdG1wLAorCQkJCQkJCTEsCQkJCQkJJkh0Q2FwSWUsCisJCQkJCQkJMSwJCQkJCQkmSHRMZW4sCisJCQkJCQkJSHRMZW4sCQkJCQkmcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5LAorCQkJCQkJCUVORF9PRl9BUkdTKTsKKyNlbHNlCisJCU5kaXNNb3ZlTWVtb3J5KCZIdENhcGFiaWxpdHlUbXAsICZwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHksIEh0TGVuKTsKKwkJCQkJCQkqKFVTSE9SVCAqKSgmSHRDYXBhYmlsaXR5VG1wLkh0Q2FwSW5mbykgPSBTV0FQMTYoKihVU0hPUlQgKikoJkh0Q2FwYWJpbGl0eVRtcC5IdENhcEluZm8pKTsKKwkJCQkJCQkqKFVTSE9SVCAqKSgmSHRDYXBhYmlsaXR5VG1wLkV4dEh0Q2FwSW5mbykgPSBTV0FQMTYoKihVU0hPUlQgKikoJkh0Q2FwYWJpbGl0eVRtcC5FeHRIdENhcEluZm8pKTsKKworCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sCSZ0bXAsCisJCQkJCQkJMSwJCQkJCQkmSHRDYXBJZSwKKwkJCQkJCQkxLAkJCQkJCSZIdExlbiwKKwkJCQkJCQlIdExlbiwJCQkJCSZIdENhcGFiaWxpdHlUbXAsCisJCQkJCQkJRU5EX09GX0FSR1MpOworI2VuZGlmCisJCUZyYW1lTGVuID0gRnJhbWVMZW4gKyB0bXA7CisJfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJUlRNUENhbmNlbFRpbWVyKCZwRExTLT5UaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKKwlUaW1lb3V0ID0gRExTX1RJTUVPVVQ7CisJUlRNUFNldFRpbWVyKCZwRExTLT5UaW1lciwgVGltZW91dCk7CisKKwlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIFFJRF9BQ19CRSwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOworCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBQZWVyRGxzUmVxQWN0aW9uKAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlQVUNIQVIJCQlwT3V0QnVmZmVyID0gTlVMTDsKKwlORElTX1NUQVRVUwkJTlN0YXR1czsKKwlVTE9ORwkJCUZyYW1lTGVuID0gMDsKKwlVU0hPUlQJCQlTdGF0dXNDb2RlID0gTUxNRV9TVUNDRVNTOworCUhFQURFUl84MDJfMTEJRGxzUnNwSGRyOworCVVDSEFSCQkJQ2F0ZWdvcnkgPSBDQVRFR09SWV9ETFM7CisJVUNIQVIJCQlBY3Rpb24gPSBBQ1RJT05fRExTX1JFU1BPTlNFOworCVVMT05HCQkJdG1wOworCVVTSE9SVAkJCUNhcGFiaWxpdHlJbmZvOworCVVDSEFSCQkJREFbTUFDX0FERFJfTEVOXSwgU0FbTUFDX0FERFJfTEVOXTsKKwlVU0hPUlQJCQlETFNUaW1lT3V0OworCVNIT1JUCQkJaTsKKwlVTE9ORwkJCVRpbWVvdXQ7CisJQk9PTEVBTgkJCVRpbWVyQ2FuY2VsbGVkOworCVBSVF84MDJfMTFfRExTCXBETFMgPSBOVUxMOworCVVDSEFSCQkJTWF4U3VwcG9ydGVkUmF0ZUluNTAwS2JwcyA9IDA7CisgICAgVUNIQVIJCQlTdXBwb3J0ZWRSYXRlc0xlbjsKKyAgICBVQ0hBUgkJCVN1cHBvcnRlZFJhdGVzW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXTsKKwlVQ0hBUgkJCUh0Q2FwYWJpbGl0eUxlbjsKKwlIVF9DQVBBQklMSVRZX0lFCUh0Q2FwYWJpbGl0eTsKKworCWlmICghUGVlckRsc1JlcVNhbml0eShwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuLCBEQSwgU0EsICZDYXBhYmlsaXR5SW5mbywgJkRMU1RpbWVPdXQsCisJCQkJCQkJJlN1cHBvcnRlZFJhdGVzTGVuLCAmU3VwcG9ydGVkUmF0ZXNbMF0sICZIdENhcGFiaWxpdHlMZW4sICZIdENhcGFiaWxpdHkpKQorCQlyZXR1cm47CisKKyAgICAvLyBzdXBwb3J0ZWQgcmF0ZXMgYXJyYXkgbWF5IG5vdCBiZSBzb3J0ZWQuIHNvcnQgaXQgYW5kIGZpbmQgdGhlIG1heGltdW0gcmF0ZQorICAgIGZvciAoaSA9IDA7IGkgPCBTdXBwb3J0ZWRSYXRlc0xlbjsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKE1heFN1cHBvcnRlZFJhdGVJbjUwMEticHMgPCAoU3VwcG9ydGVkUmF0ZXNbaV0gJiAweDdmKSkKKyAgICAgICAgICAgIE1heFN1cHBvcnRlZFJhdGVJbjUwMEticHMgPSBTdXBwb3J0ZWRSYXRlc1tpXSAmIDB4N2Y7CisgICAgfQorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJETFMgLSBQZWVyRGxzUmVxQWN0aW9uKCkgZnJvbSAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwgU0FbMF0sIFNBWzFdLCBTQVsyXSwgU0FbM10sIFNBWzRdLCBTQVs1XSkpOworCisJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKKwlpZiAoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJETFMgLSBQZWVyRGxzUmVxQWN0aW9uKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxlZCBcbiIpKTsKKwkJcmV0dXJuOworCX0KKworCWlmICghSU5GUkFfT04ocEFkKSkKKwl7CisJCVN0YXR1c0NvZGUgPSBNTE1FX1JFUVVFU1RfREVDTElORUQ7CisJfQorCWVsc2UgaWYgKCFwQWQtPkNvbW1vbkNmZy5iV21tQ2FwYWJsZSkKKwl7CisJCVN0YXR1c0NvZGUgPSBNTE1FX0RFU1RfU1RBX0lTX05PVF9BX1FTVEE7CisJfQorCWVsc2UgaWYgKCFwQWQtPkNvbW1vbkNmZy5iRExTQ2FwYWJsZSkKKwl7CisJCVN0YXR1c0NvZGUgPSBNTE1FX1JFUVVFU1RfREVDTElORUQ7CisJfQorCWVsc2UKKwl7CisJCS8vIGZpbmQgdGFibGUgdG8gdXBkYXRlIHBhcmFtZXRlcnMKKwkJZm9yIChpID0gKE1BWF9OVU1fT0ZfRExTX0VOVFJZLTEpOyBpID49IDA7IGktLSkKKwkJeworCQkJaWYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkICYmIE1BQ19BRERSX0VRVUFMKFNBLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKSkKKwkJCXsKKwkJCQlpZiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKQorCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPSBETFNfV0FJVF9LRVk7CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5UaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKKwkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID0gRExTX0ZJTklTSDsKKwkJCQl9CisKKwkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TZXF1ZW5jZSA9IDA7CisJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVGltZU91dCA9IERMU1RpbWVPdXQ7CisJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uQ291bnREb3duVGltZXIgPSBETFNUaW1lT3V0OworCQkJCWlmIChIdENhcGFiaWxpdHlMZW4gIT0gMCkKKwkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uYkhUQ2FwID0gVFJVRTsKKwkJCQllbHNlCisJCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLmJIVENhcCA9IEZBTFNFOworCQkJCXBETFMgPSAmcEFkLT5TdGFDZmcuRExTRW50cnlbaV07CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQkvLyBjYW4gbm90IGZpbmQgaW4gdGFibGUsIGNyZWF0ZSBhIG5ldyBvbmUKKwkJaWYgKGkgPCAwKQorCQl7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkRMUyAtIFBlZXJEbHNSZXFBY3Rpb24oKSBjYW4gbm90IGZpbmQgc2FtZSBlbnRyeSBcbiIpKTsKKwkJCWZvciAoaT0oTUFYX05VTV9PRl9ETFNfRU5UUlkgLSAxKTsgaSA+PSBNQVhfTlVNX09GX0lOSVRfRExTX0VOVFJZOyBpLS0pCisJCQl7CisJCQkJaWYgKCFwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZCkKKwkJCQl7CisJCQkJCU1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5OworCQkJCQlVQ0hBUiBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8xMTsKKworCQkJCQlpZiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKQorCQkJCQl7CisJCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPSBETFNfV0FJVF9LRVk7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlRpbWVyLCAmVGltZXJDYW5jZWxsZWQpOworCQkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID0gRExTX0ZJTklTSDsKKwkJCQkJfQorCisJCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlNlcXVlbmNlID0gMDsKKwkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQgPSBUUlVFOworCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5UaW1lT3V0ID0gRExTVGltZU91dDsKKwkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uQ291bnREb3duVGltZXIgPSBETFNUaW1lT3V0OworCQkJCQlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyLCBTQSwgTUFDX0FERFJfTEVOKTsKKwkJCQkJaWYgKEh0Q2FwYWJpbGl0eUxlbiAhPSAwKQorCQkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uYkhUQ2FwID0gVFJVRTsKKwkJCQkJZWxzZQorCQkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uYkhUQ2FwID0gRkFMU0U7CisJCQkJCXBETFMgPSAmcEFkLT5TdGFDZmcuRExTRW50cnlbaV07CisJCQkJCXBFbnRyeSA9IE1hY1RhYmxlSW5zZXJ0RGxzRW50cnkocEFkLCBTQSwgaSk7CisKKwkJCQkJc3dpdGNoIChNYXhTdXBwb3J0ZWRSYXRlSW41MDBLYnBzKQorCQkJCQl7CisJCQkJCQljYXNlIDEwODogTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfNTQ7ICAgYnJlYWs7CisJCQkJCQljYXNlIDk2OiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfNDg7ICAgYnJlYWs7CisJCQkJCQljYXNlIDcyOiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMzY7ICAgYnJlYWs7CisJCQkJCQljYXNlIDQ4OiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMjQ7ICAgYnJlYWs7CisJCQkJCQljYXNlIDM2OiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMTg7ICAgYnJlYWs7CisJCQkJCQljYXNlIDI0OiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMTI7ICAgYnJlYWs7CisJCQkJCQljYXNlIDE4OiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfOTsgICAgYnJlYWs7CisJCQkJCQljYXNlIDEyOiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfNjsgICAgYnJlYWs7CisJCQkJCQljYXNlIDIyOiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMTE7ICAgYnJlYWs7CisJCQkJCQljYXNlIDExOiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfNV81OyAgYnJlYWs7CisJCQkJCQljYXNlIDQ6ICAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMjsgICAgYnJlYWs7CisJCQkJCQljYXNlIDI6ICAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMTsgICAgYnJlYWs7CisJCQkJCQlkZWZhdWx0OiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMTE7ICAgYnJlYWs7CisJCQkJCX0KKworCQkJCQlwRW50cnktPk1heFN1cHBvcnRlZFJhdGUgPSBtaW4ocEFkLT5Db21tb25DZmcuTWF4VHhSYXRlLCBNYXhTdXBwb3J0ZWRSYXRlKTsKKworCQkJCQlpZiAocEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlIDwgUkFURV9GSVJTVF9PRkRNX1JBVEUpCisJCQkJCXsKKwkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX0NDSzsKKwkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1DUyA9IHBFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZTsKKwkJCQkJCXBFbnRyeS0+TWluSFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX0NDSzsKKwkJCQkJCXBFbnRyeS0+TWluSFRQaHlNb2RlLmZpZWxkLk1DUyA9IHBFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZTsKKwkJCQkJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX0NDSzsKKwkJCQkJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1DUyA9IHBFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZTsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX09GRE07CisJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NQ1MgPSBPZmRtUmF0ZVRvUnh3aU1DU1twRW50cnktPk1heFN1cHBvcnRlZFJhdGVdOworCQkJCQkJcEVudHJ5LT5NaW5IVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfT0ZETTsKKwkJCQkJCXBFbnRyeS0+TWluSFRQaHlNb2RlLmZpZWxkLk1DUyA9IE9mZG1SYXRlVG9SeHdpTUNTW3BFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZV07CisJCQkJCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9PRkRNOworCQkJCQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTID0gT2ZkbVJhdGVUb1J4d2lNQ1NbcEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlXTsKKwkJCQkJfQorCisJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLkJXID0gQldfMjA7CisJCQkJCXBFbnRyeS0+TWluSFRQaHlNb2RlLmZpZWxkLkJXID0gQldfMjA7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCQkJcEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzBdID0gMDsKKwkJCQkJcEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzFdID0gMDsKKworCQkJCQkvLyBJZiB0aGlzIEVudHJ5IHN1cHBvcnRzIDgwMi4xMW4sIHVwZ3JhZGUgdG8gSFQgcmF0ZS4KKwkJCQkJaWYgKChIdENhcGFiaWxpdHlMZW4gIT0gMCkgJiYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCkpCisJCQkJCXsKKwkJCQkJCVVDSEFSCWosIGJpdG1hc2s7IC8vayxiaXRtYXNrOworCQkJCQkJQ0hBUiAgICBpaTsKKworCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfT0ZGLCAoIkRMUyAtIFBlZXJEbHNSZXFBY3Rpb24oKSBSZWNlaXZlIFBlZXIgSFQgQ2FwYWJsZSBTVEEgZnJvbSAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKwkJCQkJCQkJCVNBWzBdLCBTQVsxXSwgU0FbMl0sIFNBWzNdLCBTQVs0XSwgU0FbNV0pKTsKKworCQkJCQkJaWYgKChIdENhcGFiaWxpdHkuSHRDYXBJbmZvLkdGKSAmJiAocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkdGKSkKKwkJCQkJCXsKKwkJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9IVEdSRUVORklFTEQ7CisJCQkJCQl9CisJCQkJCQllbHNlCisJCQkJCQl7CisJCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfSFRNSVg7CisJCQkJCQkJcEFkLT5NYWNUYWIuZkFueVN0YXRpb25Ob25HRiA9IFRSVUU7CisJCQkJCQkJcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLkFkZEh0SW5mbzIuTm9uR2ZQcmVzZW50ID0gMTsKKwkJCQkJCX0KKworCQkJCQkJaWYgKChIdENhcGFiaWxpdHkuSHRDYXBJbmZvLkNoYW5uZWxXaWR0aCkgJiYgKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5DaGFubmVsV2lkdGgpKQorCQkJCQkJeworCQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLkJXPSBCV180MDsKKwkJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5TaG9ydEdJID0gKChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuU2hvcnRHSWZvcjQwKSYoSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5TaG9ydEdJZm9yNDApKTsKKwkJCQkJCX0KKwkJCQkJCWVsc2UKKwkJCQkJCXsKKwkJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5CVyA9IEJXXzIwOworCQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLlNob3J0R0kgPSAoKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5TaG9ydEdJZm9yMjApJihIdENhcGFiaWxpdHkuSHRDYXBJbmZvLlNob3J0R0lmb3IyMCkpOworCQkJCQkJCXBBZC0+TWFjVGFiLmZBbnlTdGF0aW9uMjBPbmx5ID0gVFJVRTsKKwkJCQkJCX0KKworCQkJCQkJLy8gZmluZCBtYXggZml4ZWQgcmF0ZQorCQkJCQkJZm9yIChpaT0xNTsgaWk+PTA7IGlpLS0pCisJCQkJCQl7CisJCQkJCQkJaiA9IGlpLzg7CisJCQkJCQkJYml0bWFzayA9ICgxPDwoaWktKGoqOCkpKTsKKwkJCQkJCQlpZiAoIChwQWQtPlN0YUNmZy5EZXNpcmVkSHRQaHlJbmZvLk1DU1NldFtqXSZiaXRtYXNrKSAmJiAoSHRDYXBhYmlsaXR5Lk1DU1NldFtqXSZiaXRtYXNrKSkKKwkJCQkJCQl7CisJCQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1DUyA9IGlpOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQl9CisJCQkJCQkJaWYgKGlpPT0wKQorCQkJCQkJCQlicmVhazsKKwkJCQkJCX0KKworCisJCQkJCQlpZiAocEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgIT0gTUNTX0FVVE8pCisJCQkJCQl7CisKKwkJCQkJCQlwcmludGsoIkBAQCBwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gJWRcbiIsCisJCQkJCQkJCXBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTKTsKKwkJCQkJCQlpZiAocEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPT0gMzIpCisJCQkJCQkJeworCQkJCQkJCQkvLyBGaXggTUNTIGFzIEhUIER1cGxpY2F0ZWQgTW9kZQorCQkJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5CVyA9IDE7CisJCQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX0hUTUlYOworCQkJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5TVEJDID0gMDsKKwkJCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuU2hvcnRHSSA9IDA7CisJCQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1DUyA9IDMyOworCQkJCQkJCX0KKwkJCQkJCQllbHNlIGlmIChwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NQ1MgPiBwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTUNTKQorCQkJCQkJCXsKKwkJCQkJCQkJLy8gU1RBIHN1cHBvcnRzIGZpeGVkIE1DUworCQkJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NQ1MgPSBwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTUNTOworCQkJCQkJCX0KKwkJCQkJCX0KKworCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuU1RCQyA9IChIdENhcGFiaWxpdHkuSHRDYXBJbmZvLlJ4U1RCQyAmIChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuVHhTVEJDKSk7CisJCQkJCQlwRW50cnktPk1wZHVEZW5zaXR5ID0gSHRDYXBhYmlsaXR5Lkh0Q2FwUGFybS5NcGR1RGVuc2l0eTsKKwkJCQkJCXBFbnRyeS0+TWF4UkFtcGR1RmFjdG9yID0gSHRDYXBhYmlsaXR5Lkh0Q2FwUGFybS5NYXhSQW1wZHVGYWN0b3I7CisJCQkJCQlwRW50cnktPk1tcHNNb2RlID0gKFVDSEFSKUh0Q2FwYWJpbGl0eS5IdENhcEluZm8uTWltb1BzOworCQkJCQkJcEVudHJ5LT5BTXNkdVNpemUgPSAoVUNIQVIpSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5BTXNkdVNpemU7CisJCQkJCQlwRW50cnktPkhUUGh5TW9kZS53b3JkID0gcEVudHJ5LT5NYXhIVFBoeU1vZGUud29yZDsKKworCQkJCQkJaWYgKEh0Q2FwYWJpbGl0eS5IdENhcEluZm8uU2hvcnRHSWZvcjIwKQorCQkJCQkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19TR0kyMF9DQVBBQkxFKTsKKwkJCQkJCWlmIChIdENhcGFiaWxpdHkuSHRDYXBJbmZvLlNob3J0R0lmb3I0MCkKKwkJCQkJCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfU0dJNDBfQ0FQQUJMRSk7CisJCQkJCQlpZiAoSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5UeFNUQkMpCisJCQkJCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX1R4U1RCQ19DQVBBQkxFKTsKKwkJCQkJCWlmIChIdENhcGFiaWxpdHkuSHRDYXBJbmZvLlJ4U1RCQykKKwkJCQkJCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfUnhTVEJDX0NBUEFCTEUpOworCQkJCQkJaWYgKEh0Q2FwYWJpbGl0eS5FeHRIdENhcEluZm8uUGx1c0hUQykKKwkJCQkJCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfSFRDX0NBUEFCTEUpOworCQkJCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJSZGcgJiYgSHRDYXBhYmlsaXR5LkV4dEh0Q2FwSW5mby5SREdTdXBwb3J0KQorCQkJCQkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19SREdfQ0FQQUJMRSk7CisJCQkJCQlpZiAoSHRDYXBhYmlsaXR5LkV4dEh0Q2FwSW5mby5NQ1NGZWVkYmFjayA9PSAweDAzKQorCQkJCQkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19NQ1NGRUVEQkFDS19DQVBBQkxFKTsKKworCQkJCQkJTmRpc01vdmVNZW1vcnkoJnBFbnRyeS0+SFRDYXBhYmlsaXR5LCAmSHRDYXBhYmlsaXR5LCBzaXplb2YoSFRfQ0FQQUJJTElUWV9JRSkpOworCQkJCQl9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwkJCQkJcEVudHJ5LT5IVFBoeU1vZGUud29yZCA9IHBFbnRyeS0+TWF4SFRQaHlNb2RlLndvcmQ7CisJCQkJCXBFbnRyeS0+Q3VyclR4UmF0ZSA9IHBFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZTsKKwkJCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX1dNTV9DQVBBQkxFKTsKKworCQkJCQlpZiAocEFkLT5TdGFDZmcuYkF1dG9UeFJhdGVTd2l0Y2ggPT0gVFJVRSkKKwkJCQkJeworCQkJCQkJUFVDSEFSIHBUYWJsZTsKKwkJCQkJCVVDSEFSIFRhYmxlU2l6ZSA9IDA7CisKKwkJCQkJCU1sbWVTZWxlY3RUeFJhdGVUYWJsZShwQWQsIHBFbnRyeSwgJnBUYWJsZSwgJlRhYmxlU2l6ZSwgJnBFbnRyeS0+Q3VyclR4UmF0ZUluZGV4KTsKKwkJCQkJCXBFbnRyeS0+YkF1dG9UeFJhdGVTd2l0Y2ggPSBUUlVFOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTU9ERQk9IHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NT0RFOworCQkJCQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTCT0gcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1DUzsKKwkJCQkJCXBFbnRyeS0+YkF1dG9UeFJhdGVTd2l0Y2ggPSBGQUxTRTsKKworCQkJCQkJUlRNUFVwZGF0ZUxlZ2FjeVR4U2V0dGluZygoVUNIQVIpcEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5GaXhlZFR4TW9kZSwgcEVudHJ5KTsKKwkJCQkJfQorCQkJCQlwRW50cnktPlJhdGVMZW4gPSBTdXBwb3J0ZWRSYXRlc0xlbjsKKworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKwkJU3RhdHVzQ29kZSA9IE1MTUVfU1VDQ0VTUzsKKworCQkvLyBjYW4gbm90IGZpbmQgaW4gdGFibGUsIGNyZWF0ZSBhIG5ldyBvbmUKKwkJaWYgKGkgPCAwKQorCQl7CisJCQlTdGF0dXNDb2RlID0gTUxNRV9RT1NfVU5TUEVDSUZZOworCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJETFMgLSBQZWVyRGxzUmVxQWN0aW9uKCkgRExTRW50cnkgdGFibGUgZnVsbChvbmx5IGNhbiBzdXBwb3J0ICVkIERMUyBzZXNzaW9uKSBcbiIsIE1BWF9OVU1fT0ZfRExTX0VOVFJZIC0gTUFYX05VTV9PRl9JTklUX0RMU19FTlRSWSkpOworCQl9CisJCWVsc2UKKwkJeworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJETFMgLSBQZWVyRGxzUmVxQWN0aW9uKCkgdXNlIGVudHJ5KCVkKSAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKwkJCQlpLCBTQVswXSwgU0FbMV0sIFNBWzJdLCBTQVszXSwgU0FbNF0sIFNBWzVdKSk7CisJCX0KKwl9CisKKwlBY3RIZWFkZXJJbml0KHBBZCwgJkRsc1JzcEhkciwgcEFkLT5Db21tb25DZmcuQnNzaWQsIHBBZC0+Q3VycmVudEFkZHJlc3MsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKworCS8vIEJ1aWxkIGJhc2ljIGZyYW1lIGZpcnN0CisJaWYgKFN0YXR1c0NvZGUgPT0gTUxNRV9TVUNDRVNTKQorCXsKKwkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwJCQkJJkZyYW1lTGVuLAorCQkJCQkJc2l6ZW9mKEhFQURFUl84MDJfMTEpLAkJJkRsc1JzcEhkciwKKwkJCQkJCTEsCQkJCQkJCSZDYXRlZ29yeSwKKwkJCQkJCTEsCQkJCQkJCSZBY3Rpb24sCisJCQkJCQkyLAkJCQkJCQkmU3RhdHVzQ29kZSwKKwkJCQkJCTYsCQkJCQkJCVNBLAorCQkJCQkJNiwJCQkJCQkJcEFkLT5DdXJyZW50QWRkcmVzcywKKwkJCQkJCTIsCQkJCQkJCSZwQWQtPlN0YUFjdGl2ZS5DYXBhYmlsaXR5SW5mbywKKwkJCQkJCTEsCQkJCQkJCSZTdXBSYXRlSWUsCisJCQkJCQkxLAkJCQkJCQkmcEFkLT5NbG1lQXV4LlN1cFJhdGVMZW4sCisJCQkJCQlwQWQtPk1sbWVBdXguU3VwUmF0ZUxlbiwJcEFkLT5NbG1lQXV4LlN1cFJhdGUsCisJCQkJCQlFTkRfT0ZfQVJHUyk7CisKKwkJaWYgKHBBZC0+TWxtZUF1eC5FeHRSYXRlTGVuICE9IDApCisJCXsKKwkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwJJnRtcCwKKwkJCQkJCQkgIDEsCQkJCQkJJkV4dFJhdGVJZSwKKwkJCQkJCQkgIDEsCQkJCQkJJnBBZC0+TWxtZUF1eC5FeHRSYXRlTGVuLAorCQkJCQkJCSAgcEFkLT5NbG1lQXV4LkV4dFJhdGVMZW4sIAlwQWQtPk1sbWVBdXguRXh0UmF0ZSwKKwkJCQkJCQkgIEVORF9PRl9BUkdTKTsKKwkJCUZyYW1lTGVuICs9IHRtcDsKKwkJfQorCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCWlmICgocEFkLT5Db21tb25DZmcuUGh5TW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEKSkKKwkJeworCQkJVUNIQVIgSHRMZW47CisKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJCQlIVF9DQVBBQklMSVRZX0lFIEh0Q2FwYWJpbGl0eVRtcDsKKyNlbmRpZgorCisJCQkvLyBhZGQgSFQgQ2FwYWJpbGl0eSBJRQorCQkJSHRMZW4gPSBzaXplb2YoSFRfQ0FQQUJJTElUWV9JRSk7CisjaWZuZGVmIFJUX0JJR19FTkRJQU4KKwkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwJJnRtcCwKKwkJCQkJCQkJMSwJCQkJCQkmSHRDYXBJZSwKKwkJCQkJCQkJMSwJCQkJCQkmSHRMZW4sCisJCQkJCQkJCUh0TGVuLAkJCQkJJnBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eSwKKwkJCQkJCQkJRU5EX09GX0FSR1MpOworI2Vsc2UKKwkJCU5kaXNNb3ZlTWVtb3J5KCZIdENhcGFiaWxpdHlUbXAsICZwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHksIEh0TGVuKTsKKwkJCQkJCQkJKihVU0hPUlQgKikoJkh0Q2FwYWJpbGl0eVRtcC5IdENhcEluZm8pID0gU1dBUDE2KCooVVNIT1JUICopKCZIdENhcGFiaWxpdHlUbXAuSHRDYXBJbmZvKSk7CisJCQkJCQkJCSooVVNIT1JUICopKCZIdENhcGFiaWxpdHlUbXAuRXh0SHRDYXBJbmZvKSA9IFNXQVAxNigqKFVTSE9SVCAqKSgmSHRDYXBhYmlsaXR5VG1wLkV4dEh0Q2FwSW5mbykpOworCisJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sCSZ0bXAsCisJCQkJCQkJCTEsCQkJCQkJJkh0Q2FwSWUsCisJCQkJCQkJCTEsCQkJCQkJJkh0TGVuLAorCQkJCQkJCQlIdExlbiwJCQkJCSZIdENhcGFiaWxpdHlUbXAsCisJCQkJCQkJCUVORF9PRl9BUkdTKTsKKyNlbmRpZgorCQkJRnJhbWVMZW4gPSBGcmFtZUxlbiArIHRtcDsKKwkJfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJCWlmIChwRExTICYmIChwRExTLT5TdGF0dXMgIT0gRExTX0ZJTklTSCkpCisJCXsKKwkJCVJUTVBDYW5jZWxUaW1lcigmcERMUy0+VGltZXIsICZUaW1lckNhbmNlbGxlZCk7CisJCQlUaW1lb3V0ID0gRExTX1RJTUVPVVQ7CisJCQlSVE1QU2V0VGltZXIoJnBETFMtPlRpbWVyLCBUaW1lb3V0KTsKKwkJfQorCX0KKwllbHNlCisJeworCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLAkJCQkmRnJhbWVMZW4sCisJCQkJCQlzaXplb2YoSEVBREVSXzgwMl8xMSksCQkmRGxzUnNwSGRyLAorCQkJCQkJMSwJCQkJCQkJJkNhdGVnb3J5LAorCQkJCQkJMSwJCQkJCQkJJkFjdGlvbiwKKwkJCQkJCTIsCQkJCQkJCSZTdGF0dXNDb2RlLAorCQkJCQkJNiwJCQkJCQkJU0EsCisJCQkJCQk2LAkJCQkJCQlwQWQtPkN1cnJlbnRBZGRyZXNzLAorCQkJCQkJRU5EX09GX0FSR1MpOworCX0KKworCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgUUlEX0FDX0JFLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7CisJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIFBlZXJEbHNSc3BBY3Rpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCVVTSE9SVAkJQ2FwYWJpbGl0eUluZm87CisJVUNIQVIJCURBW01BQ19BRERSX0xFTl0sIFNBW01BQ19BRERSX0xFTl07CisJVVNIT1JUCQlTdGF0dXNDb2RlOworCVNIT1JUCQlpOworCUJPT0xFQU4JCVRpbWVyQ2FuY2VsbGVkOworCVVDSEFSCQlNYXhTdXBwb3J0ZWRSYXRlSW41MDBLYnBzID0gMDsKKyAgICBVQ0hBUgkJU3VwcG9ydGVkUmF0ZXNMZW47CisgICAgVUNIQVIJCVN1cHBvcnRlZFJhdGVzW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXTsKKwlVQ0hBUgkJSHRDYXBhYmlsaXR5TGVuOworCUhUX0NBUEFCSUxJVFlfSUUJSHRDYXBhYmlsaXR5OworCisJaWYgKCFwQWQtPkNvbW1vbkNmZy5iRExTQ2FwYWJsZSkKKwkJcmV0dXJuOworCisJaWYgKCFJTkZSQV9PTihwQWQpKQorCQlyZXR1cm47CisKKwlpZiAoIVBlZXJEbHNSc3BTYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbiwgREEsIFNBLCAmQ2FwYWJpbGl0eUluZm8sICZTdGF0dXNDb2RlLAorCQkJCQkJCSZTdXBwb3J0ZWRSYXRlc0xlbiwgJlN1cHBvcnRlZFJhdGVzWzBdLCAmSHRDYXBhYmlsaXR5TGVuLCAmSHRDYXBhYmlsaXR5KSkKKwkJcmV0dXJuOworCisgICAgLy8gc3VwcG9ydGVkIHJhdGVzIGFycmF5IG1heSBub3QgYmUgc29ydGVkLiBzb3J0IGl0IGFuZCBmaW5kIHRoZSBtYXhpbXVtIHJhdGUKKyAgICBmb3IgKGk9MDsgaTxTdXBwb3J0ZWRSYXRlc0xlbjsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKE1heFN1cHBvcnRlZFJhdGVJbjUwMEticHMgPCAoU3VwcG9ydGVkUmF0ZXNbaV0gJiAweDdmKSkKKyAgICAgICAgICAgIE1heFN1cHBvcnRlZFJhdGVJbjUwMEticHMgPSBTdXBwb3J0ZWRSYXRlc1tpXSAmIDB4N2Y7CisgICAgfQorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJETFMgLSBQZWVyRGxzUnNwQWN0aW9uKCkgZnJvbSAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCB3aXRoIFN0YXR1c0NvZGU9JWQsIENhcGFiaWxpdHlJbmZvPTB4JXhcbiIsCisJCVNBWzBdLCBTQVsxXSwgU0FbMl0sIFNBWzNdLCBTQVs0XSwgU0FbNV0sIFN0YXR1c0NvZGUsIENhcGFiaWxpdHlJbmZvKSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX05VTV9PRl9JTklUX0RMU19FTlRSWTsgaSsrKQorCXsKKwkJaWYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkICYmIE1BQ19BRERSX0VRVUFMKFNBLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKSkKKwkJeworCQkJaWYgKFN0YXR1c0NvZGUgPT0gTUxNRV9TVUNDRVNTKQorCQkJeworCQkJCU1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5OworCQkJCVVDSEFSIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzExOworCisJCQkJcEVudHJ5ID0gTWFjVGFibGVJbnNlcnREbHNFbnRyeShwQWQsIFNBLCBpKTsKKworCQkJCXN3aXRjaCAoTWF4U3VwcG9ydGVkUmF0ZUluNTAwS2JwcykKKwkJCQl7CisJCQkJCWNhc2UgMTA4OiBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV81NDsgICBicmVhazsKKwkJCQkJY2FzZSA5NjogIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzQ4OyAgIGJyZWFrOworCQkJCQljYXNlIDcyOiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMzY7ICAgYnJlYWs7CisJCQkJCWNhc2UgNDg6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8yNDsgICBicmVhazsKKwkJCQkJY2FzZSAzNjogIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzE4OyAgIGJyZWFrOworCQkJCQljYXNlIDI0OiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMTI7ICAgYnJlYWs7CisJCQkJCWNhc2UgMTg6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV85OyAgICBicmVhazsKKwkJCQkJY2FzZSAxMjogIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzY7ICAgIGJyZWFrOworCQkJCQljYXNlIDIyOiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMTE7ICAgYnJlYWs7CisJCQkJCWNhc2UgMTE6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV81XzU7ICBicmVhazsKKwkJCQkJY2FzZSA0OiAgIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzI7ICAgIGJyZWFrOworCQkJCQljYXNlIDI6ICAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMTsgICAgYnJlYWs7CisJCQkJCWRlZmF1bHQ6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8xMTsgICBicmVhazsKKwkJCQl9CisKKwkJCQlwRW50cnktPk1heFN1cHBvcnRlZFJhdGUgPSBtaW4ocEFkLT5Db21tb25DZmcuTWF4VHhSYXRlLCBNYXhTdXBwb3J0ZWRSYXRlKTsKKworCQkJCWlmIChwRW50cnktPk1heFN1cHBvcnRlZFJhdGUgPCBSQVRFX0ZJUlNUX09GRE1fUkFURSkKKwkJCQl7CisJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX0NDSzsKKwkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTUNTID0gcEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlOworCQkJCQlwRW50cnktPk1pbkhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9DQ0s7CisJCQkJCXBFbnRyeS0+TWluSFRQaHlNb2RlLmZpZWxkLk1DUyA9IHBFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZTsKKwkJCQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfQ0NLOworCQkJCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NQ1MgPSBwRW50cnktPk1heFN1cHBvcnRlZFJhdGU7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX09GRE07CisJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1DUyA9IE9mZG1SYXRlVG9SeHdpTUNTW3BFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZV07CisJCQkJCXBFbnRyeS0+TWluSFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX09GRE07CisJCQkJCXBFbnRyeS0+TWluSFRQaHlNb2RlLmZpZWxkLk1DUyA9IE9mZG1SYXRlVG9SeHdpTUNTW3BFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZV07CisJCQkJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX09GRE07CisJCQkJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1DUyA9IE9mZG1SYXRlVG9SeHdpTUNTW3BFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZV07CisJCQkJfQorCisJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuQlcgPSBCV18yMDsKKwkJCQlwRW50cnktPk1pbkhUUGh5TW9kZS5maWVsZC5CVyA9IEJXXzIwOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQkJcEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzBdID0gMDsKKwkJCQlwRW50cnktPkhUQ2FwYWJpbGl0eS5NQ1NTZXRbMV0gPSAwOworCisJCQkJLy8gSWYgdGhpcyBFbnRyeSBzdXBwb3J0cyA4MDIuMTFuLCB1cGdyYWRlIHRvIEhUIHJhdGUuCisJCQkJaWYgKChIdENhcGFiaWxpdHlMZW4gIT0gMCkgJiYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCkpCisJCQkJeworCQkJCQlVQ0hBUglqLCBiaXRtYXNrOyAvL2ssYml0bWFzazsKKwkJCQkJQ0hBUiAgICBpaTsKKworCQkJCQlEQkdQUklOVChSVF9ERUJVR19PRkYsICgiRExTIC0gUGVlckRsc1JzcEFjdGlvbiBSZWNlaXZlIFBlZXIgSFQgQ2FwYWJsZSBTVEEgZnJvbSAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKwkJCQkJCQkJU0FbMF0sIFNBWzFdLCBTQVsyXSwgU0FbM10sIFNBWzRdLCBTQVs1XSkpOworCisJCQkJCWlmICgoSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5HRikgJiYgKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5HRikpCisJCQkJCXsKKwkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX0hUR1JFRU5GSUVMRDsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX0hUTUlYOworCQkJCQkJcEFkLT5NYWNUYWIuZkFueVN0YXRpb25Ob25HRiA9IFRSVUU7CisJCQkJCQlwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8uQWRkSHRJbmZvMi5Ob25HZlByZXNlbnQgPSAxOworCQkJCQl9CisKKwkJCQkJaWYgKChIdENhcGFiaWxpdHkuSHRDYXBJbmZvLkNoYW5uZWxXaWR0aCkgJiYgKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5DaGFubmVsV2lkdGgpKQorCQkJCQl7CisJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5CVz0gQldfNDA7CisJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5TaG9ydEdJID0gKChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuU2hvcnRHSWZvcjQwKSYoSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5TaG9ydEdJZm9yNDApKTsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLkJXID0gQldfMjA7CisJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5TaG9ydEdJID0gKChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuU2hvcnRHSWZvcjIwKSYoSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5TaG9ydEdJZm9yMjApKTsKKwkJCQkJCXBBZC0+TWFjVGFiLmZBbnlTdGF0aW9uMjBPbmx5ID0gVFJVRTsKKwkJCQkJfQorCisJCQkJCS8vIGZpbmQgbWF4IGZpeGVkIHJhdGUKKwkJCQkJZm9yIChpaT0xNTsgaWk+PTA7IGlpLS0pCisJCQkJCXsKKwkJCQkJCWogPSBpaS84OworCQkJCQkJYml0bWFzayA9ICgxPDwoaWktKGoqOCkpKTsKKwkJCQkJCWlmICggKHBBZC0+U3RhQ2ZnLkRlc2lyZWRIdFBoeUluZm8uTUNTU2V0W2pdJmJpdG1hc2spICYmIChIdENhcGFiaWxpdHkuTUNTU2V0W2pdJmJpdG1hc2spKQorCQkJCQkJeworCQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1DUyA9IGlpOworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQkJaWYgKGlpPT0wKQorCQkJCQkJCWJyZWFrOworCQkJCQl9CisKKwkJCQkJaWYgKHBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTICE9IE1DU19BVVRPKQorCQkJCQl7CisJCQkJCQlpZiAocEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPT0gMzIpCisJCQkJCQl7CisJCQkJCQkJLy8gRml4IE1DUyBhcyBIVCBEdXBsaWNhdGVkIE1vZGUKKwkJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5CVyA9IDE7CisJCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfSFRNSVg7CisJCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuU1RCQyA9IDA7CisJCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuU2hvcnRHSSA9IDA7CisJCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTUNTID0gMzI7CisJCQkJCQl9CisJCQkJCQllbHNlIGlmIChwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NQ1MgPiBwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTUNTKQorCQkJCQkJeworCQkJCQkJCS8vIFNUQSBzdXBwb3J0cyBmaXhlZCBNQ1MKKwkJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NQ1MgPSBwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTUNTOworCQkJCQkJfQorCQkJCQl9CisKKwkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuU1RCQyA9IChIdENhcGFiaWxpdHkuSHRDYXBJbmZvLlJ4U1RCQyAmIChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuVHhTVEJDKSk7CisJCQkJCXBFbnRyeS0+TXBkdURlbnNpdHkgPSBIdENhcGFiaWxpdHkuSHRDYXBQYXJtLk1wZHVEZW5zaXR5OworCQkJCQlwRW50cnktPk1heFJBbXBkdUZhY3RvciA9IEh0Q2FwYWJpbGl0eS5IdENhcFBhcm0uTWF4UkFtcGR1RmFjdG9yOworCQkJCQlwRW50cnktPk1tcHNNb2RlID0gKFVDSEFSKUh0Q2FwYWJpbGl0eS5IdENhcEluZm8uTWltb1BzOworCQkJCQlwRW50cnktPkFNc2R1U2l6ZSA9IChVQ0hBUilIdENhcGFiaWxpdHkuSHRDYXBJbmZvLkFNc2R1U2l6ZTsKKwkJCQkJcEVudHJ5LT5IVFBoeU1vZGUud29yZCA9IHBFbnRyeS0+TWF4SFRQaHlNb2RlLndvcmQ7CisKKwkJCQkJaWYgKEh0Q2FwYWJpbGl0eS5IdENhcEluZm8uU2hvcnRHSWZvcjIwKQorCQkJCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX1NHSTIwX0NBUEFCTEUpOworCQkJCQlpZiAoSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5TaG9ydEdJZm9yNDApCisJCQkJCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfU0dJNDBfQ0FQQUJMRSk7CisJCQkJCWlmIChIdENhcGFiaWxpdHkuSHRDYXBJbmZvLlR4U1RCQykKKwkJCQkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19UeFNUQkNfQ0FQQUJMRSk7CisJCQkJCWlmIChIdENhcGFiaWxpdHkuSHRDYXBJbmZvLlJ4U1RCQykKKwkJCQkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19SeFNUQkNfQ0FQQUJMRSk7CisJCQkJCWlmIChIdENhcGFiaWxpdHkuRXh0SHRDYXBJbmZvLlBsdXNIVEMpCisJCQkJCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfSFRDX0NBUEFCTEUpOworCQkJCQlpZiAocEFkLT5Db21tb25DZmcuYlJkZyAmJiBIdENhcGFiaWxpdHkuRXh0SHRDYXBJbmZvLlJER1N1cHBvcnQpCisJCQkJCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfUkRHX0NBUEFCTEUpOworCQkJCQlpZiAoSHRDYXBhYmlsaXR5LkV4dEh0Q2FwSW5mby5NQ1NGZWVkYmFjayA9PSAweDAzKQorCQkJCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX01DU0ZFRURCQUNLX0NBUEFCTEUpOworCisJCQkJCU5kaXNNb3ZlTWVtb3J5KCZwRW50cnktPkhUQ2FwYWJpbGl0eSwgJkh0Q2FwYWJpbGl0eSwgc2l6ZW9mKEhUX0NBUEFCSUxJVFlfSUUpKTsKKwkJCQl9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCQkJcEVudHJ5LT5IVFBoeU1vZGUud29yZCA9IHBFbnRyeS0+TWF4SFRQaHlNb2RlLndvcmQ7CisJCQkJcEVudHJ5LT5DdXJyVHhSYXRlID0gcEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlOworCQkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19XTU1fQ0FQQUJMRSk7CisKKwkJCQlpZiAocEFkLT5TdGFDZmcuYkF1dG9UeFJhdGVTd2l0Y2ggPT0gVFJVRSkKKwkJCQl7CisJCQkJCVBVQ0hBUiBwVGFibGU7CisJCQkJCVVDSEFSIFRhYmxlU2l6ZSA9IDA7CisKKwkJCQkJTWxtZVNlbGVjdFR4UmF0ZVRhYmxlKHBBZCwgcEVudHJ5LCAmcFRhYmxlLCAmVGFibGVTaXplLCAmcEVudHJ5LT5DdXJyVHhSYXRlSW5kZXgpOworCQkJCQlwRW50cnktPmJBdXRvVHhSYXRlU3dpdGNoID0gVFJVRTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTU9ERQk9IHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NT0RFOworCQkJCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NQ1MJPSBwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTUNTOworCQkJCQlwRW50cnktPmJBdXRvVHhSYXRlU3dpdGNoID0gRkFMU0U7CisKKwkJCQkJUlRNUFVwZGF0ZUxlZ2FjeVR4U2V0dGluZygoVUNIQVIpcEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5GaXhlZFR4TW9kZSwgcEVudHJ5KTsKKwkJCQl9CisJCQkJcEVudHJ5LT5SYXRlTGVuID0gU3VwcG9ydGVkUmF0ZXNMZW47CisKKwkJCQlpZiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKQorCQkJCXsKKwkJCQkJLy8gSWYgc3VwcG9ydCBXUEEgb3IgV1BBMiwgc3RhcnQgU1RBS2V5IGhhbmQgc2hha2UsCisJCQkJCS8vIElmIGZhaWxlZCBoYW5kIHNoYWtlLCBqdXN0IHRlYXIgZG93biBwZWVyIERMUworCQkJCQlpZiAoUlRNUFNlbmRTVEFLZXlSZXF1ZXN0KHBBZCwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcikgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJCQkJeworCQkJCQkJTUxNRV9ETFNfUkVRX1NUUlVDVAlNbG1lRGxzUmVxOworCQkJCQkJVVNIT1JUCQkJCXJlYXNvbiA9IFJFQVNPTl9RT1NfQ0lQSEVSX05PVF9TVVBQT1JUOworCisJCQkJCQlEbHNQYXJtRmlsbChwQWQsICZNbG1lRGxzUmVxLCAmcEFkLT5TdGFDZmcuRExTRW50cnlbaV0sIHJlYXNvbik7CisJCQkJCQlNbG1lRW5xdWV1ZShwQWQsIERMU19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9ETFNfVEVBUl9ET1dOLCBzaXplb2YoTUxNRV9ETFNfUkVRX1NUUlVDVCksICZNbG1lRGxzUmVxKTsKKwkJCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9IERMU19OT05FOworCQkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQJPSBGQUxTRTsKKwkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiRExTIC0gUGVlckRsc1JzcEFjdGlvbiBmYWlsZWQgd2hlbiBjYWxsIFJUTVBTZW5kU1RBS2V5UmVxdWVzdCBcbiIpKTsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9IERMU19XQUlUX0tFWTsKKwkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiRExTIC0gd2FpdGluZyBmb3IgU1RBS2V5IGhhbmRzaGFrZSBwcm9jZWR1cmVcbiIpKTsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlRpbWVyLCAmVGltZXJDYW5jZWxsZWQpOworCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPSBETFNfRklOSVNIOworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkRMUyAtIFBlZXJEbHNSc3BBY3Rpb24oKSBmcm9tICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IFN1Y2NlZWQgd2l0aCBXRVAgb3Igbm8gc2VjdXJpdHlcbiIsIFNBWzBdLCBTQVsxXSwgU0FbMl0sIFNBWzNdLCBTQVs0XSwgU0FbNV0pKTsKKwkJCQl9CisKKwkJCQkvL2luaXRpYWxpemUgc2VxIG5vIGZvciBETFMgZnJhbWVzLgorCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlNlcXVlbmNlID0gMDsKKwkJCQlpZiAoSHRDYXBhYmlsaXR5TGVuICE9IDApCisJCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLmJIVENhcCA9IFRSVUU7CisJCQkJZWxzZQorCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5iSFRDYXAgPSBGQUxTRTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQkvLyBETFMgc2V0dXAgcHJvY2VkdXJlIGZhaWxlZC4KKwkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPSBETFNfTk9ORTsKKwkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZAk9IEZBTFNFOworCQkJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVGltZXIsICZUaW1lckNhbmNlbGxlZCk7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJETFMgLSBQZWVyRGxzUnNwQWN0aW9uIGZhaWxlZCB3aXRoIFN0YXR1c0NvZGU9JWQgXG4iLCBTdGF0dXNDb2RlKSk7CisJCQl9CisJCX0KKwl9CisKKwlpZiAoaSA+PSBNQVhfTlVNX09GX0lOSVRfRExTX0VOVFJZKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJETFMgLSBQZWVyRGxzUnNwQWN0aW9uKCkgdXBkYXRlIHRpbWVvdXQgdmFsdWUgXG4iKSk7CisJCWZvciAoaT0oTUFYX05VTV9PRl9ETFNfRU5UUlktMSk7IGk+PU1BWF9OVU1fT0ZfSU5JVF9ETFNfRU5UUlk7IGktLSkKKwkJeworCQkJaWYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkICYmIE1BQ19BRERSX0VRVUFMKFNBLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKSkKKwkJCXsKKwkJCQlpZiAoU3RhdHVzQ29kZSA9PSBNTE1FX1NVQ0NFU1MpCisJCQkJeworCQkJCQlNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeTsKKwkJCQkJVUNIQVIgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMTE7CisKKwkJCQkJcEVudHJ5ID0gTWFjVGFibGVJbnNlcnREbHNFbnRyeShwQWQsIFNBLCBpKTsKKworCQkJCQlzd2l0Y2ggKE1heFN1cHBvcnRlZFJhdGVJbjUwMEticHMpCisJCQkJCXsKKwkJCQkJCWNhc2UgMTA4OiBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV81NDsgICBicmVhazsKKwkJCQkJCWNhc2UgOTY6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV80ODsgICBicmVhazsKKwkJCQkJCWNhc2UgNzI6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8zNjsgICBicmVhazsKKwkJCQkJCWNhc2UgNDg6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8yNDsgICBicmVhazsKKwkJCQkJCWNhc2UgMzY6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8xODsgICBicmVhazsKKwkJCQkJCWNhc2UgMjQ6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8xMjsgICBicmVhazsKKwkJCQkJCWNhc2UgMTg6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV85OyAgICBicmVhazsKKwkJCQkJCWNhc2UgMTI6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV82OyAgICBicmVhazsKKwkJCQkJCWNhc2UgMjI6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8xMTsgICBicmVhazsKKwkJCQkJCWNhc2UgMTE6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV81XzU7ICBicmVhazsKKwkJCQkJCWNhc2UgNDogICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8yOyAgICBicmVhazsKKwkJCQkJCWNhc2UgMjogICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8xOyAgICBicmVhazsKKwkJCQkJCWRlZmF1bHQ6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8xMTsgICBicmVhazsKKwkJCQkJfQorCisJCQkJCXBFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZSA9IG1pbihwQWQtPkNvbW1vbkNmZy5NYXhUeFJhdGUsIE1heFN1cHBvcnRlZFJhdGUpOworCisJCQkJCWlmIChwRW50cnktPk1heFN1cHBvcnRlZFJhdGUgPCBSQVRFX0ZJUlNUX09GRE1fUkFURSkKKwkJCQkJeworCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfQ0NLOworCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTUNTID0gcEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlOworCQkJCQkJcEVudHJ5LT5NaW5IVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfQ0NLOworCQkJCQkJcEVudHJ5LT5NaW5IVFBoeU1vZGUuZmllbGQuTUNTID0gcEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlOworCQkJCQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfQ0NLOworCQkJCQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTID0gcEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfT0ZETTsKKwkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1DUyA9IE9mZG1SYXRlVG9SeHdpTUNTW3BFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZV07CisJCQkJCQlwRW50cnktPk1pbkhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9PRkRNOworCQkJCQkJcEVudHJ5LT5NaW5IVFBoeU1vZGUuZmllbGQuTUNTID0gT2ZkbVJhdGVUb1J4d2lNQ1NbcEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlXTsKKwkJCQkJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX09GRE07CisJCQkJCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NQ1MgPSBPZmRtUmF0ZVRvUnh3aU1DU1twRW50cnktPk1heFN1cHBvcnRlZFJhdGVdOworCQkJCQl9CisKKwkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuQlcgPSBCV18yMDsKKwkJCQkJcEVudHJ5LT5NaW5IVFBoeU1vZGUuZmllbGQuQlcgPSBCV18yMDsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJCQlwRW50cnktPkhUQ2FwYWJpbGl0eS5NQ1NTZXRbMF0gPSAwOworCQkJCQlwRW50cnktPkhUQ2FwYWJpbGl0eS5NQ1NTZXRbMV0gPSAwOworCisJCQkJCS8vIElmIHRoaXMgRW50cnkgc3VwcG9ydHMgODAyLjExbiwgdXBncmFkZSB0byBIVCByYXRlLgorCQkJCQlpZiAoKEh0Q2FwYWJpbGl0eUxlbiAhPSAwKSAmJiAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEKSkKKwkJCQkJeworCQkJCQkJVUNIQVIJaiwgYml0bWFzazsgLy9rLGJpdG1hc2s7CisJCQkJCQlDSEFSICAgIGlpOworCisJCQkJCQlEQkdQUklOVChSVF9ERUJVR19PRkYsICgiRExTIC0gUGVlckRsc1JzcEFjdGlvbiBSZWNlaXZlIFBlZXIgSFQgQ2FwYWJsZSBTVEEgZnJvbSAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKwkJCQkJCQkJCVNBWzBdLCBTQVsxXSwgU0FbMl0sIFNBWzNdLCBTQVs0XSwgU0FbNV0pKTsKKworCQkJCQkJaWYgKChIdENhcGFiaWxpdHkuSHRDYXBJbmZvLkdGKSAmJiAocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkdGKSkKKwkJCQkJCXsKKwkJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9IVEdSRUVORklFTEQ7CisJCQkJCQl9CisJCQkJCQllbHNlCisJCQkJCQl7CisJCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfSFRNSVg7CisJCQkJCQkJcEFkLT5NYWNUYWIuZkFueVN0YXRpb25Ob25HRiA9IFRSVUU7CisJCQkJCQkJcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLkFkZEh0SW5mbzIuTm9uR2ZQcmVzZW50ID0gMTsKKwkJCQkJCX0KKworCQkJCQkJaWYgKChIdENhcGFiaWxpdHkuSHRDYXBJbmZvLkNoYW5uZWxXaWR0aCkgJiYgKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5DaGFubmVsV2lkdGgpKQorCQkJCQkJeworCQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLkJXPSBCV180MDsKKwkJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5TaG9ydEdJID0gKChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuU2hvcnRHSWZvcjQwKSYoSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5TaG9ydEdJZm9yNDApKTsKKwkJCQkJCX0KKwkJCQkJCWVsc2UKKwkJCQkJCXsKKwkJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5CVyA9IEJXXzIwOworCQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLlNob3J0R0kgPSAoKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5TaG9ydEdJZm9yMjApJihIdENhcGFiaWxpdHkuSHRDYXBJbmZvLlNob3J0R0lmb3IyMCkpOworCQkJCQkJCXBBZC0+TWFjVGFiLmZBbnlTdGF0aW9uMjBPbmx5ID0gVFJVRTsKKwkJCQkJCX0KKworCQkJCQkJLy8gZmluZCBtYXggZml4ZWQgcmF0ZQorCQkJCQkJZm9yIChpaT0xNTsgaWk+PTA7IGlpLS0pCisJCQkJCQl7CisJCQkJCQkJaiA9IGlpLzg7CisJCQkJCQkJYml0bWFzayA9ICgxPDwoaWktKGoqOCkpKTsKKwkJCQkJCQlpZiAoIChwQWQtPlN0YUNmZy5EZXNpcmVkSHRQaHlJbmZvLk1DU1NldFtqXSZiaXRtYXNrKSAmJiAoSHRDYXBhYmlsaXR5Lk1DU1NldFtqXSZiaXRtYXNrKSkKKwkJCQkJCQl7CisJCQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1DUyA9IGlpOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQl9CisJCQkJCQkJaWYgKGlpPT0wKQorCQkJCQkJCQlicmVhazsKKwkJCQkJCX0KKworCQkJCQkJaWYgKHBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTICE9IE1DU19BVVRPKQorCQkJCQkJeworCQkJCQkJCXByaW50aygiQEBAIHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSAlZFxuIiwKKwkJCQkJCQkJcEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MpOworCQkJCQkJCWlmIChwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9PSAzMikKKwkJCQkJCQl7CisJCQkJCQkJCS8vIEZpeCBNQ1MgYXMgSFQgRHVwbGljYXRlZCBNb2RlCisJCQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLkJXID0gMTsKKwkJCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfSFRNSVg7CisJCQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLlNUQkMgPSAwOworCQkJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5TaG9ydEdJID0gMDsKKwkJCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTUNTID0gMzI7CisJCQkJCQkJfQorCQkJCQkJCWVsc2UgaWYgKHBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1DUyA+IHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NQ1MpCisJCQkJCQkJeworCQkJCQkJCQkvLyBTVEEgc3VwcG9ydHMgZml4ZWQgTUNTCisJCQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1DUyA9IHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NQ1M7CisJCQkJCQkJfQorCQkJCQkJfQorCisJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5TVEJDID0gKEh0Q2FwYWJpbGl0eS5IdENhcEluZm8uUnhTVEJDICYgKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5UeFNUQkMpKTsKKwkJCQkJCXBFbnRyeS0+TXBkdURlbnNpdHkgPSBIdENhcGFiaWxpdHkuSHRDYXBQYXJtLk1wZHVEZW5zaXR5OworCQkJCQkJcEVudHJ5LT5NYXhSQW1wZHVGYWN0b3IgPSBIdENhcGFiaWxpdHkuSHRDYXBQYXJtLk1heFJBbXBkdUZhY3RvcjsKKwkJCQkJCXBFbnRyeS0+TW1wc01vZGUgPSAoVUNIQVIpSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5NaW1vUHM7CisJCQkJCQlwRW50cnktPkFNc2R1U2l6ZSA9IChVQ0hBUilIdENhcGFiaWxpdHkuSHRDYXBJbmZvLkFNc2R1U2l6ZTsKKwkJCQkJCXBFbnRyeS0+SFRQaHlNb2RlLndvcmQgPSBwRW50cnktPk1heEhUUGh5TW9kZS53b3JkOworCisJCQkJCQlpZiAoSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5TaG9ydEdJZm9yMjApCisJCQkJCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX1NHSTIwX0NBUEFCTEUpOworCQkJCQkJaWYgKEh0Q2FwYWJpbGl0eS5IdENhcEluZm8uU2hvcnRHSWZvcjQwKQorCQkJCQkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19TR0k0MF9DQVBBQkxFKTsKKwkJCQkJCWlmIChIdENhcGFiaWxpdHkuSHRDYXBJbmZvLlR4U1RCQykKKwkJCQkJCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfVHhTVEJDX0NBUEFCTEUpOworCQkJCQkJaWYgKEh0Q2FwYWJpbGl0eS5IdENhcEluZm8uUnhTVEJDKQorCQkJCQkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19SeFNUQkNfQ0FQQUJMRSk7CisJCQkJCQlpZiAoSHRDYXBhYmlsaXR5LkV4dEh0Q2FwSW5mby5QbHVzSFRDKQorCQkJCQkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19IVENfQ0FQQUJMRSk7CisJCQkJCQlpZiAocEFkLT5Db21tb25DZmcuYlJkZyAmJiBIdENhcGFiaWxpdHkuRXh0SHRDYXBJbmZvLlJER1N1cHBvcnQpCisJCQkJCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX1JER19DQVBBQkxFKTsKKwkJCQkJCWlmIChIdENhcGFiaWxpdHkuRXh0SHRDYXBJbmZvLk1DU0ZlZWRiYWNrID09IDB4MDMpCisJCQkJCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX01DU0ZFRURCQUNLX0NBUEFCTEUpOworCisJCQkJCQlOZGlzTW92ZU1lbW9yeSgmcEVudHJ5LT5IVENhcGFiaWxpdHksICZIdENhcGFiaWxpdHksIHNpemVvZihIVF9DQVBBQklMSVRZX0lFKSk7CisJCQkJCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCQkJCQlwRW50cnktPkhUUGh5TW9kZS53b3JkID0gcEVudHJ5LT5NYXhIVFBoeU1vZGUud29yZDsKKwkJCQkJcEVudHJ5LT5DdXJyVHhSYXRlID0gcEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlOworCQkJCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfV01NX0NBUEFCTEUpOworCisJCQkJCWlmIChwQWQtPlN0YUNmZy5iQXV0b1R4UmF0ZVN3aXRjaCA9PSBUUlVFKQorCQkJCQl7CisJCQkJCQlQVUNIQVIgcFRhYmxlOworCQkJCQkJVUNIQVIgVGFibGVTaXplID0gMDsKKworCQkJCQkJTWxtZVNlbGVjdFR4UmF0ZVRhYmxlKHBBZCwgcEVudHJ5LCAmcFRhYmxlLCAmVGFibGVTaXplLCAmcEVudHJ5LT5DdXJyVHhSYXRlSW5kZXgpOworCQkJCQkJcEVudHJ5LT5iQXV0b1R4UmF0ZVN3aXRjaCA9IFRSVUU7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NT0RFCT0gcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1PREU7CisJCQkJCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NQ1MJPSBwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTUNTOworCQkJCQkJcEVudHJ5LT5iQXV0b1R4UmF0ZVN3aXRjaCA9IEZBTFNFOworCisJCQkJCQlSVE1QVXBkYXRlTGVnYWN5VHhTZXR0aW5nKChVQ0hBUilwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkZpeGVkVHhNb2RlLCBwRW50cnkpOworCQkJCQl9CisJCQkJCXBFbnRyeS0+UmF0ZUxlbiA9IFN1cHBvcnRlZFJhdGVzTGVuOworCisJCQkJCWlmIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpCisJCQkJCXsKKwkJCQkJCS8vIElmIHN1cHBvcnQgV1BBIG9yIFdQQTIsIHN0YXJ0IFNUQUtleSBoYW5kIHNoYWtlLAorCQkJCQkJLy8gSWYgZmFpbGVkIGhhbmQgc2hha2UsIGp1c3QgdGVhciBkb3duIHBlZXIgRExTCisJCQkJCQlpZiAoUlRNUFNlbmRTVEFLZXlSZXF1ZXN0KHBBZCwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcikgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJCQkJCXsKKwkJCQkJCQlNTE1FX0RMU19SRVFfU1RSVUNUCU1sbWVEbHNSZXE7CisJCQkJCQkJVVNIT1JUCQkJCXJlYXNvbiA9IFJFQVNPTl9RT1NfQ0lQSEVSX05PVF9TVVBQT1JUOworCisJCQkJCQkJRGxzUGFybUZpbGwocEFkLCAmTWxtZURsc1JlcSwgJnBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLCByZWFzb24pOworCQkJCQkJCU1sbWVFbnF1ZXVlKHBBZCwgRExTX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX0RMU19URUFSX0RPV04sIHNpemVvZihNTE1FX0RMU19SRVFfU1RSVUNUKSwgJk1sbWVEbHNSZXEpOworCQkJCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9IERMU19OT05FOworCQkJCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkCT0gRkFMU0U7CisJCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJETFMgLSBQZWVyRGxzUnNwQWN0aW9uIGZhaWxlZCB3aGVuIGNhbGwgUlRNUFNlbmRTVEFLZXlSZXF1ZXN0IFxuIikpOworCQkJCQkJfQorCQkJCQkJZWxzZQorCQkJCQkJeworCQkJCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9IERMU19XQUlUX0tFWTsKKwkJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkRMUyAtIHdhaXRpbmcgZm9yIFNUQUtleSBoYW5kc2hha2UgcHJvY2VkdXJlXG4iKSk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlRpbWVyLCAmVGltZXJDYW5jZWxsZWQpOworCQkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID0gRExTX0ZJTklTSDsKKwkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiRExTIC0gUGVlckRsc1JzcEFjdGlvbigpIGZyb20gJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnggU3VjY2VlZCB3aXRoIFdFUCBvciBubyBzZWN1cml0eVxuIiwgU0FbMF0sIFNBWzFdLCBTQVsyXSwgU0FbM10sIFNBWzRdLCBTQVs1XSkpOworCQkJCQl9CisJCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlNlcXVlbmNlID0gMDsKKwkJCQkJaWYgKEh0Q2FwYWJpbGl0eUxlbiAhPSAwKQorCQkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uYkhUQ2FwID0gVFJVRTsKKwkJCQkJZWxzZQorCQkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uYkhUQ2FwID0gRkFMU0U7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCS8vIERMUyBzZXR1cCBwcm9jZWR1cmUgZmFpbGVkLgorCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPSBETFNfTk9ORTsKKwkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQJPSBGQUxTRTsKKwkJCQkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5UaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJETFMgLSBQZWVyRGxzUnNwQWN0aW9uIGZhaWxlZCB3aXRoIFN0YXR1c0NvZGU9JWQgXG4iLCBTdGF0dXNDb2RlKSk7CisJCQkJfQorCQkJfQorCQl9CisJfQorfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgTWxtZURsc1RlYXJEb3duQWN0aW9uKAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlQVUNIQVIJCQlwT3V0QnVmZmVyID0gTlVMTDsKKwlORElTX1NUQVRVUwkJTlN0YXR1czsKKwlVTE9ORwkJCUZyYW1lTGVuID0gMDsKKwlVQ0hBUgkJCUNhdGVnb3J5ID0gQ0FURUdPUllfRExTOworCVVDSEFSCQkJQWN0aW9uID0gQUNUSU9OX0RMU19URUFSRE9XTjsKKwlVU0hPUlQJCQlSZWFzb25Db2RlID0gUkVBU09OX1FPU19VTlNQRUNJRlk7CisJSEVBREVSXzgwMl8xMQlEbHNUZWFyRG93bkhkcjsKKwlQUlRfODAyXzExX0RMUwlwRExTOworCUJPT0xFQU4JCQlUaW1lckNhbmNlbGxlZDsKKwlVQ0hBUgkJCWk7CisKKwlpZighTWxtZURsc1JlcVNhbml0eShwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuLCAmcERMUywgJlJlYXNvbkNvZGUpKQorCQlyZXR1cm47CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkRMUyAtIE1sbWVEbHNUZWFyRG93bkFjdGlvbigpIHdpdGggUmVhc29uQ29kZT0lZCBcbiIsIFJlYXNvbkNvZGUpKTsKKworCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5CisJaWYgKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiRExTIC0gTWxtZURsc1RlYXJEb3duQWN0aW9uKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxlZCBcbiIpKTsKKwkJcmV0dXJuOworCX0KKworCUFjdEhlYWRlckluaXQocEFkLCAmRGxzVGVhckRvd25IZHIsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisKKwkvLyBCdWlsZCBiYXNpYyBmcmFtZSBmaXJzdAorCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsCQkJCSZGcmFtZUxlbiwKKwkJCQkJc2l6ZW9mKEhFQURFUl84MDJfMTEpLAkJJkRsc1RlYXJEb3duSGRyLAorCQkJCQkxLAkJCQkJCQkmQ2F0ZWdvcnksCisJCQkJCTEsCQkJCQkJCSZBY3Rpb24sCisJCQkJCTYsCQkJCQkJCSZwRExTLT5NYWNBZGRyLAorCQkJCQk2LAkJCQkJCQlwQWQtPkN1cnJlbnRBZGRyZXNzLAorCQkJCQkyLAkJCQkJCQkmUmVhc29uQ29kZSwKKwkJCQkJRU5EX09GX0FSR1MpOworCisJTWluaXBvcnRNTVJlcXVlc3QocEFkLCBRSURfQUNfQkUsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKKwlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOworCVJUTVBDYW5jZWxUaW1lcigmcERMUy0+VGltZXIsICZUaW1lckNhbmNlbGxlZCk7CisKKwkvLyBSZW1vdmUga2V5IGluIGxvY2FsIGRscyB0YWJsZSBlbnRyeQorCWZvciAoaSA9IDA7IGkgPCBNQVhfTlVNX09GX0lOSVRfRExTX0VOVFJZOyBpKyspCisJeworCQlpZiAoTUFDX0FERFJfRVFVQUwocERMUy0+TWFjQWRkciwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcikpCisJCXsKKwkJCU1hY1RhYmxlRGVsZXRlRGxzRW50cnkocEFkLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNUYWJNYXRjaFdDSUQsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpOworCQl9CisJfQorCisJLy8gY2xlYXIgcGVlciBkbHMgdGFibGUgZW50cnkKKwlmb3IgKGkgPSBNQVhfTlVNX09GX0lOSVRfRExTX0VOVFJZOyBpIDwgTUFYX05VTV9PRl9ETFNfRU5UUlk7IGkrKykKKwl7CisJCWlmIChNQUNfQUREUl9FUVVBTChwRExTLT5NYWNBZGRyLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKSkKKwkJeworCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzCT0gRExTX05PTkU7CisJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZAk9IEZBTFNFOworCQkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5UaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKKwkJCU1hY1RhYmxlRGVsZXRlRGxzRW50cnkocEFkLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNUYWJNYXRjaFdDSUQsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpOworCQl9CisJfQorfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgUGVlckRsc1RlYXJEb3duQWN0aW9uKAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlVQ0hBUgkJCURBW01BQ19BRERSX0xFTl0sIFNBW01BQ19BRERSX0xFTl07CisJVVNIT1JUCQkJUmVhc29uQ29kZTsKKwlVSU5UCQkJaTsKKwlCT09MRUFOCQkJVGltZXJDYW5jZWxsZWQ7CisKKwlpZiAoIXBBZC0+Q29tbW9uQ2ZnLmJETFNDYXBhYmxlKQorCQlyZXR1cm47CisKKwlpZiAoIUlORlJBX09OKHBBZCkpCisJCXJldHVybjsKKworCWlmICghUGVlckRsc1RlYXJEb3duU2FuaXR5KHBBZCwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4sIERBLCBTQSwgJlJlYXNvbkNvZGUpKQorCQlyZXR1cm47CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkRMUyAtIFBlZXJEbHNUZWFyRG93bkFjdGlvbigpIGZyb20gJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnggd2l0aCBSZWFzb25Db2RlPSVkXG4iLCBTQVswXSwgU0FbMV0sIFNBWzJdLCBTQVszXSwgU0FbNF0sIFNBWzVdLCBSZWFzb25Db2RlKSk7CisKKwkvLyBjbGVhciBsb2NhbCBkbHMgdGFibGUgZW50cnkKKwlmb3IgKGk9MDsgaTxNQVhfTlVNX09GX0lOSVRfRExTX0VOVFJZOyBpKyspCisJeworCQlpZiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQgJiYgTUFDX0FERFJfRVFVQUwoU0EsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpKQorCQl7CisJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMJPSBETFNfTk9ORTsKKwkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkCT0gRkFMU0U7CisJCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlRpbWVyLCAmVGltZXJDYW5jZWxsZWQpOworCQkJLy9Bc2ljRGVsV2NpZFRhYihwQWQsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY1RhYk1hdGNoV0NJRCk7CisJCQkvL0FzaWNSZW1vdmVQYWlyd2lzZUtleUVudHJ5KHBBZCwgQlNTMCwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjVGFiTWF0Y2hXQ0lEKTsKKwkJCU1hY1RhYmxlRGVsZXRlRGxzRW50cnkocEFkLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNUYWJNYXRjaFdDSUQsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpOworCQl9CisJfQorCisJLy8gY2xlYXIgcGVlciBkbHMgdGFibGUgZW50cnkKKwlmb3IgKGk9TUFYX05VTV9PRl9JTklUX0RMU19FTlRSWTsgaTxNQVhfTlVNX09GX0RMU19FTlRSWTsgaSsrKQorCXsKKwkJaWYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkICYmIE1BQ19BRERSX0VRVUFMKFNBLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKSkKKwkJeworCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzCT0gRExTX05PTkU7CisJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZAk9IEZBTFNFOworCQkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5UaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKKwkJCS8vQXNpY0RlbFdjaWRUYWIocEFkLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNUYWJNYXRjaFdDSUQpOworCQkJLy9Bc2ljUmVtb3ZlUGFpcndpc2VLZXlFbnRyeShwQWQsIEJTUzAsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY1RhYk1hdGNoV0NJRCk7CisJCQlNYWNUYWJsZURlbGV0ZURsc0VudHJ5KHBBZCwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjVGFiTWF0Y2hXQ0lELCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKTsKKwkJfQorCX0KK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIFJUTVBDaGVja0RMU1RpbWVPdXQoCisJSU4gUFJUTVBfQURBUFRFUglwQWQpCit7CisJVUxPTkcJCQkJaTsKKwlNTE1FX0RMU19SRVFfU1RSVUNUCU1sbWVEbHNSZXE7CisJVVNIT1JUCQkJCXJlYXNvbiA9IFJFQVNPTl9RT1NfVU5TUEVDSUZZOworCisJaWYgKCEgcEFkLT5Db21tb25DZmcuYkRMU0NhcGFibGUpCisJCXJldHVybjsKKworCWlmICghIElORlJBX09OKHBBZCkpCisJCXJldHVybjsKKworCS8vIElmIHRpbWVvdXQgdmFsdWUgaXMgZXF1YWxlZCB0byB6ZXJvLCBpdCBtZWFucyBhbHdheXMgbm90IGJlIHRpbWVvdXQuCisKKwkvLyB1cGRhdGUgbG9jYWwgZGxzIHRhYmxlIGVudHJ5CisJZm9yIChpPTA7IGk8TUFYX05VTV9PRl9JTklUX0RMU19FTlRSWTsgaSsrKQorCXsKKwkJaWYgKChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZCkgJiYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9PSBETFNfRklOSVNIKQorCQkJJiYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlRpbWVPdXQgIT0gMCkpCisJCXsKKwkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLkNvdW50RG93blRpbWVyIC0tOworCisJCQlpZiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uQ291bnREb3duVGltZXIgPT0gMCkKKwkJCXsKKwkJCQlyZWFzb24gPSBSRUFTT05fUU9TX1JFUVVFU1RfVElNRU9VVDsKKwkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZAk9IEZBTFNFOworCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cwk9IERMU19OT05FOworCQkJCURsc1Bhcm1GaWxsKHBBZCwgJk1sbWVEbHNSZXEsICZwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXSwgcmVhc29uKTsKKwkJCQlNbG1lRW5xdWV1ZShwQWQsIERMU19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9ETFNfVEVBUl9ET1dOLCBzaXplb2YoTUxNRV9ETFNfUkVRX1NUUlVDVCksICZNbG1lRGxzUmVxKTsKKwkJCX0KKwkJfQorCX0KKworCS8vIHVwZGF0ZSBwZWVyIGRscyB0YWJsZSBlbnRyeQorCWZvciAoaT1NQVhfTlVNX09GX0lOSVRfRExTX0VOVFJZOyBpPE1BWF9OVU1fT0ZfRExTX0VOVFJZOyBpKyspCisJeworCQlpZiAoKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkKSAmJiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID09IERMU19GSU5JU0gpCisJCQkmJiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVGltZU91dCAhPSAwKSkKKwkJeworCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uQ291bnREb3duVGltZXIgLS07CisKKwkJCWlmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5Db3VudERvd25UaW1lciA9PSAwKQorCQkJeworCQkJCXJlYXNvbiA9IFJFQVNPTl9RT1NfUkVRVUVTVF9USU1FT1VUOworCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkCT0gRkFMU0U7CisJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzCT0gRExTX05PTkU7CisJCQkJRGxzUGFybUZpbGwocEFkLCAmTWxtZURsc1JlcSwgJnBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLCByZWFzb24pOworCQkJCU1sbWVFbnF1ZXVlKHBBZCwgRExTX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX0RMU19URUFSX0RPV04sIHNpemVvZihNTE1FX0RMU19SRVFfU1RSVUNUKSwgJk1sbWVEbHNSZXEpOworCQkJfQorCQl9CisJfQorfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK0JPT0xFQU4gUlRNUFJjdkZyYW1lRExTQ2hlY2soCisJSU4gUFJUTVBfQURBUFRFUglwQWQsCisJSU4gUEhFQURFUl84MDJfMTEJcEhlYWRlciwKKwlJTiBVTE9ORwkJCUxlbiwKKwlJTiBQUlQyOFhYX1JYRF9TVFJVQwlwUnhEKQoreworCVVMT05HCQkJaTsKKwlCT09MRUFOCQkJYkZpbmRFbnRyeSA9IEZBTFNFOworCUJPT0xFQU4JCQliU1RBS2V5RnJhbWUgPSBGQUxTRTsKKwlQRUFQT0xfUEFDS0VUCXBFYXA7CisJUFVDSEFSCQkJcFByb3RvLCBwQWRkciA9IE5VTEw7CisJUFVDSEFSCQkJcFNUQUtleSA9IE5VTEw7CisJVUNIQVIJCQlaZXJvUmVwbGF5W0xFTl9LRVlfREVTQ19SRVBMQVldOworCVVDSEFSCQkJTWljWzE2XSwgT2xkTWljWzE2XTsKKwlVQ0hBUgkJCWRpZ2VzdFs4MF07CisJVUNIQVIJCQlEbHNQVEtbODBdOworCVVDSEFSCQkJdGVtcFs2NF07CisJQk9PTEVBTgkJCVRpbWVyQ2FuY2VsbGVkOworCUNJUEhFUl9LRVkJCVBhaXJ3aXNlS2V5OworCisKKwlpZiAoISBwQWQtPkNvbW1vbkNmZy5iRExTQ2FwYWJsZSkKKwkJcmV0dXJuIGJTVEFLZXlGcmFtZTsKKworCWlmICghIElORlJBX09OKHBBZCkpCisJCXJldHVybiBiU1RBS2V5RnJhbWU7CisKKwlpZiAoISAocEhlYWRlci0+RkMuU3ViVHlwZSAmIDB4MDgpKQorCQlyZXR1cm4gYlNUQUtleUZyYW1lOworCisJaWYgKExlbiA8IExFTkdUSF84MDJfMTEgKyA2ICsgMiArIDIpCisJCXJldHVybiBiU1RBS2V5RnJhbWU7CisKKwlwUHJvdG8JPSAoUFVDSEFSKXBIZWFkZXIgKyBMRU5HVEhfODAyXzExICsgMiArIDY7CS8vIFFPUyBDb250cm9sIGZpZWxkICwgMHhBQSAweEFBIDB4QUEgMHgwMCAweDAwIDB4MDAKKwlwQWRkcgk9IHBIZWFkZXItPkFkZHIyOworCisJLy8gTDJQQUQgYml0IG9uIHdpbGwgcGFkIDIgYnl0ZXMgYXQgTExDCisJaWYgKHBSeEQtPkwyUEFEKQorCXsKKwkJcFByb3RvICs9IDI7CisJfQorCisJaWYgKFJUTVBFcXVhbE1lbW9yeShFQVBPTCwgcFByb3RvLCAyKSAmJiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPj0gIE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkpCisJeworCQlwRWFwID0gKFBFQVBPTF9QQUNLRVQpIChwUHJvdG8gKyAyKTsKKworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkRMUyAtIFNuaWZmIExlbj0lbGQsIERhdGFMZW49JWQsIEtleU1pYz0lZCwgSW5zdGFsbD0lZCwgS2V5QWNrPSVkLCBTZWN1cmU9JWQsIEVLRF9ETD0lZCwgRXJyb3I9JWQsIFJlcXVlc3Q9JWRcbiIsIExlbiwKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTEVOR1RIXzgwMl8xMSArIDYgKyAyICsgMiArIHNpemVvZihFQVBPTF9QQUNLRVQpIC0gTUFYX0xFTl9PRl9SU05JRSArIDE2KSwKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRWFwLT5LZXlEZXNjLktleUluZm8uS2V5TWljLAorCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBFYXAtPktleURlc2MuS2V5SW5mby5JbnN0YWxsLAorCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBFYXAtPktleURlc2MuS2V5SW5mby5LZXlBY2ssCisJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEVhcC0+S2V5RGVzYy5LZXlJbmZvLlNlY3VyZSwKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRWFwLT5LZXlEZXNjLktleUluZm8uRUtEX0RMLAorCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBFYXAtPktleURlc2MuS2V5SW5mby5FcnJvciwKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRWFwLT5LZXlEZXNjLktleUluZm8uUmVxdWVzdCkpOworCisJCWlmICgoTGVuID49IChMRU5HVEhfODAyXzExICsgNiArIDIgKyAyICsgc2l6ZW9mKEVBUE9MX1BBQ0tFVCkgLSBNQVhfTEVOX09GX1JTTklFICsgMTYpKSAmJiBwRWFwLT5LZXlEZXNjLktleUluZm8uS2V5TWljCisJCQkmJiBwRWFwLT5LZXlEZXNjLktleUluZm8uSW5zdGFsbCAmJiBwRWFwLT5LZXlEZXNjLktleUluZm8uS2V5QWNrICYmIHBFYXAtPktleURlc2MuS2V5SW5mby5TZWN1cmUKKwkJCSYmIHBFYXAtPktleURlc2MuS2V5SW5mby5FS0RfREwgJiYgIXBFYXAtPktleURlc2MuS2V5SW5mby5FcnJvciAmJiAhcEVhcC0+S2V5RGVzYy5LZXlJbmZvLlJlcXVlc3QpCisJCXsKKwkJCS8vIEZpcnN0IHZhbGlkYXRlIHJlcGxheSBjb3VudGVyLCBvbmx5IGFjY2VwdCBtZXNzYWdlIHdpdGggbGFyZ2VyIHJlcGxheSBjb3VudGVyCisJCQkvLyBMZXQgZXF1YWwgcGFzcywgc29tZSBBUCBzdGFydCB3aXRoIGFsbCB6ZXJvIHJlcGxheSBjb3VudGVyCisJCQlOZGlzWmVyb01lbW9yeShaZXJvUmVwbGF5LCBMRU5fS0VZX0RFU0NfUkVQTEFZKTsKKwkJCWlmICgoUlRNUENvbXBhcmVNZW1vcnkocEVhcC0+S2V5RGVzYy5SZXBsYXlDb3VudGVyLCBwQWQtPlN0YUNmZy5SZXBsYXlDb3VudGVyLCBMRU5fS0VZX0RFU0NfUkVQTEFZKSAhPSAxKSAmJgorCQkJCShSVE1QQ29tcGFyZU1lbW9yeShwRWFwLT5LZXlEZXNjLlJlcGxheUNvdW50ZXIsIFplcm9SZXBsYXksIExFTl9LRVlfREVTQ19SRVBMQVkpICE9IDApKQorCQkJCXJldHVybiBiU1RBS2V5RnJhbWU7CisKKwkJCS8vUlRNUE1vdmVNZW1vcnkocEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlciwgcEVhcC0+S2V5RGVzYy5SZXBsYXlDb3VudGVyLCBMRU5fS0VZX0RFU0NfUkVQTEFZKTsKKwkJCVJUTVBNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLkRsc1JlcGxheUNvdW50ZXIsIHBFYXAtPktleURlc2MuUmVwbGF5Q291bnRlciwgTEVOX0tFWV9ERVNDX1JFUExBWSk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkRMUyAtIFNuaWZmIHJlcGxheSBjb3VudGVyICglMDJ4LSUwMngtJTAyeC0lMDJ4LSUwMngtJTAyeC0lMDJ4LSUwMngpIExlbj0lbGQsIEtleURhdGFMZW49JWRcbiIsCisJCQkJcEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlclswXSwgcEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlclsxXSwgcEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlclsyXSwKKwkJCQlwQWQtPlN0YUNmZy5SZXBsYXlDb3VudGVyWzNdLCBwQWQtPlN0YUNmZy5SZXBsYXlDb3VudGVyWzRdLAlwQWQtPlN0YUNmZy5SZXBsYXlDb3VudGVyWzVdLAorCQkJCXBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXJbNl0sIHBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXJbN10sIExlbiwgcEVhcC0+S2V5RGVzYy5LZXlEYXRhWzFdKSk7CisKKwkJCS8vIHB1dCB0aGVzZSBjb2RlIHNlZ21lbnQgdG8gZ2V0IHRoZSByZXBsYXkgY291bnRlcgorCQkJaWYgKHBBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkID09IFdQQV84MDJfMVhfUE9SVF9OT1RfU0VDVVJFRCkKKwkJCQlyZXR1cm4gYlNUQUtleUZyYW1lOworCisJCQkvLyBDaGVjayBNSUMgdmFsdWUKKwkJCS8vIFNhdmUgdGhlIE1JQyBhbmQgcmVwbGFjZSB3aXRoIHplcm8KKwkJCS8vIHVzZSBwcm9wcmlldGFyeSBQVEsKKwkJCU5kaXNaZXJvTWVtb3J5KHRlbXAsIDY0KTsKKwkJCU5kaXNNb3ZlTWVtb3J5KHRlbXAsICJJRUVFODAyLjExIFdJUkVMRVNTIEFDQ0VTUyBQT0lOVCIsIDMyKTsKKwkJCVdwYUNvdW50UFRLKHBBZCwgdGVtcCwgdGVtcCwgcEFkLT5Db21tb25DZmcuQnNzaWQsIHRlbXAsIHBBZC0+Q3VycmVudEFkZHJlc3MsIERsc1BUSywgTEVOX1BUSyk7CisKKwkJCU5kaXNNb3ZlTWVtb3J5KE9sZE1pYywgcEVhcC0+S2V5RGVzYy5LZXlNaWMsIExFTl9LRVlfREVTQ19NSUMpOworCQkJTmRpc1plcm9NZW1vcnkocEVhcC0+S2V5RGVzYy5LZXlNaWMsIExFTl9LRVlfREVTQ19NSUMpOworCQkJaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQorCQkJeworCQkJCS8vIEFFUworCQkJCUhNQUNfU0hBMSgoUFVDSEFSKSBwRWFwLCBwRWFwLT5Cb2R5X0xlblsxXSArIDQsIERsc1BUSywgTEVOX0VBUF9NSUNLLCBkaWdlc3QpOworCQkJCU5kaXNNb3ZlTWVtb3J5KE1pYywJZGlnZXN0LAlMRU5fS0VZX0RFU0NfTUlDKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlobWFjX21kNShEbHNQVEssIExFTl9FQVBfTUlDSywgKFBVQ0hBUikgcEVhcCwgcEVhcC0+Qm9keV9MZW5bMV0gKyA0LCBNaWMpOworCQkJfQorCisJCQlpZiAoIU5kaXNFcXVhbE1lbW9yeShPbGRNaWMsIE1pYywgTEVOX0tFWV9ERVNDX01JQykpCisJCQl7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiTUlDIERpZmZlcmVudCBpbiBNc2cxIG9mIFNUQUtleSBoYW5kc2hha2UhIFxuIikpOworCQkJCXJldHVybiBiU1RBS2V5RnJhbWU7CisJCQl9CisJCQllbHNlCisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTUlDIFZBTElEIGluIE1zZzEgb2YgU1RBS2V5IGhhbmRzaGFrZSEgXG4iKSk7CisjaWYgMQorCQkJaWYgKChwRWFwLT5LZXlEZXNjLktleURhdGFbMF0gPT0gMHhERCkgJiYgKHBFYXAtPktleURlc2MuS2V5RGF0YVsyXSA9PSAweDAwKSAmJiAocEVhcC0+S2V5RGVzYy5LZXlEYXRhWzNdID09IDB4MEMpCisJCQkJJiYgKHBFYXAtPktleURlc2MuS2V5RGF0YVs0XSA9PSAweDQzKSAmJiAocEVhcC0+S2V5RGVzYy5LZXlEYXRhWzVdID09IDB4MDIpKQorCQkJeworCQkJCXBBZGRyCQkJPSBwRWFwLT5LZXlEZXNjLktleURhdGEgKyA4OwkJLy8gVHBlKDEpLCBMZW4oMSksIE9VSSgzKSwgRGF0YVR5cGUoMSksIFJlc2VydmVkKDIpCisJCQkJcFNUQUtleQkJCT0gcEVhcC0+S2V5RGVzYy5LZXlEYXRhICsgMTQ7CS8vIFRwZSgxKSwgTGVuKDEpLCBPVUkoMyksIERhdGFUeXBlKDEpLCBSZXNlcnZlZCgyKSwgU1RBS2V5X01hY19BZGRyKDYpCisKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkRMUyAtIFJlY2VpdmUgU1RBS2V5IE1lc3NhZ2UtMSBmcm9tICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IExlbj0lbGQsIEtleURhdGFMZW49JWRcbiIsCisJCQkJCXBBZGRyWzBdLCBwQWRkclsxXSwgcEFkZHJbMl0sIHBBZGRyWzNdLCBwQWRkcls0XSwgcEFkZHJbNV0sIExlbiwgcEVhcC0+S2V5RGVzYy5LZXlEYXRhWzFdKSk7CisKKwkJCQliU1RBS2V5RnJhbWUgPSBUUlVFOworCQkJfQorI2Vsc2UKKwkJCWlmICgocEVhcC0+S2V5RGVzYy5LZXlEYXRhWzBdID09IDB4REQpICYmIChwRWFwLT5LZXlEZXNjLktleURhdGFbMl0gPT0gMHgwMCkgJiYgKHBFYXAtPktleURlc2MuS2V5RGF0YVszXSA9PSAweDBGKQorCQkJCSYmIChwRWFwLT5LZXlEZXNjLktleURhdGFbNF0gPT0gMHhBQykgJiYgKHBFYXAtPktleURlc2MuS2V5RGF0YVs1XSA9PSAweDAyKSkKKwkJCXsKKwkJCQlwQWRkcgkJCT0gcEVhcC0+S2V5RGVzYy5LZXlEYXRhICsgODsJCS8vIFRwZSgxKSwgTGVuKDEpLCBPVUkoMyksIERhdGFUeXBlKDEpLCBSZXNlcnZlZCgyKQorCQkJCXBTVEFLZXkJCQk9IHBFYXAtPktleURlc2MuS2V5RGF0YSArIDE0OwkvLyBUcGUoMSksIExlbigxKSwgT1VJKDMpLCBEYXRhVHlwZSgxKSwgUmVzZXJ2ZWQoMiksIFNUQUtleV9NYWNfQWRkcig2KQorCisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJETFMgLSBSZWNlaXZlIFNUQUtleSBNZXNzYWdlLTEgZnJvbSAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCBMZW49JWQsIEtleURhdGFMZW49JWRcbiIsCisJCQkJCXBBZGRyWzBdLCBwQWRkclsxXSwgcEFkZHJbMl0sIHBBZGRyWzNdLCBwQWRkcls0XSwgcEFkZHJbNV0sIExlbiwgcEVhcC0+S2V5RGVzYy5LZXlEYXRhWzFdKSk7CisKKwkJCQliU1RBS2V5RnJhbWUgPSBUUlVFOworCQkJfQorI2VuZGlmCisKKwkJfQorCQllbHNlIGlmIChMZW4gPj0gKExFTkdUSF84MDJfMTEgKyA2ICsgMiArIDIgKyBzaXplb2YoRUFQT0xfUEFDS0VUKSAtIE1BWF9MRU5fT0ZfUlNOSUUpKQorCQl7CisjaWYgMAorCQkJUlRNUE1vdmVNZW1vcnkocEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlciwgcEVhcC0+S2V5RGVzYy5SZXBsYXlDb3VudGVyLCBMRU5fS0VZX0RFU0NfUkVQTEFZKTsKKworI2VuZGlmCisJCQlSVE1QTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5EbHNSZXBsYXlDb3VudGVyLCBwRWFwLT5LZXlEZXNjLlJlcGxheUNvdW50ZXIsIExFTl9LRVlfREVTQ19SRVBMQVkpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJETFMgLSBTbmlmZiByZXBsYXkgY291bnRlciAyKCUwMngtJTAyeC0lMDJ4LSUwMngtJTAyeC0lMDJ4LSUwMngtJTAyeCkgTGVuPSVsZCwgS2V5RGF0YUxlbj0lZFxuIiwKKwkJCQlwQWQtPlN0YUNmZy5SZXBsYXlDb3VudGVyWzBdLCBwQWQtPlN0YUNmZy5SZXBsYXlDb3VudGVyWzFdLCBwQWQtPlN0YUNmZy5SZXBsYXlDb3VudGVyWzJdLAorCQkJCXBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXJbM10sIHBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXJbNF0sCXBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXJbNV0sCisJCQkJcEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlcls2XSwgcEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlcls3XSwgTGVuLCBwRWFwLT5LZXlEZXNjLktleURhdGFbMV0pKTsKKworCQl9CisJfQorCisJLy8gSWYgdGltZW91dCB2YWx1ZSBpcyBlcXVhbGVkIHRvIHplcm8sIGl0IG1lYW5zIGFsd2F5cyBub3QgYmUgdGltZW91dC4KKwkvLyB1cGRhdGUgbG9jYWwgZGxzIHRhYmxlIGVudHJ5CisJZm9yIChpPSAwOyBpIDwgTUFYX05VTV9PRl9JTklUX0RMU19FTlRSWTsgaSsrKQorCXsKKwkJaWYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkICYmIE1BQ19BRERSX0VRVUFMKHBBZGRyLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKSkKKwkJeworCQkJaWYgKGJTVEFLZXlGcmFtZSkKKwkJCXsKKwkJCQlQTUFDX1RBQkxFX0VOVFJZIHBFbnRyeTsKKworCQkJCS8vIFNUQUtleSBmcmFtZSwgYWRkIHBhaXJ3aXNlIGtleSB0YWJsZQorCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9IERMU19GSU5JU0g7CisJCQkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5UaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKKworCQkJCVBhaXJ3aXNlS2V5LktleUxlbiA9IExFTl9US0lQX0VLOworCQkJCU5kaXNNb3ZlTWVtb3J5KFBhaXJ3aXNlS2V5LktleSwgJnBTVEFLZXlbMF0sIExFTl9US0lQX0VLKTsKKwkJCQlOZGlzTW92ZU1lbW9yeShQYWlyd2lzZUtleS5UeE1pYywgJnBTVEFLZXlbMTZdLCBMRU5fVEtJUF9SWE1JQ0spOworCQkJCU5kaXNNb3ZlTWVtb3J5KFBhaXJ3aXNlS2V5LlJ4TWljLCAmcFNUQUtleVsyNF0sIExFTl9US0lQX1RYTUlDSyk7CisKKwkJCQlQYWlyd2lzZUtleS5DaXBoZXJBbGcgPSBwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLkNpcGhlckFsZzsKKworCQkJCXBFbnRyeSA9IERsc0VudHJ5VGFibGVMb29rdXAocEFkLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyLCBUUlVFKTsKKwkJCQkvL0FzaWNBZGRLZXlFbnRyeShwQWQsIChVU0hPUlQpKGkgKyAyKSwgQlNTMCwgMCwgJlBhaXJ3aXNlS2V5LCBUUlVFLCBUUlVFKTsJLy8gcmVzZXJ2ZSAwIGZvciBtdWx0aWNhc3QsIDEgZm9yIHVuaWNhc3QKKwkJCQkvL0FzaWNVcGRhdGVSeFdDSURUYWJsZShwQWQsIChVU0hPUlQpKGkgKyAyKSwgcEFkZHIpOworCQkJCS8vIEFkZCBQYWlyLXdpc2Uga2V5IHRvIEFzaWMKKyNpZmRlZiBSVDI4NjAKKyAgICAgICAgICAgIAlBc2ljQWRkUGFpcndpc2VLZXlFbnRyeShwQWQsCisJCQkJCQkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkciwKKwkJCQkJCQkJCQkoVUNIQVIpcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjVGFiTWF0Y2hXQ0lELAorCQkJCQkJCQkJCSZQYWlyd2lzZUtleSk7CisKKwkJCQlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZCwKKwkJCQkJCQkJCQkgIEJTUzAsCisJCQkJCQkJCQkJICAwLAorCQkJCQkJCQkJCSAgUGFpcndpc2VLZXkuQ2lwaGVyQWxnLAorCQkJCQkJCQkJCSAgcEVudHJ5KTsKKworI2VuZGlmIC8vIFJUMjg2MCAvLworCQkJCU5kaXNNb3ZlTWVtb3J5KCZwRW50cnktPlBhaXJ3aXNlS2V5LCAmUGFpcndpc2VLZXksIHNpemVvZihDSVBIRVJfS0VZKSk7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJETFMgLSBSZWNlaXZlIFNUQUtleSBNZXNzYWdlLTEgKFBlZXIgU1RBIE1BQyBBZGRyZXNzIFNUQUtleSkgXG4iKSk7CisKKwkJCQlSVE1QU2VuZFNUQUtleUhhbmRTaGFrZShwQWQsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpOworCisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJETFMgLSBGaW5pc2ggU1RBS2V5IGhhbmRzaGFrZSBwcm9jZWR1cmUgKEluaXRpYXRvciBzaWRlKVxuIikpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCS8vIERhdGEgZnJhbWUsIHVwZGF0ZSB0aW1lb3V0IHZhbHVlCisJCQkJaWYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9PSBETFNfRklOSVNIKQorCQkJCXsKKwkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uQ291bnREb3duVGltZXIgPSBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5UaW1lT3V0OworCQkJCQkvL0FzaWNVcGRhdGVSeFdDSURUYWJsZShwQWQsIChVU0hPUlQpKGkgKyAyKSwgcEFkZHIpOworCQkJCX0KKwkJCX0KKworCQkJYkZpbmRFbnRyeSA9IFRSVUU7CisJCX0KKwl9CisKKwkvLyB1cGRhdGUgcGVlciBkbHMgdGFibGUgZW50cnkKKwlmb3IgKGk9TUFYX05VTV9PRl9JTklUX0RMU19FTlRSWTsgaTxNQVhfTlVNX09GX0RMU19FTlRSWTsgaSsrKQorCXsKKwkJaWYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkICYmIE1BQ19BRERSX0VRVUFMKHBBZGRyLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKSkKKwkJeworCQkJaWYgKGJTVEFLZXlGcmFtZSkKKwkJCXsKKwkJCQlQTUFDX1RBQkxFX0VOVFJZIHBFbnRyeSA9IE5VTEw7CisKKwkJCQkvLyBTVEFLZXkgZnJhbWUsIGFkZCBwYWlyd2lzZSBrZXkgdGFibGUsIGFuZCBzZW5kIFNUQWtleSBNc2ctMgorCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9IERMU19GSU5JU0g7CisJCQkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5UaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKKworCQkJCVBhaXJ3aXNlS2V5LktleUxlbiA9IExFTl9US0lQX0VLOworCQkJCU5kaXNNb3ZlTWVtb3J5KFBhaXJ3aXNlS2V5LktleSwgJnBTVEFLZXlbMF0sIExFTl9US0lQX0VLKTsKKwkJCQlOZGlzTW92ZU1lbW9yeShQYWlyd2lzZUtleS5UeE1pYywgJnBTVEFLZXlbMTZdLCBMRU5fVEtJUF9SWE1JQ0spOworCQkJCU5kaXNNb3ZlTWVtb3J5KFBhaXJ3aXNlS2V5LlJ4TWljLCAmcFNUQUtleVsyNF0sIExFTl9US0lQX1RYTUlDSyk7CisKKwkJCQlQYWlyd2lzZUtleS5DaXBoZXJBbGcgPSBwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLkNpcGhlckFsZzsKKworCQkJCXBFbnRyeSA9IERsc0VudHJ5VGFibGVMb29rdXAocEFkLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyLCBUUlVFKTsKKwkJCQkvL0FzaWNBZGRLZXlFbnRyeShwQWQsIChVU0hPUlQpKGkgKyAyKSwgQlNTMCwgMCwgJlBhaXJ3aXNlS2V5LCBUUlVFLCBUUlVFKTsJLy8gcmVzZXJ2ZSAwIGZvciBtdWx0aWNhc3QsIDEgZm9yIHVuaWNhc3QKKwkJCQkvL0FzaWNVcGRhdGVSeFdDSURUYWJsZShwQWQsIChVU0hPUlQpKGkgKyAyKSwgcEFkZHIpOworCQkJCS8vIEFkZCBQYWlyLXdpc2Uga2V5IHRvIEFzaWMKKyNpZmRlZiBSVDI4NjAKKyAgICAgICAgICAgIAlBc2ljQWRkUGFpcndpc2VLZXlFbnRyeShwQWQsCisJCQkJCQkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkciwKKwkJCQkJCQkJCQkoVUNIQVIpcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjVGFiTWF0Y2hXQ0lELAorCQkJCQkJCQkJCSZQYWlyd2lzZUtleSk7CisKKwkJCQlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZCwKKwkJCQkJCQkJCQkgIEJTUzAsCisJCQkJCQkJCQkJICAwLAorCQkJCQkJCQkJCSAgUGFpcndpc2VLZXkuQ2lwaGVyQWxnLAorCQkJCQkJCQkJCSAgcEVudHJ5KTsKKyNlbmRpZiAvLyBSVDI4NjAgLy8KKwkJCQlOZGlzTW92ZU1lbW9yeSgmcEVudHJ5LT5QYWlyd2lzZUtleSwgJlBhaXJ3aXNlS2V5LCBzaXplb2YoQ0lQSEVSX0tFWSkpOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiRExTIC0gUmVjZWl2ZSBTVEFLZXkgTWVzc2FnZS0xIChJbml0aWF0b3IgU1RBIE1BQyBBZGRyZXNzIFNUQUtleSlcbiIpKTsKKworCQkJCS8vIElmIHN1cHBvcnQgV1BBIG9yIFdQQTIsIHN0YXJ0IFNUQUtleSBoYW5kIHNoYWtlLAorCQkJCS8vIElmIGZhaWxlZCBoYW5kIHNoYWtlLCBqdXN0IHRlYXIgZG93biBwZWVyIERMUworCQkJCWlmIChSVE1QU2VuZFNUQUtleUhhbmRTaGFrZShwQWQsIHBBZGRyKSAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCQkJCXsKKwkJCQkJTUxNRV9ETFNfUkVRX1NUUlVDVAlNbG1lRGxzUmVxOworCQkJCQlVU0hPUlQJCQkJcmVhc29uID0gUkVBU09OX1FPU19DSVBIRVJfTk9UX1NVUFBPUlQ7CisKKwkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQJPSBGQUxTRTsKKwkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzCT0gRExTX05PTkU7CisJCQkJCURsc1Bhcm1GaWxsKHBBZCwgJk1sbWVEbHNSZXEsICZwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXSwgcmVhc29uKTsKKwkJCQkJTWxtZUVucXVldWUocEFkLCBETFNfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfRExTX1RFQVJfRE9XTiwgc2l6ZW9mKE1MTUVfRExTX1JFUV9TVFJVQ1QpLCAmTWxtZURsc1JlcSk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiRExTIC0gRmluaXNoIFNUQUtleSBoYW5kc2hha2UgcHJvY2VkdXJlIChQZWVyIHNpZGUpXG4iKSk7CisJCQkJfQorCQkJfQorCQkJZWxzZQorCQkJeworCQkJCS8vIERhdGEgZnJhbWUsIHVwZGF0ZSB0aW1lb3V0IHZhbHVlCisJCQkJaWYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9PSBETFNfRklOSVNIKQorCQkJCXsKKwkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uQ291bnREb3duVGltZXIgPSBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5UaW1lT3V0OworCQkJCX0KKwkJCX0KKworCQkJYkZpbmRFbnRyeSA9IFRSVUU7CisJCX0KKwl9CisKKworCXJldHVybiBiU1RBS2V5RnJhbWU7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lCURlc2NyaXB0aW9uOgorCQlDaGVjayBpZiB0aGUgZnJhbWUgY2FuIGJlIHNlbnQgdGhyb3VnaCBETFMgZGlyZWN0IGxpbmsgaW50ZXJmYWNlCisKKwlBcmd1bWVudHM6CisJCXBBZAkJUG9pbnRlcgl0byBhZGFwdGVyCisKKwlSZXR1cm4gVmFsdWU6CisJCURMUyBlbnRyeSBpbmRleAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVAlSVE1QQ2hlY2tETFNGcmFtZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBEQSkKK3sKKwlJTlQgcnZhbCA9IC0xOworCUlOVAlpOworCisJaWYgKCFwQWQtPkNvbW1vbkNmZy5iRExTQ2FwYWJsZSkKKwkJcmV0dXJuIHJ2YWw7CisKKwlpZiAoIUlORlJBX09OKHBBZCkpCisJCXJldHVybiBydmFsOworCisJZG97CisJCS8vIGNoZWNrIGxvY2FsIGRscyB0YWJsZSBlbnRyeQorCQlmb3IgKGk9MDsgaTxNQVhfTlVNX09GX0lOSVRfRExTX0VOVFJZOyBpKyspCisJCXsKKwkJCWlmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZCAmJiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID09IERMU19GSU5JU0gpICYmCisJCQkJTUFDX0FERFJfRVFVQUwocERBLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKSkKKwkJCXsKKwkJCQlydmFsID0gaTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCS8vIGNoZWNrIHBlZXIgZGxzIHRhYmxlIGVudHJ5CisJCWZvciAoaT1NQVhfTlVNX09GX0lOSVRfRExTX0VOVFJZOyBpPE1BWF9OVU1fT0ZfRExTX0VOVFJZOyBpKyspCisJCXsKKwkJCWlmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZCAmJiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID09IERMU19GSU5JU0gpICYmCisJCQkJTUFDX0FERFJfRVFVQUwocERBLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKSkKKwkJCXsKKwkJCQlydmFsID0gaTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0gd2hpbGUgKEZBTFNFKTsKKworCXJldHVybiBydmFsOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgUlRNUFNlbmRETFNUZWFyRG93bkZyYW1lKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOICBQVUNIQVIgICAgICAgICAgcERBKQoreworCVBVQ0hBUgkJCXBPdXRCdWZmZXIgPSBOVUxMOworCU5ESVNfU1RBVFVTCQlOU3RhdHVzOworCUhFQURFUl84MDJfMTEJRGxzVGVhckRvd25IZHI7CisJVUxPTkcJCQlGcmFtZUxlbiA9IDA7CisJVVNIT1JUCQkJUmVhc29uID0gUkVBU09OX1FPU19RU1RBX0xFQVZJTkdfUUJTUzsKKwlVQ0hBUgkJCUNhdGVnb3J5ID0gQ0FURUdPUllfRExTOworCVVDSEFSCQkJQWN0aW9uID0gQUNUSU9OX0RMU19URUFSRE9XTjsKKwlVQ0hBUgkJCWkgPSAwOworCisJaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUykgfHwKKwkJUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MpKQorCQlyZXR1cm47CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZW5kIERMUyBUZWFyRG93biBGcmFtZSBcbiIpKTsKKworCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5CisJaWYgKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiQVNTT0MgLSBSVE1QU2VuZERMU1RlYXJEb3duRnJhbWUoKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkIFxuIikpOworCQlyZXR1cm47CisJfQorCisJQWN0SGVhZGVySW5pdChwQWQsICZEbHNUZWFyRG93bkhkciwgcEFkLT5Db21tb25DZmcuQnNzaWQsIHBBZC0+Q3VycmVudEFkZHJlc3MsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKwlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLAkJCQkmRnJhbWVMZW4sCisJCQkJCXNpemVvZihIRUFERVJfODAyXzExKSwJCSZEbHNUZWFyRG93bkhkciwKKwkJCQkJMSwJCQkJCQkJJkNhdGVnb3J5LAorCQkJCQkxLAkJCQkJCQkmQWN0aW9uLAorCQkJCQk2LAkJCQkJCQlwREEsCisJCQkJCTYsCQkJCQkJCXBBZC0+Q3VycmVudEFkZHJlc3MsCisJCQkJCTIsCQkJCQkJCSZSZWFzb24sCisJCQkJCUVORF9PRl9BUkdTKTsKKworCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgMCwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOworCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7CisKKwkvLyBSZW1vdmUga2V5IGluIGxvY2FsIGRscyB0YWJsZSBlbnRyeQorCWZvciAoaSA9IDA7IGkgPCBNQVhfTlVNX09GX0lOSVRfRExTX0VOVFJZOyBpKyspCisJeworCQlpZiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQgJiYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9PSBETFNfRklOSVNIKQorCQkJJiYgTUFDX0FERFJfRVFVQUwocERBLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKSkKKwkJeworCQkJTWFjVGFibGVEZWxldGVEbHNFbnRyeShwQWQsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY1RhYk1hdGNoV0NJRCwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcik7CisJCX0KKwl9CisKKwkvLyBSZW1vdmUga2V5IGluIHBlZXIgZGxzIHRhYmxlIGVudHJ5CisJZm9yIChpPU1BWF9OVU1fT0ZfSU5JVF9ETFNfRU5UUlk7IGk8TUFYX05VTV9PRl9ETFNfRU5UUlk7IGkrKykKKwl7CisJCWlmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZCAmJiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID09IERMU19GSU5JU0gpCisJCQkmJiBNQUNfQUREUl9FUVVBTChwREEsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpKQorCQl7CisJCQlNYWNUYWJsZURlbGV0ZURsc0VudHJ5KHBBZCwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjVGFiTWF0Y2hXQ0lELCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKTsKKwkJfQorCX0KKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNlbmQgRExTIFRlYXJEb3duIEZyYW1lIGFuZCByZW1vdmUga2V5IGluIChpPSVkKSBcbiIsIGkpKTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitORElTX1NUQVRVUyBSVE1QU2VuZFNUQUtleVJlcXVlc3QoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJcERBKQoreworCVVDSEFSCQkJCUhlYWRlcjgwMl8zWzE0XTsKKwlORElTX1NUQVRVUwkJCU5TdGF0dXM7CisJVUxPTkcJCQkJRnJhbWVMZW4gPSAwOworCUVBUE9MX1BBQ0tFVAkJUGFja2V0OworCVVDSEFSCQkJCU1pY1sxNl07CisJVUNIQVIJCQkJZGlnZXN0WzgwXTsKKwlQVUNIQVIJCQkJcE91dEJ1ZmZlciA9IE5VTEw7CisJUE5ESVNfUEFDS0VUCQlwTmRpc1BhY2tldDsKKwlVQ0hBUgkJCQl0ZW1wWzY0XTsKKwlVQ0hBUgkJCQlEbHNQVEtbODBdOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJETFMgLSBSVE1QU2VuZFNUQUtleVJlcXVlc3QoKSB0byAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwgcERBWzBdLCBwREFbMV0sIHBEQVsyXSwgcERBWzNdLCBwREFbNF0sIHBEQVs1XSkpOworCisJcEFkLT5TZXF1ZW5jZSArKzsKKwlNQUtFXzgwMl8zX0hFQURFUihIZWFkZXI4MDJfMywgcEFkLT5Db21tb25DZmcuQnNzaWQsIHBBZC0+Q3VycmVudEFkZHJlc3MsIEVBUE9MKTsKKworCS8vIFplcm8gbWVzc2FnZSBib2R5CisJTmRpc1plcm9NZW1vcnkoJlBhY2tldCwgc2l6ZW9mKFBhY2tldCkpOworCVBhY2tldC5Qcm9WZXIgPSBFQVBPTF9WRVI7CisJUGFja2V0LlByb1R5cGUgICAgPSBFQVBPTEtleTsKKwlQYWNrZXQuQm9keV9MZW5bMV0gID0gc2l6ZW9mKEtFWV9ERVNDUklQVEVSKSAtIE1BWF9MRU5fT0ZfUlNOSUUgKyA2ICsgTUFDX0FERFJfTEVOOwkJLy8gZGF0YSBmaWVsZCBjb250YWluIEtERSBhbmRQZWVyIE1BQyBhZGRyZXNzCisKKwkvLyBTVEFLZXkgTWVzc2FnZSBpcyBhcyBFQVBPTC1LZXkoMSwxLDAsMCxHLzAsMCwwLCBNSUMsIDAsUGVlciBNQUMgS0RFKQorCWlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKSB8fCAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKSkKKyAgICB7CisgICAgICAgIFBhY2tldC5LZXlEZXNjLlR5cGUgPSBXUEExX0tFWV9ERVNDOworICAgIH0KKyAgICBlbHNlIGlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikgfHwgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spKQorICAgIHsKKyAgICAgICAgUGFja2V0LktleURlc2MuVHlwZSA9IFdQQTJfS0VZX0RFU0M7CisgICAgfQorCisJLy8gS2V5IGRlc2NyaXB0b3IgdmVyc2lvbgorCVBhY2tldC5LZXlEZXNjLktleUluZm8uS2V5RGVzY1ZlciA9CisJCSgoKHBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkgfHwgKHBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpKSA/IChERVNDX1RZUEVfQUVTKSA6IChERVNDX1RZUEVfVEtJUCkpOworCisJUGFja2V0LktleURlc2MuS2V5SW5mby5LZXlNaWMJPSAxOworCVBhY2tldC5LZXlEZXNjLktleUluZm8uU2VjdXJlCT0gMTsKKwlQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLlJlcXVlc3QJPSAxOworCisJUGFja2V0LktleURlc2MuS2V5RGF0YUxlblsxXQk9IDEyOworCisJLy8gdXNlIG91ciBvd24gT1VJIHRvIGRpc3Rpbmd1aXNoIHByb3ByaWV0YXJ5IHdpdGggc3RhbmRhcmQuCisJUGFja2V0LktleURlc2MuS2V5RGF0YVswXQkJPSAweEREOworCVBhY2tldC5LZXlEZXNjLktleURhdGFbMV0JCT0gMHgwQTsKKwlQYWNrZXQuS2V5RGVzYy5LZXlEYXRhWzJdCQk9IDB4MDA7CisJUGFja2V0LktleURlc2MuS2V5RGF0YVszXQkJPSAweDBDOworCVBhY2tldC5LZXlEZXNjLktleURhdGFbNF0JCT0gMHg0MzsKKwlQYWNrZXQuS2V5RGVzYy5LZXlEYXRhWzVdCQk9IDB4MDM7CisJTmRpc01vdmVNZW1vcnkoJlBhY2tldC5LZXlEZXNjLktleURhdGFbNl0sIHBEQSwgTUFDX0FERFJfTEVOKTsKKworCU5kaXNNb3ZlTWVtb3J5KFBhY2tldC5LZXlEZXNjLlJlcGxheUNvdW50ZXIsIHBBZC0+U3RhQ2ZnLkRsc1JlcGxheUNvdW50ZXIsIExFTl9LRVlfREVTQ19SRVBMQVkpOworCisJLy8gQWxsb2NhdGUgYnVmZmVyIGZvciB0cmFuc21pdHRpbmcgbWVzc2FnZQorCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcik7CisJaWYgKE5TdGF0dXMJIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJcmV0dXJuIE5TdGF0dXM7CisKKwkvLyBQcmVwYXJlIEVBUE9MIGZyYW1lIGZvciBNSUMgY2FsY3VsYXRpb24KKwkvLyBCZSBjYXJlZnVsLCBvbmx5IEVBUE9MIGZyYW1lIGlzIGNvdW50ZWQgZm9yIE1JQyBjYWxjdWxhdGlvbgorCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAgICAmRnJhbWVMZW4sCisJCSAgICAgICAgICAgICAgUGFja2V0LkJvZHlfTGVuWzFdICsgNCwgICAgJlBhY2tldCwKKwkJICAgICAgICAgICAgICBFTkRfT0ZfQVJHUyk7CisKKwkvLyB1c2UgcHJvcHJpZXRhcnkgUFRLCisJTmRpc1plcm9NZW1vcnkodGVtcCwgNjQpOworCU5kaXNNb3ZlTWVtb3J5KHRlbXAsICJJRUVFODAyLjExIFdJUkVMRVNTIEFDQ0VTUyBQT0lOVCIsIDMyKTsKKwlXcGFDb3VudFBUSyhwQWQsIHRlbXAsIHRlbXAsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCB0ZW1wLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBEbHNQVEssIExFTl9QVEspOworCisJLy8gY2FsY3VsYXRlIE1JQworCWlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKKwl7CisJCS8vIEFFUworCQlOZGlzWmVyb01lbW9yeShkaWdlc3QsCXNpemVvZihkaWdlc3QpKTsKKwkJSE1BQ19TSEExKHBPdXRCdWZmZXIsIEZyYW1lTGVuLCBEbHNQVEssIExFTl9FQVBfTUlDSywgZGlnZXN0KTsKKwkJTmRpc01vdmVNZW1vcnkoUGFja2V0LktleURlc2MuS2V5TWljLCBkaWdlc3QsIExFTl9LRVlfREVTQ19NSUMpOworCX0KKwllbHNlCisJeworCQlOZGlzWmVyb01lbW9yeShNaWMsCXNpemVvZihNaWMpKTsKKwkJaG1hY19tZDUoRGxzUFRLLCBMRU5fRUFQX01JQ0ssIHBPdXRCdWZmZXIsIEZyYW1lTGVuLCBNaWMpOworCQlOZGlzTW92ZU1lbW9yeShQYWNrZXQuS2V5RGVzYy5LZXlNaWMsIE1pYywgTEVOX0tFWV9ERVNDX01JQyk7CisJfQorCisJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICAgICZGcmFtZUxlbiwKKwkgICAgICAgICAgICAgICAgICBzaXplb2YoSGVhZGVyODAyXzMpLAlIZWFkZXI4MDJfMywKKwkJICAgICAgICAgICAgICBQYWNrZXQuQm9keV9MZW5bMV0gKyA0LAkmUGFja2V0LAorCQkgICAgICAgICAgICAgIEVORF9PRl9BUkdTKTsKKworCU5TdGF0dXMgPSBSVE1QQWxsb2NhdGVOZGlzUGFja2V0KHBBZCwgJnBOZGlzUGFja2V0LCBOVUxMLCAwLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7CisJaWYgKE5TdGF0dXMgPT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwl7CisJCVJUTVBfU0VUX1BBQ0tFVF9XQ0lEKHBOZGlzUGFja2V0LCBCU1NJRF9XQ0lEKTsKKwkJU1RBU2VuZFBhY2tldChwQWQsIHBOZGlzUGFja2V0KTsKKwkJUlRNUERlUXVldWVQYWNrZXQocEFkLCBGQUxTRSwgTlVNX09GX1RYX1JJTkcsIE1BWF9UWF9QUk9DRVNTKTsKKwl9CisKKwlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlRNUFNlbmRTVEFLZXlSZXF1ZXN0LSBTZW5kIFNUQUtleSByZXF1ZXN0IChOU3RhdHVzPSV4LCBGcmFtZUxlbj0lbGQpXG4iLCBOU3RhdHVzLCBGcmFtZUxlbikpOworCisJcmV0dXJuIE5TdGF0dXM7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworTkRJU19TVEFUVVMgUlRNUFNlbmRTVEFLZXlIYW5kU2hha2UoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJcERBKQoreworCVVDSEFSCQkJCUhlYWRlcjgwMl8zWzE0XTsKKwlORElTX1NUQVRVUwkJCU5TdGF0dXM7CisJVUxPTkcJCQkJRnJhbWVMZW4gPSAwOworCUVBUE9MX1BBQ0tFVAkJUGFja2V0OworCVVDSEFSCQkJCU1pY1sxNl07CisJVUNIQVIJCQkJZGlnZXN0WzgwXTsKKwlQVUNIQVIJCQkJcE91dEJ1ZmZlciA9IE5VTEw7CisJUE5ESVNfUEFDS0VUCQlwTmRpc1BhY2tldDsKKwlVQ0hBUgkJCQl0ZW1wWzY0XTsKKwlVQ0hBUgkJCQlEbHNQVEtbODBdOwkJCS8vIER1ZSB0byBkaXJ2ZXIgY2FuIG5vdCBnZXQgUFRLLCB1c2UgcHJvcHJpZXRhcnkgUFRLCisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkRMUyAtIFJUTVBTZW5kU1RBS2V5SGFuZFNoYWtlKCkgdG8gJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsIHBEQVswXSwgcERBWzFdLCBwREFbMl0sIHBEQVszXSwgcERBWzRdLCBwREFbNV0pKTsKKworCXBBZC0+U2VxdWVuY2UgKys7CisJTUFLRV84MDJfM19IRUFERVIoSGVhZGVyODAyXzMsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBFQVBPTCk7CisKKwkvLyBaZXJvIG1lc3NhZ2UgYm9keQorCU5kaXNaZXJvTWVtb3J5KCZQYWNrZXQsIHNpemVvZihQYWNrZXQpKTsKKwlQYWNrZXQuUHJvVmVyID0gRUFQT0xfVkVSOworCVBhY2tldC5Qcm9UeXBlICAgID0gRUFQT0xLZXk7CisJUGFja2V0LkJvZHlfTGVuWzFdICA9IHNpemVvZihLRVlfREVTQ1JJUFRFUikgLSBNQVhfTEVOX09GX1JTTklFICsgNiArIE1BQ19BRERSX0xFTjsJCS8vIGRhdGEgZmllbGQgY29udGFpbiBLREUgYW5kIFBlZXIgTUFDIGFkZHJlc3MKKworCS8vIFNUQUtleSBNZXNzYWdlIGlzIGFzIEVBUE9MLUtleSgxLDEsMCwwLEcvMCwwLDAsIE1JQywgMCxQZWVyIE1BQyBLREUpCisJaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpIHx8IChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spKQorICAgIHsKKyAgICAgICAgUGFja2V0LktleURlc2MuVHlwZSA9IFdQQTFfS0VZX0RFU0M7CisgICAgfQorICAgIGVsc2UgaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyKSB8fCAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykpCisgICAgeworICAgICAgICBQYWNrZXQuS2V5RGVzYy5UeXBlID0gV1BBMl9LRVlfREVTQzsKKyAgICB9CisKKwkvLyBLZXkgZGVzY3JpcHRvciB2ZXJzaW9uCisJUGFja2V0LktleURlc2MuS2V5SW5mby5LZXlEZXNjVmVyID0KKwkJKCgocEFkLT5TdGFDZmcuUGFpckNpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKSB8fCAocEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkpID8gKERFU0NfVFlQRV9BRVMpIDogKERFU0NfVFlQRV9US0lQKSk7CisKKwlQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLktleU1pYwk9IDE7CisJUGFja2V0LktleURlc2MuS2V5SW5mby5TZWN1cmUJPSAxOworCisJUGFja2V0LktleURlc2MuS2V5RGF0YUxlblsxXQk9IDEyOworCisJLy8gdXNlIG91ciBvd24gT1VJIHRvIGRpc3Rpbmd1aXNoIHByb3ByaWV0YXJ5IHdpdGggc3RhbmRhcmQuCisJUGFja2V0LktleURlc2MuS2V5RGF0YVswXQkJPSAweEREOworCVBhY2tldC5LZXlEZXNjLktleURhdGFbMV0JCT0gMHgwQTsKKwlQYWNrZXQuS2V5RGVzYy5LZXlEYXRhWzJdCQk9IDB4MDA7CisJUGFja2V0LktleURlc2MuS2V5RGF0YVszXQkJPSAweDBDOworCVBhY2tldC5LZXlEZXNjLktleURhdGFbNF0JCT0gMHg0MzsKKwlQYWNrZXQuS2V5RGVzYy5LZXlEYXRhWzVdCQk9IDB4MDM7CisJTmRpc01vdmVNZW1vcnkoJlBhY2tldC5LZXlEZXNjLktleURhdGFbNl0sIHBEQSwgTUFDX0FERFJfTEVOKTsKKworCU5kaXNNb3ZlTWVtb3J5KFBhY2tldC5LZXlEZXNjLlJlcGxheUNvdW50ZXIsIHBBZC0+U3RhQ2ZnLkRsc1JlcGxheUNvdW50ZXIsIExFTl9LRVlfREVTQ19SRVBMQVkpOworCisJLy8gQWxsb2NhdGUgYnVmZmVyIGZvciB0cmFuc21pdHRpbmcgbWVzc2FnZQorCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcik7CisJaWYgKE5TdGF0dXMJIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJcmV0dXJuIE5TdGF0dXM7CisKKwkvLyBQcmVwYXJlIEVBUE9MIGZyYW1lIGZvciBNSUMgY2FsY3VsYXRpb24KKwkvLyBCZSBjYXJlZnVsLCBvbmx5IEVBUE9MIGZyYW1lIGlzIGNvdW50ZWQgZm9yIE1JQyBjYWxjdWxhdGlvbgorCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAgICAmRnJhbWVMZW4sCisJCSAgICAgICAgICAgICAgUGFja2V0LkJvZHlfTGVuWzFdICsgNCwgICAgJlBhY2tldCwKKwkJICAgICAgICAgICAgICBFTkRfT0ZfQVJHUyk7CisKKwkvLyB1c2UgcHJvcHJpZXRhcnkgUFRLCisJTmRpc1plcm9NZW1vcnkodGVtcCwgNjQpOworCU5kaXNNb3ZlTWVtb3J5KHRlbXAsICJJRUVFODAyLjExIFdJUkVMRVNTIEFDQ0VTUyBQT0lOVCIsIDMyKTsKKwlXcGFDb3VudFBUSyhwQWQsIHRlbXAsIHRlbXAsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCB0ZW1wLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBEbHNQVEssIExFTl9QVEspOworCisJLy8gY2FsY3VsYXRlIE1JQworCWlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKKwl7CisJCS8vIEFFUworCQlOZGlzWmVyb01lbW9yeShkaWdlc3QsCXNpemVvZihkaWdlc3QpKTsKKwkJSE1BQ19TSEExKHBPdXRCdWZmZXIsIEZyYW1lTGVuLCBEbHNQVEssIExFTl9FQVBfTUlDSywgZGlnZXN0KTsKKwkJTmRpc01vdmVNZW1vcnkoUGFja2V0LktleURlc2MuS2V5TWljLCBkaWdlc3QsIExFTl9LRVlfREVTQ19NSUMpOworCX0KKwllbHNlCisJeworCQlOZGlzWmVyb01lbW9yeShNaWMsCXNpemVvZihNaWMpKTsKKwkJaG1hY19tZDUoRGxzUFRLLCBMRU5fRUFQX01JQ0ssIHBPdXRCdWZmZXIsIEZyYW1lTGVuLCBNaWMpOworCQlOZGlzTW92ZU1lbW9yeShQYWNrZXQuS2V5RGVzYy5LZXlNaWMsIE1pYywgTEVOX0tFWV9ERVNDX01JQyk7CisJfQorCisJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICAgICZGcmFtZUxlbiwKKwkgICAgICAgICAgICAgICAgICBzaXplb2YoSGVhZGVyODAyXzMpLAlIZWFkZXI4MDJfMywKKwkJICAgICAgICAgICAgICBQYWNrZXQuQm9keV9MZW5bMV0gKyA0LAkmUGFja2V0LAorCQkgICAgICAgICAgICAgIEVORF9PRl9BUkdTKTsKKworCU5TdGF0dXMgPSBSVE1QQWxsb2NhdGVOZGlzUGFja2V0KHBBZCwgJnBOZGlzUGFja2V0LCBOVUxMLCAwLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7CisJaWYgKE5TdGF0dXMgPT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwl7CisJCVJUTVBfU0VUX1BBQ0tFVF9XQ0lEKHBOZGlzUGFja2V0LCBCU1NJRF9XQ0lEKTsKKwkJU1RBU2VuZFBhY2tldChwQWQsIHBOZGlzUGFja2V0KTsKKwkJUlRNUERlUXVldWVQYWNrZXQocEFkLCBGQUxTRSwgTlVNX09GX1RYX1JJTkcsIE1BWF9UWF9QUk9DRVNTKTsKKwl9CisKKwlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlRNUFNlbmRTVEFLZXlIYW5kU2hha2UtIFNlbmQgU1RBS2V5IE1lc3NhZ2UtMiAoTlN0YXR1cz0leCwgRnJhbWVMZW49JWxkKVxuIiwgTlN0YXR1cywgRnJhbWVMZW4pKTsKKworCXJldHVybiBOU3RhdHVzOworfQorCitWT0lEIERsc1RpbWVvdXRBY3Rpb24oCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKQoreworCU1MTUVfRExTX1JFUV9TVFJVQ1QJCU1sbWVEbHNSZXE7CisJVVNIT1JUCQkJCQlyZWFzb247CisJUFJUXzgwMl8xMV9ETFMJCQlwRExTID0gKFBSVF84MDJfMTFfRExTKUZ1bmN0aW9uQ29udGV4dDsKKwlQUlRNUF9BREFQVEVSCQkJcEFkID0gcERMUy0+cEFkOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiRGxzVGltZW91dCAtIFRlYXIgZG93biBETFMgbGlua3MgKCUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4KVxuIiwKKwkJcERMUy0+TWFjQWRkclswXSwgcERMUy0+TWFjQWRkclsxXSwgcERMUy0+TWFjQWRkclsyXSwgcERMUy0+TWFjQWRkclszXSwgcERMUy0+TWFjQWRkcls0XSwgcERMUy0+TWFjQWRkcls1XSkpOworCisJaWYgKChwRExTKSAmJiAocERMUy0+VmFsaWQpKQorCXsKKwkJcmVhc29uCQkJPSBSRUFTT05fUU9TX1JFUVVFU1RfVElNRU9VVDsKKwkJcERMUy0+VmFsaWQJCT0gRkFMU0U7CisJCXBETFMtPlN0YXR1cwk9IERMU19OT05FOworCQlEbHNQYXJtRmlsbChwQWQsICZNbG1lRGxzUmVxLCBwRExTLCByZWFzb24pOworCQlNbG1lRW5xdWV1ZShwQWQsIERMU19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9ETFNfVEVBUl9ET1dOLCBzaXplb2YoTUxNRV9ETFNfUkVRX1NUUlVDVCksICZNbG1lRGxzUmVxKTsKKwkJUlQyOFhYX01MTUVfSEFORExFUihwQWQpOworCX0KK30KKworLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0Rlc2NyaXB0aW9uIDogYmVjYXVzZSBETFMgYW5kIENMSSBzaGFyZSB0aGUgc2FtZSBXQ0lEIHRhYmxlIGluIEFTSUMuCitNZXNoIGVudHJ5IGFsc28gaW5zZXJ0IHRvIHBBZC0+TWFjVGFiLmNvbnRlbnRbXS4gIFN1Y2ggaXMgbWFya2VkIGFzIFZhbGlkQXNEbHMgPSBUUlVFLgorQWxzbyBmaWxscyB0aGUgcGFpcndpc2Uga2V5LgorQmVjYXVzZSBmcm9udCBNQVhfQUlEX0JBIGVudHJpZXMgaGF2ZSBkaXJlY3QgbWFwcGluZyB0byBCQUVudHJ5LCB3aGljaCBpcyBvbmx5IHVzZWQgYXMgQ0xJLiBTbyB3ZSBpbnNlcnQgRGxzCitmcm9tIGluZGV4IE1BWF9BSURfQkEuCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworTUFDX1RBQkxFX0VOVFJZICpNYWNUYWJsZUluc2VydERsc0VudHJ5KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBQVUNIQVIJcEFkZHIsCisJSU4gIFVJTlQJRGxzRW50cnlJZHgpCit7CisJUE1BQ19UQUJMRV9FTlRSWSBwRW50cnkgPSBOVUxMOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PT4gTWFjVGFibGVJbnNlcnREbHNFbnRyeVxuIikpOworCS8vIGlmIEZVTEwsIHJldHVybgorCWlmIChwQWQtPk1hY1RhYi5TaXplID49IE1BWF9MRU5fT0ZfTUFDX1RBQkxFKQorCQlyZXR1cm4gTlVMTDsKKworCWRvCisJeworCQlpZigocEVudHJ5ID0gRGxzRW50cnlUYWJsZUxvb2t1cChwQWQsIHBBZGRyLCBUUlVFKSkgIT0gTlVMTCkKKwkJCWJyZWFrOworCisJCS8vIGFsbG9jYXRlIG9uZSBNQUMgZW50cnkKKwkJcEVudHJ5ID0gTWFjVGFibGVJbnNlcnRFbnRyeShwQWQsIHBBZGRyLCBEbHNFbnRyeUlkeCArIE1JTl9ORVRfREVWSUNFX0ZPUl9ETFMsIFRSVUUpOworCQlpZiAocEVudHJ5KQorCQl7CisJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtEbHNFbnRyeUlkeF0uTWFjVGFiTWF0Y2hXQ0lEID0gcEVudHJ5LT5BaWQ7CisJCQlwRW50cnktPk1hdGNoRGxzRW50cnlJZHggPSBEbHNFbnRyeUlkeDsKKwkJCXBFbnRyeS0+QXV0aE1vZGUgPSBwQWQtPlN0YUNmZy5BdXRoTW9kZTsKKwkJCXBFbnRyeS0+V2VwU3RhdHVzID0gcEFkLT5TdGFDZmcuV2VwU3RhdHVzOworCQkJcEVudHJ5LT5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEOworCisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNYWNUYWJsZUluc2VydERsc0VudHJ5IC0gYWxsb2NhdGUgZW50cnkgIyVkLCBUb3RhbD0gJWRcbiIscEVudHJ5LT5BaWQsIHBBZC0+TWFjVGFiLlNpemUpKTsKKworCQkJLy8gSWYgbGVnYWN5IFdFUCBpcyB1c2VkLCBzZXQgcGFpci13aXNlIGNpcGhlckFsZyBpbnRvIFdDSUQgYXR0cmlidXRlIHRhYmxlIGZvciB0aGlzIGVudHJ5CisJCQlpZiAoKHBFbnRyeS0+VmFsaWRBc0RscykgJiYgKHBFbnRyeS0+V2VwU3RhdHVzID09IE5kaXM4MDJfMTFXRVBFbmFibGVkKSkKKwkJCXsKKwkJCQlVQ0hBUiBLZXlJZHggPSAwOworCQkJCVVDSEFSIENpcGhlckFsZyA9IDA7CisKKwkJCQlLZXlJZHgJPSBwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQ7CisKKwkJCQlDaXBoZXJBbGcgCT0gcEFkLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5DaXBoZXJBbGc7CisKKwkJCQlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZCwKKwkJCQkJCQkJCQkJQlNTMCwKKwkJCQkJCQkJCQkJcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkLAorCQkJCQkJCQkJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLkNpcGhlckFsZywKKwkJCQkJCQkJCQkJcEVudHJ5KTsKKwkJCX0KKworCQkJYnJlYWs7CisJCX0KKwl9IHdoaWxlKEZBTFNFKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PT09IE1hY1RhYmxlSW5zZXJ0RGxzRW50cnlcbiIpKTsKKworCXJldHVybiBwRW50cnk7Cit9CisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlEZWxldGUgYWxsIE1lc2ggRW50cnkgaW4gcEFkLT5NYWNUYWIKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitCT09MRUFOIE1hY1RhYmxlRGVsZXRlRGxzRW50cnkoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVVNIT1JUIHdjaWQsCisJSU4gUFVDSEFSIHBBZGRyKQoreworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT0+IE1hY1RhYmxlRGVsZXRlRGxzRW50cnlcbiIpKTsKKworCWlmICghVkFMSURfV0NJRCh3Y2lkKSkKKwkJcmV0dXJuIEZBTFNFOworCisJTWFjVGFibGVEZWxldGVFbnRyeShwQWQsIHdjaWQsIHBBZGRyKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PT09IE1hY1RhYmxlRGVsZXRlRGxzRW50cnlcbiIpKTsKKworCXJldHVybiBUUlVFOworfQorCitNQUNfVEFCTEVfRU5UUlkgKkRsc0VudHJ5VGFibGVMb29rdXAoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gUFVDSEFSCXBBZGRyLAorCUlOIEJPT0xFQU4JYlJlc2V0SWRlbENvdW50KQoreworCVVMT05HIEhhc2hJZHg7CisJTUFDX1RBQkxFX0VOVFJZICpwRW50cnkgPSBOVUxMOworCisJUlRNUF9TRU1fTE9DSygmcEFkLT5NYWNUYWJMb2NrKTsKKwlIYXNoSWR4ID0gTUFDX0FERFJfSEFTSF9JTkRFWChwQWRkcik7CisJcEVudHJ5ID0gcEFkLT5NYWNUYWIuSGFzaFtIYXNoSWR4XTsKKworCXdoaWxlIChwRW50cnkpCisJeworCQlpZiAoKHBFbnRyeS0+VmFsaWRBc0RscyA9PSBUUlVFKQorCQkJJiYgTUFDX0FERFJfRVFVQUwocEVudHJ5LT5BZGRyLCBwQWRkcikpCisJCXsKKwkJCWlmKGJSZXNldElkZWxDb3VudCkKKwkJCQlwRW50cnktPk5vRGF0YUlkbGVDb3VudCA9IDA7CisJCQlicmVhazsKKwkJfQorCQllbHNlCisJCQlwRW50cnkgPSBwRW50cnktPnBOZXh0OworCX0KKworCVJUTVBfU0VNX1VOTE9DSygmcEFkLT5NYWNUYWJMb2NrKTsKKwlyZXR1cm4gcEVudHJ5OworfQorCitNQUNfVEFCTEVfRU5UUlkgKkRsc0VudHJ5VGFibGVMb29rdXBCeVdjaWQoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVUNIQVIJd2NpZCwKKwlJTiBQVUNIQVIJcEFkZHIsCisJSU4gQk9PTEVBTgliUmVzZXRJZGVsQ291bnQpCit7CisJVUxPTkcgRExzSW5kZXg7CisJUE1BQ19UQUJMRV9FTlRSWSBwQ3VyRW50cnkgPSBOVUxMOworCVBNQUNfVEFCTEVfRU5UUlkgcEVudHJ5ID0gTlVMTDsKKworCWlmICghVkFMSURfV0NJRCh3Y2lkKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlSVE1QX1NFTV9MT0NLKCZwQWQtPk1hY1RhYkxvY2spOworCisJZG8KKwl7CisJCXBDdXJFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W3djaWRdOworCisJCURMc0luZGV4ID0gMHhmZjsKKwkJaWYgKChwQ3VyRW50cnkpICYmIChwQ3VyRW50cnktPlZhbGlkQXNEbHM9PSBUUlVFKSkKKwkJeworCQkJRExzSW5kZXggPSBwQ3VyRW50cnktPk1hdGNoRGxzRW50cnlJZHg7CisJCX0KKworCQlpZiAoRExzSW5kZXggPT0gMHhmZikKKwkJCWJyZWFrOworCisJCWlmIChNQUNfQUREUl9FUVVBTChwQ3VyRW50cnktPkFkZHIsIHBBZGRyKSkKKwkJeworCQkJaWYoYlJlc2V0SWRlbENvdW50KQorCQkJCXBDdXJFbnRyeS0+Tm9EYXRhSWRsZUNvdW50ID0gMDsKKwkJCXBFbnRyeSA9IHBDdXJFbnRyeTsKKwkJCWJyZWFrOworCQl9CisJfSB3aGlsZShGQUxTRSk7CisKKwlSVE1QX1NFTV9VTkxPQ0soJnBBZC0+TWFjVGFiTG9jayk7CisKKwlyZXR1cm4gcEVudHJ5OworfQorCitJTlQgU2V0X0Rsc0VudHJ5SW5mb19EaXNwbGF5X1Byb2MoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gUFVDSEFSIGFyZykKK3sKKwlJTlQgaTsKKworCXByaW50aygiXG4lLTE5cyUtOHNcbiIsICJNQUMiLCAiVElNRU9VVFxuIik7CisJZm9yIChpPTA7IGk8TUFYX05VTV9PRl9ETFNfRU5UUlk7IGkrKykKKwl7CisJCWlmICgocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQpICYmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPT0gRExTX0ZJTklTSCkpCisJCXsKKwkJCVBNQUNfVEFCTEVfRU5UUlkgcEVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjVGFiTWF0Y2hXQ0lEXTsKKworCQkJcHJpbnRrKCIlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCAgIiwKKwkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyWzBdLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyWzFdLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyWzJdLAorCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHJbM10sIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHJbNF0sIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHJbNV0pOworCQkJcHJpbnRrKCIlLThkXG4iLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5UaW1lT3V0KTsKKworCQkJcHJpbnRrKCJcbiIpOworCQkJcHJpbnRrKCJcbiUtMTlzJS00cyUtNHMlLTRzJS00cyUtOHMlLTdzJS03cyUtN3MlLTEwcyUtNnMlLTZzJS02cyUtNnNcbiIsCisJCQkJICAgIk1BQyIsICJBSUQiLCAiQlNTIiwgIlBTTSIsICJXTU0iLCAiTUlNT1BTIiwgIlJTU0kwIiwgIlJTU0kxIiwgIlJTU0kyIiwgIlBoTWQiLCAiQlciLCAiTUNTIiwgIlNHSSIsICJTVEJDIik7CisJCQlwcmludGsoIiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYICAiLAorCQkJCXBFbnRyeS0+QWRkclswXSwgcEVudHJ5LT5BZGRyWzFdLCBwRW50cnktPkFkZHJbMl0sCisJCQkJcEVudHJ5LT5BZGRyWzNdLCBwRW50cnktPkFkZHJbNF0sIHBFbnRyeS0+QWRkcls1XSk7CisJCQlwcmludGsoIiUtNGQiLCAoaW50KXBFbnRyeS0+QWlkKTsKKwkJCXByaW50aygiJS00ZCIsIChpbnQpcEVudHJ5LT5hcGlkeCk7CisJCQlwcmludGsoIiUtNGQiLCAoaW50KXBFbnRyeS0+UHNNb2RlKTsKKwkJCXByaW50aygiJS00ZCIsIChpbnQpQ0xJRU5UX1NUQVRVU19URVNUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19XTU1fQ0FQQUJMRSkpOworCQkJcHJpbnRrKCIlLThkIiwgKGludClwRW50cnktPk1tcHNNb2RlKTsKKwkJCXByaW50aygiJS03ZCIsIHBFbnRyeS0+UnNzaVNhbXBsZS5BdmdSc3NpMCk7CisJCQlwcmludGsoIiUtN2QiLCBwRW50cnktPlJzc2lTYW1wbGUuQXZnUnNzaTEpOworCQkJcHJpbnRrKCIlLTdkIiwgcEVudHJ5LT5Sc3NpU2FtcGxlLkF2Z1Jzc2kyKTsKKwkJCXByaW50aygiJS0xMHMiLCBHZXRQaHlNb2RlKHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1PREUpKTsKKwkJCXByaW50aygiJS02cyIsIEdldEJXKHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLkJXKSk7CisJCQlwcmludGsoIiUtNmQiLCBwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NQ1MpOworCQkJcHJpbnRrKCIlLTZkIiwgcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuU2hvcnRHSSk7CisJCQlwcmludGsoIiUtNmQiLCBwRW50cnktPkhUUGh5TW9kZS5maWVsZC5TVEJDKTsKKwkJCXByaW50aygiJS0xMGQsICVkLCAlZCUlXG4iLCBwRW50cnktPkRlYnVnRklGT0NvdW50LCBwRW50cnktPkRlYnVnVHhDb3VudCwKKwkJCQkJCShwRW50cnktPkRlYnVnVHhDb3VudCkgPyAoKHBFbnRyeS0+RGVidWdUeENvdW50LXBFbnRyeS0+RGVidWdGSUZPQ291bnQpKjEwMC9wRW50cnktPkRlYnVnVHhDb3VudCkgOiAwKTsKKwkJCXByaW50aygiXG4iKTsKKworCQl9CisJfQorCisJcmV0dXJuIFRSVUU7Cit9CisKK0lOVAlTZXRfRGxzQWRkRW50cnlfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisgICAgVUNIQVIJbWFjW01BQ19BRERSX0xFTl07CisJVVNIT1JUCVRpbWVvdXQ7CisJY2hhciAqdG9rZW4sIHNlcFZhbHVlW10gPSAiOiIsIERBU0ggPSAnLSc7CisJSU5UIGk7CisgICAgUlRfODAyXzExX0RMUwlEbHM7CisKKyAgICBpZihzdHJsZW4oYXJnKSA8IDE5KSAgLy9NYWMgYWRkcmVzcyBhY2NlcHRhYmxlIGZvcm1hdCAwMTowMjowMzowNDowNTowNiBsZW5ndGggMTcgcGx1cyB0aGUgIi0iIGFuZCB0aW1lb3V0IHZhbHVlIGluIGRlY2ltYWwgZm9ybWF0LgorCQlyZXR1cm4gRkFMU0U7CisKKwl0b2tlbiA9IHN0cmNocihhcmcsIERBU0gpOworCWlmICgodG9rZW4gIT0gTlVMTCkgJiYgKHN0cmxlbih0b2tlbik+MSkpCisJeworCQlUaW1lb3V0ID0gc2ltcGxlX3N0cnRvbCgodG9rZW4rMSksIDAsIDEwKTsKKworCQkqdG9rZW4gPSAnXDAnOworCQlmb3IgKGkgPSAwLCB0b2tlbiA9IHJzdHJ0b2soYXJnLCAmc2VwVmFsdWVbMF0pOyB0b2tlbjsgdG9rZW4gPSByc3RydG9rKE5VTEwsICZzZXBWYWx1ZVswXSksIGkrKykKKwkJeworCQkJaWYoKHN0cmxlbih0b2tlbikgIT0gMikgfHwgKCFpc3hkaWdpdCgqdG9rZW4pKSB8fCAoIWlzeGRpZ2l0KCoodG9rZW4rMSkpKSkKKwkJCQlyZXR1cm4gRkFMU0U7CisJCQlBdG9IKHRva2VuLCAoUFVDSEFSKSgmbWFjW2ldKSwgMSk7CisJCX0KKwkJaWYoaSAhPSA2KQorCQkJcmV0dXJuIEZBTFNFOworCisJICAgIHByaW50aygiXG4lMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeC0lZCIsIG1hY1swXSwgbWFjWzFdLAorCSAgICAgICAgICAgbWFjWzJdLCBtYWNbM10sIG1hY1s0XSwgbWFjWzVdLCAoaW50KVRpbWVvdXQpOworCisJCU5kaXNaZXJvTWVtb3J5KCZEbHMsIHNpemVvZihSVF84MDJfMTFfRExTKSk7CisJCURscy5UaW1lT3V0ID0gVGltZW91dDsKKwkJQ09QWV9NQUNfQUREUihEbHMuTWFjQWRkciwgbWFjKTsKKwkJRGxzLlZhbGlkID0gMTsKKworCQlNbG1lRW5xdWV1ZShwQWQsCisJCQkJCU1MTUVfQ05UTF9TVEFURV9NQUNISU5FLAorCQkJCQlSVF9PSURfODAyXzExX1NFVF9ETFNfUEFSQU0sCisJCQkJCXNpemVvZihSVF84MDJfMTFfRExTKSwKKwkJCQkJJkRscyk7CisKKwkJcmV0dXJuIFRSVUU7CisJfQorCisJcmV0dXJuIEZBTFNFOworCit9CisKK0lOVAlTZXRfRGxzVGVhckRvd25FbnRyeV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVQ0hBUgkJCW1hY0FkZHJbTUFDX0FERFJfTEVOXTsKKwlDSEFSCQkJKnZhbHVlOworCUlOVAkJCQlpOworCVJUXzgwMl8xMV9ETFMJRGxzOworCisJaWYoc3RybGVuKGFyZykgIT0gMTcpICAvL01hYyBhZGRyZXNzIGFjY2VwdGFibGUgZm9ybWF0IDAxOjAyOjAzOjA0OjA1OjA2IGxlbmd0aCAxNworCQlyZXR1cm4gRkFMU0U7CisKKwlmb3IgKGk9MCwgdmFsdWUgPSByc3RydG9rKGFyZywiOiIpOyB2YWx1ZTsgdmFsdWUgPSByc3RydG9rKE5VTEwsIjoiKSkKKwl7CisJCWlmKChzdHJsZW4odmFsdWUpICE9IDIpIHx8ICghaXN4ZGlnaXQoKnZhbHVlKSkgfHwgKCFpc3hkaWdpdCgqKHZhbHVlKzEpKSkgKQorCQkJcmV0dXJuIEZBTFNFOyAgLy9JbnZhbGlkCisKKwkJQXRvSCh2YWx1ZSwgJm1hY0FkZHJbaSsrXSwgMik7CisJfQorCisJcHJpbnRrKCJcbiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IiwgbWFjQWRkclswXSwgbWFjQWRkclsxXSwKKwkgICAgICAgICAgIG1hY0FkZHJbMl0sIG1hY0FkZHJbM10sIG1hY0FkZHJbNF0sIG1hY0FkZHJbNV0pOworCisJTmRpc1plcm9NZW1vcnkoJkRscywgc2l6ZW9mKFJUXzgwMl8xMV9ETFMpKTsKKwlDT1BZX01BQ19BRERSKERscy5NYWNBZGRyLCBtYWNBZGRyKTsKKwlEbHMuVmFsaWQgPSAwOworCisJTWxtZUVucXVldWUocEFkLAorCQkJCU1MTUVfQ05UTF9TVEFURV9NQUNISU5FLAorCQkJCVJUX09JRF84MDJfMTFfU0VUX0RMU19QQVJBTSwKKwkJCQlzaXplb2YoUlRfODAyXzExX0RMUyksCisJCQkJJkRscyk7CisKKwlyZXR1cm4gVFJVRTsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zdGEvcnRtcF9kYXRhLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3N0YS9ydG1wX2RhdGEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmFmZjI0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zdGEvcnRtcF9kYXRhLmMKQEAgLTAsMCArMSwyNjE0IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCU1vZHVsZSBOYW1lOgorCXJ0bXBfZGF0YS5jCisKKwlBYnN0cmFjdDoKKwlEYXRhIHBhdGggc3Vicm91dGluZXMKKworCVJldmlzaW9uIEhpc3Rvcnk6CisJV2hvIAkJV2hlbgkJCVdoYXQKKwktLS0tLS0tLQktLS0tLS0tLS0tCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJSm9obgkJICAgICAgQXVnLzE3LzA0CQltYWpvciBtb2RpZmljYXRpb24gZm9yIFJUMjU2MS8yNjYxCisJSmFuIExlZQkgICAgICBNYXIvMTcvMDYJCW1ham9yIG1vZGlmaWNhdGlvbiBmb3IgUlQyODYwIE5ldyBSaW5nIERlc2lnbgorKi8KKyNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKKworCisKK1ZPSUQgU1RBUnhFQVBPTEZyYW1lSW5kaWNhdGUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JTUFDX1RBQkxFX0VOVFJZCSpwRW50cnksCisJSU4JUlhfQkxLCQkJKnBSeEJsaywKKwlJTglVQ0hBUgkJCUZyb21XaGljaEJTU0lEKQoreworCVBSVDI4WFhfUlhEX1NUUlVDCXBSeEQgPSAmKHBSeEJsay0+UnhEKTsKKwlQUlhXSV9TVFJVQwkJcFJ4V0kgPSBwUnhCbGstPnBSeFdJOworCVVDSEFSCQkJKnBUbXBCdWY7CisKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisJaWYgKHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCkKKwl7CisJCS8vIEFsbCBFQVBvTCBmcmFtZXMgaGF2ZSB0byBwYXNzIHRvIHVwcGVyIGxheWVyIChleC4gV1BBX1NVUFBMSUNBTlQgZGFlbW9uKQorCQkvLyBUQkQgOiBwcm9jZXNzIGZyYWdtZW50ZWQgRUFQb2wgZnJhbWVzCisJCXsKKwkJCS8vIEluIDgwMi4xeCBtb2RlLCBpZiB0aGUgcmVjZWl2ZWQgZnJhbWUgaXMgRUFQLVNVQ0NFU1MgcGFja2V0LCB0dXJuIG9uIHRoZSBQb3J0U2VjdXJlZCB2YXJpYWJsZQorCQkJaWYgKCBwQWQtPlN0YUNmZy5JRUVFODAyMVggPT0gVFJVRSAmJgorCQkJCSAoRUFQX0NPREVfU1VDQ0VTUyA9PSBXcGFDaGVja0VhcENvZGUocEFkLCBwUnhCbGstPnBEYXRhLCBwUnhCbGstPkRhdGFTaXplLCBMRU5HVEhfODAyXzFfSCkpKQorCQkJeworCQkJCVBVQ0hBUglLZXk7CisJCQkJVUNIQVIgCUNpcGhlckFsZzsKKwkJCQlpbnQgICAgIGlkeCA9IDA7CisKKwkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiUmVjZWl2ZSBFQVAtU1VDQ0VTUyBQYWNrZXRcbiIpKTsKKwkJCQlTVEFfUE9SVF9TRUNVUkVEKHBBZCk7CisKKyAgICAgICAgICAgICAgICBpZiAocEFkLT5TdGFDZmcuSUVFRTgwMjF4X3JlcXVpcmVkX2tleXMgPT0gRkFMU0UpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZHggPSBwQWQtPlN0YUNmZy5EZXNpcmVTaGFyZWRLZXlJZDsKKyAgICAgICAgICAgICAgICAgICAgQ2lwaGVyQWxnID0gcEFkLT5TdGFDZmcuRGVzaXJlU2hhcmVkS2V5W2lkeF0uQ2lwaGVyQWxnOworCQkJCQlLZXkgPSBwQWQtPlN0YUNmZy5EZXNpcmVTaGFyZWRLZXlbaWR4XS5LZXk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBBZC0+U3RhQ2ZnLkRlc2lyZVNoYXJlZEtleVtpZHhdLktleUxlbiA+IDApCisgICAgCQkJCXsKKyNpZmRlZiBSVDI4NjAKKwkJCQkJCU1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF07CisKKwkJCQkJCS8vIFNldCBrZXkgbWF0ZXJpYWwgYW5kIGNpcGhlckFsZyB0byBBc2ljCisJCQkJCQlBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkLCBCU1MwLCBpZHgsIENpcGhlckFsZywgS2V5LCBOVUxMLCBOVUxMKTsKKworCQkJCQkJLy8gQXNzaWduIGdyb3VwIGtleSBpbmZvCisJCQkJCQlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZCwgQlNTMCwgaWR4LCBDaXBoZXJBbGcsIE5VTEwpOworCisJCQkJCQkvLyBBc3NpZ24gcGFpcndpc2Uga2V5IGluZm8KKwkJCQkJCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkocEFkLCBCU1MwLCBpZHgsIENpcGhlckFsZywgcEVudHJ5KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZUNvbm5lY3RlZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBBZC0+RXh0cmFJbmZvID0gR0VORVJBTF9MSU5LX1VQOworI2VuZGlmIC8vIFJUMjg2MCAvLworCQkJCQkJLy8gRm9yIFByZXZlbnRpbmcgU2hhcmRLZXkgVGFibGUgaXMgY2xlYXJlZCBieSByZW1vdmUga2V5IHByb2NlZHVyZS4KKyAgICAJCQkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW2lkeF0uQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOworCQkJCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1baWR4XS5LZXlMZW4gPSBwQWQtPlN0YUNmZy5EZXNpcmVTaGFyZWRLZXlbaWR4XS5LZXlMZW47CisJCQkJCQlOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVtpZHhdLktleSwKKwkJCQkJCQkJCSAgIHBBZC0+U3RhQ2ZnLkRlc2lyZVNoYXJlZEtleVtpZHhdLktleSwKKwkJCQkJCQkJCSAgIHBBZC0+U3RhQ2ZnLkRlc2lyZVNoYXJlZEtleVtpZHhdLktleUxlbik7CisgICAgCQkJCX0KKwkJCQl9CisJCQl9CisKKwkJCUluZGljYXRlX0xlZ2FjeV9QYWNrZXQocEFkLCBwUnhCbGssIEZyb21XaGljaEJTU0lEKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKwllbHNlCisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCXsKKwkJLy8gU3BlY2lhbCBEQVRBIGZyYW1lIHRoYXQgaGFzIHRvIHBhc3MgdG8gTUxNRQorCQkvLwkgMS4gQ2lzY28gQWlyb25ldCBmcmFtZXMgZm9yIENDWDIuIFdlIG5lZWQgcGFzcyBpdCB0byBNTE1FIGZvciBzcGVjaWFsIHByb2Nlc3MKKwkJLy8JIDIuIEVBUE9MIGhhbmRzaGFraW5nIGZyYW1lcyB3aGVuIGRyaXZlciBzdXBwbGljYW50IGVuYWJsZWQsIHBhc3MgdG8gTUxNRSBmb3Igc3BlY2lhbCBwcm9jZXNzCisJCXsKKwkJCXBUbXBCdWYgPSBwUnhCbGstPnBEYXRhIC0gTEVOR1RIXzgwMl8xMTsKKwkJCU5kaXNNb3ZlTWVtb3J5KHBUbXBCdWYsIHBSeEJsay0+cEhlYWRlciwgTEVOR1RIXzgwMl8xMSk7CisJCQlSRVBPUlRfTUdNVF9GUkFNRV9UT19NTE1FKHBBZCwgcFJ4V0ktPldpcmVsZXNzQ2xpSUQsIHBUbXBCdWYsIHBSeEJsay0+RGF0YVNpemUgKyBMRU5HVEhfODAyXzExLCBwUnhXSS0+UlNTSTAsIHBSeFdJLT5SU1NJMSwgcFJ4V0ktPlJTU0kyLCBwUnhELT5QbGNwU2lnbmFsKTsKKwkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCIhISEgcmVwb3J0IEVBUE9ML0FJUk9ORVQgREFUQSB0byBNTE1FIChsZW49JWQpICEhIVxuIiwgcFJ4QmxrLT5EYXRhU2l6ZSkpOworCQl9CisJfQorCisJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeEJsay0+cFJ4UGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwlyZXR1cm47CisKK30KKworVk9JRCBTVEFSeERhdGFGcmFtZUFubm91bmNlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCU1BQ19UQUJMRV9FTlRSWQkqcEVudHJ5LAorCUlOCVJYX0JMSwkJCSpwUnhCbGssCisJSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCkKK3sKKworCS8vIG5vbi1FQVAgZnJhbWUKKwlpZiAoIVJUTVBDaGVja1dQQWZyYW1lKHBBZCwgcEVudHJ5LCBwUnhCbGstPnBEYXRhLCBwUnhCbGstPkRhdGFTaXplLCBGcm9tV2hpY2hCU1NJRCkpCisJeworCQl7CisJCQkvLyBkcm9wIGFsbCBub24tRUFQIERBVEEgZnJhbWUgYmVmb3JlCisJCQkvLyB0aGlzIGNsaWVudCdzIFBvcnQtQWNjZXNzLUNvbnRyb2wgaXMgc2VjdXJlZAorCQkJaWYgKHBSeEJsay0+cEhlYWRlci0+RkMuV2VwKQorCQkJeworCQkJCS8vIHVuc3VwcG9ydGVkIGNpcGhlciBzdWl0ZQorCQkJCWlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb25EaXNhYmxlZCkKKwkJCQl7CisJCQkJCS8vIHJlbGVhc2UgcGFja2V0CisJCQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhCbGstPnBSeFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCQkJCXJldHVybjsKKwkJCQl9CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJLy8gZW5jcnlwdGlvbiBpbi11c2UgYnV0IHJlY2VpdmUgYSBub24tRUFQT0wgY2xlYXIgdGV4dCBmcmFtZSwgZHJvcCBpdAorCQkJCWlmICgocEFkLT5TdGFDZmcuV2VwU3RhdHVzICE9IE5kaXM4MDJfMTFFbmNyeXB0aW9uRGlzYWJsZWQpICYmCisJCQkJCShwQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZCA9PSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQpKQorCQkJCXsKKwkJCQkJLy8gcmVsZWFzZSBwYWNrZXQKKwkJCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeEJsay0+cFJ4UGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCX0KKwkJfQorCQlSWF9CTEtfQ0xFQVJfRkxBRyhwUnhCbGssIGZSWF9FQVApOworCQlpZiAoIVJYX0JMS19URVNUX0ZMQUcocFJ4QmxrLCBmUlhfQVJBTElOSykpCisJCXsKKwkJCS8vIE5vcm1hbCBsZWdhY3ksIEFNUERVIG9yIEFNU0RVCisJCQlDbW1SeG5vblJhbGlua0ZyYW1lSW5kaWNhdGUocEFkLCBwUnhCbGssIEZyb21XaGljaEJTU0lEKTsKKworCQl9CisJCWVsc2UKKwkJeworCQkJLy8gQVJBTElOSworCQkJQ21tUnhSYWxpbmtGcmFtZUluZGljYXRlKHBBZCwgcEVudHJ5LCBwUnhCbGssIEZyb21XaGljaEJTU0lEKTsKKwkJfQorI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCQlSWF9CTEtfQ0xFQVJfRkxBRyhwUnhCbGssIGZSWF9ETFMpOworI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCX0KKwllbHNlCisJeworCQlSWF9CTEtfU0VUX0ZMQUcocFJ4QmxrLCBmUlhfRUFQKTsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJaWYgKFJYX0JMS19URVNUX0ZMQUcocFJ4QmxrLCBmUlhfQU1QRFUpICYmIChwQWQtPkNvbW1vbkNmZy5iRGlzYWJsZVJlb3JkZXJpbmcgPT0gMCkpCisJCXsKKwkJCUluZGljYXRlX0FNUERVX1BhY2tldChwQWQsIHBSeEJsaywgRnJvbVdoaWNoQlNTSUQpOworCQl9CisJCWVsc2UKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJeworCQkJLy8gRGV0ZXJtaW4gdGhlIGRlc3RpbmF0aW9uIG9mIHRoZSBFQVAgZnJhbWUKKwkJCS8vICB0byBXUEEgc3RhdGUgbWFjaGluZSBvciB1cHBlciBsYXllcgorCQkJU1RBUnhFQVBPTEZyYW1lSW5kaWNhdGUocEFkLCBwRW50cnksIHBSeEJsaywgRnJvbVdoaWNoQlNTSUQpOworCQl9CisJfQorfQorCisKKy8vIEZvciBUS0lQIGZyYW1lLCBjYWxjdWxhdGUgdGhlIE1JQyB2YWx1ZQorQk9PTEVBTiBTVEFDaGVja1RraXBNSUNWYWx1ZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglNQUNfVEFCTEVfRU5UUlkJKnBFbnRyeSwKKwlJTglSWF9CTEsJCQkqcFJ4QmxrKQoreworCVBIRUFERVJfODAyXzExCXBIZWFkZXIgPSBwUnhCbGstPnBIZWFkZXI7CisJVUNIQVIJCQkqcERhdGEgPSBwUnhCbGstPnBEYXRhOworCVVTSE9SVAkJCURhdGFTaXplID0gcFJ4QmxrLT5EYXRhU2l6ZTsKKwlVQ0hBUgkJCVVzZXJQcmlvcml0eSA9IHBSeEJsay0+VXNlclByaW9yaXR5OworCVBDSVBIRVJfS0VZCQlwV3BhS2V5OworCVVDSEFSCQkJKnBEQSwgKnBTQTsKKworCXBXcGFLZXkgPSAmcEFkLT5TaGFyZWRLZXlbQlNTMF1bcFJ4QmxrLT5wUnhXSS0+S2V5SW5kZXhdOworCisJcERBID0gcEhlYWRlci0+QWRkcjE7CisJaWYgKFJYX0JMS19URVNUX0ZMQUcocFJ4QmxrLCBmUlhfSU5GUkEpKQorCXsKKwkJcFNBID0gcEhlYWRlci0+QWRkcjM7CisJfQorCWVsc2UKKwl7CisJCXBTQSA9IHBIZWFkZXItPkFkZHIyOworCX0KKworCWlmIChSVE1QVGtpcENvbXBhcmVNSUNWYWx1ZShwQWQsCisJCQkJCQkJCXBEYXRhLAorCQkJCQkJCQlwREEsCisJCQkJCQkJCXBTQSwKKwkJCQkJCQkJcFdwYUtleS0+UnhNaWMsCisJCQkJCQkJCVVzZXJQcmlvcml0eSwKKwkJCQkJCQkJRGF0YVNpemUpID09IEZBTFNFKQorCXsKKwkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCgiUnggTUlDIFZhbHVlIGVycm9yIDJcbiIpKTsKKworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKwkJaWYgKHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCkKKwkJeworCQkJV3BhU2VuZE1pY0ZhaWx1cmVUb1dwYVN1cHBsaWNhbnQocEFkLCAocFdwYUtleS0+VHlwZSA9PSBQQUlSV0lTRUtFWSkgPyBUUlVFIDogRkFMU0UpOworCQl9CisJCWVsc2UKKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisJCXsKKwkJCVJUTVBSZXBvcnRNaWNFcnJvcihwQWQsIHBXcGFLZXkpOworCQl9CisKKwkJLy8gcmVsZWFzZSBwYWNrZXQKKwkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeEJsay0+cFJ4UGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCXJldHVybiBUUlVFOworfQorCisKKy8vCisvLyBBbGwgUnggcm91dGluZXMgdXNlIFJYX0JMSyBzdHJ1Y3R1cmUgdG8gaGFuZGUgcnggZXZlbnRzCisvLyBJdCBpcyB2ZXJ5IGltcG9ydGFudCB0byBidWlsZCBwUnhCbGsgYXR0cmlidXRlcworLy8gIDEuIHBIZWFkZXIgcG9pbnRlciB0byA4MDIuMTEgSGVhZGVyCisvLyAgMi4gcERhdGEgcG9pbnRlciB0byBwYXlsb2FkIGluY2x1ZGluZyBMTEMgKGp1c3Qgc2tpcCBIZWFkZXIpCisvLyAgMy4gc2V0IHBheWxvYWQgc2l6ZSBpbmNsdWRpbmcgTExDIHRvIERhdGFTaXplCisvLyAgNC4gc2V0IHNvbWUgZmxhZ3Mgd2l0aCBSWF9CTEtfU0VUX0ZMQUcoKQorLy8KK1ZPSUQgU1RBSGFuZGxlUnhEYXRhRnJhbWUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUlhfQkxLCQkJKnBSeEJsaykKK3sKKwlQUlQyOFhYX1JYRF9TVFJVQwkJCQlwUnhEID0gJihwUnhCbGstPlJ4RCk7CisJUFJYV0lfU1RSVUMJCQkJCQlwUnhXSSA9IHBSeEJsay0+cFJ4V0k7CisJUEhFQURFUl84MDJfMTEJCQkJCXBIZWFkZXIgPSBwUnhCbGstPnBIZWFkZXI7CisJUE5ESVNfUEFDS0VUCQkJCQlwUnhQYWNrZXQgPSBwUnhCbGstPnBSeFBhY2tldDsKKwlCT09MRUFOIAkJCQkJCWJGcmFnbWVudCA9IEZBTFNFOworCU1BQ19UQUJMRV9FTlRSWQkgICAgCQkJKnBFbnRyeSA9IE5VTEw7CisJVUNIQVIJCQkJCQkJRnJvbVdoaWNoQlNTSUQgPSBCU1MwOworCVVDSEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlclByaW9yaXR5ID0gMDsKKworCXsKKwkJLy8gYmVmb3JlIExJTksgVVAsIGFsbCBEQVRBIGZyYW1lcyBhcmUgcmVqZWN0ZWQKKwkJaWYgKCFPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCkpCisJCXsKKwkJCS8vIHJlbGVhc2UgcGFja2V0CisJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4UGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJCXJldHVybjsKKwkJfQorCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJCS8vaWYgKChwSGVhZGVyLT5GQy5GckRzID09IDApICYmIChwSGVhZGVyLT5GQy5Ub0RzID09IDApKQorCQlpZiAoUlRNUFJjdkZyYW1lRExTQ2hlY2socEFkLCBwSGVhZGVyLCBwUnhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50LCBwUnhEKSkKKwkJeworCQkJcmV0dXJuOworCQl9CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisKKwkJLy8gRHJvcCBub3QgbXkgQlNTIGZyYW1lcworCQlpZiAocFJ4RC0+TXlCc3MgPT0gMCkKKwkJeworCQkJeworCQkJCS8vIHJlbGVhc2UgcGFja2V0CisJCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCQkJcmV0dXJuOworCQkJfQorCQl9CisKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5SeENvdW50U2luY2VMYXN0TlVMTCsrOworCQlpZiAocEFkLT5Db21tb25DZmcuYkFQU0RDYXBhYmxlICYmIHBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uYkFQU0RDYXBhYmxlICYmIChwSGVhZGVyLT5GQy5TdWJUeXBlICYgMHgwOCkpCisJCXsKKwkJCVVDSEFSICpwRGF0YTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiYkFQU0RDYXBhYmxlXG4iKSk7CisKKwkJCS8vIFFvcyBiaXQgNAorCQkJcERhdGEgPSAoUFVDSEFSKXBIZWFkZXIgKyBMRU5HVEhfODAyXzExOworCQkJaWYgKCgqcERhdGEgPj4gNCkgJiAweDAxKQorCQkJeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUnhEb25lLSBSY3YgRU9TUCBmcmFtZSwgZHJpdmVyIG1heSBmYWxsIGludG8gc2xlZXBcbiIpKTsKKwkJCQlwQWQtPkNvbW1vbkNmZy5iSW5TZXJ2aWNlUGVyaW9kID0gRkFMU0U7CisKKwkJCQkvLyBGb3JjZSBkcml2ZXIgdG8gZmFsbCBpbnRvIHNsZWVwIG1vZGUgd2hlbiByY3YgRU9TUCBmcmFtZQorCQkJCWlmICghT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKSkKKwkJCQl7CisJCQkJCVVTSE9SVCAgVGJ0dE51bVRvTmV4dFdha2VVcDsKKwkJCQkJVVNIT1JUICBOZXh0RHRpbSA9IHBBZC0+U3RhQ2ZnLkR0aW1QZXJpb2Q7CisJCQkJCVVMT05HICAgTm93OworCisJCQkJCU5kaXNHZXRTeXN0ZW1VcFRpbWUoJk5vdyk7CisJCQkJCU5leHREdGltIC09IChVU0hPUlQpKE5vdyAtIHBBZC0+U3RhQ2ZnLkxhc3RCZWFjb25SeFRpbWUpL3BBZC0+Q29tbW9uQ2ZnLkJlYWNvblBlcmlvZDsKKworCQkJCQlUYnR0TnVtVG9OZXh0V2FrZVVwID0gcEFkLT5TdGFDZmcuRGVmYXVsdExpc3RlbkNvdW50OworCQkJCQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19SRUNFSVZFX0RUSU0pICYmIChUYnR0TnVtVG9OZXh0V2FrZVVwID4gTmV4dER0aW0pKQorCQkJCQkJVGJ0dE51bVRvTmV4dFdha2VVcCA9IE5leHREdGltOworCisJCQkJCU1sbWVTZXRQc21CaXQocEFkLCBQV1JfU0FWRSk7CisJCQkJCS8vIGlmIFdNTS1BUFNEIGlzIGZhaWxlZCwgdHJ5IHRvIGRpc2FibGUgZm9sbG93aW5nIGxpbmUKKwkJCQkJQXNpY1NsZWVwVGhlbkF1dG9XYWtldXAocEFkLCBUYnR0TnVtVG9OZXh0V2FrZVVwKTsKKwkJCQl9CisJCQl9CisKKwkJCWlmICgocEhlYWRlci0+RkMuTW9yZURhdGEpICYmIChwQWQtPkNvbW1vbkNmZy5iSW5TZXJ2aWNlUGVyaW9kKSkKKwkJCXsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlNlbmRpbmcgYW5vdGhlciB0cmlnZ2VyIGZyYW1lIHdoZW4gTW9yZSBEYXRhIGJpdCBpcyBzZXQgdG8gMVxuIikpOworCQkJfQorCQl9CisKKwkJLy8gRHJvcCBOVUxMLCBDRi1BQ0sobm8gZGF0YSksIENGLVBPTEwobm8gZGF0YSksIGFuZCBDRi1BQ0srQ0YtUE9MTChubyBkYXRhKSBkYXRhIGZyYW1lCisJCWlmICgocEhlYWRlci0+RkMuU3ViVHlwZSAmIDB4MDQpKSAvLyBiaXQgMiA6IG5vIERBVEEKKwkJeworCQkJLy8gcmVsZWFzZSBwYWNrZXQKKwkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCQkJcmV0dXJuOworCQl9CisKKwkgICAgLy8gRHJvcCBub3QgbXkgQlNTIGZyYW1lICh3ZSBjYW4gbm90IG9ubHkgY2hlY2sgdGhlIE15QnNzIGJpdCBpbiBSeEQpCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJICAgIGlmICghcEFkLT5Db21tb25DZmcuYkRMU0NhcGFibGUpCisJICAgIHsKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKwkJaWYgKElORlJBX09OKHBBZCkpCisJCXsKKwkJCS8vIEluZnJhc3RydWN0dXJlIG1vZGUsIGNoZWNrIGFkZHJlc3MgMiBmb3IgQlNTSUQKKwkJCWlmICghUlRNUEVxdWFsTWVtb3J5KCZwSGVhZGVyLT5BZGRyMiwgJnBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCA2KSkKKwkJCXsKKwkJCQkvLyBSZWNlaXZlIGZyYW1lIG5vdCBteSBCU1NJRAorCSAgICAgICAgICAgIC8vIHJlbGVhc2UgcGFja2V0CisJICAgICAgICAgICAgUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCQkJcmV0dXJuOworCQkJfQorCQl9CisJCWVsc2UJLy8gQWQtSG9jIG1vZGUgb3IgTm90IGFzc29jaWF0ZWQKKwkJeworCQkJLy8gQWQtSG9jIG1vZGUsIGNoZWNrIGFkZHJlc3MgMyBmb3IgQlNTSUQKKwkJCWlmICghUlRNUEVxdWFsTWVtb3J5KCZwSGVhZGVyLT5BZGRyMywgJnBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCA2KSkKKwkJCXsKKwkJCQkvLyBSZWNlaXZlIGZyYW1lIG5vdCBteSBCU1NJRAorCSAgICAgICAgICAgIC8vIHJlbGVhc2UgcGFja2V0CisJICAgICAgICAgICAgUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCQkJcmV0dXJuOworCQkJfQorCQl9CisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJICAgIH0KKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKworCQkvLworCQkvLyBmaW5kIHBFbnRyeQorCQkvLworCQlpZiAocFJ4V0ktPldpcmVsZXNzQ2xpSUQgPCBNQVhfTEVOX09GX01BQ19UQUJMRSkKKwkJeworCQkJcEVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbcFJ4V0ktPldpcmVsZXNzQ2xpSURdOworCQl9CisJCWVsc2UKKwkJeworCQkJLy8gMS4gcmVsZWFzZSBwYWNrZXQgaWYgaW5mcmEgbW9kZQorCQkJLy8gMi4gbmV3IGEgcEVudHJ5IGlmIGFkLWhvYyBtb2RlCisJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4UGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJCXJldHVybjsKKwkJfQorCisJCS8vIGluZnJhIG9yIGFkLWhvYworCQlpZiAoSU5GUkFfT04ocEFkKSkKKwkJeworCQkJUlhfQkxLX1NFVF9GTEFHKHBSeEJsaywgZlJYX0lORlJBKTsKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwkJCWlmICgocEhlYWRlci0+RkMuRnJEcyA9PSAwKSAmJiAocEhlYWRlci0+RkMuVG9EcyA9PSAwKSkKKwkJCQlSWF9CTEtfU0VUX0ZMQUcocFJ4QmxrLCBmUlhfRExTKTsKKwkJCWVsc2UKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKwkJCUFTU0VSVChwUnhXSS0+V2lyZWxlc3NDbGlJRCA9PSBCU1NJRF9XQ0lEKTsKKwkJfQorCisJCS8vIGNoZWNrIEF0aGVyb3MgQ2xpZW50CisJCWlmICgocEVudHJ5LT5iSUFtQmFkQXRoZXJvcyA9PSBGQUxTRSkgJiYgIChwUnhELT5BTVBEVSA9PSAxKSAmJiAocEhlYWRlci0+RkMuUmV0cnkgKSkKKwkJeworCQkJcEVudHJ5LT5iSUFtQmFkQXRoZXJvcyA9IFRSVUU7CisJCQlwQWQtPkNvbW1vbkNmZy5JT1Rlc3RQYXJtLmJDdXJyZW50QXRoZXJvcyA9IFRSVUU7CisJCQlwQWQtPkNvbW1vbkNmZy5JT1Rlc3RQYXJtLmJMYXN0QXRoZXJvcyA9IFRSVUU7CisJCQlpZiAoIVNUQV9BRVNfT04ocEFkKSkKKwkJCXsKKwkJCQlBc2ljVXBkYXRlUHJvdGVjdChwQWQsIDgsIEFMTE5fU0VUUFJPVEVDVCwgVFJVRSwgRkFMU0UpOworCQkJfQorCQl9CisJfQorCisJcFJ4QmxrLT5wRGF0YSA9IChVQ0hBUiAqKXBIZWFkZXI7CisKKwkvLworCS8vIHVwZGF0ZSBSeEJsay0+cERhdGEsIERhdGFTaXplCisJLy8gODAyLjExIEhlYWRlciwgUU9TLCBIVEMsIEh3IFBhZGRpbmcKKwkvLworCisJLy8gMS4gc2tpcCA4MDIuMTEgSEVBREVSCisJeworCQlwUnhCbGstPnBEYXRhICs9IExFTkdUSF84MDJfMTE7CisJCXBSeEJsay0+RGF0YVNpemUgLT0gTEVOR1RIXzgwMl8xMTsKKwl9CisKKwkvLyAyLiBRT1MKKwlpZiAocEhlYWRlci0+RkMuU3ViVHlwZSAmIDB4MDgpCisJeworCQlSWF9CTEtfU0VUX0ZMQUcocFJ4QmxrLCBmUlhfUU9TKTsKKwkJVXNlclByaW9yaXR5ID0gKihwUnhCbGstPnBEYXRhKSAmIDB4MGY7CisJCS8vIGJpdCA3IGluIFFvUyBDb250cm9sIGZpZWxkIHNpZ25hbHMgdGhlIEhUIEEtTVNEVSBmb3JtYXQKKwkJaWYgKCgqcFJ4QmxrLT5wRGF0YSkgJiAweDgwKQorCQl7CisJCQlSWF9CTEtfU0VUX0ZMQUcocFJ4QmxrLCBmUlhfQU1TRFUpOworCQl9CisKKwkJLy8gc2tpcCBRT1MgY29udG9ybCBmaWVsZAorCQlwUnhCbGstPnBEYXRhICs9IDI7CisJCXBSeEJsay0+RGF0YVNpemUgLT0yOworCX0KKwlwUnhCbGstPlVzZXJQcmlvcml0eSA9IFVzZXJQcmlvcml0eTsKKworCS8vIDMuIE9yZGVyIGJpdDogQS1SYWxpbmsgb3IgSFRDKworCWlmIChwSGVhZGVyLT5GQy5PcmRlcikKKwl7CisjaWZkZWYgQUdHUkVHQVRJT05fU1VQUE9SVAorCQlpZiAoKHBSeFdJLT5QSFlNT0RFIDw9IE1PREVfT0ZETSkgJiYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQUdHUkVHQVRJT05fSU5VU0VEKSkpCisJCXsKKwkJCVJYX0JMS19TRVRfRkxBRyhwUnhCbGssIGZSWF9BUkFMSU5LKTsKKwkJfQorCQllbHNlCisjZW5kaWYKKwkJeworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJUlhfQkxLX1NFVF9GTEFHKHBSeEJsaywgZlJYX0hUQyk7CisJCQkvLyBza2lwIEhUQyBjb250b3JsIGZpZWxkCisJCQlwUnhCbGstPnBEYXRhICs9IDQ7CisJCQlwUnhCbGstPkRhdGFTaXplIC09IDQ7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCX0KKwl9CisKKwkvLyA0LiBza2lwIEhXIHBhZGRpbmcKKwlpZiAocFJ4RC0+TDJQQUQpCisJeworCQkvLyBqdXN0IG1vdmUgcERhdGEgcG9pbnRlcgorCQkvLyBiZWNhdXNlIERhdGFTaXplIGV4Y2x1ZGluZyBIVyBwYWRkaW5nCisJCVJYX0JMS19TRVRfRkxBRyhwUnhCbGssIGZSWF9QQUQpOworCQlwUnhCbGstPnBEYXRhICs9IDI7CisJfQorCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJaWYgKHBSeEQtPkJBKQorCXsKKwkJUlhfQkxLX1NFVF9GTEFHKHBSeEJsaywgZlJYX0FNUERVKTsKKwl9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKworCS8vCisJLy8gQ2FzZSBJICBQcm9jZXNzIEJyb2FkY2FzdCAmIE11bHRpY2FzdCBkYXRhIGZyYW1lCisJLy8KKwlpZiAocFJ4RC0+QmNhc3QgfHwgcFJ4RC0+TWNhc3QpCisJeworCQlJTkNfQ09VTlRFUjY0KHBBZC0+V2xhbkNvdW50ZXJzLk11bHRpY2FzdFJlY2VpdmVkRnJhbWVDb3VudCk7CisKKwkJLy8gRHJvcCBNY2FzdC9CY2FzdCBmcmFtZSB3aXRoIGZyYWdtZW50IGJpdCBvbgorCQlpZiAocEhlYWRlci0+RkMuTW9yZUZyYWcpCisJCXsKKwkJCS8vIHJlbGVhc2UgcGFja2V0CisJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4UGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJCXJldHVybjsKKwkJfQorCisJCS8vIEZpbHRlciBvdXQgQmNhc3QgZnJhbWUgd2hpY2ggQVAgcmVsYXllZCBmb3IgdXMKKwkJaWYgKHBIZWFkZXItPkZDLkZyRHMgJiYgTUFDX0FERFJfRVFVQUwocEhlYWRlci0+QWRkcjMsIHBBZC0+Q3VycmVudEFkZHJlc3MpKQorCQl7CisJCQkvLyByZWxlYXNlIHBhY2tldAorCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCQlyZXR1cm47CisJCX0KKworCQlJbmRpY2F0ZV9MZWdhY3lfUGFja2V0KHBBZCwgcFJ4QmxrLCBGcm9tV2hpY2hCU1NJRCk7CisJCXJldHVybjsKKwl9CisJZWxzZSBpZiAocFJ4RC0+VTJNKQorCXsKKwkJcEFkLT5MYXN0UnhSYXRlID0gKFVTSE9SVCkoKHBSeFdJLT5NQ1MpICsgKHBSeFdJLT5CVyA8PDcpICsgKHBSeFdJLT5TaG9ydEdJIDw8OCkrIChwUnhXSS0+UEhZTU9ERSA8PDE0KSkgOworCisKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKyAgICAgICAgaWYgKFJYX0JMS19URVNUX0ZMQUcocFJ4QmxrLCBmUlhfRExTKSkKKwkJeworCQkJTUFDX1RBQkxFX0VOVFJZICpwRGxzRW50cnkgPSBOVUxMOworCisJCQlwRGxzRW50cnkgPSBEbHNFbnRyeVRhYmxlTG9va3VwQnlXY2lkKHBBZCwgcFJ4V0ktPldpcmVsZXNzQ2xpSUQsIHBIZWFkZXItPkFkZHIyLCBUUlVFKTsKKwkJCQkJCQkJCQkgICAgICAgICAgICAgICAgICAgICAgICBpZihwRGxzRW50cnkpCisJCQlVcGRhdGVfUnNzaV9TYW1wbGUocEFkLCAmcERsc0VudHJ5LT5Sc3NpU2FtcGxlLCBwUnhXSSk7CisJCX0KKwkJZWxzZQorI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCQlpZiAoQURIT0NfT04ocEFkKSkKKwkJeworCQkJcEVudHJ5ID0gTWFjVGFibGVMb29rdXAocEFkLCBwSGVhZGVyLT5BZGRyMik7CisJCQlpZiAocEVudHJ5KQorCQkJCVVwZGF0ZV9Sc3NpX1NhbXBsZShwQWQsICZwRW50cnktPlJzc2lTYW1wbGUsIHBSeFdJKTsKKwkJfQorCisKKwkJVXBkYXRlX1Jzc2lfU2FtcGxlKHBBZCwgJnBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUsIHBSeFdJKTsKKworCQlwQWQtPlN0YUNmZy5MYXN0U05SMCA9IChVQ0hBUikocFJ4V0ktPlNOUjApOworCQlwQWQtPlN0YUNmZy5MYXN0U05SMSA9IChVQ0hBUikocFJ4V0ktPlNOUjEpOworCisJCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjUnhPa0RhdGFDbnQrKzsKKworCisgICAgCWlmICghKChwSGVhZGVyLT5GcmFnID09IDApICYmIChwSGVhZGVyLT5GQy5Nb3JlRnJhZyA9PSAwKSkpCisgICAgCXsKKyAgICAJCS8vIHJlLWFzc2VtYmxlIHRoZSBmcmFnbWVudGVkIHBhY2tldHMKKyAgICAJCS8vIHJldHVybiBjb21wbGV0ZSBmcmFtZSAocFJ4UGFja2V0KSBvciBOVUxMCisgICAgCQliRnJhZ21lbnQgPSBUUlVFOworICAgIAkJcFJ4UGFja2V0ID0gUlRNUERlRnJhZ21lbnREYXRhRnJhbWUocEFkLCBwUnhCbGspOworICAgIAl9CisKKyAgICAJaWYgKHBSeFBhY2tldCkKKyAgICAJeworCQkJcEVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbcFJ4V0ktPldpcmVsZXNzQ2xpSURdOworCisgICAgCQkvLyBwcm9jZXNzIGNvbXBsZXRlIGZyYW1lCisgICAgCQlpZiAoYkZyYWdtZW50ICYmIChwUnhELT5EZWNyeXB0ZWQpICYmIChwRW50cnktPldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKSkKKyAgICAJCXsKKwkJCQkvLyBNaW51cyBNSUMgbGVuZ3RoCisJCQkJcFJ4QmxrLT5EYXRhU2l6ZSAtPSA4OworCisgICAgCQkJLy8gRm9yIFRLSVAgZnJhbWUsIGNhbGN1bGF0ZSB0aGUgTUlDIHZhbHVlCisgICAgCQkJaWYgKFNUQUNoZWNrVGtpcE1JQ1ZhbHVlKHBBZCwgcEVudHJ5LCBwUnhCbGspID09IEZBTFNFKQorICAgIAkJCXsKKyAgICAJCQkJcmV0dXJuOworICAgIAkJCX0KKyAgICAJCX0KKworICAgIAkJU1RBUnhEYXRhRnJhbWVBbm5vdW5jZShwQWQsIHBFbnRyeSwgcFJ4QmxrLCBGcm9tV2hpY2hCU1NJRCk7CisJCQlyZXR1cm47CisgICAgCX0KKyAgICAJZWxzZQorICAgIAl7CisgICAgCQkvLyBqdXN0IHJldHVybgorICAgIAkJLy8gYmVjYXVzZSBSVE1QRGVGcmFnbWVudERhdGFGcmFtZSgpIHdpbGwgcmVsZWFzZSByeCBwYWNrZXQsCisgICAgCQkvLyBpZiBwYWNrZXQgaXMgZnJhZ21lbnRlZAorICAgIAkJcmV0dXJuOworICAgIAl9CisJfQorCisJQVNTRVJUKDApOworCS8vIHJlbGVhc2UgcGFja2V0CisJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7Cit9CisKK1ZPSUQgU1RBSGFuZGxlUnhNZ210RnJhbWUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUlhfQkxLCQkJKnBSeEJsaykKK3sKKwlQUlQyOFhYX1JYRF9TVFJVQwlwUnhEID0gJihwUnhCbGstPlJ4RCk7CisJUFJYV0lfU1RSVUMJCXBSeFdJID0gcFJ4QmxrLT5wUnhXSTsKKwlQSEVBREVSXzgwMl8xMQlwSGVhZGVyID0gcFJ4QmxrLT5wSGVhZGVyOworCVBORElTX1BBQ0tFVAlwUnhQYWNrZXQgPSBwUnhCbGstPnBSeFBhY2tldDsKKworCWRvCisJeworCisJCS8vIFdlIHNob3VsZCBjb2xsZWN0IFJTU0kgbm90IG9ubHkgVTJNIGRhdGEgYnV0IGFsc28gbXkgYmVhY29uCisJCWlmICgocEhlYWRlci0+RkMuU3ViVHlwZSA9PSBTVUJUWVBFX0JFQUNPTikgJiYgKE1BQ19BRERSX0VRVUFMKCZwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgJnBIZWFkZXItPkFkZHIyKSkpCisJCXsKKwkJCVVwZGF0ZV9Sc3NpX1NhbXBsZShwQWQsICZwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLCBwUnhXSSk7CisKKwkJCXBBZC0+U3RhQ2ZnLkxhc3RTTlIwID0gKFVDSEFSKShwUnhXSS0+U05SMCk7CisJCQlwQWQtPlN0YUNmZy5MYXN0U05SMSA9IChVQ0hBUikocFJ4V0ktPlNOUjEpOworCQl9CisKKwkJLy8gRmlyc3QgY2hlY2sgdGhlIHNpemUsIGl0IE1VU1Qgbm90IGV4Y2VlZCB0aGUgbWxtZSBxdWV1ZSBzaXplCisJCWlmIChwUnhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50ID4gTUdNVF9ETUFfQlVGRkVSX1NJWkUpCisJCXsKKwkJCURCR1BSSU5UX0VSUigoIlNUQUhhbmRsZVJ4TWdtdEZyYW1lOiBmcmFtZSB0b28gbGFyZ2UsIHNpemUgPSAlZCBcbiIsIHBSeFdJLT5NUERVdG90YWxCeXRlQ291bnQpKTsKKwkJCWJyZWFrOworCQl9CisKKwkJUkVQT1JUX01HTVRfRlJBTUVfVE9fTUxNRShwQWQsIHBSeFdJLT5XaXJlbGVzc0NsaUlELCBwSGVhZGVyLCBwUnhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50LAorCQkJCQkJCQkJcFJ4V0ktPlJTU0kwLCBwUnhXSS0+UlNTSTEsIHBSeFdJLT5SU1NJMiwgcFJ4RC0+UGxjcFNpZ25hbCk7CisJfSB3aGlsZSAoRkFMU0UpOworCisJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeFBhY2tldCwgTkRJU19TVEFUVVNfU1VDQ0VTUyk7Cit9CisKK1ZPSUQgU1RBSGFuZGxlUnhDb250cm9sRnJhbWUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUlhfQkxLCQkJKnBSeEJsaykKK3sKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwlQUlhXSV9TVFJVQwkJcFJ4V0kgPSBwUnhCbGstPnBSeFdJOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCVBIRUFERVJfODAyXzExCXBIZWFkZXIgPSBwUnhCbGstPnBIZWFkZXI7CisJUE5ESVNfUEFDS0VUCXBSeFBhY2tldCA9IHBSeEJsay0+cFJ4UGFja2V0OworCisJc3dpdGNoIChwSGVhZGVyLT5GQy5TdWJUeXBlKQorCXsKKwkJY2FzZSBTVUJUWVBFX0JMT0NLX0FDS19SRVE6CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQl7CisJCQkJQ250bEVucXVldWVGb3JSZWN2KHBBZCwgcFJ4V0ktPldpcmVsZXNzQ2xpSUQsIChwUnhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50KSwgKFBGUkFNRV9CQV9SRVEpcEhlYWRlcik7CisJCQl9CisJCQlicmVhazsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJY2FzZSBTVUJUWVBFX0JMT0NLX0FDSzoKKwkJY2FzZSBTVUJUWVBFX0FDSzoKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCX0KKworCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworfQorCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlQcm9jZXNzIFJ4RG9uZSBpbnRlcnJ1cHQsIHJ1bm5pbmcgaW4gRFBDIGxldmVsCisKKwlBcmd1bWVudHM6CisJCXBBZCBQb2ludGVyIHRvIG91ciBhZGFwdGVyCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJTm90ZToKKwkJVGhpcyByb3V0aW5lIGhhcyB0byBtYWludGFpbiBSeCByaW5nIHJlYWQgcG9pbnRlci4KKwkJTmVlZCB0byBjb25zaWRlciBRT1MgREFUQSBmb3JtYXQgd2hlbiBjb252ZXJ0aW5nIHRvIDgwMi4zCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworQk9PTEVBTiBTVEFSeERvbmVJbnRlcnJ1cHRIYW5kbGUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JQk9PTEVBTgkJCWFyZ2MpCit7CisJTkRJU19TVEFUVVMJCQlTdGF0dXM7CisJVUlOVDMyCQkJUnhQcm9jZXNzZWQsIFJ4UGVuZGluZzsKKwlCT09MRUFOCQkJYlJlc2NoZWR1bGUgPSBGQUxTRTsKKwlSVDI4WFhfUlhEX1NUUlVDCSpwUnhEOworCVVDSEFSCQkJKnBEYXRhOworCVBSWFdJX1NUUlVDCQlwUnhXSTsKKwlQTkRJU19QQUNLRVQJcFJ4UGFja2V0OworCVBIRUFERVJfODAyXzExCXBIZWFkZXI7CisJUlhfQkxLCQkJUnhDZWxsOworCisJUnhQcm9jZXNzZWQgPSBSeFBlbmRpbmcgPSAwOworCisJLy8gcHJvY2VzcyB3aG9sZSByeCByaW5nCisJd2hpbGUgKDEpCisJeworCisJCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkFESU9fT0ZGIHwKKwkJCQkJCQkJZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUyB8CisJCQkJCQkJCWZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyB8CisJCQkJCQkJCWZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkgfHwKKwkJCSFSVE1QX1RFU1RfRkxBRyhwQWQsZlJUTVBfQURBUFRFUl9TVEFSVF9VUCkpCisJCXsKKwkJCWJyZWFrOworCQl9CisKKyNpZmRlZiBSVDI4NjAKKwkJaWYgKFJ4UHJvY2Vzc2VkKysgPiBNQVhfUlhfUFJPQ0VTU19DTlQpCisJCXsKKwkJCS8vIG5lZWQgdG8gcmVzY2hlZHVsZSByeCBoYW5kbGUKKwkJCWJSZXNjaGVkdWxlID0gVFJVRTsKKwkJCWJyZWFrOworCQl9CisjZW5kaWYgLy8gUlQyODYwIC8vCisKKwkJUnhQcm9jZXNzZWQgKys7IC8vIHRlc3QKKworCQkvLyAxLiBhbGxvY2F0ZSBhIG5ldyBkYXRhIHBhY2tldCBpbnRvIHJ4IHJpbmcgdG8gcmVwbGFjZSByZWNlaXZlZCBwYWNrZXQKKwkJLy8gICAgdGhlbiBwcm9jZXNzaW5nIHRoZSByZWNlaXZlZCBwYWNrZXQKKwkJLy8gMi4gdGhlIGNhbGxlZSBtdXN0IHRha2UgY2hhcmdlIG9mIHJlbGVhc2Ugb2YgcGFja2V0CisJCS8vIDMuIEFzIGZhciBhcyBkcml2ZXIgaXMgY29uY2VybmVkICwKKwkJLy8gICAgdGhlIHJ4IHBhY2tldCBtdXN0CisJCS8vICAgICAgYS4gYmUgaW5kaWNhdGVkIHRvIHVwcGVyIGxheWVyIG9yCisJCS8vICAgICAgYi4gYmUgcmVsZWFzZWQgaWYgaXQgaXMgZGlzY2FyZGVkCisJCXBSeFBhY2tldCA9IEdldFBhY2tldEZyb21SeFJpbmcocEFkLCAmKFJ4Q2VsbC5SeEQpLCAmYlJlc2NoZWR1bGUsICZSeFBlbmRpbmcpOworCQlpZiAocFJ4UGFja2V0ID09IE5VTEwpCisJCXsKKwkJCS8vIG5vIG1vcmUgcGFja2V0IHRvIHByb2Nlc3MKKwkJCWJyZWFrOworCQl9CisKKwkJLy8gZ2V0IHJ4IHJpbmcgZGVzY3JpcHRvcgorCQlwUnhEID0gJihSeENlbGwuUnhEKTsKKwkJLy8gZ2V0IHJ4IGRhdGEgYnVmZmVyCisJCXBEYXRhCT0gR0VUX09TX1BLVF9EQVRBUFRSKHBSeFBhY2tldCk7CisJCXBSeFdJCT0gKFBSWFdJX1NUUlVDKSBwRGF0YTsKKwkJcEhlYWRlciA9IChQSEVBREVSXzgwMl8xMSkgKHBEYXRhK1JYV0lfU0laRSkgOworCisjaWZkZWYgUlRfQklHX0VORElBTgorCSAgICBSVE1QRnJhbWVFbmRpYW5DaGFuZ2UocEFkLCAoUFVDSEFSKXBIZWFkZXIsIERJUl9SRUFELCBUUlVFKTsKKwkJUlRNUFdJRW5kaWFuQ2hhbmdlKChQVUNIQVIpcFJ4V0ksIFRZUEVfUlhXSSk7CisjZW5kaWYKKworCQkvLyBidWlsZCBSeENlbGwKKwkJUnhDZWxsLnBSeFdJID0gcFJ4V0k7CisJCVJ4Q2VsbC5wSGVhZGVyID0gcEhlYWRlcjsKKwkJUnhDZWxsLnBSeFBhY2tldCA9IHBSeFBhY2tldDsKKwkJUnhDZWxsLnBEYXRhID0gKFVDSEFSICopIHBIZWFkZXI7CisJCVJ4Q2VsbC5EYXRhU2l6ZSA9IHBSeFdJLT5NUERVdG90YWxCeXRlQ291bnQ7CisJCVJ4Q2VsbC5GbGFncyA9IDA7CisKKwkJLy8gSW5jcmVhc2UgVG90YWwgcmVjZWl2ZSBieXRlIGNvdW50ZXIgYWZ0ZXIgcmVhbCBkYXRhIHJlY2VpdmVkIG5vIG1hdGVyIGFueSBlcnJvciBvciBub3QKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5SZWNlaXZlZEJ5dGVDb3VudCArPSAgcFJ4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudDsKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5SeENvdW50ICsrOworCisJCUlOQ19DT1VOVEVSNjQocEFkLT5XbGFuQ291bnRlcnMuUmVjZWl2ZWRGcmFnbWVudENvdW50KTsKKworCQlpZiAocFJ4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudCA8IDE0KQorCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfRkFJTFVSRTsKKworICAgICAgICBpZiAoTU9OSVRPUl9PTihwQWQpKQorCQl7CisgICAgICAgICAgICBzZW5kX21vbml0b3JfcGFja2V0cyhwQWQsICZSeENlbGwpOworCQkJYnJlYWs7CisJCX0KKwkJLyogUlQyODcwIGludm9rZXMgU1RBUnhEb25lSW50ZXJydXB0SGFuZGxlKCkgaW4gcnR1c2JfYnVsay5jICovCisjaWZkZWYgUkFMSU5LX0FURQorCQlpZiAoQVRFX09OKHBBZCkpCisJCXsKKwkJCXBBZC0+YXRlLlJ4Q250UGVyU2VjKys7CisJCQlBVEVTYW1wbGVSc3NpKHBBZCwgcFJ4V0kpOworI2lmZGVmIFJBTElOS18yOHh4X1FBCisJCQlpZiAocEFkLT5hdGUuYlFBUnhTdGFydCA9PSBUUlVFKQorCQkJeworCQkJCS8qICgqcFJ4RCkgaGFzIGJlZW4gc3dhcHBlZCBpbiBHZXRQYWNrZXRGcm9tUnhSaW5nKCkgKi8KKwkJCQlBVEVfUUFfU3RhdGlzdGljcyhwQWQsIHBSeFdJLCBwUnhELAlwSGVhZGVyKTsKKwkJCX0KKyNlbmRpZiAvLyBSQUxJTktfMjh4eF9RQSAvLworCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeFBhY2tldCwgTkRJU19TVEFUVVNfU1VDQ0VTUyk7CisJCQljb250aW51ZTsKKwkJfQorI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKworCQkvLyBDaGVjayBmb3IgYWxsIFJ4RCBlcnJvcnMKKwkJU3RhdHVzID0gUlRNUENoZWNrUnhFcnJvcihwQWQsIHBIZWFkZXIsIHBSeFdJLCBwUnhEKTsKKworCQkvLyBIYW5kbGUgdGhlIHJlY2VpdmVkIGZyYW1lCisJCWlmIChTdGF0dXMgPT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJeworCQkJc3dpdGNoIChwSGVhZGVyLT5GQy5UeXBlKQorCQkJeworCQkJCS8vIENBU0UgSSwgcmVjZWl2ZSBhIERBVEEgZnJhbWUKKwkJCQljYXNlIEJUWVBFX0RBVEE6CisJCQkJeworCQkJCQkvLyBwcm9jZXNzIERBVEEgZnJhbWUKKwkJCQkJU1RBSGFuZGxlUnhEYXRhRnJhbWUocEFkLCAmUnhDZWxsKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQkJLy8gQ0FTRSBJSSwgcmVjZWl2ZSBhIE1HTVQgZnJhbWUKKwkJCQljYXNlIEJUWVBFX01HTVQ6CisJCQkJeworCQkJCQlTVEFIYW5kbGVSeE1nbXRGcmFtZShwQWQsICZSeENlbGwpOworCQkJCX0KKwkJCQlicmVhazsKKwkJCQkvLyBDQVNFIElJSS4gcmVjZWl2ZSBhIENOVEwgZnJhbWUKKwkJCQljYXNlIEJUWVBFX0NOVEw6CisJCQkJeworCQkJCQlTVEFIYW5kbGVSeENvbnRyb2xGcmFtZShwQWQsICZSeENlbGwpOworCQkJCX0KKwkJCQlicmVhazsKKwkJCQkvLyBkaXNjYXJkIG90aGVyIHR5cGUKKwkJCQlkZWZhdWx0OgorCQkJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4UGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQlwQWQtPkNvdW50ZXJzODAyMy5SeEVycm9ycysrOworCQkJLy8gZGlzY2FyZCB0aGlzIGZyYW1lCisJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4UGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJfQorCX0KKworCXJldHVybiBiUmVzY2hlZHVsZTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJQXJndW1lbnRzOgorCQlwQWQgCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlSVE1QSGFuZGxlVHdha2V1cEludGVycnVwdCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlBc2ljRm9yY2VXYWtldXAocEFkLCBGQUxTRSk7Cit9CisKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1JvdXRpbmUgRGVzY3JpcHRpb246CisgICAgRWFybHkgY2hlY2tpbmcgYW5kIE9TLWRlcGVuZWQgcGFyc2luZyBmb3IgVHggcGFja2V0IHNlbmQgdG8gb3VyIFNUQSBkcml2ZXIuCisKK0FyZ3VtZW50czoKKyAgICBORElTX0hBTkRMRSAJTWluaXBvcnRBZGFwdGVyQ29udGV4dAlQb2ludGVyIHJlZmVyIHRvIHRoZSBkZXZpY2UgaGFuZGxlLCBpLmUuLCB0aGUgcEFkLgorCVBQTkRJU19QQUNLRVQJcHBQYWNrZXRBcnJheQkJCVRoZSBwYWNrZXQgYXJyYXkgbmVlZCB0byBkbyB0cmFuc21pc3Npb24uCisJVUlOVAkJCU51bWJlck9mUGFja2V0cwkJCU51bWJlciBvZiBwYWNrZXQgaW4gcGFja2V0IGFycmF5LgorCitSZXR1cm4gVmFsdWU6CisJTk9ORQorCitOb3RlOgorCVRoaXMgZnVuY3Rpb24gZG8gZWFybHkgY2hlY2tpbmcgYW5kIGNsYXNzaWZpY2F0aW9uIGZvciBzZW5kLW91dCBwYWNrZXQuCisJWW91IG9ubHkgY2FuIHB1dCBPUy1kZXBlbmVkICYgU1RBIHJlbGF0ZWQgY29kZSBpbiBoZXJlLgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBTVEFTZW5kUGFja2V0cygKKwlJTglORElTX0hBTkRMRQkJTWluaXBvcnRBZGFwdGVyQ29udGV4dCwKKwlJTglQUE5ESVNfUEFDS0VUCXBwUGFja2V0QXJyYXksCisJSU4JVUlOVAkJCU51bWJlck9mUGFja2V0cykKK3sKKwlVSU5UCQkJSW5kZXg7CisJUFJUTVBfQURBUFRFUglwQWQgPSAoUFJUTVBfQURBUFRFUikgTWluaXBvcnRBZGFwdGVyQ29udGV4dDsKKwlQTkRJU19QQUNLRVQJcFBhY2tldDsKKwlCT09MRUFOCQkJYWxsb3dUb1NlbmQgPSBGQUxTRTsKKworCisJZm9yIChJbmRleCA9IDA7IEluZGV4IDwgTnVtYmVyT2ZQYWNrZXRzOyBJbmRleCsrKQorCXsKKwkJcFBhY2tldCA9IHBwUGFja2V0QXJyYXlbSW5kZXhdOworCisJCWRvCisJCXsKKwkJCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkVTRVRfSU5fUFJPR1JFU1MpIHx8CisJCQkJUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MpIHx8CisJCQkJUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JBRElPX09GRikpCisJCQl7CisJCQkJLy8gRHJvcCBzZW5kIHJlcXVlc3Qgc2luY2UgaGFyZHdhcmUgaXMgaW4gcmVzZXQgc3RhdGUKKwkJCQkJYnJlYWs7CisJCQl9CisJCQllbHNlIGlmICghSU5GUkFfT04ocEFkKSAmJiAhQURIT0NfT04ocEFkKSkKKwkJCXsKKwkJCQkvLyBEcm9wIHNlbmQgcmVxdWVzdCBzaW5jZSB0aGVyZSBhcmUgbm8gcGh5c2ljYWwgY29ubmVjdGlvbiB5ZXQKKwkJCQkJYnJlYWs7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJLy8gUmVjb3JkIHRoYXQgb3JpZ25hbCBwYWNrZXQgc291cmNlIGlzIGZyb20gTkRJUyBsYXllcixzbyB0aGF0CisJCQkJLy8gbGF0ZXIgb24gZHJpdmVyIGtub3dzIGhvdyB0byByZWxlYXNlIHRoaXMgTkRJUyBQQUNLRVQKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwkJCQlNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeTsKKwkJCQlQVUNIQVIgcFNyY0J1ZlZBID0gR0VUX09TX1BLVF9EQVRBUFRSKHBQYWNrZXQpOworCisJCQkJcEVudHJ5ID0gTWFjVGFibGVMb29rdXAocEFkLCBwU3JjQnVmVkEpOworCQkJCWlmIChwRW50cnkgJiYgKHBFbnRyeS0+VmFsaWRBc0RscyA9PSBUUlVFKSkKKwkJCQl7CisJCQkJCVJUTVBfU0VUX1BBQ0tFVF9XQ0lEKHBQYWNrZXQsIHBFbnRyeS0+QWlkKTsKKwkJCQl9CisJCQkJZWxzZQorI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCQkJCVJUTVBfU0VUX1BBQ0tFVF9XQ0lEKHBQYWNrZXQsIDApOyAvLyB0aGlzIGZpZWxkIGlzIHVzZWxlc3Mgd2hlbiBpbiBTVEEgbW9kZQorCQkJCVJUTVBfU0VUX1BBQ0tFVF9TT1VSQ0UocFBhY2tldCwgUEtUU1JDX05ESVMpOworCQkJCU5ESVNfU0VUX1BBQ0tFVF9TVEFUVVMocFBhY2tldCwgTkRJU19TVEFUVVNfUEVORElORyk7CisJCQkJcEFkLT5SYWxpbmtDb3VudGVycy5QZW5kaW5nTmRpc1BhY2tldENvdW50Kys7CisKKwkJCQlhbGxvd1RvU2VuZCA9IFRSVUU7CisJCQl9CisJCX0gd2hpbGUoRkFMU0UpOworCisJCWlmIChhbGxvd1RvU2VuZCA9PSBUUlVFKQorCQkJU1RBU2VuZFBhY2tldChwQWQsIHBQYWNrZXQpOworCQllbHNlCisJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJfQorCisJLy8gRGVxdWV1ZSBvdXRnb2luZyBmcmFtZXMgZnJvbSBUeFN3UXVldWVbXSBhbmQgcHJvY2VzcyBpdAorCVJUTVBEZVF1ZXVlUGFja2V0KHBBZCwgRkFMU0UsIE5VTV9PRl9UWF9SSU5HLCBNQVhfVFhfUFJPQ0VTUyk7CisKK30KKworCisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitSb3V0aW5lIERlc2NyaXB0aW9uOgorCVRoaXMgcm91dGluZSBpcyB1c2VkIHRvIGRvIHBhY2tldCBwYXJzaW5nIGFuZCBjbGFzc2lmaWNhdGlvbiBmb3IgVHggcGFja2V0CisJdG8gU1RBIGRldmljZSwgYW5kIGl0IHdpbGwgZW4tcXVldWUgcGFja2V0cyB0byBvdXIgVHhTd1F1ZXVlIGRlcGVuZHMgb24gQUMKKwljbGFzcy4KKworQXJndW1lbnRzOgorCXBBZCAgICAJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKwlwUGFja2V0IAlQb2ludGVyIHRvIHNlbmQgcGFja2V0CisKK1JldHVybiBWYWx1ZToKKwlORElTX1NUQVRVU19TVUNDRVNTCQkJSWYgc3VjY2VzIHRvIHF1ZXVlIHRoZSBwYWNrZXQgaW50byBUeFN3UXVldWUuCisJTkRJU19TVEFUVVNfRkFJTFVSRQkJCUlmIGZhaWxlZCB0byBkbyBlbi1xdWV1ZS4KKworTm90ZToKKwlZb3Ugb25seSBjYW4gcHV0IE9TLWluZGVwZW5lZCAmIFNUQSByZWxhdGVkIGNvZGUgaW4gaGVyZS4KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK05ESVNfU1RBVFVTIFNUQVNlbmRQYWNrZXQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUE5ESVNfUEFDS0VUCXBQYWNrZXQpCit7CisJUEFDS0VUX0lORk8gCVBhY2tldEluZm87CisJUFVDSEFSCQkJcFNyY0J1ZlZBOworCVVJTlQJCQlTcmNCdWZMZW47CisJVUlOVAkJCUFsbG93RnJhZ1NpemU7CisJVUNIQVIJCQlOdW1iZXJPZkZyYWc7CisJVUNIQVIJCQlRdWVJZHgsIFVzZXJQcmlvcml0eTsKKwlNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeSA9IE5VTEw7CisJdW5zaWduZWQgaW50IAlJcnFGbGFnczsKKwlVQ0hBUgkJCUZsZ0lzSVAgPSAwOworCVVDSEFSCQkJUmF0ZTsKKworCS8vIFByZXBhcmUgcGFja2V0IGluZm9ybWF0aW9uIHN0cnVjdHVyZSBmb3IgYnVmZmVyIGRlc2NyaXB0b3IKKwkvLyBjaGFpbmVkIHdpdGhpbiBhIHNpbmdsZSBORElTIHBhY2tldC4KKwlSVE1QX1F1ZXJ5UGFja2V0SW5mbyhwUGFja2V0LCAmUGFja2V0SW5mbywgJnBTcmNCdWZWQSwgJlNyY0J1Zkxlbik7CisKKwlpZiAocFNyY0J1ZlZBID09IE5VTEwpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIlNUQVNlbmRQYWNrZXQgLS0+IHBTcmNCdWZWQSA9PSBOVUxMICEhIVNyY0J1Zkxlbj0leFxuIixTcmNCdWZMZW4pKTsKKwkJLy8gUmVzb3VyZWNlIGlzIGxvdywgc3lzdGVtIGRpZCBub3QgYWxsb2NhdGUgdmlydHVhbCBhZGRyZXNzCisJCS8vIHJldHVybiBORElTX1NUQVRVU19GQUlMVVJFIGRpcmVjdGx5IHRvIHVwcGVyIGxheWVyCisJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkU7CisJfQorCisKKwlpZiAoU3JjQnVmTGVuIDwgMTQpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIlNUQVNlbmRQYWNrZXQgLS0+IE5kaXMgUGFja2V0IGJ1ZmZlciBlcnJvciAhISFcbiIpKTsKKwkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCQlyZXR1cm4gKE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCX0KKworCS8vIEluIEhUIHJhdGUgYWRob2MgbW9kZSwgQS1NUERVIGlzIG9mdGVuIHVzZWQuIFNvIG5lZWQgdG8gbG9va3VwIEJBIFRhYmxlIGFuZCBNQUMgRW50cnkuCisJLy8gTm90ZSBtdWx0aWNhc3QgcGFja2V0cyBpbiBhZGhvYyBhbHNvIHVzZSBCU1NJRF9XQ0lEIGluZGV4LgorCXsKKwkJaWYoSU5GUkFfT04ocEFkKSkKKwkJeworI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCQkJVVNIT1JUCXRtcFdjaWQ7CisKKwkJCXRtcFdjaWQgPSBSVE1QX0dFVF9QQUNLRVRfV0NJRChwUGFja2V0KTsKKwkJCWlmIChWQUxJRF9XQ0lEKHRtcFdjaWQpICYmCisJCQkJKHBBZC0+TWFjVGFiLkNvbnRlbnRbdG1wV2NpZF0uVmFsaWRBc0Rscz09IFRSVUUpKQorCQkJeworCQkJCXBFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W3RtcFdjaWRdOworCQkJCVJhdGUgPSBwQWQtPk1hY1RhYi5Db250ZW50W3RtcFdjaWRdLkN1cnJUeFJhdGU7CisJCQl9CisJCQllbHNlCisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisJCQl7CisJCQlwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXTsKKwkJCVJUTVBfU0VUX1BBQ0tFVF9XQ0lEKHBQYWNrZXQsIEJTU0lEX1dDSUQpOworCQkJUmF0ZSA9IHBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZTsKKwkJfQorCQl9CisJCWVsc2UgaWYgKEFESE9DX09OKHBBZCkpCisJCXsKKwkJCWlmICgqcFNyY0J1ZlZBICYgMHgwMSkKKwkJCXsKKwkJCQlSVE1QX1NFVF9QQUNLRVRfV0NJRChwUGFja2V0LCBNQ0FTVF9XQ0lEKTsKKwkJCQlwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtNQ0FTVF9XQ0lEXTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlwRW50cnkgPSBNYWNUYWJsZUxvb2t1cChwQWQsIHBTcmNCdWZWQSk7CisJCQl9CisJCQlSYXRlID0gcEFkLT5Db21tb25DZmcuVHhSYXRlOworCQl9CisJfQorCisJaWYgKCFwRW50cnkpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIlNUQVNlbmRQYWNrZXQtPkNhbm5vdCBmaW5kIHBFbnRyeSglMng6JTJ4OiUyeDolMng6JTJ4OiUyeCkgaW4gTWFjVGFiIVxuIiwgUFJJTlRfTUFDKHBTcmNCdWZWQSkpKTsKKwkJLy8gUmVzb3VyZWNlIGlzIGxvdywgc3lzdGVtIGRpZCBub3QgYWxsb2NhdGUgdmlydHVhbCBhZGRyZXNzCisJCS8vIHJldHVybiBORElTX1NUQVRVU19GQUlMVVJFIGRpcmVjdGx5IHRvIHVwcGVyIGxheWVyCisJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkU7CisJfQorCisJaWYgKEFESE9DX09OKHBBZCkKKwkJKQorCXsKKwkJUlRNUF9TRVRfUEFDS0VUX1dDSUQocFBhY2tldCwgKFVDSEFSKXBFbnRyeS0+QWlkKTsKKwl9CisKKwkvLworCS8vIENoZWNrIHRoZSBFdGhlcm5ldCBGcmFtZSB0eXBlIG9mIHRoaXMgcGFja2V0LCBhbmQgc2V0IHRoZSBSVE1QX1NFVF9QQUNLRVRfU1BFQ0lGSUMgZmxhZ3MuCisJLy8JCUhlcmUgd2Ugc2V0IHRoZSBQQUNLRVRfU1BFQ0lGSUMgZmxhZ3MoTExDLCBWTEFOLCBESENQL0FSUCwgRUFQT0wpLgorCVJUTVBDaGVja0V0aGVyVHlwZShwQWQsIHBQYWNrZXQpOworCisKKworCS8vCisJLy8gV1BBIDgwMi4xeCBzZWN1cmVkIHBvcnQgY29udHJvbCAtIGRyb3AgYWxsIG5vbi04MDIuMXggZnJhbWUgYmVmb3JlIHBvcnQgc2VjdXJlZAorCS8vCisJaWYgKCgocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKSB8fAorCQkgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykgfHwKKwkJIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyKSB8fAorCQkgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spCisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorCQkgIHx8IChwQWQtPlN0YUNmZy5JRUVFODAyMVggPT0gVFJVRSkKKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisjaWZkZWYgTEVBUF9TVVBQT1JUCisJCSAgfHwgKHBBZC0+U3RhQ2ZnLkxlYXBBdXRoTW9kZSA9PSBDSVNDT19BdXRoTW9kZUxFQVApCisjZW5kaWYgLy8gTEVBUF9TVVBQT1JUIC8vCisJCSAgKQorCQkgICYmICgocEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQgPT0gV1BBXzgwMl8xWF9QT1JUX05PVF9TRUNVUkVEKSB8fCAocEFkLT5TdGFDZmcuTWljRXJyQ250ID49IDIpKQorCQkgICYmIChSVE1QX0dFVF9QQUNLRVRfRUFQT0wocFBhY2tldCk9PSBGQUxTRSkKKwkJICApCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlNUQVNlbmRQYWNrZXQgLS0+IERyb3AgcGFja2V0IGJlZm9yZSBwb3J0IHNlY3VyZWQgISEhXG4iKSk7CisJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKworCQlyZXR1cm4gKE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCX0KKworCisJLy8gU1RFUCAxLiBEZWNpZGUgbnVtYmVyIG9mIGZyYWdtZW50cyByZXF1aXJlZCB0byBkZWxpdmVyIHRoaXMgTVNEVS4KKwkvLwkgICBUaGUgZXN0aW1hdGlvbiBoZXJlIGlzIG5vdCB2ZXJ5IGFjY3VyYXRlIGJlY2F1c2UgZGlmZmljdWx0IHRvCisJLy8JICAgdGFrZSBlbmNyeXB0aW9uIG92ZXJoZWFkIGludG8gY29uc2lkZXJhdGlvbiBoZXJlLiBUaGUgcmVzdWx0CisJLy8JICAgIk51bWJlck9mRnJhZyIgaXMgdGhlbiBqdXN0IHVzZWQgdG8gcHJlLWNoZWNrIGlmIGVub3VnaCBmcmVlCisJLy8JICAgVFhEIGFyZSBhdmFpbGFibGUgdG8gaG9sZCB0aGlzIE1TRFUuCisKKworCWlmICgqcFNyY0J1ZlZBICYgMHgwMSkJLy8gZnJhZ21lbnRhdGlvbiBub3QgYWxsb3dlZCBvbiBtdWx0aWNhc3QgJiBicm9hZGNhc3QKKwkJTnVtYmVyT2ZGcmFnID0gMTsKKwllbHNlIGlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0FHR1JFR0FUSU9OX0lOVVNFRCkpCisJCU51bWJlck9mRnJhZyA9IDE7CS8vIEFnZ3JlZ2F0aW9uIG92ZXJ3aGVsbXMgZnJhZ21lbnRhdGlvbgorCWVsc2UgaWYgKENMSUVOVF9TVEFUVVNfVEVTVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfQU1TRFVfSU5VU0VEKSkKKwkJTnVtYmVyT2ZGcmFnID0gMTsJLy8gQWdncmVnYXRpb24gb3ZlcndoZWxtcyBmcmFnbWVudGF0aW9uCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJZWxzZSBpZiAoKHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NT0RFID09IE1PREVfSFRNSVgpIHx8IChwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTU9ERSA9PSBNT0RFX0hUR1JFRU5GSUVMRCkpCisJCU51bWJlck9mRnJhZyA9IDE7CS8vIE1JTU8gUkFURSBvdmVyd2hlbG1zIGZyYWdtZW50YXRpb24KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwllbHNlCisJeworCQkvLyBUaGUgY2FsY3VsYXRlZCAiTnVtYmVyT2ZGcmFnIiBpcyBhIHJvdWdoIGVzdGltYXRpb24gYmVjYXVzZSBvZiB2YXJpb3VzCisJCS8vIGVuY3J5cHRpb24vZW5jYXBzdWxhdGlvbiBvdmVyaGVhZCBub3QgdGFrZW4gaW50byBjb25zaWRlcmF0aW9uLiBUaGlzIG51bWJlciBpcyBqdXN0CisJCS8vIHVzZWQgdG8gbWFrZSBzdXJlIGVub3VnaCBmcmVlIFRYRCBhcmUgYXZhaWxhYmxlIGJlZm9yZSBmcmFnbWVudGF0aW9uIHRha2VzIHBsYWNlLgorCQkvLyBJbiBjYXNlIHRoZSBhY3R1YWwgcmVxdWlyZWQgbnVtYmVyIG9mIGZyYWdtZW50cyBvZiBhbiBORElTIHBhY2tldAorCQkvLyBleGNjZWVkcyAiTnVtYmVyT2ZGcmFnImNhY3VsYXRlZCBoZXJlIGFuZCBub3QgZW5vdWdoIGZyZWUgVFhEIGF2YWlsYWJsZSwgdGhlCisJCS8vIGxhc3QgZnJhZ21lbnQgKGkuZS4gbGFzdCBNUERVKSB3aWxsIGJlIGRyb3BwZWQgaW4gUlRNUEhhcmRUcmFuc21pdCgpIGR1ZSB0byBvdXQgb2YKKwkJLy8gcmVzb3VyY2UsIGFuZCB0aGUgTkRJUyBwYWNrZXQgd2lsbCBiZSBpbmRpY2F0ZWQgTkRJU19TVEFUVVNfRkFJTFVSRS4gVGhpcyBzaG91bGQKKwkJLy8gcmFyZWx5IGhhcHBlbiBhbmQgdGhlIHBlbmFsdHkgaXMganVzdCBsaWtlIGEgVFggUkVUUlkgZmFpbC4gQWZmb3JkYWJsZS4KKworCQlBbGxvd0ZyYWdTaXplID0gKHBBZC0+Q29tbW9uQ2ZnLkZyYWdtZW50VGhyZXNob2xkKSAtIExFTkdUSF84MDJfMTEgLSBMRU5HVEhfQ1JDOworCQlOdW1iZXJPZkZyYWcgPSAoKFBhY2tldEluZm8uVG90YWxQYWNrZXRMZW5ndGggLSBMRU5HVEhfODAyXzMgKyBMRU5HVEhfODAyXzFfSCkgLyBBbGxvd0ZyYWdTaXplKSArIDE7CisJCS8vIFRvIGdldCBhY2N1cmF0ZSBudW1iZXIgb2YgZnJhZ21lbnRhdGlvbiwgTWludXMgMSBpZiB0aGUgc2l6ZSBqdXN0IG1hdGNoIHRvIGFsbG93YWJsZSBmcmFnbWVudCBzaXplCisJCWlmICgoKFBhY2tldEluZm8uVG90YWxQYWNrZXRMZW5ndGggLSBMRU5HVEhfODAyXzMgKyBMRU5HVEhfODAyXzFfSCkgJSBBbGxvd0ZyYWdTaXplKSA9PSAwKQorCQl7CisJCQlOdW1iZXJPZkZyYWctLTsKKwkJfQorCX0KKworCS8vIFNhdmUgZnJhZ21lbnQgbnVtYmVyIHRvIE5kaXMgcGFja2V0IHJlc2VydmVkIGZpZWxkCisJUlRNUF9TRVRfUEFDS0VUX0ZSQUdNRU5UUyhwUGFja2V0LCBOdW1iZXJPZkZyYWcpOworCisKKwkvLyBTVEVQIDIuIENoZWNrIHRoZSByZXF1aXJlbWVudCBvZiBSVFM6CisJLy8JICAgSWYgbXVsdGlwbGUgZnJhZ21lbnQgcmVxdWlyZWQsIFJUUyBpcyByZXF1aXJlZCBvbmx5IGZvciB0aGUgZmlyc3QgZnJhZ21lbnQKKwkvLwkgICBpZiB0aGUgZnJhZ21lbnQgc2l6ZSBsYXJnZSB0aGFuIFJUUyB0aHJlc2hvbGQKKwkvLyAgICAgRm9yIFJUMjh4eCwgTGV0IEFTSUMgc2VuZCBSVFMvQ1RTCisJUlRNUF9TRVRfUEFDS0VUX1JUUyhwUGFja2V0LCAwKTsKKwlSVE1QX1NFVF9QQUNLRVRfVFhSQVRFKHBQYWNrZXQsIHBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZSk7CisKKwkvLworCS8vIFNURVAgMy4gVHJhZmZpYyBjbGFzc2lmaWNhdGlvbi4gb3V0Y29tZSA9IDxVc2VyUHJpb3JpdHksIFF1ZUlkeD4KKwkvLworCVVzZXJQcmlvcml0eSA9IDA7CisJUXVlSWR4CQkgPSBRSURfQUNfQkU7CisJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfV01NX0lOVVNFRCkpCisJeworCQlVU0hPUlQgUHJvdG9jb2w7CisJCVVDSEFSICBMbGNTbmFwTGVuID0gMCwgQnl0ZTAsIEJ5dGUxOworCQlkbworCQl7CisJCQkvLyBnZXQgRXRoZXJuZXQgcHJvdG9jb2wgZmllbGQKKwkJCVByb3RvY29sID0gKFVTSE9SVCkoKHBTcmNCdWZWQVsxMl0gPDwgOCkgKyBwU3JjQnVmVkFbMTNdKTsKKwkJCWlmIChQcm90b2NvbCA8PSAxNTAwKQorCQkJeworCQkJCS8vIGdldCBFdGhlcm5ldCBwcm90b2NvbCBmaWVsZCBmcm9tIExMQy9TTkFQCisJCQkJaWYgKFNuaWZmMkJ5dGVzRnJvbU5kaXNCdWZmZXIoUGFja2V0SW5mby5wRmlyc3RCdWZmZXIsIExFTkdUSF84MDJfMyArIDYsICZCeXRlMCwgJkJ5dGUxKSAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCQkJCQlicmVhazsKKworCQkJCVByb3RvY29sID0gKFVTSE9SVCkoKEJ5dGUwIDw8IDgpICsgQnl0ZTEpOworCQkJCUxsY1NuYXBMZW4gPSA4OworCQkJfQorCisJCQkvLyBhbHdheXMgQUNfQkUgZm9yIG5vbi1JUCBwYWNrZXQKKwkJCWlmIChQcm90b2NvbCAhPSAweDA4MDApCisJCQkJYnJlYWs7CisKKwkJCS8vIGdldCBJUCBoZWFkZXIKKwkJCWlmIChTbmlmZjJCeXRlc0Zyb21OZGlzQnVmZmVyKFBhY2tldEluZm8ucEZpcnN0QnVmZmVyLCBMRU5HVEhfODAyXzMgKyBMbGNTbmFwTGVuLCAmQnl0ZTAsICZCeXRlMSkgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJCQlicmVhazsKKworCQkJLy8gcmV0dXJuIEFDX0JFIGlmIHBhY2tldCBpcyBub3QgSVB2NAorCQkJaWYgKChCeXRlMCAmIDB4ZjApICE9IDB4NDApCisJCQkJYnJlYWs7CisKKwkJCUZsZ0lzSVAgPSAxOworCQkJVXNlclByaW9yaXR5ID0gKEJ5dGUxICYgMHhlMCkgPj4gNTsKKwkJCVF1ZUlkeCA9IE1hcFVzZXJQcmlvcml0eVRvQWNjZXNzQ2F0ZWdvcnlbVXNlclByaW9yaXR5XTsKKworCQkJLy8gVE9ETzogaGF2ZSB0byBjaGVjayBBQ00gYml0LiBhcHBseSBUU1BFQyBpZiBBQ00gaXMgT04KKwkJCS8vIFRPRE86IGRvd25ncmFkZSBVUCAmIFF1ZUlkeCBiZWZvcmUgcGFzc2luZyBBQ00KKwkJCWlmIChwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLmJBQ01bUXVlSWR4XSkKKwkJCXsKKwkJCQlVc2VyUHJpb3JpdHkgPSAwOworCQkJCVF1ZUlkeAkJID0gUUlEX0FDX0JFOworCQkJfQorCQl9IHdoaWxlIChGQUxTRSk7CisJfQorCisJUlRNUF9TRVRfUEFDS0VUX1VQKHBQYWNrZXQsIFVzZXJQcmlvcml0eSk7CisKKworCisJLy8gTWFrZSBzdXJlIFNlbmRUeFdhaXQgcXVldWUgcmVzb3VyY2Ugd29uJ3QgYmUgdXNlZCBieSBvdGhlciB0aHJlYWRzCisJUlRNUF9JUlFfTE9DSygmcEFkLT5pcnFfbG9jaywgSXJxRmxhZ3MpOworCWlmIChwQWQtPlR4U3dRdWV1ZVtRdWVJZHhdLk51bWJlciA+PSBNQVhfUEFDS0VUU19JTl9RVUVVRSkKKwl7CisJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgSXJxRmxhZ3MpOworI2lmZGVmIEJMT0NLX05FVF9JRgorCQlTdG9wTmV0SWZRdWV1ZShwQWQsIFF1ZUlkeCwgcFBhY2tldCk7CisjZW5kaWYgLy8gQkxPQ0tfTkVUX0lGIC8vCisJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKworCQlyZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRTsKKwl9CisJZWxzZQorCXsKKwkJSW5zZXJ0VGFpbFF1ZXVlKCZwQWQtPlR4U3dRdWV1ZVtRdWVJZHhdLCBQQUNLRVRfVE9fUVVFVUVfRU5UUlkocFBhY2tldCkpOworCX0KKwlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIElycUZsYWdzKTsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorICAgIGlmICgocEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkF1dG9CQSA9PSBUUlVFKSYmCisgICAgICAgIChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLmJIdEVuYWJsZSA9PSBUUlVFKSkKKwl7CisJCWlmICgoKHBFbnRyeS0+VFhCQWJpdG1hcCAmICgxPDxVc2VyUHJpb3JpdHkpKSA9PSAwKSAmJgorICAgICAgICAgICAgKChwRW50cnktPkJBRGVjbGluZUJpdG1hcCAmICgxPDxVc2VyUHJpb3JpdHkpKSA9PSAwKSAmJgorICAgICAgICAgICAgKHBFbnRyeS0+UG9ydFNlY3VyZWQgPT0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQpCisJCQkgLy8gRm9yIElPVCBjb21wYXRpYmlsaXR5LCBpZgorCQkJIC8vIDEuIEl0IGlzIFJhbGluayBjaGlwIG9yCisJCQkgLy8gMi4gSXQgaXMgT1BFTiBvciBBRVMgbW9kZSwKKwkJCSAvLyB0aGVuIEJBIHNlc3Npb24gY2FuIGJlIGJ1bGl0LgorCQkJICYmICgocEVudHJ5LT5WYWxpZEFzQ0xJICYmIHBBZC0+TWxtZUF1eC5BUFJhbGlua0llICE9IDB4MCkgfHwKKwkJCSAJIChwRW50cnktPldlcFN0YXR1cyA9PSBOZGlzODAyXzExV0VQRGlzYWJsZWQgfHwgcEVudHJ5LT5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkpCisJCQkpCisJCXsKKwkJCUJBT3JpU2Vzc2lvblNldFVwKHBBZCwgcEVudHJ5LCAwLCAwLCAxMCwgRkFMU0UpOworCQl9CisJfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNPc1R4Q291bnRbUXVlSWR4XSsrOyAvLyBUT0RPOiBmb3IgZGVidWcgb25seS4gdG8gYmUgcmVtb3ZlZAorCXJldHVybiBORElTX1NUQVRVU19TVUNDRVNTOworfQorCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlUaGlzIHN1YnJvdXRpbmUgd2lsbCBzY2FuIHRocm91Z2ggcmVsZWF0aXZlIHJpbmcgZGVzY3JpcHRvciB0byBmaW5kCisJCW91dCBhdmFsaWFibGUgZnJlZSByaW5nIGRlc2NyaXB0b3IgYW5kIGNvbXBhcmUgd2l0aCByZXF1ZXN0IHNpemUuCisKKwlBcmd1bWVudHM6CisJCXBBZCBQb2ludGVyIHRvIG91ciBhZGFwdGVyCisJCVF1ZUlkeAkJU2VsZWN0ZWQgVFggUmluZworCisJUmV0dXJuIFZhbHVlOgorCQlORElTX1NUQVRVU19GQUlMVVJFIAlOb3QgZW5vdWdoIGZyZWUgZGVzY3JpcHRvcgorCQlORElTX1NUQVRVU19TVUNDRVNTIAlFbm91Z2ggZnJlZSBkZXNjcmlwdG9yCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KKyNpZmRlZiBSVDI4NjAKK05ESVNfU1RBVFVTIFJUTVBGcmVlVFhEUmVxdWVzdCgKKwlJTgkJUFJUTVBfQURBUFRFUglwQWQsCisJSU4JCVVDSEFSCQkJUXVlSWR4LAorCUlOCQlVQ0hBUgkJCU51bWJlclJlcXVpcmVkLAorCUlOCQlQVUNIQVIJCQlGcmVlTnVtYmVySXMpCit7CisJVUxPTkcJCUZyZWVOdW1iZXIgPSAwOworCU5ESVNfU1RBVFVTIAlTdGF0dXMgPSBORElTX1NUQVRVU19GQUlMVVJFOworCisJc3dpdGNoIChRdWVJZHgpCisJeworCQljYXNlIFFJRF9BQ19CSzoKKwkJY2FzZSBRSURfQUNfQkU6CisJCWNhc2UgUUlEX0FDX1ZJOgorCQljYXNlIFFJRF9BQ19WTzoKKwkJY2FzZSBRSURfSENDQToKKwkJCWlmIChwQWQtPlR4UmluZ1tRdWVJZHhdLlR4U3dGcmVlSWR4ID4gcEFkLT5UeFJpbmdbUXVlSWR4XS5UeENwdUlkeCkKKwkJCQlGcmVlTnVtYmVyID0gcEFkLT5UeFJpbmdbUXVlSWR4XS5UeFN3RnJlZUlkeCAtIHBBZC0+VHhSaW5nW1F1ZUlkeF0uVHhDcHVJZHggLSAxOworCQkJZWxzZQorCQkJCUZyZWVOdW1iZXIgPSBwQWQtPlR4UmluZ1tRdWVJZHhdLlR4U3dGcmVlSWR4ICsgVFhfUklOR19TSVpFIC0gcEFkLT5UeFJpbmdbUXVlSWR4XS5UeENwdUlkeCAtIDE7CisKKwkJCWlmIChGcmVlTnVtYmVyID49IE51bWJlclJlcXVpcmVkKQorCQkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisJCQlicmVhazsKKworCQljYXNlIFFJRF9NR01UOgorCQkJaWYgKHBBZC0+TWdtdFJpbmcuVHhTd0ZyZWVJZHggPiBwQWQtPk1nbXRSaW5nLlR4Q3B1SWR4KQorCQkJCUZyZWVOdW1iZXIgPSBwQWQtPk1nbXRSaW5nLlR4U3dGcmVlSWR4IC0gcEFkLT5NZ210UmluZy5UeENwdUlkeCAtIDE7CisJCQllbHNlCisJCQkJRnJlZU51bWJlciA9IHBBZC0+TWdtdFJpbmcuVHhTd0ZyZWVJZHggKyBNR01UX1JJTkdfU0laRSAtIHBBZC0+TWdtdFJpbmcuVHhDcHVJZHggLSAxOworCisJCQlpZiAoRnJlZU51bWJlciA+PSBOdW1iZXJSZXF1aXJlZCkKKwkJCQlTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiUlRNUEZyZWVUWERSZXF1ZXN0OjpJbnZhbGlkIFF1ZUlkeCg9JWQpXG4iLCBRdWVJZHgpKTsKKwkJCWJyZWFrOworCX0KKwkqRnJlZU51bWJlcklzID0gKFVDSEFSKUZyZWVOdW1iZXI7CisKKwlyZXR1cm4gKFN0YXR1cyk7Cit9CisjZW5kaWYgLy8gUlQyODYwIC8vCisKKworCitWT0lEIFJUTVBTZW5kRGlzYXNzb2NpYXRpb25GcmFtZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCkKK3sKK30KKworVk9JRAlSVE1QU2VuZE51bGxGcmFtZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVQ0hBUgkJCVR4UmF0ZSwKKwlJTglCT09MRUFOIAkJYlFvc051bGwpCit7CisJVUNIQVIJTnVsbEZyYW1lWzQ4XTsKKwlVTE9ORwlMZW5ndGg7CisJUEhFQURFUl84MDJfMTEJcEhlYWRlcl84MDJfMTE7CisKKworI2lmZGVmIFJBTElOS19BVEUKKwlpZihBVEVfT04ocEFkKSkKKwl7CisJCXJldHVybjsKKwl9CisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCisgICAgLy8gV1BBIDgwMi4xeCBzZWN1cmVkIHBvcnQgY29udHJvbAorICAgIGlmICgoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkgfHwKKyAgICAgICAgIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spIHx8CisgICAgICAgICAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikgfHwKKyAgICAgICAgIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKQorI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKwkJCSAgfHwgKHBBZC0+U3RhQ2ZnLklFRUU4MDIxWCA9PSBUUlVFKQorI2VuZGlmCisgICAgICAgICkgJiYKKyAgICAgICAocEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQgPT0gV1BBXzgwMl8xWF9QT1JUX05PVF9TRUNVUkVEKSkKKwl7CisJCXJldHVybjsKKwl9CisKKwlOZGlzWmVyb01lbW9yeShOdWxsRnJhbWUsIDQ4KTsKKwlMZW5ndGggPSBzaXplb2YoSEVBREVSXzgwMl8xMSk7CisKKwlwSGVhZGVyXzgwMl8xMSA9IChQSEVBREVSXzgwMl8xMSkgTnVsbEZyYW1lOworCisJcEhlYWRlcl84MDJfMTEtPkZDLlR5cGUgPSBCVFlQRV9EQVRBOworCXBIZWFkZXJfODAyXzExLT5GQy5TdWJUeXBlID0gU1VCVFlQRV9OVUxMX0ZVTkM7CisJcEhlYWRlcl84MDJfMTEtPkZDLlRvRHMgPSAxOworCUNPUFlfTUFDX0FERFIocEhlYWRlcl84MDJfMTEtPkFkZHIxLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisJQ09QWV9NQUNfQUREUihwSGVhZGVyXzgwMl8xMS0+QWRkcjIsIHBBZC0+Q3VycmVudEFkZHJlc3MpOworCUNPUFlfTUFDX0FERFIocEhlYWRlcl84MDJfMTEtPkFkZHIzLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisKKwlpZiAocEFkLT5Db21tb25DZmcuYkFQU0RGb3JjZVBvd2VyU2F2ZSkKKwl7CisJCXBIZWFkZXJfODAyXzExLT5GQy5Qd3JNZ210ID0gUFdSX1NBVkU7CisJfQorCWVsc2UKKwl7CisJCXBIZWFkZXJfODAyXzExLT5GQy5Qd3JNZ210ID0gKHBBZC0+U3RhQ2ZnLlBzbSA9PSBQV1JfU0FWRSkgPyAxOiAwOworCX0KKwlwSGVhZGVyXzgwMl8xMS0+RHVyYXRpb24gPSBwQWQtPkNvbW1vbkNmZy5Ec2lmcyArIFJUTVBDYWxjRHVyYXRpb24ocEFkLCBUeFJhdGUsIDE0KTsKKworCXBBZC0+U2VxdWVuY2UrKzsKKwlwSGVhZGVyXzgwMl8xMS0+U2VxdWVuY2UgPSBwQWQtPlNlcXVlbmNlOworCisJLy8gUHJlcGFyZSBRb3NOdWxsIGZ1bmN0aW9uIGZyYW1lCisJaWYgKGJRb3NOdWxsKQorCXsKKwkJcEhlYWRlcl84MDJfMTEtPkZDLlN1YlR5cGUgPSBTVUJUWVBFX1FPU19OVUxMOworCisJCS8vIGNvcHkgUU9TIGNvbnRyb2wgYnl0ZXMKKwkJTnVsbEZyYW1lW0xlbmd0aF0JPSAgMDsKKwkJTnVsbEZyYW1lW0xlbmd0aCsxXSA9ICAwOworCQlMZW5ndGggKz0gMjsvLyBpZiBwYWQgd2l0aCAyIGJ5dGVzIGZvciBhbGlnbm1lbnQsIEFQU0Qgd2lsbCBmYWlsCisJfQorCisJSEFMX0tpY2tPdXROdWxsRnJhbWVUeChwQWQsIDAsIE51bGxGcmFtZSwgTGVuZ3RoKTsKKworfQorCisvLyBJUlFMID0gRElTUEFUQ0hfTEVWRUwKK1ZPSUQJUlRNUFNlbmRSVFNGcmFtZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlwREEsCisJSU4JdW5zaWduZWQgaW50CU5leHRNcGR1U2l6ZSwKKwlJTglVQ0hBUgkJCVR4UmF0ZSwKKwlJTglVQ0hBUgkJCVJUU1JhdGUsCisJSU4JVVNIT1JUCQkJQWNrRHVyYXRpb24sCisJSU4JVUNIQVIJCQlRdWVJZHgsCisJSU4JVUNIQVIJCQlGcmFtZUdhcCkKK3sKK30KKworCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgRklORCBFTkNSWVBUIEtFWSBBTkQgREVDSURFIENJUEhFUiBBTEdPUklUSE0KKy8vCQlGaW5kIHRoZSBXUEEga2V5LCBlaXRoZXIgR3JvdXAgb3IgUGFpcndpc2UgS2V5CisvLwkJTEVBUCArIFRLSVAgYWxzbyB1c2UgV1BBIGtleS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBEZWNpZGUgV0VQIGJpdCBhbmQgY2lwaGVyIHN1aXRlIHRvIGJlIHVzZWQuIFNhbWUgY2lwaGVyIHN1aXRlIHNob3VsZCBiZSB1c2VkIGZvciB3aG9sZSBmcmFnbWVudCBidXJzdAorLy8gSW4gQ2lzY28gQ0NYIDIuMCBMZWFwIEF1dGhlbnRpY2F0aW9uCisvLwkJICAgV2VwU3RhdHVzIGlzIE5kaXM4MDJfMTFFbmNyeXB0aW9uMUVuYWJsZWQgYnV0IHRoZSBrZXkgd2lsbCB1c2UgUGFpcndpc2VLZXkKKy8vCQkgICBJbnN0ZWFkIG9mIHRoZSBTaGFyZWRLZXksIFNoYXJlZEtleSBMZW5ndGggbWF5IGJlIFplcm8uCitWT0lEIFNUQUZpbmRDaXBoZXJBbGdvcml0aG0oCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVFhfQkxLCQkJKnBUeEJsaykKK3sKKwlORElTXzgwMl8xMV9FTkNSWVBUSU9OX1NUQVRVUwlDaXBoZXI7CQkJCS8vIFRvIGluZGljYXRlIGNpcGhlciB1c2VkIGZvciB0aGlzIHBhY2tldAorCVVDSEFSCQkJCQkJCUNpcGhlckFsZyA9IENJUEhFUl9OT05FOwkJLy8gY2lwaGVyIGFsb2dyaXRobQorCVVDSEFSCQkJCQkJCUtleUlkeCA9IDB4ZmY7CisJUFVDSEFSCQkJCQkJCXBTcmNCdWZWQTsKKwlQQ0lQSEVSX0tFWQkJCQkJCXBLZXkgPSBOVUxMOworCisJcFNyY0J1ZlZBID0gR0VUX09TX1BLVF9EQVRBUFRSKHBUeEJsay0+cFBhY2tldCk7CisKKwl7CisJICAgIC8vIFNlbGVjdCBDaXBoZXIKKwkgICAgaWYgKCgqcFNyY0J1ZlZBICYgMHgwMSkgJiYgKEFESE9DX09OKHBBZCkpKQorCSAgICAgICAgQ2lwaGVyID0gcEFkLT5TdGFDZmcuR3JvdXBDaXBoZXI7IC8vIENpcGhlciBmb3IgTXVsdGljYXN0IG9yIEJyb2FkY2FzdAorCSAgICBlbHNlCisJICAgICAgICBDaXBoZXIgPSBwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyOyAvLyBDaXBoZXIgZm9yIFVuaWNhc3QKKworCQlpZiAoUlRNUF9HRVRfUEFDS0VUX0VBUE9MKHBUeEJsay0+cFBhY2tldCkpCisJCXsKKwkJCUFTU0VSVChwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcgPD0gQ0lQSEVSX0NLSVAxMjgpOworCisJCQkvLyA0LXdheSBoYW5kc2hha2luZyBmcmFtZSBtdXN0IGJlIGNsZWFyCisJCQlpZiAoIShUWF9CTEtfVEVTVF9GTEFHKHBUeEJsaywgZlRYX2JDbGVhckVBUEZyYW1lKSkgJiYgKHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZykgJiYKKwkJCQkocEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5TGVuKSkKKwkJCXsKKwkJCQlDaXBoZXJBbGcgPSBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGc7CisJCQkJS2V5SWR4ID0gMDsKKwkJCX0KKwkJfQorCQllbHNlIGlmIChDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24xRW5hYmxlZCkKKwkJeworI2lmZGVmIExFQVBfU1VQUE9SVAorCQkJaWYgKHBBZC0+U3RhQ2ZnLkNraXBGbGFnICYgMHgxMCkgLy8gQ2lzY28gQ0tJUCBLUCBpcyBvbgorCQkJeworCQkJCWlmIChMRUFQX0NDS01fT04ocEFkKSkKKwkJCQl7CisJCQkJCWlmICgoKCpwU3JjQnVmVkEgJiAweDAxKSAmJiAoQURIT0NfT04ocEFkKSkpKQorCQkJCQkJS2V5SWR4ID0gMTsKKwkJCQkJZWxzZQorCQkJCQkJS2V5SWR4ID0gMDsKKwkJCQl9CisJCQkJZWxzZQorCQkJCQlLZXlJZHggPSBwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQ7CisJCQl9CisJCQllbHNlIGlmIChwQWQtPlN0YUNmZy5Da2lwRmxhZyAmIDB4MDgpIC8vIG9ubHkgQ0tJUCBDTUlDCisJCQkJS2V5SWR4ID0gcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkOworCQkJZWxzZSBpZiAoTEVBUF9DQ0tNX09OKHBBZCkpCisJCQl7CisJCQkJaWYgKCgqcFNyY0J1ZlZBICYgMHgwMSkgJiYgKEFESE9DX09OKHBBZCkpKQorCQkJCQlLZXlJZHggPSAxOworCQkJCWVsc2UKKwkJCQkJS2V5SWR4ID0gMDsKKwkJCX0KKwkJCWVsc2UJLy8gc3RhbmRhcmQgV0VQNjQgb3IgV0VQMTI4CisjZW5kaWYgLy8gTEVBUF9TVVBQT1JUIC8vCisJCQkJS2V5SWR4ID0gcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkOworCQl9CisJCWVsc2UgaWYgKChDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkgfHwKKwkJCQkgKENpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKSkKKwkJeworCQkJaWYgKCgqcFNyY0J1ZlZBICYgMHgwMSkgJiYgKEFESE9DX09OKHBBZCkpKSAvLyBtdWx0aWNhc3QKKwkJCQlLZXlJZHggPSBwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQ7CisJCQllbHNlIGlmIChwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5LZXlMZW4pCisJCQkJS2V5SWR4ID0gMDsKKwkJCWVsc2UKKwkJCQlLZXlJZHggPSBwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQ7CisJCX0KKworCQlpZiAoS2V5SWR4ID09IDB4ZmYpCisJCQlDaXBoZXJBbGcgPSBDSVBIRVJfTk9ORTsKKwkJZWxzZSBpZiAoKENpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbkRpc2FibGVkKSB8fCAocEFkLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5LZXlMZW4gPT0gMCkpCisJCQlDaXBoZXJBbGcgPSBDSVBIRVJfTk9ORTsKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisJICAgIGVsc2UgaWYgKCBwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgJiYKKwkgICAgICAgICAgICAgKENpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjFFbmFibGVkKSAmJgorCSAgICAgICAgICAgICAocEFkLT5TdGFDZmcuSUVFRTgwMjFYID09IFRSVUUpICYmCisJICAgICAgICAgICAgIChwQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZCA9PSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQpKQorCSAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX05PTkU7CisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCQllbHNlCisJCXsKKwkJCS8vSGVhZGVyXzgwMl8xMS5GQy5XZXAgPSAxOworCQkJQ2lwaGVyQWxnID0gcEFkLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5DaXBoZXJBbGc7CisJCQlwS2V5ID0gJnBBZC0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF07CisJCX0KKwl9CisKKwlwVHhCbGstPkNpcGhlckFsZyA9IENpcGhlckFsZzsKKwlwVHhCbGstPnBLZXkgPSBwS2V5OworfQorCisKK1ZPSUQgU1RBQnVpbGRDb21tb244MDJfMTFIZWFkZXIoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFRYX0JMSyAgICAgICAgICAqcFR4QmxrKQoreworCisJSEVBREVSXzgwMl8xMQkqcEhlYWRlcl84MDJfMTE7CisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJQk9PTEVBTgliRExTRnJhbWUgPSBGQUxTRTsKKwlJTlQJRGxzRW50cnlJbmRleCA9IDA7CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisKKwkvLworCS8vIE1BS0UgQSBDT01NT04gODAyLjExIEhFQURFUgorCS8vCisKKwkvLyBub3JtYWwgd2xhbiBoZWFkZXIgc2l6ZSA6IDI0IG9jdGV0cworCXBUeEJsay0+TXBkdUhlYWRlckxlbiA9IHNpemVvZihIRUFERVJfODAyXzExKTsKKworCXBIZWFkZXJfODAyXzExID0gKEhFQURFUl84MDJfMTEgKikgJnBUeEJsay0+SGVhZGVyQnVmW1RYSU5GT19TSVpFICsgVFhXSV9TSVpFXTsKKworCU5kaXNaZXJvTWVtb3J5KHBIZWFkZXJfODAyXzExLCBzaXplb2YoSEVBREVSXzgwMl8xMSkpOworCisJcEhlYWRlcl84MDJfMTEtPkZDLkZyRHMgPSAwOworCXBIZWFkZXJfODAyXzExLT5GQy5UeXBlID0gQlRZUEVfREFUQTsKKwlwSGVhZGVyXzgwMl8xMS0+RkMuU3ViVHlwZSA9ICgoVFhfQkxLX1RFU1RfRkxBRyhwVHhCbGssIGZUWF9iV01NKSkgPyBTVUJUWVBFX1FEQVRBIDogU1VCVFlQRV9EQVRBKTsKKworI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCWlmIChJTkZSQV9PTihwQWQpKQorCXsKKwkJLy8gQ2hlY2sgaWYgdGhlIGZyYW1lIGNhbiBiZSBzZW50IHRocm91Z2ggRExTIGRpcmVjdCBsaW5rIGludGVyZmFjZQorCQkvLyBJZiBwYWNrZXQgY2FuIGJlIHNlbnQgdGhyb3VnaCBETFMsIHRoZW4gZm9yY2UgYWdncmVnYXRpb24gZGlzYWJsZS4gKEhhcmQgdG8gZGV0ZXJtaW5lIHBlZXIgU1RBJ3MgY2FwYWJpbGl0eSkKKwkJRGxzRW50cnlJbmRleCA9IFJUTVBDaGVja0RMU0ZyYW1lKHBBZCwgcFR4QmxrLT5wU3JjQnVmSGVhZGVyKTsKKwkJaWYgKERsc0VudHJ5SW5kZXggPj0gMCkKKwkJCWJETFNGcmFtZSA9IFRSVUU7CisJCWVsc2UKKwkJCWJETFNGcmFtZSA9IEZBTFNFOworCX0KKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKworICAgIGlmIChwVHhCbGstPnBNYWNFbnRyeSkKKwl7CisJCWlmIChUWF9CTEtfVEVTVF9GTEFHKHBUeEJsaywgZlRYX2JGb3JjZU5vblFvUykpCisJCXsKKwkJCXBIZWFkZXJfODAyXzExLT5TZXF1ZW5jZSA9IHBUeEJsay0+cE1hY0VudHJ5LT5Ob25Rb3NEYXRhU2VxOworCQkJcFR4QmxrLT5wTWFjRW50cnktPk5vblFvc0RhdGFTZXEgPSAocFR4QmxrLT5wTWFjRW50cnktPk5vblFvc0RhdGFTZXErMSkgJiBNQVhTRVE7CisJCX0KKwkJZWxzZQorCQl7CisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJCQlpZiAoYkRMU0ZyYW1lKQorCQkJeworCQkJCXBIZWFkZXJfODAyXzExLT5TZXF1ZW5jZSA9IHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W0Rsc0VudHJ5SW5kZXhdLlNlcXVlbmNlOworCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W0Rsc0VudHJ5SW5kZXhdLlNlcXVlbmNlID0gKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W0Rsc0VudHJ5SW5kZXhdLlNlcXVlbmNlKzEpICYgTUFYU0VROworCQkJfQorCQkJZWxzZQorI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCQkJeworICAgIAkgICAgcEhlYWRlcl84MDJfMTEtPlNlcXVlbmNlID0gcFR4QmxrLT5wTWFjRW50cnktPlR4U2VxW3BUeEJsay0+VXNlclByaW9yaXR5XTsKKyAgICAJICAgIHBUeEJsay0+cE1hY0VudHJ5LT5UeFNlcVtwVHhCbGstPlVzZXJQcmlvcml0eV0gPSAocFR4QmxrLT5wTWFjRW50cnktPlR4U2VxW3BUeEJsay0+VXNlclByaW9yaXR5XSsxKSAmIE1BWFNFUTsKKyAgICAJfQorCX0KKwl9CisJZWxzZQorCXsKKwkJcEhlYWRlcl84MDJfMTEtPlNlcXVlbmNlID0gcEFkLT5TZXF1ZW5jZTsKKwkJcEFkLT5TZXF1ZW5jZSA9IChwQWQtPlNlcXVlbmNlKzEpICYgTUFYU0VROyAvLyBuZXh0IHNlcXVlbmNlCisJfQorCisJcEhlYWRlcl84MDJfMTEtPkZyYWcgPSAwOworCisJcEhlYWRlcl84MDJfMTEtPkZDLk1vcmVEYXRhID0gVFhfQkxLX1RFU1RfRkxBRyhwVHhCbGssIGZUWF9iTW9yZURhdGEpOworCisJeworCQlpZiAoSU5GUkFfT04ocEFkKSkKKwkJeworI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCQkJaWYgKGJETFNGcmFtZSkKKwkJCXsKKwkJCQlDT1BZX01BQ19BRERSKHBIZWFkZXJfODAyXzExLT5BZGRyMSwgcFR4QmxrLT5wU3JjQnVmSGVhZGVyKTsKKwkJCQlDT1BZX01BQ19BRERSKHBIZWFkZXJfODAyXzExLT5BZGRyMiwgcEFkLT5DdXJyZW50QWRkcmVzcyk7CisJCQkJQ09QWV9NQUNfQUREUihwSGVhZGVyXzgwMl8xMS0+QWRkcjMsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKwkJCQlwSGVhZGVyXzgwMl8xMS0+RkMuVG9EcyA9IDA7CisJCQl9CisJCQllbHNlCisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisJCQl7CisJCQlDT1BZX01BQ19BRERSKHBIZWFkZXJfODAyXzExLT5BZGRyMSwgcEFkLT5Db21tb25DZmcuQnNzaWQpOworCQkJQ09QWV9NQUNfQUREUihwSGVhZGVyXzgwMl8xMS0+QWRkcjIsIHBBZC0+Q3VycmVudEFkZHJlc3MpOworCQkJQ09QWV9NQUNfQUREUihwSGVhZGVyXzgwMl8xMS0+QWRkcjMsIHBUeEJsay0+cFNyY0J1ZkhlYWRlcik7CisJCQlwSGVhZGVyXzgwMl8xMS0+RkMuVG9EcyA9IDE7CisJCX0KKwkJfQorCQllbHNlIGlmIChBREhPQ19PTihwQWQpKQorCQl7CisJCQlDT1BZX01BQ19BRERSKHBIZWFkZXJfODAyXzExLT5BZGRyMSwgcFR4QmxrLT5wU3JjQnVmSGVhZGVyKTsKKwkJCUNPUFlfTUFDX0FERFIocEhlYWRlcl84MDJfMTEtPkFkZHIyLCBwQWQtPkN1cnJlbnRBZGRyZXNzKTsKKwkJCUNPUFlfTUFDX0FERFIocEhlYWRlcl84MDJfMTEtPkFkZHIzLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisJCQlwSGVhZGVyXzgwMl8xMS0+RkMuVG9EcyA9IDA7CisJCX0KKwl9CisKKwlpZiAocFR4QmxrLT5DaXBoZXJBbGcgIT0gQ0lQSEVSX05PTkUpCisJCXBIZWFkZXJfODAyXzExLT5GQy5XZXAgPSAxOworCisJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkvLyBTVEVQIDIuIE1BS0UgQSBDT01NT04gODAyLjExIEhFQURFUiBTSEFSRUQgQlkgRU5USVJFIEZSQUdNRU5UIEJVUlNULiBGaWxsIHNlcXVlbmNlIGxhdGVyLgorCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJBUFNERm9yY2VQb3dlclNhdmUpCisgICAgCXBIZWFkZXJfODAyXzExLT5GQy5Qd3JNZ210ID0gUFdSX1NBVkU7CisJZWxzZQorICAgIAlwSGVhZGVyXzgwMl8xMS0+RkMuUHdyTWdtdCA9IChwQWQtPlN0YUNmZy5Qc20gPT0gUFdSX1NBVkUpOworfQorCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCitWT0lEIFNUQUJ1aWxkQ2FjaGU4MDJfMTFIZWFkZXIoCisJSU4gUlRNUF9BREFQVEVSCQkqcEFkLAorCUlOIFRYX0JMSwkJCSpwVHhCbGssCisJSU4gVUNIQVIJCQkqcEhlYWRlcikKK3sKKwlNQUNfVEFCTEVfRU5UUlkJKnBNYWNFbnRyeTsKKwlQSEVBREVSXzgwMl8xMQlwSGVhZGVyODAyMTE7CisKKwlwSGVhZGVyODAyMTEgPSAoUEhFQURFUl84MDJfMTEpcEhlYWRlcjsKKwlwTWFjRW50cnkgPSBwVHhCbGstPnBNYWNFbnRyeTsKKworCS8vCisJLy8gVXBkYXRlIHRoZSBjYWNoZWQgODAyLjExIEhFQURFUgorCS8vCisKKwkvLyBub3JtYWwgd2xhbiBoZWFkZXIgc2l6ZSA6IDI0IG9jdGV0cworCXBUeEJsay0+TXBkdUhlYWRlckxlbiA9IHNpemVvZihIRUFERVJfODAyXzExKTsKKworCS8vIE1vcmUgQml0CisJcEhlYWRlcjgwMjExLT5GQy5Nb3JlRGF0YSA9IFRYX0JMS19URVNUX0ZMQUcocFR4QmxrLCBmVFhfYk1vcmVEYXRhKTsKKworCS8vIFNlcXVlbmNlCisJcEhlYWRlcjgwMjExLT5TZXF1ZW5jZSA9IHBNYWNFbnRyeS0+VHhTZXFbcFR4QmxrLT5Vc2VyUHJpb3JpdHldOworICAgIHBNYWNFbnRyeS0+VHhTZXFbcFR4QmxrLT5Vc2VyUHJpb3JpdHldID0gKHBNYWNFbnRyeS0+VHhTZXFbcFR4QmxrLT5Vc2VyUHJpb3JpdHldKzEpICYgTUFYU0VROworCisJeworCQkvLyBDaGVjayBpZiB0aGUgZnJhbWUgY2FuIGJlIHNlbnQgdGhyb3VnaCBETFMgZGlyZWN0IGxpbmsgaW50ZXJmYWNlCisJCS8vIElmIHBhY2tldCBjYW4gYmUgc2VudCB0aHJvdWdoIERMUywgdGhlbiBmb3JjZSBhZ2dyZWdhdGlvbiBkaXNhYmxlLiAoSGFyZCB0byBkZXRlcm1pbmUgcGVlciBTVEEncyBjYXBhYmlsaXR5KQorI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCQlCT09MRUFOCWJETFNGcmFtZSA9IEZBTFNFOworCQlJTlQJRGxzRW50cnlJbmRleCA9IDA7CisKKwkJRGxzRW50cnlJbmRleCA9IFJUTVBDaGVja0RMU0ZyYW1lKHBBZCwgcFR4QmxrLT5wU3JjQnVmSGVhZGVyKTsKKwkJaWYgKERsc0VudHJ5SW5kZXggPj0gMCkKKwkJCWJETFNGcmFtZSA9IFRSVUU7CisJCWVsc2UKKwkJCWJETFNGcmFtZSA9IEZBTFNFOworI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCisJCS8vIFRoZSBhZGRyMyBvZiBub3JtYWwgcGFja2V0IHNlbmQgZnJvbSBEUyBpcyBEZXN0IE1hYyBhZGRyZXNzLgorI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCQlpZiAoYkRMU0ZyYW1lKQorCQl7CisJCQlDT1BZX01BQ19BRERSKHBIZWFkZXI4MDIxMS0+QWRkcjEsIHBUeEJsay0+cFNyY0J1ZkhlYWRlcik7CisJCQlDT1BZX01BQ19BRERSKHBIZWFkZXI4MDIxMS0+QWRkcjMsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKwkJCXBIZWFkZXI4MDIxMS0+RkMuVG9EcyA9IDA7CisJCX0KKwkJZWxzZQorI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCQlpZiAoQURIT0NfT04ocEFkKSkKKwkJCUNPUFlfTUFDX0FERFIocEhlYWRlcjgwMjExLT5BZGRyMywgcEFkLT5Db21tb25DZmcuQnNzaWQpOworCQllbHNlCisJCQlDT1BZX01BQ19BRERSKHBIZWFkZXI4MDIxMS0+QWRkcjMsIHBUeEJsay0+cFNyY0J1ZkhlYWRlcik7CisJfQorCisJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkvLyBTVEVQIDIuIE1BS0UgQSBDT01NT04gODAyLjExIEhFQURFUiBTSEFSRUQgQlkgRU5USVJFIEZSQUdNRU5UIEJVUlNULiBGaWxsIHNlcXVlbmNlIGxhdGVyLgorCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJBUFNERm9yY2VQb3dlclNhdmUpCisgICAgCXBIZWFkZXI4MDIxMS0+RkMuUHdyTWdtdCA9IFBXUl9TQVZFOworCWVsc2UKKyAgICAJcEhlYWRlcjgwMjExLT5GQy5Qd3JNZ210ID0gKHBBZC0+U3RhQ2ZnLlBzbSA9PSBQV1JfU0FWRSk7Cit9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKK3N0YXRpYyBpbmxpbmUgUFVDSEFSIFNUQV9CdWlsZF9BUmFsaW5rX0ZyYW1lX0hlYWRlcigKKwlJTiBSVE1QX0FEQVBURVIgKnBBZCwKKwlJTiBUWF9CTEsJCSpwVHhCbGspCit7CisJUFVDSEFSCQkJcEhlYWRlckJ1ZlB0cjsKKwlIRUFERVJfODAyXzExCSpwSGVhZGVyXzgwMl8xMTsKKwlQTkRJU19QQUNLRVQJcE5leHRQYWNrZXQ7CisJVUlOVDMyCQkJbmV4dEJ1ZkxlbjsKKwlQUVVFVUVfRU5UUlkJcFFFbnRyeTsKKworCVNUQUZpbmRDaXBoZXJBbGdvcml0aG0ocEFkLCBwVHhCbGspOworCVNUQUJ1aWxkQ29tbW9uODAyXzExSGVhZGVyKHBBZCwgcFR4QmxrKTsKKworCisJcEhlYWRlckJ1ZlB0ciA9ICZwVHhCbGstPkhlYWRlckJ1ZltUWElORk9fU0laRSArIFRYV0lfU0laRV07CisJcEhlYWRlcl84MDJfMTEgPSAoSEVBREVSXzgwMl8xMSAqKSBwSGVhZGVyQnVmUHRyOworCisJLy8gc3RlYWwgIm9yZGVyIiBiaXQgdG8gbWFyayAiYWdncmVnYXRpb24iCisJcEhlYWRlcl84MDJfMTEtPkZDLk9yZGVyID0gMTsKKworCS8vIHNraXAgY29tbW9uIGhlYWRlcgorCXBIZWFkZXJCdWZQdHIgKz0gcFR4QmxrLT5NcGR1SGVhZGVyTGVuOworCisJaWYgKFRYX0JMS19URVNUX0ZMQUcocFR4QmxrLCBmVFhfYldNTSkpCisJeworCQkvLworCQkvLyBidWlsZCBRT1MgQ29udHJvbCBieXRlcworCQkvLworCQkqcEhlYWRlckJ1ZlB0ciA9IChwVHhCbGstPlVzZXJQcmlvcml0eSAmIDB4MEYpOworCisJCSoocEhlYWRlckJ1ZlB0cisxKSA9IDA7CisJCXBIZWFkZXJCdWZQdHIgKz0yOworCQlwVHhCbGstPk1wZHVIZWFkZXJMZW4gKz0gMjsKKwl9CisKKwkvLyBwYWRkaW5nIGF0IGZyb250IG9mIExMQyBoZWFkZXIuIExMQyBoZWFkZXIgc2hvdWxkIGF0IDQtYnl0ZXMgYWxpZ21lbnQuCisJcFR4QmxrLT5IZHJQYWRMZW4gPSAoVUxPTkcpcEhlYWRlckJ1ZlB0cjsKKwlwSGVhZGVyQnVmUHRyID0gKFBDSEFSKVJPVU5EX1VQKHBIZWFkZXJCdWZQdHIsIDQpOworCXBUeEJsay0+SGRyUGFkTGVuID0gKFVMT05HKShwSGVhZGVyQnVmUHRyIC0gcFR4QmxrLT5IZHJQYWRMZW4pOworCisJLy8gRm9yIFJBIEFnZ3JlZ2F0aW9uLAorCS8vIHB1dCB0aGUgMm5kIE1TRFUgbGVuZ3RoKGV4dHJhIDItYnl0ZSBmaWVsZCkgYWZ0ZXIgUU9TX0NPTlRST0wgaW4gbGl0dGxlIGVuZGlhbiBmb3JtYXQKKwlwUUVudHJ5ID0gcFR4QmxrLT5UeFBhY2tldExpc3QuSGVhZDsKKwlwTmV4dFBhY2tldCA9IFFVRVVFX0VOVFJZX1RPX1BLVChwUUVudHJ5KTsKKwluZXh0QnVmTGVuID0gR0VUX09TX1BLVF9MRU4ocE5leHRQYWNrZXQpOworCWlmIChSVE1QX0dFVF9QQUNLRVRfVkxBTihwTmV4dFBhY2tldCkpCisJCW5leHRCdWZMZW4gLT0gTEVOR1RIXzgwMl8xUTsKKworCSpwSGVhZGVyQnVmUHRyID0gKFVDSEFSKW5leHRCdWZMZW4gJiAweGZmOworCSoocEhlYWRlckJ1ZlB0cisxKSA9IChVQ0hBUikobmV4dEJ1ZkxlbiA+PiA4KTsKKworCXBIZWFkZXJCdWZQdHIgKz0gMjsKKwlwVHhCbGstPk1wZHVIZWFkZXJMZW4gKz0gMjsKKworCXJldHVybiBwSGVhZGVyQnVmUHRyOworCit9CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKK3N0YXRpYyBpbmxpbmUgUFVDSEFSIFNUQV9CdWlsZF9BTVNEVV9GcmFtZV9IZWFkZXIoCisJSU4gUlRNUF9BREFQVEVSICpwQWQsCisJSU4gVFhfQkxLCQkqcFR4QmxrKQoreworCVBVQ0hBUgkJCXBIZWFkZXJCdWZQdHI7Ly8sIHBTYXZlQnVmUHRyOworCUhFQURFUl84MDJfMTEJKnBIZWFkZXJfODAyXzExOworCisKKwlTVEFGaW5kQ2lwaGVyQWxnb3JpdGhtKHBBZCwgcFR4QmxrKTsKKwlTVEFCdWlsZENvbW1vbjgwMl8xMUhlYWRlcihwQWQsIHBUeEJsayk7CisKKwlwSGVhZGVyQnVmUHRyID0gJnBUeEJsay0+SGVhZGVyQnVmW1RYSU5GT19TSVpFICsgVFhXSV9TSVpFXTsKKwlwSGVhZGVyXzgwMl8xMSA9IChIRUFERVJfODAyXzExICopIHBIZWFkZXJCdWZQdHI7CisKKwkvLyBza2lwIGNvbW1vbiBoZWFkZXIKKwlwSGVhZGVyQnVmUHRyICs9IHBUeEJsay0+TXBkdUhlYWRlckxlbjsKKworCS8vCisJLy8gYnVpbGQgUU9TIENvbnRyb2wgYnl0ZXMKKwkvLworCSpwSGVhZGVyQnVmUHRyID0gKHBUeEJsay0+VXNlclByaW9yaXR5ICYgMHgwRik7CisKKwkvLworCS8vIEEtTVNEVSBwYWNrZXQKKwkvLworCSpwSGVhZGVyQnVmUHRyIHw9IDB4ODA7CisKKwkqKHBIZWFkZXJCdWZQdHIrMSkgPSAwOworCXBIZWFkZXJCdWZQdHIgKz0yOworCXBUeEJsay0+TXBkdUhlYWRlckxlbiArPSAyOworCisJLy9wU2F2ZUJ1ZlB0ciA9IHBIZWFkZXJCdWZQdHI7CisKKwkvLworCS8vIHBhZGRpbmcgYXQgZnJvbnQgb2YgTExDIGhlYWRlcgorCS8vIExMQyBoZWFkZXIgc2hvdWxkIGxvY2F0ZSBhdCA0LW9jdGV0cyBhbGlnbWVudAorCS8vCisJLy8gQEBAIE1wZHVIZWFkZXJMZW4gZXhjbHVkaW5nIHBhZGRpbmcgQEBACisJLy8KKwlwVHhCbGstPkhkclBhZExlbiA9IChVTE9ORylwSGVhZGVyQnVmUHRyOworCXBIZWFkZXJCdWZQdHIgPSAoUENIQVIpIFJPVU5EX1VQKHBIZWFkZXJCdWZQdHIsIDQpOworCXBUeEJsay0+SGRyUGFkTGVuID0gKFVMT05HKShwSGVhZGVyQnVmUHRyIC0gcFR4QmxrLT5IZHJQYWRMZW4pOworCisJcmV0dXJuIHBIZWFkZXJCdWZQdHI7CisKK30KKworCitWT0lEIFNUQV9BTVBEVV9GcmFtZV9UeCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglUWF9CTEsJCQkqcFR4QmxrKQoreworCUhFQURFUl84MDJfMTEJKnBIZWFkZXJfODAyXzExOworCVBVQ0hBUgkJCXBIZWFkZXJCdWZQdHI7CisJVVNIT1JUCQkJRnJlZU51bWJlcjsKKwlNQUNfVEFCTEVfRU5UUlkJKnBNYWNFbnRyeTsKKwlCT09MRUFOCQkJYlZMQU5Qa3Q7CisJUFFVRVVFX0VOVFJZCXBRRW50cnk7CisKKwlBU1NFUlQocFR4QmxrKTsKKworCXdoaWxlKHBUeEJsay0+VHhQYWNrZXRMaXN0LkhlYWQpCisJeworCQlwUUVudHJ5ID0gUmVtb3ZlSGVhZFF1ZXVlKCZwVHhCbGstPlR4UGFja2V0TGlzdCk7CisJCXBUeEJsay0+cFBhY2tldCA9IFFVRVVFX0VOVFJZX1RPX1BBQ0tFVChwUUVudHJ5KTsKKwkJaWYgKCBSVE1QX0ZpbGxUeEJsa0luZm8ocEFkLCBwVHhCbGspICE9IFRSVUUpCisJCXsKKwkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwVHhCbGstPnBQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCQkJY29udGludWU7CisJCX0KKworCQliVkxBTlBrdCA9IChSVE1QX0dFVF9QQUNLRVRfVkxBTihwVHhCbGstPnBQYWNrZXQpID8gVFJVRSA6IEZBTFNFKTsKKworCQlwTWFjRW50cnkgPSBwVHhCbGstPnBNYWNFbnRyeTsKKwkJaWYgKHBNYWNFbnRyeS0+aXNDYWNoZWQpCisJCXsKKwkJCS8vIE5PVEU6IFBsZWFzZSBtYWtlIHN1cmUgdGhlIHNpemUgb2YgcE1hY0VudHJ5LT5DYWNoZWRCdWZbXSBpcyBzbWFsbGVyIHRoYW4gcFR4QmxrLT5IZWFkZXJCdWZbXSEhISEKKwkJCU5kaXNNb3ZlTWVtb3J5KChQVUNIQVIpJnBUeEJsay0+SGVhZGVyQnVmW1RYSU5GT19TSVpFXSwgKFBVQ0hBUikmcE1hY0VudHJ5LT5DYWNoZWRCdWZbMF0sIFRYV0lfU0laRSArIHNpemVvZihIRUFERVJfODAyXzExKSk7CisJCQlwSGVhZGVyQnVmUHRyID0gKFBVQ0hBUikoJnBUeEJsay0+SGVhZGVyQnVmW1RYSU5GT19TSVpFICsgVFhXSV9TSVpFXSk7CisJCQlTVEFCdWlsZENhY2hlODAyXzExSGVhZGVyKHBBZCwgcFR4QmxrLCBwSGVhZGVyQnVmUHRyKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCVNUQUZpbmRDaXBoZXJBbGdvcml0aG0ocEFkLCBwVHhCbGspOworCQkJU1RBQnVpbGRDb21tb244MDJfMTFIZWFkZXIocEFkLCBwVHhCbGspOworCisJCQlwSGVhZGVyQnVmUHRyID0gJnBUeEJsay0+SGVhZGVyQnVmW1RYSU5GT19TSVpFICsgVFhXSV9TSVpFXTsKKwkJfQorCisKKwkJcEhlYWRlcl84MDJfMTEgPSAoSEVBREVSXzgwMl8xMSAqKSBwSGVhZGVyQnVmUHRyOworCisJCS8vIHNraXAgY29tbW9uIGhlYWRlcgorCQlwSGVhZGVyQnVmUHRyICs9IHBUeEJsay0+TXBkdUhlYWRlckxlbjsKKworCQkvLworCQkvLyBidWlsZCBRT1MgQ29udHJvbCBieXRlcworCQkvLworCQkqcEhlYWRlckJ1ZlB0ciA9IChwVHhCbGstPlVzZXJQcmlvcml0eSAmIDB4MEYpOworCQkqKHBIZWFkZXJCdWZQdHIrMSkgPSAwOworCQlwSGVhZGVyQnVmUHRyICs9MjsKKwkJcFR4QmxrLT5NcGR1SGVhZGVyTGVuICs9IDI7CisKKwkJLy8KKwkJLy8gYnVpbGQgSFRDKworCQkvLyBIVEMgY29udHJvbCBmaWxlZCBmb2xsb3dpbmcgUW9TIGZpZWxkCisJCS8vCisJCWlmICgocEFkLT5Db21tb25DZmcuYlJkZyA9PSBUUlVFKSAmJiBDTElFTlRfU1RBVFVTX1RFU1RfRkxBRyhwVHhCbGstPnBNYWNFbnRyeSwgZkNMSUVOVF9TVEFUVVNfUkRHX0NBUEFCTEUpKQorCQl7CisJCQlpZiAocE1hY0VudHJ5LT5pc0NhY2hlZCA9PSBGQUxTRSkKKwkJCXsKKwkJCQkvLyBtYXJrIEhUQyBiaXQKKwkJCQlwSGVhZGVyXzgwMl8xMS0+RkMuT3JkZXIgPSAxOworCisJCQkJTmRpc1plcm9NZW1vcnkocEhlYWRlckJ1ZlB0ciwgNCk7CisJCQkJKihwSGVhZGVyQnVmUHRyKzMpIHw9IDB4ODA7CisJCQl9CisJCQlwSGVhZGVyQnVmUHRyICs9IDQ7CisJCQlwVHhCbGstPk1wZHVIZWFkZXJMZW4gKz0gNDsKKwkJfQorCisJCS8vcFR4QmxrLT5NcGR1SGVhZGVyTGVuID0gcEhlYWRlckJ1ZlB0ciAtIHBUeEJsay0+SGVhZGVyQnVmIC0gVFhXSV9TSVpFIC0gVFhJTkZPX1NJWkU7CisJCUFTU0VSVChwVHhCbGstPk1wZHVIZWFkZXJMZW4gPj0gMjQpOworCisJCS8vIHNraXAgODAyLjMgaGVhZGVyCisJCXBUeEJsay0+cFNyY0J1ZkRhdGEgPSBwVHhCbGstPnBTcmNCdWZIZWFkZXIgKyBMRU5HVEhfODAyXzM7CisJCXBUeEJsay0+U3JjQnVmTGVuICAtPSBMRU5HVEhfODAyXzM7CisKKwkJLy8gc2tpcCB2bGFuIHRhZworCQlpZiAoYlZMQU5Qa3QpCisJCXsKKwkJCXBUeEJsay0+cFNyY0J1ZkRhdGEJKz0gTEVOR1RIXzgwMl8xUTsKKwkJCXBUeEJsay0+U3JjQnVmTGVuCS09IExFTkdUSF84MDJfMVE7CisJCX0KKworCQkvLworCQkvLyBwYWRkaW5nIGF0IGZyb250IG9mIExMQyBoZWFkZXIKKwkJLy8gTExDIGhlYWRlciBzaG91bGQgbG9jYXRlIGF0IDQtb2N0ZXRzIGFsaWdtZW50CisJCS8vCisJCS8vIEBAQCBNcGR1SGVhZGVyTGVuIGV4Y2x1ZGluZyBwYWRkaW5nIEBAQAorCQkvLworCQlwVHhCbGstPkhkclBhZExlbiA9IChVTE9ORylwSGVhZGVyQnVmUHRyOworCQlwSGVhZGVyQnVmUHRyID0gKFBDSEFSKSBST1VORF9VUChwSGVhZGVyQnVmUHRyLCA0KTsKKwkJcFR4QmxrLT5IZHJQYWRMZW4gPSAoVUxPTkcpKHBIZWFkZXJCdWZQdHIgLSBwVHhCbGstPkhkclBhZExlbik7CisKKwkJeworCisJCQkvLworCQkJLy8gSW5zZXJ0IExMQy1TTkFQIGVuY2Fwc3VsYXRpb24gLSA4IG9jdGV0cworCQkJLy8KKwkJCUVYVFJBX0xMQ1NOQVBfRU5DQVBfRlJPTV9QS1RfT0ZGU0VUKHBUeEJsay0+cFNyY0J1ZkRhdGEtMiwgcFR4QmxrLT5wRXh0cmFMbGNTbmFwRW5jYXApOworCQkJaWYgKHBUeEJsay0+cEV4dHJhTGxjU25hcEVuY2FwKQorCQkJeworCQkJCU5kaXNNb3ZlTWVtb3J5KHBIZWFkZXJCdWZQdHIsIHBUeEJsay0+cEV4dHJhTGxjU25hcEVuY2FwLCA2KTsKKwkJCQlwSGVhZGVyQnVmUHRyICs9IDY7CisJCQkJLy8gZ2V0IDIgb2N0ZXRzIChUeXBlb2ZMZW4pCisJCQkJTmRpc01vdmVNZW1vcnkocEhlYWRlckJ1ZlB0ciwgcFR4QmxrLT5wU3JjQnVmRGF0YS0yLCAyKTsKKwkJCQlwSGVhZGVyQnVmUHRyICs9IDI7CisJCQkJcFR4QmxrLT5NcGR1SGVhZGVyTGVuICs9IExFTkdUSF84MDJfMV9IOworCQkJfQorCisJCX0KKworCQlpZiAocE1hY0VudHJ5LT5pc0NhY2hlZCkKKwkJeworICAgICAgICAgICAgUlRNUFdyaXRlVHhXSV9DYWNoZShwQWQsIChQVFhXSV9TVFJVQykoJnBUeEJsay0+SGVhZGVyQnVmW1RYSU5GT19TSVpFXSksIHBUeEJsayk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlSVE1QV3JpdGVUeFdJX0RhdGEocEFkLCAoUFRYV0lfU1RSVUMpKCZwVHhCbGstPkhlYWRlckJ1ZltUWElORk9fU0laRV0pLCBwVHhCbGspOworCisJCQlOZGlzWmVyb01lbW9yeSgoUFVDSEFSKSgmcE1hY0VudHJ5LT5DYWNoZWRCdWZbMF0pLCBzaXplb2YocE1hY0VudHJ5LT5DYWNoZWRCdWYpKTsKKwkJCU5kaXNNb3ZlTWVtb3J5KChQVUNIQVIpKCZwTWFjRW50cnktPkNhY2hlZEJ1ZlswXSksIChQVUNIQVIpKCZwVHhCbGstPkhlYWRlckJ1ZltUWElORk9fU0laRV0pLCAocEhlYWRlckJ1ZlB0ciAtIChQVUNIQVIpKCZwVHhCbGstPkhlYWRlckJ1ZltUWElORk9fU0laRV0pKSk7CisJCQlwTWFjRW50cnktPmlzQ2FjaGVkID0gVFJVRTsKKwkJfQorCisJCS8vIGNhbGN1bGF0ZSBUcmFuc21pdHRlZCBBTVBEVSBjb3VudCBhbmQgQnl0ZUNvdW50CisJCXsKKwkJCXBBZC0+UmFsaW5rQ291bnRlcnMuVHJhbnNtaXR0ZWRNUERVc0luQU1QRFVDb3VudC51Lkxvd1BhcnQgKys7CisJCQlwQWQtPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkT2N0ZXRzSW5BTVBEVUNvdW50LlF1YWRQYXJ0ICs9IHBUeEJsay0+U3JjQnVmTGVuOworCQl9CisKKwkJLy9GcmVlTnVtYmVyID0gR0VUX1RYUklOR19GUkVFTk8ocEFkLCBRdWVJZHgpOworCisJCUhBTF9Xcml0ZVR4UmVzb3VyY2UocEFkLCBwVHhCbGssIFRSVUUsICZGcmVlTnVtYmVyKTsKKworCQkvLworCQkvLyBLaWNrIG91dCBUeAorCQkvLworCQlIQUxfS2lja091dFR4KHBBZCwgcFR4QmxrLCBwVHhCbGstPlF1ZUlkeCk7CisKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5LaWNrVHhDb3VudCsrOworCQlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4RG9uZUNvdW50Kys7CisJfQorCit9CisKKworVk9JRCBTVEFfQU1TRFVfRnJhbWVfVHgoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVFhfQkxLCQkJKnBUeEJsaykKK3sKKwlQVUNIQVIJCQlwSGVhZGVyQnVmUHRyOworCVVTSE9SVAkJCUZyZWVOdW1iZXI7CisJVVNIT1JUCQkJc3ViRnJhbWVQYXlsb2FkTGVuID0gMDsJLy8gQU1TRFUgU3ViZnJhbWUgbGVuZ3RoIHdpdGhvdXQgQU1TRFUtSGVhZGVyIC8gUGFkZGluZy4KKwlVU0hPUlQJCQl0b3RhbE1QRFVTaXplPTA7CisJVUNIQVIJCQkqc3ViRnJhbWVIZWFkZXI7CisJVUNIQVIJCQlwYWRkaW5nID0gMDsKKwlVU0hPUlQJCQlGaXJzdFR4ID0gMCwgTGFzdFR4SWR4ID0gMDsKKwlCT09MRUFOCQkJYlZMQU5Qa3Q7CisJaW50IAkJCWZyYW1lTnVtID0gMDsKKwlQUVVFVUVfRU5UUlkJcFFFbnRyeTsKKworCisJQVNTRVJUKHBUeEJsayk7CisKKwlBU1NFUlQoKHBUeEJsay0+VHhQYWNrZXRMaXN0Lk51bWJlciA+IDEpKTsKKworCXdoaWxlKHBUeEJsay0+VHhQYWNrZXRMaXN0LkhlYWQpCisJeworCQlwUUVudHJ5ID0gUmVtb3ZlSGVhZFF1ZXVlKCZwVHhCbGstPlR4UGFja2V0TGlzdCk7CisJCXBUeEJsay0+cFBhY2tldCA9IFFVRVVFX0VOVFJZX1RPX1BBQ0tFVChwUUVudHJ5KTsKKwkJaWYgKFJUTVBfRmlsbFR4QmxrSW5mbyhwQWQsIHBUeEJsaykgIT0gVFJVRSkKKwkJeworCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBUeEJsay0+cFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWJWTEFOUGt0ID0gKFJUTVBfR0VUX1BBQ0tFVF9WTEFOKHBUeEJsay0+cFBhY2tldCkgPyBUUlVFIDogRkFMU0UpOworCisJCS8vIHNraXAgODAyLjMgaGVhZGVyCisJCXBUeEJsay0+cFNyY0J1ZkRhdGEgPSBwVHhCbGstPnBTcmNCdWZIZWFkZXIgKyBMRU5HVEhfODAyXzM7CisJCXBUeEJsay0+U3JjQnVmTGVuICAtPSBMRU5HVEhfODAyXzM7CisKKwkJLy8gc2tpcCB2bGFuIHRhZworCQlpZiAoYlZMQU5Qa3QpCisJCXsKKwkJCXBUeEJsay0+cFNyY0J1ZkRhdGEJKz0gTEVOR1RIXzgwMl8xUTsKKwkJCXBUeEJsay0+U3JjQnVmTGVuCS09IExFTkdUSF84MDJfMVE7CisJCX0KKworCQlpZiAoZnJhbWVOdW0gPT0gMCkKKwkJeworCQkJcEhlYWRlckJ1ZlB0ciA9IFNUQV9CdWlsZF9BTVNEVV9GcmFtZV9IZWFkZXIocEFkLCBwVHhCbGspOworCisJCQkvLyBOT1RFOiBUeFdJLT5NUERVdG90YWxCeXRlQ291bnQgd2lsbCBiZSB1cGRhdGVkIGFmdGVyIGZpbmFsIGZyYW1lIHdhcyBoYW5kbGVkLgorCQkJUlRNUFdyaXRlVHhXSV9EYXRhKHBBZCwgKFBUWFdJX1NUUlVDKSgmcFR4QmxrLT5IZWFkZXJCdWZbVFhJTkZPX1NJWkVdKSwgcFR4QmxrKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXBIZWFkZXJCdWZQdHIgPSAmcFR4QmxrLT5IZWFkZXJCdWZbMF07CisJCQlwYWRkaW5nID0gUk9VTkRfVVAoTEVOR1RIX0FNU0RVX1NVQkZSQU1FSEVBRCArIHN1YkZyYW1lUGF5bG9hZExlbiwgNCkgLSAoTEVOR1RIX0FNU0RVX1NVQkZSQU1FSEVBRCArIHN1YkZyYW1lUGF5bG9hZExlbik7CisJCQlOZGlzWmVyb01lbW9yeShwSGVhZGVyQnVmUHRyLCBwYWRkaW5nICsgTEVOR1RIX0FNU0RVX1NVQkZSQU1FSEVBRCk7CisJCQlwSGVhZGVyQnVmUHRyICs9IHBhZGRpbmc7CisJCQlwVHhCbGstPk1wZHVIZWFkZXJMZW4gPSBwYWRkaW5nOworCQl9CisKKwkJLy8KKwkJLy8gQS1NU0RVIHN1YmZyYW1lCisJCS8vICAgREEoNikrU0EoNikrTGVuZ3RoKDIpICsgTExDL1NOQVAgRW5jYXAKKwkJLy8KKwkJc3ViRnJhbWVIZWFkZXIgPSBwSGVhZGVyQnVmUHRyOworCQlzdWJGcmFtZVBheWxvYWRMZW4gPSBwVHhCbGstPlNyY0J1ZkxlbjsKKworCQlOZGlzTW92ZU1lbW9yeShzdWJGcmFtZUhlYWRlciwgcFR4QmxrLT5wU3JjQnVmSGVhZGVyLCAxMik7CisKKworCQlwSGVhZGVyQnVmUHRyICs9IExFTkdUSF9BTVNEVV9TVUJGUkFNRUhFQUQ7CisJCXBUeEJsay0+TXBkdUhlYWRlckxlbiArPSBMRU5HVEhfQU1TRFVfU1VCRlJBTUVIRUFEOworCisKKwkJLy8KKwkJLy8gSW5zZXJ0IExMQy1TTkFQIGVuY2Fwc3VsYXRpb24gLSA4IG9jdGV0cworCQkvLworCQlFWFRSQV9MTENTTkFQX0VOQ0FQX0ZST01fUEtUX09GRlNFVChwVHhCbGstPnBTcmNCdWZEYXRhLTIsIHBUeEJsay0+cEV4dHJhTGxjU25hcEVuY2FwKTsKKworCQlzdWJGcmFtZVBheWxvYWRMZW4gPSBwVHhCbGstPlNyY0J1ZkxlbjsKKworCQlpZiAocFR4QmxrLT5wRXh0cmFMbGNTbmFwRW5jYXApCisJCXsKKwkJCU5kaXNNb3ZlTWVtb3J5KHBIZWFkZXJCdWZQdHIsIHBUeEJsay0+cEV4dHJhTGxjU25hcEVuY2FwLCA2KTsKKwkJCXBIZWFkZXJCdWZQdHIgKz0gNjsKKwkJCS8vIGdldCAyIG9jdGV0cyAoVHlwZW9mTGVuKQorCQkJTmRpc01vdmVNZW1vcnkocEhlYWRlckJ1ZlB0ciwgcFR4QmxrLT5wU3JjQnVmRGF0YS0yLCAyKTsKKwkJCXBIZWFkZXJCdWZQdHIgKz0gMjsKKwkJCXBUeEJsay0+TXBkdUhlYWRlckxlbiArPSBMRU5HVEhfODAyXzFfSDsKKwkJCXN1YkZyYW1lUGF5bG9hZExlbiArPSBMRU5HVEhfODAyXzFfSDsKKwkJfQorCisJCS8vIHVwZGF0ZSBzdWJGcmFtZSBMZW5ndGggZmllbGQKKwkJc3ViRnJhbWVIZWFkZXJbMTJdID0gKHN1YkZyYW1lUGF5bG9hZExlbiAmIDB4RkYwMCkgPj4gODsKKwkJc3ViRnJhbWVIZWFkZXJbMTNdID0gc3ViRnJhbWVQYXlsb2FkTGVuICYgMHhGRjsKKworCQl0b3RhbE1QRFVTaXplICs9IHBUeEJsay0+TXBkdUhlYWRlckxlbiArIHBUeEJsay0+U3JjQnVmTGVuOworCisJCWlmIChmcmFtZU51bSA9PTApCisJCQlGaXJzdFR4ID0gSEFMX1dyaXRlTXVsdGlUeFJlc291cmNlKHBBZCwgcFR4QmxrLCBmcmFtZU51bSwgJkZyZWVOdW1iZXIpOworCQllbHNlCisJCQlMYXN0VHhJZHggPSBIQUxfV3JpdGVNdWx0aVR4UmVzb3VyY2UocEFkLCBwVHhCbGssIGZyYW1lTnVtLCAmRnJlZU51bWJlcik7CisKKwkJZnJhbWVOdW0rKzsKKworCQlwQWQtPlJhbGlua0NvdW50ZXJzLktpY2tUeENvdW50Kys7CisJCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhEb25lQ291bnQrKzsKKworCQkvLyBjYWxjdWxhdGUgVHJhbnNtaXR0ZWQgQU1TRFUgQ291bnQgYW5kIEJ5dGVDb3VudAorCQl7CisJCQlwQWQtPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkQU1TRFVDb3VudC51Lkxvd1BhcnQgKys7CisJCQlwQWQtPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkT2N0ZXRzSW5BTVNEVS5RdWFkUGFydCArPSB0b3RhbE1QRFVTaXplOworCQl9CisKKwl9CisKKwlIQUxfRmluYWxXcml0ZVR4UmVzb3VyY2UocEFkLCBwVHhCbGssIHRvdGFsTVBEVVNpemUsIEZpcnN0VHgpOworCUhBTF9MYXN0VHhJZHgocEFkLCBwVHhCbGstPlF1ZUlkeCwgTGFzdFR4SWR4KTsKKworCS8vCisJLy8gS2ljayBvdXQgVHgKKwkvLworCUhBTF9LaWNrT3V0VHgocEFkLCBwVHhCbGssIHBUeEJsay0+UXVlSWR4KTsKK30KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworVk9JRCBTVEFfTGVnYWN5X0ZyYW1lX1R4KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVRYX0JMSwkJCSpwVHhCbGspCit7CisJSEVBREVSXzgwMl8xMQkqcEhlYWRlcl84MDJfMTE7CisJUFVDSEFSCQkJcEhlYWRlckJ1ZlB0cjsKKwlVU0hPUlQJCQlGcmVlTnVtYmVyOworCUJPT0xFQU4JCQliVkxBTlBrdDsKKwlQUVVFVUVfRU5UUlkJcFFFbnRyeTsKKworCUFTU0VSVChwVHhCbGspOworCisKKwlwUUVudHJ5ID0gUmVtb3ZlSGVhZFF1ZXVlKCZwVHhCbGstPlR4UGFja2V0TGlzdCk7CisJcFR4QmxrLT5wUGFja2V0ID0gUVVFVUVfRU5UUllfVE9fUEFDS0VUKHBRRW50cnkpOworCWlmIChSVE1QX0ZpbGxUeEJsa0luZm8ocEFkLCBwVHhCbGspICE9IFRSVUUpCisJeworCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFR4QmxrLT5wUGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChwVHhCbGstPlR4RnJhbWVUeXBlID09IFRYX01DQVNUX0ZSQU1FKQorCXsKKwkJSU5DX0NPVU5URVI2NChwQWQtPldsYW5Db3VudGVycy5NdWx0aWNhc3RUcmFuc21pdHRlZEZyYW1lQ291bnQpOworCX0KKworCWlmIChSVE1QX0dFVF9QQUNLRVRfUlRTKHBUeEJsay0+cFBhY2tldCkpCisJCVRYX0JMS19TRVRfRkxBRyhwVHhCbGssIGZUWF9iUnRzUmVxdWlyZWQpOworCWVsc2UKKwkJVFhfQkxLX0NMRUFSX0ZMQUcocFR4QmxrLCBmVFhfYlJ0c1JlcXVpcmVkKTsKKworCWJWTEFOUGt0ID0gKFJUTVBfR0VUX1BBQ0tFVF9WTEFOKHBUeEJsay0+cFBhY2tldCkgPyBUUlVFIDogRkFMU0UpOworCisJaWYgKHBUeEJsay0+VHhSYXRlIDwgcEFkLT5Db21tb25DZmcuTWluVHhSYXRlKQorCQlwVHhCbGstPlR4UmF0ZSA9IHBBZC0+Q29tbW9uQ2ZnLk1pblR4UmF0ZTsKKworCVNUQUZpbmRDaXBoZXJBbGdvcml0aG0ocEFkLCBwVHhCbGspOworCVNUQUJ1aWxkQ29tbW9uODAyXzExSGVhZGVyKHBBZCwgcFR4QmxrKTsKKworCisJLy8gc2tpcCA4MDIuMyBoZWFkZXIKKwlwVHhCbGstPnBTcmNCdWZEYXRhID0gcFR4QmxrLT5wU3JjQnVmSGVhZGVyICsgTEVOR1RIXzgwMl8zOworCXBUeEJsay0+U3JjQnVmTGVuICAtPSBMRU5HVEhfODAyXzM7CisKKwkvLyBza2lwIHZsYW4gdGFnCisJaWYgKGJWTEFOUGt0KQorCXsKKwkJcFR4QmxrLT5wU3JjQnVmRGF0YQkrPSBMRU5HVEhfODAyXzFROworCQlwVHhCbGstPlNyY0J1ZkxlbgktPSBMRU5HVEhfODAyXzFROworCX0KKworCXBIZWFkZXJCdWZQdHIgPSAmcFR4QmxrLT5IZWFkZXJCdWZbVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkVdOworCXBIZWFkZXJfODAyXzExID0gKEhFQURFUl84MDJfMTEgKikgcEhlYWRlckJ1ZlB0cjsKKworCS8vIHNraXAgY29tbW9uIGhlYWRlcgorCXBIZWFkZXJCdWZQdHIgKz0gcFR4QmxrLT5NcGR1SGVhZGVyTGVuOworCisJaWYgKFRYX0JMS19URVNUX0ZMQUcocFR4QmxrLCBmVFhfYldNTSkpCisJeworCQkvLworCQkvLyBidWlsZCBRT1MgQ29udHJvbCBieXRlcworCQkvLworCQkqcEhlYWRlckJ1ZlB0ciA9IChwVHhCbGstPlVzZXJQcmlvcml0eSAmIDB4MEYpOworCQkqKHBIZWFkZXJCdWZQdHIrMSkgPSAwOworCQlwSGVhZGVyQnVmUHRyICs9MjsKKwkJcFR4QmxrLT5NcGR1SGVhZGVyTGVuICs9IDI7CisJfQorCisJLy8gVGhlIHJlbWFpbmluZyBjb250ZW50IG9mIE1QRFUgaGVhZGVyIHNob3VsZCBsb2NhdGUgYXQgNC1vY3RldHMgYWxpZ21lbnQKKwlwVHhCbGstPkhkclBhZExlbiA9IChVTE9ORylwSGVhZGVyQnVmUHRyOworCXBIZWFkZXJCdWZQdHIgPSAoUENIQVIpIFJPVU5EX1VQKHBIZWFkZXJCdWZQdHIsIDQpOworCXBUeEJsay0+SGRyUGFkTGVuID0gKFVMT05HKShwSGVhZGVyQnVmUHRyIC0gcFR4QmxrLT5IZHJQYWRMZW4pOworCisJeworCisJCS8vCisJCS8vIEluc2VydCBMTEMtU05BUCBlbmNhcHN1bGF0aW9uIC0gOCBvY3RldHMKKwkJLy8KKwkJLy8KKyAgIAkJLy8gaWYgb3JpZ2luYWwgRXRoZXJuZXQgZnJhbWUgY29udGFpbnMgbm8gTExDL1NOQVAsCisJCS8vIHRoZW4gYW4gZXh0cmEgTExDL1NOQVAgZW5jYXAgaXMgcmVxdWlyZWQKKwkJLy8KKwkJRVhUUkFfTExDU05BUF9FTkNBUF9GUk9NX1BLVF9TVEFSVChwVHhCbGstPnBTcmNCdWZIZWFkZXIsIHBUeEJsay0+cEV4dHJhTGxjU25hcEVuY2FwKTsKKwkJaWYgKHBUeEJsay0+cEV4dHJhTGxjU25hcEVuY2FwKQorCQl7CisJCQlVQ0hBUiB2bGFuX3NpemU7CisKKwkJCU5kaXNNb3ZlTWVtb3J5KHBIZWFkZXJCdWZQdHIsIHBUeEJsay0+cEV4dHJhTGxjU25hcEVuY2FwLCA2KTsKKwkJCXBIZWFkZXJCdWZQdHIgKz0gNjsKKwkJCS8vIHNraXAgdmxhbiB0YWcKKwkJCXZsYW5fc2l6ZSA9ICAoYlZMQU5Qa3QpID8gTEVOR1RIXzgwMl8xUSA6IDA7CisJCQkvLyBnZXQgMiBvY3RldHMgKFR5cGVvZkxlbikKKwkJCU5kaXNNb3ZlTWVtb3J5KHBIZWFkZXJCdWZQdHIsIHBUeEJsay0+cFNyY0J1ZkhlYWRlcisxMit2bGFuX3NpemUsIDIpOworCQkJcEhlYWRlckJ1ZlB0ciArPSAyOworCQkJcFR4QmxrLT5NcGR1SGVhZGVyTGVuICs9IExFTkdUSF84MDJfMV9IOworCQl9CisKKwl9CisKKwkvLworCS8vIHByZXBhcmUgZm9yIFRYV0kKKwkvLyB1c2UgV2NpZCBhcyBLZXkgSW5kZXgKKwkvLworCisJUlRNUFdyaXRlVHhXSV9EYXRhKHBBZCwgKFBUWFdJX1NUUlVDKSgmcFR4QmxrLT5IZWFkZXJCdWZbVFhJTkZPX1NJWkVdKSwgcFR4QmxrKTsKKworCS8vRnJlZU51bWJlciA9IEdFVF9UWFJJTkdfRlJFRU5PKHBBZCwgUXVlSWR4KTsKKworCUhBTF9Xcml0ZVR4UmVzb3VyY2UocEFkLCBwVHhCbGssIFRSVUUsICZGcmVlTnVtYmVyKTsKKworCXBBZC0+UmFsaW5rQ291bnRlcnMuS2lja1R4Q291bnQrKzsKKwlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4RG9uZUNvdW50Kys7CisKKwkvLworCS8vIEtpY2sgb3V0IFR4CisJLy8KKwlIQUxfS2lja091dFR4KHBBZCwgcFR4QmxrLCBwVHhCbGstPlF1ZUlkeCk7Cit9CisKKworVk9JRCBTVEFfQVJhbGlua19GcmFtZV9UeCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglUWF9CTEsJCQkqcFR4QmxrKQoreworCVBVQ0hBUgkJCXBIZWFkZXJCdWZQdHI7CisJVVNIT1JUCQkJRnJlZU51bWJlcjsKKwlVU0hPUlQJCQl0b3RhbE1QRFVTaXplPTA7CisJVVNIT1JUCQkJRmlyc3RUeCwgTGFzdFR4SWR4OworCWludCAJCQlmcmFtZU51bSA9IDA7CisJQk9PTEVBTgkJCWJWTEFOUGt0OworCVBRVUVVRV9FTlRSWQlwUUVudHJ5OworCisKKwlBU1NFUlQocFR4QmxrKTsKKworCUFTU0VSVCgocFR4QmxrLT5UeFBhY2tldExpc3QuTnVtYmVyPT0gMikpOworCisKKwlGaXJzdFR4ID0gTGFzdFR4SWR4ID0gMDsgIC8vIElzIGl0IG9rIGluaXQgdGhleSBhcyAwPworCXdoaWxlKHBUeEJsay0+VHhQYWNrZXRMaXN0LkhlYWQpCisJeworCQlwUUVudHJ5ID0gUmVtb3ZlSGVhZFF1ZXVlKCZwVHhCbGstPlR4UGFja2V0TGlzdCk7CisJCXBUeEJsay0+cFBhY2tldCA9IFFVRVVFX0VOVFJZX1RPX1BBQ0tFVChwUUVudHJ5KTsKKworCQlpZiAoUlRNUF9GaWxsVHhCbGtJbmZvKHBBZCwgcFR4QmxrKSAhPSBUUlVFKQorCQl7CisJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFR4QmxrLT5wUGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJYlZMQU5Qa3QgPSAoUlRNUF9HRVRfUEFDS0VUX1ZMQU4ocFR4QmxrLT5wUGFja2V0KSA/IFRSVUUgOiBGQUxTRSk7CisKKwkJLy8gc2tpcCA4MDIuMyBoZWFkZXIKKwkJcFR4QmxrLT5wU3JjQnVmRGF0YSA9IHBUeEJsay0+cFNyY0J1ZkhlYWRlciArIExFTkdUSF84MDJfMzsKKwkJcFR4QmxrLT5TcmNCdWZMZW4gIC09IExFTkdUSF84MDJfMzsKKworCQkvLyBza2lwIHZsYW4gdGFnCisJCWlmIChiVkxBTlBrdCkKKwkJeworCQkJcFR4QmxrLT5wU3JjQnVmRGF0YQkrPSBMRU5HVEhfODAyXzFROworCQkJcFR4QmxrLT5TcmNCdWZMZW4JLT0gTEVOR1RIXzgwMl8xUTsKKwkJfQorCisJCWlmIChmcmFtZU51bSA9PSAwKQorCQl7CS8vIEZvciBmaXJzdCBmcmFtZSwgd2UgbmVlZCB0byBjcmVhdGUgdGhlIDgwMi4xMSBoZWFkZXIgKyBwYWRkaW5nKG9wdGlvbmFsKSArIFJBLUFHRy1MRU4gKyBTTkFQIEhlYWRlcgorCisJCQlwSGVhZGVyQnVmUHRyID0gU1RBX0J1aWxkX0FSYWxpbmtfRnJhbWVfSGVhZGVyKHBBZCwgcFR4QmxrKTsKKworCQkJLy8gSXQncyBvayB3cml0ZSB0aGUgVHhXSSBoZXJlLCBiZWNhdXNlIHRoZSBUeFdJLT5NUERVdG90YWxCeXRlQ291bnQKKwkJCS8vCXdpbGwgYmUgdXBkYXRlZCBhZnRlciBmaW5hbCBmcmFtZSB3YXMgaGFuZGxlZC4KKwkJCVJUTVBXcml0ZVR4V0lfRGF0YShwQWQsIChQVFhXSV9TVFJVQykoJnBUeEJsay0+SGVhZGVyQnVmW1RYSU5GT19TSVpFXSksIHBUeEJsayk7CisKKworCQkJLy8KKwkJCS8vIEluc2VydCBMTEMtU05BUCBlbmNhcHN1bGF0aW9uIC0gOCBvY3RldHMKKwkJCS8vCisJCQlFWFRSQV9MTENTTkFQX0VOQ0FQX0ZST01fUEtUX09GRlNFVChwVHhCbGstPnBTcmNCdWZEYXRhLTIsIHBUeEJsay0+cEV4dHJhTGxjU25hcEVuY2FwKTsKKworCQkJaWYgKHBUeEJsay0+cEV4dHJhTGxjU25hcEVuY2FwKQorCQkJeworCQkJCU5kaXNNb3ZlTWVtb3J5KHBIZWFkZXJCdWZQdHIsIHBUeEJsay0+cEV4dHJhTGxjU25hcEVuY2FwLCA2KTsKKwkJCQlwSGVhZGVyQnVmUHRyICs9IDY7CisJCQkJLy8gZ2V0IDIgb2N0ZXRzIChUeXBlb2ZMZW4pCisJCQkJTmRpc01vdmVNZW1vcnkocEhlYWRlckJ1ZlB0ciwgcFR4QmxrLT5wU3JjQnVmRGF0YS0yLCAyKTsKKwkJCQlwSGVhZGVyQnVmUHRyICs9IDI7CisJCQkJcFR4QmxrLT5NcGR1SGVhZGVyTGVuICs9IExFTkdUSF84MDJfMV9IOworCQkJfQorCQl9CisJCWVsc2UKKwkJewkvLyBGb3Igc2Vjb25kIGFnZ3JlZ2F0ZWQgZnJhbWUsIHdlIG5lZWQgY3JlYXRlIHRoZSA4MDIuMyBoZWFkZXIgdG8gaGVhZGVyQnVmLCBiZWNhdXNlIFBDSSB3aWxsIGNvcHkgaXQgdG8gU0RQdHIwLgorCisJCQlwSGVhZGVyQnVmUHRyID0gJnBUeEJsay0+SGVhZGVyQnVmWzBdOworCQkJcFR4QmxrLT5NcGR1SGVhZGVyTGVuID0gMDsKKworCQkJLy8gQS1SYWxpbmsgc3ViLXNlcXVlbnQgZnJhbWUgaGVhZGVyIGlzIHRoZSBzYW1lIGFzIDgwMi4zIGhlYWRlci4KKwkJCS8vICAgREEoNikrU0EoNikrRnJhbWVUeXBlKDIpCisJCQlOZGlzTW92ZU1lbW9yeShwSGVhZGVyQnVmUHRyLCBwVHhCbGstPnBTcmNCdWZIZWFkZXIsIDEyKTsKKwkJCXBIZWFkZXJCdWZQdHIgKz0gMTI7CisJCQkvLyBnZXQgMiBvY3RldHMgKFR5cGVvZkxlbikKKwkJCU5kaXNNb3ZlTWVtb3J5KHBIZWFkZXJCdWZQdHIsIHBUeEJsay0+cFNyY0J1ZkRhdGEtMiwgMik7CisJCQlwSGVhZGVyQnVmUHRyICs9IDI7CisJCQlwVHhCbGstPk1wZHVIZWFkZXJMZW4gPSBMRU5HVEhfQVJBTElOS19TVUJGUkFNRUhFQUQ7CisJCX0KKworCQl0b3RhbE1QRFVTaXplICs9IHBUeEJsay0+TXBkdUhlYWRlckxlbiArIHBUeEJsay0+U3JjQnVmTGVuOworCisJCS8vRnJlZU51bWJlciA9IEdFVF9UWFJJTkdfRlJFRU5PKHBBZCwgUXVlSWR4KTsKKwkJaWYgKGZyYW1lTnVtID09MCkKKwkJCUZpcnN0VHggPSBIQUxfV3JpdGVNdWx0aVR4UmVzb3VyY2UocEFkLCBwVHhCbGssIGZyYW1lTnVtLCAmRnJlZU51bWJlcik7CisJCWVsc2UKKwkJCUxhc3RUeElkeCA9IEhBTF9Xcml0ZU11bHRpVHhSZXNvdXJjZShwQWQsIHBUeEJsaywgZnJhbWVOdW0sICZGcmVlTnVtYmVyKTsKKworCQlmcmFtZU51bSsrOworCisJCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhBZ2dyZWdhdGlvbkNvdW50Kys7CisJCXBBZC0+UmFsaW5rQ291bnRlcnMuS2lja1R4Q291bnQrKzsKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeERvbmVDb3VudCsrOworCisJfQorCisJSEFMX0ZpbmFsV3JpdGVUeFJlc291cmNlKHBBZCwgcFR4QmxrLCB0b3RhbE1QRFVTaXplLCBGaXJzdFR4KTsKKwlIQUxfTGFzdFR4SWR4KHBBZCwgcFR4QmxrLT5RdWVJZHgsIExhc3RUeElkeCk7CisKKwkvLworCS8vIEtpY2sgb3V0IFR4CisJLy8KKwlIQUxfS2lja091dFR4KHBBZCwgcFR4QmxrLCBwVHhCbGstPlF1ZUlkeCk7CisKK30KKworCitWT0lEIFNUQV9GcmFnbWVudF9GcmFtZV9UeCgKKwlJTiBSVE1QX0FEQVBURVIgKnBBZCwKKwlJTiBUWF9CTEsJCSpwVHhCbGspCit7CisJSEVBREVSXzgwMl8xMQkqcEhlYWRlcl84MDJfMTE7CisJUFVDSEFSCQkJcEhlYWRlckJ1ZlB0cjsKKwlVU0hPUlQJCQlGcmVlTnVtYmVyOworCVVDSEFSIAkJCWZyYWdOdW0gPSAwOworCVBBQ0tFVF9JTkZPCQlQYWNrZXRJbmZvOworCVVTSE9SVAkJCUVuY3J5cHRpb25PdmVyaGVhZCA9IDA7CisJVUlOVDMyCQkJRnJlZU1wZHVTaXplLCBTcmNSZW1haW5pbmdCeXRlczsKKwlVU0hPUlQJCQlBY2tEdXJhdGlvbjsKKwlVSU5UIAkJCU5leHRNcGR1U2l6ZTsKKwlCT09MRUFOCQkJYlZMQU5Qa3Q7CisJUFFVRVVFX0VOVFJZCXBRRW50cnk7CisKKworCUFTU0VSVChwVHhCbGspOworCisJcFFFbnRyeSA9IFJlbW92ZUhlYWRRdWV1ZSgmcFR4QmxrLT5UeFBhY2tldExpc3QpOworCXBUeEJsay0+cFBhY2tldCA9IFFVRVVFX0VOVFJZX1RPX1BBQ0tFVChwUUVudHJ5KTsKKwlpZiAoUlRNUF9GaWxsVHhCbGtJbmZvKHBBZCwgcFR4QmxrKSAhPSBUUlVFKQorCXsKKwkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBUeEJsay0+cFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCXJldHVybjsKKwl9CisKKwlBU1NFUlQoVFhfQkxLX1RFU1RfRkxBRyhwVHhCbGssIGZUWF9iQWxsb3dGcmFnKSk7CisJYlZMQU5Qa3QgPSAoUlRNUF9HRVRfUEFDS0VUX1ZMQU4ocFR4QmxrLT5wUGFja2V0KSA/IFRSVUUgOiBGQUxTRSk7CisKKwlTVEFGaW5kQ2lwaGVyQWxnb3JpdGhtKHBBZCwgcFR4QmxrKTsKKwlTVEFCdWlsZENvbW1vbjgwMl8xMUhlYWRlcihwQWQsIHBUeEJsayk7CisKKwlpZiAocFR4QmxrLT5DaXBoZXJBbGcgPT0gQ0lQSEVSX1RLSVApCisJeworCQlwVHhCbGstPnBQYWNrZXQgPSBkdXBsaWNhdGVfcGt0X3dpdGhfVEtJUF9NSUMocEFkLCBwVHhCbGstPnBQYWNrZXQpOworCQlpZiAocFR4QmxrLT5wUGFja2V0ID09IE5VTEwpCisJCQlyZXR1cm47CisJCVJUTVBfUXVlcnlQYWNrZXRJbmZvKHBUeEJsay0+cFBhY2tldCwgJlBhY2tldEluZm8sICZwVHhCbGstPnBTcmNCdWZIZWFkZXIsICZwVHhCbGstPlNyY0J1Zkxlbik7CisJfQorCisJLy8gc2tpcCA4MDIuMyBoZWFkZXIKKwlwVHhCbGstPnBTcmNCdWZEYXRhID0gcFR4QmxrLT5wU3JjQnVmSGVhZGVyICsgTEVOR1RIXzgwMl8zOworCXBUeEJsay0+U3JjQnVmTGVuICAtPSBMRU5HVEhfODAyXzM7CisKKworCS8vIHNraXAgdmxhbiB0YWcKKwlpZiAoYlZMQU5Qa3QpCisJeworCQlwVHhCbGstPnBTcmNCdWZEYXRhCSs9IExFTkdUSF84MDJfMVE7CisJCXBUeEJsay0+U3JjQnVmTGVuCS09IExFTkdUSF84MDJfMVE7CisJfQorCisJcEhlYWRlckJ1ZlB0ciA9ICZwVHhCbGstPkhlYWRlckJ1ZltUWElORk9fU0laRSArIFRYV0lfU0laRV07CisJcEhlYWRlcl84MDJfMTEgPSAoSEVBREVSXzgwMl8xMSAqKXBIZWFkZXJCdWZQdHI7CisKKworCS8vIHNraXAgY29tbW9uIGhlYWRlcgorCXBIZWFkZXJCdWZQdHIgKz0gcFR4QmxrLT5NcGR1SGVhZGVyTGVuOworCisJaWYgKFRYX0JMS19URVNUX0ZMQUcocFR4QmxrLCBmVFhfYldNTSkpCisJeworCQkvLworCQkvLyBidWlsZCBRT1MgQ29udHJvbCBieXRlcworCQkvLworCQkqcEhlYWRlckJ1ZlB0ciA9IChwVHhCbGstPlVzZXJQcmlvcml0eSAmIDB4MEYpOworCisJCSoocEhlYWRlckJ1ZlB0cisxKSA9IDA7CisJCXBIZWFkZXJCdWZQdHIgKz0yOworCQlwVHhCbGstPk1wZHVIZWFkZXJMZW4gKz0gMjsKKwl9CisKKwkvLworCS8vIHBhZGRpbmcgYXQgZnJvbnQgb2YgTExDIGhlYWRlcgorCS8vIExMQyBoZWFkZXIgc2hvdWxkIGxvY2F0ZSBhdCA0LW9jdGV0cyBhbGlnbWVudAorCS8vCisJcFR4QmxrLT5IZHJQYWRMZW4gPSAoVUxPTkcpcEhlYWRlckJ1ZlB0cjsKKwlwSGVhZGVyQnVmUHRyID0gKFBDSEFSKSBST1VORF9VUChwSGVhZGVyQnVmUHRyLCA0KTsKKwlwVHhCbGstPkhkclBhZExlbiA9IChVTE9ORykocEhlYWRlckJ1ZlB0ciAtIHBUeEJsay0+SGRyUGFkTGVuKTsKKworCisKKwkvLworCS8vIEluc2VydCBMTEMtU05BUCBlbmNhcHN1bGF0aW9uIC0gOCBvY3RldHMKKwkvLworCS8vCisgICAJLy8gaWYgb3JpZ2luYWwgRXRoZXJuZXQgZnJhbWUgY29udGFpbnMgbm8gTExDL1NOQVAsCisJLy8gdGhlbiBhbiBleHRyYSBMTEMvU05BUCBlbmNhcCBpcyByZXF1aXJlZAorCS8vCisJRVhUUkFfTExDU05BUF9FTkNBUF9GUk9NX1BLVF9TVEFSVChwVHhCbGstPnBTcmNCdWZIZWFkZXIsIHBUeEJsay0+cEV4dHJhTGxjU25hcEVuY2FwKTsKKwlpZiAocFR4QmxrLT5wRXh0cmFMbGNTbmFwRW5jYXApCisJeworCQlVQ0hBUiB2bGFuX3NpemU7CisKKwkJTmRpc01vdmVNZW1vcnkocEhlYWRlckJ1ZlB0ciwgcFR4QmxrLT5wRXh0cmFMbGNTbmFwRW5jYXAsIDYpOworCQlwSGVhZGVyQnVmUHRyICs9IDY7CisJCS8vIHNraXAgdmxhbiB0YWcKKwkJdmxhbl9zaXplID0gIChiVkxBTlBrdCkgPyBMRU5HVEhfODAyXzFRIDogMDsKKwkJLy8gZ2V0IDIgb2N0ZXRzIChUeXBlb2ZMZW4pCisJCU5kaXNNb3ZlTWVtb3J5KHBIZWFkZXJCdWZQdHIsIHBUeEJsay0+cFNyY0J1ZkhlYWRlcisxMit2bGFuX3NpemUsIDIpOworCQlwSGVhZGVyQnVmUHRyICs9IDI7CisJCXBUeEJsay0+TXBkdUhlYWRlckxlbiArPSBMRU5HVEhfODAyXzFfSDsKKwl9CisKKworCS8vIElmIFRLSVAgaXMgdXNlZCBhbmQgZnJhZ21lbnRhdGlvbiBpcyByZXF1aXJlZC4gRHJpdmVyIGhhcyB0bworCS8vCWFwcGVuZCBUS0lQIE1JQyBhdCB0YWlsIG9mIHRoZSBzY2F0dGVyIGJ1ZmZlcgorCS8vCU1BQyBBU0lDIHdpbGwgb25seSBwZXJmb3JtIElWL0VJVi9JQ1YgaW5zZXJ0aW9uIGJ1dCBubyBUS0lQIE1JQworCWlmIChwVHhCbGstPkNpcGhlckFsZyA9PSBDSVBIRVJfVEtJUCkKKwl7CisKKwkJLy8gTk9URTogRE9OJ1QgcmVmZXIgdGhlIHNrYi0+bGVuIGRpcmVjdGx5IGFmdGVyIGZvbGxvd2luZyBjb3B5LiBCZWNhc3VlIHRoZSBsZW5ndGggaXMgbm90IGFkanVzdAorCQkvLwkJCXRvIGNvcnJlY3QgbGVuZ2h0LCByZWZlciB0byBwVHhCbGstPlNyY0J1ZkxlbiBmb3IgdGhlIHBhY2tldCBsZW5ndGggaW4gZm9sbG93aW5nIHByb2dyZXNzLgorCQlOZGlzTW92ZU1lbW9yeShwVHhCbGstPnBTcmNCdWZEYXRhICsgcFR4QmxrLT5TcmNCdWZMZW4sICZwQWQtPlByaXZhdGVJbmZvLlR4Lk1JQ1swXSwgOCk7CisJCS8vc2tiX3B1dCgoUlRQS1RfVE9fT1NQS1QocFR4QmxrLT5wUGFja2V0KSktPnRhaWwsIDgpOworCQlwVHhCbGstPlNyY0J1ZkxlbiArPSA4OworCQlwVHhCbGstPlRvdGFsRnJhbWVMZW4gKz0gODsKKwkJcFR4QmxrLT5DaXBoZXJBbGcgPSBDSVBIRVJfVEtJUF9OT19NSUM7CisJfQorCisJLy8KKwkvLyBjYWxjdWF0ZSB0aGUgb3ZlcmhlYWQgYnl0ZXMgdGhhdCBlbmNyeXB0aW9uIGFsZ29yaXRobSBtYXkgYWRkLiBUaGlzCisJLy8gYWZmZWN0cyB0aGUgY2FsY3VsYXRlIG9mICJkdXJhdGlvbiIgZmllbGQKKwkvLworCWlmICgocFR4QmxrLT5DaXBoZXJBbGcgPT0gQ0lQSEVSX1dFUDY0KSB8fCAocFR4QmxrLT5DaXBoZXJBbGcgPT0gQ0lQSEVSX1dFUDEyOCkpCisJCUVuY3J5cHRpb25PdmVyaGVhZCA9IDg7IC8vV0VQOiBJVls0XSArIElDVls0XTsKKwllbHNlIGlmIChwVHhCbGstPkNpcGhlckFsZyA9PSBDSVBIRVJfVEtJUF9OT19NSUMpCisJCUVuY3J5cHRpb25PdmVyaGVhZCA9IDEyOy8vVEtJUDogSVZbNF0gKyBFSVZbNF0gKyBJQ1ZbNF0sIE1JQyB3aWxsIGJlIGFkZGVkIHRvIFRvdGFsUGFja2V0TGVuZ3RoCisJZWxzZSBpZiAocFR4QmxrLT5DaXBoZXJBbGcgPT0gQ0lQSEVSX1RLSVApCisJCUVuY3J5cHRpb25PdmVyaGVhZCA9IDIwOy8vVEtJUDogSVZbNF0gKyBFSVZbNF0gKyBJQ1ZbNF0gKyBNSUNbOF0KKwllbHNlIGlmIChwVHhCbGstPkNpcGhlckFsZyA9PSBDSVBIRVJfQUVTKQorCQlFbmNyeXB0aW9uT3ZlcmhlYWQgPSAxNjsJLy8gQUVTOiBJVls0XSArIEVJVls0XSArIE1JQ1s4XQorCWVsc2UKKwkJRW5jcnlwdGlvbk92ZXJoZWFkID0gMDsKKworCS8vIGRlY2lkZSBob3cgbXVjaCB0aW1lIGFuIEFDSy9DVFMgZnJhbWUgd2lsbCBjb25zdW1lIGluIHRoZSBhaXIKKwlBY2tEdXJhdGlvbiA9IFJUTVBDYWxjRHVyYXRpb24ocEFkLCBwQWQtPkNvbW1vbkNmZy5FeHBlY3RlZEFDS1JhdGVbcFR4QmxrLT5UeFJhdGVdLCAxNCk7CisKKwkvLyBJbml0IHRoZSB0b3RhbCBwYXlsb2FkIGxlbmd0aCBvZiB0aGlzIGZyYW1lLgorCVNyY1JlbWFpbmluZ0J5dGVzID0gcFR4QmxrLT5TcmNCdWZMZW47CisKKwlwVHhCbGstPlRvdGFsRnJhZ051bSA9IDB4ZmY7CisKKwlkbyB7CisKKwkJRnJlZU1wZHVTaXplID0gcEFkLT5Db21tb25DZmcuRnJhZ21lbnRUaHJlc2hvbGQgLSBMRU5HVEhfQ1JDOworCisJCUZyZWVNcGR1U2l6ZSAtPSBwVHhCbGstPk1wZHVIZWFkZXJMZW47CisKKwkJaWYgKFNyY1JlbWFpbmluZ0J5dGVzIDw9IEZyZWVNcGR1U2l6ZSkKKwkJewkvLyB0aGlzIGlzIHRoZSBsYXN0IG9yIG9ubHkgZnJhZ21lbnQKKworCQkJcFR4QmxrLT5TcmNCdWZMZW4gPSBTcmNSZW1haW5pbmdCeXRlczsKKworCQkJcEhlYWRlcl84MDJfMTEtPkZDLk1vcmVGcmFnID0gMDsKKwkJCXBIZWFkZXJfODAyXzExLT5EdXJhdGlvbiA9IHBBZC0+Q29tbW9uQ2ZnLkRzaWZzICsgQWNrRHVyYXRpb247CisKKwkJCS8vIEluZGljYXRlIHRoZSBsb3dlciBsYXllciB0aGF0IHRoaXMncyB0aGUgbGFzdCBmcmFnbWVudC4KKwkJCXBUeEJsay0+VG90YWxGcmFnTnVtID0gZnJhZ051bTsKKwkJfQorCQllbHNlCisJCXsJLy8gbW9yZSBmcmFnbWVudCBpcyByZXF1aXJlZAorCisJCQlwVHhCbGstPlNyY0J1ZkxlbiA9IEZyZWVNcGR1U2l6ZTsKKworCQkJTmV4dE1wZHVTaXplID0gbWluKCgoVUlOVClTcmNSZW1haW5pbmdCeXRlcyAtIHBUeEJsay0+U3JjQnVmTGVuKSwgKChVSU5UKXBBZC0+Q29tbW9uQ2ZnLkZyYWdtZW50VGhyZXNob2xkKSk7CisJCQlwSGVhZGVyXzgwMl8xMS0+RkMuTW9yZUZyYWcgPSAxOworCQkJcEhlYWRlcl84MDJfMTEtPkR1cmF0aW9uID0gKDMgKiBwQWQtPkNvbW1vbkNmZy5Ec2lmcykgKyAoMiAqIEFja0R1cmF0aW9uKSArIFJUTVBDYWxjRHVyYXRpb24ocEFkLCBwVHhCbGstPlR4UmF0ZSwgTmV4dE1wZHVTaXplICsgRW5jcnlwdGlvbk92ZXJoZWFkKTsKKwkJfQorCisJCWlmIChmcmFnTnVtID09IDApCisJCQlwVHhCbGstPkZyYW1lR2FwID0gSUZTX0hUVFhPUDsKKwkJZWxzZQorCQkJcFR4QmxrLT5GcmFtZUdhcCA9IElGU19TSUZTOworCisJCVJUTVBXcml0ZVR4V0lfRGF0YShwQWQsIChQVFhXSV9TVFJVQykoJnBUeEJsay0+SGVhZGVyQnVmW1RYSU5GT19TSVpFXSksIHBUeEJsayk7CisKKwkJSEFMX1dyaXRlRnJhZ1R4UmVzb3VyY2UocEFkLCBwVHhCbGssIGZyYWdOdW0sICZGcmVlTnVtYmVyKTsKKworCQlwQWQtPlJhbGlua0NvdW50ZXJzLktpY2tUeENvdW50Kys7CisJCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhEb25lQ291bnQrKzsKKworCQkvLyBVcGRhdGUgdGhlIGZyYW1lIG51bWJlciwgcmVtYWluaW5nIHNpemUgb2YgdGhlIE5ESVMgcGFja2V0IHBheWxvYWQuCisKKwkJLy8gc3BhY2UgZm9yIDgwMi4xMSBoZWFkZXIuCisJCWlmIChmcmFnTnVtID09IDAgJiYgcFR4QmxrLT5wRXh0cmFMbGNTbmFwRW5jYXApCisJCQlwVHhCbGstPk1wZHVIZWFkZXJMZW4gLT0gTEVOR1RIXzgwMl8xX0g7CisKKwkJZnJhZ051bSsrOworCQlTcmNSZW1haW5pbmdCeXRlcyAtPSBwVHhCbGstPlNyY0J1ZkxlbjsKKwkJcFR4QmxrLT5wU3JjQnVmRGF0YSArPSBwVHhCbGstPlNyY0J1ZkxlbjsKKworCQlwSGVhZGVyXzgwMl8xMS0+RnJhZysrOwkgLy8gaW5jcmVhc2UgRnJhZyAjCisKKwl9d2hpbGUoU3JjUmVtYWluaW5nQnl0ZXMgPiAwKTsKKworCS8vCisJLy8gS2ljayBvdXQgVHgKKwkvLworCUhBTF9LaWNrT3V0VHgocEFkLCBwVHhCbGssIHBUeEJsay0+UXVlSWR4KTsKK30KKworCisjZGVmaW5lIFJFTEVBU0VfRlJBTUVTX09GX1RYQkxLKF9wQWQsIF9wVHhCbGssIF9wUUVudHJ5LCBfU3RhdHVzKSAJCQkJCQkJCQkJXAorCQl3aGlsZShfcFR4QmxrLT5UeFBhY2tldExpc3QuSGVhZCkJCQkJCQkJCQkJCQkJCVwKKwkJewkJCQkJCQkJCQkJCQkJCQkJCQkJCQlcCisJCQlfcFFFbnRyeSA9IFJlbW92ZUhlYWRRdWV1ZSgmX3BUeEJsay0+VHhQYWNrZXRMaXN0KTsJCQkJCQkJCQlcCisJCQlSRUxFQVNFX05ESVNfUEFDS0VUKF9wQWQsIFFVRVVFX0VOVFJZX1RPX1BBQ0tFVChfcFFFbnRyeSksIF9TdGF0dXMpOwlcCisJCX0KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJQ29weSBmcmFtZSBmcm9tIHdhaXRpbmcgcXVldWUgaW50byByZWxhdGl2ZSByaW5nIGJ1ZmZlciBhbmQgc2V0CisJYXBwcm9wcmlhdGUgQVNJQyByZWdpc3RlciB0byBraWNrIGhhcmR3YXJlIGVuY3J5cHRpb24gYmVmb3JlIHJlYWxseQorCXNlbnQgb3V0IHRvIGFpci4KKworCUFyZ3VtZW50czoKKwkJcEFkIAlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisJCVBORElTX1BBQ0tFVAlQb2ludGVyIHRvIG91dGdvaW5nIE5kaXMgZnJhbWUKKwkJTnVtYmVyT2ZGcmFnCU51bWJlciBvZiBmcmFnbWVudCByZXF1aXJlZAorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitORElTX1NUQVRVUyBTVEFIYXJkVHJhbnNtaXQoCisJSU4gUFJUTVBfQURBUFRFUglwQWQsCisJSU4gVFhfQkxLIAkJCSpwVHhCbGssCisJSU4JVUNIQVIJCQlRdWVJZHgpCit7CisJTkRJU19QQUNLRVQJCSpwUGFja2V0OworCVBRVUVVRV9FTlRSWQlwUUVudHJ5OworCisJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJLy8gU1RFUCAwLiBETyBTQU5JVFkgQ0hFQ0sgQU5EIFNPTUUgRUFSTFkgUFJFUEFSQVRJT04uCisJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJLy8KKwlBU1NFUlQocFR4QmxrLT5UeFBhY2tldExpc3QuTnVtYmVyKTsKKwlpZiAocFR4QmxrLT5UeFBhY2tldExpc3QuSGVhZCA9PSBOVUxMKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgicFR4QmxrLT5Ub3RhbEZyYW1lTnVtID09ICVsZCFcbiIsIHBUeEJsay0+VHhQYWNrZXRMaXN0Lk51bWJlcikpOworCQlyZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRTsKKwl9CisKKwlwUGFja2V0ID0gUVVFVUVfRU5UUllfVE9fUEFDS0VUKHBUeEJsay0+VHhQYWNrZXRMaXN0LkhlYWQpOworCisjaWYgMCAvL2RlZiBDQVJSSUVSX0RFVEVDVElPTl9TVVBQT1JUIC8vIFJvZ2VyIHN5bmMgQ2FycmllcgorCQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLkNhcnJpZXJEZXRlY3QuRW5hYmxlID09IFRSVUUpICYmIChpc0NhcnJpZXJEZXRlY3RFeGlzdChwQWQpID09IFRSVUUpKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfSU5GTywoIlNUQUhhcmRUcmFuc21pdCAtLT4gcmFkYXIgZGV0ZWN0IG5vdCBpbiBub3JtYWwgbW9kZSAhISFcbiIpKTsKKwkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCQlyZXR1cm4gKE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCX0KKyNlbmRpZiAvLyBDQVJSSUVSX0RFVEVDVElPTl9TVVBQT1JUIC8vCisKKwkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkvLyBTVEVQIDEuIFdBS0UgVVAgUEhZCisJLy8JCW91dGdvaW5nIGZyYW1lIGFsd2F5cyB3YWtldXAgUEhZIHRvIHByZXZlbnQgZnJhbWUgbG9zdCBhbmQKKwkvLwkJdHVybiBvZmYgUFNNIGJpdCB0byBpbXByb3ZlIHBlcmZvcm1hbmNlCisJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJLy8gbm90IHRvIGNoYW5nZSBQU00gYml0LCBqdXN0IHNlbmQgdGhpcyBmcmFtZSBvdXQ/CisJaWYgKChwQWQtPlN0YUNmZy5Qc20gPT0gUFdSX1NBVkUpICYmIE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSkpCisJeworCSAgICBEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiQXNpY0ZvcmNlV2FrZXVwIEF0IEhhcmRUeFxuIikpOworCQlBc2ljRm9yY2VXYWtldXAocEFkLCBUUlVFKTsKKwl9CisKKwkvLyBJdCBzaG91bGQgbm90IGNoYW5nZSBQU00gYml0LCB3aGVuIEFQU0QgdHVybiBvbi4KKwlpZiAoKCEocEFkLT5Db21tb25DZmcuYkFQU0RDYXBhYmxlICYmIHBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uYkFQU0RDYXBhYmxlKSAmJiAocEFkLT5Db21tb25DZmcuYkFQU0RGb3JjZVBvd2VyU2F2ZSA9PSBGQUxTRSkpCisJCXx8IChSVE1QX0dFVF9QQUNLRVRfRUFQT0wocFR4QmxrLT5wUGFja2V0KSkKKwkJfHwgKFJUTVBfR0VUX1BBQ0tFVF9XQUkocFR4QmxrLT5wUGFja2V0KSkpCisJeworCQlpZiAoKHBBZC0+U3RhQ2ZnLlBzbSA9PSBQV1JfU0FWRSkgJiYKKyAgICAgICAgICAgIChwQWQtPlN0YUNmZy5XaW5kb3dzUG93ZXJNb2RlID09IE5kaXM4MDJfMTFQb3dlck1vZGVGYXN0X1BTUCkpCisJCQlNbG1lU2V0UHNtQml0KHBBZCwgUFdSX0FDVElWRSk7CisJfQorCisJc3dpdGNoIChwVHhCbGstPlR4RnJhbWVUeXBlKQorCXsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJY2FzZSBUWF9BTVBEVV9GUkFNRToKKwkJCQlTVEFfQU1QRFVfRnJhbWVfVHgocEFkLCBwVHhCbGspOworCQkJYnJlYWs7CisJCWNhc2UgVFhfQU1TRFVfRlJBTUU6CisJCQkJU1RBX0FNU0RVX0ZyYW1lX1R4KHBBZCwgcFR4QmxrKTsKKwkJCWJyZWFrOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQljYXNlIFRYX0xFR0FDWV9GUkFNRToKKwkJCQlTVEFfTGVnYWN5X0ZyYW1lX1R4KHBBZCwgcFR4QmxrKTsKKwkJCWJyZWFrOworCQljYXNlIFRYX01DQVNUX0ZSQU1FOgorCQkJCVNUQV9MZWdhY3lfRnJhbWVfVHgocEFkLCBwVHhCbGspOworCQkJYnJlYWs7CisJCWNhc2UgVFhfUkFMSU5LX0ZSQU1FOgorCQkJCVNUQV9BUmFsaW5rX0ZyYW1lX1R4KHBBZCwgcFR4QmxrKTsKKwkJCWJyZWFrOworCQljYXNlIFRYX0ZSQUdfRlJBTUU6CisJCQkJU1RBX0ZyYWdtZW50X0ZyYW1lX1R4KHBBZCwgcFR4QmxrKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJeworCQkJCS8vIEl0IHNob3VsZCBub3QgaGFwcGVuZWQhCisJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiU2VuZCBhIHBhY2VrdCB3YXMgbm90IGNsYXNzaWZpZWQhISBJdCBzaG91bGQgbm90IGhhcHBlbiFcbiIpKTsKKwkJCQl3aGlsZShwVHhCbGstPlR4UGFja2V0TGlzdC5OdW1iZXIpCisJCQkJeworCQkJCQlwUUVudHJ5ID0gUmVtb3ZlSGVhZFF1ZXVlKCZwVHhCbGstPlR4UGFja2V0TGlzdCk7CisJCQkJCXBQYWNrZXQgPSBRVUVVRV9FTlRSWV9UT19QQUNLRVQocFFFbnRyeSk7CisJCQkJCWlmIChwUGFja2V0KQorCQkJCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCX0KKworCXJldHVybiAoTkRJU19TVEFUVVNfU1VDQ0VTUyk7CisKK30KKworVUxPTkcgIEhhc2hCeXRlc1BvbHlub21pYWwoVUNIQVIgKnZhbHVlLCB1bnNpZ25lZCBpbnQgbGVuKQoreworICAgdW5zaWduZWQgY2hhciAqd29yZCA9IHZhbHVlOworICAgdW5zaWduZWQgaW50IHJldCA9IDA7CisgICB1bnNpZ25lZCBpbnQgaTsKKworICAgZm9yKGk9MDsgaSA8IGxlbjsgaSsrKQorICAgeworCSAgaW50IG1vZCA9IGkgJSAzMjsKKwkgIHJldCBePSh1bnNpZ25lZCBpbnQpICh3b3JkW2ldKSA8PCBtb2Q7CisJICByZXQgXj0odW5zaWduZWQgaW50KSAod29yZFtpXSkgPj4gKDMyIC0gbW9kKTsKKyAgIH0KKyAgIHJldHVybiByZXQ7Cit9CisKK1ZPSUQgU3RhX0Fubm91bmNlX29yX0ZvcndhcmRfODAyXzNfUGFja2V0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBORElTX1BBQ0tFVAlwUGFja2V0LAorCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpCit7CisJaWYgKFRSVUUKKwkJKQorCXsKKwkJYW5ub3VuY2VfODAyXzNfcGFja2V0KHBBZCwgcFBhY2tldCk7CisJfQorCWVsc2UKKwl7CisJCS8vIHJlbGVhc2UgcGFja2V0CisJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwl9Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3RhL3Nhbml0eS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zdGEvc2FuaXR5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjM5ODcyNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3RhL3Nhbml0eS5jCkBAIC0wLDAgKzEsNDIwIEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCU1vZHVsZSBOYW1lOgorCXNhbml0eS5jCisKKwlBYnN0cmFjdDoKKworCVJldmlzaW9uIEhpc3Rvcnk6CisJV2hvCQkJV2hlbgkJCVdoYXQKKwktLS0tLS0tLQktLS0tLS0tLS0tCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJSm9obiBDaGFuZyAgMjAwNC0wOS0wMSAgICAgIGFkZCBXTU0gc3VwcG9ydAorKi8KKyNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKKworZXh0ZXJuIFVDSEFSCUNJU0NPX09VSVtdOworCitleHRlcm4gVUNIQVIJV1BBX09VSVtdOworZXh0ZXJuIFVDSEFSCVJTTl9PVUlbXTsKK2V4dGVybiBVQ0hBUglXTUVfSU5GT19FTEVNW107CitleHRlcm4gVUNIQVIJV01FX1BBUk1fRUxFTVtdOworZXh0ZXJuIFVDSEFSCUNjeDJRb3NJbmZvW107CitleHRlcm4gVUNIQVIJUkFMSU5LX09VSVtdOworZXh0ZXJuIFVDSEFSCUJST0FEQ09NX09VSVtdOworCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIE1MTUUgbWVzc2FnZSBzYW5pdHkgY2hlY2sKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitCT09MRUFOIE1sbWVTdGFydFJlcVNhbml0eSgKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBWT0lEICpNc2csCisgICAgSU4gVUxPTkcgTXNnTGVuLAorICAgIE9VVCBDSEFSIFNzaWRbXSwKKyAgICBPVVQgVUNIQVIgKnBTc2lkTGVuKQoreworICAgIE1MTUVfU1RBUlRfUkVRX1NUUlVDVCAqSW5mbzsKKworICAgIEluZm8gPSAoTUxNRV9TVEFSVF9SRVFfU1RSVUNUICopKE1zZyk7CisKKyAgICBpZiAoSW5mby0+U3NpZExlbiA+IE1BWF9MRU5fT0ZfU1NJRCkKKyAgICB7CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1sbWVTdGFydFJlcVNhbml0eSBmYWlsIC0gd3JvbmcgU1NJRCBsZW5ndGhcbiIpKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgICpwU3NpZExlbiA9IEluZm8tPlNzaWRMZW47CisgICAgTmRpc01vdmVNZW1vcnkoU3NpZCwgSW5mby0+U3NpZCwgKnBTc2lkTGVuKTsKKworICAgIHJldHVybiBUUlVFOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIE1MTUUgbWVzc2FnZSBzYW5pdHkgY2hlY2sKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKworICAgIElSUUwgPSBESVNQQVRDSF9MRVZFTAorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworQk9PTEVBTiBQZWVyQXNzb2NSc3BTYW5pdHkoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gVk9JRCAqcE1zZywKKyAgICBJTiBVTE9ORyBNc2dMZW4sCisgICAgT1VUIFBVQ0hBUiBwQWRkcjIsCisgICAgT1VUIFVTSE9SVCAqcENhcGFiaWxpdHlJbmZvLAorICAgIE9VVCBVU0hPUlQgKnBTdGF0dXMsCisgICAgT1VUIFVTSE9SVCAqcEFpZCwKKyAgICBPVVQgVUNIQVIgU3VwUmF0ZVtdLAorICAgIE9VVCBVQ0hBUiAqcFN1cFJhdGVMZW4sCisgICAgT1VUIFVDSEFSIEV4dFJhdGVbXSwKKyAgICBPVVQgVUNIQVIgKnBFeHRSYXRlTGVuLAorICAgIE9VVCBIVF9DQVBBQklMSVRZX0lFCQkqcEh0Q2FwYWJpbGl0eSwKKyAgICBPVVQgQUREX0hUX0lORk9fSUUJCSpwQWRkSHRJbmZvLAkvLyBBUCBtaWdodCB1c2UgdGhpcyBhZGRpdGlvbmFsIGh0IGluZm8gSUUKKyAgICBPVVQgVUNIQVIJCQkqcEh0Q2FwYWJpbGl0eUxlbiwKKyAgICBPVVQgVUNIQVIJCQkqcEFkZEh0SW5mb0xlbiwKKyAgICBPVVQgVUNIQVIJCQkqcE5ld0V4dENoYW5uZWxPZmZzZXQsCisgICAgT1VUIFBFRENBX1BBUk0gcEVkY2FQYXJtLAorICAgIE9VVCBVQ0hBUiAqcENraXBGbGFnKQoreworICAgIENIQVIgICAgICAgICAgSWVUeXBlLCAqUHRyOworICAgIFBGUkFNRV84MDJfMTEgcEZyYW1lID0gKFBGUkFNRV84MDJfMTEpcE1zZzsKKyAgICBQRUlEX1NUUlVDVCAgIHBFaWQ7CisgICAgVUxPTkcgICAgICAgICBMZW5ndGggPSAwOworCisJKnBOZXdFeHRDaGFubmVsT2Zmc2V0ID0gMHhmZjsKKwkqcEh0Q2FwYWJpbGl0eUxlbiA9IDA7CisJKnBBZGRIdEluZm9MZW4gPSAwOworICAgIENPUFlfTUFDX0FERFIocEFkZHIyLCBwRnJhbWUtPkhkci5BZGRyMik7CisgICAgUHRyID0gcEZyYW1lLT5PY3RldDsKKyAgICBMZW5ndGggKz0gTEVOR1RIXzgwMl8xMTsKKworICAgIE5kaXNNb3ZlTWVtb3J5KHBDYXBhYmlsaXR5SW5mbywgJnBGcmFtZS0+T2N0ZXRbMF0sIDIpOworICAgIExlbmd0aCArPSAyOworICAgIE5kaXNNb3ZlTWVtb3J5KHBTdGF0dXMsICAgICAgICAgJnBGcmFtZS0+T2N0ZXRbMl0sIDIpOworICAgIExlbmd0aCArPSAyOworICAgICpwQ2tpcEZsYWcgPSAwOworICAgICpwRXh0UmF0ZUxlbiA9IDA7CisgICAgcEVkY2FQYXJtLT5iVmFsaWQgPSBGQUxTRTsKKworICAgIGlmICgqcFN0YXR1cyAhPSBNTE1FX1NVQ0NFU1MpCisgICAgICAgIHJldHVybiBUUlVFOworCisgICAgTmRpc01vdmVNZW1vcnkocEFpZCwgJnBGcmFtZS0+T2N0ZXRbNF0sIDIpOworICAgIExlbmd0aCArPSAyOworCisgICAgLy8gQWlkIGFscmVhZHkgc3dhcGVkIGJ5dGUgb3JkZXIgaW4gUlRNUEZyYW1lRW5kaWFuQ2hhbmdlKCkgZm9yIGJpZyBlbmRpYW4gcGxhdGZvcm0KKyAgICAqcEFpZCA9ICgqcEFpZCkgJiAweDNmZmY7IC8vIEFJRCBpcyBsb3cgMTQtYml0CisKKyAgICAvLyAtLSBnZXQgc3VwcG9ydGVkIHJhdGVzIGZyb20gcGF5bG9hZCBhbmQgYWR2YW5jZSB0aGUgcG9pbnRlcgorICAgIEllVHlwZSA9IHBGcmFtZS0+T2N0ZXRbNl07CisgICAgKnBTdXBSYXRlTGVuID0gcEZyYW1lLT5PY3RldFs3XTsKKyAgICBpZiAoKEllVHlwZSAhPSBJRV9TVVBQX1JBVEVTKSB8fCAoKnBTdXBSYXRlTGVuID4gTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVMpKQorICAgIHsKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGVlckFzc29jUnNwU2FuaXR5IGZhaWwgLSB3cm9uZyBTdXBwb3J0ZWRSYXRlcyBJRVxuIikpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgTmRpc01vdmVNZW1vcnkoU3VwUmF0ZSwgJnBGcmFtZS0+T2N0ZXRbOF0sICpwU3VwUmF0ZUxlbik7CisKKyAgICBMZW5ndGggPSBMZW5ndGggKyAyICsgKnBTdXBSYXRlTGVuOworCisgICAgLy8gbWFueSBBUCBpbXBsZW1lbnQgcHJvcHJpZXRhcnkgSUVzIGluIG5vbi1zdGFuZGFyZCBvcmRlciwgd2UnZCBiZXR0ZXIKKyAgICAvLyB0b2xlcmF0ZSBtaXMtb3JkZXJlZCBJRXMgdG8gZ2V0IGJlc3QgY29tcGF0aWJpbGl0eQorICAgIHBFaWQgPSAoUEVJRF9TVFJVQ1QpICZwRnJhbWUtPk9jdGV0WzggKyAoKnBTdXBSYXRlTGVuKV07CisKKyAgICAvLyBnZXQgdmFyaWFibGUgZmllbGRzIGZyb20gcGF5bG9hZCBhbmQgYWR2YW5jZSB0aGUgcG9pbnRlcgorICAgIHdoaWxlICgoTGVuZ3RoICsgMiArIHBFaWQtPkxlbikgPD0gTXNnTGVuKQorICAgIHsKKyAgICAgICAgc3dpdGNoIChwRWlkLT5FaWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgSUVfRVhUX1NVUFBfUkFURVM6CisgICAgICAgICAgICAgICAgaWYgKHBFaWQtPkxlbiA8PSBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KEV4dFJhdGUsIHBFaWQtPk9jdGV0LCBwRWlkLT5MZW4pOworICAgICAgICAgICAgICAgICAgICAqcEV4dFJhdGVMZW4gPSBwRWlkLT5MZW47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgY2FzZSBJRV9IVF9DQVA6CisgICAgICAgICAgICBjYXNlIElFX0hUX0NBUDI6CisJCQlpZiAocEVpZC0+TGVuID49IFNJWkVfSFRfQ0FQX0lFKSAgLy9Ob3RlOiBhbGxvdyBleHRlbnNpb24uISEKKwkJCXsKKwkJCQlOZGlzTW92ZU1lbW9yeShwSHRDYXBhYmlsaXR5LCBwRWlkLT5PY3RldCwgU0laRV9IVF9DQVBfSUUpOworCisJCQkJKihVU0hPUlQgKikoJnBIdENhcGFiaWxpdHktPkh0Q2FwSW5mbykgPSBjcHUybGUxNigqKFVTSE9SVCAqKSgmcEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvKSk7CisJCQkJKihVU0hPUlQgKikoJnBIdENhcGFiaWxpdHktPkV4dEh0Q2FwSW5mbykgPSBjcHUybGUxNigqKFVTSE9SVCAqKSgmcEh0Q2FwYWJpbGl0eS0+RXh0SHRDYXBJbmZvKSk7CisKKwkJCQkqcEh0Q2FwYWJpbGl0eUxlbiA9IFNJWkVfSFRfQ0FQX0lFOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1dBUk4sICgiUGVlckFzc29jUnNwU2FuaXR5IC0gd3JvbmcgSUVfSFRfQ0FQLiBcbiIpKTsKKwkJCX0KKworCQlicmVhazsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKyAgICAgICAgICAgIGNhc2UgSUVfQUREX0hUOgorICAgICAgICAgICAgY2FzZSBJRV9BRERfSFQyOgorCQkJaWYgKHBFaWQtPkxlbiA+PSBzaXplb2YoQUREX0hUX0lORk9fSUUpKQorCQkJeworCQkJCS8vIFRoaXMgSUUgYWxsb3dzIGV4dGVuc2lvbiwgYnV0IHdlIGNhbiBpZ25vcmUgZXh0cmEgYnl0ZXMgYmV5b25kIG91ciBrbm93bGVkZ2UgLCBzbyBvbmx5CisJCQkJLy8gY29weSBmaXJzdCBzaXplb2YoQUREX0hUX0lORk9fSUUpCisJCQkJTmRpc01vdmVNZW1vcnkocEFkZEh0SW5mbywgcEVpZC0+T2N0ZXQsIHNpemVvZihBRERfSFRfSU5GT19JRSkpOworCisJCQkJKihVU0hPUlQgKikoJnBBZGRIdEluZm8tPkFkZEh0SW5mbzIpID0gY3B1MmxlMTYoKihVU0hPUlQgKikoJnBBZGRIdEluZm8tPkFkZEh0SW5mbzIpKTsKKwkJCQkqKFVTSE9SVCAqKSgmcEFkZEh0SW5mby0+QWRkSHRJbmZvMykgPSBjcHUybGUxNigqKFVTSE9SVCAqKSgmcEFkZEh0SW5mby0+QWRkSHRJbmZvMykpOworCisJCQkJKnBBZGRIdEluZm9MZW4gPSBTSVpFX0FERF9IVF9JTkZPX0lFOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1dBUk4sICgiUGVlckFzc29jUnNwU2FuaXR5IC0gd3JvbmcgSUVfQUREX0hULiBcbiIpKTsKKwkJCX0KKworCQlicmVhazsKKyAgICAgICAgICAgIGNhc2UgSUVfU0VDT05EQVJZX0NIX09GRlNFVDoKKwkJCWlmIChwRWlkLT5MZW4gPT0gMSkKKwkJCXsKKwkJCQkqcE5ld0V4dENoYW5uZWxPZmZzZXQgPSBwRWlkLT5PY3RldFswXTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19XQVJOLCAoIlBlZXJBc3NvY1JzcFNhbml0eSAtIHdyb25nIElFX1NFQ09OREFSWV9DSF9PRkZTRVQuIFxuIikpOworCQkJfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQlicmVhazsKKyAgICAgICAgICAgIGNhc2UgSUVfQUlST05FVF9DS0lQOgorICAgICAgICAgICAgICAgIC8vIDAuIENoZWNrIEFpcm9uZXQgSUUgbGVuZ3RoLCBpdCBtdXN0IGJlIGxhcmdlciBvciBlcXVhbCB0byAyOAorICAgICAgICAgICAgICAgIC8vICAgIENpc2NvJ3MgQVAgVnhXb3JrIHZlcnNpb24od2lsbCBub3QgYmUgc3VwcG9ydGVkKSB1c2VkIHRoaXMgSUUgbGVuZ3RoIGFzIDI4CisgICAgICAgICAgICAgICAgLy8gICAgQ2lzY28ncyBBUCBJT1MgdmVyc2lvbiB1c2VkIHRoaXMgSUUgbGVuZ3RoIGFzIDMwCisgICAgICAgICAgICAgICAgaWYgKHBFaWQtPkxlbiA8IChDS0lQX05FR09USUFUSU9OX0xFTkdUSCAtIDIpKQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgLy8gMS4gQ29weSBDS0lQIGZsYWcgYnl0ZSB0byBidWZmZXIgZm9yIHByb2Nlc3MKKyAgICAgICAgICAgICAgICAqcENraXBGbGFnID0gKihwRWlkLT5PY3RldCArIDgpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIElFX0FJUk9ORVRfSVBBRERSRVNTOgorICAgICAgICAgICAgICAgIGlmIChwRWlkLT5MZW4gIT0gMHgwQSkKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIC8vIEdldCBDaXNjbyBBaXJvbmV0IElQIGluZm9ybWF0aW9uCisgICAgICAgICAgICAgICAgaWYgKE5kaXNFcXVhbE1lbW9yeShwRWlkLT5PY3RldCwgQ0lTQ09fT1VJLCAzKSA9PSAxKQorICAgICAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5BaXJvbmV0SVBBZGRyZXNzLCBwRWlkLT5PY3RldCArIDQsIDQpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAvLyBDQ1gyLCBXTU0gdXNlIHRoZSBzYW1lIElFIHZhbHVlCisgICAgICAgICAgICAvLyBjYXNlIElFX0NDWF9WMjoKKyAgICAgICAgICAgIGNhc2UgSUVfVkVORE9SX1NQRUNJRklDOgorICAgICAgICAgICAgICAgIC8vIGhhbmRsZSBXTUUgUEFSQU1URVIgRUxFTUVOVAorICAgICAgICAgICAgICAgIGlmIChOZGlzRXF1YWxNZW1vcnkocEVpZC0+T2N0ZXQsIFdNRV9QQVJNX0VMRU0sIDYpICYmIChwRWlkLT5MZW4gPT0gMjQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgUFVDSEFSIHB0cjsKKyAgICAgICAgICAgICAgICAgICAgaW50IGk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gcGFyc2luZyBFRENBIHBhcmFtZXRlcnMKKyAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5iVmFsaWQgICAgICAgICAgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPmJRQWNrICAgICAgICAgICA9IEZBTFNFOyAvLyBwRWlkLT5PY3RldFswXSAmIDB4MTA7CisgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+YlF1ZXVlUmVxdWVzdCAgID0gRkFMU0U7IC8vIHBFaWQtPk9jdGV0WzBdICYgMHgyMDsKKyAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5iVHhvcFJlcXVlc3QgICAgPSBGQUxTRTsgLy8gcEVpZC0+T2N0ZXRbMF0gJiAweDQwOworICAgICAgICAgICAgICAgICAgICAvL3BFZGNhUGFybS0+Yk1vcmVEYXRhQWNrICAgID0gRkFMU0U7IC8vIHBFaWQtPk9jdGV0WzBdICYgMHg4MDsKKyAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5FZGNhVXBkYXRlQ291bnQgPSBwRWlkLT5PY3RldFs2XSAmIDB4MGY7CisgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+YkFQU0RDYXBhYmxlICAgID0gKHBFaWQtPk9jdGV0WzZdICYgMHg4MCkgPyAxIDogMDsKKyAgICAgICAgICAgICAgICAgICAgcHRyID0gJnBFaWQtPk9jdGV0WzhdOworICAgICAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaTw0OyBpKyspCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSIGFjaSA9ICgqcHRyICYgMHg2MCkgPj4gNTsgLy8gYjV+NiBpcyBBQyBJTkRFWAorICAgICAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5iQUNNW2FjaV0gID0gKCgoKnB0cikgJiAweDEwKSA9PSAweDEwKTsgICAvLyBiNSBpcyBBQ00KKyAgICAgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+QWlmc25bYWNpXSA9ICgqcHRyKSAmIDB4MGY7ICAgICAgICAgICAgICAgLy8gYjB+MyBpcyBBSUZTTgorICAgICAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5Dd21pblthY2ldID0gKihwdHIrMSkgJiAweDBmOyAgICAgICAgICAgICAvLyBiMH40IGlzIEN3bWluCisgICAgICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPkN3bWF4W2FjaV0gPSAqKHB0cisxKSA+PiA0OyAgICAgICAgICAgICAgIC8vIGI1fjggaXMgQ3dtYXgKKyAgICAgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+VHhvcFthY2ldICA9ICoocHRyKzIpICsgMjU2ICogKCoocHRyKzMpKTsgLy8gaW4gdW5pdCBvZiAzMi11cworICAgICAgICAgICAgICAgICAgICAgICAgcHRyICs9IDQ7IC8vIHBvaW50IHRvIG5leHQgQUMKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIGhhbmRsZSBDQ1ggSUUKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyAwLiBDaGVjayB0aGUgc2l6ZSBhbmQgQ0NYIGFkbWluIGNvbnRyb2wKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBBZC0+U3RhQ2ZnLkNDWENvbnRyb2wuZmllbGQuRW5hYmxlID09IDApCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBFaWQtPkxlbiAhPSA1KQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gVHVybiBDQ1gyIGlmIG1hdGNoZWQKKyAgICAgICAgICAgICAgICAgICAgaWYgKE5kaXNFcXVhbE1lbW9yeShwRWlkLT5PY3RldCwgQ2N4MkllSW5mbywgNSkgPT0gMSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHBBZC0+U3RhQ2ZnLkNDWEVuYWJsZSA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyQXNzb2NSc3BTYW5pdHkgLSBpZ25vcmUgdW5yZWNvZ25pemVkIEVJRCA9ICVkXG4iLCBwRWlkLT5FaWQpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIExlbmd0aCA9IExlbmd0aCArIDIgKyBwRWlkLT5MZW47CisgICAgICAgIHBFaWQgPSAoUEVJRF9TVFJVQ1QpKChVQ0hBUiopcEVpZCArIDIgKyBwRWlkLT5MZW4pOworICAgIH0KKworICAgIC8vIEZvcmNlIENDWDIgZW5hYmxlIHRvIFRSVUUgZm9yIHRob3NlIEFQIGRpZG4ndCByZXBsYXkgQ0NYIHYyIElFLCB3ZSBzdGlsbCBmb3JjZSBpdCB0byBiZSBvbgorICAgIGlmIChwQWQtPlN0YUNmZy5DQ1hDb250cm9sLmZpZWxkLkVuYWJsZSA9PSAxKQorICAgICAgICBwQWQtPlN0YUNmZy5DQ1hFbmFibGUgPSBUUlVFOworCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgTUxNRSBtZXNzYWdlIHNhbml0eSBjaGVjaworICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitCT09MRUFOIFBlZXJQcm9iZVJlcVNhbml0eSgKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBWT0lEICpNc2csCisgICAgSU4gVUxPTkcgTXNnTGVuLAorICAgIE9VVCBQVUNIQVIgcEFkZHIyLAorICAgIE9VVCBDSEFSIFNzaWRbXSwKKyAgICBPVVQgVUNIQVIgKnBTc2lkTGVuKQoreworICAgIFVDSEFSICAgICAgICAgSWR4OworICAgIFVDSEFSCSAgICAgIFJhdGVMZW47CisgICAgQ0hBUiAgICAgICAgICBJZVR5cGU7CisgICAgUEZSQU1FXzgwMl8xMSBwRnJhbWUgPSAoUEZSQU1FXzgwMl8xMSlNc2c7CisKKyAgICBDT1BZX01BQ19BRERSKHBBZGRyMiwgcEZyYW1lLT5IZHIuQWRkcjIpOworCisgICAgaWYgKChwRnJhbWUtPk9jdGV0WzBdICE9IElFX1NTSUQpIHx8IChwRnJhbWUtPk9jdGV0WzFdID4gTUFYX0xFTl9PRl9TU0lEKSkKKyAgICB7CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXJQcm9iZVJlcVNhbml0eSBmYWlsIC0gd3JvbmcgU1NJRCBJRShUeXBlPSVkLExlbj0lZClcbiIscEZyYW1lLT5PY3RldFswXSxwRnJhbWUtPk9jdGV0WzFdKSk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICAqcFNzaWRMZW4gPSBwRnJhbWUtPk9jdGV0WzFdOworICAgIE5kaXNNb3ZlTWVtb3J5KFNzaWQsICZwRnJhbWUtPk9jdGV0WzJdLCAqcFNzaWRMZW4pOworCisgICAgSWR4ID0gKnBTc2lkTGVuICsgMjsKKworICAgIC8vIC0tIGdldCBzdXBwb3J0ZWQgcmF0ZXMgZnJvbSBwYXlsb2FkIGFuZCBhZHZhbmNlIHRoZSBwb2ludGVyCisgICAgSWVUeXBlID0gcEZyYW1lLT5PY3RldFtJZHhdOworICAgIFJhdGVMZW4gPSBwRnJhbWUtPk9jdGV0W0lkeCArIDFdOworICAgIGlmIChJZVR5cGUgIT0gSUVfU1VQUF9SQVRFUykKKyAgICB7CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXJQcm9iZVJlcVNhbml0eSBmYWlsIC0gd3JvbmcgU3VwcG9ydFJhdGVzIElFKFR5cGU9JWQsTGVuPSVkKVxuIixwRnJhbWUtPk9jdGV0W0lkeF0scEZyYW1lLT5PY3RldFtJZHgrMV0pKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpZiAoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExRykgJiYgKFJhdGVMZW4gPCA4KSkKKyAgICAgICAgICAgIHJldHVybiAoRkFMU0UpOworICAgIH0KKworICAgIHJldHVybiBUUlVFOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK0JPT0xFQU4gR2V0VGltQml0KAorICAgIElOIENIQVIgKlB0ciwKKyAgICBJTiBVU0hPUlQgQWlkLAorICAgIE9VVCBVQ0hBUiAqVGltTGVuLAorICAgIE9VVCBVQ0hBUiAqQmNhc3RGbGFnLAorICAgIE9VVCBVQ0hBUiAqRHRpbUNvdW50LAorICAgIE9VVCBVQ0hBUiAqRHRpbVBlcmlvZCwKKyAgICBPVVQgVUNIQVIgKk1lc3NhZ2VUb01lKQoreworICAgIFVDSEFSICAgICAgICAgIEJpdENudGwsIE4xLCBOMiwgTXlCeXRlLCBNeUJpdDsKKyAgICBDSEFSICAgICAgICAgICpJZHhQdHI7CisKKyAgICBJZHhQdHIgPSBQdHI7CisKKyAgICBJZHhQdHIgKys7CisgICAgKlRpbUxlbiA9ICpJZHhQdHI7CisKKyAgICAvLyBnZXQgRFRJTSBDb3VudCBmcm9tIFRJTSBlbGVtZW50CisgICAgSWR4UHRyICsrOworICAgICpEdGltQ291bnQgPSAqSWR4UHRyOworCisgICAgLy8gZ2V0IERUSU0gUGVyaW9kIGZyb20gVElNIGVsZW1lbnQKKyAgICBJZHhQdHIrKzsKKyAgICAqRHRpbVBlcmlvZCA9ICpJZHhQdHI7CisKKyAgICAvLyBnZXQgQml0bWFwIENvbnRyb2wgZnJvbSBUSU0gZWxlbWVudAorICAgIElkeFB0cisrOworICAgIEJpdENudGwgPSAqSWR4UHRyOworCisgICAgaWYgKCgqRHRpbUNvdW50ID09IDApICYmIChCaXRDbnRsICYgMHgwMSkpCisgICAgICAgICpCY2FzdEZsYWcgPSBUUlVFOworICAgIGVsc2UKKyAgICAgICAgKkJjYXN0RmxhZyA9IEZBTFNFOworCisgICAgLy8gUGFyc2UgUGFydGlhbCBWaXJ0dWFsIEJpdG1hcCBmcm9tIFRJTSBlbGVtZW50CisgICAgTjEgPSBCaXRDbnRsICYgMHhmZTsgICAgLy8gTjEgaXMgdGhlIGZpcnN0IGJpdG1hcCBieXRlIworICAgIE4yID0gKlRpbUxlbiAtIDQgKyBOMTsgIC8vIE4yIGlzIHRoZSBsYXN0IGJpdG1hcCBieXRlIworCisgICAgaWYgKChBaWQgPCAoTjEgPDwgMykpIHx8IChBaWQgPj0gKChOMiArIDEpIDw8IDMpKSkKKyAgICAgICAgKk1lc3NhZ2VUb01lID0gRkFMU0U7CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgTXlCeXRlID0gKEFpZCA+PiAzKSAtIE4xOyAgICAgICAgICAgICAgICAgICAgICAgLy8gbXkgYnl0ZSBwb3NpdGlvbiBpbiB0aGUgYml0bWFwIGJ5dGUtc3RyZWFtCisgICAgICAgIE15Qml0ID0gQWlkICUgMTYgLSAoKE15Qnl0ZSAmIDB4MDEpPyA4OjApOworCisgICAgICAgIElkeFB0ciArPSAoTXlCeXRlICsgMSk7CisKKyAgICAgICAgLy9pZiAoKklkeFB0cikKKyAgICAgICAgLy8gICAgREJHUFJJTlQoUlRfREVCVUdfV0FSTiwgKCJUSU0gYml0bWFwID0gMHglMDJ4XG4iLCAqSWR4UHRyKSk7CisKKyAgICAgICAgaWYgKCpJZHhQdHIgJiAoMHgwMSA8PCBNeUJpdCkpCisgICAgICAgICAgICAqTWVzc2FnZVRvTWUgPSBUUlVFOworICAgICAgICBlbHNlCisgICAgICAgICAgICAqTWVzc2FnZVRvTWUgPSBGQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gVFJVRTsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zdGEvc3luYy5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zdGEvc3luYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxOTZmODUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3N0YS9zeW5jLmMKQEAgLTAsMCArMSwxOTU5IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCU1vZHVsZSBOYW1lOgorCXN5bmMuYworCisJQWJzdHJhY3Q6CisKKwlSZXZpc2lvbiBIaXN0b3J5OgorCVdobwkJCVdoZW4JCQlXaGF0CisJLS0tLS0tLS0JLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCUpvaG4gQ2hhbmcJMjAwNC0wOS0wMSAgICAgIG1vZGlmaWVkIGZvciBydDI1NjEvMjY2MQorCUphbiBMZWUJCTIwMDYtMDgtMDEgICAgICBtb2RpZmllZCBmb3IgcnQyODYwIGZvciA4MDIuMTFuCisqLworI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgorCisjZGVmaW5lIEFDMF9ERUZfVFhPUAkJMAorI2RlZmluZSBBQzFfREVGX1RYT1AJCTAKKyNkZWZpbmUgQUMyX0RFRl9UWE9QCQk5NAorI2RlZmluZSBBQzNfREVGX1RYT1AJCTQ3CisKK1ZPSUQJQWRob2NUdXJuT25Rb3MoCisJSU4gIFBSVE1QX0FEQVBURVIgcEFkKQoreworCS8vIFR1cm4gb24gUU9zIGlmIHVzZSBIVCByYXRlLgorCWlmIChwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLmJWYWxpZCA9PSBGQUxTRSkKKwl7CisJCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uYlZhbGlkID0gVFJVRTsKKwkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5BaWZzblswXSA9IDM7CisJCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uQWlmc25bMV0gPSA3OworCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLkFpZnNuWzJdID0gMTsKKwkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5BaWZzblszXSA9IDE7CisKKwkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5Dd21pblswXSA9IDQ7CisJCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uQ3dtaW5bMV0gPSA0OworCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLkN3bWluWzJdID0gMzsKKwkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5Dd21pblszXSA9IDI7CisKKwkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5Dd21heFswXSA9IDEwOworCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLkN3bWF4WzFdID0gNjsKKwkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5Dd21heFsyXSA9IDQ7CisJCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uQ3dtYXhbM10gPSAzOworCisJCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uVHhvcFswXSAgPSAwOworCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLlR4b3BbMV0gID0gMDsKKwkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5UeG9wWzJdICA9IEFDMl9ERUZfVFhPUDsKKwkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5UeG9wWzNdICA9IEFDM19ERUZfVFhPUDsKKwl9CisJQXNpY1NldEVkY2FQYXJtKHBBZCwgJnBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0pOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVRoZSBzeW5jIHN0YXRlIG1hY2hpbmUsCisJUGFyYW1ldGVyczoKKwkJU20gLSBwb2ludGVyIHRvIHRoZSBzdGF0ZSBtYWNoaW5lCisJTm90ZToKKwkJdGhlIHN0YXRlIG1hY2hpbmUgbG9va3MgbGlrZSB0aGUgZm9sbG93aW5nCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIFN5bmNTdGF0ZU1hY2hpbmVJbml0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFNUQVRFX01BQ0hJTkUgKlNtLAorCU9VVCBTVEFURV9NQUNISU5FX0ZVTkMgVHJhbnNbXSkKK3sKKwlTdGF0ZU1hY2hpbmVJbml0KFNtLCBUcmFucywgTUFYX1NZTkNfU1RBVEUsIE1BWF9TWU5DX01TRywgKFNUQVRFX01BQ0hJTkVfRlVOQylEcm9wLCBTWU5DX0lETEUsIFNZTkNfTUFDSElORV9CQVNFKTsKKworCS8vIGNvbHVtbiAxCisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBTWU5DX0lETEUsIE1UMl9NTE1FX1NDQU5fUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKU1sbWVTY2FuUmVxQWN0aW9uKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIFNZTkNfSURMRSwgTVQyX01MTUVfSk9JTl9SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpTWxtZUpvaW5SZXFBY3Rpb24pOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgU1lOQ19JRExFLCBNVDJfTUxNRV9TVEFSVF9SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpTWxtZVN0YXJ0UmVxQWN0aW9uKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIFNZTkNfSURMRSwgTVQyX1BFRVJfQkVBQ09OLCAoU1RBVEVfTUFDSElORV9GVU5DKVBlZXJCZWFjb24pOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgU1lOQ19JRExFLCBNVDJfUEVFUl9QUk9CRV9SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpUGVlclByb2JlUmVxQWN0aW9uKTsKKworCS8vY29sdW1uIDIKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIEpPSU5fV0FJVF9CRUFDT04sIE1UMl9NTE1FX1NDQU5fUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKUludmFsaWRTdGF0ZVdoZW5TY2FuKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIEpPSU5fV0FJVF9CRUFDT04sIE1UMl9NTE1FX0pPSU5fUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKUludmFsaWRTdGF0ZVdoZW5Kb2luKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIEpPSU5fV0FJVF9CRUFDT04sIE1UMl9NTE1FX1NUQVJUX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylJbnZhbGlkU3RhdGVXaGVuU3RhcnQpOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgSk9JTl9XQUlUX0JFQUNPTiwgTVQyX1BFRVJfQkVBQ09OLCAoU1RBVEVfTUFDSElORV9GVU5DKVBlZXJCZWFjb25BdEpvaW5BY3Rpb24pOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgSk9JTl9XQUlUX0JFQUNPTiwgTVQyX0JFQUNPTl9USU1FT1VULCAoU1RBVEVfTUFDSElORV9GVU5DKUJlYWNvblRpbWVvdXRBdEpvaW5BY3Rpb24pOworCisJLy8gY29sdW1uIDMKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIFNDQU5fTElTVEVOLCBNVDJfTUxNRV9TQ0FOX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylJbnZhbGlkU3RhdGVXaGVuU2Nhbik7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBTQ0FOX0xJU1RFTiwgTVQyX01MTUVfSk9JTl9SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpSW52YWxpZFN0YXRlV2hlbkpvaW4pOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgU0NBTl9MSVNURU4sIE1UMl9NTE1FX1NUQVJUX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylJbnZhbGlkU3RhdGVXaGVuU3RhcnQpOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgU0NBTl9MSVNURU4sIE1UMl9QRUVSX0JFQUNPTiwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyQmVhY29uQXRTY2FuQWN0aW9uKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIFNDQU5fTElTVEVOLCBNVDJfUEVFUl9QUk9CRV9SU1AsIChTVEFURV9NQUNISU5FX0ZVTkMpUGVlckJlYWNvbkF0U2NhbkFjdGlvbik7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBTQ0FOX0xJU1RFTiwgTVQyX1NDQU5fVElNRU9VVCwgKFNUQVRFX01BQ0hJTkVfRlVOQylTY2FuVGltZW91dEFjdGlvbik7CisKKwkvLyB0aW1lciBpbml0CisJUlRNUEluaXRUaW1lcihwQWQsICZwQWQtPk1sbWVBdXguQmVhY29uVGltZXIsIEdFVF9USU1FUl9GVU5DVElPTihCZWFjb25UaW1lb3V0KSwgcEFkLCBGQUxTRSk7CisJUlRNUEluaXRUaW1lcihwQWQsICZwQWQtPk1sbWVBdXguU2NhblRpbWVyLCBHRVRfVElNRVJfRlVOQ1RJT04oU2NhblRpbWVvdXQpLCBwQWQsIEZBTFNFKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlCZWFjb24gdGltZW91dCBoYW5kbGVyLCBleGVjdXRlZCBpbiB0aW1lciB0aHJlYWQKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBCZWFjb25UaW1lb3V0KAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKKwlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMykKK3sKKwlSVE1QX0FEQVBURVIgKnBBZCA9IChSVE1QX0FEQVBURVIgKilGdW5jdGlvbkNvbnRleHQ7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlNZTkMgLSBCZWFjb25UaW1lb3V0XG4iKSk7CisKKwkvLyBEbyBub3RoaW5nIGlmIHRoZSBkcml2ZXIgaXMgc3RhcnRpbmcgaGFsdCBzdGF0ZS4KKwkvLyBUaGlzIG1pZ2h0IGhhcHBlbiB3aGVuIHRpbWVyIGFscmVhZHkgYmVlbiBmaXJlZCBiZWZvcmUgY2FuY2VsIHRpbWVyIHdpdGggbWxtZWhhbHQKKwlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MpKQorCQlyZXR1cm47CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwlpZiAoKHBBZC0+Q29tbW9uQ2ZnLkJCUEN1cnJlbnRCVyA9PSBCV180MCkKKwkJKQorCXsKKwkJVUNIQVIgICAgICAgIEJCUFZhbHVlID0gMDsKKwkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCwgRkFMU0UpOworCQlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCk7CisJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgJkJCUFZhbHVlKTsKKwkJQkJQVmFsdWUgJj0gKH4weDE4KTsKKwkJQkJQVmFsdWUgfD0gMHgxMDsKKwkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgQkJQVmFsdWUpOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTWU5DIC0gRW5kIG9mIFNDQU4sIHJlc3RvcmUgdG8gNDBNSHogY2hhbm5lbCAlZCwgVG90YWwgQlNTWyUwMmRdXG4iLHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsLCBwQWQtPlNjYW5UYWIuQnNzTnIpKTsKKwl9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwlNbG1lRW5xdWV1ZShwQWQsIFNZTkNfU1RBVEVfTUFDSElORSwgTVQyX0JFQUNPTl9USU1FT1VULCAwLCBOVUxMKTsKKwlSVDI4WFhfTUxNRV9IQU5ETEVSKHBBZCk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJU2NhbiB0aW1lb3V0IGhhbmRsZXIsIGV4ZWN1dGVkIGluIHRpbWVyIHRocmVhZAorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIFNjYW5UaW1lb3V0KAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKKwlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMykKK3sKKwlSVE1QX0FEQVBURVIgKnBBZCA9IChSVE1QX0FEQVBURVIgKilGdW5jdGlvbkNvbnRleHQ7CisKKworCS8vIERvIG5vdGhpbmcgaWYgdGhlIGRyaXZlciBpcyBzdGFydGluZyBoYWx0IHN0YXRlLgorCS8vIFRoaXMgbWlnaHQgaGFwcGVuIHdoZW4gdGltZXIgYWxyZWFkeSBiZWVuIGZpcmVkIGJlZm9yZSBjYW5jZWwgdGltZXIgd2l0aCBtbG1laGFsdAorCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUykpCisJCXJldHVybjsKKworCWlmIChNbG1lRW5xdWV1ZShwQWQsIFNZTkNfU1RBVEVfTUFDSElORSwgTVQyX1NDQU5fVElNRU9VVCwgMCwgTlVMTCkpCisJeworCQlSVDI4WFhfTUxNRV9IQU5ETEVSKHBBZCk7CisJfQorCWVsc2UKKwl7CisJCS8vIFRvIHByZXZlbnQgU3luY01hY2hpbmUuQ3VyclN0YXRlIGlzIFNDQU5fTElTVEVOIGZvcmV2ZXIuCisJCXBBZC0+TWxtZUF1eC5DaGFubmVsID0gMDsKKwkJU2Nhbk5leHRDaGFubmVsKHBBZCk7CisJCWlmIChwQWQtPkNvbW1vbkNmZy5iV2lyZWxlc3NFdmVudCkKKwkJeworCQkJUlRNUFNlbmRXaXJlbGVzc0V2ZW50KHBBZCwgSVdfU0NBTl9FTlFVRVVFX0ZBSUxfRVZFTlRfRkxBRywgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5BZGRyLCBCU1MwLCAwKTsKKwkJfQorCX0KK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlNTE1FIFNDQU4gcmVxIHN0YXRlIG1hY2hpbmUgcHJvY2VkdXJlCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBNbG1lU2NhblJlcUFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisJVUNIQVIgICAgICAgICAgU3NpZFtNQVhfTEVOX09GX1NTSURdLCBTc2lkTGVuLCBTY2FuVHlwZSwgQnNzVHlwZSwgQkJQVmFsdWUgPSAwOworCUJPT0xFQU4gICAgICAgIFRpbWVyQ2FuY2VsbGVkOworCVVMT05HCQkgICBOb3c7CisJVVNIT1JUICAgICAgICAgU3RhdHVzOworCVBIRUFERVJfODAyXzExIHBIZHI4MDIxMTsKKwlQVUNIQVIgICAgICAgICBwT3V0QnVmZmVyID0gTlVMTDsKKwlORElTX1NUQVRVUyAgICBOU3RhdHVzOworCisJLy8gQ2hlY2sgdGhlIHRvdGFsIHNjYW4gdHJpZXMgZm9yIG9uZSBzaW5nbGUgT0lEIGNvbW1hbmQKKwkvLyBJZiB0aGlzIGlzIHRoZSBDQ1ggMi4wIENhc2UsIHNraXAgdGhhdCEKKwlpZiAoICFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfU1RBUlRfVVApKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU1lOQyAtIE1sbWVTY2FuUmVxQWN0aW9uIGJlZm9yZSBTdGFydHVwXG4iKSk7CisJCXJldHVybjsKKwl9CisKKwkvLyBJbmNyZWFzZSB0aGUgc2NhbiByZXRyeSBjb3VudGVycy4KKwlwQWQtPlN0YUNmZy5TY2FuQ250Kys7CisKKyNpZmRlZiBSVDI4NjAKKyAgICBpZiAoKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQURWQU5DRV9QT1dFUl9TQVZFX1BDSUVfREVWSUNFKSkgJiYKKyAgICAgICAgKElETEVfT04ocEFkKSkgJiYKKwkJKHBBZC0+U3RhQ2ZnLmJSYWRpbyA9PSBUUlVFKSAmJgorCQkoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0lETEVfUkFESU9fT0ZGKSkpCisJeworCQlSVDI4eHhQY2lBc2ljUmFkaW9PbihwQWQsIEdVSV9JRExFX1BPV0VSX1NBVkUpOworCX0KKyNlbmRpZiAvLyBSVDI4NjAgLy8KKworCS8vIGZpcnN0IGNoZWNrIHRoZSBwYXJhbWV0ZXIgc2FuaXR5CisJaWYgKE1sbWVTY2FuUmVxU2FuaXR5KHBBZCwKKwkJCQkJCSAgRWxlbS0+TXNnLAorCQkJCQkJICBFbGVtLT5Nc2dMZW4sCisJCQkJCQkgICZCc3NUeXBlLAorCQkJCQkJICBTc2lkLAorCQkJCQkJICAmU3NpZExlbiwKKwkJCQkJCSAgJlNjYW5UeXBlKSkKKwl7CisKKwkJLy8gQ2hlY2sgZm9yIGNoYW5uZWwgbG9hZCBhbmQgbm9pc2UgaGlzdCByZXF1ZXN0CisJCS8vIFN1c3BlbmQgTVNEVSBvbmx5IGF0IHNjYW4gcmVxdWVzdCwgbm90IHRoZSBsYXN0IHR3byBtZW50aW9uZWQKKwkJaWYgKChTY2FuVHlwZSA9PSBTQ0FOX0NJU0NPX05PSVNFKSB8fCAoU2NhblR5cGUgPT0gU0NBTl9DSVNDT19DSEFOTkVMX0xPQUQpKQorCQl7CisJCQlpZiAocEFkLT5TdGFDZmcuQ0NYU2NhbkNoYW5uZWwgIT0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkKKwkJCQlSVE1QU3VzcGVuZE1zZHVUcmFuc21pc3Npb24ocEFkKTsJCQkvLyBTdXNwZW5kIE1TRFUgdHJhbnNtaXNzaW9uIGhlcmUKKwkJfQorCQllbHNlCisJCXsKKwkJCS8vIFN1c3BlbmQgTVNEVSB0cmFuc21pc3Npb24gaGVyZQorCQkJUlRNUFN1c3BlbmRNc2R1VHJhbnNtaXNzaW9uKHBBZCk7CisJCX0KKworCQkvLworCQkvLyBUbyBwcmV2ZW50IGRhdGEgbG9zdC4KKwkJLy8gU2VuZCBhbiBOVUxMIGRhdGEgd2l0aCB0dXJuZWQgUFNNIGJpdCBvbiB0byBjdXJyZW50IGFzc29jaWF0ZWQgQVAgYmVmb3JlIFNDQU4gcHJvZ3Jlc3MuCisJCS8vIEFuZCBzaG91bGQgc2VuZCBhbiBOVUxMIGRhdGEgd2l0aCB0dXJuZWQgUFNNIGJpdCBvZmYgdG8gQVAsIHdoZW4gc2NhbiBwcm9ncmVzcyBkb25lCisJCS8vCisJCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCkgJiYgKElORlJBX09OKHBBZCkpKQorCQl7CisJCQlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgKFBWT0lEKSZwT3V0QnVmZmVyKTsKKwkJCWlmIChOU3RhdHVzCT09IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJCQl7CisJCQkJcEhkcjgwMjExID0gKFBIRUFERVJfODAyXzExKSBwT3V0QnVmZmVyOworCQkJCU1ndE1hY0hlYWRlckluaXQocEFkLCBwSGRyODAyMTEsIFNVQlRZUEVfTlVMTF9GVU5DLCAxLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgcEFkLT5Db21tb25DZmcuQnNzaWQpOworCQkJCXBIZHI4MDIxMS0+RHVyYXRpb24gPSAwOworCQkJCXBIZHI4MDIxMS0+RkMuVHlwZSA9IEJUWVBFX0RBVEE7CisJCQkJcEhkcjgwMjExLT5GQy5Qd3JNZ210ID0gUFdSX1NBVkU7CisKKwkJCQkvLyBTZW5kIHVzaW5nIHByaW9yaXR5IHF1ZXVlCisJCQkJTWluaXBvcnRNTVJlcXVlc3QocEFkLCAwLCBwT3V0QnVmZmVyLCBzaXplb2YoSEVBREVSXzgwMl8xMSkpOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1sbWVTY2FuUmVxQWN0aW9uIC0tIFNlbmQgUFNNIERhdGEgZnJhbWUgZm9yIG9mZiBjaGFubmVsIFJNXG4iKSk7CisJCQkJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKKwkJCQlSVE1QdXNlY0RlbGF5KDUwMDApOworCQkJfQorCQl9CisKKwkJTmRpc0dldFN5c3RlbVVwVGltZSgmTm93KTsKKwkJcEFkLT5TdGFDZmcuTGFzdFNjYW5UaW1lID0gTm93OworCQkvLyByZXNldCBhbGwgdGhlIHRpbWVycworCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5CZWFjb25UaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKKwkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguU2NhblRpbWVyLCAmVGltZXJDYW5jZWxsZWQpOworCisJCS8vIHJlY29yZCBkZXNpcmVkIEJTUyBwYXJhbWV0ZXJzCisJCXBBZC0+TWxtZUF1eC5Cc3NUeXBlID0gQnNzVHlwZTsKKwkJcEFkLT5NbG1lQXV4LlNjYW5UeXBlID0gU2NhblR5cGU7CisJCXBBZC0+TWxtZUF1eC5Tc2lkTGVuID0gU3NpZExlbjsKKyAgICAgICAgTmRpc1plcm9NZW1vcnkocEFkLT5NbG1lQXV4LlNzaWQsIE1BWF9MRU5fT0ZfU1NJRCk7CisJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+TWxtZUF1eC5Tc2lkLCBTc2lkLCBTc2lkTGVuKTsKKworCQkvLyBzdGFydCBmcm9tIHRoZSBmaXJzdCBjaGFubmVsCisJCXBBZC0+TWxtZUF1eC5DaGFubmVsID0gRmlyc3RDaGFubmVsKHBBZCk7CisKKwkJLy8gQ2hhbmdlIHRoZSBzY2FuIGNoYW5uZWwgd2hlbiBkZWFsaW5nIHdpdGggQ0NYIGJlYWNvbiByZXBvcnQKKwkJaWYgKChTY2FuVHlwZSA9PSBTQ0FOX0NJU0NPX1BBU1NJVkUpIHx8IChTY2FuVHlwZSA9PSBTQ0FOX0NJU0NPX0FDVElWRSkgfHwKKwkJCShTY2FuVHlwZSA9PSBTQ0FOX0NJU0NPX0NIQU5ORUxfTE9BRCkgfHwgKFNjYW5UeXBlID09IFNDQU5fQ0lTQ09fTk9JU0UpKQorCQkJcEFkLT5NbG1lQXV4LkNoYW5uZWwgPSBwQWQtPlN0YUNmZy5DQ1hTY2FuQ2hhbm5lbDsKKworCQkvLyBMZXQgQkJQIHJlZ2lzdGVyIGF0IDIwTUh6IHRvIGRvIHNjYW4KKwkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCAmQkJQVmFsdWUpOworCQlCQlBWYWx1ZSAmPSAofjB4MTgpOworCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCBCQlBWYWx1ZSk7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNZTkMgLSBCQlAgUjQgdG8gMjBNSHoubFxuIikpOworCQlTY2FuTmV4dENoYW5uZWwocEFkKTsKKwl9CisJZWxzZQorCXsKKwkJREJHUFJJTlRfRVJSKCgiU1lOQyAtIE1sbWVTY2FuUmVxQWN0aW9uKCkgc2FuaXR5IGNoZWNrIGZhaWxcbiIpKTsKKwkJcEFkLT5NbG1lLlN5bmNNYWNoaW5lLkN1cnJTdGF0ZSA9IFNZTkNfSURMRTsKKwkJU3RhdHVzID0gTUxNRV9JTlZBTElEX0ZPUk1BVDsKKwkJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX1NDQU5fQ09ORiwgMiwgJlN0YXR1cyk7CisJfQorfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCU1MTUUgSk9JTiByZXEgc3RhdGUgbWFjaGluZSBwcm9jZWR1cmUKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIE1sbWVKb2luUmVxQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlVQ0hBUiAgICAgICAgQkJQVmFsdWUgPSAwOworCUJTU19FTlRSWSAgICAqcEJzczsKKwlCT09MRUFOICAgICAgIFRpbWVyQ2FuY2VsbGVkOworCUhFQURFUl84MDJfMTEgSGRyODAyMTE7CisJTkRJU19TVEFUVVMgICBOU3RhdHVzOworCVVMT05HICAgICAgICAgRnJhbWVMZW4gPSAwOworCVBVQ0hBUiAgICAgICAgcE91dEJ1ZmZlciA9IE5VTEw7CisJUFVDSEFSICAgICAgICBwU3VwUmF0ZSA9IE5VTEw7CisJVUNIQVIgICAgICAgICBTdXBSYXRlTGVuOworCVBVQ0hBUiAgICAgICAgcEV4dFJhdGUgPSBOVUxMOworCVVDSEFSICAgICAgICAgRXh0UmF0ZUxlbjsKKwlVQ0hBUiAgICAgICAgIEFTdXBSYXRlW10gPSB7MHg4QywgMHgxMiwgMHg5OCwgMHgyNCwgMHhiMCwgMHg0OCwgMHg2MCwgMHg2Q307CisJVUNIQVIgICAgICAgICBBU3VwUmF0ZUxlbiA9IHNpemVvZihBU3VwUmF0ZSkvc2l6ZW9mKFVDSEFSKTsKKwlNTE1FX0pPSU5fUkVRX1NUUlVDVCAqcEluZm8gPSAoTUxNRV9KT0lOX1JFUV9TVFJVQ1QgKikoRWxlbS0+TXNnKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNZTkMgLSBNbG1lSm9pblJlcUFjdGlvbihCU1MgIyVsZClcbiIsIHBJbmZvLT5Cc3NJZHgpKTsKKworI2lmZGVmIFJUMjg2MAorICAgIGlmICgoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19BRFZBTkNFX1BPV0VSX1NBVkVfUENJRV9ERVZJQ0UpKSAmJgorICAgICAgICAoSURMRV9PTihwQWQpKSAmJgorCQkocEFkLT5TdGFDZmcuYlJhZGlvID09IFRSVUUpICYmCisJCShSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSURMRV9SQURJT19PRkYpKSkKKwl7CisJCVJUMjh4eFBjaUFzaWNSYWRpb09uKHBBZCwgR1VJX0lETEVfUE9XRVJfU0FWRSk7CisJfQorI2VuZGlmIC8vIFJUMjg2MCAvLworCisJLy8gcmVzZXQgYWxsIHRoZSB0aW1lcnMKKwlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5TY2FuVGltZXIsICZUaW1lckNhbmNlbGxlZCk7CisJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguQmVhY29uVGltZXIsICZUaW1lckNhbmNlbGxlZCk7CisKKwlwQnNzID0gJnBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLkJzc0VudHJ5W3BJbmZvLT5Cc3NJZHhdOworCisJLy8gcmVjb3JkIHRoZSBkZXNpcmVkIFNTSUQgJiBCU1NJRCB3ZSdyZSB3YWl0aW5nIGZvcgorCUNPUFlfTUFDX0FERFIocEFkLT5NbG1lQXV4LkJzc2lkLCBwQnNzLT5Cc3NpZCk7CisKKwkvLyBJZiBBUCdzIFNTSUQgaXMgbm90IGhpZGRlbiwgaXQgaXMgT0sgZm9yIHVwZGF0aW5nIHNzaWQgdG8gTWxtZUF1eCBhZ2Fpbi4KKwlpZiAocEJzcy0+SGlkZGVuID09IDApCisJeworCQlOZGlzTW92ZU1lbW9yeShwQWQtPk1sbWVBdXguU3NpZCwgcEJzcy0+U3NpZCwgcEJzcy0+U3NpZExlbik7CisJCXBBZC0+TWxtZUF1eC5Tc2lkTGVuID0gcEJzcy0+U3NpZExlbjsKKwl9CisKKwlwQWQtPk1sbWVBdXguQnNzVHlwZSA9IHBCc3MtPkJzc1R5cGU7CisJcEFkLT5NbG1lQXV4LkNoYW5uZWwgPSBwQnNzLT5DaGFubmVsOworCXBBZC0+TWxtZUF1eC5DZW50cmFsQ2hhbm5lbCA9IHBCc3MtPkNlbnRyYWxDaGFubmVsOworCisjaWZkZWYgRVhUX0JVSUxEX0NIQU5ORUxfTElTVAorCS8vIENvdW50cnkgSUUgb2YgdGhlIEFQIHdpbGwgYmUgZXZhbHVhdGVkIGFuZCB3aWxsIGJlIHVzZWQuCisJaWYgKChwQWQtPlN0YUNmZy5JRUVFODAyMTFkQ2xpZW50TW9kZSAhPSBSdDgwMl8xMV9EX05vbmUpICYmCisJCShwQnNzLT5iSGFzQ291bnRyeUlFID09IFRSVUUpKQorCXsKKwkJTmRpc01vdmVNZW1vcnkoJnBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlDb2RlWzBdLCAmcEJzcy0+Q291bnRyeVN0cmluZ1swXSwgMik7CisJCWlmIChwQnNzLT5Db3VudHJ5U3RyaW5nWzJdID09ICdJJykKKwkJCXBBZC0+Q29tbW9uQ2ZnLkdlb2dyYXBoeSA9IElET1I7CisJCWVsc2UgaWYgKHBCc3MtPkNvdW50cnlTdHJpbmdbMl0gPT0gJ08nKQorCQkJcEFkLT5Db21tb25DZmcuR2VvZ3JhcGh5ID0gT0RPUjsKKwkJZWxzZQorCQkJcEFkLT5Db21tb25DZmcuR2VvZ3JhcGh5ID0gQk9USDsKKwkJQnVpbGRDaGFubmVsTGlzdEV4KHBBZCk7CisJfQorI2VuZGlmIC8vIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QgLy8KKworCS8vIExldCBCQlAgcmVnaXN0ZXIgYXQgMjBNSHogdG8gZG8gc2NhbgorCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgJkJCUFZhbHVlKTsKKwlCQlBWYWx1ZSAmPSAofjB4MTgpOworCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsIEJCUFZhbHVlKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTWU5DIC0gQkJQIFI0IHRvIDIwTUh6LmxcbiIpKTsKKworCS8vIHN3aXRjaCBjaGFubmVsIGFuZCB3YWl0aW5nIGZvciBiZWFjb24gdGltZXIKKwlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBBZC0+TWxtZUF1eC5DaGFubmVsLCBGQUxTRSk7CisJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5NbG1lQXV4LkNoYW5uZWwpOworCVJUTVBTZXRUaW1lcigmcEFkLT5NbG1lQXV4LkJlYWNvblRpbWVyLCBKT0lOX1RJTUVPVVQpOworCisgICAgZG8KKwl7CisJCWlmICgoKHBBZC0+Q29tbW9uQ2ZnLmJJRUVFODAyMTFIID09IDEpICYmCisgICAgICAgICAgICAocEFkLT5NbG1lQXV4LkNoYW5uZWwgPiAxNCkgJiYKKyAgICAgICAgICAgICBSYWRhckNoYW5uZWxDaGVjayhwQWQsIHBBZC0+TWxtZUF1eC5DaGFubmVsKSkKKyNpZmRlZiBDQVJSSUVSX0RFVEVDVElPTl9TVVBQT1JUIC8vIFJvZ2VyIHN5bmMgQ2FycmllcgorICAgICAgICAgICAgIHx8IChwQWQtPkNvbW1vbkNmZy5DYXJyaWVyRGV0ZWN0LkVuYWJsZSA9PSBUUlVFKQorI2VuZGlmIC8vIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQgLy8KKyAgICAgICAgICAgICkKKwkJeworCQkJLy8KKwkJCS8vIFdlIGNhbid0IHNlbmQgYW55IFByb2JlIHJlcXVlc3QgZnJhbWUgdG8gbWVldCA4MDIuMTFoLgorCQkJLy8KKwkJCWlmIChwQnNzLT5IaWRkZW4gPT0gMCkKKwkJCQlicmVhazsKKwkJfQorCisJCS8vCisJCS8vIHNlbmQgcHJvYmUgcmVxdWVzdAorCQkvLworCQlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOworCQlpZiAoTlN0YXR1cyA9PSBORElTX1NUQVRVU19TVUNDRVNTKQorCQl7CisJCQlpZiAocEFkLT5NbG1lQXV4LkNoYW5uZWwgPD0gMTQpCisJCQl7CisJCQkJcFN1cFJhdGUgPSBwQWQtPkNvbW1vbkNmZy5TdXBSYXRlOworCQkJCVN1cFJhdGVMZW4gPSBwQWQtPkNvbW1vbkNmZy5TdXBSYXRlTGVuOworCQkJCXBFeHRSYXRlID0gcEFkLT5Db21tb25DZmcuRXh0UmF0ZTsKKwkJCQlFeHRSYXRlTGVuID0gcEFkLT5Db21tb25DZmcuRXh0UmF0ZUxlbjsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQkvLworCQkJCS8vIE92ZXJ3cml0ZSBTdXBwb3J0IFJhdGUsIENDSyByYXRlIGFyZSBub3QgYWxsb3dlZAorCQkJCS8vCisJCQkJcFN1cFJhdGUgPSBBU3VwUmF0ZTsKKwkJCQlTdXBSYXRlTGVuID0gQVN1cFJhdGVMZW47CisJCQkJRXh0UmF0ZUxlbiA9IDA7CisJCQl9CisKKwkJCWlmIChwQWQtPk1sbWVBdXguQnNzVHlwZSA9PSBCU1NfSU5GUkEpCisJCQkJTWd0TWFjSGVhZGVySW5pdChwQWQsICZIZHI4MDIxMSwgU1VCVFlQRV9QUk9CRV9SRVEsIDAsIHBBZC0+TWxtZUF1eC5Cc3NpZCwgcEFkLT5NbG1lQXV4LkJzc2lkKTsKKwkJCWVsc2UKKwkJCQlNZ3RNYWNIZWFkZXJJbml0KHBBZCwgJkhkcjgwMjExLCBTVUJUWVBFX1BST0JFX1JFUSwgMCwgQlJPQURDQVNUX0FERFIsIEJST0FEQ0FTVF9BRERSKTsKKworCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICAgICAgICAmRnJhbWVMZW4sCisJCQkJCQkJICBzaXplb2YoSEVBREVSXzgwMl8xMSksICAgICZIZHI4MDIxMSwKKwkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgJlNzaWRJZSwKKwkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgJnBBZC0+TWxtZUF1eC5Tc2lkTGVuLAorCQkJCQkJCSAgcEFkLT5NbG1lQXV4LlNzaWRMZW4sCSAgICBwQWQtPk1sbWVBdXguU3NpZCwKKwkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgJlN1cFJhdGVJZSwKKwkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgJlN1cFJhdGVMZW4sCisJCQkJCQkJICBTdXBSYXRlTGVuLCAgICAgICAgICAgICAgIHBTdXBSYXRlLAorCQkJCQkJCSAgRU5EX09GX0FSR1MpOworCisJCQlpZiAoRXh0UmF0ZUxlbikKKwkJCXsKKwkJCQlVTE9ORyBUbXA7CisJCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAgICAgICAgICAgICZUbXAsCisJCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZFeHRSYXRlSWUsCisJCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZFeHRSYXRlTGVuLAorCQkJCQkJCQkgIEV4dFJhdGVMZW4sICAgICAgICAgICAgICAgICAgICAgICBwRXh0UmF0ZSwKKwkJCQkJCQkJICBFTkRfT0ZfQVJHUyk7CisJCQkJRnJhbWVMZW4gKz0gVG1wOworCQkJfQorCisKKwkJCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgMCwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOworCQkJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKKwkJfQorICAgIH0gd2hpbGUgKEZBTFNFKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNZTkMgLSBTd2l0Y2ggdG8gY2ggJWQsIFdhaXQgQkVBQ09OIGZyb20gJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisJCXBCc3MtPkNoYW5uZWwsIHBCc3MtPkJzc2lkWzBdLCBwQnNzLT5Cc3NpZFsxXSwgcEJzcy0+QnNzaWRbMl0sIHBCc3MtPkJzc2lkWzNdLCBwQnNzLT5Cc3NpZFs0XSwgcEJzcy0+QnNzaWRbNV0pKTsKKworCXBBZC0+TWxtZS5TeW5jTWFjaGluZS5DdXJyU3RhdGUgPSBKT0lOX1dBSVRfQkVBQ09OOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCU1MTUUgU1RBUlQgUmVxdWVzdCBzdGF0ZSBtYWNoaW5lIHByb2NlZHVyZSwgc3RhcnRpbmcgYW4gSUJTUworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgTWxtZVN0YXJ0UmVxQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlVQ0hBUiAgICAgICAgIFNzaWRbTUFYX0xFTl9PRl9TU0lEXSwgU3NpZExlbjsKKwlCT09MRUFOICAgICAgIFRpbWVyQ2FuY2VsbGVkOworCisJLy8gTmV3IGZvciBXUEEgc2VjdXJpdHkgc3VpdGVzCisJVUNIQVIJCQkJCQlWYXJJRVtNQVhfVklFX0xFTl07IAkvLyBUb3RhbCBWSUUgbGVuZ3RoID0gTUFYX1ZJRV9MRU4gLSAtNQorCU5ESVNfODAyXzExX1ZBUklBQkxFX0lFcwkqcFZJRSA9IE5VTEw7CisJTEFSR0VfSU5URUdFUgkJCQlUaW1lU3RhbXA7CisJQk9PTEVBTiBQcml2YWN5OworCVVTSE9SVCBTdGF0dXM7CisKKwkvLyBJbml0IFZhcmlhYmxlIElFIHN0cnVjdHVyZQorCXBWSUUgPSAoUE5ESVNfODAyXzExX1ZBUklBQkxFX0lFcykgVmFySUU7CisJcFZJRS0+TGVuZ3RoID0gMDsKKwlUaW1lU3RhbXAudS5Mb3dQYXJ0ICA9IDA7CisJVGltZVN0YW1wLnUuSGlnaFBhcnQgPSAwOworCisJaWYgKE1sbWVTdGFydFJlcVNhbml0eShwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuLCBTc2lkLCAmU3NpZExlbikpCisJeworCQkvLyByZXNldCBhbGwgdGhlIHRpbWVycworCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5TY2FuVGltZXIsICZUaW1lckNhbmNlbGxlZCk7CisJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LkJlYWNvblRpbWVyLCAmVGltZXJDYW5jZWxsZWQpOworCisJCS8vCisJCS8vIFN0YXJ0IGEgbmV3IElCU1MuIEFsbCBJQlNTIHBhcmFtZXRlcnMgYXJlIGRlY2lkZWQgbm93Li4uLgorCQkvLworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNbG1lU3RhcnRSZXFBY3Rpb24gLSBTdGFydCBhIG5ldyBJQlNTLiBBbGwgSUJTUyBwYXJhbWV0ZXJzIGFyZSBkZWNpZGVkIG5vdy4uLi4gXG4iKSk7CisJCXBBZC0+TWxtZUF1eC5Cc3NUeXBlICAgICAgICAgICA9IEJTU19BREhPQzsKKwkJTmRpc01vdmVNZW1vcnkocEFkLT5NbG1lQXV4LlNzaWQsIFNzaWQsIFNzaWRMZW4pOworCQlwQWQtPk1sbWVBdXguU3NpZExlbiAgICAgICAgICAgPSBTc2lkTGVuOworCisJCS8vIGdlbmVyYXRlIGEgcmFkb20gbnVtYmVyIGFzIEJTU0lECisJCU1hY0FkZHJSYW5kb21Cc3NpZChwQWQsIHBBZC0+TWxtZUF1eC5Cc3NpZCk7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1sbWVTdGFydFJlcUFjdGlvbiAtIGdlbmVyYXRlIGEgcmFkb20gbnVtYmVyIGFzIEJTU0lEIFxuIikpOworCisJCVByaXZhY3kgPSAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMUVuYWJsZWQpIHx8CisJCQkJICAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpIHx8CisJCQkJICAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpOworCQlwQWQtPk1sbWVBdXguQ2FwYWJpbGl0eUluZm8gICAgPSBDQVBfR0VORVJBVEUoMCwxLFByaXZhY3ksIChwQWQtPkNvbW1vbkNmZy5UeFByZWFtYmxlID09IFJ0ODAyXzExUHJlYW1ibGVTaG9ydCksIDEsIDApOworCQlwQWQtPk1sbWVBdXguQmVhY29uUGVyaW9kICAgICAgPSBwQWQtPkNvbW1vbkNmZy5CZWFjb25QZXJpb2Q7CisJCXBBZC0+TWxtZUF1eC5BdGltV2luICAgICAgICAgICA9IHBBZC0+U3RhQ2ZnLkF0aW1XaW47CisJCXBBZC0+TWxtZUF1eC5DaGFubmVsICAgICAgICAgICA9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWw7CisKKwkJcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgID0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbDsKKwkJcEFkLT5NbG1lQXV4LkNlbnRyYWxDaGFubmVsICAgID0gcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWw7CisKKwkJcEFkLT5NbG1lQXV4LlN1cFJhdGVMZW49IHBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVMZW47CisJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+TWxtZUF1eC5TdXBSYXRlLCBwQWQtPkNvbW1vbkNmZy5TdXBSYXRlLCBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUyk7CisJCVJUTVBDaGVja1JhdGVzKHBBZCwgcEFkLT5NbG1lQXV4LlN1cFJhdGUsICZwQWQtPk1sbWVBdXguU3VwUmF0ZUxlbik7CisJCXBBZC0+TWxtZUF1eC5FeHRSYXRlTGVuID0gcEFkLT5Db21tb25DZmcuRXh0UmF0ZUxlbjsKKwkJTmRpc01vdmVNZW1vcnkocEFkLT5NbG1lQXV4LkV4dFJhdGUsIHBBZC0+Q29tbW9uQ2ZnLkV4dFJhdGUsIE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTKTsKKwkJUlRNUENoZWNrUmF0ZXMocEFkLCBwQWQtPk1sbWVBdXguRXh0UmF0ZSwgJnBBZC0+TWxtZUF1eC5FeHRSYXRlTGVuKTsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCkKKwkJeworCQkJUlRNUFVwZGF0ZUhUSUUoJnBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeSwgJnBBZC0+U3RhQ2ZnLkRlc2lyZWRIdFBoeUluZm8uTUNTU2V0WzBdLCAmcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eSwgJnBBZC0+TWxtZUF1eC5BZGRIdEluZm8pOworCQkJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eUxlbiA9IHNpemVvZihIVF9DQVBBQklMSVRZX0lFKTsKKwkJCS8vIE5vdCB0dXJuIHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZEh0UGh5LmJIdEVuYWJsZSA9IFRSVUUgaGVyZS4KKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNZTkMgLXBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZEh0UGh5LmJIdEVuYWJsZSA9IFRSVUVcbiIpKTsKKwkJfQorCQllbHNlCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCXsKKwkJCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHlMZW4gPSAwOworCQkJcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5iSHRFbmFibGUgPSBGQUxTRTsKKwkJfQorCQkvLyB0ZW1wb3JhcmlseSBub3Qgc3VwcG9ydCBRT1MgaW4gSUJTUworCQlOZGlzWmVyb01lbW9yeSgmcEFkLT5NbG1lQXV4LkFQRWRjYVBhcm0sIHNpemVvZihFRENBX1BBUk0pKTsKKwkJTmRpc1plcm9NZW1vcnkoJnBBZC0+TWxtZUF1eC5BUFFic3NMb2FkLCBzaXplb2YoUUJTU19MT0FEX1BBUk0pKTsKKwkJTmRpc1plcm9NZW1vcnkoJnBBZC0+TWxtZUF1eC5BUFFvc0NhcGFiaWxpdHksIHNpemVvZihRT1NfQ0FQQUJJTElUWV9QQVJNKSk7CisKKwkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPk1sbWVBdXguQ2hhbm5lbCwgRkFMU0UpOworCQlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPk1sbWVBdXguQ2hhbm5lbCk7CisKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU1lOQyAtIE1sbWVTdGFydFJlcUFjdGlvbihjaD0gJWQsc3VwIHJhdGVzPSAlZCwgZXh0IHJhdGVzPSVkKVxuIiwKKwkJCXBBZC0+TWxtZUF1eC5DaGFubmVsLCBwQWQtPk1sbWVBdXguU3VwUmF0ZUxlbiwgcEFkLT5NbG1lQXV4LkV4dFJhdGVMZW4pKTsKKworCQlwQWQtPk1sbWUuU3luY01hY2hpbmUuQ3VyclN0YXRlID0gU1lOQ19JRExFOworCQlTdGF0dXMgPSBNTE1FX1NVQ0NFU1M7CisJCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9TVEFSVF9DT05GLCAyLCAmU3RhdHVzKTsKKwl9CisJZWxzZQorCXsKKwkJREJHUFJJTlRfRVJSKCgiU1lOQyAtIE1sbWVTdGFydFJlcUFjdGlvbigpIHNhbml0eSBjaGVjayBmYWlsLlxuIikpOworCQlwQWQtPk1sbWUuU3luY01hY2hpbmUuQ3VyclN0YXRlID0gU1lOQ19JRExFOworCQlTdGF0dXMgPSBNTE1FX0lOVkFMSURfRk9STUFUOworCQlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfU1RBUlRfQ09ORiwgMiwgJlN0YXR1cyk7CisJfQorfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCXBlZXIgc2VuZHMgYmVhY29uIGJhY2sgd2hlbiBzY2FubmluZworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgUGVlckJlYWNvbkF0U2NhbkFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisJVUNIQVIgICAgICAgICAgIEJzc2lkW01BQ19BRERSX0xFTl0sIEFkZHIyW01BQ19BRERSX0xFTl07CisJVUNIQVIgICAgICAgICAgIFNzaWRbTUFYX0xFTl9PRl9TU0lEXSwgQnNzVHlwZSwgQ2hhbm5lbCwgTmV3Q2hhbm5lbCwKKwkJCQkJU3NpZExlbiwgRHRpbUNvdW50LCBEdGltUGVyaW9kLCBCY2FzdEZsYWcsIE1lc3NhZ2VUb01lOworCUNGX1BBUk0gICAgICAgICBDZlBhcm07CisJVVNIT1JUICAgICAgICAgIEJlYWNvblBlcmlvZCwgQXRpbVdpbiwgQ2FwYWJpbGl0eUluZm87CisJUEZSQU1FXzgwMl8xMSAgIHBGcmFtZTsKKwlMQVJHRV9JTlRFR0VSICAgVGltZVN0YW1wOworCVVDSEFSICAgICAgICAgICBFcnA7CisJVUNIQVIgICAgICAgICAJU3VwUmF0ZVtNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFU10sIEV4dFJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdOworCVVDSEFSCQkgIAlTdXBSYXRlTGVuLCBFeHRSYXRlTGVuOworCVVTSE9SVCAJCQlMZW5WSUU7CisJVUNIQVIJCQlDa2lwRmxhZzsKKwlVQ0hBUgkJCUFpcm9uZXRDZWxsUG93ZXJMaW1pdDsKKwlFRENBX1BBUk0gICAgICAgRWRjYVBhcm07CisJUUJTU19MT0FEX1BBUk0gIFFic3NMb2FkOworCVFPU19DQVBBQklMSVRZX1BBUk0gUW9zQ2FwYWJpbGl0eTsKKwlVTE9ORwkJCQkJCVJhbGlua0llOworCVVDSEFSCQkJCQkJVmFySUVbTUFYX1ZJRV9MRU5dOwkJLy8gVG90YWwgVklFIGxlbmd0aCA9IE1BWF9WSUVfTEVOIC0gLTUKKwlORElTXzgwMl8xMV9WQVJJQUJMRV9JRXMJKnBWSUUgPSBOVUxMOworCUhUX0NBUEFCSUxJVFlfSUUJCUh0Q2FwYWJpbGl0eTsKKwlBRERfSFRfSU5GT19JRQkJQWRkSHRJbmZvOwkvLyBBUCBtaWdodCB1c2UgdGhpcyBhZGRpdGlvbmFsIGh0IGluZm8gSUUKKwlVQ0hBUgkJCUh0Q2FwYWJpbGl0eUxlbiA9IDAsIFByZU5IdENhcGFiaWxpdHlMZW4gPSAwOworCVVDSEFSCQkJQWRkSHRJbmZvTGVuOworCVVDSEFSCQkJTmV3RXh0Q2hhbm5lbE9mZnNldCA9IDB4ZmY7CisKKwlwRnJhbWUgPSAoUEZSQU1FXzgwMl8xMSkgRWxlbS0+TXNnOworCS8vIEluaXQgVmFyaWFibGUgSUUgc3RydWN0dXJlCisJcFZJRSA9IChQTkRJU184MDJfMTFfVkFSSUFCTEVfSUVzKSBWYXJJRTsKKwlwVklFLT5MZW5ndGggPSAwOworI2lmZGVmIERPVDExX05fU1VQUE9SVAorICAgIFJUTVBaZXJvTWVtb3J5KCZIdENhcGFiaWxpdHksIHNpemVvZihIdENhcGFiaWxpdHkpKTsKKwlSVE1QWmVyb01lbW9yeSgmQWRkSHRJbmZvLCBzaXplb2YoQUREX0hUX0lORk9fSUUpKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCWlmIChQZWVyQmVhY29uQW5kUHJvYmVSc3BTYW5pdHkocEFkLAorCQkJCQkJCQlFbGVtLT5Nc2csCisJCQkJCQkJCUVsZW0tPk1zZ0xlbiwKKwkJCQkJCQkJRWxlbS0+Q2hhbm5lbCwKKwkJCQkJCQkJQWRkcjIsCisJCQkJCQkJCUJzc2lkLAorCQkJCQkJCQlTc2lkLAorCQkJCQkJCQkmU3NpZExlbiwKKwkJCQkJCQkJJkJzc1R5cGUsCisJCQkJCQkJCSZCZWFjb25QZXJpb2QsCisJCQkJCQkJCSZDaGFubmVsLAorCQkJCQkJCQkmTmV3Q2hhbm5lbCwKKwkJCQkJCQkJJlRpbWVTdGFtcCwKKwkJCQkJCQkJJkNmUGFybSwKKwkJCQkJCQkJJkF0aW1XaW4sCisJCQkJCQkJCSZDYXBhYmlsaXR5SW5mbywKKwkJCQkJCQkJJkVycCwKKwkJCQkJCQkJJkR0aW1Db3VudCwKKwkJCQkJCQkJJkR0aW1QZXJpb2QsCisJCQkJCQkJCSZCY2FzdEZsYWcsCisJCQkJCQkJCSZNZXNzYWdlVG9NZSwKKwkJCQkJCQkJU3VwUmF0ZSwKKwkJCQkJCQkJJlN1cFJhdGVMZW4sCisJCQkJCQkJCUV4dFJhdGUsCisJCQkJCQkJCSZFeHRSYXRlTGVuLAorCQkJCQkJCQkmQ2tpcEZsYWcsCisJCQkJCQkJCSZBaXJvbmV0Q2VsbFBvd2VyTGltaXQsCisJCQkJCQkJCSZFZGNhUGFybSwKKwkJCQkJCQkJJlFic3NMb2FkLAorCQkJCQkJCQkmUW9zQ2FwYWJpbGl0eSwKKwkJCQkJCQkJJlJhbGlua0llLAorCQkJCQkJCQkmSHRDYXBhYmlsaXR5TGVuLAorCQkJCQkJCQkmUHJlTkh0Q2FwYWJpbGl0eUxlbiwKKwkJCQkJCQkJJkh0Q2FwYWJpbGl0eSwKKwkJCQkJCQkJJkFkZEh0SW5mb0xlbiwKKwkJCQkJCQkJJkFkZEh0SW5mbywKKwkJCQkJCQkJJk5ld0V4dENoYW5uZWxPZmZzZXQsCisJCQkJCQkJCSZMZW5WSUUsCisJCQkJCQkJCXBWSUUpKQorCXsKKwkJVUxPTkcgSWR4OworCQlDSEFSIFJzc2kgPSAwOworCisJCUlkeCA9IEJzc1RhYmxlU2VhcmNoKCZwQWQtPlNjYW5UYWIsIEJzc2lkLCBDaGFubmVsKTsKKwkJaWYgKElkeCAhPSBCU1NfTk9UX0ZPVU5EKQorCQkJUnNzaSA9IHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtJZHhdLlJzc2k7CisKKwkJUnNzaSA9IFJUTVBNYXhSc3NpKHBBZCwgQ29udmVydFRvUnNzaShwQWQsIEVsZW0tPlJzc2kwLCBSU1NJXzApLCBDb252ZXJ0VG9Sc3NpKHBBZCwgRWxlbS0+UnNzaTEsIFJTU0lfMSksIENvbnZlcnRUb1Jzc2kocEFkLCBFbGVtLT5Sc3NpMiwgUlNTSV8yKSk7CisKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQlpZiAoKEh0Q2FwYWJpbGl0eUxlbiA+IDApIHx8IChQcmVOSHRDYXBhYmlsaXR5TGVuID4gMCkpCisJCQlIdENhcGFiaWxpdHlMZW4gPSBTSVpFX0hUX0NBUF9JRTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJaWYgKChwQWQtPlN0YUNmZy5DQ1hSZXFUeXBlICE9IE1TUk5fVFlQRV9VTlVTRUQpICYmIChDaGFubmVsID09IHBBZC0+U3RhQ2ZnLkNDWFNjYW5DaGFubmVsKSkKKwkJeworCQkJSWR4ID0gQnNzVGFibGVTZXRFbnRyeShwQWQsICZwQWQtPlN0YUNmZy5DQ1hCc3NUYWIsIEJzc2lkLCBTc2lkLCBTc2lkTGVuLCBCc3NUeXBlLCBCZWFjb25QZXJpb2QsCisJCQkJCQkgJkNmUGFybSwgQXRpbVdpbiwgQ2FwYWJpbGl0eUluZm8sIFN1cFJhdGUsIFN1cFJhdGVMZW4sRXh0UmF0ZSwgRXh0UmF0ZUxlbiwgJkh0Q2FwYWJpbGl0eSwKKwkJCQkJCSAmQWRkSHRJbmZvLCBIdENhcGFiaWxpdHlMZW4sIEFkZEh0SW5mb0xlbiwgTmV3RXh0Q2hhbm5lbE9mZnNldCwgQ2hhbm5lbCwgUnNzaSwgVGltZVN0YW1wLCBDa2lwRmxhZywKKwkJCQkJCSAmRWRjYVBhcm0sICZRb3NDYXBhYmlsaXR5LCAmUWJzc0xvYWQsIExlblZJRSwgcFZJRSk7CisJCQlpZiAoSWR4ICE9IEJTU19OT1RfRk9VTkQpCisJCQl7CisJCQkJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuQ0NYQnNzVGFiLkJzc0VudHJ5W0lkeF0uUFRTRiwgJkVsZW0tPk1zZ1syNF0sIDQpOworCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPlN0YUNmZy5DQ1hCc3NUYWIuQnNzRW50cnlbSWR4XS5UVFNGWzBdLCAmRWxlbS0+VGltZVN0YW1wLnUuTG93UGFydCwgNCk7CisJCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+U3RhQ2ZnLkNDWEJzc1RhYi5Cc3NFbnRyeVtJZHhdLlRUU0ZbNF0sICZFbGVtLT5UaW1lU3RhbXAudS5Mb3dQYXJ0LCA0KTsKKwkJCQlpZiAocEFkLT5TdGFDZmcuQ0NYUmVxVHlwZSA9PSBNU1JOX1RZUEVfQkVBQ09OX1JFUSkKKwkJCQkJQWlyb25ldEFkZEJlYWNvblJlcG9ydChwQWQsIElkeCwgRWxlbSk7CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQlJZHggPSBCc3NUYWJsZVNldEVudHJ5KHBBZCwgJnBBZC0+U2NhblRhYiwgQnNzaWQsIFNzaWQsIFNzaWRMZW4sIEJzc1R5cGUsIEJlYWNvblBlcmlvZCwKKwkJCQkJCSAgJkNmUGFybSwgQXRpbVdpbiwgQ2FwYWJpbGl0eUluZm8sIFN1cFJhdGUsIFN1cFJhdGVMZW4sIEV4dFJhdGUsIEV4dFJhdGVMZW4sICAmSHRDYXBhYmlsaXR5LAorCQkJCQkJICZBZGRIdEluZm8sIEh0Q2FwYWJpbGl0eUxlbiwgQWRkSHRJbmZvTGVuLCBOZXdFeHRDaGFubmVsT2Zmc2V0LCBDaGFubmVsLCBSc3NpLCBUaW1lU3RhbXAsIENraXBGbGFnLAorCQkJCQkJICZFZGNhUGFybSwgJlFvc0NhcGFiaWxpdHksICZRYnNzTG9hZCwgTGVuVklFLCBwVklFKTsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKyNpZmRlZiBET1QxMU5fRFJBRlQzCisJCQlpZiAocEFkLT5DaGFubmVsTGlzdFtwQWQtPkNvbW1vbkNmZy5DaGFubmVsTGlzdElkeF0uYkVmZmVjdGVkQ2hhbm5lbCA9PSBUUlVFKQorCQkJeworCQkJCVVDSEFSCQlSZWdDbGFzczsKKwkJCQlQZWVyQmVhY29uQW5kUHJvYmVSc3BTYW5pdHkyKHBBZCwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4sICZSZWdDbGFzcyk7CisJCQkJVHJpRXZlbnRUYWJsZVNldEVudHJ5KHBBZCwgJnBBZC0+Q29tbW9uQ2ZnLlRyaWdnZXJFdmVudFRhYiwgQnNzaWQsICZIdENhcGFiaWxpdHksIEh0Q2FwYWJpbGl0eUxlbiwgUmVnQ2xhc3MsIENoYW5uZWwpOworCQkJfQorI2VuZGlmIC8vIERPVDExTl9EUkFGVDMgLy8KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJCWlmIChJZHggIT0gQlNTX05PVF9GT1VORCkKKwkJCXsKKwkJCQlOZGlzTW92ZU1lbW9yeShwQWQtPlNjYW5UYWIuQnNzRW50cnlbSWR4XS5QVFNGLCAmRWxlbS0+TXNnWzI0XSwgNCk7CisJCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+U2NhblRhYi5Cc3NFbnRyeVtJZHhdLlRUU0ZbMF0sICZFbGVtLT5UaW1lU3RhbXAudS5Mb3dQYXJ0LCA0KTsKKwkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0lkeF0uVFRTRls0XSwgJkVsZW0tPlRpbWVTdGFtcC51Lkxvd1BhcnQsIDQpOworCQkJfQorCQl9CisJfQorCS8vIHNhbml0eSBjaGVjayBmYWlsLCBpZ25vcmVkCit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJV2hlbiB3YWl0aW5nIGpvaW5pbmcgdGhlIChJKUJTUywgYmVhY29uIHJlY2VpdmVkIGZyb20gZXh0ZXJuYWwKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIFBlZXJCZWFjb25BdEpvaW5BY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCVVDSEFSICAgICAgICAgQnNzaWRbTUFDX0FERFJfTEVOXSwgQWRkcjJbTUFDX0FERFJfTEVOXTsKKwlVQ0hBUiAgICAgICAgIFNzaWRbTUFYX0xFTl9PRl9TU0lEXSwgU3NpZExlbiwgQnNzVHlwZSwgQ2hhbm5lbCwgTWVzc2FnZVRvTWUsCisJCQkJICBEdGltQ291bnQsIER0aW1QZXJpb2QsIEJjYXN0RmxhZywgTmV3Q2hhbm5lbDsKKwlMQVJHRV9JTlRFR0VSIFRpbWVTdGFtcDsKKwlVU0hPUlQgICAgICAgIEJlYWNvblBlcmlvZCwgQXRpbVdpbiwgQ2FwYWJpbGl0eUluZm87CisJQ0ZfUEFSTSAgICAgICBDZjsKKwlCT09MRUFOICAgICAgIFRpbWVyQ2FuY2VsbGVkOworCVVDSEFSICAgICAgICAgRXJwOworCVVDSEFSICAgICAgICAgU3VwUmF0ZVtNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFU10sIEV4dFJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdOworCVVDSEFSCQkgIFN1cFJhdGVMZW4sIEV4dFJhdGVMZW47CisJVUNIQVIgICAgICAgICBDa2lwRmxhZzsKKwlVU0hPUlQgCQkgIExlblZJRTsKKwlVQ0hBUgkJICBBaXJvbmV0Q2VsbFBvd2VyTGltaXQ7CisJRURDQV9QQVJNICAgICAgIEVkY2FQYXJtOworCVFCU1NfTE9BRF9QQVJNICBRYnNzTG9hZDsKKwlRT1NfQ0FQQUJJTElUWV9QQVJNIFFvc0NhcGFiaWxpdHk7CisJVVNIT1JUICAgICAgICBTdGF0dXM7CisJVUNIQVIJCQkJCQlWYXJJRVtNQVhfVklFX0xFTl07CQkvLyBUb3RhbCBWSUUgbGVuZ3RoID0gTUFYX1ZJRV9MRU4gLSAtNQorCU5ESVNfODAyXzExX1ZBUklBQkxFX0lFcwkqcFZJRSA9IE5VTEw7CisJVUxPTkcgICAgICAgICAgIFJhbGlua0llOworCVVMT05HICAgICAgICAgSWR4OworCUhUX0NBUEFCSUxJVFlfSUUJCUh0Q2FwYWJpbGl0eTsKKwlBRERfSFRfSU5GT19JRQkJQWRkSHRJbmZvOwkvLyBBUCBtaWdodCB1c2UgdGhpcyBhZGRpdGlvbmFsIGh0IGluZm8gSUUKKwlVQ0hBUgkJCQlIdENhcGFiaWxpdHlMZW4gPSAwLCBQcmVOSHRDYXBhYmlsaXR5TGVuID0gMDsKKwlVQ0hBUgkJCUFkZEh0SW5mb0xlbjsKKwlVQ0hBUgkJCU5ld0V4dENoYW5uZWxPZmZzZXQgPSAweGZmOworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCVVDSEFSCQkJQ2VudHJhbENoYW5uZWw7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwkvLyBJbml0IFZhcmlhYmxlIElFIHN0cnVjdHVyZQorCXBWSUUgPSAoUE5ESVNfODAyXzExX1ZBUklBQkxFX0lFcykgVmFySUU7CisJcFZJRS0+TGVuZ3RoID0gMDsKKyAgICBSVE1QWmVyb01lbW9yeSgmSHRDYXBhYmlsaXR5LCBzaXplb2YoSHRDYXBhYmlsaXR5KSk7CisJUlRNUFplcm9NZW1vcnkoJkFkZEh0SW5mbywgc2l6ZW9mKEFERF9IVF9JTkZPX0lFKSk7CisKKworCWlmIChQZWVyQmVhY29uQW5kUHJvYmVSc3BTYW5pdHkocEFkLAorCQkJCQkJCQlFbGVtLT5Nc2csCisJCQkJCQkJCUVsZW0tPk1zZ0xlbiwKKwkJCQkJCQkJRWxlbS0+Q2hhbm5lbCwKKwkJCQkJCQkJQWRkcjIsCisJCQkJCQkJCUJzc2lkLAorCQkJCQkJCQlTc2lkLAorCQkJCQkJCQkmU3NpZExlbiwKKwkJCQkJCQkJJkJzc1R5cGUsCisJCQkJCQkJCSZCZWFjb25QZXJpb2QsCisJCQkJCQkJCSZDaGFubmVsLAorCQkJCQkJCQkmTmV3Q2hhbm5lbCwKKwkJCQkJCQkJJlRpbWVTdGFtcCwKKwkJCQkJCQkJJkNmLAorCQkJCQkJCQkmQXRpbVdpbiwKKwkJCQkJCQkJJkNhcGFiaWxpdHlJbmZvLAorCQkJCQkJCQkmRXJwLAorCQkJCQkJCQkmRHRpbUNvdW50LAorCQkJCQkJCQkmRHRpbVBlcmlvZCwKKwkJCQkJCQkJJkJjYXN0RmxhZywKKwkJCQkJCQkJJk1lc3NhZ2VUb01lLAorCQkJCQkJCQlTdXBSYXRlLAorCQkJCQkJCQkmU3VwUmF0ZUxlbiwKKwkJCQkJCQkJRXh0UmF0ZSwKKwkJCQkJCQkJJkV4dFJhdGVMZW4sCisJCQkJCQkJCSZDa2lwRmxhZywKKwkJCQkJCQkJJkFpcm9uZXRDZWxsUG93ZXJMaW1pdCwKKwkJCQkJCQkJJkVkY2FQYXJtLAorCQkJCQkJCQkmUWJzc0xvYWQsCisJCQkJCQkJCSZRb3NDYXBhYmlsaXR5LAorCQkJCQkJCQkmUmFsaW5rSWUsCisJCQkJCQkJCSZIdENhcGFiaWxpdHlMZW4sCisJCQkJCQkJCSZQcmVOSHRDYXBhYmlsaXR5TGVuLAorCQkJCQkJCQkmSHRDYXBhYmlsaXR5LAorCQkJCQkJCQkmQWRkSHRJbmZvTGVuLAorCQkJCQkJCQkmQWRkSHRJbmZvLAorCQkJCQkJCQkmTmV3RXh0Q2hhbm5lbE9mZnNldCwKKwkJCQkJCQkJJkxlblZJRSwKKwkJCQkJCQkJcFZJRSkpCisJeworCQkvLyBEaXNxdWFsaWZ5IDExYiBvbmx5IGFkaG9jIHdoZW4gd2UgYXJlIGluIDExZyBvbmx5IGFkaG9jIG1vZGUKKwkJaWYgKChCc3NUeXBlID09IEJTU19BREhPQykgJiYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExRykgJiYgKChTdXBSYXRlTGVuK0V4dFJhdGVMZW4pPCAxMikpCisJCQlyZXR1cm47CisKKwkJLy8gQkVBQ09OIGZyb20gZGVzaXJlZCBCU1MvSUJTUyBmb3VuZC4gV2Ugc2hvdWxkIGJlIGFibGUgdG8gZGVjaWRlIG1vc3QKKwkJLy8gQlNTIHBhcmFtZXRlcnMgaGVyZS4KKwkJLy8gUS4gQnV0IHdoYXQgaGFwcGVuIGlmIHRoaXMgSk9JTiBkb2Vzbid0IGNvbmNsdWRlIGEgc3VjY2Vzc2Z1bCBBU1NPQ0lBVEVJT04/CisJCS8vICAgIERvIHdlIG5lZWQgdG8gcmVjZW92ZXIgYmFjayBhbGwgcGFyYW1ldGVycyBiZWxvbmdpbmcgdG8gcHJldmlvdXMgQlNTPworCQkvLyBBLiBTaG91bGQgYmUgbm90LiBUaGVyZSdzIG5vIGJhY2stZG9vciByZWNvdmVyIHRvIHByZXZpb3VzIEFQLiBJdCBzdGlsbCBuZWVkCisJCS8vICAgIGEgbmV3IEpPSU4tQVVUSC1BU1NPQyBzZXF1ZW5jZS4KKwkJaWYgKE1BQ19BRERSX0VRVUFMKHBBZC0+TWxtZUF1eC5Cc3NpZCwgQnNzaWQpKQorCQl7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTWU5DIC0gcmVjZWl2ZSBkZXNpcmVkIEJFQUNPTiBhdCBKb2luV2FpdEJlYWNvbi4uLiBDaGFubmVsID0gJWRcbiIsIENoYW5uZWwpKTsKKwkJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LkJlYWNvblRpbWVyLCAmVGltZXJDYW5jZWxsZWQpOworCisJCQkvLyBVcGRhdGUgUlNTSSB0byBwcmV2ZW50IE5vIHNpZ25hbCBkaXNwbGF5IHdoZW4gY2FyZHMgZmlyc3QgaW5pdGlhbGl6ZWQKKwkJCXBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kwCT0gQ29udmVydFRvUnNzaShwQWQsIEVsZW0tPlJzc2kwLCBSU1NJXzApOworCQkJcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTEJPSBDb252ZXJ0VG9Sc3NpKHBBZCwgRWxlbS0+UnNzaTEsIFJTU0lfMSk7CisJCQlwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMgk9IENvbnZlcnRUb1Jzc2kocEFkLCBFbGVtLT5Sc3NpMiwgUlNTSV8yKTsKKwkJCXBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTAJPSBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMDsKKwkJCXBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTBYOAk9IHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTAgPDwgMzsKKwkJCXBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTEJPSBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMTsKKwkJCXBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTFYOAk9IHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTEgPDwgMzsKKwkJCXBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTIJPSBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMjsKKwkJCXBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTJYOAk9IHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTIgPDwgMzsKKworCQkJLy8KKwkJCS8vIFdlIG5lZWQgdG8gY2hlY2sgaWYgU1NJRCBvbmx5IHNldCB0byBhbnksIHRoZW4gd2UgY2FuIHJlY29yZCB0aGUgY3VycmVudCBTU0lELgorCQkJLy8gT3RoZXJ3aXNlIHdpbGwgY2F1c2UgaGlkZGVuIFNTSUQgYXNzb2NpYXRpb24gZmFpbGVkLgorCQkJLy8KKwkJCWlmIChwQWQtPk1sbWVBdXguU3NpZExlbiA9PSAwKQorCQkJeworCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+TWxtZUF1eC5Tc2lkLCBTc2lkLCBTc2lkTGVuKTsKKwkJCQlwQWQtPk1sbWVBdXguU3NpZExlbiA9IFNzaWRMZW47CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJSWR4ID0gQnNzU3NpZFRhYmxlU2VhcmNoKCZwQWQtPlNjYW5UYWIsIEJzc2lkLCBwQWQtPk1sbWVBdXguU3NpZCwgcEFkLT5NbG1lQXV4LlNzaWRMZW4sIENoYW5uZWwpOworCisJCQkJaWYgKElkeCAhPSBCU1NfTk9UX0ZPVU5EKQorCQkJCXsKKwkJCQkJLy8KKwkJCQkJLy8gTXVsdGlwbGUgU1NJRCBjYXNlLCB1c2VkIGNvcnJlY3QgQ2FwYWJpbGl0eUluZm8KKwkJCQkJLy8KKwkJCQkJQ2FwYWJpbGl0eUluZm8gPSBwQWQtPlNjYW5UYWIuQnNzRW50cnlbSWR4XS5DYXBhYmlsaXR5SW5mbzsKKwkJCQl9CisJCQl9CisJCQlOZGlzTW92ZU1lbW9yeShwQWQtPk1sbWVBdXguQnNzaWQsIEJzc2lkLCBNQUNfQUREUl9MRU4pOworCQkJcEFkLT5NbG1lQXV4LkNhcGFiaWxpdHlJbmZvID0gQ2FwYWJpbGl0eUluZm8gJiBTVVBQT1JURURfQ0FQQUJJTElUWV9JTkZPOworCQkJcEFkLT5NbG1lQXV4LkJzc1R5cGUgPSBCc3NUeXBlOworCQkJcEFkLT5NbG1lQXV4LkJlYWNvblBlcmlvZCA9IEJlYWNvblBlcmlvZDsKKwkJCXBBZC0+TWxtZUF1eC5DaGFubmVsID0gQ2hhbm5lbDsKKwkJCXBBZC0+TWxtZUF1eC5BdGltV2luID0gQXRpbVdpbjsKKwkJCXBBZC0+TWxtZUF1eC5DZnBQZXJpb2QgPSBDZi5DZnBQZXJpb2Q7CisJCQlwQWQtPk1sbWVBdXguQ2ZwTWF4RHVyYXRpb24gPSBDZi5DZnBNYXhEdXJhdGlvbjsKKwkJCXBBZC0+TWxtZUF1eC5BUFJhbGlua0llID0gUmFsaW5rSWU7CisKKwkJCS8vIENvcHkgQVAncyBzdXBwb3J0ZWQgcmF0ZSB0byBNbG1lQXV4IGZvciBjcmVhdGluZyBhc3NvaWNhdGlvbiByZXF1ZXN0CisJCQkvLyBBbHNvIGZpbHRlciBvdXQgbm90IHN1cHBvcnRlZCByYXRlCisJCQlwQWQtPk1sbWVBdXguU3VwUmF0ZUxlbiA9IFN1cFJhdGVMZW47CisJCQlOZGlzTW92ZU1lbW9yeShwQWQtPk1sbWVBdXguU3VwUmF0ZSwgU3VwUmF0ZSwgU3VwUmF0ZUxlbik7CisJCQlSVE1QQ2hlY2tSYXRlcyhwQWQsIHBBZC0+TWxtZUF1eC5TdXBSYXRlLCAmcEFkLT5NbG1lQXV4LlN1cFJhdGVMZW4pOworCQkJcEFkLT5NbG1lQXV4LkV4dFJhdGVMZW4gPSBFeHRSYXRlTGVuOworCQkJTmRpc01vdmVNZW1vcnkocEFkLT5NbG1lQXV4LkV4dFJhdGUsIEV4dFJhdGUsIEV4dFJhdGVMZW4pOworCQkJUlRNUENoZWNrUmF0ZXMocEFkLCBwQWQtPk1sbWVBdXguRXh0UmF0ZSwgJnBBZC0+TWxtZUF1eC5FeHRSYXRlTGVuKTsKKworICAgICAgICAgICAgTmRpc1plcm9NZW1vcnkocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5NQ1NTZXQsIDE2KTsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCXBBZC0+TWxtZUF1eC5OZXdFeHRDaGFubmVsT2Zmc2V0ID0gTmV3RXh0Q2hhbm5lbE9mZnNldDsKKwkJCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHlMZW4gPSBIdENhcGFiaWxpdHlMZW47CisKKwkJCS8vIGZpbHRlciBvdXQgdW4tc3VwcG9ydGVkIGh0IHJhdGVzCisJCQlpZiAoKChIdENhcGFiaWxpdHlMZW4gPiAwKSB8fCAoUHJlTkh0Q2FwYWJpbGl0eUxlbiA+IDApKSAmJiAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEKSkKKwkJCXsKKwkJCQlSVE1QWmVyb01lbW9yeSgmcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eSwgU0laRV9IVF9DQVBfSUUpOworICAgCQkJCVJUTVBNb3ZlTWVtb3J5KCZwQWQtPk1sbWVBdXguQWRkSHRJbmZvLCAmQWRkSHRJbmZvLCBTSVpFX0FERF9IVF9JTkZPX0lFKTsKKworCQkJCS8vIFN0YUFjdGl2ZS5TdXBwb3J0ZWRIdFBoeS5NQ1NTZXQgc3RvcmVzIFBlZXIgQVAncyAxMW4gUnggY2FwYWJpbGl0eQorCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uTUNTU2V0LCBIdENhcGFiaWxpdHkuTUNTU2V0LCAxNik7CisJCQkJcEFkLT5NbG1lQXV4Lk5ld0V4dENoYW5uZWxPZmZzZXQgPSBOZXdFeHRDaGFubmVsT2Zmc2V0OworCQkJCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHlMZW4gPSBTSVpFX0hUX0NBUF9JRTsKKwkJCQlwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLmJIdEVuYWJsZSA9IFRSVUU7CisJCQkJaWYgKFByZU5IdENhcGFiaWxpdHlMZW4gPiAwKQorCQkJCQlwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLmJQcmVOSHQgPSBUUlVFOworCQkJCVJUTVBDaGVja0h0KHBBZCwgQlNTSURfV0NJRCwgJkh0Q2FwYWJpbGl0eSwgJkFkZEh0SW5mbyk7CisJCQkJLy8gQ29weSBBUCBQYXJhbWV0ZXIgdG8gU3RhQWN0aXZlLiAgVGhpcyBpcyBhbHNvIGluIExpbmtVcC4KKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyQmVhY29uQXRKb2luQWN0aW9uISAoTXBkdURlbnNpdHk9JWQsIE1heFJBbXBkdUZhY3Rvcj0lZCwgQlc9JWQpXG4iLAorCQkJCQlwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRIdFBoeS5NcGR1RGVuc2l0eSwgcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkSHRQaHkuTWF4UkFtcGR1RmFjdG9yLCBIdENhcGFiaWxpdHkuSHRDYXBJbmZvLkNoYW5uZWxXaWR0aCkpOworCisJCQkJaWYgKEFkZEh0SW5mb0xlbiA+IDApCisJCQkJeworCQkJCQlDZW50cmFsQ2hhbm5lbCA9IEFkZEh0SW5mby5Db250cm9sQ2hhbjsKKwkJIAkJCS8vIENoZWNrIGFnYWluIHRoZSBCYW5kd2lkdGggY2FwYWJpbGl0eSBvZiB0aGlzIEFQLgorCQkgCQkJaWYgKChBZGRIdEluZm8uQ29udHJvbENoYW4gPiAyKSYmIChBZGRIdEluZm8uQWRkSHRJbmZvLkV4dENoYW5PZmZzZXQgPT0gRVhUQ0hBX0JFTE9XKSAmJiAoSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5DaGFubmVsV2lkdGggPT0gQldfNDApKQorCQkgCQkJeworCQkgCQkJCUNlbnRyYWxDaGFubmVsID0gQWRkSHRJbmZvLkNvbnRyb2xDaGFuIC0gMjsKKwkJIAkJCX0KKwkJIAkJCWVsc2UgaWYgKChBZGRIdEluZm8uQWRkSHRJbmZvLkV4dENoYW5PZmZzZXQgPT0gRVhUQ0hBX0FCT1ZFKSAmJiAoSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5DaGFubmVsV2lkdGggPT0gQldfNDApKQorCQkgCQkJeworCQkgCQkJCUNlbnRyYWxDaGFubmVsID0gQWRkSHRJbmZvLkNvbnRyb2xDaGFuICsgMjsKKwkJIAkJCX0KKworCQkJCQkvLyBDaGVjayBFcnJvciAuCisJCQkJCWlmIChwQWQtPk1sbWVBdXguQ2VudHJhbENoYW5uZWwgIT0gQ2VudHJhbENoYW5uZWwpCisJCSAJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiUGVlckJlYWNvbkF0Sm9pbkFjdGlvbiBIVD09PT5CZWFjb24gQ2VudHJhbCBDaGFubmVsID0gJWQsIENvbnRyb2wgQ2hhbm5lbCA9ICVkLiBNbG1lYXV4IENlbnRyYWxDaGFubmVsID0gJWRcbiIsIENlbnRyYWxDaGFubmVsLCBBZGRIdEluZm8uQ29udHJvbENoYW4sIHBBZC0+TWxtZUF1eC5DZW50cmFsQ2hhbm5lbCkpOworCisJCSAJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyQmVhY29uQXRKb2luQWN0aW9uIEhUPT09PkNlbnRyYWwgQ2hhbm5lbCA9ICVkLCBDb250cm9sIENoYW5uZWwgPSAlZCwgIC5cbiIsIENlbnRyYWxDaGFubmVsLCBBZGRIdEluZm8uQ29udHJvbENoYW4pKTsKKworCQkJCX0KKworCQkJfQorCQkJZWxzZQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQkJeworICAgCQkJCS8vIFRvIHByZXZlbnQgZXJyb3IsIGxldCBsZWdhY3kgQVAgbXVzdCBoYXZlIHNhbWUgQ2VudHJhbENoYW5uZWwgYW5kIENoYW5uZWwuCisJCQkJaWYgKChIdENhcGFiaWxpdHlMZW4gPT0gMCkgJiYgKFByZU5IdENhcGFiaWxpdHlMZW4gPT0gMCkpCisJCQkJCXBBZC0+TWxtZUF1eC5DZW50cmFsQ2hhbm5lbCA9IHBBZC0+TWxtZUF1eC5DaGFubmVsOworCisJCQkJcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5iSHRFbmFibGUgPSBGQUxTRTsKKwkJCQlSVE1QWmVyb01lbW9yeSgmcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eSwgU0laRV9IVF9DQVBfSUUpOworCQkJCVJUTVBaZXJvTWVtb3J5KCZwQWQtPk1sbWVBdXguQWRkSHRJbmZvLCBTSVpFX0FERF9IVF9JTkZPX0lFKTsKKwkJCX0KKworCQkJUlRNUFVwZGF0ZU1sbWVSYXRlKHBBZCk7CisKKwkJCS8vIGNvcHkgUU9TIHJlbGF0ZWQgaW5mb3JtYXRpb24KKwkJCWlmICgocEFkLT5Db21tb25DZmcuYldtbUNhcGFibGUpCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQkJIHx8IChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID49IFBIWV8xMUFCR05fTUlYRUQpCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCQkJKQorCQkJeworCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPk1sbWVBdXguQVBFZGNhUGFybSwgJkVkY2FQYXJtLCBzaXplb2YoRURDQV9QQVJNKSk7CisJCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+TWxtZUF1eC5BUFFic3NMb2FkLCAmUWJzc0xvYWQsIHNpemVvZihRQlNTX0xPQURfUEFSTSkpOworCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPk1sbWVBdXguQVBRb3NDYXBhYmlsaXR5LCAmUW9zQ2FwYWJpbGl0eSwgc2l6ZW9mKFFPU19DQVBBQklMSVRZX1BBUk0pKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlOZGlzWmVyb01lbW9yeSgmcEFkLT5NbG1lQXV4LkFQRWRjYVBhcm0sIHNpemVvZihFRENBX1BBUk0pKTsKKwkJCQlOZGlzWmVyb01lbW9yeSgmcEFkLT5NbG1lQXV4LkFQUWJzc0xvYWQsIHNpemVvZihRQlNTX0xPQURfUEFSTSkpOworCQkJCU5kaXNaZXJvTWVtb3J5KCZwQWQtPk1sbWVBdXguQVBRb3NDYXBhYmlsaXR5LCBzaXplb2YoUU9TX0NBUEFCSUxJVFlfUEFSTSkpOworCQkJfQorCisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTWU5DIC0gYWZ0ZXIgSk9JTiwgU3VwUmF0ZUxlbj0lZCwgRXh0UmF0ZUxlbj0lZFxuIiwKKwkJCQkJCQkJCQlwQWQtPk1sbWVBdXguU3VwUmF0ZUxlbiwgcEFkLT5NbG1lQXV4LkV4dFJhdGVMZW4pKTsKKworI2lmZGVmIExFQVBfU1VQUE9SVAorCQkJLy8gVXBkYXRlIENraXBGbGFnCisJCQlwQWQtPlN0YUNmZy5Da2lwRmxhZyA9IENraXBGbGFnOworCisJCQkvLyBLZWVwIFRpbWVTdGFtcCBmb3IgUmUtQXNzb2NpYXRpb24gdXNlZC4KKwkJCWlmIChMRUFQX0NDS01fT04ocEFkKSAmJiAocEFkLT5TdGFDZmcuQ0NLTUxpbmtVcEZsYWcgPT0gVFJVRSkpCisJCQkJcEFkLT5TdGFDZmcuQ0NLTUJlYWNvbkF0Sm9pblRpbWVTdGFtcCA9IFRpbWVTdGFtcDsKKyNlbmRpZiAvLyBMRUFQX1NVUFBPUlQgLy8KKworCQkJaWYgKEFpcm9uZXRDZWxsUG93ZXJMaW1pdCAhPSAweEZGKQorCQkJeworCQkJCS8vV2UgbmVlZCB0byBjaGFuZ2Ugb3VyIFR4UG93ZXIgZm9yIENDWCAyLjAgQVAgQ29udHJvbCBvZiBDbGllbnQgVHJhbnNtaXQgUG93ZXIKKwkJCQlDaGFuZ2VUb0NlbGxQb3dlckxpbWl0KHBBZCwgQWlyb25ldENlbGxQb3dlckxpbWl0KTsKKwkJCX0KKwkJCWVsc2UgIC8vVXNlZCB0aGUgZGVmYXVsdCBUWCBQb3dlciBQZXJjZW50YWdlLgorCQkJCXBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID0gcEFkLT5Db21tb25DZmcuVHhQb3dlckRlZmF1bHQ7CisKKwkJCXBBZC0+TWxtZS5TeW5jTWFjaGluZS5DdXJyU3RhdGUgPSBTWU5DX0lETEU7CisJCQlTdGF0dXMgPSBNTE1FX1NVQ0NFU1M7CisJCQlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfSk9JTl9DT05GLCAyLCAmU3RhdHVzKTsKKwkJfQorCQkvLyBub3QgdG8gbWUgQkVBQ09OLCBpZ25vcmVkCisJfQorCS8vIHNhbml0eSBjaGVjayBmYWlsLCBpZ25vcmUgdGhpcyBmcmFtZQorfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCXJlY2VpdmUgQkVBQ09OIGZyb20gcGVlcgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIFBlZXJCZWFjb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCVVDSEFSICAgICAgICAgQnNzaWRbTUFDX0FERFJfTEVOXSwgQWRkcjJbTUFDX0FERFJfTEVOXTsKKwlDSEFSICAgICAgICAgIFNzaWRbTUFYX0xFTl9PRl9TU0lEXTsKKwlDRl9QQVJNICAgICAgIENmUGFybTsKKwlVQ0hBUiAgICAgICAgIFNzaWRMZW4sIE1lc3NhZ2VUb01lPTAsIEJzc1R5cGUsIENoYW5uZWwsIE5ld0NoYW5uZWwsIGluZGV4PTA7CisJVUNIQVIgICAgICAgICBEdGltQ291bnQ9MCwgRHRpbVBlcmlvZD0wLCBCY2FzdEZsYWc9MDsKKwlVU0hPUlQgICAgICAgIENhcGFiaWxpdHlJbmZvLCBBdGltV2luLCBCZWFjb25QZXJpb2Q7CisJTEFSR0VfSU5URUdFUiBUaW1lU3RhbXA7CisJVVNIT1JUICAgICAgICBUYnR0TnVtVG9OZXh0V2FrZVVwOworCVVDSEFSICAgICAgICAgRXJwOworCVVDSEFSICAgICAgICAgU3VwUmF0ZVtNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFU10sIEV4dFJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdOworCVVDSEFSCQkgIFN1cFJhdGVMZW4sIEV4dFJhdGVMZW47CisJVUNIQVIJCSAgQ2tpcEZsYWc7CisJVVNIT1JUICAgICAgICBMZW5WSUU7CisJVUNIQVIJCSAgQWlyb25ldENlbGxQb3dlckxpbWl0OworCUVEQ0FfUEFSTSAgICAgICBFZGNhUGFybTsKKwlRQlNTX0xPQURfUEFSTSAgUWJzc0xvYWQ7CisJUU9TX0NBUEFCSUxJVFlfUEFSTSBRb3NDYXBhYmlsaXR5OworCVVMT05HICAgICAgICAgICBSYWxpbmtJZTsKKwkvLyBOZXcgZm9yIFdQQSBzZWN1cml0eSBzdWl0ZXMKKwlVQ0hBUgkJCQkJCVZhcklFW01BWF9WSUVfTEVOXTsJCS8vIFRvdGFsIFZJRSBsZW5ndGggPSBNQVhfVklFX0xFTiAtIC01CisJTkRJU184MDJfMTFfVkFSSUFCTEVfSUVzCSpwVklFID0gTlVMTDsKKwlIVF9DQVBBQklMSVRZX0lFCQlIdENhcGFiaWxpdHk7CisJQUREX0hUX0lORk9fSUUJCUFkZEh0SW5mbzsJLy8gQVAgbWlnaHQgdXNlIHRoaXMgYWRkaXRpb25hbCBodCBpbmZvIElFCisJVUNIQVIJCQlIdENhcGFiaWxpdHlMZW4sIFByZU5IdENhcGFiaWxpdHlMZW47CisJVUNIQVIJCQlBZGRIdEluZm9MZW47CisJVUNIQVIJCQlOZXdFeHRDaGFubmVsT2Zmc2V0ID0gMHhmZjsKKworCisjaWZkZWYgUkFMSU5LX0FURQorICAgIGlmIChBVEVfT04ocEFkKSkKKyAgICB7CisJCXJldHVybjsKKyAgICB9CisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCisJaWYgKCEoSU5GUkFfT04ocEFkKSB8fCBBREhPQ19PTihwQWQpCisJCSkpCisJCXJldHVybjsKKworCS8vIEluaXQgVmFyaWFibGUgSUUgc3RydWN0dXJlCisJcFZJRSA9IChQTkRJU184MDJfMTFfVkFSSUFCTEVfSUVzKSBWYXJJRTsKKwlwVklFLT5MZW5ndGggPSAwOworICAgIFJUTVBaZXJvTWVtb3J5KCZIdENhcGFiaWxpdHksIHNpemVvZihIdENhcGFiaWxpdHkpKTsKKwlSVE1QWmVyb01lbW9yeSgmQWRkSHRJbmZvLCBzaXplb2YoQUREX0hUX0lORk9fSUUpKTsKKworCWlmIChQZWVyQmVhY29uQW5kUHJvYmVSc3BTYW5pdHkocEFkLAorCQkJCQkJCQlFbGVtLT5Nc2csCisJCQkJCQkJCUVsZW0tPk1zZ0xlbiwKKwkJCQkJCQkJRWxlbS0+Q2hhbm5lbCwKKwkJCQkJCQkJQWRkcjIsCisJCQkJCQkJCUJzc2lkLAorCQkJCQkJCQlTc2lkLAorCQkJCQkJCQkmU3NpZExlbiwKKwkJCQkJCQkJJkJzc1R5cGUsCisJCQkJCQkJCSZCZWFjb25QZXJpb2QsCisJCQkJCQkJCSZDaGFubmVsLAorCQkJCQkJCQkmTmV3Q2hhbm5lbCwKKwkJCQkJCQkJJlRpbWVTdGFtcCwKKwkJCQkJCQkJJkNmUGFybSwKKwkJCQkJCQkJJkF0aW1XaW4sCisJCQkJCQkJCSZDYXBhYmlsaXR5SW5mbywKKwkJCQkJCQkJJkVycCwKKwkJCQkJCQkJJkR0aW1Db3VudCwKKwkJCQkJCQkJJkR0aW1QZXJpb2QsCisJCQkJCQkJCSZCY2FzdEZsYWcsCisJCQkJCQkJCSZNZXNzYWdlVG9NZSwKKwkJCQkJCQkJU3VwUmF0ZSwKKwkJCQkJCQkJJlN1cFJhdGVMZW4sCisJCQkJCQkJCUV4dFJhdGUsCisJCQkJCQkJCSZFeHRSYXRlTGVuLAorCQkJCQkJCQkmQ2tpcEZsYWcsCisJCQkJCQkJCSZBaXJvbmV0Q2VsbFBvd2VyTGltaXQsCisJCQkJCQkJCSZFZGNhUGFybSwKKwkJCQkJCQkJJlFic3NMb2FkLAorCQkJCQkJCQkmUW9zQ2FwYWJpbGl0eSwKKwkJCQkJCQkJJlJhbGlua0llLAorCQkJCQkJCQkmSHRDYXBhYmlsaXR5TGVuLAorCQkJCQkJCQkmUHJlTkh0Q2FwYWJpbGl0eUxlbiwKKwkJCQkJCQkJJkh0Q2FwYWJpbGl0eSwKKwkJCQkJCQkJJkFkZEh0SW5mb0xlbiwKKwkJCQkJCQkJJkFkZEh0SW5mbywKKwkJCQkJCQkJJk5ld0V4dENoYW5uZWxPZmZzZXQsCisJCQkJCQkJCSZMZW5WSUUsCisJCQkJCQkJCXBWSUUpKQorCXsKKwkJQk9PTEVBTiBpc19teV9ic3NpZCwgaXNfbXlfc3NpZDsKKwkJVUxPTkcgICBCc3NpZHgsIE5vdzsKKwkJQlNTX0VOVFJZICpwQnNzOworCQlDSEFSCQlSZWFsUnNzaSA9IFJUTVBNYXhSc3NpKHBBZCwgQ29udmVydFRvUnNzaShwQWQsIEVsZW0tPlJzc2kwLCBSU1NJXzApLCBDb252ZXJ0VG9Sc3NpKHBBZCwgRWxlbS0+UnNzaTEsIFJTU0lfMSksIENvbnZlcnRUb1Jzc2kocEFkLCBFbGVtLT5Sc3NpMiwgUlNTSV8yKSk7CisKKwkJaXNfbXlfYnNzaWQgPSBNQUNfQUREUl9FUVVBTChCc3NpZCwgcEFkLT5Db21tb25DZmcuQnNzaWQpPyBUUlVFIDogRkFMU0U7CisJCWlzX215X3NzaWQgPSBTU0lEX0VRVUFMKFNzaWQsIFNzaWRMZW4sIHBBZC0+Q29tbW9uQ2ZnLlNzaWQsIHBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW4pPyBUUlVFOkZBTFNFOworCisKKwkJLy8gaWdub3JlIEJFQUNPTiBub3QgZm9yIG15IFNTSUQKKwkJaWYgKCghIGlzX215X3NzaWQpICYmICghIGlzX215X2Jzc2lkKSkKKwkJCXJldHVybjsKKworCQkvLyBJdCBtZWFucyBTVEEgd2FpdHMgZGlzYXNzb2MgY29tcGxldGVseSBmcm9tIHRoaXMgQVAsIGlnbm9yZXMgdGhpcyBiZWFjb24uCisJCWlmIChwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID09IENOVExfV0FJVF9ESVNBU1NPQykKKwkJCXJldHVybjsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkvLyBDb3B5IENvbnRyb2wgY2hhbm5lbCBmb3IgdGhpcyBCU1NJRC4KKwkJaWYgKEFkZEh0SW5mb0xlbiAhPSAwKQorCQkJQ2hhbm5lbCA9IEFkZEh0SW5mby5Db250cm9sQ2hhbjsKKworCQlpZiAoKEh0Q2FwYWJpbGl0eUxlbiA+IDApIHx8IChQcmVOSHRDYXBhYmlsaXR5TGVuID4gMCkpCisJCQlIdENhcGFiaWxpdHlMZW4gPSBTSVpFX0hUX0NBUF9JRTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCQkvLworCQkvLyBIb3VzZWtlZXBpbmcgIlNzaWRCc3NUYWIiIHRhYmxlIGZvciBsYXRlci1vbiBST0FNaW5nIHVzYWdlLgorCQkvLworCQlCc3NpZHggPSBCc3NUYWJsZVNlYXJjaCgmcEFkLT5TY2FuVGFiLCBCc3NpZCwgQ2hhbm5lbCk7CisJCWlmIChCc3NpZHggPT0gQlNTX05PVF9GT1VORCkKKwkJeworCQkJLy8gZGlzY292ZXIgbmV3IEFQIG9mIHRoaXMgbmV0d29yaywgY3JlYXRlIEJTUyBlbnRyeQorCQkJQnNzaWR4ID0gQnNzVGFibGVTZXRFbnRyeShwQWQsICZwQWQtPlNjYW5UYWIsIEJzc2lkLCBTc2lkLCBTc2lkTGVuLCBCc3NUeXBlLCBCZWFjb25QZXJpb2QsCisJCQkJCQkgJkNmUGFybSwgQXRpbVdpbiwgQ2FwYWJpbGl0eUluZm8sIFN1cFJhdGUsIFN1cFJhdGVMZW4sIEV4dFJhdGUsIEV4dFJhdGVMZW4sCisJCQkJCQkmSHRDYXBhYmlsaXR5LCAmQWRkSHRJbmZvLEh0Q2FwYWJpbGl0eUxlbixBZGRIdEluZm9MZW4sTmV3RXh0Q2hhbm5lbE9mZnNldCwgQ2hhbm5lbCwKKwkJCQkJCVJlYWxSc3NpLCBUaW1lU3RhbXAsIENraXBGbGFnLCAmRWRjYVBhcm0sICZRb3NDYXBhYmlsaXR5LAorCQkJCQkJJlFic3NMb2FkLCBMZW5WSUUsIHBWSUUpOworCQkJaWYgKEJzc2lkeCA9PSBCU1NfTk9UX0ZPVU5EKSAvLyByZXR1cm4gaWYgQlNTIHRhYmxlIGZ1bGwKKwkJCQlyZXR1cm47CisKKwkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NpZHhdLlBUU0YsICZFbGVtLT5Nc2dbMjRdLCA0KTsKKwkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzaWR4XS5UVFNGWzBdLCAmRWxlbS0+VGltZVN0YW1wLnUuTG93UGFydCwgNCk7CisJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc2lkeF0uVFRTRls0XSwgJkVsZW0tPlRpbWVTdGFtcC51Lkxvd1BhcnQsIDQpOworCisKKworCQl9CisKKwkJaWYgKChwQWQtPkNvbW1vbkNmZy5iSUVFRTgwMjExSCA9PSAxKSAmJiAoTmV3Q2hhbm5lbCAhPSAwKSAmJiAoQ2hhbm5lbCAhPSBOZXdDaGFubmVsKSkKKwkJeworCQkJLy8gU3dpdGNoaW5nIHRvIGNoYW5uZWwgMSBjYW4gcHJldmVudCBmcm9tIHJlc2Nhbm5pbmcgdGhlIGN1cnJlbnQgY2hhbm5lbCBpbW1lZGlhdGVseSAoYnkgYXV0byByZWNvbm5lY3Rpb24pLgorCQkJLy8gSW4gYWRkaXRpb24sIGNsZWFyIHRoZSBNTE1FIHF1ZXVlIGFuZCB0aGUgc2NhbiB0YWJsZSB0byBkaXNjYXJkIHRoZSBSWCBwYWNrZXRzIGFuZCBwcmV2aW91cyBzY2FubmluZyByZXN1bHRzLgorCQkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCAxLCBGQUxTRSk7CisJCQlBc2ljTG9ja0NoYW5uZWwocEFkLCAxKTsKKwkJICAgIExpbmtEb3duKHBBZCwgRkFMU0UpOworCQkJTWxtZVF1ZXVlSW5pdCgmcEFkLT5NbG1lLlF1ZXVlKTsKKwkJCUJzc1RhYmxlSW5pdCgmcEFkLT5TY2FuVGFiKTsKKwkJICAgIFJUTVB1c2VjRGVsYXkoMTAwMDAwMCk7CQkvLyB1c2UgZGVsYXkgdG8gcHJldmVudCBTVEEgZG8gcmVhc3NvYworCisJCQkvLyBjaGFubmVsIHNhbml0eSBjaGVjaworCQkJZm9yIChpbmRleCA9IDAgOyBpbmRleCA8IHBBZC0+Q2hhbm5lbExpc3ROdW07IGluZGV4KyspCisJCQl7CisJCQkJaWYgKHBBZC0+Q2hhbm5lbExpc3RbaW5kZXhdLkNoYW5uZWwgPT0gTmV3Q2hhbm5lbCkKKwkJCQl7CisJCQkJCXBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NpZHhdLkNoYW5uZWwgPSBOZXdDaGFubmVsOworCQkJCQlwQWQtPkNvbW1vbkNmZy5DaGFubmVsID0gTmV3Q2hhbm5lbDsKKwkJCQkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsLCBGQUxTRSk7CisJCQkJCUFzaWNMb2NrQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpOworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyQmVhY29uIC0gU1RBIHJlY2VpdmUgY2hhbm5lbCBzd2l0Y2ggYW5ub3VuY2VtZW50IElFIChOZXcgQ2hhbm5lbCA9JWQpXG4iLCBOZXdDaGFubmVsKSk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKworCQkJaWYgKGluZGV4ID49IHBBZC0+Q2hhbm5lbExpc3ROdW0pCisJCQl7CisJCQkJREJHUFJJTlRfRVJSKCgiUGVlckJlYWNvbihjYW4gbm90IGZpbmQgTmV3IENoYW5uZWw9JWQgaW4gQ2hhbm5lbExpc3RbJWRdXG4iLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsLCBwQWQtPkNoYW5uZWxMaXN0TnVtKSk7CisJCQl9CisJCX0KKworCQkvLyBpZiB0aGUgc3NpZCBtYXRjaGVkICYgYnNzaWQgdW5tYXRjaGVkLCB3ZSBzaG91bGQgc2VsZWN0IHRoZSBic3NpZCB3aXRoIGxhcmdlIHZhbHVlLgorCQkvLyBUaGlzIG1pZ2h0IGhhcHBlbmVkIHdoZW4gdHdvIFNUQSBzdGFydCBhdCB0aGUgc2FtZSB0aW1lCisJCWlmICgoISBpc19teV9ic3NpZCkgJiYgQURIT0NfT04ocEFkKSkKKwkJeworCQkJSU5UCWk7CisKKwkJCS8vIEFkZCB0aGUgc2FmZWd1YXJkIGFnYWluc3QgdGhlIG1pc21hdGNoIG9mIGFkaG9jIHdlcCBzdGF0dXMKKwkJCWlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgIT0gcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc2lkeF0uV2VwU3RhdHVzKQorCQkJeworCQkJCXJldHVybjsKKwkJCX0KKworCQkJLy8gY29sbGFwc2UgaW50byB0aGUgQURIT0MgbmV0d29yayB3aGljaCBoYXMgYmlnZ2VyIEJTU0lEIHZhbHVlLgorCQkJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJCXsKKwkJCQlpZiAoQnNzaWRbaV0gPiBwQWQtPkNvbW1vbkNmZy5Cc3NpZFtpXSkKKwkJCQl7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNZTkMgLSBtZXJnZSB0byB0aGUgSUJTUyB3aXRoIGJpZ2dlciBCU1NJRD0lMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKwkJCQkJCUJzc2lkWzBdLCBCc3NpZFsxXSwgQnNzaWRbMl0sIEJzc2lkWzNdLCBCc3NpZFs0XSwgQnNzaWRbNV0pKTsKKwkJCQkJQXNpY0Rpc2FibGVTeW5jKHBBZCk7CisJCQkJCUNPUFlfTUFDX0FERFIocEFkLT5Db21tb25DZmcuQnNzaWQsIEJzc2lkKTsKKwkJCQkJQXNpY1NldEJzc2lkKHBBZCwgcEFkLT5Db21tb25DZmcuQnNzaWQpOworCQkJCQlNYWtlSWJzc0JlYWNvbihwQWQpOyAgICAgICAgLy8gcmUtYnVpbGQgQkVBQ09OIGZyYW1lCisJCQkJCUFzaWNFbmFibGVJYnNzU3luYyhwQWQpOyAgICAvLyBjb3B5IEJFQUNPTiBmcmFtZSB0byBvbi1jaGlwIG1lbW9yeQorCQkJCQlpc19teV9ic3NpZCA9IFRSVUU7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQllbHNlIGlmIChCc3NpZFtpXSA8IHBBZC0+Q29tbW9uQ2ZnLkJzc2lkW2ldKQorCQkJCQlicmVhazsKKwkJCX0KKwkJfQorCisKKwkJTmRpc0dldFN5c3RlbVVwVGltZSgmTm93KTsKKwkJcEJzcyA9ICZwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzaWR4XTsKKwkJcEJzcy0+UnNzaSA9IFJlYWxSc3NpOyAgICAgICAvLyBsYXN0ZXN0IFJTU0kKKwkJcEJzcy0+TGFzdEJlYWNvblJ4VGltZSA9IE5vdzsgICAvLyBsYXN0IFJYIHRpbWVzdGFtcAorCisJCS8vCisJCS8vIEJFQUNPTiBmcm9tIG15IEJTU0lEIC0gZWl0aGVyIElCU1Mgb3IgSU5GUkEgbmV0d29yaworCQkvLworCQlpZiAoaXNfbXlfYnNzaWQpCisJCXsKKwkJCVJYV0lfU1RSVUMJUnhXSTsKKworCQkJcEFkLT5TdGFDZmcuRHRpbUNvdW50ID0gRHRpbUNvdW50OworCQkJcEFkLT5TdGFDZmcuRHRpbVBlcmlvZCA9IER0aW1QZXJpb2Q7CisJCQlwQWQtPlN0YUNmZy5MYXN0QmVhY29uUnhUaW1lID0gTm93OworCisKKwkJCVJ4V0kuUlNTSTAgPSBFbGVtLT5Sc3NpMDsKKwkJCVJ4V0kuUlNTSTEgPSBFbGVtLT5Sc3NpMTsKKwkJCVJ4V0kuUlNTSTIgPSBFbGVtLT5Sc3NpMjsKKworCQkJVXBkYXRlX1Jzc2lfU2FtcGxlKHBBZCwgJnBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUsICZSeFdJKTsKKwkJCWlmIChBaXJvbmV0Q2VsbFBvd2VyTGltaXQgIT0gMHhGRikKKwkJCXsKKwkJCQkvLworCQkJCS8vIFdlIGdldCB0aGUgQ2lzY28gKGNjeCkgIlR4UG93ZXIgTGltaXQiIHJlcXVpcmVkCisJCQkJLy8gQ2hhbmdlZCB0byBhcHByb3ByaWF0ZSBUeFBvd2VyIExpbWl0IGZvciBDaXNvIENvbXBhdGlibGUgRXh0ZW5zaW9ucworCQkJCS8vCisJCQkJQ2hhbmdlVG9DZWxsUG93ZXJMaW1pdChwQWQsIEFpcm9uZXRDZWxsUG93ZXJMaW1pdCk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJLy8KKwkJCQkvLyBBaXJvbmV0Q2VsbFBvd2VyTGltaXQgZXF1YWwgdG8gMHhGRiBtZWFucyB0aGUgQ2lzY28gKGNjeCkgIlR4UG93ZXIgTGltaXQiIG5vdCBleGlzdC4KKwkJCQkvLyBVc2VkIHRoZSBkZWZhdWx0IFRYIFBvd2VyIFBlcmNlbnRhZ2UsIHRoYXQgc2V0IGZyb20gVUkuCisJCQkJLy8KKwkJCQlwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA9IHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJEZWZhdWx0OworCQkJfQorCisJCQkvLyBhdCBsZWFzdCBvbmUgMTFiIHBlZXIgam9pbmVkLiBkb3duZ3JhZGUgdGhlIE1heFR4UmF0ZSB0byAxMU1icHMKKwkJCS8vIGFmdGVyIGxhc3QgMTFiIHBlZXIgbGVmdCBmb3Igc2V2ZXJhbCBzZWNvbmRzLCB3ZSdsbCBhdXRvIHN3aXRjaCBiYWNrIHRvIDExRyByYXRlCisJCQkvLyBpbiBNbG1lUGVyaW9kaWNFeGVjKCkKKwkJCWlmIChBREhPQ19PTihwQWQpICYmIChDQVBfSVNfSUJTU19PTihDYXBhYmlsaXR5SW5mbykpKQorCQkJeworCQkJCUJPT0xFQU4JYlJlc3RhcnQ7CisgICAgICAgICAgICAgICAgQk9PTEVBTgliblJlc3RhcnQ7CisKKwkJCQliUmVzdGFydCA9IEZBTFNFOworICAgICAgICAgICAgICAgIGJuUmVzdGFydCA9IEZBTFNFOworCisJCQkJZG8KKwkJCQl7CisJCQkJCWlmICgoU3VwUmF0ZUxlbitFeHRSYXRlTGVuIDw9IDQpICYmIChwQWQtPkNvbW1vbkNmZy5NYXhUeFJhdGUgPiBSQVRFXzExKSkKKwkJCQkJeworCQkJCQkJaWYgKHBBZC0+U3RhQ2ZnLkFkaG9jQk9ubHlKb2luZWQgPT0gRkFMU0UpCisJCQkJCQl7CisJCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU1lOQyAtIDExYiBwZWVyIGpvaW5lZC4gZG93bi1ncmFkZSB0byAxMWIgVFggcmF0ZXMgXG4iKSk7CisJCQkJCQkJYlJlc3RhcnQgPSBUUlVFOworCQkJCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQWN0aXZlLlN1cFJhdGUsIFN1cFJhdGUsIE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTKTsKKwkJCQkJCQlwQWQtPlN0YUFjdGl2ZS5TdXBSYXRlTGVuID0gU3VwUmF0ZUxlbjsKKwkJCQkJCQlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUFjdGl2ZS5FeHRSYXRlLCBFeHRSYXRlLCBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUyk7CisJCQkJCQkJcEFkLT5TdGFBY3RpdmUuRXh0UmF0ZUxlbiA9IEV4dFJhdGVMZW47CisJCQkJCQkJcEFkLT5TdGFDZmcuQWRob2NCT25seUpvaW5lZCA9IFRSVUU7CisJCQkJCQkJcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5iSHRFbmFibGUgPSBGQUxTRTsKKwkJCQkJCQlBc2ljU2V0RWRjYVBhcm0ocEFkLCBOVUxMKTsKKwkJCQkJCX0KKworCQkJCQkJLy8gdGhpcyB0aW1lc3RhbXAgaXMgZm9yIE1sbWVQZXJpb2RpY0V4ZWMoKSB0byBjaGVjayBpZiBhbGwgMTFCIHBlZXJzIGhhdmUgbGVmdAorCQkJCQkJcEFkLT5TdGFDZmcuTGFzdDExYkJlYWNvblJ4VGltZSA9IE5vdzsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQkJCS8vIFVwZGF0ZSBIdCBQaHkuCisJCQkJCWlmICgocEFkLT5Db21tb25DZmcuUGh5TW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEKSkKKwkJCQkJeworCQkJCQkJaWYgKCFPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCkgJiYKKwkJCQkJCQkhcEFkLT5TdGFDZmcuQWRob2NCR0pvaW5lZCAmJgorCQkJCQkJCSFwQWQtPlN0YUNmZy5BZGhvY0JPbmx5Sm9pbmVkKQorCQkJCQkJCUFkaG9jVHVybk9uUW9zKHBBZCk7CisKKwkJCQkJCS8vIEhhbmRsZSByYXRlIHN3aXRjaCBpc3N1ZSB3aGVuIEFkaG9jIG1vZGUKKwkJCQkJCWlmICgoU3VwUmF0ZUxlbitFeHRSYXRlTGVuID49IDgpICYmIChIdENhcGFiaWxpdHkuTUNTU2V0WzBdID09IDApICYmIChIdENhcGFiaWxpdHkuTUNTU2V0WzFdID09IDApKQorCQkJCQkJeworCQkJCQkJCWlmIChwQWQtPlN0YUNmZy5BZGhvY0JHSm9pbmVkID09IEZBTFNFKQorCQkJCQkJCXsKKwkJCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU1lOQyAtIDExZyBwZWVyIGpvaW5lZC4gZG93bi1ncmFkZSB0byAxMWcgVFggcmF0ZXMgXG4iKSk7CisJCQkJCQkJCWJSZXN0YXJ0ID0gVFJVRTsKKwkJCQkJCQkJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFBY3RpdmUuU3VwUmF0ZSwgU3VwUmF0ZSwgTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVMpOworCQkJCQkJCQlwQWQtPlN0YUFjdGl2ZS5TdXBSYXRlTGVuID0gU3VwUmF0ZUxlbjsKKwkJCQkJCQkJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFBY3RpdmUuRXh0UmF0ZSwgRXh0UmF0ZSwgTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVMpOworCQkJCQkJCQlwQWQtPlN0YUFjdGl2ZS5FeHRSYXRlTGVuID0gRXh0UmF0ZUxlbjsKKwkJCQkJCQkJcEFkLT5TdGFDZmcuQWRob2NCR0pvaW5lZCA9IFRSVUU7CisJCQkJCQkJCXBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uYkh0RW5hYmxlID0gRkFMU0U7CisJCQkJCQkJCUFzaWNTZXRFZGNhUGFybShwQWQsIE5VTEwpOworCQkJCQkJCX0KKworCQkJCQkJCS8vIHRoaXMgdGltZXN0YW1wIGlzIGZvciBNbG1lUGVyaW9kaWNFeGVjKCkgdG8gY2hlY2sgaWYgYWxsIDExZyBwZWVycyBoYXZlIGxlZnQKKwkJCQkJCQlwQWQtPlN0YUNmZy5MYXN0MTFnQmVhY29uUnhUaW1lID0gTm93OworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQkJZWxzZSBpZiAoIXBBZC0+U3RhQ2ZnLkFkaG9jQkdKb2luZWQgJiYKKwkJCQkJCQkJICFwQWQtPlN0YUNmZy5BZGhvY0JPbmx5Sm9pbmVkICYmCisJCQkJCQkJCSAocEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXID09IEJXXzQwKSAmJgorCQkJCQkJCQkgKEh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQ2hhbm5lbFdpZHRoID09IEJXXzIwKSkKKwkJCQkJCXsKKwkJCQkJCQlpZiAocEFkLT5TdGFDZmcuQWRob2MyME5Kb2luZWQgPT0gRkFMU0UpCisJCQkJCQkJeworCQkJCQkJCQlwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWw7CisKKwkJCQkJCQkJcEFkLT5TdGFDZmcuQWRob2MyME5Kb2luZWQgPSBUUlVFOworCQkJCQkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eSwgJkh0Q2FwYWJpbGl0eSwgU0laRV9IVF9DQVBfSUUpOworCQkJCQkJCQlpZiAoQWRkSHRJbmZvTGVuICE9IDApCisJCQkJCQkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5NbG1lQXV4LkFkZEh0SW5mbywgJkFkZEh0SW5mbywgQWRkSHRJbmZvTGVuKTsKKwkJCQkJCQkJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5NQ1NTZXQsIEh0Q2FwYWJpbGl0eS5NQ1NTZXQsIDE2KTsKKworCQkJCQkJCQlSVE1QQ2hlY2tIdChwQWQsIEVsZW0tPldjaWQsICZwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5LCAmcEFkLT5NbG1lQXV4LkFkZEh0SW5mbyk7CisJCQkJCQkJCUNPUFlfSFRTRVRUSU5HU19GUk9NX01MTUVfQVVYX1RPX0FDVElWRV9DRkcocEFkKTsKKwkJCQkJCQkJcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5iSHRFbmFibGUgPSBUUlVFOworCQkJCQkJCQliUmVzdGFydCA9IFRSVUU7CisJCQkJCQkJCWJuUmVzdGFydCA9IFRSVUU7CisJCQkJCQkJfQorCQkJCQkJCS8vIHRoaXMgdGltZXN0YW1wIGlzIGZvciBNbG1lUGVyaW9kaWNFeGVjKCkgdG8gY2hlY2sgaWYgYWxsIDIwTUh6IE4gcGVlcnMgaGF2ZSBsZWZ0CisJCQkJCQkJcEFkLT5TdGFDZmcuTGFzdDIwTkJlYWNvblJ4VGltZSA9IE5vdzsKKwkJCQkJCX0KKworCQkJCQl9CisJCQkJCWVsc2UKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJCQkJeworCQkJCQkJUlRNUFplcm9NZW1vcnkoJnBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHksIFNJWkVfSFRfQ0FQX0lFKTsKKwkJCQkJCVJUTVBaZXJvTWVtb3J5KCZwQWQtPk1sbWVBdXguQWRkSHRJbmZvLCBTSVpFX0FERF9IVF9JTkZPX0lFKTsKKwkJCQkJfQorCQkJCX13aGlsZSAoRkFMU0UpOworCisJCQkJLy8gSWYgcGVlciBBZGhvYyBpcyBsZWdhY3kgbW9kZSwgSSBkb24ndCBuZWVkIHRvIGNhbGwgTWxtZVVwZGF0ZUh0VHhSYXRlcyBubyBtYXR0ZXIgSSBzdXBwb3J0IEhUIG9yIG5vdAorCQkJCWlmICgoYlJlc3RhcnQgPT0gVFJVRSkgJiYgKGJuUmVzdGFydCA9PSBGQUxTRSkpCisJCQkJeworCQkJCQlNbG1lVXBkYXRlVHhSYXRlcyhwQWQsIEZBTFNFLCAwKTsKKwkJCQkJTWFrZUlic3NCZWFjb24ocEFkKTsgICAgICAgIC8vIHJlLWJ1aWxkIEJFQUNPTiBmcmFtZQorCQkJCQlBc2ljRW5hYmxlSWJzc1N5bmMocEFkKTsgICAgLy8gY29weSB0byBvbi1jaGlwIG1lbW9yeQorCQkJCX0KKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCQllbHNlIGlmICgoYlJlc3RhcnQgPT0gVFJVRSkgJiYgKGJuUmVzdGFydCA9PSBUUlVFKSkKKwkJCQl7CisJCQkJCU1sbWVVcGRhdGVUeFJhdGVzKHBBZCwgRkFMU0UsIEJTUzApOworCQkJCQlNbG1lVXBkYXRlSHRUeFJhdGVzKHBBZCwgQlNTMCk7CisJCQkJCU1ha2VJYnNzQmVhY29uKHBBZCk7ICAgICAgICAvLyByZS1idWlsZCBCRUFDT04gZnJhbWUKKwkJCQkJQXNpY0VuYWJsZUlic3NTeW5jKHBBZCk7ICAgIC8vIGNvcHkgdG8gb24tY2hpcCBtZW1vcnkKKwkJCQl9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwkJCQkvLyBBdCBsZWFzdCBhbm90aGVyIHBlZXIgaW4gdGhpcyBJQlNTLCBkZWNsYXJlIE1lZGlhU3RhdGUgYXMgQ09OTkVDVEVECisJCQkJaWYgKCFPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCkpCisJCQkJeworCQkJCQlPUFNUQVRVU19TRVRfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKTsKKworCQkJCQlwQWQtPkluZGljYXRlTWVkaWFTdGF0ZSA9IE5kaXNNZWRpYVN0YXRlQ29ubmVjdGVkOworCQkJCQlSVE1QX0luZGljYXRlTWVkaWFTdGF0ZShwQWQpOworCSAgICAgICAgICAgICAgICBwQWQtPkV4dHJhSW5mbyA9IEdFTkVSQUxfTElOS19VUDsKKwkJCQkJQXNpY1NldEJzc2lkKHBBZCwgcEFkLT5Db21tb25DZmcuQnNzaWQpOworCisJCQkJCS8vIDIwMDMvMDMvMTIgLSBqb2huCisJCQkJCS8vIE1ha2Ugc3VyZSB0aGlzIGVudHJ5IGluICJTY2FuVGFiIiB0YWJsZSwgdGh1cyBjb21wbGllcyB0byBNaWNyb3NvZnQncyBwb2xpY3kgdGhhdAorCQkJCQkvLyAic2l0ZSBzdXJ2ZXkiIHJlc3VsdCBzaG91bGQgYWx3YXlzIGluY2x1ZGUgdGhlIGN1cnJlbnQgY29ubmVjdGVkIG5ldHdvcmsuCisJCQkJCS8vCisJCQkJCUJzc2lkeCA9IEJzc1RhYmxlU2VhcmNoKCZwQWQtPlNjYW5UYWIsIEJzc2lkLCBDaGFubmVsKTsKKwkJCQkJaWYgKEJzc2lkeCA9PSBCU1NfTk9UX0ZPVU5EKQorCQkJCQl7CisJCQkJCQlCc3NpZHggPSBCc3NUYWJsZVNldEVudHJ5KHBBZCwgJnBBZC0+U2NhblRhYiwgQnNzaWQsIFNzaWQsIFNzaWRMZW4sIEJzc1R5cGUsIEJlYWNvblBlcmlvZCwKKwkJCQkJCQkJCSZDZlBhcm0sIEF0aW1XaW4sIENhcGFiaWxpdHlJbmZvLCBTdXBSYXRlLCBTdXBSYXRlTGVuLCBFeHRSYXRlLCBFeHRSYXRlTGVuLCAmSHRDYXBhYmlsaXR5LAorCQkJCQkJCQkJJkFkZEh0SW5mbywgSHRDYXBhYmlsaXR5TGVuLCBBZGRIdEluZm9MZW4sIE5ld0V4dENoYW5uZWxPZmZzZXQsIENoYW5uZWwsIFJlYWxSc3NpLCBUaW1lU3RhbXAsIDAsCisJCQkJCQkJCQkmRWRjYVBhcm0sICZRb3NDYXBhYmlsaXR5LCAmUWJzc0xvYWQsIExlblZJRSwgcFZJRSk7CisJCQkJCX0KKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQURIT0MgIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVELlxuIikpOworCQkJCX0KKworCQkJCS8vIEFkLWhvYyBtb2RlIGlzIHVzaW5nIE1BQyBhZGRyZXNzIGFzIEJBIHNlc3Npb24uIFNvIHdlIG5lZWQgdG8gY29udGludW91c2x5IGZpbmQgbmV3bHkgam9pbmVkIGFkaG9jIHN0YXRpb24gYnkgcmVjZWl2aW5nIGJlYWNvbi4KKwkJCQkvLyBUbyBwcmV2ZW50IGFsd2F5cyBjaGVjayB0aGlzLCB3ZSB1c2Ugd2NpZCA9PSBSRVNFUlZFRF9XQ0lEIHRvIHJlY29nbml6ZSBpdCBhcyBuZXdseSBqb2luZWQgYWRob2Mgc3RhdGlvbi4KKwkJCQlpZiAoQURIT0NfT04ocEFkKSAmJiAoRWxlbS0+V2NpZCA9PSBSRVNFUlZFRF9XQ0lEKSkKKwkJCQl7CisJCQkJCVVDSEFSCWlkeDsKKwkJCQkJTUFDX1RBQkxFX0VOVFJZICpwRW50cnk7CisKKwkJCQkJLy8gbG9vayB1cCB0aGUgZXhpc3RpbmcgdGFibGUKKwkJCQkJcEVudHJ5ID0gTWFjVGFibGVMb29rdXAocEFkLCBBZGRyMik7CisJCQkJCWlmIChwRW50cnkgPT0gTlVMTCkKKwkJCQkJeworCQkJCQkJLy8gQW5vdGhlciBhZGhvYyBqb2luaW5nLCBhZGQgdG8gb3VyIE1BQyB0YWJsZS4KKwkJCQkJCXBFbnRyeSA9IE1hY1RhYmxlSW5zZXJ0RW50cnkocEFkLCBBZGRyMiwgQlNTMCwgRkFMU0UpOworCQkJCQkJaWYgKHBFbnRyeSkKKwkJCQkJCXsKKwkJCQkJCQlwRW50cnktPlNzdCA9IFNTVF9BU1NPQzsKKwkJCQkJCQlpZHggPSBwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQ7CisJCQkJCQkJLy8gQWZ0ZXIgSW5zZXJ0RW50cnksIFdyaXRlIHRvIEFTSUMgb24tY2hpcCB0YWJsZS4KKwkJCQkJCQlSVDI4WFhfU1RBX1NFQ1VSSVRZX0lORk9fQUREKHBBZCwgQlNTMCwgaWR4LCBwRW50cnkpOworCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFESE9DICV4OiV4OiV4OiV4OiV4OiV4ICBqb2luIGluLkVudHJ5PSVkXG4iLCBBZGRyMlswXSxBZGRyMlsxXSxBZGRyMlsyXSxBZGRyMlszXSxBZGRyMls0XSxBZGRyMls1XSwgcEVudHJ5LT5BaWQpKTsKKworCQkJCQkJCXBFbnRyeS0+SFRQaHlNb2RlLndvcmQgPSBwQWQtPlN0YUNmZy5IVFBoeU1vZGUud29yZDsKKwkgICAgICAgICAgICAgICAgICAgICAgICBpZiAoSHRDYXBhYmlsaXR5TGVuIDw9IDApCisJICAgICAgICAgICAgICAgICAgICAgICAgeworCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRW50cnktPkhUUGh5TW9kZS5maWVsZC5TVEJDID0gMDsKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuQlcgPSAwOworCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRW50cnktPkhUUGh5TW9kZS5maWVsZC5TaG9ydEdJID0gMDsKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChTdXBSYXRlTGVuK0V4dFJhdGVMZW4gPD0gNCkgJiYgKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPD0gMTQpKQorCSAgICAgICAgCQkJCQl7CisJICAgICAgICAJCQkJCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9DQ0s7CisJICAgICAgICAJCQkJCX0KKwkgICAgICAgIAkJCQkJZWxzZQorCSAgICAgICAgCQkJCQl7CisJICAgICAgICAJCQkJCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9PRkRNOworCSAgICAgICAgCQkJCQl9CisJCQkJCQkJCU1sbWVVcGRhdGVUeFJhdGVzKHBBZCwgRkFMU0UsIDApOworCSAgICAgICAgICAgICAgICAgICAgICAgIH0KKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCQkJCQllbHNlCisJCQkJCQkJeworCQkJCQkJCQlNbG1lVXBkYXRlVHhSYXRlcyhwQWQsIEZBTFNFLCAwKTsKKwkJCQkJCQkJTWxtZVVwZGF0ZUh0VHhSYXRlcyhwQWQsIEJTUzApOworCQkJCQkJCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyNpZm5kZWYgTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQKKwkgICAgICAgICAgICAgICAgICAgICAgICBpZiAocEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQKQorCSAgICAgICAgICAgICAgICAgICAgICAgIHsKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pb24gaXdyZXFfZGF0YSAgICB3cnF1OworCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbmRBc3NvY0lFc1RvV3BhU3VwcGxpY2FudChwQWQpOworCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1zZXQoJndycXUsIDAsIHNpemVvZih3cnF1KSk7CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdycXUuZGF0YS5mbGFncyA9IFJUX0FTU09DX0VWRU5UX0ZMQUc7CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpcmVsZXNzX3NlbmRfZXZlbnQocEFkLT5uZXRfZGV2LCBJV0VWQ1VTVE9NLCAmd3JxdSwgTlVMTCk7CisJICAgICAgICAgICAgICAgICAgICAgICAgfQorI2VuZGlmIC8vIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCisjaWZkZWYgTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQKKwkgICAgICAgICAgICAgICAgICAgICAgICB7CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgICAgd3JxdTsKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2V4dF9ub3RpZnlfZXZlbnRfYXNzb2MocEFkKTsKKworCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1zZXQod3JxdS5hcF9hZGRyLnNhX2RhdGEsIDAsIE1BQ19BRERSX0xFTik7CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweSh3cnF1LmFwX2FkZHIuc2FfZGF0YSwgcEFkLT5NbG1lQXV4LkJzc2lkLCBNQUNfQUREUl9MRU4pOworCSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXJlbGVzc19zZW5kX2V2ZW50KHBBZC0+bmV0X2RldiwgU0lPQ0dJV0FQLCAmd3JxdSwgTlVMTCk7CisKKwkgICAgICAgICAgICAgICAgICAgICAgICB9CisjZW5kaWYgLy8gTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0KKworCQkJaWYgKElORlJBX09OKHBBZCkpCisJCQl7CisJCQkJQk9PTEVBTiBiVXNlU2hvcnRTbG90LCBiVXNlQkdQcm90ZWN0aW9uOworCisJCQkJLy8gZGVjaWRlIHRvIHVzZS9jaGFuZ2UgdG8gLQorCQkJCS8vICAgICAgMS4gbG9uZyBzbG90ICgyMCB1cykgb3Igc2hvcnQgc2xvdCAoOSB1cykgdGltZQorCQkJCS8vICAgICAgMi4gdHVybiBvbi9vZmYgUlRTL0NUUyBhbmQvb3IgQ1RTLXRvLXNlbGYgcHJvdGVjdGlvbgorCQkJCS8vICAgICAgMy4gc2hvcnQgcHJlYW1ibGUKKworCQkJCS8vYlVzZVNob3J0U2xvdCA9IHBBZC0+Q29tbW9uQ2ZnLmJVc2VTaG9ydFNsb3RUaW1lICYmIENBUF9JU19TSE9SVF9TTE9UKENhcGFiaWxpdHlJbmZvKTsKKwkJCQliVXNlU2hvcnRTbG90ID0gQ0FQX0lTX1NIT1JUX1NMT1QoQ2FwYWJpbGl0eUluZm8pOworCQkJCWlmIChiVXNlU2hvcnRTbG90ICE9IE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfU0hPUlRfU0xPVF9JTlVTRUQpKQorCQkJCQlBc2ljU2V0U2xvdFRpbWUocEFkLCBiVXNlU2hvcnRTbG90KTsKKworCQkJCWJVc2VCR1Byb3RlY3Rpb24gPSAocEFkLT5Db21tb25DZmcuVXNlQkdQcm90ZWN0aW9uID09IDEpIHx8ICAgIC8vIGFsd2F5cyB1c2UKKwkJCQkJCQkJICAgKChwQWQtPkNvbW1vbkNmZy5Vc2VCR1Byb3RlY3Rpb24gPT0gMCkgJiYgRVJQX0lTX1VTRV9QUk9URUNUSU9OKEVycCkpOworCisJCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPiAxNCkgLy8gYWx3YXlzIG5vIEJHIHByb3RlY3Rpb24gaW4gQS1iYW5kLiBmYWxzZWx5IGhhcHBlbmVkIHdoZW4gc3dpdGNoaW5nIEEvRyBiYW5kIHRvIGEgZHVhbC1iYW5kIEFQCisJCQkJCWJVc2VCR1Byb3RlY3Rpb24gPSBGQUxTRTsKKworCQkJCWlmIChiVXNlQkdQcm90ZWN0aW9uICE9IE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQkdfUFJPVEVDVElPTl9JTlVTRUQpKQorCQkJCXsKKwkJCQkJaWYgKGJVc2VCR1Byb3RlY3Rpb24pCisJCQkJCXsKKwkJCQkJCU9QU1RBVFVTX1NFVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19CR19QUk9URUNUSU9OX0lOVVNFRCk7CisJCQkJCQlBc2ljVXBkYXRlUHJvdGVjdChwQWQsIHBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi5PcGVyYWlvbk1vZGUsIChPRkRNU0VUUFJPVEVDVHxDQ0tTRVRQUk9URUNUfEFMTE5fU0VUUFJPVEVDVCksRkFMU0UsKHBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi5Ob25HZlByZXNlbnQgPT0gMSkpOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQkdfUFJPVEVDVElPTl9JTlVTRUQpOworCQkJCQkJQXNpY1VwZGF0ZVByb3RlY3QocEFkLCBwQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzIuT3BlcmFpb25Nb2RlLCAoT0ZETVNFVFBST1RFQ1R8Q0NLU0VUUFJPVEVDVHxBTExOX1NFVFBST1RFQ1QpLFRSVUUsKHBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi5Ob25HZlByZXNlbnQgPT0gMSkpOworCQkJCQl9CisKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfV0FSTiwgKCJTWU5DIC0gQVAgY2hhbmdlZCBCL0cgcHJvdGVjdGlvbiB0byAlZFxuIiwgYlVzZUJHUHJvdGVjdGlvbikpOworCQkJCX0KKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJCS8vIGNoZWNrIEh0IHByb3RlY3Rpb24gbW9kZS4gYW5kIGFkaGVyZSB0byB0aGUgTm9uLUdGIGRldmljZSBpbmRpY2F0aW9uIGJ5IEFQLgorCQkJCWlmICgoQWRkSHRJbmZvTGVuICE9IDApICYmCisJCQkJCSgoQWRkSHRJbmZvLkFkZEh0SW5mbzIuT3BlcmFpb25Nb2RlICE9IHBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi5PcGVyYWlvbk1vZGUpIHx8CisJCQkJCShBZGRIdEluZm8uQWRkSHRJbmZvMi5Ob25HZlByZXNlbnQgIT0gcEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLk5vbkdmUHJlc2VudCkpKQorCQkJCXsKKwkJCQkJcEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLk5vbkdmUHJlc2VudCA9IEFkZEh0SW5mby5BZGRIdEluZm8yLk5vbkdmUHJlc2VudDsKKwkJCQkJcEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLk9wZXJhaW9uTW9kZSA9IEFkZEh0SW5mby5BZGRIdEluZm8yLk9wZXJhaW9uTW9kZTsKKwkJCQkJaWYgKHBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi5Ob25HZlByZXNlbnQgPT0gMSkKKwkJCQl7CisJCQkJCQlBc2ljVXBkYXRlUHJvdGVjdChwQWQsIHBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi5PcGVyYWlvbk1vZGUsIEFMTE5fU0VUUFJPVEVDVCwgRkFMU0UsIFRSVUUpOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJCUFzaWNVcGRhdGVQcm90ZWN0KHBBZCwgcEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLk9wZXJhaW9uTW9kZSwgQUxMTl9TRVRQUk9URUNULCBGQUxTRSwgRkFMU0UpOworCisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNZTkMgLSBBUCBjaGFuZ2VkIE4gT3BlcmFpb25Nb2RlIHRvICVkXG4iLCBwQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzIuT3BlcmFpb25Nb2RlKSk7CisJCQkJfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJCQkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfU0hPUlRfUFJFQU1CTEVfSU5VU0VEKSAmJgorCQkJCQlFUlBfSVNfVVNFX0JBUktFUl9QUkVBTUJMRShFcnApKQorCQkJCXsKKwkJCQkJTWxtZVNldFR4UHJlYW1ibGUocEFkLCBSdDgwMl8xMVByZWFtYmxlTG9uZyk7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNZTkMgLSBBUCBmb3JjZWQgdG8gdXNlIExPTkcgcHJlYW1ibGVcbiIpKTsKKwkJCQl9CisKKwkJCQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19XTU1fSU5VU0VEKSAgICAmJgorCQkJCQkoRWRjYVBhcm0uYlZhbGlkID09IFRSVUUpICAgICAgICAgICAgICAgICAgICAgICAgICAmJgorCQkJCQkoRWRjYVBhcm0uRWRjYVVwZGF0ZUNvdW50ICE9IHBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uRWRjYVVwZGF0ZUNvdW50KSkKKwkJCQl7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNZTkMgLSBBUCBjaGFuZ2UgRURDQSBwYXJhbWV0ZXJzKGZyb20gJWQgdG8gJWQpXG4iLAorCQkJCQkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5FZGNhVXBkYXRlQ291bnQsCisJCQkJCQlFZGNhUGFybS5FZGNhVXBkYXRlQ291bnQpKTsKKwkJCQkJQXNpY1NldEVkY2FQYXJtKHBBZCwgJkVkY2FQYXJtKTsKKwkJCQl9CisKKwkJCQkvLyBjb3B5IFFPUyByZWxhdGVkIGluZm9ybWF0aW9uCisJCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+Q29tbW9uQ2ZnLkFQUWJzc0xvYWQsICZRYnNzTG9hZCwgc2l6ZW9mKFFCU1NfTE9BRF9QQVJNKSk7CisJCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+Q29tbW9uQ2ZnLkFQUW9zQ2FwYWJpbGl0eSwgJlFvc0NhcGFiaWxpdHksIHNpemVvZihRT1NfQ0FQQUJJTElUWV9QQVJNKSk7CisJCQl9CisKKwkJCS8vIG9ubHkgSU5GUkFTVFJVQ1RVUkUgbW9kZSBzdXBwb3J0IHBvd2VyLXNhdmluZyBmZWF0dXJlCisJCQlpZiAoKElORlJBX09OKHBBZCkgJiYgKHBBZC0+U3RhQ2ZnLlBzbSA9PSBQV1JfU0FWRSkpIHx8IChwQWQtPkNvbW1vbkNmZy5iQVBTREZvcmNlUG93ZXJTYXZlKSkKKwkJCXsKKwkJCQlVQ0hBUiBGcmVlTnVtYmVyOworCQkJCS8vICAxLiBBUCBoYXMgYmFja2xvZ2dlZCB1bmljYXN0LXRvLW1lIGZyYW1lLCBzdGF5IEFXQUtFLCBzZW5kIFBTUE9MTAorCQkJCS8vICAyLiBBUCBoYXMgYmFja2xvZ2dlZCBicm9hZGNhc3QvbXVsdGljYXN0IGZyYW1lIGFuZCB3ZSB3YW50IHRob3NlIGZyYW1lcywgc3RheSBBV0FLRQorCQkJCS8vICAzLiB3ZSBoYXZlIG91dGdvaW5nIGZyYW1lcyBpbiBUeFJpbmcgb3IgTWdtdFJpbmcsIGJldHRlciBzdGF5IEFXQUtFCisJCQkJLy8gIDQuIFBzbSBjaGFuZ2UgdG8gUFdSX1NBVkUsIGJ1dCBBUCBub3QgYmVlbiBpbmZvcm1lZCB5ZXQsIHdlIGJldHRlciBzdGF5IEFXQUtFCisJCQkJLy8gIDUuIG90aGVyd2lzZSwgcHV0IFBIWSBiYWNrIHRvIHNsZWVwIHRvIHNhdmUgYmF0dGVyeS4KKwkJCQlpZiAoTWVzc2FnZVRvTWUpCisJCQkJeworI2lmZGVmIFJUMjg2MAorCQkJCQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19BRFZBTkNFX1BPV0VSX1NBVkVfUENJRV9ERVZJQ0UpKQorCQkJCQl7CisJCQkJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCBwQWQtPlN0YUNmZy5CQlBSMyk7CisJCQkJCQkvLyBUdXJuIGNsayB0byA4ME1oei4KKwkJCQkJfQorI2VuZGlmIC8vIFJUMjg2MCAvLworCQkJCQlpZiAocEFkLT5Db21tb25DZmcuYkFQU0RDYXBhYmxlICYmIHBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uYkFQU0RDYXBhYmxlICYmCisJCQkJCQlwQWQtPkNvbW1vbkNmZy5iQVBTREFDX0JFICYmIHBBZC0+Q29tbW9uQ2ZnLmJBUFNEQUNfQksgJiYgcEFkLT5Db21tb25DZmcuYkFQU0RBQ19WSSAmJiBwQWQtPkNvbW1vbkNmZy5iQVBTREFDX1ZPKQorCQkJCQl7CisJCQkJCQlwQWQtPkNvbW1vbkNmZy5iTmVlZFNlbmRUcmlnZ2VyRnJhbWUgPSBUUlVFOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJCVJUMjhYWF9QU19QT0xMX0VOUVVFVUUocEFkKTsKKwkJCQl9CisJCQkJZWxzZSBpZiAoQmNhc3RGbGFnICYmIChEdGltQ291bnQgPT0gMCkgJiYgT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19SRUNFSVZFX0RUSU0pKQorCQkJCXsKKyNpZmRlZiBSVDI4NjAKKwkJCQkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQURWQU5DRV9QT1dFUl9TQVZFX1BDSUVfREVWSUNFKSkKKwkJCQkJeworCQkJCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgcEFkLT5TdGFDZmcuQkJQUjMpOworCQkJCQl9CisjZW5kaWYgLy8gUlQyODYwIC8vCisJCQkJfQorCQkJCWVsc2UgaWYgKChwQWQtPlR4U3dRdWV1ZVtRSURfQUNfQktdLk51bWJlciAhPSAwKQkJCQkJCQkJCQkJCQl8fAorCQkJCQkJKHBBZC0+VHhTd1F1ZXVlW1FJRF9BQ19CRV0uTnVtYmVyICE9IDApCQkJCQkJCQkJCQkJCQl8fAorCQkJCQkJKHBBZC0+VHhTd1F1ZXVlW1FJRF9BQ19WSV0uTnVtYmVyICE9IDApCQkJCQkJCQkJCQkJCQl8fAorCQkJCQkJKHBBZC0+VHhTd1F1ZXVlW1FJRF9BQ19WT10uTnVtYmVyICE9IDApCQkJCQkJCQkJCQkJCQl8fAorCQkJCQkJKFJUTVBGcmVlVFhEUmVxdWVzdChwQWQsIFFJRF9BQ19CSywgVFhfUklOR19TSVpFIC0gMSwgJkZyZWVOdW1iZXIpICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCXx8CisJCQkJCQkoUlRNUEZyZWVUWERSZXF1ZXN0KHBBZCwgUUlEX0FDX0JFLCBUWF9SSU5HX1NJWkUgLSAxLCAmRnJlZU51bWJlcikgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykJfHwKKwkJCQkJCShSVE1QRnJlZVRYRFJlcXVlc3QocEFkLCBRSURfQUNfVkksIFRYX1JJTkdfU0laRSAtIDEsICZGcmVlTnVtYmVyKSAhPSBORElTX1NUQVRVU19TVUNDRVNTKQl8fAorCQkJCQkJKFJUTVBGcmVlVFhEUmVxdWVzdChwQWQsIFFJRF9BQ19WTywgVFhfUklOR19TSVpFIC0gMSwgJkZyZWVOdW1iZXIpICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCXx8CisJCQkJCQkoUlRNUEZyZWVUWERSZXF1ZXN0KHBBZCwgUUlEX01HTVQsIE1HTVRfUklOR19TSVpFIC0gMSwgJkZyZWVOdW1iZXIpICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpKQorCQkJCXsKKwkJCQkJLy8gVE9ETzogY29uc2lkZXIgc2NoZWR1bGVkIEhDQ0EuIG1pZ2h0IG5vdCBiZSBwcm9wZXIgdG8gdXNlIHRyYWRpdGlvbmFsIERUSU0tYmFzZWQgcG93ZXItc2F2aW5nIHNjaGVtZQorCQkJCQkvLyBjYW4gd2UgY2hlYXQgaGVyZSAoaS5lLiBqdXN0IGNoZWNrIE1HTVQgJiBBQ19CRSkgZm9yIGJldHRlciBwZXJmb3JtYW5jZT8KKyNpZmRlZiBSVDI4NjAKKwkJCQkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQURWQU5DRV9QT1dFUl9TQVZFX1BDSUVfREVWSUNFKSkKKwkJCQkJeworCQkJCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgcEFkLT5TdGFDZmcuQkJQUjMpOworCQkJCQl9CisjZW5kaWYgLy8gUlQyODYwIC8vCisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCVVTSE9SVCBOZXh0RHRpbSA9IER0aW1Db3VudDsKKworCQkJCQlpZiAoTmV4dER0aW0gPT0gMCkKKwkJCQkJCU5leHREdGltID0gRHRpbVBlcmlvZDsKKworCQkJCQlUYnR0TnVtVG9OZXh0V2FrZVVwID0gcEFkLT5TdGFDZmcuRGVmYXVsdExpc3RlbkNvdW50OworCQkJCQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19SRUNFSVZFX0RUSU0pICYmIChUYnR0TnVtVG9OZXh0V2FrZVVwID4gTmV4dER0aW0pKQorCQkJCQkJVGJ0dE51bVRvTmV4dFdha2VVcCA9IE5leHREdGltOworCisJCQkJCWlmICghT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKSkKKwkJCQkJeworCQkJCQkJQXNpY1NsZWVwVGhlbkF1dG9XYWtldXAocEFkLCBUYnR0TnVtVG9OZXh0V2FrZVVwKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQkvLyBub3QgbXkgQlNTSUQsIGlnbm9yZSBpdAorCX0KKwkvLyBzYW5pdHkgY2hlY2sgZmFpbCwgaWdub3JlIHRoaXMgZnJhbWUKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlSZWNlaXZlIFBST0JFIFJFUSBmcm9tIHJlbW90ZSBwZWVyIHdoZW4gb3BlcmF0aW5nIGluIElCU1MgbW9kZQorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgUGVlclByb2JlUmVxQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlVQ0hBUiAgICAgICAgIEFkZHIyW01BQ19BRERSX0xFTl07CisJQ0hBUiAgICAgICAgICBTc2lkW01BWF9MRU5fT0ZfU1NJRF07CisJVUNIQVIgICAgICAgICBTc2lkTGVuOworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCVVDSEFSCQkgIEh0TGVuLCBBZGRIdExlbiwgTmV3RXh0TGVuOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCUhFQURFUl84MDJfMTEgUHJvYmVSc3BIZHI7CisJTkRJU19TVEFUVVMgICBOU3RhdHVzOworCVBVQ0hBUiAgICAgICAgcE91dEJ1ZmZlciA9IE5VTEw7CisJVUxPTkcgICAgICAgICBGcmFtZUxlbiA9IDA7CisJTEFSR0VfSU5URUdFUiBGYWtlVGltZXN0YW1wOworCVVDSEFSICAgICAgICAgRHNMZW4gPSAxLCBJYnNzTGVuID0gMjsKKwlVQ0hBUiAgICAgICAgIExvY2FsRXJwSWVbM10gPSB7SUVfRVJQLCAxLCAwfTsKKwlCT09MRUFOICAgICAgIFByaXZhY3k7CisJVVNIT1JUICAgICAgICBDYXBhYmlsaXR5SW5mbzsKKwlVQ0hBUgkJICBSU05JZSA9IElFX1dQQTsKKworCWlmICghIEFESE9DX09OKHBBZCkpCisJCXJldHVybjsKKworCWlmIChQZWVyUHJvYmVSZXFTYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbiwgQWRkcjIsIFNzaWQsICZTc2lkTGVuKSkKKwl7CisJCWlmICgoU3NpZExlbiA9PSAwKSB8fCBTU0lEX0VRVUFMKFNzaWQsIFNzaWRMZW4sIHBBZC0+Q29tbW9uQ2ZnLlNzaWQsIHBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW4pKQorCQl7CisJCQkvLyBhbGxvY2F0ZSBhbmQgc2VuZCBvdXQgUHJvYmVSc3AgZnJhbWUKKwkJCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5CisJCQlpZiAoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCQkJCXJldHVybjsKKworCQkJLy9wQWQtPlN0YUNmZy5BdGltV2luID0gMDsgIC8vID8/Pz8/PworCisJCQlQcml2YWN5ID0gKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjFFbmFibGVkKSB8fAorCQkJCQkgIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkgfHwKKwkJCQkJICAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpOworCQkJQ2FwYWJpbGl0eUluZm8gPSBDQVBfR0VORVJBVEUoMCwgMSwgUHJpdmFjeSwgKHBBZC0+Q29tbW9uQ2ZnLlR4UHJlYW1ibGUgPT0gUnQ4MDJfMTFQcmVhbWJsZVNob3J0KSwgMCwgMCk7CisKKwkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAgICAgICAgICAgICZGcmFtZUxlbiwKKwkJCQkJCQkgIHNpemVvZihIRUFERVJfODAyXzExKSwgICAgICAgICZQcm9iZVJzcEhkciwKKwkJCQkJCQkgIFRJTUVTVEFNUF9MRU4sICAgICAgICAgICAgICAgICZGYWtlVGltZXN0YW1wLAorCQkJCQkJCSAgMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBBZC0+Q29tbW9uQ2ZnLkJlYWNvblBlcmlvZCwKKwkJCQkJCQkgIDIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDYXBhYmlsaXR5SW5mbywKKwkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTc2lkSWUsCisJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEFkLT5Db21tb25DZmcuU3NpZExlbiwKKwkJCQkJCQkgIHBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW4sICAgICAgIHBBZC0+Q29tbW9uQ2ZnLlNzaWQsCisJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3VwUmF0ZUllLAorCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBBZC0+U3RhQWN0aXZlLlN1cFJhdGVMZW4sCisJCQkJCQkJICBwQWQtPlN0YUFjdGl2ZS5TdXBSYXRlTGVuLCAgICBwQWQtPlN0YUFjdGl2ZS5TdXBSYXRlLAorCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkRzSWUsCisJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAmRHNMZW4sCisJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEFkLT5Db21tb25DZmcuQ2hhbm5lbCwKKwkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICZJYnNzSWUsCisJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAmSWJzc0xlbiwKKwkJCQkJCQkgIDIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQWQtPlN0YUFjdGl2ZS5BdGltV2luLAorCQkJCQkJCSAgRU5EX09GX0FSR1MpOworCisJCQlpZiAocEFkLT5TdGFBY3RpdmUuRXh0UmF0ZUxlbikKKwkJCXsKKwkJCQlVTE9ORyB0bXA7CisJCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAgICAgICAgJnRtcCwKKwkJCQkJCQkJICAzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NhbEVycEllLAorCQkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICZFeHRSYXRlSWUsCisJCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBBZC0+U3RhQWN0aXZlLkV4dFJhdGVMZW4sCisJCQkJCQkJCSAgcEFkLT5TdGFBY3RpdmUuRXh0UmF0ZUxlbiwgICAgJnBBZC0+U3RhQWN0aXZlLkV4dFJhdGUsCisJCQkJCQkJCSAgRU5EX09GX0FSR1MpOworCQkJCUZyYW1lTGVuICs9IHRtcDsKKwkJCX0KKworCQkJLy8gSWYgYWRob2Mgc2VjcnVpdHkgaXMgc2V0IGZvciBXUEEtTm9uZSwgYXBwZW5kIHRoZSBjaXBoZXIgc3VpdGUgSUUKKwkJCWlmIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lKQorCQkJeworCQkJCVVMT05HIHRtcDsKKwkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sICAgICAgICAJJnRtcCwKKwkJCQkJCSAgCQkJMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmUlNOSWUsCisJCQkJCQkgIAkJCTEsICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkmcEFkLT5TdGFDZmcuUlNOSUVfTGVuLAorCQkJCQkJICAJCQlwQWQtPlN0YUNmZy5SU05JRV9MZW4sICAgICAgCXBBZC0+U3RhQ2ZnLlJTTl9JRSwKKwkJCQkJCSAgCQkJRU5EX09GX0FSR1MpOworCQkJCUZyYW1lTGVuICs9IHRtcDsKKwkJCX0KKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCWlmIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID49IFBIWV8xMUFCR05fTUlYRUQpCisJCQl7CisJCQkJVUxPTkcgVG1wTGVuOworCQkJCVVDSEFSCUJST0FEQ09NWzRdID0gezB4MCwgMHg5MCwgMHg0YywgMHgzM307CisJCQkJSHRMZW4gPSBzaXplb2YocEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5KTsKKwkJCQlBZGRIdExlbiA9IHNpemVvZihwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8pOworCQkJCU5ld0V4dExlbiA9IDE7CisJCQkJLy9OZXcgZXh0ZW5zaW9uIGNoYW5uZWwgb2Zmc2V0IElFIGlzIGluY2x1ZGVkIGluIEJlYWNvbiwgUHJvYmUgUnNwIG9yIGNoYW5uZWwgU3dpdGNoIEFubm91bmNlbWVudCBGcmFtZQorCQkJCWlmIChwQWQtPmJCcm9hZENvbUhUID09IFRSVUUpCisJCQkJeworCQkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sICAgICAgICAgICAgJlRtcExlbiwKKwkJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJldwYUllLAorCQkJCQkJCQkgIDQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQlJPQURDT01bMF0sCisJCQkJCQkJCSBwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5TGVuLCAgICAgICAgICAmcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eSwKKwkJCQkJCQkJICBFTkRfT0ZfQVJHUyk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAgICAgICAgICAgICZUbXBMZW4sCisJCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZIdENhcEllLAorCQkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmSHRMZW4sCisJCQkJCQkJCSBzaXplb2YoSFRfQ0FQQUJJTElUWV9JRSksICAgICAgICAgICZwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHksCisJCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZBZGRIdEluZm9JZSwKKwkJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkFkZEh0TGVuLAorCQkJCQkJCQkgc2l6ZW9mKEFERF9IVF9JTkZPX0lFKSwgICAgICAgICAgJnBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mbywKKwkJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJk5ld0V4dENoYW5JZSwKKwkJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJk5ld0V4dExlbiwKKwkJCQkJCQkJIHNpemVvZihORVdfRVhUX0NIQU5fSUUpLCAgICAgICAgICAmcEFkLT5Db21tb25DZmcuTmV3RXh0Q2hhbk9mZnNldCwKKwkJCQkJCQkJICBFTkRfT0ZfQVJHUyk7CisJCQkJfQorCQkJCUZyYW1lTGVuICs9IFRtcExlbjsKKwkJCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgMCwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOworCQkJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKKwkJfQorCX0KK30KKworVk9JRCBCZWFjb25UaW1lb3V0QXRKb2luQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlVU0hPUlQgU3RhdHVzOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNZTkMgLSBCZWFjb25UaW1lb3V0QXRKb2luQWN0aW9uXG4iKSk7CisJcEFkLT5NbG1lLlN5bmNNYWNoaW5lLkN1cnJTdGF0ZSA9IFNZTkNfSURMRTsKKwlTdGF0dXMgPSBNTE1FX1JFSl9USU1FT1VUOworCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9KT0lOX0NPTkYsIDIsICZTdGF0dXMpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVNjYW4gdGltZW91dCBwcm9jZWR1cmUuIGJhc2ljYWxseSBhZGQgY2hhbm5lbCBpbmRleCBieSAxIGFuZCByZXNjYW4KKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIFNjYW5UaW1lb3V0QWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlwQWQtPk1sbWVBdXguQ2hhbm5lbCA9IE5leHRDaGFubmVsKHBBZCwgcEFkLT5NbG1lQXV4LkNoYW5uZWwpOworCisJLy8gT25seSBvbmUgY2hhbm5lbCBzY2FubmVkIGZvciBDSVNDTyBiZWFjb24gcmVxdWVzdAorCWlmICgocEFkLT5NbG1lQXV4LlNjYW5UeXBlID09IFNDQU5fQ0lTQ09fQUNUSVZFKSB8fAorCQkocEFkLT5NbG1lQXV4LlNjYW5UeXBlID09IFNDQU5fQ0lTQ09fUEFTU0lWRSkgfHwKKwkJKHBBZC0+TWxtZUF1eC5TY2FuVHlwZSA9PSBTQ0FOX0NJU0NPX05PSVNFKSB8fAorCQkocEFkLT5NbG1lQXV4LlNjYW5UeXBlID09IFNDQU5fQ0lTQ09fQ0hBTk5FTF9MT0FEKSkKKwkJcEFkLT5NbG1lQXV4LkNoYW5uZWwgPSAwOworCisJLy8gdGhpcyByb3V0aW5lIHdpbGwgc3RvcCBpZiBwQWQtPk1sbWVBdXguQ2hhbm5lbCA9PSAwCisJU2Nhbk5leHRDaGFubmVsKHBBZCk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIEludmFsaWRTdGF0ZVdoZW5TY2FuKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlVU0hPUlQgU3RhdHVzOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFZTkMgLSBJbnZhbGlkU3RhdGVXaGVuU2NhbihzdGF0ZT0lbGQpLiBSZXNldCBTWU5DIG1hY2hpbmVcbiIsIHBBZC0+TWxtZS5TeW5jTWFjaGluZS5DdXJyU3RhdGUpKTsKKwlwQWQtPk1sbWUuU3luY01hY2hpbmUuQ3VyclN0YXRlID0gU1lOQ19JRExFOworCVN0YXR1cyA9IE1MTUVfU1RBVEVfTUFDSElORV9SRUpFQ1Q7CisJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX1NDQU5fQ09ORiwgMiwgJlN0YXR1cyk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIEludmFsaWRTdGF0ZVdoZW5Kb2luKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlVU0hPUlQgU3RhdHVzOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkludmFsaWRTdGF0ZVdoZW5Kb2luKHN0YXRlPSVsZCkuIFJlc2V0IFNZTkMgbWFjaGluZVxuIiwgcEFkLT5NbG1lLlN5bmNNYWNoaW5lLkN1cnJTdGF0ZSkpOworCXBBZC0+TWxtZS5TeW5jTWFjaGluZS5DdXJyU3RhdGUgPSBTWU5DX0lETEU7CisJU3RhdHVzID0gTUxNRV9TVEFURV9NQUNISU5FX1JFSkVDVDsKKwlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfSk9JTl9DT05GLCAyLCAmU3RhdHVzKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgSW52YWxpZFN0YXRlV2hlblN0YXJ0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlVU0hPUlQgU3RhdHVzOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkludmFsaWRTdGF0ZVdoZW5TdGFydChzdGF0ZT0lbGQpLiBSZXNldCBTWU5DIG1hY2hpbmVcbiIsIHBBZC0+TWxtZS5TeW5jTWFjaGluZS5DdXJyU3RhdGUpKTsKKwlwQWQtPk1sbWUuU3luY01hY2hpbmUuQ3VyclN0YXRlID0gU1lOQ19JRExFOworCVN0YXR1cyA9IE1MTUVfU1RBVEVfTUFDSElORV9SRUpFQ1Q7CisJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX1NUQVJUX0NPTkYsIDIsICZTdGF0dXMpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgRW5xdWV1ZVBzUG9sbCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKyNpZmRlZiBSQUxJTktfQVRFCisgICAgaWYgKEFURV9PTihwQWQpKQorICAgIHsKKwkJcmV0dXJuOworICAgIH0KKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisKKworCWlmIChwQWQtPlN0YUNmZy5XaW5kb3dzUG93ZXJNb2RlID09IE5kaXM4MDJfMTFQb3dlck1vZGVMZWdhY3lfUFNQKQorICAgIAlwQWQtPlBzUG9sbEZyYW1lLkZDLlB3ck1nbXQgPSBQV1JfU0FWRTsKKwlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIDAsIChQVUNIQVIpJnBBZC0+UHNQb2xsRnJhbWUsIHNpemVvZihQU1BPTExfRlJBTUUpKTsKK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBFbnF1ZXVlUHJvYmVSZXF1ZXN0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCU5ESVNfU1RBVFVTICAgICBOU3RhdGU7CisJUFVDSEFSICAgICAgICAgIHBPdXRCdWZmZXI7CisJVUxPTkcgICAgICAgICAgIEZyYW1lTGVuID0gMDsKKwlIRUFERVJfODAyXzExICAgSGRyODAyMTE7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJmb3JjZSBvdXQgYSBQcm9iZVJlcXVlc3QgLi4uXG4iKSk7CisKKwlOU3RhdGUgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5CisJaWYgKE5TdGF0ZSA9PSBORElTX1NUQVRVU19TVUNDRVNTKQorCXsKKwkJTWd0TWFjSGVhZGVySW5pdChwQWQsICZIZHI4MDIxMSwgU1VCVFlQRV9QUk9CRV9SRVEsIDAsIEJST0FEQ0FTVF9BRERSLCBCUk9BRENBU1RfQUREUik7CisKKwkJLy8gdGhpcyBQcm9iZVJlcXVlc3QgZXhwbGljaXRseSBzcGVjaWZ5IFNTSUQgdG8gcmVkdWNlIHVud2FudGVkIFByb2JlUmVzcG9uc2UKKwkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICAgICAgICAgICAgICAmRnJhbWVMZW4sCisJCQkJCQkgIHNpemVvZihIRUFERVJfODAyXzExKSwgICAgICAgICAgJkhkcjgwMjExLAorCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTc2lkSWUsCisJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW4sCisJCQkJCQkgIHBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW4sCQkgIHBBZC0+Q29tbW9uQ2ZnLlNzaWQsCisJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN1cFJhdGVJZSwKKwkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEFkLT5TdGFBY3RpdmUuU3VwUmF0ZUxlbiwKKwkJCQkJCSAgcEFkLT5TdGFBY3RpdmUuU3VwUmF0ZUxlbiwgICAgICBwQWQtPlN0YUFjdGl2ZS5TdXBSYXRlLAorCQkJCQkJICBFTkRfT0ZfQVJHUyk7CisJCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgMCwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOworCQlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOworCX0KKworfQorCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisjaWZkZWYgRE9UMTFOX0RSQUZUMworVk9JRCBCdWlsZEVmZmVjdGVkQ2hhbm5lbExpc3QoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJVUNIQVIJCUVDaGFubmVsWzExXTsKKwlVQ0hBUgkJaSwgaiwgazsKKwlVQ0hBUgkJVXBwZXJDaGFubmVsID0gMCwgTG93ZXJDaGFubmVsID0gMDsKKworCVJUTVBaZXJvTWVtb3J5KEVDaGFubmVsLCAxMSk7CisJaSA9IDA7CisJLy8gRmluZCB1cHBlciBjaGFubmVsIGFuZCBsb3dlciBjaGFubmVsLgorCWlmIChwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA8IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpCisJeworCQlVcHBlckNoYW5uZWwgPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsOworCQlMb3dlckNoYW5uZWwgPSBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbDsKKwl9CisJZWxzZSBpZiAocEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPiBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKQorCXsKKwkJVXBwZXJDaGFubmVsID0gcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWw7CisJCUxvd2VyQ2hhbm5lbCA9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWw7CisJfQorCWVsc2UKKwl7CisJCXJldHVybjsKKwl9CisKKwkvLyBSZWNvcmQgY2hhbm5lbHMgdGhhdCBpcyBiZWxvdyBsb3dlciBjaGFubmVsLi4KKwlpZiAoTG93ZXJDaGFubmVsID4gMSkKKwl7CisJCUVDaGFubmVsWzBdID0gTG93ZXJDaGFubmVsIC0gMTsKKwkJaSA9IDE7CisJCWlmIChMb3dlckNoYW5uZWwgPiAyKQorCQl7CisJCQlFQ2hhbm5lbFsxXSA9IExvd2VyQ2hhbm5lbCAtIDI7CisJCQlpID0gMjsKKwkJCWlmIChMb3dlckNoYW5uZWwgPiAzKQorCQkJeworCQkJCUVDaGFubmVsWzJdID0gTG93ZXJDaGFubmVsIC0gMzsKKwkJCQlpID0gMzsKKwkJCX0KKwkJfQorCX0KKwkvLyBSZWNvcmQgY2hhbm5lbHMgdGhhdCBpcyBiZXR3ZWVuICBsb3dlciBjaGFubmVsIGFuZCB1cHBlciBjaGFubmVsLgorCWZvciAoayA9IExvd2VyQ2hhbm5lbDtrIDwgVXBwZXJDaGFubmVsO2srKykKKwl7CisJCUVDaGFubmVsW2ldID0gazsKKwkJaSsrOworCX0KKwkvLyBSZWNvcmQgY2hhbm5lbHMgdGhhdCBpcyBhYm92ZSB1cHBlciBjaGFubmVsLi4KKwlpZiAoTG93ZXJDaGFubmVsIDwgMTEpCisJeworCQlFQ2hhbm5lbFtpXSA9IFVwcGVyQ2hhbm5lbCArIDE7CisJCWkrKzsKKwkJaWYgKExvd2VyQ2hhbm5lbCA8IDEwKQorCQl7CisJCQlFQ2hhbm5lbFtpXSA9IExvd2VyQ2hhbm5lbCArIDI7CisJCQlpKys7CisJCQlpZiAoTG93ZXJDaGFubmVsIDwgOSkKKwkJCXsKKwkJCQlFQ2hhbm5lbFtpXSA9IExvd2VyQ2hhbm5lbCArIDM7CisJCQkJaSsrOworCQkJfQorCQl9CisJfQorCS8vCisJZm9yIChqID0gMDtqIDwgaTtqKyspCisJeworCQlmb3IgKGsgPSAwO2sgPCBwQWQtPkNoYW5uZWxMaXN0TnVtO2srKykKKwkJeworCQkJaWYgKHBBZC0+Q2hhbm5lbExpc3Rba10uQ2hhbm5lbCA9PSBFQ2hhbm5lbFtqXSkKKwkJCXsKKwkJCQlwQWQtPkNoYW5uZWxMaXN0W2tdLmJFZmZlY3RlZENoYW5uZWwgPSBUUlVFOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiIEVmZmVjdGVkQ2hhbm5lbCggPSVkKVxuIiwgRUNoYW5uZWxbal0pKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KK30KKyNlbmRpZiAvLyBET1QxMU5fRFJBRlQzIC8vCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKK0JPT0xFQU4gU2NhblJ1bm5pbmcoCisJCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCXJldHVybiAocEFkLT5NbG1lLlN5bmNNYWNoaW5lLkN1cnJTdGF0ZSA9PSBTQ0FOX0xJU1RFTikgPyBUUlVFIDogRkFMU0U7Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3RhL3dwYS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zdGEvd3BhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzc0YzY1NgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3RhL3dwYS5jCkBAIC0wLDAgKzEsMjA4NiBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwlNb2R1bGUgTmFtZToKKwl3cGEuYworCisJQWJzdHJhY3Q6CisKKwlSZXZpc2lvbiBIaXN0b3J5OgorCVdobwkJCVdoZW4JCQlXaGF0CisJLS0tLS0tLS0JLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCUphbglMZWUJCTAzLTA3LTIyCQlJbml0aWFsCisJUGF1bCBMaW4JMDMtMTEtMjgJCU1vZGlmeSBmb3Igc3VwcGxpY2FudAorKi8KKyNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKKworI2RlZmluZQkJV1BBUlNOSUUJMHhkZAorI2RlZmluZQkJV1BBMlJTTklFCTB4MzAKKworLy9leHRlcm4gVUNIQVIgQklUOFtdOworVUNIQVIJQ2lwaGVyV3BhUHNrVGtpcFtdID0geworCQkweERELCAweDE2LAkJCQkvLyBSU04gSUUKKwkJMHgwMCwgMHg1MCwgMHhmMiwgMHgwMSwJLy8gb3VpCisJCTB4MDEsIDB4MDAsCQkJCS8vIFZlcnNpb24KKwkJMHgwMCwgMHg1MCwgMHhmMiwgMHgwMiwJLy8gTXVsdGljYXN0CisJCTB4MDEsIDB4MDAsCQkJCS8vIE51bWJlciBvZiB1bmljYXN0CisJCTB4MDAsIDB4NTAsIDB4ZjIsIDB4MDIsCS8vIHVuaWNhc3QKKwkJMHgwMSwgMHgwMCwJCQkJLy8gbnVtYmVyIG9mIGF1dGhlbnRpY2F0aW9uIG1ldGhvZAorCQkweDAwLCAweDUwLCAweGYyLCAweDAyCS8vIGF1dGhlbnRpY2F0aW9uCisJCX07CitVQ0hBUglDaXBoZXJXcGFQc2tUa2lwTGVuID0gKHNpemVvZihDaXBoZXJXcGFQc2tUa2lwKSAvIHNpemVvZihVQ0hBUikpOworCitVQ0hBUglDaXBoZXJXcGFQc2tBZXNbXSA9IHsKKwkJMHhERCwgMHgxNiwgCQkJLy8gUlNOIElFCisJCTB4MDAsIDB4NTAsIDB4ZjIsIDB4MDEsCS8vIG91aQorCQkweDAxLCAweDAwLAkJCQkvLyBWZXJzaW9uCisJCTB4MDAsIDB4NTAsIDB4ZjIsIDB4MDQsCS8vIE11bHRpY2FzdAorCQkweDAxLCAweDAwLAkJCQkvLyBOdW1iZXIgb2YgdW5pY2FzdAorCQkweDAwLCAweDUwLCAweGYyLCAweDA0LAkvLyB1bmljYXN0CisJCTB4MDEsIDB4MDAsCQkJCS8vIG51bWJlciBvZiBhdXRoZW50aWNhdGlvbiBtZXRob2QKKwkJMHgwMCwgMHg1MCwgMHhmMiwgMHgwMgkvLyBhdXRoZW50aWNhdGlvbgorCQl9OworVUNIQVIJQ2lwaGVyV3BhUHNrQWVzTGVuID0gKHNpemVvZihDaXBoZXJXcGFQc2tBZXMpIC8gc2l6ZW9mKFVDSEFSKSk7CisKK1VDSEFSCUNpcGhlclN1aXRlQ2lzY29DQ0tNW10gPSB7CisJCTB4REQsIDB4MTYsCQkJCS8vIFJTTiBJRQorCQkweDAwLCAweDUwLCAweGYyLCAweDAxLCAvLyBvdWkKKwkJMHgwMSwgMHgwMCwJCQkJLy8gVmVyc2lvbgorCQkweDAwLCAweDQwLCAweDk2LCAweDAxLCAvLyBNdWx0aWNhc3QKKwkJMHgwMSwgMHgwMCwJCQkJLy8gTnVtYmVyIG9mIHVpY2FzdAorCQkweDAwLCAweDQwLCAweDk2LCAweDAxLCAvLyB1bmljYXN0CisJCTB4MDEsIDB4MDAsCQkJCS8vIG51bWJlciBvZiBhdXRoZW50aWNhdGlvbiBtZXRob2QKKwkJMHgwMCwgMHg0MCwgMHg5NiwgMHgwMCAgLy8gQXV0aGVudGljYXRpb24KKwkJfTsKK1VDSEFSCUNpcGhlclN1aXRlQ2lzY29DQ0tNTGVuID0gKHNpemVvZihDaXBoZXJTdWl0ZUNpc2NvQ0NLTSkgLyBzaXplb2YoVUNIQVIpKTsKKworVUNIQVIJQ2lwaGVyU3VpdGVDaXNjb0NDS00yNFtdID0geworCQkweERELCAweDE4LAkJCQkvLyBSU04gSUUKKwkJMHgwMCwgMHg1MCwgMHhmMiwgMHgwMSwgLy8gb3VpCisJCTB4MDEsIDB4MDAsCQkJCS8vIFZlcnNpb24KKwkJMHgwMCwgMHg0MCwgMHg5NiwgMHgwMSwgLy8gTXVsdGljYXN0CisJCTB4MDEsIDB4MDAsCQkJCS8vIE51bWJlciBvZiB1aWNhc3QKKwkJMHgwMCwgMHg0MCwgMHg5NiwgMHgwMSwgLy8gdW5pY2FzdAorCQkweDAxLCAweDAwLAkJCQkvLyBudW1iZXIgb2YgYXV0aGVudGljYXRpb24gbWV0aG9kCisJCTB4MDAsIDB4NDAsIDB4OTYsIDB4MDAsCisJCTB4MjgsIDB4MDAvLyBBdXRoZW50aWNhdGlvbgorCQl9OworCitVQ0hBUglDaXBoZXJTdWl0ZUNpc2NvQ0NLTTI0TGVuID0gKHNpemVvZihDaXBoZXJTdWl0ZUNpc2NvQ0NLTTI0KSAvIHNpemVvZihVQ0hBUikpOworCitVQ0hBUglDaXBoZXJTdWl0ZUNDWFRraXBbXSA9IHsKKwkJMHhERCwgMHgxNiwJCQkJLy8gUlNOIElFCisJCTB4MDAsIDB4NTAsIDB4ZjIsIDB4MDEsCS8vIG91aQorCQkweDAxLCAweDAwLAkJCQkvLyBWZXJzaW9uCisJCTB4MDAsIDB4NTAsIDB4ZjIsIDB4MDIsCS8vIE11bHRpY2FzdAorCQkweDAxLCAweDAwLAkJCQkvLyBOdW1iZXIgb2YgdW5pY2FzdAorCQkweDAwLCAweDUwLCAweGYyLCAweDAyLAkvLyB1bmljYXN0CisJCTB4MDEsIDB4MDAsCQkJCS8vIG51bWJlciBvZiBhdXRoZW50aWNhdGlvbiBtZXRob2QKKwkJMHgwMCwgMHg1MCwgMHhmMiwgMHgwMQkvLyBhdXRoZW50aWNhdGlvbgorCQl9OworVUNIQVIJQ2lwaGVyU3VpdGVDQ1hUa2lwTGVuID0gKHNpemVvZihDaXBoZXJTdWl0ZUNDWFRraXApIC8gc2l6ZW9mKFVDSEFSKSk7CisKK1VDSEFSCUNDWF9MTENfSERSW10gPSB7MHhBQSwgMHhBQSwgMHgwMywgMHgwMCwgMHg0MCwgMHg5NiwgMHgwMCwgMHgwMn07CitVQ0hBUglMTENfTk9STUFMW10gPSB7MHhBQSwgMHhBQSwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMH07CisKK1VDSEFSCUVBUE9MX0ZSQU1FW10gPSB7MHg4OCwgMHg4RX07CisKK0JPT0xFQU4gQ2hlY2tSU05JRSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBEYXRhLAorCUlOICBVQ0hBUiAgICAgICAgICAgRGF0YUxlbiwKKwlPVVQJVUNIQVIJCQkqT2Zmc2V0KTsKKwordm9pZCBpbmNfYnl0ZV9hcnJheShVQ0hBUiAqY291bnRlciwgaW50IGxlbik7CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlDbGFzc2lmeSBXUEEgRUFQIG1lc3NhZ2UgdHlwZQorCisJQXJndW1lbnRzOgorCQlFQVBUeXBlCQlWYWx1ZSBvZiBFQVAgbWVzc2FnZSB0eXBlCisJCU1zZ1R5cGUJCUludGVybmFsIE1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgTUxNRSBzdGF0ZSBtYWNoaW5lCisKKwlSZXR1cm4gVmFsdWU6CisJCVRSVUUJCUZvdW5kIGFwcHJvcHJpYXRlIG1lc3NhZ2UgdHlwZQorCQlGQUxTRQkJTm8gYXBwcm9wcmlhdGUgbWVzc2FnZSB0eXBlCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCU5vdGU6CisJCUFsbCB0aGVzZSBjb25zdGFudHMgYXJlIGRlZmluZWQgaW4gd3BhLmgKKwkJRm9yIHN1cHBsaWNhbnQsIHRoZXJlIGlzIG9ubHkgRUFQT0wgS2V5IG1lc3NhZ2UgYXZhbGlhYmxlCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitCT09MRUFOCVdwYU1zZ1R5cGVTdWJzdCgKKwlJTglVQ0hBUglFQVBUeXBlLAorCU9VVAlJTlQJCSpNc2dUeXBlKQoreworCXN3aXRjaCAoRUFQVHlwZSkKKwl7CisJCWNhc2UgRUFQUGFja2V0OgorCQkJKk1zZ1R5cGUgPSBNVDJfRUFQUGFja2V0OworCQkJYnJlYWs7CisJCWNhc2UgRUFQT0xTdGFydDoKKwkJCSpNc2dUeXBlID0gTVQyX0VBUE9MU3RhcnQ7CisJCQlicmVhazsKKwkJY2FzZSBFQVBPTExvZ29mZjoKKwkJCSpNc2dUeXBlID0gTVQyX0VBUE9MTG9nb2ZmOworCQkJYnJlYWs7CisJCWNhc2UgRUFQT0xLZXk6CisJCQkqTXNnVHlwZSA9IE1UMl9FQVBPTEtleTsKKwkJCWJyZWFrOworCQljYXNlIEVBUE9MQVNGQWxlcnQ6CisJCQkqTXNnVHlwZSA9IE1UMl9FQVBPTEFTRkFsZXJ0OworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gRkFMU0U7CisJfQorCXJldHVybiBUUlVFOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCWFzc29jaWF0aW9uCXN0YXRlIG1hY2hpbmUgaW5pdCwJaW5jbHVkaW5nIHN0YXRlCXRyYW5zaXRpb24gYW5kIHRpbWVyIGluaXQKKwlQYXJhbWV0ZXJzOgorCQlTIC0JcG9pbnRlcgl0byB0aGUgYXNzb2NpYXRpb24gc3RhdGUgbWFjaGluZQorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgV3BhUHNrU3RhdGVNYWNoaW5lSW5pdCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglTVEFURV9NQUNISU5FICpTLAorCU9VVAlTVEFURV9NQUNISU5FX0ZVTkMgVHJhbnNbXSkKK3sKKwlTdGF0ZU1hY2hpbmVJbml0KFMsCVRyYW5zLCBNQVhfV1BBX1BTS19TVEFURSwgTUFYX1dQQV9QU0tfTVNHLCAoU1RBVEVfTUFDSElORV9GVU5DKURyb3AsIFdQQV9QU0tfSURMRSwgV1BBX01BQ0hJTkVfQkFTRSk7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIFdQQV9QU0tfSURMRSwgTVQyX0VBUE9MS2V5LCAoU1RBVEVfTUFDSElORV9GVU5DKVdwYUVBUE9MS2V5QWN0aW9uKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlUaGlzIGlzCXN0YXRlIG1hY2hpbmUgZnVuY3Rpb24uCisJCVdoZW4gcmVjZWl2aW5nIEVBUE9MIHBhY2tldHMgd2hpY2ggaXMgIGZvciA4MDIuMXgga2V5IG1hbmFnZW1lbnQuCisJCVVzZQlib3RoIGluCVdQQSwgYW5kIFdQQVBTSwljYXNlLgorCQlJbiB0aGlzCWZ1bmN0aW9uLCBmdXJ0aGVyIGRpc3BhdGNoIHRvIGRpZmZlcmVudAlmdW5jdGlvbnMgYWNjb3JkaW5nCXRvIHRoZSByZWNlaXZlZAlwYWNrZXQuCSAzIGNhdGVnb3JpZXMgYXJlIDoKKwkJICAxLiAgbm9ybWFsIDQtd2F5IHBhaXJ3aXNla2V5IGFuZCAyLXdheSBncm91cGtleSBoYW5kc2hha2UKKwkJICAyLiAgTUlDIGVycm9yCShDb3VudGVybWVhc3VyZXMgYXR0YWNrKSAgcmVwb3J0IHBhY2tldAlmcm9tIFNUQS4KKwkJICAzLiAgUmVxdWVzdCBmb3IgcGFpcndpc2UvZ3JvdXAga2V5IHVwZGF0ZQlmcm9tIFNUQQorCVJldHVybjoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgV3BhRUFQT0xLZXlBY3Rpb24oCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JTUxNRV9RVUVVRV9FTEVNCSpFbGVtKQorCit7CisJSU5UICAgICAgICAgICAgIE1zZ1R5cGUgPSBFQVBPTF9NU0dfSU5WQUxJRDsKKwlQS0VZX0RFU0NSSVBURVIgcEtleURlc2M7CisJUEhFQURFUl84MDJfMTEgIHBIZWFkZXI7IC8vcmVkCisJVUNIQVIgICAgICAgICAgIFplcm9SZXBsYXlbTEVOX0tFWV9ERVNDX1JFUExBWV07CisJVUNIQVIgRWFwb2xWcjsKKwlLRVlfSU5GTwkJcGVlcktleUluZm87CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLS0tLT4gV3BhRUFQT0xLZXlBY3Rpb25cbiIpKTsKKworCS8vIEdldCA4MDIuMTEgaGVhZGVyIGZpcnN0CisJcEhlYWRlciA9IChQSEVBREVSXzgwMl8xMSkgRWxlbS0+TXNnOworCisJLy8gR2V0IEVBUG9MLUtleSBEZXNjcmlwdG9yCisJcEtleURlc2MgPSAoUEtFWV9ERVNDUklQVEVSKSAmRWxlbS0+TXNnWyhMRU5HVEhfODAyXzExICsgTEVOR1RIXzgwMl8xX0ggKyBMRU5HVEhfRUFQT0xfSCldOworCisJTmRpc1plcm9NZW1vcnkoKFBVQ0hBUikmcGVlcktleUluZm8sIHNpemVvZihwZWVyS2V5SW5mbykpOworCU5kaXNNb3ZlTWVtb3J5KChQVUNIQVIpJnBlZXJLZXlJbmZvLCAoUFVDSEFSKSZwS2V5RGVzYy0+S2V5SW5mbywgc2l6ZW9mKEtFWV9JTkZPKSk7CisKKwkqKChVU0hPUlQgKikmcGVlcktleUluZm8pID0gY3B1MmxlMTYoKigoVVNIT1JUICopJnBlZXJLZXlJbmZvKSk7CisKKworCS8vIDEuIENoZWNrIEVBUE9MIGZyYW1lIHZlcnNpb24gYW5kIHR5cGUKKwlFYXBvbFZyCT0gKFVDSEFSKSBFbGVtLT5Nc2dbTEVOR1RIXzgwMl8xMStMRU5HVEhfODAyXzFfSF07CisKKyAgICBpZiAoKChFYXBvbFZyICE9IEVBUE9MX1ZFUikgJiYgKEVhcG9sVnIgIT0gRUFQT0xfVkVSMikpIHx8ICgocEtleURlc2MtPlR5cGUgIT0gV1BBMV9LRVlfREVTQykgJiYgKHBLZXlEZXNjLT5UeXBlICE9IFdQQTJfS0VZX0RFU0MpKSkKKwl7CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIktleSBkZXNjcmlwdGVyIGRvZXMgbm90IG1hdGNoIHdpdGggV1BBIHJ1bGVcbiIpKTsKKwkJCXJldHVybjsKKwl9CisKKwkvLyBGaXJzdCB2YWxpZGF0ZSByZXBsYXkgY291bnRlciwgb25seSBhY2NlcHQgbWVzc2FnZSB3aXRoIGxhcmdlciByZXBsYXkgY291bnRlcgorCS8vIExldCBlcXVhbCBwYXNzLCBzb21lIEFQIHN0YXJ0IHdpdGggYWxsIHplcm8gcmVwbGF5IGNvdW50ZXIKKwlOZGlzWmVyb01lbW9yeShaZXJvUmVwbGF5LCBMRU5fS0VZX0RFU0NfUkVQTEFZKTsKKworCWlmKChSVE1QQ29tcGFyZU1lbW9yeShwS2V5RGVzYy0+UmVwbGF5Q291bnRlciwgcEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlciwgTEVOX0tFWV9ERVNDX1JFUExBWSkgIT0gMSkgJiYKKwkJKFJUTVBDb21wYXJlTWVtb3J5KHBLZXlEZXNjLT5SZXBsYXlDb3VudGVyLCBaZXJvUmVwbGF5LCBMRU5fS0VZX0RFU0NfUkVQTEFZKSAhPSAwKSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiAgIFJlcGxheUNvdW50ZXIgbm90IG1hdGNoICAgXG4iKSk7CisJCXJldHVybjsKKwl9CisKKwkvLyBQcm9jZXNzIFdQQTJQU0sgZnJhbWUKKwlpZihwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKQorCXsKKwkJaWYoKHBlZXJLZXlJbmZvLktleVR5cGUgPT0gUEFJUldJU0VLRVkpICYmCisJCQkocGVlcktleUluZm8uRUtEX0RMID09IDApICYmCisJCQkocGVlcktleUluZm8uS2V5QWNrID09IDEpICYmCisJCQkocGVlcktleUluZm8uS2V5TWljID09IDApICYmCisJCQkocGVlcktleUluZm8uU2VjdXJlID09IDApICYmCisJCQkocGVlcktleUluZm8uRXJyb3IgPT0gMCkgJiYKKwkJCShwZWVyS2V5SW5mby5SZXF1ZXN0ID09IDApKQorCQl7CisJCQlNc2dUeXBlID0gRUFQT0xfUEFJUl9NU0dfMTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJlY2VpdmUgRUFQT0wgS2V5IFBhaXJ3aXNlIE1lc3NhZ2UgMVxuIikpOworCQl9IGVsc2UgaWYoKHBlZXJLZXlJbmZvLktleVR5cGUgPT0gUEFJUldJU0VLRVkpICYmCisJCQkocGVlcktleUluZm8uRUtEX0RMICA9PSAxKSAmJgorCQkJKHBlZXJLZXlJbmZvLktleUFjayA9PSAxKSAmJgorCQkJKHBlZXJLZXlJbmZvLktleU1pYyA9PSAxKSAmJgorCQkJKHBlZXJLZXlJbmZvLlNlY3VyZSA9PSAxKSAmJgorCQkJKHBlZXJLZXlJbmZvLkVycm9yID09IDApICYmCisJCQkocGVlcktleUluZm8uUmVxdWVzdCA9PSAwKSkKKwkJeworCQkJTXNnVHlwZSA9IEVBUE9MX1BBSVJfTVNHXzM7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSZWNlaXZlIEVBUE9MIEtleSBQYWlyd2lzZSBNZXNzYWdlIDNcbiIpKTsKKwkJfSBlbHNlIGlmKChwZWVyS2V5SW5mby5LZXlUeXBlID09IEdST1VQS0VZKSAmJgorCQkJKHBlZXJLZXlJbmZvLkVLRF9ETCA9PSAxKSAmJgorCQkJKHBlZXJLZXlJbmZvLktleUFjayA9PSAxKSAmJgorCQkJKHBlZXJLZXlJbmZvLktleU1pYyA9PSAxKSAmJgorCQkJKHBlZXJLZXlJbmZvLlNlY3VyZSA9PSAxKSAmJgorCQkJKHBlZXJLZXlJbmZvLkVycm9yID09IDApICYmCisJCQkocGVlcktleUluZm8uUmVxdWVzdCA9PSAwKSkKKwkJeworCQkJTXNnVHlwZSA9IEVBUE9MX0dST1VQX01TR18xOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmVjZWl2ZSBFQVBPTCBLZXkgR3JvdXAgTWVzc2FnZSAxXG4iKSk7CisJCX0KKworCQkvLyBXZSB3aWxsIGFzc3VtZSBsaW5rIGlzIHVwIChhc3NvYyBzdWNlZXNzIGFuZCBwb3J0IG5vdCBzZWN1cmVkKS4KKwkJLy8gQWxsIHN0YXRlIGhhcyB0byBiZSBhYmxlIHRvIHByb2Nlc3MgbWVzc2FnZSBmcm9tIHByZXZpb3VzIHN0YXRlCisJCXN3aXRjaChwQWQtPlN0YUNmZy5XcGFTdGF0ZSkKKwkJeworCQljYXNlIFNTX1NUQVJUOgorCQkJaWYoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18xKQorCQkJeworCQkJCVdwYTJQYWlyTXNnMUFjdGlvbihwQWQsIEVsZW0pOworCQkJCXBBZC0+U3RhQ2ZnLldwYVN0YXRlID0gU1NfV0FJVF9NU0dfMzsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgU1NfV0FJVF9NU0dfMzoKKwkJCWlmKE1zZ1R5cGUgPT0gRUFQT0xfUEFJUl9NU0dfMSkKKwkJCXsKKwkJCQlXcGEyUGFpck1zZzFBY3Rpb24ocEFkLCBFbGVtKTsKKwkJCQlwQWQtPlN0YUNmZy5XcGFTdGF0ZSA9IFNTX1dBSVRfTVNHXzM7CisJCQl9CisJCQllbHNlIGlmKE1zZ1R5cGUgPT0gRUFQT0xfUEFJUl9NU0dfMykKKwkJCXsKKwkJCQlXcGEyUGFpck1zZzNBY3Rpb24ocEFkLCBFbGVtKTsKKwkJCQlwQWQtPlN0YUNmZy5XcGFTdGF0ZSA9IFNTX1dBSVRfR1JPVVA7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFNTX1dBSVRfR1JPVVA6CQkvLyBXaGVuIGRvaW5nIGdyb3VwIGtleSBleGNoYW5nZQorCQljYXNlIFNTX0ZJTklTSDoJCQkvLyBUaGlzIGhhcHBlbmVkIHdoZW4gdXBkYXRlIGdyb3VwIGtleQorCQkJaWYoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18xKQorCQkJeworCQkJICAgIC8vIFJlc2V0IHBvcnQgc2VjdXJlZCB2YXJpYWJsZQorCQkJCXBBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX05PVF9TRUNVUkVEOworCQkJCVdwYTJQYWlyTXNnMUFjdGlvbihwQWQsIEVsZW0pOworCQkJCXBBZC0+U3RhQ2ZnLldwYVN0YXRlID0gU1NfV0FJVF9NU0dfMzsKKwkJCX0KKwkJCWVsc2UgaWYoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18zKQorCQkJeworCQkJICAgIC8vIFJlc2V0IHBvcnQgc2VjdXJlZCB2YXJpYWJsZQorCQkJCXBBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX05PVF9TRUNVUkVEOworCQkJCVdwYTJQYWlyTXNnM0FjdGlvbihwQWQsIEVsZW0pOworCQkJCXBBZC0+U3RhQ2ZnLldwYVN0YXRlID0gU1NfV0FJVF9HUk9VUDsKKwkJCX0KKwkJCWVsc2UgaWYoTXNnVHlwZSA9PSBFQVBPTF9HUk9VUF9NU0dfMSkKKwkJCXsKKwkJCQlXcGFHcm91cE1zZzFBY3Rpb24ocEFkLCBFbGVtKTsKKwkJCQlwQWQtPlN0YUNmZy5XcGFTdGF0ZSA9IFNTX0ZJTklTSDsKKwkJCX0KKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCX0KKwkvLyBQcm9jZXNzIFdQQVBTSyBGcmFtZQorCS8vIENsYXNzaWZ5IG1lc3NhZ2UgVHlwZSwgZWl0aGVyIHBhaXJ3aXNlIG1lc3NhZ2UgMSwgMywgb3IgZ3JvdXAgbWVzc2FnZSAxIGZvciBzdXBwbGljYW50CisJZWxzZSBpZihwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spCisJeworCQlpZigocGVlcktleUluZm8uS2V5VHlwZSA9PSBQQUlSV0lTRUtFWSkgJiYKKwkJCShwZWVyS2V5SW5mby5LZXlJbmRleCA9PSAwKSAmJgorCQkJKHBlZXJLZXlJbmZvLktleUFjayA9PSAxKSAmJgorCQkJKHBlZXJLZXlJbmZvLktleU1pYyA9PSAwKSAmJgorCQkJKHBlZXJLZXlJbmZvLlNlY3VyZSA9PSAwKSAmJgorCQkJKHBlZXJLZXlJbmZvLkVycm9yID09IDApICYmCisJCQkocGVlcktleUluZm8uUmVxdWVzdCA9PSAwKSkKKwkJeworCQkJTXNnVHlwZSA9IEVBUE9MX1BBSVJfTVNHXzE7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSZWNlaXZlIEVBUE9MIEtleSBQYWlyd2lzZSBNZXNzYWdlIDFcbiIpKTsKKwkJfQorCQllbHNlIGlmKChwZWVyS2V5SW5mby5LZXlUeXBlID09IFBBSVJXSVNFS0VZKSAmJgorCQkJKHBlZXJLZXlJbmZvLktleUluZGV4ID09IDApICYmCisJCQkocGVlcktleUluZm8uS2V5QWNrID09IDEpICYmCisJCQkocGVlcktleUluZm8uS2V5TWljID09IDEpICYmCisJCQkocGVlcktleUluZm8uU2VjdXJlID09IDApICYmCisJCQkocGVlcktleUluZm8uRXJyb3IgPT0gMCkgJiYKKwkJCShwZWVyS2V5SW5mby5SZXF1ZXN0ID09IDApKQorCQl7CisJCQlNc2dUeXBlID0gRUFQT0xfUEFJUl9NU0dfMzsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJlY2VpdmUgRUFQT0wgS2V5IFBhaXJ3aXNlIE1lc3NhZ2UgM1xuIikpOworCQl9CisJCWVsc2UgaWYoKHBlZXJLZXlJbmZvLktleVR5cGUgPT0gR1JPVVBLRVkpICYmCisJCQkocGVlcktleUluZm8uS2V5SW5kZXggIT0gMCkgJiYKKwkJCShwZWVyS2V5SW5mby5LZXlBY2sgPT0gMSkgJiYKKwkJCShwZWVyS2V5SW5mby5LZXlNaWMgPT0gMSkgJiYKKwkJCShwZWVyS2V5SW5mby5TZWN1cmUgPT0gMSkgJiYKKwkJCShwZWVyS2V5SW5mby5FcnJvciA9PSAwKSAmJgorCQkJKHBlZXJLZXlJbmZvLlJlcXVlc3QgPT0gMCkpCisJCXsKKwkJCU1zZ1R5cGUgPSBFQVBPTF9HUk9VUF9NU0dfMTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJlY2VpdmUgRUFQT0wgS2V5IEdyb3VwIE1lc3NhZ2UgMVxuIikpOworCQl9CisKKwkJLy8gV2Ugd2lsbCBhc3N1bWUgbGluayBpcyB1cCAoYXNzb2Mgc3VjZWVzcyBhbmQgcG9ydCBub3Qgc2VjdXJlZCkuCisJCS8vIEFsbCBzdGF0ZSBoYXMgdG8gYmUgYWJsZSB0byBwcm9jZXNzIG1lc3NhZ2UgZnJvbSBwcmV2aW91cyBzdGF0ZQorCQlzd2l0Y2gocEFkLT5TdGFDZmcuV3BhU3RhdGUpCisJCXsKKwkJY2FzZSBTU19TVEFSVDoKKwkJCWlmKE1zZ1R5cGUgPT0gRUFQT0xfUEFJUl9NU0dfMSkKKwkJCXsKKwkJCQlXcGFQYWlyTXNnMUFjdGlvbihwQWQsIEVsZW0pOworCQkJCXBBZC0+U3RhQ2ZnLldwYVN0YXRlID0gU1NfV0FJVF9NU0dfMzsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgU1NfV0FJVF9NU0dfMzoKKwkJCWlmKE1zZ1R5cGUgPT0gRUFQT0xfUEFJUl9NU0dfMSkKKwkJCXsKKwkJCQlXcGFQYWlyTXNnMUFjdGlvbihwQWQsIEVsZW0pOworCQkJCXBBZC0+U3RhQ2ZnLldwYVN0YXRlID0gU1NfV0FJVF9NU0dfMzsKKwkJCX0KKwkJCWVsc2UgaWYoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18zKQorCQkJeworCQkJCVdwYVBhaXJNc2czQWN0aW9uKHBBZCwgRWxlbSk7CisJCQkJcEFkLT5TdGFDZmcuV3BhU3RhdGUgPSBTU19XQUlUX0dST1VQOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBTU19XQUlUX0dST1VQOgkJLy8gV2hlbiBkb2luZyBncm91cCBrZXkgZXhjaGFuZ2UKKwkJY2FzZSBTU19GSU5JU0g6CQkJLy8gVGhpcyBoYXBwZW5lZCB3aGVuIHVwZGF0ZSBncm91cCBrZXkKKwkJCWlmKE1zZ1R5cGUgPT0gRUFQT0xfUEFJUl9NU0dfMSkKKwkJCXsKKwkJCQlXcGFQYWlyTXNnMUFjdGlvbihwQWQsIEVsZW0pOworCQkJCXBBZC0+U3RhQ2ZnLldwYVN0YXRlID0gU1NfV0FJVF9NU0dfMzsKKwkJCQkvLyBSZXNldCBwb3J0IHNlY3VyZWQgdmFyaWFibGUKKwkJCQlwQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9OT1RfU0VDVVJFRDsKKwkJCX0KKwkJCWVsc2UgaWYoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18zKQorCQkJeworCQkJCVdwYVBhaXJNc2czQWN0aW9uKHBBZCwgRWxlbSk7CisJCQkJcEFkLT5TdGFDZmcuV3BhU3RhdGUgPSBTU19XQUlUX0dST1VQOworCQkJCS8vIFJlc2V0IHBvcnQgc2VjdXJlZCB2YXJpYWJsZQorCQkJCXBBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX05PVF9TRUNVUkVEOworCQkJfQorCQkJZWxzZSBpZihNc2dUeXBlID09IEVBUE9MX0dST1VQX01TR18xKQorCQkJeworCQkJCVdwYUdyb3VwTXNnMUFjdGlvbihwQWQsIEVsZW0pOworCQkJCXBBZC0+U3RhQ2ZnLldwYVN0YXRlID0gU1NfRklOSVNIOworCQkJfQorCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJfQorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPC0tLS0tIFdwYUVBUE9MS2V5QWN0aW9uXG4iKSk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlQcm9jZXNzIFBhaXJ3aXNlIGtleSA0LXdheSBoYW5kc2hha2luZworCisJQXJndW1lbnRzOgorCQlwQWQJUG9pbnRlcgl0byBvdXIgYWRhcHRlcgorCQlFbGVtCQlNZXNzYWdlIGJvZHkKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJV3BhUGFpck1zZzFBY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlQSEVBREVSXzgwMl8xMSAgICAgIHBIZWFkZXI7CisJVUNIQVIJCQkJKm1wb29sLCAqUFRLLCAqZGlnZXN0OworCVBVQ0hBUiAgICAgICAgICAgICAgcE91dEJ1ZmZlciA9IE5VTEw7CisJVUNIQVIgICAgICAgICAgICAgICBIZWFkZXI4MDJfM1sxNF07CisJVUxPTkcgICAgICAgICAgICAgICBGcmFtZUxlbiA9IDA7CisJUEVBUE9MX1BBQ0tFVCAgICAgICBwTXNnMTsKKwlFQVBPTF9QQUNLRVQgICAgICAgIFBhY2tldDsKKwlVQ0hBUiAgICAgICAgICAgICAgIE1pY1sxNl07CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJXcGFQYWlyTXNnMUFjdGlvbiAtLS0tLT5cbiIpKTsKKworCS8vIGFsbG9jYXRlIG1lbW9yeSBwb29sCisJb3NfYWxsb2NfbWVtKHBBZCwgKFBVQ0hBUiAqKSZtcG9vbCwgMjU2KTsKKworCWlmIChtcG9vbCA9PSBOVUxMKQorCQlyZXR1cm47CisKKwkvLyBQVEsgTGVuID0gODAuCisJUFRLID0gKFVDSEFSICopIFJPVU5EX1VQKG1wb29sLCA0KTsKKwkvLyBkaWdlc3QgTGVuID0gODAuCisJZGlnZXN0ID0gKFVDSEFSICopIFJPVU5EX1VQKFBUSyArIDgwLCA0KTsKKworCXBIZWFkZXIgPSAoUEhFQURFUl84MDJfMTEpIEVsZW0tPk1zZzsKKworCS8vIFByb2Nlc3MgbWVzc2FnZSAxIGZyb20gYXV0aGVudGljYXRvcgorCXBNc2cxID0gKFBFQVBPTF9QQUNLRVQpICZFbGVtLT5Nc2dbTEVOR1RIXzgwMl8xMSArIExFTkdUSF84MDJfMV9IXTsKKworCS8vIDEuIFNhdmUgUmVwbGF5IGNvdW50ZXIsIGl0IHdpbGwgdXNlIHRvIHZlcmlmeSBtZXNzYWdlIDMgYW5kIGNvbnN0cnVjdCBtZXNzYWdlIDIKKwlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5SZXBsYXlDb3VudGVyLCBwTXNnMS0+S2V5RGVzYy5SZXBsYXlDb3VudGVyLCBMRU5fS0VZX0RFU0NfUkVQTEFZKTsKKworCS8vIDIuIFNhdmUgQU5vbmNlCisJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuQU5vbmNlLCBwTXNnMS0+S2V5RGVzYy5LZXlOb25jZSwgTEVOX0tFWV9ERVNDX05PTkNFKTsKKworCS8vIEdlbmVyYXRlIHJhbmRvbSBTTm9uY2UKKwlHZW5SYW5kb20ocEFkLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBwQWQtPlN0YUNmZy5TTm9uY2UpOworCisJLy8gQ2FsYyBQVEsoQU5vbmNlLCBTTm9uY2UpCisJV3BhQ291bnRQVEsocEFkLAorCQlwQWQtPlN0YUNmZy5QTUssCisJCXBBZC0+U3RhQ2ZnLkFOb25jZSwKKwkJcEFkLT5Db21tb25DZmcuQnNzaWQsCisJCXBBZC0+U3RhQ2ZnLlNOb25jZSwKKwkJcEFkLT5DdXJyZW50QWRkcmVzcywKKwkJUFRLLAorCQlMRU5fUFRLKTsKKworCS8vIFNhdmUga2V5IHRvIFBUSyBlbnRyeQorCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLlBUSywgUFRLLCBMRU5fUFRLKTsKKworCS8vIGluaXQgODAyLjMgaGVhZGVyIGFuZCBGaWxsIFBhY2tldAorCU1BS0VfODAyXzNfSEVBREVSKEhlYWRlcjgwMl8zLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgcEFkLT5DdXJyZW50QWRkcmVzcywgRUFQT0wpOworCisJLy8gWmVybyBNZXNzYWdlIDIgYm9keQorCU5kaXNaZXJvTWVtb3J5KCZQYWNrZXQsIHNpemVvZihQYWNrZXQpKTsKKwlQYWNrZXQuUHJvVmVyCT0gRUFQT0xfVkVSOworCVBhY2tldC5Qcm9UeXBlCT0gRUFQT0xLZXk7CisJLy8KKwkvLyBNZXNzYWdlIDIgYXMgIEVBUE9MLUtleSgwLDEsMCwwLDAsUCwwLFNOb25jZSxNSUMsUlNOIElFKQorCS8vCisJUGFja2V0LktleURlc2MuVHlwZSA9IFdQQTFfS0VZX0RFU0M7CisJLy8gMS4gS2V5IGRlc2NyaXB0b3IgdmVyc2lvbiBhbmQgYXBwcm9wcmlhdGUgUlNOIElFCisJaWYocEFkLT5TdGFDZmcuV2VwU3RhdHVzICA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQorCXsKKwkJUGFja2V0LktleURlc2MuS2V5SW5mby5LZXlEZXNjVmVyID0gMjsKKwl9CisJZWxzZQkgIC8vIFRLSVAKKwl7CisJCVBhY2tldC5LZXlEZXNjLktleUluZm8uS2V5RGVzY1ZlciA9IDE7CisJfQorCisJLy8gZmlsbCBpbiBEYXRhIE1hdGVyaWFsIGFuZCBpdHMgbGVuZ3RoCisJUGFja2V0LktleURlc2MuS2V5RGF0YVswXSA9IElFX1dQQTsKKwlQYWNrZXQuS2V5RGVzYy5LZXlEYXRhWzFdID0gcEFkLT5TdGFDZmcuUlNOSUVfTGVuOworCVBhY2tldC5LZXlEZXNjLktleURhdGFMZW5bMV0gPSBwQWQtPlN0YUNmZy5SU05JRV9MZW4gKyAyOworCU5kaXNNb3ZlTWVtb3J5KCZQYWNrZXQuS2V5RGVzYy5LZXlEYXRhWzJdLCBwQWQtPlN0YUNmZy5SU05fSUUsIHBBZC0+U3RhQ2ZnLlJTTklFX0xlbik7CisKKwkvLyBVcGRhdGUgcGFja2V0IGxlbmd0aCBhZnRlciBkZWNpZGUgS2V5IGRhdGEgcGF5bG9hZAorCVBhY2tldC5Cb2R5X0xlblsxXSAgPSBzaXplb2YoS0VZX0RFU0NSSVBURVIpIC0gTUFYX0xFTl9PRl9SU05JRSArIFBhY2tldC5LZXlEZXNjLktleURhdGFMZW5bMV07CisKKwkvLyBVcGRhdGUgS2V5IGxlbmd0aAorCVBhY2tldC5LZXlEZXNjLktleUxlbmd0aFswXSA9IHBNc2cxLT5LZXlEZXNjLktleUxlbmd0aFswXTsKKwlQYWNrZXQuS2V5RGVzYy5LZXlMZW5ndGhbMV0gPSBwTXNnMS0+S2V5RGVzYy5LZXlMZW5ndGhbMV07CisJLy8gMi4gS2V5IFR5cGUgUGVlcktleQorCVBhY2tldC5LZXlEZXNjLktleUluZm8uS2V5VHlwZSA9IFBBSVJXSVNFS0VZOworCisJLy8gMy4gS2V5TWljIGZpZWxkIHByZXNlbnRlZAorCVBhY2tldC5LZXlEZXNjLktleUluZm8uS2V5TWljICA9IDE7CisKKwkvL0NvbnZlcnQgdG8gbGl0dGxlLWVuZGlhbiBmb3JtYXQuCisJKigoVVNIT1JUICopJlBhY2tldC5LZXlEZXNjLktleUluZm8pID0gY3B1MmxlMTYoKigoVVNIT1JUICopJlBhY2tldC5LZXlEZXNjLktleUluZm8pKTsKKworCisJLy8gNC4gRmlsbCBTTm9uY2UKKwlOZGlzTW92ZU1lbW9yeShQYWNrZXQuS2V5RGVzYy5LZXlOb25jZSwgcEFkLT5TdGFDZmcuU05vbmNlLCBMRU5fS0VZX0RFU0NfTk9OQ0UpOworCisJLy8gNS4gS2V5IFJlcGxheSBDb3VudAorCU5kaXNNb3ZlTWVtb3J5KFBhY2tldC5LZXlEZXNjLlJlcGxheUNvdW50ZXIsIHBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXIsIExFTl9LRVlfREVTQ19SRVBMQVkpOworCisJLy8gU2VuZCBFQVBPTCgwLCAxLCAwLCAwLCAwLCBQLCAwLCBTTm9uY2UsIE1JQywgUlNOX0lFKQorCS8vIE91dCBidWZmZXIgZm9yIHRyYW5zbWl0dGluZyBtZXNzYWdlIDIKKwlNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAoUFVDSEFSICopJnBPdXRCdWZmZXIpOyAgLy8gYWxsb2NhdGUgbWVtb3J5CisJaWYocE91dEJ1ZmZlciA9PSBOVUxMKQorCXsKKwkJb3NfZnJlZV9tZW0ocEFkLCBtcG9vbCk7CisJCXJldHVybjsKKwl9CisJLy8gUHJlcGFyZSBFQVBPTCBmcmFtZSBmb3IgTUlDIGNhbGN1bGF0aW9uCisJLy8gQmUgY2FyZWZ1bCwgb25seSBFQVBPTCBmcmFtZSBpcyBjb3VudGVkIGZvciBNSUMgY2FsY3VsYXRpb24KKwlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAgICAgICAgICAgJkZyYW1lTGVuLAorCQlQYWNrZXQuQm9keV9MZW5bMV0gKyA0LCAgICAmUGFja2V0LAorCQlFTkRfT0ZfQVJHUyk7CisKKwkvLyA2LiBQcmVwYXJlIGFuZCBGaWxsIE1JQyB2YWx1ZQorCU5kaXNaZXJvTWVtb3J5KE1pYywgc2l6ZW9mKE1pYykpOworCWlmKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKKwl7CS8vIEFFUworCisJCUhNQUNfU0hBMShwT3V0QnVmZmVyLCBGcmFtZUxlbiwgUFRLLCBMRU5fRUFQX01JQ0ssIGRpZ2VzdCk7CisJCU5kaXNNb3ZlTWVtb3J5KE1pYywgZGlnZXN0LCBMRU5fS0VZX0RFU0NfTUlDKTsKKwl9CisJZWxzZQorCXsJLy8gVEtJUAorCQlobWFjX21kNShQVEssICBMRU5fRUFQX01JQ0ssIHBPdXRCdWZmZXIsIEZyYW1lTGVuLCBNaWMpOworCX0KKwlOZGlzTW92ZU1lbW9yeShQYWNrZXQuS2V5RGVzYy5LZXlNaWMsIE1pYywgTEVOX0tFWV9ERVNDX01JQyk7CisKKwkvL2hleF9kdW1wKCJNSUMiLCBNaWMsIExFTl9LRVlfREVTQ19NSUMpOworCisJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAgICAJJkZyYW1lTGVuLAorCQkJICAJCQlMRU5HVEhfODAyXzMsICAgICAJCQkmSGVhZGVyODAyXzMsCisJCQkJCQlQYWNrZXQuQm9keV9MZW5bMV0gKyA0LCAgICAmUGFja2V0LAorCQkJCQkJRU5EX09GX0FSR1MpOworCisKKwkvLyA1LiBDb3B5IGZyYW1lIHRvIFR4IHJpbmcgYW5kIHNlbmQgTXNnIDIgdG8gYXV0aGVudGljYXRvcgorCVJUTVBUb1dpcmVsZXNzU3RhKHBBZCwgSGVhZGVyODAyXzMsIExFTkdUSF84MDJfMywgKFBVQ0hBUikmUGFja2V0LCBQYWNrZXQuQm9keV9MZW5bMV0gKyA0LCBUUlVFKTsKKworCU1sbWVGcmVlTWVtb3J5KHBBZCwgKFBVQ0hBUilwT3V0QnVmZmVyKTsKKwlvc19mcmVlX21lbShwQWQsIChQVUNIQVIpbXBvb2wpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiV3BhUGFpck1zZzFBY3Rpb24gPC0tLS0tXG4iKSk7Cit9CisKK1ZPSUQgV3BhMlBhaXJNc2cxQWN0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisJUEhFQURFUl84MDJfMTEgICAgICBwSGVhZGVyOworCVVDSEFSCQkJCSptcG9vbCwgKlBUSywgKmRpZ2VzdDsKKwlQVUNIQVIgICAgICAgICAgICAgIHBPdXRCdWZmZXIgPSBOVUxMOworCVVDSEFSICAgICAgICAgICAgICAgSGVhZGVyODAyXzNbMTRdOworCVVMT05HICAgICAgICAgICAgICAgRnJhbWVMZW4gPSAwOworCVBFQVBPTF9QQUNLRVQgICAgICAgcE1zZzE7CisJRUFQT0xfUEFDS0VUICAgICAgICBQYWNrZXQ7CisJVUNIQVIgICAgICAgICAgICAgICBNaWNbMTZdOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiV3BhMlBhaXJNc2cxQWN0aW9uIC0tLS0tPlxuIikpOworCisJLy8gYWxsb2NhdGUgbWVtb3J5IHBvb2wKKwlvc19hbGxvY19tZW0ocEFkLCAoUFVDSEFSICopJm1wb29sLCAyNTYpOworCisJaWYgKG1wb29sID09IE5VTEwpCisJCXJldHVybjsKKworCS8vIFBUSyBMZW4gPSA4MC4KKwlQVEsgPSAoVUNIQVIgKikgUk9VTkRfVVAobXBvb2wsIDQpOworCS8vIGRpZ2VzdCBMZW4gPSA4MC4KKwlkaWdlc3QgPSAoVUNIQVIgKikgUk9VTkRfVVAoUFRLICsgODAsIDQpOworCisJcEhlYWRlciA9IChQSEVBREVSXzgwMl8xMSkgRWxlbS0+TXNnOworCisJLy8gUHJvY2VzcyBtZXNzYWdlIDEgZnJvbSBhdXRoZW50aWNhdG9yCisJCXBNc2cxID0gKFBFQVBPTF9QQUNLRVQpCSZFbGVtLT5Nc2dbTEVOR1RIXzgwMl8xMSArIExFTkdUSF84MDJfMV9IXTsKKworCS8vIDEuIFNhdmUgUmVwbGF5IGNvdW50ZXIsIGl0IHdpbGwgdXNlIHRvIHZlcmlmeSBtZXNzYWdlIDMgYW5kIGNvbnN0cnVjdCBtZXNzYWdlIDIKKwlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5SZXBsYXlDb3VudGVyLCBwTXNnMS0+S2V5RGVzYy5SZXBsYXlDb3VudGVyLCBMRU5fS0VZX0RFU0NfUkVQTEFZKTsKKworCS8vIDIuIFNhdmUgQU5vbmNlCisJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuQU5vbmNlLCBwTXNnMS0+S2V5RGVzYy5LZXlOb25jZSwgTEVOX0tFWV9ERVNDX05PTkNFKTsKKworCS8vIEdlbmVyYXRlIHJhbmRvbSBTTm9uY2UKKwlHZW5SYW5kb20ocEFkLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBwQWQtPlN0YUNmZy5TTm9uY2UpOworCisJaWYocE1zZzEtPktleURlc2MuS2V5RGF0YUxlblsxXSA+IDAgKQorCXsKKwkJLy8gY2FjaGVkIFBNS0lECisJfQorCisJLy8gQ2FsYyBQVEsoQU5vbmNlLCBTTm9uY2UpCisJV3BhQ291bnRQVEsocEFkLAorCQlwQWQtPlN0YUNmZy5QTUssCisJCXBBZC0+U3RhQ2ZnLkFOb25jZSwKKwkJcEFkLT5Db21tb25DZmcuQnNzaWQsCisJCXBBZC0+U3RhQ2ZnLlNOb25jZSwKKwkJcEFkLT5DdXJyZW50QWRkcmVzcywKKwkJUFRLLAorCQlMRU5fUFRLKTsKKworCS8vIFNhdmUga2V5IHRvIFBUSyBlbnRyeQorCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLlBUSywgUFRLLCBMRU5fUFRLKTsKKworCS8vIGluaXQgODAyLjMgaGVhZGVyIGFuZCBGaWxsIFBhY2tldAorCU1BS0VfODAyXzNfSEVBREVSKEhlYWRlcjgwMl8zLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgcEFkLT5DdXJyZW50QWRkcmVzcywgRUFQT0wpOworCisJLy8gWmVybyBtZXNzYWdlIDIgYm9keQorCU5kaXNaZXJvTWVtb3J5KCZQYWNrZXQsIHNpemVvZihQYWNrZXQpKTsKKwlQYWNrZXQuUHJvVmVyCT0gRUFQT0xfVkVSOworCVBhY2tldC5Qcm9UeXBlCT0gRUFQT0xLZXk7CisJLy8KKwkvLyBNZXNzYWdlIDIgYXMgIEVBUE9MLUtleSgwLDEsMCwwLDAsUCwwLFNOb25jZSxNSUMsUlNOIElFKQorCS8vCisJUGFja2V0LktleURlc2MuVHlwZSA9IFdQQTJfS0VZX0RFU0M7CisKKwkvLyAxLiBLZXkgZGVzY3JpcHRvciB2ZXJzaW9uIGFuZCBhcHByb3ByaWF0ZSBSU04gSUUKKwlpZihwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKKwl7CisJCVBhY2tldC5LZXlEZXNjLktleUluZm8uS2V5RGVzY1ZlciA9IDI7CisJfQorCWVsc2UJICAvLyBUS0lQCisJeworCQlQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLktleURlc2NWZXIgPSAxOworCX0KKworCS8vIGZpbGwgaW4gRGF0YSBNYXRlcmlhbCBhbmQgaXRzIGxlbmd0aAorCVBhY2tldC5LZXlEZXNjLktleURhdGFbMF0gPSBJRV9XUEEyOworCVBhY2tldC5LZXlEZXNjLktleURhdGFbMV0gPSBwQWQtPlN0YUNmZy5SU05JRV9MZW47CisJUGFja2V0LktleURlc2MuS2V5RGF0YUxlblsxXSA9IHBBZC0+U3RhQ2ZnLlJTTklFX0xlbiArIDI7CisJTmRpc01vdmVNZW1vcnkoJlBhY2tldC5LZXlEZXNjLktleURhdGFbMl0sIHBBZC0+U3RhQ2ZnLlJTTl9JRSwgcEFkLT5TdGFDZmcuUlNOSUVfTGVuKTsKKworCS8vIFVwZGF0ZSBwYWNrZXQgbGVuZ3RoIGFmdGVyIGRlY2lkZSBLZXkgZGF0YSBwYXlsb2FkCisJUGFja2V0LkJvZHlfTGVuWzFdICA9IHNpemVvZihLRVlfREVTQ1JJUFRFUikgLSBNQVhfTEVOX09GX1JTTklFICsgUGFja2V0LktleURlc2MuS2V5RGF0YUxlblsxXTsKKworCS8vIDIuIEtleSBUeXBlIFBlZXJLZXkKKwlQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLktleVR5cGUgPSBQQUlSV0lTRUtFWTsKKworCS8vIDMuIEtleU1pYyBmaWVsZCBwcmVzZW50ZWQKKwlQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLktleU1pYyAgPSAxOworCisJLy8gVXBkYXRlIEtleSBMZW5ndGgKKwlQYWNrZXQuS2V5RGVzYy5LZXlMZW5ndGhbMF0gPSAwOworCVBhY2tldC5LZXlEZXNjLktleUxlbmd0aFsxXSA9IHBNc2cxLT5LZXlEZXNjLktleUxlbmd0aFsxXTsKKworCS8vIDQuIEZpbGwgU05vbmNlCisJTmRpc01vdmVNZW1vcnkoUGFja2V0LktleURlc2MuS2V5Tm9uY2UsIHBBZC0+U3RhQ2ZnLlNOb25jZSwgTEVOX0tFWV9ERVNDX05PTkNFKTsKKworCS8vIDUuIEtleSBSZXBsYXkgQ291bnQKKwlOZGlzTW92ZU1lbW9yeShQYWNrZXQuS2V5RGVzYy5SZXBsYXlDb3VudGVyLCBwQWQtPlN0YUNmZy5SZXBsYXlDb3VudGVyLCBMRU5fS0VZX0RFU0NfUkVQTEFZKTsKKworCS8vIENvbnZlcnQgdG8gbGl0dGxlLWVuZGlhbiBmb3JtYXQuCisJKigoVVNIT1JUICopJlBhY2tldC5LZXlEZXNjLktleUluZm8pID0gY3B1MmxlMTYoKigoVVNIT1JUICopJlBhY2tldC5LZXlEZXNjLktleUluZm8pKTsKKworCS8vIFNlbmQgRUFQT0wtS2V5KDAsMSwwLDAsMCxQLDAsU05vbmNlLE1JQyxSU04gSUUpCisJLy8gT3V0IGJ1ZmZlciBmb3IgdHJhbnNtaXR0aW5nIG1lc3NhZ2UgMgorCU1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICAoUFVDSEFSICopJnBPdXRCdWZmZXIpOyAgLy8gYWxsb2NhdGUgbWVtb3J5CisJaWYocE91dEJ1ZmZlciA9PSBOVUxMKQorCXsKKwkJb3NfZnJlZV9tZW0ocEFkLCBtcG9vbCk7CisJCXJldHVybjsKKwl9CisKKwkvLyBQcmVwYXJlIEVBUE9MIGZyYW1lIGZvciBNSUMgY2FsY3VsYXRpb24KKwkvLyBCZSBjYXJlZnVsLCBvbmx5IEVBUE9MIGZyYW1lIGlzIGNvdW50ZWQgZm9yIE1JQyBjYWxjdWxhdGlvbgorCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAmRnJhbWVMZW4sCisJCVBhY2tldC5Cb2R5X0xlblsxXSArIDQsICZQYWNrZXQsCisJCUVORF9PRl9BUkdTKTsKKworCS8vIDYuIFByZXBhcmUgYW5kIEZpbGwgTUlDIHZhbHVlCisJTmRpc1plcm9NZW1vcnkoTWljLCBzaXplb2YoTWljKSk7CisJaWYocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCisJeworCQkvLyBBRVMKKwkJSE1BQ19TSEExKHBPdXRCdWZmZXIsIEZyYW1lTGVuLCBQVEssIExFTl9FQVBfTUlDSywgZGlnZXN0KTsKKwkJTmRpc01vdmVNZW1vcnkoTWljLCBkaWdlc3QsIExFTl9LRVlfREVTQ19NSUMpOworCX0KKwllbHNlCisJeworCQlobWFjX21kNShQVEssICBMRU5fRUFQX01JQ0ssIHBPdXRCdWZmZXIsIEZyYW1lTGVuLCBNaWMpOworCX0KKwlOZGlzTW92ZU1lbW9yeShQYWNrZXQuS2V5RGVzYy5LZXlNaWMsIE1pYywgTEVOX0tFWV9ERVNDX01JQyk7CisKKworCS8vIE1ha2UgIFRyYW5zbWl0dGluZyBmcmFtZQorCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAgICAJJkZyYW1lTGVuLAorCQkJICAJCQlMRU5HVEhfODAyXzMsICAgICAJCSZIZWFkZXI4MDJfMywKKwkJCQkJCVBhY2tldC5Cb2R5X0xlblsxXSArIDQsICZQYWNrZXQsCisJCQkJCQlFTkRfT0ZfQVJHUyk7CisKKworCS8vIDUuIENvcHkgZnJhbWUgdG8gVHggcmluZworCVJUTVBUb1dpcmVsZXNzU3RhKHBBZCwgSGVhZGVyODAyXzMsIExFTkdUSF84MDJfMywgKFBVQ0hBUikmUGFja2V0LCBQYWNrZXQuQm9keV9MZW5bMV0gKyA0LCBUUlVFKTsKKworCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7CisJb3NfZnJlZV9tZW0ocEFkLCBtcG9vbCk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJXcGEyUGFpck1zZzFBY3Rpb24gPC0tLS0tXG4iKSk7CisKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVByb2Nlc3MgUGFpcndpc2Uga2V5IDQtd2F5IGhhbmRzaGFraW5nCisKKwlBcmd1bWVudHM6CisJCXBBZAlQb2ludGVyCXRvIG91ciBhZGFwdGVyCisJCUVsZW0JCU1lc3NhZ2UgYm9keQorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlXcGFQYWlyTXNnM0FjdGlvbigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglNTE1FX1FVRVVFX0VMRU0JKkVsZW0pCisKK3sKKwlQSEVBREVSXzgwMl8xMSAgICAgIHBIZWFkZXI7CisJUFVDSEFSICAgICAgICAgIAlwT3V0QnVmZmVyID0gTlVMTDsKKwlVQ0hBUiAgICAgICAgICAgICAgIEhlYWRlcjgwMl8zWzE0XTsKKwlVTE9ORyAgICAgICAgICAgCUZyYW1lTGVuID0gMDsKKwlFQVBPTF9QQUNLRVQgICAgICAgIFBhY2tldDsKKwlQRUFQT0xfUEFDS0VUICAgICAgIHBNc2czOworCVVDSEFSICAgICAgICAgICAJTWljWzE2XSwgT2xkTWljWzE2XTsKKwlNQUNfVEFCTEVfRU5UUlkgCSpwRW50cnkgPSBOVUxMOworCVVDSEFSCQkJCXNraXBfb2Zmc2V0OworCUtFWV9JTkZPCQkJcGVlcktleUluZm87CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJXcGFQYWlyTXNnM0FjdGlvbiAtLS0tLT5cbiIpKTsKKworCS8vIFJlY29yZCA4MDIuMTEgaGVhZGVyICYgdGhlIHJlY2VpdmVkIEVBUE9MIHBhY2tldCBNc2czCisJcEhlYWRlciA9IChQSEVBREVSXzgwMl8xMSkgRWxlbS0+TXNnOworCXBNc2czID0gKFBFQVBPTF9QQUNLRVQpCSZFbGVtLT5Nc2dbTEVOR1RIXzgwMl8xMSArIExFTkdUSF84MDJfMV9IXTsKKworCU5kaXNaZXJvTWVtb3J5KChQVUNIQVIpJnBlZXJLZXlJbmZvLCBzaXplb2YocGVlcktleUluZm8pKTsKKwlOZGlzTW92ZU1lbW9yeSgoUFVDSEFSKSZwZWVyS2V5SW5mbywgKFBVQ0hBUikmcE1zZzMtPktleURlc2MuS2V5SW5mbywgc2l6ZW9mKEtFWV9JTkZPKSk7CisKKwkqKChVU0hPUlQqKSZwZWVyS2V5SW5mbykgPSBjcHUybGUxNigqKChVU0hPUlQqKSZwZWVyS2V5SW5mbykpOworCisKKwkvLyAxLiBWZXJpZnkgY2lwaGVyIHR5cGUgbWF0Y2gKKwlpZiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzICA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkICYmIChwZWVyS2V5SW5mby5LZXlEZXNjVmVyICE9IDIpKQorCXsKKwkJcmV0dXJuOworCX0KKwllbHNlIGlmKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkICYmIChwZWVyS2V5SW5mby5LZXlEZXNjVmVyICE9IDEpKQorCXsKKwkJcmV0dXJuOworCX0KKworCS8vIFZlcmlmeSBSU04gSUUKKwkvL2lmICghUlRNUEVxdWFsTWVtb3J5KHBNc2czLT5LZXlEZXNjLktleURhdGEsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUlNOX0lFLCBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlJTTklFX0xlbikpCisJaWYgKCFDaGVja1JTTklFKHBBZCwgcE1zZzMtPktleURlc2MuS2V5RGF0YSwgcE1zZzMtPktleURlc2MuS2V5RGF0YUxlblsxXSwgJnNraXBfb2Zmc2V0KSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlJTTl9JRSBEaWZmZXJlbnQgaW4gTXNnIDMgb2YgV1BBMSA0LXdheSBoYW5kc2hha2UhISBcbiIpKTsKKwkJaGV4X2R1bXAoIlRoZSBvcmlnaW5hbCBSU05fSUUiLCBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlJTTl9JRSwgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5SU05JRV9MZW4pOworCQloZXhfZHVtcCgiVGhlIHJlY2VpdmVkIFJTTl9JRSIsIHBNc2czLT5LZXlEZXNjLktleURhdGEsIHBNc2czLT5LZXlEZXNjLktleURhdGFMZW5bMV0pOworCQlyZXR1cm47CisJfQorCWVsc2UKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlNOX0lFIFZBTElEIGluIE1zZyAzIG9mIFdQQTEgNC13YXkgaGFuZHNoYWtlISEgXG4iKSk7CisKKworCS8vIDIuIENoZWNrIE1JQyB2YWx1ZQorCS8vIFNhdmUgdGhlIE1JQyBhbmQgcmVwbGFjZSB3aXRoIHplcm8KKwlOZGlzTW92ZU1lbW9yeShPbGRNaWMsIHBNc2czLT5LZXlEZXNjLktleU1pYywgTEVOX0tFWV9ERVNDX01JQyk7CisJTmRpc1plcm9NZW1vcnkocE1zZzMtPktleURlc2MuS2V5TWljLCBMRU5fS0VZX0RFU0NfTUlDKTsKKwlpZihwQWQtPlN0YUNmZy5XZXBTdGF0dXMgID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCisJeworCQkvLyBBRVMKKwkJVUNIQVIgZGlnZXN0WzgwXTsKKworCQlITUFDX1NIQTEoKFBVQ0hBUikgcE1zZzMsIHBNc2czLT5Cb2R5X0xlblsxXSArIDQsIHBBZC0+U3RhQ2ZnLlBUSywgTEVOX0VBUF9NSUNLLCBkaWdlc3QpOworCQlOZGlzTW92ZU1lbW9yeShNaWMsIGRpZ2VzdCwgTEVOX0tFWV9ERVNDX01JQyk7CisJfQorCWVsc2UJLy8gVEtJUAorCXsKKwkJaG1hY19tZDUocEFkLT5TdGFDZmcuUFRLLCBMRU5fRUFQX01JQ0ssIChQVUNIQVIpIHBNc2czLCBwTXNnMy0+Qm9keV9MZW5bMV0gKyA0LCBNaWMpOworCX0KKworCWlmKCFOZGlzRXF1YWxNZW1vcnkoT2xkTWljLCBNaWMsIExFTl9LRVlfREVTQ19NSUMpKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiIE1JQyBEaWZmZXJlbnQgaW4gbXNnIDMgb2YgNC13YXkgaGFuZHNoYWtlISEhISEhISEhISBcbiIpKTsKKwkJcmV0dXJuOworCX0KKwllbHNlCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiBNSUMgVkFMSUQgaW4gbXNnIDMgb2YgNC13YXkgaGFuZHNoYWtlISEhISEhISEhISBcbiIpKTsKKworCS8vIDMuIENoZWNrIFJlcGxheSBDb3VudGVyLCBpdCBoYXMgdG8gYmUgbGFyZ2VyIHRoYW4gbGFzdCBvbmUuIE5vIG5lZWQgdG8gYmUgZXhhY3Qgb25lIGxhcmdlcgorCWlmKFJUTVBDb21wYXJlTWVtb3J5KHBNc2czLT5LZXlEZXNjLlJlcGxheUNvdW50ZXIsIHBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXIsIExFTl9LRVlfREVTQ19SRVBMQVkpICE9IDEpCisJCXJldHVybjsKKworCS8vIFVwZGF0ZSBuZXcgcmVwbGF5IGNvdW50ZXIKKwlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5SZXBsYXlDb3VudGVyLCBwTXNnMy0+S2V5RGVzYy5SZXBsYXlDb3VudGVyLCBMRU5fS0VZX0RFU0NfUkVQTEFZKTsKKworCS8vIDQuIERvdWJsZSBjaGVjayBBTm9uY2UKKwlpZighTmRpc0VxdWFsTWVtb3J5KHBBZC0+U3RhQ2ZnLkFOb25jZSwgcE1zZzMtPktleURlc2MuS2V5Tm9uY2UsIExFTl9LRVlfREVTQ19OT05DRSkpCisJCXJldHVybjsKKworCS8vIGluaXQgODAyLjMgaGVhZGVyIGFuZCBGaWxsIFBhY2tldAorCU1BS0VfODAyXzNfSEVBREVSKEhlYWRlcjgwMl8zLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgcEFkLT5DdXJyZW50QWRkcmVzcywgRUFQT0wpOworCisJLy8gWmVybyBNZXNzYWdlIDQgYm9keQorCU5kaXNaZXJvTWVtb3J5KCZQYWNrZXQsIHNpemVvZihQYWNrZXQpKTsKKwlQYWNrZXQuUHJvVmVyCT0gRUFQT0xfVkVSOworCVBhY2tldC5Qcm9UeXBlCT0gRUFQT0xLZXk7CisJUGFja2V0LkJvZHlfTGVuWzFdICA9IHNpemVvZihLRVlfREVTQ1JJUFRFUikgLSBNQVhfTEVOX09GX1JTTklFOwkJLy8gTm8gZGF0YSBmaWVsZAorCisJLy8KKwkvLyBNZXNzYWdlIDQgYXMgIEVBUE9MLUtleSgwLDEsMCwwLDAsUCwwLDAsTUlDLDApCisJLy8KKwlQYWNrZXQuS2V5RGVzYy5UeXBlID0gV1BBMV9LRVlfREVTQzsKKworCS8vIEtleSBkZXNjcmlwdG9yIHZlcnNpb24gYW5kIGFwcHJvcHJpYXRlIFJTTiBJRQorCVBhY2tldC5LZXlEZXNjLktleUluZm8uS2V5RGVzY1ZlciA9IHBlZXJLZXlJbmZvLktleURlc2NWZXI7CisKKwkvLyBVcGRhdGUgS2V5IExlbmd0aAorCVBhY2tldC5LZXlEZXNjLktleUxlbmd0aFswXSA9IHBNc2czLT5LZXlEZXNjLktleUxlbmd0aFswXTsKKwlQYWNrZXQuS2V5RGVzYy5LZXlMZW5ndGhbMV0gPSBwTXNnMy0+S2V5RGVzYy5LZXlMZW5ndGhbMV07CisKKwkvLyBLZXkgVHlwZSBQZWVyS2V5CisJUGFja2V0LktleURlc2MuS2V5SW5mby5LZXlUeXBlID0gUEFJUldJU0VLRVk7CisKKwkvLyBLZXlNaWMgZmllbGQgcHJlc2VudGVkCisJUGFja2V0LktleURlc2MuS2V5SW5mby5LZXlNaWMgID0gMTsKKworCS8vIEluIE1zZzMsICBLZXlJbmZvLnNlY3VyZSA9MCBpZiBHcm91cCBLZXkgSFMgdG8gY29tZS4gMSBpZiBubyBncm91cCBrZXkgSFMKKwkvLyBTdGF0aW9uIHNlbmRzIE1zZzQgIEtleUluZm8uc2VjdXJlIHNob3VsZCBiZSB0aGUgc2FtZSBhcyB0aGF0IGluIE1zZy4zCisJUGFja2V0LktleURlc2MuS2V5SW5mby5TZWN1cmU9IHBlZXJLZXlJbmZvLlNlY3VyZTsKKworCS8vIENvbnZlcnQgdG8gbGl0dGxlLWVuZGlhbiBmb3JtYXQuCisJKigoVVNIT1JUICopJlBhY2tldC5LZXlEZXNjLktleUluZm8pID0gY3B1MmxlMTYoKigoVVNIT1JUICopJlBhY2tldC5LZXlEZXNjLktleUluZm8pKTsKKworCS8vIEtleSBSZXBsYXkgY291bnQKKwlOZGlzTW92ZU1lbW9yeShQYWNrZXQuS2V5RGVzYy5SZXBsYXlDb3VudGVyLCBwTXNnMy0+S2V5RGVzYy5SZXBsYXlDb3VudGVyLCBMRU5fS0VZX0RFU0NfUkVQTEFZKTsKKworCS8vIE91dCBidWZmZXIgZm9yIHRyYW5zbWl0dGluZyBtZXNzYWdlIDQKKwlNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAoUFVDSEFSICopJnBPdXRCdWZmZXIpOyAgLy8gYWxsb2NhdGUgbWVtb3J5CisJaWYocE91dEJ1ZmZlciA9PSBOVUxMKQorCQlyZXR1cm47CisKKwkvLyBQcmVwYXJlIEVBUE9MIGZyYW1lIGZvciBNSUMgY2FsY3VsYXRpb24KKwkvLyBCZSBjYXJlZnVsLCBvbmx5IEVBUE9MIGZyYW1lIGlzIGNvdW50ZWQgZm9yIE1JQyBjYWxjdWxhdGlvbgorCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAgICAmRnJhbWVMZW4sCisJCVBhY2tldC5Cb2R5X0xlblsxXSArIDQsICAgICZQYWNrZXQsCisJCUVORF9PRl9BUkdTKTsKKworCS8vIFByZXBhcmUgYW5kIEZpbGwgTUlDIHZhbHVlCisJTmRpc1plcm9NZW1vcnkoTWljLCBzaXplb2YoTWljKSk7CisJaWYocEFkLT5TdGFDZmcuV2VwU3RhdHVzICA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQorCXsKKwkJLy8gQUVTCisJCVVDSEFSIGRpZ2VzdFs4MF07CisKKwkJSE1BQ19TSEExKHBPdXRCdWZmZXIsIEZyYW1lTGVuLCBwQWQtPlN0YUNmZy5QVEssIExFTl9FQVBfTUlDSywgZGlnZXN0KTsKKwkJTmRpc01vdmVNZW1vcnkoTWljLCBkaWdlc3QsIExFTl9LRVlfREVTQ19NSUMpOworCX0KKwllbHNlCisJeworCQlobWFjX21kNShwQWQtPlN0YUNmZy5QVEssIExFTl9FQVBfTUlDSywgcE91dEJ1ZmZlciwgRnJhbWVMZW4sIE1pYyk7CisJfQorCU5kaXNNb3ZlTWVtb3J5KFBhY2tldC5LZXlEZXNjLktleU1pYywgTWljLCBMRU5fS0VZX0RFU0NfTUlDKTsKKworCS8vIFVwZGF0ZSBQVEsKKwkvLyBQcmVwYXJlIHBhaXItd2lzZSBrZXkgaW5mb3JtYXRpb24gaW50byBzaGFyZWQga2V5IHRhYmxlCisJTmRpc1plcm9NZW1vcnkoJnBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLCBzaXplb2YoQ0lQSEVSX0tFWSkpOworCXBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLktleUxlbiA9IExFTl9US0lQX0VLOworICAgIE5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLktleSwgJnBBZC0+U3RhQ2ZnLlBUS1szMl0sIExFTl9US0lQX0VLKTsKKwlOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5SeE1pYywgJnBBZC0+U3RhQ2ZnLlBUS1s0OF0sIExFTl9US0lQX1JYTUlDSyk7CisJTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uVHhNaWMsICZwQWQtPlN0YUNmZy5QVEtbNDgrTEVOX1RLSVBfUlhNSUNLXSwgTEVOX1RLSVBfVFhNSUNLKTsKKworCS8vIERlY2lkZSBpdHMgQ2hpcGVyQWxnCisJaWYgKHBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkKKwkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnID0gQ0lQSEVSX1RLSVA7CisJZWxzZSBpZiAocEFkLT5TdGFDZmcuUGFpckNpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQorCQlwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcgPSBDSVBIRVJfQUVTOworCWVsc2UKKwkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnID0gQ0lQSEVSX05PTkU7CisKKwkvLyBVcGRhdGUgdGhlc2UgcmVsYXRlZCBpbmZvcm1hdGlvbiB0byBNQUNfVEFCTEVfRU5UUlkKKwlwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXTsKKwlOZGlzTW92ZU1lbW9yeShwRW50cnktPlBhaXJ3aXNlS2V5LktleSwgJnBBZC0+U3RhQ2ZnLlBUS1szMl0sIExFTl9US0lQX0VLKTsKKwlOZGlzTW92ZU1lbW9yeShwRW50cnktPlBhaXJ3aXNlS2V5LlJ4TWljLCAmcEFkLT5TdGFDZmcuUFRLWzQ4XSwgTEVOX1RLSVBfUlhNSUNLKTsKKwlOZGlzTW92ZU1lbW9yeShwRW50cnktPlBhaXJ3aXNlS2V5LlR4TWljLCAmcEFkLT5TdGFDZmcuUFRLWzQ4K0xFTl9US0lQX1JYTUlDS10sIExFTl9US0lQX1RYTUlDSyk7CisJcEVudHJ5LT5QYWlyd2lzZUtleS5DaXBoZXJBbGcgPSBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGc7CisKKwkvLyBVcGRhdGUgcGFpcndpc2Uga2V5IGluZm9ybWF0aW9uIHRvIEFTSUMgU2hhcmVkIEtleSBUYWJsZQorCUFzaWNBZGRTaGFyZWRLZXlFbnRyeShwQWQsCisJCQkJCQkgIEJTUzAsCisJCQkJCQkgIDAsCisJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZywKKwkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5LAorCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5UeE1pYywKKwkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uUnhNaWMpOworCisJLy8gVXBkYXRlIEFTSUMgV0NJRCBhdHRyaWJ1dGUgdGFibGUgYW5kIElWRUlWIHRhYmxlCisJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWQsCisJCQkJCQkJICBCU1MwLAorCQkJCQkJCSAgMCwKKwkJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZywKKwkJCQkJCQkgIHBFbnRyeSk7CisKKwkvLyBNYWtlIHRyYW5zbWl0dGluZyBmcmFtZQorCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAgICAJJkZyYW1lTGVuLAorCQkJICAJCQlMRU5HVEhfODAyXzMsICAgICAJCSZIZWFkZXI4MDJfMywKKwkJCQkJCVBhY2tldC5Cb2R5X0xlblsxXSArIDQsICZQYWNrZXQsCisJCQkJCQlFTkRfT0ZfQVJHUyk7CisKKworCS8vIENvcHkgZnJhbWUgdG8gVHggcmluZyBhbmQgU2VuZCBNZXNzYWdlIDQgdG8gYXV0aGVudGljYXRvcgorCVJUTVBUb1dpcmVsZXNzU3RhKHBBZCwgSGVhZGVyODAyXzMsIExFTkdUSF84MDJfMywgKFBVQ0hBUikmUGFja2V0LCBQYWNrZXQuQm9keV9MZW5bMV0gKyA0LCBUUlVFKTsKKworCU1sbWVGcmVlTWVtb3J5KHBBZCwgKFBVQ0hBUilwT3V0QnVmZmVyKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIldwYVBhaXJNc2czQWN0aW9uIDwtLS0tLVxuIikpOworfQorCitWT0lEICAgIFdwYTJQYWlyTXNnM0FjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKQorCit7CisJUEhFQURFUl84MDJfMTEgICAgICBwSGVhZGVyOworCVBVQ0hBUiAgICAgICAgICAgICAgcE91dEJ1ZmZlciA9IE5VTEw7CisJVUNIQVIgICAgICAgICAgICAgICBIZWFkZXI4MDJfM1sxNF07CisJVUxPTkcgICAgICAgICAgICAgICBGcmFtZUxlbiA9IDA7CisJRUFQT0xfUEFDS0VUICAgICAgICBQYWNrZXQ7CisJUEVBUE9MX1BBQ0tFVCAgICAgICBwTXNnMzsKKwlVQ0hBUiAgICAgICAgICAgICAgIE1pY1sxNl0sIE9sZE1pY1sxNl07CisJVUNIQVIgICAgICAgICAgICAgICAqbXBvb2wsICpLRVlEQVRBLCAqZGlnZXN0OworCVVDSEFSICAgICAgICAgICAgICAgS2V5WzMyXTsKKwlNQUNfVEFCTEVfRU5UUlkgCSpwRW50cnkgPSBOVUxMOworCUtFWV9JTkZPCQkJcGVlcktleUluZm87CisKKwkvLyBhbGxvY2F0ZSBtZW1vcnkKKwlvc19hbGxvY19tZW0ocEFkLCAoUFVDSEFSICopJm1wb29sLCAxMDI0KTsKKworCWlmKG1wb29sID09IE5VTEwpCisJCXJldHVybjsKKworCS8vIEtFWURBVEEgTGVuID0gNTEyLgorCUtFWURBVEEgPSAoVUNIQVIgKikgUk9VTkRfVVAobXBvb2wsIDQpOworCS8vIGRpZ2VzdCBMZW4gPSA4MC4KKwlkaWdlc3QgPSAoVUNIQVIgKikgUk9VTkRfVVAoS0VZREFUQSArIDUxMiwgNCk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJXcGEyUGFpck1zZzNBY3Rpb24gLS0tLS0+XG4iKSk7CisKKwlwSGVhZGVyID0gKFBIRUFERVJfODAyXzExKSBFbGVtLT5Nc2c7CisKKwkvLyBQcm9jZXNzIG1lc3NhZ2UgMyBmcmFtZS4KKwlwTXNnMyA9IChQRUFQT0xfUEFDS0VUKQkmRWxlbS0+TXNnW0xFTkdUSF84MDJfMTEgKyBMRU5HVEhfODAyXzFfSF07CisKKwlOZGlzWmVyb01lbW9yeSgoUFVDSEFSKSZwZWVyS2V5SW5mbywgc2l6ZW9mKHBlZXJLZXlJbmZvKSk7CisJTmRpc01vdmVNZW1vcnkoKFBVQ0hBUikmcGVlcktleUluZm8sIChQVUNIQVIpJnBNc2czLT5LZXlEZXNjLktleUluZm8sIHNpemVvZihLRVlfSU5GTykpOworCisJKigoVVNIT1JUKikmcGVlcktleUluZm8pID0gY3B1MmxlMTYoKigoVVNIT1JUKikmcGVlcktleUluZm8pKTsKKworCS8vIDEuIFZlcmlmeSBjaXBoZXIgdHlwZSBtYXRjaAorCWlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCAmJiAocGVlcktleUluZm8uS2V5RGVzY1ZlciE9IDIpKQorCXsKKwkJb3NfZnJlZV9tZW0ocEFkLCAoUFVDSEFSKW1wb29sKTsKKwkJcmV0dXJuOworCX0KKwllbHNlIGlmKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkICYmIChwZWVyS2V5SW5mby5LZXlEZXNjVmVyICE9IDEpKQorCXsKKwkJb3NfZnJlZV9tZW0ocEFkLCAoUFVDSEFSKW1wb29sKTsKKwkJcmV0dXJuOworCX0KKworCS8vIDIuIENoZWNrIE1JQyB2YWx1ZQorCS8vIFNhdmUgdGhlIE1JQyBhbmQgcmVwbGFjZSB3aXRoIHplcm8KKwlOZGlzTW92ZU1lbW9yeShPbGRNaWMsIHBNc2czLT5LZXlEZXNjLktleU1pYywgTEVOX0tFWV9ERVNDX01JQyk7CisJTmRpc1plcm9NZW1vcnkocE1zZzMtPktleURlc2MuS2V5TWljLCBMRU5fS0VZX0RFU0NfTUlDKTsKKwlpZiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCisJeworCQkvLyBBRVMKKwkJSE1BQ19TSEExKChQVUNIQVIpIHBNc2czLCBwTXNnMy0+Qm9keV9MZW5bMV0gKyA0LCBwQWQtPlN0YUNmZy5QVEssIExFTl9FQVBfTUlDSywgZGlnZXN0KTsKKwkJTmRpc01vdmVNZW1vcnkoTWljLCBkaWdlc3QsIExFTl9LRVlfREVTQ19NSUMpOworCX0KKwllbHNlCisJeworCQlobWFjX21kNShwQWQtPlN0YUNmZy5QVEssIExFTl9FQVBfTUlDSywgKFBVQ0hBUikgcE1zZzMsIHBNc2czLT5Cb2R5X0xlblsxXSArIDQsIE1pYyk7CisJfQorCisJaWYoIU5kaXNFcXVhbE1lbW9yeShPbGRNaWMsIE1pYywgTEVOX0tFWV9ERVNDX01JQykpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIgTUlDIERpZmZlcmVudCBpbiBtc2cgMyBvZiA0LXdheSBoYW5kc2hha2UhISEhISEhISEhIFxuIikpOworCQlvc19mcmVlX21lbShwQWQsIChQVUNIQVIpbXBvb2wpOworCQlyZXR1cm47CisJfQorCWVsc2UKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiIE1JQyBWQUxJRCBpbiBtc2cgMyBvZiA0LXdheSBoYW5kc2hha2UhISEhISEhISEhIFxuIikpOworCisJLy8gMy4gQ2hlY2sgUmVwbGF5IENvdW50ZXIsIGl0IGhhcyB0byBiZSBsYXJnZXIgdGhhbiBsYXN0IG9uZS4gTm8gbmVlZCB0byBiZSBleGFjdCBvbmUgbGFyZ2VyCisJaWYoUlRNUENvbXBhcmVNZW1vcnkocE1zZzMtPktleURlc2MuUmVwbGF5Q291bnRlciwgcEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlciwgTEVOX0tFWV9ERVNDX1JFUExBWSkgIT0gMSkKKwl7CisJCW9zX2ZyZWVfbWVtKHBBZCwgKFBVQ0hBUiltcG9vbCk7CisJCXJldHVybjsKKwl9CisKKwkvLyBVcGRhdGUgbmV3IHJlcGxheSBjb3VudGVyCisJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlciwgcE1zZzMtPktleURlc2MuUmVwbGF5Q291bnRlciwgTEVOX0tFWV9ERVNDX1JFUExBWSk7CisKKwkvLyA0LiBEb3VibGUgY2hlY2sgQU5vbmNlCisJaWYoIU5kaXNFcXVhbE1lbW9yeShwQWQtPlN0YUNmZy5BTm9uY2UsIHBNc2czLT5LZXlEZXNjLktleU5vbmNlLCBMRU5fS0VZX0RFU0NfTk9OQ0UpKQorCXsKKwkJb3NfZnJlZV9tZW0ocEFkLCAoUFVDSEFSKW1wb29sKTsKKwkJcmV0dXJuOworCX0KKworCS8vIE9idGFpbiBHVEsKKwkvLyA1LiBEZWNyeXB0IEdUSyBmcm9tIEtleSBEYXRhCisJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIkVLRCA9ICVkXG4iLCBwZWVyS2V5SW5mby5FS0RfREwpKTsKKwlpZihwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKKwl7CisJCS8vIERlY3J5cHQgQUVTIEdUSworCQlBRVNfR1RLX0tFWV9VTldSQVAoJnBBZC0+U3RhQ2ZnLlBUS1sxNl0sIEtFWURBVEEsIHBNc2czLT5LZXlEZXNjLktleURhdGFMZW5bMV0scE1zZzMtPktleURlc2MuS2V5RGF0YSk7CisJfQorCWVsc2UJICAvLyBUS0lQCisJeworCQlJTlQgaTsKKwkJLy8gRGVjcnlwdCBUS0lQIEdUSworCQkvLyBDb25zdHJ1Y3QgMzIgYnl0ZXMgUkM0IEtleQorCQlOZGlzTW92ZU1lbW9yeShLZXksIHBNc2czLT5LZXlEZXNjLktleUl2LCAxNik7CisJCU5kaXNNb3ZlTWVtb3J5KCZLZXlbMTZdLCAmcEFkLT5TdGFDZmcuUFRLWzE2XSwgMTYpOworCQlBUkNGT1VSX0lOSVQoJnBBZC0+UHJpdmF0ZUluZm8uV0VQQ09OVEVYVCwgS2V5LCAzMik7CisJCS8vZGlzY2FyZCBmaXJzdCAyNTYgYnl0ZXMKKwkJZm9yKGkgPSAwOyBpIDwgMjU2OyBpKyspCisJCQlBUkNGT1VSX0JZVEUoJnBBZC0+UHJpdmF0ZUluZm8uV0VQQ09OVEVYVCk7CisJCS8vIERlY3J5cHQgR1RLLiBCZWNhcmVmdWwsIHRoZXJlIGlzIG5vIElDViB0byBjaGVjayB0aGUgcmVzdWx0IGlzIGNvcnJlY3Qgb3Igbm90CisJCUFSQ0ZPVVJfREVDUllQVCgmcEFkLT5Qcml2YXRlSW5mby5XRVBDT05URVhULCBLRVlEQVRBLCBwTXNnMy0+S2V5RGVzYy5LZXlEYXRhLCBwTXNnMy0+S2V5RGVzYy5LZXlEYXRhTGVuWzFdKTsKKwl9CisKKwlpZiAoIVBhcnNlS2V5RGF0YShwQWQsIEtFWURBVEEsIHBNc2czLT5LZXlEZXNjLktleURhdGFMZW5bMV0sIDEpKQorCXsKKwkJb3NfZnJlZV9tZW0ocEFkLCAoUFVDSEFSKW1wb29sKTsKKwkJcmV0dXJuOworCX0KKworCS8vIFVwZGF0ZSBHVEsgdG8gQVNJQworCS8vIFVwZGF0ZSBncm91cCBrZXkgaW5mb3JtYXRpb24gdG8gQVNJQyBTaGFyZWQgS2V5IFRhYmxlCisJQXNpY0FkZFNoYXJlZEtleUVudHJ5KHBBZCwKKwkJCQkJCSAgQlNTMCwKKwkJCQkJCSAgcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkLAorCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLkNpcGhlckFsZywKKwkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5LZXksCisJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uVHhNaWMsCisJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uUnhNaWMpOworCisJLy8gVXBkYXRlIEFTSUMgV0NJRCBhdHRyaWJ1dGUgdGFibGUgYW5kIElWRUlWIHRhYmxlCisJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWQsCisJCQkJCQkJICBCU1MwLAorCQkJCQkJCSAgcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkLAorCQkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5DaXBoZXJBbGcsCisJCQkJCQkJICBOVUxMKTsKKworCS8vIGluaXQgODAyLjMgaGVhZGVyIGFuZCBGaWxsIFBhY2tldAorCU1BS0VfODAyXzNfSEVBREVSKEhlYWRlcjgwMl8zLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgcEFkLT5DdXJyZW50QWRkcmVzcywgRUFQT0wpOworCisJLy8gWmVybyBtZXNzYWdlIDQgYm9keQorCU5kaXNaZXJvTWVtb3J5KCZQYWNrZXQsIHNpemVvZihQYWNrZXQpKTsKKwlQYWNrZXQuUHJvVmVyCT0gRUFQT0xfVkVSOworCVBhY2tldC5Qcm9UeXBlCT0gRUFQT0xLZXk7CisJUGFja2V0LkJvZHlfTGVuWzFdICAJPSBzaXplb2YoS0VZX0RFU0NSSVBURVIpIC0gTUFYX0xFTl9PRl9SU05JRTsJCS8vIE5vIGRhdGEgZmllbGQKKworCS8vCisJLy8gTWVzc2FnZSA0IGFzICBFQVBPTC1LZXkoMCwxLDAsMCwwLFAsMCwwLE1JQywwKQorCS8vCisJUGFja2V0LktleURlc2MuVHlwZSA9IFdQQTJfS0VZX0RFU0M7CisKKwkvLyBLZXkgZGVzY3JpcHRvciB2ZXJzaW9uIGFuZCBhcHByb3ByaWF0ZSBSU04gSUUKKwlQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLktleURlc2NWZXIgPSBwZWVyS2V5SW5mby5LZXlEZXNjVmVyOworCisJLy8gVXBkYXRlIEtleSBMZW5ndGgKKwlQYWNrZXQuS2V5RGVzYy5LZXlMZW5ndGhbMF0gPSBwTXNnMy0+S2V5RGVzYy5LZXlMZW5ndGhbMF07CisJUGFja2V0LktleURlc2MuS2V5TGVuZ3RoWzFdID0gcE1zZzMtPktleURlc2MuS2V5TGVuZ3RoWzFdOworCisJLy8gS2V5IFR5cGUgUGVlcktleQorCVBhY2tldC5LZXlEZXNjLktleUluZm8uS2V5VHlwZSA9IFBBSVJXSVNFS0VZOworCisJLy8gS2V5TWljIGZpZWxkIHByZXNlbnRlZAorCVBhY2tldC5LZXlEZXNjLktleUluZm8uS2V5TWljICA9IDE7CisJUGFja2V0LktleURlc2MuS2V5SW5mby5TZWN1cmUgPSAxOworCisJLy8gQ29udmVydCB0byBsaXR0bGUtZW5kaWFuIGZvcm1hdC4KKwkqKChVU0hPUlQgKikmUGFja2V0LktleURlc2MuS2V5SW5mbykgPSBjcHUybGUxNigqKChVU0hPUlQgKikmUGFja2V0LktleURlc2MuS2V5SW5mbykpOworCisJLy8gS2V5IFJlcGxheSBjb3VudAorCU5kaXNNb3ZlTWVtb3J5KFBhY2tldC5LZXlEZXNjLlJlcGxheUNvdW50ZXIsIHBNc2czLT5LZXlEZXNjLlJlcGxheUNvdW50ZXIsIExFTl9LRVlfREVTQ19SRVBMQVkpOworCisJLy8gT3V0IGJ1ZmZlciBmb3IgdHJhbnNtaXR0aW5nIG1lc3NhZ2UgNAorCU1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsIChQVUNIQVIgKikmcE91dEJ1ZmZlcik7ICAvLyBhbGxvY2F0ZSBtZW1vcnkKKwlpZihwT3V0QnVmZmVyID09IE5VTEwpCisJeworCQlvc19mcmVlX21lbShwQWQsIChQVUNIQVIpbXBvb2wpOworCQlyZXR1cm47CisJfQorCisJLy8gUHJlcGFyZSBFQVBPTCBmcmFtZSBmb3IgTUlDIGNhbGN1bGF0aW9uCisJLy8gQmUgY2FyZWZ1bCwgb25seSBFQVBPTCBmcmFtZSBpcyBjb3VudGVkIGZvciBNSUMgY2FsY3VsYXRpb24KKwlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAgICAgICAgICAgJkZyYW1lTGVuLAorCQlQYWNrZXQuQm9keV9MZW5bMV0gKyA0LCAgICAmUGFja2V0LAorCQlFTkRfT0ZfQVJHUyk7CisKKwkvLyBQcmVwYXJlIGFuZCBGaWxsIE1JQyB2YWx1ZQorCU5kaXNaZXJvTWVtb3J5KE1pYywgc2l6ZW9mKE1pYykpOworCWlmKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQorCXsKKwkJLy8gQUVTCisJCUhNQUNfU0hBMShwT3V0QnVmZmVyLCBGcmFtZUxlbiwgcEFkLT5TdGFDZmcuUFRLLCBMRU5fRUFQX01JQ0ssIGRpZ2VzdCk7CisJCU5kaXNNb3ZlTWVtb3J5KE1pYywgZGlnZXN0LCBMRU5fS0VZX0RFU0NfTUlDKTsKKwl9CisJZWxzZQorCXsKKwkJaG1hY19tZDUocEFkLT5TdGFDZmcuUFRLLCBMRU5fRUFQX01JQ0ssIHBPdXRCdWZmZXIsIEZyYW1lTGVuLCBNaWMpOworCX0KKwlOZGlzTW92ZU1lbW9yeShQYWNrZXQuS2V5RGVzYy5LZXlNaWMsIE1pYywgTEVOX0tFWV9ERVNDX01JQyk7CisKKwkvLyBVcGRhdGUgUFRLCisJLy8gUHJlcGFyZSBwYWlyLXdpc2Uga2V5IGluZm9ybWF0aW9uIGludG8gc2hhcmVkIGtleSB0YWJsZQorCU5kaXNaZXJvTWVtb3J5KCZwQWQtPlNoYXJlZEtleVtCU1MwXVswXSwgc2l6ZW9mKENJUEhFUl9LRVkpKTsKKwlwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5LZXlMZW4gPSBMRU5fVEtJUF9FSzsKKyAgICBOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5LZXksICZwQWQtPlN0YUNmZy5QVEtbMzJdLCBMRU5fVEtJUF9FSyk7CisJTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uUnhNaWMsICZwQWQtPlN0YUNmZy5QVEtbNDhdLCBMRU5fVEtJUF9SWE1JQ0spOworCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLlR4TWljLCAmcEFkLT5TdGFDZmcuUFRLWzQ4K0xFTl9US0lQX1JYTUlDS10sIExFTl9US0lQX1RYTUlDSyk7CisKKwkvLyBEZWNpZGUgaXRzIENoaXBlckFsZworCWlmIChwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpCisJCXBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZyA9IENJUEhFUl9US0lQOworCWVsc2UgaWYgKHBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKKwkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnID0gQ0lQSEVSX0FFUzsKKwllbHNlCisJCXBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZyA9IENJUEhFUl9OT05FOworCisJLy8gVXBkYXRlIHRoZXNlIHJlbGF0ZWQgaW5mb3JtYXRpb24gdG8gTUFDX1RBQkxFX0VOVFJZCisJcEVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF07CisJTmRpc01vdmVNZW1vcnkoJnBFbnRyeS0+UGFpcndpc2VLZXkuS2V5LCAmcEFkLT5TdGFDZmcuUFRLWzMyXSwgTEVOX1RLSVBfRUspOworCU5kaXNNb3ZlTWVtb3J5KCZwRW50cnktPlBhaXJ3aXNlS2V5LlJ4TWljLCAmcEFkLT5TdGFDZmcuUFRLWzQ4XSwgTEVOX1RLSVBfUlhNSUNLKTsKKwlOZGlzTW92ZU1lbW9yeSgmcEVudHJ5LT5QYWlyd2lzZUtleS5UeE1pYywgJnBBZC0+U3RhQ2ZnLlBUS1s0OCtMRU5fVEtJUF9SWE1JQ0tdLCBMRU5fVEtJUF9UWE1JQ0spOworCXBFbnRyeS0+UGFpcndpc2VLZXkuQ2lwaGVyQWxnID0gcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnOworCisJLy8gVXBkYXRlIHBhaXJ3aXNlIGtleSBpbmZvcm1hdGlvbiB0byBBU0lDIFNoYXJlZCBLZXkgVGFibGUKKwlBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkLAorCQkJCQkJICBCU1MwLAorCQkJCQkJICAwLAorCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcsCisJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLktleSwKKwkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uVHhNaWMsCisJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLlJ4TWljKTsKKworCS8vIFVwZGF0ZSBBU0lDIFdDSUQgYXR0cmlidXRlIHRhYmxlIGFuZCBJVkVJViB0YWJsZQorCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkocEFkLAorCQkJCQkJCSAgQlNTMCwKKwkJCQkJCQkgIDAsCisJCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcsCisJCQkJCQkJICBwRW50cnkpOworCisJLy8gTWFrZSAgVHJhbnNtaXR0aW5nIGZyYW1lCisJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICAgIAkmRnJhbWVMZW4sCisJCQkgIAkJCUxFTkdUSF84MDJfMywgICAgIAkJJkhlYWRlcjgwMl8zLAorCQkJCQkJUGFja2V0LkJvZHlfTGVuWzFdICsgNCwgJlBhY2tldCwKKwkJCQkJCUVORF9PRl9BUkdTKTsKKworCisJLy8gQ29weSBmcmFtZSB0byBUeCByaW5nIGFuZCBTZW5kIE1lc3NhZ2UgNCB0byBhdXRoZW50aWNhdG9yCisJUlRNUFRvV2lyZWxlc3NTdGEocEFkLCBIZWFkZXI4MDJfMywgTEVOR1RIXzgwMl8zLCAoUFVDSEFSKSZQYWNrZXQsIFBhY2tldC5Cb2R5X0xlblsxXSArIDQsIFRSVUUpOworCisJLy8gc2V0IDgwMi4xeCBwb3J0IGNvbnRyb2wKKwlTVEFfUE9SVF9TRUNVUkVEKHBBZCk7CisKKyAgICAvLyBJbmRpY2F0ZSBDb25uZWN0ZWQgZm9yIEdVSQorICAgIHBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID0gTmRpc01lZGlhU3RhdGVDb25uZWN0ZWQ7CisKKwlNbG1lRnJlZU1lbW9yeShwQWQsIChQVUNIQVIpcE91dEJ1ZmZlcik7CisJb3NfZnJlZV9tZW0ocEFkLCAoUFVDSEFSKW1wb29sKTsKKworCisJLy8gc2VuZCB3aXJlbGVzcyBldmVudCAtIGZvciBzZXQga2V5IGRvbmUgV1BBMgorCWlmIChwQWQtPkNvbW1vbkNmZy5iV2lyZWxlc3NFdmVudCkKKwkJUlRNUFNlbmRXaXJlbGVzc0V2ZW50KHBBZCwgSVdfU0VUX0tFWV9ET05FX1dQQTJfRVZFTlRfRkxBRywgcEVudHJ5LT5BZGRyLCBCU1MwLCAwKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIldwYTJQYWlyTXNnM0FjdGlvbiA8LS0tLS1cbiIpKTsKKworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJUHJvY2VzcyBHcm91cCBrZXkgMi13YXkgaGFuZHNoYWtpbmcKKworCUFyZ3VtZW50czoKKwkJcEFkCVBvaW50ZXIJdG8gb3VyIGFkYXB0ZXIKKwkJRWxlbQkJTWVzc2FnZSBib2R5CisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECVdwYUdyb3VwTXNnMUFjdGlvbigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglNTE1FX1FVRVVFX0VMRU0JKkVsZW0pCisKK3sKKwlQVUNIQVIgICAgICAgICAgICAgIHBPdXRCdWZmZXIgPSBOVUxMOworCVVDSEFSICAgICAgICAgICAgICAgSGVhZGVyODAyXzNbMTRdOworCVVMT05HICAgICAgICAgICAgICAgRnJhbWVMZW4gPSAwOworCUVBUE9MX1BBQ0tFVCAgICAgICAgUGFja2V0OworCVBFQVBPTF9QQUNLRVQgICAgICAgcEdyb3VwOworCVVDSEFSICAgICAgICAgICAgICAgKm1wb29sLCAqZGlnZXN0LCAqS0VZREFUQTsKKwlVQ0hBUiAgICAgICAgICAgICAgIE1pY1sxNl0sIE9sZE1pY1sxNl07CisJVUNIQVIgICAgICAgICAgICAgICBHVEtbMzJdLCBLZXlbMzJdOworCUtFWV9JTkZPCQkJcGVlcktleUluZm87CisKKwkvLyBhbGxvY2F0ZSBtZW1vcnkKKwlvc19hbGxvY19tZW0ocEFkLCAoUFVDSEFSICopJm1wb29sLCAxMDI0KTsKKworCWlmKG1wb29sID09IE5VTEwpCisJCXJldHVybjsKKworCS8vIGRpZ2VzdCBMZW4gPSA4MC4KKwlkaWdlc3QgPSAoVUNIQVIgKikgUk9VTkRfVVAobXBvb2wsIDQpOworCS8vIEtFWURBVEEgTGVuID0gNTEyLgorCUtFWURBVEEgPSAoVUNIQVIgKikgUk9VTkRfVVAoZGlnZXN0ICsgODAsIDQpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiV3BhR3JvdXBNc2cxQWN0aW9uIC0tLS0tPlxuIikpOworCisJLy8gUHJvY2VzcyBHcm91cCBNZXNzYWdlIDEgZnJhbWUuIHNraXAgODAyLjExIGhlYWRlcigyNCkgJiBMTENfU05BUCBoZWFkZXIoOCkKKwlwR3JvdXAgPSAoUEVBUE9MX1BBQ0tFVCkgJkVsZW0tPk1zZ1tMRU5HVEhfODAyXzExICsgTEVOR1RIXzgwMl8xX0hdOworCisJTmRpc1plcm9NZW1vcnkoKFBVQ0hBUikmcGVlcktleUluZm8sIHNpemVvZihwZWVyS2V5SW5mbykpOworCU5kaXNNb3ZlTWVtb3J5KChQVUNIQVIpJnBlZXJLZXlJbmZvLCAoUFVDSEFSKSZwR3JvdXAtPktleURlc2MuS2V5SW5mbywgc2l6ZW9mKEtFWV9JTkZPKSk7CisKKwkqKChVU0hPUlQqKSZwZWVyS2V5SW5mbykgPSBjcHUybGUxNigqKChVU0hPUlQqKSZwZWVyS2V5SW5mbykpOworCisJLy8gMC4gQ2hlY2sgY2lwaGVyIHR5cGUgbWF0Y2gKKwlpZiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQgJiYgKHBlZXJLZXlJbmZvLktleURlc2NWZXIgIT0gMikpCisJeworCQlvc19mcmVlX21lbShwQWQsIChQVUNIQVIpbXBvb2wpOworCQlyZXR1cm47CisJfQorCWVsc2UgaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkICYmIChwZWVyS2V5SW5mby5LZXlEZXNjVmVyICE9IDEpKQorCXsKKwkJb3NfZnJlZV9tZW0ocEFkLCAoUFVDSEFSKW1wb29sKTsKKwkJcmV0dXJuOworCX0KKworCS8vIDEuIFZlcmlmeSBSZXBsYXkgY291bnRlcgorCS8vICAgIENoZWNrIFJlcGxheSBDb3VudGVyLCBpdCBoYXMgdG8gYmUgbGFyZ2VyIHRoYW4gbGFzdCBvbmUuIE5vIG5lZWQgdG8gYmUgZXhhY3Qgb25lIGxhcmdlcgorCWlmKFJUTVBDb21wYXJlTWVtb3J5KHBHcm91cC0+S2V5RGVzYy5SZXBsYXlDb3VudGVyLCBwQWQtPlN0YUNmZy5SZXBsYXlDb3VudGVyLCBMRU5fS0VZX0RFU0NfUkVQTEFZKSAhPSAxKQorCXsKKwkJb3NfZnJlZV9tZW0ocEFkLCAoUFVDSEFSKW1wb29sKTsKKwkJcmV0dXJuOworCX0KKworCS8vIFVwZGF0ZSBuZXcgcmVwbGF5IGNvdW50ZXIKKwlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5SZXBsYXlDb3VudGVyLCBwR3JvdXAtPktleURlc2MuUmVwbGF5Q291bnRlciwgTEVOX0tFWV9ERVNDX1JFUExBWSk7CisKKwkvLyAyLiBWZXJpZnkgTUlDIGlzIHZhbGlkCisJLy8gU2F2ZSB0aGUgTUlDIGFuZCByZXBsYWNlIHdpdGggemVybworCU5kaXNNb3ZlTWVtb3J5KE9sZE1pYywgcEdyb3VwLT5LZXlEZXNjLktleU1pYywgTEVOX0tFWV9ERVNDX01JQyk7CisJTmRpc1plcm9NZW1vcnkocEdyb3VwLT5LZXlEZXNjLktleU1pYywgTEVOX0tFWV9ERVNDX01JQyk7CisKKwlpZihwQWQtPlN0YUNmZy5XZXBTdGF0dXMgID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCisJewkvLyBBRVMKKwkJSE1BQ19TSEExKChQVUNIQVIpIHBHcm91cCwgcEdyb3VwLT5Cb2R5X0xlblsxXSArIDQsIHBBZC0+U3RhQ2ZnLlBUSywgTEVOX0VBUF9NSUNLLCBkaWdlc3QpOworCQlOZGlzTW92ZU1lbW9yeShNaWMsIGRpZ2VzdCwgTEVOX0tFWV9ERVNDX01JQyk7CisJfQorCWVsc2UKKwl7CS8vIFRLSVAKKwkJaG1hY19tZDUocEFkLT5TdGFDZmcuUFRLLCBMRU5fRUFQX01JQ0ssIChQVUNIQVIpIHBHcm91cCwgcEdyb3VwLT5Cb2R5X0xlblsxXSArIDQsIE1pYyk7CisJfQorCisJaWYoIU5kaXNFcXVhbE1lbW9yeShPbGRNaWMsIE1pYywgTEVOX0tFWV9ERVNDX01JQykpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIgTUlDIERpZmZlcmVudCBpbiBncm91cCBtc2cgMSBvZiAyLXdheSBoYW5kc2hha2UhISEhISEhISEhIFxuIikpOworCQlNbG1lRnJlZU1lbW9yeShwQWQsIChQVUNIQVIpbXBvb2wpOworCQlyZXR1cm47CisJfQorCWVsc2UKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiIE1JQyBWQUxJRCBpbiBncm91cCBtc2cgMSBvZiAyLXdheSBoYW5kc2hha2UhISEhISEhISEhIFxuIikpOworCisKKwkvLyAzLiBEZWNyeXB0IEdUSyBmcm9tIEtleSBEYXRhCisJaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQorCXsKKwkJLy8gRGVjcnlwdCBBRVMgR1RLCisJCUFFU19HVEtfS0VZX1VOV1JBUCgmcEFkLT5TdGFDZmcuUFRLWzE2XSwgS0VZREFUQSwgIHBHcm91cC0+S2V5RGVzYy5LZXlEYXRhTGVuWzFdLCBwR3JvdXAtPktleURlc2MuS2V5RGF0YSk7CisJfQorCWVsc2UJLy8gVEtJUAorCXsKKwkJSU5UIGk7CisKKwkJLy8gRGVjcnlwdCBUS0lQIEdUSworCQkvLyBDb25zdHJ1Y3QgMzIgYnl0ZXMgUkM0IEtleQorCQlOZGlzTW92ZU1lbW9yeShLZXksIHBHcm91cC0+S2V5RGVzYy5LZXlJdiwgMTYpOworCQlOZGlzTW92ZU1lbW9yeSgmS2V5WzE2XSwgJnBBZC0+U3RhQ2ZnLlBUS1sxNl0sIDE2KTsKKwkJQVJDRk9VUl9JTklUKCZwQWQtPlByaXZhdGVJbmZvLldFUENPTlRFWFQsIEtleSwgMzIpOworCQkvL2Rpc2NhcmQgZmlyc3QgMjU2IGJ5dGVzCisJCWZvcihpID0gMDsgaSA8IDI1NjsgaSsrKQorCQkJQVJDRk9VUl9CWVRFKCZwQWQtPlByaXZhdGVJbmZvLldFUENPTlRFWFQpOworCQkvLyBEZWNyeXB0IEdUSy4gQmVjYXJlZnVsLCB0aGVyZSBpcyBubyBJQ1YgdG8gY2hlY2sgdGhlIHJlc3VsdCBpcyBjb3JyZWN0IG9yIG5vdAorCQlBUkNGT1VSX0RFQ1JZUFQoJnBBZC0+UHJpdmF0ZUluZm8uV0VQQ09OVEVYVCwgS0VZREFUQSwgcEdyb3VwLT5LZXlEZXNjLktleURhdGEsIHBHcm91cC0+S2V5RGVzYy5LZXlEYXRhTGVuWzFdKTsKKwl9CisKKwkvLyBQcm9jZXNzIGRlY3J5cHRlZCBrZXkgZGF0YSBtYXRlcmlhbAorCS8vIFBhcnNlIGtleURhdGEgdG8gaGFuZGxlIEtERSBmb3JtYXQgZm9yIFdQQTJQU0sKKwlpZiAocGVlcktleUluZm8uRUtEX0RMKQorCXsKKwkJaWYgKCFQYXJzZUtleURhdGEocEFkLCBLRVlEQVRBLCBwR3JvdXAtPktleURlc2MuS2V5RGF0YUxlblsxXSwgMCkpCisJCXsKKwkJCW9zX2ZyZWVfbWVtKHBBZCwgKFBVQ0hBUiltcG9vbCk7CisJCQlyZXR1cm47CisJCX0KKwl9CisJZWxzZQkvLyBXUEFQU0sKKwl7CisJCS8vIHNldCBrZXkgbWF0ZXJpYWwsIFR4TWljIGFuZCBSeE1pYyBmb3IgV1BBUFNLCisJCU5kaXNNb3ZlTWVtb3J5KEdUSywgS0VZREFUQSwgMzIpOworCQlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5HVEssIEdUSywgMzIpOworCQlwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQgPSBwZWVyS2V5SW5mby5LZXlJbmRleDsKKworCQkvLyBQcmVwYXJlIHBhaXItd2lzZSBrZXkgaW5mb3JtYXRpb24gaW50byBzaGFyZWQga2V5IHRhYmxlCisJCU5kaXNaZXJvTWVtb3J5KCZwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLCBzaXplb2YoQ0lQSEVSX0tFWSkpOworCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLktleUxlbiA9IExFTl9US0lQX0VLOworCQlOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLktleSwgR1RLLCBMRU5fVEtJUF9FSyk7CisJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uUnhNaWMsICZHVEtbMTZdLCBMRU5fVEtJUF9SWE1JQ0spOworCQlOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLlR4TWljLCAmR1RLWzI0XSwgTEVOX1RLSVBfVFhNSUNLKTsKKworCQkvLyBVcGRhdGUgU2hhcmVkIEtleSBDaXBoZXJBbGcKKwkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5DaXBoZXJBbGcgPSBDSVBIRVJfTk9ORTsKKwkJaWYgKHBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpCisJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLkNpcGhlckFsZyA9IENJUEhFUl9US0lQOworCQllbHNlIGlmIChwQWQtPlN0YUNmZy5Hcm91cENpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQorCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5DaXBoZXJBbGcgPSBDSVBIRVJfQUVTOworCisgICAgCS8vaGV4X2R1bXAoIkdyb3VwIEtleSA6IiwgcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5LZXksIExFTl9US0lQX0VLKTsKKwl9CisKKwkvLyBVcGRhdGUgZ3JvdXAga2V5IGluZm9ybWF0aW9uIHRvIEFTSUMgU2hhcmVkIEtleSBUYWJsZQorCUFzaWNBZGRTaGFyZWRLZXlFbnRyeShwQWQsCisJCQkJCQkgIEJTUzAsCisJCQkJCQkgIHBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCwKKwkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5DaXBoZXJBbGcsCisJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uS2V5LAorCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLlR4TWljLAorCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLlJ4TWljKTsKKworCS8vIFVwZGF0ZSBBU0lDIFdDSUQgYXR0cmlidXRlIHRhYmxlIGFuZCBJVkVJViB0YWJsZQorCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkocEFkLAorCQkJCQkJCSAgQlNTMCwKKwkJCQkJCQkgIHBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCwKKwkJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uQ2lwaGVyQWxnLAorCQkJCQkJCSAgTlVMTCk7CisKKwkvLyBzZXQgODAyLjF4IHBvcnQgY29udHJvbAorCVNUQV9QT1JUX1NFQ1VSRUQocEFkKTsKKworICAgIC8vIEluZGljYXRlIENvbm5lY3RlZCBmb3IgR1VJCisgICAgcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZUNvbm5lY3RlZDsKKworCS8vIGluaXQgaGVhZGVyIGFuZCBGaWxsIFBhY2tldAorCU1BS0VfODAyXzNfSEVBREVSKEhlYWRlcjgwMl8zLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgcEFkLT5DdXJyZW50QWRkcmVzcywgRUFQT0wpOworCisJLy8gWmVybyBHcm91cCBtZXNzYWdlIDEgYm9keQorCU5kaXNaZXJvTWVtb3J5KCZQYWNrZXQsIHNpemVvZihQYWNrZXQpKTsKKwlQYWNrZXQuUHJvVmVyCT0gRUFQT0xfVkVSOworCVBhY2tldC5Qcm9UeXBlCT0gRUFQT0xLZXk7CisJUGFja2V0LkJvZHlfTGVuWzFdICA9IHNpemVvZihLRVlfREVTQ1JJUFRFUikgLSBNQVhfTEVOX09GX1JTTklFOwkJLy8gTm8gZGF0YSBmaWVsZAorCisJLy8KKwkvLyBHcm91cCBNZXNzYWdlIDIgYXMgIEVBUE9MLUtleSgxLDAsMCwwLEcsMCwwLE1JQywwKQorCS8vCisJaWYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spCisJeworCQlQYWNrZXQuS2V5RGVzYy5UeXBlID0gV1BBMl9LRVlfREVTQzsKKwl9CisJZWxzZQorCXsKKwkJUGFja2V0LktleURlc2MuVHlwZSA9IFdQQTFfS0VZX0RFU0M7CisJfQorCisJLy8gS2V5IGRlc2NyaXB0b3IgdmVyc2lvbiBhbmQgYXBwcm9wcmlhdGUgUlNOIElFCisJUGFja2V0LktleURlc2MuS2V5SW5mby5LZXlEZXNjVmVyID0gcGVlcktleUluZm8uS2V5RGVzY1ZlcjsKKworCS8vIFVwZGF0ZSBLZXkgTGVuZ3RoCisJUGFja2V0LktleURlc2MuS2V5TGVuZ3RoWzBdID0gcEdyb3VwLT5LZXlEZXNjLktleUxlbmd0aFswXTsKKwlQYWNrZXQuS2V5RGVzYy5LZXlMZW5ndGhbMV0gPSBwR3JvdXAtPktleURlc2MuS2V5TGVuZ3RoWzFdOworCisJLy8gS2V5IEluZGV4IGFzIEctTXNnIDEKKwlpZihwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spCisJCVBhY2tldC5LZXlEZXNjLktleUluZm8uS2V5SW5kZXggPSBwZWVyS2V5SW5mby5LZXlJbmRleDsKKworCS8vIEtleSBUeXBlIEdyb3VwIGtleQorCVBhY2tldC5LZXlEZXNjLktleUluZm8uS2V5VHlwZSA9IEdST1VQS0VZOworCisJLy8gS2V5TWljIGZpZWxkIHByZXNlbnRlZAorCVBhY2tldC5LZXlEZXNjLktleUluZm8uS2V5TWljICA9IDE7CisKKwkvLyBTZWN1cmUgYml0CisJUGFja2V0LktleURlc2MuS2V5SW5mby5TZWN1cmUgID0gMTsKKworCS8vIENvbnZlcnQgdG8gbGl0dGxlLWVuZGlhbiBmb3JtYXQuCisJKigoVVNIT1JUICopJlBhY2tldC5LZXlEZXNjLktleUluZm8pID0gY3B1MmxlMTYoKigoVVNIT1JUICopJlBhY2tldC5LZXlEZXNjLktleUluZm8pKTsKKworCS8vIEtleSBSZXBsYXkgY291bnQKKwlOZGlzTW92ZU1lbW9yeShQYWNrZXQuS2V5RGVzYy5SZXBsYXlDb3VudGVyLCBwR3JvdXAtPktleURlc2MuUmVwbGF5Q291bnRlciwgTEVOX0tFWV9ERVNDX1JFUExBWSk7CisKKwkvLyBPdXQgYnVmZmVyIGZvciB0cmFuc21pdHRpbmcgZ3JvdXAgbWVzc2FnZSAyCisJTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgKFBVQ0hBUiAqKSZwT3V0QnVmZmVyKTsgIC8vIGFsbG9jYXRlIG1lbW9yeQorCWlmKHBPdXRCdWZmZXIgPT0gTlVMTCkKKwl7CisJCU1sbWVGcmVlTWVtb3J5KHBBZCwgKFBVQ0hBUiltcG9vbCk7CisJCXJldHVybjsKKwl9CisKKwkvLyBQcmVwYXJlIEVBUE9MIGZyYW1lIGZvciBNSUMgY2FsY3VsYXRpb24KKwkvLyBCZSBjYXJlZnVsLCBvbmx5IEVBUE9MIGZyYW1lIGlzIGNvdW50ZWQgZm9yIE1JQyBjYWxjdWxhdGlvbgorCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAgICAmRnJhbWVMZW4sCisJCVBhY2tldC5Cb2R5X0xlblsxXSArIDQsICAgICZQYWNrZXQsCisJCUVORF9PRl9BUkdTKTsKKworCS8vIFByZXBhcmUgYW5kIEZpbGwgTUlDIHZhbHVlCisJTmRpc1plcm9NZW1vcnkoTWljLCBzaXplb2YoTWljKSk7CisJaWYocEFkLT5TdGFDZmcuV2VwU3RhdHVzICA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQorCXsKKwkJLy8gQUVTCisJCUhNQUNfU0hBMShwT3V0QnVmZmVyLCBGcmFtZUxlbiwgcEFkLT5TdGFDZmcuUFRLLCBMRU5fRUFQX01JQ0ssIGRpZ2VzdCk7CisJCU5kaXNNb3ZlTWVtb3J5KE1pYywgZGlnZXN0LCBMRU5fS0VZX0RFU0NfTUlDKTsKKwl9CisJZWxzZQorCXsKKwkJaG1hY19tZDUocEFkLT5TdGFDZmcuUFRLLCBMRU5fRUFQX01JQ0ssIHBPdXRCdWZmZXIsIEZyYW1lTGVuLCBNaWMpOworCX0KKwlOZGlzTW92ZU1lbW9yeShQYWNrZXQuS2V5RGVzYy5LZXlNaWMsIE1pYywgTEVOX0tFWV9ERVNDX01JQyk7CisKKworCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgIAkJJkZyYW1lTGVuLAorCQkJCQkJTEVOR1RIXzgwMl8zLCAgICAgCQkmSGVhZGVyODAyXzMsCisJCQkJCQlQYWNrZXQuQm9keV9MZW5bMV0gKyA0LCAmUGFja2V0LAorCQkJCQkJRU5EX09GX0FSR1MpOworCisKKwkvLyA1LiBDb3B5IGZyYW1lIHRvIFR4IHJpbmcgYW5kIHByZXBhcmUgZm9yIGVuY3J5cHRpb24KKwlSVE1QVG9XaXJlbGVzc1N0YShwQWQsIEhlYWRlcjgwMl8zLCBMRU5HVEhfODAyXzMsIChQVUNIQVIpJlBhY2tldCwgUGFja2V0LkJvZHlfTGVuWzFdICsgNCwgRkFMU0UpOworCisJLy8gNiBGcmVlIGFsbG9jYXRlZCBtZW1vcnkKKwlNbG1lRnJlZU1lbW9yeShwQWQsIChQVUNIQVIpcE91dEJ1ZmZlcik7CisJb3NfZnJlZV9tZW0ocEFkLCAoUFVDSEFSKW1wb29sKTsKKworCS8vIHNlbmQgd2lyZWxlc3MgZXZlbnQgLSBmb3Igc2V0IGtleSBkb25lIFdQQTIKKwlpZiAocEFkLT5Db21tb25DZmcuYldpcmVsZXNzRXZlbnQpCisJCVJUTVBTZW5kV2lyZWxlc3NFdmVudChwQWQsIElXX1NFVF9LRVlfRE9ORV9XUEEyX0VWRU5UX0ZMQUcsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQWRkciwgQlNTMCwgMCk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJXcGFHcm91cE1zZzFBY3Rpb24gPC0tLS0tXG4iKSk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlJbml0IFdQQSBNQUMgaGVhZGVyCisKKwlBcmd1bWVudHM6CisJCXBBZAlQb2ludGVyCXRvIG91ciBhZGFwdGVyCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECVdwYU1hY0hlYWRlckluaXQoCisJSU4JCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOIE9VVAlQSEVBREVSXzgwMl8xMQlwSGRyODAyMTEsCisJSU4JCVVDSEFSCQkJd2VwLAorCUlOCQlQVUNIQVIJCSAgICBwQWRkcjEpCit7CisJTmRpc1plcm9NZW1vcnkocEhkcjgwMjExLCBzaXplb2YoSEVBREVSXzgwMl8xMSkpOworCXBIZHI4MDIxMS0+RkMuVHlwZQk9IEJUWVBFX0RBVEE7CisJcEhkcjgwMjExLT5GQy5Ub0RzCT0gMTsKKwlpZiAod2VwCT09IDEpCisJCXBIZHI4MDIxMS0+RkMuV2VwID0gMTsKKworCSAvLwlBZGRyMTogQlNTSUQsIEFkZHIyOiBTQSwgQWRkcjM6CURBCisJQ09QWV9NQUNfQUREUihwSGRyODAyMTEtPkFkZHIxLCBwQWRkcjEpOworCUNPUFlfTUFDX0FERFIocEhkcjgwMjExLT5BZGRyMiwgcEFkLT5DdXJyZW50QWRkcmVzcyk7CisJQ09QWV9NQUNfQUREUihwSGRyODAyMTEtPkFkZHIzLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisJcEhkcjgwMjExLT5TZXF1ZW5jZSA9CXBBZC0+U2VxdWVuY2U7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lCURlc2NyaXB0aW9uOgorCQlDb3B5IGZyYW1lIGZyb20gd2FpdGluZyBxdWV1ZSBpbnRvIHJlbGF0aXZlIHJpbmcgYnVmZmVyIGFuZCBzZXQKKwlhcHByb3ByaWF0ZSBBU0lDIHJlZ2lzdGVyIHRvIGtpY2sgaGFyZHdhcmUgZW5jcnlwdGlvbiBiZWZvcmUgcmVhbGx5CisJc2VudCBvdXQgdG8gYWlyLgorCisJQXJndW1lbnRzOgorCQlwQWQJCVBvaW50ZXIJdG8gb3VyIGFkYXB0ZXIKKwkJUE5ESVNfUEFDS0VUCVBvaW50ZXIgdG8gb3V0Z29pbmcgTmRpcyBmcmFtZQorCQlOdW1iZXJPZkZyYWcJTnVtYmVyIG9mIGZyYWdtZW50IHJlcXVpcmVkCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEICAgIFJUTVBUb1dpcmVsZXNzU3RhKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOICBQVUNIQVIgICAgICAgICAgcEhlYWRlcjgwMl8zLAorICAgIElOICBVSU5UICAgICAgICAgICAgSGRyTGVuLAorCUlOICBQVUNIQVIgICAgICAgICAgcERhdGEsCisgICAgSU4gIFVJTlQgICAgICAgICAgICBEYXRhTGVuLAorICAgIElOCUJPT0xFQU4JCQlpczR3YXlGcmFtZSkKKworeworCU5ESVNfU1RBVFVTICAgICBTdGF0dXM7CisJUE5ESVNfUEFDS0VUICAgIHBQYWNrZXQ7CisJVUNIQVIgICBJbmRleDsKKworCWRvCisJeworCQkvLyAxLiBidWlsZCBhIE5ESVMgcGFja2V0IGFuZCBjYWxsIFJUTVBTZW5kUGFja2V0KCk7CisJCS8vICAgIGJlIGNhcmVmdWwgYWJvdXQgaG93L3doZW4gdG8gcmVsZWFzZSB0aGlzIGludGVybmFsIGFsbG9jYXRlZCBORElTIFBBQ0tFVCBidWZmZXIKKwkJU3RhdHVzID0gUlRNUEFsbG9jYXRlTmRpc1BhY2tldChwQWQsICZwUGFja2V0LCBwSGVhZGVyODAyXzMsIEhkckxlbiwgcERhdGEsIERhdGFMZW4pOworCQlpZiAoU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJCQlicmVhazsKKworCQlpZiAoaXM0d2F5RnJhbWUpCisJCQlSVE1QX1NFVF9QQUNLRVRfQ0xFQVJfRUFQX0ZSQU1FKHBQYWNrZXQsIDEpOworCQllbHNlCisJCQlSVE1QX1NFVF9QQUNLRVRfQ0xFQVJfRUFQX0ZSQU1FKHBQYWNrZXQsIDApOworCisJCS8vIDIuIHNlbmQgb3V0IHRoZSBwYWNrZXQKKwkJU3RhdHVzID0gU1RBU2VuZFBhY2tldChwQWQsIHBQYWNrZXQpOworCQlpZihTdGF0dXMgPT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJeworCQkJLy8gRGVxdWV1ZSBvbmUgZnJhbWUgZnJvbSBUeFN3UXVldWUwLi4zIHF1ZXVlIGFuZCBwcm9jZXNzIGl0CisJCQkvLyBUaGVyZSBhcmUgdGhyZWUgcGxhY2UgY2FsbGluZyBkZXF1ZXVlIGZvciBUWCByaW5nLgorCQkJLy8gMS4gSGVyZSwgcmlnaHQgYWZ0ZXIgcXVldWVpbmcgdGhlIGZyYW1lLgorCQkJLy8gMi4gQXQgdGhlIGVuZCBvZiBUeFJpbmdUeERvbmUgc2VydmljZSByb3V0aW5lLgorCQkJLy8gMy4gVXBvbiBORElTIGNhbGwgUlRNUFNlbmRQYWNrZXRzCisJCQlpZigoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUykpICYmCisJCQkJKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkVTRVRfSU5fUFJPR1JFU1MpKSkKKwkJCXsKKwkJCQlmb3IoSW5kZXggPSAwOyBJbmRleCA8IDU7IEluZGV4ICsrKQorCQkJCQlpZihwQWQtPlR4U3dRdWV1ZVtJbmRleF0uTnVtYmVyID4gMCkKKwkJCQkJCVJUTVBEZVF1ZXVlUGFja2V0KHBBZCwgRkFMU0UsIEluZGV4LCBNQVhfVFhfUFJPQ0VTUyk7CisJCQl9CisJCX0KKwl9IHdoaWxlKEZBTFNFKTsKKworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICBDaGVjayBTYW5pdHkgUlNOIElFIGZvcm0gQVAKKworICAgIEFyZ3VtZW50czoKKworICAgIFJldHVybiBWYWx1ZToKKworCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworQk9PTEVBTiBDaGVja1JTTklFKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBQVUNIQVIgICAgICAgICAgcERhdGEsCisJSU4gIFVDSEFSICAgICAgICAgICBEYXRhTGVuLAorCU9VVAlVQ0hBUgkJCSpPZmZzZXQpCit7CisJUFVDSEFSICAgICAgICAgICAgICBwVklFOworCVVDSEFSICAgICAgICAgICAgICAgbGVuOworCVBFSURfU1RSVUNUICAgICAgICAgcEVpZDsKKwlCT09MRUFOCQkJCXJlc3VsdCA9IEZBTFNFOworCisJcFZJRSA9IHBEYXRhOworCWxlbgkgPSBEYXRhTGVuOworCSpPZmZzZXQgPSAwOworCisJd2hpbGUgKGxlbiA+IHNpemVvZihSU05JRTIpKQorCXsKKwkJcEVpZCA9IChQRUlEX1NUUlVDVCkgcFZJRTsKKwkJLy8gV1BBIFJTTiBJRQorCQlpZiAoKHBFaWQtPkVpZCA9PSBJRV9XUEEpICYmIChOZGlzRXF1YWxNZW1vcnkocEVpZC0+T2N0ZXQsIFdQQV9PVUksIDQpKSkKKwkJeworCQkJaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEgfHwgcEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKSAmJgorCQkJCShOZGlzRXF1YWxNZW1vcnkocFZJRSwgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5SU05fSUUsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUlNOSUVfTGVuKSkgJiYKKwkJCQkocEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5SU05JRV9MZW4gPT0gKHBFaWQtPkxlbiArIDIpKSkKKwkJCXsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ2hlY2tSU05JRSA9PT4gV1BBL1dQQVBTSyBSU04gSUUgbWF0Y2hlZCBpbiBNc2cgMywgTGVuZ3RoKCVkKSBcbiIsIChwRWlkLT5MZW4gKyAyKSkpOworCQkJCQlyZXN1bHQgPSBUUlVFOworCQkJfQorCisJCQkqT2Zmc2V0ICs9IChwRWlkLT5MZW4gKyAyKTsKKwkJfQorCQkvLyBXUEEyIFJTTiBJRQorCQllbHNlIGlmICgocEVpZC0+RWlkID09IElFX1JTTikgJiYgKE5kaXNFcXVhbE1lbW9yeShwRWlkLT5PY3RldCArIDIsIFJTTl9PVUksIDMpKSkKKwkJeworCQkJaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyIHx8IHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spICYmCisJCQkJKE5kaXNFcXVhbE1lbW9yeShwVklFLCBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlJTTl9JRSwgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5SU05JRV9MZW4pKSAmJgorCQkJCShwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlJTTklFX0xlbiA9PSAocEVpZC0+TGVuICsgMikpKQorCQkJeworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDaGVja1JTTklFID09PiBXUEEyL1dQQTJQU0sgUlNOIElFIG1hdGNoZWQgaW4gTXNnIDMsIExlbmd0aCglZCkgXG4iLCAocEVpZC0+TGVuICsgMikpKTsKKwkJCQkJcmVzdWx0ID0gVFJVRTsKKwkJCX0KKworCQkJKk9mZnNldCArPSAocEVpZC0+TGVuICsgMik7CisJCX0KKwkJZWxzZQorCQl7CisJCQlicmVhazsKKwkJfQorCisJCXBWSUUgKz0gKHBFaWQtPkxlbiArIDIpOworCQlsZW4gIC09IChwRWlkLT5MZW4gKyAyKTsKKwl9CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDaGVja1JTTklFID09PiBza2lwX29mZnNldCglZCkgXG4iLCAqT2Zmc2V0KSk7CisKKwlyZXR1cm4gcmVzdWx0OworCit9CisKKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIFJvdXRpbmUgRGVzY3JpcHRpb246CisgICAgUGFyc2UgS0VZREFUQSBmaWVsZC4gIEtFWURBVEFbXSBNYXkgY29udGFpbiAyIFJTTiBJRSBhbmQgb3B0aW9uYWxseSBHVEsuCisgICAgR1RLICBpcyBlbmNhcHR1bGF0ZWQgaW4gS0RFIGZvcm1hdCBhdCAgcC44MyA4MDIuMTFpIEQxMAorCisgICAgQXJndW1lbnRzOgorCisgICAgUmV0dXJuIFZhbHVlOgorCisgICAgTm90ZToKKyAgICAgICAgODAyLjExaSBEMTAKKworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0JPT0xFQU4gUGFyc2VLZXlEYXRhKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBQVUNIQVIgICAgICAgICAgcEtleURhdGEsCisJSU4gIFVDSEFSICAgICAgICAgICBLZXlEYXRhTGVuLAorCUlOCVVDSEFSCQkJYlBhaXJld2lzZSkKK3sKKyAgICBQS0RFX0VOQ0FQICAgICAgICAgIHBLREUgPSBOVUxMOworICAgIFBVQ0hBUiAgICAgICAgICAgICAgcE15S2V5RGF0YSA9IHBLZXlEYXRhOworICAgIFVDSEFSICAgICAgICAgICAgICAgS2V5RGF0YUxlbmd0aCA9IEtleURhdGFMZW47CisgICAgVUNIQVIgICAgICAgICAgICAgICBHVEtMRU47CisJVUNIQVIJCQkJc2tpcF9vZmZzZXQ7CisKKwkvLyBWZXJpZnkgVGhlIFJTTiBJRSBjb250YWluZWQgaW4gUGFpcmV3aXNlLU1zZyAzIGFuZCBza2lwIGl0CisJaWYgKGJQYWlyZXdpc2UpCisgICAgeworCQkvLyBDaGVjayBSU04gSUUgd2hldGhlciBpdCBpcyBXUEEyL1dQQTJQU0sKKwkJaWYgKCFDaGVja1JTTklFKHBBZCwgcEtleURhdGEsIEtleURhdGFMZW4sICZza2lwX29mZnNldCkpCisJCXsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlBhcnNlS2V5RGF0YSA9PT4gV1BBMi9XUEEyUFNLIFJTTiBJRSBtaXNtYXRjaGVkIFxuIikpOworCQkJaGV4X2R1bXAoIkdldCBLRVlEQVRBIDoiLCBwS2V5RGF0YSwgS2V5RGF0YUxlbik7CisJCQlyZXR1cm4gRkFMU0U7CisgICAgCX0KKyAgICAJZWxzZQorCQl7CisJCQkvLyBza2lwIFJTTiBJRQorCQkJcE15S2V5RGF0YSArPSBza2lwX29mZnNldDsKKwkJCUtleURhdGFMZW5ndGggLT0gc2tpcF9vZmZzZXQ7CisKKwkJCS8vREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGFyc2VLZXlEYXRhID09PiBXUEEyL1dQQTJQU0sgUlNOIElFIG1hdGNoZWQgaW4gTXNnIDMsIExlbmd0aCglZCkgXG4iLCBza2lwX29mZnNldCkpOworCQl9CisJfQorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJQYXJzZUtleURhdGEgPT0+IEtleURhdGFMZW5ndGggJWQgd2l0aG91dCBSU05fSUUgXG4iLCBLZXlEYXRhTGVuZ3RoKSk7CisKKwkvLyBQYXJzZSBFS0QgZm9ybWF0CisJaWYgKEtleURhdGFMZW5ndGggPj0gOCkKKyAgICB7CisgICAgICAgIHBLREUgPSAoUEtERV9FTkNBUCkgcE15S2V5RGF0YTsKKyAgICB9CisJZWxzZQorICAgIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiRVJST1I6IEtleURhdGFMZW5ndGggaXMgdG9vIHNob3J0IFxuIikpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisKKwkvLyBTYW5pdHkgY2hlY2sgLSBzaGFyZWQga2V5IGluZGV4IHNob3VsZCBub3QgYmUgMAorCWlmIChwS0RFLT5HVEtFbmNhcC5LaWQgPT0gMCkKKyAgICB7CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkVSUk9SOiBHVEsgS2V5IGluZGV4IHplcm8gXG4iKSk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKwkvLyBTYW5pdHkgY2hlY2sgLSBLRUQgbGVuZ3RoCisJaWYgKEtleURhdGFMZW5ndGggPCAocEtERS0+TGVuICsgMikpCisgICAgeworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJFUlJPUjogVGhlIGxlbiBmcm9tIEtERSBpcyB0b28gc2hvcnQgXG4iKSk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKwkvLyBHZXQgR1RLIGxlbmd0aCAtIHJlZmVyIHRvIElFRUUgODAyLjExaS0yMDA0IHAuODIKKwlHVEtMRU4gPSBwS0RFLT5MZW4gLTY7CisKKwlpZiAoR1RLTEVOIDwgTEVOX0FFU19LRVkpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJFUlJPUjogR1RLIEtleSBsZW5ndGggaXMgdG9vIHNob3J0ICglZCkgXG4iLCBHVEtMRU4pKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCX0KKwllbHNlCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkdUSyBLZXkgd2l0aCBLREUgZm9ybWV0IGdvdCBpbmRleD0lZCwgbGVuPSVkIFxuIiwgcEtERS0+R1RLRW5jYXAuS2lkLCBHVEtMRU4pKTsKKworCS8vIFVwZGF0ZSBHVEsKKwkvLyBzZXQga2V5IG1hdGVyaWFsLCBUeE1pYyBhbmQgUnhNaWMgZm9yIFdQQVBTSworCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLkdUSywgcEtERS0+R1RLRW5jYXAuR1RLLCAzMik7CisJcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkID0gcEtERS0+R1RLRW5jYXAuS2lkOworCisJLy8gVXBkYXRlIHNoYXJlZCBrZXkgdGFibGUKKwlOZGlzWmVyb01lbW9yeSgmcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXSwgc2l6ZW9mKENJUEhFUl9LRVkpKTsKKwlwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLktleUxlbiA9IExFTl9US0lQX0VLOworCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uS2V5LCBwS0RFLT5HVEtFbmNhcC5HVEssIExFTl9US0lQX0VLKTsKKwlOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLlJ4TWljLCAmcEtERS0+R1RLRW5jYXAuR1RLWzE2XSwgTEVOX1RLSVBfUlhNSUNLKTsKKwlOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLlR4TWljLCAmcEtERS0+R1RLRW5jYXAuR1RLWzI0XSwgTEVOX1RLSVBfVFhNSUNLKTsKKworCS8vIFVwZGF0ZSBTaGFyZWQgS2V5IENpcGhlckFsZworCXBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uQ2lwaGVyQWxnID0gQ0lQSEVSX05PTkU7CisJaWYgKHBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpCisJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uQ2lwaGVyQWxnID0gQ0lQSEVSX1RLSVA7CisJZWxzZSBpZiAocEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKKwkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5DaXBoZXJBbGcgPSBDSVBIRVJfQUVTOworCisJcmV0dXJuIFRSVUU7CisKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCUNpc2NvIENDS00gUFJGIGZ1bmN0aW9uCisKKwlBcmd1bWVudHM6CisJCWtleQkJCQlDaXNjbyBCYXNlIFRyYW5zaWVudCBLZXkgKEJUSykKKwkJa2V5X2xlbgkJCVRoZSBrZXkgbGVuZ3RoIG9mIHRoZSBCVEsKKwkJZGF0YQkJCVJ1cXVlc3QgTnVtYmVyKFJOKSArIEJTU0lECisJCWRhdGFfbGVuCQlUaGUgbGVuZ3RoIG9mIHRoZSBkYXRhCisJCW91dHB1dAkJCVN0b3JlIGZvciBQVEsoUGFpcndpc2UgdHJhbnNpZW50IGtleXMpCisJCWxlbgkJCQlUaGUgbGVuZ3RoIG9mIHRoZSBvdXRwdXQKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCU5vdGU6CisJCTgwMi4xaQlBbm5leCBGLjkKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgQ0NLTVBSRigKKwlJTglVQ0hBUgkqa2V5LAorCUlOCUlOVAkJa2V5X2xlbiwKKwlJTglVQ0hBUgkqZGF0YSwKKwlJTglJTlQJCWRhdGFfbGVuLAorCU9VVAlVQ0hBUgkqb3V0cHV0LAorCUlOCUlOVAkJbGVuKQoreworCUlOVAkJaTsKKwlVQ0hBUglpbnB1dFsxMDI0XTsKKwlJTlQJCWN1cnJlbnRpbmRleCA9IDA7CisJSU5UCQl0b3RhbF9sZW47CisKKwlOZGlzTW92ZU1lbW9yeShpbnB1dCwgZGF0YSwgZGF0YV9sZW4pOworCXRvdGFsX2xlbiA9IGRhdGFfbGVuOworCWlucHV0W3RvdGFsX2xlbl0gPSAwOworCXRvdGFsX2xlbisrOworCWZvcgkoaSA9IDA7CWkgPAkobGVuICsgMTkpIC8gMjA7IGkrKykKKwl7CisJCUhNQUNfU0hBMShpbnB1dCwgdG90YWxfbGVuLAlrZXksIGtleV9sZW4sICZvdXRwdXRbY3VycmVudGluZGV4XSk7CisJCWN1cnJlbnRpbmRleCArPQkyMDsKKwkJaW5wdXRbdG90YWxfbGVuIC0gMV0rKzsKKwl9Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlQcm9jZXNzIE1JQyBlcnJvciBpbmRpY2F0aW9uIGFuZCByZWNvcmQgTUlDIGVycm9yIHRpbWVyLgorCisJQXJndW1lbnRzOgorCQlwQWQgCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKwkJcFdwYUtleSAJCVBvaW50ZXIgdG8gdGhlIFdQQSBrZXkgc3RydWN0dXJlCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJUlRNUFJlcG9ydE1pY0Vycm9yKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBDSVBIRVJfS0VZIAlwV3BhS2V5KQoreworCVVMT05HCU5vdzsKKyAgICBVQ0hBUiAgIHVuaWNhc3RLZXkgPSAocFdwYUtleS0+VHlwZSA9PSBQQUlSV0lTRV9LRVkgPyAxOjApOworCisJLy8gUmVjb3JkIExhc3QgTUlDIGVycm9yIHRpbWUgYW5kIGNvdW50CisJTm93ID0gamlmZmllczsKKwlpZiAocEFkLT5TdGFDZmcuTWljRXJyQ250ID09IDApCisJeworCQlwQWQtPlN0YUNmZy5NaWNFcnJDbnQrKzsKKwkJcEFkLT5TdGFDZmcuTGFzdE1pY0Vycm9yVGltZSA9IE5vdzsKKyAgICAgICAgTmRpc1plcm9NZW1vcnkocEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlciwgOCk7CisJfQorCWVsc2UgaWYgKHBBZC0+U3RhQ2ZnLk1pY0VyckNudCA9PSAxKQorCXsKKwkJaWYgKChwQWQtPlN0YUNmZy5MYXN0TWljRXJyb3JUaW1lICsgKDYwICogT1NfSFopKSA8IE5vdykKKwkJeworCQkJLy8gVXBkYXRlIExhc3QgTUlDIGVycm9yIHRpbWUsIHRoaXMgZGlkIG5vdCB2aW9sYXRlIHR3byBNSUMgZXJyb3JzIHdpdGhpbiA2MCBzZWNvbmRzCisJCQlwQWQtPlN0YUNmZy5MYXN0TWljRXJyb3JUaW1lID0gTm93OworCQl9CisJCWVsc2UKKwkJeworCisJCQlpZiAocEFkLT5Db21tb25DZmcuYldpcmVsZXNzRXZlbnQpCisJCQkJUlRNUFNlbmRXaXJlbGVzc0V2ZW50KHBBZCwgSVdfQ09VTlRFUl9NRUFTVVJFU19FVkVOVF9GTEFHLCBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkFkZHIsIEJTUzAsIDApOworCisJCQlwQWQtPlN0YUNmZy5MYXN0TWljRXJyb3JUaW1lID0gTm93OworCQkJLy8gVmlvbGF0ZSBNSUMgZXJyb3IgY291bnRzLCBNSUMgY291bnRlcm1lYXN1cmVzIGtpY2tzIGluCisJCQlwQWQtPlN0YUNmZy5NaWNFcnJDbnQrKzsKKwkJfQorCX0KKwllbHNlCisJeworCQkvLyBNSUMgZXJyb3IgY291bnQgPj0gMgorCQkvLyBUaGlzIHNob3VsZCBub3QgaGFwcGVuCisJCTsKKwl9CisgICAgTWxtZUVucXVldWUocEFkLAorCQkJCU1MTUVfQ05UTF9TVEFURV9NQUNISU5FLAorCQkJCU9JRF84MDJfMTFfTUlDX0ZBSUxVUkVfUkVQT1JUX0ZSQU1FLAorCQkJCTEsCisJCQkJJnVuaWNhc3RLZXkpOworCisgICAgaWYgKHBBZC0+U3RhQ2ZnLk1pY0VyckNudCA9PSAyKQorICAgIHsKKyAgICAgICAgUlRNUFNldFRpbWVyKCZwQWQtPlN0YUNmZy5XcGFEaXNhc3NvY0FuZEJsb2NrQXNzb2NUaW1lciwgMTAwKTsKKyAgICB9Cit9CisKKworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyNkZWZpbmUJTEVOR1RIX0VBUF9IICAgIDQKKy8vIElmIHRoZSByZWNlaXZlZCBmcmFtZSBpcyBFQVAtUGFja2V0ICxmaW5kIG91dCBpdHMgRUFQLUNvZGUgKFJlcXVlc3QoMHgwMSksIFJlc3BvbnNlKDB4MDIpLCBTdWNjZXNzKDB4MDMpLCBGYWlsdXJlKDB4MDQpKS4KK0lOVAkgICAgV3BhQ2hlY2tFYXBDb2RlKAorCUlOICBQUlRNUF9BREFQVEVSICAgCQlwQWQsCisJSU4gIFBVQ0hBUgkJCQlwRnJhbWUsCisJSU4gIFVTSE9SVAkJCQlGcmFtZUxlbiwKKwlJTiAgVVNIT1JUCQkJCU9mZlNldCkKK3sKKworCVBVQ0hBUglwRGF0YTsKKwlJTlQJcmVzdWx0ID0gMDsKKworCWlmKCBGcmFtZUxlbiA8IE9mZlNldCArIExFTkdUSF9FQVBPTF9IICsgTEVOR1RIX0VBUF9IICkKKwkJcmV0dXJuIHJlc3VsdDsKKworCXBEYXRhID0gcEZyYW1lICsgT2ZmU2V0OyAvLyBza2lwIG9mZnNldCBieXRlcworCisJaWYoKihwRGF0YSsxKSA9PSBFQVBQYWNrZXQpIAkvLyA4MDIuMXggaGVhZGVyIC0gUGFja2V0IFR5cGUKKwl7CisJCSByZXN1bHQgPSAqKHBEYXRhKzQpOwkJLy8gRUFQIGhlYWRlciAtIENvZGUKKwl9CisKKwlyZXR1cm4gcmVzdWx0OworfQorCitWT0lEICAgIFdwYVNlbmRNaWNGYWlsdXJlVG9XcGFTdXBwbGljYW50KAorICAgIElOICBQUlRNUF9BREFQVEVSICAgIHBBZCwKKyAgICBJTiAgQk9PTEVBTiAgICAgICAgICBiVW5pY2FzdCkKK3sKKyAgICB1bmlvbiBpd3JlcV9kYXRhICAgIHdycXU7CisgICAgY2hhciBjdXN0b21bSVdfQ1VTVE9NX01BWF0gPSB7MH07CisKKyAgICBzcHJpbnRmKGN1c3RvbSwgIk1MTUUtTUlDSEFFTE1JQ0ZBSUxVUkUuaW5kaWNhdGlvbiIpOworICAgIGlmIChiVW5pY2FzdCkKKyAgICAgICAgc3ByaW50ZihjdXN0b20sICIlcyB1bmljYXN0IiwgY3VzdG9tKTsKKyAgICB3cnF1LmRhdGEubGVuZ3RoID0gc3RybGVuKGN1c3RvbSk7CisgICAgd2lyZWxlc3Nfc2VuZF9ldmVudChwQWQtPm5ldF9kZXYsIElXRVZDVVNUT00sICZ3cnF1LCBjdXN0b20pOworCisgICAgcmV0dXJuOworfQorI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKworVk9JRAlXcGFNaWNGYWlsdXJlUmVwb3J0RnJhbWUoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCVBVQ0hBUiAgICAgICAgICAgICAgcE91dEJ1ZmZlciA9IE5VTEw7CisJVUNIQVIgICAgICAgICAgICAgICBIZWFkZXI4MDJfM1sxNF07CisJVUxPTkcgICAgICAgICAgICAgICBGcmFtZUxlbiA9IDA7CisJRUFQT0xfUEFDS0VUICAgICAgICBQYWNrZXQ7CisJVUNIQVIgICAgICAgICAgICAgICBNaWNbMTZdOworICAgIEJPT0xFQU4gICAgICAgICAgICAgYlVuaWNhc3Q7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJXcGFNaWNGYWlsdXJlUmVwb3J0RnJhbWUgLS0tLS0+XG4iKSk7CisKKyAgICBiVW5pY2FzdCA9IChFbGVtLT5Nc2dbMF0gPT0gMSA/IFRSVUU6RkFMU0UpOworCXBBZC0+U2VxdWVuY2UgPSAoKHBBZC0+U2VxdWVuY2UpICsgMSkgJiAoTUFYX1NFUV9OVU1CRVIpOworCisJLy8gaW5pdCA4MDIuMyBoZWFkZXIgYW5kIEZpbGwgUGFja2V0CisJTUFLRV84MDJfM19IRUFERVIoSGVhZGVyODAyXzMsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBFQVBPTCk7CisKKwlOZGlzWmVyb01lbW9yeSgmUGFja2V0LCBzaXplb2YoUGFja2V0KSk7CisJUGFja2V0LlByb1Zlcgk9IEVBUE9MX1ZFUjsKKwlQYWNrZXQuUHJvVHlwZQk9IEVBUE9MS2V5OworCisJUGFja2V0LktleURlc2MuVHlwZSA9IFdQQTFfS0VZX0RFU0M7CisKKyAgICAvLyBSZXF1ZXN0IGZpZWxkIHByZXNlbnRlZAorICAgIFBhY2tldC5LZXlEZXNjLktleUluZm8uUmVxdWVzdCA9IDE7CisKKwlpZihwQWQtPlN0YUNmZy5XZXBTdGF0dXMgID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCisJeworCQlQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLktleURlc2NWZXIgPSAyOworCX0KKwllbHNlCSAgLy8gVEtJUAorCXsKKwkJUGFja2V0LktleURlc2MuS2V5SW5mby5LZXlEZXNjVmVyID0gMTsKKwl9CisKKyAgICBQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLktleVR5cGUgPSAoYlVuaWNhc3QgPyBQQUlSV0lTRUtFWSA6IEdST1VQS0VZKTsKKworCS8vIEtleU1pYyBmaWVsZCBwcmVzZW50ZWQKKwlQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLktleU1pYyAgPSAxOworCisgICAgLy8gRXJyb3IgZmllbGQgcHJlc2VudGVkCisJUGFja2V0LktleURlc2MuS2V5SW5mby5FcnJvciAgPSAxOworCisJLy8gVXBkYXRlIHBhY2tldCBsZW5ndGggYWZ0ZXIgZGVjaWRlIEtleSBkYXRhIHBheWxvYWQKKwlQYWNrZXQuQm9keV9MZW5bMV0gID0gc2l6ZW9mKEtFWV9ERVNDUklQVEVSKSAtIE1BWF9MRU5fT0ZfUlNOSUU7CisKKwkvLyBLZXkgUmVwbGF5IENvdW50CisJTmRpc01vdmVNZW1vcnkoUGFja2V0LktleURlc2MuUmVwbGF5Q291bnRlciwgcEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlciwgTEVOX0tFWV9ERVNDX1JFUExBWSk7CisgICAgaW5jX2J5dGVfYXJyYXkocEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlciwgOCk7CisKKwkvLyBDb252ZXJ0IHRvIGxpdHRsZS1lbmRpYW4gZm9ybWF0LgorCSooKFVTSE9SVCAqKSZQYWNrZXQuS2V5RGVzYy5LZXlJbmZvKSA9IGNwdTJsZTE2KCooKFVTSE9SVCAqKSZQYWNrZXQuS2V5RGVzYy5LZXlJbmZvKSk7CisKKworCU1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsIChQVUNIQVIgKikmcE91dEJ1ZmZlcik7ICAvLyBhbGxvY2F0ZSBtZW1vcnkKKwlpZihwT3V0QnVmZmVyID09IE5VTEwpCisJeworCQlyZXR1cm47CisJfQorCisJLy8gUHJlcGFyZSBFQVBPTCBmcmFtZSBmb3IgTUlDIGNhbGN1bGF0aW9uCisJLy8gQmUgY2FyZWZ1bCwgb25seSBFQVBPTCBmcmFtZSBpcyBjb3VudGVkIGZvciBNSUMgY2FsY3VsYXRpb24KKwlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAgICAgICAgICAgICAgICZGcmFtZUxlbiwKKwkJICAgICAgICAgICAgICBQYWNrZXQuQm9keV9MZW5bMV0gKyA0LCAgICZQYWNrZXQsCisJCSAgICAgICAgICAgICAgRU5EX09GX0FSR1MpOworCisJLy8gUHJlcGFyZSBhbmQgRmlsbCBNSUMgdmFsdWUKKwlOZGlzWmVyb01lbW9yeShNaWMsIHNpemVvZihNaWMpKTsKKwlpZihwQWQtPlN0YUNmZy5XZXBTdGF0dXMgID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCisJewkvLyBBRVMKKyAgICAgICAgVUNIQVIgZGlnZXN0WzIwXSA9IHswfTsKKwkJSE1BQ19TSEExKHBPdXRCdWZmZXIsIEZyYW1lTGVuLCBwQWQtPlN0YUNmZy5QVEssIExFTl9FQVBfTUlDSywgZGlnZXN0KTsKKwkJTmRpc01vdmVNZW1vcnkoTWljLCBkaWdlc3QsIExFTl9LRVlfREVTQ19NSUMpOworCX0KKwllbHNlCisJewkvLyBUS0lQCisJCWhtYWNfbWQ1KHBBZC0+U3RhQ2ZnLlBUSywgIExFTl9FQVBfTUlDSywgcE91dEJ1ZmZlciwgRnJhbWVMZW4sIE1pYyk7CisJfQorCU5kaXNNb3ZlTWVtb3J5KFBhY2tldC5LZXlEZXNjLktleU1pYywgTWljLCBMRU5fS0VZX0RFU0NfTUlDKTsKKworICAgIE1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAgICAJJkZyYW1lTGVuLAorICAgIAkgIAkJCUxFTkdUSF84MDJfMywgICAgIAkJCSZIZWFkZXI4MDJfMywKKyAgICAJCQkJUGFja2V0LkJvZHlfTGVuWzFdICsgNCwgICAgICZQYWNrZXQsCisgICAgCQkJCUVORF9PRl9BUkdTKTsKKworCS8vIG9weSBmcmFtZSB0byBUeCByaW5nIGFuZCBzZW5kIE1JQyBmYWlsdXJlIHJlcG9ydCBmcmFtZSB0byBhdXRoZW50aWNhdG9yCisJUlRNUFRvV2lyZWxlc3NTdGEocEFkLCBIZWFkZXI4MDJfMywgTEVOR1RIXzgwMl8zLCAoUFVDSEFSKSZQYWNrZXQsIFBhY2tldC5Cb2R5X0xlblsxXSArIDQsIEZBTFNFKTsKKworCU1sbWVGcmVlTWVtb3J5KHBBZCwgKFBVQ0hBUilwT3V0QnVmZmVyKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIldwYU1pY0ZhaWx1cmVSZXBvcnRGcmFtZSA8LS0tLS1cbiIpKTsKK30KKworLyoqIGZyb20gd3BhX3N1cHBsaWNhbnQKKyAqIGluY19ieXRlX2FycmF5IC0gSW5jcmVtZW50IGFyYml0cmFyeSBsZW5ndGggYnl0ZSBhcnJheSBieSBvbmUKKyAqIEBjb3VudGVyOiBQb2ludGVyIHRvIGJ5dGUgYXJyYXkKKyAqIEBsZW46IExlbmd0aCBvZiB0aGUgY291bnRlciBpbiBieXRlcworICoKKyAqIFRoaXMgZnVuY3Rpb24gaW5jcmVtZW50cyB0aGUgbGFzdCBieXRlIG9mIHRoZSBjb3VudGVyIGJ5IG9uZSBhbmQgY29udGludWVzCisgKiByb2xsaW5nIG92ZXIgdG8gbW9yZSBzaWduaWZpY2FudCBieXRlcyBpZiB0aGUgYnl0ZSB3YXMgaW5jcmVtZW50ZWQgZnJvbQorICogMHhmZiB0byAweDAwLgorICovCit2b2lkIGluY19ieXRlX2FycmF5KFVDSEFSICpjb3VudGVyLCBpbnQgbGVuKQoreworCWludCBwb3MgPSBsZW4gLSAxOworCXdoaWxlIChwb3MgPj0gMCkgeworCQljb3VudGVyW3Bvc10rKzsKKwkJaWYgKGNvdW50ZXJbcG9zXSAhPSAwKQorCQkJYnJlYWs7CisJCXBvcy0tOworCX0KK30KKworVk9JRCBXcGFEaXNhc3NvY0FwQW5kQmxvY2tBc3NvYygKKyAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCisgICAgSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAorICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKKyAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpCit7CisgICAgUlRNUF9BREFQVEVSICAgICAgICAgICAgICAgICpwQWQgPSAoUFJUTVBfQURBUFRFUilGdW5jdGlvbkNvbnRleHQ7CisgICAgTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNUICAgIERpc2Fzc29jUmVxOworCisJLy8gZGlzYXNzb2MgZnJvbSBjdXJyZW50IEFQIGZpcnN0CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlRNUFJlcG9ydE1pY0Vycm9yIC0gZGlzYXNzb2NpYXRlIHdpdGggY3VycmVudCBBUCBhZnRlciBzZW5kaW5nIHNlY29uZCBjb250aW51b3VzIEVBUE9MIGZyYW1lXG4iKSk7CisJRGlzYXNzb2NQYXJtRmlsbChwQWQsICZEaXNhc3NvY1JlcSwgcEFkLT5Db21tb25DZmcuQnNzaWQsIFJFQVNPTl9NSUNfRkFJTFVSRSk7CisJTWxtZUVucXVldWUocEFkLCBBU1NPQ19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9ESVNBU1NPQ19SRVEsIHNpemVvZihNTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1QpLCAmRGlzYXNzb2NSZXEpOworCisJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9ESVNBU1NPQzsKKwlwQWQtPlN0YUNmZy5iQmxvY2tBc3NvYyA9IFRSVUU7Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3RhX2lvY3RsLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3N0YV9pb2N0bC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlYTJiMmMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3N0YV9pb2N0bC5jCkBAIC0wLDAgKzEsNjk0NCBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICBNb2R1bGUgTmFtZToKKyAgICBzdGFfaW9jdGwuYworCisgICAgQWJzdHJhY3Q6CisgICAgSU9DVEwgcmVsYXRlZCBzdWJyb3V0aW5lcworCisgICAgUmV2aXNpb24gSGlzdG9yeToKKyAgICBXaG8gICAgICAgICBXaGVuICAgICAgICAgIFdoYXQKKyAgICAtLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBSb3J5IENoZW4gICAwMS0wMy0yMDAzICAgIGNyZWF0ZWQKKwlSb3J5IENoZW4gICAwMi0xNC0yMDA1ICAgIG1vZGlmeSB0byBzdXBwb3J0IFJUNjEKKyovCisKKyNpbmNsdWRlCSJydF9jb25maWcuaCIKKworI2lmZGVmIERCRworZXh0ZXJuIFVMT05HICAgIFJURGVidWdMZXZlbDsKKyNlbmRpZgorCisjZGVmaW5lIE5SX1dFUF9LRVlTIAkJCQk0CisjZGVmaW5lIFdFUF9TTUFMTF9LRVlfTEVOIAkJCSg0MC84KQorI2RlZmluZSBXRVBfTEFSR0VfS0VZX0xFTiAJCQkoMTA0LzgpCisKKyNkZWZpbmUgR1JPVVBfS0VZX05PICAgICAgICAgICAgICAgIDQKKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMjcpCisjZGVmaW5lIElXRV9TVFJFQU1fQUREX0VWRU5UKF9BLCBfQiwgX0MsIF9ELCBfRSkJCWl3ZV9zdHJlYW1fYWRkX2V2ZW50KF9BLCBfQiwgX0MsIF9ELCBfRSkKKyNkZWZpbmUgSVdFX1NUUkVBTV9BRERfUE9JTlQoX0EsIF9CLCBfQywgX0QsIF9FKQkJaXdlX3N0cmVhbV9hZGRfcG9pbnQoX0EsIF9CLCBfQywgX0QsIF9FKQorI2RlZmluZSBJV0VfU1RSRUFNX0FERF9WQUxVRShfQSwgX0IsIF9DLCBfRCwgX0UsIF9GKQlpd2Vfc3RyZWFtX2FkZF92YWx1ZShfQSwgX0IsIF9DLCBfRCwgX0UsIF9GKQorI2Vsc2UKKyNkZWZpbmUgSVdFX1NUUkVBTV9BRERfRVZFTlQoX0EsIF9CLCBfQywgX0QsIF9FKQkJaXdlX3N0cmVhbV9hZGRfZXZlbnQoX0IsIF9DLCBfRCwgX0UpCisjZGVmaW5lIElXRV9TVFJFQU1fQUREX1BPSU5UKF9BLCBfQiwgX0MsIF9ELCBfRSkJCWl3ZV9zdHJlYW1fYWRkX3BvaW50KF9CLCBfQywgX0QsIF9FKQorI2RlZmluZSBJV0VfU1RSRUFNX0FERF9WQUxVRShfQSwgX0IsIF9DLCBfRCwgX0UsIF9GKQlpd2Vfc3RyZWFtX2FkZF92YWx1ZShfQiwgX0MsIF9ELCBfRSwgX0YpCisjZW5kaWYKKworZXh0ZXJuIFVDSEFSICAgIENpcGhlcldwYTJUZW1wbGF0ZVtdOworZXh0ZXJuIFVDSEFSICAgIENpcGhlcldwYVBza1RraXBbXTsKK2V4dGVybiBVQ0hBUiAgICBDaXBoZXJXcGFQc2tUa2lwTGVuOworCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX1JUX1ZFUlNJT05fSU5GT3sKKyAgICBVQ0hBUiAgICAgICBEcml2ZXJWZXJzaW9uVzsKKyAgICBVQ0hBUiAgICAgICBEcml2ZXJWZXJzaW9uWDsKKyAgICBVQ0hBUiAgICAgICBEcml2ZXJWZXJzaW9uWTsKKyAgICBVQ0hBUiAgICAgICBEcml2ZXJWZXJzaW9uWjsKKyAgICBVSU5UICAgICAgICBEcml2ZXJCdWlsZFllYXI7CisgICAgVUlOVCAgICAgICAgRHJpdmVyQnVpbGRNb250aDsKKyAgICBVSU5UICAgICAgICBEcml2ZXJCdWlsZERheTsKK30gUlRfVkVSU0lPTl9JTkZPLCAqUFJUX1ZFUlNJT05fSU5GTzsKKworc3RydWN0IGl3X3ByaXZfYXJncyBwcml2dGFiW10gPSB7Cit7IFJUUFJJVl9JT0NUTF9TRVQsCisgIElXX1BSSVZfVFlQRV9DSEFSIHwgMTAyNCwgMCwKKyAgInNldCJ9LAorCit7IFJUUFJJVl9JT0NUTF9TSE9XLCAwLCBJV19QUklWX1RZUEVfQ0hBUiB8IElXX1BSSVZfU0laRV9NQVNLLAorICAiIn0sCit7IFJUUFJJVl9JT0NUTF9TSE9XLCBJV19QUklWX1RZUEVfQ0hBUiB8IDEwMjQsIElXX1BSSVZfVFlQRV9DSEFSIHwgSVdfUFJJVl9TSVpFX01BU0ssCisgICIifSwKKy8qIC0tLSBzdWItaW9jdGxzIGRlZmluaXRpb25zIC0tLSAqLworICAgIHsgU0hPV19DT05OX1NUQVRVUywKKwkgIDAsIElXX1BSSVZfVFlQRV9DSEFSIHwgSVdfUFJJVl9TSVpFX01BU0ssICJjb25uU3RhdHVzIiB9LAorCXsgU0hPV19EUlZJRVJfVkVSSU9OLAorCSAgMCwgSVdfUFJJVl9UWVBFX0NIQVIgfCBJV19QUklWX1NJWkVfTUFTSywgImRyaXZlclZlciIgfSwKKyAgICB7IFNIT1dfQkFfSU5GTywKKwkgIDAsIElXX1BSSVZfVFlQRV9DSEFSIHwgSVdfUFJJVl9TSVpFX01BU0ssICJiYWluZm8iIH0sCisJeyBTSE9XX0RFU0NfSU5GTywKKwkgIDAsIElXX1BSSVZfVFlQRV9DSEFSIHwgSVdfUFJJVl9TSVpFX01BU0ssICJkZXNjaW5mbyIgfSwKKyAgICB7IFJBSU9fT0ZGLAorCSAgMCwgSVdfUFJJVl9UWVBFX0NIQVIgfCBJV19QUklWX1NJWkVfTUFTSywgInJhZGlvX29mZiIgfSwKKwl7IFJBSU9fT04sCisJICAwLCBJV19QUklWX1RZUEVfQ0hBUiB8IElXX1BSSVZfU0laRV9NQVNLLCAicmFkaW9fb24iIH0sCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJeyBTSE9XX0RMU19FTlRSWV9JTkZPLAorCSAgMCwgSVdfUFJJVl9UWVBFX0NIQVIgfCBJV19QUklWX1NJWkVfTUFTSywgImRsc2VudHJ5aW5mbyIgfSwKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKwl7IFNIT1dfQ0ZHX1ZBTFVFLAorCSAgSVdfUFJJVl9UWVBFX0NIQVIgfCAxMDI0LCBJV19QUklWX1RZUEVfQ0hBUiB8IElXX1BSSVZfU0laRV9NQVNLLCAic2hvdyIgfSwKKy8qIC0tLSBzdWItaW9jdGxzIHJlbGF0aW9ucyAtLS0gKi8KKworI2lmZGVmIERCRworeyBSVFBSSVZfSU9DVExfQkJQLAorICBJV19QUklWX1RZUEVfQ0hBUiB8IElXX1BSSVZfU0laRV9NQVNLLCBJV19QUklWX1RZUEVfQ0hBUiB8IElXX1BSSVZfU0laRV9NQVNLLAorICAiYmJwIn0sCit7IFJUUFJJVl9JT0NUTF9NQUMsCisgIElXX1BSSVZfVFlQRV9DSEFSIHwgMTAyNCwgSVdfUFJJVl9UWVBFX0NIQVIgfCAxMDI0LAorICAibWFjIn0sCit7IFJUUFJJVl9JT0NUTF9FMlAsCisgIElXX1BSSVZfVFlQRV9DSEFSIHwgMTAyNCwgSVdfUFJJVl9UWVBFX0NIQVIgfCAxMDI0LAorICAiZTJwIn0sCisjZW5kaWYgIC8qIERCRyAqLworCit7IFJUUFJJVl9JT0NUTF9TVEFUSVNUSUNTLAorICAwLCBJV19QUklWX1RZUEVfQ0hBUiB8IElXX1BSSVZfU0laRV9NQVNLLAorICAic3RhdCJ9LAoreyBSVFBSSVZfSU9DVExfR1NJVEVTVVJWRVksCisgIDAsIElXX1BSSVZfVFlQRV9DSEFSIHwgMTAyNCwKKyAgImdldF9zaXRlX3N1cnZleSJ9LAorfTsKKworSU5UIFNldF9TU0lEX1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZyk7CisKKyNpZmRlZiBXTU1fU1VQUE9SVAorSU5UCVNldF9XbW1DYXBhYmxlX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKyNlbmRpZgorCitJTlQgU2V0X05ldHdvcmtUeXBlX1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZyk7CisKK0lOVCBTZXRfQXV0aE1vZGVfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKTsKKworSU5UIFNldF9FbmNyeXBUeXBlX1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZyk7CisKK0lOVCBTZXRfRGVmYXVsdEtleUlEX1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZyk7CisKK0lOVCBTZXRfS2V5MV9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpOworCitJTlQgU2V0X0tleTJfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKTsKKworSU5UIFNldF9LZXkzX1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZyk7CisKK0lOVCBTZXRfS2V5NF9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpOworCitJTlQgU2V0X1dQQVBTS19Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpOworCisKK0lOVCBTZXRfUFNNb2RlX1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZyk7CisKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCitJTlQgU2V0X1dwYV9TdXBwb3J0KAorICAgIElOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCisjaWZkZWYgREJHCitWT0lEIFJUTVBJb2N0bEJCUCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAorCUlOCXN0cnVjdCBpd3JlcQkqd3JxKTsKKworVk9JRCBSVE1QSW9jdGxNQUMoCisJSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKKwlJTglzdHJ1Y3QgaXdyZXEJKndycSk7CisKK1ZPSUQgUlRNUElvY3RsRTJQUk9NKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIHN0cnVjdCBpd3JlcSAgICAqd3JxKTsKKyNlbmRpZiAvLyBEQkcgLy8KKworCitORElTX1NUQVRVUyBSVE1QV1BBTm9uZUFkZEtleVByb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisgICAgSU4JUFZPSUQJCQlwQnVmKTsKKworSU5UIFNldF9GcmFnVGVzdF9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCitJTlQgU2V0X1RHbldpZmlUZXN0X1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCitJTlQgU2V0X0xvbmdSZXRyeUxpbWl0X1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQgU2V0X1Nob3J0UmV0cnlMaW1pdF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworI2lmZGVmIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QKK0lOVCBTZXRfSWVlZTgwMjExZENsaWVudE1vZGVfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKTsKKyNlbmRpZiAvLyBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUIC8vCisKKyNpZmRlZiBDQVJSSUVSX0RFVEVDVElPTl9TVVBQT1JUCitJTlQgU2V0X0NhcnJpZXJEZXRlY3RfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZyk7CisjZW5kaWYgLy8gQ0FSUklFUl9ERVRFQ1RJT05fU1VQUE9SVCAvLworCitzdGF0aWMgc3RydWN0IHsKKwlDSEFSICpuYW1lOworCUlOVCAoKnNldF9wcm9jKShQUlRNUF9BREFQVEVSIHBBZGFwdGVyLCBQVUNIQVIgYXJnKTsKK30gKlBSVE1QX1BSSVZBVEVfU0VUX1BST0MsIFJUTVBfUFJJVkFURV9TVVBQT1JUX1BST0NbXSA9IHsKKwl7IkRyaXZlclZlcnNpb24iLAkJCQlTZXRfRHJpdmVyVmVyc2lvbl9Qcm9jfSwKKwl7IkNvdW50cnlSZWdpb24iLAkJCQlTZXRfQ291bnRyeVJlZ2lvbl9Qcm9jfSwKKwl7IkNvdW50cnlSZWdpb25BQmFuZCIsCQkJU2V0X0NvdW50cnlSZWdpb25BQmFuZF9Qcm9jfSwKKwl7IlNTSUQiLAkJCQkJCVNldF9TU0lEX1Byb2N9LAorCXsiV2lyZWxlc3NNb2RlIiwJCQkJU2V0X1dpcmVsZXNzTW9kZV9Qcm9jfSwKKwl7IlR4QnVyc3QiLAkJCQkJU2V0X1R4QnVyc3RfUHJvY30sCisJeyJUeFByZWFtYmxlIiwJCQkJU2V0X1R4UHJlYW1ibGVfUHJvY30sCisJeyJUeFBvd2VyIiwJCQkJCVNldF9UeFBvd2VyX1Byb2N9LAorCXsiQ2hhbm5lbCIsCQkJCQlTZXRfQ2hhbm5lbF9Qcm9jfSwKKwl7IkJHUHJvdGVjdGlvbiIsCQkJCVNldF9CR1Byb3RlY3Rpb25fUHJvY30sCisJeyJSVFNUaHJlc2hvbGQiLAkJCQlTZXRfUlRTVGhyZXNob2xkX1Byb2N9LAorCXsiRnJhZ1RocmVzaG9sZCIsCQkJCVNldF9GcmFnVGhyZXNob2xkX1Byb2N9LAorI2lmZGVmIERPVDExX05fU1VQUE9SVAorCXsiSHRCdyIsCQkgICAgICAgICAgICAgICAgU2V0X0h0QndfUHJvY30sCisJeyJIdE1jcyIsCQkgICAgICAgICAgICAgICAgU2V0X0h0TWNzX1Byb2N9LAorCXsiSHRHaSIsCQkgICAgICAgICAgICAgICAgU2V0X0h0R2lfUHJvY30sCisJeyJIdE9wTW9kZSIsCQkgICAgICAgICAgICBTZXRfSHRPcE1vZGVfUHJvY30sCisJeyJIdEV4dGNoYSIsCQkgICAgICAgICAgICBTZXRfSHRFeHRjaGFfUHJvY30sCisJeyJIdE1wZHVEZW5zaXR5IiwJCSAgICAgICAgU2V0X0h0TXBkdURlbnNpdHlfUHJvY30sCisJeyJIdEJhV2luU2l6ZSIsCQkgICAgICAgIAlTZXRfSHRCYVdpblNpemVfUHJvY30sCisJeyJIdFJkZyIsCQkgICAgICAgIAkJU2V0X0h0UmRnX1Byb2N9LAorCXsiSHRBbXNkdSIsCQkgICAgICAgIAkJU2V0X0h0QW1zZHVfUHJvY30sCisJeyJIdEF1dG9CYSIsCQkgICAgICAgIAlTZXRfSHRBdXRvQmFfUHJvY30sCisJeyJIdEJhRGVjbGluZSIsCQkJCQlTZXRfQkFEZWNsaW5lX1Byb2N9LAorCXsiSHRQcm90ZWN0IiwJCSAgICAgICAgCVNldF9IdFByb3RlY3RfUHJvY30sCisJeyJIdE1pbW9QcyIsCQkgICAgICAgIAlTZXRfSHRNaW1vUHNfUHJvY30sCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKyNpZmRlZiBBR0dSRUdBVElPTl9TVVBQT1JUCisJeyJQa3RBZ2dyZWdhdGUiLAkJCQlTZXRfUGt0QWdncmVnYXRlX1Byb2N9LAorI2VuZGlmCisKKyNpZmRlZiBXTU1fU1VQUE9SVAorCXsiV21tQ2FwYWJsZSIsCQkJCQlTZXRfV21tQ2FwYWJsZV9Qcm9jfSwKKyNlbmRpZgorCXsiSUVFRTgwMjExSCIsCQkJCQlTZXRfSUVFRTgwMjExSF9Qcm9jfSwKKyAgICB7Ik5ldHdvcmtUeXBlIiwgICAgICAgICAgICAgICAgIFNldF9OZXR3b3JrVHlwZV9Qcm9jfSwKKwl7IkF1dGhNb2RlIiwJCQkJCVNldF9BdXRoTW9kZV9Qcm9jfSwKKwl7IkVuY3J5cFR5cGUiLAkJCQkJU2V0X0VuY3J5cFR5cGVfUHJvY30sCisJeyJEZWZhdWx0S2V5SUQiLAkJCQlTZXRfRGVmYXVsdEtleUlEX1Byb2N9LAorCXsiS2V5MSIsCQkJCQkJU2V0X0tleTFfUHJvY30sCisJeyJLZXkyIiwJCQkJCQlTZXRfS2V5Ml9Qcm9jfSwKKwl7IktleTMiLAkJCQkJCVNldF9LZXkzX1Byb2N9LAorCXsiS2V5NCIsCQkJCQkJU2V0X0tleTRfUHJvY30sCisJeyJXUEFQU0siLAkJCQkJCVNldF9XUEFQU0tfUHJvY30sCisJeyJSZXNldENvdW50ZXIiLAkJCQlTZXRfUmVzZXRTdGF0Q291bnRlcl9Qcm9jfSwKKwl7IlBTTW9kZSIsICAgICAgICAgICAgICAgICAgICAgIFNldF9QU01vZGVfUHJvY30sCisjaWZkZWYgREJHCisJeyJEZWJ1ZyIsCQkJCQkJU2V0X0RlYnVnX1Byb2N9LAorI2VuZGlmCisKKyNpZmRlZiBSQUxJTktfQVRFCisJeyJBVEUiLAkJCQkJCQlTZXRfQVRFX1Byb2N9LAorCXsiQVRFREEiLAkJCQkJCVNldF9BVEVfREFfUHJvY30sCisJeyJBVEVTQSIsCQkJCQkJU2V0X0FURV9TQV9Qcm9jfSwKKwl7IkFURUJTU0lEIiwJCQkJCVNldF9BVEVfQlNTSURfUHJvY30sCisJeyJBVEVDSEFOTkVMIiwJCQkJCVNldF9BVEVfQ0hBTk5FTF9Qcm9jfSwKKwl7IkFURVRYUE9XMCIsCQkJCQlTZXRfQVRFX1RYX1BPV0VSMF9Qcm9jfSwKKwl7IkFURVRYUE9XMSIsCQkJCQlTZXRfQVRFX1RYX1BPV0VSMV9Qcm9jfSwKKwl7IkFURVRYQU5UIiwJCQkJCVNldF9BVEVfVFhfQW50ZW5uYV9Qcm9jfSwKKwl7IkFURVJYQU5UIiwJCQkJCVNldF9BVEVfUlhfQW50ZW5uYV9Qcm9jfSwKKwl7IkFURVRYRlJFUU9GRlNFVCIsCQkJCVNldF9BVEVfVFhfRlJFUU9GRlNFVF9Qcm9jfSwKKwl7IkFURVRYQlciLAkJCQkJCVNldF9BVEVfVFhfQldfUHJvY30sCisJeyJBVEVUWExFTiIsCQkJCQlTZXRfQVRFX1RYX0xFTkdUSF9Qcm9jfSwKKwl7IkFURVRYQ05UIiwJCQkJCVNldF9BVEVfVFhfQ09VTlRfUHJvY30sCisJeyJBVEVUWE1DUyIsCQkJCQlTZXRfQVRFX1RYX01DU19Qcm9jfSwKKwl7IkFURVRYTU9ERSIsCQkJCQlTZXRfQVRFX1RYX01PREVfUHJvY30sCisJeyJBVEVUWEdJIiwJCQkJCQlTZXRfQVRFX1RYX0dJX1Byb2N9LAorCXsiQVRFUlhGRVIiLAkJCQkJU2V0X0FURV9SWF9GRVJfUHJvY30sCisJeyJBVEVSUkYiLAkJCQkJCVNldF9BVEVfUmVhZF9SRl9Qcm9jfSwKKwl7IkFURVdSRjEiLAkJCQkJCVNldF9BVEVfV3JpdGVfUkYxX1Byb2N9LAorCXsiQVRFV1JGMiIsCQkJCQkJU2V0X0FURV9Xcml0ZV9SRjJfUHJvY30sCisJeyJBVEVXUkYzIiwJCQkJCQlTZXRfQVRFX1dyaXRlX1JGM19Qcm9jfSwKKwl7IkFURVdSRjQiLAkJCQkJCVNldF9BVEVfV3JpdGVfUkY0X1Byb2N9LAorCXsiQVRFTERFMlAiLAkJCQkgICAgU2V0X0FURV9Mb2FkX0UyUF9Qcm9jfSwKKwl7IkFURVJFMlAiLAkJCQkJCVNldF9BVEVfUmVhZF9FMlBfUHJvY30sCisJeyJBVEVTSE9XIiwJCQkJCQlTZXRfQVRFX1Nob3dfUHJvY30sCisJeyJBVEVIRUxQIiwJCQkJCQlTZXRfQVRFX0hlbHBfUHJvY30sCisKKyNpZmRlZiBSQUxJTktfMjh4eF9RQQorCXsiVHhTdG9wIiwJCQkJCQlTZXRfVHhTdG9wX1Byb2N9LAorCXsiUnhTdG9wIiwJCQkJCQlTZXRfUnhTdG9wX1Byb2N9LAorI2VuZGlmIC8vIFJBTElOS18yOHh4X1FBIC8vCisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgIHsiV3BhU3VwcG9ydCIsICAgICAgICAgICAgICAgICAgU2V0X1dwYV9TdXBwb3J0fSwKKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisKKworCisJeyJGaXhlZFR4TW9kZSIsICAgICAgICAgICAgICAgICBTZXRfRml4ZWRUeE1vZGVfUHJvY30sCisjaWZkZWYgQ09ORklHX0FQU1RBX01JWEVEX1NVUFBPUlQKKwl7Ik9wTW9kZSIsCQkJCQkJU2V0X09wTW9kZV9Qcm9jfSwKKyNlbmRpZiAvLyBDT05GSUdfQVBTVEFfTUlYRURfU1VQUE9SVCAvLworI2lmZGVmIERPVDExX05fU1VQUE9SVAorICAgIHsiVEduV2lmaVRlc3QiLCAgICAgICAgICAgICAgICAgU2V0X1RHbldpZmlUZXN0X1Byb2N9LAorICAgIHsiRm9yY2VHRiIsCQkgICAgICAgIAkJU2V0X0ZvcmNlR0ZfUHJvY30sCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJeyJEbHNBZGRFbnRyeSIsCQkJCQlTZXRfRGxzQWRkRW50cnlfUHJvY30sCisJeyJEbHNUZWFyRG93bkVudHJ5IiwJCQlTZXRfRGxzVGVhckRvd25FbnRyeV9Qcm9jfSwKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKwl7IkxvbmdSZXRyeSIsCSAgICAgICAgCQlTZXRfTG9uZ1JldHJ5TGltaXRfUHJvY30sCisJeyJTaG9ydFJldHJ5IiwJICAgICAgICAJCVNldF9TaG9ydFJldHJ5TGltaXRfUHJvY30sCisjaWZkZWYgRVhUX0JVSUxEX0NIQU5ORUxfTElTVAorCXsiMTFkQ2xpZW50TW9kZSIsCQkJCVNldF9JZWVlODAyMTFkQ2xpZW50TW9kZV9Qcm9jfSwKKyNlbmRpZiAvLyBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUIC8vCisjaWZkZWYgQ0FSUklFUl9ERVRFQ1RJT05fU1VQUE9SVAorCXsiQ2FycmllckRldGVjdCIsCQkJCVNldF9DYXJyaWVyRGV0ZWN0X1Byb2N9LAorI2VuZGlmIC8vIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQgLy8KKworCXtOVUxMLH0KK307CisKKworVk9JRCBSVE1QQWRkS2V5KAorCUlOCVBSVE1QX0FEQVBURVIJICAgIHBBZCwKKwlJTglQTkRJU184MDJfMTFfS0VZICAgIHBLZXkpCit7CisJVUxPTkcJCQkJS2V5SWR4OworCU1BQ19UQUJMRV9FTlRSWSAgCSpwRW50cnk7CisKKyAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVE1QQWRkS2V5IC0tLS0tLT5cbiIpKTsKKworCWlmIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpCisJeworCQlpZiAocEtleS0+S2V5SW5kZXggJiAweDgwMDAwMDAwKQorCQl7CisJCSAgICBpZiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBOZGlzWmVyb01lbW9yeShwQWQtPlN0YUNmZy5QTUssIDMyKTsKKyAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5QTUssIHBLZXktPktleU1hdGVyaWFsLCBwS2V5LT5LZXlMZW5ndGgpOworICAgICAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICAgICAgfQorCQkgICAgLy8gVXBkYXRlIFBUSworCQkgICAgTmRpc1plcm9NZW1vcnkoJnBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLCBzaXplb2YoQ0lQSEVSX0tFWSkpOworICAgICAgICAgICAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5TGVuID0gTEVOX1RLSVBfRUs7CisgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5LZXksIHBLZXktPktleU1hdGVyaWFsLCBMRU5fVEtJUF9FSyk7CisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgICAgICAgICAgaWYgKHBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5SeE1pYywgcEtleS0+S2V5TWF0ZXJpYWwgKyBMRU5fVEtJUF9FSywgTEVOX1RLSVBfVFhNSUNLKTsKKyAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5UeE1pYywgcEtleS0+S2V5TWF0ZXJpYWwgKyBMRU5fVEtJUF9FSyArIExFTl9US0lQX1RYTUlDSywgTEVOX1RLSVBfUlhNSUNLKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisgICAgICAgICAgICB7CisgICAgICAgICAgICAJTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uVHhNaWMsIHBLZXktPktleU1hdGVyaWFsICsgTEVOX1RLSVBfRUssIExFTl9US0lQX1RYTUlDSyk7CisgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uUnhNaWMsIHBLZXktPktleU1hdGVyaWFsICsgTEVOX1RLSVBfRUsgKyBMRU5fVEtJUF9UWE1JQ0ssIExFTl9US0lQX1JYTUlDSyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIERlY2lkZSBpdHMgQ2hpcGVyQWxnCisgICAgICAgIAlpZiAocEFkLT5TdGFDZmcuUGFpckNpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKQorICAgICAgICAJCXBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZyA9IENJUEhFUl9US0lQOworICAgICAgICAJZWxzZSBpZiAocEFkLT5TdGFDZmcuUGFpckNpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQorICAgICAgICAJCXBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZyA9IENJUEhFUl9BRVM7CisgICAgICAgIAllbHNlCisgICAgICAgIAkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnID0gQ0lQSEVSX05PTkU7CisKKyAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGVzZSByZWxhdGVkIGluZm9ybWF0aW9uIHRvIE1BQ19UQUJMRV9FTlRSWQorICAgICAgICAJcEVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF07CisgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwRW50cnktPlBhaXJ3aXNlS2V5LktleSwgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5LCBMRU5fVEtJUF9FSyk7CisgICAgICAgIAlOZGlzTW92ZU1lbW9yeShwRW50cnktPlBhaXJ3aXNlS2V5LlJ4TWljLCBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5SeE1pYywgTEVOX1RLSVBfUlhNSUNLKTsKKyAgICAgICAgCU5kaXNNb3ZlTWVtb3J5KHBFbnRyeS0+UGFpcndpc2VLZXkuVHhNaWMsIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLlR4TWljLCBMRU5fVEtJUF9UWE1JQ0spOworICAgICAgICAJcEVudHJ5LT5QYWlyd2lzZUtleS5DaXBoZXJBbGcgPSBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGc7CisKKyAgICAgICAgCS8vIFVwZGF0ZSBwYWlyd2lzZSBrZXkgaW5mb3JtYXRpb24gdG8gQVNJQyBTaGFyZWQgS2V5IFRhYmxlCisgICAgICAgIAlBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkLAorICAgICAgICAJCQkJCQkgIEJTUzAsCisgICAgICAgIAkJCQkJCSAgMCwKKyAgICAgICAgCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcsCisgICAgICAgIAkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5LAorICAgICAgICAJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLlR4TWljLAorICAgICAgICAJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLlJ4TWljKTsKKworICAgICAgICAJLy8gVXBkYXRlIEFTSUMgV0NJRCBhdHRyaWJ1dGUgdGFibGUgYW5kIElWRUlWIHRhYmxlCisgICAgICAgIAlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZCwKKyAgICAgICAgCQkJCQkJCSAgQlNTMCwKKyAgICAgICAgCQkJCQkJCSAgMCwKKyAgICAgICAgCQkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnLAorICAgICAgICAJCQkJCQkJICBwRW50cnkpOworCisgICAgICAgICAgICBpZiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBzZXQgODAyLjF4IHBvcnQgY29udHJvbAorCQkJCVNUQV9QT1JUX1NFQ1VSRUQocEFkKTsKKworICAgICAgICAgICAgICAgIC8vIEluZGljYXRlIENvbm5lY3RlZCBmb3IgR1VJCisgICAgICAgICAgICAgICAgcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZUNvbm5lY3RlZDsKKyAgICAgICAgICAgIH0KKwkJfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFVwZGF0ZSBHVEsKKyAgICAgICAgICAgIHBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCA9IChwS2V5LT5LZXlJbmRleCAmIDB4RkYpOworICAgICAgICAgICAgTmRpc1plcm9NZW1vcnkoJnBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0sIHNpemVvZihDSVBIRVJfS0VZKSk7CisgICAgICAgICAgICBwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLktleUxlbiA9IExFTl9US0lQX0VLOworICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5LZXksIHBLZXktPktleU1hdGVyaWFsLCBMRU5fVEtJUF9FSyk7CisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgICAgICAgICAgaWYgKHBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5SeE1pYywgcEtleS0+S2V5TWF0ZXJpYWwgKyBMRU5fVEtJUF9FSywgTEVOX1RLSVBfVFhNSUNLKTsKKyAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLlR4TWljLCBwS2V5LT5LZXlNYXRlcmlhbCArIExFTl9US0lQX0VLICsgTEVOX1RLSVBfVFhNSUNLLCBMRU5fVEtJUF9SWE1JQ0spOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAlOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLlR4TWljLCBwS2V5LT5LZXlNYXRlcmlhbCArIExFTl9US0lQX0VLLCBMRU5fVEtJUF9UWE1JQ0spOworICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uUnhNaWMsIHBLZXktPktleU1hdGVyaWFsICsgTEVOX1RLSVBfRUsgKyBMRU5fVEtJUF9UWE1JQ0ssIExFTl9US0lQX1JYTUlDSyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFVwZGF0ZSBTaGFyZWQgS2V5IENpcGhlckFsZworICAgIAkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5DaXBoZXJBbGcgPSBDSVBIRVJfTk9ORTsKKyAgICAJCWlmIChwQWQtPlN0YUNmZy5Hcm91cENpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKQorICAgIAkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uQ2lwaGVyQWxnID0gQ0lQSEVSX1RLSVA7CisgICAgCQllbHNlIGlmIChwQWQtPlN0YUNmZy5Hcm91cENpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQorICAgIAkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uQ2lwaGVyQWxnID0gQ0lQSEVSX0FFUzsKKworICAgICAgICAgICAgLy8gVXBkYXRlIGdyb3VwIGtleSBpbmZvcm1hdGlvbiB0byBBU0lDIFNoYXJlZCBLZXkgVGFibGUKKyAgICAgICAgCUFzaWNBZGRTaGFyZWRLZXlFbnRyeShwQWQsCisgICAgICAgIAkJCQkJCSAgQlNTMCwKKyAgICAgICAgCQkJCQkJICBwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQsCisgICAgICAgIAkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5DaXBoZXJBbGcsCisgICAgICAgIAkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5LZXksCisgICAgICAgIAkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5UeE1pYywKKyAgICAgICAgCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLlJ4TWljKTsKKworICAgICAgICAJLy8gVXBkYXRlIEFTSUMgV0NJRCBhdHRyaWJ1dGUgdGFibGUgYW5kIElWRUlWIHRhYmxlCisgICAgICAgIAlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZCwKKyAgICAgICAgCQkJCQkJCSAgQlNTMCwKKyAgICAgICAgCQkJCQkJCSAgcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkLAorICAgICAgICAJCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLkNpcGhlckFsZywKKyAgICAgICAgCQkJCQkJCSAgTlVMTCk7CisKKyAgICAgICAgICAgIC8vIHNldCA4MDIuMXggcG9ydCBjb250cm9sCisJCQlTVEFfUE9SVF9TRUNVUkVEKHBBZCk7CisKKyAgICAgICAgICAgIC8vIEluZGljYXRlIENvbm5lY3RlZCBmb3IgR1VJCisgICAgICAgICAgICBwQWQtPkluZGljYXRlTWVkaWFTdGF0ZSA9IE5kaXNNZWRpYVN0YXRlQ29ubmVjdGVkOworICAgICAgICB9CisJfQorCWVsc2UJLy8gZHluYW1pYyBXRVAgZnJvbSB3cGFfc3VwcGxpY2FudAorCXsKKwkJVUNIQVIJQ2lwaGVyQWxnOworICAgIAlQVUNIQVIJS2V5OworCisJCWlmKHBLZXktPktleUxlbmd0aCA9PSAzMikKKwkJCWdvdG8gZW5kOworCisJCUtleUlkeCA9IHBLZXktPktleUluZGV4ICYgMHgwZmZmZmZmZjsKKworCQlpZiAoS2V5SWR4IDwgNCkKKwkJeworCQkJLy8gaXQgaXMgYSBkZWZhdWx0IHNoYXJlZCBrZXksIGZvciBQYWlyd2lzZSBrZXkgc2V0dGluZworCQkJaWYgKHBLZXktPktleUluZGV4ICYgMHg4MDAwMDAwMCkKKwkJCXsKKwkJCQlwRW50cnkgPSBNYWNUYWJsZUxvb2t1cChwQWQsIHBLZXktPkJTU0lEKTsKKworCQkJCWlmIChwRW50cnkpCisJCQkJeworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVE1QQWRkS2V5OiBTZXQgUGFpci13aXNlIEtleVxuIikpOworCisJCQkJCS8vIHNldCBrZXkgbWF0ZXJpYWwgYW5kIGtleSBsZW5ndGgKKyAJCQkJCXBFbnRyeS0+UGFpcndpc2VLZXkuS2V5TGVuID0gKFVDSEFSKXBLZXktPktleUxlbmd0aDsKKwkJCQkJTmRpc01vdmVNZW1vcnkocEVudHJ5LT5QYWlyd2lzZUtleS5LZXksICZwS2V5LT5LZXlNYXRlcmlhbCwgcEtleS0+S2V5TGVuZ3RoKTsKKworCQkJCQkvLyBzZXQgQ2lwaGVyIHR5cGUKKwkJCQkJaWYgKHBLZXktPktleUxlbmd0aCA9PSA1KQorCQkJCQkJcEVudHJ5LT5QYWlyd2lzZUtleS5DaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7CisJCQkJCWVsc2UKKwkJCQkJCXBFbnRyeS0+UGFpcndpc2VLZXkuQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDEyODsKKworCQkJCQkvLyBBZGQgUGFpci13aXNlIGtleSB0byBBc2ljCisJCQkJCUFzaWNBZGRQYWlyd2lzZUtleUVudHJ5KAorCQkJCQkJcEFkLAorCQkJCQkJcEVudHJ5LT5BZGRyLAorCQkJCQkJKFVDSEFSKXBFbnRyeS0+QWlkLAorICAgICAgICAgICAgICAgIAkJJnBFbnRyeS0+UGFpcndpc2VLZXkpOworCisJCQkJCS8vIHVwZGF0ZSBXQ0lEIGF0dHJpYnV0ZSB0YWJsZSBhbmQgSVZFSVYgdGFibGUgZm9yIHRoaXMgZW50cnkKKwkJCQkJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeSgKKwkJCQkJCXBBZCwKKwkJCQkJCUJTUzAsCisJCQkJCQlLZXlJZHgsIC8vIFRoZSB2YWx1ZSBtYXkgYmUgbm90IHplcm8KKwkJCQkJCXBFbnRyeS0+UGFpcndpc2VLZXkuQ2lwaGVyQWxnLAorCQkJCQkJcEVudHJ5KTsKKworCQkJCX0KKwkJCX0KKwkJCWVsc2UKKyAgICAgICAgICAgIHsKKwkJCQkvLyBEZWZhdWx0IGtleSBmb3IgdHggKHNoYXJlZCBrZXkpCisJCQkJcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkID0gKFVDSEFSKSBLZXlJZHg7CisKKwkJCQkvLyBzZXQga2V5IG1hdGVyaWFsIGFuZCBrZXkgbGVuZ3RoCisJCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5LZXlMZW4gPSAoVUNIQVIpIHBLZXktPktleUxlbmd0aDsKKwkJCQlOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLktleSwgJnBLZXktPktleU1hdGVyaWFsLCBwS2V5LT5LZXlMZW5ndGgpOworCisJCQkJLy8gU2V0IENpcGVyIHR5cGUKKwkJCQlpZiAocEtleS0+S2V5TGVuZ3RoID09IDUpCisJCQkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OworCQkJCWVsc2UKKwkJCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5DaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OworCisgICAgCQkJQ2lwaGVyQWxnID0gcEFkLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5DaXBoZXJBbGc7CisgICAgCQkJS2V5ID0gcEFkLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5LZXk7CisKKwkJCQkvLyBTZXQgR3JvdXAga2V5IG1hdGVyaWFsIHRvIEFzaWMKKyAgICAJCQlBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkLCBCU1MwLCBLZXlJZHgsIENpcGhlckFsZywgS2V5LCBOVUxMLCBOVUxMKTsKKworCQkJCS8vIFVwZGF0ZSBXQ0lEIGF0dHJpYnV0ZSB0YWJsZSBhbmQgSVZFSVYgdGFibGUgZm9yIHRoaXMgZ3JvdXAga2V5IHRhYmxlCisJCQkJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWQsIEJTUzAsIEtleUlkeCwgQ2lwaGVyQWxnLCBOVUxMKTsKKworCQkJfQorCQl9CisJfQorZW5kOgorCXJldHVybjsKK30KKworY2hhciAqIHJ0c3RyY2hyKGNvbnN0IGNoYXIgKiBzLCBpbnQgYykKK3sKKyAgICBmb3IoOyAqcyAhPSAoY2hhcikgYzsgKytzKQorICAgICAgICBpZiAoKnMgPT0gJ1wwJykKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiAoY2hhciAqKSBzOworfQorCisvKgorVGhpcyBpcyByZXF1aXJlZCBmb3IgTGluRVgyMDA0L2tlcm5lbDIuNi43IHRvIHByb3ZpZGUgaXdsaXN0IHNjYW5uaW5nIGZ1bmN0aW9uCisqLworCitpbnQKK3J0X2lvY3RsX2dpd25hbWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJICAgY2hhciAqbmFtZSwgY2hhciAqZXh0cmEpCit7CisvLwlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gZGV2LT5tbF9wcml2OworCisjaWZkZWYgUlQyODYwCisgICAgc3RybmNweShuYW1lLCAiUlQyODYwIFdpcmVsZXNzIiwgSUZOQU1TSVopOworI2VuZGlmIC8vIFJUMjg2MCAvLworCXJldHVybiAwOworfQorCitpbnQgcnRfaW9jdGxfc2l3ZnJlcShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCXN0cnVjdCBpd19mcmVxICpmcmVxLCBjaGFyICpleHRyYSkKK3sKKwlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gZGV2LT5tbF9wcml2OworCWludCAJY2hhbiA9IC0xOworCisgICAgLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KKyAgICBpZighUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCisgICAgeworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisgICAgICAgIHJldHVybiAtRU5FVERPV047CisgICAgfQorCisKKwlpZiAoZnJlcS0+ZSA+IDEpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYoKGZyZXEtPmUgPT0gMCkgJiYgKGZyZXEtPm0gPD0gMTAwMCkpCisJCWNoYW4gPSBmcmVxLT5tOwkvLyBTZXR0aW5nIGJ5IGNoYW5uZWwgbnVtYmVyCisJZWxzZQorCQlNQVBfS0haX1RPX0NIQU5ORUxfSUQoIChmcmVxLT5tIC8xMDApICwgY2hhbik7IC8vIFNldHRpbmcgYnkgZnJlcXVlbmN5IC0gc2VhcmNoIHRoZSB0YWJsZSAsIGxpa2UgMi40MTJHLCAyLjQyMkcsCisKKyAgICBpZiAoQ2hhbm5lbFNhbml0eShwQWRhcHRlciwgY2hhbikgPT0gVFJVRSkKKyAgICB7CisJcEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsID0gY2hhbjsKKwlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCI9PT5ydF9pb2N0bF9zaXdmcmVxOjpTSU9DU0lXRlJFUVtjbWQ9MHgleF0gKENoYW5uZWw9JWQpXG4iLCBTSU9DU0lXRlJFUSwgcEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsKSk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gMDsKK30KK2ludCBydF9pb2N0bF9naXdmcmVxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCSAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSAgIHN0cnVjdCBpd19mcmVxICpmcmVxLCBjaGFyICpleHRyYSkKK3sKKyAgICBWSVJUVUFMX0FEQVBURVIgKnBWaXJ0dWFsQWQgPSBOVUxMOworCVBSVE1QX0FEQVBURVIgcEFkYXB0ZXIgPSBOVUxMOworCVVDSEFSIGNoOworCVVMT05HCW07CisKKwlpZiAoZGV2LT5wcml2X2ZsYWdzID09IElOVF9NQUlOKQorCXsKKwkJcEFkYXB0ZXIgPSBkZXYtPm1sX3ByaXY7CisJfQorCWVsc2UKKwl7CisJCXBWaXJ0dWFsQWQgPSBkZXYtPm1sX3ByaXY7CisJCWlmIChwVmlydHVhbEFkICYmIHBWaXJ0dWFsQWQtPlJ0bXBEZXYpCisJCQlwQWRhcHRlciA9IHBWaXJ0dWFsQWQtPlJ0bXBEZXYtPm1sX3ByaXY7CisJfQorCisJaWYgKHBBZGFwdGVyID09IE5VTEwpCisJeworCQkvKiBpZiAxc3Qgb3BlbiBmYWlsLCBwQWQgd2lsbCBiZSBmcmVlOworCQkgICBTbyB0aGUgbmV0X2Rldi0+bWxfcHJpdiB3aWxsIGJlIE5VTEwgaW4gMnJkIG9wZW4gKi8KKwkJcmV0dXJuIC1FTkVURE9XTjsKKwl9CisKKwkJY2ggPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWw7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIj09PnJ0X2lvY3RsX2dpd2ZyZXEgICVkXG4iLCBjaCkpOworCisgICAgTUFQX0NIQU5ORUxfSURfVE9fS0haKGNoLCBtKTsKKwlmcmVxLT5tID0gbSAqIDEwMDsKKwlmcmVxLT5lID0gMTsKKwlyZXR1cm4gMDsKK30KKworaW50IHJ0X2lvY3RsX3Npd21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJICAgX191MzIgKm1vZGUsIGNoYXIgKmV4dHJhKQoreworCVBSVE1QX0FEQVBURVIgcEFkYXB0ZXIgPSBkZXYtPm1sX3ByaXY7CisKKwkvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgorICAgIGlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKKyAgICB7CisgICAgCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKyAgICAgICAJcmV0dXJuIC1FTkVURE9XTjsKKyAgICB9CisKKwlzd2l0Y2ggKCptb2RlKQorCXsKKwkJY2FzZSBJV19NT0RFX0FESE9DOgorCQkJU2V0X05ldHdvcmtUeXBlX1Byb2MocEFkYXB0ZXIsICJBZGhvYyIpOworCQkJYnJlYWs7CisJCWNhc2UgSVdfTU9ERV9JTkZSQToKKwkJCVNldF9OZXR3b3JrVHlwZV9Qcm9jKHBBZGFwdGVyLCAiSW5mcmEiKTsKKwkJCWJyZWFrOworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDQsMjApKQorICAgICAgICBjYXNlIElXX01PREVfTU9OSVRPUjoKKwkJCVNldF9OZXR3b3JrVHlwZV9Qcm9jKHBBZGFwdGVyLCAiTW9uaXRvciIpOworCQkJYnJlYWs7CisjZW5kaWYKKwkJZGVmYXVsdDoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT5ydF9pb2N0bF9zaXdtb2RlOjpTSU9DU0lXTU9ERSAodW5rbm93biAlZClcbiIsICptb2RlKSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvLyBSZXNldCBSYWxpbmsgc3VwcGxpY2FudCB0byBub3QgdXNlLCBpdCB3aWxsIGJlIHNldCB0byBzdGFydCB3aGVuIFVJIHNldCBQTUsga2V5CisJcEFkYXB0ZXItPlN0YUNmZy5XcGFTdGF0ZSA9IFNTX05PVFVTRTsKKworCXJldHVybiAwOworfQorCitpbnQgcnRfaW9jdGxfZ2l3bW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgICBfX3UzMiAqbW9kZSwgY2hhciAqZXh0cmEpCit7CisJUFJUTVBfQURBUFRFUiAJcEFkYXB0ZXIgPSBOVUxMOworCVZJUlRVQUxfQURBUFRFUiAqcFZpcnR1YWxBZCA9IE5VTEw7CisKKwlpZiAoZGV2LT5wcml2X2ZsYWdzID09IElOVF9NQUlOKQorCXsKKwkJcEFkYXB0ZXIgPSBkZXYtPm1sX3ByaXY7CisJfQorCWVsc2UKKwl7CisJCXBWaXJ0dWFsQWQgPSBkZXYtPm1sX3ByaXY7CisJCWlmIChwVmlydHVhbEFkICYmIHBWaXJ0dWFsQWQtPlJ0bXBEZXYpCisJCQlwQWRhcHRlciA9IHBWaXJ0dWFsQWQtPlJ0bXBEZXYtPm1sX3ByaXY7CisJfQorCisJaWYgKHBBZGFwdGVyID09IE5VTEwpCisJeworCQkvKiBpZiAxc3Qgb3BlbiBmYWlsLCBwQWQgd2lsbCBiZSBmcmVlOworCQkgICBTbyB0aGUgbmV0X2Rldi0+bWxfcHJpdiB3aWxsIGJlIE5VTEwgaW4gMnJkIG9wZW4gKi8KKwkJcmV0dXJuIC1FTkVURE9XTjsKKwl9CisKKwlpZiAoQURIT0NfT04ocEFkYXB0ZXIpKQorCQkqbW9kZSA9IElXX01PREVfQURIT0M7CisgICAgZWxzZSBpZiAoSU5GUkFfT04ocEFkYXB0ZXIpKQorCQkqbW9kZSA9IElXX01PREVfSU5GUkE7CisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNCwyMCkpCisgICAgZWxzZSBpZiAoTU9OSVRPUl9PTihwQWRhcHRlcikpCisgICAgeworICAgICAgICAqbW9kZSA9IElXX01PREVfTU9OSVRPUjsKKyAgICB9CisjZW5kaWYKKyAgICBlbHNlCisgICAgICAgICptb2RlID0gSVdfTU9ERV9BVVRPOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT0+cnRfaW9jdGxfZ2l3bW9kZShtb2RlPSVkKVxuIiwgKm1vZGUpKTsKKwlyZXR1cm4gMDsKK30KKworaW50IHJ0X2lvY3RsX3Npd3NlbnMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJICAgY2hhciAqbmFtZSwgY2hhciAqZXh0cmEpCit7CisJUFJUTVBfQURBUFRFUiBwQWRhcHRlciA9IGRldi0+bWxfcHJpdjsKKworCS8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCisgICAgCWlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKKyAgICAJeworICAgICAgICAJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOworICAgICAgICAJcmV0dXJuIC1FTkVURE9XTjsKKyAgICAJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCBydF9pb2N0bF9naXdzZW5zKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCSAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSAgIGNoYXIgKm5hbWUsIGNoYXIgKmV4dHJhKQoreworCXJldHVybiAwOworfQorCitpbnQgcnRfaW9jdGxfZ2l3cmFuZ2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJICAgc3RydWN0IGl3X3BvaW50ICpkYXRhLCBjaGFyICpleHRyYSkKK3sKKwlQUlRNUF9BREFQVEVSIAlwQWRhcHRlciA9IE5VTEw7CisJVklSVFVBTF9BREFQVEVSICpwVmlydHVhbEFkID0gTlVMTDsKKwlzdHJ1Y3QgaXdfcmFuZ2UgKnJhbmdlID0gKHN0cnVjdCBpd19yYW5nZSAqKSBleHRyYTsKKwl1MTYgdmFsOworCWludCBpOworCisJaWYgKGRldi0+cHJpdl9mbGFncyA9PSBJTlRfTUFJTikKKwl7CisJCXBBZGFwdGVyID0gZGV2LT5tbF9wcml2OworCX0KKwllbHNlCisJeworCQlwVmlydHVhbEFkID0gZGV2LT5tbF9wcml2OworCQlpZiAocFZpcnR1YWxBZCAmJiBwVmlydHVhbEFkLT5SdG1wRGV2KQorCQkJcEFkYXB0ZXIgPSBwVmlydHVhbEFkLT5SdG1wRGV2LT5tbF9wcml2OworCX0KKworCWlmIChwQWRhcHRlciA9PSBOVUxMKQorCXsKKwkJLyogaWYgMXN0IG9wZW4gZmFpbCwgcEFkIHdpbGwgYmUgZnJlZTsKKwkJICAgU28gdGhlIG5ldF9kZXYtPm1sX3ByaXYgd2lsbCBiZSBOVUxMIGluIDJyZCBvcGVuICovCisJCXJldHVybiAtRU5FVERPV047CisJfQorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UgLCgiPT09PnJ0X2lvY3RsX2dpd3JhbmdlXG4iKSk7CisJZGF0YS0+bGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCBpd19yYW5nZSk7CisJbWVtc2V0KHJhbmdlLCAwLCBzaXplb2Yoc3RydWN0IGl3X3JhbmdlKSk7CisKKwlyYW5nZS0+dHhwb3dlcl9jYXBhID0gSVdfVFhQT1dfREJNOworCisJaWYgKElORlJBX09OKHBBZGFwdGVyKXx8QURIT0NfT04ocEFkYXB0ZXIpKQorCXsKKwkJcmFuZ2UtPm1pbl9wbXAgPSAxICogMTAyNDsKKwkJcmFuZ2UtPm1heF9wbXAgPSA2NTUzNSAqIDEwMjQ7CisJCXJhbmdlLT5taW5fcG10ID0gMSAqIDEwMjQ7CisJCXJhbmdlLT5tYXhfcG10ID0gMTAwMCAqIDEwMjQ7CisJCXJhbmdlLT5wbXBfZmxhZ3MgPSBJV19QT1dFUl9QRVJJT0Q7CisJCXJhbmdlLT5wbXRfZmxhZ3MgPSBJV19QT1dFUl9USU1FT1VUOworCQlyYW5nZS0+cG1fY2FwYSA9IElXX1BPV0VSX1BFUklPRCB8IElXX1BPV0VSX1RJTUVPVVQgfAorCQkJSVdfUE9XRVJfVU5JQ0FTVF9SIHwgSVdfUE9XRVJfQUxMX1I7CisJfQorCisJcmFuZ2UtPndlX3ZlcnNpb25fY29tcGlsZWQgPSBXSVJFTEVTU19FWFQ7CisJcmFuZ2UtPndlX3ZlcnNpb25fc291cmNlID0gMTQ7CisKKwlyYW5nZS0+cmV0cnlfY2FwYSA9IElXX1JFVFJZX0xJTUlUOworCXJhbmdlLT5yZXRyeV9mbGFncyA9IElXX1JFVFJZX0xJTUlUOworCXJhbmdlLT5taW5fcmV0cnkgPSAwOworCXJhbmdlLT5tYXhfcmV0cnkgPSAyNTU7CisKKwlyYW5nZS0+bnVtX2NoYW5uZWxzID0gIHBBZGFwdGVyLT5DaGFubmVsTGlzdE51bTsKKworCXZhbCA9IDA7CisJZm9yIChpID0gMTsgaSA8PSByYW5nZS0+bnVtX2NoYW5uZWxzOyBpKyspCisJeworCQl1MzIgbTsKKwkJcmFuZ2UtPmZyZXFbdmFsXS5pID0gcEFkYXB0ZXItPkNoYW5uZWxMaXN0W2ktMV0uQ2hhbm5lbDsKKwkJTUFQX0NIQU5ORUxfSURfVE9fS0haKHBBZGFwdGVyLT5DaGFubmVsTGlzdFtpLTFdLkNoYW5uZWwsIG0pOworCQlyYW5nZS0+ZnJlcVt2YWxdLm0gPSBtICogMTAwOyAvKiBIWiAqLworCisJCXJhbmdlLT5mcmVxW3ZhbF0uZSA9IDE7CisJCXZhbCsrOworCQlpZiAodmFsID09IElXX01BWF9GUkVRVUVOQ0lFUykKKwkJCWJyZWFrOworCX0KKwlyYW5nZS0+bnVtX2ZyZXF1ZW5jeSA9IHZhbDsKKworCXJhbmdlLT5tYXhfcXVhbC5xdWFsID0gMTAwOyAvKiB3aGF0IGlzIGNvcnJlY3QgbWF4PyBUaGlzIHdhcyBub3QKKwkJCQkJKiBkb2N1bWVudGVkIGV4YWN0bHkuIEF0IGxlYXN0CisJCQkJCSogNjkgaGFzIGJlZW4gb2JzZXJ2ZWQuICovCisJcmFuZ2UtPm1heF9xdWFsLmxldmVsID0gMDsgLyogZEIgKi8KKwlyYW5nZS0+bWF4X3F1YWwubm9pc2UgPSAwOyAvKiBkQiAqLworCisJLyogV2hhdCB3b3VsZCBiZSBzdWl0YWJsZSB2YWx1ZXMgZm9yICJhdmVyYWdlL3R5cGljYWwiIHF1YWw/ICovCisJcmFuZ2UtPmF2Z19xdWFsLnF1YWwgPSAyMDsKKwlyYW5nZS0+YXZnX3F1YWwubGV2ZWwgPSAtNjA7CisJcmFuZ2UtPmF2Z19xdWFsLm5vaXNlID0gLTk1OworCXJhbmdlLT5zZW5zaXRpdml0eSA9IDM7CisKKwlyYW5nZS0+bWF4X2VuY29kaW5nX3Rva2VucyA9IE5SX1dFUF9LRVlTOworCXJhbmdlLT5udW1fZW5jb2Rpbmdfc2l6ZXMgPSAyOworCXJhbmdlLT5lbmNvZGluZ19zaXplWzBdID0gNTsKKwlyYW5nZS0+ZW5jb2Rpbmdfc2l6ZVsxXSA9IDEzOworCisJcmFuZ2UtPm1pbl9ydHMgPSAwOworCXJhbmdlLT5tYXhfcnRzID0gMjM0NzsKKwlyYW5nZS0+bWluX2ZyYWcgPSAyNTY7CisJcmFuZ2UtPm1heF9mcmFnID0gMjM0NjsKKworI2lmIFdJUkVMRVNTX0VYVCA+IDE3CisJLyogSVdfRU5DX0NBUEFfKiBiaXQgZmllbGQgKi8KKwlyYW5nZS0+ZW5jX2NhcGEgPSBJV19FTkNfQ0FQQV9XUEEgfCBJV19FTkNfQ0FQQV9XUEEyIHwKKwkJCQkJSVdfRU5DX0NBUEFfQ0lQSEVSX1RLSVAgfCBJV19FTkNfQ0FQQV9DSVBIRVJfQ0NNUDsKKyNlbmRpZgorCisJcmV0dXJuIDA7Cit9CisKK2ludCBydF9pb2N0bF9zaXdhcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgICAgICBzdHJ1Y3Qgc29ja2FkZHIgKmFwX2FkZHIsIGNoYXIgKmV4dHJhKQoreworCVBSVE1QX0FEQVBURVIgcEFkYXB0ZXIgPSBkZXYtPm1sX3ByaXY7CisgICAgTkRJU184MDJfMTFfTUFDX0FERFJFU1MgQnNzaWQ7CisKKwkvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgorCWlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKKwl7CisgICAgICAgCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKyAgICAgICAJcmV0dXJuIC1FTkVURE9XTjsKKyAgICB9CisKKwlpZiAocEFkYXB0ZXItPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlICE9IENOVExfSURMRSkKKyAgICB7CisgICAgICAgIFJUMjhYWF9NTE1FX1JFU0VUX1NUQVRFX01BQ0hJTkUocEFkYXB0ZXIpOworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgTUxNRSBidXN5LCByZXNldCBNTE1FIHN0YXRlIG1hY2hpbmUgISEhXG4iKSk7CisgICAgfQorCisgICAgLy8gdGVsbCBDTlRMIHN0YXRlIG1hY2hpbmUgdG8gY2FsbCBOZGlzTVNldEluZm9ybWF0aW9uQ29tcGxldGUoKSBhZnRlciBjb21wbGV0aW5nCisgICAgLy8gdGhpcyByZXF1ZXN0LCBiZWNhdXNlIHRoaXMgcmVxdWVzdCBpcyBpbml0aWF0ZWQgYnkgTkRJUy4KKyAgICBwQWRhcHRlci0+TWxtZUF1eC5DdXJyUmVxSXNGcm9tTmRpcyA9IEZBTFNFOworCS8vIFByZXZlbnQgdG8gY29ubmVjdCBBUCBhZ2FpbiBpbiBTVEFNbG1lUGVyaW9kaWNFeGVjCisJcEFkYXB0ZXItPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWRMZW49IDMyOworCisgICAgbWVtc2V0KEJzc2lkLCAwLCBNQUNfQUREUl9MRU4pOworICAgIG1lbWNweShCc3NpZCwgYXBfYWRkci0+c2FfZGF0YSwgTUFDX0FERFJfTEVOKTsKKyAgICBNbG1lRW5xdWV1ZShwQWRhcHRlciwKKyAgICAgICAgICAgICAgICBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwKKyAgICAgICAgICAgICAgICBPSURfODAyXzExX0JTU0lELAorICAgICAgICAgICAgICAgIHNpemVvZihORElTXzgwMl8xMV9NQUNfQUREUkVTUyksCisgICAgICAgICAgICAgICAgKFZPSUQgKikmQnNzaWQpOworCisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU9DVEw6OlNJT0NTSVdBUCAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKyAgICAgICAgQnNzaWRbMF0sIEJzc2lkWzFdLCBCc3NpZFsyXSwgQnNzaWRbM10sIEJzc2lkWzRdLCBCc3NpZFs1XSkpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBydF9pb2N0bF9naXdhcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgICAgICBzdHJ1Y3Qgc29ja2FkZHIgKmFwX2FkZHIsIGNoYXIgKmV4dHJhKQoreworCVBSVE1QX0FEQVBURVIgCXBBZGFwdGVyID0gTlVMTDsKKwlWSVJUVUFMX0FEQVBURVIgKnBWaXJ0dWFsQWQgPSBOVUxMOworCisJaWYgKGRldi0+cHJpdl9mbGFncyA9PSBJTlRfTUFJTikKKwl7CisJCXBBZGFwdGVyID0gZGV2LT5tbF9wcml2OworCX0KKwllbHNlCisJeworCQlwVmlydHVhbEFkID0gZGV2LT5tbF9wcml2OworCQlpZiAocFZpcnR1YWxBZCAmJiBwVmlydHVhbEFkLT5SdG1wRGV2KQorCQkJcEFkYXB0ZXIgPSBwVmlydHVhbEFkLT5SdG1wRGV2LT5tbF9wcml2OworCX0KKworCWlmIChwQWRhcHRlciA9PSBOVUxMKQorCXsKKwkJLyogaWYgMXN0IG9wZW4gZmFpbCwgcEFkIHdpbGwgYmUgZnJlZTsKKwkJICAgU28gdGhlIG5ldF9kZXYtPm1sX3ByaXYgd2lsbCBiZSBOVUxMIGluIDJyZCBvcGVuICovCisJCXJldHVybiAtRU5FVERPV047CisJfQorCisJaWYgKElORlJBX09OKHBBZGFwdGVyKSB8fCBBREhPQ19PTihwQWRhcHRlcikpCisJeworCQlhcF9hZGRyLT5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7CisJCW1lbWNweShhcF9hZGRyLT5zYV9kYXRhLCAmcEFkYXB0ZXItPkNvbW1vbkNmZy5Cc3NpZCwgRVRIX0FMRU4pOworCX0KKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgLy8gQWRkIGZvciBSVDI4NzAKKyAgICBlbHNlIGlmIChwQWRhcHRlci0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCAhPSBXUEFfU1VQUExJQ0FOVF9ESVNBQkxFKQorICAgIHsKKyAgICAgICAgYXBfYWRkci0+c2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOworICAgICAgICBtZW1jcHkoYXBfYWRkci0+c2FfZGF0YSwgJnBBZGFwdGVyLT5NbG1lQXV4LkJzc2lkLCBFVEhfQUxFTik7CisgICAgfQorI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKwllbHNlCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJT0NUTDo6U0lPQ0dJV0FQKD1FTVBUWSlcbiIpKTsKKwkJcmV0dXJuIC1FTk9UQ09OTjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFVuaXRzIGFyZSBpbiBkYiBhYm92ZSB0aGUgbm9pc2UgZmxvb3IuIFRoYXQgbWVhbnMgdGhlCisgKiByc3NpIHZhbHVlcyByZXBvcnRlZCBpbiB0aGUgdHgvcnggZGVzY3JpcHRvcnMgaW4gdGhlCisgKiBkcml2ZXIgYXJlIHRoZSBTTlIgZXhwcmVzc2VkIGluIGRiLgorICoKKyAqIElmIHlvdSBhc3N1bWUgdGhhdCB0aGUgbm9pc2UgZmxvb3IgaXMgLTk1LCB3aGljaCBpcyBhbgorICogZXhjZWxsZW50IGFzc3VtcHRpb24gOTkuNSAlIG9mIHRoZSB0aW1lLCB0aGVuIHlvdSBjYW4KKyAqIGRlcml2ZSB0aGUgYWJzb2x1dGUgc2lnbmFsIGxldmVsIChpLmUuIC05NSArIHJzc2kpLgorICogVGhlcmUgYXJlIHNvbWUgb3RoZXIgc2xpZ2h0IGZhY3RvcnMgdG8gdGFrZSBpbnRvIGFjY291bnQKKyAqIGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoZSByc3NpIG1lYXN1cmVtZW50IGlzIGZyb20gMTFiLAorICogMTFnLCBvciAxMWEuICAgVGhlc2UgZGlmZmVyZW5jZXMgYXJlIGF0IG1vc3QgMmRiIGFuZAorICogY2FuIGJlIGRvY3VtZW50ZWQuCisgKgorICogTkI6IHZhcmlvdXMgY2FsY3VsYXRpb25zIGFyZSBiYXNlZCBvbiB0aGUgb3Jpbm9jby93YXZlbGFuCisgKiAgICAgZHJpdmVycyBmb3IgY29tcGF0aWJpbGl0eQorICovCitzdGF0aWMgdm9pZCBzZXRfcXVhbGl0eShQUlRNUF9BREFQVEVSIHBBZGFwdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGl3X3F1YWxpdHkgKmlxLAorICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmVkIGNoYXIgcnNzaSkKK3sKKwlfX3U4IENoYW5uZWxRdWFsaXR5OworCisJLy8gTm9ybWFsaXplIFJzc2kKKwlpZiAocnNzaSA+PSAtNTApCisJCUNoYW5uZWxRdWFsaXR5ID0gMTAwOworCWVsc2UgaWYgKHJzc2kgPj0gLTgwKSAvLyBiZXR3ZWVuIC01MCB+IC04MGRibQorCQlDaGFubmVsUXVhbGl0eSA9IChfX3U4KSgyNCArICgocnNzaSArIDgwKSAqIDI2KS8xMCk7CisJZWxzZSBpZiAocnNzaSA+PSAtOTApICAgLy8gYmV0d2VlbiAtODAgfiAtOTBkYm0KKyAgICAgICAgQ2hhbm5lbFF1YWxpdHkgPSAoX191OCkoKHJzc2kgKyA5MCkgKiAyNikvMTA7CisJZWxzZQorCQlDaGFubmVsUXVhbGl0eSA9IDA7CisKKyAgICBpcS0+cXVhbCA9IChfX3U4KUNoYW5uZWxRdWFsaXR5OworCisgICAgaXEtPmxldmVsID0gKF9fdTgpKHJzc2kpOworICAgIGlxLT5ub2lzZSA9IChwQWRhcHRlci0+QmJwV3JpdGVMYXRjaFs2Nl0gPiBwQWRhcHRlci0+QmJwVHVuaW5nLkZhbHNlQ2NhVXBwZXJUaHJlc2hvbGQpID8gKChfX3U4KXBBZGFwdGVyLT5CYnBUdW5pbmcuRmFsc2VDY2FVcHBlclRocmVzaG9sZCkgOiAoKF9fdTgpIHBBZGFwdGVyLT5CYnBXcml0ZUxhdGNoWzY2XSk7IAkvLyBub2lzZSBsZXZlbCAoZEJtKQorICAgIGlxLT5ub2lzZSArPSAyNTYgLSAxNDM7CisgICAgaXEtPnVwZGF0ZWQgPSBwQWRhcHRlci0+aXdfc3RhdHMucXVhbC51cGRhdGVkOworfQorCitpbnQgcnRfaW9jdGxfaXdhcGxpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQlzdHJ1Y3QgaXdfcG9pbnQgKmRhdGEsIGNoYXIgKmV4dHJhKQoreworIAlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gZGV2LT5tbF9wcml2OworCisJc3RydWN0IHNvY2thZGRyIGFkZHJbSVdfTUFYX0FQXTsKKwlzdHJ1Y3QgaXdfcXVhbGl0eSBxdWFsW0lXX01BWF9BUF07CisJaW50IGk7CisKKyAgIAkvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgorICAgIGlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKKyAgICB7CisgICAgICAgCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKwkJZGF0YS0+bGVuZ3RoID0gMDsKKwkJcmV0dXJuIDA7CisgICAgICAgIC8vcmV0dXJuIC1FTkVURE9XTjsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDxJV19NQVhfQVAgOyBpKyspCisJeworCQlpZiAoaSA+PSAgcEFkYXB0ZXItPlNjYW5UYWIuQnNzTnIpCisJCQlicmVhazsKKwkJYWRkcltpXS5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7CisJCQltZW1jcHkoYWRkcltpXS5zYV9kYXRhLCAmcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uQnNzaWQsIE1BQ19BRERSX0xFTik7CisJCXNldF9xdWFsaXR5KHBBZGFwdGVyLCAmcXVhbFtpXSwgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uUnNzaSk7CisJfQorCWRhdGEtPmxlbmd0aCA9IGk7CisJbWVtY3B5KGV4dHJhLCAmYWRkciwgaSpzaXplb2YoYWRkclswXSkpOworCWRhdGEtPmZsYWdzID0gMTsJCS8qIHNpZ25hbCBxdWFsaXR5IHByZXNlbnQgKHNvcnQgb2YpICovCisJbWVtY3B5KGV4dHJhICsgaSpzaXplb2YoYWRkclswXSksICZxdWFsLCBpKnNpemVvZihxdWFsW2ldKSk7CisKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIFNJT0NHSVdTQ0FOCitpbnQgcnRfaW9jdGxfc2l3c2NhbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCXN0cnVjdCBpd19wb2ludCAqZGF0YSwgY2hhciAqZXh0cmEpCit7CisJUFJUTVBfQURBUFRFUiBwQWRhcHRlciA9IGRldi0+bWxfcHJpdjsKKworCVVMT05HCQkJCQkJCQlOb3c7CisJaW50IFN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisKKwkvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgorCWlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKwkJcmV0dXJuIC1FTkVURE9XTjsKKwl9CisKKwlpZiAoTU9OSVRPUl9PTihwQWRhcHRlcikpCisgICAgeworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgRHJpdmVyIGlzIGluIE1vbml0b3IgTW9kZSBub3cgISEhXG4iKSk7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworCisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorCWlmIChwQWRhcHRlci0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCA9PSBXUEFfU1VQUExJQ0FOVF9FTkFCTEUpCisJeworCQlwQWRhcHRlci0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRTY2FuQ291bnQrKzsKKwl9CisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCisgICAgcEFkYXB0ZXItPlN0YUNmZy5iU2NhblJlcUlzRnJvbVdlYlVJID0gVFJVRTsKKwlpZiAoUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpKQorCQlyZXR1cm4gMDsKKwlkb3sKKwkJTm93ID0gamlmZmllczsKKworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKwkJaWYgKChwQWRhcHRlci0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCA9PSBXUEFfU1VQUExJQ0FOVF9FTkFCTEUpICYmCisJCQkocEFkYXB0ZXItPlN0YUNmZy5XcGFTdXBwbGljYW50U2NhbkNvdW50ID4gMykpCisJCXsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISBXcGFTdXBwbGljYW50U2NhbkNvdW50ID4gM1xuIikpOworCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKwkJCWJyZWFrOworCQl9CisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCisJCWlmICgoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZGFwdGVyLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCkpICYmCisJCQkoKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKSB8fAorCQkJKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKSkgJiYKKwkJCShwQWRhcHRlci0+U3RhQ2ZnLlBvcnRTZWN1cmVkID09IFdQQV84MDJfMVhfUE9SVF9OT1RfU0VDVVJFRCkpCisJCXsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISBMaW5rIFVQLCBQb3J0IE5vdCBTZWN1cmVkISBpZ25vcmUgdGhpcyBzZXQ6Ok9JRF84MDJfMTFfQlNTSURfTElTVF9TQ0FOXG4iKSk7CisJCQlTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAocEFkYXB0ZXItPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlICE9IENOVExfSURMRSkKKwkJeworCQkJUlQyOFhYX01MTUVfUkVTRVRfU1RBVEVfTUFDSElORShwQWRhcHRlcik7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgTUxNRSBidXN5LCByZXNldCBNTE1FIHN0YXRlIG1hY2hpbmUgISEhXG4iKSk7CisJCX0KKworCQkvLyB0ZWxsIENOVEwgc3RhdGUgbWFjaGluZSB0byBjYWxsIE5kaXNNU2V0SW5mb3JtYXRpb25Db21wbGV0ZSgpIGFmdGVyIGNvbXBsZXRpbmcKKwkJLy8gdGhpcyByZXF1ZXN0LCBiZWNhdXNlIHRoaXMgcmVxdWVzdCBpcyBpbml0aWF0ZWQgYnkgTkRJUy4KKwkJcEFkYXB0ZXItPk1sbWVBdXguQ3VyclJlcUlzRnJvbU5kaXMgPSBGQUxTRTsKKwkJLy8gUmVzZXQgYWxsb3dlZCBzY2FuIHJldHJpZXMKKwkJcEFkYXB0ZXItPlN0YUNmZy5TY2FuQ250ID0gMDsKKwkJcEFkYXB0ZXItPlN0YUNmZy5MYXN0U2NhblRpbWUgPSBOb3c7CisKKwkJTWxtZUVucXVldWUocEFkYXB0ZXIsCisJCQlNTE1FX0NOVExfU1RBVEVfTUFDSElORSwKKwkJCU9JRF84MDJfMTFfQlNTSURfTElTVF9TQ0FOLAorCQkJMCwKKwkJCU5VTEwpOworCisJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisJCVJUMjhYWF9NTE1FX0hBTkRMRVIocEFkYXB0ZXIpOworCX13aGlsZSgwKTsKKwlyZXR1cm4gMDsKK30KKworaW50IHJ0X2lvY3RsX2dpd3NjYW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQlzdHJ1Y3QgaXdfcG9pbnQgKmRhdGEsIGNoYXIgKmV4dHJhKQoreworCisJUFJUTVBfQURBUFRFUiBwQWRhcHRlciA9IGRldi0+bWxfcHJpdjsKKwlpbnQgaT0wOworCWNoYXIgKmN1cnJlbnRfZXYgPSBleHRyYSwgKnByZXZpb3VzX2V2ID0gZXh0cmE7CisJY2hhciAqZW5kX2J1ZjsKKwljaGFyICpjdXJyZW50X3ZhbCwgY3VzdG9tW01BWF9DVVNUT01fTEVOXSA9IHswfTsKKyNpZm5kZWYgSVdFVkdFTklFCisJY2hhciBpZHg7CisjZW5kaWYgLy8gSVdFVkdFTklFIC8vCisJc3RydWN0IGl3X2V2ZW50IGl3ZTsKKworCWlmIChSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUykpCisgICAgeworCQkvKgorCQkgKiBTdGlsbCBzY2FubmluZywgaW5kaWNhdGUgdGhlIGNhbGxlciBzaG91bGQgdHJ5IGFnYWluLgorCQkgKi8KKwkJcmV0dXJuIC1FQUdBSU47CisJfQorCisKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisJaWYgKHBBZGFwdGVyLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQID09IFdQQV9TVVBQTElDQU5UX0VOQUJMRSkKKwl7CisJCXBBZGFwdGVyLT5TdGFDZmcuV3BhU3VwcGxpY2FudFNjYW5Db3VudCA9IDA7CisJfQorI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKworCWlmIChwQWRhcHRlci0+U2NhblRhYi5Cc3NOciA9PSAwKQorCXsKKwkJZGF0YS0+bGVuZ3RoID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCisjaWYgV0lSRUxFU1NfRVhUID49IDE3CisgICAgaWYgKGRhdGEtPmxlbmd0aCA+IDApCisgICAgICAgIGVuZF9idWYgPSBleHRyYSArIGRhdGEtPmxlbmd0aDsKKyAgICBlbHNlCisgICAgICAgIGVuZF9idWYgPSBleHRyYSArIElXX1NDQU5fTUFYX0RBVEE7CisjZWxzZQorICAgIGVuZF9idWYgPSBleHRyYSArIElXX1NDQU5fTUFYX0RBVEE7CisjZW5kaWYKKworCWZvciAoaSA9IDA7IGkgPCBwQWRhcHRlci0+U2NhblRhYi5Cc3NOcjsgaSsrKQorCXsKKwkJaWYgKGN1cnJlbnRfZXYgPj0gZW5kX2J1ZikKKyAgICAgICAgeworI2lmIFdJUkVMRVNTX0VYVCA+PSAxNworICAgICAgICAgICAgcmV0dXJuIC1FMkJJRzsKKyNlbHNlCisJCQlicmVhazsKKyNlbmRpZgorICAgICAgICB9CisKKwkJLy9NQUMgYWRkcmVzcworCQkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJCW1lbXNldCgmaXdlLCAwLCBzaXplb2YoaXdlKSk7CisJCWl3ZS5jbWQgPSBTSU9DR0lXQVA7CisJCWl3ZS51LmFwX2FkZHIuc2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOworCQltZW1jcHkoaXdlLnUuYXBfYWRkci5zYV9kYXRhLCAmcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uQnNzaWQsIEVUSF9BTEVOKTsKKworICAgICAgICBwcmV2aW91c19ldiA9IGN1cnJlbnRfZXY7CisJCWN1cnJlbnRfZXYgPSBJV0VfU1RSRUFNX0FERF9FVkVOVChpbmZvLCBjdXJyZW50X2V2LGVuZF9idWYsICZpd2UsIElXX0VWX0FERFJfTEVOKTsKKyAgICAgICAgaWYgKGN1cnJlbnRfZXYgPT0gcHJldmlvdXNfZXYpCisjaWYgV0lSRUxFU1NfRVhUID49IDE3CisgICAgICAgICAgICByZXR1cm4gLUUyQklHOworI2Vsc2UKKwkJCWJyZWFrOworI2VuZGlmCisKKwkJLy9FU1NJRAorCQkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJCW1lbXNldCgmaXdlLCAwLCBzaXplb2YoaXdlKSk7CisJCWl3ZS5jbWQgPSBTSU9DR0lXRVNTSUQ7CisJCWl3ZS51LmRhdGEubGVuZ3RoID0gcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uU3NpZExlbjsKKwkJaXdlLnUuZGF0YS5mbGFncyA9IDE7CisKKyAgICAgICAgcHJldmlvdXNfZXYgPSBjdXJyZW50X2V2OworCQljdXJyZW50X2V2ID0gSVdFX1NUUkVBTV9BRERfUE9JTlQoaW5mbywgY3VycmVudF9ldixlbmRfYnVmLCAmaXdlLCBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Tc2lkKTsKKyAgICAgICAgaWYgKGN1cnJlbnRfZXYgPT0gcHJldmlvdXNfZXYpCisjaWYgV0lSRUxFU1NfRVhUID49IDE3CisgICAgICAgICAgICByZXR1cm4gLUUyQklHOworI2Vsc2UKKwkJCWJyZWFrOworI2VuZGlmCisKKwkJLy9OZXR3b3JrIFR5cGUKKwkJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCQltZW1zZXQoJml3ZSwgMCwgc2l6ZW9mKGl3ZSkpOworCQlpd2UuY21kID0gU0lPQ0dJV01PREU7CisJCWlmIChwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Cc3NUeXBlID09IE5kaXM4MDJfMTFJQlNTKQorCQl7CisJCQlpd2UudS5tb2RlID0gSVdfTU9ERV9BREhPQzsKKwkJfQorCQllbHNlIGlmIChwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Cc3NUeXBlID09IE5kaXM4MDJfMTFJbmZyYXN0cnVjdHVyZSkKKwkJeworCQkJaXdlLnUubW9kZSA9IElXX01PREVfSU5GUkE7CisJCX0KKwkJZWxzZQorCQl7CisJCQlpd2UudS5tb2RlID0gSVdfTU9ERV9BVVRPOworCQl9CisJCWl3ZS5sZW4gPSBJV19FVl9VSU5UX0xFTjsKKworICAgICAgICBwcmV2aW91c19ldiA9IGN1cnJlbnRfZXY7CisJCWN1cnJlbnRfZXYgPSBJV0VfU1RSRUFNX0FERF9FVkVOVChpbmZvLCBjdXJyZW50X2V2LCBlbmRfYnVmLCAmaXdlLCAgSVdfRVZfVUlOVF9MRU4pOworICAgICAgICBpZiAoY3VycmVudF9ldiA9PSBwcmV2aW91c19ldikKKyNpZiBXSVJFTEVTU19FWFQgPj0gMTcKKyAgICAgICAgICAgIHJldHVybiAtRTJCSUc7CisjZWxzZQorCQkJYnJlYWs7CisjZW5kaWYKKworCQkvL0NoYW5uZWwgYW5kIEZyZXF1ZW5jeQorCQkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJCW1lbXNldCgmaXdlLCAwLCBzaXplb2YoaXdlKSk7CisJCWl3ZS5jbWQgPSBTSU9DR0lXRlJFUTsKKwkJaWYgKElORlJBX09OKHBBZGFwdGVyKSB8fCBBREhPQ19PTihwQWRhcHRlcikpCisJCQlpd2UudS5mcmVxLm0gPSBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5DaGFubmVsOworCQllbHNlCisJCQlpd2UudS5mcmVxLm0gPSBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5DaGFubmVsOworCQlpd2UudS5mcmVxLmUgPSAwOworCQlpd2UudS5mcmVxLmkgPSAwOworCisJCXByZXZpb3VzX2V2ID0gY3VycmVudF9ldjsKKwkJY3VycmVudF9ldiA9IElXRV9TVFJFQU1fQUREX0VWRU5UKGluZm8sIGN1cnJlbnRfZXYsZW5kX2J1ZiwgJml3ZSwgSVdfRVZfRlJFUV9MRU4pOworICAgICAgICBpZiAoY3VycmVudF9ldiA9PSBwcmV2aW91c19ldikKKyNpZiBXSVJFTEVTU19FWFQgPj0gMTcKKyAgICAgICAgICAgIHJldHVybiAtRTJCSUc7CisjZWxzZQorCQkJYnJlYWs7CisjZW5kaWYKKworICAgICAgICAvL0FkZCBxdWFsaXR5IHN0YXRpc3RpY3MKKyAgICAgICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICBtZW1zZXQoJml3ZSwgMCwgc2l6ZW9mKGl3ZSkpOworICAgIAlpd2UuY21kID0gSVdFVlFVQUw7CisgICAgCWl3ZS51LnF1YWwubGV2ZWwgPSAwOworICAgIAlpd2UudS5xdWFsLm5vaXNlID0gMDsKKyAgICAgICAgc2V0X3F1YWxpdHkocEFkYXB0ZXIsICZpd2UudS5xdWFsLCBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Sc3NpKTsKKyAgICAJY3VycmVudF9ldiA9IElXRV9TVFJFQU1fQUREX0VWRU5UKGluZm8sIGN1cnJlbnRfZXYsIGVuZF9idWYsICZpd2UsIElXX0VWX1FVQUxfTEVOKTsKKyAgICAgICAgaWYgKGN1cnJlbnRfZXYgPT0gcHJldmlvdXNfZXYpCisjaWYgV0lSRUxFU1NfRVhUID49IDE3CisgICAgICAgICAgICByZXR1cm4gLUUyQklHOworI2Vsc2UKKwkJCWJyZWFrOworI2VuZGlmCisKKwkJLy9FbmN5cHRpb24ga2V5CisJCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkJbWVtc2V0KCZpd2UsIDAsIHNpemVvZihpd2UpKTsKKwkJaXdlLmNtZCA9IFNJT0NHSVdFTkNPREU7CisJCWlmIChDQVBfSVNfUFJJVkFDWV9PTiAocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uQ2FwYWJpbGl0eUluZm8gKSkKKwkJCWl3ZS51LmRhdGEuZmxhZ3MgPUlXX0VOQ09ERV9FTkFCTEVEIHwgSVdfRU5DT0RFX05PS0VZOworCQllbHNlCisJCQlpd2UudS5kYXRhLmZsYWdzID0gSVdfRU5DT0RFX0RJU0FCTEVEOworCisgICAgICAgIHByZXZpb3VzX2V2ID0gY3VycmVudF9ldjsKKyAgICAgICAgY3VycmVudF9ldiA9IElXRV9TVFJFQU1fQUREX1BPSU5UKGluZm8sIGN1cnJlbnRfZXYsIGVuZF9idWYsJml3ZSwgKGNoYXIgKilwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWyhpd2UudS5kYXRhLmZsYWdzICYgSVdfRU5DT0RFX0lOREVYKS0xXS5LZXkpOworICAgICAgICBpZiAoY3VycmVudF9ldiA9PSBwcmV2aW91c19ldikKKyNpZiBXSVJFTEVTU19FWFQgPj0gMTcKKyAgICAgICAgICAgIHJldHVybiAtRTJCSUc7CisjZWxzZQorCQkJYnJlYWs7CisjZW5kaWYKKworCQkvL0JpdCBSYXRlCisJCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkJaWYgKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlN1cFJhdGVMZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIFVDSEFSIHRtcFJhdGUgPSBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5TdXBSYXRlW3BBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlN1cFJhdGVMZW4tMV07CisJCQltZW1zZXQoJml3ZSwgMCwgc2l6ZW9mKGl3ZSkpOworCQkJaXdlLmNtZCA9IFNJT0NHSVdSQVRFOworICAgIAkJY3VycmVudF92YWwgPSBjdXJyZW50X2V2ICsgSVdfRVZfTENQX0xFTjsKKyAgICAgICAgICAgIGlmICh0bXBSYXRlID09IDB4ODIpCisgICAgICAgICAgICAgICAgaXdlLnUuYml0cmF0ZS52YWx1ZSA9ICAxICogMTAwMDAwMDsKKyAgICAgICAgICAgIGVsc2UgaWYgKHRtcFJhdGUgPT0gMHg4NCkKKyAgICAgICAgICAgICAgICBpd2UudS5iaXRyYXRlLnZhbHVlID0gIDIgKiAxMDAwMDAwOworICAgICAgICAgICAgZWxzZSBpZiAodG1wUmF0ZSA9PSAweDhCKQorICAgICAgICAgICAgICAgIGl3ZS51LmJpdHJhdGUudmFsdWUgPSAgNS41ICogMTAwMDAwMDsKKyAgICAgICAgICAgIGVsc2UgaWYgKHRtcFJhdGUgPT0gMHg5NikKKyAgICAgICAgICAgICAgICBpd2UudS5iaXRyYXRlLnZhbHVlID0gIDExICogMTAwMDAwMDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAJCSAgICBpd2UudS5iaXRyYXRlLnZhbHVlID0gICh0bXBSYXRlLzIpICogMTAwMDAwMDsKKworCQkJaXdlLnUuYml0cmF0ZS5kaXNhYmxlZCA9IDA7CisJCQljdXJyZW50X3ZhbCA9IElXRV9TVFJFQU1fQUREX1ZBTFVFKGluZm8sIGN1cnJlbnRfZXYsCisJCQkJY3VycmVudF92YWwsIGVuZF9idWYsICZpd2UsCisgICAgCQkJSVdfRVZfUEFSQU1fTEVOKTsKKworICAgICAgICAJaWYoKGN1cnJlbnRfdmFsLWN1cnJlbnRfZXYpPklXX0VWX0xDUF9MRU4pCisgICAgICAgICAgICAJY3VycmVudF9ldiA9IGN1cnJlbnRfdmFsOworICAgICAgICAJZWxzZQorI2lmIFdJUkVMRVNTX0VYVCA+PSAxNworICAgICAgICAgICAgICAgIHJldHVybiAtRTJCSUc7CisjZWxzZQorCQkJICAgIGJyZWFrOworI2VuZGlmCisgICAgICAgIH0KKworI2lmZGVmIElXRVZHRU5JRQorCQkvL1dQQSBJRQorCQlpZiAocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uV3BhSUUuSUVMZW4gPiAwKQorCQl7CisJCQltZW1zZXQoJml3ZSwgMCwgc2l6ZW9mKGl3ZSkpOworCQkJbWVtc2V0KCZjdXN0b21bMF0sIDAsIE1BWF9DVVNUT01fTEVOKTsKKwkJCW1lbWNweShjdXN0b20sICYocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uV3BhSUUuSUVbMF0pLAorCQkJCQkJICAgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uV3BhSUUuSUVMZW4pOworCQkJaXdlLmNtZCA9IElXRVZHRU5JRTsKKwkJCWl3ZS51LmRhdGEubGVuZ3RoID0gcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uV3BhSUUuSUVMZW47CisJCQljdXJyZW50X2V2ID0gSVdFX1NUUkVBTV9BRERfUE9JTlQoaW5mbywgY3VycmVudF9ldiwgZW5kX2J1ZiwgJml3ZSwgY3VzdG9tKTsKKwkJCWlmIChjdXJyZW50X2V2ID09IHByZXZpb3VzX2V2KQorI2lmIFdJUkVMRVNTX0VYVCA+PSAxNworICAgICAgICAgICAgICAgIHJldHVybiAtRTJCSUc7CisjZWxzZQorCQkJICAgIGJyZWFrOworI2VuZGlmCisJCX0KKworCQkvL1dQQTIgSUUKKyAgICAgICAgaWYgKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlJzbklFLklFTGVuID4gMCkKKyAgICAgICAgeworICAgICAgICAJbWVtc2V0KCZpd2UsIDAsIHNpemVvZihpd2UpKTsKKwkJCW1lbXNldCgmY3VzdG9tWzBdLCAwLCBNQVhfQ1VTVE9NX0xFTik7CisJCQltZW1jcHkoY3VzdG9tLCAmKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlJzbklFLklFWzBdKSwKKwkJCQkJCSAgIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlJzbklFLklFTGVuKTsKKwkJCWl3ZS5jbWQgPSBJV0VWR0VOSUU7CisJCQlpd2UudS5kYXRhLmxlbmd0aCA9IHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlJzbklFLklFTGVuOworCQkJY3VycmVudF9ldiA9IElXRV9TVFJFQU1fQUREX1BPSU5UKGluZm8sIGN1cnJlbnRfZXYsIGVuZF9idWYsICZpd2UsIGN1c3RvbSk7CisJCQlpZiAoY3VycmVudF9ldiA9PSBwcmV2aW91c19ldikKKyNpZiBXSVJFTEVTU19FWFQgPj0gMTcKKyAgICAgICAgICAgICAgICByZXR1cm4gLUUyQklHOworI2Vsc2UKKwkJCSAgICBicmVhazsKKyNlbmRpZgorICAgICAgICB9CisjZWxzZQorICAgICAgICAvL1dQQSBJRQorCQkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgIGlmIChwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5XcGFJRS5JRUxlbiA+IDApCisgICAgICAgIHsKKyAgICAJCU5kaXNaZXJvTWVtb3J5KCZpd2UsIHNpemVvZihpd2UpKTsKKwkJCW1lbXNldCgmY3VzdG9tWzBdLCAwLCBNQVhfQ1VTVE9NX0xFTik7CisgICAgCQlpd2UuY21kID0gSVdFVkNVU1RPTTsKKyAgICAgICAgICAgIGl3ZS51LmRhdGEubGVuZ3RoID0gKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLldwYUlFLklFTGVuICogMikgKyA3OworICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkoY3VzdG9tLCAid3BhX2llPSIsIDcpOworICAgICAgICAgICAgZm9yIChpZHggPSAwOyBpZHggPCBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5XcGFJRS5JRUxlbjsgaWR4KyspCisgICAgICAgICAgICAgICAgc3ByaW50ZihjdXN0b20sICIlcyUwMngiLCBjdXN0b20sIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLldwYUlFLklFW2lkeF0pOworICAgICAgICAgICAgcHJldmlvdXNfZXYgPSBjdXJyZW50X2V2OworICAgIAkJY3VycmVudF9ldiA9IElXRV9TVFJFQU1fQUREX1BPSU5UKGluZm8sIGN1cnJlbnRfZXYsIGVuZF9idWYsICZpd2UsICBjdXN0b20pOworICAgICAgICAgICAgaWYgKGN1cnJlbnRfZXYgPT0gcHJldmlvdXNfZXYpCisjaWYgV0lSRUxFU1NfRVhUID49IDE3CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FMkJJRzsKKyNlbHNlCisJCQkgICAgYnJlYWs7CisjZW5kaWYKKyAgICAgICAgfQorCisgICAgICAgIC8vV1BBMiBJRQorICAgICAgICBpZiAocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uUnNuSUUuSUVMZW4gPiAwKQorICAgICAgICB7CisgICAgCQlOZGlzWmVyb01lbW9yeSgmaXdlLCBzaXplb2YoaXdlKSk7CisJCQltZW1zZXQoJmN1c3RvbVswXSwgMCwgTUFYX0NVU1RPTV9MRU4pOworICAgIAkJaXdlLmNtZCA9IElXRVZDVVNUT007CisgICAgICAgICAgICBpd2UudS5kYXRhLmxlbmd0aCA9IChwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Sc25JRS5JRUxlbiAqIDIpICsgNzsKKyAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KGN1c3RvbSwgInJzbl9pZT0iLCA3KTsKKwkJCWZvciAoaWR4ID0gMDsgaWR4IDwgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uUnNuSUUuSUVMZW47IGlkeCsrKQorICAgICAgICAgICAgICAgIHNwcmludGYoY3VzdG9tLCAiJXMlMDJ4IiwgY3VzdG9tLCBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Sc25JRS5JRVtpZHhdKTsKKyAgICAgICAgICAgIHByZXZpb3VzX2V2ID0gY3VycmVudF9ldjsKKyAgICAJCWN1cnJlbnRfZXYgPSBJV0VfU1RSRUFNX0FERF9QT0lOVChpbmZvLCBjdXJyZW50X2V2LCBlbmRfYnVmLCAmaXdlLCAgY3VzdG9tKTsKKyAgICAgICAgICAgIGlmIChjdXJyZW50X2V2ID09IHByZXZpb3VzX2V2KQorI2lmIFdJUkVMRVNTX0VYVCA+PSAxNworICAgICAgICAgICAgICAgIHJldHVybiAtRTJCSUc7CisjZWxzZQorCQkJICAgIGJyZWFrOworI2VuZGlmCisgICAgICAgIH0KKyNlbmRpZiAvLyBJV0VWR0VOSUUgLy8KKwl9CisKKwlkYXRhLT5sZW5ndGggPSBjdXJyZW50X2V2IC0gZXh0cmE7CisgICAgcEFkYXB0ZXItPlN0YUNmZy5iU2NhblJlcUlzRnJvbVdlYlVJID0gRkFMU0U7CisJREJHUFJJTlQoUlRfREVCVUdfRVJST1IgLCgiPT09PnJ0X2lvY3RsX2dpd3NjYW4uICVkKCVkKSBCU1MgcmV0dXJuZWQsIGRhdGEtPmxlbmd0aCA9ICVkXG4iLGkgLCBwQWRhcHRlci0+U2NhblRhYi5Cc3NOciwgZGF0YS0+bGVuZ3RoKSk7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworaW50IHJ0X2lvY3RsX3Npd2Vzc2lkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSBzdHJ1Y3QgaXdfcG9pbnQgKmRhdGEsIGNoYXIgKmVzc2lkKQoreworCVBSVE1QX0FEQVBURVIgcEFkYXB0ZXIgPSBkZXYtPm1sX3ByaXY7CisKKwkvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgorICAgIGlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKKyAgICB7CisgICAgICAgCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKyAgICAgICAJcmV0dXJuIC1FTkVURE9XTjsKKyAgICB9CisKKwlpZiAoZGF0YS0+ZmxhZ3MpCisJeworCQlQQ0hBUglwU3NpZFN0cmluZyA9IE5VTEw7CisKKwkJLy8gSW5jbHVkZXMgbnVsbCBjaGFyYWN0ZXIuCisJCWlmIChkYXRhLT5sZW5ndGggPiAoSVdfRVNTSURfTUFYX1NJWkUgKyAxKSkKKwkJCXJldHVybiAtRTJCSUc7CisKKwkJcFNzaWRTdHJpbmcgPSAoQ0hBUiAqKSBrbWFsbG9jKE1BWF9MRU5fT0ZfU1NJRCsxLCBNRU1fQUxMT0NfRkxBRyk7CisJCWlmIChwU3NpZFN0cmluZykKKwkJeworCQkJTmRpc1plcm9NZW1vcnkocFNzaWRTdHJpbmcsIE1BWF9MRU5fT0ZfU1NJRCsxKTsKKwkJCU5kaXNNb3ZlTWVtb3J5KHBTc2lkU3RyaW5nLCBlc3NpZCwgZGF0YS0+bGVuZ3RoKTsKKwkJCWlmIChTZXRfU1NJRF9Qcm9jKHBBZGFwdGVyLCBwU3NpZFN0cmluZykgPT0gRkFMU0UpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJZWxzZQorCQkJcmV0dXJuIC1FTk9NRU07CisJfQorCWVsc2UKKwl7CisJCS8vIEFOWSBzc2lkCisJCWlmIChTZXRfU1NJRF9Qcm9jKHBBZGFwdGVyLCAiIikgPT0gRkFMU0UpCisJCQlyZXR1cm4gLUVJTlZBTDsKKyAgICB9CisJcmV0dXJuIDA7Cit9CisKK2ludCBydF9pb2N0bF9naXdlc3NpZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgc3RydWN0IGl3X3BvaW50ICpkYXRhLCBjaGFyICplc3NpZCkKK3sKKwlQUlRNUF9BREFQVEVSIAlwQWRhcHRlciA9IE5VTEw7CisJVklSVFVBTF9BREFQVEVSICpwVmlydHVhbEFkID0gTlVMTDsKKworCWlmIChkZXYtPnByaXZfZmxhZ3MgPT0gSU5UX01BSU4pCisJeworCQlwQWRhcHRlciA9IGRldi0+bWxfcHJpdjsKKwl9CisJZWxzZQorCXsKKwkJcFZpcnR1YWxBZCA9IGRldi0+bWxfcHJpdjsKKwkJaWYgKHBWaXJ0dWFsQWQgJiYgcFZpcnR1YWxBZC0+UnRtcERldikKKwkJCXBBZGFwdGVyID0gcFZpcnR1YWxBZC0+UnRtcERldi0+bWxfcHJpdjsKKwl9CisKKwlpZiAocEFkYXB0ZXIgPT0gTlVMTCkKKwl7CisJCS8qIGlmIDFzdCBvcGVuIGZhaWwsIHBBZCB3aWxsIGJlIGZyZWU7CisJCSAgIFNvIHRoZSBuZXRfZGV2LT5tbF9wcml2IHdpbGwgYmUgTlVMTCBpbiAycmQgb3BlbiAqLworCQlyZXR1cm4gLUVORVRET1dOOworCX0KKworCWRhdGEtPmZsYWdzID0gMTsKKyAgICBpZiAoTU9OSVRPUl9PTihwQWRhcHRlcikpCisgICAgeworICAgICAgICBkYXRhLT5sZW5ndGggID0gMDsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWRhcHRlciwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UgLCgiTWVkaWFTdGF0ZSBpcyBjb25uZWN0ZWRcbiIpKTsKKwkJZGF0YS0+bGVuZ3RoID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5Tc2lkTGVuOworCQltZW1jcHkoZXNzaWQsIHBBZGFwdGVyLT5Db21tb25DZmcuU3NpZCwgcEFkYXB0ZXItPkNvbW1vbkNmZy5Tc2lkTGVuKTsKKwl9CisJZWxzZQorCXsvL3RoZSBBTlkgc3NpZCB3YXMgc3BlY2lmaWVkCisJCWRhdGEtPmxlbmd0aCAgPSAwOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSAsKCJNZWRpYVN0YXRlIGlzIG5vdCBjb25uZWN0ZWQsIGVzc1xuIikpOworCX0KKworCXJldHVybiAwOworCit9CisKK2ludCBydF9pb2N0bF9zaXduaWNrbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgc3RydWN0IGl3X3BvaW50ICpkYXRhLCBjaGFyICpuaWNrbmFtZSkKK3sKKwlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gZGV2LT5tbF9wcml2OworCisgICAgLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KKyAgICBpZighUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCisgICAgeworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSAsKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisgICAgICAgIHJldHVybiAtRU5FVERPV047CisgICAgfQorCisJaWYgKGRhdGEtPmxlbmd0aCA+IElXX0VTU0lEX01BWF9TSVpFKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW1lbXNldChwQWRhcHRlci0+bmlja25hbWUsIDAsIElXX0VTU0lEX01BWF9TSVpFICsgMSk7CisJbWVtY3B5KHBBZGFwdGVyLT5uaWNrbmFtZSwgbmlja25hbWUsIGRhdGEtPmxlbmd0aCk7CisKKworCXJldHVybiAwOworfQorCitpbnQgcnRfaW9jdGxfZ2l3bmlja24oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJIHN0cnVjdCBpd19wb2ludCAqZGF0YSwgY2hhciAqbmlja25hbWUpCit7CisJUFJUTVBfQURBUFRFUiAJcEFkYXB0ZXIgPSBOVUxMOworCVZJUlRVQUxfQURBUFRFUiAqcFZpcnR1YWxBZCA9IE5VTEw7CisKKwlpZiAoZGV2LT5wcml2X2ZsYWdzID09IElOVF9NQUlOKQorCXsKKwkJcEFkYXB0ZXIgPSBkZXYtPm1sX3ByaXY7CisJfQorCWVsc2UKKwl7CisJCXBWaXJ0dWFsQWQgPSBkZXYtPm1sX3ByaXY7CisJCWlmIChwVmlydHVhbEFkICYmIHBWaXJ0dWFsQWQtPlJ0bXBEZXYpCisJCQlwQWRhcHRlciA9IHBWaXJ0dWFsQWQtPlJ0bXBEZXYtPm1sX3ByaXY7CisJfQorCisJaWYgKHBBZGFwdGVyID09IE5VTEwpCisJeworCQkvKiBpZiAxc3Qgb3BlbiBmYWlsLCBwQWQgd2lsbCBiZSBmcmVlOworCQkgICBTbyB0aGUgbmV0X2Rldi0+bWxfcHJpdiB3aWxsIGJlIE5VTEwgaW4gMnJkIG9wZW4gKi8KKwkJcmV0dXJuIC1FTkVURE9XTjsKKwl9CisKKwlpZiAoZGF0YS0+bGVuZ3RoID4gc3RybGVuKHBBZGFwdGVyLT5uaWNrbmFtZSkgKyAxKQorCQlkYXRhLT5sZW5ndGggPSBzdHJsZW4ocEFkYXB0ZXItPm5pY2tuYW1lKSArIDE7CisJaWYgKGRhdGEtPmxlbmd0aCA+IDApIHsKKwkJbWVtY3B5KG5pY2tuYW1lLCBwQWRhcHRlci0+bmlja25hbWUsIGRhdGEtPmxlbmd0aC0xKTsKKwkJbmlja25hbWVbZGF0YS0+bGVuZ3RoLTFdID0gJ1wwJzsKKwl9CisJcmV0dXJuIDA7Cit9CisKK2ludCBydF9pb2N0bF9zaXdydHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSAgICAgICBzdHJ1Y3QgaXdfcGFyYW0gKnJ0cywgY2hhciAqZXh0cmEpCit7CisJUFJUTVBfQURBUFRFUiBwQWRhcHRlciA9IGRldi0+bWxfcHJpdjsKKwl1MTYgdmFsOworCisgICAgLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KKyAgICBpZighUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCisgICAgeworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisgICAgICAgIHJldHVybiAtRU5FVERPV047CisgICAgfQorCisJaWYgKHJ0cy0+ZGlzYWJsZWQpCisJCXZhbCA9IE1BWF9SVFNfVEhSRVNIT0xEOworCWVsc2UgaWYgKHJ0cy0+dmFsdWUgPCAwIHx8IHJ0cy0+dmFsdWUgPiBNQVhfUlRTX1RIUkVTSE9MRCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJZWxzZSBpZiAocnRzLT52YWx1ZSA9PSAwKQorCSAgICB2YWwgPSBNQVhfUlRTX1RIUkVTSE9MRDsKKwllbHNlCisJCXZhbCA9IHJ0cy0+dmFsdWU7CisKKwlpZiAodmFsICE9IHBBZGFwdGVyLT5Db21tb25DZmcuUnRzVGhyZXNob2xkKQorCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLlJ0c1RocmVzaG9sZCA9IHZhbDsKKworCXJldHVybiAwOworfQorCitpbnQgcnRfaW9jdGxfZ2l3cnRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCSAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgICAgICAgc3RydWN0IGl3X3BhcmFtICpydHMsIGNoYXIgKmV4dHJhKQoreworCVBSVE1QX0FEQVBURVIgCXBBZGFwdGVyID0gTlVMTDsKKwlWSVJUVUFMX0FEQVBURVIgKnBWaXJ0dWFsQWQgPSBOVUxMOworCisJaWYgKGRldi0+cHJpdl9mbGFncyA9PSBJTlRfTUFJTikKKwl7CisJCXBBZGFwdGVyID0gZGV2LT5tbF9wcml2OworCX0KKwllbHNlCisJeworCQlwVmlydHVhbEFkID0gZGV2LT5tbF9wcml2OworCQlpZiAocFZpcnR1YWxBZCAmJiBwVmlydHVhbEFkLT5SdG1wRGV2KQorCQkJcEFkYXB0ZXIgPSBwVmlydHVhbEFkLT5SdG1wRGV2LT5tbF9wcml2OworCX0KKworCWlmIChwQWRhcHRlciA9PSBOVUxMKQorCXsKKwkJLyogaWYgMXN0IG9wZW4gZmFpbCwgcEFkIHdpbGwgYmUgZnJlZTsKKwkJICAgU28gdGhlIG5ldF9kZXYtPm1sX3ByaXYgd2lsbCBiZSBOVUxMIGluIDJyZCBvcGVuICovCisJCXJldHVybiAtRU5FVERPV047CisJfQorCisJLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KKyAgICAJaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQorICAgIAl7CisgICAgICAJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKyAgICAgICAgCXJldHVybiAtRU5FVERPV047CisgICAgCX0KKworCXJ0cy0+dmFsdWUgPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLlJ0c1RocmVzaG9sZDsKKwlydHMtPmRpc2FibGVkID0gKHJ0cy0+dmFsdWUgPT0gTUFYX1JUU19USFJFU0hPTEQpOworCXJ0cy0+Zml4ZWQgPSAxOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBydF9pb2N0bF9zaXdmcmFnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJc3RydWN0IGl3X3BhcmFtICpmcmFnLCBjaGFyICpleHRyYSkKK3sKKwlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gZGV2LT5tbF9wcml2OworCXUxNiB2YWw7CisKKwkvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgorICAgIAlpZighUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCisgICAgCXsKKyAgICAgIAkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOworICAgICAgICAJcmV0dXJuIC1FTkVURE9XTjsKKyAgICAJfQorCisJaWYgKGZyYWctPmRpc2FibGVkKQorCQl2YWwgPSBNQVhfRlJBR19USFJFU0hPTEQ7CisJZWxzZSBpZiAoZnJhZy0+dmFsdWUgPj0gTUlOX0ZSQUdfVEhSRVNIT0xEIHx8IGZyYWctPnZhbHVlIDw9IE1BWF9GUkFHX1RIUkVTSE9MRCkKKyAgICAgICAgdmFsID0gX19jcHVfdG9fbGUxNihmcmFnLT52YWx1ZSAmIH4weDEpOyAvKiBldmVuIG51bWJlcnMgb25seSAqLworCWVsc2UgaWYgKGZyYWctPnZhbHVlID09IDApCisJICAgIHZhbCA9IE1BWF9GUkFHX1RIUkVTSE9MRDsKKwllbHNlCisJCXJldHVybiAtRUlOVkFMOworCisJcEFkYXB0ZXItPkNvbW1vbkNmZy5GcmFnbWVudFRocmVzaG9sZCA9IHZhbDsKKwlyZXR1cm4gMDsKK30KKworaW50IHJ0X2lvY3RsX2dpd2ZyYWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQlzdHJ1Y3QgaXdfcGFyYW0gKmZyYWcsIGNoYXIgKmV4dHJhKQoreworCVBSVE1QX0FEQVBURVIgCXBBZGFwdGVyID0gTlVMTDsKKwlWSVJUVUFMX0FEQVBURVIgKnBWaXJ0dWFsQWQgPSBOVUxMOworCisJaWYgKGRldi0+cHJpdl9mbGFncyA9PSBJTlRfTUFJTikKKwl7CisJCXBBZGFwdGVyID0gZGV2LT5tbF9wcml2OworCX0KKwllbHNlCisJeworCQlwVmlydHVhbEFkID0gZGV2LT5tbF9wcml2OworCQlpZiAocFZpcnR1YWxBZCAmJiBwVmlydHVhbEFkLT5SdG1wRGV2KQorCQkJcEFkYXB0ZXIgPSBwVmlydHVhbEFkLT5SdG1wRGV2LT5tbF9wcml2OworCX0KKworCWlmIChwQWRhcHRlciA9PSBOVUxMKQorCXsKKwkJLyogaWYgMXN0IG9wZW4gZmFpbCwgcEFkIHdpbGwgYmUgZnJlZTsKKwkJICAgU28gdGhlIG5ldF9kZXYtPm1sX3ByaXYgd2lsbCBiZSBOVUxMIGluIDJyZCBvcGVuICovCisJCXJldHVybiAtRU5FVERPV047CisJfQorCisJLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KKyAgICAJaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQorICAgIAl7CisgICAgICAJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKyAgICAgICAgCXJldHVybiAtRU5FVERPV047CisgICAgCX0KKworCWZyYWctPnZhbHVlID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5GcmFnbWVudFRocmVzaG9sZDsKKwlmcmFnLT5kaXNhYmxlZCA9IChmcmFnLT52YWx1ZSA9PSBNQVhfRlJBR19USFJFU0hPTEQpOworCWZyYWctPmZpeGVkID0gMTsKKworCXJldHVybiAwOworfQorCisjZGVmaW5lIE1BWF9XRVBfS0VZX1NJWkUgMTMKKyNkZWZpbmUgTUlOX1dFUF9LRVlfU0laRSA1CitpbnQgcnRfaW9jdGxfc2l3ZW5jb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgIHN0cnVjdCBpd19wb2ludCAqZXJxLCBjaGFyICpleHRyYSkKK3sKKwlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gZGV2LT5tbF9wcml2OworCisJLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KKyAgICAJaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQorICAgIAl7CisgICAgICAJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKyAgICAgICAgCXJldHVybiAtRU5FVERPV047CisgICAgCX0KKworCWlmICgoZXJxLT5sZW5ndGggPT0gMCkgJiYKKyAgICAgICAgKGVycS0+ZmxhZ3MgJiBJV19FTkNPREVfRElTQUJMRUQpKQorCXsKKwkJcEFkYXB0ZXItPlN0YUNmZy5QYWlyQ2lwaGVyID0gTmRpczgwMl8xMVdFUERpc2FibGVkOworCQlwQWRhcHRlci0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID0gTmRpczgwMl8xMVdFUERpc2FibGVkOworCQlwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cyA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5PcmlnV2VwU3RhdHVzID0gcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXM7CisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVPcGVuOworICAgICAgICBnb3RvIGRvbmU7CisJfQorCWVsc2UgaWYgKChlcnEtPmxlbmd0aCA9PSAwKSAmJgorICAgICAgICAgICAgIChlcnEtPmZsYWdzICYgSVdfRU5DT0RFX1JFU1RSSUNURUQgfHwgZXJxLT5mbGFncyAmIElXX0VOQ09ERV9PUEVOKSkKKwl7CisJCVNUQV9QT1JUX1NFQ1VSRUQocEFkYXB0ZXIpOworCQlwQWRhcHRlci0+U3RhQ2ZnLlBhaXJDaXBoZXIgPSBOZGlzODAyXzExV0VQRW5hYmxlZDsKKwkJcEFkYXB0ZXItPlN0YUNmZy5Hcm91cENpcGhlciA9IE5kaXM4MDJfMTFXRVBFbmFibGVkOworCQlwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cyA9IE5kaXM4MDJfMTFXRVBFbmFibGVkOworICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLk9yaWdXZXBTdGF0dXMgPSBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1czsKKwkJaWYgKGVycS0+ZmxhZ3MgJiBJV19FTkNPREVfUkVTVFJJQ1RFRCkKKwkJCXBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVTaGFyZWQ7CisgICAgCWVsc2UKKwkJCXBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVPcGVuOworICAgICAgICBnb3RvIGRvbmU7CisJfQorCisgICAgaWYgKGVycS0+bGVuZ3RoID4gMCkKKwl7CisJCWludCBrZXlJZHggPSAoZXJxLT5mbGFncyAmIElXX0VOQ09ERV9JTkRFWCkgLSAxOworCQkvKiBDaGVjayB0aGUgc2l6ZSBvZiB0aGUga2V5ICovCisJCWlmIChlcnEtPmxlbmd0aCA+IE1BWF9XRVBfS0VZX1NJWkUpIHsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCS8qIENoZWNrIGtleSBpbmRleCAqLworCQlpZiAoKGtleUlkeCA8IDApIHx8IChrZXlJZHggPj0gTlJfV0VQX0tFWVMpKQorICAgICAgICB7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSAsKCI9PT5ydF9pb2N0bF9zaXdlbmNvZGU6Oldyb25nIGtleUlkeD0lZCEgVXNpbmcgZGVmYXVsdCBrZXkgaW5zdGVhZCAoJWQpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleUlkeCwgcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWQpKTsKKworICAgICAgICAgICAgLy9Vc2luZyBkZWZhdWx0IGtleQorCQkJa2V5SWR4ID0gcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWQ7CisgICAgICAgIH0KKworICAgICAgICBOZGlzWmVyb01lbW9yeShwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uS2V5LCAgMTYpOworCisJCWlmIChlcnEtPmxlbmd0aCA9PSBNQVhfV0VQX0tFWV9TSVpFKQorICAgICAgICB7CisJCQlwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uS2V5TGVuID0gTUFYX1dFUF9LRVlfU0laRTsKKyAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5DaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OworCQl9CisJCWVsc2UgaWYgKGVycS0+bGVuZ3RoID09IE1JTl9XRVBfS0VZX1NJWkUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5LZXlMZW4gPSBNSU5fV0VQX0tFWV9TSVpFOworICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLkNpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKKwkJfQorCQllbHNlCisJCQkvKiBEaXNhYmxlIHRoZSBrZXkgKi8KKwkJCXBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5LZXlMZW4gPSAwOworCisJCS8qIENoZWNrIGlmIHRoZSBrZXkgaXMgbm90IG1hcmtlZCBhcyBpbnZhbGlkICovCisJCWlmKCEoZXJxLT5mbGFncyAmIElXX0VOQ09ERV9OT0tFWSkpIHsKKwkJCS8qIENvcHkgdGhlIGtleSBpbiB0aGUgZHJpdmVyICovCisJCQlOZGlzTW92ZU1lbW9yeShwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uS2V5LCBleHRyYSwgZXJxLT5sZW5ndGgpOworICAgICAgICB9CisJfQorICAgIGVsc2UKKwkJCXsKKwkJLyogRG8gd2Ugd2FudCB0byBqdXN0IHNldCB0aGUgdHJhbnNtaXQga2V5IGluZGV4ID8gKi8KKwkJaW50IGluZGV4ID0gKGVycS0+ZmxhZ3MgJiBJV19FTkNPREVfSU5ERVgpIC0gMTsKKwkJaWYgKChpbmRleCA+PSAwKSAmJiAoaW5kZXggPCA0KSkKKyAgICAgICAgeworCQkJcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWQgPSBpbmRleDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgZWxzZQorCQkJLyogRG9uJ3QgY29tcGxhaW4gaWYgb25seSBjaGFuZ2UgdGhlIG1vZGUgKi8KKwkJCWlmKCFlcnEtPmZsYWdzICYgSVdfRU5DT0RFX01PREUpIHsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0KKworZG9uZToKKyAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSAsKCI9PT5ydF9pb2N0bF9zaXdlbmNvZGU6OmVycS0+ZmxhZ3M9JXhcbiIsZXJxLT5mbGFncykpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoIj09PnJ0X2lvY3RsX3Npd2VuY29kZTo6QXV0aE1vZGU9JXhcbiIscEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSkpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoIj09PnJ0X2lvY3RsX3Npd2VuY29kZTo6RGVmYXVsdEtleUlkPSV4LCBLZXlMZW4gPSAlZFxuIixwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCAsIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWRdLktleUxlbikpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoIj09PnJ0X2lvY3RsX3Npd2VuY29kZTo6V2VwU3RhdHVzPSV4XG4iLHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzKSk7CisJcmV0dXJuIDA7Cit9CisKK2ludAorcnRfaW9jdGxfZ2l3ZW5jb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgIHN0cnVjdCBpd19wb2ludCAqZXJxLCBjaGFyICprZXkpCit7CisJaW50IGtpZDsKKwlQUlRNUF9BREFQVEVSIAlwQWRhcHRlciA9IE5VTEw7CisJVklSVFVBTF9BREFQVEVSICpwVmlydHVhbEFkID0gTlVMTDsKKworCWlmIChkZXYtPnByaXZfZmxhZ3MgPT0gSU5UX01BSU4pCisJeworCQlwQWRhcHRlciA9IGRldi0+bWxfcHJpdjsKKwl9CisJZWxzZQorCXsKKwkJcFZpcnR1YWxBZCA9IGRldi0+bWxfcHJpdjsKKwkJaWYgKHBWaXJ0dWFsQWQgJiYgcFZpcnR1YWxBZC0+UnRtcERldikKKwkJCXBBZGFwdGVyID0gcFZpcnR1YWxBZC0+UnRtcERldi0+bWxfcHJpdjsKKwl9CisKKwlpZiAocEFkYXB0ZXIgPT0gTlVMTCkKKwl7CisJCS8qIGlmIDFzdCBvcGVuIGZhaWwsIHBBZCB3aWxsIGJlIGZyZWU7CisJCSAgIFNvIHRoZSBuZXRfZGV2LT5tbF9wcml2IHdpbGwgYmUgTlVMTCBpbiAycmQgb3BlbiAqLworCQlyZXR1cm4gLUVORVRET1dOOworCX0KKworCS8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCisJaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQorCXsKKyAgCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisgICAgCXJldHVybiAtRU5FVERPV047CisJfQorCisJa2lkID0gZXJxLT5mbGFncyAmIElXX0VOQ09ERV9JTkRFWDsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT0+cnRfaW9jdGxfZ2l3ZW5jb2RlICVkXG4iLCBlcnEtPmZsYWdzICYgSVdfRU5DT0RFX0lOREVYKSk7CisKKwlpZiAocEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMVdFUERpc2FibGVkKQorCXsKKwkJZXJxLT5sZW5ndGggPSAwOworCQllcnEtPmZsYWdzID0gSVdfRU5DT0RFX0RJU0FCTEVEOworCX0KKwllbHNlIGlmICgoa2lkID4gMCkgJiYgKGtpZCA8PTQpKQorCXsKKwkJLy8gY29weSB3ZXAga2V5CisJCWVycS0+ZmxhZ3MgPSBraWQgOwkJCS8qIE5COiBiYXNlIDEgKi8KKwkJaWYgKGVycS0+bGVuZ3RoID4gcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtraWQtMV0uS2V5TGVuKQorCQkJZXJxLT5sZW5ndGggPSBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tpZC0xXS5LZXlMZW47CisJCW1lbWNweShrZXksIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2lkLTFdLktleSwgZXJxLT5sZW5ndGgpOworCQkvL2lmICgoa2lkID09IHBBZGFwdGVyLT5Qb3J0Q2ZnLkRlZmF1bHRLZXlJZCkpCisJCS8vZXJxLT5mbGFncyB8PSBJV19FTkNPREVfRU5BQkxFRDsJLyogWFhYICovCisJCWlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVNoYXJlZCkKKwkJCWVycS0+ZmxhZ3MgfD0gSVdfRU5DT0RFX1JFU1RSSUNURUQ7CQkvKiBYWFggKi8KKwkJZWxzZQorCQkJZXJxLT5mbGFncyB8PSBJV19FTkNPREVfT1BFTjsJCS8qIFhYWCAqLworCisJfQorCWVsc2UgaWYgKGtpZCA9PSAwKQorCXsKKwkJaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlU2hhcmVkKQorCQkJZXJxLT5mbGFncyB8PSBJV19FTkNPREVfUkVTVFJJQ1RFRDsJCS8qIFhYWCAqLworCQllbHNlCisJCQllcnEtPmZsYWdzIHw9IElXX0VOQ09ERV9PUEVOOwkJLyogWFhYICovCisJCWVycS0+bGVuZ3RoID0gcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uS2V5TGVuOworCQltZW1jcHkoa2V5LCBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW3BBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5LZXksIGVycS0+bGVuZ3RoKTsKKwkJLy8gY29weSBkZWZhdWx0IGtleSBJRAorCQlpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVTaGFyZWQpCisJCQllcnEtPmZsYWdzIHw9IElXX0VOQ09ERV9SRVNUUklDVEVEOwkJLyogWFhYICovCisJCWVsc2UKKwkJCWVycS0+ZmxhZ3MgfD0gSVdfRU5DT0RFX09QRU47CQkvKiBYWFggKi8KKwkJZXJxLT5mbGFncyA9IHBBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkICsgMTsJCQkvKiBOQjogYmFzZSAxICovCisJCWVycS0+ZmxhZ3MgfD0gSVdfRU5DT0RFX0VOQUJMRUQ7CS8qIFhYWCAqLworCX0KKworCXJldHVybiAwOworCit9CisKK3N0YXRpYyBpbnQKK3J0X2lvY3RsX3NldHBhcmFtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgdm9pZCAqdywgY2hhciAqZXh0cmEpCit7CisgICAgVklSVFVBTF9BREFQVEVSCSpwVmlydHVhbEFkID0gTlVMTDsKKwlQUlRNUF9BREFQVEVSIHBBZGFwdGVyOworCVBPU19DT09LSUUgcE9iajsKKwljaGFyICp0aGlzX2NoYXIgPSBleHRyYTsKKwljaGFyICp2YWx1ZTsKKwlpbnQgIFN0YXR1cz0wOworCisJaWYgKGRldi0+cHJpdl9mbGFncyA9PSBJTlRfTUFJTikKKwl7CisJCXBBZGFwdGVyID0gZGV2LT5tbF9wcml2OworCX0KKwllbHNlCisJeworCQlwVmlydHVhbEFkID0gZGV2LT5tbF9wcml2OworCQlwQWRhcHRlciA9IHBWaXJ0dWFsQWQtPlJ0bXBEZXYtPm1sX3ByaXY7CisJfQorCXBPYmogPSAoUE9TX0NPT0tJRSkgcEFkYXB0ZXItPk9TX0Nvb2tpZTsKKworCWlmIChwQWRhcHRlciA9PSBOVUxMKQorCXsKKwkJLyogaWYgMXN0IG9wZW4gZmFpbCwgcEFkIHdpbGwgYmUgZnJlZTsKKwkJICAgU28gdGhlIG5ldF9kZXYtPm1sX3ByaXYgd2lsbCBiZSBOVUxMIGluIDJyZCBvcGVuICovCisJCXJldHVybiAtRU5FVERPV047CisJfQorCisJeworCQlwT2JqLT5pb2N0bF9pZl90eXBlID0gSU5UX01BSU47CisgICAgICAgIHBPYmotPmlvY3RsX2lmID0gTUFJTl9NQlNTSUQ7CisJfQorCisJLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KKyAgICAJaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQorICAgIAl7CisgICAgICAJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKwkJCXJldHVybiAtRU5FVERPV047CisgICAgCX0KKworCWlmICghKnRoaXNfY2hhcikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoKHZhbHVlID0gcnRzdHJjaHIodGhpc19jaGFyLCAnPScpKSAhPSBOVUxMKQorCSAgICAqdmFsdWUrKyA9IDA7CisKKwlpZiAoIXZhbHVlKQorCSAgICByZXR1cm4gLUVJTlZBTDsKKworCS8vIHJlamVjdCBzZXR0aW5nIG5vdGhpbmcgYmVzaWRlcyBBTlkgc3NpZChzc2lkTGVuPTApCisgICAgaWYgKCEqdmFsdWUgJiYgKHN0cmNtcCh0aGlzX2NoYXIsICJTU0lEIikgIT0gMCkpCisgICAgICAgIHJldHVybiAtRUlOVkFMOworCisJZm9yIChQUlRNUF9QUklWQVRFX1NFVF9QUk9DID0gUlRNUF9QUklWQVRFX1NVUFBPUlRfUFJPQzsgUFJUTVBfUFJJVkFURV9TRVRfUFJPQy0+bmFtZTsgUFJUTVBfUFJJVkFURV9TRVRfUFJPQysrKQorCXsKKwkgICAgaWYgKHN0cmNtcCh0aGlzX2NoYXIsIFBSVE1QX1BSSVZBVEVfU0VUX1BST0MtPm5hbWUpID09IDApCisJICAgIHsKKwkgICAgICAgIGlmKCFQUlRNUF9QUklWQVRFX1NFVF9QUk9DLT5zZXRfcHJvYyhwQWRhcHRlciwgdmFsdWUpKQorCSAgICAgICAgewkvL0ZBTFNFOlNldCBwcml2YXRlIGZhaWxlZCB0aGVuIHJldHVybiBJbnZhbGlkIGFyZ3VtZW50CisJCQkgICAgU3RhdHVzID0gLUVJTlZBTDsKKwkgICAgICAgIH0KKwkJICAgIGJyZWFrOwkvL0V4aXQgZm9yIGxvb3AuCisJICAgIH0KKwl9CisKKwlpZihQUlRNUF9QUklWQVRFX1NFVF9QUk9DLT5uYW1lID09IE5VTEwpCisJeyAgLy9Ob3QgZm91bmQgYXJndW1lbnQKKwkgICAgU3RhdHVzID0gLUVJTlZBTDsKKwkgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PnJ0X2lvY3RsX3NldHBhcmFtOjogKGl3cHJpdikgTm90IFN1cHBvcnQgU2V0IENvbW1hbmQgWyVzPSVzXVxuIiwgdGhpc19jaGFyLCB2YWx1ZSkpOworCX0KKworICAgIHJldHVybiBTdGF0dXM7Cit9CisKKworc3RhdGljIGludAorcnRfcHJpdmF0ZV9nZXRfc3RhdGlzdGljcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQlzdHJ1Y3QgaXdfcG9pbnQgKndycSwgY2hhciAqZXh0cmEpCit7CisJSU5UCQkJCVN0YXR1cyA9IDA7CisgICAgUFJUTVBfQURBUFRFUiAgIHBBZCA9IGRldi0+bWxfcHJpdjsKKworICAgIGlmIChleHRyYSA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgd3JxLT5sZW5ndGggPSAwOworICAgICAgICByZXR1cm4gLUVJTzsKKyAgICB9CisKKyAgICBtZW1zZXQoZXh0cmEsIDB4MDAsIElXX1BSSVZfU0laRV9NQVNLKTsKKyAgICBzcHJpbnRmKGV4dHJhLCAiXG5cbiIpOworCisjaWZkZWYgUkFMSU5LX0FURQorCWlmIChBVEVfT04ocEFkKSkKKwl7CisJICAgIHNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlR4IHN1Y2Nlc3MgICAgICAgICAgICAgICAgICAgICAgPSAlbGRcbiIsIChVTE9ORylwQWQtPmF0ZS5UeERvbmVDb3VudCk7CisJICAgIC8vc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiVHggc3VjY2VzcyB3aXRob3V0IHJldHJ5ICAgICAgICA9ICVsZFxuIiwgKFVMT05HKXBBZC0+YXRlLlR4RG9uZUNvdW50KTsKKwl9CisJZWxzZQorI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKwl7CisgICAgc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiVHggc3VjY2VzcyAgICAgICAgICAgICAgICAgICAgICA9ICVsZFxuIiwgKFVMT05HKXBBZC0+V2xhbkNvdW50ZXJzLlRyYW5zbWl0dGVkRnJhZ21lbnRDb3VudC5RdWFkUGFydCk7CisgICAgc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiVHggc3VjY2VzcyB3aXRob3V0IHJldHJ5ICAgICAgICA9ICVsZFxuIiwgKFVMT05HKXBBZC0+V2xhbkNvdW50ZXJzLlRyYW5zbWl0dGVkRnJhZ21lbnRDb3VudC5RdWFkUGFydCAtIChVTE9ORylwQWQtPldsYW5Db3VudGVycy5SZXRyeUNvdW50LlF1YWRQYXJ0KTsKKwl9CisgICAgc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiVHggc3VjY2VzcyBhZnRlciByZXRyeSAgICAgICAgICA9ICVsZFxuIiwgKFVMT05HKXBBZC0+V2xhbkNvdW50ZXJzLlJldHJ5Q291bnQuUXVhZFBhcnQpOworICAgIHNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlR4IGZhaWwgdG8gUmN2IEFDSyBhZnRlciByZXRyeSAgPSAlbGRcbiIsIChVTE9ORylwQWQtPldsYW5Db3VudGVycy5GYWlsZWRDb3VudC5RdWFkUGFydCk7CisgICAgc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiUlRTIFN1Y2Nlc3MgUmN2IENUUyAgICAgICAgICAgICA9ICVsZFxuIiwgKFVMT05HKXBBZC0+V2xhbkNvdW50ZXJzLlJUU1N1Y2Nlc3NDb3VudC5RdWFkUGFydCk7CisgICAgc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiUlRTIEZhaWwgUmN2IENUUyAgICAgICAgICAgICAgICA9ICVsZFxuIiwgKFVMT05HKXBBZC0+V2xhbkNvdW50ZXJzLlJUU0ZhaWx1cmVDb3VudC5RdWFkUGFydCk7CisKKyAgICBzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJSeCBzdWNjZXNzICAgICAgICAgICAgICAgICAgICAgID0gJWxkXG4iLCAoVUxPTkcpcEFkLT5XbGFuQ291bnRlcnMuUmVjZWl2ZWRGcmFnbWVudENvdW50LlF1YWRQYXJ0KTsKKyAgICBzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJSeCB3aXRoIENSQyAgICAgICAgICAgICAgICAgICAgID0gJWxkXG4iLCAoVUxPTkcpcEFkLT5XbGFuQ291bnRlcnMuRkNTRXJyb3JDb3VudC5RdWFkUGFydCk7CisgICAgc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiUnggZHJvcCBkdWUgdG8gb3V0IG9mIHJlc291cmNlICA9ICVsZFxuIiwgKFVMT05HKXBBZC0+Q291bnRlcnM4MDIzLlJ4Tm9CdWZmZXIpOworICAgIHNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlJ4IGR1cGxpY2F0ZSBmcmFtZSAgICAgICAgICAgICAgPSAlbGRcbiIsIChVTE9ORylwQWQtPldsYW5Db3VudGVycy5GcmFtZUR1cGxpY2F0ZUNvdW50LlF1YWRQYXJ0KTsKKworICAgIHNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIkZhbHNlIENDQSAob25lIHNlY29uZCkgICAgICAgICAgPSAlbGRcbiIsIChVTE9ORylwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY0ZhbHNlQ0NBQ250KTsKKyNpZmRlZiBSQUxJTktfQVRFCisJaWYgKEFURV9PTihwQWQpKQorCXsKKwkJaWYgKHBBZC0+YXRlLlJ4QW50ZW5uYVNlbCA9PSAwKQorCQl7CisgICAgCQlzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJSU1NJLUEgICAgICAgICAgICAgICAgICAgICAgICAgID0gJWxkXG4iLCAoTE9ORykocEFkLT5hdGUuTGFzdFJzc2kwIC0gcEFkLT5CYnBSc3NpVG9EYm1EZWx0YSkpOworCQkJc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiUlNTSS1CIChpZiBhdmFpbGFibGUpICAgICAgICAgICA9ICVsZFxuIiwgKExPTkcpKHBBZC0+YXRlLkxhc3RSc3NpMSAtIHBBZC0+QmJwUnNzaVRvRGJtRGVsdGEpKTsKKwkJCXNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlJTU0ktQyAoaWYgYXZhaWxhYmxlKSAgICAgICAgICAgPSAlbGRcblxuIiwgKExPTkcpKHBBZC0+YXRlLkxhc3RSc3NpMiAtIHBBZC0+QmJwUnNzaVRvRGJtRGVsdGEpKTsKKwkJfQorCQllbHNlCisJCXsKKyAgICAJCXNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlJTU0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAlbGRcbiIsIChMT05HKShwQWQtPmF0ZS5MYXN0UnNzaTAgLSBwQWQtPkJicFJzc2lUb0RibURlbHRhKSk7CisJCX0KKwl9CisJZWxzZQorI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKwl7CisgICAgCXNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlJTU0ktQSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAlbGRcbiIsIChMT05HKShwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMCAtIHBBZC0+QmJwUnNzaVRvRGJtRGVsdGEpKTsKKyAgICAgICAgc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiUlNTSS1CIChpZiBhdmFpbGFibGUpICAgICAgICAgICA9ICVsZFxuIiwgKExPTkcpKHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kxIC0gcEFkLT5CYnBSc3NpVG9EYm1EZWx0YSkpOworICAgICAgICBzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJSU1NJLUMgKGlmIGF2YWlsYWJsZSkgICAgICAgICAgID0gJWxkXG5cbiIsIChMT05HKShwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMiAtIHBBZC0+QmJwUnNzaVRvRGJtRGVsdGEpKTsKKwl9CisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgIHNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIldwYVN1cHBsaWNhbnRVUCAgICAgICAgICAgICAgICAgPSAlZFxuXG4iLCBwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVApOworI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKworCisgICAgd3JxLT5sZW5ndGggPSBzdHJsZW4oZXh0cmEpICsgMTsgLy8gMTogc2l6ZSBvZiAnXDAnCisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPD09IHJ0X3ByaXZhdGVfZ2V0X3N0YXRpc3RpY3MsIHdycS0+bGVuZ3RoID0gJWRcbiIsIHdycS0+bGVuZ3RoKSk7CisKKyAgICByZXR1cm4gU3RhdHVzOworfQorCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCit2b2lkCWdldEJhSW5mbygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlwT3V0QnVmKQoreworCUlOVCBpLCBqOworCUJBX09SSV9FTlRSWSAqcE9yaUJBRW50cnk7CisJQkFfUkVDX0VOVFJZICpwUmVjQkFFbnRyeTsKKworCWZvciAoaT0wOyBpPE1BWF9MRU5fT0ZfTUFDX1RBQkxFOyBpKyspCisJeworCQlQTUFDX1RBQkxFX0VOVFJZIHBFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W2ldOworCQlpZiAoKChwRW50cnktPlZhbGlkQXNDTEkgfHwgcEVudHJ5LT5WYWxpZEFzQXBDbGkpICYmIChwRW50cnktPlNzdCA9PSBTU1RfQVNTT0MpKQorCQkJfHwgKHBFbnRyeS0+VmFsaWRBc1dEUykgfHwgKHBFbnRyeS0+VmFsaWRBc01lc2gpKQorCQl7CisJCQlzcHJpbnRmKHBPdXRCdWYsICIlc1xuJTAyWDolMDJYOiUwMlg6JTAyWDolMDJYOiUwMlggKEFpZCA9ICVkKSAoQVApIC1cbiIsCisgICAgICAgICAgICAgICAgcE91dEJ1ZiwKKwkJCQlwRW50cnktPkFkZHJbMF0sIHBFbnRyeS0+QWRkclsxXSwgcEVudHJ5LT5BZGRyWzJdLAorCQkJCXBFbnRyeS0+QWRkclszXSwgcEVudHJ5LT5BZGRyWzRdLCBwRW50cnktPkFkZHJbNV0sIHBFbnRyeS0+QWlkKTsKKworCQkJc3ByaW50ZihwT3V0QnVmLCAiJXNbUmVjaXBpZW50XVxuIiwgcE91dEJ1Zik7CisJCQlmb3IgKGo9MDsgaiA8IE5VTV9PRl9USUQ7IGorKykKKwkJCXsKKwkJCQlpZiAocEVudHJ5LT5CQVJlY1djaWRBcnJheVtqXSAhPSAwKQorCQkJCXsKKwkJCQkJcFJlY0JBRW50cnkgPSZwQWQtPkJBVGFibGUuQkFSZWNFbnRyeVtwRW50cnktPkJBUmVjV2NpZEFycmF5W2pdXTsKKwkJCQkJc3ByaW50ZihwT3V0QnVmLCAiJXNUSUQ9JWQsIEJBV2luU2l6ZT0lZCwgTGFzdEluZFNlcT0lZCwgUmVvcmRlcmluZ1BrdHM9JWRcbiIsIHBPdXRCdWYsIGosIHBSZWNCQUVudHJ5LT5CQVdpblNpemUsIHBSZWNCQUVudHJ5LT5MYXN0SW5kU2VxLCBwUmVjQkFFbnRyeS0+bGlzdC5xbGVuKTsKKwkJCQl9CisJCQl9CisJCQlzcHJpbnRmKHBPdXRCdWYsICIlc1xuIiwgcE91dEJ1Zik7CisKKwkJCXNwcmludGYocE91dEJ1ZiwgIiVzW09yaWdpbmF0b3JdXG4iLCBwT3V0QnVmKTsKKwkJCWZvciAoaj0wOyBqIDwgTlVNX09GX1RJRDsgaisrKQorCQkJeworCQkJCWlmIChwRW50cnktPkJBT3JpV2NpZEFycmF5W2pdICE9IDApCisJCQkJeworCQkJCQlwT3JpQkFFbnRyeSA9JnBBZC0+QkFUYWJsZS5CQU9yaUVudHJ5W3BFbnRyeS0+QkFPcmlXY2lkQXJyYXlbal1dOworCQkJCQlzcHJpbnRmKHBPdXRCdWYsICIlc1RJRD0lZCwgQkFXaW5TaXplPSVkLCBTdGFydFNlcT0lZCwgQ3VyVHhTZXE9JWRcbiIsIHBPdXRCdWYsIGosIHBPcmlCQUVudHJ5LT5CQVdpblNpemUsIHBPcmlCQUVudHJ5LT5TZXF1ZW5jZSwgcEVudHJ5LT5UeFNlcVtqXSk7CisJCQkJfQorCQkJfQorCQkJc3ByaW50ZihwT3V0QnVmLCAiJXNcblxuIiwgcE91dEJ1Zik7CisJCX0KKyAgICAgICAgaWYgKHN0cmxlbihwT3V0QnVmKSA+IChJV19QUklWX1NJWkVfTUFTSyAtIDMwKSkKKyAgICAgICAgICAgICAgICBicmVhazsKKwl9CisKKwlyZXR1cm47Cit9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKK3N0YXRpYyBpbnQKK3J0X3ByaXZhdGVfc2hvdyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQlzdHJ1Y3QgaXdfcG9pbnQgKndycSwgY2hhciAqZXh0cmEpCit7CisgICAgSU5UCQkJCVN0YXR1cyA9IDA7CisgICAgVklSVFVBTF9BREFQVEVSCSpwVmlydHVhbEFkID0gTlVMTDsKKyAgICBQUlRNUF9BREFQVEVSICAgcEFkOworCVBPU19DT09LSUUJCXBPYmo7CisgICAgdTMyICAgICAgICAgICAgIHN1YmNtZCA9IHdycS0+ZmxhZ3M7CisKKwlpZiAoZGV2LT5wcml2X2ZsYWdzID09IElOVF9NQUlOKQorCQlwQWQgPSBkZXYtPm1sX3ByaXY7CisJZWxzZQorCXsKKwkJcFZpcnR1YWxBZCA9IGRldi0+bWxfcHJpdjsKKwkJcEFkID0gcFZpcnR1YWxBZC0+UnRtcERldi0+bWxfcHJpdjsKKwl9CisJcE9iaiA9IChQT1NfQ09PS0lFKSBwQWQtPk9TX0Nvb2tpZTsKKworCWlmIChwQWQgPT0gTlVMTCkKKwl7CisJCS8qIGlmIDFzdCBvcGVuIGZhaWwsIHBBZCB3aWxsIGJlIGZyZWU7CisJCSAgIFNvIHRoZSBuZXRfZGV2LT5tbF9wcml2IHdpbGwgYmUgTlVMTCBpbiAycmQgb3BlbiAqLworCQlyZXR1cm4gLUVORVRET1dOOworCX0KKworICAgIGlmIChleHRyYSA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgd3JxLT5sZW5ndGggPSAwOworICAgICAgICByZXR1cm4gLUVJTzsKKyAgICB9CisgICAgbWVtc2V0KGV4dHJhLCAweDAwLCBJV19QUklWX1NJWkVfTUFTSyk7CisKKwl7CisJCXBPYmotPmlvY3RsX2lmX3R5cGUgPSBJTlRfTUFJTjsKKyAgICAgICAgcE9iai0+aW9jdGxfaWYgPSBNQUlOX01CU1NJRDsKKwl9CisKKyAgICBzd2l0Y2goc3ViY21kKQorICAgIHsKKworICAgICAgICBjYXNlIFNIT1dfQ09OTl9TVEFUVVM6CisgICAgICAgICAgICBpZiAoTU9OSVRPUl9PTihwQWQpKQorICAgICAgICAgICAgeworI2lmZGVmIERPVDExX05fU1VQUE9SVAorICAgICAgICAgICAgICAgIGlmIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID49IFBIWV8xMUFCR05fTUlYRUQgJiYKKyAgICAgICAgICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXKQorICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKGV4dHJhLCAiTW9uaXRvciBNb2RlKENlbnRyYWxDaGFubmVsICVkKVxuIiwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwpOworICAgICAgICAgICAgICAgIGVsc2UKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKyAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihleHRyYSwgIk1vbml0b3IgTW9kZShDaGFubmVsICVkKVxuIiwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID09IE5kaXNNZWRpYVN0YXRlQ29ubmVjdGVkKQorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkgICAgaWYgKElORlJBX09OKHBBZCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihleHRyYSwgIkNvbm5lY3RlZChBUDogJXNbJTAyWDolMDJYOiUwMlg6JTAyWDolMDJYOiUwMlhdKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLlNzaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5Cc3NpZFswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuQnNzaWRbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5Cc3NpZFszXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkWzRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuQnNzaWRbNV0pOworICAgICAgICAgICAgCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSAsKCJTc2lkPSVzICxTc2lkbGVuID0gJWRcbiIscEFkLT5Db21tb25DZmcuU3NpZCwgcEFkLT5Db21tb25DZmcuU3NpZExlbikpOworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoQURIT0NfT04ocEFkKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYoZXh0cmEsICJDb25uZWN0ZWRcbiIpOworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgIAllbHNlCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCSAgICBzcHJpbnRmKGV4dHJhLCAiRGlzY29ubmVjdGVkXG4iKTsKKyAgICAgICAgICAgIAkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UgLCgiQ29ublN0YXR1cyBpcyBub3QgY29ubmVjdGVkXG4iKSk7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgd3JxLT5sZW5ndGggPSBzdHJsZW4oZXh0cmEpICsgMTsgLy8gMTogc2l6ZSBvZiAnXDAnCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTSE9XX0RSVklFUl9WRVJJT046CisgICAgICAgICAgICBzcHJpbnRmKGV4dHJhLCAiRHJpdmVyIHZlcnNpb24tJXMsICVzICVzXG4iLCBTVEFfRFJJVkVSX1ZFUlNJT04sIF9fREFURV9fLCBfX1RJTUVfXyApOworICAgICAgICAgICAgd3JxLT5sZW5ndGggPSBzdHJsZW4oZXh0cmEpICsgMTsgLy8gMTogc2l6ZSBvZiAnXDAnCisgICAgICAgICAgICBicmVhazsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKyAgICAgICAgY2FzZSBTSE9XX0JBX0lORk86CisgICAgICAgICAgICBnZXRCYUluZm8ocEFkLCBleHRyYSk7CisgICAgICAgICAgICB3cnEtPmxlbmd0aCA9IHN0cmxlbihleHRyYSkgKyAxOyAvLyAxOiBzaXplIG9mICdcMCcKKyAgICAgICAgICAgIGJyZWFrOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQljYXNlIFNIT1dfREVTQ19JTkZPOgorCQkJeworCQkJCVNob3dfRGVzY0luZm9fUHJvYyhwQWQsIE5VTEwpOworCQkJCXdycS0+bGVuZ3RoID0gMDsgLy8gMTogc2l6ZSBvZiAnXDAnCisJCQl9CisJCQlicmVhazsKKyAgICAgICAgY2FzZSBSQUlPX09GRjoKKyAgICAgICAgICAgIGlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNwcmludGYoZXh0cmEsICJTY2FubmluZ1xuIik7CisgICAgICAgICAgICAgICAgd3JxLT5sZW5ndGggPSBzdHJsZW4oZXh0cmEpICsgMTsgLy8gMTogc2l6ZSBvZiAnXDAnCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwQWQtPlN0YUNmZy5iU3dSYWRpbyA9IEZBTFNFOworICAgICAgICAgICAgaWYgKHBBZC0+U3RhQ2ZnLmJSYWRpbyAhPSAocEFkLT5TdGFDZmcuYkh3UmFkaW8gJiYgcEFkLT5TdGFDZmcuYlN3UmFkaW8pKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBBZC0+U3RhQ2ZnLmJSYWRpbyA9IChwQWQtPlN0YUNmZy5iSHdSYWRpbyAmJiBwQWQtPlN0YUNmZy5iU3dSYWRpbyk7CisgICAgICAgICAgICAgICAgaWYgKHBBZC0+U3RhQ2ZnLmJSYWRpbyA9PSBGQUxTRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIE1sbWVSYWRpb09mZihwQWQpOworICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgZXh0cmEgaW5mb3JtYXRpb24KKwkJCQkJcEFkLT5FeHRyYUluZm8gPSBTV19SQURJT19PRkY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgc3ByaW50ZihleHRyYSwgIlJhZGlvIE9mZlxuIik7CisgICAgICAgICAgICB3cnEtPmxlbmd0aCA9IHN0cmxlbihleHRyYSkgKyAxOyAvLyAxOiBzaXplIG9mICdcMCcKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJBSU9fT046CisgICAgICAgICAgICBpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzcHJpbnRmKGV4dHJhLCAiU2Nhbm5pbmdcbiIpOworICAgICAgICAgICAgICAgIHdycS0+bGVuZ3RoID0gc3RybGVuKGV4dHJhKSArIDE7IC8vIDE6IHNpemUgb2YgJ1wwJworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcEFkLT5TdGFDZmcuYlN3UmFkaW8gPSBUUlVFOworICAgICAgICAgICAgLy9pZiAocEFkLT5TdGFDZmcuYlJhZGlvICE9IChwQWQtPlN0YUNmZy5iSHdSYWRpbyAmJiBwQWQtPlN0YUNmZy5iU3dSYWRpbykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcEFkLT5TdGFDZmcuYlJhZGlvID0gKHBBZC0+U3RhQ2ZnLmJId1JhZGlvICYmIHBBZC0+U3RhQ2ZnLmJTd1JhZGlvKTsKKyAgICAgICAgICAgICAgICBpZiAocEFkLT5TdGFDZmcuYlJhZGlvID09IFRSVUUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBNbG1lUmFkaW9PbihwQWQpOworICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgZXh0cmEgaW5mb3JtYXRpb24KKwkJCQkJcEFkLT5FeHRyYUluZm8gPSBFWFRSQV9JTkZPX0NMRUFSOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNwcmludGYoZXh0cmEsICJSYWRpbyBPblxuIik7CisgICAgICAgICAgICB3cnEtPmxlbmd0aCA9IHN0cmxlbihleHRyYSkgKyAxOyAvLyAxOiBzaXplIG9mICdcMCcKKyAgICAgICAgICAgIGJyZWFrOworCisKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwkJY2FzZSBTSE9XX0RMU19FTlRSWV9JTkZPOgorCQkJeworCQkJCVNldF9EbHNFbnRyeUluZm9fRGlzcGxheV9Qcm9jKHBBZCwgTlVMTCk7CisJCQkJd3JxLT5sZW5ndGggPSAwOyAvLyAxOiBzaXplIG9mICdcMCcKKwkJCX0KKwkJCWJyZWFrOworI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCisJCWNhc2UgU0hPV19DRkdfVkFMVUU6CisJCQl7CisJCQkJU3RhdHVzID0gUlRNUFNob3dDZmdWYWx1ZShwQWQsIHdycS0+cG9pbnRlciwgZXh0cmEpOworCQkJCWlmIChTdGF0dXMgPT0gMCkKKwkJCQkJd3JxLT5sZW5ndGggPSBzdHJsZW4oZXh0cmEpICsgMTsgLy8gMTogc2l6ZSBvZiAnXDAnCisJCQl9CisJCQlicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzIC0gdW5rbm93IHN1YmNtZCA9ICVkXG4iLCBfX2Z1bmNfXywgc3ViY21kKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gU3RhdHVzOworfQorCisjaWZkZWYgU0lPQ1NJV01MTUUKK2ludCBydF9pb2N0bF9zaXdtbG1lKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwKKwkJCSAgIGNoYXIgKmV4dHJhKQoreworCVBSVE1QX0FEQVBURVIgICBwQWQgPSBkZXYtPm1sX3ByaXY7CisJc3RydWN0IGl3X21sbWUgKnBNbG1lID0gKHN0cnVjdCBpd19tbG1lICopd3JxdS0+ZGF0YS5wb2ludGVyOworCU1MTUVfUVVFVUVfRUxFTQkJCQlNc2dFbGVtOworCU1MTUVfRElTQVNTT0NfUkVRX1NUUlVDVAlEaXNBc3NvY1JlcTsKKwlNTE1FX0RFQVVUSF9SRVFfU1RSVUNUICAgICAgRGVBdXRoUmVxOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PT4gJXNcbiIsIF9fZnVuY19fKSk7CisKKwlpZiAocE1sbWUgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzd2l0Y2gocE1sbWUtPmNtZCkKKwl7CisjaWZkZWYgSVdfTUxNRV9ERUFVVEgKKwkJY2FzZSBJV19NTE1FX0RFQVVUSDoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT0+ICVzIC0gSVdfTUxNRV9ERUFVVEhcbiIsIF9fZnVuY19fKSk7CisJCQlDT1BZX01BQ19BRERSKERlQXV0aFJlcS5BZGRyLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisJCQlEZUF1dGhSZXEuUmVhc29uID0gcE1sbWUtPnJlYXNvbl9jb2RlOworCQkJTXNnRWxlbS5Nc2dMZW4gPSBzaXplb2YoTUxNRV9ERUFVVEhfUkVRX1NUUlVDVCk7CisJCQlOZGlzTW92ZU1lbW9yeShNc2dFbGVtLk1zZywgJkRlQXV0aFJlcSwgc2l6ZW9mKE1MTUVfREVBVVRIX1JFUV9TVFJVQ1QpKTsKKwkJCU1sbWVEZWF1dGhSZXFBY3Rpb24ocEFkLCAmTXNnRWxlbSk7CisJCQlpZiAoSU5GUkFfT04ocEFkKSkKKwkJCXsKKwkJCSAgICBMaW5rRG93bihwQWQsIEZBTFNFKTsKKwkJCSAgICBwQWQtPk1sbWUuQXNzb2NNYWNoaW5lLkN1cnJTdGF0ZSA9IEFTU09DX0lETEU7CisJCQl9CisJCQlicmVhazsKKyNlbmRpZiAvLyBJV19NTE1FX0RFQVVUSCAvLworI2lmZGVmIElXX01MTUVfRElTQVNTT0MKKwkJY2FzZSBJV19NTE1FX0RJU0FTU09DOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PT4gJXMgLSBJV19NTE1FX0RJU0FTU09DXG4iLCBfX2Z1bmNfXykpOworCQkJQ09QWV9NQUNfQUREUihEaXNBc3NvY1JlcS5BZGRyLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisJCQlEaXNBc3NvY1JlcS5SZWFzb24gPSAgcE1sbWUtPnJlYXNvbl9jb2RlOworCisJCQlNc2dFbGVtLk1hY2hpbmUgPSBBU1NPQ19TVEFURV9NQUNISU5FOworCQkJTXNnRWxlbS5Nc2dUeXBlID0gTVQyX01MTUVfRElTQVNTT0NfUkVROworCQkJTXNnRWxlbS5Nc2dMZW4gPSBzaXplb2YoTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNUKTsKKwkJCU5kaXNNb3ZlTWVtb3J5KE1zZ0VsZW0uTXNnLCAmRGlzQXNzb2NSZXEsIHNpemVvZihNTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1QpKTsKKworCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9PSURfRElTQVNTT0M7CisJCQlNbG1lRGlzYXNzb2NSZXFBY3Rpb24ocEFkLCAmTXNnRWxlbSk7CisJCQlicmVhazsKKyNlbmRpZiAvLyBJV19NTE1FX0RJU0FTU09DIC8vCisJCWRlZmF1bHQ6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT09PiAlcyAtIFVua25vdyBDb21tYW5kXG4iLCBfX2Z1bmNfXykpOworCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisjZW5kaWYgLy8gU0lPQ1NJV01MTUUgLy8KKworI2lmIFdJUkVMRVNTX0VYVCA+IDE3CitpbnQgcnRfaW9jdGxfc2l3YXV0aChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIgPSBkZXYtPm1sX3ByaXY7CisJc3RydWN0IGl3X3BhcmFtICpwYXJhbSA9ICZ3cnF1LT5wYXJhbTsKKworICAgIC8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCisJaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQorCXsKKyAgCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisgICAgCXJldHVybiAtRU5FVERPV047CisJfQorCXN3aXRjaCAocGFyYW0tPmZsYWdzICYgSVdfQVVUSF9JTkRFWCkgeworICAgIAljYXNlIElXX0FVVEhfV1BBX1ZFUlNJT046CisgICAgICAgICAgICBpZiAocGFyYW0tPnZhbHVlID09IElXX0FVVEhfV1BBX1ZFUlNJT05fV1BBKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0s7CisJCQkJaWYgKHBBZGFwdGVyLT5TdGFDZmcuQnNzVHlwZSA9PSBCU1NfQURIT0MpCisJCQkJCXBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAocGFyYW0tPnZhbHVlID09IElXX0FVVEhfV1BBX1ZFUlNJT05fV1BBMikKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSzsKKworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0FVVEhfV1BBX1ZFUlNJT04gLSBwYXJhbS0+dmFsdWUgPSAlZCFcbiIsIF9fZnVuY19fLCBwYXJhbS0+dmFsdWUpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIAljYXNlIElXX0FVVEhfQ0lQSEVSX1BBSVJXSVNFOgorICAgICAgICAgICAgaWYgKHBhcmFtLT52YWx1ZSA9PSBJV19BVVRIX0NJUEhFUl9OT05FKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzID0gTmRpczgwMl8xMVdFUERpc2FibGVkOworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuT3JpZ1dlcFN0YXR1cyA9IHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzOworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuUGFpckNpcGhlciA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHBhcmFtLT52YWx1ZSA9PSBJV19BVVRIX0NJUEhFUl9XRVA0MCB8fAorICAgICAgICAgICAgICAgICAgICAgcGFyYW0tPnZhbHVlID09IElXX0FVVEhfQ0lQSEVSX1dFUDEwNCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cyA9IE5kaXM4MDJfMTFXRVBFbmFibGVkOworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuT3JpZ1dlcFN0YXR1cyA9IHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzOworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuUGFpckNpcGhlciA9IE5kaXM4MDJfMTFXRVBFbmFibGVkOworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLklFRUU4MDIxWCA9IEZBTFNFOworI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHBhcmFtLT52YWx1ZSA9PSBJV19BVVRIX0NJUEhFUl9US0lQKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzID0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZDsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLk9yaWdXZXBTdGF0dXMgPSBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1czsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLlBhaXJDaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAocGFyYW0tPnZhbHVlID09IElXX0FVVEhfQ0lQSEVSX0NDTVApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXMgPSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkOworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuT3JpZ1dlcFN0YXR1cyA9IHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzOworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuUGFpckNpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6SVdfQVVUSF9DSVBIRVJfUEFJUldJU0UgLSBwYXJhbS0+dmFsdWUgPSAlZCFcbiIsIF9fZnVuY19fLCBwYXJhbS0+dmFsdWUpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIAljYXNlIElXX0FVVEhfQ0lQSEVSX0dST1VQOgorICAgICAgICAgICAgaWYgKHBhcmFtLT52YWx1ZSA9PSBJV19BVVRIX0NJUEhFUl9OT05FKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuR3JvdXBDaXBoZXIgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChwYXJhbS0+dmFsdWUgPT0gSVdfQVVUSF9DSVBIRVJfV0VQNDAgfHwKKyAgICAgICAgICAgICAgICAgICAgIHBhcmFtLT52YWx1ZSA9PSBJV19BVVRIX0NJUEhFUl9XRVAxMDQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5Hcm91cENpcGhlciA9IE5kaXM4MDJfMTFXRVBFbmFibGVkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAocGFyYW0tPnZhbHVlID09IElXX0FVVEhfQ0lQSEVSX1RLSVApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5Hcm91cENpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChwYXJhbS0+dmFsdWUgPT0gSVdfQVVUSF9DSVBIRVJfQ0NNUCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpJV19BVVRIX0NJUEhFUl9HUk9VUCAtIHBhcmFtLT52YWx1ZSA9ICVkIVxuIiwgX19mdW5jX18sIHBhcmFtLT52YWx1ZSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgCWNhc2UgSVdfQVVUSF9LRVlfTUdNVDoKKyAgICAgICAgICAgIGlmIChwYXJhbS0+dmFsdWUgPT0gSVdfQVVUSF9LRVlfTUdNVF84MDJfMVgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTsKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuSUVFRTgwMjFYID0gRkFMU0U7CisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMjsKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuSUVFRTgwMjFYID0gRkFMU0U7CisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworICAgICAgICAgICAgICAgIH0KKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAvLyBXRVAgMXgKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5JRUVFODAyMVggPSBUUlVFOworI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHBhcmFtLT52YWx1ZSA9PSAwKQorICAgICAgICAgICAgeworCQkJCVNUQV9QT1JUX1NFQ1VSRUQocEFkYXB0ZXIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0FVVEhfS0VZX01HTVQgLSBwYXJhbS0+dmFsdWUgPSAlZCFcbiIsIF9fZnVuY19fLCBwYXJhbS0+dmFsdWUpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIAljYXNlIElXX0FVVEhfUlhfVU5FTkNSWVBURURfRUFQT0w6CisgICAgICAgICAgICBicmVhazsKKyAgICAJY2FzZSBJV19BVVRIX1BSSVZBQ1lfSU5WT0tFRDoKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpJV19BVVRIX1BSSVZBQ1lfSU5WT0tFRCAtIHBhcmFtLT52YWx1ZSA9ICVkIVxuIiwgX19mdW5jX18sIHBhcmFtLT52YWx1ZSkpOworICAgIAkJYnJlYWs7CisgICAgCWNhc2UgSVdfQVVUSF9EUk9QX1VORU5DUllQVEVEOgorICAgICAgICAgICAgaWYgKHBhcmFtLT52YWx1ZSAhPSAwKQorICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQ7CisJCQllbHNlCisJCQl7CisJCQkJU1RBX1BPUlRfU0VDVVJFRChwQWRhcHRlcik7CisJCQl9CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6SVdfQVVUSF9XUEFfVkVSU0lPTiAtIHBhcmFtLT52YWx1ZSA9ICVkIVxuIiwgX19mdW5jX18sIHBhcmFtLT52YWx1ZSkpOworICAgIAkJYnJlYWs7CisgICAgCWNhc2UgSVdfQVVUSF84MDIxMV9BVVRIX0FMRzoKKwkJCWlmIChwYXJhbS0+dmFsdWUgJiBJV19BVVRIX0FMR19TSEFSRURfS0VZKQorICAgICAgICAgICAgeworCQkJCXBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVTaGFyZWQ7CisJCQl9CisgICAgICAgICAgICBlbHNlIGlmIChwYXJhbS0+dmFsdWUgJiBJV19BVVRIX0FMR19PUEVOX1NZU1RFTSkKKyAgICAgICAgICAgIHsKKwkJCQlwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlT3BlbjsKKwkJCX0KKyAgICAgICAgICAgIGVsc2UKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpJV19BVVRIXzgwMjExX0FVVEhfQUxHIC0gcGFyYW0tPnZhbHVlID0gJWQhXG4iLCBfX2Z1bmNfXywgcGFyYW0tPnZhbHVlKSk7CisJCQlicmVhazsKKyAgICAJY2FzZSBJV19BVVRIX1dQQV9FTkFCTEVEOgorICAgIAkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0FVVEhfV1BBX0VOQUJMRUQgLSBEcml2ZXIgc3VwcG9ydHMgV1BBIShwYXJhbS0+dmFsdWUgPSAlZClcbiIsIF9fZnVuY19fLCBwYXJhbS0+dmFsdWUpKTsKKyAgICAJCWJyZWFrOworICAgIAlkZWZhdWx0OgorICAgIAkJcmV0dXJuIC1FT1BOT1RTVVBQOworfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCBydF9pb2N0bF9naXdhdXRoKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIgPSBkZXYtPm1sX3ByaXY7CisJc3RydWN0IGl3X3BhcmFtICpwYXJhbSA9ICZ3cnF1LT5wYXJhbTsKKworICAgIC8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCisJaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQorICAgIHsKKyAgCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisgICAgCXJldHVybiAtRU5FVERPV047CisgICAgfQorCisJc3dpdGNoIChwYXJhbS0+ZmxhZ3MgJiBJV19BVVRIX0lOREVYKSB7CisJY2FzZSBJV19BVVRIX0RST1BfVU5FTkNSWVBURUQ6CisgICAgICAgIHBhcmFtLT52YWx1ZSA9IChwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExV0VQRGlzYWJsZWQpID8gMCA6IDE7CisJCWJyZWFrOworCisJY2FzZSBJV19BVVRIXzgwMjExX0FVVEhfQUxHOgorICAgICAgICBwYXJhbS0+dmFsdWUgPSAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVTaGFyZWQpID8gSVdfQVVUSF9BTEdfU0hBUkVEX0tFWSA6IElXX0FVVEhfQUxHX09QRU5fU1lTVEVNOworCQlicmVhazsKKworCWNhc2UgSVdfQVVUSF9XUEFfRU5BQkxFRDoKKwkJcGFyYW0tPnZhbHVlID0gKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKSA/IDEgOiAwOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwl9CisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgicnRfaW9jdGxfZ2l3YXV0aDo6cGFyYW0tPnZhbHVlID0gJWQhXG4iLCBwYXJhbS0+dmFsdWUpKTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBmblNldENpcGhlcktleSgKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBJTlQgICAgICAgICAgICAga2V5SWR4LAorICAgIElOICBVQ0hBUiAgICAgICAgICAgQ2lwaGVyQWxnLAorICAgIElOICBCT09MRUFOICAgICAgICAgYkdUSywKKyAgICBJTiAgc3RydWN0IGl3X2VuY29kZV9leHQgKmV4dCkKK3sKKyAgICBOZGlzWmVyb01lbW9yeSgmcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLCBzaXplb2YoQ0lQSEVSX0tFWSkpOworICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5LZXlMZW4gPSBMRU5fVEtJUF9FSzsKKyAgICBOZGlzTW92ZU1lbW9yeShwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uS2V5LCBleHQtPmtleSwgTEVOX1RLSVBfRUspOworICAgIE5kaXNNb3ZlTWVtb3J5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5UeE1pYywgZXh0LT5rZXkgKyBMRU5fVEtJUF9FSywgTEVOX1RLSVBfVFhNSUNLKTsKKyAgICBOZGlzTW92ZU1lbW9yeShwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uUnhNaWMsIGV4dC0+a2V5ICsgTEVOX1RLSVBfRUsgKyBMRU5fVEtJUF9UWE1JQ0ssIExFTl9US0lQX1JYTUlDSyk7CisgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLkNpcGhlckFsZyA9IENpcGhlckFsZzsKKworICAgIC8vIFVwZGF0ZSBncm91cCBrZXkgaW5mb3JtYXRpb24gdG8gQVNJQyBTaGFyZWQgS2V5IFRhYmxlCisJQXNpY0FkZFNoYXJlZEtleUVudHJ5KHBBZGFwdGVyLAorCQkJCQkJICBCU1MwLAorCQkJCQkJICBrZXlJZHgsCisJCQkJCQkgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5DaXBoZXJBbGcsCisJCQkJCQkgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5LZXksCisJCQkJCQkgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5UeE1pYywKKwkJCQkJCSAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLlJ4TWljKTsKKworICAgIGlmIChiR1RLKQorICAgICAgICAvLyBVcGRhdGUgQVNJQyBXQ0lEIGF0dHJpYnV0ZSB0YWJsZSBhbmQgSVZFSVYgdGFibGUKKyAgICAJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWRhcHRlciwKKyAgICAJCQkJCQkJICBCU1MwLAorICAgIAkJCQkJCQkgIGtleUlkeCwKKyAgICAJCQkJCQkJICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uQ2lwaGVyQWxnLAorICAgIAkJCQkJCQkgIE5VTEwpOworICAgIGVsc2UKKyAgICAgICAgLy8gVXBkYXRlIEFTSUMgV0NJRCBhdHRyaWJ1dGUgdGFibGUgYW5kIElWRUlWIHRhYmxlCisgICAgCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkocEFkYXB0ZXIsCisgICAgCQkJCQkJCSAgQlNTMCwKKyAgICAJCQkJCQkJICBrZXlJZHgsCisgICAgCQkJCQkJCSAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLkNpcGhlckFsZywKKyAgICAJCQkJCQkJICAmcEFkYXB0ZXItPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdKTsKK30KKworaW50IHJ0X2lvY3RsX3Npd2VuY29kZWV4dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsCisJCQkgICBjaGFyICpleHRyYSkKKwkJCXsKKyAgICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIgPSBkZXYtPm1sX3ByaXY7CisJc3RydWN0IGl3X3BvaW50ICplbmNvZGluZyA9ICZ3cnF1LT5lbmNvZGluZzsKKwlzdHJ1Y3QgaXdfZW5jb2RlX2V4dCAqZXh0ID0gKHN0cnVjdCBpd19lbmNvZGVfZXh0ICopZXh0cmE7CisgICAgaW50IGtleUlkeCwgYWxnID0gZXh0LT5hbGc7CisKKyAgICAvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgorCWlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKKwl7CisgIAkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOworICAgIAlyZXR1cm4gLUVORVRET1dOOworCX0KKworICAgIGlmIChlbmNvZGluZy0+ZmxhZ3MgJiBJV19FTkNPREVfRElTQUJMRUQpCisJeworICAgICAgICBrZXlJZHggPSAoZW5jb2RpbmctPmZsYWdzICYgSVdfRU5DT0RFX0lOREVYKSAtIDE7CisgICAgICAgIC8vIHNldCBCU1NJRCB3Y2lkIGVudHJ5IG9mIHRoZSBQYWlyLXdpc2UgS2V5IHRhYmxlIGFzIG5vLXNlY3VyaXR5IG1vZGUKKwkgICAgQXNpY1JlbW92ZVBhaXJ3aXNlS2V5RW50cnkocEFkYXB0ZXIsIEJTUzAsIEJTU0lEX1dDSUQpOworICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uS2V5TGVuID0gMDsKKwkJcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLkNpcGhlckFsZyA9IENJUEhFUl9OT05FOworCQlBc2ljUmVtb3ZlU2hhcmVkS2V5RW50cnkocEFkYXB0ZXIsIDAsIChVQ0hBUilrZXlJZHgpOworICAgICAgICBOZGlzWmVyb01lbW9yeSgmcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLCBzaXplb2YoQ0lQSEVSX0tFWSkpOworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6UmVtb3ZlIGFsbCBrZXlzIShlbmNvZGluZy0+ZmxhZ3MgPSAleClcbiIsIF9fZnVuY19fLCBlbmNvZGluZy0+ZmxhZ3MpKTsKKyAgICB9CisJCQkJCWVsc2UKKyAgICB7CisgICAgICAgIC8vIEdldCBLZXkgSW5kZXggYW5kIGNvbnZldCB0byBvdXIgb3duIGRlZmluZWQga2V5IGluZGV4CisgICAgCWtleUlkeCA9IChlbmNvZGluZy0+ZmxhZ3MgJiBJV19FTkNPREVfSU5ERVgpIC0gMTsKKyAgICAJaWYoKGtleUlkeCA8IDApIHx8IChrZXlJZHggPj0gTlJfV0VQX0tFWVMpKQorICAgIAkJcmV0dXJuIC1FSU5WQUw7CisKKyAgICAgICAgaWYgKGV4dC0+ZXh0X2ZsYWdzICYgSVdfRU5DT0RFX0VYVF9TRVRfVFhfS0VZKQorICAgICAgICB7CisgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCA9IGtleUlkeDsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpEZWZhdWx0S2V5SWQgPSAlZFxuIiwgX19mdW5jX18sIHBBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkKSk7CisgICAgICAgIH0KKworICAgICAgICBzd2l0Y2ggKGFsZykgeworICAgIAkJY2FzZSBJV19FTkNPREVfQUxHX05PTkU6CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0VOQ09ERV9BTEdfTk9ORVxuIiwgX19mdW5jX18pKTsKKyAgICAJCQlicmVhazsKKyAgICAJCWNhc2UgSVdfRU5DT0RFX0FMR19XRVA6CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0VOQ09ERV9BTEdfV0VQIC0gZXh0LT5rZXlfbGVuID0gJWQsIGtleUlkeCA9ICVkXG4iLCBfX2Z1bmNfXywgZXh0LT5rZXlfbGVuLCBrZXlJZHgpKTsKKyAgICAJCQlpZiAoZXh0LT5rZXlfbGVuID09IE1BWF9XRVBfS0VZX1NJWkUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAJCQlwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uS2V5TGVuID0gTUFYX1dFUF9LRVlfU0laRTsKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLkNpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7CisJCQkJfQorICAgICAgICAJCWVsc2UgaWYgKGV4dC0+a2V5X2xlbiA9PSBNSU5fV0VQX0tFWV9TSVpFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLktleUxlbiA9IE1JTl9XRVBfS0VZX1NJWkU7CisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5DaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7CisJCQl9CisgICAgICAgIAkJZWxzZQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKworICAgICAgICAgICAgICAgIE5kaXNaZXJvTWVtb3J5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5LZXksICAxNik7CisJCQkgICAgTmRpc01vdmVNZW1vcnkocEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLktleSwgZXh0LT5rZXksIGV4dC0+a2V5X2xlbik7CisgICAgCQkJYnJlYWs7CisgICAgICAgICAgICBjYXNlIElXX0VOQ09ERV9BTEdfVEtJUDoKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6SVdfRU5DT0RFX0FMR19US0lQIC0ga2V5SWR4ID0gJWQsIGV4dC0+a2V5X2xlbiA9ICVkXG4iLCBfX2Z1bmNfXywga2V5SWR4LCBleHQtPmtleV9sZW4pKTsKKyAgICAgICAgICAgICAgICBpZiAoZXh0LT5rZXlfbGVuID09IDMyKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dC0+ZXh0X2ZsYWdzICYgSVdfRU5DT0RFX0VYVF9TRVRfVFhfS0VZKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBmblNldENpcGhlcktleShwQWRhcHRlciwga2V5SWR4LCBDSVBIRVJfVEtJUCwgRkFMU0UsIGV4dCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNUQV9QT1JUX1NFQ1VSRUQocEFkYXB0ZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCQl9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGV4dC0+ZXh0X2ZsYWdzICYgSVdfRU5DT0RFX0VYVF9HUk9VUF9LRVkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZuU2V0Q2lwaGVyS2V5KHBBZGFwdGVyLCBrZXlJZHgsIENJUEhFUl9US0lQLCBUUlVFLCBleHQpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXQgODAyLjF4IHBvcnQgY29udHJvbAorICAgICAgICAgICAgCSAgICAgICAgU1RBX1BPUlRfU0VDVVJFRChwQWRhcHRlcik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSVdfRU5DT0RFX0FMR19DQ01QOgorICAgICAgICAgICAgICAgIGlmIChleHQtPmV4dF9mbGFncyAmIElXX0VOQ09ERV9FWFRfU0VUX1RYX0tFWSkKKwkJeworICAgICAgICAgICAgICAgICAgICBmblNldENpcGhlcktleShwQWRhcHRlciwga2V5SWR4LCBDSVBIRVJfQUVTLCBGQUxTRSwgZXh0KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikKKyAgICAgICAgICAgICAgICAgICAgCVNUQV9QT1JUX1NFQ1VSRUQocEFkYXB0ZXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChleHQtPmV4dF9mbGFncyAmIElXX0VOQ09ERV9FWFRfR1JPVVBfS0VZKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZm5TZXRDaXBoZXJLZXkocEFkYXB0ZXIsIGtleUlkeCwgQ0lQSEVSX0FFUywgVFJVRSwgZXh0KTsKKworICAgICAgICAgICAgICAgICAgICAvLyBzZXQgODAyLjF4IHBvcnQgY29udHJvbAorICAgICAgICAJICAgICAgICBTVEFfUE9SVF9TRUNVUkVEKHBBZGFwdGVyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgCQlkZWZhdWx0OgorICAgIAkJCXJldHVybiAtRUlOVkFMOworCQl9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK2ludAorcnRfaW9jdGxfZ2l3ZW5jb2RlZXh0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCVBSVE1QX0FEQVBURVIgcEFkID0gZGV2LT5tbF9wcml2OworCVBDSEFSIHBLZXkgPSBOVUxMOworCXN0cnVjdCBpd19wb2ludCAqZW5jb2RpbmcgPSAmd3JxdS0+ZW5jb2Rpbmc7CisJc3RydWN0IGl3X2VuY29kZV9leHQgKmV4dCA9IChzdHJ1Y3QgaXdfZW5jb2RlX2V4dCAqKWV4dHJhOworCWludCBpZHgsIG1heF9rZXlfbGVuOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UgLCgiPT09PiBydF9pb2N0bF9naXdlbmNvZGVleHRcbiIpKTsKKworCW1heF9rZXlfbGVuID0gZW5jb2RpbmctPmxlbmd0aCAtIHNpemVvZigqZXh0KTsKKwlpZiAobWF4X2tleV9sZW4gPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlkeCA9IGVuY29kaW5nLT5mbGFncyAmIElXX0VOQ09ERV9JTkRFWDsKKwlpZiAoaWR4KQorCXsKKwkJaWYgKGlkeCA8IDEgfHwgaWR4ID4gNCkKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZHgtLTsKKworCQlpZiAoKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKSB8fAorCQkJKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKSkKKwkJeworCQkJaWYgKGlkeCAhPSBwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQpCisJCQl7CisJCQkJZXh0LT5rZXlfbGVuID0gMDsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfQorCX0KKwllbHNlCisJCWlkeCA9IHBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZDsKKworCWVuY29kaW5nLT5mbGFncyA9IGlkeCArIDE7CisJbWVtc2V0KGV4dCwgMCwgc2l6ZW9mKCpleHQpKTsKKworCWV4dC0+a2V5X2xlbiA9IDA7CisJc3dpdGNoKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cykgeworCQljYXNlIE5kaXM4MDJfMTFXRVBEaXNhYmxlZDoKKwkJCWV4dC0+YWxnID0gSVdfRU5DT0RFX0FMR19OT05FOworCQkJZW5jb2RpbmctPmZsYWdzIHw9IElXX0VOQ09ERV9ESVNBQkxFRDsKKwkJCWJyZWFrOworCQljYXNlIE5kaXM4MDJfMTFXRVBFbmFibGVkOgorCQkJZXh0LT5hbGcgPSBJV19FTkNPREVfQUxHX1dFUDsKKwkJCWlmIChwQWQtPlNoYXJlZEtleVtCU1MwXVtpZHhdLktleUxlbiA+IG1heF9rZXlfbGVuKQorCQkJCXJldHVybiAtRTJCSUc7CisJCQllbHNlCisJCQl7CisJCQkJZXh0LT5rZXlfbGVuID0gcEFkLT5TaGFyZWRLZXlbQlNTMF1baWR4XS5LZXlMZW47CisJCQkJcEtleSA9ICYocEFkLT5TaGFyZWRLZXlbQlNTMF1baWR4XS5LZXlbMF0pOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZDoKKwkJY2FzZSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkOgorCQkJaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKQorCQkJCWV4dC0+YWxnID0gSVdfRU5DT0RFX0FMR19US0lQOworCQkJZWxzZQorCQkJCWV4dC0+YWxnID0gSVdfRU5DT0RFX0FMR19DQ01QOworCisJCQlpZiAobWF4X2tleV9sZW4gPCAzMikKKwkJCQlyZXR1cm4gLUUyQklHOworCQkJZWxzZQorCQkJeworCQkJCWV4dC0+a2V5X2xlbiA9IDMyOworCQkJCXBLZXkgPSAmcEFkLT5TdGFDZmcuUE1LWzBdOworCQkJfQorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoZXh0LT5rZXlfbGVuICYmIHBLZXkpCisJeworCQllbmNvZGluZy0+ZmxhZ3MgfD0gSVdfRU5DT0RFX0VOQUJMRUQ7CisJCW1lbWNweShleHQtPmtleSwgcEtleSwgZXh0LT5rZXlfbGVuKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIFNJT0NTSVdHRU5JRQoraW50IHJ0X2lvY3RsX3Npd2dlbmllKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCVBSVE1QX0FEQVBURVIgICBwQWQgPSBkZXYtPm1sX3ByaXY7CisKKwlpZiAod3JxdS0+ZGF0YS5sZW5ndGggPiBNQVhfTEVOX09GX1JTTklFIHx8CisJICAgICh3cnF1LT5kYXRhLmxlbmd0aCAmJiBleHRyYSA9PSBOVUxMKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAod3JxdS0+ZGF0YS5sZW5ndGgpCisJeworCQlwQWQtPlN0YUNmZy5SU05JRV9MZW4gPSB3cnF1LT5kYXRhLmxlbmd0aDsKKwkJTmRpc01vdmVNZW1vcnkoJnBBZC0+U3RhQ2ZnLlJTTl9JRVswXSwgZXh0cmEsIHBBZC0+U3RhQ2ZnLlJTTklFX0xlbik7CisJfQorCWVsc2UKKwl7CisJCXBBZC0+U3RhQ2ZnLlJTTklFX0xlbiA9IDA7CisJCU5kaXNaZXJvTWVtb3J5KCZwQWQtPlN0YUNmZy5SU05fSUVbMF0sIE1BWF9MRU5fT0ZfUlNOSUUpOworCX0KKworCXJldHVybiAwOworfQorI2VuZGlmIC8vIFNJT0NTSVdHRU5JRSAvLworCitpbnQgcnRfaW9jdGxfZ2l3Z2VuaWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCVBSVE1QX0FEQVBURVIgICBwQWQgPSBkZXYtPm1sX3ByaXY7CisKKwlpZiAoKHBBZC0+U3RhQ2ZnLlJTTklFX0xlbiA9PSAwKSB8fAorCQkocEFkLT5TdGFDZmcuQXV0aE1vZGUgPCBOZGlzODAyXzExQXV0aE1vZGVXUEEpKQorCXsKKwkJd3JxdS0+ZGF0YS5sZW5ndGggPSAwOworCQlyZXR1cm4gMDsKKwl9CisKKyNpZmRlZiBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorI2lmZGVmIFNJT0NTSVdHRU5JRQorCWlmIChwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgPT0gV1BBX1NVUFBMSUNBTlRfRU5BQkxFKQorCXsKKwlpZiAod3JxdS0+ZGF0YS5sZW5ndGggPCBwQWQtPlN0YUNmZy5SU05JRV9MZW4pCisJCXJldHVybiAtRTJCSUc7CisKKwl3cnF1LT5kYXRhLmxlbmd0aCA9IHBBZC0+U3RhQ2ZnLlJTTklFX0xlbjsKKwltZW1jcHkoZXh0cmEsICZwQWQtPlN0YUNmZy5SU05fSUVbMF0sIHBBZC0+U3RhQ2ZnLlJTTklFX0xlbik7CisJfQorCWVsc2UKKyNlbmRpZiAvLyBTSU9DU0lXR0VOSUUgLy8KKyNlbmRpZiAvLyBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCXsKKwkJVUNIQVIgUlNOSWUgPSBJRV9XUEE7CisKKwkJaWYgKHdycXUtPmRhdGEubGVuZ3RoIDwgKHBBZC0+U3RhQ2ZnLlJTTklFX0xlbiArIDIpKSAvLyBJRCwgTGVuCisJCQlyZXR1cm4gLUUyQklHOworCQl3cnF1LT5kYXRhLmxlbmd0aCA9IHBBZC0+U3RhQ2ZnLlJTTklFX0xlbiArIDI7CisKKwkJaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKSB8fAorICAgICAgICAgICAgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIpKQorCQkJUlNOSWUgPSBJRV9SU047CisKKwkJZXh0cmFbMF0gPSAoY2hhcilSU05JZTsKKwkJZXh0cmFbMV0gPSBwQWQtPlN0YUNmZy5SU05JRV9MZW47CisJCW1lbWNweShleHRyYSsyLCAmcEFkLT5TdGFDZmcuUlNOX0lFWzBdLCBwQWQtPlN0YUNmZy5SU05JRV9MZW4pOworCX0KKworCXJldHVybiAwOworfQorCitpbnQgcnRfaW9jdGxfc2l3cG1rc2Eoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LAorCQkJICAgY2hhciAqZXh0cmEpCit7CisJUFJUTVBfQURBUFRFUiAgIHBBZCA9IGRldi0+bWxfcHJpdjsKKwlzdHJ1Y3QgaXdfcG1rc2EgKnBQbWtzYSA9IChzdHJ1Y3QgaXdfcG1rc2EgKil3cnF1LT5kYXRhLnBvaW50ZXI7CisJSU5UCUNhY2hlZElkeCA9IDAsIGlkeCA9IDA7CisKKwlpZiAocFBta3NhID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UgLCgiPT09PiBydF9pb2N0bF9zaXdwbWtzYVxuIikpOworCXN3aXRjaChwUG1rc2EtPmNtZCkKKwl7CisJCWNhc2UgSVdfUE1LU0FfRkxVU0g6CisJCQlOZGlzWmVyb01lbW9yeShwQWQtPlN0YUNmZy5TYXZlZFBNSywgc2l6ZW9mKEJTU0lEX0lORk8pKlBNS0lEX05PKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoInJ0X2lvY3RsX3Npd3Bta3NhIC0gSVdfUE1LU0FfRkxVU0hcbiIpKTsKKwkJCWJyZWFrOworCQljYXNlIElXX1BNS1NBX1JFTU9WRToKKwkJCWZvciAoQ2FjaGVkSWR4ID0gMDsgQ2FjaGVkSWR4IDwgcEFkLT5TdGFDZmcuU2F2ZWRQTUtOdW07IENhY2hlZElkeCsrKQorCQkJeworCQkgICAgICAgIC8vIGNvbXBhcmUgdGhlIEJTU0lECisJCSAgICAgICAgaWYgKE5kaXNFcXVhbE1lbW9yeShwUG1rc2EtPmJzc2lkLnNhX2RhdGEsIHBBZC0+U3RhQ2ZnLlNhdmVkUE1LW0NhY2hlZElkeF0uQlNTSUQsIE1BQ19BRERSX0xFTikpCisJCSAgICAgICAgeworCQkgICAgICAgIAlOZGlzWmVyb01lbW9yeShwQWQtPlN0YUNmZy5TYXZlZFBNS1tDYWNoZWRJZHhdLkJTU0lELCBNQUNfQUREUl9MRU4pOworCQkJCQlOZGlzWmVyb01lbW9yeShwQWQtPlN0YUNmZy5TYXZlZFBNS1tDYWNoZWRJZHhdLlBNS0lELCAxNik7CisJCQkJCWZvciAoaWR4ID0gQ2FjaGVkSWR4OyBpZHggPCAocEFkLT5TdGFDZmcuU2F2ZWRQTUtOdW0gLSAxKTsgaWR4KyspCisJCQkJCXsKKwkJCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPlN0YUNmZy5TYXZlZFBNS1tpZHhdLkJTU0lEWzBdLCAmcEFkLT5TdGFDZmcuU2F2ZWRQTUtbaWR4KzFdLkJTU0lEWzBdLCBNQUNfQUREUl9MRU4pOworCQkJCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+U3RhQ2ZnLlNhdmVkUE1LW2lkeF0uUE1LSURbMF0sICZwQWQtPlN0YUNmZy5TYXZlZFBNS1tpZHgrMV0uUE1LSURbMF0sIDE2KTsKKwkJCQkJfQorCQkJCQlwQWQtPlN0YUNmZy5TYXZlZFBNS051bS0tOworCQkJICAgICAgICBicmVhazsKKwkJICAgICAgICB9CisJICAgICAgICB9CisKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoInJ0X2lvY3RsX3Npd3Bta3NhIC0gSVdfUE1LU0FfUkVNT1ZFXG4iKSk7CisJCQlicmVhazsKKwkJY2FzZSBJV19QTUtTQV9BREQ6CisJCQlmb3IgKENhY2hlZElkeCA9IDA7IENhY2hlZElkeCA8IHBBZC0+U3RhQ2ZnLlNhdmVkUE1LTnVtOyBDYWNoZWRJZHgrKykKKwkJCXsKKwkJICAgICAgICAvLyBjb21wYXJlIHRoZSBCU1NJRAorCQkgICAgICAgIGlmIChOZGlzRXF1YWxNZW1vcnkocFBta3NhLT5ic3NpZC5zYV9kYXRhLCBwQWQtPlN0YUNmZy5TYXZlZFBNS1tDYWNoZWRJZHhdLkJTU0lELCBNQUNfQUREUl9MRU4pKQorCQkJICAgICAgICBicmVhazsKKwkgICAgICAgIH0KKworCSAgICAgICAgLy8gRm91bmQsIHJlcGxhY2UgaXQKKwkgICAgICAgIGlmIChDYWNoZWRJZHggPCBQTUtJRF9OTykKKwkgICAgICAgIHsKKwkJICAgICAgICBEQkdQUklOVChSVF9ERUJVR19PRkYsICgiVXBkYXRlIFBNS0lELCBpZHggPSAlZFxuIiwgQ2FjaGVkSWR4KSk7CisJCSAgICAgICAgTmRpc01vdmVNZW1vcnkoJnBBZC0+U3RhQ2ZnLlNhdmVkUE1LW0NhY2hlZElkeF0uQlNTSURbMF0sIHBQbWtzYS0+YnNzaWQuc2FfZGF0YSwgTUFDX0FERFJfTEVOKTsKKwkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5TdGFDZmcuU2F2ZWRQTUtbQ2FjaGVkSWR4XS5QTUtJRFswXSwgcFBta3NhLT5wbWtpZCwgMTYpOworCQkgICAgICAgIHBBZC0+U3RhQ2ZnLlNhdmVkUE1LTnVtKys7CisJICAgICAgICB9CisJICAgICAgICAvLyBOb3QgZm91bmQsIHJlcGxhY2UgdGhlIGxhc3Qgb25lCisJICAgICAgICBlbHNlCisJICAgICAgICB7CisJCSAgICAgICAgLy8gUmFuZG9tbHkgcmVwbGFjZSBvbmUKKwkJICAgICAgICBDYWNoZWRJZHggPSAocFBta3NhLT5ic3NpZC5zYV9kYXRhWzVdICUgUE1LSURfTk8pOworCQkgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX09GRiwgKCJVcGRhdGUgUE1LSUQsIGlkeCA9ICVkXG4iLCBDYWNoZWRJZHgpKTsKKwkJICAgICAgICBOZGlzTW92ZU1lbW9yeSgmcEFkLT5TdGFDZmcuU2F2ZWRQTUtbQ2FjaGVkSWR4XS5CU1NJRFswXSwgcFBta3NhLT5ic3NpZC5zYV9kYXRhLCBNQUNfQUREUl9MRU4pOworCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPlN0YUNmZy5TYXZlZFBNS1tDYWNoZWRJZHhdLlBNS0lEWzBdLCBwUG1rc2EtPnBta2lkLCAxNik7CisJICAgICAgICB9CisKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoInJ0X2lvY3RsX3Npd3Bta3NhIC0gSVdfUE1LU0FfQUREXG4iKSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoInJ0X2lvY3RsX3Npd3Bta3NhIC0gVW5rbm93IENvbW1hbmQhIVxuIikpOworCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisjZW5kaWYgLy8gI2lmIFdJUkVMRVNTX0VYVCA+IDE3CisKKyNpZmRlZiBEQkcKK3N0YXRpYyBpbnQKK3J0X3ByaXZhdGVfaW9jdGxfYmJwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCXN0cnVjdCBpd19wb2ludCAqd3JxLCBjaGFyICpleHRyYSkKKwkJCXsKKwlDSEFSCQkJCSp0aGlzX2NoYXI7CisJQ0hBUgkJCQkqdmFsdWUgPSBOVUxMOworCVVDSEFSCQkJCXJlZ0JCUCA9IDA7CisJVUlOVDMyCQkJCWJicElkOworCVVJTlQzMgkJCQliYnBWYWx1ZTsKKwlCT09MRUFOCQkJCWJJc1ByaW50QWxsQkJQID0gRkFMU0U7CisJSU5UCQkJCQlTdGF0dXMgPSAwOworICAgIFBSVE1QX0FEQVBURVIgICAgICAgcEFkYXB0ZXIgPSBkZXYtPm1sX3ByaXY7CisKKworCW1lbXNldChleHRyYSwgMHgwMCwgSVdfUFJJVl9TSVpFX01BU0spOworCisJaWYgKHdycS0+bGVuZ3RoID4gMSkgLy9ObyBwYXJhbWV0ZXJzLgorCQkJCXsKKwkJc3ByaW50ZihleHRyYSwgIlxuIik7CisKKwkJLy9QYXJzaW5nIFJlYWQgb3IgV3JpdGUKKwkJdGhpc19jaGFyID0gd3JxLT5wb2ludGVyOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJ0aGlzX2NoYXI9JXNcbiIsIHRoaXNfY2hhcikpOworCQlpZiAoISp0aGlzX2NoYXIpCisJCQlnb3RvIG5leHQ7CisKKwkJaWYgKCh2YWx1ZSA9IHJ0c3RyY2hyKHRoaXNfY2hhciwgJz0nKSkgIT0gTlVMTCkKKwkJCSp2YWx1ZSsrID0gMDsKKworCQlpZiAoIXZhbHVlIHx8ICEqdmFsdWUpCisJCXsgLy9SZWFkCisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJ0aGlzX2NoYXI9JXMsIHZhbHVlPSVzXG4iLCB0aGlzX2NoYXIsIHZhbHVlKSk7CisJCQlpZiAoc3NjYW5mKHRoaXNfY2hhciwgIiVkIiwgJihiYnBJZCkpID09IDEpCisJCQl7CisJCQkJaWYgKGJicElkIDw9IDEzNikKKwkJCQl7CisjaWZkZWYgUkFMSU5LX0FURQorCQkJCQlpZiAoQVRFX09OKHBBZGFwdGVyKSkKKwkJCQkJeworCQkJCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkYXB0ZXIsIGJicElkLCAmcmVnQkJQKTsKKwkJCQkJfQorCQkJCQllbHNlCisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCQkJCQl7CisJCQkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWRhcHRlciwgYmJwSWQsICZyZWdCQlApOworCQkJCQl9CisJCQkJCXNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlIlMDJkWzB4JTAyWF06JTAyWFxuIiwgYmJwSWQsIGJicElkKjIsIHJlZ0JCUCk7CisgICAgICAgICAgICAgICAgICAgIHdycS0+bGVuZ3RoID0gc3RybGVuKGV4dHJhKSArIDE7IC8vIDE6IHNpemUgb2YgJ1wwJworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJtc2c9JXNcbiIsIGV4dHJhKSk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7Ly9JbnZhbGlkIHBhcmFtZXRlcywgc28gZGVmYXVsdCBwcmludGsgYWxsIGJicAorCQkJCQliSXNQcmludEFsbEJCUCA9IFRSVUU7CisJCQkJCWdvdG8gbmV4dDsKKwkJCQl9CisJCQl9CisJCQllbHNlCisJCQl7IC8vSW52YWxpZCBwYXJhbWV0ZXMsIHNvIGRlZmF1bHQgcHJpbnRrIGFsbCBiYnAKKwkJCQliSXNQcmludEFsbEJCUCA9IFRSVUU7CisJCQkJZ290byBuZXh0OworCQkJfQorCQl9CisJCWVsc2UKKwkJeyAvL1dyaXRlCisJCQlpZiAoKHNzY2FuZih0aGlzX2NoYXIsICIlZCIsICYoYmJwSWQpKSA9PSAxKSAmJiAoc3NjYW5mKHZhbHVlLCAiJXgiLCAmKGJicFZhbHVlKSkgPT0gMSkpCisJCQl7CisJCQkJaWYgKGJicElkIDw9IDEzNikKKwkJCQl7CisjaWZkZWYgUkFMSU5LX0FURQorCQkJCQlpZiAoQVRFX09OKHBBZGFwdGVyKSkKKwkJCQkJeworCQkJCQkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZGFwdGVyLCBiYnBJZCwgYmJwVmFsdWUpOworCQkJCQkJLy9SZWFkIGl0IGJhY2sgZm9yIHNob3dpbmcKKwkJCQkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZGFwdGVyLCBiYnBJZCwgJnJlZ0JCUCk7CisJCQkJCX0KKwkJCQkJZWxzZQorI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKwkJCQkJeworCQkJCQkgICAgUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWRhcHRlciwgYmJwSWQsIGJicFZhbHVlKTsKKyAgICAJCQkJCS8vUmVhZCBpdCBiYWNrIGZvciBzaG93aW5nCisgICAgCQkJCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkYXB0ZXIsIGJicElkLCAmcmVnQkJQKTsKKwkJCX0KKwkJCQkJc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiUiUwMmRbMHglMDJYXTolMDJYXG4iLCBiYnBJZCwgYmJwSWQqMiwgcmVnQkJQKTsKKyAgICAgICAgICAgICAgICAgICAgd3JxLT5sZW5ndGggPSBzdHJsZW4oZXh0cmEpICsgMTsgLy8gMTogc2l6ZSBvZiAnXDAnCisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIm1zZz0lc1xuIiwgZXh0cmEpKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsvL0ludmFsaWQgcGFyYW1ldGVzLCBzbyBkZWZhdWx0IHByaW50ayBhbGwgYmJwCisJCQkJCWJJc1ByaW50QWxsQkJQID0gVFJVRTsKKwkJCQkJZ290byBuZXh0OworCQkJCX0KKwkJCX0KKwkJCWVsc2UKKwkJCXsgLy9JbnZhbGlkIHBhcmFtZXRlcywgc28gZGVmYXVsdCBwcmludGsgYWxsIGJicAorCQkJCWJJc1ByaW50QWxsQkJQID0gVFJVRTsKKwkJCQlnb3RvIG5leHQ7CisJCQl9CisJCX0KKwkJfQorCWVsc2UKKwkJYklzUHJpbnRBbGxCQlAgPSBUUlVFOworCituZXh0OgorCWlmIChiSXNQcmludEFsbEJCUCkKKwl7CisJCW1lbXNldChleHRyYSwgMHgwMCwgSVdfUFJJVl9TSVpFX01BU0spOworCQlzcHJpbnRmKGV4dHJhLCAiXG4iKTsKKwkJZm9yIChiYnBJZCA9IDA7IGJicElkIDw9IDEzNjsgYmJwSWQrKykKKwkJeworCQkgICAgaWYgKHN0cmxlbihleHRyYSkgPj0gKElXX1BSSVZfU0laRV9NQVNLIC0gMTApKQorICAgICAgICAgICAgICAgIGJyZWFrOworI2lmZGVmIFJBTElOS19BVEUKKwkJCWlmIChBVEVfT04ocEFkYXB0ZXIpKQorCQkJeworCQkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZGFwdGVyLCBiYnBJZCwgJnJlZ0JCUCk7CisJCQl9CisJCQllbHNlCisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZGFwdGVyLCBiYnBJZCwgJnJlZ0JCUCk7CisJCQlzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJSJTAyZFsweCUwMlhdOiUwMlggICAgIiwgYmJwSWQsIGJicElkKjIsIHJlZ0JCUCk7CisJCQlpZiAoYmJwSWQlNSA9PSA0KQorCQkJCXNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlxuIik7CisJCX0KKworICAgICAgICB3cnEtPmxlbmd0aCA9IHN0cmxlbihleHRyYSkgKyAxOyAvLyAxOiBzaXplIG9mICdcMCcKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgid3JxLT5sZW5ndGggPSAlZFxuIiwgd3JxLT5sZW5ndGgpKTsKKwl9CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT1ydF9wcml2YXRlX2lvY3RsX2JicFxuXG4iKSk7CisKKyAgICByZXR1cm4gU3RhdHVzOworfQorI2VuZGlmIC8vIERCRyAvLworCitpbnQgcnRfaW9jdGxfc2l3cmF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCXVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworICAgIFBSVE1QX0FEQVBURVIgICBwQWQgPSBkZXYtPm1sX3ByaXY7CisgICAgVUlOVDMyICAgICAgICAgIHJhdGUgPSB3cnF1LT5iaXRyYXRlLnZhbHVlLCBmaXhlZCA9IHdycXUtPmJpdHJhdGUuZml4ZWQ7CisKKyAgICAvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgorCWlmKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCisJeworICAJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoInJ0X2lvY3RsX3Npd3JhdGU6Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKyAgICAJcmV0dXJuIC1FTkVURE9XTjsKKwl9CisKKyAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJydF9pb2N0bF9zaXdyYXRlOjoocmF0ZSA9ICVkLCBmaXhlZCA9ICVkKVxuIiwgcmF0ZSwgZml4ZWQpKTsKKyAgICAvKiByYXRlID0gLTEgPT4gYXV0byByYXRlCisgICAgICAgcmF0ZSA9IFgsIGZpeGVkID0gMSA9PiAoZml4ZWQgcmF0ZSBYKQorICAgICovCisgICAgaWYgKHJhdGUgPT0gLTEpCisgICAgeworCQkvL0F1dG8gUmF0ZQorCQlwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU19BVVRPOworCQlwQWQtPlN0YUNmZy5iQXV0b1R4UmF0ZVN3aXRjaCA9IFRSVUU7CisJCWlmICgocEFkLT5Db21tb25DZmcuUGh5TW9kZSA8PSBQSFlfMTFHKSB8fAorCQkgICAgKHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLk1PREUgPD0gTU9ERV9PRkRNKSkKKwkJCVJUTVBTZXREZXNpcmVkUmF0ZXMocEFkLCAtMSk7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJU2V0Q29tbW9uSFQocEFkKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYgKGZpeGVkKQorICAgICAgICB7CisgICAgICAgIAlwQWQtPlN0YUNmZy5iQXV0b1R4UmF0ZVN3aXRjaCA9IEZBTFNFOworICAgICAgICAgICAgaWYgKChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlIDw9IFBIWV8xMUcpIHx8CisgICAgICAgICAgICAgICAgKHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLk1PREUgPD0gTU9ERV9PRkRNKSkKKyAgICAgICAgICAgICAgICBSVE1QU2V0RGVzaXJlZFJhdGVzKHBBZCwgcmF0ZSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfQVVUTzsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKyAgICAgICAgICAgICAgICBTZXRDb21tb25IVChwQWQpOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworICAgICAgICAgICAgfQorICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgicnRfaW9jdGxfc2l3cmF0ZTo6KEh0TWNzPSVkKVxuIixwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUykpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLy8gVE9ETzogcmF0ZSA9IFgsIGZpeGVkID0gMCA9PiAocmF0ZXMgPD0gWCkKKyAgICAgICAgICAgIHJldHVybiAtRU9QTk9UU1VQUDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCitpbnQgcnRfaW9jdGxfZ2l3cmF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisgICAgUFJUTVBfQURBUFRFUiAgIHBBZCA9IGRldi0+bWxfcHJpdjsKKyAgICBpbnQgcmF0ZV9pbmRleCA9IDAsIHJhdGVfY291bnQgPSAwOworICAgIEhUVFJBTlNNSVRfU0VUVElORyBodF9zZXR0aW5nOworICAgIF9fczMyIHJhbGlua3JhdGVbXSA9CisJezIsICA0LCAgIDExLCAgMjIsIC8vIENDSworCTEyLCAxOCwgICAyNCwgIDM2LCA0OCwgNzIsIDk2LCAxMDgsIC8vIE9GRE0KKwkxMywgMjYsICAgMzksICA1MiwgIDc4LCAxMDQsIDExNywgMTMwLCAyNiwgIDUyLCAgNzgsIDEwNCwgMTU2LCAyMDgsIDIzNCwgMjYwLCAvLyAyME1IeiwgODAwbnMgR0ksIE1DUzogMCB+IDE1CisJMzksIDc4LCAgMTE3LCAxNTYsIDIzNCwgMzEyLCAzNTEsIDM5MCwJCQkJCQkJCQkJICAvLyAyME1IeiwgODAwbnMgR0ksIE1DUzogMTYgfiAyMworCTI3LCA1NCwgICA4MSwgMTA4LCAxNjIsIDIxNiwgMjQzLCAyNzAsIDU0LCAxMDgsIDE2MiwgMjE2LCAzMjQsIDQzMiwgNDg2LCA1NDAsIC8vIDQwTUh6LCA4MDBucyBHSSwgTUNTOiAwIH4gMTUKKwk4MSwgMTYyLCAyNDMsIDMyNCwgNDg2LCA2NDgsIDcyOSwgODEwLAkJCQkJCQkJCQkgIC8vIDQwTUh6LCA4MDBucyBHSSwgTUNTOiAxNiB+IDIzCisJMTQsIDI5LCAgIDQzLCAgNTcsICA4NywgMTE1LCAxMzAsIDE0NCwgMjksIDU5LCAgIDg3LCAxMTUsIDE3MywgMjMwLCAyNjAsIDI4OCwgLy8gMjBNSHosIDQwMG5zIEdJLCBNQ1M6IDAgfiAxNQorCTQzLCA4NywgIDEzMCwgMTczLCAyNjAsIDMxNywgMzkwLCA0MzMsCQkJCQkJCQkJCSAgLy8gMjBNSHosIDQwMG5zIEdJLCBNQ1M6IDE2IH4gMjMKKwkzMCwgNjAsICAgOTAsIDEyMCwgMTgwLCAyNDAsIDI3MCwgMzAwLCA2MCwgMTIwLCAxODAsIDI0MCwgMzYwLCA0ODAsIDU0MCwgNjAwLCAvLyA0ME1IeiwgNDAwbnMgR0ksIE1DUzogMCB+IDE1CisJOTAsIDE4MCwgMjcwLCAzNjAsIDU0MCwgNzIwLCA4MTAsIDkwMH07CQkJCQkJCQkJCSAgLy8gNDBNSHosIDQwMG5zIEdJLCBNQ1M6IDE2IH4gMjMKKworICAgIHJhdGVfY291bnQgPSBzaXplb2YocmFsaW5rcmF0ZSkvc2l6ZW9mKF9fczMyKTsKKyAgICAvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgorCWlmKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCisJeworICAJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKyAgICAJcmV0dXJuIC1FTkVURE9XTjsKKwl9CisKKyAgICBpZiAoKHBBZC0+U3RhQ2ZnLmJBdXRvVHhSYXRlU3dpdGNoID09IEZBTFNFKSAmJgorICAgICAgICAoSU5GUkFfT04ocEFkKSkgJiYKKyAgICAgICAgKChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlIDw9IFBIWV8xMUcpIHx8IChwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkhUUGh5TW9kZS5maWVsZC5NT0RFIDw9IE1PREVfT0ZETSkpKQorICAgICAgICBodF9zZXR0aW5nLndvcmQgPSBwQWQtPlN0YUNmZy5IVFBoeU1vZGUud29yZDsKKyAgICBlbHNlCisgICAgICAgIGh0X3NldHRpbmcud29yZCA9IHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLndvcmQ7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKyAgICBpZiAoaHRfc2V0dGluZy5maWVsZC5NT0RFID49IE1PREVfSFRNSVgpCisgICAgeworICAgIAlyYXRlX2luZGV4ID0gMTIgKyAoKFVDSEFSKWh0X3NldHRpbmcuZmllbGQuQlcgKjI0KSArICgoVUNIQVIpaHRfc2V0dGluZy5maWVsZC5TaG9ydEdJICo0OCkgKyAoKFVDSEFSKWh0X3NldHRpbmcuZmllbGQuTUNTKTsKKyAgICB9CisgICAgZWxzZQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworICAgIGlmIChodF9zZXR0aW5nLmZpZWxkLk1PREUgPT0gTU9ERV9PRkRNKQorICAgIAlyYXRlX2luZGV4ID0gKFVDSEFSKShodF9zZXR0aW5nLmZpZWxkLk1DUykgKyA0OworICAgIGVsc2UgaWYgKGh0X3NldHRpbmcuZmllbGQuTU9ERSA9PSBNT0RFX0NDSykKKyAgICAJcmF0ZV9pbmRleCA9IChVQ0hBUikoaHRfc2V0dGluZy5maWVsZC5NQ1MpOworCisgICAgaWYgKHJhdGVfaW5kZXggPCAwKQorICAgICAgICByYXRlX2luZGV4ID0gMDsKKworICAgIGlmIChyYXRlX2luZGV4ID4gcmF0ZV9jb3VudCkKKyAgICAgICAgcmF0ZV9pbmRleCA9IHJhdGVfY291bnQ7CisKKyAgICB3cnF1LT5iaXRyYXRlLnZhbHVlID0gcmFsaW5rcmF0ZVtyYXRlX2luZGV4XSAqIDUwMDAwMDsKKyAgICB3cnF1LT5iaXRyYXRlLmRpc2FibGVkID0gMDsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgY29uc3QgaXdfaGFuZGxlciBydF9oYW5kbGVyW10gPQoreworCShpd19oYW5kbGVyKSBOVUxMLAkJCSAgICAgICAgICAgIC8qIFNJT0NTSVdDT01NSVQgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3bmFtZSwJCQkvKiBTSU9DR0lXTkFNRSAgICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkJICAgICAgICAgICAgLyogU0lPQ1NJV05XSUQgICAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJCSAgICAgICAgICAgIC8qIFNJT0NHSVdOV0lEICAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfc2l3ZnJlcSwJCSAgICAvKiBTSU9DU0lXRlJFUSAgICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX2dpd2ZyZXEsCQkgICAgLyogU0lPQ0dJV0ZSRVEgICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9zaXdtb2RlLAkJICAgIC8qIFNJT0NTSVdNT0RFICAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3bW9kZSwJCSAgICAvKiBTSU9DR0lXTU9ERSAgICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkgICAgICAgICAgICAgICAgLyogU0lPQ1NJV1NFTlMgICAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJICAgICAgICAgICAgICAgIC8qIFNJT0NHSVdTRU5TICAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCAvKiBub3QgdXNlZCAqLywJCS8qIFNJT0NTSVdSQU5HRSAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3cmFuZ2UsCQkgICAgLyogU0lPQ0dJV1JBTkdFICAqLworCShpd19oYW5kbGVyKSBOVUxMIC8qIG5vdCB1c2VkICovLAkJLyogU0lPQ1NJV1BSSVYgICAqLworCShpd19oYW5kbGVyKSBOVUxMIC8qIGtlcm5lbCBjb2RlICovLCAgICAvKiBTSU9DR0lXUFJJViAgICovCisJKGl3X2hhbmRsZXIpIE5VTEwgLyogbm90IHVzZWQgKi8sCQkvKiBTSU9DU0lXU1RBVFMgICovCisJKGl3X2hhbmRsZXIpIHJ0Mjh4eF9nZXRfd2lyZWxlc3Nfc3RhdHMgLyoga2VybmVsIGNvZGUgKi8sICAgIC8qIFNJT0NHSVdTVEFUUyAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCSAgICAgICAgICAgICAgICAvKiBTSU9DU0lXU1BZICAgICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkgICAgICAgICAgICAgICAgLyogU0lPQ0dJV1NQWSAgICAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJCQkgICAgICAgIC8qIFNJT0NTSVdUSFJTUFkgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCQkJICAgICAgICAvKiBTSU9DR0lXVEhSU1BZICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3Npd2FwLCAgICAgICAgICAgIC8qIFNJT0NTSVdBUCAgICAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3YXAsCQkgICAgLyogU0lPQ0dJV0FQICAgICAqLworI2lmZGVmIFNJT0NTSVdNTE1FCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3Npd21sbWUsCSAgICAgICAgLyogU0lPQ1NJV01MTUUgICAqLworI2Vsc2UKKwkoaXdfaGFuZGxlcikgTlVMTCwJCQkJICAgICAgICAvKiBTSU9DU0lXTUxNRSAqLworI2VuZGlmIC8vIFNJT0NTSVdNTE1FIC8vCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX2l3YXBsaXN0LAkJICAgIC8qIFNJT0NHSVdBUExJU1QgKi8KKyNpZmRlZiBTSU9DR0lXU0NBTgorCShpd19oYW5kbGVyKSBydF9pb2N0bF9zaXdzY2FuLAkJICAgIC8qIFNJT0NTSVdTQ0FOICAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3c2NhbiwJCSAgICAvKiBTSU9DR0lXU0NBTiAgICovCisjZWxzZQorCShpd19oYW5kbGVyKSBOVUxMLAkJCQkgICAgICAgIC8qIFNJT0NTSVdTQ0FOICAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCQkJICAgICAgICAvKiBTSU9DR0lXU0NBTiAgICovCisjZW5kaWYgLyogU0lPQ0dJV1NDQU4gKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfc2l3ZXNzaWQsCQkgICAgLyogU0lPQ1NJV0VTU0lEICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9naXdlc3NpZCwJCSAgICAvKiBTSU9DR0lXRVNTSUQgICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3Npd25pY2tuLAkJICAgIC8qIFNJT0NTSVdOSUNLTiAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3bmlja24sCQkgICAgLyogU0lPQ0dJV05JQ0tOICAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJCQkgICAgICAgIC8qIC0tIGhvbGUgLS0gICAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCQkJICAgICAgICAvKiAtLSBob2xlIC0tICAgICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3Npd3JhdGUsICAgICAgICAgIC8qIFNJT0NTSVdSQVRFICAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3cmF0ZSwgICAgICAgICAgLyogU0lPQ0dJV1JBVEUgICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9zaXdydHMsCQkgICAgLyogU0lPQ1NJV1JUUyAgICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9naXdydHMsCQkgICAgLyogU0lPQ0dJV1JUUyAgICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9zaXdmcmFnLAkJICAgIC8qIFNJT0NTSVdGUkFHICAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3ZnJhZywJCSAgICAvKiBTSU9DR0lXRlJBRyAgICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkgICAgICAgICAgICAgICAgLyogU0lPQ1NJV1RYUE9XICAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJICAgICAgICAgICAgICAgIC8qIFNJT0NHSVdUWFBPVyAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCSAgICAgICAgICAgICAgICAvKiBTSU9DU0lXUkVUUlkgICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkgICAgICAgICAgICAgICAgLyogU0lPQ0dJV1JFVFJZICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9zaXdlbmNvZGUsCQkvKiBTSU9DU0lXRU5DT0RFICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX2dpd2VuY29kZSwJCS8qIFNJT0NHSVdFTkNPREUgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCSAgICAgICAgICAgICAgICAvKiBTSU9DU0lXUE9XRVIgICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkgICAgICAgICAgICAgICAgLyogU0lPQ0dJV1BPV0VSICAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJCQkJCS8qIC0tIGhvbGUgLS0gKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCQkJCQkvKiAtLSBob2xlIC0tICovCisjaWYgV0lSRUxFU1NfRVhUID4gMTcKKyAgICAoaXdfaGFuZGxlcikgcnRfaW9jdGxfc2l3Z2VuaWUsICAgICAgICAgLyogU0lPQ1NJV0dFTklFICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9naXdnZW5pZSwgICAgICAgICAvKiBTSU9DR0lXR0VOSUUgICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3Npd2F1dGgsCQkgICAgLyogU0lPQ1NJV0FVVEggICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9naXdhdXRoLAkJICAgIC8qIFNJT0NHSVdBVVRIICAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfc2l3ZW5jb2RlZXh0LAkgICAgLyogU0lPQ1NJV0VOQ09ERUVYVCAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9naXdlbmNvZGVleHQsCQkvKiBTSU9DR0lXRU5DT0RFRVhUICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3Npd3Bta3NhLCAgICAgICAgIC8qIFNJT0NTSVdQTUtTQSAgKi8KKyNlbmRpZgorfTsKKworc3RhdGljIGNvbnN0IGl3X2hhbmRsZXIgcnRfcHJpdl9oYW5kbGVyc1tdID0geworCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MDAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDAxICovCisjaWZuZGVmIENPTkZJR19BUF9TVVBQT1JUCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3NldHBhcmFtLCAvKiArIDB4MDIgKi8KKyNlbHNlCisJKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgwMiAqLworI2VuZGlmIC8vIENPTkZJR19BUF9TVVBQT1JUIC8vCisjaWZkZWYgREJHCisJKGl3X2hhbmRsZXIpIHJ0X3ByaXZhdGVfaW9jdGxfYmJwLCAvKiArIDB4MDMgKi8KKyNlbHNlCisJKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgwMyAqLworI2VuZGlmCisJKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgwNCAqLworCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MDUgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDA2ICovCisJKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgwNyAqLworCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MDggKi8KKwkoaXdfaGFuZGxlcikgcnRfcHJpdmF0ZV9nZXRfc3RhdGlzdGljcywgLyogKyAweDA5ICovCisJKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgwQSAqLworCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MEIgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDBDICovCisJKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgwRCAqLworCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MEUgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDBGICovCisJKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgxMCAqLworCShpd19oYW5kbGVyKSBydF9wcml2YXRlX3Nob3csIC8qICsgMHgxMSAqLworICAgIChpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MTIgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDEzICovCisJKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgxNSAqLworCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MTcgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDE4ICovCit9OworCitjb25zdCBzdHJ1Y3QgaXdfaGFuZGxlcl9kZWYgcnQyOHh4X2l3X2hhbmRsZXJfZGVmID0KK3sKKyNkZWZpbmUJTihhKQkoc2l6ZW9mIChhKSAvIHNpemVvZiAoYVswXSkpCisJLnN0YW5kYXJkCT0gKGl3X2hhbmRsZXIgKikgcnRfaGFuZGxlciwKKwkubnVtX3N0YW5kYXJkCT0gc2l6ZW9mKHJ0X2hhbmRsZXIpIC8gc2l6ZW9mKGl3X2hhbmRsZXIpLAorCS5wcml2YXRlCT0gKGl3X2hhbmRsZXIgKikgcnRfcHJpdl9oYW5kbGVycywKKwkubnVtX3ByaXZhdGUJCT0gTihydF9wcml2X2hhbmRsZXJzKSwKKwkucHJpdmF0ZV9hcmdzCT0gKHN0cnVjdCBpd19wcml2X2FyZ3MgKikgcHJpdnRhYiwKKwkubnVtX3ByaXZhdGVfYXJncwk9IE4ocHJpdnRhYiksCisjaWYgSVdfSEFORExFUl9WRVJTSU9OID49IDcKKyAgICAuZ2V0X3dpcmVsZXNzX3N0YXRzID0gcnQyOHh4X2dldF93aXJlbGVzc19zdGF0cywKKyNlbmRpZgorfTsKKworSU5UIFJUTVBTZXRJbmZvcm1hdGlvbigKKyAgICBJTiAgUFJUTVBfQURBUFRFUiBwQWRhcHRlciwKKyAgICBJTiAgT1VUIHN0cnVjdCBpZnJlcSAgICAqcnEsCisgICAgSU4gIElOVCAgICAgICAgICAgICAgICAgY21kKQoreworICAgIHN0cnVjdCBpd3JlcSAgICAgICAgICAgICAgICAgICAgICAgICp3cnEgPSAoc3RydWN0IGl3cmVxICopIHJxOworICAgIE5ESVNfODAyXzExX1NTSUQgICAgICAgICAgICAgICAgICAgIFNzaWQ7CisgICAgTkRJU184MDJfMTFfTUFDX0FERFJFU1MgICAgICAgICAgICAgQnNzaWQ7CisgICAgUlRfODAyXzExX1BIWV9NT0RFICAgICAgICAgICAgICAgICAgUGh5TW9kZTsKKyAgICBSVF84MDJfMTFfU1RBX0NPTkZJRyAgICAgICAgICAgICAgICBTdGFDb25maWc7CisgICAgTkRJU184MDJfMTFfUkFURVMgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXM7CisgICAgUlRfODAyXzExX1BSRUFNQkxFICAgICAgICAgICAgICAgICAgUHJlYW1ibGU7CisgICAgTkRJU184MDJfMTFfV0VQX1NUQVRVUyAgICAgICAgICAgICAgV2VwU3RhdHVzOworICAgIE5ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREUgICAgIEF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlTWF4OworICAgIE5ESVNfODAyXzExX05FVFdPUktfSU5GUkFTVFJVQ1RVUkUgIEJzc1R5cGU7CisgICAgTkRJU184MDJfMTFfUlRTX1RIUkVTSE9MRCAgICAgICAgICAgUnRzVGhyZXNoOworICAgIE5ESVNfODAyXzExX0ZSQUdNRU5UQVRJT05fVEhSRVNIT0xEIEZyYWdUaHJlc2g7CisgICAgTkRJU184MDJfMTFfUE9XRVJfTU9ERSAgICAgICAgICAgICAgUG93ZXJNb2RlOworICAgIFBORElTXzgwMl8xMV9LRVkgICAgICAgICAgICAgICAgICAgIHBLZXkgPSBOVUxMOworICAgIFBORElTXzgwMl8xMV9XRVAJCQkgICAgICAgIHBXZXBLZXkgPU5VTEw7CisgICAgUE5ESVNfODAyXzExX1JFTU9WRV9LRVkgICAgICAgICAgICAgcFJlbW92ZUtleSA9IE5VTEw7CisgICAgTkRJU184MDJfMTFfQ09ORklHVVJBVElPTiAgICAgICAgICAgQ29uZmlnLCAqcENvbmZpZyA9IE5VTEw7CisgICAgTkRJU184MDJfMTFfTkVUV09SS19UWVBFICAgICAgICAgICAgTmV0VHlwZTsKKyAgICBVTE9ORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3c7CisgICAgVUlOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5SWR4ID0gMDsKKyAgICBJTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTLCBNYXhQaHlNb2RlID0gUEhZXzExRzsKKyAgICBVTE9ORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb3dlclRlbXA7CisgICAgQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmFkaW9TdGF0ZTsKKyAgICBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0ZU1hY2hpbmVUb3VjaGVkID0gRkFMU0U7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJT0lEX1NFVF9IVF9QSFlNT0RFCQkJCQlIVF9QaHlNb2RlOwkvLzExbiAsa2F0aHkKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgUE5ESVNfODAyXzExX1BNS0lEICAgICAgICAgICAgICAgICAgcFBta0lkID0gTlVMTDsKKyAgICBCT09MRUFOCQkJCSAgICAgICAgICAgICAgICBJRUVFODAyMXhTdGF0ZSA9IEZBTFNFOworICAgIEJPT0xFQU4JCQkJICAgICAgICAgICAgICAgIElFRUU4MDIxeF9yZXF1aXJlZF9rZXlzID0gRkFMU0U7CisgICAgVUNIQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3BhX3N1cHBsaWNhbnRfZW5hYmxlID0gMDsKKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisKKyNpZmRlZiBTTk1QX1NVUFBPUlQKKwlUWF9SVFlfQ0ZHX1NUUlVDCQkJdHhfcnR5X2NmZzsKKwlVTE9ORwkJCQkJCVNob3J0UmV0cnlMaW1pdCwgTG9uZ1JldHJ5TGltaXQ7CisJVUNIQVIJCQkJCQljdG1wOworI2VuZGlmIC8vIFNOTVBfU1VQUE9SVCAvLworCisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwlNYXhQaHlNb2RlID0gUEhZXzExTl81RzsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+UlRNUFNldEluZm9ybWF0aW9uKCksCTB4JTA4eFxuIiwgY21kJjB4N0ZGRikpOworICAgIHN3aXRjaChjbWQgJiAweDdGRkYpIHsKKyAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX0NPVU5UUllfUkVHSU9OOgorICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCA8IHNpemVvZihVQ0hBUikpCisgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVJTlZBTDsKKwkJCS8vIE9ubHkgYXZhbGlhYmxlIHdoZW4gRUVQUk9NIG5vdCBwcm9ncmFtbWluZworICAgICAgICAgICAgZWxzZSBpZiAoIShwQWRhcHRlci0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb24gJiAweDgwKSAmJiAhKHBBZGFwdGVyLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbkZvckFCYW5kICYgMHg4MCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVUxPTkcgICBDb3VudHJ5OworICAgICAgICAgICAgICAgIFVDSEFSCVRtcFBoeTsKKworCQkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZDb3VudHJ5LCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbiA9IChVQ0hBUikoQ291bnRyeSAmIDB4MDAwMDAwRkYpOworCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbkZvckFCYW5kID0gKFVDSEFSKSgoQ291bnRyeSA+PiA4KSAmIDB4MDAwMDAwRkYpOworICAgICAgICAgICAgICAgIFRtcFBoeSA9IHBBZGFwdGVyLT5Db21tb25DZmcuUGh5TW9kZTsKKwkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLlBoeU1vZGUgPSAweGZmOworCQkJCS8vIEJ1aWxkIGFsbCBjb3JyZXNwb25kaW5nIGNoYW5uZWwgaW5mb3JtYXRpb24KKwkJCQlSVE1QU2V0UGh5TW9kZShwQWRhcHRlciwgVG1wUGh5KTsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCQlTZXRDb21tb25IVChwQWRhcHRlcik7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpSVF9PSURfODAyXzExX0NPVU5UUllfUkVHSU9OIChBOiVkICBCL0c6JWQpXG4iLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb25Gb3JBQmFuZCwKKwkJCQkgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX0JTU0lEX0xJU1RfU0NBTjoKKyAjaWZkZWYgUkFMSU5LX0FURQorCQkJaWYgKEFURV9PTihwQWRhcHRlcikpCisJCQl7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiVGhlIGRyaXZlciBpcyBpbiBBVEUgbW9kZSBub3dcbiIpKTsKKwkJCQlicmVhazsKKwkJCX0KKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisgICAgICAgICAgICBOb3cgPSBqaWZmaWVzOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX0JTU0lEX0xJU1RfU0NBTiwgVHhDbnQgPSAlZCBcbiIsIHBBZGFwdGVyLT5SYWxpbmtDb3VudGVycy5MYXN0T25lU2VjVG90YWxUeENvdW50KSk7CisKKyAgICAgICAgICAgIGlmIChNT05JVE9SX09OKHBBZGFwdGVyKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgRHJpdmVyIGlzIGluIE1vbml0b3IgTW9kZSBub3cgISEhXG4iKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKwkJCS8vQmVuc29uIGFkZCAyMDA4MDUyNywgd2hlbiByYWRpbyBvZmYsIHN0YSBkb24ndCBuZWVkIHRvIHNjYW4KKwkJCWlmIChSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9SQURJT19PRkYpKQorCQkJCWJyZWFrOworCisJCQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpKQorCQkJeworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISBEcml2ZXIgaXMgc2Nhbm5pbmcgbm93ICEhIVxuIikpOworCQkJCXBBZGFwdGVyLT5TdGFDZmcuYlNjYW5SZXFJc0Zyb21XZWJVSSA9IFRSVUU7CisJCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworCQkJaWYgKHBBZGFwdGVyLT5SYWxpbmtDb3VudGVycy5MYXN0T25lU2VjVG90YWxUeENvdW50ID4gMTAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISBMaW5rIFVQLCBpZ25vcmUgdGhpcyBzZXQ6Ok9JRF84MDJfMTFfQlNTSURfTElTVF9TQ0FOXG4iKSk7CisJCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKwkJCQlwQWRhcHRlci0+U3RhQ2ZnLlNjYW5DbnQgPSA5OTsJCS8vIFByZXZlbnQgYXV0byBzY2FuIHRyaWdnZXJlZCBieSB0aGlzIE9JRAorCQkJCWJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWRhcHRlciwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpKSAmJgorCQkJCSgocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpIHx8CisJCQkJKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKSB8fAorCQkJCShwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIpIHx8CisJCQkJKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykpICYmCisgICAgICAgICAgICAgICAgKHBBZGFwdGVyLT5TdGFDZmcuUG9ydFNlY3VyZWQgPT0gV1BBXzgwMl8xWF9QT1JUX05PVF9TRUNVUkVEKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgTGluayBVUCwgUG9ydCBOb3QgU2VjdXJlZCEgaWdub3JlIHRoaXMgc2V0OjpPSURfODAyXzExX0JTU0lEX0xJU1RfU0NBTlxuIikpOworCQkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisJCQkJcEFkYXB0ZXItPlN0YUNmZy5TY2FuQ250ID0gOTk7CQkvLyBQcmV2ZW50IGF1dG8gc2NhbiB0cmlnZ2VyZWQgYnkgdGhpcyBPSUQKKwkJCQlicmVhazsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICBpZiAocEFkYXB0ZXItPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlICE9IENOVExfSURMRSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBSVDI4WFhfTUxNRV9SRVNFVF9TVEFURV9NQUNISU5FKHBBZGFwdGVyKTsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgTUxNRSBidXN5LCByZXNldCBNTE1FIHN0YXRlIG1hY2hpbmUgISEhXG4iKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHRlbGwgQ05UTCBzdGF0ZSBtYWNoaW5lIHRvIGNhbGwgTmRpc01TZXRJbmZvcm1hdGlvbkNvbXBsZXRlKCkgYWZ0ZXIgY29tcGxldGluZworICAgICAgICAgICAgLy8gdGhpcyByZXF1ZXN0LCBiZWNhdXNlIHRoaXMgcmVxdWVzdCBpcyBpbml0aWF0ZWQgYnkgTkRJUy4KKyAgICAgICAgICAgIHBBZGFwdGVyLT5NbG1lQXV4LkN1cnJSZXFJc0Zyb21OZGlzID0gRkFMU0U7CisgICAgICAgICAgICAvLyBSZXNldCBhbGxvd2VkIHNjYW4gcmV0cmllcworICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5TY2FuQ250ID0gMDsKKyAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuTGFzdFNjYW5UaW1lID0gTm93OworCisJCQlwQWRhcHRlci0+U3RhQ2ZnLmJTY2FuUmVxSXNGcm9tV2ViVUkgPSBUUlVFOworICAgICAgICAgICAgUlRNUF9TRVRfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUyk7CisgICAgICAgICAgICBNbG1lRW5xdWV1ZShwQWRhcHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLAorICAgICAgICAgICAgICAgICAgICAgICAgT0lEXzgwMl8xMV9CU1NJRF9MSVNUX1NDQU4sCisgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgICAgICAgICAgIFN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisgICAgICAgICAgICBTdGF0ZU1hY2hpbmVUb3VjaGVkID0gVFJVRTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfU1NJRDoKKyAgICAgICAgICAgIGlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKE5ESVNfODAyXzExX1NTSUQpKQorICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAJUENIQVIgcFNzaWRTdHJpbmcgPSBOVUxMOworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZTc2lkLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX1NTSUQgKExlbj0lZCxTc2lkPSVzKVxuIiwgU3NpZC5Tc2lkTGVuZ3RoLCBTc2lkLlNzaWQpKTsKKyAgICAgICAgICAgICAgICBpZiAoU3NpZC5Tc2lkTGVuZ3RoID4gTUFYX0xFTl9PRl9TU0lEKQorICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgCWlmIChTc2lkLlNzaWRMZW5ndGggPT0gMCkKKyAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgIAkJU2V0X1NTSURfUHJvYyhwQWRhcHRlciwgIiIpOworICAgICAgICAgICAgICAgIAl9CisJCQkJCWVsc2UKKyAgICAgICAgICAgICAgICAJeworCSAgICAgICAgICAgICAgICAJcFNzaWRTdHJpbmcgPSAoQ0hBUiAqKSBrbWFsbG9jKE1BWF9MRU5fT0ZfU1NJRCsxLCBNRU1fQUxMT0NfRkxBRyk7CisJCQkJCQlpZiAocFNzaWRTdHJpbmcpCisJCQkJCQl7CisJCQkJCQkJTmRpc1plcm9NZW1vcnkocFNzaWRTdHJpbmcsIE1BWF9MRU5fT0ZfU1NJRCsxKTsKKwkJCQkJCQlOZGlzTW92ZU1lbW9yeShwU3NpZFN0cmluZywgU3NpZC5Tc2lkLCBTc2lkLlNzaWRMZW5ndGgpOworCSAgICAgICAgICAgICAgICAJCVNldF9TU0lEX1Byb2MocEFkYXB0ZXIsIHBTc2lkU3RyaW5nKTsKKwkJCQkJCQlrZnJlZShwU3NpZFN0cmluZyk7CisJCQkJCQl9CisJCQkJCQllbHNlCisJCQkJCQkJU3RhdHVzID0gLUVOT01FTTsKKyAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfQlNTSUQ6CisjaWZkZWYgUkFMSU5LX0FURQorCQkJaWYgKEFURV9PTihwQWRhcHRlcikpCisJCQl7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiVGhlIGRyaXZlciBpcyBpbiBBVEUgbW9kZSBub3dcbiIpKTsKKwkJCQlicmVhazsKKwkJCX0KKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisgICAgICAgICAgICBpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihORElTXzgwMl8xMV9NQUNfQUREUkVTUykpCisgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJkJzc2lkLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCisgICAgICAgICAgICAgICAgLy8gdGVsbCBDTlRMIHN0YXRlIG1hY2hpbmUgdG8gY2FsbCBOZGlzTVNldEluZm9ybWF0aW9uQ29tcGxldGUoKSBhZnRlciBjb21wbGV0aW5nCisgICAgICAgICAgICAgICAgLy8gdGhpcyByZXF1ZXN0LCBiZWNhdXNlIHRoaXMgcmVxdWVzdCBpcyBpbml0aWF0ZWQgYnkgTkRJUy4KKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+TWxtZUF1eC5DdXJyUmVxSXNGcm9tTmRpcyA9IEZBTFNFOworCisJCQkJLy8gUHJldmVudCB0byBjb25uZWN0IEFQIGFnYWluIGluIFNUQU1sbWVQZXJpb2RpY0V4ZWMKKwkJCQlwQWRhcHRlci0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbj0gMzI7CisKKyAgICAgICAgICAgICAgICAvLyBSZXNldCBhbGxvd2VkIHNjYW4gcmV0cmllcworCQkJCXBBZGFwdGVyLT5TdGFDZmcuU2NhbkNudCA9IDA7CisKKyAgICAgICAgICAgICAgICBpZiAocEFkYXB0ZXItPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlICE9IENOVExfSURMRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFJUMjhYWF9NTE1FX1JFU0VUX1NUQVRFX01BQ0hJTkUocEFkYXB0ZXIpOworICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgTUxNRSBidXN5LCByZXNldCBNTE1FIHN0YXRlIG1hY2hpbmUgISEhXG4iKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIE1sbWVFbnF1ZXVlKHBBZGFwdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9JRF84MDJfMTFfQlNTSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKE5ESVNfODAyXzExX01BQ19BRERSRVNTKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVk9JRCAqKSZCc3NpZCk7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKyAgICAgICAgICAgICAgICBTdGF0ZU1hY2hpbmVUb3VjaGVkID0gVFJVRTsKKworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9CU1NJRCAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCc3NpZFswXSwgQnNzaWRbMV0sIEJzc2lkWzJdLCBCc3NpZFszXSwgQnNzaWRbNF0sIEJzc2lkWzVdKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX1JBRElPOgorICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoQk9PTEVBTikpCisgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJlJhZGlvU3RhdGUsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpSVF9PSURfODAyXzExX1JBRElPICg9JWQpXG4iLCBSYWRpb1N0YXRlKSk7CisgICAgICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuYlN3UmFkaW8gIT0gUmFkaW9TdGF0ZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuYlN3UmFkaW8gPSBSYWRpb1N0YXRlOworICAgICAgICAgICAgICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5iUmFkaW8gIT0gKHBBZGFwdGVyLT5TdGFDZmcuYkh3UmFkaW8gJiYgcEFkYXB0ZXItPlN0YUNmZy5iU3dSYWRpbykpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuYlJhZGlvID0gKHBBZGFwdGVyLT5TdGFDZmcuYkh3UmFkaW8gJiYgcEFkYXB0ZXItPlN0YUNmZy5iU3dSYWRpbyk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5iUmFkaW8gPT0gVFJVRSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNbG1lUmFkaW9PbihwQWRhcHRlcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVXBkYXRlIGV4dHJhIGluZm9ybWF0aW9uCisJCQkJCQkJcEFkYXB0ZXItPkV4dHJhSW5mbyA9IEVYVFJBX0lORk9fQ0xFQVI7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWxtZVJhZGlvT2ZmKHBBZGFwdGVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgZXh0cmEgaW5mb3JtYXRpb24KKwkJCQkJCQlwQWRhcHRlci0+RXh0cmFJbmZvID0gU1dfUkFESU9fT0ZGOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9QSFlfTU9ERToKKyAgICAgICAgICAgIGlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKFJUXzgwMl8xMV9QSFlfTU9ERSkpCisgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJlBoeU1vZGUsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQkJaWYgKFBoeU1vZGUgPD0gTWF4UGh5TW9kZSkKKwkJCQl7CisgICAgICAgICAgICAgICAgCVJUTVBTZXRQaHlNb2RlKHBBZGFwdGVyLCBQaHlNb2RlKTsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCQkJU2V0Q29tbW9uSFQocEFkYXB0ZXIpOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQkJCX0KKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OlJUX09JRF84MDJfMTFfUEhZX01PREUgKD0lZClcbiIsIFBoeU1vZGUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfU1RBX0NPTkZJRzoKKyAgICAgICAgICAgIGlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKFJUXzgwMl8xMV9TVEFfQ09ORklHKSkKKyAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmU3RhQ29uZmlnLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuYkVuYWJsZVR4QnVyc3QgPSBTdGFDb25maWcuRW5hYmxlVHhCdXJzdDsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLlVzZUJHUHJvdGVjdGlvbiA9IFN0YUNvbmZpZy5Vc2VCR1Byb3RlY3Rpb247CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5iVXNlU2hvcnRTbG90VGltZSA9IDE7IC8vIDIwMDMtMTAtMzAgYWx3YXlzIFNIT1JUIFNMT1QgY2FwYWJsZQorICAgICAgICAgICAgICAgIGlmICgocEFkYXB0ZXItPkNvbW1vbkNmZy5QaHlNb2RlICE9IFN0YUNvbmZpZy5BZGhvY01vZGUpICYmCisJCQkJCShTdGFDb25maWcuQWRob2NNb2RlIDw9IE1heFBoeU1vZGUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gYWxsb3cgZHluYW1pYyBjaGFuZ2Ugb2YgIlVTRSBPRkRNIHJhdGUgb3Igbm90IiBpbiBBREhPQyBtb2RlCisgICAgICAgICAgICAgICAgICAgIC8vIGlmIHNldHRpbmcgY2hhbmdlZCwgbmVlZCB0byByZXNldCBjdXJyZW50IFRYIHJhdGUgYXMgd2VsbCBhcyBCRUFDT04gZnJhbWUgZm9ybWF0CisgICAgICAgICAgICAgICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkJzc1R5cGUgPT0gQlNTX0FESE9DKQorICAgICAgICAgICAgICAgICAgICB7CisJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLlBoeU1vZGUgPSBTdGFDb25maWcuQWRob2NNb2RlOworICAgICAgICAgICAgICAgICAgICAJUlRNUFNldFBoeU1vZGUocEFkYXB0ZXIsIFBoeU1vZGUpOworICAgICAgICAgICAgICAgICAgICAgICAgTWxtZVVwZGF0ZVR4UmF0ZXMocEFkYXB0ZXIsIEZBTFNFLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIE1ha2VJYnNzQmVhY29uKHBBZGFwdGVyKTsgICAgICAgICAgIC8vIHJlLWJ1aWxkIEJFQUNPTiBmcmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgQXNpY0VuYWJsZUlic3NTeW5jKHBBZGFwdGVyKTsgICAvLyBjb3B5IHRvIG9uLWNoaXAgbWVtb3J5CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpSVF9PSURfODAyXzExX1NFVF9TVEFfQ09ORklHIChCdXJzdD0lZCwgUHJvdGVjdGlvbj0lbGQsU2hvcnRTbG90PSVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuYkVuYWJsZVR4QnVyc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5Vc2VCR1Byb3RlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5iVXNlU2hvcnRTbG90VGltZSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9ERVNJUkVEX1JBVEVTOgorICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoTkRJU184MDJfMTFfUkFURVMpKQorICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZhcnlSYXRlcywgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBOZGlzWmVyb01lbW9yeShwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGUsIE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTKTsKKyAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGUsICZhcnlSYXRlcywgc2l6ZW9mKE5ESVNfODAyXzExX1JBVEVTKSk7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX0RFU0lSRURfUkFURVMgKCUwMngsJTAyeCwlMDJ4LCUwMngsJTAyeCwlMDJ4LCUwMngsJTAyeClcbiIsCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlUmF0ZVswXSxwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbMV0sCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlUmF0ZVsyXSxwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbM10sCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlUmF0ZVs0XSxwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbNV0sCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlUmF0ZVs2XSxwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbN10gKSk7CisgICAgICAgICAgICAgICAgLy8gQ2hhbmdpbmcgRGVzaXJlZFJhdGUgbWF5IGFmZmVjdCB0aGUgTUFYIFRYIHJhdGUgd2UgdXNlZCB0byBUWCBmcmFtZXMgb3V0CisgICAgICAgICAgICAgICAgTWxtZVVwZGF0ZVR4UmF0ZXMocEFkYXB0ZXIsIEZBTFNFLCAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfUFJFQU1CTEU6CisgICAgICAgICAgICBpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihSVF84MDJfMTFfUFJFQU1CTEUpKQorICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZQcmVhbWJsZSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBpZiAoUHJlYW1ibGUgPT0gUnQ4MDJfMTFQcmVhbWJsZVNob3J0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5UeFByZWFtYmxlID0gUHJlYW1ibGU7CisgICAgICAgICAgICAgICAgICAgIE1sbWVTZXRUeFByZWFtYmxlKHBBZGFwdGVyLCBSdDgwMl8xMVByZWFtYmxlU2hvcnQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmICgoUHJlYW1ibGUgPT0gUnQ4MDJfMTFQcmVhbWJsZUxvbmcpIHx8IChQcmVhbWJsZSA9PSBSdDgwMl8xMVByZWFtYmxlQXV0bykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBpZiB1c2VyIHdhbnRzIEFVVE8sIGluaXRpYWxpemUgdG8gTE9ORyBoZXJlLCB0aGVuIGNoYW5nZSBhY2NvcmRpbmcgdG8gQVAncworICAgICAgICAgICAgICAgICAgICAvLyBjYXBhYmlsaXR5IHVwb24gYXNzb2NpYXRpb24uCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuVHhQcmVhbWJsZSA9IFByZWFtYmxlOworICAgICAgICAgICAgICAgICAgICBNbG1lU2V0VHhQcmVhbWJsZShwQWRhcHRlciwgUnQ4MDJfMTFQcmVhbWJsZUxvbmcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpSVF9PSURfODAyXzExX1BSRUFNQkxFICg9JWQpXG4iLCBQcmVhbWJsZSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9XRVBfU1RBVFVTOgorICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoTkRJU184MDJfMTFfV0VQX1NUQVRVUykpCisgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJldlcFN0YXR1cywgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAvLyBTaW5jZSBUS0lQLCBBRVMsIFdFUCBhcmUgYWxsIHN1cHBvcnRlZC4gSXQgc2hvdWxkIG5vdCBoYXZlIGFueSBpbnZhbGlkIHNldHRpbmcKKyAgICAgICAgICAgICAgICBpZiAoV2VwU3RhdHVzIDw9IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0tleUFic2VudCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cyAhPSBXZXBTdGF0dXMpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvbmZpZyBoYXMgY2hhbmdlZAorICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPmJDb25maWdDaGFuZ2VkID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cyAgICAgPSBXZXBTdGF0dXM7CisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuT3JpZ1dlcFN0YXR1cyA9IFdlcFN0YXR1czsKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5QYWlyQ2lwaGVyICAgID0gV2VwU3RhdHVzOworICAgICAgICAgICAgICAgIAlwQWRhcHRlci0+U3RhQ2ZnLkdyb3VwQ2lwaGVyICAgPSBXZXBTdGF0dXM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX1dFUF9TVEFUVVMgKD0lZClcbiIsV2VwU3RhdHVzKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREU6CisgICAgICAgICAgICBpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9NT0RFKSkKKyAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmQXV0aE1vZGUsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgaWYgKEF1dGhNb2RlID4gTmRpczgwMl8xMUF1dGhNb2RlTWF4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSAhPSBBdXRoTW9kZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29uZmlnIGhhcyBjaGFuZ2VkCisgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+YkNvbmZpZ0NoYW5nZWQgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBBdXRoTW9kZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9OT1RfU0VDVVJFRDsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfQVVUSEVOVElDQVRJT05fTU9ERSAoPSVkKSBcbiIscEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9JTkZSQVNUUlVDVFVSRV9NT0RFOgorICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoTkRJU184MDJfMTFfTkVUV09SS19JTkZSQVNUUlVDVFVSRSkpCisgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJkJzc1R5cGUsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisKKwkJCQlpZiAoQnNzVHlwZSA9PSBOZGlzODAyXzExSUJTUykKKwkJCQkJU2V0X05ldHdvcmtUeXBlX1Byb2MocEFkYXB0ZXIsICJBZGhvYyIpOworCQkJCWVsc2UgaWYgKEJzc1R5cGUgPT0gTmRpczgwMl8xMUluZnJhc3RydWN0dXJlKQorCQkJCQlTZXRfTmV0d29ya1R5cGVfUHJvYyhwQWRhcHRlciwgIkluZnJhIik7CisJCQkJZWxzZSBpZiAoQnNzVHlwZSA9PSBOZGlzODAyXzExTW9uaXRvcikKKwkJCQkJU2V0X05ldHdvcmtUeXBlX1Byb2MocEFkYXB0ZXIsICJNb25pdG9yIik7CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJU3RhdHVzICA9IC1FSU5WQUw7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9JTkZSQVNUUlVDVFVSRV9NT0RFICh1bmtub3duKVxuIikpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCSBjYXNlIE9JRF84MDJfMTFfUkVNT1ZFX1dFUDoKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9SRU1PVkVfV0VQXG4iKSk7CisgICAgICAgICAgICBpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihORElTXzgwMl8xMV9LRVlfSU5ERVgpKQorICAgICAgICAgICAgeworCQkJCVN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisJCQkJS2V5SWR4ID0gKihORElTXzgwMl8xMV9LRVlfSU5ERVggKikgd3JxLT51LmRhdGEucG9pbnRlcjsKKworCQkJCWlmIChLZXlJZHggJiAweDgwMDAwMDAwKQorCQkJCXsKKwkJCQkJLy8gU2hvdWxkIG5ldmVyIHNldCBkZWZhdWx0IGJpdCB3aGVuIHJlbW92ZSBrZXkKKwkJCQkJU3RhdHVzID0gLUVJTlZBTDsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJS2V5SWR4ID0gS2V5SWR4ICYgMHgwZmZmZmZmZjsKKwkJCQkJaWYgKEtleUlkeCA+PSA0KXsKKwkJCQkJCVN0YXR1cyA9IC1FSU5WQUw7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uS2V5TGVuID0gMDsKKwkJCQkJCXBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5DaXBoZXJBbGcgPSBDSVBIRVJfTk9ORTsKKwkJCQkJCUFzaWNSZW1vdmVTaGFyZWRLZXlFbnRyeShwQWRhcHRlciwgMCwgKFVDSEFSKUtleUlkeCk7CisJCQkJCX0KKwkJCQl9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX1JFU0VUX0NPVU5URVJTOgorICAgICAgICAgICAgTmRpc1plcm9NZW1vcnkoJnBBZGFwdGVyLT5XbGFuQ291bnRlcnMsIHNpemVvZihDT1VOVEVSXzgwMl8xMSkpOworICAgICAgICAgICAgTmRpc1plcm9NZW1vcnkoJnBBZGFwdGVyLT5Db3VudGVyczgwMjMsIHNpemVvZihDT1VOVEVSXzgwMl8zKSk7CisgICAgICAgICAgICBOZGlzWmVyb01lbW9yeSgmcEFkYXB0ZXItPlJhbGlua0NvdW50ZXJzLCBzaXplb2YoQ09VTlRFUl9SQUxJTkspKTsKKyAgICAgICAgICAgIHBBZGFwdGVyLT5Db3VudGVyczgwMjMuUnhOb0J1ZmZlciAgID0gMDsKKwkJCXBBZGFwdGVyLT5Db3VudGVyczgwMjMuR29vZFJlY2VpdmVzID0gMDsKKwkJCXBBZGFwdGVyLT5Db3VudGVyczgwMjMuUnhOb0J1ZmZlciAgID0gMDsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6UlRfT0lEXzgwMl8xMV9SRVNFVF9DT1VOVEVSUyBcbiIpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfUlRTX1RIUkVTSE9MRDoKKyAgICAgICAgICAgIGlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKE5ESVNfODAyXzExX1JUU19USFJFU0hPTEQpKQorICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZSdHNUaHJlc2gsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgaWYgKFJ0c1RocmVzaCA+IE1BWF9SVFNfVEhSRVNIT0xEKQorICAgICAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuUnRzVGhyZXNob2xkID0gKFVTSE9SVClSdHNUaHJlc2g7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfUlRTX1RIUkVTSE9MRCAoPSVsZClcbiIsUnRzVGhyZXNoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX0ZSQUdNRU5UQVRJT05fVEhSRVNIT0xEOgorICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoTkRJU184MDJfMTFfRlJBR01FTlRBVElPTl9USFJFU0hPTEQpKQorICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZGcmFnVGhyZXNoLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuYlVzZVplcm9Ub0Rpc2FibGVGcmFnbWVudCA9IEZBTFNFOworICAgICAgICAgICAgICAgIGlmIChGcmFnVGhyZXNoID4gTUFYX0ZSQUdfVEhSRVNIT0xEIHx8IEZyYWdUaHJlc2ggPCBNSU5fRlJBR19USFJFU0hPTEQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoRnJhZ1RocmVzaCA9PSAwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkZyYWdtZW50VGhyZXNob2xkID0gTUFYX0ZSQUdfVEhSRVNIT0xEOworICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5iVXNlWmVyb1RvRGlzYWJsZUZyYWdtZW50ID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkZyYWdtZW50VGhyZXNob2xkID0gKFVTSE9SVClGcmFnVGhyZXNoOworICAgICAgICAgICAgfQorICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX0ZSQUdNRU5UQVRJT05fVEhSRVNIT0xEICg9JWxkKSBcbiIsRnJhZ1RocmVzaCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9QT1dFUl9NT0RFOgorICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoTkRJU184MDJfMTFfUE9XRVJfTU9ERSkpCisgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmUG93ZXJNb2RlLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgICAgIGlmIChQb3dlck1vZGUgPT0gTmRpczgwMl8xMVBvd2VyTW9kZUNBTSkKKyAgICAgICAgICAgICAgICAJU2V0X1BTTW9kZV9Qcm9jKHBBZGFwdGVyLCAiQ0FNIik7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoUG93ZXJNb2RlID09IE5kaXM4MDJfMTFQb3dlck1vZGVNQVhfUFNQKQorICAgICAgICAgICAgICAgIAlTZXRfUFNNb2RlX1Byb2MocEFkYXB0ZXIsICJNYXhfUFNQIik7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoUG93ZXJNb2RlID09IE5kaXM4MDJfMTFQb3dlck1vZGVGYXN0X1BTUCkKKwkJCQkJU2V0X1BTTW9kZV9Qcm9jKHBBZGFwdGVyLCAiRmFzdF9QU1AiKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChQb3dlck1vZGUgPT0gTmRpczgwMl8xMVBvd2VyTW9kZUxlZ2FjeV9QU1ApCisJCQkJCVNldF9QU01vZGVfUHJvYyhwQWRhcHRlciwgIkxlZ2FjeV9QU1AiKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfUE9XRVJfTU9ERSAoPSVkKVxuIixQb3dlck1vZGUpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX1RYX1BPV0VSX0xFVkVMXzE6CisJCQlpZiAod3JxLT51LmRhdGEubGVuZ3RoICA8IHNpemVvZihVTE9ORykpCisJCQkJU3RhdHVzID0gLUVJTlZBTDsKKwkJCWVsc2UKKwkJCXsKKwkJCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmUG93ZXJUZW1wLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJCWlmIChQb3dlclRlbXAgPiAxMDApCisJCQkJCVBvd2VyVGVtcCA9IDB4ZmZmZmZmZmY7ICAvLyBBVVRPCisJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5UeFBvd2VyRGVmYXVsdCA9IFBvd2VyVGVtcDsgLy9rZWVwIGN1cnJlbnQgc2V0dGluZy4KKwkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA9IHBBZGFwdGVyLT5Db21tb25DZmcuVHhQb3dlckRlZmF1bHQ7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpSVF9PSURfODAyXzExX1RYX1BPV0VSX0xFVkVMXzEgKD0lbGQpXG4iLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlKSk7CisJCQl9CisJICAgICAgICBicmVhazsKKwkJY2FzZSBPSURfODAyXzExX05FVFdPUktfVFlQRV9JTl9VU0U6CisJCQlpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihORElTXzgwMl8xMV9ORVRXT1JLX1RZUEUpKQorCQkJCVN0YXR1cyA9IC1FSU5WQUw7CisJCQllbHNlCisJCQl7CisJCQkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJk5ldFR5cGUsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisKKwkJCQlpZiAoTmV0VHlwZSA9PSBOZGlzODAyXzExRFMpCisJCQkJCVJUTVBTZXRQaHlNb2RlKHBBZGFwdGVyLCBQSFlfMTFCKTsKKwkJCQllbHNlIGlmIChOZXRUeXBlID09IE5kaXM4MDJfMTFPRkRNMjQpCisJCQkJCVJUTVBTZXRQaHlNb2RlKHBBZGFwdGVyLCBQSFlfMTFCR19NSVhFRCk7CisJCQkJZWxzZSBpZiAoTmV0VHlwZSA9PSBOZGlzODAyXzExT0ZETTUpCisJCQkJCVJUTVBTZXRQaHlNb2RlKHBBZGFwdGVyLCBQSFlfMTFBKTsKKwkJCQllbHNlCisJCQkJCVN0YXR1cyA9IC1FSU5WQUw7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQkJaWYgKFN0YXR1cyA9PSBORElTX1NUQVRVU19TVUNDRVNTKQorCQkJCQlTZXRDb21tb25IVChwQWRhcHRlcik7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX05FVFdPUktfVFlQRV9JTl9VU0UgKD0lZClcbiIsTmV0VHlwZSkpOworCQkgICAgfQorCQkJYnJlYWs7CisgICAgICAgIC8vIEZvciBXUEEgUFNLIFBNSyBrZXkKKyAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX0FERF9XUEE6CisgICAgICAgICAgICBwS2V5ID0ga21hbGxvYyh3cnEtPnUuZGF0YS5sZW5ndGgsIE1FTV9BTExPQ19GTEFHKTsKKyAgICAgICAgICAgIGlmKHBLZXkgPT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRU5PTUVNOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcihwS2V5LCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgaWYgKHBLZXktPkxlbmd0aCAhPSB3cnEtPnUuZGF0YS5sZW5ndGgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpSVF9PSURfODAyXzExX0FERF9XUEEsIEZhaWxlZCEhXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlICE9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykgJiYKKwkJCQkgICAgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgIT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykgJiYKKwkJCQkgICAgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgIT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZSkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVPUE5PVFNVUFA7CisgICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6UlRfT0lEXzgwMl8xMV9BRERfV1BBLCBGYWlsZWQhISBbQXV0aE1vZGUgIT0gV1BBUFNLL1dQQTJQU0svV1BBTk9ORV1cbiIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKSB8fAorCQkJCQkJIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spIHx8CisJCQkJCQkgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZSkgKSAgICAgLy8gT25seSBmb3IgV1BBIFBTSyBtb2RlCisJCQkJeworICAgICAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQWRhcHRlci0+U3RhQ2ZnLlBNSywgJnBLZXktPktleU1hdGVyaWFsLCBwS2V5LT5LZXlMZW5ndGgpOworICAgICAgICAgICAgICAgICAgICAvLyBVc2UgUmFDb25maWcgYXMgUFNLIGFnZW50LgorICAgICAgICAgICAgICAgICAgICAvLyBTdGFydCBTVEEgc3VwcGxpY2FudCBzdGF0ZSBtYWNoaW5lCisgICAgICAgICAgICAgICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlICE9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmUpCisgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldwYVN0YXRlID0gU1NfU1RBUlQ7CisKKyAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpSVF9PSURfODAyXzExX0FERF9XUEEgKGlkPTB4JXgsIExlbj0lZC1ieXRlKVxuIiwgcEtleS0+S2V5SW5kZXgsIHBLZXktPktleUxlbmd0aCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldwYVN0YXRlID0gU1NfTk9UVVNFOworICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OlJUX09JRF84MDJfMTFfQUREX1dQQSAoaWQ9MHgleCwgTGVuPSVkLWJ5dGUpXG4iLCBwS2V5LT5LZXlJbmRleCwgcEtleS0+S2V5TGVuZ3RoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAga2ZyZWUocEtleSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX1JFTU9WRV9LRVk6CisgICAgICAgICAgICBwUmVtb3ZlS2V5ID0ga21hbGxvYyh3cnEtPnUuZGF0YS5sZW5ndGgsIE1FTV9BTExPQ19GTEFHKTsKKyAgICAgICAgICAgIGlmKHBSZW1vdmVLZXkgPT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRU5PTUVNOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcihwUmVtb3ZlS2V5LCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgaWYgKHBSZW1vdmVLZXktPkxlbmd0aCAhPSB3cnEtPnUuZGF0YS5sZW5ndGgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX1JFTU9WRV9LRVksIEZhaWxlZCEhXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgUlRNUFdQQVJlbW92ZUtleVByb2MocEFkYXB0ZXIsIHBSZW1vdmVLZXkpOworICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfUkVNT1ZFX0tFWSwgUmVtb3ZlIFdQQSBLZXkhIVxuIikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBLZXlJZHggPSBwUmVtb3ZlS2V5LT5LZXlJbmRleDsKKworICAgICAgICAgICAgICAgICAgICBpZiAoS2V5SWR4ICYgMHg4MDAwMDAwMCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2hvdWxkIG5ldmVyIHNldCBkZWZhdWx0IGJpdCB3aGVuIHJlbW92ZSBrZXkKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX1JFTU9WRV9LRVksIEZhaWxlZCEhKFNob3VsZCBuZXZlciBzZXQgZGVmYXVsdCBiaXQgd2hlbiByZW1vdmUga2V5KVxuIikpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgS2V5SWR4ID0gS2V5SWR4ICYgMHgwZmZmZmZmZjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChLZXlJZHggPiAzKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9SRU1PVkVfS0VZLCBGYWlsZWQhIShLZXlJZFslZF0gb3V0IG9mIHJhbmdlKVxuIiwgS2V5SWR4KSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLktleUxlbiA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLkNpcGhlckFsZyA9IENJUEhFUl9OT05FOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFzaWNSZW1vdmVTaGFyZWRLZXlFbnRyeShwQWRhcHRlciwgMCwgKFVDSEFSKUtleUlkeCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX1JFTU9WRV9LRVkgKGlkPTB4JXgsIExlbj0lZC1ieXRlKVxuIiwgcFJlbW92ZUtleS0+S2V5SW5kZXgsIHBSZW1vdmVLZXktPkxlbmd0aCkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAga2ZyZWUocFJlbW92ZUtleSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgLy8gTmV3IGZvciBXUEEKKyAgICAgICAgY2FzZSBPSURfODAyXzExX0FERF9LRVk6CisgICAgICAgICAgICBwS2V5ID0ga21hbGxvYyh3cnEtPnUuZGF0YS5sZW5ndGgsIE1FTV9BTExPQ19GTEFHKTsKKyAgICAgICAgICAgIGlmKHBLZXkgPT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRU5PTUVNOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIocEtleSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgIGlmIChwS2V5LT5MZW5ndGggIT0gd3JxLT51LmRhdGEubGVuZ3RoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9BRERfS0VZLCBGYWlsZWQhIVxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFJUTVBBZGRLZXkocEFkYXB0ZXIsIHBLZXkpOworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9BRERfS0VZIChpZD0weCV4LCBMZW49JWQtYnl0ZSlcbiIsIHBLZXktPktleUluZGV4LCBwS2V5LT5LZXlMZW5ndGgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGtmcmVlKHBLZXkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9DT05GSUdVUkFUSU9OOgorICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoTkRJU184MDJfMTFfQ09ORklHVVJBVElPTikpCisgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJkNvbmZpZywgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBwQ29uZmlnID0gJkNvbmZpZzsKKworICAgICAgICAgICAgICAgIGlmICgocENvbmZpZy0+QmVhY29uUGVyaW9kID49IDIwKSAmJiAocENvbmZpZy0+QmVhY29uUGVyaW9kIDw9NDAwKSkKKyAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuQmVhY29uUGVyaW9kID0gKFVTSE9SVCkgcENvbmZpZy0+QmVhY29uUGVyaW9kOworCisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUFjdGl2ZS5BdGltV2luID0gKFVTSE9SVCkgcENvbmZpZy0+QVRJTVdpbmRvdzsKKyAgICAgICAgICAgICAgICBNQVBfS0haX1RPX0NIQU5ORUxfSUQocENvbmZpZy0+RFNDb25maWcsIHBBZGFwdGVyLT5Db21tb25DZmcuQ2hhbm5lbCk7CisgICAgICAgICAgICAgICAgLy8KKwkJCQkvLyBTYXZlIHRoZSBjaGFubmVsIG9uIE1sbWVBdXggZm9yIENudGxPaWRSVEJzc2lkUHJvYyB1c2VkLgorCQkJCS8vCisJCQkJcEFkYXB0ZXItPk1sbWVBdXguQ2hhbm5lbCA9IHBBZGFwdGVyLT5Db21tb25DZmcuQ2hhbm5lbDsKKworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9DT05GSUdVUkFUSU9OIChCZWFjblBlcmlvZD0lbGQsQXRpbVc9JWxkLENoPSVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgcENvbmZpZy0+QmVhY29uUGVyaW9kLCBwQ29uZmlnLT5BVElNV2luZG93LCBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWwpKTsKKyAgICAgICAgICAgICAgICAvLyBDb25maWcgaGFzIGNoYW5nZWQKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+YkNvbmZpZ0NoYW5nZWQgPSBUUlVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCWNhc2UgUlRfT0lEXzgwMl8xMV9TRVRfSFRfUEhZTU9ERToKKwkJCWlmICh3cnEtPnUuZGF0YS5sZW5ndGgJIT0gc2l6ZW9mKE9JRF9TRVRfSFRfUEhZTU9ERSkpCisJCQkJU3RhdHVzID0gLUVJTlZBTDsKKwkJCWVsc2UKKwkJCXsKKwkJCSAgICBQT0lEX1NFVF9IVF9QSFlNT0RFCXBIVFBoeU1vZGUgPSAmSFRfUGh5TW9kZTsKKworCQkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZIVF9QaHlNb2RlLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6cEhUUGh5TW9kZQkoUGh5TW9kZSA9ICVkLFRyYW5zbWl0Tm8gPSAlZCwgSHRNb2RlID0JJWQsCUV4dE9mZnNldCA9CSVkICwgTUNTID0gJWQsIEJXID0JJWQsCVNUQkMgPSAlZCwgU0hPUlRHSSA9ICVkKSBcbiIsCisJCQkJcEhUUGh5TW9kZS0+UGh5TW9kZSwgcEhUUGh5TW9kZS0+VHJhbnNtaXRObyxwSFRQaHlNb2RlLT5IdE1vZGUscEhUUGh5TW9kZS0+RXh0T2Zmc2V0LAorCQkJCXBIVFBoeU1vZGUtPk1DUywgcEhUUGh5TW9kZS0+QlcsIHBIVFBoeU1vZGUtPlNUQkMsCXBIVFBoeU1vZGUtPlNIT1JUR0kpKTsKKwkJCQlpZiAocEFkYXB0ZXItPkNvbW1vbkNmZy5QaHlNb2RlCT49IFBIWV8xMUFCR05fTUlYRUQpCisJCQkJCVJUTVBTZXRIVChwQWRhcHRlciwJcEhUUGh5TW9kZSk7CisJCQl9CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OlJUX09JRF84MDJfMTFfU0VUX0hUX1BIWU1PREUoTUNTPSVkLEJXPSVkLFNHST0lZCxTVEJDPSVkKVxuIiwKKwkJCQlwQWRhcHRlci0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NQ1MsIHBBZGFwdGVyLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLkJXLCBwQWRhcHRlci0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5TaG9ydEdJLAorCQkJCXBBZGFwdGVyLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLlNUQkMpKTsKKwkJCWJyZWFrOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQljYXNlIFJUX09JRF84MDJfMTFfU0VUX0FQU0RfU0VUVElORzoKKwkJCWlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKFVMT05HKSkKKwkJCQlTdGF0dXMgPSAtRUlOVkFMOworCQkJZWxzZQorCQkJeworCQkJCVVMT05HIGFwc2QgOworCQkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZhcHNkLCB3cnEtPnUuZGF0YS5wb2ludGVyLAl3cnEtPnUuZGF0YS5sZW5ndGgpOworCisJCQkJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCQkJfEIzMX5CNwl8CUI2fkI1CSB8CSBCNAkgfAkgQjMJIHwJQjIJIHwJQjEJIHwJICAgQjAJCXwKKwkJCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJCQl8IFJzdmQJfCBNYXggU1AgTGVuIHwgQUNfVk8gfCBBQ19WSSB8IEFDX0JLIHwgQUNfQkUgfCBBUFNECUNhcGFibGUJfAorCQkJCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTRENhcGFibGUgPSAoYXBzZCAmIDB4MDAwMDAwMDEpID8gVFJVRSA6CUZBTFNFOworCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RBQ19CRSA9ICgoYXBzZAkmIDB4MDAwMDAwMDIpID4+IDEpCT8gVFJVRSA6IEZBTFNFOworCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RBQ19CSyA9ICgoYXBzZAkmIDB4MDAwMDAwMDQpID4+IDIpCT8gVFJVRSA6IEZBTFNFOworCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RBQ19WSSA9ICgoYXBzZAkmIDB4MDAwMDAwMDgpID4+IDMpCT8gVFJVRSA6IEZBTFNFOworCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RBQ19WTyA9ICgoYXBzZAkmIDB4MDAwMDAwMTApID4+IDQpCT8gVFJVRSA6IEZBTFNFOworCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuTWF4U1BMZW5ndGgJPSAoVUNIQVIpKChhcHNkCSYgMHgwMDAwMDA2MCkgPj4gNSk7CisKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OlJUX09JRF84MDJfMTFfU0VUX0FQU0RfU0VUVElORyAoYXBzZD0weCVseCwgQVBTRENhcD0lZCwgW0JFLEJLLFZJLFZPXT1bJWQvJWQvJWQvJWRdLAlNYXhTUExlbj0lZClcbiIsIGFwc2QsIHBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RDYXBhYmxlLAorCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNEQUNfQkUsCXBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RBQ19CSywJcEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTREFDX1ZJLAlwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNEQUNfVk8sCXBBZGFwdGVyLT5Db21tb25DZmcuTWF4U1BMZW5ndGgpKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUlRfT0lEXzgwMl8xMV9TRVRfQVBTRF9QU006CisJCQlpZiAod3JxLT51LmRhdGEubGVuZ3RoCSE9IHNpemVvZihVTE9ORykpCisJCQkJU3RhdHVzID0gLUVJTlZBTDsKKwkJCWVsc2UKKwkJCXsKKwkJCQkvLyBEcml2ZXIgbmVlZHMJdG8gbm90aWZ5IEFQIHdoZW4gUFNNIGNoYW5nZXMKKwkJCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmcEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTREZvcmNlUG93ZXJTYXZlLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJCWlmIChwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNERm9yY2VQb3dlclNhdmUJIT0gcEFkYXB0ZXItPlN0YUNmZy5Qc20pCisJCQkJeworCQkJCQlNbG1lU2V0UHNtQml0KHBBZGFwdGVyLAlwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNERm9yY2VQb3dlclNhdmUpOworCQkJCQlSVE1QU2VuZE51bGxGcmFtZShwQWRhcHRlciwJcEFkYXB0ZXItPkNvbW1vbkNmZy5UeFJhdGUsCVRSVUUpOworCQkJCX0KKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OlJUX09JRF84MDJfMTFfU0VUX0FQU0RfUFNNIChiQVBTREZvcmNlUG93ZXJTYXZlOiVkKVxuIiwJcEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTREZvcmNlUG93ZXJTYXZlKSk7CisJCQl9CisJCQlicmVhazsKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwkJY2FzZSBSVF9PSURfODAyXzExX1NFVF9ETFM6CisJCQlpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihVTE9ORykpCisJCQkJU3RhdHVzID0gLUVJTlZBTDsKKwkJCWVsc2UKKwkJCXsKKwkJCQlCT09MRUFOCW9sZHZhbHVlID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5iRExTQ2FwYWJsZTsKKwkJCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmcEFkYXB0ZXItPkNvbW1vbkNmZy5iRExTQ2FwYWJsZSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCQlpZiAob2xkdmFsdWUgJiYJIXBBZGFwdGVyLT5Db21tb25DZmcuYkRMU0NhcGFibGUpCisJCQkJeworCQkJCQlpbnQJaTsKKwkJCQkJLy8gdGVhcglkb3duIGxvY2FsIGRscyB0YWJsZSBlbnRyeQorCQkJCQlmb3IJKGk9MDsgaTxNQVhfTlVNX09GX0lOSVRfRExTX0VOVFJZOyBpKyspCisJCQkJCXsKKwkJCQkJCWlmIChwQWRhcHRlci0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkICYmIChwQWRhcHRlci0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9PSBETFNfRklOSVNIKSkKKwkJCQkJCXsKKwkJCQkJCQlwQWRhcHRlci0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cwk9IERMU19OT05FOworCQkJCQkJCXBBZGFwdGVyLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQJPSBGQUxTRTsKKwkJCQkJCQlSVE1QU2VuZERMU1RlYXJEb3duRnJhbWUocEFkYXB0ZXIsIHBBZGFwdGVyLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcik7CisJCQkJCQl9CisJCQkJCX0KKworCQkJCQkvLyB0ZWFyCWRvd24gcGVlciBkbHMgdGFibGUJZW50cnkKKwkJCQkJZm9yCShpPU1BWF9OVU1fT0ZfSU5JVF9ETFNfRU5UUlk7IGk8TUFYX05VTV9PRl9ETFNfRU5UUlk7IGkrKykKKwkJCQkJeworCQkJCQkJaWYgKHBBZGFwdGVyLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQgJiYgKHBBZGFwdGVyLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID09IERMU19GSU5JU0gpKQorCQkJCQkJeworCQkJCQkJCXBBZGFwdGVyLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzCT0gRExTX05PTkU7CisJCQkJCQkJcEFkYXB0ZXItPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZAk9IEZBTFNFOworCQkJCQkJCVJUTVBTZW5kRExTVGVhckRvd25GcmFtZShwQWRhcHRlciwgcEFkYXB0ZXItPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiU2V0OjpSVF9PSURfODAyXzExX1NFVF9ETFMgKD0lZClcbiIsIHBBZGFwdGVyLT5Db21tb25DZmcuYkRMU0NhcGFibGUpKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUlRfT0lEXzgwMl8xMV9TRVRfRExTX1BBUkFNOgorCQkJaWYgKHdycS0+dS5kYXRhLmxlbmd0aAkhPSBzaXplb2YoUlRfODAyXzExX0RMU19VSSkpCisJCQkJU3RhdHVzID0gLUVJTlZBTDsKKwkJCWVsc2UKKwkJCXsKKwkJCQlSVF84MDJfMTFfRExTCURsczsKKworCQkJCU5kaXNaZXJvTWVtb3J5KCZEbHMsIHNpemVvZihSVF84MDJfMTFfRExTKSk7CisJCQkJUlRNUE1vdmVNZW1vcnkoJkRscywgd3JxLT51LmRhdGEucG9pbnRlciwgc2l6ZW9mKFJUXzgwMl8xMV9ETFNfVUkpKTsKKwkJCQlNbG1lRW5xdWV1ZShwQWRhcHRlciwKKwkJCQkJCQlNTE1FX0NOVExfU1RBVEVfTUFDSElORSwKKwkJCQkJCQlSVF9PSURfODAyXzExX1NFVF9ETFNfUEFSQU0sCisJCQkJCQkJc2l6ZW9mKFJUXzgwMl8xMV9ETFMpLAorCQkJCQkJCSZEbHMpOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiU2V0OjpSVF9PSURfODAyXzExX1NFVF9ETFNfUEFSQU0gXG4iKSk7CisJCQl9CisJCQlicmVhazsKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKwkJY2FzZSBSVF9PSURfODAyXzExX1NFVF9XTU06CisJCQlpZiAod3JxLT51LmRhdGEubGVuZ3RoCSE9IHNpemVvZihCT09MRUFOKSkKKwkJCQlTdGF0dXMgPSAtRUlOVkFMOworCQkJZWxzZQorCQkJeworCQkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZwQWRhcHRlci0+Q29tbW9uQ2ZnLmJXbW1DYXBhYmxlLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6UlRfT0lEXzgwMl8xMV9TRVRfV01NICg9JWQpCVxuIiwgcEFkYXB0ZXItPkNvbW1vbkNmZy5iV21tQ2FwYWJsZSkpOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfODAyXzExX0RJU0FTU09DSUFURToKKyNpZmRlZiBSQUxJTktfQVRFCisJCQlpZiAoQVRFX09OKHBBZGFwdGVyKSkKKwkJCXsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJUaGUgZHJpdmVyIGlzIGluIEFURSBtb2RlIG5vd1xuIikpOworCQkJCWJyZWFrOworCQkJfQorI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKwkJCS8vCisJCQkvLyBTZXQgTmRpc1JhZGlvU3RhdGVPZmYgdG8JVFJVRSwgaW5zdGVhZCBvZiBjYWxsZWQJTWxtZVJhZGlvT2ZmLgorCQkJLy8gTGF0ZXIgb24sIE5ESVNfODAyXzExX0JTU0lEX0xJU1RfRVgtPk51bWJlck9mSXRlbXMgc2hvdWxkIGJlCTAKKwkJCS8vIHdoZW4JcXVlcnkgT0lEXzgwMl8xMV9CU1NJRF9MSVNULgorCQkJLy8KKwkJCS8vIFRSVUU6ICBOdW1iZXJPZkl0ZW1zCXdpbGwgc2V0IHRvCTAuCisJCQkvLyBGQUxTRTogTnVtYmVyT2ZJdGVtcwlubyBjaGFuZ2UuCisJCQkvLworCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5OZGlzUmFkaW9TdGF0ZU9mZiA9CVRSVUU7CisJCQkvLyBTZXQgdG8gaW1tZWRpYXRlbHkgc2VuZCB0aGUgbWVkaWEgZGlzY29ubmVjdAlldmVudAorCQkJcEFkYXB0ZXItPk1sbWVBdXguQ3VyclJlcUlzRnJvbU5kaXMJPSBUUlVFOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX0RJU0FTU09DSUFURQlcbiIpKTsKKworCQkJaWYgKElORlJBX09OKHBBZGFwdGVyKSkKKwkJCXsKKwkJCQlpZiAocEFkYXB0ZXItPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlICE9CUNOVExfSURMRSkKKwkJCQl7CisJCQkJCVJUMjhYWF9NTE1FX1JFU0VUX1NUQVRFX01BQ0hJTkUocEFkYXB0ZXIpOworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgTUxNRQlidXN5LCByZXNldAlNTE1FIHN0YXRlIG1hY2hpbmUgISEhXG4iKSk7CisJCQkJfQorCisJCQkJTWxtZUVucXVldWUocEFkYXB0ZXIsCisJCQkJCU1MTUVfQ05UTF9TVEFURV9NQUNISU5FLAorCQkJCQlPSURfODAyXzExX0RJU0FTU09DSUFURSwKKwkJCQkJMCwKKwkJCQkJTlVMTCk7CisKKwkJCQlTdGF0ZU1hY2hpbmVUb3VjaGVkCT0gVFJVRTsKKwkJCX0KKwkJCWJyZWFrOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCWNhc2UgUlRfT0lEXzgwMl8xMV9TRVRfSU1NRV9CQV9DQVA6CisJCQkJaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoT0lEX0JBQ0FQX1NUUlVDKSkKKwkJCQkJU3RhdHVzID0gLUVJTlZBTDsKKwkJCQllbHNlCisJCQkJeworCQkJCQlPSURfQkFDQVBfU1RSVUMgT3JkZSA7CisJCQkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZPcmRlLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJCQlpZiAoT3JkZS5Qb2xpY3kgPiBCQV9OT1RVU0UpCisJCQkJCXsKKwkJCQkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX0lOVkFMSURfREFUQTsKKwkJCQkJfQorCQkJCQllbHNlIGlmIChPcmRlLlBvbGljeSA9PSBCQV9OT1RVU0UpCisJCQkJCXsKKwkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlBvbGljeSA9IEJBX05PVFVTRTsKKwkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1wZHVEZW5zaXR5ID0gT3JkZS5NcGR1RGVuc2l0eTsKKwkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5Lk1wZHVEZW5zaXR5ID0gT3JkZS5NcGR1RGVuc2l0eTsKKwkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkFtc2R1RW5hYmxlID0gT3JkZS5BbXNkdUVuYWJsZTsKKwkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkFtc2R1U2l6ZT0gT3JkZS5BbXNkdVNpemU7CisJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5NaW1vUHM9IE9yZGUuTU1QU21vZGU7CisJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5NTVBTbW9kZSA9IE9yZGUuTU1QU21vZGU7CisJCQkJCQkvLyBVUGRhdGEgdG8gSFQgSUUKKwkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5NaW1vUHMgPSBPcmRlLk1NUFNtb2RlOworCQkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkFNc2R1U2l6ZSA9IE9yZGUuQW1zZHVTaXplOworCQkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBQYXJtLk1wZHVEZW5zaXR5ID0gT3JkZS5NcGR1RGVuc2l0eTsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkF1dG9CQSA9IE9yZGUuQXV0b0JBOworCQkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuUG9saWN5ID0gSU1NRURfQkE7IC8vIHdlIG9ubHkgc3VwcG9ydCBpbW1lZGlhdGUgQkEuCisJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5NcGR1RGVuc2l0eSA9IE9yZGUuTXBkdURlbnNpdHk7CisJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5NcGR1RGVuc2l0eSA9IE9yZGUuTXBkdURlbnNpdHk7CisJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5BbXNkdUVuYWJsZSA9IE9yZGUuQW1zZHVFbmFibGU7CisJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5BbXNkdVNpemU9IE9yZGUuQW1zZHVTaXplOworCQkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuTWltb1BzID0gT3JkZS5NTVBTbW9kZTsKKwkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1NUFNtb2RlID0gT3JkZS5NTVBTbW9kZTsKKworCQkJCQkJLy8gVVBkYXRhIHRvIEhUIElFCisJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uTWltb1BzID0gT3JkZS5NTVBTbW9kZTsKKwkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5BTXNkdVNpemUgPSBPcmRlLkFtc2R1U2l6ZTsKKwkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwUGFybS5NcGR1RGVuc2l0eSA9IE9yZGUuTXBkdURlbnNpdHk7CisKKwkJCQkJCWlmIChwQWRhcHRlci0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5SeEJBV2luTGltaXQgPiBNQVhfUlhfUkVPUkRFUkJVRikKKwkJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5SeEJBV2luTGltaXQgPSBNQVhfUlhfUkVPUkRFUkJVRjsKKworCQkJCQl9CisKKwkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5SRUdCQUNhcGFiaWxpdHkud29yZCA9IHBBZGFwdGVyLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LndvcmQ7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6KE9yZGUuQXV0b0JBID0gJWQpIChQb2xpY3k9JWQpKFJlQkFXaW5MaW1pdD0lZCkoVHhCQVdpbkxpbWl0PSVkKShBdXRvTW9kZT0lZClcbiIsT3JkZS5BdXRvQkEsIHBBZGFwdGVyLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlBvbGljeSwKKwkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlJ4QkFXaW5MaW1pdCxwQWRhcHRlci0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5UeEJBV2luTGltaXQsIHBBZGFwdGVyLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkF1dG9CQSkpOworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OihNaW1vUHMgPSAlZCkoQW1zZHVFbmFibGUgPSAlZCkgKEFtc2R1U2l6ZT0lZCkoTXBkdURlbnNpdHk9JWQpXG4iLHBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5Lk1pbW9QcywgcEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQW1zZHVFbmFibGUsCisJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5BbXNkdVNpemUsIHBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5Lk1wZHVEZW5zaXR5KSk7CisJCQkJfQorCisJCQkJYnJlYWs7CisJCWNhc2UgUlRfT0lEXzgwMl8xMV9BRERfSU1NRV9CQToKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiBTZXQgOjogUlRfT0lEXzgwMl8xMV9BRERfSU1NRV9CQSBcbiIpKTsKKwkJCWlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKE9JRF9BRERfQkFfRU5UUlkpKQorCQkJCQlTdGF0dXMgPSAtRUlOVkFMOworCQkJZWxzZQorCQkJeworCQkJCVVDSEFSCQkgICAgICAgIGluZGV4OworCQkJCU9JRF9BRERfQkFfRU5UUlkgICAgQkE7CisJCQkJTUFDX1RBQkxFX0VOVFJZICAgICAqcEVudHJ5OworCisJCQkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJkJBLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJCWlmIChCQS5USUQgPiAxNSkKKwkJCQl7CisJCQkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX0lOVkFMSURfREFUQTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCS8vQkFUYWJsZUluc2VydEVudHJ5CisJCQkJCS8vQXMgYWQtaG9jIG1vZGUsIEJBIHBhaXIgaXMgbm90IGxpbWl0ZWQgdG8gb25seSBCU1NJRC4gc28gYWRkIHZpYSBPSUQuCisJCQkJCWluZGV4ID0gQkEuVElEOworCQkJCQkvLyBpbiBhZCBob2MgbW9kZSwgd2hlbiBhZGRpbmcgQkEgcGFpciwgd2Ugc2hvdWxkIGluc2VydCB0aGlzIGVudHJ5IGludG8gTUFDRW50cnkgdG9vCisJCQkJCXBFbnRyeSA9IE1hY1RhYmxlTG9va3VwKHBBZGFwdGVyLCBCQS5NQUNBZGRyKTsKKwkJCQkJaWYgKCFwRW50cnkpCisJCQkJCXsKKwkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJUX09JRF84MDJfMTFfQUREX0lNTUVfQkEuIGJyZWFrIG9uIG5vIGNvbm5lY3Rpb24uLS0tLToleDoleFxuIiwgQkEuTUFDQWRkcls0XSwgQkEuTUFDQWRkcls1XSkpOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJaWYgKEJBLklzUmVjaXBpZW50ID09IEZBTFNFKQorCQkJCQl7CisJCQkJCSAgICBpZiAocEVudHJ5LT5iSUFtQmFkQXRoZXJvcyA9PSBUUlVFKQorCQkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlJ4QkFXaW5MaW1pdCA9IDB4MTA7CisKKwkJCQkJCUJBT3JpU2Vzc2lvblNldFVwKHBBZGFwdGVyLCBwRW50cnksIGluZGV4LCAwLCAxMDAsIFRSVUUpOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJLy9CQVRhYmxlSW5zZXJ0RW50cnkocEFkYXB0ZXIsIHBFbnRyeS0+QWlkLCBCQS5NQUNBZGRyLCAwLCAweGZmZmYsIEJBLlRJRCwgQkEubk1TRFUsIEJBLklzUmVjaXBpZW50KTsKKwkJCQkJfQorCisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6UlRfT0lEXzgwMl8xMV9BRERfSU1NRV9CQS4gUmVjID0gJWQuIE1hYyA9ICV4OiV4OiV4OiV4OiV4OiV4IC4gXG4iLAorCQkJCQkJQkEuSXNSZWNpcGllbnQsIEJBLk1BQ0FkZHJbMF0sIEJBLk1BQ0FkZHJbMV0sIEJBLk1BQ0FkZHJbMl0sIEJBLk1BQ0FkZHJbMl0KKwkJCQkJCSwgQkEuTUFDQWRkcls0XSwgQkEuTUFDQWRkcls1XSkpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUlRfT0lEXzgwMl8xMV9URUFSX0lNTUVfQkE6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQgOjogUlRfT0lEXzgwMl8xMV9URUFSX0lNTUVfQkEgXG4iKSk7CisJCQlpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihPSURfQUREX0JBX0VOVFJZKSkKKwkJCQkJU3RhdHVzID0gLUVJTlZBTDsKKwkJCWVsc2UKKwkJCXsKKwkJCQlQT0lEX0FERF9CQV9FTlRSWQlwQkE7CisJCQkJTUFDX1RBQkxFX0VOVFJZICpwRW50cnk7CisKKwkJCQlwQkEgPSBrbWFsbG9jKHdycS0+dS5kYXRhLmxlbmd0aCwgTUVNX0FMTE9DX0ZMQUcpOworCisJCQkJaWYgKHBCQSA9PSBOVUxMKQorCQkJCXsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0IDo6IFJUX09JRF84MDJfMTFfVEVBUl9JTU1FX0JBIGttYWxsb2MoKSBjYW4ndCBhbGxvY2F0ZSBlbm91Z2ggbWVtb3J5XG4iKSk7CisJCQkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX0ZBSUxVUkU7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKHBCQSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0IDo6IFJUX09JRF84MDJfMTFfVEVBUl9JTU1FX0JBKFRJRD0lZCwgYkFsbFRpZD0lZClcbiIsIHBCQS0+VElELCBwQkEtPmJBbGxUaWQpKTsKKworCQkJCQlpZiAoIXBCQS0+YkFsbFRpZCAmJiAocEJBLT5USUQgPiBOVU1fT0ZfVElEKSkKKwkJCQkJeworCQkJCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfSU5WQUxJRF9EQVRBOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKworCQkJCQlpZiAocEJBLT5Jc1JlY2lwaWVudCA9PSBGQUxTRSkKKwkJCQkJeworCQkJCQkJcEVudHJ5ID0gTWFjVGFibGVMb29rdXAocEFkYXB0ZXIsIHBCQS0+TUFDQWRkcik7CisJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIgcEJBLT5Jc1JlY2lwaWVudCA9PSBGQUxTRVxuIikpOworCQkJCQkJaWYgKHBFbnRyeSkKKwkJCQkJCXsKKwkJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIgcEJBLT5wRW50cnlcbiIpKTsKKwkJCQkJCQlCQU9yaVNlc3Npb25UZWFyRG93bihwQWRhcHRlciwgcEVudHJ5LT5BaWQsIHBCQS0+VElELCBGQUxTRSwgVFJVRSk7CisJCQkJCQl9CisJCQkJCQllbHNlCisJCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0IDo6IE5vdCBmb3VuZCBwRW50cnkgXG4iKSk7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlwRW50cnkgPSBNYWNUYWJsZUxvb2t1cChwQWRhcHRlciwgcEJBLT5NQUNBZGRyKTsKKwkJCQkJCWlmIChwRW50cnkpCisJCQkJCQl7CisJCQkJCQkJQkFSZWNTZXNzaW9uVGVhckRvd24oIHBBZGFwdGVyLCAoVUNIQVIpcEVudHJ5LT5BaWQsIHBCQS0+VElELCBUUlVFKTsKKwkJCQkJCX0KKwkJCQkJCWVsc2UKKwkJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQgOjogTm90IGZvdW5kIHBFbnRyeSBcbiIpKTsKKwkJCQkJfQorCQkJCQlrZnJlZShwQkEpOworCQkJCX0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisgICAgICAgIC8vIEZvciBXUEFfU1VQUExJQ0FOVCB0byBzZXQgc3RhdGljIHdlcCBrZXkKKyAgICAJY2FzZSBPSURfODAyXzExX0FERF9XRVA6CisgICAgCSAgICBwV2VwS2V5ID0ga21hbGxvYyh3cnEtPnUuZGF0YS5sZW5ndGgsIE1FTV9BTExPQ19GTEFHKTsKKworICAgIAkgICAgaWYocFdlcEtleSA9PSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FTk9NRU07CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX0FERF9XRVAsIEZhaWxlZCEhXG4iKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcihwV2VwS2V5LCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgaWYgKFN0YXR1cykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfQUREX1dFUCwgRmFpbGVkIChsZW5ndGggbWlzbWF0Y2gpISFcbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKwkJICAgICAgICBLZXlJZHggPSBwV2VwS2V5LT5LZXlJbmRleCAmIDB4MGZmZmZmZmY7CisgICAgICAgICAgICAgICAgLy8gS2V5SWR4IG11c3QgYmUgMCB+IDMKKyAgICAgICAgICAgICAgICBpZiAoS2V5SWR4ID4gNCkKKyAgICAJCQl7CisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfQUREX1dFUCwgRmFpbGVkIChLZXlJZHggbXVzdCBiZSBzbWFsbGVyIHRoYW4gNCkhIVxuIikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBVQ0hBUiBDaXBoZXJBbGcgPSAwOworICAgICAgICAgICAgICAgICAgICBQVUNIQVIgS2V5OworCisgICAgICAgICAgICAgICAgICAgIC8vIHNldCBrZXkgbWF0ZXJpYWwgYW5kIGtleSBsZW5ndGgKKyAgICAgICAgICAgICAgICAgICAgTmRpc1plcm9NZW1vcnkocEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLktleSwgMTYpOworICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uS2V5TGVuID0gKFVDSEFSKSBwV2VwS2V5LT5LZXlMZW5ndGg7CisgICAgICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5LZXksICZwV2VwS2V5LT5LZXlNYXRlcmlhbCwgcFdlcEtleS0+S2V5TGVuZ3RoKTsKKworICAgICAgICAgICAgICAgICAgICBzd2l0Y2gocFdlcEtleS0+S2V5TGVuZ3RoKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfQUREX1dFUCwgb25seSBzdXBwb3J0IENJUEhFUl9XRVA2NChsZW46NSkgJiBDSVBIRVJfV0VQMTI4KGxlbjoxMykhIVxuIikpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLkNpcGhlckFsZyA9IENpcGhlckFsZzsKKworICAgICAgICAgICAgICAgICAgICAvLyBEZWZhdWx0IGtleSBmb3IgdHggKHNoYXJlZCBrZXkpCisgICAgICAgICAgICAgICAgICAgIGlmIChwV2VwS2V5LT5LZXlJbmRleCAmIDB4ODAwMDAwMDApCisgICAgICAgICAgICAgICAgICAgIHsKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXQga2V5IG1hdGVyaWFsIGFuZCBrZXkgbGVuZ3RoCisgICAgICAgICAgICAgICAgICAgICAgICBOZGlzWmVyb01lbW9yeShwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZVNoYXJlZEtleVtLZXlJZHhdLktleSwgMTYpOworICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVTaGFyZWRLZXlbS2V5SWR4XS5LZXlMZW4gPSAoVUNIQVIpIHBXZXBLZXktPktleUxlbmd0aDsKKyAgICAgICAgICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlU2hhcmVkS2V5W0tleUlkeF0uS2V5LCAmcFdlcEtleS0+S2V5TWF0ZXJpYWwsIHBXZXBLZXktPktleUxlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZVNoYXJlZEtleUlkID0gS2V5SWR4OworICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVTaGFyZWRLZXlbS2V5SWR4XS5DaXBoZXJBbGcgPSBDaXBoZXJBbGc7CisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWQgPSAoVUNIQVIpIEtleUlkeDsKKyAgICAgICAgICAgICAgICAgICAgfQorCisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgICAgICAgICAgICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5Qb3J0U2VjdXJlZCA9PSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRCkKKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEtleSA9IHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5LZXk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNldCBrZXkgbWF0ZXJpYWwgYW5kIGNpcGhlckFsZyB0byBBc2ljCisgICAgICAgIAkJCQlBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkYXB0ZXIsIEJTUzAsIEtleUlkeCwgQ2lwaGVyQWxnLCBLZXksIE5VTEwsIE5VTEwpOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocFdlcEtleS0+S2V5SW5kZXggJiAweDgwMDAwMDAwKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBNQUNfVEFCTEVfRU5UUlkgcEVudHJ5ID0gJnBBZGFwdGVyLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBc3NpZ24gZ3JvdXAga2V5IGluZm8KKyAgICAJCQkJCQlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZGFwdGVyLCBCU1MwLCBLZXlJZHgsIENpcGhlckFsZywgTlVMTCk7CisgICAgCQkJCQkJLy8gQXNzaWduIHBhaXJ3aXNlIGtleSBpbmZvCisgICAgCQkJCQkJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWRhcHRlciwgQlNTMCwgS2V5SWR4LCBDaXBoZXJBbGcsIHBFbnRyeSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX0FERF9XRVAgKGlkPTB4JXgsIExlbj0lZC1ieXRlKSwgJXNcbiIsIHBXZXBLZXktPktleUluZGV4LCBwV2VwS2V5LT5LZXlMZW5ndGgsIChwQWRhcHRlci0+U3RhQ2ZnLlBvcnRTZWN1cmVkID09IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEKSA/ICJQb3J0IFNlY3VyZWQiOiJQb3J0IE5PVCBTZWN1cmVkIikpOworCQkJCX0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGtmcmVlKHBXZXBLZXkpOworICAgICAgICAgICAgYnJlYWs7CisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorCSAgICBjYXNlIE9JRF9TRVRfQ09VTlRFUk1FQVNVUkVTOgorICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoaW50KSkKKyAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgZW5hYmxlZCA9IDA7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJmVuYWJsZWQsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgaWYgKGVuYWJsZWQgPT0gMSkKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5iQmxvY2tBc3NvYyA9IFRSVUU7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAvLyBXUEEgTUlDIGVycm9yIHNob3VsZCBibG9jayBhc3NvY2lhdGlvbiBhdHRlbXB0IGZvciA2MCBzZWNvbmRzCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuYkJsb2NrQXNzb2MgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF9TRVRfQ09VTlRFUk1FQVNVUkVTIGJCbG9ja0Fzc29jPSVzXG4iLCBwQWRhcHRlci0+U3RhQ2ZnLmJCbG9ja0Fzc29jID8gIlRSVUUiOiJGQUxTRSIpKTsKKyAgICAgICAgICAgIH0KKwkgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJUX09JRF9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUOgorCQkJaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoVUNIQVIpKQorICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZ3cGFfc3VwcGxpY2FudF9lbmFibGUsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgCQkJcEFkYXB0ZXItPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgPSB3cGFfc3VwcGxpY2FudF9lbmFibGU7CisgICAgCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpSVF9PSURfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAoPSVkKVxuIiwgcEFkYXB0ZXItPlN0YUNmZy5XcGFTdXBwbGljYW50VVApKTsKKwkJCX0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfREVBVVRIRU5USUNBVElPTjoKKyAgICAgICAgICAgIGlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKE1MTUVfREVBVVRIX1JFUV9TVFJVQ1QpKQorICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE1MTUVfREVBVVRIX1JFUV9TVFJVQ1QgICAgICAqcEluZm87CisJCQkJTUxNRV9RVUVVRV9FTEVNICpNc2dFbGVtID0gKE1MTUVfUVVFVUVfRUxFTSAqKSBrbWFsbG9jKHNpemVvZihNTE1FX1FVRVVFX0VMRU0pLCBNRU1fQUxMT0NfRkxBRyk7CisKKyAgICAgICAgICAgICAgICBwSW5mbyA9IChNTE1FX0RFQVVUSF9SRVFfU1RSVUNUICopIE1zZ0VsZW0tPk1zZzsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcihwSW5mbywgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBNbG1lRGVhdXRoUmVxQWN0aW9uKHBBZGFwdGVyLCBNc2dFbGVtKTsKKwkJCQlrZnJlZShNc2dFbGVtKTsKKworICAgICAgICAgICAgICAgIGlmIChJTkZSQV9PTihwQWRhcHRlcikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBMaW5rRG93bihwQWRhcHRlciwgRkFMU0UpOworICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlID0gQVNTT0NfSURMRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX0RFQVVUSEVOVElDQVRJT04gKFJlYXNvbj0lZClcbiIsIHBJbmZvLT5SZWFzb24pKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfRFJPUF9VTkVOQ1JZUFRFRDoKKyAgICAgICAgICAgIGlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKGludCkpCisgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGVuYWJsZWQgPSAwOworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZlbmFibGVkLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgICAgIGlmIChlbmFibGVkID09IDEpCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQ7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQ7CisJCQkJTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkYXB0ZXItPk1hY1RhYkxvY2spOworCQkJCXBBZGFwdGVyLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5Qb3J0U2VjdXJlZCA9IHBBZGFwdGVyLT5TdGFDZmcuUG9ydFNlY3VyZWQ7CisJCQkJTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkYXB0ZXItPk1hY1RhYkxvY2spOworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9EUk9QX1VORU5DUllQVEVEICg9JWQpXG4iLCBlbmFibGVkKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX1NFVF9JRUVFODAyMVg6CisgICAgICAgICAgICBpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihCT09MRUFOKSkKKyAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmSUVFRTgwMjF4U3RhdGUsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCSAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5JRUVFODAyMVggPSBJRUVFODAyMXhTdGF0ZTsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfU0VUX0lFRUU4MDIxWCAoPSVkKVxuIiwgSUVFRTgwMjF4U3RhdGUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfU0VUX0lFRUU4MDIxWF9SRVFVSVJFX0tFWToKKwkJCWlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKEJPT0xFQU4pKQorCQkJCSBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmSUVFRTgwMjF4X3JlcXVpcmVkX2tleXMsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQkJcEFkYXB0ZXItPlN0YUNmZy5JRUVFODAyMXhfcmVxdWlyZWRfa2V5cyA9IElFRUU4MDIxeF9yZXF1aXJlZF9rZXlzOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9TRVRfSUVFRTgwMjFYX1JFUVVJUkVfS0VZICglZClcbiIsIElFRUU4MDIxeF9yZXF1aXJlZF9rZXlzKSk7CisJCQl9CisJCQlicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX1BNS0lEOgorCSAgICAgICAgcFBta0lkID0ga21hbGxvYyh3cnEtPnUuZGF0YS5sZW5ndGgsIE1FTV9BTExPQ19GTEFHKTsKKworCSAgICAgICAgaWYocFBta0lkID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRU5PTUVNOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIocFBta0lkLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCisJICAgICAgICAvLyBjaGVjayB0aGUgUE1LSUQgaW5mb3JtYXRpb24KKwkgICAgICAgIGlmIChwUG1rSWQtPkJTU0lESW5mb0NvdW50ID09IDApCisgICAgICAgICAgICAgICAgTmRpc1plcm9NZW1vcnkocEFkYXB0ZXItPlN0YUNmZy5TYXZlZFBNSywgc2l6ZW9mKEJTU0lEX0lORk8pKlBNS0lEX05PKTsKKwkgICAgICAgIGVsc2UKKwkgICAgICAgIHsKKwkJICAgICAgICBQQlNTSURfSU5GTwlwQnNzSWRJbmZvOworCQkgICAgICAgIFVJTlQJCUJzc0lkeDsKKwkJICAgICAgICBVSU5UCQlDYWNoZWRJZHg7CisKKwkJICAgICAgICBmb3IgKEJzc0lkeCA9IDA7IEJzc0lkeCA8IHBQbWtJZC0+QlNTSURJbmZvQ291bnQ7IEJzc0lkeCsrKQorCQkgICAgICAgIHsKKwkJCSAgICAgICAgLy8gcG9pbnQgdG8gdGhlIGluZGV4ZWQgQlNTSURfSU5GTyBzdHJ1Y3R1cmUKKwkJCSAgICAgICAgcEJzc0lkSW5mbyA9IChQQlNTSURfSU5GTykgKChQVUNIQVIpIHBQbWtJZCArIDIgKiBzaXplb2YoVUlOVCkgKyBCc3NJZHggKiBzaXplb2YoQlNTSURfSU5GTykpOworCQkJICAgICAgICAvLyBGaW5kIHRoZSBlbnRyeSBpbiB0aGUgc2F2ZWQgZGF0YSBiYXNlLgorCQkJICAgICAgICBmb3IgKENhY2hlZElkeCA9IDA7IENhY2hlZElkeCA8IHBBZGFwdGVyLT5TdGFDZmcuU2F2ZWRQTUtOdW07IENhY2hlZElkeCsrKQorCQkJICAgICAgICB7CisJCQkJICAgICAgICAvLyBjb21wYXJlIHRoZSBCU1NJRAorCQkJCSAgICAgICAgaWYgKE5kaXNFcXVhbE1lbW9yeShwQnNzSWRJbmZvLT5CU1NJRCwgcEFkYXB0ZXItPlN0YUNmZy5TYXZlZFBNS1tDYWNoZWRJZHhdLkJTU0lELCBzaXplb2YoTkRJU184MDJfMTFfTUFDX0FERFJFU1MpKSkKKwkJCQkJICAgICAgICBicmVhazsKKwkJCSAgICAgICAgfQorCisJCQkgICAgICAgIC8vIEZvdW5kLCByZXBsYWNlIGl0CisJCQkgICAgICAgIGlmIChDYWNoZWRJZHggPCBQTUtJRF9OTykKKwkJCSAgICAgICAgeworCQkJCSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfT0ZGLCAoIlVwZGF0ZSBPSURfODAyXzExX1BNS0lELCBpZHggPSAlZFxuIiwgQ2FjaGVkSWR4KSk7CisJCQkJICAgICAgICBOZGlzTW92ZU1lbW9yeSgmcEFkYXB0ZXItPlN0YUNmZy5TYXZlZFBNS1tDYWNoZWRJZHhdLCBwQnNzSWRJbmZvLCBzaXplb2YoQlNTSURfSU5GTykpOworCQkJCSAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5TYXZlZFBNS051bSsrOworCQkJICAgICAgICB9CisJCQkgICAgICAgIC8vIE5vdCBmb3VuZCwgcmVwbGFjZSB0aGUgbGFzdCBvbmUKKwkJCSAgICAgICAgZWxzZQorCQkJICAgICAgICB7CisJCQkJICAgICAgICAvLyBSYW5kb21seSByZXBsYWNlIG9uZQorCQkJCSAgICAgICAgQ2FjaGVkSWR4ID0gKHBCc3NJZEluZm8tPkJTU0lEWzVdICUgUE1LSURfTk8pOworCQkJCSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfT0ZGLCAoIlVwZGF0ZSBPSURfODAyXzExX1BNS0lELCBpZHggPSAlZFxuIiwgQ2FjaGVkSWR4KSk7CisJCQkJICAgICAgICBOZGlzTW92ZU1lbW9yeSgmcEFkYXB0ZXItPlN0YUNmZy5TYXZlZFBNS1tDYWNoZWRJZHhdLCBwQnNzSWRJbmZvLCBzaXplb2YoQlNTSURfSU5GTykpOworCQkJICAgICAgICB9CisJCSAgICAgICAgfQorCQkJfQorCQkJaWYocFBta0lkKQorCQkJCWtmcmVlKHBQbWtJZCk7CisJICAgICAgICBicmVhazsKKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisKKworCisjaWZkZWYgU05NUF9TVVBQT1JUCisJCWNhc2UgT0lEXzgwMl8xMV9TSE9SVFJFVFJZTElNSVQ6CisJCQlpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihVTE9ORykpCisJCQkJU3RhdHVzID0gLUVJTlZBTDsKKwkJCWVsc2UKKwkJCXsKKwkJCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmU2hvcnRSZXRyeUxpbWl0LCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJCVJUTVBfSU9fUkVBRDMyKHBBZGFwdGVyLCBUWF9SVFlfQ0ZHLCAmdHhfcnR5X2NmZy53b3JkKTsKKwkJCQl0eF9ydHlfY2ZnLmZpZWxkLlNob3J0UnR5TGltaXQgPSBTaG9ydFJldHJ5TGltaXQ7CisJCQkJUlRNUF9JT19XUklURTMyKHBBZGFwdGVyLCBUWF9SVFlfQ0ZHLCB0eF9ydHlfY2ZnLndvcmQpOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9TSE9SVFJFVFJZTElNSVQgKHR4X3J0eV9jZmcuZmllbGQuU2hvcnRSZXRyeUxpbWl0PSVkLCBTaG9ydFJldHJ5TGltaXQ9JWxkKVxuIiwgdHhfcnR5X2NmZy5maWVsZC5TaG9ydFJ0eUxpbWl0LCBTaG9ydFJldHJ5TGltaXQpKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgT0lEXzgwMl8xMV9MT05HUkVUUllMSU1JVDoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9MT05HUkVUUllMSU1JVCBcbiIpKTsKKwkJCWlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKFVMT05HKSkKKwkJCQlTdGF0dXMgPSAtRUlOVkFMOworCQkJZWxzZQorCQkJeworCQkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZMb25nUmV0cnlMaW1pdCwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCQlSVE1QX0lPX1JFQUQzMihwQWRhcHRlciwgVFhfUlRZX0NGRywgJnR4X3J0eV9jZmcud29yZCk7CisJCQkJdHhfcnR5X2NmZy5maWVsZC5Mb25nUnR5TGltaXQgPSBMb25nUmV0cnlMaW1pdDsKKwkJCQlSVE1QX0lPX1dSSVRFMzIocEFkYXB0ZXIsIFRYX1JUWV9DRkcsIHR4X3J0eV9jZmcud29yZCk7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX0xPTkdSRVRSWUxJTUlUICh0eF9ydHlfY2ZnLmZpZWxkLkxvbmdSZXRyeUxpbWl0PSAlZCxMb25nUmV0cnlMaW1pdD0lbGQpXG4iLCB0eF9ydHlfY2ZnLmZpZWxkLkxvbmdSdHlMaW1pdCwgTG9uZ1JldHJ5TGltaXQpKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgT0lEXzgwMl8xMV9XRVBERUZBVUxUS0VZVkFMVUU6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfV0VQREVGQVVMVEtFWVZBTFVFXG4iKSk7CisJCQlwS2V5ID0ga21hbGxvYyh3cnEtPnUuZGF0YS5sZW5ndGgsIEdGUF9LRVJORUwpOworCQkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIocEtleSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCS8vcEtleSA9ICZXZXBLZXk7CisKKwkJCWlmICggcEtleS0+TGVuZ3RoICE9IHdycS0+dS5kYXRhLmxlbmd0aCkKKwkJCXsKKwkJCQlTdGF0dXMgPSAtRUlOVkFMOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9XRVBERUZBVUxUS0VZVkFMVUUsIEZhaWxlZCEhXG4iKSk7CisJCQl9CisJCQlLZXlJZHggPSBwS2V5LT5LZXlJbmRleCAmIDB4MGZmZmZmZmY7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoInBLZXktPktleUluZGV4ID0lZCwgcEtleS0+S2V5TGVuZ3RoPSVkXG4iLCBwS2V5LT5LZXlJbmRleCwgcEtleS0+S2V5TGVuZ3RoKSk7CisKKwkJCS8vIGl0IGlzIGEgc2hhcmVkIGtleQorCQkJaWYgKEtleUlkeCA+IDQpCisJCQkJU3RhdHVzID0gLUVJTlZBTDsKKwkJCWVsc2UKKwkJCXsKKwkJCQlwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW3BBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5LZXlMZW4gPSAoVUNIQVIpIHBLZXktPktleUxlbmd0aDsKKwkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uS2V5LCAmcEtleS0+S2V5TWF0ZXJpYWwsIHBLZXktPktleUxlbmd0aCk7CisJCQkJaWYgKHBLZXktPktleUluZGV4ICYgMHg4MDAwMDAwMCkKKwkJCQl7CisJCQkJCS8vIERlZmF1bHQga2V5IGZvciB0eCAoc2hhcmVkIGtleSkKKwkJCQkJcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWQgPSAoVUNIQVIpIEtleUlkeDsKKwkJCQl9CisJCQkJLy9SZXN0YXJ0QVBJc1JlcXVpcmVkID0gVFJVRTsKKwkJCX0KKwkJCWJyZWFrOworCisKKwkJY2FzZSBPSURfODAyXzExX1dFUERFRkFVTFRLRVlJRDoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9XRVBERUZBVUxUS0VZSUQgXG4iKSk7CisKKwkJCWlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKFVDSEFSKSkKKwkJCQlTdGF0dXMgPSAtRUlOVkFMOworCQkJZWxzZQorCQkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKworCQkJYnJlYWs7CisKKworCQljYXNlIE9JRF84MDJfMTFfQ1VSUkVOVENIQU5ORUw6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfQ1VSUkVOVENIQU5ORUwgXG4iKSk7CisJCQlpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihVQ0hBUikpCisJCQkJU3RhdHVzID0gLUVJTlZBTDsKKwkJCWVsc2UKKwkJCXsKKwkJCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmY3RtcCwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCQlzcHJpbnRmKCZjdG1wLCIlZCIsIGN0bXApOworCQkJCVNldF9DaGFubmVsX1Byb2MocEFkYXB0ZXIsICZjdG1wKTsKKwkJCX0KKwkJCWJyZWFrOworI2VuZGlmCisKKworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OnVua25vd24gSU9DVEwncyBzdWJjbWQgPSAweCUwOHhcbiIsIGNtZCkpOworICAgICAgICAgICAgU3RhdHVzID0gLUVPUE5PVFNVUFA7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKworICAgIHJldHVybiBTdGF0dXM7Cit9CisKK0lOVCBSVE1QUXVlcnlJbmZvcm1hdGlvbigKKyAgICBJTiAgUFJUTVBfQURBUFRFUiBwQWRhcHRlciwKKyAgICBJTiAgT1VUIHN0cnVjdCBpZnJlcSAgICAqcnEsCisgICAgSU4gIElOVCAgICAgICAgICAgICAgICAgY21kKQoreworICAgIHN0cnVjdCBpd3JlcSAgICAgICAgICAgICAgICAgICAgICAgICp3cnEgPSAoc3RydWN0IGl3cmVxICopIHJxOworICAgIE5ESVNfODAyXzExX0JTU0lEX0xJU1RfRVggICAgICAgICAgICpwQnNzaWRMaXN0ID0gTlVMTDsKKyAgICBQTkRJU19XTEFOX0JTU0lEX0VYICAgICAgICAgICAgICAgICBwQnNzOworICAgIE5ESVNfODAyXzExX1NTSUQgICAgICAgICAgICAgICAgICAgIFNzaWQ7CisgICAgTkRJU184MDJfMTFfQ09ORklHVVJBVElPTiAgICAgICAgICAgKnBDb25maWd1cmF0aW9uID0gTlVMTDsKKyAgICBSVF84MDJfMTFfTElOS19TVEFUVVMgICAgICAgICAgICAgICAqcExpbmtTdGF0dXMgPSBOVUxMOworICAgIFJUXzgwMl8xMV9TVEFfQ09ORklHICAgICAgICAgICAgICAgICpwU3RhQ29uZmlnID0gTlVMTDsKKyAgICBORElTXzgwMl8xMV9TVEFUSVNUSUNTICAgICAgICAgICAgICAqcFN0YXRpc3RpY3MgPSBOVUxMOworICAgIE5ESVNfODAyXzExX1JUU19USFJFU0hPTEQgICAgICAgICAgIFJ0c1RocmVzaDsKKyAgICBORElTXzgwMl8xMV9GUkFHTUVOVEFUSU9OX1RIUkVTSE9MRCBGcmFnVGhyZXNoOworICAgIE5ESVNfODAyXzExX1BPV0VSX01PREUgICAgICAgICAgICAgIFBvd2VyTW9kZTsKKyAgICBORElTXzgwMl8xMV9ORVRXT1JLX0lORlJBU1RSVUNUVVJFICBCc3NUeXBlOworICAgIFJUXzgwMl8xMV9QUkVBTUJMRSAgICAgICAgICAgICAgICAgIFByZWFtVHlwZTsKKyAgICBORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9NT0RFICAgICBBdXRoTW9kZTsKKyAgICBORElTXzgwMl8xMV9XRVBfU1RBVFVTICAgICAgICAgICAgICBXZXBTdGF0dXM7CisgICAgTkRJU19NRURJQV9TVEFURSAgICAgICAgICAgICAgICAgICAgTWVkaWFTdGF0ZTsKKyAgICBVTE9ORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCc3NCdWZTaXplLCB1bEluZm89MCwgTmV0d29ya1R5cGVMaXN0WzRdLCBhcHNkID0gMDsKKyAgICBVU0hPUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCc3NMZW4gPSAwOworICAgIFBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCdWYgPSBOVUxMLCBwUHRyOworICAgIElOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisgICAgVUlOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2VfdmVyc2lvbl9jb21waWxlZDsKKyAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLCBQYWRkaW5nID0gMDsKKyAgICBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSYWRpb1N0YXRlOworCVVDSEFSCWRyaXZlclZlcnNpb25bOF07CisgICAgT0lEX1NFVF9IVF9QSFlNT0RFCQkJICAgICAgICAqcEhUUGh5TW9kZSA9IE5VTEw7CisKKworI2lmZGVmIFNOTVBfU1VQUE9SVAorCS8vZm9yIHNubXAsIGthdGh5CisJRGVmYXVsdEtleUlkeFZhbHVlCQkJKnBLZXlJZHhWYWx1ZTsKKwlJTlQJCQkJCQkJdmFsdWVMZW47CisJVFhfUlRZX0NGR19TVFJVQwkJCXR4X3J0eV9jZmc7CisJVUxPTkcJCQkJCQlTaG9ydFJldHJ5TGltaXQsIExvbmdSZXRyeUxpbWl0OworCVVDSEFSCQkJCQkJdG1wWzY0XTsKKyNlbmRpZiAvL1NOTVAKKworICAgIHN3aXRjaChjbWQpCisgICAgeworICAgICAgICBjYXNlIFJUX09JRF9ERVZJQ0VfTkFNRToKKyAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihTVEFfTklDX0RFVklDRV9OQU1FKTsKKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBTVEFfTklDX0RFVklDRV9OQU1FLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlRfT0lEX1ZFUlNJT05fSU5GTzoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfVkVSU0lPTl9JTkZPIFxuIikpOworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gOCpzaXplb2YoVUNIQVIpOworCQkJc3ByaW50ZigmZHJpdmVyVmVyc2lvblswXSwgIiVzIiwgU1RBX0RSSVZFUl9WRVJTSU9OKTsKKwkJCWRyaXZlclZlcnNpb25bN10gPSAnXDAnOworCQkJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmZHJpdmVyVmVyc2lvbiwgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIHsKKwkJCQlTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisjaWZkZWYgUkFMSU5LX0FURQorCQljYXNlIFJUX1FVRVJZX0FURV9UWERPTkVfQ09VTlQ6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfUVVFUllfQVRFX1RYRE9ORV9DT1VOVCBcbiIpKTsKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihVSU5UMzIpOworCQkJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmcEFkYXB0ZXItPmF0ZS5UeERvbmVDb3VudCwgd3JxLT51LmRhdGEubGVuZ3RoKSkKKwkJCXsKKwkJCQlTdGF0dXMgPSAtRUZBVUxUOworCQkJfQorCQkJYnJlYWs7CisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworICAgICAgICBjYXNlIE9JRF84MDJfMTFfQlNTSURfTElTVDoKKyAgICAgICAgICAgIGlmIChSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAJLyoKKyAgICAgICAgICAgIAkgKiBTdGlsbCBzY2FubmluZywgaW5kaWNhdGUgdGhlIGNhbGxlciBzaG91bGQgdHJ5IGFnYWluLgorICAgICAgICAgICAgCSAqLworICAgICAgICAgICAgCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX0JTU0lEX0xJU1QgKFN0aWxsIHNjYW5uaW5nKVxuIikpOworCQkJCXJldHVybiAtRUFHQUlOOworICAgICAgICAgICAgfQorICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfQlNTSURfTElTVCAoJWQgQlNTIHJldHVybmVkKVxuIixwQWRhcHRlci0+U2NhblRhYi5Cc3NOcikpOworCQkJcEFkYXB0ZXItPlN0YUNmZy5iU2NhblJlcUlzRnJvbVdlYlVJID0gRkFMU0U7CisgICAgICAgICAgICAvLyBDbGFjdWxhdGUgdG90YWwgYnVmZmVyIHNpemUgcmVxdWlyZWQKKyAgICAgICAgICAgIEJzc0J1ZlNpemUgPSBzaXplb2YoVUxPTkcpOworCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcEFkYXB0ZXItPlNjYW5UYWIuQnNzTnI7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBBbGlnbiBwb2ludGVyIHRvIDQgYnl0ZXMgYm91bmRhcnkuCisgICAgICAgICAgICAgICAgLy9QYWRkaW5nID0gNCAtIChwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5WYXJJRUxlbiAmIDB4MDAwMyk7CisgICAgICAgICAgICAgICAgLy9pZiAoUGFkZGluZyA9PSA0KQorICAgICAgICAgICAgICAgIC8vICAgIFBhZGRpbmcgPSAwOworICAgICAgICAgICAgICAgIEJzc0J1ZlNpemUgKz0gKHNpemVvZihORElTX1dMQU5fQlNTSURfRVgpIC0gMSArIHNpemVvZihORElTXzgwMl8xMV9GSVhFRF9JRXMpICsgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uVmFySUVMZW4gKyBQYWRkaW5nKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gRm9yIHNhZmV0eSBpc3N1ZSwgd2UgYWRkIDI1NiBieXRlcyBqdXN0IGluIGNhc2UKKyAgICAgICAgICAgIEJzc0J1ZlNpemUgKz0gMjU2OworICAgICAgICAgICAgLy8gQWxsb2NhdGUgdGhlIHNhbWUgc2l6ZSBhcyBwYXNzZWQgZnJvbSBoaWdoZXIgbGF5ZXIKKyAgICAgICAgICAgIHBCdWYgPSBrbWFsbG9jKEJzc0J1ZlNpemUsIE1FTV9BTExPQ19GTEFHKTsKKyAgICAgICAgICAgIGlmKHBCdWYgPT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRU5PTUVNOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gSW5pdCA4MDJfMTFfQlNTSURfTElTVF9FWCBzdHJ1Y3R1cmUKKyAgICAgICAgICAgIE5kaXNaZXJvTWVtb3J5KHBCdWYsIEJzc0J1ZlNpemUpOworICAgICAgICAgICAgcEJzc2lkTGlzdCA9IChQTkRJU184MDJfMTFfQlNTSURfTElTVF9FWCkgcEJ1ZjsKKyAgICAgICAgICAgIHBCc3NpZExpc3QtPk51bWJlck9mSXRlbXMgPSBwQWRhcHRlci0+U2NhblRhYi5Cc3NOcjsKKworICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIHRvdGFsIGJ1ZmZlciBsZW5ndGgKKyAgICAgICAgICAgIEJzc0xlbiA9IDQ7IC8vIENvbnNpc3Qgb2YgTnVtYmVyT2ZJdGVtcworICAgICAgICAgICAgLy8gUG9pbnQgdG8gc3RhcnQgb2YgTkRJU19XTEFOX0JTU0lEX0VYCisgICAgICAgICAgICAvLyBwUHRyID0gcEJ1ZiArIHNpemVvZihVTE9ORyk7CisgICAgICAgICAgICBwUHRyID0gKFBVQ0hBUikgJnBCc3NpZExpc3QtPkJzc2lkWzBdOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHBBZGFwdGVyLT5TY2FuVGFiLkJzc05yOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcEJzcyA9IChQTkRJU19XTEFOX0JTU0lEX0VYKSBwUHRyOworICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KCZwQnNzLT5NYWNBZGRyZXNzLCAmcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uQnNzaWQsIE1BQ19BRERSX0xFTik7CisgICAgICAgICAgICAgICAgaWYgKChwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5IaWRkZW4gPT0gMSkgJiYgKHBBZGFwdGVyLT5TdGFDZmcuYlNob3dIaWRkZW5TU0lEID09IEZBTFNFKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vCisJCQkJCS8vIFdlIG11c3QgcmV0dXJuIHRoaXMgU1NJRCBkdXJpbmcgNHdheSBoYW5kc2hha2luZywgb3RoZXJ3aXNlIEFlZ2lzIHdpbGwgZmFpbGVkIHRvIHBhcnNlIFdQQSBpbmZvbWF0aW9uCisJCQkJCS8vIGFuZCB0aGVuIGZhaWxlZCB0byBzZW5kIEVBUE9sIGZhcmFtZS4KKwkJCQkJLy8KKwkJCQkJaWYgKChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkgJiYgKHBBZGFwdGVyLT5TdGFDZmcuUG9ydFNlY3VyZWQgIT0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQpKQorCQkJCQl7CisJCQkJCQlwQnNzLT5Tc2lkLlNzaWRMZW5ndGggPSBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Tc2lkTGVuOworCQkJCQkJTmRpc01vdmVNZW1vcnkocEJzcy0+U3NpZC5Tc2lkLCBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Tc2lkLCBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Tc2lkTGVuKTsKKwkJCQkJfQorCQkJCQllbHNlCisgICAgICAgICAgICAgICAgICAgIAlwQnNzLT5Tc2lkLlNzaWRMZW5ndGggPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwQnNzLT5Tc2lkLlNzaWRMZW5ndGggPSBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Tc2lkTGVuOworICAgICAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQnNzLT5Tc2lkLlNzaWQsIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlNzaWQsIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlNzaWRMZW4pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwQnNzLT5Qcml2YWN5ID0gcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uUHJpdmFjeTsKKyAgICAgICAgICAgICAgICBwQnNzLT5Sc3NpID0gcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uUnNzaSAtIHBBZGFwdGVyLT5CYnBSc3NpVG9EYm1EZWx0YTsKKyAgICAgICAgICAgICAgICBwQnNzLT5OZXR3b3JrVHlwZUluVXNlID0gTmV0d29ya1R5cGVJblVzZVNhbml0eSgmcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0pOworICAgICAgICAgICAgICAgIHBCc3MtPkNvbmZpZ3VyYXRpb24uTGVuZ3RoID0gc2l6ZW9mKE5ESVNfODAyXzExX0NPTkZJR1VSQVRJT04pOworICAgICAgICAgICAgICAgIHBCc3MtPkNvbmZpZ3VyYXRpb24uQmVhY29uUGVyaW9kID0gcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uQmVhY29uUGVyaW9kOworICAgICAgICAgICAgICAgIHBCc3MtPkNvbmZpZ3VyYXRpb24uQVRJTVdpbmRvdyA9IHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkF0aW1XaW47CisKKyAgICAgICAgICAgICAgICBNQVBfQ0hBTk5FTF9JRF9UT19LSFoocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uQ2hhbm5lbCwgcEJzcy0+Q29uZmlndXJhdGlvbi5EU0NvbmZpZyk7CisKKyAgICAgICAgICAgICAgICBpZiAocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uQnNzVHlwZSA9PSBCU1NfSU5GUkEpCisgICAgICAgICAgICAgICAgICAgIHBCc3MtPkluZnJhc3RydWN0dXJlTW9kZSA9IE5kaXM4MDJfMTFJbmZyYXN0cnVjdHVyZTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHBCc3MtPkluZnJhc3RydWN0dXJlTW9kZSA9IE5kaXM4MDJfMTFJQlNTOworCisgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEJzcy0+U3VwcG9ydGVkUmF0ZXMsIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlN1cFJhdGUsIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlN1cFJhdGVMZW4pOworICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBCc3MtPlN1cHBvcnRlZFJhdGVzICsgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uU3VwUmF0ZUxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5FeHRSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkV4dFJhdGVMZW4pOworCisgICAgICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlZhcklFTGVuID09IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwQnNzLT5JRUxlbmd0aCA9IHNpemVvZihORElTXzgwMl8xMV9GSVhFRF9JRXMpOworICAgICAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQnNzLT5JRXMsICZwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5GaXhJRXMsIHNpemVvZihORElTXzgwMl8xMV9GSVhFRF9JRXMpKTsKKyAgICAgICAgICAgICAgICAgICAgcFB0ciA9IHBQdHIgKyBzaXplb2YoTkRJU19XTEFOX0JTU0lEX0VYKSAtIDEgKyBzaXplb2YoTkRJU184MDJfMTFfRklYRURfSUVzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcEJzcy0+SUVMZW5ndGggPSAoVUxPTkcpKHNpemVvZihORElTXzgwMl8xMV9GSVhFRF9JRXMpICsgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uVmFySUVMZW4pOworICAgICAgICAgICAgICAgICAgICBwUHRyID0gcFB0ciArIHNpemVvZihORElTX1dMQU5fQlNTSURfRVgpIC0gMSArIHNpemVvZihORElTXzgwMl8xMV9GSVhFRF9JRXMpOworICAgICAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQnNzLT5JRXMsICZwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5GaXhJRXMsIHNpemVvZihORElTXzgwMl8xMV9GSVhFRF9JRXMpKTsKKyAgICAgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEJzcy0+SUVzICsgc2l6ZW9mKE5ESVNfODAyXzExX0ZJWEVEX0lFcyksIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlZhcklFcywgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uVmFySUVMZW4pOworICAgICAgICAgICAgICAgICAgICBwUHRyICs9IHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlZhcklFTGVuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwQnNzLT5MZW5ndGggPSAoVUxPTkcpKHNpemVvZihORElTX1dMQU5fQlNTSURfRVgpIC0gMSArIHNpemVvZihORElTXzgwMl8xMV9GSVhFRF9JRXMpICsgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uVmFySUVMZW4gKyBQYWRkaW5nKTsKKworI2lmIFdJUkVMRVNTX0VYVCA8IDE3CisgICAgICAgICAgICAgICAgaWYgKChCc3NMZW4gKyBwQnNzLT5MZW5ndGgpIDwgd3JxLT51LmRhdGEubGVuZ3RoKQorICAgICAgICAgICAgICAgIEJzc0xlbiArPSBwQnNzLT5MZW5ndGg7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcEJzc2lkTGlzdC0+TnVtYmVyT2ZJdGVtcyA9IGk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyNlbHNlCisgICAgICAgICAgICAgICAgQnNzTGVuICs9IHBCc3MtPkxlbmd0aDsKKyNlbmRpZgorICAgICAgICAgICAgfQorCisjaWYgV0lSRUxFU1NfRVhUIDwgMTcKKyAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IEJzc0xlbjsKKyNlbHNlCisgICAgICAgICAgICBpZiAoQnNzTGVuID4gd3JxLT51LmRhdGEubGVuZ3RoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGtmcmVlKHBCc3NpZExpc3QpOworICAgICAgICAgICAgICAgIHJldHVybiAtRTJCSUc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gQnNzTGVuOworI2VuZGlmCisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcEJzc2lkTGlzdCwgQnNzTGVuKTsKKyAgICAgICAgICAgIGtmcmVlKHBCc3NpZExpc3QpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8zX0NVUlJFTlRfQUREUkVTUzoKKyAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IE1BQ19BRERSX0xFTjsKKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmcEFkYXB0ZXItPkN1cnJlbnRBZGRyZXNzLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEX0dFTl9NRURJQV9DT05ORUNUX1NUQVRVUzoKKyAgICAgICAgICAgIGlmIChwQWRhcHRlci0+SW5kaWNhdGVNZWRpYVN0YXRlID09IE5kaXNNZWRpYVN0YXRlQ29ubmVjdGVkKQorICAgICAgICAgICAgICAgIE1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZUNvbm5lY3RlZDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBNZWRpYVN0YXRlID0gTmRpc01lZGlhU3RhdGVEaXNjb25uZWN0ZWQ7CisKKyAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihORElTX01FRElBX1NUQVRFKTsKKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmTWVkaWFTdGF0ZSwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfQlNTSUQ6CisjaWZkZWYgUkFMSU5LX0FURQorCQkJaWYgKEFURV9PTihwQWRhcHRlcikpCisJCQl7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiVGhlIGRyaXZlciBpcyBpbiBBVEUgbW9kZSBub3dcbiIpKTsKKwkJCQlTdGF0dXMgPSBORElTX1NUQVRVU19SRVNPVVJDRVM7CisJCQkJYnJlYWs7CisJCQl9CisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworICAgICAgICAgICAgaWYgKElORlJBX09OKHBBZGFwdGVyKSB8fCBBREhPQ19PTihwQWRhcHRlcikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZwQWRhcHRlci0+Q29tbW9uQ2ZnLkJzc2lkLCBzaXplb2YoTkRJU184MDJfMTFfTUFDX0FERFJFU1MpKTsKKworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX0JTU0lEKD1FTVBUWSlcbiIpKTsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRU5PVENPTk47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX1NTSUQ6CisJCQlOZGlzWmVyb01lbW9yeSgmU3NpZCwgc2l6ZW9mKE5ESVNfODAyXzExX1NTSUQpKTsKKwkJCU5kaXNaZXJvTWVtb3J5KFNzaWQuU3NpZCwgTUFYX0xFTl9PRl9TU0lEKTsKKyAgICAgICAgICAgIFNzaWQuU3NpZExlbmd0aCA9IHBBZGFwdGVyLT5Db21tb25DZmcuU3NpZExlbjsKKwkJCW1lbWNweShTc2lkLlNzaWQsIHBBZGFwdGVyLT5Db21tb25DZmcuU3NpZCwJU3NpZC5Tc2lkTGVuZ3RoKTsKKyAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihORElTXzgwMl8xMV9TU0lEKTsKKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmU3NpZCwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX1NTSUQgKExlbj0lZCwgc3NpZD0lcylcbiIsIFNzaWQuU3NpZExlbmd0aCxTc2lkLlNzaWQpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfUVVFUllfTElOS19TVEFUVVM6CisgICAgICAgICAgICBwTGlua1N0YXR1cyA9IChSVF84MDJfMTFfTElOS19TVEFUVVMgKikga21hbGxvYyhzaXplb2YoUlRfODAyXzExX0xJTktfU1RBVFVTKSwgTUVNX0FMTE9DX0ZMQUcpOworICAgICAgICAgICAgaWYgKHBMaW5rU3RhdHVzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBMaW5rU3RhdHVzLT5DdXJyVHhSYXRlID0gUmF0ZUlkVG81MDBLYnBzW3BBZGFwdGVyLT5Db21tb25DZmcuVHhSYXRlXTsgICAvLyB1bml0IDogNTAwIGticHMKKyAgICAgICAgICAgICAgICBwTGlua1N0YXR1cy0+Q2hhbm5lbFF1YWxpdHkgPSBwQWRhcHRlci0+TWxtZS5DaGFubmVsUXVhbGl0eTsKKyAgICAgICAgICAgICAgICBwTGlua1N0YXR1cy0+UnhCeXRlQ291bnQgPSBwQWRhcHRlci0+UmFsaW5rQ291bnRlcnMuUmVjZWl2ZWRCeXRlQ291bnQ7CisgICAgICAgICAgICAgICAgcExpbmtTdGF0dXMtPlR4Qnl0ZUNvdW50ID0gcEFkYXB0ZXItPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkQnl0ZUNvdW50OworICAgICAgICAJCXBMaW5rU3RhdHVzLT5DZW50cmFsQ2hhbm5lbCA9IHBBZGFwdGVyLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWw7CisgICAgICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFJUXzgwMl8xMV9MSU5LX1NUQVRVUyk7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBMaW5rU3RhdHVzLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgICAgIGtmcmVlKHBMaW5rU3RhdHVzKTsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9RVUVSWV9MSU5LX1NUQVRVU1xuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1FVRVJZX0xJTktfU1RBVFVTKGttYWxsb2MgZmFpbGVkKVxuIikpOworICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX0NPTkZJR1VSQVRJT046CisgICAgICAgICAgICBwQ29uZmlndXJhdGlvbiA9IChORElTXzgwMl8xMV9DT05GSUdVUkFUSU9OICopIGttYWxsb2Moc2l6ZW9mKE5ESVNfODAyXzExX0NPTkZJR1VSQVRJT04pLCBNRU1fQUxMT0NfRkxBRyk7CisgICAgICAgICAgICBpZiAocENvbmZpZ3VyYXRpb24pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcENvbmZpZ3VyYXRpb24tPkxlbmd0aCA9IHNpemVvZihORElTXzgwMl8xMV9DT05GSUdVUkFUSU9OKTsKKyAgICAgICAgICAgICAgICBwQ29uZmlndXJhdGlvbi0+QmVhY29uUGVyaW9kID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5CZWFjb25QZXJpb2Q7CisgICAgICAgICAgICAgICAgcENvbmZpZ3VyYXRpb24tPkFUSU1XaW5kb3cgPSBwQWRhcHRlci0+U3RhQWN0aXZlLkF0aW1XaW47CisgICAgICAgICAgICAgICAgTUFQX0NIQU5ORUxfSURfVE9fS0haKHBBZGFwdGVyLT5Db21tb25DZmcuQ2hhbm5lbCwgcENvbmZpZ3VyYXRpb24tPkRTQ29uZmlnKTsKKyAgICAgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoTkRJU184MDJfMTFfQ09ORklHVVJBVElPTik7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBDb25maWd1cmF0aW9uLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX0NPTkZJR1VSQVRJT04oQmVhY29uUGVyaW9kPSVsZCxBdGltVz0lbGQsQ2hhbm5lbD0lZCkgXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb25maWd1cmF0aW9uLT5CZWFjb25QZXJpb2QsIHBDb25maWd1cmF0aW9uLT5BVElNV2luZG93LCBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWwpKTsKKwkJCQlrZnJlZShwQ29uZmlndXJhdGlvbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfQ09ORklHVVJBVElPTihrbWFsbG9jIGZhaWxlZClcbiIpKTsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisJCWNhc2UgUlRfT0lEXzgwMl8xMV9TTlJfMDoKKwkJCWlmICgocEFkYXB0ZXItPlN0YUNmZy5MYXN0U05SMCA+IDApKQorCQkJeworCQkJCXVsSW5mbyA9ICgoMHhlYgktIHBBZGFwdGVyLT5TdGFDZmcuTGFzdFNOUjApICogMykgLwkxNiA7CisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHVsSW5mbyk7CisJCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZ1bEluZm8sCXdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfU05SXzAoMHg9JWx4KVxuIiwgdWxJbmZvKSk7CisJCQl9CisgICAgICAgICAgICBlbHNlCisJCQkgICAgU3RhdHVzID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQljYXNlIFJUX09JRF84MDJfMTFfU05SXzE6CisJCQlpZiAoKHBBZGFwdGVyLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aAk+IDEpICYmCisgICAgICAgICAgICAgICAgKHBBZGFwdGVyLT5TdGFDZmcuTGFzdFNOUjEgPiAwKSkKKwkJCXsKKwkJCQl1bEluZm8gPSAoKDB4ZWIJLSBwQWRhcHRlci0+U3RhQ2ZnLkxhc3RTTlIxKSAqIDMpIC8JMTYgOworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZih1bEluZm8pOworCQkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmdWxJbmZvLAl3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUXVlcnk6OlJUX09JRF84MDJfMTFfU05SXzEoMHg9JWx4KVxuIix1bEluZm8pKTsKKwkJCX0KKwkJCWVsc2UKKwkJCQlTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9TTlJfMShwQWRhcHRlci0+U3RhQ2ZnLkxhc3RTTlIxPSVkKVxuIixwQWRhcHRlci0+U3RhQ2ZnLkxhc3RTTlIxKSk7CisJCQlicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX1JTU0lfVFJJR0dFUjoKKyAgICAgICAgICAgIHVsSW5mbyA9IHBBZGFwdGVyLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTAgLSBwQWRhcHRlci0+QmJwUnNzaVRvRGJtRGVsdGE7CisgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YodWxJbmZvKTsKKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmdWxJbmZvLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfUlNTSV9UUklHR0VSKD0lbGQpXG4iLCB1bEluZm8pKTsKKyAgICAgICAgICAgIGJyZWFrOworCQljYXNlIE9JRF84MDJfMTFfUlNTSToKKyAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX1JTU0k6CisJCQl1bEluZm8gPSBwQWRhcHRlci0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kwOworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHVsSW5mbyk7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnVsSW5mbywJd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCWJyZWFrOworCQljYXNlIFJUX09JRF84MDJfMTFfUlNTSV8xOgorICAgICAgICAgICAgdWxJbmZvID0gcEFkYXB0ZXItPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMTsKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZih1bEluZm8pOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZ1bEluZm8sCXdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlicmVhazsKKyAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX1JTU0lfMjoKKyAgICAgICAgICAgIHVsSW5mbyA9IHBBZGFwdGVyLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTI7CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YodWxJbmZvKTsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmdWxJbmZvLAl3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9TVEFUSVNUSUNTOgorICAgICAgICAgICAgcFN0YXRpc3RpY3MgPSAoTkRJU184MDJfMTFfU1RBVElTVElDUyAqKSBrbWFsbG9jKHNpemVvZihORElTXzgwMl8xMV9TVEFUSVNUSUNTKSwgTUVNX0FMTE9DX0ZMQUcpOworICAgICAgICAgICAgaWYgKHBTdGF0aXN0aWNzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX1NUQVRJU1RJQ1MgXG4iKSk7CisgICAgICAgICAgICAgICAgLy8gYWRkIHRoZSBtb3N0IHVwLXRvLWRhdGUgaC93IHJhdyBjb3VudGVycyBpbnRvIHNvZnR3YXJlIGNvdW50ZXJzCisJCQkgICAgTklDVXBkYXRlUmF3Q291bnRlcnMocEFkYXB0ZXIpOworCisgICAgICAgICAgICAgICAgLy8gU2FuaXR5IGNoZWNrIGZvciBjYWxjdWxhdGlvbiBvZiBzdWNlc3NmdWwgY291bnQKKyAgICAgICAgICAgICAgICBpZiAocEFkYXB0ZXItPldsYW5Db3VudGVycy5UcmFuc21pdHRlZEZyYWdtZW50Q291bnQuUXVhZFBhcnQgPCBwQWRhcHRlci0+V2xhbkNvdW50ZXJzLlJldHJ5Q291bnQuUXVhZFBhcnQpCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5XbGFuQ291bnRlcnMuVHJhbnNtaXR0ZWRGcmFnbWVudENvdW50LlF1YWRQYXJ0ID0gcEFkYXB0ZXItPldsYW5Db3VudGVycy5SZXRyeUNvdW50LlF1YWRQYXJ0OworCisgICAgICAgICAgICAgICAgcFN0YXRpc3RpY3MtPlRyYW5zbWl0dGVkRnJhZ21lbnRDb3VudC5RdWFkUGFydCA9IHBBZGFwdGVyLT5XbGFuQ291bnRlcnMuVHJhbnNtaXR0ZWRGcmFnbWVudENvdW50LlF1YWRQYXJ0OworICAgICAgICAgICAgICAgIHBTdGF0aXN0aWNzLT5NdWx0aWNhc3RUcmFuc21pdHRlZEZyYW1lQ291bnQuUXVhZFBhcnQgPSBwQWRhcHRlci0+V2xhbkNvdW50ZXJzLk11bHRpY2FzdFRyYW5zbWl0dGVkRnJhbWVDb3VudC5RdWFkUGFydDsKKyAgICAgICAgICAgICAgICBwU3RhdGlzdGljcy0+RmFpbGVkQ291bnQuUXVhZFBhcnQgPSBwQWRhcHRlci0+V2xhbkNvdW50ZXJzLkZhaWxlZENvdW50LlF1YWRQYXJ0OworICAgICAgICAgICAgICAgIHBTdGF0aXN0aWNzLT5SZXRyeUNvdW50LlF1YWRQYXJ0ID0gcEFkYXB0ZXItPldsYW5Db3VudGVycy5SZXRyeUNvdW50LlF1YWRQYXJ0OworICAgICAgICAgICAgICAgIHBTdGF0aXN0aWNzLT5NdWx0aXBsZVJldHJ5Q291bnQuUXVhZFBhcnQgPSBwQWRhcHRlci0+V2xhbkNvdW50ZXJzLk11bHRpcGxlUmV0cnlDb3VudC5RdWFkUGFydDsKKyAgICAgICAgICAgICAgICBwU3RhdGlzdGljcy0+UlRTU3VjY2Vzc0NvdW50LlF1YWRQYXJ0ID0gcEFkYXB0ZXItPldsYW5Db3VudGVycy5SVFNTdWNjZXNzQ291bnQuUXVhZFBhcnQ7CisgICAgICAgICAgICAgICAgcFN0YXRpc3RpY3MtPlJUU0ZhaWx1cmVDb3VudC5RdWFkUGFydCA9IHBBZGFwdGVyLT5XbGFuQ291bnRlcnMuUlRTRmFpbHVyZUNvdW50LlF1YWRQYXJ0OworICAgICAgICAgICAgICAgIHBTdGF0aXN0aWNzLT5BQ0tGYWlsdXJlQ291bnQuUXVhZFBhcnQgPSBwQWRhcHRlci0+V2xhbkNvdW50ZXJzLkFDS0ZhaWx1cmVDb3VudC5RdWFkUGFydDsKKyAgICAgICAgICAgICAgICBwU3RhdGlzdGljcy0+RnJhbWVEdXBsaWNhdGVDb3VudC5RdWFkUGFydCA9IHBBZGFwdGVyLT5XbGFuQ291bnRlcnMuRnJhbWVEdXBsaWNhdGVDb3VudC5RdWFkUGFydDsKKyAgICAgICAgICAgICAgICBwU3RhdGlzdGljcy0+UmVjZWl2ZWRGcmFnbWVudENvdW50LlF1YWRQYXJ0ID0gcEFkYXB0ZXItPldsYW5Db3VudGVycy5SZWNlaXZlZEZyYWdtZW50Q291bnQuUXVhZFBhcnQ7CisgICAgICAgICAgICAgICAgcFN0YXRpc3RpY3MtPk11bHRpY2FzdFJlY2VpdmVkRnJhbWVDb3VudC5RdWFkUGFydCA9IHBBZGFwdGVyLT5XbGFuQ291bnRlcnMuTXVsdGljYXN0UmVjZWl2ZWRGcmFtZUNvdW50LlF1YWRQYXJ0OworI2lmZGVmIERCRworICAgICAgICAgICAgICAgIHBTdGF0aXN0aWNzLT5GQ1NFcnJvckNvdW50ID0gcEFkYXB0ZXItPlJhbGlua0NvdW50ZXJzLlJlYWxGY3NFcnJDb3VudDsKKyNlbHNlCisgICAgICAgICAgICAgICAgcFN0YXRpc3RpY3MtPkZDU0Vycm9yQ291bnQuUXVhZFBhcnQgPSBwQWRhcHRlci0+V2xhbkNvdW50ZXJzLkZDU0Vycm9yQ291bnQuUXVhZFBhcnQ7CisgICAgICAgICAgICAgICAgcFN0YXRpc3RpY3MtPkZyYW1lRHVwbGljYXRlQ291bnQudS5Mb3dQYXJ0ID0gcEFkYXB0ZXItPldsYW5Db3VudGVycy5GcmFtZUR1cGxpY2F0ZUNvdW50LnUuTG93UGFydCAvIDEwMDsKKyNlbmRpZgorICAgICAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihORElTXzgwMl8xMV9TVEFUSVNUSUNTKTsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFN0YXRpc3RpY3MsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICAgICAga2ZyZWUocFN0YXRpc3RpY3MpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX1NUQVRJU1RJQ1Moa21hbGxvYyBmYWlsZWQpXG4iKSk7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF9HRU5fUkNWX09LOgorICAgICAgICAgICAgdWxJbmZvID0gcEFkYXB0ZXItPkNvdW50ZXJzODAyMy5Hb29kUmVjZWl2ZXM7CisgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YodWxJbmZvKTsKKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmdWxJbmZvLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEX0dFTl9SQ1ZfTk9fQlVGRkVSOgorICAgICAgICAgICAgdWxJbmZvID0gcEFkYXB0ZXItPkNvdW50ZXJzODAyMy5SeE5vQnVmZmVyOworICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHVsSW5mbyk7CisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnVsSW5mbywgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfUEhZX01PREU6CisgICAgICAgICAgICB1bEluZm8gPSAoVUxPTkcpcEFkYXB0ZXItPkNvbW1vbkNmZy5QaHlNb2RlOworICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHVsSW5mbyk7CisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnVsSW5mbywgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1BIWV9NT0RFICg9JWxkKVxuIiwgdWxJbmZvKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX1NUQV9DT05GSUc6CisgICAgICAgICAgICBwU3RhQ29uZmlnID0gKFJUXzgwMl8xMV9TVEFfQ09ORklHICopIGttYWxsb2Moc2l6ZW9mKFJUXzgwMl8xMV9TVEFfQ09ORklHKSwgTUVNX0FMTE9DX0ZMQUcpOworICAgICAgICAgICAgaWYgKHBTdGFDb25maWcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfU1RBX0NPTkZJR1xuIikpOworICAgICAgICAgICAgICAgIHBTdGFDb25maWctPkVuYWJsZVR4QnVyc3QgPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLmJFbmFibGVUeEJ1cnN0OworICAgICAgICAgICAgICAgIHBTdGFDb25maWctPkVuYWJsZVR1cmJvUmF0ZSA9IDA7CisgICAgICAgICAgICAgICAgcFN0YUNvbmZpZy0+VXNlQkdQcm90ZWN0aW9uID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5Vc2VCR1Byb3RlY3Rpb247CisgICAgICAgICAgICAgICAgcFN0YUNvbmZpZy0+VXNlU2hvcnRTbG90VGltZSA9IHBBZGFwdGVyLT5Db21tb25DZmcuYlVzZVNob3J0U2xvdFRpbWU7CisgICAgICAgICAgICAgICAgLy9wU3RhQ29uZmlnLT5BZGhvY01vZGUgPSBwQWRhcHRlci0+U3RhQ2ZnLkFkaG9jTW9kZTsKKyAgICAgICAgICAgICAgICBwU3RhQ29uZmlnLT5Id1JhZGlvU3RhdHVzID0gKHBBZGFwdGVyLT5TdGFDZmcuYkh3UmFkaW8gPT0gVFJVRSkgPyAxIDogMDsKKyAgICAgICAgICAgICAgICBwU3RhQ29uZmlnLT5Sc3YxID0gMDsKKyAgICAgICAgICAgICAgICBwU3RhQ29uZmlnLT5TeXN0ZW1FcnJvckJpdG1hcCA9IHBBZGFwdGVyLT5TeXN0ZW1FcnJvckJpdG1hcDsKKyAgICAgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoUlRfODAyXzExX1NUQV9DT05GSUcpOworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwU3RhQ29uZmlnLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgICAgIGtmcmVlKHBTdGFDb25maWcpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1NUQV9DT05GSUcoa21hbGxvYyBmYWlsZWQpXG4iKSk7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfUlRTX1RIUkVTSE9MRDoKKyAgICAgICAgICAgIFJ0c1RocmVzaCA9IHBBZGFwdGVyLT5Db21tb25DZmcuUnRzVGhyZXNob2xkOworICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFJ0c1RocmVzaCk7CisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJlJ0c1RocmVzaCwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX1JUU19USFJFU0hPTEQoPSVsZClcbiIsIFJ0c1RocmVzaCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9GUkFHTUVOVEFUSU9OX1RIUkVTSE9MRDoKKyAgICAgICAgICAgIEZyYWdUaHJlc2ggPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLkZyYWdtZW50VGhyZXNob2xkOworICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5Db21tb25DZmcuYlVzZVplcm9Ub0Rpc2FibGVGcmFnbWVudCA9PSBUUlVFKQorICAgICAgICAgICAgICAgIEZyYWdUaHJlc2ggPSAwOworICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKEZyYWdUaHJlc2gpOworICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZGcmFnVGhyZXNoLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfRlJBR01FTlRBVElPTl9USFJFU0hPTEQoPSVsZClcbiIsIEZyYWdUaHJlc2gpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfUE9XRVJfTU9ERToKKyAgICAgICAgICAgIFBvd2VyTW9kZSA9IHBBZGFwdGVyLT5TdGFDZmcuV2luZG93c1Bvd2VyTW9kZTsKKyAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihQb3dlck1vZGUpOworICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZQb3dlck1vZGUsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9QT1dFUl9NT0RFKD0lZClcbiIsIFBvd2VyTW9kZSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9SQURJTzoKKyAgICAgICAgICAgIFJhZGlvU3RhdGUgPSAoQk9PTEVBTikgcEFkYXB0ZXItPlN0YUNmZy5iU3dSYWRpbzsKKyAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihSYWRpb1N0YXRlKTsKKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmUmFkaW9TdGF0ZSwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1FVRVJZX1JBRElPICg9JWQpXG4iLCBSYWRpb1N0YXRlKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX0lORlJBU1RSVUNUVVJFX01PREU6CisgICAgICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5Cc3NUeXBlID09IEJTU19BREhPQykKKyAgICAgICAgICAgICAgICBCc3NUeXBlID0gTmRpczgwMl8xMUlCU1M7CisgICAgICAgICAgICBlbHNlIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkJzc1R5cGUgPT0gQlNTX0lORlJBKQorICAgICAgICAgICAgICAgIEJzc1R5cGUgPSBOZGlzODAyXzExSW5mcmFzdHJ1Y3R1cmU7CisgICAgICAgICAgICBlbHNlIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkJzc1R5cGUgPT0gQlNTX01PTklUT1IpCisgICAgICAgICAgICAgICAgQnNzVHlwZSA9IE5kaXM4MDJfMTFNb25pdG9yOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIEJzc1R5cGUgPSBOZGlzODAyXzExQXV0b1Vua25vd247CisKKyAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihCc3NUeXBlKTsKKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmQnNzVHlwZSwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX0lORlJBU1RSVUNUVVJFX01PREUoPSVkKVxuIiwgQnNzVHlwZSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9QUkVBTUJMRToKKyAgICAgICAgICAgIFByZWFtVHlwZSA9IHBBZGFwdGVyLT5Db21tb25DZmcuVHhQcmVhbWJsZTsKKyAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihQcmVhbVR5cGUpOworICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZQcmVhbVR5cGUsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9QUkVBTUJMRSg9JWQpXG4iLCBQcmVhbVR5cGUpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfQVVUSEVOVElDQVRJT05fTU9ERToKKyAgICAgICAgICAgIEF1dGhNb2RlID0gcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZTsKKyAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihBdXRoTW9kZSk7CisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJkF1dGhNb2RlLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfQVVUSEVOVElDQVRJT05fTU9ERSg9JWQpXG4iLCBBdXRoTW9kZSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9XRVBfU1RBVFVTOgorICAgICAgICAgICAgV2VwU3RhdHVzID0gcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXM7CisgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoV2VwU3RhdHVzKTsKKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmV2VwU3RhdHVzLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfV0VQX1NUQVRVUyg9JWQpXG4iLCBXZXBTdGF0dXMpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfVFhfUE9XRVJfTEVWRUw6CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoVUxPTkcpOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZwQWRhcHRlci0+Q29tbW9uQ2ZnLlR4UG93ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9UWF9QT1dFUl9MRVZFTCAleFxuIixwQWRhcHRlci0+Q29tbW9uQ2ZnLlR4UG93ZXIpKTsKKwkJCWJyZWFrOworICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfVFhfUE9XRVJfTEVWRUxfMToKKyAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihVTE9ORyk7CisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnBBZGFwdGVyLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9UWF9QT1dFUl9MRVZFTF8xICg9JWxkKVxuIiwgcEFkYXB0ZXItPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSkpOworCQkJYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9ORVRXT1JLX1RZUEVTX1NVUFBPUlRFRDoKKwkJCWlmICgocEFkYXB0ZXItPlJmSWNUeXBlCT09IFJGSUNfMjg1MCkgfHwgKHBBZGFwdGVyLT5SZkljVHlwZSA9PQlSRklDXzI3NTApKQorCQkJeworCQkJCU5ldHdvcmtUeXBlTGlzdFswXSA9IDM7ICAgICAgICAgICAgICAgICAvLyBOdW1iZXJPZkl0ZW1zID0gMworCQkJCU5ldHdvcmtUeXBlTGlzdFsxXSA9IE5kaXM4MDJfMTFEUzsgICAgICAvLyBOZXR3b3JrVHlwZVsxXSA9IDExYgorCQkJCU5ldHdvcmtUeXBlTGlzdFsyXSA9IE5kaXM4MDJfMTFPRkRNMjQ7ICAvLyBOZXR3b3JrVHlwZVsyXSA9IDExZworCQkJCU5ldHdvcmtUeXBlTGlzdFszXSA9IE5kaXM4MDJfMTFPRkRNNTsgICAvLyBOZXR3b3JrVHlwZVszXSA9IDExYQorICAgICAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IDE2OworCQkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmTmV0d29ya1R5cGVMaXN0WzBdLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCU5ldHdvcmtUeXBlTGlzdFswXSA9IDI7ICAgICAgICAgICAgICAgICAvLyBOdW1iZXJPZkl0ZW1zID0gMgorCQkJCU5ldHdvcmtUeXBlTGlzdFsxXSA9IE5kaXM4MDJfMTFEUzsgICAgICAvLyBOZXR3b3JrVHlwZVsxXSA9IDExYgorCQkJCU5ldHdvcmtUeXBlTGlzdFsyXSA9IE5kaXM4MDJfMTFPRkRNMjQ7ICAvLyBOZXR3b3JrVHlwZVsyXSA9IDExZworCQkJICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IDEyOworCQkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmTmV0d29ya1R5cGVMaXN0WzBdLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJfQorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfTkVUV09SS19UWVBFU19TVVBQT1JURURcbiIpKTsKKwkJCQlicmVhazsKKwkgICAgY2FzZSBPSURfODAyXzExX05FVFdPUktfVFlQRV9JTl9VU0U6CisgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoVUxPTkcpOworCQkJaWYgKHBBZGFwdGVyLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFBKQorCQkJCXVsSW5mbyA9IE5kaXM4MDJfMTFPRkRNNTsKKwkJCWVsc2UgaWYgKChwQWRhcHRlci0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQkdfTUlYRUQpIHx8IChwQWRhcHRlci0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExRykpCisJCQkJdWxJbmZvID0gTmRpczgwMl8xMU9GRE0yNDsKKwkJCWVsc2UKKwkJCQl1bEluZm8gPSBOZGlzODAyXzExRFM7CisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnVsSW5mbywgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCWJyZWFrOworICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfUVVFUllfTEFTVF9SWF9SQVRFOgorICAgICAgICAgICAgdWxJbmZvID0gKFVMT05HKXBBZGFwdGVyLT5MYXN0UnhSYXRlOworICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHVsSW5mbyk7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnVsSW5mbywgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1FVRVJZX0xBU1RfUlhfUkFURSAoPSVsZClcbiIsIHVsSW5mbykpOworCQkJYnJlYWs7CisJCWNhc2UgUlRfT0lEXzgwMl8xMV9RVUVSWV9MQVNUX1RYX1JBVEU6CisJCQkvL3VsSW5mbyA9IChVTE9ORylwQWRhcHRlci0+TGFzdFR4UmF0ZTsKKwkJCXVsSW5mbyA9IChVTE9ORylwQWRhcHRlci0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLndvcmQ7CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YodWxJbmZvKTsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmdWxJbmZvLAl3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfUVVFUllfTEFTVF9UWF9SQVRFICg9JWx4KVxuIiwgdWxJbmZvKSk7CisJCQlicmVhazsKKyAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX1FVRVJZX0VFUFJPTV9WRVJTSU9OOgorICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFVMT05HKTsKKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmcEFkYXB0ZXItPkVlcHJvbVZlcnNpb24sIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX1FVRVJZX0ZJUk1XQVJFX1ZFUlNJT046CisgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoVUxPTkcpOworICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZwQWRhcHRlci0+RmlybXdhcmVWZXJzaW9uLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJYnJlYWs7CisJICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9RVUVSWV9OT0lTRV9MRVZFTDoKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihVQ0hBUik7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnBBZGFwdGVyLT5CYnBXcml0ZUxhdGNoWzY2XSwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1FVRVJZX05PSVNFX0xFVkVMICg9JWQpXG4iLCBwQWRhcHRlci0+QmJwV3JpdGVMYXRjaFs2Nl0pKTsKKwkJCWJyZWFrOworCSAgICBjYXNlIFJUX09JRF84MDJfMTFfRVhUUkFfSU5GTzoKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihVTE9ORyk7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnBBZGFwdGVyLT5FeHRyYUluZm8sIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9FWFRSQV9JTkZPICg9JWxkKVxuIiwgcEFkYXB0ZXItPkV4dHJhSW5mbykpOworCSAgICAgICAgYnJlYWs7CisJICAgIGNhc2UgUlRfT0lEX1dFX1ZFUlNJT05fQ09NUElMRUQ6CisJICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoVUlOVCk7CisJICAgICAgICB3ZV92ZXJzaW9uX2NvbXBpbGVkID0gV0lSRUxFU1NfRVhUOworCSAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZ3ZV92ZXJzaW9uX2NvbXBpbGVkLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCSAgICAgICAgYnJlYWs7CisJCWNhc2UgUlRfT0lEXzgwMl8xMV9RVUVSWV9BUFNEX1NFVFRJTkc6CisJCQlhcHNkID0gKHBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RDYXBhYmxlIHwgKHBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RBQ19CRSA8PCAxKSB8IChwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNEQUNfQksgPDwgMikKKwkJCQl8IChwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNEQUNfVkkgPDwgMykJfCAocEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTREFDX1ZPIDw8IDQpCXwgKHBBZGFwdGVyLT5Db21tb25DZmcuTWF4U1BMZW5ndGggPDwgNSkpOworCisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoVUxPTkcpOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZhcHNkLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfUVVFUllfQVBTRF9TRVRUSU5HICg9MHglbHgsQVBTRENhcD0lZCxBQ19CRT0lZCxBQ19CSz0lZCxBQ19WST0lZCxBQ19WTz0lZCxNQVhTUExlbj0lZClcbiIsCisJCQkJYXBzZCxwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNEQ2FwYWJsZSxwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNEQUNfQkUscEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTREFDX0JLLHBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RBQ19WSSxwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNEQUNfVk8scEFkYXB0ZXItPkNvbW1vbkNmZy5NYXhTUExlbmd0aCkpOworCQkJYnJlYWs7CisJCWNhc2UgUlRfT0lEXzgwMl8xMV9RVUVSWV9BUFNEX1BTTToKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihVTE9ORyk7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RGb3JjZVBvd2VyU2F2ZSwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1FVRVJZX0FQU0RfUFNNICg9JWQpXG4iLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNERm9yY2VQb3dlclNhdmUpKTsKKwkJCWJyZWFrOworCQljYXNlIFJUX09JRF84MDJfMTFfUVVFUllfV01NOgorCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKEJPT0xFQU4pOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZwQWRhcHRlci0+Q29tbW9uQ2ZnLmJXbW1DYXBhYmxlLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfUVVFUllfV01NICg9JWQpXG4iLAlwQWRhcHRlci0+Q29tbW9uQ2ZnLmJXbW1DYXBhYmxlKSk7CisJCQlicmVhazsKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgICAgIGNhc2UgUlRfT0lEX05FV19EUklWRVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVUNIQVIgZW5hYmxlZCA9IDE7CisgICAgCSAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFVDSEFSKTsKKyAgICAJICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJmVuYWJsZWQsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF9ORVdfRFJJVkVSICg9JWQpXG4iLCBlbmFibGVkKSk7CisgICAgICAgICAgICB9CisJICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSVF9PSURfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVDoKKwkgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihVQ0hBUik7CisJICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnBBZGFwdGVyLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUICg9JWQpXG4iLCBwQWRhcHRlci0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCkpOworCSAgICAgICAgYnJlYWs7CisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCisgICAgICAgIGNhc2UgUlRfT0lEX0RSSVZFUl9ERVZJQ0VfTkFNRToKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfRFJJVkVSX0RFVklDRV9OQU1FIFxuIikpOworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gMTY7CisJCQlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBBZGFwdGVyLT5TdGFDZmcuZGV2X25hbWUsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisJCQl7CisJCQkJU3RhdHVzID0gLUVGQVVMVDsKKwkJCX0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfUVVFUllfSFRfUEhZTU9ERToKKyAgICAgICAgICAgIHBIVFBoeU1vZGUgPSAoT0lEX1NFVF9IVF9QSFlNT0RFICopIGttYWxsb2Moc2l6ZW9mKE9JRF9TRVRfSFRfUEhZTU9ERSksIE1FTV9BTExPQ19GTEFHKTsKKyAgICAgICAgICAgIGlmIChwSFRQaHlNb2RlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBIVFBoeU1vZGUtPlBoeU1vZGUgPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLlBoeU1vZGU7CisgICAgCQkJcEhUUGh5TW9kZS0+SHRNb2RlID0gKFVDSEFSKXBBZGFwdGVyLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5IVFBoeU1vZGUuZmllbGQuTU9ERTsKKyAgICAJCQlwSFRQaHlNb2RlLT5CVyA9IChVQ0hBUilwQWRhcHRlci0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLkJXOworICAgIAkJCXBIVFBoeU1vZGUtPk1DUz0gKFVDSEFSKXBBZGFwdGVyLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5IVFBoeU1vZGUuZmllbGQuTUNTOworICAgIAkJCXBIVFBoeU1vZGUtPlNIT1JUR0k9IChVQ0hBUilwQWRhcHRlci0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLlNob3J0R0k7CisgICAgCQkJcEhUUGh5TW9kZS0+U1RCQz0gKFVDSEFSKXBBZGFwdGVyLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5IVFBoeU1vZGUuZmllbGQuU1RCQzsKKworICAgIAkJCXBIVFBoeU1vZGUtPkV4dE9mZnNldCA9ICgocEFkYXB0ZXItPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA8IHBBZGFwdGVyLT5Db21tb25DZmcuQ2hhbm5lbCkgPyAoRVhUQ0hBX0JFTE9XKSA6IChFWFRDSEFfQUJPVkUpKTsKKyAgICAgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoT0lEX1NFVF9IVF9QSFlNT0RFKTsKKyAgICAgICAgICAgICAgICBpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBIVFBoeU1vZGUsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgCQkJeworICAgIAkJCQlTdGF0dXMgPSAtRUZBVUxUOworICAgIAkJCX0KKyAgICAJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9RVUVSWV9IVF9QSFlNT0RFIChQaHlNb2RlID0gJWQsIE1DUyA9JWQsIEJXID0gJWQsIFNUQkMgPSAlZCwgRXh0T2Zmc2V0PSVkKVxuIiwKKyAgICAJCQkJcEhUUGh5TW9kZS0+SHRNb2RlLCBwSFRQaHlNb2RlLT5NQ1MsIHBIVFBoeU1vZGUtPkJXLCBwSFRQaHlNb2RlLT5TVEJDLCBwSFRQaHlNb2RlLT5FeHRPZmZzZXQpKTsKKyAgICAJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIgTWxtZVVwZGF0ZVR4UmF0ZXMgKC53b3JkID0gJXggKVxuIiwgcEFkYXB0ZXItPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkhUUGh5TW9kZS53b3JkKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfU1RBX0NPTkZJRyhrbWFsbG9jIGZhaWxlZClcbiIpKTsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9DT1VOVFJZX1JFR0lPTjoKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX0NPVU5UUllfUkVHSU9OIFxuIikpOworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHVsSW5mbyk7CisgICAgICAgICAgICB1bEluZm8gPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb25Gb3JBQmFuZDsKKyAgICAgICAgICAgIHVsSW5mbyA9ICh1bEluZm8gPDwgOCl8KHBBZGFwdGVyLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbik7CisJCQlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZ1bEluZm8sIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICB7CisJCQkJU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfUVVFUllfREFUX0hUX1BIWU1PREU6CisgICAgICAgICAgICBwSFRQaHlNb2RlID0gKE9JRF9TRVRfSFRfUEhZTU9ERSAqKSBrbWFsbG9jKHNpemVvZihPSURfU0VUX0hUX1BIWU1PREUpLCBNRU1fQUxMT0NfRkxBRyk7CisgICAgICAgICAgICBpZiAocEhUUGh5TW9kZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwSFRQaHlNb2RlLT5QaHlNb2RlID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5QaHlNb2RlOworICAgIAkJCXBIVFBoeU1vZGUtPkh0TW9kZSA9IChVQ0hBUilwQWRhcHRlci0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5IVE1PREU7CisgICAgCQkJcEhUUGh5TW9kZS0+QlcgPSAoVUNIQVIpcEFkYXB0ZXItPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlc7CisgICAgCQkJcEhUUGh5TW9kZS0+TUNTPSAoVUNIQVIpcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUzsKKyAgICAJCQlwSFRQaHlNb2RlLT5TSE9SVEdJPSAoVUNIQVIpcEFkYXB0ZXItPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuU2hvcnRHSTsKKyAgICAJCQlwSFRQaHlNb2RlLT5TVEJDPSAoVUNIQVIpcEFkYXB0ZXItPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuU1RCQzsKKworICAgICAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihPSURfU0VUX0hUX1BIWU1PREUpOworICAgICAgICAgICAgICAgIGlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcEhUUGh5TW9kZSwgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAJCQl7CisgICAgCQkJCVN0YXR1cyA9IC1FRkFVTFQ7CisgICAgCQkJfQorICAgIAkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1FVRVJZX0hUX1BIWU1PREUgKFBoeU1vZGUgPSAlZCwgTUNTID0lZCwgQlcgPSAlZCwgU1RCQyA9ICVkLCBFeHRPZmZzZXQ9JWQpXG4iLAorICAgIAkJCQlwSFRQaHlNb2RlLT5IdE1vZGUsIHBIVFBoeU1vZGUtPk1DUywgcEhUUGh5TW9kZS0+QlcsIHBIVFBoeU1vZGUtPlNUQkMsIHBIVFBoeU1vZGUtPkV4dE9mZnNldCkpOworICAgIAkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiBNbG1lVXBkYXRlVHhSYXRlcyAoLndvcmQgPSAleCApXG4iLCBwQWRhcHRlci0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLndvcmQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9TVEFfQ09ORklHKGttYWxsb2MgZmFpbGVkKVxuIikpOworICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSVF9PSURfUVVFUllfTVVMVElQTEVfQ0FSRF9TVVBQT1JUOgorCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFVDSEFSKTsKKyAgICAgICAgICAgIGkgPSAwOworI2lmZGVmIE1VTFRJUExFX0NBUkRfU1VQUE9SVAorICAgICAgICAgICAgaSA9IDE7CisjZW5kaWYgLy8gTVVMVElQTEVfQ0FSRF9TVVBQT1JUIC8vCisJCQlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZpLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgeworCQkJCVN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEX1FVRVJZX01VTFRJUExFX0NBUkRfU1VQUE9SVCg9JWQpIFxuIiwgaSkpOworICAgICAgICAgICAgYnJlYWs7CisjaWZkZWYgU05NUF9TVVBQT1JUCisJCWNhc2UgUlRfT0lEXzgwMl8xMV9NQUNfQUREUkVTUzoKKyAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IE1BQ19BRERSX0xFTjsKKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmcEFkYXB0ZXItPkN1cnJlbnRBZGRyZXNzLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJYnJlYWs7CisKKwkJY2FzZSBSVF9PSURfODAyXzExX01BTlVGQUNUVVJFUk9VSToKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX01BTlVGQUNUVVJFUk9VSSBcbiIpKTsKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IE1hbnVmYWN0dXJlck9VSV9MRU47CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnBBZGFwdGVyLT5DdXJyZW50QWRkcmVzcywgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCWJyZWFrOworCisJCWNhc2UgUlRfT0lEXzgwMl8xMV9NQU5VRkFDVFVSRVJOQU1FOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfTUFOVUZBQ1RVUkVSTkFNRSBcbiIpKTsKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHN0cmxlbihNYW51ZmFjdHVyZXJOQU1FKTsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBNYW51ZmFjdHVyZXJOQU1FLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJYnJlYWs7CisKKwkJY2FzZSBSVF9PSURfODAyXzExX1JFU09VUkNFVFlQRUlETkFNRToKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1JFU09VUkNFVFlQRUlETkFNRSBcbiIpKTsKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHN0cmxlbihSZXNvdXJjZVR5cGVJZE5hbWUpOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIFJlc291cmNlVHlwZUlkTmFtZSwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCWJyZWFrOworCisJCWNhc2UgUlRfT0lEXzgwMl8xMV9QUklWQUNZT1BUSU9OSU1QTEVNRU5URUQ6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9QUklWQUNZT1BUSU9OSU1QTEVNRU5URUQgXG4iKSk7CisJCQl1bEluZm8gPSAxOyAvLyAxIGlzIHN1cHBvcnQgd2VwIGVsc2UgMiBpcyBub3Qgc3VwcG9ydC4KKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZih1bEluZm8pOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZ1bEluZm8sIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlicmVhazsKKworCQljYXNlIFJUX09JRF84MDJfMTFfUE9XRVJNQU5BR0VNRU5UTU9ERToKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1BPV0VSTUFOQUdFTUVOVE1PREUgXG4iKSk7CisJCQlpZiAocEFkYXB0ZXItPlN0YUNmZy5Qc20gPT0gUFNNUF9BQ1RJT04pCisJCQkJdWxJbmZvID0gMTsgLy8gMSBpcyBwb3dlciBhY3RpdmUgZWxzZSAyIGlzIHBvd2VyIHNhdmUuCisJCQllbHNlCisJCQkJdWxJbmZvID0gMjsKKworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHVsSW5mbyk7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnVsSW5mbywgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCWJyZWFrOworCisJCWNhc2UgT0lEXzgwMl8xMV9XRVBERUZBVUxUS0VZVkFMVUU6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9XRVBERUZBVUxUS0VZVkFMVUUgXG4iKSk7CisJCQkvL0tleUlkeFZhbHVlLktleUlkeCA9IHBBZC0+UG9ydENmZy5NQlNTSURbcEFkLT5Jb2N0bElGXS5EZWZhdWx0S2V5SWQ7CisJCQlwS2V5SWR4VmFsdWUgPSB3cnEtPnUuZGF0YS5wb2ludGVyOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJLZXlJZHhWYWx1ZS5LZXlJZHggPSAlZCwgXG4iLHBLZXlJZHhWYWx1ZS0+S2V5SWR4KSk7CisJCQl2YWx1ZUxlbiA9IHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWRdLktleUxlbjsKKwkJCU5kaXNNb3ZlTWVtb3J5KHBLZXlJZHhWYWx1ZS0+VmFsdWUsCisJCQkJCQkgICAmcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uS2V5LAorCQkJCQkJICAgdmFsdWVMZW4pOworCQkJcEtleUlkeFZhbHVlLT5WYWx1ZVt2YWx1ZUxlbl09J1wwJzsKKworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKERlZmF1bHRLZXlJZHhWYWx1ZSk7CisKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwS2V5SWR4VmFsdWUsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkRlZmF1bHRLZXlJZCA9ICVkLCB0b3RhbCBsZW4gPSAlZCwgc3RyIGxlbj0lZCwgS2V5VmFsdWU9ICUwMnggJTAyeCAlMDJ4ICUwMnggXG4iLCBwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCwgd3JxLT51LmRhdGEubGVuZ3RoLCBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW3BBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5LZXlMZW4sCisJCQlwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzBdLktleVswXSwKKwkJCXBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMV0uS2V5WzBdLAorCQkJcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsyXS5LZXlbMF0sCisJCQlwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzNdLktleVswXSkpOworCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfODAyXzExX1dFUERFRkFVTFRLRVlJRDoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1dFUERFRkFVTFRLRVlJRCBcbiIpKTsKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihVQ0hBUik7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnBBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiRGVmYXVsdEtleUlkID0lZCBcbiIsIHBBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkKSk7CisJCQlicmVhazsKKworCQljYXNlIFJUX09JRF84MDJfMTFfV0VQS0VZTUFQUElOR0xFTkdUSDoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1dFUEtFWU1BUFBJTkdMRU5HVEggXG4iKSk7CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoVUNIQVIpOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsCisJCQkJCQkJCQkmcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uS2V5TGVuLAorCQkJCQkJCQkJd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCWJyZWFrOworCisJCWNhc2UgT0lEXzgwMl8xMV9TSE9SVFJFVFJZTElNSVQ6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9TSE9SVFJFVFJZTElNSVQgXG4iKSk7CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoVUxPTkcpOworCQkJUlRNUF9JT19SRUFEMzIocEFkYXB0ZXIsIFRYX1JUWV9DRkcsICZ0eF9ydHlfY2ZnLndvcmQpOworCQkJU2hvcnRSZXRyeUxpbWl0ID0gdHhfcnR5X2NmZy5maWVsZC5TaG9ydFJ0eUxpbWl0OworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2hvcnRSZXRyeUxpbWl0ID0lbGQsICB0eF9ydHlfY2ZnLmZpZWxkLlNob3J0UmV0cnlMaW1pdD0lZFxuIiwgU2hvcnRSZXRyeUxpbWl0LCB0eF9ydHlfY2ZnLmZpZWxkLlNob3J0UnR5TGltaXQpKTsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmU2hvcnRSZXRyeUxpbWl0LCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfODAyXzExX0xPTkdSRVRSWUxJTUlUOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfTE9OR1JFVFJZTElNSVQgXG4iKSk7CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoVUxPTkcpOworCQkJUlRNUF9JT19SRUFEMzIocEFkYXB0ZXIsIFRYX1JUWV9DRkcsICZ0eF9ydHlfY2ZnLndvcmQpOworCQkJTG9uZ1JldHJ5TGltaXQgPSB0eF9ydHlfY2ZnLmZpZWxkLkxvbmdSdHlMaW1pdDsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkxvbmdSZXRyeUxpbWl0ID0lbGQsICB0eF9ydHlfY2ZnLmZpZWxkLkxvbmdSdHlMaW1pdD0lZFxuIiwgTG9uZ1JldHJ5TGltaXQsIHR4X3J0eV9jZmcuZmllbGQuTG9uZ1J0eUxpbWl0KSk7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJkxvbmdSZXRyeUxpbWl0LCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJYnJlYWs7CisKKwkJY2FzZSBSVF9PSURfODAyXzExX1BST0RVQ1RJRDoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1BST0RVQ1RJRCBcbiIpKTsKKworI2lmZGVmIFJUMjg2MAorCQkJeworCisJCQkJVVNIT1JUICBkZXZpY2VfaWQ7CisJCQkJaWYgKCgoUE9TX0NPT0tJRSlwQWRhcHRlci0+T1NfQ29va2llKS0+cGNpX2RldiAhPSBOVUxMKQorCQkJICAgIAlwY2lfcmVhZF9jb25maWdfd29yZCgoKFBPU19DT09LSUUpcEFkYXB0ZXItPk9TX0Nvb2tpZSktPnBjaV9kZXYsIFBDSV9ERVZJQ0VfSUQsICZkZXZpY2VfaWQpOworCQkJCWVsc2UKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiIHBjaV9kZXYgPSBOVUxMXG4iKSk7CisJCQkJc3ByaW50Zih0bXAsICIlMDR4ICUwNHhcbiIsIE5JQ19QQ0lfVkVORE9SX0lELCBkZXZpY2VfaWQpOworCQkJfQorI2VuZGlmIC8vIFJUMjg2MCAvLworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc3RybGVuKHRtcCk7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgdG1wLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJYnJlYWs7CisKKwkJY2FzZSBSVF9PSURfODAyXzExX01BTlVGQUNUVVJFSUQ6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9NQU5VRkFDVFVSRUlEIFxuIikpOworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc3RybGVuKE1hbnVmYWN0dXJlck5BTUUpOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIE1hbnVmYWN0dXJlck5BTUUsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlicmVhazsKKworCQljYXNlIE9JRF84MDJfMTFfQ1VSUkVOVENIQU5ORUw6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9DVVJSRU5UQ0hBTk5FTCBcbiIpKTsKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihVQ0hBUik7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJzaXplb2YgVUNIQVI9JWQsIGNoYW5uZWw9JWQgXG4iLCBzaXplb2YoVUNIQVIpLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWwpKTsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmcEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU3RhdHVzPSVkXG4iLCBTdGF0dXMpKTsKKwkJCWJyZWFrOworI2VuZGlmIC8vU05NUF9TVVBQT1JUCisKKwkJY2FzZSBPSURfODAyXzExX0JVSUxEX0NIQU5ORUxfRVg6CisJCQl7CisJCQkJVUNIQVIgdmFsdWU7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfQlVJTERfQ0hBTk5FTF9FWCBcbiIpKTsKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoVUNIQVIpOworI2lmZGVmIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTdXBwb3J0IEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QuXG4iKSk7CisJCQkJdmFsdWUgPSAxOworI2Vsc2UKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJEb2Vzbid0IHN1cHBvcnQgRVhUX0JVSUxEX0NIQU5ORUxfTElTVC5cbiIpKTsKKwkJCQl2YWx1ZSA9IDA7CisjZW5kaWYgLy8gRVhUX0JVSUxEX0NIQU5ORUxfTElTVCAvLworCQkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmdmFsdWUsIDEpOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlN0YXR1cz0lZFxuIiwgU3RhdHVzKSk7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIE9JRF84MDJfMTFfR0VUX0NIX0xJU1Q6CisJCQl7CisJCQkJUFJUX0NIQU5ORUxfTElTVF9JTkZPIHBDaExpc3RCdWY7CisKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9HRVRfQ0hfTElTVCBcbiIpKTsKKwkJCQlpZiAocEFkYXB0ZXItPkNoYW5uZWxMaXN0TnVtID09IDApCisJCQkJeworCQkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSAwOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQlwQ2hMaXN0QnVmID0gKFJUX0NIQU5ORUxfTElTVF9JTkZPICopIGttYWxsb2Moc2l6ZW9mKFJUX0NIQU5ORUxfTElTVF9JTkZPKSwgTUVNX0FMTE9DX0ZMQUcpOworCQkJCWlmIChwQ2hMaXN0QnVmID09IE5VTEwpCisJCQkJeworCQkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSAwOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQlwQ2hMaXN0QnVmLT5DaGFubmVsTGlzdE51bSA9IHBBZGFwdGVyLT5DaGFubmVsTGlzdE51bTsKKwkJCQlmb3IgKGkgPSAwOyBpIDwgcENoTGlzdEJ1Zi0+Q2hhbm5lbExpc3ROdW07IGkrKykKKwkJCQkJcENoTGlzdEJ1Zi0+Q2hhbm5lbExpc3RbaV0gPSBwQWRhcHRlci0+Q2hhbm5lbExpc3RbaV0uQ2hhbm5lbDsKKworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihSVF9DSEFOTkVMX0xJU1RfSU5GTyk7CisJCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBDaExpc3RCdWYsIHNpemVvZihSVF9DSEFOTkVMX0xJU1RfSU5GTykpOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlN0YXR1cz0lZFxuIiwgU3RhdHVzKSk7CisKKwkJCQlpZiAocENoTGlzdEJ1ZikKKwkJCQkJa2ZyZWUocENoTGlzdEJ1Zik7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIE9JRF84MDJfMTFfR0VUX0NPVU5UUllfQ09ERToKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX0dFVF9DT1VOVFJZX0NPREUgXG4iKSk7CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSAyOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZwQWRhcHRlci0+Q29tbW9uQ2ZnLkNvdW50cnlDb2RlLCAyKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlN0YXR1cz0lZFxuIiwgU3RhdHVzKSk7CisJCQlicmVhazsKKworCQljYXNlIE9JRF84MDJfMTFfR0VUX0NIQU5ORUxfR0VPR1JBUEhZOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfR0VUX0NIQU5ORUxfR0VPR1JBUEhZIFxuIikpOworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gMTsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmcEFkYXB0ZXItPkNvbW1vbkNmZy5HZW9ncmFwaHksIDEpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU3RhdHVzPSVkXG4iLCBTdGF0dXMpKTsKKwkJCWJyZWFrOworCisKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwkJY2FzZSBSVF9PSURfODAyXzExX1FVRVJZX0RMUzoKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihCT09MRUFOKTsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmcEFkYXB0ZXItPkNvbW1vbkNmZy5iRExTQ2FwYWJsZSwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1FVRVJZX0RMUyg9JWQpXG4iLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLmJETFNDYXBhYmxlKSk7CisJCQlicmVhazsKKworCQljYXNlIFJUX09JRF84MDJfMTFfUVVFUllfRExTX1BBUkFNOgorCQkJeworCQkJCVBSVF84MDJfMTFfRExTX0lORk8JcERsc0luZm8gPSBrbWFsbG9jKHNpemVvZihSVF84MDJfMTFfRExTX0lORk8pLCBHRlBfQVRPTUlDKTsKKwkJCQlpZiAocERsc0luZm8gPT0gTlVMTCkKKwkJCQkJYnJlYWs7CisKKwkJCQlmb3IgKGk9MDsgaTxNQVhfTlVNX09GX0RMU19FTlRSWTsgaSsrKQorCQkJCXsKKwkJCQkJUlRNUE1vdmVNZW1vcnkoJnBEbHNJbmZvLT5FbnRyeVtpXSwgJnBBZGFwdGVyLT5TdGFDZmcuRExTRW50cnlbaV0sIHNpemVvZihSVF84MDJfMTFfRExTX1VJKSk7CisJCQkJfQorCisJCQkJcERsc0luZm8tPm51bSA9IE1BWF9OVU1fT0ZfRExTX0VOVFJZOworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihSVF84MDJfMTFfRExTX0lORk8pOworCQkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwRGxzSW5mbywgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9RVUVSWV9ETFNfUEFSQU1cbiIpKTsKKworCQkJCWlmIChwRGxzSW5mbykKKwkJCQkJa2ZyZWUocERsc0luZm8pOworCQkJfQorCQkJYnJlYWs7CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6dW5rbm93biBJT0NUTCdzIHN1YmNtZCA9IDB4JTA4eFxuIiwgY21kKSk7CisgICAgICAgICAgICBTdGF0dXMgPSAtRU9QTk9UU1VQUDsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gU3RhdHVzOworfQorCitJTlQgcnQyOHh4X3N0YV9pb2N0bCgKKwlJTglzdHJ1Y3QgbmV0X2RldmljZQkqbmV0X2RldiwKKwlJTglPVVQJc3RydWN0IGlmcmVxCSpycSwKKwlJTglJTlQJCQkJCWNtZCkKK3sKKwlQT1NfQ09PS0lFCQkJcE9iajsKKwlWSVJUVUFMX0FEQVBURVIJCSpwVmlydHVhbEFkID0gTlVMTDsKKwlSVE1QX0FEQVBURVIgICAgICAgICpwQWQgPSBOVUxMOworCXN0cnVjdCBpd3JlcSAgICAgICAgKndycSA9IChzdHJ1Y3QgaXdyZXEgKikgcnE7CisJQk9PTEVBTgkJCQlTdGF0ZU1hY2hpbmVUb3VjaGVkID0gRkFMU0U7CisJSU5UCQkJCQlTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworCVVTSE9SVAkJCQlzdWJjbWQ7CisKKwlpZiAobmV0X2Rldi0+cHJpdl9mbGFncyA9PSBJTlRfTUFJTikKKwl7CisJCXBBZCA9IG5ldF9kZXYtPm1sX3ByaXY7CisJfQorCWVsc2UKKwl7CisJCXBWaXJ0dWFsQWQgPSBuZXRfZGV2LT5tbF9wcml2OworCQlwQWQgPSBwVmlydHVhbEFkLT5SdG1wRGV2LT5tbF9wcml2OworCX0KKwlwT2JqID0gKFBPU19DT09LSUUpIHBBZC0+T1NfQ29va2llOworCisJaWYgKHBBZCA9PSBOVUxMKQorCXsKKwkJLyogaWYgMXN0IG9wZW4gZmFpbCwgcEFkIHdpbGwgYmUgZnJlZTsKKwkJICAgU28gdGhlIG5ldF9kZXYtPm1sX3ByaXYgd2lsbCBiZSBOVUxMIGluIDJyZCBvcGVuICovCisJCXJldHVybiAtRU5FVERPV047CisJfQorCisgICAgLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KKyAgICBpZighUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQorICAgIHsKKyNpZmRlZiBDT05GSUdfQVBTVEFfTUlYRURfU1VQUE9SVAorCSAgICBpZiAod3JxLT51LmRhdGEucG9pbnRlciA9PSBOVUxMKQorCSAgICB7CisJCSAgICByZXR1cm4gU3RhdHVzOworCSAgICB9CisKKwkgICAgaWYgKHN0cnN0cih3cnEtPnUuZGF0YS5wb2ludGVyLCAiT3BNb2RlIikgPT0gTlVMTCkKKyNlbmRpZiAvLyBDT05GSUdfQVBTVEFfTUlYRURfU1VQUE9SVCAvLworICAgICAgICB7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisJCSAgICByZXR1cm4gLUVORVRET1dOOworICAgICAgICB9CisgICAgfQorCisJewkvLyBkZXRlcm1pbmUgdGhpcyBpb2N0bCBjb21tYW5kIGlzIGNvbW1pbmcgZnJvbSB3aGljaCBpbnRlcmZhY2UuCisJCXBPYmotPmlvY3RsX2lmX3R5cGUgPSBJTlRfTUFJTjsKKwkJcE9iai0+aW9jdGxfaWYgPSBNQUlOX01CU1NJRDsKKwl9CisKKwlzd2l0Y2goY21kKQorCXsKKyNpZmRlZiBSQUxJTktfQVRFCisjaWZkZWYgUkFMSU5LXzI4eHhfUUEKKwkJY2FzZSBSVFBSSVZfSU9DVExfQVRFOgorCQkJeworCQkJCVJ0bXBEb0F0ZShwQWQsIHdycSk7CisJCQl9CisJCQlicmVhazsKKyNlbmRpZiAvLyBSQUxJTktfMjh4eF9RQSAvLworI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKyAgICAgICAgY2FzZSBTSU9DR0lGSFdBRERSOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU9DVEw6OlNJT0NHSUZIV0FERFJcbiIpKTsKKwkJCW1lbWNweSh3cnEtPnUubmFtZSwgcEFkLT5DdXJyZW50QWRkcmVzcywgRVRIX0FMRU4pOworCQkJYnJlYWs7CisJCWNhc2UgU0lPQ0dJV05BTUU6CisgICAgICAgIHsKKyAgICAgICAgCWNoYXIgKm5hbWU9JndycS0+dS5uYW1lWzBdOworICAgICAgICAJcnRfaW9jdGxfZ2l3bmFtZShuZXRfZGV2LCBOVUxMLCBuYW1lLCBOVUxMKTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgU0lPQ0dJV0VTU0lEOiAgLy9HZXQgRVNTSUQKKyAgICAgICAgeworICAgICAgICAJc3RydWN0IGl3X3BvaW50ICplc3NpZD0md3JxLT51LmVzc2lkOworICAgICAgICAJcnRfaW9jdGxfZ2l3ZXNzaWQobmV0X2RldiwgTlVMTCwgZXNzaWQsIGVzc2lkLT5wb2ludGVyKTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgU0lPQ1NJV0VTU0lEOiAgLy9TZXQgRVNTSUQKKyAgICAgICAgeworICAgICAgICAJc3RydWN0IGl3X3BvaW50CSplc3NpZD0md3JxLT51LmVzc2lkOworICAgICAgICAJcnRfaW9jdGxfc2l3ZXNzaWQobmV0X2RldiwgTlVMTCwgZXNzaWQsIGVzc2lkLT5wb2ludGVyKTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgU0lPQ1NJV05XSUQ6ICAgLy8gc2V0IG5ldHdvcmsgaWQgKHRoZSBjZWxsKQorCQljYXNlIFNJT0NHSVdOV0lEOiAgIC8vIGdldCBuZXR3b3JrIGlkCisJCQlTdGF0dXMgPSAtRU9QTk9UU1VQUDsKKwkJCWJyZWFrOworCQljYXNlIFNJT0NTSVdGUkVROiAgIC8vc2V0IGNoYW5uZWwvZnJlcXVlbmN5IChIeikKKyAgICAgICAgeworICAgICAgICAJc3RydWN0IGl3X2ZyZXEgKmZyZXE9JndycS0+dS5mcmVxOworICAgICAgICAJcnRfaW9jdGxfc2l3ZnJlcShuZXRfZGV2LCBOVUxMLCBmcmVxLCBOVUxMKTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgU0lPQ0dJV0ZSRVE6ICAgLy8gZ2V0IGNoYW5uZWwvZnJlcXVlbmN5IChIeikKKyAgICAgICAgeworICAgICAgICAJc3RydWN0IGl3X2ZyZXEgKmZyZXE9JndycS0+dS5mcmVxOworICAgICAgICAJcnRfaW9jdGxfZ2l3ZnJlcShuZXRfZGV2LCBOVUxMLCBmcmVxLCBOVUxMKTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgU0lPQ1NJV05JQ0tOOiAvL3NldCBub2RlIG5hbWUvbmlja25hbWUKKyAgICAgICAgeworICAgICAgICAJc3RydWN0IGl3X3BvaW50ICpkYXRhPSZ3cnEtPnUuZGF0YTsKKyAgICAgICAgCXJ0X2lvY3RsX3Npd25pY2tuKG5ldF9kZXYsIE5VTEwsIGRhdGEsIE5VTEwpOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBTSU9DR0lXTklDS046IC8vZ2V0IG5vZGUgbmFtZS9uaWNrbmFtZQorICAgICAgICB7CisgICAgICAgIAlzdHJ1Y3QgaXdfcG9pbnQgKmRhdGE9JndycS0+dS5kYXRhOworICAgICAgICAJcnRfaW9jdGxfZ2l3bmlja24obmV0X2RldiwgTlVMTCwgZGF0YSwgTlVMTCk7CisJCQlicmVhazsKKwkJfQorCQljYXNlIFNJT0NHSVdSQVRFOiAgIC8vZ2V0IGRlZmF1bHQgYml0IHJhdGUgKGJwcykKKwkJICAgIHJ0X2lvY3RsX2dpd3JhdGUobmV0X2RldiwgTlVMTCwgJndycS0+dSwgTlVMTCk7CisgICAgICAgICAgICBicmVhazsKKwkgICAgY2FzZSBTSU9DU0lXUkFURTogIC8vc2V0IGRlZmF1bHQgYml0IHJhdGUgKGJwcykKKwkgICAgICAgIHJ0X2lvY3RsX3Npd3JhdGUobmV0X2RldiwgTlVMTCwgJndycS0+dSwgTlVMTCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTSU9DR0lXUlRTOiAgLy8gZ2V0IFJUUy9DVFMgdGhyZXNob2xkIChieXRlcykKKyAgICAgICAgeworICAgICAgICAJc3RydWN0IGl3X3BhcmFtICpydHM9JndycS0+dS5ydHM7CisgICAgICAgIAlydF9pb2N0bF9naXdydHMobmV0X2RldiwgTlVMTCwgcnRzLCBOVUxMKTsKKwkJCWJyZWFrOworCQl9CisgICAgICAgIGNhc2UgU0lPQ1NJV1JUUzogIC8vc2V0IFJUUy9DVFMgdGhyZXNob2xkIChieXRlcykKKyAgICAgICAgeworICAgICAgICAJc3RydWN0IGl3X3BhcmFtICpydHM9JndycS0+dS5ydHM7CisgICAgICAgIAlydF9pb2N0bF9zaXdydHMobmV0X2RldiwgTlVMTCwgcnRzLCBOVUxMKTsKKwkJCWJyZWFrOworCQl9CisgICAgICAgIGNhc2UgU0lPQ0dJV0ZSQUc6ICAvL2dldCBmcmFnbWVudGF0aW9uIHRociAoYnl0ZXMpCisgICAgICAgIHsKKyAgICAgICAgCXN0cnVjdCBpd19wYXJhbSAqZnJhZz0md3JxLT51LmZyYWc7CisgICAgICAgIAlydF9pb2N0bF9naXdmcmFnKG5ldF9kZXYsIE5VTEwsIGZyYWcsIE5VTEwpOworCQkJYnJlYWs7CisJCX0KKyAgICAgICAgY2FzZSBTSU9DU0lXRlJBRzogIC8vc2V0IGZyYWdtZW50YXRpb24gdGhyIChieXRlcykKKyAgICAgICAgeworICAgICAgICAJc3RydWN0IGl3X3BhcmFtICpmcmFnPSZ3cnEtPnUuZnJhZzsKKyAgICAgICAgCXJ0X2lvY3RsX3Npd2ZyYWcobmV0X2RldiwgTlVMTCwgZnJhZywgTlVMTCk7CisJCQlicmVhazsKKwkJfQorICAgICAgICBjYXNlIFNJT0NHSVdFTkNPREU6ICAvL2dldCBlbmNvZGluZyB0b2tlbiAmIG1vZGUKKyAgICAgICAgeworICAgICAgICAJc3RydWN0IGl3X3BvaW50ICplcnE9JndycS0+dS5lbmNvZGluZzsKKyAgICAgICAgCWlmKGVycS0+cG9pbnRlcikKKyAgICAgICAgCQlydF9pb2N0bF9naXdlbmNvZGUobmV0X2RldiwgTlVMTCwgZXJxLCBlcnEtPnBvaW50ZXIpOworCQkJYnJlYWs7CisJCX0KKyAgICAgICAgY2FzZSBTSU9DU0lXRU5DT0RFOiAgLy9zZXQgZW5jb2RpbmcgdG9rZW4gJiBtb2RlCisgICAgICAgIHsKKyAgICAgICAgCXN0cnVjdCBpd19wb2ludCAqZXJxPSZ3cnEtPnUuZW5jb2Rpbmc7CisgICAgICAgIAlpZihlcnEtPnBvaW50ZXIpCisgICAgICAgIAkJcnRfaW9jdGxfc2l3ZW5jb2RlKG5ldF9kZXYsIE5VTEwsIGVycSwgZXJxLT5wb2ludGVyKTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgU0lPQ0dJV0FQOiAgICAgLy9nZXQgYWNjZXNzIHBvaW50IE1BQyBhZGRyZXNzZXMKKyAgICAgICAgeworICAgICAgICAJc3RydWN0IHNvY2thZGRyICphcF9hZGRyPSZ3cnEtPnUuYXBfYWRkcjsKKyAgICAgICAgCXJ0X2lvY3RsX2dpd2FwKG5ldF9kZXYsIE5VTEwsIGFwX2FkZHIsIGFwX2FkZHItPnNhX2RhdGEpOworCQkJYnJlYWs7CisJCX0KKwkgICAgY2FzZSBTSU9DU0lXQVA6ICAvL3NldCBhY2Nlc3MgcG9pbnQgTUFDIGFkZHJlc3NlcworICAgICAgICB7CisgICAgICAgIAlzdHJ1Y3Qgc29ja2FkZHIgKmFwX2FkZHI9JndycS0+dS5hcF9hZGRyOworICAgICAgICAJcnRfaW9jdGxfc2l3YXAobmV0X2RldiwgTlVMTCwgYXBfYWRkciwgYXBfYWRkci0+c2FfZGF0YSk7CisJCQlicmVhazsKKwkJfQorCQljYXNlIFNJT0NHSVdNT0RFOiAgIC8vZ2V0IG9wZXJhdGlvbiBtb2RlCisgICAgICAgIHsKKyAgICAgICAgCV9fdTMyICptb2RlPSZ3cnEtPnUubW9kZTsKKyAgICAgICAgCXJ0X2lvY3RsX2dpd21vZGUobmV0X2RldiwgTlVMTCwgbW9kZSwgTlVMTCk7CisJCQlicmVhazsKKwkJfQorCQljYXNlIFNJT0NTSVdNT0RFOiAgIC8vc2V0IG9wZXJhdGlvbiBtb2RlCisgICAgICAgIHsKKyAgICAgICAgCV9fdTMyICptb2RlPSZ3cnEtPnUubW9kZTsKKyAgICAgICAgCXJ0X2lvY3RsX3Npd21vZGUobmV0X2RldiwgTlVMTCwgbW9kZSwgTlVMTCk7CisJCQlicmVhazsKKwkJfQorCQljYXNlIFNJT0NHSVdTRU5TOiAgIC8vZ2V0IHNlbnNpdGl2aXR5IChkQm0pCisJCWNhc2UgU0lPQ1NJV1NFTlM6CS8vc2V0IHNlbnNpdGl2aXR5IChkQm0pCisJCWNhc2UgU0lPQ0dJV1BPV0VSOiAgLy9nZXQgUG93ZXIgTWFuYWdlbWVudCBzZXR0aW5ncworCQljYXNlIFNJT0NTSVdQT1dFUjogIC8vc2V0IFBvd2VyIE1hbmFnZW1lbnQgc2V0dGluZ3MKKwkJY2FzZSBTSU9DR0lXVFhQT1c6ICAvL2dldCB0cmFuc21pdCBwb3dlciAoZEJtKQorCQljYXNlIFNJT0NTSVdUWFBPVzogIC8vc2V0IHRyYW5zbWl0IHBvd2VyIChkQm0pCisJCWNhc2UgU0lPQ0dJV1JBTkdFOgkvL0dldCByYW5nZSBvZiBwYXJhbWV0ZXJzCisJCWNhc2UgU0lPQ0dJV1JFVFJZOgkvL2dldCByZXRyeSBsaW1pdHMgYW5kIGxpZmV0aW1lCisJCWNhc2UgU0lPQ1NJV1JFVFJZOgkvL3NldCByZXRyeSBsaW1pdHMgYW5kIGxpZmV0aW1lCisJCQlTdGF0dXMgPSAtRU9QTk9UU1VQUDsKKwkJCWJyZWFrOworCQljYXNlIFJUX1BSSVZfSU9DVEw6CisJCQlzdWJjbWQgPSB3cnEtPnUuZGF0YS5mbGFnczsKKwkJCWlmKCBzdWJjbWQgJiBPSURfR0VUX1NFVF9UT0dHTEUpCisJCQkJU3RhdHVzID0gUlRNUFNldEluZm9ybWF0aW9uKHBBZCwgcnEsIHN1YmNtZCk7CisJCQllbHNlCisJCQkJU3RhdHVzID0gUlRNUFF1ZXJ5SW5mb3JtYXRpb24ocEFkLCBycSwgc3ViY21kKTsKKwkJCWJyZWFrOworCQljYXNlIFNJT0NHSVdQUklWOgorCQkJaWYgKHdycS0+dS5kYXRhLnBvaW50ZXIpCisJCQl7CisJCQkJaWYgKCBhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCB3cnEtPnUuZGF0YS5wb2ludGVyLCBzaXplb2YocHJpdnRhYikpICE9IFRSVUUpCisJCQkJCWJyZWFrOworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihwcml2dGFiKSAvIHNpemVvZihwcml2dGFiWzBdKTsKKwkJCQlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHByaXZ0YWIsIHNpemVvZihwcml2dGFiKSkpCisJCQkJCVN0YXR1cyA9IC1FRkFVTFQ7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBSVFBSSVZfSU9DVExfU0VUOgorCQkJaWYoYWNjZXNzX29rKFZFUklGWV9SRUFELCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpICE9IFRSVUUpCisJCQkJYnJlYWs7CisJCQlydF9pb2N0bF9zZXRwYXJhbShuZXRfZGV2LCBOVUxMLCBOVUxMLCB3cnEtPnUuZGF0YS5wb2ludGVyKTsKKwkJCWJyZWFrOworCQljYXNlIFJUUFJJVl9JT0NUTF9HU0lURVNVUlZFWToKKwkJCVJUTVBJb2N0bEdldFNpdGVTdXJ2ZXkocEFkLCB3cnEpOworCQkgICAgYnJlYWs7CisjaWZkZWYgREJHCisJCWNhc2UgUlRQUklWX0lPQ1RMX01BQzoKKwkJCVJUTVBJb2N0bE1BQyhwQWQsIHdycSk7CisJCQlicmVhazsKKwkJY2FzZSBSVFBSSVZfSU9DVExfRTJQOgorCQkJUlRNUElvY3RsRTJQUk9NKHBBZCwgd3JxKTsKKwkJCWJyZWFrOworI2VuZGlmIC8vIERCRyAvLworICAgICAgICBjYXNlIFNJT0NFVEhUT09MOgorICAgICAgICAgICAgICAgIGJyZWFrOworCQlkZWZhdWx0OgorCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiSU9DVEw6OnVua25vd24gSU9DVEwncyBjbWQgPSAweCUwOHhcbiIsIGNtZCkpOworCQkJU3RhdHVzID0gLUVPUE5PVFNVUFA7CisJCQlicmVhazsKKwl9CisKKyAgICBpZihTdGF0ZU1hY2hpbmVUb3VjaGVkKSAvLyBVcHBlciBsYXllciBzZW50IGEgTUxNRS1yZWxhdGVkIG9wZXJhdGlvbnMKKyAgICAJUlQyOFhYX01MTUVfSEFORExFUihwQWQpOworCisJcmV0dXJuIFN0YXR1czsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgU1NJRAorICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UIFNldF9TU0lEX1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZykKK3sKKyAgICBORElTXzgwMl8xMV9TU0lEICAgICAgICAgICAgICAgICAgICBTc2lkLCAqcFNzaWQ9TlVMTDsKKyAgICBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0ZU1hY2hpbmVUb3VjaGVkID0gRkFMU0U7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2VzcyA9IFRSVUU7CisKKyAgICBpZiggc3RybGVuKGFyZykgPD0gTUFYX0xFTl9PRl9TU0lEKQorICAgIHsKKyAgICAgICAgTmRpc1plcm9NZW1vcnkoJlNzaWQsIHNpemVvZihORElTXzgwMl8xMV9TU0lEKSk7CisgICAgICAgIGlmIChzdHJsZW4oYXJnKSAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShTc2lkLlNzaWQsIGFyZywgc3RybGVuKGFyZykpOworICAgICAgICAgICAgU3NpZC5Tc2lkTGVuZ3RoID0gc3RybGVuKGFyZyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSAgIC8vQU5ZIHNzaWQKKyAgICAgICAgeworICAgICAgICAgICAgU3NpZC5Tc2lkTGVuZ3RoID0gMDsKKwkJICAgIG1lbWNweShTc2lkLlNzaWQsICIiLCAwKTsKKwkJCXBBZGFwdGVyLT5TdGFDZmcuQnNzVHlwZSA9IEJTU19JTkZSQTsKKwkJCXBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVPcGVuOworCSAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXMgID0gTmRpczgwMl8xMUVuY3J5cHRpb25EaXNhYmxlZDsKKwkJfQorICAgICAgICBwU3NpZCA9ICZTc2lkOworCisgICAgICAgIGlmIChwQWRhcHRlci0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgIT0gQ05UTF9JRExFKQorICAgICAgICB7CisgICAgICAgICAgICBSVDI4WFhfTUxNRV9SRVNFVF9TVEFURV9NQUNISU5FKHBBZGFwdGVyKTsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISBNTE1FIGJ1c3ksIHJlc2V0IE1MTUUgc3RhdGUgbWFjaGluZSAhISFcbiIpKTsKKyAgICAgICAgfQorCisgICAgICAgIHBBZGFwdGVyLT5NbG1lQXV4LkN1cnJSZXFJc0Zyb21OZGlzID0gVFJVRTsKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5iU2NhblJlcUlzRnJvbVdlYlVJID0gRkFMU0U7CisJCXBBZGFwdGVyLT5iQ29uZmlnQ2hhbmdlZCA9IFRSVUU7CisKKyAgICAgICAgTWxtZUVucXVldWUocEFkYXB0ZXIsCisgICAgICAgICAgICAgICAgICAgIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLAorICAgICAgICAgICAgICAgICAgICBPSURfODAyXzExX1NTSUQsCisgICAgICAgICAgICAgICAgICAgIHNpemVvZihORElTXzgwMl8xMV9TU0lEKSwKKyAgICAgICAgICAgICAgICAgICAgKFZPSUQgKilwU3NpZCk7CisKKyAgICAgICAgU3RhdGVNYWNoaW5lVG91Y2hlZCA9IFRSVUU7CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9TU0lEX1Byb2M6OihMZW49JWQsU3NpZD0lcylcbiIsIFNzaWQuU3NpZExlbmd0aCwgU3NpZC5Tc2lkKSk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgc3VjY2VzcyA9IEZBTFNFOworCisgICAgaWYgKFN0YXRlTWFjaGluZVRvdWNoZWQpIC8vIFVwcGVyIGxheWVyIHNlbnQgYSBNTE1FLXJlbGF0ZWQgb3BlcmF0aW9ucworICAgIAlSVDI4WFhfTUxNRV9IQU5ETEVSKHBBZGFwdGVyKTsKKworICAgIHJldHVybiBzdWNjZXNzOworfQorCisjaWZkZWYgV01NX1NVUFBPUlQKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IFdtbUNhcGFibGUgRW5hYmxlIG9yIERpc2FibGUKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVAlTZXRfV21tQ2FwYWJsZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlCT09MRUFOCWJXbW1DYXBhYmxlOworCisJYldtbUNhcGFibGUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCisJaWYgKChiV21tQ2FwYWJsZSA9PSAxKQorCQkpCisJCXBBZC0+Q29tbW9uQ2ZnLmJXbW1DYXBhYmxlID0gVFJVRTsKKwllbHNlIGlmIChiV21tQ2FwYWJsZSA9PSAwKQorCQlwQWQtPkNvbW1vbkNmZy5iV21tQ2FwYWJsZSA9IEZBTFNFOworCWVsc2UKKwkJcmV0dXJuIEZBTFNFOyAgLy9JbnZhbGlkIGFyZ3VtZW50CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfV21tQ2FwYWJsZV9Qcm9jOjooYldtbUNhcGFibGU9JWQpXG4iLAorCQlwQWQtPkNvbW1vbkNmZy5iV21tQ2FwYWJsZSkpOworCisJcmV0dXJuIFRSVUU7Cit9CisjZW5kaWYgLy8gV01NX1NVUFBPUlQgLy8KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgTmV0d29yayBUeXBlKEluZnJhc3RydWN0dXJlL0FkaG9jIG1vZGUpCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQgU2V0X05ldHdvcmtUeXBlX1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZykKK3sKKyAgICBVSU5UMzIJVmFsdWUgPSAwOworCisgICAgaWYgKHN0cmNtcChhcmcsICJBZGhvYyIpID09IDApCisJeworCQlpZiAocEFkYXB0ZXItPlN0YUNmZy5Cc3NUeXBlICE9IEJTU19BREhPQykKKwkJeworCQkJLy8gQ29uZmlnIGhhcyBjaGFuZ2VkCisJCQlwQWRhcHRlci0+YkNvbmZpZ0NoYW5nZWQgPSBUUlVFOworICAgICAgICAgICAgaWYgKE1PTklUT1JfT04ocEFkYXB0ZXIpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFJUTVBfSU9fV1JJVEUzMihwQWRhcHRlciwgUlhfRklMVFJfQ0ZHLCBTVEFOT1JNQUwpOworICAgICAgICAgICAgICAgIFJUTVBfSU9fUkVBRDMyKHBBZGFwdGVyLCBNQUNfU1lTX0NUUkwsICZWYWx1ZSk7CisJCQkJVmFsdWUgJj0gKH4weDgwKTsKKwkJCQlSVE1QX0lPX1dSSVRFMzIocEFkYXB0ZXIsIE1BQ19TWVNfQ1RSTCwgVmFsdWUpOworICAgICAgICAgICAgICAgIE9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkYXB0ZXIsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKTsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLmJBdXRvUmVjb25uZWN0ID0gVFJVRTsKKyAgICAgICAgICAgICAgICBMaW5rRG93bihwQWRhcHRlciwgRkFMU0UpOworICAgICAgICAgICAgfQorCQkJaWYgKElORlJBX09OKHBBZGFwdGVyKSkKKwkJCXsKKwkJCQkvL0JPT0xFQU4gQ2FuY2VsbGVkOworCQkJCS8vIFNldCB0aGUgQXV0b1JlY29ubmVjdFNzaWQgdG8gcHJldmVudCBpdCByZWNvbm5lY3QgdG8gb2xkIFNTSUQKKwkJCQkvLyBTaW5jZSBjYWxsaW5nIHRoaXMgaW5kaWNhdGUgdXNlciBkb24ndCB3YW50IHRvIGNvbm5lY3QgdG8gdGhhdCBTU0lEIGFueW1vcmUuCisJCQkJcEFkYXB0ZXItPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWRMZW49IDMyOworCQkJCU5kaXNaZXJvTWVtb3J5KHBBZGFwdGVyLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkLCBwQWRhcHRlci0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbik7CisKKwkJCQlMaW5rRG93bihwQWRhcHRlciwgRkFMU0UpOworCisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTkRJU19TVEFUVVNfTUVESUFfRElTQ09OTkVDVCBFdmVudCBCQiFcbiIpKTsKKwkJCX0KKwkJfQorCQlwQWRhcHRlci0+U3RhQ2ZnLkJzc1R5cGUgPSBCU1NfQURIT0M7CisgICAgICAgIHBBZGFwdGVyLT5uZXRfZGV2LT50eXBlID0gcEFkYXB0ZXItPlN0YUNmZy5PcmlEZXZUeXBlOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT0+U2V0X05ldHdvcmtUeXBlX1Byb2M6OihBRC1IT0MpXG4iKSk7CisJfQorICAgIGVsc2UgaWYgKHN0cmNtcChhcmcsICJJbmZyYSIpID09IDApCisJeworCQlpZiAocEFkYXB0ZXItPlN0YUNmZy5Cc3NUeXBlICE9IEJTU19JTkZSQSkKKwkJeworCQkJLy8gQ29uZmlnIGhhcyBjaGFuZ2VkCisJCQlwQWRhcHRlci0+YkNvbmZpZ0NoYW5nZWQgPSBUUlVFOworICAgICAgICAgICAgaWYgKE1PTklUT1JfT04ocEFkYXB0ZXIpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFJUTVBfSU9fV1JJVEUzMihwQWRhcHRlciwgUlhfRklMVFJfQ0ZHLCBTVEFOT1JNQUwpOworICAgICAgICAgICAgICAgIFJUTVBfSU9fUkVBRDMyKHBBZGFwdGVyLCBNQUNfU1lTX0NUUkwsICZWYWx1ZSk7CisJCQkJVmFsdWUgJj0gKH4weDgwKTsKKwkJCQlSVE1QX0lPX1dSSVRFMzIocEFkYXB0ZXIsIE1BQ19TWVNfQ1RSTCwgVmFsdWUpOworICAgICAgICAgICAgICAgIE9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkYXB0ZXIsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKTsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLmJBdXRvUmVjb25uZWN0ID0gVFJVRTsKKyAgICAgICAgICAgICAgICBMaW5rRG93bihwQWRhcHRlciwgRkFMU0UpOworICAgICAgICAgICAgfQorCQkJaWYgKEFESE9DX09OKHBBZGFwdGVyKSkKKwkJCXsKKwkJCQkvLyBTZXQgdGhlIEF1dG9SZWNvbm5lY3RTc2lkIHRvIHByZXZlbnQgaXQgcmVjb25uZWN0IHRvIG9sZCBTU0lECisJCQkJLy8gU2luY2UgY2FsbGluZyB0aGlzIGluZGljYXRlIHVzZXIgZG9uJ3Qgd2FudCB0byBjb25uZWN0IHRvIHRoYXQgU1NJRCBhbnltb3JlLgorCQkJCXBBZGFwdGVyLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuPSAzMjsKKwkJCQlOZGlzWmVyb01lbW9yeShwQWRhcHRlci0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZCwgcEFkYXB0ZXItPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWRMZW4pOworCisJCQkJTGlua0Rvd24ocEFkYXB0ZXIsIEZBTFNFKTsKKwkJCX0KKwkJfQorCQlwQWRhcHRlci0+U3RhQ2ZnLkJzc1R5cGUgPSBCU1NfSU5GUkE7CisgICAgICAgIHBBZGFwdGVyLT5uZXRfZGV2LT50eXBlID0gcEFkYXB0ZXItPlN0YUNmZy5PcmlEZXZUeXBlOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT0+U2V0X05ldHdvcmtUeXBlX1Byb2M6OihJTkZSQSlcbiIpKTsKKworICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkJzc1R5cGUgPSBCU1NfSU5GUkE7CisJfQorICAgIGVsc2UgaWYgKHN0cmNtcChhcmcsICJNb25pdG9yIikgPT0gMCkKKyAgICB7CisJCVVDSEFSCWJicFZhbHVlID0gMDsKKwkJQkNOX1RJTUVfQ0ZHX1NUUlVDIGNzcjsKKwkJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWRhcHRlciwgZk9QX1NUQVRVU19JTkZSQV9PTik7CisgICAgICAgIE9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkYXB0ZXIsIGZPUF9TVEFUVVNfQURIT0NfT04pOworCQlPUFNUQVRVU19TRVRfRkxBRyhwQWRhcHRlciwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpOworCQkvLyBkaXNhYmxlIGFsbCBwZXJpb2RpYyBzdGF0ZSBtYWNoaW5lCisJCXBBZGFwdGVyLT5TdGFDZmcuYkF1dG9SZWNvbm5lY3QgPSBGQUxTRTsKKwkJLy8gcmVzZXQgYWxsIG1sbWUgc3RhdGUgbWFjaGluZQorCQlSVDI4WFhfTUxNRV9SRVNFVF9TVEFURV9NQUNISU5FKHBBZGFwdGVyKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQgXG4iKSk7CisgICAgICAgIGlmIChwQWRhcHRlci0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsID09IDApCisgICAgICAgIHsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKyAgICAgICAgICAgIGlmIChwQWRhcHRlci0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQU5fTUlYRUQpCisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA9IDM2OworICAgICAgICAgICAgZWxzZQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPSA2OworICAgICAgICB9CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIE5fQ2hhbm5lbENoZWNrKHBBZGFwdGVyKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCWlmIChwQWRhcHRlci0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCAmJgorICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlcgPT0gQldfNDAgJiYKKyAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkVYVENIQSA9PSBFWFRDSEFfQUJPVkUpCisJCXsKKwkJCS8vIDQwTUh6ICxjb250cm9sIGNoYW5uZWwgYXQgbG93ZXIKKwkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWRhcHRlciwgQkJQX1I0LCAmYmJwVmFsdWUpOworCQkJYmJwVmFsdWUgJj0gKH4weDE4KTsKKwkJCWJicFZhbHVlIHw9IDB4MTA7CisJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZGFwdGVyLCBCQlBfUjQsIGJicFZhbHVlKTsKKwkJCXBBZGFwdGVyLT5Db21tb25DZmcuQkJQQ3VycmVudEJXID0gQldfNDA7CisJCQkvLyAgUlggOiBjb250cm9sIGNoYW5uZWwgYXQgbG93ZXIKKwkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWRhcHRlciwgQkJQX1IzLCAmYmJwVmFsdWUpOworCQkJYmJwVmFsdWUgJj0gKH4weDIwKTsKKwkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkYXB0ZXIsIEJCUF9SMywgYmJwVmFsdWUpOworCisJCQlSVE1QX0lPX1JFQUQzMihwQWRhcHRlciwgVFhfQkFORF9DRkcsICZWYWx1ZSk7CisJCQlWYWx1ZSAmPSAweGZmZmZmZmZlOworCQkJUlRNUF9JT19XUklURTMyKHBBZGFwdGVyLCBUWF9CQU5EX0NGRywgVmFsdWUpOworCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA9IHBBZGFwdGVyLT5Db21tb25DZmcuQ2hhbm5lbCArIDI7CisgICAgICAgICAgICBBc2ljU3dpdGNoQ2hhbm5lbChwQWRhcHRlciwgcEFkYXB0ZXItPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCwgRkFMU0UpOworCQkgICAgQXNpY0xvY2tDaGFubmVsKHBBZGFwdGVyLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsKTsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkJXXzQwICxjb250cm9sX2NoYW5uZWwoJWQpLCBDZW50cmFsQ2hhbm5lbCglZCkgXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCkpOworCQl9CisJCWVsc2UgaWYgKHBBZGFwdGVyLT5Db21tb25DZmcuUGh5TW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEICYmCisgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXID09IEJXXzQwICYmCisgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkVYVENIQSA9PSBFWFRDSEFfQkVMT1cpCisJCXsKKwkJCS8vIDQwTUh6ICxjb250cm9sIGNoYW5uZWwgYXQgdXBwZXIKKwkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWRhcHRlciwgQkJQX1I0LCAmYmJwVmFsdWUpOworCQkJYmJwVmFsdWUgJj0gKH4weDE4KTsKKwkJCWJicFZhbHVlIHw9IDB4MTA7CisJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZGFwdGVyLCBCQlBfUjQsIGJicFZhbHVlKTsKKwkJCXBBZGFwdGVyLT5Db21tb25DZmcuQkJQQ3VycmVudEJXID0gQldfNDA7CisJCQlSVE1QX0lPX1JFQUQzMihwQWRhcHRlciwgVFhfQkFORF9DRkcsICZWYWx1ZSk7CisJCQlWYWx1ZSB8PSAweDE7CisJCQlSVE1QX0lPX1dSSVRFMzIocEFkYXB0ZXIsIFRYX0JBTkRfQ0ZHLCBWYWx1ZSk7CisKKwkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWRhcHRlciwgQkJQX1IzLCAmYmJwVmFsdWUpOworCQkJYmJwVmFsdWUgfD0gKDB4MjApOworCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWRhcHRlciwgQkJQX1IzLCBiYnBWYWx1ZSk7CisJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsIC0gMjsKKyAgICAgICAgICAgIEFzaWNTd2l0Y2hDaGFubmVsKHBBZGFwdGVyLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsLCBGQUxTRSk7CisJCSAgICBBc2ljTG9ja0NoYW5uZWwocEFkYXB0ZXIsIHBBZGFwdGVyLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwpOworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQldfNDAgLGNvbnRyb2xfY2hhbm5lbCglZCksIENlbnRyYWxDaGFubmVsKCVkKSBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsKSk7CisJCX0KKwkJZWxzZQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQl7CisJCQkvLyAyME1IegorCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZGFwdGVyLCBCQlBfUjQsICZiYnBWYWx1ZSk7CisJCQliYnBWYWx1ZSAmPSAofjB4MTgpOworCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWRhcHRlciwgQkJQX1I0LCBiYnBWYWx1ZSk7CisJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkJCUEN1cnJlbnRCVyA9IEJXXzIwOworCQkJQXNpY1N3aXRjaENoYW5uZWwocEFkYXB0ZXIsIHBBZGFwdGVyLT5Db21tb25DZmcuQ2hhbm5lbCwgRkFMU0UpOworCQkJQXNpY0xvY2tDaGFubmVsKHBBZGFwdGVyLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWwpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQldfMjAsIENoYW5uZWwoJWQpXG4iLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWwpKTsKKwkJfQorCQkvLyBFbmFibGUgUnggd2l0aCBwcm9taXNjdW91cyByZWNlcHRpb24KKwkJUlRNUF9JT19XUklURTMyKHBBZGFwdGVyLCBSWF9GSUxUUl9DRkcsIDB4Myk7CisJCS8vIEFTSUMgc3VwcG9yc3RzIHNuaWZmZXIgZnVuY3Rpb24gd2l0aCByZXBsYWNpbmcgUlNTSSB3aXRoIHRpbWVzdGFtcC4KKwkJLy9SVE1QX0lPX1JFQUQzMihwQWRhcHRlciwgTUFDX1NZU19DVFJMLCAmVmFsdWUpOworCQkvL1ZhbHVlIHw9ICgweDgwKTsKKwkJLy9SVE1QX0lPX1dSSVRFMzIocEFkYXB0ZXIsIE1BQ19TWVNfQ1RSTCwgVmFsdWUpOworCQkvLyBkaXNhYmxlIHN5bmMKKwkJUlRNUF9JT19SRUFEMzIocEFkYXB0ZXIsIEJDTl9USU1FX0NGRywgJmNzci53b3JkKTsKKwkJY3NyLmZpZWxkLmJCZWFjb25HZW4gPSAwOworCQljc3IuZmllbGQuYlRCVFRFbmFibGUgPSAwOworCQljc3IuZmllbGQuVHNmU3luY01vZGUgPSAwOworCQlSVE1QX0lPX1dSSVRFMzIocEFkYXB0ZXIsIEJDTl9USU1FX0NGRywgY3NyLndvcmQpOworCisJCXBBZGFwdGVyLT5TdGFDZmcuQnNzVHlwZSA9IEJTU19NT05JVE9SOworICAgICAgICBwQWRhcHRlci0+bmV0X2Rldi0+dHlwZSA9IEFSUEhSRF9JRUVFODAyMTFfUFJJU007IC8vQVJQSFJEX0lFRUU4MDIxMTsgLy8gSUVFRTgwMjExCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT5TZXRfTmV0d29ya1R5cGVfUHJvYzo6KE1PTklUT1IpXG4iKSk7CisgICAgfQorCisgICAgLy8gUmVzZXQgUmFsaW5rIHN1cHBsaWNhbnQgdG8gbm90IHVzZSwgaXQgd2lsbCBiZSBzZXQgdG8gc3RhcnQgd2hlbiBVSSBzZXQgUE1LIGtleQorICAgIHBBZGFwdGVyLT5TdGFDZmcuV3BhU3RhdGUgPSBTU19OT1RVU0U7CisKKyAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfTmV0d29ya1R5cGVfUHJvYzo6KE5ldHdvcmtUeXBlPSVkKVxuIiwgcEFkYXB0ZXItPlN0YUNmZy5Cc3NUeXBlKSk7CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgQXV0aGVudGljYXRpb24gbW9kZQorICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UIFNldF9BdXRoTW9kZV9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpCit7CisgICAgaWYgKChzdHJjbXAoYXJnLCAiV0VQQVVUTyIpID09IDApIHx8IChzdHJjbXAoYXJnLCAid2VwYXV0byIpID09IDApKQorICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlQXV0b1N3aXRjaDsKKyAgICBlbHNlIGlmICgoc3RyY21wKGFyZywgIk9QRU4iKSA9PSAwKSB8fCAoc3RyY21wKGFyZywgIm9wZW4iKSA9PSAwKSkKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZU9wZW47CisgICAgZWxzZSBpZiAoKHN0cmNtcChhcmcsICJTSEFSRUQiKSA9PSAwKSB8fCAoc3RyY21wKGFyZywgInNoYXJlZCIpID09IDApKQorICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlU2hhcmVkOworICAgIGVsc2UgaWYgKChzdHJjbXAoYXJnLCAiV1BBUFNLIikgPT0gMCkgfHwgKHN0cmNtcChhcmcsICJ3cGFwc2siKSA9PSAwKSkKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSzsKKyAgICBlbHNlIGlmICgoc3RyY21wKGFyZywgIldQQU5PTkUiKSA9PSAwKSB8fCAoc3RyY21wKGFyZywgIndwYW5vbmUiKSA9PSAwKSkKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmU7CisgICAgZWxzZSBpZiAoKHN0cmNtcChhcmcsICJXUEEyUFNLIikgPT0gMCkgfHwgKHN0cmNtcChhcmcsICJ3cGEycHNrIikgPT0gMCkpCisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLOworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyAgICBlbHNlIGlmICgoc3RyY21wKGFyZywgIldQQSIpID09IDApIHx8IChzdHJjbXAoYXJnLCAid3BhIikgPT0gMCkpCisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVXUEE7CisgICAgZWxzZSBpZiAoKHN0cmNtcChhcmcsICJXUEEyIikgPT0gMCkgfHwgKHN0cmNtcChhcmcsICJ3cGEyIikgPT0gMCkpCisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVXUEEyOworI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKyAgICBlbHNlCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgIHBBZGFwdGVyLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQ7CisKKyAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfQXV0aE1vZGVfUHJvYzo6KEF1dGhNb2RlPSVkKVxuIiwgcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSkpOworCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IEVuY3J5cHRpb24gVHlwZQorICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UIFNldF9FbmNyeXBUeXBlX1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZykKK3sKKyAgICBpZiAoKHN0cmNtcChhcmcsICJOT05FIikgPT0gMCkgfHwgKHN0cmNtcChhcmcsICJub25lIikgPT0gMCkpCisgICAgeworICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpCisgICAgICAgICAgICByZXR1cm4gVFJVRTsgICAgLy8gZG8gbm90aGluZworCisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzICAgICA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5QYWlyQ2lwaGVyICAgID0gTmRpczgwMl8xMVdFUERpc2FibGVkOworCSAgICBwQWRhcHRlci0+U3RhQ2ZnLkdyb3VwQ2lwaGVyICAgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CisgICAgfQorICAgIGVsc2UgaWYgKChzdHJjbXAoYXJnLCAiV0VQIikgPT0gMCkgfHwgKHN0cmNtcChhcmcsICJ3ZXAiKSA9PSAwKSkKKyAgICB7CisgICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKKyAgICAgICAgICAgIHJldHVybiBUUlVFOyAgICAvLyBkbyBub3RoaW5nCisKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXMgICAgID0gTmRpczgwMl8xMVdFUEVuYWJsZWQ7CisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuUGFpckNpcGhlciAgICA9IE5kaXM4MDJfMTFXRVBFbmFibGVkOworCSAgICBwQWRhcHRlci0+U3RhQ2ZnLkdyb3VwQ2lwaGVyICAgPSBOZGlzODAyXzExV0VQRW5hYmxlZDsKKyAgICB9CisgICAgZWxzZSBpZiAoKHN0cmNtcChhcmcsICJUS0lQIikgPT0gMCkgfHwgKHN0cmNtcChhcmcsICJ0a2lwIikgPT0gMCkpCisgICAgeworICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA8IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKKyAgICAgICAgICAgIHJldHVybiBUUlVFOyAgICAvLyBkbyBub3RoaW5nCisKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXMgICAgID0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZDsKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5QYWlyQ2lwaGVyICAgID0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZDsKKwkgICAgcEFkYXB0ZXItPlN0YUNmZy5Hcm91cENpcGhlciAgID0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZDsKKyAgICB9CisgICAgZWxzZSBpZiAoKHN0cmNtcChhcmcsICJBRVMiKSA9PSAwKSB8fCAoc3RyY21wKGFyZywgImFlcyIpID09IDApKQorICAgIHsKKyAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPCBOZGlzODAyXzExQXV0aE1vZGVXUEEpCisgICAgICAgICAgICByZXR1cm4gVFJVRTsgICAgLy8gZG8gbm90aGluZworCisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzICAgICA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQ7CisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuUGFpckNpcGhlciAgICA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQ7CisJICAgIHBBZGFwdGVyLT5TdGFDZmcuR3JvdXBDaXBoZXIgICA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQ7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgcEFkYXB0ZXItPlN0YUNmZy5PcmlnV2VwU3RhdHVzID0gcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXM7CisKKyAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfRW5jcnlwVHlwZV9Qcm9jOjooRW5jcnlwVHlwZT0lZClcbiIsIHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzKSk7CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgRGVmYXVsdCBLZXkgSUQKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVCBTZXRfRGVmYXVsdEtleUlEX1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZykKK3sKKyAgICBVTE9ORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXlJZHg7CisKKyAgICBLZXlJZHggPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworICAgIGlmKChLZXlJZHggPj0gMSApICYmIChLZXlJZHggPD0gNCkpCisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkID0gKFVDSEFSKSAoS2V5SWR4IC0gMSApOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIEZBTFNFOyAgLy9JbnZhbGlkIGFyZ3VtZW50CisKKyAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfRGVmYXVsdEtleUlEX1Byb2M6OihEZWZhdWx0S2V5SUQ9JWQpXG4iLCBwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCkpOworCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IFdFUCBLRVkxCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQgU2V0X0tleTFfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKQoreworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleUxlbjsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpOworICAgIFVDSEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENpcGhlckFsZz1DSVBIRVJfV0VQNjQ7CisKKyAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpCisgICAgICAgIHJldHVybiBUUlVFOyAgICAvLyBkbyBub3RoaW5nCisKKyAgICBLZXlMZW4gPSBzdHJsZW4oYXJnKTsKKworICAgIHN3aXRjaCAoS2V5TGVuKQorICAgIHsKKyAgICAgICAgY2FzZSA1OiAvL3dlcCA0MCBBc2NpaSB0eXBlCisgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzBdLktleUxlbiA9IEtleUxlbjsKKyAgICAgICAgICAgIG1lbWNweShwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzBdLktleSwgYXJnLCBLZXlMZW4pOworICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTFfUHJvYzo6KEtleTE9JXMgYW5kIHR5cGU9JXMpXG4iLCBhcmcsICJBc2NpaSIpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDEwOiAvL3dlcCA0MCBIZXggdHlwZQorICAgICAgICAgICAgZm9yKGk9MDsgaSA8IEtleUxlbjsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCAhaXN4ZGlnaXQoKihhcmcraSkpICkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOyAgLy9Ob3QgSGV4IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVswXS5LZXlMZW4gPSBLZXlMZW4gLyAyIDsKKyAgICAgICAgICAgIEF0b0goYXJnLCBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzBdLktleSwgS2V5TGVuIC8gMik7CisgICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5MV9Qcm9jOjooS2V5MT0lcyBhbmQgdHlwZT0lcylcbiIsIGFyZywgIkhleCIpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDEzOiAvL3dlcCAxMDQgQXNjaWkgdHlwZQorICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVswXS5LZXlMZW4gPSBLZXlMZW47CisgICAgICAgICAgICBtZW1jcHkocEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVswXS5LZXksIGFyZywgS2V5TGVuKTsKKyAgICAgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5MV9Qcm9jOjooS2V5MT0lcyBhbmQgdHlwZT0lcylcbiIsIGFyZywgIkFzY2lpIikpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjY6IC8vd2VwIDEwNCBIZXggdHlwZQorICAgICAgICAgICAgZm9yKGk9MDsgaSA8IEtleUxlbjsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCAhaXN4ZGlnaXQoKihhcmcraSkpICkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOyAgLy9Ob3QgSGV4IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVswXS5LZXlMZW4gPSBLZXlMZW4gLyAyIDsKKyAgICAgICAgICAgIEF0b0goYXJnLCBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzBdLktleSwgS2V5TGVuIC8gMik7CisgICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTFfUHJvYzo6KEtleTE9JXMgYW5kIHR5cGU9JXMpXG4iLCBhcmcsICJIZXgiKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDogLy9JbnZhbGlkIGFyZ3VtZW50CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5MV9Qcm9jOjpJbnZhbGlkIGFyZ3VtZW50ICg9JXMpXG4iLCBhcmcpKTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZyA9IENpcGhlckFsZzsKKworICAgIC8vIFNldCBrZXlzIChpbnRvIEFTSUMpCisgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKQorICAgICAgICA7ICAgLy8gbm90IHN1cHBvcnQKKyAgICBlbHNlICAgIC8vIE9sZCBXRVAgc3R1ZmYKKyAgICB7CisgICAgICAgIEFzaWNBZGRTaGFyZWRLZXlFbnRyeShwQWRhcHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzBdLktleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICB9CisKKyAgICByZXR1cm4gVFJVRTsKK30KKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgV0VQIEtFWTIKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVCBTZXRfS2V5Ml9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpCit7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5TGVuOworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGk7CisgICAgVUNIQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2lwaGVyQWxnPUNJUEhFUl9XRVA2NDsKKworICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKKyAgICAgICAgcmV0dXJuIFRSVUU7ICAgIC8vIGRvIG5vdGhpbmcKKworICAgIEtleUxlbiA9IHN0cmxlbihhcmcpOworCisgICAgc3dpdGNoIChLZXlMZW4pCisgICAgeworICAgICAgICBjYXNlIDU6IC8vd2VwIDQwIEFzY2lpIHR5cGUKKyAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMV0uS2V5TGVuID0gS2V5TGVuOworICAgICAgICAgICAgbWVtY3B5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMV0uS2V5LCBhcmcsIEtleUxlbik7CisgICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5Ml9Qcm9jOjooS2V5Mj0lcyBhbmQgdHlwZT0lcylcbiIsIGFyZywgIkFzY2lpIikpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTA6IC8vd2VwIDQwIEhleCB0eXBlCisgICAgICAgICAgICBmb3IoaT0wOyBpIDwgS2V5TGVuOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoICFpc3hkaWdpdCgqKGFyZytpKSkgKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7ICAvL05vdCBIZXggdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzFdLktleUxlbiA9IEtleUxlbiAvIDIgOworICAgICAgICAgICAgQXRvSChhcmcsIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMV0uS2V5LCBLZXlMZW4gLyAyKTsKKyAgICAgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXkyX1Byb2M6OihLZXkyPSVzIGFuZCB0eXBlPSVzKVxuIiwgYXJnLCAiSGV4IikpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTM6IC8vd2VwIDEwNCBBc2NpaSB0eXBlCisgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzFdLktleUxlbiA9IEtleUxlbjsKKyAgICAgICAgICAgIG1lbWNweShwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzFdLktleSwgYXJnLCBLZXlMZW4pOworICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDEyODsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXkyX1Byb2M6OihLZXkyPSVzIGFuZCB0eXBlPSVzKVxuIiwgYXJnLCAiQXNjaWkiKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyNjogLy93ZXAgMTA0IEhleCB0eXBlCisgICAgICAgICAgICBmb3IoaT0wOyBpIDwgS2V5TGVuOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoICFpc3hkaWdpdCgqKGFyZytpKSkgKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7ICAvL05vdCBIZXggdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzFdLktleUxlbiA9IEtleUxlbiAvIDIgOworICAgICAgICAgICAgQXRvSChhcmcsIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMV0uS2V5LCBLZXlMZW4gLyAyKTsKKyAgICAgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5Ml9Qcm9jOjooS2V5Mj0lcyBhbmQgdHlwZT0lcylcbiIsIGFyZywgIkhleCIpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OiAvL0ludmFsaWQgYXJndW1lbnQKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXkyX1Byb2M6OkludmFsaWQgYXJndW1lbnQgKD0lcylcbiIsIGFyZykpOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzFdLkNpcGhlckFsZyA9IENpcGhlckFsZzsKKworICAgIC8vIFNldCBrZXlzIChpbnRvIEFTSUMpCisgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKQorICAgICAgICA7ICAgLy8gbm90IHN1cHBvcnQKKyAgICBlbHNlICAgIC8vIE9sZCBXRVAgc3R1ZmYKKyAgICB7CisgICAgICAgIEFzaWNBZGRTaGFyZWRLZXlFbnRyeShwQWRhcHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsxXS5DaXBoZXJBbGcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzFdLktleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICB9CisKKyAgICByZXR1cm4gVFJVRTsKK30KKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IFdFUCBLRVkzCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQgU2V0X0tleTNfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKQoreworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleUxlbjsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpOworICAgIFVDSEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENpcGhlckFsZz1DSVBIRVJfV0VQNjQ7CisKKyAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpCisgICAgICAgIHJldHVybiBUUlVFOyAgICAvLyBkbyBub3RoaW5nCisKKyAgICBLZXlMZW4gPSBzdHJsZW4oYXJnKTsKKworICAgIHN3aXRjaCAoS2V5TGVuKQorICAgIHsKKyAgICAgICAgY2FzZSA1OiAvL3dlcCA0MCBBc2NpaSB0eXBlCisgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzJdLktleUxlbiA9IEtleUxlbjsKKyAgICAgICAgICAgIG1lbWNweShwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzJdLktleSwgYXJnLCBLZXlMZW4pOworICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTNfUHJvYzo6KEtleTM9JXMgYW5kIHR5cGU9QXNjaWkpXG4iLCBhcmcpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDEwOiAvL3dlcCA0MCBIZXggdHlwZQorICAgICAgICAgICAgZm9yKGk9MDsgaSA8IEtleUxlbjsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCAhaXN4ZGlnaXQoKihhcmcraSkpICkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOyAgLy9Ob3QgSGV4IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsyXS5LZXlMZW4gPSBLZXlMZW4gLyAyIDsKKyAgICAgICAgICAgIEF0b0goYXJnLCBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzJdLktleSwgS2V5TGVuIC8gMik7CisgICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5M19Qcm9jOjooS2V5Mz0lcyBhbmQgdHlwZT1IZXgpXG4iLCBhcmcpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDEzOiAvL3dlcCAxMDQgQXNjaWkgdHlwZQorICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsyXS5LZXlMZW4gPSBLZXlMZW47CisgICAgICAgICAgICBtZW1jcHkocEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsyXS5LZXksIGFyZywgS2V5TGVuKTsKKyAgICAgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5M19Qcm9jOjooS2V5Mz0lcyBhbmQgdHlwZT1Bc2NpaSlcbiIsIGFyZykpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjY6IC8vd2VwIDEwNCBIZXggdHlwZQorICAgICAgICAgICAgZm9yKGk9MDsgaSA8IEtleUxlbjsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCAhaXN4ZGlnaXQoKihhcmcraSkpICkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOyAgLy9Ob3QgSGV4IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsyXS5LZXlMZW4gPSBLZXlMZW4gLyAyIDsKKyAgICAgICAgICAgIEF0b0goYXJnLCBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzJdLktleSwgS2V5TGVuIC8gMik7CisgICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTNfUHJvYzo6KEtleTM9JXMgYW5kIHR5cGU9SGV4KVxuIiwgYXJnKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDogLy9JbnZhbGlkIGFyZ3VtZW50CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5M19Qcm9jOjpJbnZhbGlkIGFyZ3VtZW50ICg9JXMpXG4iLCBhcmcpKTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsyXS5DaXBoZXJBbGcgPSBDaXBoZXJBbGc7CisKKyAgICAvLyBTZXQga2V5cyAoaW50byBBU0lDKQorICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKKyAgICAgICAgOyAgIC8vIG5vdCBzdXBwb3J0CisgICAgZWxzZSAgICAvLyBPbGQgV0VQIHN0dWZmCisgICAgeworICAgICAgICBBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkYXB0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMl0uQ2lwaGVyQWxnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsyXS5LZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgfQorCisgICAgcmV0dXJuIFRSVUU7Cit9CisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBXRVAgS0VZNAorICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UIFNldF9LZXk0X1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZykKK3sKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXlMZW47CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTsKKyAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaXBoZXJBbGc9Q0lQSEVSX1dFUDY0OworCisgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKQorICAgICAgICByZXR1cm4gVFJVRTsgICAgLy8gZG8gbm90aGluZworCisgICAgS2V5TGVuID0gc3RybGVuKGFyZyk7CisKKyAgICBzd2l0Y2ggKEtleUxlbikKKyAgICB7CisgICAgICAgIGNhc2UgNTogLy93ZXAgNDAgQXNjaWkgdHlwZQorICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVszXS5LZXlMZW4gPSBLZXlMZW47CisgICAgICAgICAgICBtZW1jcHkocEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVszXS5LZXksIGFyZywgS2V5TGVuKTsKKyAgICAgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXk0X1Byb2M6OihLZXk0PSVzIGFuZCB0eXBlPSVzKVxuIiwgYXJnLCAiQXNjaWkiKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxMDogLy93ZXAgNDAgSGV4IHR5cGUKKyAgICAgICAgICAgIGZvcihpPTA7IGkgPCBLZXlMZW47IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiggIWlzeGRpZ2l0KCooYXJnK2kpKSApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsgIC8vTm90IEhleCB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bM10uS2V5TGVuID0gS2V5TGVuIC8gMiA7CisgICAgICAgICAgICBBdG9IKGFyZywgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVszXS5LZXksIEtleUxlbiAvIDIpOworICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTRfUHJvYzo6KEtleTQ9JXMgYW5kIHR5cGU9JXMpXG4iLCBhcmcsICJIZXgiKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxMzogLy93ZXAgMTA0IEFzY2lpIHR5cGUKKyAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bM10uS2V5TGVuID0gS2V5TGVuOworICAgICAgICAgICAgbWVtY3B5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bM10uS2V5LCBhcmcsIEtleUxlbik7CisgICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTRfUHJvYzo6KEtleTQ9JXMgYW5kIHR5cGU9JXMpXG4iLCBhcmcsICJBc2NpaSIpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI2OiAvL3dlcCAxMDQgSGV4IHR5cGUKKyAgICAgICAgICAgIGZvcihpPTA7IGkgPCBLZXlMZW47IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiggIWlzeGRpZ2l0KCooYXJnK2kpKSApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsgIC8vTm90IEhleCB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bM10uS2V5TGVuID0gS2V5TGVuIC8gMiA7CisgICAgICAgICAgICBBdG9IKGFyZywgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVszXS5LZXksIEtleUxlbiAvIDIpOworICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDEyODsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXk0X1Byb2M6OihLZXk0PSVzIGFuZCB0eXBlPSVzKVxuIiwgYXJnLCAiSGV4IikpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6IC8vSW52YWxpZCBhcmd1bWVudAorICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTRfUHJvYzo6SW52YWxpZCBhcmd1bWVudCAoPSVzKVxuIiwgYXJnKSk7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bM10uQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOworCisgICAgLy8gU2V0IGtleXMgKGludG8gQVNJQykKKyAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpCisgICAgICAgIDsgICAvLyBub3Qgc3VwcG9ydAorICAgIGVsc2UgICAgLy8gT2xkIFdFUCBzdHVmZgorICAgIHsKKyAgICAgICAgQXNpY0FkZFNoYXJlZEtleUVudHJ5KHBBZGFwdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzNdLkNpcGhlckFsZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bM10uS2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgIH0KKworICAgIHJldHVybiBUUlVFOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBXUEEgUFNLIGtleQorICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UIFNldF9XUEFQU0tfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKQoreworICAgIFVDSEFSICAgICAgICAgICAgICAgICAgIGtleU1hdGVyaWFsWzQwXTsKKworICAgIGlmICgocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSAhPSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spICYmCisgICAgICAgIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlICE9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spICYmCisJICAgIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlICE9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmUpCisJCSkKKyAgICAgICAgcmV0dXJuIFRSVUU7ICAgIC8vIGRvIG5vdGhpbmcKKworICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9XUEFQU0tfUHJvYzo6KFdQQVBTSz0lcylcbiIsIGFyZykpOworCisgICAgTmRpc1plcm9NZW1vcnkoa2V5TWF0ZXJpYWwsIDQwKTsKKworICAgIGlmICgoc3RybGVuKGFyZykgPCA4KSB8fCAoc3RybGVuKGFyZykgPiA2NCkpCisgICAgeworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQgZmFpbGVkISEoV1BBUFNLPSVzKSwgV1BBUFNLIGtleS1zdHJpbmcgcmVxdWlyZWQgOCB+IDY0IGNoYXJhY3RlcnMgXG4iLCBhcmcpKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIGlmIChzdHJsZW4oYXJnKSA9PSA2NCkKKyAgICB7CisgICAgICAgIEF0b0goYXJnLCBrZXlNYXRlcmlhbCwgMzIpOworICAgICAgICBOZGlzTW92ZU1lbW9yeShwQWRhcHRlci0+U3RhQ2ZnLlBNSywga2V5TWF0ZXJpYWwsIDMyKTsKKworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBQYXNzd29yZEhhc2goKGNoYXIgKilhcmcsIHBBZGFwdGVyLT5NbG1lQXV4LlNzaWQsIHBBZGFwdGVyLT5NbG1lQXV4LlNzaWRMZW4sIGtleU1hdGVyaWFsKTsKKyAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkYXB0ZXItPlN0YUNmZy5QTUssIGtleU1hdGVyaWFsLCAzMik7CisgICAgfQorCisKKworICAgIGlmKHBBZGFwdGVyLT5TdGFDZmcuQnNzVHlwZSA9PSBCU1NfQURIT0MgJiYKKyAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmUpCisgICAgeworICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XcGFTdGF0ZSA9IFNTX05PVFVTRTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLy8gU3RhcnQgU1RBIHN1cHBsaWNhbnQgc3RhdGUgbWFjaGluZQorICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldwYVN0YXRlID0gU1NfU1RBUlQ7CisgICAgfQorCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IFBvd2VyIFNhdmluZyBtb2RlCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQgU2V0X1BTTW9kZV9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpCit7CisgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQnNzVHlwZSA9PSBCU1NfSU5GUkEpCisgICAgeworICAgICAgICBpZiAoKHN0cmNtcChhcmcsICJNYXhfUFNQIikgPT0gMCkgfHwKKwkJCShzdHJjbXAoYXJnLCAibWF4X3BzcCIpID09IDApIHx8CisJCQkoc3RyY21wKGFyZywgIk1BWF9QU1AiKSA9PSAwKSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gZG8gTk9UIHR1cm4gb24gUFNNIGJpdCBoZXJlLCB3YWl0IHVudGlsIE1sbWVDaGVja0ZvclBzbUNoYW5nZSgpCisgICAgICAgICAgICAvLyB0byBleGNsdWRlIGNlcnRhaW4gc2l0dWF0aW9ucy4KKyAgICAgICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLmJXaW5kb3dzQUNDQU1FbmFibGUgPT0gRkFMU0UpCisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XaW5kb3dzUG93ZXJNb2RlID0gTmRpczgwMl8xMVBvd2VyTW9kZU1BWF9QU1A7CisgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldpbmRvd3NCYXR0ZXJ5UG93ZXJNb2RlID0gTmRpczgwMl8xMVBvd2VyTW9kZU1BWF9QU1A7CisgICAgICAgICAgICBPUFNUQVRVU19TRVRfRkxBRyhwQWRhcHRlciwgZk9QX1NUQVRVU19SRUNFSVZFX0RUSU0pOworICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0TGlzdGVuQ291bnQgPSA1OworCisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoKHN0cmNtcChhcmcsICJGYXN0X1BTUCIpID09IDApIHx8CisJCQkJIChzdHJjbXAoYXJnLCAiZmFzdF9wc3AiKSA9PSAwKSB8fAorICAgICAgICAgICAgICAgICAoc3RyY21wKGFyZywgIkZBU1RfUFNQIikgPT0gMCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGRvIE5PVCB0dXJuIG9uIFBTTSBiaXQgaGVyZSwgd2FpdCB1bnRpbCBNbG1lQ2hlY2tGb3JQc21DaGFuZ2UoKQorICAgICAgICAgICAgLy8gdG8gZXhjbHVkZSBjZXJ0YWluIHNpdHVhdGlvbnMuCisgICAgICAgICAgICBPUFNUQVRVU19TRVRfRkxBRyhwQWRhcHRlciwgZk9QX1NUQVRVU19SRUNFSVZFX0RUSU0pOworICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuYldpbmRvd3NBQ0NBTUVuYWJsZSA9PSBGQUxTRSkKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldpbmRvd3NQb3dlck1vZGUgPSBOZGlzODAyXzExUG93ZXJNb2RlRmFzdF9QU1A7CisgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldpbmRvd3NCYXR0ZXJ5UG93ZXJNb2RlID0gTmRpczgwMl8xMVBvd2VyTW9kZUZhc3RfUFNQOworICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0TGlzdGVuQ291bnQgPSAzOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKChzdHJjbXAoYXJnLCAiTGVnYWN5X1BTUCIpID09IDApIHx8CisgICAgICAgICAgICAgICAgIChzdHJjbXAoYXJnLCAibGVnYWN5X3BzcCIpID09IDApIHx8CisgICAgICAgICAgICAgICAgIChzdHJjbXAoYXJnLCAiTEVHQUNZX1BTUCIpID09IDApKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBkbyBOT1QgdHVybiBvbiBQU00gYml0IGhlcmUsIHdhaXQgdW50aWwgTWxtZUNoZWNrRm9yUHNtQ2hhbmdlKCkKKyAgICAgICAgICAgIC8vIHRvIGV4Y2x1ZGUgY2VydGFpbiBzaXR1YXRpb25zLgorICAgICAgICAgICAgT1BTVEFUVVNfU0VUX0ZMQUcocEFkYXB0ZXIsIGZPUF9TVEFUVVNfUkVDRUlWRV9EVElNKTsKKyAgICAgICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLmJXaW5kb3dzQUNDQU1FbmFibGUgPT0gRkFMU0UpCisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XaW5kb3dzUG93ZXJNb2RlID0gTmRpczgwMl8xMVBvd2VyTW9kZUxlZ2FjeV9QU1A7CisgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldpbmRvd3NCYXR0ZXJ5UG93ZXJNb2RlID0gTmRpczgwMl8xMVBvd2VyTW9kZUxlZ2FjeV9QU1A7CisgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRMaXN0ZW5Db3VudCA9IDM7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvL0RlZmF1bHQgTmRpczgwMl8xMVBvd2VyTW9kZUNBTQorICAgICAgICAgICAgLy8gY2xlYXIgUFNNIGJpdCBpbW1lZGlhdGVseQorICAgICAgICAgICAgTWxtZVNldFBzbUJpdChwQWRhcHRlciwgUFdSX0FDVElWRSk7CisgICAgICAgICAgICBPUFNUQVRVU19TRVRfRkxBRyhwQWRhcHRlciwgZk9QX1NUQVRVU19SRUNFSVZFX0RUSU0pOworICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuYldpbmRvd3NBQ0NBTUVuYWJsZSA9PSBGQUxTRSkKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldpbmRvd3NQb3dlck1vZGUgPSBOZGlzODAyXzExUG93ZXJNb2RlQ0FNOworICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XaW5kb3dzQmF0dGVyeVBvd2VyTW9kZSA9IE5kaXM4MDJfMTFQb3dlck1vZGVDQU07CisgICAgICAgIH0KKworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfUFNNb2RlX1Byb2M6OihQU01vZGU9JWxkKVxuIiwgcEFkYXB0ZXItPlN0YUNmZy5XaW5kb3dzUG93ZXJNb2RlKSk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisKKyAgICByZXR1cm4gVFJVRTsKK30KKworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IFdwYVN1cHBvcnQgZmxhZy4KKyAgICBWYWx1ZToKKyAgICAgICAgMDogRHJpdmVyIGlnbm9yZSB3cGFfc3VwcGxpY2FudC4KKyAgICAgICAgMTogd3BhX3N1cHBsaWNhbnQgaW5pdGlhdGVzIHNjYW5uaW5nIGFuZCBBUCBzZWxlY3Rpb24uCisgICAgICAgIDI6IGRyaXZlciB0YWtlcyBjYXJlIG9mIHNjYW5uaW5nLCBBUCBzZWxlY3Rpb24sIGFuZCBJRUVFIDgwMi4xMSBhc3NvY2lhdGlvbiBwYXJhbWV0ZXJzLgorICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UIFNldF9XcGFfU3VwcG9ydCgKKyAgICBJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisKKyAgICBpZiAoIHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCkgPT0gMCkKKyAgICAgICAgcEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQID0gV1BBX1NVUFBMSUNBTlRfRElTQUJMRTsKKyAgICBlbHNlIGlmICggc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKSA9PSAxKQorICAgICAgICBwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgPSBXUEFfU1VQUExJQ0FOVF9FTkFCTEU7CisgICAgZWxzZSBpZiAoIHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCkgPT0gMikKKyAgICAgICAgcEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQID0gV1BBX1NVUFBMSUNBTlRfRU5BQkxFX1dJVEhfV0VCX1VJOworICAgIGVsc2UKKyAgICAgICAgcEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQID0gV1BBX1NVUFBMSUNBTlRfRElTQUJMRTsKKworICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9XcGFfU3VwcG9ydDo6KFdwYVN1cHBsaWNhbnRVUD0lZClcbiIsIHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCkpOworCisgICAgcmV0dXJuIFRSVUU7Cit9CisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCisjaWZkZWYgREJHCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFJlYWQgLyBXcml0ZSBNQUMKKyAgICBBcmd1bWVudHM6CisgICAgICAgIHBBZGFwdGVyICAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIG91ciBhZGFwdGVyCisgICAgICAgIHdycSAgICAgICAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpb2N0bCBhcmd1bWVudAorCisgICAgUmV0dXJuIFZhbHVlOgorICAgICAgICBOb25lCisKKyAgICBOb3RlOgorICAgICAgICBVc2FnZToKKyAgICAgICAgICAgICAgIDEuKSBpd3ByaXYgcmEwIG1hYyAwICAgICAgICA9PT4gcmVhZCBNQUMgd2hlcmUgQWRkcj0weDAKKyAgICAgICAgICAgICAgIDIuKSBpd3ByaXYgcmEwIG1hYyAwPTEyICAgICA9PT4gd3JpdGUgTUFDIHdoZXJlIEFkZHI9MHgwLCB2YWx1ZT0xMgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBSVE1QSW9jdGxNQUMoCisJSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKKwlJTglzdHJ1Y3QgaXdyZXEJKndycSkKK3sKKwlDSEFSCQkJCSp0aGlzX2NoYXI7CisJQ0hBUgkJCQkqdmFsdWU7CisJSU5UCQkJCQlqID0gMCwgayA9IDA7CisJQ0hBUgkJCQltc2dbMTAyNF07CisJQ0hBUgkJCQlhcmdbMjU1XTsKKwlVTE9ORwkJCQltYWNBZGRyID0gMDsKKwlVQ0hBUgkJCQl0ZW1wWzE2XSwgdGVtcDJbMTZdOworCVVJTlQzMgkJCQltYWNWYWx1ZSA9IDA7CisJSU5UCQkJCQlTdGF0dXM7CisKKworCW1lbXNldChtc2csIDB4MDAsIDEwMjQpOworCWlmICh3cnEtPnUuZGF0YS5sZW5ndGggPiAxKSAvL05vIHBhcmFtZXRlcnMuCisJeworCSAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcihhcmcsIHdycS0+dS5kYXRhLnBvaW50ZXIsICh3cnEtPnUuZGF0YS5sZW5ndGggPiAyNTUpID8gMjU1IDogd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJc3ByaW50Zihtc2csICJcbiIpOworCisJCS8vUGFyc2luZyBSZWFkIG9yIFdyaXRlCisJICAgIHRoaXNfY2hhciA9IGFyZzsKKwkJaWYgKCEqdGhpc19jaGFyKQorCQkJZ290byBuZXh0OworCisJCWlmICgodmFsdWUgPSBydHN0cmNocih0aGlzX2NoYXIsICc9JykpICE9IE5VTEwpCisJCQkqdmFsdWUrKyA9IDA7CisKKwkJaWYgKCF2YWx1ZSB8fCAhKnZhbHVlKQorCQl7IC8vUmVhZAorCQkJLy8gU2FuaXR5IGNoZWNrCisJCQlpZihzdHJsZW4odGhpc19jaGFyKSA+IDQpCisJCQkJZ290byBuZXh0OworCisJCQlqID0gc3RybGVuKHRoaXNfY2hhcik7CisJCQl3aGlsZShqLS0gPiAwKQorCQkJeworCQkJCWlmKHRoaXNfY2hhcltqXSA+ICdmJyB8fCB0aGlzX2NoYXJbal0gPCAnMCcpCisJCQkJCXJldHVybjsKKwkJCX0KKworCQkJLy8gTWFjIEFkZHIKKwkJCWsgPSBqID0gc3RybGVuKHRoaXNfY2hhcik7CisJCQl3aGlsZShqLS0gPiAwKQorCQkJeworCQkJCXRoaXNfY2hhcls0LWsral0gPSB0aGlzX2NoYXJbal07CisJCQl9CisKKwkJCXdoaWxlKGsgPCA0KQorCQkJCXRoaXNfY2hhclszLWsrK109JzAnOworCQkJdGhpc19jaGFyWzRdPSdcMCc7CisKKwkJCWlmKHN0cmxlbih0aGlzX2NoYXIpID09IDQpCisJCQl7CisJCQkJQXRvSCh0aGlzX2NoYXIsIHRlbXAsIDIpOworCQkJCW1hY0FkZHIgPSAqdGVtcCoyNTYgKyB0ZW1wWzFdOworCQkJCWlmIChtYWNBZGRyIDwgMHhGRkZGKQorCQkJCXsKKwkJCQkJUlRNUF9JT19SRUFEMzIocEFkYXB0ZXIsIG1hY0FkZHIsICZtYWNWYWx1ZSk7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1hY0FkZHI9JWx4LCBNYWNWYWx1ZT0leFxuIiwgbWFjQWRkciwgbWFjVmFsdWUpKTsKKwkJCQkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksICJbMHglMDhsWF06JTA4WCAgIiwgbWFjQWRkciAsIG1hY1ZhbHVlKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsvL0ludmFsaWQgcGFyYW1ldGVzLCBzbyBkZWZhdWx0IHByaW50ayBhbGwgYmJwCisJCQkJCWdvdG8gbmV4dDsKKwkJCQl9CisJCQl9CisJCX0KKwkJZWxzZQorCQl7IC8vV3JpdGUKKwkJCW1lbWNweSgmdGVtcDIsIHZhbHVlLCBzdHJsZW4odmFsdWUpKTsKKwkJCXRlbXAyW3N0cmxlbih2YWx1ZSldID0gJ1wwJzsKKworCQkJLy8gU2FuaXR5IGNoZWNrCisJCQlpZigoc3RybGVuKHRoaXNfY2hhcikgPiA0KSB8fCBzdHJsZW4odGVtcDIpID4gOCkKKwkJCQlnb3RvIG5leHQ7CisKKwkJCWogPSBzdHJsZW4odGhpc19jaGFyKTsKKwkJCXdoaWxlKGotLSA+IDApCisJCQl7CisJCQkJaWYodGhpc19jaGFyW2pdID4gJ2YnIHx8IHRoaXNfY2hhcltqXSA8ICcwJykKKwkJCQkJcmV0dXJuOworCQkJfQorCisJCQlqID0gc3RybGVuKHRlbXAyKTsKKwkJCXdoaWxlKGotLSA+IDApCisJCQl7CisJCQkJaWYodGVtcDJbal0gPiAnZicgfHwgdGVtcDJbal0gPCAnMCcpCisJCQkJCXJldHVybjsKKwkJCX0KKworCQkJLy9NQUMgQWRkcgorCQkJayA9IGogPSBzdHJsZW4odGhpc19jaGFyKTsKKwkJCXdoaWxlKGotLSA+IDApCisJCQl7CisJCQkJdGhpc19jaGFyWzQtaytqXSA9IHRoaXNfY2hhcltqXTsKKwkJCX0KKworCQkJd2hpbGUoayA8IDQpCisJCQkJdGhpc19jaGFyWzMtaysrXT0nMCc7CisJCQl0aGlzX2NoYXJbNF09J1wwJzsKKworCQkJLy9NQUMgdmFsdWUKKwkJCWsgPSBqID0gc3RybGVuKHRlbXAyKTsKKwkJCXdoaWxlKGotLSA+IDApCisJCQl7CisJCQkJdGVtcDJbOC1rK2pdID0gdGVtcDJbal07CisJCQl9CisKKwkJCXdoaWxlKGsgPCA4KQorCQkJCXRlbXAyWzctaysrXT0nMCc7CisJCQl0ZW1wMls4XT0nXDAnOworCisJCQl7CisJCQkJQXRvSCh0aGlzX2NoYXIsIHRlbXAsIDIpOworCQkJCW1hY0FkZHIgPSAqdGVtcCoyNTYgKyB0ZW1wWzFdOworCisJCQkJQXRvSCh0ZW1wMiwgdGVtcCwgNCk7CisJCQkJbWFjVmFsdWUgPSAqdGVtcCoyNTYqMjU2KjI1NiArIHRlbXBbMV0qMjU2KjI1NiArIHRlbXBbMl0qMjU2ICsgdGVtcFszXTsKKworCQkJCS8vIGRlYnVnIG1vZGUKKwkJCQlpZiAobWFjQWRkciA9PSAoSFdfREVCVUdfU0VUVElOR19CQVNFICsgNCkpCisJCQkJeworCQkJCQkvLyAweDJiZjQ6IGJ5dGUwIG5vbi16ZXJvOiBlbmFibGUgUjE3IHR1bmluZywgMDogZGlzYWJsZSBSMTcgdHVuaW5nCisgICAgICAgICAgICAgICAgICAgIGlmIChtYWNWYWx1ZSAmIDB4MDAwMDAwZmYpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5CYnBUdW5pbmcuYkVuYWJsZSA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoInR1cm4gb24gUjE3IHR1bmluZ1xuIikpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgUjY2OworICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkJicFR1bmluZy5iRW5hYmxlID0gRkFMU0U7CisgICAgICAgICAgICAgICAgICAgICAgICBSNjYgPSAweDI2ICsgR0VUX0xOQV9HQUlOKHBBZGFwdGVyKTsKKyNpZmRlZiBSQUxJTktfQVRFCisJCQkJCQlpZiAoQVRFX09OKHBBZGFwdGVyKSkKKwkJCQkJCXsKKwkJCQkJCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkYXB0ZXIsIEJCUF9SNjYsICgweDI2ICsgR0VUX0xOQV9HQUlOKHBBZGFwdGVyKSkpOworCQkJCQkJfQorCQkJCQkJZWxzZQorI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKwkJCQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkYXB0ZXIsIEJCUF9SNjYsICgweDI2ICsgR0VUX0xOQV9HQUlOKHBBZGFwdGVyKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJ0dXJuIG9mZiBSMTcgdHVuaW5nLCByZXN0b3JlIHRvIDB4JTAyeFxuIiwgUjY2KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKwkJCQkJcmV0dXJuOworCQkJCX0KKworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1hY0FkZHI9JTAybHgsIE1hY1ZhbHVlPTB4JXhcbiIsIG1hY0FkZHIsIG1hY1ZhbHVlKSk7CisKKwkJCQlSVE1QX0lPX1dSSVRFMzIocEFkYXB0ZXIsIG1hY0FkZHIsIG1hY1ZhbHVlKTsKKwkJCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwgIlsweCUwOGxYXTolMDhYICAiLCBtYWNBZGRyLCBtYWNWYWx1ZSk7CisJCQl9CisJCX0KKwl9CituZXh0OgorCWlmKHN0cmxlbihtc2cpID09IDEpCisJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCAiPT09PkVycm9yIGNvbW1hbmQgZm9ybWF0ISIpOworCisJLy8gQ29weSB0aGUgaW5mb3JtYXRpb24gaW50byB0aGUgdXNlciBidWZmZXIKKwl3cnEtPnUuZGF0YS5sZW5ndGggPSBzdHJsZW4obXNnKTsKKwlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgbXNnLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPD09UlRNUElvY3RsTUFDXG5cbiIpKTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBSZWFkIC8gV3JpdGUgRTJQUk9NCisgICAgQXJndW1lbnRzOgorICAgICAgICBwQWRhcHRlciAgICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byBvdXIgYWRhcHRlcgorICAgICAgICB3cnEgICAgICAgICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW9jdGwgYXJndW1lbnQKKworICAgIFJldHVybiBWYWx1ZToKKyAgICAgICAgTm9uZQorCisgICAgTm90ZToKKyAgICAgICAgVXNhZ2U6CisgICAgICAgICAgICAgICAxLikgaXdwcml2IHJhMCBlMnAgMCAgICAgCT09PiByZWFkIEUyUFJPTSB3aGVyZSBBZGRyPTB4MAorICAgICAgICAgICAgICAgMi4pIGl3cHJpdiByYTAgZTJwIDA9MTIzNCAgICA9PT4gd3JpdGUgRTJQUk9NIHdoZXJlIEFkZHI9MHgwLCB2YWx1ZT0xMjM0CisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIFJUTVBJb2N0bEUyUFJPTSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAorCUlOCXN0cnVjdCBpd3JlcQkqd3JxKQoreworCUNIQVIJCQkJKnRoaXNfY2hhcjsKKwlDSEFSCQkJCSp2YWx1ZTsKKwlJTlQJCQkJCWogPSAwLCBrID0gMDsKKwlDSEFSCQkJCW1zZ1sxMDI0XTsKKwlDSEFSCQkJCWFyZ1syNTVdOworCVVTSE9SVAkJCQllZXBBZGRyID0gMDsKKwlVQ0hBUgkJCQl0ZW1wWzE2XSwgdGVtcDJbMTZdOworCVVTSE9SVAkJCQllZXBWYWx1ZTsKKwlpbnQJCQkJCVN0YXR1czsKKworCisJbWVtc2V0KG1zZywgMHgwMCwgMTAyNCk7CisJaWYgKHdycS0+dS5kYXRhLmxlbmd0aCA+IDEpIC8vTm8gcGFyYW1ldGVycy4KKwl7CisJICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKGFyZywgd3JxLT51LmRhdGEucG9pbnRlciwgKHdycS0+dS5kYXRhLmxlbmd0aCA+IDI1NSkgPyAyNTUgOiB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQlzcHJpbnRmKG1zZywgIlxuIik7CisKKwkgICAgLy9QYXJzaW5nIFJlYWQgb3IgV3JpdGUKKwkJdGhpc19jaGFyID0gYXJnOworCisKKwkJaWYgKCEqdGhpc19jaGFyKQorCQkJZ290byBuZXh0OworCisJCWlmICgodmFsdWUgPSBydHN0cmNocih0aGlzX2NoYXIsICc9JykpICE9IE5VTEwpCisJCQkqdmFsdWUrKyA9IDA7CisKKwkJaWYgKCF2YWx1ZSB8fCAhKnZhbHVlKQorCQl7IC8vUmVhZAorCisJCQkvLyBTYW5pdHkgY2hlY2sKKwkJCWlmKHN0cmxlbih0aGlzX2NoYXIpID4gNCkKKwkJCQlnb3RvIG5leHQ7CisKKwkJCWogPSBzdHJsZW4odGhpc19jaGFyKTsKKwkJCXdoaWxlKGotLSA+IDApCisJCQl7CisJCQkJaWYodGhpc19jaGFyW2pdID4gJ2YnIHx8IHRoaXNfY2hhcltqXSA8ICcwJykKKwkJCQkJcmV0dXJuOworCQkJfQorCisJCQkvLyBFMlBST00gYWRkcgorCQkJayA9IGogPSBzdHJsZW4odGhpc19jaGFyKTsKKwkJCXdoaWxlKGotLSA+IDApCisJCQl7CisJCQkJdGhpc19jaGFyWzQtaytqXSA9IHRoaXNfY2hhcltqXTsKKwkJCX0KKworCQkJd2hpbGUoayA8IDQpCisJCQkJdGhpc19jaGFyWzMtaysrXT0nMCc7CisJCQl0aGlzX2NoYXJbNF09J1wwJzsKKworCQkJaWYoc3RybGVuKHRoaXNfY2hhcikgPT0gNCkKKwkJCXsKKwkJCQlBdG9IKHRoaXNfY2hhciwgdGVtcCwgMik7CisJCQkJZWVwQWRkciA9ICp0ZW1wKjI1NiArIHRlbXBbMV07CisJCQkJaWYgKGVlcEFkZHIgPCAweEZGRkYpCisJCQkJeworCQkJCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWRhcHRlciwgZWVwQWRkciwgZWVwVmFsdWUpOworCQkJCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwgIlsweCUwNFhdOjB4JTA0WCAgIiwgZWVwQWRkciAsIGVlcFZhbHVlKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsvL0ludmFsaWQgcGFyYW1ldGVzLCBzbyBkZWZhdWx0IHByaW50ayBhbGwgYmJwCisJCQkJCWdvdG8gbmV4dDsKKwkJCQl9CisJCQl9CisJCX0KKwkJZWxzZQorCQl7IC8vV3JpdGUKKwkJCW1lbWNweSgmdGVtcDIsIHZhbHVlLCBzdHJsZW4odmFsdWUpKTsKKwkJCXRlbXAyW3N0cmxlbih2YWx1ZSldID0gJ1wwJzsKKworCQkJLy8gU2FuaXR5IGNoZWNrCisJCQlpZigoc3RybGVuKHRoaXNfY2hhcikgPiA0KSB8fCBzdHJsZW4odGVtcDIpID4gOCkKKwkJCQlnb3RvIG5leHQ7CisKKwkJCWogPSBzdHJsZW4odGhpc19jaGFyKTsKKwkJCXdoaWxlKGotLSA+IDApCisJCQl7CisJCQkJaWYodGhpc19jaGFyW2pdID4gJ2YnIHx8IHRoaXNfY2hhcltqXSA8ICcwJykKKwkJCQkJcmV0dXJuOworCQkJfQorCQkJaiA9IHN0cmxlbih0ZW1wMik7CisJCQl3aGlsZShqLS0gPiAwKQorCQkJeworCQkJCWlmKHRlbXAyW2pdID4gJ2YnIHx8IHRlbXAyW2pdIDwgJzAnKQorCQkJCQlyZXR1cm47CisJCQl9CisKKwkJCS8vTUFDIEFkZHIKKwkJCWsgPSBqID0gc3RybGVuKHRoaXNfY2hhcik7CisJCQl3aGlsZShqLS0gPiAwKQorCQkJeworCQkJCXRoaXNfY2hhcls0LWsral0gPSB0aGlzX2NoYXJbal07CisJCQl9CisKKwkJCXdoaWxlKGsgPCA0KQorCQkJCXRoaXNfY2hhclszLWsrK109JzAnOworCQkJdGhpc19jaGFyWzRdPSdcMCc7CisKKwkJCS8vTUFDIHZhbHVlCisJCQlrID0gaiA9IHN0cmxlbih0ZW1wMik7CisJCQl3aGlsZShqLS0gPiAwKQorCQkJeworCQkJCXRlbXAyWzQtaytqXSA9IHRlbXAyW2pdOworCQkJfQorCisJCQl3aGlsZShrIDwgNCkKKwkJCQl0ZW1wMlszLWsrK109JzAnOworCQkJdGVtcDJbNF09J1wwJzsKKworCQkJQXRvSCh0aGlzX2NoYXIsIHRlbXAsIDIpOworCQkJZWVwQWRkciA9ICp0ZW1wKjI1NiArIHRlbXBbMV07CisKKwkJCUF0b0godGVtcDIsIHRlbXAsIDIpOworCQkJZWVwVmFsdWUgPSAqdGVtcCoyNTYgKyB0ZW1wWzFdOworCisJCQlSVDI4eHhfRUVQUk9NX1dSSVRFMTYocEFkYXB0ZXIsIGVlcEFkZHIsIGVlcFZhbHVlKTsKKwkJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCAiWzB4JTAyWF06JTAyWCAgIiwgZWVwQWRkciwgZWVwVmFsdWUpOworCQl9CisJfQorbmV4dDoKKwlpZihzdHJsZW4obXNnKSA9PSAxKQorCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwgIj09PT5FcnJvciBjb21tYW5kIGZvcm1hdCEiKTsKKworCisJLy8gQ29weSB0aGUgaW5mb3JtYXRpb24gaW50byB0aGUgdXNlciBidWZmZXIKKwl3cnEtPnUuZGF0YS5sZW5ndGggPSBzdHJsZW4obXNnKTsKKwlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgbXNnLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPD09UlRNUElvY3RsRTJQUk9NXG4iKSk7Cit9CisjZW5kaWYgLy8gREJHIC8vCisKKworCisKK0lOVCBTZXRfVEduV2lmaVRlc3RfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZykKK3sKKyAgICBpZiAoc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKSA9PSAwKQorICAgICAgICBwQWQtPlN0YUNmZy5iVEduV2lmaVRlc3QgPSBGQUxTRTsKKyAgICBlbHNlCisgICAgICAgIHBBZC0+U3RhQ2ZnLmJUR25XaWZpVGVzdCA9IFRSVUU7CisKKyAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJRiBTZXRfVEduV2lmaVRlc3RfUHJvYzo6KGJUR25XaWZpVGVzdD0lZClcbiIsIHBBZC0+U3RhQ2ZnLmJUR25XaWZpVGVzdCkpOworCXJldHVybiBUUlVFOworfQorCitJTlQgU2V0X0xvbmdSZXRyeUxpbWl0X1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJVFhfUlRZX0NGR19TVFJVQwl0eF9ydHlfY2ZnOworCVVDSEFSCQkJCUxvbmdSZXRyeUxpbWl0ID0gKFVDSEFSKXNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisKKwlSVE1QX0lPX1JFQUQzMihwQWRhcHRlciwgVFhfUlRZX0NGRywgJnR4X3J0eV9jZmcud29yZCk7CisJdHhfcnR5X2NmZy5maWVsZC5Mb25nUnR5TGltaXQgPSBMb25nUmV0cnlMaW1pdDsKKwlSVE1QX0lPX1dSSVRFMzIocEFkYXB0ZXIsIFRYX1JUWV9DRkcsIHR4X3J0eV9jZmcud29yZCk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSUYgU2V0X0xvbmdSZXRyeUxpbWl0X1Byb2M6Oih0eF9ydHlfY2ZnPTB4JXgpXG4iLCB0eF9ydHlfY2ZnLndvcmQpKTsKKwlyZXR1cm4gVFJVRTsKK30KKworSU5UIFNldF9TaG9ydFJldHJ5TGltaXRfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlUWF9SVFlfQ0ZHX1NUUlVDCXR4X3J0eV9jZmc7CisJVUNIQVIJCQkJU2hvcnRSZXRyeUxpbWl0ID0gKFVDSEFSKXNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisKKwlSVE1QX0lPX1JFQUQzMihwQWRhcHRlciwgVFhfUlRZX0NGRywgJnR4X3J0eV9jZmcud29yZCk7CisJdHhfcnR5X2NmZy5maWVsZC5TaG9ydFJ0eUxpbWl0ID0gU2hvcnRSZXRyeUxpbWl0OworCVJUTVBfSU9fV1JJVEUzMihwQWRhcHRlciwgVFhfUlRZX0NGRywgdHhfcnR5X2NmZy53b3JkKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJRiBTZXRfU2hvcnRSZXRyeUxpbWl0X1Byb2M6Oih0eF9ydHlfY2ZnPTB4JXgpXG4iLCB0eF9ydHlfY2ZnLndvcmQpKTsKKwlyZXR1cm4gVFJVRTsKK30KKworI2lmZGVmIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QKK0lOVCBTZXRfSWVlZTgwMjExZENsaWVudE1vZGVfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKQoreworICAgIGlmIChzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApID09IDApCisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuSUVFRTgwMjExZENsaWVudE1vZGUgPSBSdDgwMl8xMV9EX05vbmU7CisgICAgZWxzZSBpZiAoc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKSA9PSAxKQorICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLklFRUU4MDIxMWRDbGllbnRNb2RlID0gUnQ4MDJfMTFfRF9GbGV4aWJsZTsKKyAgICBlbHNlIGlmIChzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApID09IDIpCisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuSUVFRTgwMjExZENsaWVudE1vZGUgPSBSdDgwMl8xMV9EX1N0cmljdDsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9JZWVlODAyZE1vZGVfUHJvYzo6KElFRUVFMDIxMWRNb2RlPSVkKVxuIiwgcEFkYXB0ZXItPlN0YUNmZy5JRUVFODAyMTFkQ2xpZW50TW9kZSkpOworICAgIHJldHVybiBUUlVFOworfQorI2VuZGlmIC8vIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QgLy8KKworI2lmZGVmIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQKK0lOVCBTZXRfQ2FycmllckRldGVjdF9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKQoreworICAgIGlmIChzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApID09IDApCisgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLkNhcnJpZXJEZXRlY3QuRW5hYmxlID0gRkFMU0U7CisgICAgZWxzZQorICAgICAgICBwQWQtPkNvbW1vbkNmZy5DYXJyaWVyRGV0ZWN0LkVuYWJsZSA9IFRSVUU7CisKKyAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJRiBTZXRfQ2FycmllckRldGVjdF9Qcm9jOjooQ2FycmllckRldGVjdC5FbmFibGU9JWQpXG4iLCBwQWQtPkNvbW1vbkNmZy5DYXJyaWVyRGV0ZWN0LkVuYWJsZSkpOworCXJldHVybiBUUlVFOworfQorI2VuZGlmIC8vIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQgLy8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC93cGEuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvd3BhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODhjN2M4YgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvd3BhLmgKQEAgLTAsMCArMSwzNTYgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJTW9kdWxlIE5hbWU6CisJd3BhLmgKKworCUFic3RyYWN0OgorCisJUmV2aXNpb24gSGlzdG9yeToKKwlXaG8JCQlXaGVuCQkJV2hhdAorCS0tLS0tLS0tCS0tLS0tLS0tLS0JCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlOYW1lCQlEYXRlCQkJTW9kaWZpY2F0aW9uIGxvZ3MKKyovCisKKyNpZm5kZWYJX19XUEFfSF9fCisjZGVmaW5lCV9fV1BBX0hfXworCisvLyBFQVBPTCBLZXkgZGVzY3JpcHRlciBmcmFtZSBmb3JtYXQgcmVsYXRlZCBsZW5ndGgKKyNkZWZpbmUgTEVOX0tFWV9ERVNDX05PTkNFCQkJMzIKKyNkZWZpbmUgTEVOX0tFWV9ERVNDX0lWCQkJCTE2CisjZGVmaW5lIExFTl9LRVlfREVTQ19SU0MJCQk4CisjZGVmaW5lIExFTl9LRVlfREVTQ19JRAkJCQk4CisjZGVmaW5lIExFTl9LRVlfREVTQ19SRVBMQVkJCQk4CisjZGVmaW5lIExFTl9LRVlfREVTQ19NSUMJCQkxNgorCisvLyBUaGUgbGVuZ3RoIGlzIHRoZSBFQVBvTC1LZXkgZnJhbWUgZXhjZXB0IGtleSBkYXRhIGZpZWxkLgorLy8gUGxlYXNlIHJlZmVyIHRvIDgwMi4xMWktMjAwNCAsRmlndXJlIDQzdSBpbiBwLjc4CisjZGVmaW5lIExFTl9FQVBPTF9LRVlfTVNHCQkJKHNpemVvZihLRVlfREVTQ1JJUFRFUikgLSBNQVhfTEVOX09GX1JTTklFKQorCisvLyBFQVAgQ29kZSBUeXBlLgorI2RlZmluZSBFQVBfQ09ERV9SRVFVRVNUCTEKKyNkZWZpbmUgRUFQX0NPREVfUkVTUE9OU0UJMgorI2RlZmluZSBFQVBfQ09ERV9TVUNDRVNTICAgIDMKKyNkZWZpbmUgRUFQX0NPREVfRkFJTFVSRSAgICA0CisKKy8vIEVBUE9MIGZyYW1lIFByb3RvY29sIFZlcnNpb24KKyNkZWZpbmUJRUFQT0xfVkVSCQkJCQkxCisjZGVmaW5lCUVBUE9MX1ZFUjIJCQkJCTIKKworLy8gRUFQT0wtS0VZIERlc2NyaXB0b3IgVHlwZQorI2RlZmluZQlXUEExX0tFWV9ERVNDCQkJCTB4ZmUKKyNkZWZpbmUgV1BBMl9LRVlfREVTQyAgICAgICAgICAgICAgIDB4MDIKKworLy8gS2V5IERlc2NyaXB0b3IgVmVyc2lvbiBvZiBLZXkgSW5mb3JtYXRpb24KKyNkZWZpbmUJREVTQ19UWVBFX1RLSVAJCQkJMQorI2RlZmluZQlERVNDX1RZUEVfQUVTCQkJCTIKKyNkZWZpbmUgREVTQ19UWVBFX01FU0gJCQkJMworCisjZGVmaW5lIExFTl9NU0cxXzJXQVkgICAgICAgICAgICAgICAweDdmCisjZGVmaW5lIE1BWF9MRU5fT0ZfRUFQX0hTICAgICAgICAgICAyNTYKKworI2RlZmluZSBMRU5fTUFTVEVSX0tFWQkJCQkzMgorCisvLyBFQVBPTCBFSywgTUsKKyNkZWZpbmUgTEVOX0VBUF9FSwkJCQkJMTYKKyNkZWZpbmUgTEVOX0VBUF9NSUNLCQkJCTE2CisjZGVmaW5lIExFTl9FQVBfS0VZCQkJCQkoKExFTl9FQVBfRUspKyhMRU5fRUFQX01JQ0spKQorLy8gVEtJUCBrZXkgcmVsYXRlZAorI2RlZmluZSBMRU5fUE1LSUQJCQkJCTE2CisjZGVmaW5lIExFTl9US0lQX0VLCQkJCQkxNgorI2RlZmluZSBMRU5fVEtJUF9SWE1JQ0sJCQkJOAorI2RlZmluZSBMRU5fVEtJUF9UWE1JQ0sJCQkJOAorI2RlZmluZSBMRU5fQUVTX0VLCQkJCQkxNgorI2RlZmluZSBMRU5fQUVTX0tFWQkJCQkJTEVOX0FFU19FSworI2RlZmluZSBMRU5fVEtJUF9LRVkJCQkJKChMRU5fVEtJUF9FSykrKExFTl9US0lQX1JYTUlDSykrKExFTl9US0lQX1RYTUlDSykpCisjZGVmaW5lIFRLSVBfQVBfVFhNSUNLX09GRlNFVAkJKChMRU5fRUFQX0tFWSkrKExFTl9US0lQX0VLKSkKKyNkZWZpbmUgVEtJUF9BUF9SWE1JQ0tfT0ZGU0VUCQkoVEtJUF9BUF9UWE1JQ0tfT0ZGU0VUK0xFTl9US0lQX1RYTUlDSykKKyNkZWZpbmUgVEtJUF9HVEtfTEVOR1RICQkJCSgoTEVOX1RLSVBfRUspKyhMRU5fVEtJUF9SWE1JQ0spKyhMRU5fVEtJUF9UWE1JQ0spKQorI2RlZmluZSBMRU5fUFRLCQkJCQkJKChMRU5fRUFQX0tFWSkrKExFTl9US0lQX0tFWSkpCisKKy8vIFJTTiBJRSBMZW5ndGggZGVmaW5pdGlvbgorI2RlZmluZSBNQVhfTEVOX09GX1JTTklFICAgICAgICAgCTkwCisjZGVmaW5lIE1JTl9MRU5fT0ZfUlNOSUUgICAgICAgICAJOAorCisvL0VBUCBQYWNrZXQgVHlwZQorI2RlZmluZQlFQVBQYWNrZXQJCTAKKyNkZWZpbmUJRUFQT0xTdGFydAkJMQorI2RlZmluZQlFQVBPTExvZ29mZgkJMgorI2RlZmluZQlFQVBPTEtleQkJMworI2RlZmluZQlFQVBPTEFTRkFsZXJ0CTQKKyNkZWZpbmUJRUFQVHR5cGVNYXgJCTUKKworI2RlZmluZQlFQVBPTF9NU0dfSU5WQUxJRAkwCisjZGVmaW5lCUVBUE9MX1BBSVJfTVNHXzEJMQorI2RlZmluZQlFQVBPTF9QQUlSX01TR18yCTIKKyNkZWZpbmUJRUFQT0xfUEFJUl9NU0dfMwkzCisjZGVmaW5lCUVBUE9MX1BBSVJfTVNHXzQJNAorI2RlZmluZQlFQVBPTF9HUk9VUF9NU0dfMQk1CisjZGVmaW5lCUVBUE9MX0dST1VQX01TR18yCTYKKworI2RlZmluZSBQQUlSV0lTRUtFWQkJCQkJMQorI2RlZmluZSBHUk9VUEtFWQkJCQkJMAorCisvLyBSZXRyeSB0aW1lciBjb3VudGVyIGluaXRpYWwgdmFsdWUKKyNkZWZpbmUgUEVFUl9NU0cxX1JFVFJZX1RJTUVSX0NUUiAgICAgICAgICAgMAorI2RlZmluZSBQRUVSX01TRzNfUkVUUllfVElNRVJfQ1RSICAgICAgICAgICAxMAorI2RlZmluZSBHUk9VUF9NU0cxX1JFVFJZX1RJTUVSX0NUUiAgICAgICAgICAyMAorCisKKyNkZWZpbmUgRUFQT0xfU1RBUlRfRElTQUJMRQkJCQkJMAorI2RlZmluZSBFQVBPTF9TVEFSVF9QU0sJCQkJCQkxCisjZGVmaW5lIEVBUE9MX1NUQVJUXzFYCQkJCQkJMgorCisjZGVmaW5lIE1JWF9DSVBIRVJfV1BBX1RLSVBfT04oeCkgICAgICAgKCgoeCkgJiAweDA4KSAhPSAwKQorI2RlZmluZSBNSVhfQ0lQSEVSX1dQQV9BRVNfT04oeCkgICAgICAgICgoKHgpICYgMHgwNCkgIT0gMCkKKyNkZWZpbmUgTUlYX0NJUEhFUl9XUEEyX1RLSVBfT04oeCkgICAgICAoKCh4KSAmIDB4MDIpICE9IDApCisjZGVmaW5lIE1JWF9DSVBIRVJfV1BBMl9BRVNfT04oeCkgICAgICAgKCgoeCkgJiAweDAxKSAhPSAwKQorCisjZGVmaW5lIFJPVU5EX1VQKF9feCwgX195KSBcCisJKCgoVUxPTkcpKChfX3gpKygoX195KS0xKSkpICYgKChVTE9ORyl+KChfX3kpLTEpKSkKKworI2RlZmluZQlBRERfT05FX1RvXzY0QklUX1ZBUihfVikJCVwKK3sJCQkJCQkJCQkJXAorCVVDSEFSCWNudCA9IExFTl9LRVlfREVTQ19SRVBMQVk7CVwKKwlkbwkJCQkJCQkJCVwKKwl7CQkJCQkJCQkJXAorCQljbnQtLTsJCQkJCQkJXAorCQlfVltjbnRdKys7CQkJCQkJXAorCQlpZiAoY250ID09IDApCQkJCQlcCisJCQlicmVhazsJCQkJCQlcCisJfXdoaWxlIChfVltjbnRdID09IDApOwkJCQlcCit9CisKKyNkZWZpbmUgSVNfV1BBX0NBUEFCSUxJVFkoYSkgICAgICAgKCgoYSkgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKSAmJiAoKGEpIDw9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTFQU0tXUEEyUFNLKSkKKworLy8gRUFQT0wgS2V5IEluZm9ybWF0aW9uIGRlZmluaXRpb24gd2l0aGluIEtleSBkZXNjcmlwdG9yIGZvcm1hdAordHlwZWRlZglzdHJ1Y3QgUEFDS0VEIF9LRVlfSU5GTworeworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwlVQ0hBUglLZXlBY2s6MTsKKyAgICBVQ0hBUglJbnN0YWxsOjE7CisgICAgVUNIQVIJS2V5SW5kZXg6MjsKKyAgICBVQ0hBUglLZXlUeXBlOjE7CisgICAgVUNIQVIJS2V5RGVzY1ZlcjozOworICAgIFVDSEFSCVJzdmQ6MzsKKyAgICBVQ0hBUglFS0RfREw6MTsJCS8vIEVLRCBmb3IgQVA7IERMIGZvciBTVEEKKyAgICBVQ0hBUglSZXF1ZXN0OjE7CisgICAgVUNIQVIJRXJyb3I6MTsKKyAgICBVQ0hBUglTZWN1cmU6MTsKKyAgICBVQ0hBUglLZXlNaWM6MTsKKyNlbHNlCisJVUNIQVIJS2V5TWljOjE7CisJVUNIQVIJU2VjdXJlOjE7CisJVUNIQVIJRXJyb3I6MTsKKwlVQ0hBUglSZXF1ZXN0OjE7CisJVUNIQVIJRUtEX0RMOjE7ICAgICAgIC8vIEVLRCBmb3IgQVA7IERMIGZvciBTVEEKKwlVQ0hBUglSc3ZkOjM7CisJVUNIQVIJS2V5RGVzY1ZlcjozOworCVVDSEFSCUtleVR5cGU6MTsKKwlVQ0hBUglLZXlJbmRleDoyOworCVVDSEFSCUluc3RhbGw6MTsKKwlVQ0hBUglLZXlBY2s6MTsKKyNlbmRpZgorfQlLRVlfSU5GTywgKlBLRVlfSU5GTzsKKworLy8gRUFQT0wgS2V5IGRlc2NyaXB0b3IgZm9ybWF0Cit0eXBlZGVmCXN0cnVjdCBQQUNLRUQgX0tFWV9ERVNDUklQVEVSCit7CisJVUNIQVIJCVR5cGU7CisJS0VZX0lORk8JS2V5SW5mbzsKKwlVQ0hBUgkJS2V5TGVuZ3RoWzJdOworCVVDSEFSCQlSZXBsYXlDb3VudGVyW0xFTl9LRVlfREVTQ19SRVBMQVldOworCVVDSEFSCQlLZXlOb25jZVtMRU5fS0VZX0RFU0NfTk9OQ0VdOworCVVDSEFSCQlLZXlJdltMRU5fS0VZX0RFU0NfSVZdOworCVVDSEFSCQlLZXlSc2NbTEVOX0tFWV9ERVNDX1JTQ107CisJVUNIQVIJCUtleUlkW0xFTl9LRVlfREVTQ19JRF07CisJVUNIQVIJCUtleU1pY1tMRU5fS0VZX0RFU0NfTUlDXTsKKwlVQ0hBUgkJS2V5RGF0YUxlblsyXTsKKwlVQ0hBUgkJS2V5RGF0YVtNQVhfTEVOX09GX1JTTklFXTsKK30JS0VZX0RFU0NSSVBURVIsICpQS0VZX0RFU0NSSVBURVI7CisKK3R5cGVkZWYJc3RydWN0IFBBQ0tFRCBfRUFQT0xfUEFDS0VUCit7CisJVUNIQVIJIAkJCVByb1ZlcjsKKwlVQ0hBUgkgCQkJUHJvVHlwZTsKKwlVQ0hBUgkgCQkJQm9keV9MZW5bMl07CisJS0VZX0RFU0NSSVBURVIJCUtleURlc2M7Cit9CUVBUE9MX1BBQ0tFVCwgKlBFQVBPTF9QQUNLRVQ7CisKKy8vODAyLjExaSBEMTAgcGFnZSA4MwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9HVEtfRU5DQVAKK3sKKyNpZm5kZWYgUlRfQklHX0VORElBTgorICAgIFVDSEFSICAgICAgICAgICAgICAgS2lkOjI7CisgICAgVUNIQVIgICAgICAgICAgICAgICB0eDoxOworICAgIFVDSEFSICAgICAgICAgICAgICAgcnN2OjU7CisgICAgVUNIQVIgICAgICAgICAgICAgICByc3YxOworI2Vsc2UKKyAgICBVQ0hBUiAgICAgICAgICAgICAgIHJzdjo1OworICAgIFVDSEFSICAgICAgICAgICAgICAgdHg6MTsKKyAgICBVQ0hBUiAgICAgICAgICAgICAgIEtpZDoyOworICAgIFVDSEFSICAgICAgICAgICAgICAgcnN2MTsKKyNlbmRpZgorICAgIFVDSEFSICAgICAgICAgICAgICAgR1RLW1RLSVBfR1RLX0xFTkdUSF07Cit9ICAgR1RLX0VOQ0FQLCAqUEdUS19FTkNBUDsKKwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9LREVfRU5DQVAKK3sKKyAgICBVQ0hBUiAgICAgICAgICAgICAgIFR5cGU7CisgICAgVUNIQVIgICAgICAgICAgICAgICBMZW47CisgICAgVUNIQVIgICAgICAgICAgICAgICBPVUlbM107CisgICAgVUNIQVIgICAgICAgICAgICAgICBEYXRhVHlwZTsKKyAgICBHVEtfRU5DQVAgICAgICBHVEtFbmNhcDsKK30gICBLREVfRU5DQVAsICpQS0RFX0VOQ0FQOworCisvLyBGb3IgV1BBMQordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9SU05JRSB7CisgICAgVUNIQVIgICBvdWlbNF07CisgICAgVVNIT1JUICB2ZXJzaW9uOworICAgIFVDSEFSICAgbWNhc3RbNF07CisgICAgVVNIT1JUICB1Y291bnQ7CisgICAgc3RydWN0IFBBQ0tFRCB7CisgICAgICAgIFVDSEFSIG91aVs0XTsKKyAgICB9dWNhc3RbMV07Cit9IFJTTklFLCAqUFJTTklFOworCisvLyBGb3IgV1BBMgordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9SU05JRTIgeworICAgIFVTSE9SVCAgdmVyc2lvbjsKKyAgICBVQ0hBUiAgIG1jYXN0WzRdOworICAgIFVTSE9SVCAgdWNvdW50OworICAgIHN0cnVjdCBQQUNLRUQgeworICAgICAgICBVQ0hBUiBvdWlbNF07CisgICAgfXVjYXN0WzFdOworfSBSU05JRTIsICpQUlNOSUUyOworCisvLyBBS00gU3VpdGUKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfUlNOSUVfQVVUSCB7CisgICAgVVNIT1JUIGFjb3VudDsKKyAgICBzdHJ1Y3QgUEFDS0VEIHsKKyAgICAgICAgVUNIQVIgb3VpWzRdOworICAgIH1hdXRoWzFdOworfSBSU05JRV9BVVRILCpQUlNOSUVfQVVUSDsKKwordHlwZWRlZgl1bmlvbiBQQUNLRUQgX1JTTl9DQVBBQklMSVRJRVMJeworCXN0cnVjdAlQQUNLRUQgeworI2lmZGVmIFJUX0JJR19FTkRJQU4KKyAgICAgICAgVVNIT1JUCQlSc3ZkOjEwOworICAgICAgICBVU0hPUlQJCUdUS1NBX1JfQ291bnRlcjoyOworICAgICAgICBVU0hPUlQJCVBUS1NBX1JfQ291bnRlcjoyOworICAgICAgICBVU0hPUlQJCU5vX1BhaXJ3aXNlOjE7CisJCVVTSE9SVAkJUHJlQXV0aDoxOworI2Vsc2UKKyAgICAgICAgVVNIT1JUCQlQcmVBdXRoOjE7CisJCVVTSE9SVAkJTm9fUGFpcndpc2U6MTsKKwkJVVNIT1JUCQlQVEtTQV9SX0NvdW50ZXI6MjsKKwkJVVNIT1JUCQlHVEtTQV9SX0NvdW50ZXI6MjsKKwkJVVNIT1JUCQlSc3ZkOjEwOworI2VuZGlmCisJfQlmaWVsZDsKKwlVU0hPUlQJCQl3b3JkOworfQlSU05fQ0FQQUJJTElUSUVTLCAqUFJTTl9DQVBBQklMSVRJRVM7CisKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfRUFQX0hEUiB7CisgICAgVUNIQVIgICBQcm9WZXI7CisgICAgVUNIQVIgICBQcm9UeXBlOworICAgIFVDSEFSICAgQm9keV9MZW5bMl07CisgICAgVUNIQVIgICBjb2RlOworICAgIFVDSEFSICAgaWRlbnRpZmllcjsKKyAgICBVQ0hBUiAgIGxlbmd0aFsyXTsgLy8gaW5jbHVkaW5nIGNvZGUgYW5kIGlkZW50aWZpZXIsIGZvbGxvd2VkIGJ5IGxlbmd0aC0yIG9jdGV0cyBvZiBkYXRhCit9IEVBUF9IRFIsICpQRUFQX0hEUjsKKworLy8gRm9yIHN1cHBsaWNhbnQgc3RhdGUgbWFjaGluZSBzdGF0ZXMuIDgwMi4xMWkgRHJhZnQgNC4xLCBwLiA5NworLy8gV2Ugc2ltcGxpZmllZCBpdAordHlwZWRlZgllbnVtCV9XcGFTdGF0ZQoreworCVNTX05PVFVTRSwJCQkJLy8gMAorCVNTX1NUQVJULAkJCQkvLyAxCisJU1NfV0FJVF9NU0dfMywJCQkvLyAyCisJU1NfV0FJVF9HUk9VUCwJCQkvLyAzCisJU1NfRklOSVNILCAgCQkJLy8gNAorCVNTX0tFWVVQREFURSwJCQkvLyA1Cit9CVdQQV9TVEFURTsKKworLy8KKy8vCVRoZSBkZWZpbml0aW9uIG9mIHRoZSBjaXBoZXIgY29tYmluYXRpb24KKy8vCisvLyAJIGJpdDMJYml0MiAgYml0MSAgIGJpdDAKKy8vCSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKworLy8gCXwJICBXUEEJIHwJICAgV1BBMiAgIHwKKy8vCSstLS0tLS0rLS0tLS0rLS0tLS0tKy0tLS0tKworLy8JfCBUS0lQIHwgQUVTIHwgVEtJUCB8IEFFUyB8CisvLwl8CTAgIHwgIDEgIHwgICAxICB8ICAwICB8IC0+IDB4MDYKKy8vCXwJMCAgfCAgMSAgfCAgIDEgIHwgIDEgIHwgLT4gMHgwNworLy8JfAkxICB8ICAwICB8ICAgMCAgfCAgMSAgfCAtPiAweDA5CisvLwl8CTEgIHwgIDAgIHwgICAxICB8ICAxICB8IC0+IDB4MEIKKy8vCXwJMSAgfCAgMSAgfCAgIDAgIHwgIDEgIHwgLT4gMHgwRAorLy8JfAkxICB8ICAxICB8ICAgMSAgfCAgMCAgfCAtPiAweDBFCisvLwl8CTEgIHwgIDEgIHwgICAxICB8ICAxICB8CS0+IDB4MEYKKy8vCSstLS0tLS0rLS0tLS0rLS0tLS0tKy0tLS0tKworLy8KK3R5cGVkZWYJZW51bQlfV3BhTWl4UGFpckNpcGhlcgoreworCU1JWF9DSVBIRVJfTk9UVVNFIAkJCT0gMHgwMCwKKwlXUEFfTk9ORV9XUEEyX1RLSVBBRVMJCT0gMHgwMywJCS8vIFdQQTItVEtJUEFFUworCVdQQV9BRVNfV1BBMl9US0lQIAkJCT0gMHgwNiwKKwlXUEFfQUVTX1dQQTJfVEtJUEFFUwkJPSAweDA3LAorCVdQQV9US0lQX1dQQTJfQUVTCQkJPSAweDA5LAorCVdQQV9US0lQX1dQQTJfVEtJUEFFUwkJPSAweDBCLAorCVdQQV9US0lQQUVTX1dQQTJfTk9ORQkJPSAweDBDLAkJLy8gV1BBLVRLSVBBRVMKKwlXUEFfVEtJUEFFU19XUEEyX0FFUwkJPSAweDBELAorCVdQQV9US0lQQUVTX1dQQTJfVEtJUAkJPSAweDBFLAorCVdQQV9US0lQQUVTX1dQQTJfVEtJUEFFUwk9IDB4MEYsCit9CVdQQV9NSVhfUEFJUl9DSVBIRVI7CisKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfUlNOX0lFX0hFQURFUl9TVFJVQ1QJeworCVVDSEFSCQlFaWQ7CisJVUNIQVIJCUxlbmd0aDsKKwlVU0hPUlQJCVZlcnNpb247CS8vIExpdHRsZSBlbmRpYW4gZm9ybWF0Cit9CVJTTl9JRV9IRUFERVJfU1RSVUNULCAqUFJTTl9JRV9IRUFERVJfU1RSVUNUOworCisvLyBDaXBoZXIgc3VpdGUgc2VsZWN0b3IgdHlwZXMKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfQ0lQSEVSX1NVSVRFX1NUUlVDVAl7CisJVUNIQVIJCU91aVszXTsKKwlVQ0hBUgkJVHlwZTsKK30JQ0lQSEVSX1NVSVRFX1NUUlVDVCwgKlBDSVBIRVJfU1VJVEVfU1RSVUNUOworCisvLyBBdXRoZW50aWNhdGlvbiBhbmQgS2V5IE1hbmFnZW1lbnQgc3VpdGUgc2VsZWN0b3IKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfQUtNX1NVSVRFX1NUUlVDVAl7CisJVUNIQVIJCU91aVszXTsKKwlVQ0hBUgkJVHlwZTsKK30JQUtNX1NVSVRFX1NUUlVDVCwgKlBBS01fU1VJVEVfU1RSVUNUOworCisvLyBSU04gY2FwYWJpbGl0eQordHlwZWRlZiBzdHJ1Y3QJUEFDS0VEIF9SU05fQ0FQQUJJTElUWQl7CisJVVNIT1JUCQlSc3Y6MTA7CisJVVNIT1JUCQlHVEtTQVJlcGxheUNudDoyOworCVVTSE9SVAkJUFRLU0FSZXBsYXlDbnQ6MjsKKwlVU0hPUlQJCU5vUGFpcndpc2U6MTsKKwlVU0hPUlQJCVByZUF1dGg6MTsKK30JUlNOX0NBUEFCSUxJVFksICpQUlNOX0NBUEFCSUxJVFk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC8yODcwX21haW5fZGV2LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwLzI4NzBfbWFpbl9kZXYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNGM3NjRkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC8yODcwX21haW5fZGV2LmMKQEAgLTAsMCArMSwxNjEyIEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgIE1vZHVsZSBOYW1lOgorICAgIHJ0bXBfbWFpbi5jCisKKyAgICBBYnN0cmFjdDoKKyAgICBtYWluIGluaXRpYWxpemF0aW9uIHJvdXRpbmVzCisKKyAgICBSZXZpc2lvbiBIaXN0b3J5OgorICAgIFdobyAgICAgICAgIFdoZW4gICAgICAgICAgICBXaGF0CisgICAgLS0tLS0tLS0gICAgLS0tLS0tLS0tLSAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBOYW1lICAgICAgICBEYXRlICAgICAgICAgICAgTW9kaWZpY2F0aW9uIGxvZ3MKKyAgICBKYW4gTGVlCQkwMS0xMC0yMDA1CSAgICBtb2RpZmllZAorCVNhbXBsZQkJSnVuLzAxLzA3CQlNZXJnZSBSVDI4NzAgYW5kIFJUMjg2MCBkcml2ZXJzLgorKi8KKworI2luY2x1ZGUgInJ0X2NvbmZpZy5oIgorCisKKy8vIEZvbGxvd2luZyBpbmZvcm1hdGlvbiB3aWxsIGJlIHNob3cgd2hlbiB5b3UgcnVuICdtb2RpbmZvJworLy8gKioqIElmIHlvdSBoYXZlIGEgc29sdXRpb24gZm9yIHRoZSBidWcgaW4gY3VycmVudCB2ZXJzaW9uIG9mIGRyaXZlciwgcGxlYXNlIG1haWwgdG8gbWUuCisvLyBPdGhlcndpc2UgcG9zdCB0byBmb3J1bSBpbiByYWxpbmt0ZWNoJ3Mgd2ViIHNpdGUod3d3LnJhbGlua3RlY2guY29tKSBhbmQgbGV0IGFsbCB1c2VycyBoZWxwIHlvdS4gKioqCitNT0RVTEVfQVVUSE9SKCJQYXVsIExpbiA8cGF1bF9saW5AcmFsaW5rdGVjaC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlJUMjg3MCBXaXJlbGVzcyBMYW4gTGludXggRHJpdmVyIik7CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisjaWZkZWYgTU9EVUxFX1ZFUlNJT04KK01PRFVMRV9WRVJTSU9OKFNUQV9EUklWRVJfVkVSU0lPTik7CisjZW5kaWYKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworI2lmZGVmIE1VTFRJUExFX0NBUkRfU1VQUE9SVAorLy8gcmVjb3JkIHdoZXRoZXIgdGhlIGNhcmQgaW4gdGhlIGNhcmQgbGlzdCBpcyB1c2VkIGluIHRoZSBjYXJkIGZpbGUKK2V4dGVybiBVSU5UOCAgTUNfQ2FyZFVzZWRbXTsKKyNlbmRpZiAvLyBNVUxUSVBMRV9DQVJEX1NVUFBPUlQgLy8KKworLyogS2VybmVsIHRocmVhZCBhbmQgdmFycywgd2hpY2ggaGFuZGxlcyBwYWNrZXRzIHRoYXQgYXJlIGNvbXBsZXRlZC4gT25seQorICogcGFja2V0cyB0aGF0IGhhdmUgYSAiY29tcGxldGUiIGZ1bmN0aW9uIGFyZSBzZW50IGhlcmUuIFRoaXMgd2F5LCB0aGUKKyAqIGNvbXBsZXRpb24gaXMgcnVuIG91dCBvZiBrZXJuZWwgY29udGV4dCwgYW5kIGRvZXNuJ3QgYmxvY2sgdGhlIHJlc3Qgb2YKKyAqIHRoZSBzdGFjay4gKi8KKworZXh0ZXJuIElOVCBfX2RldmluaXQgcnQyOHh4X3Byb2JlKElOIHZvaWQgKl9kZXZfcCwgSU4gdm9pZCAqX2Rldl9pZF9wLAorCQkJCQkJCQkJSU4gVUlOVCBhcmdjLCBPVVQgUFJUTVBfQURBUFRFUiAqcHBBZCk7CisKKworLyogbW9kdWxlIHRhYmxlICovCitzdHJ1Y3QgdXNiX2RldmljZV9pZCAgICBydHVzYl91c2JfaWRbXSA9IFJUMjg3MF9VU0JfREVWSUNFUzsKK0lOVCBjb25zdCAgICAgICAgICAgICAgIHJ0dXNiX3VzYl9pZF9sZW4gPSBzaXplb2YocnR1c2JfdXNiX2lkKSAvIHNpemVvZihzdHJ1Y3QgdXNiX2RldmljZV9pZCk7CitNT0RVTEVfREVWSUNFX1RBQkxFKHVzYiwgcnR1c2JfdXNiX2lkKTsKKworI2lmbmRlZiBQRl9OT0ZSRUVaRQorI2RlZmluZSBQRl9OT0ZSRUVaRSAgMAorI2VuZGlmCisKKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvL3Rlc3RlZCBmb3Iga2VybmVsIDIuNCBzZXJpZXMKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkICpydHVzYl9wcm9iZShzdHJ1Y3QgdXNiX2RldmljZSAqZGV2LCBVSU5UIGludGVyZmFjZSwKKwkJCQkJCWNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZF90YWJsZSk7CitzdGF0aWMgdm9pZCBydHVzYl9kaXNjb25uZWN0KHN0cnVjdCB1c2JfZGV2aWNlICpkZXYsIHZvaWQgKnB0cik7CisKK3N0cnVjdCB1c2JfZHJpdmVyIHJ0dXNiX2RyaXZlciA9IHsKKwkJbmFtZToicnQyODcwIiwKKwkJcHJvYmU6cnR1c2JfcHJvYmUsCisJCWRpc2Nvbm5lY3Q6cnR1c2JfZGlzY29ubmVjdCwKKwkJaWRfdGFibGU6cnR1c2JfdXNiX2lkLAorCX07CisKKyNlbHNlCisKKyNpZmRlZiBDT05GSUdfUE0KK3N0YXRpYyBpbnQgcnQyODcwX3N1c3BlbmQoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsIHBtX21lc3NhZ2VfdCBzdGF0ZSk7CitzdGF0aWMgaW50IHJ0Mjg3MF9yZXN1bWUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpOworI2VuZGlmIC8vIENPTkZJR19QTSAvLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvL3Rlc3RlZCBmb3Iga2VybmVsIDIuNnNlcmllcworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBydHVzYl9wcm9iZSAoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsCisJCQkJCQljb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpOworc3RhdGljIHZvaWQgcnR1c2JfZGlzY29ubmVjdChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50Zik7CisKK3N0cnVjdCB1c2JfZHJpdmVyIHJ0dXNiX2RyaXZlciA9IHsKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMTUpCisJLm93bmVyID0gVEhJU19NT0RVTEUsCisjZW5kaWYKKwkubmFtZT0icnQyODcwIiwKKwkucHJvYmU9cnR1c2JfcHJvYmUsCisJLmRpc2Nvbm5lY3Q9cnR1c2JfZGlzY29ubmVjdCwKKwkuaWRfdGFibGU9cnR1c2JfdXNiX2lkLAorCisjaWZkZWYgQ09ORklHX1BNCisJc3VzcGVuZDoJcnQyODcwX3N1c3BlbmQsCisJcmVzdW1lOgkJcnQyODcwX3Jlc3VtZSwKKyNlbmRpZgorCX07CisKKyNpZmRlZiBDT05GSUdfUE0KKworVk9JRCBSVDI4NjBSZWplY3RQZW5kaW5nUGFja2V0cygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCkKK3sKKwkvLyBjbGVhciBQUyBwYWNrZXRzCisJLy8gY2xlYXIgVHhTdyBwYWNrZXRzCit9CisKK3N0YXRpYyBpbnQgcnQyODcwX3N1c3BlbmQoCisJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsCisJcG1fbWVzc2FnZV90IHN0YXRlKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2OworCVBSVE1QX0FEQVBURVIgcEFkID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsKKworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PiBydDI4NzBfc3VzcGVuZCgpXG4iKSk7CisJbmV0X2RldiA9IHBBZC0+bmV0X2RldjsKKwluZXRpZl9kZXZpY2VfZGV0YWNoIChuZXRfZGV2KTsKKworCXBBZC0+UE1fRmxnU3VzcGVuZCA9IDE7CisJaWYgKG5ldGlmX3J1bm5pbmcobmV0X2RldikpIHsKKwkJUlRVU0JDYW5jZWxQZW5kaW5nQnVsa0luSVJQKHBBZCk7CisJCVJUVVNCQ2FuY2VsUGVuZGluZ0J1bGtPdXRJUlAocEFkKTsKKwl9CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPD09PSBydDI4NzBfc3VzcGVuZCgpXG4iKSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcnQyODcwX3Jlc3VtZSgKKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldjsKKwlQUlRNUF9BREFQVEVSIHBBZCA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CisKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT4gcnQyODcwX3Jlc3VtZSgpXG4iKSk7CisKKwlwQWQtPlBNX0ZsZ1N1c3BlbmQgPSAwOworCW5ldF9kZXYgPSBwQWQtPm5ldF9kZXY7CisJbmV0aWZfZGV2aWNlX2F0dGFjaCAobmV0X2Rldik7CisJbmV0aWZfc3RhcnRfcXVldWUobmV0X2Rldik7CisJbmV0aWZfY2Fycmllcl9vbihuZXRfZGV2KTsKKwluZXRpZl93YWtlX3F1ZXVlKG5ldF9kZXYpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPD09PSBydDI4NzBfcmVzdW1lKClcbiIpKTsKKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvLyBDT05GSUdfUE0gLy8KKyNlbmRpZiAvLyBMSU5VWF9WRVJTSU9OX0NPREUgLy8KKworCisvLyBJbml0IGRyaXZlciBtb2R1bGUKK0lOVCBfX2luaXQgcnR1c2JfaW5pdCh2b2lkKQoreworCXByaW50aygicnR1c2IgaW5pdCAtLS0+XG4iKTsKKwlyZXR1cm4gdXNiX3JlZ2lzdGVyKCZydHVzYl9kcml2ZXIpOworfQorCisvLyBEZWluaXQgZHJpdmVyIG1vZHVsZQorVk9JRCBfX2V4aXQgcnR1c2JfZXhpdCh2b2lkKQoreworCXVzYl9kZXJlZ2lzdGVyKCZydHVzYl9kcml2ZXIpOworCXByaW50aygiPC0tLSBydHVzYiBleGl0XG4iKTsKK30KKworbW9kdWxlX2luaXQocnR1c2JfaW5pdCk7Cittb2R1bGVfZXhpdChydHVzYl9leGl0KTsKKworCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0JKi8KKy8qIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucwkJCQkJCQkJCQkJCSovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQkqLworCisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgIE1MTUUga2VybmVsIHRocmVhZC4KKworQXJndW1lbnRzOgorCSpDb250ZXh0CQkJdGhlIHBBZCwgZHJpdmVyIGNvbnRyb2wgYmxvY2sgcG9pbnRlcgorCitSZXR1cm4gVmFsdWU6CisgICAgMAkJCQkJY2xvc2UgdGhlIHRocmVhZAorCitOb3RlOgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UIE1sbWVUaHJlYWQoCisJSU4gdm9pZCAqQ29udGV4dCkKK3sKKwlQUlRNUF9BREFQVEVSCXBBZCA9IChQUlRNUF9BREFQVEVSKUNvbnRleHQ7CisJUE9TX0NPT0tJRQlwT2JqOworCWludCBzdGF0dXM7CisKKwlwT2JqID0gKFBPU19DT09LSUUpcEFkLT5PU19Db29raWU7CisKKwlydG1wX29zX3RocmVhZF9pbml0KCJydDI4NzBNbG1lVGhyZWFkIiwgKFBWT0lEKSYocEFkLT5tbG1lQ29tcGxldGUpKTsKKworCXdoaWxlIChwQWQtPm1sbWVfa2lsbCA9PSAwKQorCXsKKwkJLyogbG9jayB0aGUgZGV2aWNlIHBvaW50ZXJzICovCisJCS8vZG93bigmKHBBZC0+bWxtZV9zZW1hcGhvcmUpKTsKKwkJc3RhdHVzID0gZG93bl9pbnRlcnJ1cHRpYmxlKCYocEFkLT5tbG1lX3NlbWFwaG9yZSkpOworCisJCS8qIGxvY2sgdGhlIGRldmljZSBwb2ludGVycyAsIG5lZWQgdG8gY2hlY2sgaWYgcmVxdWlyZWQqLworCQkvL2Rvd24oJihwQWQtPnVzYmRldl9zZW1hcGhvcmUpKTsKKworCQlpZiAoIXBBZC0+UE1fRmxnU3VzcGVuZCkKKwkJTWxtZUhhbmRsZXIocEFkKTsKKworCQkvKiB1bmxvY2sgdGhlIGRldmljZSBwb2ludGVycyAqLworCQkvL3VwKCYocEFkLT51c2JkZXZfc2VtYXBob3JlKSk7CisJCWlmIChzdGF0dXMgIT0gMCkKKwkJeworCQkJUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyk7CisJCQlicmVhazsKKwkJfQorCX0KKworCS8qIG5vdGlmeSB0aGUgZXhpdCByb3V0aW5lIHRoYXQgd2UncmUgYWN0dWFsbHkgZXhpdGluZyBub3cKKwkgKgorCSAqIGNvbXBsZXRlKCkvd2FpdF9mb3JfY29tcGxldGlvbigpIGlzIHNpbWlsYXIgdG8gdXAoKS9kb3duKCksCisJICogZXhjZXB0IHRoYXQgY29tcGxldGUoKSBpcyBzYWZlIGluIHRoZSBjYXNlIHdoZXJlIHRoZSBzdHJ1Y3R1cmUKKwkgKiBpcyBnZXR0aW5nIGRlbGV0ZWQgaW4gYSBwYXJhbGxlbCBtb2RlIG9mIGV4ZWN1dGlvbiAoaS5lLiBqdXN0CisJICogYWZ0ZXIgdGhlIGRvd24oKSAtLSB0aGF0J3MgbmVjZXNzYXJ5IGZvciB0aGUgdGhyZWFkLXNodXRkb3duCisJICogY2FzZS4KKwkgKgorCSAqIGNvbXBsZXRlX2FuZF9leGl0KCkgZ29lcyBldmVuIGZ1cnRoZXIgdGhhbiB0aGlzIC0tIGl0IGlzIHNhZmUgaW4KKwkgKiB0aGUgY2FzZSB0aGF0IHRoZSB0aHJlYWQgb2YgdGhlIGNhbGxlciBpcyBnb2luZyBhd2F5IChub3QganVzdAorCSAqIHRoZSBzdHJ1Y3R1cmUpIC0tIHRoaXMgaXMgbmVjZXNzYXJ5IGZvciB0aGUgbW9kdWxlLXJlbW92ZSBjYXNlLgorCSAqIFRoaXMgaXMgaW1wb3J0YW50IGluIHByZWVtcHRpb24ga2VybmVscywgd2hpY2ggdHJhbnNmZXIgdGhlIGZsb3cKKwkgKiBvZiBleGVjdXRpb24gaW1tZWRpYXRlbHkgdXBvbiBhIGNvbXBsZXRlKCkuCisJICovCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCAiPC0tLSVzXG4iLF9fZnVuY19fKSk7CisKKwlwT2JqLT5NTE1FVGhyX3BpZCA9IFRIUkVBRF9QSURfSU5JVF9WQUxVRTsKKworCWNvbXBsZXRlX2FuZF9leGl0ICgmcEFkLT5tbG1lQ29tcGxldGUsIDApOworCXJldHVybiAwOworCit9CisKKworLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICBVU0IgY29tbWFuZCBrZXJuZWwgdGhyZWFkLgorCitBcmd1bWVudHM6CisJKkNvbnRleHQJCQl0aGUgcEFkLCBkcml2ZXIgY29udHJvbCBibG9jayBwb2ludGVyCisKK1JldHVybiBWYWx1ZToKKyAgICAwCQkJCQljbG9zZSB0aGUgdGhyZWFkCisKK05vdGU6Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQgUlRVU0JDbWRUaHJlYWQoCisJSU4gdm9pZCAqIENvbnRleHQpCit7CisJUFJUTVBfQURBUFRFUglwQWQgPSAoUFJUTVBfQURBUFRFUilDb250ZXh0OworCVBPU19DT09LSUUJCXBPYmo7CisJaW50IHN0YXR1czsKKworCXBPYmogPSAoUE9TX0NPT0tJRSlwQWQtPk9TX0Nvb2tpZTsKKworCXJ0bXBfb3NfdGhyZWFkX2luaXQoInJ0Mjg3MENtZFRocmVhZCIsIChQVk9JRCkmKHBBZC0+Q21kUUNvbXBsZXRlKSk7CisKKwlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPkNtZFFMb2NrKTsKKwlwQWQtPkNtZFEuQ21kUVN0YXRlID0gUlQyODcwX1RIUkVBRF9SVU5OSU5HOworCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+Q21kUUxvY2spOworCisJd2hpbGUgKHBBZC0+Q21kUS5DbWRRU3RhdGUgPT0gUlQyODcwX1RIUkVBRF9SVU5OSU5HKQorCXsKKwkJLyogbG9jayB0aGUgZGV2aWNlIHBvaW50ZXJzICovCisJCS8vZG93bigmKHBBZC0+UlRVU0JDbWRfc2VtYXBob3JlKSk7CisJCXN0YXR1cyA9IGRvd25faW50ZXJydXB0aWJsZSgmKHBBZC0+UlRVU0JDbWRfc2VtYXBob3JlKSk7CisKKwkJaWYgKHBBZC0+Q21kUS5DbWRRU3RhdGUgPT0gUlQyODcwX1RIUkVBRF9TVE9QRUQpCisJCQlicmVhazsKKworCQlpZiAoc3RhdHVzICE9IDApCisJCXsKKwkJCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MpOworCQkJYnJlYWs7CisJCX0KKwkJLyogbG9jayB0aGUgZGV2aWNlIHBvaW50ZXJzICwgbmVlZCB0byBjaGVjayBpZiByZXF1aXJlZCovCisJCS8vZG93bigmKHBBZC0+dXNiZGV2X3NlbWFwaG9yZSkpOworCisJCWlmICghcEFkLT5QTV9GbGdTdXNwZW5kKQorCQlDTURIYW5kbGVyKHBBZCk7CisKKwkJLyogdW5sb2NrIHRoZSBkZXZpY2UgcG9pbnRlcnMgKi8KKwkJLy91cCgmKHBBZC0+dXNiZGV2X3NlbWFwaG9yZSkpOworCX0KKworCWlmICghcEFkLT5QTV9GbGdTdXNwZW5kKQorCXsJLy8gQ2xlYXIgdGhlIENtZFFFbGVtZW50cy4KKwkJQ21kUUVsbXQJKnBDbWRRRWxtdCA9IE5VTEw7CisKKwkJTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5DbWRRTG9jayk7CisJCXBBZC0+Q21kUS5DbWRRU3RhdGUgPSBSVDI4NzBfVEhSRUFEX1NUT1BFRDsKKwkJd2hpbGUocEFkLT5DbWRRLnNpemUpCisJCXsKKwkJCVJUVVNCRGVxdWV1ZUNtZCgmcEFkLT5DbWRRLCAmcENtZFFFbG10KTsKKwkJCWlmIChwQ21kUUVsbXQpCisJCQl7CisJCQkJaWYgKHBDbWRRRWxtdC0+Q21kRnJvbU5kaXMgPT0gVFJVRSkKKwkJCQl7CisJCQkJCWlmIChwQ21kUUVsbXQtPmJ1ZmZlciAhPSBOVUxMKQorCQkJCQkJTmRpc0ZyZWVNZW1vcnkocENtZFFFbG10LT5idWZmZXIsIHBDbWRRRWxtdC0+YnVmZmVybGVuZ3RoLCAwKTsKKworCQkJCQlOZGlzRnJlZU1lbW9yeShwQ21kUUVsbXQsIHNpemVvZihDbWRRRWxtdCksIDApOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlpZiAoKHBDbWRRRWxtdC0+YnVmZmVyICE9IE5VTEwpICYmIChwQ21kUUVsbXQtPmJ1ZmZlcmxlbmd0aCAhPSAwKSkKKwkJCQkJCU5kaXNGcmVlTWVtb3J5KHBDbWRRRWxtdC0+YnVmZmVyLCBwQ21kUUVsbXQtPmJ1ZmZlcmxlbmd0aCwgMCk7CisJCSAgICAgICAgICAgIHsKKwkJCQkJCU5kaXNGcmVlTWVtb3J5KHBDbWRRRWxtdCwgc2l6ZW9mKENtZFFFbG10KSwgMCk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKworCQlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPkNtZFFMb2NrKTsKKwl9CisJLyogbm90aWZ5IHRoZSBleGl0IHJvdXRpbmUgdGhhdCB3ZSdyZSBhY3R1YWxseSBleGl0aW5nIG5vdworCSAqCisJICogY29tcGxldGUoKS93YWl0X2Zvcl9jb21wbGV0aW9uKCkgaXMgc2ltaWxhciB0byB1cCgpL2Rvd24oKSwKKwkgKiBleGNlcHQgdGhhdCBjb21wbGV0ZSgpIGlzIHNhZmUgaW4gdGhlIGNhc2Ugd2hlcmUgdGhlIHN0cnVjdHVyZQorCSAqIGlzIGdldHRpbmcgZGVsZXRlZCBpbiBhIHBhcmFsbGVsIG1vZGUgb2YgZXhlY3V0aW9uIChpLmUuIGp1c3QKKwkgKiBhZnRlciB0aGUgZG93bigpIC0tIHRoYXQncyBuZWNlc3NhcnkgZm9yIHRoZSB0aHJlYWQtc2h1dGRvd24KKwkgKiBjYXNlLgorCSAqCisJICogY29tcGxldGVfYW5kX2V4aXQoKSBnb2VzIGV2ZW4gZnVydGhlciB0aGFuIHRoaXMgLS0gaXQgaXMgc2FmZSBpbgorCSAqIHRoZSBjYXNlIHRoYXQgdGhlIHRocmVhZCBvZiB0aGUgY2FsbGVyIGlzIGdvaW5nIGF3YXkgKG5vdCBqdXN0CisJICogdGhlIHN0cnVjdHVyZSkgLS0gdGhpcyBpcyBuZWNlc3NhcnkgZm9yIHRoZSBtb2R1bGUtcmVtb3ZlIGNhc2UuCisJICogVGhpcyBpcyBpbXBvcnRhbnQgaW4gcHJlZW1wdGlvbiBrZXJuZWxzLCB3aGljaCB0cmFuc2ZlciB0aGUgZmxvdworCSAqIG9mIGV4ZWN1dGlvbiBpbW1lZGlhdGVseSB1cG9uIGEgY29tcGxldGUoKS4KKwkgKi8KKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoICI8LS0tUlRVU0JDbWRUaHJlYWRcbiIpKTsKKworCXBPYmotPlJUVVNCQ21kVGhyX3BpZCA9IFRIUkVBRF9QSURfSU5JVF9WQUxVRTsKKworCWNvbXBsZXRlX2FuZF9leGl0ICgmcEFkLT5DbWRRQ29tcGxldGUsIDApOworCXJldHVybiAwOworCit9CisKKworc3RhdGljIHZvaWQgUlQyODcwX1RpbWVyUV9IYW5kbGUoUlRNUF9BREFQVEVSICpwQWQpCit7CisJaW50IHN0YXR1czsKKwlSQUxJTktfVElNRVJfU1RSVUNUCSpwVGltZXI7CisJUlQyODcwX1RJTUVSX0VOVFJZCSpwRW50cnk7CisJdW5zaWduZWQgbG9uZwlpcnFGbGFnOworCisJd2hpbGUoIXBBZC0+VGltZXJGdW5jX2tpbGwpCisJeworLy8JCXByaW50aygid2FpdGluZyBmb3IgZXZlbnQhXG4iKTsKKwkJcFRpbWVyID0gTlVMTDsKKworCQlzdGF0dXMgPSBkb3duX2ludGVycnVwdGlibGUoJihwQWQtPlJUVVNCVGltZXJfc2VtYXBob3JlKSk7CisKKwkJaWYgKHBBZC0+VGltZXJRLnN0YXR1cyA9PSBSVDI4NzBfVEhSRUFEX1NUT1BFRCkKKwkJCWJyZWFrOworCisJCS8vIGV2ZW50IGhhcHBlbmVkLgorCQl3aGlsZShwQWQtPlRpbWVyUS5wUUhlYWQpCisJCXsKKwkJCVJUTVBfSVJRX0xPQ0soJnBBZC0+VGltZXJRTG9jaywgaXJxRmxhZyk7CisJCQlwRW50cnkgPSBwQWQtPlRpbWVyUS5wUUhlYWQ7CisJCQlpZiAocEVudHJ5KQorCQkJeworCQkJCXBUaW1lciA9IHBFbnRyeS0+cFJhVGltZXI7CisKKwkJCQkvLyB1cGRhdGUgcFFIZWFkCisJCQkJcEFkLT5UaW1lclEucFFIZWFkID0gcEVudHJ5LT5wTmV4dDsKKwkJCQlpZiAocEVudHJ5ID09IHBBZC0+VGltZXJRLnBRVGFpbCkKKwkJCQkJcEFkLT5UaW1lclEucFFUYWlsID0gTlVMTDsKKworCQkJCS8vIHJldHVybiB0aGlzIHF1ZXVlIGVudHJ5IHRvIHRpbWVyUUZyZWVMaXN0LgorCQkJCXBFbnRyeS0+cE5leHQgPSBwQWQtPlRpbWVyUS5wUVBvbGxGcmVlTGlzdDsKKwkJCQlwQWQtPlRpbWVyUS5wUVBvbGxGcmVlTGlzdCA9IHBFbnRyeTsKKwkJCX0KKwkJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5UaW1lclFMb2NrLCBpcnFGbGFnKTsKKworCQkJaWYgKHBUaW1lcikKKwkJCXsKKwkJCQlpZiAocFRpbWVyLT5oYW5kbGUgIT0gTlVMTCkKKwkJCQlpZiAoIXBBZC0+UE1fRmxnU3VzcGVuZCkKKwkJCQkJcFRpbWVyLT5oYW5kbGUoTlVMTCwgKFBWT0lEKSBwVGltZXItPmNvb2tpZSwgTlVMTCwgcFRpbWVyKTsKKwkJCQlpZiAoKHBUaW1lci0+UmVwZWF0KSAmJiAocFRpbWVyLT5TdGF0ZSA9PSBGQUxTRSkpCisJCQkJCVJUTVBfT1NfQWRkX1RpbWVyKCZwVGltZXItPlRpbWVyT2JqLCBwVGltZXItPlRpbWVyVmFsdWUpOworCQkJfQorCQl9CisKKwkJaWYgKHN0YXR1cyAhPSAwKQorCQl7CisJCQlwQWQtPlRpbWVyUS5zdGF0dXMgPSBSVDI4NzBfVEhSRUFEX1NUT1BFRDsKKwkJCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MpOworCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKKworSU5UIFRpbWVyUVRocmVhZCgKKwlJTiBPVVQgUFZPSUQgQ29udGV4dCkKK3sKKwlQUlRNUF9BREFQVEVSCXBBZDsKKwlQT1NfQ09PS0lFCXBPYmo7CisKKwlwQWQgPSAoUFJUTVBfQURBUFRFUilDb250ZXh0OworCXBPYmogPSAoUE9TX0NPT0tJRSkgcEFkLT5PU19Db29raWU7CisKKwlydG1wX29zX3RocmVhZF9pbml0KCJydDI4NzBUaW1lclFIYW5kbGUiLCAoUFZPSUQpJihwQWQtPlRpbWVyUUNvbXBsZXRlKSk7CisKKwlSVDI4NzBfVGltZXJRX0hhbmRsZShwQWQpOworCisJLyogbm90aWZ5IHRoZSBleGl0IHJvdXRpbmUgdGhhdCB3ZSdyZSBhY3R1YWxseSBleGl0aW5nIG5vdworCSAqCisJICogY29tcGxldGUoKS93YWl0X2Zvcl9jb21wbGV0aW9uKCkgaXMgc2ltaWxhciB0byB1cCgpL2Rvd24oKSwKKwkgKiBleGNlcHQgdGhhdCBjb21wbGV0ZSgpIGlzIHNhZmUgaW4gdGhlIGNhc2Ugd2hlcmUgdGhlIHN0cnVjdHVyZQorCSAqIGlzIGdldHRpbmcgZGVsZXRlZCBpbiBhIHBhcmFsbGVsIG1vZGUgb2YgZXhlY3V0aW9uIChpLmUuIGp1c3QKKwkgKiBhZnRlciB0aGUgZG93bigpIC0tIHRoYXQncyBuZWNlc3NhcnkgZm9yIHRoZSB0aHJlYWQtc2h1dGRvd24KKwkgKiBjYXNlLgorCSAqCisJICogY29tcGxldGVfYW5kX2V4aXQoKSBnb2VzIGV2ZW4gZnVydGhlciB0aGFuIHRoaXMgLS0gaXQgaXMgc2FmZSBpbgorCSAqIHRoZSBjYXNlIHRoYXQgdGhlIHRocmVhZCBvZiB0aGUgY2FsbGVyIGlzIGdvaW5nIGF3YXkgKG5vdCBqdXN0CisJICogdGhlIHN0cnVjdHVyZSkgLS0gdGhpcyBpcyBuZWNlc3NhcnkgZm9yIHRoZSBtb2R1bGUtcmVtb3ZlIGNhc2UuCisJICogVGhpcyBpcyBpbXBvcnRhbnQgaW4gcHJlZW1wdGlvbiBrZXJuZWxzLCB3aGljaCB0cmFuc2ZlciB0aGUgZmxvdworCSAqIG9mIGV4ZWN1dGlvbiBpbW1lZGlhdGVseSB1cG9uIGEgY29tcGxldGUoKS4KKwkgKi8KKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoICI8LS0tJXNcbiIsX19mdW5jX18pKTsKKworCXBPYmotPlRpbWVyUVRocl9waWQgPSBUSFJFQURfUElEX0lOSVRfVkFMVUU7CisKKwljb21wbGV0ZV9hbmRfZXhpdCgmcEFkLT5UaW1lclFDb21wbGV0ZSwgMCk7CisJcmV0dXJuIDA7CisKK30KKworCitSVDI4NzBfVElNRVJfRU5UUlkgKlJUMjg3MF9UaW1lclFfSW5zZXJ0KAorCUlOIFJUTVBfQURBUFRFUiAqcEFkLAorCUlOIFJBTElOS19USU1FUl9TVFJVQ1QgKnBUaW1lcikKK3sKKwlSVDI4NzBfVElNRVJfRU5UUlkgKnBRTm9kZSA9IE5VTEwsICpwUVRhaWw7CisJdW5zaWduZWQgbG9uZyBpcnFGbGFnczsKKworCisJUlRNUF9JUlFfTE9DSygmcEFkLT5UaW1lclFMb2NrLCBpcnFGbGFncyk7CisJaWYgKHBBZC0+VGltZXJRLnN0YXR1cyAmIFJUMjg3MF9USFJFQURfQ0FOX0RPX0lOU0VSVCkKKwl7CisJCWlmKHBBZC0+VGltZXJRLnBRUG9sbEZyZWVMaXN0KQorCQl7CisJCQlwUU5vZGUgPSBwQWQtPlRpbWVyUS5wUVBvbGxGcmVlTGlzdDsKKwkJCXBBZC0+VGltZXJRLnBRUG9sbEZyZWVMaXN0ID0gcFFOb2RlLT5wTmV4dDsKKworCQkJcFFOb2RlLT5wUmFUaW1lciA9IHBUaW1lcjsKKwkJCXBRTm9kZS0+cE5leHQgPSBOVUxMOworCisJCQlwUVRhaWwgPSBwQWQtPlRpbWVyUS5wUVRhaWw7CisJCQlpZiAocEFkLT5UaW1lclEucFFUYWlsICE9IE5VTEwpCisJCQkJcFFUYWlsLT5wTmV4dCA9IHBRTm9kZTsKKwkJCXBBZC0+VGltZXJRLnBRVGFpbCA9IHBRTm9kZTsKKwkJCWlmIChwQWQtPlRpbWVyUS5wUUhlYWQgPT0gTlVMTCkKKwkJCQlwQWQtPlRpbWVyUS5wUUhlYWQgPSBwUU5vZGU7CisJCX0KKwkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPlRpbWVyUUxvY2ssIGlycUZsYWdzKTsKKworCQlpZiAocFFOb2RlKQorCQkJdXAoJnBBZC0+UlRVU0JUaW1lcl9zZW1hcGhvcmUpOworCQkJLy93YWtlX3VwKCZ0aW1lcldhaXRRKTsKKwl9CisJZWxzZQorCXsKKwkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPlRpbWVyUUxvY2ssIGlycUZsYWdzKTsKKwl9CisJcmV0dXJuIHBRTm9kZTsKK30KKworCitCT09MRUFOIFJUMjg3MF9UaW1lclFfUmVtb3ZlKAorCUlOIFJUTVBfQURBUFRFUiAqcEFkLAorCUlOIFJBTElOS19USU1FUl9TVFJVQ1QgKnBUaW1lcikKK3sKKwlSVDI4NzBfVElNRVJfRU5UUlkgKnBOb2RlLCAqcFByZXYgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgaXJxRmxhZ3M7CisKKwlSVE1QX0lSUV9MT0NLKCZwQWQtPlRpbWVyUUxvY2ssIGlycUZsYWdzKTsKKwlpZiAocEFkLT5UaW1lclEuc3RhdHVzID49IFJUMjg3MF9USFJFQURfSU5JVEVEKQorCXsKKwkJcE5vZGUgPSBwQWQtPlRpbWVyUS5wUUhlYWQ7CisJCXdoaWxlIChwTm9kZSkKKwkJeworCQkJaWYgKHBOb2RlLT5wUmFUaW1lciA9PSBwVGltZXIpCisJCQkJYnJlYWs7CisJCQlwUHJldiA9IHBOb2RlOworCQkJcE5vZGUgPSBwTm9kZS0+cE5leHQ7CisJCX0KKworCQkvLyBOb3cgbW92ZSBpdCB0byBmcmVlTGlzdCBxdWV1ZS4KKwkJaWYgKHBOb2RlKQorCQl7CisJCQlpZiAocE5vZGUgPT0gcEFkLT5UaW1lclEucFFIZWFkKQorCQkJCXBBZC0+VGltZXJRLnBRSGVhZCA9IHBOb2RlLT5wTmV4dDsKKwkJCWlmIChwTm9kZSA9PSBwQWQtPlRpbWVyUS5wUVRhaWwpCisJCQkJcEFkLT5UaW1lclEucFFUYWlsID0gcFByZXY7CisJCQlpZiAocFByZXYgIT0gTlVMTCkKKwkJCQlwUHJldi0+cE5leHQgPSBwTm9kZS0+cE5leHQ7CisKKwkJCS8vIHJldHVybiB0aGlzIHF1ZXVlIGVudHJ5IHRvIHRpbWVyUUZyZWVMaXN0LgorCQkJcE5vZGUtPnBOZXh0ID0gcEFkLT5UaW1lclEucFFQb2xsRnJlZUxpc3Q7CisJCQlwQWQtPlRpbWVyUS5wUVBvbGxGcmVlTGlzdCA9IHBOb2RlOworCQl9CisJfQorCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5UaW1lclFMb2NrLCBpcnFGbGFncyk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworCit2b2lkIFJUMjg3MF9UaW1lclFfRXhpdChSVE1QX0FEQVBURVIgKnBBZCkKK3sKKwlSVDI4NzBfVElNRVJfRU5UUlkgKnBUaW1lclE7CisJdW5zaWduZWQgbG9uZyBpcnFGbGFnczsKKworCVJUTVBfSVJRX0xPQ0soJnBBZC0+VGltZXJRTG9jaywgaXJxRmxhZ3MpOworCXdoaWxlIChwQWQtPlRpbWVyUS5wUUhlYWQpCisJeworCQlwVGltZXJRID0gcEFkLT5UaW1lclEucFFIZWFkOworCQlwQWQtPlRpbWVyUS5wUUhlYWQgPSBwVGltZXJRLT5wTmV4dDsKKwkJLy8gcmVtb3ZlIHRoZSB0aW1lUQorCX0KKwlwQWQtPlRpbWVyUS5wUVBvbGxGcmVlTGlzdCA9IE5VTEw7CisJb3NfZnJlZV9tZW0ocEFkLCBwQWQtPlRpbWVyUS5wVGltZXJRUG9sbCk7CisJcEFkLT5UaW1lclEucFFUYWlsID0gTlVMTDsKKwlwQWQtPlRpbWVyUS5wUUhlYWQgPSBOVUxMOworCXBBZC0+VGltZXJRLnN0YXR1cyA9IFJUMjg3MF9USFJFQURfU1RPUEVEOworCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5UaW1lclFMb2NrLCBpcnFGbGFncyk7CisKK30KKworCit2b2lkIFJUMjg3MF9UaW1lclFfSW5pdChSVE1QX0FEQVBURVIgKnBBZCkKK3sKKwlpbnQgCWk7CisJUlQyODcwX1RJTUVSX0VOVFJZICpwUU5vZGUsICpwRW50cnk7CisJdW5zaWduZWQgbG9uZyBpcnFGbGFnczsKKworCU5kaXNBbGxvY2F0ZVNwaW5Mb2NrKCZwQWQtPlRpbWVyUUxvY2spOworCisJUlRNUF9JUlFfTE9DSygmcEFkLT5UaW1lclFMb2NrLCBpcnFGbGFncyk7CisJTmRpc1plcm9NZW1vcnkoJnBBZC0+VGltZXJRLCBzaXplb2YocEFkLT5UaW1lclEpKTsKKwkvL0ludGVybG9ja2VkRXhjaGFuZ2UoJnBBZC0+VGltZXJRLmNvdW50LCAwKTsKKworCS8qIEluaXRpYWxpc2UgdGhlIHdhaXQgcSBoZWFkICovCisJLy9pbml0X3dhaXRxdWV1ZV9oZWFkKCZ0aW1lcldhaXRRKTsKKworCW9zX2FsbG9jX21lbShwQWQsICZwQWQtPlRpbWVyUS5wVGltZXJRUG9sbCwgc2l6ZW9mKFJUMjg3MF9USU1FUl9FTlRSWSkgKiBUSU1FUl9RVUVVRV9TSVpFX01BWCk7CisJaWYgKHBBZC0+VGltZXJRLnBUaW1lclFQb2xsKQorCXsKKwkJcEVudHJ5ID0gTlVMTDsKKwkJcFFOb2RlID0gKFJUMjg3MF9USU1FUl9FTlRSWSAqKXBBZC0+VGltZXJRLnBUaW1lclFQb2xsOworCQlmb3IgKGkgPSAwIDtpIDxUSU1FUl9RVUVVRV9TSVpFX01BWDsgaSsrKQorCQl7CisJCQlwUU5vZGUtPnBOZXh0ID0gcEVudHJ5OworCQkJcEVudHJ5ID0gcFFOb2RlOworCQkJcFFOb2RlKys7CisJCX0KKwkJcEFkLT5UaW1lclEucFFQb2xsRnJlZUxpc3QgPSBwRW50cnk7CisJCXBBZC0+VGltZXJRLnBRSGVhZCA9IE5VTEw7CisJCXBBZC0+VGltZXJRLnBRVGFpbCA9IE5VTEw7CisJCXBBZC0+VGltZXJRLnN0YXR1cyA9IFJUMjg3MF9USFJFQURfSU5JVEVEOworCX0KKwlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+VGltZXJRTG9jaywgaXJxRmxhZ3MpOworfQorCisKK1ZPSUQgUlQyODcwX1dhdGNoRG9nKElOIFJUTVBfQURBUFRFUiAqcEFkKQoreworCVBIVF9UWF9DT05URVhUCQlwSFRUWENvbnRleHQ7CisJaW50IAkJCQkJaWR4OworCVVMT05HCQkJCWlycUZsYWdzOworCVBVUkIJCSAgIAkJcFVyYjsKKwlCT09MRUFOCQkJCW5lZWREdW1wU2VxID0gRkFMU0U7CisJVUlOVDMyICAgICAgICAgIAlNQUNWYWx1ZTsKKworCisJaWR4ID0gMDsKKwlSVE1QX0lPX1JFQUQzMihwQWQsIFRYUlhRX1BDTlQsICZNQUNWYWx1ZSk7CisJaWYgKChNQUNWYWx1ZSAmIDB4ZmYpICE9MCApCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJUWCBRVUVVRSAwIE5vdCBFTVBUWShWYWx1ZT0weCUweCkuICEhISEhISEhISEhISEhIVxuIiwgTUFDVmFsdWUpKTsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgUEJGX0NGRywgMHhmNDAwMTIpOworCQl3aGlsZSgoTUFDVmFsdWUgJjB4ZmYpICE9IDAgJiYgKGlkeCsrIDwgMTApKQorCQl7CisJCSAgICAgICAgUlRNUF9JT19SRUFEMzIocEFkLCBUWFJYUV9QQ05ULCAmTUFDVmFsdWUpOworCQkgICAgICAgIE5kaXNNU2xlZXAoMSk7CisJCX0KKwkJUlRNUF9JT19XUklURTMyKHBBZCwgUEJGX0NGRywgMHhmNDAwMDYpOworCX0KKworCWlkeCA9IDA7CisJaWYgKChNQUNWYWx1ZSAmIDB4ZmYwMCkgIT0wICkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlRYIFFVRVVFIDEgTm90IEVNUFRZKFZhbHVlPTB4JTB4KS4gISEhISEhISEhISEhISEhXG4iLCBNQUNWYWx1ZSkpOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBQQkZfQ0ZHLCAweGY0MDAwYSk7CisJCXdoaWxlKChNQUNWYWx1ZSAmMHhmZjAwKSAhPSAwICYmIChpZHgrKyA8IDEwKSkKKwkJeworCQkJUlRNUF9JT19SRUFEMzIocEFkLCBUWFJYUV9QQ05ULCAmTUFDVmFsdWUpOworCQkJTmRpc01TbGVlcCgxKTsKKwkJfQorCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBQQkZfQ0ZHLCAweGY0MDAwNik7CisJfQorCisKKwlpZiAocEFkLT53YXRjaERvZ1J4T3ZlckZsb3dDbnQgPj0gMikKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1heWJlIHRoZSBSeCBCdWxrLUluIGhhbmdlZCEgQ2FuY2VsIHRoZSBwZW5kaW5nIFJ4IGJ1bGtzIHJlcXVlc3QhXG4iKSk7CisJCWlmICgoIVJUTVBfVEVTVF9GTEFHKHBBZCwgKGZSVE1QX0FEQVBURVJfUkVTRVRfSU5fUFJPR1JFU1MgfAorCQkJCQkJCQkJZlJUTVBfQURBUFRFUl9CVUxLSU5fUkVTRVQgfAorCQkJCQkJCQkJZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwKKwkJCQkJCQkJCWZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpKSkKKwkJeworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ2FsbCBDTURUSFJFQURfUkVTRVRfQlVMS19JTiB0byBjYW5jZWwgdGhlIHBlbmRpbmcgUnggQnVsayFcbiIpKTsKKwkJCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JVTEtJTl9SRVNFVCk7CisJCQlSVFVTQkVucXVldWVJbnRlcm5hbENtZChwQWQsIENNRFRIUkVBRF9SRVNFVF9CVUxLX0lOLCBOVUxMLCAwKTsKKwkJCW5lZWREdW1wU2VxID0gVFJVRTsKKwkJfQorCQlwQWQtPndhdGNoRG9nUnhPdmVyRmxvd0NudCA9IDA7CisJfQorCisKKwlmb3IgKGlkeCA9IDA7IGlkeCA8IE5VTV9PRl9UWF9SSU5HOyBpZHgrKykKKwl7CisJCXBVcmIgPSBOVUxMOworCisJCVJUTVBfSVJRX0xPQ0soJnBBZC0+QnVsa091dExvY2tbaWR4XSwgaXJxRmxhZ3MpOworCQlpZiAoKHBBZC0+QnVsa091dFBlbmRpbmdbaWR4XSA9PSBUUlVFKSAmJiBwQWQtPndhdGNoRG9nVHhQZW5kaW5nQ250KQorCQl7CisJCQlwQWQtPndhdGNoRG9nVHhQZW5kaW5nQ250W2lkeF0rKzsKKworCQkJaWYgKChwQWQtPndhdGNoRG9nVHhQZW5kaW5nQ250W2lkeF0gPiAyKSAmJgorCQkJCSAoIVJUTVBfVEVTVF9GTEFHKHBBZCwgKGZSVE1QX0FEQVBURVJfUkVTRVRfSU5fUFJPR1JFU1MgfCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QgfCBmUlRNUF9BREFQVEVSX0JVTEtPVVRfUkVTRVQpKSkKKwkJCQkpCisJCQl7CisJCQkJLy8gRklYTUU6IEZvbGxvd2luZyBjb2RlIGp1c3Qgc3VwcG9ydCBzaW5nbGUgYnVsayBvdXQuIElmIHlvdSB3YW5uYSBzdXBwb3J0IG11bHRpcGxlIGJ1bGsgb3V0LiBNb2RpZnkgaXQhCisJCQkJcEhUVFhDb250ZXh0ID0gKFBIVF9UWF9DT05URVhUKSgmcEFkLT5UeENvbnRleHRbaWR4XSk7CisJCQkJaWYgKHBIVFRYQ29udGV4dC0+SVJQUGVuZGluZykKKwkJCQl7CS8vIENoZWNrIFR4Q29udGV4dC4KKwkJCQkJcFVyYiA9IHBIVFRYQ29udGV4dC0+cFVyYjsKKwkJCQl9CisJCQkJZWxzZSBpZiAoaWR4ID09IE1HTVRQSVBFSURYKQorCQkJCXsKKwkJCQkJUFRYX0NPTlRFWFQgcE1MTUVDb250ZXh0LCBwTlVMTENvbnRleHQsIHBQc1BvbGxDb250ZXh0OworCisJCQkJCS8vQ2hlY2sgTWdtdENvbnRleHQuCisJCQkJCXBNTE1FQ29udGV4dCA9IChQVFhfQ09OVEVYVCkocEFkLT5NZ210UmluZy5DZWxsW3BBZC0+TWdtdFJpbmcuVHhEbWFJZHhdLkFsbG9jVmEpOworCQkJCQlwUHNQb2xsQ29udGV4dCA9IChQVFhfQ09OVEVYVCkoJnBBZC0+UHNQb2xsQ29udGV4dCk7CisJCQkJCXBOVUxMQ29udGV4dCA9IChQVFhfQ09OVEVYVCkoJnBBZC0+TnVsbENvbnRleHQpOworCisJCQkJCWlmIChwTUxNRUNvbnRleHQtPklSUFBlbmRpbmcpCisJCQkJCXsKKwkJCQkJCUFTU0VSVChwTUxNRUNvbnRleHQtPklSUFBlbmRpbmcpOworCQkJCQkJcFVyYiA9IHBNTE1FQ29udGV4dC0+cFVyYjsKKwkJCQkJfQorCQkJCQllbHNlIGlmIChwTlVMTENvbnRleHQtPklSUFBlbmRpbmcpCisJCQkJCXsKKwkJCQkJCUFTU0VSVChwTlVMTENvbnRleHQtPklSUFBlbmRpbmcpOworCQkJCQkJcFVyYiA9IHBOVUxMQ29udGV4dC0+cFVyYjsKKwkJCQkJfQorCQkJCQllbHNlIGlmIChwUHNQb2xsQ29udGV4dC0+SVJQUGVuZGluZykKKwkJCQkJeworCQkJCQkJQVNTRVJUKHBQc1BvbGxDb250ZXh0LT5JUlBQZW5kaW5nKTsKKwkJCQkJCXBVcmIgPSBwUHNQb2xsQ29udGV4dC0+cFVyYjsKKwkJCQkJfQorCQkJCX0KKworCQkJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5CdWxrT3V0TG9ja1tpZHhdLCBpcnFGbGFncyk7CisKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNYXliZSB0aGUgVHggQnVsay1PdXQgaGFuZ2VkISBDYW5jZWwgdGhlIHBlbmRpbmcgVHggYnVsa3MgcmVxdWVzdCBvZiBpZHgoJWQpIVxuIiwgaWR4KSk7CisJCQkJaWYgKHBVcmIpCisJCQkJeworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJVbmxpbmsgdGhlIHBlbmRpbmcgVVJCIVxuIikpOworCQkJCQkvLyB1bmxpbmsgaXQgbm93CisJCQkJCVJUVVNCX1VOTElOS19VUkIocFVyYik7CisJCQkJCS8vIFNsZWVwIDIwMCBtaWNyb3NlY29uZHMgdG8gZ2l2ZSBjYW5jZWxsYXRpb24gdGltZSB0byB3b3JrCisJCQkJCVJUTVB1c2VjRGVsYXkoMjAwKTsKKwkJCQkJbmVlZER1bXBTZXEgPSBUUlVFOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJVbmtvbncgYnVsa091dCBVUkIgbWF5YmUgaGFuZ2VkISEhISEhISEhISEhXG4iKSk7CisJCQkJfQorCQkJfQorCQkJZWxzZQorCQkJeworCQkJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5CdWxrT3V0TG9ja1tpZHhdLCBpcnFGbGFncyk7CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+QnVsa091dExvY2tbaWR4XSwgaXJxRmxhZ3MpOworCQl9CisJfQorCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJLy8gRm9yIFNpZ21hIGRlYnVnLCBkdW1wIHRoZSBiYV9yZW9yZGVyaW5nIHNlcXVlbmNlLgorCWlmKChuZWVkRHVtcFNlcSA9PSBUUlVFKSAmJiAocEFkLT5Db21tb25DZmcuYkRpc2FibGVSZW9yZGVyaW5nID09IDApKQorCXsKKwkJVVNIT1JUCQkJCUlkeDsKKwkJUEJBX1JFQ19FTlRSWQkJcEJBRW50cnkgPSBOVUxMOworCQlVQ0hBUgkJCQljb3VudCA9IDA7CisJCXN0cnVjdCByZW9yZGVyaW5nX21wZHUgKm1wZHVfYmxrOworCisJCUlkeCA9IHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQkFSZWNXY2lkQXJyYXlbMF07CisKKwkJcEJBRW50cnkgPSAmcEFkLT5CQVRhYmxlLkJBUmVjRW50cnlbSWR4XTsKKwkJaWYoKHBCQUVudHJ5LT5saXN0LnFsZW4gPiAwKSAmJiAocEJBRW50cnktPmxpc3QubmV4dCAhPSBOVUxMKSkKKwkJeworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTklDVXBkYXRlUmF3Q291bnRlcnMoKTpUaGUgUXVldWVpbmcgcGt0IGluIHJlb3JkZXJpbmcgYnVmZmVyOlxuIikpOworCQkJTmRpc0FjcXVpcmVTcGluTG9jaygmcEJBRW50cnktPlJ4UmVSaW5nTG9jayk7CisJCQltcGR1X2JsayA9IHBCQUVudHJ5LT5saXN0Lm5leHQ7CisJCQl3aGlsZSAobXBkdV9ibGspCisJCQl7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiXHQlZDpTZXEtJWQsIGJBTVNEVS0lZCFcbiIsIGNvdW50LCBtcGR1X2Jsay0+U2VxdWVuY2UsIG1wZHVfYmxrLT5iQU1TRFUpKTsKKwkJCQltcGR1X2JsayA9IG1wZHVfYmxrLT5uZXh0OworCQkJCWNvdW50Kys7CisJCQl9CisKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlxucEJBRW50cnktPkxhc3RJbmRTZXE9JWQhXG4iLCBwQkFFbnRyeS0+TGFzdEluZFNlcSkpOworCQkJTmRpc1JlbGVhc2VTcGluTG9jaygmcEJBRW50cnktPlJ4UmVSaW5nTG9jayk7CisJCX0KKwl9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCit9CisKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1JvdXRpbmUgRGVzY3JpcHRpb246CisgICAgUmVsZWFzZSBhbGxvY2F0ZWQgcmVzb3VyY2VzLgorCitBcmd1bWVudHM6CisgICAgKmRldgkJCQlQb2ludCB0byB0aGUgUENJIG9yIFVTQiBkZXZpY2UKKwlwQWQJCQkJCWRyaXZlciBjb250cm9sIGJsb2NrIHBvaW50ZXIKKworUmV0dXJuIFZhbHVlOgorICAgIE5vbmUKKworTm90ZToKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK3N0YXRpYyB2b2lkIF9ydHVzYl9kaXNjb25uZWN0KHN0cnVjdCB1c2JfZGV2aWNlICpkZXYsIFBSVE1QX0FEQVBURVIgcEFkKQoreworCXN0cnVjdCBuZXRfZGV2aWNlCSpuZXRfZGV2ID0gTlVMTDsKKworCisJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgicnR1c2JfZGlzY29ubmVjdDogdW5yZWdpc3RlciB1c2JuZXQgdXNiLSVzLSVzXG4iLAorCQkJCWRldi0+YnVzLT5idXNfbmFtZSwgZGV2LT5kZXZwYXRoKSk7CisJaWYgKCFwQWQpCisJeworI2lmZGVmIE1VTFRJUExFX0NBUkRfU1VQUE9SVAorCQlpZiAoKHBBZC0+TUNfUm93SUQgPj0gMCkgJiYgKHBBZC0+TUNfUm93SUQgPD0gTUFYX05VTV9PRl9NVUxUSVBMRV9DQVJEKSkKKwkJCU1DX0NhcmRVc2VkW3BBZC0+TUNfUm93SURdID0gMDsgLy8gbm90IGNsZWFyIE1BQyBhZGRyZXNzCisjZW5kaWYgLy8gTVVMVElQTEVfQ0FSRF9TVVBQT1JUIC8vCisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkJLyoga2VybmVsIDIuNCBzZXJpZXMgKi8KKwkJd2hpbGUoTU9EX0lOX1VTRSA+IDApCisJCXsKKwkJCU1PRF9ERUNfVVNFX0NPVU5UOworCQl9CisjZWxzZQorCQl1c2JfcHV0X2RldihkZXYpOworI2VuZGlmIC8vIExJTlVYX1ZFUlNJT05fQ09ERSAvLworCisJCXByaW50aygicnR1c2JfZGlzY29ubmVjdDogcEFkID09IE5VTEwhXG4iKTsKKwkJcmV0dXJuOworCX0KKwlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKTsKKworCisKKwkvLyBmb3IgZGVidWcsIHdhaXQgdG8gc2hvdyBzb21lIG1lc3NhZ2VzIHRvIC9wcm9jIHN5c3RlbQorCXVkZWxheSgxKTsKKworCisKKworCW5ldF9kZXYgPSBwQWQtPm5ldF9kZXY7CisJaWYgKHBBZC0+bmV0X2RldiAhPSBOVUxMKQorCXsKKwkJcHJpbnRrKCJydHVzYl9kaXNjb25uZWN0OiB1bnJlZ2lzdGVyX25ldGRldigpLCBkZXYtPm5hbWU9JXMhXG4iLCBuZXRfZGV2LT5uYW1lKTsKKwkJdW5yZWdpc3Rlcl9uZXRkZXYgKHBBZC0+bmV0X2Rldik7CisJfQorCXVkZWxheSgxKTsKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkJLyoga2VybmVsIDIuNCBzZXJpZXMgKi8KKyNlbHNlCisJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKKyNlbmRpZiAvLyBMSU5VWF9WRVJTSU9OX0NPREUgLy8KKwl1ZGVsYXkoMSk7CisKKwkvLyBmcmVlIG5ldF9kZXZpY2UgbWVtb3J5CisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDApCS8qIGtlcm5lbCAyLjQgc2VyaWVzICovCisJa2ZyZWUobmV0X2Rldik7CisjZWxzZQorCWZyZWVfbmV0ZGV2KG5ldF9kZXYpOworI2VuZGlmIC8vIExJTlVYX1ZFUlNJT05fQ09ERSAvLworCisJLy8gZnJlZSBhZGFwdGVyIG1lbW9yeQorCVJUTVBGcmVlQWRhcHRlcihwQWQpOworCisJLy8gcmVsZWFzZSBhIHVzZSBvZiB0aGUgdXNiIGRldmljZSBzdHJ1Y3R1cmUKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkJLyoga2VybmVsIDIuNCBzZXJpZXMgKi8KKwl3aGlsZShNT0RfSU5fVVNFID4gMCkKKwl7CisJCU1PRF9ERUNfVVNFX0NPVU5UOworCX0KKyNlbHNlCisJdXNiX3B1dF9kZXYoZGV2KTsKKyNlbmRpZiAvLyBMSU5VWF9WRVJTSU9OX0NPREUgLy8KKwl1ZGVsYXkoMSk7CisKKwlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIgUlRVU0IgZGlzY29ubmVjdCBzdWNjZXNzZnVsbHlcbiIpKTsKK30KKworCisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgIFByb2JlIFJUMjhYWCBjaGlwc2V0LgorCitBcmd1bWVudHM6CisgICAgKmRldgkJCQlQb2ludCB0byB0aGUgUENJIG9yIFVTQiBkZXZpY2UKKwlpbnRlcmZhY2UKKwkqaWRfdGFibGUJCQlQb2ludCB0byB0aGUgUENJIG9yIFVTQiBkZXZpY2UgSUQKKworUmV0dXJuIFZhbHVlOgorICAgIE5vbmUKKworTm90ZToKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkJLyoga2VybmVsIDIuNCBzZXJpZXMgKi8KK3N0YXRpYyB2b2lkICpydHVzYl9wcm9iZShzdHJ1Y3QgdXNiX2RldmljZSAqZGV2LCBVSU5UIGludGVyZmFjZSwKKwkJCQkJCWNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKK3sKKwlQUlRNUF9BREFQVEVSIHBBZDsKKwlydDI4eHhfcHJvYmUoKHZvaWQgKilkZXYsICh2b2lkICopaWQsIGludGVyZmFjZSwgJnBBZCk7CisJcmV0dXJuICh2b2lkICopcEFkOworfQorCisvL0Rpc2Nvbm5lY3QgZnVuY3Rpb24gaXMgY2FsbGVkIHdpdGhpbiBleGl0IHJvdXRpbmUKK3N0YXRpYyB2b2lkIHJ0dXNiX2Rpc2Nvbm5lY3Qoc3RydWN0IHVzYl9kZXZpY2UgKmRldiwgdm9pZCAqcHRyKQoreworCV9ydHVzYl9kaXNjb25uZWN0KGRldiwgKChQUlRNUF9BREFQVEVSKXB0cikpOworfQorCisjZWxzZQkvKiBrZXJuZWwgMi42IHNlcmllcyAqLworc3RhdGljIGludCBydHVzYl9wcm9iZSAoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsCisJCQkJCQljb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCit7CisJUFJUTVBfQURBUFRFUiBwQWQ7CisJcmV0dXJuIChpbnQpcnQyOHh4X3Byb2JlKCh2b2lkICopaW50ZiwgKHZvaWQgKilpZCwgMCwgJnBBZCk7Cit9CisKKworc3RhdGljIHZvaWQgcnR1c2JfZGlzY29ubmVjdChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKK3sKKwlzdHJ1Y3QgdXNiX2RldmljZSAgICpkZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpOworCVBSVE1QX0FEQVBURVIgICAgICAgcEFkOworCisKKwlwQWQgPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOworCXVzYl9zZXRfaW50ZmRhdGEoaW50ZiwgTlVMTCk7CisKKwlfcnR1c2JfZGlzY29ubmVjdChkZXYsIHBBZCk7Cit9CisjZW5kaWYgLy8gTElOVVhfVkVSU0lPTl9DT0RFIC8vCisKKworLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICBDbG9zZSBrZXJuZWwgdGhyZWFkcy4KKworQXJndW1lbnRzOgorCSpwQWQJCQkJdGhlIHJheHggaW50ZXJmYWNlIGRhdGEgcG9pbnRlcgorCitSZXR1cm4gVmFsdWU6CisgICAgTk9ORQorCitOb3RlOgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBSVDI4eHhUaHJlYWRUZXJtaW5hdGUoCisJSU4gUlRNUF9BREFQVEVSICpwQWQpCit7CisJUE9TX0NPT0tJRQlwT2JqID0gKFBPU19DT09LSUUpIHBBZC0+T1NfQ29va2llOworCUlOVAkJCXJldDsKKworCisJLy8gU2xlZXAgNTAgbWlsbGlzZWNvbmRzIHNvIHBlbmRpbmcgaW8gbWlnaHQgZmluaXNoIG5vcm1hbGx5CisJUlRNUHVzZWNEZWxheSg1MDAwMCk7CisKKwkvLyBXZSB3YW50IHRvIHdhaXQgdW50aWwgYWxsIHBlbmRpbmcgcmVjZWl2ZXMgYW5kIHNlbmRzIHRvIHRoZQorCS8vIGRldmljZSBvYmplY3QuIFdlIGNhbmNlbCBhbnkKKwkvLyBpcnBzLiBXYWl0IHVudGlsIHNlbmRzIGFuZCByZWNlaXZlcyBoYXZlIHN0b3BwZWQuCisJUlRVU0JDYW5jZWxQZW5kaW5nSVJQcyhwQWQpOworCisJLy8gVGVybWluYXRlIFRocmVhZHMKKwlDSEVDS19QSURfTEVHQUxJVFkocE9iai0+VGltZXJRVGhyX3BpZCkKKwl7CisJCVBPU19DT09LSUUgcE9iaiA9IChQT1NfQ09PS0lFKXBBZC0+T1NfQ29va2llOworCisJCXByaW50aygiVGVybWluYXRlIHRoZSBUaW1lclFUaHJfcGlkPSVkIVxuIiwgR0VUX1BJRF9OVU1CRVIocE9iai0+VGltZXJRVGhyX3BpZCkpOworCQltYigpOworCQlwQWQtPlRpbWVyRnVuY19raWxsID0gMTsKKwkJbWIoKTsKKwkJcmV0ID0gS0lMTF9USFJFQURfUElEKHBPYmotPlRpbWVyUVRocl9waWQsIFNJR1RFUk0sIDEpOworCQlpZiAocmV0KQorCQl7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogdW5hYmxlIHRvIHN0b3AgVGltZXJRVGhyZWFkLCBwaWQ9JWQsIHJldD0lZCFcbiIsCisJCQkJCXBBZC0+bmV0X2Rldi0+bmFtZSwgR0VUX1BJRF9OVU1CRVIocE9iai0+VGltZXJRVGhyX3BpZCksIHJldCk7CisJCX0KKwkJZWxzZQorCQl7CisJCQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZwQWQtPlRpbWVyUUNvbXBsZXRlKTsKKwkJCXBPYmotPlRpbWVyUVRocl9waWQgPSBUSFJFQURfUElEX0lOSVRfVkFMVUU7CisJCX0KKwl9CisKKwlDSEVDS19QSURfTEVHQUxJVFkocE9iai0+TUxNRVRocl9waWQpCisJeworCQlwcmludGsoIlRlcm1pbmF0ZSB0aGUgTUxNRVRocl9waWQ9JWQhXG4iLCBHRVRfUElEX05VTUJFUihwT2JqLT5NTE1FVGhyX3BpZCkpOworCQltYigpOworCQlwQWQtPm1sbWVfa2lsbCA9IDE7CisJCS8vUlQyOFhYX01MTUVfSEFORExFUihwQWQpOworCQltYigpOworCQlyZXQgPSBLSUxMX1RIUkVBRF9QSUQocE9iai0+TUxNRVRocl9waWQsIFNJR1RFUk0sIDEpOworCQlpZiAocmV0KQorCQl7CisJCQlwcmludGsgKEtFUk5fV0FSTklORyAiJXM6IHVuYWJsZSB0byBNbG1lIHRocmVhZCwgcGlkPSVkLCByZXQ9JWQhXG4iLAorCQkJCQlwQWQtPm5ldF9kZXYtPm5hbWUsIEdFVF9QSURfTlVNQkVSKHBPYmotPk1MTUVUaHJfcGlkKSwgcmV0KTsKKwkJfQorCQllbHNlCisJCXsKKwkJCS8vd2FpdF9mb3JfY29tcGxldGlvbiAoJnBBZC0+bm90aWZ5KTsKKwkJCXdhaXRfZm9yX2NvbXBsZXRpb24gKCZwQWQtPm1sbWVDb21wbGV0ZSk7CisJCQlwT2JqLT5NTE1FVGhyX3BpZCA9IFRIUkVBRF9QSURfSU5JVF9WQUxVRTsKKwkJfQorCX0KKworCUNIRUNLX1BJRF9MRUdBTElUWShwT2JqLT5SVFVTQkNtZFRocl9waWQpCisJeworCQlwcmludGsoIlRlcm1pbmF0ZSB0aGUgUlRVU0JDbWRUaHJfcGlkPSVkIVxuIiwgR0VUX1BJRF9OVU1CRVIocE9iai0+UlRVU0JDbWRUaHJfcGlkKSk7CisJCW1iKCk7CisJCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+Q21kUUxvY2spOworCQlwQWQtPkNtZFEuQ21kUVN0YXRlID0gUlQyODcwX1RIUkVBRF9TVE9QRUQ7CisJCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+Q21kUUxvY2spOworCQltYigpOworCQkvL1JUVVNCQ01EVXAocEFkKTsKKwkJcmV0ID0gS0lMTF9USFJFQURfUElEKHBPYmotPlJUVVNCQ21kVGhyX3BpZCwgU0lHVEVSTSwgMSk7CisJCWlmIChyZXQpCisJCXsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiB1bmFibGUgdG8gUlRVU0JDbWQgdGhyZWFkLCBwaWQ9JWQsIHJldD0lZCFcbiIsCisJCQkJCXBBZC0+bmV0X2Rldi0+bmFtZSwgR0VUX1BJRF9OVU1CRVIocE9iai0+UlRVU0JDbWRUaHJfcGlkKSwgcmV0KTsKKwkJfQorCQllbHNlCisJCXsKKwkJCS8vd2FpdF9mb3JfY29tcGxldGlvbiAoJnBBZC0+bm90aWZ5KTsKKwkJCXdhaXRfZm9yX2NvbXBsZXRpb24gKCZwQWQtPkNtZFFDb21wbGV0ZSk7CisJCQlwT2JqLT5SVFVTQkNtZFRocl9waWQgPSBUSFJFQURfUElEX0lOSVRfVkFMVUU7CisJfQorCX0KKworCisJLy8gS2lsbCB0YXNrbGV0cworCXBBZC0+bWxtZV9raWxsID0gMDsKKwlwQWQtPkNtZFEuQ21kUVN0YXRlID0gUlQyODcwX1RIUkVBRF9VTktOT1dOOworCXBBZC0+VGltZXJGdW5jX2tpbGwgPSAwOworfQorCisKK3ZvaWQga2lsbF90aHJlYWRfdGFzayhJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlQT1NfQ09PS0lFIHBPYmo7CisKKwlwT2JqID0gKFBPU19DT09LSUUpIHBBZC0+T1NfQ29va2llOworCisJdGFza2xldF9raWxsKCZwT2JqLT5yeF9kb25lX3Rhc2spOworCXRhc2tsZXRfa2lsbCgmcE9iai0+bWdtdF9kbWFfZG9uZV90YXNrKTsKKwl0YXNrbGV0X2tpbGwoJnBPYmotPmFjMF9kbWFfZG9uZV90YXNrKTsKKwl0YXNrbGV0X2tpbGwoJnBPYmotPmFjMV9kbWFfZG9uZV90YXNrKTsKKwl0YXNrbGV0X2tpbGwoJnBPYmotPmFjMl9kbWFfZG9uZV90YXNrKTsKKwl0YXNrbGV0X2tpbGwoJnBPYmotPmFjM19kbWFfZG9uZV90YXNrKTsKKwl0YXNrbGV0X2tpbGwoJnBPYmotPmhjY2FfZG1hX2RvbmVfdGFzayk7CisJdGFza2xldF9raWxsKCZwT2JqLT50YnR0X3Rhc2spOworCit9CisKKworLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICBDaGVjayB0aGUgY2hpcHNldCB2ZW5kb3IvcHJvZHVjdCBJRC4KKworQXJndW1lbnRzOgorICAgIF9kZXZfcAkJCQlQb2ludCB0byB0aGUgUENJIG9yIFVTQiBkZXZpY2UKKworUmV0dXJuIFZhbHVlOgorICAgIFRSVUUJCQkJQ2hlY2sgb2sKKwlGQUxTRQkJCQlDaGVjayBmYWlsCisKK05vdGU6Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitCT09MRUFOIFJUMjhYWENoaXBzZXRDaGVjaygKKwlJTiB2b2lkICpfZGV2X3ApCit7CisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDApCS8qIGtlcm5lbCAyLjQgc2VyaWVzICovCisJc3RydWN0IHVzYl9kZXZpY2UgKmRldl9wID0gKHN0cnVjdCB1c2JfZGV2aWNlICopX2Rldl9wOworI2Vsc2UKKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiA9IChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqKV9kZXZfcDsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqZGV2X3AgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpOworI2VuZGlmIC8vIExJTlVYX1ZFUlNJT05fQ09ERSAvLworCVVJTlQzMiBpOworCisKKwlmb3IoaT0wOyBpPHJ0dXNiX3VzYl9pZF9sZW47IGkrKykKKwl7CisJCWlmIChkZXZfcC0+ZGVzY3JpcHRvci5pZFZlbmRvciA9PSBydHVzYl91c2JfaWRbaV0uaWRWZW5kb3IgJiYKKwkJCWRldl9wLT5kZXNjcmlwdG9yLmlkUHJvZHVjdCA9PSBydHVzYl91c2JfaWRbaV0uaWRQcm9kdWN0KQorCQl7CisJCQlwcmludGsoInJ0Mjg3MDogaWRWZW5kb3IgPSAweCV4LCBpZFByb2R1Y3QgPSAweCV4XG4iLAorCQkJCQlkZXZfcC0+ZGVzY3JpcHRvci5pZFZlbmRvciwgZGV2X3AtPmRlc2NyaXB0b3IuaWRQcm9kdWN0KTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKGkgPT0gcnR1c2JfdXNiX2lkX2xlbikKKwl7CisJCXByaW50aygicnQyODcwOiBFcnJvciEgRGV2aWNlIERlc2NyaXB0b3Igbm90IG1hdGNoaW5nIVxuIik7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlyZXR1cm4gVFJVRTsKK30KKworCisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgIEluaXQgbmV0IGRldmljZSBzdHJ1Y3R1cmUuCisKK0FyZ3VtZW50czoKKyAgICBfZGV2X3AJCQkJUG9pbnQgdG8gdGhlIFBDSSBvciBVU0IgZGV2aWNlCisgICAgKm5ldF9kZXYJCQlQb2ludCB0byB0aGUgbmV0IGRldmljZQorCSpwQWQJCQkJdGhlIHJheHggaW50ZXJmYWNlIGRhdGEgcG9pbnRlcgorCitSZXR1cm4gVmFsdWU6CisgICAgVFJVRQkJCQlJbml0IG9rCisJRkFMU0UJCQkJSW5pdCBmYWlsCisKK05vdGU6Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitCT09MRUFOIFJUMjhYWE5ldERldkluaXQoCisJSU4gdm9pZCAJCQkJKl9kZXZfcCwKKwlJTiBzdHJ1Y3QgIG5ldF9kZXZpY2UJKm5ldF9kZXYsCisJSU4gUlRNUF9BREFQVEVSIAkJKnBBZCkKK3sKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkJLyoga2VybmVsIDIuNCBzZXJpZXMgKi8KKwlzdHJ1Y3QgdXNiX2RldmljZSAqZGV2X3AgPSAoc3RydWN0IHVzYl9kZXZpY2UgKilfZGV2X3A7CisjZWxzZQorCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmID0gKHN0cnVjdCB1c2JfaW50ZXJmYWNlICopX2Rldl9wOworCXN0cnVjdCB1c2JfZGV2aWNlICpkZXZfcCA9IGludGVyZmFjZV90b191c2JkZXYoaW50Zik7CisjZW5kaWYgLy8gTElOVVhfVkVSU0lPTl9DT0RFIC8vCisKKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQkvKiBrZXJuZWwgMi40IHNlcmllcyAqLworCXBBZC0+Y29uZmlnID0gZGV2X3AtPmNvbmZpZzsKKyNlbHNlCisJcEFkLT5jb25maWcgPSAmZGV2X3AtPmNvbmZpZy0+ZGVzYzsKKyNlbmRpZiAvLyBMSU5VWF9WRVJTSU9OX0NPREUgLy8KKwlyZXR1cm4gVFJVRTsKK30KKworCisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgIEluaXQgbmV0IGRldmljZSBzdHJ1Y3R1cmUuCisKK0FyZ3VtZW50czoKKyAgICBfZGV2X3AJCQkJUG9pbnQgdG8gdGhlIFBDSSBvciBVU0IgZGV2aWNlCisJKnBBZAkJCQl0aGUgcmF4eCBpbnRlcmZhY2UgZGF0YSBwb2ludGVyCisKK1JldHVybiBWYWx1ZToKKyAgICBUUlVFCQkJCUNvbmZpZyBvaworCUZBTFNFCQkJCUNvbmZpZyBmYWlsCisKK05vdGU6Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDApCitCT09MRUFOIFJUMjhYWFByb2JlUG9zdENvbmZpZygKKwlJTiB2b2lkIAkJCQkqX2Rldl9wLAorCUlOIFJUTVBfQURBUFRFUiAJCSpwQWQsCisJSU4gSU5UMzIJCQkJaW50ZXJmYWNlKQoreworCXN0cnVjdCB1c2JfZGV2aWNlICpkZXZfcCA9IChzdHJ1Y3QgdXNiX2RldmljZSAqKV9kZXZfcDsKKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZjsKKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZV9kZXNjcmlwdG9yICppZmFjZV9kZXNjOworCXN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZW5kcG9pbnQ7CisJVUxPTkcgQnVsa091dElkeDsKKwlVSU5UMzIgaTsKKworCisJLyogZ2V0IHRoZSBhY3RpdmUgaW50ZXJmYWNlIGRlc2NyaXB0b3IgKi8KKwlpbnRmID0gJmRldl9wLT5hY3Rjb25maWctPmludGVyZmFjZVtpbnRlcmZhY2VdOworCWlmYWNlX2Rlc2MgPSAmaW50Zi0+YWx0c2V0dGluZ1swXTsKKworCS8qIGdldCAjIG9mIGVucG9pbnRzICovCisJcEFkLT5OdW1iZXJPZlBpcGVzID0gaWZhY2VfZGVzYy0+Yk51bUVuZHBvaW50czsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJOdW1FbmRwb2ludHM9JWRcbiIsIGlmYWNlX2Rlc2MtPmJOdW1FbmRwb2ludHMpKTsKKworCS8qIENvbmZpZ3VyZSBQaXBlcyAqLworCWVuZHBvaW50ID0gJmlmYWNlX2Rlc2MtPmVuZHBvaW50WzBdOworCUJ1bGtPdXRJZHggPSAwOworCisJZm9yKGk9MDsgaTxwQWQtPk51bWJlck9mUGlwZXM7IGkrKykKKwl7CisJCWlmICgoZW5kcG9pbnRbaV0uYm1BdHRyaWJ1dGVzID09IFVTQl9FTkRQT0lOVF9YRkVSX0JVTEspICYmCisJCQkoKGVuZHBvaW50W2ldLmJFbmRwb2ludEFkZHJlc3MgJiBVU0JfRU5EUE9JTlRfRElSX01BU0spID09IFVTQl9ESVJfSU4pKQorCQl7CisJCQlwQWQtPkJ1bGtJbkVwQWRkciA9IGVuZHBvaW50W2ldLmJFbmRwb2ludEFkZHJlc3M7CisJCQlwQWQtPkJ1bGtJbk1heFBhY2tldFNpemUgPSBlbmRwb2ludFtpXS53TWF4UGFja2V0U2l6ZTsKKworCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLAorCQkJCSgiQlVMSyBJTiBNYXhpbXVtUGFja2V0U2l6ZSA9ICVkXG4iLCBwQWQtPkJ1bGtJbk1heFBhY2tldFNpemUpKTsKKwkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwKKwkJCQkoIkVQIGFkZHJlc3MgPSAweCUyeCAgXG4iLCBlbmRwb2ludFtpXS5iRW5kcG9pbnRBZGRyZXNzKSk7CisJCX0KKwkJZWxzZSBpZiAoKGVuZHBvaW50W2ldLmJtQXR0cmlidXRlcyA9PSBVU0JfRU5EUE9JTlRfWEZFUl9CVUxLKSAmJgorCQkJCSgoZW5kcG9pbnRbaV0uYkVuZHBvaW50QWRkcmVzcyAmIFVTQl9FTkRQT0lOVF9ESVJfTUFTSykgPT0gVVNCX0RJUl9PVVQpKQorCQl7CisJCQkvLyBUaGVyZSBhcmUgNiBidWxrIG91dCBFUC4gRVA2IGhpZ2hlc3QgcHJpb3JpdHkuCisJCQkvLyBFUDEtNCBpcyBFRENBLiAgRVA1IGlzIEhDQ0EuCisJCQlwQWQtPkJ1bGtPdXRFcEFkZHJbQnVsa091dElkeCsrXSA9IGVuZHBvaW50W2ldLmJFbmRwb2ludEFkZHJlc3M7CisJCQlwQWQtPkJ1bGtPdXRNYXhQYWNrZXRTaXplID0gZW5kcG9pbnRbaV0ud01heFBhY2tldFNpemU7CisKKwkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwKKwkJCQkoIkJVTEsgT1VUIE1heGltdW1QYWNrZXRTaXplID0gJWRcbiIsIHBBZC0+QnVsa091dE1heFBhY2tldFNpemUpKTsKKwkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwKKwkJCQkoIkVQIGFkZHJlc3MgPSAweCUyeCAgXG4iLCBlbmRwb2ludFtpXS5iRW5kcG9pbnRBZGRyZXNzKSk7CisJCX0KKwl9CisKKwlpZiAoIShwQWQtPkJ1bGtJbkVwQWRkciAmJiBwQWQtPkJ1bGtPdXRFcEFkZHJbMF0pKQorCXsKKwkJcHJpbnRrKCJDb3VsZCBub3QgZmluZCBib3RoIGJ1bGstaW4gYW5kIGJ1bGstb3V0IGVuZHBvaW50c1xuIik7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlyZXR1cm4gVFJVRTsKK30KKworI2Vsc2UKK0JPT0xFQU4gUlQyOFhYUHJvYmVQb3N0Q29uZmlnKAorCUlOIHZvaWQgCQkJCSpfZGV2X3AsCisJSU4gUlRNUF9BREFQVEVSIAkJKnBBZCwKKwlJTiBJTlQzMgkJCQlpbnRlcmZhY2UpCit7CisJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYgPSAoc3RydWN0IHVzYl9pbnRlcmZhY2UgKilfZGV2X3A7CisJc3RydWN0IHVzYl9ob3N0X2ludGVyZmFjZSAqaWZhY2VfZGVzYzsKKwlVTE9ORyBCdWxrT3V0SWR4OworCVVJTlQzMiBpOworCisKKwkvKiBnZXQgdGhlIGFjdGl2ZSBpbnRlcmZhY2UgZGVzY3JpcHRvciAqLworCWlmYWNlX2Rlc2MgPSBpbnRmLT5jdXJfYWx0c2V0dGluZzsKKworCS8qIGdldCAjIG9mIGVucG9pbnRzICAqLworCXBBZC0+TnVtYmVyT2ZQaXBlcyA9IGlmYWNlX2Rlc2MtPmRlc2MuYk51bUVuZHBvaW50czsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSgiTnVtRW5kcG9pbnRzPSVkXG4iLCBpZmFjZV9kZXNjLT5kZXNjLmJOdW1FbmRwb2ludHMpKTsKKworCS8qIENvbmZpZ3VyZSBQaXBlcyAqLworCUJ1bGtPdXRJZHggPSAwOworCisJZm9yKGk9MDsgaTxwQWQtPk51bWJlck9mUGlwZXM7IGkrKykKKwl7CisJCWlmICgoaWZhY2VfZGVzYy0+ZW5kcG9pbnRbaV0uZGVzYy5ibUF0dHJpYnV0ZXMgPT0KKwkJCQlVU0JfRU5EUE9JTlRfWEZFUl9CVUxLKSAmJgorCQkJKChpZmFjZV9kZXNjLT5lbmRwb2ludFtpXS5kZXNjLmJFbmRwb2ludEFkZHJlc3MgJgorCQkJCVVTQl9FTkRQT0lOVF9ESVJfTUFTSykgPT0gVVNCX0RJUl9JTikpCisJCXsKKwkJCXBBZC0+QnVsa0luRXBBZGRyID0gaWZhY2VfZGVzYy0+ZW5kcG9pbnRbaV0uZGVzYy5iRW5kcG9pbnRBZGRyZXNzOworCQkJcEFkLT5CdWxrSW5NYXhQYWNrZXRTaXplID0gaWZhY2VfZGVzYy0+ZW5kcG9pbnRbaV0uZGVzYy53TWF4UGFja2V0U2l6ZTsKKworCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLAorCQkJCSgiQlVMSyBJTiBNYXhpbXVtUGFja2V0U2l6ZSA9ICVkXG4iLCBwQWQtPkJ1bGtJbk1heFBhY2tldFNpemUpKTsKKwkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwKKwkJCQkoIkVQIGFkZHJlc3MgPSAweCUyeFxuIiwgaWZhY2VfZGVzYy0+ZW5kcG9pbnRbaV0uZGVzYy5iRW5kcG9pbnRBZGRyZXNzKSk7CisJCX0KKwkJZWxzZSBpZiAoKGlmYWNlX2Rlc2MtPmVuZHBvaW50W2ldLmRlc2MuYm1BdHRyaWJ1dGVzID09CisJCQkJCVVTQl9FTkRQT0lOVF9YRkVSX0JVTEspICYmCisJCQkJKChpZmFjZV9kZXNjLT5lbmRwb2ludFtpXS5kZXNjLmJFbmRwb2ludEFkZHJlc3MgJgorCQkJCQlVU0JfRU5EUE9JTlRfRElSX01BU0spID09IFVTQl9ESVJfT1VUKSkKKwkJeworCQkJLy8gdGhlcmUgYXJlIDYgYnVsayBvdXQgRVAuIEVQNiBoaWdoZXN0IHByaW9yaXR5LgorCQkJLy8gRVAxLTQgaXMgRURDQS4gIEVQNSBpcyBIQ0NBLgorCQkJcEFkLT5CdWxrT3V0RXBBZGRyW0J1bGtPdXRJZHgrK10gPSBpZmFjZV9kZXNjLT5lbmRwb2ludFtpXS5kZXNjLmJFbmRwb2ludEFkZHJlc3M7CisJCQlwQWQtPkJ1bGtPdXRNYXhQYWNrZXRTaXplID0gaWZhY2VfZGVzYy0+ZW5kcG9pbnRbaV0uZGVzYy53TWF4UGFja2V0U2l6ZTsKKworCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLAorCQkJCSgiQlVMSyBPVVQgTWF4aW11bVBhY2tldFNpemUgPSAlZFxuIiwgcEFkLT5CdWxrT3V0TWF4UGFja2V0U2l6ZSkpOworCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLAorCQkJCSgiRVAgYWRkcmVzcyA9IDB4JTJ4ICBcbiIsIGlmYWNlX2Rlc2MtPmVuZHBvaW50W2ldLmRlc2MuYkVuZHBvaW50QWRkcmVzcykpOworCQl9CisJfQorCisJaWYgKCEocEFkLT5CdWxrSW5FcEFkZHIgJiYgcEFkLT5CdWxrT3V0RXBBZGRyWzBdKSkKKwl7CisJCXByaW50aygiJXM6IENvdWxkIG5vdCBmaW5kIGJvdGggYnVsay1pbiBhbmQgYnVsay1vdXQgZW5kcG9pbnRzXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlyZXR1cm4gVFJVRTsKK30KKyNlbmRpZiAvLyBMSU5VWF9WRVJTSU9OX0NPREUgLy8KKworCisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgIERpc2FibGUgRE1BLgorCitBcmd1bWVudHM6CisJKnBBZAkJCQl0aGUgcmF4eCBpbnRlcmZhY2UgZGF0YSBwb2ludGVyCisKK1JldHVybiBWYWx1ZToKKwlOb25lCisKK05vdGU6Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIFJUMjhYWERNQURpc2FibGUoCisJSU4gUlRNUF9BREFQVEVSIAkJKnBBZCkKK3sKKwkvLyBubyB1c2UKK30KKworCisKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1JvdXRpbmUgRGVzY3JpcHRpb246CisgICAgRW5hYmxlIERNQS4KKworQXJndW1lbnRzOgorCSpwQWQJCQkJdGhlIHJheHggaW50ZXJmYWNlIGRhdGEgcG9pbnRlcgorCitSZXR1cm4gVmFsdWU6CisJTm9uZQorCitOb3RlOgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBSVDI4WFhETUFFbmFibGUoCisJSU4gUlRNUF9BREFQVEVSIAkJKnBBZCkKK3sKKwlXUERNQV9HTE9fQ0ZHX1NUUlVDCUdsb0NmZzsKKwlVU0JfRE1BX0NGR19TVFJVQwlVc2JDZmc7CisJaW50CQkJCQlpID0gMDsKKworCisJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCAweDQpOworCWRvCisJeworCQlSVE1QX0lPX1JFQUQzMihwQWQsIFdQRE1BX0dMT19DRkcsICZHbG9DZmcud29yZCk7CisJCWlmICgoR2xvQ2ZnLmZpZWxkLlR4RE1BQnVzeSA9PSAwKSAgJiYgKEdsb0NmZy5maWVsZC5SeERNQUJ1c3kgPT0gMCkpCisJCQlicmVhazsKKworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT4gIERNQUJ1c3lcbiIpKTsKKwkJUlRNUHVzZWNEZWxheSgxMDAwKTsKKwkJaSsrOworCX13aGlsZSAoIGkgPDIwMCk7CisKKworCVJUTVB1c2VjRGVsYXkoNTApOworCUdsb0NmZy5maWVsZC5FblRYV3JpdGVCYWNrRERPTkUgPSAxOworCUdsb0NmZy5maWVsZC5FbmFibGVSeERNQSA9IDE7CisJR2xvQ2ZnLmZpZWxkLkVuYWJsZVR4RE1BID0gMTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT0gV1JJVEUgRE1BIG9mZnNldCAweDIwOCA9IDB4JXhcbiIsIEdsb0NmZy53b3JkKSk7CisJUlRNUF9JT19XUklURTMyKHBBZCwgV1BETUFfR0xPX0NGRywgR2xvQ2ZnLndvcmQpOworCisJVXNiQ2ZnLndvcmQgPSAwOworCVVzYkNmZy5maWVsZC5waHljbGVhciA9IDA7CisJLyogdXNiIHZlcnNpb24gaXMgMS4xLGRvIG5vdCB1c2UgYnVsayBpbiBhZ2dyZWdhdGlvbiAqLworCWlmIChwQWQtPkJ1bGtJbk1heFBhY2tldFNpemUgPT0gNTEyKQorCQkJVXNiQ2ZnLmZpZWxkLlJ4QnVsa0FnZ0VuID0gMTsKKwkvKiBmb3IgbGFzdCBwYWNrZXQsIFBCRiBtaWdodCB1c2UgbW9yZSB0aGFuIGxpbWl0ZWQsIHNvIG1pbnVzIDIgdG8gcHJldmVudCBmcm9tIGVycm9yICovCisJVXNiQ2ZnLmZpZWxkLlJ4QnVsa0FnZ0xtdCA9IChNQVhfUlhCVUxLX1NJWkUgLzEwMjQpLTM7CisJVXNiQ2ZnLmZpZWxkLlJ4QnVsa0FnZ1RPdXQgPSAweDgwOyAvKiAyMDA2LTEwLTE4ICovCisJVXNiQ2ZnLmZpZWxkLlJ4QnVsa0VuID0gMTsKKwlVc2JDZmcuZmllbGQuVHhCdWxrRW4gPSAxOworCisJUlRVU0JXcml0ZU1BQ1JlZ2lzdGVyKHBBZCwgVVNCX0RNQV9DRkcsIFVzYkNmZy53b3JkKTsKKworfQorCisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgIFdyaXRlIEJlYWNvbiBidWZmZXIgdG8gQXNpYy4KKworQXJndW1lbnRzOgorCSpwQWQJCQkJdGhlIHJheHggaW50ZXJmYWNlIGRhdGEgcG9pbnRlcgorCitSZXR1cm4gVmFsdWU6CisJTm9uZQorCitOb3RlOgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBSVDI4eHhfVXBkYXRlQmVhY29uVG9Bc2ljKAorCUlOIFJUTVBfQURBUFRFUgkJKnBBZCwKKwlJTiBJTlQJCQkJYXBpZHgsCisJSU4gVUxPTkcJCQlGcmFtZUxlbiwKKwlJTiBVTE9ORwkJCVVwZGF0ZVBvcykKK3sKKwlQVUNIQVIgICAgICAgIAlwQmVhY29uRnJhbWUgPSBOVUxMOworCVVDSEFSICAJCQkqcHRyOworCVVJTlQgIAkJCWksIHBhZGRpbmc7CisJQkVBQ09OX1NZTkNfU1RSVUNUCSpwQmVhY29uU3luYyA9IHBBZC0+Q29tbW9uQ2ZnLnBCZWFjb25TeW5jOworCVVJTlQzMgkJCWxvbmdWYWx1ZTsKKwlCT09MRUFOCQkJYkJjblJlcSA9IEZBTFNFOworCVVDSEFSCQkJYmNuX2lkeCA9IDA7CisKKworCWlmIChwQmVhY29uRnJhbWUgPT0gTlVMTCkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgicEJlYWNvbkZyYW1lIGlzIE5VTEwhXG4iKSk7CisJCXJldHVybjsKKwl9CisKKwlpZiAocEJlYWNvblN5bmMgPT0gTlVMTCkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgicEJlYWNvblN5bmMgaXMgTlVMTCFcbiIpKTsKKwkJcmV0dXJuOworCX0KKworCS8vaWYgKChwQWQtPldkc1RhYi5Nb2RlID09IFdEU19CUklER0VfTU9ERSkgfHwKKwkvLwkoKHBBZC0+QXBDZmcuTUJTU0lEW2FwaWR4XS5NU1NJRERldiA9PSBOVUxMKSB8fCAhKHBBZC0+QXBDZmcuTUJTU0lEW2FwaWR4XS5NU1NJRERldi0+ZmxhZ3MgJiBJRkZfVVApKQorCS8vCSkKKwlpZiAoYkJjblJlcSA9PSBGQUxTRSkKKwl7CisJCS8qIHdoZW4gdGhlIHJhIGludGVyZmFjZSBpcyBkb3duLCBkbyBub3Qgc2VuZCBpdHMgYmVhY29uIGZyYW1lICovCisJCS8qIGNsZWFyIGFsbCB6ZXJvICovCisJCWZvcihpPTA7IGk8VFhXSV9TSVpFOyBpKz00KSB7CisJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBwQWQtPkJlYWNvbk9mZnNldFtiY25faWR4XSArIGksIDB4MDApOworCQl9CisJCXBCZWFjb25TeW5jLT5CZWFjb25CaXRNYXAgJj0gKH4oQkVBQ09OX0JJVE1BUF9NQVNLICYgKDEgPDwgYmNuX2lkeCkpKTsKKwkJTmRpc1plcm9NZW1vcnkocEJlYWNvblN5bmMtPkJlYWNvblR4V0lbYmNuX2lkeF0sIFRYV0lfU0laRSk7CisJfQorCWVsc2UKKwl7CisJCXB0ciA9IChQVUNIQVIpJnBBZC0+QmVhY29uVHhXSTsKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJCVJUTVBXSUVuZGlhbkNoYW5nZShwdHIsIFRZUEVfVFhXSSk7CisjZW5kaWYKKwkJaWYgKE5kaXNFcXVhbE1lbW9yeShwQmVhY29uU3luYy0+QmVhY29uVHhXSVtiY25faWR4XSwgJnBBZC0+QmVhY29uVHhXSSwgVFhXSV9TSVpFKSA9PSBGQUxTRSkKKwkJewkvLyBJZiBCZWFjb25UeFdJIGNoYW5nZWQsIHdlIG5lZWQgdG8gcmV3cml0ZSB0aGUgVHhXSSBmb3IgdGhlIEJlYWNvbiBmcmFtZXMuCisJCQlwQmVhY29uU3luYy0+QmVhY29uQml0TWFwICY9ICh+KEJFQUNPTl9CSVRNQVBfTUFTSyAmICgxIDw8IGJjbl9pZHgpKSk7CisJCQlOZGlzTW92ZU1lbW9yeShwQmVhY29uU3luYy0+QmVhY29uVHhXSVtiY25faWR4XSwgJnBBZC0+QmVhY29uVHhXSSwgVFhXSV9TSVpFKTsKKwkJfQorCisJCWlmICgocEJlYWNvblN5bmMtPkJlYWNvbkJpdE1hcCAmICgxIDw8IGJjbl9pZHgpKSAhPSAoMSA8PCBiY25faWR4KSkKKwkJeworCQkJZm9yIChpPTA7IGk8VFhXSV9TSVpFOyBpKz00KSAgLy8gMTYtYnl0ZSBUWFdJIGZpZWxkCisJCQl7CisJCQkJbG9uZ1ZhbHVlID0gICpwdHIgKyAoKihwdHIrMSk8PDgpICsgKCoocHRyKzIpPDwxNikgKyAoKihwdHIrMyk8PDI0KTsKKwkJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBwQWQtPkJlYWNvbk9mZnNldFtiY25faWR4XSArIGksIGxvbmdWYWx1ZSk7CisJCQkJcHRyICs9IDQ7CisJCQl9CisJCX0KKworCQlwdHIgPSBwQmVhY29uU3luYy0+QmVhY29uQnVmW2Jjbl9pZHhdOworCQlwYWRkaW5nID0gKEZyYW1lTGVuICYgMHgwMSk7CisJCU5kaXNaZXJvTWVtb3J5KChQVUNIQVIpKHBCZWFjb25GcmFtZSArIEZyYW1lTGVuKSwgcGFkZGluZyk7CisJCUZyYW1lTGVuICs9IHBhZGRpbmc7CisJCWZvciAoaSA9IDAgOyBpIDwgRnJhbWVMZW4gLypIV19CRUFDT05fT0ZGU0VUKi87IGkgKz0gMikKKwkJeworCQkJaWYgKE5kaXNFcXVhbE1lbW9yeShwdHIsIHBCZWFjb25GcmFtZSwgMikgPT0gRkFMU0UpCisJCQl7CisJCQkJTmRpc01vdmVNZW1vcnkocHRyLCBwQmVhY29uRnJhbWUsIDIpOworCQkJCS8vc2hvcnRWYWx1ZSA9ICpwdHIgKyAoKihwdHIrMSk8PDgpOworCQkJCS8vUlRNUF9JT19XUklURTgocEFkLCBwQWQtPkJlYWNvbk9mZnNldFtiY25faWR4XSArIFRYV0lfU0laRSArIGksIHNob3J0VmFsdWUpOworCQkJCVJUVVNCTXVsdGlXcml0ZShwQWQsIHBBZC0+QmVhY29uT2Zmc2V0W2Jjbl9pZHhdICsgVFhXSV9TSVpFICsgaSwgcHRyLCAyKTsKKwkJCX0KKwkJCXB0ciArPTI7CisJCQlwQmVhY29uRnJhbWUgKz0gMjsKKwkJfQorCisJCXBCZWFjb25TeW5jLT5CZWFjb25CaXRNYXAgfD0gKDEgPDwgYmNuX2lkeCk7CisJfQorCit9CisKKworVk9JRCBSVDI4NzBfQnNzQmVhY29uU3RvcCgKKwlJTiBSVE1QX0FEQVBURVIgKnBBZCkKK3sKKwlCRUFDT05fU1lOQ19TVFJVQ1QJKnBCZWFjb25TeW5jOworCWludCBpLCBvZmZzZXQ7CisJQk9PTEVBTglDYW5jZWxsZWQgPSBUUlVFOworCisJcEJlYWNvblN5bmMgPSBwQWQtPkNvbW1vbkNmZy5wQmVhY29uU3luYzsKKwlpZiAocEJlYWNvblN5bmMgJiYgcEJlYWNvblN5bmMtPkVuYWJsZUJlYWNvbikKKwl7CisJCUlOVCBOdW1PZkJjbjsKKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCXsKKwkJCU51bU9mQmNuID0gTUFYX01FU0hfTlVNOworCQl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPkNvbW1vbkNmZy5CZWFjb25VcGRhdGVUaW1lciwgJkNhbmNlbGxlZCk7CisKKwkJZm9yKGk9MDsgaTxOdW1PZkJjbjsgaSsrKQorCQl7CisJCQlOZGlzWmVyb01lbW9yeShwQmVhY29uU3luYy0+QmVhY29uQnVmW2ldLCBIV19CRUFDT05fT0ZGU0VUKTsKKwkJCU5kaXNaZXJvTWVtb3J5KHBCZWFjb25TeW5jLT5CZWFjb25UeFdJW2ldLCBUWFdJX1NJWkUpOworCisJCQlmb3IgKG9mZnNldD0wOyBvZmZzZXQ8SFdfQkVBQ09OX09GRlNFVDsgb2Zmc2V0Kz00KQorCQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIHBBZC0+QmVhY29uT2Zmc2V0W2ldICsgb2Zmc2V0LCAweDAwKTsKKworCQkJcEJlYWNvblN5bmMtPkNhcGFiaWxpdHlJbmZvTG9jYXRpb25JbkJlYWNvbltpXSA9IDA7CisJCQlwQmVhY29uU3luYy0+VGltSUVMb2NhdGlvbkluQmVhY29uW2ldID0gMDsKKwkJfQorCQlwQmVhY29uU3luYy0+QmVhY29uQml0TWFwID0gMDsKKwkJcEJlYWNvblN5bmMtPkR0aW1CaXRPbiA9IDA7CisJfQorfQorCisKK1ZPSUQgUlQyODcwX0Jzc0JlYWNvblN0YXJ0KAorCUlOIFJUTVBfQURBUFRFUiAqcEFkKQoreworCWludCBhcGlkeDsKKwlCRUFDT05fU1lOQ19TVFJVQ1QJKnBCZWFjb25TeW5jOworLy8JTEFSR0VfSU5URUdFUiAJdHNmVGltZSwgZGVsdGFUaW1lOworCisJcEJlYWNvblN5bmMgPSBwQWQtPkNvbW1vbkNmZy5wQmVhY29uU3luYzsKKwlpZiAocEJlYWNvblN5bmMgJiYgcEJlYWNvblN5bmMtPkVuYWJsZUJlYWNvbikKKwl7CisJCUlOVCBOdW1PZkJjbjsKKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCXsKKwkJCU51bU9mQmNuID0gTUFYX01FU0hfTlVNOworCQl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwkJZm9yKGFwaWR4PTA7IGFwaWR4PE51bU9mQmNuOyBhcGlkeCsrKQorCQl7CisJCQlVQ0hBUiBDYXBhYmlsaXR5SW5mb0xvY2F0aW9uSW5CZWFjb24gPSAwOworCQkJVUNIQVIgVGltSUVMb2NhdGlvbkluQmVhY29uID0gMDsKKworCQkJTmRpc1plcm9NZW1vcnkocEJlYWNvblN5bmMtPkJlYWNvbkJ1ZlthcGlkeF0sIEhXX0JFQUNPTl9PRkZTRVQpOworCQkJcEJlYWNvblN5bmMtPkNhcGFiaWxpdHlJbmZvTG9jYXRpb25JbkJlYWNvblthcGlkeF0gPSBDYXBhYmlsaXR5SW5mb0xvY2F0aW9uSW5CZWFjb247CisJCQlwQmVhY29uU3luYy0+VGltSUVMb2NhdGlvbkluQmVhY29uW2FwaWR4XSA9IFRpbUlFTG9jYXRpb25JbkJlYWNvbjsKKwkJCU5kaXNaZXJvTWVtb3J5KHBCZWFjb25TeW5jLT5CZWFjb25UeFdJW2FwaWR4XSwgVFhXSV9TSVpFKTsKKwkJfQorCQlwQmVhY29uU3luYy0+QmVhY29uQml0TWFwID0gMDsKKwkJcEJlYWNvblN5bmMtPkR0aW1CaXRPbiA9IDA7CisJCXBBZC0+Q29tbW9uQ2ZnLkJlYWNvblVwZGF0ZVRpbWVyLlJlcGVhdCA9IFRSVUU7CisKKwkJcEFkLT5Db21tb25DZmcuQmVhY29uQWRqdXN0ID0gMDsKKwkJcEFkLT5Db21tb25DZmcuQmVhY29uRmFjdG9yID0gMHhmZmZmZmZmZiAvIChwQWQtPkNvbW1vbkNmZy5CZWFjb25QZXJpb2QgPDwgMTApOworCQlwQWQtPkNvbW1vbkNmZy5CZWFjb25SZW1haW4gPSAoMHhmZmZmZmZmZiAlIChwQWQtPkNvbW1vbkNmZy5CZWFjb25QZXJpb2QgPDwgMTApKSArIDE7CisJCXByaW50aygiUlQyODcwX0Jzc0JlYWNvblN0YXJ0OkJlYWNvbkZhY3Rvcj0lZCwgQmVhY29uUmVtYWluPSVkIVxuIiwgcEFkLT5Db21tb25DZmcuQmVhY29uRmFjdG9yLCBwQWQtPkNvbW1vbkNmZy5CZWFjb25SZW1haW4pOworCQlSVE1QU2V0VGltZXIoJnBBZC0+Q29tbW9uQ2ZnLkJlYWNvblVwZGF0ZVRpbWVyLCBwQWQtPkNvbW1vbkNmZy5CZWFjb25QZXJpb2QpOworCisJfQorfQorCisKK1ZPSUQgUlQyODcwX0Jzc0JlYWNvbkluaXQoCisJSU4gUlRNUF9BREFQVEVSICpwQWQpCit7CisJQkVBQ09OX1NZTkNfU1RSVUNUCSpwQmVhY29uU3luYzsKKwlpbnQgaTsKKworCU5kaXNBbGxvY01lbW9yeShwQWQtPkNvbW1vbkNmZy5wQmVhY29uU3luYywgc2l6ZW9mKEJFQUNPTl9TWU5DX1NUUlVDVCksIE1FTV9BTExPQ19GTEFHKTsKKwlpZiAocEFkLT5Db21tb25DZmcucEJlYWNvblN5bmMpCisJeworCQlwQmVhY29uU3luYyA9IHBBZC0+Q29tbW9uQ2ZnLnBCZWFjb25TeW5jOworCQlOZGlzWmVyb01lbW9yeShwQmVhY29uU3luYywgc2l6ZW9mKEJFQUNPTl9TWU5DX1NUUlVDVCkpOworCQlmb3IoaT0wOyBpIDwgSFdfQkVBQ09OX01BWF9DT1VOVDsgaSsrKQorCQl7CisJCQlOZGlzWmVyb01lbW9yeShwQmVhY29uU3luYy0+QmVhY29uQnVmW2ldLCBIV19CRUFDT05fT0ZGU0VUKTsKKwkJCXBCZWFjb25TeW5jLT5DYXBhYmlsaXR5SW5mb0xvY2F0aW9uSW5CZWFjb25baV0gPSAwOworCQkJcEJlYWNvblN5bmMtPlRpbUlFTG9jYXRpb25JbkJlYWNvbltpXSA9IDA7CisJCQlOZGlzWmVyb01lbW9yeShwQmVhY29uU3luYy0+QmVhY29uVHhXSVtpXSwgVFhXSV9TSVpFKTsKKwkJfQorCQlwQmVhY29uU3luYy0+QmVhY29uQml0TWFwID0gMDsKKworCQkvL1JUTVBJbml0VGltZXIocEFkLCAmcEFkLT5Db21tb25DZmcuQmVhY29uVXBkYXRlVGltZXIsIEdFVF9USU1FUl9GVU5DVElPTihCZWFjb25VcGRhdGVFeGVjKSwgcEFkLCBUUlVFKTsKKwkJcEJlYWNvblN5bmMtPkVuYWJsZUJlYWNvbiA9IFRSVUU7CisJfQorfQorCisKK1ZPSUQgUlQyODcwX0Jzc0JlYWNvbkV4aXQoCisJSU4gUlRNUF9BREFQVEVSICpwQWQpCit7CisJQkVBQ09OX1NZTkNfU1RSVUNUCSpwQmVhY29uU3luYzsKKwlCT09MRUFOCUNhbmNlbGxlZCA9IFRSVUU7CisJaW50IGk7CisKKwlpZiAocEFkLT5Db21tb25DZmcucEJlYWNvblN5bmMpCisJeworCQlwQmVhY29uU3luYyA9IHBBZC0+Q29tbW9uQ2ZnLnBCZWFjb25TeW5jOworCQlwQmVhY29uU3luYy0+RW5hYmxlQmVhY29uID0gRkFMU0U7CisJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5Db21tb25DZmcuQmVhY29uVXBkYXRlVGltZXIsICZDYW5jZWxsZWQpOworCQlwQmVhY29uU3luYy0+QmVhY29uQml0TWFwID0gMDsKKworCQlmb3IoaT0wOyBpPEhXX0JFQUNPTl9NQVhfQ09VTlQ7IGkrKykKKwkJeworCQkJTmRpc1plcm9NZW1vcnkocEJlYWNvblN5bmMtPkJlYWNvbkJ1ZltpXSwgSFdfQkVBQ09OX09GRlNFVCk7CisJCQlwQmVhY29uU3luYy0+Q2FwYWJpbGl0eUluZm9Mb2NhdGlvbkluQmVhY29uW2ldID0gMDsKKwkJCXBCZWFjb25TeW5jLT5UaW1JRUxvY2F0aW9uSW5CZWFjb25baV0gPSAwOworCQkJTmRpc1plcm9NZW1vcnkocEJlYWNvblN5bmMtPkJlYWNvblR4V0lbaV0sIFRYV0lfU0laRSk7CisJCX0KKworCQlOZGlzRnJlZU1lbW9yeShwQWQtPkNvbW1vbkNmZy5wQmVhY29uU3luYywgSFdfQkVBQ09OX09GRlNFVCAqIEhXX0JFQUNPTl9NQVhfQ09VTlQsIDApOworCQlwQWQtPkNvbW1vbkNmZy5wQmVhY29uU3luYyA9IE5VTEw7CisJfQorfQorCitWT0lEIEJlYWNvblVwZGF0ZUV4ZWMoCisgICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorICAgIElOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKKyAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisgICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKQoreworCVBSVE1QX0FEQVBURVIJcEFkID0gKFBSVE1QX0FEQVBURVIpRnVuY3Rpb25Db250ZXh0OworCUxBUkdFX0lOVEVHRVIJdHNmVGltZV9hOy8vLCB0c2ZUaW1lX2IsIGRlbHRhVGltZV9leHAsIGRlbHRhVGltZV9hYjsKKwlVSU5UMzIJCQlkZWx0YSwgcmVtYWluLCByZW1haW5fbG93LCByZW1haW5faGlnaDsKKy8vCUJPT0xFQU4JCQlwb3NpdGl2ZTsKKworCVJlU3luY0JlYWNvblRpbWUocEFkKTsKKworCisKKwlSVE1QX0lPX1JFQUQzMihwQWQsIFRTRl9USU1FUl9EVzAsICZ0c2ZUaW1lX2EudS5Mb3dQYXJ0KTsKKwlSVE1QX0lPX1JFQUQzMihwQWQsIFRTRl9USU1FUl9EVzEsICZ0c2ZUaW1lX2EudS5IaWdoUGFydCk7CisKKworCS8vcG9zaXRpdmU9Z2V0RGVsdGFUaW1lKHRzZlRpbWVfYSwgZXhwZWN0ZWRUaW1lLCAmZGVsdGFUaW1lX2V4cCk7CisJcmVtYWluX2hpZ2ggPSBwQWQtPkNvbW1vbkNmZy5CZWFjb25SZW1haW4gKiB0c2ZUaW1lX2EudS5IaWdoUGFydDsKKwlyZW1haW5fbG93ID0gdHNmVGltZV9hLnUuTG93UGFydCAlIChwQWQtPkNvbW1vbkNmZy5CZWFjb25QZXJpb2QgPDwgMTApOworCXJlbWFpbiA9IChyZW1haW5faGlnaCArIHJlbWFpbl9sb3cpJShwQWQtPkNvbW1vbkNmZy5CZWFjb25QZXJpb2QgPDwgMTApOworCWRlbHRhID0gKHBBZC0+Q29tbW9uQ2ZnLkJlYWNvblBlcmlvZCA8PCAxMCkgLSByZW1haW47CisKKwlwQWQtPkNvbW1vbkNmZy5CZWFjb25VcGRhdGVUaW1lci5UaW1lclZhbHVlID0gKGRlbHRhID4+IDEwKSArIDEwOworCit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Mzk4ZDk3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9LY29uZmlnCkBAIC0wLDAgKzEsNiBAQAorY29uZmlnIFJUMjg3MAorCXRyaXN0YXRlICJSYWxpbmsgMjg3MCB3aXJlbGVzcyBzdXBwb3J0IgorCWRlcGVuZHMgb24gVVNCICYmIFg4NiAmJiBXTEFOXzgwMjExCisJLS0taGVscC0tLQorCSAgVGhpcyBpcyBhbiBleHBlcmltZW50YWwgZHJpdmVyIGZvciB0aGUgUmFsaW5rIDI4NzAgd2lyZWxlc3MgY2hpcC4KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWEwMTVmNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvTWFrZWZpbGUKQEAgLTAsMCArMSw0NyBAQAorb2JqLSQoQ09ORklHX1JUMjg3MCkJKz0gcnQyODcwc3RhLm8KKworIyBUT0RPOiBhbGwgb2YgdGhlc2Ugc2hvdWxkIGJlIHJlbW92ZWQKK0VYVFJBX0NGTEFHUyArPSAtRExJTlVYIC1EQUdHUkVHQVRJT05fU1VQUE9SVCAtRFBJR0dZQkFDS19TVVBQT1JUIC1EV01NX1NVUFBPUlQKK0VYVFJBX0NGTEFHUyArPSAtRFJUMjg3MAorRVhUUkFfQ0ZMQUdTICs9IC1EQ09ORklHX1NUQV9TVVBQT1JUCitFWFRSQV9DRkxBR1MgKz0gLUREQkcKK0VYVFJBX0NGTEFHUyArPSAtRERPVDExX05fU1VQUE9SVAorRVhUUkFfQ0ZMQUdTICs9IC1EV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorRVhUUkFfQ0ZMQUdTICs9IC1ETkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQKKworcnQyODcwc3RhLW9ianMgOj0JCVwKKwljb21tb24vbWQ1Lm8JCVwKKwljb21tb24vbWxtZS5vCQlcCisJY29tbW9uL3J0bXBfd2VwLm8JXAorCWNvbW1vbi9hY3Rpb24ubwkJXAorCWNvbW1vbi9jbW1fZGF0YS5vCVwKKwljb21tb24vcnRtcF9pbml0Lm8JXAorCWNvbW1vbi9ydG1wX3RraXAubwlcCisJY29tbW9uL2NtbV9zeW5jLm8JXAorCWNvbW1vbi9lZXByb20ubwkJXAorCWNvbW1vbi9jbW1fc2FuaXR5Lm8JXAorCWNvbW1vbi9jbW1faW5mby5vCVwKKwljb21tb24vY21tX3dwYS5vCVwKKwljb21tb24vZGZzLm8JCVwKKwljb21tb24vc3BlY3RydW0ubwlcCisJc3RhL2Fzc29jLm8JCVwKKwlzdGEvYWlyb25ldC5vCQlcCisJc3RhL2F1dGgubwkJXAorCXN0YS9hdXRoX3JzcC5vCQlcCisJc3RhL3N5bmMubwkJXAorCXN0YS9zYW5pdHkubwkJXAorCXN0YS9ydG1wX2RhdGEubwkJXAorCXN0YS9jb25uZWN0Lm8JCVwKKwlzdGEvd3BhLm8JCVwKKwlydF9saW51eC5vCQlcCisJcnRfcHJvZmlsZS5vCQlcCisJcnRfbWFpbl9kZXYubwkJXAorCXN0YV9pb2N0bC5vCQlcCisJY29tbW9uL2JhX2FjdGlvbi5vCVwKKwkyODcwX21haW5fZGV2Lm8JCVwKKwljb21tb24vMjg3MF9ydG1wX2luaXQubwlcCisJY29tbW9uL3J0dXNiX2lvLm8JXAorCWNvbW1vbi9ydHVzYl9idWxrLm8JXAorCWNvbW1vbi9ydHVzYl9kYXRhLm8JXAorCWNvbW1vbi9jbW1fZGF0YV8yODcwLm8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9UT0RPIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9UT0RPCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhZTFhYzQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL1RPRE8KQEAgLTAsMCArMSwxMCBAQAorVE9ETzoKKwktIGNoZWNrcGF0Y2gucGwgY2xlYW4KKwktIHNwYXJzZSBjbGVhbgorCS0gcG9ydCB0byBpbi1rZXJuZWwgODAyMTEgc3RhY2sKKwktIHJlbW92ZSByZWFkaW5nIGZyb20gL2V0Yy8gY29uZmlnIGZpbGVzCisJLSByZXZpZXcgYnkgdGhlIHdpcmVsZXNzIGRldmVsb3BlciBjb21tdW5pdHkKKworUGxlYXNlIHNlbmQgYW55IHBhdGNoZXMgb3IgY29tcGxhaW50cyBhYm91dCB0aGlzIGRyaXZlciB0byBHcmVnCitLcm9haC1IYXJ0bWFuIDxncmVnQGtyb2FoLmNvbT4gYW5kIGRvbid0IGJvdGhlciB0aGUgdXBzdHJlYW0gd2lyZWxlc3MKK2tlcm5lbCBkZXZlbG9wZXJzIGFib3V0IGl0LCB0aGV5IHdhbnQgbm90aGluZyB0byBkbyB3aXRoIGl0LgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9haXJvbmV0LmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2Fpcm9uZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTA3YjE5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9haXJvbmV0LmgKQEAgLTAsMCArMSwyMTAgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJTW9kdWxlIE5hbWU6CisJYWlyb25ldC5oCisKKwlBYnN0cmFjdDoKKworCVJldmlzaW9uIEhpc3Rvcnk6CisJV2hvCQkJV2hlbgkJCVdoYXQKKwktLS0tLS0tLQktLS0tLS0tLS0tCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJTmFtZQkJRGF0ZQkJCU1vZGlmaWNhdGlvbiBsb2dzCisJUGF1bCBMaW4JMDQtMDYtMTUJCUluaXRpYWwKKyovCisKKyNpZm5kZWYJX19BSVJPTkVUX0hfXworI2RlZmluZQlfX0FJUk9ORVRfSF9fCisKKy8vIE1lYXN1cmVtZW50IFR5cGUgZGVmaW5pdGlvbgorI2RlZmluZQlNU1JOX1RZUEVfVU5VU0VECQkJCTAKKyNkZWZpbmUJTVNSTl9UWVBFX0NIQU5ORUxfTE9BRF9SRVEJCTEKKyNkZWZpbmUJTVNSTl9UWVBFX05PSVNFX0hJU1RfUkVRCQkyCisjZGVmaW5lCU1TUk5fVFlQRV9CRUFDT05fUkVRCQkJMworI2RlZmluZQlNU1JOX1RZUEVfRlJBTUVfUkVRCQkJCTQKKworLy8gU2NhbiBNb2RlIGluIEJlYWNvbiBSZXF1ZXN0CisjZGVmaW5lCU1TUk5fU0NBTl9NT0RFX1BBU1NJVkUJCQkwCisjZGVmaW5lCU1TUk5fU0NBTl9NT0RFX0FDVElWRQkJCTEKKyNkZWZpbmUJTVNSTl9TQ0FOX01PREVfQkVBQ09OX1RBQkxFCQkyCisKKy8vIFBIWSB0eXBlIGRlZmluaXRpb24gZm9yIEFpcm9uZXQgYmVhY29uIHJlcG9ydCwgQ0NYIDIgdGFibGUgMzYtOQorI2RlZmluZQlQSFlfRkgJCQkJCQkJMQorI2RlZmluZQlQSFlfRFNTCQkJCQkJCTIKKyNkZWZpbmUJUEhZX1VOVVNFRAkJCQkJCTMKKyNkZWZpbmUJUEhZX09GRE0JCQkJCQk0CisjZGVmaW5lCVBIWV9IUl9EU1MJCQkJCQk1CisjZGVmaW5lCVBIWV9FUlAJCQkJCQkJNgorCisvLyBSUEkgdGFibGUgaW4gZEJtCisjZGVmaW5lCVJQSV8wCQkJMAkJCS8vCVBvd2VyIDw9IC04NworI2RlZmluZQlSUElfMQkJCTEJCQkvLwktODcgPCBQb3dlciA8PSAtODIKKyNkZWZpbmUJUlBJXzIJCQkyCQkJLy8JLTgyIDwgUG93ZXIgPD0gLTc3CisjZGVmaW5lCVJQSV8zCQkJMwkJCS8vCS03NyA8IFBvd2VyIDw9IC03MgorI2RlZmluZQlSUElfNAkJCTQJCQkvLwktNzIgPCBQb3dlciA8PSAtNjcKKyNkZWZpbmUJUlBJXzUJCQk1CQkJLy8JLTY3IDwgUG93ZXIgPD0gLTYyCisjZGVmaW5lCVJQSV82CQkJNgkJCS8vCS02MiA8IFBvd2VyIDw9IC01NworI2RlZmluZQlSUElfNwkJCTcJCQkvLwktNTcgPCBQb3dlcgorCisvLyBDaXNjbyBBaXJvbmV0IElBUFAgZGVmaW5ldGlvbnMKKyNkZWZpbmUJQUlST05FVF9JQVBQX1RZUEUJCQkJCTB4MzIKKyNkZWZpbmUJQUlST05FVF9JQVBQX1NVQlRZUEVfUkVRVUVTVAkJMHgwMQorI2RlZmluZQlBSVJPTkVUX0lBUFBfU1VCVFlQRV9SRVBPUlQJCQkweDgxCisKKy8vIE1lYXN1cmVtZW50IFJlcXVlc3QgZGV0YWlsIGZvcm1hdAordHlwZWRlZglzdHJ1Y3QJX01FQVNVUkVNRU5UX1JFUVVFU1QJeworCVVDSEFSCUNoYW5uZWw7CisJVUNIQVIJU2Nhbk1vZGU7CQkJLy8gVXNlIG9ubHkgaW4gYmVhY29uIHJlcXVlc3QsIG90aGVyIHJlcXVlc3RzIGRpZCBub3QgdXNlIHRoaXMgZmllbGQKKwlVU0hPUlQJRHVyYXRpb247Cit9CU1FQVNVUkVNRU5UX1JFUVVFU1QsICpQTUVBU1VSRU1FTlRfUkVRVUVTVDsKKworLy8gQmVhY29uIE1lYXN1cmVtZW50IFJlcG9ydAorLy8gQWxsIHRoZXNlIGZpZWxkIG1pZ2h0IGNoYW5nZSB0byBVQ0hBUiwgYmVjYXVzZSB3ZSBkaWRuJ3QgZG8gYW55dGhpbmcgdG8gdGhlc2UgcmVwb3J0LgorLy8gV2UgY29weSBhbGwgdGhlc2UgYmVhY29ucyBhbmQgcmVwb3J0IHRvIENDWCAyIEFQLgordHlwZWRlZglzdHJ1Y3QJX0JFQUNPTl9SRVBPUlQJeworCVVDSEFSCUNoYW5uZWw7CisJVUNIQVIJU3BhcmU7CisJVVNIT1JUCUR1cmF0aW9uOworCVVDSEFSCVBoeVR5cGU7CQkJLy8gRGVmaW5pYXRpb24gaXMgbGlzdGVkIGFib3ZlIHRhYmxlIDM2LTkKKwlVQ0hBUglSeFBvd2VyOworCVVDSEFSCUJTU0lEWzZdOworCVVDSEFSCVBhcmVudFRTRls0XTsKKwlVQ0hBUglUYXJnZXRUU0ZbOF07CisJVVNIT1JUCUJlYWNvbkludGVydmFsOworCVVTSE9SVAlDYXBhYmlsaXR5SW5mbzsKK30JQkVBQ09OX1JFUE9SVCwgKlBCRUFDT05fUkVQT1JUOworCisvLyBGcmFtZSBNZWFzdXJlbWVudCBSZXBvcnQgKE9wdGlvbmFsKQordHlwZWRlZglzdHJ1Y3QJX0ZSQU1FX1JFUE9SVAl7CisJVUNIQVIJQ2hhbm5lbDsKKwlVQ0hBUglTcGFyZTsKKwlVU0hPUlQJRHVyYXRpb247CisJVUNIQVIJVEE7CisJVUNIQVIJQlNTSURbNl07CisJVUNIQVIJUlNTSTsKKwlVQ0hBUglDb3VudDsKK30JRlJBTUVfUkVQT1JULCAqUEZSQU1FX1JFUE9SVDsKKworI3ByYWdtYSBwYWNrKDEpCisvLyBDaGFubmVsIExvYWQgUmVwb3J0Cit0eXBlZGVmCXN0cnVjdAlfQ0hBTk5FTF9MT0FEX1JFUE9SVAl7CisJVUNIQVIJQ2hhbm5lbDsKKwlVQ0hBUglTcGFyZTsKKwlVU0hPUlQJRHVyYXRpb247CisJVUNIQVIJQ0NBQnVzeTsKK30JQ0hBTk5FTF9MT0FEX1JFUE9SVCwgKlBDSEFOTkVMX0xPQURfUkVQT1JUOworI3ByYWdtYSBwYWNrKCkKKworLy8gTm9zaWUgSGlzdG9ncmFtIFJlcG9ydAordHlwZWRlZglzdHJ1Y3QJX05PSVNFX0hJU1RfUkVQT1JUCXsKKwlVQ0hBUglDaGFubmVsOworCVVDSEFSCVNwYXJlOworCVVTSE9SVAlEdXJhdGlvbjsKKwlVQ0hBUglEZW5zaXR5WzhdOworfQlOT0lTRV9ISVNUX1JFUE9SVCwgKlBOT0lTRV9ISVNUX1JFUE9SVDsKKworLy8gUmFkaW8gTWFuYWdlbWVudCBDYXBhYmlsaXR5IGVsZW1lbnQKK3R5cGVkZWYJc3RydWN0CV9SQURJT19NQU5BR0VNRU5UX0NBUEFCSUxJVFkJeworCVVDSEFSCUVpZDsJCQkJLy8gVE9ETzogV2h5IHRoZSBFaWQgaXMgMSBieXRlLCBub3Qgbm9ybWFsIDIgYnl0ZXM/Pz8KKwlVQ0hBUglMZW5ndGg7CisJVUNIQVIJQWlyb25ldE91aVszXTsJCS8vIEFJcm9uZXQgT1VJICgwMCA0MCA5NikKKwlVQ0hBUglUeXBlOwkJCQkvLyBUeXBlIC8gVmVyc2lvbgorCVVTSE9SVAlTdGF0dXM7CQkJCS8vIHN3YXAxNiByZXF1aXJlZAorfQlSQURJT19NQU5BR0VNRU5UX0NBUEFCSUxJVFksICpQUkFESU9fTUFOQUdFTUVOVF9DQVBBQklMSVRZOworCisvLyBNZWFzdXJlbWVudCBNb2RlIEJpdCBkZWZpbml0aW9uCit0eXBlZGVmCXN0cnVjdAlfTUVBU1VSRU1FTlRfTU9ERQl7CisJVUNIQVIJUnN2ZDo0OworCVVDSEFSCVJlcG9ydDoxOworCVVDSEFSCU5vdFVzZWQ6MTsKKwlVQ0hBUglFbmFibGU6MTsKKwlVQ0hBUglQYXJhbGxlbDoxOworfQlNRUFTVVJFTUVOVF9NT0RFLCAqUE1FQVNVUkVNRU5UX01PREU7CisKKy8vIE1lYXN1cmVtZW50IFJlcXVlc3QgZWxlbWVudCwgVGhpcyBpcyBsaXR0bGUgZW5kaWFuIG1vZGUKK3R5cGVkZWYJc3RydWN0CV9NRUFTVVJFTUVOVF9SRVFVRVNUX0VMRU1FTlQJeworCVVTSE9SVAkJCQlFaWQ7CisJVVNIT1JUCQkJCUxlbmd0aDsJCQkJLy8gc3dhcDE2IHJlcXVpcmVkCisJVVNIT1JUCQkJCVRva2VuOwkJCQkvLyBub24temVybyB1bmlxdWUgdG9rZW4KKwlVQ0hBUgkJCQlNb2RlOwkJCQkvLyBNZWFzdXJlbWVudCBNb2RlCisJVUNIQVIJCQkJVHlwZTsJCQkJLy8gTWVhc3VyZW1lbnQgdHlwZQorfQlNRUFTVVJFTUVOVF9SRVFVRVNUX0VMRU1FTlQsICpQTUVBU1VSRU1FTlRfUkVRVUVTVF9FTEVNRU5UOworCisvLyBNZWFzdXJlbWVudCBSZXBvcnQgZWxlbWVudCwgVGhpcyBpcyBsaXR0bGUgZW5kaWFuIG1vZGUKK3R5cGVkZWYJc3RydWN0CV9NRUFTVVJFTUVOVF9SRVBPUlRfRUxFTUVOVAl7CisJVVNIT1JUCQkJCUVpZDsKKwlVU0hPUlQJCQkJTGVuZ3RoOwkJCQkvLyBzd2FwMTYgcmVxdWlyZWQKKwlVU0hPUlQJCQkJVG9rZW47CQkJCS8vIG5vbi16ZXJvIHVuaXF1ZSB0b2tlbgorCVVDSEFSCQkJCU1vZGU7CQkJCS8vIE1lYXN1cmVtZW50IE1vZGUKKwlVQ0hBUgkJCQlUeXBlOwkJCQkvLyBNZWFzdXJlbWVudCB0eXBlCit9CU1FQVNVUkVNRU5UX1JFUE9SVF9FTEVNRU5ULCAqUE1FQVNVUkVNRU5UX1JFUE9SVF9FTEVNRU5UOworCisvLyBDaXNjbyBBaXJvbmV0IElBUFAgRnJhbWUgSGVhZGVyLCBOZXR3b3JrIGJ5dGUgb3JkZXIgdXNlZAordHlwZWRlZglzdHJ1Y3QJX0FJUk9ORVRfSUFQUF9IRUFERVIgeworCVVDSEFSCUNpc2NvU25hcEhlYWRlcls4XTsJLy8gOCBieXRlcyBDaXNjbyBzbmFwIGhlYWRlcgorCVVTSE9SVAlMZW5ndGg7CQkJCS8vIElBUFAgSUQgJiBsZW5ndGgsIHJlbWVtYmVyIHRvIHN3YXAxNiBpbiBMRSBzeXN0ZW0KKwlVQ0hBUglUeXBlOwkJCQkvLyBJQVBQIHR5cGUKKwlVQ0hBUglTdWJUeXBlOwkJCS8vIElBUFAgc3VidHlwZQorCVVDSEFSCURBWzZdOwkJCQkvLyBEZXN0aW5hdGlvbiBNQUMgYWRkcmVzcworCVVDSEFSCVNBWzZdOwkJCQkvLyBTb3VyY2UgTUFDIGFkZHJlc3MKKwlVU0hPUlQJVG9rZW47CQkJCS8vIERpYWxvZyB0b2tlbiwgbm8gbmVlZCB0byBzd2FwMTYgc2luY2UgaXQgaXMgZm9yIHlva2VuIHVzYWdlIG9ubHkKK30JQUlST05FVF9JQVBQX0hFQURFUiwgKlBBSVJPTkVUX0lBUFBfSEVBREVSOworCisvLyBSYWRpbyBNZWFzdXJlbWVudCBSZXF1ZXN0IGZyYW1lCit0eXBlZGVmCXN0cnVjdAlfQUlST05FVF9STV9SRVFVRVNUX0ZSQU1FCXsKKyAgICBBSVJPTkVUX0lBUFBfSEVBREVSCUlBUFA7CQkJLy8gQ29tbW9uIGhlYWRlcgorCVVDSEFSCQkJCURlbGF5OwkJCS8vIEFjdGl2YXRpb24gRGVsYXkKKwlVQ0hBUgkJCQlPZmZzZXQ7CQkJLy8gTWVhc3VyZW1lbnQgb2Zmc2V0Cit9CUFJUk9ORVRfUk1fUkVRVUVTVF9GUkFNRSwgKlBBSVJPTkVUX1JNX1JFUVVFU1RfRlJBTUU7CisKKy8vIFJhZGlvIE1lYXN1cmVtZW50IFJlcG9ydCBmcmFtZQordHlwZWRlZglzdHJ1Y3QJX0FJUk9ORVRfUk1fUkVQT1JUX0ZSQU1FCXsKKyAgICBBSVJPTkVUX0lBUFBfSEVBREVSCUlBUFA7CQkJLy8gQ29tbW9uIGhlYWRlcgorfQlBSVJPTkVUX1JNX1JFUE9SVF9GUkFNRSwgKlBBSVJPTkVUX1JNX1JFUE9SVF9GUkFNRTsKKworLy8gU2F2ZWQgZWxlbWVudCByZXF1ZXN0IGFjdGlvbnMgd2hpY2ggd2lsbCBzYXZlZCBpbiBTdGFDZmcuCit0eXBlZGVmCXN0cnVjdAlfUk1fUkVRVUVTVF9BQ1RJT04JeworCU1FQVNVUkVNRU5UX1JFUVVFU1RfRUxFTUVOVAlSZXFFbGVtOwkJLy8gU2F2ZWQgcmVxdWVzdCBlbGVtZW50CisJTUVBU1VSRU1FTlRfUkVRVUVTVAkJCU1lYXN1cmVtZW50OwkvLyBTYXZlZCBtZWFzdXJlbWVudCB3aXRoaW4gdGhlIHJlcXVlc3QgZWxlbWVudAorfQlSTV9SRVFVRVNUX0FDVElPTiwgKlBSTV9SRVFVRVNUX0FDVElPTjsKKworLy8gQ0NYIGFkbWluaXN0cmF0aW9uIGNvbnRyb2wKK3R5cGVkZWYJdW5pb24JX0NDWF9DT05UUk9MCXsKKwlzdHJ1Y3QJeworCQlVSU5UMzIJCUVuYWJsZToxOwkJCS8vIEVuYWJsZSBDQ1gyCisJCVVJTlQzMgkJTGVhcEVuYWJsZToxOwkJLy8gRW5hYmxlIExFQVAgYXQgQ0NYMgorCQlVSU5UMzIJCVJNRW5hYmxlOjE7CQkJLy8gUmFkaW8gTWVhc3VyZW1lbnQgRW5hYmxlCisJCVVJTlQzMgkJRENSTUVuYWJsZToxOwkJLy8gTm9uIHNlcnZpbmcgY2hhbm5lbCBSYWRpbyBNZWFzdXJlbWVudCBlbmFibGUKKwkJVUlOVDMyCQlRT1NFbmFibGU6MTsJCS8vIEVuYWJsZSBRT1MgZm9yIENDWCAyLjAgc3VwcG9ydAorCQlVSU5UMzIJCUZhc3RSb2FtRW5hYmxlOjE7CS8vIEVuYWJsZSBmYXN0IHJvYW1pbmcKKwkJVUlOVDMyCQlSc3ZkOjI7CQkJCS8vIE5vdCB1c2VkCisJCVVJTlQzMgkJZEJtVG9Sb2FtOjg7CQkvLyB0aGUgY29uZGl0aW9uIHRvIHJvYW0gd2hlbiByZWNlaXZpbmcgUnNzaSBsZXNzIHRoYW4gdGhpcyB2YWx1ZS4gSXQncyBuZWdhdGl2ZSB2YWx1ZS4KKwkJVUlOVDMyCQlUdUxpbWl0OjE2OwkJCS8vIExpbWl0IGZvciBkaWZmZXJlbnQgY2hhbm5lbCBzY2FuCisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlDQ1hfQ09OVFJPTCwgKlBDQ1hfQ09OVFJPTDsKKworI2VuZGlmCS8vIF9fQUlST05FVF9IX18KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvYXAuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZGM1NTc1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9hcC5oCkBAIC0wLDAgKzEsNTYyIEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgIE1vZHVsZSBOYW1lOgorICAgIGFwLmgKKworICAgIEFic3RyYWN0OgorICAgIE1pbmlwb3J0IGdlbmVyaWMgcG9ydGlvbiBoZWFkZXIgZmlsZQorCisgICAgUmV2aXNpb24gSGlzdG9yeToKKyAgICBXaG8gICAgICAgICBXaGVuICAgICAgICAgIFdoYXQKKyAgICAtLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBQYXVsIExpbiAgICAwOC0wMS0yMDAyICAgIGNyZWF0ZWQKKyAgICBKYW1lcyBUYW4gICAwOS0wNi0yMDAyICAgIG1vZGlmaWVkIChSZXZpc2UgTlRDUmVnVGFibGUpCisgICAgSm9obiBDaGFuZyAgMTItMjItMjAwNCAgICBtb2RpZmllZCBmb3IgUlQyNTYxLzI2NjEuIG1lcmdlIHdpdGggU1RBIGRyaXZlcgorKi8KKyNpZm5kZWYgX19BUF9IX18KKyNkZWZpbmUgX19BUF9IX18KKworCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT0gQVAgUlRNUC5oID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyAgICAgIEZ1bmN0aW9uIFByb3RvdHlwZXMKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLy8gYXBfZGF0YS5jCisKK0JPT0xFQU4gQVBCcmlkZ2VUb1dpcmVsZXNzU3RhKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorICAgIElOICBQVUNIQVIgICAgICAgICAgcEhlYWRlciwKKyAgICBJTiAgVUlOVCAgICAgICAgICAgIEhkckxlbiwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIHBEYXRhLAorICAgIElOICBVSU5UICAgICAgICAgICAgRGF0YUxlbiwKKyAgICBJTiAgVUxPTkcgICAgICAgICAgIGZyb213ZHNpZHgpOworCitCT09MRUFOIEFQSGFuZGxlUnhEb25lSW50ZXJydXB0KAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworVk9JRAlBUFNlbmRQYWNrZXRzKAorCUlOCU5ESVNfSEFORExFCQlNaW5pcG9ydEFkYXB0ZXJDb250ZXh0LAorCUlOCVBQTkRJU19QQUNLRVQJcHBQYWNrZXRBcnJheSwKKwlJTglVSU5UCQkJTnVtYmVyT2ZQYWNrZXRzKTsKKworTkRJU19TVEFUVVMgQVBTZW5kUGFja2V0KAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorICAgIElOICBQTkRJU19QQUNLRVQgICAgcFBhY2tldCk7CisKKworTkRJU19TVEFUVVMgQVBIYXJkVHJhbnNtaXQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVFhfQkxLCQkJKnBUeEJsaywKKwlJTglVQ0hBUgkJCVF1ZUlkeCk7CisKK1ZPSUQgQVBSeEVBUE9MRnJhbWVJbmRpY2F0ZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglNQUNfVEFCTEVfRU5UUlkJKnBFbnRyeSwKKwlJTglSWF9CTEsJCQkqcFJ4QmxrLAorCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpOworCitORElTX1NUQVRVUyBBUENoZWNrUnhFcnJvcigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQUlQyOFhYX1JYRF9TVFJVQwkJcFJ4RCwKKwlJTglVQ0hBUgkJCVdjaWQpOworCitCT09MRUFOIEFQQ2hlY2tDbGFzczJDbGFzczNFcnJvcigKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiBVTE9ORyBXY2lkLAorCUlOICBQSEVBREVSXzgwMl8xMSAgcEhlYWRlcik7CisKK1ZPSUQgQVBIYW5kbGVSeFBzUG9sbCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlwQWRkciwKKwlJTglVU0hPUlQJCQlBaWQsCisgICAgSU4JQk9PTEVBTgkJCWlzQWN0aXZlKTsKKworVk9JRCAgICBSVE1QRGVzY3JpcHRvckVuZGlhbkNoYW5nZSgKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIHBEYXRhLAorICAgIElOICBVTE9ORyAgICAgICAgICAgRGVzY3JpcHRvclR5cGUpOworCitWT0lEICAgIFJUTVBGcmFtZUVuZGlhbkNoYW5nZSgKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIHBEYXRhLAorICAgIElOICBVTE9ORyAgICAgICAgICAgRGlyLAorICAgIElOICBCT09MRUFOICAgICAgICAgRnJvbVJ4RG9uZUludCk7CisKKy8vIGFwX2Fzc29jLmMKKworVk9JRCBBUEFzc29jU3RhdGVNYWNoaW5lSW5pdCgKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKyAgICBJTiAgU1RBVEVfTUFDSElORSAqUywKKyAgICBPVVQgU1RBVEVfTUFDSElORV9GVU5DIFRyYW5zW10pOworCitWT0lEICBBUFBlZXJBc3NvY1JlcUFjdGlvbigKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKyAgICBJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCAgQVBQZWVyUmVhc3NvY1JlcUFjdGlvbigKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKyAgICBJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCAgQVBQZWVyRGlzYXNzb2NSZXFBY3Rpb24oCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisgICAgSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgTWJzc0tpY2tPdXRTdGFzKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIElOVCBhcGlkeCwKKwlJTiBVU0hPUlQgUmVhc29uKTsKKworVk9JRCBBUE1sbWVLaWNrT3V0U3RhKAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFBVQ0hBUiBwU3RhQWRkciwKKwlJTiBVQ0hBUiBXY2lkLAorCUlOIFVTSE9SVCBSZWFzb24pOworCitWT0lEIEFQTWxtZURpc2Fzc29jUmVxQWN0aW9uKAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgIEFQQ2xzM2VyckFjdGlvbigKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAJVUxPTkcgV2NpZCwKKyAgICBJTglQSEVBREVSXzgwMl8xMQlwSGVhZGVyKTsKKworCitVU0hPUlQgQVBCdWlsZEFzc29jaWF0aW9uKAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIE1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5LAorICAgIElOIFVTSE9SVCBDYXBhYmlsaXR5SW5mbywKKyAgICBJTiBVQ0hBUiAgTWF4U3VwcG9ydGVkUmF0ZUluNTAwS2JwcywKKyAgICBJTiBVQ0hBUiAgKlJTTiwKKyAgICBJTiBVQ0hBUiAgKnBSU05MZW4sCisgICAgSU4gQk9PTEVBTiBiV21tQ2FwYWJsZSwKKyAgICBJTiBVTE9ORyAgUmFsaW5rSWUsCisjaWZkZWYgRE9UMTFOX0RSQUZUMworICAgIElOIEVYVF9DQVBfSU5GT19FTEVNRU5UIEV4dENhcEluZm8sCisjZW5kaWYgLy8gRE9UMTFOX0RSQUZUMyAvLworCUlOIEhUX0NBUEFCSUxJVFlfSUUJCSpwSHRDYXBhYmlsaXR5LAorCUlOIFVDSEFSCQkgSHRDYXBhYmlsaXR5TGVuLAorICAgIE9VVCBVU0hPUlQgKnBBaWQpOworCisvKgorVk9JRAlSVE1QQWRkQ2xpZW50U2VjKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVDSEFSCUJzc0lkeCwKKwlJTiBVQ0hBUgkJIEtleUlkeCwKKwlJTiBVQ0hBUgkJIENpcGhlckFsZywKKwlJTiBQVUNIQVIJCSBwS2V5LAorCUlOIFBVQ0hBUgkJIHBUeE1pYywKKwlJTiBQVUNIQVIJCSBwUnhNaWMsCisJSU4gTUFDX1RBQkxFX0VOVFJZICpwRW50cnkpOworKi8KKworLy8gYXBfYXV0aC5jCisKK3ZvaWQgQVBBdXRoU3RhdGVNYWNoaW5lSW5pdCgKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBTVEFURV9NQUNISU5FICpTbSwKKyAgICBPVVQgU1RBVEVfTUFDSElORV9GVU5DIFRyYW5zW10pOworCitWT0lEIEFQTWxtZURlYXV0aFJlcUFjdGlvbigKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIEFQQ2xzMmVyckFjdGlvbigKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiAJVUxPTkcgV2NpZCwKKyAgICBJTglQSEVBREVSXzgwMl8xMQlwSGVhZGVyKTsKKworLy8gYXBfYXV0aHJzcC5jCisKK1ZPSUQgQVBBdXRoUnNwU3RhdGVNYWNoaW5lSW5pdCgKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBQU1RBVEVfTUFDSElORSBTbSwKKyAgICBJTiBTVEFURV9NQUNISU5FX0ZVTkMgVHJhbnNbXSk7CisKK1ZPSUQgQVBQZWVyQXV0aEF0QXV0aFJzcElkbGVBY3Rpb24oCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisgICAgSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgQVBQZWVyRGVhdXRoUmVxQWN0aW9uKAorICAgIElOIFBSVE1QX0FEQVBURVIJcEFkLAorICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgQVBQZWVyQXV0aFNpbXBsZVJzcEdlbkFuZFNlbmQoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisgICAgSU4gIFBIRUFERVJfODAyXzExIHBIZHI4MDIxMSwKKyAgICBJTiAgVVNIT1JUIEFsZywKKyAgICBJTiAgVVNIT1JUIFNlcSwKKyAgICBJTiAgVVNIT1JUIFN0YXR1c0NvZGUpOworCisvLyBhcF9jb25uZWN0LmMKKworQk9PTEVBTiBCZWFjb25UcmFuc21pdFJlcXVpcmVkKAorCUlOIFBSVE1QX0FEQVBURVIJcEFkLAorCUlOIElOVAkJCQlhcGlkeCk7CisKK1ZPSUQgQVBNYWtlQnNzQmVhY29uKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOCUlOVAkJCQlhcGlkeCk7CisKK1ZPSUQgIEFQVXBkYXRlQmVhY29uRnJhbWUoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4JSU5UCQkJCWFwaWR4KTsKKworVk9JRCBBUE1ha2VBbGxCc3NCZWFjb24oCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitWT0lEICBBUFVwZGF0ZUFsbEJlYWNvbkZyYW1lKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworCisvLyBhcF9zeW5jLmMKKworVk9JRCBBUFN5bmNTdGF0ZU1hY2hpbmVJbml0KAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIFNUQVRFX01BQ0hJTkUgKlNtLAorICAgIE9VVCBTVEFURV9NQUNISU5FX0ZVTkMgVHJhbnNbXSk7CisKK1ZPSUQgQVBTY2FuVGltZW91dCgKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCisJSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpOworCitWT0lEIEFQSW52YWxpZFN0YXRlV2hlblNjYW4oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBBUFNjYW5UaW1lb3V0QWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgQVBQZWVyUHJvYmVSZXFBY3Rpb24oCisgICAgSU4gIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIEFQUGVlckJlYWNvbkFjdGlvbigKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIEFQTWxtZVNjYW5SZXFBY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBBUFBlZXJCZWFjb25BdFNjYW5BY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBBUFNjYW5DbmNsQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgQXBTaXRlU3VydmV5KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKworVk9JRCBTdXBwb3J0UmF0ZSgKKwlJTiBQVUNIQVIgU3VwUmF0ZSwKKwlJTiBVQ0hBUiBTdXBSYXRlTGVuLAorCUlOIFBVQ0hBUiBFeHRSYXRlLAorCUlOIFVDSEFSIEV4dFJhdGVMZW4sCisJT1VUIFBVQ0hBUiAqUmF0ZXMsCisJT1VUIFBVQ0hBUiBSYXRlc0xlbiwKKwlPVVQgUFVDSEFSIHBNYXhTdXBwb3J0UmF0ZSk7CisKKworQk9PTEVBTiBBcFNjYW5SdW5uaW5nKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKworI2lmZGVmIERPVDExTl9EUkFGVDMKK1ZPSUQgQVBPdmVybGFwcGluZ0JTU1NjYW4oCisJSU4gUlRNUF9BREFQVEVSICpwQWQpOworI2VuZGlmIC8vIERPVDExTl9EUkFGVDMgLy8KKworLy8gYXBfd3BhLmMKKworVk9JRCBBUFdwYVN0YXRlTWFjaGluZUluaXQoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisgICAgSU4gIFNUQVRFX01BQ0hJTkUgKlNtLAorICAgIE9VVCBTVEFURV9NQUNISU5FX0ZVTkMgVHJhbnNbXSk7CisKKy8vIGFwX21sbWUuYworCitWT0lEIEFQTWxtZVBlcmlvZGljRXhlYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK1ZPSUQgQVBNbG1lU2VsZWN0VHhSYXRlVGFibGUoCisJSU4gUFJUTVBfQURBUFRFUgkJcEFkLAorCUlOIFBNQUNfVEFCTEVfRU5UUlkJCXBFbnRyeSwKKwlJTiBQVUNIQVIJCQkJKnBwVGFibGUsCisJSU4gUFVDSEFSCQkJCXBUYWJsZVNpemUsCisJSU4gUFVDSEFSCQkJCXBJbml0VHhSYXRlSWR4KTsKKworVk9JRCBBUE1sbWVTZXRUeFJhdGUoCisJSU4gUFJUTVBfQURBUFRFUgkJcEFkLAorCUlOIFBNQUNfVEFCTEVfRU5UUlkJCXBFbnRyeSwKKwlJTiBQUlRNUF9UWF9SQVRFX1NXSVRDSAlwVHhSYXRlKTsKKworVk9JRCBBUE1sbWVEeW5hbWljVHhSYXRlU3dpdGNoaW5nKAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkKTsKKworVk9JRCBBUFF1aWNrUmVzcG9uZUZvclJhdGVVcEV4ZWMoCisgICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorICAgIElOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKKyAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisgICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKKworQk9PTEVBTiBBUE1zZ1R5cGVTdWJzdCgKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBQRlJBTUVfODAyXzExIHBGcmFtZSwKKyAgICBPVVQgSU5UICpNYWNoaW5lLAorICAgIE9VVCBJTlQgKk1zZ1R5cGUpOworCitWT0lEIEFQUXVpY2tSZXNwb25lRm9yUmF0ZVVwRXhlYygKKyAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCisgICAgSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAorICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKKyAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpOworCisjaWZkZWYgUlQyODcwCitWT0lEIEJlYWNvblVwZGF0ZUV4ZWMoCisgICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorICAgIElOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKKyAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisgICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKKyNlbmRpZiAvLyBSVDI4NzAgLy8KKworVk9JRCBSVE1QU2V0UGlnZ3lCYWNrKAorCUlOIFBSVE1QX0FEQVBURVIJcEFkLAorCUlOIEJPT0xFQU4JCQliUGlnZ3lCYWNrKTsKKworVk9JRCBBUEFzaWNFdmFsdWF0ZVJ4QW50KAorCUlOIFBSVE1QX0FEQVBURVIJcEFkKTsKKworVk9JRCBBUEFzaWNSeEFudEV2YWxUaW1lb3V0KAorCUlOIFBSVE1QX0FEQVBURVIJcEFkKTsKKworLy8gYXAuYworCitWT0lEIEFQU3dpdGNoQ2hhbm5lbCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBJTlQgQ2hhbm5lbCk7CisKK05ESVNfU1RBVFVTIEFQSW5pdGlhbGl6ZSgKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK1ZPSUQgQVBTaHV0ZG93bigKKyAgICBJTiBQUlRNUF9BREFQVEVSICAgIHBBZCk7CisKK1ZPSUQgQVBTdGFydFVwKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworVk9JRCBBUFN0b3AoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitWT0lEIEFQQ2xlYW51cFBzUXVldWUoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisgICAgSU4gIFBRVUVVRV9IRUFERVIgICBwUXVldWUpOworCitWT0lEIE1hY1RhYmxlUmVzZXQoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitNQUNfVEFCTEVfRU5UUlkgKk1hY1RhYmxlSW5zZXJ0RW50cnkoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBwQWRkciwKKwlJTglVQ0hBUgkJCWFwaWR4LAorCUlOIEJPT0xFQU4JQ2xlYW5BbGwpOworCitCT09MRUFOIE1hY1RhYmxlRGVsZXRlRW50cnkoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gVVNIT1JUIHdjaWQsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBwQWRkcik7CisKK01BQ19UQUJMRV9FTlRSWSAqTWFjVGFibGVMb29rdXAoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBwQWRkcik7CisKK1ZPSUQgTWFjVGFibGVNYWludGVuYW5jZSgKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK1VJTlQzMiBNYWNUYWJsZUFzc29jU3RhTnVtR2V0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKworTUFDX1RBQkxFX0VOVFJZICpBUFNzUHNJbnF1aXJ5KAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorICAgIElOICBQVUNIQVIgICAgICAgICAgcEFkZHIsCisgICAgT1VUIFNTVCAgICAgICAgICAgICAqU3N0LAorICAgIE9VVCBVU0hPUlQgICAgICAgICAgKkFpZCwKKyAgICBPVVQgVUNIQVIgICAgICAgICAgICpQc01vZGUsCisgICAgT1VUIFVDSEFSICAgICAgICAgICAqUmF0ZSk7CisKK0JPT0xFQU4gQVBQc0luZGljYXRlKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorICAgIElOICBQVUNIQVIgICAgICAgICAgcEFkZHIsCisJSU4gVUxPTkcgV2NpZCwKKyAgICBJTiAgVUNIQVIgICAgICAgICAgIFBzbSk7CisKK1ZPSUQgQXBMb2dFdmVudCgKKyAgICBJTiBQUlRNUF9BREFQVEVSICAgIHBBZCwKKyAgICBJTiBQVUNIQVIgICAgICAgICAgIHBBZGRyLAorICAgIElOIFVTSE9SVCAgICAgICAgICAgRXZlbnQpOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCitWT0lEIEFQVXBkYXRlT3BlcmF0aW9uTW9kZSgKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKK1ZPSUQgQVBVcGRhdGVDYXBhYmlsaXR5QW5kRXJwSWUoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpOworCitCT09MRUFOIEFwQ2hlY2tBY2Nlc3NDb250cm9sTGlzdCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBQVUNIQVIgICAgICAgIHBBZGRyLAorCUlOIFVDSEFSICAgICAgICAgQXBpZHgpOworCitWT0lEIEFwVXBkYXRlQWNjZXNzQ29udHJvbExpc3QoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gVUNIQVIgICAgICAgICBBcGlkeCk7CisKK1ZPSUQgQXBFbnF1ZXVlTnVsbEZyYW1lKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFBVQ0hBUiAgICAgICAgcEFkZHIsCisJSU4gVUNIQVIgICAgICAgICBUeFJhdGUsCisJSU4gVUNIQVIgICAgICAgICBQSUQsCisJSU4gVUNIQVIgICAgICAgICBhcGlkeCwKKyAgICBJTiBCT09MRUFOICAgICAgIGJRb3NOdWxsLAorICAgIElOIEJPT0xFQU4gICAgICAgYkVPU1AsCisgICAgSU4gVUNIQVIgICAgICAgICBPbGRVUCk7CisKK1ZPSUQgQXBTZW5kRnJhbWUoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisgICAgSU4gIFBWT0lEICAgICAgICAgICBwQnVmZmVyLAorICAgIElOICBVTE9ORyAgICAgICAgICAgTGVuZ3RoLAorICAgIElOICBVQ0hBUiAgICAgICAgICAgVHhSYXRlLAorICAgIElOICBVQ0hBUiAgICAgICAgICAgUElEKTsKKworVk9JRCBBcEVucXVldWVBY2tGcmFtZSgKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBQVUNIQVIgICAgICAgIHBBZGRyLAorICAgIElOIFVDSEFSICAgICAgICAgVHhSYXRlLAorCUlOIFVDSEFSICAgICAgICAgYXBpZHgpOworCitVQ0hBUiBBUEF1dG9TZWxlY3RDaGFubmVsKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIEJPT0xFQU4gT3B0aW1hbCk7CisKKy8vIGFwX3Nhbml0eS5jCisKKworQk9PTEVBTiBQZWVyQXNzb2NSZXFDbW1TYW5pdHkoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gQk9PTEVBTiBpc1Jlc3NvYywKKyAgICBJTiBWT0lEICpNc2csCisgICAgSU4gVUxPTkcgTXNnTGVuLAorICAgIE9VVCBQVUNIQVIgcEFkZHIyLAorICAgIE9VVCBVU0hPUlQgKnBDYXBhYmlsaXR5SW5mbywKKyAgICBPVVQgVVNIT1JUICpwTGlzdGVuSW50ZXJ2YWwsCisgICAgT1VUIFBVQ0hBUiBwQXBBZGRyLAorICAgIE9VVCBVQ0hBUiAqcFNzaWRMZW4sCisgICAgT1VUIGNoYXIgKlNzaWQsCisgICAgT1VUIFVDSEFSICpwUmF0ZXNMZW4sCisgICAgT1VUIFVDSEFSIFJhdGVzW10sCisgICAgT1VUIFVDSEFSICpSU04sCisgICAgT1VUIFVDSEFSICpwUlNOTGVuLAorICAgIE9VVCBCT09MRUFOICpwYldtbUNhcGFibGUsCisjaWZkZWYgV1NDX0FQX1NVUFBPUlQKKyAgICBPVVQgQk9PTEVBTiAqcFdzY0NhcGFibGUsCisjZW5kaWYgLy8gV1NDX0FQX1NVUFBPUlQgLy8KKyAgICBPVVQgVUxPTkcgICpwUmFsaW5rSWUsCisjaWZkZWYgRE9UMTFOX0RSQUZUMworICAgIE9VVCBFWFRfQ0FQX0lORk9fRUxFTUVOVAkqcEV4dENhcEluZm8sCisjZW5kaWYgLy8gRE9UMTFOX0RSQUZUMyAvLworICAgIE9VVCBVQ0hBUgkJICpwSHRDYXBhYmlsaXR5TGVuLAorICAgIE9VVCBIVF9DQVBBQklMSVRZX0lFICpwSHRDYXBhYmlsaXR5KTsKKworQk9PTEVBTiBQZWVyRGlzYXNzb2NSZXFTYW5pdHkoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gVk9JRCAqTXNnLAorICAgIElOIFVMT05HIE1zZ0xlbiwKKyAgICBPVVQgUFVDSEFSIHBBZGRyMiwKKyAgICBPVVQgVVNIT1JUICpSZWFzb24pOworCitCT09MRUFOIFBlZXJEZWF1dGhSZXFTYW5pdHkoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gVk9JRCAqTXNnLAorICAgIElOIFVMT05HIE1zZ0xlbiwKKyAgICBPVVQgUFVDSEFSIHBBZGRyMiwKKyAgICBPVVQgVVNIT1JUICpSZWFzb24pOworCitCT09MRUFOIEFQUGVlckF1dGhTYW5pdHkoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gVk9JRCAqTXNnLAorICAgIElOIFVMT05HIE1zZ0xlbiwKKwlPVVQgUFVDSEFSIHBBZGRyMSwKKyAgICBPVVQgUFVDSEFSIHBBZGRyMiwKKyAgICBPVVQgVVNIT1JUICpBbGcsCisgICAgT1VUIFVTSE9SVCAqU2VxLAorICAgIE9VVCBVU0hPUlQgKlN0YXR1cywKKyAgICBDSEFSICpDaGxnVGV4dCk7CisKK0JPT0xFQU4gQVBQZWVyUHJvYmVSZXFTYW5pdHkoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gVk9JRCAqTXNnLAorICAgIElOIFVMT05HIE1zZ0xlbiwKKyAgICBPVVQgUFVDSEFSIHBBZGRyMiwKKyAgICBPVVQgQ0hBUiBTc2lkW10sCisgICAgT1VUIFVDSEFSICpTc2lkTGVuKTsKKworQk9PTEVBTiBBUFBlZXJCZWFjb25BbmRQcm9iZVJzcFNhbml0eSgKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBWT0lEICpNc2csCisgICAgSU4gVUxPTkcgTXNnTGVuLAorICAgIE9VVCBQVUNIQVIgcEFkZHIyLAorICAgIE9VVCBQVUNIQVIgcEJzc2lkLAorICAgIE9VVCBDSEFSIFNzaWRbXSwKKyAgICBPVVQgVUNIQVIgKlNzaWRMZW4sCisgICAgT1VUIFVDSEFSICpCc3NUeXBlLAorICAgIE9VVCBVU0hPUlQgKkJlYWNvblBlcmlvZCwKKyAgICBPVVQgVUNIQVIgKkNoYW5uZWwsCisgICAgT1VUIExBUkdFX0lOVEVHRVIgKlRpbWVzdGFtcCwKKyAgICBPVVQgVVNIT1JUICpDYXBhYmlsaXR5SW5mbywKKyAgICBPVVQgVUNIQVIgUmF0ZVtdLAorICAgIE9VVCBVQ0hBUiAqUmF0ZUxlbiwKKyAgICBPVVQgQk9PTEVBTiAqRXh0ZW5kZWRSYXRlSWVFeGlzdCwKKyAgICBPVVQgVUNIQVIgKkVycCk7CisKKy8vIGFwX2luZm8uYworCisKKworLy8gPT09PT09PT09PT09PT09PT09IGVuZCBvZiBBUCBSVE1QLmggPT09PT09PT09PT09PT09PT09PT09PT09CisKKworI2VuZGlmICAvLyBfX0FQX0hfXworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NobGlzdC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jaGxpc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTE1YjlkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jaGxpc3QuaApAQCAtMCwwICsxLDEyOTYgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJTW9kdWxlIE5hbWU6CisJY2hsaXN0LmMKKworCUFic3RyYWN0OgorCisJUmV2aXNpb24gSGlzdG9yeToKKwlXaG8gICAgICAgICBXaGVuICAgICAgICAgIFdoYXQKKwktLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlGb25jaGkgV3UgICAyMDA3LTEyLTE5ICAgIGNyZWF0ZWQKKyovCisKKyNpZm5kZWYgX19DSExJU1RfSF9fCisjZGVmaW5lIF9fQ0hMSVNUX0hfXworCisjaW5jbHVkZSAicnRtcF90eXBlLmgiCisjaW5jbHVkZSAicnRtcF9kZWYuaCIKKworCisjZGVmaW5lIE9ET1IJCQkwCisjZGVmaW5lIElET1IJCQkxCisjZGVmaW5lIEJPVEgJCQkyCisKKyNkZWZpbmUgQkFORF81RyAgICAgICAgIDAKKyNkZWZpbmUgQkFORF8yNEcgICAgICAgIDEKKyNkZWZpbmUgQkFORF9CT1RIICAgICAgIDIKKwordHlwZWRlZiBzdHJ1Y3QgX0NIX0RFU1AgeworCVVDSEFSIEZpcnN0Q2hhbm5lbDsKKwlVQ0hBUiBOdW1PZkNoOworCUNIQVIgTWF4VHhQd3I7CQkJLy8gZEJtCisJVUNIQVIgR2VvZ3JhcGh5OwkJCS8vIDA6b3V0IGRvb3IsIDE6aW4gZG9vciwgMjpib3RoCisJQk9PTEVBTiBEZnNSZXE7CQkJLy8gRGZzIHJlcXVpcmUsIDA6IE5vLCAxOiB5ZXMuCit9IENIX0RFU1AsICpQQ0hfREVTUDsKKwordHlwZWRlZiBzdHJ1Y3QgX0NIX1JFR0lPTiB7CisJVUNIQVIgQ291bnRSZWdbM107CisJVUNIQVIgRGZzVHlwZTsJCQkvLyAwOiBDRSwgMTogRkNDLCAyOiBKQVAsIDM6SkFQX1c1MywgSkFQX1c1NgorCUNIX0RFU1AgQ2hEZXNwWzEwXTsKK30gQ0hfUkVHSU9OLCAqUENIX1JFR0lPTjsKKworc3RhdGljIENIX1JFR0lPTiBDaFJlZ2lvbltdID0KK3sKKwkJewkvLyBBbnRpZ3VhIGFuZCBCZXJidWRhCisJCQkiQUciLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsICA0LCAgMjMsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgIDQsICAyMywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDEwMCwgMTEsIDMwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxMDB+MTQwCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBBcmdlbnRpbmEKKwkJCSJBUiIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyA1MiwgIDQsICAyNCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDE0OSwgNCwgIDMwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxNDl+MTYxCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBBcnViYQorCQkJIkFXIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDM2LCAgNCwgIDIzLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgNTIsICA0LCAgMjMsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAxMDAsIDExLCAzMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTAwfjE0MAorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gQXVzdHJhbGlhCisJCQkiQVUiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsICA0LCAgMjMsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgIDQsICAyNCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDE0OSwgNSwgIDMwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxNDl+MTY1CisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBBdXN0cmlhCisJCQkiQVQiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsICA0LCAgMjMsIElET1IsIFRSVUV9LAkJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgIDQsICAyMywgSURPUiwgVFJVRX0sCQkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDEwMCwgMTEsIDMwLCBCT1RILCBUUlVFfSwJCS8vIDVHLCBjaCAxMDB+MTQwCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBCYWhhbWFzCisJCQkiQlMiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsICA0LCAgMjMsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgIDQsICAyNCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDE0OSwgNSwgIDMwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxNDl+MTY1CisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBCYXJiYWRvcworCQkJIkJCIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDM2LCAgNCwgIDIzLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgNTIsICA0LCAgMjQsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAxMDAsIDExLCAzMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTAwfjE0MAorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gQmVybXVkYQorCQkJIkJNIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDM2LCAgNCwgIDIzLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgNTIsICA0LCAgMjQsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAxMDAsIDExLCAzMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTAwfjE0MAorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gQnJhemlsCisJCQkiQlIiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsICA0LCAgMjMsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgIDQsICAyNCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDEwMCwgMTEsIDI0LCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxMDB+MTQwCisJCQkJeyAxNDksIDUsICAzMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTAwfjE0MAorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gQmVsZ2l1bQorCQkJIkJFIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDM2LCAgNCwgIDE4LCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgNTIsICA0LCAgMTgsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBCdWxnYXJpYQorCQkJIkJHIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDM2LCAgNCwgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgNTIsICA0LCAgMjMsIElET1IsIFRSVUV9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDEwMCwgMTEsIDMwLCBPRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDEwMH4xNDAKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIENhbmFkYQorCQkJIkNBIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDM2LCAgNCwgIDIzLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgNTIsICA0LCAgMjMsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAxNDksIDUsICAzMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTQ5fjE2NQorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gQ2F5bWFuIElzTGFuZHMKKwkJCSJLWSIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgIDQsICAyMywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAgNCwgIDI0LCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTAwLCAxMSwgMzAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDEwMH4xNDAKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIENoaWxlCisJCQkiQ0wiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsICA0LCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgIDQsICAyMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDE0OSwgNSwgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxNDl+MTY1CisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBDaGluYQorCQkJIkNOIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDE0OSwgNCwgIDI3LCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxNDl+MTYxCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBDb2xvbWJpYQorCQkJIkNPIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDM2LCAgNCwgIDE3LCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgNTIsICA0LCAgMjQsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAxMDAsIDExLCAzMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTAwfjE0MAorCQkJCXsgMTQ5LCA1LCAgMzAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjUKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIENvc3RhIFJpY2EKKwkJCSJDUiIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgIDQsICAxNywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAgNCwgIDI0LCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTQ5LCA0LCAgMzAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjEKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIEN5cHJ1cworCQkJIkNZIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDM2LCAgNCwgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgNTIsICA0LCAgMjQsIElET1IsIFRSVUV9LAkJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAxMDAsIDExLCAzMCwgQk9USCwgVFJVRX0sCQkvLyA1RywgY2ggMTAwfjE0MAorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gQ3plY2hfUmVwdWJsaWMKKwkJCSJDWiIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgIDQsICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAgNCwgIDIzLCBJRE9SLCBUUlVFfSwJCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gRGVubWFyaworCQkJIkRLIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDM2LCAgNCwgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgNTIsICA0LCAgMjMsIElET1IsIFRSVUV9LAkJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAxMDAsIDExLCAzMCwgQk9USCwgVFJVRX0sCQkvLyA1RywgY2ggMTAwfjE0MAorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gRG9taW5pY2FuIFJlcHVibGljCisJCQkiRE8iLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDAsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMAorCQkJCXsgMTQ5LCA0LCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjEKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIEVxdWFkb3IKKwkJCSJFQyIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMTAwLCAxMSwgIDI3LCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxMDB+MTQwCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBFbCBTYWx2YWRvcgorCQkJIlNWIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgIDQsICAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgIDQsICAgMzAsIEJPVEgsIFRSVUV9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDE0OSwgNCwgICAzNiwgQk9USCwgVFJVRX0sCS8vIDVHLCBjaCAxNDl+MTY1CisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBGaW5sYW5kCisJCQkiRkkiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDM2LCAgNCwgICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAgNCwgICAyMywgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTAwLCAxMSwgIDMwLCBCT1RILCBUUlVFfSwJLy8gNUcsIGNoIDEwMH4xNDAKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIEZyYW5jZQorCQkJIkZSIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgIDQsICAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgIDQsICAgMjMsIElET1IsIFRSVUV9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIEdlcm1hbnkKKwkJCSJERSIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsICA0LCAgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgNTIsICA0LCAgIDIzLCBJRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAxMDAsIDExLCAgMzAsIEJPVEgsIFRSVUV9LAkvLyA1RywgY2ggMTAwfjE0MAorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gR3JlZWNlCisJCQkiR1IiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDM2LCAgNCwgICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAgNCwgICAyMywgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTAwLCAxMSwgIDMwLCBPRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDEwMH4xNDAKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIEd1YW0KKwkJCSJHVSIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTEsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMQorCQkJCXsgMzYsICA0LCAgIDE3LCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgNTIsICA0LCAgIDI0LCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTAwLCAxMSwgIDMwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxMDB+MTQwCisJCQkJeyAxNDksICA1LCAgMzAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjUKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIEd1YXRlbWFsYQorCQkJIkdUIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgIDQsICAgMTcsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgIDQsICAgMjQsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAxNDksICA0LCAgMzAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjEKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIEhhaXRpCisJCQkiSFQiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDM2LCAgNCwgICAxNywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAgNCwgICAyNCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDE0OSwgIDQsICAzMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTQ5fjE2MQorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gSG9uZHVyYXMKKwkJCSJITiIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMTQ5LCAgNCwgIDI3LCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxNDl+MTYxCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBIb25nIEtvbmcKKwkJCSJISyIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsICAgNCwgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgNTIsICAgNCwgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTQ5LCAgNCwgIDMwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxNDl+MTYxCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBIdW5nYXJ5CisJCQkiSFUiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDM2LCAgIDQsICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAgIDQsICAyMywgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gSWNlbGFuZAorCQkJIklTIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgICA0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgICA0LCAgMjMsIElET1IsIFRSVUV9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDEwMCwgMTEsICAzMCwgQk9USCwgVFJVRX0sCS8vIDVHLCBjaCAxMDB+MTQwCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBJbmRpYQorCQkJIklOIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAxNDksIAk0LCAgMjQsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjEKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIEluZG9uZXNpYQorCQkJIklEIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAxNDksIAk0LCAgMjcsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjEKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIElyZWxhbmQKKwkJCSJJRSIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsIAk0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgCTQsICAyMywgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTAwLCAxMSwgIDMwLCBPRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDEwMH4xNDAKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIElzcmFlbAorCQkJIklMIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAgMywgIDIwLCBJRE9SLCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjMKKwkJCQl7IDQsIAk2LCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDR+OQorCQkJCXsgMTAsIAk0LCAgMjAsIElET1IsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDEwfjEzCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBJdGFseQorCQkJIklUIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgCTQsICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAJNCwgIDIzLCBJRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAxMDAsIDExLCAgMzAsIE9ET1IsIFRSVUV9LAkvLyA1RywgY2ggMTAwfjE0MAorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gSmFwYW4KKwkJCSJKUCIsCisJCQlKQVAsCisJCQl7CisJCQkJeyAxLCAgIDE0LCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTQKKwkJCQl7IDM2LCAJNCwgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gSm9yZGFuCisJCQkiSk8iLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAgMjAsIElET1IsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDM2LCAJNCwgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgMTQ5LCAJNCwgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAxNDl+MTYxCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBMYXR2aWEKKwkJCSJMViIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsIAk0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgCTQsICAyMywgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTAwLCAxMSwgIDMwLCBCT1RILCBUUlVFfSwJLy8gNUcsIGNoIDEwMH4xNDAKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIExpZWNodGVuc3RlaW4KKwkJCSJMSSIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgNTIsIAk0LCAgMjMsIElET1IsIFRSVUV9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDEwMCwgMTEsICAzMCwgQk9USCwgVFJVRX0sCS8vIDVHLCBjaCAxMDB+MTQwCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBMaXRodWFuaWEKKwkJCSJMVCIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsIAk0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgCTQsICAyMywgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTAwLCAxMSwgIDMwLCBCT1RILCBUUlVFfSwJLy8gNUcsIGNoIDEwMH4xNDAKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIEx1eGVtYnVyZworCQkJIkxVIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgCTQsICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAJNCwgIDIzLCBJRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAxMDAsIDExLCAgMzAsIEJPVEgsIFRSVUV9LAkvLyA1RywgY2ggMTAwfjE0MAorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gTWFsYXlzaWEKKwkJCSJNWSIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDM2LCAJNCwgIDIzLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgNTIsIAk0LCAgMjMsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAxNDksICA1LCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjUKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIE1hbHRhCisJCQkiTVQiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDM2LCAJNCwgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgNTIsIAk0LCAgMjMsIElET1IsIFRSVUV9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDEwMCwgMTEsICAzMCwgQk9USCwgVFJVRX0sCS8vIDVHLCBjaCAxMDB+MTQwCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBNYXJvY2NvCisJCQkiTUEiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDM2LCAJNCwgIDI0LCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gTWV4aWNvCisJCQkiTVgiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDM2LCAJNCwgIDIzLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgNTIsIAk0LCAgMjQsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAxNDksICA1LCAgMzAsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjUKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIE5ldGhlcmxhbmRzCisJCQkiTkwiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDM2LCAJNCwgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgNTIsIAk0LCAgMjQsIElET1IsIFRSVUV9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDEwMCwgMTEsICAzMCwgQk9USCwgVFJVRX0sCS8vIDVHLCBjaCAxMDB+MTQwCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBOZXcgWmVhbGFuZAorCQkJIk5aIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgCTQsICAyNCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAJNCwgIDI0LCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTQ5LCAgNCwgIDMwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxNDl+MTYxCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBOb3J3YXkKKwkJCSJOTyIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsIAk0LCAgMjQsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgCTQsICAyNCwgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTAwLCAxMSwgIDMwLCBCT1RILCBUUlVFfSwJLy8gNUcsIGNoIDE0OX4xNjEKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIFBlcnUKKwkJCSJQRSIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMTQ5LCAgNCwgIDI3LCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxNDl+MTYxCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBQb3J0dWdhbAorCQkJIlBUIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgICA0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgICA0LCAgMjMsIElET1IsIFRSVUV9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDEwMCwgMTEsICAzMCwgQk9USCwgVFJVRX0sCS8vIDVHLCBjaCAxMDB+MTQwCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBQb2xhbmQKKwkJCSJQTCIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsICAgNCwgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgNTIsICAgNCwgIDIzLCBJRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAxMDAsIDExLCAgMzAsIEJPVEgsIFRSVUV9LAkvLyA1RywgY2ggMTAwfjE0MAorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gUm9tYW5pYQorCQkJIlJPIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgICA0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgICA0LCAgMjMsIElET1IsIFRSVUV9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDEwMCwgMTEsICAzMCwgQk9USCwgVFJVRX0sCS8vIDVHLCBjaCAxMDB+MTQwCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBSdXNzaWEKKwkJCSJSVSIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMTQ5LCAgNCwgIDIwLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAxNDl+MTYxCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBTYXVkaSBBcmFiaWEKKwkJCSJTQSIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsICAgNCwgIDIzLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgNTIsICAgNCwgIDIzLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTQ5LCAgNCwgIDIzLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxNDl+MTYxCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBTZXJiaWFfYW5kX01vbnRlbmVncm8KKwkJCSJDUyIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gU2luZ2Fwb3JlCisJCQkiU0ciLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDM2LCAgIDQsICAyMywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAgIDQsICAyMywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDE0OSwgIDQsICAyMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTQ5fjE2MQorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gU2xvdmFraWEKKwkJCSJTSyIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsICAgNCwgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgNTIsICAgNCwgIDIzLCBJRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAxMDAsIDExLCAgMzAsIEJPVEgsIFRSVUV9LAkvLyA1RywgY2ggMTAwfjE0MAorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gU2xvdmVuaWEKKwkJCSJTSSIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsICAgNCwgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgNTIsICAgNCwgIDIzLCBJRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBTb3V0aCBBZnJpY2EKKwkJCSJaQSIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsICAgNCwgIDIzLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgNTIsICAgNCwgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTAwLCAxMSwgIDMwLCBCT1RILCBUUlVFfSwJLy8gNUcsIGNoIDEwMH4xNDAKKwkJCQl7IDE0OSwgIDQsICAzMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTQ5fjE2MQorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gU291dGggS29yZWEKKwkJCSJLUiIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsICAgNCwgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgNTIsICAgNCwgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTAwLCAgOCwgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxMDB+MTI4CisJCQkJeyAxNDksICA0LCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjEKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIFNwYWluCisJCQkiRVMiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDM2LCAgIDQsICAxNywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAgIDQsICAyMywgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTAwLCAxMSwgIDMwLCBCT1RILCBUUlVFfSwJLy8gNUcsIGNoIDEwMH4xNDAKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIFN3ZWRlbgorCQkJIlNFIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgICA0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgICA0LCAgMjMsIElET1IsIFRSVUV9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDEwMCwgMTEsICAzMCwgQk9USCwgVFJVRX0sCS8vIDVHLCBjaCAxMDB+MTQwCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBTd2l0emVybGFuZAorCQkJIkNIIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgICA0LCAgMjMsIElET1IsIFRSVUV9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAgIDQsICAyMywgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gVGFpd2FuCisJCQkiVFciLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDExLCAgMzAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTEKKwkJCQl7IDUyLCAgIDQsICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIFR1cmtleQorCQkJIlRSIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjExCisJCQkJeyAzNiwgICA0LCAgMjMsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgICA0LCAgMjMsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBVSworCQkJIkdCIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjExCisJCQkJeyAzNiwgICA0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyA1MiwgICA0LCAgMjMsIElET1IsIFRSVUV9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDEwMCwgMTEsICAzMCwgQk9USCwgVFJVRX0sCS8vIDVHLCBjaCAxMDB+MTQwCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBVa3JhaW5lCisJCQkiVUEiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTEKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIFVuaXRlZF9BcmFiX0VtaXJhdGVzCisJCQkiQUUiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTEKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIFVuaXRlZF9TdGF0ZXMKKwkJCSJVUyIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTEsICAzMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMQorCQkJCXsgMzYsICAgNCwgIDE3LCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgNTIsICAgNCwgIDI0LCBCT1RILCBUUlVFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAxMDAsIDExLCAgMzAsIEJPVEgsIFRSVUV9LAkvLyA1RywgY2ggMTAwfjE0MAorCQkJCXsgMTQ5LCAgNSwgIDMwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxNDl+MTY1CisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBWZW5lenVlbGEKKwkJCSJWRSIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMQorCQkJCXsgMTQ5LCAgNCwgIDI3LCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxNDl+MTYxCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBEZWZhdWx0CisJCQkiIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMSwgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjExCisJCQkJeyAzNiwgICA0LCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyA1MiwgICA0LCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAxMDAsIDExLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDEwMH4xNDAKKwkJCQl7IDE0OSwgIDUsICAyMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTQ5fjE2NQorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorfTsKKworc3RhdGljIGlubGluZSBQQ0hfUkVHSU9OIEdldENoUmVnaW9uKAorCUlOIFBVQ0hBUiBDbnRyeUNvZGUpCit7CisJSU5UIGxvb3AgPSAwOworCVBDSF9SRUdJT04gcENoUmVnaW9uID0gTlVMTDsKKworCXdoaWxlIChzdHJjbXAoQ2hSZWdpb25bbG9vcF0uQ291bnRSZWcsICIiKSAhPSAwKQorCXsKKwkJaWYgKHN0cm5jbXAoQ2hSZWdpb25bbG9vcF0uQ291bnRSZWcsIENudHJ5Q29kZSwgMikgPT0gMCkKKwkJeworCQkJcENoUmVnaW9uID0gJkNoUmVnaW9uW2xvb3BdOworCQkJYnJlYWs7CisJCX0KKwkJbG9vcCsrOworCX0KKworCWlmIChwQ2hSZWdpb24gPT0gTlVMTCkKKwkJcENoUmVnaW9uID0gJkNoUmVnaW9uW2xvb3BdOworCXJldHVybiBwQ2hSZWdpb247Cit9CisKK3N0YXRpYyBpbmxpbmUgVk9JRCBDaEJhbmRDaGVjaygKKwlJTiBVQ0hBUiBQaHlNb2RlLAorCU9VVCBQVUNIQVIgcENoVHlwZSkKK3sKKwlzd2l0Y2goUGh5TW9kZSkKKwl7CisJCWNhc2UgUEhZXzExQToKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJY2FzZSBQSFlfMTFBTl9NSVhFRDoKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJCSpwQ2hUeXBlID0gQkFORF81RzsKKwkJCWJyZWFrOworCQljYXNlIFBIWV8xMUFCR19NSVhFRDoKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJY2FzZSBQSFlfMTFBR05fTUlYRUQ6CisJCWNhc2UgUEhZXzExQUJHTl9NSVhFRDoKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJCSpwQ2hUeXBlID0gQkFORF9CT1RIOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCSpwQ2hUeXBlID0gQkFORF8yNEc7CisJCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgVUNIQVIgRmlsbENoTGlzdCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBQQ0hfREVTUCBwQ2hEZXNwLAorCUlOIFVDSEFSIE9mZnNldCwKKwlJTiBVQ0hBUiBpbmNyZW1lbnQpCit7CisJSU5UIGksIGosIGw7CisJVUNIQVIgY2hhbm5lbDsKKworCWogPSBPZmZzZXQ7CisJZm9yIChpID0gMDsgaSA8IHBDaERlc3AtPk51bU9mQ2g7IGkrKykKKwl7CisJCWNoYW5uZWwgPSBwQ2hEZXNwLT5GaXJzdENoYW5uZWwgKyBpICogaW5jcmVtZW50OworCQlmb3IgKGw9MDsgbDxNQVhfTlVNX09GX0NIQU5ORUxTOyBsKyspCisJCXsKKwkJCWlmIChjaGFubmVsID09IHBBZC0+VHhQb3dlcltsXS5DaGFubmVsKQorCQkJeworCQkJCXBBZC0+Q2hhbm5lbExpc3Rbal0uUG93ZXIgPSBwQWQtPlR4UG93ZXJbbF0uUG93ZXI7CisJCQkJcEFkLT5DaGFubmVsTGlzdFtqXS5Qb3dlcjIgPSBwQWQtPlR4UG93ZXJbbF0uUG93ZXIyOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWlmIChsID09IE1BWF9OVU1fT0ZfQ0hBTk5FTFMpCisJCQljb250aW51ZTsKKworCQlwQWQtPkNoYW5uZWxMaXN0W2pdLkNoYW5uZWwgPSBwQ2hEZXNwLT5GaXJzdENoYW5uZWwgKyBpICogaW5jcmVtZW50OworCQlwQWQtPkNoYW5uZWxMaXN0W2pdLk1heFR4UHdyID0gcENoRGVzcC0+TWF4VHhQd3I7CisJCXBBZC0+Q2hhbm5lbExpc3Rbal0uRGZzUmVxID0gcENoRGVzcC0+RGZzUmVxOworCQlqKys7CisJfQorCXBBZC0+Q2hhbm5lbExpc3ROdW0gPSBqOworCisJcmV0dXJuIGo7Cit9CisKK3N0YXRpYyBpbmxpbmUgVk9JRCBDcmVhdGVDaExpc3QoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gUENIX1JFR0lPTiBwQ2hSZWdpb24sCisJSU4gVUNIQVIgR2VvZ3JhcGh5KQoreworCUlOVCBpOworCVVDSEFSIG9mZnNldCA9IDA7CisJUENIX0RFU1AgcENoRGVzcDsKKwlVQ0hBUiBDaFR5cGU7CisJVUNIQVIgaW5jcmVtZW50OworCisJaWYgKHBDaFJlZ2lvbiA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlDaEJhbmRDaGVjayhwQWQtPkNvbW1vbkNmZy5QaHlNb2RlLCAmQ2hUeXBlKTsKKworCWZvciAoaT0wOyBpPDEwOyBpKyspCisJeworCQlwQ2hEZXNwID0gJnBDaFJlZ2lvbi0+Q2hEZXNwW2ldOworCQlpZiAocENoRGVzcC0+Rmlyc3RDaGFubmVsID09IDApCisJCQlicmVhazsKKworCQlpZiAoQ2hUeXBlID09IEJBTkRfNUcpCisJCXsKKwkJCWlmIChwQ2hEZXNwLT5GaXJzdENoYW5uZWwgPD0gMTQpCisJCQkJY29udGludWU7CisJCX0KKwkJZWxzZSBpZiAoQ2hUeXBlID09IEJBTkRfMjRHKQorCQl7CisJCQlpZiAocENoRGVzcC0+Rmlyc3RDaGFubmVsID4gMTQpCisJCQkJY29udGludWU7CisJCX0KKworCQlpZiAoKHBDaERlc3AtPkdlb2dyYXBoeSA9PSBCT1RIKQorCQkJfHwgKHBDaERlc3AtPkdlb2dyYXBoeSA9PSBHZW9ncmFwaHkpKQorICAgICAgICB7CisJCQlpZiAocENoRGVzcC0+Rmlyc3RDaGFubmVsID4gMTQpCisgICAgICAgICAgICAgICAgaW5jcmVtZW50ID0gNDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBpbmNyZW1lbnQgPSAxOworCQkJb2Zmc2V0ID0gRmlsbENoTGlzdChwQWQsIHBDaERlc3AsIG9mZnNldCwgaW5jcmVtZW50KTsKKyAgICAgICAgfQorCX0KK30KKworc3RhdGljIGlubGluZSBWT0lEIEJ1aWxkQ2hhbm5lbExpc3RFeCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlQQ0hfUkVHSU9OIHBDaFJlZzsKKworCXBDaFJlZyA9IEdldENoUmVnaW9uKHBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlDb2RlKTsKKwlDcmVhdGVDaExpc3QocEFkLCBwQ2hSZWcsIHBBZC0+Q29tbW9uQ2ZnLkdlb2dyYXBoeSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgVk9JRCBCdWlsZEJlYWNvbkNoTGlzdCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlPVVQgUFVDSEFSIHBCdWYsCisJT1VUCVBVTE9ORyBwQnVmTGVuKQoreworCUlOVCBpOworCVVMT05HIFRtcExlbjsKKwlQQ0hfUkVHSU9OIHBDaFJlZ2lvbjsKKwlQQ0hfREVTUCBwQ2hEZXNwOworCVVDSEFSIENoVHlwZTsKKworCXBDaFJlZ2lvbiA9IEdldENoUmVnaW9uKHBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlDb2RlKTsKKworCWlmIChwQ2hSZWdpb24gPT0gTlVMTCkKKwkJcmV0dXJuOworCisJQ2hCYW5kQ2hlY2socEFkLT5Db21tb25DZmcuUGh5TW9kZSwgJkNoVHlwZSk7CisJKnBCdWZMZW4gPSAwOworCisJZm9yIChpPTA7IGk8MTA7IGkrKykKKwl7CisJCXBDaERlc3AgPSAmcENoUmVnaW9uLT5DaERlc3BbaV07CisJCWlmIChwQ2hEZXNwLT5GaXJzdENoYW5uZWwgPT0gMCkKKwkJCWJyZWFrOworCisJCWlmIChDaFR5cGUgPT0gQkFORF81RykKKwkJeworCQkJaWYgKHBDaERlc3AtPkZpcnN0Q2hhbm5lbCA8PSAxNCkKKwkJCQljb250aW51ZTsKKwkJfQorCQllbHNlIGlmIChDaFR5cGUgPT0gQkFORF8yNEcpCisJCXsKKwkJCWlmIChwQ2hEZXNwLT5GaXJzdENoYW5uZWwgPiAxNCkKKwkJCQljb250aW51ZTsKKwkJfQorCisJCWlmICgocENoRGVzcC0+R2VvZ3JhcGh5ID09IEJPVEgpCisJCQl8fCAocENoRGVzcC0+R2VvZ3JhcGh5ID09IHBBZC0+Q29tbW9uQ2ZnLkdlb2dyYXBoeSkpCisJCXsKKwkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBCdWYgKyAqcEJ1ZkxlbiwJCSZUbXBMZW4sCisJCQkJCQkJCTEsICAgICAgICAgICAgICAgICAJJnBDaERlc3AtPkZpcnN0Q2hhbm5lbCwKKwkJCQkJCQkJMSwgICAgICAgICAgICAgICAgIAkmcENoRGVzcC0+TnVtT2ZDaCwKKwkJCQkJCQkJMSwgICAgICAgICAgICAgICAgIAkmcENoRGVzcC0+TWF4VHhQd3IsCisJCQkJCQkJCUVORF9PRl9BUkdTKTsKKwkJCSpwQnVmTGVuICs9IFRtcExlbjsKKwkJfQorCX0KK30KKworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCitzdGF0aWMgaW5saW5lIEJPT0xFQU4gSXNWYWxpZENoYW5uZWwoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVUNIQVIgY2hhbm5lbCkKKworeworCUlOVCBpOworCisJZm9yIChpID0gMDsgaSA8IHBBZC0+Q2hhbm5lbExpc3ROdW07IGkrKykKKwl7CisJCWlmIChwQWQtPkNoYW5uZWxMaXN0W2ldLkNoYW5uZWwgPT0gY2hhbm5lbCkKKwkJCWJyZWFrOworCX0KKworCWlmIChpID09IHBBZC0+Q2hhbm5lbExpc3ROdW0pCisJCXJldHVybiBGQUxTRTsKKwllbHNlCisJCXJldHVybiBUUlVFOworfQorCisKK3N0YXRpYyBpbmxpbmUgVUNIQVIgR2V0RXh0Q2goCisJSU4gVUNIQVIgQ2hhbm5lbCwKKwlJTiBVQ0hBUiBEaXJlY3Rpb24pCit7CisJQ0hBUiBFeHRDaDsKKworCWlmIChEaXJlY3Rpb24gPT0gRVhUQ0hBX0FCT1ZFKQorCQlFeHRDaCA9IENoYW5uZWwgKyA0OworCWVsc2UKKwkJRXh0Q2ggPSAoQ2hhbm5lbCAtIDQpID4gMCA/IChDaGFubmVsIC0gNCkgOiAwOworCisJcmV0dXJuIEV4dENoOworfQorCisKK3N0YXRpYyBpbmxpbmUgVk9JRCBOX0NoYW5uZWxDaGVjaygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwkvL1VDSEFSIENoYW5uZWxOdW0gPSBwQWQtPkNoYW5uZWxMaXN0TnVtOworCVVDSEFSIENoYW5uZWwgPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsOworCisJaWYgKChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID49IFBIWV8xMUFCR05fTUlYRUQpICYmIChwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlcgID09IEJXXzQwKSkKKwl7CisJCWlmIChDaGFubmVsID4gMTQpCisJCXsKKwkJCWlmICgoQ2hhbm5lbCA9PSAzNikgfHwgKENoYW5uZWwgPT0gNDQpIHx8IChDaGFubmVsID09IDUyKSB8fCAoQ2hhbm5lbCA9PSA2MCkgfHwgKENoYW5uZWwgPT0gMTAwKSB8fCAoQ2hhbm5lbCA9PSAxMDgpIHx8CisJCQkgICAgKENoYW5uZWwgPT0gMTE2KSB8fCAoQ2hhbm5lbCA9PSAxMjQpIHx8IChDaGFubmVsID09IDEzMikgfHwgKENoYW5uZWwgPT0gMTQ5KSB8fCAoQ2hhbm5lbCA9PSAxNTcpKQorCQkJeworCQkJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5FWFRDSEEgPSBFWFRDSEFfQUJPVkU7CisJCQl9CisJCQllbHNlIGlmICgoQ2hhbm5lbCA9PSA0MCkgfHwgKENoYW5uZWwgPT0gNDgpIHx8IChDaGFubmVsID09IDU2KSB8fCAoQ2hhbm5lbCA9PSA2NCkgfHwgKENoYW5uZWwgPT0gMTA0KSB8fCAoQ2hhbm5lbCA9PSAxMTIpIHx8CisJCQkJCShDaGFubmVsID09IDEyMCkgfHwgKENoYW5uZWwgPT0gMTI4KSB8fCAoQ2hhbm5lbCA9PSAxMzYpIHx8IChDaGFubmVsID09IDE1MykgfHwgKENoYW5uZWwgPT0gMTYxKSkKKwkJCXsKKwkJCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuRVhUQ0hBID0gRVhUQ0hBX0JFTE9XOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5CVyAgPSBCV18yMDsKKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCWRvCisJCQl7CisJCQkJVUNIQVIgRXh0Q2g7CisJCQkJVUNIQVIgRGlyID0gcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkVYVENIQTsKKwkJCQlFeHRDaCA9IEdldEV4dENoKENoYW5uZWwsIERpcik7CisJCQkJaWYgKElzVmFsaWRDaGFubmVsKHBBZCwgRXh0Q2gpKQorCQkJCQlicmVhazsKKworCQkJCURpciA9IChEaXIgPT0gRVhUQ0hBX0FCT1ZFKSA/IEVYVENIQV9CRUxPVyA6IEVYVENIQV9BQk9WRTsKKwkJCQlFeHRDaCA9IEdldEV4dENoKENoYW5uZWwsIERpcik7CisJCQkJaWYgKElzVmFsaWRDaGFubmVsKHBBZCwgRXh0Q2gpKQorCQkJCXsKKwkJCQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkVYVENIQSA9IERpcjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5CVyAgPSBCV18yMDsKKwkJCX0gd2hpbGUoRkFMU0UpOworCisJCQlpZiAoQ2hhbm5lbCA9PSAxNCkKKwkJCXsKKwkJCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlcgID0gQldfMjA7CisJCQkJLy9wQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuRVhUQ0hBID0gRVhUQ0hBX05PTkU7CS8vIFdlIGRpZG4ndCBzZXQgdGhlIEV4dENoIGFzIE5PTkUgZHVlIHRvIGl0J2xsIHNldCBpbiBSVE1QU2V0SFQoKQorCQkJfQorI2lmIDAKKwkJCXN3aXRjaCAocEFkLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbiAgJiAweDdmKQorCQkJeworCQkJCWNhc2UgUkVHSU9OXzBfQkdfQkFORDoJLy8gMSAtMTEKKwkJCQljYXNlIFJFR0lPTl8xX0JHX0JBTkQ6CS8vIDEgLSAxMworCQkJCWNhc2UgUkVHSU9OXzVfQkdfQkFORDoJLy8gMSAtIDE0CisJCQkJCWlmIChDaGFubmVsIDw9IDQpCisJCQkJCXsKKwkJCQkJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5FWFRDSEEgPSBFWFRDSEFfQUJPVkU7CisJCQkJCX0KKwkJCQkJZWxzZSBpZiAoQ2hhbm5lbCA+PSA4KQorCQkJCQl7CisJCQkJCQlpZiAoKENoYW5uZWxOdW0gLSBDaGFubmVsKSA8IDQpCisJCQkJCQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkVYVENIQSA9IEVYVENIQV9CRUxPVzsKKwkJCQkJfQorCQkJCQlicmVhazsKKworCQkJCWNhc2UgUkVHSU9OXzJfQkdfQkFORDoJLy8gMTAgLSAxMQorCQkJCWNhc2UgUkVHSU9OXzNfQkdfQkFORDoJLy8gMTAgLSAxMworCQkJCWNhc2UgUkVHSU9OXzRfQkdfQkFORDoJLy8gMTQKKwkJCQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXICA9IEJXXzIwOworCQkJCQlicmVhazsKKworCQkJCWNhc2UgUkVHSU9OXzZfQkdfQkFORDoJLy8gMyAtIDkKKwkJCQkJaWYgKENoYW5uZWwgPD0gNSkKKwkJCQkJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5FWFRDSEEgPSBFWFRDSEFfQUJPVkU7CisJCQkJCWVsc2UgaWYgKENoYW5uZWwgPT0gNikKKwkJCQkJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5CVyAgPSBCV18yMDsKKwkJCQkJZWxzZSBpZiAoQ2hhbm5lbCA+PSA3KQorCQkJCQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkVYVENIQSA9IEVYVENIQV9CRUxPVzsKKwkJCQkJYnJlYWs7CisKKwkJCQljYXNlIFJFR0lPTl83X0JHX0JBTkQ6ICAvLyA1IC0gMTMKKwkJCQkJaWYgKENoYW5uZWwgPD0gOCkKKwkJCQkJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5FWFRDSEEgPSBFWFRDSEFfQUJPVkU7CisJCQkJCWVsc2UgaWYgKENoYW5uZWwgPj0gMTApCisJCQkJCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuRVhUQ0hBID0gRVhUQ0hBX0JFTE9XOworCQkJCQlicmVhazsKKworCQkJCWRlZmF1bHQ6CS8vIEVycm9yLiBzaG91bGQgbmV2ZXIgaGFwcGVuCisJCQkJCWJyZWFrOworCQkJfQorI2VuZGlmCisJCX0KKwl9CisKKworfQorCisKK3N0YXRpYyBpbmxpbmUgVk9JRCBOX1NldENlbkNoKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCWlmIChwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlcgPT0gQldfNDApCisJeworCQlpZiAocEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkVYVENIQSA9PSBFWFRDSEFfQUJPVkUpCisJCXsKKwkJCXBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsID0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbCArIDI7CisJCX0KKwkJZWxzZQorCQl7CisJCQlpZiAocEFkLT5Db21tb25DZmcuQ2hhbm5lbCA9PSAxNCkKKwkJCQlwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgLSAxOworCQkJZWxzZQorCQkJCXBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsID0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbCAtIDI7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsOworCX0KK30KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCitzdGF0aWMgaW5saW5lIFVJTlQ4IEdldEN1bnRyeU1heFR4UHdyKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVJTlQ4IGNoYW5uZWwpCit7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IHBBZC0+Q2hhbm5lbExpc3ROdW07IGkrKykKKwl7CisJCWlmIChwQWQtPkNoYW5uZWxMaXN0W2ldLkNoYW5uZWwgPT0gY2hhbm5lbCkKKwkJCWJyZWFrOworCX0KKworCWlmIChpID09IHBBZC0+Q2hhbm5lbExpc3ROdW0pCisJCXJldHVybiAweGZmOworCWVsc2UKKwkJcmV0dXJuIHBBZC0+Q2hhbm5lbExpc3RbaV0uTWF4VHhQd3I7Cit9CisjZW5kaWYgLy8gX19DSExJU1RfSF9fCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uLzI4NzBfcnRtcF9pbml0LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi8yODcwX3J0bXBfaW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmNTE0M2IKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi8yODcwX3J0bXBfaW5pdC5jCkBAIC0wLDAgKzEsMTc3OCBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwlNb2R1bGUgTmFtZToKKwkyODcwX3J0bXBfaW5pdC5jCisKKwlBYnN0cmFjdDoKKwlNaW5pcG9ydCBnZW5lcmljIHBvcnRpb24gaGVhZGVyIGZpbGUKKworCVJldmlzaW9uIEhpc3Rvcnk6CisJV2hvICAgICAgICAgV2hlbiAgICAgICAgICBXaGF0CisJLS0tLS0tLS0gICAgLS0tLS0tLS0tLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJUGF1bCBMaW4gICAgMjAwMi0wOC0wMSAgICBjcmVhdGVkCisgICAgSm9obiBDaGFuZyAgMjAwNC0wOC0yMCAgICBSVDI1NjEvMjY2MSB1c2Ugc2NhdHRlci1nYXRoZXIgc2NoZW1lCisgICAgSmFuIExlZSAgCTIwMDYtMDktMTUgICAgUlQyODYwLiBDaGFuZ2UgZm9yIDgwMi4xMW4gLCBFRVBST00sIExlZCwgQkEsIEhULgorCVNhbXBsZSBMaW4JMjAwNy0wNS0zMSAgICBNZXJnZSBSVDI4NjAgYW5kIFJUMjg3MCBkcml2ZXJzLgorKi8KKworI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgorCisKK3N0YXRpYyB2b2lkIHJ4X2RvbmVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpOworc3RhdGljIHZvaWQgcnQyODcwX2hjY2FfZG1hX2RvbmVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpOworc3RhdGljIHZvaWQgcnQyODcwX2FjM19kbWFfZG9uZV90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSk7CitzdGF0aWMgdm9pZCBydDI4NzBfYWMyX2RtYV9kb25lX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKTsKK3N0YXRpYyB2b2lkIHJ0Mjg3MF9hYzFfZG1hX2RvbmVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpOworc3RhdGljIHZvaWQgcnQyODcwX2FjMF9kbWFfZG9uZV90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSk7CitzdGF0aWMgdm9pZCBydDI4NzBfbWdtdF9kbWFfZG9uZV90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSk7CitzdGF0aWMgdm9pZCBydDI4NzBfbnVsbF9mcmFtZV9jb21wbGV0ZV90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSk7CitzdGF0aWMgdm9pZCBydDI4NzBfcnRzX2ZyYW1lX2NvbXBsZXRlX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKTsKK3N0YXRpYyB2b2lkIHJ0Mjg3MF9wc3BvbGxfZnJhbWVfY29tcGxldGVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpOworc3RhdGljIHZvaWQgcnQyODcwX2RhdGFvdXRfY29tcGxldGVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpOworCisKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1JvdXRpbmUgRGVzY3JpcHRpb246CisgICAgSW5pdGlhbGl6ZSByZWNlaXZlIGRhdGEgc3RydWN0dXJlcy4KKworQXJndW1lbnRzOgorICAgIHBBZAkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCitSZXR1cm4gVmFsdWU6CisJTkRJU19TVEFUVVNfU1VDQ0VTUworCU5ESVNfU1RBVFVTX1JFU09VUkNFUworCitOb3RlOgorCUluaXRpYWxpemUgYWxsIHJlY2VpdmUgcmVsZWF0ZWQgcHJpdmF0ZSBidWZmZXIsIGluY2x1ZGUgdGhvc2UgZGVmaW5lCisJaW4gUlRNUF9BREFQVEVSIHN0cnVjdHVyZSBhbmQgYWxsIHByaXZhdGUgZGF0YSBzdHJ1Y3R1cmVzLiBUaGUgbWFob3IKKwl3b3JrIGlzIHRvIGFsbG9jYXRlIGJ1ZmZlciBmb3IgZWFjaCBwYWNrZXQgYW5kIGNoYWluIGJ1ZmZlciB0bworCU5ESVMgcGFja2V0IGRlc2NyaXB0b3IuCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitORElTX1NUQVRVUwlOSUNJbml0UmVjdigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCkKK3sKKwlVQ0hBUgkJCQlpOworCU5ESVNfU1RBVFVTCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKwlQT1NfQ09PS0lFCQkJcE9iaiA9IChQT1NfQ09PS0lFKSBwQWQtPk9TX0Nvb2tpZTsKKworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+IE5JQ0luaXRSZWN2XG4iKSk7CisJcE9iaiA9IHBPYmo7CisKKwkvL0ludGVybG9ja2VkRXhjaGFuZ2UoJnBBZC0+UGVuZGluZ1J4LCAwKTsKKwlwQWQtPlBlbmRpbmdSeCA9IDA7CisJcEFkLT5OZXh0UnhCdWxrSW5SZWFkSW5kZXggCT0gMDsJLy8gTmV4dCBSeCBSZWFkIGluZGV4CisJcEFkLT5OZXh0UnhCdWxrSW5JbmRleAkJPSAwIDsgLy9SWF9SSU5HX1NJWkUgLTE7IC8vIFJ4IEJ1bGsgcG9pbnRlcgorCXBBZC0+TmV4dFJ4QnVsa0luUG9zaXRpb24gCT0gMDsKKworCWZvciAoaSA9IDA7IGkgPCAoUlhfUklOR19TSVpFKTsgaSsrKQorCXsKKwkJUFJYX0NPTlRFWFQgIHBSeENvbnRleHQgPSAmKHBBZC0+UnhDb250ZXh0W2ldKTsKKworCQkvL0FsbG9jYXRlIFVSQgorCQlwUnhDb250ZXh0LT5wVXJiID0gUlRVU0JfQUxMT0NfVVJCKDApOworCQlpZiAocFJ4Q29udGV4dC0+cFVyYiA9PSBOVUxMKQorCQl7CisJCQlTdGF0dXMgPSBORElTX1NUQVRVU19SRVNPVVJDRVM7CisJCQlnb3RvIG91dDE7CisJCX0KKworCQkvLyBBbGxvY2F0ZSB0cmFuc2ZlciBidWZmZXIKKwkJcFJ4Q29udGV4dC0+VHJhbnNmZXJCdWZmZXIgPSBSVFVTQl9VUkJfQUxMT0NfQlVGRkVSKHBPYmotPnBVc2JfRGV2LCBNQVhfUlhCVUxLX1NJWkUsICZwUnhDb250ZXh0LT5kYXRhX2RtYSk7CisJCWlmIChwUnhDb250ZXh0LT5UcmFuc2ZlckJ1ZmZlciA9PSBOVUxMKQorCQl7CisJCQlTdGF0dXMgPSBORElTX1NUQVRVU19SRVNPVVJDRVM7CisJCQlnb3RvIG91dDE7CisJCX0KKworCQlOZGlzWmVyb01lbW9yeShwUnhDb250ZXh0LT5UcmFuc2ZlckJ1ZmZlciwgTUFYX1JYQlVMS19TSVpFKTsKKworCQlwUnhDb250ZXh0LT5wQWQJPSBwQWQ7CisJCXBSeENvbnRleHQtPnBJcnAgPSBOVUxMOworCQlwUnhDb250ZXh0LT5JblVzZQkJPSBGQUxTRTsKKwkJcFJ4Q29udGV4dC0+SVJQUGVuZGluZwk9IEZBTFNFOworCQlwUnhDb250ZXh0LT5SZWFkYWJsZQk9IEZBTFNFOworCQkvL3BSeENvbnRleHQtPlJlb3JkZXJJblVzZSA9IEZBTFNFOworCQlwUnhDb250ZXh0LT5iUnhIYW5kbGluZyA9IEZBTFNFOworCQlwUnhDb250ZXh0LT5CdWxrSW5PZmZzZXQgPSAwOworCX0KKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjwtLSBOSUNJbml0UmVjdlxuIikpOworCXJldHVybiBTdGF0dXM7CisKK291dDE6CisJZm9yIChpID0gMDsgaSA8IChSWF9SSU5HX1NJWkUpOyBpKyspCisJeworCQlQUlhfQ09OVEVYVCAgcFJ4Q29udGV4dCA9ICYocEFkLT5SeENvbnRleHRbaV0pOworCisJCWlmIChOVUxMICE9IHBSeENvbnRleHQtPlRyYW5zZmVyQnVmZmVyKQorCQl7CisJCQlSVFVTQl9VUkJfRlJFRV9CVUZGRVIocE9iai0+cFVzYl9EZXYsIE1BWF9SWEJVTEtfU0laRSwKKwkJCQkJCQkJcFJ4Q29udGV4dC0+VHJhbnNmZXJCdWZmZXIsIHBSeENvbnRleHQtPmRhdGFfZG1hKTsKKwkJCXBSeENvbnRleHQtPlRyYW5zZmVyQnVmZmVyID0gTlVMTDsKKwkJfQorCisJCWlmIChOVUxMICE9IHBSeENvbnRleHQtPnBVcmIpCisJCXsKKwkJCVJUVVNCX1VOTElOS19VUkIocFJ4Q29udGV4dC0+cFVyYik7CisJCQlSVFVTQl9GUkVFX1VSQihwUnhDb250ZXh0LT5wVXJiKTsKKwkJCXBSeENvbnRleHQtPnBVcmIgPSBOVUxMOworCQl9CisJfQorCisJcmV0dXJuIFN0YXR1czsKK30KKworCisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgIEluaXRpYWxpemUgdHJhbnNtaXQgZGF0YSBzdHJ1Y3R1cmVzLgorCitBcmd1bWVudHM6CisgICAgcEFkCQkJCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisKK1JldHVybiBWYWx1ZToKKwlORElTX1NUQVRVU19TVUNDRVNTCisJTkRJU19TVEFUVVNfUkVTT1VSQ0VTCisKK05vdGU6Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitORElTX1NUQVRVUwlOSUNJbml0VHJhbnNtaXQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQpCit7CisjZGVmaW5lIExNX1VTQl9BTExPQyhwT2JqLCBDb250ZXh0LCBUQl9UeXBlLCBCdWZmZXJTaXplLCBTdGF0dXMsIG1zZzEsIGVycjEsIG1zZzIsIGVycjIpCVwKKwlDb250ZXh0LT5wVXJiID0gUlRVU0JfQUxMT0NfVVJCKDApOwkJXAorCWlmIChDb250ZXh0LT5wVXJiID09IE5VTEwpIHsJCQlcCisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCBtc2cxKTsJCVwKKwkJU3RhdHVzID0gTkRJU19TVEFUVVNfUkVTT1VSQ0VTOwkJXAorCQlnb3RvIGVycjE7IH0JCQkJCQlcCisJCQkJCQkJCQkJCVwKKwlDb250ZXh0LT5UcmFuc2ZlckJ1ZmZlciA9IAkJCQlcCisJCShUQl9UeXBlKVJUVVNCX1VSQl9BTExPQ19CVUZGRVIocE9iai0+cFVzYl9EZXYsIEJ1ZmZlclNpemUsICZDb250ZXh0LT5kYXRhX2RtYSk7CVwKKwlpZiAoQ29udGV4dC0+VHJhbnNmZXJCdWZmZXIgPT0gTlVMTCkgewlcCisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCBtc2cyKTsJCVwKKwkJU3RhdHVzID0gTkRJU19TVEFUVVNfUkVTT1VSQ0VTOwkJXAorCQlnb3RvIGVycjI7IH0KKworI2RlZmluZSBMTV9VUkJfRlJFRShwT2JqLCBDb250ZXh0LCBCdWZmZXJTaXplKQkJCQlcCisJaWYgKE5VTEwgIT0gQ29udGV4dC0+cFVyYikgewkJCQkJCQlcCisJCVJUVVNCX1VOTElOS19VUkIoQ29udGV4dC0+cFVyYik7CQkJCQlcCisJCVJUVVNCX0ZSRUVfVVJCKENvbnRleHQtPnBVcmIpOwkJCQkJCVwKKwkJQ29udGV4dC0+cFVyYiA9IE5VTEw7IH0JCQkJCQkJCVwKKwlpZiAoTlVMTCAhPSBDb250ZXh0LT5UcmFuc2ZlckJ1ZmZlcikgewkJCQlcCisJCVJUVVNCX1VSQl9GUkVFX0JVRkZFUihwT2JqLT5wVXNiX0RldiwgQnVmZmVyU2l6ZSwJXAorCQkJCQkJCQlDb250ZXh0LT5UcmFuc2ZlckJ1ZmZlciwJXAorCQkJCQkJCQlDb250ZXh0LT5kYXRhX2RtYSk7CQkJXAorCQlDb250ZXh0LT5UcmFuc2ZlckJ1ZmZlciA9IE5VTEw7IH0KKworCVVDSEFSCQkJaSwgYWNpZHg7CisJTkRJU19TVEFUVVMgICAgIFN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisJUFRYX0NPTlRFWFQJCXBOdWxsQ29udGV4dCAgID0gJihwQWQtPk51bGxDb250ZXh0KTsKKwlQVFhfQ09OVEVYVAkJcFBzUG9sbENvbnRleHQgPSAmKHBBZC0+UHNQb2xsQ29udGV4dCk7CisJUFRYX0NPTlRFWFQJCXBSVFNDb250ZXh0ICAgID0gJihwQWQtPlJUU0NvbnRleHQpOworCVBUWF9DT05URVhUCQlwTUxNRUNvbnRleHQgPSBOVUxMOworLy8JUEhUX1RYX0NPTlRFWFQJcEhUVFhDb250ZXh0ID0gTlVMTDsKKwlQT1NfQ09PS0lFCQlwT2JqID0gKFBPU19DT09LSUUpIHBBZC0+T1NfQ29va2llOworCVBWT0lECQkJUmluZ0Jhc2VWYTsKKy8vCVJUTVBfVFhfUklORwkqcFR4UmluZzsKKwlSVE1QX01HTVRfUklORyAgKnBNZ210UmluZzsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPiBOSUNJbml0VHJhbnNtaXRcbiIpKTsKKwlwT2JqID0gcE9iajsKKworCS8vIEluaXQgNCBzZXQgb2YgVHggcGFyYW1ldGVycworCWZvcihhY2lkeCA9IDA7IGFjaWR4IDwgTlVNX09GX1RYX1JJTkc7IGFjaWR4KyspCisJeworCQkvLyBJbml0aWFsaXplIGFsbCBUcmFuc21pdCByZWxlYXRlZCBxdWV1ZXMKKwkJSW5pdGlhbGl6ZVF1ZXVlSGVhZGVyKCZwQWQtPlR4U3dRdWV1ZVthY2lkeF0pOworCisJCS8vIE5leHQgTG9jYWwgdHggcmluZyBwb2ludGVyIHdhaXRpbmcgZm9yIGJ1Y2sgb3V0CisJCXBBZC0+TmV4dEJ1bGtPdXRJbmRleFthY2lkeF0gPSBhY2lkeDsKKwkJcEFkLT5CdWxrT3V0UGVuZGluZ1thY2lkeF0gPSBGQUxTRTsgLy8gQnVjayBPdXQgY29udHJvbCBmbGFnCisJCS8vcEFkLT5EYXRhQnVsa0RvbmVJZHhbYWNpZHhdID0gMDsKKwl9CisKKwkvL3BBZC0+TmV4dE1MTUVJbmRleAk9IDA7CisJLy9wQWQtPlB1c2hNZ210SW5kZXgJPSAwOworCS8vcEFkLT5Qb3BNZ210SW5kZXgJPSAwOworCS8vSW50ZXJsb2NrZWRFeGNoYW5nZSgmcEFkLT5NZ210UXVldWVTaXplLCAwKTsKKwkvL0ludGVybG9ja2VkRXhjaGFuZ2UoJnBBZC0+VHhDb3VudCwgMCk7CisKKwkvL3BBZC0+UHJpb1JpbmdGaXJzdEluZGV4CT0gMDsKKwkvL3BBZC0+UHJpb1JpbmdUeENudAkJPSAwOworCisJZG8KKwl7CisJCS8vCisJCS8vIFRYX1JJTkdfU0laRSwgNCBBQ3MKKwkJLy8KKwkJZm9yKGFjaWR4PTA7IGFjaWR4PDQ7IGFjaWR4KyspCisJCXsKKwkJCVBIVF9UWF9DT05URVhUCXBIVFRYQ29udGV4dCA9ICYocEFkLT5UeENvbnRleHRbYWNpZHhdKTsKKworCQkJTmRpc1plcm9NZW1vcnkocEhUVFhDb250ZXh0LCBzaXplb2YoSFRfVFhfQ09OVEVYVCkpOworCQkJLy9BbGxvY2F0ZSBVUkIKKwkJCUxNX1VTQl9BTExPQyhwT2JqLCBwSFRUWENvbnRleHQsIFBIVFRYX0JVRkZFUiwgc2l6ZW9mKEhUVFhfQlVGRkVSKSwgU3RhdHVzLAorCQkJCQkJCSgiPC0tIEVSUk9SIGluIEFsbG9jIFRYIFR4Q29udGV4dFslZF0gdXJiISEgXG4iLCBhY2lkeCksCisJCQkJCQkJZG9uZSwKKwkJCQkJCQkoIjwtLSBFUlJPUiBpbiBBbGxvYyBUWCBUeENvbnRleHRbJWRdIEhUVFhfQlVGRkVSICEhIFxuIiwgYWNpZHgpLAorCQkJCQkJCW91dDEpOworCisJCQlOZGlzWmVyb01lbW9yeShwSFRUWENvbnRleHQtPlRyYW5zZmVyQnVmZmVyLT5BZ2dyZWdhdGlvbiwgNCk7CisJCQlwSFRUWENvbnRleHQtPnBBZCA9IHBBZDsKKwkJCXBIVFRYQ29udGV4dC0+cElycCA9IE5VTEw7CisJCQlwSFRUWENvbnRleHQtPklSUFBlbmRpbmcgPSBGQUxTRTsKKwkJCXBIVFRYQ29udGV4dC0+TmV4dEJ1bGtPdXRQb3NpdGlvbiA9IDA7CisJCQlwSFRUWENvbnRleHQtPkVOZXh0QnVsa091dFBvc2l0aW9uID0gMDsKKwkJCXBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiA9IDA7CisJCQlwSFRUWENvbnRleHQtPkN1cldyaXRlUmVhbFBvcyA9IDA7CisJCQlwSFRUWENvbnRleHQtPkJ1bGtPdXRTaXplID0gMDsKKwkJCXBIVFRYQ29udGV4dC0+QnVsa091dFBpcGVJZCA9IGFjaWR4OworCQkJcEhUVFhDb250ZXh0LT5iUmluZ0VtcHR5ID0gVFJVRTsKKwkJCXBIVFRYQ29udGV4dC0+YkNvcHlTYXZlUGFkID0gRkFMU0U7CisKKwkJCXBBZC0+QnVsa091dFBlbmRpbmdbYWNpZHhdID0gRkFMU0U7CisJCX0KKworCisJCS8vCisJCS8vIE1HTVRfUklOR19TSVpFCisJCS8vCisjaWYgMAorCQlmb3IoaT0wOyBpPE1HTVRfUklOR19TSVpFOyBpKyspIC8vIDgKKwkJeworCQkJUFRYX0NPTlRFWFQJcE1MTUVDb250ZXh0ID0gJihwQWQtPk1MTUVDb250ZXh0W2ldKTsKKworCisJCQlOZGlzWmVyb01lbW9yeShwTUxNRUNvbnRleHQsIHNpemVvZihUWF9DT05URVhUKSk7CisKKwkJCS8vQWxsb2NhdGUgVVJCCisJCQlMTV9VU0JfQUxMT0MocE9iaiwgcE1MTUVDb250ZXh0LCBQVFhfQlVGRkVSLCBzaXplb2YoVFhfQlVGRkVSKSwgU3RhdHVzLAorCQkJCQkJCSgiPC0tIEVSUk9SIGluIEFsbG9jIFRYIE1MTUVDb250ZXh0WyVkXSB1cmIhISBcbiIsIGkpLAorCQkJCQkJCW91dDIsCisJCQkJCQkJKCI8LS0gRVJST1IgaW4gQWxsb2MgVFggTUxNRUNvbnRleHRbJWRdIFRYX0JVRkZFUiAhISBcbiIsIGkpLAorCQkJCQkJCW91dDIpOworCisJCQlwTUxNRUNvbnRleHQtPnBBZCA9IHBBZDsKKwkJCXBNTE1FQ29udGV4dC0+cElycCA9IE5VTEw7CisJCQlwTUxNRUNvbnRleHQtPkluVXNlID0gRkFMU0U7CisJCQlwTUxNRUNvbnRleHQtPklSUFBlbmRpbmcgPSBGQUxTRTsKKwkJfQorI2Vsc2UKKwkJLy8gQWxsb2NhdGUgTUdNVCByaW5nIGRlc2NyaXB0b3IncyBtZW1vcnkKKwkJcEFkLT5NZ210RGVzY1JpbmcuQWxsb2NTaXplID0gTUdNVF9SSU5HX1NJWkUgKiBzaXplb2YoVFhfQ09OVEVYVCk7CisJCVJUTVBBbGxvY2F0ZU1lbW9yeSgmcEFkLT5NZ210RGVzY1JpbmcuQWxsb2NWYSwgcEFkLT5NZ210RGVzY1JpbmcuQWxsb2NTaXplKTsKKwkJaWYgKHBBZC0+TWdtdERlc2NSaW5nLkFsbG9jVmEgPT0gTlVMTCkKKwkJeworCQkJREJHUFJJTlRfRVJSKCgiRmFpbGVkIHRvIGFsbG9jYXRlIGEgYmlnIGJ1ZmZlciBmb3IgTWdtdERlc2NSaW5nIVxuIikpOworCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfUkVTT1VSQ0VTOworCQkJZ290byBvdXQxOworCQl9CisJCU5kaXNaZXJvTWVtb3J5KHBBZC0+TWdtdERlc2NSaW5nLkFsbG9jVmEsIHBBZC0+TWdtdERlc2NSaW5nLkFsbG9jU2l6ZSk7CisJCVJpbmdCYXNlVmEgICAgID0gcEFkLT5NZ210RGVzY1JpbmcuQWxsb2NWYTsKKworCQkvLyBJbml0aWFsaXplIE1HTVQgUmluZyBhbmQgYXNzb2NpYXRlZCBidWZmZXIgbWVtb3J5CisJCXBNZ210UmluZyA9ICZwQWQtPk1nbXRSaW5nOworCQlmb3IgKGkgPSAwOyBpIDwgTUdNVF9SSU5HX1NJWkU7IGkrKykKKwkJeworCQkJLy8gbGluayB0aGUgcHJlLWFsbG9jYXRlZCBNZ210IGJ1ZmZlciB0byBNZ210UmluZy5DZWxsCisJCQlwTWdtdFJpbmctPkNlbGxbaV0uQWxsb2NTaXplID0gc2l6ZW9mKFRYX0NPTlRFWFQpOworCQkJcE1nbXRSaW5nLT5DZWxsW2ldLkFsbG9jVmEgPSBSaW5nQmFzZVZhOworCQkJcE1nbXRSaW5nLT5DZWxsW2ldLnBOZGlzUGFja2V0ID0gTlVMTDsKKwkJCXBNZ210UmluZy0+Q2VsbFtpXS5wTmV4dE5kaXNQYWNrZXQgPSBOVUxMOworCisJCQkvL0FsbG9jYXRlIFVSQiBmb3IgTUxNRUNvbnRleHQKKwkJCXBNTE1FQ29udGV4dCA9IChQVFhfQ09OVEVYVCkgcEFkLT5NZ210UmluZy5DZWxsW2ldLkFsbG9jVmE7CisJCQlwTUxNRUNvbnRleHQtPnBVcmIgPSBSVFVTQl9BTExPQ19VUkIoMCk7CisJCQlpZiAocE1MTUVDb250ZXh0LT5wVXJiID09IE5VTEwpCisJCQl7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiPC0tIEVSUk9SIGluIEFsbG9jIFRYIE1MTUVDb250ZXh0WyVkXSB1cmIhISBcbiIsIGkpKTsKKwkJCQlTdGF0dXMgPSBORElTX1NUQVRVU19SRVNPVVJDRVM7CisJCQkJZ290byBvdXQyOworCQkJfQorCQkJcE1MTUVDb250ZXh0LT5wQWQgPSBwQWQ7CisJCQlwTUxNRUNvbnRleHQtPnBJcnAgPSBOVUxMOworCQkJcE1MTUVDb250ZXh0LT5UcmFuc2ZlckJ1ZmZlciA9IE5VTEw7CisJCQlwTUxNRUNvbnRleHQtPkluVXNlID0gRkFMU0U7CisJCQlwTUxNRUNvbnRleHQtPklSUFBlbmRpbmcgPSBGQUxTRTsKKwkJCXBNTE1FQ29udGV4dC0+YldhaXRpbmdCdWxrT3V0ID0gRkFMU0U7CisJCQlwTUxNRUNvbnRleHQtPkJ1bGtPdXRTaXplID0gMDsKKwkJCXBNTE1FQ29udGV4dC0+U2VsZklkeCA9IGk7CisKKwkJCS8vIE9mZnNldCB0byBuZXh0IHJpbmcgZGVzY3JpcHRvciBhZGRyZXNzCisJCQlSaW5nQmFzZVZhID0gKFBVQ0hBUikgUmluZ0Jhc2VWYSArIHNpemVvZihUWF9DT05URVhUKTsKKwkJfQorCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNR01UIFJpbmc6IHRvdGFsICVkIGVudHJ5IGFsbG9jYXRlZFxuIiwgaSkpOworCisJCS8vcEFkLT5NZ210UmluZy5UeFN3RnJlZUlkeCA9IChNR01UX1JJTkdfU0laRSAtIDEpOworCQlwQWQtPk1nbXRSaW5nLlR4U3dGcmVlSWR4ID0gTUdNVF9SSU5HX1NJWkU7CisJCXBBZC0+TWdtdFJpbmcuVHhDcHVJZHggPSAwOworCQlwQWQtPk1nbXRSaW5nLlR4RG1hSWR4ID0gMDsKKyNlbmRpZgorCisJCS8vCisJCS8vIEJFQUNPTl9SSU5HX1NJWkUKKwkJLy8KKwkJZm9yKGk9MDsgaTxCRUFDT05fUklOR19TSVpFOyBpKyspIC8vIDIKKwkJeworCQkJUFRYX0NPTlRFWFQJcEJlYWNvbkNvbnRleHQgPSAmKHBBZC0+QmVhY29uQ29udGV4dFtpXSk7CisKKworCQkJTmRpc1plcm9NZW1vcnkocEJlYWNvbkNvbnRleHQsIHNpemVvZihUWF9DT05URVhUKSk7CisKKwkJCS8vQWxsb2NhdGUgVVJCCisJCQlMTV9VU0JfQUxMT0MocE9iaiwgcEJlYWNvbkNvbnRleHQsIFBUWF9CVUZGRVIsIHNpemVvZihUWF9CVUZGRVIpLCBTdGF0dXMsCisJCQkJCQkJKCI8LS0gRVJST1IgaW4gQWxsb2MgVFggQmVhY29uQ29udGV4dFslZF0gdXJiISEgXG4iLCBpKSwKKwkJCQkJCQlvdXQyLAorCQkJCQkJCSgiPC0tIEVSUk9SIGluIEFsbG9jIFRYIEJlYWNvbkNvbnRleHRbJWRdIFRYX0JVRkZFUiAhISBcbiIsIGkpLAorCQkJCQkJCW91dDMpOworCisJCQlwQmVhY29uQ29udGV4dC0+cEFkID0gcEFkOworCQkJcEJlYWNvbkNvbnRleHQtPnBJcnAgPSBOVUxMOworCQkJcEJlYWNvbkNvbnRleHQtPkluVXNlID0gRkFMU0U7CisJCQlwQmVhY29uQ29udGV4dC0+SVJQUGVuZGluZyA9IEZBTFNFOworCQl9CisKKwkJLy8KKwkJLy8gTnVsbENvbnRleHQKKwkJLy8KKwkJTmRpc1plcm9NZW1vcnkocE51bGxDb250ZXh0LCBzaXplb2YoVFhfQ09OVEVYVCkpOworCisJCS8vQWxsb2NhdGUgVVJCCisJCUxNX1VTQl9BTExPQyhwT2JqLCBwTnVsbENvbnRleHQsIFBUWF9CVUZGRVIsIHNpemVvZihUWF9CVUZGRVIpLCBTdGF0dXMsCisJCQkJCQkoIjwtLSBFUlJPUiBpbiBBbGxvYyBUWCBOdWxsQ29udGV4dCB1cmIhISBcbiIpLAorCQkJCQkJb3V0MywKKwkJCQkJCSgiPC0tIEVSUk9SIGluIEFsbG9jIFRYIE51bGxDb250ZXh0IFRYX0JVRkZFUiAhISBcbiIpLAorCQkJCQkJb3V0NCk7CisKKwkJcE51bGxDb250ZXh0LT5wQWQgPSBwQWQ7CisJCXBOdWxsQ29udGV4dC0+cElycCA9IE5VTEw7CisJCXBOdWxsQ29udGV4dC0+SW5Vc2UgPSBGQUxTRTsKKwkJcE51bGxDb250ZXh0LT5JUlBQZW5kaW5nID0gRkFMU0U7CisKKwkJLy8KKwkJLy8gUlRTQ29udGV4dAorCQkvLworCQlOZGlzWmVyb01lbW9yeShwUlRTQ29udGV4dCwgc2l6ZW9mKFRYX0NPTlRFWFQpKTsKKworCQkvL0FsbG9jYXRlIFVSQgorCQlMTV9VU0JfQUxMT0MocE9iaiwgcFJUU0NvbnRleHQsIFBUWF9CVUZGRVIsIHNpemVvZihUWF9CVUZGRVIpLCBTdGF0dXMsCisJCQkJCQkoIjwtLSBFUlJPUiBpbiBBbGxvYyBUWCBSVFNDb250ZXh0IHVyYiEhIFxuIiksCisJCQkJCQlvdXQ0LAorCQkJCQkJKCI8LS0gRVJST1IgaW4gQWxsb2MgVFggUlRTQ29udGV4dCBUWF9CVUZGRVIgISEgXG4iKSwKKwkJCQkJCW91dDUpOworCisJCXBSVFNDb250ZXh0LT5wQWQgPSBwQWQ7CisJCXBSVFNDb250ZXh0LT5wSXJwID0gTlVMTDsKKwkJcFJUU0NvbnRleHQtPkluVXNlID0gRkFMU0U7CisJCXBSVFNDb250ZXh0LT5JUlBQZW5kaW5nID0gRkFMU0U7CisKKwkJLy8KKwkJLy8gUHNQb2xsQ29udGV4dAorCQkvLworCQkvL05kaXNaZXJvTWVtb3J5KHBQc1BvbGxDb250ZXh0LCBzaXplb2YoVFhfQ09OVEVYVCkpOworCQkvL0FsbG9jYXRlIFVSQgorCQlMTV9VU0JfQUxMT0MocE9iaiwgcFBzUG9sbENvbnRleHQsIFBUWF9CVUZGRVIsIHNpemVvZihUWF9CVUZGRVIpLCBTdGF0dXMsCisJCQkJCQkoIjwtLSBFUlJPUiBpbiBBbGxvYyBUWCBQc1BvbGxDb250ZXh0IHVyYiEhIFxuIiksCisJCQkJCQlvdXQ1LAorCQkJCQkJKCI8LS0gRVJST1IgaW4gQWxsb2MgVFggUHNQb2xsQ29udGV4dCBUWF9CVUZGRVIgISEgXG4iKSwKKwkJCQkJCW91dDYpOworCisJCXBQc1BvbGxDb250ZXh0LT5wQWQgPSBwQWQ7CisJCXBQc1BvbGxDb250ZXh0LT5wSXJwID0gTlVMTDsKKwkJcFBzUG9sbENvbnRleHQtPkluVXNlID0gRkFMU0U7CisJCXBQc1BvbGxDb250ZXh0LT5JUlBQZW5kaW5nID0gRkFMU0U7CisJCXBQc1BvbGxDb250ZXh0LT5iQWdncmVnYXRpYmxlID0gRkFMU0U7CisJCXBQc1BvbGxDb250ZXh0LT5MYXN0T25lID0gVFJVRTsKKworCX0gICB3aGlsZSAoRkFMU0UpOworCisKK2RvbmU6CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPC0tIE5JQ0luaXRUcmFuc21pdFxuIikpOworCisJcmV0dXJuIFN0YXR1czsKKworCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBFUlJPUiBIQU5ETEUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitvdXQ2OgorCUxNX1VSQl9GUkVFKHBPYmosIHBQc1BvbGxDb250ZXh0LCBzaXplb2YoVFhfQlVGRkVSKSk7CisKK291dDU6CisJTE1fVVJCX0ZSRUUocE9iaiwgcFJUU0NvbnRleHQsIHNpemVvZihUWF9CVUZGRVIpKTsKKworb3V0NDoKKwlMTV9VUkJfRlJFRShwT2JqLCBwTnVsbENvbnRleHQsIHNpemVvZihUWF9CVUZGRVIpKTsKKworb3V0MzoKKwlmb3IoaT0wOyBpPEJFQUNPTl9SSU5HX1NJWkU7IGkrKykKKwl7CisJCVBUWF9DT05URVhUCXBCZWFjb25Db250ZXh0ID0gJihwQWQtPkJlYWNvbkNvbnRleHRbaV0pOworCQlpZiAocEJlYWNvbkNvbnRleHQpCisJCQlMTV9VUkJfRlJFRShwT2JqLCBwQmVhY29uQ29udGV4dCwgc2l6ZW9mKFRYX0JVRkZFUikpOworCX0KKworb3V0MjoKKwlpZiAocEFkLT5NZ210RGVzY1JpbmcuQWxsb2NWYSkKKwl7CisJCXBNZ210UmluZyA9ICZwQWQtPk1nbXRSaW5nOworCWZvcihpPTA7IGk8TUdNVF9SSU5HX1NJWkU7IGkrKykKKwl7CisJCXBNTE1FQ29udGV4dCA9IChQVFhfQ09OVEVYVCkgcEFkLT5NZ210UmluZy5DZWxsW2ldLkFsbG9jVmE7CisJCWlmIChwTUxNRUNvbnRleHQpCisJCQlMTV9VUkJfRlJFRShwT2JqLCBwTUxNRUNvbnRleHQsIHNpemVvZihUWF9CVUZGRVIpKTsKKwl9CisJCU5kaXNGcmVlTWVtb3J5KHBBZC0+TWdtdERlc2NSaW5nLkFsbG9jVmEsIHBBZC0+TWdtdERlc2NSaW5nLkFsbG9jU2l6ZSwgMCk7CisJCXBBZC0+TWdtdERlc2NSaW5nLkFsbG9jVmEgPSBOVUxMOworCX0KKworb3V0MToKKwlmb3IgKGFjaWR4ID0gMDsgYWNpZHggPCA0OyBhY2lkeCsrKQorCXsKKwkJUEhUX1RYX0NPTlRFWFQgcFR4Q29udGV4dCA9ICYocEFkLT5UeENvbnRleHRbYWNpZHhdKTsKKwkJaWYgKHBUeENvbnRleHQpCisJCQlMTV9VUkJfRlJFRShwT2JqLCBwVHhDb250ZXh0LCBzaXplb2YoSFRUWF9CVUZGRVIpKTsKKwl9CisKKwkvLyBIZXJlIHdlIGRpZG4ndCBoYXZlIGFueSBwcmUtYWxsb2NhdGVkIG1lbW9yeSBuZWVkIHRvIGZyZWUuCisKKwlyZXR1cm4gU3RhdHVzOworfQorCisKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1JvdXRpbmUgRGVzY3JpcHRpb246CisgICAgQWxsb2NhdGUgRE1BIG1lbW9yeSBibG9ja3MgZm9yIHNlbmQsIHJlY2VpdmUuCisKK0FyZ3VtZW50czoKKyAgICBwQWQJCQkJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKworUmV0dXJuIFZhbHVlOgorCU5ESVNfU1RBVFVTX1NVQ0NFU1MKKwlORElTX1NUQVRVU19GQUlMVVJFCisJTkRJU19TVEFUVVNfUkVTT1VSQ0VTCisKK05vdGU6Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitORElTX1NUQVRVUwlSVE1QQWxsb2NUeFJ4UmluZ01lbW9yeSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCkKK3sKKy8vCUNPVU5URVJfODAyXzExCXBDb3VudGVyID0gJnBBZC0+V2xhbkNvdW50ZXJzOworCU5ESVNfU1RBVFVTCQlTdGF0dXM7CisJSU5UCQkJCW51bTsKKworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+IFJUTVBBbGxvY1R4UnhSaW5nTWVtb3J5XG4iKSk7CisKKworCWRvCisJeworCQkvLyBJbml0IHRoZSBDbWRRIGFuZCBDbWRRTG9jaworCQlOZGlzQWxsb2NhdGVTcGluTG9jaygmcEFkLT5DbWRRTG9jayk7CisJCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+Q21kUUxvY2spOworCQlSVFVTQkluaXRpYWxpemVDbWRRKCZwQWQtPkNtZFEpOworCQlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPkNtZFFMb2NrKTsKKworCisJCU5kaXNBbGxvY2F0ZVNwaW5Mb2NrKCZwQWQtPk1MTUVCdWxrT3V0TG9jayk7CisJCS8vTmRpc0FsbG9jYXRlU3BpbkxvY2soJnBBZC0+TUxNRVdhaXRRdWV1ZUxvY2spOworCQlOZGlzQWxsb2NhdGVTcGluTG9jaygmcEFkLT5CdWxrT3V0TG9ja1swXSk7CisJCU5kaXNBbGxvY2F0ZVNwaW5Mb2NrKCZwQWQtPkJ1bGtPdXRMb2NrWzFdKTsKKwkJTmRpc0FsbG9jYXRlU3BpbkxvY2soJnBBZC0+QnVsa091dExvY2tbMl0pOworCQlOZGlzQWxsb2NhdGVTcGluTG9jaygmcEFkLT5CdWxrT3V0TG9ja1szXSk7CisJCU5kaXNBbGxvY2F0ZVNwaW5Mb2NrKCZwQWQtPkJ1bGtPdXRMb2NrWzRdKTsKKwkJTmRpc0FsbG9jYXRlU3BpbkxvY2soJnBBZC0+QnVsa091dExvY2tbNV0pOworCQlOZGlzQWxsb2NhdGVTcGluTG9jaygmcEFkLT5CdWxrSW5Mb2NrKTsKKworCQlmb3IgKG51bSA9IDA7IG51bSA8IE5VTV9PRl9UWF9SSU5HOyBudW0rKykKKwkJeworCQkJTmRpc0FsbG9jYXRlU3BpbkxvY2soJnBBZC0+VHhDb250ZXh0UXVldWVMb2NrW251bV0pOworCQl9CisKKyNpZmRlZiBSQUxJTktfQVRFCisJCU5kaXNBbGxvY2F0ZVNwaW5Mb2NrKCZwQWQtPkdlbmVyaWNMb2NrKTsKKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisKKy8vCQlOZGlzQWxsb2NhdGVTcGluTG9jaygmcEFkLT5NZW1Mb2NrKTsJLy8gTm90IHVzZWQgaW4gUlQyOFhYCisKKy8vCQlOZGlzQWxsb2NhdGVTcGluTG9jaygmcEFkLT5NYWNUYWJMb2NrKTsgLy8gaW5pdCBpdCBpbiBVc2VyQ2ZnSW5pdCgpCisvLwkJTmRpc0FsbG9jYXRlU3BpbkxvY2soJnBBZC0+QkFUYWJMb2NrKTsgLy8gaW5pdCBpdCBpbiBCQVRhYmxlSW5pdCgpCisKKy8vCQlmb3IobnVtPTA7IG51bTxNQVhfTEVOX09GX0JBX1JFQ19UQUJMRTsgbnVtKyspCisvLwkJeworLy8JCQlOZGlzQWxsb2NhdGVTcGluTG9jaygmcEFkLT5CQVRhYmxlLkJBUmVjRW50cnlbbnVtXS5SeFJlUmluZ0xvY2spOworLy8JCX0KKworCQkvLworCQkvLyBJbml0IE1hYyBUYWJsZQorCQkvLworLy8JCU1hY1RhYmxlSW5pdGlhbGl6ZShwQWQpOworCisJCS8vCisJCS8vIEluaXQgc2VuZCBkYXRhIHN0cnVjdHVyZXMgYW5kIHJlbGF0ZWQgcGFyYW1ldGVycworCQkvLworCQlTdGF0dXMgPSBOSUNJbml0VHJhbnNtaXQocEFkKTsKKwkJaWYgKFN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCQkJYnJlYWs7CisKKwkJLy8KKwkJLy8gSW5pdCByZWNlaXZlIGRhdGEgc3RydWN0dXJlcyBhbmQgcmVsYXRlZCBwYXJhbWV0ZXJzCisJCS8vCisJCVN0YXR1cyA9IE5JQ0luaXRSZWN2KHBBZCk7CisJCWlmIChTdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJCWJyZWFrOworCisJCXBBZC0+UGVuZGluZ0lvQ291bnQgPSAxOworCisJfSB3aGlsZSAoRkFMU0UpOworCisJTmRpc1plcm9NZW1vcnkoJnBBZC0+RnJhZ0ZyYW1lLCBzaXplb2YoRlJBR01FTlRfRlJBTUUpKTsKKwlwQWQtPkZyYWdGcmFtZS5wRnJhZ1BhY2tldCA9ICBSVE1QX0FsbG9jYXRlRnJhZ1BhY2tldEJ1ZmZlcihwQWQsIFJYX0JVRkZFUl9OT1JNU0laRSk7CisKKwlpZiAocEFkLT5GcmFnRnJhbWUucEZyYWdQYWNrZXQgPT0gTlVMTCkKKwl7CisJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1JFU09VUkNFUzsKKwl9CisKKwlEQkdQUklOVF9TKFN0YXR1cywgKCI8LS0gUlRNUEFsbG9jVHhSeFJpbmdNZW1vcnksIFN0YXR1cz0leFxuIiwgU3RhdHVzKSk7CisJcmV0dXJuIFN0YXR1czsKK30KKworCisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitSb3V0aW5lIERlc2NyaXB0aW9uOgorCUNhbGxzIFVTQl9JbnRlcmZhY2VTdG9wIGFuZCBmcmVlcyBtZW1vcnkgYWxsb2NhdGVkIGZvciB0aGUgVVJCcworICAgIGNhbGxzIE5kaXNNRGVyZWdpc3RlckRldmljZSBhbmQgZnJlZXMgdGhlIG1lbW9yeQorICAgIGFsbG9jYXRlZCBpbiBWTmV0SW5pdGlhbGl6ZSBmb3IgdGhlIEFkYXB0ZXIgT2JqZWN0CisKK0FyZ3VtZW50czoKKwkqcEFkCQkJCXRoZSByYXh4IGludGVyZmFjZSBkYXRhIHBvaW50ZXIKKworUmV0dXJuIFZhbHVlOgorCU5vbmUKKworTm90ZToKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJUlRNUEZyZWVUeFJ4UmluZ01lbW9yeSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCkKK3sKKyNkZWZpbmUgTE1fVVJCX0ZSRUUocE9iaiwgQ29udGV4dCwgQnVmZmVyU2l6ZSkJCQkJXAorCWlmIChOVUxMICE9IENvbnRleHQtPnBVcmIpIHsJCQkJCQkJXAorCQlSVFVTQl9VTkxJTktfVVJCKENvbnRleHQtPnBVcmIpOwkJCQkJXAorCQlSVFVTQl9GUkVFX1VSQihDb250ZXh0LT5wVXJiKTsJCQkJCQlcCisJCUNvbnRleHQtPnBVcmIgPSBOVUxMOyB9CQkJCQkJCQlcCisJaWYgKE5VTEwgIT0gQ29udGV4dC0+VHJhbnNmZXJCdWZmZXIpIHsJCQkJCVwKKwkJUlRVU0JfVVJCX0ZSRUVfQlVGRkVSKHBPYmotPnBVc2JfRGV2LCBCdWZmZXJTaXplLAlcCisJCQkJCQkJCUNvbnRleHQtPlRyYW5zZmVyQnVmZmVyLAlcCisJCQkJCQkJCUNvbnRleHQtPmRhdGFfZG1hKTsJCQlcCisJCUNvbnRleHQtPlRyYW5zZmVyQnVmZmVyID0gTlVMTDsgfQorCisKKwlVSU5UICAgICAgICAgICAgICAgIGksIGFjaWR4OworCVBUWF9DT05URVhUCQkJcE51bGxDb250ZXh0ICAgPSAmcEFkLT5OdWxsQ29udGV4dDsKKwlQVFhfQ09OVEVYVAkJCXBQc1BvbGxDb250ZXh0ID0gJnBBZC0+UHNQb2xsQ29udGV4dDsKKwlQVFhfQ09OVEVYVAkJCXBSVFNDb250ZXh0ICAgID0gJnBBZC0+UlRTQ29udGV4dDsKKy8vCVBIVF9UWF9DT05URVhUIAkJcEhUVFhDb250ZXh0OworCS8vUFJUTVBfUkVPUkRFUkJVRglwUmVvcmRlckJ1ZjsKKwlQT1NfQ09PS0lFCQkJcE9iaiA9IChQT1NfQ09PS0lFKSBwQWQtPk9TX0Nvb2tpZTsKKy8vCVJUTVBfVFhfUklORwkJKnBUeFJpbmc7CisKKwlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCItLS0+IFJUTVBGcmVlVHhSeFJpbmdNZW1vcnlcbiIpKTsKKwlwT2JqID0gcE9iajsKKworCS8vIEZyZWUgYWxsIHJlc291cmNlcyBmb3IgdGhlIFJFQ0VJVkUgYnVmZmVyIHF1ZXVlLgorCWZvcihpPTA7IGk8KFJYX1JJTkdfU0laRSk7IGkrKykKKwl7CisJCVBSWF9DT05URVhUICBwUnhDb250ZXh0ID0gJihwQWQtPlJ4Q29udGV4dFtpXSk7CisJCWlmIChwUnhDb250ZXh0KQorCQkJTE1fVVJCX0ZSRUUocE9iaiwgcFJ4Q29udGV4dCwgTUFYX1JYQlVMS19TSVpFKTsKKwl9CisKKwkvLyBGcmVlIFBzUG9sbCBmcmFtZSByZXNvdXJjZQorCUxNX1VSQl9GUkVFKHBPYmosIHBQc1BvbGxDb250ZXh0LCBzaXplb2YoVFhfQlVGRkVSKSk7CisKKwkvLyBGcmVlIE5VTEwgZnJhbWUgcmVzb3VyY2UKKwlMTV9VUkJfRlJFRShwT2JqLCBwTnVsbENvbnRleHQsIHNpemVvZihUWF9CVUZGRVIpKTsKKworCS8vIEZyZWUgUlRTIGZyYW1lIHJlc291cmNlCisJTE1fVVJCX0ZSRUUocE9iaiwgcFJUU0NvbnRleHQsIHNpemVvZihUWF9CVUZGRVIpKTsKKworCisJLy8gRnJlZSBiZWFjb24gZnJhbWUgcmVzb3VyY2UKKwlmb3IoaT0wOyBpPEJFQUNPTl9SSU5HX1NJWkU7IGkrKykKKwl7CisJCVBUWF9DT05URVhUCXBCZWFjb25Db250ZXh0ID0gJihwQWQtPkJlYWNvbkNvbnRleHRbaV0pOworCQlpZiAocEJlYWNvbkNvbnRleHQpCisJCQlMTV9VUkJfRlJFRShwT2JqLCBwQmVhY29uQ29udGV4dCwgc2l6ZW9mKFRYX0JVRkZFUikpOworCX0KKworCisJLy8gRnJlZSBtZ210IGZyYW1lIHJlc291cmNlCisJZm9yKGkgPSAwOyBpIDwgTUdNVF9SSU5HX1NJWkU7IGkrKykKKwl7CisJCVBUWF9DT05URVhUIHBNTE1FQ29udGV4dCA9IChQVFhfQ09OVEVYVClwQWQtPk1nbXRSaW5nLkNlbGxbaV0uQWxsb2NWYTsKKwkJLy9MTV9VUkJfRlJFRShwT2JqLCBwTUxNRUNvbnRleHQsIHNpemVvZihUWF9CVUZGRVIpKTsKKwkJaWYgKE5VTEwgIT0gcEFkLT5NZ210UmluZy5DZWxsW2ldLnBOZGlzUGFja2V0KQorCQl7CisJCQlSVE1QRnJlZU5kaXNQYWNrZXQocEFkLCBwQWQtPk1nbXRSaW5nLkNlbGxbaV0ucE5kaXNQYWNrZXQpOworCQkJcEFkLT5NZ210UmluZy5DZWxsW2ldLnBOZGlzUGFja2V0ID0gTlVMTDsKKwkJCXBNTE1FQ29udGV4dC0+VHJhbnNmZXJCdWZmZXIgPSBOVUxMOworCQl9CisKKwkJaWYgKHBNTE1FQ29udGV4dCkKKwkJeworCQkJaWYgKE5VTEwgIT0gcE1MTUVDb250ZXh0LT5wVXJiKQorCQkJeworCQkJCVJUVVNCX1VOTElOS19VUkIocE1MTUVDb250ZXh0LT5wVXJiKTsKKwkJCQlSVFVTQl9GUkVFX1VSQihwTUxNRUNvbnRleHQtPnBVcmIpOworCQkJCXBNTE1FQ29udGV4dC0+cFVyYiA9IE5VTEw7CisJCQl9CisJCX0KKwl9CisJaWYgKHBBZC0+TWdtdERlc2NSaW5nLkFsbG9jVmEpCisJCU5kaXNGcmVlTWVtb3J5KHBBZC0+TWdtdERlc2NSaW5nLkFsbG9jVmEsIHBBZC0+TWdtdERlc2NSaW5nLkFsbG9jU2l6ZSwgMCk7CisKKworCS8vIEZyZWUgVHggZnJhbWUgcmVzb3VyY2UKKwlmb3IgKGFjaWR4ID0gMDsgYWNpZHggPCA0OyBhY2lkeCsrKQorCQl7CisJCVBIVF9UWF9DT05URVhUIHBIVFRYQ29udGV4dCA9ICYocEFkLT5UeENvbnRleHRbYWNpZHhdKTsKKwkJCWlmIChwSFRUWENvbnRleHQpCisJCQkJTE1fVVJCX0ZSRUUocE9iaiwgcEhUVFhDb250ZXh0LCBzaXplb2YoSFRUWF9CVUZGRVIpKTsKKwkJfQorCisJaWYgKHBBZC0+RnJhZ0ZyYW1lLnBGcmFnUGFja2V0KQorCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcEFkLT5GcmFnRnJhbWUucEZyYWdQYWNrZXQsIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOworCisJZm9yKGk9MDsgaTw2OyBpKyspCisJeworCQlOZGlzRnJlZVNwaW5Mb2NrKCZwQWQtPkJ1bGtPdXRMb2NrW2ldKTsKKwl9CisKKwlOZGlzRnJlZVNwaW5Mb2NrKCZwQWQtPkJ1bGtJbkxvY2spOworCU5kaXNGcmVlU3BpbkxvY2soJnBBZC0+TUxNRUJ1bGtPdXRMb2NrKTsKKworCU5kaXNGcmVlU3BpbkxvY2soJnBBZC0+Q21kUUxvY2spOworI2lmZGVmIFJBTElOS19BVEUKKwlOZGlzRnJlZVNwaW5Mb2NrKCZwQWQtPkdlbmVyaWNMb2NrKTsKKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisJLy8gQ2xlYXIgYWxsIHBlbmRpbmcgYnVsay1vdXQgcmVxdWVzdCBmbGFncy4KKwlSVFVTQl9DTEVBUl9CVUxLX0ZMQUcocEFkLCAweGZmZmZmZmZmKTsKKworLy8JTmRpc0ZyZWVTcGluTG9jaygmcEFkLT5NYWNUYWJMb2NrKTsKKworLy8JZm9yKGk9MDsgaTxNQVhfTEVOX09GX0JBX1JFQ19UQUJMRTsgaSsrKQorLy8JeworLy8JCU5kaXNGcmVlU3BpbkxvY2soJnBBZC0+QkFUYWJsZS5CQVJlY0VudHJ5W2ldLlJ4UmVSaW5nTG9jayk7CisvLwl9CisKKwlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCI8LS0tIFJlbGVhc2VBZGFwdGVyXG4iKSk7Cit9CisKKworLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICBBbGxvY2F0ZSBtZW1vcnkgZm9yIGFkYXB0ZXIgY29udHJvbCBibG9jay4KKworQXJndW1lbnRzOgorICAgIHBBZAkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCitSZXR1cm4gVmFsdWU6CisJTkRJU19TVEFUVVNfU1VDQ0VTUworCU5ESVNfU1RBVFVTX0ZBSUxVUkUKKwlORElTX1NUQVRVU19SRVNPVVJDRVMKKworTm90ZToKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK05ESVNfU1RBVFVTIEFkYXB0ZXJCbG9ja0FsbG9jYXRlTWVtb3J5KAorCUlOIFBWT0lECWhhbmRsZSwKKwlPVVQJUFZPSUQJKnBwQWQpCit7CisJUFVTQl9ERVYJdXNiX2RldjsKKwlQT1NfQ09PS0lFCXBPYmogPSAoUE9TX0NPT0tJRSkgaGFuZGxlOworCisKKwl1c2JfZGV2ID0gcE9iai0+cFVzYl9EZXY7CisKKwlwT2JqLT5NTE1FVGhyX3BpZAkJPSBUSFJFQURfUElEX0lOSVRfVkFMVUU7CisJcE9iai0+UlRVU0JDbWRUaHJfcGlkCT0gVEhSRUFEX1BJRF9JTklUX1ZBTFVFOworCisJKnBwQWQgPSAoUFZPSUQpdm1hbGxvYyhzaXplb2YoUlRNUF9BREFQVEVSKSk7CisKKwlpZiAoKnBwQWQpCisJeworCQlOZGlzWmVyb01lbW9yeSgqcHBBZCwgc2l6ZW9mKFJUTVBfQURBUFRFUikpOworCQkoKFBSVE1QX0FEQVBURVIpKnBwQWQpLT5PU19Db29raWUgPSBoYW5kbGU7CisJCXJldHVybiAoTkRJU19TVEFUVVNfU1VDQ0VTUyk7CisJfQorCWVsc2UKKwl7CisJCXJldHVybiAoTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJfQorfQorCisKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1JvdXRpbmUgRGVzY3JpcHRpb246CisgICAgQ3JlYXRlIGtlcm5lbCB0aHJlYWRzICYgdGFza2xldHMuCisKK0FyZ3VtZW50czoKKyAgICAqbmV0X2RldgkJCVBvaW50ZXIgdG8gd2lyZWxlc3MgbmV0IGRldmljZSBpbnRlcmZhY2UKKworUmV0dXJuIFZhbHVlOgorCU5ESVNfU1RBVFVTX1NVQ0NFU1MKKwlORElTX1NUQVRVU19GQUlMVVJFCisKK05vdGU6Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitORElTX1NUQVRVUwkgQ3JlYXRlVGhyZWFkcygKKwlJTglzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldikKK3sKKwlQUlRNUF9BREFQVEVSIHBBZCA9IG5ldF9kZXYtPm1sX3ByaXY7CisJUE9TX0NPT0tJRSBwT2JqID0gKFBPU19DT09LSUUpIHBBZC0+T1NfQ29va2llOworCXBpZF90IHBpZF9udW1iZXIgPSAtMTsKKworCS8vaW5pdF9NVVRFWCgmKHBBZC0+dXNiZGV2X3NlbWFwaG9yZSkpOworCisJaW5pdF9NVVRFWF9MT0NLRUQoJihwQWQtPm1sbWVfc2VtYXBob3JlKSk7CisJaW5pdF9jb21wbGV0aW9uICgmcEFkLT5tbG1lQ29tcGxldGUpOworCisJaW5pdF9NVVRFWF9MT0NLRUQoJihwQWQtPlJUVVNCQ21kX3NlbWFwaG9yZSkpOworCWluaXRfY29tcGxldGlvbiAoJnBBZC0+Q21kUUNvbXBsZXRlKTsKKworCWluaXRfTVVURVhfTE9DS0VEKCYocEFkLT5SVFVTQlRpbWVyX3NlbWFwaG9yZSkpOworCWluaXRfY29tcGxldGlvbiAoJnBBZC0+VGltZXJRQ29tcGxldGUpOworCisJLy8gQ3JlYXQgTUxNRSBUaHJlYWQKKwlwT2JqLT5NTE1FVGhyX3BpZD0gVEhSRUFEX1BJRF9JTklUX1ZBTFVFOworCXBpZF9udW1iZXIgPSBrZXJuZWxfdGhyZWFkKE1sbWVUaHJlYWQsIHBBZCwgQ0xPTkVfVk0pOworCWlmIChwaWRfbnVtYmVyIDwgMCkKKwl7CisJCXByaW50ayAoS0VSTl9XQVJOSU5HICIlczogdW5hYmxlIHRvIHN0YXJ0IE1sbWUgdGhyZWFkXG4iLHBBZC0+bmV0X2Rldi0+bmFtZSk7CisJCXJldHVybiBORElTX1NUQVRVU19GQUlMVVJFOworCX0KKwlwT2JqLT5NTE1FVGhyX3BpZCA9IEdFVF9QSUQocGlkX251bWJlcik7CisJLy8gV2FpdCBmb3IgdGhlIHRocmVhZCB0byBzdGFydAorCXdhaXRfZm9yX2NvbXBsZXRpb24oJihwQWQtPm1sbWVDb21wbGV0ZSkpOworCisJLy8gQ3JlYXQgQ29tbWFuZCBUaHJlYWQKKwlwT2JqLT5SVFVTQkNtZFRocl9waWQ9IFRIUkVBRF9QSURfSU5JVF9WQUxVRTsKKwlwaWRfbnVtYmVyID0ga2VybmVsX3RocmVhZChSVFVTQkNtZFRocmVhZCwgcEFkLCBDTE9ORV9WTSk7CisJaWYgKHBpZF9udW1iZXIgPCAwKQorCXsKKwkJcHJpbnRrIChLRVJOX1dBUk5JTkcgIiVzOiB1bmFibGUgdG8gc3RhcnQgUlRVU0JDbWQgdGhyZWFkXG4iLHBBZC0+bmV0X2Rldi0+bmFtZSk7CisJCXJldHVybiBORElTX1NUQVRVU19GQUlMVVJFOworCX0KKwlwT2JqLT5SVFVTQkNtZFRocl9waWQgPSBHRVRfUElEKHBpZF9udW1iZXIpOworCXdhaXRfZm9yX2NvbXBsZXRpb24oJihwQWQtPkNtZFFDb21wbGV0ZSkpOworCisJcE9iai0+VGltZXJRVGhyX3BpZD0gVEhSRUFEX1BJRF9JTklUX1ZBTFVFOworCXBpZF9udW1iZXIgPSBrZXJuZWxfdGhyZWFkKFRpbWVyUVRocmVhZCwgcEFkLCBDTE9ORV9WTSk7CisJaWYgKHBpZF9udW1iZXIgPCAwKQorCXsKKwkJcHJpbnRrIChLRVJOX1dBUk5JTkcgIiVzOiB1bmFibGUgdG8gc3RhcnQgVGltZXJRVGhyZWFkXG4iLHBBZC0+bmV0X2Rldi0+bmFtZSk7CisJCXJldHVybiBORElTX1NUQVRVU19GQUlMVVJFOworCX0KKwlwT2JqLT5UaW1lclFUaHJfcGlkID0gR0VUX1BJRChwaWRfbnVtYmVyKTsKKwkvLyBXYWl0IGZvciB0aGUgdGhyZWFkIHRvIHN0YXJ0CisJd2FpdF9mb3JfY29tcGxldGlvbigmKHBBZC0+VGltZXJRQ29tcGxldGUpKTsKKworCS8vIENyZWF0ZSByZWNlaXZlIHRhc2tsZXQKKwl0YXNrbGV0X2luaXQoJnBPYmotPnJ4X2RvbmVfdGFzaywgcnhfZG9uZV90YXNrbGV0LCAoVUxPTkcpcEFkKTsKKwl0YXNrbGV0X2luaXQoJnBPYmotPm1nbXRfZG1hX2RvbmVfdGFzaywgcnQyODcwX21nbXRfZG1hX2RvbmVfdGFza2xldCwgKHVuc2lnbmVkIGxvbmcpcEFkKTsKKwl0YXNrbGV0X2luaXQoJnBPYmotPmFjMF9kbWFfZG9uZV90YXNrLCBydDI4NzBfYWMwX2RtYV9kb25lX3Rhc2tsZXQsICh1bnNpZ25lZCBsb25nKXBBZCk7CisJdGFza2xldF9pbml0KCZwT2JqLT5hYzFfZG1hX2RvbmVfdGFzaywgcnQyODcwX2FjMV9kbWFfZG9uZV90YXNrbGV0LCAodW5zaWduZWQgbG9uZylwQWQpOworCXRhc2tsZXRfaW5pdCgmcE9iai0+YWMyX2RtYV9kb25lX3Rhc2ssIHJ0Mjg3MF9hYzJfZG1hX2RvbmVfdGFza2xldCwgKHVuc2lnbmVkIGxvbmcpcEFkKTsKKwl0YXNrbGV0X2luaXQoJnBPYmotPmFjM19kbWFfZG9uZV90YXNrLCBydDI4NzBfYWMzX2RtYV9kb25lX3Rhc2tsZXQsICh1bnNpZ25lZCBsb25nKXBBZCk7CisJdGFza2xldF9pbml0KCZwT2JqLT5oY2NhX2RtYV9kb25lX3Rhc2ssIHJ0Mjg3MF9oY2NhX2RtYV9kb25lX3Rhc2tsZXQsICh1bnNpZ25lZCBsb25nKXBBZCk7CisJdGFza2xldF9pbml0KCZwT2JqLT50YnR0X3Rhc2ssIHRidHRfdGFza2xldCwgKHVuc2lnbmVkIGxvbmcpcEFkKTsKKwl0YXNrbGV0X2luaXQoJnBPYmotPm51bGxfZnJhbWVfY29tcGxldGVfdGFzaywgcnQyODcwX251bGxfZnJhbWVfY29tcGxldGVfdGFza2xldCwgKHVuc2lnbmVkIGxvbmcpcEFkKTsKKwl0YXNrbGV0X2luaXQoJnBPYmotPnJ0c19mcmFtZV9jb21wbGV0ZV90YXNrLCBydDI4NzBfcnRzX2ZyYW1lX2NvbXBsZXRlX3Rhc2tsZXQsICh1bnNpZ25lZCBsb25nKXBBZCk7CisJdGFza2xldF9pbml0KCZwT2JqLT5wc3BvbGxfZnJhbWVfY29tcGxldGVfdGFzaywgcnQyODcwX3BzcG9sbF9mcmFtZV9jb21wbGV0ZV90YXNrbGV0LCAodW5zaWduZWQgbG9uZylwQWQpOworCisJcmV0dXJuIE5ESVNfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorUm91dGluZSBEZXNjcmlwdGlvbjoKKyAJQXMgU1RBJ3MgQlNTSUQgaXMgYSBXQyB0b28sIGl0IHVzZXMgc2hhcmVkIGtleSB0YWJsZS4KKyAJVGhpcyBmdW5jdGlvbiB3cml0ZSBjb3JyZWN0IHVuaWNhc3QgVFgga2V5IHRvIEFTSUMgV0NJRC4KKyAJQW5kIHdlIHN0aWxsIG1ha2UgYSBjb3B5IGluIG91ciBNYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5QYWlyd2lzZUtleS4KKwlDYWxsZXIgZ3VhcmFudGVlIFRLSVAvQUVTIGFsd2F5cyBoYXMga2V5aWR4ID0gMC4gKHBhaXJ3aXNlIGtleSkKKwlDYWxsZXIgZ3VhcmFudGVlIFdFUCBjYWxscyB0aGlzIGZ1bmN0aW9uIHdoZW4gc2V0IFR4a2V5LCAgZGVmYXVsdCBrZXkgaW5kZXg9MH4zLgorCitBcmd1bWVudHM6CisJcEFkIAkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCXBLZXkJCQkJCVBvaW50ZXIgdG8gdGhlIHdoZXJlIHRoZSBrZXkgc3RvcmVkCisKK1JldHVybiBWYWx1ZToKKwlORElTX1NVQ0NFU1MJCQlBZGQga2V5IHN1Y2Nlc3NmdWxseQorCitOb3RlOgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlSVE1QQWRkQlNTSURDaXBoZXIoCisJSU4JUFJUTVBfQURBUFRFUgkJcEFkLAorCUlOCVVDSEFSCQkJCUFpZCwKKwlJTglQTkRJU184MDJfMTFfS0VZCXBLZXksCisJSU4gIFVDSEFSICAgCQkJQ2lwaGVyQWxnKQoreworCVBVQ0hBUgkJcFR4TWljLCBwUnhNaWM7CisJQk9PTEVBTiAJYktleVJTQywgYkF1dGhlbnRpY2F0b3I7IC8vIGluZGljYXRlIHRoZSByZWNlaXZlIFNDIHNldCBieSBLZXlSU0MgdmFsdWUKKy8vCVVDSEFSCQlDaXBoZXJBbGc7CisJVUNIQVIJCWk7CisJVUxPTkcJCVdDSURBdHRyaTsKKwlVU0hPUlQJIAlvZmZzZXQ7CisJVUNIQVIJCUtleUlkeCwgSVZFSVZbOF07CisJVUlOVDMyCQlWYWx1ZTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJUTVBBZGRCU1NJRENpcGhlcj09PiBBaWQgPSAlZFxuIixBaWQpKTsKKworCS8vIEJpdCAyOSBvZiBBZGQta2V5IEtleVJTQworCWJLZXlSU0MgCSAgID0gKHBLZXktPktleUluZGV4ICYgMHgyMDAwMDAwMCkgPyBUUlVFIDogRkFMU0U7CisKKwkvLyBCaXQgMjggb2YgQWRkLWtleSBBdXRoZW50aWNhdG9yCisJYkF1dGhlbnRpY2F0b3IgPSAocEtleS0+S2V5SW5kZXggJiAweDEwMDAwMDAwKSA/IFRSVUUgOiBGQUxTRTsKKwlLZXlJZHggPSAoVUNIQVIpcEtleS0+S2V5SW5kZXgmMHhmZjsKKworCWlmIChLZXlJZHggPiA0KQorCQlyZXR1cm47CisKKworCWlmIChwQWQtPk1hY1RhYi5Db250ZW50W0FpZF0uUGFpcndpc2VLZXkuQ2lwaGVyQWxnID09IENJUEhFUl9US0lQKQorCXsJaWYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmUpCisJCXsKKwkJCS8vIGZvciBXUEEtTm9uZSBUeCwgUnggTUlDIGlzIHRoZSBzYW1lCisJCQlwVHhNaWMgPSAoUFVDSEFSKSAoJnBLZXktPktleU1hdGVyaWFsKSArIDE2OworCQkJcFJ4TWljID0gcFR4TWljOworCQl9CisJCWVsc2UgaWYgKGJBdXRoZW50aWNhdG9yID09IFRSVUUpCisJCXsKKwkJCXBUeE1pYyA9IChQVUNIQVIpICgmcEtleS0+S2V5TWF0ZXJpYWwpICsgMTY7CisJCQlwUnhNaWMgPSAoUFVDSEFSKSAoJnBLZXktPktleU1hdGVyaWFsKSArIDI0OworCQl9CisJCWVsc2UKKwkJeworCQkJcFJ4TWljID0gKFBVQ0hBUikgKCZwS2V5LT5LZXlNYXRlcmlhbCkgKyAxNjsKKwkJCXBUeE1pYyA9IChQVUNIQVIpICgmcEtleS0+S2V5TWF0ZXJpYWwpICsgMjQ7CisJCX0KKworCQlvZmZzZXQgPSBQQUlSV0lTRV9LRVlfVEFCTEVfQkFTRSArIChBaWQgKiBIV19LRVlfRU5UUllfU0laRSkgKyAweDEwOworCQlmb3IgKGk9MDsgaTw4OyApCisJCXsKKwkJCVZhbHVlID0gKihwVHhNaWMraSk7CisJCQlWYWx1ZSArPSAoKihwVHhNaWMraSsxKTw8OCk7CisJCQlWYWx1ZSArPSAoKihwVHhNaWMraSsyKTw8MTYpOworCQkJVmFsdWUgKz0gKCoocFR4TWljK2krMyk8PDI0KTsKKwkJCVJUVVNCV3JpdGVNQUNSZWdpc3RlcihwQWQsIG9mZnNldCtpLCBWYWx1ZSk7CisJCQlpKz00OworCQl9CisKKwkJb2Zmc2V0ID0gUEFJUldJU0VfS0VZX1RBQkxFX0JBU0UgKyAoQWlkICogSFdfS0VZX0VOVFJZX1NJWkUpICsgMHgxODsKKwkJZm9yIChpPTA7IGk8ODsgKQorCQl7CisJCQlWYWx1ZSA9ICoocFJ4TWljK2kpOworCQkJVmFsdWUgKz0gKCoocFJ4TWljK2krMSk8PDgpOworCQkJVmFsdWUgKz0gKCoocFJ4TWljK2krMik8PDE2KTsKKwkJCVZhbHVlICs9ICgqKHBSeE1pYytpKzMpPDwyNCk7CisJCQlSVFVTQldyaXRlTUFDUmVnaXN0ZXIocEFkLCBvZmZzZXQraSwgVmFsdWUpOworCQkJaSs9NDsKKwkJfQorCisJCS8vIE9ubHkgS2V5IGxlbnRoIGVxdWFsIHRvIFRLSVAga2V5IGhhdmUgdGhlc2UKKwkJTmRpc01vdmVNZW1vcnkocEFkLT5NYWNUYWIuQ29udGVudFtBaWRdLlBhaXJ3aXNlS2V5LlJ4TWljLCBwUnhNaWMsIDgpOworCQlOZGlzTW92ZU1lbW9yeShwQWQtPk1hY1RhYi5Db250ZW50W0FpZF0uUGFpcndpc2VLZXkuVHhNaWMsIHBUeE1pYywgOCk7CisKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJKCIJVHhNSUMgID0gJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IFxuIiwKKwkJCQlwVHhNaWNbMF0scFR4TWljWzFdLHBUeE1pY1syXSxwVHhNaWNbM10sCisJCQkJcFR4TWljWzRdLHBUeE1pY1s1XSxwVHhNaWNbNl0scFR4TWljWzddKSk7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSgiCVJ4TUlDICA9ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCBcbiIsCisJCQkJcFJ4TWljWzBdLHBSeE1pY1sxXSxwUnhNaWNbMl0scFJ4TWljWzNdLAorCQkJCXBSeE1pY1s0XSxwUnhNaWNbNV0scFJ4TWljWzZdLHBSeE1pY1s3XSkpOworCX0KKworCS8vIDIuIFJlY29yZCBTZWN1cml0eSBLZXkuCisJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5QYWlyd2lzZUtleS5LZXlMZW49IChVQ0hBUilwS2V5LT5LZXlMZW5ndGg7CisJTmRpc01vdmVNZW1vcnkocEFkLT5NYWNUYWIuQ29udGVudFtBaWRdLlBhaXJ3aXNlS2V5LktleSwgJnBLZXktPktleU1hdGVyaWFsLCBwS2V5LT5LZXlMZW5ndGgpOworCisJLy8gMy4gQ2hlY2sgUnhUc2MuIEFuZCB1c2VkIHRvIGluaXQgdG8gQVNJQyBJVi4KKwlpZiAoYktleVJTQyA9PSBUUlVFKQorCQlOZGlzTW92ZU1lbW9yeShwQWQtPk1hY1RhYi5Db250ZW50W0FpZF0uUGFpcndpc2VLZXkuUnhUc2MsICZwS2V5LT5LZXlSU0MsIDYpOworCWVsc2UKKwkJTmRpc1plcm9NZW1vcnkocEFkLT5NYWNUYWIuQ29udGVudFtBaWRdLlBhaXJ3aXNlS2V5LlJ4VHNjLCA2KTsKKworCS8vIDQuIEluaXQgVHhUc2MgdG8gb25lIGJhc2VkIG9uIFdpRmkgV1BBIHNwZWNzCisJcEFkLT5NYWNUYWIuQ29udGVudFtBaWRdLlBhaXJ3aXNlS2V5LlR4VHNjWzBdID0gMTsKKwlwQWQtPk1hY1RhYi5Db250ZW50W0FpZF0uUGFpcndpc2VLZXkuVHhUc2NbMV0gPSAwOworCXBBZC0+TWFjVGFiLkNvbnRlbnRbQWlkXS5QYWlyd2lzZUtleS5UeFRzY1syXSA9IDA7CisJcEFkLT5NYWNUYWIuQ29udGVudFtBaWRdLlBhaXJ3aXNlS2V5LlR4VHNjWzNdID0gMDsKKwlwQWQtPk1hY1RhYi5Db250ZW50W0FpZF0uUGFpcndpc2VLZXkuVHhUc2NbNF0gPSAwOworCXBBZC0+TWFjVGFiLkNvbnRlbnRbQWlkXS5QYWlyd2lzZUtleS5UeFRzY1s1XSA9IDA7CisKKwlDaXBoZXJBbGcgPSBwQWQtPk1hY1RhYi5Db250ZW50W0FpZF0uUGFpcndpc2VLZXkuQ2lwaGVyQWxnOworCisJb2Zmc2V0ID0gUEFJUldJU0VfS0VZX1RBQkxFX0JBU0UgKyAoQWlkICogSFdfS0VZX0VOVFJZX1NJWkUpOworCVJUVVNCTXVsdGlXcml0ZShwQWQsIChVU0hPUlQpIG9mZnNldCwgcEtleS0+S2V5TWF0ZXJpYWwsCisJCQkJKChwS2V5LT5LZXlMZW5ndGggPT0gTEVOX1RLSVBfS0VZKSA/IDE2IDogKFVTSE9SVClwS2V5LT5LZXlMZW5ndGgpKTsKKworCW9mZnNldCA9IFNIQVJFRF9LRVlfVEFCTEVfQkFTRSArIChLZXlJZHggKiBIV19LRVlfRU5UUllfU0laRSk7CisJUlRVU0JNdWx0aVdyaXRlKHBBZCwgKFVTSE9SVCkgb2Zmc2V0LCBwS2V5LT5LZXlNYXRlcmlhbCwgKFVTSE9SVClwS2V5LT5LZXlMZW5ndGgpOworCisJb2Zmc2V0ID0gUEFJUldJU0VfSVZFSVZfVEFCTEVfQkFTRSArIChBaWQgKiBIV19JVkVJVl9FTlRSWV9TSVpFKTsKKwlOZGlzWmVyb01lbW9yeShJVkVJViwgOCk7CisKKwkvLyBJVi9FSVYKKwlpZiAoKENpcGhlckFsZyA9PSBDSVBIRVJfVEtJUCkgfHwKKwkJKENpcGhlckFsZyA9PSBDSVBIRVJfVEtJUF9OT19NSUMpIHx8CisJCShDaXBoZXJBbGcgPT0gQ0lQSEVSX0FFUykpCisJeworCQlJVkVJVlszXSA9IDB4MjA7IC8vIEVpdiBiaXQgb24uIGtleWlkIGFsd2F5cyAwIGZvciBwYWlyd2lzZSBrZXkKKwl9CisJLy8gZGVmYXVsdCBrZXkgaWR4IG5lZWRzIHRvIHNldC4KKwkvLyBpbiBUS0lQL0FFUyBLZXlJZHggPSAwICwgV0VQIEtleUlkeCBpcyBkZWZhdWx0IHR4IGtleS4KKwllbHNlCisJeworCQlJVkVJVlszXSB8PSAoS2V5SWR4PDwgNik7CisJfQorCVJUVVNCTXVsdGlXcml0ZShwQWQsIChVU0hPUlQpIG9mZnNldCwgSVZFSVYsIDgpOworCisJLy8gV0NJRCBBdHRyaWJ1dGUgVURGOjMsIEJTU0lkeDozLCBBbGc6MywgS2V5dGFibGU6MT1QQUlSV0lTRSBLRVksIEJTU0lkeCBpcyAwCisJaWYgKChDaXBoZXJBbGcgPT0gQ0lQSEVSX1RLSVApIHx8CisJCShDaXBoZXJBbGcgPT0gQ0lQSEVSX1RLSVBfTk9fTUlDKSB8fAorCQkoQ2lwaGVyQWxnID09IENJUEhFUl9BRVMpKQorCXsKKwkJV0NJREF0dHJpID0gKENpcGhlckFsZzw8MSl8U0hBUkVES0VZVEFCTEU7CisJfQorCWVsc2UKKwkJV0NJREF0dHJpID0gKENpcGhlckFsZzw8MSl8U0hBUkVES0VZVEFCTEU7CisKKwlvZmZzZXQgPSBNQUNfV0NJRF9BVFRSSUJVVEVfQkFTRSArIChBaWQqIEhXX1dDSURfQVRUUklfU0laRSk7CisJUlRVU0JXcml0ZU1BQ1JlZ2lzdGVyKHBBZCwgb2Zmc2V0LCBXQ0lEQXR0cmkpOworCVJUVVNCUmVhZE1BQ1JlZ2lzdGVyKHBBZCwgb2Zmc2V0LCAmVmFsdWUpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQlNTSURfV0NJRCA6IG9mZnNldCA9ICV4LCBXQ0lEQXR0cmkgPSAlbHhcbiIsCisJCQlvZmZzZXQsIFdDSURBdHRyaSkpOworCisJLy8gcEFkZHIKKwkvLyBBZGQgQnNzaWQgbWFjIGFkZHJlc3MgYXQgbGlua3VwLiBub3QgaGVyZS4gIGNoZWNrIQorCS8qb2Zmc2V0ID0gTUFDX1dDSURfQkFTRSArIChCU1NJRF9XQ0lEICogSFdfV0NJRF9FTlRSWV9TSVpFKTsKKwkqZm9yIChpPTA7IGk8TUFDX0FERFJfTEVOOyBpKyspCisJeworCQlSVE1QX0lPX1dSSVRFOChwQWQsIG9mZnNldCtpLCBwS2V5LT5CU1NJRFtpXSk7CisJfQorCSovCisKKwlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJBZGRCU1NJRGFzV0NJREVudHJ5OiBBbGc9JXMsIEtleUxlbmd0aCA9ICVkXG4iLAorCQkJQ2lwaGVyTmFtZVtDaXBoZXJBbGddLCBwS2V5LT5LZXlMZW5ndGgpKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJLZXkgW2lkeD0leF0gW0tleUxlbiA9ICVkXVxuIiwKKwkJCXBLZXktPktleUluZGV4LCBwS2V5LT5LZXlMZW5ndGgpKTsKKwlmb3IoaT0wOyBpPHBLZXktPktleUxlbmd0aDsgaSsrKQorCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsKCIgJXg6IiwgcEtleS0+S2V5TWF0ZXJpYWxbaV0pKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIgkgXG4iKSk7Cit9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1JvdXRpbmUgRGVzY3JpcHRpb246CisgICAgR2V0IGEgcmVjZWl2ZWQgcGFja2V0LgorCitBcmd1bWVudHM6CisJcEFkCQkJCQlkZXZpY2UgY29udHJvbCBibG9jaworCXBTYXZlUnhECQkJcmVjZWl2ZSBkZXNjcmlwdG9yIGluZm9ybWF0aW9uCisJKnBiUmVzY2hlZHVsZQkJbmVlZCByZXNjaGVkdWxlIGZsYWcKKwkqcFJ4UGVuZGluZwkJCXBlbmRpbmcgcmVjZWl2ZWQgcGFja2V0IGZsYWcKKworUmV0dXJuIFZhbHVlOgorICAgIHRoZSByZWNpZXZlZCBwYWNrZXQKKworTm90ZToKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KKyNkZWZpbmUgUlQyODcwX1JYRE1BTEVOX0ZJRUxEX1NJWkUJCQk0CitQTkRJU19QQUNLRVQgR2V0UGFja2V0RnJvbVJ4UmluZygKKwlJTgkJUFJUTVBfQURBUFRFUgkJcEFkLAorCU9VVAkJUFJUMjhYWF9SWERfU1RSVUMJcFNhdmVSeEQsCisJT1VUCQlCT09MRUFOCQkJCSpwYlJlc2NoZWR1bGUsCisJSU4gT1VUCVVJTlQzMgkJCQkqcFJ4UGVuZGluZykKK3sKKwlQUlhfQ09OVEVYVAkJcFJ4Q29udGV4dDsKKwlQTkRJU19QQUNLRVQJcFNrYjsKKwlQVUNIQVIJCQlwRGF0YTsKKwlVTE9ORwkJCVRoaXNGcmFtZUxlbjsKKwlVTE9ORwkJCVJ4QnVmZmVyTGVuZ3RoOworCVBSWFdJX1NUUlVDCQlwUnhXSTsKKworCXBSeENvbnRleHQgPSAmcEFkLT5SeENvbnRleHRbcEFkLT5OZXh0UnhCdWxrSW5SZWFkSW5kZXhdOworCWlmICgocFJ4Q29udGV4dC0+UmVhZGFibGUgPT0gRkFMU0UpIHx8IChwUnhDb250ZXh0LT5JblVzZSA9PSBUUlVFKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlSeEJ1ZmZlckxlbmd0aCA9IHBSeENvbnRleHQtPkJ1bGtJbk9mZnNldCAtIHBBZC0+UmVhZFBvc2l0aW9uOworCWlmIChSeEJ1ZmZlckxlbmd0aCA8IChSVDI4NzBfUlhETUFMRU5fRklFTERfU0laRSArIHNpemVvZihSWFdJX1NUUlVDKSArIHNpemVvZihSWElORk9fU1RSVUMpKSkKKwl7CisJCWdvdG8gbGFiZWxfbnVsbDsKKwl9CisKKwlwRGF0YSA9ICZwUnhDb250ZXh0LT5UcmFuc2ZlckJ1ZmZlcltwQWQtPlJlYWRQb3NpdGlvbl07IC8qIDRLQiAqLworCS8vIFRoZSBSWERNQSBmaWVsZCBpcyA0IGJ5dGVzLCBub3cganVzdCB1c2UgdGhlIGZpcnN0IDIgYnl0ZXMuIFRoZSBMZW5ndGggaW5jbHVkaW5nIHRoZSAoUlhXSSArIE1TRFUgKyBQYWRkaW5nKQorCVRoaXNGcmFtZUxlbiA9ICpwRGF0YSArICgqKHBEYXRhKzEpPDw4KTsKKyAgICBpZiAoVGhpc0ZyYW1lTGVuID09IDApCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJCSVJJZHgoJWQpOiBSWERNQUxlbiBpcyB6ZXJvLlslbGRdLCBCdWxrSW5CdWZMZW4gPSAlbGQpXG4iLAorCQkJCQkJCQlwQWQtPk5leHRSeEJ1bGtJblJlYWRJbmRleCwgVGhpc0ZyYW1lTGVuLCBwUnhDb250ZXh0LT5CdWxrSW5PZmZzZXQpKTsKKwkJZ290byBsYWJlbF9udWxsOworCX0KKwlpZiAoKFRoaXNGcmFtZUxlbiYweDMpICE9IDApCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJCSVJJZHgoJWQpOiBSWERNQUxlbiBub3QgbXVsdGlwbGUgb2YgNC5bJWxkXSwgQnVsa0luQnVmTGVuID0gJWxkKVxuIiwKKwkJCQkJCQkJcEFkLT5OZXh0UnhCdWxrSW5SZWFkSW5kZXgsIFRoaXNGcmFtZUxlbiwgcFJ4Q29udGV4dC0+QnVsa0luT2Zmc2V0KSk7CisJCWdvdG8gbGFiZWxfbnVsbDsKKwl9CisKKwlpZiAoKFRoaXNGcmFtZUxlbiArIDgpPiBSeEJ1ZmZlckxlbmd0aCkJLy8gOCBmb3IgKFJUMjg3MF9SWERNQUxFTl9GSUVMRF9TSVpFICsgc2l6ZW9mKFJYSU5GT19TVFJVQykpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkJJUklkeCglZCk6RnJhbWVMZW4oMHglbHgpIG91dHJhbmdlcy4gQnVsa0luTGVuPTB4JWx4LCByZW1haW5pbmcgUnhCdWZMZW49MHglbHgsIFJlYWRQb3M9MHglbHhcbiIsCisJCQkJCQlwQWQtPk5leHRSeEJ1bGtJblJlYWRJbmRleCwgVGhpc0ZyYW1lTGVuLCBwUnhDb250ZXh0LT5CdWxrSW5PZmZzZXQsIFJ4QnVmZmVyTGVuZ3RoLCBwQWQtPlJlYWRQb3NpdGlvbikpOworCisJCS8vIGVycm9yIGZyYW1lLiBmaW5pc2ggdGhpcyBsb29wCisJCWdvdG8gbGFiZWxfbnVsbDsKKwl9CisKKwkvLyBza2lwIFVTQiBmcmFtZSBsZW5ndGggZmllbGQKKwlwRGF0YSArPSBSVDI4NzBfUlhETUFMRU5fRklFTERfU0laRTsKKwlwUnhXSSA9IChQUlhXSV9TVFJVQylwRGF0YTsKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJUlRNUFdJRW5kaWFuQ2hhbmdlKHBEYXRhLCBUWVBFX1JYV0kpOworI2VuZGlmIC8vIFJUX0JJR19FTkRJQU4gLy8KKwlpZiAocFJ4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudCA+IFRoaXNGcmFtZUxlbikKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzKCk6cFJ4V0lNUERVdG90YWxCeXRlQ291bnQoJWQpIGxhcmdlIHRoYW4gUnhETUFMZW4oJWxkKVxuIiwKKwkJCQkJCQkJCV9fZnVuY19fLCBwUnhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50LCBUaGlzRnJhbWVMZW4pKTsKKwkJZ290byBsYWJlbF9udWxsOworCX0KKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJUlRNUFdJRW5kaWFuQ2hhbmdlKHBEYXRhLCBUWVBFX1JYV0kpOworI2VuZGlmIC8vIFJUX0JJR19FTkRJQU4gLy8KKworCS8vIGFsbG9jYXRlIGEgcnggcGFja2V0CisJcFNrYiA9IGRldl9hbGxvY19za2IoVGhpc0ZyYW1lTGVuKTsKKwlpZiAocFNrYiA9PSBOVUxMKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCIlcygpOkNhbm5vdCBBbGxvY2F0ZSBzayBidWZmZXIgZm9yIHRoaXMgQnVsay1JbiBidWZmZXIhXG4iLCBfX2Z1bmNfXykpOworCQlnb3RvIGxhYmVsX251bGw7CisJfQorCisJLy8gY29weSB0aGUgcnggcGFja2V0CisJbWVtY3B5KHNrYl9wdXQocFNrYiwgVGhpc0ZyYW1lTGVuKSwgcERhdGEsIFRoaXNGcmFtZUxlbik7CisJUlRQS1RfVE9fT1NQS1QocFNrYiktPmRldiA9IGdldF9uZXRkZXZfZnJvbV9ic3NpZChwQWQsIEJTUzApOworCVJUTVBfU0VUX1BBQ0tFVF9TT1VSQ0UoT1NQS1RfVE9fUlRQS1QocFNrYiksIFBLVFNSQ19ORElTKTsKKworCS8vIGNvcHkgUnhECisJKnBTYXZlUnhEID0gKihQUlhJTkZPX1NUUlVDKShwRGF0YSArIFRoaXNGcmFtZUxlbik7CisjaWZkZWYgUlRfQklHX0VORElBTgorCVJUTVBEZXNjcmlwdG9yRW5kaWFuQ2hhbmdlKChQVUNIQVIpcFNhdmVSeEQsIFRZUEVfUlhJTkZPKTsKKyNlbmRpZiAvLyBSVF9CSUdfRU5ESUFOIC8vCisKKwkvLyB1cGRhdGUgbmV4dCBwYWNrZXQgcmVhZCBwb3NpdGlvbi4KKwlwQWQtPlJlYWRQb3NpdGlvbiArPSAoVGhpc0ZyYW1lTGVuICsgUlQyODcwX1JYRE1BTEVOX0ZJRUxEX1NJWkUgKyBSWElORk9fU0laRSk7CS8vIDggZm9yIChSVDI4NzBfUlhETUFMRU5fRklFTERfU0laRSArIHNpemVvZihSWElORk9fU1RSVUMpKQorCisJcmV0dXJuIHBTa2I7CisKK2xhYmVsX251bGw6CisKKwlyZXR1cm4gTlVMTDsKK30KKworCisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgIEhhbmRsZSByZWNlaXZlZCBwYWNrZXRzLgorCitBcmd1bWVudHM6CisJZGF0YQkJCQktIFVSQiBpbmZvcm1hdGlvbiBwb2ludGVyCisKK1JldHVybiBWYWx1ZToKKyAgICBOb25lCisKK05vdGU6Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitzdGF0aWMgdm9pZCByeF9kb25lX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXB1cmJiX3QgCQkJcFVyYjsKKwlQUlhfQ09OVEVYVAkJCXBSeENvbnRleHQ7CisJUFJUTVBfQURBUFRFUgkJcEFkOworCU5UU1RBVFVTCQkJU3RhdHVzOworCXVuc2lnbmVkIGludAkJSXJxRmxhZ3M7CisKKwlwVXJiCQk9IChwdXJiYl90KWRhdGE7CisJcFJ4Q29udGV4dAk9IChQUlhfQ09OVEVYVClwVXJiLT5jb250ZXh0OworCXBBZCAJCT0gcFJ4Q29udGV4dC0+cEFkOworCVN0YXR1cyA9IHBVcmItPnN0YXR1czsKKworCisJUlRNUF9JUlFfTE9DSygmcEFkLT5CdWxrSW5Mb2NrLCBJcnFGbGFncyk7CisJcFJ4Q29udGV4dC0+SW5Vc2UgPSBGQUxTRTsKKwlwUnhDb250ZXh0LT5JUlBQZW5kaW5nID0gRkFMU0U7CisJcFJ4Q29udGV4dC0+QnVsa0luT2Zmc2V0ICs9IHBVcmItPmFjdHVhbF9sZW5ndGg7CisJLy9OZGlzSW50ZXJsb2NrZWREZWNyZW1lbnQoJnBBZC0+UGVuZGluZ1J4KTsKKwlwQWQtPlBlbmRpbmdSeC0tOworCisJaWYgKFN0YXR1cyA9PSBVU0JfU1RfTk9FUlJPUikKKwl7CisJCXBBZC0+QnVsa0luQ29tcGxldGUrKzsKKwkJcEFkLT5OZXh0UnhCdWxrSW5Qb3NpdGlvbiA9IDA7CisJCWlmIChwUnhDb250ZXh0LT5CdWxrSW5PZmZzZXQpCS8vIEFzIGphbidzIGNvbW1lbnQsIGl0IG1heSBidWxrLWluIHN1Y2Nlc3MgYnV0IHNpemUgaXMgemVyby4KKwkJeworCQkJcFJ4Q29udGV4dC0+UmVhZGFibGUgPSBUUlVFOworCQkJSU5DX1JJTkdfSU5ERVgocEFkLT5OZXh0UnhCdWxrSW5JbmRleCwgUlhfUklOR19TSVpFKTsKKwkJfQorCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+QnVsa0luTG9jaywgSXJxRmxhZ3MpOworCX0KKwllbHNlCSAvLyBTVEFUVVNfT1RIRVIKKwl7CisJCXBBZC0+QnVsa0luQ29tcGxldGVGYWlsKys7CisJCS8vIFN0aWxsIHJlYWQgdGhpcyBwYWNrZXQgYWx0aG91Z2ggaXQgbWF5IGNvbXRhaW4gd3JvbmcgYnl0ZXMuCisJCXBSeENvbnRleHQtPlJlYWRhYmxlID0gRkFMU0U7CisJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5CdWxrSW5Mb2NrLCBJcnFGbGFncyk7CisKKwkJLy8gUGFyc2luZyBhbGwgcGFja2V0cy4gYmVjYXVzZSBhZnRlciByZXNldCwgdGhlIGluZGV4IHdpbGwgcmVzZXQgdG8gYWxsIHplcm8uCisJCWlmICgoIVJUTVBfVEVTVF9GTEFHKHBBZCwgKGZSVE1QX0FEQVBURVJfUkVTRVRfSU5fUFJPR1JFU1MgfAorCQkJCQkJCQkJZlJUTVBfQURBUFRFUl9CVUxLSU5fUkVTRVQgfAorCQkJCQkJCQkJZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwKKwkJCQkJCQkJCWZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpKSkKKwkJeworCisJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgiQnVsayBJbiBGYWlsZWQuIFN0YXR1cz0lZCwgQklJZHg9MHgleCwgQklSSWR4PTB4JXgsIGFjdHVhbF9sZW5ndGg9IDB4JXhcbiIsCisJCQkJCQkJU3RhdHVzLCBwQWQtPk5leHRSeEJ1bGtJbkluZGV4LCBwQWQtPk5leHRSeEJ1bGtJblJlYWRJbmRleCwgcFJ4Q29udGV4dC0+cFVyYi0+YWN0dWFsX2xlbmd0aCkpOworCisJCQlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CVUxLSU5fUkVTRVQpOworCQkJUlRVU0JFbnF1ZXVlSW50ZXJuYWxDbWQocEFkLCBDTURUSFJFQURfUkVTRVRfQlVMS19JTiwgTlVMTCwgMCk7CisJCX0KKwl9CisKKwlBU1NFUlQoKHBSeENvbnRleHQtPkluVXNlID09IHBSeENvbnRleHQtPklSUFBlbmRpbmcpKTsKKworI2lmZGVmIFJBTElOS19BVEUKKwlpZiAoQVRFX09OKHBBZCkpCisgICAgeworCQkvLyBJZiB0aGUgZHJpdmVyIGlzIGluIEFURSBtb2RlIGFuZCBSeCBmcmFtZSBpcyBzZXQgaW50byBoZXJlLgorCQlpZiAocEFkLT5Db250aW5CdWxrSW4gPT0gVFJVRSkKKwkJeworCQkJUlRVU0JCdWxrUmVjZWl2ZShwQWQpOworCQl9CisJfQorCWVsc2UKKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisJUlRVU0JCdWxrUmVjZWl2ZShwQWQpOworCisJcmV0dXJuOworCit9CisKKworc3RhdGljIHZvaWQgcnQyODcwX21nbXRfZG1hX2RvbmVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJUFJUTVBfQURBUFRFUiAJcEFkOworCVBUWF9DT05URVhUCQlwTUxNRUNvbnRleHQ7CisJaW50CQkJCWluZGV4OworCVBORElTX1BBQ0tFVAlwUGFja2V0OworCXB1cmJiX3QJCQlwVXJiOworCU5UU1RBVFVTCQlTdGF0dXM7CisJdW5zaWduZWQgbG9uZwlJcnFGbGFnczsKKworCisJcFVyYgkJCT0gKHB1cmJiX3QpZGF0YTsKKwlwTUxNRUNvbnRleHQJPSAoUFRYX0NPTlRFWFQpcFVyYi0+Y29udGV4dDsKKwlwQWQgCQkJPSBwTUxNRUNvbnRleHQtPnBBZDsKKwlTdGF0dXMJCQk9IHBVcmItPnN0YXR1czsKKwlpbmRleCAJCQk9IHBNTE1FQ29udGV4dC0+U2VsZklkeDsKKworCUFTU0VSVCgocEFkLT5NZ210UmluZy5UeERtYUlkeCA9PSBpbmRleCkpOworCisJUlRNUF9JUlFfTE9DSygmcEFkLT5CdWxrT3V0TG9ja1tNR01UUElQRUlEWF0sIElycUZsYWdzKTsKKworCisJaWYgKFN0YXR1cyAhPSBVU0JfU1RfTk9FUlJPUikKKwl7CisJCS8vQnVsay1PdXQgZmFpbCBzdGF0dXMgaGFuZGxlCisJCWlmICgoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUykpICYmCisJCQkoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKSkgJiYKKwkJCSghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSAmJgorCQkJKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlVMS09VVF9SRVNFVCkpKQorCQl7CisJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgiQnVsayBPdXQgTUxNRSBGYWlsZWQsIFN0YXR1cz0lZCFcbiIsIFN0YXR1cykpOworCQkJLy8gVE9ETzogSG93IHRvIGhhbmRsZSBhYm91dCB0aGUgTUxNRUJ1bGtPdXQgZmFpbGVkIGlzc3VlLiBOZWVkIHRvIHJlc2VuZCB0aGUgbWdtdCBwa3Q/CisJCQlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CVUxLT1VUX1JFU0VUKTsKKwkJCXBBZC0+YnVsa1Jlc2V0UGlwZWlkID0gKE1HTVRQSVBFSURYIHwgQlVMS09VVF9NR01UX1JFU0VUX0ZMQUcpOworCQl9CisJfQorCisJcEFkLT5CdWxrT3V0UGVuZGluZ1tNR01UUElQRUlEWF0gPSBGQUxTRTsKKwlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+QnVsa091dExvY2tbTUdNVFBJUEVJRFhdLCBJcnFGbGFncyk7CisKKwlSVE1QX0lSUV9MT0NLKCZwQWQtPk1MTUVCdWxrT3V0TG9jaywgSXJxRmxhZ3MpOworCS8vIFJlc2V0IE1MTUUgY29udGV4dCBmbGFncworCXBNTE1FQ29udGV4dC0+SVJQUGVuZGluZyA9IEZBTFNFOworCXBNTE1FQ29udGV4dC0+SW5Vc2UgPSBGQUxTRTsKKwlwTUxNRUNvbnRleHQtPmJXYWl0aW5nQnVsa091dCA9IEZBTFNFOworCXBNTE1FQ29udGV4dC0+QnVsa091dFNpemUgPSAwOworCisJcFBhY2tldCA9IHBBZC0+TWdtdFJpbmcuQ2VsbFtpbmRleF0ucE5kaXNQYWNrZXQ7CisJcEFkLT5NZ210UmluZy5DZWxsW2luZGV4XS5wTmRpc1BhY2tldCA9IE5VTEw7CisKKwkvLyBJbmNyZWFzZSBNZ210UmluZyBJbmRleAorCUlOQ19SSU5HX0lOREVYKHBBZC0+TWdtdFJpbmcuVHhEbWFJZHgsIE1HTVRfUklOR19TSVpFKTsKKwlwQWQtPk1nbXRSaW5nLlR4U3dGcmVlSWR4Kys7CisJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPk1MTUVCdWxrT3V0TG9jaywgSXJxRmxhZ3MpOworCisJLy8gTm8tbWF0dGVyIHN1Y2Nlc3Mgb3IgZmFpbCwgd2UgZnJlZSB0aGUgbWdtdCBwYWNrZXQuCisJaWYgKHBQYWNrZXQpCisJCVJUTVBGcmVlTmRpc1BhY2tldChwQWQsIHBQYWNrZXQpOworCisJaWYgKChSVE1QX1RFU1RfRkxBRyhwQWQsIChmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTIHwKKwkJCQkJCQkJZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwKKwkJCQkJCQkJZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkpKQorCXsKKwkJLy8gZG8gbm90aGluZyBhbmQgcmV0dXJuIGRpcmVjdGx5LgorCX0KKwllbHNlCisJeworCQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JVTEtPVVRfUkVTRVQpICYmCisJCQkoKHBBZC0+YnVsa1Jlc2V0UGlwZWlkICYgQlVMS09VVF9NR01UX1JFU0VUX0ZMQUcpID09IEJVTEtPVVRfTUdNVF9SRVNFVF9GTEFHKSkKKwkJewkvLyBGb3IgTWdtdCBCdWxrLU91dCBmYWlsZWQsIGlnbm9yZSBpdCBub3cuCisJCQlSVFVTQkVucXVldWVJbnRlcm5hbENtZChwQWQsIENNRFRIUkVBRF9SRVNFVF9CVUxLX09VVCwgTlVMTCwgMCk7CisJCX0KKwkJZWxzZQorCQl7CisKKwkJCS8vIEFsd2F5cyBjYWxsIEJ1bGsgcm91dGluZSwgZXZlbiByZXNldCBidWxrLgorCQkJLy8gVGhlIHByb3RlY3Rpb29uIG9mIHJlc3QgYnVsayBzaG91bGQgYmUgaW4gQnVsa091dCByb3V0aW5lCisJCQlpZiAocEFkLT5NZ210UmluZy5UeFN3RnJlZUlkeCA8IE1HTVRfUklOR19TSVpFIC8qIHBNTE1FQ29udGV4dC0+YldhaXRpbmdCdWxrT3V0ID09IFRSVUUgKi8pCisJCQl7CisJCQkJUlRVU0JfU0VUX0JVTEtfRkxBRyhwQWQsIGZSVFVTQl9CVUxLX09VVF9NTE1FKTsKKwkJCX0KKwkJCQlSVFVTQktpY2tCdWxrT3V0KHBBZCk7CisJCQl9CisJCX0KKworfQorCisKK3N0YXRpYyB2b2lkIHJ0Mjg3MF9oY2NhX2RtYV9kb25lX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKQoreworCVBSVE1QX0FEQVBURVIJCXBBZDsKKwlQSFRfVFhfQ09OVEVYVAkJcEhUVFhDb250ZXh0OworCVVDSEFSCQkJCUJ1bGtPdXRQaXBlSWQgPSA0OworCXB1cmJiX3QJCQkJcFVyYjsKKworCisJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCAoIi0tLT5oY2NhX2RtYV9kb25lX3Rhc2tsZXRcbiIpKTsKKworCisJcFVyYgkJCT0gKHB1cmJiX3QpZGF0YTsKKwlwSFRUWENvbnRleHQJPSAoUEhUX1RYX0NPTlRFWFQpcFVyYi0+Y29udGV4dDsKKwlwQWQJCQkJPSBwSFRUWENvbnRleHQtPnBBZDsKKworCXJ0Mjg3MF9kYXRhb3V0X2NvbXBsZXRlX3Rhc2tsZXQoKHVuc2lnbmVkIGxvbmcpcFVyYik7CisKKwlpZiAoKFJUTVBfVEVTVF9GTEFHKHBBZCwgKGZSVE1QX0FEQVBURVJfUkVTRVRfSU5fUFJPR1JFU1MgfAorCQkJCQkJCQlmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfAorCQkJCQkJCQlmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSkpCisJeworCQkvLyBkbyBub3RoaW5nIGFuZCByZXR1cm4gZGlyZWN0bHkuCisJfQorCWVsc2UKKwl7CisJCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlVMS09VVF9SRVNFVCkpCisJCXsKKwkJCVJUVVNCRW5xdWV1ZUludGVybmFsQ21kKHBBZCwgQ01EVEhSRUFEX1JFU0VUX0JVTEtfT1VULCBOVUxMLCAwKTsKKwkJfQorCQllbHNlCisJCXsJcEhUVFhDb250ZXh0ID0gJnBBZC0+VHhDb250ZXh0W0J1bGtPdXRQaXBlSWRdOworCQkJaWYgKChwQWQtPlR4U3dRdWV1ZVtCdWxrT3V0UGlwZUlkXS5OdW1iZXIgPiAwKSAmJgorCQkJCS8qKChwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gPiAocEhUVFhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uICsgMHg2MDAwKSkgfHwgKHBIVFRYQ29udGV4dC0+TmV4dEJ1bGtPdXRQb3NpdGlvbiA+IHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiArIDB4NjAwMCkpICYmICovCisJCQkJKHBBZC0+RGVRdWV1ZVJ1bm5pbmdbQnVsa091dFBpcGVJZF0gPT0gRkFMU0UpICYmCisJCQkJKHBIVFRYQ29udGV4dC0+YkN1cldyaXRpbmcgPT0gRkFMU0UpKQorCQkJeworCQkJCVJUTVBEZVF1ZXVlUGFja2V0KHBBZCwgRkFMU0UsIEJ1bGtPdXRQaXBlSWQsIE1BWF9UWF9QUk9DRVNTKTsKKwkJCX0KKworCQkJUlRVU0JfU0VUX0JVTEtfRkxBRyhwQWQsIGZSVFVTQl9CVUxLX09VVF9EQVRBX05PUk1BTCk7CisJCQlSVFVTQktpY2tCdWxrT3V0KHBBZCk7CisJCX0KKwl9CisKKwlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgiPC0tLWhjY2FfZG1hX2RvbmVfdGFza2xldFxuIikpOworCisJCXJldHVybjsKK30KKworCitzdGF0aWMgdm9pZCBydDI4NzBfYWMzX2RtYV9kb25lX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKQoreworCVBSVE1QX0FEQVBURVIJCXBBZDsKKwlQSFRfVFhfQ09OVEVYVAkJcEhUVFhDb250ZXh0OworCVVDSEFSCQkJCUJ1bGtPdXRQaXBlSWQgPSAzOworCXB1cmJiX3QJCQkJcFVyYjsKKworCisJcFVyYgkJCT0gKHB1cmJiX3QpZGF0YTsKKwlwSFRUWENvbnRleHQJPSAoUEhUX1RYX0NPTlRFWFQpcFVyYi0+Y29udGV4dDsKKwlwQWQJCQkJPSBwSFRUWENvbnRleHQtPnBBZDsKKworCXJ0Mjg3MF9kYXRhb3V0X2NvbXBsZXRlX3Rhc2tsZXQoKHVuc2lnbmVkIGxvbmcpcFVyYik7CisKKwlpZiAoKFJUTVBfVEVTVF9GTEFHKHBBZCwgKGZSVE1QX0FEQVBURVJfUkVTRVRfSU5fUFJPR1JFU1MgfAorCQkJCQkJCQlmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfAorCQkJCQkJCQlmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSkpCisJeworCQkvLyBkbyBub3RoaW5nIGFuZCByZXR1cm4gZGlyZWN0bHkuCisJfQorCWVsc2UKKwl7CisJCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlVMS09VVF9SRVNFVCkpCisJCXsKKwkJCVJUVVNCRW5xdWV1ZUludGVybmFsQ21kKHBBZCwgQ01EVEhSRUFEX1JFU0VUX0JVTEtfT1VULCBOVUxMLCAwKTsKKwkJfQorCQllbHNlCisJCXsJcEhUVFhDb250ZXh0ID0gJnBBZC0+VHhDb250ZXh0W0J1bGtPdXRQaXBlSWRdOworCQkJaWYgKChwQWQtPlR4U3dRdWV1ZVtCdWxrT3V0UGlwZUlkXS5OdW1iZXIgPiAwKSAmJgorCQkJCS8qKChwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gPiAocEhUVFhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uICsgMHg2MDAwKSkgfHwgKHBIVFRYQ29udGV4dC0+TmV4dEJ1bGtPdXRQb3NpdGlvbiA+IHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiArIDB4NjAwMCkpICYmICovCisJCQkJKHBBZC0+RGVRdWV1ZVJ1bm5pbmdbQnVsa091dFBpcGVJZF0gPT0gRkFMU0UpICYmCisJCQkJKHBIVFRYQ29udGV4dC0+YkN1cldyaXRpbmcgPT0gRkFMU0UpKQorCQkJeworCQkJCVJUTVBEZVF1ZXVlUGFja2V0KHBBZCwgRkFMU0UsIEJ1bGtPdXRQaXBlSWQsIE1BWF9UWF9QUk9DRVNTKTsKKwkJCX0KKworCQkJUlRVU0JfU0VUX0JVTEtfRkxBRyhwQWQsIGZSVFVTQl9CVUxLX09VVF9EQVRBX05PUk1BTDw8Myk7CisJCQlSVFVTQktpY2tCdWxrT3V0KHBBZCk7CisJCX0KKwl9CisKKworCQlyZXR1cm47Cit9CisKKworc3RhdGljIHZvaWQgcnQyODcwX2FjMl9kbWFfZG9uZV90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlQUlRNUF9BREFQVEVSCQlwQWQ7CisJUEhUX1RYX0NPTlRFWFQJCXBIVFRYQ29udGV4dDsKKwlVQ0hBUgkJCQlCdWxrT3V0UGlwZUlkID0gMjsKKwlwdXJiYl90CQkJCXBVcmI7CisKKworCXBVcmIJCQk9IChwdXJiYl90KWRhdGE7CisJcEhUVFhDb250ZXh0CT0gKFBIVF9UWF9DT05URVhUKXBVcmItPmNvbnRleHQ7CisJcEFkCQkJCT0gcEhUVFhDb250ZXh0LT5wQWQ7CisKKwlydDI4NzBfZGF0YW91dF9jb21wbGV0ZV90YXNrbGV0KCh1bnNpZ25lZCBsb25nKXBVcmIpOworCisJaWYgKChSVE1QX1RFU1RfRkxBRyhwQWQsIChmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTIHwKKwkJCQkJCQkJZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwKKwkJCQkJCQkJZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkpKQorCXsKKwkJLy8gZG8gbm90aGluZyBhbmQgcmV0dXJuIGRpcmVjdGx5LgorCX0KKwllbHNlCisJeworCQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JVTEtPVVRfUkVTRVQpKQorCQl7CisJCQlSVFVTQkVucXVldWVJbnRlcm5hbENtZChwQWQsIENNRFRIUkVBRF9SRVNFVF9CVUxLX09VVCwgTlVMTCwgMCk7CisJCX0KKwkJZWxzZQorCQl7CXBIVFRYQ29udGV4dCA9ICZwQWQtPlR4Q29udGV4dFtCdWxrT3V0UGlwZUlkXTsKKwkJCWlmICgocEFkLT5UeFN3UXVldWVbQnVsa091dFBpcGVJZF0uTnVtYmVyID4gMCkgJiYKKwkJCQkvKigocEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uID4gKHBIVFRYQ29udGV4dC0+TmV4dEJ1bGtPdXRQb3NpdGlvbiArIDB4NjAwMCkpIHx8IChwSFRUWENvbnRleHQtPk5leHRCdWxrT3V0UG9zaXRpb24gPiBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gKyAweDYwMDApKSAmJiAqLworCQkJCShwQWQtPkRlUXVldWVSdW5uaW5nW0J1bGtPdXRQaXBlSWRdID09IEZBTFNFKSAmJgorCQkJCShwSFRUWENvbnRleHQtPmJDdXJXcml0aW5nID09IEZBTFNFKSkKKwkJCXsKKwkJCQlSVE1QRGVRdWV1ZVBhY2tldChwQWQsIEZBTFNFLCBCdWxrT3V0UGlwZUlkLCBNQVhfVFhfUFJPQ0VTUyk7CisJCQl9CisKKwkJCVJUVVNCX1NFVF9CVUxLX0ZMQUcocEFkLCBmUlRVU0JfQlVMS19PVVRfREFUQV9OT1JNQUw8PDIpOworCQkJUlRVU0JLaWNrQnVsa091dChwQWQpOworCQl9CisJfQorCisJCXJldHVybjsKK30KKworCitzdGF0aWMgdm9pZCBydDI4NzBfYWMxX2RtYV9kb25lX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKQoreworCVBSVE1QX0FEQVBURVIJCXBBZDsKKwlQSFRfVFhfQ09OVEVYVAkJcEhUVFhDb250ZXh0OworCVVDSEFSCQkJCUJ1bGtPdXRQaXBlSWQgPSAxOworCXB1cmJiX3QJCQkJcFVyYjsKKworCisJcFVyYgkJCT0gKHB1cmJiX3QpZGF0YTsKKwlwSFRUWENvbnRleHQJPSAoUEhUX1RYX0NPTlRFWFQpcFVyYi0+Y29udGV4dDsKKwlwQWQJCQkJPSBwSFRUWENvbnRleHQtPnBBZDsKKworCXJ0Mjg3MF9kYXRhb3V0X2NvbXBsZXRlX3Rhc2tsZXQoKHVuc2lnbmVkIGxvbmcpcFVyYik7CisKKwlpZiAoKFJUTVBfVEVTVF9GTEFHKHBBZCwgKGZSVE1QX0FEQVBURVJfUkVTRVRfSU5fUFJPR1JFU1MgfAorCQkJCQkJCQlmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfAorCQkJCQkJCQlmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSkpCisJeworCQkvLyBkbyBub3RoaW5nIGFuZCByZXR1cm4gZGlyZWN0bHkuCisJfQorCWVsc2UKKwl7CisJCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlVMS09VVF9SRVNFVCkpCisJCXsKKwkJCVJUVVNCRW5xdWV1ZUludGVybmFsQ21kKHBBZCwgQ01EVEhSRUFEX1JFU0VUX0JVTEtfT1VULCBOVUxMLCAwKTsKKwkJfQorCQllbHNlCisJCXsJcEhUVFhDb250ZXh0ID0gJnBBZC0+VHhDb250ZXh0W0J1bGtPdXRQaXBlSWRdOworCQkJaWYgKChwQWQtPlR4U3dRdWV1ZVtCdWxrT3V0UGlwZUlkXS5OdW1iZXIgPiAwKSAmJgorCQkJCS8qKChwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gPiAocEhUVFhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uICsgMHg2MDAwKSkgfHwgKHBIVFRYQ29udGV4dC0+TmV4dEJ1bGtPdXRQb3NpdGlvbiA+IHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiArIDB4NjAwMCkpICYmICovCisJCQkJKHBBZC0+RGVRdWV1ZVJ1bm5pbmdbQnVsa091dFBpcGVJZF0gPT0gRkFMU0UpICYmCisJCQkJKHBIVFRYQ29udGV4dC0+YkN1cldyaXRpbmcgPT0gRkFMU0UpKQorCQkJeworCQkJCVJUTVBEZVF1ZXVlUGFja2V0KHBBZCwgRkFMU0UsIEJ1bGtPdXRQaXBlSWQsIE1BWF9UWF9QUk9DRVNTKTsKKwkJCX0KKworCQkJUlRVU0JfU0VUX0JVTEtfRkxBRyhwQWQsIGZSVFVTQl9CVUxLX09VVF9EQVRBX05PUk1BTDw8MSk7CisJCQlSVFVTQktpY2tCdWxrT3V0KHBBZCk7CisJCX0KKwl9CisKKworCXJldHVybjsKK30KKworCitzdGF0aWMgdm9pZCBydDI4NzBfYWMwX2RtYV9kb25lX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKQoreworCVBSVE1QX0FEQVBURVIJCXBBZDsKKwlQSFRfVFhfQ09OVEVYVAkJcEhUVFhDb250ZXh0OworCVVDSEFSCQkJCUJ1bGtPdXRQaXBlSWQgPSAwOworCXB1cmJiX3QJCQkJcFVyYjsKKworCisJcFVyYgkJCT0gKHB1cmJiX3QpZGF0YTsKKwlwSFRUWENvbnRleHQJPSAoUEhUX1RYX0NPTlRFWFQpcFVyYi0+Y29udGV4dDsKKwlwQWQJCQkJPSBwSFRUWENvbnRleHQtPnBBZDsKKworCXJ0Mjg3MF9kYXRhb3V0X2NvbXBsZXRlX3Rhc2tsZXQoKHVuc2lnbmVkIGxvbmcpcFVyYik7CisKKwlpZiAoKFJUTVBfVEVTVF9GTEFHKHBBZCwgKGZSVE1QX0FEQVBURVJfUkVTRVRfSU5fUFJPR1JFU1MgfAorCQkJCQkJCQlmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfAorCQkJCQkJCQlmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSkpCisJeworCQkvLyBkbyBub3RoaW5nIGFuZCByZXR1cm4gZGlyZWN0bHkuCisJfQorCWVsc2UKKwl7CisJCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlVMS09VVF9SRVNFVCkpCisJCXsKKwkJCVJUVVNCRW5xdWV1ZUludGVybmFsQ21kKHBBZCwgQ01EVEhSRUFEX1JFU0VUX0JVTEtfT1VULCBOVUxMLCAwKTsKKwkJfQorCQllbHNlCisJCXsJcEhUVFhDb250ZXh0ID0gJnBBZC0+VHhDb250ZXh0W0J1bGtPdXRQaXBlSWRdOworCQkJaWYgKChwQWQtPlR4U3dRdWV1ZVtCdWxrT3V0UGlwZUlkXS5OdW1iZXIgPiAwKSAmJgorCQkJCS8qICAoKHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiA+IChwSFRUWENvbnRleHQtPk5leHRCdWxrT3V0UG9zaXRpb24gKyAweDYwMDApKSB8fCAocEhUVFhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uID4gcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uICsgMHg2MDAwKSkgJiYgKi8KKwkJCQkocEFkLT5EZVF1ZXVlUnVubmluZ1tCdWxrT3V0UGlwZUlkXSA9PSBGQUxTRSkgJiYKKwkJCQkocEhUVFhDb250ZXh0LT5iQ3VyV3JpdGluZyA9PSBGQUxTRSkpCisJCQl7CisJCQkJUlRNUERlUXVldWVQYWNrZXQocEFkLCBGQUxTRSwgQnVsa091dFBpcGVJZCwgTUFYX1RYX1BST0NFU1MpOworCQkJfQorCisJCQlSVFVTQl9TRVRfQlVMS19GTEFHKHBBZCwgZlJUVVNCX0JVTEtfT1VUX0RBVEFfTk9STUFMKTsKKwkJCVJUVVNCS2lja0J1bGtPdXQocEFkKTsKKwkJfQorCX0KKworCisJcmV0dXJuOworCit9CisKKworc3RhdGljIHZvaWQgcnQyODcwX251bGxfZnJhbWVfY29tcGxldGVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJUFJUTVBfQURBUFRFUglwQWQ7CisJUFRYX0NPTlRFWFQJCXBOdWxsQ29udGV4dDsKKwlwdXJiYl90CQkJcFVyYjsKKwlOVFNUQVRVUwkJU3RhdHVzOworCXVuc2lnbmVkIGxvbmcJaXJxRmxhZzsKKworCisJcFVyYgkJCT0gKHB1cmJiX3QpZGF0YTsKKwlwTnVsbENvbnRleHQJPSAoUFRYX0NPTlRFWFQpcFVyYi0+Y29udGV4dDsKKwlwQWQgCQkJPSBwTnVsbENvbnRleHQtPnBBZDsKKwlTdGF0dXMgCQkJPSBwVXJiLT5zdGF0dXM7CisKKwkvLyBSZXNldCBOdWxsIGZyYW1lIGNvbnRleHQgZmxhZ3MKKwlSVE1QX0lSUV9MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrWzBdLCBpcnFGbGFnKTsKKwlwTnVsbENvbnRleHQtPklSUFBlbmRpbmcgCT0gRkFMU0U7CisJcE51bGxDb250ZXh0LT5JblVzZSAJCT0gRkFMU0U7CisJcEFkLT5CdWxrT3V0UGVuZGluZ1swXSA9IEZBTFNFOworCXBBZC0+d2F0Y2hEb2dUeFBlbmRpbmdDbnRbMF0gPSAwOworCisJaWYgKFN0YXR1cyA9PSBVU0JfU1RfTk9FUlJPUikKKwl7CisJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5CdWxrT3V0TG9ja1swXSwgaXJxRmxhZyk7CisKKwkJUlRNUERlUXVldWVQYWNrZXQocEFkLCBGQUxTRSwgTlVNX09GX1RYX1JJTkcsIE1BWF9UWF9QUk9DRVNTKTsKKwl9CisJZWxzZQkvLyBTVEFUVVNfT1RIRVIKKwl7CisJCWlmICgoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUykpICYmCisJCQkoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKSkgJiYKKwkJCSghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSAmJgorCQkJKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlVMS09VVF9SRVNFVCkpKQorCQl7CisJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgiQnVsayBPdXQgTnVsbCBGcmFtZSBGYWlsZWQsIFJlYXNvbkNvZGU9JWQhXG4iLCBTdGF0dXMpKTsKKwkJCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JVTEtPVVRfUkVTRVQpOworCQkJcEFkLT5idWxrUmVzZXRQaXBlaWQgPSAoTUdNVFBJUEVJRFggfCBCVUxLT1VUX01HTVRfUkVTRVRfRkxBRyk7CisJCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+QnVsa091dExvY2tbMF0sIGlycUZsYWcpOworCQkJUlRVU0JFbnF1ZXVlSW50ZXJuYWxDbWQocEFkLCBDTURUSFJFQURfUkVTRVRfQlVMS19PVVQsIE5VTEwsIDApOworCQl9CisJCWVsc2UKKwkJeworCQkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrWzBdLCBpcnFGbGFnKTsKKwkJfQorCX0KKworCS8vIEFsd2F5cyBjYWxsIEJ1bGsgcm91dGluZSwgZXZlbiByZXNldCBidWxrLgorCS8vIFRoZSBwcm90ZWN0aW9vbiBvZiByZXN0IGJ1bGsgc2hvdWxkIGJlIGluIEJ1bGtPdXQgcm91dGluZQorCVJUVVNCS2lja0J1bGtPdXQocEFkKTsKKworfQorCisKK3N0YXRpYyB2b2lkIHJ0Mjg3MF9ydHNfZnJhbWVfY29tcGxldGVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJUFJUTVBfQURBUFRFUglwQWQ7CisJUFRYX0NPTlRFWFQJCXBSVFNDb250ZXh0OworCXB1cmJiX3QJCQlwVXJiOworCU5UU1RBVFVTCQlTdGF0dXM7CisJdW5zaWduZWQgbG9uZwlpcnFGbGFnOworCisKKwlwVXJiCQk9IChwdXJiYl90KWRhdGE7CisJcFJUU0NvbnRleHQJPSAoUFRYX0NPTlRFWFQpcFVyYi0+Y29udGV4dDsKKwlwQWQJCQk9IHBSVFNDb250ZXh0LT5wQWQ7CisJU3RhdHVzCQk9IHBVcmItPnN0YXR1czsKKworCS8vIFJlc2V0IFJUUyBmcmFtZSBjb250ZXh0IGZsYWdzCisJUlRNUF9JUlFfTE9DSygmcEFkLT5CdWxrT3V0TG9ja1swXSwgaXJxRmxhZyk7CisJcFJUU0NvbnRleHQtPklSUFBlbmRpbmcgPSBGQUxTRTsKKwlwUlRTQ29udGV4dC0+SW5Vc2UJCT0gRkFMU0U7CisKKwlpZiAoU3RhdHVzID09IFVTQl9TVF9OT0VSUk9SKQorCXsKKwkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrWzBdLCBpcnFGbGFnKTsKKwkJUlRNUERlUXVldWVQYWNrZXQocEFkLCBGQUxTRSwgTlVNX09GX1RYX1JJTkcsIE1BWF9UWF9QUk9DRVNTKTsKKwl9CisJZWxzZQkvLyBTVEFUVVNfT1RIRVIKKwl7CisJCWlmICgoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUykpICYmCisJCQkoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKSkgJiYKKwkJCSghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSAmJgorCQkJKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlVMS09VVF9SRVNFVCkpKQorCQl7CisJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgiQnVsayBPdXQgUlRTIEZyYW1lIEZhaWxlZFxuIikpOworCQkJUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlVMS09VVF9SRVNFVCk7CisJCQlwQWQtPmJ1bGtSZXNldFBpcGVpZCA9IChNR01UUElQRUlEWCB8IEJVTEtPVVRfTUdNVF9SRVNFVF9GTEFHKTsKKwkJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5CdWxrT3V0TG9ja1swXSwgaXJxRmxhZyk7CisJCQlSVFVTQkVucXVldWVJbnRlcm5hbENtZChwQWQsIENNRFRIUkVBRF9SRVNFVF9CVUxLX09VVCwgTlVMTCwgMCk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+QnVsa091dExvY2tbMF0sIGlycUZsYWcpOworCQl9CisJfQorCisJUlRNUF9TRU1fTE9DSygmcEFkLT5CdWxrT3V0TG9ja1twUlRTQ29udGV4dC0+QnVsa091dFBpcGVJZF0pOworCXBBZC0+QnVsa091dFBlbmRpbmdbcFJUU0NvbnRleHQtPkJ1bGtPdXRQaXBlSWRdID0gRkFMU0U7CisJUlRNUF9TRU1fVU5MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrW3BSVFNDb250ZXh0LT5CdWxrT3V0UGlwZUlkXSk7CisKKwkvLyBBbHdheXMgY2FsbCBCdWxrIHJvdXRpbmUsIGV2ZW4gcmVzZXQgYnVsay4KKwkvLyBUaGUgcHJvdGVjdGlvb24gb2YgcmVzdCBidWxrIHNob3VsZCBiZSBpbiBCdWxrT3V0IHJvdXRpbmUKKwlSVFVTQktpY2tCdWxrT3V0KHBBZCk7CisKK30KKworCitzdGF0aWMgdm9pZCBydDI4NzBfcHNwb2xsX2ZyYW1lX2NvbXBsZXRlX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKQoreworCVBSVE1QX0FEQVBURVIJcEFkOworCVBUWF9DT05URVhUCQlwUHNQb2xsQ29udGV4dDsKKwlwdXJiYl90CQkJcFVyYjsKKwlOVFNUQVRVUwkJU3RhdHVzOworCisKKwlwVXJiCQkJPSAocHVyYmJfdClkYXRhOworCXBQc1BvbGxDb250ZXh0CT0gKFBUWF9DT05URVhUKXBVcmItPmNvbnRleHQ7CisJcEFkCQkJCT0gcFBzUG9sbENvbnRleHQtPnBBZDsKKwlTdGF0dXMJCQk9IHBVcmItPnN0YXR1czsKKworCS8vIFJlc2V0IFBzUG9sbCBjb250ZXh0IGZsYWdzCisJcFBzUG9sbENvbnRleHQtPklSUFBlbmRpbmcJPSBGQUxTRTsKKwlwUHNQb2xsQ29udGV4dC0+SW5Vc2UJCT0gRkFMU0U7CisJcEFkLT53YXRjaERvZ1R4UGVuZGluZ0NudFswXSA9IDA7CisKKwlpZiAoU3RhdHVzID09IFVTQl9TVF9OT0VSUk9SKQorCXsKKwkJUlRNUERlUXVldWVQYWNrZXQocEFkLCBGQUxTRSwgTlVNX09GX1RYX1JJTkcsIE1BWF9UWF9QUk9DRVNTKTsKKwl9CisJZWxzZSAvLyBTVEFUVVNfT1RIRVIKKwl7CisJCWlmICgoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUykpICYmCisJCQkoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKSkgJiYKKwkJCSghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSAmJgorCQkJKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlVMS09VVF9SRVNFVCkpKQorCQl7CisJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgiQnVsayBPdXQgUFNQb2xsIEZhaWxlZFxuIikpOworCQkJUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlVMS09VVF9SRVNFVCk7CisJCQlwQWQtPmJ1bGtSZXNldFBpcGVpZCA9IChNR01UUElQRUlEWCB8IEJVTEtPVVRfTUdNVF9SRVNFVF9GTEFHKTsKKwkJCVJUVVNCRW5xdWV1ZUludGVybmFsQ21kKHBBZCwgQ01EVEhSRUFEX1JFU0VUX0JVTEtfT1VULCBOVUxMLCAwKTsKKwkJfQorCX0KKworCVJUTVBfU0VNX0xPQ0soJnBBZC0+QnVsa091dExvY2tbMF0pOworCXBBZC0+QnVsa091dFBlbmRpbmdbMF0gPSBGQUxTRTsKKwlSVE1QX1NFTV9VTkxPQ0soJnBBZC0+QnVsa091dExvY2tbMF0pOworCisJLy8gQWx3YXlzIGNhbGwgQnVsayByb3V0aW5lLCBldmVuIHJlc2V0IGJ1bGsuCisJLy8gVGhlIHByb3RlY3Rpb29uIG9mIHJlc3QgYnVsayBzaG91bGQgYmUgaW4gQnVsa091dCByb3V0aW5lCisJUlRVU0JLaWNrQnVsa091dChwQWQpOworCit9CisKKworc3RhdGljIHZvaWQgcnQyODcwX2RhdGFvdXRfY29tcGxldGVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJUFJUTVBfQURBUFRFUgkJcEFkOworCXB1cmJiX3QJCQkJcFVyYjsKKwlQT1NfQ09PS0lFCQkJcE9iajsKKwlQSFRfVFhfQ09OVEVYVAkJcEhUVFhDb250ZXh0OworCVVDSEFSCQkJCUJ1bGtPdXRQaXBlSWQ7CisJTlRTVEFUVVMJCQlTdGF0dXM7CisJdW5zaWduZWQgbG9uZwkJSXJxRmxhZ3M7CisKKworCXBVcmIJCQk9IChwdXJiYl90KWRhdGE7CisJcEhUVFhDb250ZXh0CT0gKFBIVF9UWF9DT05URVhUKXBVcmItPmNvbnRleHQ7CisJcEFkCQkJCT0gcEhUVFhDb250ZXh0LT5wQWQ7CisJcE9iaiAJCQk9IChQT1NfQ09PS0lFKSBwQWQtPk9TX0Nvb2tpZTsKKwlTdGF0dXMJCQk9IHBVcmItPnN0YXR1czsKKworCS8vIFN0b3JlIEJ1bGtPdXQgUGlwZUlkCisJQnVsa091dFBpcGVJZCA9IHBIVFRYQ29udGV4dC0+QnVsa091dFBpcGVJZDsKKwlwQWQtPkJ1bGtPdXREYXRhT25lU2VjQ291bnQrKzsKKworCS8vREJHUFJJTlQoUlRfREVCVUdfTE9VRCwgKCJEb25lLUIoJWQpOkk9MHglbHgsIENXUG9zPSVsZCwgTkJQb3M9JWxkLCBFTkJQb3M9JWxkLCBiQ29weT0lZCFcbiIsIEJ1bGtPdXRQaXBlSWQsIGluX2ludGVycnVwdCgpLCBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24sCisJLy8JCXBIVFRYQ29udGV4dC0+TmV4dEJ1bGtPdXRQb3NpdGlvbiwgcEhUVFhDb250ZXh0LT5FTmV4dEJ1bGtPdXRQb3NpdGlvbiwgcEhUVFhDb250ZXh0LT5iQ29weVNhdmVQYWQpKTsKKworCVJUTVBfSVJRX0xPQ0soJnBBZC0+QnVsa091dExvY2tbQnVsa091dFBpcGVJZF0sIElycUZsYWdzKTsKKwlwQWQtPkJ1bGtPdXRQZW5kaW5nW0J1bGtPdXRQaXBlSWRdID0gRkFMU0U7CisJcEhUVFhDb250ZXh0LT5JUlBQZW5kaW5nID0gRkFMU0U7CisJcEFkLT53YXRjaERvZ1R4UGVuZGluZ0NudFtCdWxrT3V0UGlwZUlkXSA9IDA7CisKKwlpZiAoU3RhdHVzID09IFVTQl9TVF9OT0VSUk9SKQorCXsKKwkJcEFkLT5CdWxrT3V0Q29tcGxldGUrKzsKKworCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+QnVsa091dExvY2tbQnVsa091dFBpcGVJZF0sIElycUZsYWdzKTsKKworCQlwQWQtPkNvdW50ZXJzODAyMy5Hb29kVHJhbnNtaXRzKys7CisJCS8vUlRNUF9JUlFfTE9DSygmcEFkLT5UeENvbnRleHRRdWV1ZUxvY2tbQnVsa091dFBpcGVJZF0sIElycUZsYWdzKTsKKwkJRlJFRV9IVFRYX1JJTkcocEFkLCBCdWxrT3V0UGlwZUlkLCBwSFRUWENvbnRleHQpOworCQkvL1JUTVBfSVJRX1VOTE9DSygmcEFkLT5UeENvbnRleHRRdWV1ZUxvY2tbQnVsa091dFBpcGVJZF0sIElycUZsYWdzKTsKKworCisJfQorCWVsc2UJLy8gU1RBVFVTX09USEVSCisJeworCQlQVUNIQVIJcEJ1ZjsKKworCQlwQWQtPkJ1bGtPdXRDb21wbGV0ZU90aGVyKys7CisKKwkJcEJ1ZiA9ICZwSFRUWENvbnRleHQtPlRyYW5zZmVyQnVmZmVyLT5maWVsZC5XaXJlbGVzc1BhY2tldFtwSFRUWENvbnRleHQtPk5leHRCdWxrT3V0UG9zaXRpb25dOworCisJCWlmICghUlRNUF9URVNUX0ZMQUcocEFkLCAoZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUyB8CisJCQkJCQkJCQlmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfAorCQkJCQkJCQkJZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUIHwKKwkJCQkJCQkJCWZSVE1QX0FEQVBURVJfQlVMS09VVF9SRVNFVCkpKQorCQl7CisJCQlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CVUxLT1VUX1JFU0VUKTsKKwkJCXBBZC0+YnVsa1Jlc2V0UGlwZWlkID0gQnVsa091dFBpcGVJZDsKKwkJCXBBZC0+YnVsa1Jlc2V0UmVxW0J1bGtPdXRQaXBlSWRdID0gcEFkLT5CdWxrT3V0UmVxOworCQl9CisJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5CdWxrT3V0TG9ja1tCdWxrT3V0UGlwZUlkXSwgSXJxRmxhZ3MpOworCisJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwgKCJCdWxrT3V0RGF0YVBhY2tldCBmYWlsZWQ6IFJlYXNvbkNvZGU9JWQhXG4iLCBTdGF0dXMpKTsKKwkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCAoIlx0Pj5CdWxrT3V0IFJlcT0weCVseCwgQ29tcGxldGU9MHglbHgsIE90aGVyPTB4JWx4XG4iLCBwQWQtPkJ1bGtPdXRSZXEsIHBBZC0+QnVsa091dENvbXBsZXRlLCBwQWQtPkJ1bGtPdXRDb21wbGV0ZU90aGVyKSk7CisJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwgKCJcdD4+QnVsa091dCBIZWFkZXI6JXggJXggJXggJXggJXggJXggJXggJXhcbiIsIHBCdWZbMF0sIHBCdWZbMV0sIHBCdWZbMl0sIHBCdWZbM10sIHBCdWZbNF0sIHBCdWZbNV0sIHBCdWZbNl0sIHBCdWZbN10pKTsKKwkJLy9EQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgiPj5CdWxrT3V0Q29tcGxldGVDYW5jZWw9MHgleCwgQnVsa091dENvbXBsZXRlT3RoZXI9MHgleFxuIiwgcEFkLT5CdWxrT3V0Q29tcGxldGVDYW5jZWwsIHBBZC0+QnVsa091dENvbXBsZXRlT3RoZXIpKTsKKworCX0KKworCS8vCisJLy8gYkluVXNlID0gVFJVRSwgbWVhbnMgc29tZSBwcm9jZXNzIGFyZSBmaWxsaW5nIFRYIGRhdGEsIGFmdGVyIHRoYXQgbXVzdCB0dXJuIG9uIGJXYWl0aW5nQnVsa091dAorCS8vIGJXYWl0aW5nQnVsa091dCA9IFRSVUUsIG1lYW5zIHRoZSBUWCBkYXRhIGFyZSB3YWl0aW5nIGZvciBidWxrIG91dC4KKwkvLworCS8vUlRNUF9JUlFfTE9DSygmcEFkLT5UeENvbnRleHRRdWV1ZUxvY2tbQnVsa091dFBpcGVJZF0sIElycUZsYWdzKTsKKwlpZiAoKHBIVFRYQ29udGV4dC0+RU5leHRCdWxrT3V0UG9zaXRpb24gIT0gcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uKSAmJgorCQkocEhUVFhDb250ZXh0LT5FTmV4dEJ1bGtPdXRQb3NpdGlvbiAhPSAocEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uKzgpKSAmJgorCQkhUlRVU0JfVEVTVF9CVUxLX0ZMQUcocEFkLCAoZlJUVVNCX0JVTEtfT1VUX0RBVEFfRlJBRyA8PCBCdWxrT3V0UGlwZUlkKSkpCisJeworCQkvLyBJbmRpY2F0ZSBUaGVyZSBpcyBkYXRhIGF2YWxpYWJsZQorCQlSVFVTQl9TRVRfQlVMS19GTEFHKHBBZCwgKGZSVFVTQl9CVUxLX09VVF9EQVRBX05PUk1BTCA8PCBCdWxrT3V0UGlwZUlkKSk7CisJfQorCS8vUlRNUF9JUlFfVU5MT0NLKCZwQWQtPlR4Q29udGV4dFF1ZXVlTG9ja1tCdWxrT3V0UGlwZUlkXSwgSXJxRmxhZ3MpOworCisJLy8gQWx3YXlzIGNhbGwgQnVsayByb3V0aW5lLCBldmVuIHJlc2V0IGJ1bGsuCisJLy8gVGhlIHByb3RlY3Rpb24gb2YgcmVzdCBidWxrIHNob3VsZCBiZSBpbiBCdWxrT3V0IHJvdXRpbmUKKwlSVFVTQktpY2tCdWxrT3V0KHBBZCk7Cit9CisKKy8qIEVuZCBvZiAyODcwX3J0bXBfaW5pdC5jICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9hY3Rpb24uYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL2FjdGlvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhNDhhN2YKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9hY3Rpb24uYwpAQCAtMCwwICsxLDEwNDYgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgTW9kdWxlIE5hbWU6CisJYWN0aW9uLmMKKworICAgIEFic3RyYWN0OgorICAgIEhhbmRsZSBhc3NvY2lhdGlvbiByZWxhdGVkIHJlcXVlc3RzIGVpdGhlciBmcm9tIFdTVEEgb3IgZnJvbSBsb2NhbCBNTE1FCisKKyAgICBSZXZpc2lvbiBIaXN0b3J5OgorICAgIFdobyAgICAgICAgIFdoZW4gICAgICAgICAgV2hhdAorICAgIC0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCUphbiBMZWUJCTIwMDYJICAJY3JlYXRlZCBmb3IgcnQyODYwCisgKi8KKworI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgorI2luY2x1ZGUgImFjdGlvbi5oIgorCisKK3N0YXRpYyBWT0lEIFJlc2VydmVkQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgYXNzb2NpYXRpb24gc3RhdGUgbWFjaGluZSBpbml0LCBpbmNsdWRpbmcgc3RhdGUgdHJhbnNpdGlvbiBhbmQgdGltZXIgaW5pdAorICAgIFBhcmFtZXRlcnM6CisgICAgICAgIFMgLSBwb2ludGVyIHRvIHRoZSBhc3NvY2lhdGlvbiBzdGF0ZSBtYWNoaW5lCisgICAgTm90ZToKKyAgICAgICAgVGhlIHN0YXRlIG1hY2hpbmUgbG9va3MgbGlrZSB0aGUgZm9sbG93aW5nCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTU09DX0lETEUKKyAgICAgICAgTVQyX01MTUVfRElTQVNTT0NfUkVRICAgIG1sbWVfZGlzYXNzb2NfcmVxX2FjdGlvbgorICAgICAgICBNVDJfUEVFUl9ESVNBU1NPQ19SRVEgICAgcGVlcl9kaXNhc3NvY19hY3Rpb24KKyAgICAgICAgTVQyX1BFRVJfQVNTT0NfUkVRICAgICAgIGRyb3AKKyAgICAgICAgTVQyX1BFRVJfUkVBU1NPQ19SRVEgICAgIGRyb3AKKyAgICAgICAgTVQyX0NMUzNFUlIgICAgICAgICAgICAgIGNsczNlcnJfYWN0aW9uCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBBY3Rpb25TdGF0ZU1hY2hpbmVJbml0KAorICAgIElOCVBSVE1QX0FEQVBURVIJcEFkLAorICAgIElOICBTVEFURV9NQUNISU5FICpTLAorICAgIE9VVCBTVEFURV9NQUNISU5FX0ZVTkMgVHJhbnNbXSkKK3sKKwlTdGF0ZU1hY2hpbmVJbml0KFMsIChTVEFURV9NQUNISU5FX0ZVTkMgKilUcmFucywgTUFYX0FDVF9TVEFURSwgTUFYX0FDVF9NU0csIChTVEFURV9NQUNISU5FX0ZVTkMpRHJvcCwgQUNUX0lETEUsIEFDVF9NQUNISU5FX0JBU0UpOworCisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFDVF9JRExFLCBNVDJfUEVFUl9TUEVDVFJVTV9DQVRFLCAoU1RBVEVfTUFDSElORV9GVU5DKVBlZXJTcGVjdHJ1bUFjdGlvbik7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFDVF9JRExFLCBNVDJfUEVFUl9RT1NfQ0FURSwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyUU9TQWN0aW9uKTsKKworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBQ1RfSURMRSwgTVQyX1BFRVJfRExTX0NBVEUsIChTVEFURV9NQUNISU5FX0ZVTkMpUmVzZXJ2ZWRBY3Rpb24pOworI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCQlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQUNUX0lETEUsIE1UMl9QRUVSX0RMU19DQVRFLCAoU1RBVEVfTUFDSElORV9GVU5DKVBlZXJETFNBY3Rpb24pOworI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFDVF9JRExFLCBNVDJfUEVFUl9CQV9DQVRFLCAoU1RBVEVfTUFDSElORV9GVU5DKVBlZXJCQUFjdGlvbik7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFDVF9JRExFLCBNVDJfUEVFUl9IVF9DQVRFLCAoU1RBVEVfTUFDSElORV9GVU5DKVBlZXJIVEFjdGlvbik7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFDVF9JRExFLCBNVDJfTUxNRV9BRERfQkFfQ0FURSwgKFNUQVRFX01BQ0hJTkVfRlVOQylNbG1lQUREQkFBY3Rpb24pOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBQ1RfSURMRSwgTVQyX01MTUVfT1JJX0RFTEJBX0NBVEUsIChTVEFURV9NQUNISU5FX0ZVTkMpTWxtZURFTEJBQWN0aW9uKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQUNUX0lETEUsIE1UMl9NTE1FX1JFQ19ERUxCQV9DQVRFLCAoU1RBVEVfTUFDSElORV9GVU5DKU1sbWVERUxCQUFjdGlvbik7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQUNUX0lETEUsIE1UMl9QRUVSX1BVQkxJQ19DQVRFLCAoU1RBVEVfTUFDSElORV9GVU5DKVBlZXJQdWJsaWNBY3Rpb24pOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBQ1RfSURMRSwgTVQyX1BFRVJfUk1fQ0FURSwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyUk1BY3Rpb24pOworCisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFDVF9JRExFLCBNVDJfTUxNRV9RT1NfQ0FURSwgKFNUQVRFX01BQ0hJTkVfRlVOQylNbG1lUU9TQWN0aW9uKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQUNUX0lETEUsIE1UMl9NTE1FX0RMU19DQVRFLCAoU1RBVEVfTUFDSElORV9GVU5DKU1sbWVETFNBY3Rpb24pOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBQ1RfSURMRSwgTVQyX0FDVF9JTlZBTElELCAoU1RBVEVfTUFDSElORV9GVU5DKU1sbWVJbnZhbGlkQWN0aW9uKTsKK30KKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorVk9JRCBNbG1lQUREQkFBY3Rpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQorCit7CisJTUxNRV9BRERCQV9SRVFfU1RSVUNUICpwSW5mbzsKKwlVQ0hBUiAgICAgICAgICAgQWRkcls2XTsKKwlQVUNIQVIgICAgICAgICBwT3V0QnVmZmVyID0gTlVMTDsKKwlORElTX1NUQVRVUyAgICAgTlN0YXR1czsKKwlVTE9ORwkJSWR4OworCUZSQU1FX0FEREJBX1JFUSAgRnJhbWU7CisJVUxPTkcJCUZyYW1lTGVuOworCUJBX09SSV9FTlRSWQkJCSpwQkFFbnRyeSA9IE5VTEw7CisKKwlwSW5mbyA9IChNTE1FX0FEREJBX1JFUV9TVFJVQ1QgKilFbGVtLT5Nc2c7CisJTmRpc1plcm9NZW1vcnkoJkZyYW1lLCBzaXplb2YoRlJBTUVfQUREQkFfUkVRKSk7CisKKwlpZihNbG1lQWRkQkFSZXFTYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbiwgQWRkcikpCisJeworCQlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOyAgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQorCQlpZihOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJCXsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQkEgLSBNbG1lQUREQkFBY3Rpb24oKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkIFxuIikpOworCQkJcmV0dXJuOworCQl9CisJCS8vIDEuIGZpbmQgZW50cnkKKwkJSWR4ID0gcEFkLT5NYWNUYWIuQ29udGVudFtwSW5mby0+V2NpZF0uQkFPcmlXY2lkQXJyYXlbcEluZm8tPlRJRF07CisJCWlmIChJZHggPT0gMCkKKwkJeworCQkJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiQkEgLSBNbG1lQUREQkFBY3Rpb24oKSBjYW4ndCBmaW5kIEJBT3JpRW50cnkgXG4iKSk7CisJCQlyZXR1cm47CisJCX0KKwkJZWxzZQorCQl7CisJCQlwQkFFbnRyeSA9JnBBZC0+QkFUYWJsZS5CQU9yaUVudHJ5W0lkeF07CisJCX0KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQl7CisJCQlpZiAoQURIT0NfT04ocEFkKSkKKwkJCQlBY3RIZWFkZXJJbml0KHBBZCwgJkZyYW1lLkhkciwgcEluZm8tPnBBZGRyLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisJCQllbHNlCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJCQlpZiAocEFkLT5NYWNUYWIuQ29udGVudFtwSW5mby0+V2NpZF0uVmFsaWRBc0RscykKKwkJCQlBY3RIZWFkZXJJbml0KHBBZCwgJkZyYW1lLkhkciwgcEluZm8tPnBBZGRyLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisJCQllbHNlCisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisJCQkJQWN0SGVhZGVySW5pdChwQWQsICZGcmFtZS5IZHIsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBwSW5mby0+cEFkZHIpOworCisJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCQlGcmFtZS5DYXRlZ29yeSA9IENBVEVHT1JZX0JBOworCQlGcmFtZS5BY3Rpb24gPSBBRERCQV9SRVE7CisJCUZyYW1lLkJhUGFybS5BTVNEVVN1cHBvcnRlZCA9IDA7CisJCUZyYW1lLkJhUGFybS5CQVBvbGljeSA9IElNTUVEX0JBOworCQlGcmFtZS5CYVBhcm0uVElEID0gcEluZm8tPlRJRDsKKwkJRnJhbWUuQmFQYXJtLkJ1ZlNpemUgPSBwSW5mby0+QmFCdWZTaXplOworCQlGcmFtZS5Ub2tlbiA9IHBJbmZvLT5Ub2tlbjsKKwkJRnJhbWUuVGltZU91dFZhbHVlID0gcEluZm8tPlRpbWVPdXRWYWx1ZTsKKwkJRnJhbWUuQmFTdGFydFNlcS5maWVsZC5GcmFnTnVtID0gMDsKKwkJRnJhbWUuQmFTdGFydFNlcS5maWVsZC5TdGFydFNlcSA9IHBBZC0+TWFjVGFiLkNvbnRlbnRbcEluZm8tPldjaWRdLlR4U2VxW3BJbmZvLT5USURdOworCisJCSooVVNIT1JUICopKCZGcmFtZS5CYVBhcm0pID0gY3B1MmxlMTYoKihVU0hPUlQgKikoJkZyYW1lLkJhUGFybSkpOworCQlGcmFtZS5UaW1lT3V0VmFsdWUgPSBjcHUybGUxNihGcmFtZS5UaW1lT3V0VmFsdWUpOworCQlGcmFtZS5CYVN0YXJ0U2VxLndvcmQgPSBjcHUybGUxNihGcmFtZS5CYVN0YXJ0U2VxLndvcmQpOworCisJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsCQkgICAmRnJhbWVMZW4sCisJCSAgICAgICAgICAgICAgc2l6ZW9mKEZSQU1FX0FEREJBX1JFUSksICZGcmFtZSwKKwkJICAgICAgICAgICAgICBFTkRfT0ZfQVJHUyk7CisJCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgUUlEX0FDX0JFLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7CisJCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7CisKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQkEgLSBTZW5kIEFEREJBIHJlcXVlc3QuIFN0YXJ0U2VxID0gJXgsICBGcmFtZUxlbiA9ICVsZC4gQnVmU2l6ZSA9ICVkXG4iLCBGcmFtZS5CYVN0YXJ0U2VxLmZpZWxkLlN0YXJ0U2VxLCBGcmFtZUxlbiwgRnJhbWUuQmFQYXJtLkJ1ZlNpemUpKTsKKyAgICB9Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgc2VuZCBERUxCQSBhbmQgZGVsZXRlIEJhRW50cnkgaWYgYW55CisgICAgUGFyYW1ldHJzOgorICAgICAgICBFbGVtIC0gTUxNRSBtZXNzYWdlIE1MTUVfREVMQkFfUkVRX1NUUlVDVAorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIE1sbWVERUxCQUFjdGlvbigKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisJTUxNRV9ERUxCQV9SRVFfU1RSVUNUICpwSW5mbzsKKwlQVUNIQVIgICAgICAgICBwT3V0QnVmZmVyID0gTlVMTDsKKwlQVUNIQVIJCSAgIHBPdXRCdWZmZXIyID0gTlVMTDsKKwlORElTX1NUQVRVUyAgICAgTlN0YXR1czsKKwlVTE9ORwkJSWR4OworCUZSQU1FX0RFTEJBX1JFUSAgRnJhbWU7CisJVUxPTkcJCUZyYW1lTGVuOworCUZSQU1FX0JBUglGcmFtZUJhcjsKKworCXBJbmZvID0gKE1MTUVfREVMQkFfUkVRX1NUUlVDVCAqKUVsZW0tPk1zZzsKKwkvLyBtdXN0IHNlbmQgYmFjayBERUxCQQorCU5kaXNaZXJvTWVtb3J5KCZGcmFtZSwgc2l6ZW9mKEZSQU1FX0RFTEJBX1JFUSkpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PiBNbG1lREVMQkFBY3Rpb24oKSwgSW5pdGlhdG9yKCVkKSBcbiIsIHBJbmZvLT5Jbml0aWF0b3IpKTsKKworCWlmKE1sbWVEZWxCQVJlcVNhbml0eShwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuKSkKKwl7CisJCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5CisJCWlmKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJeworCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJCQSAtIE1sbWVERUxCQUFjdGlvbigpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWQgMS4gXG4iKSk7CisJCQlyZXR1cm47CisJCX0KKworCQlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKKwkJaWYoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCQl7CisJCQlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOworCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiQkEgLSBNbG1lREVMQkFBY3Rpb24oKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkIDIuIFxuIikpOworCQkJcmV0dXJuOworCQl9CisKKwkJLy8gU0VORCBCQVIgKFNlbmQgQkFSIHRvIHJlZnJlc2ggcGVlciByZW9yZGVyaW5nIGJ1ZmZlci4pCisJCUlkeCA9IHBBZC0+TWFjVGFiLkNvbnRlbnRbcEluZm8tPldjaWRdLkJBT3JpV2NpZEFycmF5W3BJbmZvLT5USURdOworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCQlCYXJIZWFkZXJJbml0KHBBZCwgJkZyYW1lQmFyLCBwQWQtPk1hY1RhYi5Db250ZW50W3BJbmZvLT5XY2lkXS5BZGRyLCBwQWQtPkN1cnJlbnRBZGRyZXNzKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCQlGcmFtZUJhci5TdGFydGluZ1NlcS5maWVsZC5GcmFnTnVtID0gMDsgLy8gbWFrZSBzdXJlIHNlcXVlbmNlIG5vdCBjbGVhciBpbiBERUwgZnVuY2l0b24uCisJCUZyYW1lQmFyLlN0YXJ0aW5nU2VxLmZpZWxkLlN0YXJ0U2VxID0gcEFkLT5NYWNUYWIuQ29udGVudFtwSW5mby0+V2NpZF0uVHhTZXFbcEluZm8tPlRJRF07IC8vIG1ha2Ugc3VyZSBzZXF1ZW5jZSBub3QgY2xlYXIgaW4gREVMIGZ1bmNpdG9uLgorCQlGcmFtZUJhci5CYXJDb250cm9sLlRJRCA9IHBJbmZvLT5USUQ7IC8vIG1ha2Ugc3VyZSBzZXF1ZW5jZSBub3QgY2xlYXIgaW4gREVMIGZ1bmNpdG9uLgorCQlGcmFtZUJhci5CYXJDb250cm9sLkFDS1BvbGljeSA9IElNTUVEX0JBOyAvLyBtYWtlIHN1cmUgc2VxdWVuY2Ugbm90IGNsZWFyIGluIERFTCBmdW5jaXRvbi4KKwkJRnJhbWVCYXIuQmFyQ29udHJvbC5Db21wcmVzc2VkID0gMTsgLy8gbWFrZSBzdXJlIHNlcXVlbmNlIG5vdCBjbGVhciBpbiBERUwgZnVuY2l0b24uCisJCUZyYW1lQmFyLkJhckNvbnRyb2wuTVRJRCA9IDA7IC8vIG1ha2Ugc3VyZSBzZXF1ZW5jZSBub3QgY2xlYXIgaW4gREVMIGZ1bmNpdG9uLgorCisJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIyLAkJCQkmRnJhbWVMZW4sCisJCQkJCSAgc2l6ZW9mKEZSQU1FX0JBUiksCSAgJkZyYW1lQmFyLAorCQkJCQkgIEVORF9PRl9BUkdTKTsKKwkJTWluaXBvcnRNTVJlcXVlc3QocEFkLCBRSURfQUNfQkUsIHBPdXRCdWZmZXIyLCBGcmFtZUxlbik7CisJCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcjIpOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkJBIC0gTWxtZURFTEJBQWN0aW9uKCkgLiBTZW5kIEJBUiB0byByZWZyZXNoIHBlZXIgcmVvcmRlcmluZyBidWZmZXIgXG4iKSk7CisKKwkJLy8gU0VORCBERUxCQSBGUkFNRQorCQlGcmFtZUxlbiA9IDA7CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCXsKKwkJCWlmIChBREhPQ19PTihwQWQpKQorCQkJCUFjdEhlYWRlckluaXQocEFkLCAmRnJhbWUuSGRyLCBwQWQtPk1hY1RhYi5Db250ZW50W3BJbmZvLT5XY2lkXS5BZGRyLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisJCQllbHNlCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJCQlpZiAocEFkLT5NYWNUYWIuQ29udGVudFtwSW5mby0+V2NpZF0uVmFsaWRBc0RscykKKwkJCQlBY3RIZWFkZXJJbml0KHBBZCwgJkZyYW1lLkhkciwgcEFkLT5NYWNUYWIuQ29udGVudFtwSW5mby0+V2NpZF0uQWRkciwgcEFkLT5DdXJyZW50QWRkcmVzcywgcEFkLT5Db21tb25DZmcuQnNzaWQpOworCQkJZWxzZQorI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCQkJCUFjdEhlYWRlckluaXQocEFkLCAmRnJhbWUuSGRyLCAgcEFkLT5Db21tb25DZmcuQnNzaWQsIHBBZC0+Q3VycmVudEFkZHJlc3MsIHBBZC0+TWFjVGFiLkNvbnRlbnRbcEluZm8tPldjaWRdLkFkZHIpOworCQl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJCUZyYW1lLkNhdGVnb3J5ID0gQ0FURUdPUllfQkE7CisJCUZyYW1lLkFjdGlvbiA9IERFTEJBOworCQlGcmFtZS5EZWxiYVBhcm0uSW5pdGlhdG9yID0gcEluZm8tPkluaXRpYXRvcjsKKwkJRnJhbWUuRGVsYmFQYXJtLlRJRCA9IHBJbmZvLT5USUQ7CisJCUZyYW1lLlJlYXNvbkNvZGUgPSAzOTsgLy8gVGltZSBPdXQKKwkJKihVU0hPUlQgKikoJkZyYW1lLkRlbGJhUGFybSkgPSBjcHUybGUxNigqKFVTSE9SVCAqKSgmRnJhbWUuRGVsYmFQYXJtKSk7CisJCUZyYW1lLlJlYXNvbkNvZGUgPSBjcHUybGUxNihGcmFtZS5SZWFzb25Db2RlKTsKKworCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAgICAgICAgICAgICAgICZGcmFtZUxlbiwKKwkJICAgICAgICAgICAgICBzaXplb2YoRlJBTUVfREVMQkFfUkVRKSwgICAgJkZyYW1lLAorCQkgICAgICAgICAgICAgIEVORF9PRl9BUkdTKTsKKwkJTWluaXBvcnRNTVJlcXVlc3QocEFkLCBRSURfQUNfQkUsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKKwkJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQkEgLSBNbG1lREVMQkFBY3Rpb24oKSAuIDMgREVMQkEgc2VudC4gSW5pdGlhdG9yKCVkKVxuIiwgcEluZm8tPkluaXRpYXRvcikpOworICAgIAl9Cit9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKK1ZPSUQgTWxtZVFPU0FjdGlvbigKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7Cit9CisKK1ZPSUQgTWxtZURMU0FjdGlvbigKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7Cit9CisKK1ZPSUQgTWxtZUludmFsaWRBY3Rpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCS8vUFVDSEFSCQkgICBwT3V0QnVmZmVyID0gTlVMTDsKKwkvL1JldHVybiB0aGUgcmVjZWl2aW5nIGZyYW1lIGV4Y2VwdCB0aGUgTVNCIG9mIGNhdGVnb3J5IGZpbGVkIHNldCB0byAxLiAgNy4zLjEuMTEKK30KKworVk9JRCBQZWVyUU9TQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKK30KKworI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorVk9JRCBQZWVyRExTQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlVQ0hBUglBY3Rpb24gPSBFbGVtLT5Nc2dbTEVOR1RIXzgwMl8xMSsxXTsKKworCXN3aXRjaChBY3Rpb24pCisJeworCQljYXNlIEFDVElPTl9ETFNfUkVRVUVTVDoKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCQlQZWVyRGxzUmVxQWN0aW9uKHBBZCwgRWxlbSk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJCQlicmVhazsKKworCQljYXNlIEFDVElPTl9ETFNfUkVTUE9OU0U6CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQkJUGVlckRsc1JzcEFjdGlvbihwQWQsIEVsZW0pOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCQkJYnJlYWs7CisKKwkJY2FzZSBBQ1RJT05fRExTX1RFQVJET1dOOgorI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJCVBlZXJEbHNUZWFyRG93bkFjdGlvbihwQWQsIEVsZW0pOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCQkJYnJlYWs7CisJfQorfQorI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCitWT0lEIFBlZXJCQUFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisJVUNIQVIJQWN0aW9uID0gRWxlbS0+TXNnW0xFTkdUSF84MDJfMTErMV07CisKKwlzd2l0Y2goQWN0aW9uKQorCXsKKwkJY2FzZSBBRERCQV9SRVE6CisJCQlQZWVyQWRkQkFSZXFBY3Rpb24ocEFkLEVsZW0pOworCQkJYnJlYWs7CisJCWNhc2UgQUREQkFfUkVTUDoKKwkJCVBlZXJBZGRCQVJzcEFjdGlvbihwQWQsRWxlbSk7CisJCQlicmVhazsKKwkJY2FzZSBERUxCQToKKwkJCVBlZXJEZWxCQUFjdGlvbihwQWQsRWxlbSk7CisJCQlicmVhazsKKwl9Cit9CisKKworI2lmZGVmIERPVDExTl9EUkFGVDMKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorVk9JRCBTdGFQdWJsaWNBY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVUNIQVIgQnNzMjA0MENvZXhpc3QpCit7CisJQlNTXzIwNDBfQ09FWElTVF9JRQkJQnNzQ29leGlzdDsKKwlNTE1FX1NDQU5fUkVRX1NUUlVDVAkJCVNjYW5SZXE7CisKKwlCc3NDb2V4aXN0LndvcmQgPSBCc3MyMDQwQ29leGlzdDsKKwkvLyBBUCBhc2tzIFN0YXRpb24gdG8gcmV0dXJuIGEgMjAvNDAgQlNTIENvZXhpc3RlbmNlIG1nbXQgZnJhbWUuICBTbyB3ZSBmaXJzdCBzdGFydHMgYSBzY2FuLCB0aGVuIHNlbmQgYmFjayAyMC80MCBCU1MgQ29leGlzdGVuY2UgbWdtdCBmcmFtZQorCWlmICgoQnNzQ29leGlzdC5maWVsZC5JbmZvUmVxID09IDEpICYmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1NDQU5fMjA0MCkpKQorCXsKKwkJLy8gQ2xlYXIgcmVjb3JkIGZpcnN0LiAgQWZ0ZXIgc2NhbiAsIHdpbGwgdXBkYXRlIHRob3NlIGJpdCBhbmQgc2VuZCBiYWNrIHRvIHRyYW5zbWl0ZXIuCisJCXBBZC0+Q29tbW9uQ2ZnLkJTU0NvZXhpc3QyMDQwLmZpZWxkLkluZm9SZXEgPSAxOworCQlwQWQtPkNvbW1vbkNmZy5CU1NDb2V4aXN0MjA0MC5maWVsZC5JbnRvbGVyYW50NDAgPSAwOworCQlwQWQtPkNvbW1vbkNmZy5CU1NDb2V4aXN0MjA0MC5maWVsZC5CU1MyMFdpZHRoUmVxID0gMDsKKwkJLy8gRmlsbCBvdXQgc3R1ZmYgZm9yIHNjYW4gcmVxdWVzdAorCQlTY2FuUGFybUZpbGwocEFkLCAmU2NhblJlcSwgWmVyb1NzaWQsIDAsIEJTU19BTlksIFNDQU5fMjA0MF9CU1NfQ09FWElTVCk7CisJCU1sbWVFbnF1ZXVlKHBBZCwgU1lOQ19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9TQ0FOX1JFUSwgc2l6ZW9mKE1MTUVfU0NBTl9SRVFfU1RSVUNUKSwgJlNjYW5SZXEpOworCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX09JRF9MSVNUX1NDQU47CisJfQorfQorCisKKy8qCitEZXNjcmlwdGlvbiA6IEJ1aWxkIEludG9sZXJhbnQgQ2hhbm5lbCBSZXJwb3QgZnJvbSBUcmlnZ2VyIGV2ZW50IHRhYmxlLgorcmV0dXJuIDogaG93IG1hbnkgYnl0ZXMgY29waWVkLgorKi8KK1VMT05HIEJ1aWxkSW50b2xlcmFudENoYW5uZWxSZXAoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4gICAgUFVDSEFSICBwRGVzdCkKK3sKKwlVTE9ORwkJCUZyYW1lTGVuID0gMDsKKwlVTE9ORwkJCVJlYWRPZmZzZXQgPSAwOworCVVDSEFSCQkJaTsKKwlVQ0hBUgkJCUxhc3RSZWdDbGFzcyA9IDB4ZmY7CisJUFVDSEFSCQkJcExlbjsKKworCWZvciAoIGkgPSAwO2kgPCBNQVhfVFJJR0dFUl9FVkVOVDtpKyspCisJeworCQlpZiAocEFkLT5Db21tb25DZmcuVHJpZ2dlckV2ZW50VGFiLkV2ZW50QVtpXS5iVmFsaWQgPT0gVFJVRSkKKwkJeworCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLlRyaWdnZXJFdmVudFRhYi5FdmVudEFbaV0uUmVnQ2xhc3MgPT0gTGFzdFJlZ0NsYXNzKQorCQkJeworCQkJCSoocERlc3QgKyBSZWFkT2Zmc2V0KSA9IChVQ0hBUilwQWQtPkNvbW1vbkNmZy5UcmlnZ2VyRXZlbnRUYWIuRXZlbnRBW2ldLkNoYW5uZWw7CisJCQkJKnBMZW4rKzsKKwkJCQlSZWFkT2Zmc2V0Kys7CisJCQkJRnJhbWVMZW4rKzsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQkqKHBEZXN0ICsgUmVhZE9mZnNldCkgPSBJRV8yMDQwX0JTU19JTlRPTEVSQU5UX1JFUE9SVDsgIC8vIElFCisJCQkJKihwRGVzdCArIFJlYWRPZmZzZXQgKyAxKSA9IDI7CS8vIExlbiA9IFJlZ0NsYXNzIGJ5dGUgKyBjaGFubmVsIGJ5dGUuCisJCQkJcExlbiA9IHBEZXN0ICsgUmVhZE9mZnNldCArIDE7CisJCQkJTGFzdFJlZ0NsYXNzID0gcEFkLT5Db21tb25DZmcuVHJpZ2dlckV2ZW50VGFiLkV2ZW50QVtpXS5SZWdDbGFzczsKKwkJCQkqKHBEZXN0ICsgUmVhZE9mZnNldCArIDIpID0gTGFzdFJlZ0NsYXNzOwkvLyBMZW4gPSBSZWdDbGFzcyBieXRlICsgY2hhbm5lbCBieXRlLgorCQkJCSoocERlc3QgKyBSZWFkT2Zmc2V0ICsgMykgPSAoVUNIQVIpcEFkLT5Db21tb25DZmcuVHJpZ2dlckV2ZW50VGFiLkV2ZW50QVtpXS5DaGFubmVsOworCQkJCUZyYW1lTGVuICs9IDQ7CisJCQkJUmVhZE9mZnNldCArPSA0OworCQkJfQorCisJCX0KKwl9CisJcmV0dXJuIEZyYW1lTGVuOworfQorCisKKy8qCitEZXNjcmlwdGlvbiA6IFNlbmQgMjAvNDAgQlNTIENvZXhpc3RlbmNlIEFjdGlvbiBmcmFtZSBJZiBvbmUgdHJpZ2dlciBldmVudCBpcyB0cmlnZ2VyZWQuCisqLworVk9JRCBTZW5kMjA0MENvZXhpc3RBY3Rpb24oCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4gICAgVUNIQVIgIFdjaWQsCisJSU4JQk9PTEVBTgliQWRkSW50b2xlcmFudENoYSkKK3sKKwlQVUNIQVIJCQlwT3V0QnVmZmVyID0gTlVMTDsKKwlORElTX1NUQVRVUyAJTlN0YXR1czsKKwlGUkFNRV9BQ1RJT05fSERSCUZyYW1lOworCVVMT05HCQkJRnJhbWVMZW47CisJVUxPTkcJCQlJbnRvbGVyYW50Q2hhUmVwTGVuOworCisJSW50b2xlcmFudENoYVJlcExlbiA9IDA7CisJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKKwlpZihOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIkFDVCAtIFNlbmQyMDQwQ29leGlzdEFjdGlvbigpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWQgXG4iKSk7CisJCXJldHVybjsKKwl9CisJQWN0SGVhZGVySW5pdChwQWQsICZGcmFtZS5IZHIsIHBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0uQWRkciwgcEFkLT5Db21tb25DZmcuQnNzaWQpOworCUZyYW1lLkNhdGVnb3J5ID0gQ0FURUdPUllfUFVCTElDOworCUZyYW1lLkFjdGlvbiA9IEFDVElPTl9CU1NfMjA0MF9DT0VYSVNUOworCisJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwJCQkJJkZyYW1lTGVuLAorCQkJCSAgc2l6ZW9mKEZSQU1FX0FDVElPTl9IRFIpLAkgICZGcmFtZSwKKwkJCQkgIEVORF9PRl9BUkdTKTsKKworCSoocE91dEJ1ZmZlciArIEZyYW1lTGVuKSA9IHBBZC0+Q29tbW9uQ2ZnLkJTU0NvZXhpc3QyMDQwLndvcmQ7CisJRnJhbWVMZW4rKzsKKworCWlmIChiQWRkSW50b2xlcmFudENoYSA9PSBUUlVFKQorCQlJbnRvbGVyYW50Q2hhUmVwTGVuID0gQnVpbGRJbnRvbGVyYW50Q2hhbm5lbFJlcChwQWQsIHBPdXRCdWZmZXIgKyBGcmFtZUxlbik7CisKKwlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIFFJRF9BQ19CRSwgcE91dEJ1ZmZlciwgRnJhbWVMZW4gKyBJbnRvbGVyYW50Q2hhUmVwTGVuKTsKKwlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIkFDVCAtIFNlbmQyMDQwQ29leGlzdEFjdGlvbiggQlNTQ29leGlzdDIwNDAgPSAweCV4ICkgIFxuIiwgcEFkLT5Db21tb25DZmcuQlNTQ29leGlzdDIwNDAud29yZCkpOworCit9CisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCUFmdGVyIHNjYW4sIFVwZGF0ZSAyMC80MCBCU1MgQ29leGlzdGVuY2UgSUUgYW5kIHNlbmQgb3V0LgorCUFjY29yZGluZyB0byA4MDIuMTFuIEQzLjAzIDExLjE0LjEwCisKKwlQYXJhbWV0ZXJzOgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgVXBkYXRlMjA0MENvZXhpc3RGcmFtZUFuZE5vdGlmeSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiAgICBVQ0hBUiAgV2NpZCwKKwlJTglCT09MRUFOCWJBZGRJbnRvbGVyYW50Q2hhKQoreworCUJTU18yMDQwX0NPRVhJU1RfSUUJT2xkVmFsdWU7CisKKwlPbGRWYWx1ZS53b3JkID0gcEFkLT5Db21tb25DZmcuQlNTQ29leGlzdDIwNDAud29yZDsKKwlpZiAoKHBBZC0+Q29tbW9uQ2ZnLlRyaWdnZXJFdmVudFRhYi5FdmVudEFObyA+IDApIHx8IChwQWQtPkNvbW1vbkNmZy5UcmlnZ2VyRXZlbnRUYWIuRXZlbnRCQ291bnREb3duID4gMCkpCisJCXBBZC0+Q29tbW9uQ2ZnLkJTU0NvZXhpc3QyMDQwLmZpZWxkLkJTUzIwV2lkdGhSZXEgPSAxOworCisJLy8gTmVlZCB0byBjaGVjayAhISEhCisJLy8gSG93IFNUQSB3aWxsIHNldCBJbnRvbGVyYW50NDAgaWYgaW1wbGVtZW50YXRpb24gZGVwZW5kZW50LiBOb3cgd2UgZG9uJ3Qgc2V0IHRoaXMgYml0IGZpcnN0LiEhISEhCisJLy8gU28gT25seSBjaGVjayBCU1MyMFdpZHRoUmVxIGNoYW5nZS4KKwlpZiAoT2xkVmFsdWUuZmllbGQuQlNTMjBXaWR0aFJlcSAhPSBwQWQtPkNvbW1vbkNmZy5CU1NDb2V4aXN0MjA0MC5maWVsZC5CU1MyMFdpZHRoUmVxKQorCXsKKwkJU2VuZDIwNDBDb2V4aXN0QWN0aW9uKHBBZCwgV2NpZCwgYkFkZEludG9sZXJhbnRDaGEpOworCX0KK30KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCitCT09MRUFOIENoYW5uZWxTd2l0Y2hTYW5pdHlDaGVjaygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiAgICBVQ0hBUiAgV2NpZCwKKwlJTiAgICBVQ0hBUiAgTmV3Q2hhbm5lbCwKKwlJTiAgICBVQ0hBUiAgU2Vjb25kYXJ5KQoreworCVVDSEFSCQlpOworCisJaWYgKFdjaWQgPj0gTUFYX0xFTl9PRl9NQUNfVEFCTEUpCisJCXJldHVybiBGQUxTRTsKKworCWlmICgoTmV3Q2hhbm5lbCA+IDcpICYmIChTZWNvbmRhcnkgPT0gMSkpCisJCXJldHVybiBGQUxTRTsKKworCWlmICgoTmV3Q2hhbm5lbCA8IDUpICYmIChTZWNvbmRhcnkgPT0gMykpCisJCXJldHVybiBGQUxTRTsKKworCS8vIDAuIENoZWNrIGlmIG5ldyBjaGFubmVsIGlzIGluIHRoZSBjaGFubmVsbGlzdC4KKwlmb3IgKGkgPSAwO2kgPCBwQWQtPkNoYW5uZWxMaXN0TnVtO2krKykKKwl7CisJCWlmIChwQWQtPkNoYW5uZWxMaXN0W2ldLkNoYW5uZWwgPT0gTmV3Q2hhbm5lbCkKKwkJeworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoaSA9PSBwQWQtPkNoYW5uZWxMaXN0TnVtKQorCQlyZXR1cm4gRkFMU0U7CisKKwlyZXR1cm4gVFJVRTsKK30KKworCitWT0lEIENoYW5uZWxTd2l0Y2hBY3Rpb24oCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4gICAgVUNIQVIgIFdjaWQsCisJSU4gICAgVUNIQVIgIE5ld0NoYW5uZWwsCisJSU4gICAgVUNIQVIgIFNlY29uZGFyeSkKK3sKKwlVQ0hBUgkJQkJQVmFsdWUgPSAwOworCVVMT05HCQlNQUNWYWx1ZTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiU1BFQ1RSVU0gLSBDaGFubmVsU3dpdGNoQWN0aW9uKE5ld0NoYW5uZWwgPSAlZCAsIFNlY29uZGFyeSA9ICVkKSAgXG4iLCBOZXdDaGFubmVsLCBTZWNvbmRhcnkpKTsKKworCWlmIChDaGFubmVsU3dpdGNoU2FuaXR5Q2hlY2socEFkLCBXY2lkLCBOZXdDaGFubmVsLCBTZWNvbmRhcnkpID09IEZBTFNFKQorCQlyZXR1cm47CisKKwkvLyAxLiAgU3dpdGNoZXMgdG8gQlcgPSAyMC4KKwlpZiAoU2Vjb25kYXJ5ID09IDApCisJeworCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsICZCQlBWYWx1ZSk7CisJCUJCUFZhbHVlJj0gKH4weDE4KTsKKwkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgQkJQVmFsdWUpOworCQlpZiAocEFkLT5NQUNWZXJzaW9uID09IDB4Mjg2MDAxMDApCisJCXsKKwkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY5LCAweDE2KTsKKwkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjcwLCAweDA4KTsKKwkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjczLCAweDExKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhIXJ0Mjg2MEMgISEhIFxuIiApKTsKKwkJfQorCQlwQWQtPkNvbW1vbkNmZy5CQlBDdXJyZW50QlcgPSBCV18yMDsKKwkJcEFkLT5Db21tb25DZmcuQ2hhbm5lbCA9IE5ld0NoYW5uZWw7CisJCXBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsID0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbDsKKwkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsLEZBTFNFKTsKKwkJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCk7CisJCXBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0uSFRQaHlNb2RlLmZpZWxkLkJXID0gMDsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhMjBNSHogICAhISEgXG4iICkpOworCX0KKwkvLyAxLiAgU3dpdGNoZXMgdG8gQlcgPSA0MCBBbmQgU3RhdGlvbiBzdXBwb3J0cyBCVyA9IDQwLgorCWVsc2UgaWYgKCgoU2Vjb25kYXJ5ID09IDEpIHx8IChTZWNvbmRhcnkgPT0gMykpICYmIChwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkNoYW5uZWxXaWR0aCA9PSAxKSkKKwl7CisJCXBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPSBOZXdDaGFubmVsOworCisJCWlmIChTZWNvbmRhcnkgPT0gMSkKKwkJeworCQkJLy8gU2Vjb25kYXJ5IGFib3ZlLgorCQkJcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsICsgMjsKKwkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfQkFORF9DRkcsICZNQUNWYWx1ZSk7CisJCQlNQUNWYWx1ZSAmPSAweGZlOworCQkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfQkFORF9DRkcsIE1BQ1ZhbHVlKTsKKwkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgJkJCUFZhbHVlKTsKKwkJCUJCUFZhbHVlJj0gKH4weDE4KTsKKwkJCUJCUFZhbHVlfD0gKDB4MTApOworCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgQkJQVmFsdWUpOworCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCAmQkJQVmFsdWUpOworCQkJQkJQVmFsdWUmPSAofjB4MjApOworCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgQkJQVmFsdWUpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhNDBNSHogTG93ZXIgTElOSyBVUCAhISEgQ29udHJvbCBDaGFubmVsIGF0IEJlbG93LiBDZW50cmFsID0gJWQgXG4iLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCApKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCS8vIFNlY29uZGFyeSBiZWxvdy4KKwkJCXBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsID0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbCAtIDI7CisJCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0JBTkRfQ0ZHLCAmTUFDVmFsdWUpOworCQkJTUFDVmFsdWUgJj0gMHhmZTsKKwkJCU1BQ1ZhbHVlIHw9IDB4MTsKKwkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX0JBTkRfQ0ZHLCBNQUNWYWx1ZSk7CisJCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsICZCQlBWYWx1ZSk7CisJCQlCQlBWYWx1ZSY9ICh+MHgxOCk7CisJCQlCQlBWYWx1ZXw9ICgweDEwKTsKKwkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsIEJCUFZhbHVlKTsKKwkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgJkJCUFZhbHVlKTsKKwkJCUJCUFZhbHVlJj0gKH4weDIwKTsKKwkJCUJCUFZhbHVlfD0gKDB4MjApOworCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgQkJQVmFsdWUpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhNDBNSHogVXBwZXIgTElOSyBVUCAhISEgQ29udHJvbCBDaGFubmVsIGF0IFVwcGVyQ2VudHJhbCA9ICVkIFxuIiwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgKSk7CisJCX0KKwkJcEFkLT5Db21tb25DZmcuQkJQQ3VycmVudEJXID0gQldfNDA7CisJCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwsIEZBTFNFKTsKKwkJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwpOworCQlwQWQtPk1hY1RhYi5Db250ZW50W1djaWRdLkhUUGh5TW9kZS5maWVsZC5CVyA9IDE7CisJfQorfQorI2VuZGlmIC8vIERPVDExTl9EUkFGVDMgLy8KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworVk9JRCBQZWVyUHVibGljQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKyNpZmRlZiBET1QxMU5fRFJBRlQzCisJVUNIQVIJQWN0aW9uID0gRWxlbS0+TXNnW0xFTkdUSF84MDJfMTErMV07CisjZW5kaWYgLy8gRE9UMTFOX0RSQUZUMyAvLworCisJaWYgKEVsZW0tPldjaWQgPj0gTUFYX0xFTl9PRl9NQUNfVEFCTEUpCisJCXJldHVybjsKKworI2lmZGVmIERPVDExTl9EUkFGVDMKKwlzd2l0Y2goQWN0aW9uKQorCXsKKwkJY2FzZSBBQ1RJT05fQlNTXzIwNDBfQ09FWElTVDoJLy8gRm9ybWF0IGRlZmluZWQgaW4gSUVFRSA3LjQuN2EuMSBpbiAxMW4gRHJhZjMuMDMKKwkJCXsKKwkJCQkvL1VDSEFSCUJzc0NvZXhpc3Q7CisJCQkJQlNTXzIwNDBfQ09FWElTVF9FTEVNRU5UCQkqcENvZXhpc3RJbmZvOworCQkJCUJTU18yMDQwX0NPRVhJU1RfSUUgCQkJKnBCc3NDb2V4aXN0SWU7CisJCQkJQlNTXzIwNDBfSU5UT0xFUkFOVF9DSF9SRVBPUlQJKnBJbnRvbGVyYW50UmVwb3J0ID0gTlVMTDsKKworCQkJCWlmIChFbGVtLT5Nc2dMZW4gPD0gKExFTkdUSF84MDJfMTEgKyBzaXplb2YoQlNTXzIwNDBfQ09FWElTVF9FTEVNRU5UKSkgKQorCQkJCXsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiQUNUSU9OIC0gMjAvNDAgQlNTIENvZXhpc3RlbmNlIE1hbmFnZW1lbnQgRnJhbWUgbGVuZ3RoIHRvbyBzaG9ydCEgbGVuID0gJWxkIVxuIiwgRWxlbS0+TXNnTGVuKSk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBQ1RJT04gLSAyMC80MCBCU1MgQ29leGlzdGVuY2UgTWFuYWdlbWVudCBhY3Rpb24tLS0tPiBcbiIpKTsKKwkJCQloZXhfZHVtcCgiQ29leGlzdGVuY2VNZ210RnJhbWUiLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbik7CisKKworCQkJCXBDb2V4aXN0SW5mbyA9IChCU1NfMjA0MF9DT0VYSVNUX0VMRU1FTlQgKikgJkVsZW0tPk1zZ1tMRU5HVEhfODAyXzExKzJdOworCQkJCS8vaGV4X2R1bXAoIkNvZXhpc3RJbmZvIiwgKFBVQ0hBUilwQ29leGlzdEluZm8sIHNpemVvZihCU1NfMjA0MF9DT0VYSVNUX0VMRU1FTlQpKTsKKwkJCQlpZiAoRWxlbS0+TXNnTGVuID49IChMRU5HVEhfODAyXzExICsgc2l6ZW9mKEJTU18yMDQwX0NPRVhJU1RfRUxFTUVOVCkgKyBzaXplb2YoQlNTXzIwNDBfSU5UT0xFUkFOVF9DSF9SRVBPUlQpKSkKKwkJCQl7CisJCQkJCXBJbnRvbGVyYW50UmVwb3J0ID0gKEJTU18yMDQwX0lOVE9MRVJBTlRfQ0hfUkVQT1JUICopKChQVUNIQVIpcENvZXhpc3RJbmZvICsgc2l6ZW9mKEJTU18yMDQwX0NPRVhJU1RfRUxFTUVOVCkpOworCQkJCX0KKwkJCQkvL2hleF9kdW1wKCJJbnRvbGVyYW50UmVwb3J0ICIsIChQVUNIQVIpcEludG9sZXJhbnRSZXBvcnQsIHNpemVvZihCU1NfMjA0MF9JTlRPTEVSQU5UX0NIX1JFUE9SVCkpOworCisJCQkJcEJzc0NvZXhpc3RJZSA9IChCU1NfMjA0MF9DT0VYSVNUX0lFICopKCZwQ29leGlzdEluZm8tPkJzc0NvZXhpc3RJZSk7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQkJCXsKKwkJCQkJaWYgKElORlJBX09OKHBBZCkpCisJCQkJCXsKKwkJCQkJCVN0YVB1YmxpY0FjdGlvbihwQWQsIHBDb2V4aXN0SW5mbyk7CisJCQkJCX0KKwkJCQl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwkJCX0KKwkJCWJyZWFrOworCX0KKworI2VuZGlmIC8vIERPVDExTl9EUkFGVDMgLy8KKworfQorCisKK3N0YXRpYyBWT0lEIFJlc2VydmVkQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlVQ0hBUiBDYXRlZ29yeTsKKworCWlmIChFbGVtLT5Nc2dMZW4gPD0gTEVOR1RIXzgwMl8xMSkKKwl7CisJCXJldHVybjsKKwl9CisKKwlDYXRlZ29yeSA9IEVsZW0tPk1zZ1tMRU5HVEhfODAyXzExXTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJjdiByZXNlcnZlZCBjYXRlZ29yeSglZCkgQWN0aW9uIEZyYW1lXG4iLCBDYXRlZ29yeSkpOworCWhleF9kdW1wKCJSZXNlcnZlZCBBY3Rpb24gRnJhbWUiLCAmRWxlbS0+TXNnWzBdLCBFbGVtLT5Nc2dMZW4pOworfQorCitWT0lEIFBlZXJSTUFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCisKK3sKKwlyZXR1cm47Cit9CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKK3N0YXRpYyBWT0lEIHJlc3BvbmRfaHRfaW5mb3JtYXRpb25fZXhjaGFuZ2VfYWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlQVUNIQVIJCQlwT3V0QnVmZmVyID0gTlVMTDsKKwlORElTX1NUQVRVUwkJTlN0YXR1czsKKwlVTE9ORwkJCUZyYW1lTGVuOworCUZSQU1FX0hUX0lORk8JSFRJTkZPZnJhbWUsICpwRnJhbWU7CisJVUNIQVIgICAJCSpwQWRkcjsKKworCisJLy8gMi4gQWx3YXlzIHNlbmQgYmFjayBBRERCQSBSZXNwb25zZQorCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcik7CSAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5CisKKwlpZiAoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJBQ1RJT04gLSByZXNwb25kX2h0X2luZm9ybWF0aW9uX2V4Y2hhbmdlX2FjdGlvbigpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWQgXG4iKSk7CisJCXJldHVybjsKKwl9CisKKwkvLyBnZXQgUkEKKwlwRnJhbWUgPSAoRlJBTUVfSFRfSU5GTyAqKSAmRWxlbS0+TXNnWzBdOworCXBBZGRyID0gcEZyYW1lLT5IZHIuQWRkcjI7CisKKwlOZGlzWmVyb01lbW9yeSgmSFRJTkZPZnJhbWUsIHNpemVvZihGUkFNRV9IVF9JTkZPKSk7CisJLy8gMi0xLiBQcmVwYXJlIEFEREJBIFJlc3BvbnNlIGZyYW1lLgorI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJeworCQlpZiAoQURIT0NfT04ocEFkKSkKKwkJCUFjdEhlYWRlckluaXQocEFkLCAmSFRJTkZPZnJhbWUuSGRyLCBwQWRkciwgcEFkLT5DdXJyZW50QWRkcmVzcywgcEFkLT5Db21tb25DZmcuQnNzaWQpOworCQllbHNlCisJCQlBY3RIZWFkZXJJbml0KHBBZCwgJkhUSU5GT2ZyYW1lLkhkciwgcEFkLT5Db21tb25DZmcuQnNzaWQsIHBBZC0+Q3VycmVudEFkZHJlc3MsIHBBZGRyKTsKKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlIVElORk9mcmFtZS5DYXRlZ29yeSA9IENBVEVHT1JZX0hUOworCUhUSU5GT2ZyYW1lLkFjdGlvbiA9IEhUX0lORk9fRVhDSEFOR0U7CisJSFRJTkZPZnJhbWUuSFRfSW5mby5SZXF1ZXN0ID0gMDsKKwlIVElORk9mcmFtZS5IVF9JbmZvLkZvcnR5X01Iel9JbnRvbGVyYW50ID0gcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5Gb3J0eV9NaHpfSW50b2xlcmFudDsKKwlIVElORk9mcmFtZS5IVF9JbmZvLlNUQV9DaGFubmVsX1dpZHRoCSA9IHBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mby5BZGRIdEluZm8uUmVjb21XaWR0aDsKKworCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsCQkJCQkmRnJhbWVMZW4sCisJCQkJCSAgc2l6ZW9mKEZSQU1FX0hUX0lORk8pLAkmSFRJTkZPZnJhbWUsCisJCQkJCSAgRU5EX09GX0FSR1MpOworCisJTWluaXBvcnRNTVJlcXVlc3QocEFkLCBRSURfQUNfQkUsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKKwlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOworfQorCisKKyNpZmRlZiBET1QxMU5fRFJBRlQzCitWT0lEIFNlbmROb3RpZnlCV0FjdGlvbkZyYW1lKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVDSEFSICBXY2lkLAorCUlOIFVDSEFSIGFwaWR4KQoreworCVBVQ0hBUgkJCXBPdXRCdWZmZXIgPSBOVUxMOworCU5ESVNfU1RBVFVTIAlOU3RhdHVzOworCUZSQU1FX0FDVElPTl9IRFIJRnJhbWU7CisJVUxPTkcJCQlGcmFtZUxlbjsKKwlQVUNIQVIJCQlwQWRkcjE7CisKKworCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5CisJaWYoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJBQ1QgLSBTZW5kTm90aWZ5QldBY3Rpb24oKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkIFxuIikpOworCQlyZXR1cm47CisJfQorCisJaWYgKFdjaWQgPT0gTUNBU1RfV0NJRCkKKwkJcEFkZHIxID0gJkJST0FEQ0FTVF9BRERSWzBdOworCWVsc2UKKwkJcEFkZHIxID0gcEFkLT5NYWNUYWIuQ29udGVudFtXY2lkXS5BZGRyOworCUFjdEhlYWRlckluaXQocEFkLCAmRnJhbWUuSGRyLCBwQWRkcjEsIHBBZC0+QXBDZmcuTUJTU0lEW2FwaWR4XS5Cc3NpZCwgcEFkLT5BcENmZy5NQlNTSURbYXBpZHhdLkJzc2lkKTsKKworCUZyYW1lLkNhdGVnb3J5ID0gQ0FURUdPUllfSFQ7CisJRnJhbWUuQWN0aW9uID0gTk9USUZZX0JXX0FDVElPTjsKKworCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsCQkJCSZGcmFtZUxlbiwKKwkJCQkgIHNpemVvZihGUkFNRV9BQ1RJT05fSERSKSwJICAmRnJhbWUsCisJCQkJICBFTkRfT0ZfQVJHUyk7CisKKwkqKHBPdXRCdWZmZXIgKyBGcmFtZUxlbikgPSBwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8uQWRkSHRJbmZvLlJlY29tV2lkdGg7CisJRnJhbWVMZW4rKzsKKworCisJTWluaXBvcnRNTVJlcXVlc3QocEFkLCBRSURfQUNfQkUsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkFDVCAtIFNlbmROb3RpZnlCV0FjdGlvbihOb3RpZnlCVz0gJWQpIVxuIiwgcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLkFkZEh0SW5mby5SZWNvbVdpZHRoKSk7CisKK30KKyNlbmRpZiAvLyBET1QxMU5fRFJBRlQzIC8vCisKKworVk9JRCBQZWVySFRBY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCVVDSEFSCUFjdGlvbiA9IEVsZW0tPk1zZ1tMRU5HVEhfODAyXzExKzFdOworCisJaWYgKEVsZW0tPldjaWQgPj0gTUFYX0xFTl9PRl9NQUNfVEFCTEUpCisJCXJldHVybjsKKworCXN3aXRjaChBY3Rpb24pCisJeworCQljYXNlIE5PVElGWV9CV19BQ1RJT046CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkFDVElPTiAtIEhUIE5vdGlmeSBDaGFubmVsIGJhbmR3aWR0aCBhY3Rpb24tLS0tPiBcbiIpKTsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJCWlmKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uYkh0RW5hYmxlID09IEZBTFNFKQorCQkJeworCQkJCS8vIE5vdGUsIHRoaXMgaXMgdG8gcGF0Y2ggRElSLTEzNTMgQVAuIFdoZW4gdGhlIEFQIHNldCB0byBXZXAsIGl0IHdpbGwgdXNlIGxlZ2FjeSBtb2RlLiBCdXQgQVAgc3RpbGwga2VlcHMKKwkJCQkvLyBzZW5kaW5nIEJXX05vdGlmeSBBY3Rpb24gZnJhbWUsIGFuZCBjYXVzZSB1cyB0byBsaW5rdXAgYW5kIGxpbmtkb3duLgorCQkJCS8vIEluIGxlZ2FjeSBtb2RlLCBkb24ndCBuZWVkIHRvIHBhcnNlIEhUIGFjdGlvbiBmcmFtZS4KKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkFDVElPTiAtSWdub3JlIEhUIE5vdGlmeSBDaGFubmVsIEJXIHdoZW4gbGluayBhcyBsZWdhY3kgbW9kZS4gQlcgPSAlZC0tLT4gXG4iLAorCQkJCQkJCQlFbGVtLT5Nc2dbTEVOR1RIXzgwMl8xMSsyXSApKTsKKwkJCQlicmVhazsKKwkJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCQkJaWYgKEVsZW0tPk1zZ1tMRU5HVEhfODAyXzExKzJdID09IDApCS8vIDcuNC44LjIuIGlmIHZhbHVlIGlzIDEsIGtlZXAgdGhlIHNhbWUgYXMgc3VwcG9ydGVkIGNoYW5uZWwgYmFuZHdpZHRoLgorCQkJCXBBZC0+TWFjVGFiLkNvbnRlbnRbRWxlbS0+V2NpZF0uSFRQaHlNb2RlLmZpZWxkLkJXID0gMDsKKworCQkJYnJlYWs7CisKKwkJY2FzZSBTTVBTX0FDVElPTjoKKwkJCS8vIDcuMy4xLjI1CisgCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJBQ1RJT04gLSBTTVBTIGFjdGlvbi0tLS0+IFxuIikpOworCQkJaWYgKCgoRWxlbS0+TXNnW0xFTkdUSF84MDJfMTErMl0mMHgxKSA9PSAwKSkKKwkJCXsKKwkJCQlwQWQtPk1hY1RhYi5Db250ZW50W0VsZW0tPldjaWRdLk1tcHNNb2RlID0gTU1QU19FTkFCTEU7CisJCQl9CisJCQllbHNlIGlmICgoKEVsZW0tPk1zZ1tMRU5HVEhfODAyXzExKzJdJjB4MikgPT0gMCkpCisJCQl7CisJCQkJcEFkLT5NYWNUYWIuQ29udGVudFtFbGVtLT5XY2lkXS5NbXBzTW9kZSA9IE1NUFNfU1RBVElDOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXBBZC0+TWFjVGFiLkNvbnRlbnRbRWxlbS0+V2NpZF0uTW1wc01vZGUgPSBNTVBTX0RZTkFNSUM7CisJCQl9CisKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQWlkKCVkKSBNSU1PIFBTID0gJWRcbiIsIEVsZW0tPldjaWQsIHBBZC0+TWFjVGFiLkNvbnRlbnRbRWxlbS0+V2NpZF0uTW1wc01vZGUpKTsKKwkJCS8vIHJ0Mjg2MGMgOiBhZGQgc29tZXRoaW5nIGZvciBzbXBzIGNoYW5nZS4KKwkJCWJyZWFrOworCisJCWNhc2UgU0VUUENPX0FDVElPTjoKKwkJCWJyZWFrOworCisJCWNhc2UgTUlNT19DSEFfTUVBU1VSRV9BQ1RJT046CisJCQlicmVhazsKKworCQljYXNlIEhUX0lORk9fRVhDSEFOR0U6CisJCQl7CisJCQkJSFRfSU5GT1JNQVRJT05fT0NURVQJKnBIVF9pbmZvOworCisJCQkJcEhUX2luZm8gPSAoSFRfSU5GT1JNQVRJT05fT0NURVQgKikgJkVsZW0tPk1zZ1tMRU5HVEhfODAyXzExKzJdOworICAgIAkJCQkvLyA3LjQuOC4xMAorICAgIAkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkFDVElPTiAtIEhUIEluZm9ybWF0aW9uIEV4Y2hhbmdlIGFjdGlvbi0tLS0+IFxuIikpOworICAgIAkJCQlpZiAocEhUX2luZm8tPlJlcXVlc3QpCisgICAgCQkJCXsKKyAgICAJCQkJCXJlc3BvbmRfaHRfaW5mb3JtYXRpb25fZXhjaGFuZ2VfYWN0aW9uKHBBZCwgRWxlbSk7CisgICAgCQkJCX0KKwkJCX0KKyAgICAJCQlicmVhazsKKwl9Cit9CisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlSZXRyeSBzZW5kaW5nIEFEREJBIFJlcWVzdC4KKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJUGFyYW1ldHJzOgorCXA4MDIzSGVhZGVyOiBpZiB0aGlzIGlzIGFscmVhZHkgODAyLjMgZm9ybWF0LCBwODAyM0hlYWRlciBpcyBOVUxMCisKKwlSZXR1cm4JOiBUUlVFIGlmIHB1dCBpbnRvIHJ4IHJlb3JkZXJpbmcgYnVmZmVyLCBzaG91bGRuJ3QgaW5kaWNhdGVyeGhlcmUuCisJCQkJRkFMU0UgLCB0aGVuIGNvbnRpbnVlIGluZGljYXRlcnggYXQgdGhpcyBtb21lbnQuCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBPUklCQVRpbWVyVGltZW91dCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCkKK3sKKwlNQUNfVEFCTEVfRU5UUlkJKnBFbnRyeTsKKwlJTlQJCQlpLCB0b3RhbDsKKy8vCUZSQU1FX0JBUgkJCUZyYW1lQmFyOworLy8JVUxPTkcJCQlGcmFtZUxlbjsKKy8vCU5ESVNfU1RBVFVTIAlOU3RhdHVzOworLy8JUFVDSEFSCQkJcE91dEJ1ZmZlciA9IE5VTEw7CisvLwlVU0hPUlQJCQlTZXF1ZW5jZTsKKwlVQ0hBUgkJCVRJRDsKKworI2lmZGVmIFJBTElOS19BVEUKKwlpZiAoQVRFX09OKHBBZCkpCisJCXJldHVybjsKKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisKKwl0b3RhbCA9IHBBZC0+TWFjVGFiLlNpemUgKiBOVU1fT0ZfVElEOworCisJZm9yIChpID0gMTsgKChpIDxNQVhfTEVOX09GX0JBX09SSV9UQUJMRSkgJiYgKHRvdGFsID4gMCkpIDsgaSsrKQorCXsKKwkJaWYgIChwQWQtPkJBVGFibGUuQkFPcmlFbnRyeVtpXS5PUklfQkFfU3RhdHVzID09IE9yaWdpbmF0b3JfRG9uZSkKKwkJeworCQkJcEVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbcEFkLT5CQVRhYmxlLkJBT3JpRW50cnlbaV0uV2NpZF07CisJCQlUSUQgPSBwQWQtPkJBVGFibGUuQkFPcmlFbnRyeVtpXS5USUQ7CisKKwkJCUFTU0VSVChwQWQtPkJBVGFibGUuQkFPcmlFbnRyeVtpXS5XY2lkIDwgTUFYX0xFTl9PRl9NQUNfVEFCTEUpOworCQl9CisJCXRvdGFsIC0tOworCX0KK30KKworCitWT0lEIFNlbmRSZWZyZXNoQkFSKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCU1BQ19UQUJMRV9FTlRSWQkqcEVudHJ5KQoreworCUZSQU1FX0JBUgkJRnJhbWVCYXI7CisJVUxPTkcJCQlGcmFtZUxlbjsKKwlORElTX1NUQVRVUyAJTlN0YXR1czsKKwlQVUNIQVIJCQlwT3V0QnVmZmVyID0gTlVMTDsKKwlVU0hPUlQJCQlTZXF1ZW5jZTsKKwlVQ0hBUgkJCWksIFRJRDsKKwlVU0hPUlQJCQlpZHg7CisJQkFfT1JJX0VOVFJZCSpwQkFFbnRyeTsKKworCWZvciAoaSA9IDA7IGkgPE5VTV9PRl9USUQ7IGkrKykKKwl7CisJCWlkeCA9IHBFbnRyeS0+QkFPcmlXY2lkQXJyYXlbaV07CisJCWlmIChpZHggPT0gMCkKKwkJeworCQkJY29udGludWU7CisJCX0KKwkJcEJBRW50cnkgPSAmcEFkLT5CQVRhYmxlLkJBT3JpRW50cnlbaWR4XTsKKworCQlpZiAgKHBCQUVudHJ5LT5PUklfQkFfU3RhdHVzID09IE9yaWdpbmF0b3JfRG9uZSkKKwkJeworCQkJVElEID0gcEJBRW50cnktPlRJRDsKKworCQkJQVNTRVJUKHBCQUVudHJ5LT5XY2lkIDwgTUFYX0xFTl9PRl9NQUNfVEFCTEUpOworCisJCQlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOyAgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQorCQkJaWYoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCQkJeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiQkEgLSBNbG1lQUREQkFBY3Rpb24oKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkIFxuIikpOworCQkJCXJldHVybjsKKwkJCX0KKworCQkJU2VxdWVuY2UgPSBwRW50cnktPlR4U2VxW1RJRF07CisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJCQlCYXJIZWFkZXJJbml0KHBBZCwgJkZyYW1lQmFyLCBwRW50cnktPkFkZHIsIHBBZC0+Q3VycmVudEFkZHJlc3MpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJCQlGcmFtZUJhci5TdGFydGluZ1NlcS5maWVsZC5GcmFnTnVtID0gMDsgLy8gbWFrZSBzdXJlIHNlcXVlbmNlIG5vdCBjbGVhciBpbiBERUwgZnVuY3Rpb24uCisJCQlGcmFtZUJhci5TdGFydGluZ1NlcS5maWVsZC5TdGFydFNlcSA9IFNlcXVlbmNlOyAvLyBtYWtlIHN1cmUgc2VxdWVuY2Ugbm90IGNsZWFyIGluIERFTCBmdW5jaXRvbi4KKwkJCUZyYW1lQmFyLkJhckNvbnRyb2wuVElEID0gVElEOyAvLyBtYWtlIHN1cmUgc2VxdWVuY2Ugbm90IGNsZWFyIGluIERFTCBmdW5jaXRvbi4KKworCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwJCQkJJkZyYW1lTGVuLAorCQkJCQkJCSAgc2l6ZW9mKEZSQU1FX0JBUiksCSAgJkZyYW1lQmFyLAorCQkJCQkJCSAgRU5EX09GX0FSR1MpOworCQkJLy9pZiAoIShDTElFTlRfU1RBVFVTX1RFU1RfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX1JBTElOS19DSElQU0VUKSkpCisJCQlpZiAoMSkJLy8gTm93IHdlIGFsd2F5cyBzZW5kIEJBUi4KKwkJCXsKKwkJCQkvL01pbmlwb3J0TU1SZXF1ZXN0VW5sb2NrKHBBZCwgMCwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOworCQkJCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgMCwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOworCQkJfQorCQkJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKKwkJfQorCX0KK30KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworVk9JRCBBY3RIZWFkZXJJbml0KAorICAgIElOCVBSVE1QX0FEQVBURVIJcEFkLAorICAgIElOIE9VVCBQSEVBREVSXzgwMl8xMSBwSGRyODAyMTEsCisgICAgSU4gUFVDSEFSIEFkZHIxLAorICAgIElOIFBVQ0hBUiBBZGRyMiwKKyAgICBJTiBQVUNIQVIgQWRkcjMpCit7CisgICAgTmRpc1plcm9NZW1vcnkocEhkcjgwMjExLCBzaXplb2YoSEVBREVSXzgwMl8xMSkpOworICAgIHBIZHI4MDIxMS0+RkMuVHlwZSA9IEJUWVBFX01HTVQ7CisgICAgcEhkcjgwMjExLT5GQy5TdWJUeXBlID0gU1VCVFlQRV9BQ1RJT047CisKKyAgICBDT1BZX01BQ19BRERSKHBIZHI4MDIxMS0+QWRkcjEsIEFkZHIxKTsKKwlDT1BZX01BQ19BRERSKHBIZHI4MDIxMS0+QWRkcjIsIEFkZHIyKTsKKyAgICBDT1BZX01BQ19BRERSKHBIZHI4MDIxMS0+QWRkcjMsIEFkZHIzKTsKK30KKworVk9JRCBCYXJIZWFkZXJJbml0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOIE9VVCBQRlJBTUVfQkFSIHBDbnRsQmFyLAorCUlOIFBVQ0hBUiBwREEsCisJSU4gUFVDSEFSIHBTQSkKK3sKKy8vCVVTSE9SVAlEdXJhdGlvbjsKKworCU5kaXNaZXJvTWVtb3J5KHBDbnRsQmFyLCBzaXplb2YoRlJBTUVfQkFSKSk7CisJcENudGxCYXItPkZDLlR5cGUgPSBCVFlQRV9DTlRMOworCXBDbnRsQmFyLT5GQy5TdWJUeXBlID0gU1VCVFlQRV9CTE9DS19BQ0tfUkVROworICAgCXBDbnRsQmFyLT5CYXJDb250cm9sLk1USUQgPSAwOworCXBDbnRsQmFyLT5CYXJDb250cm9sLkNvbXByZXNzZWQgPSAxOworCXBDbnRsQmFyLT5CYXJDb250cm9sLkFDS1BvbGljeSA9IDA7CisKKworCXBDbnRsQmFyLT5EdXJhdGlvbiA9IDE2ICsgUlRNUENhbGNEdXJhdGlvbihwQWQsIFJBVEVfMSwgc2l6ZW9mKEZSQU1FX0JBKSk7CisKKwlDT1BZX01BQ19BRERSKHBDbnRsQmFyLT5BZGRyMSwgcERBKTsKKwlDT1BZX01BQ19BRERSKHBDbnRsQmFyLT5BZGRyMiwgcFNBKTsKK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCUluc2VydCBDYXRlZ29yeSBhbmQgYWN0aW9uIGNvZGUgaW50byB0aGUgYWN0aW9uIGZyYW1lLgorCisJUGFyYW1ldHJzOgorCQkxLiBmcmFtZSBidWZmZXIgcG9pbnRlci4KKwkJMi4gZnJhbWUgbGVuZ3RoLgorCQkzLiBjYXRlZ29yeSBjb2RlIG9mIHRoZSBmcmFtZS4KKwkJNC4gYWN0aW9uIGNvZGUgb2YgdGhlIGZyYW1lLgorCisJUmV0dXJuCTogTm9uZS4KKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIEluc2VydEFjdEZpZWxkKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCU9VVCBQVUNIQVIgcEZyYW1lQnVmLAorCU9VVCBQVUxPTkcgcEZyYW1lTGVuLAorCUlOIFVJTlQ4IENhdGVnb3J5LAorCUlOIFVJTlQ4IEFjdENvZGUpCit7CisJVUxPTkcgVGVtcExlbjsKKworCU1ha2VPdXRnb2luZ0ZyYW1lKAlwRnJhbWVCdWYsCQkmVGVtcExlbiwKKwkJCQkJCTEsCQkJCSZDYXRlZ29yeSwKKwkJCQkJCTEsCQkJCSZBY3RDb2RlLAorCQkJCQkJRU5EX09GX0FSR1MpOworCisJKnBGcmFtZUxlbiA9ICpwRnJhbWVMZW4gKyBUZW1wTGVuOworCisJcmV0dXJuOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vYWN0aW9uLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9hY3Rpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTM4NzdkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vYWN0aW9uLmgKQEAgLTAsMCArMSw2OCBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwlNb2R1bGUgTmFtZToKKwlhaXJvbmV0LmgKKworCUFic3RyYWN0OgorCisJUmV2aXNpb24gSGlzdG9yeToKKwlXaG8JCQlXaGVuCQkJV2hhdAorCS0tLS0tLS0tCS0tLS0tLS0tLS0JCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlOYW1lCQlEYXRlCQkJTW9kaWZpY2F0aW9uIGxvZ3MKKwlQYXVsIExpbgkwNC0wNi0xNQkJSW5pdGlhbAorKi8KKworI2lmbmRlZglfX0FDVElPTl9IX18KKyNkZWZpbmUJX19BQ1RJT05fSF9fCisKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfX0hUX0lORk9fT0NURVQKK3sKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJVUNIQVIJUmVzZXJ2ZWQ6NTsKKwlVQ0hBUiAJU1RBX0NoYW5uZWxfV2lkdGg6MTsKKwlVQ0hBUglGb3J0eV9NSHpfSW50b2xlcmFudDoxOworCVVDSEFSCVJlcXVlc3Q6MTsKKyNlbHNlCisJVUNIQVIJUmVxdWVzdDoxOworCVVDSEFSCUZvcnR5X01Iel9JbnRvbGVyYW50OjE7CisJVUNIQVIgCVNUQV9DaGFubmVsX1dpZHRoOjE7CisJVUNIQVIJUmVzZXJ2ZWQ6NTsKKyNlbmRpZgorfSBIVF9JTkZPUk1BVElPTl9PQ1RFVDsKKworCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX19GUkFNRV9IVF9JTkZPCit7CisJSEVBREVSXzgwMl8xMSAgIAkJSGRyOworCVVDSEFSCQkJCQlDYXRlZ29yeTsKKwlVQ0hBUgkJCQkJQWN0aW9uOworCUhUX0lORk9STUFUSU9OX09DVEVUCUhUX0luZm87Cit9ICAgRlJBTUVfSFRfSU5GTywgKlBGUkFNRV9IVF9JTkZPOworCisjZW5kaWYgLyogX19BQ1RJT05fSF9fICovCisKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vYmFfYWN0aW9uLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9iYV9hY3Rpb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWY3MzgxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vYmFfYWN0aW9uLmMKQEAgLTAsMCArMSwxNzk4IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKworI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgorCisKKworI2RlZmluZSBCQV9PUklfSU5JVF9TRVEJCShwRW50cnktPlR4U2VxW1RJRF0pIC8vMQkJCS8vIGluaXRhbCBzZXF1ZW5jZSBudW1iZXIgb2YgQkEgc2Vzc2lvbgorCisjZGVmaW5lIE9SSV9TRVNTSU9OX01BWF9SRVRSWQk4CisjZGVmaW5lIE9SSV9CQV9TRVNTSU9OX1RJTUVPVVQJKDIwMDApCS8vIG1zCisjZGVmaW5lIFJFQ19CQV9TRVNTSU9OX0lETEVfVElNRU9VVAkoMTAwMCkJLy8gbXMKKworI2RlZmluZSBSRU9SREVSSU5HX1BBQ0tFVF9USU1FT1VUCQkoKDEwMCAqIEhaKS8xMDAwKQkvLyBzeXN0ZW0gdGlja3MgLS0gMTAwIG1zCisjZGVmaW5lIE1BWF9SRU9SREVSSU5HX1BBQ0tFVF9USU1FT1VUCSgoMzAwMCAqIEhaKS8xMDAwKQkvLyBzeXN0ZW0gdGlja3MgLS0gMTAwIG1zCisKKyNkZWZpbmUgUkVTRVRfUkNWX1NFUQkJKDB4RkZGRikKKworc3RhdGljIHZvaWQgYmFfbXBkdV9ibGtfZnJlZShQUlRNUF9BREFQVEVSIHBBZCwgc3RydWN0IHJlb3JkZXJpbmdfbXBkdSAqbXBkdV9ibGspOworCisKK0JBX09SSV9FTlRSWSAqQkFUYWJsZUFsbG9jT3JpRW50cnkoCisJCQkJCQkJCSAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJCQkJCQkJCSAgT1VUIFVTSE9SVCAgICAgICAgICAqSWR4KTsKKworQkFfUkVDX0VOVFJZICpCQVRhYmxlQWxsb2NSZWNFbnRyeSgKKwkJCQkJCQkJICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwkJCQkJCQkJICBPVVQgVVNIT1JUICAgICAgICAgICpJZHgpOworCitWT0lEIEJBT3JpU2Vzc2lvblNldHVwVGltZW91dCgKKyAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCisgICAgSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAorICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKKyAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpOworCitWT0lEIEJBUmVjU2Vzc2lvbklkbGVUaW1lb3V0KAorICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKKyAgICBJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCisgICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAorICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMyk7CisKKworQlVJTERfVElNRVJfRlVOQ1RJT04oQkFPcmlTZXNzaW9uU2V0dXBUaW1lb3V0KTsKK0JVSUxEX1RJTUVSX0ZVTkNUSU9OKEJBUmVjU2Vzc2lvbklkbGVUaW1lb3V0KTsKKworI2RlZmluZSBBTk5PVU5DRV9SRU9SREVSSU5HX1BBQ0tFVChfcEFkLCBfbXBkdV9ibGspCVwKKwkJCUFubm91bmNlX1Jlb3JkZXJpbmdfUGFja2V0KF9wQWQsIF9tcGR1X2Jsayk7CisKK1ZPSUQgQkFfTWF4V2luU2l6ZVJlYXNpZ24oCisJSU4gUFJUTVBfQURBUFRFUglwQWQsCisJSU4gTUFDX1RBQkxFX0VOVFJZICAqcEVudHJ5UGVlciwKKwlPVVQgVUNIQVIJCQkqcFdpblNpemUpCit7CisJVUNIQVIgTWF4U2l6ZTsKKworCisJaWYgKHBBZC0+TUFDVmVyc2lvbiA+PSBSQUxJTktfMjg4M19WRVJTSU9OKSAvLyAzKjMKKwl7CisJCWlmIChwQWQtPk1BQ1ZlcnNpb24gPj0gUkFMSU5LXzMwNzBfVkVSU0lPTikKKwkJeworCQkJaWYgKHBFbnRyeVBlZXItPldlcFN0YXR1cyAhPSBOZGlzODAyXzExRW5jcnlwdGlvbkRpc2FibGVkKQorCQkJCU1heFNpemUgPSA3OyAvLyBmb3Igbm9uLW9wZW4gbW9kZQorCQkJZWxzZQorCQkJCU1heFNpemUgPSAxMzsKKwkJfQorCQllbHNlCisJCQlNYXhTaXplID0gMzE7CisJfQorCWVsc2UgaWYgKHBBZC0+TUFDVmVyc2lvbiA+PSBSQUxJTktfMjg4MEVfVkVSU0lPTikgLy8gMjg4MCBlCisJeworCQlpZiAocEVudHJ5UGVlci0+V2VwU3RhdHVzICE9IE5kaXM4MDJfMTFFbmNyeXB0aW9uRGlzYWJsZWQpCisJCQlNYXhTaXplID0gNzsgLy8gZm9yIG5vbi1vcGVuIG1vZGUKKwkJZWxzZQorCQkJTWF4U2l6ZSA9IDEzOworCX0KKwllbHNlCisJCU1heFNpemUgPSA3OworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiYmE+IFdpbiBTaXplID0gJWQsIE1heCBTaXplID0gJWRcbiIsCisJCQkqcFdpblNpemUsIE1heFNpemUpKTsKKworCWlmICgoKnBXaW5TaXplKSA+IE1heFNpemUpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJiYT4gcmVhc3NpZ24gbWF4IHdpbiBzaXplIGZyb20gJWQgdG8gJWRcbiIsCisJCQkJKnBXaW5TaXplLCBNYXhTaXplKSk7CisKKwkJKnBXaW5TaXplID0gTWF4U2l6ZTsKKwl9Cit9CisKK3ZvaWQgQW5ub3VuY2VfUmVvcmRlcmluZ19QYWNrZXQoSU4gUFJUTVBfQURBUFRFUgkJCXBBZCwKKwkJCQkJCQkJSU4gc3RydWN0IHJlb3JkZXJpbmdfbXBkdQkqbXBkdSkKK3sKKwlQTkRJU19QQUNLRVQgICAgcFBhY2tldDsKKworCXBQYWNrZXQgPSBtcGR1LT5wUGFja2V0OworCisJaWYgKG1wZHUtPmJBTVNEVSkKKwl7CisJCUFTU0VSVCgwKTsKKwkJQkFfUmVvcmRlcl9BTVNEVV9Bbm5ub3VuY2UocEFkLCBwUGFja2V0KTsKKwl9CisJZWxzZQorCXsKKwkJLy8KKwkJLy8gcGFzcyB0aGlzIDgwMi4zIHBhY2tldCB0byB1cHBlciBsYXllciBvciBmb3J3YXJkIHRoaXMgcGFja2V0IHRvIFdNIGRpcmVjdGx5CisJCS8vCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJCUFOTk9VTkNFX09SX0ZPUldBUkRfODAyXzNfUEFDS0VUKHBBZCwgcFBhY2tldCwgUlRNUF9HRVRfUEFDS0VUX0lGKHBQYWNrZXQpKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwl9Cit9CisKKy8qCisgKiBJbnNlcnQgYSByZW9yZGVyaW5nIG1wZHUgaW50byBzb3J0ZWQgbGlua2VkIGxpc3QgYnkgc2VxdWVuY2Ugbm8uCisgKi8KK0JPT0xFQU4gYmFfcmVvcmRlcmluZ19tcGR1X2luc2VydHNvcnRlZChzdHJ1Y3QgcmVvcmRlcmluZ19saXN0ICpsaXN0LCBzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1ICptcGR1KQoreworCisJc3RydWN0IHJlb3JkZXJpbmdfbXBkdSAqKnBwU2NhbiA9ICZsaXN0LT5uZXh0OworCisJd2hpbGUgKCpwcFNjYW4gIT0gTlVMTCkKKwl7CisJCWlmIChTRVFfU01BTExFUigoKnBwU2NhbiktPlNlcXVlbmNlLCBtcGR1LT5TZXF1ZW5jZSwgTUFYU0VRKSkKKwkJeworCQkJcHBTY2FuID0gJigqcHBTY2FuKS0+bmV4dDsKKwkJfQorCQllbHNlIGlmICgoKnBwU2NhbiktPlNlcXVlbmNlID09IG1wZHUtPlNlcXVlbmNlKQorCQl7CisJCQkvKiBnaXZlIHVwIHRoaXMgZHVwbGljYXRlZCBmcmFtZSAqLworCQkJcmV0dXJuKEZBTFNFKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCS8qIGZpbmQgcG9zaXRpb24gKi8KKwkJCWJyZWFrOworCQl9CisJfQorCisJbXBkdS0+bmV4dCA9ICpwcFNjYW47CisJKnBwU2NhbiA9IG1wZHU7CisJbGlzdC0+cWxlbisrOworCXJldHVybiBUUlVFOworfQorCisKKy8qCisgKiBjYWxsZXIgbG9jayBjcml0aWNhbCBzZWN0aW9uIGlmIG5lY2Vzc2FyeQorICovCitzdGF0aWMgaW5saW5lIHZvaWQgYmFfZW5xdWV1ZShzdHJ1Y3QgcmVvcmRlcmluZ19saXN0ICpsaXN0LCBzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1ICptcGR1X2JsaykKK3sKKwlsaXN0LT5xbGVuKys7CisJbXBkdV9ibGstPm5leHQgPSBsaXN0LT5uZXh0OworCWxpc3QtPm5leHQgPSBtcGR1X2JsazsKK30KKworLyoKKyAqIGNhbGxlciBsb2NrIGNyaXRpY2FsIHNlY3Rpb24gaWYgbmVjZXNzYXJ5CisgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IHJlb3JkZXJpbmdfbXBkdSAqIGJhX2RlcXVldWUoc3RydWN0IHJlb3JkZXJpbmdfbGlzdCAqbGlzdCkKK3sKKwlzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1ICptcGR1X2JsayA9IE5VTEw7CisKKwlBU1NFUlQobGlzdCk7CisKKwkJaWYgKGxpc3QtPnFsZW4pCisJCXsKKwkJCWxpc3QtPnFsZW4tLTsKKwkJCW1wZHVfYmxrID0gbGlzdC0+bmV4dDsKKwkJCWlmIChtcGR1X2JsaykKKwkJCXsKKwkJCQlsaXN0LT5uZXh0ID0gbXBkdV9ibGstPm5leHQ7CisJCQkJbXBkdV9ibGstPm5leHQgPSBOVUxMOworCQkJfQorCQl9CisJcmV0dXJuIG1wZHVfYmxrOworfQorCisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHJlb3JkZXJpbmdfbXBkdSAgKmJhX3Jlb3JkZXJpbmdfbXBkdV9kZXF1ZXVlKHN0cnVjdCByZW9yZGVyaW5nX2xpc3QgKmxpc3QpCit7CisJcmV0dXJuKGJhX2RlcXVldWUobGlzdCkpOworfQorCisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHJlb3JkZXJpbmdfbXBkdSAgKmJhX3Jlb3JkZXJpbmdfbXBkdV9wcm9iZShzdHJ1Y3QgcmVvcmRlcmluZ19saXN0ICpsaXN0KQorCXsKKwlBU1NFUlQobGlzdCk7CisKKwkJcmV0dXJuKGxpc3QtPm5leHQpOworCX0KKworCisvKgorICogZnJlZSBhbGwgcmVzb3VyY2UgZm9yIHJlb3JkZXJpbmcgbWVjaGFuaXNtCisgKi8KK3ZvaWQgYmFfcmVvcmRlcmluZ19yZXNvdXJjZV9yZWxlYXNlKFBSVE1QX0FEQVBURVIgcEFkKQoreworCUJBX1RBQkxFICAgICAgICAqVGFiOworCVBCQV9SRUNfRU5UUlkgICBwQkFFbnRyeTsKKwlzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1ICptcGR1X2JsazsKKwlpbnQgaTsKKworCVRhYiA9ICZwQWQtPkJBVGFibGU7CisKKwkvKiBJLiAgcmVsZWFzZSBhbGwgcGVuZGluZyByZW9yZGVyaW5nIHBhY2tldCAqLworCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+QkFUYWJMb2NrKTsKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0xFTl9PRl9CQV9SRUNfVEFCTEU7IGkrKykKKwl7CisJCXBCQUVudHJ5ID0gJlRhYi0+QkFSZWNFbnRyeVtpXTsKKwkJaWYgKHBCQUVudHJ5LT5SRUNfQkFfU3RhdHVzICE9IFJlY2lwaWVudF9OT05FKQorCQl7CisJCQl3aGlsZSAoKG1wZHVfYmxrID0gYmFfcmVvcmRlcmluZ19tcGR1X2RlcXVldWUoJnBCQUVudHJ5LT5saXN0KSkpCisJCQl7CisJCQkJQVNTRVJUKG1wZHVfYmxrLT5wUGFja2V0KTsKKwkJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgbXBkdV9ibGstPnBQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCQkJCWJhX21wZHVfYmxrX2ZyZWUocEFkLCBtcGR1X2Jsayk7CisJCQl9CisJCX0KKwl9CisJTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5CQVRhYkxvY2spOworCisJQVNTRVJUKHBCQUVudHJ5LT5saXN0LnFsZW4gPT0gMCk7CisJLyogSUkuIGZyZWUgbWVtb3J5IG9mIHJlb3JkZXJpbmcgbXBkdSB0YWJsZSAqLworCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+bXBkdV9ibGtfcG9vbC5sb2NrKTsKKwlvc19mcmVlX21lbShwQWQsIHBBZC0+bXBkdV9ibGtfcG9vbC5tZW0pOworCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+bXBkdV9ibGtfcG9vbC5sb2NrKTsKK30KKworCisKKy8qCisgKiBBbGxvY2F0ZSBhbGwgcmVzb3VyY2UgZm9yIHJlb3JkZXJpbmcgbWVjaGFuaXNtCisgKi8KK0JPT0xFQU4gYmFfcmVvcmRlcmluZ19yZXNvdXJjZV9pbml0KFBSVE1QX0FEQVBURVIgcEFkLCBpbnQgbnVtKQoreworCWludCAgICAgaTsKKwlQVUNIQVIgIG1lbTsKKwlzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1ICptcGR1X2JsazsKKwlzdHJ1Y3QgcmVvcmRlcmluZ19saXN0ICpmcmVlbGlzdDsKKworCS8qIGFsbG9jYXRlIHNwaW5sb2NrICovCisJTmRpc0FsbG9jYXRlU3BpbkxvY2soJnBBZC0+bXBkdV9ibGtfcG9vbC5sb2NrKTsKKworCS8qIGluaXRpYWxpemUgZnJlZWxpc3QgKi8KKwlmcmVlbGlzdCA9ICZwQWQtPm1wZHVfYmxrX3Bvb2wuZnJlZWxpc3Q7CisJZnJlZWxpc3QtPm5leHQgPSBOVUxMOworCWZyZWVsaXN0LT5xbGVuID0gMDsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFsbG9jYXRlICVkIG1lbW9yeSBmb3IgQkEgcmVvcmRlcmluZ1xuIiwgKFVJTlQzMikobnVtKnNpemVvZihzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1KSkpKTsKKworCS8qIGFsbG9jYXRlIG51bWJlciBvZiBtcGR1X2JsayBtZW1vcnkgKi8KKwlvc19hbGxvY19tZW0ocEFkLCAoUFVDSEFSICopJm1lbSwgKG51bSpzaXplb2Yoc3RydWN0IHJlb3JkZXJpbmdfbXBkdSkpKTsKKworCXBBZC0+bXBkdV9ibGtfcG9vbC5tZW0gPSBtZW07CisKKwlpZiAobWVtID09IE5VTEwpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJDYW4ndCBBbGxvY2F0ZSBNZW1vcnkgZm9yIEJBIFJlb3JkZXJpbmdcbiIpKTsKKwkJcmV0dXJuKEZBTFNFKTsKKwl9CisKKwkvKiBidWlsZCBtcGR1X2JsayBmcmVlIGxpc3QgKi8KKwlmb3IgKGk9MDsgaTxudW07IGkrKykKKwl7CisJCS8qIGdldCBtcGR1X2JsayAqLworCQltcGR1X2JsayA9IChzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1ICopIG1lbTsKKwkJLyogaW5pdGlhbCBtcGR1X2JsayAqLworCQlOZGlzWmVyb01lbW9yeShtcGR1X2Jsaywgc2l6ZW9mKHN0cnVjdCByZW9yZGVyaW5nX21wZHUpKTsKKwkJLyogbmV4dCBtcGR1X2JsayAqLworCQltZW0gKz0gc2l6ZW9mKHN0cnVjdCByZW9yZGVyaW5nX21wZHUpOworCQkvKiBpbnNlcnQgbXBkdV9ibGsgaW50byBmcmVlbGlzdCAqLworCQliYV9lbnF1ZXVlKGZyZWVsaXN0LCBtcGR1X2Jsayk7CisJfQorCisJcmV0dXJuKFRSVUUpOworfQorCisvL3N0YXRpYyBpbnQgYmxrX2NvdW50PTA7IC8vIHNhbXBsZSB0YWtlIG9mZiwgbm8gdXNlCisKK3N0YXRpYyBzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1ICpiYV9tcGR1X2Jsa19hbGxvYyhQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1ICptcGR1X2JsazsKKworCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+bXBkdV9ibGtfcG9vbC5sb2NrKTsKKwltcGR1X2JsayA9IGJhX2RlcXVldWUoJnBBZC0+bXBkdV9ibGtfcG9vbC5mcmVlbGlzdCk7CisJaWYgKG1wZHVfYmxrKQorCXsKKy8vCQlibGtfY291bnQrKzsKKwkJLyogcmVzZXQgbXBkdV9ibGsgKi8KKwkJTmRpc1plcm9NZW1vcnkobXBkdV9ibGssIHNpemVvZihzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1KSk7CisJfQorCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+bXBkdV9ibGtfcG9vbC5sb2NrKTsKKwlyZXR1cm4gbXBkdV9ibGs7Cit9CisKK3N0YXRpYyB2b2lkIGJhX21wZHVfYmxrX2ZyZWUoUFJUTVBfQURBUFRFUiBwQWQsIHN0cnVjdCByZW9yZGVyaW5nX21wZHUgKm1wZHVfYmxrKQoreworCUFTU0VSVChtcGR1X2Jsayk7CisKKwlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPm1wZHVfYmxrX3Bvb2wubG9jayk7CisvLwlibGtfY291bnQtLTsKKwliYV9lbnF1ZXVlKCZwQWQtPm1wZHVfYmxrX3Bvb2wuZnJlZWxpc3QsIG1wZHVfYmxrKTsKKwlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPm1wZHVfYmxrX3Bvb2wubG9jayk7Cit9CisKKworc3RhdGljIFVTSE9SVCBiYV9pbmRpY2F0ZV9yZW9yZGVyaW5nX21wZHVzX2luX29yZGVyKAorCQkJCQkJCQkJCQkJICAgSU4gUFJUTVBfQURBUFRFUiAgICBwQWQsCisJCQkJCQkJCQkJCQkgICBJTiBQQkFfUkVDX0VOVFJZICAgIHBCQUVudHJ5LAorCQkJCQkJCQkJCQkJICAgSU4gVVNIT1JUICAgICAgICAgICBTdGFydFNlcSkKK3sKKwlzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1ICptcGR1X2JsazsKKwlVU0hPUlQgIExhc3RJbmRTZXEgPSBSRVNFVF9SQ1ZfU0VROworCisJTmRpc0FjcXVpcmVTcGluTG9jaygmcEJBRW50cnktPlJ4UmVSaW5nTG9jayk7CisKKwl3aGlsZSAoKG1wZHVfYmxrID0gYmFfcmVvcmRlcmluZ19tcGR1X3Byb2JlKCZwQkFFbnRyeS0+bGlzdCkpKQorCQl7CisJCQkvKiBmaW5kIGluLW9yZGVyIGZyYW1lICovCisJCWlmICghU0VRX1NURVBPTkUobXBkdV9ibGstPlNlcXVlbmNlLCBTdGFydFNlcSwgTUFYU0VRKSkKKwkJCXsKKwkJCQlicmVhazsKKwkJCX0KKwkJCS8qIGRlcXVldWUgaW4tb3JkZXIgZnJhbWUgZnJvbSByZW9kZXJpbmcgbGlzdCAqLworCQkJbXBkdV9ibGsgPSBiYV9yZW9yZGVyaW5nX21wZHVfZGVxdWV1ZSgmcEJBRW50cnktPmxpc3QpOworCQkJLyogcGFzcyB0aGlzIGZyYW1lIHVwICovCisJCUFOTk9VTkNFX1JFT1JERVJJTkdfUEFDS0VUKHBBZCwgbXBkdV9ibGspOworCQkvKiBtb3ZlIHRvIG5leHQgc2VxdWVuY2UgKi8KKwkJCVN0YXJ0U2VxID0gbXBkdV9ibGstPlNlcXVlbmNlOworCQlMYXN0SW5kU2VxID0gU3RhcnRTZXE7CisJCS8qIGZyZWUgbXBkdV9ibGsgKi8KKwkJCWJhX21wZHVfYmxrX2ZyZWUocEFkLCBtcGR1X2Jsayk7CisJfQorCisJTmRpc1JlbGVhc2VTcGluTG9jaygmcEJBRW50cnktPlJ4UmVSaW5nTG9jayk7CisKKwkvKiB1cGRhdGUgbGFzdCBpbmRpY2F0ZWQgc2VxdWVuY2UgKi8KKwlyZXR1cm4gTGFzdEluZFNlcTsKK30KKworc3RhdGljIHZvaWQgYmFfaW5kaWNhdGVfcmVvcmRlcmluZ19tcGR1c19sZV9zZXEoCisJCQkJCQkJCQkJCSAgIElOIFBSVE1QX0FEQVBURVIgICAgcEFkLAorCQkJCQkJCQkJCQkgICBJTiBQQkFfUkVDX0VOVFJZICAgIHBCQUVudHJ5LAorCQkJCQkJCQkJCQkgICBJTiBVU0hPUlQgICAgICAgICAgIFNlcXVlbmNlKQoreworCXN0cnVjdCByZW9yZGVyaW5nX21wZHUgKm1wZHVfYmxrOworCisJTmRpc0FjcXVpcmVTcGluTG9jaygmcEJBRW50cnktPlJ4UmVSaW5nTG9jayk7CisJd2hpbGUgKChtcGR1X2JsayA9IGJhX3Jlb3JkZXJpbmdfbXBkdV9wcm9iZSgmcEJBRW50cnktPmxpc3QpKSkKKwkJeworCQkJLyogZmluZCBpbi1vcmRlciBmcmFtZSAqLworCQlpZiAoKG1wZHVfYmxrLT5TZXF1ZW5jZSA9PSBTZXF1ZW5jZSkgfHwgU0VRX1NNQUxMRVIobXBkdV9ibGstPlNlcXVlbmNlLCBTZXF1ZW5jZSwgTUFYU0VRKSkKKwkJeworCQkJLyogZGVxdWV1ZSBpbi1vcmRlciBmcmFtZSBmcm9tIHJlb2RlcmluZyBsaXN0ICovCisJCQltcGR1X2JsayA9IGJhX3Jlb3JkZXJpbmdfbXBkdV9kZXF1ZXVlKCZwQkFFbnRyeS0+bGlzdCk7CisJCQkvKiBwYXNzIHRoaXMgZnJhbWUgdXAgKi8KKwkJCUFOTk9VTkNFX1JFT1JERVJJTkdfUEFDS0VUKHBBZCwgbXBkdV9ibGspOworCQkJLyogZnJlZSBtcGR1X2JsayAqLworCQkJYmFfbXBkdV9ibGtfZnJlZShwQWQsIG1wZHVfYmxrKTsKKwkJfQorCQllbHNlCisJCQl7CisJCQkJYnJlYWs7CisJCQl9CisJfQorCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBCQUVudHJ5LT5SeFJlUmluZ0xvY2spOworfQorCisKK3N0YXRpYyB2b2lkIGJhX3JlZnJlc2hfcmVvcmRlcmluZ19tcGR1cygKKwkJCQkJCQkJCSAgIElOIFBSVE1QX0FEQVBURVIgICAgcEFkLAorCQkJCQkJCQkJICAgUEJBX1JFQ19FTlRSWSAgICAgICBwQkFFbnRyeSkKK3sKKwlzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1ICptcGR1X2JsazsKKworCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBCQUVudHJ5LT5SeFJlUmluZ0xvY2spOworCisJCQkvKiBkZXF1ZXVlIGluLW9yZGVyIGZyYW1lIGZyb20gcmVvZGVyaW5nIGxpc3QgKi8KKwl3aGlsZSAoKG1wZHVfYmxrID0gYmFfcmVvcmRlcmluZ19tcGR1X2RlcXVldWUoJnBCQUVudHJ5LT5saXN0KSkpCisJeworCQkJLyogcGFzcyB0aGlzIGZyYW1lIHVwICovCisJCUFOTk9VTkNFX1JFT1JERVJJTkdfUEFDS0VUKHBBZCwgbXBkdV9ibGspOworCisJCXBCQUVudHJ5LT5MYXN0SW5kU2VxID0gbXBkdV9ibGstPlNlcXVlbmNlOworCQkJYmFfbXBkdV9ibGtfZnJlZShwQWQsIG1wZHVfYmxrKTsKKworCQkvKiB1cGRhdGUgbGFzdCBpbmRpY2F0ZWQgc2VxdWVuY2UgKi8KKwl9CisJQVNTRVJUKHBCQUVudHJ5LT5saXN0LnFsZW4gPT0gMCk7CisJcEJBRW50cnktPkxhc3RJbmRTZXEgPSBSRVNFVF9SQ1ZfU0VROworCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBCQUVudHJ5LT5SeFJlUmluZ0xvY2spOworfQorCisKKy8vc3RhdGljCit2b2lkIGJhX2ZsdXNoX3Jlb3JkZXJpbmdfdGltZW91dF9tcGR1cygKKwkJCQkJCQkJCUlOIFBSVE1QX0FEQVBURVIgICAgcEFkLAorCQkJCQkJCQkJSU4gUEJBX1JFQ19FTlRSWSAgICBwQkFFbnRyeSwKKwkJCQkJCQkJCUlOIFVMT05HICAgICAgICAgICAgTm93MzIpCisKK3sKKwlVU0hPUlQgU2VxdWVuY2U7CisKKy8vCWlmICgoUlRNUF9USU1FX0FGVEVSKCh1bnNpZ25lZCBsb25nKU5vdzMyLCAodW5zaWduZWQgbG9uZykocEJBRW50cnktPkxhc3RJbmRTZXFBdFRpbWVyK1JFT1JERVJJTkdfUEFDS0VUX1RJTUVPVVQpKSAmJgorLy8JCSAocEJBRW50cnktPmxpc3QucWxlbiA+ICgocEJBRW50cnktPkJBV2luU2l6ZSo3KS84KSkpIC8vfHwKKy8vCQkoUlRNUF9USU1FX0FGVEVSKCh1bnNpZ25lZCBsb25nKU5vdzMyLCAodW5zaWduZWQgbG9uZykocEJBRW50cnktPkxhc3RJbmRTZXFBdFRpbWVyKygxMCpSRU9SREVSSU5HX1BBQ0tFVF9USU1FT1VUKSkpICYmCisvLwkJIChwQkFFbnRyeS0+bGlzdC5xbGVuID4gKHBCQUVudHJ5LT5CQVdpblNpemUvOCkpKQorCWlmIChSVE1QX1RJTUVfQUZURVIoKHVuc2lnbmVkIGxvbmcpTm93MzIsICh1bnNpZ25lZCBsb25nKShwQkFFbnRyeS0+TGFzdEluZFNlcUF0VGltZXIrKE1BWF9SRU9SREVSSU5HX1BBQ0tFVF9USU1FT1VULzYpKSkKKwkJICYmKHBCQUVudHJ5LT5saXN0LnFsZW4gPiAxKQorCQkpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoInRpbWVvdXRbJWRdICglMDhseC0lMDhseCA9ICVkID4gJWQpOiAleCwgZmx1c2ggYWxsIVxuICIsIHBCQUVudHJ5LT5saXN0LnFsZW4sIE5vdzMyLCAocEJBRW50cnktPkxhc3RJbmRTZXFBdFRpbWVyKSwKKwkJCSAgIChpbnQpKChsb25nKSBOb3czMiAtIChsb25nKShwQkFFbnRyeS0+TGFzdEluZFNlcUF0VGltZXIpKSwgTUFYX1JFT1JERVJJTkdfUEFDS0VUX1RJTUVPVVQsCisJCQkgICBwQkFFbnRyeS0+TGFzdEluZFNlcSkpOworCQliYV9yZWZyZXNoX3Jlb3JkZXJpbmdfbXBkdXMocEFkLCBwQkFFbnRyeSk7CisJCXBCQUVudHJ5LT5MYXN0SW5kU2VxQXRUaW1lciA9IE5vdzMyOworCX0KKwllbHNlCisJaWYgKFJUTVBfVElNRV9BRlRFUigodW5zaWduZWQgbG9uZylOb3czMiwgKHVuc2lnbmVkIGxvbmcpKHBCQUVudHJ5LT5MYXN0SW5kU2VxQXRUaW1lcisoUkVPUkRFUklOR19QQUNLRVRfVElNRU9VVCkpKQorCQkmJiAocEJBRW50cnktPmxpc3QucWxlbiA+IDApCisJICAgKQorCQl7CisgICAgCQkvLworCQkvLyBmb3JjZSBMYXN0SW5kU2VxIHRvIHNoaWZ0IHRvIExhc3RJbmRTZXErMQorICAgIAkJLy8KKyAgICAJCVNlcXVlbmNlID0gKHBCQUVudHJ5LT5MYXN0SW5kU2VxKzEpICYgTUFYU0VROworICAgIAkJYmFfaW5kaWNhdGVfcmVvcmRlcmluZ19tcGR1c19sZV9zZXEocEFkLCBwQkFFbnRyeSwgU2VxdWVuY2UpOworICAgIAkJcEJBRW50cnktPkxhc3RJbmRTZXFBdFRpbWVyID0gTm93MzI7CisJCQlwQkFFbnRyeS0+TGFzdEluZFNlcSA9IFNlcXVlbmNlOworICAgIAkJLy8KKyAgICAJCS8vIGluZGljYXRlIGluLW9yZGVyIG1wZHVzCisgICAgCQkvLworICAgIAkJU2VxdWVuY2UgPSBiYV9pbmRpY2F0ZV9yZW9yZGVyaW5nX21wZHVzX2luX29yZGVyKHBBZCwgcEJBRW50cnksIFNlcXVlbmNlKTsKKyAgICAJCWlmIChTZXF1ZW5jZSAhPSBSRVNFVF9SQ1ZfU0VRKQorICAgIAkJeworICAgIAkJCXBCQUVudHJ5LT5MYXN0SW5kU2VxID0gU2VxdWVuY2U7CisgICAgCQl9CisKKwl9CisjaWYgMAorCWVsc2UgaWYgKAorCQkJIChSVE1QX1RJTUVfQUZURVIoKHVuc2lnbmVkIGxvbmcpTm93MzIsICh1bnNpZ25lZCBsb25nKShwQkFFbnRyeS0+TGFzdEluZFNlcUF0VGltZXIrKE1BWF9SRU9SREVSSU5HX1BBQ0tFVF9USU1FT1VUKSkpICYmCisJCQkgIChwQkFFbnRyeS0+bGlzdC5xbGVuID4gMSkpCisJCQkpCisJCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJ0aW1lb3V0WyVkXSAoJWx4LSVseCA9ICVkID4gJWQpOiAleFxuICIsIHBCQUVudHJ5LT5saXN0LnFsZW4sIE5vdzMyLCAocEJBRW50cnktPkxhc3RJbmRTZXFBdFRpbWVyKSwKKwkJCSAgIChpbnQpKChsb25nKSBOb3czMiAtIChsb25nKShwQkFFbnRyeS0+TGFzdEluZFNlcUF0VGltZXIpKSwgTUFYX1JFT1JERVJJTkdfUEFDS0VUX1RJTUVPVVQsCisJCQkgICBwQkFFbnRyeS0+TGFzdEluZFNlcSkpOworCQliYV9yZWZyZXNoX3Jlb3JkZXJpbmdfbXBkdXMocEFkLCBwQkFFbnRyeSk7CisJCQlwQkFFbnRyeS0+TGFzdEluZFNlcUF0VGltZXIgPSBOb3czMjsKKwkJCQl9CisjZW5kaWYKK30KKworCisvKgorICogZ2VuZXJhdGUgQUREQkEgcmVxdWVzdCB0bworICogc2V0IHVwIEJBIGFncmVlbWVudAorICovCitWT0lEIEJBT3JpU2Vzc2lvblNldFVwKAorCQkJCQkgIElOIFBSVE1QX0FEQVBURVIgICAgcEFkLAorCQkJCQkgIElOIE1BQ19UQUJMRV9FTlRSWSAgKnBFbnRyeSwKKwkJCQkJICBJTiBVQ0hBUiAgICAgICAgICAgIFRJRCwKKwkJCQkJICBJTiBVU0hPUlQgICAgICAgICAgIFRpbWVPdXQsCisJCQkJCSAgSU4gVUxPTkcgICAgICAgICAgICBEZWxheVRpbWUsCisJCQkJCSAgSU4gQk9PTEVBTiAgICAgICAgICBpc0ZvcmNlZCkKKworeworCS8vTUxNRV9BRERCQV9SRVFfU1RSVUNUCUFkZGJhUmVxOworCUJBX09SSV9FTlRSWSAgICAgICAgICAgICpwQkFFbnRyeSA9IE5VTEw7CisJVVNIT1JUICAgICAgICAgICAgICAgICAgSWR4OworCUJPT0xFQU4gICAgICAgICAgICAgICAgIENhbmNlbGxlZDsKKworCWlmICgocEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkF1dG9CQSAhPSBUUlVFKSAgJiYgIChpc0ZvcmNlZCA9PSBGQUxTRSkpCisJCXJldHVybjsKKworCS8vIGlmIHRoaXMgZW50cnkgaXMgbGltaXRlZCB0byB1c2UgbGVnYWN5IHR4IG1vZGUsIGl0IGRvZXNuJ3QgZ2VuZXJhdGUgQkEuCisJaWYgKFJUTVBTdGFGaXhlZFR4TW9kZShwQWQsIHBFbnRyeSkgIT0gRklYRURfVFhNT0RFX0hUKQorCQlyZXR1cm47CisKKwlpZiAoKHBFbnRyeS0+QkFEZWNsaW5lQml0bWFwICYgKDE8PFRJRCkpICYmIChpc0ZvcmNlZCA9PSBGQUxTRSkpCisJeworCQkvLyB0cnkgYWdhaW4gYWZ0ZXIgMyBzZWNzCisJCURlbGF5VGltZSA9IDMwMDA7CisvLwkJcHJpbnRrKCJEZUNsaW5lIEJBIGZyb20gUGVlclxuIik7CisvLwkJcmV0dXJuOworCX0KKworCisJSWR4ID0gcEVudHJ5LT5CQU9yaVdjaWRBcnJheVtUSURdOworCWlmIChJZHggPT0gMCkKKwl7CisJCS8vIGFsbG9jYXRlIGEgQkEgc2Vzc2lvbgorCQlwQkFFbnRyeSA9IEJBVGFibGVBbGxvY09yaUVudHJ5KHBBZCwgJklkeCk7CisJCWlmIChwQkFFbnRyeSA9PSBOVUxMKQorCQl7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkFEREJBIC0gTWxtZUFEREJBQWN0aW9uKCkgYWxsb2NhdGUgQkEgc2Vzc2lvbiBmYWlsZWQgXG4iKSk7CisJCQlyZXR1cm47CisJCX0KKwl9CisJZWxzZQorCXsKKwkJcEJBRW50cnkgPSZwQWQtPkJBVGFibGUuQkFPcmlFbnRyeVtJZHhdOworCX0KKworCWlmIChwQkFFbnRyeS0+T1JJX0JBX1N0YXR1cyA+PSBPcmlnaW5hdG9yX1dhaXRSZXMpCisJeworCQlyZXR1cm47CisJfQorCisJcEVudHJ5LT5CQU9yaVdjaWRBcnJheVtUSURdID0gSWR4OworCisJLy8gSW5pdGlhbGl6ZSBCQSBzZXNzaW9uCisJcEJBRW50cnktPk9SSV9CQV9TdGF0dXMgPSBPcmlnaW5hdG9yX1dhaXRSZXM7CisJcEJBRW50cnktPldjaWQgPSBwRW50cnktPkFpZDsKKwlwQkFFbnRyeS0+QkFXaW5TaXplID0gcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlJ4QkFXaW5MaW1pdDsKKwlwQkFFbnRyeS0+U2VxdWVuY2UgPSBCQV9PUklfSU5JVF9TRVE7CisJcEJBRW50cnktPlRva2VuID0gMTsJLy8gKDIwMDgtMDEtMjEpIEphbiBMZWUgcmVjb21tZW5kcyBpdCAtIHRoaXMgdG9rZW4gY2FuJ3QgYmUgMAorCXBCQUVudHJ5LT5USUQgPSBUSUQ7CisJcEJBRW50cnktPlRpbWVPdXRWYWx1ZSA9IFRpbWVPdXQ7CisJcEJBRW50cnktPnBBZGFwdGVyID0gcEFkOworCisJaWYgKCEocEVudHJ5LT5UWEJBYml0bWFwICYgKDE8PFRJRCkpKQorCXsKKwkJUlRNUEluaXRUaW1lcihwQWQsICZwQkFFbnRyeS0+T1JJQkFUaW1lciwgR0VUX1RJTUVSX0ZVTkNUSU9OKEJBT3JpU2Vzc2lvblNldHVwVGltZW91dCksIHBCQUVudHJ5LCBGQUxTRSk7CisJfQorCWVsc2UKKwkJUlRNUENhbmNlbFRpbWVyKCZwQkFFbnRyeS0+T1JJQkFUaW1lciwgJkNhbmNlbGxlZCk7CisKKwkvLyBzZXQgdGltZXIgdG8gc2VuZCBBRERCQSByZXF1ZXN0CisJUlRNUFNldFRpbWVyKCZwQkFFbnRyeS0+T1JJQkFUaW1lciwgRGVsYXlUaW1lKTsKK30KKworVk9JRCBCQU9yaVNlc3Npb25BZGQoCisJCQlJTiBQUlRNUF9BREFQVEVSICAgIHBBZCwKKwkJCQkJSU4gTUFDX1RBQkxFX0VOVFJZICAqcEVudHJ5LAorCQkJSU4gUEZSQU1FX0FEREJBX1JTUCBwRnJhbWUpCit7CisJQkFfT1JJX0VOVFJZICAqcEJBRW50cnkgPSBOVUxMOworCUJPT0xFQU4gICAgICAgQ2FuY2VsbGVkOworCVVDSEFSICAgICAgICAgVElEOworCVVTSE9SVCAgICAgICAgSWR4OworCVBVQ0hBUiAgICAgICAgICBwT3V0QnVmZmVyMiA9IE5VTEw7CisJTkRJU19TVEFUVVMgICAgIE5TdGF0dXM7CisJVUxPTkcgICAgICAgICAgIEZyYW1lTGVuOworCUZSQU1FX0JBUiAgICAgICBGcmFtZUJhcjsKKworCVRJRCA9IHBGcmFtZS0+QmFQYXJtLlRJRDsKKwlJZHggPSBwRW50cnktPkJBT3JpV2NpZEFycmF5W1RJRF07CisJcEJBRW50cnkgPSZwQWQtPkJBVGFibGUuQkFPcmlFbnRyeVtJZHhdOworCisJLy8gU3RhcnQgZmlsbCBpbiBwYXJhbWV0ZXJzLgorCWlmICgoSWR4ICE9MCkgJiYgKHBCQUVudHJ5LT5USUQgPT0gVElEKSAmJiAocEJBRW50cnktPk9SSV9CQV9TdGF0dXMgPT0gT3JpZ2luYXRvcl9XYWl0UmVzKSkKKwl7CisJCXBCQUVudHJ5LT5CQVdpblNpemUgPSBtaW4ocEJBRW50cnktPkJBV2luU2l6ZSwgKChVQ0hBUilwRnJhbWUtPkJhUGFybS5CdWZTaXplKSk7CisJCUJBX01heFdpblNpemVSZWFzaWduKHBBZCwgcEVudHJ5LCAmcEJBRW50cnktPkJBV2luU2l6ZSk7CisKKwkJcEJBRW50cnktPlRpbWVPdXRWYWx1ZSA9IHBGcmFtZS0+VGltZU91dFZhbHVlOworCQlwQkFFbnRyeS0+T1JJX0JBX1N0YXR1cyA9IE9yaWdpbmF0b3JfRG9uZTsKKwkJLy8gcmVzZXQgc2VxdWVuY2UgbnVtYmVyCisJCXBCQUVudHJ5LT5TZXF1ZW5jZSA9IEJBX09SSV9JTklUX1NFUTsKKwkJLy8gU2V0IEJpdG1hcCBmbGFnLgorCQlwRW50cnktPlRYQkFiaXRtYXAgfD0gKDE8PFRJRCk7CisJCQkJUlRNUENhbmNlbFRpbWVyKCZwQkFFbnRyeS0+T1JJQkFUaW1lciwgJkNhbmNlbGxlZCk7CisKKwkJcEJBRW50cnktPk9SSUJBVGltZXIuVGltZXJWYWx1ZSA9IDA7CS8vcEZyYW1lLT5UaW1lT3V0VmFsdWU7CisKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCIlcyA6IFRYQkFiaXRtYXAgPSAleCwgQkFXaW5TaXplID0gJWQsIFRpbWVPdXQgPSAlbGRcbiIsIF9fZnVuY19fLCBwRW50cnktPlRYQkFiaXRtYXAsCisJCQkJCQkJCSBwQkFFbnRyeS0+QkFXaW5TaXplLCBwQkFFbnRyeS0+T1JJQkFUaW1lci5UaW1lclZhbHVlKSk7CisKKwkJLy8gU0VORCBCQVIgOworCQlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKKwkJaWYgKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJeworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJCQSAtIEJBT3JpU2Vzc2lvbkFkZCgpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWQgXG4iKSk7CisJCQlyZXR1cm47CisJCX0KKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCQlCYXJIZWFkZXJJbml0KHBBZCwgJkZyYW1lQmFyLCBwQWQtPk1hY1RhYi5Db250ZW50W3BCQUVudHJ5LT5XY2lkXS5BZGRyLCBwQWQtPkN1cnJlbnRBZGRyZXNzKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCQlGcmFtZUJhci5TdGFydGluZ1NlcS5maWVsZC5GcmFnTnVtID0gMDsJLy8gbWFrZSBzdXJlIHNlcXVlbmNlIG5vdCBjbGVhciBpbiBERUwgZnVuY3Rpb24uCisJCUZyYW1lQmFyLlN0YXJ0aW5nU2VxLmZpZWxkLlN0YXJ0U2VxID0gcEJBRW50cnktPlNlcXVlbmNlOyAvLyBtYWtlIHN1cmUgc2VxdWVuY2Ugbm90IGNsZWFyIGluIERFTCBmdW5jaXRvbi4KKwkJRnJhbWVCYXIuQmFyQ29udHJvbC5USUQgPSBwQkFFbnRyeS0+VElEOyAvLyBtYWtlIHN1cmUgc2VxdWVuY2Ugbm90IGNsZWFyIGluIERFTCBmdW5jaXRvbi4KKwkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlcjIsICAgICAgICAgICAgICAmRnJhbWVMZW4sCisJCQkJCQkgIHNpemVvZihGUkFNRV9CQVIpLCAgICAgICZGcmFtZUJhciwKKwkJCQkJICBFTkRfT0ZfQVJHUyk7CisJCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgUUlEX0FDX0JFLCBwT3V0QnVmZmVyMiwgRnJhbWVMZW4pOworCQlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIyKTsKKworCisJCWlmIChwQkFFbnRyeS0+T1JJQkFUaW1lci5UaW1lclZhbHVlKQorCQkJUlRNUFNldFRpbWVyKCZwQkFFbnRyeS0+T1JJQkFUaW1lciwgcEJBRW50cnktPk9SSUJBVGltZXIuVGltZXJWYWx1ZSk7IC8vIGluIG1TZWMKKwl9Cit9CisKK0JPT0xFQU4gQkFSZWNTZXNzaW9uQWRkKAorCQkJCQkgICBJTiBQUlRNUF9BREFQVEVSICAgIHBBZCwKKwkJCQkJICAgSU4gTUFDX1RBQkxFX0VOVFJZICAqcEVudHJ5LAorCQkJCQkgICBJTiBQRlJBTUVfQUREQkFfUkVRIHBGcmFtZSkKK3sKKwlCQV9SRUNfRU5UUlkgICAgICAgICAgICAqcEJBRW50cnkgPSBOVUxMOworCUJPT0xFQU4gICAgICAgICAgICAgICAgIFN0YXR1cyA9IFRSVUU7CisJQk9PTEVBTiAgICAgICAgICAgICAgICAgQ2FuY2VsbGVkOworCVVTSE9SVCAgICAgICAgICAgICAgICAgIElkeDsKKwlVQ0hBUiAgICAgICAgICAgICAgICAgICBUSUQ7CisJVUNIQVIgICAgICAgICAgICAgICAgICAgQkFXaW5TaXplOworCS8vVUlOVDMyICAgICAgICAgICAgICAgICAgVmFsdWU7CisJLy9VSU5UICAgICAgICAgICAgICAgICAgICBvZmZzZXQ7CisKKworCUFTU0VSVChwRW50cnkpOworCisJLy8gZmluZCBUSUQKKwlUSUQgPSBwRnJhbWUtPkJhUGFybS5USUQ7CisKKwlCQVdpblNpemUgPSBtaW4oKChVQ0hBUilwRnJhbWUtPkJhUGFybS5CdWZTaXplKSwgKFVDSEFSKXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5SeEJBV2luTGltaXQpOworCisJLy8gSW50ZWwgcGF0Y2gKKwlpZiAoQkFXaW5TaXplID09IDApCisJeworCQlCQVdpblNpemUgPSA2NDsKKwl9CisKKwlJZHggPSBwRW50cnktPkJBUmVjV2NpZEFycmF5W1RJRF07CisKKworCWlmIChJZHggPT0gMCkKKwl7CisJCXBCQUVudHJ5ID0gQkFUYWJsZUFsbG9jUmVjRW50cnkocEFkLCAmSWR4KTsKKwl9CisJZWxzZQorCXsKKwkJcEJBRW50cnkgPSAmcEFkLT5CQVRhYmxlLkJBUmVjRW50cnlbSWR4XTsKKwkJLy8gZmx1c2ggYWxsIHBlbmRpbmcgcmVvcmRlcmluZyBtcGR1cworCQliYV9yZWZyZXNoX3Jlb3JkZXJpbmdfbXBkdXMocEFkLCBwQkFFbnRyeSk7CisJfQorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCIlcyglbGQpOiBJZHggPSAlZCwgQkFXaW5TaXplKHJlcSAlZCkgPSAlZFxuIiwgX19mdW5jX18sIHBBZC0+QkFUYWJsZS5udW1Bc1JlY2lwaWVudCwgSWR4LAorCQkJCQkJCSBwRnJhbWUtPkJhUGFybS5CdWZTaXplLCBCQVdpblNpemUpKTsKKworCS8vIFN0YXJ0IGZpbGwgaW4gcGFyYW1ldGVycy4KKwlpZiAocEJBRW50cnkgIT0gTlVMTCkKKwl7CisJCUFTU0VSVChwQkFFbnRyeS0+bGlzdC5xbGVuID09IDApOworCisJCXBCQUVudHJ5LT5SRUNfQkFfU3RhdHVzID0gUmVjaXBpZW50X0hhbmRsZVJlczsKKwkJcEJBRW50cnktPkJBV2luU2l6ZSA9IEJBV2luU2l6ZTsKKwkJcEJBRW50cnktPldjaWQgPSBwRW50cnktPkFpZDsKKwkJcEJBRW50cnktPlRJRCA9IFRJRDsKKwkJcEJBRW50cnktPlRpbWVPdXRWYWx1ZSA9IHBGcmFtZS0+VGltZU91dFZhbHVlOworCQlwQkFFbnRyeS0+UkVDX0JBX1N0YXR1cyA9IFJlY2lwaWVudF9BY2NlcHQ7CisJCS8vIGluaXRpYWwgc2VxdWVuY2UgbnVtYmVyCisJCXBCQUVudHJ5LT5MYXN0SW5kU2VxID0gUkVTRVRfUkNWX1NFUTsgLy9wRnJhbWUtPkJhU3RhcnRTZXEuZmllbGQuU3RhcnRTZXE7CisKKwkJcHJpbnRrKCJTdGFydCBTZXEgPSAlMDh4XG4iLCAgcEZyYW1lLT5CYVN0YXJ0U2VxLmZpZWxkLlN0YXJ0U2VxKTsKKworCQlpZiAocEVudHJ5LT5SWEJBYml0bWFwICYgKDE8PFRJRCkpCisJCXsKKwkJCVJUTVBDYW5jZWxUaW1lcigmcEJBRW50cnktPlJFQ0JBVGltZXIsICZDYW5jZWxsZWQpOworCQl9CisJCWVsc2UKKwkJeworCQkJUlRNUEluaXRUaW1lcihwQWQsICZwQkFFbnRyeS0+UkVDQkFUaW1lciwgR0VUX1RJTUVSX0ZVTkNUSU9OKEJBUmVjU2Vzc2lvbklkbGVUaW1lb3V0KSwgcEJBRW50cnksIFRSVUUpOworCQl9CisKKyNpZiAwCS8vIGZvciBkZWJ1Z2dpbmcKKwkJUlRNUFNldFRpbWVyKCZwQkFFbnRyeS0+UkVDQkFUaW1lciwgUkVDX0JBX1NFU1NJT05fSURMRV9USU1FT1VUKTsKKyNlbmRpZgorCisJCS8vIFNldCBCaXRtYXAgZmxhZy4KKwkJcEVudHJ5LT5SWEJBYml0bWFwIHw9ICgxPDxUSUQpOworCQlwRW50cnktPkJBUmVjV2NpZEFycmF5W1RJRF0gPSBJZHg7CisKKwkJcEVudHJ5LT5CQURlY2xpbmVCaXRtYXAgJj0gfigxPDxUSUQpOworCisJCS8vIFNldCBCQSBzZXNzaW9uIG1hc2sgaW4gV0NJRCB0YWJsZS4KKwkJUlQyOFhYX0FERF9CQV9TRVNTSU9OX1RPX0FTSUMocEFkLCBwRW50cnktPkFpZCwgVElEKTsKKworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIk1BQ0VudHJ5WyVkXVJYQkFiaXRtYXAgPSAweCV4LiBCQVJlY1djaWRBcnJheT0lZFxuIiwKKwkJCQlwRW50cnktPkFpZCwgcEVudHJ5LT5SWEJBYml0bWFwLCBwRW50cnktPkJBUmVjV2NpZEFycmF5W1RJRF0pKTsKKwl9CisJZWxzZQorCXsKKwkJU3RhdHVzID0gRkFMU0U7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQ2FuJ3QgQWNjZXB0IEFEREJBIGZvciAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCBUSUQgPSAlZFxuIiwKKwkJCQlQUklOVF9NQUMocEVudHJ5LT5BZGRyKSwgVElEKSk7CisJfQorCXJldHVybihTdGF0dXMpOworfQorCisKK0JBX1JFQ19FTlRSWSAqQkFUYWJsZUFsbG9jUmVjRW50cnkoCisJCQkJCQkJCSAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJCQkJCQkJCSAgT1VUIFVTSE9SVCAgICAgICAgICAqSWR4KQoreworCWludCAgICAgICAgICAgICBpOworCUJBX1JFQ19FTlRSWSAgICAqcEJBRW50cnkgPSBOVUxMOworCisKKwlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPkJBVGFiTG9jayk7CisKKwlpZiAocEFkLT5CQVRhYmxlLm51bUFzUmVjaXBpZW50ID49IE1BWF9CQVJFQ0lfU0VTU0lPTikKKwl7CisJCXByaW50aygiQkEgUmVjaXBlaW50IFNlc3Npb24gKCVsZCkgPiAlZFxuIiwgcEFkLT5CQVRhYmxlLm51bUFzUmVjaXBpZW50LAorCQkJTUFYX0JBUkVDSV9TRVNTSU9OKTsKKwkJZ290byBkb25lOworCX0KKworCS8vIHJlc2VydmUgaWR4IDAgdG8gaWRlbnRpZnkgQkFXY2lkQXJyYXlbVElEXSBhcyBlbXB0eQorCWZvciAoaT0xOyBpIDwgTUFYX0xFTl9PRl9CQV9SRUNfVEFCTEU7IGkrKykKKwl7CisJCXBCQUVudHJ5ID0mcEFkLT5CQVRhYmxlLkJBUmVjRW50cnlbaV07CisJCWlmICgocEJBRW50cnktPlJFQ19CQV9TdGF0dXMgPT0gUmVjaXBpZW50X05PTkUpKQorCQl7CisJCQkvLyBnZXQgb25lCisJCQlwQWQtPkJBVGFibGUubnVtQXNSZWNpcGllbnQrKzsKKwkJCXBCQUVudHJ5LT5SRUNfQkFfU3RhdHVzID0gUmVjaXBpZW50X1VTRUQ7CisJCQkqSWR4ID0gaTsKKwkJCWJyZWFrOworCQl9CisJfQorCitkb25lOgorCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+QkFUYWJMb2NrKTsKKwlyZXR1cm4gcEJBRW50cnk7Cit9CisKK0JBX09SSV9FTlRSWSAqQkFUYWJsZUFsbG9jT3JpRW50cnkoCisJCQkJCQkJCSAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJCQkJCQkJCSAgT1VUIFVTSE9SVCAgICAgICAgICAqSWR4KQoreworCWludCAgICAgICAgICAgICBpOworCUJBX09SSV9FTlRSWSAgICAqcEJBRW50cnkgPSBOVUxMOworCisJTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5CQVRhYkxvY2spOworCisJaWYgKHBBZC0+QkFUYWJsZS5udW1Bc09yaWdpbmF0b3IgPj0gKE1BWF9MRU5fT0ZfQkFfT1JJX1RBQkxFKSkKKwl7CisJCWdvdG8gZG9uZTsKKwl9CisKKwkvLyByZXNlcnZlIGlkeCAwIHRvIGlkZW50aWZ5IEJBV2NpZEFycmF5W1RJRF0gYXMgZW1wdHkKKwlmb3IgKGk9MTsgaTxNQVhfTEVOX09GX0JBX09SSV9UQUJMRTsgaSsrKQorCXsKKwkJcEJBRW50cnkgPSZwQWQtPkJBVGFibGUuQkFPcmlFbnRyeVtpXTsKKwkJaWYgKChwQkFFbnRyeS0+T1JJX0JBX1N0YXR1cyA9PSBPcmlnaW5hdG9yX05PTkUpKQorCQl7CisJCQkvLyBnZXQgb25lCisJCQlwQWQtPkJBVGFibGUubnVtQXNPcmlnaW5hdG9yKys7CisJCQlwQkFFbnRyeS0+T1JJX0JBX1N0YXR1cyA9IE9yaWdpbmF0b3JfVVNFRDsKKwkJCXBCQUVudHJ5LT5wQWRhcHRlciA9IHBBZDsKKwkJCSpJZHggPSBpOworCQkJYnJlYWs7CisJCX0KKwl9CisKK2RvbmU6CisJTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5CQVRhYkxvY2spOworCXJldHVybiBwQkFFbnRyeTsKK30KKworCitWT0lEIEJBVGFibGVGcmVlT3JpRW50cnkoCisJCQkJCQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwkJCQkJCUlOICBVTE9ORyAgICAgICAgICAgSWR4KQoreworCUJBX09SSV9FTlRSWSAgICAqcEJBRW50cnkgPSBOVUxMOworCU1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5OworCisKKwlpZiAoKElkeCA9PSAwKSB8fCAoSWR4ID49IE1BWF9MRU5fT0ZfQkFfT1JJX1RBQkxFKSkKKwkJcmV0dXJuOworCisJcEJBRW50cnkgPSZwQWQtPkJBVGFibGUuQkFPcmlFbnRyeVtJZHhdOworCisJaWYgKHBCQUVudHJ5LT5PUklfQkFfU3RhdHVzICE9IE9yaWdpbmF0b3JfTk9ORSkKKwl7CisJCXBFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W3BCQUVudHJ5LT5XY2lkXTsKKwkJcEVudHJ5LT5CQU9yaVdjaWRBcnJheVtwQkFFbnRyeS0+VElEXSA9IDA7CisKKworCQlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPkJBVGFiTG9jayk7CisJCWlmIChwQkFFbnRyeS0+T1JJX0JBX1N0YXR1cyA9PSBPcmlnaW5hdG9yX0RvbmUpCisJCXsKKwkJIAlwRW50cnktPlRYQkFiaXRtYXAgJj0gKH4oMTw8KHBCQUVudHJ5LT5USUQpICkpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQkFUYWJsZUZyZWVPcmlFbnRyeSBudW1Bc09yaWdpbmF0b3I9ICVsZFxuIiwgcEFkLT5CQVRhYmxlLm51bUFzUmVjaXBpZW50KSk7CisJCQkvLyBFcmFzZSBCaXRtYXAgZmxhZy4KKwkJfQorCisJCUFTU0VSVChwQWQtPkJBVGFibGUubnVtQXNPcmlnaW5hdG9yICE9IDApOworCisJCXBBZC0+QkFUYWJsZS5udW1Bc09yaWdpbmF0b3IgLT0gMTsKKworCQlwQkFFbnRyeS0+T1JJX0JBX1N0YXR1cyA9IE9yaWdpbmF0b3JfTk9ORTsKKwkJcEJBRW50cnktPlRva2VuID0gMDsKKwkJTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5CQVRhYkxvY2spOworCX0KK30KKworCitWT0lEIEJBVGFibGVGcmVlUmVjRW50cnkoCisJCQkJCQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwkJCQkJCUlOICBVTE9ORyAgICAgICAgICAgSWR4KQoreworCUJBX1JFQ19FTlRSWSAgICAqcEJBRW50cnkgPSBOVUxMOworCU1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5OworCisKKwlpZiAoKElkeCA9PSAwKSB8fCAoSWR4ID49IE1BWF9MRU5fT0ZfQkFfUkVDX1RBQkxFKSkKKwkJcmV0dXJuOworCisJcEJBRW50cnkgPSZwQWQtPkJBVGFibGUuQkFSZWNFbnRyeVtJZHhdOworCisJaWYgKHBCQUVudHJ5LT5SRUNfQkFfU3RhdHVzICE9IFJlY2lwaWVudF9OT05FKQorCXsKKwkJcEVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbcEJBRW50cnktPldjaWRdOworCQlwRW50cnktPkJBUmVjV2NpZEFycmF5W3BCQUVudHJ5LT5USURdID0gMDsKKworCQlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPkJBVGFiTG9jayk7CisKKwkJQVNTRVJUKHBBZC0+QkFUYWJsZS5udW1Bc1JlY2lwaWVudCAhPSAwKTsKKworCQlwQWQtPkJBVGFibGUubnVtQXNSZWNpcGllbnQgLT0gMTsKKworCQlwQkFFbnRyeS0+UkVDX0JBX1N0YXR1cyA9IFJlY2lwaWVudF9OT05FOworCQlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPkJBVGFiTG9jayk7CisJfQorfQorCisKK1ZPSUQgQkFPcmlTZXNzaW9uVGVhckRvd24oCisJCQkJCQkgSU4gT1VUICBQUlRNUF9BREFQVEVSICAgcEFkLAorCQkJCQkJIElOICAgICAgVUNIQVIgICAgICAgICAgIFdjaWQsCisJCQkJCQkgSU4gICAgICBVQ0hBUiAgICAgICAgICAgVElELAorCQkJCQkJIElOICAgICAgQk9PTEVBTiAgICAgICAgIGJQYXNzaXZlLAorCQkJCQkJIElOICAgICAgQk9PTEVBTiAgICAgICAgIGJGb3JjZVNlbmQpCit7CisJVUxPTkcgICAgICAgICAgIElkeCA9IDA7CisJQkFfT1JJX0VOVFJZICAgICpwQkFFbnRyeTsKKwlCT09MRUFOICAgICAgICAgQ2FuY2VsbGVkOworCisJaWYgKFdjaWQgPj0gTUFYX0xFTl9PRl9NQUNfVEFCTEUpCisJeworCQlyZXR1cm47CisJfQorCisJLy8KKwkvLyBMb2NhdGUgY29ycmVzcG9uZGluZyBCQSBPcmlnaW5hdG9yIEVudHJ5IGluIEJBIFRhYmxlIHdpdGggdGhlIChwQWRkcixUSUQpLgorCS8vCisJSWR4ID0gcEFkLT5NYWNUYWIuQ29udGVudFtXY2lkXS5CQU9yaVdjaWRBcnJheVtUSURdOworCWlmICgoSWR4ID09IDApIHx8IChJZHggPj0gTUFYX0xFTl9PRl9CQV9PUklfVEFCTEUpKQorCXsKKwkJaWYgKGJGb3JjZVNlbmQgPT0gVFJVRSkKKwkJeworCQkJLy8gZm9yY2Ugc2VuZCBzcGVjaWZpZWQgVElEIERlbEJBCisJCQlNTE1FX0RFTEJBX1JFUV9TVFJVQ1QgICBEZWxiYVJlcTsKKwkJCU1MTUVfUVVFVUVfRUxFTSAqRWxlbSA9IChNTE1FX1FVRVVFX0VMRU0gKikga21hbGxvYyhzaXplb2YoTUxNRV9RVUVVRV9FTEVNKSwgTUVNX0FMTE9DX0ZMQUcpOworCisJCQlOZGlzWmVyb01lbW9yeSgmRGVsYmFSZXEsIHNpemVvZihEZWxiYVJlcSkpOworCQkJTmRpc1plcm9NZW1vcnkoRWxlbSwgc2l6ZW9mKE1MTUVfUVVFVUVfRUxFTSkpOworCisJCQlDT1BZX01BQ19BRERSKERlbGJhUmVxLkFkZHIsIHBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0uQWRkcik7CisJCQlEZWxiYVJlcS5XY2lkID0gV2NpZDsKKwkJCURlbGJhUmVxLlRJRCA9IFRJRDsKKwkJCURlbGJhUmVxLkluaXRpYXRvciA9IE9SSUdJTkFUT1I7CisjaWYgMQorCQkJRWxlbS0+TXNnTGVuICA9IHNpemVvZihEZWxiYVJlcSk7CisJCQlOZGlzTW92ZU1lbW9yeShFbGVtLT5Nc2csICZEZWxiYVJlcSwgc2l6ZW9mKERlbGJhUmVxKSk7CisJCQlNbG1lREVMQkFBY3Rpb24ocEFkLCBFbGVtKTsKKwkJCWtmcmVlKEVsZW0pOworI2Vsc2UKKwkJCU1sbWVFbnF1ZXVlKHBBZCwgQUNUSU9OX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX09SSV9ERUxCQV9DQVRFLCBzaXplb2YoTUxNRV9ERUxCQV9SRVFfU1RSVUNUKSwgKFBWT0lEKSZEZWxiYVJlcSk7CisJCQlSVDI4WFhfTUxNRV9IQU5ETEVSKHBBZCk7CisjZW5kaWYKKwkJfQorCisJCXJldHVybjsKKwl9CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIiVzPT09PldjaWQ9JWQuVElEPSVkIFxuIiwgX19mdW5jX18sIFdjaWQsIFRJRCkpOworCisJcEJBRW50cnkgPSAmcEFkLT5CQVRhYmxlLkJBT3JpRW50cnlbSWR4XTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlx0PT09PklkeCA9ICVsZCwgV2NpZD0lZC5USUQ9JWQsIE9SSV9CQV9TdGF0dXMgPSAlZCBcbiIsIElkeCwgV2NpZCwgVElELCBwQkFFbnRyeS0+T1JJX0JBX1N0YXR1cykpOworCS8vCisJLy8gUHJlcGFyZSBEZWxCQSBhY3Rpb24gZnJhbWUgYW5kIHNlbmQgdG8gdGhlIHBlZXIuCisJLy8KKwlpZiAoKGJQYXNzaXZlID09IEZBTFNFKSAmJiAoVElEID09IHBCQUVudHJ5LT5USUQpICYmIChwQkFFbnRyeS0+T1JJX0JBX1N0YXR1cyA9PSBPcmlnaW5hdG9yX0RvbmUpKQorCXsKKwkJTUxNRV9ERUxCQV9SRVFfU1RSVUNUICAgRGVsYmFSZXE7CisJCU1MTUVfUVVFVUVfRUxFTSAqRWxlbSA9IChNTE1FX1FVRVVFX0VMRU0gKikga21hbGxvYyhzaXplb2YoTUxNRV9RVUVVRV9FTEVNKSwgTUVNX0FMTE9DX0ZMQUcpOworCisJCU5kaXNaZXJvTWVtb3J5KCZEZWxiYVJlcSwgc2l6ZW9mKERlbGJhUmVxKSk7CisJCU5kaXNaZXJvTWVtb3J5KEVsZW0sIHNpemVvZihNTE1FX1FVRVVFX0VMRU0pKTsKKworCQlDT1BZX01BQ19BRERSKERlbGJhUmVxLkFkZHIsIHBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0uQWRkcik7CisJCURlbGJhUmVxLldjaWQgPSBXY2lkOworCQlEZWxiYVJlcS5USUQgPSBwQkFFbnRyeS0+VElEOworCQlEZWxiYVJlcS5Jbml0aWF0b3IgPSBPUklHSU5BVE9SOworI2lmIDEKKwkJRWxlbS0+TXNnTGVuICA9IHNpemVvZihEZWxiYVJlcSk7CisJCU5kaXNNb3ZlTWVtb3J5KEVsZW0tPk1zZywgJkRlbGJhUmVxLCBzaXplb2YoRGVsYmFSZXEpKTsKKwkJTWxtZURFTEJBQWN0aW9uKHBBZCwgRWxlbSk7CisJCWtmcmVlKEVsZW0pOworI2Vsc2UKKwkJTWxtZUVucXVldWUocEFkLCBBQ1RJT05fU1RBVEVfTUFDSElORSwgTVQyX01MTUVfT1JJX0RFTEJBX0NBVEUsIHNpemVvZihNTE1FX0RFTEJBX1JFUV9TVFJVQ1QpLCAoUFZPSUQpJkRlbGJhUmVxKTsKKwkJUlQyOFhYX01MTUVfSEFORExFUihwQWQpOworI2VuZGlmCisJfQorCVJUTVBDYW5jZWxUaW1lcigmcEJBRW50cnktPk9SSUJBVGltZXIsICZDYW5jZWxsZWQpOworCUJBVGFibGVGcmVlT3JpRW50cnkocEFkLCBJZHgpOworCisJaWYgKGJQYXNzaXZlKQorCXsKKwkJLy9CQU9yaVNlc3Npb25TZXRVcChwQWQsICZwQWQtPk1hY1RhYi5Db250ZW50W1djaWRdLCBUSUQsIDAsIDEwMDAwLCBUUlVFKTsKKwl9Cit9CisKK1ZPSUQgQkFSZWNTZXNzaW9uVGVhckRvd24oCisJCQkJCQkgSU4gT1VUICBQUlRNUF9BREFQVEVSICAgcEFkLAorCQkJCQkJIElOICAgICAgVUNIQVIgICAgICAgICAgIFdjaWQsCisJCQkJCQkgSU4gICAgICBVQ0hBUiAgICAgICAgICAgVElELAorCQkJCQkJIElOICAgICAgQk9PTEVBTiAgICAgICAgIGJQYXNzaXZlKQoreworCVVMT05HICAgICAgICAgICBJZHggPSAwOworCUJBX1JFQ19FTlRSWSAgICAqcEJBRW50cnk7CisKKwlpZiAoV2NpZCA+PSBNQVhfTEVOX09GX01BQ19UQUJMRSkKKwl7CisJCXJldHVybjsKKwl9CisKKwkvLworCS8vICBMb2NhdGUgY29ycmVzcG9uZGluZyBCQSBPcmlnaW5hdG9yIEVudHJ5IGluIEJBIFRhYmxlIHdpdGggdGhlIChwQWRkcixUSUQpLgorCS8vCisJSWR4ID0gcEFkLT5NYWNUYWIuQ29udGVudFtXY2lkXS5CQVJlY1djaWRBcnJheVtUSURdOworCWlmIChJZHggPT0gMCkKKwkJcmV0dXJuOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCIlcz09PT5XY2lkPSVkLlRJRD0lZCBcbiIsIF9fZnVuY19fLCBXY2lkLCBUSUQpKTsKKworCisJcEJBRW50cnkgPSAmcEFkLT5CQVRhYmxlLkJBUmVjRW50cnlbSWR4XTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlx0PT09PklkeCA9ICVsZCwgV2NpZD0lZC5USUQ9JWQsIFJFQ19CQV9TdGF0dXMgPSAlZCBcbiIsIElkeCwgV2NpZCwgVElELCBwQkFFbnRyeS0+UkVDX0JBX1N0YXR1cykpOworCS8vCisJLy8gUHJlcGFyZSBEZWxCQSBhY3Rpb24gZnJhbWUgYW5kIHNlbmQgdG8gdGhlIHBlZXIuCisJLy8KKwlpZiAoKFRJRCA9PSBwQkFFbnRyeS0+VElEKSAmJiAocEJBRW50cnktPlJFQ19CQV9TdGF0dXMgPT0gUmVjaXBpZW50X0FjY2VwdCkpCisJeworCQlNTE1FX0RFTEJBX1JFUV9TVFJVQ1QgICBEZWxiYVJlcTsKKwkJQk9PTEVBTiAJCQkJQ2FuY2VsbGVkOworCQlNTE1FX1FVRVVFX0VMRU0gKkVsZW0gPSAoTUxNRV9RVUVVRV9FTEVNICopIGttYWxsb2Moc2l6ZW9mKE1MTUVfUVVFVUVfRUxFTSksIE1FTV9BTExPQ19GTEFHKTsKKwkJLy9VTE9ORyAgIG9mZnNldDsKKwkJLy9VSU5UMzIgIFZBTFVFOworCisJCVJUTVBDYW5jZWxUaW1lcigmcEJBRW50cnktPlJFQ0JBVGltZXIsICZDYW5jZWxsZWQpOworCisJCS8vCisJCS8vIDEuIFNlbmQgREVMQkEgQWN0aW9uIEZyYW1lCisJCS8vCisJCWlmIChiUGFzc2l2ZSA9PSBGQUxTRSkKKwkJeworCQkJTmRpc1plcm9NZW1vcnkoJkRlbGJhUmVxLCBzaXplb2YoRGVsYmFSZXEpKTsKKwkJCU5kaXNaZXJvTWVtb3J5KEVsZW0sIHNpemVvZihNTE1FX1FVRVVFX0VMRU0pKTsKKworCQkJQ09QWV9NQUNfQUREUihEZWxiYVJlcS5BZGRyLCBwQWQtPk1hY1RhYi5Db250ZW50W1djaWRdLkFkZHIpOworCQkJRGVsYmFSZXEuV2NpZCA9IFdjaWQ7CisJCQlEZWxiYVJlcS5USUQgPSBUSUQ7CisJCQlEZWxiYVJlcS5Jbml0aWF0b3IgPSBSRUNJUElFTlQ7CisjaWYgMQorCQkJRWxlbS0+TXNnTGVuICA9IHNpemVvZihEZWxiYVJlcSk7CisJCQlOZGlzTW92ZU1lbW9yeShFbGVtLT5Nc2csICZEZWxiYVJlcSwgc2l6ZW9mKERlbGJhUmVxKSk7CisJCQlNbG1lREVMQkFBY3Rpb24ocEFkLCBFbGVtKTsKKwkJCWtmcmVlKEVsZW0pOworI2Vsc2UKKwkJCU1sbWVFbnF1ZXVlKHBBZCwgQUNUSU9OX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX09SSV9ERUxCQV9DQVRFLCBzaXplb2YoTUxNRV9ERUxCQV9SRVFfU1RSVUNUKSwgKFBWT0lEKSZEZWxiYVJlcSk7CisJCQlSVDI4WFhfTUxNRV9IQU5ETEVSKHBBZCk7CisjZW5kaWYKKwkJfQorCisKKwkJLy8KKwkJLy8gMi4gRnJlZSByZXNvdXJjZSBvZiBCQSBzZXNzaW9uCisJCS8vCisJCS8vIGZsdXNoIGFsbCBwZW5kaW5nIHJlb3JkZXJpbmcgbXBkdXMKKwkJYmFfcmVmcmVzaF9yZW9yZGVyaW5nX21wZHVzKHBBZCwgcEJBRW50cnkpOworCisJCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+QkFUYWJMb2NrKTsKKworCQkvLyBFcmFzZSBCaXRtYXAgZmxhZy4KKwkJcEJBRW50cnktPkxhc3RJbmRTZXEgPSBSRVNFVF9SQ1ZfU0VROworCQlwQkFFbnRyeS0+QkFXaW5TaXplID0gMDsKKwkJLy8gRXJhc2UgQml0bWFwIGZsYWcgYXQgc29mdHdhcmUgbWFjdGFibGUKKwkJcEFkLT5NYWNUYWIuQ29udGVudFtXY2lkXS5SWEJBYml0bWFwICY9ICh+KDE8PChwQkFFbnRyeS0+VElEKSkpOworCQlwQWQtPk1hY1RhYi5Db250ZW50W1djaWRdLkJBUmVjV2NpZEFycmF5W1RJRF0gPSAwOworCisJCVJUMjhYWF9ERUxfQkFfU0VTU0lPTl9GUk9NX0FTSUMocEFkLCBXY2lkLCBUSUQpOworCisJCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+QkFUYWJMb2NrKTsKKworCX0KKworCUJBVGFibGVGcmVlUmVjRW50cnkocEFkLCBJZHgpOworfQorCitWT0lEIEJBU2Vzc2lvblRlYXJEb3duQUxMKAorCQkJCQkJIElOIE9VVCAgUFJUTVBfQURBUFRFUiBwQWQsCisJCQkJCQkgSU4gICAgICBVQ0hBUiBXY2lkKQoreworCWludCBpOworCisJZm9yIChpPTA7IGk8TlVNX09GX1RJRDsgaSsrKQorCXsKKwkJQkFPcmlTZXNzaW9uVGVhckRvd24ocEFkLCBXY2lkLCBpLCBGQUxTRSwgRkFMU0UpOworCQlCQVJlY1Nlc3Npb25UZWFyRG93bihwQWQsIFdjaWQsIGksIEZBTFNFKTsKKwl9Cit9CisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlSZXRyeSBzZW5kaW5nIEFEREJBIFJlcWVzdC4KKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJUGFyYW1ldHJzOgorCXA4MDIzSGVhZGVyOiBpZiB0aGlzIGlzIGFscmVhZHkgODAyLjMgZm9ybWF0LCBwODAyM0hlYWRlciBpcyBOVUxMCisKKwlSZXR1cm4JOiBUUlVFIGlmIHB1dCBpbnRvIHJ4IHJlb3JkZXJpbmcgYnVmZmVyLCBzaG91bGRuJ3QgaW5kaWNhdGVyeGhlcmUuCisJCQkJRkFMU0UgLCB0aGVuIGNvbnRpbnVlIGluZGljYXRlcnggYXQgdGhpcyBtb21lbnQuCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBCQU9yaVNlc3Npb25TZXR1cFRpbWVvdXQoCisgICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorICAgIElOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKKyAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisgICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKQoreworCUJBX09SSV9FTlRSWSAgICAqcEJBRW50cnkgPSAoQkFfT1JJX0VOVFJZICopRnVuY3Rpb25Db250ZXh0OworCU1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5OworCVBSVE1QX0FEQVBURVIgICBwQWQ7CisKKwlpZiAocEJBRW50cnkgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJcEFkID0gcEJBRW50cnktPnBBZGFwdGVyOworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwl7CisJCS8vIERvIG5vdGhpbmcgaWYgbW9uaXRvciBtb2RlIGlzIG9uCisJCWlmIChNT05JVE9SX09OKHBBZCkpCisJCQlyZXR1cm47CisJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisjaWZkZWYgUkFMSU5LX0FURQorCS8vIE5vdGhpbmcgdG8gZG8gaW4gQVRFIG1vZGUuCisJaWYgKEFURV9PTihwQWQpKQorCQlyZXR1cm47CisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCisJcEVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbcEJBRW50cnktPldjaWRdOworCisJaWYgKChwQkFFbnRyeS0+T1JJX0JBX1N0YXR1cyA9PSBPcmlnaW5hdG9yX1dhaXRSZXMpICYmIChwQkFFbnRyeS0+VG9rZW4gPCBPUklfU0VTU0lPTl9NQVhfUkVUUlkpKQorCXsKKwkJTUxNRV9BRERCQV9SRVFfU1RSVUNUICAgIEFkZGJhUmVxOworCisJCU5kaXNaZXJvTWVtb3J5KCZBZGRiYVJlcSwgc2l6ZW9mKEFkZGJhUmVxKSk7CisJCUNPUFlfTUFDX0FERFIoQWRkYmFSZXEucEFkZHIsIHBFbnRyeS0+QWRkcik7CisJCUFkZGJhUmVxLldjaWQgPSAoVUNIQVIpKHBFbnRyeS0+QWlkKTsKKwkJQWRkYmFSZXEuVElEID0gcEJBRW50cnktPlRJRDsKKwkJQWRkYmFSZXEuQmFCdWZTaXplID0gcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlJ4QkFXaW5MaW1pdDsKKwkJQWRkYmFSZXEuVGltZU91dFZhbHVlID0gMDsKKwkJQWRkYmFSZXEuVG9rZW4gPSBwQkFFbnRyeS0+VG9rZW47CisJCU1sbWVFbnF1ZXVlKHBBZCwgQUNUSU9OX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX0FERF9CQV9DQVRFLCBzaXplb2YoTUxNRV9BRERCQV9SRVFfU1RSVUNUKSwgKFBWT0lEKSZBZGRiYVJlcSk7CisJCVJUMjhYWF9NTE1FX0hBTkRMRVIocEFkKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJCQSBPcmkgU2Vzc2lvbiBUaW1lb3V0KCVkKSA6IFNlbmQgQUREIEJBIGFnYWluXG4iLCBwQkFFbnRyeS0+VG9rZW4pKTsKKworCQlwQkFFbnRyeS0+VG9rZW4rKzsKKwkJUlRNUFNldFRpbWVyKCZwQkFFbnRyeS0+T1JJQkFUaW1lciwgT1JJX0JBX1NFU1NJT05fVElNRU9VVCk7CisJfQorCWVsc2UKKwl7CisJCUJBVGFibGVGcmVlT3JpRW50cnkocEFkLCBwRW50cnktPkJBT3JpV2NpZEFycmF5W3BCQUVudHJ5LT5USURdKTsKKwl9Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJUmV0cnkgc2VuZGluZyBBRERCQSBSZXFlc3QuCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCVBhcmFtZXRyczoKKwlwODAyM0hlYWRlcjogaWYgdGhpcyBpcyBhbHJlYWR5IDgwMi4zIGZvcm1hdCwgcDgwMjNIZWFkZXIgaXMgTlVMTAorCisJUmV0dXJuCTogVFJVRSBpZiBwdXQgaW50byByeCByZW9yZGVyaW5nIGJ1ZmZlciwgc2hvdWxkbid0IGluZGljYXRlcnhoZXJlLgorCQkJCUZBTFNFICwgdGhlbiBjb250aW51ZSBpbmRpY2F0ZXJ4IGF0IHRoaXMgbW9tZW50LgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgQkFSZWNTZXNzaW9uSWRsZVRpbWVvdXQoCisgICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorICAgIElOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKKyAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisgICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKQoreworCisJQkFfUkVDX0VOVFJZICAgICpwQkFFbnRyeSA9IChCQV9SRUNfRU5UUlkgKilGdW5jdGlvbkNvbnRleHQ7CisJUFJUTVBfQURBUFRFUiAgIHBBZDsKKwlVTE9ORyAgICAgICAgICAgTm93MzI7CisKKwlpZiAocEJBRW50cnkgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJaWYgKChwQkFFbnRyeS0+UkVDX0JBX1N0YXR1cyA9PSBSZWNpcGllbnRfQWNjZXB0KSkKKwl7CisJCU5kaXNHZXRTeXN0ZW1VcFRpbWUoJk5vdzMyKTsKKworCQlpZiAoUlRNUF9USU1FX0FGVEVSKCh1bnNpZ25lZCBsb25nKU5vdzMyLCAodW5zaWduZWQgbG9uZykocEJBRW50cnktPkxhc3RJbmRTZXFBdFRpbWVyICsgUkVDX0JBX1NFU1NJT05fSURMRV9USU1FT1VUKSkpCisJCXsKKwkJCXBBZCA9IHBCQUVudHJ5LT5wQWRhcHRlcjsKKwkJCS8vIGZsdXNoIGFsbCBwZW5kaW5nIHJlb3JkZXJpbmcgbXBkdXMKKwkJCWJhX3JlZnJlc2hfcmVvcmRlcmluZ19tcGR1cyhwQWQsIHBCQUVudHJ5KTsKKwkJCXByaW50aygiJWxkOiBSRUMgQkEgc2Vzc2lvbiBUaW1lb3V0XG4iLCBOb3czMik7CisJCX0KKwl9Cit9CisKKworVk9JRCBQZWVyQWRkQkFSZXFBY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQorCit7CisJLy8JNy40LjQuMQorCS8vVUxPTkcJSWR4OworCVVDSEFSICAgU3RhdHVzID0gMTsKKwlVQ0hBUiAgIHBBZGRyWzZdOworCUZSQU1FX0FEREJBX1JTUCBBRERmcmFtZTsKKwlQVUNIQVIgICAgICAgICBwT3V0QnVmZmVyID0gTlVMTDsKKwlORElTX1NUQVRVUyAgICAgTlN0YXR1czsKKwlQRlJBTUVfQUREQkFfUkVRICBwQWRkcmVxRnJhbWUgPSBOVUxMOworCS8vVUNIQVIJCUJ1ZlNpemU7CisJVUxPTkcgICAgICAgRnJhbWVMZW47CisJUFVMT05HICAgICAgcHRlbXA7CisJUE1BQ19UQUJMRV9FTlRSWQlwTWFjRW50cnk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcyA9PT4gKFdjaWQgPSAlZClcbiIsIF9fZnVuY19fLCBFbGVtLT5XY2lkKSk7CisKKwkvL2hleF9kdW1wKCJBZGRCQVJlcSIsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuKTsKKworCS8vQUREQkEgUmVxdWVzdCBmcm9tIHVua25vd24gcGVlciwgaWdub3JlIHRoaXMuCisJaWYgKEVsZW0tPldjaWQgPj0gTUFYX0xFTl9PRl9NQUNfVEFCTEUpCisJCXJldHVybjsKKworCXBNYWNFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W0VsZW0tPldjaWRdOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQkEgLSBQZWVyQWRkQkFSZXFBY3Rpb24tLS0tPiBcbiIpKTsKKwlwdGVtcCA9IChQVUxPTkcpRWxlbS0+TXNnOworCS8vREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VNVSwgKCIlMDh4OjogJTA4eDo6ICUwOHg6OiAlMDh4OjogJTA4eDo6ICUwOHg6OiAlMDh4OjogJTA4eDo6ICUwOHhcbiIsICoocHRlbXApLCAqKHB0ZW1wKzEpLCAqKHB0ZW1wKzIpLCAqKHB0ZW1wKzMpLCAqKHB0ZW1wKzQpLCAqKHB0ZW1wKzUpLCAqKHB0ZW1wKzYpLCAqKHB0ZW1wKzcpLCAqKHB0ZW1wKzgpKSk7CisKKwlpZiAoUGVlckFkZEJBUmVxQWN0aW9uU2FuaXR5KHBBZCwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4sIHBBZGRyKSkKKwl7CisKKwkJaWYgKChwQWQtPkNvbW1vbkNmZy5iQkFEZWNsaW5lID09IEZBTFNFKSAmJiBJU19IVF9TVEEocE1hY0VudHJ5KSkKKwkJeworCQkJcEFkZHJlcUZyYW1lID0gKFBGUkFNRV9BRERCQV9SRVEpKCZFbGVtLT5Nc2dbMF0pOworCQkJcHJpbnRrKCJSY3YgV2NpZCglZCkgQWRkQkFSZXFcbiIsIEVsZW0tPldjaWQpOworCQkJaWYgKEJBUmVjU2Vzc2lvbkFkZChwQWQsICZwQWQtPk1hY1RhYi5Db250ZW50W0VsZW0tPldjaWRdLCBwQWRkcmVxRnJhbWUpKQorCQkJCVN0YXR1cyA9IDA7CisJCQllbHNlCisJCQkJU3RhdHVzID0gMzg7IC8vIG1vcmUgcGFyYW1ldGVycyBoYXZlIGludmFsaWQgdmFsdWVzCisJCX0KKwkJZWxzZQorCQl7CisJCQlTdGF0dXMgPSAzNzsgLy8gdGhlIHJlcXVlc3QgaGFzIGJlZW4gZGVjbGluZWQuCisJCX0KKwl9CisKKwlpZiAocEFkLT5NYWNUYWIuQ29udGVudFtFbGVtLT5XY2lkXS5WYWxpZEFzQ0xJKQorCQlBU1NFUlQocEFkLT5NYWNUYWIuQ29udGVudFtFbGVtLT5XY2lkXS5Tc3QgPT0gU1NUX0FTU09DKTsKKworCXBBZGRyZXFGcmFtZSA9IChQRlJBTUVfQUREQkFfUkVRKSgmRWxlbS0+TXNnWzBdKTsKKwkvLyAyLiBBbHdheXMgc2VuZCBiYWNrIEFEREJBIFJlc3BvbnNlCisJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsJIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKKwlpZiAoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJBQ1RJT04gLSBQZWVyQkFBY3Rpb24oKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkIFxuIikpOworCQlyZXR1cm47CisJfQorCisJTmRpc1plcm9NZW1vcnkoJkFERGZyYW1lLCBzaXplb2YoRlJBTUVfQUREQkFfUlNQKSk7CisJLy8gMi0xLiBQcmVwYXJlIEFEREJBIFJlc3BvbnNlIGZyYW1lLgorI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJeworCQlpZiAoQURIT0NfT04ocEFkKSkKKwkJCUFjdEhlYWRlckluaXQocEFkLCAmQUREZnJhbWUuSGRyLCBwQWRkciwgcEFkLT5DdXJyZW50QWRkcmVzcywgcEFkLT5Db21tb25DZmcuQnNzaWQpOworCQllbHNlCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJCWlmIChwQWQtPk1hY1RhYi5Db250ZW50W0VsZW0tPldjaWRdLlZhbGlkQXNEbHMpCisJCQlBY3RIZWFkZXJJbml0KHBBZCwgJkFERGZyYW1lLkhkciwgcEFkZHIsIHBBZC0+Q3VycmVudEFkZHJlc3MsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKwkJZWxzZQorI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCQkJQWN0SGVhZGVySW5pdChwQWQsICZBRERmcmFtZS5IZHIsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBwQWRkcik7CisJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCUFERGZyYW1lLkNhdGVnb3J5ID0gQ0FURUdPUllfQkE7CisJQUREZnJhbWUuQWN0aW9uID0gQUREQkFfUkVTUDsKKwlBRERmcmFtZS5Ub2tlbiA9IHBBZGRyZXFGcmFtZS0+VG9rZW47CisJLy8gV2hhdCBpcyB0aGUgU3RhdHVzIGNvZGU/PyAgbmVlZCB0byBjaGVjay4KKwlBRERmcmFtZS5TdGF0dXNDb2RlID0gU3RhdHVzOworCUFERGZyYW1lLkJhUGFybS5CQVBvbGljeSA9IElNTUVEX0JBOworCUFERGZyYW1lLkJhUGFybS5BTVNEVVN1cHBvcnRlZCA9IDA7CisJQUREZnJhbWUuQmFQYXJtLlRJRCA9IHBBZGRyZXFGcmFtZS0+QmFQYXJtLlRJRDsKKwlBRERmcmFtZS5CYVBhcm0uQnVmU2l6ZSA9IG1pbigoKFVDSEFSKXBBZGRyZXFGcmFtZS0+QmFQYXJtLkJ1ZlNpemUpLCAoVUNIQVIpcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlJ4QkFXaW5MaW1pdCk7CisJaWYgKEFERGZyYW1lLkJhUGFybS5CdWZTaXplID09IDApCisJeworCQlBRERmcmFtZS5CYVBhcm0uQnVmU2l6ZSA9IDY0OworCX0KKwlBRERmcmFtZS5UaW1lT3V0VmFsdWUgPSAwOyAvL3BBZGRyZXFGcmFtZS0+VGltZU91dFZhbHVlOworCisJKihVU0hPUlQgKikoJkFERGZyYW1lLkJhUGFybSkgPSBjcHUybGUxNigqKFVTSE9SVCAqKSgmQUREZnJhbWUuQmFQYXJtKSk7CisJQUREZnJhbWUuU3RhdHVzQ29kZSA9IGNwdTJsZTE2KEFERGZyYW1lLlN0YXR1c0NvZGUpOworCUFERGZyYW1lLlRpbWVPdXRWYWx1ZSA9IGNwdTJsZTE2KEFERGZyYW1lLlRpbWVPdXRWYWx1ZSk7CisKKwlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAgICAgICAgICAgICAgICZGcmFtZUxlbiwKKwkJCQkJICBzaXplb2YoRlJBTUVfQUREQkFfUlNQKSwgICZBRERmcmFtZSwKKwkJCSAgRU5EX09GX0FSR1MpOworCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgUUlEX0FDX0JFLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7CisJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzKCVkKTogVElEKCVkKSwgQnVmU2l6ZSglZCkgPD09IFxuIiwgX19mdW5jX18sIEVsZW0tPldjaWQsIEFERGZyYW1lLkJhUGFybS5USUQsCisJCQkJCQkJICBBRERmcmFtZS5CYVBhcm0uQnVmU2l6ZSkpOworfQorCisKK1ZPSUQgUGVlckFkZEJBUnNwQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKKworeworCS8vVUNIQVIJCUlkeCwgaTsKKwkvL1BVQ0hBUgkJICAgcE91dEJ1ZmZlciA9IE5VTEw7CisJUEZSQU1FX0FEREJBX1JTUCAgICBwRnJhbWUgPSBOVUxMOworCS8vUEJBX09SSV9FTlRSWQkJcEJBRW50cnk7CisKKwkvL0FEREJBIFJlc3BvbnNlIGZyb20gdW5rbm93biBwZWVyLCBpZ25vcmUgdGhpcy4KKwlpZiAoRWxlbS0+V2NpZCA+PSBNQVhfTEVOX09GX01BQ19UQUJMRSkKKwkJcmV0dXJuOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXMgPT0+IFdjaWQoJWQpXG4iLCBfX2Z1bmNfXywgRWxlbS0+V2NpZCkpOworCisJLy9oZXhfZHVtcCgiUGVlckFkZEJBUnNwQWN0aW9uKCkiLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbik7CisKKwlpZiAoUGVlckFkZEJBUnNwQWN0aW9uU2FuaXR5KHBBZCwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4pKQorCXsKKwkJcEZyYW1lID0gKFBGUkFNRV9BRERCQV9SU1ApKCZFbGVtLT5Nc2dbMF0pOworCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlx0XHQgU3RhdHVzQ29kZSA9ICVkXG4iLCBwRnJhbWUtPlN0YXR1c0NvZGUpKTsKKwkJc3dpdGNoIChwRnJhbWUtPlN0YXR1c0NvZGUpCisJCXsKKwkJCWNhc2UgMDoKKwkJCQkvLyBJIHdhbnQgYSBCQXNlc3Npb24gd2l0aCB0aGlzIHBlZXIgYXMgYW4gb3JpZ2luYXRvci4KKwkJCQlCQU9yaVNlc3Npb25BZGQocEFkLCAmcEFkLT5NYWNUYWIuQ29udGVudFtFbGVtLT5XY2lkXSwgcEZyYW1lKTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJLy8gY2hlY2sgc3RhdHVzID09IFVTRUQgPz8/CisJCQkJQkFPcmlTZXNzaW9uVGVhckRvd24ocEFkLCBFbGVtLT5XY2lkLCBwRnJhbWUtPkJhUGFybS5USUQsIFRSVUUsIEZBTFNFKTsKKwkJCQlicmVhazsKKwkJfQorCQkvLyBSY3YgRGVjbGluZSBTdGF0dXNDb2RlCisJCWlmICgocEZyYW1lLT5TdGF0dXNDb2RlID09IDM3KQorI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorICAgICAgICAgICAgfHwgKChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKSAmJiBTVEFfVEdOX1dJRklfT04ocEFkKSAmJiAocEZyYW1lLT5TdGF0dXNDb2RlICE9IDApKQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworICAgICAgICAgICAgKQorCQl7CisJCQlwQWQtPk1hY1RhYi5Db250ZW50W0VsZW0tPldjaWRdLkJBRGVjbGluZUJpdG1hcCB8PSAxPDxwRnJhbWUtPkJhUGFybS5USUQ7CisJCX0KKwl9Cit9CisKK1ZPSUQgUGVlckRlbEJBQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKKworeworCS8vVUNIQVIJCQkJSWR4OworCS8vUFVDSEFSCQkJCXBPdXRCdWZmZXIgPSBOVUxMOworCVBGUkFNRV9ERUxCQV9SRVEgICAgcERlbEZyYW1lID0gTlVMTDsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiJXMgPT0+XG4iLCBfX2Z1bmNfXykpOworCS8vREVMQkEgUmVxdWVzdCBmcm9tIHVua25vd24gcGVlciwgaWdub3JlIHRoaXMuCisJaWYgKFBlZXJEZWxCQUFjdGlvblNhbml0eShwQWQsIEVsZW0tPldjaWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuKSkKKwl7CisJCXBEZWxGcmFtZSA9IChQRlJBTUVfREVMQkFfUkVRKSgmRWxlbS0+TXNnWzBdKTsKKwkJaWYgKHBEZWxGcmFtZS0+RGVsYmFQYXJtLkluaXRpYXRvciA9PSBPUklHSU5BVE9SKQorCQl7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkJBIC0gUGVlckRlbEJBQWN0aW9uLS0tLT4gT1JJR0lOQVRPUlxuIikpOworCQkJQkFSZWNTZXNzaW9uVGVhckRvd24ocEFkLCBFbGVtLT5XY2lkLCBwRGVsRnJhbWUtPkRlbGJhUGFybS5USUQsIFRSVUUpOworCQl9CisJCWVsc2UKKwkJeworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJCQSAtIFBlZXJEZWxCQUFjdGlvbi0tLS0+IFJFQ0lQSUVOVCwgUmVhc29uID0gJWRcbiIsICBwRGVsRnJhbWUtPlJlYXNvbkNvZGUpKTsKKwkJCS8vaGV4X2R1bXAoIkRlbEJBIEZyYW1lIiwgcERlbEZyYW1lLCBFbGVtLT5Nc2dMZW4pOworCQkJQkFPcmlTZXNzaW9uVGVhckRvd24ocEFkLCBFbGVtLT5XY2lkLCBwRGVsRnJhbWUtPkRlbGJhUGFybS5USUQsIFRSVUUsIEZBTFNFKTsKKwkJfQorCX0KK30KKworCitCT09MRUFOIENudGxFbnF1ZXVlRm9yUmVjdigKKwkJCQkJCSAgSU4gUFJUTVBfQURBUFRFUgkJcEFkLAorCQkJCQkJICBJTiBVTE9ORwkJCQlXY2lkLAorCQkJCQkJICBJTiBVTE9ORwkJCQlNc2dMZW4sCisJCQkJCQkgIElOIFBGUkFNRV9CQV9SRVEJCXBNc2cpCit7CisJUEZSQU1FX0JBX1JFUSAgIHBGcmFtZSA9IHBNc2c7CisJLy9QUlRNUF9SRU9SREVSQlVGCXBCdWZmZXI7CisJLy9QUlRNUF9SRU9SREVSQlVGCXBEbWFCdWY7CisJUEJBX1JFQ19FTlRSWSBwQkFFbnRyeTsKKwkvL0JPT0xFQU4gCVJlc3VsdDsKKwlVTE9ORyAgIElkeDsKKwkvL1VDSEFSCU51bVJ4UGt0OworCVVDSEFSCVRJRDsvLywgaTsKKworCVRJRCA9IChVQ0hBUilwRnJhbWUtPkJBUkNvbnRyb2wuVElEOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXMoKTogQkFSLVdjaWQoJWxkKSwgVGlkICglZClcbiIsIF9fZnVuY19fLCBXY2lkLCBUSUQpKTsKKwkvL2hleF9kdW1wKCJCQVIiLCAoUENIQVIpIHBGcmFtZSwgTXNnTGVuKTsKKwkvLyBEbyBub3RoaW5nIGlmIHRoZSBkcml2ZXIgaXMgc3RhcnRpbmcgaGFsdCBzdGF0ZS4KKwkvLyBUaGlzIG1pZ2h0IGhhcHBlbiB3aGVuIHRpbWVyIGFscmVhZHkgYmVlbiBmaXJlZCBiZWZvcmUgY2FuY2VsIHRpbWVyIHdpdGggbWxtZWhhbHQKKwlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKQorCQlyZXR1cm4gRkFMU0U7CisKKwkvLyBGaXJzdCBjaGVjayB0aGUgc2l6ZSwgaXQgTVVTVCBub3QgZXhjZWVkIHRoZSBtbG1lIHF1ZXVlIHNpemUKKwlpZiAoTXNnTGVuID4gTUdNVF9ETUFfQlVGRkVSX1NJWkUpCisJeworCQlEQkdQUklOVF9FUlIoKCJDbnRsRW5xdWV1ZUZvclJlY3Y6IGZyYW1lIHRvbyBsYXJnZSwgc2l6ZSA9ICVsZCBcbiIsIE1zZ0xlbikpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCWVsc2UgaWYgKE1zZ0xlbiAhPSBzaXplb2YoRlJBTUVfQkFfUkVRKSkKKwl7CisJCURCR1BSSU5UX0VSUigoIkNudGxFbnF1ZXVlRm9yUmVjdjogQmxvY2tBY2sgUmVxdWVzdCBmcmFtZSBsZW5ndGggc2l6ZSA9ICVsZCBpbmNvcnJlY3RcbiIsIE1zZ0xlbikpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCWVsc2UgaWYgKE1zZ0xlbiAhPSBzaXplb2YoRlJBTUVfQkFfUkVRKSkKKwl7CisJCURCR1BSSU5UX0VSUigoIkNudGxFbnF1ZXVlRm9yUmVjdjogQmxvY2tBY2sgUmVxdWVzdCBmcmFtZSBsZW5ndGggc2l6ZSA9ICVsZCBpbmNvcnJlY3RcbiIsIE1zZ0xlbikpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJaWYgKChXY2lkIDwgTUFYX0xFTl9PRl9NQUNfVEFCTEUpICYmIChUSUQgPCA4KSkKKwkJeworCQkvLyBpZiB0aGlzIHJlY2VpdmluZyBwYWNrZXQgaXMgZnJvbSBTQSB0aGF0IGlzIGluIG91ciBPcmlFbnRyeS4gU2luY2UgV0NJRCA8OSBoYXMgZGlyZWN0IG1hcHBpbmcuIG5vIG5lZWQgc2VhcmNoLgorCQlJZHggPSBwQWQtPk1hY1RhYi5Db250ZW50W1djaWRdLkJBUmVjV2NpZEFycmF5W1RJRF07CisJCXBCQUVudHJ5ID0gJnBBZC0+QkFUYWJsZS5CQVJlY0VudHJ5W0lkeF07CisJCX0KKwkJZWxzZQorCQl7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJCQVIoJWxkKSA6IFRpZCAoJWQpIC0gJTA0eDolMDR4XG4iLCBXY2lkLCBUSUQsIHBGcmFtZS0+QkFTdGFydGluZ1NlcS5maWVsZC5TdGFydFNlcSwgcEJBRW50cnktPkxhc3RJbmRTZXEgKSk7CisKKwlpZiAoU0VRX1NNQUxMRVIocEJBRW50cnktPkxhc3RJbmRTZXEsIHBGcmFtZS0+QkFTdGFydGluZ1NlcS5maWVsZC5TdGFydFNlcSwgTUFYU0VRKSkKKwl7CisJCS8vcHJpbnRrKCJCQVIgU2VxID0gJXgsIExhc3RJbmRTZXEgPSAleFxuIiwgcEZyYW1lLT5CQVN0YXJ0aW5nU2VxLmZpZWxkLlN0YXJ0U2VxLCBwQkFFbnRyeS0+TGFzdEluZFNlcSk7CisJCWJhX2luZGljYXRlX3Jlb3JkZXJpbmdfbXBkdXNfbGVfc2VxKHBBZCwgcEJBRW50cnksIHBGcmFtZS0+QkFTdGFydGluZ1NlcS5maWVsZC5TdGFydFNlcSk7CisJCXBCQUVudHJ5LT5MYXN0SW5kU2VxID0gKHBGcmFtZS0+QkFTdGFydGluZ1NlcS5maWVsZC5TdGFydFNlcSA9PSAwKSA/IE1BWFNFUSA6KHBGcmFtZS0+QkFTdGFydGluZ1NlcS5maWVsZC5TdGFydFNlcSAtMSk7CisJfQorCS8vYmFfcmVmcmVzaF9yZW9yZGVyaW5nX21wZHVzKHBBZCwgcEJBRW50cnkpOworCXJldHVybiBUUlVFOworfQorCisvKgorRGVzY3JpcHRpb24gOiBTZW5kIFBTTVAgQWN0aW9uIGZyYW1lIElmIFBTTVAgbW9kZSBzd2l0Y2hlcy4KKyovCitWT0lEIFNlbmRQU01QQWN0aW9uKAorCQkJCSAgIElOIFBSVE1QX0FEQVBURVIJCXBBZCwKKwkJCQkgICBJTiBVQ0hBUgkJCQlXY2lkLAorCQkJCSAgIElOIFVDSEFSCQkJCVBzbXApCit7CisJUFVDSEFSICAgICAgICAgIHBPdXRCdWZmZXIgPSBOVUxMOworCU5ESVNfU1RBVFVTICAgICBOU3RhdHVzOworCS8vVUxPTkcgICAgICAgICAgIElkeDsKKwlGUkFNRV9QU01QX0FDVElPTiAgIEZyYW1lOworCVVMT05HICAgICAgICAgICBGcmFtZUxlbjsKKworCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcik7CSAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5CisJaWYgKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiQkEgLSBNbG1lQUREQkFBY3Rpb24oKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkIFxuIikpOworCQlyZXR1cm47CisJfQorI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCUFjdEhlYWRlckluaXQocEFkLCAmRnJhbWUuSGRyLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgcEFkLT5DdXJyZW50QWRkcmVzcywgcEFkLT5NYWNUYWIuQ29udGVudFtXY2lkXS5BZGRyKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCUZyYW1lLkNhdGVnb3J5ID0gQ0FURUdPUllfSFQ7CisJRnJhbWUuQWN0aW9uID0gU01QU19BQ1RJT047CisJc3dpdGNoIChQc21wKQorCXsKKwkJY2FzZSBNTVBTX0VOQUJMRToKKwkJCUZyYW1lLlBzbXAgPSAwOworCQkJYnJlYWs7CisJCWNhc2UgTU1QU19EWU5BTUlDOgorCQkJRnJhbWUuUHNtcCA9IDM7CisJCQlicmVhazsKKwkJY2FzZSBNTVBTX1NUQVRJQzoKKwkJCUZyYW1lLlBzbXAgPSAxOworCQkJYnJlYWs7CisJfQorCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAgICAgICAgJkZyYW1lTGVuLAorCQkJCQkgIHNpemVvZihGUkFNRV9QU01QX0FDVElPTiksICAgICAgJkZyYW1lLAorCQkJCQkgIEVORF9PRl9BUkdTKTsKKwlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIFFJRF9BQ19CRSwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOworCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7CisJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJIVCAtIFNlbmRQU01QQWN0aW9uKCAlZCApICBcbiIsIEZyYW1lLlBzbXApKTsKK30KKworCisjZGVmaW5lIFJBRElPX01FQVNVUkVNRU5UX1JFUVVFU1RfQUNUSU9OCTAKKwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VECit7CisJVUNIQVIJUmVndWxhdG9yeUNsYXNzOworCVVDSEFSCUNoYW5uZWxOdW1iZXI7CisJVVNIT1JUCVJhbmRvbUludGVydmFsOworCVVTSE9SVAlNZWFzdXJlbWVudER1cmF0aW9uOworCVVDSEFSCU1lYXN1cmVtZW50TW9kZTsKKwlVQ0hBUiAgIEJTU0lEW01BQ19BRERSX0xFTl07CisJVUNIQVIJUmVwb3J0aW5nQ29uZGl0aW9uOworCVVDSEFSCVRocmVzaG9sZDsKKwlVQ0hBUiAgIFNTSURJRVsyXTsJCQkvLyAyIGJ5dGUKK30gQkVBQ09OX1JFUVVFU1Q7CisKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRAoreworCVVDSEFSCUlEOworCVVDSEFSCUxlbmd0aDsKKwlVQ0hBUglUb2tlbjsKKwlVQ0hBUglSZXF1ZXN0TW9kZTsKKwlVQ0hBUglUeXBlOworfSBNRUFTVVJFTUVOVF9SRVE7CisKKworCisKK3ZvaWQgY29udmVydF9yZW9yZGVyaW5nX3BhY2tldF90b19wcmVBTVNEVV9vcl84MDJfM19wYWNrZXQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUlhfQkxLCQkJKnBSeEJsaywKKwlJTiAgVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCkKK3sKKwlQTkRJU19QQUNLRVQJcFJ4UGt0OworCVVDSEFSCQkJSGVhZGVyODAyXzNbTEVOR1RIXzgwMl8zXTsKKworCS8vIDEuIGdldCA4MDIuMyBIZWFkZXIKKwkvLyAyLiByZW1vdmUgTExDCisJLy8gCQlhLiBwb2ludGVyIHBSeEJsay0+cERhdGEgdG8gcGF5bG9hZAorCS8vICAgICAgYi4gbW9kaWZ5IHBSeEJsay0+RGF0YVNpemUKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCVJUTVBfODAyXzExX1JFTU9WRV9MTENfQU5EX0NPTlZFUlRfVE9fODAyXzMocFJ4QmxrLCBIZWFkZXI4MDJfMyk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlBU1NFUlQocFJ4QmxrLT5wUnhQYWNrZXQpOworCXBSeFBrdCA9IFJUUEtUX1RPX09TUEtUKHBSeEJsay0+cFJ4UGFja2V0KTsKKworCVJUUEtUX1RPX09TUEtUKHBSeFBrdCktPmRldiA9IGdldF9uZXRkZXZfZnJvbV9ic3NpZChwQWQsIEZyb21XaGljaEJTU0lEKTsKKwlSVFBLVF9UT19PU1BLVChwUnhQa3QpLT5kYXRhID0gcFJ4QmxrLT5wRGF0YTsKKwlSVFBLVF9UT19PU1BLVChwUnhQa3QpLT5sZW4gPSBwUnhCbGstPkRhdGFTaXplOworCVJUUEtUX1RPX09TUEtUKHBSeFBrdCktPnRhaWwgPSBSVFBLVF9UT19PU1BLVChwUnhQa3QpLT5kYXRhICsgUlRQS1RfVE9fT1NQS1QocFJ4UGt0KS0+bGVuOworCisJLy8KKwkvLyBjb3B5IDgwMi4zIGhlYWRlciwgaWYgbmVjZXNzYXJ5CisJLy8KKwlpZiAoIVJYX0JMS19URVNUX0ZMQUcocFJ4QmxrLCBmUlhfQU1TRFUpKQorCXsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQl7CisjaWZkZWYgTElOVVgKKwkJCU5kaXNNb3ZlTWVtb3J5KHNrYl9wdXNoKHBSeFBrdCwgTEVOR1RIXzgwMl8zKSwgSGVhZGVyODAyXzMsIExFTkdUSF84MDJfMyk7CisjZW5kaWYKKyNpZmRlZiBVQ09TCisJCQlOZGlzTW92ZU1lbW9yeShuZXRfcGt0X3B1c2gocFJ4UGt0LCBMRU5HVEhfODAyXzMpLCBIZWFkZXI4MDJfMywgTEVOR1RIXzgwMl8zKTsKKyNlbmRpZgorCQl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJfQorfQorCisKKyNkZWZpbmUgSU5ESUNBVEVfTEVHQUNZX09SX0FNU0RVKF9wQWQsIF9wUnhCbGssIF9mcm9tV2hpY2hCU1NJRCkJCVwKKwlkbwkJCQkJCQkJCQkJCQkJCQkJXAorCXsJCQkJCQkJCQkJCQkJCQkJCVwKKyAgICAJaWYgKFJYX0JMS19URVNUX0ZMQUcoX3BSeEJsaywgZlJYX0FNU0RVKSkJCQkJCQlcCisgICAgCXsJCQkJCQkJCQkJCQkJCQkJXAorICAgIAkJSW5kaWNhdGVfQU1TRFVfUGFja2V0KF9wQWQsIF9wUnhCbGssIF9mcm9tV2hpY2hCU1NJRCk7CQlcCisgICAgCX0JCQkJCQkJCQkJCQkJCQkJXAorCQllbHNlIGlmIChSWF9CTEtfVEVTVF9GTEFHKF9wUnhCbGssIGZSWF9FQVApKQkJCQkJXAorCQl7CQkJCQkJCQkJCQkJCQkJCVwKKwkJCUluZGljYXRlX0VBUE9MX1BhY2tldChfcEFkLCBfcFJ4QmxrLCBfZnJvbVdoaWNoQlNTSUQpOwkJXAorCQl9CQkJCQkJCQkJCQkJCQkJCVwKKyAgICAJZWxzZQkJCQkJCQkJCQkJCQkJCVwKKyAgICAJewkJCQkJCQkJCQkJCQkJCQlcCisgICAgCQlJbmRpY2F0ZV9MZWdhY3lfUGFja2V0KF9wQWQsIF9wUnhCbGssIF9mcm9tV2hpY2hCU1NJRCk7CQlcCisgICAgCX0JCQkJCQkJCQkJCQkJCQkJXAorCX0gd2hpbGUgKDApOworCisKKworc3RhdGljIFZPSUQgYmFfZW5xdWV1ZV9yZW9yZGVyaW5nX3BhY2tldCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQQkFfUkVDX0VOVFJZCXBCQUVudHJ5LAorCUlOCVJYX0JMSwkJCSpwUnhCbGssCisJSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCkKK3sKKwlzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1ICptcGR1X2JsazsKKwlVSU5UMTYJU2VxdWVuY2UgPSAoVUlOVDE2KSBwUnhCbGstPnBIZWFkZXItPlNlcXVlbmNlOworCisJbXBkdV9ibGsgPSBiYV9tcGR1X2Jsa19hbGxvYyhwQWQpOworCWlmIChtcGR1X2JsayAhPSBOVUxMKQorCXsKKwkJLy8gV3JpdGUgUnhEIGJ1ZmZlciBhZGRyZXNzICYgYWxsb2NhdGVkIGJ1ZmZlciBsZW5ndGgKKwkJTmRpc0FjcXVpcmVTcGluTG9jaygmcEJBRW50cnktPlJ4UmVSaW5nTG9jayk7CisKKwkJbXBkdV9ibGstPlNlcXVlbmNlID0gU2VxdWVuY2U7CisKKwkJbXBkdV9ibGstPmJBTVNEVSA9IFJYX0JMS19URVNUX0ZMQUcocFJ4QmxrLCBmUlhfQU1TRFUpOworCisJCWNvbnZlcnRfcmVvcmRlcmluZ19wYWNrZXRfdG9fcHJlQU1TRFVfb3JfODAyXzNfcGFja2V0KHBBZCwgcFJ4QmxrLCBGcm9tV2hpY2hCU1NJRCk7CisKKwkJU1RBVFNfSU5DX1JYX1BBQ0tFVFMocEFkLCBGcm9tV2hpY2hCU1NJRCk7CisKKyAgICAgICAgLy8KKwkJLy8gaXQgaXMgbmVjZXNzYXJ5IGZvciByZW9yZGVyaW5nIHBhY2tldCB0byByZWNvcmQKKwkJLy8gd2hpY2ggQlNTIGl0IGNvbWUgZnJvbQorCQkvLworCQlSVE1QX1NFVF9QQUNLRVRfSUYocFJ4QmxrLT5wUnhQYWNrZXQsIEZyb21XaGljaEJTU0lEKTsKKworCQltcGR1X2Jsay0+cFBhY2tldCA9IHBSeEJsay0+cFJ4UGFja2V0OworCisJCWlmIChiYV9yZW9yZGVyaW5nX21wZHVfaW5zZXJ0c29ydGVkKCZwQkFFbnRyeS0+bGlzdCwgbXBkdV9ibGspID09IEZBTFNFKQorCQl7CisJCQkvLyBoYWQgYmVlbiBhbHJlYWR5IHdpdGhpbiByZW9yZGVyaW5nIGxpc3QKKwkJCS8vIGRvbid0IGluZGljYXRlCisJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4QmxrLT5wUnhQYWNrZXQsIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOworCQkJYmFfbXBkdV9ibGtfZnJlZShwQWQsIG1wZHVfYmxrKTsKKwkJfQorCisJCUFTU0VSVCgoMDw9IHBCQUVudHJ5LT5saXN0LnFsZW4pICAmJiAocEJBRW50cnktPmxpc3QucWxlbiA8PSBwQkFFbnRyeS0+QkFXaW5TaXplKSk7CisJCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBCQUVudHJ5LT5SeFJlUmluZ0xvY2spOworCX0KKwllbHNlCisJeworI2lmIDAKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICAoIiEhISAoJWQ6JWQpIENhbid0IGFsbG9jYXRlIHJlb3JkZXJpbmcgbXBkdSBibGtcbiIsCisJCQkJCQkJCSAgIGJsa19jb3VudCwgcEJBRW50cnktPmxpc3QucWxlbikpOworI2Vsc2UKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICAoIiEhISAoJWQpIENhbid0IGFsbG9jYXRlIHJlb3JkZXJpbmcgbXBkdSBibGtcbiIsCisJCQkJCQkJCSAgIHBCQUVudHJ5LT5saXN0LnFsZW4pKTsKKyNlbmRpZgorCQkvKgorCQkgKiBmbHVzaCBhbGwgcGVuZGluZyByZW9yZGVyaW5nIG1wZHVzCisJCSAqIGFuZCByZWNldmluZyBtcGR1IHRvIHVwcGVyIGxheWVyCisJCSAqIG1ha2UgdGNwL2lwIHRvIHRha2UgY2FyZSByZW9yZGVyaW5nIG1lY2hhbmlzbQorCQkgKi8KKwkJLy9iYV9yZWZyZXNoX3Jlb3JkZXJpbmdfbXBkdXMocEFkLCBwQkFFbnRyeSk7CisJCWJhX2luZGljYXRlX3Jlb3JkZXJpbmdfbXBkdXNfbGVfc2VxKHBBZCwgcEJBRW50cnksIFNlcXVlbmNlKTsKKworCQlwQkFFbnRyeS0+TGFzdEluZFNlcSA9IFNlcXVlbmNlOworCQlJTkRJQ0FURV9MRUdBQ1lfT1JfQU1TRFUocEFkLCBwUnhCbGssIEZyb21XaGljaEJTU0lEKTsKKwl9Cit9CisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlJbmRpY2F0ZSB0aGlzIHBhY2tldCB0byB1cHBlciBsYXllciBvciBwdXQgaXQgaW50byByZW9yZGVyaW5nIGJ1ZmZlcgorCisJUGFyYW1ldHJzOgorCQlwUnhCbGsgICAgICAgICA6IGNhcnJ5IG5lY2Vzc2FyeSBwYWNrZXQgaW5mbyA4MDIuMTEgZm9ybWF0CisJCUZyb21XaGljaEJTU0lEIDogdGhlIHBhY2tldCByZWNlaXZlZCBmcm9tIHdoaWNoIEJTUworCisJUmV0dXJuCToKKwkJCSAgbm9uZQorCisJTm90ZSAgICA6CisJICAgICAgICAgIHRoZSBwYWNrZXQgcXVldWVkIGludG8gcmVvcmRlcmluZyBidWZmZXIgbmVlZCB0byBjb3ZlciB0byA4MDIuMyBmb3JtYXQKKwkJCSAgb3IgcHJlX0FNU0RVIGZvcm1hdAorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworVk9JRCBJbmRpY2F0ZV9BTVBEVV9QYWNrZXQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUlhfQkxLCQkJKnBSeEJsaywKKwlJTglVQ0hBUgkJCUZyb21XaGljaEJTU0lEKQoreworCVVTSE9SVAkJCQlJZHg7CisJUEJBX1JFQ19FTlRSWQkJcEJBRW50cnkgPSBOVUxMOworCVVJTlQxNgkJCQlTZXF1ZW5jZSA9IHBSeEJsay0+cEhlYWRlci0+U2VxdWVuY2U7CisJVUxPTkcJCQkJTm93MzI7CisJVUNIQVIJCQkJV2NpZCA9IHBSeEJsay0+cFJ4V0ktPldpcmVsZXNzQ2xpSUQ7CisJVUNIQVIJCQkJVElEID0gcFJ4QmxrLT5wUnhXSS0+VElEOworCisKKwlpZiAoIVJYX0JMS19URVNUX0ZMQUcocFJ4QmxrLCBmUlhfQU1TRFUpICYmICAocFJ4QmxrLT5EYXRhU2l6ZSA+IE1BWF9SWF9QS1RfTEVOKSkKKwl7CisjaWYgMCAvLyBzYW1wbGUgdGFrZSBvZmYsIG5vIHVzZQorCQlzdGF0aWMgaW50IGVycl9zaXplOworCisJCWVycl9zaXplKys7CisJCWlmIChlcnJfc2l6ZSA+IDIwKSB7CisJCQkgcHJpbnRrKCJBTVBEVSBEYXRhU2l6ZSA9ICVkXG4iLCBwUnhCbGstPkRhdGFTaXplKTsKKwkJCSBoZXhfZHVtcCgiODAyLjExIEhlYWRlciIsIChVQ0hBUiAqKXBSeEJsay0+cEhlYWRlciwgMjQpOworCQkJIGhleF9kdW1wKCJQYXlsb2FkIiwgcFJ4QmxrLT5wRGF0YSwgNjQpOworCQkJIGVycl9zaXplID0gMDsKKwkJfQorI2VuZGlmCisJCS8vIHJlbGVhc2UgcGFja2V0CisJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhCbGstPnBSeFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCXJldHVybjsKKwl9CisKKworI2lmIDAgLy8gdGVzdAorCS8qIFJlYyBCQSBTZXNzaW9uIGhhZCBiZWVuIHRvcm4gZG93biAqLworCUlORElDQVRFX0xFR0FDWV9PUl9BTVNEVShwQWQsIHBSeEJsaywgRnJvbVdoaWNoQlNTSUQpOworCXJldHVybjsKKyNlbmRpZgorCisJaWYgKFdjaWQgPCBNQVhfTEVOX09GX01BQ19UQUJMRSkKKwl7CisJCUlkeCA9IHBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0uQkFSZWNXY2lkQXJyYXlbVElEXTsKKwkJaWYgKElkeCA9PSAwKQorCQl7CisJCQkvKiBSZWMgQkEgU2Vzc2lvbiBoYWQgYmVlbiB0b3JuIGRvd24gKi8KKwkJCUlORElDQVRFX0xFR0FDWV9PUl9BTVNEVShwQWQsIHBSeEJsaywgRnJvbVdoaWNoQlNTSUQpOworCQkJcmV0dXJuOworCQl9CisJCXBCQUVudHJ5ID0gJnBBZC0+QkFUYWJsZS5CQVJlY0VudHJ5W0lkeF07CisJfQorCWVsc2UKKwl7CisJCS8vIGltcG9zc2libGUgISEhCisJCUFTU0VSVCgwKTsKKwkJLy8gcmVsZWFzZSBwYWNrZXQKKwkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeEJsay0+cFJ4UGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJcmV0dXJuOworCX0KKworCUFTU0VSVChwQkFFbnRyeSk7CisKKwkvLyB1cGRhdGUgbGFzdCByeCB0aW1lCisJTmRpc0dldFN5c3RlbVVwVGltZSgmTm93MzIpOworCisJcEJBRW50cnktPnJjdlNlcSA9IFNlcXVlbmNlOworCisKKwliYV9mbHVzaF9yZW9yZGVyaW5nX3RpbWVvdXRfbXBkdXMocEFkLCBwQkFFbnRyeSwgTm93MzIpOworCXBCQUVudHJ5LT5MYXN0SW5kU2VxQXRUaW1lciA9IE5vdzMyOworCisJLy8KKwkvLyBSZXNldCBMYXN0IEluZGljYXRlIFNlcXVlbmNlCisJLy8KKwlpZiAocEJBRW50cnktPkxhc3RJbmRTZXEgPT0gUkVTRVRfUkNWX1NFUSkKKwl7CisJCUFTU0VSVCgocEJBRW50cnktPmxpc3QucWxlbiA9PSAwKSAmJiAocEJBRW50cnktPmxpc3QubmV4dCA9PSBOVUxMKSk7CisKKwkJLy8gcmVzZXQgcmN2IHNlcXVlbmNlIG9mIEJBIHNlc3Npb24KKwkJcEJBRW50cnktPkxhc3RJbmRTZXEgPSBTZXF1ZW5jZTsKKwkJcEJBRW50cnktPkxhc3RJbmRTZXFBdFRpbWVyID0gTm93MzI7CisJCUlORElDQVRFX0xFR0FDWV9PUl9BTVNEVShwQWQsIHBSeEJsaywgRnJvbVdoaWNoQlNTSUQpOworCQlyZXR1cm47CisJfQorCisKKwkvLworCS8vIEkuIENoZWNrIGlmIGluIG9yZGVyLgorCS8vCisJaWYgKFNFUV9TVEVQT05FKFNlcXVlbmNlLCBwQkFFbnRyeS0+TGFzdEluZFNlcSwgTUFYU0VRKSkKKwl7CisJCVVTSE9SVCAgTGFzdEluZFNlcTsKKworCQlwQkFFbnRyeS0+TGFzdEluZFNlcSA9IFNlcXVlbmNlOworCQlJTkRJQ0FURV9MRUdBQ1lfT1JfQU1TRFUocEFkLCBwUnhCbGssIEZyb21XaGljaEJTU0lEKTsKKyAJCUxhc3RJbmRTZXEgPSBiYV9pbmRpY2F0ZV9yZW9yZGVyaW5nX21wZHVzX2luX29yZGVyKHBBZCwgcEJBRW50cnksIHBCQUVudHJ5LT5MYXN0SW5kU2VxKTsKKwkJaWYgKExhc3RJbmRTZXEgIT0gUkVTRVRfUkNWX1NFUSkKKwkJeworCQkJcEJBRW50cnktPkxhc3RJbmRTZXEgPSBMYXN0SW5kU2VxOworCQl9CisJCXBCQUVudHJ5LT5MYXN0SW5kU2VxQXRUaW1lciA9IE5vdzMyOworCX0KKwkvLworCS8vIElJLiBEcm9wIER1cGxpY2F0ZWQgUGFja2V0CisJLy8KKwllbHNlIGlmIChTZXF1ZW5jZSA9PSBwQkFFbnRyeS0+TGFzdEluZFNlcSkKKwl7CisKKwkJLy8gZHJvcCBhbmQgcmVsZWFzZSBwYWNrZXQKKwkJcEJBRW50cnktPm5Ecm9wUGFja2V0Kys7CisJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhCbGstPnBSeFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJfQorCS8vCisJLy8gSUlJLiBEcm9wIE9sZCBSZWNlaXZlZCBQYWNrZXQKKwkvLworCWVsc2UgaWYgKFNFUV9TTUFMTEVSKFNlcXVlbmNlLCBwQkFFbnRyeS0+TGFzdEluZFNlcSwgTUFYU0VRKSkKKwl7CisKKwkJLy8gZHJvcCBhbmQgcmVsZWFzZSBwYWNrZXQKKwkJcEJBRW50cnktPm5Ecm9wUGFja2V0Kys7CisJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhCbGstPnBSeFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJfQorCS8vCisJLy8gSVYuIFJlY2VpdmUgU2VxdWVuY2Ugd2l0aGluIFdpbmRvdyBTaXplCisJLy8KKwllbHNlIGlmIChTRVFfU01BTExFUihTZXF1ZW5jZSwgKCgocEJBRW50cnktPkxhc3RJbmRTZXErcEJBRW50cnktPkJBV2luU2l6ZSsxKSkgJiBNQVhTRVEpLCBNQVhTRVEpKQorCXsKKwkJYmFfZW5xdWV1ZV9yZW9yZGVyaW5nX3BhY2tldChwQWQsIHBCQUVudHJ5LCBwUnhCbGssIEZyb21XaGljaEJTU0lEKTsKKwl9CisJLy8KKwkvLyBWLiBSZWNlaXZlIHNlcSBzdXJwYXNzZXMgV2luKGxhc3RzZXEgKyBuTVNEVSkuIFNvIHJlZnJlc2ggYWxsIHJlb3JkZXIgYnVmZmVyCisJLy8KKwllbHNlCisJeworI2lmIDAKKwkJYmFfcmVmcmVzaF9yZW9yZGVyaW5nX21wZHVzKHBBZCwgcEJBRW50cnkpOworCQlJTkRJQ0FURV9MRUdBQ1lfT1JfQU1TRFUocEFkLCBwUnhCbGssIEZyb21XaGljaEJTU0lEKTsKKyNlbHNlCisJCUxPTkcgV2luU3RhcnRTZXEsIFRtcFNlcTsKKworCisJCVRtcFNlcSA9IFNlcXVlbmNlIC0gKHBCQUVudHJ5LT5CQVdpblNpemUpIC0xOworCQlpZiAoVG1wU2VxIDwgMCkKKwkJeworCQkJVG1wU2VxID0gKE1BWFNFUSsxKSArIFRtcFNlcTsKKwkJfQorCQlXaW5TdGFydFNlcSA9IChUbXBTZXErMSkgJiBNQVhTRVE7CisJCWJhX2luZGljYXRlX3Jlb3JkZXJpbmdfbXBkdXNfbGVfc2VxKHBBZCwgcEJBRW50cnksIFdpblN0YXJ0U2VxKTsKKwkJcEJBRW50cnktPkxhc3RJbmRTZXEgPSBXaW5TdGFydFNlcTsgLy9UbXBTZXE7CisKKwkJcEJBRW50cnktPkxhc3RJbmRTZXFBdFRpbWVyID0gTm93MzI7CisKKwkJYmFfZW5xdWV1ZV9yZW9yZGVyaW5nX3BhY2tldChwQWQsIHBCQUVudHJ5LCBwUnhCbGssIEZyb21XaGljaEJTU0lEKTsKKworCQlUbXBTZXEgPSBiYV9pbmRpY2F0ZV9yZW9yZGVyaW5nX21wZHVzX2luX29yZGVyKHBBZCwgcEJBRW50cnksIHBCQUVudHJ5LT5MYXN0SW5kU2VxKTsKKwkJaWYgKFRtcFNlcSAhPSBSRVNFVF9SQ1ZfU0VRKQorCQl7CisJCQlwQkFFbnRyeS0+TGFzdEluZFNlcSA9IFRtcFNlcTsKKwkJfQorI2VuZGlmCisJfQorfQorCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL2NtbV9kYXRhLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9jbW1fZGF0YS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkODA5YWIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9jbW1fZGF0YS5jCkBAIC0wLDAgKzEsMjczNCBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworCisjaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCisKKyNkZWZpbmUgTUFYX1RYX0lOX1RCVFQJCSgxNikKKworCitVQ0hBUglTTkFQXzgwMl8xSFtdID0gezB4YWEsIDB4YWEsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDB9OworVUNIQVIJU05BUF9CUklER0VfVFVOTkVMW10gPSB7MHhhYSwgMHhhYSwgMHgwMywgMHgwMCwgMHgwMCwgMHhmOH07CisvLyBBZGQgQ2lzY28gQWlyb25ldCBTTkFQIGhlYWRlIGZvciBDQ1gyIHN1cHBvcnQKK1VDSEFSCVNOQVBfQUlST05FVFtdID0gezB4YWEsIDB4YWEsIDB4MDMsIDB4MDAsIDB4NDAsIDB4OTYsIDB4MDAsIDB4MDB9OworVUNIQVIJQ0tJUF9MTENfU05BUFtdID0gezB4YWEsIDB4YWEsIDB4MDMsIDB4MDAsIDB4NDAsIDB4OTYsIDB4MDAsIDB4MDJ9OworVUNIQVIJRUFQT0xfTExDX1NOQVBbXT0gezB4YWEsIDB4YWEsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODgsIDB4OGV9OworVUNIQVIJRUFQT0xbXSA9IHsweDg4LCAweDhlfTsKK1VDSEFSICAgVFBJRFtdID0gezB4ODEsIDB4MDB9OyAvKiBWTEFOIHJlbGF0ZWQgKi8KKworVUNIQVIJSVBYW10gPSB7MHg4MSwgMHgzN307CitVQ0hBUglBUFBMRV9UQUxLW10gPSB7MHg4MCwgMHhmM307CitVQ0hBUglSYXRlSWRUb1BsY3BTaWduYWxbMTJdID0geworCSAwLCAvKiBSQVRFXzEgKi8JMSwgLyogUkFURV8yICovIAkyLCAvKiBSQVRFXzVfNSAqLwkzLCAvKiBSQVRFXzExICovCS8vIHNlZSBCQlAgc3BlYworCTExLCAvKiBSQVRFXzYgKi8gICAxNSwgLyogUkFURV85ICovICAgIDEwLCAvKiBSQVRFXzEyICovICAgMTQsIC8qIFJBVEVfMTggKi8JLy8gc2VlIElFRUU4MDIuMTFhLTE5OTkgcC4xNAorCSA5LCAvKiBSQVRFXzI0ICovICAxMywgLyogUkFURV8zNiAqLwk4LCAvKiBSQVRFXzQ4ICovICAgMTIgIC8qIFJBVEVfNTQgKi8gfTsgLy8gc2VlIElFRUU4MDIuMTFhLTE5OTkgcC4xNAorCitVQ0hBUgkgT2ZkbVNpZ25hbFRvUmF0ZUlkWzE2XSA9IHsKKwlSQVRFXzU0LCAgUkFURV81NCwJUkFURV81NCwgIFJBVEVfNTQsCS8vIE9GRE0gUExDUCBTaWduYWwgPSAwLCAgMSwgIDIsICAzIHJlc3BlY3RpdmVseQorCVJBVEVfNTQsICBSQVRFXzU0LAlSQVRFXzU0LCAgUkFURV81NCwJLy8gT0ZETSBQTENQIFNpZ25hbCA9IDQsICA1LCAgNiwgIDcgcmVzcGVjdGl2ZWx5CisJUkFURV80OCwgIFJBVEVfMjQsCVJBVEVfMTIsICBSQVRFXzYsCS8vIE9GRE0gUExDUCBTaWduYWwgPSA4LCAgOSwgIDEwLCAxMSByZXNwZWN0aXZlbHkKKwlSQVRFXzU0LCAgUkFURV8zNiwJUkFURV8xOCwgIFJBVEVfOSwJLy8gT0ZETSBQTENQIFNpZ25hbCA9IDEyLCAxMywgMTQsIDE1IHJlc3BlY3RpdmVseQorfTsKKworVUNIQVIJIE9mZG1SYXRlVG9SeHdpTUNTWzEyXSA9IHsKKwkwLCAgMCwJMCwgIDAsCisJMCwgIDEsCTIsICAzLAkvLyBPRkRNIHJhdGUgNiw5LDEyLDE4ID0gcnh3aSBtY3MgMCwxLDIsMworCTQsICA1LAk2LCAgNywJLy8gT0ZETSByYXRlIDI0LDM2LDQ4LDU0ID0gcnh3aSBtY3MgNCw1LDYsNworfTsKK1VDSEFSCSBSeHdpTUNTVG9PZmRtUmF0ZVsxMl0gPSB7CisJUkFURV82LCAgUkFURV85LAlSQVRFXzEyLCAgUkFURV8xOCwKKwlSQVRFXzI0LCAgUkFURV8zNiwJUkFURV80OCwgIFJBVEVfNTQsCS8vIE9GRE0gcmF0ZSA2LDksMTIsMTggPSByeHdpIG1jcyAwLDEsMiwzCisJNCwgIDUsCTYsICA3LAkvLyBPRkRNIHJhdGUgMjQsMzYsNDgsNTQgPSByeHdpIG1jcyA0LDUsNiw3Cit9OworCitjaGFyKiAgIE1DU1RvTWJwc1tdID0geyIxTWJwcyIsIjJNYnBzIiwiNS41TWJwcyIsIjExTWJwcyIsIjA2TWJwcyIsIjA5TWJwcyIsIjEyTWJwcyIsIjE4TWJwcyIsIjI0TWJwcyIsIjM2TWJwcyIsIjQ4TWJwcyIsIjU0TWJwcyIsIk1NLTAiLCJNTS0xIiwiTU0tMiIsIk1NLTMiLCJNTS00IiwiTU0tNSIsIk1NLTYiLCJNTS03IiwiTU0tOCIsIk1NLTkiLCJNTS0xMCIsIk1NLTExIiwiTU0tMTIiLCJNTS0xMyIsIk1NLTE0IiwiTU0tMTUiLCJNTS0zMiIsImVlMSIsImVlMiIsImVlMyJ9OworCitVQ0hBUiBkZWZhdWx0X2N3bWluW109e0NXX01JTl9JTl9CSVRTLCBDV19NSU5fSU5fQklUUywgQ1dfTUlOX0lOX0JJVFMtMSwgQ1dfTUlOX0lOX0JJVFMtMn07CisvL1VDSEFSIGRlZmF1bHRfY3dtYXhbXT17Q1dfTUFYX0lOX0JJVFMsIENXX01BWF9JTl9CSVRTLCBDV19NSU5fSU5fQklUUywgQ1dfTUlOX0lOX0JJVFMtMX07CitVQ0hBUiBkZWZhdWx0X3N0YV9haWZzbltdPXszLDcsMiwyfTsKKworVUNIQVIgTWFwVXNlclByaW9yaXR5VG9BY2Nlc3NDYXRlZ29yeVs4XSA9IHtRSURfQUNfQkUsIFFJRF9BQ19CSywgUUlEX0FDX0JLLCBRSURfQUNfQkUsIFFJRF9BQ19WSSwgUUlEX0FDX1ZJLCBRSURfQUNfVk8sIFFJRF9BQ19WT307CisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCUFQSSBmb3IgTUxNRSB0byB0cmFuc21pdCBtYW5hZ2VtZW50IGZyYW1lIHRvIEFQIChCU1MgTW9kZSkKKwlvciBzdGF0aW9uIChJQlNTIE1vZGUpCisKKwlBcmd1bWVudHM6CisJCXBBZCBQb2ludGVyIHRvIG91ciBhZGFwdGVyCisJCXBEYXRhCQlQb2ludGVyIHRvIHRoZSBvdXRnb2luZyA4MDIuMTEgZnJhbWUKKwkJTGVuZ3RoCQlTaXplIG9mIG91dGdvaW5nIG1hbmFnZW1lbnQgZnJhbWUKKworCVJldHVybiBWYWx1ZToKKwkJTkRJU19TVEFUVVNfRkFJTFVSRQorCQlORElTX1NUQVRVU19QRU5ESU5HCisJCU5ESVNfU1RBVFVTX1NVQ0NFU1MKKworCUlSUUwgPSBQQVNTSVZFX0xFVkVMCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworTkRJU19TVEFUVVMgTWluaXBvcnRNTVJlcXVlc3QoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVUNIQVIJCQlRdWVJZHgsCisJSU4JUFVDSEFSCQkJcERhdGEsCisJSU4JVUlOVAkJCUxlbmd0aCkKK3sKKwlQTkRJU19QQUNLRVQJcFBhY2tldDsKKwlORElTX1NUQVRVUyAgCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisJVUxPTkcJIAkJRnJlZU51bTsKKwlVQ0hBUgkJCUlycVN0YXRlOworCVVDSEFSCQkJcnRtcEh3SGRyW1RYSU5GT19TSVpFICsgVFhXSV9TSVpFXTsgLy9SVE1QX0hXX0hEUl9MRU5dOworCisJQVNTRVJUKExlbmd0aCA8PSBNR01UX0RNQV9CVUZGRVJfU0laRSk7CisKKwlRdWVJZHg9MzsKKworCS8vIDI4NjBDIHVzZSBUeCBSaW5nCisKKwlJcnFTdGF0ZSA9IHBBZC0+aXJxX2Rpc2FibGVkOworCisJZG8KKwl7CisJCS8vIFJlc2V0IGlzIGluIHByb2dyZXNzLCBzdG9wIGltbWVkaWF0ZWx5CisJCWlmICggUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTKSB8fAorCQkJIFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKXx8CisJCQkgIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9TVEFSVF9VUCkpCisJCXsKKwkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX0ZBSUxVUkU7CisJCQlicmVhazsKKwkJfQorCisJCS8vIENoZWNrIEZyZWUgcHJpb3JpdHkgcXVldWUKKwkJLy8gU2luY2Ugd2UgdXNlIFBCRiBRdWV1ZTIgZm9yIG1hbmFnZW1lbnQgZnJhbWUuICBJdHMgY29ycmVzcG9uZGluZyBETUEgcmluZyBzaG91bGQgYmUgdXNpbmcgVHhSaW5nLgorCisJCS8vIDI4NjBDIHVzZSBUeCBSaW5nCisJCWlmIChwQWQtPk1BQ1ZlcnNpb24gPT0gMHgyODYwMDEwMCkKKwkJeworCQkJRnJlZU51bSA9IEdFVF9UWFJJTkdfRlJFRU5PKHBBZCwgUXVlSWR4KTsKKwkJfQorCQllbHNlCisJCXsKKwkJCUZyZWVOdW0gPSBHRVRfTUdNVFJJTkdfRlJFRU5PKHBBZCk7CisJCX0KKworCQlpZiAoKEZyZWVOdW0gPiAwKSkKKwkJeworCQkJLy8gV2UgbmVlZCB0byByZXNlcnZlIHNwYWNlIGZvciBydG1wIGhhcmR3YXJlIGhlYWRlci4gaS5lLiwgVHhXSSBmb3IgUlQyODYwIGFuZCBUeEluZm8rVHhXSSBmb3IgUlQyODcwCisJCQlOZGlzWmVyb01lbW9yeSgmcnRtcEh3SGRyLCAoVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkUpKTsKKwkJCVN0YXR1cyA9IFJUTVBBbGxvY2F0ZU5kaXNQYWNrZXQocEFkLCAmcFBhY2tldCwgKFBVQ0hBUikmcnRtcEh3SGRyLCAoVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkUpLCBwRGF0YSwgTGVuZ3RoKTsKKwkJCWlmIChTdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJCXsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19XQVJOLCAoIk1pbmlwb3J0TU1SZXF1ZXN0IChlcnJvcjo6IGNhbid0IGFsbG9jYXRlIE5ESVMgUEFDS0VUKVxuIikpOworCQkJCWJyZWFrOworCQkJfQorCisJCQkvL3BBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NT0RFID0gTU9ERV9DQ0s7CisJCQkvL3BBZC0+Q29tbW9uQ2ZnLk1sbWVSYXRlID0gUkFURV8yOworCisKKwkJCVN0YXR1cyA9IE1sbWVIYXJkVHJhbnNtaXQocEFkLCBRdWVJZHgsIHBQYWNrZXQpOworCQkJaWYgKFN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCQkJCVJUTVBGcmVlTmRpc1BhY2tldChwQWQsIHBQYWNrZXQpOworCQl9CisJCWVsc2UKKwkJeworCQkJcEFkLT5SYWxpbmtDb3VudGVycy5NZ210UmluZ0Z1bGxDb3VudCsrOworCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiUWlkeCglZCksIG5vdCBlbm91Z2ggc3BhY2UgaW4gTWdtdFJpbmcsIE1nbXRSaW5nRnVsbENvdW50PSVsZCFcbiIsCisJCQkJCQkJCQkJUXVlSWR4LCBwQWQtPlJhbGlua0NvdW50ZXJzLk1nbXRSaW5nRnVsbENvdW50KSk7CisJCX0KKworCX0gd2hpbGUgKEZBTFNFKTsKKworCisJcmV0dXJuIFN0YXR1czsKK30KKworCisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCUNvcHkgZnJhbWUgZnJvbSB3YWl0aW5nIHF1ZXVlIGludG8gcmVsYXRpdmUgcmluZyBidWZmZXIgYW5kIHNldAorCWFwcHJvcHJpYXRlIEFTSUMgcmVnaXN0ZXIgdG8ga2ljayBoYXJkd2FyZSB0cmFuc21pdCBmdW5jdGlvbgorCisJQXJndW1lbnRzOgorCQlwQWQgUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCQlwQnVmZmVyIAlQb2ludGVyIHRvCW1lbW9yeSBvZiBvdXRnb2luZyBmcmFtZQorCQlMZW5ndGgJCVNpemUgb2Ygb3V0Z29pbmcgbWFuYWdlbWVudCBmcmFtZQorCisJUmV0dXJuIFZhbHVlOgorCQlORElTX1NUQVRVU19GQUlMVVJFCisJCU5ESVNfU1RBVFVTX1BFTkRJTkcKKwkJTkRJU19TVEFUVVNfU1VDQ0VTUworCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitORElTX1NUQVRVUyBNbG1lSGFyZFRyYW5zbWl0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVDSEFSCQkJUXVlSWR4LAorCUlOCVBORElTX1BBQ0tFVAlwUGFja2V0KQoreworCWlmICgocEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkRNb2RlICE9IFJEX05PUk1BTF9NT0RFKQorI2lmZGVmIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQKKyNlbmRpZiAvLyBDQVJSSUVSX0RFVEVDVElPTl9TVVBQT1JUIC8vCisJCSkKKwl7CisJCXJldHVybiBORElTX1NUQVRVU19GQUlMVVJFOworCX0KKworCQlyZXR1cm4gTWxtZUhhcmRUcmFuc21pdE1nbXRSaW5nKHBBZCxRdWVJZHgscFBhY2tldCk7CisKK30KKworCisKK05ESVNfU1RBVFVTIE1sbWVIYXJkVHJhbnNtaXRNZ210UmluZygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVQ0hBUglRdWVJZHgsCisJSU4JUE5ESVNfUEFDS0VUCXBQYWNrZXQpCit7CisJUEFDS0VUX0lORk8gCVBhY2tldEluZm87CisJUFVDSEFSCQkJcFNyY0J1ZlZBOworCVVJTlQJCQlTcmNCdWZMZW47CisJUEhFQURFUl84MDJfMTEJcEhlYWRlcl84MDJfMTE7CisJQk9PTEVBTiAJCWJBY2tSZXF1aXJlZCwgYkluc2VydFRpbWVzdGFtcDsKKwlVQ0hBUgkJCU1sbWVSYXRlOworCVBUWFdJX1NUUlVDIAlwRmlyc3RUeFdJOworCU1BQ19UQUJMRV9FTlRSWQkqcE1hY0VudHJ5ID0gTlVMTDsKKworCVJUTVBfUXVlcnlQYWNrZXRJbmZvKHBQYWNrZXQsICZQYWNrZXRJbmZvLCAmcFNyY0J1ZlZBLCAmU3JjQnVmTGVuKTsKKworCS8vIE1ha2Ugc3VyZSBNR01UIHJpbmcgcmVzb3VyY2Ugd29uJ3QgYmUgdXNlZCBieSBvdGhlciB0aHJlYWRzCisvLyBzYW1wbGUsIGZvciBJUlEgTE9DSyAtPiBTRU0gTE9DSworLy8JSXJxU3RhdGUgPSBwQWQtPmlycV9kaXNhYmxlZDsKKy8vCWlmICghSXJxU3RhdGUpCisJCVJUTVBfU0VNX0xPQ0soJnBBZC0+TWdtdFJpbmdMb2NrKTsKKworCisJaWYgKHBTcmNCdWZWQSA9PSBOVUxMKQorCXsKKwkJLy8gVGhlIGJ1ZmZlciBzaG91bGRuJ3QgYmUgTlVMTAorLy8JCWlmICghSXJxU3RhdGUpCisJCQlSVE1QX1NFTV9VTkxPQ0soJnBBZC0+TWdtdFJpbmdMb2NrKTsKKwkJcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkU7CisJfQorCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwl7CisJCS8vIG91dGdvaW5nIGZyYW1lIGFsd2F5cyB3YWtldXAgUEhZIHRvIHByZXZlbnQgZnJhbWUgbG9zdAorCQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKSkKKwkJCUFzaWNGb3JjZVdha2V1cChwQWQsIFRSVUUpOworCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCXBGaXJzdFR4V0kgPSAoUFRYV0lfU1RSVUMpKHBTcmNCdWZWQSArICBUWElORk9fU0laRSk7CisJcEhlYWRlcl84MDJfMTEgPSAoUEhFQURFUl84MDJfMTEpIChwU3JjQnVmVkEgKyBUWElORk9fU0laRSArIFRYV0lfU0laRSk7IC8vVFhXSV9TSVpFKTsKKworCWlmIChwSGVhZGVyXzgwMl8xMS0+QWRkcjFbMF0gJiAweDAxKQorCXsKKwkJTWxtZVJhdGUgPSBwQWQtPkNvbW1vbkNmZy5CYXNpY01sbWVSYXRlOworCX0KKwllbHNlCisJeworCQlNbG1lUmF0ZSA9IHBBZC0+Q29tbW9uQ2ZnLk1sbWVSYXRlOworCX0KKworCS8vIFZlcmlmeSBNbG1lIHJhdGUgZm9yIGEgLyBnIGJhbmRzLgorCWlmICgocEFkLT5MYXRjaFJmUmVncy5DaGFubmVsID4gMTQpICYmIChNbG1lUmF0ZSA8IFJBVEVfNikpIC8vIDExQSBiYW5kCisJCU1sbWVSYXRlID0gUkFURV82OworCisJaWYgKChwSGVhZGVyXzgwMl8xMS0+RkMuVHlwZSA9PSBCVFlQRV9EQVRBKSAmJgorCQkocEhlYWRlcl84MDJfMTEtPkZDLlN1YlR5cGUgPT0gU1VCVFlQRV9RT1NfTlVMTCkpCisJeworCQlwTWFjRW50cnkgPSBNYWNUYWJsZUxvb2t1cChwQWQsIHBIZWFkZXJfODAyXzExLT5BZGRyMSk7CisJfQorCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwl7CisJCS8vIEZpeGVkIFc1MiB3aXRoIEFjdGl2aXR5IHNjYW4gaXNzdWUgaW4gQUJHX01JWEVEIGFuZCBBQkdOX01JWEVEIG1vZGUuCisJCWlmIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUFCR19NSVhFRAorI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJfHwgcEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFBQkdOX01JWEVECisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCSkKKwkJeworCQkJaWYgKHBBZC0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbCA+IDE0KQorCQkJCXBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NT0RFID0gMTsKKwkJCWVsc2UKKwkJCQlwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTU9ERSA9IDA7CisJCX0KKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwkvLworCS8vIFNob3VsZCBub3QgYmUgaGFyZCBjb2RlIHRvIHNldCBQd3JNZ210IHRvIDAgKFBXUl9BQ1RJVkUpCisJLy8gU25pY2UgaXQncyBiZWVuIHNldCB0byAwIHdoaWxlIG9uIE1ndE1hY0hlYWRlckluaXQKKwkvLyBCeSB0aGUgd2F5IHRoaXMgd2lsbCBjYXVzZSBmcmFtZSB0byBiZSBzZW5kIG9uIFBXUl9TQVZFIGZhaWxlZC4KKwkvLworCS8vIHBIZWFkZXJfODAyXzExLT5GQy5Qd3JNZ210ID0gMDsgLy8gKHBBZC0+U3RhQ2ZnLlBzbSA9PSBQV1JfU0FWRSk7CisJLy8KKwkvLyBJbiBXTU0tVUFQU0QsIG1sbWUgZnJhbWUgc2hvdWxkIGJlIHNldCBwc20gYXMgcG93ZXIgc2F2aW5nIGJ1dCBwcm9iZSByZXF1ZXN0IGZyYW1lCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisgICAgLy8gRGF0YS1OdWxsIHBhY2tldHMgYWxzZSBwYXNzIHRocm91Z2ggTU1SZXF1ZXN0IGluIFJUMjg2MCwgaG93ZXZlciwgd2UgaG9wZSBjb250cm9sIHRoZSBwc20gYml0IHRvIHBhc3MgQVBTRAorCWlmICgocEhlYWRlcl84MDJfMTEtPkZDLlR5cGUgIT0gQlRZUEVfREFUQSkgJiYgKHBIZWFkZXJfODAyXzExLT5GQy5UeXBlICE9IEJUWVBFX0NOVEwpKQorCXsKKwkJaWYgKChwQWQtPlN0YUNmZy5Qc20gPT0gUFdSX1NBVkUpICYmCisJCQkocEhlYWRlcl84MDJfMTEtPkZDLlN1YlR5cGUgPT0gU1VCVFlQRV9BQ1RJT04pKQorCQkJcEhlYWRlcl84MDJfMTEtPkZDLlB3ck1nbXQgPSBQV1JfU0FWRTsKKwkJZWxzZQorCQkJcEhlYWRlcl84MDJfMTEtPkZDLlB3ck1nbXQgPSBQV1JfQUNUSVZFOworCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCWJJbnNlcnRUaW1lc3RhbXAgPSBGQUxTRTsKKwlpZiAocEhlYWRlcl84MDJfMTEtPkZDLlR5cGUgPT0gQlRZUEVfQ05UTCkgLy8gbXVzdCBiZSBQUy1QT0xMCisJeworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQkvL1NldCBQTSBiaXQgaW4gcHMtcG9sbCwgdG8gZml4IFdMSyAxLjIgIFBvd2VyU2F2ZU1vZGVfZXh0IGZhaWx1cmUgaXNzdWUuCisJCWlmICgocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkgJiYgKHBIZWFkZXJfODAyXzExLT5GQy5TdWJUeXBlID09IFNVQlRZUEVfUFNfUE9MTCkpCisJCXsKKwkJCXBIZWFkZXJfODAyXzExLT5GQy5Qd3JNZ210ID0gUFdSX1NBVkU7CisJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwkJYkFja1JlcXVpcmVkID0gRkFMU0U7CisJfQorCWVsc2UgLy8gQlRZUEVfTUdNVCBvciBCVFlQRV9EQVRBKG11c3QgYmUgTlVMTCBmcmFtZSkKKwl7CisJCS8vcEFkLT5TZXF1ZW5jZSsrOworCQkvL3BIZWFkZXJfODAyXzExLT5TZXF1ZW5jZSA9IHBBZC0+U2VxdWVuY2U7CisKKwkJaWYgKHBIZWFkZXJfODAyXzExLT5BZGRyMVswXSAmIDB4MDEpIC8vIE1VTFRJQ0FTVCwgQlJPQURDQVNUCisJCXsKKwkJCWJBY2tSZXF1aXJlZCA9IEZBTFNFOworCQkJcEhlYWRlcl84MDJfMTEtPkR1cmF0aW9uID0gMDsKKwkJfQorCQllbHNlCisJCXsKKwkJCWJBY2tSZXF1aXJlZCA9IFRSVUU7CisJCQlwSGVhZGVyXzgwMl8xMS0+RHVyYXRpb24gPSBSVE1QQ2FsY0R1cmF0aW9uKHBBZCwgTWxtZVJhdGUsIDE0KTsKKwkJCWlmIChwSGVhZGVyXzgwMl8xMS0+RkMuU3ViVHlwZSA9PSBTVUJUWVBFX1BST0JFX1JTUCkKKwkJCXsKKwkJCQliSW5zZXJ0VGltZXN0YW1wID0gVFJVRTsKKwkJCX0KKwkJfQorCX0KKworCXBIZWFkZXJfODAyXzExLT5TZXF1ZW5jZSA9IHBBZC0+U2VxdWVuY2UrKzsKKwlpZiAocEFkLT5TZXF1ZW5jZSA+MHhmZmYpCisJCXBBZC0+U2VxdWVuY2UgPSAwOworCisJLy8gQmVmb3JlIHJhZGFyIGRldGVjdGlvbiBkb25lLCBtZ210IGZyYW1lIGNhbiBub3QgYmUgc2VudCBidXQgcHJvYmUgcmVxCisJLy8gQmVjYXVzZSB3ZSBuZWVkIHRvIHVzZSBwcm9iZSByZXEgdG8gdHJpZ2dlciBkcml2ZXIgdG8gc2VuZCBwcm9iZSByZXEgaW4gcGFzc2l2ZSBzY2FuCisJaWYgKChwSGVhZGVyXzgwMl8xMS0+RkMuU3ViVHlwZSAhPSBTVUJUWVBFX1BST0JFX1JFUSkKKwkJJiYgKHBBZC0+Q29tbW9uQ2ZnLmJJRUVFODAyMTFIID09IDEpCisJCSYmIChwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5SRE1vZGUgIT0gUkRfTk9STUFMX01PREUpKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJNbG1lSGFyZFRyYW5zbWl0IC0tPiByYWRhciBkZXRlY3Qgbm90IGluIG5vcm1hbCBtb2RlICEhIVxuIikpOworLy8JCWlmICghSXJxU3RhdGUpCisJCQlSVE1QX1NFTV9VTkxPQ0soJnBBZC0+TWdtdFJpbmdMb2NrKTsKKwkJcmV0dXJuIChORElTX1NUQVRVU19GQUlMVVJFKTsKKwl9CisKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJUlRNUEZyYW1lRW5kaWFuQ2hhbmdlKHBBZCwgKFBVQ0hBUilwSGVhZGVyXzgwMl8xMSwgRElSX1dSSVRFLCBGQUxTRSk7CisjZW5kaWYKKworCS8vCisJLy8gZmlsbCBzY2F0dGVyLWFuZC1nYXRoZXIgYnVmZmVyIGxpc3QgaW50byBUWEQuIEludGVybmFsbHkgY3JlYXRlZCBORElTIFBBQ0tFVAorCS8vIHNob3VsZCBhbHdheXMgaGFzIG9ubHkgb25lIG9oeXNpY2FsIGJ1ZmZlciwgYW5kIHRoZSB3aG9sZSBmcmFtZSBzaXplIGVxdWFscworCS8vIHRvIHRoZSBmaXJzdCBzY2F0dGVyIGJ1ZmZlciBzaXplCisJLy8KKworCS8vIEluaXRpYWxpemUgVFggRGVzY3JpcHRvcgorCS8vIEZvciBpbnRlci1mcmFtZSBnYXAsIHRoZSBudW1iZXIgaXMgZm9yIHRoaXMgZnJhbWUgYW5kIG5leHQgZnJhbWUKKwkvLyBGb3IgTUxNRSByYXRlLCB3ZSB3aWxsIGZpeCBhcyAyTWIgdG8gbWF0Y2ggb3RoZXIgdmVuZG9yJ3MgaW1wbGVtZW50CisvLwlwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTU9ERSA9IDE7CisKKy8vIG1hbmFnZW1lbnQgZnJhbWUgZG9lc24ndCBuZWVkIGVuY3J5cHRpb24uIHNvIHVzZSBSRVNFUlZFRF9XQ0lEIG5vIG1hdHRlciB1IGFyZSBzZW5kaW5nIHRvIHNwZWNpZmljIHdjaWQgb3Igbm90LgorCWlmIChwTWFjRW50cnkgPT0gTlVMTCkKKwl7CisJCVJUTVBXcml0ZVR4V0kocEFkLCBwRmlyc3RUeFdJLCBGQUxTRSwgRkFMU0UsIGJJbnNlcnRUaW1lc3RhbXAsIEZBTFNFLCBiQWNrUmVxdWlyZWQsIEZBTFNFLAorCQkwLCBSRVNFUlZFRF9XQ0lELCAoU3JjQnVmTGVuIC0gVFhJTkZPX1NJWkUgLSBUWFdJX1NJWkUpLCBQSURfTUdNVCwgMCwgIChVQ0hBUilwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTUNTLCBJRlNfQkFDS09GRiwgRkFMU0UsICZwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQpOworCX0KKwllbHNlCisJeworCQlSVE1QV3JpdGVUeFdJKHBBZCwgcEZpcnN0VHhXSSwgRkFMU0UsIEZBTFNFLAorCQkJCQliSW5zZXJ0VGltZXN0YW1wLCBGQUxTRSwgYkFja1JlcXVpcmVkLCBGQUxTRSwKKwkJCQkJMCwgcE1hY0VudHJ5LT5BaWQsIChTcmNCdWZMZW4gLSBUWElORk9fU0laRSAtIFRYV0lfU0laRSksCisJCQkJCXBNYWNFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1DUywgMCwKKwkJCQkJKFVDSEFSKXBNYWNFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1DUywKKwkJCQkJSUZTX0JBQ0tPRkYsIEZBTFNFLCAmcE1hY0VudHJ5LT5NYXhIVFBoeU1vZGUpOworCX0KKworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwlSVE1QV0lFbmRpYW5DaGFuZ2UoKFBVQ0hBUilwRmlyc3RUeFdJLCBUWVBFX1RYV0kpOworI2VuZGlmCisKKwkvLyBOb3cgZG8gaGFyZHdhcmUtZGVwZW5lZCBraWNrIG91dC4KKwlIQUxfS2lja091dE1nbXRUeChwQWQsIFF1ZUlkeCwgcFBhY2tldCwgcFNyY0J1ZlZBLCBTcmNCdWZMZW4pOworCisJLy8gTWFrZSBzdXJlIHRvIHJlbGVhc2UgTUdNVCByaW5nIHJlc291cmNlCisvLwlpZiAoIUlycVN0YXRlKQorCQlSVE1QX1NFTV9VTkxPQ0soJnBBZC0+TWdtdFJpbmdMb2NrKTsKKwlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCU5ldyBEZVF1ZXVlIFByb2NlZHVyZXMuCisKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBERVFVRVVFX0xPQ0sobG9jaywgYkludENvbnRleHQsIElycUZsYWdzKSAJCQkJXAorCQkJZG97CQkJCQkJCQkJCQkJCVwKKwkJCQlpZiAoYkludENvbnRleHQgPT0gRkFMU0UpCQkJCQkJXAorCQkJCVJUTVBfSVJRX0xPQ0soKGxvY2spLCBJcnFGbGFncyk7CQlcCisJCQl9d2hpbGUoMCkKKworI2RlZmluZSBERVFVRVVFX1VOTE9DSyhsb2NrLCBiSW50Q29udGV4dCwgSXJxRmxhZ3MpCQkJCVwKKwkJCWRvewkJCQkJCQkJCQkJCQlcCisJCQkJaWYgKGJJbnRDb250ZXh0ID09IEZBTFNFKQkJCQkJCVwKKwkJCQkJUlRNUF9JUlFfVU5MT0NLKChsb2NrKSwgSXJxRmxhZ3MpOwlcCisJCQl9d2hpbGUoMCkKKworCisjaWYgMAorc3RhdGljIFZPSUQgZHVtcFR4QmxrKFRYX0JMSyAqcFR4QmxrKQoreworCU5ESVNfUEFDS0VUICpwUGFja2V0OworCWludCBpLCBmcmFtZU51bTsKKwlQUVVFVUVfRU5UUlkJcFFFbnRyeTsKKworCXByaW50aygiRHVtcCBUWF9CTEsgU3RydWN0dXJlOlxuIik7CisJcHJpbnRrKCJcdFR4RnJhbWVUeXBlPSVkIVxuIiwgcFR4QmxrLT5UeEZyYW1lVHlwZSk7CisJcHJpbnRrKCJcdFRvdGFsRnJhbWVMZW49JWRcbiIsIHBUeEJsay0+VG90YWxGcmFtZUxlbik7CisJcHJpbnRrKCJcdFRvdGFsRnJhbWVOdW09JWxkIVxuIiwgcFR4QmxrLT5UeFBhY2tldExpc3QuTnVtYmVyKTsKKwlwcmludGsoIlx0VG90YWxGcmFnTnVtPSVkIVxuIiwgcFR4QmxrLT5Ub3RhbEZyYWdOdW0pOworCXByaW50aygiXHRwUGFja2V0TGlzdD1cbiIpOworCisJZnJhbWVOdW0gPSBwVHhCbGstPlR4UGFja2V0TGlzdC5OdW1iZXI7CisKKwlmb3IoaT0wOyBpIDwgZnJhbWVOdW07IGkrKykKKwl7CWludCBqOworCQlVQ0hBUgkqcEJ1ZjsKKworCQlwUUVudHJ5ID0gUmVtb3ZlSGVhZFF1ZXVlKCZwVHhCbGstPlR4UGFja2V0TGlzdCk7CisJCXBQYWNrZXQgPSBRVUVVRV9FTlRSWV9UT19QQUNLRVQocFFFbnRyeSk7CisJCWlmIChwUGFja2V0KQorCQl7CisJCQlwQnVmID0gR0VUX09TX1BLVF9EQVRBUFRSKHBQYWNrZXQpOworCQkJcHJpbnRrKCJcdFx0WyVkXTpwdHI9MHgleCwgTGVuPSVkIVxuIiwgaSwgKFVJTlQzMikoR0VUX09TX1BLVF9EQVRBUFRSKHBQYWNrZXQpKSwgR0VUX09TX1BLVF9MRU4ocFBhY2tldCkpOworCQkJcHJpbnRrKCJcdFx0Iik7CisJCQlmb3IgKGogPTAgOyBqIDwgR0VUX09TX1BLVF9MRU4ocFBhY2tldCk7IGorKykKKwkJCXsKKwkJCQlwcmludGsoIiUwMnggIiwgKHBCdWZbal0gJiAweGZmKSk7CisJCQkJaWYgKGogPT0gMTYpCisJCQkJCWJyZWFrOworCQkJfQorCQkJSW5zZXJ0VGFpbFF1ZXVlKCZwVHhCbGstPlR4UGFja2V0TGlzdCwgUEFDS0VUX1RPX1FVRVVFX0VOVFJZKHBQYWNrZXQpKTsKKwkJfQorCX0KKwlwcmludGsoIlx0V2NpZD0lZCFcbiIsIHBUeEJsay0+V2NpZCk7CisJcHJpbnRrKCJcdGFwaWR4PSVkIVxuIiwgcFR4QmxrLT5hcGlkeCk7CisJcHJpbnRrKCItLS0tRW5kT2ZEdW1wXG4iKTsKKworfQorI2VuZGlmCisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlUeCBQYXRoIGRlc2lnbiBhbGdvcml0aG06CisJCUJhc2ljYWxseSwgd2UgZGl2aWRlIHRoZSBwYWNrZXRzIGludG8gZm91ciB0eXBlcywgQnJvYWRjYXN0L011bHRpY2FzdCwgMTFOIFJhdGUoQU1QRFUsIEFNU0RVLCBOb3JtYWwpLCBCL0cgUmF0ZShBUkFMSU5LLCBOb3JtYWwpLAorCQlTcGVjaWZpYyBQYWNrZXQgVHlwZS4gRm9sbG93aW5nIHNob3cgdGhlIGNsYXNzaWZpY2F0aW9uIHJ1bGUgYW5kIHBvbGljeSBmb3IgZWFjaCBraW5kcyBvZiBwYWNrZXRzLgorCQkJCUNsYXNzaWZpY2F0aW9uIFJ1bGU9PgorCQkJCQlNdWx0aWNhc3Q6ICgqYWRkcjEgJiAweDAxKSA9PSAweDAxCisJCQkJCVNwZWNpZmljIDogYkRIQ1BGcmFtZSwgYkFSUEZyYW1lLCBiRUFQT0xGcmFtZSwgZXRjLgorCQkJCQkxMU4gUmF0ZSA6IElmIHBlZXIgc3VwcG9ydCBIVAorCQkJCQkJCQkoMSkuQU1QRFUgIC0tIElmIFRYQkEgaXMgbmVnb3RpYXRlZC4KKwkJCQkJCQkJKDIpLkFNU0RVICAtLSBJZiBBTVNEVSBpcyBjYXBhYmxlIGZvciBib3RoIHBlZXIgYW5kIG91cnNlbGYuCisJCQkJCQkJCQkJCSopLiBBTVNEVSBjYW4gZW1iZWRkZWQgaW4gYSBBTVBEVSwgYnV0IG5vdyB3ZSBkaWRuJ3Qgc3VwcG9ydCBpdC4KKwkJCQkJCQkJKDMpLk5vcm1hbCAtLSBPdGhlciBwYWNrZXRzIHdoaWNoIHNlbmQgYXMgMTFuIHJhdGUuCisKKwkJCQkJQi9HIFJhdGUgOiBJZiBwZWVyIGlzIGIvZyBvbmx5LgorCQkJCQkJCQkoMSkuQVJBTElOSy0tIElmIGJvdGggb2YgcGVlci91cyBzdXBwcm90IFJhbGluayBwcm9wcmlldGFyeSBBZ2dyZWdhdGlvbiBhbmQgdGhlIFR4UmF0ZSBpcyBsYXJnZSB0aGFuIFJBVEVfNgorCQkJCQkJCQkoMikuTm9ybWFsIC0tIE90aGVyIHBhY2tldHMgd2hpY2ggc2VuZCBhcyBiL2cgcmF0ZS4KKwkJCQkJRnJhZ21lbnQ6CisJCQkJCQkJCVRoZSBwYWNrZXQgbXVzdCBiZSB1bmljYXN0LCBOT1QgQS1SQUxJTkssIE5PVCBBLU1TRFUsIE5PVCAxMW4sIHRoZW4gY2FuIGNvbnNpZGVyIGFib3V0IGZyYWdtZW50LgorCisJCQkJQ2xhc3NpZmllZCBQYWNrZXQgSGFuZGxlIFJ1bGU9PgorCQkJCQlNdWx0aWNhc3Q6CisJCQkJCQkJCU5vIEFDSywgCQkvL3BUeEJsay0+YkFja1JlcXVpcmVkID0gRkFMU0U7CisJCQkJCQkJCU5vIFdNTSwgCQkvL3BUeEJsay0+YldNTSA9IEZBTFNFOworCQkJCQkJCQlObyBwaWdneWJhY2ssICAgLy9wVHhCbGstPmJQaWdneUJhY2sgPSBGQUxTRTsKKwkJCQkJCQkJRm9yY2UgTG93UmF0ZSwgIC8vcFR4QmxrLT5iRm9yY2VMb3dSYXRlID0gVFJVRTsKKwkJCQkJU3BlY2lmaWMgOglCYXNpY2FsbHksIGZvciBzcGVjaWZpYyBwYWNrZXQsIHdlIHNob3VsZCBoYW5kbGUgaXQgc3BlY2lmaWNhbGx5LCBidXQgbm93IGFsbCBzcGVjaWZpYyBwYWNrZXRzIGFyZSB1c2UKKwkJCQkJCQkJCXRoZSBzYW1lIHBvbGljeSB0byBoYW5kbGUgaXQuCisJCQkJCQkJCUZvcmNlIExvd1JhdGUsICAvL3BUeEJsay0+YkZvcmNlTG93UmF0ZSA9IFRSVUU7CisKKwkJCQkJMTFOIFJhdGUgOgorCQkJCQkJCQlObyBwaWdneWJhY2ssCS8vcFR4QmxrLT5iUGlnZ3lCYWNrID0gRkFMU0U7CisKKwkJCQkJCQkJKDEpLkFNU0RVCisJCQkJCQkJCQlwVHhCbGstPmJXTU0gPSBUUlVFOworCQkJCQkJCQkoMikuQU1QRFUKKwkJCQkJCQkJCXBUeEJsay0+YldNTSA9IFRSVUU7CisJCQkJCQkJCSgzKS5Ob3JtYWwKKworCQkJCQlCL0cgUmF0ZSA6CisJCQkJCQkJCSgxKS5BUkFMSU5LCisKKwkJCQkJCQkJKDIpLk5vcm1hbAorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK3N0YXRpYyBVQ0hBUiBUeFBrdENsYXNzaWZpY2F0aW9uKAorCUlOIFJUTVBfQURBUFRFUiAqcEFkLAorCUlOIFBORElTX1BBQ0tFVCAgcFBhY2tldCkKK3sKKwlVQ0hBUgkJCVR4RnJhbWVUeXBlID0gVFhfVU5LT1dOX0ZSQU1FOworCVVDSEFSCQkJV2NpZDsKKwlNQUNfVEFCTEVfRU5UUlkJKnBNYWNFbnRyeSA9IE5VTEw7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJQk9PTEVBTgkJCWJIVFJhdGUgPSBGQUxTRTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCVdjaWQgPSBSVE1QX0dFVF9QQUNLRVRfV0NJRChwUGFja2V0KTsKKwlpZiAoV2NpZCA9PSBNQ0FTVF9XQ0lEKQorCXsJLy8gSGFuZGxlIGZvciBSQSBpcyBCcm9hZGNhc3QvTXVsdGljYXN0IEFkZHJlc3MuCisJCXJldHVybiBUWF9NQ0FTVF9GUkFNRTsKKwl9CisKKwkvLyBIYW5kbGUgZm9yIHVuaWNhc3QgcGFja2V0cworCXBNYWNFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W1djaWRdOworCWlmIChSVE1QX0dFVF9QQUNLRVRfTE9XUkFURShwUGFja2V0KSkKKwl7CS8vIEl0J3MgYSBzcGVjaWZpYyBwYWNrZXQgbmVlZCB0byBmb3JjZSBsb3cgcmF0ZSwgaS5lLiwgYkRIQ1BGcmFtZSwgYkVBUE9MRnJhbWUsIGJXQUlGcmFtZQorCQlUeEZyYW1lVHlwZSA9IFRYX0xFR0FDWV9GUkFNRTsKKwl9CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJZWxzZSBpZiAoSVNfSFRfUkFURShwTWFjRW50cnkpKQorCXsJLy8gaXQncyBhIDExbiBjYXBhYmxlIHBhY2tldAorCisJCS8vIERlcGVuZHMgb24gSFRQaHlNb2RlIHRvIGNoZWNrIGlmIHRoZSBwZWVyIHN1cHBvcnQgdGhlIEhUUmF0ZSB0cmFuc21pc3Npb24uCisJCS8vIAlDdXJyZW50bHkgZGlkbid0IHN1cHBvcnQgQS1NU0RVIGVtYmVkZGVkIGluIEEtTVBEVQorCQliSFRSYXRlID0gVFJVRTsKKwkJaWYgKFJUTVBfR0VUX1BBQ0tFVF9NT1JFREFUQShwUGFja2V0KSB8fCAocE1hY0VudHJ5LT5Qc01vZGUgPT0gUFdSX1NBVkUpKQorCQkJVHhGcmFtZVR5cGUgPSBUWF9MRUdBQ1lfRlJBTUU7CisjaWZkZWYgVUFQU0RfQVBfU1VQUE9SVAorCQllbHNlIGlmIChSVE1QX0dFVF9QQUNLRVRfRU9TUChwUGFja2V0KSkKKwkJCVR4RnJhbWVUeXBlID0gVFhfTEVHQUNZX0ZSQU1FOworI2VuZGlmIC8vIFVBUFNEX0FQX1NVUFBPUlQgLy8KKwkJZWxzZSBpZigocE1hY0VudHJ5LT5UWEJBYml0bWFwICYgKDE8PChSVE1QX0dFVF9QQUNLRVRfVVAocFBhY2tldCkpKSkgIT0gMCkKKwkJCXJldHVybiBUWF9BTVBEVV9GUkFNRTsKKwkJZWxzZSBpZihDTElFTlRfU1RBVFVTX1RFU1RfRkxBRyhwTWFjRW50cnksIGZDTElFTlRfU1RBVFVTX0FNU0RVX0lOVVNFRCkpCisJCQlyZXR1cm4gVFhfQU1TRFVfRlJBTUU7CisJCWVsc2UKKwkJCVR4RnJhbWVUeXBlID0gVFhfTEVHQUNZX0ZSQU1FOworCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwllbHNlCisJewkvLyBpdCdzIGEgbGVnYWN5IGIvZyBwYWNrZXQuCisJCWlmICgoQ0xJRU5UX1NUQVRVU19URVNUX0ZMQUcocE1hY0VudHJ5LCBmQ0xJRU5UX1NUQVRVU19BR0dSRUdBVElPTl9DQVBBQkxFKSAmJiBwQWQtPkNvbW1vbkNmZy5iQWdncmVnYXRpb25DYXBhYmxlKSAmJgorCQkJKFJUTVBfR0VUX1BBQ0tFVF9UWFJBVEUocFBhY2tldCkgPj0gUkFURV82KSAmJgorCQkJKCEoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19XTU1fSU5VU0VEKSAmJiBDTElFTlRfU1RBVFVTX1RFU1RfRkxBRyhwTWFjRW50cnksIGZDTElFTlRfU1RBVFVTX1dNTV9DQVBBQkxFKSkpKQorCQl7CS8vIGlmIHBlZXIgc3VwcG9ydCBSYWxpbmsgQWdncmVnYXRpb24sIHdlIHVzZSBpdC4KKwkJCVR4RnJhbWVUeXBlID0gVFhfUkFMSU5LX0ZSQU1FOworCQl9CisJCWVsc2UKKwkJeworCQkJVHhGcmFtZVR5cGUgPSBUWF9MRUdBQ1lfRlJBTUU7CisJCX0KKwl9CisKKwkvLyBDdXJyZW50bHksIG91ciBmcmFnbWVudCBvbmx5IHN1cHBvcnQgd2hlbiBhIHVuaWNhc3QgcGFja2V0IHNlbmQgYXMgTk9ULUFSQUxJTkssIE5PVC1BTVNEVSBhbmQgTk9ULUFNUERVLgorCWlmICgoUlRNUF9HRVRfUEFDS0VUX0ZSQUdNRU5UUyhwUGFja2V0KSA+IDEpICYmIChUeEZyYW1lVHlwZSA9PSBUWF9MRUdBQ1lfRlJBTUUpKQorCQlUeEZyYW1lVHlwZSA9IFRYX0ZSQUdfRlJBTUU7CisKKwlyZXR1cm4gVHhGcmFtZVR5cGU7Cit9CisKKworQk9PTEVBTiBSVE1QX0ZpbGxUeEJsa0luZm8oCisJSU4gUlRNUF9BREFQVEVSICpwQWQsCisJSU4gVFhfQkxLICpwVHhCbGspCit7CisJUEFDS0VUX0lORk8JCQlQYWNrZXRJbmZvOworCVBORElTX1BBQ0tFVAkJcFBhY2tldDsKKwlQTUFDX1RBQkxFX0VOVFJZCXBNYWNFbnRyeSA9IE5VTEw7CisKKwlwUGFja2V0ID0gcFR4QmxrLT5wUGFja2V0OworCVJUTVBfUXVlcnlQYWNrZXRJbmZvKHBQYWNrZXQsICZQYWNrZXRJbmZvLCAmcFR4QmxrLT5wU3JjQnVmSGVhZGVyLCAmcFR4QmxrLT5TcmNCdWZMZW4pOworCisJcFR4QmxrLT5XY2lkCSAJIAkJPSBSVE1QX0dFVF9QQUNLRVRfV0NJRChwUGFja2V0KTsKKwlwVHhCbGstPmFwaWR4CQkgCQk9IFJUTVBfR0VUX1BBQ0tFVF9JRihwUGFja2V0KTsKKwlwVHhCbGstPlVzZXJQcmlvcml0eSAJCT0gUlRNUF9HRVRfUEFDS0VUX1VQKHBQYWNrZXQpOworCXBUeEJsay0+RnJhbWVHYXAgPSBJRlNfSFRUWE9QOwkJLy8gQVNJQyBkZXRlcm1pbmUgRnJhbWUgR2FwCisKKwlpZiAoUlRNUF9HRVRfUEFDS0VUX0NMRUFSX0VBUF9GUkFNRShwVHhCbGstPnBQYWNrZXQpKQorCQlUWF9CTEtfU0VUX0ZMQUcocFR4QmxrLCBmVFhfYkNsZWFyRUFQRnJhbWUpOworCWVsc2UKKwkJVFhfQkxLX0NMRUFSX0ZMQUcocFR4QmxrLCBmVFhfYkNsZWFyRUFQRnJhbWUpOworCisJLy8gRGVmYXVsdCB0byBjbGVhciB0aGlzIGZsYWcKKwlUWF9CTEtfQ0xFQVJfRkxBRyhwVHhCbGssIGZUWF9iRm9yY2VOb25Rb1MpOworCisKKwlpZiAocFR4QmxrLT5XY2lkID09IE1DQVNUX1dDSUQpCisJeworCQlwVHhCbGstPnBNYWNFbnRyeSA9IE5VTEw7CisJCXsKKyNpZmRlZiBNQ0FTVF9SQVRFX1NQRUNJRklDCisJCQlQVUNIQVIgcERBID0gR0VUX09TX1BLVF9EQVRBUFRSKHBQYWNrZXQpOworCQkJaWYgKCgoKnBEQSAmIDB4MDEpID09IDB4MDEpICYmICgqcERBICE9IDB4ZmYpKQorCQkJCXBUeEJsay0+cFRyYW5zbWl0ID0gJnBBZC0+Q29tbW9uQ2ZnLk1DYXN0UGh5TW9kZTsKKwkJCWVsc2UKKyNlbmRpZiAvLyBNQ0FTVF9SQVRFX1NQRUNJRklDIC8vCisJCQkJcFR4QmxrLT5wVHJhbnNtaXQgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtNQ0FTVF9XQ0lEXS5IVFBoeU1vZGU7CisJCX0KKworCQlUWF9CTEtfQ0xFQVJfRkxBRyhwVHhCbGssIGZUWF9iQWNrUmVxdWlyZWQpOwkvLyBBY2tSZXF1aXJlZCA9IEZBTFNFLCB3aGVuIGJyb2FkY2FzdCBwYWNrZXQgaW4gQWRob2MgbW9kZS4KKwkJLy9UWF9CTEtfU0VUX0ZMQUcocFR4QmxrLCBmVFhfYkZvcmNlTG93UmF0ZSk7CisJCVRYX0JMS19DTEVBUl9GTEFHKHBUeEJsaywgZlRYX2JBbGxvd0ZyYWcpOworCQlUWF9CTEtfQ0xFQVJfRkxBRyhwVHhCbGssIGZUWF9iV01NKTsKKwkJaWYgKFJUTVBfR0VUX1BBQ0tFVF9NT1JFREFUQShwUGFja2V0KSkKKwkJeworCQkJVFhfQkxLX1NFVF9GTEFHKHBUeEJsaywgZlRYX2JNb3JlRGF0YSk7CisJCX0KKworCX0KKwllbHNlCisJeworCQlwVHhCbGstPnBNYWNFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W3BUeEJsay0+V2NpZF07CisJCXBUeEJsay0+cFRyYW5zbWl0ID0gJnBUeEJsay0+cE1hY0VudHJ5LT5IVFBoeU1vZGU7CisKKwkJcE1hY0VudHJ5ID0gcFR4QmxrLT5wTWFjRW50cnk7CisKKworCQkvLyBGb3IgYWxsIHVuaWNhc3QgcGFja2V0cywgbmVlZCBBY2sgdW5sZXNzIHRoZSBBY2sgUG9saWN5IGlzIG5vdCBzZXQgYXMgTk9STUFMX0FDSy4KKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkFja1BvbGljeVtwVHhCbGstPlF1ZUlkeF0gIT0gTk9STUFMX0FDSykKKwkJCVRYX0JMS19DTEVBUl9GTEFHKHBUeEJsaywgZlRYX2JBY2tSZXF1aXJlZCk7CisJCWVsc2UKKwkJCVRYX0JMS19TRVRfRkxBRyhwVHhCbGssIGZUWF9iQWNrUmVxdWlyZWQpOworCisJCXsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJCXsKKworCQkJCS8vIElmIHN1cHBvcnQgV01NLCBlbmFibGUgaXQuCisJCQkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfV01NX0lOVVNFRCkgJiYKKwkJCQkJQ0xJRU5UX1NUQVRVU19URVNUX0ZMQUcocE1hY0VudHJ5LCBmQ0xJRU5UX1NUQVRVU19XTU1fQ0FQQUJMRSkpCisJCQkJCVRYX0JMS19TRVRfRkxBRyhwVHhCbGssIGZUWF9iV01NKTsKKwkJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwkJfQorCisJCWlmIChwVHhCbGstPlR4RnJhbWVUeXBlID09IFRYX0xFR0FDWV9GUkFNRSkKKwkJeworCQkJaWYgKCAoUlRNUF9HRVRfUEFDS0VUX0xPV1JBVEUocFBhY2tldCkpIHx8CisgICAgICAgICAgICAgICAgKChwQWQtPk9wTW9kZSA9PSBPUE1PREVfQVApICYmIChwTWFjRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NT0RFID09IE1PREVfQ0NLKSAmJiAocE1hY0VudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTUNTID09IFJBVEVfMSkpKQorCQkJewkvLyBTcGVjaWZpYyBwYWNrZXQsIGkuZS4sIGJESENQRnJhbWUsIGJFQVBPTEZyYW1lLCBiV0FJRnJhbWUsIG5lZWQgZm9yY2UgbG93IHJhdGUuCisJCQkJcFR4QmxrLT5wVHJhbnNtaXQgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtNQ0FTVF9XQ0lEXS5IVFBoeU1vZGU7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQkJLy8gTW9kaWZ5IHRoZSBXTU0gYml0IGZvciBJQ1YgaXNzdWUuIElmIHdlIGhhdmUgYSBwYWNrZXQgd2l0aCBFT1NQIGZpZWxkIG5lZWQgdG8gc2V0IGFzIDEsIGhvdyB0byBoYW5kbGUgaXQ/Pz8KKwkJCQlpZiAoSVNfSFRfU1RBKHBUeEJsay0+cE1hY0VudHJ5KSAmJgorCQkJCQkoQ0xJRU5UX1NUQVRVU19URVNUX0ZMQUcocE1hY0VudHJ5LCBmQ0xJRU5UX1NUQVRVU19SQUxJTktfQ0hJUFNFVCkpICYmCisJCQkJCSgocEFkLT5Db21tb25DZmcuYlJkZyA9PSBUUlVFKSAmJiBDTElFTlRfU1RBVFVTX1RFU1RfRkxBRyhwTWFjRW50cnksIGZDTElFTlRfU1RBVFVTX1JER19DQVBBQkxFKSkpCisJCQkJeworCQkJCQlUWF9CTEtfQ0xFQVJfRkxBRyhwVHhCbGssIGZUWF9iV01NKTsKKwkJCQkJVFhfQkxLX1NFVF9GTEFHKHBUeEJsaywgZlRYX2JGb3JjZU5vblFvUyk7CisJCQkJfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQkJfQorCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQlpZiAoIChJU19IVF9SQVRFKHBNYWNFbnRyeSkgPT0gRkFMU0UpICYmCisJCQkJKENMSUVOVF9TVEFUVVNfVEVTVF9GTEFHKHBNYWNFbnRyeSwgZkNMSUVOVF9TVEFUVVNfUElHR1lCQUNLX0NBUEFCTEUpKSkKKwkJCXsJLy8gQ3VycmVudGx5IHBpZ2d5LWJhY2sgb25seSBzdXBwb3J0IHdoZW4gcGVlciBpcyBvcGVyYXRlIGluIGIvZyBtb2RlLgorCQkJCVRYX0JMS19TRVRfRkxBRyhwVHhCbGssIGZUWF9iUGlnZ3lCYWNrKTsKKwkJCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCQkJaWYgKFJUTVBfR0VUX1BBQ0tFVF9NT1JFREFUQShwUGFja2V0KSkKKwkJCXsKKwkJCQlUWF9CTEtfU0VUX0ZMQUcocFR4QmxrLCBmVFhfYk1vcmVEYXRhKTsKKwkJCX0KKyNpZmRlZiBVQVBTRF9BUF9TVVBQT1JUCisJCQlpZiAoUlRNUF9HRVRfUEFDS0VUX0VPU1AocFBhY2tldCkpCisJCQl7CisJCQkJVFhfQkxLX1NFVF9GTEFHKHBUeEJsaywgZlRYX2JXTU1fVUFQU0RfRU9TUCk7CisJCQl9CisjZW5kaWYgLy8gVUFQU0RfQVBfU1VQUE9SVCAvLworCQl9CisJCWVsc2UgaWYgKHBUeEJsay0+VHhGcmFtZVR5cGUgPT0gVFhfRlJBR19GUkFNRSkKKwkJeworCQkJVFhfQkxLX1NFVF9GTEFHKHBUeEJsaywgZlRYX2JBbGxvd0ZyYWcpOworCQl9CisKKwkJcE1hY0VudHJ5LT5EZWJ1Z1R4Q291bnQrKzsKKwl9CisKKwlyZXR1cm4gVFJVRTsKKworRmlsbFR4QmxrRXJyOgorCXJldHVybiBGQUxTRTsKK30KKworCitCT09MRUFOIENhbkRvQWdncmVnYXRlVHJhbnNtaXQoCisJSU4gUlRNUF9BREFQVEVSICpwQWQsCisJSU4gTkRJU19QQUNLRVQgKnBQYWNrZXQsCisJSU4gVFhfQkxLCQkqcFR4QmxrKQoreworCisJLy9wcmludGsoIkNoZWNrIGlmIGNhbiBkbyBhZ2dyZWdhdGlvbiEgVHhGcmFtZVR5cGU9JWQhXG4iLCBwVHhCbGstPlR4RnJhbWVUeXBlKTsKKworCWlmIChSVE1QX0dFVF9QQUNLRVRfV0NJRChwUGFja2V0KSA9PSBNQ0FTVF9XQ0lEKQorCQlyZXR1cm4gRkFMU0U7CisKKwlpZiAoUlRNUF9HRVRfUEFDS0VUX0RIQ1AocFBhY2tldCkgfHwKKwkJUlRNUF9HRVRfUEFDS0VUX0VBUE9MKHBQYWNrZXQpIHx8CisJCVJUTVBfR0VUX1BBQ0tFVF9XQUkocFBhY2tldCkpCisJCXJldHVybiBGQUxTRTsKKworCWlmICgocFR4QmxrLT5UeEZyYW1lVHlwZSA9PSBUWF9BTVNEVV9GUkFNRSkgJiYKKwkJKChwVHhCbGstPlRvdGFsRnJhbWVMZW4gKyBHRVRfT1NfUEtUX0xFTihwUGFja2V0KSk+IChSWF9CVUZGRVJfQUdHUkVTSVpFIC0gMTAwKSkpCisJewkvLyBGb3IgQU1TRFUsIGFsbG93IHRoZSBwYWNrZXRzIHdpdGggdG90YWwgbGVuZ3RoIDwgbWF4LWFtc2R1IHNpemUKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCWlmICgocFR4QmxrLT5UeEZyYW1lVHlwZSA9PSBUWF9SQUxJTktfRlJBTUUpICYmCisJCShwVHhCbGstPlR4UGFja2V0TGlzdC5OdW1iZXIgPT0gMikpCisJewkvLyBGb3IgUkFMSU5LLUFnZ3JlZ2F0aW9uLCBhbGxvdyB0d28gZnJhbWVzIGluIG9uZSBiYXRjaC4KKwkJcmV0dXJuIEZBTFNFOworCX0KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCWlmICgoSU5GUkFfT04ocEFkKSkgJiYgKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpKSAvLyBtdXN0IGJlIHVuaWNhc3QgdG8gQVAKKwkJcmV0dXJuIFRSVUU7CisJZWxzZQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCQlyZXR1cm4gRkFMU0U7CisKK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJVG8gZG8gdGhlIGVucXVldWUgb3BlcmF0aW9uIGFuZCBleHRyYWN0IHRoZSBmaXJzdCBpdGVtIG9mIHdhaXRpbmcKKwkJbGlzdC4gSWYgYSBudW1iZXIgb2YgYXZhaWxhYmxlIHNoYXJlZCBtZW1vcnkgc2VnbWVudHMgY291bGQgbWVldAorCQl0aGUgcmVxdWVzdCBvZiBleHRyYWN0ZWQgaXRlbSwgdGhlIGV4dHJhY3RlZCBpdGVtIHdpbGwgYmUgZnJhZ21lbnRlZAorCQlpbnRvIHNoYXJlZCBtZW1vcnkgc2VnbWVudHMuCisKKwlBcmd1bWVudHM6CisJCXBBZCBQb2ludGVyIHRvIG91ciBhZGFwdGVyCisJCXBRdWV1ZQkJUG9pbnRlciB0byBXYWl0aW5nIFF1ZXVlCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgUlRNUERlUXVldWVQYWNrZXQoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIEJPT0xFQU4gICAgICAgICBiSW50Q29udGV4dCwKKwlJTiAgVUNIQVIJCQlRSWR4LCAvKiBCdWxrT3V0UGlwZUlkICovCisJSU4gIFVDSEFSICAgICAgICAgICBNYXhfVHhfUGFja2V0cykKK3sKKwlQUVVFVUVfRU5UUlkgICAgcEVudHJ5ID0gTlVMTDsKKwlQTkRJU19QQUNLRVQgCXBQYWNrZXQ7CisJTkRJU19TVEFUVVMgICAgIFN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisJVUNIQVIgICAgICAgICAgIENvdW50PTA7CisJUFFVRVVFX0hFQURFUiAgIHBRdWV1ZTsKKwlVTE9ORyAgICAgICAgICAgRnJlZU51bWJlcltOVU1fT0ZfVFhfUklOR107CisJVUNIQVIJCQlRdWVJZHgsIHNRSWR4LCBlUUlkeDsKKwl1bnNpZ25lZCBsb25nCUlycUZsYWdzID0gMDsKKwlCT09MRUFOCQkJaGFzVHhEZXNjID0gRkFMU0U7CisJVFhfQkxLCQkJVHhCbGs7CisJVFhfQkxLCQkJKnBUeEJsazsKKworI2lmZGVmIERCR19ESUFHTk9TRQorCUJPT0xFQU4JCQlmaXJzdFJvdW5kOworCVJ0bXBEaWFnU3RydWN0CSpwRGlhZ1N0cnVjdCA9ICZwQWQtPkRpYWdTdHJ1Y3Q7CisjZW5kaWYKKworCisJaWYgKFFJZHggPT0gTlVNX09GX1RYX1JJTkcpCisJeworCQlzUUlkeCA9IDA7CisJCWVRSWR4ID0gMzsJLy8gNCBBQ3MsIHN0YXJ0IGZyb20gMC4KKwl9CisJZWxzZQorCXsKKwkJc1FJZHggPSBlUUlkeCA9IFFJZHg7CisJfQorCisJZm9yIChRdWVJZHg9c1FJZHg7IFF1ZUlkeCA8PSBlUUlkeDsgUXVlSWR4KyspCisJeworCQlDb3VudD0wOworCisJCVJUMjhYWF9TVEFSVF9ERVFVRVVFKHBBZCwgUXVlSWR4LCBJcnFGbGFncyk7CisKKyNpZmRlZiBEQkdfRElBR05PU0UKKwkJZmlyc3RSb3VuZCA9ICgoUXVlSWR4ID09IDApID8gVFJVRSA6IEZBTFNFKTsKKyNlbmRpZiAvLyBEQkdfRElBR05PU0UgLy8KKworCQl3aGlsZSAoMSkKKwkJeworCQkJaWYgKChSVE1QX1RFU1RfRkxBRyhwQWQsIChmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTIHwKKwkJCQkJCQkJCQlmUlRNUF9BREFQVEVSX1JBRElPX09GRiB8CisJCQkJCQkJCQkJZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUyB8CisJCQkJCQkJCQkJZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwKKwkJCQkJCQkJCQlmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSkpCisJCQl7CisJCQkJUlQyOFhYX1NUT1BfREVRVUVVRShwQWQsIFF1ZUlkeCwgSXJxRmxhZ3MpOworCQkJCXJldHVybjsKKwkJCX0KKworCQkJaWYgKENvdW50ID49IE1heF9UeF9QYWNrZXRzKQorCQkJCWJyZWFrOworCisJCQlERVFVRVVFX0xPQ0soJnBBZC0+aXJxX2xvY2ssIGJJbnRDb250ZXh0LCBJcnFGbGFncyk7CisJCQlpZiAoJnBBZC0+VHhTd1F1ZXVlW1F1ZUlkeF0gPT0gTlVMTCkKKwkJCXsKKyNpZmRlZiBEQkdfRElBR05PU0UKKwkJCQlpZiAoZmlyc3RSb3VuZCA9PSBUUlVFKQorCQkJCQlwRGlhZ1N0cnVjdC0+VHhTV1F1ZUNudFtwRGlhZ1N0cnVjdC0+QXJyYXlDdXJJZHhdWzBdKys7CisjZW5kaWYgLy8gREJHX0RJQUdOT1NFIC8vCisJCQkJREVRVUVVRV9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIGJJbnRDb250ZXh0LCBJcnFGbGFncyk7CisJCQkJYnJlYWs7CisJCQl9CisKKworCQkJLy8gcHJvYmUgdGhlIFF1ZXVlIEhlYWQKKwkJCXBRdWV1ZSA9ICZwQWQtPlR4U3dRdWV1ZVtRdWVJZHhdOworCQkJaWYgKChwRW50cnkgPSBwUXVldWUtPkhlYWQpID09IE5VTEwpCisJCQl7CisJCQkJREVRVUVVRV9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIGJJbnRDb250ZXh0LCBJcnFGbGFncyk7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCXBUeEJsayA9ICZUeEJsazsKKwkJCU5kaXNaZXJvTWVtb3J5KChQVUNIQVIpcFR4QmxrLCBzaXplb2YoVFhfQkxLKSk7CisJCQkvL0luaXRpYWxpemVRdWV1ZUhlYWRlcigmcFR4QmxrLT5UeFBhY2tldExpc3QpOwkJLy8gRGlkbid0IG5lZWQgaXQgYmVjYXVzZSB3ZSBhbHJlYWR5IG1lbXplcm8gaXQuCisJCQlwVHhCbGstPlF1ZUlkeCA9IFF1ZUlkeDsKKworCQkJcFBhY2tldCA9IFFVRVVFX0VOVFJZX1RPX1BLVChwRW50cnkpOworCisJCQkvLyBFYXJseSBjaGVjayB0byBtYWtlIHN1cmUgd2UgaGF2ZSBlbm9ndWggVHggUmVzb3VyY2UuCisJCQloYXNUeERlc2MgPSBSVDI4WFhfSEFTX0VOT1VHSF9GUkVFX0RFU0MocEFkLCBwVHhCbGssIEZyZWVOdW1iZXJbUXVlSWR4XSwgcFBhY2tldCk7CisJCQlpZiAoIWhhc1R4RGVzYykKKwkJCXsKKwkJCQlwQWQtPlByaXZhdGVJbmZvLlR4UmluZ0Z1bGxDbnQrKzsKKworCQkJCURFUVVFVUVfVU5MT0NLKCZwQWQtPmlycV9sb2NrLCBiSW50Q29udGV4dCwgSXJxRmxhZ3MpOworCisJCQkJYnJlYWs7CisJCQl9CisKKwkJCXBUeEJsay0+VHhGcmFtZVR5cGUgPSBUeFBrdENsYXNzaWZpY2F0aW9uKHBBZCwgcFBhY2tldCk7CisJCQlwRW50cnkgPSBSZW1vdmVIZWFkUXVldWUocFF1ZXVlKTsKKwkJCXBUeEJsay0+VG90YWxGcmFtZU51bSsrOworCQkJcFR4QmxrLT5Ub3RhbEZyYWdOdW0gKz0gUlRNUF9HRVRfUEFDS0VUX0ZSQUdNRU5UUyhwUGFja2V0KTsJLy8gVGhlIHJlYWwgZnJhZ21lbnQgbnVtYmVyIG1heWJlIHZhcnkKKwkJCXBUeEJsay0+VG90YWxGcmFtZUxlbiArPSBHRVRfT1NfUEtUX0xFTihwUGFja2V0KTsKKwkJCXBUeEJsay0+cFBhY2tldCA9IHBQYWNrZXQ7CisJCQlJbnNlcnRUYWlsUXVldWUoJnBUeEJsay0+VHhQYWNrZXRMaXN0LCBQQUNLRVRfVE9fUVVFVUVfRU5UUlkocFBhY2tldCkpOworCisJCQlpZiAocFR4QmxrLT5UeEZyYW1lVHlwZSA9PSBUWF9SQUxJTktfRlJBTUUgfHwgcFR4QmxrLT5UeEZyYW1lVHlwZSA9PSBUWF9BTVNEVV9GUkFNRSkKKwkJCXsKKwkJCQkvLyBFbmhhbmNlIFNXIEFnZ3JlZ2F0aW9uIE1lY2hhbmlzbQorCQkJCWlmIChORUVEX1FVRVVFX0JBQ0tfRk9SX0FHRyhwQWQsIFF1ZUlkeCwgRnJlZU51bWJlcltRdWVJZHhdLCBwVHhCbGstPlR4RnJhbWVUeXBlKSkKKwkJCQl7CisJCQkJCUluc2VydEhlYWRRdWV1ZShwUXVldWUsIFBBQ0tFVF9UT19RVUVVRV9FTlRSWShwUGFja2V0KSk7CisJCQkJCURFUVVFVUVfVU5MT0NLKCZwQWQtPmlycV9sb2NrLCBiSW50Q29udGV4dCwgSXJxRmxhZ3MpOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQlkb3sKKwkJCQkJaWYoKHBFbnRyeSA9IHBRdWV1ZS0+SGVhZCkgPT0gTlVMTCkKKwkJCQkJCWJyZWFrOworCisJCQkJCS8vIEZvciBUWF9BTVNEVV9GUkFNRS9UWF9SQUxJTktfRlJBTUUsIE5lZWQgdG8gY2hlY2sgaWYgbmV4dCBwYWtjZXQgY2FuIGRvIGFnZ3JlZ2F0aW9uLgorCQkJCQlwUGFja2V0ID0gUVVFVUVfRU5UUllfVE9fUEtUKHBFbnRyeSk7CisJCQkJCUZyZWVOdW1iZXJbUXVlSWR4XSA9IEdFVF9UWFJJTkdfRlJFRU5PKHBBZCwgUXVlSWR4KTsKKwkJCQkJaGFzVHhEZXNjID0gUlQyOFhYX0hBU19FTk9VR0hfRlJFRV9ERVNDKHBBZCwgcFR4QmxrLCBGcmVlTnVtYmVyW1F1ZUlkeF0sIHBQYWNrZXQpOworCQkJCQlpZiAoKGhhc1R4RGVzYyA9PSBGQUxTRSkgfHwgKENhbkRvQWdncmVnYXRlVHJhbnNtaXQocEFkLCBwUGFja2V0LCBwVHhCbGspID09IEZBTFNFKSkKKwkJCQkJCWJyZWFrOworCisJCQkJCS8vUmVtb3ZlIHRoZSBwYWNrZXQgZnJvbSB0aGUgVHhTd1F1ZXVlIGFuZCBpbnNlcnQgaW50byBwVHhCbGsKKwkJCQkJcEVudHJ5ID0gUmVtb3ZlSGVhZFF1ZXVlKHBRdWV1ZSk7CisJCQkJCUFTU0VSVChwRW50cnkpOworCQkJCQlwUGFja2V0ID0gUVVFVUVfRU5UUllfVE9fUEtUKHBFbnRyeSk7CisJCQkJCXBUeEJsay0+VG90YWxGcmFtZU51bSsrOworCQkJCQlwVHhCbGstPlRvdGFsRnJhZ051bSArPSBSVE1QX0dFVF9QQUNLRVRfRlJBR01FTlRTKHBQYWNrZXQpOwkvLyBUaGUgcmVhbCBmcmFnbWVudCBudW1iZXIgbWF5YmUgdmFyeQorCQkJCQlwVHhCbGstPlRvdGFsRnJhbWVMZW4gKz0gR0VUX09TX1BLVF9MRU4ocFBhY2tldCk7CisJCQkJCUluc2VydFRhaWxRdWV1ZSgmcFR4QmxrLT5UeFBhY2tldExpc3QsIFBBQ0tFVF9UT19RVUVVRV9FTlRSWShwUGFja2V0KSk7CisJCQkJfXdoaWxlKDEpOworCisJCQkJaWYgKHBUeEJsay0+VHhQYWNrZXRMaXN0Lk51bWJlciA9PSAxKQorCQkJCQlwVHhCbGstPlR4RnJhbWVUeXBlID0gVFhfTEVHQUNZX0ZSQU1FOworCQkJfQorCisjaWZkZWYgUlQyODcwCisJCQlERVFVRVVFX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgYkludENvbnRleHQsIElycUZsYWdzKTsKKyNlbmRpZiAvLyBSVDI4NzAgLy8KKworCQkJQ291bnQgKz0gcFR4QmxrLT5UeFBhY2tldExpc3QuTnVtYmVyOworCisJCQkJLy8gRG8gSGFyZFRyYW5zbWl0IG5vdy4KKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCQkJU3RhdHVzID0gU1RBSGFyZFRyYW5zbWl0KHBBZCwgcFR4QmxrLCBRdWVJZHgpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisKKyNpZiAwCS8vIFdlIHNob3VsZCBub3QgYnJlYWsgaWYgSGFyZFRyYW5zbWl0IGZhaWxlZC4gV2VsbCwgYXQgbGVhc3Qgbm93IHdlIHNob3VsZCBub3QhCisJCQlpZiAoU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJCQl7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UgLypSVF9ERUJVR19JTkZPKi8sKCJSVE1QSGFyZFRyYW5zbWl0IHJldHVybiBmYWlsZWQhISFcbiIpKTsKKwkJCQlicmVhazsKKwkJCX0KKyNlbmRpZgorCQl9CisKKwkJUlQyOFhYX1NUT1BfREVRVUVVRShwQWQsIFF1ZUlkeCwgSXJxRmxhZ3MpOworCisjaWZkZWYgUlQyODcwCisJCWlmICghaGFzVHhEZXNjKQorCQkJUlRVU0JLaWNrQnVsa091dChwQWQpOworI2VuZGlmIC8vIFJUMjg3MCAvLworCisjaWZkZWYgQkxPQ0tfTkVUX0lGCisJCWlmICgocEFkLT5ibG9ja1F1ZXVlVGFiW1F1ZUlkeF0uU3dUeFF1ZXVlQmxvY2tGbGFnID09IFRSVUUpCisJCQkmJiAocEFkLT5UeFN3UXVldWVbUXVlSWR4XS5OdW1iZXIgPCAxKSkKKwkJeworCQkJcmVsZWFzZU5ldElmKCZwQWQtPmJsb2NrUXVldWVUYWJbUXVlSWR4XSk7CisJCX0KKyNlbmRpZiAvLyBCTE9DS19ORVRfSUYgLy8KKworCX0KKworfQorCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlDYWxjdWxhdGVzIHRoZSBkdXJhdGlvbiB3aGljaCBpcyByZXF1aXJlZCB0byB0cmFuc21pdCBvdXQgZnJhbWVzCisJd2l0aCBnaXZlbiBzaXplIGFuZCBzcGVjaWZpZWQgcmF0ZS4KKworCUFyZ3VtZW50czoKKwkJcEFkIAlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisJCVJhdGUJCQlUcmFuc21pdCByYXRlCisJCVNpemUJCQlGcmFtZSBzaXplIGluIHVuaXRzIG9mIGJ5dGUKKworCVJldHVybiBWYWx1ZToKKwkJRHVyYXRpb24gbnVtYmVyIGluIHVuaXRzIG9mIHVzZWMKKworCUlSUUwgPSBQQVNTSVZFX0xFVkVMCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVVNIT1JUCVJUTVBDYWxjRHVyYXRpb24oCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVUNIQVIJCQlSYXRlLAorCUlOCVVMT05HCQkJU2l6ZSkKK3sKKwlVTE9ORwlEdXJhdGlvbiA9IDA7CisKKwlpZiAoUmF0ZSA8IFJBVEVfRklSU1RfT0ZETV9SQVRFKSAvLyBDQ0sKKwl7CisJCWlmICgoUmF0ZSA+IFJBVEVfMSkgJiYgT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19TSE9SVF9QUkVBTUJMRV9JTlVTRUQpKQorCQkJRHVyYXRpb24gPSA5NjsJLy8gNzIrMjQgcHJlYW1ibGUrcGxjcAorCQllbHNlCisJCQlEdXJhdGlvbiA9IDE5MjsgLy8gMTQ0KzQ4IHByZWFtYmxlK3BsY3AKKworCQlEdXJhdGlvbiArPSAoVVNIT1JUKSgoU2l6ZSA8PCA0KSAvIFJhdGVJZFRvNTAwS2Jwc1tSYXRlXSk7CisJCWlmICgoU2l6ZSA8PCA0KSAlIFJhdGVJZFRvNTAwS2Jwc1tSYXRlXSkKKwkJCUR1cmF0aW9uICsrOworCX0KKwllbHNlIGlmIChSYXRlIDw9IFJBVEVfTEFTVF9PRkRNX1JBVEUpLy8gT0ZETSByYXRlcworCXsKKwkJRHVyYXRpb24gPSAyMCArIDY7CQkvLyAxNis0IHByZWFtYmxlK3BsY3AgKyBTaWduYWwgRXh0ZW5zaW9uCisJCUR1cmF0aW9uICs9IDQgKiAoVVNIT1JUKSgoMTEgKyBTaXplICogNCkgLyBSYXRlSWRUbzUwMEticHNbUmF0ZV0pOworCQlpZiAoKDExICsgU2l6ZSAqIDQpICUgUmF0ZUlkVG81MDBLYnBzW1JhdGVdKQorCQkJRHVyYXRpb24gKz0gNDsKKwl9CisJZWxzZQkvL21pbW8gcmF0ZQorCXsKKwkJRHVyYXRpb24gPSAyMCArIDY7CQkvLyAxNis0IHByZWFtYmxlK3BsY3AgKyBTaWduYWwgRXh0ZW5zaW9uCisJfQorCisJcmV0dXJuIChVU0hPUlQpRHVyYXRpb247Cit9CisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCUNhbGN1bGF0ZXMgdGhlIGR1cmF0aW9uIHdoaWNoIGlzIHJlcXVpcmVkIHRvIHRyYW5zbWl0IG91dCBmcmFtZXMKKwl3aXRoIGdpdmVuIHNpemUgYW5kIHNwZWNpZmllZCByYXRlLgorCisJQXJndW1lbnRzOgorCQlwVHhXSQkJUG9pbnRlciB0byBoZWFkIG9mIGVhY2ggTVBEVSB0byBIVy4KKwkJQWNrIAkJU2V0dGluZyBmb3IgQWNrIHJlcXVpcmVtZW50IGJpdAorCQlGcmFnbWVudAlTZXR0aW5nIGZvciBGcmFnbWVudCBiaXQKKwkJUmV0cnlNb2RlCVNldHRpbmcgZm9yIHJldHJ5IG1vZGUKKwkJSWZzIAkJU2V0dGluZyBmb3IgSUZTIGdhcAorCQlSYXRlCQlTZXR0aW5nIGZvciB0cmFuc21pdCByYXRlCisJCVNlcnZpY2UgCVNldHRpbmcgZm9yIHNlcnZpY2UKKwkJTGVuZ3RoCQlGcmFtZSBsZW5ndGgKKwkJVHhQcmVhbWJsZQlTaG9ydCBvciBMb25nIHByZWFtYmxlIHdoZW4gdXNpbmcgQ0NLIHJhdGVzCisJCVF1ZUlkeCAtIDAtMywgYWNjb3JkaW5nIHRvIDgwMi4xMWUvZDQuNCBKdW5lLzIwMDMKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworICAgIFNlZSBhbHNvIDogQkFTbWFydEhhcmRUcmFuc21pdCgpICAgICEhIQorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBSVE1QV3JpdGVUeFdJKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBUWFdJX1NUUlVDIAlwT3V0VHhXSSwKKwlJTglCT09MRUFOCQkJRlJBRywKKwlJTglCT09MRUFOCQkJQ0ZBQ0ssCisJSU4JQk9PTEVBTgkJCUluc1RpbWVzdGFtcCwKKwlJTglCT09MRUFOIAkJQU1QRFUsCisJSU4JQk9PTEVBTiAJCUFjaywKKwlJTglCT09MRUFOIAkJTlNlcSwJCS8vIEhXIG5ldyBhIHNlcXVlbmNlLgorCUlOCVVDSEFSCQkJQkFTaXplLAorCUlOCVVDSEFSCQkJV0NJRCwKKwlJTglVTE9ORwkJCUxlbmd0aCwKKwlJTglVQ0hBUiAJCQlQSUQsCisJSU4JVUNIQVIJCQlUSUQsCisJSU4JVUNIQVIJCQlUeFJhdGUsCisJSU4JVUNIQVIJCQlUeG9wbW9kZSwKKwlJTglCT09MRUFOCQkJQ2ZBY2ssCisJSU4JSFRUUkFOU01JVF9TRVRUSU5HCSpwVHJhbnNtaXQpCit7CisJUE1BQ19UQUJMRV9FTlRSWQlwTWFjID0gTlVMTDsKKwlUWFdJX1NUUlVDIAkJVHhXSTsKKwlQVFhXSV9TVFJVQyAJcFR4V0k7CisKKwlpZiAoV0NJRCA8IE1BWF9MRU5fT0ZfTUFDX1RBQkxFKQorCQlwTWFjID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbV0NJRF07CisKKwkvLworCS8vIEFsd2F5cyB1c2UgTG9uZyBwcmVhbWJsZSBiZWZvcmUgdmVyaWZpYXRpb24gc2hvcnQgcHJlYW1ibGUgZnVuY3Rpb25hbGl0eSB3b3JrcyB3ZWxsLgorCS8vIFRvZG86IHJlbW92ZSB0aGUgZm9sbG93aW5nIGxpbmUgaWYgc2hvcnQgcHJlYW1ibGUgZnVuY3Rpb25hbGl0eSB3b3JrcworCS8vCisJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfU0hPUlRfUFJFQU1CTEVfSU5VU0VEKTsKKwlOZGlzWmVyb01lbW9yeSgmVHhXSSwgVFhXSV9TSVpFKTsKKwlwVHhXSSA9ICZUeFdJOworCisJcFR4V0ktPkZSQUc9IEZSQUc7CisKKwlwVHhXSS0+Q0ZBQ0sgPSBDRkFDSzsKKwlwVHhXSS0+VFM9IEluc1RpbWVzdGFtcDsKKwlwVHhXSS0+QU1QRFUgPSBBTVBEVTsKKwlwVHhXSS0+QUNLID0gQWNrOworCXBUeFdJLT50eG9wPSBUeG9wbW9kZTsKKworCXBUeFdJLT5OU0VRID0gTlNlcTsKKwkvLyBKb2huIHR1bmUgdGhlIHBlcmZvcm1hY2Ugd2l0aCBJbnRlbCBDbGllbnQgaW4gMjAgTUh6IHBlcmZvcm1hbmNlCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJQkFTaXplID0gcEFkLT5Db21tb25DZmcuVHhCQVNpemU7CisKKwlpZiggQkFTaXplID43ICkKKwkJQkFTaXplID03OworCXBUeFdJLT5CQVdpblNpemUgPSBCQVNpemU7CisJcFR4V0ktPlNob3J0R0kgPSBwVHJhbnNtaXQtPmZpZWxkLlNob3J0R0k7CisJcFR4V0ktPlNUQkMgPSBwVHJhbnNtaXQtPmZpZWxkLlNUQkM7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwlwVHhXSS0+V2lyZWxlc3NDbGlJRCA9IFdDSUQ7CisJcFR4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudCA9IExlbmd0aDsKKwlwVHhXSS0+UGFja2V0SWQgPSBQSUQ7CisKKwkvLyBJZiBDQ0sgb3IgT0ZETSwgQlcgbXVzdCBiZSAyMAorCXBUeFdJLT5CVyA9IChwVHJhbnNtaXQtPmZpZWxkLk1PREUgPD0gTU9ERV9PRkRNKSA/IChCV18yMCkgOiAocFRyYW5zbWl0LT5maWVsZC5CVyk7CisjaWZkZWYgRE9UMTFOX0RSQUZUMworCWlmIChwVHhXSS0+QlcpCisJCXBUeFdJLT5CVyA9IChwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8uQWRkSHRJbmZvLlJlY29tV2lkdGggPT0gMCkgPyAoQldfMjApIDogKHBUcmFuc21pdC0+ZmllbGQuQlcpOworI2VuZGlmIC8vIERPVDExTl9EUkFGVDMgLy8KKworCXBUeFdJLT5NQ1MgPSBwVHJhbnNtaXQtPmZpZWxkLk1DUzsKKwlwVHhXSS0+UEhZTU9ERSA9IHBUcmFuc21pdC0+ZmllbGQuTU9ERTsKKwlwVHhXSS0+Q0ZBQ0sgPSBDZkFjazsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCWlmIChwTWFjKQorCXsKKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJNSU1PUFNFbmFibGUpCisJCXsKKwkJCWlmICgocE1hYy0+TW1wc01vZGUgPT0gTU1QU19EWU5BTUlDKSAmJiAocFRyYW5zbWl0LT5maWVsZC5NQ1MgPiA3KSkKKwkJCXsKKwkJCQkvLyBEeW5hbWljIE1JTU8gUG93ZXIgU2F2ZSBNb2RlCisJCQkJcFR4V0ktPk1JTU9wcyA9IDE7CisJCQl9CisJCQllbHNlIGlmIChwTWFjLT5NbXBzTW9kZSA9PSBNTVBTX1NUQVRJQykKKwkJCXsKKwkJCQkvLyBTdGF0aWMgTUlNTyBQb3dlciBTYXZlIE1vZGUKKwkJCQlpZiAocFRyYW5zbWl0LT5maWVsZC5NT0RFID49IE1PREVfSFRNSVggJiYgcFRyYW5zbWl0LT5maWVsZC5NQ1MgPiA3KQorCQkJCXsKKwkJCQkJcFR4V0ktPk1DUyA9IDc7CisJCQkJCXBUeFdJLT5NSU1PcHMgPSAwOworCQkJCX0KKwkJCX0KKwkJfQorCQkvL3BUeFdJLT5NSU1PcHMgPSAocE1hYy0+UHNNb2RlID09IFBXUl9NTVBTKT8gMTowOworCQlpZiAocE1hYy0+YklBbUJhZEF0aGVyb3MgJiYgKHBNYWMtPldlcFN0YXR1cyAhPSBOZGlzODAyXzExV0VQRGlzYWJsZWQpKQorCQl7CisJCQlwVHhXSS0+TXBkdURlbnNpdHkgPSA3OworCQl9CisJCWVsc2UKKwkJeworCQkJcFR4V0ktPk1wZHVEZW5zaXR5ID0gcE1hYy0+TXBkdURlbnNpdHk7CisJCX0KKwl9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwlwVHhXSS0+UGFja2V0SWQgPSBwVHhXSS0+TUNTOworCU5kaXNNb3ZlTWVtb3J5KHBPdXRUeFdJLCAmVHhXSSwgc2l6ZW9mKFRYV0lfU1RSVUMpKTsKK30KKworCitWT0lEIFJUTVBXcml0ZVR4V0lfRGF0YSgKKwlJTglQUlRNUF9BREFQVEVSCQlwQWQsCisJSU4JT1VUIFBUWFdJX1NUUlVDCQlwVHhXSSwKKwlJTglUWF9CTEsJCQkJKnBUeEJsaykKK3sKKwlIVFRSQU5TTUlUX1NFVFRJTkcJKnBUcmFuc21pdDsKKwlQTUFDX1RBQkxFX0VOVFJZCXBNYWNFbnRyeTsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwlVQ0hBUgkJCQlCQVNpemU7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKworCUFTU0VSVChwVHhXSSk7CisKKwlwVHJhbnNtaXQgPSBwVHhCbGstPnBUcmFuc21pdDsKKwlwTWFjRW50cnkgPSBwVHhCbGstPnBNYWNFbnRyeTsKKworCisJLy8KKwkvLyBBbHdheXMgdXNlIExvbmcgcHJlYW1ibGUgYmVmb3JlIHZlcmlmaWF0aW9uIHNob3J0IHByZWFtYmxlIGZ1bmN0aW9uYWxpdHkgd29ya3Mgd2VsbC4KKwkvLyBUb2RvOiByZW1vdmUgdGhlIGZvbGxvd2luZyBsaW5lIGlmIHNob3J0IHByZWFtYmxlIGZ1bmN0aW9uYWxpdHkgd29ya3MKKwkvLworCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1NIT1JUX1BSRUFNQkxFX0lOVVNFRCk7CisJTmRpc1plcm9NZW1vcnkocFR4V0ksIFRYV0lfU0laRSk7CisKKwlwVHhXSS0+RlJBRwkJPSBUWF9CTEtfVEVTVF9GTEFHKHBUeEJsaywgZlRYX2JBbGxvd0ZyYWcpOworCXBUeFdJLT5BQ0sJCT0gVFhfQkxLX1RFU1RfRkxBRyhwVHhCbGssIGZUWF9iQWNrUmVxdWlyZWQpOworCXBUeFdJLT50eG9wCQk9IHBUeEJsay0+RnJhbWVHYXA7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwlpZiAocE1hY0VudHJ5ICYmCisJCShwQWQtPlN0YUNmZy5Cc3NUeXBlID09IEJTU19JTkZSQSkgJiYKKwkJKHBNYWNFbnRyeS0+VmFsaWRBc0RscyA9PSBUUlVFKSkKKwkJcFR4V0ktPldpcmVsZXNzQ2xpSUQgPSBCU1NJRF9XQ0lEOworCWVsc2UKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwkJcFR4V0ktPldpcmVsZXNzQ2xpSUQJCT0gcFR4QmxrLT5XY2lkOworCisJcFR4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudAk9IHBUeEJsay0+TXBkdUhlYWRlckxlbiArIHBUeEJsay0+U3JjQnVmTGVuOworCXBUeFdJLT5DRkFDSwkJCQk9IFRYX0JMS19URVNUX0ZMQUcocFR4QmxrLCBmVFhfYlBpZ2d5QmFjayk7CisKKwkvLyBJZiBDQ0sgb3IgT0ZETSwgQlcgbXVzdCBiZSAyMAorCXBUeFdJLT5CVyA9IChwVHJhbnNtaXQtPmZpZWxkLk1PREUgPD0gTU9ERV9PRkRNKSA/IChCV18yMCkgOiAocFRyYW5zbWl0LT5maWVsZC5CVyk7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisjaWZkZWYgRE9UMTFOX0RSQUZUMworCWlmIChwVHhXSS0+QlcpCisJCXBUeFdJLT5CVyA9IChwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8uQWRkSHRJbmZvLlJlY29tV2lkdGggPT0gMCkgPyAoQldfMjApIDogKHBUcmFuc21pdC0+ZmllbGQuQlcpOworI2VuZGlmIC8vIERPVDExTl9EUkFGVDMgLy8KKwlwVHhXSS0+QU1QRFUJPSAoKHBUeEJsay0+VHhGcmFtZVR5cGUgPT0gVFhfQU1QRFVfRlJBTUUpID8gVFJVRSA6IEZBTFNFKTsKKworCS8vIEpvaG4gdHVuZSB0aGUgcGVyZm9ybWFjZSB3aXRoIEludGVsIENsaWVudCBpbiAyMCBNSHogcGVyZm9ybWFuY2UKKwlCQVNpemUgPSBwQWQtPkNvbW1vbkNmZy5UeEJBU2l6ZTsKKwlpZigocFR4QmxrLT5UeEZyYW1lVHlwZSA9PSBUWF9BTVBEVV9GUkFNRSkgJiYgKHBNYWNFbnRyeSkpCisJeworCQlVQ0hBUgkJUkFCQU9yaUlkeCA9IDA7CS8vVGhlIFJBJ3MgQkEgT3JpZ2luYXRvciB0YWJsZSBpbmRleC4KKworCQlSQUJBT3JpSWR4ID0gcFR4QmxrLT5wTWFjRW50cnktPkJBT3JpV2NpZEFycmF5W3BUeEJsay0+VXNlclByaW9yaXR5XTsKKwkJQkFTaXplID0gcEFkLT5CQVRhYmxlLkJBT3JpRW50cnlbUkFCQU9yaUlkeF0uQkFXaW5TaXplOworCX0KKworI2lmIDAgLy8gMyozCisJaWYgKEJBU2l6ZSA+IDcpCisJCUJBU2l6ZSA9IDc7CisjZW5kaWYKKworCXBUeFdJLT5UeEJGID0gcFRyYW5zbWl0LT5maWVsZC5UeEJGOworCXBUeFdJLT5CQVdpblNpemUgPSBCQVNpemU7CisJcFR4V0ktPlNob3J0R0kgPSBwVHJhbnNtaXQtPmZpZWxkLlNob3J0R0k7CisJcFR4V0ktPlNUQkMgPSBwVHJhbnNtaXQtPmZpZWxkLlNUQkM7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwlwVHhXSS0+TUNTID0gcFRyYW5zbWl0LT5maWVsZC5NQ1M7CisJcFR4V0ktPlBIWU1PREUgPSBwVHJhbnNtaXQtPmZpZWxkLk1PREU7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwlpZiAocE1hY0VudHJ5KQorCXsKKwkJaWYgKChwTWFjRW50cnktPk1tcHNNb2RlID09IE1NUFNfRFlOQU1JQykgJiYgKHBUcmFuc21pdC0+ZmllbGQuTUNTID4gNykpCisJCXsKKwkJCS8vIER5bmFtaWMgTUlNTyBQb3dlciBTYXZlIE1vZGUKKwkJCXBUeFdJLT5NSU1PcHMgPSAxOworCQl9CisJCWVsc2UgaWYgKHBNYWNFbnRyeS0+TW1wc01vZGUgPT0gTU1QU19TVEFUSUMpCisJCXsKKwkJCS8vIFN0YXRpYyBNSU1PIFBvd2VyIFNhdmUgTW9kZQorCQkJaWYgKHBUcmFuc21pdC0+ZmllbGQuTU9ERSA+PSBNT0RFX0hUTUlYICYmIHBUcmFuc21pdC0+ZmllbGQuTUNTID4gNykKKwkJCXsKKwkJCQlwVHhXSS0+TUNTID0gNzsKKwkJCQlwVHhXSS0+TUlNT3BzID0gMDsKKwkJCX0KKwkJfQorCisJCWlmIChwTWFjRW50cnktPmJJQW1CYWRBdGhlcm9zICYmIChwTWFjRW50cnktPldlcFN0YXR1cyAhPSBOZGlzODAyXzExV0VQRGlzYWJsZWQpKQorCQl7CisJCQlwVHhXSS0+TXBkdURlbnNpdHkgPSA3OworCQl9CisJCWVsc2UKKwkJeworCQkJcFR4V0ktPk1wZHVEZW5zaXR5ID0gcE1hY0VudHJ5LT5NcGR1RGVuc2l0eTsKKwkJfQorCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworI2lmZGVmIERCR19ESUFHTk9TRQorCQlpZiAocFR4QmxrLT5RdWVJZHg9PSAwKQorCQl7CisJCQlwQWQtPkRpYWdTdHJ1Y3QuVHhEYXRhQ250W3BBZC0+RGlhZ1N0cnVjdC5BcnJheUN1cklkeF0rKzsKKwkJCXBBZC0+RGlhZ1N0cnVjdC5UeE1jc0NudFtwQWQtPkRpYWdTdHJ1Y3QuQXJyYXlDdXJJZHhdW3BUeFdJLT5NQ1NdKys7CisJCX0KKyNlbmRpZiAvLyBEQkdfRElBR05PU0UgLy8KKworCS8vIGZvciByYXRlIGFkYXBhdGlvbgorCXBUeFdJLT5QYWNrZXRJZCA9IHBUeFdJLT5NQ1M7Cit9CisKKworVk9JRCBSVE1QV3JpdGVUeFdJX0NhY2hlKAorCUlOCVBSVE1QX0FEQVBURVIJCXBBZCwKKwlJTglPVVQgUFRYV0lfU1RSVUMJCXBUeFdJLAorCUlOCVRYX0JMSwkJCQkqcFR4QmxrKQoreworCVBIVFRSQU5TTUlUX1NFVFRJTkcJLypwVHhIVFBoeU1vZGUsKi8gcFRyYW5zbWl0OworCVBNQUNfVEFCTEVfRU5UUlkJcE1hY0VudHJ5OworCisJLy8KKwkvLyB1cGRhdGUgVFhXSQorCS8vCisJcE1hY0VudHJ5ID0gcFR4QmxrLT5wTWFjRW50cnk7CisJcFRyYW5zbWl0ID0gcFR4QmxrLT5wVHJhbnNtaXQ7CisKKwlpZiAocE1hY0VudHJ5LT5iQXV0b1R4UmF0ZVN3aXRjaCkKKwl7CisJCXBUeFdJLT50eG9wID0gSUZTX0hUVFhPUDsKKworCQkvLyBJZiBDQ0sgb3IgT0ZETSwgQlcgbXVzdCBiZSAyMAorCQlwVHhXSS0+QlcgPSAocFRyYW5zbWl0LT5maWVsZC5NT0RFIDw9IE1PREVfT0ZETSkgPyAoQldfMjApIDogKHBUcmFuc21pdC0+ZmllbGQuQlcpOworCQlwVHhXSS0+U2hvcnRHSSA9IHBUcmFuc21pdC0+ZmllbGQuU2hvcnRHSTsKKwkJcFR4V0ktPlNUQkMgPSBwVHJhbnNtaXQtPmZpZWxkLlNUQkM7CisKKwkJcFR4V0ktPk1DUyA9IHBUcmFuc21pdC0+ZmllbGQuTUNTOworCQlwVHhXSS0+UEhZTU9ERSA9IHBUcmFuc21pdC0+ZmllbGQuTU9ERTsKKworCQkvLyBzZXQgUElEIGZvciBUeFJhdGVTd2l0Y2hpbmcKKwkJcFR4V0ktPlBhY2tldElkID0gcFRyYW5zbWl0LT5maWVsZC5NQ1M7CisJfQorCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJcFR4V0ktPkFNUERVID0gKChwTWFjRW50cnktPk5vQkFEYXRhQ291bnREb3duID09IDApID8gVFJVRTogRkFMU0UpOworCXBUeFdJLT5NSU1PcHMgPSAwOworCisjaWZkZWYgRE9UMTFOX0RSQUZUMworCWlmIChwVHhXSS0+QlcpCisJCXBUeFdJLT5CVyA9IChwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8uQWRkSHRJbmZvLlJlY29tV2lkdGggPT0gMCkgPyAoQldfMjApIDogKHBUcmFuc21pdC0+ZmllbGQuQlcpOworI2VuZGlmIC8vIERPVDExTl9EUkFGVDMgLy8KKworCWlmIChwQWQtPkNvbW1vbkNmZy5iTUlNT1BTRW5hYmxlKQorCXsKKwkJLy8gTUlNTyBQb3dlciBTYXZlIE1vZGUKKwkJaWYgKChwTWFjRW50cnktPk1tcHNNb2RlID09IE1NUFNfRFlOQU1JQykgJiYgKHBUcmFuc21pdC0+ZmllbGQuTUNTID4gNykpCisJCXsKKwkJCS8vIER5bmFtaWMgTUlNTyBQb3dlciBTYXZlIE1vZGUKKwkJCXBUeFdJLT5NSU1PcHMgPSAxOworCQl9CisJCWVsc2UgaWYgKHBNYWNFbnRyeS0+TW1wc01vZGUgPT0gTU1QU19TVEFUSUMpCisJCXsKKwkJCS8vIFN0YXRpYyBNSU1PIFBvd2VyIFNhdmUgTW9kZQorCQkJaWYgKChwVHJhbnNtaXQtPmZpZWxkLk1PREUgPj0gTU9ERV9IVE1JWCkgJiYgKHBUcmFuc21pdC0+ZmllbGQuTUNTID4gNykpCisJCQl7CisJCQkJcFR4V0ktPk1DUyA9IDc7CisJCQkJcFR4V0ktPk1JTU9wcyA9IDA7CisJCQl9CisJCX0KKwl9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKyNpZmRlZiBEQkdfRElBR05PU0UKKwlpZiAocFR4QmxrLT5RdWVJZHg9PSAwKQorCXsKKwkJcEFkLT5EaWFnU3RydWN0LlR4RGF0YUNudFtwQWQtPkRpYWdTdHJ1Y3QuQXJyYXlDdXJJZHhdKys7CisJCXBBZC0+RGlhZ1N0cnVjdC5UeE1jc0NudFtwQWQtPkRpYWdTdHJ1Y3QuQXJyYXlDdXJJZHhdW3BUeFdJLT5NQ1NdKys7CisJfQorI2VuZGlmIC8vIERCR19ESUFHTk9TRSAvLworCisJcFR4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudCA9IHBUeEJsay0+TXBkdUhlYWRlckxlbiArIHBUeEJsay0+U3JjQnVmTGVuOworCit9CisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCUNhbGN1bGF0ZXMgdGhlIGR1cmF0aW9uIHdoaWNoIGlzIHJlcXVpcmVkIHRvIHRyYW5zbWl0IG91dCBmcmFtZXMKKwl3aXRoIGdpdmVuIHNpemUgYW5kIHNwZWNpZmllZCByYXRlLgorCisJQXJndW1lbnRzOgorCQlwVHhECQlQb2ludGVyIHRvIHRyYW5zbWl0IGRlc2NyaXB0b3IKKwkJQWNrIAkJU2V0dGluZyBmb3IgQWNrIHJlcXVpcmVtZW50IGJpdAorCQlGcmFnbWVudAlTZXR0aW5nIGZvciBGcmFnbWVudCBiaXQKKwkJUmV0cnlNb2RlCVNldHRpbmcgZm9yIHJldHJ5IG1vZGUKKwkJSWZzIAkJU2V0dGluZyBmb3IgSUZTIGdhcAorCQlSYXRlCQlTZXR0aW5nIGZvciB0cmFuc21pdCByYXRlCisJCVNlcnZpY2UgCVNldHRpbmcgZm9yIHNlcnZpY2UKKwkJTGVuZ3RoCQlGcmFtZSBsZW5ndGgKKwkJVHhQcmVhbWJsZQlTaG9ydCBvciBMb25nIHByZWFtYmxlIHdoZW4gdXNpbmcgQ0NLIHJhdGVzCisJCVF1ZUlkeCAtIDAtMywgYWNjb3JkaW5nIHRvIDgwMi4xMWUvZDQuNCBKdW5lLzIwMDMKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgUlRNUFdyaXRlVHhEZXNjcmlwdG9yKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBUWERfU1RSVUMJCXBUeEQsCisJSU4JQk9PTEVBTiAJCWJXSVYsCisJSU4JVUNIQVIJCQlRdWV1ZVNFTCkKK3sKKwkvLworCS8vIEFsd2F5cyB1c2UgTG9uZyBwcmVhbWJsZSBiZWZvcmUgdmVyaWZpYXRpb24gc2hvcnQgcHJlYW1ibGUgZnVuY3Rpb25hbGl0eSB3b3JrcyB3ZWxsLgorCS8vIFRvZG86IHJlbW92ZSB0aGUgZm9sbG93aW5nIGxpbmUgaWYgc2hvcnQgcHJlYW1ibGUgZnVuY3Rpb25hbGl0eSB3b3JrcworCS8vCisJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfU0hPUlRfUFJFQU1CTEVfSU5VU0VEKTsKKworCXBUeEQtPldJVgk9IChiV0lWKSA/IDE6IDA7CisJcFR4RC0+UVNFTD0gKFF1ZXVlU0VMKTsKKwkvL1JUMjg2MGM/PyAgZml4ZWQgdXNpbmcgRURDQSBxdWV1ZSBmb3IgdGVzdC4uLiAgV2UgZG91YnQgUXVldWUxIGhhcyBwcm9ibGVtLiAgMjAwNi0wOS0yNiBKYW4KKwkvL3BUeEQtPlFTRUw9IEZJRk9fRURDQTsKKwlpZiAocEFkLT5iR2VuT25lSENDQSA9PSBUUlVFKQorCQlwVHhELT5RU0VMPSBGSUZPX0hDQ0E7CisJcFR4RC0+RE1BRE9ORSA9IDA7Cit9CisKKworLy8gc2hvdWxkIGJlIGNhbGxlZCBvbmx5IHdoZW4gLQorLy8gMS4gTUVBRElBX0NPTk5FQ1RFRAorLy8gMi4gQUdHUkVHQVRJT05fSU5fVVNFRAorLy8gMy4gRnJhZ21lbnRhdGlvbiBub3QgaW4gdXNlZAorLy8gNC4gZWl0aGVyIG5vIHByZXZpb3VzIGZyYW1lIChwUHJldkFkZHIxPU5VTEwpIC5PUi4gcHJldmlvdWQgZnJhbWUgaXMgYWdncmVnYXRpYmxlCitCT09MRUFOIFR4RnJhbWVJc0FnZ3JlZ2F0aWJsZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlwUHJldkFkZHIxLAorCUlOCVBVQ0hBUgkJCXA4MDIzaGRyKQoreworCisJLy8gY2FuJ3QgYWdncmVnYXRlIEVBUE9MICg4MDIuMXgpIGZyYW1lCisJaWYgKChwODAyM2hkclsxMl0gPT0gMHg4OCkgJiYgKHA4MDIzaGRyWzEzXSA9PSAweDhlKSkKKwkJcmV0dXJuIEZBTFNFOworCisJLy8gY2FuJ3QgYWdncmVnYXRlIG11bHRpY2FzdC9icm9hZGNhc3QgZnJhbWUKKwlpZiAocDgwMjNoZHJbMF0gJiAweDAxKQorCQlyZXR1cm4gRkFMU0U7CisKKwlpZiAoSU5GUkFfT04ocEFkKSkgLy8gbXVzdCBiZSB1bmljYXN0IHRvIEFQCisJCXJldHVybiBUUlVFOworCWVsc2UgaWYgKChwUHJldkFkZHIxID09IE5VTEwpIHx8IE1BQ19BRERSX0VRVUFMKHBQcmV2QWRkcjEsIHA4MDIzaGRyKSkgLy8gdW5pY2FzdCB0byBzYW1lIFNUQQorCQlyZXR1cm4gVFJVRTsKKwllbHNlCisJCXJldHVybiBGQUxTRTsKK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkgICBDaGVjayB0aGUgTVNEVSBBZ2dyZWdhdGlvbiBwb2xpY3kKKwkxLkhUIGFnZ3JlZ2F0aW9uIGlzIEEtTVNEVQorCTIubGVnYWFjeSByYXRlIGFnZ3JlZ2F0aW9uIGlzIHNvZnR3YXJlIGFnZ3JlZ2F0aW9uIGJ5IFJhbGluay4KKworCUFyZ3VtZW50czoKKworCVJldHVybiBWYWx1ZToKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitCT09MRUFOIFBlZXJJc0FnZ3JlT24oCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVUxPTkcJCSAgIFR4UmF0ZSwKKwlJTglQTUFDX1RBQkxFX0VOVFJZIHBNYWNFbnRyeSkKK3sKKwlVTE9ORwlBRmxhZ3MgPSAoZkNMSUVOVF9TVEFUVVNfQU1TRFVfSU5VU0VEIHwgZkNMSUVOVF9TVEFUVVNfQUdHUkVHQVRJT05fQ0FQQUJMRSk7CisKKwlpZiAocE1hY0VudHJ5ICE9IE5VTEwgJiYgQ0xJRU5UX1NUQVRVU19URVNUX0ZMQUcocE1hY0VudHJ5LCBBRmxhZ3MpKQorCXsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJaWYgKHBNYWNFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1PREUgPj0gTU9ERV9IVE1JWCkKKwkJeworCQkJcmV0dXJuIFRSVUU7CisJCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworI2lmZGVmIEFHR1JFR0FUSU9OX1NVUFBPUlQKKwkJaWYgKFR4UmF0ZSA+PSBSQVRFXzYgJiYgcEFkLT5Db21tb25DZmcuYkFnZ3JlZ2F0aW9uQ2FwYWJsZSAmJiAoIShPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1dNTV9JTlVTRUQpICYmIENMSUVOVF9TVEFUVVNfVEVTVF9GTEFHKHBNYWNFbnRyeSwgZkNMSUVOVF9TVEFUVVNfV01NX0NBUEFCTEUpKSkpCisJCXsJLy8gbGVnYWN5ICBSYWxpbmsgQWdncmVnYXRpb24gc3VwcG9ydAorCQkJcmV0dXJuIFRSVUU7CisJCX0KKyNlbmRpZiAvLyBBR0dSRUdBVElPTl9TVVBQT1JUIC8vCisJfQorCisJcmV0dXJuIEZBTFNFOworCit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlDaGVjayBhbmQgZmluZSB0aGUgcGFja2V0IHdhaXRpbmcgaW4gU1cgcXVldWUgd2l0aCBoaWdoZXN0IHByaW9yaXR5CisKKwlBcmd1bWVudHM6CisJCXBBZCBQb2ludGVyIHRvIG91ciBhZGFwdGVyCisKKwlSZXR1cm4gVmFsdWU6CisJCXBRdWV1ZQkJUG9pbnRlciB0byBXYWl0aW5nIFF1ZXVlCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitQUVVFVUVfSEVBREVSCVJUTVBDaGVja1R4U3dRdWV1ZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQgUFVDSEFSCQkJcFF1ZUlkeCkKK3sKKworCVVMT05HCU51bWJlcjsKKwkvLyAyMDA0LTExLTE1IHRvIGJlIHJlbW92ZWQuIHRlc3QgYWdncmVnYXRpb24gb25seQorLy8JaWYgKChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0FHR1JFR0FUSU9OX0lOVVNFRCkpICYmICgqcE51bWJlciA8IDIpKQorLy8JCSByZXR1cm4gTlVMTDsKKworCU51bWJlciA9IHBBZC0+VHhTd1F1ZXVlW1FJRF9BQ19CS10uTnVtYmVyCisJCQkgKyBwQWQtPlR4U3dRdWV1ZVtRSURfQUNfQkVdLk51bWJlcgorCQkJICsgcEFkLT5UeFN3UXVldWVbUUlEX0FDX1ZJXS5OdW1iZXIKKwkJCSArIHBBZC0+VHhTd1F1ZXVlW1FJRF9BQ19WT10uTnVtYmVyCisJCQkgKyBwQWQtPlR4U3dRdWV1ZVtRSURfSENDQV0uTnVtYmVyOworCisJaWYgKHBBZC0+VHhTd1F1ZXVlW1FJRF9BQ19WT10uSGVhZCAhPSBOVUxMKQorCXsKKwkJKnBRdWVJZHggPSBRSURfQUNfVk87CisJCXJldHVybiAoJnBBZC0+VHhTd1F1ZXVlW1FJRF9BQ19WT10pOworCX0KKwllbHNlIGlmIChwQWQtPlR4U3dRdWV1ZVtRSURfQUNfVkldLkhlYWQgIT0gTlVMTCkKKwl7CisJCSpwUXVlSWR4ID0gUUlEX0FDX1ZJOworCQlyZXR1cm4gKCZwQWQtPlR4U3dRdWV1ZVtRSURfQUNfVkldKTsKKwl9CisJZWxzZSBpZiAocEFkLT5UeFN3UXVldWVbUUlEX0FDX0JFXS5IZWFkICE9IE5VTEwpCisJeworCQkqcFF1ZUlkeCA9IFFJRF9BQ19CRTsKKwkJcmV0dXJuICgmcEFkLT5UeFN3UXVldWVbUUlEX0FDX0JFXSk7CisJfQorCWVsc2UgaWYgKHBBZC0+VHhTd1F1ZXVlW1FJRF9BQ19CS10uSGVhZCAhPSBOVUxMKQorCXsKKwkJKnBRdWVJZHggPSBRSURfQUNfQks7CisJCXJldHVybiAoJnBBZC0+VHhTd1F1ZXVlW1FJRF9BQ19CS10pOworCX0KKwllbHNlIGlmIChwQWQtPlR4U3dRdWV1ZVtRSURfSENDQV0uSGVhZCAhPSBOVUxMKQorCXsKKwkJKnBRdWVJZHggPSBRSURfSENDQTsKKwkJcmV0dXJuICgmcEFkLT5UeFN3UXVldWVbUUlEX0hDQ0FdKTsKKwl9CisKKwkvLyBObyBwYWNrZXQgcGVuZGluZyBpbiBUeCBTdyBxdWV1ZQorCSpwUXVlSWR4ID0gUUlEX0FDX0JLOworCisJcmV0dXJuIChOVUxMKTsKK30KKworCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlTdXNwZW5kIE1TRFUgdHJhbnNtaXNzaW9uCisKKwlBcmd1bWVudHM6CisJCXBBZCAJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlSVE1QU3VzcGVuZE1zZHVUcmFuc21pc3Npb24oCisJSU4JUFJUTVBfQURBUFRFUglwQWQpCit7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJTQ0FOTklORywgc3VzcGVuZCBNU0RVIHRyYW5zbWlzc2lvbiAuLi5cbiIpKTsKKworCisJLy8KKwkvLyBCZWZvcmUgQlNTX1NDQU5fSU5fUFJPR1JFU1MsIHdlIG5lZWQgdG8ga2VlcCBDdXJyZW50IFI2NiB2YWx1ZSBhbmQKKwkvLyB1c2UgTG93Ym91bmQgYXMgUjY2IHZhbHVlIG9uIFNjYW5OZXh0Q2hhbm5lbCguLi4pCisJLy8KKwlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY2LCAmcEFkLT5CYnBUdW5pbmcuUjY2Q3VycmVudFZhbHVlKTsKKworCS8vIHNldCBCQlBfUjY2IHRvIDB4MzAvMHg0MCB3aGVuIHNjYW5uaW5nIChBc2ljU3dpdGNoQ2hhbm5lbCB3aWxsIHNldCBSNjYgYWNjb3JkaW5nIHRvIGNoYW5uZWwgd2hlbiBzY2FubmluZykKKwkvL1JUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY2LCAoMHgyNiArIEdFVF9MTkFfR0FJTihwQWQpKSk7CisJUlRNUFNldEFHQ0luaXRWYWx1ZShwQWQsIEJXXzIwKTsKKworCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKTsKKwkvL1JUTVBfSU9fV1JJVEUzMihwQWQsIFRYX0NOVExfQ1NSLCAweDAwMGYwMDAwKTsJCS8vIGFib3J0IGFsbCBUWCByaW5ncworfQorCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlSZXN1bWUgTVNEVSB0cmFuc21pc3Npb24KKworCUFyZ3VtZW50czoKKwkJcEFkIAlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgUlRNUFJlc3VtZU1zZHVUcmFuc21pc3Npb24oCisJSU4JUFJUTVBfQURBUFRFUglwQWQpCit7CisvLyAgICBVQ0hBUgkJCUlycVN0YXRlOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJTQ0FOIGRvbmUsIHJlc3VtZSBNU0RVIHRyYW5zbWlzc2lvbiAuLi5cbiIpKTsKKworCisJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjYsIHBBZC0+QmJwVHVuaW5nLlI2NkN1cnJlbnRWYWx1ZSk7CisKKwlSVE1QX0NMRUFSX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKTsKKy8vIHNhbXBsZSwgZm9yIElSUSBMT0NLIHRvIFNFTSBMT0NLCisvLyAgICBJcnFTdGF0ZSA9IHBBZC0+aXJxX2Rpc2FibGVkOworLy8JaWYgKElycVN0YXRlKQorLy8JCVJUTVBEZVF1ZXVlUGFja2V0KHBBZCwgVFJVRSwgTlVNX09GX1RYX1JJTkcsIE1BWF9UWF9QUk9DRVNTKTsKKy8vICAgIGVsc2UKKwlSVE1QRGVRdWV1ZVBhY2tldChwQWQsIEZBTFNFLCBOVU1fT0ZfVFhfUklORywgTUFYX1RYX1BST0NFU1MpOworfQorCisKK1VJTlQgZGVhZ2dyZWdhdGVfQU1TRFVfYW5ub3VuY2UoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJUE5ESVNfUEFDS0VUCQlwUGFja2V0LAorCUlOCVBVQ0hBUgkJCXBEYXRhLAorCUlOCVVMT05HCQkJRGF0YVNpemUpCit7CisJVVNIT1JUIAkJCVBheWxvYWRTaXplOworCVVTSE9SVCAJCQlTdWJGcmFtZVNpemU7CisJUEhFQURFUl84MDJfMyAJcEFNU0RVc3ViaGVhZGVyOworCVVJTlQJCQluTVNEVTsKKyAgICBVQ0hBUgkJCUhlYWRlcjgwMl8zWzE0XTsKKworCVBVQ0hBUgkJCXBQYXlsb2FkLCBwREEsIHBTQSwgcFJlbW92ZWRMTENTTkFQOworCVBORElTX1BBQ0tFVAlwQ2xvbmVQYWNrZXQ7CisKKworCisJbk1TRFUgPSAwOworCisJd2hpbGUgKERhdGFTaXplID4gTEVOR1RIXzgwMl8zKQorCXsKKworCQluTVNEVSsrOworCisJCS8vaGV4X2R1bXAoInN1YmhlYWRlciIsIHBEYXRhLCA2NCk7CisJCXBBTVNEVXN1YmhlYWRlciA9IChQSEVBREVSXzgwMl8zKXBEYXRhOworCQkvL3BEYXRhICs9IExFTkdUSF84MDJfMzsKKwkJUGF5bG9hZFNpemUgPSBwQU1TRFVzdWJoZWFkZXItPk9jdGV0WzFdICsgKHBBTVNEVXN1YmhlYWRlci0+T2N0ZXRbMF08PDgpOworCQlTdWJGcmFtZVNpemUgPSBQYXlsb2FkU2l6ZSArIExFTkdUSF84MDJfMzsKKworCisJCWlmICgoRGF0YVNpemUgPCBTdWJGcmFtZVNpemUpIHx8IChQYXlsb2FkU2l6ZSA+IDE1MTggKSkKKwkJeworCQkJYnJlYWs7CisJCX0KKworCQkvL3ByaW50aygiJWQgc3ViZnJhbWU6IFNpemUgPSAlZFxuIiwgIG5NU0RVLCBQYXlsb2FkU2l6ZSk7CisKKwkJcFBheWxvYWQgPSBwRGF0YSArIExFTkdUSF84MDJfMzsKKwkJcERBID0gcERhdGE7CisJCXBTQSA9IHBEYXRhICsgTUFDX0FERFJfTEVOOworCisJCS8vIGNvbnZlcnQgdG8gODAyLjMgaGVhZGVyCisgICAgICAgIENPTlZFUlRfVE9fODAyXzMoSGVhZGVyODAyXzMsIHBEQSwgcFNBLCBwUGF5bG9hZCwgUGF5bG9hZFNpemUsIHBSZW1vdmVkTExDU05BUCk7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJaWYgKChIZWFkZXI4MDJfM1sxMl0gPT0gMHg4OCkgJiYgKEhlYWRlcjgwMl8zWzEzXSA9PSAweDhFKSApCisJCXsKKwkJICAgIC8vIGF2b2lkIGxvY2FsIGhlYXAgb3ZlcmZsb3csIHVzZSBkeWFuYW1pYyBhbGxvY2F0aW9uCisJCSAgIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSA9IChNTE1FX1FVRVVFX0VMRU0gKikga21hbGxvYyhzaXplb2YoTUxNRV9RVUVVRV9FTEVNKSwgTUVNX0FMTE9DX0ZMQUcpOworCQkgICBtZW1tb3ZlKEVsZW0tPk1zZysoTEVOR1RIXzgwMl8xMSArIExFTkdUSF84MDJfMV9IKSwgcFBheWxvYWQsIFBheWxvYWRTaXplKTsKKwkJICAgRWxlbS0+TXNnTGVuID0gTEVOR1RIXzgwMl8xMSArIExFTkdUSF84MDJfMV9IICsgUGF5bG9hZFNpemU7CisJCSAgIFdwYUVBUE9MS2V5QWN0aW9uKHBBZCwgRWxlbSk7CisJCSAgIGtmcmVlKEVsZW0pOworCQl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJeworCSAgICAgICAgCWlmIChwUmVtb3ZlZExMQ1NOQVApCisJICAgICAgICAJeworCSAgICAJCQlwUGF5bG9hZCAtPSBMRU5HVEhfODAyXzM7CisJICAgIAkJCVBheWxvYWRTaXplICs9IExFTkdUSF84MDJfMzsKKwkgICAgCQkJTmRpc01vdmVNZW1vcnkocFBheWxvYWQsICZIZWFkZXI4MDJfM1swXSwgTEVOR1RIXzgwMl8zKTsKKwkgICAgICAgIAl9CisJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCQlwQ2xvbmVQYWNrZXQgPSBDbG9uZVBhY2tldChwQWQsIHBQYWNrZXQsIHBQYXlsb2FkLCBQYXlsb2FkU2l6ZSk7CisJCWlmIChwQ2xvbmVQYWNrZXQpCisJCXsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCQkJQU5OT1VOQ0VfT1JfRk9SV0FSRF84MDJfM19QQUNLRVQocEFkLCBwQ2xvbmVQYWNrZXQsIFJUTVBfR0VUX1BBQ0tFVF9JRihwUGFja2V0KSk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJCX0KKworCisJCS8vIEEtTVNEVSBoYXMgcGFkZGluZyB0byBtdWx0aXBsZSBvZiA0IGluY2x1ZGluZyBzdWJmcmFtZSBoZWFkZXIuCisJCS8vIGFsaWduIFN1YkZyYW1lU2l6ZSB1cCB0byBtdWx0aXBsZSBvZiA0CisJCVN1YkZyYW1lU2l6ZSA9IChTdWJGcmFtZVNpemUrMykmKH4weDMpOworCisKKwkJaWYgKFN1YkZyYW1lU2l6ZSA+IDE1MjggfHwgU3ViRnJhbWVTaXplIDwgMzIpCisJCXsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKERhdGFTaXplID4gU3ViRnJhbWVTaXplKQorCQl7CisJCQlwRGF0YSArPSBTdWJGcmFtZVNpemU7CisJCQlEYXRhU2l6ZSAtPSBTdWJGcmFtZVNpemU7CisJCX0KKwkJZWxzZQorCQl7CisJCQkvLyBlbmQgb2YgQS1NU0RVCisJCQlEYXRhU2l6ZSA9IDA7CisJCX0KKwl9CisKKwkvLyBmaW5hbGx5IHJlbGVhc2Ugb3JpZ2luYWwgcnggcGFja2V0CisJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOworCisJcmV0dXJuIG5NU0RVOworfQorCisKK1VJTlQgQkFfUmVvcmRlcl9BTVNEVV9Bbm5ub3VuY2UoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUE5ESVNfUEFDS0VUCXBQYWNrZXQpCit7CisJUFVDSEFSCQkJcERhdGE7CisJVVNIT1JUCQkJRGF0YVNpemU7CisJVUlOVAkJCW5NU0RVID0gMDsKKworCXBEYXRhID0gKFBVQ0hBUikgR0VUX09TX1BLVF9EQVRBUFRSKHBQYWNrZXQpOworCURhdGFTaXplID0gKFVTSE9SVCkgR0VUX09TX1BLVF9MRU4ocFBhY2tldCk7CisKKwluTVNEVSA9IGRlYWdncmVnYXRlX0FNU0RVX2Fubm91bmNlKHBBZCwgcFBhY2tldCwgcERhdGEsIERhdGFTaXplKTsKKworCXJldHVybiBuTVNEVTsKK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCUxvb2sgdXAgdGhlIE1BQyBhZGRyZXNzIGluIHRoZSBNQUMgdGFibGUuIFJldHVybiBOVUxMIGlmIG5vdCBmb3VuZC4KKwlSZXR1cm46CisJCXBFbnRyeSAtIHBvaW50ZXIgdG8gdGhlIE1BQyBlbnRyeTsgTlVMTCBpcyBub3QgZm91bmQKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK01BQ19UQUJMRV9FTlRSWSAqTWFjVGFibGVMb29rdXAoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJUFVDSEFSIHBBZGRyKQoreworCVVMT05HIEhhc2hJZHg7CisJTUFDX1RBQkxFX0VOVFJZICpwRW50cnkgPSBOVUxMOworCisJSGFzaElkeCA9IE1BQ19BRERSX0hBU0hfSU5ERVgocEFkZHIpOworCXBFbnRyeSA9IHBBZC0+TWFjVGFiLkhhc2hbSGFzaElkeF07CisKKwl3aGlsZSAocEVudHJ5ICYmIChwRW50cnktPlZhbGlkQXNDTEkgfHwgcEVudHJ5LT5WYWxpZEFzV0RTIHx8IHBFbnRyeS0+VmFsaWRBc0FwQ2xpIHx8IHBFbnRyeS0+VmFsaWRBc01lc2gpKQorCXsKKwkJaWYgKE1BQ19BRERSX0VRVUFMKHBFbnRyeS0+QWRkciwgcEFkZHIpKQorCQl7CisJCQlicmVhazsKKwkJfQorCQllbHNlCisJCQlwRW50cnkgPSBwRW50cnktPnBOZXh0OworCX0KKworCXJldHVybiBwRW50cnk7Cit9CisKK01BQ19UQUJMRV9FTlRSWSAqTWFjVGFibGVJbnNlcnRFbnRyeSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgUFVDSEFSCQkJcEFkZHIsCisJSU4JVUNIQVIJCQlhcGlkeCwKKwlJTiBCT09MRUFOCUNsZWFuQWxsKQoreworCVVDSEFSIEhhc2hJZHg7CisJaW50IGksIEZpcnN0V2NpZDsKKwlNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeSA9IE5VTEwsICpwQ3VyckVudHJ5OworCisJLy8gaWYgRlVMTCwgcmV0dXJuCisJaWYgKHBBZC0+TWFjVGFiLlNpemUgPj0gTUFYX0xFTl9PRl9NQUNfVEFCTEUpCisJCXJldHVybiBOVUxMOworCisJRmlyc3RXY2lkID0gMTsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCWlmIChwQWQtPlN0YUNmZy5Cc3NUeXBlID09IEJTU19JTkZSQSkKKwkJRmlyc3RXY2lkID0gMjsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCS8vIGFsbG9jYXRlIG9uZSBNQUMgZW50cnkKKwlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPk1hY1RhYkxvY2spOworCWZvciAoaSA9IEZpcnN0V2NpZDsgaTwgTUFYX0xFTl9PRl9NQUNfVEFCTEU7IGkrKykgICAvLyBza2lwIGVudHJ5IzAgc28gdGhhdCAiZW50cnkgaW5kZXggPT0gQUlEIiBmb3IgZmFzdCBsb29rdXAKKwl7CisJCS8vIHBpY2sgdXAgdGhlIGZpcnN0IGF2YWlsYWJsZSB2YWNhbmN5CisJCWlmICgocEFkLT5NYWNUYWIuQ29udGVudFtpXS5WYWxpZEFzQ0xJID09IEZBTFNFKSAmJgorCQkJKHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uVmFsaWRBc1dEUyA9PSBGQUxTRSkgJiYKKwkJCShwQWQtPk1hY1RhYi5Db250ZW50W2ldLlZhbGlkQXNBcENsaT09IEZBTFNFKSAmJgorCQkJKHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uVmFsaWRBc01lc2ggPT0gRkFMU0UpCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJCQkmJiAocEFkLT5NYWNUYWIuQ29udGVudFtpXS5WYWxpZEFzRGxzID09IEZBTFNFKQorI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCQkJKQorCQl7CisJCQlwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtpXTsKKwkJCWlmIChDbGVhbkFsbCA9PSBUUlVFKQorCQkJeworCQkJCXBFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMTE7CisJCQkJcEVudHJ5LT5DdXJyVHhSYXRlID0gUkFURV8xMTsKKwkJCQlOZGlzWmVyb01lbW9yeShwRW50cnksIHNpemVvZihNQUNfVEFCTEVfRU5UUlkpKTsKKwkJCQlwRW50cnktPlBhaXJ3aXNlS2V5LktleUxlbiA9IDA7CisJCQkJcEVudHJ5LT5QYWlyd2lzZUtleS5DaXBoZXJBbGcgPSBDSVBIRVJfTk9ORTsKKwkJCX0KKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwkJCWlmIChhcGlkeCA+PSBNSU5fTkVUX0RFVklDRV9GT1JfRExTKQorCQkJeworCQkJCXBFbnRyeS0+VmFsaWRBc0NMSSA9IEZBTFNFOworCQkJCXBFbnRyeS0+VmFsaWRBc1dEUyA9IEZBTFNFOworCQkJCXBFbnRyeS0+VmFsaWRBc0FwQ2xpID0gRkFMU0U7CisJCQkJcEVudHJ5LT5WYWxpZEFzTWVzaCA9IEZBTFNFOworCQkJCXBFbnRyeS0+VmFsaWRBc0RscyA9IFRSVUU7CisJCQkJcEVudHJ5LT5pc0NhY2hlZCA9IEZBTFNFOworCQkJfQorCQkJZWxzZQorI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCQkJeworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJCQl7CisJCQkJCXBFbnRyeS0+VmFsaWRBc0NMSSA9IFRSVUU7CisJCQkJCXBFbnRyeS0+VmFsaWRBc1dEUyA9IEZBTFNFOworCQkJCQlwRW50cnktPlZhbGlkQXNBcENsaSA9IEZBTFNFOworCQkJCQlwRW50cnktPlZhbGlkQXNNZXNoID0gRkFMU0U7CisJCQkJCXBFbnRyeS0+VmFsaWRBc0RscyA9IEZBTFNFOworCQkJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwkJCX0KKworCQkJcEVudHJ5LT5iSUFtQmFkQXRoZXJvcyA9IEZBTFNFOworCQkJcEVudHJ5LT5wQWQgPSBwQWQ7CisJCQlwRW50cnktPkNNVGltZXJSdW5uaW5nID0gRkFMU0U7CisJCQlwRW50cnktPkVucXVldWVFYXBvbFN0YXJ0VGltZXJSdW5uaW5nID0gRUFQT0xfU1RBUlRfRElTQUJMRTsKKwkJCXBFbnRyeS0+UlNOSUVfTGVuID0gMDsKKwkJCU5kaXNaZXJvTWVtb3J5KHBFbnRyeS0+Ul9Db3VudGVyLCBzaXplb2YocEVudHJ5LT5SX0NvdW50ZXIpKTsKKwkJCXBFbnRyeS0+UmVUcnlDb3VudGVyID0gUEVFUl9NU0cxX1JFVFJZX1RJTUVSX0NUUjsKKworCQkJaWYgKHBFbnRyeS0+VmFsaWRBc01lc2gpCisJCQkJcEVudHJ5LT5hcGlkeCA9IChhcGlkeCAtIE1JTl9ORVRfREVWSUNFX0ZPUl9NRVNIKTsKKwkJCWVsc2UgaWYgKHBFbnRyeS0+VmFsaWRBc0FwQ2xpKQorCQkJCXBFbnRyeS0+YXBpZHggPSAoYXBpZHggLSBNSU5fTkVUX0RFVklDRV9GT1JfQVBDTEkpOworCQkJZWxzZSBpZiAocEVudHJ5LT5WYWxpZEFzV0RTKQorCQkJCXBFbnRyeS0+YXBpZHggPSAoYXBpZHggLSBNSU5fTkVUX0RFVklDRV9GT1JfV0RTKTsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwkJCWVsc2UgaWYgKHBFbnRyeS0+VmFsaWRBc0RscykKKwkJCQlwRW50cnktPmFwaWR4ID0gKGFwaWR4IC0gTUlOX05FVF9ERVZJQ0VfRk9SX0RMUyk7CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJCQllbHNlCisJCQkJcEVudHJ5LT5hcGlkeCA9IGFwaWR4OworCisJCQl7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQkJCXsKKwkJCQkJcEVudHJ5LT5BdXRoTW9kZSA9IHBBZC0+U3RhQ2ZnLkF1dGhNb2RlOworCQkJCQlwRW50cnktPldlcFN0YXR1cyA9IHBBZC0+U3RhQ2ZnLldlcFN0YXR1czsKKwkJCQkJcEVudHJ5LT5Qcml2YWN5RmlsdGVyID0gTmRpczgwMl8xMVByaXZGaWx0ZXJBY2NlcHRBbGw7CisJCQkJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCQkJfQorCisJCQlwRW50cnktPkdUS1N0YXRlID0gUkVLRVlfTkVHT1RJQVRJTkc7CisJCQlwRW50cnktPlBhaXJ3aXNlS2V5LktleUxlbiA9IDA7CisJCQlwRW50cnktPlBhaXJ3aXNlS2V5LkNpcGhlckFsZyA9IENJUEhFUl9OT05FOworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCQkJaWYgKHBFbnRyeS0+VmFsaWRBc0RscyA9PSBUUlVFKQorCQkJCXBFbnRyeS0+UG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRDsKKyNlbmRpZiAvL1FPU19ETFNfU1VQUE9SVAorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCQkJcEVudHJ5LT5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9OT1RfU0VDVVJFRDsKKwkJCXBFbnRyeS0+UE1LSURfQ2FjaGVJZHggPSBFTlRSWV9OT1RfRk9VTkQ7CisJCQlDT1BZX01BQ19BRERSKHBFbnRyeS0+QWRkciwgcEFkZHIpOworCQkJcEVudHJ5LT5Tc3QgPSBTU1RfTk9UX0FVVEg7CisJCQlwRW50cnktPkF1dGhTdGF0ZSA9IEFTX05PVF9BVVRIOworCQkJcEVudHJ5LT5BaWQgPSAoVVNIT1JUKWk7ICAvLzA7CisJCQlwRW50cnktPkNhcGFiaWxpdHlJbmZvID0gMDsKKwkJCXBFbnRyeS0+UHNNb2RlID0gUFdSX0FDVElWRTsKKwkJCXBFbnRyeS0+UHNRSWRsZUNvdW50ID0gMDsKKwkJCXBFbnRyeS0+Tm9EYXRhSWRsZUNvdW50ID0gMDsKKwkJCXBFbnRyeS0+Q29udGludWVUeEZhaWxDbnQgPSAwOworCQkJSW5pdGlhbGl6ZVF1ZXVlSGVhZGVyKCZwRW50cnktPlBzUXVldWUpOworCisKKwkJCXBBZC0+TWFjVGFiLlNpemUgKys7CisJCQkvLyBBZGQgdGhpcyBlbnRyeSBpbnRvIEFTSUMgUlggV0NJRCBzZWFyY2ggdGFibGUKKwkJCVJUMjhYWF9TVEFfRU5UUllfQUREKHBBZCwgcEVudHJ5KTsKKworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTWFjVGFibGVJbnNlcnRFbnRyeSAtIGFsbG9jYXRlIGVudHJ5ICMlZCwgVG90YWw9ICVkXG4iLGksIHBBZC0+TWFjVGFiLlNpemUpKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJLy8gYWRkIHRoaXMgTUFDIGVudHJ5IGludG8gSEFTSCB0YWJsZQorCWlmIChwRW50cnkpCisJeworCQlIYXNoSWR4ID0gTUFDX0FERFJfSEFTSF9JTkRFWChwQWRkcik7CisJCWlmIChwQWQtPk1hY1RhYi5IYXNoW0hhc2hJZHhdID09IE5VTEwpCisJCXsKKwkJCXBBZC0+TWFjVGFiLkhhc2hbSGFzaElkeF0gPSBwRW50cnk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlwQ3VyckVudHJ5ID0gcEFkLT5NYWNUYWIuSGFzaFtIYXNoSWR4XTsKKwkJCXdoaWxlIChwQ3VyckVudHJ5LT5wTmV4dCAhPSBOVUxMKQorCQkJCXBDdXJyRW50cnkgPSBwQ3VyckVudHJ5LT5wTmV4dDsKKwkJCXBDdXJyRW50cnktPnBOZXh0ID0gcEVudHJ5OworCQl9CisJfQorCisJTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5NYWNUYWJMb2NrKTsKKwlyZXR1cm4gcEVudHJ5OworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCURlbGV0ZSBhIHNwZWNpZmllZCBjbGllbnQgZnJvbSBNQUMgdGFibGUKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitCT09MRUFOIE1hY1RhYmxlRGVsZXRlRW50cnkoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVVNIT1JUIHdjaWQsCisJSU4gUFVDSEFSIHBBZGRyKQoreworCVVTSE9SVCBIYXNoSWR4OworCU1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5LCAqcFByZXZFbnRyeSwgKnBQcm9iZUVudHJ5OworCUJPT0xFQU4gQ2FuY2VsbGVkOworCS8vVVNIT1JUCW9mZnNldDsJLy8gdW51c2VkIHZhcmlhYmxlCisJLy9VQ0hBUglqOwkJCS8vIHVudXNlZCB2YXJpYWJsZQorCisJaWYgKHdjaWQgPj0gTUFYX0xFTl9PRl9NQUNfVEFCTEUpCisJCXJldHVybiBGQUxTRTsKKworCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+TWFjVGFiTG9jayk7CisKKwlIYXNoSWR4ID0gTUFDX0FERFJfSEFTSF9JTkRFWChwQWRkcik7CisJLy9wRW50cnkgPSBwQWQtPk1hY1RhYi5IYXNoW0hhc2hJZHhdOworCXBFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W3djaWRdOworCisJaWYgKHBFbnRyeSAmJiAocEVudHJ5LT5WYWxpZEFzQ0xJIHx8IHBFbnRyeS0+VmFsaWRBc0FwQ2xpIHx8IHBFbnRyeS0+VmFsaWRBc1dEUyB8fCBwRW50cnktPlZhbGlkQXNNZXNoCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisgCQl8fCBwRW50cnktPlZhbGlkQXNEbHMKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwkJKSkKKwl7CisJCWlmIChNQUNfQUREUl9FUVVBTChwRW50cnktPkFkZHIsIHBBZGRyKSkKKwkJeworCisJCQkvLyBEZWxldGUgdGhpcyBlbnRyeSBmcm9tIEFTSUMgb24tY2hpcCBXQ0lEIFRhYmxlCisJCQlSVDI4WFhfU1RBX0VOVFJZX01BQ19SRVNFVChwQWQsIHdjaWQpOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQkvLyBmcmVlIHJlc291cmNlcyBvZiBCQQorCQkJQkFTZXNzaW9uVGVhckRvd25BTEwocEFkLCBwRW50cnktPkFpZCk7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKworCQkJcFByZXZFbnRyeSA9IE5VTEw7CisJCQlwUHJvYmVFbnRyeSA9IHBBZC0+TWFjVGFiLkhhc2hbSGFzaElkeF07CisJCQlBU1NFUlQocFByb2JlRW50cnkpOworCisJCQkvLyB1cGRhdGUgSGFzaCBsaXN0CisJCQlkbworCQkJeworCQkJCWlmIChwUHJvYmVFbnRyeSA9PSBwRW50cnkpCisJCQkJeworCQkJCQlpZiAocFByZXZFbnRyeSA9PSBOVUxMKQorCQkJCQl7CisJCQkJCQlwQWQtPk1hY1RhYi5IYXNoW0hhc2hJZHhdID0gcEVudHJ5LT5wTmV4dDsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCXBQcmV2RW50cnktPnBOZXh0ID0gcEVudHJ5LT5wTmV4dDsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQlwUHJldkVudHJ5ID0gcFByb2JlRW50cnk7CisJCQkJcFByb2JlRW50cnkgPSBwUHJvYmVFbnRyeS0+cE5leHQ7CisJCQl9IHdoaWxlIChwUHJvYmVFbnRyeSk7CisKKwkJCS8vIG5vdCBmb3VuZCAhISEKKwkJCUFTU0VSVChwUHJvYmVFbnRyeSAhPSBOVUxMKTsKKworCQkJUlQyOFhYX1NUQV9FTlRSWV9LRVlfREVMKHBBZCwgQlNTMCwgd2NpZCk7CisKKworCQlpZiAocEVudHJ5LT5FbnF1ZXVlRWFwb2xTdGFydFRpbWVyUnVubmluZyAhPSBFQVBPTF9TVEFSVF9ESVNBQkxFKQorCQl7CisJCQlSVE1QQ2FuY2VsVGltZXIoJnBFbnRyeS0+RW5xdWV1ZVN0YXJ0Rm9yUFNLVGltZXIsICZDYW5jZWxsZWQpOworCQkJcEVudHJ5LT5FbnF1ZXVlRWFwb2xTdGFydFRpbWVyUnVubmluZyA9IEVBUE9MX1NUQVJUX0RJU0FCTEU7CisJCX0KKworCisgICAJCQlOZGlzWmVyb01lbW9yeShwRW50cnksIHNpemVvZihNQUNfVEFCTEVfRU5UUlkpKTsKKwkJCXBBZC0+TWFjVGFiLlNpemUgLS07CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNYWNUYWJsZURlbGV0ZUVudHJ5MSAtIFRvdGFsPSAlZFxuIiwgcEFkLT5NYWNUYWIuU2l6ZSkpOworCQl9CisJCWVsc2UKKwkJeworCQkJcHJpbnRrKCJcbiVzOiBJbXBvc3NpYmxlIFdjaWQgPSAlZCAhISEhIVxuIiwgX19mdW5jX18sIHdjaWQpOworCQl9CisJfQorCisJTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5NYWNUYWJMb2NrKTsKKworCS8vUmVzZXQgb3BlcmF0aW5nIG1vZGUgd2hlbiBubyBTdGEuCisJaWYgKHBBZC0+TWFjVGFiLlNpemUgPT0gMCkKKwl7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCXBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mby5BZGRIdEluZm8yLk9wZXJhaW9uTW9kZSA9IDA7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCUFzaWNVcGRhdGVQcm90ZWN0KHBBZCwgMCAvKnBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mby5BZGRIdEluZm8yLk9wZXJhaW9uTW9kZSovLCAoQUxMTl9TRVRQUk9URUNUKSwgVFJVRSwgMCAvKnBBZC0+TWFjVGFiLmZBbnlTdGF0aW9uTm9uR0YqLyk7CisJfQorCisJcmV0dXJuIFRSVUU7Cit9CisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlUaGlzIHJvdXRpbmUgcmVzZXQgdGhlIGVudGlyZSBNQUMgdGFibGUuIEFsbCBwYWNrZXRzIHBlbmRpbmcgaW4KKwkJdGhlIHBvd2VyLXNhdmluZyBxdWV1ZXMgYXJlIGZyZWVkIGhlcmUuCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBNYWNUYWJsZVJlc2V0KAorCUlOICBQUlRNUF9BREFQVEVSICBwQWQpCit7CisJaW50ICAgICAgICAgaTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1hY1RhYmxlUmVzZXRcbiIpKTsKKwkvL05kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+TWFjVGFiTG9jayk7CisKKwlmb3IgKGk9MTsgaTxNQVhfTEVOX09GX01BQ19UQUJMRTsgaSsrKQorCXsKKwkJaWYgKHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uVmFsaWRBc0NMSSA9PSBUUlVFKQorCSAgIHsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJLy8gZnJlZSByZXNvdXJjZXMgb2YgQkEKKwkJCUJBU2Vzc2lvblRlYXJEb3duQUxMKHBBZCwgaSk7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwkJCXBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uVmFsaWRBc0NMSSA9IEZBTFNFOworCisKKworI2lmZGVmIFJUMjg3MAorCQkJTmRpc1plcm9NZW1vcnkocEFkLT5NYWNUYWIuQ29udGVudFtpXS5BZGRyLCA2KTsKKwkJCVJUMjhYWF9TVEFfRU5UUllfTUFDX1JFU0VUKHBBZCwgaSk7CisjZW5kaWYgLy8gUlQyODcwIC8vCisKKwkJCS8vQXNpY0RlbFdjaWRUYWIocEFkLCBpKTsKKwkJfQorCX0KKworCXJldHVybjsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgQXNzb2NQYXJtRmlsbCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBPVVQgTUxNRV9BU1NPQ19SRVFfU1RSVUNUICpBc3NvY1JlcSwKKwlJTiBQVUNIQVIgICAgICAgICAgICAgICAgICAgICBwQWRkciwKKwlJTiBVU0hPUlQgICAgICAgICAgICAgICAgICAgICBDYXBhYmlsaXR5SW5mbywKKwlJTiBVTE9ORyAgICAgICAgICAgICAgICAgICAgICBUaW1lb3V0LAorCUlOIFVTSE9SVCAgICAgICAgICAgICAgICAgICAgIExpc3RlbkludHYpCit7CisJQ09QWV9NQUNfQUREUihBc3NvY1JlcS0+QWRkciwgcEFkZHIpOworCS8vIEFkZCBtYXNrIHRvIHN1cHBvcnQgODAyLjExYiBtb2RlIG9ubHkKKwlBc3NvY1JlcS0+Q2FwYWJpbGl0eUluZm8gPSBDYXBhYmlsaXR5SW5mbyAmIFNVUFBPUlRFRF9DQVBBQklMSVRZX0lORk87IC8vIG5vdCBjZi1wb2xsYWJsZSwgbm90IGNmLXBvbGwtcmVxdWVzdAorCUFzc29jUmVxLT5UaW1lb3V0ID0gVGltZW91dDsKKwlBc3NvY1JlcS0+TGlzdGVuSW50diA9IExpc3RlbkludHY7Cit9CisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgRGlzYXNzb2NQYXJtRmlsbCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBPVVQgTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNUICpEaXNhc3NvY1JlcSwKKwlJTiBQVUNIQVIgcEFkZHIsCisJSU4gVVNIT1JUIFJlYXNvbikKK3sKKwlDT1BZX01BQ19BRERSKERpc2Fzc29jUmVxLT5BZGRyLCBwQWRkcik7CisJRGlzYXNzb2NSZXEtPlJlYXNvbiA9IFJlYXNvbjsKK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJQ2hlY2sgdGhlIG91dCBnb2luZyBmcmFtZSwgaWYgdGhpcyBpcyBhbiBESENQIG9yIEFSUCBkYXRhZ3JhbQorCXdpbGwgYmUgZHVwbGljYXRlIGFub3RoZXIgZnJhbWUgYXQgbG93IGRhdGEgcmF0ZSB0cmFuc21pdC4KKworCUFyZ3VtZW50czoKKwkJcEFkIAkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCQlwUGFja2V0IAlQb2ludGVyIHRvIG91dGdvaW5nIE5kaXMgZnJhbWUKKworCVJldHVybiBWYWx1ZToKKwkJVFJVRQkJVG8gYmUgZHVwbGljYXRlIGF0IExvdyBkYXRhIHJhdGUgdHJhbnNtaXQuICgxbWIpCisJCUZBTFNFCQlEbyBub3RoaW5nLgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwlOb3RlOgorCisJCU1BQyBoZWFkZXIgKyBJUCBIZWFkZXIgKyBVRFAgSGVhZGVyCisJCSAgMTQgQnl0ZXMJICAyMCBCeXRlcworCisJCVVEUCBIZWFkZXIKKwkJMDB8MDF8MDJ8MDN8MDR8MDV8MDZ8MDd8MDh8MDl8MTB8MTF8MTJ8MTN8MTR8MTV8CisJCQkJCQlTb3VyY2UgUG9ydAorCQkxNnwxN3wxOHwxOXwyMHwyMXwyMnwyM3wyNHwyNXwyNnwyN3wyOHwyOXwzMHwzMXwKKwkJCQkJRGVzdGluYXRpb24gUG9ydAorCisJCXBvcnQgMHg0MyBtZWFucyBCb290c3RyYXAgUHJvdG9jb2wsIHNlcnZlci4KKwkJUG9ydCAweDQ0IG1lYW5zIEJvb3RzdHJhcCBQcm90b2NvbCwgY2xpZW50LgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworCitCT09MRUFOIFJUTVBDaGVja0RIQ1BGcmFtZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQTkRJU19QQUNLRVQJcFBhY2tldCkKK3sKKwlQQUNLRVRfSU5GTyAJUGFja2V0SW5mbzsKKwlVTE9ORwkJCU51bWJlck9mQnl0ZXNSZWFkID0gMDsKKwlVTE9ORwkJCUN1cnJlbnRPZmZzZXQgPSAwOworCVBWT0lECQkJcFZpcnR1YWxBZGRyZXNzID0gTlVMTDsKKwlVSU5UCQkJTmRpc0J1ZmZlckxlbmd0aDsKKwlQVUNIQVIJCQlwU3JjOworCVVTSE9SVAkJCVByb3RvY29sOworCVVDSEFSCQkJQnl0ZU9mZnNldDM2ID0gMDsKKwlVQ0hBUgkJCUJ5dGVPZmZzZXQzOCA9IDA7CisJQk9PTEVBTiAJCVJlYWRGaXJzdFBhcm0gPSBUUlVFOworCisJUlRNUF9RdWVyeVBhY2tldEluZm8ocFBhY2tldCwgJlBhY2tldEluZm8sIChQVUNIQVIgKikmcFZpcnR1YWxBZGRyZXNzLCAmTmRpc0J1ZmZlckxlbmd0aCk7CisKKwlOdW1iZXJPZkJ5dGVzUmVhZCArPSBOZGlzQnVmZmVyTGVuZ3RoOworCXBTcmMgPSAoUFVDSEFSKSBwVmlydHVhbEFkZHJlc3M7CisJUHJvdG9jb2wgPSAqKHBTcmMgKyAxMikgKiAyNTYgKyAqKHBTcmMgKyAxMyk7CisKKwkvLworCS8vIENoZWNrIERIQ1AgJiBCT09UUCBwcm90b2NvbAorCS8vCisJd2hpbGUgKE51bWJlck9mQnl0ZXNSZWFkIDw9IFBhY2tldEluZm8uVG90YWxQYWNrZXRMZW5ndGgpCisJeworCQlpZiAoKE51bWJlck9mQnl0ZXNSZWFkID49IDM1KSAmJiAoUmVhZEZpcnN0UGFybSA9PSBUUlVFKSkKKwkJeworCQkJQ3VycmVudE9mZnNldCA9IDM1IC0gKE51bWJlck9mQnl0ZXNSZWFkIC0gTmRpc0J1ZmZlckxlbmd0aCk7CisJCQlCeXRlT2Zmc2V0MzYgPSAqKHBTcmMgKyBDdXJyZW50T2Zmc2V0KTsKKwkJCVJlYWRGaXJzdFBhcm0gPSBGQUxTRTsKKwkJfQorCisJCWlmIChOdW1iZXJPZkJ5dGVzUmVhZCA+PSAzNykKKwkJeworCQkJQ3VycmVudE9mZnNldCA9IDM3IC0gKE51bWJlck9mQnl0ZXNSZWFkIC0gTmRpc0J1ZmZlckxlbmd0aCk7CisJCQlCeXRlT2Zmc2V0MzggPSAqKHBTcmMgKyBDdXJyZW50T2Zmc2V0KTsKKwkJCS8vRW5kIG9mIFJlYWQKKwkJCWJyZWFrOworCQl9CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwkvLyBDaGVjayBmb3IgREhDUCAmIEJPT1RQIHByb3RvY29sCisJaWYgKChCeXRlT2Zmc2V0MzYgIT0gMHg0NCkgfHwgKEJ5dGVPZmZzZXQzOCAhPSAweDQzKSkKKwkJeworCQkvLworCQkvLyAyMDU0IChoZXggMDgwNikgZm9yIEFSUCBkYXRhZ3JhbXMKKwkJLy8gaWYgdGhpcyBwYWNrZXQgaXMgbm90IEFSUCBkYXRhZ3JhbXMsIHRoZW4gZG8gbm90aGluZworCQkvLyBBUlAgZGF0YWdyYW1zIHdpbGwgYWxzbyBiZSBkdXBsaWNhdGUgYXQgMW1iIGJyb2FkY2FzdCBmcmFtZXMKKwkJLy8KKwkJaWYgKFByb3RvY29sICE9IDB4MDgwNiApCisJCQlyZXR1cm4gRkFMU0U7CisJCX0KKworCXJldHVybiBUUlVFOworfQorCisKK0JPT0xFQU4gUlRNUENoZWNrRXRoZXJUeXBlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBORElTX1BBQ0tFVAlwUGFja2V0KQoreworCVVTSE9SVAlUeXBlTGVuOworCVVDSEFSCUJ5dGUwLCBCeXRlMTsKKwlQVUNIQVIJcFNyY0J1ZjsKKwlVSU5UMzIJcGt0TGVuOworCVVJTlQxNiAJc3JjUG9ydCwgZHN0UG9ydDsKKwlCT09MRUFOCXN0YXR1cyA9IFRSVUU7CisKKworCXBTcmNCdWYgPSBHRVRfT1NfUEtUX0RBVEFQVFIocFBhY2tldCk7CisJcGt0TGVuID0gR0VUX09TX1BLVF9MRU4ocFBhY2tldCk7CisKKwlBU1NFUlQocFNyY0J1Zik7CisKKwlSVE1QX1NFVF9QQUNLRVRfU1BFQ0lGSUMocFBhY2tldCwgMCk7CisKKwkvLyBnZXQgRXRoZXJuZXQgcHJvdG9jb2wgZmllbGQKKwlUeXBlTGVuID0gKHBTcmNCdWZbMTJdIDw8IDgpICsgcFNyY0J1ZlsxM107CisKKwlwU3JjQnVmICs9IExFTkdUSF84MDJfMzsJLy8gU2tpcCB0aGUgRXRoZXJuZXQgSGVhZGVyLgorCisJaWYgKFR5cGVMZW4gPD0gMTUwMCkKKwl7CS8vIDgwMi4zLCA4MDIuMyBMTEMKKwkJLyoKKwkJCURlc3RNQUMoNikgKyBTcmNNQUMoNikgKyBMZW5naHQoMikgKworCQkJRFNBUCgxKSArIFNTQVAoMSkgKyBDb250cm9sKDEpICsKKwkJCWlmIHRoZSBEU0FQID0gMHhBQSwgU1NBUD0weEFBLCBDb250b3JsID0gMHgwMywgaXQgaGFzIGEgNS1ieXRlcyBTTkFQIGhlYWRlci4KKwkJCQk9PiArIFNOQVAgKDUsIE9yaWdpbmF0aW9uSUQoMykgKyBldGhlclR5cGUoMikpCisJCSovCisJCWlmIChwU3JjQnVmWzBdID09IDB4QUEgJiYgcFNyY0J1ZlsxXSA9PSAweEFBICYmIHBTcmNCdWZbMl0gPT0gMHgwMykKKwkJeworCQkJU25pZmYyQnl0ZXNGcm9tTmRpc0J1ZmZlcihwU3JjQnVmLCA2LCAmQnl0ZTAsICZCeXRlMSk7CisJCQlSVE1QX1NFVF9QQUNLRVRfTExDU05BUChwUGFja2V0LCAxKTsKKwkJCVR5cGVMZW4gPSAoVVNIT1JUKSgoQnl0ZTAgPDwgOCkgKyBCeXRlMSk7CisJCQlwU3JjQnVmICs9IDg7IC8vIFNraXAgdGhpcyBMTEMvU05BUCBoZWFkZXIKKwkJfQorCQllbHNlCisJCXsKKwkJCS8vSXQganVzdCBoYXMgMy1ieXRlIExMQyBoZWFkZXIsIG1heWJlIGEgbGVnYWN5IGV0aGVyIHR5cGUgZnJhbWUuIHdlIGRpZG4ndCBoYW5kbGUgaXQuCisJCX0KKwl9CisKKwkvLyBJZiBpdCdzIGEgVkxBTiBwYWNrZXQsIGdldCB0aGUgcmVhbCBUeXBlL0xlbmd0aCBmaWVsZC4KKwlpZiAoVHlwZUxlbiA9PSAweDgxMDApCisJeworCQkvKiAweDgxMDAgbWVhbnMgVkxBTiBwYWNrZXRzICovCisKKwkJLyogRGVzdC4gTUFDIEFkZHJlc3MgKDYtYnl0ZXMpICsKKwkJICAgU291cmNlIE1BQyBBZGRyZXNzICg2LWJ5dGVzKSArCisJCSAgIExlbmd0aC9UeXBlID0gODAyLjFRIFRhZyBUeXBlICgyLWJ5dGUpICsKKwkJICAgVGFnIENvbnRyb2wgSW5mb3JtYXRpb24gKDItYnl0ZXMpICsKKwkJICAgTGVuZ3RoIC8gVHlwZSAoMi1ieXRlcykgKworCQkgICBkYXRhIHBheWxvYWQgKDAtbiBieXRlcykgKworCQkgICBQYWQgKDAtcCBieXRlcykgKworCQkgICBGcmFtZSBDaGVjayBTZXF1ZW5jZSAoNC1ieXRlcykgKi8KKworCQlSVE1QX1NFVF9QQUNLRVRfVkxBTihwUGFja2V0LCAxKTsKKwkJU25pZmYyQnl0ZXNGcm9tTmRpc0J1ZmZlcihwU3JjQnVmLCAyLCAmQnl0ZTAsICZCeXRlMSk7CisJCVR5cGVMZW4gPSAoVVNIT1JUKSgoQnl0ZTAgPDwgOCkgKyBCeXRlMSk7CisKKwkJcFNyY0J1ZiArPSA0OyAvLyBTa2lwIHRoZSBWTEFOIEhlYWRlci4KKwl9CisKKwlzd2l0Y2ggKFR5cGVMZW4pCisJeworCQljYXNlIDB4MDgwMDoKKwkJCXsKKwkJCQlBU1NFUlQoKHBrdExlbiA+IDM0KSk7CisJCQkJaWYgKCoocFNyY0J1ZiArIDkpID09IDB4MTEpCisJCQkJewkvLyB1ZHAgcGFja2V0CisJCQkJCUFTU0VSVCgocGt0TGVuID4gMzQpKTsJLy8gMTQgZm9yIGV0aGVybmV0IGhlYWRlciwgMjAgZm9yIElQIGhlYWRlcgorCisJCQkJCXBTcmNCdWYgKz0gMjA7CS8vIFNraXAgdGhlIElQIGhlYWRlcgorCQkJCQlzcmNQb3J0ID0gT1NfTlRPSFMoKigoVUlOVDE2ICopcFNyY0J1ZikpOworCQkJCQlkc3RQb3J0ID0gT1NfTlRPSFMoKigoVUlOVDE2ICopKHBTcmNCdWYgKzIpKSk7CisKKwkJCQkJaWYgKChzcmNQb3J0PT0weDQ0ICYmIGRzdFBvcnQ9PTB4NDMpIHx8IChzcmNQb3J0PT0weDQzICYmIGRzdFBvcnQ9PTB4NDQpKQorCQkJCQl7CS8vSXQncyBhIEJPT1RQL0RIQ1AgcGFja2V0CisJCQkJCQlSVE1QX1NFVF9QQUNLRVRfREhDUChwUGFja2V0LCAxKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIDB4MDgwNjoKKwkJCXsKKwkJCQkvL0FSUCBQYWNrZXQuCisJCQkJUlRNUF9TRVRfUEFDS0VUX0RIQ1AocFBhY2tldCwgMSk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAweDg4OGU6CisJCQl7CisJCQkJLy8gRUFQT0wgUGFja2V0LgorCQkJCVJUTVBfU0VUX1BBQ0tFVF9FQVBPTChwUGFja2V0LCAxKTsKKwkJCX0KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJc3RhdHVzID0gRkFMU0U7CisJCQlicmVhazsKKwl9CisKKwlyZXR1cm4gc3RhdHVzOworCit9CisKKworCitWT0lEIFVwZGF0ZV9Sc3NpX1NhbXBsZSgKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiBSU1NJX1NBTVBMRQkJKnBSc3NpLAorCUlOIFBSWFdJX1NUUlVDCQlwUnhXSSkKKwkJeworCUNIQVIJcnNzaTAgPSBwUnhXSS0+UlNTSTA7CisJQ0hBUglyc3NpMSA9IHBSeFdJLT5SU1NJMTsKKwlDSEFSCXJzc2kyID0gcFJ4V0ktPlJTU0kyOworCisJaWYgKHJzc2kwICE9IDApCisJeworCQlwUnNzaS0+TGFzdFJzc2kwCT0gQ29udmVydFRvUnNzaShwQWQsIChDSEFSKXJzc2kwLCBSU1NJXzApOworCQlwUnNzaS0+QXZnUnNzaTBYOAk9IChwUnNzaS0+QXZnUnNzaTBYOCAtIHBSc3NpLT5BdmdSc3NpMCkgKyBwUnNzaS0+TGFzdFJzc2kwOworCQlwUnNzaS0+QXZnUnNzaTAJPSBwUnNzaS0+QXZnUnNzaTBYOCA+PiAzOworCX0KKworCWlmIChyc3NpMSAhPSAwKQorCXsKKwkJcFJzc2ktPkxhc3RSc3NpMQk9IENvbnZlcnRUb1Jzc2kocEFkLCAoQ0hBUilyc3NpMSwgUlNTSV8xKTsKKwkJcFJzc2ktPkF2Z1Jzc2kxWDgJPSAocFJzc2ktPkF2Z1Jzc2kxWDggLSBwUnNzaS0+QXZnUnNzaTEpICsgcFJzc2ktPkxhc3RSc3NpMTsKKwkJcFJzc2ktPkF2Z1Jzc2kxCT0gcFJzc2ktPkF2Z1Jzc2kxWDggPj4gMzsKKwl9CisKKwlpZiAocnNzaTIgIT0gMCkKKwl7CisJCXBSc3NpLT5MYXN0UnNzaTIJPSBDb252ZXJ0VG9Sc3NpKHBBZCwgKENIQVIpcnNzaTIsIFJTU0lfMik7CisJCXBSc3NpLT5BdmdSc3NpMlg4ICA9IChwUnNzaS0+QXZnUnNzaTJYOCAtIHBSc3NpLT5BdmdSc3NpMikgKyBwUnNzaS0+TGFzdFJzc2kyOworCQlwUnNzaS0+QXZnUnNzaTIgPSBwUnNzaS0+QXZnUnNzaTJYOCA+PiAzOworCX0KK30KKworCisKKy8vIE5vcm1hbCBsZWdhY3kgUnggcGFja2V0IGluZGljYXRpb24KK1ZPSUQgSW5kaWNhdGVfTGVnYWN5X1BhY2tldCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglSWF9CTEsJCQkqcFJ4QmxrLAorCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpCit7CisJUE5ESVNfUEFDS0VUCXBSeFBhY2tldCA9IHBSeEJsay0+cFJ4UGFja2V0OworCVVDSEFSCQkJSGVhZGVyODAyXzNbTEVOR1RIXzgwMl8zXTsKKworCS8vIDEuIGdldCA4MDIuMyBIZWFkZXIKKwkvLyAyLiByZW1vdmUgTExDCisJLy8gCQlhLiBwb2ludGVyIHBSeEJsay0+cERhdGEgdG8gcGF5bG9hZAorCS8vICAgICAgYi4gbW9kaWZ5IHBSeEJsay0+RGF0YVNpemUKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQlSVE1QXzgwMl8xMV9SRU1PVkVfTExDX0FORF9DT05WRVJUX1RPXzgwMl8zKHBSeEJsaywgSGVhZGVyODAyXzMpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJaWYgKHBSeEJsay0+RGF0YVNpemUgPiBNQVhfUlhfUEtUX0xFTikKKwl7CisjaWYgMCAvLyBzYW1wbGUgdGFrZSBvZmYsIGZvciBtdWx0aXBsZSBjYXJkIGRlc2lnbgorCQlzdGF0aWMgaW50IGVycl9zaXplOworCisJCWVycl9zaXplKys7CisJCWlmIChlcnJfc2l6ZSA+IDIwKQorCQl7CisJCQkgcHJpbnRrKCJMZWdhY3kgRGF0YVNpemUgPSAlZFxuIiwgcFJ4QmxrLT5EYXRhU2l6ZSk7CisJCQkgaGV4X2R1bXAoIjgwMi4zIEhlYWRlciIsIEhlYWRlcjgwMl8zLCBMRU5HVEhfODAyXzMpOworCQkJIGhleF9kdW1wKCJQYXlsb2FkIiwgcFJ4QmxrLT5wRGF0YSwgNjQpOworCQkJIGVycl9zaXplID0gMDsKKwkJfQorI2VuZGlmCisKKwkJLy8gcmVsZWFzZSBwYWNrZXQKKwkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCXJldHVybjsKKwl9CisKKworCVNUQVRTX0lOQ19SWF9QQUNLRVRTKHBBZCwgRnJvbVdoaWNoQlNTSUQpOworCisjaWZkZWYgUlQyODcwCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJEaXNhYmxlUmVvcmRlcmluZyA9PSAwKQorCXsKKwkJUEJBX1JFQ19FTlRSWQkJcEJBRW50cnk7CisJCVVMT05HCQkJCU5vdzMyOworCQlVQ0hBUgkJCQlXY2lkID0gcFJ4QmxrLT5wUnhXSS0+V2lyZWxlc3NDbGlJRDsKKwkJVUNIQVIJCQkJVElEID0gcFJ4QmxrLT5wUnhXSS0+VElEOworCQlVU0hPUlQJCQkJSWR4OworCisjZGVmaW5lIFJFT1JERVJJTkdfUEFDS0VUX1RJTUVPVVQJCSgoMTAwICogSFopLzEwMDApCS8vIHN5c3RlbSB0aWNrcyAtLSAxMDAgbXMKKworCQlpZiAoV2NpZCA8IE1BWF9MRU5fT0ZfTUFDX1RBQkxFKQorCQl7CisJCQlJZHggPSBwQWQtPk1hY1RhYi5Db250ZW50W1djaWRdLkJBUmVjV2NpZEFycmF5W1RJRF07CisJCQlpZiAoSWR4ICE9IDApCisJCQl7CisJCQkJcEJBRW50cnkgPSAmcEFkLT5CQVRhYmxlLkJBUmVjRW50cnlbSWR4XTsKKwkJCQkvLyB1cGRhdGUgbGFzdCByeCB0aW1lCisJCQkJTmRpc0dldFN5c3RlbVVwVGltZSgmTm93MzIpOworCQkJCWlmICgocEJBRW50cnktPmxpc3QucWxlbiA+IDApICYmCisJCQkJCSBSVE1QX1RJTUVfQUZURVIoKHVuc2lnbmVkIGxvbmcpTm93MzIsICh1bnNpZ25lZCBsb25nKShwQkFFbnRyeS0+TGFzdEluZFNlcUF0VGltZXIrKFJFT1JERVJJTkdfUEFDS0VUX1RJTUVPVVQpKSkKKwkgICAJCQkJKQorCQkJCXsKKwkJCQkJcHJpbnRrKCJJbmRpY2F0ZV9MZWdhY3lfUGFja2V0KCk6Zmx1c2ggcmVvcmRlcmluZ190aW1lb3V0X21wZHVzISBSeFdJLT5GbGFncz0lZCwgcFJ4V0kuVElEPSVkLCBSeEQtPkFNUERVPSVkIVxuIiwgcFJ4QmxrLT5GbGFncywgcFJ4QmxrLT5wUnhXSS0+VElELCBwUnhCbGstPlJ4RC5BTVBEVSk7CisJCQkJCWhleF9kdW1wKCJEdW1wIHRoZSBsZWdhY3kgUGFja2V0OiIsIEdFVF9PU19QS1RfREFUQVBUUihwUnhCbGstPnBSeFBhY2tldCksIDY0KTsKKwkJCQkJYmFfZmx1c2hfcmVvcmRlcmluZ190aW1lb3V0X21wZHVzKHBBZCwgcEJBRW50cnksIE5vdzMyKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisjZW5kaWYgLy8gUlQyODcwIC8vCisKKwl3bGFuXzgwMl8xMV90b184MDJfM19wYWNrZXQocEFkLCBwUnhCbGssIEhlYWRlcjgwMl8zLCBGcm9tV2hpY2hCU1NJRCk7CisKKwkvLworCS8vIHBhc3MgdGhpcyA4MDIuMyBwYWNrZXQgdG8gdXBwZXIgbGF5ZXIgb3IgZm9yd2FyZCB0aGlzIHBhY2tldCB0byBXTSBkaXJlY3RseQorCS8vCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJQU5OT1VOQ0VfT1JfRk9SV0FSRF84MDJfM19QQUNLRVQocEFkLCBwUnhQYWNrZXQsIEZyb21XaGljaEJTU0lEKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworfQorCisKKy8vIE5vcm1hbCwgQU1QRFUgb3IgQU1TRFUKK1ZPSUQgQ21tUnhub25SYWxpbmtGcmFtZUluZGljYXRlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVJYX0JMSwkJCSpwUnhCbGssCisJSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCkKK3sKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwlpZiAoUlhfQkxLX1RFU1RfRkxBRyhwUnhCbGssIGZSWF9BTVBEVSkgJiYgKHBBZC0+Q29tbW9uQ2ZnLmJEaXNhYmxlUmVvcmRlcmluZyA9PSAwKSkKKwl7CisJCUluZGljYXRlX0FNUERVX1BhY2tldChwQWQsIHBSeEJsaywgRnJvbVdoaWNoQlNTSUQpOworCX0KKwllbHNlCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJeworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQlpZiAoUlhfQkxLX1RFU1RfRkxBRyhwUnhCbGssIGZSWF9BTVNEVSkpCisJCXsKKwkJCS8vIGhhbmRsZSBBLU1TRFUKKwkJCUluZGljYXRlX0FNU0RVX1BhY2tldChwQWQsIHBSeEJsaywgRnJvbVdoaWNoQlNTSUQpOworCQl9CisJCWVsc2UKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJeworCQkJSW5kaWNhdGVfTGVnYWN5X1BhY2tldChwQWQsIHBSeEJsaywgRnJvbVdoaWNoQlNTSUQpOworCQl9CisJfQorfQorCisKK1ZPSUQgQ21tUnhSYWxpbmtGcmFtZUluZGljYXRlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCU1BQ19UQUJMRV9FTlRSWQkqcEVudHJ5LAorCUlOCVJYX0JMSwkJCSpwUnhCbGssCisJSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCkKK3sKKwlVQ0hBUgkJCUhlYWRlcjgwMl8zW0xFTkdUSF84MDJfM107CisJVUlOVDE2CQkJTXNkdTJTaXplOworCVVJTlQxNiAJCQlQYXlsb2FkMVNpemUsIFBheWxvYWQyU2l6ZTsKKwlQVUNIQVIgCQkJcERhdGEyOworCVBORElTX1BBQ0tFVAlwUGFja2V0MiA9IE5VTEw7CisKKworCisJTXNkdTJTaXplID0gKihwUnhCbGstPnBEYXRhKSArICgqKHBSeEJsay0+cERhdGErMSkgPDwgOCk7CisKKwlpZiAoKE1zZHUyU2l6ZSA8PSAxNTM2KSAmJiAoTXNkdTJTaXplIDwgcFJ4QmxrLT5EYXRhU2l6ZSkpCisJeworCQkvKiBza2lwIHR3byBieXRlIE1TRFUyIGxlbiAqLworCQlwUnhCbGstPnBEYXRhICs9IDI7CisJCXBSeEJsay0+RGF0YVNpemUgLT0gMjsKKwl9CisJZWxzZQorCXsKKwkJLy8gcmVsZWFzZSBwYWNrZXQKKwkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeEJsay0+cFJ4UGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJcmV0dXJuOworCX0KKworCS8vIGdldCA4MDIuMyBIZWFkZXIgYW5kICByZW1vdmUgTExDCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJUlRNUF84MDJfMTFfUkVNT1ZFX0xMQ19BTkRfQ09OVkVSVF9UT184MDJfMyhwUnhCbGssIEhlYWRlcjgwMl8zKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCisJQVNTRVJUKHBSeEJsay0+cFJ4UGFja2V0KTsKKworCS8vIFJhbGluayBBZ2dyZWdhdGlvbiBmcmFtZQorCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjUnhBZ2dyZWdhdGlvbkNvdW50ICsrOworCVBheWxvYWQxU2l6ZSA9IHBSeEJsay0+RGF0YVNpemUgLSBNc2R1MlNpemU7CisJUGF5bG9hZDJTaXplID0gTXNkdTJTaXplIC0gTEVOR1RIXzgwMl8zOworCisJcERhdGEyID0gcFJ4QmxrLT5wRGF0YSArIFBheWxvYWQxU2l6ZSArIExFTkdUSF84MDJfMzsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQlwUGFja2V0MiA9IGR1cGxpY2F0ZV9wa3QocEFkLCAocERhdGEyLUxFTkdUSF84MDJfMyksIExFTkdUSF84MDJfMywgcERhdGEyLCBQYXlsb2FkMlNpemUsIEZyb21XaGljaEJTU0lEKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCWlmICghcFBhY2tldDIpCisJeworCQkvLyByZWxlYXNlIHBhY2tldAorCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4QmxrLT5wUnhQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCQlyZXR1cm47CisJfQorCisJLy8gdXBkYXRlIHBheWxvYWQgc2l6ZSBvZiAxc3QgcGFja2V0CisJcFJ4QmxrLT5EYXRhU2l6ZSA9IFBheWxvYWQxU2l6ZTsKKwl3bGFuXzgwMl8xMV90b184MDJfM19wYWNrZXQocEFkLCBwUnhCbGssIEhlYWRlcjgwMl8zLCBGcm9tV2hpY2hCU1NJRCk7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQlBTk5PVU5DRV9PUl9GT1JXQVJEXzgwMl8zX1BBQ0tFVChwQWQsIHBSeEJsay0+cFJ4UGFja2V0LCBGcm9tV2hpY2hCU1NJRCk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlpZiAocFBhY2tldDIpCisJeworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQkJQU5OT1VOQ0VfT1JfRk9SV0FSRF84MDJfM19QQUNLRVQocEFkLCBwUGFja2V0MiwgRnJvbVdoaWNoQlNTSUQpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCX0KK30KKworCisjZGVmaW5lIFJFU0VUX0ZSQUdGUkFNRShfZnJhZ0ZyYW1lKSBcCisJewkJCQkJCQkJXAorCQlfZnJhZ0ZyYW1lLlJ4U2l6ZSA9IDA7CQlcCisJCV9mcmFnRnJhbWUuU2VxdWVuY2UgPSAwOwlcCisJCV9mcmFnRnJhbWUuTGFzdEZyYWcgPSAwOwlcCisJCV9mcmFnRnJhbWUuRmxhZ3MgPSAwOwkJXAorCX0KKworCitQTkRJU19QQUNLRVQgUlRNUERlRnJhZ21lbnREYXRhRnJhbWUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUlhfQkxLCQkJKnBSeEJsaykKK3sKKwlQSEVBREVSXzgwMl8xMQlwSGVhZGVyID0gcFJ4QmxrLT5wSGVhZGVyOworCVBORElTX1BBQ0tFVAlwUnhQYWNrZXQgPSBwUnhCbGstPnBSeFBhY2tldDsKKwlVQ0hBUgkJCSpwRGF0YSA9IHBSeEJsay0+cERhdGE7CisJVVNIT1JUCQkJRGF0YVNpemUgPSBwUnhCbGstPkRhdGFTaXplOworCVBORElTX1BBQ0tFVAlwUmV0UGFja2V0ID0gTlVMTDsKKwlVQ0hBUgkJCSpwRnJhZ0J1ZmZlciA9IE5VTEw7CisJQk9PTEVBTiAJCWJSZWFzc0RvbmUgPSBGQUxTRTsKKwlVQ0hBUgkJCUhlYWRlclJvb20gPSAwOworCisKKwlBU1NFUlQocEhlYWRlcik7CisKKwlIZWFkZXJSb29tID0gcERhdGEgLSAoVUNIQVIgKilwSGVhZGVyOworCisJLy8gUmUtYXNzZW1ibGUgdGhlIGZyYWdtZW50ZWQgcGFja2V0cworCWlmIChwSGVhZGVyLT5GcmFnID09IDApCQkvLyBGcmFnLiBOdW1iZXIgaXMgMCA6IEZpcnN0IGZyYWcgb3Igb25seSBvbmUgcGt0CisJeworCQkvLyB0aGUgZmlyc3QgcGt0IG9mIGZyYWdtZW50LCByZWNvcmQgaXQuCisJCWlmIChwSGVhZGVyLT5GQy5Nb3JlRnJhZykKKwkJeworCQkJQVNTRVJUKHBBZC0+RnJhZ0ZyYW1lLnBGcmFnUGFja2V0KTsKKwkJCXBGcmFnQnVmZmVyID0gR0VUX09TX1BLVF9EQVRBUFRSKHBBZC0+RnJhZ0ZyYW1lLnBGcmFnUGFja2V0KTsKKwkJCXBBZC0+RnJhZ0ZyYW1lLlJ4U2l6ZSAgID0gRGF0YVNpemUgKyBIZWFkZXJSb29tOworCQkJTmRpc01vdmVNZW1vcnkocEZyYWdCdWZmZXIsCSBwSGVhZGVyLCBwQWQtPkZyYWdGcmFtZS5SeFNpemUpOworCQkJcEFkLT5GcmFnRnJhbWUuU2VxdWVuY2UgPSBwSGVhZGVyLT5TZXF1ZW5jZTsKKwkJCXBBZC0+RnJhZ0ZyYW1lLkxhc3RGcmFnID0gcEhlYWRlci0+RnJhZzsJICAgLy8gU2hvdWxkIGJlIDAKKwkJCUFTU0VSVChwQWQtPkZyYWdGcmFtZS5MYXN0RnJhZyA9PSAwKTsKKwkJCWdvdG8gZG9uZTsJLy8gZW5kIG9mIHByb2Nlc3NpbmcgdGhpcyBmcmFtZQorCQl9CisJfQorCWVsc2UJLy9NaWRkbGUgJiBFbmQgb2YgZnJhZ21lbnQKKwl7CisJCWlmICgocEhlYWRlci0+U2VxdWVuY2UgIT0gcEFkLT5GcmFnRnJhbWUuU2VxdWVuY2UpIHx8CisJCQkocEhlYWRlci0+RnJhZyAhPSAocEFkLT5GcmFnRnJhbWUuTGFzdEZyYWcgKyAxKSkpCisJCXsKKwkJCS8vIEZyYWdtZW50IGlzIG5vdCB0aGUgc2FtZSBzZXF1ZW5jZSBvciBvdXQgb2YgZnJhZ21lbnQgbnVtYmVyIG9yZGVyCisJCQkvLyBSZXNldCBGcmFnbWVudCBjb250cm9sIGJsaworCQkJUkVTRVRfRlJBR0ZSQU1FKHBBZC0+RnJhZ0ZyYW1lKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkZyYWdtZW50IGlzIG5vdCB0aGUgc2FtZSBzZXF1ZW5jZSBvciBvdXQgb2YgZnJhZ21lbnQgbnVtYmVyIG9yZGVyLlxuIikpOworCQkJZ290byBkb25lOyAvLyBnaXZlIHVwIHRoaXMgZnJhbWUKKwkJfQorCQllbHNlIGlmICgocEFkLT5GcmFnRnJhbWUuUnhTaXplICsgRGF0YVNpemUpID4gTUFYX0ZSQU1FX1NJWkUpCisJCXsKKwkJCS8vIEZyYWdtZW50IGZyYW1lIGlzIHRvbyBsYXJnZSwgaXQgZXhlZWRzIHRoZSBtYXhpbXVtIGZyYW1lIHNpemUuCisJCQkvLyBSZXNldCBGcmFnbWVudCBjb250cm9sIGJsaworCQkJUkVTRVRfRlJBR0ZSQU1FKHBBZC0+RnJhZ0ZyYW1lKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkZyYWdtZW50IGZyYW1lIGlzIHRvbyBsYXJnZSwgaXQgZXhlZWRzIHRoZSBtYXhpbXVtIGZyYW1lIHNpemUuXG4iKSk7CisJCQlnb3RvIGRvbmU7IC8vIGdpdmUgdXAgdGhpcyBmcmFtZQorCQl9CisKKyAgICAgICAgLy8KKwkJLy8gQnJvYWRjb20gQVAoQkNNOTQ3MDRBR1IpIHdpbGwgc2VuZCBvdXQgTExDIGluIGZyYWdtZW50J3MgcGFja2V0LCBMTEMgb25seSBjYW4gYWNjcGV0IGF0IGZpcnN0IGZyYWdtZW50LgorCQkvLyBJbiB0aGlzIGNhc2UsIHdlIHdpbGwgZHJvcHQgaXQuCisJCS8vCisJCWlmIChOZGlzRXF1YWxNZW1vcnkocERhdGEsIFNOQVBfODAyXzFILCBzaXplb2YoU05BUF84MDJfMUgpKSkKKwkJeworCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiRmluZCBhbm90aGVyIExMQyBhdCBNaWRkbGUgb3IgRW5kIGZyYWdtZW50KFNOPSVkLCBGcmFnPSVkKVxuIiwgcEhlYWRlci0+U2VxdWVuY2UsIHBIZWFkZXItPkZyYWcpKTsKKwkJCWdvdG8gZG9uZTsgLy8gZ2l2ZSB1cCB0aGlzIGZyYW1lCisJCX0KKworCQlwRnJhZ0J1ZmZlciA9IEdFVF9PU19QS1RfREFUQVBUUihwQWQtPkZyYWdGcmFtZS5wRnJhZ1BhY2tldCk7CisKKwkJLy8gY29uY2F0ZW5hdGUgdGhpcyBmcmFnbWVudCBpbnRvIHRoZSByZS1hc3NlbWJseSBidWZmZXIKKwkJTmRpc01vdmVNZW1vcnkoKHBGcmFnQnVmZmVyICsgcEFkLT5GcmFnRnJhbWUuUnhTaXplKSwgcERhdGEsIERhdGFTaXplKTsKKwkJcEFkLT5GcmFnRnJhbWUuUnhTaXplICArPSBEYXRhU2l6ZTsKKwkJcEFkLT5GcmFnRnJhbWUuTGFzdEZyYWcgPSBwSGVhZGVyLT5GcmFnOwkgICAvLyBVcGRhdGUgZnJhZ21lbnQgbnVtYmVyCisKKwkJLy8gTGFzdCBmcmFnbWVudAorCQlpZiAocEhlYWRlci0+RkMuTW9yZUZyYWcgPT0gRkFMU0UpCisJCXsKKwkJCWJSZWFzc0RvbmUgPSBUUlVFOworCQl9CisJfQorCitkb25lOgorCS8vIGFsd2F5cyByZWxlYXNlIHJ4IGZyYWdtZW50ZWQgcGFja2V0CisJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisKKwkvLyByZXR1cm4gZGVmcmFnbWVudGVkIHBhY2tldCBpZiBwYWNrZXQgaXMgcmVhc3NlbWJsZWQgY29tcGxldGVseQorCS8vIG90aGVyd2lzZSByZXR1cm4gTlVMTAorCWlmIChiUmVhc3NEb25lKQorCXsKKwkJUE5ESVNfUEFDS0VUIHBOZXdGcmFnUGFja2V0OworCisJCS8vIGFsbG9jYXRlIGEgbmV3IHBhY2tldCBidWZmZXIgZm9yIGZyYWdtZW50CisJCXBOZXdGcmFnUGFja2V0ID0gUlRNUF9BbGxvY2F0ZUZyYWdQYWNrZXRCdWZmZXIocEFkLCBSWF9CVUZGRVJfTk9STVNJWkUpOworCQlpZiAocE5ld0ZyYWdQYWNrZXQpCisJCXsKKwkJCS8vIHVwZGF0ZSBSeEJsaworCQkJcFJldFBhY2tldCA9IHBBZC0+RnJhZ0ZyYW1lLnBGcmFnUGFja2V0OworCQkJcEFkLT5GcmFnRnJhbWUucEZyYWdQYWNrZXQgPSBwTmV3RnJhZ1BhY2tldDsKKwkJCXBSeEJsay0+cEhlYWRlciA9IChQSEVBREVSXzgwMl8xMSkgR0VUX09TX1BLVF9EQVRBUFRSKHBSZXRQYWNrZXQpOworCQkJcFJ4QmxrLT5wRGF0YSA9IChVQ0hBUiAqKXBSeEJsay0+cEhlYWRlciArIEhlYWRlclJvb207CisJCQlwUnhCbGstPkRhdGFTaXplID0gcEFkLT5GcmFnRnJhbWUuUnhTaXplIC0gSGVhZGVyUm9vbTsKKwkJCXBSeEJsay0+cFJ4UGFja2V0ID0gcFJldFBhY2tldDsKKwkJfQorCQllbHNlCisJCXsKKwkJCVJFU0VUX0ZSQUdGUkFNRShwQWQtPkZyYWdGcmFtZSk7CisJCX0KKwl9CisKKwlyZXR1cm4gcFJldFBhY2tldDsKK30KKworCitWT0lEIEluZGljYXRlX0FNU0RVX1BhY2tldCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglSWF9CTEsJCQkqcFJ4QmxrLAorCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpCit7CisJVUlOVAkJCW5NU0RVOworCisJdXBkYXRlX29zX3BhY2tldF9pbmZvKHBBZCwgcFJ4QmxrLCBGcm9tV2hpY2hCU1NJRCk7CisJUlRNUF9TRVRfUEFDS0VUX0lGKHBSeEJsay0+cFJ4UGFja2V0LCBGcm9tV2hpY2hCU1NJRCk7CisJbk1TRFUgPSBkZWFnZ3JlZ2F0ZV9BTVNEVV9hbm5vdW5jZShwQWQsIHBSeEJsay0+cFJ4UGFja2V0LCBwUnhCbGstPnBEYXRhLCBwUnhCbGstPkRhdGFTaXplKTsKK30KKworVk9JRCBJbmRpY2F0ZV9FQVBPTF9QYWNrZXQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUlhfQkxLCQkJKnBSeEJsaywKKwlJTglVQ0hBUgkJCUZyb21XaGljaEJTU0lEKQoreworCU1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5ID0gTlVMTDsKKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwl7CisJCXBFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdOworCQlTVEFSeEVBUE9MRnJhbWVJbmRpY2F0ZShwQWQsIHBFbnRyeSwgcFJ4QmxrLCBGcm9tV2hpY2hCU1NJRCk7CisJCXJldHVybjsKKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlpZiAocEVudHJ5ID09IE5VTEwpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19XQVJOLCAoIkluZGljYXRlX0VBUE9MX1BhY2tldDogZHJvcCBhbmQgcmVsZWFzZSB0aGUgaW52YWxpZCBwYWNrZXQuXG4iKSk7CisJCS8vIHJlbGVhc2UgcGFja2V0CisJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhCbGstPnBSeFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCXJldHVybjsKKwl9Cit9CisKKyNkZWZpbmUgQkNOX1RCVFRfT0ZGU0VUCQk2NAkvL2RlZmVyIDY0IHVzCitWT0lEIFJlU3luY0JlYWNvblRpbWUoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpCit7CisKKwlVSU5UMzIgIE9mZnNldDsKKworCisJT2Zmc2V0ID0gKHBBZC0+VGJ0dFRpY2tDb3VudCkgJSAoQkNOX1RCVFRfT0ZGU0VUKTsKKworCXBBZC0+VGJ0dFRpY2tDb3VudCsrOworCisJLy8KKwkvLyBUaGUgdXBkYXRlZCBCZWFjb25JbnRlcnZhbCBWYWx1ZSB3aWxsIGFmZmVjdCBCZWFjb24gSW50ZXJ2YWwgYWZ0ZXIgdHdvIFRCVFQKKwkvLyBiZWFjYXN1ZSB0aGUgb3JpZ2luYWwgQmVhY29uSW50ZXJ2YWwgaGFkIGJlZW4gbG9hZGVkIGludG8gbmV4dCBUQlRUX1RJTUVSCisJLy8KKwlpZiAoT2Zmc2V0ID09IChCQ05fVEJUVF9PRkZTRVQtMikpCisJeworCQlCQ05fVElNRV9DRkdfU1RSVUMgY3NyOworCQlSVE1QX0lPX1JFQUQzMihwQWQsIEJDTl9USU1FX0NGRywgJmNzci53b3JkKTsKKwkJY3NyLmZpZWxkLkJlYWNvbkludGVydmFsID0gKHBBZC0+Q29tbW9uQ2ZnLkJlYWNvblBlcmlvZCA8PCA0KSAtIDEgOwkvLyBBU0lDIHJlZ2lzdGVyIGluIHVuaXRzIG9mIDEvMTYgVFUgPSA2NHVzCisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIEJDTl9USU1FX0NGRywgY3NyLndvcmQpOworCX0KKwllbHNlCisJeworCQlpZiAoT2Zmc2V0ID09IChCQ05fVEJUVF9PRkZTRVQtMSkpCisJCXsKKwkJCUJDTl9USU1FX0NGR19TVFJVQyBjc3I7CisKKwkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgQkNOX1RJTUVfQ0ZHLCAmY3NyLndvcmQpOworCQkJY3NyLmZpZWxkLkJlYWNvbkludGVydmFsID0gKHBBZC0+Q29tbW9uQ2ZnLkJlYWNvblBlcmlvZCkgPDwgNDsgLy8gQVNJQyByZWdpc3RlciBpbiB1bml0cyBvZiAxLzE2IFRVCisJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBCQ05fVElNRV9DRkcsIGNzci53b3JkKTsKKwkJfQorCX0KK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vY21tX2RhdGFfMjg3MC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vY21tX2RhdGFfMjg3MC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3NzAwMGYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9jbW1fZGF0YV8yODcwLmMKQEAgLTAsMCArMSw5NjMgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KKy8qCisgICBBbGwgZnVuY3Rpb25zIGluIHRoaXMgZmlsZSBtdXN0IGJlIFVTQi1kZXBlbmRlZCwgb3IgeW91IHNob3VsZCBvdXQgeW91ciBmdW5jdGlvbgorCWluIG90aGVyIGZpbGVzLgorCisqLworI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgorCisKKy8qCisJV2UgY2FuIGRvIGNvcHkgdGhlIGZyYW1lIGludG8gcFR4Q29udGV4dCB3aGVuIG1hdGNoIGZvbGxvd2luZyBjb25kaXRpb25zLgorCQk9PgorCQk9PgorCQk9PgorKi8KK3N0YXRpYyBpbmxpbmUgTkRJU19TVEFUVVMgUnRtcFVTQkNhbkRvV3JpdGUoCisJSU4gUlRNUF9BREFQVEVSCQkqcEFkLAorCUlOIFVDSEFSCQkJUXVlSWR4LAorCUlOIEhUX1RYX0NPTlRFWFQgCSpwSFRUWENvbnRleHQpCit7CisJTkRJU19TVEFUVVMJY2FuV3JpdGUgPSBORElTX1NUQVRVU19SRVNPVVJDRVM7CisKKwlpZiAoKChwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24pIDwgcEhUVFhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uKSAmJiAocEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uICsgTE9DQUxfVFhCVUZfU0laRSkgPiBwSFRUWENvbnRleHQtPk5leHRCdWxrT3V0UG9zaXRpb24pCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIlJ0bXBVU0JDYW5Eb1dyaXRlIGMxIVxuIikpOworCQlSVFVTQl9TRVRfQlVMS19GTEFHKHBBZCwgKGZSVFVTQl9CVUxLX09VVF9EQVRBX05PUk1BTCA8PCBRdWVJZHgpKTsKKwl9CisJZWxzZSBpZiAoKHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiA9PSA4KSAmJiAocEhUVFhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uIDwgTE9DQUxfVFhCVUZfU0laRSkpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIlJ0bXBVU0JDYW5Eb1dyaXRlIGMyIVxuIikpOworCQlSVFVTQl9TRVRfQlVMS19GTEFHKHBBZCwgKGZSVFVTQl9CVUxLX09VVF9EQVRBX05PUk1BTCA8PCBRdWVJZHgpKTsKKwl9CisJZWxzZSBpZiAocEhUVFhDb250ZXh0LT5iQ3VyV3JpdGluZyA9PSBUUlVFKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJSdG1wVVNCQ2FuRG9Xcml0ZSBjMyFcbiIpKTsKKwl9CisJZWxzZQorCXsKKwkJY2FuV3JpdGUgPSBORElTX1NUQVRVU19TVUNDRVNTOworCX0KKworCisJcmV0dXJuIGNhbldyaXRlOworfQorCisKK1VTSE9SVCBSdG1wVVNCX1dyaXRlU3ViVHhSZXNvdXJjZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglUWF9CTEsJCQkqcFR4QmxrLAorCUlOCUJPT0xFQU4JCQliSXNMYXN0LAorCU9VVAlVU0hPUlQJCQkqRnJlZU51bWJlcikKK3sKKworCS8vIER1bW15IGZ1bmN0aW9uLiBTaG91bGQgYmUgcmVtb3ZlZCBpbiB0aGUgZnV0dXJlLgorCXJldHVybiAwOworCit9CisKK1VTSE9SVAlSdG1wVVNCX1dyaXRlRnJhZ1R4UmVzb3VyY2UoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVFhfQkxLCQkJKnBUeEJsaywKKwlJTglVQ0hBUgkJCWZyYWdOdW0sCisJT1VUCVVTSE9SVAkJCSpGcmVlTnVtYmVyKQoreworCUhUX1RYX0NPTlRFWFQJKnBIVFRYQ29udGV4dDsKKwlVU0hPUlQJCQlod0hkckxlbjsJLy8gVGhlIGh3SGRyTGVuIGNvbnNpc3Qgb2YgODAyLjExIGhlYWRlciBsZW5ndGggcGx1cyB0aGUgaGVhZGVyIHBhZGRpbmcgbGVuZ3RoLgorCVVJTlQzMgkJCWZpbGxPZmZzZXQ7CisJVFhJTkZPX1NUUlVDCSpwVHhJbmZvOworCVRYV0lfU1RSVUMJCSpwVHhXSTsKKwlQVUNIQVIJCQlwV2lyZWxlc3NQYWNrZXQgPSBOVUxMOworCVVDSEFSCQkJUXVlSWR4OworCU5ESVNfU1RBVFVTCQlTdGF0dXM7CisJdW5zaWduZWQgbG9uZwlJcnFGbGFnczsKKwlVSU5UMzIJCQlVU0JETUFwa3RMZW4gPSAwLCBETUFIZHJMZW4sIHBhZGRpbmc7CisJQk9PTEVBTgkJCVR4UUxhc3RSb3VuZCA9IEZBTFNFOworCisJLy8KKwkvLyBnZXQgVHggUmluZyBSZXNvdXJjZSAmIERtYSBCdWZmZXIgYWRkcmVzcworCS8vCisJUXVlSWR4ID0gcFR4QmxrLT5RdWVJZHg7CisJcEhUVFhDb250ZXh0ICA9ICZwQWQtPlR4Q29udGV4dFtRdWVJZHhdOworCisJUlRNUF9JUlFfTE9DSygmcEFkLT5UeENvbnRleHRRdWV1ZUxvY2tbUXVlSWR4XSwgSXJxRmxhZ3MpOworCisJcEhUVFhDb250ZXh0ICA9ICZwQWQtPlR4Q29udGV4dFtRdWVJZHhdOworCWZpbGxPZmZzZXQgPSBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb247CisKKwlpZihmcmFnTnVtID09IDApCisJeworCQkvLyBDaGVjayBpZiB3ZSBoYXZlIGVub3VnaCBzcGFjZSBmb3IgdGhpcyBidWxrLW91dCBiYXRjaC4KKwkJU3RhdHVzID0gUnRtcFVTQkNhbkRvV3JpdGUocEFkLCBRdWVJZHgsIHBIVFRYQ29udGV4dCk7CisJCWlmIChTdGF0dXMgPT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJeworCQkJcEhUVFhDb250ZXh0LT5iQ3VyV3JpdGluZyA9IFRSVUU7CisKKwkJCS8vIFJlc2VydmUgc3BhY2UgZm9yIDggYnl0ZXMgcGFkZGluZy4KKwkJCWlmICgocEhUVFhDb250ZXh0LT5FTmV4dEJ1bGtPdXRQb3NpdGlvbiA9PSBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24pKQorCQkJeworCQkJCXBIVFRYQ29udGV4dC0+RU5leHRCdWxrT3V0UG9zaXRpb24gKz0gODsKKwkJCQlwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gKz0gODsKKwkJCQlmaWxsT2Zmc2V0ICs9IDg7CisJCQl9CisJCQlwVHhCbGstPlByaXYgPSAwOworCQkJcEhUVFhDb250ZXh0LT5DdXJXcml0ZVJlYWxQb3MgPSBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb247CisJCX0KKwkJZWxzZQorCQl7CisJCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+VHhDb250ZXh0UXVldWVMb2NrW1F1ZUlkeF0sIElycUZsYWdzKTsKKworCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBUeEJsay0+cFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCQlyZXR1cm4oU3RhdHVzKTsKKwkJfQorCX0KKwllbHNlCisJeworCQkvLyBGb3Igc3ViLXNlcXVlbnQgZnJhbWVzIG9mIHRoaXMgYnVsay1vdXQgYmF0Y2guIEp1c3QgY29weSBpdCB0byBvdXIgYnVsay1vdXQgYnVmZmVyLgorCQlTdGF0dXMgPSAoKHBIVFRYQ29udGV4dC0+YkN1cldyaXRpbmcgPT0gVFJVRSkgPyBORElTX1NUQVRVU19TVUNDRVNTIDogTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCWlmIChTdGF0dXMgPT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJeworCQkJZmlsbE9mZnNldCArPSBwVHhCbGstPlByaXY7CisJCX0KKwkJZWxzZQorCQl7CisJCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+VHhDb250ZXh0UXVldWVMb2NrW1F1ZUlkeF0sIElycUZsYWdzKTsKKworCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBUeEJsay0+cFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCQlyZXR1cm4oU3RhdHVzKTsKKwkJfQorCX0KKworCU5kaXNaZXJvTWVtb3J5KChQVUNIQVIpKCZwVHhCbGstPkhlYWRlckJ1ZlswXSksIFRYSU5GT19TSVpFKTsKKwlwVHhJbmZvID0gKFBUWElORk9fU1RSVUMpKCZwVHhCbGstPkhlYWRlckJ1ZlswXSk7CisJcFR4V0k9IChQVFhXSV9TVFJVQykoJnBUeEJsay0+SGVhZGVyQnVmW1RYSU5GT19TSVpFXSk7CisKKwlwV2lyZWxlc3NQYWNrZXQgPSAmcEhUVFhDb250ZXh0LT5UcmFuc2ZlckJ1ZmZlci0+ZmllbGQuV2lyZWxlc3NQYWNrZXRbZmlsbE9mZnNldF07CisKKwkvLyBjb3B5IFRYV0kgKyBXTEFOIEhlYWRlciArIExMQyBpbnRvIERNQSBIZWFkZXIgQnVmZmVyCisJLy9od0hkckxlbiA9IFJPVU5EX1VQKHBUeEJsay0+TXBkdUhlYWRlckxlbiwgNCk7CisJaHdIZHJMZW4gPSBwVHhCbGstPk1wZHVIZWFkZXJMZW4gKyBwVHhCbGstPkhkclBhZExlbjsKKworCS8vIEJ1aWxkIG91ciBVUkIgZm9yIFVTQkQKKwlETUFIZHJMZW4gPSBUWFdJX1NJWkUgKyBod0hkckxlbjsKKwlVU0JETUFwa3RMZW4gPSBETUFIZHJMZW4gKyBwVHhCbGstPlNyY0J1ZkxlbjsKKwlwYWRkaW5nID0gKDQgLSAoVVNCRE1BcGt0TGVuICUgNCkpICYgMHgwMzsJLy8gcm91bmQgdXAgdG8gNCBieXRlIGFsaWdubWVudAorCVVTQkRNQXBrdExlbiArPSBwYWRkaW5nOworCisJcFR4QmxrLT5Qcml2ICs9IChUWElORk9fU0laRSArIFVTQkRNQXBrdExlbik7CisKKwkvLyBGb3IgVHhJbmZvLCB0aGUgbGVuZ3RoIG9mIFVTQkRNQXBrdExlbiA9IFRYV0lfU0laRSArIDgwMi4xMSBoZWFkZXIgKyBwYXlsb2FkCisJUlRNUFdyaXRlVHhJbmZvKHBBZCwgcFR4SW5mbywgKFVTSE9SVCkoVVNCRE1BcGt0TGVuKSwgRkFMU0UsIEZJRk9fRURDQSwgRkFMU0UgLypOZXh0VmFsaWQqLywgIEZBTFNFKTsKKworCWlmIChmcmFnTnVtID09IHBUeEJsay0+VG90YWxGcmFnTnVtKQorCXsKKwkJcFR4SW5mby0+VVNCRE1BVHhidXJzdCA9IDA7CisJCWlmICgocEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uICsgcFR4QmxrLT5Qcml2ICsgMzkwNik+IE1BWF9UWEJVTEtfTElNSVQpCisJCXsKKwkJCXBUeEluZm8tPlN3VXNlTGFzdFJvdW5kID0gMTsKKwkJCVR4UUxhc3RSb3VuZCA9IFRSVUU7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJcFR4SW5mby0+VVNCRE1BVHhidXJzdCA9IDE7CisJfQorCisJTmRpc01vdmVNZW1vcnkocFdpcmVsZXNzUGFja2V0LCBwVHhCbGstPkhlYWRlckJ1ZiwgVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkUgKyBod0hkckxlbik7CisjaWZkZWYgUlRfQklHX0VORElBTgorCVJUTVBGcmFtZUVuZGlhbkNoYW5nZShwQWQsIChQVUNIQVIpKHBXaXJlbGVzc1BhY2tldCArIFRYSU5GT19TSVpFICsgVFhXSV9TSVpFKSwgRElSX1dSSVRFLCBGQUxTRSk7CisjZW5kaWYgLy8gUlRfQklHX0VORElBTiAvLworCXBXaXJlbGVzc1BhY2tldCArPSAoVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkUgKyBod0hkckxlbik7CisJcEhUVFhDb250ZXh0LT5DdXJXcml0ZVJlYWxQb3MgKz0gKFRYSU5GT19TSVpFICsgVFhXSV9TSVpFICsgaHdIZHJMZW4pOworCisJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPlR4Q29udGV4dFF1ZXVlTG9ja1tRdWVJZHhdLCBJcnFGbGFncyk7CisKKwlOZGlzTW92ZU1lbW9yeShwV2lyZWxlc3NQYWNrZXQsIHBUeEJsay0+cFNyY0J1ZkRhdGEsIHBUeEJsay0+U3JjQnVmTGVuKTsKKworCS8vCVplcm8gdGhlIGxhc3QgcGFkZGluZy4KKwlwV2lyZWxlc3NQYWNrZXQgKz0gcFR4QmxrLT5TcmNCdWZMZW47CisJTmRpc1plcm9NZW1vcnkocFdpcmVsZXNzUGFja2V0LCBwYWRkaW5nICsgOCk7CisKKwlpZiAoZnJhZ051bSA9PSBwVHhCbGstPlRvdGFsRnJhZ051bSkKKwl7CisJCVJUTVBfSVJRX0xPQ0soJnBBZC0+VHhDb250ZXh0UXVldWVMb2NrW1F1ZUlkeF0sIElycUZsYWdzKTsKKworCQkvLyBVcGRhdGUgdGhlIHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbi4gMzkwNiB1c2VkIHRvIHByZXZlbnQgdGhlIE5leHRCdWxrT3V0IGlzIGEgQS1SQUxJTksvQS1NU0RVIEZyYW1lLgorCQlwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gKz0gcFR4QmxrLT5Qcml2OworCQlpZiAoVHhRTGFzdFJvdW5kID09IFRSVUUpCisJCQlwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gPSA4OworCQlwSFRUWENvbnRleHQtPkN1cldyaXRlUmVhbFBvcyA9IHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbjsKKworCisJCS8vIEZpbmFsbHksIHNldCBiQ3VyV3JpdGluZyBhcyBGQUxTRQorCXBIVFRYQ29udGV4dC0+YkN1cldyaXRpbmcgPSBGQUxTRTsKKworCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+VHhDb250ZXh0UXVldWVMb2NrW1F1ZUlkeF0sIElycUZsYWdzKTsKKworCQkvLyBzdWNjZWVkIGFuZCByZWxlYXNlIHRoZSBza2IgYnVmZmVyCisJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwVHhCbGstPnBQYWNrZXQsIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOworCX0KKworCisJcmV0dXJuKFN0YXR1cyk7CisKK30KKworCitVU0hPUlQgUnRtcFVTQl9Xcml0ZVNpbmdsZVR4UmVzb3VyY2UoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVFhfQkxLCQkJKnBUeEJsaywKKwlJTglCT09MRUFOCQkJYklzTGFzdCwKKwlPVVQJVVNIT1JUCQkJKkZyZWVOdW1iZXIpCit7CisJSFRfVFhfQ09OVEVYVAkqcEhUVFhDb250ZXh0OworCVVTSE9SVAkJCWh3SGRyTGVuOworCVVJTlQzMgkJCWZpbGxPZmZzZXQ7CisJVFhJTkZPX1NUUlVDCSpwVHhJbmZvOworCVRYV0lfU1RSVUMJCSpwVHhXSTsKKwlQVUNIQVIJCQlwV2lyZWxlc3NQYWNrZXQ7CisJVUNIQVIJCQlRdWVJZHg7CisJdW5zaWduZWQgbG9uZwlJcnFGbGFnczsKKwlORElTX1NUQVRVUwkJU3RhdHVzOworCVVJTlQzMgkJCVVTQkRNQXBrdExlbiA9IDAsIERNQUhkckxlbiwgcGFkZGluZzsKKwlCT09MRUFOCQkJYlR4UUxhc3RSb3VuZCA9IEZBTFNFOworCisJLy8gRm9yIFVTQiwgZGlkbid0IG5lZWQgUENJX01BUF9TSU5HTEUoKQorCS8vU3JjQnVmUEEgPSBQQ0lfTUFQX1NJTkdMRShwQWQsIChjaGFyICopIHBUeEJsay0+cFNyY0J1ZkRhdGEsIHBUeEJsay0+U3JjQnVmTGVuLCBQQ0lfRE1BX1RPREVWSUNFKTsKKworCisJLy8KKwkvLyBnZXQgVHggUmluZyBSZXNvdXJjZSAmIERtYSBCdWZmZXIgYWRkcmVzcworCS8vCisJUXVlSWR4ID0gcFR4QmxrLT5RdWVJZHg7CisKKwlSVE1QX0lSUV9MT0NLKCZwQWQtPlR4Q29udGV4dFF1ZXVlTG9ja1tRdWVJZHhdLCBJcnFGbGFncyk7CisJcEhUVFhDb250ZXh0ICA9ICZwQWQtPlR4Q29udGV4dFtRdWVJZHhdOworCWZpbGxPZmZzZXQgPSBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb247CisKKworCisJLy8gQ2hlY2sgcmluZyBmdWxsLgorCVN0YXR1cyA9IFJ0bXBVU0JDYW5Eb1dyaXRlKHBBZCwgUXVlSWR4LCBwSFRUWENvbnRleHQpOworCWlmKFN0YXR1cyA9PSBORElTX1NUQVRVU19TVUNDRVNTKQorCXsKKwkJcEhUVFhDb250ZXh0LT5iQ3VyV3JpdGluZyA9IFRSVUU7CisKKwkJcFR4SW5mbyA9IChQVFhJTkZPX1NUUlVDKSgmcFR4QmxrLT5IZWFkZXJCdWZbMF0pOworCQlwVHhXST0gKFBUWFdJX1NUUlVDKSgmcFR4QmxrLT5IZWFkZXJCdWZbVFhJTkZPX1NJWkVdKTsKKworCQkvLyBSZXNlcnZlIHNwYWNlIGZvciA4IGJ5dGVzIHBhZGRpbmcuCisJCWlmICgocEhUVFhDb250ZXh0LT5FTmV4dEJ1bGtPdXRQb3NpdGlvbiA9PSBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24pKQorCQl7CisJCQlwSFRUWENvbnRleHQtPkVOZXh0QnVsa091dFBvc2l0aW9uICs9IDg7CisJCQlwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gKz0gODsKKwkJCWZpbGxPZmZzZXQgKz0gODsKKwkJfQorCQlwSFRUWENvbnRleHQtPkN1cldyaXRlUmVhbFBvcyA9IHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbjsKKworCQlwV2lyZWxlc3NQYWNrZXQgPSAmcEhUVFhDb250ZXh0LT5UcmFuc2ZlckJ1ZmZlci0+ZmllbGQuV2lyZWxlc3NQYWNrZXRbZmlsbE9mZnNldF07CisKKwkJLy8gY29weSBUWFdJICsgV0xBTiBIZWFkZXIgKyBMTEMgaW50byBETUEgSGVhZGVyIEJ1ZmZlcgorCQkvL2h3SGRyTGVuID0gUk9VTkRfVVAocFR4QmxrLT5NcGR1SGVhZGVyTGVuLCA0KTsKKwkJaHdIZHJMZW4gPSBwVHhCbGstPk1wZHVIZWFkZXJMZW4gKyBwVHhCbGstPkhkclBhZExlbjsKKworCQkvLyBCdWlsZCBvdXIgVVJCIGZvciBVU0JECisJCURNQUhkckxlbiA9IFRYV0lfU0laRSArIGh3SGRyTGVuOworCQlVU0JETUFwa3RMZW4gPSBETUFIZHJMZW4gKyBwVHhCbGstPlNyY0J1ZkxlbjsKKwkJcGFkZGluZyA9ICg0IC0gKFVTQkRNQXBrdExlbiAlIDQpKSAmIDB4MDM7CS8vIHJvdW5kIHVwIHRvIDQgYnl0ZSBhbGlnbm1lbnQKKwkJVVNCRE1BcGt0TGVuICs9IHBhZGRpbmc7CisKKwkJcFR4QmxrLT5Qcml2ID0gKFRYSU5GT19TSVpFICsgVVNCRE1BcGt0TGVuKTsKKworCQkvLyBGb3IgVHhJbmZvLCB0aGUgbGVuZ3RoIG9mIFVTQkRNQXBrdExlbiA9IFRYV0lfU0laRSArIDgwMi4xMSBoZWFkZXIgKyBwYXlsb2FkCisJCVJUTVBXcml0ZVR4SW5mbyhwQWQsIHBUeEluZm8sIChVU0hPUlQpKFVTQkRNQXBrdExlbiksIEZBTFNFLCBGSUZPX0VEQ0EsIEZBTFNFIC8qTmV4dFZhbGlkKi8sICBGQUxTRSk7CisKKwkJaWYgKChwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gKyAzOTA2ICsgcFR4QmxrLT5Qcml2KSA+IE1BWF9UWEJVTEtfTElNSVQpCisJCXsKKwkJCXBUeEluZm8tPlN3VXNlTGFzdFJvdW5kID0gMTsKKwkJCWJUeFFMYXN0Um91bmQgPSBUUlVFOworCQl9CisJCU5kaXNNb3ZlTWVtb3J5KHBXaXJlbGVzc1BhY2tldCwgcFR4QmxrLT5IZWFkZXJCdWYsIFRYSU5GT19TSVpFICsgVFhXSV9TSVpFICsgaHdIZHJMZW4pOworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwkJUlRNUEZyYW1lRW5kaWFuQ2hhbmdlKHBBZCwgKFBVQ0hBUikocFdpcmVsZXNzUGFja2V0ICsgVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkUpLCBESVJfV1JJVEUsIEZBTFNFKTsKKyNlbmRpZiAvLyBSVF9CSUdfRU5ESUFOIC8vCisJCXBXaXJlbGVzc1BhY2tldCArPSAoVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkUgKyBod0hkckxlbik7CisKKwkJLy8gV2UgdW5sb2NrIGl0IGhlcmUgdG8gcHJldmVudCB0aGUgZmlyc3QgOCBieXRlcyBtYXliZSBvdmVyLXdyaXRlZCBpc3N1ZS4KKwkJLy8JMS4gRmlyc3Qgd2UgZ290IEN1cldyaXRlUG9zaXRpb24gYnV0IHRoZSBmaXJzdCA4IGJ5dGVzIHN0aWxsIG5vdCB3cml0ZSB0byB0aGUgcFR4Y29udGV4dC4KKwkJLy8JMi4gQW4gaW50ZXJydXB0IGJyZWFrIG91ciByb3V0aW5lIGFuZCBoYW5kbGUgYnVsay1vdXQgY29tcGxldGUuCisJCS8vCTMuIEluIHRoZSBidWxrLW91dCBjb21wbGxldGUsIGl0IG5lZWQgdG8gZG8gYW5vdGhlciBidWxrLW91dCwKKwkJLy8JCQlpZiB0aGUgRU5leHRCdWxrT3V0UG9zaXRpb24gaXMganVzdCB0aGUgc2FtZSBhcyBDdXJXcml0ZVBvc2l0aW9uLCBpdCB3aWxsIHNhdmUgdGhlIGZpcnN0IDggYnl0ZXMgZnJvbSBDdXJXcml0ZVBvc2l0aW9uLAorCQkvLwkJCWJ1dCB0aGUgcGF5bG9hZCBzdGlsbCBub3QgY29weWVkLiB0aGUgcFR4Q29udGV4dC0+U2F2ZWRQYWRbXSB3aWxsIHNhdmUgYXMgYWxsemVyby4gYW5kIHNldCB0aGUgYkNvcHlQYWQgPSBUUlVFLgorCQkvLwk0LiBJbnRlcnJ1cHQgY29tcGxldGUuCisJCS8vICA1LiBPdXIgaW50ZXJydXB0ZWQgcm91dGluZSBnbyBiYWNrIGFuZCBmaWxsIHRoZSBmaXJzdCA4IGJ5dGVzIHRvIHBUeENvbnRleHQuCisJCS8vCTYuIE5leHQgdGltZSB3aGVuIGRvIGJ1bGstb3V0LCBpdCBmb3VuZCB0aGUgYkNvcHlQYWQ9PVRSVUUgYW5kIHdpbGwgY29weSB0aGUgU2F2ZWRQYWRbXSB0byBwVHhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uLgorCQkvLwkJYW5kIHRoZSBwYWNrZXQgd2lsbCB3cm9uZy4KKwkJcEhUVFhDb250ZXh0LT5DdXJXcml0ZVJlYWxQb3MgKz0gKFRYSU5GT19TSVpFICsgVFhXSV9TSVpFICsgaHdIZHJMZW4pOworCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+VHhDb250ZXh0UXVldWVMb2NrW1F1ZUlkeF0sIElycUZsYWdzKTsKKworCQlOZGlzTW92ZU1lbW9yeShwV2lyZWxlc3NQYWNrZXQsIHBUeEJsay0+cFNyY0J1ZkRhdGEsIHBUeEJsay0+U3JjQnVmTGVuKTsKKwkJcFdpcmVsZXNzUGFja2V0ICs9IHBUeEJsay0+U3JjQnVmTGVuOworCQlOZGlzWmVyb01lbW9yeShwV2lyZWxlc3NQYWNrZXQsIHBhZGRpbmcgKyA4KTsKKworCQlSVE1QX0lSUV9MT0NLKCZwQWQtPlR4Q29udGV4dFF1ZXVlTG9ja1tRdWVJZHhdLCBJcnFGbGFncyk7CisKKwkJcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uICs9IHBUeEJsay0+UHJpdjsKKwkJaWYgKGJUeFFMYXN0Um91bmQpCisJCQlwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gPSA4OworCQlwSFRUWENvbnRleHQtPkN1cldyaXRlUmVhbFBvcyA9IHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbjsKKworCXBIVFRYQ29udGV4dC0+YkN1cldyaXRpbmcgPSBGQUxTRTsKKwl9CisKKworCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5UeENvbnRleHRRdWV1ZUxvY2tbUXVlSWR4XSwgSXJxRmxhZ3MpOworCisKKwkvLyBzdWNjZWVkIGFuZCByZWxlYXNlIHRoZSBza2IgYnVmZmVyCisJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBUeEJsay0+cFBhY2tldCwgTkRJU19TVEFUVVNfU1VDQ0VTUyk7CisKKwlyZXR1cm4oU3RhdHVzKTsKKworfQorCisKK1VTSE9SVCBSdG1wVVNCX1dyaXRlTXVsdGlUeFJlc291cmNlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVRYX0JMSwkJCSpwVHhCbGssCisJSU4JVUNIQVIJCQlmcmFtZU51bSwKKwlPVVQJVVNIT1JUCQkJKkZyZWVOdW1iZXIpCit7CisJSFRfVFhfQ09OVEVYVAkqcEhUVFhDb250ZXh0OworCVVTSE9SVAkJCWh3SGRyTGVuOwkvLyBUaGUgaHdIZHJMZW4gY29uc2lzdCBvZiA4MDIuMTEgaGVhZGVyIGxlbmd0aCBwbHVzIHRoZSBoZWFkZXIgcGFkZGluZyBsZW5ndGguCisJVUlOVDMyCQkJZmlsbE9mZnNldDsKKwlUWElORk9fU1RSVUMJKnBUeEluZm87CisJVFhXSV9TVFJVQwkJKnBUeFdJOworCVBVQ0hBUgkJCXBXaXJlbGVzc1BhY2tldCA9IE5VTEw7CisJVUNIQVIJCQlRdWVJZHg7CisJTkRJU19TVEFUVVMJCVN0YXR1czsKKwl1bnNpZ25lZCBsb25nCUlycUZsYWdzOworCS8vVUlOVDMyCQkJVVNCRE1BcGt0TGVuID0gMCwgRE1BSGRyTGVuLCBwYWRkaW5nOworCisJLy8KKwkvLyBnZXQgVHggUmluZyBSZXNvdXJjZSAmIERtYSBCdWZmZXIgYWRkcmVzcworCS8vCisJUXVlSWR4ID0gcFR4QmxrLT5RdWVJZHg7CisJcEhUVFhDb250ZXh0ICA9ICZwQWQtPlR4Q29udGV4dFtRdWVJZHhdOworCisJUlRNUF9JUlFfTE9DSygmcEFkLT5UeENvbnRleHRRdWV1ZUxvY2tbUXVlSWR4XSwgSXJxRmxhZ3MpOworCisJaWYoZnJhbWVOdW0gPT0gMCkKKwl7CisJCS8vIENoZWNrIGlmIHdlIGhhdmUgZW5vdWdoIHNwYWNlIGZvciB0aGlzIGJ1bGstb3V0IGJhdGNoLgorCQlTdGF0dXMgPSBSdG1wVVNCQ2FuRG9Xcml0ZShwQWQsIFF1ZUlkeCwgcEhUVFhDb250ZXh0KTsKKwkJaWYgKFN0YXR1cyA9PSBORElTX1NUQVRVU19TVUNDRVNTKQorCQl7CisJCQlwSFRUWENvbnRleHQtPmJDdXJXcml0aW5nID0gVFJVRTsKKworCQkJcFR4SW5mbyA9IChQVFhJTkZPX1NUUlVDKSgmcFR4QmxrLT5IZWFkZXJCdWZbMF0pOworCQkJcFR4V0k9IChQVFhXSV9TVFJVQykoJnBUeEJsay0+SGVhZGVyQnVmW1RYSU5GT19TSVpFXSk7CisKKworCQkJLy8gUmVzZXJ2ZSBzcGFjZSBmb3IgOCBieXRlcyBwYWRkaW5nLgorCQkJaWYgKChwSFRUWENvbnRleHQtPkVOZXh0QnVsa091dFBvc2l0aW9uID09IHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbikpCisJCQl7CisKKwkJCQlwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gKz0gODsKKwkJCQlwSFRUWENvbnRleHQtPkVOZXh0QnVsa091dFBvc2l0aW9uICs9IDg7CisJCQl9CisJCQlmaWxsT2Zmc2V0ID0gcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uOworCQkJcEhUVFhDb250ZXh0LT5DdXJXcml0ZVJlYWxQb3MgPSBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb247CisKKwkJCXBXaXJlbGVzc1BhY2tldCA9ICZwSFRUWENvbnRleHQtPlRyYW5zZmVyQnVmZmVyLT5maWVsZC5XaXJlbGVzc1BhY2tldFtmaWxsT2Zmc2V0XTsKKworCQkJLy8KKwkJCS8vIENvcHkgVFhJTkZPICsgVFhXSSArIFdMQU4gSGVhZGVyICsgTExDIGludG8gRE1BIEhlYWRlciBCdWZmZXIKKwkJCS8vCisJCQlpZiAocFR4QmxrLT5UeEZyYW1lVHlwZSA9PSBUWF9BTVNEVV9GUkFNRSkKKwkJCQkvL2h3SGRyTGVuID0gUk9VTkRfVVAocFR4QmxrLT5NcGR1SGVhZGVyTGVuLUxFTkdUSF9BTVNEVV9TVUJGUkFNRUhFQUQsIDQpK0xFTkdUSF9BTVNEVV9TVUJGUkFNRUhFQUQ7CisJCQkJaHdIZHJMZW4gPSBwVHhCbGstPk1wZHVIZWFkZXJMZW4tTEVOR1RIX0FNU0RVX1NVQkZSQU1FSEVBRCArIHBUeEJsay0+SGRyUGFkTGVuICsgTEVOR1RIX0FNU0RVX1NVQkZSQU1FSEVBRDsKKwkJCWVsc2UgaWYgKHBUeEJsay0+VHhGcmFtZVR5cGUgPT0gVFhfUkFMSU5LX0ZSQU1FKQorCQkJCS8vaHdIZHJMZW4gPSBST1VORF9VUChwVHhCbGstPk1wZHVIZWFkZXJMZW4tTEVOR1RIX0FSQUxJTktfSEVBREVSX0ZJRUxELCA0KStMRU5HVEhfQVJBTElOS19IRUFERVJfRklFTEQ7CisJCQkJaHdIZHJMZW4gPSBwVHhCbGstPk1wZHVIZWFkZXJMZW4tTEVOR1RIX0FSQUxJTktfSEVBREVSX0ZJRUxEICsgcFR4QmxrLT5IZHJQYWRMZW4gKyBMRU5HVEhfQVJBTElOS19IRUFERVJfRklFTEQ7CisJCQllbHNlCisJCQkJLy9od0hkckxlbiA9IFJPVU5EX1VQKHBUeEJsay0+TXBkdUhlYWRlckxlbiwgNCk7CisJCQkJaHdIZHJMZW4gPSBwVHhCbGstPk1wZHVIZWFkZXJMZW4gKyBwVHhCbGstPkhkclBhZExlbjsKKworCQkJLy8gVXBkYXRlIHRoZSBwVHhCbGstPlByaXYuCisJCQlwVHhCbGstPlByaXYgPSBUWElORk9fU0laRSArIFRYV0lfU0laRSArIGh3SGRyTGVuOworCisJCQkvLwlwVHhJbmZvLT5VU0JETUFwa3RMZW4gbm93IGp1c3QgYSB0ZW1wIHZhbHVlIGFuZCB3aWxsIHRvIGNvcnJlY3QgbGF0dGVyLgorCQkJUlRNUFdyaXRlVHhJbmZvKHBBZCwgcFR4SW5mbywgKFVTSE9SVCkocFR4QmxrLT5Qcml2KSwgRkFMU0UsIEZJRk9fRURDQSwgRkFMU0UgLypOZXh0VmFsaWQqLywgIEZBTFNFKTsKKworCQkJLy8gQ29weSBpdC4KKwkJCU5kaXNNb3ZlTWVtb3J5KHBXaXJlbGVzc1BhY2tldCwgcFR4QmxrLT5IZWFkZXJCdWYsIHBUeEJsay0+UHJpdik7CisjaWZkZWYgUlRfQklHX0VORElBTgorCQkJUlRNUEZyYW1lRW5kaWFuQ2hhbmdlKHBBZCwgKFBVQ0hBUikocFdpcmVsZXNzUGFja2V0KyBUWElORk9fU0laRSArIFRYV0lfU0laRSksIERJUl9XUklURSwgRkFMU0UpOworI2VuZGlmIC8vIFJUX0JJR19FTkRJQU4gLy8KKwkJCXBIVFRYQ29udGV4dC0+Q3VyV3JpdGVSZWFsUG9zICs9IHBUeEJsay0+UHJpdjsKKwkJCXBXaXJlbGVzc1BhY2tldCArPSBwVHhCbGstPlByaXY7CisJCX0KKwl9CisJZWxzZQorCXsJLy8gRm9yIHN1Yi1zZXF1ZW50IGZyYW1lcyBvZiB0aGlzIGJ1bGstb3V0IGJhdGNoLiBKdXN0IGNvcHkgaXQgdG8gb3VyIGJ1bGstb3V0IGJ1ZmZlci4KKworCQlTdGF0dXMgPSAoKHBIVFRYQ29udGV4dC0+YkN1cldyaXRpbmcgPT0gVFJVRSkgPyBORElTX1NUQVRVU19TVUNDRVNTIDogTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCWlmIChTdGF0dXMgPT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJeworCQkJZmlsbE9mZnNldCA9ICAocEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uICsgcFR4QmxrLT5Qcml2KTsKKwkJCXBXaXJlbGVzc1BhY2tldCA9ICZwSFRUWENvbnRleHQtPlRyYW5zZmVyQnVmZmVyLT5maWVsZC5XaXJlbGVzc1BhY2tldFtmaWxsT2Zmc2V0XTsKKworCQkJLy9od0hkckxlbiA9IHBUeEJsay0+TXBkdUhlYWRlckxlbjsKKwkJCU5kaXNNb3ZlTWVtb3J5KHBXaXJlbGVzc1BhY2tldCwgcFR4QmxrLT5IZWFkZXJCdWYsIHBUeEJsay0+TXBkdUhlYWRlckxlbik7CisJCQlwV2lyZWxlc3NQYWNrZXQgKz0gKHBUeEJsay0+TXBkdUhlYWRlckxlbik7CisJCQlwVHhCbGstPlByaXYgKz0gcFR4QmxrLT5NcGR1SGVhZGVyTGVuOworCQl9CisJCWVsc2UKKwkJewkvLyBJdCBzaG91bGQgbm90IGhhcHBlbmVkIG5vdyB1bmxlc3Mgd2UgYXJlIGdvaW5nIHRvIHNodXRkb3duLgorCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiV3JpdGVNdWx0aVR4UmVzb3VyY2UoKTpiQ3VyV3JpdGluZyBpcyBGQUxTRSB3aGVuIGhhbmRsZSBzdWItc2VxdWVudCBmcmFtZXMuXG4iKSk7CisJCQlTdGF0dXMgPSBORElTX1NUQVRVU19GQUlMVVJFOworCQl9CisJfQorCisKKwkvLyBXZSB1bmxvY2sgaXQgaGVyZSB0byBwcmV2ZW50IHRoZSBmaXJzdCA4IGJ5dGVzIG1heWJlIG92ZXItd3JpdGUgaXNzdWUuCisJLy8JMS4gRmlyc3Qgd2UgZ290IEN1cldyaXRlUG9zaXRpb24gYnV0IHRoZSBmaXJzdCA4IGJ5dGVzIHN0aWxsIG5vdCB3cml0ZSB0byB0aGUgcFR4Q29udGV4dC4KKwkvLwkyLiBBbiBpbnRlcnJ1cHQgYnJlYWsgb3VyIHJvdXRpbmUgYW5kIGhhbmRsZSBidWxrLW91dCBjb21wbGV0ZS4KKwkvLwkzLiBJbiB0aGUgYnVsay1vdXQgY29tcGxsZXRlLCBpdCBuZWVkIHRvIGRvIGFub3RoZXIgYnVsay1vdXQsCisJLy8JCQlpZiB0aGUgRU5leHRCdWxrT3V0UG9zaXRpb24gaXMganVzdCB0aGUgc2FtZSBhcyBDdXJXcml0ZVBvc2l0aW9uLCBpdCB3aWxsIHNhdmUgdGhlIGZpcnN0IDggYnl0ZXMgZnJvbSBDdXJXcml0ZVBvc2l0aW9uLAorCS8vCQkJYnV0IHRoZSBwYXlsb2FkIHN0aWxsIG5vdCBjb3B5ZWQuIHRoZSBwVHhDb250ZXh0LT5TYXZlZFBhZFtdIHdpbGwgc2F2ZSBhcyBhbGx6ZXJvLiBhbmQgc2V0IHRoZSBiQ29weVBhZCA9IFRSVUUuCisJLy8JNC4gSW50ZXJydXB0IGNvbXBsZXRlLgorCS8vICA1LiBPdXIgaW50ZXJydXB0ZWQgcm91dGluZSBnbyBiYWNrIGFuZCBmaWxsIHRoZSBmaXJzdCA4IGJ5dGVzIHRvIHBUeENvbnRleHQuCisJLy8JNi4gTmV4dCB0aW1lIHdoZW4gZG8gYnVsay1vdXQsIGl0IGZvdW5kIHRoZSBiQ29weVBhZD09VFJVRSBhbmQgd2lsbCBjb3B5IHRoZSBTYXZlZFBhZFtdIHRvIHBUeENvbnRleHQtPk5leHRCdWxrT3V0UG9zaXRpb24uCisJLy8JCWFuZCB0aGUgcGFja2V0IHdpbGwgd3JvbmcuCisJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPlR4Q29udGV4dFF1ZXVlTG9ja1tRdWVJZHhdLCBJcnFGbGFncyk7CisKKwlpZiAoU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIldyaXRlTXVsdGlUeFJlc291cmNlOiBDV1BvcyA9ICVsZCwgTkJPdXRQb3MgPSAlbGQuXG4iLCBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24sIHBIVFRYQ29udGV4dC0+TmV4dEJ1bGtPdXRQb3NpdGlvbikpOworCQlnb3RvIGRvbmU7CisJfQorCisJLy8gQ29weSB0aGUgZnJhbWUgY29udGVudCBpbnRvIERNQSBidWZmZXIgYW5kIHVwZGF0ZSB0aGUgcFR4QmxrLT5Qcml2CisJTmRpc01vdmVNZW1vcnkocFdpcmVsZXNzUGFja2V0LCBwVHhCbGstPnBTcmNCdWZEYXRhLCBwVHhCbGstPlNyY0J1Zkxlbik7CisJcFdpcmVsZXNzUGFja2V0ICs9IHBUeEJsay0+U3JjQnVmTGVuOworCXBUeEJsay0+UHJpdiArPSBwVHhCbGstPlNyY0J1ZkxlbjsKKworZG9uZToKKwkvLyBSZWxlYXNlIHRoZSBza2IgYnVmZmVyIGhlcmUKKwlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFR4QmxrLT5wUGFja2V0LCBORElTX1NUQVRVU19TVUNDRVNTKTsKKworCXJldHVybihTdGF0dXMpOworCit9CisKKworVk9JRCBSdG1wVVNCX0ZpbmFsV3JpdGVUeFJlc291cmNlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVRYX0JMSwkJCSpwVHhCbGssCisJSU4JVVNIT1JUCQkJdG90YWxNUERVU2l6ZSwKKwlJTglVU0hPUlQJCQlUeElkeCkKK3sKKwlVQ0hBUgkJCVF1ZUlkeDsKKwlIVF9UWF9DT05URVhUCSpwSFRUWENvbnRleHQ7CisJVUlOVDMyCQkJZmlsbE9mZnNldDsKKwlUWElORk9fU1RSVUMJKnBUeEluZm87CisJVFhXSV9TVFJVQwkJKnBUeFdJOworCVVJTlQzMgkJCVVTQkRNQXBrdExlbiwgcGFkZGluZzsKKwl1bnNpZ25lZCBsb25nCUlycUZsYWdzOworCVBVQ0hBUgkJCXBXaXJlbGVzc1BhY2tldDsKKworCVF1ZUlkeCA9IHBUeEJsay0+UXVlSWR4OworCXBIVFRYQ29udGV4dCAgPSAmcEFkLT5UeENvbnRleHRbUXVlSWR4XTsKKworCVJUTVBfSVJRX0xPQ0soJnBBZC0+VHhDb250ZXh0UXVldWVMb2NrW1F1ZUlkeF0sIElycUZsYWdzKTsKKworCWlmIChwSFRUWENvbnRleHQtPmJDdXJXcml0aW5nID09IFRSVUUpCisJeworCQlmaWxsT2Zmc2V0ID0gcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uOworCQlpZiAoKChwSFRUWENvbnRleHQtPkVOZXh0QnVsa091dFBvc2l0aW9uID09IHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbikgfHwgKChwSFRUWENvbnRleHQtPkVOZXh0QnVsa091dFBvc2l0aW9uLTgpID09IHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbikpCisJCQkmJiAocEhUVFhDb250ZXh0LT5iQ29weVNhdmVQYWQgPT0gVFJVRSkpCisJCQlwV2lyZWxlc3NQYWNrZXQgPSAoUFVDSEFSKSgmcEhUVFhDb250ZXh0LT5TYXZlZFBhZFswXSk7CisJCWVsc2UKKwkJCXBXaXJlbGVzc1BhY2tldCA9IChQVUNIQVIpKCZwSFRUWENvbnRleHQtPlRyYW5zZmVyQnVmZmVyLT5maWVsZC5XaXJlbGVzc1BhY2tldFtmaWxsT2Zmc2V0XSk7CisKKwkJLy8KKwkJLy8gVXBkYXRlIFR4SW5mby0+VVNCRE1BcGt0TGVuICwKKwkJLy8JCXRoZSBsZW5ndGggPSBUWFdJX1NJWkUgKyA4MDIuMTFfaGRyICsgODAyLjExX2hkcl9wYWQgKyBwYXlsb2FkX29mX2FsbF9iYXRjaF9mcmFtZXMgKyBCdWxrLU91dC1wYWRkaW5nCisJCS8vCisJCXBUeEluZm8gPSAoUFRYSU5GT19TVFJVQykocFdpcmVsZXNzUGFja2V0KTsKKworCQkvLyBDYWxjdWxhdGUgdGhlIGJ1bGstb3V0IHBhZGRpbmcKKwkJVVNCRE1BcGt0TGVuID0gcFR4QmxrLT5Qcml2IC0gVFhJTkZPX1NJWkU7CisJCXBhZGRpbmcgPSAoNCAtIChVU0JETUFwa3RMZW4gJSA0KSkgJiAweDAzOwkvLyByb3VuZCB1cCB0byA0IGJ5dGUgYWxpZ25tZW50CisJCVVTQkRNQXBrdExlbiArPSBwYWRkaW5nOworCisJCXBUeEluZm8tPlVTQkRNQVR4UGt0TGVuID0gVVNCRE1BcGt0TGVuOworCisJCS8vCisJCS8vIFVwZGF0ZSBUWFdJLT5NUERVdG90YWxCeXRlQ291bnQgLAorCQkvLwkJdGhlIGxlbmd0aCA9IDgwMi4xMSBoZWFkZXIgKyBwYXlsb2FkX29mX2FsbF9iYXRjaF9mcmFtZXMKKwkJcFR4V0k9IChQVFhXSV9TVFJVQykocFdpcmVsZXNzUGFja2V0ICsgVFhJTkZPX1NJWkUpOworCQlwVHhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50ID0gdG90YWxNUERVU2l6ZTsKKworCQkvLworCQkvLyBVcGRhdGUgdGhlIHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbgorCQkvLworCQlwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gKz0gKFRYSU5GT19TSVpFICsgVVNCRE1BcGt0TGVuKTsKKwkJaWYgKChwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gKyAzOTA2KT4gTUFYX1RYQlVMS19MSU1JVCkKKwkJewkvLyBBZGQgMzkwNiBmb3IgcHJldmVudCB0aGUgTmV4dEJ1bGtPdXQgcGFja2V0IHNpemUgaXMgYSBBLVJBTElOSy9BLU1TRFUgRnJhbWUuCisJCQlwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gPSA4OworCQkJcFR4SW5mby0+U3dVc2VMYXN0Um91bmQgPSAxOworCQl9CisJCXBIVFRYQ29udGV4dC0+Q3VyV3JpdGVSZWFsUG9zID0gcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uOworCisKKwkJLy8KKwkJLy8JWmVybyB0aGUgbGFzdCBwYWRkaW5nLgorCQkvLworCQlwV2lyZWxlc3NQYWNrZXQgPSAoJnBIVFRYQ29udGV4dC0+VHJhbnNmZXJCdWZmZXItPmZpZWxkLldpcmVsZXNzUGFja2V0W2ZpbGxPZmZzZXQgKyBwVHhCbGstPlByaXZdKTsKKwkJTmRpc1plcm9NZW1vcnkocFdpcmVsZXNzUGFja2V0LCBwYWRkaW5nICsgOCk7CisKKwkJLy8gRmluYWxseSwgc2V0IGJDdXJXcml0aW5nIGFzIEZBTFNFCisJCXBIVFRYQ29udGV4dC0+YkN1cldyaXRpbmcgPSBGQUxTRTsKKworCX0KKwllbHNlCisJewkvLyBJdCBzaG91bGQgbm90IGhhcHBlbmVkIG5vdyB1bmxlc3Mgd2UgYXJlIGdvaW5nIHRvIHNodXRkb3duLgorCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJGaW5hbFdyaXRlVHhSZXNvdXJjZSgpOmJDdXJXcml0aW5nIGlzIEZBTFNFIHdoZW4gaGFuZGxlIGxhc3QgZnJhbWVzLlxuIikpOworCX0KKworCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5UeENvbnRleHRRdWV1ZUxvY2tbUXVlSWR4XSwgSXJxRmxhZ3MpOworCit9CisKKworVk9JRCBSdG1wVVNCRGF0YUxhc3RUeElkeCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVQ0hBUgkJCVF1ZUlkeCwKKwlJTglVU0hPUlQJCQlUeElkeCkKK3sKKwkvLyBETyBub3RoaW5nIGZvciBVU0IuCit9CisKKworLyoKKwlXaGVuIGNhbiBkbyBidWxrLW91dDoKKwkJMS4gVHhTd0ZyZWVJZHggPCBUWF9SSU5HX1NJWkU7CisJCQlJdCBtZWFucyBoYXMgYXQgbGVhc3Qgb25lIFJpbmcgZW50aXR5IGlzIHJlYWR5IGZvciBidWxrLW91dCwga2ljayBpdCBvdXQuCisJCTIuIElmIFR4U3dGcmVlSWR4ID09IFRYX1JJTkdfU0laRQorCQkJQ2hlY2sgaWYgdGhlIEN1cldyaXRpbmcgZmxhZyBpcyBGQUxTRSwgaWYgaXQncyBGQUxTRSwgd2UgY2FuIGRvIGtpY2sgb3V0LgorCisqLworVk9JRCBSdG1wVVNCRGF0YUtpY2tPdXQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVFhfQkxLCQkJKnBUeEJsaywKKwlJTglVQ0hBUgkJCVF1ZUlkeCkKK3sKKwlSVFVTQl9TRVRfQlVMS19GTEFHKHBBZCwgKGZSVFVTQl9CVUxLX09VVF9EQVRBX05PUk1BTCA8PCBRdWVJZHgpKTsKKwlSVFVTQktpY2tCdWxrT3V0KHBBZCk7CisKK30KKworCisvKgorCU11c3QgYmUgcnVuIGluIEludGVycnVwdCBjb250ZXh0CisJVGhpcyBmdW5jdGlvbiBoYW5kbGUgUlQyODcwIHNwZWNpZmljIFR4RGVzYyBhbmQgY3B1IGluZGV4IHVwZGF0ZSBhbmQga2ljayB0aGUgcGFja2V0IG91dC4KKyAqLworaW50IFJ0bXBVU0JNZ210S2lja091dCgKKwlJTiBSVE1QX0FEQVBURVIgCSpwQWQsCisJSU4gVUNIQVIgCQkJUXVlSWR4LAorCUlOIFBORElTX1BBQ0tFVAkJcFBhY2tldCwKKwlJTiBQVUNIQVIJCQlwU3JjQnVmVkEsCisJSU4gVUlOVCAJCQlTcmNCdWZMZW4pCit7CisJUFRYSU5GT19TVFJVQwlwVHhJbmZvOworCVVMT05HCQkJQnVsa091dFNpemU7CisJVUNIQVIJCQlwYWRMZW47CisJUFVDSEFSCQkJcERlc3Q7CisJVUxPTkcJCQlTd0lkeCA9IHBBZC0+TWdtdFJpbmcuVHhDcHVJZHg7CisJUFRYX0NPTlRFWFQJCXBNTE1FQ29udGV4dCA9IChQVFhfQ09OVEVYVClwQWQtPk1nbXRSaW5nLkNlbGxbU3dJZHhdLkFsbG9jVmE7CisJdW5zaWduZWQgbG9uZwlJcnFGbGFnczsKKworCisJcFR4SW5mbyA9IChQVFhJTkZPX1NUUlVDKShwU3JjQnVmVkEpOworCisJLy8gQnVpbGQgb3VyIFVSQiBmb3IgVVNCRAorCUJ1bGtPdXRTaXplID0gU3JjQnVmTGVuOworCUJ1bGtPdXRTaXplID0gKEJ1bGtPdXRTaXplICsgMykgJiAofjMpOworCVJUTVBXcml0ZVR4SW5mbyhwQWQsIHBUeEluZm8sIChVU0hPUlQpKEJ1bGtPdXRTaXplIC0gVFhJTkZPX1NJWkUpLCBUUlVFLCBFcFRvUXVldWVbTUdNVFBJUEVJRFhdLCBGQUxTRSwgIEZBTFNFKTsKKworCUJ1bGtPdXRTaXplICs9IDQ7IC8vIEFsd2F5cyBhZGQgNCBleHRyYSBieXRlcyBhdCBldmVyeSBwYWNrZXQuCisKKwkvLyBJZiBCdWxrT3V0U2l6ZSBpcyBtdWx0aXBsZSBvZiBCdWxrT3V0TWF4UGFja2V0U2l6ZSwgYWRkIGV4dHJhIDQgYnl0ZXMgYWdhaW4uCisJaWYgKChCdWxrT3V0U2l6ZSAlIHBBZC0+QnVsa091dE1heFBhY2tldFNpemUpID09IDApCisJCUJ1bGtPdXRTaXplICs9IDQ7CisKKwlwYWRMZW4gPSBCdWxrT3V0U2l6ZSAtIFNyY0J1ZkxlbjsKKwlBU1NFUlQoKHBhZExlbiA8PSBSVE1QX1BLVF9UQUlMX1BBRERJTkcpKTsKKworCS8vIE5vdyBtZW16ZXJvIGFsbCBleHRyYSBwYWRkaW5nIGJ5dGVzLgorCXBEZXN0ID0gKFBVQ0hBUikocFNyY0J1ZlZBICsgU3JjQnVmTGVuKTsKKwlza2JfcHV0KEdFVF9PU19QS1RfVFlQRShwUGFja2V0KSwgcGFkTGVuKTsKKwlOZGlzWmVyb01lbW9yeShwRGVzdCwgcGFkTGVuKTsKKworCVJUTVBfSVJRX0xPQ0soJnBBZC0+TUxNRUJ1bGtPdXRMb2NrLCBJcnFGbGFncyk7CisKKwlwQWQtPk1nbXRSaW5nLkNlbGxbcEFkLT5NZ210UmluZy5UeENwdUlkeF0ucE5kaXNQYWNrZXQgPSBwUGFja2V0OworCXBNTE1FQ29udGV4dC0+VHJhbnNmZXJCdWZmZXIgPSAoUFRYX0JVRkZFUikoR0VUX09TX1BLVF9EQVRBUFRSKHBQYWNrZXQpKTsKKworCS8vIExlbmd0aCBpbiBUeEluZm8gc2hvdWxkIGJlIDggbGVzcyB0aGFuIGJ1bGtvdXQgc2l6ZS4KKwlwTUxNRUNvbnRleHQtPkJ1bGtPdXRTaXplID0gQnVsa091dFNpemU7CisJcE1MTUVDb250ZXh0LT5JblVzZSA9IFRSVUU7CisJcE1MTUVDb250ZXh0LT5iV2FpdGluZ0J1bGtPdXQgPSBUUlVFOworCisKKwkvL2ZvciBkZWJ1ZworCS8vaGV4X2R1bXAoIlJ0bXBVU0JNZ210S2lja091dCIsICZwTUxNRUNvbnRleHQtPlRyYW5zZmVyQnVmZmVyLT5maWVsZC5XaXJlbGVzc1BhY2tldFswXSwgKHBNTE1FQ29udGV4dC0+QnVsa091dFNpemUgPiAxNiA/IDE2IDogcE1MTUVDb250ZXh0LT5CdWxrT3V0U2l6ZSkpOworCisJLy9wQWQtPlJhbGlua0NvdW50ZXJzLktpY2tUeENvdW50Kys7CisJLy9wQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4RG9uZUNvdW50Kys7CisKKwkvL2lmIChwQWQtPk1nbXRSaW5nLlR4U3dGcmVlSWR4ID09IE1HTVRfUklOR19TSVpFKQorCS8vCW5lZWRLaWNrT3V0ID0gVFJVRTsKKworCS8vIERlY3JlYXNlIHRoZSBUeFN3RnJlZUlkeCBhbmQgSW5jcmVhc2UgdGhlIFRYX0NUWF9JRFgKKwlwQWQtPk1nbXRSaW5nLlR4U3dGcmVlSWR4LS07CisJSU5DX1JJTkdfSU5ERVgocEFkLT5NZ210UmluZy5UeENwdUlkeCwgTUdNVF9SSU5HX1NJWkUpOworCisJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPk1MTUVCdWxrT3V0TG9jaywgSXJxRmxhZ3MpOworCisJUlRVU0JfU0VUX0JVTEtfRkxBRyhwQWQsIGZSVFVTQl9CVUxLX09VVF9NTE1FKTsKKwkvL2lmIChuZWVkS2lja091dCkKKwlSVFVTQktpY2tCdWxrT3V0KHBBZCk7CisKKwlyZXR1cm4gMDsKK30KKworCitWT0lEIFJ0bXBVU0JOdWxsRnJhbWVLaWNrT3V0KAorCUlOIFJUTVBfQURBUFRFUiAqcEFkLAorCUlOIFVDSEFSCQlRdWVJZHgsCisJSU4gVUNIQVIJCSpwTnVsbEZyYW1lLAorCUlOIFVJTlQzMgkJZnJhbWVMZW4pCit7CisJaWYgKHBBZC0+TnVsbENvbnRleHQuSW5Vc2UgPT0gRkFMU0UpCisJeworCQlQVFhfQ09OVEVYVAkJcE51bGxDb250ZXh0OworCQlQVFhJTkZPX1NUUlVDCXBUeEluZm87CisJCVBUWFdJX1NUUlVDCQlwVHhXSTsKKwkJUFVDSEFSCQkJcFdpcmVsZXNzUGt0OworCisJCXBOdWxsQ29udGV4dCA9ICYocEFkLT5OdWxsQ29udGV4dCk7CisKKwkJLy8gU2V0IHRoZSBpbiB1c2UgYml0CisJCXBOdWxsQ29udGV4dC0+SW5Vc2UgPSBUUlVFOworCQlwV2lyZWxlc3NQa3QgPSAoUFVDSEFSKSZwTnVsbENvbnRleHQtPlRyYW5zZmVyQnVmZmVyLT5maWVsZC5XaXJlbGVzc1BhY2tldFswXTsKKworCQlSVE1QWmVyb01lbW9yeSgmcFdpcmVsZXNzUGt0WzBdLCAxMDApOworCQlwVHhJbmZvID0gKFBUWElORk9fU1RSVUMpJnBXaXJlbGVzc1BrdFswXTsKKwkJUlRNUFdyaXRlVHhJbmZvKHBBZCwgcFR4SW5mbywgKFVTSE9SVCkoc2l6ZW9mKEhFQURFUl84MDJfMTEpK1RYV0lfU0laRSksIFRSVUUsIEVwVG9RdWV1ZVtNR01UUElQRUlEWF0sIEZBTFNFLCAgRkFMU0UpOworCQlwVHhJbmZvLT5RU0VMID0gRklGT19FRENBOworCQlwVHhXSSA9IChQVFhXSV9TVFJVQykmcFdpcmVsZXNzUGt0W1RYSU5GT19TSVpFXTsKKwkJUlRNUFdyaXRlVHhXSShwQWQsIHBUeFdJLCAgRkFMU0UsIEZBTFNFLCBGQUxTRSwgRkFMU0UsIFRSVUUsIEZBTFNFLCAwLCBCU1NJRF9XQ0lELCAoc2l6ZW9mKEhFQURFUl84MDJfMTEpKSwKKwkJCTAsIDAsIChVQ0hBUilwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTUNTLCBJRlNfSFRUWE9QLCBGQUxTRSwgJnBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdCk7CisjaWZkZWYgUlRfQklHX0VORElBTgorCQlSVE1QV0lFbmRpYW5DaGFuZ2UoKFBVQ0hBUilwVHhXSSwgVFlQRV9UWFdJKTsKKyNlbmRpZiAvLyBSVF9CSUdfRU5ESUFOIC8vCisKKwkJUlRNUE1vdmVNZW1vcnkoJnBXaXJlbGVzc1BrdFtUWFdJX1NJWkUrVFhJTkZPX1NJWkVdLCAmcEFkLT5OdWxsRnJhbWUsIHNpemVvZihIRUFERVJfODAyXzExKSk7CisjaWZkZWYgUlRfQklHX0VORElBTgorCQlSVE1QRnJhbWVFbmRpYW5DaGFuZ2UocEFkLCAoUFVDSEFSKSZwV2lyZWxlc3NQa3RbVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkVdLCBESVJfV1JJVEUsIEZBTFNFKTsKKyNlbmRpZiAvLyBSVF9CSUdfRU5ESUFOIC8vCisJCXBBZC0+TnVsbENvbnRleHQuQnVsa091dFNpemUgPSAgVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkUgKyBzaXplb2YocEFkLT5OdWxsRnJhbWUpICsgNDsKKworCQkvLyBGaWxsIG91dCBmcmFtZSBsZW5ndGggaW5mb3JtYXRpb24gZm9yIGdsb2JhbCBCdWxrIG91dCBhcmJpdG9yCisJCS8vcE51bGxDb250ZXh0LT5CdWxrT3V0U2l6ZSA9IFRyYW5zZmVyQnVmZmVyTGVuZ3RoOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTWU5DIC0gc2VuZCBOVUxMIEZyYW1lIEAlZCBNYnBzLi4uXG4iLCBSYXRlSWRUb01icHNbcEFkLT5Db21tb25DZmcuVHhSYXRlXSkpOworCQlSVFVTQl9TRVRfQlVMS19GTEFHKHBBZCwgZlJUVVNCX0JVTEtfT1VUX0RBVEFfTlVMTCk7CisKKwkJLy8gS2ljayBidWxrIG91dAorCQlSVFVTQktpY2tCdWxrT3V0KHBBZCk7CisJfQorCit9CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lCURlc2NyaXB0aW9uOgorCQlDaGVjayBSeCBkZXNjcmlwdG9yLCByZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRSBpZiBhbnkgZXJyb3IgZG91bmQKKworCUFyZ3VtZW50czoKKwkJcFJ4RAkJUG9pbnRlcgl0byB0aGUgUnggZGVzY3JpcHRvcgorCisJUmV0dXJuIFZhbHVlOgorCQlORElTX1NUQVRVU19TVUNDRVNTCQlObyBlcnIKKwkJTkRJU19TVEFUVVNfRkFJTFVSRQkJRXJyb3IKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitORElTX1NUQVRVUwlSVE1QQ2hlY2tSeEVycm9yKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBIRUFERVJfODAyXzExCXBIZWFkZXIsCisJSU4JUFJYV0lfU1RSVUMJcFJ4V0ksCisJSU4JUFJUMjhYWF9SWERfU1RSVUMJcFJ4SU5GTykKK3sKKwlQQ0lQSEVSX0tFWSBwV3BhS2V5OworCUlOVAlkQm07CisKKwlpZiAocEFkLT5iUHJvbWlzY3VvdXMgPT0gVFJVRSkKKwkJcmV0dXJuKE5ESVNfU1RBVFVTX1NVQ0NFU1MpOworCWlmKHBSeElORk8gPT0gTlVMTCkKKwkJcmV0dXJuKE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCisJLy8gUGh5IGVycm9ycyAmIENSQyBlcnJvcnMKKwlpZiAocFJ4SU5GTy0+Q3JjKQorCXsKKwkJLy8gQ2hlY2sgUlNTSSBmb3IgTm9pc2UgSGlzdCBzdGF0aXN0aWMgY29sbGVjdGlvbi4KKwkJZEJtID0gKElOVCkgKHBSeFdJLT5SU1NJMCkgLSBwQWQtPkJicFJzc2lUb0RibURlbHRhOworCQlpZiAoZEJtIDw9IC04NykKKwkJCXBBZC0+U3RhQ2ZnLlJQSURlbnNpdHlbMF0gKz0gMTsKKwkJZWxzZSBpZiAoZEJtIDw9IC04MikKKwkJCXBBZC0+U3RhQ2ZnLlJQSURlbnNpdHlbMV0gKz0gMTsKKwkJZWxzZSBpZiAoZEJtIDw9IC03NykKKwkJCXBBZC0+U3RhQ2ZnLlJQSURlbnNpdHlbMl0gKz0gMTsKKwkJZWxzZSBpZiAoZEJtIDw9IC03MikKKwkJCXBBZC0+U3RhQ2ZnLlJQSURlbnNpdHlbM10gKz0gMTsKKwkJZWxzZSBpZiAoZEJtIDw9IC02NykKKwkJCXBBZC0+U3RhQ2ZnLlJQSURlbnNpdHlbNF0gKz0gMTsKKwkJZWxzZSBpZiAoZEJtIDw9IC02MikKKwkJCXBBZC0+U3RhQ2ZnLlJQSURlbnNpdHlbNV0gKz0gMTsKKwkJZWxzZSBpZiAoZEJtIDw9IC01NykKKwkJCXBBZC0+U3RhQ2ZnLlJQSURlbnNpdHlbNl0gKz0gMTsKKwkJZWxzZSBpZiAoZEJtID4gLTU3KQorCQkJcEFkLT5TdGFDZmcuUlBJRGVuc2l0eVs3XSArPSAxOworCisJCXJldHVybihORElTX1NUQVRVU19GQUlMVVJFKTsKKwl9CisKKwkvLyBBZGQgUnggc2l6ZSB0byBjaGFubmVsIGxvYWQgY291bnRlciwgd2Ugc2hvdWxkIGlnbm9yZSBlcnJvciBjb3VudHMKKwlwQWQtPlN0YUNmZy5DTEJ1c3lCeXRlcyArPSAocFJ4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudCsgMTQpOworCisJLy8gRHJvcCBUb0RzIHByb21pc2NvdXMgZnJhbWUsIGl0IGlzIG9wZW5lZCBkdWUgdG8gQ0NYIDIgY2hhbm5lbCBsb2FkIHN0YXRpc3RpY3MKKwlpZiAocEhlYWRlci0+RkMuVG9EcykKKwl7CisJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwgKCJFcnI7RkMuVG9Ec1xuIikpOworCQlyZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRTsKKwl9CisKKwkvLyBQYXVsIDA0LTAzIGZvciBPRkRNIFJ4IGxlbmd0aCBpc3N1ZQorCWlmIChwUnhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50ID4gTUFYX0FHR1JFR0FUSU9OX1NJWkUpCisJeworCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgicmVjZWl2ZWQgcGFja2V0IHRvbyBsb25nXG4iKSk7CisJCXJldHVybiBORElTX1NUQVRVU19GQUlMVVJFOworCX0KKworCS8vIERyb3Agbm90IFUyTSBmcmFtZXMsIGNhbnQncyBkcm9wIGhlcmUgYmVjYXVzZSB3ZSB3aWxsIGRyb3AgYmVhY29uIGluIHRoaXMgY2FzZQorCS8vIEkgYW0ga2luZCBvZiBkb3VidGluZyB0aGUgVTJNIGJpdCBvcGVyYXRpb24KKwkvLyBpZiAocFJ4RC0+VTJNID09IDApCisJLy8JcmV0dXJuKE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCisJLy8gZHJvcCBkZWN5cHRpb24gZmFpbCBmcmFtZQorCWlmIChwUnhJTkZPLT5EZWNyeXB0ZWQgJiYgcFJ4SU5GTy0+Q2lwaGVyRXJyKQorCXsKKworCQkvLworCQkvLyBNSUMgRXJyb3IKKwkJLy8KKwkJaWYgKChwUnhJTkZPLT5DaXBoZXJFcnIgPT0gMikgJiYgcFJ4SU5GTy0+TXlCc3MpCisJCXsKKwkJCXBXcGFLZXkgPSAmcEFkLT5TaGFyZWRLZXlbQlNTMF1bcFJ4V0ktPktleUluZGV4XTsKKwkJCVJUTVBSZXBvcnRNaWNFcnJvcihwQWQsIHBXcGFLZXkpOworCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCgiUnggTUlDIFZhbHVlIGVycm9yXG4iKSk7CisJCX0KKworCQlpZiAocFJ4SU5GTy0+RGVjcnlwdGVkICYmCisJCQkocEFkLT5TaGFyZWRLZXlbQlNTMF1bcFJ4V0ktPktleUluZGV4XS5DaXBoZXJBbGcgPT0gQ0lQSEVSX0FFUykgJiYKKwkJCShwSGVhZGVyLT5TZXF1ZW5jZSA9PSBwQWQtPkZyYWdGcmFtZS5TZXF1ZW5jZSkpCisJCXsKKwkJCS8vCisJCQkvLyBBY2NlcHRhYmxlIHNpbmNlIHRoZSBGaXJzdCBGcmFnRnJhbWUgbm8gQ2lwaGVyRXJyIHByb2JsZW0uCisJCQkvLworCQkJcmV0dXJuKE5ESVNfU1RBVFVTX1NVQ0NFU1MpOworCQl9CisKKwkJcmV0dXJuKE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCX0KKworCXJldHVybihORElTX1NUQVRVU19TVUNDRVNTKTsKK30KKworVk9JRCBSVDI4eHhVc2JTdGFBc2ljRm9yY2VXYWtldXAoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gQk9PTEVBTiAgICAgICBiRnJvbVR4KQoreworICAgIEFVVE9fV0FLRVVQX1NUUlVDCUF1dG9XYWtldXBDZmc7CisKKwlBdXRvV2FrZXVwQ2ZnLndvcmQgPSAwOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIEFVVE9fV0FLRVVQX0NGRywgQXV0b1dha2V1cENmZy53b3JkKTsKKworCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHgzMSwgMHhmZiwgMHgwMCwgMHgwMCk7CisKKwlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKTsKK30KKworVk9JRCBSVDI4eHhVc2JTdGFBc2ljU2xlZXBUaGVuQXV0b1dha2V1cCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVU0hPUlQgVGJ0dE51bVRvTmV4dFdha2VVcCkKK3sKKwlBVVRPX1dBS0VVUF9TVFJVQwlBdXRvV2FrZXVwQ2ZnOworCisJLy8gd2UgaGF2ZSBkZWNpZGVkIHRvIFNMRUVQLCBzbyBhdCBsZWFzdCBkbyBpdCBmb3IgYSBCRUFDT04gcGVyaW9kLgorCWlmIChUYnR0TnVtVG9OZXh0V2FrZVVwID09IDApCisJCVRidHROdW1Ub05leHRXYWtlVXAgPSAxOworCisJQXV0b1dha2V1cENmZy53b3JkID0gMDsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBBVVRPX1dBS0VVUF9DRkcsIEF1dG9XYWtldXBDZmcud29yZCk7CisKKwlBdXRvV2FrZXVwQ2ZnLmZpZWxkLk51bW9mU2xlZXBpbmdUYnR0ID0gVGJ0dE51bVRvTmV4dFdha2VVcCAtIDE7CisJQXV0b1dha2V1cENmZy5maWVsZC5FbmFibGVBdXRvV2FrZXVwID0gMTsKKwlBdXRvV2FrZXVwQ2ZnLmZpZWxkLkF1dG9MZWFkVGltZSA9IDU7CisJUlRNUF9JT19XUklURTMyKHBBZCwgQVVUT19XQUtFVVBfQ0ZHLCBBdXRvV2FrZXVwQ2ZnLndvcmQpOworCisJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDMwLCAweGZmLCAweGZmLCAweDAyKTsgICAvLyBzZW5kIFBPV0VSLVNBVkUgY29tbWFuZCB0byBNQ1UuIFRpbWVvdXQgNDB1cy4KKworCU9QU1RBVFVTX1NFVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKTsKKworfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCitWT0lEIFJUMjh4eFVzYk1sbWVSYWRpb09uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUlQyOHh4VXNiTWxtZVJhZGlvT24oKVxuIikpOworCisJaWYgKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkFESU9fT0ZGKSkKKwkJcmV0dXJuOworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwl7CisgICAgCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHgzMSwgMHhmZiwgMHgwMCwgMHgwMCk7CisJCVJUTVB1c2VjRGVsYXkoMTAwMDApOworCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwlOSUNSZXNldEZyb21FcnJvcihwQWQpOworCisJLy8gRW5hYmxlIFR4L1J4CisJUlRNUEVuYWJsZVJ4VHgocEFkKTsKKworCS8vIENsZWFyIFJhZGlvIG9mZiBmbGFnCisJUlRNUF9DTEVBUl9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SQURJT19PRkYpOworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJUlRVU0JCdWxrUmVjZWl2ZShwQWQpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJLy8gU2V0IExFRAorCVJUTVBTZXRMRUQocEFkLCBMRURfUkFESU9fT04pOworfQorCitWT0lEIFJUMjh4eFVzYk1sbWVSYWRpb09GRigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlXUERNQV9HTE9fQ0ZHX1NUUlVDCUdsb0NmZzsKKwlVSU5UMzIJVmFsdWUsIGk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJUMjh4eFVzYk1sbWVSYWRpb09GRigpXG4iKSk7CisKKwlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JBRElPX09GRikpCisJCXJldHVybjsKKworCS8vIFNldCBMRUQKKwlSVE1QU2V0TEVEKHBBZCwgTEVEX1JBRElPX09GRik7CisJLy8gU2V0IFJhZGlvIG9mZiBmbGFnCisJUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkFESU9fT0ZGKTsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJeworCQkvLyBMaW5rIGRvd24gZmlyc3QgaWYgYW55IGFzc29jaWF0aW9uIGV4aXN0cworCQlpZiAoSU5GUkFfT04ocEFkKSB8fCBBREhPQ19PTihwQWQpKQorCQkJTGlua0Rvd24ocEFkLCBGQUxTRSk7CisJCVJUTVB1c2VjRGVsYXkoMTAwMDApOworCisJCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJCS8vIENsZWFuIHVwIG9sZCBic3MgdGFibGUKKwkJQnNzVGFibGVJbml0KCZwQWQtPlNjYW5UYWIpOworCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCisJLy8gRGlzYWJsZSBNQUMgVHgvUngKKwlSVE1QX0lPX1JFQUQzMihwQWQsIE1BQ19TWVNfQ1RSTCwgJlZhbHVlKTsKKwlWYWx1ZSAmPSAoMHhmZmZmZmZmMyk7CisJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCBWYWx1ZSk7CisKKwkvLyBNQUNfU1lTX0NUUkwgPT4gdmFsdWUgPSAweDAgPT4gNDBtQQorCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgMCk7CisKKwkvLyBQV1JfUElOX0NGRyA9PiB2YWx1ZSA9IDB4MCA9PiA0MG1BCisJUlRNUF9JT19XUklURTMyKHBBZCwgUFdSX1BJTl9DRkcsIDApOworCisJLy8gVFhfUElOX0NGRyA9PiB2YWx1ZSA9IDB4MCA9PiAyMG1BCisJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfUElOX0NGRywgMCk7CisKKwlpZiAocEFkLT5Db21tb25DZmcuQkJQQ3VycmVudEJXID09IEJXXzQwKQorCXsKKwkJLy8gTXVzdCB1c2luZyA0ME1Iei4KKwkJQXNpY1R1cm5PZmZSRkNsayhwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsKTsKKwl9CisJZWxzZQorCXsKKwkJLy8gTXVzdCB1c2luZyAyME1Iei4KKwkJQXNpY1R1cm5PZmZSRkNsayhwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpOworCX0KKworCS8vIFdhaXRpbmcgZm9yIERNQSBpZGxlCisJaSA9IDA7CisJZG8KKwl7CisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgV1BETUFfR0xPX0NGRywgJkdsb0NmZy53b3JkKTsKKwkJaWYgKChHbG9DZmcuZmllbGQuVHhETUFCdXN5ID09IDApICYmIChHbG9DZmcuZmllbGQuUnhETUFCdXN5ID09IDApKQorCQkJYnJlYWs7CisKKwkJUlRNUHVzZWNEZWxheSgxMDAwKTsKKwl9d2hpbGUgKGkrKyA8IDEwMCk7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4MzAsIDB4ZmYsIDB4ZmYsIDB4MDIpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9jbW1faW5mby5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vY21tX2luZm8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40N2ExYjFhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vY21tX2luZm8uYwpAQCAtMCwwICsxLDM3MTIgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KKworI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgorCitJTlQJU2hvd19TU0lEX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpOworCitJTlQJU2hvd19XaXJlbGVzc01vZGVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1Zik7CisKK0lOVAlTaG93X1R4QnVyc3RfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1Zik7CisKK0lOVAlTaG93X1R4UHJlYW1ibGVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1Zik7CisKK0lOVAlTaG93X1R4UG93ZXJfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1Zik7CisKK0lOVAlTaG93X0NoYW5uZWxfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1Zik7CisKK0lOVAlTaG93X0JHUHJvdGVjdGlvbl9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKTsKKworSU5UCVNob3dfUlRTVGhyZXNob2xkX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpOworCitJTlQJU2hvd19GcmFnVGhyZXNob2xkX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCitJTlQJU2hvd19IdEJ3X1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpOworCitJTlQJU2hvd19IdE1jc19Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKTsKKworSU5UCVNob3dfSHRHaV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKTsKKworSU5UCVNob3dfSHRPcE1vZGVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1Zik7CisKK0lOVAlTaG93X0h0RXh0Y2hhX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpOworCitJTlQJU2hvd19IdE1wZHVEZW5zaXR5X1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpOworCitJTlQJU2hvd19IdEJhV2luU2l6ZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKTsKKworSU5UCVNob3dfSHRSZGdfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1Zik7CisKK0lOVAlTaG93X0h0QW1zZHVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1Zik7CisKK0lOVAlTaG93X0h0QXV0b0JhX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCitJTlQJU2hvd19Db3VudHJ5UmVnaW9uX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpOworCitJTlQJU2hvd19Db3VudHJ5UmVnaW9uQUJhbmRfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1Zik7CisKK0lOVAlTaG93X0NvdW50cnlDb2RlX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpOworCisjaWZkZWYgQUdHUkVHQVRJT05fU1VQUE9SVAorSU5UCVNob3dfUGt0QWdncmVnYXRlX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpOworI2VuZGlmIC8vIEFHR1JFR0FUSU9OX1NVUFBPUlQgLy8KKworI2lmZGVmIFdNTV9TVVBQT1JUCitJTlQJU2hvd19XbW1DYXBhYmxlX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpOworI2VuZGlmIC8vIFdNTV9TVVBQT1JUIC8vCisKK0lOVAlTaG93X0lFRUU4MDIxMUhfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1Zik7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKK0lOVAlTaG93X05ldHdvcmtUeXBlX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCitJTlQJU2hvd19BdXRoTW9kZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKTsKKworSU5UCVNob3dfRW5jcnlwVHlwZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKTsKKworSU5UCVNob3dfRGVmYXVsdEtleUlEX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpOworCitJTlQJU2hvd19LZXkxX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpOworCitJTlQJU2hvd19LZXkyX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpOworCitJTlQJU2hvd19LZXkzX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpOworCitJTlQJU2hvd19LZXk0X1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpOworCitJTlQJU2hvd19XUEFQU0tfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1Zik7CisKK3N0YXRpYyBzdHJ1Y3QgeworCUNIQVIgKm5hbWU7CisJSU5UICgqc2hvd19wcm9jKShQUlRNUF9BREFQVEVSIHBBZGFwdGVyLCBQVUNIQVIgYXJnKTsKK30gKlBSVE1QX1BSSVZBVEVfU1RBX1NIT1dfQ0ZHX1ZBTFVFX1BST0MsIFJUTVBfUFJJVkFURV9TVEFfU0hPV19DRkdfVkFMVUVfUFJPQ1tdID0geworCXsiU1NJRCIsCQkJCQlTaG93X1NTSURfUHJvY30sCisJeyJXaXJlbGVzc01vZGUiLAkJCVNob3dfV2lyZWxlc3NNb2RlX1Byb2N9LAorCXsiVHhCdXJzdCIsCQkJCQlTaG93X1R4QnVyc3RfUHJvY30sCisJeyJUeFByZWFtYmxlIiwJCQkJU2hvd19UeFByZWFtYmxlX1Byb2N9LAorCXsiVHhQb3dlciIsCQkJCQlTaG93X1R4UG93ZXJfUHJvY30sCisJeyJDaGFubmVsIiwJCQkJCVNob3dfQ2hhbm5lbF9Qcm9jfSwKKwl7IkJHUHJvdGVjdGlvbiIsCQkJU2hvd19CR1Byb3RlY3Rpb25fUHJvY30sCisJeyJSVFNUaHJlc2hvbGQiLAkJCVNob3dfUlRTVGhyZXNob2xkX1Byb2N9LAorCXsiRnJhZ1RocmVzaG9sZCIsCQkJU2hvd19GcmFnVGhyZXNob2xkX1Byb2N9LAorI2lmZGVmIERPVDExX05fU1VQUE9SVAorCXsiSHRCdyIsCQkJCQlTaG93X0h0QndfUHJvY30sCisJeyJIdE1jcyIsCQkJCQlTaG93X0h0TWNzX1Byb2N9LAorCXsiSHRHaSIsCQkJCQlTaG93X0h0R2lfUHJvY30sCisJeyJIdE9wTW9kZSIsCQkJCVNob3dfSHRPcE1vZGVfUHJvY30sCisJeyJIdEV4dGNoYSIsCQkJCVNob3dfSHRFeHRjaGFfUHJvY30sCisJeyJIdE1wZHVEZW5zaXR5IiwJCQlTaG93X0h0TXBkdURlbnNpdHlfUHJvY30sCisJeyJIdEJhV2luU2l6ZSIsCQkgICAgICAgIFNob3dfSHRCYVdpblNpemVfUHJvY30sCisJeyJIdFJkZyIsCQkgICAgICAgIAlTaG93X0h0UmRnX1Byb2N9LAorCXsiSHRBbXNkdSIsCQkgICAgICAgIAlTaG93X0h0QW1zZHVfUHJvY30sCisJeyJIdEF1dG9CYSIsCQkgICAgICAgIFNob3dfSHRBdXRvQmFfUHJvY30sCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJeyJDb3VudHJ5UmVnaW9uIiwJCQlTaG93X0NvdW50cnlSZWdpb25fUHJvY30sCisJeyJDb3VudHJ5UmVnaW9uQUJhbmQiLAkJU2hvd19Db3VudHJ5UmVnaW9uQUJhbmRfUHJvY30sCisJeyJDb3VudHJ5Q29kZSIsCQkJCVNob3dfQ291bnRyeUNvZGVfUHJvY30sCisjaWZkZWYgQUdHUkVHQVRJT05fU1VQUE9SVAorCXsiUGt0QWdncmVnYXRlIiwJCQlTaG93X1BrdEFnZ3JlZ2F0ZV9Qcm9jfSwKKyNlbmRpZgorCisjaWZkZWYgV01NX1NVUFBPUlQKKwl7IldtbUNhcGFibGUiLAkJCQlTaG93X1dtbUNhcGFibGVfUHJvY30sCisjZW5kaWYKKwl7IklFRUU4MDIxMUgiLAkJCQlTaG93X0lFRUU4MDIxMUhfUHJvY30sCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisgICAgeyJOZXR3b3JrVHlwZSIsCQkJCVNob3dfTmV0d29ya1R5cGVfUHJvY30sCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJeyJBdXRoTW9kZSIsCQkJCVNob3dfQXV0aE1vZGVfUHJvY30sCisJeyJFbmNyeXBUeXBlIiwJCQkJU2hvd19FbmNyeXBUeXBlX1Byb2N9LAorCXsiRGVmYXVsdEtleUlEIiwJCQlTaG93X0RlZmF1bHRLZXlJRF9Qcm9jfSwKKwl7IktleTEiLAkJCQkJU2hvd19LZXkxX1Byb2N9LAorCXsiS2V5MiIsCQkJCQlTaG93X0tleTJfUHJvY30sCisJeyJLZXkzIiwJCQkJCVNob3dfS2V5M19Qcm9jfSwKKwl7IktleTQiLAkJCQkJU2hvd19LZXk0X1Byb2N9LAorCXsiV1BBUFNLIiwJCQkJCVNob3dfV1BBUFNLX1Byb2N9LAorCXtOVUxMLCBOVUxMfQorfTsKKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBHZXQgRHJpdmVyIHZlcnNpb24uCisKKyAgICBSZXR1cm46CisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQgU2V0X0RyaXZlclZlcnNpb25fUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJEcml2ZXIgdmVyc2lvbi0lc1xuIiwgU1RBX0RSSVZFUl9WRVJTSU9OKSk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKyAgICByZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgQ291bnRyeSBSZWdpb24uCisgICAgICAgIFRoaXMgY29tbWFuZCB3aWxsIG5vdCB3b3JrLCBpZiB0aGUgZmllbGQgb2YgQ291bnRyeVJlZ2lvbiBpbiBlZXByb20gaXMgcHJvZ3JhbW1lZC4KKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVCBTZXRfQ291bnRyeVJlZ2lvbl9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVTE9ORyByZWdpb247CisKKwlyZWdpb24gPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCisjaWZkZWYgRVhUX0JVSUxEX0NIQU5ORUxfTElTVAorCXJldHVybiAtRU9QTk9UU1VQUDsKKyNlbmRpZiAvLyBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUIC8vCisKKwkvLyBDb3VudHJ5IGNhbiBiZSBzZXQgb25seSB3aGVuIEVFUFJPTSBub3QgcHJvZ3JhbW1lZAorCWlmIChwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uICYgMHg4MCkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlNldF9Db3VudHJ5UmVnaW9uX1Byb2M6OnBhcmFtZXRlciBvZiBDb3VudHJ5UmVnaW9uIGluIGVlcHJvbSBpcyBwcm9ncmFtbWVkIFxuIikpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJaWYoKHJlZ2lvbiA+PSAwKSAmJiAocmVnaW9uIDw9IFJFR0lPTl9NQVhJTVVNX0JHX0JBTkQpKQorCXsKKwkJcEFkLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbiA9IChVQ0hBUikgcmVnaW9uOworCX0KKwllbHNlIGlmIChyZWdpb24gPT0gUkVHSU9OXzMxX0JHX0JBTkQpCisJeworCQlwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uID0gKFVDSEFSKSByZWdpb247CisJfQorCWVsc2UKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlNldF9Db3VudHJ5UmVnaW9uX1Byb2M6OnBhcmFtZXRlcnMgb3V0IG9mIHJhbmdlXG4iKSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwkvLyBpZiBzZXQgY291bnRyeSByZWdpb24sIGRyaXZlciBuZWVkcyB0byBiZSByZXNldAorCUJ1aWxkQ2hhbm5lbExpc3QocEFkKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9Db3VudHJ5UmVnaW9uX1Byb2M6OihDb3VudHJ5UmVnaW9uPSVkKVxuIiwgcEFkLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbikpOworCisJcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IENvdW50cnkgUmVnaW9uIGZvciBBIGJhbmQuCisgICAgICAgIFRoaXMgY29tbWFuZCB3aWxsIG5vdCB3b3JrLCBpZiB0aGUgZmllbGQgb2YgQ291bnRyeVJlZ2lvbiBpbiBlZXByb20gaXMgcHJvZ3JhbW1lZC4KKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVCBTZXRfQ291bnRyeVJlZ2lvbkFCYW5kX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCVVMT05HIHJlZ2lvbjsKKworCXJlZ2lvbiA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisKKyNpZmRlZiBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUCisJcmV0dXJuIC1FT1BOT1RTVVBQOworI2VuZGlmIC8vIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QgLy8KKworCS8vIENvdW50cnkgY2FuIGJlIHNldCBvbmx5IHdoZW4gRUVQUk9NIG5vdCBwcm9ncmFtbWVkCisJaWYgKHBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb25Gb3JBQmFuZCAmIDB4ODApCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJTZXRfQ291bnRyeVJlZ2lvbkFCYW5kX1Byb2M6OnBhcmFtZXRlciBvZiBDb3VudHJ5UmVnaW9uIGluIGVlcHJvbSBpcyBwcm9ncmFtbWVkIFxuIikpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJaWYoKHJlZ2lvbiA+PSAwKSAmJiAocmVnaW9uIDw9IFJFR0lPTl9NQVhJTVVNX0FfQkFORCkpCisJeworCQlwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uRm9yQUJhbmQgPSAoVUNIQVIpIHJlZ2lvbjsKKwl9CisJZWxzZQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiU2V0X0NvdW50cnlSZWdpb25BQmFuZF9Qcm9jOjpwYXJhbWV0ZXJzIG91dCBvZiByYW5nZVxuIikpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJLy8gaWYgc2V0IGNvdW50cnkgcmVnaW9uLCBkcml2ZXIgbmVlZHMgdG8gYmUgcmVzZXQKKwlCdWlsZENoYW5uZWxMaXN0KHBBZCk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfQ291bnRyeVJlZ2lvbkFCYW5kX1Byb2M6OihDb3VudHJ5UmVnaW9uPSVkKVxuIiwgcEFkLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbkZvckFCYW5kKSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgV2lyZWxlc3MgTW9kZQorICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UCVNldF9XaXJlbGVzc01vZGVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJVUxPTkcJV2lyZWxlc3NNb2RlOworCUlOVAkJc3VjY2VzcyA9IFRSVUU7CisKKwlXaXJlbGVzc01vZGUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCXsKKwkJSU5UIE1heFBoeU1vZGUgPSBQSFlfMTFHOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCU1heFBoeU1vZGUgPSBQSFlfMTFOXzVHOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJCWlmIChXaXJlbGVzc01vZGUgPD0gTWF4UGh5TW9kZSkKKwkJeworCQkJUlRNUFNldFBoeU1vZGUocEFkLCBXaXJlbGVzc01vZGUpOworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJaWYgKFdpcmVsZXNzTW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEKQorCQkJeworCQkJCXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BdXRvQkEgPSBUUlVFOworCQkJCXBBZC0+Q29tbW9uQ2ZnLlJFR0JBQ2FwYWJpbGl0eS5maWVsZC5BdXRvQkEgPSBUUlVFOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BdXRvQkEgPSBGQUxTRTsKKwkJCQlwQWQtPkNvbW1vbkNmZy5SRUdCQUNhcGFiaWxpdHkuZmllbGQuQXV0b0JBID0gRkFMU0U7CisJCQl9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCQkvLyBTZXQgQWRob2NNb2RlIHJhdGVzCisJCQlpZiAocEFkLT5TdGFDZmcuQnNzVHlwZSA9PSBCU1NfQURIT0MpCisJCQl7CisJCQkJTWxtZVVwZGF0ZVR4UmF0ZXMocEFkLCBGQUxTRSwgMCk7CisJCQkJTWFrZUlic3NCZWFjb24ocEFkKTsgICAgICAgICAgIC8vIHJlLWJ1aWxkIEJFQUNPTiBmcmFtZQorCQkJCUFzaWNFbmFibGVJYnNzU3luYyhwQWQpOyAgICAgICAvLyBjb3B5IHRvIG9uLWNoaXAgbWVtb3J5CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQlzdWNjZXNzID0gRkFMU0U7CisJCX0KKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwkvLyBpdCBpcyBuZWVkZWQgdG8gc2V0IFNTSUQgdG8gdGFrZSBlZmZlY3QKKwlpZiAoc3VjY2VzcyA9PSBUUlVFKQorCXsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJU2V0Q29tbW9uSFQocEFkKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X1dpcmVsZXNzTW9kZV9Qcm9jOjooPSVsZClcbiIsIFdpcmVsZXNzTW9kZSkpOworCX0KKwllbHNlCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJTZXRfV2lyZWxlc3NNb2RlX1Byb2M6OnBhcmFtZXRlcnMgb3V0IG9mIHJhbmdlXG4iKSk7CisJfQorCisJcmV0dXJuIHN1Y2Nlc3M7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IENoYW5uZWwKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVAlTZXRfQ2hhbm5lbF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKyAJSU5UCQlzdWNjZXNzID0gVFJVRTsKKwlVQ0hBUglDaGFubmVsOworCisJQ2hhbm5lbCA9IChVQ0hBUikgc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKworCS8vIGNoZWNrIGlmIHRoaXMgY2hhbm5lbCBpcyB2YWxpZAorCWlmIChDaGFubmVsU2FuaXR5KHBBZCwgQ2hhbm5lbCkgPT0gVFJVRSkKKwl7CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCXsKKwkJCXBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPSBDaGFubmVsOworCisJCQlpZiAoTU9OSVRPUl9PTihwQWQpKQorCQkJeworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJCU5fQ2hhbm5lbENoZWNrKHBBZCk7CisJCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCAmJgorCQkJCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlcgPT0gQldfNDApCisJCQkJeworCQkJCQlOX1NldENlbkNoKHBBZCk7CisJCQkJCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwsIEZBTFNFKTsKKwkJCQkJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwpOworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJCV180MCwgY29udHJvbF9jaGFubmVsKCVkKSwgQ2VudHJhbENoYW5uZWwoJWQpIFxuIiwKKwkJCQkJCQkJcEFkLT5Db21tb25DZmcuQ2hhbm5lbCwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwpKTsKKwkJCQl9CisJCQkJZWxzZQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQkJCXsKKwkJCQkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsLCBGQUxTRSk7CisJCQkJCUFzaWNMb2NrQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpOworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJCV18yMCwgQ2hhbm5lbCglZClcbiIsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpKTsKKwkJCQl9CisJCQl9CisJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwkJc3VjY2VzcyA9IFRSVUU7CisJfQorCWVsc2UKKwl7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJCXN1Y2Nlc3MgPSBGQUxTRTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwl9CisKKworCWlmIChzdWNjZXNzID09IFRSVUUpCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9DaGFubmVsX1Byb2M6OihDaGFubmVsPSVkKVxuIiwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkpOworCisJcmV0dXJuIHN1Y2Nlc3M7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IFNob3J0IFNsb3QgVGltZSBFbmFibGUgb3IgRGlzYWJsZQorICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UCVNldF9TaG9ydFNsb3RfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJVUxPTkcgU2hvcnRTbG90OworCisJU2hvcnRTbG90ID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKworCWlmIChTaG9ydFNsb3QgPT0gMSkKKwkJcEFkLT5Db21tb25DZmcuYlVzZVNob3J0U2xvdFRpbWUgPSBUUlVFOworCWVsc2UgaWYgKFNob3J0U2xvdCA9PSAwKQorCQlwQWQtPkNvbW1vbkNmZy5iVXNlU2hvcnRTbG90VGltZSA9IEZBTFNFOworCWVsc2UKKwkJcmV0dXJuIEZBTFNFOyAgLy9JbnZhbGlkIGFyZ3VtZW50CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfU2hvcnRTbG90X1Byb2M6OihTaG9ydFNsb3Q9JWQpXG4iLCBwQWQtPkNvbW1vbkNmZy5iVXNlU2hvcnRTbG90VGltZSkpOworCisJcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IFR4IHBvd2VyCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQJU2V0X1R4UG93ZXJfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJVUxPTkcgVHhQb3dlcjsKKwlJTlQgICBzdWNjZXNzID0gRkFMU0U7CisKKwlUeFBvd2VyID0gKFVMT05HKSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCWlmIChUeFBvd2VyIDw9IDEwMCkKKwl7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJeworCQkJcEFkLT5Db21tb25DZmcuVHhQb3dlckRlZmF1bHQgPSBUeFBvd2VyOworCQkJcEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UgPSBwQWQtPkNvbW1vbkNmZy5UeFBvd2VyRGVmYXVsdDsKKwkJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCQlzdWNjZXNzID0gVFJVRTsKKwl9CisJZWxzZQorCQlzdWNjZXNzID0gRkFMU0U7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfVHhQb3dlcl9Qcm9jOjooVHhQb3dlclBlcmNlbnRhZ2U9JWxkKVxuIiwgcEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UpKTsKKworCXJldHVybiBzdWNjZXNzOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCAxMUIvMTFHIFByb3RlY3Rpb24KKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVAlTZXRfQkdQcm90ZWN0aW9uX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCXN3aXRjaCAoc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKSkKKwl7CisJCWNhc2UgMDogLy9BVVRPCisJCQlwQWQtPkNvbW1vbkNmZy5Vc2VCR1Byb3RlY3Rpb24gPSAwOworCQkJYnJlYWs7CisJCWNhc2UgMTogLy9BbHdheXMgT24KKwkJCXBBZC0+Q29tbW9uQ2ZnLlVzZUJHUHJvdGVjdGlvbiA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAyOiAvL0Fsd2F5cyBPRkYKKwkJCXBBZC0+Q29tbW9uQ2ZnLlVzZUJHUHJvdGVjdGlvbiA9IDI7CisJCQlicmVhazsKKwkJZGVmYXVsdDogIC8vSW52YWxpZCBhcmd1bWVudAorCQkJcmV0dXJuIEZBTFNFOworCX0KKworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0JHUHJvdGVjdGlvbl9Qcm9jOjooQkdQcm90ZWN0aW9uPSVsZClcbiIsIHBBZC0+Q29tbW9uQ2ZnLlVzZUJHUHJvdGVjdGlvbikpOworCisJcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IFR4UHJlYW1ibGUKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVAlTZXRfVHhQcmVhbWJsZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlSVF84MDJfMTFfUFJFQU1CTEUJUHJlYW1ibGU7CisKKwlQcmVhbWJsZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisKKworCXN3aXRjaCAoUHJlYW1ibGUpCisJeworCQljYXNlIFJ0ODAyXzExUHJlYW1ibGVTaG9ydDoKKwkJCXBBZC0+Q29tbW9uQ2ZnLlR4UHJlYW1ibGUgPSBQcmVhbWJsZTsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCQkJTWxtZVNldFR4UHJlYW1ibGUocEFkLCBSdDgwMl8xMVByZWFtYmxlU2hvcnQpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCQkJYnJlYWs7CisJCWNhc2UgUnQ4MDJfMTFQcmVhbWJsZUxvbmc6CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCWNhc2UgUnQ4MDJfMTFQcmVhbWJsZUF1dG86CisJCQkvLyBpZiB1c2VyIHdhbnRzIEFVVE8sIGluaXRpYWxpemUgdG8gTE9ORyBoZXJlLCB0aGVuIGNoYW5nZSBhY2NvcmRpbmcgdG8gQVAncworCQkJLy8gY2FwYWJpbGl0eSB1cG9uIGFzc29jaWF0aW9uLgorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCQkJcEFkLT5Db21tb25DZmcuVHhQcmVhbWJsZSA9IFByZWFtYmxlOworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJCQlNbG1lU2V0VHhQcmVhbWJsZShwQWQsIFJ0ODAyXzExUHJlYW1ibGVMb25nKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwkJCWJyZWFrOworCQlkZWZhdWx0OiAvL0ludmFsaWQgYXJndW1lbnQKKwkJCXJldHVybiBGQUxTRTsKKwl9CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfVHhQcmVhbWJsZV9Qcm9jOjooVHhQcmVhbWJsZT0lbGQpXG4iLCBwQWQtPkNvbW1vbkNmZy5UeFByZWFtYmxlKSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgUlRTIFRocmVzaG9sZAorICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UCVNldF9SVFNUaHJlc2hvbGRfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJIE5ESVNfODAyXzExX1JUU19USFJFU0hPTEQgICAgICAgICAgIFJ0c1RocmVzaDsKKworCVJ0c1RocmVzaCA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisKKwlpZigoUnRzVGhyZXNoID4gMCkgJiYgKFJ0c1RocmVzaCA8PSBNQVhfUlRTX1RIUkVTSE9MRCkpCisJCXBBZC0+Q29tbW9uQ2ZnLlJ0c1RocmVzaG9sZCAgPSAoVVNIT1JUKVJ0c1RocmVzaDsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwllbHNlIGlmIChSdHNUaHJlc2ggPT0gMCkKKwkJcEFkLT5Db21tb25DZmcuUnRzVGhyZXNob2xkID0gTUFYX1JUU19USFJFU0hPTEQ7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJZWxzZQorCQlyZXR1cm4gRkFMU0U7IC8vSW52YWxpZCBhcmd1bWVudAorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X1JUU1RocmVzaG9sZF9Qcm9jOjooUlRTVGhyZXNob2xkPSVkKVxuIiwgcEFkLT5Db21tb25DZmcuUnRzVGhyZXNob2xkKSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgRnJhZ21lbnQgVGhyZXNob2xkCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQJU2V0X0ZyYWdUaHJlc2hvbGRfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJIE5ESVNfODAyXzExX0ZSQUdNRU5UQVRJT05fVEhSRVNIT0xEICAgICBGcmFnVGhyZXNoOworCisJRnJhZ1RocmVzaCA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisKKwlpZiAoRnJhZ1RocmVzaCA+IE1BWF9GUkFHX1RIUkVTSE9MRCB8fCBGcmFnVGhyZXNoIDwgTUlOX0ZSQUdfVEhSRVNIT0xEKQorCXsKKwkJLy9JbGxlZ2FsIEZyYWdUaHJlc2ggc28gd2Ugc2V0IGl0IHRvIGRlZmF1bHQKKwkJcEFkLT5Db21tb25DZmcuRnJhZ21lbnRUaHJlc2hvbGQgPSBNQVhfRlJBR19USFJFU0hPTEQ7CisJfQorCWVsc2UgaWYgKEZyYWdUaHJlc2ggJSAyID09IDEpCisJeworCQkvLyBUaGUgbGVuZ3RoIG9mIGVhY2ggZnJhZ21lbnQgc2hhbGwgYWx3YXlzIGJlIGFuIGV2ZW4gbnVtYmVyIG9mIG9jdGV0cywgZXhjZXB0IGZvciB0aGUgbGFzdCBmcmFnbWVudAorCQkvLyBvZiBhbiBNU0RVIG9yIE1NUERVLCB3aGljaCBtYXkgYmUgZWl0aGVyIGFuIGV2ZW4gb3IgYW4gb2RkIG51bWJlciBvZiBvY3RldHMuCisJCXBBZC0+Q29tbW9uQ2ZnLkZyYWdtZW50VGhyZXNob2xkID0gKFVTSE9SVCkoRnJhZ1RocmVzaCAtIDEpOworCX0KKwllbHNlCisJeworCQlwQWQtPkNvbW1vbkNmZy5GcmFnbWVudFRocmVzaG9sZCA9IChVU0hPUlQpRnJhZ1RocmVzaDsKKwl9CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCXsKKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkZyYWdtZW50VGhyZXNob2xkID09IE1BWF9GUkFHX1RIUkVTSE9MRCkKKwkJCXBBZC0+Q29tbW9uQ2ZnLmJVc2VaZXJvVG9EaXNhYmxlRnJhZ21lbnQgPSBUUlVFOworCQllbHNlCisJCQlwQWQtPkNvbW1vbkNmZy5iVXNlWmVyb1RvRGlzYWJsZUZyYWdtZW50ID0gRkFMU0U7CisJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0ZyYWdUaHJlc2hvbGRfUHJvYzo6KEZyYWdUaHJlc2hvbGQ9JWQpXG4iLCBwQWQtPkNvbW1vbkNmZy5GcmFnbWVudFRocmVzaG9sZCkpOworCisJcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IFR4QnVyc3QKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVAlTZXRfVHhCdXJzdF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVTE9ORyBUeEJ1cnN0OworCisJVHhCdXJzdCA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisJaWYgKFR4QnVyc3QgPT0gMSkKKwkJcEFkLT5Db21tb25DZmcuYkVuYWJsZVR4QnVyc3QgPSBUUlVFOworCWVsc2UgaWYgKFR4QnVyc3QgPT0gMCkKKwkJcEFkLT5Db21tb25DZmcuYkVuYWJsZVR4QnVyc3QgPSBGQUxTRTsKKwllbHNlCisJCXJldHVybiBGQUxTRTsgIC8vSW52YWxpZCBhcmd1bWVudAorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X1R4QnVyc3RfUHJvYzo6KFR4QnVyc3Q9JWQpXG4iLCBwQWQtPkNvbW1vbkNmZy5iRW5hYmxlVHhCdXJzdCkpOworCisJcmV0dXJuIFRSVUU7Cit9CisKKyNpZmRlZiBBR0dSRUdBVElPTl9TVVBQT1JUCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBUeEJ1cnN0CisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQJU2V0X1BrdEFnZ3JlZ2F0ZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVTE9ORyBhZ2dyZTsKKworCWFnZ3JlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKworCWlmIChhZ2dyZSA9PSAxKQorCQlwQWQtPkNvbW1vbkNmZy5iQWdncmVnYXRpb25DYXBhYmxlID0gVFJVRTsKKwllbHNlIGlmIChhZ2dyZSA9PSAwKQorCQlwQWQtPkNvbW1vbkNmZy5iQWdncmVnYXRpb25DYXBhYmxlID0gRkFMU0U7CisJZWxzZQorCQlyZXR1cm4gRkFMU0U7ICAvL0ludmFsaWQgYXJndW1lbnQKKworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X1BrdEFnZ3JlZ2F0ZV9Qcm9jOjooQUdHUkU9JWQpXG4iLCBwQWQtPkNvbW1vbkNmZy5iQWdncmVnYXRpb25DYXBhYmxlKSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKyNlbmRpZgorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBJRUVFODAyMTFILgorICAgICAgICBUaGlzIHBhcmFtZXRlciBpcyAxIHdoZW4gbmVlZHMgcmFkYXIgZGV0ZWN0aW9uLCBvdGhlcndpc2UgMAorICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UCVNldF9JRUVFODAyMTFIX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworICAgIFVMT05HIGllZWU4MDIxMWg7CisKKwlpZWVlODAyMTFoID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKworCWlmIChpZWVlODAyMTFoID09IDEpCisJCXBBZC0+Q29tbW9uQ2ZnLmJJRUVFODAyMTFIID0gVFJVRTsKKwllbHNlIGlmIChpZWVlODAyMTFoID09IDApCisJCXBBZC0+Q29tbW9uQ2ZnLmJJRUVFODAyMTFIID0gRkFMU0U7CisJZWxzZQorCQlyZXR1cm4gRkFMU0U7ICAvL0ludmFsaWQgYXJndW1lbnQKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9JRUVFODAyMTFIX1Byb2M6OihJRUVFODAyMTFIPSVkKVxuIiwgcEFkLT5Db21tb25DZmcuYklFRUU4MDIxMUgpKTsKKworCXJldHVybiBUUlVFOworfQorCisKKyNpZmRlZiBEQkcKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgRm9yIERlYnVnIGluZm9ybWF0aW9uCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQJU2V0X0RlYnVnX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PiBTZXRfRGVidWdfUHJvYyAqKioqKioqKioqKioqKioqKioqXG4iKSk7CisKKyAgICBpZihzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApIDw9IFJUX0RFQlVHX0xPVUQpCisgICAgICAgIFJURGVidWdMZXZlbCA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT0gU2V0X0RlYnVnX1Byb2MoUlREZWJ1Z0xldmVsID0gJWxkKVxuIiwgUlREZWJ1Z0xldmVsKSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKyNlbmRpZgorCitJTlQJU2hvd19EZXNjSW5mb19Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKworCXJldHVybiBUUlVFOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFJlc2V0IHN0YXRpc3RpY3MgY291bnRlcgorCisgICAgQXJndW1lbnRzOgorICAgICAgICBwQWRhcHRlciAgICAgICAgICAgIFBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKyAgICAgICAgYXJnCisKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVAlTZXRfUmVzZXRTdGF0Q291bnRlcl9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwkvL1VDSEFSICAgICAgICAgICBpOworCS8vTUFDX1RBQkxFX0VOVFJZICpwRW50cnk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT5TZXRfUmVzZXRTdGF0Q291bnRlcl9Qcm9jXG4iKSk7CisKKwkvLyBhZGQgdGhlIG1vc3QgdXAtdG8tZGF0ZSBoL3cgcmF3IGNvdW50ZXJzIGludG8gc29mdHdhcmUgY291bnRlcnMKKwlOSUNVcGRhdGVSYXdDb3VudGVycyhwQWQpOworCisJTmRpc1plcm9NZW1vcnkoJnBBZC0+V2xhbkNvdW50ZXJzLCBzaXplb2YoQ09VTlRFUl84MDJfMTEpKTsKKwlOZGlzWmVyb01lbW9yeSgmcEFkLT5Db3VudGVyczgwMjMsIHNpemVvZihDT1VOVEVSXzgwMl8zKSk7CisJTmRpc1plcm9NZW1vcnkoJnBBZC0+UmFsaW5rQ291bnRlcnMsIHNpemVvZihDT1VOVEVSX1JBTElOSykpOworCisJLy8gUmVzZXQgSG90U3BvdCBjb3VudGVyCisjaWYgMCAvLyBUb0RvLgorCWZvciAoaSA9IDA7IGkgPCBNQVhfTEVOX09GX01BQ19UQUJMRTsgaSsrKQorCXsKKwkJcEVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbaV07CisKKwkJaWYgKChwRW50cnktPlZhbGlkID09IEZBTFNFKSB8fCAocEVudHJ5LT5Tc3QgIT0gU1NUX0FTU09DKSkKKwkJCWNvbnRpbnVlOworCisJCXBFbnRyeS0+SFNDb3VudGVyLkxhc3REYXRhUGFja2V0VGltZSA9IDA7CisJCXBFbnRyeS0+SFNDb3VudGVyLlRvdGFsUnhCeXRlQ291bnQ9IDA7CisJCXBFbnRyeS0+SFNDb3VudGVyLlRvdGFsVHhCeXRlQ291bnQ9IDA7CisJfQorI2VuZGlmCisKKworCXJldHVybiBUUlVFOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJQWRkIFdQQSBrZXkgcHJvY2Vzcy4KKwkJSW4gQWRob2MgV1BBTk9ORSwgYlBhaXJ3aXNlID0gMDsgIEtleUlkeCA9IDA7CisKKwlBcmd1bWVudHM6CisJCXBBZCAJCQkJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKwkJcEJ1ZgkJCQkJCQlQb2ludGVyIHRvIHRoZSB3aGVyZSB0aGUga2V5IHN0b3JlZAorCisJUmV0dXJuIFZhbHVlOgorCQlORElTX1NVQ0NFU1MJCQkJCUFkZCBrZXkgc3VjY2Vzc2Z1bGx5CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCisjaWYgMCAvLyByZW1vdmUgYnkgQWxiZXJ0WQorTkRJU19TVEFUVVMgUlRNUFdQQUFkZEtleVByb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFZPSUQJCQlwQnVmKQoreworCVBORElTXzgwMl8xMV9LRVkJcEtleTsKKwlVTE9ORwkJCQlLZXlJZHg7CisvLwlORElTX1NUQVRVUyAJCVN0YXR1czsKKy8vCVVMT05HIAlvZmZzZXQ7CS8vIHVudXNlZCB2YXJpYWJsZSwgc25vd3BpbiAyMDA2LjA3LjEzCisKKwlQVUNIQVIJCXBUeE1pYywgcFJ4TWljOworCUJPT0xFQU4gCWJUeEtleTsgCQkvLyBTZXQgdGhlIGtleSBhcyB0cmFuc21pdCBrZXkKKwlCT09MRUFOIAliUGFpcndpc2U7CQkvLyBJbmRpY2F0ZSB0aGUga2V5IGlzIHBhaXJ3aXNlIGtleQorCUJPT0xFQU4gCWJLZXlSU0M7CQkvLyBpbmRpY2F0ZSB0aGUgcmVjZWl2ZSAgU0Mgc2V0IGJ5IEtleVJTQyB2YWx1ZS4KKwkJCQkJCQkJLy8gT3RoZXJ3aXNlLCBpdCB3aWxsIHNldCBieSB0aGUgTklDLgorCUJPT0xFQU4gCWJBdXRoZW50aWNhdG9yOyAvLyBpbmRpY2F0ZSBrZXkgaXMgc2V0IGJ5IGF1dGhlbnRpY2F0b3IuCisJVUNIQVIJCWFwaWR4ID0gQlNTMDsKKworCXBLZXkgPSAoUE5ESVNfODAyXzExX0tFWSkgcEJ1ZjsKKwlLZXlJZHggPSBwS2V5LT5LZXlJbmRleCAmIDB4ZmY7CisJLy8gQml0IDMxIG9mIEFkZC1rZXksIFR4IEtleQorCWJUeEtleQkJICAgPSAocEtleS0+S2V5SW5kZXggJiAweDgwMDAwMDAwKSA/IFRSVUUgOiBGQUxTRTsKKwkvLyBCaXQgMzAgb2YgQWRkLWtleSBQYWlyd2lzZUtleQorCWJQYWlyd2lzZQkgICA9IChwS2V5LT5LZXlJbmRleCAmIDB4NDAwMDAwMDApID8gVFJVRSA6IEZBTFNFOworCS8vIEJpdCAyOSBvZiBBZGQta2V5IEtleVJTQworCWJLZXlSU0MgCSAgID0gKHBLZXktPktleUluZGV4ICYgMHgyMDAwMDAwMCkgPyBUUlVFIDogRkFMU0U7CisJLy8gQml0IDI4IG9mIEFkZC1rZXkgQXV0aGVudGljYXRvcgorCWJBdXRoZW50aWNhdG9yID0gKHBLZXktPktleUluZGV4ICYgMHgxMDAwMDAwMCkgPyBUUlVFIDogRkFMU0U7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJUTVBXUEFBZGRLZXlQcm9jPT0+cEtleS0+S2V5SW5kZXggPSAleC4gYlBhaXJ3aXNlPSAlZFxuIiwgcEtleS0+S2V5SW5kZXgsIGJQYWlyd2lzZSkpOworCS8vIDEuIENoZWNrIEdyb3VwIC8gUGFpcndpc2UgS2V5CisJaWYgKGJQYWlyd2lzZSkJLy8gUGFpcndpc2UgS2V5CisJeworCQkvLyAxLiBLZXlJZHggbXVzdCBiZSAwLCBvdGhlcndpc2UsIHJldHVybiBORElTX1NUQVRVU19JTlZBTElEX0RBVEEKKwkJaWYgKEtleUlkeCAhPSAwKQorCQkJcmV0dXJuKE5ESVNfU1RBVFVTX0lOVkFMSURfREFUQSk7CisKKwkJLy8gMi4gQ2hlY2sgYlR4LCBpdCBtdXN0IGJlIHRydWUsIG90aGVyd2lzZSwgcmV0dXJuIE5ESVNfU1RBVFVTX0lOVkFMSURfREFUQQorCQlpZiAoYlR4S2V5ID09IEZBTFNFKQorCQkJcmV0dXJuKE5ESVNfU1RBVFVTX0lOVkFMSURfREFUQSk7CisKKwkJLy8gMy4gSWYgQlNTSUQgaXMgYWxsIDB4ZmYsIHJldHVybiBORElTX1NUQVRVU19JTlZBTElEX0RBVEEKKwkJaWYgKE1BQ19BRERSX0VRVUFMKHBLZXktPkJTU0lELCBCUk9BRENBU1RfQUREUikpCisJCQlyZXR1cm4oTkRJU19TVEFUVVNfSU5WQUxJRF9EQVRBKTsKKworCQkvLyAzLjEgQ2hlY2sgUGFpcndpc2Uga2V5IGxlbmd0aCBmb3IgVEtJUCBrZXkuIEZvciBBRVMsIGl0J3MgYWx3YXlzIDEyOCBiaXRzCisJCS8vaWYgKChwQWRhcHRlci0+UG9ydENmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkgJiYgKHBLZXktPktleUxlbmd0aCAhPSBMRU5fVEtJUF9LRVkpKQorCQlpZiAoKHBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkgJiYgKHBLZXktPktleUxlbmd0aCAhPSBMRU5fVEtJUF9LRVkpKQorCQkJcmV0dXJuKE5ESVNfU1RBVFVTX0lOVkFMSURfREFUQSk7CisKKwkJcEFkLT5TaGFyZWRLZXlbYXBpZHhdW0tleUlkeF0uVHlwZSA9IFBBSVJXSVNFX0tFWTsKKworCQlpZiAocEFkLT5BcENmZy5NQlNTSURbYXBpZHhdLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIpCisJCXsKKwkJCS8vIFNlbmQgbWVkaWEgc3BlY2lmaWMgZXZlbnQgdG8gc3RhcnQgUE1LSUQgY2FjaGluZworCQkJUlRNUEluZGljYXRlV1BBMlN0YXR1cyhwQWQpOworCQl9CisJfQorCWVsc2UKKwl7CisJCS8vIDEuIENoZWNrIEJTU0lELCBpZiBub3QgY3VycmVudCBCU1NJRCBvciBCY2FzdCwgcmV0dXJuIE5ESVNfU1RBVFVTX0lOVkFMSURfREFUQQorCQlpZiAoKCEgTUFDX0FERFJfRVFVQUwocEtleS0+QlNTSUQsIEJST0FEQ0FTVF9BRERSKSkgJiYKKwkJCSghIE1BQ19BRERSX0VRVUFMKHBLZXktPkJTU0lELCBwQWQtPkFwQ2ZnLk1CU1NJRFthcGlkeF0uQnNzaWQpKSkKKwkJCXJldHVybihORElTX1NUQVRVU19JTlZBTElEX0RBVEEpOworCisJCS8vIDIuIENoZWNrIEtleSBpbmRleCBmb3Igc3VwcG9ydGVkIEdyb3VwIEtleQorCQlpZiAoS2V5SWR4ID49IEdST1VQX0tFWV9OVU0pCisJCQlyZXR1cm4oTkRJU19TVEFUVVNfSU5WQUxJRF9EQVRBKTsKKworCQkvLyAzLiBTZXQgYXMgZGVmYXVsdCBUeCBLZXkgaWYgYlR4S2V5IGlzIFRSVUUKKwkJaWYgKGJUeEtleSA9PSBUUlVFKQorCQkJcEFkLT5BcENmZy5NQlNTSURbYXBpZHhdLkRlZmF1bHRLZXlJZCA9IChVQ0hBUikgS2V5SWR4OworCisJCXBBZC0+U2hhcmVkS2V5W2FwaWR4XVtLZXlJZHhdLlR5cGUgPSBHUk9VUF9LRVk7CisJfQorCisJLy8gNC4gU2VsZWN0IFJ4TWljIC8gVHhNaWMgYmFzZWQgb24gU3VwcCAvIEF1dGhlbnRpY2F0b3IKKwlpZiAocEFkLT5BcENmZy5NQlNTSURbYXBpZHhdLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmUpCisJeworCQkvLyBmb3IgV1BBLU5vbmUgVHgsIFJ4IE1JQyBpcyB0aGUgc2FtZQorCQlwVHhNaWMgPSAoUFVDSEFSKSAoJnBLZXktPktleU1hdGVyaWFsKSArIDE2OworCQlwUnhNaWMgPSBwVHhNaWM7CisJfQorCWVsc2UgaWYgKGJBdXRoZW50aWNhdG9yID09IFRSVUUpCisJeworCQlwVHhNaWMgPSAoUFVDSEFSKSAoJnBLZXktPktleU1hdGVyaWFsKSArIDE2OworCQlwUnhNaWMgPSAoUFVDSEFSKSAoJnBLZXktPktleU1hdGVyaWFsKSArIDI0OworCX0KKwllbHNlCisJeworCQlwUnhNaWMgPSAoUFVDSEFSKSAoJnBLZXktPktleU1hdGVyaWFsKSArIDE2OworCQlwVHhNaWMgPSAoUFVDSEFSKSAoJnBLZXktPktleU1hdGVyaWFsKSArIDI0OworCX0KKworCS8vIDYuIENoZWNrIFJ4VHNjCisJaWYgKGJLZXlSU0MgPT0gVFJVRSkKKwl7CisJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W2FwaWR4XVtLZXlJZHhdLlJ4VHNjLCAmcEtleS0+S2V5UlNDLCA2KTsKKwkJTmRpc01vdmVNZW1vcnkocEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5QYWlyd2lzZUtleS5SeFRzYywgJnBLZXktPktleVJTQywgNik7CisJfQorCWVsc2UKKwl7CisJCU5kaXNaZXJvTWVtb3J5KHBBZC0+U2hhcmVkS2V5W2FwaWR4XVtLZXlJZHhdLlJ4VHNjLCA2KTsKKwl9CisKKwkvLyA3LiBDb3B5IGluZm9ybWF0aW9uIGludG8gUGFpcndpc2UgS2V5IHN0cnVjdHVyZS4KKwkvLyBwS2V5LT5LZXlMZW5ndGggd2lsbCBpbmNsdWRlIFR4TWljIGFuZCBSeE1pYywgdGhlcmVmb3JlLCB3ZSB1c2UgMTYgYnl0ZXMgaGFyZGNvZGVkLgorCXBBZC0+U2hhcmVkS2V5W2FwaWR4XVtLZXlJZHhdLktleUxlbiA9IChVQ0hBUikgcEtleS0+S2V5TGVuZ3RoOworCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUGFpcndpc2VLZXkuS2V5TGVuID0gKFVDSEFSKXBLZXktPktleUxlbmd0aDsKKwlOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLktleSwgJnBLZXktPktleU1hdGVyaWFsLCAxNik7CisJTmRpc01vdmVNZW1vcnkocEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5QYWlyd2lzZUtleS5LZXksICZwS2V5LT5LZXlNYXRlcmlhbCwgMTYpOworCWlmIChwS2V5LT5LZXlMZW5ndGggPT0gTEVOX1RLSVBfS0VZKQorCXsKKwkJLy8gT25seSBLZXkgbGVudGggZXF1YWwgdG8gVEtJUCBrZXkgaGF2ZSB0aGVzZQorCQlOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVthcGlkeF1bS2V5SWR4XS5SeE1pYywgcFJ4TWljLCA4KTsKKwkJTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbYXBpZHhdW0tleUlkeF0uVHhNaWMsIHBUeE1pYywgOCk7CisJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUGFpcndpc2VLZXkuUnhNaWMsIHBSeE1pYywgOCk7CisJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUGFpcndpc2VLZXkuVHhNaWMsIHBUeE1pYywgOCk7CisJfQorCisJQ09QWV9NQUNfQUREUihwQWQtPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLkJzc0lkLCBwS2V5LT5CU1NJRCk7CisKKwkvLyBJbml0IFR4VHNjIHRvIG9uZSBiYXNlZCBvbiBXaUZpIFdQQSBzcGVjcworCXBBZC0+U2hhcmVkS2V5W2FwaWR4XVtLZXlJZHhdLlR4VHNjWzBdID0gMTsKKwlwQWQtPlNoYXJlZEtleVthcGlkeF1bS2V5SWR4XS5UeFRzY1sxXSA9IDA7CisJcEFkLT5TaGFyZWRLZXlbYXBpZHhdW0tleUlkeF0uVHhUc2NbMl0gPSAwOworCXBBZC0+U2hhcmVkS2V5W2FwaWR4XVtLZXlJZHhdLlR4VHNjWzNdID0gMDsKKwlwQWQtPlNoYXJlZEtleVthcGlkeF1bS2V5SWR4XS5UeFRzY1s0XSA9IDA7CisJcEFkLT5TaGFyZWRLZXlbYXBpZHhdW0tleUlkeF0uVHhUc2NbNV0gPSAwOworCS8vIDQuIEluaXQgVHhUc2MgdG8gb25lIGJhc2VkIG9uIFdpRmkgV1BBIHNwZWNzCisJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5QYWlyd2lzZUtleS5UeFRzY1swXSA9IDE7CisJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5QYWlyd2lzZUtleS5UeFRzY1sxXSA9IDA7CisJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5QYWlyd2lzZUtleS5UeFRzY1syXSA9IDA7CisJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5QYWlyd2lzZUtleS5UeFRzY1szXSA9IDA7CisJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5QYWlyd2lzZUtleS5UeFRzY1s0XSA9IDA7CisJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5QYWlyd2lzZUtleS5UeFRzY1s1XSA9IDA7CisKKwlpZiAocEFkLT5BcENmZy5NQlNTSURbYXBpZHhdLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQorCXsKKwkJcEFkLT5TaGFyZWRLZXlbYXBpZHhdW0tleUlkeF0uQ2lwaGVyQWxnID0gQ0lQSEVSX0FFUzsKKwkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5QYWlyd2lzZUtleS5DaXBoZXJBbGcgPSBDSVBIRVJfQUVTOworCX0KKwllbHNlIGlmIChwQWQtPkFwQ2ZnLk1CU1NJRFthcGlkeF0uV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpCisJeworCQlwQWQtPlNoYXJlZEtleVthcGlkeF1bS2V5SWR4XS5DaXBoZXJBbGcgPSBDSVBIRVJfVEtJUDsKKwkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5QYWlyd2lzZUtleS5DaXBoZXJBbGcgPSBDSVBIRVJfVEtJUDsKKwl9CisJZWxzZSBpZiAocEFkLT5BcENmZy5NQlNTSURbYXBpZHhdLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjFFbmFibGVkKQorCXsKKwkJaWYgKHBBZC0+U2hhcmVkS2V5W2FwaWR4XVtLZXlJZHhdLktleUxlbiA9PSA1KQorCQl7CisJCQlwQWQtPlNoYXJlZEtleVthcGlkeF1bS2V5SWR4XS5DaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7CisJCQlwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlBhaXJ3aXNlS2V5LkNpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKKwkJfQorCQllbHNlIGlmIChwQWQtPlNoYXJlZEtleVthcGlkeF1bS2V5SWR4XS5LZXlMZW4gPT0gMTMpCisJCXsKKwkJCXBBZC0+U2hhcmVkS2V5W2FwaWR4XVtLZXlJZHhdLkNpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7CisJCQlwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlBhaXJ3aXNlS2V5LkNpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7CisJCX0KKwkJZWxzZQorCQl7CisJCQlwQWQtPlNoYXJlZEtleVthcGlkeF1bS2V5SWR4XS5DaXBoZXJBbGcgPSBDSVBIRVJfTk9ORTsKKwkJCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUGFpcndpc2VLZXkuQ2lwaGVyQWxnID0gQ0lQSEVSX05PTkU7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJcEFkLT5TaGFyZWRLZXlbYXBpZHhdW0tleUlkeF0uQ2lwaGVyQWxnID0gQ0lQSEVSX05PTkU7CisJCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUGFpcndpc2VLZXkuQ2lwaGVyQWxnID0gQ0lQSEVSX05PTkU7CisJfQorCisJaWYgKChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKSkgIC8vIFBhaXJ3aXNlIEtleS4gQWRkIEJTU0lEIHRvIFdDVGFibGUKKwl7CisJCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUGFpcndpc2VLZXkuQ2lwaGVyQWxnID0gcEFkLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5DaXBoZXJBbGc7CisJCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUGFpcndpc2VLZXkuS2V5TGVuID0gcEFkLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5LZXlMZW47CisJfQorCisJaWYgKChwQWQtPkFwQ2ZnLk1CU1NJRFthcGlkeF0uQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikgfHwKKwkJKHBBZC0+QXBDZmcuTUJTU0lEW2FwaWR4XS5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKSkKKwl7CisJCS8vCisJCS8vIE9uIFdQQTIsIFVwZGF0ZSBHcm91cCBLZXkgQ2lwaGVyLgorCQkvLworCQlpZiAoIWJQYWlyd2lzZSkKKwkJeworCQkJaWYgKHBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCisJCQkJcEFkLT5TaGFyZWRLZXlbYXBpZHhdW0tleUlkeF0uQ2lwaGVyQWxnID0gQ0lQSEVSX0FFUzsKKwkJCWVsc2UgaWYgKHBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpCisJCQkJcEFkLT5TaGFyZWRLZXlbYXBpZHhdW0tleUlkeF0uQ2lwaGVyQWxnID0gQ0lQSEVSX1RLSVA7CisJCX0KKwl9CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJwQWQtPlNoYXJlZEtleVslZF1bJWRdLkNpcGhlckFsZyA9ICVkXG4iLCBhcGlkeCwgS2V5SWR4LCBwQWQtPlNoYXJlZEtleVthcGlkeF1bS2V5SWR4XS5DaXBoZXJBbGcpKTsKKworI2lmIDAKKwlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiJXMgS2V5ICMlZCIsIENpcGhlck5hbWVbcEFkLT5TaGFyZWRLZXlbYXBpZHhdW0tleUlkeF0uQ2lwaGVyQWxnXSxLZXlJZHgpKTsKKwlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKwl7CisJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCIlMDJ4OiIsIHBBZC0+U2hhcmVkS2V5W2FwaWR4XVtLZXlJZHhdLktleVtpXSkpOworCX0KKwlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiXG4JICBSeCBNSUMgS2V5ID0gIikpOworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJeworCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiJTAyeDoiLCBwQWQtPlNoYXJlZEtleVthcGlkeF1bS2V5SWR4XS5SeE1pY1tpXSkpOworCX0KKwlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiXG4JICBUeCBNSUMgS2V5ID0gIikpOworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJeworCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiJTAyeDoiLCBwQWQtPlNoYXJlZEtleVthcGlkeF1bS2V5SWR4XS5UeE1pY1tpXSkpOworCX0KKwlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiXG4JICBSeFRTQyA9ICIpKTsKKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCXsKKwkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIiUwMng6IiwgcEFkLT5TaGFyZWRLZXlbYXBpZHhdW0tleUlkeF0uUnhUc2NbaV0pKTsKKwl9CisjZW5kaWYKKwlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiXG4gcEtleS0+IEJTU0lEOiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IFxuIiwKKwkJcEtleS0+QlNTSURbMF0scEtleS0+QlNTSURbMV0scEtleS0+QlNTSURbMl0scEtleS0+QlNTSURbM10scEtleS0+QlNTSURbNF0scEtleS0+QlNTSURbNV0pKTsKKworCWlmICgoYlR4S2V5KSAmJiAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkpICAvLyBQYWlyd2lzZSBLZXkuIEFkZCBCU1NJRCB0byBXQ1RhYmxlCisJCVJUTVBBZGRCU1NJRENpcGhlcihwQWQsIEJTU0lEX1dDSUQsIHBLZXksIHBBZC0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uQ2lwaGVyQWxnKTsKKworCisJLy8gTm8gbWF0dGVyIHBhaXJ3aXNlIGtleSBvciB3aGF0IGxleWlkeCBpcywgYWx3YXlzIGhhcyBhIGNvcHkgYXQgb24tY2hpcCBTaGFyZWRLZXl0YWJsZS4KKwlBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkLAorCQkJCQkJICBhcGlkeCwKKwkJCQkJCSAgKFVDSEFSKUtleUlkeCwKKwkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbYXBpZHhdW0tleUlkeF0uQ2lwaGVyQWxnLAorCQkJCQkJICBwQWQtPlNoYXJlZEtleVthcGlkeF1bS2V5SWR4XS5LZXksCisJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W2FwaWR4XVtLZXlJZHhdLlR4TWljLAorCQkJCQkJICBwQWQtPlNoYXJlZEtleVthcGlkeF1bS2V5SWR4XS5SeE1pYyk7CisKKwkvLyBUaGUgV0NJRCBrZXkgc3BlY2lmaWVkIGluIHVzZWQgYXQgVHguIEZvciBTVEEsIGFsd2F5cyB1c2UgcGFpcndpc2Uga2V5LgorCisJLy8gYWQtaG9jIG1vZGUgbmVlZCB0byBzcGVjaWZ5IFdBUCBHcm91cCBrZXkgd2l0aCBXQ0lEIGluZGV4PUJTUzBNY2FzdF9XQ0lELiBMZXQncyBhbHdheXMgc2V0IHRoaXMga2V5IGhlcmUuCisvKglpZiAoYlBhaXJ3aXNlID09IEZBTFNFKQorCXsKKwkJb2Zmc2V0ID0gTUFDX0lWRUlWX1RBQkxFX0JBU0UgKyAoQlNTME1jYXN0X1dDSUQgKiBIV19JVkVJVl9FTlRSWV9TSVpFKTsKKwkJTmRpc1plcm9NZW1vcnkoSVZFSVYsIDgpOworCQkvLyAxLiBJVi9FSVYKKwkJLy8gU3BlY2lmeSBrZXkgaW5kZXggdG8gZmluZCBzaGFyZWQga2V5LgorCQlpZiAoKHBBZC0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uQ2lwaGVyQWxnPT1DSVBIRVJfVEtJUCkgfHwKKwkJCShwQWQtPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLkNpcGhlckFsZz09Q0lQSEVSX0FFUykpCisJCUlWRUlWWzNdID0gMHgyMDsJCS8vIEVpdiBiaXQgb24uIGtleWlkIGFsd2F5cyAwIGZvciBwYWlyd2lzZSBrZXkKKwkJSVZFSVZbM10gfD0gKEtleUlkeDw8IDYpOwkvLyBncm91cGtleSBpbmRleCBpcyBub3QgMAorCQlmb3IgKGk9MDsgaTw4OyBpKyspCisJCXsKKwkJCVJUTVBfSU9fV1JJVEU4KHBBZCwgb2Zmc2V0K2ksIElWRUlWW2ldKTsKKwkJfQorCisJCS8vIDIuIFdDSUQgQXR0cmlidXRlIFVERjozLCBCU1NJZHg6MywgQWxnOjMsIEtleXRhYmxlOnVzZSBzaGFyZSBrZXksIEJTU0lkeCBpcyAwCisJCVdDSURBdHRyaSA9IChwQWQtPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLkNpcGhlckFsZzw8MSl8UEFJUldJU0VLRVlUQUJMRTsKKwkJb2Zmc2V0ID0gTUFDX1dDSURfQVRUUklCVVRFX0JBU0UgKyAoQlNTME1jYXN0X1dDSUQqIEhXX1dDSURfQVRUUklfU0laRSk7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIG9mZnNldCwgV0NJREF0dHJpKTsKKworCX0KKworKi8KKworICAgaWYgKHBBZC0+U2hhcmVkS2V5W2FwaWR4XVtLZXlJZHhdLlR5cGUgPT0gR1JPVVBfS0VZKQorCXsKKwkJLy8gODAyLjF4IHBvcnQgY29udHJvbAorCQlwQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIiEhV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQhIVxuIikpOworCisJfQorCisJcmV0dXJuIChORElTX1NUQVRVU19TVUNDRVNTKTsKK30KKyNlbmRpZgorCitCT09MRUFOIFJUTVBDaGVja1N0clByaW50QWJsZSgKKyAgICBJTiAgQ0hBUiAqcEluUHV0U3RyLAorICAgIElOICBVQ0hBUiBzdHJMZW4pCit7CisgICAgVUNIQVIgaT0wOworCisgICAgZm9yIChpPTA7IGk8c3RyTGVuOyBpKyspCisgICAgeworICAgICAgICBpZiAoKHBJblB1dFN0cltpXSA8IDB4MjEpIHx8CisgICAgICAgICAgICAocEluUHV0U3RyW2ldID4gMHg3RSkpCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlSZW1vdmUgV1BBIEtleSBwcm9jZXNzCisKKwlBcmd1bWVudHM6CisJCXBBZCAJCQkJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKwkJcEJ1ZgkJCQkJCQlQb2ludGVyIHRvIHRoZSB3aGVyZSB0aGUga2V5IHN0b3JlZAorCisJUmV0dXJuIFZhbHVlOgorCQlORElTX1NVQ0NFU1MJCQkJCUFkZCBrZXkgc3VjY2Vzc2Z1bGx5CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCitWT0lEICAgIFJUTVBTZXREZXNpcmVkUmF0ZXMoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgTE9ORyAgICAgICAgICAgIFJhdGVzKQoreworICAgIE5ESVNfODAyXzExX1JBVEVTIGFyeVJhdGVzOworCisgICAgbWVtc2V0KCZhcnlSYXRlcywgMHgwMCwgc2l6ZW9mKE5ESVNfODAyXzExX1JBVEVTKSk7CisgICAgc3dpdGNoIChwQWRhcHRlci0+Q29tbW9uQ2ZnLlBoeU1vZGUpCisgICAgeworICAgICAgICBjYXNlIFBIWV8xMUE6IC8vIEEgb25seQorICAgICAgICAgICAgc3dpdGNoIChSYXRlcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIDYwMDAwMDA6IC8vNk0KKyAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMF0gPSAweDBjOyAvLyA2TQorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTXzA7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgOTAwMDAwMDogLy85TQorICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1swXSA9IDB4MTI7IC8vIDlNCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfMTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAxMjAwMDAwMDogLy8xMk0KKyAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMF0gPSAweDE4OyAvLyAxMk0KKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU18yOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDE4MDAwMDAwOiAvLzE4TQorICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1swXSA9IDB4MjQ7IC8vIDE4TQorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTXzM7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMjQwMDAwMDA6IC8vMjRNCisgICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzBdID0gMHgzMDsgLy8gMjRNCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfNDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAzNjAwMDAwMDogLy8zNk0KKyAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMF0gPSAweDQ4OyAvLyAzNk0KKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU181OworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDQ4MDAwMDAwOiAvLzQ4TQorICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1swXSA9IDB4NjA7IC8vIDQ4TQorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTXzY7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgNTQwMDAwMDA6IC8vNTRNCisgICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzBdID0gMHg2YzsgLy8gNTRNCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfNzsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAtMTogLy9BdXRvCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMF0gPSAweDZjOyAvLyA1NE1icHMKKyAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMV0gPSAweDYwOyAvLyA0OE1icHMKKyAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMl0gPSAweDQ4OyAvLyAzNk1icHMKKyAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbM10gPSAweDMwOyAvLyAyNE1icHMKKyAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbNF0gPSAweDI0OyAvLyAxOE0KKyAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbNV0gPSAweDE4OyAvLyAxMk0KKyAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbNl0gPSAweDEyOyAvLyA5TQorICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1s3XSA9IDB4MGM7IC8vIDZNCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfQVVUTzsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBQSFlfMTFCR19NSVhFRDogLy8gQi9HIE1peGVkCisgICAgICAgIGNhc2UgUEhZXzExQjogLy8gQiBvbmx5CisgICAgICAgIGNhc2UgUEhZXzExQUJHX01JWEVEOiAvLyBBL0IvRyBNaXhlZAorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgc3dpdGNoIChSYXRlcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIDEwMDAwMDA6IC8vMU0KKyAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMF0gPSAweDAyOworICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTXzA7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMjAwMDAwMDogLy8yTQorICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1swXSA9IDB4MDQ7CisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfMTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSA1MDAwMDAwOiAvLzUuNU0KKyAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMF0gPSAweDBiOyAvLyA1LjVNCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfMjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAxMTAwMDAwMDogLy8xMU0KKyAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMF0gPSAweDE2OyAvLyAxMU0KKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU18zOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDYwMDAwMDA6IC8vNk0KKyAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMF0gPSAweDBjOyAvLyA2TQorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTXzA7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgOTAwMDAwMDogLy85TQorICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1swXSA9IDB4MTI7IC8vIDlNCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfMTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAxMjAwMDAwMDogLy8xMk0KKyAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMF0gPSAweDE4OyAvLyAxMk0KKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU18yOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDE4MDAwMDAwOiAvLzE4TQorICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1swXSA9IDB4MjQ7IC8vIDE4TQorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTXzM7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMjQwMDAwMDA6IC8vMjRNCisgICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzBdID0gMHgzMDsgLy8gMjRNCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfNDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAzNjAwMDAwMDogLy8zNk0KKyAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMF0gPSAweDQ4OyAvLyAzNk0KKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU181OworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDQ4MDAwMDAwOiAvLzQ4TQorICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1swXSA9IDB4NjA7IC8vIDQ4TQorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTXzY7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgNTQwMDAwMDA6IC8vNTRNCisgICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzBdID0gMHg2YzsgLy8gNTRNCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfNzsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAtMTogLy9BdXRvCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFCKQorICAgICAgICAgICAgICAgICAgICB7IC8vQiBPbmx5CisgICAgICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1swXSA9IDB4MTY7IC8vIDExTWJwcworICAgICAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMV0gPSAweDBiOyAvLyA1LjVNYnBzCisgICAgICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1syXSA9IDB4MDQ7IC8vIDJNYnBzCisgICAgICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1szXSA9IDB4MDI7IC8vIDFNYnBzCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7IC8vKEIvRykgTWl4ZWQgb3IgKEEvQi9HKSBNaXhlZAorICAgICAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMF0gPSAweDZjOyAvLyA1NE1icHMKKyAgICAgICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzFdID0gMHg2MDsgLy8gNDhNYnBzCisgICAgICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1syXSA9IDB4NDg7IC8vIDM2TWJwcworICAgICAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbM10gPSAweDMwOyAvLyAyNE1icHMKKyAgICAgICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzRdID0gMHgxNjsgLy8gMTFNYnBzCisgICAgICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1s1XSA9IDB4MGI7IC8vIDUuNU1icHMKKyAgICAgICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzZdID0gMHgwNDsgLy8gMk1icHMKKyAgICAgICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzddID0gMHgwMjsgLy8gMU1icHMKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTX0FVVE87CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgTmRpc1plcm9NZW1vcnkocEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVSYXRlLCBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUyk7CisgICAgTmRpc01vdmVNZW1vcnkocEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVSYXRlLCAmYXJ5UmF0ZXMsIHNpemVvZihORElTXzgwMl8xMV9SQVRFUykpOworICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiBSVE1QU2V0RGVzaXJlZFJhdGVzICglMDJ4LCUwMngsJTAyeCwlMDJ4LCUwMngsJTAyeCwlMDJ4LCUwMngpXG4iLAorICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbMF0scEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzFdLAorICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbMl0scEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzNdLAorICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbNF0scEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzVdLAorICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbNl0scEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzddICkpOworICAgIC8vIENoYW5naW5nIERlc2lyZWRSYXRlIG1heSBhZmZlY3QgdGhlIE1BWCBUWCByYXRlIHdlIHVzZWQgdG8gVFggZnJhbWVzIG91dAorICAgIE1sbWVVcGRhdGVUeFJhdGVzKHBBZGFwdGVyLCBGQUxTRSwgMCk7Cit9CisKK05ESVNfU1RBVFVTIFJUTVBXUEFSZW1vdmVLZXlQcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBWT0lECQkJcEJ1ZikKK3sKKwlQTkRJU184MDJfMTFfUkVNT1ZFX0tFWSBwS2V5OworCVVMT05HCQkJCQlLZXlJZHg7CisJTkRJU19TVEFUVVMgCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfRkFJTFVSRTsKKwlCT09MRUFOIAliVHhLZXk7IAkJLy8gU2V0IHRoZSBrZXkgYXMgdHJhbnNtaXQga2V5CisJQk9PTEVBTiAJYlBhaXJ3aXNlOwkJLy8gSW5kaWNhdGUgdGhlIGtleSBpcyBwYWlyd2lzZSBrZXkKKwlCT09MRUFOIAliS2V5UlNDOwkJLy8gaW5kaWNhdGUgdGhlIHJlY2VpdmUgIFNDIHNldCBieSBLZXlSU0MgdmFsdWUuCisJCQkJCQkJCS8vIE90aGVyd2lzZSwgaXQgd2lsbCBzZXQgYnkgdGhlIE5JQy4KKwlCT09MRUFOIAliQXV0aGVudGljYXRvcjsgLy8gaW5kaWNhdGUga2V5IGlzIHNldCBieSBhdXRoZW50aWNhdG9yLgorCUlOVCAJCWk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIi0tLT4gUlRNUFdQQVJlbW92ZUtleVByb2NcbiIpKTsKKworCXBLZXkgPSAoUE5ESVNfODAyXzExX1JFTU9WRV9LRVkpIHBCdWY7CisJS2V5SWR4ID0gcEtleS0+S2V5SW5kZXggJiAweGZmOworCS8vIEJpdCAzMSBvZiBBZGQta2V5LCBUeCBLZXkKKwliVHhLZXkJCSAgID0gKHBLZXktPktleUluZGV4ICYgMHg4MDAwMDAwMCkgPyBUUlVFIDogRkFMU0U7CisJLy8gQml0IDMwIG9mIEFkZC1rZXkgUGFpcndpc2VLZXkKKwliUGFpcndpc2UJICAgPSAocEtleS0+S2V5SW5kZXggJiAweDQwMDAwMDAwKSA/IFRSVUUgOiBGQUxTRTsKKwkvLyBCaXQgMjkgb2YgQWRkLWtleSBLZXlSU0MKKwliS2V5UlNDIAkgICA9IChwS2V5LT5LZXlJbmRleCAmIDB4MjAwMDAwMDApID8gVFJVRSA6IEZBTFNFOworCS8vIEJpdCAyOCBvZiBBZGQta2V5IEF1dGhlbnRpY2F0b3IKKwliQXV0aGVudGljYXRvciA9IChwS2V5LT5LZXlJbmRleCAmIDB4MTAwMDAwMDApID8gVFJVRSA6IEZBTFNFOworCisJLy8gMS4gSWYgYlR4IGlzIFRSVUUsIHJldHVybiBmYWlsdXJlIGluZm9ybWF0aW9uCisJaWYgKGJUeEtleSA9PSBUUlVFKQorCQlyZXR1cm4oTkRJU19TVEFUVVNfSU5WQUxJRF9EQVRBKTsKKworCS8vIDIuIENoZWNrIFBhaXJ3aXNlIEtleQorCWlmIChiUGFpcndpc2UpCisJeworCQkvLyBhLiBJZiBCU1NJRCBpcyBicm9hZGNhc3QsIHJlbW92ZSBhbGwgcGFpcndpc2Uga2V5cy4KKwkJLy8gYi4gSWYgbm90IGJyb2FkY2FzdCwgcmVtb3ZlIHRoZSBwYWlyd2lzZSBzcGVjaWZpZWQgYnkgQlNTSUQKKwkJZm9yIChpID0gMDsgaSA8IFNIQVJFX0tFWV9OVU07IGkrKykKKwkJeworCQkJaWYgKE1BQ19BRERSX0VRVUFMKHBBZC0+U2hhcmVkS2V5W0JTUzBdW2ldLkJzc0lkLCBwS2V5LT5CU1NJRCkpCisJCQl7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSVE1QV1BBUmVtb3ZlS2V5UHJvYyhLZXlJZHg9JWQpXG4iLCBpKSk7CisJCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1baV0uS2V5TGVuID0gMDsKKwkJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtpXS5DaXBoZXJBbGcgPSBDSVBIRVJfTk9ORTsKKwkJCQlBc2ljUmVtb3ZlU2hhcmVkS2V5RW50cnkocEFkLCBCU1MwLCAoVUNIQVIpaSk7CisJCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKwkvLyAzLiBHcm91cCBLZXkKKwllbHNlCisJeworCQkvLyBhLiBJZiBCU1NJRCBpcyBicm9hZGNhc3QsIHJlbW92ZSBhbGwgZ3JvdXAga2V5cyBpbmRleGVkCisJCS8vIGIuIElmIEJTU0lEIG1hdGNoZWQsIGRlbGV0ZSB0aGUgZ3JvdXAga2V5IGluZGV4ZWQuCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUlRNUFdQQVJlbW92ZUtleVByb2MoS2V5SWR4PSVsZClcbiIsIEtleUlkeCkpOworCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLktleUxlbiA9IDA7CisJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uQ2lwaGVyQWxnID0gQ0lQSEVSX05PTkU7CisJCUFzaWNSZW1vdmVTaGFyZWRLZXlFbnRyeShwQWQsIEJTUzAsIChVQ0hBUilLZXlJZHgpOworCQlTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworCX0KKworCXJldHVybiAoU3RhdHVzKTsKK30KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJUmVtb3ZlIEFsbCBXUEEgS2V5cworCisJQXJndW1lbnRzOgorCQlwQWQgCQkJCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJUlRNUFdQQVJlbW92ZUFsbEtleXMoCisJSU4JUFJUTVBfQURBUFRFUglwQWQpCit7CisKKwlVQ0hBUiAJaTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUlRNUFdQQVJlbW92ZUFsbEtleXMoQXV0aE1vZGU9JWQsIFdlcFN0YXR1cz0lZClcbiIsIHBBZC0+U3RhQ2ZnLkF1dGhNb2RlLCBwQWQtPlN0YUNmZy5XZXBTdGF0dXMpKTsKKworCS8vIEZvciBXRVAvQ0tJUCwgdGhlcmUgaXMgbm8gbmVlZCB0byByZW1vdmUgaXQsIHNpbmNlIFdpblhQIHdvbid0IHNldCBpdCBhZ2FpbiBhZnRlcgorCS8vIExpbmsgdXAuIEFuZCBpdCB3aWxsIGJlIHJlcGxhY2VkIGlmIHVzZXIgY2hhbmdlZCBpdC4KKwlpZiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPCBOZGlzODAyXzExQXV0aE1vZGVXUEEpCisJCXJldHVybjsKKworCS8vIEZvciBXUEEtTm9uZSwgdGhlcmUgaXMgbm8gbmVlZCB0byByZW1vdmUgaXQsIHNpbmNlIFdpblhQIHdvbid0IHNldCBpdCBhZ2FpbiBhZnRlcgorCS8vIExpbmsgdXAuIEFuZCBpdCB3aWxsIGJlIHJlcGxhY2VkIGlmIHVzZXIgY2hhbmdlZCBpdC4KKwlpZiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZSkKKwkJcmV0dXJuOworCisJLy8gc2V0IEJTU0lEIHdjaWQgZW50cnkgb2YgdGhlIFBhaXItd2lzZSBLZXkgdGFibGUgYXMgbm8tc2VjdXJpdHkgbW9kZQorCUFzaWNSZW1vdmVQYWlyd2lzZUtleUVudHJ5KHBBZCwgQlNTMCwgQlNTSURfV0NJRCk7CisKKwkvLyBzZXQgYWxsIHNoYXJlZCBrZXkgbW9kZSBhcyBuby1zZWN1cml0eS4KKwlmb3IgKGkgPSAwOyBpIDwgU0hBUkVfS0VZX05VTTsgaSsrKQorICAgIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJyZW1vdmUgJXMga2V5ICMlZFxuIiwgQ2lwaGVyTmFtZVtwQWQtPlNoYXJlZEtleVtCU1MwXVtpXS5DaXBoZXJBbGddLCBpKSk7CisJCU5kaXNaZXJvTWVtb3J5KCZwQWQtPlNoYXJlZEtleVtCU1MwXVtpXSwgc2l6ZW9mKENJUEhFUl9LRVkpKTsKKworCQlBc2ljUmVtb3ZlU2hhcmVkS2V5RW50cnkocEFkLCBCU1MwLCBpKTsKKwl9CisKK30KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlDaGFuZ2UgTklDIFBIWSBtb2RlLiBSZS1hc3NvY2lhdGlvbiBtYXkgYmUgbmVjZXNzYXJ5LiBwb3NzaWJsZSBzZXR0aW5ncworCQlpbmNsdWRlIC0gUEhZXzExQiwgUEhZXzExQkdfTUlYRUQsIFBIWV8xMUEsIGFuZCBQSFlfMTFBQkdfTUlYRUQKKworCUFyZ3VtZW50czoKKwkJcEFkIC0gUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCQlwaHltb2RlICAtCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlSVE1QU2V0UGh5TW9kZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVTE9ORyBwaHltb2RlKQoreworCUlOVCBpOworCS8vIHRoZSBzZWxlY3RlZCBwaHltb2RlIG11c3QgYmUgc3VwcG9ydGVkIGJ5IHRoZSBSRiBJQyBlbmNvZGVkIGluIEUyUFJPTQorCisJLy8gaWYgbm8gY2hhbmdlLCBkbyBub3RoaW5nCisJLyogYnVnIGZpeAorCWlmIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IHBoeW1vZGUpCisJCXJldHVybjsKKyAgICAqLworCXBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPSAoVUNIQVIpcGh5bW9kZTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUlRNUFNldFBoeU1vZGUgOiBQaHlNb2RlPSVkLCBjaGFubmVsPSVkIFxuIiwgcEFkLT5Db21tb25DZmcuUGh5TW9kZSwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkpOworI2lmZGVmIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QKKwlCdWlsZENoYW5uZWxMaXN0RXgocEFkKTsKKyNlbHNlCisJQnVpbGRDaGFubmVsTGlzdChwQWQpOworI2VuZGlmIC8vIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QgLy8KKworCS8vIHNhbml0eSBjaGVjayB1c2VyIHNldHRpbmcKKwlmb3IgKGkgPSAwOyBpIDwgcEFkLT5DaGFubmVsTGlzdE51bTsgaSsrKQorCXsKKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPT0gcEFkLT5DaGFubmVsTGlzdFtpXS5DaGFubmVsKQorCQkJYnJlYWs7CisJfQorCisJaWYgKGkgPT0gcEFkLT5DaGFubmVsTGlzdE51bSkKKwl7CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCQlwQWQtPkNvbW1vbkNmZy5DaGFubmVsID0gRmlyc3RDaGFubmVsKHBBZCk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlJUTVBTZXRQaHlNb2RlOiBjaGFubmVsIGlzIG91dCBvZiByYW5nZSwgdXNlIGZpcnN0IGNoYW5uZWw9JWQgXG4iLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKSk7CisJfQorCisJTmRpc1plcm9NZW1vcnkocEFkLT5Db21tb25DZmcuU3VwUmF0ZSwgTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVMpOworCU5kaXNaZXJvTWVtb3J5KHBBZC0+Q29tbW9uQ2ZnLkV4dFJhdGUsIE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTKTsKKwlOZGlzWmVyb01lbW9yeShwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlLCBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUyk7CisJc3dpdGNoIChwaHltb2RlKSB7CisJCWNhc2UgUEhZXzExQjoKKwkJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVbMF0gID0gMHg4MjsJICAvLyAxIG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzLCBiYXNpYyByYXRlCisJCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlWzFdICA9IDB4ODQ7CSAgLy8gMiBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcywgYmFzaWMgcmF0ZQorCQkJcEFkLT5Db21tb25DZmcuU3VwUmF0ZVsyXSAgPSAweDhCOwkgIC8vIDUuNSBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcywgYmFzaWMgcmF0ZQorCQkJcEFkLT5Db21tb25DZmcuU3VwUmF0ZVszXSAgPSAweDk2OwkgIC8vIDExIG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzLCBiYXNpYyByYXRlCisJCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlTGVuICA9IDQ7CisJCQlwQWQtPkNvbW1vbkNmZy5FeHRSYXRlTGVuICA9IDA7CisJCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzBdICA9IDI7CSAgIC8vIDEgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbMV0gID0gNDsJICAgLy8gMiBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVsyXSAgPSAxMTsgICAgLy8gNS41IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCisJCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzNdICA9IDIyOyAgICAvLyAxMSBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQkJLy9wQWQtPkNvbW1vbkNmZy5IVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfQ0NLOyAvLyBUaGlzIE1PREUgaXMgb25seSBGWUkuIG5vdCB1c2UKKwkJCWJyZWFrOworCisJCWNhc2UgUEhZXzExRzoKKwkJY2FzZSBQSFlfMTFCR19NSVhFRDoKKwkJY2FzZSBQSFlfMTFBQkdfTUlYRUQ6CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCWNhc2UgUEhZXzExTl8yXzRHOgorCQljYXNlIFBIWV8xMUFCR05fTUlYRUQ6CisJCWNhc2UgUEhZXzExQkdOX01JWEVEOgorCQljYXNlIFBIWV8xMUdOX01JWEVEOgorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQkJcEFkLT5Db21tb25DZmcuU3VwUmF0ZVswXSAgPSAweDgyOwkgIC8vIDEgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMsIGJhc2ljIHJhdGUKKwkJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVbMV0gID0gMHg4NDsJICAvLyAyIG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzLCBiYXNpYyByYXRlCisJCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlWzJdICA9IDB4OEI7CSAgLy8gNS41IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzLCBiYXNpYyByYXRlCisJCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlWzNdICA9IDB4OTY7CSAgLy8gMTEgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMsIGJhc2ljIHJhdGUKKwkJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVbNF0gID0gMHgxMjsJICAvLyA5IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCisJCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlWzVdICA9IDB4MjQ7CSAgLy8gMTggbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVbNl0gID0gMHg0ODsJICAvLyAzNiBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQkJcEFkLT5Db21tb25DZmcuU3VwUmF0ZVs3XSAgPSAweDZjOwkgIC8vIDU0IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCisJCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlTGVuICA9IDg7CisJCQlwQWQtPkNvbW1vbkNmZy5FeHRSYXRlWzBdICA9IDB4MEM7CSAgLy8gNiBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQkJcEFkLT5Db21tb25DZmcuRXh0UmF0ZVsxXSAgPSAweDE4OwkgIC8vIDEyIG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCisJCQlwQWQtPkNvbW1vbkNmZy5FeHRSYXRlWzJdICA9IDB4MzA7CSAgLy8gMjQgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJCXBBZC0+Q29tbW9uQ2ZnLkV4dFJhdGVbM10gID0gMHg2MDsJICAvLyA0OCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQkJcEFkLT5Db21tb25DZmcuRXh0UmF0ZUxlbiAgPSA0OworCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVswXSAgPSAyOwkgICAvLyAxIG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCisJCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzFdICA9IDQ7CSAgIC8vIDIgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbMl0gID0gMTE7ICAgIC8vIDUuNSBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVszXSAgPSAyMjsgICAgLy8gMTEgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbNF0gID0gMTI7ICAgIC8vIDYgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbNV0gID0gMTg7ICAgIC8vIDkgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbNl0gID0gMjQ7ICAgIC8vIDEyIG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCisJCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzddICA9IDM2OyAgICAvLyAxOCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVs4XSAgPSA0ODsgICAgLy8gMjQgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbOV0gID0gNzI7ICAgIC8vIDM2IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCisJCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzEwXSA9IDk2OyAgICAvLyA0OCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVsxMV0gPSAxMDg7ICAgLy8gNTQgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJCWJyZWFrOworCisJCWNhc2UgUEhZXzExQToKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJY2FzZSBQSFlfMTFBTl9NSVhFRDoKKwkJY2FzZSBQSFlfMTFBR05fTUlYRUQ6CisJCWNhc2UgUEhZXzExTl81RzoKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVbMF0gID0gMHg4QzsJICAvLyA2IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzLCBiYXNpYyByYXRlCisJCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlWzFdICA9IDB4MTI7CSAgLy8gOSBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQkJcEFkLT5Db21tb25DZmcuU3VwUmF0ZVsyXSAgPSAweDk4OwkgIC8vIDEyIG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzLCBiYXNpYyByYXRlCisJCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlWzNdICA9IDB4MjQ7CSAgLy8gMTggbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVbNF0gID0gMHhiMDsJICAvLyAyNCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcywgYmFzaWMgcmF0ZQorCQkJcEFkLT5Db21tb25DZmcuU3VwUmF0ZVs1XSAgPSAweDQ4OwkgIC8vIDM2IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCisJCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlWzZdICA9IDB4NjA7CSAgLy8gNDggbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVbN10gID0gMHg2YzsJICAvLyA1NCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQkJcEFkLT5Db21tb25DZmcuU3VwUmF0ZUxlbiAgPSA4OworCQkJcEFkLT5Db21tb25DZmcuRXh0UmF0ZUxlbiAgPSAwOworCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVswXSAgPSAxMjsgICAgLy8gNiBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVsxXSAgPSAxODsgICAgLy8gOSBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVsyXSAgPSAyNDsgICAgLy8gMTIgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbM10gID0gMzY7ICAgIC8vIDE4IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCisJCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzRdICA9IDQ4OyAgICAvLyAyNCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVs1XSAgPSA3MjsgICAgLy8gMzYgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbNl0gID0gOTY7ICAgIC8vIDQ4IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCisJCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzddICA9IDEwODsgICAvLyA1NCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQkJLy9wQWQtPkNvbW1vbkNmZy5IVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfT0ZETTsgLy8gVGhpcyBNT0RFIGlzIG9ubHkgRllJLiBub3QgdXNlCisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJfQorCisKKwlwQWQtPkNvbW1vbkNmZy5CYW5kU3RhdGUgPSBVTktOT1dOX0JBTkQ7Cit9CisKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlDYWxsZXIgZW5zdXJlcyB3ZSBoYXMgODAyLjExbiBzdXBwb3J0LgorCQlDYWxscyBhdCBzZXR0aW5nIEhUIGZyb20gQVAvU1RBU2V0aW5mb3JtYXRpb24KKworCUFyZ3VtZW50czoKKwkJcEFkIC0gUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCQlwaHltb2RlICAtCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECVJUTVBTZXRIVCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglPSURfU0VUX0hUX1BIWU1PREUgKnBIVFBoeU1vZGUpCit7CisJLy9VTE9ORwkqcG1jczsKKwlVSU5UMzIJVmFsdWUgPSAwOworCVVDSEFSCUJCUFZhbHVlID0gMDsKKwlVQ0hBUglCQlAzVmFsdWUgPSAwOworCVVDSEFSCVJ4U3RyZWFtID0gcEFkLT5Db21tb25DZmcuUnhTdHJlYW07CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVE1QU2V0SFQgOiBIVF9tb2RlKCVkKSwgRXh0T2Zmc2V0KCVkKSwgTUNTKCVkKSwgQlcoJWQpLCBTVEJDKCVkKSwgU0hPUlRHSSglZClcbiIsCisJCQkJCQkJCQkJcEhUUGh5TW9kZS0+SHRNb2RlLCBwSFRQaHlNb2RlLT5FeHRPZmZzZXQsCisJCQkJCQkJCQkJcEhUUGh5TW9kZS0+TUNTLCBwSFRQaHlNb2RlLT5CVywKKwkJCQkJCQkJCQlwSFRQaHlNb2RlLT5TVEJDLCBwSFRQaHlNb2RlLT5TSE9SVEdJKSk7CisKKwkvLyBEb24ndCB6ZXJvIHN1cHBvcnRlZEh5UGh5IHN0cnVjdHVyZS4KKwlSVE1QWmVyb01lbW9yeSgmcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5LCBzaXplb2YocEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5KSk7CisJUlRNUFplcm9NZW1vcnkoJnBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mbywgc2l6ZW9mKHBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mbykpOworCVJUTVBaZXJvTWVtb3J5KCZwQWQtPkNvbW1vbkNmZy5OZXdFeHRDaGFuT2Zmc2V0LCBzaXplb2YocEFkLT5Db21tb25DZmcuTmV3RXh0Q2hhbk9mZnNldCkpOworCVJUTVBaZXJvTWVtb3J5KCZwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHksIHNpemVvZihwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkpKTsKKworICAgCWlmIChwQWQtPkNvbW1vbkNmZy5iUmRnKQorCXsKKwkJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5LkV4dEh0Q2FwSW5mby5QbHVzSFRDID0gMTsKKwkJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5LkV4dEh0Q2FwSW5mby5SREdTdXBwb3J0ID0gMTsKKwl9CisJZWxzZQorCXsKKwkJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5LkV4dEh0Q2FwSW5mby5QbHVzSFRDID0gMDsKKwkJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5LkV4dEh0Q2FwSW5mby5SREdTdXBwb3J0ID0gMDsKKwl9CisKKwlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBQYXJtLk1heFJBbXBkdUZhY3RvciA9IDM7CisJcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5Lk1heFJBbXBkdUZhY3RvciA9IDM7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVE1QU2V0SFQgOiBSeEJBV2luTGltaXQgPSAlZFxuIiwgcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlJ4QkFXaW5MaW1pdCkpOworCisJLy8gTWltbyBwb3dlciBzYXZlLCBBLU1TRFUgc2l6ZSwKKwlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQW1zZHVFbmFibGUgPSAoVVNIT1JUKXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BbXNkdUVuYWJsZTsKKwlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQW1zZHVTaXplID0gKFVDSEFSKXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BbXNkdVNpemU7CisJcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5Lk1pbW9QcyA9IChVQ0hBUilwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTU1QU21vZGU7CisJcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5Lk1wZHVEZW5zaXR5ID0gKFVDSEFSKXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5NcGR1RGVuc2l0eTsKKworCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQU1zZHVTaXplID0gKFVTSE9SVClwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQW1zZHVTaXplOworCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uTWltb1BzID0gKFVTSE9SVClwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTU1QU21vZGU7CisJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwUGFybS5NcGR1RGVuc2l0eSA9IChVQ0hBUilwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTXBkdURlbnNpdHk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVE1QU2V0SFQgOiBBTXNkdVNpemUgPSAlZCwgTWltb1BzID0gJWQsIE1wZHVEZW5zaXR5ID0gJWQsIE1heFJBbXBkdUZhY3RvciA9ICVkXG4iLAorCQkJCQkJCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5BbXNkdVNpemUsCisJCQkJCQkJCQkJCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5Lk1pbW9QcywKKwkJCQkJCQkJCQkJCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuTXBkdURlbnNpdHksCisJCQkJCQkJCQkJCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5Lk1heFJBbXBkdUZhY3RvcikpOworCisJaWYocEhUUGh5TW9kZS0+SHRNb2RlID09IEhUTU9ERV9HRikKKwl7CisJCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uR0YgPSAxOworCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuR0YgPSAxOworCX0KKwllbHNlCisJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5HRiA9IDA7CisKKwkvLyBEZWNpZGUgUnggTUNTU2V0CisJc3dpdGNoIChSeFN0cmVhbSkKKwl7CisJCWNhc2UgMToKKwkJCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMF0gPSAgMHhmZjsKKwkJCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMV0gPSAgMHgwMDsKKwkJCWJyZWFrOworCisJCWNhc2UgMjoKKwkJCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMF0gPSAgMHhmZjsKKwkJCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMV0gPSAgMHhmZjsKKwkJCWJyZWFrOworCisJCWNhc2UgMzogLy8gMyozCisJCQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuTUNTU2V0WzBdID0gIDB4ZmY7CisJCQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuTUNTU2V0WzFdID0gIDB4ZmY7CisJCQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuTUNTU2V0WzJdID0gIDB4ZmY7CisJCQlicmVhazsKKwl9CisKKwlpZiAocEFkLT5Db21tb25DZmcuYkZvcnR5X01oel9JbnRvbGVyYW50ICYmIChwQWQtPkNvbW1vbkNmZy5DaGFubmVsIDw9IDE0KSAmJiAocEhUUGh5TW9kZS0+QlcgPT0gQldfNDApICkKKwl7CisJCXBIVFBoeU1vZGUtPkJXID0gQldfMjA7CisJCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uRm9ydHlfTWh6X0ludG9sZXJhbnQgPSAxOworCX0KKworCWlmKHBIVFBoeU1vZGUtPkJXID09IEJXXzQwKQorCXsKKwkJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lk1DU1NldFs0XSA9IDB4MTsgLy8gTUNTIDMyCisJCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQ2hhbm5lbFdpZHRoID0gMTsKKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPD0gMTQpCisJCQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkNDS21vZGVpbjQwID0gMTsKKworCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQ2hhbm5lbFdpZHRoID0gMTsKKwkJcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLkFkZEh0SW5mby5SZWNvbVdpZHRoID0gMTsKKwkJcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLkFkZEh0SW5mby5FeHRDaGFuT2Zmc2V0ID0gKHBIVFBoeU1vZGUtPkV4dE9mZnNldCA9PSBFWFRDSEFfQkVMT1cpPyAoRVhUQ0hBX0JFTE9XKTogRVhUQ0hBX0FCT1ZFOworCQkvLyBTZXQgUmVnc2l0ZXIgZm9yIGV4dGVuc2lvbiBjaGFubmVsIHBvc2l0aW9uLgorCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0JBTkRfQ0ZHLCAmVmFsdWUpOworCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsICZCQlAzVmFsdWUpOworCQlpZiAoKHBIVFBoeU1vZGUtPkV4dE9mZnNldCA9PSBFWFRDSEFfQkVMT1cpKQorCQl7CisJCQlWYWx1ZSB8PSAweDE7CisJCQlCQlAzVmFsdWUgfD0gKDB4MjApOworCQkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfQkFORF9DRkcsIFZhbHVlKTsKKwkJfQorCQllbHNlIGlmICgocEhUUGh5TW9kZS0+RXh0T2Zmc2V0ID09IEVYVENIQV9BQk9WRSkpCisJCXsKKwkJCVZhbHVlICY9IDB4ZmU7CisJCQlCQlAzVmFsdWUgJj0gKH4weDIwKTsKKwkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX0JBTkRfQ0ZHLCBWYWx1ZSk7CisJCX0KKworCQkvLyBUdXJuIG9uIEJCUCA0ME1IeiBtb2RlIG5vdyBvbmx5IGFzIEFQIC4KKwkJLy8gU3RhIGNhbiB0dXJuIG9uIEJCUCA0ME1IeiBhZnRlciBjb25uZWN0aW9uIHdpdGggNDBNSHogQVAuIFN0YSBvbmx5IGJyb2FkY2FzdCA0ME1IeiBjYXBhYmlsaXR5IGJlZm9yZSBjb25uZWN0aW9uLgorCQlpZiAoKHBBZC0+T3BNb2RlID09IE9QTU9ERV9BUCkgfHwgSU5GUkFfT04ocEFkKSB8fCBBREhPQ19PTihwQWQpCisJCQkpCisJCXsKKwkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgJkJCUFZhbHVlKTsKKwkJCUJCUFZhbHVlICY9ICh+MHgxOCk7CisJCQlCQlBWYWx1ZSB8PSAweDEwOworCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgQkJQVmFsdWUpOworCisJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCBCQlAzVmFsdWUpOworCQkJcEFkLT5Db21tb25DZmcuQkJQQ3VycmVudEJXID0gQldfNDA7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5DaGFubmVsV2lkdGggPSAwOworCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQ2hhbm5lbFdpZHRoID0gMDsKKwkJcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLkFkZEh0SW5mby5SZWNvbVdpZHRoID0gMDsKKwkJcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLkFkZEh0SW5mby5FeHRDaGFuT2Zmc2V0ID0gRVhUQ0hBX05PTkU7CisJCXBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsID0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbDsKKwkJLy8gVHVybiBvbiBCQlAgMjBNSHogbW9kZSBieSByZXF1ZXN0IGhlcmUuCisJCXsKKwkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgJkJCUFZhbHVlKTsKKwkJCUJCUFZhbHVlICY9ICh+MHgxOCk7CisJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCBCQlBWYWx1ZSk7CisJCQlwQWQtPkNvbW1vbkNmZy5CQlBDdXJyZW50QlcgPSBCV18yMDsKKwkJfQorCX0KKworCWlmKHBIVFBoeU1vZGUtPlNUQkMgPT0gU1RCQ19VU0UpCisJeworCQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLlR4U1RCQyA9IDE7CisJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5UeFNUQkMgPSAxOworCQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLlJ4U1RCQyA9IDE7CisJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5SeFNUQkMgPSAxOworCX0KKwllbHNlCisJeworCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuVHhTVEJDID0gMDsKKwkJcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LlJ4U1RCQyA9IDA7CisJfQorCisjaWZkZWYgUlQyODcwCisJLyogRnJhbmsgcmVjb21tZW5kICxJZiBub3QsIFR4IG1heWJlIGJsb2NrIGluIGhpZ2ggcG93ZXIuIFJ4IGhhcyBubyBwcm9ibGVtKi8KKwlpZihJU19SVDMwNzAocEFkKSAmJiAoKHBBZC0+UmZJY1R5cGUgPT0gUkZJQ18zMDIwKSB8fCAocEFkLT5SZkljVHlwZSA9PSBSRklDXzIwMjApKSkKKwl7CisJCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uVHhTVEJDID0gMDsKKwkJcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LlR4U1RCQyA9IDA7CisJfQorI2VuZGlmIC8vIFJUMjg3MCAvLworCisJaWYocEhUUGh5TW9kZS0+U0hPUlRHSSA9PSBHSV80MDApCisJeworCQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLlNob3J0R0lmb3IyMCA9IDE7CisJCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uU2hvcnRHSWZvcjQwID0gMTsKKwkJcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LlNob3J0R0lmb3IyMCA9IDE7CisJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5TaG9ydEdJZm9yNDAgPSAxOworCX0KKwllbHNlCisJeworCQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLlNob3J0R0lmb3IyMCA9IDA7CisJCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uU2hvcnRHSWZvcjQwID0gMDsKKwkJcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LlNob3J0R0lmb3IyMCA9IDA7CisJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5TaG9ydEdJZm9yNDAgPSAwOworCX0KKworCS8vIFdlIHN1cHBvcnQgbGluayBhZGFwdGF0aW9uIGZvciB1bnNvbGljaXQgTUNTIGZlZWRiYWNrLCBzZXQgdG8gMi4KKwlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuRXh0SHRDYXBJbmZvLk1DU0ZlZWRiYWNrID0gTUNTRkJLX05PTkU7IC8vTUNTRkJLX1VOU09MSUNJVDsKKwlwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8uQ29udHJvbENoYW4gPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsOworCS8vIDEsIHRoZSBleHRlbnNpb24gY2hhbm5lbCBhYm92ZSB0aGUgY29udHJvbCBjaGFubmVsLgorCisJLy8gRURDQSBwYXJhbWV0ZXJzIHVzZWQgZm9yIEFQJ3Mgb3duIHRyYW5zbWlzc2lvbgorCWlmIChwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLmJWYWxpZCA9PSBGQUxTRSkKKwl7CisJCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uYlZhbGlkID0gVFJVRTsKKwkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5BaWZzblswXSA9IDM7CisJCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uQWlmc25bMV0gPSA3OworCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLkFpZnNuWzJdID0gMTsKKwkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5BaWZzblszXSA9IDE7CisKKwkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5Dd21pblswXSA9IDQ7CisJCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uQ3dtaW5bMV0gPSA0OworCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLkN3bWluWzJdID0gMzsKKwkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5Dd21pblszXSA9IDI7CisKKwkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5Dd21heFswXSA9IDY7CisJCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uQ3dtYXhbMV0gPSAxMDsKKwkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5Dd21heFsyXSA9IDQ7CisJCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uQ3dtYXhbM10gPSAzOworCisJCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uVHhvcFswXSAgPSAwOworCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLlR4b3BbMV0gID0gMDsKKwkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5UeG9wWzJdICA9IDk0OworCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLlR4b3BbM10gID0gNDc7CisJfQorCUFzaWNTZXRFZGNhUGFybShwQWQsICZwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtKTsKKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwl7CisJCVJUTVBTZXRJbmRpdmlkdWFsSFQocEFkLCAwKTsKKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlDYWxsZXIgZW5zdXJlcyB3ZSBoYXMgODAyLjExbiBzdXBwb3J0LgorCQlDYWxscyBhdCBzZXR0aW5nIEhUIGZyb20gQVAvU1RBU2V0aW5mb3JtYXRpb24KKworCUFyZ3VtZW50czoKKwkJcEFkIC0gUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCQlwaHltb2RlICAtCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECVJUTVBTZXRJbmRpdmlkdWFsSFQoCisJSU4JUFJUTVBfQURBUFRFUgkJcEFkLAorCUlOCVVDSEFSCQkJCWFwaWR4KQoreworCVBSVF9IVF9QSFlfSU5GTwkJcERlc2lyZWRfaHRfcGh5ID0gTlVMTDsKKwlVQ0hBUglUeFN0cmVhbSA9IHBBZC0+Q29tbW9uQ2ZnLlR4U3RyZWFtOworCVVDSEFSCURlc2lyZWRNY3MJPSBNQ1NfQVVUTzsKKworCWRvCisJeworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCXsKKwkJCXBEZXNpcmVkX2h0X3BoeSA9ICZwQWQtPlN0YUNmZy5EZXNpcmVkSHRQaHlJbmZvOworCQkJRGVzaXJlZE1jcyA9IHBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTOworCQkJLy9wQWQtPlN0YUNmZy5iQXV0b1R4UmF0ZVN3aXRjaCA9IChEZXNpcmVkTWNzID09IE1DU19BVVRPKSA/IFRSVUUgOiBGQUxTRTsKKwkJCQlicmVhazsKKwkJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCX0gd2hpbGUgKEZBTFNFKTsKKworCWlmIChwRGVzaXJlZF9odF9waHkgPT0gTlVMTCkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlJUTVBTZXRJbmRpdmlkdWFsSFQ6IGludmFsaWQgYXBpZHgoJWQpXG4iLCBhcGlkeCkpOworCQlyZXR1cm47CisJfQorCVJUTVBaZXJvTWVtb3J5KHBEZXNpcmVkX2h0X3BoeSwgc2l6ZW9mKFJUX0hUX1BIWV9JTkZPKSk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVE1QU2V0SW5kaXZpZHVhbEhUIDogRGVzaXJlZCBNQ1MgPSAlZFxuIiwgRGVzaXJlZE1jcykpOworCS8vIENoZWNrIHRoZSB2YWxpZGl0eSBvZiBNQ1MKKwlpZiAoKFR4U3RyZWFtID09IDEpICYmICgoRGVzaXJlZE1jcyA+PSBNQ1NfOCkgJiYgKERlc2lyZWRNY3MgPD0gTUNTXzE1KSkpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19XQVJOLCAoIlJUTVBTZXRJbmRpdmlkdWFsSFQ6IE1DUyglZCkgaXMgaW52YWxpZCBpbiAxUywgcmVzZXQgaXQgYXMgTUNTXzdcbiIsIERlc2lyZWRNY3MpKTsKKwkJRGVzaXJlZE1jcyA9IE1DU183OworCX0KKworCWlmICgocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkNoYW5uZWxXaWR0aCA9PSBCV18yMCkgJiYgKERlc2lyZWRNY3MgPT0gTUNTXzMyKSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1dBUk4sICgiUlRNUFNldEluZGl2aWR1YWxIVDogTUNTXzMyIGlzIG9ubHkgc3VwcG9ydGVkIGluIDQwLU1IeiwgcmVzZXQgaXQgYXMgTUNTXzBcbiIpKTsKKwkJRGVzaXJlZE1jcyA9IE1DU18wOworCX0KKworCXBEZXNpcmVkX2h0X3BoeS0+Ykh0RW5hYmxlID0gVFJVRTsKKworCS8vIERlY2lkZSBkZXNpcmVkIFR4IE1DUworCXN3aXRjaCAoVHhTdHJlYW0pCisJeworCQljYXNlIDE6CisJCQlpZiAoRGVzaXJlZE1jcyA9PSBNQ1NfQVVUTykKKwkJCXsKKwkJCQlwRGVzaXJlZF9odF9waHktPk1DU1NldFswXT0gMHhmZjsKKwkJCQlwRGVzaXJlZF9odF9waHktPk1DU1NldFsxXT0gMHgwMDsKKwkJCX0KKwkJCWVsc2UgaWYgKERlc2lyZWRNY3MgPD0gTUNTXzcpCisJCQl7CisJCQkJcERlc2lyZWRfaHRfcGh5LT5NQ1NTZXRbMF09IDE8PERlc2lyZWRNY3M7CisJCQkJcERlc2lyZWRfaHRfcGh5LT5NQ1NTZXRbMV09IDB4MDA7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIDI6CisJCQlpZiAoRGVzaXJlZE1jcyA9PSBNQ1NfQVVUTykKKwkJCXsKKwkJCQlwRGVzaXJlZF9odF9waHktPk1DU1NldFswXT0gMHhmZjsKKwkJCQlwRGVzaXJlZF9odF9waHktPk1DU1NldFsxXT0gMHhmZjsKKwkJCX0KKwkJCWVsc2UgaWYgKERlc2lyZWRNY3MgPD0gTUNTXzE1KQorCQkJeworCQkJCVVMT05HIG1vZGU7CisKKwkJCQltb2RlID0gRGVzaXJlZE1jcyAvIDg7CisJCQkJaWYgKG1vZGUgPCAyKQorCQkJCQlwRGVzaXJlZF9odF9waHktPk1DU1NldFttb2RlXSA9ICgxIDw8IChEZXNpcmVkTWNzIC0gbW9kZSAqIDgpKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgMzogLy8gMyozCisJCQlpZiAoRGVzaXJlZE1jcyA9PSBNQ1NfQVVUTykKKwkJCXsKKwkJCQkvKiBNQ1MwIH4gTUNTMjMsIDMgYnl0ZXMgKi8KKwkJCQlwRGVzaXJlZF9odF9waHktPk1DU1NldFswXT0gMHhmZjsKKwkJCQlwRGVzaXJlZF9odF9waHktPk1DU1NldFsxXT0gMHhmZjsKKwkJCQlwRGVzaXJlZF9odF9waHktPk1DU1NldFsyXT0gMHhmZjsKKwkJCX0KKwkJCWVsc2UgaWYgKERlc2lyZWRNY3MgPD0gTUNTXzIzKQorCQkJeworCQkJCVVMT05HIG1vZGU7CisKKwkJCQltb2RlID0gRGVzaXJlZE1jcyAvIDg7CisJCQkJaWYgKG1vZGUgPCAzKQorCQkJCQlwRGVzaXJlZF9odF9waHktPk1DU1NldFttb2RlXSA9ICgxIDw8IChEZXNpcmVkTWNzIC0gbW9kZSAqIDgpKTsKKwkJCX0KKwkJCWJyZWFrOworCX0KKworCWlmKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5DaGFubmVsV2lkdGggPT0gQldfNDApCisJeworCQlpZiAoRGVzaXJlZE1jcyA9PSBNQ1NfQVVUTyB8fCBEZXNpcmVkTWNzID09IE1DU18zMikKKwkJCXBEZXNpcmVkX2h0X3BoeS0+TUNTU2V0WzRdID0gMHgxOworCX0KKworCS8vIHVwZGF0ZSBIVCBSYXRlIHNldHRpbmcKKyAgICBpZiAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkKKyAgICAgICAgTWxtZVVwZGF0ZUh0VHhSYXRlcyhwQWQsIEJTUzApOworICAgIGVsc2UKKwkgICAgTWxtZVVwZGF0ZUh0VHhSYXRlcyhwQWQsIGFwaWR4KTsKK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVVwZGF0ZSBIVCBJRSBmcm9tIG91ciBjYXBhYmlsaXR5LgorCisJQXJndW1lbnRzOgorCQlTZW5kIGFsbCBIVCBJRSBpbiBiZWFjb24vcHJvYmUgcnNwL2Fzc29jIHJzcC9hY3Rpb24gZnJhbWUuCisKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJUlRNUFVwZGF0ZUhUSUUoCisJSU4JUlRfSFRfQ0FQQUJJTElUWQkqcFJ0SHQsCisJSU4JCVVDSEFSCQkJCSpwTWNzU2V0LAorCU9VVAkJSFRfQ0FQQUJJTElUWV9JRSAqcEh0Q2FwYWJpbGl0eSwKKwlPVVQJCUFERF9IVF9JTkZPX0lFCQkqcEFkZEh0SW5mbykKK3sKKwlSVE1QWmVyb01lbW9yeShwSHRDYXBhYmlsaXR5LCBzaXplb2YoSFRfQ0FQQUJJTElUWV9JRSkpOworCVJUTVBaZXJvTWVtb3J5KHBBZGRIdEluZm8sIHNpemVvZihBRERfSFRfSU5GT19JRSkpOworCisJCXBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5DaGFubmVsV2lkdGggPSBwUnRIdC0+Q2hhbm5lbFdpZHRoOworCQlwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uTWltb1BzID0gcFJ0SHQtPk1pbW9QczsKKwkJcEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLkdGID0gcFJ0SHQtPkdGOworCQlwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uU2hvcnRHSWZvcjIwID0gcFJ0SHQtPlNob3J0R0lmb3IyMDsKKwkJcEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLlNob3J0R0lmb3I0MCA9IHBSdEh0LT5TaG9ydEdJZm9yNDA7CisJCXBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5UeFNUQkMgPSBwUnRIdC0+VHhTVEJDOworCQlwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uUnhTVEJDID0gcFJ0SHQtPlJ4U1RCQzsKKwkJcEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLkFNc2R1U2l6ZSA9IHBSdEh0LT5BbXNkdVNpemU7CisJCXBIdENhcGFiaWxpdHktPkh0Q2FwUGFybS5NYXhSQW1wZHVGYWN0b3IgPSBwUnRIdC0+TWF4UkFtcGR1RmFjdG9yOworCQlwSHRDYXBhYmlsaXR5LT5IdENhcFBhcm0uTXBkdURlbnNpdHkgPSBwUnRIdC0+TXBkdURlbnNpdHk7CisKKwkJcEFkZEh0SW5mby0+QWRkSHRJbmZvLkV4dENoYW5PZmZzZXQgPSBwUnRIdC0+RXh0Q2hhbk9mZnNldCA7CisJCXBBZGRIdEluZm8tPkFkZEh0SW5mby5SZWNvbVdpZHRoID0gcFJ0SHQtPlJlY29tV2lkdGg7CisJCXBBZGRIdEluZm8tPkFkZEh0SW5mbzIuT3BlcmFpb25Nb2RlID0gcFJ0SHQtPk9wZXJhaW9uTW9kZTsKKwkJcEFkZEh0SW5mby0+QWRkSHRJbmZvMi5Ob25HZlByZXNlbnQgPSBwUnRIdC0+Tm9uR2ZQcmVzZW50OworCQlSVE1QTW92ZU1lbW9yeShwQWRkSHRJbmZvLT5NQ1NTZXQsIC8qcFJ0SHQtPk1DU1NldCovcE1jc1NldCwgNCk7IC8vIHJ0Mjg2MCBvbmx5IHN1cHBvcnQgTUNTIG1heD0zMiwgbm8gbmVlZCB0byBjb3B5IGFsbCAxNiB1Y2hhci4KKworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJUTVBVcGRhdGVIVElFIDw9PSBcbiIpKTsKK30KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJQWRkIENsaWVudCBzZWN1cml0eSBpbmZvcm1hdGlvbiBpbnRvIEFTSUMgV0NJRCB0YWJsZSBhbmQgSVZFSVYgdGFibGUuCisgICAgUmV0dXJuOgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVQ0hBUgkJCUJzc0lkeCwKKwlJTiAJVUNIQVIJCSAJS2V5SWR4LAorCUlOIAlVQ0hBUgkJIAlDaXBoZXJBbGcsCisJSU4gCU1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5KQoreworCVVJTlQzMgkJV0NJREF0dHJpID0gMDsKKwlVU0hPUlQJCW9mZnNldDsKKwlVQ0hBUgkJSVZFSVYgPSAwOworCVVTSE9SVAkJV2NpZCA9IDA7CisKKwl7CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCXsKKwkJCWlmIChCc3NJZHggPiBCU1MwKQorCQkJeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnk6IFRoZSBCU1MtaW5kZXgoJWQpIGlzIG91dCBvZiByYW5nZSBmb3IgSW5mcmEgbGluay4gXG4iLCBCc3NJZHgpKTsKKwkJCQlyZXR1cm47CisJCQl9CisKKwkJCS8vIDEuCUluIEFESE9DIG1vZGUsIHRoZSBBSUQgaXMgd2NpZCBudW1iZXIuIEFuZCBOTyBtZXNoIGxpbmsgZXhpc3RzLgorCQkJLy8gMi4JSW4gSW5mcmEgbW9kZSwgdGhlIEFJRDoxIE1VU1QgYmUgd2NpZCBvZiBpbmZyYSBTVEEuCisJCQkvLwkJCQkJICAgdGhlIEFJRDoyfiBhc3NpZ24gdG8gbWVzaCBsaW5rIGVudHJ5LgorCQkJaWYgKHBFbnRyeSAmJiBBREhPQ19PTihwQWQpKQorCQkJCVdjaWQgPSBwRW50cnktPkFpZDsKKwkJCWVsc2UgaWYgKHBFbnRyeSAmJiBJTkZSQV9PTihwQWQpKQorCQkJeworI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCQkJCWlmIChwRW50cnktPlZhbGlkQXNEbHMgPT0gVFJVRSkKKwkJCQkJV2NpZCA9IHBFbnRyeS0+QWlkOworCQkJCWVsc2UKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKwkJCQlXY2lkID0gQlNTSURfV0NJRDsKKwkJCX0KKwkJCWVsc2UKKwkJCQlXY2lkID0gTUNBU1RfV0NJRDsKKwkJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCX0KKworCS8vIFVwZGF0ZSBXQ0lEIGF0dHJpYnV0ZSB0YWJsZQorCW9mZnNldCA9IE1BQ19XQ0lEX0FUVFJJQlVURV9CQVNFICsgKFdjaWQgKiBIV19XQ0lEX0FUVFJJX1NJWkUpOworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwl7CisJCWlmIChwRW50cnkgJiYgcEVudHJ5LT5WYWxpZEFzTWVzaCkKKwkJCVdDSURBdHRyaSA9IChDaXBoZXJBbGc8PDEpIHwgUEFJUldJU0VLRVlUQUJMRTsKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwkJZWxzZSBpZiAoKHBFbnRyeSkgJiYgKHBFbnRyeS0+VmFsaWRBc0RscykgJiYKKwkJCQkJKChDaXBoZXJBbGcgPT0gQ0lQSEVSX1RLSVApIHx8CisJCQkJIAkoQ2lwaGVyQWxnID09IENJUEhFUl9US0lQX05PX01JQykgfHwKKwkJCQkJKENpcGhlckFsZyA9PSBDSVBIRVJfQUVTKSB8fAorCQkJCSAJKENpcGhlckFsZyA9PSBDSVBIRVJfTk9ORSkpKQorCQkJV0NJREF0dHJpID0gKENpcGhlckFsZzw8MSkgfCBQQUlSV0lTRUtFWVRBQkxFOworI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCQllbHNlCisJCQlXQ0lEQXR0cmkgPSAoQ2lwaGVyQWxnPDwxKSB8IFNIQVJFREtFWVRBQkxFOworCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCVJUTVBfSU9fV1JJVEUzMihwQWQsIG9mZnNldCwgV0NJREF0dHJpKTsKKworCisJLy8gVXBkYXRlIElWL0VJViB0YWJsZQorCW9mZnNldCA9IE1BQ19JVkVJVl9UQUJMRV9CQVNFICsgKFdjaWQgKiBIV19JVkVJVl9FTlRSWV9TSVpFKTsKKworCS8vIFdQQSBtb2RlCisJaWYgKChDaXBoZXJBbGcgPT0gQ0lQSEVSX1RLSVApIHx8IChDaXBoZXJBbGcgPT0gQ0lQSEVSX1RLSVBfTk9fTUlDKSB8fCAoQ2lwaGVyQWxnID09IENJUEhFUl9BRVMpKQorCXsKKwkJLy8gRWl2IGJpdCBvbi4ga2V5aWQgYWx3YXlzIGlzIDAgZm9yIHBhaXJ3aXNlIGtleQorCQlJVkVJViA9IChLZXlJZHggPDw2KSB8IDB4MjA7CisJfQorCWVsc2UKKwl7CisJCS8vIFdFUCBLZXlJZHggaXMgZGVmYXVsdCB0eCBrZXkuCisJCUlWRUlWID0gKEtleUlkeCA8PCA2KTsKKwl9CisKKwkvLyBGb3Iga2V5IGluZGV4IGFuZCBleHQgSVYgYml0LCBzbyBvbmx5IG5lZWQgdG8gdXBkYXRlIHRoZSBwb3NpdGlvbihvZmZzZXQrMykuCisjaWZkZWYgUlQyODcwCisJUlRVU0JNdWx0aVdyaXRlX09uZUJ5dGUocEFkLCBvZmZzZXQrMywgJklWRUlWKTsKKyNlbmRpZiAvLyBSVDI4NzAgLy8KKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeTogV0NJRCAjJWQsIEtleUluZGV4ICMlZCwgQWxnPSVzXG4iLFdjaWQsIEtleUlkeCwgQ2lwaGVyTmFtZVtDaXBoZXJBbGddKSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCIJV0NJREF0dHJpID0gMHgleCBcbiIsICBXQ0lEQXR0cmkpKTsKKworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFBhcnNlIGVuY3J5cHRpb24gdHlwZQorQXJndW1lbnRzOgorICAgIHBBZGFwdGVyICAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIG91ciBhZGFwdGVyCisgICAgd3JxICAgICAgICAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGlvY3RsIGFyZ3VtZW50CisKKyAgICBSZXR1cm4gVmFsdWU6CisgICAgICAgIE5vbmUKKworICAgIE5vdGU6CisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitDSEFSICpHZXRFbmNyeXB0VHlwZShDSEFSIGVuYykKK3sKKyAgICBpZihlbmMgPT0gTmRpczgwMl8xMVdFUERpc2FibGVkKQorICAgICAgICByZXR1cm4gIk5PTkUiOworICAgIGlmKGVuYyA9PSBOZGlzODAyXzExV0VQRW5hYmxlZCkKKyAgICAJcmV0dXJuICJXRVAiOworICAgIGlmKGVuYyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKQorICAgIAlyZXR1cm4gIlRLSVAiOworICAgIGlmKGVuYyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQorICAgIAlyZXR1cm4gIkFFUyI7CisJaWYoZW5jID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uNEVuYWJsZWQpCisgICAgCXJldHVybiAiVEtJUEFFUyI7CisgICAgZWxzZQorICAgIAlyZXR1cm4gIlVOS05PVyI7Cit9CisKK0NIQVIgKkdldEF1dGhNb2RlKENIQVIgYXV0aCkKK3sKKyAgICBpZihhdXRoID09IE5kaXM4MDJfMTFBdXRoTW9kZU9wZW4pCisgICAgCXJldHVybiAiT1BFTiI7CisgICAgaWYoYXV0aCA9PSBOZGlzODAyXzExQXV0aE1vZGVTaGFyZWQpCisgICAgCXJldHVybiAiU0hBUkVEIjsKKwlpZihhdXRoID09IE5kaXM4MDJfMTFBdXRoTW9kZUF1dG9Td2l0Y2gpCisgICAgCXJldHVybiAiQVVUT1dFUCI7CisgICAgaWYoYXV0aCA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpCisgICAgCXJldHVybiAiV1BBIjsKKyAgICBpZihhdXRoID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykKKyAgICAJcmV0dXJuICJXUEFQU0siOworICAgIGlmKGF1dGggPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZSkKKyAgICAJcmV0dXJuICJXUEFOT05FIjsKKyAgICBpZihhdXRoID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIpCisgICAgCXJldHVybiAiV1BBMiI7CisgICAgaWYoYXV0aCA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKQorICAgIAlyZXR1cm4gIldQQTJQU0siOworCWlmKGF1dGggPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMVdQQTIpCisgICAgCXJldHVybiAiV1BBMVdQQTIiOworCWlmKGF1dGggPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMVBTS1dQQTJQU0spCisgICAgCXJldHVybiAiV1BBMVBTS1dQQTJQU0siOworCisgICAgCXJldHVybiAiVU5LTk9XIjsKK30KKworI2lmIDEgLy8jaWZuZGVmIFVDT1MKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgR2V0IHNpdGUgc3VydmV5IHJlc3VsdHMKKwlBcmd1bWVudHM6CisJICAgIHBBZGFwdGVyICAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIG91ciBhZGFwdGVyCisJICAgIHdycSAgICAgICAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpb2N0bCBhcmd1bWVudAorCisgICAgUmV0dXJuIFZhbHVlOgorICAgICAgICBOb25lCisKKyAgICBOb3RlOgorICAgICAgICBVc2FnZToKKyAgICAgICAgCQkxLikgVUkgbmVlZHMgdG8gd2FpdCA0IHNlY29uZHMgYWZ0ZXIgaXNzdWUgYSBzaXRlIHN1cnZleSBjb21tYW5kCisgICAgICAgIAkJMi4pIGl3cHJpdiByYTAgZ2V0X3NpdGVfc3VydmV5CisgICAgICAgIAkJMy4pIFVJIG5lZWRzIHRvIHByZXBhcmUgYXQgbGVhc3QgNDA5NmJ5dGVzIHRvIGdldCB0aGUgcmVzdWx0cworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworI2RlZmluZQlMSU5FX0xFTgkoNCszMysyMCs4KzEwKzkrNyszKQkvLyBDaGFubmVsK1NTSUQrQnNzaWQrV2VwU3RhdHVzK0F1dGhNb2RlK1NpZ25hbCtXaXJlc3NNb2RlK05ldHdvcmtUeXBlCitWT0lEIFJUTVBJb2N0bEdldFNpdGVTdXJ2ZXkoCisJSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKKwlJTglzdHJ1Y3QgaXdyZXEJKndycSkKK3sKKwlDSEFSCQkqbXNnOworCUlOVCAJCWk9MDsKKwlJTlQJCQlXYWl0Q250OworCUlOVCAJCVN0YXR1cz0wOworCUNIQVIJCVNzaWRbTUFYX0xFTl9PRl9TU0lEICsxXTsKKyAgICBJTlQgICAgICAgICBSc3NpID0gMCwgbWF4X2xlbiA9IExJTkVfTEVOOworCVVJTlQgICAgICAgIFJzc2lfUXVhbGl0eSA9IDA7CisJTkRJU184MDJfMTFfTkVUV09SS19UWVBFICAgIHdpcmVsZXNzX21vZGU7CisKKwlvc19hbGxvY19tZW0oTlVMTCwgKFBVQ0hBUiAqKSZtc2csIHNpemVvZihDSEFSKSooKE1BWF9MRU5fT0ZfQlNTX1RBQkxFKSptYXhfbGVuKSk7CisKKwlpZiAobXNnID09IE5VTEwpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVE1QSW9jdGxHZXRTaXRlU3VydmV5IC0gbXNnIG1lbW9yeSBhbGxvYyBmYWlsLlxuIikpOworCQlyZXR1cm47CisJfQorCisJbWVtc2V0KG1zZywgMCAsKE1BWF9MRU5fT0ZfQlNTX1RBQkxFKSptYXhfbGVuICk7CisJbWVtc2V0KFNzaWQsIDAgLChNQVhfTEVOX09GX1NTSUQgKzEpKTsKKwlzcHJpbnRmKG1zZywiJXMiLCJcbiIpOworCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCIlLTRzJS0zM3MlLTIwcyUtOHMlLTEwcyUtOXMlLTdzJS0zc1xuIiwKKwkgICAgIkNoIiwgIlNTSUQiLCAiQlNTSUQiLCAiRW5jIiwgIkF1dGgiLCAiU2lnYW5sKCUpIiwgIlctTW9kZSIsICIgTlQiKTsKKworCisJV2FpdENudCA9IDA7CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJcEFkYXB0ZXItPlN0YUNmZy5iU2NhblJlcUlzRnJvbVdlYlVJID0gVFJVRTsKKwl3aGlsZSAoKFNjYW5SdW5uaW5nKHBBZGFwdGVyKSA9PSBUUlVFKSAmJiAoV2FpdENudCsrIDwgMjAwKSkKKwkJT1NfV0FJVCg1MDApOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJZm9yKGk9MDsgaTxwQWRhcHRlci0+U2NhblRhYi5Cc3NOciA7aSsrKQorCXsKKwkJaWYoIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkNoYW5uZWw9PTApCisJCQlicmVhazsKKworCQlpZigoc3RybGVuKG1zZykrbWF4X2xlbiApID49IElXX1NDQU5fTUFYX0RBVEEpCisJCQlicmVhazsKKworCQkvL0NoYW5uZWwKKwkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksIiUtNGQiLCBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5DaGFubmVsKTsKKwkJLy9TU0lECisJCW1lbWNweShTc2lkLCBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Tc2lkLCBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Tc2lkTGVuKTsKKwkJU3NpZFtwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Tc2lkTGVuXSA9ICdcMCc7CisJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCIlLTMzcyIsIFNzaWQpOworCQkvL0JTU0lECisJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCIlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCAgICIsCisJCQlwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Cc3NpZFswXSwKKwkJCXBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkJzc2lkWzFdLAorCQkJcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uQnNzaWRbMl0sCisJCQlwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Cc3NpZFszXSwKKwkJCXBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkJzc2lkWzRdLAorCQkJcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uQnNzaWRbNV0pOworCQkvL0VuY3J5cHRpb24gVHlwZQorCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwiJS04cyIsR2V0RW5jcnlwdFR5cGUocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uV2VwU3RhdHVzKSk7CisJCS8vQXV0aGVudGljYXRpb24gTW9kZQorCQlpZiAocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uV2VwU3RhdHVzID09IE5kaXM4MDJfMTFXRVBFbmFibGVkKQorCQkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksIiUtMTBzIiwgIlVOS05PVyIpOworCQllbHNlCisJCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwiJS0xMHMiLEdldEF1dGhNb2RlKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkF1dGhNb2RlKSk7CisJCS8vIFJzc2kKKwkJUnNzaSA9IChJTlQpcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uUnNzaTsKKwkJaWYgKFJzc2kgPj0gLTUwKQorCQkJUnNzaV9RdWFsaXR5ID0gMTAwOworCQllbHNlIGlmIChSc3NpID49IC04MCkgICAgLy8gYmV0d2VlbiAtNTAgfiAtODBkYm0KKwkJCVJzc2lfUXVhbGl0eSA9IChVSU5UKSgyNCArICgoUnNzaSArIDgwKSAqIDI2KS8xMCk7CisJCWVsc2UgaWYgKFJzc2kgPj0gLTkwKSAgIC8vIGJldHdlZW4gLTgwIH4gLTkwZGJtCisJCQlSc3NpX1F1YWxpdHkgPSAoVUlOVCkoKChSc3NpICsgOTApICogMjYpLzEwKTsKKwkJZWxzZSAgICAvLyA8IC04NCBkYm0KKwkJCVJzc2lfUXVhbGl0eSA9IDA7CisJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCIlLTlkIiwgUnNzaV9RdWFsaXR5KTsKKwkJLy8gV2lyZWxlc3MgTW9kZQorCQl3aXJlbGVzc19tb2RlID0gTmV0d29ya1R5cGVJblVzZVNhbml0eSgmcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0pOworCQlpZiAod2lyZWxlc3NfbW9kZSA9PSBOZGlzODAyXzExRkggfHwKKwkJCXdpcmVsZXNzX21vZGUgPT0gTmRpczgwMl8xMURTKQorCQkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksIiUtN3MiLCAiMTFiIik7CisJCWVsc2UgaWYgKHdpcmVsZXNzX21vZGUgPT0gTmRpczgwMl8xMU9GRE01KQorCQkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksIiUtN3MiLCAiMTFhIik7CisJCWVsc2UgaWYgKHdpcmVsZXNzX21vZGUgPT0gTmRpczgwMl8xMU9GRE01X04pCisJCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwiJS03cyIsICIxMWEvbiIpOworCQllbHNlIGlmICh3aXJlbGVzc19tb2RlID09IE5kaXM4MDJfMTFPRkRNMjQpCisJCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwiJS03cyIsICIxMWIvZyIpOworCQllbHNlIGlmICh3aXJlbGVzc19tb2RlID09IE5kaXM4MDJfMTFPRkRNMjRfTikKKwkJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCIlLTdzIiwgIjExYi9nL24iKTsKKwkJZWxzZQorCQkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksIiUtN3MiLCAidW5rbm93Iik7CisJCS8vTmV0d29yayBUeXBlCisJCWlmIChwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Cc3NUeXBlID09IEJTU19BREhPQykKKwkJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCIlLTNzIiwgIiBBZCIpOworCQllbHNlCisJCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwiJS0zcyIsICIgSW4iKTsKKworICAgICAgICBzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwiXG4iKTsKKwl9CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlwQWRhcHRlci0+U3RhQ2ZnLmJTY2FuUmVxSXNGcm9tV2ViVUkgPSBGQUxTRTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwl3cnEtPnUuZGF0YS5sZW5ndGggPSBzdHJsZW4obXNnKTsKKwlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgbXNnLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlRNUElvY3RsR2V0U2l0ZVN1cnZleSAtIHdycS0+dS5kYXRhLmxlbmd0aCA9ICVkXG4iLCB3cnEtPnUuZGF0YS5sZW5ndGgpKTsKKwlvc19mcmVlX21lbShOVUxMLCAoUFVDSEFSKW1zZyk7Cit9CisKKworI2RlZmluZQlNQUNfTElORV9MRU4JKDE0KzQrNCsxMCsxMCsxMCs2KzYpCS8vIEFkZHIrYWlkK3BzbStkYXRhdGltZStyeGJ5dGUrdHhieXRlK2N1cnJlbnQgdHggcmF0ZStsYXN0IHR4IHJhdGUKK1ZPSUQgUlRNUElvY3RsR2V0TWFjVGFibGUoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gc3RydWN0IGl3cmVxICp3cnEpCit7CisJSU5UIGk7CisJUlRfODAyXzExX01BQ19UQUJMRSBNYWNUYWI7CisJY2hhciAqbXNnOworCisJTWFjVGFiLk51bSA9IDA7CisJZm9yIChpPTA7IGk8TUFYX0xFTl9PRl9NQUNfVEFCTEU7IGkrKykKKwl7CisJCWlmIChwQWQtPk1hY1RhYi5Db250ZW50W2ldLlZhbGlkQXNDTEkgJiYgKHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uU3N0ID09IFNTVF9BU1NPQykpCisJCXsKKwkJCUNPUFlfTUFDX0FERFIoTWFjVGFiLkVudHJ5W01hY1RhYi5OdW1dLkFkZHIsICZwQWQtPk1hY1RhYi5Db250ZW50W2ldLkFkZHIpOworCQkJTWFjVGFiLkVudHJ5W01hY1RhYi5OdW1dLkFpZCA9IChVQ0hBUilwQWQtPk1hY1RhYi5Db250ZW50W2ldLkFpZDsKKwkJCU1hY1RhYi5FbnRyeVtNYWNUYWIuTnVtXS5Qc20gPSBwQWQtPk1hY1RhYi5Db250ZW50W2ldLlBzTW9kZTsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCU1hY1RhYi5FbnRyeVtNYWNUYWIuTnVtXS5NaW1vUHMgPSBwQWQtPk1hY1RhYi5Db250ZW50W2ldLk1tcHNNb2RlOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJCQkvLyBGaWxsIGluIFJTU0kgcGVyIGVudHJ5CisJCQlNYWNUYWIuRW50cnlbTWFjVGFiLk51bV0uQXZnUnNzaTAgPSBwQWQtPk1hY1RhYi5Db250ZW50W2ldLlJzc2lTYW1wbGUuQXZnUnNzaTA7CisJCQlNYWNUYWIuRW50cnlbTWFjVGFiLk51bV0uQXZnUnNzaTEgPSBwQWQtPk1hY1RhYi5Db250ZW50W2ldLlJzc2lTYW1wbGUuQXZnUnNzaTE7CisJCQlNYWNUYWIuRW50cnlbTWFjVGFiLk51bV0uQXZnUnNzaTIgPSBwQWQtPk1hY1RhYi5Db250ZW50W2ldLlJzc2lTYW1wbGUuQXZnUnNzaTI7CisKKwkJCS8vIHRoZSBjb25uZWN0ZWQgdGltZSBwZXIgZW50cnkKKwkJCU1hY1RhYi5FbnRyeVtNYWNUYWIuTnVtXS5Db25uZWN0ZWRUaW1lID0gcEFkLT5NYWNUYWIuQ29udGVudFtpXS5TdGFDb25uZWN0VGltZTsKKyNpZiAwIC8vIFRvRG8KKwkJCU1hY1RhYi5FbnRyeVtNYWNUYWIuTnVtXS5IU0NvdW50ZXIuTGFzdERhdGFQYWNrZXRUaW1lID0gcEFkLT5NYWNUYWIuQ29udGVudFtpXS5IU0NvdW50ZXIuTGFzdERhdGFQYWNrZXRUaW1lOworCQkJTWFjVGFiLkVudHJ5W01hY1RhYi5OdW1dLkhTQ291bnRlci5Ub3RhbFJ4Qnl0ZUNvdW50ID0gcEFkLT5NYWNUYWIuQ29udGVudFtpXS5IU0NvdW50ZXIuVG90YWxSeEJ5dGVDb3VudDsKKwkJCU1hY1RhYi5FbnRyeVtNYWNUYWIuTnVtXS5IU0NvdW50ZXIuVG90YWxUeEJ5dGVDb3VudCA9IHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uSFNDb3VudGVyLlRvdGFsVHhCeXRlQ291bnQ7CisjZW5kaWYKKwkJCU1hY1RhYi5FbnRyeVtNYWNUYWIuTnVtXS5UeFJhdGUuZmllbGQuTUNTID0gcEFkLT5NYWNUYWIuQ29udGVudFtpXS5IVFBoeU1vZGUuZmllbGQuTUNTOworCQkJTWFjVGFiLkVudHJ5W01hY1RhYi5OdW1dLlR4UmF0ZS5maWVsZC5CVyA9IHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uSFRQaHlNb2RlLmZpZWxkLkJXOworCQkJTWFjVGFiLkVudHJ5W01hY1RhYi5OdW1dLlR4UmF0ZS5maWVsZC5TaG9ydEdJID0gcEFkLT5NYWNUYWIuQ29udGVudFtpXS5IVFBoeU1vZGUuZmllbGQuU2hvcnRHSTsKKwkJCU1hY1RhYi5FbnRyeVtNYWNUYWIuTnVtXS5UeFJhdGUuZmllbGQuU1RCQyA9IHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uSFRQaHlNb2RlLmZpZWxkLlNUQkM7CisJCQlNYWNUYWIuRW50cnlbTWFjVGFiLk51bV0uVHhSYXRlLmZpZWxkLnJzdiA9IHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uSFRQaHlNb2RlLmZpZWxkLnJzdjsKKwkJCU1hY1RhYi5FbnRyeVtNYWNUYWIuTnVtXS5UeFJhdGUuZmllbGQuTU9ERSA9IHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uSFRQaHlNb2RlLmZpZWxkLk1PREU7CisJCQlNYWNUYWIuRW50cnlbTWFjVGFiLk51bV0uVHhSYXRlLndvcmQgPSBwQWQtPk1hY1RhYi5Db250ZW50W2ldLkhUUGh5TW9kZS53b3JkOworCisJCQlNYWNUYWIuTnVtICs9IDE7CisJCX0KKwl9CisJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFJUXzgwMl8xMV9NQUNfVEFCTEUpOworCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJk1hY1RhYiwgd3JxLT51LmRhdGEubGVuZ3RoKSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOiBjb3B5X3RvX3VzZXIoKSBmYWlsXG4iLCBfX2Z1bmNfXykpOworCX0KKworCW1zZyA9IChDSEFSICopIGttYWxsb2Moc2l6ZW9mKENIQVIpKihNQVhfTEVOX09GX01BQ19UQUJMRSpNQUNfTElORV9MRU4pLCBNRU1fQUxMT0NfRkxBRyk7CisJbWVtc2V0KG1zZywgMCAsTUFYX0xFTl9PRl9NQUNfVEFCTEUqTUFDX0xJTkVfTEVOICk7CisJc3ByaW50Zihtc2csIiVzIiwiXG4iKTsKKwlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwiJS0xNHMlLTRzJS00cyUtMTBzJS0xMHMlLTEwcyUtNnMlLTZzXG4iLAorCQkiTUFDIiwgIkFJRCIsICJQU00iLCAiTERUIiwgIlJ4QiIsICJUeEIiLCJDVHhSIiwgIkxUeFIiKTsKKworCWZvciAoaT0wOyBpPE1BWF9MRU5fT0ZfTUFDX1RBQkxFOyBpKyspCisJeworCQlQTUFDX1RBQkxFX0VOVFJZIHBFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W2ldOworCQlpZiAocEVudHJ5LT5WYWxpZEFzQ0xJICYmIChwRW50cnktPlNzdCA9PSBTU1RfQVNTT0MpKQorCQl7CisJCQlpZigoc3RybGVuKG1zZykrTUFDX0xJTkVfTEVOICkgPj0gKE1BWF9MRU5fT0ZfTUFDX1RBQkxFKk1BQ19MSU5FX0xFTikgKQorCQkJCWJyZWFrOworCQkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksIiUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCAgIiwKKwkJCQlwRW50cnktPkFkZHJbMF0sIHBFbnRyeS0+QWRkclsxXSwgcEVudHJ5LT5BZGRyWzJdLAorCQkJCXBFbnRyeS0+QWRkclszXSwgcEVudHJ5LT5BZGRyWzRdLCBwRW50cnktPkFkZHJbNV0pOworCQkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksIiUtNGQiLCAoaW50KXBFbnRyeS0+QWlkKTsKKwkJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCIlLTRkIiwgKGludClwRW50cnktPlBzTW9kZSk7CisJCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwiJS0xMGQiLDAvKnBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uSFNDb3VudGVyLkxhc3REYXRhUGFja2V0VGltZSovKTsgLy8gVG9EbworCQkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksIiUtMTBkIiwwLypwQWQtPk1hY1RhYi5Db250ZW50W2ldLkhTQ291bnRlci5Ub3RhbFJ4Qnl0ZUNvdW50Ki8pOyAvLyBUb0RvCisJCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwiJS0xMGQiLDAvKnBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uSFNDb3VudGVyLlRvdGFsVHhCeXRlQ291bnQqLyk7IC8vIFRvRG8KKwkJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCIlLTZkIixSYXRlSWRUb01icHNbcEFkLT5NYWNUYWIuQ29udGVudFtpXS5DdXJyVHhSYXRlXSk7CisJCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwiJS02ZFxuIiwwLypSYXRlSWRUb01icHNbcEFkLT5NYWNUYWIuQ29udGVudFtpXS5MYXN0VHhSYXRlXSovKTsgLy8gVG9EbworCQl9CisJfQorCS8vIGZvciBjb21wYXRpYmxlIHdpdGggb2xkIEFQSSBqdXN0IGRvIHRoZSBwcmludGsgdG8gY29uc29sZQorCS8vd3JxLT51LmRhdGEubGVuZ3RoID0gc3RybGVuKG1zZyk7CisJLy9pZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIG1zZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzIiwgbXNnKSk7CisJfQorCisJa2ZyZWUobXNnKTsKK30KKyNlbmRpZiAvLyBVQ09TIC8vCisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKK0lOVAlTZXRfQkFTZXR1cF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKyAgICBVQ0hBUiBtYWNbNl0sIHRpZDsKKwljaGFyICp0b2tlbiwgc2VwVmFsdWVbXSA9ICI6IiwgREFTSCA9ICctJzsKKwlJTlQgaTsKKyAgICBNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeTsKKworLyoKKwlUaGUgQkFTZXR1cCBpbnVwdCBzdHJpbmcgZm9ybWF0IHNob3VsZCBiZSB4eDp4eDp4eDp4eDp4eDp4eC1kLAorCQk9PlRoZSBzaXggMiBkaWdpdCBoZXgtZGVjaW1hbCBudW1iZXIgcHJldmlvdXMgYXJlIHRoZSBNYWMgYWRkcmVzcywKKwkJPT5UaGUgc2V2ZW50aCBkZWNpbWFsIG51bWJlciBpcyB0aGUgdGlkIHZhbHVlLgorKi8KKwkvL3ByaW50aygiXG4lc1xuIiwgYXJnKTsKKworCWlmKHN0cmxlbihhcmcpIDwgMTkpICAvL01hYyBhZGRyZXNzIGFjY2VwdGFibGUgZm9ybWF0IDAxOjAyOjAzOjA0OjA1OjA2IGxlbmd0aCAxNyBwbHVzIHRoZSAiLSIgYW5kIHRpZCB2YWx1ZSBpbiBkZWNpbWFsIGZvcm1hdC4KKwkJcmV0dXJuIEZBTFNFOworCisJdG9rZW4gPSBzdHJjaHIoYXJnLCBEQVNIKTsKKwlpZiAoKHRva2VuICE9IE5VTEwpICYmIChzdHJsZW4odG9rZW4pPjEpKQorCXsKKwkJdGlkID0gc2ltcGxlX3N0cnRvbCgodG9rZW4rMSksIDAsIDEwKTsKKwkJaWYgKHRpZCA+IDE1KQorCQkJcmV0dXJuIEZBTFNFOworCisJCSp0b2tlbiA9ICdcMCc7CisJCWZvciAoaSA9IDAsIHRva2VuID0gcnN0cnRvayhhcmcsICZzZXBWYWx1ZVswXSk7IHRva2VuOyB0b2tlbiA9IHJzdHJ0b2soTlVMTCwgJnNlcFZhbHVlWzBdKSwgaSsrKQorCQl7CisJCQlpZigoc3RybGVuKHRva2VuKSAhPSAyKSB8fCAoIWlzeGRpZ2l0KCp0b2tlbikpIHx8ICghaXN4ZGlnaXQoKih0b2tlbisxKSkpKQorCQkJCXJldHVybiBGQUxTRTsKKwkJCUF0b0godG9rZW4sIChQVUNIQVIpKCZtYWNbaV0pLCAxKTsKKwkJfQorCQlpZihpICE9IDYpCisJCQlyZXR1cm4gRkFMU0U7CisKKwkJcHJpbnRrKCJcbiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4LSUwMnhcbiIsIG1hY1swXSwgbWFjWzFdLAorCQkJCW1hY1syXSwgbWFjWzNdLCBtYWNbNF0sIG1hY1s1XSwgdGlkKTsKKworCSAgICBwRW50cnkgPSBNYWNUYWJsZUxvb2t1cChwQWQsIG1hYyk7CisKKyAgICAJaWYgKHBFbnRyeSkgeworICAgICAgICAJcHJpbnRrKCJcblNldHVwIEJBIFNlc3Npb246IFRpZCA9ICVkXG4iLCB0aWQpOworCSAgICAgICAgQkFPcmlTZXNzaW9uU2V0VXAocEFkLCBwRW50cnksIHRpZCwgMCwgMTAwLCBUUlVFKTsKKyAgICAJfQorCisJCXJldHVybiBUUlVFOworCX0KKworCXJldHVybiBGQUxTRTsKKworfQorCitJTlQJU2V0X0JBRGVjbGluZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVTE9ORyBiQkFEZWNsaW5lOworCisJYkJBRGVjbGluZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisKKwlpZiAoYkJBRGVjbGluZSA9PSAwKQorCXsKKwkJcEFkLT5Db21tb25DZmcuYkJBRGVjbGluZSA9IEZBTFNFOworCX0KKwllbHNlIGlmIChiQkFEZWNsaW5lID09IDEpCisJeworCQlwQWQtPkNvbW1vbkNmZy5iQkFEZWNsaW5lID0gVFJVRTsKKwl9CisJZWxzZQorCXsKKwkJcmV0dXJuIEZBTFNFOyAvL0ludmFsaWQgYXJndW1lbnQKKwl9CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfQkFEZWNsaW5lX1Byb2M6OihCQURlY2xpbmU9JWQpXG4iLCBwQWQtPkNvbW1vbkNmZy5iQkFEZWNsaW5lKSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworSU5UCVNldF9CQU9yaVRlYXJEb3duX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworICAgIFVDSEFSIG1hY1s2XSwgdGlkOworCWNoYXIgKnRva2VuLCBzZXBWYWx1ZVtdID0gIjoiLCBEQVNIID0gJy0nOworCUlOVCBpOworICAgIE1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5OworCisgICAgLy9wcmludGsoIlxuJXNcbiIsIGFyZyk7CisvKgorCVRoZSBCQU9yaVRlYXJEb3duIGludXB0IHN0cmluZyBmb3JtYXQgc2hvdWxkIGJlIHh4Onh4Onh4Onh4Onh4Onh4LWQsCisJCT0+VGhlIHNpeCAyIGRpZ2l0IGhleC1kZWNpbWFsIG51bWJlciBwcmV2aW91cyBhcmUgdGhlIE1hYyBhZGRyZXNzLAorCQk9PlRoZSBzZXZlbnRoIGRlY2ltYWwgbnVtYmVyIGlzIHRoZSB0aWQgdmFsdWUuCisqLworICAgIGlmKHN0cmxlbihhcmcpIDwgMTkpICAvL01hYyBhZGRyZXNzIGFjY2VwdGFibGUgZm9ybWF0IDAxOjAyOjAzOjA0OjA1OjA2IGxlbmd0aCAxNyBwbHVzIHRoZSAiLSIgYW5kIHRpZCB2YWx1ZSBpbiBkZWNpbWFsIGZvcm1hdC4KKwkJcmV0dXJuIEZBTFNFOworCisJdG9rZW4gPSBzdHJjaHIoYXJnLCBEQVNIKTsKKwlpZiAoKHRva2VuICE9IE5VTEwpICYmIChzdHJsZW4odG9rZW4pPjEpKQorCXsKKwkJdGlkID0gc2ltcGxlX3N0cnRvbCgodG9rZW4rMSksIDAsIDEwKTsKKwkJaWYgKHRpZCA+IE5VTV9PRl9USUQpCisJCQlyZXR1cm4gRkFMU0U7CisKKwkJKnRva2VuID0gJ1wwJzsKKwkJZm9yIChpID0gMCwgdG9rZW4gPSByc3RydG9rKGFyZywgJnNlcFZhbHVlWzBdKTsgdG9rZW47IHRva2VuID0gcnN0cnRvayhOVUxMLCAmc2VwVmFsdWVbMF0pLCBpKyspCisJCXsKKwkJCWlmKChzdHJsZW4odG9rZW4pICE9IDIpIHx8ICghaXN4ZGlnaXQoKnRva2VuKSkgfHwgKCFpc3hkaWdpdCgqKHRva2VuKzEpKSkpCisJCQkJcmV0dXJuIEZBTFNFOworCQkJQXRvSCh0b2tlbiwgKFBVQ0hBUikoJm1hY1tpXSksIDEpOworCQl9CisJCWlmKGkgIT0gNikKKwkJCXJldHVybiBGQUxTRTsKKworCSAgICBwcmludGsoIlxuJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMngtJTAyeCIsIG1hY1swXSwgbWFjWzFdLAorCSAgICAgICAgICAgbWFjWzJdLCBtYWNbM10sIG1hY1s0XSwgbWFjWzVdLCB0aWQpOworCisJICAgIHBFbnRyeSA9IE1hY1RhYmxlTG9va3VwKHBBZCwgbWFjKTsKKworCSAgICBpZiAocEVudHJ5KSB7CisJICAgICAgICBwcmludGsoIlxuVGVhciBkb3duIE9yaSBCQSBTZXNzaW9uOiBUaWQgPSAlZFxuIiwgdGlkKTsKKyAgICAgICAgQkFPcmlTZXNzaW9uVGVhckRvd24ocEFkLCBwRW50cnktPkFpZCwgdGlkLCBGQUxTRSwgVFJVRSk7CisJICAgIH0KKworCQlyZXR1cm4gVFJVRTsKKwl9CisKKwlyZXR1cm4gRkFMU0U7CisKK30KKworSU5UCVNldF9CQVJlY1RlYXJEb3duX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworICAgIFVDSEFSIG1hY1s2XSwgdGlkOworCWNoYXIgKnRva2VuLCBzZXBWYWx1ZVtdID0gIjoiLCBEQVNIID0gJy0nOworCUlOVCBpOworICAgIE1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5OworCisgICAgLy9wcmludGsoIlxuJXNcbiIsIGFyZyk7CisvKgorCVRoZSBCQVJlY1RlYXJEb3duIGludXB0IHN0cmluZyBmb3JtYXQgc2hvdWxkIGJlIHh4Onh4Onh4Onh4Onh4Onh4LWQsCisJCT0+VGhlIHNpeCAyIGRpZ2l0IGhleC1kZWNpbWFsIG51bWJlciBwcmV2aW91cyBhcmUgdGhlIE1hYyBhZGRyZXNzLAorCQk9PlRoZSBzZXZlbnRoIGRlY2ltYWwgbnVtYmVyIGlzIHRoZSB0aWQgdmFsdWUuCisqLworICAgIGlmKHN0cmxlbihhcmcpIDwgMTkpICAvL01hYyBhZGRyZXNzIGFjY2VwdGFibGUgZm9ybWF0IDAxOjAyOjAzOjA0OjA1OjA2IGxlbmd0aCAxNyBwbHVzIHRoZSAiLSIgYW5kIHRpZCB2YWx1ZSBpbiBkZWNpbWFsIGZvcm1hdC4KKwkJcmV0dXJuIEZBTFNFOworCisJdG9rZW4gPSBzdHJjaHIoYXJnLCBEQVNIKTsKKwlpZiAoKHRva2VuICE9IE5VTEwpICYmIChzdHJsZW4odG9rZW4pPjEpKQorCXsKKwkJdGlkID0gc2ltcGxlX3N0cnRvbCgodG9rZW4rMSksIDAsIDEwKTsKKwkJaWYgKHRpZCA+IE5VTV9PRl9USUQpCisJCQlyZXR1cm4gRkFMU0U7CisKKwkJKnRva2VuID0gJ1wwJzsKKwkJZm9yIChpID0gMCwgdG9rZW4gPSByc3RydG9rKGFyZywgJnNlcFZhbHVlWzBdKTsgdG9rZW47IHRva2VuID0gcnN0cnRvayhOVUxMLCAmc2VwVmFsdWVbMF0pLCBpKyspCisJCXsKKwkJCWlmKChzdHJsZW4odG9rZW4pICE9IDIpIHx8ICghaXN4ZGlnaXQoKnRva2VuKSkgfHwgKCFpc3hkaWdpdCgqKHRva2VuKzEpKSkpCisJCQkJcmV0dXJuIEZBTFNFOworCQkJQXRvSCh0b2tlbiwgKFBVQ0hBUikoJm1hY1tpXSksIDEpOworCQl9CisJCWlmKGkgIT0gNikKKwkJCXJldHVybiBGQUxTRTsKKworCQlwcmludGsoIlxuJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMngtJTAyeCIsIG1hY1swXSwgbWFjWzFdLAorCQkgICAgICAgbWFjWzJdLCBtYWNbM10sIG1hY1s0XSwgbWFjWzVdLCB0aWQpOworCisJCXBFbnRyeSA9IE1hY1RhYmxlTG9va3VwKHBBZCwgbWFjKTsKKworCQlpZiAocEVudHJ5KSB7CisJCSAgICBwcmludGsoIlxuVGVhciBkb3duIFJlYyBCQSBTZXNzaW9uOiBUaWQgPSAlZFxuIiwgdGlkKTsKKwkJICAgIEJBUmVjU2Vzc2lvblRlYXJEb3duKHBBZCwgcEVudHJ5LT5BaWQsIHRpZCwgRkFMU0UpOworCQl9CisKKwkJcmV0dXJuIFRSVUU7CisJfQorCisJcmV0dXJuIEZBTFNFOworCit9CisKK0lOVAlTZXRfSHRCd19Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVTE9ORyBIdEJ3OworCisJSHRCdyA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisJaWYgKEh0QncgPT0gQldfNDApCisJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5CVyAgPSBCV180MDsKKwllbHNlIGlmIChIdEJ3ID09IEJXXzIwKQorCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlcgID0gQldfMjA7CisJZWxzZQorCQlyZXR1cm4gRkFMU0U7ICAvL0ludmFsaWQgYXJndW1lbnQKKworCVNldENvbW1vbkhUKHBBZCk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfSHRCd19Qcm9jOjooSHRCdz0lZClcbiIsIHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5CVykpOworCisJcmV0dXJuIFRSVUU7Cit9CisKK0lOVAlTZXRfSHRNY3NfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJVUxPTkcgSHRNY3MsIE1jc190bXA7CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisgICAgQk9PTEVBTiBiQXV0b1JhdGUgPSBGQUxTRTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCU1jc190bXAgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCisJaWYgKE1jc190bXAgPD0gMTUgfHwgTWNzX3RtcCA9PSAzMikKKwkJSHRNY3MgPSBNY3NfdG1wOworCWVsc2UKKwkJSHRNY3MgPSBNQ1NfQVVUTzsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJeworCQlwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IEh0TWNzOworCQlwQWQtPlN0YUNmZy5iQXV0b1R4UmF0ZVN3aXRjaCA9IChIdE1jcyA9PSBNQ1NfQVVUTykgPyBUUlVFOkZBTFNFOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfSHRNY3NfUHJvYzo6KEh0TWNzPSVkLCBiQXV0b1R4UmF0ZVN3aXRjaCA9ICVkKVxuIiwKKwkJCQkJCXBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTLCBwQWQtPlN0YUNmZy5iQXV0b1R4UmF0ZVN3aXRjaCkpOworCisJCWlmICgocEFkLT5Db21tb25DZmcuUGh5TW9kZSA8IFBIWV8xMUFCR05fTUlYRUQpIHx8CisJCQkocEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5IVFBoeU1vZGUuZmllbGQuTU9ERSA8IE1PREVfSFRNSVgpKQorCQl7CisJICAgICAgICBpZiAoKHBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTICE9IE1DU19BVVRPKSAmJgorCQkJCShIdE1jcyA+PSAwICYmIEh0TWNzIDw9IDMpICYmCisJICAgICAgICAgICAgKHBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuRml4ZWRUeE1vZGUgPT0gRklYRURfVFhNT0RFX0NDSykpCisJCQl7CisJCQkJUlRNUFNldERlc2lyZWRSYXRlcyhwQWQsIChMT05HKSAoUmF0ZUlkVG9NYnBzW0h0TWNzXSAqIDEwMDAwMDApKTsKKwkJCX0KKwkgICAgICAgIGVsc2UgaWYgKChwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyAhPSBNQ1NfQVVUTykgJiYKKwkJCQkJKEh0TWNzID49IDAgJiYgSHRNY3MgPD0gNykgJiYKKwkgICAgICAgICAgICAJKHBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuRml4ZWRUeE1vZGUgPT0gRklYRURfVFhNT0RFX09GRE0pKQorCQkJeworCQkJCVJUTVBTZXREZXNpcmVkUmF0ZXMocEFkLCAoTE9ORykgKFJhdGVJZFRvTWJwc1tIdE1jcys0XSAqIDEwMDAwMDApKTsKKwkJCX0KKwkJCWVsc2UKKwkJCQliQXV0b1JhdGUgPSBUUlVFOworCisJCQlpZiAoYkF1dG9SYXRlKQorCQkJeworCSAgICAgICAgICAgIHBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTX0FVVE87CisJCQkJUlRNUFNldERlc2lyZWRSYXRlcyhwQWQsIC0xKTsKKwkJCX0KKwkgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9IdE1jc19Qcm9jOjooRml4ZWRUeE1vZGU9JWQpXG4iLHBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuRml4ZWRUeE1vZGUpKTsKKwkJfQorICAgICAgICBpZiAoQURIT0NfT04ocEFkKSkKKyAgICAgICAgICAgIHJldHVybiBUUlVFOworCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCVNldENvbW1vbkhUKHBBZCk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworSU5UCVNldF9IdEdpX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCVVMT05HIEh0R2k7CisKKwlIdEdpID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKworCWlmICggSHRHaSA9PSBHSV80MDApCisJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5TaG9ydEdJID0gR0lfNDAwOworCWVsc2UgaWYgKCBIdEdpID09IEdJXzgwMCApCisJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5TaG9ydEdJID0gR0lfODAwOworCWVsc2UKKwkJcmV0dXJuIEZBTFNFOyAvL0ludmFsaWQgYXJndW1lbnQKKworCVNldENvbW1vbkhUKHBBZCk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfSHRHaV9Qcm9jOjooU2hvcnRHST0lZClcbiIscEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLlNob3J0R0kpKTsKKworCXJldHVybiBUUlVFOworfQorCisKK0lOVAlTZXRfSHRUeEJBU2l6ZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVQ0hBUiBTaXplOworCisJU2l6ZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisKKwlpZiAoU2l6ZSA8PTAgfHwgU2l6ZSA+PTY0KQorCXsKKwkJU2l6ZSA9IDg7CisJfQorCXBBZC0+Q29tbW9uQ2ZnLlR4QkFTaXplID0gU2l6ZS0xOworCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlNldF9IdFR4QkFTaXplIDo6KFR4QkFTaXplPSAlZClcbiIsIFNpemUpKTsKKworCXJldHVybiBUUlVFOworfQorCisKK0lOVAlTZXRfSHRPcE1vZGVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisKKwlVTE9ORyBWYWx1ZTsKKworCVZhbHVlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKworCWlmIChWYWx1ZSA9PSBIVE1PREVfR0YpCisJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5IVE1PREUgID0gSFRNT0RFX0dGOworCWVsc2UgaWYgKCBWYWx1ZSA9PSBIVE1PREVfTU0gKQorCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuSFRNT0RFICA9IEhUTU9ERV9NTTsKKwllbHNlCisJCXJldHVybiBGQUxTRTsgLy9JbnZhbGlkIGFyZ3VtZW50CisKKwlTZXRDb21tb25IVChwQWQpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0h0T3BNb2RlX1Byb2M6OihIdE9wTW9kZT0lZClcbiIscEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkhUTU9ERSkpOworCisJcmV0dXJuIFRSVUU7CisKK30KKworSU5UCVNldF9IdFN0YmNfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisKKwlVTE9ORyBWYWx1ZTsKKworCVZhbHVlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKworCWlmIChWYWx1ZSA9PSBTVEJDX1VTRSkKKwkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLlNUQkMgPSBTVEJDX1VTRTsKKwllbHNlIGlmICggVmFsdWUgPT0gU1RCQ19OT05FICkKKwkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLlNUQkMgPSBTVEJDX05PTkU7CisJZWxzZQorCQlyZXR1cm4gRkFMU0U7IC8vSW52YWxpZCBhcmd1bWVudAorCisJU2V0Q29tbW9uSFQocEFkKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9TdGJjX1Byb2M6OihIdFN0YmM9JWQpXG4iLHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5TVEJDKSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworSU5UCVNldF9IdEh0Y19Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKworCVVMT05HIFZhbHVlOworCisJVmFsdWUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCWlmIChWYWx1ZSA9PSAwKQorCQlwQWQtPkhUQ0VuYWJsZSA9IEZBTFNFOworCWVsc2UgaWYgKCBWYWx1ZSA9PTEgKQorICAgICAgICAJcEFkLT5IVENFbmFibGUgPSBUUlVFOworCWVsc2UKKwkJcmV0dXJuIEZBTFNFOyAvL0ludmFsaWQgYXJndW1lbnQKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9IdEh0Y19Qcm9jOjooSHRIdGM9JWQpXG4iLHBBZC0+SFRDRW5hYmxlKSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworSU5UCVNldF9IdEV4dGNoYV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKworCVVMT05HIFZhbHVlOworCisJVmFsdWUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCisJaWYgKFZhbHVlID09IDApCisJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5FWFRDSEEgID0gRVhUQ0hBX0JFTE9XOworCWVsc2UgaWYgKCBWYWx1ZSA9PTEgKQorICAgICAgICBwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuRVhUQ0hBID0gRVhUQ0hBX0FCT1ZFOworCWVsc2UKKwkJcmV0dXJuIEZBTFNFOyAvL0ludmFsaWQgYXJndW1lbnQKKworCVNldENvbW1vbkhUKHBBZCk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfSHRFeHRjaGFfUHJvYzo6KEh0RXh0Y2hhPSVkKVxuIixwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuRVhUQ0hBKSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworSU5UCVNldF9IdE1wZHVEZW5zaXR5X1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCVVMT05HIFZhbHVlOworCisJVmFsdWUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCisJaWYgKFZhbHVlIDw9NyAmJiBWYWx1ZSA+PSAwKQorCQlwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTXBkdURlbnNpdHkgPSBWYWx1ZTsKKwllbHNlCisJCXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5NcGR1RGVuc2l0eSA9IDQ7CisKKwlTZXRDb21tb25IVChwQWQpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0h0TXBkdURlbnNpdHlfUHJvYzo6KEh0TXBkdURlbnNpdHk9JWQpXG4iLHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5NcGR1RGVuc2l0eSkpOworCisJcmV0dXJuIFRSVUU7Cit9CisKK0lOVAlTZXRfSHRCYVdpblNpemVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJVUxPTkcgVmFsdWU7CisKKwlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisKKworCWlmIChWYWx1ZSA+PTEgJiYgVmFsdWUgPD0gNjQpCisJeworCQlwQWQtPkNvbW1vbkNmZy5SRUdCQUNhcGFiaWxpdHkuZmllbGQuUnhCQVdpbkxpbWl0ID0gVmFsdWU7CisJCXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5SeEJBV2luTGltaXQgPSBWYWx1ZTsKKwl9CisJZWxzZQorCXsKKyAgICAgICAgcEFkLT5Db21tb25DZmcuUkVHQkFDYXBhYmlsaXR5LmZpZWxkLlJ4QkFXaW5MaW1pdCA9IDY0OworCQlwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuUnhCQVdpbkxpbWl0ID0gNjQ7CisJfQorCisJU2V0Q29tbW9uSFQocEFkKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9IdEJhV2luU2l6ZV9Qcm9jOjooSHRCYVdpblNpemU9JWQpXG4iLHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5SeEJBV2luTGltaXQpKTsKKworCXJldHVybiBUUlVFOworfQorCitJTlQJU2V0X0h0UmRnX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCVVMT05HIFZhbHVlOworCisJVmFsdWUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCisJaWYgKFZhbHVlID09IDApCisJCXBBZC0+Q29tbW9uQ2ZnLmJSZGcgPSBGQUxTRTsKKwllbHNlIGlmICggVmFsdWUgPT0xICkKKwl7CisJCXBBZC0+SFRDRW5hYmxlID0gVFJVRTsKKyAgICAgICAgCXBBZC0+Q29tbW9uQ2ZnLmJSZGcgPSBUUlVFOworCX0KKwllbHNlCisJCXJldHVybiBGQUxTRTsgLy9JbnZhbGlkIGFyZ3VtZW50CisKKwlTZXRDb21tb25IVChwQWQpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0h0UmRnX1Byb2M6OihIdFJkZz0lZClcbiIscEFkLT5Db21tb25DZmcuYlJkZykpOworCisJcmV0dXJuIFRSVUU7Cit9CisKK0lOVAlTZXRfSHRMaW5rQWRhcHRfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJVUxPTkcgVmFsdWU7CisKKwlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisJaWYgKFZhbHVlID09IDApCisJCXBBZC0+YkxpbmtBZGFwdCA9IEZBTFNFOworCWVsc2UgaWYgKCBWYWx1ZSA9PTEgKQorCXsKKwkJCXBBZC0+SFRDRW5hYmxlID0gVFJVRTsKKwkJCXBBZC0+YkxpbmtBZGFwdCA9IFRSVUU7CisJfQorCWVsc2UKKwkJcmV0dXJuIEZBTFNFOyAvL0ludmFsaWQgYXJndW1lbnQKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9IdExpbmtBZGFwdF9Qcm9jOjooSHRMaW5rQWRhcHQ9JWQpXG4iLHBBZC0+YkxpbmtBZGFwdCkpOworCisJcmV0dXJuIFRSVUU7Cit9CisKK0lOVAlTZXRfSHRBbXNkdV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVTE9ORyBWYWx1ZTsKKworCVZhbHVlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKwlpZiAoVmFsdWUgPT0gMCkKKwkJcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkFtc2R1RW5hYmxlID0gRkFMU0U7CisJZWxzZSBpZiAoIFZhbHVlID09IDEgKQorICAgICAgICBwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQW1zZHVFbmFibGUgPSBUUlVFOworCWVsc2UKKwkJcmV0dXJuIEZBTFNFOyAvL0ludmFsaWQgYXJndW1lbnQKKworCVNldENvbW1vbkhUKHBBZCk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfSHRBbXNkdV9Qcm9jOjooSHRBbXNkdT0lZClcbiIscEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkFtc2R1RW5hYmxlKSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworSU5UCVNldF9IdEF1dG9CYV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVTE9ORyBWYWx1ZTsKKworCVZhbHVlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKwlpZiAoVmFsdWUgPT0gMCkKKwkJcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkF1dG9CQSA9IEZBTFNFOworICAgIGVsc2UgaWYgKFZhbHVlID09IDEpCisJCXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BdXRvQkEgPSBUUlVFOworCWVsc2UKKwkJcmV0dXJuIEZBTFNFOyAvL0ludmFsaWQgYXJndW1lbnQKKworICAgIHBBZC0+Q29tbW9uQ2ZnLlJFR0JBQ2FwYWJpbGl0eS5maWVsZC5BdXRvQkEgPSBwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQXV0b0JBOworCVNldENvbW1vbkhUKHBBZCk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfSHRBdXRvQmFfUHJvYzo6KEh0QXV0b0JhPSVkKVxuIixwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQXV0b0JBKSk7CisKKwlyZXR1cm4gVFJVRTsKKworfQorCitJTlQJU2V0X0h0UHJvdGVjdF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVTE9ORyBWYWx1ZTsKKworCVZhbHVlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKwlpZiAoVmFsdWUgPT0gMCkKKwkJcEFkLT5Db21tb25DZmcuYkhUUHJvdGVjdCA9IEZBTFNFOworICAgIGVsc2UgaWYgKFZhbHVlID09IDEpCisJCXBBZC0+Q29tbW9uQ2ZnLmJIVFByb3RlY3QgPSBUUlVFOworCWVsc2UKKwkJcmV0dXJuIEZBTFNFOyAvL0ludmFsaWQgYXJndW1lbnQKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9IdFByb3RlY3RfUHJvYzo6KEh0UHJvdGVjdD0lZClcbiIscEFkLT5Db21tb25DZmcuYkhUUHJvdGVjdCkpOworCisJcmV0dXJuIFRSVUU7Cit9CisKK0lOVAlTZXRfU2VuZFBTTVBBY3Rpb25fUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisgICAgVUNIQVIgbWFjWzZdLCBtb2RlOworCWNoYXIgKnRva2VuLCBzZXBWYWx1ZVtdID0gIjoiLCBEQVNIID0gJy0nOworCUlOVCBpOworICAgIE1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5OworCisgICAgLy9wcmludGsoIlxuJXNcbiIsIGFyZyk7CisvKgorCVRoZSBCQVJlY1RlYXJEb3duIGludXB0IHN0cmluZyBmb3JtYXQgc2hvdWxkIGJlIHh4Onh4Onh4Onh4Onh4Onh4LWQsCisJCT0+VGhlIHNpeCAyIGRpZ2l0IGhleC1kZWNpbWFsIG51bWJlciBwcmV2aW91cyBhcmUgdGhlIE1hYyBhZGRyZXNzLAorCQk9PlRoZSBzZXZlbnRoIGRlY2ltYWwgbnVtYmVyIGlzIHRoZSBtb2RlIHZhbHVlLgorKi8KKyAgICBpZihzdHJsZW4oYXJnKSA8IDE5KSAgLy9NYWMgYWRkcmVzcyBhY2NlcHRhYmxlIGZvcm1hdCAwMTowMjowMzowNDowNTowNiBsZW5ndGggMTcgcGx1cyB0aGUgIi0iIGFuZCBtb2RlIHZhbHVlIGluIGRlY2ltYWwgZm9ybWF0LgorCQlyZXR1cm4gRkFMU0U7CisKKyAgIAl0b2tlbiA9IHN0cmNocihhcmcsIERBU0gpOworCWlmICgodG9rZW4gIT0gTlVMTCkgJiYgKHN0cmxlbih0b2tlbik+MSkpCisJeworCQltb2RlID0gc2ltcGxlX3N0cnRvbCgodG9rZW4rMSksIDAsIDEwKTsKKwkJaWYgKG1vZGUgPiBNTVBTX0VOQUJMRSkKKwkJCXJldHVybiBGQUxTRTsKKworCQkqdG9rZW4gPSAnXDAnOworCQlmb3IgKGkgPSAwLCB0b2tlbiA9IHJzdHJ0b2soYXJnLCAmc2VwVmFsdWVbMF0pOyB0b2tlbjsgdG9rZW4gPSByc3RydG9rKE5VTEwsICZzZXBWYWx1ZVswXSksIGkrKykKKwkJeworCQkJaWYoKHN0cmxlbih0b2tlbikgIT0gMikgfHwgKCFpc3hkaWdpdCgqdG9rZW4pKSB8fCAoIWlzeGRpZ2l0KCoodG9rZW4rMSkpKSkKKwkJCQlyZXR1cm4gRkFMU0U7CisJCQlBdG9IKHRva2VuLCAoUFVDSEFSKSgmbWFjW2ldKSwgMSk7CisJCX0KKwkJaWYoaSAhPSA2KQorCQkJcmV0dXJuIEZBTFNFOworCisJCXByaW50aygiXG4lMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeC0lMDJ4IiwgbWFjWzBdLCBtYWNbMV0sCisJCSAgICAgICBtYWNbMl0sIG1hY1szXSwgbWFjWzRdLCBtYWNbNV0sIG1vZGUpOworCisJCXBFbnRyeSA9IE1hY1RhYmxlTG9va3VwKHBBZCwgbWFjKTsKKworCQlpZiAocEVudHJ5KSB7CisJCSAgICBwcmludGsoIlxuU2VuZFBTTVBBY3Rpb24gTUlQUyBtb2RlID0gJWRcbiIsIG1vZGUpOworCQkgICAgU2VuZFBTTVBBY3Rpb24ocEFkLCBwRW50cnktPkFpZCwgbW9kZSk7CisJCX0KKworCQlyZXR1cm4gVFJVRTsKKwl9CisKKwlyZXR1cm4gRkFMU0U7CisKKworfQorCitJTlQJU2V0X0h0TUlNT1BTbW9kZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVTE9ORyBWYWx1ZTsKKworCVZhbHVlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKworCWlmIChWYWx1ZSA8PTMgJiYgVmFsdWUgPj0gMCkKKwkJcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1NUFNtb2RlID0gVmFsdWU7CisJZWxzZQorCQlwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTU1QU21vZGUgPSAzOworCisJU2V0Q29tbW9uSFQocEFkKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9IdE1JTU9QU21vZGVfUHJvYzo6KE1JTU9QUyBtb2RlPSVkKVxuIixwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTU1QU21vZGUpKTsKKworCXJldHVybiBUUlVFOworfQorCisKK0lOVAlTZXRfRm9yY2VTaG9ydEdJX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCVVMT05HIFZhbHVlOworCisJVmFsdWUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCWlmIChWYWx1ZSA9PSAwKQorCQlwQWQtPldJRkl0ZXN0YmVkLmJTaG9ydEdJID0gRkFMU0U7CisJZWxzZSBpZiAoVmFsdWUgPT0gMSkKKwkJcEFkLT5XSUZJdGVzdGJlZC5iU2hvcnRHSSA9IFRSVUU7CisJZWxzZQorCQlyZXR1cm4gRkFMU0U7IC8vSW52YWxpZCBhcmd1bWVudAorCisJU2V0Q29tbW9uSFQocEFkKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9Gb3JjZVNob3J0R0lfUHJvYzo6KEZvcmNlU2hvcnRHST0lZClcbiIsIHBBZC0+V0lGSXRlc3RiZWQuYlNob3J0R0kpKTsKKworCXJldHVybiBUUlVFOworfQorCisKKworSU5UCVNldF9Gb3JjZUdGX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCVVMT05HIFZhbHVlOworCisJVmFsdWUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCWlmIChWYWx1ZSA9PSAwKQorCQlwQWQtPldJRkl0ZXN0YmVkLmJHcmVlbkZpZWxkID0gRkFMU0U7CisJZWxzZSBpZiAoVmFsdWUgPT0gMSkKKwkJcEFkLT5XSUZJdGVzdGJlZC5iR3JlZW5GaWVsZCA9IFRSVUU7CisJZWxzZQorCQlyZXR1cm4gRkFMU0U7IC8vSW52YWxpZCBhcmd1bWVudAorCisJU2V0Q29tbW9uSFQocEFkKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9Gb3JjZUdGX1Byb2M6OihGb3JjZUdGPSVkKVxuIiwgcEFkLT5XSUZJdGVzdGJlZC5iR3JlZW5GaWVsZCkpOworCisJcmV0dXJuIFRSVUU7Cit9CisKK0lOVAlTZXRfSHRNaW1vUHNfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJVUxPTkcgVmFsdWU7CisKKwlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisJaWYgKFZhbHVlID09IDApCisJCXBBZC0+Q29tbW9uQ2ZnLmJNSU1PUFNFbmFibGUgPSBGQUxTRTsKKwllbHNlIGlmIChWYWx1ZSA9PSAxKQorCQlwQWQtPkNvbW1vbkNmZy5iTUlNT1BTRW5hYmxlID0gVFJVRTsKKwllbHNlCisJCXJldHVybiBGQUxTRTsgLy9JbnZhbGlkIGFyZ3VtZW50CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfSHRNaW1vUHNfUHJvYzo6KEh0TWltb1BzPSVkKVxuIixwQWQtPkNvbW1vbkNmZy5iTUlNT1BTRW5hYmxlKSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCitJTlQJU2V0Q29tbW9uSFQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQpCit7CisJT0lEX1NFVF9IVF9QSFlNT0RFCQlTZXRIVDsKKworCWlmIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlIDwgUEhZXzExQUJHTl9NSVhFRCkKKwkJcmV0dXJuIEZBTFNFOworCisJU2V0SFQuUGh5TW9kZSA9IHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGU7CisJU2V0SFQuVHJhbnNtaXRObyA9ICgoVUNIQVIpcEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCk7CisJU2V0SFQuSHRNb2RlID0gKFVDSEFSKXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5IVE1PREU7CisJU2V0SFQuRXh0T2Zmc2V0ID0gKFVDSEFSKXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5FWFRDSEE7CisJU2V0SFQuTUNTID0gTUNTX0FVVE87CisJU2V0SFQuQlcgPSAoVUNIQVIpcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXOworCVNldEhULlNUQkMgPSAoVUNIQVIpcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLlNUQkM7CisJU2V0SFQuU0hPUlRHSSA9IChVQ0hBUilwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuU2hvcnRHSTsKKworCVJUTVBTZXRIVChwQWQsICZTZXRIVCk7CisKKwlyZXR1cm4gVFJVRTsKK30KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworSU5UCVNldF9GaXhlZFR4TW9kZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVQ0hBUglmaXhfdHhfbW9kZSA9IEZJWEVEX1RYTU9ERV9IVDsKKworCWlmIChzdHJjbXAoYXJnLCAiT0ZETSIpID09IDAgfHwgc3RyY21wKGFyZywgIm9mZG0iKSA9PSAwKQorCXsKKwkJZml4X3R4X21vZGUgPSBGSVhFRF9UWE1PREVfT0ZETTsKKwl9CisJZWxzZSBpZiAoc3RyY21wKGFyZywgIkNDSyIpID09IDAgfHwgc3RyY21wKGFyZywgImNjayIpID09IDApCisJeworICAgICAgICBmaXhfdHhfbW9kZSA9IEZJWEVEX1RYTU9ERV9DQ0s7CisJfQorCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJcEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5GaXhlZFR4TW9kZSA9IGZpeF90eF9tb2RlOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0ZpeGVkVHhNb2RlX1Byb2M6OihGaXhlZFR4TW9kZT0lZClcbiIsIGZpeF90eF9tb2RlKSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworI2lmZGVmIENPTkZJR19BUFNUQV9NSVhFRF9TVVBQT1JUCitJTlQJU2V0X09wTW9kZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVTE9ORyBWYWx1ZTsKKworCVZhbHVlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKworI2lmZGVmIFJUMjg3MAorCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfU1RBUlRfVVApKQorI2VuZGlmIC8vIFJUMjg3MCAvLworCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiQ2FuIG5vdCBzd2l0Y2ggb3BlcmF0ZSBtb2RlIG9uIGludGVyZmFjZSB1cCAhISBcbiIpKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCWlmIChWYWx1ZSA9PSAwKQorCQlwQWQtPk9wTW9kZSA9IE9QTU9ERV9TVEE7CisJZWxzZSBpZiAoVmFsdWUgPT0gMSkKKwkJcEFkLT5PcE1vZGUgPSBPUE1PREVfQVA7CisJZWxzZQorCQlyZXR1cm4gRkFMU0U7IC8vSW52YWxpZCBhcmd1bWVudAorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X09wTW9kZV9Qcm9jOjooT3BNb2RlPSVzKVxuIiwgcEFkLT5PcE1vZGUgPT0gMSA/ICJBUCBNb2RlIiA6ICJTVEEgTW9kZSIpKTsKKworCXJldHVybiBUUlVFOworfQorI2VuZGlmIC8vIENPTkZJR19BUFNUQV9NSVhFRF9TVVBQT1JUIC8vCisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworUENIQVIgICBSVE1QR2V0UmFsaW5rQXV0aE1vZGVTdHIoCisgICAgSU4gIE5ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREUgYXV0aE1vZGUpCit7CisJc3dpdGNoKGF1dGhNb2RlKQorCXsKKwkJY2FzZSBOZGlzODAyXzExQXV0aE1vZGVPcGVuOgorCQkJcmV0dXJuICJPUEVOIjsKKwkJY2FzZSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0s6CisJCQlyZXR1cm4gIldQQVBTSyI7CisJCWNhc2UgTmRpczgwMl8xMUF1dGhNb2RlU2hhcmVkOgorCQkJcmV0dXJuICJTSEFSRUQiOworCQljYXNlIE5kaXM4MDJfMTFBdXRoTW9kZVdQQToKKwkJCXJldHVybiAiV1BBIjsKKwkJY2FzZSBOZGlzODAyXzExQXV0aE1vZGVXUEEyOgorCQkJcmV0dXJuICJXUEEyIjsKKwkJY2FzZSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLOgorCQkJcmV0dXJuICJXUEEyUFNLIjsKKyAgICAgICAgY2FzZSBOZGlzODAyXzExQXV0aE1vZGVXUEExUFNLV1BBMlBTSzoKKwkJCXJldHVybiAiV1BBUFNLV1BBMlBTSyI7CisgICAgICAgIGNhc2UgTmRpczgwMl8xMUF1dGhNb2RlV1BBMVdQQTI6CisJCQlyZXR1cm4gIldQQTFXUEEyIjsKKwkJY2FzZSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lOgorCQkJcmV0dXJuICJXUEFOT05FIjsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAiVU5LTk9XIjsKKwl9Cit9CisKK1BDSEFSICAgUlRNUEdldFJhbGlua0VuY3J5TW9kZVN0cigKKyAgICBJTiAgVVNIT1JUIGVuY3J5TW9kZSkKK3sKKwlzd2l0Y2goZW5jcnlNb2RlKQorCXsKKwkJY2FzZSBOZGlzODAyXzExV0VQRGlzYWJsZWQ6CisJCQlyZXR1cm4gIk5PTkUiOworCQljYXNlIE5kaXM4MDJfMTFXRVBFbmFibGVkOgorCQkJcmV0dXJuICJXRVAiOworCQljYXNlIE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ6CisJCQlyZXR1cm4gIlRLSVAiOworCQljYXNlIE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQ6CisJCQlyZXR1cm4gIkFFUyI7CisgICAgICAgIGNhc2UgTmRpczgwMl8xMUVuY3J5cHRpb240RW5hYmxlZDoKKwkJCXJldHVybiAiVEtJUEFFUyI7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gIlVOS05PVyI7CisJfQorfQorCitJTlQgUlRNUFNob3dDZmdWYWx1ZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlwTmFtZSwKKwlJTglQVUNIQVIJCQlwQnVmKQoreworCUlOVAlTdGF0dXMgPSAwOworCisJZm9yIChQUlRNUF9QUklWQVRFX1NUQV9TSE9XX0NGR19WQUxVRV9QUk9DID0gUlRNUF9QUklWQVRFX1NUQV9TSE9XX0NGR19WQUxVRV9QUk9DOyBQUlRNUF9QUklWQVRFX1NUQV9TSE9XX0NGR19WQUxVRV9QUk9DLT5uYW1lOyBQUlRNUF9QUklWQVRFX1NUQV9TSE9XX0NGR19WQUxVRV9QUk9DKyspCisJeworCQlpZiAoIXN0cmNtcChwTmFtZSwgUFJUTVBfUFJJVkFURV9TVEFfU0hPV19DRkdfVkFMVUVfUFJPQy0+bmFtZSkpCisJCXsKKwkJCWlmKFBSVE1QX1BSSVZBVEVfU1RBX1NIT1dfQ0ZHX1ZBTFVFX1BST0MtPnNob3dfcHJvYyhwQWQsIHBCdWYpKQorCQkJCVN0YXR1cyA9IC1FSU5WQUw7CisJCQlicmVhazsgIC8vRXhpdCBmb3IgbG9vcC4KKwkJfQorCX0KKworCWlmKFBSVE1QX1BSSVZBVEVfU1RBX1NIT1dfQ0ZHX1ZBTFVFX1BST0MtPm5hbWUgPT0gTlVMTCkKKwl7CisJCXNwcmludGYocEJ1ZiwgIlxuIik7CisJCWZvciAoUFJUTVBfUFJJVkFURV9TVEFfU0hPV19DRkdfVkFMVUVfUFJPQyA9IFJUTVBfUFJJVkFURV9TVEFfU0hPV19DRkdfVkFMVUVfUFJPQzsgUFJUTVBfUFJJVkFURV9TVEFfU0hPV19DRkdfVkFMVUVfUFJPQy0+bmFtZTsgUFJUTVBfUFJJVkFURV9TVEFfU0hPV19DRkdfVkFMVUVfUFJPQysrKQorCQkJc3ByaW50ZihwQnVmLCAiJXMlc1xuIiwgcEJ1ZiwgUFJUTVBfUFJJVkFURV9TVEFfU0hPV19DRkdfVkFMVUVfUFJPQy0+bmFtZSk7CisJfQorCisJcmV0dXJuIFN0YXR1czsKK30KKworSU5UCVNob3dfU1NJRF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKQoreworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJc3ByaW50ZihwQnVmLCAiXHQlcyIsIHBBZC0+Q29tbW9uQ2ZnLlNzaWQpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCXJldHVybiAwOworfQorCitJTlQJU2hvd19XaXJlbGVzc01vZGVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1ZikKK3sKKwlzd2l0Y2gocEFkLT5Db21tb25DZmcuUGh5TW9kZSkKKwl7CisJCWNhc2UgUEhZXzExQkdfTUlYRUQ6CisJCQlzcHJpbnRmKHBCdWYsICJcdDExQi9HIik7CisJCQlicmVhazsKKwkJY2FzZSBQSFlfMTFCOgorCQkJc3ByaW50ZihwQnVmLCAiXHQxMUIiKTsKKwkJCWJyZWFrOworCQljYXNlIFBIWV8xMUE6CisJCQlzcHJpbnRmKHBCdWYsICJcdDExQSIpOworCQkJYnJlYWs7CisJCWNhc2UgUEhZXzExQUJHX01JWEVEOgorCQkJc3ByaW50ZihwQnVmLCAiXHQxMUEvQi9HIik7CisJCQlicmVhazsKKwkJY2FzZSBQSFlfMTFHOgorCQkJc3ByaW50ZihwQnVmLCAiXHQxMUciKTsKKwkJCWJyZWFrOworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQljYXNlIFBIWV8xMUFCR05fTUlYRUQ6CisJCQlzcHJpbnRmKHBCdWYsICJcdDExQS9CL0cvTiIpOworCQkJYnJlYWs7CisJCWNhc2UgUEhZXzExTl8yXzRHOgorCQkJc3ByaW50ZihwQnVmLCAiXHQxMU4gb25seSB3aXRoIDIuNEciKTsKKwkJCWJyZWFrOworCQljYXNlIFBIWV8xMUdOX01JWEVEOgorCQkJc3ByaW50ZihwQnVmLCAiXHQxMUcvTiIpOworCQkJYnJlYWs7CisJCWNhc2UgUEhZXzExQU5fTUlYRUQ6CisJCQlzcHJpbnRmKHBCdWYsICJcdDExQS9OIik7CisJCQlicmVhazsKKwkJY2FzZSBQSFlfMTFCR05fTUlYRUQ6CisJCQlzcHJpbnRmKHBCdWYsICJcdDExQi9HL04iKTsKKwkJCWJyZWFrOworCQljYXNlIFBIWV8xMUFHTl9NSVhFRDoKKwkJCXNwcmludGYocEJ1ZiwgIlx0MTFBL0cvTiIpOworCQkJYnJlYWs7CisJCWNhc2UgUEhZXzExTl81RzoKKwkJCXNwcmludGYocEJ1ZiwgIlx0MTFOIG9ubHkgd2l0aCA1RyIpOworCQkJYnJlYWs7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCWRlZmF1bHQ6CisJCQlzcHJpbnRmKHBCdWYsICJcdFVua25vdyBWYWx1ZSglZCkiLCBwQWQtPkNvbW1vbkNmZy5QaHlNb2RlKTsKKwkJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKK30KKworCitJTlQJU2hvd19UeEJ1cnN0X1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpCit7CisJc3ByaW50ZihwQnVmLCAiXHQlcyIsIHBBZC0+Q29tbW9uQ2ZnLmJFbmFibGVUeEJ1cnN0ID8gIlRSVUUiOiJGQUxTRSIpOworCXJldHVybiAwOworfQorCitJTlQJU2hvd19UeFByZWFtYmxlX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpCit7CisJc3dpdGNoKHBBZC0+Q29tbW9uQ2ZnLlR4UHJlYW1ibGUpCisJeworCQljYXNlIFJ0ODAyXzExUHJlYW1ibGVTaG9ydDoKKwkJCXNwcmludGYocEJ1ZiwgIlx0U2hvcnQiKTsKKwkJCWJyZWFrOworCQljYXNlIFJ0ODAyXzExUHJlYW1ibGVMb25nOgorCQkJc3ByaW50ZihwQnVmLCAiXHRMb25nIik7CisJCQlicmVhazsKKwkJY2FzZSBSdDgwMl8xMVByZWFtYmxlQXV0bzoKKwkJCXNwcmludGYocEJ1ZiwgIlx0QXV0byIpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlzcHJpbnRmKHBCdWYsICJcdFVua25vdyBWYWx1ZSglbHUpIiwgcEFkLT5Db21tb25DZmcuVHhQcmVhbWJsZSk7CisJCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworSU5UCVNob3dfVHhQb3dlcl9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKQoreworCXNwcmludGYocEJ1ZiwgIlx0JWx1IiwgcEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UpOworCXJldHVybiAwOworfQorCitJTlQJU2hvd19DaGFubmVsX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpCit7CisJc3ByaW50ZihwQnVmLCAiXHQlZCIsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpOworCXJldHVybiAwOworfQorCitJTlQJU2hvd19CR1Byb3RlY3Rpb25fUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1ZikKK3sKKwlzd2l0Y2gocEFkLT5Db21tb25DZmcuVXNlQkdQcm90ZWN0aW9uKQorCXsKKwkJY2FzZSAxOiAvL0Fsd2F5cyBPbgorCQkJc3ByaW50ZihwQnVmLCAiXHRPTiIpOworCQkJYnJlYWs7CisJCWNhc2UgMjogLy9BbHdheXMgT0ZGCisJCQlzcHJpbnRmKHBCdWYsICJcdE9GRiIpOworCQkJYnJlYWs7CisJCWNhc2UgMDogLy9BVVRPCisJCQlzcHJpbnRmKHBCdWYsICJcdEF1dG8iKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJc3ByaW50ZihwQnVmLCAiXHRVbmtub3cgVmFsdWUoJWx1KSIsIHBBZC0+Q29tbW9uQ2ZnLlVzZUJHUHJvdGVjdGlvbik7CisJCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKK0lOVAlTaG93X1JUU1RocmVzaG9sZF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKQoreworCXNwcmludGYocEJ1ZiwgIlx0JXUiLCBwQWQtPkNvbW1vbkNmZy5SdHNUaHJlc2hvbGQpOworCXJldHVybiAwOworfQorCitJTlQJU2hvd19GcmFnVGhyZXNob2xkX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpCit7CisJc3ByaW50ZihwQnVmLCAiXHQldSIsIHBBZC0+Q29tbW9uQ2ZnLkZyYWdtZW50VGhyZXNob2xkKTsKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorSU5UCVNob3dfSHRCd19Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKQoreworCWlmIChwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlcgPT0gQldfNDApCisJeworCQlzcHJpbnRmKHBCdWYsICJcdDQwIE1IeiIpOworCX0KKwllbHNlCisJeworICAgICAgICBzcHJpbnRmKHBCdWYsICJcdDIwIE1IeiIpOworCX0KKwlyZXR1cm4gMDsKK30KKworSU5UCVNob3dfSHRNY3NfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1ZikKK3sKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCXNwcmludGYocEJ1ZiwgIlx0JXUiLCBwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJcmV0dXJuIDA7Cit9CisKK0lOVAlTaG93X0h0R2lfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1ZikKK3sKKwlzd2l0Y2gocEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLlNob3J0R0kpCisJeworCQljYXNlIEdJXzQwMDoKKwkJCXNwcmludGYocEJ1ZiwgIlx0R0lfNDAwIik7CisJCQlicmVhazsKKwkJY2FzZSBHSV84MDA6CisJCQlzcHJpbnRmKHBCdWYsICJcdEdJXzgwMCIpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlzcHJpbnRmKHBCdWYsICJcdFVua25vdyBWYWx1ZSgldSkiLCBwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuU2hvcnRHSSk7CisJCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKK0lOVAlTaG93X0h0T3BNb2RlX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpCit7CisJc3dpdGNoKHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5IVE1PREUpCisJeworCQljYXNlIEhUTU9ERV9HRjoKKwkJCXNwcmludGYocEJ1ZiwgIlx0R0YiKTsKKwkJCWJyZWFrOworCQljYXNlIEhUTU9ERV9NTToKKwkJCXNwcmludGYocEJ1ZiwgIlx0TU0iKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJc3ByaW50ZihwQnVmLCAiXHRVbmtub3cgVmFsdWUoJXUpIiwgcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkhUTU9ERSk7CisJCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKK0lOVAlTaG93X0h0RXh0Y2hhX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpCit7CisJc3dpdGNoKHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5FWFRDSEEpCisJeworCQljYXNlIEVYVENIQV9CRUxPVzoKKwkJCXNwcmludGYocEJ1ZiwgIlx0QmVsb3ciKTsKKwkJCWJyZWFrOworCQljYXNlIEVYVENIQV9BQk9WRToKKwkJCXNwcmludGYocEJ1ZiwgIlx0QWJvdmUiKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJc3ByaW50ZihwQnVmLCAiXHRVbmtub3cgVmFsdWUoJXUpIiwgcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkVYVENIQSk7CisJCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKKworSU5UCVNob3dfSHRNcGR1RGVuc2l0eV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKQoreworCXNwcmludGYocEJ1ZiwgIlx0JXUiLCBwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTXBkdURlbnNpdHkpOworCXJldHVybiAwOworfQorCitJTlQJU2hvd19IdEJhV2luU2l6ZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKQoreworCXNwcmludGYocEJ1ZiwgIlx0JXUiLCBwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuUnhCQVdpbkxpbWl0KTsKKwlyZXR1cm4gMDsKK30KKworSU5UCVNob3dfSHRSZGdfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1ZikKK3sKKwlzcHJpbnRmKHBCdWYsICJcdCVzIiwgcEFkLT5Db21tb25DZmcuYlJkZyA/ICJUUlVFIjoiRkFMU0UiKTsKKwlyZXR1cm4gMDsKK30KKworSU5UCVNob3dfSHRBbXNkdV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKQoreworCXNwcmludGYocEJ1ZiwgIlx0JXMiLCBwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQW1zZHVFbmFibGUgPyAiVFJVRSI6IkZBTFNFIik7CisJcmV0dXJuIDA7Cit9CisKK0lOVAlTaG93X0h0QXV0b0JhX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpCit7CisJc3ByaW50ZihwQnVmLCAiXHQlcyIsIHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BdXRvQkEgPyAiVFJVRSI6IkZBTFNFIik7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKK0lOVAlTaG93X0NvdW50cnlSZWdpb25fUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1ZikKK3sKKwlzcHJpbnRmKHBCdWYsICJcdCVkIiwgcEFkLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbik7CisJcmV0dXJuIDA7Cit9CisKK0lOVAlTaG93X0NvdW50cnlSZWdpb25BQmFuZF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKQoreworCXNwcmludGYocEJ1ZiwgIlx0JWQiLCBwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uRm9yQUJhbmQpOworCXJldHVybiAwOworfQorCitJTlQJU2hvd19Db3VudHJ5Q29kZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKQoreworCXNwcmludGYocEJ1ZiwgIlx0JXMiLCBwQWQtPkNvbW1vbkNmZy5Db3VudHJ5Q29kZSk7CisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBBR0dSRUdBVElPTl9TVVBQT1JUCitJTlQJU2hvd19Qa3RBZ2dyZWdhdGVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1ZikKK3sKKwlzcHJpbnRmKHBCdWYsICJcdCVzIiwgcEFkLT5Db21tb25DZmcuYkFnZ3JlZ2F0aW9uQ2FwYWJsZSA/ICJUUlVFIjoiRkFMU0UiKTsKKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvLyBBR0dSRUdBVElPTl9TVVBQT1JUIC8vCisKKyNpZmRlZiBXTU1fU1VQUE9SVAorSU5UCVNob3dfV21tQ2FwYWJsZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKQoreworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJc3ByaW50ZihwQnVmLCAiXHQlcyIsIHBBZC0+Q29tbW9uQ2ZnLmJXbW1DYXBhYmxlID8gIlRSVUUiOiJGQUxTRSIpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJcmV0dXJuIDA7Cit9CisjZW5kaWYgLy8gV01NX1NVUFBPUlQgLy8KKworSU5UCVNob3dfSUVFRTgwMjExSF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKQoreworCXNwcmludGYocEJ1ZiwgIlx0JXMiLCBwQWQtPkNvbW1vbkNmZy5iSUVFRTgwMjExSCA/ICJUUlVFIjoiRkFMU0UiKTsKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorSU5UCVNob3dfTmV0d29ya1R5cGVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1ZikKK3sKKwlzd2l0Y2gocEFkLT5TdGFDZmcuQnNzVHlwZSkKKwl7CisJCWNhc2UgQlNTX0FESE9DOgorCQkJc3ByaW50ZihwQnVmLCAiXHRBZGhvYyIpOworCQkJYnJlYWs7CisJCWNhc2UgQlNTX0lORlJBOgorCQkJc3ByaW50ZihwQnVmLCAiXHRJbmZyYSIpOworCQkJYnJlYWs7CisJCWNhc2UgQlNTX0FOWToKKwkJCXNwcmludGYocEJ1ZiwgIlx0QW55Iik7CisJCQlicmVhazsKKwkJY2FzZSBCU1NfTU9OSVRPUjoKKwkJCXNwcmludGYocEJ1ZiwgIlx0TW9uaXRvciIpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlzcHJpbnRmKHBCdWYsICJcdFVua25vdyBWYWx1ZSglZCkiLCBwQWQtPlN0YUNmZy5Cc3NUeXBlKTsKKwkJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworSU5UCVNob3dfQXV0aE1vZGVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1ZikKK3sKKwlORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9NT0RFCUF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlT3BlbjsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCUF1dGhNb2RlID0gcEFkLT5TdGFDZmcuQXV0aE1vZGU7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlpZiAoKEF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZU9wZW4pICYmCisJCShBdXRoTW9kZSA8PSBOZGlzODAyXzExQXV0aE1vZGVXUEExUFNLV1BBMlBTSykpCisJCXNwcmludGYocEJ1ZiwgIlx0JXMiLCBSVE1QR2V0UmFsaW5rQXV0aE1vZGVTdHIoQXV0aE1vZGUpKTsKKwllbHNlCisJCXNwcmludGYocEJ1ZiwgIlx0VW5rbm93IFZhbHVlKCVkKSIsIEF1dGhNb2RlKTsKKworCXJldHVybiAwOworfQorCitJTlQJU2hvd19FbmNyeXBUeXBlX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpCit7CisJTkRJU184MDJfMTFfV0VQX1NUQVRVUwlXZXBTdGF0dXMgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQlXZXBTdGF0dXMgPSBwQWQtPlN0YUNmZy5XZXBTdGF0dXM7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlpZiAoKFdlcFN0YXR1cyA+PSBOZGlzODAyXzExV0VQRW5hYmxlZCkgJiYKKwkJKFdlcFN0YXR1cyA8PSBOZGlzODAyXzExRW5jcnlwdGlvbjRLZXlBYnNlbnQpKQorCQlzcHJpbnRmKHBCdWYsICJcdCVzIiwgUlRNUEdldFJhbGlua0VuY3J5TW9kZVN0cihXZXBTdGF0dXMpKTsKKwllbHNlCisJCXNwcmludGYocEJ1ZiwgIlx0VW5rbm93IFZhbHVlKCVkKSIsIFdlcFN0YXR1cyk7CisKKwlyZXR1cm4gMDsKK30KKworSU5UCVNob3dfRGVmYXVsdEtleUlEX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpCit7CisJVUNIQVIgRGVmYXVsdEtleUlkID0gMDsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCURlZmF1bHRLZXlJZCA9IHBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZDsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCXNwcmludGYocEJ1ZiwgIlx0JWQiLCBEZWZhdWx0S2V5SWQpOworCisJcmV0dXJuIDA7Cit9CisKK0lOVAlTaG93X1dlcEtleV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOICBJTlQJCQkJS2V5SWR4LAorCU9VVAlQVUNIQVIJCQlwQnVmKQoreworCVVDSEFSICAgS2V5WzE2XSA9IHswfSwgS2V5TGVuZ3RoID0gMDsKKwlJTlQJCWluZGV4ID0gQlNTMDsKKworCUtleUxlbmd0aCA9IHBBZC0+U2hhcmVkS2V5W2luZGV4XVtLZXlJZHhdLktleUxlbjsKKwlOZGlzTW92ZU1lbW9yeShLZXksIHBBZC0+U2hhcmVkS2V5W2luZGV4XVtLZXlJZHhdLktleSwgS2V5TGVuZ3RoKTsKKworCS8vY2hlY2sga2V5IHN0cmluZyBpcyBBU0NJSSBvciBub3QKKyAgICBpZiAoUlRNUENoZWNrU3RyUHJpbnRBYmxlKEtleSwgS2V5TGVuZ3RoKSkKKyAgICAgICAgc3ByaW50ZihwQnVmLCAiXHQlcyIsIEtleSk7CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaW50IGlkeDsKKyAgICAgICAgc3ByaW50ZihwQnVmLCAiXHQiKTsKKyAgICAgICAgZm9yIChpZHggPSAwOyBpZHggPCBLZXlMZW5ndGg7IGlkeCsrKQorICAgICAgICAgICAgc3ByaW50ZihwQnVmK3N0cmxlbihwQnVmKSwgIiUwMlgiLCBLZXlbaWR4XSk7CisgICAgfQorCXJldHVybiAwOworfQorCitJTlQJU2hvd19LZXkxX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpCit7CisJU2hvd19XZXBLZXlfUHJvYyhwQWQsIDAsIHBCdWYpOworCXJldHVybiAwOworfQorCitJTlQJU2hvd19LZXkyX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpCit7CisJU2hvd19XZXBLZXlfUHJvYyhwQWQsIDEsIHBCdWYpOworCXJldHVybiAwOworfQorCitJTlQJU2hvd19LZXkzX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpCit7CisJU2hvd19XZXBLZXlfUHJvYyhwQWQsIDIsIHBCdWYpOworCXJldHVybiAwOworfQorCitJTlQJU2hvd19LZXk0X1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpCit7CisJU2hvd19XZXBLZXlfUHJvYyhwQWQsIDMsIHBCdWYpOworCXJldHVybiAwOworfQorCitJTlQJU2hvd19XUEFQU0tfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1ZikKK3sKKwlJTlQgCWlkeDsKKwlVQ0hBUglQTUtbMzJdID0gezB9OworCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQlOZGlzTW92ZU1lbW9yeShQTUssIHBBZC0+U3RhQ2ZnLlBNSywgMzIpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisgICAgc3ByaW50ZihwQnVmLCAiXHRQTUsgPSAiKTsKKyAgICBmb3IgKGlkeCA9IDA7IGlkeCA8IDMyOyBpZHgrKykKKyAgICAgICAgc3ByaW50ZihwQnVmK3N0cmxlbihwQnVmKSwgIiUwMlgiLCBQTUtbaWR4XSk7CisKKwlyZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vY21tX3Nhbml0eS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vY21tX3Nhbml0eS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlMjQzMjAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9jbW1fc2FuaXR5LmMKQEAgLTAsMCArMSwxNjYzIEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCU1vZHVsZSBOYW1lOgorCXNhbml0eS5jCisKKwlBYnN0cmFjdDoKKworCVJldmlzaW9uIEhpc3Rvcnk6CisJV2hvCQkJV2hlbgkJCVdoYXQKKwktLS0tLS0tLQktLS0tLS0tLS0tCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJSm9obiBDaGFuZyAgMjAwNC0wOS0wMSAgICAgIGFkZCBXTU0gc3VwcG9ydAorKi8KKyNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKKworCitleHRlcm4gVUNIQVIJQ0lTQ09fT1VJW107CisKK2V4dGVybiBVQ0hBUglXUEFfT1VJW107CitleHRlcm4gVUNIQVIJUlNOX09VSVtdOworZXh0ZXJuIFVDSEFSCVdNRV9JTkZPX0VMRU1bXTsKK2V4dGVybiBVQ0hBUglXTUVfUEFSTV9FTEVNW107CitleHRlcm4gVUNIQVIJQ2N4MlFvc0luZm9bXTsKK2V4dGVybiBVQ0hBUglSQUxJTktfT1VJW107CitleHRlcm4gVUNIQVIJQlJPQURDT01fT1VJW107CitleHRlcm4gVUNIQVIgICAgV1BTX09VSVtdOworCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIE1MTUUgbWVzc2FnZSBzYW5pdHkgY2hlY2sKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworQk9PTEVBTiBNbG1lQWRkQkFSZXFTYW5pdHkoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gVk9JRCAqTXNnLAorICAgIElOIFVMT05HIE1zZ0xlbiwKKyAgICBPVVQgUFVDSEFSIHBBZGRyMikKK3sKKyAgICBQTUxNRV9BRERCQV9SRVFfU1RSVUNUICAgcEluZm87CisKKyAgICBwSW5mbyA9IChNTE1FX0FEREJBX1JFUV9TVFJVQ1QgKilNc2c7CisKKyAgICBpZiAoKE1zZ0xlbiAhPSBzaXplb2YoTUxNRV9BRERCQV9SRVFfU1RSVUNUKSkpCisgICAgeworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNbG1lQWRkQkFSZXFTYW5pdHkgZmFpbCAtIG1lc3NhZ2UgbGVuZ2h0IG5vdCBjb3JyZWN0LlxuIikpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgaWYgKChwSW5mby0+V2NpZCA+PSBNQVhfTEVOX09GX01BQ19UQUJMRSkpCisgICAgeworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNbG1lQWRkQkFSZXFTYW5pdHkgZmFpbCAtIFRoZSBwZWVyIE1hYyBpcyBub3QgYXNzb2NpYXRlZCB5ZXQuXG4iKSk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKwkvKgorICAgIGlmICgocEluZm8tPkJhQnVmU2l6ZSA+IE1BWF9SWF9SRU9SREVSQlVGKSB8fCAocEluZm8tPkJhQnVmU2l6ZSA8IDIpKQorICAgIHsKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTWxtZUFkZEJBUmVxU2FuaXR5IGZhaWwgLSBSeCBSZW9yZGVyaW5nIGJ1ZmZlciB0b28gYmlnIG9yIHRvbyBzbWFsbFxuIikpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCSovCisKKyAgICBpZiAoKHBJbmZvLT5wQWRkclswXSYweDAxKSA9PSAweDAxKQorICAgIHsKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTWxtZUFkZEJBUmVxU2FuaXR5IGZhaWwgLSBicm9hZGNhc3QgYWRkcmVzcyBub3Qgc3VwcG9ydCBCQVxuIikpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgTUxNRSBtZXNzYWdlIHNhbml0eSBjaGVjaworICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitCT09MRUFOIE1sbWVEZWxCQVJlcVNhbml0eSgKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBWT0lEICpNc2csCisgICAgSU4gVUxPTkcgTXNnTGVuKQoreworCU1MTUVfREVMQkFfUkVRX1NUUlVDVCAqcEluZm87CisJcEluZm8gPSAoTUxNRV9ERUxCQV9SRVFfU1RSVUNUICopTXNnOworCisgICAgaWYgKChNc2dMZW4gIT0gc2l6ZW9mKE1MTUVfREVMQkFfUkVRX1NUUlVDVCkpKQorICAgIHsKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiTWxtZURlbEJBUmVxU2FuaXR5IGZhaWwgLSBtZXNzYWdlIGxlbmdodCBub3QgY29ycmVjdC5cbiIpKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIGlmICgocEluZm8tPldjaWQgPj0gTUFYX0xFTl9PRl9NQUNfVEFCTEUpKQorICAgIHsKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiTWxtZURlbEJBUmVxU2FuaXR5IGZhaWwgLSBUaGUgcGVlciBNYWMgaXMgbm90IGFzc29jaWF0ZWQgeWV0LlxuIikpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgaWYgKChwSW5mby0+VElEICYgMHhmMCkpCisgICAgeworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJNbG1lRGVsQkFSZXFTYW5pdHkgZmFpbCAtIFRoZSBwZWVyIFRJRCBpcyBpbmNvcnJlY3QuXG4iKSk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKwlpZiAoTmRpc0VxdWFsTWVtb3J5KHBBZC0+TWFjVGFiLkNvbnRlbnRbcEluZm8tPldjaWRdLkFkZHIsIHBJbmZvLT5BZGRyLCBNQUNfQUREUl9MRU4pID09IDApCisgICAgeworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJNbG1lRGVsQkFSZXFTYW5pdHkgZmFpbCAtIHRoZSBwZWVyIGFkZHIgZG9zZW4ndCBleGlzdC5cbiIpKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIHJldHVybiBUUlVFOworfQorCitCT09MRUFOIFBlZXJBZGRCQVJlcUFjdGlvblNhbml0eSgKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBWT0lEICpwTXNnLAorICAgIElOIFVMT05HIE1zZ0xlbiwKKwlPVVQgUFVDSEFSIHBBZGRyMikKK3sKKwlQRlJBTUVfODAyXzExIHBGcmFtZSA9IChQRlJBTUVfODAyXzExKXBNc2c7CisJUEZSQU1FX0FEREJBX1JFUSBwQWRkRnJhbWU7CisJcEFkZEZyYW1lID0gKFBGUkFNRV9BRERCQV9SRVEpKHBNc2cpOworCWlmIChNc2dMZW4gPCAoc2l6ZW9mKEZSQU1FX0FEREJBX1JFUSkpKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJQZWVyQWRkQkFSZXFBY3Rpb25TYW5pdHk6IEFEREJBIFJlcXVlc3QgZnJhbWUgbGVuZ3RoIHNpemUgPSAlbGQgaW5jb3JyZWN0XG4iLCBNc2dMZW4pKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKwkvLyB3ZSBzdXBwb3J0IGltbWVkaWF0ZSBCQS4KKwkqKFVTSE9SVCAqKSgmcEFkZEZyYW1lLT5CYVBhcm0pID0gY3B1MmxlMTYoKihVU0hPUlQgKikoJnBBZGRGcmFtZS0+QmFQYXJtKSk7CisJcEFkZEZyYW1lLT5UaW1lT3V0VmFsdWUgPSBjcHUybGUxNihwQWRkRnJhbWUtPlRpbWVPdXRWYWx1ZSk7CisJcEFkZEZyYW1lLT5CYVN0YXJ0U2VxLndvcmQgPSBjcHUybGUxNihwQWRkRnJhbWUtPkJhU3RhcnRTZXEud29yZCk7CisKKwlpZiAocEFkZEZyYW1lLT5CYVBhcm0uQkFQb2xpY3kgIT0gSU1NRURfQkEpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIlBlZXJBZGRCQVJlcUFjdGlvblNhbml0eTogQUREQkEgUmVxdWVzdCBCYSBQb2xpY3lbJWRdIG5vdCBzdXBwb3J0XG4iLCBwQWRkRnJhbWUtPkJhUGFybS5CQVBvbGljeSkpOworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIkFEREJBIFJlcXVlc3QuIHRpZD0leCwgQnVmc2l6ZT0leCwgQU1TRFVTdXBwb3J0ZWQ9JXggXG4iLCBwQWRkRnJhbWUtPkJhUGFybS5USUQsIHBBZGRGcmFtZS0+QmFQYXJtLkJ1ZlNpemUsIHBBZGRGcmFtZS0+QmFQYXJtLkFNU0RVU3VwcG9ydGVkKSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwkvLyB3ZSBzdXBwb3J0IGltbWVkaWF0ZSBCQS4KKwlpZiAocEFkZEZyYW1lLT5CYVBhcm0uVElEICYweGZmZjApCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIlBlZXJBZGRCQVJlcUFjdGlvblNhbml0eTogQUREQkEgUmVxdWVzdCBpbmNvcnJlY3QgVElEID0gJWRcbiIsIHBBZGRGcmFtZS0+QmFQYXJtLlRJRCkpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCUNPUFlfTUFDX0FERFIocEFkZHIyLCBwRnJhbWUtPkhkci5BZGRyMik7CisJcmV0dXJuIFRSVUU7Cit9CisKK0JPT0xFQU4gUGVlckFkZEJBUnNwQWN0aW9uU2FuaXR5KAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIFZPSUQgKnBNc2csCisgICAgSU4gVUxPTkcgTXNnTGVuKQoreworCS8vUEZSQU1FXzgwMl8xMSBwRnJhbWUgPSAoUEZSQU1FXzgwMl8xMSlwTXNnOworCVBGUkFNRV9BRERCQV9SU1AgcEFkZEZyYW1lOworCisJcEFkZEZyYW1lID0gKFBGUkFNRV9BRERCQV9SU1ApKHBNc2cpOworCWlmIChNc2dMZW4gPCAoc2l6ZW9mKEZSQU1FX0FEREJBX1JTUCkpKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJQZWVyQWRkQkFSc3BBY3Rpb25TYW5pdHk6IEFEREJBIFJlc3BvbnNlIGZyYW1lIGxlbmd0aCBzaXplID0gJWxkIGluY29ycmVjdFxuIiwgTXNnTGVuKSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisJLy8gd2Ugc3VwcG9ydCBpbW1lZGlhdGUgQkEuCisJKihVU0hPUlQgKikoJnBBZGRGcmFtZS0+QmFQYXJtKSA9IGNwdTJsZTE2KCooVVNIT1JUICopKCZwQWRkRnJhbWUtPkJhUGFybSkpOworCXBBZGRGcmFtZS0+U3RhdHVzQ29kZSA9IGNwdTJsZTE2KHBBZGRGcmFtZS0+U3RhdHVzQ29kZSk7CisJcEFkZEZyYW1lLT5UaW1lT3V0VmFsdWUgPSBjcHUybGUxNihwQWRkRnJhbWUtPlRpbWVPdXRWYWx1ZSk7CisKKwlpZiAocEFkZEZyYW1lLT5CYVBhcm0uQkFQb2xpY3kgIT0gSU1NRURfQkEpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIlBlZXJBZGRCQVJlcUFjdGlvblNhbml0eTogQUREQkEgUmVzcG9uc2UgQmEgUG9saWN5WyVkXSBub3Qgc3VwcG9ydFxuIiwgcEFkZEZyYW1lLT5CYVBhcm0uQkFQb2xpY3kpKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCS8vIHdlIHN1cHBvcnQgaW1tZWRpYXRlIEJBLgorCWlmIChwQWRkRnJhbWUtPkJhUGFybS5USUQgJjB4ZmZmMCkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiUGVlckFkZEJBUnNwQWN0aW9uU2FuaXR5OiBBRERCQSBSZXNwb25zZSBpbmNvcnJlY3QgVElEID0gJWRcbiIsIHBBZGRGcmFtZS0+QmFQYXJtLlRJRCkpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCXJldHVybiBUUlVFOworCit9CisKK0JPT0xFQU4gUGVlckRlbEJBQWN0aW9uU2FuaXR5KAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIFVDSEFSIFdjaWQsCisgICAgSU4gVk9JRCAqcE1zZywKKyAgICBJTiBVTE9ORyBNc2dMZW4gKQoreworCS8vUEZSQU1FXzgwMl8xMSBwRnJhbWUgPSAoUEZSQU1FXzgwMl8xMSlwTXNnOworCVBGUkFNRV9ERUxCQV9SRVEgIHBEZWxGcmFtZTsKKwlpZiAoTXNnTGVuICE9IChzaXplb2YoRlJBTUVfREVMQkFfUkVRKSkpCisJCXJldHVybiBGQUxTRTsKKworCWlmIChXY2lkID49IE1BWF9MRU5fT0ZfTUFDX1RBQkxFKQorCQlyZXR1cm4gRkFMU0U7CisKKwlwRGVsRnJhbWUgPSAoUEZSQU1FX0RFTEJBX1JFUSkocE1zZyk7CisKKwkqKFVTSE9SVCAqKSgmcERlbEZyYW1lLT5EZWxiYVBhcm0pID0gY3B1MmxlMTYoKihVU0hPUlQgKikoJnBEZWxGcmFtZS0+RGVsYmFQYXJtKSk7CisJcERlbEZyYW1lLT5SZWFzb25Db2RlID0gY3B1MmxlMTYocERlbEZyYW1lLT5SZWFzb25Db2RlKTsKKworCWlmIChwRGVsRnJhbWUtPkRlbGJhUGFybS5USUQgJjB4ZmZmMCkKKwkJcmV0dXJuIEZBTFNFOworCisJcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgTUxNRSBtZXNzYWdlIHNhbml0eSBjaGVjaworICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitCT09MRUFOIFBlZXJCZWFjb25BbmRQcm9iZVJzcFNhbml0eSgKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBWT0lEICpNc2csCisgICAgSU4gVUxPTkcgTXNnTGVuLAorICAgIElOIFVDSEFSICBNc2dDaGFubmVsLAorICAgIE9VVCBQVUNIQVIgcEFkZHIyLAorICAgIE9VVCBQVUNIQVIgcEJzc2lkLAorICAgIE9VVCBDSEFSIFNzaWRbXSwKKyAgICBPVVQgVUNIQVIgKnBTc2lkTGVuLAorICAgIE9VVCBVQ0hBUiAqcEJzc1R5cGUsCisgICAgT1VUIFVTSE9SVCAqcEJlYWNvblBlcmlvZCwKKyAgICBPVVQgVUNIQVIgKnBDaGFubmVsLAorICAgIE9VVCBVQ0hBUiAqcE5ld0NoYW5uZWwsCisgICAgT1VUIExBUkdFX0lOVEVHRVIgKnBUaW1lc3RhbXAsCisgICAgT1VUIENGX1BBUk0gKnBDZlBhcm0sCisgICAgT1VUIFVTSE9SVCAqcEF0aW1XaW4sCisgICAgT1VUIFVTSE9SVCAqcENhcGFiaWxpdHlJbmZvLAorICAgIE9VVCBVQ0hBUiAqcEVycCwKKyAgICBPVVQgVUNIQVIgKnBEdGltQ291bnQsCisgICAgT1VUIFVDSEFSICpwRHRpbVBlcmlvZCwKKyAgICBPVVQgVUNIQVIgKnBCY2FzdEZsYWcsCisgICAgT1VUIFVDSEFSICpwTWVzc2FnZVRvTWUsCisgICAgT1VUIFVDSEFSIFN1cFJhdGVbXSwKKyAgICBPVVQgVUNIQVIgKnBTdXBSYXRlTGVuLAorICAgIE9VVCBVQ0hBUiBFeHRSYXRlW10sCisgICAgT1VUIFVDSEFSICpwRXh0UmF0ZUxlbiwKKyAgICBPVVQJVUNIQVIgKnBDa2lwRmxhZywKKyAgICBPVVQJVUNIQVIgKnBBaXJvbmV0Q2VsbFBvd2VyTGltaXQsCisgICAgT1VUIFBFRENBX1BBUk0gICAgICAgcEVkY2FQYXJtLAorICAgIE9VVCBQUUJTU19MT0FEX1BBUk0gIHBRYnNzTG9hZCwKKyAgICBPVVQgUFFPU19DQVBBQklMSVRZX1BBUk0gcFFvc0NhcGFiaWxpdHksCisgICAgT1VUIFVMT05HICpwUmFsaW5rSWUsCisgICAgT1VUIFVDSEFSCQkgKnBIdENhcGFiaWxpdHlMZW4sCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisgICAgT1VUIFVDSEFSCQkgKnBQcmVOSHRDYXBhYmlsaXR5TGVuLAorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworICAgIE9VVCBIVF9DQVBBQklMSVRZX0lFICpwSHRDYXBhYmlsaXR5LAorCU9VVCBVQ0hBUgkJICpBZGRIdEluZm9MZW4sCisJT1VUIEFERF9IVF9JTkZPX0lFICpBZGRIdEluZm8sCisJT1VUIFVDSEFSICpOZXdFeHRDaGFubmVsT2Zmc2V0LAkJLy8gSHQgZXh0ZW5zaW9uIGNoYW5uZWwgb2Zmc2V0KGFib3ZlIG9yIGJlbG93KQorICAgIE9VVCBVU0hPUlQgKkxlbmd0aFZJRSwKKyAgICBPVVQJUE5ESVNfODAyXzExX1ZBUklBQkxFX0lFcyBwVklFKQoreworICAgIENIQVIJCQkJKlB0cjsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlDSEFSIAkJCQlUaW1MZW47CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisgICAgUEZSQU1FXzgwMl8xMQkJcEZyYW1lOworICAgIFBFSURfU1RSVUNUICAgICAgICAgcEVpZDsKKyAgICBVQ0hBUgkJCQlTdWJUeXBlOworICAgIFVDSEFSCQkJCVNhbml0eTsKKyAgICAvL1VDSEFSCQkJCUVDV01pbiwgRUNXTWF4OworICAgIC8vTUFDX0NTUjlfU1RSVUMJCUNzcjk7CisgICAgVUxPTkcJCQkJTGVuZ3RoID0gMDsKKworCS8vIEZvciBzb21lIDExYSBBUCB3aGljaCBkaWRuJ3QgaGF2ZSBEU19JRSwgd2UgdXNlIHR3byBjb25kaXRpb25zIHRvIGRlY2lkZSB0aGUgY2hhbm5lbAorCS8vCTEuIElmIHRoZSBBUCBpcyAxMW4gZW5hYmxlZCwgdGhlbiBjaGVjayB0aGUgY29udHJvbCBjaGFubmVsLgorCS8vCTIuIElmIHRoZSBBUCBkaWRuJ3QgaGF2ZSBhbnkgaW5mbyBhYm91dCBjaGFubmVsLCB1c2UgdGhlIGNoYW5uZWwgd2UgcmVjZWl2ZWQgdGhpcyBmcmFtZSBhcyB0aGUgY2hhbm5lbC4gKE1heSBpbmFjY3VyYWN5ISEpCisJVUNIQVIJCQlDdHJsQ2hhbm5lbCA9IDA7CisKKyAgICAvLyBBZGQgZm9yIDMgbmVjZXNzYXJ5IEVJRCBmaWVsZCBjaGVjaworICAgIFNhbml0eSA9IDA7CisKKyAgICAqcEF0aW1XaW4gPSAwOworICAgICpwRXJwID0gMDsKKyAgICAqcER0aW1Db3VudCA9IDA7CisgICAgKnBEdGltUGVyaW9kID0gMDsKKyAgICAqcEJjYXN0RmxhZyA9IDA7CisgICAgKnBNZXNzYWdlVG9NZSA9IDA7CisgICAgKnBFeHRSYXRlTGVuID0gMDsKKyAgICAqcENraXBGbGFnID0gMDsJCQkgICAgICAgIC8vIERlZmF1bHQgb2YgQ2tpcEZsYWcgaXMgMAorICAgICpwQWlyb25ldENlbGxQb3dlckxpbWl0ID0gMHhGRjsgIC8vIERlZmF1bHQgb2YgQWlyb25ldENlbGxQb3dlckxpbWl0IGlzIDB4RkYKKyAgICAqTGVuZ3RoVklFID0gMDsJCQkJCS8vIFNldCB0aGUgbGVuZ3RoIG9mIFZJRSB0byBpbml0IHZhbHVlIDAKKyAgICAqcEh0Q2FwYWJpbGl0eUxlbiA9IDA7CQkJCQkvLyBTZXQgdGhlIGxlbmd0aCBvZiBWSUUgdG8gaW5pdCB2YWx1ZSAwCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJaWYgKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpCisJCSpwUHJlTkh0Q2FwYWJpbGl0eUxlbiA9IDA7CQkJCQkvLyBTZXQgdGhlIGxlbmd0aCBvZiBWSUUgdG8gaW5pdCB2YWx1ZSAwCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisgICAgKkFkZEh0SW5mb0xlbiA9IDA7CQkJCQkvLyBTZXQgdGhlIGxlbmd0aCBvZiBWSUUgdG8gaW5pdCB2YWx1ZSAwCisgICAgKnBSYWxpbmtJZSA9IDA7CisgICAgKnBOZXdDaGFubmVsID0gMDsKKyAgICAqTmV3RXh0Q2hhbm5lbE9mZnNldCA9IDB4ZmY7CS8vRGVmYXVsdCAweGZmIG1lYW5zIG5vIHN1Y2ggSUUKKyAgICBwQ2ZQYXJtLT5iVmFsaWQgPSBGQUxTRTsgICAgICAgIC8vIGRlZmF1bHQ6IG5vIElFX0NGIGZvdW5kCisgICAgcFFic3NMb2FkLT5iVmFsaWQgPSBGQUxTRTsgICAgICAvLyBkZWZhdWx0OiBubyBJRV9RQlNTX0xPQUQgZm91bmQKKyAgICBwRWRjYVBhcm0tPmJWYWxpZCA9IEZBTFNFOyAgICAgIC8vIGRlZmF1bHQ6IG5vIElFX0VEQ0FfUEFSQU1FVEVSIGZvdW5kCisgICAgcFFvc0NhcGFiaWxpdHktPmJWYWxpZCA9IEZBTFNFOyAvLyBkZWZhdWx0OiBubyBJRV9RT1NfQ0FQQUJJTElUWSBmb3VuZAorCisgICAgcEZyYW1lID0gKFBGUkFNRV84MDJfMTEpTXNnOworCisgICAgLy8gZ2V0IHN1YnR5cGUgZnJvbSBoZWFkZXIKKyAgICBTdWJUeXBlID0gKFVDSEFSKXBGcmFtZS0+SGRyLkZDLlN1YlR5cGU7CisKKyAgICAvLyBnZXQgQWRkcjIgYW5kIEJTU0lEIGZyb20gaGVhZGVyCisgICAgQ09QWV9NQUNfQUREUihwQWRkcjIsIHBGcmFtZS0+SGRyLkFkZHIyKTsKKyAgICBDT1BZX01BQ19BRERSKHBCc3NpZCwgcEZyYW1lLT5IZHIuQWRkcjMpOworCisvLwloZXhfZHVtcCgiQmVhY29uIiwgTXNnLCBNc2dMZW4pOworCisgICAgUHRyID0gcEZyYW1lLT5PY3RldDsKKyAgICBMZW5ndGggKz0gTEVOR1RIXzgwMl8xMTsKKworICAgIC8vIGdldCB0aW1lc3RhbXAgZnJvbSBwYXlsb2FkIGFuZCBhZHZhbmNlIHRoZSBwb2ludGVyCisgICAgTmRpc01vdmVNZW1vcnkocFRpbWVzdGFtcCwgUHRyLCBUSU1FU1RBTVBfTEVOKTsKKworCXBUaW1lc3RhbXAtPnUuTG93UGFydCA9IGNwdTJsZTMyKHBUaW1lc3RhbXAtPnUuTG93UGFydCk7CisJcFRpbWVzdGFtcC0+dS5IaWdoUGFydCA9IGNwdTJsZTMyKHBUaW1lc3RhbXAtPnUuSGlnaFBhcnQpOworCisgICAgUHRyICs9IFRJTUVTVEFNUF9MRU47CisgICAgTGVuZ3RoICs9IFRJTUVTVEFNUF9MRU47CisKKyAgICAvLyBnZXQgYmVhY29uIGludGVydmFsIGZyb20gcGF5bG9hZCBhbmQgYWR2YW5jZSB0aGUgcG9pbnRlcgorICAgIE5kaXNNb3ZlTWVtb3J5KHBCZWFjb25QZXJpb2QsIFB0ciwgMik7CisgICAgUHRyICs9IDI7CisgICAgTGVuZ3RoICs9IDI7CisKKyAgICAvLyBnZXQgY2FwYWJpbGl0eSBpbmZvIGZyb20gcGF5bG9hZCBhbmQgYWR2YW5jZSB0aGUgcG9pbnRlcgorICAgIE5kaXNNb3ZlTWVtb3J5KHBDYXBhYmlsaXR5SW5mbywgUHRyLCAyKTsKKyAgICBQdHIgKz0gMjsKKyAgICBMZW5ndGggKz0gMjsKKworICAgIGlmIChDQVBfSVNfRVNTX09OKCpwQ2FwYWJpbGl0eUluZm8pKQorICAgICAgICAqcEJzc1R5cGUgPSBCU1NfSU5GUkE7CisgICAgZWxzZQorICAgICAgICAqcEJzc1R5cGUgPSBCU1NfQURIT0M7CisKKyAgICBwRWlkID0gKFBFSURfU1RSVUNUKSBQdHI7CisKKyAgICAvLyBnZXQgdmFyaWFibGUgZmllbGRzIGZyb20gcGF5bG9hZCBhbmQgYWR2YW5jZSB0aGUgcG9pbnRlcgorICAgIHdoaWxlICgoTGVuZ3RoICsgMiArIHBFaWQtPkxlbikgPD0gTXNnTGVuKQorICAgIHsKKyAgICAgICAgLy8KKyAgICAgICAgLy8gU2VjdXJlIGNvcHkgVklFIHRvIFZhcklFW01BWF9WSUVfTEVOXSBkaWRuJ3Qgb3ZlcmZsb3cuCisgICAgICAgIC8vCisgICAgICAgIGlmICgoKkxlbmd0aFZJRSArIHBFaWQtPkxlbiArIDIpID49IE1BWF9WSUVfTEVOKQorICAgICAgICB7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19XQVJOLCAoIlBlZXJCZWFjb25BbmRQcm9iZVJzcFNhbml0eSAtIFZhcmlhYmxlIElFcyBvdXQgb2YgcmVzb3VyY2UgW2xlbig9JWQpID4gTUFYX1ZJRV9MRU4oPSVkKV1cbiIsCisgICAgICAgICAgICAgICAgICAgICgqTGVuZ3RoVklFICsgcEVpZC0+TGVuICsgMiksIE1BWF9WSUVfTEVOKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHN3aXRjaChwRWlkLT5FaWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgSUVfU1NJRDoKKyAgICAgICAgICAgICAgICAvLyBBbHJlYWR5IGhhcyBvbmUgU1NJRCBFSUQgaW4gdGhpcyBiZWFjb24sIGlnbm9yZSB0aGUgc2Vjb25kIG9uZQorICAgICAgICAgICAgICAgIGlmIChTYW5pdHkgJiAweDEpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGlmKHBFaWQtPkxlbiA8PSBNQVhfTEVOX09GX1NTSUQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShTc2lkLCBwRWlkLT5PY3RldCwgcEVpZC0+TGVuKTsKKyAgICAgICAgICAgICAgICAgICAgKnBTc2lkTGVuID0gcEVpZC0+TGVuOworICAgICAgICAgICAgICAgICAgICBTYW5pdHkgfD0gMHgxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyQmVhY29uQW5kUHJvYmVSc3BTYW5pdHkgLSB3cm9uZyBJRV9TU0lEIChsZW49JWQpXG4iLHBFaWQtPkxlbikpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIElFX1NVUFBfUkFURVM6CisgICAgICAgICAgICAgICAgaWYocEVpZC0+TGVuIDw9IE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgU2FuaXR5IHw9IDB4MjsKKyAgICAgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkoU3VwUmF0ZSwgcEVpZC0+T2N0ZXQsIHBFaWQtPkxlbik7CisgICAgICAgICAgICAgICAgICAgICpwU3VwUmF0ZUxlbiA9IHBFaWQtPkxlbjsKKworICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiAyMDA0LTA5LTE0IG5vdCBhIGdvb2QgZGVzaWduIGhlcmUsIGNhdXNlIGl0IGV4Y2x1ZGUgZXh0cmEgcmF0ZXMKKyAgICAgICAgICAgICAgICAgICAgLy8gZnJvbSBTY2FuVGFiLiBXZSBzaG91bGQgcmVwb3J0IGFzIGlzLiBBbmQgZmlsdGVyIG91dCB1bnN1cHBvcnRlZAorICAgICAgICAgICAgICAgICAgICAvLyByYXRlcyBpbiBNbG1lQXV4LgorICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBhZ2FpbnN0IHRoZSBzdXBwb3J0ZWQgcmF0ZXMKKyAgICAgICAgICAgICAgICAgICAgLy8gUlRNUENoZWNrUmF0ZXMocEFkLCBTdXBSYXRlLCBwU3VwUmF0ZUxlbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXJCZWFjb25BbmRQcm9iZVJzcFNhbml0eSAtIHdyb25nIElFX1NVUFBfUkFURVMgKGxlbj0lZClcbiIscEVpZC0+TGVuKSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgSUVfSFRfQ0FQOgorCQkJaWYgKHBFaWQtPkxlbiA+PSBTSVpFX0hUX0NBUF9JRSkgIC8vTm90ZTogYWxsb3cgZXh0ZW5zaW9uLiEhCisJCQl7CisJCQkJTmRpc01vdmVNZW1vcnkocEh0Q2FwYWJpbGl0eSwgcEVpZC0+T2N0ZXQsIHNpemVvZihIVF9DQVBBQklMSVRZX0lFKSk7CisJCQkJKnBIdENhcGFiaWxpdHlMZW4gPSBTSVpFX0hUX0NBUF9JRTsJLy8gTm5vdyB3ZSBvbmx5IHN1cHBvcnQgMjYgYnl0ZXMuCisKKwkJCQkqKFVTSE9SVCAqKSgmcEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvKSA9IGNwdTJsZTE2KCooVVNIT1JUICopKCZwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8pKTsKKwkJCQkqKFVTSE9SVCAqKSgmcEh0Q2FwYWJpbGl0eS0+RXh0SHRDYXBJbmZvKSA9IGNwdTJsZTE2KCooVVNIT1JUICopKCZwSHRDYXBhYmlsaXR5LT5FeHRIdENhcEluZm8pKTsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQkJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCQkJeworCQkJCQkqcFByZU5IdENhcGFiaWxpdHlMZW4gPSAwOwkvLyBObm93IHdlIG9ubHkgc3VwcG9ydCAyNiBieXRlcy4KKworCQkJCQlQdHIgPSAoUFVDSEFSKSBwVklFOworCQkJCQlOZGlzTW92ZU1lbW9yeShQdHIgKyAqTGVuZ3RoVklFLCAmcEVpZC0+RWlkLCBwRWlkLT5MZW4gKyAyKTsKKwkJCQkJKkxlbmd0aFZJRSArPSAocEVpZC0+TGVuICsgMik7CisJCQkJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1dBUk4sICgiUGVlckJlYWNvbkFuZFByb2JlUnNwU2FuaXR5IC0gd3JvbmcgSUVfSFRfQ0FQLiBwRWlkLT5MZW4gPSAlZFxuIiwgcEVpZC0+TGVuKSk7CisJCQl9CisKKwkJYnJlYWs7CisgICAgICAgICAgICBjYXNlIElFX0FERF9IVDoKKwkJCWlmIChwRWlkLT5MZW4gPj0gc2l6ZW9mKEFERF9IVF9JTkZPX0lFKSkKKwkJCXsKKwkJCQkvLyBUaGlzIElFIGFsbG93cyBleHRlbnNpb24sIGJ1dCB3ZSBjYW4gaWdub3JlIGV4dHJhIGJ5dGVzIGJleW9uZCBvdXIga25vd2xlZGdlICwgc28gb25seQorCQkJCS8vIGNvcHkgZmlyc3Qgc2l6ZW9mKEFERF9IVF9JTkZPX0lFKQorCQkJCU5kaXNNb3ZlTWVtb3J5KEFkZEh0SW5mbywgcEVpZC0+T2N0ZXQsIHNpemVvZihBRERfSFRfSU5GT19JRSkpOworCQkJCSpBZGRIdEluZm9MZW4gPSBTSVpFX0FERF9IVF9JTkZPX0lFOworCisJCQkJQ3RybENoYW5uZWwgPSBBZGRIdEluZm8tPkNvbnRyb2xDaGFuOworCisJCQkJKihVU0hPUlQgKikoJkFkZEh0SW5mby0+QWRkSHRJbmZvMikgPSBjcHUybGUxNigqKFVTSE9SVCAqKSgmQWRkSHRJbmZvLT5BZGRIdEluZm8yKSk7CisJCQkJKihVU0hPUlQgKikoJkFkZEh0SW5mby0+QWRkSHRJbmZvMykgPSBjcHUybGUxNigqKFVTSE9SVCAqKSgmQWRkSHRJbmZvLT5BZGRIdEluZm8zKSk7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQkJCXsKKwkJCSAgICAgICAgICAgICAgICBQdHIgPSAoUFVDSEFSKSBwVklFOworCQkJICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KFB0ciArICpMZW5ndGhWSUUsICZwRWlkLT5FaWQsIHBFaWQtPkxlbiArIDIpOworCQkJICAgICAgICAgICAgICAgICpMZW5ndGhWSUUgKz0gKHBFaWQtPkxlbiArIDIpOworCQkJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19XQVJOLCAoIlBlZXJCZWFjb25BbmRQcm9iZVJzcFNhbml0eSAtIHdyb25nIElFX0FERF9IVC4gXG4iKSk7CisJCQl9CisKKwkJYnJlYWs7CisgICAgICAgICAgICBjYXNlIElFX1NFQ09OREFSWV9DSF9PRkZTRVQ6CisJCQlpZiAocEVpZC0+TGVuID09IDEpCisJCQl7CisJCQkJKk5ld0V4dENoYW5uZWxPZmZzZXQgPSBwRWlkLT5PY3RldFswXTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19XQVJOLCAoIlBlZXJCZWFjb25BbmRQcm9iZVJzcFNhbml0eSAtIHdyb25nIElFX1NFQ09OREFSWV9DSF9PRkZTRVQuIFxuIikpOworCQkJfQorCisJCWJyZWFrOworICAgICAgICAgICAgY2FzZSBJRV9GSF9QQVJNOgorICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXJCZWFjb25BbmRQcm9iZVJzcFNhbml0eShJRV9GSF9QQVJNKSBcbiIpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBJRV9EU19QQVJNOgorICAgICAgICAgICAgICAgIGlmKHBFaWQtPkxlbiA9PSAxKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgKnBDaGFubmVsID0gKnBFaWQtPk9jdGV0OworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQkJCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQkJCQl7CisJCQkJCQlpZiAoQ2hhbm5lbFNhbml0eShwQWQsICpwQ2hhbm5lbCkgPT0gMCkKKwkJCQkJCXsKKworCQkJCQkJCXJldHVybiBGQUxTRTsKKwkJCQkJCX0KKwkJCQkJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworICAgICAgICAgICAgICAgICAgICBTYW5pdHkgfD0gMHg0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyQmVhY29uQW5kUHJvYmVSc3BTYW5pdHkgLSB3cm9uZyBJRV9EU19QQVJNIChsZW49JWQpXG4iLHBFaWQtPkxlbikpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIElFX0NGX1BBUk06CisgICAgICAgICAgICAgICAgaWYocEVpZC0+TGVuID09IDYpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwQ2ZQYXJtLT5iVmFsaWQgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICBwQ2ZQYXJtLT5DZnBDb3VudCA9IHBFaWQtPk9jdGV0WzBdOworICAgICAgICAgICAgICAgICAgICBwQ2ZQYXJtLT5DZnBQZXJpb2QgPSBwRWlkLT5PY3RldFsxXTsKKyAgICAgICAgICAgICAgICAgICAgcENmUGFybS0+Q2ZwTWF4RHVyYXRpb24gPSBwRWlkLT5PY3RldFsyXSArIDI1NiAqIHBFaWQtPk9jdGV0WzNdOworICAgICAgICAgICAgICAgICAgICBwQ2ZQYXJtLT5DZnBEdXJSZW1haW5pbmcgPSBwRWlkLT5PY3RldFs0XSArIDI1NiAqIHBFaWQtPk9jdGV0WzVdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyQmVhY29uQW5kUHJvYmVSc3BTYW5pdHkgLSB3cm9uZyBJRV9DRl9QQVJNXG4iKSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgSUVfSUJTU19QQVJNOgorICAgICAgICAgICAgICAgIGlmKHBFaWQtPkxlbiA9PSAyKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEF0aW1XaW4sIHBFaWQtPk9jdGV0LCBwRWlkLT5MZW4pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyQmVhY29uQW5kUHJvYmVSc3BTYW5pdHkgLSB3cm9uZyBJRV9JQlNTX1BBUk1cbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorICAgICAgICAgICAgY2FzZSBJRV9USU06CisgICAgICAgICAgICAgICAgaWYoSU5GUkFfT04ocEFkKSAmJiBTdWJUeXBlID09IFNVQlRZUEVfQkVBQ09OKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgR2V0VGltQml0KChQVUNIQVIpcEVpZCwgcEFkLT5TdGFBY3RpdmUuQWlkLCAmVGltTGVuLCBwQmNhc3RGbGFnLCBwRHRpbUNvdW50LCBwRHRpbVBlcmlvZCwgcE1lc3NhZ2VUb01lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisgICAgICAgICAgICBjYXNlIElFX0NIQU5ORUxfU1dJVENIX0FOTk9VTkNFTUVOVDoKKyAgICAgICAgICAgICAgICBpZihwRWlkLT5MZW4gPT0gMykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgCSpwTmV3Q2hhbm5lbCA9IHBFaWQtPk9jdGV0WzFdOwkvL2V4dHJhY3QgbmV3IGNoYW5uZWwgbnVtYmVyCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAvLyBOZXcgZm9yIFdQQQorICAgICAgICAgICAgLy8gQ0NYIHYyIGhhcyB0aGUgc2FtZSBJRSwgd2UgbmVlZCB0byBwYXJzZSB0aGF0IHRvbworICAgICAgICAgICAgLy8gV2lmaSBXTU0gdXNlIHRoZSBzYW1lIElFIHZhbGUsIG5lZWQgdG8gcGFyc2UgdGhhdCB0b28KKyAgICAgICAgICAgIC8vIGNhc2UgSUVfV1BBOgorICAgICAgICAgICAgY2FzZSBJRV9WRU5ET1JfU1BFQ0lGSUM6CisgICAgICAgICAgICAgICAgLy8gQ2hlY2sgQnJvYWRjb20vQXRoZXJvcyA4MDIuMTFuIE9VSSB2ZXJzaW9uLCBmb3IgSFQgQ2FwYWJpbGl0eSBJRS4KKyAgICAgICAgICAgICAgICAvLyBUaGlzIEhUIElFIGlzIGJlZm9yZSBJRUVFIGRyYWZ0IHNldCBIVCBJRSB2YWx1ZS4yMDA2LTA5LTI4IGJ5IEphbi4KKyAgICAgICAgICAgICAgICAvKmlmIChOZGlzRXF1YWxNZW1vcnkocEVpZC0+T2N0ZXQsIEJST0FEQ09NX09VSSwgMykgJiYgKHBFaWQtPkxlbiA+PSA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgCWlmICgocEVpZC0+T2N0ZXRbM10gPT0gT1VJX0JST0FEQ09NX0hUKSAmJiAocEVpZC0+TGVuID49IDMwKSkKKyAgICAgICAgICAgIAkJeworCQkJCXsKKwkJCQkJTmRpc01vdmVNZW1vcnkocEh0Q2FwYWJpbGl0eSwgJnBFaWQtPk9jdGV0WzRdLCBzaXplb2YoSFRfQ0FQQUJJTElUWV9JRSkpOworCQkJCQkqcEh0Q2FwYWJpbGl0eUxlbiA9IFNJWkVfSFRfQ0FQX0lFOwkvLyBObm93IHdlIG9ubHkgc3VwcG9ydCAyNiBieXRlcy4KKwkJCQl9CisgICAgICAgICAJCX0KKyAgICAgICAgICAgICAgICAJaWYgKChwRWlkLT5PY3RldFszXSA9PSBPVUlfQlJPQURDT01fSFQpICYmIChwRWlkLT5MZW4gPj0gMjYpKQorICAgICAgICAgICAgCQl7CisJCQkJeworCQkJCQlOZGlzTW92ZU1lbW9yeShBZGRIdEluZm8sICZwRWlkLT5PY3RldFs0XSwgc2l6ZW9mKEFERF9IVF9JTkZPX0lFKSk7CisJCQkJCSpBZGRIdEluZm9MZW4gPSBTSVpFX0FERF9IVF9JTkZPX0lFOwkvLyBObm93IHdlIG9ubHkgc3VwcG9ydCAyNiBieXRlcy4KKwkJCQl9CisgICAgICAgICAJCX0KKyAgICAgICAgICAgICAgICB9CisJCQkJKi8KKyAgICAgICAgICAgICAgICAvLyBDaGVjayB0aGUgT1VJIHZlcnNpb24sIGZpbHRlciBvdXQgbm9uLXN0YW5kYXJkIHVzYWdlCisgICAgICAgICAgICAgICAgaWYgKE5kaXNFcXVhbE1lbW9yeShwRWlkLT5PY3RldCwgUkFMSU5LX09VSSwgMykgJiYgKHBFaWQtPkxlbiA9PSA3KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vKnBSYWxpbmtJZSA9IHBFaWQtPk9jdGV0WzNdOworICAgICAgICAgICAgICAgICAgICBpZiAocEVpZC0+T2N0ZXRbM10gIT0gMCkKKyAgICAgICAgCQkJCSpwUmFsaW5rSWUgPSBwRWlkLT5PY3RldFszXTsKKyAgICAgICAgCQkJZWxzZQorICAgICAgICAJCQkJKnBSYWxpbmtJZSA9IDB4ZjAwMDAwMDA7IC8vIFNldCB0byBub24temVybyB2YWx1ZSAoY2FuJ3Qgc2V0IGJpdDAtMikgdG8gcmVwcmVzZW50IHRoaXMgaXMgUmFsaW5rIENoaXAuIFNvIGF0IGxpbmt1cCwgd2Ugd2lsbCBzZXQgcmFsaW5rY2hpcCBmbGFnLgorICAgICAgICAgICAgICAgIH0KKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJLy8gVGhpcyBIVCBJRSBpcyBiZWZvcmUgSUVFRSBkcmFmdCBzZXQgSFQgSUUgdmFsdWUuMjAwNi0wOS0yOCBieSBKYW4uCisKKyAgICAgICAgICAgICAgICAvLyBPdGhlciB2ZW5kb3JzIGhhZCBwcm9kdWN0aW9uIGJlZm9yZSBJRV9IVF9DQVAgdmFsdWUgaXMgYXNzaWduZWQuIFRvIGJhY2t3YXJkIHN1cHBvcnQgdGhvc2Ugb2xkLWZpcm13YXJlIEFQLAorICAgICAgICAgICAgICAgIC8vIENoZWNrIGJyb2FkY29tLWRlZmllbmQgcHJlLTgwMi4xMW5EMS4wIE9VSSBmb3IgSFQgcmVsYXRlZCBJRSwgaW5jbHVkaW5nIEhUIENhcGF0aWxpdGllcyBJRSBhbmQgSFQgSW5mb3JtYXRpb24gSUUKKyAgICAgICAgICAgICAgICBlbHNlIGlmICgoKnBIdENhcGFiaWxpdHlMZW4gPT0gMCkgJiYgTmRpc0VxdWFsTWVtb3J5KHBFaWQtPk9jdGV0LCBQUkVfTl9IVF9PVUksIDMpICYmIChwRWlkLT5MZW4gPj0gNCkgJiYgKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChwRWlkLT5PY3RldFszXSA9PSBPVUlfUFJFTl9IVF9DQVApICYmIChwRWlkLT5MZW4gPj0gMzApICYmICgqcEh0Q2FwYWJpbGl0eUxlbiA9PSAwKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEh0Q2FwYWJpbGl0eSwgJnBFaWQtPk9jdGV0WzRdLCBzaXplb2YoSFRfQ0FQQUJJTElUWV9JRSkpOworICAgICAgICAgICAgICAgICAgICAgICAgKnBQcmVOSHRDYXBhYmlsaXR5TGVuID0gU0laRV9IVF9DQVBfSUU7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoKHBFaWQtPk9jdGV0WzNdID09IE9VSV9QUkVOX0FERF9IVCkgJiYgKHBFaWQtPkxlbiA+PSAyNikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KEFkZEh0SW5mbywgJnBFaWQtPk9jdGV0WzRdLCBzaXplb2YoQUREX0hUX0lORk9fSUUpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpBZGRIdEluZm9MZW4gPSBTSVpFX0FERF9IVF9JTkZPX0lFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworICAgICAgICAgICAgICAgIGVsc2UgaWYgKE5kaXNFcXVhbE1lbW9yeShwRWlkLT5PY3RldCwgV1BBX09VSSwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBDb3B5IHRvIHBWSUUgd2hpY2ggd2lsbCByZXBvcnQgdG8gbWljcm9zb2Z0IGJzc2lkIGxpc3QuCisgICAgICAgICAgICAgICAgICAgIFB0ciA9IChQVUNIQVIpIHBWSUU7CisgICAgICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KFB0ciArICpMZW5ndGhWSUUsICZwRWlkLT5FaWQsIHBFaWQtPkxlbiArIDIpOworICAgICAgICAgICAgICAgICAgICAqTGVuZ3RoVklFICs9IChwRWlkLT5MZW4gKyAyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoTmRpc0VxdWFsTWVtb3J5KHBFaWQtPk9jdGV0LCBXTUVfUEFSTV9FTEVNLCA2KSAmJiAocEVpZC0+TGVuID09IDI0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFBVQ0hBUiBwdHI7CisgICAgICAgICAgICAgICAgICAgIGludCBpOworCisgICAgICAgICAgICAgICAgICAgIC8vIHBhcnNpbmcgRURDQSBwYXJhbWV0ZXJzCisgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+YlZhbGlkICAgICAgICAgID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5iUUFjayAgICAgICAgICAgPSBGQUxTRTsgLy8gcEVpZC0+T2N0ZXRbMF0gJiAweDEwOworICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPmJRdWV1ZVJlcXVlc3QgICA9IEZBTFNFOyAvLyBwRWlkLT5PY3RldFswXSAmIDB4MjA7CisgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+YlR4b3BSZXF1ZXN0ICAgID0gRkFMU0U7IC8vIHBFaWQtPk9jdGV0WzBdICYgMHg0MDsKKyAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5FZGNhVXBkYXRlQ291bnQgPSBwRWlkLT5PY3RldFs2XSAmIDB4MGY7CisgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+YkFQU0RDYXBhYmxlICAgID0gKHBFaWQtPk9jdGV0WzZdICYgMHg4MCkgPyAxIDogMDsKKyAgICAgICAgICAgICAgICAgICAgcHRyID0gJnBFaWQtPk9jdGV0WzhdOworICAgICAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaTw0OyBpKyspCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSIGFjaSA9ICgqcHRyICYgMHg2MCkgPj4gNTsgLy8gYjV+NiBpcyBBQyBJTkRFWAorICAgICAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5iQUNNW2FjaV0gID0gKCgoKnB0cikgJiAweDEwKSA9PSAweDEwKTsgICAvLyBiNSBpcyBBQ00KKyAgICAgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+QWlmc25bYWNpXSA9ICgqcHRyKSAmIDB4MGY7ICAgICAgICAgICAgICAgLy8gYjB+MyBpcyBBSUZTTgorICAgICAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5Dd21pblthY2ldID0gKihwdHIrMSkgJiAweDBmOyAgICAgICAgICAgICAvLyBiMH40IGlzIEN3bWluCisgICAgICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPkN3bWF4W2FjaV0gPSAqKHB0cisxKSA+PiA0OyAgICAgICAgICAgICAgIC8vIGI1fjggaXMgQ3dtYXgKKyAgICAgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+VHhvcFthY2ldICA9ICoocHRyKzIpICsgMjU2ICogKCoocHRyKzMpKTsgLy8gaW4gdW5pdCBvZiAzMi11cworICAgICAgICAgICAgICAgICAgICAgICAgcHRyICs9IDQ7IC8vIHBvaW50IHRvIG5leHQgQUMKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChOZGlzRXF1YWxNZW1vcnkocEVpZC0+T2N0ZXQsIFdNRV9JTkZPX0VMRU0sIDYpICYmIChwRWlkLT5MZW4gPT0gNykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBwYXJzaW5nIEVEQ0EgcGFyYW1ldGVycworICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPmJWYWxpZCAgICAgICAgICA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+YlFBY2sgICAgICAgICAgID0gRkFMU0U7IC8vIHBFaWQtPk9jdGV0WzBdICYgMHgxMDsKKyAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5iUXVldWVSZXF1ZXN0ICAgPSBGQUxTRTsgLy8gcEVpZC0+T2N0ZXRbMF0gJiAweDIwOworICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPmJUeG9wUmVxdWVzdCAgICA9IEZBTFNFOyAvLyBwRWlkLT5PY3RldFswXSAmIDB4NDA7CisgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+RWRjYVVwZGF0ZUNvdW50ID0gcEVpZC0+T2N0ZXRbNl0gJiAweDBmOworICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPmJBUFNEQ2FwYWJsZSAgICA9IChwRWlkLT5PY3RldFs2XSAmIDB4ODApID8gMSA6IDA7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gdXNlIGRlZmF1bHQgRURDQSBwYXJhbWV0ZXIKKyAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5iQUNNW1FJRF9BQ19CRV0gID0gMDsKKyAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5BaWZzbltRSURfQUNfQkVdID0gMzsKKyAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5Dd21pbltRSURfQUNfQkVdID0gQ1dfTUlOX0lOX0JJVFM7CisgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+Q3dtYXhbUUlEX0FDX0JFXSA9IENXX01BWF9JTl9CSVRTOworICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPlR4b3BbUUlEX0FDX0JFXSAgPSAwOworCisgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+YkFDTVtRSURfQUNfQktdICA9IDA7CisgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+QWlmc25bUUlEX0FDX0JLXSA9IDc7CisgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+Q3dtaW5bUUlEX0FDX0JLXSA9IENXX01JTl9JTl9CSVRTOworICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPkN3bWF4W1FJRF9BQ19CS10gPSBDV19NQVhfSU5fQklUUzsKKyAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5UeG9wW1FJRF9BQ19CS10gID0gMDsKKworICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPmJBQ01bUUlEX0FDX1ZJXSAgPSAwOworICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPkFpZnNuW1FJRF9BQ19WSV0gPSAyOworICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPkN3bWluW1FJRF9BQ19WSV0gPSBDV19NSU5fSU5fQklUUy0xOworICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPkN3bWF4W1FJRF9BQ19WSV0gPSBDV19NQVhfSU5fQklUUzsKKyAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5UeG9wW1FJRF9BQ19WSV0gID0gOTY7ICAgLy8gQUNfVkk6IDk2KjMydXMgfj0gM21zCisKKyAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5iQUNNW1FJRF9BQ19WT10gID0gMDsKKyAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5BaWZzbltRSURfQUNfVk9dID0gMjsKKyAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5Dd21pbltRSURfQUNfVk9dID0gQ1dfTUlOX0lOX0JJVFMtMjsKKyAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5Dd21heFtRSURfQUNfVk9dID0gQ1dfTUFYX0lOX0JJVFMtMTsKKyAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5UeG9wW1FJRF9BQ19WT10gID0gNDg7ICAgLy8gQUNfVk86IDQ4KjMydXMgfj0gMS41bXMKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgSUVfRVhUX1NVUFBfUkFURVM6CisgICAgICAgICAgICAgICAgaWYgKHBFaWQtPkxlbiA8PSBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KEV4dFJhdGUsIHBFaWQtPk9jdGV0LCBwRWlkLT5MZW4pOworICAgICAgICAgICAgICAgICAgICAqcEV4dFJhdGVMZW4gPSBwRWlkLT5MZW47CisKKyAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogMjAwNC0wOS0xNCBub3QgYSBnb29kIGRlc2lnbiBoZXJlLCBjYXVzZSBpdCBleGNsdWRlIGV4dHJhIHJhdGVzCisgICAgICAgICAgICAgICAgICAgIC8vIGZyb20gU2NhblRhYi4gV2Ugc2hvdWxkIHJlcG9ydCBhcyBpcy4gQW5kIGZpbHRlciBvdXQgdW5zdXBwb3J0ZWQKKyAgICAgICAgICAgICAgICAgICAgLy8gcmF0ZXMgaW4gTWxtZUF1eC4KKyAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgYWdhaW5zdCB0aGUgc3VwcG9ydGVkIHJhdGVzCisgICAgICAgICAgICAgICAgICAgIC8vIFJUTVBDaGVja1JhdGVzKHBBZCwgRXh0UmF0ZSwgcEV4dFJhdGVMZW4pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBJRV9FUlA6CisgICAgICAgICAgICAgICAgaWYgKHBFaWQtPkxlbiA9PSAxKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgKnBFcnAgPSAoVUNIQVIpcEVpZC0+T2N0ZXRbMF07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIElFX0FJUk9ORVRfQ0tJUDoKKyAgICAgICAgICAgICAgICAvLyAwLiBDaGVjayBBaXJvbmV0IElFIGxlbmd0aCwgaXQgbXVzdCBiZSBsYXJnZXIgb3IgZXF1YWwgdG8gMjgKKyAgICAgICAgICAgICAgICAvLyBDaXNjbyBBUDM1MCB1c2VkIGxlbmd0aCBhcyAyOAorICAgICAgICAgICAgICAgIC8vIENpc2NvIEFQMTJYWCB1c2VkIGxlbmd0aCBhcyAzMAorICAgICAgICAgICAgICAgIGlmIChwRWlkLT5MZW4gPCAoQ0tJUF9ORUdPVElBVElPTl9MRU5HVEggLSAyKSkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAvLyAxLiBDb3B5IENLSVAgZmxhZyBieXRlIHRvIGJ1ZmZlciBmb3IgcHJvY2VzcworICAgICAgICAgICAgICAgICpwQ2tpcEZsYWcgPSAqKHBFaWQtPk9jdGV0ICsgOCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgSUVfQVBfVFhfUE9XRVI6CisgICAgICAgICAgICAgICAgLy8gQVAgQ29udHJvbCBvZiBDbGllbnQgVHJhbnNtaXQgUG93ZXIKKyAgICAgICAgICAgICAgICAvLzAuIENoZWNrIEFpcm9uZXQgSUUgbGVuZ3RoLCBpdCBtdXN0IGJlIDYKKyAgICAgICAgICAgICAgICBpZiAocEVpZC0+TGVuICE9IDB4MDYpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgLy8gR2V0IGNlbGwgcG93ZXIgbGltaXQgaW4gZEJtCisgICAgICAgICAgICAgICAgaWYgKE5kaXNFcXVhbE1lbW9yeShwRWlkLT5PY3RldCwgQ0lTQ09fT1VJLCAzKSA9PSAxKQorICAgICAgICAgICAgICAgICAgICAqcEFpcm9uZXRDZWxsUG93ZXJMaW1pdCA9ICoocEVpZC0+T2N0ZXQgKyA0KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgLy8gV1BBMiAmIDgwMi4xMWkgUlNOCisgICAgICAgICAgICBjYXNlIElFX1JTTjoKKyAgICAgICAgICAgICAgICAvLyBUaGVyZSBpcyBubyBPVUkgZm9yIHZlcnNpb24gYW55bW9yZSwgY2hlY2sgdGhlIGdyb3VwIGNpcGhlciBPVUkgYmVmb3JlIGNvcHlpbmcKKyAgICAgICAgICAgICAgICBpZiAoUlRNUEVxdWFsTWVtb3J5KHBFaWQtPk9jdGV0ICsgMiwgUlNOX09VSSwgMykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBDb3B5IHRvIHBWSUUgd2hpY2ggd2lsbCByZXBvcnQgdG8gbWljcm9zb2Z0IGJzc2lkIGxpc3QuCisgICAgICAgICAgICAgICAgICAgIFB0ciA9IChQVUNIQVIpIHBWSUU7CisgICAgICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KFB0ciArICpMZW5ndGhWSUUsICZwRWlkLT5FaWQsIHBFaWQtPkxlbiArIDIpOworICAgICAgICAgICAgICAgICAgICAqTGVuZ3RoVklFICs9IChwRWlkLT5MZW4gKyAyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisjaWZkZWYgRVhUX0JVSUxEX0NIQU5ORUxfTElTVAorCQkJY2FzZSBJRV9DT1VOVFJZOgorCQkJCVB0ciA9IChQVUNIQVIpIHBWSUU7CisgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkoUHRyICsgKkxlbmd0aFZJRSwgJnBFaWQtPkVpZCwgcEVpZC0+TGVuICsgMik7CisgICAgICAgICAgICAgICAgKkxlbmd0aFZJRSArPSAocEVpZC0+TGVuICsgMik7CisJCQkJYnJlYWs7CisjZW5kaWYgLy8gRVhUX0JVSUxEX0NIQU5ORUxfTElTVCAvLworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIExlbmd0aCA9IExlbmd0aCArIDIgKyBwRWlkLT5MZW47ICAvLyBFaWRbMV0gKyBMZW5bMV0rIGNvbnRlbnRbTGVuXQorICAgICAgICBwRWlkID0gKFBFSURfU1RSVUNUKSgoVUNIQVIqKXBFaWQgKyAyICsgcEVpZC0+TGVuKTsKKyAgICB9CisKKyAgICAvLyBGb3Igc29tZSAxMWEgQVAuIGl0IGRpZCBub3QgaGF2ZSB0aGUgY2hhbm5lbCBFSUQsIHBhdGNoIGhlcmUKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCXsKKwkJVUNIQVIgTGF0Y2hSZkNoYW5uZWwgPSBNc2dDaGFubmVsOworCQlpZiAoKHBBZC0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbCA+IDE0KSAmJiAoKFNhbml0eSAmIDB4NCkgPT0gMCkpCisJCXsKKwkJCWlmIChDdHJsQ2hhbm5lbCAhPSAwKQorCQkJCSpwQ2hhbm5lbCA9IEN0cmxDaGFubmVsOworCQkJZWxzZQorCQkJCSpwQ2hhbm5lbCA9IExhdGNoUmZDaGFubmVsOworCQkJU2FuaXR5IHw9IDB4NDsKKwkJfQorCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCWlmIChTYW5pdHkgIT0gMHg3KQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfV0FSTiwgKCJQZWVyQmVhY29uQW5kUHJvYmVSc3BTYW5pdHkgLSBtaXNzaW5nIGZpZWxkLCBTYW5pdHk9MHglMDJ4XG4iLCBTYW5pdHkpKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKwllbHNlCisJeworCQlyZXR1cm4gVFJVRTsKKwl9CisKK30KKworI2lmZGVmIERPVDExTl9EUkFGVDMKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJTUxNRSBtZXNzYWdlIHNhbml0eSBjaGVjayBmb3Igc29tZSBJRSBhZGRyZXNzZWQgIGluIDgwMi4xMW4gZDMuMDMuCisJUmV0dXJuOgorCQlUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK0JPT0xFQU4gUGVlckJlYWNvbkFuZFByb2JlUnNwU2FuaXR5MigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBWT0lEICpNc2csCisJSU4gVUxPTkcgTXNnTGVuLAorCU9VVCBVQ0hBUiAJKlJlZ0NsYXNzKQoreworCUNIQVIJCQkJKlB0cjsKKwlQRlJBTUVfODAyXzExCQlwRnJhbWU7CisJUEVJRF9TVFJVQ1QJCQlwRWlkOworCVVMT05HCQkJCUxlbmd0aCA9IDA7CisKKwlwRnJhbWUgPSAoUEZSQU1FXzgwMl8xMSlNc2c7CisKKwkqUmVnQ2xhc3MgPSAwOworCVB0ciA9IHBGcmFtZS0+T2N0ZXQ7CisJTGVuZ3RoICs9IExFTkdUSF84MDJfMTE7CisKKwkvLyBnZXQgdGltZXN0YW1wIGZyb20gcGF5bG9hZCBhbmQgYWR2YW5jZSB0aGUgcG9pbnRlcgorCVB0ciArPSBUSU1FU1RBTVBfTEVOOworCUxlbmd0aCArPSBUSU1FU1RBTVBfTEVOOworCisJLy8gZ2V0IGJlYWNvbiBpbnRlcnZhbCBmcm9tIHBheWxvYWQgYW5kIGFkdmFuY2UgdGhlIHBvaW50ZXIKKwlQdHIgKz0gMjsKKwlMZW5ndGggKz0gMjsKKworCS8vIGdldCBjYXBhYmlsaXR5IGluZm8gZnJvbSBwYXlsb2FkIGFuZCBhZHZhbmNlIHRoZSBwb2ludGVyCisJUHRyICs9IDI7CisJTGVuZ3RoICs9IDI7CisKKwlwRWlkID0gKFBFSURfU1RSVUNUKSBQdHI7CisKKwkvLyBnZXQgdmFyaWFibGUgZmllbGRzIGZyb20gcGF5bG9hZCBhbmQgYWR2YW5jZSB0aGUgcG9pbnRlcgorCXdoaWxlICgoTGVuZ3RoICsgMiArIHBFaWQtPkxlbikgPD0gTXNnTGVuKQorCXsKKwkJc3dpdGNoKHBFaWQtPkVpZCkKKwkJeworCQkJY2FzZSBJRV9TVVBQX1JFR19DTEFTUzoKKwkJCQlpZihwRWlkLT5MZW4gPiAwKQorCQkJCXsKKwkJCQkJKlJlZ0NsYXNzID0gKnBFaWQtPk9jdGV0OworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyQmVhY29uQW5kUHJvYmVSc3BTYW5pdHkgLSB3cm9uZyBJRV9TU0lEIChsZW49JWQpXG4iLHBFaWQtPkxlbikpOworCQkJCQlyZXR1cm4gRkFMU0U7CisJCQkJfQorCQkJCWJyZWFrOworCQl9CisKKwkJTGVuZ3RoID0gTGVuZ3RoICsgMiArIHBFaWQtPkxlbjsgIC8vIEVpZFsxXSArIExlblsxXSsgY29udGVudFtMZW5dCisJCXBFaWQgPSAoUEVJRF9TVFJVQ1QpKChVQ0hBUiopcEVpZCArIDIgKyBwRWlkLT5MZW4pOworCX0KKworCXJldHVybiBUUlVFOworCit9CisjZW5kaWYgLy8gRE9UMTFOX0RSQUZUMyAvLworCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIE1MTUUgbWVzc2FnZSBzYW5pdHkgY2hlY2sKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitCT09MRUFOIE1sbWVTY2FuUmVxU2FuaXR5KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFZPSUQgKk1zZywKKwlJTiBVTE9ORyBNc2dMZW4sCisJT1VUIFVDSEFSICpwQnNzVHlwZSwKKwlPVVQgQ0hBUiBTc2lkW10sCisJT1VUIFVDSEFSICpwU3NpZExlbiwKKwlPVVQgVUNIQVIgKnBTY2FuVHlwZSkKK3sKKwlNTE1FX1NDQU5fUkVRX1NUUlVDVCAqSW5mbzsKKworCUluZm8gPSAoTUxNRV9TQ0FOX1JFUV9TVFJVQ1QgKikoTXNnKTsKKwkqcEJzc1R5cGUgPSBJbmZvLT5Cc3NUeXBlOworCSpwU3NpZExlbiA9IEluZm8tPlNzaWRMZW47CisJTmRpc01vdmVNZW1vcnkoU3NpZCwgSW5mby0+U3NpZCwgKnBTc2lkTGVuKTsKKwkqcFNjYW5UeXBlID0gSW5mby0+U2NhblR5cGU7CisKKwlpZiAoKCpwQnNzVHlwZSA9PSBCU1NfSU5GUkEgfHwgKnBCc3NUeXBlID09IEJTU19BREhPQyB8fCAqcEJzc1R5cGUgPT0gQlNTX0FOWSkKKwkJJiYgKCpwU2NhblR5cGUgPT0gU0NBTl9BQ1RJVkUgfHwgKnBTY2FuVHlwZSA9PSBTQ0FOX1BBU1NJVkUKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJfHwgKnBTY2FuVHlwZSA9PSBTQ0FOX0NJU0NPX1BBU1NJVkUgfHwgKnBTY2FuVHlwZSA9PSBTQ0FOX0NJU0NPX0FDVElWRQorCQl8fCAqcFNjYW5UeXBlID09IFNDQU5fQ0lTQ09fQ0hBTk5FTF9MT0FEIHx8ICpwU2NhblR5cGUgPT0gU0NBTl9DSVNDT19OT0lTRQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCQkpKQorCXsKKwkJcmV0dXJuIFRSVUU7CisJfQorCWVsc2UKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1sbWVTY2FuUmVxU2FuaXR5IGZhaWwgLSB3cm9uZyBCc3NUeXBlIG9yIFNjYW5UeXBlXG4iKSk7CisJCXJldHVybiBGQUxTRTsKKwl9Cit9CisKKy8vIElSUUwgPSBESVNQQVRDSF9MRVZFTAorVUNIQVIgQ2hhbm5lbFNhbml0eSgKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBVQ0hBUiBjaGFubmVsKQoreworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IHBBZC0+Q2hhbm5lbExpc3ROdW07IGkgKyspCisgICAgeworICAgICAgICBpZiAoY2hhbm5lbCA9PSBwQWQtPkNoYW5uZWxMaXN0W2ldLkNoYW5uZWwpCisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgTUxNRSBtZXNzYWdlIHNhbml0eSBjaGVjaworICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitCT09MRUFOIFBlZXJEZWF1dGhTYW5pdHkoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gVk9JRCAqTXNnLAorICAgIElOIFVMT05HIE1zZ0xlbiwKKyAgICBPVVQgUFVDSEFSIHBBZGRyMiwKKyAgICBPVVQgVVNIT1JUICpwUmVhc29uKQoreworICAgIFBGUkFNRV84MDJfMTEgcEZyYW1lID0gKFBGUkFNRV84MDJfMTEpTXNnOworCisgICAgQ09QWV9NQUNfQUREUihwQWRkcjIsIHBGcmFtZS0+SGRyLkFkZHIyKTsKKyAgICBOZGlzTW92ZU1lbW9yeShwUmVhc29uLCAmcEZyYW1lLT5PY3RldFswXSwgMik7CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBNTE1FIG1lc3NhZ2Ugc2FuaXR5IGNoZWNrCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK0JPT0xFQU4gUGVlckF1dGhTYW5pdHkoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gVk9JRCAqTXNnLAorICAgIElOIFVMT05HIE1zZ0xlbiwKKyAgICBPVVQgUFVDSEFSIHBBZGRyLAorICAgIE9VVCBVU0hPUlQgKnBBbGcsCisgICAgT1VUIFVTSE9SVCAqcFNlcSwKKyAgICBPVVQgVVNIT1JUICpwU3RhdHVzLAorICAgIENIQVIgKnBDaGxnVGV4dCkKK3sKKyAgICBQRlJBTUVfODAyXzExIHBGcmFtZSA9IChQRlJBTUVfODAyXzExKU1zZzsKKworICAgIENPUFlfTUFDX0FERFIocEFkZHIsICAgcEZyYW1lLT5IZHIuQWRkcjIpOworICAgIE5kaXNNb3ZlTWVtb3J5KHBBbGcsICAgICZwRnJhbWUtPk9jdGV0WzBdLCAyKTsKKyAgICBOZGlzTW92ZU1lbW9yeShwU2VxLCAgICAmcEZyYW1lLT5PY3RldFsyXSwgMik7CisgICAgTmRpc01vdmVNZW1vcnkocFN0YXR1cywgJnBGcmFtZS0+T2N0ZXRbNF0sIDIpOworCisgICAgaWYgKCgqcEFsZyA9PSBOZGlzODAyXzExQXV0aE1vZGVPcGVuKQorI2lmZGVmIExFQVBfU1VQUE9SVAorICAgICAgfHwgKCpwQWxnID09IENJU0NPX0F1dGhNb2RlTEVBUCkKKyNlbmRpZiAvLyBMRUFQX1NVUFBPUlQgLy8KKyAgICAgICkKKyAgICB7CisgICAgICAgIGlmICgqcFNlcSA9PSAxIHx8ICpwU2VxID09IDIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGVlckF1dGhTYW5pdHkgZmFpbCAtIHdyb25nIFNlZyNcbiIpKTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmICgqcEFsZyA9PSBOZGlzODAyXzExQXV0aE1vZGVTaGFyZWQpCisgICAgeworICAgICAgICBpZiAoKnBTZXEgPT0gMSB8fCAqcFNlcSA9PSA0KQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICgqcFNlcSA9PSAyIHx8ICpwU2VxID09IDMpCisgICAgICAgIHsKKyAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBDaGxnVGV4dCwgJnBGcmFtZS0+T2N0ZXRbOF0sIENJUEhFUl9URVhUX0xFTik7CisgICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXJBdXRoU2FuaXR5IGZhaWwgLSB3cm9uZyBTZWcjXG4iKSk7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGVlckF1dGhTYW5pdHkgZmFpbCAtIHdyb25nIGFsZ29yaXRobVxuIikpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIE1MTUUgbWVzc2FnZSBzYW5pdHkgY2hlY2sKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitCT09MRUFOIE1sbWVBdXRoUmVxU2FuaXR5KAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIFZPSUQgKk1zZywKKyAgICBJTiBVTE9ORyBNc2dMZW4sCisgICAgT1VUIFBVQ0hBUiBwQWRkciwKKyAgICBPVVQgVUxPTkcgKnBUaW1lb3V0LAorICAgIE9VVCBVU0hPUlQgKnBBbGcpCit7CisgICAgTUxNRV9BVVRIX1JFUV9TVFJVQ1QgKnBJbmZvOworCisgICAgcEluZm8gID0gKE1MTUVfQVVUSF9SRVFfU1RSVUNUICopTXNnOworICAgIENPUFlfTUFDX0FERFIocEFkZHIsIHBJbmZvLT5BZGRyKTsKKyAgICAqcFRpbWVvdXQgPSBwSW5mby0+VGltZW91dDsKKyAgICAqcEFsZyA9IHBJbmZvLT5BbGc7CisKKyAgICBpZiAoKCgqcEFsZyA9PSBOZGlzODAyXzExQXV0aE1vZGVTaGFyZWQpIHx8KCpwQWxnID09IE5kaXM4MDJfMTFBdXRoTW9kZU9wZW4pCisjaWZkZWYgTEVBUF9TVVBQT1JUCisgICAgIHx8ICgqcEFsZyA9PSBDSVNDT19BdXRoTW9kZUxFQVApCisjZW5kaWYgLy8gTEVBUF9TVVBQT1JUIC8vCisgICAgIAkpICYmCisgICAgICAgICgoKnBBZGRyICYgMHgwMSkgPT0gMCkpCisgICAgeworICAgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTWxtZUF1dGhSZXFTYW5pdHkgZmFpbCAtIHdyb25nIGFsZ29yaXRobVxuIikpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIE1MTUUgbWVzc2FnZSBzYW5pdHkgY2hlY2sKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworQk9PTEVBTiBNbG1lQXNzb2NSZXFTYW5pdHkoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gVk9JRCAqTXNnLAorICAgIElOIFVMT05HIE1zZ0xlbiwKKyAgICBPVVQgUFVDSEFSIHBBcEFkZHIsCisgICAgT1VUIFVTSE9SVCAqcENhcGFiaWxpdHlJbmZvLAorICAgIE9VVCBVTE9ORyAqcFRpbWVvdXQsCisgICAgT1VUIFVTSE9SVCAqcExpc3RlbkludHYpCit7CisgICAgTUxNRV9BU1NPQ19SRVFfU1RSVUNUICpwSW5mbzsKKworICAgIHBJbmZvID0gKE1MTUVfQVNTT0NfUkVRX1NUUlVDVCAqKU1zZzsKKyAgICAqcFRpbWVvdXQgPSBwSW5mby0+VGltZW91dDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRpbWVvdXQKKyAgICBDT1BZX01BQ19BRERSKHBBcEFkZHIsIHBJbmZvLT5BZGRyKTsgICAgICAgICAgICAgICAgICAgLy8gQVAgYWRkcmVzcworICAgICpwQ2FwYWJpbGl0eUluZm8gPSBwSW5mby0+Q2FwYWJpbGl0eUluZm87ICAgICAgICAgICAgICAgLy8gY2FwYWJpbGl0eSBpbmZvCisgICAgKnBMaXN0ZW5JbnR2ID0gcEluZm8tPkxpc3RlbkludHY7CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBNTE1FIG1lc3NhZ2Ugc2FuaXR5IGNoZWNrCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK0JPT0xFQU4gUGVlckRpc2Fzc29jU2FuaXR5KAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIFZPSUQgKk1zZywKKyAgICBJTiBVTE9ORyBNc2dMZW4sCisgICAgT1VUIFBVQ0hBUiBwQWRkcjIsCisgICAgT1VUIFVTSE9SVCAqcFJlYXNvbikKK3sKKyAgICBQRlJBTUVfODAyXzExIHBGcmFtZSA9IChQRlJBTUVfODAyXzExKU1zZzsKKworICAgIENPUFlfTUFDX0FERFIocEFkZHIyLCBwRnJhbWUtPkhkci5BZGRyMik7CisgICAgTmRpc01vdmVNZW1vcnkocFJlYXNvbiwgJnBGcmFtZS0+T2N0ZXRbMF0sIDIpOworCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJU2FuaXR5IGNoZWNrIE5ldHdvcmtUeXBlICgxMWIsIDExZyBvciAxMWEpCisKKwlBcmd1bWVudHM6CisJCXBCc3MgLSBQb2ludGVyIHRvIEJTUyB0YWJsZS4KKworCVJldHVybiBWYWx1ZToKKyAgICAgICAgTmRpczgwMl8xMURTIC4uLi4uLi4oMTFiKQorICAgICAgICBOZGlzODAyXzExT0ZETTI0Li4uLigxMWcpCisgICAgICAgIE5kaXM4MDJfMTFPRkRNNS4uLi4uKDExYSkKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworTkRJU184MDJfMTFfTkVUV09SS19UWVBFIE5ldHdvcmtUeXBlSW5Vc2VTYW5pdHkoCisgICAgSU4gUEJTU19FTlRSWSBwQnNzKQoreworCU5ESVNfODAyXzExX05FVFdPUktfVFlQRQlOZXRXb3JrVHlwZTsKKwlVQ0hBUgkJCQkJCXJhdGUsIGk7CisKKwlOZXRXb3JrVHlwZSA9IE5kaXM4MDJfMTFEUzsKKworCWlmIChwQnNzLT5DaGFubmVsIDw9IDE0KQorCXsKKwkJLy8KKwkJLy8gRmlyc3QgY2hlY2sgc3VwcG9ydCBSYXRlLgorCQkvLworCQlmb3IgKGkgPSAwOyBpIDwgcEJzcy0+U3VwUmF0ZUxlbjsgaSsrKQorCQl7CisJCQlyYXRlID0gcEJzcy0+U3VwUmF0ZVtpXSAmIDB4N2Y7IC8vIE1hc2sgb3V0IGJhc2ljIHJhdGUgc2V0IGJpdAorCQkJaWYgKChyYXRlID09IDIpIHx8IChyYXRlID09IDQpIHx8IChyYXRlID09IDExKSB8fCAocmF0ZSA9PSAyMikpCisJCQl7CisJCQkJY29udGludWU7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJLy8KKwkJCQkvLyBPdGhlcndpc2UgKGV2ZW4gcmF0ZSA+IDEwOCkgbWVhbnMgTmRpczgwMl8xMU9GRE0yNAorCQkJCS8vCisJCQkJTmV0V29ya1R5cGUgPSBOZGlzODAyXzExT0ZETTI0OworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJLy8KKwkJLy8gU2Vjb25kIGNoZWNrIEV4dGVuZCBSYXRlLgorCQkvLworCQlpZiAoTmV0V29ya1R5cGUgIT0gTmRpczgwMl8xMU9GRE0yNCkKKwkJeworCQkJZm9yIChpID0gMDsgaSA8IHBCc3MtPkV4dFJhdGVMZW47IGkrKykKKwkJCXsKKwkJCQlyYXRlID0gcEJzcy0+U3VwUmF0ZVtpXSAmIDB4N2Y7IC8vIE1hc2sgb3V0IGJhc2ljIHJhdGUgc2V0IGJpdAorCQkJCWlmICgocmF0ZSA9PSAyKSB8fCAocmF0ZSA9PSA0KSB8fCAocmF0ZSA9PSAxMSkgfHwgKHJhdGUgPT0gMjIpKQorCQkJCXsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCS8vCisJCQkJCS8vIE90aGVyd2lzZSAoZXZlbiByYXRlID4gMTA4KSBtZWFucyBOZGlzODAyXzExT0ZETTI0CisJCQkJCS8vCisJCQkJCU5ldFdvcmtUeXBlID0gTmRpczgwMl8xMU9GRE0yNDsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisJfQorCWVsc2UKKwl7CisJCU5ldFdvcmtUeXBlID0gTmRpczgwMl8xMU9GRE01OworCX0KKworICAgIGlmIChwQnNzLT5IdENhcGFiaWxpdHlMZW4gIT0gMCkKKyAgICB7CisgICAgICAgIGlmIChOZXRXb3JrVHlwZSA9PSBOZGlzODAyXzExT0ZETTUpCisgICAgICAgICAgICBOZXRXb3JrVHlwZSA9IE5kaXM4MDJfMTFPRkRNNV9OOworICAgICAgICBlbHNlCisgICAgICAgICAgICBOZXRXb3JrVHlwZSA9IE5kaXM4MDJfMTFPRkRNMjRfTjsKKyAgICB9CisKKwlyZXR1cm4gTmV0V29ya1R5cGU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgV1BBIG1lc3NhZ2Ugc2FuaXR5IGNoZWNrCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworQk9PTEVBTiBQZWVyV3BhTWVzc2FnZVNhbml0eSgKKyAgICBJTiAJUFJUTVBfQURBUFRFUiAJCXBBZCwKKyAgICBJTiAJUEVBUE9MX1BBQ0tFVCAJCXBNc2csCisgICAgSU4gCVVMT05HIAkJCQlNc2dMZW4sCisgICAgSU4gCVVDSEFSCQkJCU1zZ1R5cGUsCisgICAgSU4gCU1BQ19UQUJMRV9FTlRSWSAgCSpwRW50cnkpCit7CisJVUNIQVIJCQltaWNbTEVOX0tFWV9ERVNDX01JQ10sIGRpZ2VzdFs4MF0sIEtFWURBVEFbTUFYX0xFTl9PRl9SU05JRV07CisJQk9PTEVBTgkJCWJSZXBsYXlEaWZmID0gRkFMU0U7CisJQk9PTEVBTgkJCWJXUEEyID0gRkFMU0U7CisJS0VZX0lORk8JCUVhcG9sS2V5SW5mbzsKKwlVQ0hBUgkJCUdyb3VwS2V5SW5kZXggPSAwOworCisKKwlOZGlzWmVyb01lbW9yeShtaWMsIHNpemVvZihtaWMpKTsKKwlOZGlzWmVyb01lbW9yeShkaWdlc3QsIHNpemVvZihkaWdlc3QpKTsKKwlOZGlzWmVyb01lbW9yeShLRVlEQVRBLCBzaXplb2YoS0VZREFUQSkpOworCU5kaXNaZXJvTWVtb3J5KChQVUNIQVIpJkVhcG9sS2V5SW5mbywgc2l6ZW9mKEVhcG9sS2V5SW5mbykpOworCisJTmRpc01vdmVNZW1vcnkoKFBVQ0hBUikmRWFwb2xLZXlJbmZvLCAoUFVDSEFSKSZwTXNnLT5LZXlEZXNjLktleUluZm8sIHNpemVvZihLRVlfSU5GTykpOworCisJKigoVVNIT1JUICopJkVhcG9sS2V5SW5mbykgPSBjcHUybGUxNigqKChVU0hPUlQgKikmRWFwb2xLZXlJbmZvKSk7CisKKwkvLyBDaG9vc2UgV1BBMiBvciBub3QKKwlpZiAoKHBFbnRyeS0+QXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikgfHwgKHBFbnRyeS0+QXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykpCisJCWJXUEEyID0gVFJVRTsKKworCS8vIDAuIENoZWNrIE1zZ1R5cGUKKwlpZiAoKE1zZ1R5cGUgPiBFQVBPTF9HUk9VUF9NU0dfMikgfHwgKE1zZ1R5cGUgPCBFQVBPTF9QQUlSX01TR18xKSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlRoZSBtZXNzYWdlIHR5cGUgaXMgaW52YWxpZCglZCkhIFxuIiwgTXNnVHlwZSkpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJLy8gMS4gUmVwbGF5IGNvdW50ZXIgY2hlY2sKKyAJaWYgKE1zZ1R5cGUgPT0gRUFQT0xfUEFJUl9NU0dfMSB8fCBNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzMgfHwgTXNnVHlwZSA9PSBFQVBPTF9HUk9VUF9NU0dfMSkJLy8gRm9yIHN1cHBsaWNhbnQKKyAgICB7CisgICAgCS8vIEZpcnN0IHZhbGlkYXRlIHJlcGxheSBjb3VudGVyLCBvbmx5IGFjY2VwdCBtZXNzYWdlIHdpdGggbGFyZ2VyIHJlcGxheSBjb3VudGVyLgorCQkvLyBMZXQgZXF1YWwgcGFzcywgc29tZSBBUCBzdGFydCB3aXRoIGFsbCB6ZXJvIHJlcGxheSBjb3VudGVyCisJCVVDSEFSCVplcm9SZXBsYXlbTEVOX0tFWV9ERVNDX1JFUExBWV07CisKKyAgICAgICAgTmRpc1plcm9NZW1vcnkoWmVyb1JlcGxheSwgTEVOX0tFWV9ERVNDX1JFUExBWSk7CisJCWlmICgoUlRNUENvbXBhcmVNZW1vcnkocE1zZy0+S2V5RGVzYy5SZXBsYXlDb3VudGVyLCBwRW50cnktPlJfQ291bnRlciwgTEVOX0tFWV9ERVNDX1JFUExBWSkgIT0gMSkgJiYKKwkJCShSVE1QQ29tcGFyZU1lbW9yeShwTXNnLT5LZXlEZXNjLlJlcGxheUNvdW50ZXIsIFplcm9SZXBsYXksIExFTl9LRVlfREVTQ19SRVBMQVkpICE9IDApKQorICAgIAl7CisJCQliUmVwbGF5RGlmZiA9IFRSVUU7CisgICAgCX0KKyAJfQorCWVsc2UgaWYgKE1zZ1R5cGUgPT0gRUFQT0xfUEFJUl9NU0dfMiB8fCBNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzQgfHwgTXNnVHlwZSA9PSBFQVBPTF9HUk9VUF9NU0dfMikJLy8gRm9yIGF1dGhlbnRpY2F0b3IKKwl7CisJCS8vIGNoZWNrIFJlcGxheSBDb3VudGVyIGNvcmVzcG9uZHMgdG8gTVNHIGZyb20gYXV0aGVudGljYXRvciwgb3RoZXJ3aXNlIGRpc2NhcmQKKyAgICAJaWYgKCFOZGlzRXF1YWxNZW1vcnkocE1zZy0+S2V5RGVzYy5SZXBsYXlDb3VudGVyLCBwRW50cnktPlJfQ291bnRlciwgTEVOX0tFWV9ERVNDX1JFUExBWSkpCisgICAgCXsKKwkJCWJSZXBsYXlEaWZmID0gVFJVRTsKKyAgICAJfQorCX0KKworCS8vIFJlcGxheSBDb3VudGVyIGRpZmZlcmVudCBjb25kaXRpb24KKwlpZiAoYlJlcGxheURpZmYpCisJeworCQkvLyBzZW5kIHdpcmVsZXNzIGV2ZW50IC0gZm9yIHJlcGxheSBjb3VudGVyIGRpZmZlcmVudAorCQlpZiAocEFkLT5Db21tb25DZmcuYldpcmVsZXNzRXZlbnQpCisJCQlSVE1QU2VuZFdpcmVsZXNzRXZlbnQocEFkLCBJV19SRVBMQVlfQ09VTlRFUl9ESUZGX0VWRU5UX0ZMQUcsIHBFbnRyeS0+QWRkciwgcEVudHJ5LT5hcGlkeCwgMCk7CisKKwkJaWYgKE1zZ1R5cGUgPCBFQVBPTF9HUk9VUF9NU0dfMSkKKwkJeworICAgICAgICAgICAJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiUmVwbGF5IENvdW50ZXIgRGlmZmVyZW50IGluIHBhaXJ3aXNlIG1zZyAlZCBvZiA0LXdheSBoYW5kc2hha2UhXG4iLCBNc2dUeXBlKSk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJSZXBsYXkgQ291bnRlciBEaWZmZXJlbnQgaW4gZ3JvdXAgbXNnICVkIG9mIDItd2F5IGhhbmRzaGFrZSFcbiIsIChNc2dUeXBlIC0gRUFQT0xfUEFJUl9NU0dfNCkpKTsKKwkJfQorCisJCWhleF9kdW1wKCJSZWNlaXZlIHJlcGxheSBjb3VudGVyICIsIHBNc2ctPktleURlc2MuUmVwbGF5Q291bnRlciwgTEVOX0tFWV9ERVNDX1JFUExBWSk7CisJCWhleF9kdW1wKCJDdXJyZW50IHJlcGxheSBjb3VudGVyICIsIHBFbnRyeS0+Ul9Db3VudGVyLCBMRU5fS0VZX0RFU0NfUkVQTEFZKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCX0KKworCS8vIDIuIFZlcmlmeSBNSUMgZXhjZXB0IFBhaXJ3aXNlIE1zZzEKKwlpZiAoTXNnVHlwZSAhPSBFQVBPTF9QQUlSX01TR18xKQorCXsKKwkJVUNIQVIJCQlyY3ZkX21pY1tMRU5fS0VZX0RFU0NfTUlDXTsKKworCQkvLyBSZWNvcmQgdGhlIHJlY2VpdmVkIE1JQyBmb3IgY2hlY2sgbGF0ZXIKKwkJTmRpc01vdmVNZW1vcnkocmN2ZF9taWMsIHBNc2ctPktleURlc2MuS2V5TWljLCBMRU5fS0VZX0RFU0NfTUlDKTsKKwkJTmRpc1plcm9NZW1vcnkocE1zZy0+S2V5RGVzYy5LZXlNaWMsIExFTl9LRVlfREVTQ19NSUMpOworCisgICAgICAgIGlmIChwRW50cnktPldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKQkvLyBUS0lQCisgICAgICAgIHsKKyAgICAgICAgICAgIGhtYWNfbWQ1KHBFbnRyeS0+UFRLLCBMRU5fRUFQX01JQ0ssIChQVUNIQVIpcE1zZywgTXNnTGVuLCBtaWMpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHBFbnRyeS0+V2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCS8vIEFFUworICAgICAgICB7CisgICAgICAgICAgICBITUFDX1NIQTEoKFBVQ0hBUilwTXNnLCBNc2dMZW4sIHBFbnRyeS0+UFRLLCBMRU5fRUFQX01JQ0ssIGRpZ2VzdCk7CisgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShtaWMsIGRpZ2VzdCwgTEVOX0tFWV9ERVNDX01JQyk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIU5kaXNFcXVhbE1lbW9yeShyY3ZkX21pYywgbWljLCBMRU5fS0VZX0RFU0NfTUlDKSkKKyAgICAgICAgeworCQkJLy8gc2VuZCB3aXJlbGVzcyBldmVudCAtIGZvciBNSUMgZGlmZmVyZW50CisJCQlpZiAocEFkLT5Db21tb25DZmcuYldpcmVsZXNzRXZlbnQpCisJCQkJUlRNUFNlbmRXaXJlbGVzc0V2ZW50KHBBZCwgSVdfTUlDX0RJRkZfRVZFTlRfRkxBRywgcEVudHJ5LT5BZGRyLCBwRW50cnktPmFwaWR4LCAwKTsKKworCQkJaWYgKE1zZ1R5cGUgPCBFQVBPTF9HUk9VUF9NU0dfMSkKKwkJCXsKKyAgICAgICAgICAgIAlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJNSUMgRGlmZmVyZW50IGluIHBhaXJ3aXNlIG1zZyAlZCBvZiA0LXdheSBoYW5kc2hha2UhXG4iLCBNc2dUeXBlKSk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiTUlDIERpZmZlcmVudCBpbiBncm91cCBtc2cgJWQgb2YgMi13YXkgaGFuZHNoYWtlIVxuIiwgKE1zZ1R5cGUgLSBFQVBPTF9QQUlSX01TR180KSkpOworCQkJfQorCisJCQloZXhfZHVtcCgiUmVjZWl2ZWQgTUlDIiwgcmN2ZF9taWMsIExFTl9LRVlfREVTQ19NSUMpOworCQkJaGV4X2R1bXAoIkRlc2lyZWQgIE1JQyIsIG1pYywgTEVOX0tFWV9ERVNDX01JQyk7CisKKwkJCXJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCX0KKworCS8vIEV4dHJhY3QgdGhlIGNvbnRleHQgb2YgdGhlIEtleSBEYXRhIGZpZWxkIGlmIGl0IGV4aXN0CisJLy8gVGhlIGZpZWxkIGluIHBhaXJ3aXNlX21zZ18yX1dQQTEoV1BBMikgJiBwYWlyd2lzZV9tc2dfM19XUEExIGlzIHVuLWVuY3J5cHRlZC4KKwkvLyBUaGUgZmllbGQgaW4gZ3JvdXBfbXNnXzFfV1BBMShXUEEyKSAmIHBhaXJ3aXNlX21zZ18zX1dQQTIgaXMgZW5jcnlwdGVkLgorCWlmIChwTXNnLT5LZXlEZXNjLktleURhdGFMZW5bMV0gPiAwKQorCXsKKwkJLy8gRGVjcnlwdCB0aGlzIGZpZWxkCisJCWlmICgoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18zICYmIGJXUEEyKSB8fCAoTXNnVHlwZSA9PSBFQVBPTF9HUk9VUF9NU0dfMSkpCisJCXsKKwkJCWlmKHBFbnRyeS0+V2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCisJCQl7CisJCQkJLy8gQUVTCisJCQkJQUVTX0dUS19LRVlfVU5XUkFQKCZwRW50cnktPlBUS1sxNl0sIEtFWURBVEEsIHBNc2ctPktleURlc2MuS2V5RGF0YUxlblsxXSxwTXNnLT5LZXlEZXNjLktleURhdGEpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCUlOVCAJaTsKKwkJCQlVQ0hBUiAgIEtleVszMl07CisJCQkJLy8gRGVjcnlwdCBUS0lQIEdUSworCQkJCS8vIENvbnN0cnVjdCAzMiBieXRlcyBSQzQgS2V5CisJCQkJTmRpc01vdmVNZW1vcnkoS2V5LCBwTXNnLT5LZXlEZXNjLktleUl2LCAxNik7CisJCQkJTmRpc01vdmVNZW1vcnkoJktleVsxNl0sICZwRW50cnktPlBUS1sxNl0sIDE2KTsKKwkJCQlBUkNGT1VSX0lOSVQoJnBBZC0+UHJpdmF0ZUluZm8uV0VQQ09OVEVYVCwgS2V5LCAzMik7CisJCQkJLy9kaXNjYXJkIGZpcnN0IDI1NiBieXRlcworCQkJCWZvcihpID0gMDsgaSA8IDI1NjsgaSsrKQorCQkJCQlBUkNGT1VSX0JZVEUoJnBBZC0+UHJpdmF0ZUluZm8uV0VQQ09OVEVYVCk7CisJCQkJLy8gRGVjcnlwdCBHVEsuIEJlY2FyZWZ1bCwgdGhlcmUgaXMgbm8gSUNWIHRvIGNoZWNrIHRoZSByZXN1bHQgaXMgY29ycmVjdCBvciBub3QKKwkJCQlBUkNGT1VSX0RFQ1JZUFQoJnBBZC0+UHJpdmF0ZUluZm8uV0VQQ09OVEVYVCwgS0VZREFUQSwgcE1zZy0+S2V5RGVzYy5LZXlEYXRhLCBwTXNnLT5LZXlEZXNjLktleURhdGFMZW5bMV0pOworCQkJfQorCisJCQlpZiAoIWJXUEEyICYmIChNc2dUeXBlID09IEVBUE9MX0dST1VQX01TR18xKSkKKwkJCQlHcm91cEtleUluZGV4ID0gRWFwb2xLZXlJbmZvLktleUluZGV4OworCisJCX0KKwkJZWxzZSBpZiAoKE1zZ1R5cGUgPT0gRUFQT0xfUEFJUl9NU0dfMikgfHwgKE1zZ1R5cGUgPT0gRUFQT0xfUEFJUl9NU0dfMyAmJiAhYldQQTIpKQorCQl7CisJCQlOZGlzTW92ZU1lbW9yeShLRVlEQVRBLCBwTXNnLT5LZXlEZXNjLktleURhdGEsIHBNc2ctPktleURlc2MuS2V5RGF0YUxlblsxXSk7CisJCX0KKwkJZWxzZQorCQl7CisKKwkJCXJldHVybiBUUlVFOworCQl9CisKKwkJLy8gUGFyc2UgS2V5IERhdGEgZmllbGQgdG8KKwkJLy8gMS4gdmVyaWZ5IFJTTiBJRSBmb3IgcGFpcndpc2VfbXNnXzJfV1BBMShXUEEyKSAscGFpcndpc2VfbXNnXzNfV1BBMShXUEEyKQorCQkvLyAyLiB2ZXJpZnkgS0RFIGZvcm1hdCBmb3IgcGFpcndpc2VfbXNnXzNfV1BBMiwgZ3JvdXBfbXNnXzFfV1BBMgorCQkvLyAzLiB1cGRhdGUgc2hhcmVkIGtleSBmb3IgcGFpcndpc2VfbXNnXzNfV1BBMiwgZ3JvdXBfbXNnXzFfV1BBMShXUEEyKQorCQlpZiAoIVJUTVBQYXJzZUVhcG9sS2V5RGF0YShwQWQsIEtFWURBVEEsIHBNc2ctPktleURlc2MuS2V5RGF0YUxlblsxXSwgR3JvdXBLZXlJbmRleCwgTXNnVHlwZSwgYldQQTIsIHBFbnRyeSkpCisJCXsKKwkJCXJldHVybiBGQUxTRTsKKwkJfQorCX0KKworCXJldHVybiBUUlVFOworCit9CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKK0JPT0xFQU4gTWxtZURsc1JlcVNhbml0eSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBWT0lEICpNc2csCisgICAgSU4gVUxPTkcgTXNnTGVuLAorICAgIE9VVCBQUlRfODAyXzExX0RMUyAqcERMUywKKyAgICBPVVQgUFVTSE9SVCBwUmVhc29uKQoreworCU1MTUVfRExTX1JFUV9TVFJVQ1QgKnBJbmZvOworCisgICAgcEluZm8gPSAoTUxNRV9ETFNfUkVRX1NUUlVDVCAqKU1zZzsKKworCSpwRExTID0gcEluZm8tPnBETFM7CisJKnBSZWFzb24gPSBwSW5mby0+UmVhc29uOworCisJcmV0dXJuIFRSVUU7Cit9CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKK0JPT0xFQU4gUGVlckRsc1JlcVNhbml0eSgKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBWT0lEICpNc2csCisgICAgSU4gVUxPTkcgTXNnTGVuLAorICAgIE9VVCBQVUNIQVIgcERBLAorICAgIE9VVCBQVUNIQVIgcFNBLAorICAgIE9VVCBVU0hPUlQgKnBDYXBhYmlsaXR5SW5mbywKKyAgICBPVVQgVVNIT1JUICpwRGxzVGltZW91dCwKKyAgICBPVVQgVUNIQVIgKnBSYXRlc0xlbiwKKyAgICBPVVQgVUNIQVIgUmF0ZXNbXSwKKwlPVVQgVUNIQVIgKnBIdENhcGFiaWxpdHlMZW4sCisgICAgT1VUIEhUX0NBUEFCSUxJVFlfSUUgKnBIdENhcGFiaWxpdHkpCit7CisJQ0hBUiAgICAgICAgICAgICpQdHI7CisgICAgUEZSQU1FXzgwMl8xMQlGciA9IChQRlJBTUVfODAyXzExKU1zZzsKKwlQRUlEX1NUUlVDVCAgZWlkX3B0cjsKKworICAgIC8vIHRvIHByZXZlbnQgY2FsbGVyIGZyb20gdXNpbmcgZ2FyYmFnZSBvdXRwdXQgdmFsdWUKKyAgICAqcENhcGFiaWxpdHlJbmZvCT0gMDsKKyAgICAqcERsc1RpbWVvdXQJPSAwOworCSpwSHRDYXBhYmlsaXR5TGVuID0gMDsKKworICAgIFB0ciA9IEZyLT5PY3RldDsKKworCS8vIG9mZnNldCB0byBkZXN0aW5hdGlvbiBNQUMgYWRkcmVzcyAoQ2F0ZWdvcnkgYW5kIEFjdGlvbiBmaWVsZCkKKyAgICBQdHIgKz0gMjsKKworICAgIC8vIGdldCBEQSBmcm9tIHBheWxvYWQgYW5kIGFkdmFuY2UgdGhlIHBvaW50ZXIKKyAgICBOZGlzTW92ZU1lbW9yeShwREEsIFB0ciwgTUFDX0FERFJfTEVOKTsKKyAgICBQdHIgKz0gTUFDX0FERFJfTEVOOworCisgICAgLy8gZ2V0IFNBIGZyb20gcGF5bG9hZCBhbmQgYWR2YW5jZSB0aGUgcG9pbnRlcgorICAgIE5kaXNNb3ZlTWVtb3J5KHBTQSwgUHRyLCBNQUNfQUREUl9MRU4pOworICAgIFB0ciArPSBNQUNfQUREUl9MRU47CisKKyAgICAvLyBnZXQgY2FwYWJpbGl0eSBpbmZvIGZyb20gcGF5bG9hZCBhbmQgYWR2YW5jZSB0aGUgcG9pbnRlcgorICAgIE5kaXNNb3ZlTWVtb3J5KHBDYXBhYmlsaXR5SW5mbywgUHRyLCAyKTsKKyAgICBQdHIgKz0gMjsKKworICAgIC8vIGdldCBjYXBhYmlsaXR5IGluZm8gZnJvbSBwYXlsb2FkIGFuZCBhZHZhbmNlIHRoZSBwb2ludGVyCisgICAgTmRpc01vdmVNZW1vcnkocERsc1RpbWVvdXQsIFB0ciwgMik7CisgICAgUHRyICs9IDI7CisKKwkvLyBDYXRlZ29yeSBhbmQgQWN0aW9uIGZpZWxkICsgREEgKyBTQSArIGNhcGFiaWxpdHkgKyBUaW1lb3V0CisJZWlkX3B0ciA9IChQRUlEX1NUUlVDVCkgJkZyLT5PY3RldFsxOF07CisKKwl3aGlsZSAoKChVQ0hBUiopZWlkX3B0ciArIGVpZF9wdHItPkxlbiArIDEpIDwgKChVQ0hBUiopRnIgKyBNc2dMZW4pKQorCXsKKwkJc3dpdGNoKGVpZF9wdHItPkVpZCkKKwkJeworCQkJY2FzZSBJRV9TVVBQX1JBVEVTOgorICAgICAgICAgICAgICAgIGlmICgoZWlkX3B0ci0+TGVuIDw9IE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTKSAmJiAoZWlkX3B0ci0+TGVuID4gMCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShSYXRlcywgZWlkX3B0ci0+T2N0ZXQsIGVpZF9wdHItPkxlbik7CisgICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXJEbHNSZXFTYW5pdHkgLSBJRV9TVVBQX1JBVEVTLiwgTGVuPSVkLiBSYXRlc1swXT0leFxuIixlaWRfcHRyLT5MZW4sIFJhdGVzWzBdKSk7CisgICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJhdGVzWzFdPSV4ICV4ICV4ICV4ICV4ICV4ICV4XG4iLCBSYXRlc1sxXSwgUmF0ZXNbMl0sIFJhdGVzWzNdLCBSYXRlc1s0XSwgUmF0ZXNbNV0sIFJhdGVzWzZdLCBSYXRlc1s3XSkpOworICAgICAgICAgICAgICAgICAgICAqcFJhdGVzTGVuID0gZWlkX3B0ci0+TGVuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAqcFJhdGVzTGVuID0gODsKKwkJCQkJUmF0ZXNbMF0gPSAweDgyOworCQkJCQlSYXRlc1sxXSA9IDB4ODQ7CisJCQkJCVJhdGVzWzJdID0gMHg4YjsKKwkJCQkJUmF0ZXNbM10gPSAweDk2OworCQkJCQlSYXRlc1s0XSA9IDB4MTI7CisJCQkJCVJhdGVzWzVdID0gMHgyNDsKKwkJCQkJUmF0ZXNbNl0gPSAweDQ4OworCQkJCQlSYXRlc1s3XSA9IDB4NmM7CisgICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXJEbHNSZXFTYW5pdHkgLSB3cm9uZyBJRV9TVVBQX1JBVEVTLiwgTGVuPSVkXG4iLGVpZF9wdHItPkxlbikpOworICAgICAgICAgICAgICAgIH0KKwkJCQlicmVhazsKKworCQkJY2FzZSBJRV9FWFRfU1VQUF9SQVRFUzoKKyAgICAgICAgICAgICAgICBpZiAoZWlkX3B0ci0+TGVuICsgKnBSYXRlc0xlbiA8PSBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KCZSYXRlc1sqcFJhdGVzTGVuXSwgZWlkX3B0ci0+T2N0ZXQsIGVpZF9wdHItPkxlbik7CisgICAgICAgICAgICAgICAgICAgICpwUmF0ZXNMZW4gPSAoKnBSYXRlc0xlbikgKyBlaWRfcHRyLT5MZW47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KCZSYXRlc1sqcFJhdGVzTGVuXSwgZWlkX3B0ci0+T2N0ZXQsIE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTIC0gKCpwUmF0ZXNMZW4pKTsKKyAgICAgICAgICAgICAgICAgICAgKnBSYXRlc0xlbiA9IE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTOworICAgICAgICAgICAgICAgIH0KKwkJCQlicmVhazsKKworCQkJY2FzZSBJRV9IVF9DQVA6CisJCQkJaWYgKGVpZF9wdHItPkxlbiA+PSBzaXplb2YoSFRfQ0FQQUJJTElUWV9JRSkpCisJCQkJeworCQkJCQlOZGlzTW92ZU1lbW9yeShwSHRDYXBhYmlsaXR5LCBlaWRfcHRyLT5PY3RldCwgc2l6ZW9mKEhUX0NBUEFCSUxJVFlfSUUpKTsKKworCQkJCQkqKFVTSE9SVCAqKSgmcEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvKSA9IGNwdTJsZTE2KCooVVNIT1JUICopKCZwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8pKTsKKwkJCQkJKihVU0hPUlQgKikoJnBIdENhcGFiaWxpdHktPkV4dEh0Q2FwSW5mbykgPSBjcHUybGUxNigqKFVTSE9SVCAqKSgmcEh0Q2FwYWJpbGl0eS0+RXh0SHRDYXBJbmZvKSk7CisJCQkJCSpwSHRDYXBhYmlsaXR5TGVuID0gc2l6ZW9mKEhUX0NBUEFCSUxJVFlfSUUpOworCisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXJEbHNSZXFTYW5pdHkgLSBJRV9IVF9DQVBcbiIpKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGVlckRsc1JlcVNhbml0eSAtIHdyb25nIElFX0hUX0NBUC5laWRfcHRyLT5MZW4gPSAlZFxuIiwgZWlkX3B0ci0+TGVuKSk7CisJCQkJfQorCQkJCWJyZWFrOworCisJCQlkZWZhdWx0OgorCQkJCWJyZWFrOworCQl9CisKKwkJZWlkX3B0ciA9IChQRUlEX1NUUlVDVCkoKFVDSEFSKillaWRfcHRyICsgMiArIGVpZF9wdHItPkxlbik7CisJfQorCisgICAgcmV0dXJuIFRSVUU7Cit9CisKK0JPT0xFQU4gUGVlckRsc1JzcFNhbml0eSgKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBWT0lEICpNc2csCisgICAgSU4gVUxPTkcgTXNnTGVuLAorICAgIE9VVCBQVUNIQVIgcERBLAorICAgIE9VVCBQVUNIQVIgcFNBLAorICAgIE9VVCBVU0hPUlQgKnBDYXBhYmlsaXR5SW5mbywKKyAgICBPVVQgVVNIT1JUICpwU3RhdHVzLAorICAgIE9VVCBVQ0hBUiAqcFJhdGVzTGVuLAorICAgIE9VVCBVQ0hBUiBSYXRlc1tdLAorICAgIE9VVCBVQ0hBUiAqcEh0Q2FwYWJpbGl0eUxlbiwKKyAgICBPVVQgSFRfQ0FQQUJJTElUWV9JRSAqcEh0Q2FwYWJpbGl0eSkKK3sKKyAgICBDSEFSICAgICAgICAgICAgKlB0cjsKKyAgICBQRlJBTUVfODAyXzExCUZyID0gKFBGUkFNRV84MDJfMTEpTXNnOworCVBFSURfU1RSVUNUICBlaWRfcHRyOworCisgICAgLy8gdG8gcHJldmVudCBjYWxsZXIgZnJvbSB1c2luZyBnYXJiYWdlIG91dHB1dCB2YWx1ZQorICAgICpwU3RhdHVzCQk9IDA7CisgICAgKnBDYXBhYmlsaXR5SW5mbwk9IDA7CisJKnBIdENhcGFiaWxpdHlMZW4gPSAwOworCisgICAgUHRyID0gRnItPk9jdGV0OworCisJLy8gb2Zmc2V0IHRvIGRlc3RpbmF0aW9uIE1BQyBhZGRyZXNzIChDYXRlZ29yeSBhbmQgQWN0aW9uIGZpZWxkKQorICAgIFB0ciArPSAyOworCisJLy8gZ2V0IHN0YXR1cyBjb2RlIGZyb20gcGF5bG9hZCBhbmQgYWR2YW5jZSB0aGUgcG9pbnRlcgorICAgIE5kaXNNb3ZlTWVtb3J5KHBTdGF0dXMsIFB0ciwgMik7CisgICAgUHRyICs9IDI7CisKKyAgICAvLyBnZXQgREEgZnJvbSBwYXlsb2FkIGFuZCBhZHZhbmNlIHRoZSBwb2ludGVyCisgICAgTmRpc01vdmVNZW1vcnkocERBLCBQdHIsIE1BQ19BRERSX0xFTik7CisgICAgUHRyICs9IE1BQ19BRERSX0xFTjsKKworICAgIC8vIGdldCBTQSBmcm9tIHBheWxvYWQgYW5kIGFkdmFuY2UgdGhlIHBvaW50ZXIKKyAgICBOZGlzTW92ZU1lbW9yeShwU0EsIFB0ciwgTUFDX0FERFJfTEVOKTsKKyAgICBQdHIgKz0gTUFDX0FERFJfTEVOOworCisJaWYgKHBTdGF0dXMgPT0gMCkKKwl7CisJICAgIC8vIGdldCBjYXBhYmlsaXR5IGluZm8gZnJvbSBwYXlsb2FkIGFuZCBhZHZhbmNlIHRoZSBwb2ludGVyCisJICAgIE5kaXNNb3ZlTWVtb3J5KHBDYXBhYmlsaXR5SW5mbywgUHRyLCAyKTsKKwkgICAgUHRyICs9IDI7CisJfQorCisJLy8gQ2F0ZWdvcnkgYW5kIEFjdGlvbiBmaWVsZCArIHN0YXR1cyBjb2RlICsgREEgKyBTQSArIGNhcGFiaWxpdHkKKwllaWRfcHRyID0gKFBFSURfU1RSVUNUKSAmRnItPk9jdGV0WzE4XTsKKworCXdoaWxlICgoKFVDSEFSKillaWRfcHRyICsgZWlkX3B0ci0+TGVuICsgMSkgPCAoKFVDSEFSKilGciArIE1zZ0xlbikpCisJeworCQlzd2l0Y2goZWlkX3B0ci0+RWlkKQorCQl7CisJCQljYXNlIElFX1NVUFBfUkFURVM6CisgICAgICAgICAgICAgICAgaWYgKChlaWRfcHRyLT5MZW4gPD0gTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVMpICYmIChlaWRfcHRyLT5MZW4gPiAwKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KFJhdGVzLCBlaWRfcHRyLT5PY3RldCwgZWlkX3B0ci0+TGVuKTsKKyAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGVlckRsc1JzcFNhbml0eSAtIElFX1NVUFBfUkFURVMuLCBMZW49JWQuIFJhdGVzWzBdPSV4XG4iLGVpZF9wdHItPkxlbiwgUmF0ZXNbMF0pKTsKKyAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmF0ZXNbMV09JXggJXggJXggJXggJXggJXggJXhcbiIsIFJhdGVzWzFdLCBSYXRlc1syXSwgUmF0ZXNbM10sIFJhdGVzWzRdLCBSYXRlc1s1XSwgUmF0ZXNbNl0sIFJhdGVzWzddKSk7CisgICAgICAgICAgICAgICAgICAgICpwUmF0ZXNMZW4gPSBlaWRfcHRyLT5MZW47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICpwUmF0ZXNMZW4gPSA4OworCQkJCQlSYXRlc1swXSA9IDB4ODI7CisJCQkJCVJhdGVzWzFdID0gMHg4NDsKKwkJCQkJUmF0ZXNbMl0gPSAweDhiOworCQkJCQlSYXRlc1szXSA9IDB4OTY7CisJCQkJCVJhdGVzWzRdID0gMHgxMjsKKwkJCQkJUmF0ZXNbNV0gPSAweDI0OworCQkJCQlSYXRlc1s2XSA9IDB4NDg7CisJCQkJCVJhdGVzWzddID0gMHg2YzsKKyAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGVlckRsc1JzcFNhbml0eSAtIHdyb25nIElFX1NVUFBfUkFURVMuLCBMZW49JWRcbiIsZWlkX3B0ci0+TGVuKSk7CisgICAgICAgICAgICAgICAgfQorCQkJCWJyZWFrOworCisJCQljYXNlIElFX0VYVF9TVVBQX1JBVEVTOgorICAgICAgICAgICAgICAgIGlmIChlaWRfcHRyLT5MZW4gKyAqcFJhdGVzTGVuIDw9IE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkoJlJhdGVzWypwUmF0ZXNMZW5dLCBlaWRfcHRyLT5PY3RldCwgZWlkX3B0ci0+TGVuKTsKKyAgICAgICAgICAgICAgICAgICAgKnBSYXRlc0xlbiA9ICgqcFJhdGVzTGVuKSArIGVpZF9wdHItPkxlbjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkoJlJhdGVzWypwUmF0ZXNMZW5dLCBlaWRfcHRyLT5PY3RldCwgTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVMgLSAoKnBSYXRlc0xlbikpOworICAgICAgICAgICAgICAgICAgICAqcFJhdGVzTGVuID0gTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVM7CisgICAgICAgICAgICAgICAgfQorCQkJCWJyZWFrOworCisJCQljYXNlIElFX0hUX0NBUDoKKwkJCQlpZiAoZWlkX3B0ci0+TGVuID49IHNpemVvZihIVF9DQVBBQklMSVRZX0lFKSkKKwkJCQl7CisJCQkJCU5kaXNNb3ZlTWVtb3J5KHBIdENhcGFiaWxpdHksIGVpZF9wdHItPk9jdGV0LCBzaXplb2YoSFRfQ0FQQUJJTElUWV9JRSkpOworCisJCQkJCSooVVNIT1JUICopKCZwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8pID0gY3B1MmxlMTYoKihVU0hPUlQgKikoJnBIdENhcGFiaWxpdHktPkh0Q2FwSW5mbykpOworCQkJCQkqKFVTSE9SVCAqKSgmcEh0Q2FwYWJpbGl0eS0+RXh0SHRDYXBJbmZvKSA9IGNwdTJsZTE2KCooVVNIT1JUICopKCZwSHRDYXBhYmlsaXR5LT5FeHRIdENhcEluZm8pKTsKKwkJCQkJKnBIdENhcGFiaWxpdHlMZW4gPSBzaXplb2YoSFRfQ0FQQUJJTElUWV9JRSk7CisKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGVlckRsc1JzcFNhbml0eSAtIElFX0hUX0NBUFxuIikpOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyRGxzUnNwU2FuaXR5IC0gd3JvbmcgSUVfSFRfQ0FQLmVpZF9wdHItPkxlbiA9ICVkXG4iLCBlaWRfcHRyLT5MZW4pKTsKKwkJCQl9CisJCQkJYnJlYWs7CisKKwkJCWRlZmF1bHQ6CisJCQkJYnJlYWs7CisJCX0KKworCQllaWRfcHRyID0gKFBFSURfU1RSVUNUKSgoVUNIQVIqKWVpZF9wdHIgKyAyICsgZWlkX3B0ci0+TGVuKTsKKwl9CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworQk9PTEVBTiBQZWVyRGxzVGVhckRvd25TYW5pdHkoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gVk9JRCAqTXNnLAorICAgIElOIFVMT05HIE1zZ0xlbiwKKyAgICBPVVQgUFVDSEFSIHBEQSwKKyAgICBPVVQgUFVDSEFSIHBTQSwKKyAgICBPVVQgVVNIT1JUICpwUmVhc29uKQoreworICAgIENIQVIgICAgICAgICAgICAqUHRyOworICAgIFBGUkFNRV84MDJfMTEJRnIgPSAoUEZSQU1FXzgwMl8xMSlNc2c7CisKKyAgICAvLyB0byBwcmV2ZW50IGNhbGxlciBmcm9tIHVzaW5nIGdhcmJhZ2Ugb3V0cHV0IHZhbHVlCisgICAgKnBSZWFzb24JPSAwOworCisgICAgUHRyID0gRnItPk9jdGV0OworCisJLy8gb2Zmc2V0IHRvIGRlc3RpbmF0aW9uIE1BQyBhZGRyZXNzIChDYXRlZ29yeSBhbmQgQWN0aW9uIGZpZWxkKQorICAgIFB0ciArPSAyOworCisgICAgLy8gZ2V0IERBIGZyb20gcGF5bG9hZCBhbmQgYWR2YW5jZSB0aGUgcG9pbnRlcgorICAgIE5kaXNNb3ZlTWVtb3J5KHBEQSwgUHRyLCBNQUNfQUREUl9MRU4pOworICAgIFB0ciArPSBNQUNfQUREUl9MRU47CisKKyAgICAvLyBnZXQgU0EgZnJvbSBwYXlsb2FkIGFuZCBhZHZhbmNlIHRoZSBwb2ludGVyCisgICAgTmRpc01vdmVNZW1vcnkocFNBLCBQdHIsIE1BQ19BRERSX0xFTik7CisgICAgUHRyICs9IE1BQ19BRERSX0xFTjsKKworCS8vIGdldCByZWFzb24gY29kZSBmcm9tIHBheWxvYWQgYW5kIGFkdmFuY2UgdGhlIHBvaW50ZXIKKyAgICBOZGlzTW92ZU1lbW9yeShwUmVhc29uLCBQdHIsIDIpOworICAgIFB0ciArPSAyOworCisgICAgcmV0dXJuIFRSVUU7Cit9CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL2NtbV9zeW5jLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9jbW1fc3luYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiZTdjNzcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9jbW1fc3luYy5jCkBAIC0wLDAgKzEsNzExIEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCU1vZHVsZSBOYW1lOgorCXN5bmMuYworCisJQWJzdHJhY3Q6CisKKwlSZXZpc2lvbiBIaXN0b3J5OgorCVdobwkJCVdoZW4JCQlXaGF0CisJLS0tLS0tLS0JLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCUpvaG4gQ2hhbmcJMjAwNC0wOS0wMSAgICAgIG1vZGlmaWVkIGZvciBydDI1NjEvMjY2MQorKi8KKyNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKKworLy8gMi40IEdoeiBjaGFubmVsIHBsYW4gaW5kZXggaW4gdGhlIFR4UG93ZXIgYXJyYXlzLgorI2RlZmluZQlCR19CQU5EX1JFR0lPTl8wX1NUQVJUCTAJCQkvLyAxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMQorI2RlZmluZQlCR19CQU5EX1JFR0lPTl8wX1NJWkUJMTEKKyNkZWZpbmUJQkdfQkFORF9SRUdJT05fMV9TVEFSVAkwCQkJLy8gMSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIsMTMKKyNkZWZpbmUJQkdfQkFORF9SRUdJT05fMV9TSVpFCTEzCisjZGVmaW5lCUJHX0JBTkRfUkVHSU9OXzJfU1RBUlQJOQkJCS8vIDEwLDExCisjZGVmaW5lCUJHX0JBTkRfUkVHSU9OXzJfU0laRQkyCisjZGVmaW5lCUJHX0JBTkRfUkVHSU9OXzNfU1RBUlQJOQkJCS8vIDEwLDExLDEyLDEzCisjZGVmaW5lCUJHX0JBTkRfUkVHSU9OXzNfU0laRQk0CisjZGVmaW5lCUJHX0JBTkRfUkVHSU9OXzRfU1RBUlQJMTMJCQkvLyAxNAorI2RlZmluZQlCR19CQU5EX1JFR0lPTl80X1NJWkUJMQorI2RlZmluZQlCR19CQU5EX1JFR0lPTl81X1NUQVJUCTAJCQkvLyAxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNAorI2RlZmluZQlCR19CQU5EX1JFR0lPTl81X1NJWkUJMTQKKyNkZWZpbmUJQkdfQkFORF9SRUdJT05fNl9TVEFSVAkyCQkJLy8gMyw0LDUsNiw3LDgsOQorI2RlZmluZQlCR19CQU5EX1JFR0lPTl82X1NJWkUJNworI2RlZmluZQlCR19CQU5EX1JFR0lPTl83X1NUQVJUCTQJCQkvLyA1LDYsNyw4LDksMTAsMTEsMTIsMTMKKyNkZWZpbmUJQkdfQkFORF9SRUdJT05fN19TSVpFCTkKKyNkZWZpbmUJQkdfQkFORF9SRUdJT05fMzFfU1RBUlQJMAkJCS8vIDEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyLDEzLDE0CisjZGVmaW5lCUJHX0JBTkRfUkVHSU9OXzMxX1NJWkUJMTQKKworLy8gNSBHaHogY2hhbm5lbCBwbGFuIGluZGV4IGluIHRoZSBUeFBvd2VyIGFycmF5cy4KK1VDSEFSIEFfQkFORF9SRUdJT05fMF9DSEFOTkVMX0xJU1RbXT17MzYsIDQwLCA0NCwgNDgsIDUyLCA1NiwgNjAsIDY0LCAxNDksIDE1MywgMTU3LCAxNjEsIDE2NX07CitVQ0hBUiBBX0JBTkRfUkVHSU9OXzFfQ0hBTk5FTF9MSVNUW109ezM2LCA0MCwgNDQsIDQ4LCA1MiwgNTYsIDYwLCA2NCwgMTAwLCAxMDQsIDEwOCwgMTEyLCAxMTYsIDEyMCwgMTI0LCAxMjgsIDEzMiwgMTM2LCAxNDB9OworVUNIQVIgQV9CQU5EX1JFR0lPTl8yX0NIQU5ORUxfTElTVFtdPXszNiwgNDAsIDQ0LCA0OCwgNTIsIDU2LCA2MCwgNjR9OworVUNIQVIgQV9CQU5EX1JFR0lPTl8zX0NIQU5ORUxfTElTVFtdPXs1MiwgNTYsIDYwLCA2NCwgMTQ5LCAxNTMsIDE1NywgMTYxfTsKK1VDSEFSIEFfQkFORF9SRUdJT05fNF9DSEFOTkVMX0xJU1RbXT17MTQ5LCAxNTMsIDE1NywgMTYxLCAxNjV9OworVUNIQVIgQV9CQU5EX1JFR0lPTl81X0NIQU5ORUxfTElTVFtdPXsxNDksIDE1MywgMTU3LCAxNjF9OworVUNIQVIgQV9CQU5EX1JFR0lPTl82X0NIQU5ORUxfTElTVFtdPXszNiwgNDAsIDQ0LCA0OH07CitVQ0hBUiBBX0JBTkRfUkVHSU9OXzdfQ0hBTk5FTF9MSVNUW109ezM2LCA0MCwgNDQsIDQ4LCA1MiwgNTYsIDYwLCA2NCwgMTAwLCAxMDQsIDEwOCwgMTEyLCAxMTYsIDEyMCwgMTI0LCAxMjgsIDEzMiwgMTM2LCAxNDAsIDE0OSwgMTUzLCAxNTcsIDE2MSwgMTY1fTsKK1VDSEFSIEFfQkFORF9SRUdJT05fOF9DSEFOTkVMX0xJU1RbXT17NTIsIDU2LCA2MCwgNjR9OworVUNIQVIgQV9CQU5EX1JFR0lPTl85X0NIQU5ORUxfTElTVFtdPXszNiwgNDAsIDQ0LCA0OCwgNTIsIDU2LCA2MCwgNjQsIDEwMCwgMTA0LCAxMDgsIDExMiwgMTE2LCAxMzIsIDEzNiwgMTQwLCAxNDksIDE1MywgMTU3LCAxNjEsIDE2NX07CitVQ0hBUiBBX0JBTkRfUkVHSU9OXzEwX0NIQU5ORUxfTElTVFtdPXszNiwgNDAsIDQ0LCA0OCwgMTQ5LCAxNTMsIDE1NywgMTYxLCAxNjV9OworVUNIQVIgQV9CQU5EX1JFR0lPTl8xMV9DSEFOTkVMX0xJU1RbXT17MzYsIDQwLCA0NCwgNDgsIDUyLCA1NiwgNjAsIDY0LCAxMDAsIDEwNCwgMTA4LCAxMTIsIDExNiwgMTIwLCAxNDksIDE1MywgMTU3LCAxNjF9OworCisvL0JhU2l6ZUFycmF5IGZvbGxvd3MgdGhlIDgwMi4xMW4gZGVmaW5pdGlvbiBhcyBNYXhSeEZhY3Rvci4gIDJeKDEzK2ZhY3RvcikgYnl0ZXMuIFdoZW4gZmFjdG9yID0wLCBpdCdzIGFib3V0IEJhIGJ1ZmZlciBzaXplID04LgorVUNIQVIgQmFTaXplQXJyYXlbNF0gPSB7OCwxNiwzMiw2NH07CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJVXBkYXRlIFN0YUNmZy0+Q2hhbm5lbExpc3RbXSBhY2NvcmRpbmcgdG8gMSkgQ291bnRyeSBSZWdpb24gMikgUkYgSUMgdHlwZSwKKwkJYW5kIDMpIFBIWS1tb2RlIHVzZXIgc2VsZWN0ZWQuCisJCVRoZSBvdXRjb21lIGlzIHVzZWQgYnkgZHJpdmVyIHdoZW4gZG9pbmcgc2l0ZSBzdXJ2ZXkuCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBCdWlsZENoYW5uZWxMaXN0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCVVDSEFSIGksIGosIGluZGV4PTAsIG51bT0wOworCVBVQ0hBUglwQ2hhbm5lbExpc3QgPSBOVUxMOworCisJTmRpc1plcm9NZW1vcnkocEFkLT5DaGFubmVsTGlzdCwgTUFYX05VTV9PRl9DSEFOTkVMUyAqIHNpemVvZihDSEFOTkVMX1RYX1BPV0VSKSk7CisKKwkvLyBpZiBub3QgMTFhLW9ubHkgbW9kZSwgY2hhbm5lbCBsaXN0IHN0YXJ0cyBmcm9tIDIuNEdoeiBiYW5kCisJaWYgKChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlICE9IFBIWV8xMUEpCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCSYmIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlICE9IFBIWV8xMUFOX01JWEVEKSAmJiAocEFkLT5Db21tb25DZmcuUGh5TW9kZSAhPSBQSFlfMTFOXzVHKQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCSkKKwl7CisJCXN3aXRjaCAocEFkLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbiAgJiAweDdmKQorCQl7CisJCQljYXNlIFJFR0lPTl8wX0JHX0JBTkQ6CS8vIDEgLTExCisJCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+Q2hhbm5lbExpc3RbaW5kZXhdLCAmcEFkLT5UeFBvd2VyW0JHX0JBTkRfUkVHSU9OXzBfU1RBUlRdLCBzaXplb2YoQ0hBTk5FTF9UWF9QT1dFUikgKiBCR19CQU5EX1JFR0lPTl8wX1NJWkUpOworCQkJCWluZGV4ICs9IEJHX0JBTkRfUkVHSU9OXzBfU0laRTsKKwkJCQlicmVhazsKKwkJCWNhc2UgUkVHSU9OXzFfQkdfQkFORDoJLy8gMSAtIDEzCisJCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+Q2hhbm5lbExpc3RbaW5kZXhdLCAmcEFkLT5UeFBvd2VyW0JHX0JBTkRfUkVHSU9OXzFfU1RBUlRdLCBzaXplb2YoQ0hBTk5FTF9UWF9QT1dFUikgKiBCR19CQU5EX1JFR0lPTl8xX1NJWkUpOworCQkJCWluZGV4ICs9IEJHX0JBTkRfUkVHSU9OXzFfU0laRTsKKwkJCQlicmVhazsKKwkJCWNhc2UgUkVHSU9OXzJfQkdfQkFORDoJLy8gMTAgLSAxMQorCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPkNoYW5uZWxMaXN0W2luZGV4XSwgJnBBZC0+VHhQb3dlcltCR19CQU5EX1JFR0lPTl8yX1NUQVJUXSwgc2l6ZW9mKENIQU5ORUxfVFhfUE9XRVIpICogQkdfQkFORF9SRUdJT05fMl9TSVpFKTsKKwkJCQlpbmRleCArPSBCR19CQU5EX1JFR0lPTl8yX1NJWkU7CisJCQkJYnJlYWs7CisJCQljYXNlIFJFR0lPTl8zX0JHX0JBTkQ6CS8vIDEwIC0gMTMKKwkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5DaGFubmVsTGlzdFtpbmRleF0sICZwQWQtPlR4UG93ZXJbQkdfQkFORF9SRUdJT05fM19TVEFSVF0sIHNpemVvZihDSEFOTkVMX1RYX1BPV0VSKSAqIEJHX0JBTkRfUkVHSU9OXzNfU0laRSk7CisJCQkJaW5kZXggKz0gQkdfQkFORF9SRUdJT05fM19TSVpFOworCQkJCWJyZWFrOworCQkJY2FzZSBSRUdJT05fNF9CR19CQU5EOgkvLyAxNAorCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPkNoYW5uZWxMaXN0W2luZGV4XSwgJnBBZC0+VHhQb3dlcltCR19CQU5EX1JFR0lPTl80X1NUQVJUXSwgc2l6ZW9mKENIQU5ORUxfVFhfUE9XRVIpICogQkdfQkFORF9SRUdJT05fNF9TSVpFKTsKKwkJCQlpbmRleCArPSBCR19CQU5EX1JFR0lPTl80X1NJWkU7CisJCQkJYnJlYWs7CisJCQljYXNlIFJFR0lPTl81X0JHX0JBTkQ6CS8vIDEgLSAxNAorCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPkNoYW5uZWxMaXN0W2luZGV4XSwgJnBBZC0+VHhQb3dlcltCR19CQU5EX1JFR0lPTl81X1NUQVJUXSwgc2l6ZW9mKENIQU5ORUxfVFhfUE9XRVIpICogQkdfQkFORF9SRUdJT05fNV9TSVpFKTsKKwkJCQlpbmRleCArPSBCR19CQU5EX1JFR0lPTl81X1NJWkU7CisJCQkJYnJlYWs7CisJCQljYXNlIFJFR0lPTl82X0JHX0JBTkQ6CS8vIDMgLSA5CisJCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+Q2hhbm5lbExpc3RbaW5kZXhdLCAmcEFkLT5UeFBvd2VyW0JHX0JBTkRfUkVHSU9OXzZfU1RBUlRdLCBzaXplb2YoQ0hBTk5FTF9UWF9QT1dFUikgKiBCR19CQU5EX1JFR0lPTl82X1NJWkUpOworCQkJCWluZGV4ICs9IEJHX0JBTkRfUkVHSU9OXzZfU0laRTsKKwkJCQlicmVhazsKKwkJCWNhc2UgUkVHSU9OXzdfQkdfQkFORDogIC8vIDUgLSAxMworCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPkNoYW5uZWxMaXN0W2luZGV4XSwgJnBBZC0+VHhQb3dlcltCR19CQU5EX1JFR0lPTl83X1NUQVJUXSwgc2l6ZW9mKENIQU5ORUxfVFhfUE9XRVIpICogQkdfQkFORF9SRUdJT05fN19TSVpFKTsKKwkJCQlpbmRleCArPSBCR19CQU5EX1JFR0lPTl83X1NJWkU7CisJCQkJYnJlYWs7CisJCQljYXNlIFJFR0lPTl8zMV9CR19CQU5EOgkvLyAxIC0gMTQKKwkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5DaGFubmVsTGlzdFtpbmRleF0sICZwQWQtPlR4UG93ZXJbQkdfQkFORF9SRUdJT05fMzFfU1RBUlRdLCBzaXplb2YoQ0hBTk5FTF9UWF9QT1dFUikgKiBCR19CQU5EX1JFR0lPTl8zMV9TSVpFKTsKKwkJCQlpbmRleCArPSBCR19CQU5EX1JFR0lPTl8zMV9TSVpFOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDogICAgICAgICAgICAvLyBFcnJvci4gc2hvdWxkIG5ldmVyIGhhcHBlbgorCQkJCWJyZWFrOworCQl9CisJCWZvciAoaT0wOyBpPGluZGV4OyBpKyspCisJCQlwQWQtPkNoYW5uZWxMaXN0W2ldLk1heFR4UHdyID0gMjA7CisJfQorCisJaWYgKChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUEpIHx8IChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUFCR19NSVhFRCkKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJfHwgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQUJHTl9NSVhFRCkgfHwgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQU5fTUlYRUQpCisJCXx8IChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUFHTl9NSVhFRCkgfHwgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExTl81RykKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkpCisJeworCQlzd2l0Y2ggKHBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb25Gb3JBQmFuZCAmIDB4N2YpCisJCXsKKwkJCWNhc2UgUkVHSU9OXzBfQV9CQU5EOgorCQkJCW51bSA9IHNpemVvZihBX0JBTkRfUkVHSU9OXzBfQ0hBTk5FTF9MSVNUKS9zaXplb2YoVUNIQVIpOworCQkJCXBDaGFubmVsTGlzdCA9IEFfQkFORF9SRUdJT05fMF9DSEFOTkVMX0xJU1Q7CisJCQkJYnJlYWs7CisJCQljYXNlIFJFR0lPTl8xX0FfQkFORDoKKwkJCQludW0gPSBzaXplb2YoQV9CQU5EX1JFR0lPTl8xX0NIQU5ORUxfTElTVCkvc2l6ZW9mKFVDSEFSKTsKKwkJCQlwQ2hhbm5lbExpc3QgPSBBX0JBTkRfUkVHSU9OXzFfQ0hBTk5FTF9MSVNUOworCQkJCWJyZWFrOworCQkJY2FzZSBSRUdJT05fMl9BX0JBTkQ6CisJCQkJbnVtID0gc2l6ZW9mKEFfQkFORF9SRUdJT05fMl9DSEFOTkVMX0xJU1QpL3NpemVvZihVQ0hBUik7CisJCQkJcENoYW5uZWxMaXN0ID0gQV9CQU5EX1JFR0lPTl8yX0NIQU5ORUxfTElTVDsKKwkJCQlicmVhazsKKwkJCWNhc2UgUkVHSU9OXzNfQV9CQU5EOgorCQkJCW51bSA9IHNpemVvZihBX0JBTkRfUkVHSU9OXzNfQ0hBTk5FTF9MSVNUKS9zaXplb2YoVUNIQVIpOworCQkJCXBDaGFubmVsTGlzdCA9IEFfQkFORF9SRUdJT05fM19DSEFOTkVMX0xJU1Q7CisJCQkJYnJlYWs7CisJCQljYXNlIFJFR0lPTl80X0FfQkFORDoKKwkJCQludW0gPSBzaXplb2YoQV9CQU5EX1JFR0lPTl80X0NIQU5ORUxfTElTVCkvc2l6ZW9mKFVDSEFSKTsKKwkJCQlwQ2hhbm5lbExpc3QgPSBBX0JBTkRfUkVHSU9OXzRfQ0hBTk5FTF9MSVNUOworCQkJCWJyZWFrOworCQkJY2FzZSBSRUdJT05fNV9BX0JBTkQ6CisJCQkJbnVtID0gc2l6ZW9mKEFfQkFORF9SRUdJT05fNV9DSEFOTkVMX0xJU1QpL3NpemVvZihVQ0hBUik7CisJCQkJcENoYW5uZWxMaXN0ID0gQV9CQU5EX1JFR0lPTl81X0NIQU5ORUxfTElTVDsKKwkJCQlicmVhazsKKwkJCWNhc2UgUkVHSU9OXzZfQV9CQU5EOgorCQkJCW51bSA9IHNpemVvZihBX0JBTkRfUkVHSU9OXzZfQ0hBTk5FTF9MSVNUKS9zaXplb2YoVUNIQVIpOworCQkJCXBDaGFubmVsTGlzdCA9IEFfQkFORF9SRUdJT05fNl9DSEFOTkVMX0xJU1Q7CisJCQkJYnJlYWs7CisJCQljYXNlIFJFR0lPTl83X0FfQkFORDoKKwkJCQludW0gPSBzaXplb2YoQV9CQU5EX1JFR0lPTl83X0NIQU5ORUxfTElTVCkvc2l6ZW9mKFVDSEFSKTsKKwkJCQlwQ2hhbm5lbExpc3QgPSBBX0JBTkRfUkVHSU9OXzdfQ0hBTk5FTF9MSVNUOworCQkJCWJyZWFrOworCQkJY2FzZSBSRUdJT05fOF9BX0JBTkQ6CisJCQkJbnVtID0gc2l6ZW9mKEFfQkFORF9SRUdJT05fOF9DSEFOTkVMX0xJU1QpL3NpemVvZihVQ0hBUik7CisJCQkJcENoYW5uZWxMaXN0ID0gQV9CQU5EX1JFR0lPTl84X0NIQU5ORUxfTElTVDsKKwkJCQlicmVhazsKKwkJCWNhc2UgUkVHSU9OXzlfQV9CQU5EOgorCQkJCW51bSA9IHNpemVvZihBX0JBTkRfUkVHSU9OXzlfQ0hBTk5FTF9MSVNUKS9zaXplb2YoVUNIQVIpOworCQkJCXBDaGFubmVsTGlzdCA9IEFfQkFORF9SRUdJT05fOV9DSEFOTkVMX0xJU1Q7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgUkVHSU9OXzEwX0FfQkFORDoKKwkJCQludW0gPSBzaXplb2YoQV9CQU5EX1JFR0lPTl8xMF9DSEFOTkVMX0xJU1QpL3NpemVvZihVQ0hBUik7CisJCQkJcENoYW5uZWxMaXN0ID0gQV9CQU5EX1JFR0lPTl8xMF9DSEFOTkVMX0xJU1Q7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgUkVHSU9OXzExX0FfQkFORDoKKwkJCQludW0gPSBzaXplb2YoQV9CQU5EX1JFR0lPTl8xMV9DSEFOTkVMX0xJU1QpL3NpemVvZihVQ0hBUik7CisJCQkJcENoYW5uZWxMaXN0ID0gQV9CQU5EX1JFR0lPTl8xMV9DSEFOTkVMX0xJU1Q7CisJCQkJYnJlYWs7CisKKwkJCWRlZmF1bHQ6ICAgICAgICAgICAgLy8gRXJyb3IuIHNob3VsZCBuZXZlciBoYXBwZW4KKwkJCQlEQkdQUklOVChSVF9ERUJVR19XQVJOLCgiY291bnRyeXJlZ2lvbj0lZCBub3Qgc3VwcG9ydCIsIHBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb25Gb3JBQmFuZCkpOworCQkJCWJyZWFrOworCQl9CisKKwkJaWYgKG51bSAhPSAwKQorCQl7CisJCQlVQ0hBUiBSYWRhckNoWzE1XT17NTIsIDU2LCA2MCwgNjQsIDEwMCwgMTA0LCAxMDgsIDExMiwgMTE2LCAxMjAsIDEyNCwgMTI4LCAxMzIsIDEzNiwgMTQwfTsKKwkJCWZvciAoaT0wOyBpPG51bTsgaSsrKQorCQkJeworCQkJCWZvciAoaj0wOyBqPE1BWF9OVU1fT0ZfQ0hBTk5FTFM7IGorKykKKwkJCQl7CisJCQkJCWlmIChwQ2hhbm5lbExpc3RbaV0gPT0gcEFkLT5UeFBvd2VyW2pdLkNoYW5uZWwpCisJCQkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5DaGFubmVsTGlzdFtpbmRleCtpXSwgJnBBZC0+VHhQb3dlcltqXSwgc2l6ZW9mKENIQU5ORUxfVFhfUE9XRVIpKTsKKwkJCQkJfQorCQkJCWZvciAoaj0wOyBqPDE1OyBqKyspCisJCQkJeworCQkJCQlpZiAocENoYW5uZWxMaXN0W2ldID09IFJhZGFyQ2hbal0pCisJCQkJCQlwQWQtPkNoYW5uZWxMaXN0W2luZGV4K2ldLkRmc1JlcSA9IFRSVUU7CisJCQkJfQorCQkJCXBBZC0+Q2hhbm5lbExpc3RbaW5kZXgraV0uTWF4VHhQd3IgPSAyMDsKKwkJCX0KKwkJCWluZGV4ICs9IG51bTsKKwkJfQorCX0KKworCXBBZC0+Q2hhbm5lbExpc3ROdW0gPSBpbmRleDsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoImNvdW50cnkgY29kZT0lZC8lZCwgUkZJQz0lZCwgUEhZIG1vZGU9JWQsIHN1cHBvcnQgJWQgY2hhbm5lbHNcbiIsCisJCXBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb24sIHBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb25Gb3JBQmFuZCwgcEFkLT5SZkljVHlwZSwgcEFkLT5Db21tb25DZmcuUGh5TW9kZSwgcEFkLT5DaGFubmVsTGlzdE51bSkpOworI2lmZGVmIERCRworCWZvciAoaT0wO2k8cEFkLT5DaGFubmVsTGlzdE51bTtpKyspCisJeworCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsKCJCdWlsZENoYW5uZWwgIyAlZCA6OiBQd3IwID0gJWQsIFB3cjEgPSVkLCBcbiAiLCBwQWQtPkNoYW5uZWxMaXN0W2ldLkNoYW5uZWwsIHBBZC0+Q2hhbm5lbExpc3RbaV0uUG93ZXIsIHBBZC0+Q2hhbm5lbExpc3RbaV0uUG93ZXIyKSk7CisJfQorI2VuZGlmCit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJVGhpcyByb3V0aW5lIHJldHVybiB0aGUgZmlyc3QgY2hhbm5lbCBudW1iZXIgYWNjb3JkaW5nIHRvIHRoZSBjb3VudHJ5CisJCWNvZGUgc2VsZWN0aW9uIGFuZCBSRiBJQyBzZWxlY3Rpb24gKHNpZ25hbCBiYW5kIG9yIGR1YWwgYmFuZCkuIEl0IGlzIGNhbGxlZAorCQl3aGVuZXZlciBkcml2ZXIgbmVlZCB0byBzdGFydCBhIHNpdGUgc3VydmV5IG9mIGFsbCBzdXBwb3J0ZWQgY2hhbm5lbHMuCisJUmV0dXJuOgorCQljaCAtIHRoZSBmaXJzdCBjaGFubmVsIG51bWJlciBvZiBjdXJyZW50IGNvdW50cnkgY29kZSBzZXR0aW5nCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVUNIQVIgRmlyc3RDaGFubmVsKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCXJldHVybiBwQWQtPkNoYW5uZWxMaXN0WzBdLkNoYW5uZWw7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJVGhpcyByb3V0aW5lIHJldHVybnMgdGhlIG5leHQgY2hhbm5lbCBudW1iZXIuIFRoaXMgcm91dGluZSBpcyBjYWxsZWQKKwkJZHVyaW5nIGRyaXZlciBuZWVkIHRvIHN0YXJ0IGEgc2l0ZSBzdXJ2ZXkgb2YgYWxsIHN1cHBvcnRlZCBjaGFubmVscy4KKwlSZXR1cm46CisJCW5leHRfY2hhbm5lbCAtIHRoZSBuZXh0IGNoYW5uZWwgbnVtYmVyIHZhbGlkIGluIGN1cnJlbnQgY291bnRyeSBjb2RlIHNldHRpbmcuCisJTm90ZToKKwkJcmV0dXJuIDAgaWYgbm8gbW9yZSBuZXh0IGNoYW5uZWwKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitVQ0hBUiBOZXh0Q2hhbm5lbCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVQ0hBUiBjaGFubmVsKQoreworCWludCBpOworCVVDSEFSIG5leHRfY2hhbm5lbCA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgKHBBZC0+Q2hhbm5lbExpc3ROdW0gLSAxKTsgaSsrKQorCQlpZiAoY2hhbm5lbCA9PSBwQWQtPkNoYW5uZWxMaXN0W2ldLkNoYW5uZWwpCisJCXsKKwkJCW5leHRfY2hhbm5lbCA9IHBBZC0+Q2hhbm5lbExpc3RbaSsxXS5DaGFubmVsOworCQkJYnJlYWs7CisJfQorCXJldHVybiBuZXh0X2NoYW5uZWw7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJVGhpcyByb3V0aW5lIGlzIGZvciBDaXNjbyBDb21wYXRpYmxlIEV4dGVuc2lvbnMgMi5YCisJCVNwZWMzMS4gQVAgQ29udHJvbCBvZiBDbGllbnQgVHJhbnNtaXQgUG93ZXIKKwlSZXR1cm46CisJCU5vbmUKKwlOb3RlOgorCSAgIFJlcXVpcmVkIGJ5IEFpcm9uZXQgZEJtKG1XKQorCQkgICAwZEJtKDFtVyksICAgMWRCbSg1bVcpLCAxM2RCbSgyMG1XKSwgMTVkQm0oMzBtVyksCisJCSAgMTdkQm0oNTBtdyksIDIwZEJtKDEwMG1XKQorCisJICAgV2Ugc3VwcG9ydGVkCisJCSAgIDNkQm0oTG93ZXN0KSwgNmRCbSgxMCUpLCA5ZEJtKDI1JSksIDEyZEJtKDUwJSksCisJCSAgMTRkQm0oNzUlKSwgICAxNWRCbSgxMDAlKQorCisJCVRoZSBjbGllbnQgc3RhdGlvbidzIGFjdHVhbCB0cmFuc21pdCBwb3dlciBzaGFsbCBiZSB3aXRoaW4gKy8tIDVkQiBvZgorCQl0aGUgbWluaW11bSB2YWx1ZSBvciBuZXh0IGxvd2VyIHZhbHVlLgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgQ2hhbmdlVG9DZWxsUG93ZXJMaW1pdCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVQ0hBUiAgICAgICAgIEFpcm9uZXRDZWxsUG93ZXJMaW1pdCkKK3sKKwkvL3ZhbHVkIDB4RkYgbWVhbnMgdGhhdCBoYXNuJ3QgZm91bmQgcG93ZXIgbGltaXQgaW5mb3JtYXRpb24KKwkvL2Zyb20gdGhlIEFQJ3MgQmVhY29uL1Byb2JlIHJlc3BvbnNlLgorCWlmIChBaXJvbmV0Q2VsbFBvd2VyTGltaXQgPT0gMHhGRikKKwkJcmV0dXJuOworCisJaWYgKEFpcm9uZXRDZWxsUG93ZXJMaW1pdCA8IDYpIC8vVXNlZCBMb3dlc3QgUG93ZXIgUGVyY2VudGFnZS4KKwkJcEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UgPSA2OworCWVsc2UgaWYgKEFpcm9uZXRDZWxsUG93ZXJMaW1pdCA8IDkpCisJCXBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID0gMTA7CisJZWxzZSBpZiAoQWlyb25ldENlbGxQb3dlckxpbWl0IDwgMTIpCisJCXBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID0gMjU7CisJZWxzZSBpZiAoQWlyb25ldENlbGxQb3dlckxpbWl0IDwgMTQpCisJCXBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID0gNTA7CisJZWxzZSBpZiAoQWlyb25ldENlbGxQb3dlckxpbWl0IDwgMTUpCisJCXBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID0gNzU7CisJZWxzZQorCQlwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA9IDEwMDsgLy9lbHNlIHVzZWQgbWF4aW11bQorCisJaWYgKHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID4gcEFkLT5Db21tb25DZmcuVHhQb3dlckRlZmF1bHQpCisJCXBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID0gcEFkLT5Db21tb25DZmcuVHhQb3dlckRlZmF1bHQ7CisKK30KKworQ0hBUglDb252ZXJ0VG9Sc3NpKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOCUNIQVIJCQlSc3NpLAorCUlOICBVQ0hBUiAgIFJzc2lOdW1iZXIpCit7CisJVUNIQVIJUnNzaU9mZnNldCwgTE5BR2FpbjsKKworCS8vIFJzc2kgZXF1YWxzIHRvIHplcm8gc2hvdWxkIGJlIGFuIGludmFsaWQgdmFsdWUKKwlpZiAoUnNzaSA9PSAwKQorCQlyZXR1cm4gLTk5OworCisJTE5BR2FpbiA9IEdFVF9MTkFfR0FJTihwQWQpOworICAgIGlmIChwQWQtPkxhdGNoUmZSZWdzLkNoYW5uZWwgPiAxNCkKKyAgICB7CisgICAgICAgIGlmIChSc3NpTnVtYmVyID09IDApCisJCQlSc3NpT2Zmc2V0ID0gcEFkLT5BUnNzaU9mZnNldDA7CisJCWVsc2UgaWYgKFJzc2lOdW1iZXIgPT0gMSkKKwkJCVJzc2lPZmZzZXQgPSBwQWQtPkFSc3NpT2Zmc2V0MTsKKwkJZWxzZQorCQkJUnNzaU9mZnNldCA9IHBBZC0+QVJzc2lPZmZzZXQyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpZiAoUnNzaU51bWJlciA9PSAwKQorCQkJUnNzaU9mZnNldCA9IHBBZC0+QkdSc3NpT2Zmc2V0MDsKKwkJZWxzZSBpZiAoUnNzaU51bWJlciA9PSAxKQorCQkJUnNzaU9mZnNldCA9IHBBZC0+QkdSc3NpT2Zmc2V0MTsKKwkJZWxzZQorCQkJUnNzaU9mZnNldCA9IHBBZC0+QkdSc3NpT2Zmc2V0MjsKKyAgICB9CisKKyAgICByZXR1cm4gKC0xMiAtIFJzc2lPZmZzZXQgLSBMTkFHYWluIC0gUnNzaSk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJU2NhbiBuZXh0IGNoYW5uZWwKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIFNjYW5OZXh0Q2hhbm5lbCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlIRUFERVJfODAyXzExICAgSGRyODAyMTE7CisJUFVDSEFSICAgICAgICAgIHBPdXRCdWZmZXIgPSBOVUxMOworCU5ESVNfU1RBVFVTICAgICBOU3RhdHVzOworCVVMT05HICAgICAgICAgICBGcmFtZUxlbiA9IDA7CisJVUNIQVIgICAgICAgICAgIFNzaWRMZW4gPSAwLCBTY2FuVHlwZSA9IHBBZC0+TWxtZUF1eC5TY2FuVHlwZSwgQkJQVmFsdWUgPSAwOworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCVVTSE9SVCAgICAgICAgICBTdGF0dXM7CisJUEhFQURFUl84MDJfMTEgIHBIZHI4MDIxMTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwlVSU5UCQkJU2NhblRpbWVJbjVnQ2hhbm5lbCA9IFNIT1JUX0NIQU5ORUxfVElNRTsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJeworCQlpZiAoTU9OSVRPUl9PTihwQWQpKQorCQkJcmV0dXJuOworCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworI2lmZGVmIFJBTElOS19BVEUKKwkvLyBOb3RoaW5nIHRvIGRvIGluIEFURSBtb2RlLgorCWlmIChBVEVfT04ocEFkKSkKKwkJcmV0dXJuOworI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKworCWlmIChwQWQtPk1sbWVBdXguQ2hhbm5lbCA9PSAwKQorCXsKKwkJaWYgKChwQWQtPkNvbW1vbkNmZy5CQlBDdXJyZW50QlcgPT0gQldfNDApCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCQkmJiAoSU5GUkFfT04ocEFkKQorCQkJCXx8IChwQWQtPk9wTW9kZSA9PSBPUE1PREVfQVApKQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCQkJKQorCQl7CisJCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsLCBGQUxTRSk7CisJCQlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCk7CisJCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsICZCQlBWYWx1ZSk7CisJCQlCQlBWYWx1ZSAmPSAofjB4MTgpOworCQkJQkJQVmFsdWUgfD0gMHgxMDsKKwkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsIEJCUFZhbHVlKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNZTkMgLSBFbmQgb2YgU0NBTiwgcmVzdG9yZSB0byA0ME1IeiBjaGFubmVsICVkLCBUb3RhbCBCU1NbJTAyZF1cbiIscEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwsIHBBZC0+U2NhblRhYi5Cc3NOcikpOworCQl9CisJCWVsc2UKKwkJeworCQkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsLCBGQUxTRSk7CisJCQlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNZTkMgLSBFbmQgb2YgU0NBTiwgcmVzdG9yZSB0byBjaGFubmVsICVkLCBUb3RhbCBCU1NbJTAyZF1cbiIscEFkLT5Db21tb25DZmcuQ2hhbm5lbCwgcEFkLT5TY2FuVGFiLkJzc05yKSk7CisJCX0KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQl7CisJCQkvLworCQkJLy8gVG8gcHJldmVudCBkYXRhIGxvc3QuCisJCQkvLyBTZW5kIGFuIE5VTEwgZGF0YSB3aXRoIHR1cm5lZCBQU00gYml0IG9uIHRvIGN1cnJlbnQgYXNzb2NpYXRlZCBBUCBiZWZvcmUgU0NBTiBwcm9ncmVzcy4KKwkJCS8vIE5vdywgd2UgbmVlZCB0byBzZW5kIGFuIE5VTEwgZGF0YSB3aXRoIHR1cm5lZCBQU00gYml0IG9mZiB0byBBUCwgd2hlbiBzY2FuIHByb2dyZXNzIGRvbmUKKwkJCS8vCisJCQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpICYmIChJTkZSQV9PTihwQWQpKSkKKwkJCXsKKwkJCQlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgKFBWT0lEKSZwT3V0QnVmZmVyKTsKKwkJCQlpZiAoTlN0YXR1cwk9PSBORElTX1NUQVRVU19TVUNDRVNTKQorCQkJCXsKKwkJCQkJcEhkcjgwMjExID0gKFBIRUFERVJfODAyXzExKSBwT3V0QnVmZmVyOworCQkJCQlNZ3RNYWNIZWFkZXJJbml0KHBBZCwgcEhkcjgwMjExLCBTVUJUWVBFX05VTExfRlVOQywgMSwgcEFkLT5Db21tb25DZmcuQnNzaWQsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKwkJCQkJcEhkcjgwMjExLT5EdXJhdGlvbiA9IDA7CisJCQkJCXBIZHI4MDIxMS0+RkMuVHlwZSA9IEJUWVBFX0RBVEE7CisJCQkJCXBIZHI4MDIxMS0+RkMuUHdyTWdtdCA9IChwQWQtPlN0YUNmZy5Qc20gPT0gUFdSX1NBVkUpOworCisJCQkJCS8vIFNlbmQgdXNpbmcgcHJpb3JpdHkgcXVldWUKKwkJCQkJTWluaXBvcnRNTVJlcXVlc3QocEFkLCAwLCBwT3V0QnVmZmVyLCBzaXplb2YoSEVBREVSXzgwMl8xMSkpOworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNbG1lU2NhblJlcUFjdGlvbiAtLSBTZW5kIFBTTSBEYXRhIGZyYW1lXG4iKSk7CisJCQkJCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7CisJCQkJCVJUTVB1c2VjRGVsYXkoNTAwMCk7CisJCQkJfQorCQkJfQorCisJCQlwQWQtPk1sbWUuU3luY01hY2hpbmUuQ3VyclN0YXRlID0gU1lOQ19JRExFOworCQkJU3RhdHVzID0gTUxNRV9TVUNDRVNTOworCQkJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX1NDQU5fQ09ORiwgMiwgJlN0YXR1cyk7CisJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCisJCVJUTVBfQ0xFQVJfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpOworCX0KKyNpZmRlZiBSVDI4NzAKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwllbHNlIGlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkgJiYgKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpKQorCXsKKwkJcEFkLT5NbG1lLlN5bmNNYWNoaW5lLkN1cnJTdGF0ZSA9IFNZTkNfSURMRTsKKwkJTWxtZUNudGxDb25maXJtKHBBZCwgTVQyX1NDQU5fQ09ORiwgTUxNRV9GQUlMX05PX1JFU09VUkNFKTsKKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisjZW5kaWYgLy8gUlQyODcwIC8vCisJZWxzZQorCXsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJeworCQkvLyBCQlAgYW5kIFJGIGFyZSBub3QgYWNjZXNzaWJsZSBpbiBQUyBtb2RlLCB3ZSBoYXMgdG8gd2FrZSB0aGVtIHVwIGZpcnN0CisJCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0RPWkUpKQorCQkJQXNpY0ZvcmNlV2FrZXVwKHBBZCwgVFJVRSk7CisKKwkJCS8vIGxlYXZlIFBTTSBkdXJpbmcgc2Nhbm5pbmcuIG90aGVyd2lzZSB3ZSBtYXkgbG9zdCBQcm9iZVJzcCAmIEJFQUNPTgorCQkJaWYgKHBBZC0+U3RhQ2ZnLlBzbSA9PSBQV1JfU0FWRSkKKwkJCQlNbG1lU2V0UHNtQml0KHBBZCwgUFdSX0FDVElWRSk7CisJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBBZC0+TWxtZUF1eC5DaGFubmVsLCBUUlVFKTsKKwkJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5NbG1lQXV4LkNoYW5uZWwpOworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCXsKKwkJCWlmIChwQWQtPk1sbWVBdXguQ2hhbm5lbCA+IDE0KQorCQkJeworCQkJCWlmICgocEFkLT5Db21tb25DZmcuYklFRUU4MDIxMUggPT0gMSkgJiYgUmFkYXJDaGFubmVsQ2hlY2socEFkLCBwQWQtPk1sbWVBdXguQ2hhbm5lbCkpCisJCQkJeworCQkJCQlTY2FuVHlwZSA9IFNDQU5fUEFTU0lWRTsKKwkJCQkJU2NhblRpbWVJbjVnQ2hhbm5lbCA9IE1JTl9DSEFOTkVMX1RJTUU7CisJCQkJfQorCQkJfQorCisjaWZkZWYgQ0FSUklFUl9ERVRFQ1RJT05fU1VQUE9SVCAvLyBSb2dlciBzeW5jIENhcnJpZXIKKwkJCS8vIGNhcnJpZXIgZGV0ZWN0aW9uCisJCQlpZiAocEFkLT5Db21tb25DZmcuQ2FycmllckRldGVjdC5FbmFibGUgPT0gVFJVRSkKKwkJCXsKKwkJCQlTY2FuVHlwZSA9IFNDQU5fUEFTU0lWRTsKKwkJCQlTY2FuVGltZUluNWdDaGFubmVsID0gTUlOX0NIQU5ORUxfVElNRTsKKwkJCX0KKyNlbmRpZiAvLyBDQVJSSUVSX0RFVEVDVElPTl9TVVBQT1JUIC8vCisJCX0KKworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJCS8vR2xvYmFsIGNvdW50cnkgZG9tYWluKGNoMS0xMTphY3RpdmUgc2NhbiwgY2gxMi0xNCBwYXNzaXZlIHNjYW4pCisJCWlmICgocEFkLT5NbG1lQXV4LkNoYW5uZWwgPD0gMTQpICYmIChwQWQtPk1sbWVBdXguQ2hhbm5lbCA+PSAxMikgJiYgKChwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uICYgMHg3ZikgPT0gUkVHSU9OXzMxX0JHX0JBTkQpKQorCQl7CisJCQlTY2FuVHlwZSA9IFNDQU5fUEFTU0lWRTsKKwkJfQorCisJCS8vIFdlIG5lZWQgdG8gc2hvcnRlbiBhY3RpdmUgc2NhbiB0aW1lIGluIG9yZGVyIGZvciBXWkMgY29ubmVjdCBpc3N1ZQorCQkvLyBDaG5hZ2UgdGhlIGNoYW5uZWwgc2NhbiB0aW1lIGZvciBDSVNDTyBzdHVmZiBiYXNlZCBvbiBpdHMgSUFQUCBhbm5vdW5jZW1lbnQKKwkJaWYgKFNjYW5UeXBlID09IEZBU1RfU0NBTl9BQ1RJVkUpCisJCQlSVE1QU2V0VGltZXIoJnBBZC0+TWxtZUF1eC5TY2FuVGltZXIsIEZBU1RfQUNUSVZFX1NDQU5fVElNRSk7CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCWVsc2UgaWYgKCgoU2NhblR5cGUgPT0gU0NBTl9DSVNDT19BQ1RJVkUpIHx8CisJCQkJKFNjYW5UeXBlID09IFNDQU5fQ0lTQ09fUEFTU0lWRSkgfHwKKwkJCQkoU2NhblR5cGUgPT0gU0NBTl9DSVNDT19DSEFOTkVMX0xPQUQpIHx8CisJCQkJKFNjYW5UeXBlID09IFNDQU5fQ0lTQ09fTk9JU0UpKSAmJiAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkpCisJCXsKKwkJCWlmIChwQWQtPlN0YUNmZy5DQ1hTY2FuVGltZSA8IDI1KQorCQkJCVJUTVBTZXRUaW1lcigmcEFkLT5NbG1lQXV4LlNjYW5UaW1lciwgcEFkLT5TdGFDZmcuQ0NYU2NhblRpbWUgKiAyKTsKKwkJCWVsc2UKKwkJCQlSVE1QU2V0VGltZXIoJnBBZC0+TWxtZUF1eC5TY2FuVGltZXIsIHBBZC0+U3RhQ2ZnLkNDWFNjYW5UaW1lKTsKKwkJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCQllbHNlIC8vIG11c3QgYmUgU0NBTl9QQVNTSVZFIG9yIFNDQU5fQUNUSVZFCisJCXsKKwkJCWlmICgocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFBQkdfTUlYRUQpCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQkJfHwgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQUJHTl9NSVhFRCkgfHwgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQUdOX01JWEVEKQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQkJKQorCQkJeworCQkJCWlmIChwQWQtPk1sbWVBdXguQ2hhbm5lbCA+IDE0KQorCQkJCQlSVE1QU2V0VGltZXIoJnBBZC0+TWxtZUF1eC5TY2FuVGltZXIsIFNjYW5UaW1lSW41Z0NoYW5uZWwpOworCQkJCWVsc2UKKwkJCQlSVE1QU2V0VGltZXIoJnBBZC0+TWxtZUF1eC5TY2FuVGltZXIsIE1JTl9DSEFOTkVMX1RJTUUpOworCQkJfQorCQkJZWxzZQorCQkJCVJUTVBTZXRUaW1lcigmcEFkLT5NbG1lQXV4LlNjYW5UaW1lciwgTUFYX0NIQU5ORUxfVElNRSk7CisJCX0KKworCQlpZiAoKFNjYW5UeXBlID09IFNDQU5fQUNUSVZFKSB8fCAoU2NhblR5cGUgPT0gRkFTVF9TQ0FOX0FDVElWRSkgfHwKKwkJCShTY2FuVHlwZSA9PSBTQ0FOX0NJU0NPX0FDVElWRSkpCisJCXsKKwkJCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5CisJCQlpZiAoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCQkJeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNZTkMgLSBTY2FuTmV4dENoYW5uZWwoKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbFxuIikpOworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQkJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCQkJeworCQkJCQlwQWQtPk1sbWUuU3luY01hY2hpbmUuQ3VyclN0YXRlID0gU1lOQ19JRExFOworCQkJCQlTdGF0dXMgPSBNTE1FX0ZBSUxfTk9fUkVTT1VSQ0U7CisJCQkJCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9TQ0FOX0NPTkYsIDIsICZTdGF0dXMpOworCQkJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCQkJCXJldHVybjsKKwkJCX0KKworCQkJLy8gVGhlcmUgaXMgbm8gbmVlZCB0byBzZW5kIGJyb2FkY2FzdCBwcm9iZSByZXF1ZXN0IGlmIGFjdGl2ZSBzY2FuIGlzIGluIGVmZmVjdC4KKwkJCWlmICgoU2NhblR5cGUgPT0gU0NBTl9BQ1RJVkUpIHx8IChTY2FuVHlwZSA9PSBGQVNUX1NDQU5fQUNUSVZFKQorCQkJCSkKKwkJCQlTc2lkTGVuID0gcEFkLT5NbG1lQXV4LlNzaWRMZW47CisJCQllbHNlCisJCQkJU3NpZExlbiA9IDA7CisKKwkJCU1ndE1hY0hlYWRlckluaXQocEFkLCAmSGRyODAyMTEsIFNVQlRZUEVfUFJPQkVfUkVRLCAwLCBCUk9BRENBU1RfQUREUiwgQlJPQURDQVNUX0FERFIpOworCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICAgICAgICAmRnJhbWVMZW4sCisJCQkJCQkJICBzaXplb2YoSEVBREVSXzgwMl8xMSksICAgICZIZHI4MDIxMSwKKwkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgJlNzaWRJZSwKKwkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgJlNzaWRMZW4sCisJCQkJCQkJICBTc2lkTGVuLAkJCSAgICAgICAgcEFkLT5NbG1lQXV4LlNzaWQsCisJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICZTdXBSYXRlSWUsCisJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICZwQWQtPkNvbW1vbkNmZy5TdXBSYXRlTGVuLAorCQkJCQkJCSAgcEFkLT5Db21tb25DZmcuU3VwUmF0ZUxlbiwgIHBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGUsCisJCQkJCQkJICBFTkRfT0ZfQVJHUyk7CisKKwkJCWlmIChwQWQtPkNvbW1vbkNmZy5FeHRSYXRlTGVuKQorCQkJeworCQkJCVVMT05HIFRtcDsKKwkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sICAgICAgICAgICAgJlRtcCwKKwkJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkV4dFJhdGVJZSwKKwkJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBBZC0+Q29tbW9uQ2ZnLkV4dFJhdGVMZW4sCisJCQkJCQkJCSAgcEFkLT5Db21tb25DZmcuRXh0UmF0ZUxlbiwgICAgICAgICAgcEFkLT5Db21tb25DZmcuRXh0UmF0ZSwKKwkJCQkJCQkJICBFTkRfT0ZfQVJHUyk7CisJCQkJRnJhbWVMZW4gKz0gVG1wOworCQkJfQorCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQlpZiAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEKQorCQkJeworCQkJCVVMT05HCVRtcDsKKwkJCQlVQ0hBUglIdExlbjsKKwkJCQlVQ0hBUglCUk9BRENPTVs0XSA9IHsweDAsIDB4OTAsIDB4NGMsIDB4MzN9OworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwkJCQlIVF9DQVBBQklMSVRZX0lFIEh0Q2FwYWJpbGl0eVRtcDsKKyNlbmRpZgorCQkJCWlmIChwQWQtPmJCcm9hZENvbUhUID09IFRSVUUpCisJCQkJeworCQkJCQlIdExlbiA9IHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHlMZW4gKyA0OworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwkJCQkJTmRpc01vdmVNZW1vcnkoJkh0Q2FwYWJpbGl0eVRtcCwgJnBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHksIFNJWkVfSFRfQ0FQX0lFKTsKKwkJCQkJKihVU0hPUlQgKikoJkh0Q2FwYWJpbGl0eVRtcC5IdENhcEluZm8pID0gU1dBUDE2KCooVVNIT1JUICopKCZIdENhcGFiaWxpdHlUbXAuSHRDYXBJbmZvKSk7CisJCQkJCSooVVNIT1JUICopKCZIdENhcGFiaWxpdHlUbXAuRXh0SHRDYXBJbmZvKSA9IFNXQVAxNigqKFVTSE9SVCAqKSgmSHRDYXBhYmlsaXR5VG1wLkV4dEh0Q2FwSW5mbykpOworCisJCQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwgICAgICAgICAgJlRtcCwKKwkJCQkJCQkJCTEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmV3BhSWUsCisJCQkJCQkJCQkxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkh0TGVuLAorCQkJCQkJCQkJNCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZCUk9BRENPTVswXSwKKwkJCQkJCQkJCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHlMZW4sICAgICAmSHRDYXBhYmlsaXR5VG1wLAorCQkJCQkJCQkJRU5EX09GX0FSR1MpOworI2Vsc2UKKwkJCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAgICAgICAgICAmVG1wLAorCQkJCQkJCQkJMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZXcGFJZSwKKwkJCQkJCQkJCTEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmSHRMZW4sCisJCQkJCQkJCQk0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkJST0FEQ09NWzBdLAorCQkJCQkJCQkJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eUxlbiwgICAgICZwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5LAorCQkJCQkJCQkJRU5EX09GX0FSR1MpOworI2VuZGlmIC8vIFJUX0JJR19FTkRJQU4gLy8KKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJSHRMZW4gPSBwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5TGVuOworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwkJCQkJTmRpc01vdmVNZW1vcnkoJkh0Q2FwYWJpbGl0eVRtcCwgJnBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eSwgU0laRV9IVF9DQVBfSUUpOworCQkJCQkqKFVTSE9SVCAqKSgmSHRDYXBhYmlsaXR5VG1wLkh0Q2FwSW5mbykgPSBTV0FQMTYoKihVU0hPUlQgKikoJkh0Q2FwYWJpbGl0eVRtcC5IdENhcEluZm8pKTsKKwkJCQkJKihVU0hPUlQgKikoJkh0Q2FwYWJpbGl0eVRtcC5FeHRIdENhcEluZm8pID0gU1dBUDE2KCooVVNIT1JUICopKCZIdENhcGFiaWxpdHlUbXAuRXh0SHRDYXBJbmZvKSk7CisKKwkJCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAgICAgICAgICAmVG1wLAorCQkJCQkJCQkJMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZIdENhcEllLAorCQkJCQkJCQkJMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZIdExlbiwKKwkJCQkJCQkJCUh0TGVuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAmSHRDYXBhYmlsaXR5VG1wLAorCQkJCQkJCQkJRU5EX09GX0FSR1MpOworI2Vsc2UKKwkJCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAgICAgICAgICAmVG1wLAorCQkJCQkJCQkJMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZIdENhcEllLAorCQkJCQkJCQkJMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZIdExlbiwKKwkJCQkJCQkJCUh0TGVuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5LAorCQkJCQkJCQkJRU5EX09GX0FSR1MpOworI2VuZGlmIC8vIFJUX0JJR19FTkRJQU4gLy8KKwkJCQl9CisJCQkJRnJhbWVMZW4gKz0gVG1wOworCisjaWZkZWYgRE9UMTFOX0RSQUZUMworCQkJCWlmIChwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuYjIwNDBDb2V4aXN0U2NhblN1cCA9PSAxKQorCQkJCXsKKwkJCQkJVUxPTkcJCVRtcDsKKwkJCQkJSHRMZW4gPSAxOworCQkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sICAgICAgICAgICAgJlRtcCwKKwkJCQkJCQkJCSAgMSwJCQkJCSZFeHRIdENhcEllLAorCQkJCQkJCQkJICAxLAkJCQkJJkh0TGVuLAorCQkJCQkJCQkJICAxLCAgICAgICAgICAJCQkmcEFkLT5Db21tb25DZmcuQlNTQ29leGlzdDIwNDAud29yZCwKKwkJCQkJCQkJCSAgRU5EX09GX0FSR1MpOworCisJCQkJCUZyYW1lTGVuICs9IFRtcDsKKwkJCQl9CisjZW5kaWYgLy8gRE9UMTFOX0RSQUZUMyAvLworCQkJfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisKKwkJCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgMCwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOworCQkJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKKwkJfQorCisJCS8vIEZvciBTQ0FOX0NJU0NPX1BBU1NJVkUsIGRvIG5vdGhpbmcgYW5kIHNpbGVudGx5IHdhaXQgZm9yIGJlYWNvbiBvciBvdGhlciBwcm9iZSByZXBvbnNlCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJCXBBZC0+TWxtZS5TeW5jTWFjaGluZS5DdXJyU3RhdGUgPSBTQ0FOX0xJU1RFTjsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCX0KK30KKworVk9JRCBNZ3RQcm9iUmVxTWFjSGVhZGVySW5pdCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiBPVVQgUEhFQURFUl84MDJfMTEgcEhkcjgwMjExLAorCUlOIFVDSEFSIFN1YlR5cGUsCisJSU4gVUNIQVIgVG9EcywKKwlJTiBQVUNIQVIgcERBLAorCUlOIFBVQ0hBUiBwQnNzaWQpCit7CisJTmRpc1plcm9NZW1vcnkocEhkcjgwMjExLCBzaXplb2YoSEVBREVSXzgwMl8xMSkpOworCisJcEhkcjgwMjExLT5GQy5UeXBlID0gQlRZUEVfTUdNVDsKKwlwSGRyODAyMTEtPkZDLlN1YlR5cGUgPSBTdWJUeXBlOworCWlmIChTdWJUeXBlID09IFNVQlRZUEVfQUNLKQorCQlwSGRyODAyMTEtPkZDLlR5cGUgPSBCVFlQRV9DTlRMOworCXBIZHI4MDIxMS0+RkMuVG9EcyA9IFRvRHM7CisJQ09QWV9NQUNfQUREUihwSGRyODAyMTEtPkFkZHIxLCBwREEpOworCUNPUFlfTUFDX0FERFIocEhkcjgwMjExLT5BZGRyMiwgcEFkLT5DdXJyZW50QWRkcmVzcyk7CisJQ09QWV9NQUNfQUREUihwSGRyODAyMTEtPkFkZHIzLCBwQnNzaWQpOworfQorCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL2NtbV93cGEuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL2NtbV93cGEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMmMyNGJkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vY21tX3dwYS5jCkBAIC0wLDAgKzEsMTY1NCBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwlNb2R1bGUgTmFtZToKKwl3cGEuYworCisJQWJzdHJhY3Q6CisKKwlSZXZpc2lvbiBIaXN0b3J5OgorCVdobwkJCVdoZW4JCQlXaGF0CisJLS0tLS0tLS0JLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCUphbglMZWUJCTAzLTA3LTIyCQlJbml0aWFsCisJUGF1bCBMaW4JMDMtMTEtMjgJCU1vZGlmeSBmb3Igc3VwcGxpY2FudAorKi8KKyNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKKy8vIFdQQSBPVUkKK1VDSEFSCQlPVUlfV1BBX05PTkVfQUtNWzRdCQk9IHsweDAwLCAweDUwLCAweEYyLCAweDAwfTsKK1VDSEFSICAgICAgIE9VSV9XUEFfVkVSU0lPTls0XSAgICAgID0gezB4MDAsIDB4NTAsIDB4RjIsIDB4MDF9OworVUNIQVIgICAgICAgT1VJX1dQQV9XRVA0MFs0XSAgICAgID0gezB4MDAsIDB4NTAsIDB4RjIsIDB4MDF9OworVUNIQVIgICAgICAgT1VJX1dQQV9US0lQWzRdICAgICA9IHsweDAwLCAweDUwLCAweEYyLCAweDAyfTsKK1VDSEFSICAgICAgIE9VSV9XUEFfQ0NNUFs0XSAgICAgPSB7MHgwMCwgMHg1MCwgMHhGMiwgMHgwNH07CitVQ0hBUiAgICAgICBPVUlfV1BBX1dFUDEwNFs0XSAgICAgID0gezB4MDAsIDB4NTAsIDB4RjIsIDB4MDV9OworVUNIQVIgICAgICAgT1VJX1dQQV84MDIxWF9BS01bNF0JPSB7MHgwMCwgMHg1MCwgMHhGMiwgMHgwMX07CitVQ0hBUiAgICAgICBPVUlfV1BBX1BTS19BS01bNF0gICAgICA9IHsweDAwLCAweDUwLCAweEYyLCAweDAyfTsKKy8vIFdQQTIgT1VJCitVQ0hBUiAgICAgICBPVUlfV1BBMl9XRVA0MFs0XSAgID0gezB4MDAsIDB4MEYsIDB4QUMsIDB4MDF9OworVUNIQVIgICAgICAgT1VJX1dQQTJfVEtJUFs0XSAgICAgICAgPSB7MHgwMCwgMHgwRiwgMHhBQywgMHgwMn07CitVQ0hBUiAgICAgICBPVUlfV1BBMl9DQ01QWzRdICAgICAgICA9IHsweDAwLCAweDBGLCAweEFDLCAweDA0fTsKK1VDSEFSICAgICAgIE9VSV9XUEEyXzgwMjFYX0FLTVs0XSAgID0gezB4MDAsIDB4MEYsIDB4QUMsIDB4MDF9OworVUNIQVIgICAgICAgT1VJX1dQQTJfUFNLX0FLTVs0XSAgIAk9IHsweDAwLCAweDBGLCAweEFDLCAweDAyfTsKK1VDSEFSICAgICAgIE9VSV9XUEEyX1dFUDEwNFs0XSAgID0gezB4MDAsIDB4MEYsIDB4QUMsIDB4MDV9OworLy8gTVNBIE9VSQorVUNIQVIgICAJT1VJX01TQV84MDIxWF9BS01bNF0gICAgPSB7MHgwMCwgMHgwRiwgMHhBQywgMHgwNX07CQkvLyBOb3QgeWV0IGZpbmFsIC0gSUVFRSA4MDIuMTFzLUQxLjA2CitVQ0hBUiAgIAlPVUlfTVNBX1BTS19BS01bNF0gICAJPSB7MHgwMCwgMHgwRiwgMHhBQywgMHgwNn07CQkvLyBOb3QgeWV0IGZpbmFsIC0gSUVFRSA4MDIuMTFzLUQxLjA2CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlUaGUgcHNldWRvLXJhbmRvbSBmdW5jdGlvbihQUkYpIHRoYXQgaGFzaGVzIHZhcmlvdXMgaW5wdXRzIHRvCisJCWRlcml2ZSBhIHBzZXVkby1yYW5kb20gdmFsdWUuIFRvIGFkZCBsaXZlbmVzcyB0byB0aGUgcHNldWRvLXJhbmRvbQorCQl2YWx1ZSwgYSBub25jZSBzaG91bGQgYmUgb25lIG9mIHRoZSBpbnB1dHMuCisKKwkJSXQgaXMgdXNlZCB0byBnZW5lcmF0ZSBQVEssIEdUSyBvciBzb21lIHNwZWNpZmljIHJhbmRvbSB2YWx1ZS4KKworCUFyZ3VtZW50czoKKwkJVUNIQVIJKmtleSwJCS0JdGhlIGtleSBtYXRlcmlhbCBmb3IgSE1BQ19TSEExIHVzZQorCQlJTlQJCWtleV9sZW4JCS0JdGhlIGxlbmd0aCBvZiBrZXkKKwkJVUNIQVIJKnByZWZpeAkJLQlhIHByZWZpeCBsYWJlbAorCQlJTlQJCXByZWZpeF9sZW4JLQl0aGUgbGVuZ3RoIG9mIHRoZSBsYWJlbAorCQlVQ0hBUgkqZGF0YQkJLQlhIHNwZWNpZmljIGRhdGEgd2l0aCB2YXJpYWJsZSBsZW5ndGgKKwkJSU5UCQlkYXRhX2xlbgktCXRoZSBsZW5ndGggb2YgYSBzcGVjaWZpYyBkYXRhCisJCUlOVAkJbGVuCQkJLQl0aGUgb3V0cHV0IGxlbmdodAorCisJUmV0dXJuIFZhbHVlOgorCQlVQ0hBUgkqb3V0cHV0CQktCXRoZSBjYWxjdWxhdGVkIHJlc3VsdAorCisJTm90ZToKKwkJODAyLjExaS0yMDA0CUFubmV4IEguMworCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlQUkYoCisJSU4JVUNIQVIJKmtleSwKKwlJTglJTlQJCWtleV9sZW4sCisJSU4JVUNIQVIJKnByZWZpeCwKKwlJTglJTlQJCXByZWZpeF9sZW4sCisJSU4JVUNIQVIJKmRhdGEsCisJSU4JSU5UCQlkYXRhX2xlbiwKKwlPVVQJVUNIQVIJKm91dHB1dCwKKwlJTglJTlQJCWxlbikKK3sKKwlJTlQJCWk7CisgICAgVUNIQVIgICAqaW5wdXQ7CisJSU5UCQljdXJyZW50aW5kZXggPSAwOworCUlOVAkJdG90YWxfbGVuOworCisJLy8gQWxsb2NhdGUgbWVtb3J5IGZvciBpbnB1dAorCW9zX2FsbG9jX21lbShOVUxMLCAoUFVDSEFSICopJmlucHV0LCAxMDI0KTsKKworICAgIGlmIChpbnB1dCA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiISEhUFJGOiBubyBtZW1vcnkhISFcbiIpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworCS8vIEdlbmVyYXRlIGNvbmNhdGVuYXRpb24gaW5wdXQKKwlOZGlzTW92ZU1lbW9yeShpbnB1dCwgcHJlZml4LCBwcmVmaXhfbGVuKTsKKworCS8vIENvbmNhdGVuYXRlIGEgc2luZ2xlIG9jdGV0IGNvbnRhaW5pbmcgMAorCWlucHV0W3ByZWZpeF9sZW5dID0JMDsKKworCS8vIENvbmNhdGVuYXRlIHNwZWNpZmljIGRhdGEKKwlOZGlzTW92ZU1lbW9yeSgmaW5wdXRbcHJlZml4X2xlbiArIDFdLCBkYXRhLCBkYXRhX2xlbik7CisJdG90YWxfbGVuID0JcHJlZml4X2xlbiArIDEgKyBkYXRhX2xlbjsKKworCS8vIENvbmNhdGVuYXRlIGEgc2luZ2xlIG9jdGV0IGNvbnRhaW5pbmcgMAorCS8vIFRoaXMgb2N0ZXQgc2hhbGwgYmUgdXBkYXRlIGxhdGVyCisJaW5wdXRbdG90YWxfbGVuXSA9IDA7CisJdG90YWxfbGVuKys7CisKKwkvLyBJdGVyYXRlIHRvIGNhbGN1bGF0ZSB0aGUgcmVzdWx0IGJ5IGhtYWMtc2hhLTEKKwkvLyBUaGVuIGNvbmNhdGVuYXRlIHRvIGxhc3QgcmVzdWx0CisJZm9yCShpID0gMDsJaSA8CShsZW4gKyAxOSkgLyAyMDsgaSsrKQorCXsKKwkJSE1BQ19TSEExKGlucHV0LCB0b3RhbF9sZW4sCWtleSwga2V5X2xlbiwgJm91dHB1dFtjdXJyZW50aW5kZXhdKTsKKwkJY3VycmVudGluZGV4ICs9CTIwOworCisJCS8vIHVwZGF0ZSB0aGUgbGFzdCBvY3RldAorCQlpbnB1dFt0b3RhbF9sZW4gLSAxXSsrOworCX0KKyAgICBvc19mcmVlX21lbShOVUxMLCBpbnB1dCk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlJdCB1dGlsaXplcyBQUkYtMzg0IG9yIFBSRi01MTIgdG8gZGVyaXZlIHNlc3Npb24tc3BlY2lmaWMga2V5cyBmcm9tIGEgUE1LLgorCQlJdCBzaGFsbCBiZSBjYWxsZWQgYnkgNC13YXkgaGFuZHNoYWtlIHByb2Nlc3NpbmcuCisKKwlBcmd1bWVudHM6CisJCXBBZCAJLQlwb2ludGVyIHRvIG91ciBwQWRhcHRlciBjb250ZXh0CisJCVBNSwkJLQlwb2ludGVyIHRvIFBNSworCQlBTm9uY2UJLQlwb2ludGVyIHRvIEFOb25jZQorCQlBQQkJLQlwb2ludGVyIHRvIEF1dGhlbnRpY2F0b3IgQWRkcmVzcworCQlTTm9uY2UJLQlwb2ludGVyIHRvIFNOb25jZQorCQlTQQkJLQlwb2ludGVyIHRvIFN1cHBsaWNhbnQgQWRkcmVzcworCQlsZW4JCS0JaW5kaWNhdGUgdGhlIGxlbmd0aCBvZiBQVEsgKG9jdGV0KQorCisJUmV0dXJuIFZhbHVlOgorCQlPdXRwdXQJCXBvaW50ZXIgdG8gdGhlIFBUSworCisJTm90ZToKKwkJUmVmZXIgdG8gSUVFRSA4MDIuMTFpLTIwMDQgOC41LjEuMgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBXcGFDb3VudFBUSygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVQ0hBUgkqUE1LLAorCUlOCVVDSEFSCSpBTm9uY2UsCisJSU4JVUNIQVIJKkFBLAorCUlOCVVDSEFSCSpTTm9uY2UsCisJSU4JVUNIQVIJKlNBLAorCU9VVAlVQ0hBUgkqb3V0cHV0LAorCUlOCVVJTlQJbGVuKQoreworCVVDSEFSCWNvbmNhdGVuYXRpb25bNzZdOworCVVJTlQJQ3VyclBvcyA9IDA7CisJVUNIQVIJdGVtcFszMl07CisJVUNIQVIJUHJlZml4W10gPSB7J1AnLCAnYScsICdpJywgJ3InLCAndycsICdpJywgJ3MnLCAnZScsICcgJywgJ2snLCAnZScsICd5JywgJyAnLAorCQkJCQkJJ2UnLCAneCcsICdwJywgJ2EnLCAnbicsICdzJywgJ2knLCAnbycsICduJ307CisKKwkvLyBpbml0aWF0ZSB0aGUgY29uY2F0ZW5hdGlvbiBpbnB1dAorCU5kaXNaZXJvTWVtb3J5KHRlbXAsIHNpemVvZih0ZW1wKSk7CisJTmRpc1plcm9NZW1vcnkoY29uY2F0ZW5hdGlvbiwgNzYpOworCisJLy8gR2V0IHNtYWxsZXIgYWRkcmVzcworCWlmIChSVE1QQ29tcGFyZU1lbW9yeShTQSwgQUEsIDYpID09IDEpCisJCU5kaXNNb3ZlTWVtb3J5KGNvbmNhdGVuYXRpb24sIEFBLCA2KTsKKwllbHNlCisJCU5kaXNNb3ZlTWVtb3J5KGNvbmNhdGVuYXRpb24sIFNBLCA2KTsKKwlDdXJyUG9zICs9IDY7CisKKwkvLyBHZXQgbGFyZ2VyIGFkZHJlc3MKKwlpZiAoUlRNUENvbXBhcmVNZW1vcnkoU0EsIEFBLCA2KSA9PSAxKQorCQlOZGlzTW92ZU1lbW9yeSgmY29uY2F0ZW5hdGlvbltDdXJyUG9zXSwgU0EsIDYpOworCWVsc2UKKwkJTmRpc01vdmVNZW1vcnkoJmNvbmNhdGVuYXRpb25bQ3VyclBvc10sIEFBLCA2KTsKKworCS8vIHN0b3JlIHRoZSBsYXJnZXIgbWFjIGFkZHJlc3MgZm9yIGJhY2t3YXJkIGNvbXBhdGlibGUgb2YKKwkvLyByYWxpbmsgcHJvcHJpZXRhcnkgU1RBLWtleSBpc3N1ZQorCU5kaXNNb3ZlTWVtb3J5KHRlbXAsICZjb25jYXRlbmF0aW9uW0N1cnJQb3NdLCBNQUNfQUREUl9MRU4pOworCUN1cnJQb3MgKz0gNjsKKworCS8vIEdldCBzbWFsbGVyIE5vbmNlCisJaWYgKFJUTVBDb21wYXJlTWVtb3J5KEFOb25jZSwgU05vbmNlLCAzMikgPT0gMCkKKwkJTmRpc01vdmVNZW1vcnkoJmNvbmNhdGVuYXRpb25bQ3VyclBvc10sIHRlbXAsIDMyKTsJLy8gcGF0Y2ggZm9yIHJhbGluayBwcm9wcmlldGFyeSBTVEEta2V5IGlzc3VlCisJZWxzZSBpZiAoUlRNUENvbXBhcmVNZW1vcnkoQU5vbmNlLCBTTm9uY2UsIDMyKSA9PSAxKQorCQlOZGlzTW92ZU1lbW9yeSgmY29uY2F0ZW5hdGlvbltDdXJyUG9zXSwgU05vbmNlLCAzMik7CisJZWxzZQorCQlOZGlzTW92ZU1lbW9yeSgmY29uY2F0ZW5hdGlvbltDdXJyUG9zXSwgQU5vbmNlLCAzMik7CisJQ3VyclBvcyArPSAzMjsKKworCS8vIEdldCBsYXJnZXIgTm9uY2UKKwlpZiAoUlRNUENvbXBhcmVNZW1vcnkoQU5vbmNlLCBTTm9uY2UsIDMyKSA9PSAwKQorCQlOZGlzTW92ZU1lbW9yeSgmY29uY2F0ZW5hdGlvbltDdXJyUG9zXSwgdGVtcCwgMzIpOwkvLyBwYXRjaCBmb3IgcmFsaW5rIHByb3ByaWV0YXJ5IFNUQS1rZXkgaXNzdWUKKwllbHNlIGlmIChSVE1QQ29tcGFyZU1lbW9yeShBTm9uY2UsIFNOb25jZSwgMzIpID09IDEpCisJCU5kaXNNb3ZlTWVtb3J5KCZjb25jYXRlbmF0aW9uW0N1cnJQb3NdLCBBTm9uY2UsIDMyKTsKKwllbHNlCisJCU5kaXNNb3ZlTWVtb3J5KCZjb25jYXRlbmF0aW9uW0N1cnJQb3NdLCBTTm9uY2UsIDMyKTsKKwlDdXJyUG9zICs9IDMyOworCisJaGV4X2R1bXAoImNvbmNhdGVuYXRpb249IiwgY29uY2F0ZW5hdGlvbiwgNzYpOworCisJLy8gVXNlIFBSRiB0byBnZW5lcmF0ZSBQVEsKKwlQUkYoUE1LLCBMRU5fTUFTVEVSX0tFWSwgUHJlZml4LCAyMiwgY29uY2F0ZW5hdGlvbiwgNzYsIG91dHB1dCwgbGVuKTsKKworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJR2VuZXJhdGUgcmFuZG9tIG51bWJlciBieSBzb2Z0d2FyZS4KKworCUFyZ3VtZW50czoKKwkJcEFkCQktCXBvaW50ZXIgdG8gb3VyIHBBZGFwdGVyIGNvbnRleHQKKwkJbWFjQWRkcgktCXBvaW50ZXIgdG8gbG9jYWwgTUFDIGFkZHJlc3MKKworCVJldHVybiBWYWx1ZToKKworCU5vdGU6CisJCTgwMi4xaWktMjAwNCAgQW5uZXggSC41CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECUdlblJhbmRvbSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVQ0hBUgkJCSptYWNBZGRyLAorCU9VVAlVQ0hBUgkJCSpyYW5kb20pCit7CisJSU5UCQlpLCBjdXJyOworCVVDSEFSCWxvY2FsWzgwXSwgS2V5Q291bnRlclszMl07CisJVUNIQVIJcmVzdWx0WzgwXTsKKwlVTE9ORwlDdXJyZW50VGltZTsKKwlVQ0hBUglwcmVmaXhbXSA9IHsnSScsICduJywgJ2knLCAndCcsICcgJywgJ0MnLCAnbycsICd1JywgJ24nLCAndCcsICdlJywgJ3InfTsKKworCS8vIFplcm8gdGhlIHJlbGF0ZWQgaW5mb3JtYXRpb24KKwlOZGlzWmVyb01lbW9yeShyZXN1bHQsIDgwKTsKKwlOZGlzWmVyb01lbW9yeShsb2NhbCwgODApOworCU5kaXNaZXJvTWVtb3J5KEtleUNvdW50ZXIsIDMyKTsKKworCWZvcgkoaSA9IDA7CWkgPAkzMjsJaSsrKQorCXsKKwkJLy8gY29weSB0aGUgbG9jYWwgTUFDIGFkZHJlc3MKKwkJQ09QWV9NQUNfQUREUihsb2NhbCwgbWFjQWRkcik7CisJCWN1cnIgPQlNQUNfQUREUl9MRU47CisKKwkJLy8gY29uY2F0ZW5hdGUgdGhlIGN1cnJlbnQgdGltZQorCQlOZGlzR2V0U3lzdGVtVXBUaW1lKCZDdXJyZW50VGltZSk7CisJCU5kaXNNb3ZlTWVtb3J5KCZsb2NhbFtjdXJyXSwgICZDdXJyZW50VGltZSwJc2l6ZW9mKEN1cnJlbnRUaW1lKSk7CisJCWN1cnIgKz0Jc2l6ZW9mKEN1cnJlbnRUaW1lKTsKKworCQkvLyBjb25jYXRlbmF0ZSB0aGUgbGFzdCByZXN1bHQKKwkJTmRpc01vdmVNZW1vcnkoJmxvY2FsW2N1cnJdLCAgcmVzdWx0LCAzMik7CisJCWN1cnIgKz0JMzI7CisKKwkJLy8gY29uY2F0ZW5hdGUgYSB2YXJpYWJsZQorCQlOZGlzTW92ZU1lbW9yeSgmbG9jYWxbY3Vycl0sICAmaSwgIDIpOworCQljdXJyICs9CTI7CisKKwkJLy8gY2FsY3VsYXRlIHRoZSByZXN1bHQKKwkJUFJGKEtleUNvdW50ZXIsIDMyLCBwcmVmaXgsMTIsIGxvY2FsLCBjdXJyLCByZXN1bHQsIDMyKTsKKwl9CisKKwlOZGlzTW92ZU1lbW9yeShyYW5kb20sIHJlc3VsdCwJMzIpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJQnVpbGQgY2lwaGVyIHN1aXRlIGluIFJTTi1JRS4KKwkJSXQgb25seSBzaGFsbCBiZSBjYWxsZWQgYnkgUlRNUE1ha2VSU05JRS4KKworCUFyZ3VtZW50czoKKwkJcEFkCQkJLQlwb2ludGVyIHRvIG91ciBwQWRhcHRlciBjb250ZXh0CisgICAgCUVsZW1lbnRJRAktCWluZGljYXRlIHRoZSBXUEExIG9yIFdQQTIKKyAgICAJV2VwU3RhdHVzCS0JaW5kaWNhdGUgdGhlIGVuY3J5cHRpb24gdHlwZQorCQliTWl4Q2lwaGVyCS0JYSBib29sZWFuIHRvIGluZGljYXRlIHRoZSBwYWlyd2lzZSBjaXBoZXIgYW5kIGdyb3VwCisJCQkJCQljaXBoZXIgYXJlIHRoZSBzYW1lIG9yIG5vdAorCisJUmV0dXJuIFZhbHVlOgorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK3N0YXRpYyBWT0lEIFJUTVBJbnNlcnRSc25JZUNpcGhlcigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTglVQ0hBUgkJCUVsZW1lbnRJRCwKKwlJTglVSU5UCQkJV2VwU3RhdHVzLAorCUlOCUJPT0xFQU4JCQliTWl4Q2lwaGVyLAorCUlOCVVDSEFSCQkJRmxleGlibGVDaXBoZXIsCisJT1VUCVBVQ0hBUgkJCXBSc25JZSwKKwlPVVQJVUNIQVIJCQkqcnNuX2xlbikKK3sKKwlVQ0hBUglQYWlyd2lzZUNudDsKKworCSpyc25fbGVuID0gMDsKKworCS8vIGRlY2lkZSBXUEEyIG9yIFdQQTEKKwlpZiAoRWxlbWVudElEID09IFdwYTJJZSkKKwl7CisJCVJTTklFMgkqcFJzbmllX2NpcGhlciA9IChSU05JRTIqKXBSc25JZTsKKworCQkvLyBBc3NpZ24gdGhlIHZlcnNvbiBhcyAxCisJCXBSc25pZV9jaXBoZXItPnZlcnNpb24gPSAxOworCisgICAgICAgIHN3aXRjaCAoV2VwU3RhdHVzKQorICAgICAgICB7CisgICAgICAgIAkvLyBUS0lQIG1vZGUKKyAgICAgICAgICAgIGNhc2UgTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZDoKKyAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwUnNuaWVfY2lwaGVyLT5tY2FzdCwgT1VJX1dQQTJfVEtJUCwgNCk7CisgICAgICAgICAgICAgICAgcFJzbmllX2NpcGhlci0+dWNvdW50ID0gMTsKKyAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwUnNuaWVfY2lwaGVyLT51Y2FzdFswXS5vdWksIE9VSV9XUEEyX1RLSVAsIDQpOworICAgICAgICAgICAgICAgICpyc25fbGVuID0gc2l6ZW9mKFJTTklFMik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKwkJCS8vIEFFUyBtb2RlCisgICAgICAgICAgICBjYXNlIE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQ6CisJCQkJaWYgKGJNaXhDaXBoZXIpCisJCQkJCU5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPm1jYXN0LCBPVUlfV1BBMl9US0lQLCA0KTsKKwkJCQllbHNlCisJCQkJCU5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPm1jYXN0LCBPVUlfV1BBMl9DQ01QLCA0KTsKKyAgICAgICAgICAgICAgICBwUnNuaWVfY2lwaGVyLT51Y291bnQgPSAxOworICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPnVjYXN0WzBdLm91aSwgT1VJX1dQQTJfQ0NNUCwgNCk7CisgICAgICAgICAgICAgICAgKnJzbl9sZW4gPSBzaXplb2YoUlNOSUUyKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworCQkJLy8gVEtJUC1BRVMgbWl4IG1vZGUKKyAgICAgICAgICAgIGNhc2UgTmRpczgwMl8xMUVuY3J5cHRpb240RW5hYmxlZDoKKyAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwUnNuaWVfY2lwaGVyLT5tY2FzdCwgT1VJX1dQQTJfVEtJUCwgNCk7CisKKwkJCQlQYWlyd2lzZUNudCA9IDE7CisJCQkJLy8gSW5zZXJ0IFdQQTIgVEtJUCBhcyB0aGUgZmlyc3QgcGFpcndpc2UgY2lwaGVyCisJCQkJaWYgKE1JWF9DSVBIRVJfV1BBMl9US0lQX09OKEZsZXhpYmxlQ2lwaGVyKSkKKwkJCQl7CisgICAgICAgICAgICAgICAgCU5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPnVjYXN0WzBdLm91aSwgT1VJX1dQQTJfVEtJUCwgNCk7CisJCQkJCS8vIEluc2VydCBXUEEyIEFFUyBhcyB0aGUgc2Vjb25kYXJ5IHBhaXJ3aXNlIGNpcGhlcgorCQkJCQlpZiAoTUlYX0NJUEhFUl9XUEEyX0FFU19PTihGbGV4aWJsZUNpcGhlcikpCisJCQkJCXsKKyAgICAgICAgICAgICAgICAJCU5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPnVjYXN0WzBdLm91aSArIDQsIE9VSV9XUEEyX0NDTVAsIDQpOworCQkJCQkJUGFpcndpc2VDbnQgPSAyOworCQkJCQl9CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCS8vIEluc2VydCBXUEEyIEFFUyBhcyB0aGUgZmlyc3QgcGFpcndpc2UgY2lwaGVyCisJCQkJCU5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPnVjYXN0WzBdLm91aSwgT1VJX1dQQTJfQ0NNUCwgNCk7CisJCQkJfQorCisgICAgICAgICAgICAgICAgcFJzbmllX2NpcGhlci0+dWNvdW50ID0gUGFpcndpc2VDbnQ7CisgICAgICAgICAgICAgICAgKnJzbl9sZW4gPSBzaXplb2YoUlNOSUUyKSArICg0ICogKFBhaXJ3aXNlQ250IC0gMSkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJaWYgKChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKSAmJgorCQkJKHBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyICE9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpICYmCisJCQkocEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgIT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkpCisJCXsKKwkJCVVJTlQgR3JvdXBDaXBoZXIgPSBwQWQtPlN0YUNmZy5Hcm91cENpcGhlcjsKKwkJCXN3aXRjaChHcm91cENpcGhlcikKKwkJCXsKKwkJCQljYXNlIE5kaXM4MDJfMTFHcm91cFdFUDQwRW5hYmxlZDoKKwkJCQkJTmRpc01vdmVNZW1vcnkocFJzbmllX2NpcGhlci0+bWNhc3QsIE9VSV9XUEEyX1dFUDQwLCA0KTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBOZGlzODAyXzExR3JvdXBXRVAxMDRFbmFibGVkOgorCQkJCQlOZGlzTW92ZU1lbW9yeShwUnNuaWVfY2lwaGVyLT5tY2FzdCwgT1VJX1dQQTJfV0VQMTA0LCA0KTsKKwkJCQkJYnJlYWs7CisJCQl9CisJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCQkvLyBzd2FwIGZvciBiaWctZW5kaWFuIHBsYXRmb3JtCisJCXBSc25pZV9jaXBoZXItPnZlcnNpb24gPSBjcHUybGUxNihwUnNuaWVfY2lwaGVyLT52ZXJzaW9uKTsKKwkgICAgcFJzbmllX2NpcGhlci0+dWNvdW50ID0gY3B1MmxlMTYocFJzbmllX2NpcGhlci0+dWNvdW50KTsKKwl9CisJZWxzZQorCXsKKwkJUlNOSUUJKnBSc25pZV9jaXBoZXIgPSAoUlNOSUUqKXBSc25JZTsKKworCQkvLyBBc3NpZ24gT1VJIGFuZCB2ZXJzaW9uCisJCU5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPm91aSwgT1VJX1dQQV9WRVJTSU9OLCA0KTsKKyAgICAgICAgcFJzbmllX2NpcGhlci0+dmVyc2lvbiA9IDE7CisKKwkJc3dpdGNoIChXZXBTdGF0dXMpCisJCXsKKwkJCS8vIFRLSVAgbW9kZQorICAgICAgICAgICAgY2FzZSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkOgorICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPm1jYXN0LCBPVUlfV1BBX1RLSVAsIDQpOworICAgICAgICAgICAgICAgIHBSc25pZV9jaXBoZXItPnVjb3VudCA9IDE7CisgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocFJzbmllX2NpcGhlci0+dWNhc3RbMF0ub3VpLCBPVUlfV1BBX1RLSVAsIDQpOworICAgICAgICAgICAgICAgICpyc25fbGVuID0gc2l6ZW9mKFJTTklFKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworCQkJLy8gQUVTIG1vZGUKKyAgICAgICAgICAgIGNhc2UgTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZDoKKwkJCQlpZiAoYk1peENpcGhlcikKKwkJCQkJTmRpc01vdmVNZW1vcnkocFJzbmllX2NpcGhlci0+bWNhc3QsIE9VSV9XUEFfVEtJUCwgNCk7CisJCQkJZWxzZQorCQkJCQlOZGlzTW92ZU1lbW9yeShwUnNuaWVfY2lwaGVyLT5tY2FzdCwgT1VJX1dQQV9DQ01QLCA0KTsKKyAgICAgICAgICAgICAgICBwUnNuaWVfY2lwaGVyLT51Y291bnQgPSAxOworICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPnVjYXN0WzBdLm91aSwgT1VJX1dQQV9DQ01QLCA0KTsKKyAgICAgICAgICAgICAgICAqcnNuX2xlbiA9IHNpemVvZihSU05JRSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKwkJCS8vIFRLSVAtQUVTIG1peCBtb2RlCisgICAgICAgICAgICBjYXNlIE5kaXM4MDJfMTFFbmNyeXB0aW9uNEVuYWJsZWQ6CisgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocFJzbmllX2NpcGhlci0+bWNhc3QsIE9VSV9XUEFfVEtJUCwgNCk7CisKKwkJCQlQYWlyd2lzZUNudCA9IDE7CisJCQkJLy8gSW5zZXJ0IFdQQSBUS0lQIGFzIHRoZSBmaXJzdCBwYWlyd2lzZSBjaXBoZXIKKwkJCQlpZiAoTUlYX0NJUEhFUl9XUEFfVEtJUF9PTihGbGV4aWJsZUNpcGhlcikpCisJCQkJeworICAgICAgICAgICAgICAgIAlOZGlzTW92ZU1lbW9yeShwUnNuaWVfY2lwaGVyLT51Y2FzdFswXS5vdWksIE9VSV9XUEFfVEtJUCwgNCk7CisJCQkJCS8vIEluc2VydCBXUEEgQUVTIGFzIHRoZSBzZWNvbmRhcnkgcGFpcndpc2UgY2lwaGVyCisJCQkJCWlmIChNSVhfQ0lQSEVSX1dQQV9BRVNfT04oRmxleGlibGVDaXBoZXIpKQorCQkJCQl7CisgICAgICAgICAgICAgICAgCQlOZGlzTW92ZU1lbW9yeShwUnNuaWVfY2lwaGVyLT51Y2FzdFswXS5vdWkgKyA0LCBPVUlfV1BBX0NDTVAsIDQpOworCQkJCQkJUGFpcndpc2VDbnQgPSAyOworCQkJCQl9CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCS8vIEluc2VydCBXUEEgQUVTIGFzIHRoZSBmaXJzdCBwYWlyd2lzZSBjaXBoZXIKKwkJCQkJTmRpc01vdmVNZW1vcnkocFJzbmllX2NpcGhlci0+dWNhc3RbMF0ub3VpLCBPVUlfV1BBX0NDTVAsIDQpOworCQkJCX0KKworICAgICAgICAgICAgICAgIHBSc25pZV9jaXBoZXItPnVjb3VudCA9IFBhaXJ3aXNlQ250OworICAgICAgICAgICAgICAgICpyc25fbGVuID0gc2l6ZW9mKFJTTklFKSArICg0ICogKFBhaXJ3aXNlQ250IC0gMSkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJaWYgKChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKSAmJgorCQkJKHBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyICE9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpICYmCisJCQkocEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgIT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkpCisJCXsKKwkJCVVJTlQgR3JvdXBDaXBoZXIgPSBwQWQtPlN0YUNmZy5Hcm91cENpcGhlcjsKKwkJCXN3aXRjaChHcm91cENpcGhlcikKKwkJCXsKKwkJCQljYXNlIE5kaXM4MDJfMTFHcm91cFdFUDQwRW5hYmxlZDoKKwkJCQkJTmRpc01vdmVNZW1vcnkocFJzbmllX2NpcGhlci0+bWNhc3QsIE9VSV9XUEFfV0VQNDAsIDQpOworCQkJCQlicmVhazsKKwkJCQljYXNlIE5kaXM4MDJfMTFHcm91cFdFUDEwNEVuYWJsZWQ6CisJCQkJCU5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPm1jYXN0LCBPVUlfV1BBX1dFUDEwNCwgNCk7CisJCQkJCWJyZWFrOworCQkJfQorCQl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwkJLy8gc3dhcCBmb3IgYmlnLWVuZGlhbiBwbGF0Zm9ybQorCQlwUnNuaWVfY2lwaGVyLT52ZXJzaW9uID0gY3B1MmxlMTYocFJzbmllX2NpcGhlci0+dmVyc2lvbik7CisJICAgIHBSc25pZV9jaXBoZXItPnVjb3VudCA9IGNwdTJsZTE2KHBSc25pZV9jaXBoZXItPnVjb3VudCk7CisJfQorfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJQnVpbGQgQUtNIHN1aXRlIGluIFJTTi1JRS4KKwkJSXQgb25seSBzaGFsbCBiZSBjYWxsZWQgYnkgUlRNUE1ha2VSU05JRS4KKworCUFyZ3VtZW50czoKKwkJcEFkCQkJLQlwb2ludGVyIHRvIG91ciBwQWRhcHRlciBjb250ZXh0CisgICAgCUVsZW1lbnRJRAktCWluZGljYXRlIHRoZSBXUEExIG9yIFdQQTIKKyAgICAJQXV0aE1vZGUJLQlpbmRpY2F0ZSB0aGUgYXV0aGVudGljYXRpb24gbW9kZQorCQlhcGlkeAkJLQlpbmRpY2F0ZSB0aGUgaW50ZXJmYWNlIGluZGV4CisKKwlSZXR1cm4gVmFsdWU6CisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworc3RhdGljIFZPSUQgUlRNUEluc2VydFJzbkllQUtNKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOCVVDSEFSCQkJRWxlbWVudElELAorCUlOCVVJTlQJCQlBdXRoTW9kZSwKKwlJTglVQ0hBUgkJCWFwaWR4LAorCU9VVAlQVUNIQVIJCQlwUnNuSWUsCisJT1VUCVVDSEFSCQkJKnJzbl9sZW4pCit7CisJUlNOSUVfQVVUSAkJKnBSc25pZV9hdXRoOworCisJcFJzbmllX2F1dGggPSAoUlNOSUVfQVVUSCopKHBSc25JZSArICgqcnNuX2xlbikpOworCisJLy8gZGVjaWRlIFdQQTIgb3IgV1BBMQorCWlmIChFbGVtZW50SUQgPT0gV3BhMkllKQorCXsKKwkJc3dpdGNoIChBdXRoTW9kZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBOZGlzODAyXzExQXV0aE1vZGVXUEEyOgorICAgICAgICAgICAgY2FzZSBOZGlzODAyXzExQXV0aE1vZGVXUEExV1BBMjoKKyAgICAgICAgICAgICAgICBwUnNuaWVfYXV0aC0+YWNvdW50ID0gMTsKKyAgICAgICAgICAgICAgICAJTmRpc01vdmVNZW1vcnkocFJzbmllX2F1dGgtPmF1dGhbMF0ub3VpLCBPVUlfV1BBMl84MDIxWF9BS00sIDQpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0s6CisgICAgICAgICAgICBjYXNlIE5kaXM4MDJfMTFBdXRoTW9kZVdQQTFQU0tXUEEyUFNLOgorICAgICAgICAgICAgICAgIHBSc25pZV9hdXRoLT5hY291bnQgPSAxOworICAgICAgICAgICAgICAgIAlOZGlzTW92ZU1lbW9yeShwUnNuaWVfYXV0aC0+YXV0aFswXS5vdWksIE9VSV9XUEEyX1BTS19BS00sIDQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisJfQorCWVsc2UKKwl7CisJCXN3aXRjaCAoQXV0aE1vZGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgTmRpczgwMl8xMUF1dGhNb2RlV1BBOgorICAgICAgICAgICAgY2FzZSBOZGlzODAyXzExQXV0aE1vZGVXUEExV1BBMjoKKyAgICAgICAgICAgICAgICBwUnNuaWVfYXV0aC0+YWNvdW50ID0gMTsKKyAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwUnNuaWVfYXV0aC0+YXV0aFswXS5vdWksIE9VSV9XUEFfODAyMVhfQUtNLCA0KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0s6CisgICAgICAgICAgICBjYXNlIE5kaXM4MDJfMTFBdXRoTW9kZVdQQTFQU0tXUEEyUFNLOgorICAgICAgICAgICAgICAgIHBSc25pZV9hdXRoLT5hY291bnQgPSAxOworICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBSc25pZV9hdXRoLT5hdXRoWzBdLm91aSwgT1VJX1dQQV9QU0tfQUtNLCA0KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworCQkJY2FzZSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lOgorICAgICAgICAgICAgICAgIHBSc25pZV9hdXRoLT5hY291bnQgPSAxOworICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBSc25pZV9hdXRoLT5hdXRoWzBdLm91aSwgT1VJX1dQQV9OT05FX0FLTSwgNCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKwl9CisKKwlwUnNuaWVfYXV0aC0+YWNvdW50ID0gY3B1MmxlMTYocFJzbmllX2F1dGgtPmFjb3VudCk7CisKKwkoKnJzbl9sZW4pICs9IHNpemVvZihSU05JRV9BVVRIKTsJLy8gdXBkYXRlIGN1cnJlbnQgUlNOSUUgbGVuZ3RoCisKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCUJ1aWxkIGNhcGFiaWxpdHkgaW4gUlNOLUlFLgorCQlJdCBvbmx5IHNoYWxsIGJlIGNhbGxlZCBieSBSVE1QTWFrZVJTTklFLgorCisJQXJndW1lbnRzOgorCQlwQWQJCQktCXBvaW50ZXIgdG8gb3VyIHBBZGFwdGVyIGNvbnRleHQKKyAgICAJRWxlbWVudElECS0JaW5kaWNhdGUgdGhlIFdQQTEgb3IgV1BBMgorCQlhcGlkeAkJLQlpbmRpY2F0ZSB0aGUgaW50ZXJmYWNlIGluZGV4CisKKwlSZXR1cm4gVmFsdWU6CisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworc3RhdGljIFZPSUQgUlRNUEluc2VydFJzbkllQ2FwKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOCVVDSEFSCQkJRWxlbWVudElELAorCUlOCVVDSEFSCQkJYXBpZHgsCisJT1VUCVBVQ0hBUgkJCXBSc25JZSwKKwlPVVQJVUNIQVIJCQkqcnNuX2xlbikKK3sKKwlSU05fQ0FQQUJJTElUSUVTICAgICpwUlNOX0NhcDsKKworCS8vIGl0IGNvdWxkIGJlIGlnbm9yZWQgaW4gV1BBMSBtb2RlCisJaWYgKEVsZW1lbnRJRCA9PSBXcGFJZSkKKwkJcmV0dXJuOworCisJcFJTTl9DYXAgPSAoUlNOX0NBUEFCSUxJVElFUyopKHBSc25JZSArICgqcnNuX2xlbikpOworCisKKwlwUlNOX0NhcC0+d29yZCA9IGNwdTJsZTE2KHBSU05fQ2FwLT53b3JkKTsKKworCSgqcnNuX2xlbikgKz0gc2l6ZW9mKFJTTl9DQVBBQklMSVRJRVMpOwkvLyB1cGRhdGUgY3VycmVudCBSU05JRSBsZW5ndGgKKworfQorCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlCdWlsZCBSU04gSUUgY29udGV4dC4gSXQgaXMgbm90IGluY2x1ZGVkIGVsZW1lbnQtSUQgYW5kIGxlbmd0aC4KKworCUFyZ3VtZW50czoKKwkJcEFkCQkJLQlwb2ludGVyIHRvIG91ciBwQWRhcHRlciBjb250ZXh0CisgICAgCUF1dGhNb2RlCS0JaW5kaWNhdGUgdGhlIGF1dGhlbnRpY2F0aW9uIG1vZGUKKyAgICAJV2VwU3RhdHVzCS0JaW5kaWNhdGUgdGhlIGVuY3J5cHRpb24gdHlwZQorCQlhcGlkeAkJLQlpbmRpY2F0ZSB0aGUgaW50ZXJmYWNlIGluZGV4CisKKwlSZXR1cm4gVmFsdWU6CisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBSVE1QTWFrZVJTTklFKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorICAgIElOICBVSU5UICAgICAgICAgICAgQXV0aE1vZGUsCisgICAgSU4gIFVJTlQgICAgICAgICAgICBXZXBTdGF0dXMsCisJSU4JVUNIQVIJCQlhcGlkeCkKK3sKKwlQVUNIQVIJCXBSc25JZSA9IE5VTEw7CQkJLy8gcHJpbWFyeSBSU05JRQorCVVDSEFSIAkJKnJzbmllbGVuX2N1cl9wID0gMDsJLy8gdGhlIGxlbmd0aCBvZiB0aGUgcHJpbWFyeSBSU05JRQorCVVDSEFSCQkqcnNuaWVsZW5fZXhfY3VyX3AgPSAwOwkvLyB0aGUgbGVuZ3RoIG9mIHRoZSBzZWNvbmRhcnkgUlNOSUUKKwlVQ0hBUgkJUHJpbWFyeVJzbmllOworCUJPT0xFQU4JCWJNaXhDaXBoZXIgPSBGQUxTRTsJLy8gaW5kaWNhdGUgdGhlIHBhaXJ3aXNlIGFuZCBncm91cCBjaXBoZXIgYXJlIGRpZmZlcmVudAorCVVDSEFSCQlwX29mZnNldDsKKwlXUEFfTUlYX1BBSVJfQ0lQSEVSCQlGbGV4aWJsZUNpcGhlciA9IE1JWF9DSVBIRVJfTk9UVVNFOwkvLyBpdCBwcm92aWRlIHRoZSBtb3JlIGZsZXhpYmxlIGNpcGhlciBjb21iaW5hdGlvbiBpbiBXUEEtV1BBMiBhbmQgVEtJUEFFUyBtb2RlCisKKwlyc25pZWxlbl9jdXJfcCA9IE5VTEw7CisJcnNuaWVsZW5fZXhfY3VyX3AgPSBOVUxMOworCisJeworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQl7CisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorCQkJaWYgKHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCAhPSBXUEFfU1VQUExJQ0FOVF9ESVNBQkxFKQorCQkJeworCQkJCWlmIChBdXRoTW9kZSA8IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKKwkJCQkJcmV0dXJuOworCQkJfQorCQkJZWxzZQorI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKwkJCXsKKwkJCQkvLyBTdXBwb3J0IFdQQVBTSyBvciBXUEEyUFNLIGluIFNUQS1JbmZyYSBtb2RlCisJCQkJLy8gU3VwcG9ydCBXUEFOb25lIGluIFNUQS1BZGhvYyBtb2RlCisJCQkJaWYgKChBdXRoTW9kZSAhPSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spICYmCisJCQkJCShBdXRoTW9kZSAhPSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKSAmJgorCQkJCQkoQXV0aE1vZGUgIT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZSkKKwkJCQkJKQorCQkJCQlyZXR1cm47CisJCQl9CisKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiPT0+IFJUTVBNYWtlUlNOSUUoU1RBKVxuIikpOworCisJCQkvLyBaZXJvIFJTTklFIGNvbnRleHQKKwkJCXBBZC0+U3RhQ2ZnLlJTTklFX0xlbiA9IDA7CisJCQlOZGlzWmVyb01lbW9yeShwQWQtPlN0YUNmZy5SU05fSUUsIE1BWF9MRU5fT0ZfUlNOSUUpOworCisJCQkvLyBQb2ludGVyIHRvIFJTTklFCisJCQlyc25pZWxlbl9jdXJfcCA9ICZwQWQtPlN0YUNmZy5SU05JRV9MZW47CisJCQlwUnNuSWUgPSBwQWQtPlN0YUNmZy5SU05fSUU7CisKKwkJCWJNaXhDaXBoZXIgPSBwQWQtPlN0YUNmZy5iTWl4Q2lwaGVyOworCQl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJfQorCisJLy8gaW5kaWNhdGUgcHJpbWFyeSBSU05JRSBhcyBXUEEgb3IgV1BBMgorCWlmICgoQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKSB8fAorCQkoQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKSB8fAorCQkoQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZSkgfHwKKwkJKEF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTFXUEEyKSB8fAorCQkoQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMVBTS1dQQTJQU0spKQorCQlQcmltYXJ5UnNuaWUgPSBXcGFJZTsKKwllbHNlCisJCVByaW1hcnlSc25pZSA9IFdwYTJJZTsKKworCXsKKwkJLy8gQnVpbGQgdGhlIHByaW1hcnkgUlNOSUUKKwkJLy8gMS4gaW5zZXJ0IGNpcGhlciBzdWl0ZQorCQlSVE1QSW5zZXJ0UnNuSWVDaXBoZXIocEFkLCBQcmltYXJ5UnNuaWUsIFdlcFN0YXR1cywgYk1peENpcGhlciwgRmxleGlibGVDaXBoZXIsIHBSc25JZSwgJnBfb2Zmc2V0KTsKKworCQkvLyAyLiBpbnNlcnQgQUtNCisJCVJUTVBJbnNlcnRSc25JZUFLTShwQWQsIFByaW1hcnlSc25pZSwgQXV0aE1vZGUsIGFwaWR4LCBwUnNuSWUsICZwX29mZnNldCk7CisKKwkJLy8gMy4gaW5zZXJ0IGNhcGFiaWxpdHkKKwkJUlRNUEluc2VydFJzbkllQ2FwKHBBZCwgUHJpbWFyeVJzbmllLCBhcGlkeCwgcFJzbkllLCAmcF9vZmZzZXQpOworCX0KKworCS8vIDQuIHVwZGF0ZSB0aGUgUlNOSUUgbGVuZ3RoCisJKnJzbmllbGVuX2N1cl9wID0gcF9vZmZzZXQ7CisKKwloZXhfZHVtcCgiVGhlIHByaW1hcnkgUlNOSUUiLCBwUnNuSWUsICgqcnNuaWVsZW5fY3VyX3ApKTsKKworCit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKwkJQ2hlY2sgd2hldGhlciB0aGUgcmVjZWl2ZWQgZnJhbWUgaXMgRUFQIGZyYW1lLgorCisJQXJndW1lbnRzOgorCQlwQWQJCQkJLQlwb2ludGVyIHRvIG91ciBwQWRhcHRlciBjb250ZXh0CisJCXBFbnRyeQkJCS0JcG9pbnRlciB0byBhY3RpdmUgZW50cnkKKwkJcERhdGEJCQktCXRoZSByZWNlaXZlZCBmcmFtZQorCQlEYXRhQnl0ZUNvdW50IAktCXRoZSByZWNlaXZlZCBmcmFtZSdzIGxlbmd0aAorCQlGcm9tV2hpY2hCU1NJRAktCWluZGljYXRlIHRoZSBpbnRlcmZhY2UgaW5kZXgKKworICAgIFJldHVybjoKKyAgICAgICAgIFRSVUUgCQkJLQlUaGlzIGZyYW1lIGlzIEVBUCBmcmFtZQorICAgICAgICAgRkFMU0UgCQkJLQlvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0JPT0xFQU4gUlRNUENoZWNrV1BBZnJhbWUoCisgICAgSU4gUFJUTVBfQURBUFRFUiAgICBwQWQsCisgICAgSU4gUE1BQ19UQUJMRV9FTlRSWQlwRW50cnksCisgICAgSU4gUFVDSEFSICAgICAgICAgICBwRGF0YSwKKyAgICBJTiBVTE9ORyAgICAgICAgICAgIERhdGFCeXRlQ291bnQsCisJSU4gVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCkKK3sKKwlVTE9ORwlCb2R5X2xlbjsKKwlCT09MRUFOIENhbmNlbGxlZDsKKworCisgICAgaWYoRGF0YUJ5dGVDb3VudCA8IChMRU5HVEhfODAyXzFfSCArIExFTkdUSF9FQVBPTF9IKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisKKwkvLyBTa2lwIExMQyBoZWFkZXIKKyAgICBpZiAoTmRpc0VxdWFsTWVtb3J5KFNOQVBfODAyXzFILCBwRGF0YSwgNikgfHwKKyAgICAgICAgLy8gQ2lzY28gMTIwMCBBUCBtYXkgc2VuZCBwYWNrZXQgd2l0aCBTTkFQX0JSSURHRV9UVU5ORUwKKyAgICAgICAgTmRpc0VxdWFsTWVtb3J5KFNOQVBfQlJJREdFX1RVTk5FTCwgcERhdGEsIDYpKQorICAgIHsKKyAgICAgICAgcERhdGEgKz0gNjsKKyAgICB9CisJLy8gU2tpcCAyLWJ5dGVzIEVBUG9MIHR5cGUKKyAgICBpZiAoTmRpc0VxdWFsTWVtb3J5KEVBUE9MLCBwRGF0YSwgMikpCisgICAgeworICAgICAgICBwRGF0YSArPSAyOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgIHN3aXRjaCAoKihwRGF0YSsxKSkKKyAgICB7CisgICAgICAgIGNhc2UgRUFQUGFja2V0OgorCQkJQm9keV9sZW4gPSAoKihwRGF0YSsyKTw8OCkgfCAoKihwRGF0YSszKSk7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSZWNlaXZlIEVBUC1QYWNrZXQgZnJhbWUsIFRZUEUgPSAwLCBMZW5ndGggPSAlbGRcbiIsIEJvZHlfbGVuKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBFQVBPTFN0YXJ0OgorICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmVjZWl2ZSBFQVBPTC1TdGFydCBmcmFtZSwgVFlQRSA9IDEgXG4iKSk7CisJCQlpZiAocEVudHJ5LT5FbnF1ZXVlRWFwb2xTdGFydFRpbWVyUnVubmluZyAhPSBFQVBPTF9TVEFSVF9ESVNBQkxFKQorICAgICAgICAgICAgeworICAgICAgICAgICAgCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNhbmNlbCB0aGUgRW5xdWV1ZUVhcG9sU3RhcnRUaW1lclJ1bm5pbmcgXG4iKSk7CisgICAgICAgICAgICAgICAgUlRNUENhbmNlbFRpbWVyKCZwRW50cnktPkVucXVldWVTdGFydEZvclBTS1RpbWVyLCAmQ2FuY2VsbGVkKTsKKyAgICAgICAgICAgICAgICBwRW50cnktPkVucXVldWVFYXBvbFN0YXJ0VGltZXJSdW5uaW5nID0gRUFQT0xfU1RBUlRfRElTQUJMRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEVBUE9MTG9nb2ZmOgorICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmVjZWl2ZSBFQVBPTExvZ29mZiBmcmFtZSwgVFlQRSA9IDIgXG4iKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBFQVBPTEtleToKKwkJCUJvZHlfbGVuID0gKCoocERhdGErMik8PDgpIHwgKCoocERhdGErMykpOworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmVjZWl2ZSBFQVBPTC1LZXkgZnJhbWUsIFRZUEUgPSAzLCBMZW5ndGggPSAlbGRcbiIsIEJvZHlfbGVuKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBFQVBPTEFTRkFsZXJ0OgorICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmVjZWl2ZSBFQVBPTEFTRkFsZXJ0IGZyYW1lLCBUWVBFID0gNCBcbiIpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgfQorICAgIHJldHVybiBUUlVFOworfQorCisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgRU5DUllQVCBBRVMgR1RLIGJlZm9yZSBzZW5kaW5nIGluIEVBUE9MIGZyYW1lLgorICAgICAgICBBRVMgR1RLIGxlbmd0aCA9IDEyOCBiaXQsICBzbyBmaXggYmxvY2tzIGZvciBhZXMta2V5LXdyYXAgYXMgMiBpbiB0aGlzIGZ1bmN0aW9uLgorICAgICAgICBUaGlzIGZ1bmN0aW9uIHJlZmVyZW5jZXMgdG8gUkZDIDMzOTQgZm9yIGFlcyBrZXkgd3JhcCBhbGdvcml0aG0uCisgICAgUmV0dXJuOgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBBRVNfR1RLX0tFWV9XUkFQKAorICAgIElOIFVDSEFSICAgICprZXksCisgICAgSU4gVUNIQVIgICAgKnBsYWludGV4dCwKKyAgICBJTiBVQ0hBUiAgICBwX2xlbiwKKyAgICBPVVQgVUNIQVIgICAqY2lwaGVydGV4dCkKK3sKKyAgICBVQ0hBUiAgICAgICBBWzhdLCBCSU5bMTZdLCBCT1VUWzE2XTsKKyAgICBVQ0hBUiAgICAgICBSWzUxMl07CisgICAgSU5UICAgICAgICAgbnVtX2Jsb2NrcyA9IHBfbGVuLzg7ICAgLy8gdW5pdDo2NGJpdHMKKyAgICBJTlQgICAgICAgICBpLCBqOworICAgIGFlc19jb250ZXh0IGFlc2N0eDsKKyAgICBVQ0hBUiAgICAgICB4b3I7CisKKyAgICBydG1wX2Flc19zZXRfa2V5KCZhZXNjdHgsIGtleSwgMTI4KTsKKworICAgIC8vIEluaXQgSUEKKyAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorICAgICAgICBBW2ldID0gMHhhNjsKKworICAgIC8vSW5wdXQgcGxhaW50ZXh0CisgICAgZm9yIChpID0gMDsgaSA8IG51bV9ibG9ja3M7IGkrKykKKyAgICB7CisgICAgICAgIGZvciAoaiA9IDAgOyBqIDwgODsgaisrKQorICAgICAgICAgICAgUls4ICogKGkgKyAxKSArIGpdID0gcGxhaW50ZXh0WzggKiBpICsgal07CisgICAgfQorCisgICAgLy8gS2V5IE1peAorICAgIGZvciAoaiA9IDA7IGogPCA2OyBqKyspCisgICAgeworICAgICAgICBmb3IoaSA9IDE7IGkgPD0gbnVtX2Jsb2NrczsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICAvL3BoYXNlIDEKKyAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KEJJTiwgQSwgOCk7CisgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeSgmQklOWzhdLCAmUls4ICogaV0sIDgpOworICAgICAgICAgICAgcnRtcF9hZXNfZW5jcnlwdCgmYWVzY3R4LCBCSU4sIEJPVVQpOworCisgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShBLCAmQk9VVFswXSwgOCk7CisgICAgICAgICAgICB4b3IgPSBudW1fYmxvY2tzICogaiArIGk7CisgICAgICAgICAgICBBWzddID0gQk9VVFs3XSBeIHhvcjsKKyAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KCZSWzggKiBpXSwgJkJPVVRbOF0sIDgpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gT3V0cHV0IGNpcGhlcnRleHQKKyAgICBOZGlzTW92ZU1lbW9yeShjaXBoZXJ0ZXh0LCBBLCA4KTsKKworICAgIGZvciAoaSA9IDE7IGkgPD0gbnVtX2Jsb2NrczsgaSsrKQorICAgIHsKKyAgICAgICAgZm9yIChqID0gMCA7IGogPCA4OyBqKyspCisgICAgICAgICAgICBjaXBoZXJ0ZXh0WzggKiBpICsgal0gPSBSWzggKiBpICsgal07CisgICAgfQorfQorCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlNaXNjIGZ1bmN0aW9uIHRvIGRlY3J5cHQgQUVTIGJvZHkKKworCUFyZ3VtZW50czoKKworCVJldHVybiBWYWx1ZToKKworCU5vdGU6CisJCVRoaXMgZnVuY3Rpb24gcmVmZXJlbmNlcyB0bwlSRkMJMzM5NCBmb3IgYWVzIGtleSB1bndyYXAgYWxnb3JpdGhtLgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlBRVNfR1RLX0tFWV9VTldSQVAoCisJSU4JVUNIQVIJKmtleSwKKwlPVVQJVUNIQVIJKnBsYWludGV4dCwKKwlJTglVQ0hBUiAgICBjX2xlbiwKKwlJTglVQ0hBUgkqY2lwaGVydGV4dCkKKworeworCVVDSEFSICAgICAgIEFbOF0sIEJJTlsxNl0sIEJPVVRbMTZdOworCVVDSEFSICAgICAgIHhvcjsKKwlJTlQgICAgICAgICBpLCBqOworCWFlc19jb250ZXh0IGFlc2N0eDsKKwlVQ0hBUiAgICAgICAqUjsKKwlJTlQgICAgICAgICBudW1fYmxvY2tzID0gY19sZW4vODsJLy8gdW5pdDo2NGJpdHMKKworCisJb3NfYWxsb2NfbWVtKE5VTEwsIChQVUNIQVIgKikmUiwgNTEyKTsKKworCWlmIChSID09IE5VTEwpCisgICAgeworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIhISFBRVNfR1RLX0tFWV9VTldSQVA6IG5vIG1lbW9yeSEhIVxuIikpOworICAgICAgICByZXR1cm47CisgICAgfSAvKiBFbmQgb2YgaWYgKi8KKworCS8vIEluaXRpYWxpemUKKwlOZGlzTW92ZU1lbW9yeShBLCBjaXBoZXJ0ZXh0LCA4KTsKKwkvL0lucHV0IHBsYWludGV4dAorCWZvcihpID0gMDsgaSA8IChjX2xlbi04KTsgaSsrKQorCXsKKwkJUlsgaV0gPSBjaXBoZXJ0ZXh0W2kgKyA4XTsKKwl9CisKKwlydG1wX2Flc19zZXRfa2V5KCZhZXNjdHgsIGtleSwgMTI4KTsKKworCWZvcihqID0gNTsgaiA+PSAwOyBqLS0pCisJeworCQlmb3IoaSA9IChudW1fYmxvY2tzLTEpOyBpID4gMDsgaS0tKQorCQl7CisJCQl4b3IgPSAobnVtX2Jsb2NrcyAtMSApKiBqICsgaTsKKwkJCU5kaXNNb3ZlTWVtb3J5KEJJTiwgQSwgOCk7CisJCQlCSU5bN10gPSBBWzddIF4geG9yOworCQkJTmRpc01vdmVNZW1vcnkoJkJJTls4XSwgJlJbKGktMSkqOF0sIDgpOworCQkJcnRtcF9hZXNfZGVjcnlwdCgmYWVzY3R4LCBCSU4sIEJPVVQpOworCQkJTmRpc01vdmVNZW1vcnkoQSwgJkJPVVRbMF0sIDgpOworCQkJTmRpc01vdmVNZW1vcnkoJlJbKGktMSkqOF0sICZCT1VUWzhdLCA4KTsKKwkJfQorCX0KKworCS8vIE9VVFBVVAorCWZvcihpID0gMDsgaSA8IGNfbGVuOyBpKyspCisJeworCQlwbGFpbnRleHRbaV0gPSBSW2ldOworCX0KKworCisJb3NfZnJlZV9tZW0oTlVMTCwgUik7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKwkJUmVwb3J0IHRoZSBFQVAgbWVzc2FnZSB0eXBlCisKKwlBcmd1bWVudHM6CisJCW1zZwkJLQlFQVBPTF9QQUlSX01TR18xCisJCQkJCUVBUE9MX1BBSVJfTVNHXzIKKwkJCQkJRUFQT0xfUEFJUl9NU0dfMworCQkJCQlFQVBPTF9QQUlSX01TR180CisJCQkJCUVBUE9MX0dST1VQX01TR18xCisJCQkJCUVBUE9MX0dST1VQX01TR18yCisKKyAgICBSZXR1cm46CisgICAgICAgICBtZXNzYWdlIHR5cGUgc3RyaW5nCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0NIQVIgKkdldEVhcG9sTXNnVHlwZShDSEFSIG1zZykKK3sKKyAgICBpZihtc2cgPT0gRUFQT0xfUEFJUl9NU0dfMSkKKyAgICAgICAgcmV0dXJuICJQYWlyd2lzZSBNZXNzYWdlIDEiOworICAgIGVsc2UgaWYobXNnID09IEVBUE9MX1BBSVJfTVNHXzIpCisgICAgICAgIHJldHVybiAiUGFpcndpc2UgTWVzc2FnZSAyIjsKKwllbHNlIGlmKG1zZyA9PSBFQVBPTF9QQUlSX01TR18zKQorICAgICAgICByZXR1cm4gIlBhaXJ3aXNlIE1lc3NhZ2UgMyI7CisJZWxzZSBpZihtc2cgPT0gRUFQT0xfUEFJUl9NU0dfNCkKKyAgICAgICAgcmV0dXJuICJQYWlyd2lzZSBNZXNzYWdlIDQiOworCWVsc2UgaWYobXNnID09IEVBUE9MX0dST1VQX01TR18xKQorICAgICAgICByZXR1cm4gIkdyb3VwIE1lc3NhZ2UgMSI7CisJZWxzZSBpZihtc2cgPT0gRUFQT0xfR1JPVVBfTVNHXzIpCisgICAgICAgIHJldHVybiAiR3JvdXAgTWVzc2FnZSAyIjsKKyAgICBlbHNlCisgICAgCXJldHVybiAiSW52YWxpZCBNZXNzYWdlIjsKK30KKworCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICBDaGVjayBTYW5pdHkgUlNOIElFIG9mIEVBUG9MIG1lc3NhZ2UKKworICAgIEFyZ3VtZW50czoKKworICAgIFJldHVybiBWYWx1ZToKKworCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworQk9PTEVBTiBSVE1QQ2hlY2tSU05JRSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBEYXRhLAorCUlOICBVQ0hBUiAgICAgICAgICAgRGF0YUxlbiwKKwlJTiAgTUFDX1RBQkxFX0VOVFJZICpwRW50cnksCisJT1VUCVVDSEFSCQkJKk9mZnNldCkKK3sKKwlQVUNIQVIgICAgICAgICAgICAgIHBWSUU7CisJVUNIQVIgICAgICAgICAgICAgICBsZW47CisJUEVJRF9TVFJVQ1QgICAgICAgICBwRWlkOworCUJPT0xFQU4JCQkJcmVzdWx0ID0gRkFMU0U7CisKKwlwVklFID0gcERhdGE7CisJbGVuCSA9IERhdGFMZW47CisJKk9mZnNldCA9IDA7CisKKwl3aGlsZSAobGVuID4gc2l6ZW9mKFJTTklFMikpCisJeworCQlwRWlkID0gKFBFSURfU1RSVUNUKSBwVklFOworCQkvLyBXUEEgUlNOIElFCisJCWlmICgocEVpZC0+RWlkID09IElFX1dQQSkgJiYgKE5kaXNFcXVhbE1lbW9yeShwRWlkLT5PY3RldCwgV1BBX09VSSwgNCkpKQorCQl7CisJCQlpZiAoKHBFbnRyeS0+QXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBIHx8IHBFbnRyeS0+QXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKSAmJgorCQkJCShOZGlzRXF1YWxNZW1vcnkocFZJRSwgcEVudHJ5LT5SU05fSUUsIHBFbnRyeS0+UlNOSUVfTGVuKSkgJiYKKwkJCQkocEVudHJ5LT5SU05JRV9MZW4gPT0gKHBFaWQtPkxlbiArIDIpKSkKKwkJCXsKKwkJCQkJcmVzdWx0ID0gVFJVRTsKKwkJCX0KKworCQkJKk9mZnNldCArPSAocEVpZC0+TGVuICsgMik7CisJCX0KKwkJLy8gV1BBMiBSU04gSUUKKwkJZWxzZSBpZiAoKHBFaWQtPkVpZCA9PSBJRV9SU04pICYmIChOZGlzRXF1YWxNZW1vcnkocEVpZC0+T2N0ZXQgKyAyLCBSU05fT1VJLCAzKSkpCisJCXsKKwkJCWlmICgocEVudHJ5LT5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyIHx8IHBFbnRyeS0+QXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykgJiYKKwkJCQkoTmRpc0VxdWFsTWVtb3J5KHBWSUUsIHBFbnRyeS0+UlNOX0lFLCBwRW50cnktPlJTTklFX0xlbikpICYmCisJCQkJKHBFbnRyeS0+UlNOSUVfTGVuID09IChwRWlkLT5MZW4gKyAyKSkvKiBUb0RvLUFsYmVydFkgZm9yIG1lc2gqLykKKwkJCXsKKwkJCQkJcmVzdWx0ID0gVFJVRTsKKwkJCX0KKworCQkJKk9mZnNldCArPSAocEVpZC0+TGVuICsgMik7CisJCX0KKwkJZWxzZQorCQl7CisJCQlicmVhazsKKwkJfQorCisJCXBWSUUgKz0gKHBFaWQtPkxlbiArIDIpOworCQlsZW4gIC09IChwRWlkLT5MZW4gKyAyKTsKKwl9CisKKworCXJldHVybiByZXN1bHQ7CisKK30KKworCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICBQYXJzZSBLRVlEQVRBIGZpZWxkLiAgS0VZREFUQVtdIE1heSBjb250YWluIDIgUlNOIElFIGFuZCBvcHRpb25hbGx5IEdUSy4KKyAgICBHVEsgIGlzIGVuY2FwdHVsYXRlZCBpbiBLREUgZm9ybWF0IGF0ICBwLjgzIDgwMi4xMWkgRDEwCisKKyAgICBBcmd1bWVudHM6CisKKyAgICBSZXR1cm4gVmFsdWU6CisKKyAgICBOb3RlOgorICAgICAgICA4MDIuMTFpIEQxMAorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworQk9PTEVBTiBSVE1QUGFyc2VFYXBvbEtleURhdGEoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFBVQ0hBUiAgICAgICAgICBwS2V5RGF0YSwKKwlJTiAgVUNIQVIgICAgICAgICAgIEtleURhdGFMZW4sCisJSU4JVUNIQVIJCQlHcm91cEtleUluZGV4LAorCUlOCVVDSEFSCQkJTXNnVHlwZSwKKwlJTglCT09MRUFOCQkJYldQQTIsCisJSU4gIE1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5KQoreworICAgIFBLREVfRU5DQVAgICAgICAgICAgcEtERSA9IE5VTEw7CisgICAgUFVDSEFSICAgICAgICAgICAgICBwTXlLZXlEYXRhID0gcEtleURhdGE7CisgICAgVUNIQVIgICAgICAgICAgICAgICBLZXlEYXRhTGVuZ3RoID0gS2V5RGF0YUxlbjsKKyAgICBVQ0hBUiAgICAgICAgICAgICAgIEdUS0xFTiA9IDA7CisJVUNIQVIJCQkJRGVmYXVsdElkeCA9IDA7CisJVUNIQVIJCQkJc2tpcF9vZmZzZXQ7CisKKwkvLyBWZXJpZnkgVGhlIFJTTiBJRSBjb250YWluZWQgaW4gcGFpcmV3aXNlX21zZ18yICYmIHBhaXJld2lzZV9tc2dfMyBhbmQgc2tpcCBpdAorCWlmIChNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzIgfHwgTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18zKQorICAgIHsKKwkJLy8gQ2hlY2sgUlNOIElFIHdoZXRoZXIgaXQgaXMgV1BBMi9XUEEyUFNLCisJCWlmICghUlRNUENoZWNrUlNOSUUocEFkLCBwS2V5RGF0YSwgS2V5RGF0YUxlbiwgcEVudHJ5LCAmc2tpcF9vZmZzZXQpKQorCQl7CisJCQkvLyBzZW5kIHdpcmVsZXNzIGV2ZW50IC0gZm9yIFJTTiBJRSBkaWZmZXJlbnQKKwkJCWlmIChwQWQtPkNvbW1vbkNmZy5iV2lyZWxlc3NFdmVudCkKKwkJCQlSVE1QU2VuZFdpcmVsZXNzRXZlbnQocEFkLCBJV19SU05JRV9ESUZGX0VWRU5UX0ZMQUcsIHBFbnRyeS0+QWRkciwgcEVudHJ5LT5hcGlkeCwgMCk7CisKKyAgICAgICAgCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlJTTl9JRSBEaWZmZXJlbnQgaW4gbXNnICVkIG9mIDQtd2F5IGhhbmRzaGFrZSFcbiIsIE1zZ1R5cGUpKTsKKwkJCWhleF9kdW1wKCJSZWNlaXZlIFJTTl9JRSAiLCBwS2V5RGF0YSwgS2V5RGF0YUxlbik7CisJCQloZXhfZHVtcCgiRGVzaXJlZCBSU05fSUUgIiwgcEVudHJ5LT5SU05fSUUsIHBFbnRyeS0+UlNOSUVfTGVuKTsKKworCQkJcmV0dXJuIEZBTFNFOworICAgIAl9CisgICAgCWVsc2UKKwkJeworCQkJaWYgKGJXUEEyICYmIE1zZ1R5cGUgPT0gRUFQT0xfUEFJUl9NU0dfMykKKwkJCXsKKwkJCQkvLyBza2lwIFJTTiBJRQorCQkJCXBNeUtleURhdGEgKz0gc2tpcF9vZmZzZXQ7CisJCQkJS2V5RGF0YUxlbmd0aCAtPSBza2lwX29mZnNldDsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVE1QUGFyc2VFYXBvbEtleURhdGEgPT0+IFdQQTIvV1BBMlBTSyBSU04gSUUgbWF0Y2hlZCBpbiBNc2cgMywgTGVuZ3RoKCVkKSBcbiIsIHNraXBfb2Zmc2V0KSk7CisJCQl9CisJCQllbHNlCisJCQkJcmV0dXJuIFRSVUU7CisJCX0KKwl9CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJUTVBQYXJzZUVhcG9sS2V5RGF0YSA9PT4gS2V5RGF0YUxlbmd0aCAlZCB3aXRob3V0IFJTTl9JRSBcbiIsIEtleURhdGFMZW5ndGgpKTsKKworCS8vIFBhcnNlIEVLRCBmb3JtYXQgaW4gcGFpcndpc2VfbXNnXzNfV1BBMiAmJiBncm91cF9tc2dfMV9XUEEyCisJaWYgKGJXUEEyICYmIChNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzMgfHwgTXNnVHlwZSA9PSBFQVBPTF9HUk9VUF9NU0dfMSkpCisJeworCQlpZiAoS2V5RGF0YUxlbmd0aCA+PSA4KQkvLyBLREUgZm9ybWF0IGV4Y2x1ZGUgR1RLIGxlbmd0aAorICAgIAl7CisgICAgICAgIAlwS0RFID0gKFBLREVfRU5DQVApIHBNeUtleURhdGE7CisKKworCQkJRGVmYXVsdElkeCA9IHBLREUtPkdUS0VuY2FwLktpZDsKKworCQkJLy8gU2FuaXR5IGNoZWNrIC0gS0VEIGxlbmd0aAorCQkJaWYgKEtleURhdGFMZW5ndGggPCAocEtERS0+TGVuICsgMikpCisgICAgCQl7CisgICAgICAgIAkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiRVJST1I6IFRoZSBsZW4gZnJvbSBLREUgaXMgdG9vIHNob3J0IFxuIikpOworICAgICAgICAJCXJldHVybiBGQUxTRTsKKyAgICAJCX0KKworCQkJLy8gR2V0IEdUSyBsZW5ndGggLSByZWZlciB0byBJRUVFIDgwMi4xMWktMjAwNCBwLjgyCisJCQlHVEtMRU4gPSBwS0RFLT5MZW4gLTY7CisJCQlpZiAoR1RLTEVOIDwgTEVOX0FFU19LRVkpCisJCQl7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiRVJST1I6IEdUSyBLZXkgbGVuZ3RoIGlzIHRvbyBzaG9ydCAoJWQpIFxuIiwgR1RLTEVOKSk7CisgICAgICAgIAkJcmV0dXJuIEZBTFNFOworCQkJfQorCisgICAgCX0KKwkJZWxzZQorICAgIAl7CisJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJFUlJPUjogS0RFIGZvcm1hdCBsZW5ndGggaXMgdG9vIHNob3J0IFxuIikpOworCSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIAl9CisKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiR1RLIGluIEtERSBmb3JtYXQgLERlZmF1bHRLZXlJRD0lZCwgS2V5TGVuPSVkIFxuIiwgRGVmYXVsdElkeCwgR1RLTEVOKSk7CisJCS8vIHNraXAgaXQKKwkJcE15S2V5RGF0YSArPSA4OworCQlLZXlEYXRhTGVuZ3RoIC09IDg7CisKKwl9CisJZWxzZSBpZiAoIWJXUEEyICYmIE1zZ1R5cGUgPT0gRUFQT0xfR1JPVVBfTVNHXzEpCisJeworCQlEZWZhdWx0SWR4ID0gR3JvdXBLZXlJbmRleDsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiR1RLIERlZmF1bHRLZXlJRD0lZCBcbiIsIERlZmF1bHRJZHgpKTsKKwl9CisKKwkvLyBTYW5pdHkgY2hlY2sgLSBzaGFyZWQga2V5IGluZGV4IG11c3QgYmUgMSB+IDMKKwlpZiAoRGVmYXVsdElkeCA8IDEgfHwgRGVmYXVsdElkeCA+IDMpCisgICAgeworICAgICAJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiRVJST1I6IEdUSyBLZXkgaW5kZXgoJWQpIGlzIGludmFsaWQgaW4gJXMgJXMgXG4iLCBEZWZhdWx0SWR4LCAoKGJXUEEyKSA/ICJXUEEyIiA6ICJXUEEiKSwgR2V0RWFwb2xNc2dUeXBlKE1zZ1R5cGUpKSk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCS8vIFRvZG8KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCXJldHVybiBUUlVFOworCit9CisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCUNvbnN0cnVjdCBFQVBvTCBtZXNzYWdlIGZvciBXUEEgaGFuZHNoYWtpbmcKKwkJSXRzIGZvcm1hdCBpcyBiZWxvdywKKworCQkrLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisJCXwgUHJvdG9jb2wgVmVyc2lvbgkgfCAgMSBvY3RldAorCQkrLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisJCXwgUHJvdG9jb2wgVHlwZQkJIHwJMSBvY3RldAorCQkrLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisJCXwgQm9keSBMZW5ndGgJCSB8ICAyIG9jdGV0cworCQkrLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisJCXwgRGVzY3JpcHRvciBUeXBlCSB8CTEgb2N0ZXQKKwkJKy0tLS0tLS0tLS0tLS0tLS0tLS0tKworCQl8IEtleSBJbmZvcm1hdGlvbiAgICB8CTIgb2N0ZXRzCisJCSstLS0tLS0tLS0tLS0tLS0tLS0tLSsKKwkJfCBLZXkgTGVuZ3RoCSAgICAgfCAgMSBvY3RldAorCQkrLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisJCXwgS2V5IFJlcGFseSBDb3VudGVyIHwJOCBvY3RldHMKKwkJKy0tLS0tLS0tLS0tLS0tLS0tLS0tKworCQl8IEtleSBOb25jZQkJICAgICB8ICAzMiBvY3RldHMKKwkJKy0tLS0tLS0tLS0tLS0tLS0tLS0tKworCQl8IEtleSBJVgkJCSB8ICAxNiBvY3RldHMKKwkJKy0tLS0tLS0tLS0tLS0tLS0tLS0tKworCQl8IEtleSBSU0MJCQkgfCAgOCBvY3RldHMKKwkJKy0tLS0tLS0tLS0tLS0tLS0tLS0tKworCQl8IEtleSBJRCBvciBSZXNlcnZlZCB8CTggb2N0ZXRzCisJCSstLS0tLS0tLS0tLS0tLS0tLS0tLSsKKwkJfCBLZXkgTUlDCQkJIHwJMTYgb2N0ZXRzCisJCSstLS0tLS0tLS0tLS0tLS0tLS0tLSsKKwkJfCBLZXkgRGF0YSBMZW5ndGgJIHwJMiBvY3RldHMKKwkJKy0tLS0tLS0tLS0tLS0tLS0tLS0tKworCQl8IEtleSBEYXRhCQkJIHwJbiBvY3RldHMKKwkJKy0tLS0tLS0tLS0tLS0tLS0tLS0tKworCisKKwlBcmd1bWVudHM6CisJCXBBZAkJCVBvaW50ZXIJdG8gb3VyIGFkYXB0ZXIKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJQ29uc3RydWN0RWFwb2xNc2coCisJSU4gCVBSVE1QX0FEQVBURVIgICAgCXBBZCwKKyAgICBJTiAJVUNIQVIJCQkJQXV0aE1vZGUsCisgICAgSU4gCVVDSEFSCQkJCVdlcFN0YXR1cywKKyAgICBJTiAJVUNIQVIJCQkJR3JvdXBLZXlXZXBTdGF0dXMsCisgICAgSU4gCVVDSEFSCQkJCU1zZ1R5cGUsCisgICAgSU4JVUNIQVIJCQkJRGVmYXVsdEtleUlkeCwKKyAgICBJTiAJVUNIQVIJCQkJKlJlcGxheUNvdW50ZXIsCisJSU4gCVVDSEFSCQkJCSpLZXlOb25jZSwKKwlJTglVQ0hBUgkJCQkqVHhSU0MsCisJSU4JVUNIQVIJCQkJKlBUSywKKwlJTglVQ0hBUgkJCQkqR1RLLAorCUlOCVVDSEFSCQkJCSpSU05JRSwKKwlJTglVQ0hBUgkJCQlSU05JRV9MZW4sCisgICAgT1VUIFBFQVBPTF9QQUNLRVQgICAgICAgcE1zZykKK3sKKwlCT09MRUFOCWJXUEEyID0gRkFMU0U7CisKKwkvLyBDaG9vc2UgV1BBMiBvciBub3QKKwlpZiAoKEF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIpIHx8IChBdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKSkKKwkJYldQQTIgPSBUUlVFOworCisgICAgLy8gSW5pdCBQYWNrZXQgYW5kIEZpbGwgaGVhZGVyCisgICAgcE1zZy0+UHJvVmVyID0gRUFQT0xfVkVSOworICAgIHBNc2ctPlByb1R5cGUgPSBFQVBPTEtleTsKKworCS8vIERlZmF1bHQgOTUgYnl0ZXMsIHRoZSBFQVBvTC1LZXkgZGVzY3JpcHRvciBleGNsdWRlIEtleS1kYXRhIGZpZWxkCisJcE1zZy0+Qm9keV9MZW5bMV0gPSBMRU5fRUFQT0xfS0VZX01TRzsKKworCS8vIEZpbGwgaW4gRUFQb0wgZGVzY3JpcHRvcgorCWlmIChiV1BBMikKKwkJcE1zZy0+S2V5RGVzYy5UeXBlID0gV1BBMl9LRVlfREVTQzsKKwllbHNlCisJCXBNc2ctPktleURlc2MuVHlwZSA9IFdQQTFfS0VZX0RFU0M7CisKKwkvLyBGaWxsIGluIEtleSBpbmZvcm1hdGlvbiwgcmVmZXIgdG8gSUVFRSBTdGQgODAyLjExaS0yMDA0IHBhZ2UgNzgKKwkvLyBXaGVuIGVpdGhlciB0aGUgcGFpcndpc2Ugb3IgdGhlIGdyb3VwIGNpcGhlciBpcyBBRVMsIHRoZSBERVNDX1RZUEVfQUVTKDIpIHNoYWxsIGJlIHVzZWQuCisJcE1zZy0+S2V5RGVzYy5LZXlJbmZvLktleURlc2NWZXIgPQorICAgICAgICAJKCgoV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpIHx8IChHcm91cEtleVdlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKSkgPyAoREVTQ19UWVBFX0FFUykgOiAoREVTQ19UWVBFX1RLSVApKTsKKworCS8vIFNwZWNpZnkgS2V5IFR5cGUgYXMgR3JvdXAoMCkgb3IgUGFpcndpc2UoMSkKKwlpZiAoTXNnVHlwZSA+PSBFQVBPTF9HUk9VUF9NU0dfMSkKKwkJcE1zZy0+S2V5RGVzYy5LZXlJbmZvLktleVR5cGUgPSBHUk9VUEtFWTsKKwllbHNlCisJCXBNc2ctPktleURlc2MuS2V5SW5mby5LZXlUeXBlID0gUEFJUldJU0VLRVk7CisKKwkvLyBTcGVjaWZ5IEtleSBJbmRleCwgb25seSBncm91cF9tc2cxX1dQQTEKKwlpZiAoIWJXUEEyICYmIChNc2dUeXBlID49IEVBUE9MX0dST1VQX01TR18xKSkKKwkJcE1zZy0+S2V5RGVzYy5LZXlJbmZvLktleUluZGV4ID0gRGVmYXVsdEtleUlkeDsKKworCWlmIChNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzMpCisJCXBNc2ctPktleURlc2MuS2V5SW5mby5JbnN0YWxsID0gMTsKKworCWlmICgoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18xKSB8fCAoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18zKSB8fCAoTXNnVHlwZSA9PSBFQVBPTF9HUk9VUF9NU0dfMSkpCisJCXBNc2ctPktleURlc2MuS2V5SW5mby5LZXlBY2sgPSAxOworCisJaWYgKE1zZ1R5cGUgIT0gRUFQT0xfUEFJUl9NU0dfMSkKKwkJcE1zZy0+S2V5RGVzYy5LZXlJbmZvLktleU1pYyA9IDE7CisKKwlpZiAoKGJXUEEyICYmIChNc2dUeXBlID49IEVBUE9MX1BBSVJfTVNHXzMpKSB8fCAoIWJXUEEyICYmIChNc2dUeXBlID49IEVBUE9MX0dST1VQX01TR18xKSkpCisgICAgeworICAgICAgIAlwTXNnLT5LZXlEZXNjLktleUluZm8uU2VjdXJlID0gMTsKKyAgICB9CisKKwlpZiAoYldQQTIgJiYgKChNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzMpIHx8IChNc2dUeXBlID09IEVBUE9MX0dST1VQX01TR18xKSkpCisgICAgeworICAgICAgICBwTXNnLT5LZXlEZXNjLktleUluZm8uRUtEX0RMID0gMTsKKyAgICB9CisKKwkvLyBrZXkgSW5mb3JtYXRpb24gZWxlbWVudCBoYXMgZG9uZS4KKwkqKFVTSE9SVCAqKSgmcE1zZy0+S2V5RGVzYy5LZXlJbmZvKSA9IGNwdTJsZTE2KCooVVNIT1JUICopKCZwTXNnLT5LZXlEZXNjLktleUluZm8pKTsKKworCS8vIEZpbGwgaW4gS2V5IExlbmd0aAorI2lmIDAKKwlpZiAoYldQQTIpCisJeworCQkvLyBJbiBXUEEyIG1vZGUsIHRoZSBmaWVsZCBpbmRpY2F0ZXMgdGhlIGxlbmd0aCBvZiBwYWlyd2lzZSBrZXkgY2lwaGVyLAorCQkvLyBzbyBvbmx5IHBhaXJ3aXNlX21zZ18xIGFuZCBwYWlyd2lzZV9tc2dfMyBuZWVkIHRvIGZpbGwuCisJCWlmICgoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18xKSB8fCAoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18zKSkKKwkJCXBNc2ctPktleURlc2MuS2V5TGVuZ3RoWzFdID0gKChXZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkgPyBMRU5fVEtJUF9LRVkgOiBMRU5fQUVTX0tFWSk7CisJfQorCWVsc2UgaWYgKCFiV1BBMikKKyNlbmRpZgorCXsKKwkJaWYgKE1zZ1R5cGUgPj0gRUFQT0xfR1JPVVBfTVNHXzEpCisJCXsKKwkJCS8vIHRoZSBsZW5ndGggb2YgZ3JvdXAga2V5IGNpcGhlcgorCQkJcE1zZy0+S2V5RGVzYy5LZXlMZW5ndGhbMV0gPSAoKEdyb3VwS2V5V2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpID8gVEtJUF9HVEtfTEVOR1RIIDogTEVOX0FFU19LRVkpOworCQl9CisJCWVsc2UKKwkJeworCQkJLy8gdGhlIGxlbmd0aCBvZiBwYWlyd2lzZSBrZXkgY2lwaGVyCisJCQlwTXNnLT5LZXlEZXNjLktleUxlbmd0aFsxXSA9ICgoV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpID8gTEVOX1RLSVBfS0VZIDogTEVOX0FFU19LRVkpOworCQl9CisJfQorCisgCS8vIEZpbGwgaW4gcmVwbGF5IGNvdW50ZXIKKyAgICBOZGlzTW92ZU1lbW9yeShwTXNnLT5LZXlEZXNjLlJlcGxheUNvdW50ZXIsIFJlcGxheUNvdW50ZXIsIExFTl9LRVlfREVTQ19SRVBMQVkpOworCisJLy8gRmlsbCBLZXkgTm9uY2UgZmllbGQKKwkvLyBBTm9uY2UgOiBwYWlyd2lzZV9tc2cxICYgcGFpcndpc2VfbXNnMworCS8vIFNOb25jZSA6IHBhaXJ3aXNlX21zZzIKKwkvLyBHTm9uY2UgOiBncm91cF9tc2cxX3dwYTEKKwlpZiAoKE1zZ1R5cGUgPD0gRUFQT0xfUEFJUl9NU0dfMykgfHwgKCghYldQQTIgJiYgKE1zZ1R5cGUgPT0gRUFQT0xfR1JPVVBfTVNHXzEpKSkpCisgICAgCU5kaXNNb3ZlTWVtb3J5KHBNc2ctPktleURlc2MuS2V5Tm9uY2UsIEtleU5vbmNlLCBMRU5fS0VZX0RFU0NfTk9OQ0UpOworCisJLy8gRmlsbCBrZXkgSVYgLSBXUEEyIGFzIDAsIFdQQTEgYXMgcmFuZG9tCisJaWYgKCFiV1BBMiAmJiAoTXNnVHlwZSA9PSBFQVBPTF9HUk9VUF9NU0dfMSkpCisJeworCQkvLyBTdWdnZXN0IElWIGJlIHJhbmRvbSBudW1iZXIgcGx1cyBzb21lIG51bWJlciwKKwkJTmRpc01vdmVNZW1vcnkocE1zZy0+S2V5RGVzYy5LZXlJdiwgJktleU5vbmNlWzE2XSwgTEVOX0tFWV9ERVNDX0lWKTsKKyAgICAgICAgcE1zZy0+S2V5RGVzYy5LZXlJdlsxNV0gKz0gMjsKKwl9CisKKyAgICAvLyBGaWxsIEtleSBSU0MgZmllbGQKKyAgICAvLyBJdCBjb250YWlucyB0aGUgUlNDIGZvciB0aGUgR1RLIGJlaW5nIGluc3RhbGxlZC4KKwlpZiAoKE1zZ1R5cGUgPT0gRUFQT0xfUEFJUl9NU0dfMyAmJiBiV1BBMikgfHwgKE1zZ1R5cGUgPT0gRUFQT0xfR1JPVVBfTVNHXzEpKQorCXsKKyAgICAgICAgTmRpc01vdmVNZW1vcnkocE1zZy0+S2V5RGVzYy5LZXlSc2MsIFR4UlNDLCA2KTsKKwl9CisKKwkvLyBDbGVhciBLZXkgTUlDIGZpZWxkIGZvciBNSUMgY2FsY3VsYXRpb24gbGF0ZXIKKyAgICBOZGlzWmVyb01lbW9yeShwTXNnLT5LZXlEZXNjLktleU1pYywgTEVOX0tFWV9ERVNDX01JQyk7CisKKwlDb25zdHJ1Y3RFYXBvbEtleURhdGEocEFkLAorCQkJCQkJICBBdXRoTW9kZSwKKwkJCQkJCSAgV2VwU3RhdHVzLAorCQkJCQkJICBHcm91cEtleVdlcFN0YXR1cywKKwkJCQkJCSAgTXNnVHlwZSwKKwkJCQkJCSAgRGVmYXVsdEtleUlkeCwKKwkJCQkJCSAgYldQQTIsCisJCQkJCQkgIFBUSywKKwkJCQkJCSAgR1RLLAorCQkJCQkJICBSU05JRSwKKwkJCQkJCSAgUlNOSUVfTGVuLAorCQkJCQkJICBwTXNnKTsKKworCS8vIENhbGN1bGF0ZSBNSUMgYW5kIGZpbGwgaW4gS2V5TWljIEZpZWxkIGV4Y2VwdCBQYWlyd2lzZSBNc2cgMS4KKwlpZiAoTXNnVHlwZSAhPSBFQVBPTF9QQUlSX01TR18xKQorCXsKKwkJQ2FsY3VsYXRlTUlDKHBBZCwgV2VwU3RhdHVzLCBQVEssIHBNc2cpOworCX0KKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT4gQ29uc3RydWN0RWFwb2xNc2cgZm9yICVzICVzXG4iLCAoKGJXUEEyKSA/ICJXUEEyIiA6ICJXUEEiKSwgR2V0RWFwb2xNc2dUeXBlKE1zZ1R5cGUpKSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiCSAgICAgQm9keSBsZW5ndGggPSAlZCBcbiIsIHBNc2ctPkJvZHlfTGVuWzFdKSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiCSAgICAgS2V5IGxlbmd0aCAgPSAlZCBcbiIsIHBNc2ctPktleURlc2MuS2V5TGVuZ3RoWzFdKSk7CisKKworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJQ29uc3RydWN0IHRoZSBLZXkgRGF0YSBmaWVsZCBvZiBFQVBvTCBtZXNzYWdlCisKKwlBcmd1bWVudHM6CisJCXBBZAkJCVBvaW50ZXIJdG8gb3VyIGFkYXB0ZXIKKwkJRWxlbQkJTWVzc2FnZSBib2R5CisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECUNvbnN0cnVjdEVhcG9sS2V5RGF0YSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVQ0hBUgkJCUF1dGhNb2RlLAorCUlOCVVDSEFSCQkJV2VwU3RhdHVzLAorCUlOCVVDSEFSCQkJR3JvdXBLZXlXZXBTdGF0dXMsCisJSU4gCVVDSEFSCQkJTXNnVHlwZSwKKwlJTglVQ0hBUgkJCURlZmF1bHRLZXlJZHgsCisJSU4JQk9PTEVBTgkJCWJXUEEyQ2FwYWJsZSwKKwlJTglVQ0hBUgkJCSpQVEssCisJSU4JVUNIQVIJCQkqR1RLLAorCUlOCVVDSEFSCQkJKlJTTklFLAorCUlOCVVDSEFSCQkJUlNOSUVfTEVOLAorCU9VVCBQRUFQT0xfUEFDS0VUICAgcE1zZykKK3sKKwlVQ0hBUgkJKm1wb29sLCAqS2V5X0RhdGEsICpSYzRHVEs7CisJVUNIQVIgICAgICAgZWtleVsoTEVOX0tFWV9ERVNDX0lWK0xFTl9FQVBfRUspXTsKKwlVQ0hBUgkJZGF0YV9vZmZzZXQ7CisKKworCWlmIChNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzEgfHwgTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR180IHx8IE1zZ1R5cGUgPT0gRUFQT0xfR1JPVVBfTVNHXzIpCisJCXJldHVybjsKKworCS8vIGFsbG9jYXRlIG1lbW9yeSBwb29sCisJb3NfYWxsb2NfbWVtKHBBZCwgKFBVQ0hBUiAqKSZtcG9vbCwgMTUwMCk7CisKKyAgICBpZiAobXBvb2wgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJLyogUmM0R1RLIExlbiA9IDUxMiAqLworCVJjNEdUSyA9IChVQ0hBUiAqKSBST1VORF9VUChtcG9vbCwgNCk7CisJLyogS2V5X0RhdGEgTGVuID0gNTEyICovCisJS2V5X0RhdGEgPSAoVUNIQVIgKikgUk9VTkRfVVAoUmM0R1RLICsgNTEyLCA0KTsKKworCU5kaXNaZXJvTWVtb3J5KEtleV9EYXRhLCA1MTIpOworCXBNc2ctPktleURlc2MuS2V5RGF0YUxlblsxXSA9IDA7CisJZGF0YV9vZmZzZXQgPSAwOworCisJLy8gRW5jYXBzdWxhdGUgUlNOSUUgaW4gcGFpcndpc2VfbXNnMiAmIHBhaXJ3aXNlX21zZzMKKwlpZiAoUlNOSUVfTEVOICYmICgoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18yKSB8fCAoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18zKSkpCisJeworCQlpZiAoYldQQTJDYXBhYmxlKQorCQkJS2V5X0RhdGFbZGF0YV9vZmZzZXQgKyAwXSA9IElFX1dQQTI7CisJCWVsc2UKKwkJCUtleV9EYXRhW2RhdGFfb2Zmc2V0ICsgMF0gPSBJRV9XUEE7CisKKyAgICAgICAgS2V5X0RhdGFbZGF0YV9vZmZzZXQgKyAxXSA9IFJTTklFX0xFTjsKKwkJTmRpc01vdmVNZW1vcnkoJktleV9EYXRhW2RhdGFfb2Zmc2V0ICsgMl0sIFJTTklFLCBSU05JRV9MRU4pOworCQlkYXRhX29mZnNldCArPSAoMiArIFJTTklFX0xFTik7CisJfQorCisJLy8gRW5jYXBzdWxhdGUgS0RFIGZvcm1hdCBpbiBwYWlyd2lzZV9tc2czX1dQQTIgJiBncm91cF9tc2cxX1dQQTIKKwlpZiAoYldQQTJDYXBhYmxlICYmICgoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18zKSB8fCAoTXNnVHlwZSA9PSBFQVBPTF9HUk9VUF9NU0dfMSkpKQorCXsKKwkJLy8gS2V5IERhdGEgRW5jYXBzdWxhdGlvbiAoS0RFKSBmb3JtYXQgLSA4MDIuMTFpLTIwMDQgIEZpZ3VyZS00M3cgYW5kIFRhYmxlLTIwaAorICAgICAgICBLZXlfRGF0YVtkYXRhX29mZnNldCArIDBdID0gMHhERDsKKworCQlpZiAoR3JvdXBLZXlXZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKKwkJeworCQkJS2V5X0RhdGFbZGF0YV9vZmZzZXQgKyAxXSA9IDB4MTY7Ly8gNCsyKzE2KE9VSStEYXRhVHlwZStEYXRhRmllbGQpCisJCX0KKwkJZWxzZQorCQl7CisJCQlLZXlfRGF0YVtkYXRhX29mZnNldCArIDFdID0gMHgyNjsvLyA0KzIrMzIoT1VJK0RhdGFUeXBlK0RhdGFGaWVsZCkKKwkJfQorCisgICAgICAgIEtleV9EYXRhW2RhdGFfb2Zmc2V0ICsgMl0gPSAweDAwOworICAgICAgICBLZXlfRGF0YVtkYXRhX29mZnNldCArIDNdID0gMHgwRjsKKyAgICAgICAgS2V5X0RhdGFbZGF0YV9vZmZzZXQgKyA0XSA9IDB4QUM7CisgICAgICAgIEtleV9EYXRhW2RhdGFfb2Zmc2V0ICsgNV0gPSAweDAxOworCisJCS8vIEdUSyBLREUgZm9ybWF0IC0gODAyLjExaS0yMDA0ICBGaWd1cmUtNDN4CisgICAgICAgIEtleV9EYXRhW2RhdGFfb2Zmc2V0ICsgNl0gPSAoRGVmYXVsdEtleUlkeCAmIDB4MDMpOworICAgICAgICBLZXlfRGF0YVtkYXRhX29mZnNldCArIDddID0gMHgwMDsJLy8gUmVzZXJ2ZWQgQnl0ZQorCisJCWRhdGFfb2Zmc2V0ICs9IDg7CisJfQorCisKKwkvLyBFbmNhcHN1bGF0ZSBHVEsgYW5kIGVuY3J5cHQgdGhlIGtleS1kYXRhIGZpZWxkIHdpdGggS0VLLgorCS8vIE9ubHkgZm9yIHBhaXJ3aXNlX21zZzNfV1BBMiBhbmQgZ3JvdXBfbXNnMQorCWlmICgoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18zICYmIGJXUEEyQ2FwYWJsZSkgfHwgKE1zZ1R5cGUgPT0gRUFQT0xfR1JPVVBfTVNHXzEpKQorCXsKKwkJLy8gRmlsbCBpbiBHVEsKKwkJaWYgKEdyb3VwS2V5V2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCisJCXsKKwkJCU5kaXNNb3ZlTWVtb3J5KCZLZXlfRGF0YVtkYXRhX29mZnNldF0sIEdUSywgTEVOX0FFU19LRVkpOworCQkJZGF0YV9vZmZzZXQgKz0gTEVOX0FFU19LRVk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlOZGlzTW92ZU1lbW9yeSgmS2V5X0RhdGFbZGF0YV9vZmZzZXRdLCBHVEssIFRLSVBfR1RLX0xFTkdUSCk7CisJCQlkYXRhX29mZnNldCArPSBUS0lQX0dUS19MRU5HVEg7CisJCX0KKworCQkvLyBTdGlsbCBkb250IGtub3cgd2h5LCBidXQgaWYgbm90IGFwcGVuZCB3aWxsIG9jY3VyICJHVEsgbm90IGluY2x1ZGUgaW4gTVNHMyIKKwkJLy8gUGF0Y2ggZm9yIGNvbXBhdGliaWxpdHkgYmV0d2VlbiB6ZXJvIGNvbmZpZyBhbmQgZnVuaworCQlpZiAoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18zICYmIGJXUEEyQ2FwYWJsZSkKKwkJeworCQkJaWYgKEdyb3VwS2V5V2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCisJCQl7CisJCQkJS2V5X0RhdGFbZGF0YV9vZmZzZXQgKyAwXSA9IDB4REQ7CisJCQkJS2V5X0RhdGFbZGF0YV9vZmZzZXQgKyAxXSA9IDA7CisJCQkJZGF0YV9vZmZzZXQgKz0gMjsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlLZXlfRGF0YVtkYXRhX29mZnNldCArIDBdID0gMHhERDsKKwkJCQlLZXlfRGF0YVtkYXRhX29mZnNldCArIDFdID0gMDsKKwkJCQlLZXlfRGF0YVtkYXRhX29mZnNldCArIDJdID0gMDsKKwkJCQlLZXlfRGF0YVtkYXRhX29mZnNldCArIDNdID0gMDsKKwkJCQlLZXlfRGF0YVtkYXRhX29mZnNldCArIDRdID0gMDsKKwkJCQlLZXlfRGF0YVtkYXRhX29mZnNldCArIDVdID0gMDsKKwkJCQlkYXRhX29mZnNldCArPSA2OworCQkJfQorCQl9CisKKwkJLy8gRW5jcnlwdCB0aGUgZGF0YSBtYXRlcmlhbCBpbiBrZXkgZGF0YSBmaWVsZAorCQlpZiAoV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCisJCXsKKwkJCUFFU19HVEtfS0VZX1dSQVAoJlBUS1sxNl0sIEtleV9EYXRhLCBkYXRhX29mZnNldCwgUmM0R1RLKTsKKyAgICAgICAgICAgIC8vIEFFUyB3cmFwIGZ1bmN0aW9uIHdpbGwgZ3JvdyA4IGJ5dGVzIGluIGxlbmd0aAorICAgICAgICAgICAgZGF0YV9vZmZzZXQgKz0gODsKKwkJfQorCQllbHNlCisJCXsKKwkJCS8vIFBSRVBBUkUgRW5jcnlwdGVkICAiS2V5IERBVEEiIGZpZWxkLiAgKEVuY3J5cHQgR1RLIHdpdGggUkM0LCB1c2luZiBQVEtbMTZdLT5bMzFdIGFzIEtleSwgSVYtZmllbGQgYXMgSVYpCisJCQkvLyBwdXQgVHhUc2MgaW4gS2V5IFJTQyBmaWVsZAorCQkJcEFkLT5Qcml2YXRlSW5mby5GQ1NDUkMzMiA9IFBQUElOSVRGQ1MzMjsgICAvL0luaXQgY3JjMzIuCisKKwkJCS8vIGVrZXkgaXMgdGhlIGNvbnRhbmV0aW9uIG9mIElWLWZpZWxkLCBhbmQgUFRLWzE2XS0+UFRLWzMxXQorCQkJTmRpc01vdmVNZW1vcnkoZWtleSwgcE1zZy0+S2V5RGVzYy5LZXlJdiwgTEVOX0tFWV9ERVNDX0lWKTsKKwkJCU5kaXNNb3ZlTWVtb3J5KCZla2V5W0xFTl9LRVlfREVTQ19JVl0sICZQVEtbMTZdLCBMRU5fRUFQX0VLKTsKKwkJCUFSQ0ZPVVJfSU5JVCgmcEFkLT5Qcml2YXRlSW5mby5XRVBDT05URVhULCBla2V5LCBzaXplb2YoZWtleSkpOyAgLy9JTklUIFNCT1gsIEtFWUxFTiszKElWKQorCQkJcEFkLT5Qcml2YXRlSW5mby5GQ1NDUkMzMiA9IFJUTVBfQ0FMQ19GQ1MzMihwQWQtPlByaXZhdGVJbmZvLkZDU0NSQzMyLCBLZXlfRGF0YSwgZGF0YV9vZmZzZXQpOworCQkJV1BBQVJDRk9VUl9FTkNSWVBUKCZwQWQtPlByaXZhdGVJbmZvLldFUENPTlRFWFQsIFJjNEdUSywgS2V5X0RhdGEsIGRhdGFfb2Zmc2V0KTsKKwkJfQorCisJCU5kaXNNb3ZlTWVtb3J5KHBNc2ctPktleURlc2MuS2V5RGF0YSwgUmM0R1RLLCBkYXRhX29mZnNldCk7CisJfQorCWVsc2UKKwl7CisJCU5kaXNNb3ZlTWVtb3J5KHBNc2ctPktleURlc2MuS2V5RGF0YSwgS2V5X0RhdGEsIGRhdGFfb2Zmc2V0KTsKKwl9CisKKwkvLyBzZXQga2V5IGRhdGEgbGVuZ3RoIGZpZWxkIGFuZCB0b3RhbCBsZW5ndGgKKwlwTXNnLT5LZXlEZXNjLktleURhdGFMZW5bMV0gPSBkYXRhX29mZnNldDsKKyAgICBwTXNnLT5Cb2R5X0xlblsxXSArPSBkYXRhX29mZnNldDsKKworCW9zX2ZyZWVfbWVtKHBBZCwgbXBvb2wpOworCit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlDYWxjYXVsYXRlIE1JQy4gSXQgaXMgdXNlZCBkdXJpbmcgNC13YXlzIGhhbmRzaGFya2luZy4KKworCUFyZ3VtZW50czoKKwkJcEFkCQkJCS0JcG9pbnRlciB0byBvdXIgcEFkYXB0ZXIgY29udGV4dAorICAgIAlQZWVyV2VwU3RhdHVzCS0JaW5kaWNhdGUgdGhlIGVuY3J5cHRpb24gdHlwZQorCisJUmV0dXJuIFZhbHVlOgorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJQ2FsY3VsYXRlTUlDKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVDSEFSCQkJUGVlcldlcFN0YXR1cywKKwlJTglVQ0hBUgkJCSpQVEssCisJT1VUIFBFQVBPTF9QQUNLRVQgICBwTXNnKQoreworICAgIFVDSEFSICAgKk91dEJ1ZmZlcjsKKwlVTE9ORwlGcmFtZUxlbiA9IDA7CisJVUNIQVIJbWljW0xFTl9LRVlfREVTQ19NSUNdOworCVVDSEFSCWRpZ2VzdFs4MF07CisKKwkvLyBhbGxvY2F0ZSBtZW1vcnkgZm9yIE1JQyBjYWxjdWxhdGlvbgorCW9zX2FsbG9jX21lbShwQWQsIChQVUNIQVIgKikmT3V0QnVmZmVyLCA1MTIpOworCisgICAgaWYgKE91dEJ1ZmZlciA9PSBOVUxMKQorICAgIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiISEhQ2FsY3VsYXRlTUlDOiBubyBtZW1vcnkhISFcbiIpKTsKKwkJcmV0dXJuOworICAgIH0KKworCS8vIG1ha2UgYSBmcmFtZSBmb3IgY2FsY3VsYXRpbmcgTUlDLgorICAgIE1ha2VPdXRnb2luZ0ZyYW1lKE91dEJ1ZmZlciwgICAgICAgICAgICAJJkZyYW1lTGVuLAorICAgICAgICAgICAgICAgICAgICAgIHBNc2ctPkJvZHlfTGVuWzFdICsgNCwgIAlwTXNnLAorICAgICAgICAgICAgICAgICAgICAgIEVORF9PRl9BUkdTKTsKKworCU5kaXNaZXJvTWVtb3J5KG1pYywgc2l6ZW9mKG1pYykpOworCisJLy8gQ2FsY3VsYXRlIE1JQworICAgIGlmIChQZWVyV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCisgCXsKKwkJSE1BQ19TSEExKE91dEJ1ZmZlciwgIEZyYW1lTGVuLCBQVEssIExFTl9FQVBfTUlDSywgZGlnZXN0KTsKKwkJTmRpc01vdmVNZW1vcnkobWljLCBkaWdlc3QsIExFTl9LRVlfREVTQ19NSUMpOworCX0KKwllbHNlCisJeworCQlobWFjX21kNShQVEssICBMRU5fRUFQX01JQ0ssIE91dEJ1ZmZlciwgRnJhbWVMZW4sIG1pYyk7CisJfQorCisJLy8gc3RvcmUgdGhlIGNhbGN1bGF0ZWQgTUlDCisJTmRpc01vdmVNZW1vcnkocE1zZy0+S2V5RGVzYy5LZXlNaWMsIG1pYywgTEVOX0tFWV9ERVNDX01JQyk7CisKKwlvc19mcmVlX21lbShwQWQsIE91dEJ1ZmZlcik7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlTb21lIHJlY2VpdmVkIGZyYW1lcyBjYW4ndCBkZWNyeXB0IGJ5IEFzaWMsIHNvIGRlY3J5cHQgdGhlbSBieSBzb2Z0d2FyZS4KKworCUFyZ3VtZW50czoKKwkJcEFkCQkJCS0JcG9pbnRlciB0byBvdXIgcEFkYXB0ZXIgY29udGV4dAorICAgIAlQZWVyV2VwU3RhdHVzCS0JaW5kaWNhdGUgdGhlIGVuY3J5cHRpb24gdHlwZQorCisJUmV0dXJuIFZhbHVlOgorCQlORElTX1NUQVRVU19TVUNDRVNTCQktCWRlY3J5cHRpb24gc3VjY2Vzc2Z1bAorCQlORElTX1NUQVRVU19GQUlMVVJFCQktCWRlY3J5cHRpb24gZmFpbHVyZQorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworTkRJU19TVEFUVVMJUlRNUFNvZnREZWNyeXB0QnJvYWRDYXN0RGF0YSgKKwlJTglQUlRNUF9BREFQVEVSCQkJCQlwQWQsCisJSU4JUlhfQkxLCQkJCQkJCSpwUnhCbGssCisJSU4gIE5ESVNfODAyXzExX0VOQ1JZUFRJT05fU1RBVFVTIAlHcm91cENpcGhlciwKKwlJTiAgUENJUEhFUl9LRVkJCQkJCQlwU2hhcmRfa2V5KQoreworCVBSWFdJX1NUUlVDCQkJcFJ4V0kgPSBwUnhCbGstPnBSeFdJOworCisKKworCS8vIGhhbmRsZSBXRVAgZGVjcnlwdGlvbgorCWlmIChHcm91cENpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjFFbmFibGVkKQorICAgIHsKKwkJaWYgKFJUTVBTb2Z0RGVjcnlwdFdFUChwQWQsIHBSeEJsay0+cERhdGEsIHBSeFdJLT5NUERVdG90YWxCeXRlQ291bnQsIHBTaGFyZF9rZXkpKQorCQl7CisKKwkJCS8vTWludXMgSVZbNF0gJiBJQ1ZbNF0KKwkJCXBSeFdJLT5NUERVdG90YWxCeXRlQ291bnQgLT0gODsKKwkJfQorCQllbHNlCisJCXsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkVSUk9SIDogU29mdHdhcmUgZGVjcnlwdCBXRVAgZGF0YSBmYWlscy5cbiIpKTsKKwkJCS8vIGdpdmUgdXAgdGhpcyBmcmFtZQorCQkJcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkU7CisJCX0KKwl9CisJLy8gaGFuZGxlIFRLSVAgZGVjcnlwdGlvbgorCWVsc2UgaWYgKEdyb3VwQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpCisJeworCQlpZiAoUlRNUFNvZnREZWNyeXB0VEtJUChwQWQsIHBSeEJsay0+cERhdGEsIHBSeFdJLT5NUERVdG90YWxCeXRlQ291bnQsIDAsIHBTaGFyZF9rZXkpKQorCQl7CisKKwkJCS8vTWludXMgOCBieXRlcyBNSUMsIDggYnl0ZXMgSVYvRUlWLCA0IGJ5dGVzIElDVgorCQkJcFJ4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudCAtPSAyMDsKKwkJfQorICAgICAgICBlbHNlCisJCXsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkVSUk9SIDogUlRNUFNvZnREZWNyeXB0VEtJUCBGYWlsZWRcbiIpKTsKKwkJCS8vIGdpdmUgdXAgdGhpcyBmcmFtZQorCQkJcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkU7CisgICAgICAgIH0KKwl9CisJLy8gaGFuZGxlIEFFUyBkZWNyeXB0aW9uCisJZWxzZSBpZiAoR3JvdXBDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKKwl7CisJCWlmIChSVE1QU29mdERlY3J5cHRBRVMocEFkLCBwUnhCbGstPnBEYXRhLCBwUnhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50ICwgcFNoYXJkX2tleSkpCisJCXsKKworCQkJLy84IGJ5dGVzIE1JQywgOCBieXRlcyBJVi9FSVYgKENDTVAgSGVhZGVyKQorCQkJcFJ4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudCAtPSAxNjsKKwkJfQorCQllbHNlCisJCXsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkVSUk9SIDogUlRNUFNvZnREZWNyeXB0QUVTIEZhaWxlZFxuIikpOworCQkJLy8gZ2l2ZSB1cCB0aGlzIGZyYW1lCisJCQlyZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRTsKKwkJfQorCX0KKwllbHNlCisJeworCQkvLyBnaXZlIHVwIHRoaXMgZnJhbWUKKwkJcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkU7CisJfQorCisJcmV0dXJuIE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vZGZzLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9kZnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDliYmE1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vZGZzLmMKQEAgLTAsMCArMSw0NTMgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgTW9kdWxlIE5hbWU6CisgICAgYXBfZGZzLmMKKworICAgIEFic3RyYWN0OgorICAgIFN1cHBvcnQgREZTIGZ1bmN0aW9uLgorCisgICAgUmV2aXNpb24gSGlzdG9yeToKKyAgICBXaG8gICAgICAgV2hlbiAgICAgICAgICAgIFdoYXQKKyAgICAtLS0tLS0tLSAgLS0tLS0tLS0tLSAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBGb25jaGkgICAgMDMtMTItMjAwNyAgICAgIGNyZWF0ZWQKKyovCisKKyNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKKwordHlwZWRlZiBzdHJ1Y3QgX1JBREFSX0RVUkFUSU9OX1RBQkxFCit7CisJVUxPTkcgUkREdXJSZWdpb247CisJVUxPTkcgUmFkYXJTaWduYWxEdXJhdGlvbjsKKwlVTE9ORyBUb2xlcmFuY2U7Cit9IFJBREFSX0RVUkFUSU9OX1RBQkxFLCAqUFJBREFSX0RVUkFUSU9OX1RBQkxFOworCisKK3N0YXRpYyBVQ0hBUiBSZElkbGVUaW1lVGFibGVbTUFYX1JEX1JFR0lPTl1bNF0gPQoreworCXs5LCAyNTAsIDI1MCwgMjUwfSwJCS8vIENFCisJezQsIDI1MCwgMjUwLCAyNTB9LAkJLy8gRkNDCisJezQsIDI1MCwgMjUwLCAyNTB9LAkJLy8gSkFQCisJezE1LCAyNTAsIDI1MCwgMjUwfSwJLy8gSkFQX1c1MworCXs0LCAyNTAsIDI1MCwgMjUwfQkJLy8gSkFQX1c1NgorfTsKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCUJicCBSYWRhciBkZXRlY3Rpb24gcm91dGluZQorCisJQXJndW1lbnRzOgorCQlwQWQgCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKworCVJldHVybiBWYWx1ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgQmJwUmFkYXJEZXRlY3Rpb25TdGFydCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlVSU5UOCBSYWRhclBlcmlvZDsKKworCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCAxMTQsIDB4MDIpOworCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCAxMjEsIDB4MjApOworCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCAxMjIsIDB4MDApOworCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCAxMjMsIDB4MDgvKjB4ODAqLyk7CisJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIDEyNCwgMHgyOCk7CisJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIDEyNSwgMHhmZik7CisKKyNpZiAwCisJLy8gdG9nZ2xlIFJ4IGVuYWJsZSBiaXQgZm9yIHJhZGFyIGRldGVjdGlvbi4KKwkvLyBpdCdzIEFuZHkncyByZWNvbW1hbmQuCisJeworCQlVSU5UMzIgVmFsdWU7CisJUlRNUF9JT19SRUFEMzIocEFkLCBNQUNfU1lTX0NUUkwsICZWYWx1ZSk7CisJVmFsdWUgfD0gKDB4MSA8PCAzKTsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIFZhbHVlKTsKKwlWYWx1ZSAmPSB+KDB4MSA8PCAzKTsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIFZhbHVlKTsKKwl9CisjZW5kaWYKKwlSYWRhclBlcmlvZCA9ICgoVUlOVClSZElkbGVUaW1lVGFibGVbcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkREdXJSZWdpb25dWzBdICsgKFVJTlQpcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuRGZzU2Vzc2lvblRpbWUpIDwgMjUwID8KKwkJCShSZElkbGVUaW1lVGFibGVbcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkREdXJSZWdpb25dWzBdICsgcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuRGZzU2Vzc2lvblRpbWUpIDogMjUwOworCisJUlRNUF9JT19XUklURTgocEFkLCAweDcwMjAsIDB4MWQpOworCVJUTVBfSU9fV1JJVEU4KHBBZCwgMHg3MDIxLCAweDQwKTsKKworCVJhZGFyRGV0ZWN0aW9uU3RhcnQocEFkLCAwLCBSYWRhclBlcmlvZCk7CisJcmV0dXJuOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJQmJwIFJhZGFyIGRldGVjdGlvbiByb3V0aW5lCisKKwlBcmd1bWVudHM6CisJCXBBZCAJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCisJUmV0dXJuIFZhbHVlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBCYnBSYWRhckRldGVjdGlvblN0b3AoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJUlRNUF9JT19XUklURTgocEFkLCAweDcwMjAsIDB4MWQpOworCVJUTVBfSU9fV1JJVEU4KHBBZCwgMHg3MDIxLCAweDYwKTsKKworCVJhZGFyRGV0ZWN0aW9uU3RvcChwQWQpOworCXJldHVybjsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVJhZGFyIGRldGVjdGlvbiByb3V0aW5lCisKKwlBcmd1bWVudHM6CisJCXBBZCAJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCisJUmV0dXJuIFZhbHVlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBSYWRhckRldGVjdGlvblN0YXJ0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIEJPT0xFQU4gQ1RTUHJvdGVjdCwKKwlJTiBVSU5UOCBDVFNQZXJpb2QpCit7CisJVUlOVDggRGZzQWN0aXZlVGltZSA9IChwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5EZnNTZXNzaW9uVGltZSAmIDB4MWYpOworCVVJTlQ4IEN0c1Byb3RlY3QgPSAoQ1RTUHJvdGVjdCA9PSAxKSA/IDB4MDIgOiAweDAxOyAvLyBDVFMgcHJvdGVjdC4KKworCWlmIChDVFNQcm90ZWN0ICE9IDApCisJeworCQlzd2l0Y2gocEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkREdXJSZWdpb24pCisJCXsKKwkJY2FzZSBGQ0M6CisJCWNhc2UgSkFQX1c1NjoKKwkJCUN0c1Byb3RlY3QgPSAweDAzOworCQkJYnJlYWs7CisKKwkJY2FzZSBDRToKKwkJY2FzZSBKQVBfVzUzOgorCQlkZWZhdWx0OgorCQkJQ3RzUHJvdGVjdCA9IDB4MDI7CisJCQlicmVhazsKKwkJfQorCX0KKwllbHNlCisJCUN0c1Byb3RlY3QgPSAweDAxOworCisKKwkvLyBzZW5kIHN0YXJ0LVJEIHdpdGggQ1RTIHByb3RlY3Rpb24gY29tbWFuZCB0byBNQ1UKKwkvLyBoaWdoYnl0ZSBbN10JCXJlc2VydmUKKwkvLyBoaWdoYnl0ZSBbNjo1XQkweDogc3RvcCBDYXJyaWVyL1JhZGFyIGRldGVjdGlvbgorCS8vIGhpZ2hieXRlIFsxMF06CVN0YXJ0IENhcnJpZXIvUmFkYXIgZGV0ZWN0aW9uIHdpdGhvdXQgQ1RTIHByb3RlY3Rpb24sIDExOiBTdGFydCBDYXJyaWVyL1JhZGFyIGRldGVjdGlvbiB3aXRoIENUUyBwcm90ZWN0aW9uCisJLy8gaGlnaGJ5dGUgWzQ6MF0JUmFkYXIvY2FycmllciBkZXRlY3Rpb24gZHVyYXRpb24uIEluIDFtcy4KKworCS8vIGxvd2J5dGUgWzc6MF0JUmFkYXIvY2FycmllciBkZXRlY3Rpb24gcGVyaW9kLCBpbiAxbXMuCisJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDYwLCAweGZmLCBDVFNQZXJpb2QsIERmc0FjdGl2ZVRpbWUgfCAoQ3RzUHJvdGVjdCA8PCA1KSk7CisJLy9Bc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4NjMsIDB4ZmYsIDEwLCAwKTsKKworCXJldHVybjsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVJhZGFyIGRldGVjdGlvbiByb3V0aW5lCisKKwlBcmd1bWVudHM6CisJCXBBZCAJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCisJUmV0dXJuIFZhbHVlOgorCQlUUlVFCUZvdW5kIHJhZGFyIHNpZ25hbAorCQlGQUxTRQlOb3QgZm91bmQgcmFkYXIgc2lnbmFsCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIFJhZGFyRGV0ZWN0aW9uU3RvcCgKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCkKK3sKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJhZGFyRGV0ZWN0aW9uU3RvcC5cbiIpKTsKKwlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4NjAsIDB4ZmYsIDB4MDAsIDB4MDApOwkvLyBzZW5kIHN0YXJ0LVJEIHdpdGggQ1RTIHByb3RlY3Rpb24gY29tbWFuZCB0byBNQ1UKKworCXJldHVybjsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVJhZGFyIGNoYW5uZWwgY2hlY2sgcm91dGluZQorCisJQXJndW1lbnRzOgorCQlwQWQgCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKworCVJldHVybiBWYWx1ZToKKwkJVFJVRQluZWVkIHRvIGRvIHJhZGFyIGRldGVjdAorCQlGQUxTRQluZWVkIG5vdCB0byBkbyByYWRhciBkZXRlY3QKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0JPT0xFQU4gUmFkYXJDaGFubmVsQ2hlY2soCisJSU4gUFJUTVBfQURBUFRFUglwQWQsCisJSU4gVUNIQVIJCQlDaCkKK3sKKyNpZiAxCisJSU5UCQlpOworCUJPT0xFQU4gcmVzdWx0ID0gRkFMU0U7CisKKwlmb3IgKGk9MDsgaTxwQWQtPkNoYW5uZWxMaXN0TnVtOyBpKyspCisJeworCQlpZiAoQ2ggPT0gcEFkLT5DaGFubmVsTGlzdFtpXS5DaGFubmVsKQorCQl7CisJCQlyZXN1bHQgPSBwQWQtPkNoYW5uZWxMaXN0W2ldLkRmc1JlcTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuIHJlc3VsdDsKKyNlbHNlCisJSU5UCQlpOworCVVDSEFSCUNoYW5uZWxbMTVdPXs1MiwgNTYsIDYwLCA2NCwgMTAwLCAxMDQsIDEwOCwgMTEyLCAxMTYsIDEyMCwgMTI0LCAxMjgsIDEzMiwgMTM2LCAxNDB9OworCisJZm9yIChpPTA7IGk8MTU7IGkrKykKKwl7CisJCWlmIChDaCA9PSBDaGFubmVsW2ldKQorCQl7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChpICE9IDE1KQorCQlyZXR1cm4gVFJVRTsKKwllbHNlCisJCXJldHVybiBGQUxTRTsKKyNlbmRpZgorfQorCitVTE9ORyBKYXBSYWRhclR5cGUoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJVUxPTkcJCWk7CisJY29uc3QgVUNIQVIJQ2hhbm5lbFsxNV09ezUyLCA1NiwgNjAsIDY0LCAxMDAsIDEwNCwgMTA4LCAxMTIsIDExNiwgMTIwLCAxMjQsIDEyOCwgMTMyLCAxMzYsIDE0MH07CisKKwlpZiAocEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkREdXJSZWdpb24gIT0gSkFQKQorCXsKKwkJcmV0dXJuIHBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJERHVyUmVnaW9uOworCX0KKworCWZvciAoaT0wOyBpPDE1OyBpKyspCisJeworCQlpZiAocEFkLT5Db21tb25DZmcuQ2hhbm5lbCA9PSBDaGFubmVsW2ldKQorCQl7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChpIDwgNCkKKwkJcmV0dXJuIEpBUF9XNTM7CisJZWxzZSBpZiAoaSA8IDE1KQorCQlyZXR1cm4gSkFQX1c1NjsKKwllbHNlCisJCXJldHVybiBKQVA7IC8vIFc1MgorCit9CisKK1VMT05HIFJUTVBCYnBSZWFkUmFkYXJEdXJhdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCkKK3sKKwlVSU5UOCBieXRlVmFsdWUgPSAwOworCVVMT05HIHJlc3VsdDsKKworCUJCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjExNSwgJmJ5dGVWYWx1ZSk7CisKKwlyZXN1bHQgPSAwOworCXN3aXRjaCAoYnl0ZVZhbHVlKQorCXsKKwljYXNlIDE6IC8vIHJhZGFyIHNpZ25hbCBkZXRlY3RlZCBieSBwdWxzZSBtb2RlLgorCWNhc2UgMjogLy8gcmFkYXIgc2lnbmFsIGRldGVjdGVkIGJ5IHdpZHRoIG1vZGUuCisJCXJlc3VsdCA9IFJUTVBSZWFkUmFkYXJEdXJhdGlvbihwQWQpOworCQlicmVhazsKKworCWNhc2UgMDogLy8gTm8gcmFkYXIgc2lnbmFsLgorCWRlZmF1bHQ6CisKKwkJcmVzdWx0ID0gMDsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJlc3VsdDsKK30KKworVUxPTkcgUlRNUFJlYWRSYWRhckR1cmF0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIJcEFkKQoreworCVVMT05HIHJlc3VsdCA9IDA7CisKKyNpZmRlZiBERlNfU1VQUE9SVAorCVVJTlQ4IGR1cmF0aW9uMSA9IDAsIGR1cmF0aW9uMiA9IDAsIGR1cmF0aW9uMyA9IDA7CisKKwlCQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IxMTYsICZkdXJhdGlvbjEpOworCUJCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjExNywgJmR1cmF0aW9uMik7CisJQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMTE4LCAmZHVyYXRpb24zKTsKKwlyZXN1bHQgPSAoZHVyYXRpb24xIDw8IDE2KSArIChkdXJhdGlvbjIgPDwgOCkgKyBkdXJhdGlvbjM7CisjZW5kaWYgLy8gREZTX1NVUFBPUlQgLy8KKworCXJldHVybiByZXN1bHQ7CisKK30KKworVk9JRCBSVE1QQ2xlYW5SYWRhckR1cmF0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIJcEFkKQoreworCXJldHVybjsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgICAgICBSYWRhciB3YXZlIGRldGVjdGlvbi4gVGhlIEFQSSBzaG91bGQgYmUgaW52b2tlIGVhY2ggc2Vjb25kLgorCisgICAgQXJndW1lbnRzOgorICAgICAgICBwQWQgICAgICAgICAtIEFkYXB0ZXIgcG9pbnRlcgorCisgICAgUmV0dXJuIFZhbHVlOgorICAgICAgICBOb25lCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIEFwUmFkYXJEZXRlY3RQZXJpb2RpYygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlJTlQJaTsKKworCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LkluU2VydmljZU1vbml0b3JDb3VudCsrOworCisJZm9yIChpPTA7IGk8cEFkLT5DaGFubmVsTGlzdE51bTsgaSsrKQorCXsKKwkJaWYgKHBBZC0+Q2hhbm5lbExpc3RbaV0uUmVtYWluaW5nVGltZUZvclVzZSA+IDApCisJCXsKKwkJCXBBZC0+Q2hhbm5lbExpc3RbaV0uUmVtYWluaW5nVGltZUZvclVzZSAtLTsKKwkJCWlmICgocEFkLT5NbG1lLlBlcmlvZGljUm91bmQlNSkgPT0gMCkKKwkJCXsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSYWRhckRldGVjdFBlcmlvZGljIC0gY2g9JWQsIFJlbWFpbmluZ1RpbWVGb3JVc2U9JWRcbiIsIHBBZC0+Q2hhbm5lbExpc3RbaV0uQ2hhbm5lbCwgcEFkLT5DaGFubmVsTGlzdFtpXS5SZW1haW5pbmdUaW1lRm9yVXNlKSk7CisJCQl9CisJCX0KKwl9CisKKwkvL3JhZGFyIGRldGVjdAorCWlmICgocEFkLT5Db21tb25DZmcuQ2hhbm5lbCA+IDE0KQorCQkmJiAocEFkLT5Db21tb25DZmcuYklFRUU4MDIxMUggPT0gMSkKKwkJJiYgUmFkYXJDaGFubmVsQ2hlY2socEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKSkKKwl7CisJCVJhZGFyRGV0ZWN0UGVyaW9kaWMocEFkKTsKKwl9CisKKwlyZXR1cm47Cit9CisKKy8vIFBlcmlvZGljIFJhZGFyIGRldGVjdGlvbiwgc3dpdGNoIGNoYW5uZWwgd2lsbCBvY2N1ciBpbiBSVE1QSGFuZGxlVEJUVEludGVycnVwdCgpCisvLyBCZWZvcmUgc3dpdGNoIGNoYW5uZWwsIGRyaXZlciBuZWVkcyBkb2luZyBjaGFubmVsIHN3aXRjaCBhbm5vdW5jZW1lbnQuCitWT0lEIFJhZGFyRGV0ZWN0UGVyaW9kaWMoCisJSU4gUFJUTVBfQURBUFRFUglwQWQpCit7CisJLy8gbmVlZCB0byBjaGVjayBjaGFubmVsIGF2YWlsYWJpbGl0eSwgYWZ0ZXIgc3dpdGNoIGNoYW5uZWwKKwlpZiAocEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkRNb2RlICE9IFJEX1NJTEVOQ0VfTU9ERSkKKwkJCXJldHVybjsKKworCS8vIGNoYW5uZWwgYXZhaWxhYmlsaXR5IGNoZWNrIHRpbWUgaXMgNjBzZWMsIHVzZSA2NSBmb3IgYXNzdXJhbmNlCisJaWYgKHBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJEQ291bnQrKyA+IHBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LkNoTW92aW5nVGltZSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk5vdCBmb3VuZCByYWRhciBzaWduYWwsIHN0YXJ0IHNlbmQgYmVhY29uIGFuZCByYWRhciBkZXRlY3Rpb24gaW4gc2VydmljZSBtb25pdG9yXG5cbiIpKTsKKwkJCUJicFJhZGFyRGV0ZWN0aW9uU3RvcChwQWQpOworCQlBc2ljRW5hYmxlQnNzU3luYyhwQWQpOworCQlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5SRE1vZGUgPSBSRF9OT1JNQUxfTU9ERTsKKworCisJCXJldHVybjsKKwl9CisKKwlyZXR1cm47Cit9CisKKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorCQljaGFuZ2UgY2hhbm5lbCBtb3ZpbmcgdGltZSBmb3IgREZTIHRlc3RpbmcuCisKKwlBcmd1bWVudHM6CisJICAgIHBBZGFwdGVyICAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIG91ciBhZGFwdGVyCisJICAgIHdycSAgICAgICAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpb2N0bCBhcmd1bWVudAorCisgICAgUmV0dXJuIFZhbHVlOgorICAgICAgICBOb25lCisKKyAgICBOb3RlOgorICAgICAgICBVc2FnZToKKyAgICAgICAgICAgICAgIDEuKSBpd3ByaXYgcmEwIHNldCBDaE1vdlRpbWU9W3ZhbHVlXQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UIFNldF9DaE1vdmluZ1RpbWVfUHJvYygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBQVUNIQVIgYXJnKQoreworCVVJTlQ4IFZhbHVlOworCisJVmFsdWUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCisJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuQ2hNb3ZpbmdUaW1lID0gVmFsdWU7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6ICVkXG4iLCBfX2Z1bmNfXywKKwkJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuQ2hNb3ZpbmdUaW1lKSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworSU5UIFNldF9Mb25nUHVsc2VSYWRhclRoX1Byb2MoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gUFVDSEFSIGFyZykKK3sKKwlVSU5UOCBWYWx1ZTsKKworCVZhbHVlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKSA+IDEwID8gMTAgOiBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCisJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuTG9uZ1B1bHNlUmFkYXJUaCA9IFZhbHVlOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OiAlZFxuIiwgX19mdW5jX18sCisJCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LkxvbmdQdWxzZVJhZGFyVGgpKTsKKworCXJldHVybiBUUlVFOworfQorCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL2VlcHJvbS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vZWVwcm9tLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNmMTZlZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL2VlcHJvbS5jCkBAIC0wLDAgKzEsMjU0IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCU1vZHVsZSBOYW1lOgorCWVlcHJvbS5jCisKKwlBYnN0cmFjdDoKKworCVJldmlzaW9uIEhpc3Rvcnk6CisJV2hvCQkJV2hlbgkJCVdoYXQKKwktLS0tLS0tLQktLS0tLS0tLS0tCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJTmFtZQkJRGF0ZQkJCU1vZGlmaWNhdGlvbiBsb2dzCisqLworI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgorCisjaWYgMAorI2RlZmluZSBFRVBST01fU0laRQkJCQkJCQkJMHgyMDAKKyNkZWZpbmUgTlZSQU1fT0ZGU0VUCQkJMHgzMDAwMAorI2RlZmluZSBSRl9PRkZTRVQJCQkJMHg0MDAwMAorCitzdGF0aWMgVUNIQVIgaW5pdF9mbGFnID0gMDsKK3N0YXRpYyBQVUNIQVIgbnZfZWVfc3RhcnQgPSAwOworCitzdGF0aWMgVUNIQVIgRWVCdWZmZXJbRUVQUk9NX1NJWkVdOworI2VuZGlmCisvLyBJUlFMID0gUEFTU0lWRV9MRVZFTAorVk9JRCBSYWlzZUNsb2NrKAorICAgIElOCVBSVE1QX0FEQVBURVIJcEFkLAorICAgIElOICBVSU5UMzIgKngpCit7CisgICAgKnggPSAqeCB8IEVFU0s7CisgICAgUlRNUF9JT19XUklURTMyKHBBZCwgRTJQUk9NX0NTUiwgKngpOworICAgIFJUTVB1c2VjRGVsYXkoMSk7CQkJCS8vIE1heCBmcmVxdWVuY3kgPSAxTUh6IGluIFNwZWMuIGRlZmluaXRpb24KK30KKworLy8gSVJRTCA9IFBBU1NJVkVfTEVWRUwKK1ZPSUQgTG93ZXJDbG9jaygKKyAgICBJTglQUlRNUF9BREFQVEVSCXBBZCwKKyAgICBJTiAgVUlOVDMyICp4KQoreworICAgICp4ID0gKnggJiB+RUVTSzsKKyAgICBSVE1QX0lPX1dSSVRFMzIocEFkLCBFMlBST01fQ1NSLCAqeCk7CisgICAgUlRNUHVzZWNEZWxheSgxKTsKK30KKworLy8gSVJRTCA9IFBBU1NJVkVfTEVWRUwKK1VTSE9SVCBTaGlmdEluQml0cygKKyAgICBJTglQUlRNUF9BREFQVEVSCXBBZCkKK3sKKyAgICBVSU5UMzIJCXgsaTsKKwlVU0hPUlQgICAgICBkYXRhPTA7CisKKyAgICBSVE1QX0lPX1JFQUQzMihwQWQsIEUyUFJPTV9DU1IsICZ4KTsKKworICAgIHggJj0gfiggRUVETyB8IEVFREkpOworCisgICAgZm9yKGk9MDsgaTwxNjsgaSsrKQorICAgIHsKKyAgICAgICAgZGF0YSA9IGRhdGEgPDwgMTsKKyAgICAgICAgUmFpc2VDbG9jayhwQWQsICZ4KTsKKworICAgICAgICBSVE1QX0lPX1JFQUQzMihwQWQsIEUyUFJPTV9DU1IsICZ4KTsKKworICAgICAgICB4ICY9IH4oRUVESSk7CisgICAgICAgIGlmKHggJiBFRURPKQorICAgICAgICAgICAgZGF0YSB8PSAxOworCisgICAgICAgIExvd2VyQ2xvY2socEFkLCAmeCk7CisgICAgfQorCisgICAgcmV0dXJuIGRhdGE7Cit9CisKKy8vIElSUUwgPSBQQVNTSVZFX0xFVkVMCitWT0lEIFNoaWZ0T3V0Qml0cygKKyAgICBJTglQUlRNUF9BREFQVEVSCXBBZCwKKyAgICBJTiAgVVNIT1JUIGRhdGEsCisgICAgSU4gIFVTSE9SVCBjb3VudCkKK3sKKyAgICBVSU5UMzIgICAgICAgeCxtYXNrOworCisgICAgbWFzayA9IDB4MDEgPDwgKGNvdW50IC0gMSk7CisgICAgUlRNUF9JT19SRUFEMzIocEFkLCBFMlBST01fQ1NSLCAmeCk7CisKKyAgICB4ICY9IH4oRUVETyB8IEVFREkpOworCisgICAgZG8KKyAgICB7CisgICAgICAgIHggJj0gfkVFREk7CisgICAgICAgIGlmKGRhdGEgJiBtYXNrKQkJeCB8PSBFRURJOworCisgICAgICAgIFJUTVBfSU9fV1JJVEUzMihwQWQsIEUyUFJPTV9DU1IsIHgpOworCisgICAgICAgIFJhaXNlQ2xvY2socEFkLCAmeCk7CisgICAgICAgIExvd2VyQ2xvY2socEFkLCAmeCk7CisKKyAgICAgICAgbWFzayA9IG1hc2sgPj4gMTsKKyAgICB9IHdoaWxlKG1hc2spOworCisgICAgeCAmPSB+RUVESTsKKyAgICBSVE1QX0lPX1dSSVRFMzIocEFkLCBFMlBST01fQ1NSLCB4KTsKK30KKworLy8gSVJRTCA9IFBBU1NJVkVfTEVWRUwKK1ZPSUQgRUVwcm9tQ2xlYW51cCgKKyAgICBJTglQUlRNUF9BREFQVEVSCXBBZCkKK3sKKyAgICBVSU5UMzIgeDsKKworICAgIFJUTVBfSU9fUkVBRDMyKHBBZCwgRTJQUk9NX0NTUiwgJngpOworCisgICAgeCAmPSB+KEVFQ1MgfCBFRURJKTsKKyAgICBSVE1QX0lPX1dSSVRFMzIocEFkLCBFMlBST01fQ1NSLCB4KTsKKworICAgIFJhaXNlQ2xvY2socEFkLCAmeCk7CisgICAgTG93ZXJDbG9jayhwQWQsICZ4KTsKK30KKworVk9JRCBFV0VOKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKQoreworICAgIFVJTlQzMgl4OworCisgICAgLy8gcmVzZXQgYml0cyBhbmQgc2V0IEVFQ1MKKyAgICBSVE1QX0lPX1JFQUQzMihwQWQsIEUyUFJPTV9DU1IsICZ4KTsKKyAgICB4ICY9IH4oRUVESSB8IEVFRE8gfCBFRVNLKTsKKyAgICB4IHw9IEVFQ1M7CisgICAgUlRNUF9JT19XUklURTMyKHBBZCwgRTJQUk9NX0NTUiwgeCk7CisKKwkvLyBraWNrIGEgcHVsc2UKKwlSYWlzZUNsb2NrKHBBZCwgJngpOworCUxvd2VyQ2xvY2socEFkLCAmeCk7CisKKyAgICAvLyBvdXRwdXQgdGhlIHJlYWRfb3Bjb2RlIGFuZCBzaXggcHVsc2UgaW4gdGhhdCBvcmRlcgorICAgIFNoaWZ0T3V0Qml0cyhwQWQsIEVFUFJPTV9FV0VOX09QQ09ERSwgNSk7CisgICAgU2hpZnRPdXRCaXRzKHBBZCwgMCwgNik7CisKKyAgICBFRXByb21DbGVhbnVwKHBBZCk7Cit9CisKK1ZPSUQgRVdEUygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCkKK3sKKyAgICBVSU5UMzIJeDsKKworICAgIC8vIHJlc2V0IGJpdHMgYW5kIHNldCBFRUNTCisgICAgUlRNUF9JT19SRUFEMzIocEFkLCBFMlBST01fQ1NSLCAmeCk7CisgICAgeCAmPSB+KEVFREkgfCBFRURPIHwgRUVTSyk7CisgICAgeCB8PSBFRUNTOworICAgIFJUTVBfSU9fV1JJVEUzMihwQWQsIEUyUFJPTV9DU1IsIHgpOworCisJLy8ga2ljayBhIHB1bHNlCisJUmFpc2VDbG9jayhwQWQsICZ4KTsKKwlMb3dlckNsb2NrKHBBZCwgJngpOworCisgICAgLy8gb3V0cHV0IHRoZSByZWFkX29wY29kZSBhbmQgc2l4IHB1bHNlIGluIHRoYXQgb3JkZXIKKyAgICBTaGlmdE91dEJpdHMocEFkLCBFRVBST01fRVdEU19PUENPREUsIDUpOworICAgIFNoaWZ0T3V0Qml0cyhwQWQsIDAsIDYpOworCisgICAgRUVwcm9tQ2xlYW51cChwQWQpOworfQorCisvLyBJUlFMID0gUEFTU0lWRV9MRVZFTAorVVNIT1JUIFJUTVBfRUVQUk9NX1JFQUQxNigKKyAgICBJTglQUlRNUF9BREFQVEVSCXBBZCwKKyAgICBJTiAgVVNIT1JUIE9mZnNldCkKK3sKKyAgICBVSU5UMzIJCXg7CisgICAgVVNIT1JUCQlkYXRhOworCisgICAgT2Zmc2V0IC89IDI7CisgICAgLy8gcmVzZXQgYml0cyBhbmQgc2V0IEVFQ1MKKyAgICBSVE1QX0lPX1JFQUQzMihwQWQsIEUyUFJPTV9DU1IsICZ4KTsKKyAgICB4ICY9IH4oRUVESSB8IEVFRE8gfCBFRVNLKTsKKyAgICB4IHw9IEVFQ1M7CisgICAgUlRNUF9JT19XUklURTMyKHBBZCwgRTJQUk9NX0NTUiwgeCk7CisKKwkvLyBraWNrIGEgcHVsc2UKKwlSYWlzZUNsb2NrKHBBZCwgJngpOworCUxvd2VyQ2xvY2socEFkLCAmeCk7CisKKyAgICAvLyBvdXRwdXQgdGhlIHJlYWRfb3Bjb2RlIGFuZCByZWdpc3RlciBudW1iZXIgaW4gdGhhdCBvcmRlcgorICAgIFNoaWZ0T3V0Qml0cyhwQWQsIEVFUFJPTV9SRUFEX09QQ09ERSwgMyk7CisgICAgU2hpZnRPdXRCaXRzKHBBZCwgT2Zmc2V0LCBwQWQtPkVFUFJPTUFkZHJlc3NOdW0pOworCisgICAgLy8gTm93IHJlYWQgdGhlIGRhdGEgKDE2IGJpdHMpIGluIGZyb20gdGhlIHNlbGVjdGVkIEVFUFJPTSB3b3JkCisgICAgZGF0YSA9IFNoaWZ0SW5CaXRzKHBBZCk7CisKKyAgICBFRXByb21DbGVhbnVwKHBBZCk7CisKKyAgICByZXR1cm4gZGF0YTsKK30JLy9SZWFkRUVwcm9tCisKK1ZPSUQgUlRNUF9FRVBST01fV1JJVEUxNigKKyAgICBJTglQUlRNUF9BREFQVEVSCXBBZCwKKyAgICBJTiAgVVNIT1JUIE9mZnNldCwKKyAgICBJTiAgVVNIT1JUIERhdGEpCit7CisgICAgVUlOVDMyIHg7CisKKwlPZmZzZXQgLz0gMjsKKworCUVXRU4ocEFkKTsKKworICAgIC8vIHJlc2V0IGJpdHMgYW5kIHNldCBFRUNTCisgICAgUlRNUF9JT19SRUFEMzIocEFkLCBFMlBST01fQ1NSLCAmeCk7CisgICAgeCAmPSB+KEVFREkgfCBFRURPIHwgRUVTSyk7CisgICAgeCB8PSBFRUNTOworICAgIFJUTVBfSU9fV1JJVEUzMihwQWQsIEUyUFJPTV9DU1IsIHgpOworCisJLy8ga2ljayBhIHB1bHNlCisJUmFpc2VDbG9jayhwQWQsICZ4KTsKKwlMb3dlckNsb2NrKHBBZCwgJngpOworCisgICAgLy8gb3V0cHV0IHRoZSByZWFkX29wY29kZSAscmVnaXN0ZXIgbnVtYmVyIGFuZCBkYXRhIGluIHRoYXQgb3JkZXIKKyAgICBTaGlmdE91dEJpdHMocEFkLCBFRVBST01fV1JJVEVfT1BDT0RFLCAzKTsKKyAgICBTaGlmdE91dEJpdHMocEFkLCBPZmZzZXQsIHBBZC0+RUVQUk9NQWRkcmVzc051bSk7CisJU2hpZnRPdXRCaXRzKHBBZCwgRGF0YSwgMTYpOwkJLy8gMTYtYml0IGFjY2VzcworCisgICAgLy8gcmVhZCBETyBzdGF0dXMKKyAgICBSVE1QX0lPX1JFQUQzMihwQWQsIEUyUFJPTV9DU1IsICZ4KTsKKworCUVFcHJvbUNsZWFudXAocEFkKTsKKworCVJUTVB1c2VjRGVsYXkoMTAwMDApOwkvL2RlbGF5IGZvciB0d3AoTUFYKT0xMG1zCisKKwlFV0RTKHBBZCk7CisKKyAgICBFRXByb21DbGVhbnVwKHBBZCk7Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL2Zpcm13YXJlLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9maXJtd2FyZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0MDY2OTgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9maXJtd2FyZS5oCkBAIC0wLDAgKzEsNTU4IEBACisvKgorIENvcHlyaWdodCAoYykgMjAwNywgUmFsaW5rIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24KKyBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgUmVkaXN0cmlidXRpb24uICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIGJpbmFyeSBmb3JtLCB3aXRob3V0CisgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorIG1ldDoKKworIAkqIFJlZGlzdHJpYnV0aW9ucyBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhlCisgCWZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKKyAJcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIAkqIE5laXRoZXIgdGhlIG5hbWUgb2YgUmFsaW5rIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAJc3VwcGxpZXJzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcworIAlzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAJKiBObyByZXZlcnNlIGVuZ2luZWVyaW5nLCBkZWNvbXBpbGF0aW9uLCBvciBkaXNhc3NlbWJseSBvZiB0aGlzIHNvZnR3YXJlCisgCWlzIHBlcm1pdHRlZC4KKworIExpbWl0ZWQgcGF0ZW50IGxpY2Vuc2UuIFJhbGluayBUZWNobm9sb2d5IENvcnBvcmF0aW9uIGdyYW50cyBhIHdvcmxkLXdpZGUsCisgcm95YWx0eS1mcmVlLCBub24tZXhjbHVzaXZlIGxpY2Vuc2UgdW5kZXIgcGF0ZW50cyBpdCBub3cgb3IgaGVyZWFmdGVyCisgb3ducyBvciBjb250cm9scyB0byBtYWtlLCBoYXZlIG1hZGUsIHVzZSwgaW1wb3J0LCBvZmZlciB0byBzZWxsIGFuZAorIHNlbGwgKCJVdGlsaXplIikgdGhpcyBzb2Z0d2FyZSwgYnV0IHNvbGVseSB0byB0aGUgZXh0ZW50IHRoYXQgYW55Cisgc3VjaCBwYXRlbnQgaXMgbmVjZXNzYXJ5IHRvIFV0aWxpemUgdGhlIHNvZnR3YXJlIGFsb25lLCBvciBpbgorIGNvbWJpbmF0aW9uIHdpdGggYW4gb3BlcmF0aW5nIHN5c3RlbSBsaWNlbnNlZCB1bmRlciBhbiBhcHByb3ZlZCBPcGVuCisgU291cmNlIGxpY2Vuc2UgYXMgbGlzdGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlIGF0CisgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzLiAgVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0bworIGFueSBvdGhlciBjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGlzIHNvZnR3YXJlLiAgTm8gaGFyZHdhcmUgcGVyCisgc2UgaXMgbGljZW5zZWQgaGVyZXVuZGVyLgorCisgRElTQ0xBSU1FUi4gIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORAorIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywKKyBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORAorIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MKKyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SCisgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRQorIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKKyBEQU1BR0UuCisqLworLyogQVVUTyBHRU4gUExFQVNFIERPIE5PVCBNT0RJRlkgSVQgKi8KKy8qIEFVVE8gR0VOIFBMRUFTRSBETyBOT1QgTU9ESUZZIElUICovCisKKworVUNIQVIgRmlybXdhcmVJbWFnZSBbXSA9IHsKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4MDIsIDB4MTAsIDB4MjgsIDB4MDIsIDB4MTAsIDB4MzIsIDB4MDIsIDB4MTAsIDB4NzgsIDB4MDIsIDB4MTIsIDB4NzksIDB4MDIsCisweDEyLCAweDdhLCAweDAyLCAweDEyLCAweDk5LCAweDAyLCAweDEyLCAweDllLCAweDEyLCAweDEyLCAweDlhLCAweDIyLCAweDAyLCAweDE2LCAweDM2LCAweDAyLAorMHgxNywgMHgwYywgMHgwMiwgMHgxMywgMHg4OSwgMHgwMiwgMHgxMiwgMHg5ZiwgMHgzMCwgMHgwNSwgMHgwNiwgMHgyMCwgMHgwZCwgMHgwMywgMHgxMiwgMHgxNywKKzB4YWUsIDB4MjIsIDB4OTAsIDB4MDEsIDB4OGMsIDB4ZTAsIDB4MzAsIDB4ZTMsIDB4MWIsIDB4ZTUsIDB4NGMsIDB4MzAsIDB4ZTAsIDB4MDQsIDB4N2YsIDB4NDAsCisweDgwLCAweDAyLCAweDdmLCAweDAwLCAweDkwLCAweDEwLCAweDJmLCAweGVmLCAweGYwLCAweDkwLCAweDAxLCAweDhjLCAweDc0LCAweDA4LCAweGYwLCAweGU0LAorMHg5MCwgMHgwMSwgMHhhNywgMHhmMCwgMHg5MCwgMHgwMSwgMHg4YywgMHhlMCwgMHgzMCwgMHhlMCwgMHgxYywgMHg5MCwgMHgwMSwgMHg4MCwgMHhlMCwgMHhiNCwKKzB4MDIsIDB4MTUsIDB4YTMsIDB4ZTAsIDB4YjQsIDB4MDEsIDB4MTAsIDB4OTAsIDB4MDEsIDB4ODQsIDB4ZTAsIDB4YjQsIDB4ODEsIDB4MDksIDB4OTAsIDB4MDEsCisweDhjLCAweDc0LCAweDAxLCAweGYwLCAweDEyLCAweDBkLCAweGM4LCAweDIyLCAweDkwLCAweDA0LCAweDE0LCAweGUwLCAweDIwLCAweGU3LCAweDAzLCAweDAyLAorMHgxMiwgMHg2ZSwgMHg5MCwgMHg3MCwgMHgxMiwgMHhlMCwgMHhmNSwgMHg1NiwgMHg5MCwgMHgwNCwgMHgwNCwgMHhlMCwgMHgxMiwgMHgwYSwgMHg5ZCwgMHgxMCwKKzB4YjcsIDB4MzEsIDB4MTAsIDB4ZTIsIDB4NTAsIDB4MTEsIDB4MDgsIDB4NTEsIDB4MTEsIDB4MTMsIDB4NTIsIDB4MTEsIDB4MTMsIDB4NTMsIDB4MTEsIDB4MTMsCisweDU0LCAweDExLCAweDU0LCAweDU1LCAweDExLCAweDc5LCAweDcwLCAweDExLCAweGE0LCAweDcxLCAweDExLCAweGQyLCAweDcyLCAweDEyLCAweDI1LCAweDczLAorMHgxMiwgMHg0NiwgMHg4MCwgMHgwMCwgMHgwMCwgMHgxMiwgMHg2ZSwgMHgyMCwgMHgwMiwgMHgwMywgMHgzMCwgMHgwMywgMHgxZCwgMHg3ZCwgMHgwMiwgMHhhZiwKKzB4NTYsIDB4MTIsIDB4MGIsIDB4OTEsIDB4OTAsIDB4MDQsIDB4MTQsIDB4NzQsIDB4ODAsIDB4ZjAsIDB4ZTQsIDB4OTAsIDB4NzAsIDB4MTMsIDB4ZjAsIDB4ZTUsCisweDU2LCAweGY0LCAweDcwLCAweDAzLCAweDAyLCAweDEyLCAweDZlLCAweDAyLCAweDEyLCAweDY3LCAweDg1LCAweDU2LCAweDQxLCAweGQyLCAweDAyLCAweDAyLAorMHgxMiwgMHg2ZSwgMHg5MCwgMHg3MCwgMHgxMCwgMHhlMCwgMHg1NCwgMHg3ZiwgMHg2NCwgMHgwMiwgMHg2MCwgMHgwMywgMHgwMiwgMHgxMiwgMHg2ZSwgMHg5MCwKKzB4NzAsIDB4MTEsIDB4ZTAsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MDgsIDB4ZTAsIDB4NjQsIDB4MjAsIDB4NjAsIDB4MDMsIDB4MDIsIDB4MTIsIDB4NmUsIDB4NzUsCisweDRlLCAweDAzLCAweDc1LCAweDRmLCAweDIwLCAweDAyLCAweDEyLCAweDZlLCAweDkwLCAweDcwLCAweDExLCAweGUwLCAweDI0LCAweGZmLCAweDkyLCAweDQ3LAorMHgwMiwgMHgxMiwgMHg2ZSwgMHg5MCwgMHgwNCwgMHgwNCwgMHhlMCwgMHgyNSwgMHhlMCwgMHgyNCwgMHg1ZCwgMHhmNSwgMHg1NywgMHg5MCwgMHg3MCwgMHgxMCwKKzB4ZTAsIDB4ZmYsIDB4NzQsIDB4NDcsIDB4MjUsIDB4NTcsIDB4ZjgsIDB4YzYsIDB4ZWYsIDB4YzYsIDB4OTAsIDB4NzAsIDB4MTEsIDB4ZTAsIDB4ZmYsIDB4NzQsCisweDQ4LCAweDI1LCAweDU3LCAweGY4LCAweGM2LCAweGVmLCAweGM2LCAweGU0LCAweGZkLCAweGFmLCAweDU2LCAweDEyLCAweDBiLCAweDkxLCAweDkwLCAweDA0LAorMHgxNCwgMHg3NCwgMHg4MCwgMHhmMCwgMHhlNCwgMHg5MCwgMHg3MCwgMHgxMywgMHhmMCwgMHhlNSwgMHg1NiwgMHhmNCwgMHg3MCwgMHgwMywgMHgwMiwgMHgxMiwKKzB4NmUsIDB4MDIsIDB4MTIsIDB4NjcsIDB4ZTUsIDB4NDcsIDB4NjQsIDB4MDcsIDB4NjAsIDB4MGIsIDB4ZTUsIDB4NDcsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MDUsCisweGU1LCAweDQ3LCAweGI0LCAweDA5LCAweDA4LCAweDkwLCAweDcwLCAweDExLCAweGUwLCAweDU0LCAweDBmLCAweGY1LCAweDNhLCAweGU0LCAweGZkLCAweGFmLAorMHg1NiwgMHgxMiwgMHgwYiwgMHg5MSwgMHhkMiwgMHgwNCwgMHgwMiwgMHgxMiwgMHg2ZSwgMHg5MCwgMHg3MCwgMHgxMCwgMHhlMCwgMHhmZSwgMHg5MCwgMHg3MCwKKzB4MTEsIDB4ZTAsIDB4ZmQsIDB4ZWQsIDB4ZjgsIDB4ZTYsIDB4ZjUsIDB4NTcsIDB4ZmQsIDB4YWYsIDB4NTYsIDB4MTIsIDB4MGIsIDB4OTEsIDB4OTAsIDB4MDQsCisweDE0LCAweDc0LCAweDgwLCAweGYwLCAweGU0LCAweDkwLCAweDcwLCAweDEzLCAweGYwLCAweGU1LCAweDU2LCAweGY0LCAweDcwLCAweDAzLCAweDAyLCAweDEyLAorMHg2ZSwgMHgwMiwgMHgxMiwgMHg2NywgMHg5MCwgMHg3MCwgMHgxMCwgMHhlMCwgMHhmZSwgMHg5MCwgMHg3MCwgMHgxMSwgMHhlMCwgMHhmZCwgMHhlZCwgMHhmNSwKKzB4ODIsIDB4OGUsIDB4ODMsIDB4ZTAsIDB4ZjUsIDB4NTcsIDB4ZmQsIDB4YWYsIDB4NTYsIDB4MTIsIDB4MGIsIDB4OTEsIDB4OTAsIDB4MDQsIDB4MTQsIDB4NzQsCisweDgwLCAweGYwLCAweGU0LCAweDkwLCAweDcwLCAweDEzLCAweGYwLCAweGU1LCAweDU2LCAweGY0LCAweDcwLCAweDAzLCAweDAyLCAweDEyLCAweDZlLCAweDAyLAorMHgxMiwgMHg2NywgMHg5MCwgMHgxMCwgMHgwMiwgMHhlMCwgMHhiNCwgMHg3MCwgMHgxZSwgMHhhMywgMHhlMCwgMHhiNCwgMHgzMCwgMHgxOSwgMHg5MCwgMHgwNSwKKzB4MDgsIDB4ZTAsIDB4NDQsIDB4MDEsIDB4ZjAsIDB4ZmQsIDB4OTAsIDB4MDUsIDB4MDUsIDB4ZTAsIDB4NTQsIDB4ZmIsIDB4ZjAsIDB4NDQsIDB4MDQsIDB4ZjAsCisweGVkLCAweDU0LCAweGZlLCAweDkwLCAweDA1LCAweDA4LCAweGYwLCAweGU0LCAweGY1LCAweDRlLCAweGY1LCAweDRmLCAweDc1LCAweDNhLCAweGZmLCAweGFkLAorMHg1NywgMHhhZiwgMHg1NiwgMHgxMiwgMHgwYiwgMHg5MSwgMHg5MCwgMHgwNCwgMHgxNCwgMHg3NCwgMHg4MCwgMHhmMCwgMHhlNCwgMHg5MCwgMHg3MCwgMHgxMywKKzB4ZjAsIDB4ZTUsIDB4NTYsIDB4ZjQsIDB4NjAsIDB4MDcsIDB4OTAsIDB4NzAsIDB4MjUsIDB4ZTAsIDB4NDQsIDB4MDEsIDB4ZjAsIDB4OTAsIDB4NzAsIDB4NDAsCisweGU1LCAweDNhLCAweGYwLCAweDgwLCAweDQ5LCAweDkwLCAweDcwLCAweDEwLCAweGUwLCAweDI0LCAweGZmLCAweDkyLCAweDkzLCAweGU0LCAweGZkLCAweGFmLAorMHg1NiwgMHgxMiwgMHgwYiwgMHg5MSwgMHg5MCwgMHgwNCwgMHgxNCwgMHg3NCwgMHg4MCwgMHhmMCwgMHhlNCwgMHg5MCwgMHg3MCwgMHgxMywgMHhmMCwgMHhlNSwKKzB4NTYsIDB4ZjQsIDB4NjAsIDB4MmEsIDB4ODAsIDB4MjEsIDB4OTAsIDB4NzAsIDB4MTAsIDB4ZTAsIDB4MjQsIDB4ZmYsIDB4OTIsIDB4NGEsIDB4ZDIsIDB4MDUsCisweGFkLCAweDU3LCAweGFmLCAweDU2LCAweDEyLCAweDBiLCAweDkxLCAweDkwLCAweDA0LCAweDE0LCAweDc0LCAweDgwLCAweGYwLCAweGU0LCAweDkwLCAweDcwLAorMHgxMywgMHhmMCwgMHhlNSwgMHg1NiwgMHhmNCwgMHg2MCwgMHgwNywgMHg5MCwgMHg3MCwgMHgyNSwgMHhlMCwgMHg0NCwgMHgwMSwgMHhmMCwgMHg5MCwgMHg3MCwKKzB4NDIsIDB4ZTUsIDB4M2EsIDB4ZjAsIDB4YTMsIDB4NzQsIDB4YWIsIDB4ZjAsIDB4MjIsIDB4MjIsIDB4ZTUsIDB4NTMsIDB4NzAsIDB4MWEsIDB4MzAsIDB4NjAsCisweDA5LCAweGIyLCAweDRkLCAweDMwLCAweDRkLCAweDA0LCAweDA1LCAweDQ2LCAweGMyLCAweDA0LCAweGU1LCAweDRmLCAweDQ1LCAweDRlLCAweDYwLCAweDA4LAorMHhlNSwgMHg0ZiwgMHgxNSwgMHg0ZiwgMHg3MCwgMHgwMiwgMHgxNSwgMHg0ZSwgMHgyMiwgMHgyMiwgMHhjMiwgMHg0MiwgMHhkMywgMHgyMiwgMHgyMiwgMHhjMiwKKzB4NGIsIDB4YzIsIDB4NGMsIDB4ZTUsIDB4NDQsIDB4MTIsIDB4MGEsIDB4OWQsIDB4MTIsIDB4YzEsIDB4MDAsIDB4MTMsIDB4NTQsIDB4MDQsIDB4MTMsIDB4NTAsCisweDA4LCAweDEzLCAweDJiLCAweDEwLCAweDEyLCAweGQ1LCAweDIwLCAweDEyLCAweGY1LCAweDYwLCAweDEzLCAweDA2LCAweGEwLCAweDAwLCAweDAwLCAweDEzLAorMHg1NiwgMHg4NSwgMHg0OCwgMHg0MywgMHg4NSwgMHg0YSwgMHg0MiwgMHg4NSwgMHg0YywgMHg1ZSwgMHhlNSwgMHg0NywgMHg2NCwgMHgwNiwgMHg2MCwgMHgwMywKKzB4MDIsIDB4MTMsIDB4NTYsIDB4ODAsIDB4MWIsIDB4ZTUsIDB4NDgsIDB4YzQsIDB4NTQsIDB4MGYsIDB4ZjUsIDB4NDMsIDB4ZTUsIDB4NGEsIDB4YzQsIDB4NTQsCisweDBmLCAweGY1LCAweDQyLCAweGU1LCAweDRjLCAweGM0LCAweDU0LCAweDBmLCAweGY1LCAweDVlLCAweGU1LCAweDQ3LCAweDY0LCAweDA2LCAweDcwLCAweDY2LAorMHg1MywgMHg0MywgMHgwZiwgMHg4MCwgMHg2MSwgMHg4NSwgMHg0OSwgMHg0MywgMHg4NSwgMHg0YiwgMHg0MiwgMHg4NSwgMHg0ZCwgMHg1ZSwgMHhlNSwgMHg0NywKKzB4NjQsIDB4MDYsIDB4NzAsIDB4NTIsIDB4ODAsIDB4MWIsIDB4ZTUsIDB4NDksIDB4YzQsIDB4NTQsIDB4MGYsIDB4ZjUsIDB4NDMsIDB4ZTUsIDB4NGIsIDB4YzQsCisweDU0LCAweDBmLCAweGY1LCAweDQyLCAweGU1LCAweDRkLCAweGM0LCAweDU0LCAweDBmLCAweGY1LCAweDVlLCAweGU1LCAweDQ3LCAweDY0LCAweDA2LCAweDcwLAorMHgzNSwgMHhlNSwgMHg0MywgMHg1NCwgMHgwZiwgMHg0NCwgMHgxMCwgMHhmNSwgMHg0MywgMHg4MCwgMHgyYiwgMHhlNSwgMHg0NywgMHhiNCwgMHgwNCwgMHgwNiwKKzB4NTMsIDB4NWUsIDB4ZmIsIDB4NzUsIDB4NDIsIDB4MDksIDB4ZTUsIDB4NDcsIDB4YjQsIDB4MDUsIDB4MDYsIDB4NDMsIDB4NWUsIDB4MDQsIDB4NzUsIDB4NDIsCisweDA5LCAweGU1LCAweDQ3LCAweGI0LCAweDA2LCAweDEwLCAweGU1LCAweDQzLCAweDU0LCAweDBmLCAweDQ0LCAweDMwLCAweGY1LCAweDQzLCAweDgwLCAweDA2LAorMHhkMiwgMHg0YiwgMHg4MCwgMHgwMiwgMHhkMiwgMHg0YywgMHhlNCwgMHhmNSwgMHgyNSwgMHhlNSwgMHg0MiwgMHhjNCwgMHg1NCwgMHhmMCwgMHhmZiwgMHhlNSwKKzB4NDMsIDB4NTQsIDB4MGYsIDB4NGYsIDB4ZjUsIDB4NWYsIDB4OTAsIDB4NzAsIDB4NDQsIDB4ZjAsIDB4YTMsIDB4ZTUsIDB4NWUsIDB4ZjAsIDB4YTMsIDB4ZTUsCisweDRhLCAweGYwLCAweGEzLCAweGU1LCAweDQ4LCAweGYwLCAweGEzLCAweGU1LCAweDRjLCAweGYwLCAweGEzLCAweGU1LCAweDQ0LCAweGYwLCAweGEzLCAweGU1LAorMHg0MiwgMHhmMCwgMHhhMywgMHhlNSwgMHg0MywgMHhmMCwgMHhkMiwgMHg2MCwgMHgyMiwgMHhlNSwgMHg0NywgMHg2MCwgMHgxMCwgMHgyNCwgMHhjMCwgMHg3MCwKKzB4MDMsIDB4MTIsIDB4MTYsIDB4MTYsIDB4MTIsIDB4MTMsIDB4OWUsIDB4YzIsIDB4YWYsIDB4YzIsIDB4MDQsIDB4ZDIsIDB4YWYsIDB4MjIsIDB4YzIsIDB4YWYsCisweDkwLCAweDA0LCAweDE0LCAweGUwLCAweDU0LCAweDBlLCAweDYwLCAweDA0LCAweGQyLCAweDE4LCAweDgwLCAweDA4LCAweGU1LCAweDRlLCAweDQ1LCAweDRmLAorMHgyNCwgMHhmZiwgMHg5MiwgMHgxOCwgMHhkMiwgMHhhZiwgMHg5MCwgMHgwNCwgMHgxNCwgMHhlMCwgMHhhMiwgMHhlNCwgMHg5MiwgMHgxOSwgMHg3NCwgMHgxZSwKKzB4ZjAsIDB4ZTUsIDB4NWYsIDB4NTQsIDB4MGYsIDB4ZjUsIDB4MmQsIDB4ZTUsIDB4MjUsIDB4NzAsIDB4MTMsIDB4MzAsIDB4MTgsIDB4MDUsIDB4ZTUsIDB4NWYsCisweDIwLCAweGU1LCAweDBiLCAweDMwLCAweDE5LCAweDE5LCAweGU1LCAweDVmLCAweDU0LCAweDMwLCAweGZmLCAweGJmLCAweDMwLCAweDExLCAweGU1LCAweDI1LAorMHg3MCwgMHgwNSwgMHg3NSwgMHgyNSwgMHgwYywgMHg4MCwgMHgwMiwgMHgxNSwgMHgyNSwgMHhkMiwgMHg2YywgMHhkMiwgMHg2ZCwgMHg4MCwgMHgwZiwgMHhlNSwKKzB4NWYsIDB4MzAsIDB4ZTYsIDB4MDYsIDB4YzIsIDB4NmMsIDB4ZDIsIDB4NmQsIDB4ODAsIDB4MDQsIDB4ZDIsIDB4NmMsIDB4YzIsIDB4NmQsIDB4ZTUsIDB4NDcsCisweDY0LCAweDAzLCAweDcwLCAweDIxLCAweDMwLCAweDRiLCAweDA2LCAweGMyLCAweDZjLCAweGQyLCAweDZkLCAweDgwLCAweDE4LCAweGU1LCAweDI1LCAweDcwLAorMHgwMywgMHgzMCwgMHg0YywgMHgxMSwgMHhjMiwgMHg0YywgMHhlNSwgMHgyNSwgMHg3MCwgMHgwNSwgMHg3NSwgMHgyNSwgMHgwNywgMHg4MCwgMHgwMiwgMHgxNSwKKzB4MjUsIDB4ZDIsIDB4NmMsIDB4ZDIsIDB4NmQsIDB4ZTUsIDB4NDcsIDB4YjQsIDB4MDksIDB4MTQsIDB4ZTUsIDB4NDQsIDB4MjAsIDB4ZTMsIDB4MGIsIDB4ZTUsCisweDNhLCAweDY0LCAweDAyLCAweDYwLCAweDA1LCAweGU1LCAweDNhLCAweGI0LCAweDAzLCAweDA0LCAweGMyLCAweDZjLCAweGQyLCAweDZkLCAweDkwLCAweDcwLAorMHg0NiwgMHhlNSwgMHgyZCwgMHhmMCwgMHgyMCwgMHg2OSwgMHgwNywgMHhlNSwgMHg1ZSwgMHgyMCwgMHhlMCwgMHgwMiwgMHhiMiwgMHg2OCwgMHgyMCwgMHg2YiwKKzB4MDcsIDB4ZTUsIDB4NWUsIDB4MjAsIDB4ZTEsIDB4MDIsIDB4YjIsIDB4NmEsIDB4MjAsIDB4NmQsIDB4MDcsIDB4ZTUsIDB4NWUsIDB4MjAsIDB4ZTIsIDB4MDIsCisweGIyLCAweDZjLCAweDkwLCAweDcwLCAweDQ3LCAweGU1LCAweDJkLCAweGYwLCAweDc1LCAweDJlLCAweDQwLCAweDIwLCAweDY5LCAweDA0LCAweGEyLCAweDY4LAorMHg4MCwgMHgyNiwgMHgzMCwgMHg2OCwgMHgwNiwgMHhlNSwgMHg0NiwgMHhhMiwgMHhlMiwgMHg4MCwgMHgxZCwgMHhlNSwgMHg1ZSwgMHgyMCwgMHhlMiwgMHgwNCwKKzB4N2YsIDB4MDEsIDB4ODAsIDB4MDIsIDB4N2YsIDB4MDAsIDB4ZTUsIDB4NDYsIDB4NTQsIDB4ZjAsIDB4ZmUsIDB4YmUsIDB4ZjAsIDB4MDQsIDB4N2UsIDB4MDEsCisweDgwLCAweDAyLCAweDdlLCAweDAwLCAweGVlLCAweDZmLCAweDI0LCAweGZmLCAweDkyLCAweDczLCAweDkyLCAweDcyLCAweDIwLCAweDZiLCAweDA0LCAweGEyLAorMHg2YSwgMHg4MCwgMHgyNiwgMHgzMCwgMHg2YSwgMHgwNiwgMHhlNSwgMHg0NiwgMHhhMiwgMHhlMiwgMHg4MCwgMHgxZCwgMHhlNSwgMHg1ZSwgMHgyMCwgMHhlMCwKKzB4MDQsIDB4N2YsIDB4MDEsIDB4ODAsIDB4MDIsIDB4N2YsIDB4MDAsIDB4ZTUsIDB4NDYsIDB4NTQsIDB4ZjAsIDB4ZmUsIDB4YmUsIDB4ZjAsIDB4MDQsIDB4N2UsCisweDAxLCAweDgwLCAweDAyLCAweDdlLCAweDAwLCAweGVlLCAweDZmLCAweDI0LCAweGZmLCAweDkyLCAweDc1LCAweDkyLCAweDc0LCAweDIwLCAweDZkLCAweDA0LAorMHhhMiwgMHg2YywgMHg4MCwgMHgyNiwgMHgzMCwgMHg2YywgMHgwNiwgMHhlNSwgMHg0NiwgMHhhMiwgMHhlMiwgMHg4MCwgMHgxZCwgMHhlNSwgMHg1ZSwgMHgyMCwKKzB4ZTEsIDB4MDQsIDB4N2YsIDB4MDEsIDB4ODAsIDB4MDIsIDB4N2YsIDB4MDAsIDB4ZTUsIDB4NDYsIDB4NTQsIDB4ZjAsIDB4ZmUsIDB4YmUsIDB4ZjAsIDB4MDQsCisweDdlLCAweDAxLCAweDgwLCAweDAyLCAweDdlLCAweDAwLCAweGVlLCAweDZmLCAweDI0LCAweGZmLCAweDkyLCAweDcxLCAweDkyLCAweDcwLCAweDkwLCAweDEwLAorMHgyZiwgMHhlNSwgMHgyZSwgMHhmMCwgMHhlNSwgMHg0NywgMHg2NCwgMHgwNiwgMHg3MCwgMHg0YywgMHg5MCwgMHgwMiwgMHgyOSwgMHhlMCwgMHg1NCwgMHhmZSwKKzB4ZjAsIDB4ZTUsIDB4NDMsIDB4YzQsIDB4NTQsIDB4MGYsIDB4MTQsIDB4NjAsIDB4MTQsIDB4MjQsIDB4ZmUsIDB4NjAsIDB4MjMsIDB4MjQsIDB4MDMsIDB4NjAsCisweDAzLCAweDAyLCAweDE2LCAweDA1LCAweDkwLCAweDAyLCAweDI4LCAweGUwLCAweDMwLCAweDQ3LCAweDBmLCAweDgwLCAweDA3LCAweDkwLCAweDAyLCAweDI4LAorMHhlMCwgMHgyMCwgMHg0NywgMHgwNiwgMHg1NCwgMHhmZSwgMHhmMCwgMHgwMiwgMHgxNiwgMHgwNSwgMHg0NCwgMHgwMSwgMHhmMCwgMHgwMiwgMHgxNiwgMHgwNSwKKzB4ZTUsIDB4NDYsIDB4MzAsIDB4ZTIsIDB4MDQsIDB4N2YsIDB4MDEsIDB4ODAsIDB4MDIsIDB4N2YsIDB4MDAsIDB4OTAsIDB4MDIsIDB4MjgsIDB4ZTAsIDB4NTQsCisweGZlLCAweDRmLCAweGYwLCAweDAyLCAweDE2LCAweDA1LCAweGU1LCAweDQ3LCAweDY0LCAweDA3LCAweDYwLCAweDBmLCAweGU1LCAweDQ3LCAweDY0LCAweDA4LAorMHg2MCwgMHgwOSwgMHhlNSwgMHg0NywgMHg2NCwgMHgwOSwgMHg2MCwgMHgwMywgMHgwMiwgMHgxNiwgMHgwNSwgMHhlNCwgMHhmNSwgMHgyNywgMHg5MCwgMHgwMiwKKzB4MjksIDB4ZTAsIDB4NTQsIDB4ZmMsIDB4ZjAsIDB4ZTUsIDB4M2EsIDB4MTQsIDB4NjAsIDB4MmQsIDB4MTQsIDB4NjAsIDB4MmUsIDB4MTQsIDB4NjAsIDB4MzYsCisweDI0LCAweGZjLCAweDYwLCAweDVmLCAweDI0LCAweGY5LCAweDYwLCAweDFmLCAweDI0LCAweDBlLCAweDcwLCAweDY5LCAweGU1LCAweDQ2LCAweDEzLCAweDEzLAorMHg1NCwgMHgzZiwgMHg3NSwgMHhmMCwgMHgwMSwgMHg4NCwgMHhhZiwgMHhmMCwgMHgyMCwgMHg0NywgMHgwNCwgMHg3ZSwgMHgwMSwgMHg4MCwgMHgwMiwgMHg3ZSwKKzB4MDAsIDB4ZWYsIDB4NmUsIDB4MjQsIDB4ZmYsIDB4ODAsIDB4NDUsIDB4YTIsIDB4NDcsIDB4ODAsIDB4NDEsIDB4ZTUsIDB4NDYsIDB4MzAsIDB4ZTIsIDB4MDMsCisweGQzLCAweDgwLCAweDI3LCAweGMzLCAweDgwLCAweDI0LCAweGU1LCAweDQ2LCAweDMwLCAweGUyLCAweDBkLCAweDU0LCAweDM4LCAweGMzLCAweDk0LCAweDMwLAorMHg1MCwgMHgwNiwgMHg3ZSwgMHgwMCwgMHg3ZiwgMHgwMSwgMHg4MCwgMHgwNCwgMHg3ZSwgMHgwMCwgMHg3ZiwgMHgwMCwgMHgyMCwgMHg0NywgMHgwNCwgMHg3ZCwKKzB4MDEsIDB4ODAsIDB4MDIsIDB4N2QsIDB4MDAsIDB4ZWYsIDB4NmQsIDB4NGUsIDB4MjQsIDB4ZmYsIDB4OTIsIDB4MzgsIDB4YTIsIDB4NDcsIDB4YjMsIDB4OTIsCisweDM5LCAweDgwLCAweDE5LCAweGU1LCAweDQ2LCAweDMwLCAweGUyLCAweDAzLCAweGQzLCAweDgwLCAweDAxLCAweGMzLCAweDkyLCAweDM5LCAweGEyLCAweDQ3LAorMHhiMywgMHg5MiwgMHgzOCwgMHg4MCwgMHgwNywgMHhhMiwgMHg0NywgMHhiMywgMHg5MiwgMHgzOCwgMHg5MiwgMHgzOSwgMHg5MCwgMHgwMiwgMHgyOCwgMHhlMCwKKzB4NTQsIDB4ZmMsIDB4NDUsIDB4MjcsIDB4ZjAsIDB4OTAsIDB4NzAsIDB4OWMsIDB4ZTUsIDB4M2EsIDB4ZjAsIDB4YTMsIDB4ZTUsIDB4NDcsIDB4ZjAsIDB4OTAsCisweDcwLCAweDQxLCAweGU1LCAweDNhLCAweGYwLCAweDIyLCAweGU0LCAweDkwLCAweDAyLCAweDI5LCAweGYwLCAweDMwLCAweDQ3LCAweDA0LCAweGFmLCAweDQ1LAorMHg4MCwgMHgwNCwgMHhlNSwgMHg0NSwgMHhmNCwgMHhmZiwgMHg5MCwgMHgwMiwgMHgyOCwgMHhlZiwgMHhmMCwgMHgyMiwgMHg4ZiwgMHg1MCwgMHhkMiwgMHg1OSwKKzB4MjIsIDB4OGYsIDB4NTQsIDB4ZDIsIDB4NTgsIDB4MjIsIDB4ZTQsIDB4ZjUsIDB4NjIsIDB4YzIsIDB4YWYsIDB4ZTUsIDB4NTEsIDB4MTQsIDB4NjAsIDB4NDYsCisweDE0LCAweDYwLCAweDYyLCAweDI0LCAweDAyLCAweDYwLCAweDAzLCAweDAyLCAweDE2LCAweGYwLCAweGQyLCAweDU5LCAweDc1LCAweDU1LCAweDAxLCAweDkwLAorMHgwMiwgMHhhMiwgMHhlMCwgMHg1NCwgMHg3ZiwgMHhmMCwgMHhhMywgMHhlMCwgMHgyMCwgMHhlNywgMHgyMiwgMHg5MCwgMHgwNCwgMHgzNCwgMHhlMCwgMHhiNCwKKzB4MDIsIDB4MWIsIDB4YTMsIDB4ZTAsIDB4YjQsIDB4MDIsIDB4MTYsIDB4YTMsIDB4ZTAsIDB4YjQsIDB4MDIsIDB4MTEsIDB4N2YsIDB4MjAsIDB4MTIsIDB4MTYsCisweDJjLCAweDkwLCAweDEwLCAweDA0LCAweGUwLCAweDU0LCAweGYzLCAweGYwLCAweDc1LCAweDUxLCAweDAxLCAweDgwLCAweDczLCAweGU1LCAweDUwLCAweDcwLAorMHgwNSwgMHg3NSwgMHg2MiwgMHgwMywgMHg4MCwgMHg2YSwgMHg5MCwgMHgxMiwgMHgwMCwgMHhlMCwgMHg1NCwgMHgwMywgMHg3MCwgMHgxMSwgMHg3ZiwgMHgyMCwKKzB4MTIsIDB4MTYsIDB4MmMsIDB4OTAsIDB4MDIsIDB4YTIsIDB4ZTAsIDB4NTQsIDB4YmYsIDB4ZjAsIDB4NzUsIDB4NTEsIDB4MDIsIDB4ODAsIDB4NTEsIDB4ZTUsCisweDUwLCAweDcwLCAweDAyLCAweDgwLCAweDQ2LCAweDkwLCAweDAyLCAweGEzLCAweGUwLCAweDIwLCAweGU2LCAweDNiLCAweDkwLCAweDA0LCAweDM3LCAweGUwLAorMHg2NCwgMHgyMiwgMHg3MCwgMHgzMywgMHg5MCwgMHgwMSwgMHg4YSwgMHg3NCwgMHg3ZSwgMHhmMCwgMHg5MCwgMHgwMSwgMHg5NiwgMHhmMCwgMHg5MCwgMHgxMiwKKzB4MDQsIDB4NzQsIDB4MGEsIDB4ZjAsIDB4OTAsIDB4MTMsIDB4MjgsIDB4ZTAsIDB4NTQsIDB4ZjAsIDB4ZjAsIDB4YTMsIDB4ZTAsIDB4NTQsIDB4ZjAsIDB4ZjAsCisweGEzLCAweGUwLCAweDU0LCAweGZhLCAweGYwLCAweDkwLCAweDA0LCAweDAxLCAweGUwLCAweDU0LCAweGY5LCAweGYwLCAweDc1LCAweDYyLCAweDAxLCAweDc1LAorMHg1NSwgMHgwMiwgMHhlNCwgMHhmNSwgMHg1MSwgMHg4MCwgMHgwOSwgMHhlNSwgMHg1MCwgMHg3MCwgMHgwNSwgMHg3NSwgMHg2MiwgMHgwMywgMHhmNSwgMHg1MSwKKzB4ZTUsIDB4NjIsIDB4NjAsIDB4MTUsIDB4YzIsIDB4MDEsIDB4ZTQsIDB4ZjUsIDB4NTEsIDB4YzIsIDB4NTksIDB4YWQsIDB4NjIsIDB4YWYsIDB4NDAsIDB4MTIsCisweDE3LCAweDdhLCAweGU1LCAweDYyLCAweGI0LCAweDAzLCAweDAyLCAweGQyLCAweDAzLCAweGQyLCAweGFmLCAweDIyLCAweGMyLCAweGFmLCAweDMwLCAweDAxLAorMHgxMiwgMHhlNCwgMHg5MCwgMHgwMSwgMHg5NiwgMHhmMCwgMHhmNSwgMHg1MSwgMHhjMiwgMHg1OSwgMHhjMiwgMHgwMSwgMHg3ZCwgMHgwMiwgMHhhZiwgMHg0MCwKKzB4MTIsIDB4MTcsIDB4N2EsIDB4ZTUsIDB4NTIsIDB4MTQsIDB4NjAsIDB4MDksIDB4MDQsIDB4NzAsIDB4NGMsIDB4NzUsIDB4NTIsIDB4MDEsIDB4NzUsIDB4NTUsCisweDAzLCAweDkwLCAweDA0LCAweDAxLCAweGUwLCAweDQ0LCAweDBlLCAweGYwLCAweDkwLCAweDEzLCAweDI4LCAweGUwLCAweDQ0LCAweDBmLCAweGYwLCAweGEzLAorMHhlMCwgMHg0NCwgMHgwZiwgMHhmMCwgMHhhMywgMHhlMCwgMHg0NCwgMHgwNSwgMHhmMCwgMHg5MCwgMHgxMiwgMHgwNCwgMHg3NCwgMHgwMywgMHhmMCwgMHg5MCwKKzB4MDIsIDB4YTIsIDB4ZTAsIDB4NDQsIDB4YzAsIDB4ZjAsIDB4OTAsIDB4MTAsIDB4MDQsIDB4ZTAsIDB4NDQsIDB4MGMsIDB4ZjAsIDB4ZTQsIDB4ZjUsIDB4NTIsCisweGY1LCAweDU1LCAweDMwLCAweDAyLCAweDBiLCAweGMyLCAweDAyLCAweDdkLCAweDAxLCAweGFmLCAweDQxLCAweDEyLCAweDE3LCAweDdhLCAweDgwLCAweDAyLAorMHhjMiwgMHgwMywgMHhlNCwgMHg5MCwgMHgwMSwgMHg5NiwgMHhmMCwgMHhkMiwgMHhhZiwgMHgyMiwgMHhlZiwgMHhmNCwgMHg2MCwgMHgyZCwgMHhlNCwgMHhmZSwKKzB4NzQsIDB4MTQsIDB4MmUsIDB4ZjUsIDB4ODIsIDB4ZTQsIDB4MzQsIDB4NzAsIDB4ZjUsIDB4ODMsIDB4ZTAsIDB4YjQsIDB4ZmYsIDB4MTksIDB4NzQsIDB4MTQsCisweDJlLCAweGY1LCAweDgyLCAweGU0LCAweDM0LCAweDcwLCAweGY1LCAweDgzLCAweGVmLCAweGYwLCAweDc0LCAweDFjLCAweDJlLCAweGY1LCAweDgyLCAweGU0LAorMHgzNCwgMHg3MCwgMHhmNSwgMHg4MywgMHhlZCwgMHhmMCwgMHgyMiwgMHgwZSwgMHhiZSwgMHgwNCwgMHhkNSwgMHgyMiwgMHgyMiwgMHgyMiwgMHg5MCwgMHg3MCwKKzB4MmEsIDB4ZTAsIDB4MzAsIDB4ZTEsIDB4NGQsIDB4YzIsIDB4YWYsIDB4OTAsIDB4NzAsIDB4MjgsIDB4ZTAsIDB4OTAsIDB4MTAsIDB4MWMsIDB4ZjAsIDB4OTAsCisweDcwLCAweDI5LCAweGUwLCAweDkwLCAweDEwLCAweDFkLCAweGYwLCAweDkwLCAweDcwLCAweDJhLCAweGUwLCAweDkwLCAweDEwLCAweDFlLCAweGYwLCAweDkwLAorMHgxMCwgMHgxYywgMHhlMCwgMHhmNSwgMHg2MiwgMHg5MCwgMHgxMCwgMHgxZSwgMHhlMCwgMHgyMCwgMHhlMSwgMHhmMywgMHg5MCwgMHgxMCwgMHgxYywgMHhlMCwKKzB4OTAsIDB4NzAsIDB4MjgsIDB4ZjAsIDB4OTAsIDB4MTAsIDB4MWQsIDB4ZTAsIDB4OTAsIDB4NzAsIDB4MjksIDB4ZjAsIDB4OTAsIDB4MTAsIDB4MWUsIDB4ZTAsCisweDkwLCAweDcwLCAweDJhLCAweGYwLCAweDMwLCAweDRhLCAweDA3LCAweDkwLCAweDcwLCAweDI0LCAweGUwLCAweDQ0LCAweDAxLCAweGYwLCAweGMyLCAweDA1LAorMHhkMiwgMHhhZiwgMHgyMiwgMHgyMiwgMHgyMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MGEsIDB4NjksIDB4NzcsCisweGZmLCAweGZmLCAweGZmLCAweDAyLCAweDEwLCAweDI4LCAweDAyLCAweDEwLCAweDMyLCAweDAyLCAweDEwLCAweDc4LCAweDAyLCAweDEyLCAweDI1LCAweDAyLAorMHgxMiwgMHgyNiwgMHgwMiwgMHgxMiwgMHgzOSwgMHgwMiwgMHgxMiwgMHgzZSwgMHgxMiwgMHgxMiwgMHgzYSwgMHgyMiwgMHgwMiwgMHgxNSwgMHg3MiwgMHgwMiwKKzB4MTYsIDB4NDgsIDB4MDIsIDB4MTMsIDB4MjksIDB4MDIsIDB4MTIsIDB4M2YsIDB4MzAsIDB4MDUsIDB4MDYsIDB4MjAsIDB4MGQsIDB4MDMsIDB4MTIsIDB4MTYsCisweGVhLCAweDIyLCAweDkwLCAweDAxLCAweDhjLCAweGUwLCAweDMwLCAweGUzLCAweDFiLCAweGU1LCAweDRjLCAweDMwLCAweGUwLCAweDA0LCAweDdmLCAweDQwLAorMHg4MCwgMHgwMiwgMHg3ZiwgMHgwMCwgMHg5MCwgMHgxMCwgMHgyZiwgMHhlZiwgMHhmMCwgMHg5MCwgMHgwMSwgMHg4YywgMHg3NCwgMHgwOCwgMHhmMCwgMHhlNCwKKzB4OTAsIDB4MDEsIDB4YTcsIDB4ZjAsIDB4OTAsIDB4MDEsIDB4OGMsIDB4ZTAsIDB4MzAsIDB4ZTAsIDB4MWMsIDB4OTAsIDB4MDEsIDB4ODAsIDB4ZTAsIDB4YjQsCisweDAyLCAweDE1LCAweGEzLCAweGUwLCAweGI0LCAweDAxLCAweDEwLCAweDkwLCAweDAxLCAweDg0LCAweGUwLCAweGI0LCAweDgxLCAweDA5LCAweDkwLCAweDAxLAorMHg4YywgMHg3NCwgMHgwMSwgMHhmMCwgMHgxMiwgMHgwZCwgMHhkZCwgMHgyMiwgMHg5MCwgMHgwNCwgMHgxNCwgMHhlMCwgMHgyMCwgMHhlNywgMHgwMywgMHgwMiwKKzB4MTIsIDB4MWEsIDB4OTAsIDB4NzAsIDB4MTIsIDB4ZTAsIDB4ZjUsIDB4NTYsIDB4OTAsIDB4MDQsIDB4MDQsIDB4ZTAsIDB4MTIsIDB4MGEsIDB4YjYsIDB4MTAsCisweGI0LCAweDMxLCAweDEwLCAweGRmLCAweDUwLCAweDExLCAweDA1LCAweDUxLCAweDExLCAweDEwLCAweDUyLCAweDExLCAweDEwLCAweDUzLCAweDExLCAweDEwLAorMHg1NCwgMHgxMSwgMHg1MSwgMHg1NSwgMHgxMSwgMHg3MCwgMHg3MCwgMHgxMSwgMHg5YSwgMHg3MSwgMHgxMSwgMHhjNCwgMHg3MiwgMHgxMSwgMHhmMiwgMHg4MCwKKzB4MDAsIDB4MDAsIDB4MTIsIDB4MWEsIDB4MjAsIDB4MDIsIDB4MDMsIDB4MzAsIDB4MDMsIDB4MWQsIDB4N2QsIDB4MDIsIDB4YWYsIDB4NTYsIDB4MTIsIDB4MGIsCisweGFhLCAweDkwLCAweDA0LCAweDE0LCAweDc0LCAweDgwLCAweGYwLCAweGU0LCAweDkwLCAweDcwLCAweDEzLCAweGYwLCAweGU1LCAweDU2LCAweGY0LCAweDcwLAorMHgwMywgMHgwMiwgMHgxMiwgMHgxYSwgMHgwMiwgMHgxMiwgMHgxMywgMHg4NSwgMHg1NiwgMHg0MSwgMHhkMiwgMHgwMiwgMHgwMiwgMHgxMiwgMHgxYSwgMHg5MCwKKzB4NzAsIDB4MTAsIDB4ZTAsIDB4NTQsIDB4N2YsIDB4NjQsIDB4MDIsIDB4NjAsIDB4MDMsIDB4MDIsIDB4MTIsIDB4MWEsIDB4OTAsIDB4NzAsIDB4MTEsIDB4ZTAsCisweDY0LCAweDA4LCAweDYwLCAweDA4LCAweGUwLCAweDY0LCAweDIwLCAweDYwLCAweDAzLCAweDAyLCAweDEyLCAweDFhLCAweDc1LCAweDRlLCAweDAzLCAweDc1LAorMHg0ZiwgMHgyMCwgMHgwMiwgMHgxMiwgMHgxYSwgMHg5MCwgMHg3MCwgMHgxMSwgMHhlMCwgMHgyNCwgMHhmZiwgMHg5MiwgMHg0NywgMHgwMiwgMHgxMiwgMHgxYSwKKzB4OTAsIDB4MDQsIDB4MDQsIDB4ZTAsIDB4MjUsIDB4ZTAsIDB4MjQsIDB4NWQsIDB4ZjUsIDB4NTcsIDB4OTAsIDB4NzAsIDB4MTAsIDB4ZTAsIDB4ZmYsIDB4NzQsCisweDQ3LCAweDI1LCAweDU3LCAweGY4LCAweGM2LCAweGVmLCAweGM2LCAweDkwLCAweDcwLCAweDExLCAweGUwLCAweGZmLCAweDc0LCAweDQ4LCAweDI1LCAweDU3LAorMHhmOCwgMHhjNiwgMHhlZiwgMHhjNiwgMHhlNCwgMHhmZCwgMHhhZiwgMHg1NiwgMHgxMiwgMHgwYiwgMHhhYSwgMHg5MCwgMHgwNCwgMHgxNCwgMHg3NCwgMHg4MCwKKzB4ZjAsIDB4ZTQsIDB4OTAsIDB4NzAsIDB4MTMsIDB4ZjAsIDB4ZTUsIDB4NTYsIDB4ZjQsIDB4NzAsIDB4MDMsIDB4MDIsIDB4MTIsIDB4MWEsIDB4MDIsIDB4MTIsCisweDEzLCAweGU1LCAweDQ3LCAweDY0LCAweDA3LCAweDYwLCAweDA1LCAweGU1LCAweDQ3LCAweGI0LCAweDA4LCAweDA4LCAweDkwLCAweDcwLCAweDExLCAweGUwLAorMHg1NCwgMHgwNywgMHhmNSwgMHgzYSwgMHhlNCwgMHhmZCwgMHhhZiwgMHg1NiwgMHgxMiwgMHgwYiwgMHhhYSwgMHhkMiwgMHgwNCwgMHgwMiwgMHgxMiwgMHgxYSwKKzB4OTAsIDB4NzAsIDB4MTAsIDB4ZTAsIDB4ZmUsIDB4OTAsIDB4NzAsIDB4MTEsIDB4ZTAsIDB4ZmQsIDB4ZWQsIDB4ZjgsIDB4ZTYsIDB4ZjUsIDB4NTcsIDB4ZmQsCisweGFmLCAweDU2LCAweDEyLCAweDBiLCAweGFhLCAweDkwLCAweDA0LCAweDE0LCAweDc0LCAweDgwLCAweGYwLCAweGU0LCAweDkwLCAweDcwLCAweDEzLCAweGYwLAorMHhlNSwgMHg1NiwgMHhmNCwgMHg3MCwgMHgwMywgMHgwMiwgMHgxMiwgMHgxYSwgMHg4MCwgMHg3OSwgMHg5MCwgMHg3MCwgMHgxMCwgMHhlMCwgMHhmZSwgMHg5MCwKKzB4NzAsIDB4MTEsIDB4ZTAsIDB4ZmQsIDB4ZWQsIDB4ZjUsIDB4ODIsIDB4OGUsIDB4ODMsIDB4ZTAsIDB4ZjUsIDB4NTcsIDB4ZmQsIDB4YWYsIDB4NTYsIDB4MTIsCisweDBiLCAweGFhLCAweDkwLCAweDA0LCAweDE0LCAweDc0LCAweDgwLCAweGYwLCAweGU0LCAweDkwLCAweDcwLCAweDEzLCAweGYwLCAweGU1LCAweDU2LCAweGY0LAorMHg2MCwgMHg1OCwgMHg4MCwgMHg0ZiwgMHhlNCwgMHhmNSwgMHg0ZSwgMHhmNSwgMHg0ZiwgMHg3NSwgMHgzYSwgMHhmZiwgMHhhZCwgMHg1NywgMHhhZiwgMHg1NiwKKzB4MTIsIDB4MGIsIDB4YWEsIDB4OTAsIDB4MDQsIDB4MTQsIDB4NzQsIDB4ODAsIDB4ZjAsIDB4ZTQsIDB4OTAsIDB4NzAsIDB4MTMsIDB4ZjAsIDB4ZTUsIDB4NTYsCisweGY0LCAweDYwLCAweDA3LCAweDkwLCAweDcwLCAweDI1LCAweGUwLCAweDQ0LCAweDAxLCAweGYwLCAweDkwLCAweDcwLCAweDQwLCAweGU1LCAweDNhLCAweGYwLAorMHg4MCwgMHgyOCwgMHg5MCwgMHg3MCwgMHgxMCwgMHhlMCwgMHgyNCwgMHhmZiwgMHg5MiwgMHg0YSwgMHhkMiwgMHgwNSwgMHhhZCwgMHg1NywgMHhhZiwgMHg1NiwKKzB4MTIsIDB4MGIsIDB4YWEsIDB4OTAsIDB4MDQsIDB4MTQsIDB4NzQsIDB4ODAsIDB4ZjAsIDB4ZTQsIDB4OTAsIDB4NzAsIDB4MTMsIDB4ZjAsIDB4ZTUsIDB4NTYsCisweGY0LCAweDYwLCAweDA3LCAweDkwLCAweDcwLCAweDI1LCAweGUwLCAweDQ0LCAweDAxLCAweGYwLCAweDkwLCAweDcwLCAweDQyLCAweGU1LCAweDNhLCAweGYwLAorMHhhMywgMHg3NCwgMHhhYiwgMHhmMCwgMHgyMiwgMHgyMiwgMHhlNSwgMHg1MywgMHg3MCwgMHgwZSwgMHhlNSwgMHg0ZiwgMHg0NSwgMHg0ZSwgMHg2MCwgMHgwOCwKKzB4ZTUsIDB4NGYsIDB4MTUsIDB4NGYsIDB4NzAsIDB4MDIsIDB4MTUsIDB4NGUsIDB4MjIsIDB4MjIsIDB4YzIsIDB4NDIsIDB4ZDMsIDB4MjIsIDB4MjIsIDB4YzIsCisweDRiLCAweGMyLCAweDRjLCAweGU1LCAweDQ0LCAweDEyLCAweDBhLCAweGI2LCAweDEyLCAweDYxLCAweDAwLCAweDEyLCAweGY0LCAweDA0LCAweDEyLCAweGYwLAorMHgwOCwgMHgxMiwgMHhjYiwgMHgxMCwgMHgxMiwgMHg3NSwgMHgyMCwgMHgxMiwgMHg5NSwgMHg2MCwgMHgxMiwgMHhhNiwgMHhhMCwgMHgwMCwgMHgwMCwgMHgxMiwKKzB4ZjYsIDB4ODUsIDB4NDgsIDB4NDMsIDB4ODUsIDB4NGEsIDB4NDIsIDB4ODUsIDB4NGMsIDB4NWUsIDB4ZTUsIDB4NDcsIDB4NjQsIDB4MDYsIDB4NjAsIDB4MDMsCisweDAyLCAweDEyLCAweGY2LCAweDgwLCAweDFiLCAweGU1LCAweDQ4LCAweGM0LCAweDU0LCAweDBmLCAweGY1LCAweDQzLCAweGU1LCAweDRhLCAweGM0LCAweDU0LAorMHgwZiwgMHhmNSwgMHg0MiwgMHhlNSwgMHg0YywgMHhjNCwgMHg1NCwgMHgwZiwgMHhmNSwgMHg1ZSwgMHhlNSwgMHg0NywgMHg2NCwgMHgwNiwgMHg3MCwgMHg2NiwKKzB4NTMsIDB4NDMsIDB4MGYsIDB4ODAsIDB4NjEsIDB4ODUsIDB4NDksIDB4NDMsIDB4ODUsIDB4NGIsIDB4NDIsIDB4ODUsIDB4NGQsIDB4NWUsIDB4ZTUsIDB4NDcsCisweDY0LCAweDA2LCAweDcwLCAweDUyLCAweDgwLCAweDFiLCAweGU1LCAweDQ5LCAweGM0LCAweDU0LCAweDBmLCAweGY1LCAweDQzLCAweGU1LCAweDRiLCAweGM0LAorMHg1NCwgMHgwZiwgMHhmNSwgMHg0MiwgMHhlNSwgMHg0ZCwgMHhjNCwgMHg1NCwgMHgwZiwgMHhmNSwgMHg1ZSwgMHhlNSwgMHg0NywgMHg2NCwgMHgwNiwgMHg3MCwKKzB4MzUsIDB4ZTUsIDB4NDMsIDB4NTQsIDB4MGYsIDB4NDQsIDB4MTAsIDB4ZjUsIDB4NDMsIDB4ODAsIDB4MmIsIDB4ZTUsIDB4NDcsIDB4YjQsIDB4MDQsIDB4MDYsCisweDUzLCAweDVlLCAweGZiLCAweDc1LCAweDQyLCAweDA5LCAweGU1LCAweDQ3LCAweGI0LCAweDA1LCAweDA2LCAweDQzLCAweDVlLCAweDA0LCAweDc1LCAweDQyLAorMHgwOSwgMHhlNSwgMHg0NywgMHhiNCwgMHgwNiwgMHgxMCwgMHhlNSwgMHg0MywgMHg1NCwgMHgwZiwgMHg0NCwgMHgzMCwgMHhmNSwgMHg0MywgMHg4MCwgMHgwNiwKKzB4ZDIsIDB4NGIsIDB4ODAsIDB4MDIsIDB4ZDIsIDB4NGMsIDB4ZTQsIDB4ZjUsIDB4MjUsIDB4ZTUsIDB4NDIsIDB4YzQsIDB4NTQsIDB4ZjAsIDB4ZmYsIDB4ZTUsCisweDQzLCAweDU0LCAweDBmLCAweDRmLCAweGY1LCAweDVmLCAweDkwLCAweDcwLCAweDQ0LCAweGYwLCAweGEzLCAweGU1LCAweDVlLCAweGYwLCAweGEzLCAweGU1LAorMHg0YSwgMHhmMCwgMHhhMywgMHhlNSwgMHg0OCwgMHhmMCwgMHhhMywgMHhlNSwgMHg0YywgMHhmMCwgMHhhMywgMHhlNSwgMHg0NCwgMHhmMCwgMHhhMywgMHhlNSwKKzB4NDIsIDB4ZjAsIDB4YTMsIDB4ZTUsIDB4NDMsIDB4ZjAsIDB4ZDIsIDB4NjAsIDB4MjIsIDB4ZTUsIDB4NDcsIDB4NjAsIDB4MTAsIDB4MjQsIDB4YzAsIDB4NzAsCisweDAzLCAweDEyLCAweDE1LCAweDUyLCAweDEyLCAweDEzLCAweDNlLCAweGMyLCAweGFmLCAweGMyLCAweDA0LCAweGQyLCAweGFmLCAweDIyLCAweGMyLCAweGFmLAorMHg5MCwgMHgwNCwgMHgxNCwgMHhlMCwgMHg1NCwgMHgwZSwgMHg2MCwgMHgwNCwgMHhkMiwgMHgxOCwgMHg4MCwgMHgwOCwgMHhlNSwgMHg0ZSwgMHg0NSwgMHg0ZiwKKzB4MjQsIDB4ZmYsIDB4OTIsIDB4MTgsIDB4ZDIsIDB4YWYsIDB4OTAsIDB4MDQsIDB4MTQsIDB4ZTAsIDB4YTIsIDB4ZTQsIDB4OTIsIDB4MTksIDB4NzQsIDB4MWUsCisweGYwLCAweGU1LCAweDVmLCAweDU0LCAweDBmLCAweGY1LCAweDJkLCAweGU1LCAweDI1LCAweDcwLCAweDEzLCAweDMwLCAweDE4LCAweDA1LCAweGU1LCAweDVmLAorMHgyMCwgMHhlNSwgMHgwYiwgMHgzMCwgMHgxOSwgMHgxOSwgMHhlNSwgMHg1ZiwgMHg1NCwgMHgzMCwgMHhmZiwgMHhiZiwgMHgzMCwgMHgxMSwgMHhlNSwgMHgyNSwKKzB4NzAsIDB4MDUsIDB4NzUsIDB4MjUsIDB4MGMsIDB4ODAsIDB4MDIsIDB4MTUsIDB4MjUsIDB4ZDIsIDB4NmMsIDB4ZDIsIDB4NmQsIDB4ODAsIDB4MGYsIDB4ZTUsCisweDVmLCAweDMwLCAweGU2LCAweDA2LCAweGMyLCAweDZjLCAweGQyLCAweDZkLCAweDgwLCAweDA0LCAweGQyLCAweDZjLCAweGMyLCAweDZkLCAweGU1LCAweDQ3LAorMHg2NCwgMHgwMywgMHg3MCwgMHgyMSwgMHgzMCwgMHg0YiwgMHgwNiwgMHhjMiwgMHg2YywgMHhkMiwgMHg2ZCwgMHg4MCwgMHgxOCwgMHhlNSwgMHgyNSwgMHg3MCwKKzB4MDMsIDB4MzAsIDB4NGMsIDB4MTEsIDB4YzIsIDB4NGMsIDB4ZTUsIDB4MjUsIDB4NzAsIDB4MDUsIDB4NzUsIDB4MjUsIDB4MDcsIDB4ODAsIDB4MDIsIDB4MTUsCisweDI1LCAweGQyLCAweDZjLCAweGQyLCAweDZkLCAweDkwLCAweDcwLCAweDQ2LCAweGU1LCAweDJkLCAweGYwLCAweDIwLCAweDY5LCAweDA3LCAweGU1LCAweDVlLAorMHgyMCwgMHhlMCwgMHgwMiwgMHhiMiwgMHg2OCwgMHgyMCwgMHg2YiwgMHgwNywgMHhlNSwgMHg1ZSwgMHgyMCwgMHhlMSwgMHgwMiwgMHhiMiwgMHg2YSwgMHgyMCwKKzB4NmQsIDB4MDcsIDB4ZTUsIDB4NWUsIDB4MjAsIDB4ZTIsIDB4MDIsIDB4YjIsIDB4NmMsIDB4OTAsIDB4NzAsIDB4NDcsIDB4ZTUsIDB4MmQsIDB4ZjAsIDB4NzUsCisweDJlLCAweDQwLCAweDIwLCAweDY5LCAweDA0LCAweGEyLCAweDY4LCAweDgwLCAweDE1LCAweDMwLCAweDY4LCAweDA2LCAweGU1LCAweDQ2LCAweGEyLCAweGUzLAorMHg4MCwgMHgwYywgMHhlNSwgMHg0NiwgMHg1NCwgMHhmMCwgMHhmZiwgMHhiZiwgMHhmMCwgMHgwMywgMHhkMywgMHg4MCwgMHgwMSwgMHhjMywgMHg5MiwgMHg3MywKKzB4OTIsIDB4NzIsIDB4MjAsIDB4NmIsIDB4MDQsIDB4YTIsIDB4NmEsIDB4ODAsIDB4MTUsIDB4MzAsIDB4NmEsIDB4MDYsIDB4ZTUsIDB4NDYsIDB4YTIsIDB4ZTMsCisweDgwLCAweDBjLCAweGU1LCAweDQ2LCAweDU0LCAweGYwLCAweGZmLCAweGJmLCAweGYwLCAweDAzLCAweGQzLCAweDgwLCAweDAxLCAweGMzLCAweDkyLCAweDc1LAorMHg5MiwgMHg3NCwgMHgyMCwgMHg2ZCwgMHgwNCwgMHhhMiwgMHg2YywgMHg4MCwgMHgxNSwgMHgzMCwgMHg2YywgMHgwNiwgMHhlNSwgMHg0NiwgMHhhMiwgMHhlMywKKzB4ODAsIDB4MGMsIDB4ZTUsIDB4NDYsIDB4NTQsIDB4ZjAsIDB4ZmYsIDB4YmYsIDB4ZjAsIDB4MDMsIDB4ZDMsIDB4ODAsIDB4MDEsIDB4YzMsIDB4OTIsIDB4NzEsCisweDkyLCAweDcwLCAweDkwLCAweDEwLCAweDJmLCAweGU1LCAweDJlLCAweGYwLCAweGU1LCAweDQ3LCAweDY0LCAweDA2LCAweDcwLCAweDRjLCAweDkwLCAweDAyLAorMHgyOSwgMHhlMCwgMHg1NCwgMHhmZSwgMHhmMCwgMHhlNSwgMHg0MywgMHhjNCwgMHg1NCwgMHgwZiwgMHgxNCwgMHg2MCwgMHgxNCwgMHgyNCwgMHhmZSwgMHg2MCwKKzB4MjMsIDB4MjQsIDB4MDMsIDB4NjAsIDB4MDMsIDB4MDIsIDB4MTUsIDB4NDEsIDB4OTAsIDB4MDIsIDB4MjgsIDB4ZTAsIDB4MzAsIDB4NDcsIDB4MGYsIDB4ODAsCisweDA3LCAweDkwLCAweDAyLCAweDI4LCAweGUwLCAweDIwLCAweDQ3LCAweDA2LCAweDU0LCAweGZlLCAweGYwLCAweDAyLCAweDE1LCAweDQxLCAweDQ0LCAweDAxLAorMHhmMCwgMHgwMiwgMHgxNSwgMHg0MSwgMHhlNSwgMHg0NiwgMHgzMCwgMHhlMywgMHgwNCwgMHg3ZiwgMHgwMSwgMHg4MCwgMHgwMiwgMHg3ZiwgMHgwMCwgMHg5MCwKKzB4MDIsIDB4MjgsIDB4ZTAsIDB4NTQsIDB4ZmUsIDB4NGYsIDB4ZjAsIDB4MDIsIDB4MTUsIDB4NDEsIDB4ZTUsIDB4NDcsIDB4NjQsIDB4MDcsIDB4NjAsIDB4MDksCisweGU1LCAweDQ3LCAweDY0LCAweDA4LCAweDYwLCAweDAzLCAweDAyLCAweDE1LCAweDQxLCAweGU0LCAweGY1LCAweDI3LCAweDkwLCAweDAyLCAweDI5LCAweGUwLAorMHg1NCwgMHhmYywgMHhmMCwgMHhlNSwgMHgzYSwgMHgxNCwgMHg2MCwgMHgyNiwgMHgxNCwgMHg2MCwgMHgyZSwgMHgxNCwgMHg2MCwgMHgzNiwgMHgyNCwgMHgwMywKKzB4NzAsIDB4NWYsIDB4ZTUsIDB4NDYsIDB4MTMsIDB4MTMsIDB4MTMsIDB4NTQsIDB4MWYsIDB4NzUsIDB4ZjAsIDB4MDMsIDB4ODQsIDB4YWYsIDB4ZjAsIDB4MjAsCisweDQ3LCAweDA0LCAweDdlLCAweDAxLCAweDgwLCAweDAyLCAweDdlLCAweDAwLCAweGVmLCAweDZlLCAweDI0LCAweGZmLCAweDgwLCAweDAyLCAweGEyLCAweDQ3LAorMHg5MiwgMHgzOSwgMHhhMiwgMHg0NywgMHhiMywgMHg5MiwgMHgzOCwgMHg4MCwgMHgzZiwgMHhlNSwgMHg0NiwgMHgzMCwgMHhlMywgMHgwMywgMHhkMywgMHg4MCwKKzB4MjcsIDB4YzMsIDB4ODAsIDB4MjQsIDB4ZTUsIDB4NDYsIDB4MzAsIDB4ZTMsIDB4MGQsIDB4NTQsIDB4NzAsIDB4YzMsIDB4OTQsIDB4NjAsIDB4NTAsIDB4MDYsCisweDdlLCAweDAwLCAweDdmLCAweDAxLCAweDgwLCAweDA0LCAweDdlLCAweDAwLCAweDdmLCAweDAwLCAweDIwLCAweDQ3LCAweDA0LCAweDdkLCAweDAxLCAweDgwLAorMHgwMiwgMHg3ZCwgMHgwMCwgMHhlZiwgMHg2ZCwgMHg0ZSwgMHgyNCwgMHhmZiwgMHg5MiwgMHgzOCwgMHhhMiwgMHg0NywgMHhiMywgMHg5MiwgMHgzOSwgMHg4MCwKKzB4MDcsIDB4YTIsIDB4NDcsIDB4YjMsIDB4OTIsIDB4MzgsIDB4OTIsIDB4MzksIDB4OTAsIDB4MDIsIDB4MjgsIDB4ZTAsIDB4NTQsIDB4ZmMsIDB4NDUsIDB4MjcsCisweGYwLCAweDkwLCAweDcwLCAweDljLCAweGU1LCAweDNhLCAweGYwLCAweGEzLCAweGU1LCAweDQ3LCAweGYwLCAweDkwLCAweDcwLCAweDQxLCAweGU1LCAweDNhLAorMHhmMCwgMHgyMiwgMHhlNCwgMHg5MCwgMHgwMiwgMHgyOSwgMHhmMCwgMHgzMCwgMHg0NywgMHgwNCwgMHhhZiwgMHg0NSwgMHg4MCwgMHgwNCwgMHhlNSwgMHg0NSwKKzB4ZjQsIDB4ZmYsIDB4OTAsIDB4MDIsIDB4MjgsIDB4ZWYsIDB4ZjAsIDB4MjIsIDB4OGYsIDB4NTAsIDB4ZDIsIDB4NTksIDB4MjIsIDB4OGYsIDB4NTQsIDB4ZDIsCisweDU4LCAweDIyLCAweGU0LCAweGY1LCAweDYyLCAweGMyLCAweGFmLCAweGU1LCAweDUxLCAweDE0LCAweDYwLCAweDQ2LCAweDE0LCAweDYwLCAweDYyLCAweDI0LAorMHgwMiwgMHg2MCwgMHgwMywgMHgwMiwgMHgxNiwgMHgyYywgMHhkMiwgMHg1OSwgMHg3NSwgMHg1NSwgMHgwMSwgMHg5MCwgMHgwMiwgMHhhMiwgMHhlMCwgMHg1NCwKKzB4N2YsIDB4ZjAsIDB4YTMsIDB4ZTAsIDB4MjAsIDB4ZTcsIDB4MjIsIDB4OTAsIDB4MDQsIDB4MzQsIDB4ZTAsIDB4YjQsIDB4MDIsIDB4MWIsIDB4YTMsIDB4ZTAsCisweGI0LCAweDAyLCAweDE2LCAweGEzLCAweGUwLCAweGI0LCAweDAyLCAweDExLCAweDdmLCAweDIwLCAweDEyLCAweDE1LCAweDY4LCAweDkwLCAweDEwLCAweDA0LAorMHhlMCwgMHg1NCwgMHhmMywgMHhmMCwgMHg3NSwgMHg1MSwgMHgwMSwgMHg4MCwgMHg3MywgMHhlNSwgMHg1MCwgMHg3MCwgMHgwNSwgMHg3NSwgMHg2MiwgMHgwMywKKzB4ODAsIDB4NmEsIDB4OTAsIDB4MTIsIDB4MDAsIDB4ZTAsIDB4NTQsIDB4MDMsIDB4NzAsIDB4MTEsIDB4N2YsIDB4MjAsIDB4MTIsIDB4MTUsIDB4NjgsIDB4OTAsCisweDAyLCAweGEyLCAweGUwLCAweDU0LCAweGJmLCAweGYwLCAweDc1LCAweDUxLCAweDAyLCAweDgwLCAweDUxLCAweGU1LCAweDUwLCAweDcwLCAweDAyLCAweDgwLAorMHg0NiwgMHg5MCwgMHgwMiwgMHhhMywgMHhlMCwgMHgyMCwgMHhlNiwgMHgzYiwgMHg5MCwgMHgwNCwgMHgzNywgMHhlMCwgMHg2NCwgMHgyMiwgMHg3MCwgMHgzMywKKzB4OTAsIDB4MDEsIDB4OGEsIDB4NzQsIDB4N2UsIDB4ZjAsIDB4OTAsIDB4MDEsIDB4OTYsIDB4ZjAsIDB4OTAsIDB4MTIsIDB4MDQsIDB4NzQsIDB4MGEsIDB4ZjAsCisweDkwLCAweDEzLCAweDI4LCAweGUwLCAweDU0LCAweGYwLCAweGYwLCAweGEzLCAweGUwLCAweDU0LCAweGYwLCAweGYwLCAweGEzLCAweGUwLCAweDU0LCAweGZhLAorMHhmMCwgMHg5MCwgMHgwNCwgMHgwMSwgMHhlMCwgMHg1NCwgMHhmOSwgMHhmMCwgMHg3NSwgMHg2MiwgMHgwMSwgMHg3NSwgMHg1NSwgMHgwMiwgMHhlNCwgMHhmNSwKKzB4NTEsIDB4ODAsIDB4MDksIDB4ZTUsIDB4NTAsIDB4NzAsIDB4MDUsIDB4NzUsIDB4NjIsIDB4MDMsIDB4ZjUsIDB4NTEsIDB4ZTUsIDB4NjIsIDB4NjAsIDB4MTUsCisweGMyLCAweDAxLCAweGU0LCAweGY1LCAweDUxLCAweGMyLCAweDU5LCAweGFkLCAweDYyLCAweGFmLCAweDQwLCAweDEyLCAweDE2LCAweGI2LCAweGU1LCAweDYyLAorMHhiNCwgMHgwMywgMHgwMiwgMHhkMiwgMHgwMywgMHhkMiwgMHhhZiwgMHgyMiwgMHhjMiwgMHhhZiwgMHgzMCwgMHgwMSwgMHgxMiwgMHhlNCwgMHg5MCwgMHgwMSwKKzB4OTYsIDB4ZjAsIDB4ZjUsIDB4NTEsIDB4YzIsIDB4NTksIDB4YzIsIDB4MDEsIDB4N2QsIDB4MDIsIDB4YWYsIDB4NDAsIDB4MTIsIDB4MTYsIDB4YjYsIDB4ZTUsCisweDUyLCAweDE0LCAweDYwLCAweDA5LCAweDA0LCAweDcwLCAweDRjLCAweDc1LCAweDUyLCAweDAxLCAweDc1LCAweDU1LCAweDAzLCAweDkwLCAweDA0LCAweDAxLAorMHhlMCwgMHg0NCwgMHgwZSwgMHhmMCwgMHg5MCwgMHgxMywgMHgyOCwgMHhlMCwgMHg0NCwgMHgwZiwgMHhmMCwgMHhhMywgMHhlMCwgMHg0NCwgMHgwZiwgMHhmMCwKKzB4YTMsIDB4ZTAsIDB4NDQsIDB4MDUsIDB4ZjAsIDB4OTAsIDB4MTIsIDB4MDQsIDB4NzQsIDB4MDMsIDB4ZjAsIDB4OTAsIDB4MDIsIDB4YTIsIDB4ZTAsIDB4NDQsCisweGMwLCAweGYwLCAweDkwLCAweDEwLCAweDA0LCAweGUwLCAweDQ0LCAweDBjLCAweGYwLCAweGU0LCAweGY1LCAweDUyLCAweGY1LCAweDU1LCAweDMwLCAweDAyLAorMHgwYiwgMHhjMiwgMHgwMiwgMHg3ZCwgMHgwMSwgMHhhZiwgMHg0MSwgMHgxMiwgMHgxNiwgMHhiNiwgMHg4MCwgMHgwMiwgMHhjMiwgMHgwMywgMHhlNCwgMHg5MCwKKzB4MDEsIDB4OTYsIDB4ZjAsIDB4ZDIsIDB4YWYsIDB4MjIsIDB4ZWYsIDB4ZjQsIDB4NjAsIDB4MmQsIDB4ZTQsIDB4ZmUsIDB4NzQsIDB4MTQsIDB4MmUsIDB4ZjUsCisweDgyLCAweGU0LCAweDM0LCAweDcwLCAweGY1LCAweDgzLCAweGUwLCAweGI0LCAweGZmLCAweDE5LCAweDc0LCAweDE0LCAweDJlLCAweGY1LCAweDgyLCAweGU0LAorMHgzNCwgMHg3MCwgMHhmNSwgMHg4MywgMHhlZiwgMHhmMCwgMHg3NCwgMHgxYywgMHgyZSwgMHhmNSwgMHg4MiwgMHhlNCwgMHgzNCwgMHg3MCwgMHhmNSwgMHg4MywKKzB4ZWQsIDB4ZjAsIDB4MjIsIDB4MGUsIDB4YmUsIDB4MDQsIDB4ZDUsIDB4MjIsIDB4MjIsIDB4MjIsIDB4OTAsIDB4NzAsIDB4MmEsIDB4ZTAsIDB4MzAsIDB4ZTEsCisweDRkLCAweGMyLCAweGFmLCAweDkwLCAweDcwLCAweDI4LCAweGUwLCAweDkwLCAweDEwLCAweDFjLCAweGYwLCAweDkwLCAweDcwLCAweDI5LCAweGUwLCAweDkwLAorMHgxMCwgMHgxZCwgMHhmMCwgMHg5MCwgMHg3MCwgMHgyYSwgMHhlMCwgMHg5MCwgMHgxMCwgMHgxZSwgMHhmMCwgMHg5MCwgMHgxMCwgMHgxYywgMHhlMCwgMHhmNSwKKzB4NjIsIDB4OTAsIDB4MTAsIDB4MWUsIDB4ZTAsIDB4MjAsIDB4ZTEsIDB4ZjMsIDB4OTAsIDB4MTAsIDB4MWMsIDB4ZTAsIDB4OTAsIDB4NzAsIDB4MjgsIDB4ZjAsCisweDkwLCAweDEwLCAweDFkLCAweGUwLCAweDkwLCAweDcwLCAweDI5LCAweGYwLCAweDkwLCAweDEwLCAweDFlLCAweGUwLCAweDkwLCAweDcwLCAweDJhLCAweGYwLAorMHgzMCwgMHg0YSwgMHgwNywgMHg5MCwgMHg3MCwgMHgyNCwgMHhlMCwgMHg0NCwgMHgwMSwgMHhmMCwgMHhjMiwgMHgwNSwgMHhkMiwgMHhhZiwgMHgyMiwgMHgyMiwKKzB4MjIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweGU5LCAweDAwLCB9IDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL21kNS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vbWQ1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzc0Nzc2YgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL21kNS5jCkBAIC0wLDAgKzEsMTQyNyBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICBNb2R1bGUgTmFtZToKKyAgICBtZDUuYworCisJQWJzdHJhY3Q6CisKKwlSZXZpc2lvbiBIaXN0b3J5OgorCVdobwkJCVdoZW4JCQlXaGF0CisJLS0tLS0tLS0JLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCU5hbWUJCURhdGUJCQlNb2RpZmljYXRpb24gbG9ncworCWphbgkJCTEwLTI4LTAzCQlJbml0aWFsCisJUml0YSAgICAJMTEtMjMtMDQJCU1vZGlmeSBNRDUgYW5kIFNIQS0xCisJUml0YQkJMTAtMTQtMDUJCU1vZGlmeSBTSEEtMSBpbiBiaWctZW5kaWFuIHBsYXRmb3JtCisgKi8KKyNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKKworLyoqCisgKiBtZDVfbWFjOgorICogQGtleTogcG9pbnRlciB0bwl0aGUJa2V5CXVzZWQgZm9yIE1BQyBnZW5lcmF0aW9uCisgKiBAa2V5X2xlbjogbGVuZ3RoCW9mIHRoZSBrZXkgaW4gYnl0ZXMKKyAqIEBkYXRhOiBwb2ludGVyIHRvIHRoZSBkYXRhIGFyZWEgZm9yIHdoaWNoIHRoZSBNQUMgaXMJZ2VuZXJhdGVkCisgKiBAZGF0YV9sZW46IGxlbmd0aCBvZgl0aGUJZGF0YSBpbglieXRlcworICogQG1hYzogcG9pbnRlciB0bwl0aGUJYnVmZmVyIGhvbGRpbmcgc3BhY2UgZm9yIHRoZSBNQUM7IHRoZSBidWZmZXIgc2hvdWxkCisgKiBoYXZlCXNwYWNlIGZvciAxMjgtYml0ICgxNiBieXRlcykgTUQ1IGhhc2ggdmFsdWUKKyAqCisgKiBtZDVfbWFjKCkgZGV0ZXJtaW5lcwl0aGUJbWVzc2FnZQlhdXRoZW50aWNhdGlvbiBjb2RlCWJ5IHVzaW5nIHNlY3VyZQloYXNoCisgKiBNRDUoa2V5IHwgZGF0YSB8CWtleSkuCisgKi8KK3ZvaWQgbWQ1X21hYyh1OCAqa2V5LCBzaXplX3Qga2V5X2xlbiwgdTggKmRhdGEsIHNpemVfdCBkYXRhX2xlbiwgdTggKm1hYykKK3sKKwlNRDVfQ1RYCWNvbnRleHQ7CisKKwlNRDVJbml0KCZjb250ZXh0KTsKKwlNRDVVcGRhdGUoJmNvbnRleHQsCWtleSwga2V5X2xlbik7CisJTUQ1VXBkYXRlKCZjb250ZXh0LAlkYXRhLCBkYXRhX2xlbik7CisJTUQ1VXBkYXRlKCZjb250ZXh0LAlrZXksIGtleV9sZW4pOworCU1ENUZpbmFsKG1hYywgJmNvbnRleHQpOworfQorCisvKioKKyAqIGhtYWNfbWQ1OgorICogQGtleTogcG9pbnRlciB0bwl0aGUJa2V5CXVzZWQgZm9yIE1BQyBnZW5lcmF0aW9uCisgKiBAa2V5X2xlbjogbGVuZ3RoCW9mIHRoZSBrZXkgaW4gYnl0ZXMKKyAqIEBkYXRhOiBwb2ludGVyIHRvIHRoZSBkYXRhIGFyZWEgZm9yIHdoaWNoIHRoZSBNQUMgaXMJZ2VuZXJhdGVkCisgKiBAZGF0YV9sZW46IGxlbmd0aCBvZgl0aGUJZGF0YSBpbglieXRlcworICogQG1hYzogcG9pbnRlciB0bwl0aGUJYnVmZmVyIGhvbGRpbmcgc3BhY2UgZm9yIHRoZSBNQUM7IHRoZSBidWZmZXIgc2hvdWxkCisgKiBoYXZlCXNwYWNlIGZvciAxMjgtYml0ICgxNiBieXRlcykgTUQ1IGhhc2ggdmFsdWUKKyAqCisgKiBobWFjX21kNSgpIGRldGVybWluZXMgdGhlIG1lc3NhZ2UgYXV0aGVudGljYXRpb24JY29kZSB1c2luZyBITUFDLU1ENS4KKyAqIFRoaXMJaW1wbGVtZW50YXRpb24gaXMgYmFzZWQJb24gdGhlIHNhbXBsZSBjb2RlIHByZXNlbnRlZCBpbglSRkMJMjEwNC4KKyAqLwordm9pZCBobWFjX21kNSh1OCAqa2V5LCBzaXplX3Qga2V5X2xlbiwgdTggKmRhdGEsIHNpemVfdCBkYXRhX2xlbiwgdTggKm1hYykKK3sKKwlNRDVfQ1RYCWNvbnRleHQ7CisgICAgdTgga19pcGFkWzY1XTsgLyogaW5uZXIgcGFkZGluZyAtIGtleSBYT1JkIHdpdGggaXBhZCAqLworICAgIHU4IGtfb3BhZFs2NV07IC8qIG91dGVyIHBhZGRpbmcgLSBrZXkgWE9SZCB3aXRoIG9wYWQgKi8KKyAgICB1OCB0a1sxNl07CisJaW50CWk7CisKKwkvL2Fzc2VydChrZXkgIT0gTlVMTCAmJiBkYXRhICE9IE5VTEwgJiYgbWFjICE9IE5VTEwpOworCisJLyogaWYga2V5IGlzIGxvbmdlcgl0aGFuIDY0CWJ5dGVzIHJlc2V0CWl0IHRvIGtleSA9CU1ENShrZXkpICovCisJaWYgKGtleV9sZW4JPiA2NCkgeworCQlNRDVfQ1RYCXR0Y29udGV4dDsKKworCQlNRDVJbml0KCZ0dGNvbnRleHQpOworCQlNRDVVcGRhdGUoJnR0Y29udGV4dCwga2V5LCBrZXlfbGVuKTsKKwkJTUQ1RmluYWwodGssICZ0dGNvbnRleHQpOworCQkvL2tleT0oUFVDSEFSKXR0Y29udGV4dC5idWY7CisJCWtleQk9IHRrOworCQlrZXlfbGVuCT0gMTY7CisJfQorCisJLyogdGhlIEhNQUNfTUQ1CXRyYW5zZm9ybSBsb29rcwlsaWtlOgorCSAqCisJICogTUQ1KEsgWE9SIG9wYWQsIE1ENShLIFhPUiBpcGFkLCB0ZXh0KSkKKwkgKgorCSAqIHdoZXJlIEsgaXMgYW4gbiBieXRlCWtleQorCSAqIGlwYWQJaXMgdGhlIGJ5dGUJMHgzNiByZXBlYXRlZCA2NCB0aW1lcworCSAqIG9wYWQJaXMgdGhlIGJ5dGUJMHg1YyByZXBlYXRlZCA2NCB0aW1lcworCSAqIGFuZCB0ZXh0CWlzIHRoZSBkYXRhCWJlaW5nIHByb3RlY3RlZAkqLworCisJLyogc3RhcnQgb3V0IGJ5CXN0b3JpbmcJa2V5CWluIHBhZHMJKi8KKwlOZGlzWmVyb01lbW9yeShrX2lwYWQsIHNpemVvZihrX2lwYWQpKTsKKwlOZGlzWmVyb01lbW9yeShrX29wYWQsCXNpemVvZihrX29wYWQpKTsKKwkvL2Fzc2VydChrZXlfbGVuIDwgc2l6ZW9mKGtfaXBhZCkpOworCU5kaXNNb3ZlTWVtb3J5KGtfaXBhZCwga2V5LAlrZXlfbGVuKTsKKwlOZGlzTW92ZU1lbW9yeShrX29wYWQsIGtleSwJa2V5X2xlbik7CisKKwkvKiBYT1Iga2V5IHdpdGgJaXBhZCBhbmQgb3BhZCB2YWx1ZXMgKi8KKwlmb3IJKGkgPSAwOwlpIDwJNjQ7CWkrKykgeworCQlrX2lwYWRbaV0gXj0gMHgzNjsKKwkJa19vcGFkW2ldIF49IDB4NWM7CisJfQorCisJLyogcGVyZm9ybSBpbm5lciBNRDUgKi8KKwlNRDVJbml0KCZjb250ZXh0KTsJCQkJCSAvKglpbml0IGNvbnRleHQgZm9yIDFzdCBwYXNzICovCisJTUQ1VXBkYXRlKCZjb250ZXh0LAlrX2lwYWQsCTY0KTsJIC8qCXN0YXJ0IHdpdGggaW5uZXIgcGFkICovCisJTUQ1VXBkYXRlKCZjb250ZXh0LAlkYXRhLCBkYXRhX2xlbik7IC8qCXRoZW4gdGV4dCBvZiBkYXRhZ3JhbSAqLworCU1ENUZpbmFsKG1hYywgJmNvbnRleHQpOwkJCSAvKglmaW5pc2ggdXAgMXN0IHBhc3MgKi8KKworCS8qIHBlcmZvcm0gb3V0ZXIgTUQ1ICovCisJTUQ1SW5pdCgmY29udGV4dCk7CQkJCQkgLyoJaW5pdCBjb250ZXh0IGZvciAybmQgcGFzcyAqLworCU1ENVVwZGF0ZSgmY29udGV4dCwJa19vcGFkLAk2NCk7CSAvKglzdGFydCB3aXRoIG91dGVyIHBhZCAqLworCU1ENVVwZGF0ZSgmY29udGV4dCwJbWFjLCAxNik7CQkgLyoJdGhlbiByZXN1bHRzIG9mCTFzdAloYXNoICovCisJTUQ1RmluYWwobWFjLCAmY29udGV4dCk7CQkJIC8qCWZpbmlzaCB1cCAybmQgcGFzcyAqLworfQorCisjaWZuZGVmIFJUX0JJR19FTkRJQU4KKyNkZWZpbmUgYnl0ZVJldmVyc2UoYnVmLCBsZW4pICAgLyogTm90aGluZyAqLworI2Vsc2UKK3ZvaWQgYnl0ZVJldmVyc2UodW5zaWduZWQgY2hhciAqYnVmLCB1bnNpZ25lZCBsb25ncyk7Cit2b2lkIGJ5dGVSZXZlcnNlKHVuc2lnbmVkIGNoYXIgKmJ1ZiwgdW5zaWduZWQgbG9uZ3MpCit7CisgICAgZG8geworICAgICAgICAqKFVJTlQzMiAqKWJ1ZiA9IFNXQVAzMigqKFVJTlQzMiAqKWJ1Zik7CisgICAgICAgIGJ1ZiArPSA0OworICAgIH0gd2hpbGUgKC0tbG9uZ3MpOworfQorI2VuZGlmCisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT0gIE1ENSBpbXBsZW1lbnRhdGlvbiA9PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8vIGZvdXIgYmFzZSBmdW5jdGlvbnMgZm9yIE1ENQorI2RlZmluZSBNRDVfRjEoeCwgeSwgeikgKCgoeCkgJiAoeSkpIHwgKCh+eCkgJiAoeikpKQorI2RlZmluZSBNRDVfRjIoeCwgeSwgeikgKCgoeCkgJiAoeikpIHwgKCh5KSAmICh+eikpKQorI2RlZmluZSBNRDVfRjMoeCwgeSwgeikgKCh4KSBeICh5KSBeICh6KSkKKyNkZWZpbmUgTUQ1X0Y0KHgsIHksIHopICgoeSkgXiAoKHgpIHwgKH56KSkpCisjZGVmaW5lIENZQ0xJQ19MRUZUX1NISUZUKHcsIHMpICgoKHcpIDw8IChzKSkgfCAoKHcpID4+ICgzMi0ocykpKSkKKworI2RlZmluZQlNRDVTdGVwKGYsIHcsIHgsIHksCXosIGRhdGEsIHQsIHMpCVwKKwkoIHcJKz0gZih4LAl5LCB6KSArCWRhdGEgKyB0LCAgdyA9IChDWUNMSUNfTEVGVF9TSElGVCh3LCBzKSkgJiAweGZmZmZmZmZmLCB3ICs9CXggKQorCisKKy8qCisgKiAgRnVuY3Rpb24gRGVzY3JpcHRpb246CisgKiAgICAgIEluaXRpYXRlIE1ENSBDb250ZXh0IHNhdGlzZmllZCBpbiBSRkMgMTMyMQorICoKKyAqICBBcmd1bWVudHM6CisgKiAgICAgIHBDdHggICAgICAgIFBvaW50ZXIJdG8gTUQ1IGNvbnRleHQKKyAqCisgKiAgUmV0dXJuIFZhbHVlOgorICogICAgICBOb25lCisgKi8KK1ZPSUQgTUQ1SW5pdChNRDVfQ1RYICpwQ3R4KQoreworICAgIHBDdHgtPkJ1ZlswXT0weDY3NDUyMzAxOworICAgIHBDdHgtPkJ1ZlsxXT0weGVmY2RhYjg5OworICAgIHBDdHgtPkJ1ZlsyXT0weDk4YmFkY2ZlOworICAgIHBDdHgtPkJ1ZlszXT0weDEwMzI1NDc2OworCisgICAgcEN0eC0+TGVuSW5CaXRDb3VudFswXT0wOworICAgIHBDdHgtPkxlbkluQml0Q291bnRbMV09MDsKK30KKworCisvKgorICogIEZ1bmN0aW9uIERlc2NyaXB0aW9uOgorICogICAgICBVcGRhdGUgTUQ1IENvbnRleHQsIGFsbG93IG9mIGFuIGFycmFyeSBvZiBvY3RldHMgYXMgdGhlIG5leHQgcG9ydGlvbgorICogICAgICBvZiB0aGUgbWVzc2FnZQorICoKKyAqICBBcmd1bWVudHM6CisgKiAgICAgIHBDdHgJCVBvaW50ZXIJdG8gTUQ1IGNvbnRleHQKKyAqIAkgICAgcERhdGEgICAgICAgUG9pbnRlciB0byBpbnB1dCBkYXRhCisgKiAgICAgIExlbkluQnl0ZXMgIFRoZSBsZW5ndGggb2YgaW5wdXQgZGF0YSAodW5pdDogYnl0ZSkKKyAqCisgKiAgUmV0dXJuIFZhbHVlOgorICogICAgICBOb25lCisgKgorICogIE5vdGU6CisgKiAgICAgIENhbGxlZCBhZnRlciBNRDVJbml0IG9yIE1ENVVwZGF0ZShpdHNlbGYpCisgKi8KK1ZPSUQgTUQ1VXBkYXRlKE1ENV9DVFggKnBDdHgsIFVDSEFSICpwRGF0YSwgVUlOVDMyIExlbkluQnl0ZXMpCit7CisKKyAgICBVSU5UMzIgVGZUaW1lczsKKyAgICBVSU5UMzIgdGVtcDsKKwl1bnNpZ25lZCBpbnQgaTsKKworICAgIHRlbXAgPSBwQ3R4LT5MZW5JbkJpdENvdW50WzBdOworCisgICAgcEN0eC0+TGVuSW5CaXRDb3VudFswXSA9IChVSU5UMzIpIChwQ3R4LT5MZW5JbkJpdENvdW50WzBdICsgKExlbkluQnl0ZXMgPDwgMykpOworCisgICAgaWYgKHBDdHgtPkxlbkluQml0Q291bnRbMF0gPCB0ZW1wKQorICAgICAgICBwQ3R4LT5MZW5JbkJpdENvdW50WzFdKys7ICAgLy9jYXJyeSBpbgorCisgICAgcEN0eC0+TGVuSW5CaXRDb3VudFsxXSArPSBMZW5JbkJ5dGVzID4+IDI5OworCisgICAgLy8gbW9kIDY0IGJ5dGVzCisgICAgdGVtcCA9ICh0ZW1wID4+IDMpICYgMHgzZjsKKworICAgIC8vIHByb2Nlc3MgbGFja3Mgb2YgNjQtYnl0ZSBkYXRhCisgICAgaWYgKHRlbXApCisgICAgeworICAgICAgICBVQ0hBUiAqcEFkcyA9IChVQ0hBUiAqKSBwQ3R4LT5JbnB1dCArIHRlbXA7CisKKyAgICAgICAgaWYgKCh0ZW1wK0xlbkluQnl0ZXMpIDwgNjQpCisgICAgICAgIHsKKyAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZHMsIChVQ0hBUiAqKXBEYXRhLCBMZW5JbkJ5dGVzKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZHMsIChVQ0hBUiAqKXBEYXRhLCA2NC10ZW1wKTsKKyAgICAgICAgYnl0ZVJldmVyc2UocEN0eC0+SW5wdXQsIDE2KTsKKyAgICAgICAgTUQ1VHJhbnNmb3JtKHBDdHgtPkJ1ZiwgKFVJTlQzMiAqKXBDdHgtPklucHV0KTsKKworICAgICAgICBwRGF0YSArPSA2NC10ZW1wOworICAgICAgICBMZW5JbkJ5dGVzIC09IDY0LXRlbXA7CisgICAgfSAvLyBlbmQgb2YgaWYgKHRlbXApCisKKworICAgIFRmVGltZXMgPSAoTGVuSW5CeXRlcyA+PiA2KTsKKworICAgIGZvciAoaT1UZlRpbWVzOyBpPjA7IGktLSkKKyAgICB7CisgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBDdHgtPklucHV0LCAoVUNIQVIgKilwRGF0YSwgNjQpOworICAgICAgICBieXRlUmV2ZXJzZShwQ3R4LT5JbnB1dCwgMTYpOworICAgICAgICBNRDVUcmFuc2Zvcm0ocEN0eC0+QnVmLCAoVUlOVDMyICopcEN0eC0+SW5wdXQpOworICAgICAgICBwRGF0YSArPSA2NDsKKyAgICAgICAgTGVuSW5CeXRlcyAtPSA2NDsKKyAgICB9IC8vIGVuZCBvZiBmb3IKKworICAgIC8vIGJ1ZmZlcmluZyBsYWNrcyBvZiA2NC1ieXRlIGRhdGEKKyAgICBpZihMZW5JbkJ5dGVzKQorICAgICAgICBOZGlzTW92ZU1lbW9yeShwQ3R4LT5JbnB1dCwgKFVDSEFSICopcERhdGEsIExlbkluQnl0ZXMpOworCit9CisKKworLyoKKyAqICBGdW5jdGlvbiBEZXNjcmlwdGlvbjoKKyAqICAgICAgQXBwZW5kIHBhZGRpbmcgYml0cyBhbmQgbGVuZ3RoIG9mIG9yaWdpbmFsIG1lc3NhZ2UgaW4gdGhlIHRhaWwKKyAqICAgICAgVGhlIG1lc3NhZ2UgZGlnZXN0IGhhcyB0byBiZSBjb21wbGV0ZWQgaW4gdGhlIGVuZAorICoKKyAqICBBcmd1bWVudHM6CisgKiAgICAgIERpZ2VzdAkJT3V0cHV0IG9mIERpZ2VzdC1NZXNzYWdlIGZvciBNRDUKKyAqICAJcEN0eCAgICAgICAgUG9pbnRlcgl0byBNRDUgY29udGV4dAorICoKKyAqICBSZXR1cm4gVmFsdWU6CisgKiAgICAgIE5vbmUKKyAqCisgKiAgTm90ZToKKyAqICAgICAgQ2FsbGVkIGFmdGVyIE1ENVVwZGF0ZQorICovCitWT0lEIE1ENUZpbmFsKFVDSEFSIERpZ2VzdFsxNl0sIE1ENV9DVFggKnBDdHgpCit7CisgICAgVUNIQVIgUmVtYWluZGVyOworICAgIFVDSEFSIFBhZExlbkluQnl0ZXM7CisgICAgVUNIQVIgKnBBcHBlbmQ9MDsKKyAgICB1bnNpZ25lZCBpbnQgaTsKKworICAgIFJlbWFpbmRlciA9IChVQ0hBUikoKHBDdHgtPkxlbkluQml0Q291bnRbMF0gPj4gMykgJiAweDNmKTsKKworICAgIFBhZExlbkluQnl0ZXMgPSAoUmVtYWluZGVyIDwgNTYpID8gKDU2LVJlbWFpbmRlcikgOiAoMTIwLVJlbWFpbmRlcik7CisKKyAgICBwQXBwZW5kID0gKFVDSEFSICopcEN0eC0+SW5wdXQgKyBSZW1haW5kZXI7CisKKyAgICAvLyBwYWRkaW5nIGJpdHMgd2l0aG91dCBjcm9zc2luZyBibG9jayg2NC1ieXRlIGJhc2VkKSBib3VuZGFyeQorICAgIGlmIChSZW1haW5kZXIgPCA1NikKKyAgICB7CisgICAgICAgICpwQXBwZW5kID0gMHg4MDsKKyAgICAgICAgUGFkTGVuSW5CeXRlcyAtLTsKKworICAgICAgICBOZGlzWmVyb01lbW9yeSgoVUNIQVIgKilwQ3R4LT5JbnB1dCArIFJlbWFpbmRlcisxLCBQYWRMZW5JbkJ5dGVzKTsKKworCQkvLyBhZGQgZGF0YS1sZW5ndGggZmllbGQsIGZyb20gbG93IHRvIGhpZ2gKKyAgICAgICAJZm9yIChpPTA7IGk8NDsgaSsrKQorICAgICAgICB7CisgICAgICAgIAlwQ3R4LT5JbnB1dFs1NitpXSA9IChVQ0hBUikoKHBDdHgtPkxlbkluQml0Q291bnRbMF0gPj4gKGkgPDwgMykpICYgMHhmZik7CisgICAgICAgIAlwQ3R4LT5JbnB1dFs2MCtpXSA9IChVQ0hBUikoKHBDdHgtPkxlbkluQml0Q291bnRbMV0gPj4gKGkgPDwgMykpICYgMHhmZik7CisgICAgICAJfQorCisgICAgICAgIGJ5dGVSZXZlcnNlKHBDdHgtPklucHV0LCAxNik7CisgICAgICAgIE1ENVRyYW5zZm9ybShwQ3R4LT5CdWYsIChVSU5UMzIgKilwQ3R4LT5JbnB1dCk7CisgICAgfSAvLyBlbmQgb2YgaWYKKworICAgIC8vIHBhZGRpbmcgYml0cyB3aXRoIGNyb3NzaW5nIGJsb2NrKDY0LWJ5dGUgYmFzZWQpIGJvdW5kYXJ5CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLy8gdGhlIGZpcnN0IGJsb2NrID09PQorICAgICAgICAqcEFwcGVuZCA9IDB4ODA7CisgICAgICAgIFBhZExlbkluQnl0ZXMgLS07CisKKyAgICAgICAgTmRpc1plcm9NZW1vcnkoKFVDSEFSICopcEN0eC0+SW5wdXQgKyBSZW1haW5kZXIrMSwgKDY0LVJlbWFpbmRlci0xKSk7CisgICAgICAgIFBhZExlbkluQnl0ZXMgLT0gKDY0IC0gUmVtYWluZGVyIC0gMSk7CisKKyAgICAgICAgYnl0ZVJldmVyc2UocEN0eC0+SW5wdXQsIDE2KTsKKyAgICAgICAgTUQ1VHJhbnNmb3JtKHBDdHgtPkJ1ZiwgKFVJTlQzMiAqKXBDdHgtPklucHV0KTsKKworCisgICAgICAgIC8vIHRoZSBzZWNvbmQgYmxvY2sgPT09CisgICAgICAgIE5kaXNaZXJvTWVtb3J5KChVQ0hBUiAqKXBDdHgtPklucHV0LCBQYWRMZW5JbkJ5dGVzKTsKKworICAgICAgICAvLyBhZGQgZGF0YS1sZW5ndGggZmllbGQKKyAgICAgICAgZm9yIChpPTA7IGk8NDsgaSsrKQorICAgICAgICB7CisgICAgICAgIAlwQ3R4LT5JbnB1dFs1NitpXSA9IChVQ0hBUikoKHBDdHgtPkxlbkluQml0Q291bnRbMF0gPj4gKGkgPDwgMykpICYgMHhmZik7CisgICAgICAgIAlwQ3R4LT5JbnB1dFs2MCtpXSA9IChVQ0hBUikoKHBDdHgtPkxlbkluQml0Q291bnRbMV0gPj4gKGkgPDwgMykpICYgMHhmZik7CisgICAgICAJfQorCisgICAgICAgIGJ5dGVSZXZlcnNlKHBDdHgtPklucHV0LCAxNik7CisgICAgICAgIE1ENVRyYW5zZm9ybShwQ3R4LT5CdWYsIChVSU5UMzIgKilwQ3R4LT5JbnB1dCk7CisgICAgfSAvLyBlbmQgb2YgZWxzZQorCisKKyAgICBOZGlzTW92ZU1lbW9yeSgoVUNIQVIgKilEaWdlc3QsIChVSU5UMzIgKilwQ3R4LT5CdWYsIDE2KTsgLy8gb3V0cHV0CisgICAgYnl0ZVJldmVyc2UoKFVDSEFSICopRGlnZXN0LCA0KTsKKyAgICBOZGlzWmVyb01lbW9yeShwQ3R4LCBzaXplb2YocEN0eCkpOyAvLyBtZW1vcnkgZnJlZQorfQorCisKKy8qCisgKiAgRnVuY3Rpb24gRGVzY3JpcHRpb246CisgKiAgICAgIFRoZSBjZW50cmFsIGFsZ29yaXRobSBvZiBNRDUsIGNvbnNpc3RzIG9mIGZvdXIgcm91bmRzIGFuZCBzaXh0ZWVuCisgKiAgCXN0ZXBzIHBlciByb3VuZAorICoKKyAqICBBcmd1bWVudHM6CisgKiAgICAgIEJ1ZiAgICAgQnVmZmVycyBvZiBmb3VyIHN0YXRlcyAob3V0cHV0OiAxNiBieXRlcykKKyAqIAkgICAgTWVzICAgICBJbnB1dCBkYXRhIChpbnB1dDogNjQgYnl0ZXMpCisgKgorICogIFJldHVybiBWYWx1ZToKKyAqICAgICAgTm9uZQorICoKKyAqICBOb3RlOgorICogICAgICBDYWxsZWQgYnkgTUQ1VXBkYXRlIG9yIE1ENUZpbmFsCisgKi8KK1ZPSUQgTUQ1VHJhbnNmb3JtKFVJTlQzMiBCdWZbNF0sIFVJTlQzMiBNZXNbMTZdKQoreworICAgIFVJTlQzMiBSZWdbNF0sIFRlbXA7CisJdW5zaWduZWQgaW50IGk7CisKKyAgICBzdGF0aWMgVUNIQVIgTFNoaWZ0VmFsWzE2XSA9CisgICAgeworICAgICAgICA3LCAxMiwgMTcsIDIyLAorCQk1LCA5ICwgMTQsIDIwLAorCQk0LCAxMSwgMTYsIDIzLAorIAkJNiwgMTAsIDE1LCAyMSwKKyAJfTsKKworCisJLy8gW2VxdWFsIHRvIDQyOTQ5NjcyOTYqYWJzKHNpbihpbmRleCkpXQorICAgIHN0YXRpYyBVSU5UMzIgTUQ1VGFibGVbNjRdID0KKwl7CisJCTB4ZDc2YWE0NzgsCTB4ZThjN2I3NTYsCTB4MjQyMDcwZGIsCTB4YzFiZGNlZWUsCisJCTB4ZjU3YzBmYWYsCTB4NDc4N2M2MmEsCTB4YTgzMDQ2MTMsIDB4ZmQ0Njk1MDEsCisJCTB4Njk4MDk4ZDgsCTB4OGI0NGY3YWYsCTB4ZmZmZjViYjEsCTB4ODk1Y2Q3YmUsCisgICAgCTB4NmI5MDExMjIsCTB4ZmQ5ODcxOTMsCTB4YTY3OTQzOGUsCTB4NDliNDA4MjEsCisKKyAgICAJMHhmNjFlMjU2MiwJMHhjMDQwYjM0MCwJMHgyNjVlNWE1MSwJMHhlOWI2YzdhYSwKKyAgICAJMHhkNjJmMTA1ZCwJMHgwMjQ0MTQ1MywJMHhkOGExZTY4MSwJMHhlN2QzZmJjOCwKKyAgICAJMHgyMWUxY2RlNiwJMHhjMzM3MDdkNiwJMHhmNGQ1MGQ4NywJMHg0NTVhMTRlZCwKKyAgICAJMHhhOWUzZTkwNSwJMHhmY2VmYTNmOCwJMHg2NzZmMDJkOSwJMHg4ZDJhNGM4YSwKKworICAgIAkweGZmZmEzOTQyLAkweDg3NzFmNjgxLAkweDZkOWQ2MTIyLAkweGZkZTUzODBjLAorICAgIAkweGE0YmVlYTQ0LAkweDRiZGVjZmE5LAkweGY2YmI0YjYwLAkweGJlYmZiYzcwLAorICAgIAkweDI4OWI3ZWM2LAkweGVhYTEyN2ZhLAkweGQ0ZWYzMDg1LAkweDA0ODgxZDA1LAorICAgIAkweGQ5ZDRkMDM5LAkweGU2ZGI5OWU1LAkweDFmYTI3Y2Y4LAkweGM0YWM1NjY1LAorCisgICAgCTB4ZjQyOTIyNDQsCTB4NDMyYWZmOTcsCTB4YWI5NDIzYTcsCTB4ZmM5M2EwMzksCisgICAJCTB4NjU1YjU5YzMsCTB4OGYwY2NjOTIsCTB4ZmZlZmY0N2QsCTB4ODU4NDVkZDEsCisgICAgCTB4NmZhODdlNGYsCTB4ZmUyY2U2ZTAsCTB4YTMwMTQzMTQsCTB4NGUwODExYTEsCisgICAgCTB4Zjc1MzdlODIsCTB4YmQzYWYyMzUsCTB4MmFkN2QyYmIsCTB4ZWI4NmQzOTEKKwl9OworCisKKyAgICBmb3IgKGk9MDsgaTw0OyBpKyspCisgICAgICAgIFJlZ1tpXT1CdWZbaV07CisKKworICAgIC8vIDY0IHN0ZXBzIGluIE1ENSBhbGdvcml0aG0KKyAgICBmb3IgKGk9MDsgaTwxNjsgaSsrKQorICAgIHsKKyAgICAgICAgTUQ1U3RlcChNRDVfRjEsIFJlZ1swXSwgUmVnWzFdLCBSZWdbMl0sIFJlZ1szXSwgTWVzW2ldLAorICAgICAgICAgICAgICAgIE1ENVRhYmxlW2ldLCBMU2hpZnRWYWxbaSAmIDB4M10pOworCisgICAgICAgIC8vIG9uZS13b3JkIHJpZ2h0IHNoaWZ0CisgICAgICAgIFRlbXAgICA9IFJlZ1szXTsKKyAgICAgICAgUmVnWzNdID0gUmVnWzJdOworICAgICAgICBSZWdbMl0gPSBSZWdbMV07CisgICAgICAgIFJlZ1sxXSA9IFJlZ1swXTsKKyAgICAgICAgUmVnWzBdID0gVGVtcDsKKyAgICB9CisgICAgZm9yIChpPTE2OyBpPDMyOyBpKyspCisgICAgeworICAgICAgICBNRDVTdGVwKE1ENV9GMiwgUmVnWzBdLCBSZWdbMV0sIFJlZ1syXSwgUmVnWzNdLCBNZXNbKDUqKGkgJiAweGYpKzEpICYgMHhmXSwKKyAgICAgICAgICAgICAgICBNRDVUYWJsZVtpXSwgTFNoaWZ0VmFsWygweDEgPDwgMikrKGkgJiAweDMpXSk7CisKKyAgICAgICAgLy8gb25lLXdvcmQgcmlnaHQgc2hpZnQKKyAgICAgICAgVGVtcCAgID0gUmVnWzNdOworICAgICAgICBSZWdbM10gPSBSZWdbMl07CisgICAgICAgIFJlZ1syXSA9IFJlZ1sxXTsKKyAgICAgICAgUmVnWzFdID0gUmVnWzBdOworICAgICAgICBSZWdbMF0gPSBUZW1wOworICAgIH0KKyAgICBmb3IgKGk9MzI7IGk8NDg7IGkrKykKKyAgICB7CisgICAgICAgIE1ENVN0ZXAoTUQ1X0YzLCBSZWdbMF0sIFJlZ1sxXSwgUmVnWzJdLCBSZWdbM10sIE1lc1soMyooaSAmIDB4ZikrNSkgJiAweGZdLAorICAgICAgICAgICAgICAgIE1ENVRhYmxlW2ldLCBMU2hpZnRWYWxbKDB4MSA8PCAzKSsoaSAmIDB4MyldKTsKKworICAgICAgICAvLyBvbmUtd29yZCByaWdodCBzaGlmdAorICAgICAgICBUZW1wICAgPSBSZWdbM107CisgICAgICAgIFJlZ1szXSA9IFJlZ1syXTsKKyAgICAgICAgUmVnWzJdID0gUmVnWzFdOworICAgICAgICBSZWdbMV0gPSBSZWdbMF07CisgICAgICAgIFJlZ1swXSA9IFRlbXA7CisgICAgfQorICAgIGZvciAoaT00ODsgaTw2NDsgaSsrKQorICAgIHsKKyAgICAgICAgTUQ1U3RlcChNRDVfRjQsIFJlZ1swXSwgUmVnWzFdLCBSZWdbMl0sIFJlZ1szXSwgTWVzWyg3KihpICYgMHhmKSkgJiAweGZdLAorICAgICAgICAgICAgICAgIE1ENVRhYmxlW2ldLCBMU2hpZnRWYWxbKDB4MyA8PCAyKSsoaSAmIDB4MyldKTsKKworICAgICAgICAvLyBvbmUtd29yZCByaWdodCBzaGlmdAorICAgICAgICBUZW1wICAgPSBSZWdbM107CisgICAgICAgIFJlZ1szXSA9IFJlZ1syXTsKKyAgICAgICAgUmVnWzJdID0gUmVnWzFdOworICAgICAgICBSZWdbMV0gPSBSZWdbMF07CisgICAgICAgIFJlZ1swXSA9IFRlbXA7CisgICAgfQorCisKKyAgICAvLyAodGVtcG9yYXJ5KW91dHB1dAorICAgIGZvciAoaT0wOyBpPDQ7IGkrKykKKyAgICAgICAgQnVmW2ldICs9IFJlZ1tpXTsKKworfQorCisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PSAgU0hBLTEgaW1wbGVtZW50YXRpb24gPT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8vIGZvdXIgYmFzZSBmdW5jdGlvbnMgZm9yIFNIQS0xCisjZGVmaW5lIFNIQTFfRjEoYiwgYywgZCkgICAgKCgoYikgJiAoYykpIHwgKCh+YikgJiAoZCkpKQorI2RlZmluZSBTSEExX0YyKGIsIGMsIGQpICAgICgoYikgXiAoYykgXiAoZCkpCisjZGVmaW5lIFNIQTFfRjMoYiwgYywgZCkgICAgKCgoYikgJiAoYykpIHwgKChiKSAmIChkKSkgfCAoKGMpICYgKGQpKSkKKworCisjZGVmaW5lIFNIQTFTdGVwKGYsIGEsIGIsIGMsIGQsIGUsIHcsIGspICAgIFwKKyAgICAoIGUJKz0gKCBmKGIsIGMsIGQpICsgdyArIGsgKyBDWUNMSUNfTEVGVF9TSElGVChhLCA1KSkgJiAweGZmZmZmZmZmLCBcCisgICAgICBiID0gQ1lDTElDX0xFRlRfU0hJRlQoYiwgMzApICkKKworLy9Jbml0aWF0ZSBTSEEtMSBDb250ZXh0IHNhdGlzZmllZCBpbiBSRkMgMzE3NAorVk9JRCBTSEFJbml0KFNIQV9DVFggKnBDdHgpCit7CisgICAgcEN0eC0+QnVmWzBdPTB4Njc0NTIzMDE7CisgICAgcEN0eC0+QnVmWzFdPTB4ZWZjZGFiODk7CisgICAgcEN0eC0+QnVmWzJdPTB4OThiYWRjZmU7CisgICAgcEN0eC0+QnVmWzNdPTB4MTAzMjU0NzY7CisgICAgcEN0eC0+QnVmWzRdPTB4YzNkMmUxZjA7CisKKyAgICBwQ3R4LT5MZW5JbkJpdENvdW50WzBdPTA7CisgICAgcEN0eC0+TGVuSW5CaXRDb3VudFsxXT0wOworfQorCisvKgorICogIEZ1bmN0aW9uIERlc2NyaXB0aW9uOgorICogICAgICBVcGRhdGUgU0hBLTEgQ29udGV4dCwgYWxsb3cgb2YgYW4gYXJyYXJ5IG9mIG9jdGV0cyBhcyB0aGUgbmV4dAorICogICAgICBwb3J0aW9uIG9mIHRoZSBtZXNzYWdlCisgKgorICogIEFyZ3VtZW50czoKKyAqICAgICAgcEN0eAkJUG9pbnRlcgl0byBTSEEtMSBjb250ZXh0CisgKiAJICAgIHBEYXRhICAgICAgIFBvaW50ZXIgdG8gaW5wdXQgZGF0YQorICogICAgICBMZW5JbkJ5dGVzICBUaGUgbGVuZ3RoIG9mIGlucHV0IGRhdGEgKHVuaXQ6IGJ5dGUpCisgKgorICogIFJldHVybiBWYWx1ZToKKyAqICAgICAgZXJyb3IgICAgICAgaW5kaWNhdGUgbW9yZSB0aGFuIHBvdygyLDY0KSBiaXRzIG9mIGRhdGEKKyAqCisgKiAgTm90ZToKKyAqICAgICAgQ2FsbGVkIGFmdGVyIFNIQUluaXQgb3IgU0hBVXBkYXRlKGl0c2VsZikKKyAqLworVUNIQVIgU0hBVXBkYXRlKFNIQV9DVFggKnBDdHgsIFVDSEFSICpwRGF0YSwgVUlOVDMyIExlbkluQnl0ZXMpCit7CisgICAgVUlOVDMyIFRmVGltZXM7CisgICAgVUlOVDMyIHRlbXAxLHRlbXAyOworCXVuc2lnbmVkIGludCBpOworCVVDSEFSIGVycj0xOworCisgICAgdGVtcDEgPSBwQ3R4LT5MZW5JbkJpdENvdW50WzBdOworICAgIHRlbXAyID0gcEN0eC0+TGVuSW5CaXRDb3VudFsxXTsKKworICAgIHBDdHgtPkxlbkluQml0Q291bnRbMF0gPSAoVUlOVDMyKSAocEN0eC0+TGVuSW5CaXRDb3VudFswXSArIChMZW5JbkJ5dGVzIDw8IDMpKTsKKyAgICBpZiAocEN0eC0+TGVuSW5CaXRDb3VudFswXSA8IHRlbXAxKQorICAgICAgICBwQ3R4LT5MZW5JbkJpdENvdW50WzFdKys7ICAgLy9jYXJyeSBpbgorCisKKyAgICBwQ3R4LT5MZW5JbkJpdENvdW50WzFdID0gKFVJTlQzMikgKHBDdHgtPkxlbkluQml0Q291bnRbMV0gKyhMZW5JbkJ5dGVzID4+IDI5KSk7CisgICAgaWYgKHBDdHgtPkxlbkluQml0Q291bnRbMV0gPCB0ZW1wMikKKyAgICAgICAgcmV0dXJuIChlcnIpOyAgIC8vY2hlY2sgdG90YWwgbGVuZ3RoIG9mIG9yaWdpbmFsIGRhdGEKKworCisgICAgLy8gbW9kIDY0IGJ5dGVzCisgICAgdGVtcDEgPSAodGVtcDEgPj4gMykgJiAweDNmOworCisgICAgLy8gcHJvY2VzcyBsYWNrcyBvZiA2NC1ieXRlIGRhdGEKKyAgICBpZiAodGVtcDEpCisgICAgeworICAgICAgICBVQ0hBUiAqcEFkcyA9IChVQ0hBUiAqKSBwQ3R4LT5JbnB1dCArIHRlbXAxOworCisgICAgICAgIGlmICgodGVtcDErTGVuSW5CeXRlcykgPCA2NCkKKyAgICAgICAgeworICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkcywgKFVDSEFSICopcERhdGEsIExlbkluQnl0ZXMpOworICAgICAgICAgICAgcmV0dXJuICgwKTsKKyAgICAgICAgfQorCisgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZHMsIChVQ0hBUiAqKXBEYXRhLCA2NC10ZW1wMSk7CisgICAgICAgIGJ5dGVSZXZlcnNlKChVQ0hBUiAqKXBDdHgtPklucHV0LCAxNik7CisKKyAgICAgICAgTmRpc1plcm9NZW1vcnkoKFVDSEFSICopcEN0eC0+SW5wdXQgKyA2NCwgMTYpOworICAgICAgICBTSEFUcmFuc2Zvcm0ocEN0eC0+QnVmLCAoVUlOVDMyICopcEN0eC0+SW5wdXQpOworCisgICAgICAgIHBEYXRhICs9IDY0LXRlbXAxOworICAgICAgICBMZW5JbkJ5dGVzIC09IDY0LXRlbXAxOworICAgIH0gLy8gZW5kIG9mIGlmICh0ZW1wMSkKKworCisgICAgVGZUaW1lcyA9IChMZW5JbkJ5dGVzID4+IDYpOworCisgICAgZm9yIChpPVRmVGltZXM7IGk+MDsgaS0tKQorICAgIHsKKyAgICAgICAgTmRpc01vdmVNZW1vcnkocEN0eC0+SW5wdXQsIChVQ0hBUiAqKXBEYXRhLCA2NCk7CisgICAgICAgIGJ5dGVSZXZlcnNlKChVQ0hBUiAqKXBDdHgtPklucHV0LCAxNik7CisKKyAgICAgICAgTmRpc1plcm9NZW1vcnkoKFVDSEFSICopcEN0eC0+SW5wdXQgKyA2NCwgMTYpOworICAgICAgICBTSEFUcmFuc2Zvcm0ocEN0eC0+QnVmLCAoVUlOVDMyICopcEN0eC0+SW5wdXQpOworICAgICAgICBwRGF0YSArPSA2NDsKKyAgICAgICAgTGVuSW5CeXRlcyAtPSA2NDsKKyAgICB9IC8vIGVuZCBvZiBmb3IKKworICAgIC8vIGJ1ZmZlcmluZyBsYWNrcyBvZiA2NC1ieXRlIGRhdGEKKyAgICBpZihMZW5JbkJ5dGVzKQorICAgICAgICBOZGlzTW92ZU1lbW9yeShwQ3R4LT5JbnB1dCwgKFVDSEFSICopcERhdGEsIExlbkluQnl0ZXMpOworCisJcmV0dXJuICgwKTsKKworfQorCisvLyBBcHBlbmQgcGFkZGluZyBiaXRzIGFuZCBsZW5ndGggb2Ygb3JpZ2luYWwgbWVzc2FnZSBpbiB0aGUgdGFpbAorLy8gVGhlIG1lc3NhZ2UgZGlnZXN0IGhhcyB0byBiZSBjb21wbGV0ZWQgaW4gdGhlIGVuZAorVk9JRCBTSEFGaW5hbChTSEFfQ1RYICpwQ3R4LCBVQ0hBUiBEaWdlc3RbMjBdKQoreworICAgIFVDSEFSIFJlbWFpbmRlcjsKKyAgICBVQ0hBUiBQYWRMZW5JbkJ5dGVzOworICAgIFVDSEFSICpwQXBwZW5kPTA7CisgICAgdW5zaWduZWQgaW50IGk7CisKKyAgICBSZW1haW5kZXIgPSAoVUNIQVIpKChwQ3R4LT5MZW5JbkJpdENvdW50WzBdID4+IDMpICYgMHgzZik7CisKKyAgICBwQXBwZW5kID0gKFVDSEFSICopcEN0eC0+SW5wdXQgKyBSZW1haW5kZXI7CisKKyAgICBQYWRMZW5JbkJ5dGVzID0gKFJlbWFpbmRlciA8IDU2KSA/ICg1Ni1SZW1haW5kZXIpIDogKDEyMC1SZW1haW5kZXIpOworCisgICAgLy8gcGFkZGluZyBiaXRzIHdpdGhvdXQgY3Jvc3NpbmcgYmxvY2soNjQtYnl0ZSBiYXNlZCkgYm91bmRhcnkKKyAgICBpZiAoUmVtYWluZGVyIDwgNTYpCisgICAgeworICAgICAgICAqcEFwcGVuZCA9IDB4ODA7CisgICAgICAgIFBhZExlbkluQnl0ZXMgLS07CisKKyAgICAgICAgTmRpc1plcm9NZW1vcnkoKFVDSEFSICopcEN0eC0+SW5wdXQgKyBSZW1haW5kZXIrMSwgUGFkTGVuSW5CeXRlcyk7CisKKwkJLy8gYWRkIGRhdGEtbGVuZ3RoIGZpZWxkLCBmcm9tIGhpZ2ggdG8gbG93CisgICAgICAgIGZvciAoaT0wOyBpPDQ7IGkrKykKKyAgICAgICAgeworICAgICAgICAJcEN0eC0+SW5wdXRbNTYraV0gPSAoVUNIQVIpKChwQ3R4LT5MZW5JbkJpdENvdW50WzFdID4+ICgoMy1pKSA8PCAzKSkgJiAweGZmKTsKKyAgICAgICAgCXBDdHgtPklucHV0WzYwK2ldID0gKFVDSEFSKSgocEN0eC0+TGVuSW5CaXRDb3VudFswXSA+PiAoKDMtaSkgPDwgMykpICYgMHhmZik7CisgICAgICAJfQorCisgICAgICAgIGJ5dGVSZXZlcnNlKChVQ0hBUiAqKXBDdHgtPklucHV0LCAxNik7CisgICAgICAgIE5kaXNaZXJvTWVtb3J5KChVQ0hBUiAqKXBDdHgtPklucHV0ICsgNjQsIDE0KTsKKyAgICAgICAgU0hBVHJhbnNmb3JtKHBDdHgtPkJ1ZiwgKFVJTlQzMiAqKXBDdHgtPklucHV0KTsKKyAgICB9IC8vIGVuZCBvZiBpZgorCisgICAgLy8gcGFkZGluZyBiaXRzIHdpdGggY3Jvc3NpbmcgYmxvY2soNjQtYnl0ZSBiYXNlZCkgYm91bmRhcnkKKyAgICBlbHNlCisgICAgeworICAgICAgICAvLyB0aGUgZmlyc3QgYmxvY2sgPT09CisgICAgICAgICpwQXBwZW5kID0gMHg4MDsKKyAgICAgICAgUGFkTGVuSW5CeXRlcyAtLTsKKworICAgICAgICBOZGlzWmVyb01lbW9yeSgoVUNIQVIgKilwQ3R4LT5JbnB1dCArIFJlbWFpbmRlcisxLCAoNjQtUmVtYWluZGVyLTEpKTsKKyAgICAgICAgUGFkTGVuSW5CeXRlcyAtPSAoNjQgLSBSZW1haW5kZXIgLSAxKTsKKworICAgICAgICBieXRlUmV2ZXJzZSgoVUNIQVIgKilwQ3R4LT5JbnB1dCwgMTYpOworICAgICAgICBOZGlzWmVyb01lbW9yeSgoVUNIQVIgKilwQ3R4LT5JbnB1dCArIDY0LCAxNik7CisgICAgICAgIFNIQVRyYW5zZm9ybShwQ3R4LT5CdWYsIChVSU5UMzIgKilwQ3R4LT5JbnB1dCk7CisKKworICAgICAgICAvLyB0aGUgc2Vjb25kIGJsb2NrID09PQorICAgICAgICBOZGlzWmVyb01lbW9yeSgoVUNIQVIgKilwQ3R4LT5JbnB1dCwgUGFkTGVuSW5CeXRlcyk7CisKKwkJLy8gYWRkIGRhdGEtbGVuZ3RoIGZpZWxkCisJCWZvciAoaT0wOyBpPDQ7IGkrKykKKyAgICAgICAgeworICAgICAgICAJcEN0eC0+SW5wdXRbNTYraV0gPSAoVUNIQVIpKChwQ3R4LT5MZW5JbkJpdENvdW50WzFdID4+ICgoMy1pKSA8PCAzKSkgJiAweGZmKTsKKyAgICAgICAgCXBDdHgtPklucHV0WzYwK2ldID0gKFVDSEFSKSgocEN0eC0+TGVuSW5CaXRDb3VudFswXSA+PiAoKDMtaSkgPDwgMykpICYgMHhmZik7CisgICAgICAJfQorCisgICAgICAgIGJ5dGVSZXZlcnNlKChVQ0hBUiAqKXBDdHgtPklucHV0LCAxNik7CisgICAgICAgIE5kaXNaZXJvTWVtb3J5KChVQ0hBUiAqKXBDdHgtPklucHV0ICsgNjQsIDE2KTsKKyAgICAgICAgU0hBVHJhbnNmb3JtKHBDdHgtPkJ1ZiwgKFVJTlQzMiAqKXBDdHgtPklucHV0KTsKKyAgICB9IC8vIGVuZCBvZiBlbHNlCisKKworICAgIC8vT3V0cHV0LCBieXRlcmV2ZXJzZQorICAgIGZvciAoaT0wOyBpPDIwOyBpKyspCisgICAgeworICAgICAgICBEaWdlc3QgW2ldID0gKFVDSEFSKShwQ3R4LT5CdWZbaT4+Ml0gPj4gOCooMy0oaSAmIDB4MykpKTsKKyAgICB9CisKKyAgICBOZGlzWmVyb01lbW9yeShwQ3R4LCBzaXplb2YocEN0eCkpOyAvLyBtZW1vcnkgZnJlZQorfQorCisKKy8vIFRoZSBjZW50cmFsIGFsZ29yaXRobSBvZiBTSEEtMSwgY29uc2lzdHMgb2YgZm91ciByb3VuZHMgYW5kCisvLyB0d2VudHkgc3RlcHMgcGVyIHJvdW5kCitWT0lEIFNIQVRyYW5zZm9ybShVSU5UMzIgQnVmWzVdLCBVSU5UMzIgTWVzWzIwXSkKK3sKKyAgICBVSU5UMzIgUmVnWzVdLFRlbXA7CisJdW5zaWduZWQgaW50IGk7CisgICAgVUlOVDMyIFdbODBdOworCisgICAgc3RhdGljIFVJTlQzMiBTSEExVGFibGVbNF0gPSB7IDB4NWE4Mjc5OTksIDB4NmVkOWViYTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4ZjFiYmNkYywgMHhjYTYyYzFkNiB9OworCisgICAgUmVnWzBdPUJ1ZlswXTsKKwlSZWdbMV09QnVmWzFdOworCVJlZ1syXT1CdWZbMl07CisJUmVnWzNdPUJ1ZlszXTsKKwlSZWdbNF09QnVmWzRdOworCisgICAgLy90aGUgZmlyc3Qgb2N0ZXQgb2YgYSB3b3JkIGlzIHN0b3JlZCBpbiB0aGUgMHRoIGVsZW1lbnQsIGJ5dGVyZXZlcnNlCisJZm9yKGkgPSAwOyBpIDwgMTY7IGkrKykKKyAgICB7CisgICAgCVdbaV0gID0gKE1lc1tpXSA+PiAyNCkgJiAweGZmOworICAgICAgICBXW2ldIHw9IChNZXNbaV0gPj4gOCApICYgMHhmZjAwOworICAgICAgICBXW2ldIHw9IChNZXNbaV0gPDwgOCApICYgMHhmZjAwMDA7CisgICAgICAgIFdbaV0gfD0gKE1lc1tpXSA8PCAyNCkgJiAweGZmMDAwMDAwOworICAgIH0KKworCisgICAgZm9yCShpID0gMDsgaSA8IDY0OyBpKyspCisJICAgIFdbMTYraV0gPSBDWUNMSUNfTEVGVF9TSElGVChXW2ldIF4gV1syK2ldIF4gV1s4K2ldIF4gV1sxMytpXSwgMSk7CisKKworICAgIC8vIDgwIHN0ZXBzIGluIFNIQS0xIGFsZ29yaXRobQorICAgIGZvciAoaT0wOyBpPDgwOyBpKyspCisgICAgeworICAgICAgICBpZiAoaTwyMCkKKyAgICAgICAgICAgIFNIQTFTdGVwKFNIQTFfRjEsIFJlZ1swXSwgUmVnWzFdLCBSZWdbMl0sIFJlZ1szXSwgUmVnWzRdLAorICAgICAgICAgICAgICAgICAgICAgV1tpXSwgU0hBMVRhYmxlWzBdKTsKKworICAgICAgICBlbHNlIGlmIChpPj0yMCAmJiBpPDQwKQorICAgICAgICAgICAgU0hBMVN0ZXAoU0hBMV9GMiwgUmVnWzBdLCBSZWdbMV0sIFJlZ1syXSwgUmVnWzNdLCBSZWdbNF0sCisgICAgICAgICAgICAgICAgICAgICBXW2ldLCBTSEExVGFibGVbMV0pOworCisJCWVsc2UgaWYgKGk+PTQwICYmIGk8NjApCisgICAgICAgICAgICBTSEExU3RlcChTSEExX0YzLCBSZWdbMF0sIFJlZ1sxXSwgUmVnWzJdLCBSZWdbM10sIFJlZ1s0XSwKKyAgICAgICAgICAgICAgICAgICAgICBXW2ldLCBTSEExVGFibGVbMl0pOworCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIFNIQTFTdGVwKFNIQTFfRjIsIFJlZ1swXSwgUmVnWzFdLCBSZWdbMl0sIFJlZ1szXSwgUmVnWzRdLAorICAgICAgICAgICAgICAgICAgICAgV1tpXSwgU0hBMVRhYmxlWzNdKTsKKworCisgICAgICAgLy8gb25lLXdvcmQgcmlnaHQgc2hpZnQKKwkJVGVtcCAgID0gUmVnWzRdOworICAgICAgICBSZWdbNF0gPSBSZWdbM107CisgICAgICAgIFJlZ1szXSA9IFJlZ1syXTsKKyAgICAgICAgUmVnWzJdID0gUmVnWzFdOworICAgICAgICBSZWdbMV0gPSBSZWdbMF07CisgICAgICAgIFJlZ1swXSA9IFRlbXA7CisKKyAgICB9IC8vIGVuZCBvZiBmb3ItbG9vcAorCisKKyAgICAvLyAodGVtcG9yYXJ5KW91dHB1dAorICAgIGZvciAoaT0wOyBpPDU7IGkrKykKKyAgICAgICAgQnVmW2ldICs9IFJlZ1tpXTsKKworfQorCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT0gIEFFUyBFbi9EZWNyeXB0aW9uID09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKy8qIGZvcndhcmQgUy1ib3ggKi8KK3N0YXRpYyB1aW50MzIgRlNiWzI1Nl0gPQoreworCTB4NjMsIDB4N0MsCTB4NzcsIDB4N0IsCTB4RjIsIDB4NkIsCTB4NkYsIDB4QzUsCisJMHgzMCwgMHgwMSwJMHg2NywgMHgyQiwJMHhGRSwgMHhENywJMHhBQiwgMHg3NiwKKwkweENBLCAweDgyLAkweEM5LCAweDdELAkweEZBLCAweDU5LAkweDQ3LCAweEYwLAorCTB4QUQsIDB4RDQsCTB4QTIsIDB4QUYsCTB4OUMsIDB4QTQsCTB4NzIsIDB4QzAsCisJMHhCNywgMHhGRCwJMHg5MywgMHgyNiwJMHgzNiwgMHgzRiwJMHhGNywgMHhDQywKKwkweDM0LCAweEE1LAkweEU1LCAweEYxLAkweDcxLCAweEQ4LAkweDMxLCAweDE1LAorCTB4MDQsIDB4QzcsCTB4MjMsIDB4QzMsCTB4MTgsIDB4OTYsCTB4MDUsIDB4OUEsCisJMHgwNywgMHgxMiwJMHg4MCwgMHhFMiwJMHhFQiwgMHgyNywJMHhCMiwgMHg3NSwKKwkweDA5LCAweDgzLAkweDJDLCAweDFBLAkweDFCLCAweDZFLAkweDVBLCAweEEwLAorCTB4NTIsIDB4M0IsCTB4RDYsIDB4QjMsCTB4MjksIDB4RTMsCTB4MkYsIDB4ODQsCisJMHg1MywgMHhEMSwJMHgwMCwgMHhFRCwJMHgyMCwgMHhGQywJMHhCMSwgMHg1QiwKKwkweDZBLCAweENCLAkweEJFLCAweDM5LAkweDRBLCAweDRDLAkweDU4LCAweENGLAorCTB4RDAsIDB4RUYsCTB4QUEsIDB4RkIsCTB4NDMsIDB4NEQsCTB4MzMsIDB4ODUsCisJMHg0NSwgMHhGOSwJMHgwMiwgMHg3RiwJMHg1MCwgMHgzQywJMHg5RiwgMHhBOCwKKwkweDUxLCAweEEzLAkweDQwLCAweDhGLAkweDkyLCAweDlELAkweDM4LCAweEY1LAorCTB4QkMsIDB4QjYsCTB4REEsIDB4MjEsCTB4MTAsIDB4RkYsCTB4RjMsIDB4RDIsCisJMHhDRCwgMHgwQywJMHgxMywgMHhFQywJMHg1RiwgMHg5NywJMHg0NCwgMHgxNywKKwkweEM0LCAweEE3LAkweDdFLCAweDNELAkweDY0LCAweDVELAkweDE5LCAweDczLAorCTB4NjAsIDB4ODEsCTB4NEYsIDB4REMsCTB4MjIsIDB4MkEsCTB4OTAsIDB4ODgsCisJMHg0NiwgMHhFRSwJMHhCOCwgMHgxNCwJMHhERSwgMHg1RSwJMHgwQiwgMHhEQiwKKwkweEUwLCAweDMyLAkweDNBLCAweDBBLAkweDQ5LCAweDA2LAkweDI0LCAweDVDLAorCTB4QzIsIDB4RDMsCTB4QUMsIDB4NjIsCTB4OTEsIDB4OTUsCTB4RTQsIDB4NzksCisJMHhFNywgMHhDOCwJMHgzNywgMHg2RCwJMHg4RCwgMHhENSwJMHg0RSwgMHhBOSwKKwkweDZDLCAweDU2LAkweEY0LCAweEVBLAkweDY1LCAweDdBLAkweEFFLCAweDA4LAorCTB4QkEsIDB4NzgsCTB4MjUsIDB4MkUsCTB4MUMsIDB4QTYsCTB4QjQsIDB4QzYsCisJMHhFOCwgMHhERCwJMHg3NCwgMHgxRiwJMHg0QiwgMHhCRCwJMHg4QiwgMHg4QSwKKwkweDcwLCAweDNFLAkweEI1LCAweDY2LAkweDQ4LCAweDAzLAkweEY2LCAweDBFLAorCTB4NjEsIDB4MzUsCTB4NTcsIDB4QjksCTB4ODYsIDB4QzEsCTB4MUQsIDB4OUUsCisJMHhFMSwgMHhGOCwJMHg5OCwgMHgxMSwJMHg2OSwgMHhEOSwJMHg4RSwgMHg5NCwKKwkweDlCLCAweDFFLAkweDg3LCAweEU5LAkweENFLCAweDU1LAkweDI4LCAweERGLAorCTB4OEMsIDB4QTEsCTB4ODksIDB4MEQsCTB4QkYsIDB4RTYsCTB4NDIsIDB4NjgsCisJMHg0MSwgMHg5OSwJMHgyRCwgMHgwRiwJMHhCMCwgMHg1NCwJMHhCQiwgMHgxNgorfTsKKworLyogZm9yd2FyZCB0YWJsZSAqLworI2RlZmluZQlGVCBcCitcCisJVihDNiw2Myw2MyxBNSksCVYoRjgsN0MsN0MsODQpLAlWKEVFLDc3LDc3LDk5KSwJVihGNiw3Qiw3Qiw4RCksCVwKKwlWKEZGLEYyLEYyLDBEKSwJVihENiw2Qiw2QixCRCksCVYoREUsNkYsNkYsQjEpLAlWKDkxLEM1LEM1LDU0KSwJXAorCVYoNjAsMzAsMzAsNTApLAlWKDAyLDAxLDAxLDAzKSwJVihDRSw2Nyw2NyxBOSksCVYoNTYsMkIsMkIsN0QpLAlcCisJVihFNyxGRSxGRSwxOSksCVYoQjUsRDcsRDcsNjIpLAlWKDRELEFCLEFCLEU2KSwJVihFQyw3Niw3Niw5QSksCVwKKwlWKDhGLENBLENBLDQ1KSwJVigxRiw4Miw4Miw5RCksCVYoODksQzksQzksNDApLAlWKEZBLDdELDdELDg3KSwJXAorCVYoRUYsRkEsRkEsMTUpLAlWKEIyLDU5LDU5LEVCKSwJVig4RSw0Nyw0NyxDOSksCVYoRkIsRjAsRjAsMEIpLAlcCisJVig0MSxBRCxBRCxFQyksCVYoQjMsRDQsRDQsNjcpLAlWKDVGLEEyLEEyLEZEKSwJVig0NSxBRixBRixFQSksCVwKKwlWKDIzLDlDLDlDLEJGKSwJVig1MyxBNCxBNCxGNyksCVYoRTQsNzIsNzIsOTYpLAlWKDlCLEMwLEMwLDVCKSwJXAorCVYoNzUsQjcsQjcsQzIpLAlWKEUxLEZELEZELDFDKSwJVigzRCw5Myw5MyxBRSksCVYoNEMsMjYsMjYsNkEpLAlcCisJVig2QywzNiwzNiw1QSksCVYoN0UsM0YsM0YsNDEpLAlWKEY1LEY3LEY3LDAyKSwJVig4MyxDQyxDQyw0RiksCVwKKwlWKDY4LDM0LDM0LDVDKSwJVig1MSxBNSxBNSxGNCksCVYoRDEsRTUsRTUsMzQpLAlWKEY5LEYxLEYxLDA4KSwJXAorCVYoRTIsNzEsNzEsOTMpLAlWKEFCLEQ4LEQ4LDczKSwJVig2MiwzMSwzMSw1MyksCVYoMkEsMTUsMTUsM0YpLAlcCisJVigwOCwwNCwwNCwwQyksCVYoOTUsQzcsQzcsNTIpLAlWKDQ2LDIzLDIzLDY1KSwJVig5RCxDMyxDMyw1RSksCVwKKwlWKDMwLDE4LDE4LDI4KSwJVigzNyw5Niw5NixBMSksCVYoMEEsMDUsMDUsMEYpLAlWKDJGLDlBLDlBLEI1KSwJXAorCVYoMEUsMDcsMDcsMDkpLAlWKDI0LDEyLDEyLDM2KSwJVigxQiw4MCw4MCw5QiksCVYoREYsRTIsRTIsM0QpLAlcCisJVihDRCxFQixFQiwyNiksCVYoNEUsMjcsMjcsNjkpLAlWKDdGLEIyLEIyLENEKSwJVihFQSw3NSw3NSw5RiksCVwKKwlWKDEyLDA5LDA5LDFCKSwJVigxRCw4Myw4Myw5RSksCVYoNTgsMkMsMkMsNzQpLAlWKDM0LDFBLDFBLDJFKSwJXAorCVYoMzYsMUIsMUIsMkQpLAlWKERDLDZFLDZFLEIyKSwJVihCNCw1QSw1QSxFRSksCVYoNUIsQTAsQTAsRkIpLAlcCisJVihBNCw1Miw1MixGNiksCVYoNzYsM0IsM0IsNEQpLAlWKEI3LEQ2LEQ2LDYxKSwJVig3RCxCMyxCMyxDRSksCVwKKwlWKDUyLDI5LDI5LDdCKSwJVihERCxFMyxFMywzRSksCVYoNUUsMkYsMkYsNzEpLAlWKDEzLDg0LDg0LDk3KSwJXAorCVYoQTYsNTMsNTMsRjUpLAlWKEI5LEQxLEQxLDY4KSwJVigwMCwwMCwwMCwwMCksCVYoQzEsRUQsRUQsMkMpLAlcCisJVig0MCwyMCwyMCw2MCksCVYoRTMsRkMsRkMsMUYpLAlWKDc5LEIxLEIxLEM4KSwJVihCNiw1Qiw1QixFRCksCVwKKwlWKEQ0LDZBLDZBLEJFKSwJVig4RCxDQixDQiw0NiksCVYoNjcsQkUsQkUsRDkpLAlWKDcyLDM5LDM5LDRCKSwJXAorCVYoOTQsNEEsNEEsREUpLAlWKDk4LDRDLDRDLEQ0KSwJVihCMCw1OCw1OCxFOCksCVYoODUsQ0YsQ0YsNEEpLAlcCisJVihCQixEMCxEMCw2QiksCVYoQzUsRUYsRUYsMkEpLAlWKDRGLEFBLEFBLEU1KSwJVihFRCxGQixGQiwxNiksCVwKKwlWKDg2LDQzLDQzLEM1KSwJVig5QSw0RCw0RCxENyksCVYoNjYsMzMsMzMsNTUpLAlWKDExLDg1LDg1LDk0KSwJXAorCVYoOEEsNDUsNDUsQ0YpLAlWKEU5LEY5LEY5LDEwKSwJVigwNCwwMiwwMiwwNiksCVYoRkUsN0YsN0YsODEpLAlcCisJVihBMCw1MCw1MCxGMCksCVYoNzgsM0MsM0MsNDQpLAlWKDI1LDlGLDlGLEJBKSwJVig0QixBOCxBOCxFMyksCVwKKwlWKEEyLDUxLDUxLEYzKSwJVig1RCxBMyxBMyxGRSksCVYoODAsNDAsNDAsQzApLAlWKDA1LDhGLDhGLDhBKSwJXAorCVYoM0YsOTIsOTIsQUQpLAlWKDIxLDlELDlELEJDKSwJVig3MCwzOCwzOCw0OCksCVYoRjEsRjUsRjUsMDQpLAlcCisJVig2MyxCQyxCQyxERiksCVYoNzcsQjYsQjYsQzEpLAlWKEFGLERBLERBLDc1KSwJVig0MiwyMSwyMSw2MyksCVwKKwlWKDIwLDEwLDEwLDMwKSwJVihFNSxGRixGRiwxQSksCVYoRkQsRjMsRjMsMEUpLAlWKEJGLEQyLEQyLDZEKSwJXAorCVYoODEsQ0QsQ0QsNEMpLAlWKDE4LDBDLDBDLDE0KSwJVigyNiwxMywxMywzNSksCVYoQzMsRUMsRUMsMkYpLAlcCisJVihCRSw1Riw1RixFMSksCVYoMzUsOTcsOTcsQTIpLAlWKDg4LDQ0LDQ0LENDKSwJVigyRSwxNywxNywzOSksCVwKKwlWKDkzLEM0LEM0LDU3KSwJVig1NSxBNyxBNyxGMiksCVYoRkMsN0UsN0UsODIpLAlWKDdBLDNELDNELDQ3KSwJXAorCVYoQzgsNjQsNjQsQUMpLAlWKEJBLDVELDVELEU3KSwJVigzMiwxOSwxOSwyQiksCVYoRTYsNzMsNzMsOTUpLAlcCisJVihDMCw2MCw2MCxBMCksCVYoMTksODEsODEsOTgpLAlWKDlFLDRGLDRGLEQxKSwJVihBMyxEQyxEQyw3RiksCVwKKwlWKDQ0LDIyLDIyLDY2KSwJVig1NCwyQSwyQSw3RSksCVYoM0IsOTAsOTAsQUIpLAlWKDBCLDg4LDg4LDgzKSwJXAorCVYoOEMsNDYsNDYsQ0EpLAlWKEM3LEVFLEVFLDI5KSwJVig2QixCOCxCOCxEMyksCVYoMjgsMTQsMTQsM0MpLAlcCisJVihBNyxERSxERSw3OSksCVYoQkMsNUUsNUUsRTIpLAlWKDE2LDBCLDBCLDFEKSwJVihBRCxEQixEQiw3NiksCVwKKwlWKERCLEUwLEUwLDNCKSwJVig2NCwzMiwzMiw1NiksCVYoNzQsM0EsM0EsNEUpLAlWKDE0LDBBLDBBLDFFKSwJXAorCVYoOTIsNDksNDksREIpLAlWKDBDLDA2LDA2LDBBKSwJVig0OCwyNCwyNCw2QyksCVYoQjgsNUMsNUMsRTQpLAlcCisJVig5RixDMixDMiw1RCksCVYoQkQsRDMsRDMsNkUpLAlWKDQzLEFDLEFDLEVGKSwJVihDNCw2Miw2MixBNiksCVwKKwlWKDM5LDkxLDkxLEE4KSwJVigzMSw5NSw5NSxBNCksCVYoRDMsRTQsRTQsMzcpLAlWKEYyLDc5LDc5LDhCKSwJXAorCVYoRDUsRTcsRTcsMzIpLAlWKDhCLEM4LEM4LDQzKSwJVig2RSwzNywzNyw1OSksCVYoREEsNkQsNkQsQjcpLAlcCisJVigwMSw4RCw4RCw4QyksCVYoQjEsRDUsRDUsNjQpLAlWKDlDLDRFLDRFLEQyKSwJVig0OSxBOSxBOSxFMCksCVwKKwlWKEQ4LDZDLDZDLEI0KSwJVihBQyw1Niw1NixGQSksCVYoRjMsRjQsRjQsMDcpLAlWKENGLEVBLEVBLDI1KSwJXAorCVYoQ0EsNjUsNjUsQUYpLAlWKEY0LDdBLDdBLDhFKSwJVig0NyxBRSxBRSxFOSksCVYoMTAsMDgsMDgsMTgpLAlcCisJVig2RixCQSxCQSxENSksCVYoRjAsNzgsNzgsODgpLAlWKDRBLDI1LDI1LDZGKSwJVig1QywyRSwyRSw3MiksCVwKKwlWKDM4LDFDLDFDLDI0KSwJVig1NyxBNixBNixGMSksCVYoNzMsQjQsQjQsQzcpLAlWKDk3LEM2LEM2LDUxKSwJXAorCVYoQ0IsRTgsRTgsMjMpLAlWKEExLERELERELDdDKSwJVihFOCw3NCw3NCw5QyksCVYoM0UsMUYsMUYsMjEpLAlcCisJVig5Niw0Qiw0QixERCksCVYoNjEsQkQsQkQsREMpLAlWKDBELDhCLDhCLDg2KSwJVigwRiw4QSw4QSw4NSksCVwKKwlWKEUwLDcwLDcwLDkwKSwJVig3QywzRSwzRSw0MiksCVYoNzEsQjUsQjUsQzQpLAlWKENDLDY2LDY2LEFBKSwJXAorCVYoOTAsNDgsNDgsRDgpLAlWKDA2LDAzLDAzLDA1KSwJVihGNyxGNixGNiwwMSksCVYoMUMsMEUsMEUsMTIpLAlcCisJVihDMiw2MSw2MSxBMyksCVYoNkEsMzUsMzUsNUYpLAlWKEFFLDU3LDU3LEY5KSwJVig2OSxCOSxCOSxEMCksCVwKKwlWKDE3LDg2LDg2LDkxKSwJVig5OSxDMSxDMSw1OCksCVYoM0EsMUQsMUQsMjcpLAlWKDI3LDlFLDlFLEI5KSwJXAorCVYoRDksRTEsRTEsMzgpLAlWKEVCLEY4LEY4LDEzKSwJVigyQiw5OCw5OCxCMyksCVYoMjIsMTEsMTEsMzMpLAlcCisJVihEMiw2OSw2OSxCQiksCVYoQTksRDksRDksNzApLAlWKDA3LDhFLDhFLDg5KSwJVigzMyw5NCw5NCxBNyksCVwKKwlWKDJELDlCLDlCLEI2KSwJVigzQywxRSwxRSwyMiksCVYoMTUsODcsODcsOTIpLAlWKEM5LEU5LEU5LDIwKSwJXAorCVYoODcsQ0UsQ0UsNDkpLAlWKEFBLDU1LDU1LEZGKSwJVig1MCwyOCwyOCw3OCksCVYoQTUsREYsREYsN0EpLAlcCisJVigwMyw4Qyw4Qyw4RiksCVYoNTksQTEsQTEsRjgpLAlWKDA5LDg5LDg5LDgwKSwJVigxQSwwRCwwRCwxNyksCVwKKwlWKDY1LEJGLEJGLERBKSwJVihENyxFNixFNiwzMSksCVYoODQsNDIsNDIsQzYpLAlWKEQwLDY4LDY4LEI4KSwJXAorCVYoODIsNDEsNDEsQzMpLAlWKDI5LDk5LDk5LEIwKSwJVig1QSwyRCwyRCw3NyksCVYoMUUsMEYsMEYsMTEpLAlcCisJVig3QixCMCxCMCxDQiksCVYoQTgsNTQsNTQsRkMpLAlWKDZELEJCLEJCLEQ2KSwJVigyQywxNiwxNiwzQSkKKworI2RlZmluZQlWKGEsYixjLGQpIDB4IyNhIyNiIyNjIyNkCitzdGF0aWMgdWludDMyIEZUMFsyNTZdID0geyBGVCB9OworI3VuZGVmIFYKKworI2RlZmluZQlWKGEsYixjLGQpIDB4IyNkIyNhIyNiIyNjCitzdGF0aWMgdWludDMyIEZUMVsyNTZdID0geyBGVCB9OworI3VuZGVmIFYKKworI2RlZmluZQlWKGEsYixjLGQpIDB4IyNjIyNkIyNhIyNiCitzdGF0aWMgdWludDMyIEZUMlsyNTZdID0geyBGVCB9OworI3VuZGVmIFYKKworI2RlZmluZQlWKGEsYixjLGQpIDB4IyNiIyNjIyNkIyNhCitzdGF0aWMgdWludDMyIEZUM1syNTZdID0geyBGVCB9OworI3VuZGVmIFYKKworI3VuZGVmIEZUCisKKy8qIHJldmVyc2UgUy1ib3ggKi8KKworc3RhdGljIHVpbnQzMiBSU2JbMjU2XSA9Cit7CisJMHg1MiwgMHgwOSwJMHg2QSwgMHhENSwJMHgzMCwgMHgzNiwJMHhBNSwgMHgzOCwKKwkweEJGLCAweDQwLAkweEEzLCAweDlFLAkweDgxLCAweEYzLAkweEQ3LCAweEZCLAorCTB4N0MsIDB4RTMsCTB4MzksIDB4ODIsCTB4OUIsIDB4MkYsCTB4RkYsIDB4ODcsCisJMHgzNCwgMHg4RSwJMHg0MywgMHg0NCwJMHhDNCwgMHhERSwJMHhFOSwgMHhDQiwKKwkweDU0LCAweDdCLAkweDk0LCAweDMyLAkweEE2LCAweEMyLAkweDIzLCAweDNELAorCTB4RUUsIDB4NEMsCTB4OTUsIDB4MEIsCTB4NDIsIDB4RkEsCTB4QzMsIDB4NEUsCisJMHgwOCwgMHgyRSwJMHhBMSwgMHg2NiwJMHgyOCwgMHhEOSwJMHgyNCwgMHhCMiwKKwkweDc2LCAweDVCLAkweEEyLCAweDQ5LAkweDZELCAweDhCLAkweEQxLCAweDI1LAorCTB4NzIsIDB4RjgsCTB4RjYsIDB4NjQsCTB4ODYsIDB4NjgsCTB4OTgsIDB4MTYsCisJMHhENCwgMHhBNCwJMHg1QywgMHhDQywJMHg1RCwgMHg2NSwJMHhCNiwgMHg5MiwKKwkweDZDLCAweDcwLAkweDQ4LCAweDUwLAkweEZELCAweEVELAkweEI5LCAweERBLAorCTB4NUUsIDB4MTUsCTB4NDYsIDB4NTcsCTB4QTcsIDB4OEQsCTB4OUQsIDB4ODQsCisJMHg5MCwgMHhEOCwJMHhBQiwgMHgwMCwJMHg4QywgMHhCQywJMHhEMywgMHgwQSwKKwkweEY3LCAweEU0LAkweDU4LCAweDA1LAkweEI4LCAweEIzLAkweDQ1LCAweDA2LAorCTB4RDAsIDB4MkMsCTB4MUUsIDB4OEYsCTB4Q0EsIDB4M0YsCTB4MEYsIDB4MDIsCisJMHhDMSwgMHhBRiwJMHhCRCwgMHgwMywJMHgwMSwgMHgxMywJMHg4QSwgMHg2QiwKKwkweDNBLCAweDkxLAkweDExLCAweDQxLAkweDRGLCAweDY3LAkweERDLCAweEVBLAorCTB4OTcsIDB4RjIsCTB4Q0YsIDB4Q0UsCTB4RjAsIDB4QjQsCTB4RTYsIDB4NzMsCisJMHg5NiwgMHhBQywJMHg3NCwgMHgyMiwJMHhFNywgMHhBRCwJMHgzNSwgMHg4NSwKKwkweEUyLCAweEY5LAkweDM3LCAweEU4LAkweDFDLCAweDc1LAkweERGLCAweDZFLAorCTB4NDcsIDB4RjEsCTB4MUEsIDB4NzEsCTB4MUQsIDB4MjksCTB4QzUsIDB4ODksCisJMHg2RiwgMHhCNywJMHg2MiwgMHgwRSwJMHhBQSwgMHgxOCwJMHhCRSwgMHgxQiwKKwkweEZDLCAweDU2LAkweDNFLCAweDRCLAkweEM2LCAweEQyLAkweDc5LCAweDIwLAorCTB4OUEsIDB4REIsCTB4QzAsIDB4RkUsCTB4NzgsIDB4Q0QsCTB4NUEsIDB4RjQsCisJMHgxRiwgMHhERCwJMHhBOCwgMHgzMywJMHg4OCwgMHgwNywJMHhDNywgMHgzMSwKKwkweEIxLCAweDEyLAkweDEwLCAweDU5LAkweDI3LCAweDgwLAkweEVDLCAweDVGLAorCTB4NjAsIDB4NTEsCTB4N0YsIDB4QTksCTB4MTksIDB4QjUsCTB4NEEsIDB4MEQsCisJMHgyRCwgMHhFNSwJMHg3QSwgMHg5RiwJMHg5MywgMHhDOSwJMHg5QywgMHhFRiwKKwkweEEwLCAweEUwLAkweDNCLCAweDRELAkweEFFLCAweDJBLAkweEY1LCAweEIwLAorCTB4QzgsIDB4RUIsCTB4QkIsIDB4M0MsCTB4ODMsIDB4NTMsCTB4OTksIDB4NjEsCisJMHgxNywgMHgyQiwJMHgwNCwgMHg3RSwJMHhCQSwgMHg3NywJMHhENiwgMHgyNiwKKwkweEUxLCAweDY5LAkweDE0LCAweDYzLAkweDU1LCAweDIxLAkweDBDLCAweDdECit9OworCisvKiByZXZlcnNlIHRhYmxlICovCisKKyNkZWZpbmUJUlQgXAorXAorCVYoNTEsRjQsQTcsNTApLAlWKDdFLDQxLDY1LDUzKSwJVigxQSwxNyxBNCxDMyksCVYoM0EsMjcsNUUsOTYpLAlcCisJVigzQixBQiw2QixDQiksCVYoMUYsOUQsNDUsRjEpLAlWKEFDLEZBLDU4LEFCKSwJVig0QixFMywwMyw5MyksCVwKKwlWKDIwLDMwLEZBLDU1KSwJVihBRCw3Niw2RCxGNiksCVYoODgsQ0MsNzYsOTEpLAlWKEY1LDAyLDRDLDI1KSwJXAorCVYoNEYsRTUsRDcsRkMpLAlWKEM1LDJBLENCLEQ3KSwJVigyNiwzNSw0NCw4MCksCVYoQjUsNjIsQTMsOEYpLAlcCisJVihERSxCMSw1QSw0OSksCVYoMjUsQkEsMUIsNjcpLAlWKDQ1LEVBLDBFLDk4KSwJVig1RCxGRSxDMCxFMSksCVwKKwlWKEMzLDJGLDc1LDAyKSwJVig4MSw0QyxGMCwxMiksCVYoOEQsNDYsOTcsQTMpLAlWKDZCLEQzLEY5LEM2KSwJXAorCVYoMDMsOEYsNUYsRTcpLAlWKDE1LDkyLDlDLDk1KSwJVihCRiw2RCw3QSxFQiksCVYoOTUsNTIsNTksREEpLAlcCisJVihENCxCRSw4MywyRCksCVYoNTgsNzQsMjEsRDMpLAlWKDQ5LEUwLDY5LDI5KSwJVig4RSxDOSxDOCw0NCksCVwKKwlWKDc1LEMyLDg5LDZBKSwJVihGNCw4RSw3OSw3OCksCVYoOTksNTgsM0UsNkIpLAlWKDI3LEI5LDcxLEREKSwJXAorCVYoQkUsRTEsNEYsQjYpLAlWKEYwLDg4LEFELDE3KSwJVihDOSwyMCxBQyw2NiksCVYoN0QsQ0UsM0EsQjQpLAlcCisJVig2MyxERiw0QSwxOCksCVYoRTUsMUEsMzEsODIpLAlWKDk3LDUxLDMzLDYwKSwJVig2Miw1Myw3Riw0NSksCVwKKwlWKEIxLDY0LDc3LEUwKSwJVihCQiw2QixBRSw4NCksCVYoRkUsODEsQTAsMUMpLAlWKEY5LDA4LDJCLDk0KSwJXAorCVYoNzAsNDgsNjgsNTgpLAlWKDhGLDQ1LEZELDE5KSwJVig5NCxERSw2Qyw4NyksCVYoNTIsN0IsRjgsQjcpLAlcCisJVihBQiw3MyxEMywyMyksCVYoNzIsNEIsMDIsRTIpLAlWKEUzLDFGLDhGLDU3KSwJVig2Niw1NSxBQiwyQSksCVwKKwlWKEIyLEVCLDI4LDA3KSwJVigyRixCNSxDMiwwMyksCVYoODYsQzUsN0IsOUEpLAlWKEQzLDM3LDA4LEE1KSwJXAorCVYoMzAsMjgsODcsRjIpLAlWKDIzLEJGLEE1LEIyKSwJVigwMiwwMyw2QSxCQSksCVYoRUQsMTYsODIsNUMpLAlcCisJVig4QSxDRiwxQywyQiksCVYoQTcsNzksQjQsOTIpLAlWKEYzLDA3LEYyLEYwKSwJVig0RSw2OSxFMixBMSksCVwKKwlWKDY1LERBLEY0LENEKSwJVigwNiwwNSxCRSxENSksCVYoRDEsMzQsNjIsMUYpLAlWKEM0LEE2LEZFLDhBKSwJXAorCVYoMzQsMkUsNTMsOUQpLAlWKEEyLEYzLDU1LEEwKSwJVigwNSw4QSxFMSwzMiksCVYoQTQsRjYsRUIsNzUpLAlcCisJVigwQiw4MyxFQywzOSksCVYoNDAsNjAsRUYsQUEpLAlWKDVFLDcxLDlGLDA2KSwJVihCRCw2RSwxMCw1MSksCVwKKwlWKDNFLDIxLDhBLEY5KSwJVig5NixERCwwNiwzRCksCVYoREQsM0UsMDUsQUUpLAlWKDRELEU2LEJELDQ2KSwJXAorCVYoOTEsNTQsOEQsQjUpLAlWKDcxLEM0LDVELDA1KSwJVigwNCwwNixENCw2RiksCVYoNjAsNTAsMTUsRkYpLAlcCisJVigxOSw5OCxGQiwyNCksCVYoRDYsQkQsRTksOTcpLAlWKDg5LDQwLDQzLENDKSwJVig2NyxEOSw5RSw3NyksCVwKKwlWKEIwLEU4LDQyLEJEKSwJVigwNyw4OSw4Qiw4OCksCVYoRTcsMTksNUIsMzgpLAlWKDc5LEM4LEVFLERCKSwJXAorCVYoQTEsN0MsMEEsNDcpLAlWKDdDLDQyLDBGLEU5KSwJVihGOCw4NCwxRSxDOSksCVYoMDAsMDAsMDAsMDApLAlcCisJVigwOSw4MCw4Niw4MyksCVYoMzIsMkIsRUQsNDgpLAlWKDFFLDExLDcwLEFDKSwJVig2Qyw1QSw3Miw0RSksCVwKKwlWKEZELDBFLEZGLEZCKSwJVigwRiw4NSwzOCw1NiksCVYoM0QsQUUsRDUsMUUpLAlWKDM2LDJELDM5LDI3KSwJXAorCVYoMEEsMEYsRDksNjQpLAlWKDY4LDVDLEE2LDIxKSwJVig5Qiw1Qiw1NCxEMSksCVYoMjQsMzYsMkUsM0EpLAlcCisJVigwQywwQSw2NyxCMSksCVYoOTMsNTcsRTcsMEYpLAlWKEI0LEVFLDk2LEQyKSwJVigxQiw5Qiw5MSw5RSksCVwKKwlWKDgwLEMwLEM1LDRGKSwJVig2MSxEQywyMCxBMiksCVYoNUEsNzcsNEIsNjkpLAlWKDFDLDEyLDFBLDE2KSwJXAorCVYoRTIsOTMsQkEsMEEpLAlWKEMwLEEwLDJBLEU1KSwJVigzQywyMixFMCw0MyksCVYoMTIsMUIsMTcsMUQpLAlcCisJVigwRSwwOSwwRCwwQiksCVYoRjIsOEIsQzcsQUQpLAlWKDJELEI2LEE4LEI5KSwJVigxNCwxRSxBOSxDOCksCVwKKwlWKDU3LEYxLDE5LDg1KSwJVihBRiw3NSwwNyw0QyksCVYoRUUsOTksREQsQkIpLAlWKEEzLDdGLDYwLEZEKSwJXAorCVYoRjcsMDEsMjYsOUYpLAlWKDVDLDcyLEY1LEJDKSwJVig0NCw2NiwzQixDNSksCVYoNUIsRkIsN0UsMzQpLAlcCisJVig4Qiw0MywyOSw3NiksCVYoQ0IsMjMsQzYsREMpLAlWKEI2LEVELEZDLDY4KSwJVihCOCxFNCxGMSw2MyksCVwKKwlWKEQ3LDMxLERDLENBKSwJVig0Miw2Myw4NSwxMCksCVYoMTMsOTcsMjIsNDApLAlWKDg0LEM2LDExLDIwKSwJXAorCVYoODUsNEEsMjQsN0QpLAlWKEQyLEJCLDNELEY4KSwJVihBRSxGOSwzMiwxMSksCVYoQzcsMjksQTEsNkQpLAlcCisJVigxRCw5RSwyRiw0QiksCVYoREMsQjIsMzAsRjMpLAlWKDBELDg2LDUyLEVDKSwJVig3NyxDMSxFMyxEMCksCVwKKwlWKDJCLEIzLDE2LDZDKSwJVihBOSw3MCxCOSw5OSksCVYoMTEsOTQsNDgsRkEpLAlWKDQ3LEU5LDY0LDIyKSwJXAorCVYoQTgsRkMsOEMsQzQpLAlWKEEwLEYwLDNGLDFBKSwJVig1Niw3RCwyQyxEOCksCVYoMjIsMzMsOTAsRUYpLAlcCisJVig4Nyw0OSw0RSxDNyksCVYoRDksMzgsRDEsQzEpLAlWKDhDLENBLEEyLEZFKSwJVig5OCxENCwwQiwzNiksCVwKKwlWKEE2LEY1LDgxLENGKSwJVihBNSw3QSxERSwyOCksCVYoREEsQjcsOEUsMjYpLAlWKDNGLEFELEJGLEE0KSwJXAorCVYoMkMsM0EsOUQsRTQpLAlWKDUwLDc4LDkyLDBEKSwJVig2QSw1RixDQyw5QiksCVYoNTQsN0UsNDYsNjIpLAlcCisJVihGNiw4RCwxMyxDMiksCVYoOTAsRDgsQjgsRTgpLAlWKDJFLDM5LEY3LDVFKSwJVig4MixDMyxBRixGNSksCVwKKwlWKDlGLDVELDgwLEJFKSwJVig2OSxEMCw5Myw3QyksCVYoNkYsRDUsMkQsQTkpLAlWKENGLDI1LDEyLEIzKSwJXAorCVYoQzgsQUMsOTksM0IpLAlWKDEwLDE4LDdELEE3KSwJVihFOCw5Qyw2Myw2RSksCVYoREIsM0IsQkIsN0IpLAlcCisJVihDRCwyNiw3OCwwOSksCVYoNkUsNTksMTgsRjQpLAlWKEVDLDlBLEI3LDAxKSwJVig4Myw0Riw5QSxBOCksCVwKKwlWKEU2LDk1LDZFLDY1KSwJVihBQSxGRixFNiw3RSksCVYoMjEsQkMsQ0YsMDgpLAlWKEVGLDE1LEU4LEU2KSwJXAorCVYoQkEsRTcsOUIsRDkpLAlWKDRBLDZGLDM2LENFKSwJVihFQSw5RiwwOSxENCksCVYoMjksQjAsN0MsRDYpLAlcCisJVigzMSxBNCxCMixBRiksCVYoMkEsM0YsMjMsMzEpLAlWKEM2LEE1LDk0LDMwKSwJVigzNSxBMiw2NixDMCksCVwKKwlWKDc0LDRFLEJDLDM3KSwJVihGQyw4MixDQSxBNiksCVYoRTAsOTAsRDAsQjApLAlWKDMzLEE3LEQ4LDE1KSwJXAorCVYoRjEsMDQsOTgsNEEpLAlWKDQxLEVDLERBLEY3KSwJVig3RixDRCw1MCwwRSksCVYoMTcsOTEsRjYsMkYpLAlcCisJVig3Niw0RCxENiw4RCksCVYoNDMsRUYsQjAsNEQpLAlWKENDLEFBLDRELDU0KSwJVihFNCw5NiwwNCxERiksCVwKKwlWKDlFLEQxLEI1LEUzKSwJVig0Qyw2QSw4OCwxQiksCVYoQzEsMkMsMUYsQjgpLAlWKDQ2LDY1LDUxLDdGKSwJXAorCVYoOUQsNUUsRUEsMDQpLAlWKDAxLDhDLDM1LDVEKSwJVihGQSw4Nyw3NCw3MyksCVYoRkIsMEIsNDEsMkUpLAlcCisJVihCMyw2NywxRCw1QSksCVYoOTIsREIsRDIsNTIpLAlWKEU5LDEwLDU2LDMzKSwJVig2RCxENiw0NywxMyksCVwKKwlWKDlBLEQ3LDYxLDhDKSwJVigzNyxBMSwwQyw3QSksCVYoNTksRjgsMTQsOEUpLAlWKEVCLDEzLDNDLDg5KSwJXAorCVYoQ0UsQTksMjcsRUUpLAlWKEI3LDYxLEM5LDM1KSwJVihFMSwxQyxFNSxFRCksCVYoN0EsNDcsQjEsM0MpLAlcCisJVig5QyxEMixERiw1OSksCVYoNTUsRjIsNzMsM0YpLAlWKDE4LDE0LENFLDc5KSwJVig3MyxDNywzNyxCRiksCVwKKwlWKDUzLEY3LENELEVBKSwJVig1RixGRCxBQSw1QiksCVYoREYsM0QsNkYsMTQpLAlWKDc4LDQ0LERCLDg2KSwJXAorCVYoQ0EsQUYsRjMsODEpLAlWKEI5LDY4LEM0LDNFKSwJVigzOCwyNCwzNCwyQyksCVYoQzIsQTMsNDAsNUYpLAlcCisJVigxNiwxRCxDMyw3MiksCVYoQkMsRTIsMjUsMEMpLAlWKDI4LDNDLDQ5LDhCKSwJVihGRiwwRCw5NSw0MSksCVwKKwlWKDM5LEE4LDAxLDcxKSwJVigwOCwwQyxCMyxERSksCVYoRDgsQjQsRTQsOUMpLAlWKDY0LDU2LEMxLDkwKSwJXAorCVYoN0IsQ0IsODQsNjEpLAlWKEQ1LDMyLEI2LDcwKSwJVig0OCw2Qyw1Qyw3NCksCVYoRDAsQjgsNTcsNDIpCisKKyNkZWZpbmUJVihhLGIsYyxkKSAweCMjYSMjYiMjYyMjZAorc3RhdGljIHVpbnQzMiBSVDBbMjU2XSA9IHsgUlQgfTsKKyN1bmRlZiBWCisKKyNkZWZpbmUJVihhLGIsYyxkKSAweCMjZCMjYSMjYiMjYworc3RhdGljIHVpbnQzMiBSVDFbMjU2XSA9IHsgUlQgfTsKKyN1bmRlZiBWCisKKyNkZWZpbmUJVihhLGIsYyxkKSAweCMjYyMjZCMjYSMjYgorc3RhdGljIHVpbnQzMiBSVDJbMjU2XSA9IHsgUlQgfTsKKyN1bmRlZiBWCisKKyNkZWZpbmUJVihhLGIsYyxkKSAweCMjYiMjYyMjZCMjYQorc3RhdGljIHVpbnQzMiBSVDNbMjU2XSA9IHsgUlQgfTsKKyN1bmRlZiBWCisKKyN1bmRlZiBSVAorCisvKiByb3VuZCBjb25zdGFudHMgKi8KKworc3RhdGljIHVpbnQzMiBSQ09OWzEwXSA9Cit7CisJMHgwMTAwMDAwMCwJMHgwMjAwMDAwMCwJMHgwNDAwMDAwMCwJMHgwODAwMDAwMCwKKwkweDEwMDAwMDAwLAkweDIwMDAwMDAwLAkweDQwMDAwMDAwLAkweDgwMDAwMDAwLAorCTB4MUIwMDAwMDAsCTB4MzYwMDAwMDAKK307CisKKy8qIGtleSBzY2hlZHVsZQl0YWJsZXMgKi8KKworc3RhdGljIGludCBLVF9pbml0ID0gMTsKKworc3RhdGljIHVpbnQzMiBLVDBbMjU2XTsKK3N0YXRpYyB1aW50MzIgS1QxWzI1Nl07CitzdGF0aWMgdWludDMyIEtUMlsyNTZdOworc3RhdGljIHVpbnQzMiBLVDNbMjU2XTsKKworLyogcGxhdGZvcm0taW5kZXBlbmRhbnQJMzItYml0IGludGVnZXIgbWFuaXB1bGF0aW9uCW1hY3JvcyAqLworCisjZGVmaW5lCUdFVF9VSU5UMzIobixiLGkpCQkJCQkJXAorewkJCQkJCQkJCQkJCVwKKwkobikJPSAoCSh1aW50MzIpIChiKVsoaSkJXSA8PCAyNAkpCQlcCisJCXwgKAkodWludDMyKSAoYilbKGkpICsgMV0gPDwgMTYJKQkJXAorCQl8ICgJKHVpbnQzMikgKGIpWyhpKSArIDJdIDw8ICA4CSkJCVwKKwkJfCAoCSh1aW50MzIpIChiKVsoaSkgKyAzXQkJKTsJCVwKK30KKworI2RlZmluZQlQVVRfVUlOVDMyKG4sYixpKQkJCQkJCVwKK3sJCQkJCQkJCQkJCQlcCisJKGIpWyhpKQkgICBdID0gKHVpbnQ4KSAoIChuKSA+PgkyNCApOwkJXAorCShiKVsoaSkJKyAxXSA9ICh1aW50OCkgKCAobikgPj4JMTYgKTsJCVwKKwkoYilbKGkpCSsgMl0gPSAodWludDgpICggKG4pID4+CSA4ICk7CQlcCisJKGIpWyhpKQkrIDNdID0gKHVpbnQ4KSAoIChuKQkgICApOwkJXAorfQorCisvKiBBRVMga2V5IHNjaGVkdWxpbmcgcm91dGluZSAqLworCitpbnQJcnRtcF9hZXNfc2V0X2tleSggYWVzX2NvbnRleHQgKmN0eCwgdWludDggKmtleSwgaW50IG5iaXRzICkKK3sKKwlpbnQJaTsKKwl1aW50MzIgKlJLLAkqU0s7CisKKwlzd2l0Y2goCW5iaXRzICkKKwl7CisJCWNhc2UgMTI4OiBjdHgtPm5yID0JMTA7CWJyZWFrOworCQljYXNlIDE5MjogY3R4LT5uciA9CTEyOwlicmVhazsKKwkJY2FzZSAyNTY6IGN0eC0+bnIgPQkxNDsJYnJlYWs7CisJCWRlZmF1bHQJOiByZXR1cm4oIDEJKTsKKwl9CisKKwlSSyA9IGN0eC0+ZXJrOworCisJZm9yKCBpID0gMDsJaSA8CShuYml0cyA+PiA1KTsgaSsrICkKKwl7CisJCUdFVF9VSU5UMzIoCVJLW2ldLCBrZXksCWkgKgk0ICk7CisJfQorCisJLyogc2V0dXAgZW5jcnlwdGlvbglyb3VuZCBrZXlzICovCisKKwlzd2l0Y2goCW5iaXRzICkKKwl7CisJY2FzZSAxMjg6CisKKwkJZm9yKCBpID0gMDsJaSA8CTEwOwlpKyssIFJLCSs9IDQgKQorCQl7CisJCQlSS1s0XSAgPSBSS1swXSBeIFJDT05baV0gXgorCQkJCQkJKCBGU2JbICh1aW50OCkgKCBSS1szXSA+PiAxNiApIF0gPDwJMjQgKSBeCisJCQkJCQkoIEZTYlsgKHVpbnQ4KSAoIFJLWzNdID4+ICA4ICkgXSA8PAkxNiApIF4KKwkJCQkJCSggRlNiWyAodWludDgpICggUktbM10JCSApIF0gPDwJIDggKSBeCisJCQkJCQkoIEZTYlsgKHVpbnQ4KSAoIFJLWzNdID4+IDI0ICkgXQkgICApOworCisJCQlSS1s1XSAgPSBSS1sxXSBeIFJLWzRdOworCQkJUktbNl0gID0gUktbMl0gXiBSS1s1XTsKKwkJCVJLWzddICA9IFJLWzNdIF4gUktbNl07CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIDE5MjoKKworCQlmb3IoIGkgPSAwOwlpIDwJODsgaSsrLAlSSyArPSA2CSkKKwkJeworCQkJUktbNl0gID0gUktbMF0gXiBSQ09OW2ldIF4KKwkJCQkJCSggRlNiWyAodWludDgpICggUktbNV0gPj4gMTYgKSBdIDw8CTI0ICkgXgorCQkJCQkJKCBGU2JbICh1aW50OCkgKCBSS1s1XSA+PiAgOCApIF0gPDwJMTYgKSBeCisJCQkJCQkoIEZTYlsgKHVpbnQ4KSAoIFJLWzVdCQkgKSBdIDw8CSA4ICkgXgorCQkJCQkJKCBGU2JbICh1aW50OCkgKCBSS1s1XSA+PiAyNCApIF0JICAgKTsKKworCQkJUktbN10gID0gUktbMV0gXiBSS1s2XTsKKwkJCVJLWzhdICA9IFJLWzJdIF4gUktbN107CisJCQlSS1s5XSAgPSBSS1szXSBeIFJLWzhdOworCQkJUktbMTBdID0gUktbNF0gXiBSS1s5XTsKKwkJCVJLWzExXSA9IFJLWzVdIF4gUktbMTBdOworCQl9CisJCWJyZWFrOworCisJY2FzZSAyNTY6CisKKwkJZm9yKCBpID0gMDsJaSA8CTc7IGkrKywJUksgKz0gOAkpCisJCXsKKwkJCVJLWzhdICA9IFJLWzBdIF4gUkNPTltpXSBeCisJCQkJCQkoIEZTYlsgKHVpbnQ4KSAoIFJLWzddID4+IDE2ICkgXSA8PAkyNCApIF4KKwkJCQkJCSggRlNiWyAodWludDgpICggUktbN10gPj4gIDggKSBdIDw8CTE2ICkgXgorCQkJCQkJKCBGU2JbICh1aW50OCkgKCBSS1s3XQkJICkgXSA8PAkgOCApIF4KKwkJCQkJCSggRlNiWyAodWludDgpICggUktbN10gPj4gMjQgKSBdCSAgICk7CisKKwkJCVJLWzldICA9IFJLWzFdIF4gUktbOF07CisJCQlSS1sxMF0gPSBSS1syXSBeIFJLWzldOworCQkJUktbMTFdID0gUktbM10gXiBSS1sxMF07CisKKwkJCVJLWzEyXSA9IFJLWzRdIF4KKwkJCQkJCSggRlNiWyAodWludDgpICggUktbMTFdCT4+IDI0ICkJXSA8PCAyNAkpIF4KKwkJCQkJCSggRlNiWyAodWludDgpICggUktbMTFdCT4+IDE2ICkJXSA8PCAxNgkpIF4KKwkJCQkJCSggRlNiWyAodWludDgpICggUktbMTFdCT4+CTggKQldIDw8ICA4CSkgXgorCQkJCQkJKCBGU2JbICh1aW50OCkgKCBSS1sxMV0JCSAgKQldCQkpOworCisJCQlSS1sxM10gPSBSS1s1XSBeIFJLWzEyXTsKKwkJCVJLWzE0XSA9IFJLWzZdIF4gUktbMTNdOworCQkJUktbMTVdID0gUktbN10gXiBSS1sxNF07CisJCX0KKwkJYnJlYWs7CisJfQorCisJLyogc2V0dXAgZGVjcnlwdGlvbglyb3VuZCBrZXlzICovCisKKwlpZigJS1RfaW5pdAkpCisJeworCQlmb3IoIGkgPSAwOwlpIDwJMjU2OyBpKysgKQorCQl7CisJCQlLVDBbaV0gPSBSVDBbIEZTYltpXSBdOworCQkJS1QxW2ldID0gUlQxWyBGU2JbaV0gXTsKKwkJCUtUMltpXSA9IFJUMlsgRlNiW2ldIF07CisJCQlLVDNbaV0gPSBSVDNbIEZTYltpXSBdOworCQl9CisKKwkJS1RfaW5pdAk9IDA7CisJfQorCisJU0sgPSBjdHgtPmRyazsKKworCSpTSysrID0JKlJLKys7CisJKlNLKysgPQkqUksrKzsKKwkqU0srKyA9CSpSSysrOworCSpTSysrID0JKlJLKys7CisKKwlmb3IoIGkgPSAxOwlpIDwJY3R4LT5ucjsgaSsrICkKKwl7CisJCVJLIC09IDg7CisKKwkJKlNLKysgPQlLVDBbICh1aW50OCkgKCAqUksgPj4gMjQgKSBdIF4KKwkJCQlLVDFbICh1aW50OCkgKCAqUksgPj4gMTYgKSBdIF4KKwkJCQlLVDJbICh1aW50OCkgKCAqUksgPj4gIDggKSBdIF4KKwkJCQlLVDNbICh1aW50OCkgKCAqUksJCSApIF07IFJLKys7CisKKwkJKlNLKysgPQlLVDBbICh1aW50OCkgKCAqUksgPj4gMjQgKSBdIF4KKwkJCQlLVDFbICh1aW50OCkgKCAqUksgPj4gMTYgKSBdIF4KKwkJCQlLVDJbICh1aW50OCkgKCAqUksgPj4gIDggKSBdIF4KKwkJCQlLVDNbICh1aW50OCkgKCAqUksJCSApIF07IFJLKys7CisKKwkJKlNLKysgPQlLVDBbICh1aW50OCkgKCAqUksgPj4gMjQgKSBdIF4KKwkJCQlLVDFbICh1aW50OCkgKCAqUksgPj4gMTYgKSBdIF4KKwkJCQlLVDJbICh1aW50OCkgKCAqUksgPj4gIDggKSBdIF4KKwkJCQlLVDNbICh1aW50OCkgKCAqUksJCSApIF07IFJLKys7CisKKwkJKlNLKysgPQlLVDBbICh1aW50OCkgKCAqUksgPj4gMjQgKSBdIF4KKwkJCQlLVDFbICh1aW50OCkgKCAqUksgPj4gMTYgKSBdIF4KKwkJCQlLVDJbICh1aW50OCkgKCAqUksgPj4gIDggKSBdIF4KKwkJCQlLVDNbICh1aW50OCkgKCAqUksJCSApIF07IFJLKys7CisJfQorCisJUksgLT0gODsKKworCSpTSysrID0JKlJLKys7CisJKlNLKysgPQkqUksrKzsKKwkqU0srKyA9CSpSSysrOworCSpTSysrID0JKlJLKys7CisKKwlyZXR1cm4oCTAgKTsKK30KKworLyogQUVTIDEyOC1iaXQgYmxvY2sgZW5jcnlwdGlvbglyb3V0aW5lCSovCisKK3ZvaWQgcnRtcF9hZXNfZW5jcnlwdChhZXNfY29udGV4dCAqY3R4LCB1aW50OCBpbnB1dFsxNl0sCXVpbnQ4IG91dHB1dFsxNl0gKQoreworCXVpbnQzMiAqUkssCVgwLAlYMSwJWDIsCVgzLAlZMCwJWTEsCVkyLAlZMzsKKworCVJLID0gY3R4LT5lcms7CisJR0VUX1VJTlQzMigJWDAsCWlucHV0LAkwICk7IFgwCV49IFJLWzBdOworCUdFVF9VSU5UMzIoCVgxLAlpbnB1dCwJNCApOyBYMQlePSBSS1sxXTsKKwlHRVRfVUlOVDMyKAlYMiwJaW5wdXQsCTggKTsgWDIJXj0gUktbMl07CisJR0VUX1VJTlQzMigJWDMsCWlucHV0LCAxMiApOyBYMwlePSBSS1szXTsKKworI2RlZmluZQlBRVNfRlJPVU5EKFgwLFgxLFgyLFgzLFkwLFkxLFkyLFkzKQkJXAorewkJCQkJCQkJCQkJCVwKKwlSSyArPSA0OwkJCQkJCQkJCVwKKwkJCQkJCQkJCQkJCVwKKwlYMCA9IFJLWzBdIF4gRlQwWyAodWludDgpICgJWTAgPj4gMjQgKSBdIF4JXAorCQkJCSBGVDFbICh1aW50OCkgKAlZMSA+PiAxNiApIF0gXglcCisJCQkJIEZUMlsgKHVpbnQ4KSAoCVkyID4+ICA4ICkgXSBeCVwKKwkJCQkgRlQzWyAodWludDgpICgJWTMJCSApIF07CVwKKwkJCQkJCQkJCQkJCVwKKwlYMSA9IFJLWzFdIF4gRlQwWyAodWludDgpICgJWTEgPj4gMjQgKSBdIF4JXAorCQkJCSBGVDFbICh1aW50OCkgKAlZMiA+PiAxNiApIF0gXglcCisJCQkJIEZUMlsgKHVpbnQ4KSAoCVkzID4+ICA4ICkgXSBeCVwKKwkJCQkgRlQzWyAodWludDgpICgJWTAJCSApIF07CVwKKwkJCQkJCQkJCQkJCVwKKwlYMiA9IFJLWzJdIF4gRlQwWyAodWludDgpICgJWTIgPj4gMjQgKSBdIF4JXAorCQkJCSBGVDFbICh1aW50OCkgKAlZMyA+PiAxNiApIF0gXglcCisJCQkJIEZUMlsgKHVpbnQ4KSAoCVkwID4+ICA4ICkgXSBeCVwKKwkJCQkgRlQzWyAodWludDgpICgJWTEJCSApIF07CVwKKwkJCQkJCQkJCQkJCVwKKwlYMyA9IFJLWzNdIF4gRlQwWyAodWludDgpICgJWTMgPj4gMjQgKSBdIF4JXAorCQkJCSBGVDFbICh1aW50OCkgKAlZMCA+PiAxNiApIF0gXglcCisJCQkJIEZUMlsgKHVpbnQ4KSAoCVkxID4+ICA4ICkgXSBeCVwKKwkJCQkgRlQzWyAodWludDgpICgJWTIJCSApIF07CVwKK30KKworCUFFU19GUk9VTkQoCVkwLAlZMSwJWTIsCVkzLAlYMCwJWDEsCVgyLAlYMyApOwkJLyogcm91bmQgMSAqLworCUFFU19GUk9VTkQoCVgwLAlYMSwJWDIsCVgzLAlZMCwJWTEsCVkyLAlZMyApOwkJLyogcm91bmQgMiAqLworCUFFU19GUk9VTkQoCVkwLAlZMSwJWTIsCVkzLAlYMCwJWDEsCVgyLAlYMyApOwkJLyogcm91bmQgMyAqLworCUFFU19GUk9VTkQoCVgwLAlYMSwJWDIsCVgzLAlZMCwJWTEsCVkyLAlZMyApOwkJLyogcm91bmQgNCAqLworCUFFU19GUk9VTkQoCVkwLAlZMSwJWTIsCVkzLAlYMCwJWDEsCVgyLAlYMyApOwkJLyogcm91bmQgNSAqLworCUFFU19GUk9VTkQoCVgwLAlYMSwJWDIsCVgzLAlZMCwJWTEsCVkyLAlZMyApOwkJLyogcm91bmQgNiAqLworCUFFU19GUk9VTkQoCVkwLAlZMSwJWTIsCVkzLAlYMCwJWDEsCVgyLAlYMyApOwkJLyogcm91bmQgNyAqLworCUFFU19GUk9VTkQoCVgwLAlYMSwJWDIsCVgzLAlZMCwJWTEsCVkyLAlZMyApOwkJLyogcm91bmQgOCAqLworCUFFU19GUk9VTkQoCVkwLAlZMSwJWTIsCVkzLAlYMCwJWDEsCVgyLAlYMyApOwkJLyogcm91bmQgOSAqLworCisJaWYoCWN0eC0+bnIJPiAxMCApCisJeworCQlBRVNfRlJPVU5EKAlYMCwJWDEsCVgyLAlYMywJWTAsCVkxLAlZMiwJWTMgKTsJLyogcm91bmQgMTAJKi8KKwkJQUVTX0ZST1VORCgJWTAsCVkxLAlZMiwJWTMsCVgwLAlYMSwJWDIsCVgzICk7CS8qIHJvdW5kIDExCSovCisJfQorCisJaWYoCWN0eC0+bnIJPiAxMiApCisJeworCQlBRVNfRlJPVU5EKAlYMCwJWDEsCVgyLAlYMywJWTAsCVkxLAlZMiwJWTMgKTsJLyogcm91bmQgMTIJKi8KKwkJQUVTX0ZST1VORCgJWTAsCVkxLAlZMiwJWTMsCVgwLAlYMSwJWDIsCVgzICk7CS8qIHJvdW5kIDEzCSovCisJfQorCisJLyogbGFzdAlyb3VuZCAqLworCisJUksgKz0gNDsKKworCVgwID0gUktbMF0gXiAoIEZTYlsJKHVpbnQ4KQkoIFkwID4+CTI0ICkgXSA8PCAyNCApIF4KKwkJCQkgKCBGU2JbCSh1aW50OCkJKCBZMSA+PgkxNiApIF0gPDwgMTYgKSBeCisJCQkJICggRlNiWwkodWludDgpCSggWTIgPj4JIDggKSBdIDw8ICA4ICkgXgorCQkJCSAoIEZTYlsJKHVpbnQ4KQkoIFkzCSAgICkgXQkJICk7CisKKwlYMSA9IFJLWzFdIF4gKCBGU2JbCSh1aW50OCkJKCBZMSA+PgkyNCApIF0gPDwgMjQgKSBeCisJCQkJICggRlNiWwkodWludDgpCSggWTIgPj4JMTYgKSBdIDw8IDE2ICkgXgorCQkJCSAoIEZTYlsJKHVpbnQ4KQkoIFkzID4+CSA4ICkgXSA8PCAgOCApIF4KKwkJCQkgKCBGU2JbCSh1aW50OCkJKCBZMAkgICApIF0JCSApOworCisJWDIgPSBSS1syXSBeICggRlNiWwkodWludDgpCSggWTIgPj4JMjQgKSBdIDw8IDI0ICkgXgorCQkJCSAoIEZTYlsJKHVpbnQ4KQkoIFkzID4+CTE2ICkgXSA8PCAxNiApIF4KKwkJCQkgKCBGU2JbCSh1aW50OCkJKCBZMCA+PgkgOCApIF0gPDwgIDggKSBeCisJCQkJICggRlNiWwkodWludDgpCSggWTEJICAgKSBdCQkgKTsKKworCVgzID0gUktbM10gXiAoIEZTYlsJKHVpbnQ4KQkoIFkzID4+CTI0ICkgXSA8PCAyNCApIF4KKwkJCQkgKCBGU2JbCSh1aW50OCkJKCBZMCA+PgkxNiApIF0gPDwgMTYgKSBeCisJCQkJICggRlNiWwkodWludDgpCSggWTEgPj4JIDggKSBdIDw8ICA4ICkgXgorCQkJCSAoIEZTYlsJKHVpbnQ4KQkoIFkyCSAgICkgXQkJICk7CisKKwlQVVRfVUlOVDMyKAlYMCwJb3V0cHV0LAkgMCApOworCVBVVF9VSU5UMzIoCVgxLAlvdXRwdXQsCSA0ICk7CisJUFVUX1VJTlQzMigJWDIsCW91dHB1dCwJIDggKTsKKwlQVVRfVUlOVDMyKAlYMywJb3V0cHV0LAkxMiApOworfQorCisvKiBBRVMgMTI4LWJpdCBibG9jayBkZWNyeXB0aW9uCXJvdXRpbmUJKi8KKwordm9pZCBydG1wX2Flc19kZWNyeXB0KCBhZXNfY29udGV4dCAqY3R4LAl1aW50OCBpbnB1dFsxNl0sIHVpbnQ4IG91dHB1dFsxNl0gKQoreworCXVpbnQzMiAqUkssCVgwLAlYMSwJWDIsCVgzLAlZMCwJWTEsCVkyLAlZMzsKKworCVJLID0gY3R4LT5kcms7CisKKwlHRVRfVUlOVDMyKAlYMCwJaW5wdXQsCTAgKTsgWDAJXj0gUktbMF07CisJR0VUX1VJTlQzMigJWDEsCWlucHV0LAk0ICk7IFgxCV49IFJLWzFdOworCUdFVF9VSU5UMzIoCVgyLAlpbnB1dCwJOCApOyBYMglePSBSS1syXTsKKwlHRVRfVUlOVDMyKAlYMywJaW5wdXQsIDEyICk7IFgzCV49IFJLWzNdOworCisjZGVmaW5lCUFFU19SUk9VTkQoWDAsWDEsWDIsWDMsWTAsWTEsWTIsWTMpCQlcCit7CQkJCQkJCQkJCQkJXAorCVJLICs9IDQ7CQkJCQkJCQkJXAorCQkJCQkJCQkJCQkJXAorCVgwID0gUktbMF0gXiBSVDBbICh1aW50OCkgKAlZMCA+PiAyNCApIF0gXglcCisJCQkJIFJUMVsgKHVpbnQ4KSAoCVkzID4+IDE2ICkgXSBeCVwKKwkJCQkgUlQyWyAodWludDgpICgJWTIgPj4gIDggKSBdIF4JXAorCQkJCSBSVDNbICh1aW50OCkgKAlZMQkJICkgXTsJXAorCQkJCQkJCQkJCQkJXAorCVgxID0gUktbMV0gXiBSVDBbICh1aW50OCkgKAlZMSA+PiAyNCApIF0gXglcCisJCQkJIFJUMVsgKHVpbnQ4KSAoCVkwID4+IDE2ICkgXSBeCVwKKwkJCQkgUlQyWyAodWludDgpICgJWTMgPj4gIDggKSBdIF4JXAorCQkJCSBSVDNbICh1aW50OCkgKAlZMgkJICkgXTsJXAorCQkJCQkJCQkJCQkJXAorCVgyID0gUktbMl0gXiBSVDBbICh1aW50OCkgKAlZMiA+PiAyNCApIF0gXglcCisJCQkJIFJUMVsgKHVpbnQ4KSAoCVkxID4+IDE2ICkgXSBeCVwKKwkJCQkgUlQyWyAodWludDgpICgJWTAgPj4gIDggKSBdIF4JXAorCQkJCSBSVDNbICh1aW50OCkgKAlZMwkJICkgXTsJXAorCQkJCQkJCQkJCQkJXAorCVgzID0gUktbM10gXiBSVDBbICh1aW50OCkgKAlZMyA+PiAyNCApIF0gXglcCisJCQkJIFJUMVsgKHVpbnQ4KSAoCVkyID4+IDE2ICkgXSBeCVwKKwkJCQkgUlQyWyAodWludDgpICgJWTEgPj4gIDggKSBdIF4JXAorCQkJCSBSVDNbICh1aW50OCkgKAlZMAkJICkgXTsJXAorfQorCisJQUVTX1JST1VORCgJWTAsCVkxLAlZMiwJWTMsCVgwLAlYMSwJWDIsCVgzICk7CQkvKiByb3VuZCAxICovCisJQUVTX1JST1VORCgJWDAsCVgxLAlYMiwJWDMsCVkwLAlZMSwJWTIsCVkzICk7CQkvKiByb3VuZCAyICovCisJQUVTX1JST1VORCgJWTAsCVkxLAlZMiwJWTMsCVgwLAlYMSwJWDIsCVgzICk7CQkvKiByb3VuZCAzICovCisJQUVTX1JST1VORCgJWDAsCVgxLAlYMiwJWDMsCVkwLAlZMSwJWTIsCVkzICk7CQkvKiByb3VuZCA0ICovCisJQUVTX1JST1VORCgJWTAsCVkxLAlZMiwJWTMsCVgwLAlYMSwJWDIsCVgzICk7CQkvKiByb3VuZCA1ICovCisJQUVTX1JST1VORCgJWDAsCVgxLAlYMiwJWDMsCVkwLAlZMSwJWTIsCVkzICk7CQkvKiByb3VuZCA2ICovCisJQUVTX1JST1VORCgJWTAsCVkxLAlZMiwJWTMsCVgwLAlYMSwJWDIsCVgzICk7CQkvKiByb3VuZCA3ICovCisJQUVTX1JST1VORCgJWDAsCVgxLAlYMiwJWDMsCVkwLAlZMSwJWTIsCVkzICk7CQkvKiByb3VuZCA4ICovCisJQUVTX1JST1VORCgJWTAsCVkxLAlZMiwJWTMsCVgwLAlYMSwJWDIsCVgzICk7CQkvKiByb3VuZCA5ICovCisKKwlpZigJY3R4LT5ucgk+IDEwICkKKwl7CisJCUFFU19SUk9VTkQoCVgwLAlYMSwJWDIsCVgzLAlZMCwJWTEsCVkyLAlZMyApOwkvKiByb3VuZCAxMAkqLworCQlBRVNfUlJPVU5EKAlZMCwJWTEsCVkyLAlZMywJWDAsCVgxLAlYMiwJWDMgKTsJLyogcm91bmQgMTEJKi8KKwl9CisKKwlpZigJY3R4LT5ucgk+IDEyICkKKwl7CisJCUFFU19SUk9VTkQoCVgwLAlYMSwJWDIsCVgzLAlZMCwJWTEsCVkyLAlZMyApOwkvKiByb3VuZCAxMgkqLworCQlBRVNfUlJPVU5EKAlZMCwJWTEsCVkyLAlZMywJWDAsCVgxLAlYMiwJWDMgKTsJLyogcm91bmQgMTMJKi8KKwl9CisKKwkvKiBsYXN0CXJvdW5kICovCisKKwlSSyArPSA0OworCisJWDAgPSBSS1swXSBeICggUlNiWwkodWludDgpCSggWTAgPj4JMjQgKSBdIDw8IDI0ICkgXgorCQkJCSAoIFJTYlsJKHVpbnQ4KQkoIFkzID4+CTE2ICkgXSA8PCAxNiApIF4KKwkJCQkgKCBSU2JbCSh1aW50OCkJKCBZMiA+PgkgOCApIF0gPDwgIDggKSBeCisJCQkJICggUlNiWwkodWludDgpCSggWTEJICAgKSBdCQkgKTsKKworCVgxID0gUktbMV0gXiAoIFJTYlsJKHVpbnQ4KQkoIFkxID4+CTI0ICkgXSA8PCAyNCApIF4KKwkJCQkgKCBSU2JbCSh1aW50OCkJKCBZMCA+PgkxNiApIF0gPDwgMTYgKSBeCisJCQkJICggUlNiWwkodWludDgpCSggWTMgPj4JIDggKSBdIDw8ICA4ICkgXgorCQkJCSAoIFJTYlsJKHVpbnQ4KQkoIFkyCSAgICkgXQkJICk7CisKKwlYMiA9IFJLWzJdIF4gKCBSU2JbCSh1aW50OCkJKCBZMiA+PgkyNCApIF0gPDwgMjQgKSBeCisJCQkJICggUlNiWwkodWludDgpCSggWTEgPj4JMTYgKSBdIDw8IDE2ICkgXgorCQkJCSAoIFJTYlsJKHVpbnQ4KQkoIFkwID4+CSA4ICkgXSA8PCAgOCApIF4KKwkJCQkgKCBSU2JbCSh1aW50OCkJKCBZMwkgICApIF0JCSApOworCisJWDMgPSBSS1szXSBeICggUlNiWwkodWludDgpCSggWTMgPj4JMjQgKSBdIDw8IDI0ICkgXgorCQkJCSAoIFJTYlsJKHVpbnQ4KQkoIFkyID4+CTE2ICkgXSA8PCAxNiApIF4KKwkJCQkgKCBSU2JbCSh1aW50OCkJKCBZMSA+PgkgOCApIF0gPDwgIDggKSBeCisJCQkJICggUlNiWwkodWludDgpCSggWTAJICAgKSBdCQkgKTsKKworCVBVVF9VSU5UMzIoCVgwLAlvdXRwdXQsCSAwICk7CisJUFVUX1VJTlQzMigJWDEsCW91dHB1dCwJIDQgKTsKKwlQVVRfVUlOVDMyKAlYMiwJb3V0cHV0LAkgOCApOworCVBVVF9VSU5UMzIoCVgzLAlvdXRwdXQsCTEyICk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlTSEExIGZ1bmN0aW9uCisKKwlBcmd1bWVudHM6CisKKwlSZXR1cm4gVmFsdWU6CisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlITUFDX1NIQTEoCisJSU4JVUNIQVIJKnRleHQsCisJSU4JVUlOVAl0ZXh0X2xlbiwKKwlJTglVQ0hBUgkqa2V5LAorCUlOCVVJTlQJa2V5X2xlbiwKKwlJTglVQ0hBUgkqZGlnZXN0KQoreworCVNIQV9DVFgJY29udGV4dDsKKwlVQ0hBUglrX2lwYWRbNjVdOyAvKiBpbm5lciBwYWRkaW5nIC0ga2V5IFhPUmQgd2l0aCBpcGFkCSovCisJVUNIQVIJa19vcGFkWzY1XTsgLyogb3V0ZXIgcGFkZGluZyAtIGtleSBYT1JkIHdpdGggb3BhZAkqLworCUlOVAkJaTsKKworCS8vIGlmIGtleSBpcyBsb25nZXIJdGhhbiA2NAlieXRlcyByZXNldAlpdCB0byBrZXk9U0hBMShrZXkpCisJaWYgKGtleV9sZW4JPiA2NCkKKwl7CisJCVNIQV9DVFgJCSB0Y3R4OworCQlTSEFJbml0KCZ0Y3R4KTsKKwkJU0hBVXBkYXRlKCZ0Y3R4LCBrZXksIGtleV9sZW4pOworCQlTSEFGaW5hbCgmdGN0eCwJa2V5KTsKKwkJa2V5X2xlbgk9IDIwOworCX0KKwlOZGlzWmVyb01lbW9yeShrX2lwYWQsIHNpemVvZihrX2lwYWQpKTsKKwlOZGlzWmVyb01lbW9yeShrX29wYWQsIHNpemVvZihrX29wYWQpKTsKKwlOZGlzTW92ZU1lbW9yeShrX2lwYWQsIGtleSwJa2V5X2xlbik7CisJTmRpc01vdmVNZW1vcnkoa19vcGFkLCBrZXksCWtleV9sZW4pOworCisJLy8gWE9SIGtleSB3aXRoCWlwYWQgYW5kIG9wYWQgdmFsdWVzCisJZm9yCShpID0gMDsJaSA8CTY0OwlpKyspCisJeworCQlrX2lwYWRbaV0gXj0gMHgzNjsKKwkJa19vcGFkW2ldIF49IDB4NWM7CisJfQorCisJLy8gcGVyZm9ybSBpbm5lciBTSEExCisJU0hBSW5pdCgmY29udGV4dCk7IAkJCQkJCS8qIGluaXQgY29udGV4dCBmb3IgMXN0IHBhc3MgKi8KKwlTSEFVcGRhdGUoJmNvbnRleHQsCWtfaXBhZCwJNjQpOwkJLyoJc3RhcnQgd2l0aCBpbm5lciBwYWQgKi8KKwlTSEFVcGRhdGUoJmNvbnRleHQsCXRleHQsIHRleHRfbGVuKTsJLyoJdGhlbiB0ZXh0IG9mIGRhdGFncmFtICovCisJU0hBRmluYWwoJmNvbnRleHQsIGRpZ2VzdCk7CQkJCS8qIGZpbmlzaCB1cCAxc3QgcGFzcyAqLworCisJLy9wZXJmb3JtIG91dGVyCVNIQTEKKwlTSEFJbml0KCZjb250ZXh0KTsJCQkJCS8qIGluaXQgY29udGV4dCBmb3IgMm5kIHBhc3MgKi8KKwlTSEFVcGRhdGUoJmNvbnRleHQsCWtfb3BhZCwJNjQpOwkvKglzdGFydCB3aXRoIG91dGVyIHBhZCAqLworCVNIQVVwZGF0ZSgmY29udGV4dCwJZGlnZXN0LAkyMCk7CS8qCXRoZW4gcmVzdWx0cyBvZgkxc3QJaGFzaCAqLworCVNIQUZpbmFsKCZjb250ZXh0LCBkaWdlc3QpOwkJCS8qIGZpbmlzaCB1cCAybmQgcGFzcyAqLworCit9CisKKy8qCisqIEYoUCwgUywgYywgaSkgPSBVMSB4b3IgVTIgeG9yIC4uLiBVYworKiBVMSA9IFBSRihQLCBTIHx8IEludChpKSkKKyogVTIgPSBQUkYoUCwgVTEpCisqIFVjID0gUFJGKFAsIFVjLTEpCisqLworCit2b2lkIEYoY2hhciAqcGFzc3dvcmQsIHVuc2lnbmVkIGNoYXIgKnNzaWQsIGludCBzc2lkbGVuZ3RoLCBpbnQgaXRlcmF0aW9ucywgaW50IGNvdW50LCB1bnNpZ25lZCBjaGFyICpvdXRwdXQpCit7CisgICAgdW5zaWduZWQgY2hhciBkaWdlc3RbMzZdLCBkaWdlc3QxW1NIQV9ESUdFU1RfTEVOXTsKKyAgICBpbnQgaSwgajsKKworICAgIC8qIFUxID0gUFJGKFAsIFMgfHwgaW50KGkpKSAqLworICAgIG1lbWNweShkaWdlc3QsIHNzaWQsIHNzaWRsZW5ndGgpOworICAgIGRpZ2VzdFtzc2lkbGVuZ3RoXSA9ICh1bnNpZ25lZCBjaGFyKSgoY291bnQ+PjI0KSAmIDB4ZmYpOworICAgIGRpZ2VzdFtzc2lkbGVuZ3RoKzFdID0gKHVuc2lnbmVkIGNoYXIpKChjb3VudD4+MTYpICYgMHhmZik7CisgICAgZGlnZXN0W3NzaWRsZW5ndGgrMl0gPSAodW5zaWduZWQgY2hhcikoKGNvdW50Pj44KSAmIDB4ZmYpOworICAgIGRpZ2VzdFtzc2lkbGVuZ3RoKzNdID0gKHVuc2lnbmVkIGNoYXIpKGNvdW50ICYgMHhmZik7CisgICAgSE1BQ19TSEExKGRpZ2VzdCwgc3NpZGxlbmd0aCs0LCAodW5zaWduZWQgY2hhciopIHBhc3N3b3JkLCAoaW50KSBzdHJsZW4ocGFzc3dvcmQpLCBkaWdlc3QxKTsgLy8gZm9yIFdQQSB1cGRhdGUKKworICAgIC8qIG91dHB1dCA9IFUxICovCisgICAgbWVtY3B5KG91dHB1dCwgZGlnZXN0MSwgU0hBX0RJR0VTVF9MRU4pOworCisgICAgZm9yIChpID0gMTsgaSA8IGl0ZXJhdGlvbnM7IGkrKykKKyAgICB7CisgICAgICAgIC8qIFVuID0gUFJGKFAsIFVuLTEpICovCisgICAgICAgIEhNQUNfU0hBMShkaWdlc3QxLCBTSEFfRElHRVNUX0xFTiwgKHVuc2lnbmVkIGNoYXIqKSBwYXNzd29yZCwgKGludCkgc3RybGVuKHBhc3N3b3JkKSwgZGlnZXN0KTsgLy8gZm9yIFdQQSB1cGRhdGUKKyAgICAgICAgbWVtY3B5KGRpZ2VzdDEsIGRpZ2VzdCwgU0hBX0RJR0VTVF9MRU4pOworCisgICAgICAgIC8qIG91dHB1dCA9IG91dHB1dCB4b3IgVW4gKi8KKyAgICAgICAgZm9yIChqID0gMDsgaiA8IFNIQV9ESUdFU1RfTEVOOyBqKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dHB1dFtqXSBePSBkaWdlc3Rbal07CisgICAgICAgIH0KKyAgICB9Cit9CisvKgorKiBwYXNzd29yZCAtIGFzY2lpIHN0cmluZyB1cCB0byA2MyBjaGFyYWN0ZXJzIGluIGxlbmd0aAorKiBzc2lkIC0gb2N0ZXQgc3RyaW5nIHVwIHRvIDMyIG9jdGV0cworKiBzc2lkbGVuZ3RoIC0gbGVuZ3RoIG9mIHNzaWQgaW4gb2N0ZXRzCisqIG91dHB1dCBtdXN0IGJlIDQwIG9jdGV0cyBpbiBsZW5ndGggYW5kIG91dHB1dHMgMjU2IGJpdHMgb2Yga2V5CisqLworaW50IFBhc3N3b3JkSGFzaChjaGFyICpwYXNzd29yZCwgdW5zaWduZWQgY2hhciAqc3NpZCwgaW50IHNzaWRsZW5ndGgsIHVuc2lnbmVkIGNoYXIgKm91dHB1dCkKK3sKKyAgICBpZiAoKHN0cmxlbihwYXNzd29yZCkgPiA2MykgfHwgKHNzaWRsZW5ndGggPiAzMikpCisgICAgICAgIHJldHVybiAwOworCisgICAgRihwYXNzd29yZCwgc3NpZCwgc3NpZGxlbmd0aCwgNDA5NiwgMSwgb3V0cHV0KTsKKyAgICBGKHBhc3N3b3JkLCBzc2lkLCBzc2lkbGVuZ3RoLCA0MDk2LCAyLCAmb3V0cHV0W1NIQV9ESUdFU1RfTEVOXSk7CisgICAgcmV0dXJuIDE7Cit9CisKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vbWxtZS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vbWxtZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhODJjZWUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9tbG1lLmMKQEAgLTAsMCArMSw4NjA5IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCU1vZHVsZSBOYW1lOgorCW1sbWUuYworCisJQWJzdHJhY3Q6CisKKwlSZXZpc2lvbiBIaXN0b3J5OgorCVdobwkJCVdoZW4JCQlXaGF0CisJLS0tLS0tLS0JLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCUpvaG4gQ2hhbmcJMjAwNC0wOC0yNQkJTW9kaWZ5IGZyb20gUlQyNTAwIGNvZGUgYmFzZQorCUpvaG4gQ2hhbmcJMjAwNC0wOS0wNgkJbW9kaWZpZWQgZm9yIFJUMjYwMAorKi8KKworI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorCitVQ0hBUglDSVNDT19PVUlbXSA9IHsweDAwLCAweDQwLCAweDk2fTsKKworVUNIQVIJV1BBX09VSVtdID0gezB4MDAsIDB4NTAsIDB4ZjIsIDB4MDF9OworVUNIQVIJUlNOX09VSVtdID0gezB4MDAsIDB4MGYsIDB4YWN9OworVUNIQVIJV0FQSV9PVUlbXSA9IHsweDAwLCAweDE0LCAweDcyfTsKK1VDSEFSICAgV01FX0lORk9fRUxFTVtdICA9IHsweDAwLCAweDUwLCAweGYyLCAweDAyLCAweDAwLCAweDAxfTsKK1VDSEFSICAgV01FX1BBUk1fRUxFTVtdID0gezB4MDAsIDB4NTAsIDB4ZjIsIDB4MDIsIDB4MDEsIDB4MDF9OworVUNIQVIJQ2N4MlFvc0luZm9bXSA9IHsweDAwLCAweDQwLCAweDk2LCAweDA0fTsKK1VDSEFSICAgUkFMSU5LX09VSVtdICA9IHsweDAwLCAweDBjLCAweDQzfTsKK1VDSEFSICAgQlJPQURDT01fT1VJW10gID0gezB4MDAsIDB4OTAsIDB4NGN9OworVUNIQVIgICBXUFNfT1VJW10gPSB7MHgwMCwgMHg1MCwgMHhmMiwgMHgwNH07CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCitVQ0hBUglQUkVfTl9IVF9PVUlbXQk9IHsweDAwLCAweDkwLCAweDRjfTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworVUNIQVIgUmF0ZVN3aXRjaFRhYmxlW10gPSB7CisvLyBJdGVtIE5vLiAgIE1vZGUgICBDdXJyLU1DUyAgIFRyYWluVXAgICBUcmFpbkRvd24JCS8vIE1vZGUtIEJpdDA6IFNUQkMsIEJpdDE6IFNob3J0IEdJLCBCaXQ0LDU6IE1vZGUoMDpDQ0ssIDE6T0ZETSwgMjpIVCBNaXgsIDM6SFQgR0YpCisgICAgMHgxMSwgMHgwMCwgIDAsICAwLCAgMCwJCQkJCQkvLyBJbml0aWFsIHVzZWQgaXRlbSBhZnRlciBhc3NvY2lhdGlvbgorICAgIDB4MDAsIDB4MDAsICAwLCA0MCwgMTAxLAorICAgIDB4MDEsIDB4MDAsICAxLCA0MCwgNTAsCisgICAgMHgwMiwgMHgwMCwgIDIsIDM1LCA0NSwKKyAgICAweDAzLCAweDAwLCAgMywgMjAsIDQ1LAorICAgIDB4MDQsIDB4MjEsICAwLCAzMCwgNTAsCisgICAgMHgwNSwgMHgyMSwgIDEsIDIwLCA1MCwKKyAgICAweDA2LCAweDIxLCAgMiwgMjAsIDUwLAorICAgIDB4MDcsIDB4MjEsICAzLCAxNSwgNTAsCisgICAgMHgwOCwgMHgyMSwgIDQsIDE1LCAzMCwKKyAgICAweDA5LCAweDIxLCAgNSwgMTAsIDI1LAorICAgIDB4MGEsIDB4MjEsICA2LCAgOCwgMjUsCisgICAgMHgwYiwgMHgyMSwgIDcsICA4LCAyNSwKKyAgICAweDBjLCAweDIwLCAxMiwgIDE1LCAzMCwKKyAgICAweDBkLCAweDIwLCAxMywgIDgsIDIwLAorICAgIDB4MGUsIDB4MjAsIDE0LCAgOCwgMjAsCisgICAgMHgwZiwgMHgyMCwgMTUsICA4LCAyNSwKKyAgICAweDEwLCAweDIyLCAxNSwgIDgsIDI1LAorICAgIDB4MTEsIDB4MDAsICAwLCAgMCwgIDAsCisgICAgMHgxMiwgMHgwMCwgIDAsICAwLCAgMCwKKyAgICAweDEzLCAweDAwLCAgMCwgIDAsICAwLAorICAgIDB4MTQsIDB4MDAsICAwLCAgMCwgIDAsCisgICAgMHgxNSwgMHgwMCwgIDAsICAwLCAgMCwKKyAgICAweDE2LCAweDAwLCAgMCwgIDAsICAwLAorICAgIDB4MTcsIDB4MDAsICAwLCAgMCwgIDAsCisgICAgMHgxOCwgMHgwMCwgIDAsICAwLCAgMCwKKyAgICAweDE5LCAweDAwLCAgMCwgIDAsICAwLAorICAgIDB4MWEsIDB4MDAsICAwLCAgMCwgIDAsCisgICAgMHgxYiwgMHgwMCwgIDAsICAwLCAgMCwKKyAgICAweDFjLCAweDAwLCAgMCwgIDAsICAwLAorICAgIDB4MWQsIDB4MDAsICAwLCAgMCwgIDAsCisgICAgMHgxZSwgMHgwMCwgIDAsICAwLCAgMCwKKyAgICAweDFmLCAweDAwLCAgMCwgIDAsICAwLAorfTsKKworVUNIQVIgUmF0ZVN3aXRjaFRhYmxlMTFCW10gPSB7CisvLyBJdGVtIE5vLiAgIE1vZGUgICBDdXJyLU1DUyAgIFRyYWluVXAgICBUcmFpbkRvd24JCS8vIE1vZGUtIEJpdDA6IFNUQkMsIEJpdDE6IFNob3J0IEdJLCBCaXQ0LDU6IE1vZGUoMDpDQ0ssIDE6T0ZETSwgMjpIVCBNaXgsIDM6SFQgR0YpCisgICAgMHgwNCwgMHgwMywgIDAsICAwLCAgMCwJCQkJCQkvLyBJbml0aWFsIHVzZWQgaXRlbSBhZnRlciBhc3NvY2lhdGlvbgorICAgIDB4MDAsIDB4MDAsICAwLCA0MCwgMTAxLAorICAgIDB4MDEsIDB4MDAsICAxLCA0MCwgNTAsCisgICAgMHgwMiwgMHgwMCwgIDIsIDM1LCA0NSwKKyAgICAweDAzLCAweDAwLCAgMywgMjAsIDQ1LAorfTsKKworVUNIQVIgUmF0ZVN3aXRjaFRhYmxlMTFCR1tdID0geworLy8gSXRlbSBOby4gICBNb2RlICAgQ3Vyci1NQ1MgICBUcmFpblVwICAgVHJhaW5Eb3duCQkvLyBNb2RlLSBCaXQwOiBTVEJDLCBCaXQxOiBTaG9ydCBHSSwgQml0NCw1OiBNb2RlKDA6Q0NLLCAxOk9GRE0sIDI6SFQgTWl4LCAzOkhUIEdGKQorICAgIDB4MGEsIDB4MDAsICAwLCAgMCwgIDAsCQkJCQkJLy8gSW5pdGlhbCB1c2VkIGl0ZW0gYWZ0ZXIgYXNzb2NpYXRpb24KKyAgICAweDAwLCAweDAwLCAgMCwgNDAsIDEwMSwKKyAgICAweDAxLCAweDAwLCAgMSwgNDAsIDUwLAorICAgIDB4MDIsIDB4MDAsICAyLCAzNSwgNDUsCisgICAgMHgwMywgMHgwMCwgIDMsIDIwLCA0NSwKKyAgICAweDA0LCAweDEwLCAgMiwgMjAsIDM1LAorICAgIDB4MDUsIDB4MTAsICAzLCAxNiwgMzUsCisgICAgMHgwNiwgMHgxMCwgIDQsIDEwLCAyNSwKKyAgICAweDA3LCAweDEwLCAgNSwgMTYsIDI1LAorICAgIDB4MDgsIDB4MTAsICA2LCAxMCwgMjUsCisgICAgMHgwOSwgMHgxMCwgIDcsIDEwLCAxMywKK307CisKK1VDSEFSIFJhdGVTd2l0Y2hUYWJsZTExR1tdID0geworLy8gSXRlbSBOby4gICBNb2RlICAgQ3Vyci1NQ1MgICBUcmFpblVwICAgVHJhaW5Eb3duCQkvLyBNb2RlLSBCaXQwOiBTVEJDLCBCaXQxOiBTaG9ydCBHSSwgQml0NCw1OiBNb2RlKDA6Q0NLLCAxOk9GRE0sIDI6SFQgTWl4LCAzOkhUIEdGKQorICAgIDB4MDgsIDB4MDAsICAwLCAgMCwgIDAsCQkJCQkJLy8gSW5pdGlhbCB1c2VkIGl0ZW0gYWZ0ZXIgYXNzb2NpYXRpb24KKyAgICAweDAwLCAweDEwLCAgMCwgMjAsIDEwMSwKKyAgICAweDAxLCAweDEwLCAgMSwgMjAsIDM1LAorICAgIDB4MDIsIDB4MTAsICAyLCAyMCwgMzUsCisgICAgMHgwMywgMHgxMCwgIDMsIDE2LCAzNSwKKyAgICAweDA0LCAweDEwLCAgNCwgMTAsIDI1LAorICAgIDB4MDUsIDB4MTAsICA1LCAxNiwgMjUsCisgICAgMHgwNiwgMHgxMCwgIDYsIDEwLCAyNSwKKyAgICAweDA3LCAweDEwLCAgNywgMTAsIDEzLAorfTsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorVUNIQVIgUmF0ZVN3aXRjaFRhYmxlMTFOMVNbXSA9IHsKKy8vIEl0ZW0gTm8uICAgTW9kZSAgIEN1cnItTUNTICAgVHJhaW5VcCAgIFRyYWluRG93bgkJLy8gTW9kZS0gQml0MDogU1RCQywgQml0MTogU2hvcnQgR0ksIEJpdDQsNTogTW9kZSgwOkNDSywgMTpPRkRNLCAyOkhUIE1peCwgMzpIVCBHRikKKyAgICAweDA5LCAweDAwLCAgMCwgIDAsICAwLAkJCQkJCS8vIEluaXRpYWwgdXNlZCBpdGVtIGFmdGVyIGFzc29jaWF0aW9uCisgICAgMHgwMCwgMHgyMSwgIDAsIDMwLCAxMDEsCisgICAgMHgwMSwgMHgyMSwgIDEsIDIwLCA1MCwKKyAgICAweDAyLCAweDIxLCAgMiwgMjAsIDUwLAorICAgIDB4MDMsIDB4MjEsICAzLCAxNSwgNTAsCisgICAgMHgwNCwgMHgyMSwgIDQsIDE1LCAzMCwKKyAgICAweDA1LCAweDIxLCAgNSwgMTAsIDI1LAorICAgIDB4MDYsIDB4MjEsICA2LCAgOCwgMTQsCisgICAgMHgwNywgMHgyMSwgIDcsICA4LCAxNCwKKyAgICAweDA4LCAweDIzLCAgNywgIDgsIDE0LAorfTsKKworVUNIQVIgUmF0ZVN3aXRjaFRhYmxlMTFOMlNbXSA9IHsKKy8vIEl0ZW0gTm8uICAgTW9kZSAgIEN1cnItTUNTICAgVHJhaW5VcCAgIFRyYWluRG93bgkJLy8gTW9kZS0gQml0MDogU1RCQywgQml0MTogU2hvcnQgR0ksIEJpdDQsNTogTW9kZSgwOkNDSywgMTpPRkRNLCAyOkhUIE1peCwgMzpIVCBHRikKKyAgICAweDBhLCAweDAwLCAgMCwgIDAsICAwLCAgICAgIC8vIEluaXRpYWwgdXNlZCBpdGVtIGFmdGVyIGFzc29jaWF0aW9uCisgICAgMHgwMCwgMHgyMSwgIDAsIDMwLCAxMDEsCisgICAgMHgwMSwgMHgyMSwgIDEsIDIwLCA1MCwKKyAgICAweDAyLCAweDIxLCAgMiwgMjAsIDUwLAorICAgIDB4MDMsIDB4MjEsICAzLCAxNSwgNTAsCisgICAgMHgwNCwgMHgyMSwgIDQsIDE1LCAzMCwKKyAgICAweDA1LCAweDIwLCAxMiwgIDE1LCAzMCwKKyAgICAweDA2LCAweDIwLCAxMywgIDgsIDIwLAorICAgIDB4MDcsIDB4MjAsIDE0LCAgOCwgMjAsCisgICAgMHgwOCwgMHgyMCwgMTUsICA4LCAyNSwKKyAgICAweDA5LCAweDIyLCAxNSwgIDgsIDI1LAorfTsKKworVUNIQVIgUmF0ZVN3aXRjaFRhYmxlMTFOM1NbXSA9IHsKKy8vIEl0ZW0gTm8uCU1vZGUJQ3Vyci1NQ1MJVHJhaW5VcAlUcmFpbkRvd24JLy8gTW9kZS0gQml0MDogU1RCQywgQml0MTogU2hvcnQgR0ksIEJpdDQsNTogTW9kZSgwOkNDSywgMTpPRkRNLCAyOkhUIE1peCwgMzpIVCBHRikKKyAgICAweDBhLCAweDAwLCAgMCwgIDAsICAwLCAgICAgIC8vIEluaXRpYWwgdXNlZCBpdGVtIGFmdGVyIGFzc29jaWF0aW9uCisgICAgMHgwMCwgMHgyMSwgIDAsIDMwLCAxMDEsCisgICAgMHgwMSwgMHgyMSwgIDEsIDIwLCA1MCwKKyAgICAweDAyLCAweDIxLCAgMiwgMjAsIDUwLAorICAgIDB4MDMsIDB4MjEsICAzLCAxNSwgNTAsCisgICAgMHgwNCwgMHgyMSwgIDQsIDE1LCAzMCwKKyAgICAweDA1LCAweDIwLCAxMiwgIDE1LCAzMCwKKyAgICAweDA2LCAweDIwLCAxMywgIDgsIDIwLAorICAgIDB4MDcsIDB4MjAsIDE0LCAgOCwgMjAsCisgICAgMHgwOCwgMHgyMCwgMTUsICA4LCAyNSwKKyAgICAweDA5LCAweDIyLCAxNSwgIDgsIDI1LAorfTsKKworVUNIQVIgUmF0ZVN3aXRjaFRhYmxlMTFOMlNGb3JBQmFuZFtdID0geworLy8gSXRlbSBOby4gICBNb2RlICAgQ3Vyci1NQ1MgICBUcmFpblVwICAgVHJhaW5Eb3duCQkvLyBNb2RlLSBCaXQwOiBTVEJDLCBCaXQxOiBTaG9ydCBHSSwgQml0NCw1OiBNb2RlKDA6Q0NLLCAxOk9GRE0sIDI6SFQgTWl4LCAzOkhUIEdGKQorICAgIDB4MGIsIDB4MDksICAwLCAgMCwgIDAsCQkJCQkJLy8gSW5pdGlhbCB1c2VkIGl0ZW0gYWZ0ZXIgYXNzb2NpYXRpb24KKyAgICAweDAwLCAweDIxLCAgMCwgMzAsIDEwMSwKKyAgICAweDAxLCAweDIxLCAgMSwgMjAsIDUwLAorICAgIDB4MDIsIDB4MjEsICAyLCAyMCwgNTAsCisgICAgMHgwMywgMHgyMSwgIDMsIDE1LCA1MCwKKyAgICAweDA0LCAweDIxLCAgNCwgMTUsIDMwLAorICAgIDB4MDUsIDB4MjEsICA1LCAxNSwgMzAsCisgICAgMHgwNiwgMHgyMCwgMTIsICAxNSwgMzAsCisgICAgMHgwNywgMHgyMCwgMTMsICA4LCAyMCwKKyAgICAweDA4LCAweDIwLCAxNCwgIDgsIDIwLAorICAgIDB4MDksIDB4MjAsIDE1LCAgOCwgMjUsCisgICAgMHgwYSwgMHgyMiwgMTUsICA4LCAyNSwKK307CisKK1VDSEFSIFJhdGVTd2l0Y2hUYWJsZTExTjNTRm9yQUJhbmRbXSA9IHsgLy8gMyozCisvLyBJdGVtIE5vLiAgIE1vZGUgICBDdXJyLU1DUyAgIFRyYWluVXAgICBUcmFpbkRvd24JCS8vIE1vZGUtIEJpdDA6IFNUQkMsIEJpdDE6IFNob3J0IEdJLCBCaXQ0LDU6IE1vZGUoMDpDQ0ssIDE6T0ZETSwgMjpIVCBNaXgsIDM6SFQgR0YpCisgICAgMHgwYiwgMHgwOSwgIDAsICAwLCAgMCwJCQkJCQkvLyBJbml0aWFsIHVzZWQgaXRlbSBhZnRlciBhc3NvY2lhdGlvbgorICAgIDB4MDAsIDB4MjEsICAwLCAzMCwgMTAxLAorICAgIDB4MDEsIDB4MjEsICAxLCAyMCwgNTAsCisgICAgMHgwMiwgMHgyMSwgIDIsIDIwLCA1MCwKKyAgICAweDAzLCAweDIxLCAgMywgMTUsIDUwLAorICAgIDB4MDQsIDB4MjEsICA0LCAxNSwgMzAsCisgICAgMHgwNSwgMHgyMSwgIDUsIDE1LCAzMCwKKyAgICAweDA2LCAweDIwLCAxMiwgIDE1LCAzMCwKKyAgICAweDA3LCAweDIwLCAxMywgIDgsIDIwLAorICAgIDB4MDgsIDB4MjAsIDE0LCAgOCwgMjAsCisgICAgMHgwOSwgMHgyMCwgMTUsICA4LCAyNSwKKyAgICAweDBhLCAweDIyLCAxNSwgIDgsIDI1LAorfTsKKworVUNIQVIgUmF0ZVN3aXRjaFRhYmxlMTFCR04xU1tdID0geworLy8gSXRlbSBOby4gICBNb2RlICAgQ3Vyci1NQ1MgICBUcmFpblVwICAgVHJhaW5Eb3duCQkvLyBNb2RlLSBCaXQwOiBTVEJDLCBCaXQxOiBTaG9ydCBHSSwgQml0NCw1OiBNb2RlKDA6Q0NLLCAxOk9GRE0sIDI6SFQgTWl4LCAzOkhUIEdGKQorICAgIDB4MGQsIDB4MDAsICAwLCAgMCwgIDAsCQkJCQkJLy8gSW5pdGlhbCB1c2VkIGl0ZW0gYWZ0ZXIgYXNzb2NpYXRpb24KKyAgICAweDAwLCAweDAwLCAgMCwgNDAsIDEwMSwKKyAgICAweDAxLCAweDAwLCAgMSwgNDAsIDUwLAorICAgIDB4MDIsIDB4MDAsICAyLCAzNSwgNDUsCisgICAgMHgwMywgMHgwMCwgIDMsIDIwLCA0NSwKKyAgICAweDA0LCAweDIxLCAgMCwgMzAsMTAxLAkvLzUwCisgICAgMHgwNSwgMHgyMSwgIDEsIDIwLCA1MCwKKyAgICAweDA2LCAweDIxLCAgMiwgMjAsIDUwLAorICAgIDB4MDcsIDB4MjEsICAzLCAxNSwgNTAsCisgICAgMHgwOCwgMHgyMSwgIDQsIDE1LCAzMCwKKyAgICAweDA5LCAweDIxLCAgNSwgMTAsIDI1LAorICAgIDB4MGEsIDB4MjEsICA2LCAgOCwgMTQsCisgICAgMHgwYiwgMHgyMSwgIDcsICA4LCAxNCwKKwkweDBjLCAweDIzLCAgNywgIDgsIDE0LAorfTsKKworVUNIQVIgUmF0ZVN3aXRjaFRhYmxlMTFCR04yU1tdID0geworLy8gSXRlbSBOby4gICBNb2RlICAgQ3Vyci1NQ1MgICBUcmFpblVwICAgVHJhaW5Eb3duCQkvLyBNb2RlLSBCaXQwOiBTVEJDLCBCaXQxOiBTaG9ydCBHSSwgQml0NCw1OiBNb2RlKDA6Q0NLLCAxOk9GRE0sIDI6SFQgTWl4LCAzOkhUIEdGKQorICAgIDB4MGEsIDB4MDAsICAwLCAgMCwgIDAsCQkJCQkJLy8gSW5pdGlhbCB1c2VkIGl0ZW0gYWZ0ZXIgYXNzb2NpYXRpb24KKyAgICAweDAwLCAweDIxLCAgMCwgMzAsMTAxLAkvLzUwCisgICAgMHgwMSwgMHgyMSwgIDEsIDIwLCA1MCwKKyAgICAweDAyLCAweDIxLCAgMiwgMjAsIDUwLAorICAgIDB4MDMsIDB4MjEsICAzLCAxNSwgNTAsCisgICAgMHgwNCwgMHgyMSwgIDQsIDE1LCAzMCwKKyAgICAweDA1LCAweDIwLCAxMiwgMTUsIDMwLAorICAgIDB4MDYsIDB4MjAsIDEzLCAgOCwgMjAsCisgICAgMHgwNywgMHgyMCwgMTQsICA4LCAyMCwKKyAgICAweDA4LCAweDIwLCAxNSwgIDgsIDI1LAorICAgIDB4MDksIDB4MjIsIDE1LCAgOCwgMjUsCit9OworCitVQ0hBUiBSYXRlU3dpdGNoVGFibGUxMUJHTjNTW10gPSB7IC8vIDMqMworLy8gSXRlbSBOby4gICBNb2RlICAgQ3Vyci1NQ1MgICBUcmFpblVwICAgVHJhaW5Eb3duCQkvLyBNb2RlLSBCaXQwOiBTVEJDLCBCaXQxOiBTaG9ydCBHSSwgQml0NCw1OiBNb2RlKDA6Q0NLLCAxOk9GRE0sIDI6SFQgTWl4LCAzOkhUIEdGKQorICAgIDB4MGEsIDB4MDAsICAwLCAgMCwgIDAsCQkJCQkJLy8gSW5pdGlhbCB1c2VkIGl0ZW0gYWZ0ZXIgYXNzb2NpYXRpb24KKyAgICAweDAwLCAweDIxLCAgMCwgMzAsMTAxLAkvLzUwCisgICAgMHgwMSwgMHgyMSwgIDEsIDIwLCA1MCwKKyAgICAweDAyLCAweDIxLCAgMiwgMjAsIDUwLAorICAgIDB4MDMsIDB4MjEsICAzLCAyMCwgNTAsCisgICAgMHgwNCwgMHgyMSwgIDQsIDE1LCA1MCwKKyNpZiAxCisgICAgMHgwNSwgMHgyMCwgMjAsIDE1LCAzMCwKKyAgICAweDA2LCAweDIwLCAyMSwgIDgsIDIwLAorICAgIDB4MDcsIDB4MjAsIDIyLCAgOCwgMjAsCisgICAgMHgwOCwgMHgyMCwgMjMsICA4LCAyNSwKKyAgICAweDA5LCAweDIyLCAyMywgIDgsIDI1LAorI2Vsc2UgLy8gZm9yIFJUMjg2MCAyKjMgdGVzdAorICAgIDB4MDUsIDB4MjAsIDEyLCAxNSwgMzAsCisgICAgMHgwNiwgMHgyMCwgMTMsICA4LCAyMCwKKyAgICAweDA3LCAweDIwLCAxNCwgIDgsIDIwLAorICAgIDB4MDgsIDB4MjAsIDE1LCAgOCwgMjUsCisgICAgMHgwOSwgMHgyMiwgMTUsICA4LCAyNSwKKyNlbmRpZgorfTsKKworVUNIQVIgUmF0ZVN3aXRjaFRhYmxlMTFCR04yU0ZvckFCYW5kW10gPSB7CisvLyBJdGVtIE5vLiAgIE1vZGUgICBDdXJyLU1DUyAgIFRyYWluVXAgICBUcmFpbkRvd24JCS8vIE1vZGUtIEJpdDA6IFNUQkMsIEJpdDE6IFNob3J0IEdJLCBCaXQ0LDU6IE1vZGUoMDpDQ0ssIDE6T0ZETSwgMjpIVCBNaXgsIDM6SFQgR0YpCisgICAgMHgwYiwgMHgwOSwgIDAsICAwLCAgMCwJCQkJCQkvLyBJbml0aWFsIHVzZWQgaXRlbSBhZnRlciBhc3NvY2lhdGlvbgorICAgIDB4MDAsIDB4MjEsICAwLCAzMCwxMDEsCS8vNTAKKyAgICAweDAxLCAweDIxLCAgMSwgMjAsIDUwLAorICAgIDB4MDIsIDB4MjEsICAyLCAyMCwgNTAsCisgICAgMHgwMywgMHgyMSwgIDMsIDE1LCA1MCwKKyAgICAweDA0LCAweDIxLCAgNCwgMTUsIDMwLAorICAgIDB4MDUsIDB4MjEsICA1LCAxNSwgMzAsCisgICAgMHgwNiwgMHgyMCwgMTIsIDE1LCAzMCwKKyAgICAweDA3LCAweDIwLCAxMywgIDgsIDIwLAorICAgIDB4MDgsIDB4MjAsIDE0LCAgOCwgMjAsCisgICAgMHgwOSwgMHgyMCwgMTUsICA4LCAyNSwKKyAgICAweDBhLCAweDIyLCAxNSwgIDgsIDI1LAorfTsKKworVUNIQVIgUmF0ZVN3aXRjaFRhYmxlMTFCR04zU0ZvckFCYW5kW10gPSB7IC8vIDMqMworLy8gSXRlbSBOby4gICBNb2RlICAgQ3Vyci1NQ1MgICBUcmFpblVwICAgVHJhaW5Eb3duCQkvLyBNb2RlLSBCaXQwOiBTVEJDLCBCaXQxOiBTaG9ydCBHSSwgQml0NCw1OiBNb2RlKDA6Q0NLLCAxOk9GRE0sIDI6SFQgTWl4LCAzOkhUIEdGKQorICAgIDB4MGMsIDB4MDksICAwLCAgMCwgIDAsCQkJCQkJLy8gSW5pdGlhbCB1c2VkIGl0ZW0gYWZ0ZXIgYXNzb2NpYXRpb24KKyAgICAweDAwLCAweDIxLCAgMCwgMzAsMTAxLAkvLzUwCisgICAgMHgwMSwgMHgyMSwgIDEsIDIwLCA1MCwKKyAgICAweDAyLCAweDIxLCAgMiwgMjAsIDUwLAorICAgIDB4MDMsIDB4MjEsICAzLCAxNSwgNTAsCisgICAgMHgwNCwgMHgyMSwgIDQsIDE1LCAzMCwKKyAgICAweDA1LCAweDIxLCAgNSwgMTUsIDMwLAorICAgIDB4MDYsIDB4MjEsIDEyLCAxNSwgMzAsCisgICAgMHgwNywgMHgyMCwgMjAsIDE1LCAzMCwKKyAgICAweDA4LCAweDIwLCAyMSwgIDgsIDIwLAorICAgIDB4MDksIDB4MjAsIDIyLCAgOCwgMjAsCisgICAgMHgwYSwgMHgyMCwgMjMsICA4LCAyNSwKKyAgICAweDBiLCAweDIyLCAyMywgIDgsIDI1LAorfTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworUFVDSEFSIFJlYXNvblN0cmluZ1tdID0geworCS8qIDAgICovCSAiUmVzZXJ2ZWQiLAorCS8qIDEgICovCSAiVW5zcGVjaWZpZWQgUmVhc29uIiwKKwkvKiAyICAqLwkgIlByZXZpb3VzIEF1dGggbm8gbG9uZ2VyIHZhbGlkIiwKKwkvKiAzICAqLwkgIlNUQSBpcyBsZWF2aW5nIC8gaGFzIGxlZnQiLAorCS8qIDQgICovCSAiRElTLUFTU09DIGR1ZSB0byBpbmFjdGl2aXR5IiwKKwkvKiA1ICAqLwkgIkFQIHVuYWJsZSB0byBoYW5sZSBhbGwgYXNzb2NpYXRpb25zIiwKKwkvKiA2ICAqLwkgImNsYXNzIDIgZXJyb3IiLAorCS8qIDcgICovCSAiY2xhc3MgMyBlcnJvciIsCisJLyogOCAgKi8JICJTVEEgaXMgbGVhdmluZyAvIGhhcyBsZWZ0IiwKKwkvKiA5ICAqLwkgInJlcXVpcmUgYXV0aCBiZWZvcmUgYXNzb2MvcmUtYXNzb2MiLAorCS8qIDEwICovCSAiUmVzZXJ2ZWQiLAorCS8qIDExICovCSAiUmVzZXJ2ZWQiLAorCS8qIDEyICovCSAiUmVzZXJ2ZWQiLAorCS8qIDEzICovCSAiaW52YWxpZCBJRSIsCisJLyogMTQgKi8JICJNSUMgZXJyb3IiLAorCS8qIDE1ICovCSAiNC13YXkgaGFuZHNoYWtlIHRpbWVvdXQiLAorCS8qIDE2ICovCSAiMi13YXkgKGdyb3VwIGtleSkgaGFuZHNoYWtlIHRpbWVvdXQiLAorCS8qIDE3ICovCSAiNC13YXkgaGFuZHNoYWtlIElFIGRpZmYgYW1vbmcgQXNzb3NSZXEvUnNwL0JlYWNvbiIsCisJLyogMTggKi8KK307CisKK2V4dGVybiBVQ0hBUgkgT2ZkbVJhdGVUb1J4d2lNQ1NbXTsKKy8vIHNpbmNlIFJUNjEgaGFzIGJldHRlciBSWCBzZW5zaWJpbGl0eSwgd2UgaGF2ZSB0byBsaW1pdCBUWCBBQ0sgcmF0ZSBub3QgdG8gZXhjZWVkIG91ciBub3JtYWwgZGF0YSBUWCByYXRlLgorLy8gb3RoZXJ3aXNlIHRoZSBXTEFOIHBlZXIgbWF5IG5vdCBiZSBhYmxlIHRvIHJlY2VpdmUgdGhlIEFDSyB0aHVzIGRvd25ncmFkZSBpdHMgZGF0YSBUWCByYXRlCitVTE9ORyBCYXNpY1JhdGVNYXNrWzEyXQkJCQk9IHsweGZmZmZmMDAxIC8qIDEtTWJwcyAqLywgMHhmZmZmZjAwMyAvKiAyIE1icHMgKi8sIDB4ZmZmZmYwMDcgLyogNS41ICovLCAweGZmZmZmMDBmIC8qIDExICovLAorCQkJCQkJCQkJICAweGZmZmZmMDFmIC8qIDYgKi8JICwgMHhmZmZmZjAzZiAvKiA5ICovCSAgLCAweGZmZmZmMDdmIC8qIDEyICovICwgMHhmZmZmZjBmZiAvKiAxOCAqLywKKwkJCQkJCQkJCSAgMHhmZmZmZjFmZiAvKiAyNCAqLwkgLCAweGZmZmZmM2ZmIC8qIDM2ICovCSAgLCAweGZmZmZmN2ZmIC8qIDQ4ICovICwgMHhmZmZmZmZmZiAvKiA1NCAqL307CisKK1VDSEFSIE1VTFRJQ0FTVF9BRERSW01BQ19BRERSX0xFTl0gPSB7MHgxLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH07CitVQ0hBUiBCUk9BRENBU1RfQUREUltNQUNfQUREUl9MRU5dID0gezB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmZ9OworVUNIQVIgWkVST19NQUNfQUREUltNQUNfQUREUl9MRU5dICA9IHsweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwfTsKKworLy8gZS5nLiBSc3NpU2FmZUxldmVsRm9yVHhSYXRlW1JBVEVfMzZdIiBtZWFucyBpZiB0aGUgY3VycmVudCBSU1NJIGlzIGdyZWF0ZXIgdGhhbgorLy8JCXRoaXMgdmFsdWUsIHRoZW4gaXQncyBxdWFyYW50ZWVkIGNhcGFibGUgb2Ygb3BlcmF0aW5nIGluIDM2IG1icHMgVFggcmF0ZSBpbgorLy8JCWNsZWFuIGVudmlyb25tZW50LgorLy8JCQkJCQkJCSAgVHhSYXRlOiAxICAgMiAgIDUuNQkxMQkgNgkgIDkgICAgMTIJMTgJIDI0ICAgMzYgICA0OAk1NAkgNzIgIDEwMAorQ0hBUiBSc3NpU2FmZUxldmVsRm9yVHhSYXRlW10gPXsgIC05MiwgLTkxLCAtOTAsIC04NywgLTg4LCAtODYsIC04NSwgLTgzLCAtODEsIC03OCwgLTcyLCAtNzEsIC00MCwgLTQwIH07CisKK1VDSEFSICBSYXRlSWRUb01icHNbXQkgPSB7IDEsIDIsIDUsIDExLCA2LCA5LCAxMiwgMTgsIDI0LCAzNiwgNDgsIDU0LCA3MiwgMTAwfTsKK1VTSE9SVCBSYXRlSWRUbzUwMEticHNbXSA9IHsgMiwgNCwgMTEsIDIyLCAxMiwgMTgsIDI0LCAzNiwgNDgsIDcyLCA5NiwgMTA4LCAxNDQsIDIwMH07CisKK1VDSEFSICBTc2lkSWUJID0gSUVfU1NJRDsKK1VDSEFSICBTdXBSYXRlSWUgPSBJRV9TVVBQX1JBVEVTOworVUNIQVIgIEV4dFJhdGVJZSA9IElFX0VYVF9TVVBQX1JBVEVTOworI2lmZGVmIERPVDExX05fU1VQUE9SVAorVUNIQVIgIEh0Q2FwSWUgPSBJRV9IVF9DQVA7CitVQ0hBUiAgQWRkSHRJbmZvSWUgPSBJRV9BRERfSFQ7CitVQ0hBUiAgTmV3RXh0Q2hhbkllID0gSUVfU0VDT05EQVJZX0NIX09GRlNFVDsKKyNpZmRlZiBET1QxMU5fRFJBRlQzCitVQ0hBUiAgRXh0SHRDYXBJZSA9IElFX0VYVF9DQVBBQklMSVRZOworI2VuZGlmIC8vIERPVDExTl9EUkFGVDMgLy8KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KK1VDSEFSICBFcnBJZQkgPSBJRV9FUlA7CitVQ0hBUiAgRHNJZSAJID0gSUVfRFNfUEFSTTsKK1VDSEFSICBUaW1JZQkgPSBJRV9USU07CitVQ0hBUiAgV3BhSWUJID0gSUVfV1BBOworVUNIQVIgIFdwYTJJZQkgPSBJRV9XUEEyOworVUNIQVIgIElic3NJZQkgPSBJRV9JQlNTX1BBUk07CitVQ0hBUiAgQ2N4MkllCSA9IElFX0NDWF9WMjsKK1VDSEFSICBXYXBpSWUJID0gSUVfV0FQSTsKKworZXh0ZXJuIFVDSEFSCVdQQV9PVUlbXTsKKworVUNIQVIJU0VTX09VSVtdID0gezB4MDAsIDB4OTAsIDB4NGN9OworCitVQ0hBUglaZXJvU3NpZFszMl0gPSB7MHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwfTsKKworLy8gUmVzZXQgdGhlIFJGSUMgc2V0dGluZyB0byBuZXcgc2VyaWVzCitSVE1QX1JGX1JFR1MgUkYyODUwUmVnVGFibGVbXSA9IHsKKy8vCQljaAkgUjEgCQkgUjIgCQkgUjMoVFgwfjQ9MCkgUjQKKwkJezEsICAweDk4NDAyZWNjLCAweDk4NGMwNzg2LCAweDk4MTZiNDU1LCAweDk4MDA1MTBifSwKKwkJezIsICAweDk4NDAyZWNjLCAweDk4NGMwNzg2LCAweDk4MTY4YTU1LCAweDk4MDA1MTlmfSwKKwkJezMsICAweDk4NDAyZWNjLCAweDk4NGMwNzhhLCAweDk4MTY4YTU1LCAweDk4MDA1MThifSwKKwkJezQsICAweDk4NDAyZWNjLCAweDk4NGMwNzhhLCAweDk4MTY4YTU1LCAweDk4MDA1MTlmfSwKKwkJezUsICAweDk4NDAyZWNjLCAweDk4NGMwNzhlLCAweDk4MTY4YTU1LCAweDk4MDA1MThifSwKKwkJezYsICAweDk4NDAyZWNjLCAweDk4NGMwNzhlLCAweDk4MTY4YTU1LCAweDk4MDA1MTlmfSwKKwkJezcsICAweDk4NDAyZWNjLCAweDk4NGMwNzkyLCAweDk4MTY4YTU1LCAweDk4MDA1MThifSwKKwkJezgsICAweDk4NDAyZWNjLCAweDk4NGMwNzkyLCAweDk4MTY4YTU1LCAweDk4MDA1MTlmfSwKKwkJezksICAweDk4NDAyZWNjLCAweDk4NGMwNzk2LCAweDk4MTY4YTU1LCAweDk4MDA1MThifSwKKwkJezEwLCAweDk4NDAyZWNjLCAweDk4NGMwNzk2LCAweDk4MTY4YTU1LCAweDk4MDA1MTlmfSwKKwkJezExLCAweDk4NDAyZWNjLCAweDk4NGMwNzlhLCAweDk4MTY4YTU1LCAweDk4MDA1MThifSwKKwkJezEyLCAweDk4NDAyZWNjLCAweDk4NGMwNzlhLCAweDk4MTY4YTU1LCAweDk4MDA1MTlmfSwKKwkJezEzLCAweDk4NDAyZWNjLCAweDk4NGMwNzllLCAweDk4MTY4YTU1LCAweDk4MDA1MThifSwKKwkJezE0LCAweDk4NDAyZWNjLCAweDk4NGMwN2EyLCAweDk4MTY4YTU1LCAweDk4MDA1MTkzfSwKKworCQkvLyA4MDIuMTEgVU5JIC8gSHlwZXJMYW4gMgorCQl7MzYsIDB4OTg0MDJlY2MsIDB4OTg0YzA5OWEsIDB4OTgxNThhNTUsIDB4OTgwZWQxYTN9LAorCQl7MzgsIDB4OTg0MDJlY2MsIDB4OTg0YzA5OWUsIDB4OTgxNThhNTUsIDB4OTgwZWQxOTN9LAorCQl7NDAsIDB4OTg0MDJlYzgsIDB4OTg0YzA2ODIsIDB4OTgxNThhNTUsIDB4OTgwZWQxODN9LAorCQl7NDQsIDB4OTg0MDJlYzgsIDB4OTg0YzA2ODIsIDB4OTgxNThhNTUsIDB4OTgwZWQxYTN9LAorCQl7NDYsIDB4OTg0MDJlYzgsIDB4OTg0YzA2ODYsIDB4OTgxNThhNTUsIDB4OTgwZWQxOGJ9LAorCQl7NDgsIDB4OTg0MDJlYzgsIDB4OTg0YzA2ODYsIDB4OTgxNThhNTUsIDB4OTgwZWQxOWJ9LAorCQl7NTIsIDB4OTg0MDJlYzgsIDB4OTg0YzA2OGEsIDB4OTgxNThhNTUsIDB4OTgwZWQxOTN9LAorCQl7NTQsIDB4OTg0MDJlYzgsIDB4OTg0YzA2OGEsIDB4OTgxNThhNTUsIDB4OTgwZWQxYTN9LAorCQl7NTYsIDB4OTg0MDJlYzgsIDB4OTg0YzA2OGUsIDB4OTgxNThhNTUsIDB4OTgwZWQxOGJ9LAorCQl7NjAsIDB4OTg0MDJlYzgsIDB4OTg0YzA2OTIsIDB4OTgxNThhNTUsIDB4OTgwZWQxODN9LAorCQl7NjIsIDB4OTg0MDJlYzgsIDB4OTg0YzA2OTIsIDB4OTgxNThhNTUsIDB4OTgwZWQxOTN9LAorCQl7NjQsIDB4OTg0MDJlYzgsIDB4OTg0YzA2OTIsIDB4OTgxNThhNTUsIDB4OTgwZWQxYTN9LCAvLyBQbHVnZmVzdCM0LCBEYXk0LCBjaGFuZ2UgUkZSMyBsZWZ0NHRoIDktPjUuCisKKwkJLy8gODAyLjExIEh5cGVyTGFuIDIKKwkJezEwMCwgMHg5ODQwMmVjOCwgMHg5ODRjMDZiMiwgMHg5ODE3OGE1NSwgMHg5ODBlZDc4M30sCisKKwkJLy8gMjAwOC4wNC4zMCBtb2RpZmllZAorCQkvLyBUaGUgc3lzdGVtIHRlYW0gaGFzIEFOIHRvIGltcHJvdmUgdGhlIEVWTSB2YWx1ZQorCQkvLyBmb3IgY2hhbm5lbCAxMDIgdG8gMTA4IGZvciB0aGUgUlQyODUwL1JUMjc1MCBkdWFsIGJhbmQgc29sdXRpb24uCisJCXsxMDIsIDB4OTg0MDJlYzgsIDB4OTg1YzA2YjIsIDB4OTg1NzhhNTUsIDB4OTgwZWQ3OTN9LAorCQl7MTA0LCAweDk4NDAyZWM4LCAweDk4NWMwNmIyLCAweDk4NTc4YTU1LCAweDk4MGVkMWEzfSwKKwkJezEwOCwgMHg5ODQwMmVjYywgMHg5ODVjMGEzMiwgMHg5ODU3OGE1NSwgMHg5ODBlZDE5M30sCisKKwkJezExMCwgMHg5ODQwMmVjYywgMHg5ODRjMGEzNiwgMHg5ODE3OGE1NSwgMHg5ODBlZDE4M30sCisJCXsxMTIsIDB4OTg0MDJlY2MsIDB4OTg0YzBhMzYsIDB4OTgxNzhhNTUsIDB4OTgwZWQxOWJ9LAorCQl7MTE2LCAweDk4NDAyZWNjLCAweDk4NGMwYTNhLCAweDk4MTc4YTU1LCAweDk4MGVkMWEzfSwKKwkJezExOCwgMHg5ODQwMmVjYywgMHg5ODRjMGEzZSwgMHg5ODE3OGE1NSwgMHg5ODBlZDE5M30sCisJCXsxMjAsIDB4OTg0MDJlYzQsIDB4OTg0YzAzODIsIDB4OTgxNzhhNTUsIDB4OTgwZWQxODN9LAorCQl7MTI0LCAweDk4NDAyZWM0LCAweDk4NGMwMzgyLCAweDk4MTc4YTU1LCAweDk4MGVkMTkzfSwKKwkJezEyNiwgMHg5ODQwMmVjNCwgMHg5ODRjMDM4MiwgMHg5ODE3OGE1NSwgMHg5ODBlZDE1Yn0sIC8vIDB4OTgwZWQxYmItPjB4OTgwZWQxNWIgcmVxdWlyZWQgYnkgUm9yeSAyMDA3MDkyNworCQl7MTI4LCAweDk4NDAyZWM0LCAweDk4NGMwMzgyLCAweDk4MTc4YTU1LCAweDk4MGVkMWEzfSwKKwkJezEzMiwgMHg5ODQwMmVjNCwgMHg5ODRjMDM4NiwgMHg5ODE3OGE1NSwgMHg5ODBlZDE4Yn0sCisJCXsxMzQsIDB4OTg0MDJlYzQsIDB4OTg0YzAzODYsIDB4OTgxNzhhNTUsIDB4OTgwZWQxOTN9LAorCQl7MTM2LCAweDk4NDAyZWM0LCAweDk4NGMwMzg2LCAweDk4MTc4YTU1LCAweDk4MGVkMTlifSwKKwkJezE0MCwgMHg5ODQwMmVjNCwgMHg5ODRjMDM4YSwgMHg5ODE3OGE1NSwgMHg5ODBlZDE4M30sCisKKwkJLy8gODAyLjExIFVOSUkKKwkJezE0OSwgMHg5ODQwMmVjNCwgMHg5ODRjMDM4YSwgMHg5ODE3OGE1NSwgMHg5ODBlZDFhN30sCisJCXsxNTEsIDB4OTg0MDJlYzQsIDB4OTg0YzAzOGUsIDB4OTgxNzhhNTUsIDB4OTgwZWQxODd9LAorCQl7MTUzLCAweDk4NDAyZWM0LCAweDk4NGMwMzhlLCAweDk4MTc4YTU1LCAweDk4MGVkMThmfSwKKwkJezE1NywgMHg5ODQwMmVjNCwgMHg5ODRjMDM4ZSwgMHg5ODE3OGE1NSwgMHg5ODBlZDE5Zn0sCisJCXsxNTksIDB4OTg0MDJlYzQsIDB4OTg0YzAzOGUsIDB4OTgxNzhhNTUsIDB4OTgwZWQxYTd9LAorCQl7MTYxLCAweDk4NDAyZWM0LCAweDk4NGMwMzkyLCAweDk4MTc4YTU1LCAweDk4MGVkMTg3fSwKKwkJezE2NSwgMHg5ODQwMmVjNCwgMHg5ODRjMDM5MiwgMHg5ODE3OGE1NSwgMHg5ODBlZDE5N30sCisKKwkJLy8gSmFwYW4KKwkJezE4NCwgMHg5NTAwMmNjYywgMHg5NTAwNDkxZSwgMHg5NTA5YmU1NSwgMHg5NTBjMGEwYn0sCisJCXsxODgsIDB4OTUwMDJjY2MsIDB4OTUwMDQ5MjIsIDB4OTUwOWJlNTUsIDB4OTUwYzBhMTN9LAorCQl7MTkyLCAweDk1MDAyY2NjLCAweDk1MDA0OTI2LCAweDk1MDliZTU1LCAweDk1MGMwYTFifSwKKwkJezE5NiwgMHg5NTAwMmNjYywgMHg5NTAwNDkyYSwgMHg5NTA5YmU1NSwgMHg5NTBjMGEyM30sCisJCXsyMDgsIDB4OTUwMDJjY2MsIDB4OTUwMDQ5M2EsIDB4OTUwOWJlNTUsIDB4OTUwYzBhMTN9LAorCQl7MjEyLCAweDk1MDAyY2NjLCAweDk1MDA0OTNlLCAweDk1MDliZTU1LCAweDk1MGMwYTFifSwKKwkJezIxNiwgMHg5NTAwMmNjYywgMHg5NTAwNDk4MiwgMHg5NTA5YmU1NSwgMHg5NTBjMGEyM30sCisKKwkJLy8gc3RpbGwgbGFjayBvZiBNTUFDKEphcGFuKSBjaCAzNCwzOCw0Miw0NgorfTsKK1VDSEFSCU5VTV9PRl8yODUwX0NITkwgPSAoc2l6ZW9mKFJGMjg1MFJlZ1RhYmxlKSAvIHNpemVvZihSVE1QX1JGX1JFR1MpKTsKKworRlJFUVVFTkNZX0lURU0gRnJlcUl0ZW1zMzAyMFtdID0KK3sKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisJLy8gSVNNIDogMi40IHRvIDIuNDgzIEdIeiAgICAgICAgICAgICAgICAgICAgICAgICAvLworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwkvLyAxMWcKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisJLy8tQ0gtLS1OLS0tLS0tLVItLS1LLS0tLS0tLS0tLS0KKwl7MSwgICAgMjQxLCAgMiwgIDJ9LAorCXsyLCAgICAyNDEsCSAyLCAgN30sCisJezMsICAgIDI0MiwJIDIsICAyfSwKKwl7NCwgICAgMjQyLAkgMiwgIDd9LAorCXs1LCAgICAyNDMsCSAyLCAgMn0sCisJezYsICAgIDI0MywJIDIsICA3fSwKKwl7NywgICAgMjQ0LAkgMiwgIDJ9LAorCXs4LCAgICAyNDQsCSAyLCAgN30sCisJezksICAgIDI0NSwJIDIsICAyfSwKKwl7MTAsICAgMjQ1LAkgMiwgIDd9LAorCXsxMSwgICAyNDYsCSAyLCAgMn0sCisJezEyLCAgIDI0NiwJIDIsICA3fSwKKwl7MTMsICAgMjQ3LAkgMiwgIDJ9LAorCXsxNCwgICAyNDgsCSAyLCAgNH0sCit9OworI2RlZmluZQlOVU1fT0ZfMzAyMF9DSE5MCShzaXplb2YoRnJlcUl0ZW1zMzAyMCkgLyBzaXplb2YoRlJFUVVFTkNZX0lURU0pKQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCWluaXRpYWxpemUgdGhlIE1MTUUgdGFzayBhbmQgaXRzIGRhdGEgc3RydWN0dXJlIChxdWV1ZSwgc3BpbmxvY2ssCisJCXRpbWVyLCBzdGF0ZSBtYWNoaW5lcykuCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCisJUmV0dXJuOgorCQlhbHdheXMgcmV0dXJuIE5ESVNfU1RBVFVTX1NVQ0NFU1MKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworTkRJU19TVEFUVVMgTWxtZUluaXQoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJTkRJU19TVEFUVVMgU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPiBNTE1FIEluaXRpYWxpemVcbiIpKTsKKworCWRvCisJeworCQlTdGF0dXMgPSBNbG1lUXVldWVJbml0KCZwQWQtPk1sbWUuUXVldWUpOworCQlpZihTdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJCWJyZWFrOworCisJCXBBZC0+TWxtZS5iUnVubmluZyA9IEZBTFNFOworCQlOZGlzQWxsb2NhdGVTcGluTG9jaygmcEFkLT5NbG1lLlRhc2tMb2NrKTsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQl7CisJCQlCc3NUYWJsZUluaXQoJnBBZC0+U2NhblRhYik7CisKKwkJCS8vIGluaXQgU1RBIHN0YXRlIG1hY2hpbmVzCisJCQlBc3NvY1N0YXRlTWFjaGluZUluaXQocEFkLCAmcEFkLT5NbG1lLkFzc29jTWFjaGluZSwgcEFkLT5NbG1lLkFzc29jRnVuYyk7CisJCQlBdXRoU3RhdGVNYWNoaW5lSW5pdChwQWQsICZwQWQtPk1sbWUuQXV0aE1hY2hpbmUsIHBBZC0+TWxtZS5BdXRoRnVuYyk7CisJCQlBdXRoUnNwU3RhdGVNYWNoaW5lSW5pdChwQWQsICZwQWQtPk1sbWUuQXV0aFJzcE1hY2hpbmUsIHBBZC0+TWxtZS5BdXRoUnNwRnVuYyk7CisJCQlTeW5jU3RhdGVNYWNoaW5lSW5pdChwQWQsICZwQWQtPk1sbWUuU3luY01hY2hpbmUsIHBBZC0+TWxtZS5TeW5jRnVuYyk7CisJCQlXcGFQc2tTdGF0ZU1hY2hpbmVJbml0KHBBZCwgJnBBZC0+TWxtZS5XcGFQc2tNYWNoaW5lLCBwQWQtPk1sbWUuV3BhUHNrRnVuYyk7CisJCQlBaXJvbmV0U3RhdGVNYWNoaW5lSW5pdChwQWQsICZwQWQtPk1sbWUuQWlyb25ldE1hY2hpbmUsIHBBZC0+TWxtZS5BaXJvbmV0RnVuYyk7CisKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwkJCURsc1N0YXRlTWFjaGluZUluaXQocEFkLCAmcEFkLT5NbG1lLkRsc01hY2hpbmUsIHBBZC0+TWxtZS5EbHNGdW5jKTsKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKworCisJCQkvLyBTaW5jZSB3ZSBhcmUgdXNpbmcgc3dpdGNoL2Nhc2UgdG8gaW1wbGVtZW50IGl0LCB0aGUgaW5pdCBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgYWJvdmUKKwkJCS8vIHN0YXRlIG1hY2hpbmUgaW5pdAorCQkJTWxtZUNudGxJbml0KHBBZCwgJnBBZC0+TWxtZS5DbnRsTWFjaGluZSwgTlVMTCk7CisJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCisKKwkJQWN0aW9uU3RhdGVNYWNoaW5lSW5pdChwQWQsICZwQWQtPk1sbWUuQWN0TWFjaGluZSwgcEFkLT5NbG1lLkFjdEZ1bmMpOworCisJCS8vIEluaXQgbWxtZSBwZXJpb2RpYyB0aW1lcgorCQlSVE1QSW5pdFRpbWVyKHBBZCwgJnBBZC0+TWxtZS5QZXJpb2RpY1RpbWVyLCBHRVRfVElNRVJfRlVOQ1RJT04oTWxtZVBlcmlvZGljRXhlYyksIHBBZCwgVFJVRSk7CisKKwkJLy8gU2V0IG1sbWUgcGVyaW9kaWMgdGltZXIKKwkJUlRNUFNldFRpbWVyKCZwQWQtPk1sbWUuUGVyaW9kaWNUaW1lciwgTUxNRV9UQVNLX0VYRUNfSU5UVik7CisKKwkJLy8gc29mdHdhcmUtYmFzZWQgUlggQW50ZW5uYSBkaXZlcnNpdHkKKwkJUlRNUEluaXRUaW1lcihwQWQsICZwQWQtPk1sbWUuUnhBbnRFdmFsVGltZXIsIEdFVF9USU1FUl9GVU5DVElPTihBc2ljUnhBbnRFdmFsVGltZW91dCksIHBBZCwgRkFMU0UpOworCisJfSB3aGlsZSAoRkFMU0UpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPC0tIE1MTUUgSW5pdGlhbGl6ZVxuIikpOworCisJcmV0dXJuIFN0YXR1czsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQltYWluIGxvb3Agb2YgdGhlIE1MTUUKKwlQcmU6CisJCU1sbWUgaGFzIHRvIGJlIGluaXRpYWxpemVkLCBhbmQgdGhlcmUgYXJlIHNvbWV0aGluZyBpbnNpZGUgdGhlIHF1ZXVlCisJTm90ZToKKwkJVGhpcyBmdW5jdGlvbiBpcyBpbnZva2VkIGZyb20gTVBTZXRJbmZvcm1hdGlvbiBhbmQgTVBSZWNlaXZlOworCQlUaGlzIHRhc2sgZ3VhcmFudGVlIG9ubHkgb25lIE1sbWVIYW5kbGVyIHdpbGwgcnVuLgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIE1sbWVIYW5kbGVyKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCU1MTUVfUVVFVUVfRUxFTSAJICAgKkVsZW0gPSBOVUxMOworI2lmZGVmIEFQQ0xJX1NVUFBPUlQKKwlTSE9SVCBhcGNsaUlmSW5kZXg7CisjZW5kaWYKKworCS8vIE9ubHkgYWNjZXB0IE1MTUUgYW5kIEZyYW1lIGZyb20gcGVlciBzaWRlLCBubyBvdGhlciAoY29udHJvbC9kYXRhKSBmcmFtZSBzaG91bGQKKwkvLyBnZXQgaW50byB0aGlzIHN0YXRlIG1hY2hpbmUKKworCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+TWxtZS5UYXNrTG9jayk7CisJaWYocEFkLT5NbG1lLmJSdW5uaW5nKQorCXsKKwkJTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5NbG1lLlRhc2tMb2NrKTsKKwkJcmV0dXJuOworCX0KKwllbHNlCisJeworCQlwQWQtPk1sbWUuYlJ1bm5pbmcgPSBUUlVFOworCX0KKwlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPk1sbWUuVGFza0xvY2spOworCisJd2hpbGUgKCFNbG1lUXVldWVFbXB0eSgmcEFkLT5NbG1lLlF1ZXVlKSkKKwl7CisJCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTUxNRV9SRVNFVF9JTl9QUk9HUkVTUykgfHwKKwkJCVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKSB8fAorCQkJUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKQorCQl7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJEZXZpY2UgSGFsdGVkIG9yIFJlbW92ZWQgb3IgTWxtZVJlc3QsIGV4aXQgTWxtZUhhbmRsZXIhIChxdWV1ZSBudW0gPSAlbGQpXG4iLCBwQWQtPk1sbWUuUXVldWUuTnVtKSk7CisJCQlicmVhazsKKwkJfQorCisjaWZkZWYgUkFMSU5LX0FURQorCQlpZihBVEVfT04ocEFkKSkKKwkJeworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiVGhlIGRyaXZlciBpcyBpbiBBVEUgbW9kZSBub3cgaW4gTWxtZUhhbmRsZXJcbiIpKTsKKwkJCWJyZWFrOworCQl9CisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCisJCS8vRnJvbSBtZXNzYWdlIHR5cGUsIGRldGVybWluZSB3aGljaCBzdGF0ZSBtYWNoaW5lIEkgc2hvdWxkIGRyaXZlCisJCWlmIChNbG1lRGVxdWV1ZSgmcEFkLT5NbG1lLlF1ZXVlLCAmRWxlbSkpCisJCXsKKyNpZmRlZiBSVDI4NzAKKwkJCWlmIChFbGVtLT5Nc2dUeXBlID09IE1UMl9SRVNFVF9DT05GKQorCQkJeworCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCIhISEgcmVzZXQgTUxNRSBzdGF0ZSBtYWNoaW5lICEhIVxuIikpOworCQkJCU1sbWVSZXN0YXJ0U3RhdGVNYWNoaW5lKHBBZCk7CisJCQkJRWxlbS0+T2NjdXBpZWQgPSBGQUxTRTsKKwkJCQlFbGVtLT5Nc2dMZW4gPSAwOworCQkJCWNvbnRpbnVlOworCQkJfQorI2VuZGlmIC8vIFJUMjg3MCAvLworCisJCQkvLyBpZiBkZXF1ZXVlIHN1Y2Nlc3MKKwkJCXN3aXRjaCAoRWxlbS0+TWFjaGluZSkKKwkJCXsKKwkJCQkvLyBTVEEgc3RhdGUgbWFjaGluZXMKKyNpZmRlZglDT05GSUdfU1RBX1NVUFBPUlQKKwkJCQljYXNlIEFTU09DX1NUQVRFX01BQ0hJTkU6CisJCQkJCVN0YXRlTWFjaGluZVBlcmZvcm1BY3Rpb24ocEFkLCAmcEFkLT5NbG1lLkFzc29jTWFjaGluZSwgRWxlbSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgQVVUSF9TVEFURV9NQUNISU5FOgorCQkJCQlTdGF0ZU1hY2hpbmVQZXJmb3JtQWN0aW9uKHBBZCwgJnBBZC0+TWxtZS5BdXRoTWFjaGluZSwgRWxlbSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgQVVUSF9SU1BfU1RBVEVfTUFDSElORToKKwkJCQkJU3RhdGVNYWNoaW5lUGVyZm9ybUFjdGlvbihwQWQsICZwQWQtPk1sbWUuQXV0aFJzcE1hY2hpbmUsIEVsZW0pOworCQkJCQlicmVhazsKKwkJCQljYXNlIFNZTkNfU1RBVEVfTUFDSElORToKKwkJCQkJU3RhdGVNYWNoaW5lUGVyZm9ybUFjdGlvbihwQWQsICZwQWQtPk1sbWUuU3luY01hY2hpbmUsIEVsZW0pOworCQkJCQlicmVhazsKKwkJCQljYXNlIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FOgorCQkJCQlNbG1lQ250bE1hY2hpbmVQZXJmb3JtQWN0aW9uKHBBZCwgJnBBZC0+TWxtZS5DbnRsTWFjaGluZSwgRWxlbSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgV1BBX1BTS19TVEFURV9NQUNISU5FOgorCQkJCQlTdGF0ZU1hY2hpbmVQZXJmb3JtQWN0aW9uKHBBZCwgJnBBZC0+TWxtZS5XcGFQc2tNYWNoaW5lLCBFbGVtKTsKKwkJCQkJYnJlYWs7CisjaWZkZWYgTEVBUF9TVVBQT1JUCisJCQkJY2FzZSBMRUFQX1NUQVRFX01BQ0hJTkU6CisJCQkJCUxlYXBNYWNoaW5lUGVyZm9ybUFjdGlvbihwQWQsICZwQWQtPk1sbWUuTGVhcE1hY2hpbmUsIEVsZW0pOworCQkJCQlicmVhazsKKyNlbmRpZgorCQkJCWNhc2UgQUlST05FVF9TVEFURV9NQUNISU5FOgorCQkJCQlTdGF0ZU1hY2hpbmVQZXJmb3JtQWN0aW9uKHBBZCwgJnBBZC0+TWxtZS5BaXJvbmV0TWFjaGluZSwgRWxlbSk7CisJCQkJCWJyZWFrOworCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJCQkJY2FzZSBETFNfU1RBVEVfTUFDSElORToKKwkJCQkJU3RhdGVNYWNoaW5lUGVyZm9ybUFjdGlvbihwQWQsICZwQWQtPk1sbWUuRGxzTWFjaGluZSwgRWxlbSk7CisJCQkJCWJyZWFrOworI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJCQkJY2FzZSBBQ1RJT05fU1RBVEVfTUFDSElORToKKwkJCQkJU3RhdGVNYWNoaW5lUGVyZm9ybUFjdGlvbihwQWQsICZwQWQtPk1sbWUuQWN0TWFjaGluZSwgRWxlbSk7CisJCQkJCWJyZWFrOworCisKKworCisJCQkJZGVmYXVsdDoKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiRVJST1I6IElsbGVnYWwgbWFjaGluZSAlbGQgaW4gTWxtZUhhbmRsZXIoKVxuIiwgRWxlbS0+TWFjaGluZSkpOworCQkJCQlicmVhazsKKwkJCX0gLy8gZW5kIG9mIHN3aXRjaAorCisJCQkvLyBmcmVlIE1MTUUgZWxlbWVudAorCQkJRWxlbS0+T2NjdXBpZWQgPSBGQUxTRTsKKwkJCUVsZW0tPk1zZ0xlbiA9IDA7CisKKwkJfQorCQllbHNlIHsKKwkJCURCR1BSSU5UX0VSUigoIk1sbWVIYW5kbGVyOiBNbG1lUXVldWUgZW1wdHlcbiIpKTsKKwkJfQorCX0KKworCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+TWxtZS5UYXNrTG9jayk7CisJcEFkLT5NbG1lLmJSdW5uaW5nID0gRkFMU0U7CisJTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5NbG1lLlRhc2tMb2NrKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlEZXN0cnVjdG9yIG9mIE1MTUUgKERlc3Ryb3kgcXVldWUsIHN0YXRlIG1hY2hpbmUsIHNwaW4gbG9jayBhbmQgdGltZXIpCisJUGFyYW1ldGVyczoKKwkJQWRhcHRlciAtIE5JQyBBZGFwdGVyIHBvaW50ZXIKKwlQb3N0OgorCQlUaGUgTUxNRSB0YXNrIHdpbGwgbm8gbG9uZ2VyIHdvcmsgcHJvcGVybHkKKworCUlSUUwgPSBQQVNTSVZFX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIE1sbWVIYWx0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCUJPT0xFQU4gCSAgQ2FuY2VsbGVkOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT0+IE1sbWVIYWx0XG4iKSk7CisKKwlpZiAoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkKKwl7CisJCS8vIGRpc2FibGUgQkVBQ09OIGdlbmVyYXRpb24gYW5kIG90aGVyIEJFQUNPTiByZWxhdGVkIGhhcmR3YXJlIHRpbWVycworCQlBc2ljRGlzYWJsZVN5bmMocEFkKTsKKwl9CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCXsKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwkJVUNIQVIJCWk7CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisJCS8vIENhbmNlbCBwZW5kaW5nIHRpbWVycworCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5Bc3NvY1RpbWVyLAkJJkNhbmNlbGxlZCk7CisJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LlJlYXNzb2NUaW1lciwJCSZDYW5jZWxsZWQpOworCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5EaXNhc3NvY1RpbWVyLAkmQ2FuY2VsbGVkKTsKKwkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguQXV0aFRpbWVyLAkJJkNhbmNlbGxlZCk7CisJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LkJlYWNvblRpbWVyLAkJJkNhbmNlbGxlZCk7CisJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LlNjYW5UaW1lciwJCSZDYW5jZWxsZWQpOworCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJCWZvciAoaT0wOyBpPE1BWF9OVU1fT0ZfRExTX0VOVFJZOyBpKyspCisJCXsKKwkJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVGltZXIsICZDYW5jZWxsZWQpOworCQl9CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWUuUGVyaW9kaWNUaW1lciwJCSZDYW5jZWxsZWQpOworCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lLlJ4QW50RXZhbFRpbWVyLAkJJkNhbmNlbGxlZCk7CisKKworCisJaWYgKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpCisJeworCQkvLyBTZXQgTEVECisJCVJUTVBTZXRMRUQocEFkLCBMRURfSEFMVCk7CisgICAgICAgIFJUTVBTZXRTaWduYWxMRUQocEFkLCAtMTAwKTsJLy8gRm9yY2Ugc2lnbmFsIHN0cmVuZ3RoIExlZCB0byBiZSB0dXJuZWQgb2ZmLCBmaXJtd2FyZSBpcyBub3QgZG9uZSBpdC4KKyNpZmRlZiBSVDI4NzAKKyAgICAgICAgeworICAgICAgICAgICAgTEVEX0NGR19TVFJVQyBMZWRDZmc7CisgICAgICAgICAgICBSVE1QX0lPX1JFQUQzMihwQWQsIExFRF9DRkcsICZMZWRDZmcud29yZCk7CisgICAgICAgICAgICBMZWRDZmcuZmllbGQuTGVkUG9sYXIgPSAwOworICAgICAgICAgICAgTGVkQ2ZnLmZpZWxkLlJMZWRNb2RlID0gMDsKKyAgICAgICAgICAgIExlZENmZy5maWVsZC5HTGVkTW9kZSA9IDA7CisgICAgICAgICAgICBMZWRDZmcuZmllbGQuWUxlZE1vZGUgPSAwOworICAgICAgICAgICAgUlRNUF9JT19XUklURTMyKHBBZCwgTEVEX0NGRywgTGVkQ2ZnLndvcmQpOworICAgICAgICB9CisjZW5kaWYgLy8gUlQyODcwIC8vCisJfQorCisJUlRNUHVzZWNEZWxheSg1MDAwKTsgICAgLy8gIDUgbXNlYyB0byBndXJhbnRlZSBBbnQgRGl2ZXJzaXR5IHRpbWVyIGNhbmNlbGVkCisKKwlNbG1lUXVldWVEZXN0cm95KCZwQWQtPk1sbWUuUXVldWUpOworCU5kaXNGcmVlU3BpbkxvY2soJnBBZC0+TWxtZS5UYXNrTG9jayk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT0gTWxtZUhhbHRcbiIpKTsKK30KKworVk9JRCBNbG1lUmVzZXRSYWxpbmtDb3VudGVycygKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCkKK3sKKwlwQWQtPlJhbGlua0NvdW50ZXJzLkxhc3RPbmVTZWNSeE9rRGF0YUNudCA9IHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjUnhPa0RhdGFDbnQ7CisJLy8gY2xlYXIgYWxsIE9uZVNlY3h4eCBjb3VudGVycy4KKwlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY0JlYWNvblNlbnRDbnQgPSAwOworCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjRmFsc2VDQ0FDbnQgPSAwOworCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjUnhGY3NFcnJDbnQgPSAwOworCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjUnhPa0NudCA9IDA7CisJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeEZhaWxDb3VudCA9IDA7CisJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeE5vUmV0cnlPa0NvdW50ID0gMDsKKwlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4UmV0cnlPa0NvdW50ID0gMDsKKwlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1J4T2tEYXRhQ250ID0gMDsKKworCS8vIFRPRE86IGZvciBkZWJ1ZyBvbmx5LiB0byBiZSByZW1vdmVkCisJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNPc1R4Q291bnRbUUlEX0FDX0JFXSA9IDA7CisJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNPc1R4Q291bnRbUUlEX0FDX0JLXSA9IDA7CisJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNPc1R4Q291bnRbUUlEX0FDX1ZJXSA9IDA7CisJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNPc1R4Q291bnRbUUlEX0FDX1ZPXSA9IDA7CisJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNEbWFEb25lQ291bnRbUUlEX0FDX0JFXSA9IDA7CisJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNEbWFEb25lQ291bnRbUUlEX0FDX0JLXSA9IDA7CisJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNEbWFEb25lQ291bnRbUUlEX0FDX1ZJXSA9IDA7CisJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNEbWFEb25lQ291bnRbUUlEX0FDX1ZPXSA9IDA7CisJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeERvbmVDb3VudCA9IDA7CisJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNSeENvdW50ID0gMDsKKwlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4QWdncmVnYXRpb25Db3VudCA9IDA7CisJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNSeEFnZ3JlZ2F0aW9uQ291bnQgPSAwOworCisJcmV0dXJuOworfQorCit1bnNpZ25lZCBsb25nIHJ4X0FNU0RVOwordW5zaWduZWQgbG9uZyByeF9Ub3RhbDsKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlUaGlzIHJvdXRpbmUgaXMgZXhlY3V0ZWQgcGVyaW9kaWNhbGx5IHRvIC0KKwkJMS4gRGVjaWRlIGlmIGl0J3MgYSByaWdodCB0aW1lIHRvIHR1cm4gb24gUHdyTWdtdCBiaXQgb2YgYWxsCisJCSAgIG91dGdvaWluZyBmcmFtZXMKKwkJMi4gQ2FsY3VsYXRlIENoYW5uZWxRdWFsaXR5IGJhc2VkIG9uIHN0YXRpc3RpY3Mgb2YgdGhlIGxhc3QKKwkJICAgcGVyaW9kLCBzbyB0aGF0IFRYIHJhdGUgd29uJ3QgdG9nZ2xpbmcgdmVyeSBmcmVxdWVudGx5IGJldHdlZW4gYQorCQkgICBzdWNjZXNzZnVsIFRYIGFuZCBhIGZhaWxlZCBUWC4KKwkJMy4gSWYgdGhlIGNhbGN1bGF0ZWQgQ2hhbm5lbFF1YWxpdHkgaW5kaWNhdGVkIGN1cnJlbnQgY29ubmVjdGlvbiBub3QKKwkJICAgaGVhbHRoeSwgdGhlbiBhIFJPQU1pbmcgYXR0ZW1wdCBpcyB0cmllZCBoZXJlLgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisjZGVmaW5lIEFESE9DX0JFQUNPTl9MT1NUX1RJTUUJCSg4Kk9TX0haKSAgLy8gOCBzZWMKK1ZPSUQgTWxtZVBlcmlvZGljRXhlYygKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCisJSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpCit7CisJVUxPTkcJCQlUeFRvdGFsQ250OworCVBSVE1QX0FEQVBURVIJcEFkID0gKFJUTVBfQURBUFRFUiAqKUZ1bmN0aW9uQ29udGV4dDsKKworCS8vIERvIG5vdGhpbmcgaWYgdGhlIGRyaXZlciBpcyBzdGFydGluZyBoYWx0IHN0YXRlLgorCS8vIFRoaXMgbWlnaHQgaGFwcGVuIHdoZW4gdGltZXIgYWxyZWFkeSBiZWVuIGZpcmVkIGJlZm9yZSBjYW5jZWwgdGltZXIgd2l0aCBtbG1laGFsdAorCWlmICgoUlRNUF9URVNUX0ZMQUcocEFkLCAoZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwKKwkJCQkJCQkJZlJUTVBfQURBUFRFUl9SQURJT19PRkYgfAorCQkJCQkJCQlmUlRNUF9BREFQVEVSX1JBRElPX01FQVNVUkVNRU5UIHwKKwkJCQkJCQkJZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUykpKSkKKwkJcmV0dXJuOworCisJUlQyOFhYX01MTUVfUFJFX1NBTklUWV9DSEVDSyhwQWQpOworCisjaWZkZWYgUkFMSU5LX0FURQorCS8qIERvIG5vdCBzaG93IFJTU0kgdW50aWwgIk5vcm1hbCAxIHNlY29uZCBNbG1lIFBlcmlvZGljRXhlYyIuICovCisJaWYgKEFURV9PTihwQWQpKQorCXsKKwkJaWYgKHBBZC0+TWxtZS5QZXJpb2RpY1JvdW5kICUgTUxNRV9UQVNLX0VYRUNfTVVMVElQTEUgIT0gKE1MTUVfVEFTS19FWEVDX01VTFRJUExFIC0gMSkpCisJeworCQkJcEFkLT5NbG1lLlBlcmlvZGljUm91bmQgKys7CisJCQlyZXR1cm47CisJCX0KKwl9CisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwl7CisJCS8vIERvIG5vdGhpbmcgaWYgbW9uaXRvciBtb2RlIGlzIG9uCisJCWlmIChNT05JVE9SX09OKHBBZCkpCisJCQlyZXR1cm47CisKKwkJaWYgKHBBZC0+TWxtZS5QZXJpb2RpY1JvdW5kICYgMHgxKQorCQl7CisJCQkvLyBUaGlzIGlzIHRoZSBmaXggZm9yIHdpZmkgMTFuIGV4dGVuc2lvbiBjaGFubmVsIG92ZXJsYXBwaW5nIHRlc3QgY2FzZS4gIGZvciAyODYwRAorCQkJaWYgKCgocEFkLT5NQUNWZXJzaW9uICYgMHhmZmZmKSA9PSAweDAxMDEpICYmCisJCQkJKFNUQV9UR05fV0lGSV9PTihwQWQpKSAmJgorCQkJCShwQWQtPkNvbW1vbkNmZy5JT1Rlc3RQYXJtLmJUb2dnbGUgPT0gRkFMU0UpKQorCisJCQkJeworCQkJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWE9QX0NUUkxfQ0ZHLCAweDI0QmYpOworCQkJCQlwQWQtPkNvbW1vbkNmZy5JT1Rlc3RQYXJtLmJUb2dnbGUgPSBUUlVFOworCQkJCX0KKwkJCQllbHNlIGlmICgoU1RBX1RHTl9XSUZJX09OKHBBZCkpICYmCisJCQkJCQkoKHBBZC0+TUFDVmVyc2lvbiAmIDB4ZmZmZikgPT0gMHgwMTAxKSkKKwkJCQl7CisJCQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYT1BfQ1RSTF9DRkcsIDB4MjQzZik7CisJCQkJCXBBZC0+Q29tbW9uQ2ZnLklPVGVzdFBhcm0uYlRvZ2dsZSA9IEZBTFNFOworCQkJCX0KKwkJfQorCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCXBBZC0+YlVwZGF0ZUJjbkNudERvbmUgPSBGQUxTRTsKKworLy8JUkVDQkFUaW1lclRpbWVvdXQoU3lzdGVtU3BlY2lmaWMxLEZ1bmN0aW9uQ29udGV4dCxTeXN0ZW1TcGVjaWZpYzIsU3lzdGVtU3BlY2lmaWMzKTsKKwlwQWQtPk1sbWUuUGVyaW9kaWNSb3VuZCArKzsKKworCS8vIGV4ZWN1dGUgZXZlcnkgNTAwbXMKKwlpZiAoKHBBZC0+TWxtZS5QZXJpb2RpY1JvdW5kICUgNSA9PSAwKSAmJiBSVE1QQXV0b1JhdGVTd2l0Y2hDaGVjayhwQWQpLyooT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19UWF9SQVRFX1NXSVRDSF9FTkFCTEVEKSkqLykKKwl7CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCS8vIHBlcmZvcm0gZHluYW1pYyB0eCByYXRlIHN3aXRjaGluZyBiYXNlZCBvbiBwYXN0IFRYIGhpc3RvcnkKKwkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJeworCQkJaWYgKChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCkKKwkJCQkJKQorCQkJCSYmICghT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKSkpCisJCQkJTWxtZUR5bmFtaWNUeFJhdGVTd2l0Y2hpbmcocEFkKTsKKwkJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCX0KKworCS8vIE5vcm1hbCAxIHNlY29uZCBNbG1lIFBlcmlvZGljRXhlYy4KKwlpZiAocEFkLT5NbG1lLlBlcmlvZGljUm91bmQgJU1MTUVfVEFTS19FWEVDX01VTFRJUExFID09IDApCisJeworICAgICAgICAgICAgICAgIHBBZC0+TWxtZS5PbmVTZWNQZXJpb2RpY1JvdW5kICsrOworCisjaWZkZWYgUkFMSU5LX0FURQorICAgIAlpZiAoQVRFX09OKHBBZCkpCisgICAgCXsKKwkJCS8qIHJlcXVlc3QgZnJvbSBCYXJvbiA6IG1vdmUgdGhpcyByb3V0aW5lIGZyb20gbGF0ZXIgdG8gaGVyZSAqLworCQkJLyogZm9yIHNob3dpbmcgUnggZXJyb3IgY291bnQgaW4gQVRFIFJYRlJBTUUgKi8KKyAgICAgICAgICAgIE5JQ1VwZGF0ZVJhd0NvdW50ZXJzKHBBZCk7CisJCQlpZiAocEFkLT5hdGUuYlJ4RmVyID09IDEpCisJCQl7CisJCQkJcEFkLT5hdGUuUnhUb3RhbENudCArPSBwQWQtPmF0ZS5SeENudFBlclNlYzsKKwkJCSAgICBhdGVfcHJpbnQoS0VSTl9FTUVSRyAiTWxtZVBlcmlvZGljRXhlYzogUnggcGFja2V0IGNudCA9ICVkLyVkXG4iLCBwQWQtPmF0ZS5SeENudFBlclNlYywgcEFkLT5hdGUuUnhUb3RhbENudCk7CisJCQkJcEFkLT5hdGUuUnhDbnRQZXJTZWMgPSAwOworCisJCQkJaWYgKHBBZC0+YXRlLlJ4QW50ZW5uYVNlbCA9PSAwKQorCQkJCQlhdGVfcHJpbnQoS0VSTl9FTUVSRyAiTWxtZVBlcmlvZGljRXhlYzogUnggQXZnUnNzaTA9JWQsIEF2Z1Jzc2kxPSVkLCBBdmdSc3NpMj0lZFxuXG4iLAorCQkJCQkJcEFkLT5hdGUuQXZnUnNzaTAsIHBBZC0+YXRlLkF2Z1Jzc2kxLCBwQWQtPmF0ZS5BdmdSc3NpMik7CisJCQkJZWxzZQorCQkJCQlhdGVfcHJpbnQoS0VSTl9FTUVSRyAiTWxtZVBlcmlvZGljRXhlYzogUnggQXZnUnNzaT0lZFxuXG4iLCBwQWQtPmF0ZS5BdmdSc3NpMCk7CisJCQl9CisJCQlNbG1lUmVzZXRSYWxpbmtDb3VudGVycyhwQWQpOworCQkJcmV0dXJuOworICAgIAl9CisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCisKKwkJaWYgKHJ4X1RvdGFsKQorCQl7CisKKwkJCS8vIHJlc2V0IGNvdW50ZXJzCisJCQlyeF9BTVNEVSA9IDA7CisJCQlyeF9Ub3RhbCA9IDA7CisJCX0KKworCQkvL09SSUJBVGltZXJUaW1lb3V0KHBBZCk7CisKKwkJLy8gTWVkaWEgc3RhdHVzIGNoYW5nZWQsIHJlcG9ydCB0byBORElTCisJCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTUVESUFfU1RBVEVfQ0hBTkdFKSkKKwkJeworCQkJUlRNUF9DTEVBUl9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9NRURJQV9TVEFURV9DSEFOR0UpOworCQkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSkKKwkJCXsKKwkJCQlwQWQtPkluZGljYXRlTWVkaWFTdGF0ZSA9IE5kaXNNZWRpYVN0YXRlQ29ubmVjdGVkOworCQkJCVJUTVBfSW5kaWNhdGVNZWRpYVN0YXRlKHBBZCk7CisKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlwQWQtPkluZGljYXRlTWVkaWFTdGF0ZSA9IE5kaXNNZWRpYVN0YXRlRGlzY29ubmVjdGVkOworCQkJCVJUTVBfSW5kaWNhdGVNZWRpYVN0YXRlKHBBZCk7CisJCQl9CisJCX0KKworCQlOZGlzR2V0U3lzdGVtVXBUaW1lKCZwQWQtPk1sbWUuTm93MzIpOworCisJCS8vIGFkZCB0aGUgbW9zdCB1cC10by1kYXRlIGgvdyByYXcgY291bnRlcnMgaW50byBzb2Z0d2FyZSB2YXJpYWJsZSwgc28gdGhhdAorCQkvLyB0aGUgZHluYW1pYyB0dW5pbmcgbWVjaGFuaXNtIGJlbG93IGFyZSBiYXNlZCBvbiBtb3N0IHVwLXRvLWRhdGUgaW5mb3JtYXRpb24KKwkJTklDVXBkYXRlUmF3Q291bnRlcnMocEFkKTsKKworI2lmZGVmIFJUMjg3MAorCQlSVDI4NzBfV2F0Y2hEb2cocEFkKTsKKyNlbmRpZiAvLyBSVDI4NzAgLy8KKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorICAgCQkvLyBOZWVkIHN0YXRpc3RpY3MgYWZ0ZXIgcmVhZCBjb3VudGVyLiBTbyBwdXQgYWZ0ZXIgTklDVXBkYXRlUmF3Q291bnRlcnMKKwkJT1JJQkFUaW1lclRpbWVvdXQocEFkKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCQkvLyBpZiBNR01UIFJJTkcgaXMgZnVsbCBtb3JlIHRoYW4gdHdpY2Ugd2l0aGluIDEgc2Vjb25kLCB3ZSBjb25zaWRlciB0aGVyZSdzCisJCS8vIGEgaGFyZHdhcmUgcHJvYmxlbSBzdHVja2luZyB0aGUgVFggcGF0aC4gSW4gdGhpcyBjYXNlLCB0cnkgYSBoYXJkd2FyZSByZXNldAorCQkvLyB0byByZWNvdmVyIHRoZSBzeXN0ZW0KKwkvLwlpZiAocEFkLT5SYWxpbmtDb3VudGVycy5NZ210UmluZ0Z1bGxDb3VudCA+PSAyKQorCS8vCQlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQVJEV0FSRV9FUlJPUik7CisJLy8JZWxzZQorCS8vCQlwQWQtPlJhbGlua0NvdW50ZXJzLk1nbXRSaW5nRnVsbENvdW50ID0gMDsKKworCQkvLyBUaGUgdGltZSBwZXJpb2QgZm9yIGNoZWNraW5nIGFudGVubmEgaXMgYWNjb3JkaW5nIHRvIHRyYWZmaWMKKwkJaWYgKHBBZC0+TWxtZS5iRW5hYmxlQXV0b0FudGVubmFDaGVjaykKKwkJeworCQkJVHhUb3RhbENudCA9IHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhOb1JldHJ5T2tDb3VudCArCisJCQkJCQkJIHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhSZXRyeU9rQ291bnQgKworCQkJCQkJCSBwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4RmFpbENvdW50OworCisJCQlpZiAoVHhUb3RhbENudCA+IDUwKQorCQkJeworCQkJCWlmIChwQWQtPk1sbWUuT25lU2VjUGVyaW9kaWNSb3VuZCAlIDEwID09IDApCisJCQkJeworCQkJCQlBc2ljRXZhbHVhdGVSeEFudChwQWQpOworCQkJCX0KKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlpZiAocEFkLT5NbG1lLk9uZVNlY1BlcmlvZGljUm91bmQgJSAzID09IDApCisJCQkJeworCQkJCQlBc2ljRXZhbHVhdGVSeEFudChwQWQpOworCQkJCX0KKwkJCX0KKwkJfQorCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCQlTVEFNbG1lUGVyaW9kaWNFeGVjKHBBZCk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwkJTWxtZVJlc2V0UmFsaW5rQ291bnRlcnMocEFkKTsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQl7CisJCQl7CisJCQkJLy8gV2hlbiBBZGhvYyBiZWFjb24gaXMgZW5hYmxlZCBhbmQgUlRTL0NUUyBpcyBlbmFibGVkLCB0aGVyZSBpcyBhIGNoYW5jZSB0aGF0IGhhcmR3YXJlIE1BQyBGU00gd2lsbCBydW4gaW50byBhIGRlYWRsb2NrCisJCQkJLy8gYW5kIHNlbmRpbmcgQ1RTLXRvLXNlbGYgb3ZlciBhbmQgb3Zlci4KKwkJCQkvLyBTb2Z0d2FyZSBQYXRjaCBTb2x1dGlvbjoKKwkJCQkvLyAxLiBQb2xsaW5nIGRlYnVnIHN0YXRlIHJlZ2lzdGVyIDB4MTBGNCBldmVyeSBvbmUgc2Vjb25kLgorCQkJCS8vIDIuIElmIGluIDB4MTBGNCB0aGUgKChiaXQyOT09MSkgJiYgKGJpdDc9PTEpKSBPUiAoKGJpdDI5PT0xKSAmJiAoYml0NT09MSkpLCBpdCBtZWFucyB0aGUgZGVhZGxvY2sgaGFzIG9jY3VycmVkLgorCQkJCS8vIDMuIElmIHRoZSBkZWFkbG9jayBvY2N1cnJlZCwgcmVzZXQgTUFDL0JCUCBieSBzZXR0aW5nIDB4MTAwNCB0byAweDAwMDEgZm9yIGEgd2hpbGUgdGhlbiBzZXR0aW5nIGl0IGJhY2sgdG8gMHgwMDBDIGFnYWluLgorCisJCQkJVUlOVDMyCU1hY1JlZyA9IDA7CisKKwkJCQlSVE1QX0lPX1JFQUQzMihwQWQsIDB4MTBGNCwgJk1hY1JlZyk7CisJCQkJaWYgKCgoTWFjUmVnICYgMHgyMDAwMDAwMCkgJiYgKE1hY1JlZyAmIDB4ODApKSB8fCAoKE1hY1JlZyAmIDB4MjAwMDAwMDApICYmIChNYWNSZWcgJiAweDIwKSkpCisJCQkJeworCQkJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIDB4MSk7CisJCQkJCVJUTVB1c2VjRGVsYXkoMSk7CisJCQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgMHhDKTsKKworCQkJCQlEQkdQUklOVChSVF9ERUJVR19XQVJOLCgiV2FybmluZywgTUFDIHNwZWNpZmljIGNvbmRpdGlvbiBvY2N1cnMgXG4iKSk7CisJCQkJfQorCQkJfQorCQl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwkJUlQyOFhYX01MTUVfSEFORExFUihwQWQpOworCX0KKworCisJcEFkLT5iVXBkYXRlQmNuQ250RG9uZSA9IEZBTFNFOworfQorCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCitWT0lEIFNUQU1sbWVQZXJpb2RpY0V4ZWMoCisJUFJUTVBfQURBUFRFUiBwQWQpCit7CisJVUxPTkcJVHhUb3RhbENudDsKKwlpbnQgCWk7CisKKy8vCisvLyBXZSByZXR1cm4gaGVyZSBpbiBBVEUgbW9kZSwgYmVjYXVzZSB0aGUgc3RhdGlzdGljcworLy8gdGhhdCBBVEUgbmVlZHMgYXJlIG5vdCBjb2xsZWN0ZWQgdmlhIHRoaXMgcm91dGluZS4KKy8vCisjaWZkZWYgUkFMSU5LX0FURQorCS8vIEl0IGlzIHN1cHBvc2VkIHRoYXQgd2Ugd2lsbCBuZXZlciByZWFjaCBoZXJlIGluIEFURSBtb2RlLgorCUFTU0VSVCghKEFURV9PTihwQWQpKSk7CisJaWYgKEFURV9PTihwQWQpKQorCQlyZXR1cm47CisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgIGlmIChwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgPT0gV1BBX1NVUFBMSUNBTlRfRElTQUJMRSkKKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisgICAgeworICAgIAkvLyBXUEEgTUlDIGVycm9yIHNob3VsZCBibG9jayBhc3NvY2lhdGlvbiBhdHRlbXB0IGZvciA2MCBzZWNvbmRzCisgICAgCWlmIChwQWQtPlN0YUNmZy5iQmxvY2tBc3NvYyAmJiAocEFkLT5TdGFDZmcuTGFzdE1pY0Vycm9yVGltZSArICg2MCAqIE9TX0haKSA8IHBBZC0+TWxtZS5Ob3czMikpCisgICAgCQlwQWQtPlN0YUNmZy5iQmxvY2tBc3NvYyA9IEZBTFNFOworICAgIH0KKworICAgIGlmICgocEFkLT5QcmVNZWRpYVN0YXRlICE9IHBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlKSAmJiAocEFkLT5Db21tb25DZmcuYldpcmVsZXNzRXZlbnQpKQorCXsKKwkJaWYgKHBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID09IE5kaXNNZWRpYVN0YXRlQ29ubmVjdGVkKQorCQl7CisJCQlSVE1QU2VuZFdpcmVsZXNzRXZlbnQocEFkLCBJV19TVEFfTElOS1VQX0VWRU5UX0ZMQUcsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQWRkciwgQlNTMCwgMCk7CisJCX0KKwkJcEFkLT5QcmVNZWRpYVN0YXRlID0gcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGU7CisJfQorCisKKworCisgICAJQXNpY1N0YUJicFR1bmluZyhwQWQpOworCisJVHhUb3RhbENudCA9IHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhOb1JldHJ5T2tDb3VudCArCisJCQkJCSBwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4UmV0cnlPa0NvdW50ICsKKwkJCQkJIHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhGYWlsQ291bnQ7CisKKwlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpKQorCXsKKwkJLy8gdXBkYXRlIGNoYW5uZWwgcXVhbGl0eSBmb3IgUm9hbWluZyBhbmQgVUkgTGlua1F1YWxpdHkgZGlzcGxheQorCQlNbG1lQ2FsY3VsYXRlQ2hhbm5lbFF1YWxpdHkocEFkLCBwQWQtPk1sbWUuTm93MzIpOworCX0KKworCS8vIG11c3QgYmUgQUZURVIgTWxtZUR5bmFtaWNUeFJhdGVTd2l0Y2hpbmcoKSBiZWNhdXNlIGl0IG5lZWRzIHRvIGtub3cgaWYKKwkvLyBSYWRpbyBpcyBjdXJyZW50bHkgaW4gbm9pc3kgZW52aXJvbm1lbnQKKwlpZiAoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUykpCisJCUFzaWNBZGp1c3RUeFBvd2VyKHBBZCk7CisKKwlpZiAoSU5GUkFfT04ocEFkKSkKKwl7CisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJCS8vIENoZWNrIERMUyB0aW1lIG91dCwgdGhlbiB0ZWFyIGRvd24gdGhvc2Ugc2Vzc2lvbgorCQlSVE1QQ2hlY2tETFNUaW1lT3V0KHBBZCk7CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisKKwkJLy8gSXMgUFNNIGJpdCBjb25zaXN0ZW50IHdpdGggdXNlciBwb3dlciBtYW5hZ2VtZW50IHBvbGljeT8KKwkJLy8gVGhpcyBpcyB0aGUgb25seSBwbGFjZSB0aGF0IHdpbGwgc2V0IFBTTSBiaXQgT04uCisJCWlmICghT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKSkKKwkJTWxtZUNoZWNrUHNtQ2hhbmdlKHBBZCwgcEFkLT5NbG1lLk5vdzMyKTsKKworCQlwQWQtPlJhbGlua0NvdW50ZXJzLkxhc3RPbmVTZWNUb3RhbFR4Q291bnQgPSBUeFRvdGFsQ250OworCisJCWlmICgocEFkLT5TdGFDZmcuTGFzdEJlYWNvblJ4VGltZSArIDEqT1NfSFogPCBwQWQtPk1sbWUuTm93MzIpICYmCisJCQkoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUykpICYmCisJCQkoKFR4VG90YWxDbnQgKyBwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1J4T2tDbnQgPCA2MDApKSkKKwkJeworCQkJUlRNUFNldEFHQ0luaXRWYWx1ZShwQWQsIEJXXzIwKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1NQ0hLIC0gTm8gQkVBQ09OLiByZXN0b3JlIFI2NiB0byB0aGUgbG93IGJvdW5kKCVkKSBcbiIsICgweDJFICsgR0VUX0xOQV9HQUlOKHBBZCkpKSk7CisJCX0KKworICAgICAgICAvL2lmICgocEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeE5vUmV0cnlPa0NvdW50ID09IDApICYmCisgICAgICAgIC8vICAgIChwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4UmV0cnlPa0NvdW50ID09IDApKQorICAgICAgICB7CisgICAgCQlpZiAocEFkLT5Db21tb25DZmcuYkFQU0RDYXBhYmxlICYmIHBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uYkFQU0RDYXBhYmxlKQorICAgIAkJeworICAgIAkJICAgIC8vIFdoZW4gQVBTRCBpcyBlbmFibGVkLCB0aGUgcGVyaW9kIGNoYW5nZXMgYXMgMjAgc2VjCisgICAgCQkJaWYgKChwQWQtPk1sbWUuT25lU2VjUGVyaW9kaWNSb3VuZCAlIDIwKSA9PSA4KQorICAgIAkJCQlSVE1QU2VuZE51bGxGcmFtZShwQWQsIHBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZSwgVFJVRSk7CisgICAgCQl9CisgICAgCQllbHNlCisgICAgCQl7CisgICAgCQkgICAgLy8gU2VuZCBvdXQgYSBOVUxMIGZyYW1lIGV2ZXJ5IDEwIHNlYyB0byBpbmZvcm0gQVAgdGhhdCBTVEEgaXMgc3RpbGwgYWxpdmUgKEF2b2lkIGJlaW5nIGFnZSBvdXQpCisgICAgCQkJaWYgKChwQWQtPk1sbWUuT25lU2VjUGVyaW9kaWNSb3VuZCAlIDEwKSA9PSA4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBBZC0+Q29tbW9uQ2ZnLmJXbW1DYXBhYmxlKQorICAgIAkJCQkJUlRNUFNlbmROdWxsRnJhbWUocEFkLCBwQWQtPkNvbW1vbkNmZy5UeFJhdGUsIFRSVUUpOworICAgICAgICAgICAgICAgICAgICBlbHNlCisJCQkJCQlSVE1QU2VuZE51bGxGcmFtZShwQWQsIHBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZSwgRkFMU0UpOworICAgICAgICAgICAgICAgIH0KKyAgICAJCX0KKyAgICAgICAgfQorCisJCWlmIChDUUlfSVNfREVBRChwQWQtPk1sbWUuQ2hhbm5lbFF1YWxpdHkpKQorCQkJeworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTU1DSEsgLSBObyBCRUFDT04uIERlYWQgQ1FJLiBBdXRvIFJlY292ZXJ5IGF0dGVtcHQgIyVsZFxuIiwgcEFkLT5SYWxpbmtDb3VudGVycy5CYWRDUUlBdXRvUmVjb3ZlcnlDb3VudCkpOworCQkJcEFkLT5TdGFDZmcuQ0NYQWRqYWNlbnRBUFJlcG9ydEZsYWcgPSBUUlVFOworCQkJcEFkLT5TdGFDZmcuQ0NYQWRqYWNlbnRBUExpbmtEb3duVGltZSA9IHBBZC0+U3RhQ2ZnLkxhc3RCZWFjb25SeFRpbWU7CisKKwkJCS8vIExvc3QgQVAsIHNlbmQgZGlzY29ubmVjdCAmIGxpbmsgZG93biBldmVudAorCQkJTGlua0Rvd24ocEFkLCBGQUxTRSk7CisKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisjaWZuZGVmIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgICAgICAgICBpZiAocEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQKQorCQkJeworICAgICAgICAgICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgICAgd3JxdTsKKyAgICAgICAgICAgICAgICAvL3NlbmQgZGlzYXNzb2NpYXRlIGV2ZW50IHRvIHdwYV9zdXBwbGljYW50CisgICAgICAgICAgICAgICAgbWVtc2V0KCZ3cnF1LCAwLCBzaXplb2Yod3JxdSkpOworICAgICAgICAgICAgICAgIHdycXUuZGF0YS5mbGFncyA9IFJUX0RJU0FTU09DX0VWRU5UX0ZMQUc7CisgICAgICAgICAgICAgICAgd2lyZWxlc3Nfc2VuZF9ldmVudChwQWQtPm5ldF9kZXYsIElXRVZDVVNUT00sICZ3cnF1LCBOVUxMKTsKKyAgICAgICAgICAgIH0KKyNlbmRpZiAvLyBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKworI2lmZGVmIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdW5pb24gaXdyZXFfZGF0YSAgICB3cnF1OworICAgICAgICAgICAgICAgIG1lbXNldCh3cnF1LmFwX2FkZHIuc2FfZGF0YSwgMCwgTUFDX0FERFJfTEVOKTsKKyAgICAgICAgICAgICAgICB3aXJlbGVzc19zZW5kX2V2ZW50KHBBZC0+bmV0X2RldiwgU0lPQ0dJV0FQLCAmd3JxdSwgTlVMTCk7CisgICAgICAgICAgICB9CisjZW5kaWYgLy8gTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKworCQkJLy8gUlRNUFBhdGNoTWFjQmJwQnVnKHBBZCk7CisJCQlNbG1lQXV0b1JlY29ubmVjdExhc3RTU0lEKHBBZCk7CisJCX0KKwkJZWxzZSBpZiAoQ1FJX0lTX0JBRChwQWQtPk1sbWUuQ2hhbm5lbFF1YWxpdHkpKQorCQl7CisJCQlwQWQtPlJhbGlua0NvdW50ZXJzLkJhZENRSUF1dG9SZWNvdmVyeUNvdW50ICsrOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTU1DSEsgLSBCYWQgQ1FJLiBBdXRvIFJlY292ZXJ5IGF0dGVtcHQgIyVsZFxuIiwgcEFkLT5SYWxpbmtDb3VudGVycy5CYWRDUUlBdXRvUmVjb3ZlcnlDb3VudCkpOworCQkJTWxtZUF1dG9SZWNvbm5lY3RMYXN0U1NJRChwQWQpOworCQl9CisKKwkJLy8gQWRkIGF1dG8gc2VhbWxlc3Mgcm9hbWluZworCQlpZiAocEFkLT5TdGFDZmcuYkZhc3RSb2FtaW5nKQorCQl7CisJCQlTSE9SVAlkQm1Ub1JvYW0gPSAoU0hPUlQpcEFkLT5TdGFDZmcuZEJtVG9Sb2FtOworCisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSc3NpPSVkLCBkQm1Ub1JvYW09JWRcbiIsIFJUTVBNYXhSc3NpKHBBZCwgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTAsIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kxLCBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMiksIChDSEFSKWRCbVRvUm9hbSkpOworCisJCQlpZiAoUlRNUE1heFJzc2kocEFkLCBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMCwgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTEsIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kyKSA8PSAoQ0hBUilkQm1Ub1JvYW0pCisJCQl7CisJCQkJTWxtZUNoZWNrRm9yRmFzdFJvYW1pbmcocEFkLCBwQWQtPk1sbWUuTm93MzIpOworCQkJfQorCQl9CisJfQorCWVsc2UgaWYgKEFESE9DX09OKHBBZCkpCisJeworCQkvL3JhZGFyIGRldGVjdAorCQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPiAxNCkKKwkJCSYmIChwQWQtPkNvbW1vbkNmZy5iSUVFRTgwMjExSCA9PSAxKQorCQkJJiYgUmFkYXJDaGFubmVsQ2hlY2socEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKSkKKwkJeworCQkJUmFkYXJEZXRlY3RQZXJpb2RpYyhwQWQpOworCQl9CisKKwkJLy8gSWYgYWxsIHBlZXJzIGxlYXZlLCBhbmQgdGhpcyBTVEEgYmVjb21lcyB0aGUgbGFzdCBvbmUgaW4gdGhpcyBJQlNTLCB0aGVuIGNoYW5nZSBNZWRpYVN0YXRlCisJCS8vIHRvIERJU0NPTk5FQ1RFRC4gQnV0IHN0aWxsIGhvbGRpbmcgdGhpcyBJQlNTIChpLmUuIHNlbmRpbmcgQkVBQ09OKSBzbyB0aGF0IG90aGVyIFNUQXMgY2FuCisJCS8vIGpvaW4gbGF0ZXIuCisJCWlmICgocEFkLT5TdGFDZmcuTGFzdEJlYWNvblJ4VGltZSArIEFESE9DX0JFQUNPTl9MT1NUX1RJTUUgPCBwQWQtPk1sbWUuTm93MzIpICYmCisJCQlPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCkpCisJCXsKKwkJCU1MTUVfU1RBUlRfUkVRX1NUUlVDVCAgICAgU3RhcnRSZXE7CisKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1NQ0hLIC0gZXhjZXNzaXZlIEJFQUNPTiBsb3N0LCBsYXN0IFNUQSBpbiB0aGlzIElCU1MsIE1lZGlhU3RhdGU9RGlzY29ubmVjdGVkXG4iKSk7CisJCQlMaW5rRG93bihwQWQsIEZBTFNFKTsKKworCQkJU3RhcnRQYXJtRmlsbChwQWQsICZTdGFydFJlcSwgcEFkLT5NbG1lQXV4LlNzaWQsIHBBZC0+TWxtZUF1eC5Tc2lkTGVuKTsKKwkJCU1sbWVFbnF1ZXVlKHBBZCwgU1lOQ19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9TVEFSVF9SRVEsIHNpemVvZihNTE1FX1NUQVJUX1JFUV9TVFJVQ1QpLCAmU3RhcnRSZXEpOworCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9TVEFSVDsKKwkJfQorCisJCWZvciAoaSA9IDE7IGkgPCBNQVhfTEVOX09GX01BQ19UQUJMRTsgaSsrKQorCQl7CisJCQlNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W2ldOworCisJCQlpZiAocEVudHJ5LT5WYWxpZEFzQ0xJID09IEZBTFNFKQorCQkJCWNvbnRpbnVlOworCisJCQlpZiAocEVudHJ5LT5MYXN0QmVhY29uUnhUaW1lICsgQURIT0NfQkVBQ09OX0xPU1RfVElNRSA8IHBBZC0+TWxtZS5Ob3czMikKKwkJCQlNYWNUYWJsZURlbGV0ZUVudHJ5KHBBZCwgcEVudHJ5LT5BaWQsIHBFbnRyeS0+QWRkcik7CisJCX0KKwl9CisJZWxzZSAvLyBubyBJTkZSQSBub3IgQURIT0MgY29ubmVjdGlvbgorCXsKKworCQlpZiAocEFkLT5TdGFDZmcuYlNjYW5SZXFJc0Zyb21XZWJVSSAmJgorICAgICAgICAgICAgKChwQWQtPlN0YUNmZy5MYXN0U2NhblRpbWUgKyAzMCAqIE9TX0haKSA+IHBBZC0+TWxtZS5Ob3czMikpCisJCQlnb3RvIFNLSVBfQVVUT19TQ0FOX0NPTk47CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHBBZC0+U3RhQ2ZnLmJTY2FuUmVxSXNGcm9tV2ViVUkgPSBGQUxTRTsKKworCQlpZiAoKHBBZC0+U3RhQ2ZnLmJBdXRvUmVjb25uZWN0ID09IFRSVUUpCisJCQkmJiBSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfU1RBUlRfVVApCisJCQkmJiAoTWxtZVZhbGlkYXRlU1NJRChwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWQsIHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbikgPT0gVFJVRSkpCisJCXsKKwkJCWlmICgocEFkLT5TY2FuVGFiLkJzc05yPT0wKSAmJiAocEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9PSBDTlRMX0lETEUpKQorCQkJeworCQkJCU1MTUVfU0NBTl9SRVFfU1RSVUNUCSAgIFNjYW5SZXE7CisKKwkJCQlpZiAoKHBBZC0+U3RhQ2ZnLkxhc3RTY2FuVGltZSArIDEwICogT1NfSFopIDwgcEFkLT5NbG1lLk5vdzMyKQorCQkJCXsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU1RBTWxtZVBlcmlvZGljRXhlYygpOkNOVEwgLSBTY2FuVGFiLkJzc05yPT0wLCBzdGFydCBhIG5ldyBBQ1RJVkUgc2NhbiBTU0lEWyVzXVxuIiwgcEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkKSk7CisJCQkJCVNjYW5QYXJtRmlsbChwQWQsICZTY2FuUmVxLCBwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWQsIHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbiwgQlNTX0FOWSwgU0NBTl9BQ1RJVkUpOworCQkJCQlNbG1lRW5xdWV1ZShwQWQsIFNZTkNfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfU0NBTl9SRVEsIHNpemVvZihNTE1FX1NDQU5fUkVRX1NUUlVDVCksICZTY2FuUmVxKTsKKwkJCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9PSURfTElTVF9TQ0FOOworCQkJCQkvLyBSZXNldCBNaXNzZWQgc2NhbiBudW1iZXIKKwkJCQkJcEFkLT5TdGFDZmcuTGFzdFNjYW5UaW1lID0gcEFkLT5NbG1lLk5vdzMyOworCQkJCX0KKwkJCQllbHNlIGlmIChwQWQtPlN0YUNmZy5Cc3NUeXBlID09IEJTU19BREhPQykJLy8gUXVpdCB0aGUgZm9yZXZlciBzY2FuIHdoZW4gaW4gYSB2ZXJ5IGNsZWFuIHJvb20KKwkJCQkJTWxtZUF1dG9SZWNvbm5lY3RMYXN0U1NJRChwQWQpOworCQkJfQorCQkJZWxzZSBpZiAocEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9PSBDTlRMX0lETEUpCisJCQl7CisJCQkJaWYgKChwQWQtPk1sbWUuT25lU2VjUGVyaW9kaWNSb3VuZCAlIDcpID09IDApCisJCQkJeworCQkJCQlNbG1lQXV0b1NjYW4ocEFkKTsKKwkJCQkJcEFkLT5TdGFDZmcuTGFzdFNjYW5UaW1lID0gcEFkLT5NbG1lLk5vdzMyOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworI2lmZGVmIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQgLy8gUm9nZXIgc3luYyBDYXJyaWVyCisJCQkJCWlmIChwQWQtPkNvbW1vbkNmZy5DYXJyaWVyRGV0ZWN0LkVuYWJsZSA9PSBUUlVFKQorCQkJCQl7CisJCQkJCQlpZiAoKHBBZC0+TWxtZS5PbmVTZWNQZXJpb2RpY1JvdW5kICUgNSkgPT0gMSkKKwkJCQkJCQlNbG1lQXV0b1JlY29ubmVjdExhc3RTU0lEKHBBZCk7CisJCQkJCX0KKwkJCQkJZWxzZQorI2VuZGlmIC8vIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQgLy8KKwkJCQkJCU1sbWVBdXRvUmVjb25uZWN0TGFzdFNTSUQocEFkKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKK1NLSVBfQVVUT19TQ0FOX0NPTk46CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKyAgICBpZiAoKHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uVFhCQWJpdG1hcCAhPTApICYmIChwQWQtPk1hY1RhYi5mQW55QkFTZXNzaW9uID09IEZBTFNFKSkKKwl7CisJCXBBZC0+TWFjVGFiLmZBbnlCQVNlc3Npb24gPSBUUlVFOworCQlBc2ljVXBkYXRlUHJvdGVjdChwQWQsIEhUX0ZPUkNFUlRTQ1RTLCAgQUxMTl9TRVRQUk9URUNULCBGQUxTRSwgRkFMU0UpOworCX0KKwllbHNlIGlmICgocEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5UWEJBYml0bWFwID09MCkgJiYgKHBBZC0+TWFjVGFiLmZBbnlCQVNlc3Npb24gPT0gVFJVRSkpCisJeworCQlwQWQtPk1hY1RhYi5mQW55QkFTZXNzaW9uID0gRkFMU0U7CisJCUFzaWNVcGRhdGVQcm90ZWN0KHBBZCwgcEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLk9wZXJhaW9uTW9kZSwgIEFMTE5fU0VUUFJPVEVDVCwgRkFMU0UsIEZBTFNFKTsKKwl9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorI2lmZGVmIERPVDExTl9EUkFGVDMKKwlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19TQ0FOXzIwNDApKQorCQlUcmlFdmVudENvdW50ZXJNYWludGVuYW5jZShwQWQpOworI2VuZGlmIC8vIERPVDExTl9EUkFGVDMgLy8KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCXJldHVybjsKK30KKworLy8gTGluayBkb3duIHJlcG9ydAorVk9JRCBMaW5rRG93bkV4ZWMoCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKQoreworCisJUlRNUF9BREFQVEVSICpwQWQgPSAoUlRNUF9BREFQVEVSICopRnVuY3Rpb25Db250ZXh0OworCisJcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZURpc2Nvbm5lY3RlZDsKKwlSVE1QX0luZGljYXRlTWVkaWFTdGF0ZShwQWQpOworICAgIHBBZC0+RXh0cmFJbmZvID0gR0VORVJBTF9MSU5LX0RPV047Cit9CisKKy8vIElSUUwgPSBESVNQQVRDSF9MRVZFTAorVk9JRCBNbG1lQXV0b1NjYW4oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJLy8gY2hlY2sgQ250bE1hY2hpbmUuQ3VyclN0YXRlIHRvIGF2b2lkIGNvbGxpc2lvbiB3aXRoIE5ESVMgU2V0T0lEIHJlcXVlc3QKKwlpZiAocEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9PSBDTlRMX0lETEUpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNTUNISyAtIERyaXZlciBhdXRvIHNjYW5cbiIpKTsKKwkJTWxtZUVucXVldWUocEFkLAorCQkJCQlNTE1FX0NOVExfU1RBVEVfTUFDSElORSwKKwkJCQkJT0lEXzgwMl8xMV9CU1NJRF9MSVNUX1NDQU4sCisJCQkJCTAsCisJCQkJCU5VTEwpOworCQlSVDI4WFhfTUxNRV9IQU5ETEVSKHBBZCk7CisJfQorfQorCisvLyBJUlFMID0gRElTUEFUQ0hfTEVWRUwKK1ZPSUQgTWxtZUF1dG9SZWNvbm5lY3RMYXN0U1NJRCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKworCisJLy8gY2hlY2sgQ250bE1hY2hpbmUuQ3VyclN0YXRlIHRvIGF2b2lkIGNvbGxpc2lvbiB3aXRoIE5ESVMgU2V0T0lEIHJlcXVlc3QKKwlpZiAoKHBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPT0gQ05UTF9JRExFKSAmJgorCQkoTWxtZVZhbGlkYXRlU1NJRChwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWQsIHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbikgPT0gVFJVRSkpCisJeworCQlORElTXzgwMl8xMV9TU0lEIE9pZFNzaWQ7CisJCU9pZFNzaWQuU3NpZExlbmd0aCA9IHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbjsKKwkJTmRpc01vdmVNZW1vcnkoT2lkU3NpZC5Tc2lkLCBwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWQsIHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbik7CisKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiRHJpdmVyIGF1dG8gcmVjb25uZWN0IHRvIGxhc3QgT0lEXzgwMl8xMV9TU0lEIHNldHRpbmcgLSAlcywgbGVuIC0gJWRcbiIsIHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZCwgcEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuKSk7CisJCU1sbWVFbnF1ZXVlKHBBZCwKKwkJCQkJTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsCisJCQkJCU9JRF84MDJfMTFfU1NJRCwKKwkJCQkJc2l6ZW9mKE5ESVNfODAyXzExX1NTSUQpLAorCQkJCQkmT2lkU3NpZCk7CisJCVJUMjhYWF9NTE1FX0hBTkRMRVIocEFkKTsKKwl9Cit9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlWYWxpZGF0ZSBTU0lEIGZvciBjb25uZWN0aW9uIHRyeSBhbmQgcmVzY2FuIHB1cnBvc2UKKwlWYWxpZCBTU0lEIHdpbGwgaGF2ZSB2aXNpYmxlIGNoYXJzIG9ubHkuCisJVGhlIHZhbGlkIGxlbmd0aCBpcyBmcm9tIDAgdG8gMzIuCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworQk9PTEVBTiBNbG1lVmFsaWRhdGVTU0lEKAorCUlOIFBVQ0hBUglwU3NpZCwKKwlJTiBVQ0hBUglTc2lkTGVuKQoreworCWludAlpbmRleDsKKworCWlmIChTc2lkTGVuID4gTUFYX0xFTl9PRl9TU0lEKQorCQlyZXR1cm4gKEZBTFNFKTsKKworCS8vIENoZWNrIGVhY2ggY2hhcmFjdGVyIHZhbHVlCisJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgU3NpZExlbjsgaW5kZXgrKykKKwl7CisJCWlmIChwU3NpZFtpbmRleF0gPCAweDIwKQorCQkJcmV0dXJuIChGQUxTRSk7CisJfQorCisJLy8gQWxsIGNoZWNrZWQKKwlyZXR1cm4gKFRSVUUpOworfQorCitWT0lEIE1sbWVTZWxlY3RUeFJhdGVUYWJsZSgKKwlJTiBQUlRNUF9BREFQVEVSCQlwQWQsCisJSU4gUE1BQ19UQUJMRV9FTlRSWQkJcEVudHJ5LAorCUlOIFBVQ0hBUgkJCQkqcHBUYWJsZSwKKwlJTiBQVUNIQVIJCQkJcFRhYmxlU2l6ZSwKKwlJTiBQVUNIQVIJCQkJcEluaXRUeFJhdGVJZHgpCit7CisJZG8KKwl7CisJCS8vIGRlY2lkZSB0aGUgcmF0ZSB0YWJsZSBmb3IgdHVuaW5nCisJCWlmIChwQWQtPkNvbW1vbkNmZy5UeFJhdGVUYWJsZVNpemUgPiAwKQorCQl7CisJCQkqcHBUYWJsZSA9IFJhdGVTd2l0Y2hUYWJsZTsKKwkJCSpwVGFibGVTaXplID0gUmF0ZVN3aXRjaFRhYmxlWzBdOworCQkJKnBJbml0VHhSYXRlSWR4ID0gUmF0ZVN3aXRjaFRhYmxlWzFdOworCisJCQlicmVhazsKKwkJfQorCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCWlmICgocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkgJiYgQURIT0NfT04ocEFkKSkKKwkJeworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJaWYgKChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID49IFBIWV8xMUFCR05fTUlYRUQpICYmCisJCQkJKHBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFswXSA9PSAweGZmKSAmJgorCQkJCSgocEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzFdID09IDB4MDApIHx8IChwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoID09IDEpKSkKKwkJCXsvLyAxMU4gMVMgQWRob2MKKwkJCQkqcHBUYWJsZSA9IFJhdGVTd2l0Y2hUYWJsZTExTjFTOworCQkJCSpwVGFibGVTaXplID0gUmF0ZVN3aXRjaFRhYmxlMTFOMVNbMF07CisJCQkJKnBJbml0VHhSYXRlSWR4ID0gUmF0ZVN3aXRjaFRhYmxlMTFOMVNbMV07CisKKwkJCX0KKwkJCWVsc2UgaWYgKChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID49IFBIWV8xMUFCR05fTUlYRUQpICYmCisJCQkJCShwRW50cnktPkhUQ2FwYWJpbGl0eS5NQ1NTZXRbMF0gPT0gMHhmZikgJiYKKwkJCQkJKHBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFsxXSA9PSAweGZmKSAmJgorCQkJCQkocEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCA9PSAyKSkKKwkJCXsvLyAxMU4gMlMgQWRob2MKKwkJCQlpZiAocEFkLT5MYXRjaFJmUmVncy5DaGFubmVsIDw9IDE0KQorCQkJCXsKKwkJCQkJKnBwVGFibGUgPSBSYXRlU3dpdGNoVGFibGUxMU4yUzsKKwkJCQkJKnBUYWJsZVNpemUgPSBSYXRlU3dpdGNoVGFibGUxMU4yU1swXTsKKwkJCQkJKnBJbml0VHhSYXRlSWR4ID0gUmF0ZVN3aXRjaFRhYmxlMTFOMlNbMV07CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCSpwcFRhYmxlID0gUmF0ZVN3aXRjaFRhYmxlMTFOMlNGb3JBQmFuZDsKKwkJCQkJKnBUYWJsZVNpemUgPSBSYXRlU3dpdGNoVGFibGUxMU4yU0ZvckFCYW5kWzBdOworCQkJCQkqcEluaXRUeFJhdGVJZHggPSBSYXRlU3dpdGNoVGFibGUxMU4yU0ZvckFCYW5kWzFdOworCQkJCX0KKworCQkJfQorCQkJZWxzZQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQkJCWlmICgocEVudHJ5LT5SYXRlTGVuID09IDQpCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQkJCSYmIChwRW50cnktPkhUQ2FwYWJpbGl0eS5NQ1NTZXRbMF0gPT0gMCkgJiYgKHBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFsxXSA9PSAwKQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQkJCQkpCisJCQl7CisJCQkJKnBwVGFibGUgPSBSYXRlU3dpdGNoVGFibGUxMUI7CisJCQkJKnBUYWJsZVNpemUgPSBSYXRlU3dpdGNoVGFibGUxMUJbMF07CisJCQkJKnBJbml0VHhSYXRlSWR4ID0gUmF0ZVN3aXRjaFRhYmxlMTFCWzFdOworCisJCQl9CisJCQllbHNlIGlmIChwQWQtPkxhdGNoUmZSZWdzLkNoYW5uZWwgPD0gMTQpCisJCQl7CisJCQkJKnBwVGFibGUgPSBSYXRlU3dpdGNoVGFibGUxMUJHOworCQkJCSpwVGFibGVTaXplID0gUmF0ZVN3aXRjaFRhYmxlMTFCR1swXTsKKwkJCQkqcEluaXRUeFJhdGVJZHggPSBSYXRlU3dpdGNoVGFibGUxMUJHWzFdOworCisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJKnBwVGFibGUgPSBSYXRlU3dpdGNoVGFibGUxMUc7CisJCQkJKnBUYWJsZVNpemUgPSBSYXRlU3dpdGNoVGFibGUxMUdbMF07CisJCQkJKnBJbml0VHhSYXRlSWR4ID0gUmF0ZVN3aXRjaFRhYmxlMTFHWzFdOworCisJCQl9CisJCQlicmVhazsKKwkJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCS8vaWYgKChwQWQtPlN0YUFjdGl2ZS5TdXBSYXRlTGVuICsgcEFkLT5TdGFBY3RpdmUuRXh0UmF0ZUxlbiA9PSAxMikgJiYgKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uTUNTU2V0WzBdID09IDB4ZmYpICYmCisJCS8vCSgocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5NQ1NTZXRbMV0gPT0gMHgwMCkgfHwgKHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGggPT0gMSkpKQorCQlpZiAoKHBFbnRyeS0+UmF0ZUxlbiA9PSAxMikgJiYgKHBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFswXSA9PSAweGZmKSAmJgorCQkJKChwRW50cnktPkhUQ2FwYWJpbGl0eS5NQ1NTZXRbMV0gPT0gMHgwMCkgfHwgKHBBZC0+Q29tbW9uQ2ZnLlR4U3RyZWFtID09IDEpKSkKKwkJey8vIDExQkdOIDFTIEFQCisJCQkqcHBUYWJsZSA9IFJhdGVTd2l0Y2hUYWJsZTExQkdOMVM7CisJCQkqcFRhYmxlU2l6ZSA9IFJhdGVTd2l0Y2hUYWJsZTExQkdOMVNbMF07CisJCQkqcEluaXRUeFJhdGVJZHggPSBSYXRlU3dpdGNoVGFibGUxMUJHTjFTWzFdOworCisJCQlicmVhazsKKwkJfQorCisJCS8vZWxzZSBpZiAoKHBBZC0+U3RhQWN0aXZlLlN1cFJhdGVMZW4gKyBwQWQtPlN0YUFjdGl2ZS5FeHRSYXRlTGVuID09IDEyKSAmJiAocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5NQ1NTZXRbMF0gPT0gMHhmZikgJiYKKwkJLy8JKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uTUNTU2V0WzFdID09IDB4ZmYpICYmIChwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoID09IDIpKQorCQlpZiAoKHBFbnRyeS0+UmF0ZUxlbiA9PSAxMikgJiYgKHBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFswXSA9PSAweGZmKSAmJgorCQkJKHBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFsxXSA9PSAweGZmKSAmJiAocEFkLT5Db21tb25DZmcuVHhTdHJlYW0gPT0gMikpCisJCXsvLyAxMUJHTiAyUyBBUAorCQkJaWYgKHBBZC0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbCA8PSAxNCkKKwkJCXsKKwkJCQkqcHBUYWJsZSA9IFJhdGVTd2l0Y2hUYWJsZTExQkdOMlM7CisJCQkJKnBUYWJsZVNpemUgPSBSYXRlU3dpdGNoVGFibGUxMUJHTjJTWzBdOworCQkJCSpwSW5pdFR4UmF0ZUlkeCA9IFJhdGVTd2l0Y2hUYWJsZTExQkdOMlNbMV07CisKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQkqcHBUYWJsZSA9IFJhdGVTd2l0Y2hUYWJsZTExQkdOMlNGb3JBQmFuZDsKKwkJCQkqcFRhYmxlU2l6ZSA9IFJhdGVTd2l0Y2hUYWJsZTExQkdOMlNGb3JBQmFuZFswXTsKKwkJCQkqcEluaXRUeFJhdGVJZHggPSBSYXRlU3dpdGNoVGFibGUxMUJHTjJTRm9yQUJhbmRbMV07CisKKwkJCX0KKwkJCWJyZWFrOworCQl9CisKKwkJLy9lbHNlIGlmICgocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5NQ1NTZXRbMF0gPT0gMHhmZikgJiYgKChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLk1DU1NldFsxXSA9PSAweDAwKSB8fCAocEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCA9PSAxKSkpCisJCWlmICgocEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzBdID09IDB4ZmYpICYmICgocEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzFdID09IDB4MDApIHx8IChwQWQtPkNvbW1vbkNmZy5UeFN0cmVhbSA9PSAxKSkpCisJCXsvLyAxMU4gMVMgQVAKKwkJCSpwcFRhYmxlID0gUmF0ZVN3aXRjaFRhYmxlMTFOMVM7CisJCQkqcFRhYmxlU2l6ZSA9IFJhdGVTd2l0Y2hUYWJsZTExTjFTWzBdOworCQkJKnBJbml0VHhSYXRlSWR4ID0gUmF0ZVN3aXRjaFRhYmxlMTFOMVNbMV07CisKKwkJCWJyZWFrOworCQl9CisKKwkJLy9lbHNlIGlmICgocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5NQ1NTZXRbMF0gPT0gMHhmZikgJiYgKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uTUNTU2V0WzFdID09IDB4ZmYpICYmIChwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoID09IDIpKQorCQlpZiAoKHBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFswXSA9PSAweGZmKSAmJiAocEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzFdID09IDB4ZmYpICYmIChwQWQtPkNvbW1vbkNmZy5UeFN0cmVhbSA9PSAyKSkKKwkJey8vIDExTiAyUyBBUAorCQkJaWYgKHBBZC0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbCA8PSAxNCkKKwkJCXsKKwkJCSpwcFRhYmxlID0gUmF0ZVN3aXRjaFRhYmxlMTFOMlM7CisJCQkqcFRhYmxlU2l6ZSA9IFJhdGVTd2l0Y2hUYWJsZTExTjJTWzBdOworCQkJKnBJbml0VHhSYXRlSWR4ID0gUmF0ZVN3aXRjaFRhYmxlMTFOMlNbMV07CisgICAgICAgICAgICB9CisJCQllbHNlCisJCQl7CisJCQkJKnBwVGFibGUgPSBSYXRlU3dpdGNoVGFibGUxMU4yU0ZvckFCYW5kOworCQkJCSpwVGFibGVTaXplID0gUmF0ZVN3aXRjaFRhYmxlMTFOMlNGb3JBQmFuZFswXTsKKwkJCQkqcEluaXRUeFJhdGVJZHggPSBSYXRlU3dpdGNoVGFibGUxMU4yU0ZvckFCYW5kWzFdOworCQkJfQorCisJCQlicmVhazsKKwkJfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQkvL2Vsc2UgaWYgKChwQWQtPlN0YUFjdGl2ZS5TdXBSYXRlTGVuID09IDQpICYmIChwQWQtPlN0YUFjdGl2ZS5FeHRSYXRlTGVuID09IDApICYmIChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLk1DU1NldFswXSA9PSAwKSAmJiAocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5NQ1NTZXRbMV0gPT0gMCkpCisJCWlmICgocEVudHJ5LT5SYXRlTGVuID09IDQpCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQkmJiAocEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzBdID09IDApICYmIChwRW50cnktPkhUQ2FwYWJpbGl0eS5NQ1NTZXRbMV0gPT0gMCkKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJCSkKKwkJey8vIEIgb25seSBBUAorCQkJKnBwVGFibGUgPSBSYXRlU3dpdGNoVGFibGUxMUI7CisJCQkqcFRhYmxlU2l6ZSA9IFJhdGVTd2l0Y2hUYWJsZTExQlswXTsKKwkJCSpwSW5pdFR4UmF0ZUlkeCA9IFJhdGVTd2l0Y2hUYWJsZTExQlsxXTsKKworCQkJYnJlYWs7CisJCX0KKworCQkvL2Vsc2UgaWYgKChwQWQtPlN0YUFjdGl2ZS5TdXBSYXRlTGVuICsgcEFkLT5TdGFBY3RpdmUuRXh0UmF0ZUxlbiA+IDgpICYmIChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLk1DU1NldFswXSA9PSAwKSAmJiAocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5NQ1NTZXRbMV0gPT0gMCkpCisJCWlmICgocEVudHJ5LT5SYXRlTGVuID4gOCkKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCSYmIChwRW50cnktPkhUQ2FwYWJpbGl0eS5NQ1NTZXRbMF0gPT0gMCkgJiYgKHBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFsxXSA9PSAwKQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQkJKQorCQl7Ly8gQi9HICBtaXhlZCBBUAorCQkJKnBwVGFibGUgPSBSYXRlU3dpdGNoVGFibGUxMUJHOworCQkJKnBUYWJsZVNpemUgPSBSYXRlU3dpdGNoVGFibGUxMUJHWzBdOworCQkJKnBJbml0VHhSYXRlSWR4ID0gUmF0ZVN3aXRjaFRhYmxlMTFCR1sxXTsKKworCQkJYnJlYWs7CisJCX0KKworCQkvL2Vsc2UgaWYgKChwQWQtPlN0YUFjdGl2ZS5TdXBSYXRlTGVuICsgcEFkLT5TdGFBY3RpdmUuRXh0UmF0ZUxlbiA9PSA4KSAmJiAocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5NQ1NTZXRbMF0gPT0gMCkgJiYgKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uTUNTU2V0WzFdID09IDApKQorCQlpZiAoKHBFbnRyeS0+UmF0ZUxlbiA9PSA4KQorI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJJiYgKHBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFswXSA9PSAwKSAmJiAocEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzFdID09IDApCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCQkpCisJCXsvLyBHIG9ubHkgQVAKKwkJCSpwcFRhYmxlID0gUmF0ZVN3aXRjaFRhYmxlMTFHOworCQkJKnBUYWJsZVNpemUgPSBSYXRlU3dpdGNoVGFibGUxMUdbMF07CisJCQkqcEluaXRUeFJhdGVJZHggPSBSYXRlU3dpdGNoVGFibGUxMUdbMV07CisKKwkJCWJyZWFrOworCQl9CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJeworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJLy9lbHNlIGlmICgocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5NQ1NTZXRbMF0gPT0gMCkgJiYgKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uTUNTU2V0WzFdID09IDApKQorCQkJaWYgKChwRW50cnktPkhUQ2FwYWJpbGl0eS5NQ1NTZXRbMF0gPT0gMCkgJiYgKHBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFsxXSA9PSAwKSkKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJCXsJLy8gTGVnYWN5IG1vZGUKKwkJCQlpZiAocEFkLT5Db21tb25DZmcuTWF4VHhSYXRlIDw9IFJBVEVfMTEpCisJCQkJeworCQkJCQkqcHBUYWJsZSA9IFJhdGVTd2l0Y2hUYWJsZTExQjsKKwkJCQkJKnBUYWJsZVNpemUgPSBSYXRlU3dpdGNoVGFibGUxMUJbMF07CisJCQkJCSpwSW5pdFR4UmF0ZUlkeCA9IFJhdGVTd2l0Y2hUYWJsZTExQlsxXTsKKwkJCQl9CisJCQkJZWxzZSBpZiAoKHBBZC0+Q29tbW9uQ2ZnLk1heFR4UmF0ZSA+IFJBVEVfMTEpICYmIChwQWQtPkNvbW1vbkNmZy5NaW5UeFJhdGUgPiBSQVRFXzExKSkKKwkJCQl7CisJCQkJCSpwcFRhYmxlID0gUmF0ZVN3aXRjaFRhYmxlMTFHOworCQkJCQkqcFRhYmxlU2l6ZSA9IFJhdGVTd2l0Y2hUYWJsZTExR1swXTsKKwkJCQkJKnBJbml0VHhSYXRlSWR4ID0gUmF0ZVN3aXRjaFRhYmxlMTFHWzFdOworCisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCSpwcFRhYmxlID0gUmF0ZVN3aXRjaFRhYmxlMTFCRzsKKwkJCQkJKnBUYWJsZVNpemUgPSBSYXRlU3dpdGNoVGFibGUxMUJHWzBdOworCQkJCQkqcEluaXRUeFJhdGVJZHggPSBSYXRlU3dpdGNoVGFibGUxMUJHWzFdOworCQkJCX0KKwkJCQlicmVhazsKKwkJCX0KKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCWlmIChwQWQtPkxhdGNoUmZSZWdzLkNoYW5uZWwgPD0gMTQpCisJCQl7CisJCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLlR4U3RyZWFtID09IDEpCisJCQkJeworCQkJCQkqcHBUYWJsZSA9IFJhdGVTd2l0Y2hUYWJsZTExTjFTOworCQkJCQkqcFRhYmxlU2l6ZSA9IFJhdGVTd2l0Y2hUYWJsZTExTjFTWzBdOworCQkJCQkqcEluaXRUeFJhdGVJZHggPSBSYXRlU3dpdGNoVGFibGUxMU4xU1sxXTsKKwkJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCgiRFJTOiB1bmtvd24gbW9kZSxkZWZhdWx0IHVzZSAxMU4gMVMgQVAgXG4iKSk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCSpwcFRhYmxlID0gUmF0ZVN3aXRjaFRhYmxlMTFOMlM7CisJCQkJCSpwVGFibGVTaXplID0gUmF0ZVN3aXRjaFRhYmxlMTFOMlNbMF07CisJCQkJCSpwSW5pdFR4UmF0ZUlkeCA9IFJhdGVTd2l0Y2hUYWJsZTExTjJTWzFdOworCQkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsKCJEUlM6IHVua293biBtb2RlLGRlZmF1bHQgdXNlIDExTiAyUyBBUCBcbiIpKTsKKwkJCQl9CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLlR4U3RyZWFtID09IDEpCisJCQkJeworCQkJCQkqcHBUYWJsZSA9IFJhdGVTd2l0Y2hUYWJsZTExTjFTOworCQkJCQkqcFRhYmxlU2l6ZSA9IFJhdGVTd2l0Y2hUYWJsZTExTjFTWzBdOworCQkJCQkqcEluaXRUeFJhdGVJZHggPSBSYXRlU3dpdGNoVGFibGUxMU4xU1sxXTsKKwkJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCgiRFJTOiB1bmtvd24gbW9kZSxkZWZhdWx0IHVzZSAxMU4gMVMgQVAgXG4iKSk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCSpwcFRhYmxlID0gUmF0ZVN3aXRjaFRhYmxlMTFOMlNGb3JBQmFuZDsKKwkJCQkJKnBUYWJsZVNpemUgPSBSYXRlU3dpdGNoVGFibGUxMU4yU0ZvckFCYW5kWzBdOworCQkJCQkqcEluaXRUeFJhdGVJZHggPSBSYXRlU3dpdGNoVGFibGUxMU4yU0ZvckFCYW5kWzFdOworCQkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsKCJEUlM6IHVua293biBtb2RlLGRlZmF1bHQgdXNlIDExTiAyUyBBUCBcbiIpKTsKKwkJCQl9CisJCQl9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsKCJEUlM6IHVua293biBtb2RlIChTdXBSYXRlTGVuPSVkLCBFeHRSYXRlTGVuPSVkLCBNQ1NTZXRbMF09MHgleCwgTUNTU2V0WzFdPTB4JXgpXG4iLAorCQkJCXBBZC0+U3RhQWN0aXZlLlN1cFJhdGVMZW4sIHBBZC0+U3RhQWN0aXZlLkV4dFJhdGVMZW4sIHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uTUNTU2V0WzBdLCBwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLk1DU1NldFsxXSkpOworCQl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJfSB3aGlsZShGQUxTRSk7Cit9CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJVGhpcyByb3V0aW5lIGNoZWNrcyBpZiB0aGVyZSdyZSBvdGhlciBBUHMgb3V0IHRoZXJlIGNhcGFibGUgZm9yCisJCXJvYW1pbmcuIENhbGxlciBzaG91bGQgY2FsbCB0aGlzIHJvdXRpbmUgb25seSB3aGVuIExpbmsgdXAgaW4gSU5GUkEgbW9kZQorCQlhbmQgY2hhbm5lbCBxdWFsaXR5IGlzIGJlbG93IENRSV9HT09EX1RIUkVTSE9MRC4KKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJT3V0cHV0OgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgTWxtZUNoZWNrRm9yUm9hbWluZygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVTE9ORwlOb3czMikKK3sKKwlVU0hPUlQJICAgaTsKKwlCU1NfVEFCTEUgICpwUm9hbVRhYiA9ICZwQWQtPk1sbWVBdXguUm9hbVRhYjsKKwlCU1NfRU5UUlkgICpwQnNzOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT0+IE1sbWVDaGVja0ZvclJvYW1pbmdcbiIpKTsKKwkvLyBwdXQgYWxsIHJvYW1pbmcgY2FuZGlkYXRlcyBpbnRvIFJvYW1UYWIsIGFuZCBzb3J0IGluIFJTU0kgb3JkZXIKKwlCc3NUYWJsZUluaXQocFJvYW1UYWIpOworCWZvciAoaSA9IDA7IGkgPCBwQWQtPlNjYW5UYWIuQnNzTnI7IGkrKykKKwl7CisJCXBCc3MgPSAmcEFkLT5TY2FuVGFiLkJzc0VudHJ5W2ldOworCisJCWlmICgocEJzcy0+TGFzdEJlYWNvblJ4VGltZSArIEJFQUNPTl9MT1NUX1RJTUUpIDwgTm93MzIpCisJCQljb250aW51ZTsJIC8vIEFQIGRpc2FwcGVhcgorCQlpZiAocEJzcy0+UnNzaSA8PSBSU1NJX1RIUkVTSE9MRF9GT1JfUk9BTUlORykKKwkJCWNvbnRpbnVlOwkgLy8gUlNTSSB0b28gd2Vhay4gZm9yZ2V0IGl0LgorCQlpZiAoTUFDX0FERFJfRVFVQUwocEJzcy0+QnNzaWQsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKSkKKwkJCWNvbnRpbnVlOwkgLy8gc2tpcCBjdXJyZW50IEFQCisJCWlmIChwQnNzLT5Sc3NpIDwgKHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kwICsgUlNTSV9ERUxUQSkpCisJCQljb250aW51ZTsJIC8vIG9ubHkgQVAgd2l0aCBzdHJvbmdlciBSU1NJIGlzIGVsaWdpYmxlIGZvciByb2FtaW5nCisKKwkJLy8gQVAgcGFzc2luZyBhbGwgYWJvdmUgcnVsZXMgaXMgcHV0IGludG8gcm9hbWluZyBjYW5kaWRhdGUgdGFibGUKKwkJTmRpc01vdmVNZW1vcnkoJnBSb2FtVGFiLT5Cc3NFbnRyeVtwUm9hbVRhYi0+QnNzTnJdLCBwQnNzLCBzaXplb2YoQlNTX0VOVFJZKSk7CisJCXBSb2FtVGFiLT5Cc3NOciArPSAxOworCX0KKworCWlmIChwUm9hbVRhYi0+QnNzTnIgPiAwKQorCXsKKwkJLy8gY2hlY2sgQ250bE1hY2hpbmUuQ3VyclN0YXRlIHRvIGF2b2lkIGNvbGxpc2lvbiB3aXRoIE5ESVMgU2V0T0lEIHJlcXVlc3QKKwkJaWYgKHBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPT0gQ05UTF9JRExFKQorCQl7CisJCQlwQWQtPlJhbGlua0NvdW50ZXJzLlBvb3JDUUlSb2FtaW5nQ291bnQgKys7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNTUNISyAtIFJvYW1pbmcgYXR0ZW1wdCAjJWxkXG4iLCBwQWQtPlJhbGlua0NvdW50ZXJzLlBvb3JDUUlSb2FtaW5nQ291bnQpKTsKKwkJCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX1JPQU1JTkdfUkVRLCAwLCBOVUxMKTsKKwkJCVJUMjhYWF9NTE1FX0hBTkRMRVIocEFkKTsKKwkJfQorCX0KKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT0gTWxtZUNoZWNrRm9yUm9hbWluZygjIG9mIGNhbmRpZGF0ZT0gJWQpXG4iLHBSb2FtVGFiLT5Cc3NOcikpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVRoaXMgcm91dGluZSBjaGVja3MgaWYgdGhlcmUncmUgb3RoZXIgQVBzIG91dCB0aGVyZSBjYXBhYmxlIGZvcgorCQlyb2FtaW5nLiBDYWxsZXIgc2hvdWxkIGNhbGwgdGhpcyByb3V0aW5lIG9ubHkgd2hlbiBsaW5rIHVwIGluIElORlJBIG1vZGUKKwkJYW5kIGNoYW5uZWwgcXVhbGl0eSBpcyBiZWxvdyBDUUlfR09PRF9USFJFU0hPTEQuCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCU91dHB1dDoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIE1sbWVDaGVja0ZvckZhc3RSb2FtaW5nKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVMT05HCQkJTm93KQoreworCVVTSE9SVAkJaTsKKwlCU1NfVEFCTEUJKnBSb2FtVGFiID0gJnBBZC0+TWxtZUF1eC5Sb2FtVGFiOworCUJTU19FTlRSWQkqcEJzczsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PiBNbG1lQ2hlY2tGb3JGYXN0Um9hbWluZ1xuIikpOworCS8vIHB1dCBhbGwgcm9hbWluZyBjYW5kaWRhdGVzIGludG8gUm9hbVRhYiwgYW5kIHNvcnQgaW4gUlNTSSBvcmRlcgorCUJzc1RhYmxlSW5pdChwUm9hbVRhYik7CisJZm9yIChpID0gMDsgaSA8IHBBZC0+U2NhblRhYi5Cc3NOcjsgaSsrKQorCXsKKwkJcEJzcyA9ICZwQWQtPlNjYW5UYWIuQnNzRW50cnlbaV07CisKKyAgICAgICAgaWYgKChwQnNzLT5Sc3NpIDw9IC01MCkgJiYgKHBCc3MtPkNoYW5uZWwgPT0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkpCisJCQljb250aW51ZTsJIC8vIFJTU0kgdG9vIHdlYWsuIGZvcmdldCBpdC4KKwkJaWYgKE1BQ19BRERSX0VRVUFMKHBCc3MtPkJzc2lkLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCkpCisJCQljb250aW51ZTsJIC8vIHNraXAgY3VycmVudCBBUAorCQlpZiAoIVNTSURfRVFVQUwocEJzcy0+U3NpZCwgcEJzcy0+U3NpZExlbiwgcEFkLT5Db21tb25DZmcuU3NpZCwgcEFkLT5Db21tb25DZmcuU3NpZExlbikpCisJCQljb250aW51ZTsJIC8vIHNraXAgZGlmZmVyZW50IFNTSUQKKyAgICAgICAgaWYgKHBCc3MtPlJzc2kgPCAoUlRNUE1heFJzc2kocEFkLCBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMCwgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTEsIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kyKSArIFJTU0lfREVMVEEpKQorCQkJY29udGludWU7CSAvLyBza2lwIEFQIHdpdGhvdXQgYmV0dGVyIFJTU0kKKworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJMYXN0UnNzaTAgPSAlZCwgcEJzcy0+UnNzaSA9ICVkXG4iLCBSVE1QTWF4UnNzaShwQWQsIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kwLCBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMSwgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTIpLCBwQnNzLT5Sc3NpKSk7CisJCS8vIEFQIHBhc3NpbmcgYWxsIGFib3ZlIHJ1bGVzIGlzIHB1dCBpbnRvIHJvYW1pbmcgY2FuZGlkYXRlIHRhYmxlCisJCU5kaXNNb3ZlTWVtb3J5KCZwUm9hbVRhYi0+QnNzRW50cnlbcFJvYW1UYWItPkJzc05yXSwgcEJzcywgc2l6ZW9mKEJTU19FTlRSWSkpOworCQlwUm9hbVRhYi0+QnNzTnIgKz0gMTsKKwl9CisKKwlpZiAocFJvYW1UYWItPkJzc05yID4gMCkKKwl7CisJCS8vIGNoZWNrIENudGxNYWNoaW5lLkN1cnJTdGF0ZSB0byBhdm9pZCBjb2xsaXNpb24gd2l0aCBORElTIFNldE9JRCByZXF1ZXN0CisJCWlmIChwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID09IENOVExfSURMRSkKKwkJeworCQkJcEFkLT5SYWxpbmtDb3VudGVycy5Qb29yQ1FJUm9hbWluZ0NvdW50ICsrOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTU1DSEsgLSBSb2FtaW5nIGF0dGVtcHQgIyVsZFxuIiwgcEFkLT5SYWxpbmtDb3VudGVycy5Qb29yQ1FJUm9hbWluZ0NvdW50KSk7CisJCQlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9ST0FNSU5HX1JFUSwgMCwgTlVMTCk7CisJCQlSVDI4WFhfTUxNRV9IQU5ETEVSKHBBZCk7CisJCX0KKwl9CisJLy8gTWF5YmUgc2l0ZSBzdXJ2ZXkgcmVxdWlyZWQKKwllbHNlCisJeworCQlpZiAoKHBBZC0+U3RhQ2ZnLkxhc3RTY2FuVGltZSArIDEwICogMTAwMCkgPCBOb3cpCisJCXsKKwkJCS8vIGNoZWNrIENudGxNYWNoaW5lLkN1cnJTdGF0ZSB0byBhdm9pZCBjb2xsaXNpb24gd2l0aCBORElTIFNldE9JRCByZXF1ZXN0CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNTUNISyAtIFJvYW1pbmcsIE5vIGVsaWdhYmxlIGVudHJ5LCB0cnkgbmV3IHNjYW4hXG4iKSk7CisJCQlwQWQtPlN0YUNmZy5TY2FuQ250ID0gMjsKKwkJCXBBZC0+U3RhQ2ZnLkxhc3RTY2FuVGltZSA9IE5vdzsKKwkJCU1sbWVBdXRvU2NhbihwQWQpOworCQl9CisJfQorCisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPD09IE1sbWVDaGVja0ZvckZhc3RSb2FtaW5nIChCc3NOcj0lZClcbiIsIHBSb2FtVGFiLT5Cc3NOcikpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVRoaXMgcm91dGluZSBjYWxjdWxhdGVzIFR4UEVSLCBSeFBFUiBvZiB0aGUgcGFzdCBOLXNlYyBwZXJpb2QuIEFuZAorCQlhY2NvcmRpbmcgdG8gdGhlIGNhbGN1bGF0aW9uIHJlc3VsdCwgQ2hhbm5lbFF1YWxpdHkgaXMgY2FsY3VsYXRlZCBoZXJlCisJCXRvIGRlY2lkZSBpZiBjdXJyZW50IEFQIGlzIHN0aWxsIGRvaW5nIHRoZSBqb2IuCisKKwkJSWYgQ2hhbm5lbFF1YWxpdHkgaXMgbm90IGdvb2QsIGEgUk9BTWluZyBhdHRlbXB0IG1heSBiZSB0cmllZCBsYXRlci4KKwlPdXRwdXQ6CisJCVN0YUNmZy5DaGFubmVsUXVhbGl0eSAtIDAuLjEwMAorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwlOT1RFOiBUaGlzIHJvdXRpbmUgZGVjaWRlIGNoYW5ubGUgcXVhbGl0eSBiYXNlZCBvbiBSWCBDUkMgZXJyb3IgcmF0aW8uCisJCUNhbGxlciBzaG91bGQgbWFrZSBzdXJlIGEgZnVuY3Rpb24gY2FsbCB0byBOSUNVcGRhdGVSYXdDb3VudGVycyhwQWQpCisJCWlzIHBlcmZvcm1lZCByaWdodCBiZWZvcmUgdGhpcyByb3V0aW5lLCBzbyB0aGF0IHRoaXMgcm91dGluZSBjYW4gZGVjaWRlCisJCWNoYW5uZWwgcXVhbGl0eSBiYXNlZCBvbiB0aGUgbW9zdCB1cC10by1kYXRlIGluZm9ybWF0aW9uCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBNbG1lQ2FsY3VsYXRlQ2hhbm5lbFF1YWxpdHkoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVUxPTkcgTm93MzIpCit7CisJVUxPTkcgVHhPa0NudCwgVHhDbnQsIFR4UEVSLCBUeFBSUjsKKwlVTE9ORyBSeENudCwgUnhQRVI7CisJVUNIQVIgTm9yUnNzaTsKKwlDSEFSICBNYXhSc3NpOworCVVMT05HIEJlYWNvbkxvc3RUaW1lID0gQkVBQ09OX0xPU1RfVElNRTsKKworI2lmZGVmIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQgLy8gUm9nZXIgc3luYyBDYXJyaWVyCisJLy8gbG9uZ2VyIGJlYWNvbiBsb3N0IHRpbWUgd2hlbiBjYXJyaWVyIGRldGVjdGlvbiBlbmFibGVkCisJaWYgKHBBZC0+Q29tbW9uQ2ZnLkNhcnJpZXJEZXRlY3QuRW5hYmxlID09IFRSVUUpCisJeworCQlCZWFjb25Mb3N0VGltZSA9IEJFQUNPTl9MT1NUX1RJTUUgKyBCRUFDT05fTE9TVF9USU1FLzI7CisJfQorI2VuZGlmIC8vIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQgLy8KKworCU1heFJzc2kgPSBSVE1QTWF4UnNzaShwQWQsIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kwLCBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMSwgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTIpOworCisJLy8KKwkvLyBjYWxjdWxhdGUgVFggcGFja2V0IGVycm9yIHJhdGlvIGFuZCBUWCByZXRyeSByYXRpbyAtIGlmIHRvbyBmZXcgVFggc2FtcGxlcywgc2tpcCBUWCByZWxhdGVkIHN0YXRpc3RpY3MKKwkvLworCVR4T2tDbnQgPSBwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4Tm9SZXRyeU9rQ291bnQgKyBwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4UmV0cnlPa0NvdW50OworCVR4Q250ID0gVHhPa0NudCArIHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhGYWlsQ291bnQ7CisJaWYgKFR4Q250IDwgNSkKKwl7CisJCVR4UEVSID0gMDsKKwkJVHhQUlIgPSAwOworCX0KKwllbHNlCisJeworCQlUeFBFUiA9IChwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4RmFpbENvdW50ICogMTAwKSAvIFR4Q250OworCQlUeFBSUiA9ICgoVHhDbnQgLSBwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4Tm9SZXRyeU9rQ291bnQpICogMTAwKSAvIFR4Q250OworCX0KKworCS8vCisJLy8gY2FsY3VsYXRlIFJYIFBFUiAtIGRvbid0IHRha2UgUnhQRVIgaW50byBjb25zaWRlcmF0aW9uIGlmIHRvbyBmZXcgc2FtcGxlCisJLy8KKwlSeENudCA9IHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjUnhPa0NudCArIHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjUnhGY3NFcnJDbnQ7CisJaWYgKFJ4Q250IDwgNSkKKwkJUnhQRVIgPSAwOworCWVsc2UKKwkJUnhQRVIgPSAocEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNSeEZjc0VyckNudCAqIDEwMCkgLyBSeENudDsKKworCS8vCisJLy8gZGVjaWRlIENoYW5uZWxRdWFsaXR5IGJhc2VkIG9uOiAxKWxhc3QgQkVBQ09OIHJlY2VpdmVkIHRpbWUsIDIpbGFzdCBSU1NJLCAzKVR4UEVSLCBhbmQgNClSeFBFUgorCS8vCisJaWYgKElORlJBX09OKHBBZCkgJiYKKwkJKHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhOb1JldHJ5T2tDb3VudCA8IDIpICYmIC8vIG5vIGhlYXZ5IHRyYWZmaWMKKwkJKHBBZC0+U3RhQ2ZnLkxhc3RCZWFjb25SeFRpbWUgKyBCZWFjb25Mb3N0VGltZSA8IE5vdzMyKSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkJFQUNPTiBsb3N0ID4gJWxkIG1zZWMgd2l0aCBUeE9rQ250PSVsZCAtPiBDUUk9MFxuIiwgQmVhY29uTG9zdFRpbWUsIFR4T2tDbnQpKTsKKwkJcEFkLT5NbG1lLkNoYW5uZWxRdWFsaXR5ID0gMDsKKwl9CisJZWxzZQorCXsKKwkJLy8gTm9ybWFsaXplIFJzc2kKKwkJaWYgKE1heFJzc2kgPiAtNDApCisJCQlOb3JSc3NpID0gMTAwOworCQllbHNlIGlmIChNYXhSc3NpIDwgLTkwKQorCQkJTm9yUnNzaSA9IDA7CisJCWVsc2UKKwkJCU5vclJzc2kgPSAoTWF4UnNzaSArIDkwKSAqIDI7CisKKwkJLy8gQ2hhbm5lbFF1YWxpdHkgPSBXMSpSU1NJICsgVzIqVHhQUlIgKyBXMypSeFBFUgkgKFJTU0kgMC4uMTAwKSwgKFR4UEVSIDEwMC4uMCksIChSeFBFUiAxMDAuLjApCisJCXBBZC0+TWxtZS5DaGFubmVsUXVhbGl0eSA9IChSU1NJX1dFSUdIVElORyAqIE5vclJzc2kgKworCQkJCQkJCQkgICBUWF9XRUlHSFRJTkcgKiAoMTAwIC0gVHhQUlIpICsKKwkJCQkJCQkJICAgUlhfV0VJR0hUSU5HKiAoMTAwIC0gUnhQRVIpKSAvIDEwMDsKKwkJaWYgKHBBZC0+TWxtZS5DaGFubmVsUXVhbGl0eSA+PSAxMDApCisJCQlwQWQtPk1sbWUuQ2hhbm5lbFF1YWxpdHkgPSAxMDA7CisJfQorCit9CisKK1ZPSUQgTWxtZVNldFR4UmF0ZSgKKwlJTiBQUlRNUF9BREFQVEVSCQlwQWQsCisJSU4gUE1BQ19UQUJMRV9FTlRSWQkJcEVudHJ5LAorCUlOIFBSVE1QX1RYX1JBVEVfU1dJVENICXBUeFJhdGUpCit7CisJVUNIQVIJTWF4TW9kZSA9IE1PREVfT0ZETTsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCU1heE1vZGUgPSBNT0RFX0hUR1JFRU5GSUVMRDsKKworCWlmIChwVHhSYXRlLT5TVEJDICYmIChwQWQtPlN0YUNmZy5NYXhIVFBoeU1vZGUuZmllbGQuU1RCQykgJiYgKHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGggPT0gMikpCisJCXBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5TVEJDID0gU1RCQ19VU0U7CisJZWxzZQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQlwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuU1RCQyA9IFNUQkNfTk9ORTsKKworCWlmIChwVHhSYXRlLT5DdXJyTUNTIDwgTUNTX0FVVE8pCisJCXBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NQ1MgPSBwVHhSYXRlLT5DdXJyTUNTOworCisJaWYgKHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NQ1MgPiA3KQorCQlwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuU1RCQyA9IFNUQkNfTk9ORTsKKworICAgCWlmIChBREhPQ19PTihwQWQpKQorCXsKKwkJLy8gSWYgcGVlciBhZGhvYyBpcyBiLW9ubHkgbW9kZSwgd2UgY2FuJ3Qgc2VuZCAxMWcgcmF0ZS4KKwkJcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLlNob3J0R0kgPSBHSV84MDA7CisJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLlNUQkMJPSBTVEJDX05PTkU7CisKKwkJLy8KKwkJLy8gRm9yIEFkaG9jIE1PREVfQ0NLLCBkcml2ZXIgd2lsbCB1c2UgQWRob2NCT25seUpvaW5lZCBmbGFnIHRvIHJvbGwgYmFjayB0byBCIG9ubHkgaWYgbmVjZXNzYXJ5CisJCS8vCisJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1PREUJPSBwVHhSYXRlLT5Nb2RlOworCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5TaG9ydEdJCT0gcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLlNob3J0R0k7CisJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1DUwkJPSBwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTUNTOworCisJCS8vIFBhdGNoIHNwZWVkIGVycm9yIGluIHN0YXR1cyBwYWdlCisJCXBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NT0RFID0gcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTU9ERTsKKwl9CisJZWxzZQorCXsKKwkJaWYgKHBUeFJhdGUtPk1vZGUgPD0gTWF4TW9kZSkKKwkJCXBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NT0RFID0gcFR4UmF0ZS0+TW9kZTsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQlpZiAocFR4UmF0ZS0+U2hvcnRHSSAmJiAocEFkLT5TdGFDZmcuTWF4SFRQaHlNb2RlLmZpZWxkLlNob3J0R0kpKQorCQkJcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLlNob3J0R0kgPSBHSV80MDA7CisJCWVsc2UKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJCXBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5TaG9ydEdJID0gR0lfODAwOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCS8vIFJlZXhhbSBlYWNoIGJhbmR3aWR0aCdzIFNHSSBzdXBwb3J0LgorCQlpZiAocEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLlNob3J0R0kgPT0gR0lfNDAwKQorCQl7CisJCQlpZiAoKHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLkJXID09IEJXXzIwKSAmJiAoIUNMSUVOVF9TVEFUVVNfVEVTVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfU0dJMjBfQ0FQQUJMRSkpKQorCQkJCXBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5TaG9ydEdJID0gR0lfODAwOworCQkJaWYgKChwRW50cnktPkhUUGh5TW9kZS5maWVsZC5CVyA9PSBCV180MCkgJiYgKCFDTElFTlRfU1RBVFVTX1RFU1RfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX1NHSTQwX0NBUEFCTEUpKSkKKwkJCQlwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuU2hvcnRHSSA9IEdJXzgwMDsKKwkJfQorCisJCS8vIFR1cm4gUlRTL0NUUyByYXRlIHRvIDZNYnBzLgorCQlpZiAoKHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1DUyA9PSAwKSAmJiAocEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1DUyAhPSAwKSkKKwkJeworCQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTCQk9IHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NQ1M7CisJCQlpZiAocEFkLT5NYWNUYWIuZkFueUJBU2Vzc2lvbikKKwkJCXsKKwkJCQlBc2ljVXBkYXRlUHJvdGVjdChwQWQsIEhUX0ZPUkNFUlRTQ1RTLCBBTExOX1NFVFBST1RFQ1QsIFRSVUUsIChCT09MRUFOKXBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi5Ob25HZlByZXNlbnQpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCUFzaWNVcGRhdGVQcm90ZWN0KHBBZCwgcEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLk9wZXJhaW9uTW9kZSwgQUxMTl9TRVRQUk9URUNULCBUUlVFLCAoQk9PTEVBTilwQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzIuTm9uR2ZQcmVzZW50KTsKKwkJCX0KKwkJfQorCQllbHNlIGlmICgocEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTID09IDgpICYmIChwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTUNTICE9IDgpKQorCQl7CisJCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NQ1MJCT0gcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1DUzsKKwkJCWlmIChwQWQtPk1hY1RhYi5mQW55QkFTZXNzaW9uKQorCQkJeworCQkJCUFzaWNVcGRhdGVQcm90ZWN0KHBBZCwgSFRfRk9SQ0VSVFNDVFMsIEFMTE5fU0VUUFJPVEVDVCwgVFJVRSwgKEJPT0xFQU4pcEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLk5vbkdmUHJlc2VudCk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJQXNpY1VwZGF0ZVByb3RlY3QocEFkLCBwQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzIuT3BlcmFpb25Nb2RlLCBBTExOX1NFVFBST1RFQ1QsIFRSVUUsIChCT09MRUFOKXBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi5Ob25HZlByZXNlbnQpOworCQkJfQorCQl9CisJCWVsc2UgaWYgKChwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NQ1MgIT0gMCkgJiYgKHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NQ1MgPT0gMCkpCisJCXsKKwkJCUFzaWNVcGRhdGVQcm90ZWN0KHBBZCwgSFRfUlRTQ1RTXzZNLCBBTExOX1NFVFBST1RFQ1QsIFRSVUUsIChCT09MRUFOKXBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi5Ob25HZlByZXNlbnQpOworCisJCX0KKwkJZWxzZSBpZiAoKHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1DUyAhPSA4KSAmJiAocEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1DUyA9PSA4KSkKKwkJeworCQkJQXNpY1VwZGF0ZVByb3RlY3QocEFkLCBIVF9SVFNDVFNfNk0sIEFMTE5fU0VUUFJPVEVDVCwgVFJVRSwgKEJPT0xFQU4pcEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLk5vbkdmUHJlc2VudCk7CisJCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5TVEJDCT0gcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLlNUQkM7CisJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLlNob3J0R0kJPSBwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuU2hvcnRHSTsKKwkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTCQk9IHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NQ1M7CisJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1PREUJPSBwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTU9ERTsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJaWYgKChwQWQtPlN0YUNmZy5NYXhIVFBoeU1vZGUuZmllbGQuTU9ERSA9PSBNT0RFX0hUR1JFRU5GSUVMRCkgJiYKKwkJICAgIHBBZC0+V0lGSXRlc3RiZWQuYkdyZWVuRmllbGQpCisJCSAgICBwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9IVEdSRUVORklFTEQ7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJfQorCisJcEFkLT5MYXN0VHhSYXRlID0gKFVTSE9SVCkocEVudHJ5LT5IVFBoeU1vZGUud29yZCk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJVGhpcyByb3V0aW5lIGNhbGN1bGF0ZXMgdGhlIGFjdW11bGF0ZWQgVHhQRVIgb2YgZWF4aCBUeFJhdGUuIEFuZAorCQlhY2NvcmRpbmcgdG8gdGhlIGNhbGN1bGF0aW9uIHJlc3VsdCwgY2hhbmdlIENvbW1vbkNmZy5UeFJhdGUgd2hpY2gKKwkJaXMgdGhlIHN0YWJsZSBUWCBSYXRlIHdlIGV4cGVjdCB0aGUgUmFkaW8gc2l0dWF0aW9uIGNvdWxkIHN1c3RhaW5lZC4KKworCQlDb21tb25DZmcuVHhSYXRlIHdpbGwgY2hhbmdlIGR5bmFtaWNhbGx5IHdpdGhpbiB7UkFURV8xL1JBVEVfNiwgTWF4VHhSYXRlfQorCU91dHB1dDoKKwkJQ29tbW9uQ2ZnLlR4UmF0ZSAtCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCU5PVEU6CisJCWNhbGwgdGhpcyByb3V0aW5lIGV2ZXJ5IHNlY29uZAorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgTWxtZUR5bmFtaWNUeFJhdGVTd2l0Y2hpbmcoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJVUNIQVIJCQkJCVVwUmF0ZUlkeCA9IDAsIERvd25SYXRlSWR4ID0gMCwgQ3VyclJhdGVJZHg7CisJVUxPTkcJCQkJCWksIEFjY3VUeFRvdGFsQ250ID0gMCwgVHhUb3RhbENudDsKKwlVTE9ORwkJCQkJVHhFcnJvclJhdGlvID0gMDsKKwlCT09MRUFOCQkJCQliVHhSYXRlQ2hhbmdlZCwgYlVwZ3JhZGVRdWFsaXR5ID0gRkFMU0U7CisJUFJUTVBfVFhfUkFURV9TV0lUQ0gJcEN1cnJUeFJhdGUsIHBOZXh0VHhSYXRlID0gTlVMTDsKKwlQVUNIQVIJCQkJCXBUYWJsZTsKKwlVQ0hBUgkJCQkJVGFibGVTaXplID0gMDsKKwlVQ0hBUgkJCQkJSW5pdFR4UmF0ZUlkeCA9IDAsIFRyYWluVXAsIFRyYWluRG93bjsKKwlDSEFSCQkJCQlSc3NpLCBSc3NpT2Zmc2V0ID0gMDsKKwlUWF9TVEFfQ05UMV9TVFJVQwkJU3RhVHgxOworCVRYX1NUQV9DTlQwX1NUUlVDCQlUeFN0YUNudDA7CisJVUxPTkcJCQkJCVR4UmV0cmFuc21pdCA9IDAsIFR4U3VjY2VzcyA9IDAsIFR4RmFpbENvdW50ID0gMDsKKwlNQUNfVEFCTEVfRU5UUlkJCQkqcEVudHJ5OworCisjaWZkZWYgUkFMSU5LX0FURQorCWlmIChBVEVfT04ocEFkKSkKKwl7CisJCXJldHVybjsKKwl9CisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCisJLy8KKwkvLyB3YWxrIHRocm91Z2ggTUFDIHRhYmxlLCBzZWUgaWYgbmVlZCB0byBjaGFuZ2UgQVAncyBUWCByYXRlIHRvd2FyZCBlYWNoIGVudHJ5CisJLy8KKyAgIAlmb3IgKGkgPSAxOyBpIDwgTUFYX0xFTl9PRl9NQUNfVEFCTEU7IGkrKykKKwl7CisJCXBFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W2ldOworCisJCS8vIGNoZWNrIGlmIHRoaXMgZW50cnkgbmVlZCB0byBzd2l0Y2ggcmF0ZSBhdXRvbWF0aWNhbGx5CisJCWlmIChSVE1QQ2hlY2tFbnRyeUVuYWJsZUF1dG9SYXRlU3dpdGNoKHBBZCwgcEVudHJ5KSA9PSBGQUxTRSkKKwkJCWNvbnRpbnVlOworCisJCWlmICgocEFkLT5NYWNUYWIuU2l6ZSA9PSAxKSB8fCAocEVudHJ5LT5WYWxpZEFzRGxzKSkKKwkJeworCQkJUnNzaSA9IFJUTVBNYXhSc3NpKHBBZCwKKwkJCQkJCQkgICBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kwLAorCQkJCQkJCSAgIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTEsCisJCQkJCQkJICAgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMik7CisKKwkJCS8vIFVwZGF0ZSBzdGF0aXN0aWMgY291bnRlcgorCQkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9TVEFfQ05UMCwgJlR4U3RhQ250MC53b3JkKTsKKwkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfU1RBX0NOVDEsICZTdGFUeDEud29yZCk7CisJCQlwQWQtPmJVcGRhdGVCY25DbnREb25lID0gVFJVRTsKKwkJCVR4UmV0cmFuc21pdCA9IFN0YVR4MS5maWVsZC5UeFJldHJhbnNtaXQ7CisJCQlUeFN1Y2Nlc3MgPSBTdGFUeDEuZmllbGQuVHhTdWNjZXNzOworCQkJVHhGYWlsQ291bnQgPSBUeFN0YUNudDAuZmllbGQuVHhGYWlsQ291bnQ7CisJCQlUeFRvdGFsQ250ID0gVHhSZXRyYW5zbWl0ICsgVHhTdWNjZXNzICsgVHhGYWlsQ291bnQ7CisKKwkJCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhSZXRyeU9rQ291bnQgKz0gU3RhVHgxLmZpZWxkLlR4UmV0cmFuc21pdDsKKwkJCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhOb1JldHJ5T2tDb3VudCArPSBTdGFUeDEuZmllbGQuVHhTdWNjZXNzOworCQkJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeEZhaWxDb3VudCArPSBUeFN0YUNudDAuZmllbGQuVHhGYWlsQ291bnQ7CisJCQlwQWQtPldsYW5Db3VudGVycy5UcmFuc21pdHRlZEZyYWdtZW50Q291bnQudS5Mb3dQYXJ0ICs9IFN0YVR4MS5maWVsZC5UeFN1Y2Nlc3M7CisJCQlwQWQtPldsYW5Db3VudGVycy5SZXRyeUNvdW50LnUuTG93UGFydCArPSBTdGFUeDEuZmllbGQuVHhSZXRyYW5zbWl0OworCQkJcEFkLT5XbGFuQ291bnRlcnMuRmFpbGVkQ291bnQudS5Mb3dQYXJ0ICs9IFR4U3RhQ250MC5maWVsZC5UeEZhaWxDb3VudDsKKworCQkJLy8gaWYgbm8gdHJhZmZpYyBpbiB0aGUgcGFzdCAxLXNlYyBwZXJpb2QsIGRvbid0IGNoYW5nZSBUWCByYXRlLAorCQkJLy8gYnV0IGNsZWFyIGFsbCBiYWQgaGlzdG9yeS4gYmVjYXVzZSB0aGUgYmFkIGhpc3RvcnkgbWF5IGFmZmVjdCB0aGUgbmV4dAorCQkJLy8gQ2hhcmlvdCB0aHJvdWdocHV0IHRlc3QKKwkJCUFjY3VUeFRvdGFsQ250ID0gcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeE5vUmV0cnlPa0NvdW50ICsKKwkJCQkJCSBwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4UmV0cnlPa0NvdW50ICsKKwkJCQkJCSBwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4RmFpbENvdW50OworCisJCQlpZiAoVHhUb3RhbENudCkKKwkJCQlUeEVycm9yUmF0aW8gPSAoKFR4UmV0cmFuc21pdCArIFR4RmFpbENvdW50KSAqIDEwMCkgLyBUeFRvdGFsQ250OworCQl9CisJCWVsc2UKKwkJeworCQkJaWYgKElORlJBX09OKHBBZCkgJiYgKGkgPT0gMSkpCisJCQkJUnNzaSA9IFJUTVBNYXhSc3NpKHBBZCwKKwkJCQkJCQkJICAgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMCwKKwkJCQkJCQkJICAgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMSwKKwkJCQkJCQkJICAgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMik7CisJCQllbHNlCisJCQkJUnNzaSA9IFJUTVBNYXhSc3NpKHBBZCwKKwkJCQkJCQkJICAgcEVudHJ5LT5Sc3NpU2FtcGxlLkF2Z1Jzc2kwLAorCQkJCQkJCQkgICBwRW50cnktPlJzc2lTYW1wbGUuQXZnUnNzaTEsCisJCQkJCQkJCSAgIHBFbnRyeS0+UnNzaVNhbXBsZS5BdmdSc3NpMik7CisKKwkJCVR4VG90YWxDbnQgPSBwRW50cnktPk9uZVNlY1R4Tm9SZXRyeU9rQ291bnQgKworCQkJCSBwRW50cnktPk9uZVNlY1R4UmV0cnlPa0NvdW50ICsKKwkJCQkgcEVudHJ5LT5PbmVTZWNUeEZhaWxDb3VudDsKKworCQkJaWYgKFR4VG90YWxDbnQpCisJCQkJVHhFcnJvclJhdGlvID0gKChwRW50cnktPk9uZVNlY1R4UmV0cnlPa0NvdW50ICsgcEVudHJ5LT5PbmVTZWNUeEZhaWxDb3VudCkgKiAxMDApIC8gVHhUb3RhbENudDsKKwkJfQorCisJCUN1cnJSYXRlSWR4ID0gcEVudHJ5LT5DdXJyVHhSYXRlSW5kZXg7CisKKwkJTWxtZVNlbGVjdFR4UmF0ZVRhYmxlKHBBZCwgcEVudHJ5LCAmcFRhYmxlLCAmVGFibGVTaXplLCAmSW5pdFR4UmF0ZUlkeCk7CisKKwkJaWYgKEN1cnJSYXRlSWR4ID49IFRhYmxlU2l6ZSkKKwkJeworCQkJQ3VyclJhdGVJZHggPSBUYWJsZVNpemUgLSAxOworCQl9CisKKwkJLy8gV2hlbiBzd2l0Y2ggZnJvbSBGaXhlZCByYXRlIC0+IGF1dG8gcmF0ZSwgdGhlIFJFQUwgVFggcmF0ZSBtaWdodCBiZSBkaWZmZXJlbnQgZnJvbSBwQWQtPkNvbW1vbkNmZy5UeFJhdGVJbmRleC4KKwkJLy8gU28gbmVlZCB0byBzeW5jIGhlcmUuCisJCXBDdXJyVHhSYXRlID0gKFBSVE1QX1RYX1JBVEVfU1dJVENIKSAmcFRhYmxlWyhDdXJyUmF0ZUlkeCsxKSo1XTsKKwkJaWYgKChwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NQ1MgIT0gcEN1cnJUeFJhdGUtPkN1cnJNQ1MpCisJCQkvLyYmIChwQWQtPlN0YUNmZy5iQXV0b1R4UmF0ZVN3aXRjaCA9PSBUUlVFKQorCQkJKQorCQl7CisKKwkJCS8vIE5lZWQgdG8gc3luYyBSZWFsIFR4IHJhdGUgYW5kIG91ciByZWNvcmQuCisJCQkvLyBUaGVuIHJldHVybiBmb3IgbmV4dCBEUlMuCisJCQlwQ3VyclR4UmF0ZSA9IChQUlRNUF9UWF9SQVRFX1NXSVRDSCkgJnBUYWJsZVsoSW5pdFR4UmF0ZUlkeCsxKSo1XTsKKwkJCXBFbnRyeS0+Q3VyclR4UmF0ZUluZGV4ID0gSW5pdFR4UmF0ZUlkeDsKKwkJCU1sbWVTZXRUeFJhdGUocEFkLCBwRW50cnksIHBDdXJyVHhSYXRlKTsKKworCQkJLy8gcmVzZXQgYWxsIE9uZVNlY1R4IGNvdW50ZXJzCisJCQlSRVNFVF9PTkVfU0VDX1RYX0NOVChwRW50cnkpOworCQkJY29udGludWU7CisJCX0KKworCQkvLyBkZWNpZGUgdGhlIG5leHQgdXBncmFkZSByYXRlIGFuZCBkb3duZ3JhZGUgcmF0ZSwgaWYgYW55CisJCWlmICgoQ3VyclJhdGVJZHggPiAwKSAmJiAoQ3VyclJhdGVJZHggPCAoVGFibGVTaXplIC0gMSkpKQorCQl7CisJCQlVcFJhdGVJZHggPSBDdXJyUmF0ZUlkeCArIDE7CisJCQlEb3duUmF0ZUlkeCA9IEN1cnJSYXRlSWR4IC0xOworCQl9CisJCWVsc2UgaWYgKEN1cnJSYXRlSWR4ID09IDApCisJCXsKKwkJCVVwUmF0ZUlkeCA9IEN1cnJSYXRlSWR4ICsgMTsKKwkJCURvd25SYXRlSWR4ID0gQ3VyclJhdGVJZHg7CisJCX0KKwkJZWxzZSBpZiAoQ3VyclJhdGVJZHggPT0gKFRhYmxlU2l6ZSAtIDEpKQorCQl7CisJCQlVcFJhdGVJZHggPSBDdXJyUmF0ZUlkeDsKKwkJCURvd25SYXRlSWR4ID0gQ3VyclJhdGVJZHggLSAxOworCQl9CisKKwkJcEN1cnJUeFJhdGUgPSAoUFJUTVBfVFhfUkFURV9TV0lUQ0gpICZwVGFibGVbKEN1cnJSYXRlSWR4KzEpKjVdOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCWlmICgoUnNzaSA+IC02NSkgJiYgKHBDdXJyVHhSYXRlLT5Nb2RlID49IE1PREVfSFRNSVgpKQorCQl7CisJCQlUcmFpblVwCQk9IChwQ3VyclR4UmF0ZS0+VHJhaW5VcCArIChwQ3VyclR4UmF0ZS0+VHJhaW5VcCA+PiAxKSk7CisJCQlUcmFpbkRvd24JPSAocEN1cnJUeFJhdGUtPlRyYWluRG93biArIChwQ3VyclR4UmF0ZS0+VHJhaW5Eb3duID4+IDEpKTsKKwkJfQorCQllbHNlCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCXsKKwkJCVRyYWluVXAJCT0gcEN1cnJUeFJhdGUtPlRyYWluVXA7CisJCQlUcmFpbkRvd24JPSBwQ3VyclR4UmF0ZS0+VHJhaW5Eb3duOworCQl9CisKKwkJLy9wQWQtPkRyc0NvdW50ZXJzLkxhc3RUaW1lVHhSYXRlQ2hhbmdlQWN0aW9uID0gcEFkLT5EcnNDb3VudGVycy5MYXN0U2VjVHhSYXRlQ2hhbmdlQWN0aW9uOworCisJCS8vCisJCS8vIEtlZXAgdGhlIGxhc3QgdGltZSBUeFJhdGVDaGFuZ2VBY3Rpb24gc3RhdHVzLgorCQkvLworCQlwRW50cnktPkxhc3RUaW1lVHhSYXRlQ2hhbmdlQWN0aW9uID0gcEVudHJ5LT5MYXN0U2VjVHhSYXRlQ2hhbmdlQWN0aW9uOworCisKKworCQkvLworCQkvLyBDQVNFIDEuIHdoZW4gVFggc2FtcGxlcyBhcmUgZmV3ZXIgdGhhbiAxNSwgdGhlbiBkZWNpZGUgVFggcmF0ZSBzb2xlbHkgb24gUlNTSQorCQkvLyAgICAgICAgIChjcml0ZXJpYSBjb3BpZWQgZnJvbSBSVDI1MDAgZm9yIE5ldG9waWEgY2FzZSkKKwkJLy8KKwkJaWYgKFR4VG90YWxDbnQgPD0gMTUpCisJCXsKKwkJCUNIQVIJaWR4ID0gMDsKKwkJCVVDSEFSCVR4UmF0ZUlkeDsKKwkJCS8vVUNIQVIJTUNTMCA9IDAsIE1DUzEgPSAwLCBNQ1MyID0gMCwgTUNTMyA9IDAsIE1DUzQgPSAwLCBNQ1M3ID0gMCwgTUNTMTIgPSAwLCBNQ1MxMyA9IDAsIE1DUzE0ID0gMCwgTUNTMTUgPSAwOworCQkJVUNIQVIJTUNTMCA9IDAsIE1DUzEgPSAwLCBNQ1MyID0gMCwgTUNTMyA9IDAsIE1DUzQgPSAwLCAgTUNTNSA9MCwgTUNTNiA9IDAsIE1DUzcgPSAwOworCSAgICAgICAgVUNIQVIJTUNTMTIgPSAwLCBNQ1MxMyA9IDAsIE1DUzE0ID0gMCwgTUNTMTUgPSAwOworCQkJVUNIQVIJTUNTMjAgPSAwLCBNQ1MyMSA9IDAsIE1DUzIyID0gMCwgTUNTMjMgPSAwOyAvLyAzKjMKKworCQkJLy8gY2hlY2sgdGhlIGV4aXN0ZW5jZSBhbmQgaW5kZXggb2YgZWFjaCBuZWVkZWQgTUNTCisJCQl3aGlsZSAoaWR4IDwgcFRhYmxlWzBdKQorCQkJeworCQkJCXBDdXJyVHhSYXRlID0gKFBSVE1QX1RYX1JBVEVfU1dJVENIKSAmcFRhYmxlWyhpZHgrMSkqNV07CisKKwkJCQlpZiAocEN1cnJUeFJhdGUtPkN1cnJNQ1MgPT0gTUNTXzApCisJCQkJeworCQkJCQlNQ1MwID0gaWR4OworCQkJCX0KKwkJCQllbHNlIGlmIChwQ3VyclR4UmF0ZS0+Q3Vyck1DUyA9PSBNQ1NfMSkKKwkJCQl7CisJCQkJCU1DUzEgPSBpZHg7CisJCQkJfQorCQkJCWVsc2UgaWYgKHBDdXJyVHhSYXRlLT5DdXJyTUNTID09IE1DU18yKQorCQkJCXsKKwkJCQkJTUNTMiA9IGlkeDsKKwkJCQl9CisJCQkJZWxzZSBpZiAocEN1cnJUeFJhdGUtPkN1cnJNQ1MgPT0gTUNTXzMpCisJCQkJeworCQkJCQlNQ1MzID0gaWR4OworCQkJCX0KKwkJCQllbHNlIGlmIChwQ3VyclR4UmF0ZS0+Q3Vyck1DUyA9PSBNQ1NfNCkKKwkJCQl7CisJCQkJCU1DUzQgPSBpZHg7CisJCQkJfQorCSAgICAgICAgICAgIGVsc2UgaWYgKHBDdXJyVHhSYXRlLT5DdXJyTUNTID09IE1DU181KQorCSAgICAgICAgICAgIHsKKwkgICAgICAgICAgICAgICAgTUNTNSA9IGlkeDsKKwkgICAgICAgICAgICB9CisJICAgICAgICAgICAgZWxzZSBpZiAocEN1cnJUeFJhdGUtPkN1cnJNQ1MgPT0gTUNTXzYpCisJICAgICAgICAgICAgeworCSAgICAgICAgICAgICAgICBNQ1M2ID0gaWR4OworCSAgICAgICAgICAgIH0KKwkJCQkvL2Vsc2UgaWYgKHBDdXJyVHhSYXRlLT5DdXJyTUNTID09IE1DU183KQorCQkJCWVsc2UgaWYgKChwQ3VyclR4UmF0ZS0+Q3Vyck1DUyA9PSBNQ1NfNykgJiYgKHBDdXJyVHhSYXRlLT5TaG9ydEdJID09IEdJXzgwMCkpCS8vIHByZXZlbnQgdGhlIGhpZ2hlc3QgTUNTIHVzaW5nIHNob3J0IEdJIHdoZW4gMVQgYW5kIGxvdyB0aHJvdWdocHV0CisJCQkJeworCQkJCQlNQ1M3ID0gaWR4OworCQkJCX0KKwkJCQllbHNlIGlmIChwQ3VyclR4UmF0ZS0+Q3Vyck1DUyA9PSBNQ1NfMTIpCisJCQkJeworCQkJCQlNQ1MxMiA9IGlkeDsKKwkJCQl9CisJCQkJZWxzZSBpZiAocEN1cnJUeFJhdGUtPkN1cnJNQ1MgPT0gTUNTXzEzKQorCQkJCXsKKwkJCQkJTUNTMTMgPSBpZHg7CisJCQkJfQorCQkJCWVsc2UgaWYgKHBDdXJyVHhSYXRlLT5DdXJyTUNTID09IE1DU18xNCkKKwkJCQl7CisJCQkJCU1DUzE0ID0gaWR4OworCQkJCX0KKwkJCQkvL2Vsc2UgaWYgKChwQ3VyclR4UmF0ZS0+Q3Vyck1DUyA9PSBNQ1NfMTUpLyogJiYgKHBDdXJyVHhSYXRlLT5TaG9ydEdJID09IEdJXzgwMCkqLykJLy93ZSBob3BlIHRvIHVzZSBTaG9ydEdJIGFzIGluaXRpYWwgcmF0ZQorCQkJCWVsc2UgaWYgKChwQ3VyclR4UmF0ZS0+Q3Vyck1DUyA9PSBNQ1NfMTUpICYmIChwQ3VyclR4UmF0ZS0+U2hvcnRHSSA9PSBHSV84MDApKQkvL3dlIGhvcGUgdG8gdXNlIFNob3J0R0kgYXMgaW5pdGlhbCByYXRlLCBob3dldmVyIEF0aGVyb3MncyBjaGlwIGhhcyBidWdzIHdoZW4gc2hvcnQgR0kKKwkJCQl7CisJCQkJCU1DUzE1ID0gaWR4OworCQkJCX0KKwkJCQllbHNlIGlmIChwQ3VyclR4UmF0ZS0+Q3Vyck1DUyA9PSBNQ1NfMjApIC8vIDMqMworCQkJCXsKKwkJCQkJTUNTMjAgPSBpZHg7CisJCQkJfQorCQkJCWVsc2UgaWYgKHBDdXJyVHhSYXRlLT5DdXJyTUNTID09IE1DU18yMSkKKwkJCQl7CisJCQkJCU1DUzIxID0gaWR4OworCQkJCX0KKwkJCQllbHNlIGlmIChwQ3VyclR4UmF0ZS0+Q3Vyck1DUyA9PSBNQ1NfMjIpCisJCQkJeworCQkJCQlNQ1MyMiA9IGlkeDsKKwkJCQl9CisJCQkJZWxzZSBpZiAocEN1cnJUeFJhdGUtPkN1cnJNQ1MgPT0gTUNTXzIzKQorCQkJCXsKKwkJCQkJTUNTMjMgPSBpZHg7CisJCQkJfQorCQkJCWlkeCArKzsKKwkJCX0KKworCQkJaWYgKHBBZC0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbCA8PSAxNCkKKwkJCXsKKwkJCQlpZiAocEFkLT5OaWNDb25maWcyLmZpZWxkLkV4dGVybmFsTE5BRm9yRykKKwkJCQl7CisJCQkJCVJzc2lPZmZzZXQgPSAyOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlSc3NpT2Zmc2V0ID0gNTsKKwkJCQl9CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJaWYgKHBBZC0+TmljQ29uZmlnMi5maWVsZC5FeHRlcm5hbExOQUZvckEpCisJCQkJeworCQkJCQlSc3NpT2Zmc2V0ID0gNTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJUnNzaU9mZnNldCA9IDg7CisJCQkJfQorCQkJfQorI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJLyppZiAoTUNTMTUpKi8KKwkJCWlmICgocFRhYmxlID09IFJhdGVTd2l0Y2hUYWJsZTExQkdOM1MpIHx8CisJCQkJKHBUYWJsZSA9PSBSYXRlU3dpdGNoVGFibGUxMU4zUykgfHwKKwkJCQkocFRhYmxlID09IFJhdGVTd2l0Y2hUYWJsZSkpCisJCQl7Ly8gTiBtb2RlIHdpdGggMyBzdHJlYW0gLy8gMyozCisJCQkJaWYgKE1DUzIzICYmIChSc3NpID49IC03MCkpCisJCQkJCVR4UmF0ZUlkeCA9IE1DUzE1OworCQkJCWVsc2UgaWYgKE1DUzIyICYmIChSc3NpID49IC03MikpCisJCQkJCVR4UmF0ZUlkeCA9IE1DUzE0OworICAgICAgICAJICAgIGVsc2UgaWYgKE1DUzIxICYmIChSc3NpID49IC03NikpCisJCQkJCVR4UmF0ZUlkeCA9IE1DUzEzOworCQkJCWVsc2UgaWYgKE1DUzIwICYmIChSc3NpID49IC03OCkpCisJCQkJCVR4UmF0ZUlkeCA9IE1DUzEyOworCQkJZWxzZSBpZiAoTUNTNCAmJiAoUnNzaSA+PSAtODIpKQorCQkJCVR4UmF0ZUlkeCA9IE1DUzQ7CisJCQllbHNlIGlmIChNQ1MzICYmIChSc3NpID49IC04NCkpCisJCQkJVHhSYXRlSWR4ID0gTUNTMzsKKwkJCWVsc2UgaWYgKE1DUzIgJiYgKFJzc2kgPj0gLTg2KSkKKwkJCQlUeFJhdGVJZHggPSBNQ1MyOworCQkJZWxzZSBpZiAoTUNTMSAmJiAoUnNzaSA+PSAtODgpKQorCQkJCVR4UmF0ZUlkeCA9IE1DUzE7CisJCQllbHNlCisJCQkJVHhSYXRlSWR4ID0gTUNTMDsKKwkJfQorLy8JCWVsc2UgaWYgKChwVGFibGUgPT0gUmF0ZVN3aXRjaFRhYmxlMTFCR04yUykgfHwgKHBUYWJsZSA9PSBSYXRlU3dpdGNoVGFibGUxMUJHTjJTRm9yQUJhbmQpIHx8KHBUYWJsZSA9PSBSYXRlU3dpdGNoVGFibGUxMU4yUykgfHwocFRhYmxlID09IFJhdGVTd2l0Y2hUYWJsZTExTjJTRm9yQUJhbmQpIHx8IChwVGFibGUgPT0gUmF0ZVN3aXRjaFRhYmxlKSkKKwkJZWxzZSBpZiAoKHBUYWJsZSA9PSBSYXRlU3dpdGNoVGFibGUxMUJHTjJTKSB8fCAocFRhYmxlID09IFJhdGVTd2l0Y2hUYWJsZTExQkdOMlNGb3JBQmFuZCkgfHwocFRhYmxlID09IFJhdGVTd2l0Y2hUYWJsZTExTjJTKSB8fChwVGFibGUgPT0gUmF0ZVN3aXRjaFRhYmxlMTFOMlNGb3JBQmFuZCkpIC8vIDMqMworCQkJey8vIE4gbW9kZSB3aXRoIDIgc3RyZWFtCisJCQkJaWYgKE1DUzE1ICYmIChSc3NpID49ICgtNzArUnNzaU9mZnNldCkpKQorCQkJCQlUeFJhdGVJZHggPSBNQ1MxNTsKKwkJCQllbHNlIGlmIChNQ1MxNCAmJiAoUnNzaSA+PSAoLTcyK1Jzc2lPZmZzZXQpKSkKKwkJCQkJVHhSYXRlSWR4ID0gTUNTMTQ7CisJCQkJZWxzZSBpZiAoTUNTMTMgJiYgKFJzc2kgPj0gKC03NitSc3NpT2Zmc2V0KSkpCisJCQkJCVR4UmF0ZUlkeCA9IE1DUzEzOworCQkJCWVsc2UgaWYgKE1DUzEyICYmIChSc3NpID49ICgtNzgrUnNzaU9mZnNldCkpKQorCQkJCQlUeFJhdGVJZHggPSBNQ1MxMjsKKwkJCQllbHNlIGlmIChNQ1M0ICYmIChSc3NpID49ICgtODIrUnNzaU9mZnNldCkpKQorCQkJCQlUeFJhdGVJZHggPSBNQ1M0OworCQkJCWVsc2UgaWYgKE1DUzMgJiYgKFJzc2kgPj0gKC04NCtSc3NpT2Zmc2V0KSkpCisJCQkJCVR4UmF0ZUlkeCA9IE1DUzM7CisJCQkJZWxzZSBpZiAoTUNTMiAmJiAoUnNzaSA+PSAoLTg2K1Jzc2lPZmZzZXQpKSkKKwkJCQkJVHhSYXRlSWR4ID0gTUNTMjsKKwkJCQllbHNlIGlmIChNQ1MxICYmIChSc3NpID49ICgtODgrUnNzaU9mZnNldCkpKQorCQkJCQlUeFJhdGVJZHggPSBNQ1MxOworCQkJCWVsc2UKKwkJCQkJVHhSYXRlSWR4ID0gTUNTMDsKKwkJCX0KKwkJCWVsc2UgaWYgKChwVGFibGUgPT0gUmF0ZVN3aXRjaFRhYmxlMTFCR04xUykgfHwgKHBUYWJsZSA9PSBSYXRlU3dpdGNoVGFibGUxMU4xUykpCisJCQl7Ly8gTiBtb2RlIHdpdGggMSBzdHJlYW0KKwkJCQlpZiAoTUNTNyAmJiAoUnNzaSA+ICgtNzIrUnNzaU9mZnNldCkpKQorCQkJCQlUeFJhdGVJZHggPSBNQ1M3OworCQkJCWVsc2UgaWYgKE1DUzYgJiYgKFJzc2kgPiAoLTc0K1Jzc2lPZmZzZXQpKSkKKwkJCQkJVHhSYXRlSWR4ID0gTUNTNjsKKwkJCQllbHNlIGlmIChNQ1M1ICYmIChSc3NpID4gKC03NytSc3NpT2Zmc2V0KSkpCisJCQkJCVR4UmF0ZUlkeCA9IE1DUzU7CisJCQkJZWxzZSBpZiAoTUNTNCAmJiAoUnNzaSA+ICgtNzkrUnNzaU9mZnNldCkpKQorCQkJCQlUeFJhdGVJZHggPSBNQ1M0OworCQkJCWVsc2UgaWYgKE1DUzMgJiYgKFJzc2kgPiAoLTgxK1Jzc2lPZmZzZXQpKSkKKwkJCQkJVHhSYXRlSWR4ID0gTUNTMzsKKwkJCQllbHNlIGlmIChNQ1MyICYmIChSc3NpID4gKC04MytSc3NpT2Zmc2V0KSkpCisJCQkJCVR4UmF0ZUlkeCA9IE1DUzI7CisJCQkJZWxzZSBpZiAoTUNTMSAmJiAoUnNzaSA+ICgtODYrUnNzaU9mZnNldCkpKQorCQkJCQlUeFJhdGVJZHggPSBNQ1MxOworCQkJCWVsc2UKKwkJCQkJVHhSYXRlSWR4ID0gTUNTMDsKKwkJCX0KKwkJCWVsc2UKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJCXsvLyBMZWdhY3kgbW9kZQorCQkJCWlmIChNQ1M3ICYmIChSc3NpID4gLTcwKSkKKwkJCQkJVHhSYXRlSWR4ID0gTUNTNzsKKwkJCQllbHNlIGlmIChNQ1M2ICYmIChSc3NpID4gLTc0KSkKKwkJCQkJVHhSYXRlSWR4ID0gTUNTNjsKKwkJCQllbHNlIGlmIChNQ1M1ICYmIChSc3NpID4gLTc4KSkKKwkJCQkJVHhSYXRlSWR4ID0gTUNTNTsKKwkJCQllbHNlIGlmIChNQ1M0ICYmIChSc3NpID4gLTgyKSkKKwkJCQkJVHhSYXRlSWR4ID0gTUNTNDsKKwkJCQllbHNlIGlmIChNQ1M0ID09IDApCS8vIGZvciBCLW9ubHkgbW9kZQorCQkJCQlUeFJhdGVJZHggPSBNQ1MzOworCQkJCWVsc2UgaWYgKE1DUzMgJiYgKFJzc2kgPiAtODUpKQorCQkJCQlUeFJhdGVJZHggPSBNQ1MzOworCQkJCWVsc2UgaWYgKE1DUzIgJiYgKFJzc2kgPiAtODcpKQorCQkJCQlUeFJhdGVJZHggPSBNQ1MyOworCQkJCWVsc2UgaWYgKE1DUzEgJiYgKFJzc2kgPiAtOTApKQorCQkJCQlUeFJhdGVJZHggPSBNQ1MxOworCQkJCWVsc2UKKwkJCQkJVHhSYXRlSWR4ID0gTUNTMDsKKwkJCX0KKworCS8vCQlpZiAoVHhSYXRlSWR4ICE9IHBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZUluZGV4KQorCQkJeworCQkJCXBFbnRyeS0+Q3VyclR4UmF0ZUluZGV4ID0gVHhSYXRlSWR4OworCQkJCXBOZXh0VHhSYXRlID0gKFBSVE1QX1RYX1JBVEVfU1dJVENIKSAmcFRhYmxlWyhwRW50cnktPkN1cnJUeFJhdGVJbmRleCsxKSo1XTsKKwkJCQlNbG1lU2V0VHhSYXRlKHBBZCwgcEVudHJ5LCBwTmV4dFR4UmF0ZSk7CisJCQl9CisKKwkJCU5kaXNaZXJvTWVtb3J5KHBFbnRyeS0+VHhRdWFsaXR5LCBzaXplb2YoVVNIT1JUKSAqIE1BWF9TVEVQX09GX1RYX1JBVEVfU1dJVENIKTsKKwkJCU5kaXNaZXJvTWVtb3J5KHBFbnRyeS0+UEVSLCBzaXplb2YoVUNIQVIpICogTUFYX1NURVBfT0ZfVFhfUkFURV9TV0lUQ0gpOworCQkJcEVudHJ5LT5mTGFzdFNlY0FjY29yZGluZ1JTU0kgPSBUUlVFOworCQkJLy8gcmVzZXQgYWxsIE9uZVNlY1R4IGNvdW50ZXJzCisJCQlSRVNFVF9PTkVfU0VDX1RYX0NOVChwRW50cnkpOworCisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChwRW50cnktPmZMYXN0U2VjQWNjb3JkaW5nUlNTSSA9PSBUUlVFKQorCQl7CisJCQlwRW50cnktPmZMYXN0U2VjQWNjb3JkaW5nUlNTSSA9IEZBTFNFOworCQkJcEVudHJ5LT5MYXN0U2VjVHhSYXRlQ2hhbmdlQWN0aW9uID0gMDsKKwkJCS8vIHJlc2V0IGFsbCBPbmVTZWNUeCBjb3VudGVycworCQkJUkVTRVRfT05FX1NFQ19UWF9DTlQocEVudHJ5KTsKKworCQkJY29udGludWU7CisJCX0KKworCQlkbworCQl7CisJCQlCT09MRUFOCWJUcmFpblVwRG93biA9IEZBTFNFOworCisJCQlwRW50cnktPkN1cnJUeFJhdGVTdGFibGVUaW1lICsrOworCisJCQkvLyBkb3duZ3JhZGUgVFggcXVhbGl0eSBpZiBQRVIgPj0gUmF0ZS1Eb3duIHRocmVzaG9sZAorCQkJaWYgKFR4RXJyb3JSYXRpbyA+PSBUcmFpbkRvd24pCisJCQl7CisJCQkJYlRyYWluVXBEb3duID0gVFJVRTsKKwkJCQlwRW50cnktPlR4UXVhbGl0eVtDdXJyUmF0ZUlkeF0gPSBEUlNfVFhfUVVBTElUWV9XT1JTVF9CT1VORDsKKwkJCX0KKwkJCS8vIHVwZ3JhZGUgVFggcXVhbGl0eSBpZiBQRVIgPD0gUmF0ZS1VcCB0aHJlc2hvbGQKKwkJCWVsc2UgaWYgKFR4RXJyb3JSYXRpbyA8PSBUcmFpblVwKQorCQkJeworCQkJCWJUcmFpblVwRG93biA9IFRSVUU7CisJCQkJYlVwZ3JhZGVRdWFsaXR5ID0gVFJVRTsKKwkJCQlpZiAocEVudHJ5LT5UeFF1YWxpdHlbQ3VyclJhdGVJZHhdKQorCQkJCQlwRW50cnktPlR4UXVhbGl0eVtDdXJyUmF0ZUlkeF0gLS07ICAvLyBxdWFsaXR5IHZlcnkgZ29vZCBpbiBDdXJyUmF0ZQorCisJCQkJaWYgKHBFbnRyeS0+VHhSYXRlVXBQZW5hbHR5KQorCQkJCQlwRW50cnktPlR4UmF0ZVVwUGVuYWx0eSAtLTsKKwkJCQllbHNlIGlmIChwRW50cnktPlR4UXVhbGl0eVtVcFJhdGVJZHhdKQorCQkJCQlwRW50cnktPlR4UXVhbGl0eVtVcFJhdGVJZHhdIC0tOyAgICAvLyBtYXkgaW1wcm92ZSBuZXh0IFVQIHJhdGUncyBxdWFsaXR5CisJCQl9CisKKwkJCXBFbnRyeS0+UEVSW0N1cnJSYXRlSWR4XSA9IChVQ0hBUilUeEVycm9yUmF0aW87CisKKwkJCWlmIChiVHJhaW5VcERvd24pCisJCQl7CisJCQkJLy8gcGVyZm9ybSBEUlMgLSBjb25zaWRlciBUeFJhdGUgRG93biBmaXJzdCwgdGhlbiByYXRlIHVwLgorCQkJCWlmICgoQ3VyclJhdGVJZHggIT0gRG93blJhdGVJZHgpICYmIChwRW50cnktPlR4UXVhbGl0eVtDdXJyUmF0ZUlkeF0gPj0gRFJTX1RYX1FVQUxJVFlfV09SU1RfQk9VTkQpKQorCQkJCXsKKwkJCQkJcEVudHJ5LT5DdXJyVHhSYXRlSW5kZXggPSBEb3duUmF0ZUlkeDsKKwkJCQl9CisJCQkJZWxzZSBpZiAoKEN1cnJSYXRlSWR4ICE9IFVwUmF0ZUlkeCkgJiYgKHBFbnRyeS0+VHhRdWFsaXR5W1VwUmF0ZUlkeF0gPD0gMCkpCisJCQkJeworCQkJCQlwRW50cnktPkN1cnJUeFJhdGVJbmRleCA9IFVwUmF0ZUlkeDsKKwkJCQl9CisJCQl9CisJCX0gd2hpbGUgKEZBTFNFKTsKKworCQkvLyBpZiByYXRlLXVwIGhhcHBlbiwgY2xlYXIgYWxsIGJhZCBoaXN0b3J5IG9mIGFsbCBUWCByYXRlcworCQlpZiAocEVudHJ5LT5DdXJyVHhSYXRlSW5kZXggPiBDdXJyUmF0ZUlkeCkKKwkJeworCQkJcEVudHJ5LT5DdXJyVHhSYXRlU3RhYmxlVGltZSA9IDA7CisJCQlwRW50cnktPlR4UmF0ZVVwUGVuYWx0eSA9IDA7CisJCQlwRW50cnktPkxhc3RTZWNUeFJhdGVDaGFuZ2VBY3Rpb24gPSAxOyAvLyByYXRlIFVQCisJCQlOZGlzWmVyb01lbW9yeShwRW50cnktPlR4UXVhbGl0eSwgc2l6ZW9mKFVTSE9SVCkgKiBNQVhfU1RFUF9PRl9UWF9SQVRFX1NXSVRDSCk7CisJCQlOZGlzWmVyb01lbW9yeShwRW50cnktPlBFUiwgc2l6ZW9mKFVDSEFSKSAqIE1BWF9TVEVQX09GX1RYX1JBVEVfU1dJVENIKTsKKworCQkJLy8KKwkJCS8vIEZvciBUeFJhdGUgZmFzdCB0cmFpbiB1cAorCQkJLy8KKwkJCWlmICghcEFkLT5TdGFDZmcuU3RhUXVpY2tSZXNwb25lRm9yUmF0ZVVwVGltZXJSdW5uaW5nKQorCQkJeworCQkJCVJUTVBTZXRUaW1lcigmcEFkLT5TdGFDZmcuU3RhUXVpY2tSZXNwb25lRm9yUmF0ZVVwVGltZXIsIDEwMCk7CisKKwkJCQlwQWQtPlN0YUNmZy5TdGFRdWlja1Jlc3BvbmVGb3JSYXRlVXBUaW1lclJ1bm5pbmcgPSBUUlVFOworCQkJfQorCQkJYlR4UmF0ZUNoYW5nZWQgPSBUUlVFOworCQl9CisJCS8vIGlmIHJhdGUtZG93biBoYXBwZW4sIG9ubHkgY2xlYXIgRG93blJhdGUncyBiYWQgaGlzdG9yeQorCQllbHNlIGlmIChwRW50cnktPkN1cnJUeFJhdGVJbmRleCA8IEN1cnJSYXRlSWR4KQorCQl7CisJCQlwRW50cnktPkN1cnJUeFJhdGVTdGFibGVUaW1lID0gMDsKKwkJCXBFbnRyeS0+VHhSYXRlVXBQZW5hbHR5ID0gMDsgICAgICAgICAgIC8vIG5vIHBlbmFsdHkKKwkJCXBFbnRyeS0+TGFzdFNlY1R4UmF0ZUNoYW5nZUFjdGlvbiA9IDI7IC8vIHJhdGUgRE9XTgorCQkJcEVudHJ5LT5UeFF1YWxpdHlbcEVudHJ5LT5DdXJyVHhSYXRlSW5kZXhdID0gMDsKKwkJCXBFbnRyeS0+UEVSW3BFbnRyeS0+Q3VyclR4UmF0ZUluZGV4XSA9IDA7CisKKwkJCS8vCisJCQkvLyBGb3IgVHhSYXRlIGZhc3QgdHJhaW4gZG93bgorCQkJLy8KKwkJCWlmICghcEFkLT5TdGFDZmcuU3RhUXVpY2tSZXNwb25lRm9yUmF0ZVVwVGltZXJSdW5uaW5nKQorCQkJeworCQkJCVJUTVBTZXRUaW1lcigmcEFkLT5TdGFDZmcuU3RhUXVpY2tSZXNwb25lRm9yUmF0ZVVwVGltZXIsIDEwMCk7CisKKwkJCQlwQWQtPlN0YUNmZy5TdGFRdWlja1Jlc3BvbmVGb3JSYXRlVXBUaW1lclJ1bm5pbmcgPSBUUlVFOworCQkJfQorCQkJYlR4UmF0ZUNoYW5nZWQgPSBUUlVFOworCQl9CisJCWVsc2UKKwkJeworCQkJcEVudHJ5LT5MYXN0U2VjVHhSYXRlQ2hhbmdlQWN0aW9uID0gMDsgLy8gcmF0ZSBubyBjaGFuZ2UKKwkJCWJUeFJhdGVDaGFuZ2VkID0gRkFMU0U7CisJCX0KKworCQlwRW50cnktPkxhc3RUeE9rQ291bnQgPSBUeFN1Y2Nlc3M7CisKKwkJLy8gcmVzZXQgYWxsIE9uZVNlY1R4IGNvdW50ZXJzCisJCVJFU0VUX09ORV9TRUNfVFhfQ05UKHBFbnRyeSk7CisKKwkJcE5leHRUeFJhdGUgPSAoUFJUTVBfVFhfUkFURV9TV0lUQ0gpICZwVGFibGVbKHBFbnRyeS0+Q3VyclR4UmF0ZUluZGV4KzEpKjVdOworCQlpZiAoYlR4UmF0ZUNoYW5nZWQgJiYgcE5leHRUeFJhdGUpCisJCXsKKwkJCU1sbWVTZXRUeFJhdGUocEFkLCBwRW50cnksIHBOZXh0VHhSYXRlKTsKKwkJfQorCX0KK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlTdGF0aW9uIHNpZGUsIEF1dG8gVHhSYXRlIGZhc3RlciB0cmFpbiB1cCB0aW1lciBjYWxsIGJhY2sgZnVuY3Rpb24uCisKKwlBcmd1bWVudHM6CisJCVN5c3RlbVNwZWNpZmljMQkJCS0gTm90IHVzZWQuCisJCUZ1bmN0aW9uQ29udGV4dAkJCS0gUG9pbnRlciB0byBvdXIgQWRhcHRlciBjb250ZXh0LgorCQlTeXN0ZW1TcGVjaWZpYzIJCQktIE5vdCB1c2VkLgorCQlTeXN0ZW1TcGVjaWZpYzMJCQktIE5vdCB1c2VkLgorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIFN0YVF1aWNrUmVzcG9uZUZvclJhdGVVcEV4ZWMoCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKQoreworCVBSVE1QX0FEQVBURVIJCQlwQWQgPSAoUFJUTVBfQURBUFRFUilGdW5jdGlvbkNvbnRleHQ7CisJVUNIQVIJCQkJCVVwUmF0ZUlkeCA9IDAsIERvd25SYXRlSWR4ID0gMCwgQ3VyclJhdGVJZHggPSAwOworCVVMT05HCQkJCQlUeFRvdGFsQ250OworCVVMT05HCQkJCQlUeEVycm9yUmF0aW8gPSAwOworCUJPT0xFQU4JCQkJCWJUeFJhdGVDaGFuZ2VkOyAvLywgYlVwZ3JhZGVRdWFsaXR5ID0gRkFMU0U7CisJUFJUTVBfVFhfUkFURV9TV0lUQ0gJcEN1cnJUeFJhdGUsIHBOZXh0VHhSYXRlID0gTlVMTDsKKwlQVUNIQVIJCQkJCXBUYWJsZTsKKwlVQ0hBUgkJCQkJVGFibGVTaXplID0gMDsKKwlVQ0hBUgkJCQkJSW5pdFR4UmF0ZUlkeCA9IDAsIFRyYWluVXAsIFRyYWluRG93bjsKKwlUWF9TVEFfQ05UMV9TVFJVQwkJU3RhVHgxOworCVRYX1NUQV9DTlQwX1NUUlVDCQlUeFN0YUNudDA7CisJQ0hBUgkJCQkJUnNzaSwgcmF0aW87CisJVUxPTkcJCQkJCVR4UmV0cmFuc21pdCA9IDAsIFR4U3VjY2VzcyA9IDAsIFR4RmFpbENvdW50ID0gMDsKKwlNQUNfVEFCTEVfRU5UUlkJCQkqcEVudHJ5OworCVVMT05HCQkJCQlpOworCisJcEFkLT5TdGFDZmcuU3RhUXVpY2tSZXNwb25lRm9yUmF0ZVVwVGltZXJSdW5uaW5nID0gRkFMU0U7CisKKyAgICAvLworICAgIC8vIHdhbGsgdGhyb3VnaCBNQUMgdGFibGUsIHNlZSBpZiBuZWVkIHRvIGNoYW5nZSBBUCdzIFRYIHJhdGUgdG93YXJkIGVhY2ggZW50cnkKKyAgICAvLworCWZvciAoaSA9IDE7IGkgPCBNQVhfTEVOX09GX01BQ19UQUJMRTsgaSsrKQorCXsKKwkJcEVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbaV07CisKKwkJLy8gY2hlY2sgaWYgdGhpcyBlbnRyeSBuZWVkIHRvIHN3aXRjaCByYXRlIGF1dG9tYXRpY2FsbHkKKwkJaWYgKFJUTVBDaGVja0VudHJ5RW5hYmxlQXV0b1JhdGVTd2l0Y2gocEFkLCBwRW50cnkpID09IEZBTFNFKQorCQkJY29udGludWU7CisKKwkJaWYgKElORlJBX09OKHBBZCkgJiYgKGkgPT0gMSkpCisJCQlSc3NpID0gUlRNUE1heFJzc2kocEFkLAorCQkJCQkJCSAgIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTAsCisJCQkJCQkJICAgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMSwKKwkJCQkJCQkgICBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kyKTsKKwkJZWxzZQorCQkJUnNzaSA9IFJUTVBNYXhSc3NpKHBBZCwKKwkJCQkJCQkgICBwRW50cnktPlJzc2lTYW1wbGUuQXZnUnNzaTAsCisJCQkJCQkJICAgcEVudHJ5LT5Sc3NpU2FtcGxlLkF2Z1Jzc2kxLAorCQkJCQkJCSAgIHBFbnRyeS0+UnNzaVNhbXBsZS5BdmdSc3NpMik7CisKKwkJQ3VyclJhdGVJZHggPSBwQWQtPkNvbW1vbkNmZy5UeFJhdGVJbmRleDsKKworCQkJTWxtZVNlbGVjdFR4UmF0ZVRhYmxlKHBBZCwgcEVudHJ5LCAmcFRhYmxlLCAmVGFibGVTaXplLCAmSW5pdFR4UmF0ZUlkeCk7CisKKwkJLy8gZGVjaWRlIHRoZSBuZXh0IHVwZ3JhZGUgcmF0ZSBhbmQgZG93bmdyYWRlIHJhdGUsIGlmIGFueQorCQlpZiAoKEN1cnJSYXRlSWR4ID4gMCkgJiYgKEN1cnJSYXRlSWR4IDwgKFRhYmxlU2l6ZSAtIDEpKSkKKwkJeworCQkJVXBSYXRlSWR4ID0gQ3VyclJhdGVJZHggKyAxOworCQkJRG93blJhdGVJZHggPSBDdXJyUmF0ZUlkeCAtMTsKKwkJfQorCQllbHNlIGlmIChDdXJyUmF0ZUlkeCA9PSAwKQorCQl7CisJCQlVcFJhdGVJZHggPSBDdXJyUmF0ZUlkeCArIDE7CisJCQlEb3duUmF0ZUlkeCA9IEN1cnJSYXRlSWR4OworCQl9CisJCWVsc2UgaWYgKEN1cnJSYXRlSWR4ID09IChUYWJsZVNpemUgLSAxKSkKKwkJeworCQkJVXBSYXRlSWR4ID0gQ3VyclJhdGVJZHg7CisJCQlEb3duUmF0ZUlkeCA9IEN1cnJSYXRlSWR4IC0gMTsKKwkJfQorCisJCXBDdXJyVHhSYXRlID0gKFBSVE1QX1RYX1JBVEVfU1dJVENIKSAmcFRhYmxlWyhDdXJyUmF0ZUlkeCsxKSo1XTsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQlpZiAoKFJzc2kgPiAtNjUpICYmIChwQ3VyclR4UmF0ZS0+TW9kZSA+PSBNT0RFX0hUTUlYKSkKKwkJeworCQkJVHJhaW5VcAkJPSAocEN1cnJUeFJhdGUtPlRyYWluVXAgKyAocEN1cnJUeFJhdGUtPlRyYWluVXAgPj4gMSkpOworCQkJVHJhaW5Eb3duCT0gKHBDdXJyVHhSYXRlLT5UcmFpbkRvd24gKyAocEN1cnJUeFJhdGUtPlRyYWluRG93biA+PiAxKSk7CisJCX0KKwkJZWxzZQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQl7CisJCQlUcmFpblVwCQk9IHBDdXJyVHhSYXRlLT5UcmFpblVwOworCQkJVHJhaW5Eb3duCT0gcEN1cnJUeFJhdGUtPlRyYWluRG93bjsKKwkJfQorCisJCWlmIChwQWQtPk1hY1RhYi5TaXplID09IDEpCisJCXsKKwkJCS8vIFVwZGF0ZSBzdGF0aXN0aWMgY291bnRlcgorCQkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9TVEFfQ05UMCwgJlR4U3RhQ250MC53b3JkKTsKKwkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfU1RBX0NOVDEsICZTdGFUeDEud29yZCk7CisKKwkJCVR4UmV0cmFuc21pdCA9IFN0YVR4MS5maWVsZC5UeFJldHJhbnNtaXQ7CisJCQlUeFN1Y2Nlc3MgPSBTdGFUeDEuZmllbGQuVHhTdWNjZXNzOworCQkJVHhGYWlsQ291bnQgPSBUeFN0YUNudDAuZmllbGQuVHhGYWlsQ291bnQ7CisJCQlUeFRvdGFsQ250ID0gVHhSZXRyYW5zbWl0ICsgVHhTdWNjZXNzICsgVHhGYWlsQ291bnQ7CisKKwkJCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhSZXRyeU9rQ291bnQgKz0gU3RhVHgxLmZpZWxkLlR4UmV0cmFuc21pdDsKKwkJCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhOb1JldHJ5T2tDb3VudCArPSBTdGFUeDEuZmllbGQuVHhTdWNjZXNzOworCQkJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeEZhaWxDb3VudCArPSBUeFN0YUNudDAuZmllbGQuVHhGYWlsQ291bnQ7CisJCQlwQWQtPldsYW5Db3VudGVycy5UcmFuc21pdHRlZEZyYWdtZW50Q291bnQudS5Mb3dQYXJ0ICs9IFN0YVR4MS5maWVsZC5UeFN1Y2Nlc3M7CisJCQlwQWQtPldsYW5Db3VudGVycy5SZXRyeUNvdW50LnUuTG93UGFydCArPSBTdGFUeDEuZmllbGQuVHhSZXRyYW5zbWl0OworCQkJcEFkLT5XbGFuQ291bnRlcnMuRmFpbGVkQ291bnQudS5Mb3dQYXJ0ICs9IFR4U3RhQ250MC5maWVsZC5UeEZhaWxDb3VudDsKKworI2lmIDAgLy8gdGVzdCBieSBHYXJ5LgorCQkJLy8gaWYgbm8gdHJhZmZpYyBpbiB0aGUgcGFzdCAxLXNlYyBwZXJpb2QsIGRvbid0IGNoYW5nZSBUWCByYXRlLAorCQkJLy8gYnV0IGNsZWFyIGFsbCBiYWQgaGlzdG9yeS4gYmVjYXVzZSB0aGUgYmFkIGhpc3RvcnkgbWF5IGFmZmVjdCB0aGUgbmV4dAorCQkJLy8gQ2hhcmlvdCB0aHJvdWdocHV0IHRlc3QKKwkJCVR4VG90YWxDbnQgPSBwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4Tm9SZXRyeU9rQ291bnQgKworCQkJCQkJIHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhSZXRyeU9rQ291bnQgKworCQkJCQkJIHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhGYWlsQ291bnQ7CisjZW5kaWYKKwkJCWlmIChUeFRvdGFsQ250KQorCQkJCVR4RXJyb3JSYXRpbyA9ICgoVHhSZXRyYW5zbWl0ICsgVHhGYWlsQ291bnQpICogMTAwKSAvIFR4VG90YWxDbnQ7CisJCX0KKwkJZWxzZQorCQl7CisJCQlUeFRvdGFsQ250ID0gcEVudHJ5LT5PbmVTZWNUeE5vUmV0cnlPa0NvdW50ICsKKwkJCQkgcEVudHJ5LT5PbmVTZWNUeFJldHJ5T2tDb3VudCArCisJCQkJIHBFbnRyeS0+T25lU2VjVHhGYWlsQ291bnQ7CisKKwkJCWlmIChUeFRvdGFsQ250KQorCQkJCVR4RXJyb3JSYXRpbyA9ICgocEVudHJ5LT5PbmVTZWNUeFJldHJ5T2tDb3VudCArIHBFbnRyeS0+T25lU2VjVHhGYWlsQ291bnQpICogMTAwKSAvIFR4VG90YWxDbnQ7CisJCX0KKworCisJCS8vCisJCS8vIENBU0UgMS4gd2hlbiBUWCBzYW1wbGVzIGFyZSBmZXdlciB0aGFuIDE1LCB0aGVuIGRlY2lkZSBUWCByYXRlIHNvbGVseSBvbiBSU1NJCisJCS8vICAgICAgICAgKGNyaXRlcmlhIGNvcGllZCBmcm9tIFJUMjUwMCBmb3IgTmV0b3BpYSBjYXNlKQorCQkvLworCQlpZiAoVHhUb3RhbENudCA8PSAxMikKKwkJeworCQkJTmRpc1plcm9NZW1vcnkocEFkLT5EcnNDb3VudGVycy5UeFF1YWxpdHksIHNpemVvZihVU0hPUlQpICogTUFYX1NURVBfT0ZfVFhfUkFURV9TV0lUQ0gpOworCQkJTmRpc1plcm9NZW1vcnkocEFkLT5EcnNDb3VudGVycy5QRVIsIHNpemVvZihVQ0hBUikgKiBNQVhfU1RFUF9PRl9UWF9SQVRFX1NXSVRDSCk7CisKKwkJCWlmICgocEFkLT5EcnNDb3VudGVycy5MYXN0U2VjVHhSYXRlQ2hhbmdlQWN0aW9uID09IDEpICYmIChDdXJyUmF0ZUlkeCAhPSBEb3duUmF0ZUlkeCkpCisJCQl7CisJCQkJcEFkLT5Db21tb25DZmcuVHhSYXRlSW5kZXggPSBEb3duUmF0ZUlkeDsKKwkJCQlwQWQtPkRyc0NvdW50ZXJzLlR4UXVhbGl0eVtDdXJyUmF0ZUlkeF0gPSBEUlNfVFhfUVVBTElUWV9XT1JTVF9CT1VORDsKKwkJCX0KKwkJCWVsc2UgaWYgKChwQWQtPkRyc0NvdW50ZXJzLkxhc3RTZWNUeFJhdGVDaGFuZ2VBY3Rpb24gPT0gMikgJiYgKEN1cnJSYXRlSWR4ICE9IFVwUmF0ZUlkeCkpCisJCQl7CisJCQkJcEFkLT5Db21tb25DZmcuVHhSYXRlSW5kZXggPSBVcFJhdGVJZHg7CisJCQl9CisKKwkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwoIlF1aWNrRFJTOiBUeFRvdGFsQ250IDw9IDE1LCB0cmFpbiBiYWNrIHRvIG9yaWdpbmFsIHJhdGUgXG4iKSk7CisJCQlyZXR1cm47CisJCX0KKworCQlkbworCQl7CisJCQlVTE9ORyBPbmVTZWNUeE5vUmV0cnlPS1JhdGlvbkNvdW50OworCisJCQlpZiAocEFkLT5EcnNDb3VudGVycy5MYXN0VGltZVR4UmF0ZUNoYW5nZUFjdGlvbiA9PSAwKQorCQkJCXJhdGlvID0gNTsKKwkJCWVsc2UKKwkJCQlyYXRpbyA9IDQ7CisKKwkJCS8vIGRvd25ncmFkZSBUWCBxdWFsaXR5IGlmIFBFUiA+PSBSYXRlLURvd24gdGhyZXNob2xkCisJCQlpZiAoVHhFcnJvclJhdGlvID49IFRyYWluRG93bikKKwkJCXsKKwkJCQlwQWQtPkRyc0NvdW50ZXJzLlR4UXVhbGl0eVtDdXJyUmF0ZUlkeF0gPSBEUlNfVFhfUVVBTElUWV9XT1JTVF9CT1VORDsKKwkJCX0KKworCQkJcEFkLT5EcnNDb3VudGVycy5QRVJbQ3VyclJhdGVJZHhdID0gKFVDSEFSKVR4RXJyb3JSYXRpbzsKKworCQkJT25lU2VjVHhOb1JldHJ5T0tSYXRpb25Db3VudCA9IChUeFN1Y2Nlc3MgKiByYXRpbyk7CisKKwkJCS8vIHBlcmZvcm0gRFJTIC0gY29uc2lkZXIgVHhSYXRlIERvd24gZmlyc3QsIHRoZW4gcmF0ZSB1cC4KKwkJCWlmICgocEFkLT5EcnNDb3VudGVycy5MYXN0U2VjVHhSYXRlQ2hhbmdlQWN0aW9uID09IDEpICYmIChDdXJyUmF0ZUlkeCAhPSBEb3duUmF0ZUlkeCkpCisJCQl7CisJCQkJaWYgKChwQWQtPkRyc0NvdW50ZXJzLkxhc3RUeE9rQ291bnQgKyAyKSA+PSBPbmVTZWNUeE5vUmV0cnlPS1JhdGlvbkNvdW50KQorCQkJCXsKKwkJCQkJcEFkLT5Db21tb25DZmcuVHhSYXRlSW5kZXggPSBEb3duUmF0ZUlkeDsKKwkJCQkJcEFkLT5EcnNDb3VudGVycy5UeFF1YWxpdHlbQ3VyclJhdGVJZHhdID0gRFJTX1RYX1FVQUxJVFlfV09SU1RfQk9VTkQ7CisKKwkJCQl9CisKKwkJCX0KKwkJCWVsc2UgaWYgKChwQWQtPkRyc0NvdW50ZXJzLkxhc3RTZWNUeFJhdGVDaGFuZ2VBY3Rpb24gPT0gMikgJiYgKEN1cnJSYXRlSWR4ICE9IFVwUmF0ZUlkeCkpCisJCQl7CisJCQkJaWYgKChUeEVycm9yUmF0aW8gPj0gNTApIHx8IChUeEVycm9yUmF0aW8gPj0gVHJhaW5Eb3duKSkKKwkJCQl7CisKKwkJCQl9CisJCQkJZWxzZSBpZiAoKHBBZC0+RHJzQ291bnRlcnMuTGFzdFR4T2tDb3VudCArIDIpID49IE9uZVNlY1R4Tm9SZXRyeU9LUmF0aW9uQ291bnQpCisJCQkJeworCQkJCQlwQWQtPkNvbW1vbkNmZy5UeFJhdGVJbmRleCA9IFVwUmF0ZUlkeDsKKwkJCQl9CisJCQl9CisJCX13aGlsZSAoRkFMU0UpOworCisJCS8vIGlmIHJhdGUtdXAgaGFwcGVuLCBjbGVhciBhbGwgYmFkIGhpc3Rvcnkgb2YgYWxsIFRYIHJhdGVzCisJCWlmIChwQWQtPkNvbW1vbkNmZy5UeFJhdGVJbmRleCA+IEN1cnJSYXRlSWR4KQorCQl7CisJCQlwQWQtPkRyc0NvdW50ZXJzLlR4UmF0ZVVwUGVuYWx0eSA9IDA7CisJCQlOZGlzWmVyb01lbW9yeShwQWQtPkRyc0NvdW50ZXJzLlR4UXVhbGl0eSwgc2l6ZW9mKFVTSE9SVCkgKiBNQVhfU1RFUF9PRl9UWF9SQVRFX1NXSVRDSCk7CisJCQlOZGlzWmVyb01lbW9yeShwQWQtPkRyc0NvdW50ZXJzLlBFUiwgc2l6ZW9mKFVDSEFSKSAqIE1BWF9TVEVQX09GX1RYX1JBVEVfU1dJVENIKTsKKwkJCWJUeFJhdGVDaGFuZ2VkID0gVFJVRTsKKwkJfQorCQkvLyBpZiByYXRlLWRvd24gaGFwcGVuLCBvbmx5IGNsZWFyIERvd25SYXRlJ3MgYmFkIGhpc3RvcnkKKwkJZWxzZSBpZiAocEFkLT5Db21tb25DZmcuVHhSYXRlSW5kZXggPCBDdXJyUmF0ZUlkeCkKKwkJeworCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCgiUXVpY2tEUlM6IC0tVFggcmF0ZSBmcm9tICVkIHRvICVkIFxuIiwgQ3VyclJhdGVJZHgsIHBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZUluZGV4KSk7CisKKwkJCXBBZC0+RHJzQ291bnRlcnMuVHhSYXRlVXBQZW5hbHR5ID0gMDsgICAgICAgICAgIC8vIG5vIHBlbmFsdHkKKwkJCXBBZC0+RHJzQ291bnRlcnMuVHhRdWFsaXR5W3BBZC0+Q29tbW9uQ2ZnLlR4UmF0ZUluZGV4XSA9IDA7CisJCQlwQWQtPkRyc0NvdW50ZXJzLlBFUltwQWQtPkNvbW1vbkNmZy5UeFJhdGVJbmRleF0gPSAwOworCQkJYlR4UmF0ZUNoYW5nZWQgPSBUUlVFOworCQl9CisJCWVsc2UKKwkJeworCQkJYlR4UmF0ZUNoYW5nZWQgPSBGQUxTRTsKKwkJfQorCisJCXBOZXh0VHhSYXRlID0gKFBSVE1QX1RYX1JBVEVfU1dJVENIKSAmcFRhYmxlWyhwQWQtPkNvbW1vbkNmZy5UeFJhdGVJbmRleCsxKSo1XTsKKwkJaWYgKGJUeFJhdGVDaGFuZ2VkICYmIHBOZXh0VHhSYXRlKQorCQl7CisJCQlNbG1lU2V0VHhSYXRlKHBBZCwgcEVudHJ5LCBwTmV4dFR4UmF0ZSk7CisJCX0KKwl9Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJVGhpcyByb3V0aW5lIGlzIGV4ZWN1dGVkIHBlcmlvZGljYWxseSBpbnNpZGUgTWxtZVBlcmlvZGljRXhlYygpIGFmdGVyCisJCWFzc29jaWF0aW9uIHdpdGggYW4gQVAuCisJCUl0IGNoZWNrcyBpZiBTdGFDZmcuUHNtIGlzIGNvbnNpc3RlbnQgd2l0aCB1c2VyIHBvbGljeSAocmVjb3JkZWQgaW4KKwkJU3RhQ2ZnLldpbmRvd3NQb3dlck1vZGUpLiBJZiBub3QsIGVuZm9yY2UgdXNlciBwb2xpY3kuIEhvd2V2ZXIsCisJCXRoZXJlJ3JlIHNvbWUgY29uZGl0aW9ucyB0byBjb25zaWRlcjoKKwkJMS4gd2UgZG9uJ3Qgc3VwcG9ydCBwb3dlci1zYXZpbmcgaW4gQURIT0MgbW9kZSwgc28gUHNtPVBXUl9BQ1RJVkUgYWxsCisJCSAgIHRoZSB0aW1lIHdoZW4gTWlic3M9PVRSVUUKKwkJMi4gV2hlbiBsaW5rIHVwIGluIElORlJBIG1vZGUsIFBzbSBzaG91bGQgbm90IGJlIHN3aXRjaCB0byBQV1JfU0FWRQorCQkgICBpZiBvdXRnb2luZyB0cmFmZmljIGF2YWlsYWJsZSBpbiBUeFJpbmcgb3IgTWdtdFJpbmcuCisJT3V0cHV0OgorCQkxLiBjaGFuZ2UgcEFkLT5TdGFDZmcuUHNtIHRvIFBXUl9TQVZFIG9yIGxlYXZlIGl0IHVudG91Y2hlZAorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIE1sbWVDaGVja1BzbUNoYW5nZSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVTE9ORwlOb3czMikKK3sKKwlVTE9ORwlQb3dlck1vZGU7CisKKwkvLyBjb25kaXRpb24gLQorCS8vIDEuIFBzbSBtYXliZSBPTiBvbmx5IGhhcHBlbiBpbiBJTkZSQVNUUlVDVFVSRSBtb2RlCisJLy8gMi4gdXNlciB3YW50cyBlaXRoZXIgTUFYX1BTUCBvciBGQVNUX1BTUAorCS8vIDMuIGJ1dCBjdXJyZW50IHBzbSBpcyBub3QgaW4gUFdSX1NBVkUKKwkvLyA0LiBDTlRMIHN0YXRlIG1hY2hpbmUgaXMgbm90IGRvaW5nIFNDQU5uaW5nCisJLy8gNS4gbm8gVFggU1VDQ0VTUyBldmVudCBmb3IgdGhlIHBhc3QgMS1zZWMgcGVyaW9kCisjaWZkZWYgTkRJUzUxX01JTklQT1JUCisJaWYgKHBBZC0+U3RhQ2ZnLldpbmRvd3NQb3dlclByb2ZpbGUgPT0gTmRpc1Bvd2VyUHJvZmlsZUJhdHRlcnkpCisJCVBvd2VyTW9kZSA9IHBBZC0+U3RhQ2ZnLldpbmRvd3NCYXR0ZXJ5UG93ZXJNb2RlOworCWVsc2UKKyNlbmRpZgorCQlQb3dlck1vZGUgPSBwQWQtPlN0YUNmZy5XaW5kb3dzUG93ZXJNb2RlOworCisJaWYgKElORlJBX09OKHBBZCkgJiYKKwkJKFBvd2VyTW9kZSAhPSBOZGlzODAyXzExUG93ZXJNb2RlQ0FNKSAmJgorCQkocEFkLT5TdGFDZmcuUHNtID09IFBXUl9BQ1RJVkUpICYmCisvLwkJKCEgUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKSkKKwkJKHBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPT0gQ05UTF9JRExFKSAvKiYmCisJCShwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4Tm9SZXRyeU9rQ291bnQgPT0gMCkgJiYKKwkJKHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhSZXRyeU9rQ291bnQgPT0gMCkqLykKKwl7CisJCU5kaXNHZXRTeXN0ZW1VcFRpbWUoJnBBZC0+TWxtZS5MYXN0U2VuZE5VTExwc21UaW1lKTsKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5SeENvdW50U2luY2VMYXN0TlVMTCA9IDA7CisJCU1sbWVTZXRQc21CaXQocEFkLCBQV1JfU0FWRSk7CisJCWlmICghKHBBZC0+Q29tbW9uQ2ZnLmJBUFNEQ2FwYWJsZSAmJiBwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLmJBUFNEQ2FwYWJsZSkpCisJCXsKKwkJCVJUTVBTZW5kTnVsbEZyYW1lKHBBZCwgcEFkLT5Db21tb25DZmcuVHhSYXRlLCBGQUxTRSk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlSVE1QU2VuZE51bGxGcmFtZShwQWQsIHBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZSwgVFJVRSk7CisJCX0KKwl9Cit9CisKKy8vIElSUUwgPSBQQVNTSVZFX0xFVkVMCisvLyBJUlFMID0gRElTUEFUQ0hfTEVWRUwKK1ZPSUQgTWxtZVNldFBzbUJpdCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVU0hPUlQgcHNtKQoreworCUFVVE9fUlNQX0NGR19TVFJVQyBjc3I0OworCisJcEFkLT5TdGFDZmcuUHNtID0gcHNtOworCVJUTVBfSU9fUkVBRDMyKHBBZCwgQVVUT19SU1BfQ0ZHLCAmY3NyNC53b3JkKTsKKwljc3I0LmZpZWxkLkFja0N0c1BzbUJpdCA9IChwc20gPT0gUFdSX1NBVkUpPyAxOjA7CisJUlRNUF9JT19XUklURTMyKHBBZCwgQVVUT19SU1BfQ0ZHLCBjc3I0LndvcmQpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1sbWVTZXRQc21CaXQgPSAlZFxuIiwgcHNtKSk7Cit9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKworLy8gSVJRTCA9IERJU1BBVENIX0xFVkVMCitWT0lEIE1sbWVTZXRUeFByZWFtYmxlKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVTSE9SVCBUeFByZWFtYmxlKQoreworCUFVVE9fUlNQX0NGR19TVFJVQyBjc3I0OworCisJLy8KKwkvLyBBbHdheXMgdXNlIExvbmcgcHJlYW1ibGUgYmVmb3JlIHZlcmlmaWF0aW9uIHNob3J0IHByZWFtYmxlIGZ1bmN0aW9uYWxpdHkgd29ya3Mgd2VsbC4KKwkvLyBUb2RvOiByZW1vdmUgdGhlIGZvbGxvd2luZyBsaW5lIGlmIHNob3J0IHByZWFtYmxlIGZ1bmN0aW9uYWxpdHkgd29ya3MKKwkvLworCS8vVHhQcmVhbWJsZSA9IFJ0ODAyXzExUHJlYW1ibGVMb25nOworCisJUlRNUF9JT19SRUFEMzIocEFkLCBBVVRPX1JTUF9DRkcsICZjc3I0LndvcmQpOworCWlmIChUeFByZWFtYmxlID09IFJ0ODAyXzExUHJlYW1ibGVMb25nKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTWxtZVNldFR4UHJlYW1ibGUgKD0gTE9ORyBQUkVBTUJMRSlcbiIpKTsKKwkJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfU0hPUlRfUFJFQU1CTEVfSU5VU0VEKTsKKwkJY3NyNC5maWVsZC5BdXRvUmVzcG9uZGVyUHJlYW1ibGUgPSAwOworCX0KKwllbHNlCisJeworCQkvLyBOT1RFOiAxTWJwcyBzaG91bGQgYWx3YXlzIHVzZSBsb25nIHByZWFtYmxlCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1sbWVTZXRUeFByZWFtYmxlICg9IFNIT1JUIFBSRUFNQkxFKVxuIikpOworCQlPUFNUQVRVU19TRVRfRkxBRyhwQWQsIGZPUF9TVEFUVVNfU0hPUlRfUFJFQU1CTEVfSU5VU0VEKTsKKwkJY3NyNC5maWVsZC5BdXRvUmVzcG9uZGVyUHJlYW1ibGUgPSAxOworCX0KKworCVJUTVBfSU9fV1JJVEUzMihwQWQsIEFVVE9fUlNQX0NGRywgY3NyNC53b3JkKTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBVcGRhdGUgYmFzaWMgcmF0ZSBiaXRtYXAKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK1ZPSUQgVXBkYXRlQmFzaWNSYXRlQml0bWFwKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIpCit7CisgICAgSU5UICBpLCBqOworICAgICAgICAgICAgICAgICAgLyogMSAgMiAgNS41LCAxMSwgIDYsICA5LCAxMiwgMTgsIDI0LCAzNiwgNDgsICA1NCAqLworICAgIFVDSEFSIHJhdGVbXSA9IHsgMiwgNCwgIDExLCAyMiwgMTIsIDE4LCAyNCwgMzYsIDQ4LCA3MiwgOTYsIDEwOCB9OworICAgIFVDSEFSICpzdXBfcCA9IHBBZGFwdGVyLT5Db21tb25DZmcuU3VwUmF0ZTsKKyAgICBVQ0hBUiAqZXh0X3AgPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLkV4dFJhdGU7CisgICAgVUxPTkcgYml0bWFwID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5CYXNpY1JhdGVCaXRtYXA7CisKKworICAgIC8qIGlmIEEgbW9kZSwgYWx3YXlzIHVzZSBmaXggQmFzaWNSYXRlQml0TWFwICovCisgICAgLy9pZiAocEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsID09IFBIWV8xMUEpCisJaWYgKHBBZGFwdGVyLT5Db21tb25DZmcuQ2hhbm5lbCA+IDE0KQorICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkJhc2ljUmF0ZUJpdG1hcCA9IDB4MTUwOyAvKiA2LCAxMiwgMjRNICovCisgICAgLyogRW5kIG9mIGlmICovCisKKyAgICBpZiAocEFkYXB0ZXItPkNvbW1vbkNmZy5CYXNpY1JhdGVCaXRtYXAgPiA0MDk1KQorICAgIHsKKyAgICAgICAgLyogKDIgXiBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUykgLTEgKi8KKyAgICAgICAgcmV0dXJuOworICAgIH0gLyogRW5kIG9mIGlmICovCisKKyAgICBmb3IoaT0wOyBpPE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTOyBpKyspCisgICAgeworICAgICAgICBzdXBfcFtpXSAmPSAweDdmOworICAgICAgICBleHRfcFtpXSAmPSAweDdmOworICAgIH0gLyogRW5kIG9mIGZvciAqLworCisgICAgZm9yKGk9MDsgaTxNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUzsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKGJpdG1hcCAmICgxIDw8IGkpKQorICAgICAgICB7CisgICAgICAgICAgICBmb3Ioaj0wOyBqPE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTOyBqKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHN1cF9wW2pdID09IHJhdGVbaV0pCisgICAgICAgICAgICAgICAgICAgIHN1cF9wW2pdIHw9IDB4ODA7CisgICAgICAgICAgICAgICAgLyogRW5kIG9mIGlmICovCisgICAgICAgICAgICB9IC8qIEVuZCBvZiBmb3IgKi8KKworICAgICAgICAgICAgZm9yKGo9MDsgajxNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUzsgaisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChleHRfcFtqXSA9PSByYXRlW2ldKQorICAgICAgICAgICAgICAgICAgICBleHRfcFtqXSB8PSAweDgwOworICAgICAgICAgICAgICAgIC8qIEVuZCBvZiBpZiAqLworICAgICAgICAgICAgfSAvKiBFbmQgb2YgZm9yICovCisgICAgICAgIH0gLyogRW5kIG9mIGlmICovCisgICAgfSAvKiBFbmQgb2YgZm9yICovCit9IC8qIEVuZCBvZiBVcGRhdGVCYXNpY1JhdGVCaXRtYXAgKi8KKworLy8gSVJRTCA9IFBBU1NJVkVfTEVWRUwKKy8vIElSUUwgPSBESVNQQVRDSF9MRVZFTAorLy8gYkxpbmtVcCBpcyB0byBpZGVudGlmeSB0aGUgaW5pdGFsIGxpbmsgc3BlZWQuCisvLyBUUlVFIGluZGljYXRlcyB0aGUgcmF0ZSB1cGRhdGUgYXQgbGlua3VwLCB3ZSBzaG91bGQgbm90IHRyeSB0byBzZXQgdGhlIHJhdGUgYXQgNTRNYnBzLgorVk9JRCBNbG1lVXBkYXRlVHhSYXRlcygKKwlJTiBQUlRNUF9BREFQVEVSIAkJcEFkLAorCUlOIAlCT09MRUFOCQkgCQliTGlua1VwLAorCUlOCVVDSEFSCQkJCWFwaWR4KQoreworCWludCBpLCBudW07CisJVUNIQVIgUmF0ZSA9IFJBVEVfNiwgTWF4RGVzaXJlID0gUkFURV8xLCBNYXhTdXBwb3J0ID0gUkFURV8xOworCVVDSEFSIE1pblN1cHBvcnQgPSBSQVRFXzU0OworCVVMT05HIEJhc2ljUmF0ZUJpdG1hcCA9IDA7CisJVUNIQVIgQ3VyckJhc2ljUmF0ZSA9IFJBVEVfMTsKKwlVQ0hBUiAqcFN1cFJhdGUsIFN1cFJhdGVMZW4sICpwRXh0UmF0ZSwgRXh0UmF0ZUxlbjsKKwlQSFRUUkFOU01JVF9TRVRUSU5HCQlwSHRQaHkgPSBOVUxMOworCVBIVFRSQU5TTUlUX1NFVFRJTkcJCXBNYXhIdFBoeSA9IE5VTEw7CisJUEhUVFJBTlNNSVRfU0VUVElORwkJcE1pbkh0UGh5ID0gTlVMTDsKKwlCT09MRUFOIAkJCQkqYXV0b19yYXRlX2N1cl9wOworCVVDSEFSCQkJCQlIdE1jcyA9IE1DU19BVVRPOworCisJLy8gZmluZCBtYXggZGVzaXJlZCByYXRlCisJVXBkYXRlQmFzaWNSYXRlQml0bWFwKHBBZCk7CisKKwludW0gPSAwOworCWF1dG9fcmF0ZV9jdXJfcCA9IE5VTEw7CisJZm9yIChpPTA7IGk8TUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVM7IGkrKykKKwl7CisJCXN3aXRjaCAocEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVtpXSAmIDB4N2YpCisJCXsKKwkJCWNhc2UgMjogIFJhdGUgPSBSQVRFXzE7ICAgbnVtKys7ICAgYnJlYWs7CisJCQljYXNlIDQ6ICBSYXRlID0gUkFURV8yOyAgIG51bSsrOyAgIGJyZWFrOworCQkJY2FzZSAxMTogUmF0ZSA9IFJBVEVfNV81OyBudW0rKzsgICBicmVhazsKKwkJCWNhc2UgMjI6IFJhdGUgPSBSQVRFXzExOyAgbnVtKys7ICAgYnJlYWs7CisJCQljYXNlIDEyOiBSYXRlID0gUkFURV82OyAgIG51bSsrOyAgIGJyZWFrOworCQkJY2FzZSAxODogUmF0ZSA9IFJBVEVfOTsgICBudW0rKzsgICBicmVhazsKKwkJCWNhc2UgMjQ6IFJhdGUgPSBSQVRFXzEyOyAgbnVtKys7ICAgYnJlYWs7CisJCQljYXNlIDM2OiBSYXRlID0gUkFURV8xODsgIG51bSsrOyAgIGJyZWFrOworCQkJY2FzZSA0ODogUmF0ZSA9IFJBVEVfMjQ7ICBudW0rKzsgICBicmVhazsKKwkJCWNhc2UgNzI6IFJhdGUgPSBSQVRFXzM2OyAgbnVtKys7ICAgYnJlYWs7CisJCQljYXNlIDk2OiBSYXRlID0gUkFURV80ODsgIG51bSsrOyAgIGJyZWFrOworCQkJY2FzZSAxMDg6IFJhdGUgPSBSQVRFXzU0OyBudW0rKzsgICBicmVhazsKKwkJCS8vZGVmYXVsdDogUmF0ZSA9IFJBVEVfMTsgICBicmVhazsKKwkJfQorCQlpZiAoTWF4RGVzaXJlIDwgUmF0ZSkgIE1heERlc2lyZSA9IFJhdGU7CisJfQorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJeworCQlwSHRQaHkgCQk9ICZwQWQtPlN0YUNmZy5IVFBoeU1vZGU7CisJCXBNYXhIdFBoeQk9ICZwQWQtPlN0YUNmZy5NYXhIVFBoeU1vZGU7CisJCXBNaW5IdFBoeQk9ICZwQWQtPlN0YUNmZy5NaW5IVFBoeU1vZGU7CisKKwkJYXV0b19yYXRlX2N1cl9wID0gJnBBZC0+U3RhQ2ZnLmJBdXRvVHhSYXRlU3dpdGNoOworCQlIdE1jcyAJCT0gcEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1M7CisKKwkJaWYgKChwQWQtPlN0YUNmZy5Cc3NUeXBlID09IEJTU19BREhPQykgJiYKKwkJCShwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUIpICYmCisJCQkoTWF4RGVzaXJlID4gUkFURV8xMSkpCisJCXsKKwkJCU1heERlc2lyZSA9IFJBVEVfMTE7CisJCX0KKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlwQWQtPkNvbW1vbkNmZy5NYXhEZXNpcmVkUmF0ZSA9IE1heERlc2lyZTsKKwlwTWluSHRQaHktPndvcmQgPSAwOworCXBNYXhIdFBoeS0+d29yZCA9IDA7CisJcEh0UGh5LT53b3JkID0gMDsKKworCS8vIEF1dG8gcmF0ZSBzd2l0Y2hpbmcgaXMgZW5hYmxlZCBvbmx5IGlmIG1vcmUgdGhhbiBvbmUgREVTSVJFRCBSQVRFUyBhcmUKKwkvLyBzcGVjaWZpZWQ7IG90aGVyd2lzZSBkaXNhYmxlZAorCWlmIChudW0gPD0gMSkKKwl7CisJCS8vT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfVFhfUkFURV9TV0lUQ0hfRU5BQkxFRCk7CisJCS8vcEFkLT5Db21tb25DZmcuYkF1dG9UeFJhdGVTd2l0Y2gJPSBGQUxTRTsKKwkJKmF1dG9fcmF0ZV9jdXJfcCA9IEZBTFNFOworCX0KKwllbHNlCisJeworCQkvL09QU1RBVFVTX1NFVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19UWF9SQVRFX1NXSVRDSF9FTkFCTEVEKTsKKwkJLy9wQWQtPkNvbW1vbkNmZy5iQXV0b1R4UmF0ZVN3aXRjaAk9IFRSVUU7CisJCSphdXRvX3JhdGVfY3VyX3AgPSBUUlVFOworCX0KKworI2lmIDEKKwlpZiAoSHRNY3MgIT0gTUNTX0FVVE8pCisJeworCQkvL09QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1RYX1JBVEVfU1dJVENIX0VOQUJMRUQpOworCQkvL3BBZC0+Q29tbW9uQ2ZnLmJBdXRvVHhSYXRlU3dpdGNoCT0gRkFMU0U7CisJCSphdXRvX3JhdGVfY3VyX3AgPSBGQUxTRTsKKwl9CisJZWxzZQorCXsKKwkJLy9PUFNUQVRVU19TRVRfRkxBRyhwQWQsIGZPUF9TVEFUVVNfVFhfUkFURV9TV0lUQ0hfRU5BQkxFRCk7CisJCS8vcEFkLT5Db21tb25DZmcuYkF1dG9UeFJhdGVTd2l0Y2gJPSBUUlVFOworCQkqYXV0b19yYXRlX2N1cl9wID0gVFJVRTsKKwl9CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCWlmICgoQURIT0NfT04ocEFkKSB8fCBJTkZSQV9PTihwQWQpKSAmJiAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkpCisJeworCQlwU3VwUmF0ZSA9ICZwQWQtPlN0YUFjdGl2ZS5TdXBSYXRlWzBdOworCQlwRXh0UmF0ZSA9ICZwQWQtPlN0YUFjdGl2ZS5FeHRSYXRlWzBdOworCQlTdXBSYXRlTGVuID0gcEFkLT5TdGFBY3RpdmUuU3VwUmF0ZUxlbjsKKwkJRXh0UmF0ZUxlbiA9IHBBZC0+U3RhQWN0aXZlLkV4dFJhdGVMZW47CisJfQorCWVsc2UKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwl7CisJCXBTdXBSYXRlID0gJnBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVbMF07CisJCXBFeHRSYXRlID0gJnBBZC0+Q29tbW9uQ2ZnLkV4dFJhdGVbMF07CisJCVN1cFJhdGVMZW4gPSBwQWQtPkNvbW1vbkNmZy5TdXBSYXRlTGVuOworCQlFeHRSYXRlTGVuID0gcEFkLT5Db21tb25DZmcuRXh0UmF0ZUxlbjsKKwl9CisKKwkvLyBmaW5kIG1heCBzdXBwb3J0ZWQgcmF0ZQorCWZvciAoaT0wOyBpPFN1cFJhdGVMZW47IGkrKykKKwl7CisJCXN3aXRjaCAocFN1cFJhdGVbaV0gJiAweDdmKQorCQl7CisJCQljYXNlIDI6ICAgUmF0ZSA9IFJBVEVfMTsJaWYgKHBTdXBSYXRlW2ldICYgMHg4MCkgQmFzaWNSYXRlQml0bWFwIHw9IDB4MDAwMTsJIGJyZWFrOworCQkJY2FzZSA0OiAgIFJhdGUgPSBSQVRFXzI7CWlmIChwU3VwUmF0ZVtpXSAmIDB4ODApIEJhc2ljUmF0ZUJpdG1hcCB8PSAweDAwMDI7CSBicmVhazsKKwkJCWNhc2UgMTE6ICBSYXRlID0gUkFURV81XzU7CWlmIChwU3VwUmF0ZVtpXSAmIDB4ODApIEJhc2ljUmF0ZUJpdG1hcCB8PSAweDAwMDQ7CSBicmVhazsKKwkJCWNhc2UgMjI6ICBSYXRlID0gUkFURV8xMTsJaWYgKHBTdXBSYXRlW2ldICYgMHg4MCkgQmFzaWNSYXRlQml0bWFwIHw9IDB4MDAwODsJIGJyZWFrOworCQkJY2FzZSAxMjogIFJhdGUgPSBSQVRFXzY7CS8qaWYgKHBTdXBSYXRlW2ldICYgMHg4MCkqLyAgQmFzaWNSYXRlQml0bWFwIHw9IDB4MDAxMDsgIGJyZWFrOworCQkJY2FzZSAxODogIFJhdGUgPSBSQVRFXzk7CWlmIChwU3VwUmF0ZVtpXSAmIDB4ODApIEJhc2ljUmF0ZUJpdG1hcCB8PSAweDAwMjA7CSBicmVhazsKKwkJCWNhc2UgMjQ6ICBSYXRlID0gUkFURV8xMjsJLyppZiAocFN1cFJhdGVbaV0gJiAweDgwKSovICBCYXNpY1JhdGVCaXRtYXAgfD0gMHgwMDQwOyAgYnJlYWs7CisJCQljYXNlIDM2OiAgUmF0ZSA9IFJBVEVfMTg7CWlmIChwU3VwUmF0ZVtpXSAmIDB4ODApIEJhc2ljUmF0ZUJpdG1hcCB8PSAweDAwODA7CSBicmVhazsKKwkJCWNhc2UgNDg6ICBSYXRlID0gUkFURV8yNDsJLyppZiAocFN1cFJhdGVbaV0gJiAweDgwKSovICBCYXNpY1JhdGVCaXRtYXAgfD0gMHgwMTAwOyAgYnJlYWs7CisJCQljYXNlIDcyOiAgUmF0ZSA9IFJBVEVfMzY7CWlmIChwU3VwUmF0ZVtpXSAmIDB4ODApIEJhc2ljUmF0ZUJpdG1hcCB8PSAweDAyMDA7CSBicmVhazsKKwkJCWNhc2UgOTY6ICBSYXRlID0gUkFURV80ODsJaWYgKHBTdXBSYXRlW2ldICYgMHg4MCkgQmFzaWNSYXRlQml0bWFwIHw9IDB4MDQwMDsJIGJyZWFrOworCQkJY2FzZSAxMDg6IFJhdGUgPSBSQVRFXzU0OwlpZiAocFN1cFJhdGVbaV0gJiAweDgwKSBCYXNpY1JhdGVCaXRtYXAgfD0gMHgwODAwOwkgYnJlYWs7CisJCQlkZWZhdWx0OiAgUmF0ZSA9IFJBVEVfMTsJYnJlYWs7CisJCX0KKwkJaWYgKE1heFN1cHBvcnQgPCBSYXRlKQlNYXhTdXBwb3J0ID0gUmF0ZTsKKworCQlpZiAoTWluU3VwcG9ydCA+IFJhdGUpIE1pblN1cHBvcnQgPSBSYXRlOworCX0KKworCWZvciAoaT0wOyBpPEV4dFJhdGVMZW47IGkrKykKKwl7CisJCXN3aXRjaCAocEV4dFJhdGVbaV0gJiAweDdmKQorCQl7CisJCQljYXNlIDI6ICAgUmF0ZSA9IFJBVEVfMTsJaWYgKHBFeHRSYXRlW2ldICYgMHg4MCkgQmFzaWNSYXRlQml0bWFwIHw9IDB4MDAwMTsJIGJyZWFrOworCQkJY2FzZSA0OiAgIFJhdGUgPSBSQVRFXzI7CWlmIChwRXh0UmF0ZVtpXSAmIDB4ODApIEJhc2ljUmF0ZUJpdG1hcCB8PSAweDAwMDI7CSBicmVhazsKKwkJCWNhc2UgMTE6ICBSYXRlID0gUkFURV81XzU7CWlmIChwRXh0UmF0ZVtpXSAmIDB4ODApIEJhc2ljUmF0ZUJpdG1hcCB8PSAweDAwMDQ7CSBicmVhazsKKwkJCWNhc2UgMjI6ICBSYXRlID0gUkFURV8xMTsJaWYgKHBFeHRSYXRlW2ldICYgMHg4MCkgQmFzaWNSYXRlQml0bWFwIHw9IDB4MDAwODsJIGJyZWFrOworCQkJY2FzZSAxMjogIFJhdGUgPSBSQVRFXzY7CS8qaWYgKHBFeHRSYXRlW2ldICYgMHg4MCkqLyAgQmFzaWNSYXRlQml0bWFwIHw9IDB4MDAxMDsgIGJyZWFrOworCQkJY2FzZSAxODogIFJhdGUgPSBSQVRFXzk7CWlmIChwRXh0UmF0ZVtpXSAmIDB4ODApIEJhc2ljUmF0ZUJpdG1hcCB8PSAweDAwMjA7CSBicmVhazsKKwkJCWNhc2UgMjQ6ICBSYXRlID0gUkFURV8xMjsJLyppZiAocEV4dFJhdGVbaV0gJiAweDgwKSovICBCYXNpY1JhdGVCaXRtYXAgfD0gMHgwMDQwOyAgYnJlYWs7CisJCQljYXNlIDM2OiAgUmF0ZSA9IFJBVEVfMTg7CWlmIChwRXh0UmF0ZVtpXSAmIDB4ODApIEJhc2ljUmF0ZUJpdG1hcCB8PSAweDAwODA7CSBicmVhazsKKwkJCWNhc2UgNDg6ICBSYXRlID0gUkFURV8yNDsJLyppZiAocEV4dFJhdGVbaV0gJiAweDgwKSovICBCYXNpY1JhdGVCaXRtYXAgfD0gMHgwMTAwOyAgYnJlYWs7CisJCQljYXNlIDcyOiAgUmF0ZSA9IFJBVEVfMzY7CWlmIChwRXh0UmF0ZVtpXSAmIDB4ODApIEJhc2ljUmF0ZUJpdG1hcCB8PSAweDAyMDA7CSBicmVhazsKKwkJCWNhc2UgOTY6ICBSYXRlID0gUkFURV80ODsJaWYgKHBFeHRSYXRlW2ldICYgMHg4MCkgQmFzaWNSYXRlQml0bWFwIHw9IDB4MDQwMDsJIGJyZWFrOworCQkJY2FzZSAxMDg6IFJhdGUgPSBSQVRFXzU0OwlpZiAocEV4dFJhdGVbaV0gJiAweDgwKSBCYXNpY1JhdGVCaXRtYXAgfD0gMHgwODAwOwkgYnJlYWs7CisJCQlkZWZhdWx0OiAgUmF0ZSA9IFJBVEVfMTsJYnJlYWs7CisJCX0KKwkJaWYgKE1heFN1cHBvcnQgPCBSYXRlKQlNYXhTdXBwb3J0ID0gUmF0ZTsKKworCQlpZiAoTWluU3VwcG9ydCA+IFJhdGUpIE1pblN1cHBvcnQgPSBSYXRlOworCX0KKworCVJUTVBfSU9fV1JJVEUzMihwQWQsIExFR0FDWV9CQVNJQ19SQVRFLCBCYXNpY1JhdGVCaXRtYXApOworCisJLy8gYnVnIGZpeAorCS8vIHBBZC0+Q29tbW9uQ2ZnLkJhc2ljUmF0ZUJpdG1hcCA9IEJhc2ljUmF0ZUJpdG1hcDsKKworCS8vIGNhbGN1bGF0ZSB0aGUgZXhwdGVjdGVkIEFDSyByYXRlIGZvciBlYWNoIFRYIHJhdGUuIFRoaXMgaW5mbyBpcyB1c2VkIHRvIGNhY3VsYXRlCisJLy8gdGhlIERVUkFUSU9OIGZpZWxkIG9mIG91dGdvaW5nIHVuaWljYXN0IERBVEEvTUdNVCBmcmFtZQorCWZvciAoaT0wOyBpPE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTOyBpKyspCisJeworCQlpZiAoQmFzaWNSYXRlQml0bWFwICYgKDB4MDEgPDwgaSkpCisJCQlDdXJyQmFzaWNSYXRlID0gKFVDSEFSKWk7CisJCXBBZC0+Q29tbW9uQ2ZnLkV4cGVjdGVkQUNLUmF0ZVtpXSA9IEN1cnJCYXNpY1JhdGU7CisJfQorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJNbG1lVXBkYXRlVHhSYXRlc1tNYXhTdXBwb3J0ID0gJWRdID0gTWF4RGVzaXJlICVkIE1icHNcbiIsIFJhdGVJZFRvTWJwc1tNYXhTdXBwb3J0XSwgUmF0ZUlkVG9NYnBzW01heERlc2lyZV0pKTsKKwkvLyBtYXggdHggcmF0ZSA9IG1pbiB7bWF4IGRlc2lyZSByYXRlLCBtYXggc3VwcG9ydGVkIHJhdGV9CisJaWYgKE1heFN1cHBvcnQgPCBNYXhEZXNpcmUpCisJCXBBZC0+Q29tbW9uQ2ZnLk1heFR4UmF0ZSA9IE1heFN1cHBvcnQ7CisJZWxzZQorCQlwQWQtPkNvbW1vbkNmZy5NYXhUeFJhdGUgPSBNYXhEZXNpcmU7CisKKwlwQWQtPkNvbW1vbkNmZy5NaW5UeFJhdGUgPSBNaW5TdXBwb3J0OworCS8vIDIwMDMtMDctMzEgam9obiAtIDI1MDAgZG9lc24ndCBoYXZlIGdvb2Qgc2Vuc2l0aXZpdHkgYXQgaGlnaCBPRkRNIHJhdGVzLiB0byBpbmNyZWFzZSB0aGUgc3VjY2VzcworCS8vIHJhdGlvIG9mIGluaXRpYWwgREhDUCBwYWNrZXQgZXhjaGFuZ2UsIFRYIHJhdGUgc3RhcnRzIGZyb20gYSBsb3dlciByYXRlIGRlcGVuZGluZworCS8vIG9uIGF2ZXJhZ2UgUlNTSQorCS8vCSAxLiBSU1NJID49IC03MGRiLCBzdGFydCBhdCA1NCBNYnBzIChzaG9ydCBkaXN0YW5jZSkKKwkvLwkgMi4gLTcwID4gUlNTSSA+PSAtNzUsIHN0YXJ0IGF0IDI0IE1icHMgKG1pZCBkaXN0YW5jZSkKKwkvLwkgMy4gLTc1ID4gUlNTSSwgc3RhcnQgYXQgMTEgTWJwcyAobG9uZyBkaXN0YW5jZSkKKwkvL2lmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1RYX1JBVEVfU1dJVENIX0VOQUJMRUQpLyogJiYKKwkvLwlPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCkqLykKKwlpZiAoKmF1dG9fcmF0ZV9jdXJfcCkKKwl7CisJCXNob3J0IGRibSA9IDA7CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCQlkYm0gPSBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kwIC0gcEFkLT5CYnBSc3NpVG9EYm1EZWx0YTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwkJaWYgKGJMaW5rVXAgPT0gVFJVRSkKKwkJCXBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZSA9IFJBVEVfMjQ7CisJCWVsc2UKKwkJCXBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZSA9IHBBZC0+Q29tbW9uQ2ZnLk1heFR4UmF0ZTsKKworCQlpZiAoZGJtIDwgLTc1KQorCQkJcEFkLT5Db21tb25DZmcuVHhSYXRlID0gUkFURV8xMTsKKwkJZWxzZSBpZiAoZGJtIDwgLTcwKQorCQkJcEFkLT5Db21tb25DZmcuVHhSYXRlID0gUkFURV8yNDsKKworCQkvLyBzaG91bGQgbmV2ZXIgZXhjZWVkIE1heFR4UmF0ZSAoY29uc2lkZXIgMTFCLW9ubHkgbW9kZSkKKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZSA+IHBBZC0+Q29tbW9uQ2ZnLk1heFR4UmF0ZSkKKwkJCXBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZSA9IHBBZC0+Q29tbW9uQ2ZnLk1heFR4UmF0ZTsKKworCQlwQWQtPkNvbW1vbkNmZy5UeFJhdGVJbmRleCA9IDA7CisJfQorCWVsc2UKKwl7CisJCXBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZSA9IHBBZC0+Q29tbW9uQ2ZnLk1heFR4UmF0ZTsKKwkJcEh0UGh5LT5maWVsZC5NQ1MJPSAocEFkLT5Db21tb25DZmcuTWF4VHhSYXRlID4gMykgPyAocEFkLT5Db21tb25DZmcuTWF4VHhSYXRlIC0gNCkgOiBwQWQtPkNvbW1vbkNmZy5NYXhUeFJhdGU7CisJCXBIdFBoeS0+ZmllbGQuTU9ERQk9IChwQWQtPkNvbW1vbkNmZy5NYXhUeFJhdGUgPiAzKSA/IE1PREVfT0ZETSA6IE1PREVfQ0NLOworCisJCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLlNUQkMJPSBwSHRQaHktPmZpZWxkLlNUQkM7CisJCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLlNob3J0R0kJPSBwSHRQaHktPmZpZWxkLlNob3J0R0k7CisJCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLk1DUwkJPSBwSHRQaHktPmZpZWxkLk1DUzsKKwkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5IVFBoeU1vZGUuZmllbGQuTU9ERQk9IHBIdFBoeS0+ZmllbGQuTU9ERTsKKwl9CisKKwlpZiAocEFkLT5Db21tb25DZmcuVHhSYXRlIDw9IFJBVEVfMTEpCisJeworCQlwTWF4SHRQaHktPmZpZWxkLk1PREUgPSBNT0RFX0NDSzsKKwkJcE1heEh0UGh5LT5maWVsZC5NQ1MgPSBwQWQtPkNvbW1vbkNmZy5UeFJhdGU7CisJCXBNaW5IdFBoeS0+ZmllbGQuTUNTID0gcEFkLT5Db21tb25DZmcuTWluVHhSYXRlOworCX0KKwllbHNlCisJeworCQlwTWF4SHRQaHktPmZpZWxkLk1PREUgPSBNT0RFX09GRE07CisJCXBNYXhIdFBoeS0+ZmllbGQuTUNTID0gT2ZkbVJhdGVUb1J4d2lNQ1NbcEFkLT5Db21tb25DZmcuVHhSYXRlXTsKKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLk1pblR4UmF0ZSA+PSBSQVRFXzYgJiYgKHBBZC0+Q29tbW9uQ2ZnLk1pblR4UmF0ZSA8PSBSQVRFXzU0KSkKKwkJCXtwTWluSHRQaHktPmZpZWxkLk1DUyA9IE9mZG1SYXRlVG9SeHdpTUNTW3BBZC0+Q29tbW9uQ2ZnLk1pblR4UmF0ZV07fQorCQllbHNlCisJCQl7cE1pbkh0UGh5LT5maWVsZC5NQ1MgPSBwQWQtPkNvbW1vbkNmZy5NaW5UeFJhdGU7fQorCX0KKworCXBIdFBoeS0+d29yZCA9IChwTWF4SHRQaHktPndvcmQpOworCWlmIChiTGlua1VwICYmIChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKSkKKwl7CisJCQlwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkhUUGh5TW9kZS53b3JkID0gcEh0UGh5LT53b3JkOworCQkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5NYXhIVFBoeU1vZGUud29yZCA9IHBNYXhIdFBoeS0+d29yZDsKKwkJCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uTWluSFRQaHlNb2RlLndvcmQgPSBwTWluSHRQaHktPndvcmQ7CisJfQorCWVsc2UKKwl7CisJCXN3aXRjaCAocEFkLT5Db21tb25DZmcuUGh5TW9kZSkKKwkJeworCQkJY2FzZSBQSFlfMTFCR19NSVhFRDoKKwkJCWNhc2UgUEhZXzExQjoKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCWNhc2UgUEhZXzExQkdOX01JWEVEOgorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQkJCXBBZC0+Q29tbW9uQ2ZnLk1sbWVSYXRlID0gUkFURV8xOworCQkJCXBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NT0RFID0gTU9ERV9DQ0s7CisJCQkJcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1DUyA9IFJBVEVfMTsKKworLy8jaWZkZWYJV0lGSV9URVNUCisJCQkJcEFkLT5Db21tb25DZmcuUnRzUmF0ZSA9IFJBVEVfMTE7CisvLyNlbHNlCisvLwkJCQlwQWQtPkNvbW1vbkNmZy5SdHNSYXRlID0gUkFURV8xOworLy8jZW5kaWYKKwkJCQlicmVhazsKKwkJCWNhc2UgUEhZXzExRzoKKwkJCWNhc2UgUEhZXzExQToKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCWNhc2UgUEhZXzExQUdOX01JWEVEOgorCQkJY2FzZSBQSFlfMTFHTl9NSVhFRDoKKwkJCWNhc2UgUEhZXzExTl8yXzRHOgorCQkJY2FzZSBQSFlfMTFBTl9NSVhFRDoKKwkJCWNhc2UgUEhZXzExTl81RzoKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJCQlwQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZSA9IFJBVEVfNjsKKwkJCQlwQWQtPkNvbW1vbkNmZy5SdHNSYXRlID0gUkFURV82OworCQkJCXBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NT0RFID0gTU9ERV9PRkRNOworCQkJCXBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NQ1MgPSBPZmRtUmF0ZVRvUnh3aU1DU1twQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZV07CisJCQkJYnJlYWs7CisJCQljYXNlIFBIWV8xMUFCR19NSVhFRDoKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCWNhc2UgUEhZXzExQUJHTl9NSVhFRDoKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJCQlpZiAocEFkLT5Db21tb25DZmcuQ2hhbm5lbCA8PSAxNCkKKwkJCQl7CisJCQkJCXBBZC0+Q29tbW9uQ2ZnLk1sbWVSYXRlID0gUkFURV8xOworCQkJCQlwQWQtPkNvbW1vbkNmZy5SdHNSYXRlID0gUkFURV8xOworCQkJCQlwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTU9ERSA9IE1PREVfQ0NLOworCQkJCQlwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTUNTID0gUkFURV8xOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlwQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZSA9IFJBVEVfNjsKKwkJCQkJcEFkLT5Db21tb25DZmcuUnRzUmF0ZSA9IFJBVEVfNjsKKwkJCQkJcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1PREUgPSBNT0RFX09GRE07CisJCQkJCXBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NQ1MgPSBPZmRtUmF0ZVRvUnh3aU1DU1twQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZV07CisJCQkJfQorCQkJCWJyZWFrOworCQkJZGVmYXVsdDogLy8gZXJyb3IKKwkJCQlwQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZSA9IFJBVEVfNjsKKyAgICAgICAgICAgICAgICAgICAgICAgIAlwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTU9ERSA9IE1PREVfT0ZETTsKKwkJCQlwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTUNTID0gT2ZkbVJhdGVUb1J4d2lNQ1NbcEFkLT5Db21tb25DZmcuTWxtZVJhdGVdOworCQkJCXBBZC0+Q29tbW9uQ2ZnLlJ0c1JhdGUgPSBSQVRFXzE7CisJCQkJYnJlYWs7CisJCX0KKwkJLy8KKwkJLy8gS2VlcCBCYXNpYyBNbG1lIFJhdGUuCisJCS8vCisJCXBBZC0+TWFjVGFiLkNvbnRlbnRbTUNBU1RfV0NJRF0uSFRQaHlNb2RlLndvcmQgPSBwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQud29yZDsKKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NT0RFID09IE1PREVfT0ZETSkKKwkJCXBBZC0+TWFjVGFiLkNvbnRlbnRbTUNBU1RfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLk1DUyA9IE9mZG1SYXRlVG9SeHdpTUNTW1JBVEVfMjRdOworCQllbHNlCisJCQlwQWQtPk1hY1RhYi5Db250ZW50W01DQVNUX1dDSURdLkhUUGh5TW9kZS5maWVsZC5NQ1MgPSBSQVRFXzE7CisJCXBBZC0+Q29tbW9uQ2ZnLkJhc2ljTWxtZVJhdGUgPSBwQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZTsKKwl9CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIgTWxtZVVwZGF0ZVR4UmF0ZXMgKE1heERlc2lyZT0lZCwgTWF4U3VwcG9ydD0lZCwgTWF4VHhSYXRlPSVkLCBNaW5SYXRlPSVkLCBSYXRlIFN3aXRjaGluZyA9JWQpXG4iLAorCQkJIFJhdGVJZFRvTWJwc1tNYXhEZXNpcmVdLCBSYXRlSWRUb01icHNbTWF4U3VwcG9ydF0sIFJhdGVJZFRvTWJwc1twQWQtPkNvbW1vbkNmZy5NYXhUeFJhdGVdLCBSYXRlSWRUb01icHNbcEFkLT5Db21tb25DZmcuTWluVHhSYXRlXSwKKwkJCSAvKk9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfVFhfUkFURV9TV0lUQ0hfRU5BQkxFRCkqLyphdXRvX3JhdGVfY3VyX3ApKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIgTWxtZVVwZGF0ZVR4UmF0ZXMgKFR4UmF0ZT0lZCwgUnRzUmF0ZT0lZCwgQmFzaWNSYXRlQml0bWFwPTB4JTA0bHgpXG4iLAorCQkJIFJhdGVJZFRvTWJwc1twQWQtPkNvbW1vbkNmZy5UeFJhdGVdLCBSYXRlSWRUb01icHNbcEFkLT5Db21tb25DZmcuUnRzUmF0ZV0sIEJhc2ljUmF0ZUJpdG1hcCkpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1sbWVVcGRhdGVUeFJhdGVzIChNbG1lVHJhbnNtaXQ9MHgleCwgTWluSFRQaHlNb2RlPSV4LCBNYXhIVFBoeU1vZGU9MHgleCwgSFRQaHlNb2RlPTB4JXgpXG4iLAorCQkJIHBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC53b3JkLCBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLk1pbkhUUGh5TW9kZS53b3JkICxwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLk1heEhUUGh5TW9kZS53b3JkICxwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkhUUGh5TW9kZS53b3JkICkpOworfQorCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVRoaXMgZnVuY3Rpb24gdXBkYXRlIEhUIFJhdGUgc2V0dGluZy4KKwkJSW5wdXQgV2NpZCB2YWx1ZSBpcyB2YWxpZCBmb3IgMiBjYXNlIDoKKwkJMS4gaXQncyB1c2VkIGZvciBTdGF0aW9uIGluIGluZnJhIG1vZGUgdGhhdCBjb3B5IEFQIHJhdGUgdG8gTWFjdGFibGUuCisJCTIuIE9SIFN0YXRpb24gCWluIGFkaG9jIG1vZGUgdG8gY29weSBwZWVyJ3MgSFQgcmF0ZSB0byBNYWN0YWJsZS4KKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBNbG1lVXBkYXRlSHRUeFJhdGVzKAorCUlOIFBSVE1QX0FEQVBURVIgCQlwQWQsCisJSU4JVUNIQVIJCQkJYXBpZHgpCit7CisJVUNIQVIJU3RiY01jczsgLy9qLCBTdGJjTWNzLCBiaXRtYXNrOworCUNIQVIgCWk7IC8vIDMqMworCVJUX0hUX0NBUEFCSUxJVFkgCSpwUnRIdENhcCA9IE5VTEw7CisJUlRfSFRfUEhZX0lORk8JCSpwQWN0aXZlSHRQaHkgPSBOVUxMOworCVVMT05HCQlCYXNpY01DUzsKKwlVQ0hBUiBqLCBiaXRtYXNrOworCVBSVF9IVF9QSFlfSU5GTwkJCXBEZXNpcmVIdFBoeSA9IE5VTEw7CisJUEhUVFJBTlNNSVRfU0VUVElORwkJcEh0UGh5ID0gTlVMTDsKKwlQSFRUUkFOU01JVF9TRVRUSU5HCQlwTWF4SHRQaHkgPSBOVUxMOworCVBIVFRSQU5TTUlUX1NFVFRJTkcJCXBNaW5IdFBoeSA9IE5VTEw7CisJQk9PTEVBTiAJCQkJKmF1dG9fcmF0ZV9jdXJfcDsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiTWxtZVVwZGF0ZUh0VHhSYXRlcz09PT4gXG4iKSk7CisKKwlhdXRvX3JhdGVfY3VyX3AgPSBOVUxMOworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwl7CisJCXBEZXNpcmVIdFBoeQk9ICZwQWQtPlN0YUNmZy5EZXNpcmVkSHRQaHlJbmZvOworCQlwQWN0aXZlSHRQaHkJPSAmcEFkLT5TdGFDZmcuRGVzaXJlZEh0UGh5SW5mbzsKKwkJcEh0UGh5IAkJPSAmcEFkLT5TdGFDZmcuSFRQaHlNb2RlOworCQlwTWF4SHRQaHkJPSAmcEFkLT5TdGFDZmcuTWF4SFRQaHlNb2RlOworCQlwTWluSHRQaHkJPSAmcEFkLT5TdGFDZmcuTWluSFRQaHlNb2RlOworCisJCWF1dG9fcmF0ZV9jdXJfcCA9ICZwQWQtPlN0YUNmZy5iQXV0b1R4UmF0ZVN3aXRjaDsKKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlpZiAoKEFESE9DX09OKHBBZCkgfHwgSU5GUkFfT04ocEFkKSkgJiYgKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpKQorCXsKKwkJaWYgKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uYkh0RW5hYmxlID09IEZBTFNFKQorCQkJcmV0dXJuOworCisJCXBSdEh0Q2FwID0gJnBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZEh0UGh5OworCQlwQWN0aXZlSHRQaHkgPSAmcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mbzsKKwkJU3RiY01jcyA9IChVQ0hBUilwQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzMuU3RiY01jczsKKwkJQmFzaWNNQ1MgPXBBZC0+TWxtZUF1eC5BZGRIdEluZm8uTUNTU2V0WzBdKyhwQWQtPk1sbWVBdXguQWRkSHRJbmZvLk1DU1NldFsxXTw8OCkrKFN0YmNNY3M8PDE2KTsKKwkJaWYgKChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuVHhTVEJDKSAmJiAocFJ0SHRDYXAtPlJ4U1RCQykgJiYgKHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGggPT0gMikpCisJCQlwTWF4SHRQaHktPmZpZWxkLlNUQkMgPSBTVEJDX1VTRTsKKwkJZWxzZQorCQkJcE1heEh0UGh5LT5maWVsZC5TVEJDID0gU1RCQ19OT05FOworCX0KKwllbHNlCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJeworCQlpZiAocERlc2lyZUh0UGh5LT5iSHRFbmFibGUgPT0gRkFMU0UpCisJCQlyZXR1cm47CisKKwkJcFJ0SHRDYXAgPSAmcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5OworCQlTdGJjTWNzID0gKFVDSEFSKXBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mby5BZGRIdEluZm8zLlN0YmNNY3M7CisJCUJhc2ljTUNTID0gcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLk1DU1NldFswXSsocEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLk1DU1NldFsxXTw8OCkrKFN0YmNNY3M8PDE2KTsKKwkJaWYgKChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuVHhTVEJDKSAmJiAocFJ0SHRDYXAtPlJ4U1RCQykgJiYgKHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGggPT0gMikpCisJCQlwTWF4SHRQaHktPmZpZWxkLlNUQkMgPSBTVEJDX1VTRTsKKwkJZWxzZQorCQkJcE1heEh0UGh5LT5maWVsZC5TVEJDID0gU1RCQ19OT05FOworCX0KKworCS8vIERlY2lkZSBNQVggaHQgcmF0ZS4KKwlpZiAoKHBSdEh0Q2FwLT5HRikgJiYgKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5HRikpCisJCXBNYXhIdFBoeS0+ZmllbGQuTU9ERSA9IE1PREVfSFRHUkVFTkZJRUxEOworCWVsc2UKKwkJcE1heEh0UGh5LT5maWVsZC5NT0RFID0gTU9ERV9IVE1JWDsKKworICAgIGlmICgocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkNoYW5uZWxXaWR0aCkgJiYgKHBSdEh0Q2FwLT5DaGFubmVsV2lkdGgpKQorCQlwTWF4SHRQaHktPmZpZWxkLkJXID0gQldfNDA7CisJZWxzZQorCQlwTWF4SHRQaHktPmZpZWxkLkJXID0gQldfMjA7CisKKyAgICBpZiAocE1heEh0UGh5LT5maWVsZC5CVyA9PSBCV18yMCkKKwkJcE1heEh0UGh5LT5maWVsZC5TaG9ydEdJID0gKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5TaG9ydEdJZm9yMjAgJiBwUnRIdENhcC0+U2hvcnRHSWZvcjIwKTsKKwllbHNlCisJCXBNYXhIdFBoeS0+ZmllbGQuU2hvcnRHSSA9IChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuU2hvcnRHSWZvcjQwICYgcFJ0SHRDYXAtPlNob3J0R0lmb3I0MCk7CisKKwlmb3IgKGk9MjM7IGk+PTA7IGktLSkgLy8gMyozCisJeworCQlqID0gaS84OworCQliaXRtYXNrID0gKDE8PChpLShqKjgpKSk7CisKKwkJaWYgKChwQWN0aXZlSHRQaHktPk1DU1NldFtqXSAmIGJpdG1hc2spICYmIChwRGVzaXJlSHRQaHktPk1DU1NldFtqXSAmIGJpdG1hc2spKQorCQl7CisJCQlwTWF4SHRQaHktPmZpZWxkLk1DUyA9IGk7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChpPT0wKQorCQkJYnJlYWs7CisJfQorCisJLy8gQ29weSBNSU4gaHQgcmF0ZS4gIHJ0Mjg2MD8/PworCXBNaW5IdFBoeS0+ZmllbGQuQlcgPSBCV18yMDsKKwlwTWluSHRQaHktPmZpZWxkLk1DUyA9IDA7CisJcE1pbkh0UGh5LT5maWVsZC5TVEJDID0gMDsKKwlwTWluSHRQaHktPmZpZWxkLlNob3J0R0kgPSAwOworCS8vSWYgU1RBIGFzc2lnbnMgZml4ZWQgcmF0ZS4gdXBkYXRlIHRvIGZpeGVkIGhlcmUuCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJaWYgKCAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkgJiYgKHBEZXNpcmVIdFBoeS0+TUNTU2V0WzBdICE9IDB4ZmYpKQorCXsKKwkJaWYgKHBEZXNpcmVIdFBoeS0+TUNTU2V0WzRdICE9IDApCisJCXsKKwkJCXBNYXhIdFBoeS0+ZmllbGQuTUNTID0gMzI7CisJCQlwTWluSHRQaHktPmZpZWxkLk1DUyA9IDMyOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJNbG1lVXBkYXRlSHRUeFJhdGVzPD09PSBVc2UgRml4ZWQgTUNTID0gJWRcbiIscE1pbkh0UGh5LT5maWVsZC5NQ1MpKTsKKwkJfQorCisJCWZvciAoaT0yMzsgKENIQVIpaSA+PSAwOyBpLS0pIC8vIDMqMworCQl7CisJCQlqID0gaS84OworCQkJYml0bWFzayA9ICgxPDwoaS0oaio4KSkpOworCQkJaWYgKCAocERlc2lyZUh0UGh5LT5NQ1NTZXRbal0gJiBiaXRtYXNrKSAmJiAocEFjdGl2ZUh0UGh5LT5NQ1NTZXRbal0gJiBiaXRtYXNrKSkKKwkJCXsKKwkJCQlwTWF4SHRQaHktPmZpZWxkLk1DUyA9IGk7CisJCQkJcE1pbkh0UGh5LT5maWVsZC5NQ1MgPSBpOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKGk9PTApCisJCQkJYnJlYWs7CisJCX0KKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKworCS8vIERlY2lkZSBodCByYXRlCisJcEh0UGh5LT5maWVsZC5TVEJDID0gcE1heEh0UGh5LT5maWVsZC5TVEJDOworCXBIdFBoeS0+ZmllbGQuQlcgPSBwTWF4SHRQaHktPmZpZWxkLkJXOworCXBIdFBoeS0+ZmllbGQuTU9ERSA9IHBNYXhIdFBoeS0+ZmllbGQuTU9ERTsKKwlwSHRQaHktPmZpZWxkLk1DUyA9IHBNYXhIdFBoeS0+ZmllbGQuTUNTOworCXBIdFBoeS0+ZmllbGQuU2hvcnRHSSA9IHBNYXhIdFBoeS0+ZmllbGQuU2hvcnRHSTsKKworCS8vIHVzZSBkZWZhdWx0IG5vdy4gcnQyODYwCisJaWYgKHBEZXNpcmVIdFBoeS0+TUNTU2V0WzBdICE9IDB4ZmYpCisJCSphdXRvX3JhdGVfY3VyX3AgPSBGQUxTRTsKKwllbHNlCisJCSphdXRvX3JhdGVfY3VyX3AgPSBUUlVFOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiIE1sbWVVcGRhdGVIdFR4UmF0ZXM8LS0tLkFNc2R1U2l6ZSA9ICVkICBcbiIsIHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5BbXNkdVNpemUgKSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJUWDogTUNTWzBdID0gJXggKGNob29zZSAlZCksIEJXID0gJWQsIFNob3J0R0kgPSAlZCwgTU9ERSA9ICVkLCAgXG4iLCBwQWN0aXZlSHRQaHktPk1DU1NldFswXSxwSHRQaHktPmZpZWxkLk1DUywKKwkJcEh0UGh5LT5maWVsZC5CVywgcEh0UGh5LT5maWVsZC5TaG9ydEdJLCBwSHRQaHktPmZpZWxkLk1PREUpKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIk1sbWVVcGRhdGVIdFR4UmF0ZXM8PT09IFxuIikpOworfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisvLyBJUlFMID0gRElTUEFUQ0hfTEVWRUwKK1ZPSUQgTWxtZVJhZGlvT2ZmKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCVJUMjhYWF9NTE1FX1JBRElPX09GRihwQWQpOworfQorCisvLyBJUlFMID0gRElTUEFUQ0hfTEVWRUwKK1ZPSUQgTWxtZVJhZGlvT24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJUlQyOFhYX01MTUVfUkFESU9fT04ocEFkKTsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gYnNzX3RhYmxlLmMKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCisvKiEgXGJyaWVmIGluaXRpYWxpemUgQlNTIHRhYmxlCisgKglccGFyYW0gcF90YWIgcG9pbnRlciB0byB0aGUgdGFibGUKKyAqCVxyZXR1cm4gbm9uZQorICoJXHByZQorICoJXHBvc3QKKworIElSUUwgPSBQQVNTSVZFX0xFVkVMCisgSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKyAqLworVk9JRCBCc3NUYWJsZUluaXQoCisJSU4gQlNTX1RBQkxFICpUYWIpCit7CisJaW50IGk7CisKKwlUYWItPkJzc05yID0gMDsKKyAgICBUYWItPkJzc092ZXJsYXBOciA9IDA7CisJZm9yIChpID0gMDsgaSA8IE1BWF9MRU5fT0ZfQlNTX1RBQkxFOyBpKyspCisJeworCQlOZGlzWmVyb01lbW9yeSgmVGFiLT5Cc3NFbnRyeVtpXSwgc2l6ZW9mKEJTU19FTlRSWSkpOworCQlUYWItPkJzc0VudHJ5W2ldLlJzc2kgPSAtMTI3OwkvLyBpbml0aWFsIHRoZSByc3NpIGFzIGEgbWluaW11bSB2YWx1ZQorCX0KK30KKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorVk9JRCBCQVRhYmxlSW5pdCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBCQV9UQUJMRSAqVGFiKQoreworCWludCBpOworCisJVGFiLT5udW1Bc09yaWdpbmF0b3IgPSAwOworCVRhYi0+bnVtQXNSZWNpcGllbnQgPSAwOworCU5kaXNBbGxvY2F0ZVNwaW5Mb2NrKCZwQWQtPkJBVGFiTG9jayk7CisJZm9yIChpID0gMDsgaSA8IE1BWF9MRU5fT0ZfQkFfUkVDX1RBQkxFOyBpKyspCisJeworCQlUYWItPkJBUmVjRW50cnlbaV0uUkVDX0JBX1N0YXR1cyA9IFJlY2lwaWVudF9OT05FOworCQlOZGlzQWxsb2NhdGVTcGluTG9jaygmKFRhYi0+QkFSZWNFbnRyeVtpXS5SeFJlUmluZ0xvY2spKTsKKwl9CisJZm9yIChpID0gMDsgaSA8IE1BWF9MRU5fT0ZfQkFfT1JJX1RBQkxFOyBpKyspCisJeworCQlUYWItPkJBT3JpRW50cnlbaV0uT1JJX0JBX1N0YXR1cyA9IE9yaWdpbmF0b3JfTk9ORTsKKwl9Cit9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKy8qISBcYnJpZWYgc2VhcmNoIHRoZSBCU1MgdGFibGUgYnkgU1NJRAorICoJXHBhcmFtIHBfdGFiIHBvaW50ZXIgdG8gdGhlIGJzcyB0YWJsZQorICoJXHBhcmFtIHNzaWQgU1NJRCBzdHJpbmcKKyAqCVxyZXR1cm4gaW5kZXggb2YgdGhlIHRhYmxlLCBCU1NfTk9UX0ZPVU5EIGlmIG5vdCBpbiB0aGUgdGFibGUKKyAqCVxwcmUKKyAqCVxwb3N0CisgKglcbm90ZSBzZWFyY2ggYnkgc2VxdWVudGlhbCBzZWFyY2gKKworIElSUUwgPSBESVNQQVRDSF9MRVZFTAorCisgKi8KK1VMT05HIEJzc1RhYmxlU2VhcmNoKAorCUlOIEJTU19UQUJMRSAqVGFiLAorCUlOIFBVQ0hBUgkgcEJzc2lkLAorCUlOIFVDSEFSCSBDaGFubmVsKQoreworCVVDSEFSIGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgVGFiLT5Cc3NOcjsgaSsrKQorCXsKKwkJLy8KKwkJLy8gU29tZSBBUCB0aGF0IHN1cHBvcnQgQS9CL0cgbW9kZSB0aGF0IG1heSB1c2VkIHRoZSBzYW1lIEJTU0lEIG9uIDExQSBhbmQgMTFCL0cuCisJCS8vIFdlIHNob3VsZCBkaXN0aW5ndWlzaCB0aGlzIGNhc2UuCisJCS8vCisJCWlmICgoKChUYWItPkJzc0VudHJ5W2ldLkNoYW5uZWwgPD0gMTQpICYmIChDaGFubmVsIDw9IDE0KSkgfHwKKwkJCSAoKFRhYi0+QnNzRW50cnlbaV0uQ2hhbm5lbCA+IDE0KSAmJiAoQ2hhbm5lbCA+IDE0KSkpICYmCisJCQlNQUNfQUREUl9FUVVBTChUYWItPkJzc0VudHJ5W2ldLkJzc2lkLCBwQnNzaWQpKQorCQl7CisJCQlyZXR1cm4gaTsKKwkJfQorCX0KKwlyZXR1cm4gKFVMT05HKUJTU19OT1RfRk9VTkQ7Cit9CisKK1VMT05HIEJzc1NzaWRUYWJsZVNlYXJjaCgKKwlJTiBCU1NfVEFCTEUgKlRhYiwKKwlJTiBQVUNIQVIJIHBCc3NpZCwKKwlJTiBQVUNIQVIJIHBTc2lkLAorCUlOIFVDSEFSCSBTc2lkTGVuLAorCUlOIFVDSEFSCSBDaGFubmVsKQoreworCVVDSEFSIGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgVGFiLT5Cc3NOcjsgaSsrKQorCXsKKwkJLy8KKwkJLy8gU29tZSBBUCB0aGF0IHN1cHBvcnQgQS9CL0cgbW9kZSB0aGF0IG1heSB1c2VkIHRoZSBzYW1lIEJTU0lEIG9uIDExQSBhbmQgMTFCL0cuCisJCS8vIFdlIHNob3VsZCBkaXN0aW5ndWlzaCB0aGlzIGNhc2UuCisJCS8vCisJCWlmICgoKChUYWItPkJzc0VudHJ5W2ldLkNoYW5uZWwgPD0gMTQpICYmIChDaGFubmVsIDw9IDE0KSkgfHwKKwkJCSAoKFRhYi0+QnNzRW50cnlbaV0uQ2hhbm5lbCA+IDE0KSAmJiAoQ2hhbm5lbCA+IDE0KSkpICYmCisJCQlNQUNfQUREUl9FUVVBTChUYWItPkJzc0VudHJ5W2ldLkJzc2lkLCBwQnNzaWQpICYmCisJCQlTU0lEX0VRVUFMKHBTc2lkLCBTc2lkTGVuLCBUYWItPkJzc0VudHJ5W2ldLlNzaWQsIFRhYi0+QnNzRW50cnlbaV0uU3NpZExlbikpCisJCXsKKwkJCXJldHVybiBpOworCQl9CisJfQorCXJldHVybiAoVUxPTkcpQlNTX05PVF9GT1VORDsKK30KKworVUxPTkcgQnNzVGFibGVTZWFyY2hXaXRoU1NJRCgKKwlJTiBCU1NfVEFCTEUgKlRhYiwKKwlJTiBQVUNIQVIJIEJzc2lkLAorCUlOIFBVQ0hBUgkgcFNzaWQsCisJSU4gVUNIQVIJIFNzaWRMZW4sCisJSU4gVUNIQVIJIENoYW5uZWwpCit7CisJVUNIQVIgaTsKKworCWZvciAoaSA9IDA7IGkgPCBUYWItPkJzc05yOyBpKyspCisJeworCQlpZiAoKCgoVGFiLT5Cc3NFbnRyeVtpXS5DaGFubmVsIDw9IDE0KSAmJiAoQ2hhbm5lbCA8PSAxNCkpIHx8CisJCQkoKFRhYi0+QnNzRW50cnlbaV0uQ2hhbm5lbCA+IDE0KSAmJiAoQ2hhbm5lbCA+IDE0KSkpICYmCisJCQlNQUNfQUREUl9FUVVBTCgmKFRhYi0+QnNzRW50cnlbaV0uQnNzaWQpLCBCc3NpZCkgJiYKKwkJCShTU0lEX0VRVUFMKHBTc2lkLCBTc2lkTGVuLCBUYWItPkJzc0VudHJ5W2ldLlNzaWQsIFRhYi0+QnNzRW50cnlbaV0uU3NpZExlbikgfHwKKwkJCShOZGlzRXF1YWxNZW1vcnkocFNzaWQsIFplcm9Tc2lkLCBTc2lkTGVuKSkgfHwKKwkJCShOZGlzRXF1YWxNZW1vcnkoVGFiLT5Cc3NFbnRyeVtpXS5Tc2lkLCBaZXJvU3NpZCwgVGFiLT5Cc3NFbnRyeVtpXS5Tc2lkTGVuKSkpKQorCQl7CisJCQlyZXR1cm4gaTsKKwkJfQorCX0KKwlyZXR1cm4gKFVMT05HKUJTU19OT1RfRk9VTkQ7Cit9CisKKy8vIElSUUwgPSBESVNQQVRDSF9MRVZFTAorVk9JRCBCc3NUYWJsZURlbGV0ZUVudHJ5KAorCUlOIE9VVAlCU1NfVEFCTEUgKlRhYiwKKwlJTgkJUFVDSEFSCSAgcEJzc2lkLAorCUlOCQlVQ0hBUgkgIENoYW5uZWwpCit7CisJVUNIQVIgaSwgajsKKworCWZvciAoaSA9IDA7IGkgPCBUYWItPkJzc05yOyBpKyspCisJeworCQlpZiAoKFRhYi0+QnNzRW50cnlbaV0uQ2hhbm5lbCA9PSBDaGFubmVsKSAmJgorCQkJKE1BQ19BRERSX0VRVUFMKFRhYi0+QnNzRW50cnlbaV0uQnNzaWQsIHBCc3NpZCkpKQorCQl7CisJCQlmb3IgKGogPSBpOyBqIDwgVGFiLT5Cc3NOciAtIDE7IGorKykKKwkJCXsKKwkJCQlOZGlzTW92ZU1lbW9yeSgmKFRhYi0+QnNzRW50cnlbal0pLCAmKFRhYi0+QnNzRW50cnlbaiArIDFdKSwgc2l6ZW9mKEJTU19FTlRSWSkpOworCQkJfQorCQkJTmRpc1plcm9NZW1vcnkoJihUYWItPkJzc0VudHJ5W1RhYi0+QnNzTnIgLSAxXSksIHNpemVvZihCU1NfRU5UUlkpKTsKKwkJCVRhYi0+QnNzTnIgLT0gMTsKKwkJCXJldHVybjsKKwkJfQorCX0KK30KKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlEZWxldGUgdGhlIE9yaWdpbmF0b3IgRW50cnkgaW4gQkF0YWJsZS4gT3IgZGVjcmVhc2UgbnVtQXMgT3JpZ2luYXRvciBieSAxIGlmIG5lZWRlZC4KKworCUFyZ3VtZW50czoKKwkvLyBJUlFMID0gRElTUEFUQ0hfTEVWRUwKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIEJBVGFibGVEZWxldGVPUklFbnRyeSgKKwlJTiBPVVQJUFJUTVBfQURBUFRFUiBwQWQsCisJSU4JCUJBX09SSV9FTlRSWQkqcEJBT1JJRW50cnkpCit7CisKKwlpZiAocEJBT1JJRW50cnktPk9SSV9CQV9TdGF0dXMgIT0gT3JpZ2luYXRvcl9OT05FKQorCXsKKwkJTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5CQVRhYkxvY2spOworCQlpZiAocEJBT1JJRW50cnktPk9SSV9CQV9TdGF0dXMgPT0gT3JpZ2luYXRvcl9Eb25lKQorCQl7CisJCQlwQWQtPkJBVGFibGUubnVtQXNPcmlnaW5hdG9yIC09IDE7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJCQVRhYmxlRGVsZXRlT1JJRW50cnkgbnVtQXNPcmlnaW5hdG9yPSAlbGRcbiIsIHBBZC0+QkFUYWJsZS5udW1Bc1JlY2lwaWVudCkpOworCQkJLy8gRXJhc2UgQml0bWFwIGZsYWcuCisJCX0KKwkJcEFkLT5NYWNUYWIuQ29udGVudFtwQkFPUklFbnRyeS0+V2NpZF0uVFhCQWJpdG1hcCAmPSAofigxPDwocEJBT1JJRW50cnktPlRJRCkgKSk7CS8vIElmIFNUQSBtb2RlLCAgZXJhc2UgZmxhZyBoZXJlCisJCXBBZC0+TWFjVGFiLkNvbnRlbnRbcEJBT1JJRW50cnktPldjaWRdLkJBT3JpV2NpZEFycmF5W3BCQU9SSUVudHJ5LT5USURdID0gMDsJLy8gSWYgU1RBIG1vZGUsICBlcmFzZSBmbGFnIGhlcmUKKwkJcEJBT1JJRW50cnktPk9SSV9CQV9TdGF0dXMgPSBPcmlnaW5hdG9yX05PTkU7CisJCXBCQU9SSUVudHJ5LT5Ub2tlbiA9IDE7CisJCS8vIE5vdCBjbGVhciBTZXF1ZW5jZSBoZXJlLgorCQlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPkJBVGFiTG9jayk7CisJfQorfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisvKiEgXGJyaWVmCisgKglccGFyYW0KKyAqCVxyZXR1cm4KKyAqCVxwcmUKKyAqCVxwb3N0CisKKyBJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworICovCitWT0lEIEJzc0VudHJ5U2V0KAorCUlOIFBSVE1QX0FEQVBURVIJcEFkLAorCU9VVCBCU1NfRU5UUlkgKnBCc3MsCisJSU4gUFVDSEFSIHBCc3NpZCwKKwlJTiBDSEFSIFNzaWRbXSwKKwlJTiBVQ0hBUiBTc2lkTGVuLAorCUlOIFVDSEFSIEJzc1R5cGUsCisJSU4gVVNIT1JUIEJlYWNvblBlcmlvZCwKKwlJTiBQQ0ZfUEFSTSBwQ2ZQYXJtLAorCUlOIFVTSE9SVCBBdGltV2luLAorCUlOIFVTSE9SVCBDYXBhYmlsaXR5SW5mbywKKwlJTiBVQ0hBUiBTdXBSYXRlW10sCisJSU4gVUNIQVIgU3VwUmF0ZUxlbiwKKwlJTiBVQ0hBUiBFeHRSYXRlW10sCisJSU4gVUNIQVIgRXh0UmF0ZUxlbiwKKwlJTiBIVF9DQVBBQklMSVRZX0lFICpwSHRDYXBhYmlsaXR5LAorCUlOIEFERF9IVF9JTkZPX0lFICpwQWRkSHRJbmZvLAkvLyBBUCBtaWdodCB1c2UgdGhpcyBhZGRpdGlvbmFsIGh0IGluZm8gSUUKKwlJTiBVQ0hBUgkJCUh0Q2FwYWJpbGl0eUxlbiwKKwlJTiBVQ0hBUgkJCUFkZEh0SW5mb0xlbiwKKwlJTiBVQ0hBUgkJCU5ld0V4dENoYW5PZmZzZXQsCisJSU4gVUNIQVIgQ2hhbm5lbCwKKwlJTiBDSEFSIFJzc2ksCisJSU4gTEFSR0VfSU5URUdFUiBUaW1lU3RhbXAsCisJSU4gVUNIQVIgQ2tpcEZsYWcsCisJSU4gUEVEQ0FfUEFSTSBwRWRjYVBhcm0sCisJSU4gUFFPU19DQVBBQklMSVRZX1BBUk0gcFFvc0NhcGFiaWxpdHksCisJSU4gUFFCU1NfTE9BRF9QQVJNIHBRYnNzTG9hZCwKKwlJTiBVU0hPUlQgTGVuZ3RoVklFLAorCUlOIFBORElTXzgwMl8xMV9WQVJJQUJMRV9JRXMgcFZJRSkKK3sKKwlDT1BZX01BQ19BRERSKHBCc3MtPkJzc2lkLCBwQnNzaWQpOworCS8vIERlZmF1bHQgSGlkZGVuIFNTSUQgdG8gYmUgVFJVRSwgaXQgd2lsbCBiZSB0dXJuZWQgdG8gRkFMU0UgYWZ0ZXIgY29waW5nIFNTSUQKKwlwQnNzLT5IaWRkZW4gPSAxOworCWlmIChTc2lkTGVuID4gMCkKKwl7CisJCS8vIEZvciBoaWRkZW4gU1NJRCBBUCwgaXQgbWlnaHQgc2VuZCBiZWFjb24gd2l0aCBTU0lEIGxlbiBlcXVhbCB0byAwCisJCS8vIE9yIHNlbmQgYmVhY29uIC9wcm9iZSByZXNwb25zZSB3aXRoIFNTSUQgbGVuIG1hdGNoaW5nIHJlYWwgU1NJRCBsZW5ndGgsCisJCS8vIGJ1dCBTU0lEIGlzIGFsbCB6ZXJvLiBzdWNoIGFzICIwMC0wMC0wMC0wMCIgd2l0aCBsZW5ndGggNC4KKwkJLy8gV2UgaGF2ZSB0byBwcmV2ZW50IHRoaXMgY2FzZSBvdmVyd3JpdGUgY29ycmVjdCB0YWJsZQorCQlpZiAoTmRpc0VxdWFsTWVtb3J5KFNzaWQsIFplcm9Tc2lkLCBTc2lkTGVuKSA9PSAwKQorCQl7CisJCSAgICBOZGlzWmVyb01lbW9yeShwQnNzLT5Tc2lkLCBNQVhfTEVOX09GX1NTSUQpOworCQkJTmRpc01vdmVNZW1vcnkocEJzcy0+U3NpZCwgU3NpZCwgU3NpZExlbik7CisJCQlwQnNzLT5Tc2lkTGVuID0gU3NpZExlbjsKKwkJCXBCc3MtPkhpZGRlbiA9IDA7CisJCX0KKwl9CisJZWxzZQorCQlwQnNzLT5Tc2lkTGVuID0gMDsKKwlwQnNzLT5Cc3NUeXBlID0gQnNzVHlwZTsKKwlwQnNzLT5CZWFjb25QZXJpb2QgPSBCZWFjb25QZXJpb2Q7CisJaWYgKEJzc1R5cGUgPT0gQlNTX0lORlJBKQorCXsKKwkJaWYgKHBDZlBhcm0tPmJWYWxpZCkKKwkJeworCQkJcEJzcy0+Q2ZwQ291bnQgPSBwQ2ZQYXJtLT5DZnBDb3VudDsKKwkJCXBCc3MtPkNmcFBlcmlvZCA9IHBDZlBhcm0tPkNmcFBlcmlvZDsKKwkJCXBCc3MtPkNmcE1heER1cmF0aW9uID0gcENmUGFybS0+Q2ZwTWF4RHVyYXRpb247CisJCQlwQnNzLT5DZnBEdXJSZW1haW5pbmcgPSBwQ2ZQYXJtLT5DZnBEdXJSZW1haW5pbmc7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJcEJzcy0+QXRpbVdpbiA9IEF0aW1XaW47CisJfQorCisJcEJzcy0+Q2FwYWJpbGl0eUluZm8gPSBDYXBhYmlsaXR5SW5mbzsKKwkvLyBUaGUgcHJpdmFjeSBiaXQgaW5kaWNhdGUgc2VjdXJpdHkgaXMgT04sIGl0IG1haWdodCBiZSBXRVAsIFRLSVAgb3IgQUVTCisJLy8gQ29tYmluZSB3aXRoIEF1dGhNb2RlLCB0aGV5IHdpbGwgZGVjaWRlIHRoZSBjb25uZWN0aW9uIG1ldGhvZHMuCisJcEJzcy0+UHJpdmFjeSA9IENBUF9JU19QUklWQUNZX09OKHBCc3MtPkNhcGFiaWxpdHlJbmZvKTsKKwlBU1NFUlQoU3VwUmF0ZUxlbiA8PSBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUyk7CisJaWYgKFN1cFJhdGVMZW4gPD0gTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVMpCisJCU5kaXNNb3ZlTWVtb3J5KHBCc3MtPlN1cFJhdGUsIFN1cFJhdGUsIFN1cFJhdGVMZW4pOworCWVsc2UKKwkJTmRpc01vdmVNZW1vcnkocEJzcy0+U3VwUmF0ZSwgU3VwUmF0ZSwgTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVMpOworCXBCc3MtPlN1cFJhdGVMZW4gPSBTdXBSYXRlTGVuOworCUFTU0VSVChFeHRSYXRlTGVuIDw9IE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTKTsKKwlOZGlzTW92ZU1lbW9yeShwQnNzLT5FeHRSYXRlLCBFeHRSYXRlLCBFeHRSYXRlTGVuKTsKKwlOZGlzTW92ZU1lbW9yeSgmcEJzcy0+SHRDYXBhYmlsaXR5LCBwSHRDYXBhYmlsaXR5LCBIdENhcGFiaWxpdHlMZW4pOworCU5kaXNNb3ZlTWVtb3J5KCZwQnNzLT5BZGRIdEluZm8sIHBBZGRIdEluZm8sIEFkZEh0SW5mb0xlbik7CisJcEJzcy0+TmV3RXh0Q2hhbk9mZnNldCA9IE5ld0V4dENoYW5PZmZzZXQ7CisJcEJzcy0+RXh0UmF0ZUxlbiA9IEV4dFJhdGVMZW47CisJcEJzcy0+Q2hhbm5lbCA9IENoYW5uZWw7CisJcEJzcy0+Q2VudHJhbENoYW5uZWwgPSBDaGFubmVsOworCXBCc3MtPlJzc2kgPSBSc3NpOworCS8vIFVwZGF0ZSBDa2lwRmxhZy4gaWYgbm90IGV4aXN0cywgdGhlIHZhbHVlIGlzIDB4MAorCXBCc3MtPkNraXBGbGFnID0gQ2tpcEZsYWc7CisKKwkvLyBOZXcgZm9yIG1pY3Jvc29mdCBGaXhlZCBJRXMKKwlOZGlzTW92ZU1lbW9yeShwQnNzLT5GaXhJRXMuVGltZXN0YW1wLCAmVGltZVN0YW1wLCA4KTsKKwlwQnNzLT5GaXhJRXMuQmVhY29uSW50ZXJ2YWwgPSBCZWFjb25QZXJpb2Q7CisJcEJzcy0+Rml4SUVzLkNhcGFiaWxpdGllcyA9IENhcGFiaWxpdHlJbmZvOworCisJLy8gTmV3IGZvciBtaWNyb3NvZnQgVmFyaWFibGUgSUVzCisJaWYgKExlbmd0aFZJRSAhPSAwKQorCXsKKwkJcEJzcy0+VmFySUVMZW4gPSBMZW5ndGhWSUU7CisJCU5kaXNNb3ZlTWVtb3J5KHBCc3MtPlZhcklFcywgcFZJRSwgcEJzcy0+VmFySUVMZW4pOworCX0KKwllbHNlCisJeworCQlwQnNzLT5WYXJJRUxlbiA9IDA7CisJfQorCisJcEJzcy0+QWRkSHRJbmZvTGVuID0gMDsKKwlwQnNzLT5IdENhcGFiaWxpdHlMZW4gPSAwOworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCWlmIChIdENhcGFiaWxpdHlMZW4+IDApCisJeworCQlwQnNzLT5IdENhcGFiaWxpdHlMZW4gPSBIdENhcGFiaWxpdHlMZW47CisJCU5kaXNNb3ZlTWVtb3J5KCZwQnNzLT5IdENhcGFiaWxpdHksIHBIdENhcGFiaWxpdHksIEh0Q2FwYWJpbGl0eUxlbik7CisJCWlmIChBZGRIdEluZm9MZW4gPiAwKQorCQl7CisJCQlwQnNzLT5BZGRIdEluZm9MZW4gPSBBZGRIdEluZm9MZW47CisJCQlOZGlzTW92ZU1lbW9yeSgmcEJzcy0+QWRkSHRJbmZvLCBwQWRkSHRJbmZvLCBBZGRIdEluZm9MZW4pOworCisJIAkJCWlmICgocEFkZEh0SW5mby0+Q29udHJvbENoYW4gPiAyKSYmIChwQWRkSHRJbmZvLT5BZGRIdEluZm8uRXh0Q2hhbk9mZnNldCA9PSBFWFRDSEFfQkVMT1cpICYmIChwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uQ2hhbm5lbFdpZHRoID09IEJXXzQwKSkKKwkgCQkJeworCSAJCQkJcEJzcy0+Q2VudHJhbENoYW5uZWwgPSBwQWRkSHRJbmZvLT5Db250cm9sQ2hhbiAtIDI7CisJIAkJCX0KKwkgCQkJZWxzZSBpZiAoKHBBZGRIdEluZm8tPkFkZEh0SW5mby5FeHRDaGFuT2Zmc2V0ID09IEVYVENIQV9BQk9WRSkgJiYgKHBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5DaGFubmVsV2lkdGggPT0gQldfNDApKQorCQkJCXsKKwkJIAkJCQlwQnNzLT5DZW50cmFsQ2hhbm5lbCA9IHBBZGRIdEluZm8tPkNvbnRyb2xDaGFuICsgMjsKKwkJCQl9CisJCX0KKwl9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwlCc3NDaXBoZXJQYXJzZShwQnNzKTsKKworCS8vIG5ldyBmb3IgUU9TCisJaWYgKHBFZGNhUGFybSkKKwkJTmRpc01vdmVNZW1vcnkoJnBCc3MtPkVkY2FQYXJtLCBwRWRjYVBhcm0sIHNpemVvZihFRENBX1BBUk0pKTsKKwllbHNlCisJCXBCc3MtPkVkY2FQYXJtLmJWYWxpZCA9IEZBTFNFOworCWlmIChwUW9zQ2FwYWJpbGl0eSkKKwkJTmRpc01vdmVNZW1vcnkoJnBCc3MtPlFvc0NhcGFiaWxpdHksIHBRb3NDYXBhYmlsaXR5LCBzaXplb2YoUU9TX0NBUEFCSUxJVFlfUEFSTSkpOworCWVsc2UKKwkJcEJzcy0+UW9zQ2FwYWJpbGl0eS5iVmFsaWQgPSBGQUxTRTsKKwlpZiAocFFic3NMb2FkKQorCQlOZGlzTW92ZU1lbW9yeSgmcEJzcy0+UWJzc0xvYWQsIHBRYnNzTG9hZCwgc2l6ZW9mKFFCU1NfTE9BRF9QQVJNKSk7CisJZWxzZQorCQlwQnNzLT5RYnNzTG9hZC5iVmFsaWQgPSBGQUxTRTsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJeworCQlQRUlEX1NUUlVDVCAgICAgcEVpZDsKKwkJVVNIT1JUICAgICAgICAgIExlbmd0aCA9IDA7CisKKworCQlOZGlzWmVyb01lbW9yeSgmcEJzcy0+V3BhSUUuSUVbMF0sIE1BWF9DVVNUT01fTEVOKTsKKwkJTmRpc1plcm9NZW1vcnkoJnBCc3MtPlJzbklFLklFWzBdLCBNQVhfQ1VTVE9NX0xFTik7CisjaWZkZWYgRVhUX0JVSUxEX0NIQU5ORUxfTElTVAorCQlOZGlzWmVyb01lbW9yeSgmcEJzcy0+Q291bnRyeVN0cmluZ1swXSwgMyk7CisJCXBCc3MtPmJIYXNDb3VudHJ5SUUgPSBGQUxTRTsKKyNlbmRpZiAvLyBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUIC8vCisJCXBFaWQgPSAoUEVJRF9TVFJVQ1QpIHBWSUU7CisJCXdoaWxlICgoTGVuZ3RoICsgMiArIChVU0hPUlQpcEVpZC0+TGVuKSA8PSBMZW5ndGhWSUUpCisJCXsKKwkJCXN3aXRjaChwRWlkLT5FaWQpCisJCQl7CisJCQkJY2FzZSBJRV9XUEE6CisJCQkJCWlmIChOZGlzRXF1YWxNZW1vcnkocEVpZC0+T2N0ZXQsIFdQQV9PVUksIDQpKQorCQkJCQl7CisJCQkJCQlpZiAoKHBFaWQtPkxlbiArIDIpID4gTUFYX0NVU1RPTV9MRU4pCisJCQkJCQl7CisJCQkJCQkJcEJzcy0+V3BhSUUuSUVMZW4gPSAwOworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQkJcEJzcy0+V3BhSUUuSUVMZW4gPSBwRWlkLT5MZW4gKyAyOworCQkJCQkJTmRpc01vdmVNZW1vcnkocEJzcy0+V3BhSUUuSUUsIHBFaWQsIHBCc3MtPldwYUlFLklFTGVuKTsKKwkJCQkJfQorCQkJCQlicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIElFX1JTTjoKKyAgICAgICAgICAgICAgICAgICAgaWYgKE5kaXNFcXVhbE1lbW9yeShwRWlkLT5PY3RldCArIDIsIFJTTl9PVUksIDMpKQorCQkJCQl7CisJCQkJCQlpZiAoKHBFaWQtPkxlbiArIDIpID4gTUFYX0NVU1RPTV9MRU4pCisJCQkJCQl7CisJCQkJCQkJcEJzcy0+UnNuSUUuSUVMZW4gPSAwOworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQkJcEJzcy0+UnNuSUUuSUVMZW4gPSBwRWlkLT5MZW4gKyAyOworCQkJCQkJTmRpc01vdmVNZW1vcnkocEJzcy0+UnNuSUUuSUUsIHBFaWQsIHBCc3MtPlJzbklFLklFTGVuKTsKKwkJCX0KKwkJCQlicmVhazsKKyNpZmRlZiBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUCisJCQkJY2FzZSBJRV9DT1VOVFJZOgorCQkJCQlOZGlzTW92ZU1lbW9yeSgmcEJzcy0+Q291bnRyeVN0cmluZ1swXSwgcEVpZC0+T2N0ZXQsIDMpOworCQkJCQlwQnNzLT5iSGFzQ291bnRyeUlFID0gVFJVRTsKKwkJCQkJYnJlYWs7CisjZW5kaWYgLy8gRVhUX0JVSUxEX0NIQU5ORUxfTElTVCAvLworICAgICAgICAgICAgfQorCQkJTGVuZ3RoID0gTGVuZ3RoICsgMiArIChVU0hPUlQpcEVpZC0+TGVuOyAgLy8gRWlkWzFdICsgTGVuWzFdKyBjb250ZW50W0xlbl0KKwkJCXBFaWQgPSAoUEVJRF9TVFJVQ1QpKChVQ0hBUiopcEVpZCArIDIgKyBwRWlkLT5MZW4pOworCQl9CisJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworfQorCisvKiEKKyAqCVxicmllZiBpbnNlcnQgYW4gZW50cnkgaW50byB0aGUgYnNzIHRhYmxlCisgKglccGFyYW0gcF90YWIgVGhlIEJTUyB0YWJsZQorICoJXHBhcmFtIEJzc2lkIEJTU0lECisgKglccGFyYW0gc3NpZCBTU0lECisgKglccGFyYW0gc3NpZF9sZW4gTGVuZ3RoIG9mIFNTSUQKKyAqCVxwYXJhbSBic3NfdHlwZQorICoJXHBhcmFtIGJlYWNvbl9wZXJpb2QKKyAqCVxwYXJhbSB0aW1lc3RhbXAKKyAqCVxwYXJhbSBwX2NmCisgKglccGFyYW0gYXRpbV93aW4KKyAqCVxwYXJhbSBjYXAKKyAqCVxwYXJhbSByYXRlcworICoJXHBhcmFtIHJhdGVzX2xlbgorICoJXHBhcmFtIGNoYW5uZWxfaWR4CisgKglccmV0dXJuIG5vbmUKKyAqCVxwcmUKKyAqCVxwb3N0CisgKglcbm90ZSBJZiBTU0lEIGlzIGlkZW50aWNhbCwgdGhlIG9sZCBlbnRyeSB3aWxsIGJlIHJlcGxhY2VkIGJ5IHRoZSBuZXcgb25lCisKKyBJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworICovCitVTE9ORyBCc3NUYWJsZVNldEVudHJ5KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVCBCU1NfVEFCTEUgKlRhYiwKKwlJTiBQVUNIQVIgcEJzc2lkLAorCUlOIENIQVIgU3NpZFtdLAorCUlOIFVDSEFSIFNzaWRMZW4sCisJSU4gVUNIQVIgQnNzVHlwZSwKKwlJTiBVU0hPUlQgQmVhY29uUGVyaW9kLAorCUlOIENGX1BBUk0gKkNmUGFybSwKKwlJTiBVU0hPUlQgQXRpbVdpbiwKKwlJTiBVU0hPUlQgQ2FwYWJpbGl0eUluZm8sCisJSU4gVUNIQVIgU3VwUmF0ZVtdLAorCUlOIFVDSEFSIFN1cFJhdGVMZW4sCisJSU4gVUNIQVIgRXh0UmF0ZVtdLAorCUlOIFVDSEFSIEV4dFJhdGVMZW4sCisJSU4gSFRfQ0FQQUJJTElUWV9JRSAqcEh0Q2FwYWJpbGl0eSwKKwlJTiBBRERfSFRfSU5GT19JRSAqcEFkZEh0SW5mbywJLy8gQVAgbWlnaHQgdXNlIHRoaXMgYWRkaXRpb25hbCBodCBpbmZvIElFCisJSU4gVUNIQVIJCQlIdENhcGFiaWxpdHlMZW4sCisJSU4gVUNIQVIJCQlBZGRIdEluZm9MZW4sCisJSU4gVUNIQVIJCQlOZXdFeHRDaGFuT2Zmc2V0LAorCUlOIFVDSEFSIENoYW5uZWxObywKKwlJTiBDSEFSIFJzc2ksCisJSU4gTEFSR0VfSU5URUdFUiBUaW1lU3RhbXAsCisJSU4gVUNIQVIgQ2tpcEZsYWcsCisJSU4gUEVEQ0FfUEFSTSBwRWRjYVBhcm0sCisJSU4gUFFPU19DQVBBQklMSVRZX1BBUk0gcFFvc0NhcGFiaWxpdHksCisJSU4gUFFCU1NfTE9BRF9QQVJNIHBRYnNzTG9hZCwKKwlJTiBVU0hPUlQgTGVuZ3RoVklFLAorCUlOIFBORElTXzgwMl8xMV9WQVJJQUJMRV9JRXMgcFZJRSkKK3sKKwlVTE9ORwlJZHg7CisKKwlJZHggPSBCc3NUYWJsZVNlYXJjaFdpdGhTU0lEKFRhYiwgcEJzc2lkLCAgU3NpZCwgU3NpZExlbiwgQ2hhbm5lbE5vKTsKKwlpZiAoSWR4ID09IEJTU19OT1RfRk9VTkQpCisJeworCQlpZiAoVGFiLT5Cc3NOciA+PSBNQVhfTEVOX09GX0JTU19UQUJMRSkKKwkgICAgeworCQkJLy8KKwkJCS8vIEl0IG1heSBoYXBwZW4gd2hlbiBCU1MgVGFibGUgd2FzIGZ1bGwuCisJCQkvLyBUaGUgZGVzaXJlZCBBUCB3aWxsIG5vdCBiZSBhZGRlZCBpbnRvIEJTUyBUYWJsZQorCQkJLy8gSW4gdGhpcyBjYXNlLCBpZiB3ZSBmb3VuZCB0aGUgZGVzaXJlZCBBUCB0aGVuIG92ZXJ3cml0ZSBCU1MgVGFibGUuCisJCQkvLworCQkJaWYoIU9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSkKKwkJCXsKKwkJCQlpZiAoTUFDX0FERFJfRVFVQUwocEFkLT5NbG1lQXV4LkJzc2lkLCBwQnNzaWQpIHx8CisJCQkJCVNTSURfRVFVQUwocEFkLT5NbG1lQXV4LlNzaWQsIHBBZC0+TWxtZUF1eC5Tc2lkTGVuLCBTc2lkLCBTc2lkTGVuKSkKKwkJCQl7CisJCQkJCUlkeCA9IFRhYi0+QnNzT3ZlcmxhcE5yOworCQkJCQlCc3NFbnRyeVNldChwQWQsICZUYWItPkJzc0VudHJ5W0lkeF0sIHBCc3NpZCwgU3NpZCwgU3NpZExlbiwgQnNzVHlwZSwgQmVhY29uUGVyaW9kLCBDZlBhcm0sIEF0aW1XaW4sCisJCQkJCQlDYXBhYmlsaXR5SW5mbywgU3VwUmF0ZSwgU3VwUmF0ZUxlbiwgRXh0UmF0ZSwgRXh0UmF0ZUxlbixwSHRDYXBhYmlsaXR5LCBwQWRkSHRJbmZvLEh0Q2FwYWJpbGl0eUxlbiwgQWRkSHRJbmZvTGVuLAorCQkJCQkJTmV3RXh0Q2hhbk9mZnNldCwgQ2hhbm5lbE5vLCBSc3NpLCBUaW1lU3RhbXAsIENraXBGbGFnLCBwRWRjYVBhcm0sIHBRb3NDYXBhYmlsaXR5LCBwUWJzc0xvYWQsIExlbmd0aFZJRSwgcFZJRSk7CisgICAgICAgICAgICAgICAgICAgIFRhYi0+QnNzT3ZlcmxhcE5yID0gKFRhYi0+QnNzT3ZlcmxhcE5yKyspICUgTUFYX0xFTl9PRl9CU1NfVEFCTEU7CisJCQkJfQorCQkJCXJldHVybiBJZHg7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQlyZXR1cm4gQlNTX05PVF9GT1VORDsKKwkJCX0KKwkJfQorCQlJZHggPSBUYWItPkJzc05yOworCQlCc3NFbnRyeVNldChwQWQsICZUYWItPkJzc0VudHJ5W0lkeF0sIHBCc3NpZCwgU3NpZCwgU3NpZExlbiwgQnNzVHlwZSwgQmVhY29uUGVyaW9kLCBDZlBhcm0sIEF0aW1XaW4sCisJCQkJCUNhcGFiaWxpdHlJbmZvLCBTdXBSYXRlLCBTdXBSYXRlTGVuLCBFeHRSYXRlLCBFeHRSYXRlTGVuLHBIdENhcGFiaWxpdHksIHBBZGRIdEluZm8sSHRDYXBhYmlsaXR5TGVuLCBBZGRIdEluZm9MZW4sCisJCQkJCU5ld0V4dENoYW5PZmZzZXQsIENoYW5uZWxObywgUnNzaSwgVGltZVN0YW1wLCBDa2lwRmxhZywgcEVkY2FQYXJtLCBwUW9zQ2FwYWJpbGl0eSwgcFFic3NMb2FkLCBMZW5ndGhWSUUsIHBWSUUpOworCQlUYWItPkJzc05yKys7CisJfQorCWVsc2UKKwl7CisJCUJzc0VudHJ5U2V0KHBBZCwgJlRhYi0+QnNzRW50cnlbSWR4XSwgcEJzc2lkLCBTc2lkLCBTc2lkTGVuLCBCc3NUeXBlLCBCZWFjb25QZXJpb2QsQ2ZQYXJtLCBBdGltV2luLAorCQkJCQlDYXBhYmlsaXR5SW5mbywgU3VwUmF0ZSwgU3VwUmF0ZUxlbiwgRXh0UmF0ZSwgRXh0UmF0ZUxlbixwSHRDYXBhYmlsaXR5LCBwQWRkSHRJbmZvLEh0Q2FwYWJpbGl0eUxlbiwgQWRkSHRJbmZvTGVuLAorCQkJCQlOZXdFeHRDaGFuT2Zmc2V0LCBDaGFubmVsTm8sIFJzc2ksIFRpbWVTdGFtcCwgQ2tpcEZsYWcsIHBFZGNhUGFybSwgcFFvc0NhcGFiaWxpdHksIHBRYnNzTG9hZCwgTGVuZ3RoVklFLCBwVklFKTsKKwl9CisKKwlyZXR1cm4gSWR4OworfQorCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisjaWZkZWYgRE9UMTFOX0RSQUZUMworVk9JRCAgVHJpRXZlbnRJbml0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKQoreworCVVDSEFSCQlpOworCisJZm9yIChpID0gMDtpIDwgTUFYX1RSSUdHRVJfRVZFTlQ7aSsrKQorCQlwQWQtPkNvbW1vbkNmZy5UcmlnZ2VyRXZlbnRUYWIuRXZlbnRBW2ldLmJWYWxpZCA9IEZBTFNFOworCisJcEFkLT5Db21tb25DZmcuVHJpZ2dlckV2ZW50VGFiLkV2ZW50QU5vID0gMDsKKwlwQWQtPkNvbW1vbkNmZy5UcmlnZ2VyRXZlbnRUYWIuRXZlbnRCQ291bnREb3duID0gMDsKK30KKworVUxPTkcgVHJpRXZlbnRUYWJsZVNldEVudHJ5KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVCBUUklHR0VSX0VWRU5UX1RBQiAqVGFiLAorCUlOIFBVQ0hBUiBwQnNzaWQsCisJSU4gSFRfQ0FQQUJJTElUWV9JRSAqcEh0Q2FwYWJpbGl0eSwKKwlJTiBVQ0hBUgkJCUh0Q2FwYWJpbGl0eUxlbiwKKwlJTiBVQ0hBUgkJCVJlZ0NsYXNzLAorCUlOIFVDSEFSIENoYW5uZWxObykKK3sKKwkvLyBFdmVudCBBCisJaWYgKEh0Q2FwYWJpbGl0eUxlbiA9PSAwKQorCXsKKwkJaWYgKFRhYi0+RXZlbnRBTm8gPCBNQVhfVFJJR0dFUl9FVkVOVCkKKwkJeworCQkJUlRNUE1vdmVNZW1vcnkoVGFiLT5FdmVudEFbVGFiLT5FdmVudEFOb10uQlNTSUQsIHBCc3NpZCwgNik7CisJCQlUYWItPkV2ZW50QVtUYWItPkV2ZW50QU5vXS5iVmFsaWQgPSBUUlVFOworCQkJVGFiLT5FdmVudEFbVGFiLT5FdmVudEFOb10uQ2hhbm5lbCA9IENoYW5uZWxObzsKKwkJCVRhYi0+RXZlbnRBW1RhYi0+RXZlbnRBTm9dLkNEQ291bnRlciA9IHBBZC0+Q29tbW9uQ2ZnLkRvdDExQnNzV2lkdGhDaGFuVHJhbkRlbGF5OworCQkJaWYgKFJlZ0NsYXNzICE9IDApCisJCQl7CisJCQkJLy8gQmVhY29uIGhhcyBSZWd1bGF0b3J5IGNsYXNzIElFLiBTbyB1c2UgYmVhY29uJ3MKKwkJCQlUYWItPkV2ZW50QVtUYWItPkV2ZW50QU5vXS5SZWdDbGFzcyA9IFJlZ0NsYXNzOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCS8vIFVzZSBTdGF0aW9uJ3MgUmVndWxhdG9yeSBjbGFzcyBpbnN0ZWFkLgorCQkJCWlmIChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRIdFBoeS5iSHRFbmFibGUgPT0gVFJVRSkKKwkJCQl7CisJCQkJCWlmIChwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA+IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpCisJCQkJCXsKKwkJCQkJCVRhYi0+RXZlbnRBW1RhYi0+RXZlbnRBTm9dLlJlZ0NsYXNzID0gMzI7CisJCQkJCX0KKwkJCQkJZWxzZSBpZiAocEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKQorCQkJCQkJVGFiLT5FdmVudEFbVGFiLT5FdmVudEFOb10uUmVnQ2xhc3MgPSAzMzsKKwkJCQl9CisJCQkJZWxzZQorCQkJCQlUYWItPkV2ZW50QVtUYWItPkV2ZW50QU5vXS5SZWdDbGFzcyA9ID8/OworCisJCQl9CisKKwkJCVRhYi0+RXZlbnRBTm8gKys7CisJCX0KKwl9CisJZWxzZSBpZiAocEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLkludG9sZXJhbnQ0MCkKKwl7CisJCVRhYi0+RXZlbnRCQ291bnREb3duID0gcEFkLT5Db21tb25DZmcuRG90MTFCc3NXaWR0aENoYW5UcmFuRGVsYXk7CisJfQorCit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJVHJpZ2dlciBFdmVudCB0YWJsZSBNYWludGFpbmVuY2UgY2FsbGVkIG9uY2UgZXZlcnkgc2Vjb25kLgorCisJQXJndW1lbnRzOgorCS8vIElSUUwgPSBESVNQQVRDSF9MRVZFTAorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgVHJpRXZlbnRDb3VudGVyTWFpbnRlbmFuY2UoCisJSU4JUFJUTVBfQURBUFRFUglwQWQpCit7CisJVUNIQVIJCWk7CisJQk9PTEVBTgkJCWJOb3RpZnkgPSBGQUxTRTsKKwlmb3IgKGkgPSAwO2kgPCBNQVhfVFJJR0dFUl9FVkVOVDtpKyspCisJeworCQlpZiAocEFkLT5Db21tb25DZmcuVHJpZ2dlckV2ZW50VGFiLkV2ZW50QVtpXS5iVmFsaWQgJiYgKHBBZC0+Q29tbW9uQ2ZnLlRyaWdnZXJFdmVudFRhYi5FdmVudEFbaV0uQ0RDb3VudGVyID4gMCkpCisJCXsKKwkJCXBBZC0+Q29tbW9uQ2ZnLlRyaWdnZXJFdmVudFRhYi5FdmVudEFbaV0uQ0RDb3VudGVyLS07CisJCQlpZiAocEFkLT5Db21tb25DZmcuVHJpZ2dlckV2ZW50VGFiLkV2ZW50QVtpXS5DRENvdW50ZXIgPT0gMCkKKwkJCXsKKwkJCQlwQWQtPkNvbW1vbkNmZy5UcmlnZ2VyRXZlbnRUYWIuRXZlbnRBW2ldLmJWYWxpZCA9IEZBTFNFOworCQkJCXBBZC0+Q29tbW9uQ2ZnLlRyaWdnZXJFdmVudFRhYi5FdmVudEFObyAtLTsKKwkJCQkvLyBOZWVkIHRvIHNlbmQgMjAvNDAgQ29leGlzdGVuY2UgTm90aWZ5IGZyYW1lIGlmIGhhcyBzdGF0dXMgY2hhbmdlLgorCQkJCWJOb3RpZnkgPSBUUlVFOworCQkJfQorCQl9CisJfQorCWlmIChwQWQtPkNvbW1vbkNmZy5UcmlnZ2VyRXZlbnRUYWIuRXZlbnRCQ291bnREb3duID4gMCkKKwl7CisJCXBBZC0+Q29tbW9uQ2ZnLlRyaWdnZXJFdmVudFRhYi5FdmVudEJDb3VudERvd24tLTsKKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLlRyaWdnZXJFdmVudFRhYi5FdmVudEJDb3VudERvd24gPT0gMCkKKwkJCWJOb3RpZnkgPSBUUlVFOworCX0KKworCWlmIChiTm90aWZ5ID09IFRSVUUpCisJCVVwZGF0ZTIwNDBDb2V4aXN0RnJhbWVBbmROb3RpZnkocEFkLCBCU1NJRF9XQ0lELCBUUlVFKTsKK30KKyNlbmRpZiAvLyBET1QxMU5fRFJBRlQzIC8vCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKy8vIElSUUwgPSBESVNQQVRDSF9MRVZFTAorVk9JRCBCc3NUYWJsZVNzaWRTb3J0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVCBCU1NfVEFCTEUgKk91dFRhYiwKKwlJTglDSEFSIFNzaWRbXSwKKwlJTglVQ0hBUiBTc2lkTGVuKQoreworCUlOVCBpOworCUJzc1RhYmxlSW5pdChPdXRUYWIpOworCisJZm9yIChpID0gMDsgaSA8IHBBZC0+U2NhblRhYi5Cc3NOcjsgaSsrKQorCXsKKwkJQlNTX0VOVFJZICpwSW5Cc3MgPSAmcEFkLT5TY2FuVGFiLkJzc0VudHJ5W2ldOworCQlCT09MRUFOCWJJc0hpZGRlbkFwSW5jbHVkZWQgPSBGQUxTRTsKKworCQlpZiAoKChwQWQtPkNvbW1vbkNmZy5iSUVFRTgwMjExSCA9PSAxKSAmJgorICAgICAgICAgICAgKHBBZC0+TWxtZUF1eC5DaGFubmVsID4gMTQpICYmCisgICAgICAgICAgICAgUmFkYXJDaGFubmVsQ2hlY2socEFkLCBwSW5Cc3MtPkNoYW5uZWwpKQorI2lmZGVmIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQgLy8gUm9nZXIgc3luYyBDYXJyaWVyCisgICAgICAgICAgICAgfHwgKHBBZC0+Q29tbW9uQ2ZnLkNhcnJpZXJEZXRlY3QuRW5hYmxlID09IFRSVUUpCisjZW5kaWYgLy8gQ0FSUklFUl9ERVRFQ1RJT05fU1VQUE9SVCAvLworICAgICAgICAgICAgKQorCQl7CisJCQlpZiAocEluQnNzLT5IaWRkZW4pCisJCQkJYklzSGlkZGVuQXBJbmNsdWRlZCA9IFRSVUU7CisJCX0KKworCQlpZiAoKHBJbkJzcy0+QnNzVHlwZSA9PSBwQWQtPlN0YUNmZy5Cc3NUeXBlKSAmJgorCQkJKFNTSURfRVFVQUwoU3NpZCwgU3NpZExlbiwgcEluQnNzLT5Tc2lkLCBwSW5Cc3MtPlNzaWRMZW4pIHx8IGJJc0hpZGRlbkFwSW5jbHVkZWQpKQorCQl7CisJCQlCU1NfRU5UUlkgKnBPdXRCc3MgPSAmT3V0VGFiLT5Cc3NFbnRyeVtPdXRUYWItPkJzc05yXTsKKworCisjaWZkZWYgRVhUX0JVSUxEX0NIQU5ORUxfTElTVAorCQkJLy8gSWYgbm8gQ291bnRyeSBJRSBleGlzdHMgbm8gQ29ubmVjdGlvbiB3aWxsIGJlIGVzdGFibGlzaGVkIHdoZW4gSUVFRTgwMjExZENsaWVudE1vZGUgaXMgc3RyaWN0LgorCQkJaWYgKChwQWQtPlN0YUNmZy5JRUVFODAyMTFkQ2xpZW50TW9kZSA9PSBSdDgwMl8xMV9EX1N0cmljdCkgJiYKKwkJCQkocEluQnNzLT5iSGFzQ291bnRyeUlFID09IEZBTFNFKSkKKwkJCXsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlN0YUNmZy5JRUVFODAyMTFkQ2xpZW50TW9kZSA9PSBSdDgwMl8xMV9EX1N0cmljdCwgYnV0IHRoaXMgQVAgZG9lc24ndCBoYXZlIGNvdW50cnkgSUUuXG4iKSk7CisJCQkJY29udGludWU7CisJCQl9CisjZW5kaWYgLy8gRVhUX0JVSUxEX0NIQU5ORUxfTElTVCAvLworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQkvLyAyLjRHLzVHIE4gb25seSBtb2RlCisJCQlpZiAoKHBJbkJzcy0+SHRDYXBhYmlsaXR5TGVuID09IDApICYmCisJCQkJKChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMU5fMl80RykgfHwgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExTl81RykpKQorCQkJeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiU1RBIGlzIGluIE4tb25seSBNb2RlLCB0aGlzIEFQIGRvbid0IGhhdmUgSHQgY2FwYWJpbGl0eSBpbiBCZWFjb24uXG4iKSk7CisJCQkJY29udGludWU7CisJCQl9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwkJCS8vIE5ldyBmb3IgV1BBMgorCQkJLy8gQ2hlY2sgdGhlIEF1dGhtb2RlIGZpcnN0CisJCQlpZiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKQorCQkJeworCQkJCS8vIENoZWNrIEF1dGhNb2RlIGFuZCBBdXRoTW9kZUF1eCBmb3IgbWF0Y2hpbmcsIGluIGNhc2UgQVAgc3VwcG9ydCBkdWFsLW1vZGUKKwkJCQlpZiAoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlICE9IHBJbkJzcy0+QXV0aE1vZGUpICYmIChwQWQtPlN0YUNmZy5BdXRoTW9kZSAhPSBwSW5Cc3MtPkF1dGhNb2RlQXV4KSkKKwkJCQkJLy8gTm9uZSBtYXRjaGVkCisJCQkJCWNvbnRpbnVlOworCisJCQkJLy8gQ2hlY2sgY2lwaGVyIHN1aXRlLCBBUCBtdXN0IGhhdmUgbW9yZSBzZWN1cmVkIGNpcGhlciB0aGFuIHN0YXRpb24gc2V0dGluZworCQkJCWlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKSB8fCAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKSkKKwkJCQl7CisJCQkJCS8vIElmIGl0J3Mgbm90IG1peGVkIG1vZGUsIHdlIHNob3VsZCBvbmx5IGxldCBCU1MgcGFzcyB3aXRoIHRoZSBzYW1lIGVuY3J5cHRpb24KKwkJCQkJaWYgKHBJbkJzcy0+V1BBLmJNaXhNb2RlID09IEZBTFNFKQorCQkJCQkJaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAhPSBwSW5Cc3MtPldQQS5Hcm91cENpcGhlcikKKwkJCQkJCQljb250aW51ZTsKKworCQkJCQkvLyBjaGVjayBncm91cCBjaXBoZXIKKwkJCQkJaWYgKChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPCBwSW5Cc3MtPldQQS5Hcm91cENpcGhlcikgJiYKKwkJCQkJCShwSW5Cc3MtPldQQS5Hcm91cENpcGhlciAhPSBOZGlzODAyXzExR3JvdXBXRVA0MEVuYWJsZWQpICYmCisJCQkJCQkocEluQnNzLT5XUEEuR3JvdXBDaXBoZXIgIT0gTmRpczgwMl8xMUdyb3VwV0VQMTA0RW5hYmxlZCkpCisJCQkJCQljb250aW51ZTsKKworCQkJCQkvLyBjaGVjayBwYWlyd2lzZSBjaXBoZXIsIHNraXAgaWYgbm9uZSBtYXRjaGVkCisJCQkJCS8vIElmIHByb2ZpbGUgc2V0IHRvIEFFUywgbGV0IGl0IHBhc3Mgd2l0aG91dCBxdWVzdGlvbi4KKwkJCQkJLy8gSWYgcHJvZmlsZSBzZXQgdG8gVEtJUCwgd2UgbXVzdCBmaW5kIG9uZSBtYXRlY2hlZAorCQkJCQlpZiAoKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKSAmJgorCQkJCQkJKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAhPSBwSW5Cc3MtPldQQS5QYWlyQ2lwaGVyKSAmJgorCQkJCQkJKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAhPSBwSW5Cc3MtPldQQS5QYWlyQ2lwaGVyQXV4KSkKKwkJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQllbHNlIGlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikgfHwgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spKQorCQkJCXsKKwkJCQkJLy8gSWYgaXQncyBub3QgbWl4ZWQgbW9kZSwgd2Ugc2hvdWxkIG9ubHkgbGV0IEJTUyBwYXNzIHdpdGggdGhlIHNhbWUgZW5jcnlwdGlvbgorCQkJCQlpZiAocEluQnNzLT5XUEEyLmJNaXhNb2RlID09IEZBTFNFKQorCQkJCQkJaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAhPSBwSW5Cc3MtPldQQTIuR3JvdXBDaXBoZXIpCisJCQkJCQkJY29udGludWU7CisKKwkJCQkJLy8gY2hlY2sgZ3JvdXAgY2lwaGVyCisJCQkJCWlmICgocEFkLT5TdGFDZmcuV2VwU3RhdHVzIDwgcEluQnNzLT5XUEEuR3JvdXBDaXBoZXIpICYmCisJCQkJCQkocEluQnNzLT5XUEEyLkdyb3VwQ2lwaGVyICE9IE5kaXM4MDJfMTFHcm91cFdFUDQwRW5hYmxlZCkgJiYKKwkJCQkJCShwSW5Cc3MtPldQQTIuR3JvdXBDaXBoZXIgIT0gTmRpczgwMl8xMUdyb3VwV0VQMTA0RW5hYmxlZCkpCisJCQkJCQljb250aW51ZTsKKworCQkJCQkvLyBjaGVjayBwYWlyd2lzZSBjaXBoZXIsIHNraXAgaWYgbm9uZSBtYXRjaGVkCisJCQkJCS8vIElmIHByb2ZpbGUgc2V0IHRvIEFFUywgbGV0IGl0IHBhc3Mgd2l0aG91dCBxdWVzdGlvbi4KKwkJCQkJLy8gSWYgcHJvZmlsZSBzZXQgdG8gVEtJUCwgd2UgbXVzdCBmaW5kIG9uZSBtYXRlY2hlZAorCQkJCQlpZiAoKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKSAmJgorCQkJCQkJKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAhPSBwSW5Cc3MtPldQQTIuUGFpckNpcGhlcikgJiYKKwkJCQkJCShwQWQtPlN0YUNmZy5XZXBTdGF0dXMgIT0gcEluQnNzLT5XUEEyLlBhaXJDaXBoZXJBdXgpKQorCQkJCQkJY29udGludWU7CisJCQkJfQorCQkJfQorCQkJLy8gQnNzIFR5cGUgbWF0Y2hlZCwgU1NJRCBtYXRjaGVkLgorCQkJLy8gV2Ugd2lsbCBjaGVjayB3ZXBzdGF0dXMgZm9yIHF1YWxpZmljYXRpb24gQnNzCisJCQllbHNlIGlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgIT0gcEluQnNzLT5XZXBTdGF0dXMpCisJCQl7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJTdGFDZmcuV2VwU3RhdHVzPSVkLCB3aGlsZSBwSW5Cc3MtPldlcFN0YXR1cz0lZFxuIiwgcEFkLT5TdGFDZmcuV2VwU3RhdHVzLCBwSW5Cc3MtPldlcFN0YXR1cykpOworCQkJCS8vCisJCQkJLy8gRm9yIHRoZSBTRVN2MiBjYXNlLCB3ZSB3aWxsIG5vdCBxdWFsaWZ5IFdlcFN0YXR1cy4KKwkJCQkvLworCQkJCWlmICghcEluQnNzLT5iU0VTKQorCQkJCQljb250aW51ZTsKKwkJCX0KKworCQkJLy8gU2luY2UgdGhlIEFQIGlzIHVzaW5nIGhpZGRlbiBTU0lELCBhbmQgd2UgYXJlIHRyeWluZyB0byBjb25uZWN0IHRvIEFOWQorCQkJLy8gSXQgZGVmaW5pdGVseSB3aWxsIGZhaWwuIFNvLCBza2lwIGl0LgorCQkJLy8gQ0NYIGFsc28gcmVxdWlyZSBub3QgZXZlbiB0cnkgdG8gY29ubmVjdCBpdCEhCisJCQlpZiAoU3NpZExlbiA9PSAwKQorCQkJCWNvbnRpbnVlOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQkvLyBJZiBib3RoIHN0YXRpb24gYW5kIEFQIHVzZSA0ME1Ieiwgc3RpbGwgbmVlZCB0byBjaGVjayBpZiB0aGUgNDBNSFogYmFuZCdzIGxlZ2FsaXR5IGluIG15IGNvdW50cnkgcmVnaW9uCisJCQkvLyBJZiB0aGlzIDQwTUh6IHdpZGViYW5kIGlzIG5vdCBhbGxvd2VkIGluIG15IGNvdW50cnkgbGlzdCwgdXNlIGJhbmR3aWR0aCAyME1IWiBpbnN0ZWFkLAorCQkJaWYgKChwSW5Cc3MtPkNlbnRyYWxDaGFubmVsICE9IHBJbkJzcy0+Q2hhbm5lbCkgJiYKKwkJCQkocEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXID09IEJXXzQwKSkKKwkJCXsKKwkJCQlpZiAoUlRNUENoZWNrQ2hhbm5lbChwQWQsIHBJbkJzcy0+Q2VudHJhbENoYW5uZWwsIHBJbkJzcy0+Q2hhbm5lbCkgPT0gRkFMU0UpCisJCQkJeworCQkJCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlcgPSBCV18yMDsKKwkJCQkJU2V0Q29tbW9uSFQocEFkKTsKKwkJCQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXID0gQldfNDA7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCWlmIChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQ2hhbm5lbFdpZHRoID09IEJBTkRfV0lEVEhfMjApCisJCQkJCXsKKwkJCQkJCVNldENvbW1vbkhUKHBBZCk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwkJCS8vIGNvcHkgbWF0Y2hpbmcgQlNTIGZyb20gSW5UYWIgdG8gT3V0VGFiCisJCQlOZGlzTW92ZU1lbW9yeShwT3V0QnNzLCBwSW5Cc3MsIHNpemVvZihCU1NfRU5UUlkpKTsKKworCQkJT3V0VGFiLT5Cc3NOcisrOworCQl9CisJCWVsc2UgaWYgKChwSW5Cc3MtPkJzc1R5cGUgPT0gcEFkLT5TdGFDZmcuQnNzVHlwZSkgJiYgKFNzaWRMZW4gPT0gMCkpCisJCXsKKwkJCUJTU19FTlRSWSAqcE91dEJzcyA9ICZPdXRUYWItPkJzc0VudHJ5W091dFRhYi0+QnNzTnJdOworCisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCS8vIDIuNEcvNUcgTiBvbmx5IG1vZGUKKwkJCWlmICgocEluQnNzLT5IdENhcGFiaWxpdHlMZW4gPT0gMCkgJiYKKwkJCQkoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExTl8yXzRHKSB8fCAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFOXzVHKSkpCisJCQl7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJTVEEgaXMgaW4gTi1vbmx5IE1vZGUsIHRoaXMgQVAgZG9uJ3QgaGF2ZSBIdCBjYXBhYmlsaXR5IGluIEJlYWNvbi5cbiIpKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCQkJLy8gTmV3IGZvciBXUEEyCisJCQkvLyBDaGVjayB0aGUgQXV0aG1vZGUgZmlyc3QKKwkJCWlmIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpCisJCQl7CisJCQkJLy8gQ2hlY2sgQXV0aE1vZGUgYW5kIEF1dGhNb2RlQXV4IGZvciBtYXRjaGluZywgaW4gY2FzZSBBUCBzdXBwb3J0IGR1YWwtbW9kZQorCQkJCWlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgIT0gcEluQnNzLT5BdXRoTW9kZSkgJiYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlICE9IHBJbkJzcy0+QXV0aE1vZGVBdXgpKQorCQkJCQkvLyBOb25lIG1hdGNoZWQKKwkJCQkJY29udGludWU7CisKKwkJCQkvLyBDaGVjayBjaXBoZXIgc3VpdGUsIEFQIG11c3QgaGF2ZSBtb3JlIHNlY3VyZWQgY2lwaGVyIHRoYW4gc3RhdGlvbiBzZXR0aW5nCisJCQkJaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpIHx8IChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spKQorCQkJCXsKKwkJCQkJLy8gSWYgaXQncyBub3QgbWl4ZWQgbW9kZSwgd2Ugc2hvdWxkIG9ubHkgbGV0IEJTUyBwYXNzIHdpdGggdGhlIHNhbWUgZW5jcnlwdGlvbgorCQkJCQlpZiAocEluQnNzLT5XUEEuYk1peE1vZGUgPT0gRkFMU0UpCisJCQkJCQlpZiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzICE9IHBJbkJzcy0+V1BBLkdyb3VwQ2lwaGVyKQorCQkJCQkJCWNvbnRpbnVlOworCisJCQkJCS8vIGNoZWNrIGdyb3VwIGNpcGhlcgorCQkJCQlpZiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzIDwgcEluQnNzLT5XUEEuR3JvdXBDaXBoZXIpCisJCQkJCQljb250aW51ZTsKKworCQkJCQkvLyBjaGVjayBwYWlyd2lzZSBjaXBoZXIsIHNraXAgaWYgbm9uZSBtYXRjaGVkCisJCQkJCS8vIElmIHByb2ZpbGUgc2V0IHRvIEFFUywgbGV0IGl0IHBhc3Mgd2l0aG91dCBxdWVzdGlvbi4KKwkJCQkJLy8gSWYgcHJvZmlsZSBzZXQgdG8gVEtJUCwgd2UgbXVzdCBmaW5kIG9uZSBtYXRlY2hlZAorCQkJCQlpZiAoKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKSAmJgorCQkJCQkJKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAhPSBwSW5Cc3MtPldQQS5QYWlyQ2lwaGVyKSAmJgorCQkJCQkJKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAhPSBwSW5Cc3MtPldQQS5QYWlyQ2lwaGVyQXV4KSkKKwkJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQllbHNlIGlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikgfHwgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spKQorCQkJCXsKKwkJCQkJLy8gSWYgaXQncyBub3QgbWl4ZWQgbW9kZSwgd2Ugc2hvdWxkIG9ubHkgbGV0IEJTUyBwYXNzIHdpdGggdGhlIHNhbWUgZW5jcnlwdGlvbgorCQkJCQlpZiAocEluQnNzLT5XUEEyLmJNaXhNb2RlID09IEZBTFNFKQorCQkJCQkJaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAhPSBwSW5Cc3MtPldQQTIuR3JvdXBDaXBoZXIpCisJCQkJCQkJY29udGludWU7CisKKwkJCQkJLy8gY2hlY2sgZ3JvdXAgY2lwaGVyCisJCQkJCWlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPCBwSW5Cc3MtPldQQTIuR3JvdXBDaXBoZXIpCisJCQkJCQljb250aW51ZTsKKworCQkJCQkvLyBjaGVjayBwYWlyd2lzZSBjaXBoZXIsIHNraXAgaWYgbm9uZSBtYXRjaGVkCisJCQkJCS8vIElmIHByb2ZpbGUgc2V0IHRvIEFFUywgbGV0IGl0IHBhc3Mgd2l0aG91dCBxdWVzdGlvbi4KKwkJCQkJLy8gSWYgcHJvZmlsZSBzZXQgdG8gVEtJUCwgd2UgbXVzdCBmaW5kIG9uZSBtYXRlY2hlZAorCQkJCQlpZiAoKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKSAmJgorCQkJCQkJKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAhPSBwSW5Cc3MtPldQQTIuUGFpckNpcGhlcikgJiYKKwkJCQkJCShwQWQtPlN0YUNmZy5XZXBTdGF0dXMgIT0gcEluQnNzLT5XUEEyLlBhaXJDaXBoZXJBdXgpKQorCQkJCQkJY29udGludWU7CisJCQkJfQorCQkJfQorCQkJLy8gQnNzIFR5cGUgbWF0Y2hlZCwgU1NJRCBtYXRjaGVkLgorCQkJLy8gV2Ugd2lsbCBjaGVjayB3ZXBzdGF0dXMgZm9yIHF1YWxpZmljYXRpb24gQnNzCisJCQllbHNlIGlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgIT0gcEluQnNzLT5XZXBTdGF0dXMpCisJCQkJCWNvbnRpbnVlOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQkvLyBJZiBib3RoIHN0YXRpb24gYW5kIEFQIHVzZSA0ME1Ieiwgc3RpbGwgbmVlZCB0byBjaGVjayBpZiB0aGUgNDBNSFogYmFuZCdzIGxlZ2FsaXR5IGluIG15IGNvdW50cnkgcmVnaW9uCisJCQkvLyBJZiB0aGlzIDQwTUh6IHdpZGViYW5kIGlzIG5vdCBhbGxvd2VkIGluIG15IGNvdW50cnkgbGlzdCwgdXNlIGJhbmR3aWR0aCAyME1IWiBpbnN0ZWFkLAorCQkJaWYgKChwSW5Cc3MtPkNlbnRyYWxDaGFubmVsICE9IHBJbkJzcy0+Q2hhbm5lbCkgJiYKKwkJCQkocEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXID09IEJXXzQwKSkKKwkJCXsKKwkJCQlpZiAoUlRNUENoZWNrQ2hhbm5lbChwQWQsIHBJbkJzcy0+Q2VudHJhbENoYW5uZWwsIHBJbkJzcy0+Q2hhbm5lbCkgPT0gRkFMU0UpCisJCQkJeworCQkJCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlcgPSBCV18yMDsKKwkJCQkJU2V0Q29tbW9uSFQocEFkKTsKKwkJCQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXID0gQldfNDA7CisJCQkJfQorCQkJfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJCQkvLyBjb3B5IG1hdGNoaW5nIEJTUyBmcm9tIEluVGFiIHRvIE91dFRhYgorCQkJTmRpc01vdmVNZW1vcnkocE91dEJzcywgcEluQnNzLCBzaXplb2YoQlNTX0VOVFJZKSk7CisKKwkJCU91dFRhYi0+QnNzTnIrKzsKKwkJfQorCisJCWlmIChPdXRUYWItPkJzc05yID49IE1BWF9MRU5fT0ZfQlNTX1RBQkxFKQorCQkJYnJlYWs7CisJfQorCisJQnNzVGFibGVTb3J0QnlSc3NpKE91dFRhYik7Cit9CisKKworLy8gSVJRTCA9IERJU1BBVENIX0xFVkVMCitWT0lEIEJzc1RhYmxlU29ydEJ5UnNzaSgKKwlJTiBPVVQgQlNTX1RBQkxFICpPdXRUYWIpCit7CisJSU5UIAkgIGksIGo7CisJQlNTX0VOVFJZIFRtcEJzczsKKworCWZvciAoaSA9IDA7IGkgPCBPdXRUYWItPkJzc05yIC0gMTsgaSsrKQorCXsKKwkJZm9yIChqID0gaSsxOyBqIDwgT3V0VGFiLT5Cc3NOcjsgaisrKQorCQl7CisJCQlpZiAoT3V0VGFiLT5Cc3NFbnRyeVtqXS5Sc3NpID4gT3V0VGFiLT5Cc3NFbnRyeVtpXS5Sc3NpKQorCQkJeworCQkJCU5kaXNNb3ZlTWVtb3J5KCZUbXBCc3MsICZPdXRUYWItPkJzc0VudHJ5W2pdLCBzaXplb2YoQlNTX0VOVFJZKSk7CisJCQkJTmRpc01vdmVNZW1vcnkoJk91dFRhYi0+QnNzRW50cnlbal0sICZPdXRUYWItPkJzc0VudHJ5W2ldLCBzaXplb2YoQlNTX0VOVFJZKSk7CisJCQkJTmRpc01vdmVNZW1vcnkoJk91dFRhYi0+QnNzRW50cnlbaV0sICZUbXBCc3MsIHNpemVvZihCU1NfRU5UUlkpKTsKKwkJCX0KKwkJfQorCX0KK30KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCitWT0lEIEJzc0NpcGhlclBhcnNlKAorCUlOIE9VVAlQQlNTX0VOVFJZCXBCc3MpCit7CisJUEVJRF9TVFJVQ1QgCQkgcEVpZDsKKwlQVUNIQVIJCQkJcFRtcDsKKwlQUlNOX0lFX0hFQURFUl9TVFJVQ1QJCQlwUnNuSGVhZGVyOworCVBDSVBIRVJfU1VJVEVfU1RSVUNUCQkJcENpcGhlcjsKKwlQQUtNX1NVSVRFX1NUUlVDVAkJCQlwQUtNOworCVVTSE9SVAkJCQkJCQlDb3VudDsKKwlJTlQJCQkJCQkJCUxlbmd0aDsKKwlORElTXzgwMl8xMV9FTkNSWVBUSU9OX1NUQVRVUwlUbXBDaXBoZXI7CisKKwkvLworCS8vIFdlcFN0YXR1cyB3aWxsIGJlIHJlc2V0IGxhdGVyLCBpZiBBUCBhbm5vdW5jZSBUS0lQIG9yIEFFUyBvbiB0aGUgYmVhY29uIGZyYW1lLgorCS8vCisJaWYgKHBCc3MtPlByaXZhY3kpCisJeworCQlwQnNzLT5XZXBTdGF0dXMgCT0gTmRpczgwMl8xMVdFUEVuYWJsZWQ7CisJfQorCWVsc2UKKwl7CisJCXBCc3MtPldlcFN0YXR1cyAJPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CisJfQorCS8vIFNldCBkZWZhdWx0IHRvIGRpc2FibGUgJiBvcGVuIGF1dGhlbnRpY2F0aW9uIGJlZm9yZSBwYXJzaW5nIHZhcmlhYmxlIElFCisJcEJzcy0+QXV0aE1vZGUJCT0gTmRpczgwMl8xMUF1dGhNb2RlT3BlbjsKKwlwQnNzLT5BdXRoTW9kZUF1eAk9IE5kaXM4MDJfMTFBdXRoTW9kZU9wZW47CisKKwkvLyBJbml0IFdQQSBzZXR0aW5nCisJcEJzcy0+V1BBLlBhaXJDaXBoZXIJPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CisJcEJzcy0+V1BBLlBhaXJDaXBoZXJBdXggPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CisJcEJzcy0+V1BBLkdyb3VwQ2lwaGVyCT0gTmRpczgwMl8xMVdFUERpc2FibGVkOworCXBCc3MtPldQQS5Sc25DYXBhYmlsaXR5ID0gMDsKKwlwQnNzLT5XUEEuYk1peE1vZGUJCT0gRkFMU0U7CisKKwkvLyBJbml0IFdQQTIgc2V0dGluZworCXBCc3MtPldQQTIuUGFpckNpcGhlcgkgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CisJcEJzcy0+V1BBMi5QYWlyQ2lwaGVyQXV4ID0gTmRpczgwMl8xMVdFUERpc2FibGVkOworCXBCc3MtPldQQTIuR3JvdXBDaXBoZXIJID0gTmRpczgwMl8xMVdFUERpc2FibGVkOworCXBCc3MtPldQQTIuUnNuQ2FwYWJpbGl0eSA9IDA7CisJcEJzcy0+V1BBMi5iTWl4TW9kZSAJID0gRkFMU0U7CisKKworCUxlbmd0aCA9IChJTlQpIHBCc3MtPlZhcklFTGVuOworCisJd2hpbGUgKExlbmd0aCA+IDApCisJeworCQkvLyBQYXJzZSBjaXBoZXIgc3VpdGUgYmFzZSBvbiBXUEExICYgV1BBMiwgdGhleSBzaG91bGQgYmUgcGFyc2VkIGRpZmZlcmVudGx5CisJCXBUbXAgPSAoKFBVQ0hBUikgcEJzcy0+VmFySUVzKSArIHBCc3MtPlZhcklFTGVuIC0gTGVuZ3RoOworCQlwRWlkID0gKFBFSURfU1RSVUNUKSBwVG1wOworCQlzd2l0Y2ggKHBFaWQtPkVpZCkKKwkJeworCQkJY2FzZSBJRV9XUEE6CisJCQkJLy9QYXJzZSBDaXNjbyBJRV9XUEEgKExFQVAsIENDS00sIGV0Yy4pCisJCQkJaWYgKCBOZGlzRXF1YWxNZW1vcnkoKHBUbXArOCksIENJU0NPX09VSSwgMykpCisJCQkJeworCQkJCQlwVG1wICAgKz0gMTE7CisJCQkJCXN3aXRjaCAoKnBUbXApCisJCQkJCXsKKwkJCQkJCWNhc2UgMToKKwkJCQkJCWNhc2UgNToJLy8gQWx0aG91Z2ggV0VQIGlzIG5vdCBhbGxvd2VkIGluIFdQQSByZWxhdGVkIGF1dGggbW9kZSwgd2UgcGFyc2UgaXQgYW55d2F5CisJCQkJCQkJcEJzcy0+V2VwU3RhdHVzID0gTmRpczgwMl8xMUVuY3J5cHRpb24xRW5hYmxlZDsKKwkJCQkJCQlwQnNzLT5XUEEuUGFpckNpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMUVuYWJsZWQ7CisJCQkJCQkJcEJzcy0+V1BBLkdyb3VwQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb24xRW5hYmxlZDsKKwkJCQkJCQlicmVhazsKKwkJCQkJCWNhc2UgMjoKKwkJCQkJCQlwQnNzLT5XZXBTdGF0dXMgPSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkOworCQkJCQkJCXBCc3MtPldQQS5QYWlyQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb24xRW5hYmxlZDsKKwkJCQkJCQlwQnNzLT5XUEEuR3JvdXBDaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbjFFbmFibGVkOworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSA0OgorCQkJCQkJCXBCc3MtPldlcFN0YXR1cyA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQ7CisJCQkJCQkJcEJzcy0+V1BBLlBhaXJDaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbjFFbmFibGVkOworCQkJCQkJCXBCc3MtPldQQS5Hcm91cENpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMUVuYWJsZWQ7CisJCQkJCQkJYnJlYWs7CisJCQkJCQlkZWZhdWx0OgorCQkJCQkJCWJyZWFrOworCQkJCQl9CisKKwkJCQkJLy8gaWYgQ2lzY28gSUVfV1BBLCBicmVhaworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJZWxzZSBpZiAoTmRpc0VxdWFsTWVtb3J5KHBFaWQtPk9jdGV0LCBTRVNfT1VJLCAzKSAmJiAocEVpZC0+TGVuID09IDcpKQorCQkJCXsKKwkJCQkJcEJzcy0+YlNFUyA9IFRSVUU7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQllbHNlIGlmIChOZGlzRXF1YWxNZW1vcnkocEVpZC0+T2N0ZXQsIFdQQV9PVUksIDQpICE9IDEpCisJCQkJeworCQkJCQkvLyBpZiB1bnN1cHBvcnRlZCB2ZW5kb3Igc3BlY2lmaWMgSUUKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCS8vIFNraXAgT1VJLCB2ZXJzaW9uLCBhbmQgbXVsdGljYXN0IHN1aXRlCisJCQkJLy8gVGhpcyBwYXJ0IHNob3VsZCBiZSBpbXByb3ZlZCBpbiB0aGUgZnV0dXJlIHdoZW4gQVAgc3VwcG9ydGVkIG11bHRpcGxlIGNpcGhlciBzdWl0ZS4KKwkJCQkvLyBGb3Igbm93LCBpdCdzIE9LIHNpbmNlIGFsbW9zdCBhbGwgQVBzIGhhdmUgZml4ZWQgY2lwaGVyIHN1aXRlIHN1cHBvcnRlZC4KKwkJCQkvLyBwVG1wID0gKFBVQ0hBUikgcEVpZC0+T2N0ZXQ7CisJCQkJcFRtcCAgICs9IDExOworCisJCQkJLy8gQ2lwaGVyIFN1aXRlIFNlbGVjdG9ycyBmcm9tIFNwZWMgUDgwMi4xMWkvRDMuMiBQMjYuCisJCQkJLy8JVmFsdWUJICAgTWVhbmluZworCQkJCS8vCTAJCQlOb25lCisJCQkJLy8JMQkJCVdFUC00MAorCQkJCS8vCTIJCQlUa2lwCisJCQkJLy8JMwkJCVdSQVAKKwkJCQkvLwk0CQkJQUVTCisJCQkJLy8JNQkJCVdFUC0xMDQKKwkJCQkvLyBQYXJzZSBncm91cCBjaXBoZXIKKwkJCQlzd2l0Y2ggKCpwVG1wKQorCQkJCXsKKwkJCQkJY2FzZSAxOgorCQkJCQkJcEJzcy0+V1BBLkdyb3VwQ2lwaGVyID0gTmRpczgwMl8xMUdyb3VwV0VQNDBFbmFibGVkOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgNToKKwkJCQkJCXBCc3MtPldQQS5Hcm91cENpcGhlciA9IE5kaXM4MDJfMTFHcm91cFdFUDEwNEVuYWJsZWQ7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSAyOgorCQkJCQkJcEJzcy0+V1BBLkdyb3VwQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZDsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIDQ6CisJCQkJCQlwQnNzLT5XUEEuR3JvdXBDaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkOworCQkJCQkJYnJlYWs7CisJCQkJCWRlZmF1bHQ6CisJCQkJCQlicmVhazsKKwkJCQl9CisJCQkJLy8gbnVtYmVyIG9mIHVuaWNhc3Qgc3VpdGUKKwkJCQlwVG1wICAgKz0gMTsKKworCQkJCS8vIHNraXAgYWxsIHVuaWNhc3QgY2lwaGVyIHN1aXRlcworCQkJCS8vQ291bnQgPSAqKFBVU0hPUlQpIHBUbXA7CisJCQkJQ291bnQgPSAocFRtcFsxXTw8OCkgKyBwVG1wWzBdOworCQkJCXBUbXAgICArPSBzaXplb2YoVVNIT1JUKTsKKworCQkJCS8vIFBhcnNpbmcgYWxsIHVuaWNhc3QgY2lwaGVyIHN1aXRlCisJCQkJd2hpbGUgKENvdW50ID4gMCkKKwkJCQl7CisJCQkJCS8vIFNraXAgT1VJCisJCQkJCXBUbXAgKz0gMzsKKwkJCQkJVG1wQ2lwaGVyID0gTmRpczgwMl8xMVdFUERpc2FibGVkOworCQkJCQlzd2l0Y2ggKCpwVG1wKQorCQkJCQl7CisJCQkJCQljYXNlIDE6CisJCQkJCQljYXNlIDU6IC8vIEFsdGhvdWdoIFdFUCBpcyBub3QgYWxsb3dlZCBpbiBXUEEgcmVsYXRlZCBhdXRoIG1vZGUsIHdlIHBhcnNlIGl0IGFueXdheQorCQkJCQkJCVRtcENpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMUVuYWJsZWQ7CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlIDI6CisJCQkJCQkJVG1wQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZDsKKwkJCQkJCQlicmVhazsKKwkJCQkJCWNhc2UgNDoKKwkJCQkJCQlUbXBDaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkOworCQkJCQkJCWJyZWFrOworCQkJCQkJZGVmYXVsdDoKKwkJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQlpZiAoVG1wQ2lwaGVyID4gcEJzcy0+V1BBLlBhaXJDaXBoZXIpCisJCQkJCXsKKwkJCQkJCS8vIE1vdmUgdGhlIGxvd2VyIGNpcGhlciBzdWl0ZSB0byBQYWlyQ2lwaGVyQXV4CisJCQkJCQlwQnNzLT5XUEEuUGFpckNpcGhlckF1eCA9IHBCc3MtPldQQS5QYWlyQ2lwaGVyOworCQkJCQkJcEJzcy0+V1BBLlBhaXJDaXBoZXIJPSBUbXBDaXBoZXI7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlwQnNzLT5XUEEuUGFpckNpcGhlckF1eCA9IFRtcENpcGhlcjsKKwkJCQkJfQorCQkJCQlwVG1wKys7CisJCQkJCUNvdW50LS07CisJCQkJfQorCisJCQkJLy8gNC4gZ2V0IEFLTSBzdWl0ZSBjb3VudHMKKwkJCQkvL0NvdW50CT0gKihQVVNIT1JUKSBwVG1wOworCQkJCUNvdW50ID0gKHBUbXBbMV08PDgpICsgcFRtcFswXTsKKwkJCQlwVG1wICAgKz0gc2l6ZW9mKFVTSE9SVCk7CisJCQkJcFRtcCAgICs9IDM7CisKKwkJCQlzd2l0Y2ggKCpwVG1wKQorCQkJCXsKKwkJCQkJY2FzZSAxOgorCQkJCQkJLy8gU2V0IEFQIHN1cHBvcnQgV1BBIG1vZGUKKwkJCQkJCWlmIChwQnNzLT5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVPcGVuKQorCQkJCQkJCXBCc3MtPkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBOworCQkJCQkJZWxzZQorCQkJCQkJCXBCc3MtPkF1dGhNb2RlQXV4ID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgMjoKKwkJCQkJCS8vIFNldCBBUCBzdXBwb3J0IFdQQSBtb2RlCisJCQkJCQlpZiAocEJzcy0+QXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlT3BlbikKKwkJCQkJCQlwQnNzLT5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSzsKKwkJCQkJCWVsc2UKKwkJCQkJCQlwQnNzLT5BdXRoTW9kZUF1eCA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSzsKKwkJCQkJCWJyZWFrOworCQkJCQlkZWZhdWx0OgorCQkJCQkJYnJlYWs7CisJCQkJfQorCQkJCXBUbXAgICArPSAxOworCisJCQkJLy8gRml4ZWQgZm9yIFdQQS1Ob25lCisJCQkJaWYgKHBCc3MtPkJzc1R5cGUgPT0gQlNTX0FESE9DKQorCQkJCXsKKwkJCQkJcEJzcy0+QXV0aE1vZGUJICA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmU7CisJCQkJCXBCc3MtPkF1dGhNb2RlQXV4ID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZTsKKwkJCQkJcEJzcy0+V2VwU3RhdHVzICAgPSBwQnNzLT5XUEEuR3JvdXBDaXBoZXI7CisJCQkJCS8vIFBhdGNoZWQgYnVncyBmb3Igb2xkIGRyaXZlcgorCQkJCQlpZiAocEJzcy0+V1BBLlBhaXJDaXBoZXJBdXggPT0gTmRpczgwMl8xMVdFUERpc2FibGVkKQorCQkJCQkJcEJzcy0+V1BBLlBhaXJDaXBoZXJBdXggPSBwQnNzLT5XUEEuR3JvdXBDaXBoZXI7CisJCQkJfQorCQkJCWVsc2UKKwkJCQkJcEJzcy0+V2VwU3RhdHVzICAgPSBwQnNzLT5XUEEuUGFpckNpcGhlcjsKKworCQkJCS8vIENoZWNrIHRoZSBQYWlyICYgR3JvdXAsIGlmIGRpZmZlcmVudCwgdHVybiBvbiBtaXhlZCBtb2RlIGZsYWcKKwkJCQlpZiAocEJzcy0+V1BBLkdyb3VwQ2lwaGVyICE9IHBCc3MtPldQQS5QYWlyQ2lwaGVyKQorCQkJCQlwQnNzLT5XUEEuYk1peE1vZGUgPSBUUlVFOworCisJCQkJYnJlYWs7CisKKwkJCWNhc2UgSUVfUlNOOgorCQkJCXBSc25IZWFkZXIgPSAoUFJTTl9JRV9IRUFERVJfU1RSVUNUKSBwVG1wOworCisJCQkJLy8gMC4gVmVyc2lvbiBtdXN0IGJlIDEKKwkJCQlpZiAobGUyY3B1MTYocFJzbkhlYWRlci0+VmVyc2lvbikgIT0gMSkKKwkJCQkJYnJlYWs7CisJCQkJcFRtcCAgICs9IHNpemVvZihSU05fSUVfSEVBREVSX1NUUlVDVCk7CisKKwkJCQkvLyAxLiBDaGVjayBncm91cCBjaXBoZXIKKwkJCQlwQ2lwaGVyID0gKFBDSVBIRVJfU1VJVEVfU1RSVUNUKSBwVG1wOworCQkJCWlmICghUlRNUEVxdWFsTWVtb3J5KHBUbXAsIFJTTl9PVUksIDMpKQorCQkJCQlicmVhazsKKworCQkJCS8vIFBhcnNlIGdyb3VwIGNpcGhlcgorCQkJCXN3aXRjaCAocENpcGhlci0+VHlwZSkKKwkJCQl7CisJCQkJCWNhc2UgMToKKwkJCQkJCXBCc3MtPldQQTIuR3JvdXBDaXBoZXIgPSBOZGlzODAyXzExR3JvdXBXRVA0MEVuYWJsZWQ7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSA1OgorCQkJCQkJcEJzcy0+V1BBMi5Hcm91cENpcGhlciA9IE5kaXM4MDJfMTFHcm91cFdFUDEwNEVuYWJsZWQ7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSAyOgorCQkJCQkJcEJzcy0+V1BBMi5Hcm91cENpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSA0OgorCQkJCQkJcEJzcy0+V1BBMi5Hcm91cENpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQ7CisJCQkJCQlicmVhazsKKwkJCQkJZGVmYXVsdDoKKwkJCQkJCWJyZWFrOworCQkJCX0KKwkJCQkvLyBzZXQgdG8gY29ycmVjdCBvZmZzZXQgZm9yIG5leHQgcGFyc2luZworCQkJCXBUbXAgICArPSBzaXplb2YoQ0lQSEVSX1NVSVRFX1NUUlVDVCk7CisKKwkJCQkvLyAyLiBHZXQgcGFpcndpc2UgY2lwaGVyIGNvdW50cworCQkJCS8vQ291bnQgPSAqKFBVU0hPUlQpIHBUbXA7CisJCQkJQ291bnQgPSAocFRtcFsxXTw8OCkgKyBwVG1wWzBdOworCQkJCXBUbXAgICArPSBzaXplb2YoVVNIT1JUKTsKKworCQkJCS8vIDMuIEdldCBwYWlyd2lzZSBjaXBoZXIKKwkJCQkvLyBQYXJzaW5nIGFsbCB1bmljYXN0IGNpcGhlciBzdWl0ZQorCQkJCXdoaWxlIChDb3VudCA+IDApCisJCQkJeworCQkJCQkvLyBTa2lwIE9VSQorCQkJCQlwQ2lwaGVyID0gKFBDSVBIRVJfU1VJVEVfU1RSVUNUKSBwVG1wOworCQkJCQlUbXBDaXBoZXIgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CisJCQkJCXN3aXRjaCAocENpcGhlci0+VHlwZSkKKwkJCQkJeworCQkJCQkJY2FzZSAxOgorCQkJCQkJY2FzZSA1OiAvLyBBbHRob3VnaCBXRVAgaXMgbm90IGFsbG93ZWQgaW4gV1BBIHJlbGF0ZWQgYXV0aCBtb2RlLCB3ZSBwYXJzZSBpdCBhbnl3YXkKKwkJCQkJCQlUbXBDaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbjFFbmFibGVkOworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSAyOgorCQkJCQkJCVRtcENpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ7CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlIDQ6CisJCQkJCQkJVG1wQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZDsKKwkJCQkJCQlicmVhazsKKwkJCQkJCWRlZmF1bHQ6CisJCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJaWYgKFRtcENpcGhlciA+IHBCc3MtPldQQTIuUGFpckNpcGhlcikKKwkJCQkJeworCQkJCQkJLy8gTW92ZSB0aGUgbG93ZXIgY2lwaGVyIHN1aXRlIHRvIFBhaXJDaXBoZXJBdXgKKwkJCQkJCXBCc3MtPldQQTIuUGFpckNpcGhlckF1eCA9IHBCc3MtPldQQTIuUGFpckNpcGhlcjsKKwkJCQkJCXBCc3MtPldQQTIuUGFpckNpcGhlcgkgPSBUbXBDaXBoZXI7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlwQnNzLT5XUEEyLlBhaXJDaXBoZXJBdXggPSBUbXBDaXBoZXI7CisJCQkJCX0KKwkJCQkJcFRtcCArPSBzaXplb2YoQ0lQSEVSX1NVSVRFX1NUUlVDVCk7CisJCQkJCUNvdW50LS07CisJCQkJfQorCisJCQkJLy8gNC4gZ2V0IEFLTSBzdWl0ZSBjb3VudHMKKwkJCQkvL0NvdW50CT0gKihQVVNIT1JUKSBwVG1wOworCQkJCUNvdW50ID0gKHBUbXBbMV08PDgpICsgcFRtcFswXTsKKwkJCQlwVG1wICAgKz0gc2l6ZW9mKFVTSE9SVCk7CisKKwkJCQkvLyA1LiBHZXQgQUtNIGNpcGhlcnMKKwkJCQlwQUtNID0gKFBBS01fU1VJVEVfU1RSVUNUKSBwVG1wOworCQkJCWlmICghUlRNUEVxdWFsTWVtb3J5KHBUbXAsIFJTTl9PVUksIDMpKQorCQkJCQlicmVhazsKKworCQkJCXN3aXRjaCAocEFLTS0+VHlwZSkKKwkJCQl7CisJCQkJCWNhc2UgMToKKwkJCQkJCS8vIFNldCBBUCBzdXBwb3J0IFdQQSBtb2RlCisJCQkJCQlpZiAocEJzcy0+QXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlT3BlbikKKwkJCQkJCQlwQnNzLT5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTI7CisJCQkJCQllbHNlCisJCQkJCQkJcEJzcy0+QXV0aE1vZGVBdXggPSBOZGlzODAyXzExQXV0aE1vZGVXUEEyOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgMjoKKwkJCQkJCS8vIFNldCBBUCBzdXBwb3J0IFdQQSBtb2RlCisJCQkJCQlpZiAocEJzcy0+QXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlT3BlbikKKwkJCQkJCQlwQnNzLT5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0s7CisJCQkJCQllbHNlCisJCQkJCQkJcEJzcy0+QXV0aE1vZGVBdXggPSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLOworCQkJCQkJYnJlYWs7CisJCQkJCWRlZmF1bHQ6CisJCQkJCQlicmVhazsKKwkJCQl9CisJCQkJcFRtcCAgICs9IChDb3VudCAqIHNpemVvZihBS01fU1VJVEVfU1RSVUNUKSk7CisKKwkJCQkvLyBGaXhlZCBmb3IgV1BBLU5vbmUKKwkJCQlpZiAocEJzcy0+QnNzVHlwZSA9PSBCU1NfQURIT0MpCisJCQkJeworCQkJCQlwQnNzLT5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmU7CisJCQkJCXBCc3MtPkF1dGhNb2RlQXV4ID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZTsKKwkJCQkJcEJzcy0+V1BBLlBhaXJDaXBoZXJBdXggPSBwQnNzLT5XUEEyLlBhaXJDaXBoZXJBdXg7CisJCQkJCXBCc3MtPldQQS5Hcm91cENpcGhlcgk9IHBCc3MtPldQQTIuR3JvdXBDaXBoZXI7CisJCQkJCXBCc3MtPldlcFN0YXR1cyAJCT0gcEJzcy0+V1BBLkdyb3VwQ2lwaGVyOworCQkJCQkvLyBQYXRjaGVkIGJ1Z3MgZm9yIG9sZCBkcml2ZXIKKwkJCQkJaWYgKHBCc3MtPldQQS5QYWlyQ2lwaGVyQXV4ID09IE5kaXM4MDJfMTFXRVBEaXNhYmxlZCkKKwkJCQkJCXBCc3MtPldQQS5QYWlyQ2lwaGVyQXV4ID0gcEJzcy0+V1BBLkdyb3VwQ2lwaGVyOworCQkJCX0KKwkJCQlwQnNzLT5XZXBTdGF0dXMgICA9IHBCc3MtPldQQTIuUGFpckNpcGhlcjsKKworCQkJCS8vIDYuIEdldCBSU04gY2FwYWJpbGl0eQorCQkJCS8vcEJzcy0+V1BBMi5Sc25DYXBhYmlsaXR5ID0gKihQVVNIT1JUKSBwVG1wOworCQkJCXBCc3MtPldQQTIuUnNuQ2FwYWJpbGl0eSA9IChwVG1wWzFdPDw4KSArIHBUbXBbMF07CisJCQkJcFRtcCArPSBzaXplb2YoVVNIT1JUKTsKKworCQkJCS8vIENoZWNrIHRoZSBQYWlyICYgR3JvdXAsIGlmIGRpZmZlcmVudCwgdHVybiBvbiBtaXhlZCBtb2RlIGZsYWcKKwkJCQlpZiAocEJzcy0+V1BBMi5Hcm91cENpcGhlciAhPSBwQnNzLT5XUEEyLlBhaXJDaXBoZXIpCisJCQkJCXBCc3MtPldQQTIuYk1peE1vZGUgPSBUUlVFOworCisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWJyZWFrOworCQl9CisJCUxlbmd0aCAtPSAocEVpZC0+TGVuICsgMik7CisJfQorfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBtYWNfdGFibGUuYworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisvKiEgXGJyaWVmIGdlbmVyYXRlcyBhIHJhbmRvbSBtYWMgYWRkcmVzcyB2YWx1ZSBmb3IgSUJTUyBCU1NJRAorICoJXHBhcmFtIEFkZHIgdGhlIGJzc2lkIGxvY2F0aW9uCisgKglccmV0dXJuIG5vbmUKKyAqCVxwcmUKKyAqCVxwb3N0CisgKi8KK1ZPSUQgTWFjQWRkclJhbmRvbUJzc2lkKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCU9VVCBQVUNIQVIgcEFkZHIpCit7CisJSU5UIGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFDX0FERFJfTEVOOyBpKyspCisJeworCQlwQWRkcltpXSA9IFJhbmRvbUJ5dGUocEFkKTsKKwl9CisKKwlwQWRkclswXSA9IChwQWRkclswXSAmIDB4ZmUpIHwgMHgwMjsgIC8vIHRoZSBmaXJzdCAyIGJpdHMgbXVzdCBiZSAwMXh4eHh4eHh4Cit9CisKKy8qISBcYnJpZWYgaW5pdCB0aGUgbWFuYWdlbWVudCBtYWMgZnJhbWUgaGVhZGVyCisgKglccGFyYW0gcF9oZHIgbWFjIGhlYWRlcgorICoJXHBhcmFtIHN1YnR5cGUgc3VidHlwZSBvZiB0aGUgZnJhbWUKKyAqCVxwYXJhbSBwX2RzIGRlc3RpbmF0aW9uIGFkZHJlc3MsIGRvbid0IGNhcmUgaWYgaXQgaXMgYSBicm9hZGNhc3QgYWRkcmVzcworICoJXHJldHVybiBub25lCisgKglccHJlIHRoZSBzdGF0aW9uIGhhcyB0aGUgZm9sbG93aW5nIGluZm9ybWF0aW9uIGluIHRoZSBwQWQtPlN0YUNmZworICoJIC0gYnNzaWQKKyAqCSAtIHN0YXRpb24gYWRkcmVzcworICoJXHBvc3QKKyAqCVxub3RlIHRoaXMgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgdGhlIGZvbGxvd2luZyBmaWVsZAorCisgSVJRTCA9IFBBU1NJVkVfTEVWRUwKKyBJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworICovCitWT0lEIE1ndE1hY0hlYWRlckluaXQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4gT1VUIFBIRUFERVJfODAyXzExIHBIZHI4MDIxMSwKKwlJTiBVQ0hBUiBTdWJUeXBlLAorCUlOIFVDSEFSIFRvRHMsCisJSU4gUFVDSEFSIHBEQSwKKwlJTiBQVUNIQVIgcEJzc2lkKQoreworCU5kaXNaZXJvTWVtb3J5KHBIZHI4MDIxMSwgc2l6ZW9mKEhFQURFUl84MDJfMTEpKTsKKworCXBIZHI4MDIxMS0+RkMuVHlwZSA9IEJUWVBFX01HTVQ7CisJcEhkcjgwMjExLT5GQy5TdWJUeXBlID0gU3ViVHlwZTsKKy8vCWlmIChTdWJUeXBlID09IFNVQlRZUEVfQUNLKQkvLyBzYW1wbGUsIG5vIHVzZSwgaXQgd2lsbCBjb25mbGljdCB3aXRoIEFDVElPTiBmcmFtZSBzdWIgdHlwZQorLy8JCXBIZHI4MDIxMS0+RkMuVHlwZSA9IEJUWVBFX0NOVEw7CisJcEhkcjgwMjExLT5GQy5Ub0RzID0gVG9EczsKKwlDT1BZX01BQ19BRERSKHBIZHI4MDIxMS0+QWRkcjEsIHBEQSk7CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJQ09QWV9NQUNfQUREUihwSGRyODAyMTEtPkFkZHIyLCBwQWQtPkN1cnJlbnRBZGRyZXNzKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwlDT1BZX01BQ19BRERSKHBIZHI4MDIxMS0+QWRkcjMsIHBCc3NpZCk7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIG1lbV9tZ210LmMKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBUaGlzIHJvdXRpbmUgYnVpbGQgYW4gb3V0Z29pbmcgZnJhbWUsIGFuZCBmaWxsIGFsbCBpbmZvcm1hdGlvbiBzcGVjaWZpZWQKKyAqIGluIGFyZ3VtZW50IGxpc3QgdG8gdGhlIGZyYW1lIGJvZHkuIFRoZSBhY3R1YWwgZnJhbWUgc2l6ZSBpcyB0aGUgc3VtbWF0aW9uCisgKiBvZiBhbGwgYXJndW1lbnRzLgorICogaW5wdXQgcGFyYW1zOgorICoJCUJ1ZmZlciAtIHBvaW50ZXIgdG8gYSBwcmUtYWxsb2NhdGVkIG1lbW9yeSBzZWdtZW50CisgKgkJYXJncyAtIGEgbGlzdCBvZiA8aW50IGFyZ19zaXplLCBhcmc+IHBhaXJzLgorICoJCU5PVEUgTk9URSBOT1RFISEhISB0aGUgbGFzdCBhcmd1bWVudCBtdXN0IGJlIE5VTEwsIG90aGVyd2lzZSB0aGlzCisgKgkJCQkJCSAgIGZ1bmN0aW9uIHdpbGwgRkFJTCEhIQorICogcmV0dXJuOgorICoJCVNpemUgb2YgdGhlIGJ1ZmZlcgorICogdXNhZ2U6CisgKgkJTWFrZU91dGdvaW5nRnJhbWUoQnVmZmVyLCBvdXRwdXRfbGVuZ3RoLCAyLCAmZmMsIDIsICZkdXIsIDYsIHBfYWRkcjEsIDYscF9hZGRyMiwgRU5EX09GX0FSR1MpOworCisgSVJRTCA9IFBBU1NJVkVfTEVWRUwKKyBJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitVTE9ORyBNYWtlT3V0Z29pbmdGcmFtZSgKKwlPVVQgQ0hBUiAqQnVmZmVyLAorCU9VVCBVTE9ORyAqRnJhbWVMZW4sIC4uLikKK3sKKwlDSEFSICAgKnA7CisJaW50IAlsZW5nOworCVVMT05HCVRvdExlbmc7CisJdmFfbGlzdCBBcmdzOworCisJLy8gY2FsY3VsYXRlcyB0aGUgdG90YWwgbGVuZ3RoCisJVG90TGVuZyA9IDA7CisJdmFfc3RhcnQoQXJncywgRnJhbWVMZW4pOworCWRvCisJeworCQlsZW5nID0gdmFfYXJnKEFyZ3MsIGludCk7CisJCWlmIChsZW5nID09IEVORF9PRl9BUkdTKQorCQl7CisJCQlicmVhazsKKwkJfQorCQlwID0gdmFfYXJnKEFyZ3MsIFBWT0lEKTsKKwkJTmRpc01vdmVNZW1vcnkoJkJ1ZmZlcltUb3RMZW5nXSwgcCwgbGVuZyk7CisJCVRvdExlbmcgPSBUb3RMZW5nICsgbGVuZzsKKwl9IHdoaWxlKFRSVUUpOworCisJdmFfZW5kKEFyZ3MpOyAvKiBjbGVhbiB1cCAqLworCSpGcmFtZUxlbiA9IFRvdExlbmc7CisJcmV0dXJuIFRvdExlbmc7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIG1sbWVfcXVldWUuYworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisvKiEgXGJyaWVmCUluaXRpYWxpemUgVGhlIE1MTUUgUXVldWUsIHVzZWQgYnkgTUxNRSBGdW5jdGlvbnMKKyAqCVxwYXJhbQkqUXVldWUJICAgVGhlIE1MTUUgUXVldWUKKyAqCVxyZXR1cm4gQWx3YXlzCSAgIFJldHVybiBORElTX1NUQVRFX1NVQ0NFU1MgaW4gdGhpcyBpbXBsZW1lbnRhdGlvbgorICoJXHByZQorICoJXHBvc3QKKyAqCVxub3RlCUJlY2F1c2UgdGhpcyBpcyBkb25lIG9ubHkgb25jZSAoYXQgdGhlIGluaXQgc3RhZ2UpLCBubyBuZWVkIHRvIGJlIGxvY2tlZAorCisgSVJRTCA9IFBBU1NJVkVfTEVWRUwKKworICovCitORElTX1NUQVRVUyBNbG1lUXVldWVJbml0KAorCUlOIE1MTUVfUVVFVUUgKlF1ZXVlKQoreworCUlOVCBpOworCisJTmRpc0FsbG9jYXRlU3BpbkxvY2soJlF1ZXVlLT5Mb2NrKTsKKworCVF1ZXVlLT5OdW0JPSAwOworCVF1ZXVlLT5IZWFkID0gMDsKKwlRdWV1ZS0+VGFpbCA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0xFTl9PRl9NTE1FX1FVRVVFOyBpKyspCisJeworCQlRdWV1ZS0+RW50cnlbaV0uT2NjdXBpZWQgPSBGQUxTRTsKKwkJUXVldWUtPkVudHJ5W2ldLk1zZ0xlbiA9IDA7CisJCU5kaXNaZXJvTWVtb3J5KFF1ZXVlLT5FbnRyeVtpXS5Nc2csIE1HTVRfRE1BX0JVRkZFUl9TSVpFKTsKKwl9CisKKwlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKK30KKworLyohIFxicmllZgkgRW5xdWV1ZSBhIG1lc3NhZ2UgZm9yIG90aGVyIHRocmVhZHMsIGlmIHRoZXkgd2FudCB0byBzZW5kIG1lc3NhZ2VzIHRvIE1MTUUgdGhyZWFkCisgKglccGFyYW0JKlF1ZXVlCSAgVGhlIE1MTUUgUXVldWUKKyAqCVxwYXJhbQkgTWFjaGluZSAgVGhlIFN0YXRlIE1hY2hpbmUgSWQKKyAqCVxwYXJhbQkgTXNnVHlwZSAgVGhlIE1lc3NhZ2UgVHlwZQorICoJXHBhcmFtCSBNc2dMZW4gICBUaGUgTWVzc2FnZSBsZW5ndGgKKyAqCVxwYXJhbQkqTXNnCSAgVGhlIG1lc3NhZ2UgcG9pbnRlcgorICoJXHJldHVybiAgVFJVRSBpZiBlbnF1ZXVlIGlzIHN1Y2Nlc3NmdWwsIEZBTFNFIGlmIHRoZSBxdWV1ZSBpcyBmdWxsCisgKglccHJlCisgKglccG9zdAorICoJXG5vdGUJIFRoZSBtZXNzYWdlIGhhcyB0byBiZSBpbml0aWFsaXplZAorCisgSVJRTCA9IFBBU1NJVkVfTEVWRUwKKyBJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworICovCitCT09MRUFOIE1sbWVFbnF1ZXVlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOIFVMT05HIE1hY2hpbmUsCisJSU4gVUxPTkcgTXNnVHlwZSwKKwlJTiBVTE9ORyBNc2dMZW4sCisJSU4gVk9JRCAqTXNnKQoreworCUlOVCBUYWlsOworCU1MTUVfUVVFVUUJKlF1ZXVlID0gKE1MTUVfUVVFVUUgKikmcEFkLT5NbG1lLlF1ZXVlOworCisJLy8gRG8gbm90aGluZyBpZiB0aGUgZHJpdmVyIGlzIHN0YXJ0aW5nIGhhbHQgc3RhdGUuCisJLy8gVGhpcyBtaWdodCBoYXBwZW4gd2hlbiB0aW1lciBhbHJlYWR5IGJlZW4gZmlyZWQgYmVmb3JlIGNhbmNlbCB0aW1lciB3aXRoIG1sbWVoYWx0CisJaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkKKwkJcmV0dXJuIEZBTFNFOworCisJLy8gRmlyc3QgY2hlY2sgdGhlIHNpemUsIGl0IE1VU1Qgbm90IGV4Y2VlZCB0aGUgbWxtZSBxdWV1ZSBzaXplCisJaWYgKE1zZ0xlbiA+IE1HTVRfRE1BX0JVRkZFUl9TSVpFKQorCXsKKwkJREJHUFJJTlRfRVJSKCgiTWxtZUVucXVldWU6IG1zZyB0b28gbGFyZ2UsIHNpemUgPSAlbGQgXG4iLCBNc2dMZW4pKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCWlmIChNbG1lUXVldWVGdWxsKFF1ZXVlKSkKKwl7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlOZGlzQWNxdWlyZVNwaW5Mb2NrKCYoUXVldWUtPkxvY2spKTsKKwlUYWlsID0gUXVldWUtPlRhaWw7CisJUXVldWUtPlRhaWwrKzsKKwlRdWV1ZS0+TnVtKys7CisJaWYgKFF1ZXVlLT5UYWlsID09IE1BWF9MRU5fT0ZfTUxNRV9RVUVVRSkKKwl7CisJCVF1ZXVlLT5UYWlsID0gMDsKKwl9CisKKwlRdWV1ZS0+RW50cnlbVGFpbF0uV2NpZCA9IFJFU0VSVkVEX1dDSUQ7CisJUXVldWUtPkVudHJ5W1RhaWxdLk9jY3VwaWVkID0gVFJVRTsKKwlRdWV1ZS0+RW50cnlbVGFpbF0uTWFjaGluZSA9IE1hY2hpbmU7CisJUXVldWUtPkVudHJ5W1RhaWxdLk1zZ1R5cGUgPSBNc2dUeXBlOworCVF1ZXVlLT5FbnRyeVtUYWlsXS5Nc2dMZW4gID0gTXNnTGVuOworCisJaWYgKE1zZyAhPSBOVUxMKQorCXsKKwkJTmRpc01vdmVNZW1vcnkoUXVldWUtPkVudHJ5W1RhaWxdLk1zZywgTXNnLCBNc2dMZW4pOworCX0KKworCU5kaXNSZWxlYXNlU3BpbkxvY2soJihRdWV1ZS0+TG9jaykpOworCXJldHVybiBUUlVFOworfQorCisvKiEgXGJyaWVmCSBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgd2hlbiBSZWN2IGdldHMgYSBNTE1FIG1lc3NhZ2UKKyAqCVxwYXJhbQkqUXVldWUJCQkgVGhlIE1MTUUgUXVldWUKKyAqCVxwYXJhbQkgVGltZVN0YW1wSGlnaAkgVGhlIHVwcGVyIDMyIGJpdCBvZiB0aW1lc3RhbXAKKyAqCVxwYXJhbQkgVGltZVN0YW1wTG93CSBUaGUgbG93ZXIgMzIgYml0IG9mIHRpbWVzdGFtcAorICoJXHBhcmFtCSBSc3NpCQkJIFRoZSByZWNlaXZpbmcgUlNTSSBzdHJlbmd0aAorICoJXHBhcmFtCSBNc2dMZW4gCQkgVGhlIGxlbmd0aCBvZiB0aGUgbWVzc2FnZQorICoJXHBhcmFtCSpNc2cJCQkgVGhlIG1lc3NhZ2UgcG9pbnRlcgorICoJXHJldHVybiAgVFJVRSBpZiBldmVyeXRoaW5nIG9rLCBGQUxTRSBvdGhlcndpc2UgKGxpa2UgUXVldWUgRnVsbCkKKyAqCVxwcmUKKyAqCVxwb3N0CisKKyBJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworICovCitCT09MRUFOIE1sbWVFbnF1ZXVlRm9yUmVjdigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiBVTE9ORyBXY2lkLAorCUlOIFVMT05HIFRpbWVTdGFtcEhpZ2gsCisJSU4gVUxPTkcgVGltZVN0YW1wTG93LAorCUlOIFVDSEFSIFJzc2kwLAorCUlOIFVDSEFSIFJzc2kxLAorCUlOIFVDSEFSIFJzc2kyLAorCUlOIFVMT05HIE1zZ0xlbiwKKwlJTiBWT0lEICpNc2csCisJSU4gVUNIQVIgU2lnbmFsKQoreworCUlOVCAJCSBUYWlsLCBNYWNoaW5lOworCVBGUkFNRV84MDJfMTEgcEZyYW1lID0gKFBGUkFNRV84MDJfMTEpTXNnOworCUlOVAkJIE1zZ1R5cGU7CisJTUxNRV9RVUVVRQkqUXVldWUgPSAoTUxNRV9RVUVVRSAqKSZwQWQtPk1sbWUuUXVldWU7CisKKyNpZmRlZiBSQUxJTktfQVRFCisJLyogTm90aGluZyB0byBkbyBpbiBBVEUgbW9kZSAqLworCWlmKEFURV9PTihwQWQpKQorCQlyZXR1cm4gRkFMU0U7CisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCisJLy8gRG8gbm90aGluZyBpZiB0aGUgZHJpdmVyIGlzIHN0YXJ0aW5nIGhhbHQgc3RhdGUuCisJLy8gVGhpcyBtaWdodCBoYXBwZW4gd2hlbiB0aW1lciBhbHJlYWR5IGJlZW4gZmlyZWQgYmVmb3JlIGNhbmNlbCB0aW1lciB3aXRoIG1sbWVoYWx0CisJaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkKKwl7CisJCURCR1BSSU5UX0VSUigoIk1sbWVFbnF1ZXVlRm9yUmVjdjogZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTXG4iKSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwkvLyBGaXJzdCBjaGVjayB0aGUgc2l6ZSwgaXQgTVVTVCBub3QgZXhjZWVkIHRoZSBtbG1lIHF1ZXVlIHNpemUKKwlpZiAoTXNnTGVuID4gTUdNVF9ETUFfQlVGRkVSX1NJWkUpCisJeworCQlEQkdQUklOVF9FUlIoKCJNbG1lRW5xdWV1ZUZvclJlY3Y6IGZyYW1lIHRvbyBsYXJnZSwgc2l6ZSA9ICVsZCBcbiIsIE1zZ0xlbikpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJaWYgKE1sbWVRdWV1ZUZ1bGwoUXVldWUpKQorCXsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJeworCQlpZiAoIU1zZ1R5cGVTdWJzdChwQWQsIHBGcmFtZSwgJk1hY2hpbmUsICZNc2dUeXBlKSkKKwkJeworCQkJREJHUFJJTlRfRVJSKCgiTWxtZUVucXVldWVGb3JSZWN2OiB1bi1yZWNvbmduaXplZCBtZ210LT5zdWJ0eXBlPSVkXG4iLHBGcmFtZS0+SGRyLkZDLlN1YlR5cGUpKTsKKwkJCXJldHVybiBGQUxTRTsKKwkJfQorCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCS8vIE9LLCB3ZSBnb3QgYWxsIHRoZSBpbmZvcm1hdGlvbnMsIGl0IGlzIHRpbWUgdG8gcHV0IHRoaW5ncyBpbnRvIHF1ZXVlCisJTmRpc0FjcXVpcmVTcGluTG9jaygmKFF1ZXVlLT5Mb2NrKSk7CisJVGFpbCA9IFF1ZXVlLT5UYWlsOworCVF1ZXVlLT5UYWlsKys7CisJUXVldWUtPk51bSsrOworCWlmIChRdWV1ZS0+VGFpbCA9PSBNQVhfTEVOX09GX01MTUVfUVVFVUUpCisJeworCQlRdWV1ZS0+VGFpbCA9IDA7CisJfQorCVF1ZXVlLT5FbnRyeVtUYWlsXS5PY2N1cGllZCA9IFRSVUU7CisJUXVldWUtPkVudHJ5W1RhaWxdLk1hY2hpbmUgPSBNYWNoaW5lOworCVF1ZXVlLT5FbnRyeVtUYWlsXS5Nc2dUeXBlID0gTXNnVHlwZTsKKwlRdWV1ZS0+RW50cnlbVGFpbF0uTXNnTGVuICA9IE1zZ0xlbjsKKwlRdWV1ZS0+RW50cnlbVGFpbF0uVGltZVN0YW1wLnUuTG93UGFydCA9IFRpbWVTdGFtcExvdzsKKwlRdWV1ZS0+RW50cnlbVGFpbF0uVGltZVN0YW1wLnUuSGlnaFBhcnQgPSBUaW1lU3RhbXBIaWdoOworCVF1ZXVlLT5FbnRyeVtUYWlsXS5Sc3NpMCA9IFJzc2kwOworCVF1ZXVlLT5FbnRyeVtUYWlsXS5Sc3NpMSA9IFJzc2kxOworCVF1ZXVlLT5FbnRyeVtUYWlsXS5Sc3NpMiA9IFJzc2kyOworCVF1ZXVlLT5FbnRyeVtUYWlsXS5TaWduYWwgPSBTaWduYWw7CisJUXVldWUtPkVudHJ5W1RhaWxdLldjaWQgPSAoVUNIQVIpV2NpZDsKKworCVF1ZXVlLT5FbnRyeVtUYWlsXS5DaGFubmVsID0gcEFkLT5MYXRjaFJmUmVncy5DaGFubmVsOworCisJaWYgKE1zZyAhPSBOVUxMKQorCXsKKwkJTmRpc01vdmVNZW1vcnkoUXVldWUtPkVudHJ5W1RhaWxdLk1zZywgTXNnLCBNc2dMZW4pOworCX0KKworCU5kaXNSZWxlYXNlU3BpbkxvY2soJihRdWV1ZS0+TG9jaykpOworCisJUlQyOFhYX01MTUVfSEFORExFUihwQWQpOworCisJcmV0dXJuIFRSVUU7Cit9CisKKworLyohIFxicmllZgkgRGVxdWV1ZSBhIG1lc3NhZ2UgZnJvbSB0aGUgTUxNRSBRdWV1ZQorICoJXHBhcmFtCSpRdWV1ZQkgIFRoZSBNTE1FIFF1ZXVlCisgKglccGFyYW0JKkVsZW0JICBUaGUgbWVzc2FnZSBkZXF1ZXVlZCBmcm9tIE1MTUUgUXVldWUKKyAqCVxyZXR1cm4gIFRSVUUgaWYgdGhlIEVsZW0gY29udGFpbnMgc29tZXRoaW5nLCBGQUxTRSBvdGhlcndpc2UKKyAqCVxwcmUKKyAqCVxwb3N0CisKKyBJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworICovCitCT09MRUFOIE1sbWVEZXF1ZXVlKAorCUlOIE1MTUVfUVVFVUUgKlF1ZXVlLAorCU9VVCBNTE1FX1FVRVVFX0VMRU0gKipFbGVtKQoreworCU5kaXNBY3F1aXJlU3BpbkxvY2soJihRdWV1ZS0+TG9jaykpOworCSpFbGVtID0gJihRdWV1ZS0+RW50cnlbUXVldWUtPkhlYWRdKTsKKwlRdWV1ZS0+TnVtLS07CisJUXVldWUtPkhlYWQrKzsKKwlpZiAoUXVldWUtPkhlYWQgPT0gTUFYX0xFTl9PRl9NTE1FX1FVRVVFKQorCXsKKwkJUXVldWUtPkhlYWQgPSAwOworCX0KKwlOZGlzUmVsZWFzZVNwaW5Mb2NrKCYoUXVldWUtPkxvY2spKTsKKwlyZXR1cm4gVFJVRTsKK30KKworLy8gSVJRTCA9IERJU1BBVENIX0xFVkVMCitWT0lECU1sbWVSZXN0YXJ0U3RhdGVNYWNoaW5lKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKQoreworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUJPT0xFQU4JCQkJQ2FuY2VsbGVkOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTWxtZVJlc3RhcnRTdGF0ZU1hY2hpbmUgXG4iKSk7CisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJeworI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCQlVQ0hBUiBpOworI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCQkvLyBDYW5jZWwgYWxsIHRpbWVyIGV2ZW50cworCQkvLyBCZSBjYXJlZnVsIHRvIGNhbmNlbCBuZXcgYWRkZWQgdGltZXIKKwkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguQXNzb2NUaW1lciwJICAmQ2FuY2VsbGVkKTsKKwkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguUmVhc3NvY1RpbWVyLCAgICZDYW5jZWxsZWQpOworCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5EaXNhc3NvY1RpbWVyLCAgJkNhbmNlbGxlZCk7CisJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LkF1dGhUaW1lciwJICAgJkNhbmNlbGxlZCk7CisJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LkJlYWNvblRpbWVyLAkgICAmQ2FuY2VsbGVkKTsKKwkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguU2NhblRpbWVyLAkgICAmQ2FuY2VsbGVkKTsKKworI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCQlmb3IgKGk9MDsgaTxNQVhfTlVNX09GX0RMU19FTlRSWTsgaSsrKQorCQl7CisJCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlRpbWVyLCAmQ2FuY2VsbGVkKTsKKwkJfQorI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCS8vIENoYW5nZSBiYWNrIHRvIG9yaWdpbmFsIGNoYW5uZWwgaW4gY2FzZSBvZiBkb2luZyBzY2FuCisJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsLCBGQUxTRSk7CisJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCk7CisKKwkvLyBSZXN1bWUgTVNEVSB3aGljaCBpcyB0dXJuZWQgb2ZmIGR1cm5pbmcgc2NhbgorCVJUTVBSZXN1bWVNc2R1VHJhbnNtaXNzaW9uKHBBZCk7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCXsKKwkJLy8gU2V0IGFsbCBzdGF0ZSBtYWNoaW5lcyBiYWNrIElETEUKKwkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSAgICA9IENOVExfSURMRTsKKwkJcEFkLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUgICA9IEFTU09DX0lETEU7CisJCXBBZC0+TWxtZS5BdXRoTWFjaGluZS5DdXJyU3RhdGUgICAgPSBBVVRIX1JFUV9JRExFOworCQlwQWQtPk1sbWUuQXV0aFJzcE1hY2hpbmUuQ3VyclN0YXRlID0gQVVUSF9SU1BfSURMRTsKKwkJcEFkLT5NbG1lLlN5bmNNYWNoaW5lLkN1cnJTdGF0ZSAgICA9IFNZTkNfSURMRTsKKwkJcEFkLT5NbG1lLkFjdE1hY2hpbmUuQ3VyclN0YXRlICAgID0gQUNUX0lETEU7CisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJCXBBZC0+TWxtZS5EbHNNYWNoaW5lLkN1cnJTdGF0ZSAgICA9IERMU19JRExFOworI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworfQorCisvKiEgXGJyaWVmCXRlc3QgaWYgdGhlIE1MTUUgUXVldWUgaXMgZW1wdHkKKyAqCVxwYXJhbQkqUXVldWUJICBUaGUgTUxNRSBRdWV1ZQorICoJXHJldHVybiBUUlVFIGlmIHRoZSBRdWV1ZSBpcyBlbXB0eSwgRkFMU0Ugb3RoZXJ3aXNlCisgKglccHJlCisgKglccG9zdAorCisgSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKyAqLworQk9PTEVBTiBNbG1lUXVldWVFbXB0eSgKKwlJTiBNTE1FX1FVRVVFICpRdWV1ZSkKK3sKKwlCT09MRUFOIEFuczsKKworCU5kaXNBY3F1aXJlU3BpbkxvY2soJihRdWV1ZS0+TG9jaykpOworCUFucyA9IChRdWV1ZS0+TnVtID09IDApOworCU5kaXNSZWxlYXNlU3BpbkxvY2soJihRdWV1ZS0+TG9jaykpOworCisJcmV0dXJuIEFuczsKK30KKworLyohIFxicmllZgkgdGVzdCBpZiB0aGUgTUxNRSBRdWV1ZSBpcyBmdWxsCisgKglccGFyYW0JICpRdWV1ZSAJIFRoZSBNTE1FIFF1ZXVlCisgKglccmV0dXJuICBUUlVFIGlmIHRoZSBRdWV1ZSBpcyBlbXB0eSwgRkFMU0Ugb3RoZXJ3aXNlCisgKglccHJlCisgKglccG9zdAorCisgSVJRTCA9IFBBU1NJVkVfTEVWRUwKKyBJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworICovCitCT09MRUFOIE1sbWVRdWV1ZUZ1bGwoCisJSU4gTUxNRV9RVUVVRSAqUXVldWUpCit7CisJQk9PTEVBTiBBbnM7CisKKwlOZGlzQWNxdWlyZVNwaW5Mb2NrKCYoUXVldWUtPkxvY2spKTsKKwlBbnMgPSAoUXVldWUtPk51bSA9PSBNQVhfTEVOX09GX01MTUVfUVVFVUUgfHwgUXVldWUtPkVudHJ5W1F1ZXVlLT5UYWlsXS5PY2N1cGllZCk7CisJTmRpc1JlbGVhc2VTcGluTG9jaygmKFF1ZXVlLT5Mb2NrKSk7CisKKwlyZXR1cm4gQW5zOworfQorCisvKiEgXGJyaWVmCSBUaGUgZGVzdHJ1Y3RvciBvZiBNTE1FIFF1ZXVlCisgKglccGFyYW0KKyAqCVxyZXR1cm4KKyAqCVxwcmUKKyAqCVxwb3N0CisgKglcbm90ZQlDbGVhciBNbG1lIFF1ZXVlLCBTZXQgUXVldWUtPk51bSB0byBaZXJvLgorCisgSVJRTCA9IFBBU1NJVkVfTEVWRUwKKworICovCitWT0lEIE1sbWVRdWV1ZURlc3Ryb3koCisJSU4gTUxNRV9RVUVVRSAqcFF1ZXVlKQoreworCU5kaXNBY3F1aXJlU3BpbkxvY2soJihwUXVldWUtPkxvY2spKTsKKwlwUXVldWUtPk51bSAgPSAwOworCXBRdWV1ZS0+SGVhZCA9IDA7CisJcFF1ZXVlLT5UYWlsID0gMDsKKwlOZGlzUmVsZWFzZVNwaW5Mb2NrKCYocFF1ZXVlLT5Mb2NrKSk7CisJTmRpc0ZyZWVTcGluTG9jaygmKHBRdWV1ZS0+TG9jaykpOworfQorCisvKiEgXGJyaWVmCSBUbyBzdWJzdGl0dXRlIHRoZSBtZXNzYWdlIHR5cGUgaWYgdGhlIG1lc3NhZ2UgaXMgY29taW5nIGZyb20gZXh0ZXJuYWwKKyAqCVxwYXJhbQlwRnJhbWUJCSAgIFRoZSBmcmFtZSByZWNlaXZlZAorICoJXHBhcmFtCSpNYWNoaW5lCSAgIFRoZSBzdGF0ZSBtYWNoaW5lCisgKglccGFyYW0JKk1zZ1R5cGUJICAgdGhlIG1lc3NhZ2UgdHlwZSBmb3IgdGhlIHN0YXRlIG1hY2hpbmUKKyAqCVxyZXR1cm4gVFJVRSBpZiB0aGUgc3Vic3RpdHV0aW9uIGlzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZQorICoJXHByZQorICoJXHBvc3QKKworIElSUUwgPSBESVNQQVRDSF9MRVZFTAorCisgKi8KKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKK0JPT0xFQU4gTXNnVHlwZVN1YnN0KAorCUlOIFBSVE1QX0FEQVBURVIgIHBBZCwKKwlJTiBQRlJBTUVfODAyXzExIHBGcmFtZSwKKwlPVVQgSU5UICpNYWNoaW5lLAorCU9VVCBJTlQgKk1zZ1R5cGUpCit7CisJVVNIT1JUCVNlcTsKKwlVQ0hBUglFQVBUeXBlOworCVBVQ0hBUglwRGF0YTsKKworCS8vIFBvaW50ZXIgdG8gc3RhcnQgb2YgZGF0YSBmcmFtZXMgaW5jbHVkaW5nIFNOQVAgaGVhZGVyCisJcERhdGEgPSAoUFVDSEFSKSBwRnJhbWUgKyBMRU5HVEhfODAyXzExOworCisJLy8gVGhlIG9ubHkgZGF0YSB0eXBlIHdpbGwgcGFzcyB0byB0aGlzIGZ1bmN0aW9uIGlzIEVBUE9MIGZyYW1lCisJaWYgKHBGcmFtZS0+SGRyLkZDLlR5cGUgPT0gQlRZUEVfREFUQSkKKwl7CisJCWlmIChOZGlzRXF1YWxNZW1vcnkoU05BUF9BSVJPTkVULCBwRGF0YSwgTEVOR1RIXzgwMl8xX0gpKQorCQl7CisJCQkvLyBDaXNjbyBBaXJvbmV0IFNOQVAgaGVhZGVyCisJCQkqTWFjaGluZSA9IEFJUk9ORVRfU1RBVEVfTUFDSElORTsKKwkJCSpNc2dUeXBlID0gTVQyX0FJUk9ORVRfTVNHOworCQkJcmV0dXJuIChUUlVFKTsKKwkJfQorI2lmZGVmIExFQVBfU1VQUE9SVAorCQlpZiAoIHBBZC0+U3RhQ2ZnLkxlYXBBdXRoTW9kZSA9PSBDSVNDT19BdXRoTW9kZUxFQVAgKSAvL0xFQVAKKwkJeworCQkJLy8gTEVBUCBmcmFtZXMKKwkJCSpNYWNoaW5lID0gTEVBUF9TVEFURV9NQUNISU5FOworCQkJRUFQVHlwZSA9ICooKFVDSEFSKilwRnJhbWUgKyBMRU5HVEhfODAyXzExICsgTEVOR1RIXzgwMl8xX0ggKyAxKTsKKwkJCXJldHVybiAoTGVhcE1zZ1R5cGVTdWJzdChFQVBUeXBlLCBNc2dUeXBlKSk7CisJCX0KKwkJZWxzZQorI2VuZGlmIC8vIExFQVBfU1VQUE9SVCAvLworCQl7CisJCQkqTWFjaGluZSA9IFdQQV9QU0tfU1RBVEVfTUFDSElORTsKKwkJCUVBUFR5cGUgPSAqKChVQ0hBUiopcEZyYW1lICsgTEVOR1RIXzgwMl8xMSArIExFTkdUSF84MDJfMV9IICsgMSk7CisJCQlyZXR1cm4oV3BhTXNnVHlwZVN1YnN0KEVBUFR5cGUsIE1zZ1R5cGUpKTsKKwkJfQorCX0KKworCXN3aXRjaCAocEZyYW1lLT5IZHIuRkMuU3ViVHlwZSkKKwl7CisJCWNhc2UgU1VCVFlQRV9BU1NPQ19SRVE6CisJCQkqTWFjaGluZSA9IEFTU09DX1NUQVRFX01BQ0hJTkU7CisJCQkqTXNnVHlwZSA9IE1UMl9QRUVSX0FTU09DX1JFUTsKKwkJCWJyZWFrOworCQljYXNlIFNVQlRZUEVfQVNTT0NfUlNQOgorCQkJKk1hY2hpbmUgPSBBU1NPQ19TVEFURV9NQUNISU5FOworCQkJKk1zZ1R5cGUgPSBNVDJfUEVFUl9BU1NPQ19SU1A7CisJCQlicmVhazsKKwkJY2FzZSBTVUJUWVBFX1JFQVNTT0NfUkVROgorCQkJKk1hY2hpbmUgPSBBU1NPQ19TVEFURV9NQUNISU5FOworCQkJKk1zZ1R5cGUgPSBNVDJfUEVFUl9SRUFTU09DX1JFUTsKKwkJCWJyZWFrOworCQljYXNlIFNVQlRZUEVfUkVBU1NPQ19SU1A6CisJCQkqTWFjaGluZSA9IEFTU09DX1NUQVRFX01BQ0hJTkU7CisJCQkqTXNnVHlwZSA9IE1UMl9QRUVSX1JFQVNTT0NfUlNQOworCQkJYnJlYWs7CisJCWNhc2UgU1VCVFlQRV9QUk9CRV9SRVE6CisJCQkqTWFjaGluZSA9IFNZTkNfU1RBVEVfTUFDSElORTsKKwkJCSpNc2dUeXBlID0gTVQyX1BFRVJfUFJPQkVfUkVROworCQkJYnJlYWs7CisJCWNhc2UgU1VCVFlQRV9QUk9CRV9SU1A6CisJCQkqTWFjaGluZSA9IFNZTkNfU1RBVEVfTUFDSElORTsKKwkJCSpNc2dUeXBlID0gTVQyX1BFRVJfUFJPQkVfUlNQOworCQkJYnJlYWs7CisJCWNhc2UgU1VCVFlQRV9CRUFDT046CisJCQkqTWFjaGluZSA9IFNZTkNfU1RBVEVfTUFDSElORTsKKwkJCSpNc2dUeXBlID0gTVQyX1BFRVJfQkVBQ09OOworCQkJYnJlYWs7CisJCWNhc2UgU1VCVFlQRV9BVElNOgorCQkJKk1hY2hpbmUgPSBTWU5DX1NUQVRFX01BQ0hJTkU7CisJCQkqTXNnVHlwZSA9IE1UMl9QRUVSX0FUSU07CisJCQlicmVhazsKKwkJY2FzZSBTVUJUWVBFX0RJU0FTU09DOgorCQkJKk1hY2hpbmUgPSBBU1NPQ19TVEFURV9NQUNISU5FOworCQkJKk1zZ1R5cGUgPSBNVDJfUEVFUl9ESVNBU1NPQ19SRVE7CisJCQlicmVhazsKKwkJY2FzZSBTVUJUWVBFX0FVVEg6CisJCQkvLyBnZXQgdGhlIHNlcXVlbmNlIG51bWJlciBmcm9tIHBheWxvYWQgMjQgTWFjIEhlYWRlciArIDIgYnl0ZXMgYWxnb3JpdGhtCisJCQlOZGlzTW92ZU1lbW9yeSgmU2VxLCAmcEZyYW1lLT5PY3RldFsyXSwgc2l6ZW9mKFVTSE9SVCkpOworCQkJaWYgKFNlcSA9PSAxIHx8IFNlcSA9PSAzKQorCQkJeworCQkJCSpNYWNoaW5lID0gQVVUSF9SU1BfU1RBVEVfTUFDSElORTsKKwkJCQkqTXNnVHlwZSA9IE1UMl9QRUVSX0FVVEhfT0REOworCQkJfQorCQkJZWxzZSBpZiAoU2VxID09IDIgfHwgU2VxID09IDQpCisJCQl7CisJCQkJKk1hY2hpbmUgPSBBVVRIX1NUQVRFX01BQ0hJTkU7CisJCQkJKk1zZ1R5cGUgPSBNVDJfUEVFUl9BVVRIX0VWRU47CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJcmV0dXJuIEZBTFNFOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgU1VCVFlQRV9ERUFVVEg6CisJCQkqTWFjaGluZSA9IEFVVEhfUlNQX1NUQVRFX01BQ0hJTkU7CisJCQkqTXNnVHlwZSA9IE1UMl9QRUVSX0RFQVVUSDsKKwkJCWJyZWFrOworCQljYXNlIFNVQlRZUEVfQUNUSU9OOgorCQkJKk1hY2hpbmUgPSBBQ1RJT05fU1RBVEVfTUFDSElORTsKKwkJCS8vICBTb21ldGltZXMgU3RhIHdpbGwgcmV0dXJuIHdpdGggY2F0ZWdvcnkgYnl0ZXMgd2l0aCBNU0IgPSAxLCBpZiB0aGV5IHJlY2VpdmUgY2F0b2dvcnkgb3V0IG9mIHRoZWlyIHN1cHBvcnQKKwkJCWlmICgocEZyYW1lLT5PY3RldFswXSYweDdGKSA+IE1BWF9QRUVSX0NBVEVfTVNHKQorCQkJeworCQkJCSpNc2dUeXBlID0gTVQyX0FDVF9JTlZBTElEOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCSpNc2dUeXBlID0gKHBGcmFtZS0+T2N0ZXRbMF0mMHg3Rik7CisJCQl9CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiBGQUxTRTsKKwkJCWJyZWFrOworCX0KKworCXJldHVybiBUUlVFOworfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBzdGF0ZV9tYWNoaW5lLmMKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLyohIFxicmllZiBJbml0aWFsaXplIHRoZSBzdGF0ZSBtYWNoaW5lLgorICoJXHBhcmFtICpTCQkJcG9pbnRlciB0byB0aGUgc3RhdGUgbWFjaGluZQorICoJXHBhcmFtCVRyYW5zCQlTdGF0ZSBtYWNoaW5lIHRyYW5zaXRpb24gZnVuY3Rpb24KKyAqCVxwYXJhbQlTdE5yCQludW1iZXIgb2Ygc3RhdGVzCisgKglccGFyYW0JTXNnTnIJCW51bWJlciBvZiBtZXNzYWdlcworICoJXHBhcmFtCURlZkZ1bmMgCWRlZmF1bHQgZnVuY3Rpb24sIHdoZW4gdGhlcmUgaXMgaW52YWxpZCBzdGF0ZS9tZXNzYWdlIGNvbWJpbmF0aW9uCisgKglccGFyYW0JSW5pdFN0YXRlCWluaXRpYWwgc3RhdGUgb2YgdGhlIHN0YXRlIG1hY2hpbmUKKyAqCVxwYXJhbQlCYXNlCQlTdGF0ZU1hY2hpbmUgYmFzZSwgaW50ZXJuYWwgdXNlIG9ubHkKKyAqCVxwcmUgcF9zbSBzaG91bGQgYmUgYSBsZWdhbCBwb2ludGVyCisgKglccG9zdAorCisgSVJRTCA9IFBBU1NJVkVfTEVWRUwKKworICovCitWT0lEIFN0YXRlTWFjaGluZUluaXQoCisJSU4gU1RBVEVfTUFDSElORSAqUywKKwlJTiBTVEFURV9NQUNISU5FX0ZVTkMgVHJhbnNbXSwKKwlJTiBVTE9ORyBTdE5yLAorCUlOIFVMT05HIE1zZ05yLAorCUlOIFNUQVRFX01BQ0hJTkVfRlVOQyBEZWZGdW5jLAorCUlOIFVMT05HIEluaXRTdGF0ZSwKKwlJTiBVTE9ORyBCYXNlKQoreworCVVMT05HIGksIGo7CisKKwkvLyBzZXQgbnVtYmVyIG9mIHN0YXRlcyBhbmQgbWVzc2FnZXMKKwlTLT5OclN0YXRlID0gU3ROcjsKKwlTLT5Ock1zZyAgID0gTXNnTnI7CisJUy0+QmFzZSAgICA9IEJhc2U7CisKKwlTLT5UcmFuc0Z1bmMgID0gVHJhbnM7CisKKwkvLyBpbml0IGFsbCBzdGF0ZSB0cmFuc2l0aW9uIHRvIGRlZmF1bHQgZnVuY3Rpb24KKwlmb3IgKGkgPSAwOyBpIDwgU3ROcjsgaSsrKQorCXsKKwkJZm9yIChqID0gMDsgaiA8IE1zZ05yOyBqKyspCisJCXsKKwkJCVMtPlRyYW5zRnVuY1tpICogTXNnTnIgKyBqXSA9IERlZkZ1bmM7CisJCX0KKwl9CisKKwkvLyBzZXQgdGhlIHN0YXJ0aW5nIHN0YXRlCisJUy0+Q3VyclN0YXRlID0gSW5pdFN0YXRlOworfQorCisvKiEgXGJyaWVmIFRoaXMgZnVuY3Rpb24gZmlsbHMgaW4gdGhlIGZ1bmN0aW9uIHBvaW50ZXIgaW50byB0aGUgY2VsbCBpbiB0aGUgc3RhdGUgbWFjaGluZQorICoJXHBhcmFtICpTCXBvaW50ZXIgdG8gdGhlIHN0YXRlIG1hY2hpbmUKKyAqCVxwYXJhbSBTdAlzdGF0ZQorICoJXHBhcmFtIE1zZwlpbmNvbWluZyBtZXNzYWdlCisgKglccGFyYW0gZgl0aGUgZnVuY3Rpb24gdG8gYmUgZXhlY3V0ZWQgd2hlbiAoc3RhdGUsIG1lc3NhZ2UpIGNvbWJpbmF0aW9uIG9jY3VycyBhdCB0aGUgc3RhdGUgbWFjaGluZQorICoJXHByZSAqUyBzaG91bGQgYmUgYSBsZWdhbCBwb2ludGVyIHRvIHRoZSBzdGF0ZSBtYWNoaW5lLCBzdCwgbXNnLCBzaG91bGQgYmUgYWxsIHdpdGhpbiB0aGUgcmFuZ2UsIEJhc2Ugc2hvdWxkIGJlIHNldCBpbiB0aGUgaW5pdGlhbCBzdGF0ZQorICoJXHBvc3QKKworIElSUUwgPSBQQVNTSVZFX0xFVkVMCisKKyAqLworVk9JRCBTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oCisJSU4gU1RBVEVfTUFDSElORSAqUywKKwlJTiBVTE9ORyBTdCwKKwlJTiBVTE9ORyBNc2csCisJSU4gU1RBVEVfTUFDSElORV9GVU5DIEZ1bmMpCit7CisJVUxPTkcgTXNnSWR4OworCisJTXNnSWR4ID0gTXNnIC0gUy0+QmFzZTsKKworCWlmIChTdCA8IFMtPk5yU3RhdGUgJiYgTXNnSWR4IDwgUy0+TnJNc2cpCisJeworCQkvLyBib3VuZGFyeSBjaGVja2luZyBiZWZvcmUgc2V0dGluZyB0aGUgYWN0aW9uCisJCVMtPlRyYW5zRnVuY1tTdCAqIFMtPk5yTXNnICsgTXNnSWR4XSA9IEZ1bmM7CisJfQorfQorCisvKiEgXGJyaWVmCSBUaGlzIGZ1bmN0aW9uIGRvZXMgdGhlIHN0YXRlIHRyYW5zaXRpb24KKyAqCVxwYXJhbQkgKkFkYXB0ZXIgdGhlIE5JQyBhZGFwdGVyIHBvaW50ZXIKKyAqCVxwYXJhbQkgKlMgCSAgdGhlIHN0YXRlIG1hY2hpbmUKKyAqCVxwYXJhbQkgKkVsZW0JICB0aGUgbWVzc2FnZSB0byBiZSBleGVjdXRlZAorICoJXHJldHVybiAgIE5vbmUKKworIElSUUwgPSBESVNQQVRDSF9MRVZFTAorCisgKi8KK1ZPSUQgU3RhdGVNYWNoaW5lUGVyZm9ybUFjdGlvbigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiBTVEFURV9NQUNISU5FICpTLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwkoKihTLT5UcmFuc0Z1bmNbUy0+Q3VyclN0YXRlICogUy0+TnJNc2cgKyBFbGVtLT5Nc2dUeXBlIC0gUy0+QmFzZV0pKShwQWQsIEVsZW0pOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVRoZSBkcm9wIGZ1bmN0aW9uLCB3aGVuIG1hY2hpbmUgZXhlY3V0ZXMgdGhpcywgdGhlIG1lc3NhZ2UgaXMgc2ltcGx5CisJCWlnbm9yZWQuIFRoaXMgZnVuY3Rpb24gZG9lcyBub3RoaW5nLCB0aGUgbWVzc2FnZSBpcyBmcmVlZCBpbgorCQlTdGF0ZU1hY2hpbmVQZXJmb3JtQWN0aW9uKCkKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIERyb3AoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBsZnNyLmMKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgTGZzckluaXQoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVUxPTkcgU2VlZCkKK3sKKwlpZiAoU2VlZCA9PSAwKQorCQlwQWQtPk1sbWUuU2hpZnRSZWcgPSAxOworCWVsc2UKKwkJcEFkLT5NbG1lLlNoaWZ0UmVnID0gU2VlZDsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1VDSEFSIFJhbmRvbUJ5dGUoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJVUxPTkcgaTsKKwlVQ0hBUiBSLCBSZXN1bHQ7CisKKwlSID0gMDsKKworCWlmIChwQWQtPk1sbWUuU2hpZnRSZWcgPT0gMCkKKwlOZGlzR2V0U3lzdGVtVXBUaW1lKChVTE9ORyAqKSZwQWQtPk1sbWUuU2hpZnRSZWcpOworCisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKwl7CisJCWlmIChwQWQtPk1sbWUuU2hpZnRSZWcgJiAweDAwMDAwMDAxKQorCQl7CisJCQlwQWQtPk1sbWUuU2hpZnRSZWcgPSAoKHBBZC0+TWxtZS5TaGlmdFJlZyBeIExGU1JfTUFTSykgPj4gMSkgfCAweDgwMDAwMDAwOworCQkJUmVzdWx0ID0gMTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXBBZC0+TWxtZS5TaGlmdFJlZyA9IHBBZC0+TWxtZS5TaGlmdFJlZyA+PiAxOworCQkJUmVzdWx0ID0gMDsKKwkJfQorCQlSID0gKFIgPDwgMSkgfCBSZXN1bHQ7CisJfQorCisJcmV0dXJuIFI7Cit9CisKK1ZPSUQgQXNpY1VwZGF0ZUF1dG9GYWxsQmFja1RhYmxlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCXBSYXRlVGFibGUpCit7CisJVUNIQVIJCQkJCWk7CisJSFRfRkJLX0NGRzBfU1RSVUMJCUh0Q2ZnMDsKKwlIVF9GQktfQ0ZHMV9TVFJVQwkJSHRDZmcxOworCUxHX0ZCS19DRkcwX1NUUlVDCQlMZ0NmZzA7CisJTEdfRkJLX0NGRzFfU1RSVUMJCUxnQ2ZnMTsKKwlQUlRNUF9UWF9SQVRFX1NXSVRDSAlwQ3VyclR4UmF0ZSwgcE5leHRUeFJhdGU7CisKKwkvLyBzZXQgdG8gaW5pdGlhbCB2YWx1ZQorCUh0Q2ZnMC53b3JkID0gMHg2NTQzMjEwMDsKKwlIdENmZzEud29yZCA9IDB4ZWRjYmE5ODg7CisJTGdDZmcwLndvcmQgPSAweGVkY2JhOTg4OworCUxnQ2ZnMS53b3JkID0gMHgwMDAwMjEwMDsKKworCXBOZXh0VHhSYXRlID0gKFBSVE1QX1RYX1JBVEVfU1dJVENIKXBSYXRlVGFibGUrMTsKKwlmb3IgKGkgPSAxOyBpIDwgKigoUFVDSEFSKSBwUmF0ZVRhYmxlKTsgaSsrKQorCXsKKwkJcEN1cnJUeFJhdGUgPSAoUFJUTVBfVFhfUkFURV9TV0lUQ0gpcFJhdGVUYWJsZSsxK2k7CisJCXN3aXRjaCAocEN1cnJUeFJhdGUtPk1vZGUpCisJCXsKKwkJCWNhc2UgMDoJCS8vQ0NLCisJCQkJYnJlYWs7CisJCQljYXNlIDE6CQkvL09GRE0KKwkJCQl7CisJCQkJCXN3aXRjaChwQ3VyclR4UmF0ZS0+Q3Vyck1DUykKKwkJCQkJeworCQkJCQkJY2FzZSAwOgorCQkJCQkJCUxnQ2ZnMC5maWVsZC5PRkRNTUNTMEZCSyA9IChwTmV4dFR4UmF0ZS0+TW9kZSA9PSBNT0RFX09GRE0pID8gKHBOZXh0VHhSYXRlLT5DdXJyTUNTKzgpOiBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKKwkJCQkJCQlicmVhazsKKwkJCQkJCWNhc2UgMToKKwkJCQkJCQlMZ0NmZzAuZmllbGQuT0ZETU1DUzFGQksgPSAocE5leHRUeFJhdGUtPk1vZGUgPT0gTU9ERV9PRkRNKSA/IChwTmV4dFR4UmF0ZS0+Q3Vyck1DUys4KTogcE5leHRUeFJhdGUtPkN1cnJNQ1M7CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlIDI6CisJCQkJCQkJTGdDZmcwLmZpZWxkLk9GRE1NQ1MyRkJLID0gKHBOZXh0VHhSYXRlLT5Nb2RlID09IE1PREVfT0ZETSkgPyAocE5leHRUeFJhdGUtPkN1cnJNQ1MrOCk6IHBOZXh0VHhSYXRlLT5DdXJyTUNTOworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSAzOgorCQkJCQkJCUxnQ2ZnMC5maWVsZC5PRkRNTUNTM0ZCSyA9IChwTmV4dFR4UmF0ZS0+TW9kZSA9PSBNT0RFX09GRE0pID8gKHBOZXh0VHhSYXRlLT5DdXJyTUNTKzgpOiBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKKwkJCQkJCQlicmVhazsKKwkJCQkJCWNhc2UgNDoKKwkJCQkJCQlMZ0NmZzAuZmllbGQuT0ZETU1DUzRGQksgPSAocE5leHRUeFJhdGUtPk1vZGUgPT0gTU9ERV9PRkRNKSA/IChwTmV4dFR4UmF0ZS0+Q3Vyck1DUys4KTogcE5leHRUeFJhdGUtPkN1cnJNQ1M7CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlIDU6CisJCQkJCQkJTGdDZmcwLmZpZWxkLk9GRE1NQ1M1RkJLID0gKHBOZXh0VHhSYXRlLT5Nb2RlID09IE1PREVfT0ZETSkgPyAocE5leHRUeFJhdGUtPkN1cnJNQ1MrOCk6IHBOZXh0VHhSYXRlLT5DdXJyTUNTOworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSA2OgorCQkJCQkJCUxnQ2ZnMC5maWVsZC5PRkRNTUNTNkZCSyA9IChwTmV4dFR4UmF0ZS0+TW9kZSA9PSBNT0RFX09GRE0pID8gKHBOZXh0VHhSYXRlLT5DdXJyTUNTKzgpOiBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKKwkJCQkJCQlicmVhazsKKwkJCQkJCWNhc2UgNzoKKwkJCQkJCQlMZ0NmZzAuZmllbGQuT0ZETU1DUzdGQksgPSAocE5leHRUeFJhdGUtPk1vZGUgPT0gTU9ERV9PRkRNKSA/IChwTmV4dFR4UmF0ZS0+Q3Vyck1DUys4KTogcE5leHRUeFJhdGUtPkN1cnJNQ1M7CisJCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisJCQkJYnJlYWs7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQljYXNlIDI6CQkvL0hULU1JWAorCQkJY2FzZSAzOgkJLy9IVC1HRgorCQkJCXsKKwkJCQkJaWYgKChwTmV4dFR4UmF0ZS0+TW9kZSA+PSBNT0RFX0hUTUlYKSAmJiAocEN1cnJUeFJhdGUtPkN1cnJNQ1MgIT0gcE5leHRUeFJhdGUtPkN1cnJNQ1MpKQorCQkJCQl7CisJCQkJCQlzd2l0Y2gocEN1cnJUeFJhdGUtPkN1cnJNQ1MpCisJCQkJCQl7CisJCQkJCQkJY2FzZSAwOgorCQkJCQkJCQlIdENmZzAuZmllbGQuSFRNQ1MwRkJLID0gcE5leHRUeFJhdGUtPkN1cnJNQ1M7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgMToKKwkJCQkJCQkJSHRDZmcwLmZpZWxkLkhUTUNTMUZCSyA9IHBOZXh0VHhSYXRlLT5DdXJyTUNTOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQljYXNlIDI6CisJCQkJCQkJCUh0Q2ZnMC5maWVsZC5IVE1DUzJGQksgPSBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSAzOgorCQkJCQkJCQlIdENmZzAuZmllbGQuSFRNQ1MzRkJLID0gcE5leHRUeFJhdGUtPkN1cnJNQ1M7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgNDoKKwkJCQkJCQkJSHRDZmcwLmZpZWxkLkhUTUNTNEZCSyA9IHBOZXh0VHhSYXRlLT5DdXJyTUNTOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQljYXNlIDU6CisJCQkJCQkJCUh0Q2ZnMC5maWVsZC5IVE1DUzVGQksgPSBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSA2OgorCQkJCQkJCQlIdENmZzAuZmllbGQuSFRNQ1M2RkJLID0gcE5leHRUeFJhdGUtPkN1cnJNQ1M7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgNzoKKwkJCQkJCQkJSHRDZmcwLmZpZWxkLkhUTUNTN0ZCSyA9IHBOZXh0VHhSYXRlLT5DdXJyTUNTOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQljYXNlIDg6CisJCQkJCQkJCUh0Q2ZnMS5maWVsZC5IVE1DUzhGQksgPSBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSA5OgorCQkJCQkJCQlIdENmZzEuZmllbGQuSFRNQ1M5RkJLID0gcE5leHRUeFJhdGUtPkN1cnJNQ1M7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgMTA6CisJCQkJCQkJCUh0Q2ZnMS5maWVsZC5IVE1DUzEwRkJLID0gcE5leHRUeFJhdGUtPkN1cnJNQ1M7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgMTE6CisJCQkJCQkJCUh0Q2ZnMS5maWVsZC5IVE1DUzExRkJLID0gcE5leHRUeFJhdGUtPkN1cnJNQ1M7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgMTI6CisJCQkJCQkJCUh0Q2ZnMS5maWVsZC5IVE1DUzEyRkJLID0gcE5leHRUeFJhdGUtPkN1cnJNQ1M7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgMTM6CisJCQkJCQkJCUh0Q2ZnMS5maWVsZC5IVE1DUzEzRkJLID0gcE5leHRUeFJhdGUtPkN1cnJNQ1M7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgMTQ6CisJCQkJCQkJCUh0Q2ZnMS5maWVsZC5IVE1DUzE0RkJLID0gcE5leHRUeFJhdGUtPkN1cnJNQ1M7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgMTU6CisJCQkJCQkJCUh0Q2ZnMS5maWVsZC5IVE1DUzE1RkJLID0gcE5leHRUeFJhdGUtPkN1cnJNQ1M7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWRlZmF1bHQ6CisJCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkFzaWNVcGRhdGVBdXRvRmFsbEJhY2tUYWJsZTogbm90IHN1cHBvcnQgQ3Vyck1DUz0lZFxuIiwgcEN1cnJUeFJhdGUtPkN1cnJNQ1MpKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCQlicmVhazsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJfQorCisJCXBOZXh0VHhSYXRlID0gcEN1cnJUeFJhdGU7CisJfQorCisJUlRNUF9JT19XUklURTMyKHBBZCwgSFRfRkJLX0NGRzAsIEh0Q2ZnMC53b3JkKTsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBIVF9GQktfQ0ZHMSwgSHRDZmcxLndvcmQpOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIExHX0ZCS19DRkcwLCBMZ0NmZzAud29yZCk7CisJUlRNUF9JT19XUklURTMyKHBBZCwgTEdfRkJLX0NGRzEsIExnQ2ZnMS53b3JkKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVNldCBNQUMgcmVnaXN0ZXIgdmFsdWUgYWNjb3JkaW5nIG9wZXJhdGlvbiBtb2RlLgorCQlPcGVyYXRpb25Nb2RlIEFORCBiTm9uR0ZFeGlzdCBhcmUgZm9yIE1NIGFuZCBHRiBQcm90ZWNpdG9uLgorCQlJZiBNTSBvciBHRiBtYXNrIGlzIG5vdCBzZXQsIHRob3NlIHBhc3NpbmcgYXJndW1lbnQgZG9lc24ndCBub3QgdGFrZSBlZmZlY3QuCisKKwkJT3BlcmF0aW9uIG1vZGUgbWVhbmluZzoKKwkJPSAwIDogUHVyZSBIVCwgbm8gcHJlb3RlY3Rpb24uCisJCT0gMHgwMTsgdGhlcmUgbWF5IGJlIG5vbi1IVCBkZXZpY2VzIGluIGJvdGggdGhlIGNvbnRyb2wgYW5kIGV4dGVuc2lvbiBjaGFubmVsLCBwcm90ZWN0aW9uIGlzIG9wdGlvbmFsIGluIEJTUy4KKwkJPSAweDEwOiBObyBUcmFuc21pc3Npb24gaW4gNDBNIGlzIHByb3RlY3RlZC4KKwkJPSAweDExOiBUcmFuc21pc3Npb24gaW4gYm90aCA0ME0gYW5kIDIwTSBzaGFsbCBiZSBwcm90ZWN0ZWQKKwkJaWYgKGJOb25HRkV4aXN0KQorCQkJd2Ugc2hvdWxkIGNob29zZSBub3QgdG8gdXNlIEdGLiBCdXQgc3RpbGwgc2V0IGNvcnJlY3QgQVNJQyByZWdpc3RlcnMuCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCAJQXNpY1VwZGF0ZVByb3RlY3QoCisJSU4JCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOIAkJVVNIT1JUCQkJT3BlcmF0aW9uTW9kZSwKKwlJTiAJCVVDSEFSCQkJU2V0TWFzaywKKwlJTgkJQk9PTEVBTgkJCWJEaXNhYmxlQkdQcm90ZWN0LAorCUlOCQlCT09MRUFOCQkJYk5vbkdGRXhpc3QpCit7CisJUFJPVF9DRkdfU1RSVUMJUHJvdENmZywgUHJvdENmZzQ7CisJVUlOVDMyIFByb3RlY3RbNl07CisJVVNIT1JUCQkJb2Zmc2V0OworCVVDSEFSCQkJaTsKKwlVSU5UMzIgTWFjUmVnID0gMDsKKworI2lmZGVmIFJBTElOS19BVEUKKwlpZiAoQVRFX09OKHBBZCkpCisJCXJldHVybjsKKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwlpZiAoIShwQWQtPkNvbW1vbkNmZy5iSFRQcm90ZWN0KSAmJiAoT3BlcmF0aW9uTW9kZSAhPSA4KSkKKwl7CisJCXJldHVybjsKKwl9CisKKwlpZiAocEFkLT5CQVRhYmxlLm51bUFzT3JpZ2luYXRvcikKKwl7CisJCS8vCisJCS8vIGVuYWJsZSB0aGUgUlRTL0NUUyB0byBhdm9pZCBjaGFubmVsIGNvbGxpc2lvbgorCQkvLworCQlTZXRNYXNrID0gQUxMTl9TRVRQUk9URUNUOworCQlPcGVyYXRpb25Nb2RlID0gODsKKwl9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwkvLyBDb25maWcgQVNJQyBSVFMgdGhyZXNob2xkIHJlZ2lzdGVyCisJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9SVFNfQ0ZHLCAmTWFjUmVnKTsKKwlNYWNSZWcgJj0gMHhGRjAwMDBGRjsKKyNpZiAwCisJTWFjUmVnIHw9IChwQWQtPkNvbW1vbkNmZy5SdHNUaHJlc2hvbGQgPDwgOCk7CisjZWxzZQorCS8vIElmIHRoZSB1c2VyIHdhbnQgZGlzYWJsZSBSdHNUaHJlc2hvbGQgYW5kIGVuYmFsZSBBbXNkdS9SYWxpbmstQWdncmVnYXRpb24sIHNldCB0aGUgUnRzVGhyZXNob2xkIGFzIDQwOTYKKyAgICAgICAgaWYgKCgKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCShwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQW1zZHVFbmFibGUpIHx8CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCQkocEFkLT5Db21tb25DZmcuYkFnZ3JlZ2F0aW9uQ2FwYWJsZSA9PSBUUlVFKSkKKyAgICAgICAgICAgICYmIHBBZC0+Q29tbW9uQ2ZnLlJ0c1RocmVzaG9sZCA9PSBNQVhfUlRTX1RIUkVTSE9MRCkKKyAgICAgICAgeworCQkJTWFjUmVnIHw9ICgweDEwMDAgPDwgOCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisJCQlNYWNSZWcgfD0gKHBBZC0+Q29tbW9uQ2ZnLlJ0c1RocmVzaG9sZCA8PCA4KTsKKyAgICAgICAgfQorI2VuZGlmCisKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9SVFNfQ0ZHLCBNYWNSZWcpOworCisJLy8gSW5pdGlhbCBjb21tb24gcHJvdGVjdGlvbiBzZXR0aW5ncworCVJUTVBaZXJvTWVtb3J5KFByb3RlY3QsIHNpemVvZihQcm90ZWN0KSk7CisJUHJvdENmZzQud29yZCA9IDA7CisJUHJvdENmZy53b3JkID0gMDsKKwlQcm90Q2ZnLmZpZWxkLlR4b3BBbGxvd0dGNDAgPSAxOworCVByb3RDZmcuZmllbGQuVHhvcEFsbG93R0YyMCA9IDE7CisJUHJvdENmZy5maWVsZC5UeG9wQWxsb3dNTTQwID0gMTsKKwlQcm90Q2ZnLmZpZWxkLlR4b3BBbGxvd01NMjAgPSAxOworCVByb3RDZmcuZmllbGQuVHhvcEFsbG93T2ZkbSA9IDE7CisJUHJvdENmZy5maWVsZC5UeG9wQWxsb3dDY2sgPSAxOworCVByb3RDZmcuZmllbGQuUlRTVGhFbiA9IDE7CisJUHJvdENmZy5maWVsZC5Qcm90ZWN0TmF2ID0gQVNJQ19TSE9SVE5BVjsKKworCS8vIHVwZGF0ZSBQSFkgbW9kZSBhbmQgcmF0ZQorCWlmIChwQWQtPkNvbW1vbkNmZy5DaGFubmVsID4gMTQpCisJCVByb3RDZmcuZmllbGQuUHJvdGVjdFJhdGUgPSAweDQwMDA7CisJUHJvdENmZy5maWVsZC5Qcm90ZWN0UmF0ZSB8PSBwQWQtPkNvbW1vbkNmZy5SdHNSYXRlOworCisJLy8gSGFuZGxlIGxlZ2FjeShCL0cpIHByb3RlY3Rpb24KKwlpZiAoYkRpc2FibGVCR1Byb3RlY3QpCisJeworCQkvL1Byb3RDZmcuZmllbGQuUHJvdGVjdFJhdGUgPSBwQWQtPkNvbW1vbkNmZy5SdHNSYXRlOworCQlQcm90Q2ZnLmZpZWxkLlByb3RlY3RDdHJsID0gMDsKKwkJUHJvdGVjdFswXSA9IFByb3RDZmcud29yZDsKKwkJUHJvdGVjdFsxXSA9IFByb3RDZmcud29yZDsKKwl9CisJZWxzZQorCXsKKwkJLy9Qcm90Q2ZnLmZpZWxkLlByb3RlY3RSYXRlID0gcEFkLT5Db21tb25DZmcuUnRzUmF0ZTsKKwkJUHJvdENmZy5maWVsZC5Qcm90ZWN0Q3RybCA9IDA7CQkJLy8gQ0NLIGRvIG5vdCBuZWVkIHRvIGJlIHByb3RlY3RlZAorCQlQcm90ZWN0WzBdID0gUHJvdENmZy53b3JkOworCQlQcm90Q2ZnLmZpZWxkLlByb3RlY3RDdHJsID0gQVNJQ19DVFM7CS8vIE9GRE0gbmVlZHMgdXNpbmcgQ0NLIHRvIHByb3RlY3QKKwkJUHJvdGVjdFsxXSA9IFByb3RDZmcud29yZDsKKwl9CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkvLyBEZWNpZGUgSFQgZnJhbWUgcHJvdGVjdGlvbi4KKwlpZiAoKFNldE1hc2sgJiBBTExOX1NFVFBST1RFQ1QpICE9IDApCisJeworCQlzd2l0Y2goT3BlcmF0aW9uTW9kZSkKKwkJeworCQkJY2FzZSAweDA6CisJCQkJLy8gTk8gUFJPVEVDVAorCQkJCS8vIDEuQWxsIFNUQXMgaW4gdGhlIEJTUyBhcmUgMjAvNDAgTUh6IEhUCisJCQkJLy8gMi4gaW4gYWkgMjAvNDBNSHogQlNTCisJCQkJLy8gMy4gYWxsIFNUQXMgYXJlIDIwTUh6IGluIGEgMjBNSHogQlNTCisJCQkJLy8gUHVyZSBIVC4gbm8gcHJvdGVjdGlvbi4KKworCQkJCS8vIE1NMjBfUFJPVF9DRkcKKwkJCQkvLwlSZXNlcnZlZCAoMzE6MjcpCisJCQkJLy8gCVBST1RfVFhPUCgyNToyMCkgLS0gMDEwMTExCisJCQkJLy8JUFJPVF9OQVYoMTk6MTgpICAtLSAwMSAoU2hvcnQgTkFWIHByb3RlY3Rpb24pCisJCQkJLy8gIFBST1RfQ1RSTCgxNzoxNikgLS0gMDAgKE5vbmUpCisJCQkJLy8gCVBST1RfUkFURSgxNTowKSAgLS0gMHg0MDA0IChPRkRNIDI0TSkKKwkJCQlQcm90ZWN0WzJdID0gMHgwMTc0NDAwNDsKKworCQkJCS8vIE1NNDBfUFJPVF9DRkcKKwkJCQkvLwlSZXNlcnZlZCAoMzE6MjcpCisJCQkJLy8gCVBST1RfVFhPUCgyNToyMCkgLS0gMTExMTExCisJCQkJLy8JUFJPVF9OQVYoMTk6MTgpICAtLSAwMSAoU2hvcnQgTkFWIHByb3RlY3Rpb24pCisJCQkJLy8gIFBST1RfQ1RSTCgxNzoxNikgLS0gMDAgKE5vbmUpCisJCQkJLy8gCVBST1RfUkFURSgxNTowKSAgLS0gMHg0MDg0IChkdXBsaWNhdGUgT0ZETSAyNE0pCisJCQkJUHJvdGVjdFszXSA9IDB4MDNmNDQwODQ7CisKKwkJCQkvLyBDRjIwX1BST1RfQ0ZHCisJCQkJLy8JUmVzZXJ2ZWQgKDMxOjI3KQorCQkJCS8vIAlQUk9UX1RYT1AoMjU6MjApIC0tIDAxMDExMQorCQkJCS8vCVBST1RfTkFWKDE5OjE4KSAgLS0gMDEgKFNob3J0IE5BViBwcm90ZWN0aW9uKQorCQkJCS8vICBQUk9UX0NUUkwoMTc6MTYpIC0tIDAwIChOb25lKQorCQkJCS8vIAlQUk9UX1JBVEUoMTU6MCkgIC0tIDB4NDAwNCAoT0ZETSAyNE0pCisJCQkJUHJvdGVjdFs0XSA9IDB4MDE3NDQwMDQ7CisKKwkJCQkvLyBDRjQwX1BST1RfQ0ZHCisJCQkJLy8JUmVzZXJ2ZWQgKDMxOjI3KQorCQkJCS8vIAlQUk9UX1RYT1AoMjU6MjApIC0tIDExMTExMQorCQkJCS8vCVBST1RfTkFWKDE5OjE4KSAgLS0gMDEgKFNob3J0IE5BViBwcm90ZWN0aW9uKQorCQkJCS8vICBQUk9UX0NUUkwoMTc6MTYpIC0tIDAwIChOb25lKQorCQkJCS8vIAlQUk9UX1JBVEUoMTU6MCkgIC0tIDB4NDA4NCAoZHVwbGljYXRlIE9GRE0gMjRNKQorCQkJCVByb3RlY3RbNV0gPSAweDAzZjQ0MDg0OworCisJCQkJaWYgKGJOb25HRkV4aXN0KQorCQkJCXsKKwkJCQkJLy8gUFJPVF9OQVYoMTk6MTgpICAtLSAwMSAoU2hvcnQgTkFWIHByb3RlY3RpaW9uKQorCQkJCQkvLyBQUk9UX0NUUkwoMTc6MTYpIC0tIDAxIChSVFMvQ1RTKQorCQkJCQlQcm90ZWN0WzRdID0gMHgwMTc1NDAwNDsKKwkJCQkJUHJvdGVjdFs1XSA9IDB4MDNmNTQwODQ7CisJCQkJfQorCQkJCXBBZC0+Q29tbW9uQ2ZnLklPVGVzdFBhcm0uYlJUU0xvbmdQcm90T24gPSBGQUxTRTsKKwkJCQlicmVhazsKKworIAkJCWNhc2UgMToKKwkJCQkvLyBUaGlzIGlzICJIVCBub24tbWVtYmVyIHByb3RlY3Rpb24gbW9kZS4iCisJCQkJLy8gSWYgdGhlcmUgbWF5IGJlIG5vbi1IVCBTVEFzIG15IEJTUworCQkJCVByb3RDZmcud29yZCA9IDB4MDE3NDQwMDQ7CS8vIFBST1RfQ1RSTCgxNzoxNikgOiAwIChOb25lKQorCQkJCVByb3RDZmc0LndvcmQgPSAweDAzZjQ0MDg0OyAvLyBkdXBsaWNhZXQgbGVnYWN5IDI0TS4gQlcgc2V0IDEuCisJCQkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQkdfUFJPVEVDVElPTl9JTlVTRUQpKQorCQkJCXsKKwkJCQkJUHJvdENmZy53b3JkID0gMHgwMTc0MDAwMzsJLy9FUlAgdXNlIFByb3RlY3Rpb24gYml0IGlzIHNldCwgdXNlIHByb3RlY3Rpb24gcmF0ZSBhdCBDbGF1c2UgMTguLgorCQkJCQlQcm90Q2ZnNC53b3JkID0gMHgwM2Y0MDAwMzsgLy8gRG9uJ3QgZHVwbGljYXRlIFJUUy9DVFMgaW4gQ0NLIG1vZGUuIDB4MDNmNDAwODM7CisJCQkJfQorCQkJCS8vQXNzaWduIFByb3RlY3Rpb24gbWV0aG9kIGZvciAyMCY0MCBNSHogcGFja2V0cworCQkJCVByb3RDZmcuZmllbGQuUHJvdGVjdEN0cmwgPSBBU0lDX1JUUzsKKwkJCQlQcm90Q2ZnLmZpZWxkLlByb3RlY3ROYXYgPSBBU0lDX1NIT1JUTkFWOworCQkJCVByb3RDZmc0LmZpZWxkLlByb3RlY3RDdHJsID0gQVNJQ19SVFM7CisJCQkJUHJvdENmZzQuZmllbGQuUHJvdGVjdE5hdiA9IEFTSUNfU0hPUlROQVY7CisJCQkJUHJvdGVjdFsyXSA9IFByb3RDZmcud29yZDsKKwkJCQlQcm90ZWN0WzNdID0gUHJvdENmZzQud29yZDsKKwkJCQlQcm90ZWN0WzRdID0gUHJvdENmZy53b3JkOworCQkJCVByb3RlY3RbNV0gPSBQcm90Q2ZnNC53b3JkOworCQkJCXBBZC0+Q29tbW9uQ2ZnLklPVGVzdFBhcm0uYlJUU0xvbmdQcm90T24gPSBUUlVFOworCQkJCWJyZWFrOworCisJCQljYXNlIDI6CisJCQkJLy8gSWYgb25seSBIVCBTVEFzIGFyZSBpbiBCU1MuIGF0IGxlYXN0IG9uZSBpcyAyME1Iei4gT25seSBwcm90ZWN0IDQwTUh6IHBhY2tldHMKKwkJCQlQcm90Q2ZnLndvcmQgPSAweDAxNzQ0MDA0OyAgLy8gUFJPVF9DVFJMKDE3OjE2KSA6IDAgKE5vbmUpCisJCQkJUHJvdENmZzQud29yZCA9IDB4MDNmNDQwODQ7IC8vIGR1cGxpY2FldCBsZWdhY3kgMjRNLiBCVyBzZXQgMS4KKworCQkJCS8vQXNzaWduIFByb3RlY3Rpb24gbWV0aG9kIGZvciA0ME1IeiBwYWNrZXRzCisJCQkJUHJvdENmZzQuZmllbGQuUHJvdGVjdEN0cmwgPSBBU0lDX1JUUzsKKwkJCQlQcm90Q2ZnNC5maWVsZC5Qcm90ZWN0TmF2ID0gQVNJQ19TSE9SVE5BVjsKKwkJCQlQcm90ZWN0WzJdID0gUHJvdENmZy53b3JkOworCQkJCVByb3RlY3RbM10gPSBQcm90Q2ZnNC53b3JkOworCQkJCWlmIChiTm9uR0ZFeGlzdCkKKwkJCQl7CisJCQkJCVByb3RDZmcuZmllbGQuUHJvdGVjdEN0cmwgPSBBU0lDX1JUUzsKKwkJCQkJUHJvdENmZy5maWVsZC5Qcm90ZWN0TmF2ID0gQVNJQ19TSE9SVE5BVjsKKwkJCQl9CisJCQkJUHJvdGVjdFs0XSA9IFByb3RDZmcud29yZDsKKwkJCQlQcm90ZWN0WzVdID0gUHJvdENmZzQud29yZDsKKworCQkJCXBBZC0+Q29tbW9uQ2ZnLklPVGVzdFBhcm0uYlJUU0xvbmdQcm90T24gPSBGQUxTRTsKKwkJCQlicmVhazsKKworCQkJY2FzZSAzOgorCQkJCS8vIEhUIG1peGVkIG1vZGUuCSBQUk9URUNUIEFMTCEKKwkJCQkvLyBBc3NpZ24gUmF0ZQorCQkJCVByb3RDZmcud29yZCA9IDB4MDE3NDQwMDQ7CS8vZHVwbGljYWV0IGxlZ2FjeSAyNE0uIEJXIHNldCAxLgorCQkJCVByb3RDZmc0LndvcmQgPSAweDAzZjQ0MDg0OworCQkJCS8vIGJvdGggMjBNSHogYW5kIDQwTUh6IGFyZSBwcm90ZWN0ZWQuIFdoZXRoZXIgdXNlIFJUUyBvciBDVFMtdG8tc2VsZiBkZXBlbmRzIG9uIHRoZQorCQkJCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0JHX1BST1RFQ1RJT05fSU5VU0VEKSkKKwkJCQl7CisJCQkJCVByb3RDZmcud29yZCA9IDB4MDE3NDAwMDM7CS8vRVJQIHVzZSBQcm90ZWN0aW9uIGJpdCBpcyBzZXQsIHVzZSBwcm90ZWN0aW9uIHJhdGUgYXQgQ2xhdXNlIDE4Li4KKwkJCQkJUHJvdENmZzQud29yZCA9IDB4MDNmNDAwMDM7IC8vIERvbid0IGR1cGxpY2F0ZSBSVFMvQ1RTIGluIENDSyBtb2RlLiAweDAzZjQwMDgzCisJCQkJfQorCQkJCS8vQXNzaWduIFByb3RlY3Rpb24gbWV0aG9kIGZvciAyMCY0MCBNSHogcGFja2V0cworCQkJCVByb3RDZmcuZmllbGQuUHJvdGVjdEN0cmwgPSBBU0lDX1JUUzsKKwkJCQlQcm90Q2ZnLmZpZWxkLlByb3RlY3ROYXYgPSBBU0lDX1NIT1JUTkFWOworCQkJCVByb3RDZmc0LmZpZWxkLlByb3RlY3RDdHJsID0gQVNJQ19SVFM7CisJCQkJUHJvdENmZzQuZmllbGQuUHJvdGVjdE5hdiA9IEFTSUNfU0hPUlROQVY7CisJCQkJUHJvdGVjdFsyXSA9IFByb3RDZmcud29yZDsKKwkJCQlQcm90ZWN0WzNdID0gUHJvdENmZzQud29yZDsKKwkJCQlQcm90ZWN0WzRdID0gUHJvdENmZy53b3JkOworCQkJCVByb3RlY3RbNV0gPSBQcm90Q2ZnNC53b3JkOworCQkJCXBBZC0+Q29tbW9uQ2ZnLklPVGVzdFBhcm0uYlJUU0xvbmdQcm90T24gPSBUUlVFOworCQkJCWJyZWFrOworCisJCQljYXNlIDg6CisJCQkJLy8gU3BlY2lhbCBvbiBmb3IgQXRoZXJvcyBwcm9ibGVtIG4gY2hpcC4KKwkJCQlQcm90ZWN0WzJdID0gMHgwMTc1NDAwNDsKKwkJCQlQcm90ZWN0WzNdID0gMHgwM2Y1NDA4NDsKKwkJCQlQcm90ZWN0WzRdID0gMHgwMTc1NDAwNDsKKwkJCQlQcm90ZWN0WzVdID0gMHgwM2Y1NDA4NDsKKwkJCQlwQWQtPkNvbW1vbkNmZy5JT1Rlc3RQYXJtLmJSVFNMb25nUHJvdE9uID0gVFJVRTsKKwkJCQlicmVhazsKKwkJfQorCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCW9mZnNldCA9IENDS19QUk9UX0NGRzsKKwlmb3IgKGkgPSAwO2kgPCA2O2krKykKKwl7CisJCWlmICgoU2V0TWFzayAmICgxPDwgaSkpKQorCQl7CisJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBvZmZzZXQgKyBpKjQsIFByb3RlY3RbaV0pOworCQl9CisJfQorfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBBc2ljU3dpdGNoQ2hhbm5lbCgKKwkJCQkJICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTglVQ0hBUgkJCUNoYW5uZWwsCisJSU4JQk9PTEVBTgkJCWJTY2FuKQoreworCVVMT05HCQkJUjIgPSAwLCBSMyA9IERFRkFVTFRfUkZfVFhfUE9XRVIsIFI0ID0gMDsKKwlDSEFSICAgIFR4UHdlciA9IDAsIFR4UHdlcjIgPSBERUZBVUxUX1JGX1RYX1BPV0VSOyAvL0JicDk0ID0gQkJQUjk0X0RFRkFVTFQsIFR4UHdlcjIgPSBERUZBVUxUX1JGX1RYX1BPV0VSOworCVVDSEFSCWluZGV4OworCVVJTlQzMiAJVmFsdWUgPSAwOyAvL0JicFJlZywgVmFsdWU7CisJUlRNUF9SRl9SRUdTICpSRlJlZ1RhYmxlOworCisJLy8gU2VhcmNoIFR4IHBvd2VyIHZhbHVlCisJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgcEFkLT5DaGFubmVsTGlzdE51bTsgaW5kZXgrKykKKwl7CisJCWlmIChDaGFubmVsID09IHBBZC0+Q2hhbm5lbExpc3RbaW5kZXhdLkNoYW5uZWwpCisJCXsKKwkJCVR4UHdlciA9IHBBZC0+Q2hhbm5lbExpc3RbaW5kZXhdLlBvd2VyOworCQkJVHhQd2VyMiA9IHBBZC0+Q2hhbm5lbExpc3RbaW5kZXhdLlBvd2VyMjsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKGluZGV4ID09IE1BWF9OVU1fT0ZfQ0hBTk5FTFMpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJBc2ljU3dpdGNoQ2hhbm5lbDogQ2FudCBmaW5kIHRoZSBDaGFubmVsIyVkIFxuIiwgQ2hhbm5lbCkpOworCX0KKworI2lmZGVmIFJUMjg3MAorCS8vIFRoZSBSRiBwcm9ncmFtbWluZyBzZXF1ZW5jZSBpcyBkaWZmZXJlbmNlIGJldHdlZW4gM3h4eCBhbmQgMnh4eAorCWlmIChJU19SVDMwNzAocEFkKSAmJiAoKHBBZC0+UmZJY1R5cGUgPT0gUkZJQ18zMDIwKSB8fCAocEFkLT5SZkljVHlwZSA9PSBSRklDXzIwMjApKSkKKwl7CisJCS8qIG1vZGlmeSBieSBXWSBmb3IgUmVhZCBSRiBSZWcuIGVycm9yICovCisJCVVDSEFSIFJGVmFsdWU7CisKKwkJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgTlVNX09GXzMwMjBfQ0hOTDsgaW5kZXgrKykKKwkJeworCQkJaWYgKENoYW5uZWwgPT0gRnJlcUl0ZW1zMzAyMFtpbmRleF0uQ2hhbm5lbCkKKwkJCXsKKwkJCQkvLyBQcm9ncmFtbWluZyBjaGFubmVsIHBhcmFtZXRlcnMKKwkJCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMDIsIEZyZXFJdGVtczMwMjBbaW5kZXhdLk4pOworCQkJCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IwMywgRnJlcUl0ZW1zMzAyMFtpbmRleF0uSyk7CisKKwkJCQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IwNiwgKFBVQ0hBUikmUkZWYWx1ZSk7CisJCQkJUkZWYWx1ZSA9IChSRlZhbHVlICYgMHhGQykgfCBGcmVxSXRlbXMzMDIwW2luZGV4XS5SOworCQkJCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IwNiwgKFVDSEFSKVJGVmFsdWUpOworCisJCQkJLy8gU2V0IFR4IFBvd2VyCisJCQkJUlQzMHh4UmVhZFJGUmVnaXN0ZXIocEFkLCBSRl9SMTIsIChQVUNIQVIpJlJGVmFsdWUpOworCQkJCVJGVmFsdWUgPSAoUkZWYWx1ZSAmIDB4RTApIHwgVHhQd2VyOworCQkJCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IxMiwgKFVDSEFSKVJGVmFsdWUpOworCisJCQkJLy8gU2V0IFJGIG9mZnNldAorCQkJCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZCwgUkZfUjIzLCAoUFVDSEFSKSZSRlZhbHVlKTsKKwkJCQlSRlZhbHVlID0gKFJGVmFsdWUgJiAweDgwKSB8IHBBZC0+UmZGcmVxT2Zmc2V0OworCQkJCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IyMywgKFVDSEFSKVJGVmFsdWUpOworCisJCQkJLy8gU2V0IEJXCisJCQkJaWYgKCFiU2NhbiAmJiAocEFkLT5Db21tb25DZmcuQkJQQ3VycmVudEJXID09IEJXXzQwKSkKKwkJCQl7CisJCQkJCVJGVmFsdWUgPSBwQWQtPk1sbWUuQ2FsaUJXNDBSZlIyNDsKKwkJCQkJLy9ESVNBQkxFXzExTl9DSEVDSyhwQWQpOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlSRlZhbHVlID0gcEFkLT5NbG1lLkNhbGlCVzIwUmZSMjQ7CisJCQkJfQorCQkJCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IyNCwgKFVDSEFSKVJGVmFsdWUpOworCisJCQkJLy8gRW5hYmxlIFJGIHR1bmluZworCQkJCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZCwgUkZfUjA3LCAoUFVDSEFSKSZSRlZhbHVlKTsKKwkJCQlSRlZhbHVlID0gUkZWYWx1ZSB8IDB4MTsKKwkJCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMDcsIChVQ0hBUilSRlZhbHVlKTsKKworCQkJCS8vIGxhdGNoIGNoYW5uZWwgZm9yIGZ1dHVyZSB1c2FnZS4KKwkJCQlwQWQtPkxhdGNoUmZSZWdzLkNoYW5uZWwgPSBDaGFubmVsOworCisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTd2l0Y2hDaGFubmVsIyVkKFJGPSVkLCBQd3IwPSVkLCBQd3IxPSVkLCAlZFQpLCBOPTB4JTAyWCwgSz0weCUwMlgsIFI9MHglMDJYXG4iLAorCQkJQ2hhbm5lbCwKKwkJCXBBZC0+UmZJY1R5cGUsCisJCQlUeFB3ZXIsCisJCQlUeFB3ZXIyLAorCQkJcEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCwKKwkJCUZyZXFJdGVtczMwMjBbaW5kZXhdLk4sCisJCQlGcmVxSXRlbXMzMDIwW2luZGV4XS5LLAorCQkJRnJlcUl0ZW1zMzAyMFtpbmRleF0uUikpOworCX0KKwllbHNlCisjZW5kaWYgLy8gUlQyODcwIC8vCisJeworCQlSRlJlZ1RhYmxlID0gUkYyODUwUmVnVGFibGU7CisKKwkJc3dpdGNoIChwQWQtPlJmSWNUeXBlKQorCQl7CisJCQljYXNlIFJGSUNfMjgyMDoKKwkJCWNhc2UgUkZJQ18yODUwOgorCQkJY2FzZSBSRklDXzI3MjA6CisJCQljYXNlIFJGSUNfMjc1MDoKKworCQkJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgTlVNX09GXzI4NTBfQ0hOTDsgaW5kZXgrKykKKwkJCXsKKwkJCQlpZiAoQ2hhbm5lbCA9PSBSRlJlZ1RhYmxlW2luZGV4XS5DaGFubmVsKQorCQkJCXsKKwkJCQkJUjIgPSBSRlJlZ1RhYmxlW2luZGV4XS5SMjsKKwkJCQkJaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGggPT0gMSkKKwkJCQkJeworCQkJCQkJUjIgfD0gMHg0MDAwOwkvLyBJZiBUWHBhdGggaXMgMSwgYml0IDE0ID0gMTsKKwkJCQkJfQorCisJCQkJCWlmIChwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDIpCisJCQkJCXsKKwkJCQkJCVIyIHw9IDB4NDA7CS8vIHdyaXRlIDEgdG8gb2ZmIFJ4cGF0aC4KKwkJCQkJfQorCQkJCQllbHNlIGlmIChwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDEpCisJCQkJCXsKKwkJCQkJCVIyIHw9IDB4MjAwNDA7CS8vIHdyaXRlIDEgdG8gb2ZmIFJ4UGF0aAorCQkJCQl9CisKKwkJCQkJaWYgKENoYW5uZWwgPiAxNCkKKwkJCQkJeworCQkJCQkJLy8gaW5pdGlhbGl6ZSBSMywgUjQKKwkJCQkJCVIzID0gKFJGUmVnVGFibGVbaW5kZXhdLlIzICYgMHhmZmZmYzFmZik7CisJCQkJCQlSNCA9IChSRlJlZ1RhYmxlW2luZGV4XS5SNCAmICh+MHgwMDFmODdjMCkpIHwgKHBBZC0+UmZGcmVxT2Zmc2V0IDw8IDE1KTsKKworCQkJCQkJLy8gNUcgYmFuZCBwb3dlciByYW5nZTogMHhGOX4wWDBGLCBUWDAgUmVnMyBiaXQ5L1RYMSBSZWc0IGJpdDY9IjAiIG1lYW5zIHRoZSBUWCBwb3dlciByZWR1Y2UgN2RCCisJCQkJCQkvLyBSMworCQkJCQkJaWYgKChUeFB3ZXIgPj0gLTcpICYmIChUeFB3ZXIgPCAwKSkKKwkJCQkJCXsKKwkJCQkJCQlUeFB3ZXIgPSAoNytUeFB3ZXIpOworCQkJCQkJCVR4UHdlciA9IChUeFB3ZXIgPiAweEYpID8gKDB4RikgOiAoVHhQd2VyKTsKKwkJCQkJCQlSMyB8PSAoVHhQd2VyIDw8IDEwKTsKKwkJCQkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJBc2ljU3dpdGNoQ2hhbm5lbDogVHhQd2VyPSVkIFxuIiwgVHhQd2VyKSk7CisJCQkJCQl9CisJCQkJCQllbHNlCisJCQkJCQl7CisJCQkJCQkJVHhQd2VyID0gKFR4UHdlciA+IDB4RikgPyAoMHhGKSA6IChUeFB3ZXIpOworCQkJCQkJCVIzIHw9IChUeFB3ZXIgPDwgMTApIHwgKDEgPDwgOSk7CisJCQkJCQl9CisKKwkJCQkJCS8vIFI0CisJCQkJCQlpZiAoKFR4UHdlcjIgPj0gLTcpICYmIChUeFB3ZXIyIDwgMCkpCisJCQkJCQl7CisJCQkJCQkJVHhQd2VyMiA9ICg3K1R4UHdlcjIpOworCQkJCQkJCVR4UHdlcjIgPSAoVHhQd2VyMiA+IDB4RikgPyAoMHhGKSA6IChUeFB3ZXIyKTsKKwkJCQkJCQlSNCB8PSAoVHhQd2VyMiA8PCA3KTsKKwkJCQkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJBc2ljU3dpdGNoQ2hhbm5lbDogVHhQd2VyMj0lZCBcbiIsIFR4UHdlcjIpKTsKKwkJCQkJCX0KKwkJCQkJCWVsc2UKKwkJCQkJCXsKKwkJCQkJCQlUeFB3ZXIyID0gKFR4UHdlcjIgPiAweEYpID8gKDB4RikgOiAoVHhQd2VyMik7CisJCQkJCQkJUjQgfD0gKFR4UHdlcjIgPDwgNykgfCAoMSA8PCA2KTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCVIzID0gKFJGUmVnVGFibGVbaW5kZXhdLlIzICYgMHhmZmZmYzFmZikgfCAoVHhQd2VyIDw8IDkpOyAvLyBzZXQgVFggcG93ZXIwCisJCQkJCVI0ID0gKFJGUmVnVGFibGVbaW5kZXhdLlI0ICYgKH4weDAwMWY4N2MwKSkgfCAocEFkLT5SZkZyZXFPZmZzZXQgPDwgMTUpIHwgKFR4UHdlcjIgPDw2KTsvLyBTZXQgZnJlcSBPZmZzZXQgJiBUeFB3cjEKKwkJCQkJfQorCisJCQkJCS8vIEJhc2VkIG9uIEJCUCBjdXJyZW50IG1vZGUgYmVmb3JlIGNoYW5naW5nIFJGIGNoYW5uZWwuCisJCQkJCWlmICghYlNjYW4gJiYgKHBBZC0+Q29tbW9uQ2ZnLkJCUEN1cnJlbnRCVyA9PSBCV180MCkpCisJCQkJCXsKKwkJCQkJCVI0IHw9MHgyMDAwMDA7CisJCQkJCX0KKworCQkJCQkvLyBVcGRhdGUgdmFyaWFibGVzCisJCQkJCXBBZC0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbCA9IENoYW5uZWw7CisJCQkJCXBBZC0+TGF0Y2hSZlJlZ3MuUjEgPSBSRlJlZ1RhYmxlW2luZGV4XS5SMTsKKwkJCQkJcEFkLT5MYXRjaFJmUmVncy5SMiA9IFIyOworCQkJCQlwQWQtPkxhdGNoUmZSZWdzLlIzID0gUjM7CisJCQkJCXBBZC0+TGF0Y2hSZlJlZ3MuUjQgPSBSNDsKKworCQkJCQkvLyBTZXQgUkYgdmFsdWUgMSdzIHNldCBSM1tiaXQyXSA9IFswXQorCQkJCQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCBwQWQtPkxhdGNoUmZSZWdzLlIxKTsKKwkJCQkJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgcEFkLT5MYXRjaFJmUmVncy5SMik7CisJCQkJCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIChwQWQtPkxhdGNoUmZSZWdzLlIzICYgKH4weDA0KSkpOworCQkJCQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCBwQWQtPkxhdGNoUmZSZWdzLlI0KTsKKworCQkJCQlSVE1QdXNlY0RlbGF5KDIwMCk7CisKKwkJCQkJLy8gU2V0IFJGIHZhbHVlIDIncyBzZXQgUjNbYml0Ml0gPSBbMV0KKwkJCQkJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgcEFkLT5MYXRjaFJmUmVncy5SMSk7CisJCQkJCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIHBBZC0+TGF0Y2hSZlJlZ3MuUjIpOworCQkJCQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCAocEFkLT5MYXRjaFJmUmVncy5SMyB8IDB4MDQpKTsKKwkJCQkJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgcEFkLT5MYXRjaFJmUmVncy5SNCk7CisKKwkJCQkJUlRNUHVzZWNEZWxheSgyMDApOworCisJCQkJCS8vIFNldCBSRiB2YWx1ZSAzJ3Mgc2V0IFIzW2JpdDJdID0gWzBdCisJCQkJCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIHBBZC0+TGF0Y2hSZlJlZ3MuUjEpOworCQkJCQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCBwQWQtPkxhdGNoUmZSZWdzLlIyKTsKKwkJCQkJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgKHBBZC0+TGF0Y2hSZlJlZ3MuUjMgJiAofjB4MDQpKSk7CisJCQkJCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIHBBZC0+TGF0Y2hSZlJlZ3MuUjQpOworCisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvLyBDaGFuZ2UgQkJQIHNldHRpbmcgZHVyaW5nIHNpd3RjaCBmcm9tIGEtPmcsIGctPmEKKwlpZiAoQ2hhbm5lbCA8PSAxNCkKKwl7CisJICAgIFVMT05HCVR4UGluQ2ZnID0gMHgwMDA1MEYwQTsvL0dhcnkgMjAwNy8wOC8wOSAweDA1MEEwQQorCisJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjYyLCAoMHgzNyAtIEdFVF9MTkFfR0FJTihwQWQpKSk7CisJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjYzLCAoMHgzNyAtIEdFVF9MTkFfR0FJTihwQWQpKSk7CisJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY0LCAoMHgzNyAtIEdFVF9MTkFfR0FJTihwQWQpKSk7CisJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjg2LCAwKTsvLygweDQ0IC0gR0VUX0xOQV9HQUlOKHBBZCkpKTsJLy8gQWNjb3JkaW5nIHRoZSBSb3J5J3Mgc3VnZ2VzdGlvbiB0byBzb2x2ZSB0aGUgbWlkZGxlIHJhbmdlIGlzc3VlLgorCQkvL1JUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjgyLCAweDYyKTsKKworCQkvLyBSeCBIaWdoIHBvd2VyIFZHQSBvZmZzZXQgZm9yIExOQSBzZWxlY3QKKwkgICAgaWYgKHBBZC0+TmljQ29uZmlnMi5maWVsZC5FeHRlcm5hbExOQUZvckcpCisJICAgIHsKKwkgICAgICAgIFJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjgyLCAweDYyKTsKKwkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjc1LCAweDQ2KTsKKwkgICAgfQorCSAgICBlbHNlCisJICAgIHsKKwkgICAgICAgIFJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjgyLCAweDg0KTsKKwkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjc1LCAweDUwKTsKKwkgICAgfQorCisJCS8vIDVHIGJhbmQgc2VsZWN0aW9uIFBJTiwgYml0MSBhbmQgYml0MiBhcmUgY29tcGxlbWVudAorCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0JBTkRfQ0ZHLCAmVmFsdWUpOworCQlWYWx1ZSAmPSAofjB4Nik7CisJCVZhbHVlIHw9ICgweDA0KTsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfQkFORF9DRkcsIFZhbHVlKTsKKworICAgICAgICAvLyBUdXJuIG9mZiB1bnVzZWQgUEEgb3IgTE5BIHdoZW4gb25seSAxVCBvciAxUgorCQlpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCA9PSAxKQorCQl7CisJCQlUeFBpbkNmZyAmPSAweEZGRkZGRkYzOworCQl9CisJCWlmIChwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDEpCisJCXsKKwkJCVR4UGluQ2ZnICY9IDB4RkZGRkYzRkY7CisJCX0KKworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9QSU5fQ0ZHLCBUeFBpbkNmZyk7CisJfQorCWVsc2UKKwl7CisJICAgIFVMT05HCVR4UGluQ2ZnID0gMHgwMDA1MEYwNTsvL0dhcnkgMjAwNy84LzkgMHgwNTA1MDUKKworCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2MiwgKDB4MzcgLSBHRVRfTE5BX0dBSU4ocEFkKSkpOworCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2MywgKDB4MzcgLSBHRVRfTE5BX0dBSU4ocEFkKSkpOworCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2NCwgKDB4MzcgLSBHRVRfTE5BX0dBSU4ocEFkKSkpOworCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I4NiwgMCk7Ly8oMHg0NCAtIEdFVF9MTkFfR0FJTihwQWQpKSk7ICAgLy8gQWNjb3JkaW5nIHRoZSBSb3J5J3Mgc3VnZ2VzdGlvbiB0byBzb2x2ZSB0aGUgbWlkZGxlIHJhbmdlIGlzc3VlLgorCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I4MiwgMHhGMik7CisKKwkJLy8gUnggSGlnaCBwb3dlciBWR0Egb2Zmc2V0IGZvciBMTkEgc2VsZWN0CisJCWlmIChwQWQtPk5pY0NvbmZpZzIuZmllbGQuRXh0ZXJuYWxMTkFGb3JBKQorCQl7CisJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I3NSwgMHg0Nik7CisJCX0KKwkJZWxzZQorCQl7CisJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I3NSwgMHg1MCk7CisJCX0KKworCQkvLyA1RyBiYW5kIHNlbGVjdGlvbiBQSU4sIGJpdDEgYW5kIGJpdDIgYXJlIGNvbXBsZW1lbnQKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9CQU5EX0NGRywgJlZhbHVlKTsKKwkJVmFsdWUgJj0gKH4weDYpOworCQlWYWx1ZSB8PSAoMHgwMik7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX0JBTkRfQ0ZHLCBWYWx1ZSk7CisKKyAgICAgICAgLy8gVHVybiBvZmYgdW51c2VkIFBBIG9yIExOQSB3aGVuIG9ubHkgMVQgb3IgMVIKKwkJaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGggPT0gMSkKKwkJeworCQkJVHhQaW5DZmcgJj0gMHhGRkZGRkZGMzsKKwl9CisJCWlmIChwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDEpCisJCXsKKwkJCVR4UGluQ2ZnICY9IDB4RkZGRkYzRkY7CisJfQorCisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX1BJTl9DRkcsIFR4UGluQ2ZnKTsKKwl9CisKKyAgICAvLyBSNjYgc2hvdWxkIGJlIHNldCBhY2NvcmRpbmcgdG8gQ2hhbm5lbCBhbmQgdXNlIDIwTUh6IHdoZW4gc2Nhbm5pbmcKKwkvL1JUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY2LCAoMHgyRSArIEdFVF9MTkFfR0FJTihwQWQpKSk7CisJaWYgKGJTY2FuKQorCQlSVE1QU2V0QUdDSW5pdFZhbHVlKHBBZCwgQldfMjApOworCWVsc2UKKwkJUlRNUFNldEFHQ0luaXRWYWx1ZShwQWQsIHBBZC0+Q29tbW9uQ2ZnLkJCUEN1cnJlbnRCVyk7CisKKwkvLworCS8vIE9uIDExQSwgV2Ugc2hvdWxkIGRlbGF5IGFuZCB3YWl0IFJGL0JCUCB0byBiZSBzdGFibGUKKwkvLyBhbmQgdGhlIGFwcHJvcHJpYXRlIHRpbWUgc2hvdWxkIGJlIDEwMDAgbWljcm8gc2Vjb25kcworCS8vIDIwMDUvMDYvMDUgLSBPbiAxMUcsIFdlIGFsc28gbmVlZCB0aGlzIGRlbGF5IHRpbWUuIE90aGVyd2lzZSBpdCdzIGRpZmZpY3VsdCB0byBwYXNzIHRoZSBXSFFMLgorCS8vCisJUlRNUHVzZWNEZWxheSgxMDAwKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlN3aXRjaENoYW5uZWwjJWQoUkY9JWQsIFB3cjA9JWx1LCBQd3IxPSVsdSwgJWRUKSB0byAsIFIxPTB4JTA4bHgsIFIyPTB4JTA4bHgsIFIzPTB4JTA4bHgsIFI0PTB4JTA4bHhcbiIsCisJCQkJCQkJICBDaGFubmVsLAorCQkJCQkJCSAgcEFkLT5SZkljVHlwZSwKKwkJCQkJCQkgIChSMyAmIDB4MDAwMDNlMDApID4+IDksCisJCQkJCQkJICAoUjQgJiAweDAwMDAwN2MwKSA+PiA2LAorCQkJCQkJCSAgcEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCwKKwkJCQkJCQkgIHBBZC0+TGF0Y2hSZlJlZ3MuUjEsCisJCQkJCQkJICBwQWQtPkxhdGNoUmZSZWdzLlIyLAorCQkJCQkJCSAgcEFkLT5MYXRjaFJmUmVncy5SMywKKwkJCQkJCQkgIHBBZC0+TGF0Y2hSZlJlZ3MuUjQpKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlUaGlzIGZ1bmN0aW9uIGlzIHJlcXVpcmVkIGZvciAyNDIxIG9ubHksIGFuZCBzaG91bGQgbm90IGJlIHVzZWQgZHVyaW5nCisJCXNpdGUgc3VydmV5LiBJdCdzIG9ubHkgcmVxdWlyZWQgYWZ0ZXIgTklDIGRlY2lkZWQgdG8gc3RheSBhdCBhIGNoYW5uZWwKKwkJZm9yIGEgbG9uZ2VyIHBlcmlvZC4KKwkJV2hlbiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCwgaXQncyBhbHdheXMgYWZ0ZXIgQXNpY1N3aXRjaENoYW5uZWwoKS4KKworCUlSUUwgPSBQQVNTSVZFX0xFVkVMCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIEFzaWNMb2NrQ2hhbm5lbCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVQ0hBUiBDaGFubmVsKQoreworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRAlBc2ljQW50ZW5uYVNlbGVjdCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVQ0hBUgkJCUNoYW5uZWwpCit7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlBbnRlbm5hIG1pc2NlbGxhbmVvdXMgc2V0dGluZy4KKworCUFyZ3VtZW50czoKKwkJcEFkCQkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCQlCYW5kU3RhdGUJCQkJSW5kaWNhdGUgY3VycmVudCBCYW5kIFN0YXRlLgorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMIDw9IERJU1BBVENIX0xFVkVMCisKKwlOb3RlOgorCQkxLikgRnJhbWUgRW5kIHR5cGUgY29udHJvbAorCQkJb25seSB2YWxpZCBmb3IgRyBvbmx5IChSRl8yNTI3ICYgUkZfMjUyOSkKKwkJCTA6IG1lYW5zIERQRFQsIHNldCBCQlAgUjQgYml0IDUgdG8gMQorCQkJMTogbWVhbnMgU1BEVCwgc2V0IEJCUCBSNCBiaXQgNSB0byAwCisKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJQXNpY0FudGVubmFTZXR0aW5nKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCUFCR0JBTkRfU1RBVEUJQmFuZFN0YXRlKQoreworfQorCitWT0lEIEFzaWNSZlR1bmluZ0V4ZWMoCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKQoreworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCUdpdmVzIENDSyBUWCByYXRlIDIgbW9yZSBkQiBUWCBwb3dlci4KKwkJVGhpcyByb3V0aW5lIHdvcmtzIG9ubHkgaW4gTElOSyBVUCBpbiBJTkZSQVNUUlVDVFVSRSBtb2RlLgorCisJCWNhbGN1bGF0ZSBkZXNpcmVkIFR4IHBvd2VyIGluIFJGIFIzLlR4MH41LAlzaG91bGQgY29uc2lkZXIgLQorCQkwLiBpZiBjdXJyZW50IHJhZGlvIGlzIGEgbm9pc3kgZW52aXJvbm1lbnQgKHBBZC0+RHJzQ291bnRlcnMuZk5vaXN5RW52aXJvbm1lbnQpCisJCTEuIFR4UG93ZXJQZXJjZW50YWdlCisJCTIuIGF1dG8gY2FsaWJyYXRpb24gYmFzZWQgb24gVFNTSSBmZWVkYmFjaworCQkzLiBleHRyYSAyIGRiIGZvciBDQ0sKKwkJNC4gLTEwIGRiIHVwb24gdmVyeS1zaG9ydCBkaXN0YW5jZSAoQXZnUlNTSSA+PSAtNDBkYikgdG8gQVAKKworCU5PVEU6IFNpbmNlIHRoaXMgcm91dGluZSByZXF1aXJlcyB0aGUgdmFsdWUgb2YgKHBBZC0+RHJzQ291bnRlcnMuZk5vaXN5RW52aXJvbm1lbnQpLAorCQlpdCBzaG91bGQgYmUgY2FsbGVkIEFGVEVSIE1sbWVEeW5hbWljVHhSYXRTd2l0Y2hpbmcoKQorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgQXNpY0FkanVzdFR4UG93ZXIoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJSU5UCQkJaSwgajsKKwlDSEFSCQlEZWx0YVB3ciA9IDA7CisJQk9PTEVBTgkJYkF1dG9UeEFnYyA9IEZBTFNFOworCVVDSEFSCQlUc3NpUmVmLCAqcFRzc2lNaW51c0JvdW5kYXJ5LCAqcFRzc2lQbHVzQm91bmRhcnksIFR4QWdjU3RlcDsKKwlVQ0hBUgkJQmJwUjEgPSAwLCBCYnBSNDkgPSAwLCBpZHg7CisJUENIQVIJCXBUeEFnY0NvbXBlbnNhdGU7CisJVUxPTkcJCVR4UHdyWzVdOworCUNIQVIJCVZhbHVlOworCisJaWYgKHBBZC0+Q29tbW9uQ2ZnLkJCUEN1cnJlbnRCVyA9PSBCV180MCkKKwl7CisJCWlmIChwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA+IDE0KQorCQl7CisJCQlUeFB3clswXSA9IHBBZC0+VHg0ME1Qd3JDZmdBQmFuZFswXTsKKwkJCVR4UHdyWzFdID0gcEFkLT5UeDQwTVB3ckNmZ0FCYW5kWzFdOworCQkJVHhQd3JbMl0gPSBwQWQtPlR4NDBNUHdyQ2ZnQUJhbmRbMl07CisJCQlUeFB3clszXSA9IHBBZC0+VHg0ME1Qd3JDZmdBQmFuZFszXTsKKwkJCVR4UHdyWzRdID0gcEFkLT5UeDQwTVB3ckNmZ0FCYW5kWzRdOworCQl9CisJCWVsc2UKKwkJeworCQkJVHhQd3JbMF0gPSBwQWQtPlR4NDBNUHdyQ2ZnR0JhbmRbMF07CisJCQlUeFB3clsxXSA9IHBBZC0+VHg0ME1Qd3JDZmdHQmFuZFsxXTsKKwkJCVR4UHdyWzJdID0gcEFkLT5UeDQwTVB3ckNmZ0dCYW5kWzJdOworCQkJVHhQd3JbM10gPSBwQWQtPlR4NDBNUHdyQ2ZnR0JhbmRbM107CisJCQlUeFB3cls0XSA9IHBBZC0+VHg0ME1Qd3JDZmdHQmFuZFs0XTsKKwkJfQorCX0KKwllbHNlCisJeworCQlpZiAocEFkLT5Db21tb25DZmcuQ2hhbm5lbCA+IDE0KQorCQl7CisJCQlUeFB3clswXSA9IHBBZC0+VHgyME1Qd3JDZmdBQmFuZFswXTsKKwkJCVR4UHdyWzFdID0gcEFkLT5UeDIwTVB3ckNmZ0FCYW5kWzFdOworCQkJVHhQd3JbMl0gPSBwQWQtPlR4MjBNUHdyQ2ZnQUJhbmRbMl07CisJCQlUeFB3clszXSA9IHBBZC0+VHgyME1Qd3JDZmdBQmFuZFszXTsKKwkJCVR4UHdyWzRdID0gcEFkLT5UeDIwTVB3ckNmZ0FCYW5kWzRdOworCQl9CisJCWVsc2UKKwkJeworCQkJVHhQd3JbMF0gPSBwQWQtPlR4MjBNUHdyQ2ZnR0JhbmRbMF07CisJCQlUeFB3clsxXSA9IHBBZC0+VHgyME1Qd3JDZmdHQmFuZFsxXTsKKwkJCVR4UHdyWzJdID0gcEFkLT5UeDIwTVB3ckNmZ0dCYW5kWzJdOworCQkJVHhQd3JbM10gPSBwQWQtPlR4MjBNUHdyQ2ZnR0JhbmRbM107CisJCQlUeFB3cls0XSA9IHBBZC0+VHgyME1Qd3JDZmdHQmFuZFs0XTsKKwkJfQorCX0KKworCS8vIFRYIHBvd2VyIGNvbXBlbnNhdGlvbiBmb3IgdGVtcGVyYXR1cmUgdmFyaWF0aW9uIGJhc2VkIG9uIFRTU0kuIHRyeSBldmVyeSA0IHNlY29uZAorCWlmIChwQWQtPk1sbWUuT25lU2VjUGVyaW9kaWNSb3VuZCAlIDQgPT0gMCkKKwl7CisJCWlmIChwQWQtPkNvbW1vbkNmZy5DaGFubmVsIDw9IDE0KQorCQl7CisJCQkvKiBiZyBjaGFubmVsICovCisJCQliQXV0b1R4QWdjICAgICAgICAgPSBwQWQtPmJBdXRvVHhBZ2NHOworCQkJVHNzaVJlZiAgICAgICAgICAgID0gcEFkLT5Uc3NpUmVmRzsKKwkJCXBUc3NpTWludXNCb3VuZGFyeSA9ICZwQWQtPlRzc2lNaW51c0JvdW5kYXJ5R1swXTsKKwkJCXBUc3NpUGx1c0JvdW5kYXJ5ICA9ICZwQWQtPlRzc2lQbHVzQm91bmRhcnlHWzBdOworCQkJVHhBZ2NTdGVwICAgICAgICAgID0gcEFkLT5UeEFnY1N0ZXBHOworCQkJcFR4QWdjQ29tcGVuc2F0ZSAgID0gJnBBZC0+VHhBZ2NDb21wZW5zYXRlRzsKKwkJfQorCQllbHNlCisJCXsKKwkJCS8qIGEgY2hhbm5lbCAqLworCQkJYkF1dG9UeEFnYyAgICAgICAgID0gcEFkLT5iQXV0b1R4QWdjQTsKKwkJCVRzc2lSZWYgICAgICAgICAgICA9IHBBZC0+VHNzaVJlZkE7CisJCQlwVHNzaU1pbnVzQm91bmRhcnkgPSAmcEFkLT5Uc3NpTWludXNCb3VuZGFyeUFbMF07CisJCQlwVHNzaVBsdXNCb3VuZGFyeSAgPSAmcEFkLT5Uc3NpUGx1c0JvdW5kYXJ5QVswXTsKKwkJCVR4QWdjU3RlcCAgICAgICAgICA9IHBBZC0+VHhBZ2NTdGVwQTsKKwkJCXBUeEFnY0NvbXBlbnNhdGUgICA9ICZwQWQtPlR4QWdjQ29tcGVuc2F0ZUE7CisJCX0KKworCQlpZiAoYkF1dG9UeEFnYykKKwkJeworCQkJLyogQmJwUjEgaXMgdW5zaWduZWQgY2hhciAqLworCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I0OSwgJkJicFI0OSk7CisKKwkJCS8qIChwKSBUc3NpUGx1c0JvdW5kYXJ5R1swXSA9IDAgPSAobSkgVHNzaU1pbnVzQm91bmRhcnlHWzBdICovCisJCQkvKiBjb21wZW5zYXRlOiArNCAgICAgKzMgICArMiAgICsxICAgIDAgICAtMSAgIC0yICAgLTMgICAtNCAqIHN0ZXBzICovCisJCQkvKiBzdGVwIHZhbHVlIGlzIGRlZmluZWQgaW4gcEFkLT5UeEFnY1N0ZXBHIGZvciB0eCBwb3dlciB2YWx1ZSAqLworCisJCQkvKiBbNF0rMStbNF0gICBwNCAgICAgcDMgICBwMiAgIHAxICAgbzEgICBtMSAgIG0yICAgbTMgICBtNCAqLworCQkJLyogZXg6ICAgICAgICAgMHgwMCAweDE1IDB4MjUgMHg0NSAweDg4IDB4QTAgMHhCNSAweEQwIDB4RjAKKwkJCSAgIGFib3ZlIHZhbHVlIGFyZSBleGFtaW5lZCBpbiBtYXNzIGZhY3RvcnkgcHJvZHVjdGlvbiAqLworCQkJLyogICAgICAgICAgICAgWzRdICAgIFszXSAgWzJdICBbMV0gIFswXSAgWzFdICBbMl0gIFszXSAgWzRdICovCisKKwkJCS8qIHBsdXMgKCspIGlzIDB4MDAgfiAweDQ1LCBtaW51cyAoLSkgaXMgMHhhMCB+IDB4ZjAgKi8KKwkJCS8qIGlmIHZhbHVlIGlzIGJldHdlZW4gcDEgfiBvMSBvciBvMSB+IHMxLCBubyBuZWVkIHRvIGFkanVzdCB0eCBwb3dlciAqLworCQkJLyogaWYgdmFsdWUgaXMgMHhhNSwgdHggcG93ZXIgd2lsbCBiZSAtPSBUeEFnY1N0ZXAqKDItMSkgKi8KKworCQkJaWYgKEJicFI0OSA+IHBUc3NpTWludXNCb3VuZGFyeVsxXSkKKwkJCXsKKwkJCQkvLyBSZWFkaW5nIGlzIGxhcmdlciB0aGFuIHRoZSByZWZlcmVuY2UgdmFsdWUKKwkJCQkvLyBjaGVjayBmb3IgaG93IGxhcmdlIHdlIG5lZWQgdG8gZGVjcmVhc2UgdGhlIFR4IHBvd2VyCisJCQkJZm9yIChpZHggPSAxOyBpZHggPCA1OyBpZHgrKykKKwkJCQl7CisJCQkJCWlmIChCYnBSNDkgPD0gcFRzc2lNaW51c0JvdW5kYXJ5W2lkeF0pICAvLyBGb3VuZCB0aGUgcmFuZ2UKKwkJCQkJCWJyZWFrOworCQkJCX0KKwkJCQkvLyBUaGUgaW5kZXggaXMgdGhlIHN0ZXAgd2Ugc2hvdWxkIGRlY3JlYXNlLCBpZHggPSAwIG1lYW5zIHRoZXJlIGlzIG5vdGhpbmcgdG8gY29tcGVuc2F0ZQorLy8JCQkJaWYgKFIzID4gKFVMT05HKSAoVHhBZ2NTdGVwICogKGlkeC0xKSkpCisJCQkJCSpwVHhBZ2NDb21wZW5zYXRlID0gLShUeEFnY1N0ZXAgKiAoaWR4LTEpKTsKKy8vCQkJCWVsc2UKKy8vCQkJCQkqcFR4QWdjQ29tcGVuc2F0ZSA9IC0oKFVDSEFSKVIzKTsKKworCQkJCURlbHRhUHdyICs9ICgqcFR4QWdjQ29tcGVuc2F0ZSk7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0gVHggUG93ZXIsIEJCUCBSMT0leCwgVHNzaVJlZj0leCwgVHhBZ2NTdGVwPSV4LCBzdGVwID0gLSVkXG4iLAorCQkJCQlCYnBSNDksIFRzc2lSZWYsIFR4QWdjU3RlcCwgaWR4LTEpKTsKKwkJCX0KKwkJCWVsc2UgaWYgKEJicFI0OSA8IHBUc3NpUGx1c0JvdW5kYXJ5WzFdKQorCQkJeworCQkJCS8vIFJlYWRpbmcgaXMgc21hbGxlciB0aGFuIHRoZSByZWZlcmVuY2UgdmFsdWUKKwkJCQkvLyBjaGVjayBmb3IgaG93IGxhcmdlIHdlIG5lZWQgdG8gaW5jcmVhc2UgdGhlIFR4IHBvd2VyCisJCQkJZm9yIChpZHggPSAxOyBpZHggPCA1OyBpZHgrKykKKwkJCQl7CisJCQkJCWlmIChCYnBSNDkgPj0gcFRzc2lQbHVzQm91bmRhcnlbaWR4XSkgICAvLyBGb3VuZCB0aGUgcmFuZ2UKKwkJCQkJCWJyZWFrOworCQkJCX0KKwkJCQkvLyBUaGUgaW5kZXggaXMgdGhlIHN0ZXAgd2Ugc2hvdWxkIGluY3JlYXNlLCBpZHggPSAwIG1lYW5zIHRoZXJlIGlzIG5vdGhpbmcgdG8gY29tcGVuc2F0ZQorCQkJCSpwVHhBZ2NDb21wZW5zYXRlID0gVHhBZ2NTdGVwICogKGlkeC0xKTsKKwkJCQlEZWx0YVB3ciArPSAoKnBUeEFnY0NvbXBlbnNhdGUpOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIisrIFR4IFBvd2VyLCBCQlAgUjE9JXgsIFRzc2lSZWY9JXgsIFR4QWdjU3RlcD0leCwgc3RlcCA9ICslZFxuIiwKKwkJCQkJQmJwUjQ5LCBUc3NpUmVmLCBUeEFnY1N0ZXAsIGlkeC0xKSk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJKnBUeEFnY0NvbXBlbnNhdGUgPSAwOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiAgIFR4IFBvd2VyLCBCQlAgUjQ5PSV4LCBUc3NpUmVmPSV4LCBUeEFnY1N0ZXA9JXgsIHN0ZXAgPSArJWRcbiIsCisJCQkJCUJicFI0OSwgVHNzaVJlZiwgVHhBZ2NTdGVwLCAwKSk7CisJCQl9CisJCX0KKwl9CisJZWxzZQorCXsKKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPD0gMTQpCisJCXsKKwkJCWJBdXRvVHhBZ2MgICAgICAgICA9IHBBZC0+YkF1dG9UeEFnY0c7CisJCQlwVHhBZ2NDb21wZW5zYXRlICAgPSAmcEFkLT5UeEFnY0NvbXBlbnNhdGVHOworCQl9CisJCWVsc2UKKwkJeworCQkJYkF1dG9UeEFnYyAgICAgICAgID0gcEFkLT5iQXV0b1R4QWdjQTsKKwkJCXBUeEFnY0NvbXBlbnNhdGUgICA9ICZwQWQtPlR4QWdjQ29tcGVuc2F0ZUE7CisJCX0KKworCQlpZiAoYkF1dG9UeEFnYykKKwkJCURlbHRhUHdyICs9ICgqcFR4QWdjQ29tcGVuc2F0ZSk7CisJfQorCisJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IxLCAmQmJwUjEpOworCUJicFIxICY9IDB4RkM7CisKKyNpZmRlZiBTSU5HTEVfU0tVCisJLy8gSGFuZGxlIHJlZ3VsYXRvcnkgbWF4IHR4IHBvd2VyIGNvbnN0cmFpbgorCWRvCisJeworCQlVQ0hBUiAgICBUeFB3ckluRUVQUk9NID0gMHhGRiwgQ291bnRyeVR4UHdyID0gMHhGRiwgY3JpdGVyaW9uOworCQlVQ0hBUiAgICBBZGp1c3RNYXhUeFB3cls0MF07CisKKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPiAxNCkgLy8gNUcgYmFuZAorCQkJVHhQd3JJbkVFUFJPTSA9ICgocEFkLT5Db21tb25DZmcuRGVmaW5lTWF4VHhQd3IgJiAweEZGMDApID4+IDgpOworCQllbHNlIC8vIDIuNEcgYmFuZAorCQkJVHhQd3JJbkVFUFJPTSA9IChwQWQtPkNvbW1vbkNmZy5EZWZpbmVNYXhUeFB3ciAmIDB4MDBGRik7CisJCUNvdW50cnlUeFB3ciA9IEdldEN1bnRyeU1heFR4UHdyKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCk7CisKKwkJLy8gZXJyb3IgaGFuZGxpbmcsIHJhbmdlIGNoZWNrCisJCWlmICgoVHhQd3JJbkVFUFJPTSA+IDB4NTApIHx8IChDb3VudHJ5VHhQd3IgPiAweDUwKSkKKwkJeworCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJBc2ljQWRqdXN0VHhQb3dlciAtIEludmFsaWQgbWF4IHR4IHBvd2VyICg9MHglMDJ4KSwgQ291bnRyeVR4UHdyPSVkXG4iLCBUeFB3ckluRUVQUk9NLCBDb3VudHJ5VHhQd3IpKTsKKwkJCWJyZWFrOworCQl9CisKKwkJY3JpdGVyaW9uID0gKigoUFVDSEFSKVR4UHdyICsgMikgJiAweEY7ICAgICAgICAvLyBGQUUgdXNlIE9GRE0gNk0gYXMgY3JpdGVyaW9uCisKKwkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCgiQXNpY0FkanVzdFR4UG93ZXIgKGNyaXRlcmlvbj0lZCwgVHhQd3JJbkVFUFJPTT0lZCwgQ291bnRyeVR4UHdyPSVkKVxuIiwgY3JpdGVyaW9uLCBUeFB3ckluRUVQUk9NLCBDb3VudHJ5VHhQd3IpKTsKKworCQkvLyBBZGp1c3QgbWF4IHR4IHBvd2VyIGFjY29yZGluZyB0byB0aGUgcmVsYXRpb25zaGlwIG9mIHR4IHBvd2VyIGluIEUyUFJPTQorCQlmb3IgKGk9MDsgaTw1OyBpKyspCisJCXsKKwkJCS8vIENDSyB3aWxsIGhhdmUgNGRCbSBsYXJnZXIgdGhhbiBPRkRNCisJCQkvLyBUaGVyZWZvcmUsIHdlIHNob3VsZCBzZXBhcmF0ZSB0byBwYXJzZSB0aGUgdHggcG93ZXIgZmllbGQKKwkJCWlmIChpID09IDApCisJCQl7CisJCQkJZm9yIChqPTA7IGo8ODsgaisrKQorCQkJCXsKKwkJCQkJVmFsdWUgPSAoQ0hBUikoKFR4UHdyW2ldID4+IGoqNCkgJiAweDBGKTsKKworCQkJCQlpZiAoaiA8IDQpCisJCQkJCXsKKwkJCQkJCS8vIENDSyB3aWxsIGhhdmUgNGRCbSBsYXJnZXIgdGhhbiBPRkRNCisJCQkJCQlBZGp1c3RNYXhUeFB3cltpKjgral0gPSBUeFB3ckluRUVQUk9NICsgKFZhbHVlIC0gY3JpdGVyaW9uKSArIDQ7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlBZGp1c3RNYXhUeFB3cltpKjgral0gPSBUeFB3ckluRUVQUk9NICsgKFZhbHVlIC0gY3JpdGVyaW9uKTsKKwkJCQkJfQorCQkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsKCJBc2ljQWRqdXN0VHhQb3dlciAoaS9qPSVkLyVkLCBWYWx1ZT0lZCwgJWQpXG4iLCBpLCBqLCBWYWx1ZSwgQWRqdXN0TWF4VHhQd3JbaSo4K2pdKSk7CisJCQkJfQorCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWZvciAoaj0wOyBqPDg7IGorKykKKwkJCQl7CisJCQkJCVZhbHVlID0gKENIQVIpKChUeFB3cltpXSA+PiBqKjQpICYgMHgwRik7CisKKwkJCQkJQWRqdXN0TWF4VHhQd3JbaSo4K2pdID0gVHhQd3JJbkVFUFJPTSArIChWYWx1ZSAtIGNyaXRlcmlvbik7CisJCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwoIkFzaWNBZGp1c3RUeFBvd2VyIChpL2o9JWQvJWQsIFZhbHVlPSVkLCAlZClcbiIsIGksIGosIFZhbHVlLCBBZGp1c3RNYXhUeFB3cltpKjgral0pKTsKKwkJCQl9CisJCQl9CisJCX0KKworCQkvLyBBZGp1c3QgdHggcG93ZXIgYWNjb3JkaW5nIHRvIHRoZSByZWxhdGlvbnNoaXAKKwkJZm9yIChpPTA7IGk8NTsgaSsrKQorCQl7CisJCQlpZiAoVHhQd3JbaV0gIT0gMHhmZmZmZmZmZikKKwkJCXsKKwkJCQlmb3IgKGo9MDsgajw4OyBqKyspCisJCQkJeworCQkJCQlWYWx1ZSA9IChDSEFSKSgoVHhQd3JbaV0gPj4gaio0KSAmIDB4MEYpOworCisJCQkJCS8vIFRoZSBzeXN0ZW0gdHggcG93ZXIgaXMgbGFyZ2VyIHRoYW4gdGhlIHJlZ3VsYXRvcnksIHRoZSBwb3dlciBzaG91bGQgYmUgcmVzdHJhaW4KKwkJCQkJaWYgKEFkanVzdE1heFR4UHdyW2kqOCtqXSA+IENvdW50cnlUeFB3cikKKwkJCQkJeworCQkJCQkJLy8gZGVjcmVhc2UgdG8gemVybyBhbmQgZG9uJ3QgbmVlZCB0byB0YWtlIGNhcmUgQkJQUjEKKwkJCQkJCWlmICgoVmFsdWUgLSAoQWRqdXN0TWF4VHhQd3JbaSo4K2pdIC0gQ291bnRyeVR4UHdyKSkgPiAwKQorCQkJCQkJCVZhbHVlIC09IChBZGp1c3RNYXhUeFB3cltpKjgral0gLSBDb3VudHJ5VHhQd3IpOworCQkJCQkJZWxzZQorCQkJCQkJCVZhbHVlID0gMDsKKworCQkJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCgiQXNpY0FkanVzdFR4UG93ZXIgKGkvaj0lZC8lZCwgVmFsdWU9JWQsICVkKVxuIiwgaSwgaiwgVmFsdWUsIEFkanVzdE1heFR4UHdyW2kqOCtqXSkpOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwoIkFzaWNBZGp1c3RUeFBvd2VyIChpL2o9JWQvJWQsIFZhbHVlPSVkLCAlZCwgbm8gY2hhbmdlKVxuIiwgaSwgaiwgVmFsdWUsIEFkanVzdE1heFR4UHdyW2kqOCtqXSkpOworCisJCQkJCQlUeFB3cltpXSA9IChUeFB3cltpXSAmIH4oMHgwMDAwMDAwRiA8PCBqKjQpKSB8IChWYWx1ZSA8PCBqKjQpOworCQkJCX0KKwkJCX0KKwkJfQorCX0gd2hpbGUgKEZBTFNFKTsKKyNlbmRpZiAvLyBTSU5HTEVfU0tVIC8vCisKKwkvKiBjYWxjdWxhdGUgZGVsdGEgcG93ZXIgYmFzZWQgb24gdGhlIHBlcmNlbnRhZ2Ugc3BlY2lmaWVkIGZyb20gVUkgKi8KKwkvLyBFMlBST00gc2V0dGluZyBpcyBjYWxpYnJhdGVkIGZvciBtYXhpbXVtIFRYIHBvd2VyIChpLmUuIDEwMCUpCisJLy8gV2UgbG93ZXIgVFggcG93ZXIgaGVyZSBhY2NvcmRpbmcgdG8gdGhlIHBlcmNlbnRhZ2Ugc3BlY2lmaWVkIGZyb20gVUkKKwlpZiAocEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UgPT0gMHhmZmZmZmZmZikgICAgICAgLy8gQVVUTyBUWCBQT1dFUiBjb250cm9sCisJCTsKKwllbHNlIGlmIChwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA+IDkwKSAgLy8gOTEgfiAxMDAlICYgQVVUTywgdHJlYXQgYXMgMTAwJSBpbiB0ZXJtcyBvZiBtVworCQk7CisJZWxzZSBpZiAocEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UgPiA2MCkgIC8vIDYxIH4gOTAlLCB0cmVhdCBhcyA3NSUgaW4gdGVybXMgb2YgbVcJCS8vIERlbHRhUHdyIC09IDE7CisJeworCQlEZWx0YVB3ciAtPSAxOworCX0KKwllbHNlIGlmIChwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA+IDMwKSAgLy8gMzEgfiA2MCUsIHRyZWF0IGFzIDUwJSBpbiB0ZXJtcyBvZiBtVwkJLy8gRGVsdGFQd3IgLT0gMzsKKwl7CisJCURlbHRhUHdyIC09IDM7CisJfQorCWVsc2UgaWYgKHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID4gMTUpICAvLyAxNiB+IDMwJSwgdHJlYXQgYXMgMjUlIGluIHRlcm1zIG9mIG1XCQkvLyBEZWx0YVB3ciAtPSA2OworCXsKKwkJQmJwUjEgfD0gMHgwMTsKKwl9CisJZWxzZSBpZiAocEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UgPiA5KSAgIC8vIDEwIH4gMTUlLCB0cmVhdCBhcyAxMi41JSBpbiB0ZXJtcyBvZiBtVwkJLy8gRGVsdGFQd3IgLT0gOTsKKwl7CisJCUJicFIxIHw9IDB4MDE7CisJCURlbHRhUHdyIC09IDM7CisJfQorCWVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMCB+IDkgJSwgdHJlYXQgYXMgTUlOKH4zJSkgaW4gdGVybXMgb2YgbVcJCS8vIERlbHRhUHdyIC09IDEyOworCXsKKwkJQmJwUjEgfD0gMHgwMjsKKwl9CisKKwlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IxLCBCYnBSMSk7CisKKwkvKiByZXNldCBkaWZmZXJlbnQgbmV3IHR4IHBvd2VyIGZvciBkaWZmZXJlbnQgVFggcmF0ZSAqLworCWZvcihpPTA7IGk8NTsgaSsrKQorCXsKKwkJaWYgKFR4UHdyW2ldICE9IDB4ZmZmZmZmZmYpCisJCXsKKwkJCWZvciAoaj0wOyBqPDg7IGorKykKKwkJCXsKKwkJCQlWYWx1ZSA9IChDSEFSKSgoVHhQd3JbaV0gPj4gaio0KSAmIDB4MEYpOyAvKiAwIH4gMTUgKi8KKworCQkJCWlmICgoVmFsdWUgKyBEZWx0YVB3cikgPCAwKQorCQkJCXsKKwkJCQkJVmFsdWUgPSAwOyAvKiBtaW4gKi8KKwkJCQl9CisJCQkJZWxzZSBpZiAoKFZhbHVlICsgRGVsdGFQd3IpID4gMHhGKQorCQkJCXsKKwkJCQkJVmFsdWUgPSAweEY7IC8qIG1heCAqLworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlWYWx1ZSArPSBEZWx0YVB3cjsgLyogdGVtcGVyYXR1cmUgY29tcGVuc2F0aW9uICovCisJCQkJfQorCisJCQkJLyogZmlsbCBuZXcgdmFsdWUgdG8gQ1NSIG9mZnNldCAqLworCQkJCVR4UHdyW2ldID0gKFR4UHdyW2ldICYgfigweDAwMDAwMDBGIDw8IGoqNCkpIHwgKFZhbHVlIDw8IGoqNCk7CisJCQl9CisKKwkJCS8qIHdyaXRlIHR4IHBvd2VyIHZhbHVlIHRvIENTUiAqLworCQkJLyogVFhfUFdSX0NGR18wICg4IHR4IHJhdGUpIGZvcglUWCBwb3dlciBmb3IgT0ZETSAxMk0vMThNCisJCQkJCQkJCQkJCVRYIHBvd2VyIGZvciBPRkRNIDZNLzlNCisJCQkJCQkJCQkJCVRYIHBvd2VyIGZvciBDQ0s1LjVNLzExTQorCQkJCQkJCQkJCQlUWCBwb3dlciBmb3IgQ0NLMU0vMk0gKi8KKwkJCS8qIFRYX1BXUl9DRkdfMSB+IFRYX1BXUl9DRkdfNCAqLworCQkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfUFdSX0NGR18wICsgaSo0LCBUeFB3cltpXSk7CisJCX0KKwl9CisKK30KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlwdXQgUEhZIHRvIHNsZWVwIGhlcmUsIGFuZCBzZXQgbmV4dCB3YWtldXAgdGltZXIuIFBIWSBkb2Vzbid0IG5vdCB3YWtldXAKKwkJYXV0b21hdGljYWxseS4gSW5zdGVhZCwgTUNVIHdpbGwgaXNzdWUgYSBUd2FrZVVwSW50ZXJydXB0IHRvIGhvc3QgYWZ0ZXIKKwkJdGhlIHdha2V1cCB0aW1lciB0aW1lb3V0LiBEcml2ZXIgaGFzIHRvIGlzc3VlIGEgc2VwYXJhdGUgY29tbWFuZCB0byB3YWtlCisJCVBIWSB1cC4KKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBBc2ljU2xlZXBUaGVuQXV0b1dha2V1cCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVU0hPUlQgVGJ0dE51bVRvTmV4dFdha2VVcCkKK3sKKyAgICBSVDI4WFhfU1RBX1NMRUVQX1RIRU5fQVVUT19XQUtFVVAocEFkLCBUYnR0TnVtVG9OZXh0V2FrZVVwKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlBc2ljRm9yY2VXYWtldXAoKSBpcyB1c2VkIHdoZW5ldmVyIG1hbnVhbCB3YWtldXAgaXMgcmVxdWlyZWQKKwkJQXNpY0ZvcmNlU2xlZXAoKSBzaG91bGQgb25seSBiZSB1c2VkIHdoZW4gbm90IGluIElORlJBIEJTUy4gV2hlbgorCQlpbiBJTkZSQSBCU1MsIHdlIHNob3VsZCB1c2UgQXNpY1NsZWVwVGhlbkF1dG9XYWtldXAoKSBpbnN0ZWFkLgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgQXNpY0ZvcmNlU2xlZXAoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlBc2ljRm9yY2VXYWtldXAoKSBpcyB1c2VkIHdoZW5ldmVyIFR3YWtldXAgdGltZXIgKHNldCB2aWEgQXNpY1NsZWVwVGhlbkF1dG9XYWtldXApCisJCWV4cGlyZWQuCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgQXNpY0ZvcmNlV2FrZXVwKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIEJPT0xFQU4gICAgYkZyb21UeCkKK3sKKyAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLT4gQXNpY0ZvcmNlV2FrZXVwIFxuIikpOworICAgIFJUMjhYWF9TVEFfRk9SQ0VfV0FLRVVQKHBBZCwgYkZyb21UeCk7Cit9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVNldCBNeSBCU1NJRAorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIEFzaWNTZXRCc3NpZCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBQVUNIQVIgcEJzc2lkKQoreworCVVMT05HCQkgIEFkZHI0OworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT09PT09PT09PT09PiBBc2ljU2V0QnNzaWQgJXg6JXg6JXg6JXg6JXg6JXhcbiIsCisJCXBCc3NpZFswXSxwQnNzaWRbMV0scEJzc2lkWzJdLHBCc3NpZFszXSwgcEJzc2lkWzRdLHBCc3NpZFs1XSkpOworCisJQWRkcjQgPSAoVUxPTkcpKHBCc3NpZFswXSkJCSB8CisJCQkoVUxPTkcpKHBCc3NpZFsxXSA8PCA4KSAgfAorCQkJKFVMT05HKShwQnNzaWRbMl0gPDwgMTYpIHwKKwkJCShVTE9ORykocEJzc2lkWzNdIDw8IDI0KTsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfQlNTSURfRFcwLCBBZGRyNCk7CisKKwlBZGRyNCA9IDA7CisJLy8gYWx3YXlzIG9uZSBCU1NJRCBpbiBTVEEgbW9kZQorCUFkZHI0ID0gKFVMT05HKShwQnNzaWRbNF0pIHwgKFVMT05HKShwQnNzaWRbNV0gPDwgOCk7CisKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfQlNTSURfRFcxLCBBZGRyNCk7Cit9CisKK1ZPSUQgQXNpY1NldE1jYXN0V0MoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJTUFDX1RBQkxFX0VOVFJZICpwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtNQ0FTVF9XQ0lEXTsKKwlVU0hPUlQJCW9mZnNldDsKKworCXBFbnRyeS0+U3N0ICAgICAgICA9IFNTVF9BU1NPQzsKKwlwRW50cnktPkFpZCAgICAgICAgPSBNQ0FTVF9XQ0lEOwkvLyBTb2Z0YXAgc3VwcG9ydHMgMSBCU1NJRCBhbmQgdXNlIFdDSUQ9MCBhcyBtdWx0aWNhc3QgV2NpZCBpbmRleAorCXBFbnRyeS0+UHNNb2RlICAgICA9IFBXUl9BQ1RJVkU7CisJcEVudHJ5LT5DdXJyVHhSYXRlID0gcEFkLT5Db21tb25DZmcuTWxtZVJhdGU7CisJb2Zmc2V0ID0gTUFDX1dDSURfQkFTRSArIEJTUzBNY2FzdF9XQ0lEICogSFdfV0NJRF9FTlRSWV9TSVpFOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgQXNpY0RlbFdjaWRUYWIoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVUNIQVIJV2NpZCkKK3sKKwlVTE9ORwkJICBBZGRyMCA9IDB4MCwgQWRkcjEgPSAweDA7CisJVUxPTkcgCQlvZmZzZXQ7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBc2ljRGVsV2NpZFRhYj09PldjaWQgPSAweCV4XG4iLFdjaWQpKTsKKwlvZmZzZXQgPSBNQUNfV0NJRF9CQVNFICsgV2NpZCAqIEhXX1dDSURfRU5UUllfU0laRTsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBvZmZzZXQsIEFkZHIwKTsKKwlvZmZzZXQgKz0gNDsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBvZmZzZXQsIEFkZHIxKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIEFzaWNFbmFibGVSREcoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJVFhfTElOS19DRkdfU1RSVUMJVHhMaW5rQ2ZnOworCVVJTlQzMgkJCQlEYXRhID0gMDsKKworCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfTElOS19DRkcsICZUeExpbmtDZmcud29yZCk7CisJVHhMaW5rQ2ZnLmZpZWxkLlR4UkRHRW4gPSAxOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX0xJTktfQ0ZHLCBUeExpbmtDZmcud29yZCk7CisKKwlSVE1QX0lPX1JFQUQzMihwQWQsIEVEQ0FfQUMwX0NGRywgJkRhdGEpOworCURhdGEgICY9IDB4RkZGRkZGMDA7CisJRGF0YSAgfD0gMHg4MDsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBFRENBX0FDMF9DRkcsIERhdGEpOworCisJLy9PUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19BR0dSRUdBVElPTl9JTlVTRUQpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgQXNpY0Rpc2FibGVSREcoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJVFhfTElOS19DRkdfU1RSVUMJVHhMaW5rQ2ZnOworCVVJTlQzMgkJCQlEYXRhID0gMDsKKworCisJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9MSU5LX0NGRywgJlR4TGlua0NmZy53b3JkKTsKKwlUeExpbmtDZmcuZmllbGQuVHhSREdFbiA9IDA7CisJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfTElOS19DRkcsIFR4TGlua0NmZy53b3JkKTsKKworCVJUTVBfSU9fUkVBRDMyKHBBZCwgRURDQV9BQzBfQ0ZHLCAmRGF0YSk7CisKKwlEYXRhICAmPSAweEZGRkZGRjAwOworCS8vRGF0YSAgfD0gMHgyMDsKKyNpZm5kZWYgV0lGSV9URVNUCisJLy9pZiAoIHBBZC0+Q29tbW9uQ2ZnLmJFbmFibGVUeEJ1cnN0ICkKKwkvLwlEYXRhIHw9IDB4NjA7IC8vIGZvciBwZXJmb3JtYW5jZSBpc3N1ZSBub3Qgc2V0IHRoZSBUWE9QIHRvIDAKKyNlbmRpZgorCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfRFlOQU1JQ19CRV9UWE9QX0FDVElWRSkKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJJiYgKHBBZC0+TWFjVGFiLmZBbnlTdGF0aW9uTUlNT1BTRHluYW1pYyA9PSBGQUxTRSkKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkpCisJeworCQkvLyBGb3IgQ1dDIHRlc3QsIGNoYW5nZSB0eG9wIGZyb20gMHgzMCB0byAweDIwIGluIFR4QnVyc3QgbW9kZQorCQlpZiAocEFkLT5Db21tb25DZmcuYkVuYWJsZVR4QnVyc3QpCisJCQlEYXRhIHw9IDB4MjA7CisJfQorCVJUTVBfSU9fV1JJVEUzMihwQWQsIEVEQ0FfQUMwX0NGRywgRGF0YSk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKworCUlSUUwgPSBQQVNTSVZFX0xFVkVMCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIEFzaWNEaXNhYmxlU3luYygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlCQ05fVElNRV9DRkdfU1RSVUMgY3NyOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0tPkRpc2FibGUgVFNGIHN5bmNocm9uaXphdGlvblxuIikpOworCisJLy8gMjAwMy0xMi0yMCBkaXNhYmxlIFRTRiBhbmQgVEJUVCB3aGlsZSBOSUMgaW4gcG93ZXItc2F2aW5nIGhhdmUgc2lkZSBlZmZlY3QKKwkvLwkJCSAgdGhhdCBOSUMgd2lsbCBuZXZlciB3YWtlcyB1cCBiZWNhdXNlIFRTRiBzdG9wcyBhbmQgbm8gbW9yZQorCS8vCQkJICBUQlRUIGludGVycnVwdHMKKwlwQWQtPlRidHRUaWNrQ291bnQgPSAwOworCVJUTVBfSU9fUkVBRDMyKHBBZCwgQkNOX1RJTUVfQ0ZHLCAmY3NyLndvcmQpOworCWNzci5maWVsZC5iQmVhY29uR2VuID0gMDsKKwljc3IuZmllbGQuYlRCVFRFbmFibGUgPSAwOworCWNzci5maWVsZC5Uc2ZTeW5jTW9kZSA9IDA7CisJY3NyLmZpZWxkLmJUc2ZUaWNraW5nID0gMDsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBCQ05fVElNRV9DRkcsIGNzci53b3JkKTsKKworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgQXNpY0VuYWJsZUJzc1N5bmMoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJQkNOX1RJTUVfQ0ZHX1NUUlVDIGNzcjsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tLT5Bc2ljRW5hYmxlQnNzU3luYyhJTkZSQSBtb2RlKVxuIikpOworCisJUlRNUF9JT19SRUFEMzIocEFkLCBCQ05fVElNRV9DRkcsICZjc3Iud29yZCk7CisvLwlSVE1QX0lPX1dSSVRFMzIocEFkLCBCQ05fVElNRV9DRkcsIDB4MDAwMDAwMDApOworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJeworCQljc3IuZmllbGQuQmVhY29uSW50ZXJ2YWwgPSBwQWQtPkNvbW1vbkNmZy5CZWFjb25QZXJpb2QgPDwgNDsgLy8gQVNJQyByZWdpc3RlciBpbiB1bml0cyBvZiAxLzE2IFRVCisJCWNzci5maWVsZC5iVHNmVGlja2luZyA9IDE7CisJCWNzci5maWVsZC5Uc2ZTeW5jTW9kZSA9IDE7IC8vIHN5bmMgVFNGIGluIElORlJBU1RSVUNUVVJFIG1vZGUKKwkJY3NyLmZpZWxkLmJCZWFjb25HZW4gID0gMDsgLy8gZG8gTk9UIGdlbmVyYXRlIEJFQUNPTgorCQljc3IuZmllbGQuYlRCVFRFbmFibGUgPSAxOworCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBCQ05fVElNRV9DRkcsIGNzci53b3JkKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCU5vdGU6CisJCUJFQUNPTiBmcmFtZSBpbiBzaGFyZWQgbWVtb3J5IHNob3VsZCBiZSBidWlsdCBvayBiZWZvcmUgdGhpcyByb3V0aW5lCisJCWNhbiBiZSBjYWxsZWQuIE90aGVyd2lzZSwgYSBnYXJiYWdlIGZyYW1lIG1heWJlIHRyYW5zbWl0dGVkIG91dCBldmVyeQorCQlCZWFjb24gcGVyaW9kLgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIEFzaWNFbmFibGVJYnNzU3luYygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlCQ05fVElNRV9DRkdfU1RSVUMgY3NyOTsKKwlQVUNIQVIJCQlwdHI7CisJVUlOVCBpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0tPkFzaWNFbmFibGVJYnNzU3luYyhBREhPQyBtb2RlLiBNUERVdG90YWxCeXRlQ291bnQgPSAlZClcbiIsIHBBZC0+QmVhY29uVHhXSS5NUERVdG90YWxCeXRlQ291bnQpKTsKKworCVJUTVBfSU9fUkVBRDMyKHBBZCwgQkNOX1RJTUVfQ0ZHLCAmY3NyOS53b3JkKTsKKwljc3I5LmZpZWxkLmJCZWFjb25HZW4gPSAwOworCWNzcjkuZmllbGQuYlRCVFRFbmFibGUgPSAwOworCWNzcjkuZmllbGQuYlRzZlRpY2tpbmcgPSAwOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIEJDTl9USU1FX0NGRywgY3NyOS53b3JkKTsKKworCisjaWZkZWYgUlQyODcwCisJLy8gbW92ZSBCRUFDT04gVFhEIGFuZCBmcmFtZSBjb250ZW50IHRvIG9uLWNoaXAgbWVtb3J5CisJcHRyID0gKFBVQ0hBUikmcEFkLT5CZWFjb25UeFdJOworCWZvciAoaT0wOyBpPFRYV0lfU0laRTsgaSs9MikgIC8vIDE2LWJ5dGUgVFhXSSBmaWVsZAorCXsKKwkJLy9VSU5UMzIgbG9uZ3B0ciA9ICAqcHRyICsgKCoocHRyKzEpPDw4KSArICgqKHB0cisyKTw8MTYpICsgKCoocHRyKzMpPDwyNCk7CisJCS8vUlRNUF9JT19XUklURTMyKHBBZCwgSFdfQkVBQ09OX0JBU0UwICsgaSwgbG9uZ3B0cik7CisJCVJUVVNCTXVsdGlXcml0ZShwQWQsIEhXX0JFQUNPTl9CQVNFMCArIGksIHB0ciwgMik7CisJCXB0ciArPSAyOworCX0KKworCS8vIHN0YXJ0IHJpZ2h0IGFmdGVyIHRoZSAxNi1ieXRlIFRYV0kgZmllbGQKKwlwdHIgPSBwQWQtPkJlYWNvbkJ1ZjsKKwlmb3IgKGk9MDsgaTwgcEFkLT5CZWFjb25UeFdJLk1QRFV0b3RhbEJ5dGVDb3VudDsgaSs9MikKKwl7CisJCS8vVUlOVDMyIGxvbmdwdHIgPSAgKnB0ciArICgqKHB0cisxKTw8OCkgKyAoKihwdHIrMik8PDE2KSArICgqKHB0ciszKTw8MjQpOworCQkvL1JUTVBfSU9fV1JJVEUzMihwQWQsIEhXX0JFQUNPTl9CQVNFMCArIFRYV0lfU0laRSArIGksIGxvbmdwdHIpOworCQlSVFVTQk11bHRpV3JpdGUocEFkLCBIV19CRUFDT05fQkFTRTAgKyBUWFdJX1NJWkUgKyBpLCBwdHIsIDIpOworCQlwdHIgKz0yOworCX0KKyNlbmRpZiAvLyBSVDI4NzAgLy8KKworCS8vCisJLy8gRm9yIFdpLUZpIGZhaWx5IGdlbmVyYXRlZCBiZWFjb25zIGJldHdlZW4gcGFydGljaXBhdGluZyBzdGF0aW9ucy4KKwkvLyBTZXQgVEJUVCBwaGFzZSBhZGFwdGl2ZSBhZGp1c3RtZW50IHN0ZXAgdG8gOHVzIChkZWZhdWx0IDE2dXMpCisJLy8gZG9uJ3QgY2hhbmdlIHNldHRpbmdzIDIwMDYtNS0gYnkgSmVycnkKKwkvL1JUTVBfSU9fV1JJVEUzMihwQWQsIFRCVFRfU1lOQ19DRkcsIDB4MDAwMDEwMTApOworCisJLy8gc3RhcnQgc2VuZGluZyBCRUFDT04KKwljc3I5LmZpZWxkLkJlYWNvbkludGVydmFsID0gcEFkLT5Db21tb25DZmcuQmVhY29uUGVyaW9kIDw8IDQ7IC8vIEFTSUMgcmVnaXN0ZXIgaW4gdW5pdHMgb2YgMS8xNiBUVQorCWNzcjkuZmllbGQuYlRzZlRpY2tpbmcgPSAxOworCWNzcjkuZmllbGQuVHNmU3luY01vZGUgPSAyOyAvLyBzeW5jIFRTRiBpbiBJQlNTIG1vZGUKKwljc3I5LmZpZWxkLmJUQlRURW5hYmxlID0gMTsKKwljc3I5LmZpZWxkLmJCZWFjb25HZW4gPSAxOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIEJDTl9USU1FX0NGRywgY3NyOS53b3JkKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgQXNpY1NldEVkY2FQYXJtKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFBFRENBX1BBUk0JIHBFZGNhUGFybSkKK3sKKwlFRENBX0FDX0NGR19TVFJVQyAgIEFjMENmZywgQWMxQ2ZnLCBBYzJDZmcsIEFjM0NmZzsKKwlBQ19UWE9QX0NTUjBfU1RSVUMgY3NyMDsKKwlBQ19UWE9QX0NTUjFfU1RSVUMgY3NyMTsKKwlBSUZTTl9DU1JfU1RSVUMgICAgQWlmc25Dc3I7CisJQ1dNSU5fQ1NSX1NUUlVDICAgIEN3bWluQ3NyOworCUNXTUFYX0NTUl9TVFJVQyAgICBDd21heENzcjsKKwlpbnQgaTsKKworCUFjMENmZy53b3JkID0gMDsKKwlBYzFDZmcud29yZCA9IDA7CisJQWMyQ2ZnLndvcmQgPSAwOworCUFjM0NmZy53b3JkID0gMDsKKwlpZiAoKHBFZGNhUGFybSA9PSBOVUxMKSB8fCAocEVkY2FQYXJtLT5iVmFsaWQgPT0gRkFMU0UpKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJBc2ljU2V0RWRjYVBhcm1cbiIpKTsKKwkJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfV01NX0lOVVNFRCk7CisJCWZvciAoaT0wOyBpPE1BWF9MRU5fT0ZfTUFDX1RBQkxFOyBpKyspCisJCXsKKwkJCWlmIChwQWQtPk1hY1RhYi5Db250ZW50W2ldLlZhbGlkQXNDTEkgfHwgcEFkLT5NYWNUYWIuQ29udGVudFtpXS5WYWxpZEFzQXBDbGkpCisJCQkJQ0xJRU5UX1NUQVRVU19DTEVBUl9GTEFHKCZwQWQtPk1hY1RhYi5Db250ZW50W2ldLCBmQ0xJRU5UX1NUQVRVU19XTU1fQ0FQQUJMRSk7CisJCX0KKworCQkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJCS8vICAgICAgTUFDIFJlZ2lzdGVyIGhhcyBhIGNvcHkgLgorCQkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyNpZm5kZWYgV0lGSV9URVNUCisJCWlmKCBwQWQtPkNvbW1vbkNmZy5iRW5hYmxlVHhCdXJzdCApCisJCXsKKwkJCS8vIEZvciBDV0MgdGVzdCwgY2hhbmdlIHR4b3AgZnJvbSAweDMwIHRvIDB4MjAgaW4gVHhCdXJzdCBtb2RlCisJCQlBYzBDZmcuZmllbGQuQWNUeG9wID0gMHgyMDsgLy8gU3VnZ2VzdCBieSBKb2huIGZvciBUeEJ1cnN0IGluIEhUIE1vZGUKKwkJfQorCQllbHNlCisJCQlBYzBDZmcuZmllbGQuQWNUeG9wID0gMDsJLy8gUUlEX0FDX0JFCisvLyNlbHNlCisvLwkJQWMwQ2ZnLmZpZWxkLkFjVHhvcCA9IDA7CS8vIFFJRF9BQ19CRQorLy8jZW5kaWYKKwkJQWMwQ2ZnLmZpZWxkLkN3bWluID0gQ1dfTUlOX0lOX0JJVFM7CisJCUFjMENmZy5maWVsZC5Dd21heCA9IENXX01BWF9JTl9CSVRTOworCQlBYzBDZmcuZmllbGQuQWlmc24gPSAyOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBFRENBX0FDMF9DRkcsIEFjMENmZy53b3JkKTsKKworCQlBYzFDZmcuZmllbGQuQWNUeG9wID0gMDsJLy8gUUlEX0FDX0JLCisJCUFjMUNmZy5maWVsZC5Dd21pbiA9IENXX01JTl9JTl9CSVRTOworCQlBYzFDZmcuZmllbGQuQ3dtYXggPSBDV19NQVhfSU5fQklUUzsKKwkJQWMxQ2ZnLmZpZWxkLkFpZnNuID0gMjsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgRURDQV9BQzFfQ0ZHLCBBYzFDZmcud29yZCk7CisKKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQikKKwkJeworCQkJQWMyQ2ZnLmZpZWxkLkFjVHhvcCA9IDE5MjsJLy8gQUNfVkk6IDE5MiozMnVzIH49IDZtcworCQkJQWMzQ2ZnLmZpZWxkLkFjVHhvcCA9IDk2OwkvLyBBQ19WTzogOTYqMzJ1cyAgfj0gM21zCisJCX0KKwkJZWxzZQorCQl7CisJCQlBYzJDZmcuZmllbGQuQWNUeG9wID0gOTY7CS8vIEFDX1ZJOiA5NiozMnVzIH49IDNtcworCQkJQWMzQ2ZnLmZpZWxkLkFjVHhvcCA9IDQ4OwkvLyBBQ19WTzogNDgqMzJ1cyB+PSAxLjVtcworCQl9CisJCUFjMkNmZy5maWVsZC5Dd21pbiA9IENXX01JTl9JTl9CSVRTOworCQlBYzJDZmcuZmllbGQuQ3dtYXggPSBDV19NQVhfSU5fQklUUzsKKwkJQWMyQ2ZnLmZpZWxkLkFpZnNuID0gMjsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgRURDQV9BQzJfQ0ZHLCBBYzJDZmcud29yZCk7CisJCUFjM0NmZy5maWVsZC5Dd21pbiA9IENXX01JTl9JTl9CSVRTOworCQlBYzNDZmcuZmllbGQuQ3dtYXggPSBDV19NQVhfSU5fQklUUzsKKwkJQWMzQ2ZnLmZpZWxkLkFpZnNuID0gMjsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgRURDQV9BQzNfQ0ZHLCBBYzNDZmcud29yZCk7CisKKwkJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCQkvLyAgICAgIERNQSBSZWdpc3RlciBoYXMgYSBjb3B5IHRvby4KKwkJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCQljc3IwLmZpZWxkLkFjMFR4b3AgPSAwOwkJLy8gUUlEX0FDX0JFCisJCWNzcjAuZmllbGQuQWMxVHhvcCA9IDA7CQkvLyBRSURfQUNfQksKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgV01NX1RYT1AwX0NGRywgY3NyMC53b3JkKTsKKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQikKKwkJeworCQkJY3NyMS5maWVsZC5BYzJUeG9wID0gMTkyOwkJLy8gQUNfVkk6IDE5MiozMnVzIH49IDZtcworCQkJY3NyMS5maWVsZC5BYzNUeG9wID0gOTY7CQkvLyBBQ19WTzogOTYqMzJ1cyAgfj0gM21zCisJCX0KKwkJZWxzZQorCQl7CisJCQljc3IxLmZpZWxkLkFjMlR4b3AgPSA5NjsJCS8vIEFDX1ZJOiA5NiozMnVzIH49IDNtcworCQkJY3NyMS5maWVsZC5BYzNUeG9wID0gNDg7CQkvLyBBQ19WTzogNDgqMzJ1cyB+PSAxLjVtcworCQl9CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFdNTV9UWE9QMV9DRkcsIGNzcjEud29yZCk7CisKKwkJQ3dtaW5Dc3Iud29yZCA9IDA7CisJCUN3bWluQ3NyLmZpZWxkLkN3bWluMCA9IENXX01JTl9JTl9CSVRTOworCQlDd21pbkNzci5maWVsZC5Dd21pbjEgPSBDV19NSU5fSU5fQklUUzsKKwkJQ3dtaW5Dc3IuZmllbGQuQ3dtaW4yID0gQ1dfTUlOX0lOX0JJVFM7CisJCUN3bWluQ3NyLmZpZWxkLkN3bWluMyA9IENXX01JTl9JTl9CSVRTOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBXTU1fQ1dNSU5fQ0ZHLCBDd21pbkNzci53b3JkKTsKKworCQlDd21heENzci53b3JkID0gMDsKKwkJQ3dtYXhDc3IuZmllbGQuQ3dtYXgwID0gQ1dfTUFYX0lOX0JJVFM7CisJCUN3bWF4Q3NyLmZpZWxkLkN3bWF4MSA9IENXX01BWF9JTl9CSVRTOworCQlDd21heENzci5maWVsZC5Dd21heDIgPSBDV19NQVhfSU5fQklUUzsKKwkJQ3dtYXhDc3IuZmllbGQuQ3dtYXgzID0gQ1dfTUFYX0lOX0JJVFM7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFdNTV9DV01BWF9DRkcsIEN3bWF4Q3NyLndvcmQpOworCisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFdNTV9BSUZTTl9DRkcsIDB4MDAwMDIyMjIpOworCisJCU5kaXNaZXJvTWVtb3J5KCZwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLCBzaXplb2YoRURDQV9QQVJNKSk7CisJfQorCWVsc2UKKwl7CisJCU9QU1RBVFVTX1NFVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19XTU1fSU5VU0VEKTsKKwkJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCQkvLyAgICAgIE1BQyBSZWdpc3RlciBoYXMgYSBjb3B5LgorCQkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJCS8vCisJCS8vIE1vZGlmeSBDd21pbi9Dd21heC9UeG9wIG9uIHF1ZXVlW1FJRF9BQ19WSV0sIFJlY29tbWVuZCBieSBKZXJyeSAyMDA1LzA3LzI3CisJCS8vIFRvIGRlZ3JhZGUgb3VyIFZJRE8gUXVldWUncyB0aHJvdWdocHV0IGZvciBXaUZpIFdNTSBTM1QwNyBJc3N1ZS4KKwkJLy8KKwkJLy9wRWRjYVBhcm0tPlR4b3BbUUlEX0FDX1ZJXSA9IHBFZGNhUGFybS0+VHhvcFtRSURfQUNfVkldICogNyAvIDEwOyAvLyBydDI4NjBjIG5lZWQgdGhpcworCisJCUFjMENmZy5maWVsZC5BY1R4b3AgPSAgcEVkY2FQYXJtLT5UeG9wW1FJRF9BQ19CRV07CisJCUFjMENmZy5maWVsZC5Dd21pbj0gcEVkY2FQYXJtLT5Dd21pbltRSURfQUNfQkVdOworCQlBYzBDZmcuZmllbGQuQ3dtYXggPSBwRWRjYVBhcm0tPkN3bWF4W1FJRF9BQ19CRV07CisJCUFjMENmZy5maWVsZC5BaWZzbiA9IHBFZGNhUGFybS0+QWlmc25bUUlEX0FDX0JFXTsgLy8rMTsKKworCQlBYzFDZmcuZmllbGQuQWNUeG9wID0gIHBFZGNhUGFybS0+VHhvcFtRSURfQUNfQktdOworCQlBYzFDZmcuZmllbGQuQ3dtaW4gPSBwRWRjYVBhcm0tPkN3bWluW1FJRF9BQ19CS107IC8vKzI7CisJCUFjMUNmZy5maWVsZC5Dd21heCA9IHBFZGNhUGFybS0+Q3dtYXhbUUlEX0FDX0JLXTsKKwkJQWMxQ2ZnLmZpZWxkLkFpZnNuID0gcEVkY2FQYXJtLT5BaWZzbltRSURfQUNfQktdOyAvLysxOworCisJCUFjMkNmZy5maWVsZC5BY1R4b3AgPSAocEVkY2FQYXJtLT5UeG9wW1FJRF9BQ19WSV0gKiA2KSAvIDEwOworCQlBYzJDZmcuZmllbGQuQ3dtaW4gPSBwRWRjYVBhcm0tPkN3bWluW1FJRF9BQ19WSV07CisJCUFjMkNmZy5maWVsZC5Dd21heCA9IHBFZGNhUGFybS0+Q3dtYXhbUUlEX0FDX1ZJXTsKKwkJQWMyQ2ZnLmZpZWxkLkFpZnNuID0gcEVkY2FQYXJtLT5BaWZzbltRSURfQUNfVkldOworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQl7CisJCQkvLyBUdW5pbmcgZm9yIFdpLUZpIFdNTSBTMDYKKwkJCWlmIChwQWQtPkNvbW1vbkNmZy5iV2lGaVRlc3QgJiYKKwkJCQlwRWRjYVBhcm0tPkFpZnNuW1FJRF9BQ19WSV0gPT0gMTApCisJCQkJQWMyQ2ZnLmZpZWxkLkFpZnNuIC09IDE7CisKKwkJCS8vIFR1bmluZyBmb3IgVEduIFdpLUZpIDUuMi4zMgorCQkJLy8gU1RBIFRlc3RCZWQgY2hhbmdlcyBpbiB0aGlzIGl0ZW06IGNvbmV4YW50IGxlZ2FjeSBzdGEgPT0+IGJyb2FkY29tIDExbiBzdGEKKwkJCWlmIChTVEFfVEdOX1dJRklfT04ocEFkKSAmJgorCQkJCXBFZGNhUGFybS0+QWlmc25bUUlEX0FDX1ZJXSA9PSAxMCkKKwkJCXsKKwkJCQlBYzBDZmcuZmllbGQuQWlmc24gPSAzOworCQkJCUFjMkNmZy5maWVsZC5BY1R4b3AgPSA1OworCQkJfQorCQl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwkJQWMzQ2ZnLmZpZWxkLkFjVHhvcCA9IHBFZGNhUGFybS0+VHhvcFtRSURfQUNfVk9dOworCQlBYzNDZmcuZmllbGQuQ3dtaW4gPSBwRWRjYVBhcm0tPkN3bWluW1FJRF9BQ19WT107CisJCUFjM0NmZy5maWVsZC5Dd21heCA9IHBFZGNhUGFybS0+Q3dtYXhbUUlEX0FDX1ZPXTsKKwkJQWMzQ2ZnLmZpZWxkLkFpZnNuID0gcEVkY2FQYXJtLT5BaWZzbltRSURfQUNfVk9dOworCisvLyNpZmRlZiBXSUZJX1RFU1QKKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJXaUZpVGVzdCkKKwkJeworCQkJaWYgKEFjM0NmZy5maWVsZC5BY1R4b3AgPT0gMTAyKQorCQkJeworCQkJQWMwQ2ZnLmZpZWxkLkFjVHhvcCA9IHBFZGNhUGFybS0+VHhvcFtRSURfQUNfQkVdID8gcEVkY2FQYXJtLT5UeG9wW1FJRF9BQ19CRV0gOiAxMDsKKwkJCQlBYzBDZmcuZmllbGQuQWlmc24gID0gcEVkY2FQYXJtLT5BaWZzbltRSURfQUNfQkVdLTE7IC8qIEFJRlNOIG11c3QgPj0gMSAqLworCQkJQWMxQ2ZnLmZpZWxkLkFjVHhvcCA9IHBFZGNhUGFybS0+VHhvcFtRSURfQUNfQktdOworCQkJCUFjMUNmZy5maWVsZC5BaWZzbiAgPSBwRWRjYVBhcm0tPkFpZnNuW1FJRF9BQ19CS107CisJCQlBYzJDZmcuZmllbGQuQWNUeG9wID0gcEVkY2FQYXJtLT5UeG9wW1FJRF9BQ19WSV07CisJCQl9IC8qIEVuZCBvZiBpZiAqLworCQl9CisvLyNlbmRpZiAvLyBXSUZJX1RFU1QgLy8KKworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBFRENBX0FDMF9DRkcsIEFjMENmZy53b3JkKTsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgRURDQV9BQzFfQ0ZHLCBBYzFDZmcud29yZCk7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIEVEQ0FfQUMyX0NGRywgQWMyQ2ZnLndvcmQpOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBFRENBX0FDM19DRkcsIEFjM0NmZy53b3JkKTsKKworCisJCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkJLy8gICAgICBETUEgUmVnaXN0ZXIgaGFzIGEgY29weSB0b28uCisJCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkJY3NyMC5maWVsZC5BYzBUeG9wID0gQWMwQ2ZnLmZpZWxkLkFjVHhvcDsKKwkJY3NyMC5maWVsZC5BYzFUeG9wID0gQWMxQ2ZnLmZpZWxkLkFjVHhvcDsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgV01NX1RYT1AwX0NGRywgY3NyMC53b3JkKTsKKworCQljc3IxLmZpZWxkLkFjMlR4b3AgPSBBYzJDZmcuZmllbGQuQWNUeG9wOworCQljc3IxLmZpZWxkLkFjM1R4b3AgPSBBYzNDZmcuZmllbGQuQWNUeG9wOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBXTU1fVFhPUDFfQ0ZHLCBjc3IxLndvcmQpOworCisJCUN3bWluQ3NyLndvcmQgPSAwOworCQlDd21pbkNzci5maWVsZC5Dd21pbjAgPSBwRWRjYVBhcm0tPkN3bWluW1FJRF9BQ19CRV07CisJCUN3bWluQ3NyLmZpZWxkLkN3bWluMSA9IHBFZGNhUGFybS0+Q3dtaW5bUUlEX0FDX0JLXTsKKwkJQ3dtaW5Dc3IuZmllbGQuQ3dtaW4yID0gcEVkY2FQYXJtLT5Dd21pbltRSURfQUNfVkldOworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQkJQ3dtaW5Dc3IuZmllbGQuQ3dtaW4zID0gcEVkY2FQYXJtLT5Dd21pbltRSURfQUNfVk9dIC0gMTsgLy9mb3IgVEduIHdpZmkgdGVzdAorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBXTU1fQ1dNSU5fQ0ZHLCBDd21pbkNzci53b3JkKTsKKworCQlDd21heENzci53b3JkID0gMDsKKwkJQ3dtYXhDc3IuZmllbGQuQ3dtYXgwID0gcEVkY2FQYXJtLT5Dd21heFtRSURfQUNfQkVdOworCQlDd21heENzci5maWVsZC5Dd21heDEgPSBwRWRjYVBhcm0tPkN3bWF4W1FJRF9BQ19CS107CisJCUN3bWF4Q3NyLmZpZWxkLkN3bWF4MiA9IHBFZGNhUGFybS0+Q3dtYXhbUUlEX0FDX1ZJXTsKKwkJQ3dtYXhDc3IuZmllbGQuQ3dtYXgzID0gcEVkY2FQYXJtLT5Dd21heFtRSURfQUNfVk9dOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBXTU1fQ1dNQVhfQ0ZHLCBDd21heENzci53b3JkKTsKKworCQlBaWZzbkNzci53b3JkID0gMDsKKwkJQWlmc25Dc3IuZmllbGQuQWlmc24wID0gQWMwQ2ZnLmZpZWxkLkFpZnNuOyAvL3BFZGNhUGFybS0+QWlmc25bUUlEX0FDX0JFXTsKKwkJQWlmc25Dc3IuZmllbGQuQWlmc24xID0gQWMxQ2ZnLmZpZWxkLkFpZnNuOyAvL3BFZGNhUGFybS0+QWlmc25bUUlEX0FDX0JLXTsKKwkJQWlmc25Dc3IuZmllbGQuQWlmc24yID0gQWMyQ2ZnLmZpZWxkLkFpZnNuOyAvL3BFZGNhUGFybS0+QWlmc25bUUlEX0FDX1ZJXTsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJeworCQkJLy8gVHVuaW5nIGZvciBXaS1GaSBXTU0gUzA2CisJCQlpZiAocEFkLT5Db21tb25DZmcuYldpRmlUZXN0ICYmCisJCQkJcEVkY2FQYXJtLT5BaWZzbltRSURfQUNfVkldID09IDEwKQorCQkJCUFpZnNuQ3NyLmZpZWxkLkFpZnNuMiA9IEFjMkNmZy5maWVsZC5BaWZzbiAtIDQ7CisKKwkJCS8vIFR1bmluZyBmb3IgVEduIFdpLUZpIDUuMi4zMgorCQkJLy8gU1RBIFRlc3RCZWQgY2hhbmdlcyBpbiB0aGlzIGl0ZW06IGNvbmV4YW50IGxlZ2FjeSBzdGEgPT0+IGJyb2FkY29tIDExbiBzdGEKKwkJCWlmIChTVEFfVEdOX1dJRklfT04ocEFkKSAmJgorCQkJCXBFZGNhUGFybS0+QWlmc25bUUlEX0FDX1ZJXSA9PSAxMCkKKwkJCXsKKwkJCQlBaWZzbkNzci5maWVsZC5BaWZzbjAgPSAzOworCQkJCUFpZnNuQ3NyLmZpZWxkLkFpZnNuMiA9IDc7CisJCQl9CisKKwkJCWlmIChJTkZSQV9PTihwQWQpKQorCQkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcoJnBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0sIGZDTElFTlRfU1RBVFVTX1dNTV9DQVBBQkxFKTsKKwkJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCQlBaWZzbkNzci5maWVsZC5BaWZzbjMgPSBBYzNDZmcuZmllbGQuQWlmc24gLSAxOyAvL3BFZGNhUGFybS0+QWlmc25bUUlEX0FDX1ZPXTsgLy9mb3IgVEduIHdpZmkgdGVzdAorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBXTU1fQUlGU05fQ0ZHLCBBaWZzbkNzci53b3JkKTsKKworCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybSwgcEVkY2FQYXJtLCBzaXplb2YoRURDQV9QQVJNKSk7CisJCWlmICghQURIT0NfT04ocEFkKSkKKwkJeworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJFRENBIFsjJWRdOiBBSUZTTiBDV21pbiBDV21heCAgVFhPUCh1cykgIEFDTVxuIiwgcEVkY2FQYXJtLT5FZGNhVXBkYXRlQ291bnQpKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiICAgICBBQ19CRSAgICAgICUyZCAgICAgJTJkICAgICAlMmQgICAgICAlNGQgICAgICVkXG4iLAorCQkJCQkJCQkJIHBFZGNhUGFybS0+QWlmc25bMF0sCisJCQkJCQkJCQkgcEVkY2FQYXJtLT5Dd21pblswXSwKKwkJCQkJCQkJCSBwRWRjYVBhcm0tPkN3bWF4WzBdLAorCQkJCQkJCQkJIHBFZGNhUGFybS0+VHhvcFswXTw8NSwKKwkJCQkJCQkJCSBwRWRjYVBhcm0tPmJBQ01bMF0pKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiICAgICBBQ19CSyAgICAgICUyZCAgICAgJTJkICAgICAlMmQgICAgICAlNGQgICAgICVkXG4iLAorCQkJCQkJCQkJIHBFZGNhUGFybS0+QWlmc25bMV0sCisJCQkJCQkJCQkgcEVkY2FQYXJtLT5Dd21pblsxXSwKKwkJCQkJCQkJCSBwRWRjYVBhcm0tPkN3bWF4WzFdLAorCQkJCQkJCQkJIHBFZGNhUGFybS0+VHhvcFsxXTw8NSwKKwkJCQkJCQkJCSBwRWRjYVBhcm0tPmJBQ01bMV0pKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiICAgICBBQ19WSSAgICAgICUyZCAgICAgJTJkICAgICAlMmQgICAgICAlNGQgICAgICVkXG4iLAorCQkJCQkJCQkJIHBFZGNhUGFybS0+QWlmc25bMl0sCisJCQkJCQkJCQkgcEVkY2FQYXJtLT5Dd21pblsyXSwKKwkJCQkJCQkJCSBwRWRjYVBhcm0tPkN3bWF4WzJdLAorCQkJCQkJCQkJIHBFZGNhUGFybS0+VHhvcFsyXTw8NSwKKwkJCQkJCQkJCSBwRWRjYVBhcm0tPmJBQ01bMl0pKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiICAgICBBQ19WTyAgICAgICUyZCAgICAgJTJkICAgICAlMmQgICAgICAlNGQgICAgICVkXG4iLAorCQkJCQkJCQkJIHBFZGNhUGFybS0+QWlmc25bM10sCisJCQkJCQkJCQkgcEVkY2FQYXJtLT5Dd21pblszXSwKKwkJCQkJCQkJCSBwRWRjYVBhcm0tPkN3bWF4WzNdLAorCQkJCQkJCQkJIHBFZGNhUGFybS0+VHhvcFszXTw8NSwKKwkJCQkJCQkJCSBwRWRjYVBhcm0tPmJBQ01bM10pKTsKKwkJfQorCX0KK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgCUFzaWNTZXRTbG90VGltZSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBCT09MRUFOIGJVc2VTaG9ydFNsb3RUaW1lKQoreworCVVMT05HCVNsb3RUaW1lOworCVVJTlQzMglSZWdWYWx1ZSA9IDA7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlpZiAocEFkLT5Db21tb25DZmcuQ2hhbm5lbCA+IDE0KQorCQliVXNlU2hvcnRTbG90VGltZSA9IFRSVUU7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlpZiAoYlVzZVNob3J0U2xvdFRpbWUpCisJCU9QU1RBVFVTX1NFVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19TSE9SVF9TTE9UX0lOVVNFRCk7CisJZWxzZQorCQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19TSE9SVF9TTE9UX0lOVVNFRCk7CisKKwlTbG90VGltZSA9IChiVXNlU2hvcnRTbG90VGltZSk/IDkgOiAyMDsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJeworCQkvLyBmb3JjZSB1c2luZyBzaG9ydCBTTE9UIHRpbWUgZm9yIEZBRSB0byBkZW1vIHBlcmZvcm1hbmNlIHdoZW4gVHhCdXJzdCBpcyBPTgorCQlpZiAoKChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLmJIdEVuYWJsZSA9PSBGQUxTRSkgJiYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfV01NX0lOVVNFRCkpKQorI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJfHwgKChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLmJIdEVuYWJsZSA9PSBUUlVFKSAmJiAocEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlBvbGljeSA9PSBCQV9OT1RVU0UpKQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQkJKQorCQl7CisJCQkvLyBJbiB0aGlzIGNhc2UsIHdlIHdpbGwgdGhpbmsgaXQgaXMgZG9pbmcgV2ktRmkgdGVzdAorCQkJLy8gQW5kIHdlIHdpbGwgbm90IHNldCB0byBzaG9ydCBzbG90IHdoZW4gYkVuYWJsZVR4QnVyc3QgaXMgVFJVRS4KKwkJfQorCQllbHNlIGlmIChwQWQtPkNvbW1vbkNmZy5iRW5hYmxlVHhCdXJzdCkKKwkJCVNsb3RUaW1lID0gOTsKKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwkvLworCS8vIEZvciBzb21lIHJlYXNvbnMsIGFsd2F5cyBzZXQgaXQgdG8gc2hvcnQgc2xvdCB0aW1lLgorCS8vCisJLy8gVG9EbzogU2hvdWxkIGNvbnNpZGVyIGNhcGFiaWxpdHkgd2l0aCAxMUIKKwkvLworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJeworCQlpZiAocEFkLT5TdGFDZmcuQnNzVHlwZSA9PSBCU1NfQURIT0MpCisJCQlTbG90VGltZSA9IDIwOworCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCVJUTVBfSU9fUkVBRDMyKHBBZCwgQktPRkZfU0xPVF9DRkcsICZSZWdWYWx1ZSk7CisJUmVnVmFsdWUgPSBSZWdWYWx1ZSAmIDB4RkZGRkZGMDA7CisKKwlSZWdWYWx1ZSB8PSBTbG90VGltZTsKKworCVJUTVBfSU9fV1JJVEUzMihwQWQsIEJLT0ZGX1NMT1RfQ0ZHLCBSZWdWYWx1ZSk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCUFkZCBTaGFyZWQga2V5IGluZm9ybWF0aW9uIGludG8gQVNJQy4KKwkJVXBkYXRlIHNoYXJlZCBrZXksIFR4TWljIGFuZCBSeE1pYyB0byBBc2ljIFNoYXJlZCBrZXkgdGFibGUKKwkJVXBkYXRlIGl0cyBjaXBoZXJBbGcgdG8gQXNpYyBTaGFyZWQga2V5IE1vZGUuCisKKyAgICBSZXR1cm46CisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBBc2ljQWRkU2hhcmVkS2V5RW50cnkoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVUNIQVIJCSBCc3NJbmRleCwKKwlJTiBVQ0hBUgkJIEtleUlkeCwKKwlJTiBVQ0hBUgkJIENpcGhlckFsZywKKwlJTiBQVUNIQVIJCSBwS2V5LAorCUlOIFBVQ0hBUgkJIHBUeE1pYywKKwlJTiBQVUNIQVIJCSBwUnhNaWMpCit7CisJVUxPTkcgb2Zmc2V0OyAvLywgY3NyMDsKKwlTSEFSRURLRVlfTU9ERV9TVFJVQyBjc3IxOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQXNpY0FkZFNoYXJlZEtleUVudHJ5IEJzc0luZGV4PSVkLCBLZXlJZHg9JWRcbiIsIEJzc0luZGV4LEtleUlkeCkpOworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJBc2ljQWRkU2hhcmVkS2V5RW50cnk6ICVzIGtleSAjJWRcbiIsIENpcGhlck5hbWVbQ2lwaGVyQWxnXSwgQnNzSW5kZXgqNCArIEtleUlkeCkpOworCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCIgCUtleSA9ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisJCXBLZXlbMF0scEtleVsxXSxwS2V5WzJdLHBLZXlbM10scEtleVs0XSxwS2V5WzVdLHBLZXlbNl0scEtleVs3XSxwS2V5WzhdLHBLZXlbOV0scEtleVsxMF0scEtleVsxMV0scEtleVsxMl0scEtleVsxM10scEtleVsxNF0scEtleVsxNV0pKTsKKwlpZiAocFJ4TWljKQorCXsKKwkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIiAJUnggTUlDIEtleSA9ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKwkJCXBSeE1pY1swXSxwUnhNaWNbMV0scFJ4TWljWzJdLHBSeE1pY1szXSxwUnhNaWNbNF0scFJ4TWljWzVdLHBSeE1pY1s2XSxwUnhNaWNbN10pKTsKKwl9CisJaWYgKHBUeE1pYykKKwl7CisJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCIgCVR4IE1JQyBLZXkgPSAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisJCQlwVHhNaWNbMF0scFR4TWljWzFdLHBUeE1pY1syXSxwVHhNaWNbM10scFR4TWljWzRdLHBUeE1pY1s1XSxwVHhNaWNbNl0scFR4TWljWzddKSk7CisJfQorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vCisJLy8gZmlsbCBrZXkgbWF0ZXJpYWwgLSBrZXkgKyBUWCBNSUMgKyBSWCBNSUMKKwkvLworCisjaWZkZWYgUlQyODcwCit7CisJb2Zmc2V0ID0gU0hBUkVEX0tFWV9UQUJMRV9CQVNFICsgKDQqQnNzSW5kZXggKyBLZXlJZHgpKkhXX0tFWV9FTlRSWV9TSVpFOworCVJUVVNCTXVsdGlXcml0ZShwQWQsIG9mZnNldCwgcEtleSwgTUFYX0xFTl9PRl9TSEFSRV9LRVkpOworCisJb2Zmc2V0ICs9IE1BWF9MRU5fT0ZfU0hBUkVfS0VZOworCWlmIChwVHhNaWMpCisJeworCQlSVFVTQk11bHRpV3JpdGUocEFkLCBvZmZzZXQsIHBUeE1pYywgOCk7CisJfQorCisJb2Zmc2V0ICs9IDg7CisJaWYgKHBSeE1pYykKKwl7CisJCVJUVVNCTXVsdGlXcml0ZShwQWQsIG9mZnNldCwgcFJ4TWljLCA4KTsKKwl9Cit9CisjZW5kaWYgLy8gUlQyODcwIC8vCisKKwkvLworCS8vIFVwZGF0ZSBjaXBoZXIgYWxnb3JpdGhtLiBXU1RBIGFsd2F5cyB1c2UgQlNTMAorCS8vCisJUlRNUF9JT19SRUFEMzIocEFkLCBTSEFSRURfS0VZX01PREVfQkFTRSs0KihCc3NJbmRleC8yKSwgJmNzcjEud29yZCk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSZWFkOiBTSEFSRURfS0VZX01PREVfQkFTRSBhdCB0aGlzIEJzc1slZF0gS2V5SWR4WyVkXT0gMHgleCBcbiIsIEJzc0luZGV4LEtleUlkeCwgY3NyMS53b3JkKSk7CisJaWYgKChCc3NJbmRleCUyKSA9PSAwKQorCXsKKwkJaWYgKEtleUlkeCA9PSAwKQorCQkJY3NyMS5maWVsZC5Cc3MwS2V5MENpcGhlckFsZyA9IENpcGhlckFsZzsKKwkJZWxzZSBpZiAoS2V5SWR4ID09IDEpCisJCQljc3IxLmZpZWxkLkJzczBLZXkxQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOworCQllbHNlIGlmIChLZXlJZHggPT0gMikKKwkJCWNzcjEuZmllbGQuQnNzMEtleTJDaXBoZXJBbGcgPSBDaXBoZXJBbGc7CisJCWVsc2UKKwkJCWNzcjEuZmllbGQuQnNzMEtleTNDaXBoZXJBbGcgPSBDaXBoZXJBbGc7CisJfQorCWVsc2UKKwl7CisJCWlmIChLZXlJZHggPT0gMCkKKwkJCWNzcjEuZmllbGQuQnNzMUtleTBDaXBoZXJBbGcgPSBDaXBoZXJBbGc7CisJCWVsc2UgaWYgKEtleUlkeCA9PSAxKQorCQkJY3NyMS5maWVsZC5Cc3MxS2V5MUNpcGhlckFsZyA9IENpcGhlckFsZzsKKwkJZWxzZSBpZiAoS2V5SWR4ID09IDIpCisJCQljc3IxLmZpZWxkLkJzczFLZXkyQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOworCQllbHNlCisJCQljc3IxLmZpZWxkLkJzczFLZXkzQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOworCX0KKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIldyaXRlOiBTSEFSRURfS0VZX01PREVfQkFTRSBhdCB0aGlzIEJzc1slZF0gPSAweCV4IFxuIiwgQnNzSW5kZXgsIGNzcjEud29yZCkpOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIFNIQVJFRF9LRVlfTU9ERV9CQVNFKzQqKEJzc0luZGV4LzIpLCBjc3IxLndvcmQpOworCit9CisKKy8vCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorVk9JRCBBc2ljUmVtb3ZlU2hhcmVkS2V5RW50cnkoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVUNIQVIJCSBCc3NJbmRleCwKKwlJTiBVQ0hBUgkJIEtleUlkeCkKK3sKKwkvL1VMT05HIFNlY0NzcjA7CisJU0hBUkVES0VZX01PREVfU1RSVUMgY3NyMTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQXNpY1JlbW92ZVNoYXJlZEtleUVudHJ5OiAjJWQgXG4iLCBCc3NJbmRleCo0ICsgS2V5SWR4KSk7CisKKwlSVE1QX0lPX1JFQUQzMihwQWQsIFNIQVJFRF9LRVlfTU9ERV9CQVNFKzQqKEJzc0luZGV4LzIpLCAmY3NyMS53b3JkKTsKKwlpZiAoKEJzc0luZGV4JTIpID09IDApCisJeworCQlpZiAoS2V5SWR4ID09IDApCisJCQljc3IxLmZpZWxkLkJzczBLZXkwQ2lwaGVyQWxnID0gMDsKKwkJZWxzZSBpZiAoS2V5SWR4ID09IDEpCisJCQljc3IxLmZpZWxkLkJzczBLZXkxQ2lwaGVyQWxnID0gMDsKKwkJZWxzZSBpZiAoS2V5SWR4ID09IDIpCisJCQljc3IxLmZpZWxkLkJzczBLZXkyQ2lwaGVyQWxnID0gMDsKKwkJZWxzZQorCQkJY3NyMS5maWVsZC5Cc3MwS2V5M0NpcGhlckFsZyA9IDA7CisJfQorCWVsc2UKKwl7CisJCWlmIChLZXlJZHggPT0gMCkKKwkJCWNzcjEuZmllbGQuQnNzMUtleTBDaXBoZXJBbGcgPSAwOworCQllbHNlIGlmIChLZXlJZHggPT0gMSkKKwkJCWNzcjEuZmllbGQuQnNzMUtleTFDaXBoZXJBbGcgPSAwOworCQllbHNlIGlmIChLZXlJZHggPT0gMikKKwkJCWNzcjEuZmllbGQuQnNzMUtleTJDaXBoZXJBbGcgPSAwOworCQllbHNlCisJCQljc3IxLmZpZWxkLkJzczFLZXkzQ2lwaGVyQWxnID0gMDsKKwl9CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJXcml0ZTogU0hBUkVEX0tFWV9NT0RFX0JBU0UgYXQgdGhpcyBCc3NbJWRdID0gMHgleCBcbiIsIEJzc0luZGV4LCBjc3IxLndvcmQpKTsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBTSEFSRURfS0VZX01PREVfQkFTRSs0KihCc3NJbmRleC8yKSwgY3NyMS53b3JkKTsKKwlBU1NFUlQoQnNzSW5kZXggPCA0KTsKKwlBU1NFUlQoS2V5SWR4IDwgNCk7CisKK30KKworCitWT0lEIEFzaWNVcGRhdGVXQ0lEQXR0cmlidXRlKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVTSE9SVAkJV0NJRCwKKwlJTiBVQ0hBUgkJQnNzSW5kZXgsCisJSU4gVUNIQVIgICAgICAgIENpcGhlckFsZywKKwlJTiBCT09MRUFOCQliVXNlUGFpcmV3aXNlS2V5VGFibGUpCit7CisJVUxPTkcgICBXQ0lEQXR0cmkgPSAwLCBvZmZzZXQ7CisKKwkvLworCS8vIFVwZGF0ZSBXQ0lEIGF0dHJpYnV0ZS4KKwkvLyBPbmx5IFR4S2V5IGNvdWxkIHVwZGF0ZSBXQ0lEIGF0dHJpYnV0ZS4KKwkvLworCW9mZnNldCA9IE1BQ19XQ0lEX0FUVFJJQlVURV9CQVNFICsgKFdDSUQgKiBIV19XQ0lEX0FUVFJJX1NJWkUpOworCVdDSURBdHRyaSA9IChCc3NJbmRleCA8PCA0KSB8IChDaXBoZXJBbGcgPDwgMSkgfCAoYlVzZVBhaXJld2lzZUtleVRhYmxlKTsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBvZmZzZXQsIFdDSURBdHRyaSk7Cit9CisKK1ZPSUQgQXNpY1VwZGF0ZVdDSURJVkVJVigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVU0hPUlQJCVdDSUQsCisJSU4gVUxPTkcgICAgICAgIHVJViwKKwlJTiBVTE9ORyAgICAgICAgdUVJVikKK3sKKwlVTE9ORwlvZmZzZXQ7CisKKwlvZmZzZXQgPSBNQUNfSVZFSVZfVEFCTEVfQkFTRSArIChXQ0lEICogSFdfSVZFSVZfRU5UUllfU0laRSk7CisKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBvZmZzZXQsIHVJVik7CisJUlRNUF9JT19XUklURTMyKHBBZCwgb2Zmc2V0ICsgNCwgdUVJVik7Cit9CisKK1ZPSUQgQXNpY1VwZGF0ZVJ4V0NJRFRhYmxlKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVTSE9SVAkJV0NJRCwKKwlJTiBQVUNIQVIgICAgICAgIHBBZGRyKQoreworCVVMT05HIG9mZnNldDsKKwlVTE9ORyBBZGRyOworCisJb2Zmc2V0ID0gTUFDX1dDSURfQkFTRSArIChXQ0lEICogSFdfV0NJRF9FTlRSWV9TSVpFKTsKKwlBZGRyID0gcEFkZHJbMF0gKyAocEFkZHJbMV0gPDwgOCkgKyhwQWRkclsyXSA8PCAxNikgKyhwQWRkclszXSA8PCAyNCk7CisJUlRNUF9JT19XUklURTMyKHBBZCwgb2Zmc2V0LCBBZGRyKTsKKwlBZGRyID0gcEFkZHJbNF0gKyAocEFkZHJbNV0gPDwgOCk7CisJUlRNUF9JT19XUklURTMyKHBBZCwgb2Zmc2V0ICsgNCwgQWRkcik7Cit9CisKKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIFJvdXRpbmUgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBDaXBoZXIgS2V5LCBDaXBoZXIgYWxnb3JpdGhtLCBJVi9FSVYgdG8gQXNpYworCisgICAgQXJndW1lbnRzOgorICAgICAgICBwQWQgICAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIG91ciBhZGFwdGVyCisgICAgICAgIFdDSUQgICAgICAgICAgICAgICAgICAgIFdDSUQgRW50cnkgbnVtYmVyLgorICAgICAgICBCc3NJbmRleCAgICAgICAgICAgICAgICBCU1NJRCBpbmRleCwgc3RhdGlvbiBvciBub25lIG11bHRpcGxlIEJTU0lEIHN1cHBvcnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyB2YWx1ZSBzaG91bGQgYmUgMC4KKyAgICAgICAgS2V5SWR4ICAgICAgICAgICAgICAgICAgVGhpcyBLZXlJZHggd2lsbCBzZXQgdG8gSVYncyBLZXlJRCBpZiBiVHhLZXkgZW5hYmxlZAorICAgICAgICBwQ2lwaGVyS2V5ICAgICAgICAgICAgICBQb2ludGVyIHRvIENpcGhlciBLZXkuCisgICAgICAgIGJVc2VQYWlyZXdpc2VLZXlUYWJsZSAgIFRSVUUgbWVhbnMgc2F2ZWQgdGhlIGtleSBpbiBTaGFyZWRLZXkgdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyd2lzZSBQYWlyZXdpc2VLZXkgdGFibGUKKyAgICAgICAgYlR4S2V5ICAgICAgICAgICAgICAgICAgVGhpcyBpcyB0aGUgdHJhbnNtaXQga2V5IGlmIGVuYWJsZWQuCisKKyAgICBSZXR1cm4gVmFsdWU6CisgICAgICAgIE5vbmUKKworICAgIE5vdGU6CisgICAgICAgIFRoaXMgcm91dGluZSB3aWxsIHNldCB0aGUgcmVsYXRpdmUga2V5IHN0dWZmIHRvIEFzaWMgaW5jbHVkaW5nIFdDSUQgYXR0cmlidXRlLAorICAgICAgICBDaXBoZXIgS2V5LCBDaXBoZXIgYWxnb3JpdGhtIGFuZCBJVi9FSVYuCisKKyAgICAgICAgSVYvRUlWIHdpbGwgYmUgdXBkYXRlIGlmIHRoaXMgQ2lwaGVyS2V5IGlzIHRoZSB0cmFuc21pc3Npb24ga2V5IGJlY2F1c2UKKyAgICAgICAgQVNJQyB3aWxsIGJhc2Ugb24gSVYncyBLZXlJRCB2YWx1ZSB0byBzZWxlY3QgQ2lwaGVyIEtleS4KKworICAgICAgICBJZiBiVHhLZXkgc2V0cyB0byBGQUxTRSwgdGhpcyBpcyBub3QgdGhlIFRYIGtleSwgYnV0IGl0IGNvdWxkIGJlCisgICAgICAgIFJYIGtleQorCisgICAgCUZvciBBUCBtb2RlIGJUeEtleSBtdXN0IGJlIGFsd2F5cyBzZXQgdG8gVFJVRS4KKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIEFzaWNBZGRLZXlFbnRyeSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVU0hPUlQJCVdDSUQsCisJSU4gVUNIQVIJCUJzc0luZGV4LAorCUlOIFVDSEFSCQlLZXlJZHgsCisJSU4gUENJUEhFUl9LRVkJcENpcGhlcktleSwKKwlJTiBCT09MRUFOCQliVXNlUGFpcmV3aXNlS2V5VGFibGUsCisJSU4gQk9PTEVBTgkJYlR4S2V5KQoreworCVVMT05HCW9mZnNldDsKKy8vCVVMT05HICAgV0NJREF0dHJpID0gMDsKKwlVQ0hBUglJVjQgPSAwOworCVBVQ0hBUgkJcEtleSA9IHBDaXBoZXJLZXktPktleTsKKy8vCVVMT05HCQlLZXlMZW4gPSBwQ2lwaGVyS2V5LT5LZXlMZW47CisJUFVDSEFSCQlwVHhNaWMgPSBwQ2lwaGVyS2V5LT5UeE1pYzsKKwlQVUNIQVIJCXBSeE1pYyA9IHBDaXBoZXJLZXktPlJ4TWljOworCVBVQ0hBUgkJcFR4dHNjID0gcENpcGhlcktleS0+VHhUc2M7CisJVUNIQVIJCUNpcGhlckFsZyA9IHBDaXBoZXJLZXktPkNpcGhlckFsZzsKKwlTSEFSRURLRVlfTU9ERV9TVFJVQyBjc3IxOworCisvLwlBU1NFUlQoS2V5TGVuIDw9IE1BWF9MRU5fT0ZfUEVFUl9LRVkpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT0+IEFzaWNBZGRLZXlFbnRyeVxuIikpOworCS8vCisJLy8gMS4pIGRlY2lkZSBrZXkgdGFibGUgb2Zmc2V0CisJLy8KKwlpZiAoYlVzZVBhaXJld2lzZUtleVRhYmxlKQorCQlvZmZzZXQgPSBQQUlSV0lTRV9LRVlfVEFCTEVfQkFTRSArIChXQ0lEICogSFdfS0VZX0VOVFJZX1NJWkUpOworCWVsc2UKKwkJb2Zmc2V0ID0gU0hBUkVEX0tFWV9UQUJMRV9CQVNFICsgKDQgKiBCc3NJbmRleCArIEtleUlkeCkgKiBIV19LRVlfRU5UUllfU0laRTsKKworCS8vCisJLy8gMi4pIFNldCBLZXkgdG8gQXNpYworCS8vCisJLy9mb3IgKGkgPSAwOyBpIDwgS2V5TGVuOyBpKyspCisKKyNpZmRlZiBSVDI4NzAKKwlSVFVTQk11bHRpV3JpdGUocEFkLCBvZmZzZXQsIHBLZXksIE1BWF9MRU5fT0ZfUEVFUl9LRVkpOworCW9mZnNldCArPSBNQVhfTEVOX09GX1BFRVJfS0VZOworCisJLy8KKwkvLyAzLikgU2V0IE1JQyBrZXkgaWYgYXZhaWxhYmxlCisJLy8KKwlpZiAocFR4TWljKQorCXsKKwkJUlRVU0JNdWx0aVdyaXRlKHBBZCwgb2Zmc2V0LCBwVHhNaWMsIDgpOworCX0KKwlvZmZzZXQgKz0gTEVOX1RLSVBfVFhNSUNLOworCisJaWYgKHBSeE1pYykKKwl7CisJCVJUVVNCTXVsdGlXcml0ZShwQWQsIG9mZnNldCwgcFJ4TWljLCA4KTsKKwl9CisjZW5kaWYgLy8gUlQyODcwIC8vCisKKwkvLworCS8vIDQuKSBNb2RpZnkgSVYvRUlWIGlmIG5lZWRzCisJLy8gICAgIFRoaXMgd2lsbCBmb3JjZSBBc2ljIHRvIHVzZSB0aGlzIGtleSBJRCBieSBzZXR0aW5nIElWLgorCS8vCisJaWYgKGJUeEtleSkKKwl7CisKKyNpZmRlZiBSVDI4NzAKKwkJVUlOVDMyIHRtcFZhbDsKKworCQkvLworCQkvLyBXcml0ZSBJVgorCQkvLworCQlJVjQgPSAoS2V5SWR4IDw8IDYpOworCQlpZiAoKENpcGhlckFsZyA9PSBDSVBIRVJfVEtJUCkgfHwgKENpcGhlckFsZyA9PSBDSVBIRVJfVEtJUF9OT19NSUMpIHx8KENpcGhlckFsZyA9PSBDSVBIRVJfQUVTKSkKKwkJCUlWNCB8PSAweDIwOyAgLy8gdHVybiBvbiBleHRlbnNpb24gYml0IG1lYW5zIEVJViBleGlzdGVuY2UKKworCQl0bXBWYWwgPSBwVHh0c2NbMV0gKyAoKChwVHh0c2NbMV0gfCAweDIwKSAmIDB4N2YpIDw8IDgpICsgKHBUeHRzY1swXSA8PCAxNikgKyAoSVY0IDw8IDI0KTsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgb2Zmc2V0LCB0bXBWYWwpOworCisJCS8vCisJCS8vIFdyaXRlIEVJVgorCQkvLworCQlvZmZzZXQgKz0gNDsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgb2Zmc2V0LCAqKFBVSU5UMzIpJnBDaXBoZXJLZXktPlR4VHNjWzJdKTsKKyNlbmRpZiAvLyBSVDI4NzAgLy8KKwkJQXNpY1VwZGF0ZVdDSURBdHRyaWJ1dGUocEFkLCBXQ0lELCBCc3NJbmRleCwgQ2lwaGVyQWxnLCBiVXNlUGFpcmV3aXNlS2V5VGFibGUpOworCX0KKworCWlmICghYlVzZVBhaXJld2lzZUtleVRhYmxlKQorCXsKKwkJLy8KKwkJLy8gT25seSB1cGRhdGUgdGhlIHNoYXJlZCBrZXkgc2VjdXJpdHkgbW9kZQorCQkvLworCQlSVE1QX0lPX1JFQUQzMihwQWQsIFNIQVJFRF9LRVlfTU9ERV9CQVNFICsgNCAqIChCc3NJbmRleCAvIDIpLCAmY3NyMS53b3JkKTsKKwkJaWYgKChCc3NJbmRleCAlIDIpID09IDApCisJCXsKKwkJCWlmIChLZXlJZHggPT0gMCkKKwkJCQljc3IxLmZpZWxkLkJzczBLZXkwQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOworCQkJZWxzZSBpZiAoS2V5SWR4ID09IDEpCisJCQkJY3NyMS5maWVsZC5Cc3MwS2V5MUNpcGhlckFsZyA9IENpcGhlckFsZzsKKwkJCWVsc2UgaWYgKEtleUlkeCA9PSAyKQorCQkJCWNzcjEuZmllbGQuQnNzMEtleTJDaXBoZXJBbGcgPSBDaXBoZXJBbGc7CisJCQllbHNlCisJCQkJY3NyMS5maWVsZC5Cc3MwS2V5M0NpcGhlckFsZyA9IENpcGhlckFsZzsKKwkJfQorCQllbHNlCisJCXsKKwkJCWlmIChLZXlJZHggPT0gMCkKKwkJCQljc3IxLmZpZWxkLkJzczFLZXkwQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOworCQkJZWxzZSBpZiAoS2V5SWR4ID09IDEpCisJCQkJY3NyMS5maWVsZC5Cc3MxS2V5MUNpcGhlckFsZyA9IENpcGhlckFsZzsKKwkJCWVsc2UgaWYgKEtleUlkeCA9PSAyKQorCQkJCWNzcjEuZmllbGQuQnNzMUtleTJDaXBoZXJBbGcgPSBDaXBoZXJBbGc7CisJCQllbHNlCisJCQkJY3NyMS5maWVsZC5Cc3MxS2V5M0NpcGhlckFsZyA9IENpcGhlckFsZzsKKwkJfQorCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBTSEFSRURfS0VZX01PREVfQkFTRSArIDQgKiAoQnNzSW5kZXggLyAyKSwgY3NyMS53b3JkKTsKKwl9CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT0gQXNpY0FkZEtleUVudHJ5XG4iKSk7Cit9CisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJQWRkIFBhaXItd2lzZSBrZXkgbWF0ZXJpYWwgaW50byBBU0lDLgorCQlVcGRhdGUgcGFpcndpc2Uga2V5LCBUeE1pYyBhbmQgUnhNaWMgdG8gQXNpYyBQYWlyLXdpc2Uga2V5IHRhYmxlCisKKyAgICBSZXR1cm46CisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBBc2ljQWRkUGFpcndpc2VLZXlFbnRyeSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBQVUNIQVIgICAgICAgIHBBZGRyLAorCUlOIFVDSEFSCQlXQ0lELAorCUlOIENJUEhFUl9LRVkJCSAqcENpcGhlcktleSkKK3sKKwlJTlQgaTsKKwlVTE9ORyAJCW9mZnNldDsKKwlQVUNIQVIJCSBwS2V5ID0gcENpcGhlcktleS0+S2V5OworCVBVQ0hBUgkJIHBUeE1pYyA9IHBDaXBoZXJLZXktPlR4TWljOworCVBVQ0hBUgkJIHBSeE1pYyA9IHBDaXBoZXJLZXktPlJ4TWljOworI2lmZGVmIERCRworCVVDSEFSCQlDaXBoZXJBbGcgPSBwQ2lwaGVyS2V5LT5DaXBoZXJBbGc7CisjZW5kaWYgLy8gREJHIC8vCisKKwkvLyBFS0VZCisJb2Zmc2V0ID0gUEFJUldJU0VfS0VZX1RBQkxFX0JBU0UgKyAoV0NJRCAqIEhXX0tFWV9FTlRSWV9TSVpFKTsKKyNpZmRlZiBSVDI4NzAKKwlSVFVTQk11bHRpV3JpdGUocEFkLCBvZmZzZXQsICZwQ2lwaGVyS2V5LT5LZXlbMF0sIE1BWF9MRU5fT0ZfUEVFUl9LRVkpOworI2VuZGlmIC8vIFJUMjg3MCAvLworCWZvciAoaT0wOyBpPE1BWF9MRU5fT0ZfUEVFUl9LRVk7IGkrPTQpCisJeworCQlVSU5UMzIgVmFsdWU7CisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgb2Zmc2V0ICsgaSwgJlZhbHVlKTsKKwl9CisKKwlvZmZzZXQgKz0gTUFYX0xFTl9PRl9QRUVSX0tFWTsKKworCS8vICBNSUMgS0VZCisJaWYgKHBUeE1pYykKKwl7CisjaWZkZWYgUlQyODcwCisJCVJUVVNCTXVsdGlXcml0ZShwQWQsIG9mZnNldCwgJnBDaXBoZXJLZXktPlR4TWljWzBdLCA4KTsKKyNlbmRpZiAvLyBSVDI4NzAgLy8KKwl9CisJb2Zmc2V0ICs9IDg7CisJaWYgKHBSeE1pYykKKwl7CisjaWZkZWYgUlQyODcwCisJCVJUVVNCTXVsdGlXcml0ZShwQWQsIG9mZnNldCwgJnBDaXBoZXJLZXktPlJ4TWljWzBdLCA4KTsKKyNlbmRpZiAvLyBSVDI4NzAgLy8KKwl9CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkFzaWNBZGRQYWlyd2lzZUtleUVudHJ5OiBXQ0lEICMlZCBBbGc9JXNcbiIsV0NJRCwgQ2lwaGVyTmFtZVtDaXBoZXJBbGddKSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCIJS2V5ID0gJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKwkJcEtleVswXSxwS2V5WzFdLHBLZXlbMl0scEtleVszXSxwS2V5WzRdLHBLZXlbNV0scEtleVs2XSxwS2V5WzddLHBLZXlbOF0scEtleVs5XSxwS2V5WzEwXSxwS2V5WzExXSxwS2V5WzEyXSxwS2V5WzEzXSxwS2V5WzE0XSxwS2V5WzE1XSkpOworCWlmIChwUnhNaWMpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIJUnggTUlDIEtleSA9ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKwkJCXBSeE1pY1swXSxwUnhNaWNbMV0scFJ4TWljWzJdLHBSeE1pY1szXSxwUnhNaWNbNF0scFJ4TWljWzVdLHBSeE1pY1s2XSxwUnhNaWNbN10pKTsKKwl9CisJaWYgKHBUeE1pYykKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIglUeCBNSUMgS2V5ID0gJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorCQkJcFR4TWljWzBdLHBUeE1pY1sxXSxwVHhNaWNbMl0scFR4TWljWzNdLHBUeE1pY1s0XSxwVHhNaWNbNV0scFR4TWljWzZdLHBUeE1pY1s3XSkpOworCX0KK30KKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVJlbW92ZSBQYWlyLXdpc2Uga2V5IG1hdGVyaWFsIGZyb20gQVNJQy4KKworICAgIFJldHVybjoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIEFzaWNSZW1vdmVQYWlyd2lzZUtleUVudHJ5KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVDSEFSCQkgQnNzSWR4LAorCUlOIFVDSEFSCQkgV2NpZCkKK3sKKwlVTE9ORwkJV0NJREF0dHJpOworCVVTSE9SVAkJb2Zmc2V0OworCisJLy8gcmUtc2V0IHRoZSBlbnRyeSdzIFdDSUQgYXR0cmlidXRlIGFzIE9QRU4tTk9ORS4KKwlvZmZzZXQgPSBNQUNfV0NJRF9BVFRSSUJVVEVfQkFTRSArIChXY2lkICogSFdfV0NJRF9BVFRSSV9TSVpFKTsKKwlXQ0lEQXR0cmkgPSAoQnNzSWR4PDw0KSB8IFBBSVJXSVNFS0VZVEFCTEU7CisJUlRNUF9JT19XUklURTMyKHBBZCwgb2Zmc2V0LCBXQ0lEQXR0cmkpOworfQorCitCT09MRUFOIEFzaWNTZW5kQ29tbWFuZFRvTWN1KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVDSEFSCQkgQ29tbWFuZCwKKwlJTiBVQ0hBUgkJIFRva2VuLAorCUlOIFVDSEFSCQkgQXJnMCwKKwlJTiBVQ0hBUgkJIEFyZzEpCit7CisJSE9TVF9DTURfQ1NSX1NUUlVDCUgyTUNtZDsKKwlIMk1fTUFJTEJPWF9TVFJVQwlIMk1NYWlsYm94OworCVVMT05HCQkJCWkgPSAwOworCWRvCisJeworCQlSVE1QX0lPX1JFQUQzMihwQWQsIEgyTV9NQUlMQk9YX0NTUiwgJkgyTU1haWxib3gud29yZCk7CisJCWlmIChIMk1NYWlsYm94LmZpZWxkLk93bmVyID09IDApCisJCQlicmVhazsKKworCQlSVE1QdXNlY0RlbGF5KDIpOworCX0gd2hpbGUoaSsrIDwgMTAwKTsKKworCWlmIChpID49IDEwMCkKKwl7CisJCXsKKwkJREJHUFJJTlRfRVJSKCgiSDJNX01BSUxCT1ggc3RpbGwgaG9sZCBieSBNQ1UuIGNvbW1hbmQgZmFpbFxuIikpOworCQl9CisJCXJldHVybiBGQUxTRTsKKwl9CisKKworCUgyTU1haWxib3guZmllbGQuT3duZXIJICA9IDE7CSAgIC8vIHBhc3Mgb3duZXJzaGlwIHRvIE1DVQorCUgyTU1haWxib3guZmllbGQuQ21kVG9rZW4gPSBUb2tlbjsKKwlIMk1NYWlsYm94LmZpZWxkLkhpZ2hCeXRlID0gQXJnMTsKKwlIMk1NYWlsYm94LmZpZWxkLkxvd0J5dGUgID0gQXJnMDsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBIMk1fTUFJTEJPWF9DU1IsIEgyTU1haWxib3gud29yZCk7CisKKwlIMk1DbWQud29yZCAJCQkgID0gMDsKKwlIMk1DbWQuZmllbGQuSG9zdENvbW1hbmQgID0gQ29tbWFuZDsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBIT1NUX0NNRF9DU1IsIEgyTUNtZC53b3JkKTsKKworCWlmIChDb21tYW5kICE9IDB4ODApCisJeworCX0KKworCXJldHVybiBUUlVFOworfQorCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlWZXJpZnkgdGhlIHN1cHBvcnQgcmF0ZSBmb3IgZGlmZmVyZW50IFBIWSB0eXBlCisKKwlBcmd1bWVudHM6CisJCXBBZCAJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlSVE1QQ2hlY2tSYXRlcygKKwlJTgkJUFJUTVBfQURBUFRFUglwQWQsCisJSU4gT1VUCVVDSEFSCQkJU3VwUmF0ZVtdLAorCUlOIE9VVAlVQ0hBUgkJCSpTdXBSYXRlTGVuKQoreworCVVDSEFSCVJhdGVJZHgsIGksIGo7CisJVUNIQVIJTmV3UmF0ZVsxMl0sIE5ld1JhdGVMZW47CisKKwlOZXdSYXRlTGVuID0gMDsKKworCWlmIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUIpCisJCVJhdGVJZHggPSA0OworCWVsc2UKKwkJUmF0ZUlkeCA9IDEyOworCisJLy8gQ2hlY2sgZm9yIHN1cHBvcnQgcmF0ZXMgZXhjbHVkZSBiYXNpYyByYXRlIGJpdAorCWZvciAoaSA9IDA7IGkgPCAqU3VwUmF0ZUxlbjsgaSsrKQorCQlmb3IgKGogPSAwOyBqIDwgUmF0ZUlkeDsgaisrKQorCQkJaWYgKChTdXBSYXRlW2ldICYgMHg3ZikgPT0gUmF0ZUlkVG81MDBLYnBzW2pdKQorCQkJCU5ld1JhdGVbTmV3UmF0ZUxlbisrXSA9IFN1cFJhdGVbaV07CisKKwkqU3VwUmF0ZUxlbiA9IE5ld1JhdGVMZW47CisJTmRpc01vdmVNZW1vcnkoU3VwUmF0ZSwgTmV3UmF0ZSwgTmV3UmF0ZUxlbik7Cit9CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKK0JPT0xFQU4gUlRNUENoZWNrQ2hhbm5lbCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVQ0hBUgkJQ2VudHJhbENoYW5uZWwsCisJSU4gVUNIQVIJCUNoYW5uZWwpCit7CisJVUNIQVIJCWs7CisJVUNIQVIJCVVwcGVyQ2hhbm5lbCA9IDAsIExvd2VyQ2hhbm5lbCA9IDA7CisJVUNIQVIJCU5vRWZmZWN0Q2hhbm5lbGluTGlzdCA9IDA7CisKKwkvLyBGaW5kIHVwcGVyIGFuZCBsb3dlciBjaGFubmVsIGFjY29yZGluZyB0byA0ME1IeiBjdXJyZW50IG9wZXJhdGlvbi4KKwlpZiAoQ2VudHJhbENoYW5uZWwgPCBDaGFubmVsKQorCXsKKwkJVXBwZXJDaGFubmVsID0gQ2hhbm5lbDsKKwkJaWYgKENlbnRyYWxDaGFubmVsID4gMikKKwkJCUxvd2VyQ2hhbm5lbCA9IENlbnRyYWxDaGFubmVsIC0gMjsKKwkJZWxzZQorCQkJcmV0dXJuIEZBTFNFOworCX0KKwllbHNlIGlmIChDZW50cmFsQ2hhbm5lbCA+IENoYW5uZWwpCisJeworCQlVcHBlckNoYW5uZWwgPSBDZW50cmFsQ2hhbm5lbCArIDI7CisJCUxvd2VyQ2hhbm5lbCA9IENoYW5uZWw7CisJfQorCisJZm9yIChrID0gMDtrIDwgcEFkLT5DaGFubmVsTGlzdE51bTtrKyspCisJeworCQlpZiAocEFkLT5DaGFubmVsTGlzdFtrXS5DaGFubmVsID09IFVwcGVyQ2hhbm5lbCkKKwkJeworCQkJTm9FZmZlY3RDaGFubmVsaW5MaXN0ICsrOworCQl9CisJCWlmIChwQWQtPkNoYW5uZWxMaXN0W2tdLkNoYW5uZWwgPT0gTG93ZXJDaGFubmVsKQorCQl7CisJCQlOb0VmZmVjdENoYW5uZWxpbkxpc3QgKys7CisJCX0KKwl9CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlRvdGFsIENoYW5uZWwgaW4gQ2hhbm5lbCBMaXN0ID0gWyVkXVxuIiwgTm9FZmZlY3RDaGFubmVsaW5MaXN0KSk7CisJaWYgKE5vRWZmZWN0Q2hhbm5lbGluTGlzdCA9PSAyKQorCQlyZXR1cm4gVFJVRTsKKwllbHNlCisJCXJldHVybiBGQUxTRTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVZlcmlmeSB0aGUgc3VwcG9ydCByYXRlIGZvciBIVCBwaHkgdHlwZQorCisJQXJndW1lbnRzOgorCQlwQWQgCQkJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKworCVJldHVybiBWYWx1ZToKKwkJRkFMU0UgaWYgcEFkLT5Db21tb25DZmcuU3VwcG9ydGVkSHRQaHkgZG9lc24ndCBhY2NlcHQgdGhlIHBIdENhcGFiaWxpdHkuICAoQVAgTW9kZSkKKworCUlSUUwgPSBQQVNTSVZFX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitCT09MRUFOIAlSVE1QQ2hlY2tIdCgKKwlJTglQUlRNUF9BREFQVEVSCQkJcEFkLAorCUlOCVVDSEFSCQkJCQlXY2lkLAorCUlOIAlIVF9DQVBBQklMSVRZX0lFCQkqcEh0Q2FwYWJpbGl0eSwKKwlJTiAJQUREX0hUX0lORk9fSUUJCQkqcEFkZEh0SW5mbykKK3sKKwlpZiAoV2NpZCA+PSBNQVhfTEVOX09GX01BQ19UQUJMRSkKKwkJcmV0dXJuIEZBTFNFOworCisJLy8gSWYgdXNlIEFNU0RVLCBzZXQgZmxhZy4KKwlpZiAocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkFtc2R1RW5hYmxlKQorCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKCZwQWQtPk1hY1RhYi5Db250ZW50W1djaWRdLCBmQ0xJRU5UX1NUQVRVU19BTVNEVV9JTlVTRUQpOworCS8vIFNhdmUgUGVlciBDYXBhYmlsaXR5CisJaWYgKHBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5TaG9ydEdJZm9yMjApCisJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcoJnBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0sIGZDTElFTlRfU1RBVFVTX1NHSTIwX0NBUEFCTEUpOworCWlmIChwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uU2hvcnRHSWZvcjQwKQorCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKCZwQWQtPk1hY1RhYi5Db250ZW50W1djaWRdLCBmQ0xJRU5UX1NUQVRVU19TR0k0MF9DQVBBQkxFKTsKKwlpZiAocEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLlR4U1RCQykKKwkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRygmcEFkLT5NYWNUYWIuQ29udGVudFtXY2lkXSwgZkNMSUVOVF9TVEFUVVNfVHhTVEJDX0NBUEFCTEUpOworCWlmIChwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uUnhTVEJDKQorCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKCZwQWQtPk1hY1RhYi5Db250ZW50W1djaWRdLCBmQ0xJRU5UX1NUQVRVU19SeFNUQkNfQ0FQQUJMRSk7CisJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJSZGcgJiYgcEh0Q2FwYWJpbGl0eS0+RXh0SHRDYXBJbmZvLlJER1N1cHBvcnQpCisJeworCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKCZwQWQtPk1hY1RhYi5Db250ZW50W1djaWRdLCBmQ0xJRU5UX1NUQVRVU19SREdfQ0FQQUJMRSk7CisJfQorCisJaWYgKFdjaWQgPCBNQVhfTEVOX09GX01BQ19UQUJMRSkKKwl7CisJCXBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0uTXBkdURlbnNpdHkgPSBwSHRDYXBhYmlsaXR5LT5IdENhcFBhcm0uTXBkdURlbnNpdHk7CisJfQorCisJLy8gV2lsbCBjaGVjayBDaGFubmVsV2lkdGggZm9yIE1DU1NldFs0XSBiZWxvdworCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuTUNTU2V0WzRdID0gMHgxOworICAgIHN3aXRjaCAocEFkLT5Db21tb25DZmcuUnhTdHJlYW0pCisJeworCQljYXNlIDE6CisJCQlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lk1DU1NldFswXSA9IDB4ZmY7CisJCQlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lk1DU1NldFsxXSA9IDB4MDA7CisgICAgICAgICAgICBwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lk1DU1NldFsyXSA9IDB4MDA7CisgICAgICAgICAgICBwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lk1DU1NldFszXSA9IDB4MDA7CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMF0gPSAweGZmOworCQkJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMV0gPSAweGZmOworICAgICAgICAgICAgcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMl0gPSAweDAwOworICAgICAgICAgICAgcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5NQ1NTZXRbM10gPSAweDAwOworCQkJYnJlYWs7CisJCWNhc2UgMzoKKwkJCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuTUNTU2V0WzBdID0gMHhmZjsKKwkJCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuTUNTU2V0WzFdID0gMHhmZjsKKyAgICAgICAgICAgIHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuTUNTU2V0WzJdID0gMHhmZjsKKyAgICAgICAgICAgIHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuTUNTU2V0WzNdID0gMHgwMDsKKwkJCWJyZWFrOworCX0KKworCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkNoYW5uZWxXaWR0aCA9IHBBZGRIdEluZm8tPkFkZEh0SW5mby5SZWNvbVdpZHRoICYgcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkNoYW5uZWxXaWR0aDsKKworICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJUTVBDaGVja0h0OjogSHRDYXBJbmZvLkNoYW5uZWxXaWR0aD0lZCwgUmVjb21XaWR0aD0lZCwgRGVzaXJlZEh0UGh5LkNoYW5uZWxXaWR0aD0lZCwgQlc0ME1BdmFpbEZvckEvRz0lZC8lZCwgUGh5TW9kZT0lZCBcbiIsCisJCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkNoYW5uZWxXaWR0aCwgcEFkZEh0SW5mby0+QWRkSHRJbmZvLlJlY29tV2lkdGgsIHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5DaGFubmVsV2lkdGgsCisJCXBBZC0+TmljQ29uZmlnMi5maWVsZC5CVzQwTUF2YWlsRm9yQSwgcEFkLT5OaWNDb25maWcyLmZpZWxkLkJXNDBNQXZhaWxGb3JHLCBwQWQtPkNvbW1vbkNmZy5QaHlNb2RlKSk7CisKKwlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5HRiA9ICBwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uR0YgJnBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5HRjsKKworCS8vIFNlbmQgQXNzb2MgUmVxIHdpdGggbXkgSFQgY2FwYWJpbGl0eS4KKwlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5BTXNkdVNpemUgPSAgcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkFtc2R1U2l6ZTsKKwlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5NaW1vUHMgPSAgcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5Lk1pbW9QczsKKwlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5TaG9ydEdJZm9yMjAgPSAgKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5TaG9ydEdJZm9yMjApICYgKHBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5TaG9ydEdJZm9yMjApOworCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLlNob3J0R0lmb3I0MCA9ICAocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LlNob3J0R0lmb3I0MCkgJiAocEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLlNob3J0R0lmb3I0MCk7CisJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uVHhTVEJDID0gIChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuVHhTVEJDKSYocEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLlJ4U1RCQyk7CisJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uUnhTVEJDID0gIChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuUnhTVEJDKSYocEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLlR4U1RCQyk7CisJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5IdENhcFBhcm0uTWF4UkFtcGR1RmFjdG9yID0gcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5Lk1heFJBbXBkdUZhY3RvcjsKKyAgICBwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwUGFybS5NcGR1RGVuc2l0eSA9IHBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcFBhcm0uTXBkdURlbnNpdHk7CisJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5FeHRIdENhcEluZm8uUGx1c0hUQyA9IHBIdENhcGFiaWxpdHktPkV4dEh0Q2FwSW5mby5QbHVzSFRDOworCXBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0uSFRDYXBhYmlsaXR5LkV4dEh0Q2FwSW5mby5QbHVzSFRDID0gcEh0Q2FwYWJpbGl0eS0+RXh0SHRDYXBJbmZvLlBsdXNIVEM7CisJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJSZGcpCisJeworCQlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5LkV4dEh0Q2FwSW5mby5SREdTdXBwb3J0ID0gcEh0Q2FwYWJpbGl0eS0+RXh0SHRDYXBJbmZvLlJER1N1cHBvcnQ7CisgICAgICAgIHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuRXh0SHRDYXBJbmZvLlBsdXNIVEMgPSAxOworCX0KKworICAgIGlmIChwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5DaGFubmVsV2lkdGggPT0gQldfMjApCisgICAgICAgIHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuTUNTU2V0WzRdID0gMHgwOyAgLy8gQlcyMCBjYW4ndCB0cmFuc21pdCBNQ1MzMgorCisJQ09QWV9BUF9IVFNFVFRJTkdTX0ZST01fQkVBQ09OKHBBZCwgcEh0Q2FwYWJpbGl0eSk7CisJcmV0dXJuIFRSVUU7Cit9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlWZXJpZnkgdGhlIHN1cHBvcnQgcmF0ZSBmb3IgZGlmZmVyZW50IFBIWSB0eXBlCisKKwlBcmd1bWVudHM6CisJCXBBZCAJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBSVE1QVXBkYXRlTWxtZVJhdGUoCisJSU4gUFJUTVBfQURBUFRFUglwQWQpCit7CisJVUNIQVIJTWluaW11bVJhdGU7CisJVUNIQVIJUHJvcGVyTWxtZVJhdGU7IC8vPSBSQVRFXzU0OworCVVDSEFSCWksIGosIFJhdGVJZHggPSAxMjsgLy8xLCAyLCA1LjUsIDExLCA2LCA5LCAxMiwgMTgsIDI0LCAzNiwgNDgsIDU0CisJQk9PTEVBTgliTWF0Y2ggPSBGQUxTRTsKKworCXN3aXRjaCAocEFkLT5Db21tb25DZmcuUGh5TW9kZSkKKwl7CisJCWNhc2UgUEhZXzExQjoKKwkJCVByb3Blck1sbWVSYXRlID0gUkFURV8xMTsKKwkJCU1pbmltdW1SYXRlID0gUkFURV8xOworCQkJYnJlYWs7CisJCWNhc2UgUEhZXzExQkdfTUlYRUQ6CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCWNhc2UgUEhZXzExQUJHTl9NSVhFRDoKKwkJY2FzZSBQSFlfMTFCR05fTUlYRUQ6CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCQlpZiAoKHBBZC0+TWxtZUF1eC5TdXBSYXRlTGVuID09IDQpICYmCisJCQkJKHBBZC0+TWxtZUF1eC5FeHRSYXRlTGVuID09IDApKQorCQkJCS8vIEIgb25seSBBUAorCQkJCVByb3Blck1sbWVSYXRlID0gUkFURV8xMTsKKwkJCWVsc2UKKwkJCQlQcm9wZXJNbG1lUmF0ZSA9IFJBVEVfMjQ7CisKKwkJCWlmIChwQWQtPk1sbWVBdXguQ2hhbm5lbCA8PSAxNCkKKwkJCQlNaW5pbXVtUmF0ZSA9IFJBVEVfMTsKKwkJCWVsc2UKKwkJCQlNaW5pbXVtUmF0ZSA9IFJBVEVfNjsKKwkJCWJyZWFrOworCQljYXNlIFBIWV8xMUE6CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCWNhc2UgUEhZXzExTl8yXzRHOgkvLyBydDI4NjAgbmVlZCB0byBjaGVjayBtbG1lcmF0ZSBmb3IgODAyLjExbgorCQljYXNlIFBIWV8xMUdOX01JWEVEOgorCQljYXNlIFBIWV8xMUFHTl9NSVhFRDoKKwkJY2FzZSBQSFlfMTFBTl9NSVhFRDoKKwkJY2FzZSBQSFlfMTFOXzVHOgorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQkJUHJvcGVyTWxtZVJhdGUgPSBSQVRFXzI0OworCQkJTWluaW11bVJhdGUgPSBSQVRFXzY7CisJCQlicmVhazsKKwkJY2FzZSBQSFlfMTFBQkdfTUlYRUQ6CisJCQlQcm9wZXJNbG1lUmF0ZSA9IFJBVEVfMjQ7CisJCQlpZiAocEFkLT5NbG1lQXV4LkNoYW5uZWwgPD0gMTQpCisJCQkgICBNaW5pbXVtUmF0ZSA9IFJBVEVfMTsKKwkJCWVsc2UKKwkJCQlNaW5pbXVtUmF0ZSA9IFJBVEVfNjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OiAvLyBlcnJvcgorCQkJUHJvcGVyTWxtZVJhdGUgPSBSQVRFXzE7CisJCQlNaW5pbXVtUmF0ZSA9IFJBVEVfMTsKKwkJCWJyZWFrOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBwQWQtPk1sbWVBdXguU3VwUmF0ZUxlbjsgaSsrKQorCXsKKwkJZm9yIChqID0gMDsgaiA8IFJhdGVJZHg7IGorKykKKwkJeworCQkJaWYgKChwQWQtPk1sbWVBdXguU3VwUmF0ZVtpXSAmIDB4N2YpID09IFJhdGVJZFRvNTAwS2Jwc1tqXSkKKwkJCXsKKwkJCQlpZiAoaiA9PSBQcm9wZXJNbG1lUmF0ZSkKKwkJCQl7CisJCQkJCWJNYXRjaCA9IFRSVUU7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfQorCisJCWlmIChiTWF0Y2gpCisJCQlicmVhazsKKwl9CisKKwlpZiAoYk1hdGNoID09IEZBTFNFKQorCXsKKwkJZm9yIChpID0gMDsgaSA8IHBBZC0+TWxtZUF1eC5FeHRSYXRlTGVuOyBpKyspCisJCXsKKwkJCWZvciAoaiA9IDA7IGogPCBSYXRlSWR4OyBqKyspCisJCQl7CisJCQkJaWYgKChwQWQtPk1sbWVBdXguRXh0UmF0ZVtpXSAmIDB4N2YpID09IFJhdGVJZFRvNTAwS2Jwc1tqXSkKKwkJCQl7CisJCQkJCWlmIChqID09IFByb3Blck1sbWVSYXRlKQorCQkJCQl7CisJCQkJCQliTWF0Y2ggPSBUUlVFOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisJCQl9CisKKwkJCWlmIChiTWF0Y2gpCisJCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoYk1hdGNoID09IEZBTFNFKQorCXsKKwkJUHJvcGVyTWxtZVJhdGUgPSBNaW5pbXVtUmF0ZTsKKwl9CisKKwlwQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZSA9IE1pbmltdW1SYXRlOworCXBBZC0+Q29tbW9uQ2ZnLlJ0c1JhdGUgPSBQcm9wZXJNbG1lUmF0ZTsKKwlpZiAocEFkLT5Db21tb25DZmcuTWxtZVJhdGUgPj0gUkFURV82KQorCXsKKwkJcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1PREUgPSBNT0RFX09GRE07CisJCXBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NQ1MgPSBPZmRtUmF0ZVRvUnh3aU1DU1twQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZV07CisJCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTME1jYXN0X1dDSURdLkhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9PRkRNOworCQlwQWQtPk1hY1RhYi5Db250ZW50W0JTUzBNY2FzdF9XQ0lEXS5IVFBoeU1vZGUuZmllbGQuTUNTID0gT2ZkbVJhdGVUb1J4d2lNQ1NbcEFkLT5Db21tb25DZmcuTWxtZVJhdGVdOworCX0KKwllbHNlCisJeworCQlwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTU9ERSA9IE1PREVfQ0NLOworCQlwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTUNTID0gcEFkLT5Db21tb25DZmcuTWxtZVJhdGU7CisJCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTME1jYXN0X1dDSURdLkhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9DQ0s7CisJCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTME1jYXN0X1dDSURdLkhUUGh5TW9kZS5maWVsZC5NQ1MgPSBwQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZTsKKwl9CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVE1QVXBkYXRlTWxtZVJhdGUgPT0+ICAgTWxtZVRyYW5zbWl0ID0gMHgleCAgXG4iICwgcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LndvcmQpKTsKK30KKworQ0hBUiBSVE1QTWF4UnNzaSgKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiBDSEFSCQkJCVJzc2kwLAorCUlOIENIQVIJCQkJUnNzaTEsCisJSU4gQ0hBUgkJCQlSc3NpMikKK3sKKwlDSEFSCWxhcmdlciA9IC0xMjc7CisKKwlpZiAoKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPT0gMSkgJiYgKFJzc2kwICE9IDApKQorCXsKKwkJbGFyZ2VyID0gUnNzaTA7CisJfQorCisJaWYgKChwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID49IDIpICYmIChSc3NpMSAhPSAwKSkKKwl7CisJCWxhcmdlciA9IG1heChSc3NpMCwgUnNzaTEpOworCX0KKworCWlmICgocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAzKSAmJiAoUnNzaTIgIT0gMCkpCisJeworCQlsYXJnZXIgPSBtYXgobGFyZ2VyLCBSc3NpMik7CisJfQorCisJaWYgKGxhcmdlciA9PSAtMTI3KQorCQlsYXJnZXIgPSAwOworCisJcmV0dXJuIGxhcmdlcjsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgICAgICBQZXJpb2RpYyBldmFsdWF0ZSBhbnRlbm5hIGxpbmsgc3RhdHVzCisKKyAgICBBcmd1bWVudHM6CisgICAgICAgIHBBZCAgICAgICAgIC0gQWRhcHRlciBwb2ludGVyCisKKyAgICBSZXR1cm4gVmFsdWU6CisgICAgICAgIE5vbmUKKworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgQXNpY0V2YWx1YXRlUnhBbnQoCisJSU4gUFJUTVBfQURBUFRFUglwQWQpCit7CisJVUNIQVIJQkJQUjMgPSAwOworCisjaWZkZWYgUkFMSU5LX0FURQorCWlmIChBVEVfT04ocEFkKSkKKwkJcmV0dXJuOworI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwl7CisJCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkVTRVRfSU5fUFJPR1JFU1MJfAorCQkJCQkJCQlmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MJfAorCQkJCQkJCQlmUlRNUF9BREFQVEVSX1JBRElPX09GRgkJCXwKKwkJCQkJCQkJZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUCQl8CisJCQkJCQkJCWZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpKQorCQkJcmV0dXJuOworCisJCWlmIChwQWQtPlN0YUNmZy5Qc20gPT0gUFdSX1NBVkUpCisJCQlyZXR1cm47CisJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCAmQkJQUjMpOworCUJCUFIzICY9ICh+MHgxOCk7CisJaWYocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAzKQorCXsKKwkJQkJQUjMgfD0gKDB4MTApOworCX0KKwllbHNlIGlmKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPT0gMikKKwl7CisJCUJCUFIzIHw9ICgweDgpOworCX0KKwllbHNlIGlmKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPT0gMSkKKwl7CisJCUJCUFIzIHw9ICgweDApOworCX0KKwlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCBCQlBSMyk7CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKQorCQkpCisJeworCQlVTE9ORwlUeFRvdGFsQ250ID0gcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeE5vUmV0cnlPa0NvdW50ICsKKwkJCQkJCQkJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeFJldHJ5T2tDb3VudCArCisJCQkJCQkJCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhGYWlsQ291bnQ7CisKKwkJaWYgKFR4VG90YWxDbnQgPiA1MCkKKwkJeworCQkJUlRNUFNldFRpbWVyKCZwQWQtPk1sbWUuUnhBbnRFdmFsVGltZXIsIDIwKTsKKwkJCXBBZC0+TWxtZS5iTG93VGhyb3VnaHB1dCA9IEZBTFNFOworCQl9CisJCWVsc2UKKwkJeworCQkJUlRNUFNldFRpbWVyKCZwQWQtPk1sbWUuUnhBbnRFdmFsVGltZXIsIDMwMCk7CisJCQlwQWQtPk1sbWUuYkxvd1Rocm91Z2hwdXQgPSBUUlVFOworCQl9CisJfQorfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFJvdXRpbmUgRGVzY3JpcHRpb246CisgICAgICAgIEFmdGVyIGV2YWx1YXRpb24sIGNoZWNrIGFudGVubmEgbGluayBzdGF0dXMKKworICAgIEFyZ3VtZW50czoKKyAgICAgICAgcEFkICAgICAgICAgLSBBZGFwdGVyIHBvaW50ZXIKKworICAgIFJldHVybiBWYWx1ZToKKyAgICAgICAgTm9uZQorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBBc2ljUnhBbnRFdmFsVGltZW91dCgKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCisJSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpCit7CisJUlRNUF9BREFQVEVSCSpwQWQgPSAoUlRNUF9BREFQVEVSICopRnVuY3Rpb25Db250ZXh0OworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCVVDSEFSCQkJQkJQUjMgPSAwOworCUNIQVIJCQlsYXJnZXIgPSAtMTI3LCByc3NpMCwgcnNzaTEsIHJzc2kyOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisjaWZkZWYgUkFMSU5LX0FURQorCWlmIChBVEVfT04ocEFkKSkKKwkJcmV0dXJuOworI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwl7CisJCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkVTRVRfSU5fUFJPR1JFU1MpCXx8CisJCQlSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUykJCXx8CisJCQlSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkFESU9fT0ZGKQkJCXx8CisJCQlSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpCisJCQlyZXR1cm47CisKKwkJaWYgKHBBZC0+U3RhQ2ZnLlBzbSA9PSBQV1JfU0FWRSkKKwkJCXJldHVybjsKKworCisJCS8vIGlmIHRoZSB0cmFmZmljIGlzIGxvdywgdXNlIGF2ZXJhZ2UgcnNzaSBhcyB0aGUgY3JpdGVyaWEKKwkJaWYgKHBBZC0+TWxtZS5iTG93VGhyb3VnaHB1dCA9PSBUUlVFKQorCQl7CisJCQlyc3NpMCA9IHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kwOworCQkJcnNzaTEgPSBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMTsKKwkJCXJzc2kyID0gcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTI7CisJCX0KKwkJZWxzZQorCQl7CisJCQlyc3NpMCA9IHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTA7CisJCQlyc3NpMSA9IHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTE7CisJCQlyc3NpMiA9IHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTI7CisJCX0KKworCQlpZihwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDMpCisJCXsKKwkJCWxhcmdlciA9IG1heChyc3NpMCwgcnNzaTEpOworCisJCQlpZiAobGFyZ2VyID4gKHJzc2kyICsgMjApKQorCQkJCXBBZC0+TWxtZS5SZWFsUnhQYXRoID0gMjsKKwkJCWVsc2UKKwkJCQlwQWQtPk1sbWUuUmVhbFJ4UGF0aCA9IDM7CisJCX0KKwkJZWxzZSBpZihwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDIpCisJCXsKKwkJCWlmIChyc3NpMCA+IChyc3NpMSArIDIwKSkKKwkJCQlwQWQtPk1sbWUuUmVhbFJ4UGF0aCA9IDE7CisJCQllbHNlCisJCQkJcEFkLT5NbG1lLlJlYWxSeFBhdGggPSAyOworCQl9CisKKwkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCAmQkJQUjMpOworCQlCQlBSMyAmPSAofjB4MTgpOworCQlpZihwQWQtPk1sbWUuUmVhbFJ4UGF0aCA9PSAzKQorCQl7CisJCQlCQlBSMyB8PSAoMHgxMCk7CisJCX0KKwkJZWxzZSBpZihwQWQtPk1sbWUuUmVhbFJ4UGF0aCA9PSAyKQorCQl7CisJCQlCQlBSMyB8PSAoMHg4KTsKKwkJfQorCQllbHNlIGlmKHBBZC0+TWxtZS5SZWFsUnhQYXRoID09IDEpCisJCXsKKwkJCUJCUFIzIHw9ICgweDApOworCQl9CisJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsIEJCUFIzKTsKKwl9CisKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworfQorCisKKworVk9JRCBBUFNEUGVyaW9kaWNFeGVjKAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKKwlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMykKK3sKKwlSVE1QX0FEQVBURVIgKnBBZCA9IChSVE1QX0FEQVBURVIgKilGdW5jdGlvbkNvbnRleHQ7CisKKwlpZiAoIU9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSkKKwkJcmV0dXJuOworCisJcEFkLT5Db21tb25DZmcuVHJpZ2dlclRpbWVyQ291bnQrKzsKKworLy8gRHJpdmVyIHNob3VsZCBub3Qgc2VuZCB0cmlnZ2VyIGZyYW1lLCBpdCBzaG91bGQgYmUgc2VuZCBieSBhcHBsaWNhdGlvbiBsYXllcgorLyoKKwlpZiAocEFkLT5Db21tb25DZmcuYkFQU0RDYXBhYmxlICYmIHBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uYkFQU0RDYXBhYmxlCisJCSYmIChwQWQtPkNvbW1vbkNmZy5iTmVlZFNlbmRUcmlnZ2VyRnJhbWUgfHwKKwkJKCgocEFkLT5Db21tb25DZmcuVHJpZ2dlclRpbWVyQ291bnQlMjApID09IDE5KSAmJiAoIXBBZC0+Q29tbW9uQ2ZnLmJBUFNEQUNfQkUgfHwgIXBBZC0+Q29tbW9uQ2ZnLmJBUFNEQUNfQksgfHwgIXBBZC0+Q29tbW9uQ2ZnLmJBUFNEQUNfVkkgfHwgIXBBZC0+Q29tbW9uQ2ZnLmJBUFNEQUNfVk8pKSkpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlNlbmRpbmcgdHJpZ2dlciBmcmFtZSBhbmQgZW50ZXIgc2VydmljZSBwZXJpb2Qgd2hlbiBzdXBwb3J0IEFQU0RcbiIpKTsKKwkJUlRNUFNlbmROdWxsRnJhbWUocEFkLCBwQWQtPkNvbW1vbkNmZy5UeFJhdGUsIFRSVUUpOworCQlwQWQtPkNvbW1vbkNmZy5iTmVlZFNlbmRUcmlnZ2VyRnJhbWUgPSBGQUxTRTsKKwkJcEFkLT5Db21tb25DZmcuVHJpZ2dlclRpbWVyQ291bnQgPSAwOworCQlwQWQtPkNvbW1vbkNmZy5iSW5TZXJ2aWNlUGVyaW9kID0gVFJVRTsKKwl9Ki8KK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQvcmVzZXQgTUFDIHJlZ2lzdGVycyBhY2NvcmRpbmcgdG8gYlBpZ2d5QmFjayBwYXJhbWV0ZXIKKworICAgIEFyZ3VtZW50czoKKyAgICAgICAgcEFkICAgICAgICAgLSBBZGFwdGVyIHBvaW50ZXIKKyAgICAgICAgYlBpZ2d5QmFjayAgLSBFbmFibGUgLyBEaXNhYmxlIFBpZ2d5LUJhY2sKKworICAgIFJldHVybiBWYWx1ZToKKyAgICAgICAgTm9uZQorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBSVE1QU2V0UGlnZ3lCYWNrKAorICAgIElOIFBSVE1QX0FEQVBURVIgICAgcEFkLAorICAgIElOIEJPT0xFQU4gICAgICAgICAgYlBpZ2d5QmFjaykKK3sKKwlUWF9MSU5LX0NGR19TVFJVQyAgVHhMaW5rQ2ZnOworCisJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9MSU5LX0NGRywgJlR4TGlua0NmZy53b3JkKTsKKworCVR4TGlua0NmZy5maWVsZC5UeENGQWNrRW4gPSBiUGlnZ3lCYWNrOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX0xJTktfQ0ZHLCBUeExpbmtDZmcud29yZCk7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICAgICAgY2hlY2sgaWYgdGhpcyBlbnRyeSBuZWVkIHRvIHN3aXRjaCByYXRlIGF1dG9tYXRpY2FsbHkKKworICAgIEFyZ3VtZW50czoKKyAgICAgICAgcEFkCisgICAgICAgIHBFbnRyeQorCisgICAgUmV0dXJuIFZhbHVlOgorICAgICAgICBUVVJFCisgICAgICAgIEZBTFNFCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitCT09MRUFOIFJUTVBDaGVja0VudHJ5RW5hYmxlQXV0b1JhdGVTd2l0Y2goCisJSU4gUFJUTVBfQURBUFRFUiAgICBwQWQsCisJSU4gUE1BQ19UQUJMRV9FTlRSWQlwRW50cnkpCit7CisJQk9PTEVBTgkJcmVzdWx0ID0gVFJVRTsKKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwl7CisJCS8vIG9ubHkgYXNzb2NpYXRlZCBTVEEgY291bnRzCisJCWlmIChwRW50cnkgJiYgKHBFbnRyeS0+VmFsaWRBc0NMSSkgJiYgKHBFbnRyeS0+U3N0ID09IFNTVF9BU1NPQykpCisJCXsKKwkJCXJlc3VsdCA9IHBBZC0+U3RhQ2ZnLmJBdXRvVHhSYXRlU3dpdGNoOworCQl9CisJCWVsc2UKKwkJCXJlc3VsdCA9IEZBTFNFOworCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJCWlmIChwRW50cnkgJiYgKHBFbnRyeS0+VmFsaWRBc0RscykpCisJCQlyZXN1bHQgPSBwQWQtPlN0YUNmZy5iQXV0b1R4UmF0ZVN3aXRjaDsKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKworCisJcmV0dXJuIHJlc3VsdDsKK30KKworCitCT09MRUFOIFJUTVBBdXRvUmF0ZVN3aXRjaENoZWNrKAorCUlOIFBSVE1QX0FEQVBURVIgICAgcEFkKQoreworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwl7CisJCWlmIChwQWQtPlN0YUNmZy5iQXV0b1R4UmF0ZVN3aXRjaCkKKwkJCXJldHVybiBUUlVFOworCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwlyZXR1cm4gRkFMU0U7Cit9CisKKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgICAgICBjaGVjayBpZiB0aGlzIGVudHJ5IG5lZWQgdG8gZml4IHR4IGxlZ2FjeSByYXRlCisKKyAgICBBcmd1bWVudHM6CisgICAgICAgIHBBZAorICAgICAgICBwRW50cnkKKworICAgIFJldHVybiBWYWx1ZToKKyAgICAgICAgVFVSRQorICAgICAgICBGQUxTRQorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVUNIQVIgUlRNUFN0YUZpeGVkVHhNb2RlKAorCUlOIFBSVE1QX0FEQVBURVIgICAgcEFkLAorCUlOIFBNQUNfVEFCTEVfRU5UUlkJcEVudHJ5KQoreworCVVDSEFSCXR4X21vZGUgPSBGSVhFRF9UWE1PREVfSFQ7CisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJeworCQl0eF9tb2RlID0gKFVDSEFSKXBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuRml4ZWRUeE1vZGU7CisJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJcmV0dXJuIHR4X21vZGU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICAgICAgT3ZlcndyaXRlIEhUIFR4IE1vZGUgYnkgRml4ZWQgTGVnZW5jeSBUeCBNb2RlLCBpZiBzcGVjaWZpZWQuCisKKyAgICBBcmd1bWVudHM6CisgICAgICAgIHBBZAorICAgICAgICBwRW50cnkKKworICAgIFJldHVybiBWYWx1ZToKKyAgICAgICAgVFVSRQorICAgICAgICBGQUxTRQorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBSVE1QVXBkYXRlTGVnYWN5VHhTZXR0aW5nKAorCQlVQ0hBUgkJCQlmaXhlZF90eF9tb2RlLAorCQlQTUFDX1RBQkxFX0VOVFJZCXBFbnRyeSkKK3sKKwlIVFRSQU5TTUlUX1NFVFRJTkcgVHJhbnNtaXRTZXR0aW5nOworCisJaWYgKGZpeGVkX3R4X21vZGUgPT0gRklYRURfVFhNT0RFX0hUKQorCQlyZXR1cm47CisKKwlUcmFuc21pdFNldHRpbmcud29yZCA9IDA7CisKKwlUcmFuc21pdFNldHRpbmcuZmllbGQuTU9ERSA9IHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1PREU7CisJVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1DUzsKKworCWlmIChmaXhlZF90eF9tb2RlID09IEZJWEVEX1RYTU9ERV9DQ0spCisJeworCQlUcmFuc21pdFNldHRpbmcuZmllbGQuTU9ERSA9IE1PREVfQ0NLOworCQkvLyBDQ0sgbW9kZSBhbGxvdyBNQ1MgMH4zCisJCWlmIChUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID4gTUNTXzMpCisJCQlUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTXzM7CisJfQorCWVsc2UKKwl7CisJCVRyYW5zbWl0U2V0dGluZy5maWVsZC5NT0RFID0gTU9ERV9PRkRNOworCQkvLyBPRkRNIG1vZGUgYWxsb3cgTUNTIDB+NworCQlpZiAoVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA+IE1DU183KQorCQkJVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU183OworCX0KKworCWlmIChwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NT0RFID49IFRyYW5zbWl0U2V0dGluZy5maWVsZC5NT0RFKQorCXsKKwkJcEVudHJ5LT5IVFBoeU1vZGUud29yZCA9IFRyYW5zbWl0U2V0dGluZy53b3JkOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVE1QVXBkYXRlTGVnYWN5VHhTZXR0aW5nIDogd2NpZC0lZCwgTU9ERT0lcywgTUNTPSVkIFxuIiwKKwkJCQlwRW50cnktPkFpZCwgR2V0UGh5TW9kZShwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NT0RFKSwgcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTKSk7CisJfQorfQorCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCWR5bmFtaWMgdHVuZSBCQlAgUjY2IHRvIGZpbmQgYSBiYWxhbmNlIGJldHdlZW4gc2Vuc2liaWxpdHkgYW5kCisJCW5vaXNlIGlzb2xhdGlvbgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIEFzaWNTdGFCYnBUdW5pbmcoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJVUNIQVIJT3JpZ1I2NlZhbHVlID0gMCwgUjY2Oy8vLCBSNjZVcHBlckJvdW5kID0gMHgzMCwgUjY2TG93ZXJCb3VuZCA9IDB4MzA7CisJQ0hBUglSc3NpOworCisJLy8gMjg2MEMgZGlkIG5vdCBzdXBwb3J0IEZhc2UgQ0NBLCB0aGVyZWZvcmUgY2FuJ3QgdHVuZQorCWlmIChwQWQtPk1BQ1ZlcnNpb24gPT0gMHgyODYwMDEwMCkKKwkJcmV0dXJuOworCisJLy8KKwkvLyB3b3JrIGFzIGEgU1RBCisJLy8KKwlpZiAocEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSAhPSBDTlRMX0lETEUpICAvLyBubyBSNjYgdHVuaW5nIHdoZW4gU0NBTk5JTkcKKwkJcmV0dXJuOworCisJaWYgKChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKQorCQkmJiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpCisJCQkpCisJCSYmICEoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKSkKKwkJKQorCXsKKwkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I2NiwgJk9yaWdSNjZWYWx1ZSk7CisJCVI2NiA9IE9yaWdSNjZWYWx1ZTsKKworCQlpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA+IDEpCisJCQlSc3NpID0gKHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTAgKyBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kxKSA+PiAxOworCQllbHNlCisJCQlSc3NpID0gcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMDsKKworCQlpZiAocEFkLT5MYXRjaFJmUmVncy5DaGFubmVsIDw9IDE0KQorCQl7CS8vQkcgYmFuZAorI2lmZGVmIFJUMjg3MAorCQkJLy8gUlQzMDcwIGlzIGEgbm8gTE5BIHNvbHV0aW9uLCBpdCBzaG91bGQgaGF2ZSBkaWZmZXJlbnQgY29udHJvbCByZWdhcmRpbmcgdG8gQUdDIGdhaW4gY29udHJvbAorCQkJLy8gT3RoZXJ3aXNlLCBpdCB3aWxsIGhhdmUgc29tZSB0aHJvdWdocHV0IHNpZGUgZWZmZWN0IHdoZW4gbG93IFJTU0kKKwkJCWlmIChJU19SVDMwNzAocEFkKSkKKwkJCXsKKwkJCQlpZiAoUnNzaSA+IFJTU0lfRk9SX01JRF9MT1dfU0VOU0lCSUxJVFkpCisJCQkJeworCQkJCQlSNjYgPSAweDFDICsgMipHRVRfTE5BX0dBSU4ocEFkKSArIDB4MjA7CisJCQkJCWlmIChPcmlnUjY2VmFsdWUgIT0gUjY2KQorCQkJCQl7CisJCQkJCQlSVFVTQldyaXRlQkJQUmVnaXN0ZXIocEFkLCBCQlBfUjY2LCBSNjYpOworCQkJCQl9CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCVI2NiA9IDB4MUMgKyAyKkdFVF9MTkFfR0FJTihwQWQpOworCQkJCQlpZiAoT3JpZ1I2NlZhbHVlICE9IFI2NikKKwkJCQkJeworCQkJCQkJUlRVU0JXcml0ZUJCUFJlZ2lzdGVyKHBBZCwgQkJQX1I2NiwgUjY2KTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWVsc2UKKyNlbmRpZiAvLyBSVDI4NzAgLy8KKwkJCXsKKwkJCQlpZiAoUnNzaSA+IFJTU0lfRk9SX01JRF9MT1dfU0VOU0lCSUxJVFkpCisJCQkJeworCQkJCQlSNjYgPSAoMHgyRSArIEdFVF9MTkFfR0FJTihwQWQpKSArIDB4MTA7CisJCQkJCWlmIChPcmlnUjY2VmFsdWUgIT0gUjY2KQorCQkJCQl7CisJCQkJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2NiwgUjY2KTsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlSNjYgPSAweDJFICsgR0VUX0xOQV9HQUlOKHBBZCk7CisJCQkJCWlmIChPcmlnUjY2VmFsdWUgIT0gUjY2KQorCQkJCQl7CisJCQkJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2NiwgUjY2KTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQllbHNlCisJCXsJLy9BIGJhbmQKKwkJCWlmIChwQWQtPkNvbW1vbkNmZy5CQlBDdXJyZW50QlcgPT0gQldfMjApCisJCQl7CisJCQkJaWYgKFJzc2kgPiBSU1NJX0ZPUl9NSURfTE9XX1NFTlNJQklMSVRZKQorCQkJCXsKKwkJCQkJUjY2ID0gMHgzMiArIChHRVRfTE5BX0dBSU4ocEFkKSo1KS8zICsgMHgxMDsKKwkJCQkJaWYgKE9yaWdSNjZWYWx1ZSAhPSBSNjYpCisJCQkJCXsKKwkJCQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY2LCBSNjYpOworCQkJCQl9CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCVI2NiA9IDB4MzIgKyAoR0VUX0xOQV9HQUlOKHBBZCkqNSkvMzsKKwkJCQkJaWYgKE9yaWdSNjZWYWx1ZSAhPSBSNjYpCisJCQkJCXsKKwkJCQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY2LCBSNjYpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWlmIChSc3NpID4gUlNTSV9GT1JfTUlEX0xPV19TRU5TSUJJTElUWSkKKwkJCQl7CisJCQkJCVI2NiA9IDB4M0EgKyAoR0VUX0xOQV9HQUlOKHBBZCkqNSkvMyArIDB4MTA7CisJCQkJCWlmIChPcmlnUjY2VmFsdWUgIT0gUjY2KQorCQkJCQl7CisJCQkJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2NiwgUjY2KTsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlSNjYgPSAweDNBICsgKEdFVF9MTkFfR0FJTihwQWQpKjUpLzM7CisJCQkJCWlmIChPcmlnUjY2VmFsdWUgIT0gUjY2KQorCQkJCQl7CisJCQkJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2NiwgUjY2KTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCisKKwl9Cit9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKK1ZPSUQgUlRNUFNldEFHQ0luaXRWYWx1ZSgKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiBVQ0hBUgkJCUJhbmRXaWR0aCkKK3sKKwlVQ0hBUglSNjYgPSAweDMwOworCisJaWYgKHBBZC0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbCA8PSAxNCkKKwl7CS8vIEJHIGJhbmQKKwkJUjY2ID0gMHgyRSArIEdFVF9MTkFfR0FJTihwQWQpOworCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2NiwgUjY2KTsKKwl9CisJZWxzZQorCXsJLy9BIGJhbmQKKwkJaWYgKEJhbmRXaWR0aCA9PSBCV18yMCkKKwkJeworCQkJUjY2ID0gKFVDSEFSKSgweDMyICsgKEdFVF9MTkFfR0FJTihwQWQpKjUpLzMpOworCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjYsIFI2Nik7CisJCX0KKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJZWxzZQorCQl7CisJCQlSNjYgPSAoVUNIQVIpKDB4M0EgKyAoR0VUX0xOQV9HQUlOKHBBZCkqNSkvMyk7CisJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2NiwgUjY2KTsKKwkJfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCX0KKworfQorCitWT0lEIEFzaWNUdXJuT2ZmUkZDbGsoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4JVUNIQVIJCUNoYW5uZWwpCit7CisKKwkvLyBSRiBSMiBiaXQgMTggPSAwCisJVUlOVDMyCQkJUjEgPSAwLCBSMiA9IDAsIFIzID0gMDsKKwlVQ0hBUgkJCWluZGV4OworCVJUTVBfUkZfUkVHUwkqUkZSZWdUYWJsZTsKKworCVJGUmVnVGFibGUgPSBSRjI4NTBSZWdUYWJsZTsKKworCXN3aXRjaCAocEFkLT5SZkljVHlwZSkKKwl7CisJCWNhc2UgUkZJQ18yODIwOgorCQljYXNlIFJGSUNfMjg1MDoKKwkJY2FzZSBSRklDXzI3MjA6CisJCWNhc2UgUkZJQ18yNzUwOgorCisJCQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBOVU1fT0ZfMjg1MF9DSE5MOyBpbmRleCsrKQorCQkJeworCQkJCWlmIChDaGFubmVsID09IFJGUmVnVGFibGVbaW5kZXhdLkNoYW5uZWwpCisJCQkJeworCQkJCQlSMSA9IFJGUmVnVGFibGVbaW5kZXhdLlIxICYgMHhmZmZmZGZmZjsKKwkJCQkJUjIgPSBSRlJlZ1RhYmxlW2luZGV4XS5SMiAmIDB4ZmZmYmZmZmY7CisJCQkJCVIzID0gUkZSZWdUYWJsZVtpbmRleF0uUjMgJiAweGZmZjNmZmZmOworCisJCQkJCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIFIxKTsKKwkJCQkJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgUjIpOworCisJCQkJCS8vIFByb2dyYW0gUjFiMTMgdG8gMSwgUjMvYjE4LDE5IHRvIDAsIFIyYjE4IHRvIDAuCisJCQkJCS8vIFNldCBSRiBSMiBiaXQxOD0wLCBSMyBiaXRbMTg6MTldPTAKKwkJCQkJLy9pZiAocEFkLT5TdGFDZmcuYlJhZGlvID09IEZBTFNFKQorCQkJCQlpZiAoMSkKKwkJCQkJeworCQkJCQkJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgUjMpOworCisJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBc2ljVHVybk9mZlJGQ2xrIyVkKFJGPSVkLCApICwgUjI9MHglMDh4LCAgUjMgPSAweCUwOHggXG4iLAorCQkJCQkJCUNoYW5uZWwsIHBBZC0+UmZJY1R5cGUsIFIyLCBSMykpOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFzaWNUdXJuT2ZmUkZDbGsjJWQoUkY9JWQsICkgLCBSMj0weCUwOHggXG4iLAorCQkJCQkJCUNoYW5uZWwsIHBBZC0+UmZJY1R5cGUsIFIyKSk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwl9Cit9CisKKworVk9JRCBBc2ljVHVybk9uUkZDbGsoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4JVUNIQVIJCQlDaGFubmVsKQoreworCisJLy8gUkYgUjIgYml0IDE4ID0gMAorCVVJTlQzMgkJCVIxID0gMCwgUjIgPSAwLCBSMyA9IDA7CisJVUNIQVIJCQlpbmRleDsKKwlSVE1QX1JGX1JFR1MJKlJGUmVnVGFibGU7CisKKwlSRlJlZ1RhYmxlID0gUkYyODUwUmVnVGFibGU7CisKKwlzd2l0Y2ggKHBBZC0+UmZJY1R5cGUpCisJeworCQljYXNlIFJGSUNfMjgyMDoKKwkJY2FzZSBSRklDXzI4NTA6CisJCWNhc2UgUkZJQ18yNzIwOgorCQljYXNlIFJGSUNfMjc1MDoKKworCQkJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgTlVNX09GXzI4NTBfQ0hOTDsgaW5kZXgrKykKKwkJCXsKKwkJCQlpZiAoQ2hhbm5lbCA9PSBSRlJlZ1RhYmxlW2luZGV4XS5DaGFubmVsKQorCQkJCXsKKwkJCQkJUjMgPSBwQWQtPkxhdGNoUmZSZWdzLlIzOworCQkJCQlSMyAmPSAweGZmZjNmZmZmOworCQkJCQlSMyB8PSAweDAwMDgwMDAwOworCQkJCQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCBSMyk7CisKKwkJCQkJUjEgPSBSRlJlZ1RhYmxlW2luZGV4XS5SMTsKKwkJCQkJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgUjEpOworCisJCQkJCVIyID0gUkZSZWdUYWJsZVtpbmRleF0uUjI7CisJCQkJCWlmIChwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoID09IDEpCisJCQkJCXsKKwkJCQkJCVIyIHw9IDB4NDAwMDsJLy8gSWYgVFhwYXRoIGlzIDEsIGJpdCAxNCA9IDE7CisJCQkJCX0KKworCQkJCQlpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAyKQorCQkJCQl7CisJCQkJCQlSMiB8PSAweDQwOwkvLyB3cml0ZSAxIHRvIG9mZiBSeHBhdGguCisJCQkJCX0KKwkJCQkJZWxzZSBpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAxKQorCQkJCQl7CisJCQkJCQlSMiB8PSAweDIwMDQwOwkvLyB3cml0ZSAxIHRvIG9mZiBSeFBhdGgKKwkJCQkJfQorCQkJCQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCBSMik7CisKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCX0KKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFzaWNUdXJuT25SRkNsayMlZChSRj0lZCwgKSAsIFIyPTB4JTA4eFxuIiwKKwkJQ2hhbm5lbCwKKwkJcEFkLT5SZkljVHlwZSwKKwkJUjIpKTsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vbmV0aWZfYmxvY2suYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL25ldGlmX2Jsb2NrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDNmN2QwOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL25ldGlmX2Jsb2NrLmMKQEAgLTAsMCArMSwxNDQgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKyNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKKyNpbmNsdWRlICJuZXRpZl9ibG9jay5oIgorCitzdGF0aWMgTkVUSUZfRU5UUlkgZnJlZU5ldElmRW50cnlQb29sW0ZSRUVfTkVUSUZfUE9PTF9TSVpFXTsKK3N0YXRpYyBMSVNUX0hFQURFUiBmcmVlTmV0SWZFbnRyeUxpc3Q7CisKK3ZvaWQgaW5pdGJsb2NrUXVldWVUYWIoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJaW50IGk7CisKKwlpbml0TGlzdCgmZnJlZU5ldElmRW50cnlMaXN0KTsKKwlmb3IgKGkgPSAwOyBpIDwgRlJFRV9ORVRJRl9QT09MX1NJWkU7IGkrKykKKwkJaW5zZXJ0VGFpbExpc3QoJmZyZWVOZXRJZkVudHJ5TGlzdCwgKFBMSVNUX0VOVFJZKSZmcmVlTmV0SWZFbnRyeVBvb2xbaV0pOworCisJZm9yIChpPTA7IGkgPCBOVU1fT0ZfVFhfUklORzsgaSsrKQorCQlpbml0TGlzdCgmcEFkLT5ibG9ja1F1ZXVlVGFiW2ldLk5ldElmTGlzdCk7CisKKwlyZXR1cm47Cit9CisKK0JPT0xFQU4gYmxvY2tOZXRJZigKKwlJTiBQQkxPQ0tfUVVFVUVfRU5UUlkgcEJsb2NrUXVldWVFbnRyeSwKKwlJTiBQTkVUX0RFViBwTmV0RGV2KQoreworCVBORVRJRl9FTlRSWSBwTmV0SWZFbnRyeSA9IE5VTEw7CisKKwlpZiAoKHBOZXRJZkVudHJ5ID0gKFBORVRJRl9FTlRSWSlyZW1vdmVIZWFkTGlzdCgmZnJlZU5ldElmRW50cnlMaXN0KSkgIT0gTlVMTCkKKwl7CisJCW5ldGlmX3N0b3BfcXVldWUocE5ldERldik7CisJCXBOZXRJZkVudHJ5LT5wTmV0RGV2ID0gcE5ldERldjsKKwkJaW5zZXJ0VGFpbExpc3QoJnBCbG9ja1F1ZXVlRW50cnktPk5ldElmTGlzdCwgKFBMSVNUX0VOVFJZKXBOZXRJZkVudHJ5KTsKKworCQlwQmxvY2tRdWV1ZUVudHJ5LT5Td1R4UXVldWVCbG9ja0ZsYWcgPSBUUlVFOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJuZXRpZl9zdG9wX3F1ZXVlKCVzKVxuIiwgcE5ldERldi0+bmFtZSkpOworCX0KKwllbHNlCisJCXJldHVybiBGQUxTRTsKKworCXJldHVybiBUUlVFOworfQorCitWT0lEIHJlbGVhc2VOZXRJZigKKwlJTiBQQkxPQ0tfUVVFVUVfRU5UUlkgcEJsb2NrUXVldWVFbnRyeSkKK3sKKwlQTkVUSUZfRU5UUlkgcE5ldElmRW50cnkgPSBOVUxMOworCVBMSVNUX0hFQURFUiBwTmV0SWZMaXN0ID0gJnBCbG9ja1F1ZXVlRW50cnktPk5ldElmTGlzdDsKKworCXdoaWxlKChwTmV0SWZFbnRyeSA9IChQTkVUSUZfRU5UUlkpcmVtb3ZlSGVhZExpc3QocE5ldElmTGlzdCkpICE9ICBOVUxMKQorCXsKKwkJUE5FVF9ERVYgcE5ldERldiA9IHBOZXRJZkVudHJ5LT5wTmV0RGV2OworCQluZXRpZl93YWtlX3F1ZXVlKHBOZXREZXYpOworCQlpbnNlcnRUYWlsTGlzdCgmZnJlZU5ldElmRW50cnlMaXN0LCAoUExJU1RfRU5UUlkpcE5ldElmRW50cnkpOworCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIm5ldGlmX3dha2VfcXVldWUoJXMpXG4iLCBwTmV0RGV2LT5uYW1lKSk7CisJfQorCXBCbG9ja1F1ZXVlRW50cnktPlN3VHhRdWV1ZUJsb2NrRmxhZyA9IEZBTFNFOworCXJldHVybjsKK30KKworCitWT0lEIFN0b3BOZXRJZlF1ZXVlKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVDSEFSIFF1ZUlkeCwKKwlJTiBQTkRJU19QQUNLRVQgcFBhY2tldCkKK3sKKwlQTkVUX0RFViBOZXREZXYgPSBOVUxMOworCVVDSEFSIElmSWR4ID0gMDsKKwlCT09MRUFOIHZhbGlkID0gRkFMU0U7CisKKyNpZmRlZiBBUENMSV9TVVBQT1JUCisJaWYgKFJUTVBfR0VUX1BBQ0tFVF9ORVRfREVWSUNFKHBQYWNrZXQpID49IE1JTl9ORVRfREVWSUNFX0ZPUl9BUENMSSkKKwl7CisJCUlmSWR4ID0gKFJUTVBfR0VUX1BBQ0tFVF9ORVRfREVWSUNFKHBQYWNrZXQpIC0gTUlOX05FVF9ERVZJQ0VfRk9SX0FQQ0xJKSAlIE1BWF9BUENMSV9OVU07CisJCU5ldERldiA9IHBBZC0+QXBDZmcuQXBDbGlUYWJbSWZJZHhdLmRldjsKKwl9CisJZWxzZQorI2VuZGlmIC8vIEFQQ0xJX1NVUFBPUlQgLy8KKyNpZmRlZiBXRFNfU1VQUE9SVAorCWlmIChSVE1QX0dFVF9QQUNLRVRfTkVUX0RFVklDRShwUGFja2V0KSA+PSBNSU5fTkVUX0RFVklDRV9GT1JfV0RTKQorCXsKKwkJSWZJZHggPSAoUlRNUF9HRVRfUEFDS0VUX05FVF9ERVZJQ0UocFBhY2tldCkgLSBNSU5fTkVUX0RFVklDRV9GT1JfV0RTKSAlIE1BWF9XRFNfRU5UUlk7CisJCU5ldERldiA9IHBBZC0+V2RzVGFiLldkc0VudHJ5W0lmSWR4XS5kZXY7CisJfQorCWVsc2UKKyNlbmRpZiAvLyBXRFNfU1VQUE9SVCAvLworCXsKKyNpZmRlZiBNQlNTX1NVUFBPUlQKKwkJaWYgKHBBZC0+T3BNb2RlID09IE9QTU9ERV9BUCkKKwkJeworCQkJSWZJZHggPSAoUlRNUF9HRVRfUEFDS0VUX05FVF9ERVZJQ0UocFBhY2tldCkgLSBNSU5fTkVUX0RFVklDRV9GT1JfTUJTU0lEKSAlIE1BWF9NQlNTSURfTlVNOworCQkJTmV0RGV2ID0gcEFkLT5BcENmZy5NQlNTSURbSWZJZHhdLk1TU0lERGV2OworCQl9CisJCWVsc2UKKwkJeworCQkJSWZJZHggPSBNQUlOX01CU1NJRDsKKwkJCU5ldERldiA9IHBBZC0+bmV0X2RldjsKKwkJfQorI2Vsc2UKKwkJSWZJZHggPSBNQUlOX01CU1NJRDsKKwkJTmV0RGV2ID0gcEFkLT5uZXRfZGV2OworI2VuZGlmCisJfQorCisJLy8gV01NIHN1cHBvcnQgNCBzb2Z0d2FyZSBxdWV1ZXMuCisJLy8gT25lIHNvZnR3YXJlIHF1ZXVlIGZ1bGwgZG9lc24ndCBtZWFuIGRldmljZSBoYXZlIG5vIGNhcGJpbGl0eSB0byB0cmFuc21pdCBwYWNrZXQuCisJLy8gU28gZGlzYWJsZSBibG9jayBOZXQtSWYgcXVldWUgZnVuY3Rpb24gd2hpbGUgV01NIGVuYWJsZS4KKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQl2YWxpZCA9IChwQWQtPkNvbW1vbkNmZy5iV21tQ2FwYWJsZSA9PSBUUlVFKSA/IEZBTFNFIDogVFJVRTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCWlmICh2YWxpZCkKKwkJYmxvY2tOZXRJZigmcEFkLT5ibG9ja1F1ZXVlVGFiW1F1ZUlkeF0sIE5ldERldik7CisJcmV0dXJuOworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9ydG1wX2luaXQuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL3J0bXBfaW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3MGEwMGQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9ydG1wX2luaXQuYwpAQCAtMCwwICsxLDQxMzIgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJTW9kdWxlIE5hbWU6CisJcnRtcF9pbml0LmMKKworCUFic3RyYWN0OgorCU1pbmlwb3J0IGdlbmVyaWMgcG9ydGlvbiBoZWFkZXIgZmlsZQorCisJUmV2aXNpb24gSGlzdG9yeToKKwlXaG8gICAgICAgICBXaGVuICAgICAgICAgIFdoYXQKKwktLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlQYXVsIExpbiAgICAyMDAyLTA4LTAxICAgIGNyZWF0ZWQKKyAgICBKb2huIENoYW5nICAyMDA0LTA4LTIwICAgIFJUMjU2MS8yNjYxIHVzZSBzY2F0dGVyLWdhdGhlciBzY2hlbWUKKyAgICBKYW4gTGVlICAyMDA2LTA5LTE1ICAgIFJUMjg2MC4gQ2hhbmdlIGZvciA4MDIuMTFuICwgRUVQUk9NLCBMZWQsIEJBLCBIVC4KKyovCisjaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCisjaW5jbHVkZSAiZmlybXdhcmUuaCIKKworLy8jZGVmaW5lIEJJTl9JTl9GSUxFIC8qIHVzZSAqLmJpbiBmaXJtd2FyZSAqLworCitVQ0hBUiAgICBCSVQ4W10gPSB7MHgwMSwgMHgwMiwgMHgwNCwgMHgwOCwgMHgxMCwgMHgyMCwgMHg0MCwgMHg4MH07CitVTE9ORyAgICBCSVQzMltdID0gezB4MDAwMDAwMDEsIDB4MDAwMDAwMDIsIDB4MDAwMDAwMDQsIDB4MDAwMDAwMDgsCisJCQkJCTB4MDAwMDAwMTAsIDB4MDAwMDAwMjAsIDB4MDAwMDAwNDAsIDB4MDAwMDAwODAsCisJCQkJCTB4MDAwMDAxMDAsIDB4MDAwMDAyMDAsIDB4MDAwMDA0MDAsIDB4MDAwMDA4MDAsCisJCQkJCTB4MDAwMDEwMDAsIDB4MDAwMDIwMDAsIDB4MDAwMDQwMDAsIDB4MDAwMDgwMDAsCisJCQkJCTB4MDAwMTAwMDAsIDB4MDAwMjAwMDAsIDB4MDAwNDAwMDAsIDB4MDAwODAwMDAsCisJCQkJCTB4MDAxMDAwMDAsIDB4MDAyMDAwMDAsIDB4MDA0MDAwMDAsIDB4MDA4MDAwMDAsCisJCQkJCTB4MDEwMDAwMDAsIDB4MDIwMDAwMDAsIDB4MDQwMDAwMDAsIDB4MDgwMDAwMDAsCisJCQkJCTB4MTAwMDAwMDAsIDB4MjAwMDAwMDAsIDB4NDAwMDAwMDAsIDB4ODAwMDAwMDB9OworCitjaGFyKiAgIENpcGhlck5hbWVbXSA9IHsibm9uZSIsIndlcDY0Iiwid2VwMTI4IiwiVEtJUCIsIkFFUyIsIkNLSVA2NCIsIkNLSVAxMjgifTsKKworY29uc3QgdW5zaWduZWQgc2hvcnQgY2NpdHRfMTZUYWJsZVtdID0geworCTB4MDAwMCwgMHgxMDIxLCAweDIwNDIsIDB4MzA2MywgMHg0MDg0LCAweDUwQTUsIDB4NjBDNiwgMHg3MEU3LAorCTB4ODEwOCwgMHg5MTI5LCAweEExNEEsIDB4QjE2QiwgMHhDMThDLCAweEQxQUQsIDB4RTFDRSwgMHhGMUVGLAorCTB4MTIzMSwgMHgwMjEwLCAweDMyNzMsIDB4MjI1MiwgMHg1MkI1LCAweDQyOTQsIDB4NzJGNywgMHg2MkQ2LAorCTB4OTMzOSwgMHg4MzE4LCAweEIzN0IsIDB4QTM1QSwgMHhEM0JELCAweEMzOUMsIDB4RjNGRiwgMHhFM0RFLAorCTB4MjQ2MiwgMHgzNDQzLCAweDA0MjAsIDB4MTQwMSwgMHg2NEU2LCAweDc0QzcsIDB4NDRBNCwgMHg1NDg1LAorCTB4QTU2QSwgMHhCNTRCLCAweDg1MjgsIDB4OTUwOSwgMHhFNUVFLCAweEY1Q0YsIDB4QzVBQywgMHhENThELAorCTB4MzY1MywgMHgyNjcyLCAweDE2MTEsIDB4MDYzMCwgMHg3NkQ3LCAweDY2RjYsIDB4NTY5NSwgMHg0NkI0LAorCTB4Qjc1QiwgMHhBNzdBLCAweDk3MTksIDB4ODczOCwgMHhGN0RGLCAweEU3RkUsIDB4RDc5RCwgMHhDN0JDLAorCTB4NDhDNCwgMHg1OEU1LCAweDY4ODYsIDB4NzhBNywgMHgwODQwLCAweDE4NjEsIDB4MjgwMiwgMHgzODIzLAorCTB4QzlDQywgMHhEOUVELCAweEU5OEUsIDB4RjlBRiwgMHg4OTQ4LCAweDk5NjksIDB4QTkwQSwgMHhCOTJCLAorCTB4NUFGNSwgMHg0QUQ0LCAweDdBQjcsIDB4NkE5NiwgMHgxQTcxLCAweDBBNTAsIDB4M0EzMywgMHgyQTEyLAorCTB4REJGRCwgMHhDQkRDLCAweEZCQkYsIDB4RUI5RSwgMHg5Qjc5LCAweDhCNTgsIDB4QkIzQiwgMHhBQjFBLAorCTB4NkNBNiwgMHg3Qzg3LCAweDRDRTQsIDB4NUNDNSwgMHgyQzIyLCAweDNDMDMsIDB4MEM2MCwgMHgxQzQxLAorCTB4RURBRSwgMHhGRDhGLCAweENERUMsIDB4RERDRCwgMHhBRDJBLCAweEJEMEIsIDB4OEQ2OCwgMHg5RDQ5LAorCTB4N0U5NywgMHg2RUI2LCAweDVFRDUsIDB4NEVGNCwgMHgzRTEzLCAweDJFMzIsIDB4MUU1MSwgMHgwRTcwLAorCTB4RkY5RiwgMHhFRkJFLCAweERGREQsIDB4Q0ZGQywgMHhCRjFCLCAweEFGM0EsIDB4OUY1OSwgMHg4Rjc4LAorCTB4OTE4OCwgMHg4MUE5LCAweEIxQ0EsIDB4QTFFQiwgMHhEMTBDLCAweEMxMkQsIDB4RjE0RSwgMHhFMTZGLAorCTB4MTA4MCwgMHgwMEExLCAweDMwQzIsIDB4MjBFMywgMHg1MDA0LCAweDQwMjUsIDB4NzA0NiwgMHg2MDY3LAorCTB4ODNCOSwgMHg5Mzk4LCAweEEzRkIsIDB4QjNEQSwgMHhDMzNELCAweEQzMUMsIDB4RTM3RiwgMHhGMzVFLAorCTB4MDJCMSwgMHgxMjkwLCAweDIyRjMsIDB4MzJEMiwgMHg0MjM1LCAweDUyMTQsIDB4NjI3NywgMHg3MjU2LAorCTB4QjVFQSwgMHhBNUNCLCAweDk1QTgsIDB4ODU4OSwgMHhGNTZFLCAweEU1NEYsIDB4RDUyQywgMHhDNTBELAorCTB4MzRFMiwgMHgyNEMzLCAweDE0QTAsIDB4MDQ4MSwgMHg3NDY2LCAweDY0NDcsIDB4NTQyNCwgMHg0NDA1LAorCTB4QTdEQiwgMHhCN0ZBLCAweDg3OTksIDB4OTdCOCwgMHhFNzVGLCAweEY3N0UsIDB4QzcxRCwgMHhENzNDLAorCTB4MjZEMywgMHgzNkYyLCAweDA2OTEsIDB4MTZCMCwgMHg2NjU3LCAweDc2NzYsIDB4NDYxNSwgMHg1NjM0LAorCTB4RDk0QywgMHhDOTZELCAweEY5MEUsIDB4RTkyRiwgMHg5OUM4LCAweDg5RTksIDB4Qjk4QSwgMHhBOUFCLAorCTB4NTg0NCwgMHg0ODY1LCAweDc4MDYsIDB4NjgyNywgMHgxOEMwLCAweDA4RTEsIDB4Mzg4MiwgMHgyOEEzLAorCTB4Q0I3RCwgMHhEQjVDLCAweEVCM0YsIDB4RkIxRSwgMHg4QkY5LCAweDlCRDgsIDB4QUJCQiwgMHhCQjlBLAorCTB4NEE3NSwgMHg1QTU0LCAweDZBMzcsIDB4N0ExNiwgMHgwQUYxLCAweDFBRDAsIDB4MkFCMywgMHgzQTkyLAorCTB4RkQyRSwgMHhFRDBGLCAweERENkMsIDB4Q0Q0RCwgMHhCREFBLCAweEFEOEIsIDB4OURFOCwgMHg4REM5LAorCTB4N0MyNiwgMHg2QzA3LCAweDVDNjQsIDB4NEM0NSwgMHgzQ0EyLCAweDJDODMsIDB4MUNFMCwgMHgwQ0MxLAorCTB4RUYxRiwgMHhGRjNFLCAweENGNUQsIDB4REY3QywgMHhBRjlCLCAweEJGQkEsIDB4OEZEOSwgMHg5RkY4LAorCTB4NkUxNywgMHg3RTM2LCAweDRFNTUsIDB4NUU3NCwgMHgyRTkzLCAweDNFQjIsIDB4MEVEMSwgMHgxRUYwCit9OworI2RlZmluZSBCeXRlQ1JDMTYodiwgY3JjKSBcCisJKHVuc2lnbmVkIHNob3J0KSgoY3JjIDw8IDgpIF4gIGNjaXR0XzE2VGFibGVbKChjcmMgPj4gOCkgXiAodikpICYgMjU1XSkKKwordW5zaWduZWQgY2hhciBCaXRSZXZlcnNlKHVuc2lnbmVkIGNoYXIgeCkKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBjaGFyIFRlbXA9MDsKKwlmb3IoaT0wOyA7IGkrKykKKwl7CisJCWlmKHggJiAweDgwKQlUZW1wIHw9IDB4ODA7CisJCWlmKGk9PTcpCQlicmVhazsKKwkJeAk8PD0gMTsKKwkJVGVtcCA+Pj0gMTsKKwl9CisJcmV0dXJuIFRlbXA7Cit9CisKKy8vCisvLyBCQlAgcmVnaXN0ZXIgaW5pdGlhbGl6YXRpb24gc2V0CisvLworUkVHX1BBSVIgICBCQlBSZWdUYWJsZVtdID0geworCXtCQlBfUjY1LAkJMHgyQ30sCQkvLyBmaXggcnNzaSBpc3N1ZQorCXtCQlBfUjY2LAkJMHgzOH0sCS8vIEFsc28gc2V0IHRoaXMgZGVmYXVsdCB2YWx1ZSB0byBwQWQtPkJicFR1bmluZy5SNjZDdXJyZW50VmFsdWUgYXQgaW5pdGlhbAorCXtCQlBfUjY5LAkJMHgxMn0sCisJe0JCUF9SNzAsCQkweGF9LAkvLyBCQlBfUjcwIHdpbGwgY2hhbmdlIHRvIDB4OCBpbiBBcFN0YXJ0VXAgYW5kIExpbmtVcCBmb3IgcnQyODYwQywgb3RoZXJ3aXNlIHZhbHVlIGlzIDB4YQorCXtCQlBfUjczLAkJMHgxMH0sCisJe0JCUF9SODEsCQkweDM3fSwKKwl7QkJQX1I4MiwJCTB4NjJ9LAorCXtCQlBfUjgzLAkJMHg2QX0sCisJe0JCUF9SODQsCQkweDk5fSwJLy8gMHgxOSBpcyBmb3IgcnQyODYwRSBhbmQgYWZ0ZXIuIFRoaXMgaXMgZm9yIGV4dGVuc2lvbiBjaGFubmVsIG92ZXJsYXBwaW5nIElPVC4gMHg5OSBpcyBmb3IgcnQyODYwRCBhbmQgYmVmb3JlCisJe0JCUF9SODYsCQkweDAwfSwJLy8gbWlkZGxlIHJhbmdlIGlzc3VlLCBSb3J5IEAyMDA4LTAxLTI4CisJe0JCUF9SOTEsCQkweDA0fSwJLy8gbWlkZGxlIHJhbmdlIGlzc3VlLCBSb3J5IEAyMDA4LTAxLTI4CisJe0JCUF9SOTIsCQkweDAwfSwJLy8gbWlkZGxlIHJhbmdlIGlzc3VlLCBSb3J5IEAyMDA4LTAxLTI4CisJe0JCUF9SMTAzLCAgCTB4MDB9LCAJLy8gbmVhciByYW5nZSBoaWdoLXBvd2VyIGlzc3VlLCByZXF1ZXN0ZWQgZnJvbSBHYXJ5IEAyMDA4LTA1MjgKKwl7QkJQX1IxMDUsCQkweDA1fSwJLy8gMHgwNSBpcyBmb3IgcnQyODYwRSB0byB0dXJuIG9uIEZFUSBjb250cm9sLiBJdCBpcyBzYWZlIGZvciBydDI4NjBEIGFuZCBiZWZvcmUsIGJlY2F1c2UgQml0IDc6MiBhcmUgcmVzZXJ2ZWQgaW4gcnQyODYwRCBhbmQgYmVmb3JlLgorfTsKKyNkZWZpbmUJTlVNX0JCUF9SRUdfUEFSTVMJKHNpemVvZihCQlBSZWdUYWJsZSkgLyBzaXplb2YoUkVHX1BBSVIpKQorCisvLworLy8gUkYgcmVnaXN0ZXIgaW5pdGlhbGl6YXRpb24gc2V0CisvLworI2lmZGVmIFJUMjg3MAorUkVHX1BBSVIgICBSVDMweHhfUkZSZWdUYWJsZVtdID0geworICAgICAgICB7UkZfUjA0LCAgICAgICAgICAweDQwfSwKKyAgICAgICAge1JGX1IwNSwgICAgICAgICAgMHgwM30sCisgICAgICAgIHtSRl9SMDYsICAgICAgICAgIDB4MDJ9LAorICAgICAgICB7UkZfUjA3LCAgICAgICAgICAweDcwfSwKKyAgICAgICAge1JGX1IwOSwgICAgICAgICAgMHgwRn0sCisgICAgICAgIHtSRl9SMTAsICAgICAgICAgIDB4NzF9LAorICAgICAgICB7UkZfUjExLCAgICAgICAgICAweDIxfSwKKyAgICAgICAge1JGX1IxMiwgICAgICAgICAgMHg3Qn0sCisgICAgICAgIHtSRl9SMTQsICAgICAgICAgIDB4OTB9LAorICAgICAgICB7UkZfUjE1LCAgICAgICAgICAweDU4fSwKKyAgICAgICAge1JGX1IxNiwgICAgICAgICAgMHhCM30sCisgICAgICAgIHtSRl9SMTcsICAgICAgICAgIDB4OTJ9LAorICAgICAgICB7UkZfUjE4LCAgICAgICAgICAweDJDfSwKKyAgICAgICAge1JGX1IxOSwgICAgICAgICAgMHgwMn0sCisgICAgICAgIHtSRl9SMjAsICAgICAgICAgIDB4QkF9LAorICAgICAgICB7UkZfUjIxLCAgICAgICAgICAweERCfSwKKyAgICAgICAge1JGX1IyNCwgICAgICAgICAgMHgxNn0sCisgICAgICAgIHtSRl9SMjUsICAgICAgICAgIDB4MDF9LAorICAgICAgICB7UkZfUjI3LCAgICAgICAgICAweDAzfSwKKyAgICAgICAge1JGX1IyOSwgICAgICAgICAgMHgxRn0sCit9OworI2RlZmluZQlOVU1fUkZfUkVHX1BBUk1TCShzaXplb2YoUlQzMHh4X1JGUmVnVGFibGUpIC8gc2l6ZW9mKFJFR19QQUlSKSkKKyNlbmRpZiAvLyBSVDI4NzAgLy8KKworLy8KKy8vIEFTSUMgcmVnaXN0ZXIgaW5pdGlhbGl6YXRpb24gc2V0cworLy8KKworUlRNUF9SRUdfUEFJUglNQUNSZWdUYWJsZVtdID0JeworI2lmIGRlZmluZWQoSFdfQkVBQ09OX09GRlNFVCkgJiYgKEhXX0JFQUNPTl9PRkZTRVQgPT0gMHgyMDApCisJe0JDTl9PRkZTRVQwLAkJCTB4ZjhmMGU4ZTB9LCAvKiAweDM4MDAoZTApLCAweDNBMDAoZTgpLCAweDNDMDAoZjApLCAweDNFMDAoZjgpLCA1MTJCIGZvciBlYWNoIGJlYWNvbiAqLworCXtCQ05fT0ZGU0VUMSwJCQkweDZmNzdkMGM4fSwgLyogMHgzMjAwKGM4KSwgMHgzNDAwKGQwKSwgMHgxREMwKDc3KSwgMHgxQkMwKDZmKSwgNTEyQiBmb3IgZWFjaCBiZWFjb24gKi8KKyNlbGlmIGRlZmluZWQoSFdfQkVBQ09OX09GRlNFVCkgJiYgKEhXX0JFQUNPTl9PRkZTRVQgPT0gMHgxMDApCisJe0JDTl9PRkZTRVQwLAkJCTB4ZWNlOGU0ZTB9LCAvKiAweDM4MDAsIDB4M0EwMCwgMHgzQzAwLCAweDNFMDAsIDUxMkIgZm9yIGVhY2ggYmVhY29uICovCisJe0JDTl9PRkZTRVQxLAkJCTB4ZmNmOGY0ZjB9LCAvKiAweDM4MDAsIDB4M0EwMCwgMHgzQzAwLCAweDNFMDAsIDUxMkIgZm9yIGVhY2ggYmVhY29uICovCisjZWxzZQorICAgICNlcnJvciBZb3UgbXVzdCByZS1jYWxjdWxhdGUgbmV3IHZhbHVlIGZvciBCQ05fT0ZGU0VUMCAmIEJDTl9PRkZTRVQxIGluIE1BQ1JlZ1RhYmxlW10hISEKKyNlbmRpZiAvLyBIV19CRUFDT05fT0ZGU0VUIC8vCisKKwl7TEVHQUNZX0JBU0lDX1JBVEUsCQkweDAwMDAwMTNmfSwgLy8gIEJhc2ljIHJhdGUgc2V0IGJpdG1hcAorCXtIVF9CQVNJQ19SQVRFLAkJMHgwMDAwODAwM30sIC8vIEJhc2ljIEhUIHJhdGUgc2V0ICwgMjBNLCBNQ1M9MywgTU0uIEZvcm1hdCBpcyB0aGUgc2FtZSBhcyBpbiBUWFdJLgorCXtNQUNfU1lTX0NUUkwsCQkweDAwfSwgLy8gMHgxMDA0LCAsIGRlZmF1bHQgRGlzYWJsZSBSWAorCXtSWF9GSUxUUl9DRkcsCQkweDE3Zjk3fSwgLy8weDE0MDAgICwgUlggZmlsdGVyIGNvbnRyb2wsCisJe0JLT0ZGX1NMT1RfQ0ZHLAkweDIwOX0sIC8vIGRlZmF1bHQgc2V0IHNob3J0IHNsb3QgdGltZSwgQ0NfREVMQVlfVElNRSBzaG91bGQgYmUgMgorCXtUWF9TV19DRkcwLAkJMHgwfSwgCQkvLyBHYXJ5LDIwMDgtMDUtMjEgZm9yIENXQyB0ZXN0CisJe1RYX1NXX0NGRzEsCQkweDgwNjA2fSwgLy8gR2FyeSwyMDA2LTA4LTIzCisJe1RYX0xJTktfQ0ZHLAkJMHgxMDIwfSwJCS8vIEdhcnksMjAwNi0wOC0yMworCS8ve1RYX1RJTUVPVVRfQ0ZHLAkweDAwMTgyMDkwfSwJLy8gQ0NLIGhhcyBzb21lIHByb2JsZW0uIFNvIGluY3JlYXNlIHRpbWllb3V0IHZhbHVlLiAyMDA2LTEwLTA5Ly8gTUFydmVrIFJUCisJe1RYX1RJTUVPVVRfQ0ZHLAkweDAwMGEyMDkwfSwJLy8gQ0NLIGhhcyBzb21lIHByb2JsZW0uIFNvIGluY3JlYXNlIHRpbWllb3V0IHZhbHVlLiAyMDA2LTEwLTA5Ly8gTUFydmVrIFJUICwgTW9kaWZ5IGZvciAyODYwRSAsMjAwNy0wOC0wMQorCXtNQVhfTEVOX0NGRywJCU1BWF9BR0dSRUdBVElPTl9TSVpFIHwgMHgwMDAwMTAwMH0sCS8vIDB4MzAxOCwgTUFYIGZyYW1lIGxlbmd0aC4gTWF4IFBTRFUgPSAxNmtieXRlcy4KKwl7TEVEX0NGRywJCTB4N2YwMzFlNDZ9LCAvLyBHYXJ5LCAyMDA2LTA4LTIzCisJe1BCRl9NQVhfUENOVCwJCQkweDFGM0ZCRjlGfSwgCS8vMHgxRjNmN2Y5Zn0sCQkvL0phbiwgMjAwNi8wNC8yMAorCS8ve1RYX1JUWV9DRkcsCQkJMHg2YmI4MDQwOH0sCS8vIEphbiwgMjAwNi8xMS8xNgorCXtUWF9SVFlfQ0ZHLAkJCTB4NDdkMDFmMGZ9LAkvLyBKYW4sIDIwMDYvMTEvMTYsIFNldCBUeFdJLT5BQ0sgPTAgaW4gUHJvYmUgUnNwIE1vZGlmeSBmb3IgMjg2MEUgLDIwMDctMDgtMDMKKwl7QVVUT19SU1BfQ0ZHLAkJCTB4MDAwMDAwMTN9LAkvLyBJbml0aWFsIEF1dG9fUmVzcG9uZGVyLCBiZWNhdXNlIFFBIHdpbGwgdHVybiBvZmYgQXV0by1SZXNwb25kZXIKKwl7Q0NLX1BST1RfQ0ZHLAkJCTB4MDU3NDAwMDMgLyoweDAxNzQwMDAzKi99LAkvLyBJbml0aWFsIEF1dG9fUmVzcG9uZGVyLCBiZWNhdXNlIFFBIHdpbGwgdHVybiBvZmYgQXV0by1SZXNwb25kZXIuIEFuZCBSVFMgdGhyZXNob2xkIGlzIGVuYWJsZWQuCisJe09GRE1fUFJPVF9DRkcsCQkJMHgwNTc0MDAwMyAvKjB4MDE3NDAwMDMqL30sCS8vIEluaXRpYWwgQXV0b19SZXNwb25kZXIsIGJlY2F1c2UgUUEgd2lsbCB0dXJuIG9mZiBBdXRvLVJlc3BvbmRlci4gQW5kIFJUUyB0aHJlc2hvbGQgaXMgZW5hYmxlZC4KKyNpZmRlZiBSVDI4NzAKKwl7UEJGX0NGRywgCQkJCTB4ZjQwMDA2fSwgCQkvLyBPbmx5IGVuYWJsZSBRdWV1ZSAyCisJe01NNDBfUFJPVF9DRkcsCQkJMHgzRjQ0MDg0fSwJCS8vIEluaXRpYWwgQXV0b19SZXNwb25kZXIsIGJlY2F1c2UgUUEgd2lsbCB0dXJuIG9mZiBBdXRvLVJlc3BvbmRlcgorCXtXUERNQV9HTE9fQ0ZHLAkJCTB4MDAwMDAwMzB9LAorI2VuZGlmIC8vIFJUMjg3MCAvLworCXtHRjIwX1BST1RfQ0ZHLAkJCTB4MDE3NDQwMDR9LCAgICAvLyBzZXQgMTk6MTggLS0+IFNob3J0IE5BViBmb3IgTUlNTyBQUworCXtHRjQwX1BST1RfQ0ZHLAkJCTB4MDNGNDQwODR9LAorCXtNTTIwX1BST1RfQ0ZHLAkJCTB4MDE3NDQwMDR9LAorCXtUWE9QX0NUUkxfQ0ZHLAkJCTB4MDAwMDU4M2YsIC8qMHgwMDAwMjQzZiovIC8qMHgwMDAwMjRiZiovfSwJLy9FeHRlbnNpb24gY2hhbm5lbCBiYWNrb2ZmLgorCXtUWF9SVFNfQ0ZHLAkJCTB4MDAwOTJiMjB9LAorLy8jaWZkZWYgV0lGSV9URVNUCisJe0VYUF9BQ0tfVElNRSwJCQkweDAwMjQwMGNhfSwJLy8gZGVmYXVsdCB2YWx1ZQorLy8jZWxzZQorLy8Je0VYUF9BQ0tfVElNRSwJCQkweDAwNTQwMGNhfSwJLy8gc3VnZ2VzdGVkIGJ5IEdyYXkgQCAyMDA3MDMyMyBmb3IgMTFuIGludGVsLXN0YSB0aHJvdWdocHV0CisvLyNlbmRpZiAvLyBlbmQgLSBXSUZJX1RFU1QgLy8KKwl7VFhPUF9ITERSX0VULCAJCQkweDAwMDAwMDAyfSwKKworCS8qIEplcnJ5IGNvbW1lbnRzIDIwMDgvMDEvMTY6IHdlIHVzZSBTSUZTID0gMTB1cyBpbiBDQ0sgZGVmYXVsdGx5LCBidXQgaXQgc2VlbXMgdGhhdCAxMHVzCisJCWlzIHRvbyBzbWFsbCBmb3IgSU5URUwgMjIwMGJnIGNhcmQsIHNvIGluIE1CU1MgbW9kZSwgdGhlIGRlbHRhIHRpbWUgYmV0d2VlbiBiZWFjb24wCisJCWFuZCBiZWFjb24xIGlzIFNJRlMgKDEwdXMpLCBzbyBpZiBJTlRFTCAyMjAwYmcgY2FyZCBjb25uZWN0cyB0byBCU1MwLCB0aGUgcGluZworCQl3aWxsIGFsd2F5cyBsb3N0LiBTbyB3ZSBjaGFuZ2UgdGhlIFNJRlMgb2YgQ0NLIGZyb20gMTB1cyB0byAxNnVzLiAqLworCXtYSUZTX1RJTUVfQ0ZHLAkJCTB4MzNhNDEwMTB9LAorCXtQV1JfUElOX0NGRywJCQkweDAwMDAwMDAzfSwJLy8gcGF0Y2ggZm9yIDI4ODAtRQorfTsKKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCitSVE1QX1JFR19QQUlSCVNUQU1BQ1JlZ1RhYmxlW10gPQl7CisJe1dNTV9BSUZTTl9DRkcsCQkweDAwMDAyMjczfSwKKwl7V01NX0NXTUlOX0NGRywJMHgwMDAwMjM0NH0sCisJe1dNTV9DV01BWF9DRkcsCTB4MDAwMDM0YWF9LAorfTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworI2RlZmluZQlOVU1fTUFDX1JFR19QQVJNUwkJKHNpemVvZihNQUNSZWdUYWJsZSkgLyBzaXplb2YoUlRNUF9SRUdfUEFJUikpCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisjZGVmaW5lCU5VTV9TVEFfTUFDX1JFR19QQVJNUwkoc2l6ZW9mKFNUQU1BQ1JlZ1RhYmxlKSAvIHNpemVvZihSVE1QX1JFR19QQUlSKSkKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworI2lmZGVmIFJUMjg3MAorLy8KKy8vIFJUMjg3MCBGaXJtd2FyZSBTcGVjIG9ubHkgdXNlZCAxIG9jdCBmb3IgdmVyc2lvbiBleHByZXNzaW9uCisvLworI2RlZmluZSBGSVJNV0FSRV9NSU5PUl9WRVJTSU9OCTcKKworI2VuZGlmIC8vIFJUMjg3MCAvLworCisvLyBOZXcgOGsgYnl0ZSBmaXJtd2FyZSBzaXplIGZvciBSVDMwNzEvUlQzMDcyCisjZGVmaW5lIEZJUk1XQVJFSU1BR0VfTUFYX0xFTkdUSAkweDIwMDAKKyNkZWZpbmUgRklSTVdBUkVJTUFHRV9MRU5HVEgJCShzaXplb2YgKEZpcm13YXJlSW1hZ2UpIC8gc2l6ZW9mKFVDSEFSKSkKKyNkZWZpbmUgRklSTVdBUkVfTUFKT1JfVkVSU0lPTgkwCisKKyNkZWZpbmUgRklSTVdBUkVJTUFHRVYxX0xFTkdUSAkweDEwMDAKKyNkZWZpbmUgRklSTVdBUkVJTUFHRVYyX0xFTkdUSAkweDEwMDAKKworCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlBbGxvY2F0ZSBSVE1QX0FEQVBURVIgZGF0YSBibG9jayBhbmQgZG8gc29tZSBpbml0aWFsaXphdGlvbgorCisJQXJndW1lbnRzOgorCQlBZGFwdGVyCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisKKwlSZXR1cm4gVmFsdWU6CisJCU5ESVNfU1RBVFVTX1NVQ0NFU1MKKwkJTkRJU19TVEFUVVNfRkFJTFVSRQorCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitORElTX1NUQVRVUwlSVE1QQWxsb2NBZGFwdGVyQmxvY2soCisJSU4gIFBWT0lECWhhbmRsZSwKKwlPVVQJUFJUTVBfQURBUFRFUgkqcHBBZGFwdGVyKQoreworCVBSVE1QX0FEQVBURVIJcEFkOworCU5ESVNfU1RBVFVTCQlTdGF0dXM7CisJSU5UIAkJCWluZGV4OworCVVDSEFSCQkJKnBCZWFjb25CdWYgPSBOVUxMOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+IFJUTVBBbGxvY0FkYXB0ZXJCbG9ja1xuIikpOworCisJKnBwQWRhcHRlciA9IE5VTEw7CisKKwlkbworCXsKKwkJLy8gQWxsb2NhdGUgUlRNUF9BREFQVEVSIG1lbW9yeSBibG9jaworCQlwQmVhY29uQnVmID0ga21hbGxvYyhNQVhfQkVBQ09OX1NJWkUsIE1FTV9BTExPQ19GTEFHKTsKKwkJaWYgKHBCZWFjb25CdWYgPT0gTlVMTCkKKwkJeworCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfRkFJTFVSRTsKKwkJCURCR1BSSU5UX0VSUigoIkZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgLSBCZWFjb25CdWYhXG4iKSk7CisJCQlicmVhazsKKwkJfQorCisJCVN0YXR1cyA9IEFkYXB0ZXJCbG9ja0FsbG9jYXRlTWVtb3J5KGhhbmRsZSwgKFBWT0lEICopJnBBZCk7CisJCWlmIChTdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJeworCQkJREJHUFJJTlRfRVJSKCgiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSAtIEFEQVBURVJcbiIpKTsKKwkJCWJyZWFrOworCQl9CisJCXBBZC0+QmVhY29uQnVmID0gcEJlYWNvbkJ1ZjsKKwkJcHJpbnRrKCJcblxuPT09IHBBZCA9ICVwLCBzaXplID0gJWQgPT09XG5cbiIsIHBBZCwgKFVJTlQzMilzaXplb2YoUlRNUF9BREFQVEVSKSk7CisKKworCQkvLyBJbml0IHNwaW4gbG9ja3MKKwkJTmRpc0FsbG9jYXRlU3BpbkxvY2soJnBBZC0+TWdtdFJpbmdMb2NrKTsKKworCQlmb3IgKGluZGV4ID0wIDsgaW5kZXggPCBOVU1fT0ZfVFhfUklORzsgaW5kZXgrKykKKwkJeworCQkJTmRpc0FsbG9jYXRlU3BpbkxvY2soJnBBZC0+VHhTd1F1ZXVlTG9ja1tpbmRleF0pOworCQkJTmRpc0FsbG9jYXRlU3BpbkxvY2soJnBBZC0+RGVRdWV1ZUxvY2tbaW5kZXhdKTsKKwkJCXBBZC0+RGVRdWV1ZVJ1bm5pbmdbaW5kZXhdID0gRkFMU0U7CisJCX0KKworCQlOZGlzQWxsb2NhdGVTcGluTG9jaygmcEFkLT5pcnFfbG9jayk7CisKKwl9IHdoaWxlIChGQUxTRSk7CisKKwlpZiAoKFN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKSAmJiAocEJlYWNvbkJ1ZikpCisJCWtmcmVlKHBCZWFjb25CdWYpOworCisJKnBwQWRhcHRlciA9IHBBZDsKKworCURCR1BSSU5UX1MoU3RhdHVzLCAoIjwtLSBSVE1QQWxsb2NBZGFwdGVyQmxvY2ssIFN0YXR1cz0leFxuIiwgU3RhdHVzKSk7CisJcmV0dXJuIFN0YXR1czsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVJlYWQgaW5pdGlhbCBUeCBwb3dlciBwZXIgTUNTIGFuZCBCVyBmcm9tIEVFUFJPTQorCisJQXJndW1lbnRzOgorCQlBZGFwdGVyCQkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJUlRNUFJlYWRUeFB3clBlclJhdGUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQpCit7CisJVUxPTkcJCWRhdGEsIEFkYXRhLCBHZGF0YTsKKwlVU0hPUlQJCWksIHZhbHVlLCB2YWx1ZTI7CisJSU5UCQkJQXB3cmRlbHRhLCBHcHdyZGVsdGE7CisJVUNIQVIJCXQxLHQyLHQzLHQ0OworCUJPT0xFQU4JCWJWYWxpZCwgYkFwd3JkZWx0YU1pbnVzID0gVFJVRSwgYkdwd3JkZWx0YU1pbnVzID0gVFJVRTsKKworCS8vCisJLy8gR2V0IHBvd2VyIGRlbHRhIGZvciAyME1IeiBhbmQgNDBNSHouCisJLy8KKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJUeHBvd2VyIHBlciBSYXRlXG4iKSk7CisJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fVFhQT1dFUl9ERUxUQSwgdmFsdWUyKTsKKwlBcHdyZGVsdGEgPSAwOworCUdwd3JkZWx0YSA9IDA7CisKKwlpZiAoKHZhbHVlMiAmIDB4ZmYpICE9IDB4ZmYpCisJeworCQlpZiAoKHZhbHVlMiAmIDB4ODApKQorCQkJR3B3cmRlbHRhID0gKHZhbHVlMiYweGYpOworCisJCWlmICgodmFsdWUyICYgMHg0MCkpCisJCQliR3B3cmRlbHRhTWludXMgPSBGQUxTRTsKKwkJZWxzZQorCQkJYkdwd3JkZWx0YU1pbnVzID0gVFJVRTsKKwl9CisJaWYgKCh2YWx1ZTIgJiAweGZmMDApICE9IDB4ZmYwMCkKKwl7CisJCWlmICgodmFsdWUyICYgMHg4MDAwKSkKKwkJCUFwd3JkZWx0YSA9ICgodmFsdWUyJjB4ZjAwKT4+OCk7CisKKwkJaWYgKCh2YWx1ZTIgJiAweDQwMDApKQorCQkJYkFwd3JkZWx0YU1pbnVzID0gRkFMU0U7CisJCWVsc2UKKwkJCWJBcHdyZGVsdGFNaW51cyA9IFRSVUU7CisJfQorCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkdwd3JkZWx0YSA9ICV4LCBBcHdyZGVsdGEgPSAleCAuXG4iLCBHcHdyZGVsdGEsIEFwd3JkZWx0YSkpOworCisJLy8KKwkvLyBHZXQgVHhwb3dlciBwZXIgTUNTIGZvciAyME1IeiBpbiAyLjRHLgorCS8vCisJZm9yIChpPTA7IGk8NTsgaSsrKQorCXsKKwkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fVFhQT1dFUl9CWVJBVEVfMjBNSFpfMl80RyArIGkqNCwgdmFsdWUpOworCQlkYXRhID0gdmFsdWU7CisJCWlmIChiQXB3cmRlbHRhTWludXMgPT0gRkFMU0UpCisJCXsKKwkJCXQxID0gKHZhbHVlJjB4ZikrKEFwd3JkZWx0YSk7CisJCQlpZiAodDEgPiAweGYpCisJCQkJdDEgPSAweGY7CisJCQl0MiA9ICgodmFsdWUmMHhmMCk+PjQpKyhBcHdyZGVsdGEpOworCQkJaWYgKHQyID4gMHhmKQorCQkJCXQyID0gMHhmOworCQkJdDMgPSAoKHZhbHVlJjB4ZjAwKT4+OCkrKEFwd3JkZWx0YSk7CisJCQlpZiAodDMgPiAweGYpCisJCQkJdDMgPSAweGY7CisJCQl0NCA9ICgodmFsdWUmMHhmMDAwKT4+MTIpKyhBcHdyZGVsdGEpOworCQkJaWYgKHQ0ID4gMHhmKQorCQkJCXQ0ID0gMHhmOworCQl9CisJCWVsc2UKKwkJeworCQkJaWYgKCh2YWx1ZSYweGYpID4gQXB3cmRlbHRhKQorCQkJCXQxID0gKHZhbHVlJjB4ZiktKEFwd3JkZWx0YSk7CisJCQllbHNlCisJCQkJdDEgPSAwOworCQkJaWYgKCgodmFsdWUmMHhmMCk+PjQpID4gQXB3cmRlbHRhKQorCQkJCXQyID0gKCh2YWx1ZSYweGYwKT4+NCktKEFwd3JkZWx0YSk7CisJCQllbHNlCisJCQkJdDIgPSAwOworCQkJaWYgKCgodmFsdWUmMHhmMDApPj44KSA+IEFwd3JkZWx0YSkKKwkJCQl0MyA9ICgodmFsdWUmMHhmMDApPj44KS0oQXB3cmRlbHRhKTsKKwkJCWVsc2UKKwkJCQl0MyA9IDA7CisJCQlpZiAoKCh2YWx1ZSYweGYwMDApPj4xMikgPiBBcHdyZGVsdGEpCisJCQkJdDQgPSAoKHZhbHVlJjB4ZjAwMCk+PjEyKS0oQXB3cmRlbHRhKTsKKwkJCWVsc2UKKwkJCQl0NCA9IDA7CisJCX0KKwkJQWRhdGEgPSB0MSArICh0Mjw8NCkgKyAodDM8PDgpICsgKHQ0PDwxMik7CisJCWlmIChiR3B3cmRlbHRhTWludXMgPT0gRkFMU0UpCisJCXsKKwkJCXQxID0gKHZhbHVlJjB4ZikrKEdwd3JkZWx0YSk7CisJCQlpZiAodDEgPiAweGYpCisJCQkJdDEgPSAweGY7CisJCQl0MiA9ICgodmFsdWUmMHhmMCk+PjQpKyhHcHdyZGVsdGEpOworCQkJaWYgKHQyID4gMHhmKQorCQkJCXQyID0gMHhmOworCQkJdDMgPSAoKHZhbHVlJjB4ZjAwKT4+OCkrKEdwd3JkZWx0YSk7CisJCQlpZiAodDMgPiAweGYpCisJCQkJdDMgPSAweGY7CisJCQl0NCA9ICgodmFsdWUmMHhmMDAwKT4+MTIpKyhHcHdyZGVsdGEpOworCQkJaWYgKHQ0ID4gMHhmKQorCQkJCXQ0ID0gMHhmOworCQl9CisJCWVsc2UKKwkJeworCQkJaWYgKCh2YWx1ZSYweGYpID4gR3B3cmRlbHRhKQorCQkJCXQxID0gKHZhbHVlJjB4ZiktKEdwd3JkZWx0YSk7CisJCQllbHNlCisJCQkJdDEgPSAwOworCQkJaWYgKCgodmFsdWUmMHhmMCk+PjQpID4gR3B3cmRlbHRhKQorCQkJCXQyID0gKCh2YWx1ZSYweGYwKT4+NCktKEdwd3JkZWx0YSk7CisJCQllbHNlCisJCQkJdDIgPSAwOworCQkJaWYgKCgodmFsdWUmMHhmMDApPj44KSA+IEdwd3JkZWx0YSkKKwkJCQl0MyA9ICgodmFsdWUmMHhmMDApPj44KS0oR3B3cmRlbHRhKTsKKwkJCWVsc2UKKwkJCQl0MyA9IDA7CisJCQlpZiAoKCh2YWx1ZSYweGYwMDApPj4xMikgPiBHcHdyZGVsdGEpCisJCQkJdDQgPSAoKHZhbHVlJjB4ZjAwMCk+PjEyKS0oR3B3cmRlbHRhKTsKKwkJCWVsc2UKKwkJCQl0NCA9IDA7CisJCX0KKwkJR2RhdGEgPSB0MSArICh0Mjw8NCkgKyAodDM8PDgpICsgKHQ0PDwxMik7CisKKwkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fVFhQT1dFUl9CWVJBVEVfMjBNSFpfMl80RyArIGkqNCArIDIsIHZhbHVlKTsKKwkJaWYgKGJBcHdyZGVsdGFNaW51cyA9PSBGQUxTRSkKKwkJeworCQkJdDEgPSAodmFsdWUmMHhmKSsoQXB3cmRlbHRhKTsKKwkJCWlmICh0MSA+IDB4ZikKKwkJCQl0MSA9IDB4ZjsKKwkJCXQyID0gKCh2YWx1ZSYweGYwKT4+NCkrKEFwd3JkZWx0YSk7CisJCQlpZiAodDIgPiAweGYpCisJCQkJdDIgPSAweGY7CisJCQl0MyA9ICgodmFsdWUmMHhmMDApPj44KSsoQXB3cmRlbHRhKTsKKwkJCWlmICh0MyA+IDB4ZikKKwkJCQl0MyA9IDB4ZjsKKwkJCXQ0ID0gKCh2YWx1ZSYweGYwMDApPj4xMikrKEFwd3JkZWx0YSk7CisJCQlpZiAodDQgPiAweGYpCisJCQkJdDQgPSAweGY7CisJCX0KKwkJZWxzZQorCQl7CisJCQlpZiAoKHZhbHVlJjB4ZikgPiBBcHdyZGVsdGEpCisJCQkJdDEgPSAodmFsdWUmMHhmKS0oQXB3cmRlbHRhKTsKKwkJCWVsc2UKKwkJCQl0MSA9IDA7CisJCQlpZiAoKCh2YWx1ZSYweGYwKT4+NCkgPiBBcHdyZGVsdGEpCisJCQkJdDIgPSAoKHZhbHVlJjB4ZjApPj40KS0oQXB3cmRlbHRhKTsKKwkJCWVsc2UKKwkJCQl0MiA9IDA7CisJCQlpZiAoKCh2YWx1ZSYweGYwMCk+PjgpID4gQXB3cmRlbHRhKQorCQkJCXQzID0gKCh2YWx1ZSYweGYwMCk+PjgpLShBcHdyZGVsdGEpOworCQkJZWxzZQorCQkJCXQzID0gMDsKKwkJCWlmICgoKHZhbHVlJjB4ZjAwMCk+PjEyKSA+IEFwd3JkZWx0YSkKKwkJCQl0NCA9ICgodmFsdWUmMHhmMDAwKT4+MTIpLShBcHdyZGVsdGEpOworCQkJZWxzZQorCQkJCXQ0ID0gMDsKKwkJfQorCQlBZGF0YSB8PSAoKHQxPDwxNikgKyAodDI8PDIwKSArICh0Mzw8MjQpICsgKHQ0PDwyOCkpOworCQlpZiAoYkdwd3JkZWx0YU1pbnVzID09IEZBTFNFKQorCQl7CisJCQl0MSA9ICh2YWx1ZSYweGYpKyhHcHdyZGVsdGEpOworCQkJaWYgKHQxID4gMHhmKQorCQkJCXQxID0gMHhmOworCQkJdDIgPSAoKHZhbHVlJjB4ZjApPj40KSsoR3B3cmRlbHRhKTsKKwkJCWlmICh0MiA+IDB4ZikKKwkJCQl0MiA9IDB4ZjsKKwkJCXQzID0gKCh2YWx1ZSYweGYwMCk+PjgpKyhHcHdyZGVsdGEpOworCQkJaWYgKHQzID4gMHhmKQorCQkJCXQzID0gMHhmOworCQkJdDQgPSAoKHZhbHVlJjB4ZjAwMCk+PjEyKSsoR3B3cmRlbHRhKTsKKwkJCWlmICh0NCA+IDB4ZikKKwkJCQl0NCA9IDB4ZjsKKwkJfQorCQllbHNlCisJCXsKKwkJCWlmICgodmFsdWUmMHhmKSA+IEdwd3JkZWx0YSkKKwkJCQl0MSA9ICh2YWx1ZSYweGYpLShHcHdyZGVsdGEpOworCQkJZWxzZQorCQkJCXQxID0gMDsKKwkJCWlmICgoKHZhbHVlJjB4ZjApPj40KSA+IEdwd3JkZWx0YSkKKwkJCQl0MiA9ICgodmFsdWUmMHhmMCk+PjQpLShHcHdyZGVsdGEpOworCQkJZWxzZQorCQkJCXQyID0gMDsKKwkJCWlmICgoKHZhbHVlJjB4ZjAwKT4+OCkgPiBHcHdyZGVsdGEpCisJCQkJdDMgPSAoKHZhbHVlJjB4ZjAwKT4+OCktKEdwd3JkZWx0YSk7CisJCQllbHNlCisJCQkJdDMgPSAwOworCQkJaWYgKCgodmFsdWUmMHhmMDAwKT4+MTIpID4gR3B3cmRlbHRhKQorCQkJCXQ0ID0gKCh2YWx1ZSYweGYwMDApPj4xMiktKEdwd3JkZWx0YSk7CisJCQllbHNlCisJCQkJdDQgPSAwOworCQl9CisJCUdkYXRhIHw9ICgodDE8PDE2KSArICh0Mjw8MjApICsgKHQzPDwyNCkgKyAodDQ8PDI4KSk7CisJCWRhdGEgfD0gKHZhbHVlPDwxNik7CisKKwkJcEFkLT5UeDIwTVB3ckNmZ0FCYW5kW2ldID0gcEFkLT5UeDQwTVB3ckNmZ0FCYW5kW2ldID0gQWRhdGE7CisJCXBBZC0+VHgyME1Qd3JDZmdHQmFuZFtpXSA9IHBBZC0+VHg0ME1Qd3JDZmdHQmFuZFtpXSA9IEdkYXRhOworCisJCWlmIChkYXRhICE9IDB4ZmZmZmZmZmYpCisJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9QV1JfQ0ZHXzAgKyBpKjQsIGRhdGEpOworCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiMjBNSHogQlcsIDIuNEcgYmFuZC0lbHgsICBBZGF0YSA9ICVseCwgIEdkYXRhID0gJWx4IFxuIiwgZGF0YSwgQWRhdGEsIEdkYXRhKSk7CisJfQorCisJLy8KKwkvLyBDaGVjayB0aGlzIGJsb2NrIGlzIHZhbGlkIGZvciA0ME1IeiBpbiAyLjRHLiBJZiBpbnZhbGlkLCB1c2UgcGFyYW1ldGVyIGZvciAyME1IeiBpbiAyLjRHCisJLy8KKwliVmFsaWQgPSBUUlVFOworCWZvciAoaT0wOyBpPDY7IGkrKykKKwl7CisJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX1RYUE9XRVJfQllSQVRFXzQwTUhaXzJfNEcgKyAyICsgaSoyLCB2YWx1ZSk7CisJCWlmICgoKHZhbHVlICYgMHgwMEZGKSA9PSAweDAwRkYpIHx8ICgodmFsdWUgJiAweEZGMDApID09IDB4RkYwMCkpCisJCXsKKwkJCWJWYWxpZCA9IEZBTFNFOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvLworCS8vIEdldCBUeHBvd2VyIHBlciBNQ1MgZm9yIDQwTUh6IGluIDIuNEcuCisJLy8KKwlpZiAoYlZhbGlkKQorCXsKKwkJZm9yIChpPTA7IGk8NDsgaSsrKQorCQl7CisJCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9UWFBPV0VSX0JZUkFURV80ME1IWl8yXzRHICsgaSo0LCB2YWx1ZSk7CisJCQlpZiAoYkdwd3JkZWx0YU1pbnVzID09IEZBTFNFKQorCQkJeworCQkJCXQxID0gKHZhbHVlJjB4ZikrKEdwd3JkZWx0YSk7CisJCQkJaWYgKHQxID4gMHhmKQorCQkJCQl0MSA9IDB4ZjsKKwkJCQl0MiA9ICgodmFsdWUmMHhmMCk+PjQpKyhHcHdyZGVsdGEpOworCQkJCWlmICh0MiA+IDB4ZikKKwkJCQkJdDIgPSAweGY7CisJCQkJdDMgPSAoKHZhbHVlJjB4ZjAwKT4+OCkrKEdwd3JkZWx0YSk7CisJCQkJaWYgKHQzID4gMHhmKQorCQkJCQl0MyA9IDB4ZjsKKwkJCQl0NCA9ICgodmFsdWUmMHhmMDAwKT4+MTIpKyhHcHdyZGVsdGEpOworCQkJCWlmICh0NCA+IDB4ZikKKwkJCQkJdDQgPSAweGY7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJaWYgKCh2YWx1ZSYweGYpID4gR3B3cmRlbHRhKQorCQkJCQl0MSA9ICh2YWx1ZSYweGYpLShHcHdyZGVsdGEpOworCQkJCWVsc2UKKwkJCQkJdDEgPSAwOworCQkJCWlmICgoKHZhbHVlJjB4ZjApPj40KSA+IEdwd3JkZWx0YSkKKwkJCQkJdDIgPSAoKHZhbHVlJjB4ZjApPj40KS0oR3B3cmRlbHRhKTsKKwkJCQllbHNlCisJCQkJCXQyID0gMDsKKwkJCQlpZiAoKCh2YWx1ZSYweGYwMCk+PjgpID4gR3B3cmRlbHRhKQorCQkJCQl0MyA9ICgodmFsdWUmMHhmMDApPj44KS0oR3B3cmRlbHRhKTsKKwkJCQllbHNlCisJCQkJCXQzID0gMDsKKwkJCQlpZiAoKCh2YWx1ZSYweGYwMDApPj4xMikgPiBHcHdyZGVsdGEpCisJCQkJCXQ0ID0gKCh2YWx1ZSYweGYwMDApPj4xMiktKEdwd3JkZWx0YSk7CisJCQkJZWxzZQorCQkJCQl0NCA9IDA7CisJCQl9CisJCQlHZGF0YSA9IHQxICsgKHQyPDw0KSArICh0Mzw8OCkgKyAodDQ8PDEyKTsKKworCQkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fVFhQT1dFUl9CWVJBVEVfNDBNSFpfMl80RyArIGkqNCArIDIsIHZhbHVlKTsKKwkJCWlmIChiR3B3cmRlbHRhTWludXMgPT0gRkFMU0UpCisJCQl7CisJCQkJdDEgPSAodmFsdWUmMHhmKSsoR3B3cmRlbHRhKTsKKwkJCQlpZiAodDEgPiAweGYpCisJCQkJCXQxID0gMHhmOworCQkJCXQyID0gKCh2YWx1ZSYweGYwKT4+NCkrKEdwd3JkZWx0YSk7CisJCQkJaWYgKHQyID4gMHhmKQorCQkJCQl0MiA9IDB4ZjsKKwkJCQl0MyA9ICgodmFsdWUmMHhmMDApPj44KSsoR3B3cmRlbHRhKTsKKwkJCQlpZiAodDMgPiAweGYpCisJCQkJCXQzID0gMHhmOworCQkJCXQ0ID0gKCh2YWx1ZSYweGYwMDApPj4xMikrKEdwd3JkZWx0YSk7CisJCQkJaWYgKHQ0ID4gMHhmKQorCQkJCQl0NCA9IDB4ZjsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlpZiAoKHZhbHVlJjB4ZikgPiBHcHdyZGVsdGEpCisJCQkJCXQxID0gKHZhbHVlJjB4ZiktKEdwd3JkZWx0YSk7CisJCQkJZWxzZQorCQkJCQl0MSA9IDA7CisJCQkJaWYgKCgodmFsdWUmMHhmMCk+PjQpID4gR3B3cmRlbHRhKQorCQkJCQl0MiA9ICgodmFsdWUmMHhmMCk+PjQpLShHcHdyZGVsdGEpOworCQkJCWVsc2UKKwkJCQkJdDIgPSAwOworCQkJCWlmICgoKHZhbHVlJjB4ZjAwKT4+OCkgPiBHcHdyZGVsdGEpCisJCQkJCXQzID0gKCh2YWx1ZSYweGYwMCk+PjgpLShHcHdyZGVsdGEpOworCQkJCWVsc2UKKwkJCQkJdDMgPSAwOworCQkJCWlmICgoKHZhbHVlJjB4ZjAwMCk+PjEyKSA+IEdwd3JkZWx0YSkKKwkJCQkJdDQgPSAoKHZhbHVlJjB4ZjAwMCk+PjEyKS0oR3B3cmRlbHRhKTsKKwkJCQllbHNlCisJCQkJCXQ0ID0gMDsKKwkJCX0KKwkJCUdkYXRhIHw9ICgodDE8PDE2KSArICh0Mjw8MjApICsgKHQzPDwyNCkgKyAodDQ8PDI4KSk7CisKKwkJCWlmIChpID09IDApCisJCQkJcEFkLT5UeDQwTVB3ckNmZ0dCYW5kW2krMV0gPSAocEFkLT5UeDQwTVB3ckNmZ0dCYW5kW2krMV0gJiAweDAwMDBGRkZGKSB8IChHZGF0YSAmIDB4RkZGRjAwMDApOworCQkJZWxzZQorCQkJCXBBZC0+VHg0ME1Qd3JDZmdHQmFuZFtpKzFdID0gR2RhdGE7CisKKwkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCI0ME1IeiBCVywgMi40RyBiYW5kLCBHZGF0YSA9ICVseCBcbiIsIEdkYXRhKSk7CisJCX0KKwl9CisKKwkvLworCS8vIENoZWNrIHRoaXMgYmxvY2sgaXMgdmFsaWQgZm9yIDIwTUh6IGluIDVHLiBJZiBpbnZhbGlkLCB1c2UgcGFyYW1ldGVyIGZvciAyME1IeiBpbiAyLjRHCisJLy8KKwliVmFsaWQgPSBUUlVFOworCWZvciAoaT0wOyBpPDg7IGkrKykKKwl7CisJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX1RYUE9XRVJfQllSQVRFXzIwTUhaXzVHICsgMiArIGkqMiwgdmFsdWUpOworCQlpZiAoKCh2YWx1ZSAmIDB4MDBGRikgPT0gMHgwMEZGKSB8fCAoKHZhbHVlICYgMHhGRjAwKSA9PSAweEZGMDApKQorCQl7CisJCQliVmFsaWQgPSBGQUxTRTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJLy8KKwkvLyBHZXQgVHhwb3dlciBwZXIgTUNTIGZvciAyME1IeiBpbiA1Ry4KKwkvLworCWlmIChiVmFsaWQpCisJeworCQlmb3IgKGk9MDsgaTw1OyBpKyspCisJCXsKKwkJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX1RYUE9XRVJfQllSQVRFXzIwTUhaXzVHICsgaSo0LCB2YWx1ZSk7CisJCQlpZiAoYkFwd3JkZWx0YU1pbnVzID09IEZBTFNFKQorCQkJeworCQkJCXQxID0gKHZhbHVlJjB4ZikrKEFwd3JkZWx0YSk7CisJCQkJaWYgKHQxID4gMHhmKQorCQkJCQl0MSA9IDB4ZjsKKwkJCQl0MiA9ICgodmFsdWUmMHhmMCk+PjQpKyhBcHdyZGVsdGEpOworCQkJCWlmICh0MiA+IDB4ZikKKwkJCQkJdDIgPSAweGY7CisJCQkJdDMgPSAoKHZhbHVlJjB4ZjAwKT4+OCkrKEFwd3JkZWx0YSk7CisJCQkJaWYgKHQzID4gMHhmKQorCQkJCQl0MyA9IDB4ZjsKKwkJCQl0NCA9ICgodmFsdWUmMHhmMDAwKT4+MTIpKyhBcHdyZGVsdGEpOworCQkJCWlmICh0NCA+IDB4ZikKKwkJCQkJdDQgPSAweGY7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJaWYgKCh2YWx1ZSYweGYpID4gQXB3cmRlbHRhKQorCQkJCQl0MSA9ICh2YWx1ZSYweGYpLShBcHdyZGVsdGEpOworCQkJCWVsc2UKKwkJCQkJdDEgPSAwOworCQkJCWlmICgoKHZhbHVlJjB4ZjApPj40KSA+IEFwd3JkZWx0YSkKKwkJCQkJdDIgPSAoKHZhbHVlJjB4ZjApPj40KS0oQXB3cmRlbHRhKTsKKwkJCQllbHNlCisJCQkJCXQyID0gMDsKKwkJCQlpZiAoKCh2YWx1ZSYweGYwMCk+PjgpID4gQXB3cmRlbHRhKQorCQkJCQl0MyA9ICgodmFsdWUmMHhmMDApPj44KS0oQXB3cmRlbHRhKTsKKwkJCQllbHNlCisJCQkJCXQzID0gMDsKKwkJCQlpZiAoKCh2YWx1ZSYweGYwMDApPj4xMikgPiBBcHdyZGVsdGEpCisJCQkJCXQ0ID0gKCh2YWx1ZSYweGYwMDApPj4xMiktKEFwd3JkZWx0YSk7CisJCQkJZWxzZQorCQkJCQl0NCA9IDA7CisJCQl9CisJCQlBZGF0YSA9IHQxICsgKHQyPDw0KSArICh0Mzw8OCkgKyAodDQ8PDEyKTsKKworCQkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fVFhQT1dFUl9CWVJBVEVfMjBNSFpfNUcgKyBpKjQgKyAyLCB2YWx1ZSk7CisJCQlpZiAoYkFwd3JkZWx0YU1pbnVzID09IEZBTFNFKQorCQkJeworCQkJCXQxID0gKHZhbHVlJjB4ZikrKEFwd3JkZWx0YSk7CisJCQkJaWYgKHQxID4gMHhmKQorCQkJCQl0MSA9IDB4ZjsKKwkJCQl0MiA9ICgodmFsdWUmMHhmMCk+PjQpKyhBcHdyZGVsdGEpOworCQkJCWlmICh0MiA+IDB4ZikKKwkJCQkJdDIgPSAweGY7CisJCQkJdDMgPSAoKHZhbHVlJjB4ZjAwKT4+OCkrKEFwd3JkZWx0YSk7CisJCQkJaWYgKHQzID4gMHhmKQorCQkJCQl0MyA9IDB4ZjsKKwkJCQl0NCA9ICgodmFsdWUmMHhmMDAwKT4+MTIpKyhBcHdyZGVsdGEpOworCQkJCWlmICh0NCA+IDB4ZikKKwkJCQkJdDQgPSAweGY7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJaWYgKCh2YWx1ZSYweGYpID4gQXB3cmRlbHRhKQorCQkJCQl0MSA9ICh2YWx1ZSYweGYpLShBcHdyZGVsdGEpOworCQkJCWVsc2UKKwkJCQkJdDEgPSAwOworCQkJCWlmICgoKHZhbHVlJjB4ZjApPj40KSA+IEFwd3JkZWx0YSkKKwkJCQkJdDIgPSAoKHZhbHVlJjB4ZjApPj40KS0oQXB3cmRlbHRhKTsKKwkJCQllbHNlCisJCQkJCXQyID0gMDsKKwkJCQlpZiAoKCh2YWx1ZSYweGYwMCk+PjgpID4gQXB3cmRlbHRhKQorCQkJCQl0MyA9ICgodmFsdWUmMHhmMDApPj44KS0oQXB3cmRlbHRhKTsKKwkJCQllbHNlCisJCQkJCXQzID0gMDsKKwkJCQlpZiAoKCh2YWx1ZSYweGYwMDApPj4xMikgPiBBcHdyZGVsdGEpCisJCQkJCXQ0ID0gKCh2YWx1ZSYweGYwMDApPj4xMiktKEFwd3JkZWx0YSk7CisJCQkJZWxzZQorCQkJCQl0NCA9IDA7CisJCQl9CisJCQlBZGF0YSB8PSAoKHQxPDwxNikgKyAodDI8PDIwKSArICh0Mzw8MjQpICsgKHQ0PDwyOCkpOworCisJCQlpZiAoaSA9PSAwKQorCQkJCXBBZC0+VHgyME1Qd3JDZmdBQmFuZFtpXSA9IChwQWQtPlR4MjBNUHdyQ2ZnQUJhbmRbaV0gJiAweDAwMDBGRkZGKSB8IChBZGF0YSAmIDB4RkZGRjAwMDApOworCQkJZWxzZQorCQkJCXBBZC0+VHgyME1Qd3JDZmdBQmFuZFtpXSA9IEFkYXRhOworCisJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiMjBNSHogQlcsIDVHSHogYmFuZCwgQWRhdGEgPSAlbHggXG4iLCBBZGF0YSkpOworCQl9CisJfQorCisJLy8KKwkvLyBDaGVjayB0aGlzIGJsb2NrIGlzIHZhbGlkIGZvciA0ME1IeiBpbiA1Ry4gSWYgaW52YWxpZCwgdXNlIHBhcmFtZXRlciBmb3IgMjBNSHogaW4gMi40RworCS8vCisJYlZhbGlkID0gVFJVRTsKKwlmb3IgKGk9MDsgaTw2OyBpKyspCisJeworCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9UWFBPV0VSX0JZUkFURV80ME1IWl81RyArIDIgKyBpKjIsIHZhbHVlKTsKKwkJaWYgKCgodmFsdWUgJiAweDAwRkYpID09IDB4MDBGRikgfHwgKCh2YWx1ZSAmIDB4RkYwMCkgPT0gMHhGRjAwKSkKKwkJeworCQkJYlZhbGlkID0gRkFMU0U7CisJCQlicmVhazsKKwkJfQorCX0KKworCS8vCisJLy8gR2V0IFR4cG93ZXIgcGVyIE1DUyBmb3IgNDBNSHogaW4gNUcuCisJLy8KKwlpZiAoYlZhbGlkKQorCXsKKwkJZm9yIChpPTA7IGk8NDsgaSsrKQorCQl7CisJCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9UWFBPV0VSX0JZUkFURV80ME1IWl81RyArIGkqNCwgdmFsdWUpOworCQkJaWYgKGJBcHdyZGVsdGFNaW51cyA9PSBGQUxTRSkKKwkJCXsKKwkJCQl0MSA9ICh2YWx1ZSYweGYpKyhBcHdyZGVsdGEpOworCQkJCWlmICh0MSA+IDB4ZikKKwkJCQkJdDEgPSAweGY7CisJCQkJdDIgPSAoKHZhbHVlJjB4ZjApPj40KSsoQXB3cmRlbHRhKTsKKwkJCQlpZiAodDIgPiAweGYpCisJCQkJCXQyID0gMHhmOworCQkJCXQzID0gKCh2YWx1ZSYweGYwMCk+PjgpKyhBcHdyZGVsdGEpOworCQkJCWlmICh0MyA+IDB4ZikKKwkJCQkJdDMgPSAweGY7CisJCQkJdDQgPSAoKHZhbHVlJjB4ZjAwMCk+PjEyKSsoQXB3cmRlbHRhKTsKKwkJCQlpZiAodDQgPiAweGYpCisJCQkJCXQ0ID0gMHhmOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWlmICgodmFsdWUmMHhmKSA+IEFwd3JkZWx0YSkKKwkJCQkJdDEgPSAodmFsdWUmMHhmKS0oQXB3cmRlbHRhKTsKKwkJCQllbHNlCisJCQkJCXQxID0gMDsKKwkJCQlpZiAoKCh2YWx1ZSYweGYwKT4+NCkgPiBBcHdyZGVsdGEpCisJCQkJCXQyID0gKCh2YWx1ZSYweGYwKT4+NCktKEFwd3JkZWx0YSk7CisJCQkJZWxzZQorCQkJCQl0MiA9IDA7CisJCQkJaWYgKCgodmFsdWUmMHhmMDApPj44KSA+IEFwd3JkZWx0YSkKKwkJCQkJdDMgPSAoKHZhbHVlJjB4ZjAwKT4+OCktKEFwd3JkZWx0YSk7CisJCQkJZWxzZQorCQkJCQl0MyA9IDA7CisJCQkJaWYgKCgodmFsdWUmMHhmMDAwKT4+MTIpID4gQXB3cmRlbHRhKQorCQkJCQl0NCA9ICgodmFsdWUmMHhmMDAwKT4+MTIpLShBcHdyZGVsdGEpOworCQkJCWVsc2UKKwkJCQkJdDQgPSAwOworCQkJfQorCQkJQWRhdGEgPSB0MSArICh0Mjw8NCkgKyAodDM8PDgpICsgKHQ0PDwxMik7CisKKwkJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX1RYUE9XRVJfQllSQVRFXzQwTUhaXzVHICsgaSo0ICsgMiwgdmFsdWUpOworCQkJaWYgKGJBcHdyZGVsdGFNaW51cyA9PSBGQUxTRSkKKwkJCXsKKwkJCQl0MSA9ICh2YWx1ZSYweGYpKyhBcHdyZGVsdGEpOworCQkJCWlmICh0MSA+IDB4ZikKKwkJCQkJdDEgPSAweGY7CisJCQkJdDIgPSAoKHZhbHVlJjB4ZjApPj40KSsoQXB3cmRlbHRhKTsKKwkJCQlpZiAodDIgPiAweGYpCisJCQkJCXQyID0gMHhmOworCQkJCXQzID0gKCh2YWx1ZSYweGYwMCk+PjgpKyhBcHdyZGVsdGEpOworCQkJCWlmICh0MyA+IDB4ZikKKwkJCQkJdDMgPSAweGY7CisJCQkJdDQgPSAoKHZhbHVlJjB4ZjAwMCk+PjEyKSsoQXB3cmRlbHRhKTsKKwkJCQlpZiAodDQgPiAweGYpCisJCQkJCXQ0ID0gMHhmOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWlmICgodmFsdWUmMHhmKSA+IEFwd3JkZWx0YSkKKwkJCQkJdDEgPSAodmFsdWUmMHhmKS0oQXB3cmRlbHRhKTsKKwkJCQllbHNlCisJCQkJCXQxID0gMDsKKwkJCQlpZiAoKCh2YWx1ZSYweGYwKT4+NCkgPiBBcHdyZGVsdGEpCisJCQkJCXQyID0gKCh2YWx1ZSYweGYwKT4+NCktKEFwd3JkZWx0YSk7CisJCQkJZWxzZQorCQkJCQl0MiA9IDA7CisJCQkJaWYgKCgodmFsdWUmMHhmMDApPj44KSA+IEFwd3JkZWx0YSkKKwkJCQkJdDMgPSAoKHZhbHVlJjB4ZjAwKT4+OCktKEFwd3JkZWx0YSk7CisJCQkJZWxzZQorCQkJCQl0MyA9IDA7CisJCQkJaWYgKCgodmFsdWUmMHhmMDAwKT4+MTIpID4gQXB3cmRlbHRhKQorCQkJCQl0NCA9ICgodmFsdWUmMHhmMDAwKT4+MTIpLShBcHdyZGVsdGEpOworCQkJCWVsc2UKKwkJCQkJdDQgPSAwOworCQkJfQorCQkJQWRhdGEgfD0gKCh0MTw8MTYpICsgKHQyPDwyMCkgKyAodDM8PDI0KSArICh0NDw8MjgpKTsKKworCQkJaWYgKGkgPT0gMCkKKwkJCQlwQWQtPlR4NDBNUHdyQ2ZnQUJhbmRbaSsxXSA9IChwQWQtPlR4NDBNUHdyQ2ZnQUJhbmRbaSsxXSAmIDB4MDAwMEZGRkYpIHwgKEFkYXRhICYgMHhGRkZGMDAwMCk7CisJCQllbHNlCisJCQkJcEFkLT5UeDQwTVB3ckNmZ0FCYW5kW2krMV0gPSBBZGF0YTsKKworCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIjQwTUh6IEJXLCA1R0h6IGJhbmQsIEFkYXRhID0gJWx4IFxuIiwgQWRhdGEpKTsKKwkJfQorCX0KK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJUmVhZCBpbml0aWFsIGNoYW5uZWwgcG93ZXIgcGFyYW1ldGVycyBmcm9tIEVFUFJPTQorCisJQXJndW1lbnRzOgorCQlBZGFwdGVyCQkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJUlRNUFJlYWRDaGFubmVsUHdyKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKQoreworCVVDSEFSCQkJCWksIGNob2Zmc2V0OworCUVFUFJPTV9UWF9QV1JfU1RSVUMJICAgIFBvd2VyOworCUVFUFJPTV9UWF9QV1JfU1RSVUMJICAgIFBvd2VyMjsKKworCS8vIFJlYWQgVHggcG93ZXIgdmFsdWUgZm9yIGFsbCBjaGFubmVscworCS8vIFZhbHVlIGZyb20gMSAtIDB4N2YuIERlZmF1bHQgdmFsdWUgaXMgMjQuCisJLy8gUG93ZXIgdmFsdWUgOiAyLjRHIDB4MDAgKDApIH4gMHgxRiAoMzEpCisJLy8gICAgICAgICAgICAgOiA1LjVHIDB4RjkgKC03KSB+IDB4MEYgKDE1KQorCisJLy8gMC4gMTFiL2csIGNoMSAtIGNoIDE0CisJZm9yIChpID0gMDsgaSA8IDc7IGkrKykKKwl7CisvLwkJUG93ZXIud29yZCA9IFJUTVBfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9HX1RYX1BXUl9PRkZTRVQgKyBpICogMik7CisvLwkJUG93ZXIyLndvcmQgPSBSVE1QX0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fR19UWDJfUFdSX09GRlNFVCArIGkgKiAyKTsKKwkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fR19UWF9QV1JfT0ZGU0VUICsgaSAqIDIsIFBvd2VyLndvcmQpOworCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9HX1RYMl9QV1JfT0ZGU0VUICsgaSAqIDIsIFBvd2VyMi53b3JkKTsKKwkJcEFkLT5UeFBvd2VyW2kgKiAyXS5DaGFubmVsID0gaSAqIDIgKyAxOworCQlwQWQtPlR4UG93ZXJbaSAqIDIgKyAxXS5DaGFubmVsID0gaSAqIDIgKyAyOworCisJCWlmICgoUG93ZXIuZmllbGQuQnl0ZTAgPiAzMSkgfHwgKFBvd2VyLmZpZWxkLkJ5dGUwIDwgMCkpCisJCQlwQWQtPlR4UG93ZXJbaSAqIDJdLlBvd2VyID0gREVGQVVMVF9SRl9UWF9QT1dFUjsKKwkJZWxzZQorCQkJcEFkLT5UeFBvd2VyW2kgKiAyXS5Qb3dlciA9IFBvd2VyLmZpZWxkLkJ5dGUwOworCisJCWlmICgoUG93ZXIuZmllbGQuQnl0ZTEgPiAzMSkgfHwgKFBvd2VyLmZpZWxkLkJ5dGUxIDwgMCkpCisJCQlwQWQtPlR4UG93ZXJbaSAqIDIgKyAxXS5Qb3dlciA9IERFRkFVTFRfUkZfVFhfUE9XRVI7CisJCWVsc2UKKwkJCXBBZC0+VHhQb3dlcltpICogMiArIDFdLlBvd2VyID0gUG93ZXIuZmllbGQuQnl0ZTE7CisKKwkJaWYgKChQb3dlcjIuZmllbGQuQnl0ZTAgPiAzMSkgfHwgKFBvd2VyMi5maWVsZC5CeXRlMCA8IDApKQorCQkJcEFkLT5UeFBvd2VyW2kgKiAyXS5Qb3dlcjIgPSBERUZBVUxUX1JGX1RYX1BPV0VSOworCQllbHNlCisJCQlwQWQtPlR4UG93ZXJbaSAqIDJdLlBvd2VyMiA9IFBvd2VyMi5maWVsZC5CeXRlMDsKKworCQlpZiAoKFBvd2VyMi5maWVsZC5CeXRlMSA+IDMxKSB8fCAoUG93ZXIyLmZpZWxkLkJ5dGUxIDwgMCkpCisJCQlwQWQtPlR4UG93ZXJbaSAqIDIgKyAxXS5Qb3dlcjIgPSBERUZBVUxUX1JGX1RYX1BPV0VSOworCQllbHNlCisJCQlwQWQtPlR4UG93ZXJbaSAqIDIgKyAxXS5Qb3dlcjIgPSBQb3dlcjIuZmllbGQuQnl0ZTE7CisJfQorCisJLy8gMS4gVS1OSUkgbG93ZXIvbWlkZGxlIGJhbmQ6IDM2LCAzOCwgNDA7IDQ0LCA0NiwgNDg7IDUyLCA1NCwgNTY7IDYwLCA2MiwgNjQgKGluY2x1ZGluZyBjZW50cmFsIGZyZXF1ZW5jeSBpbiBCVyA0ME1IeikKKwkvLyAxLjEgRmlsbCB1cCBjaGFubmVsCisJY2hvZmZzZXQgPSAxNDsKKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorCXsKKwkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAwXS5DaGFubmVsCT0gMzYgKyBpICogOCArIDA7CisJCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMF0uUG93ZXIJPSBERUZBVUxUX1JGX1RYX1BPV0VSOworCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDBdLlBvd2VyMgk9IERFRkFVTFRfUkZfVFhfUE9XRVI7CisKKwkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAxXS5DaGFubmVsCT0gMzYgKyBpICogOCArIDI7CisJCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMV0uUG93ZXIJPSBERUZBVUxUX1JGX1RYX1BPV0VSOworCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDFdLlBvd2VyMgk9IERFRkFVTFRfUkZfVFhfUE9XRVI7CisKKwkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAyXS5DaGFubmVsCT0gMzYgKyBpICogOCArIDQ7CisJCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMl0uUG93ZXIJPSBERUZBVUxUX1JGX1RYX1BPV0VSOworCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDJdLlBvd2VyMgk9IERFRkFVTFRfUkZfVFhfUE9XRVI7CisJfQorCisJLy8gMS4yIEZpbGwgdXAgcG93ZXIKKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCXsKKy8vCQlQb3dlci53b3JkID0gUlRNUF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX0FfVFhfUFdSX09GRlNFVCArIGkgKiAyKTsKKy8vCQlQb3dlcjIud29yZCA9IFJUTVBfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9BX1RYMl9QV1JfT0ZGU0VUICsgaSAqIDIpOworCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9BX1RYX1BXUl9PRkZTRVQgKyBpICogMiwgUG93ZXIud29yZCk7CisJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX0FfVFgyX1BXUl9PRkZTRVQgKyBpICogMiwgUG93ZXIyLndvcmQpOworCisJCWlmICgoUG93ZXIuZmllbGQuQnl0ZTAgPCAxNikgJiYgKFBvd2VyLmZpZWxkLkJ5dGUwID49IC03KSkKKwkJCXBBZC0+VHhQb3dlcltpICogMiArIGNob2Zmc2V0ICsgMF0uUG93ZXIgPSBQb3dlci5maWVsZC5CeXRlMDsKKworCQlpZiAoKFBvd2VyLmZpZWxkLkJ5dGUxIDwgMTYpICYmIChQb3dlci5maWVsZC5CeXRlMSA+PSAtNykpCisJCQlwQWQtPlR4UG93ZXJbaSAqIDIgKyBjaG9mZnNldCArIDFdLlBvd2VyID0gUG93ZXIuZmllbGQuQnl0ZTE7CisKKwkJaWYgKChQb3dlcjIuZmllbGQuQnl0ZTAgPCAxNikgJiYgKFBvd2VyMi5maWVsZC5CeXRlMCA+PSAtNykpCisJCQlwQWQtPlR4UG93ZXJbaSAqIDIgKyBjaG9mZnNldCArIDBdLlBvd2VyMiA9IFBvd2VyMi5maWVsZC5CeXRlMDsKKworCQlpZiAoKFBvd2VyMi5maWVsZC5CeXRlMSA8IDE2KSAmJiAoUG93ZXIyLmZpZWxkLkJ5dGUxID49IC03KSkKKwkJCXBBZC0+VHhQb3dlcltpICogMiArIGNob2Zmc2V0ICsgMV0uUG93ZXIyID0gUG93ZXIyLmZpZWxkLkJ5dGUxOworCX0KKworCS8vIDIuIEhpcHBlckxBTiAyIDEwMCwgMTAyICwxMDQ7IDEwOCwgMTEwLCAxMTI7IDExNiwgMTE4LCAxMjA7IDEyNCwgMTI2LCAxMjg7IDEzMiwgMTM0LCAxMzY7IDE0MCAoaW5jbHVkaW5nIGNlbnRyYWwgZnJlcXVlbmN5IGluIEJXIDQwTUh6KQorCS8vIDIuMSBGaWxsIHVwIGNoYW5uZWwKKwljaG9mZnNldCA9IDE0ICsgMTI7CisJZm9yIChpID0gMDsgaSA8IDU7IGkrKykKKwl7CisJCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMF0uQ2hhbm5lbAk9IDEwMCArIGkgKiA4ICsgMDsKKwkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAwXS5Qb3dlcgk9IERFRkFVTFRfUkZfVFhfUE9XRVI7CisJCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMF0uUG93ZXIyCT0gREVGQVVMVF9SRl9UWF9QT1dFUjsKKworCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDFdLkNoYW5uZWwJPSAxMDAgKyBpICogOCArIDI7CisJCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMV0uUG93ZXIJPSBERUZBVUxUX1JGX1RYX1BPV0VSOworCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDFdLlBvd2VyMgk9IERFRkFVTFRfUkZfVFhfUE9XRVI7CisKKwkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAyXS5DaGFubmVsCT0gMTAwICsgaSAqIDggKyA0OworCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDJdLlBvd2VyCT0gREVGQVVMVF9SRl9UWF9QT1dFUjsKKwkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAyXS5Qb3dlcjIJPSBERUZBVUxUX1JGX1RYX1BPV0VSOworCX0KKwlwQWQtPlR4UG93ZXJbMyAqIDUgKyBjaG9mZnNldCArIDBdLkNoYW5uZWwJCT0gMTQwOworCXBBZC0+VHhQb3dlclszICogNSArIGNob2Zmc2V0ICsgMF0uUG93ZXIJCT0gREVGQVVMVF9SRl9UWF9QT1dFUjsKKwlwQWQtPlR4UG93ZXJbMyAqIDUgKyBjaG9mZnNldCArIDBdLlBvd2VyMgkJPSBERUZBVUxUX1JGX1RYX1BPV0VSOworCisJLy8gMi4yIEZpbGwgdXAgcG93ZXIKKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorCXsKKy8vCQlQb3dlci53b3JkID0gUlRNUF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX0FfVFhfUFdSX09GRlNFVCArIChjaG9mZnNldCAtIDE0KSArIGkgKiAyKTsKKy8vCQlQb3dlcjIud29yZCA9IFJUTVBfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9BX1RYMl9QV1JfT0ZGU0VUICsgKGNob2Zmc2V0IC0gMTQpICsgaSAqIDIpOworCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9BX1RYX1BXUl9PRkZTRVQgKyAoY2hvZmZzZXQgLSAxNCkgKyBpICogMiwgUG93ZXIud29yZCk7CisJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX0FfVFgyX1BXUl9PRkZTRVQgKyAoY2hvZmZzZXQgLSAxNCkgKyBpICogMiwgUG93ZXIyLndvcmQpOworCisJCWlmICgoUG93ZXIuZmllbGQuQnl0ZTAgPCAxNikgJiYgKFBvd2VyLmZpZWxkLkJ5dGUwID49IC03KSkKKwkJCXBBZC0+VHhQb3dlcltpICogMiArIGNob2Zmc2V0ICsgMF0uUG93ZXIgPSBQb3dlci5maWVsZC5CeXRlMDsKKworCQlpZiAoKFBvd2VyLmZpZWxkLkJ5dGUxIDwgMTYpICYmIChQb3dlci5maWVsZC5CeXRlMSA+PSAtNykpCisJCQlwQWQtPlR4UG93ZXJbaSAqIDIgKyBjaG9mZnNldCArIDFdLlBvd2VyID0gUG93ZXIuZmllbGQuQnl0ZTE7CisKKwkJaWYgKChQb3dlcjIuZmllbGQuQnl0ZTAgPCAxNikgJiYgKFBvd2VyMi5maWVsZC5CeXRlMCA+PSAtNykpCisJCQlwQWQtPlR4UG93ZXJbaSAqIDIgKyBjaG9mZnNldCArIDBdLlBvd2VyMiA9IFBvd2VyMi5maWVsZC5CeXRlMDsKKworCQlpZiAoKFBvd2VyMi5maWVsZC5CeXRlMSA8IDE2KSAmJiAoUG93ZXIyLmZpZWxkLkJ5dGUxID49IC03KSkKKwkJCXBBZC0+VHhQb3dlcltpICogMiArIGNob2Zmc2V0ICsgMV0uUG93ZXIyID0gUG93ZXIyLmZpZWxkLkJ5dGUxOworCX0KKworCS8vIDMuIFUtTklJIHVwcGVyIGJhbmQ6IDE0OSwgMTUxLCAxNTM7IDE1NywgMTU5LCAxNjE7IDE2NSAoaW5jbHVkaW5nIGNlbnRyYWwgZnJlcXVlbmN5IGluIEJXIDQwTUh6KQorCS8vIDMuMSBGaWxsIHVwIGNoYW5uZWwKKwljaG9mZnNldCA9IDE0ICsgMTIgKyAxNjsKKwlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKQorCXsKKwkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAwXS5DaGFubmVsCT0gMTQ5ICsgaSAqIDggKyAwOworCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDBdLlBvd2VyCT0gREVGQVVMVF9SRl9UWF9QT1dFUjsKKwkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAwXS5Qb3dlcjIJPSBERUZBVUxUX1JGX1RYX1BPV0VSOworCisJCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMV0uQ2hhbm5lbAk9IDE0OSArIGkgKiA4ICsgMjsKKwkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAxXS5Qb3dlcgk9IERFRkFVTFRfUkZfVFhfUE9XRVI7CisJCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMV0uUG93ZXIyCT0gREVGQVVMVF9SRl9UWF9QT1dFUjsKKworCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDJdLkNoYW5uZWwJPSAxNDkgKyBpICogOCArIDQ7CisJCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMl0uUG93ZXIJPSBERUZBVUxUX1JGX1RYX1BPV0VSOworCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDJdLlBvd2VyMgk9IERFRkFVTFRfUkZfVFhfUE9XRVI7CisJfQorCXBBZC0+VHhQb3dlclszICogMiArIGNob2Zmc2V0ICsgMF0uQ2hhbm5lbAkJPSAxNjU7CisJcEFkLT5UeFBvd2VyWzMgKiAyICsgY2hvZmZzZXQgKyAwXS5Qb3dlcgkJPSBERUZBVUxUX1JGX1RYX1BPV0VSOworCXBBZC0+VHhQb3dlclszICogMiArIGNob2Zmc2V0ICsgMF0uUG93ZXIyCQk9IERFRkFVTFRfUkZfVFhfUE9XRVI7CisKKwkvLyAzLjIgRmlsbCB1cCBwb3dlcgorCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisJeworLy8JCVBvd2VyLndvcmQgPSBSVE1QX0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fQV9UWF9QV1JfT0ZGU0VUICsgKGNob2Zmc2V0IC0gMTQpICsgaSAqIDIpOworLy8JCVBvd2VyMi53b3JkID0gUlRNUF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX0FfVFgyX1BXUl9PRkZTRVQgKyAoY2hvZmZzZXQgLSAxNCkgKyBpICogMik7CisJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX0FfVFhfUFdSX09GRlNFVCArIChjaG9mZnNldCAtIDE0KSArIGkgKiAyLCBQb3dlci53b3JkKTsKKwkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fQV9UWDJfUFdSX09GRlNFVCArIChjaG9mZnNldCAtIDE0KSArIGkgKiAyLCBQb3dlcjIud29yZCk7CisKKwkJaWYgKChQb3dlci5maWVsZC5CeXRlMCA8IDE2KSAmJiAoUG93ZXIuZmllbGQuQnl0ZTAgPj0gLTcpKQorCQkJcEFkLT5UeFBvd2VyW2kgKiAyICsgY2hvZmZzZXQgKyAwXS5Qb3dlciA9IFBvd2VyLmZpZWxkLkJ5dGUwOworCisJCWlmICgoUG93ZXIuZmllbGQuQnl0ZTEgPCAxNikgJiYgKFBvd2VyLmZpZWxkLkJ5dGUxID49IC03KSkKKwkJCXBBZC0+VHhQb3dlcltpICogMiArIGNob2Zmc2V0ICsgMV0uUG93ZXIgPSBQb3dlci5maWVsZC5CeXRlMTsKKworCQlpZiAoKFBvd2VyMi5maWVsZC5CeXRlMCA8IDE2KSAmJiAoUG93ZXIyLmZpZWxkLkJ5dGUwID49IC03KSkKKwkJCXBBZC0+VHhQb3dlcltpICogMiArIGNob2Zmc2V0ICsgMF0uUG93ZXIyID0gUG93ZXIyLmZpZWxkLkJ5dGUwOworCisJCWlmICgoUG93ZXIyLmZpZWxkLkJ5dGUxIDwgMTYpICYmIChQb3dlcjIuZmllbGQuQnl0ZTEgPj0gLTcpKQorCQkJcEFkLT5UeFBvd2VyW2kgKiAyICsgY2hvZmZzZXQgKyAxXS5Qb3dlcjIgPSBQb3dlcjIuZmllbGQuQnl0ZTE7CisJfQorCisJLy8gNC4gUHJpbnQgYW5kIERlYnVnCisJY2hvZmZzZXQgPSAxNCArIDEyICsgMTYgKyA3OworCit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlSZWFkIHRoZSBmb2xsb3dpbmcgZnJvbSB0aGUgcmVnaXN0cnkKKwkJMS4gQWxsIHRoZSBwYXJhbWV0ZXJzCisJCTIuIE5ldHdvcmtBZGRyZXMKKworCUFyZ3VtZW50czoKKwkJQWRhcHRlcgkJCQkJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKwkJV3JhcHBlckNvbmZpZ3VyYXRpb25Db250ZXh0CUZvciB1c2UgYnkgTmRpc09wZW5Db25maWd1cmF0aW9uCisKKwlSZXR1cm4gVmFsdWU6CisJCU5ESVNfU1RBVFVTX1NVQ0NFU1MKKwkJTkRJU19TVEFUVVNfRkFJTFVSRQorCQlORElTX1NUQVRVU19SRVNPVVJDRVMKKworCUlSUUwgPSBQQVNTSVZFX0xFVkVMCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworTkRJU19TVEFUVVMJTklDUmVhZFJlZ1BhcmFtZXRlcnMoCisJSU4JUFJUTVBfQURBUFRFUgkJcEFkLAorCUlOCU5ESVNfSEFORExFCQkJV3JhcHBlckNvbmZpZ3VyYXRpb25Db250ZXh0CisJKQoreworCU5ESVNfU1RBVFVTCQkJCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKwlEQkdQUklOVF9TKFN0YXR1cywgKCI8LS0gTklDUmVhZFJlZ1BhcmFtZXRlcnMsIFN0YXR1cz0leFxuIiwgU3RhdHVzKSk7CisJcmV0dXJuIFN0YXR1czsKK30KKworCisjaWZkZWYgUlQyODcwCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJRm9yIFJGIGZpbHRlciBjYWxpYnJhdGlvbiBwdXJwb3NlCisKKwlBcmd1bWVudHM6CisJCXBBZCAgICAgICAgICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBSVFVTQkZpbHRlckNhbGlicmF0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCVVDSEFSCVI1NXggPSAwLCB2YWx1ZSwgRmlsdGVyVGFyZ2V0ID0gMHgxRSwgQkJQVmFsdWU7CisJVUlOVAlsb29wID0gMCwgY291bnQgPSAwLCBsb29wY250ID0gMCwgUmVUcnkgPSAwOworCVVDSEFSCVJGX1IyNF9WYWx1ZSA9IDA7CisKKwkvLyBHaXZlIGJicCBmaWx0ZXIgaW5pdGlhbCB2YWx1ZQorCXBBZC0+TWxtZS5DYWxpQlcyMFJmUjI0ID0gMHgxNjsKKwlwQWQtPk1sbWUuQ2FsaUJXNDBSZlIyNCA9IDB4MzY7ICAvL0JpdFs1XSBtdXN0IGJlIDEgZm9yIEJXIDQwCisKKwlkbworCXsKKwkJaWYgKGxvb3AgPT0gMSkJLy9CYW5kV2lkdGggPSA0MCBNSHoKKwkJeworCQkJLy8gV3JpdGUgMHgyNyB0byBSRl9SMjQgdG8gcHJvZ3JhbSBmaWx0ZXIKKwkJCVJGX1IyNF9WYWx1ZSA9IDB4Mjc7CisJCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMjQsIFJGX1IyNF9WYWx1ZSk7CisJCQlGaWx0ZXJUYXJnZXQgPSAweDE5OworCisJCQkvLyB3aGVuIGNhbGlicmF0ZSBCVzQwLCBCQlAgbWFzayBtdXN0IHNldCB0byBCVzQwLgorCQkJUlRVU0JSZWFkQkJQUmVnaXN0ZXIocEFkLCBCQlBfUjQsICZCQlBWYWx1ZSk7CisJCQlCQlBWYWx1ZSY9ICh+MHgxOCk7CisJCQlCQlBWYWx1ZXw9ICgweDEwKTsKKwkJCVJUVVNCV3JpdGVCQlBSZWdpc3RlcihwQWQsIEJCUF9SNCwgQkJQVmFsdWUpOworCQl9CisJCWVsc2UJCQkvL0JhbmRXaWR0aCA9IDIwIE1IegorCQl7CisJCQkvLyBXcml0ZSAweDA3IHRvIFJGX1IyNCB0byBwcm9ncmFtIGZpbHRlcgorCQkJUkZfUjI0X1ZhbHVlID0gMHgwNzsKKwkJCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IyNCwgUkZfUjI0X1ZhbHVlKTsKKwkJCUZpbHRlclRhcmdldCA9IDB4MTY7CisJCX0KKworCQkvLyBXcml0ZSAweDAxIHRvIFJGX1IyMiB0byBlbmFibGUgYmFzZWJhbmQgbG9vcGJhY2sgbW9kZQorCQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IyMiwgJnZhbHVlKTsKKwkJdmFsdWUgfD0gMHgwMTsKKwkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjIyLCB2YWx1ZSk7CisKKwkJLy8gV3JpdGUgMHgwMCB0byBCQlBfUjI0IHRvIHNldCBwb3dlciAmIGZyZXF1ZW5jeSBvZiBwYXNzYmFuZCB0ZXN0IHRvbmUKKwkJUlRVU0JXcml0ZUJCUFJlZ2lzdGVyKHBBZCwgQkJQX1IyNCwgMCk7CisKKwkJZG8KKwkJeworCQkJLy8gV3JpdGUgMHg5MCB0byBCQlBfUjI1IHRvIHRyYW5zbWl0IHRlc3QgdG9uZQorCQkJUlRVU0JXcml0ZUJCUFJlZ2lzdGVyKHBBZCwgQkJQX1IyNSwgMHg5MCk7CisKKwkJCVJUTVB1c2VjRGVsYXkoMTAwMCk7CisJCQkvLyBSZWFkIEJCUF9SNTVbNjowXSBmb3IgcmVjZWl2ZWQgcG93ZXIsIHNldCBSNTV4ID0gQkJQX1I1NVs2OjBdCisJCQlSVFVTQlJlYWRCQlBSZWdpc3RlcihwQWQsIEJCUF9SNTUsICZ2YWx1ZSk7CisJCQlSNTV4ID0gdmFsdWUgJiAweEZGOworCisJCX0gd2hpbGUgKChSZVRyeSsrIDwgMTAwKSAmJiAoUjU1eCA9PSAwKSk7CisKKwkJLy8gV3JpdGUgMHgwNiB0byBCQlBfUjI0IHRvIHNldCBwb3dlciAmIGZyZXF1ZW5jeSBvZiBzdG9wYmFuZCB0ZXN0IHRvbmUKKwkJUlRVU0JXcml0ZUJCUFJlZ2lzdGVyKHBBZCwgQkJQX1IyNCwgMHgwNik7CisKKwkJd2hpbGUoVFJVRSkKKwkJeworCQkJLy8gV3JpdGUgMHg5MCB0byBCQlBfUjI1IHRvIHRyYW5zbWl0IHRlc3QgdG9uZQorCQkJUlRVU0JXcml0ZUJCUFJlZ2lzdGVyKHBBZCwgQkJQX1IyNSwgMHg5MCk7CisKKwkJCS8vV2UgbmVlZCB0byB3YWl0IGZvciBjYWxpYnJhdGlvbgorCQkJUlRNUHVzZWNEZWxheSgxMDAwKTsKKwkJCVJUVVNCUmVhZEJCUFJlZ2lzdGVyKHBBZCwgQkJQX1I1NSwgJnZhbHVlKTsKKwkJCXZhbHVlICY9IDB4RkY7CisJCQlpZiAoKFI1NXggLSB2YWx1ZSkgPCBGaWx0ZXJUYXJnZXQpCisJCQl7CisJCQkJUkZfUjI0X1ZhbHVlICsrOworCQkJfQorCQkJZWxzZSBpZiAoKFI1NXggLSB2YWx1ZSkgPT0gRmlsdGVyVGFyZ2V0KQorCQkJeworCQkJCVJGX1IyNF9WYWx1ZSArKzsKKwkJCQljb3VudCArKzsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJLy8gcHJldmVudCBpbmZpbml0ZSBsb29wIGNhdXNlIGRyaXZlciBoYW5nLgorCQkJaWYgKGxvb3BjbnQrKyA+IDEwMCkKKwkJCXsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJSVFVTQkZpbHRlckNhbGlicmF0aW9uIC0gY2FuJ3QgZmluZCBhIHZhbGlkIHZhbHVlLCBsb29wY250PSVkIHN0b3AgY2FsaWJyYXRpbmciLCBsb29wY250KSk7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCS8vIFdyaXRlIFJGX1IyNCB0byBwcm9ncmFtIGZpbHRlcgorCQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjI0LCBSRl9SMjRfVmFsdWUpOworCQl9CisKKwkJaWYgKGNvdW50ID4gMCkKKwkJeworCQkJUkZfUjI0X1ZhbHVlID0gUkZfUjI0X1ZhbHVlIC0gKChjb3VudCkgPyAoMSkgOiAoMCkpOworCQl9CisKKwkJLy8gU3RvcmUgZm9yIGZ1dHVyZSB1c2FnZQorCQlpZiAobG9vcGNudCA8IDEwMCkKKwkJeworCQkJaWYgKGxvb3ArKyA9PSAwKQorCQkJeworCQkJCS8vQmFuZFdpZHRoID0gMjAgTUh6CisJCQkJcEFkLT5NbG1lLkNhbGlCVzIwUmZSMjQgPSAoVUNIQVIpUkZfUjI0X1ZhbHVlOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCS8vQmFuZFdpZHRoID0gNDAgTUh6CisJCQkJcEFkLT5NbG1lLkNhbGlCVzQwUmZSMjQgPSAoVUNIQVIpUkZfUjI0X1ZhbHVlOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWVsc2UKKwkJCWJyZWFrOworCisJCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IyNCwgUkZfUjI0X1ZhbHVlKTsKKworCQkvLyByZXNldCBjb3VudAorCQljb3VudCA9IDA7CisJfSB3aGlsZShUUlVFKTsKKworCS8vCisJLy8gU2V0IGJhY2sgdG8gaW5pdGlhbCBzdGF0ZQorCS8vCisJUlRVU0JXcml0ZUJCUFJlZ2lzdGVyKHBBZCwgQkJQX1IyNCwgMCk7CisKKwlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IyMiwgJnZhbHVlKTsKKwl2YWx1ZSAmPSB+KDB4MDEpOworCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IyMiwgdmFsdWUpOworCisJLy8gc2V0IEJCUCBiYWNrIHRvIEJXMjAKKwlSVFVTQlJlYWRCQlBSZWdpc3RlcihwQWQsIEJCUF9SNCwgJkJCUFZhbHVlKTsKKwlCQlBWYWx1ZSY9ICh+MHgxOCk7CisJUlRVU0JXcml0ZUJCUFJlZ2lzdGVyKHBBZCwgQkJQX1I0LCBCQlBWYWx1ZSk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVFVTQkZpbHRlckNhbGlicmF0aW9uIC0gQ2FsaUJXMjBSZlIyND0weCV4LCBDYWxpQlc0MFJmUjI0PTB4JXhcbiIsIHBBZC0+TWxtZS5DYWxpQlcyMFJmUjI0LCBwQWQtPk1sbWUuQ2FsaUJXNDBSZlIyNCkpOworfQorCisKK1ZPSUQgTklDSW5pdFJUMzB4eFJGUmVnaXN0ZXJzKElOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCUlOVCBpOworCS8vIERyaXZlciBtdXN0IHJlYWQgRUVQUk9NIHRvIGdldCBSZkljVHlwZSBiZWZvcmUgaW5pdGlhbCBSRiByZWdpc3RlcnMKKwkvLyBJbml0aWFsaXplIFJGIHJlZ2lzdGVyIHRvIGRlZmF1bHQgdmFsdWUKKyAgICAgICAgaWYgKElTX1JUMzA3MChwQWQpICYmICgocEFkLT5SZkljVHlwZSA9PSBSRklDXzMwMjApIHx8KHBBZC0+UmZJY1R5cGUgPT0gUkZJQ18yMDIwKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBJbml0IFJGIGNhbGlicmF0aW9uCisgICAgICAgICAgICAgICAgLy8gRHJpdmVyIHNob3VsZCB0b2dnbGUgUkYgUjMwIGJpdDcgYmVmb3JlIGluaXQgUkYgcmVnaXN0ZXJzCisgICAgICAgICAgICAgICAgVUxPTkcgUmZSZWcgPSAwOworICAgICAgICAgICAgICAgIFJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZCwgUkZfUjMwLCAoUFVDSEFSKSZSZlJlZyk7CisgICAgICAgICAgICAgICAgUmZSZWcgfD0gMHg4MDsKKyAgICAgICAgICAgICAgICBSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMzAsIChVQ0hBUilSZlJlZyk7CisgICAgICAgICAgICAgICAgUlRNUHVzZWNEZWxheSgxMDAwKTsKKyAgICAgICAgICAgICAgICBSZlJlZyAmPSAweDdGOworICAgICAgICAgICAgICAgIFJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IzMCwgKFVDSEFSKVJmUmVnKTsKKworICAgICAgICAgICAgICAgIC8vIEluaXRpYWxpemUgUkYgcmVnaXN0ZXIgdG8gZGVmYXVsdCB2YWx1ZQorICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fUkZfUkVHX1BBUk1TOyBpKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUlQzMHh4X1JGUmVnVGFibGVbaV0uUmVnaXN0ZXIsIFJUMzB4eF9SRlJlZ1RhYmxlW2ldLlZhbHVlKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvL0ZvciBSRiBmaWx0ZXIgQ2FsaWJyYXRpb24KKyAgICAgICAgICAgICAgICBSVFVTQkZpbHRlckNhbGlicmF0aW9uKHBBZCk7CisgICAgICAgIH0KKworfQorI2VuZGlmIC8vIFJUMjg3MCAvLworCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlSZWFkIGluaXRpYWwgcGFyYW1ldGVycyBmcm9tIEVFUFJPTQorCisJQXJndW1lbnRzOgorCQlBZGFwdGVyCQkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJTklDUmVhZEVFUFJPTVBhcmFtZXRlcnMoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJbWFjX2FkZHIpCit7CisJVUlOVDMyCQkJZGF0YSA9IDA7CisJVVNIT1JUCQkJaSwgdmFsdWUsIHZhbHVlMjsKKwlVQ0hBUgkJCVRtcFBoeTsKKwlFRVBST01fVFhfUFdSX1NUUlVDCSAgICBQb3dlcjsKKwlFRVBST01fVkVSU0lPTl9TVFJVQyAgICBWZXJzaW9uOworCUVFUFJPTV9BTlRFTk5BX1NUUlVDCUFudGVubmE7CisJRUVQUk9NX05JQ19DT05GSUcyX1NUUlVDICAgIE5pY0NvbmZpZzI7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLT4gTklDUmVhZEVFUFJPTVBhcmFtZXRlcnNcbiIpKTsKKworCS8vIEluaXQgRUVQUk9NIEFkZHJlc3MgTnVtYmVyLCBiZWZvcmUgYWNjZXNzIEVFUFJPTTsgaWYgOTNjNDYsIEVFUFJPTUFkZHJlc3NOdW09NiwgZWxzZSBpZiA5M2M2NiwgRUVQUk9NQWRkcmVzc051bT04CisJUlRNUF9JT19SRUFEMzIocEFkLCBFMlBST01fQ1NSLCAmZGF0YSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+IEUyUFJPTV9DU1IgPSAweCV4XG4iLCBkYXRhKSk7CisKKwlpZigoZGF0YSAmIDB4MzApID09IDApCisJCXBBZC0+RUVQUk9NQWRkcmVzc051bSA9IDY7CQkvLyA5M0M0NgorCWVsc2UgaWYoKGRhdGEgJiAweDMwKSA9PSAweDEwKQorCQlwQWQtPkVFUFJPTUFkZHJlc3NOdW0gPSA4OyAgICAgLy8gOTNDNjYKKwllbHNlCisJCXBBZC0+RUVQUk9NQWRkcmVzc051bSA9IDg7ICAgICAvLyA5M0M4NgorCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPiBFRVBST01BZGRyZXNzTnVtID0gJWRcbiIsIHBBZC0+RUVQUk9NQWRkcmVzc051bSApKTsKKworCS8vIFJUMjg2MCBNQUMgbm8gbG9uZ2VyIGF1dG8gbG9hZCBNQUMgYWRkcmVzcyBmcm9tIEUyUFJPTS4gRHJpdmVyIGhhcyB0byBpbnRpYWxpemUKKwkvLyBNQUMgYWRkcmVzcyByZWdpc3RlcnMgYWNjb3JkaW5nIHRvIEUyUFJPTSBzZXR0aW5nCisJaWYgKG1hY19hZGRyID09IE5VTEwgfHwKKwkJc3RybGVuKG1hY19hZGRyKSAhPSAxNyB8fAorCQltYWNfYWRkclsyXSAhPSAnOicgIHx8IG1hY19hZGRyWzVdICE9ICc6JyAgfHwgbWFjX2FkZHJbOF0gIT0gJzonIHx8CisJCW1hY19hZGRyWzExXSAhPSAnOicgfHwgbWFjX2FkZHJbMTRdICE9ICc6JykKKwl7CisJCVVTSE9SVCAgQWRkcjAxLEFkZHIyMyxBZGRyNDUgOworCisJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgMHgwNCwgQWRkcjAxKTsKKwkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCAweDA2LCBBZGRyMjMpOworCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIDB4MDgsIEFkZHI0NSk7CisKKwkJcEFkLT5QZXJtYW5lbnRBZGRyZXNzWzBdID0gKFVDSEFSKShBZGRyMDEgJiAweGZmKTsKKwkJcEFkLT5QZXJtYW5lbnRBZGRyZXNzWzFdID0gKFVDSEFSKShBZGRyMDEgPj4gOCk7CisJCXBBZC0+UGVybWFuZW50QWRkcmVzc1syXSA9IChVQ0hBUikoQWRkcjIzICYgMHhmZik7CisJCXBBZC0+UGVybWFuZW50QWRkcmVzc1szXSA9IChVQ0hBUikoQWRkcjIzID4+IDgpOworCQlwQWQtPlBlcm1hbmVudEFkZHJlc3NbNF0gPSAoVUNIQVIpKEFkZHI0NSAmIDB4ZmYpOworCQlwQWQtPlBlcm1hbmVudEFkZHJlc3NbNV0gPSAoVUNIQVIpKEFkZHI0NSA+PiA4KTsKKworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJbml0aWFsaXplIE1BQyBBZGRyZXNzIGZyb20gRTJQUk9NIFxuIikpOworCX0KKwllbHNlCisJeworCQlJTlQJCWo7CisJCVBVQ0hBUgltYWNwdHI7CisKKwkJbWFjcHRyID0gbWFjX2FkZHI7CisKKwkJZm9yIChqPTA7IGo8TUFDX0FERFJfTEVOOyBqKyspCisJCXsKKwkJCUF0b0gobWFjcHRyLCAmcEFkLT5QZXJtYW5lbnRBZGRyZXNzW2pdLCAxKTsKKwkJCW1hY3B0cj1tYWNwdHIrMzsKKwkJfQorCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkluaXRpYWxpemUgTUFDIEFkZHJlc3MgZnJvbSBtb2R1bGUgcGFyYW1ldGVyIFxuIikpOworCX0KKworCisJeworI2lmIDAKKwkJVVNIT1JUICBBZGRyMDEsQWRkcjIzLEFkZHI0NSA7CisKKwkJQWRkcjAxPVJUTVBfRUVQUk9NX1JFQUQxNihwQWQsIDB4MDQpOworCQlBZGRyMjM9UlRNUF9FRVBST01fUkVBRDE2KHBBZCwgMHgwNik7CisJCUFkZHI0NT1SVE1QX0VFUFJPTV9SRUFEMTYocEFkLCAweDA4KTsKKworCQlwQWQtPlBlcm1hbmVudEFkZHJlc3NbMF0gPSAoVUNIQVIpKEFkZHIwMSAmIDB4ZmYpOworCQlwQWQtPlBlcm1hbmVudEFkZHJlc3NbMV0gPSAoVUNIQVIpKEFkZHIwMSA+PiA4KTsKKwkJcEFkLT5QZXJtYW5lbnRBZGRyZXNzWzJdID0gKFVDSEFSKShBZGRyMjMgJiAweGZmKTsKKwkJcEFkLT5QZXJtYW5lbnRBZGRyZXNzWzNdID0gKFVDSEFSKShBZGRyMjMgPj4gOCk7CisJCXBBZC0+UGVybWFuZW50QWRkcmVzc1s0XSA9IChVQ0hBUikoQWRkcjQ1ICYgMHhmZik7CisJCXBBZC0+UGVybWFuZW50QWRkcmVzc1s1XSA9IChVQ0hBUikoQWRkcjQ1ID4+IDgpOworI2VuZGlmCisJCS8vbW9yZSBjb252ZW5pbmV0IHRvIHRlc3QgbWJzc2lkLCBzbyBhcCdzIGJzc2lkICYweGYxCisJCWlmIChwQWQtPlBlcm1hbmVudEFkZHJlc3NbMF0gPT0gMHhmZikKKwkJCXBBZC0+UGVybWFuZW50QWRkcmVzc1swXSA9IFJhbmRvbUJ5dGUocEFkKSYweGY4OworCisJCS8vaWYgKHBBZC0+UGVybWFuZW50QWRkcmVzc1s1XSA9PSAweGZmKQorCQkvLwlwQWQtPlBlcm1hbmVudEFkZHJlc3NbNV0gPSBSYW5kb21CeXRlKHBBZCkmMHhmODsKKworCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsKCJFMlBST00gTUFDOiA9JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisJCQlwQWQtPlBlcm1hbmVudEFkZHJlc3NbMF0sIHBBZC0+UGVybWFuZW50QWRkcmVzc1sxXSwKKwkJCXBBZC0+UGVybWFuZW50QWRkcmVzc1syXSwgcEFkLT5QZXJtYW5lbnRBZGRyZXNzWzNdLAorCQkJcEFkLT5QZXJtYW5lbnRBZGRyZXNzWzRdLCBwQWQtPlBlcm1hbmVudEFkZHJlc3NbNV0pKTsKKwkJaWYgKHBBZC0+YkxvY2FsQWRtaW5NQUMgPT0gRkFMU0UpCisJCXsKKwkJCU1BQ19EVzBfU1RSVUMgY3NyMjsKKwkJCU1BQ19EVzFfU1RSVUMgY3NyMzsKKwkJCUNPUFlfTUFDX0FERFIocEFkLT5DdXJyZW50QWRkcmVzcywgcEFkLT5QZXJtYW5lbnRBZGRyZXNzKTsKKwkJCWNzcjIuZmllbGQuQnl0ZTAgPSBwQWQtPkN1cnJlbnRBZGRyZXNzWzBdOworCQkJY3NyMi5maWVsZC5CeXRlMSA9IHBBZC0+Q3VycmVudEFkZHJlc3NbMV07CisJCQljc3IyLmZpZWxkLkJ5dGUyID0gcEFkLT5DdXJyZW50QWRkcmVzc1syXTsKKwkJCWNzcjIuZmllbGQuQnl0ZTMgPSBwQWQtPkN1cnJlbnRBZGRyZXNzWzNdOworCQkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX0FERFJfRFcwLCBjc3IyLndvcmQpOworCQkJY3NyMy53b3JkID0gMDsKKwkJCWNzcjMuZmllbGQuQnl0ZTQgPSBwQWQtPkN1cnJlbnRBZGRyZXNzWzRdOworCQkJY3NyMy5maWVsZC5CeXRlNSA9IHBBZC0+Q3VycmVudEFkZHJlc3NbNV07CisJCQljc3IzLmZpZWxkLlUyTWVNYXNrID0gMHhmZjsKKwkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19BRERSX0RXMSwgY3NyMy53b3JkKTsKKwkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwoIkUyUFJPTSBNQUM6ID0lMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKwkJCQlwQWQtPlBlcm1hbmVudEFkZHJlc3NbMF0sIHBBZC0+UGVybWFuZW50QWRkcmVzc1sxXSwKKwkJCQlwQWQtPlBlcm1hbmVudEFkZHJlc3NbMl0sIHBBZC0+UGVybWFuZW50QWRkcmVzc1szXSwKKwkJCQlwQWQtPlBlcm1hbmVudEFkZHJlc3NbNF0sIHBBZC0+UGVybWFuZW50QWRkcmVzc1s1XSkpOworCQl9CisJfQorCisJLy8gaWYgbm90IHJldHVybiBlYXJseS4gY2F1c2UgZmFpbCBhdCBlbXVsYXRpb24uCisJLy8gSW5pdCB0aGUgY2hhbm5lbCBudW1iZXIgZm9yIFRYIGNoYW5uZWwgcG93ZXIKKwlSVE1QUmVhZENoYW5uZWxQd3IocEFkKTsKKworCS8vIGlmIEUyUFJPTSB2ZXJzaW9uIG1pc21hdGNoIHdpdGggZHJpdmVyJ3MgZXhwZWN0YXRpb24sIHRoZW4gc2tpcAorCS8vIGFsbCBzdWJzZXF1ZW50IEUyUlBPTSByZXRpZXZhbCBhbmQgc2V0IGEgc3lzdGVtIGVycm9yIGJpdCB0byBub3RpZnkgR1VJCisJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fVkVSU0lPTl9PRkZTRVQsIFZlcnNpb24ud29yZCk7CisJcEFkLT5FZXByb21WZXJzaW9uID0gVmVyc2lvbi5maWVsZC5WZXJzaW9uICsgVmVyc2lvbi5maWVsZC5GYWVSZWxlYXNlTnVtYmVyICogMjU2OworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkUyUFJPTTogVmVyc2lvbiA9ICVkLCBGQUUgcmVsZWFzZSAjJWRcbiIsIFZlcnNpb24uZmllbGQuVmVyc2lvbiwgVmVyc2lvbi5maWVsZC5GYWVSZWxlYXNlTnVtYmVyKSk7CisKKwlpZiAoVmVyc2lvbi5maWVsZC5WZXJzaW9uID4gVkFMSURfRUVQUk9NX1ZFUlNJT04pCisJeworCQlEQkdQUklOVF9FUlIoKCJFMlBST006IFdST05HIFZFUlNJT04gMHgleCwgc2hvdWxkIGJlICVkXG4iLFZlcnNpb24uZmllbGQuVmVyc2lvbiwgVkFMSURfRUVQUk9NX1ZFUlNJT04pKTsKKwkJLypwQWQtPlN5c3RlbUVycm9yQml0bWFwIHw9IDB4MDAwMDAwMDE7CisKKwkJLy8gaGFyZC1jb2RlIGRlZmF1bHQgdmFsdWUgd2hlbiBubyBwcm9wZXIgRTJQUk9NIGluc3RhbGxlZAorCQlwQWQtPmJBdXRvVHhBZ2NBID0gRkFMU0U7CisJCXBBZC0+YkF1dG9UeEFnY0cgPSBGQUxTRTsKKworCQkvLyBEZWZhdWx0IHRoZSBjaGFubmVsIHBvd2VyCisJCWZvciAoaSA9IDA7IGkgPCBNQVhfTlVNX09GX0NIQU5ORUxTOyBpKyspCisJCQlwQWQtPlR4UG93ZXJbaV0uUG93ZXIgPSBERUZBVUxUX1JGX1RYX1BPV0VSOworCisJCS8vIERlZmF1bHQgdGhlIGNoYW5uZWwgcG93ZXIKKwkJZm9yIChpID0gMDsgaSA8IE1BWF9OVU1fT0ZfMTFKQ0hBTk5FTFM7IGkrKykKKwkJCXBBZC0+VHhQb3dlcjExSltpXS5Qb3dlciA9IERFRkFVTFRfUkZfVFhfUE9XRVI7CisKKwkJZm9yKGkgPSAwOyBpIDwgTlVNX0VFUFJPTV9CQlBfUEFSTVM7IGkrKykKKwkJCXBBZC0+RUVQUk9NRGVmYXVsdFZhbHVlW2ldID0gMHhmZmZmOworCQlyZXR1cm47ICAqLworCX0KKworCS8vIFJlYWQgQkJQIGRlZmF1bHQgdmFsdWUgZnJvbSBFRVBST00gYW5kIHN0b3JlIHRvIGFycmF5KEVFUFJPTURlZmF1bHRWYWx1ZSkgaW4gcEFkCisJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fTklDMV9PRkZTRVQsIHZhbHVlKTsKKwlwQWQtPkVFUFJPTURlZmF1bHRWYWx1ZVswXSA9IHZhbHVlOworCisJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fTklDMl9PRkZTRVQsIHZhbHVlKTsKKwlwQWQtPkVFUFJPTURlZmF1bHRWYWx1ZVsxXSA9IHZhbHVlOworCisJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCAweDM4LCB2YWx1ZSk7CS8vIENvdW50cnkgUmVnaW9uCisJcEFkLT5FRVBST01EZWZhdWx0VmFsdWVbMl0gPSB2YWx1ZTsKKworCWZvcihpID0gMDsgaSA8IDg7IGkrKykKKwl7CisJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX0JCUF9CQVNFX09GRlNFVCArIGkqMiwgdmFsdWUpOworCQlwQWQtPkVFUFJPTURlZmF1bHRWYWx1ZVtpKzNdID0gdmFsdWU7CisJfQorCisJLy8gV2UgaGF2ZSB0byBwYXJzZSBOSUMgY29uZmlndXJhdGlvbiAwIGF0IGhlcmUuCisJLy8gSWYgVFNTSSBkaWQgbm90IGhhdmUgcHJlbG9hZGVkIHZhbHVlLCBpdCBzaG91bGQgcmVzZXQgdGhlIFR4QXV0b0FnYyB0byBmYWxzZQorCS8vIFRoZXJlZm9yZSwgd2UgaGF2ZSB0byByZWFkIFR4QXV0b0FnYyBjb250cm9sIGJlZm9yZWhhbmQuCisJLy8gUmVhZCBUeCBBR0MgY29udHJvbCBiaXQKKwlBbnRlbm5hLndvcmQgPSBwQWQtPkVFUFJPTURlZmF1bHRWYWx1ZVswXTsKKwlpZiAoQW50ZW5uYS53b3JkID09IDB4RkZGRikKKwl7CisJCUFudGVubmEud29yZCA9IDA7CisJCUFudGVubmEuZmllbGQuUmZJY1R5cGUgPSBSRklDXzI4MjA7CisJCUFudGVubmEuZmllbGQuVHhQYXRoID0gMTsKKwkJQW50ZW5uYS5maWVsZC5SeFBhdGggPSAyOworCQlEQkdQUklOVChSVF9ERUJVR19XQVJOLCAoIkUyUFJPTSBlcnJvciwgaGFyZCBjb2RlIGFzIDB4JTA0eFxuIiwgQW50ZW5uYS53b3JkKSk7CisJfQorCisJLy8gQ2hvb3NlIHRoZSBkZXNpcmVkIFR4JlJ4IHN0cmVhbS4KKwlpZiAoKHBBZC0+Q29tbW9uQ2ZnLlR4U3RyZWFtID09IDApIHx8IChwQWQtPkNvbW1vbkNmZy5UeFN0cmVhbSA+IEFudGVubmEuZmllbGQuVHhQYXRoKSkKKwkJcEFkLT5Db21tb25DZmcuVHhTdHJlYW0gPSBBbnRlbm5hLmZpZWxkLlR4UGF0aDsKKworCWlmICgocEFkLT5Db21tb25DZmcuUnhTdHJlYW0gPT0gMCkgfHwgKHBBZC0+Q29tbW9uQ2ZnLlJ4U3RyZWFtID4gQW50ZW5uYS5maWVsZC5SeFBhdGgpKQorCXsKKwkJcEFkLT5Db21tb25DZmcuUnhTdHJlYW0gPSBBbnRlbm5hLmZpZWxkLlJ4UGF0aDsKKworCQlpZiAoKHBBZC0+TUFDVmVyc2lvbiA8IFJBTElOS18yODgzX1ZFUlNJT04pICYmCisJCQkocEFkLT5Db21tb25DZmcuUnhTdHJlYW0gPiAyKSkKKwkJeworCQkJLy8gb25seSAyIFJ4IHN0cmVhbXMgZm9yIFJUMjg2MCBzZXJpZXMKKwkJCXBBZC0+Q29tbW9uQ2ZnLlJ4U3RyZWFtID0gMjsKKwkJfQorCX0KKworCS8vIDMqMworCS8vIHJlYWQgdmFsdWUgZnJvbSBFRVBST00gYW5kIHNldCB0aGVtIHRvIENTUjE3NCB+IDE3NyBpbiBjaGFpbjAgfiBjaGFpbjIKKwkvLyB5ZXQgaW1wbGVtZW50CisJZm9yKGk9MDsgaTwzOyBpKyspCisJeworCX0KKworCU5pY0NvbmZpZzIud29yZCA9IHBBZC0+RUVQUk9NRGVmYXVsdFZhbHVlWzFdOworCisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJeworCQlOaWNDb25maWcyLndvcmQgPSAwOworCQlpZiAoKE5pY0NvbmZpZzIud29yZCAmIDB4MDBmZikgPT0gMHhmZikKKwkJeworCQkJTmljQ29uZmlnMi53b3JkICY9IDB4ZmYwMDsKKwkJfQorCisJCWlmICgoTmljQ29uZmlnMi53b3JkID4+IDgpID09IDB4ZmYpCisJCXsKKwkJCU5pY0NvbmZpZzIud29yZCAmPSAweDAwZmY7CisJCX0KKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlpZiAoTmljQ29uZmlnMi5maWVsZC5EeW5hbWljVHhBZ2NDb250cm9sID09IDEpCisJCXBBZC0+YkF1dG9UeEFnY0EgPSBwQWQtPmJBdXRvVHhBZ2NHID0gVFJVRTsKKwllbHNlCisJCXBBZC0+YkF1dG9UeEFnY0EgPSBwQWQtPmJBdXRvVHhBZ2NHID0gRkFMU0U7CisKKwlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiTklDUmVhZEVFUFJPTVBhcmFtZXRlcnM6IFJ4UGF0aCA9ICVkLCBUeFBhdGggPSAlZFxuIiwgQW50ZW5uYS5maWVsZC5SeFBhdGgsIEFudGVubmEuZmllbGQuVHhQYXRoKSk7CisKKwkvLyBTYXZlIHRoZSBhbnRlbm5hIGZvciBmdXR1cmUgdXNlCisJcEFkLT5BbnRlbm5hLndvcmQgPSBBbnRlbm5hLndvcmQ7CisKKwkvLworCS8vIFJlc2V0IFBoeU1vZGUgaWYgd2UgZG9uJ3Qgc3VwcG9ydCA4MDIuMTFhCisJLy8gT25seSBSRklDXzI4NTAgJiBSRklDXzI3NTAgc3VwcG9ydCA4MDIuMTFhCisJLy8KKwlpZiAoKEFudGVubmEuZmllbGQuUmZJY1R5cGUgIT0gUkZJQ18yODUwKSAmJiAoQW50ZW5uYS5maWVsZC5SZkljVHlwZSAhPSBSRklDXzI3NTApKQorCXsKKwkJaWYgKChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUFCR19NSVhFRCkgfHwKKwkJCShwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUEpKQorCQkJcEFkLT5Db21tb25DZmcuUGh5TW9kZSA9IFBIWV8xMUJHX01JWEVEOworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQllbHNlIGlmICgocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFBQkdOX01JWEVEKQl8fAorCQkJCSAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFBTl9NSVhFRCkgCXx8CisJCQkJIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUFHTl9NSVhFRCkgCXx8CisJCQkJIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMU5fNUcpKQorCQkJcEFkLT5Db21tb25DZmcuUGh5TW9kZSA9IFBIWV8xMUJHTl9NSVhFRDsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwl9CisKKwkvLyBSZWFkIFRTU0kgcmVmZXJlbmNlIGFuZCBUU1NJIGJvdW5kYXJ5IGZvciB0ZW1wZXJhdHVyZSBjb21wZW5zYXRpb24uIFRoaXMgaXMgdWdseQorCS8vIDAuIDExYi9nCisJeworCQkvKiB0aGVzZSBhcmUgdGVtcGF0dXJlIHJlZmVyZW5jZSB2YWx1ZSAoMHgwMCB+IDB4RkUpCisJCSAgIGV4OiAweDAwIDB4MTUgMHgyNSAweDQ1IDB4ODggMHhBMCAweEI1IDB4RDAgMHhGMAorCQkgICBUc3NpUGx1c0JvdW5kYXJ5RyBbNF0gWzNdIFsyXSBbMV0gWzBdIChzbWFsbGVyKSArCisJCSAgIFRzc2lNaW51c0JvdW5kYXJ5R1swXSBbMV0gWzJdIFszXSBbNF0gKGxhcmdlcikgKi8KKwkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCAweDZFLCBQb3dlci53b3JkKTsKKwkJcEFkLT5Uc3NpTWludXNCb3VuZGFyeUdbNF0gPSBQb3dlci5maWVsZC5CeXRlMDsKKwkJcEFkLT5Uc3NpTWludXNCb3VuZGFyeUdbM10gPSBQb3dlci5maWVsZC5CeXRlMTsKKwkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCAweDcwLCBQb3dlci53b3JkKTsKKwkJcEFkLT5Uc3NpTWludXNCb3VuZGFyeUdbMl0gPSBQb3dlci5maWVsZC5CeXRlMDsKKwkJcEFkLT5Uc3NpTWludXNCb3VuZGFyeUdbMV0gPSBQb3dlci5maWVsZC5CeXRlMTsKKwkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCAweDcyLCBQb3dlci53b3JkKTsKKwkJcEFkLT5Uc3NpUmVmRyAgID0gUG93ZXIuZmllbGQuQnl0ZTA7IC8qIHJlZmVyZW5jZSB2YWx1ZSBbMF0gKi8KKwkJcEFkLT5Uc3NpUGx1c0JvdW5kYXJ5R1sxXSA9IFBvd2VyLmZpZWxkLkJ5dGUxOworCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIDB4NzQsIFBvd2VyLndvcmQpOworCQlwQWQtPlRzc2lQbHVzQm91bmRhcnlHWzJdID0gUG93ZXIuZmllbGQuQnl0ZTA7CisJCXBBZC0+VHNzaVBsdXNCb3VuZGFyeUdbM10gPSBQb3dlci5maWVsZC5CeXRlMTsKKwkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCAweDc2LCBQb3dlci53b3JkKTsKKwkJcEFkLT5Uc3NpUGx1c0JvdW5kYXJ5R1s0XSA9IFBvd2VyLmZpZWxkLkJ5dGUwOworCQlwQWQtPlR4QWdjU3RlcEcgPSBQb3dlci5maWVsZC5CeXRlMTsKKwkJcEFkLT5UeEFnY0NvbXBlbnNhdGVHID0gMDsKKwkJcEFkLT5Uc3NpTWludXNCb3VuZGFyeUdbMF0gPSBwQWQtPlRzc2lSZWZHOworCQlwQWQtPlRzc2lQbHVzQm91bmRhcnlHWzBdICA9IHBBZC0+VHNzaVJlZkc7CisKKwkJLy8gRGlzYWJsZSBUeEFnYyBpZiB0aGUgYmFzZWQgdmFsdWUgaXMgbm90IHJpZ2h0CisJCWlmIChwQWQtPlRzc2lSZWZHID09IDB4ZmYpCisJCQlwQWQtPmJBdXRvVHhBZ2NHID0gRkFMU0U7CisKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJFMlBST006IEcgVHNzaVstNCAuLiArNF0gPSAlZCAlZCAlZCAlZCAtICVkIC0lZCAlZCAlZCAlZCwgc3RlcD0lZCwgdHVuaW5nPSVkXG4iLAorCQkJcEFkLT5Uc3NpTWludXNCb3VuZGFyeUdbNF0sIHBBZC0+VHNzaU1pbnVzQm91bmRhcnlHWzNdLCBwQWQtPlRzc2lNaW51c0JvdW5kYXJ5R1syXSwgcEFkLT5Uc3NpTWludXNCb3VuZGFyeUdbMV0sCisJCQlwQWQtPlRzc2lSZWZHLAorCQkJcEFkLT5Uc3NpUGx1c0JvdW5kYXJ5R1sxXSwgcEFkLT5Uc3NpUGx1c0JvdW5kYXJ5R1syXSwgcEFkLT5Uc3NpUGx1c0JvdW5kYXJ5R1szXSwgcEFkLT5Uc3NpUGx1c0JvdW5kYXJ5R1s0XSwKKwkJCXBBZC0+VHhBZ2NTdGVwRywgcEFkLT5iQXV0b1R4QWdjRykpOworCX0KKwkvLyAxLiAxMWEKKwl7CisJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgMHhENCwgUG93ZXIud29yZCk7CisJCXBBZC0+VHNzaU1pbnVzQm91bmRhcnlBWzRdID0gUG93ZXIuZmllbGQuQnl0ZTA7CisJCXBBZC0+VHNzaU1pbnVzQm91bmRhcnlBWzNdID0gUG93ZXIuZmllbGQuQnl0ZTE7CisJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgMHhENiwgUG93ZXIud29yZCk7CisJCXBBZC0+VHNzaU1pbnVzQm91bmRhcnlBWzJdID0gUG93ZXIuZmllbGQuQnl0ZTA7CisJCXBBZC0+VHNzaU1pbnVzQm91bmRhcnlBWzFdID0gUG93ZXIuZmllbGQuQnl0ZTE7CisJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgMHhEOCwgUG93ZXIud29yZCk7CisJCXBBZC0+VHNzaVJlZkEgICA9IFBvd2VyLmZpZWxkLkJ5dGUwOworCQlwQWQtPlRzc2lQbHVzQm91bmRhcnlBWzFdID0gUG93ZXIuZmllbGQuQnl0ZTE7CisJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgMHhEQSwgUG93ZXIud29yZCk7CisJCXBBZC0+VHNzaVBsdXNCb3VuZGFyeUFbMl0gPSBQb3dlci5maWVsZC5CeXRlMDsKKwkJcEFkLT5Uc3NpUGx1c0JvdW5kYXJ5QVszXSA9IFBvd2VyLmZpZWxkLkJ5dGUxOworCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIDB4REMsIFBvd2VyLndvcmQpOworCQlwQWQtPlRzc2lQbHVzQm91bmRhcnlBWzRdID0gUG93ZXIuZmllbGQuQnl0ZTA7CisJCXBBZC0+VHhBZ2NTdGVwQSA9IFBvd2VyLmZpZWxkLkJ5dGUxOworCQlwQWQtPlR4QWdjQ29tcGVuc2F0ZUEgPSAwOworCQlwQWQtPlRzc2lNaW51c0JvdW5kYXJ5QVswXSA9IHBBZC0+VHNzaVJlZkE7CisJCXBBZC0+VHNzaVBsdXNCb3VuZGFyeUFbMF0gID0gcEFkLT5Uc3NpUmVmQTsKKworCQkvLyBEaXNhYmxlIFR4QWdjIGlmIHRoZSBiYXNlZCB2YWx1ZSBpcyBub3QgcmlnaHQKKwkJaWYgKHBBZC0+VHNzaVJlZkEgPT0gMHhmZikKKwkJCXBBZC0+YkF1dG9UeEFnY0EgPSBGQUxTRTsKKworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkUyUFJPTTogQSBUc3NpWy00IC4uICs0XSA9ICVkICVkICVkICVkIC0gJWQgLSVkICVkICVkICVkLCBzdGVwPSVkLCB0dW5pbmc9JWRcbiIsCisJCQlwQWQtPlRzc2lNaW51c0JvdW5kYXJ5QVs0XSwgcEFkLT5Uc3NpTWludXNCb3VuZGFyeUFbM10sIHBBZC0+VHNzaU1pbnVzQm91bmRhcnlBWzJdLCBwQWQtPlRzc2lNaW51c0JvdW5kYXJ5QVsxXSwKKwkJCXBBZC0+VHNzaVJlZkEsCisJCQlwQWQtPlRzc2lQbHVzQm91bmRhcnlBWzFdLCBwQWQtPlRzc2lQbHVzQm91bmRhcnlBWzJdLCBwQWQtPlRzc2lQbHVzQm91bmRhcnlBWzNdLCBwQWQtPlRzc2lQbHVzQm91bmRhcnlBWzRdLAorCQkJcEFkLT5UeEFnY1N0ZXBBLCBwQWQtPmJBdXRvVHhBZ2NBKSk7CisJfQorCXBBZC0+QmJwUnNzaVRvRGJtRGVsdGEgPSAweDA7CisKKwkvLyBSZWFkIGZyZXF1ZW5jeSBvZmZzZXQgc2V0dGluZyBmb3IgUkYKKwlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9GUkVRX09GRlNFVCwgdmFsdWUpOworCWlmICgodmFsdWUgJiAweDAwRkYpICE9IDB4MDBGRikKKwkJcEFkLT5SZkZyZXFPZmZzZXQgPSAoVUxPTkcpICh2YWx1ZSAmIDB4MDBGRik7CisJZWxzZQorCQlwQWQtPlJmRnJlcU9mZnNldCA9IDA7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiRTJQUk9NOiBSRiBGcmVxT2Zmc2V0PTB4JWx4IFxuIiwgcEFkLT5SZkZyZXFPZmZzZXQpKTsKKworCS8vQ291bnRyeVJlZ2lvbiBieXRlIG9mZnNldCAoMzhoKQorCXZhbHVlID0gcEFkLT5FRVBST01EZWZhdWx0VmFsdWVbMl0gPj4gODsJCS8vIDIuNEcgYmFuZAorCXZhbHVlMiA9IHBBZC0+RUVQUk9NRGVmYXVsdFZhbHVlWzJdICYgMHgwMEZGOwkvLyA1RyBiYW5kCisKKwlpZiAoKHZhbHVlIDw9IFJFR0lPTl9NQVhJTVVNX0JHX0JBTkQpICYmICh2YWx1ZTIgPD0gUkVHSU9OX01BWElNVU1fQV9CQU5EKSkKKwl7CisJCXBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb24gPSAoKFVDSEFSKSB2YWx1ZSkgfCAweDgwOworCQlwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uRm9yQUJhbmQgPSAoKFVDSEFSKSB2YWx1ZTIpIHwgMHg4MDsKKwkJVG1wUGh5ID0gcEFkLT5Db21tb25DZmcuUGh5TW9kZTsKKwkJcEFkLT5Db21tb25DZmcuUGh5TW9kZSA9IDB4ZmY7CisJCVJUTVBTZXRQaHlNb2RlKHBBZCwgVG1wUGh5KTsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJU2V0Q29tbW9uSFQocEFkKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwl9CisKKwkvLworCS8vIEdldCBSU1NJIE9mZnNldCBvbiBFRVBST00gMHg5QWggJiAweDlDaC4KKwkvLyBUaGUgdmFsaWQgdmFsdWUgYXJlICgtMTAgfiAxMCkKKwkvLworCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX1JTU0lfQkdfT0ZGU0VULCB2YWx1ZSk7CisJcEFkLT5CR1Jzc2lPZmZzZXQwID0gdmFsdWUgJiAweDAwZmY7CisJcEFkLT5CR1Jzc2lPZmZzZXQxID0gKHZhbHVlID4+IDgpOworCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX1JTU0lfQkdfT0ZGU0VUKzIsIHZhbHVlKTsKKwlwQWQtPkJHUnNzaU9mZnNldDIgPSB2YWx1ZSAmIDB4MDBmZjsKKwlwQWQtPkFMTkFHYWluMSA9ICh2YWx1ZSA+PiA4KTsKKwlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9MTkFfT0ZGU0VULCB2YWx1ZSk7CisJcEFkLT5CTE5BR2FpbiA9IHZhbHVlICYgMHgwMGZmOworCXBBZC0+QUxOQUdhaW4wID0gKHZhbHVlID4+IDgpOworCisJLy8gVmFsaWRhdGUgMTFiL2cgUlNTSV8wIG9mZnNldC4KKwlpZiAoKHBBZC0+QkdSc3NpT2Zmc2V0MCA8IC0xMCkgfHwgKHBBZC0+QkdSc3NpT2Zmc2V0MCA+IDEwKSkKKwkJcEFkLT5CR1Jzc2lPZmZzZXQwID0gMDsKKworCS8vIFZhbGlkYXRlIDExYi9nIFJTU0lfMSBvZmZzZXQuCisJaWYgKChwQWQtPkJHUnNzaU9mZnNldDEgPCAtMTApIHx8IChwQWQtPkJHUnNzaU9mZnNldDEgPiAxMCkpCisJCXBBZC0+QkdSc3NpT2Zmc2V0MSA9IDA7CisKKwkvLyBWYWxpZGF0ZSAxMWIvZyBSU1NJXzIgb2Zmc2V0LgorCWlmICgocEFkLT5CR1Jzc2lPZmZzZXQyIDwgLTEwKSB8fCAocEFkLT5CR1Jzc2lPZmZzZXQyID4gMTApKQorCQlwQWQtPkJHUnNzaU9mZnNldDIgPSAwOworCisJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fUlNTSV9BX09GRlNFVCwgdmFsdWUpOworCXBBZC0+QVJzc2lPZmZzZXQwID0gdmFsdWUgJiAweDAwZmY7CisJcEFkLT5BUnNzaU9mZnNldDEgPSAodmFsdWUgPj4gOCk7CisJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCAoRUVQUk9NX1JTU0lfQV9PRkZTRVQrMiksIHZhbHVlKTsKKwlwQWQtPkFSc3NpT2Zmc2V0MiA9IHZhbHVlICYgMHgwMGZmOworCXBBZC0+QUxOQUdhaW4yID0gKHZhbHVlID4+IDgpOworCisJaWYgKCgoVUNIQVIpcEFkLT5BTE5BR2FpbjEgPT0gMHhGRikgfHwgKHBBZC0+QUxOQUdhaW4xID09IDB4MDApKQorCQlwQWQtPkFMTkFHYWluMSA9IHBBZC0+QUxOQUdhaW4wOworCWlmICgoKFVDSEFSKXBBZC0+QUxOQUdhaW4yID09IDB4RkYpIHx8IChwQWQtPkFMTkFHYWluMiA9PSAweDAwKSkKKwkJcEFkLT5BTE5BR2FpbjIgPSBwQWQtPkFMTkFHYWluMDsKKworCS8vIFZhbGlkYXRlIDExYSBSU1NJXzAgb2Zmc2V0LgorCWlmICgocEFkLT5BUnNzaU9mZnNldDAgPCAtMTApIHx8IChwQWQtPkFSc3NpT2Zmc2V0MCA+IDEwKSkKKwkJcEFkLT5BUnNzaU9mZnNldDAgPSAwOworCisJLy8gVmFsaWRhdGUgMTFhIFJTU0lfMSBvZmZzZXQuCisJaWYgKChwQWQtPkFSc3NpT2Zmc2V0MSA8IC0xMCkgfHwgKHBBZC0+QVJzc2lPZmZzZXQxID4gMTApKQorCQlwQWQtPkFSc3NpT2Zmc2V0MSA9IDA7CisKKwkvL1ZhbGlkYXRlIDExYSBSU1NJXzIgb2Zmc2V0LgorCWlmICgocEFkLT5BUnNzaU9mZnNldDIgPCAtMTApIHx8IChwQWQtPkFSc3NpT2Zmc2V0MiA+IDEwKSkKKwkJcEFkLT5BUnNzaU9mZnNldDIgPSAwOworCisJLy8KKwkvLyBHZXQgTEVEIFNldHRpbmcuCisJLy8KKwlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIDB4M2EsIHZhbHVlKTsKKwlwQWQtPkxlZENudGwud29yZCA9ICh2YWx1ZSYweGZmMDApID4+IDg7CisJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fTEVEMV9PRkZTRVQsIHZhbHVlKTsKKwlwQWQtPkxlZDEgPSB2YWx1ZTsKKwlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9MRUQyX09GRlNFVCwgdmFsdWUpOworCXBBZC0+TGVkMiA9IHZhbHVlOworCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX0xFRDNfT0ZGU0VULCB2YWx1ZSk7CisJcEFkLT5MZWQzID0gdmFsdWU7CisKKwlSVE1QUmVhZFR4UHdyUGVyUmF0ZShwQWQpOworCisjaWZkZWYgU0lOR0xFX1NLVQorCS8vcEFkLT5Db21tb25DZmcuRGVmaW5lTWF4VHhQd3IgPSBSVE1QX0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fREVGSU5FX01BWF9UWFBXUik7CisJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fREVGSU5FX01BWF9UWFBXUiwgcEFkLT5Db21tb25DZmcuRGVmaW5lTWF4VHhQd3IpOworI2VuZGlmIC8vIFNJTkdMRV9TS1UgLy8KKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjwtLSBOSUNSZWFkRUVQUk9NUGFyYW1ldGVyc1xuIikpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJU2V0IGRlZmF1bHQgdmFsdWUgZnJvbSBFRVBST00KKworCUFyZ3VtZW50czoKKwkJQWRhcHRlcgkJCQkJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECU5JQ0luaXRBc2ljRnJvbUVFUFJPTSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCkKK3sKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlVSU5UMzIJCQkJCWRhdGEgPSAwOworCVVDSEFSCUJCUFIxID0gMDsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwlVU0hPUlQJCQkJCWk7CisJRUVQUk9NX0FOVEVOTkFfU1RSVUMJQW50ZW5uYTsKKwlFRVBST01fTklDX0NPTkZJRzJfU1RSVUMgICAgTmljQ29uZmlnMjsKKwlVQ0hBUglCQlBSMyA9IDA7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLT4gTklDSW5pdEFzaWNGcm9tRUVQUk9NXG4iKSk7CisJZm9yKGkgPSAzOyBpIDwgTlVNX0VFUFJPTV9CQlBfUEFSTVM7IGkrKykKKwl7CisJCVVDSEFSIEJicFJlZ0lkeCwgQmJwVmFsdWU7CisKKwkJaWYgKChwQWQtPkVFUFJPTURlZmF1bHRWYWx1ZVtpXSAhPSAweEZGRkYpICYmIChwQWQtPkVFUFJPTURlZmF1bHRWYWx1ZVtpXSAhPSAwKSkKKwkJeworCQkJQmJwUmVnSWR4ID0gKFVDSEFSKShwQWQtPkVFUFJPTURlZmF1bHRWYWx1ZVtpXSA+PiA4KTsKKwkJCUJicFZhbHVlICA9IChVQ0hBUikocEFkLT5FRVBST01EZWZhdWx0VmFsdWVbaV0gJiAweGZmKTsKKwkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCYnBSZWdJZHgsIEJicFZhbHVlKTsKKwkJfQorCX0KKworCUFudGVubmEud29yZCA9IHBBZC0+QW50ZW5uYS53b3JkOworCXBBZC0+TWxtZS5SZWFsUnhQYXRoID0gKFVDSEFSKSBBbnRlbm5hLmZpZWxkLlJ4UGF0aDsKKwlwQWQtPlJmSWNUeXBlID0gKFVDSEFSKSBBbnRlbm5hLmZpZWxkLlJmSWNUeXBlOworCisJTmljQ29uZmlnMi53b3JkID0gcEFkLT5FRVBST01EZWZhdWx0VmFsdWVbMV07CisKKworCS8vIFNhdmUgdGhlIGFudGVubmEgZm9yIGZ1dHVyZSB1c2UKKwlwQWQtPk5pY0NvbmZpZzIud29yZCA9IE5pY0NvbmZpZzIud29yZDsKKworCS8vCisJLy8gU2VuZCBMRUQgU2V0dGluZyB0byBNQ1UuCisJLy8KKwlpZiAocEFkLT5MZWRDbnRsLndvcmQgPT0gMHhGRikKKwl7CisJCXBBZC0+TGVkQ250bC53b3JkID0gMHgwMTsKKwkJcEFkLT5MZWQxID0gMHg1NTU1OworCQlwQWQtPkxlZDIgPSAweDIyMjE7CisKKyNpZmRlZiBSVDI4NzAKKwkJcEFkLT5MZWQzID0gMHg1NjI3OworI2VuZGlmIC8vIFJUMjg3MCAvLworCX0KKworCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHg1MiwgMHhmZiwgKFVDSEFSKXBBZC0+TGVkMSwgKFVDSEFSKShwQWQtPkxlZDEgPj4gOCkpOworCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHg1MywgMHhmZiwgKFVDSEFSKXBBZC0+TGVkMiwgKFVDSEFSKShwQWQtPkxlZDIgPj4gOCkpOworCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHg1NCwgMHhmZiwgKFVDSEFSKXBBZC0+TGVkMywgKFVDSEFSKShwQWQtPkxlZDMgPj4gOCkpOworICAgIHBBZC0+TGVkSW5kaWNhdG9yU3RyZWd0aCA9IDB4RkY7CisgICAgUlRNUFNldFNpZ25hbExFRChwQWQsIC0xMDApOwkvLyBGb3JjZSBzaWduYWwgc3RyZW5ndGggTGVkIHRvIGJlIHR1cm5lZCBvZmYsIGJlZm9yZSBsaW5rIHVwCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCXsKKwkJLy8gUmVhZCBIYXJkd2FyZSBjb250cm9sbGVkIFJhZGlvIHN0YXRlIGVuYWJsZSBiaXQKKwkJaWYgKE5pY0NvbmZpZzIuZmllbGQuSGFyZHdhcmVSYWRpb0NvbnRyb2wgPT0gMSkKKwkJeworCQkJcEFkLT5TdGFDZmcuYkhhcmR3YXJlUmFkaW8gPSBUUlVFOworCisJCQkvLyBSZWFkIEdQSU8gcGluMiBhcyBIYXJkd2FyZSBjb250cm9sbGVkIHJhZGlvIHN0YXRlCisJCQlSVE1QX0lPX1JFQUQzMihwQWQsIEdQSU9fQ1RSTF9DRkcsICZkYXRhKTsKKwkJCWlmICgoZGF0YSAmIDB4MDQpID09IDApCisJCQl7CisJCQkJcEFkLT5TdGFDZmcuYkh3UmFkaW8gPSBGQUxTRTsKKwkJCQlwQWQtPlN0YUNmZy5iUmFkaW8gPSBGQUxTRTsKKy8vCQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFBXUl9QSU5fQ0ZHLCAweDAwMDAxODE4KTsKKwkJCQlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SQURJT19PRkYpOworCQkJfQorCQl9CisJCWVsc2UKKwkJCXBBZC0+U3RhQ2ZnLmJIYXJkd2FyZVJhZGlvID0gRkFMU0U7CisKKwkJaWYgKHBBZC0+U3RhQ2ZnLmJSYWRpbyA9PSBGQUxTRSkKKwkJeworCQkJUlRNUFNldExFRChwQWQsIExFRF9SQURJT19PRkYpOworCQl9CisJCWVsc2UKKwkJeworCQkJUlRNUFNldExFRChwQWQsIExFRF9SQURJT19PTik7CisJCX0KKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwkvLyBUdXJuIG9mZiBwYXRjaGluZyBmb3IgY2FyZGJ1cyBjb250cm9sbGVyCisJaWYgKE5pY0NvbmZpZzIuZmllbGQuQ2FyZGJ1c0FjY2VsZXJhdGlvbiA9PSAxKQorCXsKKy8vCQlwQWQtPmJUZXN0MSA9IFRSVUU7CisJfQorCisJaWYgKE5pY0NvbmZpZzIuZmllbGQuRHluYW1pY1R4QWdjQ29udHJvbCA9PSAxKQorCQlwQWQtPmJBdXRvVHhBZ2NBID0gcEFkLT5iQXV0b1R4QWdjRyA9IFRSVUU7CisJZWxzZQorCQlwQWQtPmJBdXRvVHhBZ2NBID0gcEFkLT5iQXV0b1R4QWdjRyA9IEZBTFNFOworCS8vCisJLy8gU2luY2UgQkJQIGhhcyBiZWVuIHByb2dhbWVkLCB0byBtYWtlIHN1cmUgQkJQIHNldHRpbmcgd2lsbCBiZQorCS8vIHVwYXRlIGluc2lkZSBvZiBBc2ljQW50ZW5uYVNlbGVjdCwgc28gcmVzZXQgdG8gVU5LTk9XTl9CQU5EISEKKwkvLworCXBBZC0+Q29tbW9uQ2ZnLkJhbmRTdGF0ZSA9IFVOS05PV05fQkFORDsKKworCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgJkJCUFIzKTsKKwlCQlBSMyAmPSAofjB4MTgpOworCWlmKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPT0gMykKKwl7CisJCUJCUFIzIHw9ICgweDEwKTsKKwl9CisJZWxzZSBpZihwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDIpCisJeworCQlCQlBSMyB8PSAoMHg4KTsKKwl9CisJZWxzZSBpZihwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDEpCisJeworCQlCQlBSMyB8PSAoMHgwKTsKKwl9CisJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgQkJQUjMpOworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwl7CisJCS8vIEhhbmRsZSB0aGUgZGlmZmVyZW5jZSB3aGVuIDFUCisJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMSwgJkJCUFIxKTsKKwkJaWYocEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCA9PSAxKQorCQl7CisJCUJCUFIxICY9ICh+MHgxOCk7CisJCX0KKwkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMSwgQkJQUjEpOworCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlVzZSBIdyBSYWRpbyBDb250cm9sIFBpbj0lZDsgaWYgdXNlZCBQaW49JWQ7XG4iLCBwQWQtPkNvbW1vbkNmZy5iSGFyZHdhcmVSYWRpbywgcEFkLT5Db21tb25DZmcuYkhhcmR3YXJlUmFkaW8pKTsKKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiVHhQYXRoID0gJWQsIFJ4UGF0aCA9ICVkLCBSRklDPSVkLCBQb2xhcitMRUQgbW9kZT0leFxuIiwgcEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCwgcEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCwgcEFkLT5SZkljVHlwZSwgcEFkLT5MZWRDbnRsLndvcmQpKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8LS0gTklDSW5pdEFzaWNGcm9tRUVQUk9NXG4iKSk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlJbml0aWFsaXplIE5JQyBoYXJkd2FyZQorCisJQXJndW1lbnRzOgorCQlBZGFwdGVyCQkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK05ESVNfU1RBVFVTCU5JQ0luaXRpYWxpemVBZGFwdGVyKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOICAgQk9PTEVBTiAgICBiSGFyZFJlc2V0KQoreworCU5ESVNfU1RBVFVTICAgICBTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworCVdQRE1BX0dMT19DRkdfU1RSVUMJR2xvQ2ZnOworLy8JSU5UX01BU0tfQ1NSX1NUUlVDCQlJbnRNYXNrOworCVVMT05HCWkgPTAsIGo9MDsKKwlBQ19UWE9QX0NTUjBfU1RSVUMJY3NyMDsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPiBOSUNJbml0aWFsaXplQWRhcHRlclxuIikpOworCisJLy8gMy4gU2V0IERNQSBnbG9iYWwgY29uZmlndXJhdGlvbiBleGNlcHQgVFhfRE1BX0VOIGFuZCBSWF9ETUFfRU4gYml0czoKK3JldHJ5OgorCWkgPSAwOworCWRvCisJeworCQlSVE1QX0lPX1JFQUQzMihwQWQsIFdQRE1BX0dMT19DRkcsICZHbG9DZmcud29yZCk7CisJCWlmICgoR2xvQ2ZnLmZpZWxkLlR4RE1BQnVzeSA9PSAwKSAgJiYgKEdsb0NmZy5maWVsZC5SeERNQUJ1c3kgPT0gMCkpCisJCQlicmVhazsKKworCQlSVE1QdXNlY0RlbGF5KDEwMDApOworCQlpKys7CisJfXdoaWxlICggaTwxMDApOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PSBETUEgb2Zmc2V0IDB4MjA4ID0gMHgleFxuIiwgR2xvQ2ZnLndvcmQpKTsKKwlHbG9DZmcud29yZCAmPSAweGZmMDsKKwlHbG9DZmcuZmllbGQuRW5UWFdyaXRlQmFja0RET05FID0xOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIFdQRE1BX0dMT19DRkcsIEdsb0NmZy53b3JkKTsKKworCS8vIFJlY29yZCBIVyBCZWFjb24gb2Zmc2V0CisJcEFkLT5CZWFjb25PZmZzZXRbMF0gPSBIV19CRUFDT05fQkFTRTA7CisJcEFkLT5CZWFjb25PZmZzZXRbMV0gPSBIV19CRUFDT05fQkFTRTE7CisJcEFkLT5CZWFjb25PZmZzZXRbMl0gPSBIV19CRUFDT05fQkFTRTI7CisJcEFkLT5CZWFjb25PZmZzZXRbM10gPSBIV19CRUFDT05fQkFTRTM7CisJcEFkLT5CZWFjb25PZmZzZXRbNF0gPSBIV19CRUFDT05fQkFTRTQ7CisJcEFkLT5CZWFjb25PZmZzZXRbNV0gPSBIV19CRUFDT05fQkFTRTU7CisJcEFkLT5CZWFjb25PZmZzZXRbNl0gPSBIV19CRUFDT05fQkFTRTY7CisJcEFkLT5CZWFjb25PZmZzZXRbN10gPSBIV19CRUFDT05fQkFTRTc7CisKKwkvLworCS8vIHdyaXRlIGFsbCBzaGFyZWQgUmluZydzIGJhc2UgYWRkcmVzcyBpbnRvIEFTSUMKKwkvLworCisJLy8gYXNpYyBzaW11bGF0aW9uIHNlcXVlbmNlIHB1dCB0aGlzIGFoZWFkIGJlZm9yZSBsb2FkaW5nIGZpcm13YXJlLgorCS8vIHBiZiBoYXJkd2FyZSByZXNldAorCisJLy8gSW5pdGlhbHplIEFTSUMgZm9yIFRYICYgUnggb3BlcmF0aW9uCisJaWYgKE5JQ0luaXRpYWxpemVBc2ljKHBBZCAsIGJIYXJkUmVzZXQpICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJeworCQlpZiAoaisrID09IDApCisJCXsKKwkJCU5JQ0xvYWRGaXJtd2FyZShwQWQpOworCQkJZ290byByZXRyeTsKKwkJfQorCQlyZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRTsKKwl9CisKKworCisKKwkvLyBXTU0gcGFyYW1ldGVyCisJY3NyMC53b3JkID0gMDsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBXTU1fVFhPUDBfQ0ZHLCBjc3IwLndvcmQpOworCWlmIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUIpCisJeworCQljc3IwLmZpZWxkLkFjMFR4b3AgPSAxOTI7CS8vIEFDX1ZJOiAxOTIqMzJ1cyB+PSA2bXMKKwkJY3NyMC5maWVsZC5BYzFUeG9wID0gOTY7CS8vIEFDX1ZPOiA5NiozMnVzICB+PSAzbXMKKwl9CisJZWxzZQorCXsKKwkJY3NyMC5maWVsZC5BYzBUeG9wID0gOTY7CS8vIEFDX1ZJOiA5NiozMnVzIH49IDNtcworCQljc3IwLmZpZWxkLkFjMVR4b3AgPSA0ODsJLy8gQUNfVk86IDQ4KjMydXMgfj0gMS41bXMKKwl9CisJUlRNUF9JT19XUklURTMyKHBBZCwgV01NX1RYT1AxX0NGRywgY3NyMC53b3JkKTsKKworCisKKworCS8vIHJlc2V0IGFjdGlvbgorCS8vIExvYWQgZmlybXdhcmUKKwkvLyAgU3RhdHVzID0gTklDTG9hZEZpcm13YXJlKHBBZCk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8LS0gTklDSW5pdGlhbGl6ZUFkYXB0ZXJcbiIpKTsKKwlyZXR1cm4gU3RhdHVzOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJSW5pdGlhbGl6ZSBBU0lDCisKKwlBcmd1bWVudHM6CisJCUFkYXB0ZXIJCQkJCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCUlSUUwgPSBQQVNTSVZFX0xFVkVMCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworTkRJU19TVEFUVVMJTklDSW5pdGlhbGl6ZUFzaWMoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4gIEJPT0xFQU4JCWJIYXJkUmVzZXQpCit7CisJVUxPTkcJCQlJbmRleCA9IDA7CisJVUNIQVIJCQlSMCA9IDB4ZmY7CisJVUlOVDMyCQkJTWFjQ3NyMTIgPSAwLCBDb3VudGVyID0gMDsKKyNpZmRlZiBSVDI4NzAKKwlVSU5UMzIJCQlNYWNDc3IwID0gMDsKKwlOVFNUQVRVUwkJU3RhdHVzOworCVVDSEFSCQkJVmFsdWUgPSAweGZmOworI2VuZGlmIC8vIFJUMjg3MCAvLworCVVTSE9SVAkJCUtleUlkeDsKKwlJTlQJCQkJaSxhcGlkeDsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPiBOSUNJbml0aWFsaXplQXNpY1xuIikpOworCisKKyNpZmRlZiBSVDI4NzAKKwkvLworCS8vIE1ha2Ugc3VyZSBNQUMgZ2V0cyByZWFkeSBhZnRlciBOSUNMb2FkRmlybXdhcmUoKS4KKwkvLworCUluZGV4ID0gMDsKKworCS8vVG8gYXZvaWQgaGFuZy1vbiBpc3N1ZSB3aGVuIGludGVyZmFjZSB1cCBpbiBrZXJuZWwgMi40LAorCS8vd2UgdXNlIGEgbG9jYWwgdmFyaWFibGUgIk1hY0NzcjAiIGluc3RlYWQgb2YgdXNpbmcgInBBZC0+TUFDVmVyc2lvbiIgZGlyZWN0bHkuCisJZG8KKwl7CisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgTUFDX0NTUjAsICZNYWNDc3IwKTsKKworCQlpZiAoKE1hY0NzcjAgIT0gMHgwMCkgJiYgKE1hY0NzcjAgIT0gMHhGRkZGRkZGRikpCisJCQlicmVhazsKKworCQlSVE1QdXNlY0RlbGF5KDEwKTsKKwl9IHdoaWxlIChJbmRleCsrIDwgMTAwKTsKKworCXBBZC0+TUFDVmVyc2lvbiA9IE1hY0NzcjA7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTUFDX0NTUjAgIFsgVmVyOlJldj0weCUwOHhdXG4iLCBwQWQtPk1BQ1ZlcnNpb24pKTsKKwkvLyB0dXJuIG9uIGJpdDEzIChzZXQgdG8gemVybykgYWZ0ZXIgcnQyODYwRC4gVGhpcyBpcyB0byBzb2x2ZSBoaWdoLWN1cnJlbnQgaXNzdWUuCisJUlRNUF9JT19SRUFEMzIocEFkLCBQQkZfU1lTX0NUUkwsICZNYWNDc3IxMik7CisJTWFjQ3NyMTIgJj0gKH4weDIwMDApOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIFBCRl9TWVNfQ1RSTCwgTWFjQ3NyMTIpOworCisJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCAweDMpOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIFVTQl9ETUFfQ0ZHLCAweDApOworCVN0YXR1cyA9IFJUVVNCVmVuZGVyUmVzZXQocEFkKTsKKworCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgMHgwKTsKKworCS8vIEluaXRpYWxpemUgTUFDIHJlZ2lzdGVyIHRvIGRlZmF1bHQgdmFsdWUKKwlmb3IoSW5kZXg9MDsgSW5kZXg8TlVNX01BQ19SRUdfUEFSTVM7IEluZGV4KyspCisJeworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCAoVVNIT1JUKU1BQ1JlZ1RhYmxlW0luZGV4XS5SZWdpc3RlciwgTUFDUmVnVGFibGVbSW5kZXhdLlZhbHVlKTsKKwl9CisKKwlpZihJU19SVDMwNzAocEFkKSkKKwl7CisJCS8vIEFjY29yZGluZyB0byBGcmFuayBIc3UgKGZyb20gR2FyeSBUc2FvKQorCQlSVE1QX0lPX1dSSVRFMzIocEFkLCAoVVNIT1JUKVRYX1NXX0NGRzAsIDB4MDAwMDA0MDApOworCisJCS8vIEluaXRpYWxpemUgUlQzMDcwIHNlcmlhbCBNQUMgcmVnaXN0ZXJzIHdoaWNoIGlzIGRpZmZlcmVudCBmcm9tIFJUMjg3MCBzZXJpYWwKKwkJUlRVU0JXcml0ZU1BQ1JlZ2lzdGVyKHBBZCwgVFhfU1dfQ0ZHMSwgMCk7CisJCVJUVVNCV3JpdGVNQUNSZWdpc3RlcihwQWQsIFRYX1NXX0NGRzIsIDApOworCX0KKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwl7CisJCWZvciAoSW5kZXggPSAwOyBJbmRleCA8IE5VTV9TVEFfTUFDX1JFR19QQVJNUzsgSW5kZXgrKykKKwkJeworCQkJUlRNUF9JT19XUklURTMyKHBBZCwgKFVTSE9SVClTVEFNQUNSZWdUYWJsZVtJbmRleF0uUmVnaXN0ZXIsIFNUQU1BQ1JlZ1RhYmxlW0luZGV4XS5WYWx1ZSk7CisJCX0KKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisjZW5kaWYgLy8gUlQyODcwIC8vCisKKwkvLworCS8vIEJlZm9yZSBwcm9ncmFtIEJCUCwgd2UgbmVlZCB0byB3YWl0IEJCUC9SRiBnZXQgd2FrZSB1cC4KKwkvLworCUluZGV4ID0gMDsKKwlkbworCXsKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBNQUNfU1RBVFVTX0NGRywgJk1hY0NzcjEyKTsKKworCQlpZiAoKE1hY0NzcjEyICYgMHgwMykgPT0gMCkJLy8gaWYgQkIuUkYgaXMgc3RhYmxlCisJCQlicmVhazsKKworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDaGVjayBNQUNfU1RBVFVTX0NGRyAgPSBCdXN5ID0gJXhcbiIsIE1hY0NzcjEyKSk7CisJCVJUTVB1c2VjRGVsYXkoMTAwMCk7CisJfSB3aGlsZSAoSW5kZXgrKyA8IDEwMCk7CisKKyAgICAvLyBUaGUgY29tbWFuZHMgdG8gZmlybXdhcmUgc2hvdWxkIGJlIGFmdGVyIHRoZXNlIGNvbW1hbmRzLCB0aGVzZSBjb21tYW5kcyB3aWxsIGluaXQgZmlybXdhcmUKKwkvLyBQQ0kgYW5kIFVTQiBhcmUgbm90IHRoZSBzYW1lIGJlY2F1c2UgUENJIGRyaXZlciBuZWVkcyB0byB3YWl0IGZvciBQQ0kgYnVzIHJlYWR5CisJUlRNUF9JT19XUklURTMyKHBBZCwgSDJNX0JCUF9BR0VOVCwgMCk7CS8vIGluaXRpYWxpemUgQkJQIFIvVyBhY2Nlc3MgYWdlbnQKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBIMk1fTUFJTEJPWF9DU1IsIDApOworCVJUTVB1c2VjRGVsYXkoMTAwMCk7CisKKwkvLyBSZWFkIEJCUCByZWdpc3RlciwgbWFrZSBzdXJlIEJCUCBpcyB1cCBhbmQgcnVubmluZyBiZWZvcmUgd3JpdGUgbmV3IGRhdGEKKwlJbmRleCA9IDA7CisJZG8KKwl7CisJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMCwgJlIwKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQkJQIHZlcnNpb24gPSAleFxuIiwgUjApKTsKKwl9IHdoaWxlICgoKytJbmRleCA8IDIwKSAmJiAoKFIwID09IDB4ZmYpIHx8IChSMCA9PSAweDAwKSkpOworCS8vQVNTRVJUKEluZGV4IDwgMjApOyAvL3RoaXMgd2lsbCBjYXVzZSBCU09EIG9uIENoZWNrLWJ1aWxkIGRyaXZlcgorCisJaWYgKChSMCA9PSAweGZmKSB8fCAoUjAgPT0gMHgwMCkpCisJCXJldHVybiBORElTX1NUQVRVU19GQUlMVVJFOworCisJLy8gSW5pdGlhbGl6ZSBCQlAgcmVnaXN0ZXIgdG8gZGVmYXVsdCB2YWx1ZQorCWZvciAoSW5kZXggPSAwOyBJbmRleCA8IE5VTV9CQlBfUkVHX1BBUk1TOyBJbmRleCsrKQorCXsKKwkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUFJlZ1RhYmxlW0luZGV4XS5SZWdpc3RlciwgQkJQUmVnVGFibGVbSW5kZXhdLlZhbHVlKTsKKwl9CisKKwkvLyBmb3IgcnQyODYwRSBhbmQgYWZ0ZXIsIGluaXQgQkJQX1I4NCB3aXRoIDB4MTkuIFRoaXMgaXMgZm9yIGV4dGVuc2lvbiBjaGFubmVsIG92ZXJsYXBwaW5nIElPVC4KKwlpZiAoKHBBZC0+TUFDVmVyc2lvbiYweGZmZmYpICE9IDB4MDEwMSkKKwkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SODQsIDB4MTkpOworCisjaWZkZWYgUlQyODcwCisJLy93cml0ZSBSVDMwNzAgQkJQIHdjaGljaCBkaWZmZXJlbnQgd2l0aCAyODcwIGFmdGVyIHdyaXRlIFJUMjg3MCBCQlAKKwlpZiAoSVNfUlQzMDcwKHBBZCkpCisJeworCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I3MCwgMHgwYSk7CisJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjg0LCAweDk5KTsKKwkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMTA1LCAweDA1KTsKKwl9CisjZW5kaWYgLy8gUlQyODcwIC8vCisKKwlpZiAocEFkLT5NQUNWZXJzaW9uID09IDB4Mjg2MDAxMDApCisJeworCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2OSwgMHgxNik7CisJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjczLCAweDEyKTsKKyAgICB9CisKKwlpZiAocEFkLT5NQUNWZXJzaW9uID49IFJBTElOS18yODgwRV9WRVJTSU9OICYmIHBBZC0+TUFDVmVyc2lvbiA8IFJBTElOS18zMDcwX1ZFUlNJT04pIC8vIDMqMworCXsKKwkJLy8gZW5sYXJnZSBNQVhfTEVOX0NGRworCQlVSU5UMzIgY3NyOworCQlSVE1QX0lPX1JFQUQzMihwQWQsIE1BWF9MRU5fQ0ZHLCAmY3NyKTsKKwkJY3NyICY9IDB4RkZGOworCQljc3IgfD0gMHgyMDAwOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQVhfTEVOX0NGRywgY3NyKTsKKwl9CisKKyNpZmRlZiBSVDI4NzAKK3sKKwlVQ0hBUglNQUNfVmFsdWVbXT17MHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwwLDB9OworCisJLy9Jbml0aWFsaXplIFdDSUQgdGFibGUKKwlWYWx1ZSA9IDB4ZmY7CisJZm9yKEluZGV4ID0wIDtJbmRleCA8IDI1NDtJbmRleCsrKQorCXsKKwkJUlRVU0JNdWx0aVdyaXRlKHBBZCwgKFVTSE9SVCkoTUFDX1dDSURfQkFTRSArIEluZGV4ICogOCksIE1BQ19WYWx1ZSwgOCk7CisJfQorfQorI2VuZGlmIC8vIFJUMjg3MCAvLworCisJLy8gQWRkIHJhZGlvIG9mZiBjb250cm9sCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwl7CisJCWlmIChwQWQtPlN0YUNmZy5iUmFkaW8gPT0gRkFMU0UpCisJCXsKKy8vCQkJUlRNUF9JT19XUklURTMyKHBBZCwgUFdSX1BJTl9DRkcsIDB4MDAwMDE4MTgpOworCQkJUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkFESU9fT0ZGKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldCBSYWRpbyBPZmZcbiIpKTsKKwkJfQorCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCS8vIENsZWFyIHJhdyBjb3VudGVycworCVJUTVBfSU9fUkVBRDMyKHBBZCwgUlhfU1RBX0NOVDAsICZDb3VudGVyKTsKKwlSVE1QX0lPX1JFQUQzMihwQWQsIFJYX1NUQV9DTlQxLCAmQ291bnRlcik7CisJUlRNUF9JT19SRUFEMzIocEFkLCBSWF9TVEFfQ05UMiwgJkNvdW50ZXIpOworCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfU1RBX0NOVDAsICZDb3VudGVyKTsKKwlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX1NUQV9DTlQxLCAmQ291bnRlcik7CisJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9TVEFfQ05UMiwgJkNvdW50ZXIpOworCisJLy8gQVNJQyB3aWxsIGtlZXAgZ2FyYmFnZSB2YWx1ZSBhZnRlciBib290CisJLy8gQ2xlYXIgYWxsIHNlYXJlZCBrZXkgdGFibGUgd2hlbiBpbml0aWFsCisJLy8gVGhpcyByb3V0aW5lIGNhbiBiZSBpZ25vcmVkIGluIHJhZGlvLU9OL09GRiBvcGVyYXRpb24uCisJaWYgKGJIYXJkUmVzZXQpCisJeworCQlmb3IgKEtleUlkeCA9IDA7IEtleUlkeCA8IDQ7IEtleUlkeCsrKQorCQl7CisJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBTSEFSRURfS0VZX01PREVfQkFTRSArIDQqS2V5SWR4LCAwKTsKKwkJfQorCisJCS8vIENsZWFyIGFsbCBwYWlyd2lzZSBrZXkgdGFibGUgd2hlbiBpbml0aWFsCisJCWZvciAoS2V5SWR4ID0gMDsgS2V5SWR4IDwgMjU2OyBLZXlJZHgrKykKKwkJeworCQkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1dDSURfQVRUUklCVVRFX0JBU0UgKyAoS2V5SWR4ICogSFdfV0NJRF9BVFRSSV9TSVpFKSwgMSk7CisJCX0KKwl9CisKKwkvLyBhc3NlcnQgSE9TVCByZWFkeSBiaXQKKy8vICBSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfQ1NSMSwgMHgwKTsgLy8gMjAwNC0wOS0xNCBhc2tlZCBieSBNYXJrCisvLyAgUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX0NTUjEsIDB4NCk7CisKKwkvLyBJdCBpc24ndCBuZWNlc3NhcnkgdG8gY2xlYXIgdGhpcyBzcGFjZSB3aGVuIG5vdCBoYXJkIHJlc2V0LgorCWlmIChiSGFyZFJlc2V0ID09IFRSVUUpCisJeworCQkvLyBjbGVhciBhbGwgb24tY2hpcCBCRUFDT04gZnJhbWUgc3BhY2UKKwkJZm9yIChhcGlkeCA9IDA7IGFwaWR4IDwgSFdfQkVBQ09OX01BWF9DT1VOVDsgYXBpZHgrKykKKwkJeworCQkJZm9yIChpID0gMDsgaSA8IEhXX0JFQUNPTl9PRkZTRVQ+PjI7IGkrPTQpCisJCQkJUlRNUF9JT19XUklURTMyKHBBZCwgcEFkLT5CZWFjb25PZmZzZXRbYXBpZHhdICsgaSwgMHgwMCk7CisJCX0KKwl9CisjaWZkZWYgUlQyODcwCisJQXNpY0Rpc2FibGVTeW5jKHBBZCk7CisJLy8gQ2xlYXIgcmF3IGNvdW50ZXJzCisJUlRNUF9JT19SRUFEMzIocEFkLCBSWF9TVEFfQ05UMCwgJkNvdW50ZXIpOworCVJUTVBfSU9fUkVBRDMyKHBBZCwgUlhfU1RBX0NOVDEsICZDb3VudGVyKTsKKwlSVE1QX0lPX1JFQUQzMihwQWQsIFJYX1NUQV9DTlQyLCAmQ291bnRlcik7CisJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9TVEFfQ05UMCwgJkNvdW50ZXIpOworCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfU1RBX0NOVDEsICZDb3VudGVyKTsKKwlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX1NUQV9DTlQyLCAmQ291bnRlcik7CisJLy8gRGVmYXVsdCBQQ0kgY2xvY2sgY3ljbGUgcGVyIG1zIGlzIGRpZmZlcmVudCBhcyBkZWZhdWx0IHNldHRpbmcsIHdoaWNoIGlzIGJhc2VkIG9uIFBDSS4KKwlSVE1QX0lPX1JFQUQzMihwQWQsIFVTQl9DWUNfQ0ZHLCAmQ291bnRlcik7CisJQ291bnRlciY9MHhmZmZmZmYwMDsKKwlDb3VudGVyfD0weDAwMDAwMWU7CisJUlRNUF9JT19XUklURTMyKHBBZCwgVVNCX0NZQ19DRkcsIENvdW50ZXIpOworI2VuZGlmIC8vIFJUMjg3MCAvLworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwl7CisJCS8vIGZvciBydDI4NjBFIGFuZCBhZnRlciwgaW5pdCBUWE9QX0NUUkxfQ0ZHIHdpdGggMHg1ODNmLiBUaGlzIGlzIGZvciBleHRlbnNpb24gY2hhbm5lbCBvdmVybGFwcGluZyBJT1QuCisJCWlmICgocEFkLT5NQUNWZXJzaW9uJjB4ZmZmZikgIT0gMHgwMTAxKQorCQkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhPUF9DVFJMX0NGRywgMHg1ODNmKTsKKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8LS0gTklDSW5pdGlhbGl6ZUFzaWNcbiIpKTsKKwlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVJlc2V0IE5JQyBBc2ljcworCisJQXJndW1lbnRzOgorCQlBZGFwdGVyCQkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCisJTm90ZToKKwkJUmVzZXQgTklDIHRvIGluaXRpYWwgc3RhdGUgQVMgSVMgc3lzdGVtIGJvb3QgdXAgdGltZS4KKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJTklDSXNzdWVSZXNldCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCkKK3sKKwlVSU5UMzIJVmFsdWUgPSAwOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPiBOSUNJc3N1ZVJlc2V0XG4iKSk7CisKKwkvLyBBYm9ydCBUeCwgcHJldmVudCBBU0lDIGZyb20gd3JpdGluZyB0byBIb3N0IG1lbW9yeQorCS8vUlRNUF9JT19XUklURTMyKHBBZCwgVFhfQ05UTF9DU1IsIDB4MDAxZjAwMDApOworCisJLy8gRGlzYWJsZSBSeCwgcmVnaXN0ZXIgdmFsdWUgc3VwcG9zZWQgd2lsbCByZW1haW4gYWZ0ZXIgcmVzZXQKKwlSVE1QX0lPX1JFQUQzMihwQWQsIE1BQ19TWVNfQ1RSTCwgJlZhbHVlKTsKKwlWYWx1ZSAmPSAoMHhmZmZmZmZmMyk7CisJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCBWYWx1ZSk7CisKKwkvLyBJc3N1ZSByZXNldCBhbmQgY2xlYXIgZnJvbSByZXNldCBzdGF0ZQorCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgMHgwMyk7IC8vIDIwMDQtMDktMTcgY2hhbmdlIGZyb20gMHgwMQorCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgMHgwMCk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8LS0gTklDSXNzdWVSZXNldFxuIikpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJQ2hlY2sgQVNJQyByZWdpc3RlcnMgYW5kIGZpbmQgYW55IHJlYXNvbiB0aGUgc3lzdGVtIG1pZ2h0IGhhbmcKKworCUFyZ3VtZW50czoKKwkJQWRhcHRlcgkJCQkJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitCT09MRUFOCU5JQ0NoZWNrRm9ySGFuZygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCkKK3sKKwlyZXR1cm4gKEZBTFNFKTsKK30KKworVk9JRCBOSUNVcGRhdGVGaWZvU3RhQ291bnRlcnMoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJVFhfU1RBX0ZJRk9fU1RSVUMJU3RhRmlmbzsKKwlNQUNfVEFCTEVfRU5UUlkJCSpwRW50cnk7CisJVUNIQVIJCQkJaSA9IDA7CisJVUNIQVIJCQlwaWQgPSAwLCB3Y2lkID0gMDsKKwlDSEFSCQkJCXJlVHJ5OworCVVDSEFSCQkJCXN1Y2NNQ1M7CisKKyNpZmRlZiBSQUxJTktfQVRFCisJLyogTm90aGluZyB0byBkbyBpbiBBVEUgbW9kZSAqLworCWlmIChBVEVfT04ocEFkKSkKKwkJcmV0dXJuOworI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKworCQlkbworCQl7CisJCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX1NUQV9GSUZPLCAmU3RhRmlmby53b3JkKTsKKworCQkJaWYgKFN0YUZpZm8uZmllbGQuYlZhbGlkID09IDApCisJCQkJYnJlYWs7CisKKwkJCXdjaWQgPSAoVUNIQVIpU3RhRmlmby5maWVsZC53Y2lkOworCisKKwkJLyogaWdub3JlIE5vQUNLIGFuZCBNR01UIGZyYW1lIHVzZSAweEZGIGFzIFdDSUQgKi8KKwkJCWlmICgoU3RhRmlmby5maWVsZC5UeEFja1JlcXVpcmVkID09IDApIHx8ICh3Y2lkID49IE1BWF9MRU5fT0ZfTUFDX1RBQkxFKSkKKwkJCXsKKwkJCQlpKys7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCS8qIFBJRCBzdG9yZSBUeCBNQ1MgUmF0ZSAqLworCQkJcGlkID0gKFVDSEFSKVN0YUZpZm8uZmllbGQuUGlkVHlwZTsKKworCQkJcEVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbd2NpZF07CisKKwkJCXBFbnRyeS0+RGVidWdGSUZPQ291bnQrKzsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJaWYgKFN0YUZpZm8uZmllbGQuVHhCRikgLy8gMyozCisJCQkJcEVudHJ5LT5UeEJGQ291bnQrKzsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworI2lmZGVmIFVBUFNEX0FQX1NVUFBPUlQKKwkJCVVBUFNEX1NQX0FVRV9IYW5kbGUocEFkLCBwRW50cnksIFN0YUZpZm8uZmllbGQuVHhTdWNjZXNzKTsKKyNlbmRpZiAvLyBVQVBTRF9BUF9TVVBQT1JUIC8vCisKKwkJCWlmICghU3RhRmlmby5maWVsZC5UeFN1Y2Nlc3MpCisJCQl7CisJCQkJcEVudHJ5LT5GSUZPQ291bnQrKzsKKwkJCQlwRW50cnktPk9uZVNlY1R4RmFpbENvdW50Kys7CisKKwkJCQlpZiAocEVudHJ5LT5GSUZPQ291bnQgPj0gMSkKKwkJCQl7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiMiKSk7CisjaWYgMAorCQkJCQlTZW5kUmVmcmVzaEJBUihwQWQsIHBFbnRyeSk7CisJCQkJCXBFbnRyeS0+Tm9CQURhdGFDb3VudERvd24gPSA2NDsKKyNlbHNlCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQkJCXBFbnRyeS0+Tm9CQURhdGFDb3VudERvd24gPSA2NDsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCQkJCQlpZihwRW50cnktPlBzTW9kZSA9PSBQV1JfQUNUSVZFKQorCQkJCQl7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQkJCQlpbnQgdGlkOworCQkJCQkJZm9yICh0aWQ9MDsgdGlkPE5VTV9PRl9USUQ7IHRpZCsrKQorCQkJCQkJeworCQkJCQkJCUJBT3JpU2Vzc2lvblRlYXJEb3duKHBBZCwgcEVudHJ5LT5BaWQsICB0aWQsIEZBTFNFLCBGQUxTRSk7CisJCQkJCQl9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwkJCQkJCS8vIFVwZGF0ZSB0aGUgY29udGludW91cyB0cmFuc21pc3Npb24gY291bnRlciBleGNlcHQgUFMgbW9kZQorCQkJCQkJcEVudHJ5LT5Db250aW51ZVR4RmFpbENudCsrOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJLy8gQ2xlYXIgdGhlIEZJRk9Db3VudCB3aGVuIHN0YSBpbiBQb3dlciBTYXZlIG1vZGUuIEJhc2ljYWxseSB3ZSBhc3N1bWUKKwkJCQkJCS8vICAgICB0aGlzIHR4IGVycm9yIGhhcHBlbmVkIGR1ZSB0byBzdGEganVzdCBnbyB0byBzbGVlcC4KKwkJCQkJCXBFbnRyeS0+RklGT0NvdW50ID0gMDsKKwkJCQkJCXBFbnRyeS0+Q29udGludWVUeEZhaWxDbnQgPSAwOworCQkJCQl9CisjZW5kaWYKKwkJCQkJLy9wRW50cnktPkZJRk9Db3VudCA9IDA7CisJCQkJfQorCQkJCS8vcEVudHJ5LT5iU2VuZEJBUiA9IFRSVUU7CisJCQl9CisJCQllbHNlCisJCQl7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQkJaWYgKChwRW50cnktPlBzTW9kZSAhPSBQV1JfU0FWRSkgJiYgKHBFbnRyeS0+Tm9CQURhdGFDb3VudERvd24gPiAwKSkKKwkJCQl7CisJCQkJCXBFbnRyeS0+Tm9CQURhdGFDb3VudERvd24tLTsKKwkJCQkJaWYgKHBFbnRyeS0+Tm9CQURhdGFDb3VudERvd249PTApCisJCQkJCXsKKwkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkBcbiIpKTsKKwkJCQkJfQorCQkJCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJCQlwRW50cnktPkZJRk9Db3VudCA9IDA7CisJCQkJcEVudHJ5LT5PbmVTZWNUeE5vUmV0cnlPa0NvdW50Kys7CisJCQkJLy8gdXBkYXRlIE5vRGF0YUlkbGVDb3VudCB3aGVuIHN1Y2Vzc2Z1bCBzZW5kIHBhY2tldCB0byBTVEEuCisJCQkJcEVudHJ5LT5Ob0RhdGFJZGxlQ291bnQgPSAwOworCQkJCXBFbnRyeS0+Q29udGludWVUeEZhaWxDbnQgPSAwOworCQkJfQorCisJCQlzdWNjTUNTID0gU3RhRmlmby5maWVsZC5TdWNjZXNzUmF0ZSAmIDB4N0Y7CisKKwkJCXJlVHJ5ID0gcGlkIC0gc3VjY01DUzsKKworCQkJaWYgKFN0YUZpZm8uZmllbGQuVHhTdWNjZXNzKQorCQkJeworCQkJCXBFbnRyeS0+VFhNQ1NFeHBlY3RlZFtwaWRdKys7CisJCQkJaWYgKHBpZCA9PSBzdWNjTUNTKQorCQkJCXsKKwkJCQkJcEVudHJ5LT5UWE1DU1N1Y2Nlc3NmdWxbcGlkXSsrOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlwRW50cnktPlRYTUNTQXV0b0ZhbGxCYWNrW3BpZF1bc3VjY01DU10rKzsKKwkJCQl9CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJcEVudHJ5LT5UWE1DU0ZhaWxlZFtwaWRdKys7CisJCQl9CisKKwkJCWlmIChyZVRyeSA+IDApCisJCQl7CisJCQkJaWYgKChwaWQgPj0gMTIpICYmIHN1Y2NNQ1MgPD03KQorCQkJCXsKKwkJCQkJcmVUcnkgLT0gNDsKKwkJCQl9CisJCQkJcEVudHJ5LT5PbmVTZWNUeFJldHJ5T2tDb3VudCArPSByZVRyeTsKKwkJCX0KKworCQkJaSsrOworCQkJLy8gQVNJQyBzdG9yZSAxNiBzdGFjaworCQl9IHdoaWxlICggaSA8ICgyKlRYX1JJTkdfU0laRSkgKTsKKworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJUmVhZCBzdGF0aXN0aWNhbCBjb3VudGVycyBmcm9tIGhhcmR3YXJlIHJlZ2lzdGVycyBhbmQgcmVjb3JkIHRoZW0KKwkJaW4gc29mdHdhcmUgdmFyaWFibGVzIGZvciBsYXRlciBvbiBxdWVyeQorCisJQXJndW1lbnRzOgorCQlwQWQJCQkJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIE5JQ1VwZGF0ZVJhd0NvdW50ZXJzKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCVVJTlQzMglPbGRWYWx1ZTsKKwlSWF9TVEFfQ05UMF9TVFJVQwkgUnhTdGFDbnQwOworCVJYX1NUQV9DTlQxX1NUUlVDICAgUnhTdGFDbnQxOworCVJYX1NUQV9DTlQyX1NUUlVDICAgUnhTdGFDbnQyOworCVRYX1NUQV9DTlQwX1NUUlVDIAkgVHhTdGFDbnQwOworCVRYX1NUQV9DTlQxX1NUUlVDCSBTdGFUeDE7CisJVFhfU1RBX0NOVDJfU1RSVUMJIFN0YVR4MjsKKwlUWF9BR0dfQ05UX1NUUlVDCVR4QWdnQ250OworCVRYX0FHR19DTlQwX1NUUlVDCVR4QWdnQ250MDsKKwlUWF9BR0dfQ05UMV9TVFJVQwlUeEFnZ0NudDE7CisJVFhfQUdHX0NOVDJfU1RSVUMJVHhBZ2dDbnQyOworCVRYX0FHR19DTlQzX1NUUlVDCVR4QWdnQ250MzsKKwlUWF9BR0dfQ05UNF9TVFJVQwlUeEFnZ0NudDQ7CisJVFhfQUdHX0NOVDVfU1RSVUMJVHhBZ2dDbnQ1OworCVRYX0FHR19DTlQ2X1NUUlVDCVR4QWdnQ250NjsKKwlUWF9BR0dfQ05UN19TVFJVQwlUeEFnZ0NudDc7CisKKworCVJUTVBfSU9fUkVBRDMyKHBBZCwgUlhfU1RBX0NOVDAsICZSeFN0YUNudDAud29yZCk7CisJUlRNUF9JT19SRUFEMzIocEFkLCBSWF9TVEFfQ05UMiwgJlJ4U3RhQ250Mi53b3JkKTsKKworCXsKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBSWF9TVEFfQ05UMSwgJlJ4U3RhQ250MS53b3JkKTsKKwkgICAgLy8gVXBkYXRlIFJYIFBMQ1AgZXJyb3IgY291bnRlcgorCSAgICBwQWQtPlByaXZhdGVJbmZvLlBoeVJ4RXJyQ250ICs9IFJ4U3RhQ250MS5maWVsZC5QbGNwRXJyOworCQkvLyBVcGRhdGUgRmFsc2UgQ0NBIGNvdW50ZXIKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNGYWxzZUNDQUNudCArPSBSeFN0YUNudDEuZmllbGQuRmFsc2VDY2E7CisJfQorCisJLy8gVXBkYXRlIEZDUyBjb3VudGVycworCU9sZFZhbHVlPSBwQWQtPldsYW5Db3VudGVycy5GQ1NFcnJvckNvdW50LnUuTG93UGFydDsKKwlwQWQtPldsYW5Db3VudGVycy5GQ1NFcnJvckNvdW50LnUuTG93UGFydCArPSAoUnhTdGFDbnQwLmZpZWxkLkNyY0Vycik7IC8vID4+IDcpOworCWlmIChwQWQtPldsYW5Db3VudGVycy5GQ1NFcnJvckNvdW50LnUuTG93UGFydCA8IE9sZFZhbHVlKQorCQlwQWQtPldsYW5Db3VudGVycy5GQ1NFcnJvckNvdW50LnUuSGlnaFBhcnQrKzsKKworCS8vIEFkZCBGQ1MgZXJyb3IgY291bnQgdG8gcHJpdmF0ZSBjb3VudGVycworCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjUnhGY3NFcnJDbnQgKz0gUnhTdGFDbnQwLmZpZWxkLkNyY0VycjsKKwlPbGRWYWx1ZSA9IHBBZC0+UmFsaW5rQ291bnRlcnMuUmVhbEZjc0VyckNvdW50LnUuTG93UGFydDsKKwlwQWQtPlJhbGlua0NvdW50ZXJzLlJlYWxGY3NFcnJDb3VudC51Lkxvd1BhcnQgKz0gUnhTdGFDbnQwLmZpZWxkLkNyY0VycjsKKwlpZiAocEFkLT5SYWxpbmtDb3VudGVycy5SZWFsRmNzRXJyQ291bnQudS5Mb3dQYXJ0IDwgT2xkVmFsdWUpCisJCXBBZC0+UmFsaW5rQ291bnRlcnMuUmVhbEZjc0VyckNvdW50LnUuSGlnaFBhcnQrKzsKKworCS8vIFVwZGF0ZSBEdXBsaWNhdGUgUmN2IGNoZWNrCisJcEFkLT5SYWxpbmtDb3VudGVycy5EdXBsaWNhdGVSY3YgKz0gUnhTdGFDbnQyLmZpZWxkLlJ4RHVwbGlDb3VudDsKKwlwQWQtPldsYW5Db3VudGVycy5GcmFtZUR1cGxpY2F0ZUNvdW50LnUuTG93UGFydCArPSBSeFN0YUNudDIuZmllbGQuUnhEdXBsaUNvdW50OworCS8vIFVwZGF0ZSBSWCBPdmVyZmxvdyBjb3VudGVyCisJcEFkLT5Db3VudGVyczgwMjMuUnhOb0J1ZmZlciArPSAoUnhTdGFDbnQyLmZpZWxkLlJ4Rmlmb092ZXJmbG93Q291bnQpOworCisJLy9wQWQtPlJhbGlua0NvdW50ZXJzLlJ4Q291bnQgPSAwOworI2lmZGVmIFJUMjg3MAorCWlmIChwQWQtPlJhbGlua0NvdW50ZXJzLlJ4Q291bnQgIT0gcEFkLT53YXRjaERvZ1J4Q250KQorCXsKKwkJcEFkLT53YXRjaERvZ1J4Q250ID0gcEFkLT5SYWxpbmtDb3VudGVycy5SeENvdW50OworCQlwQWQtPndhdGNoRG9nUnhPdmVyRmxvd0NudCA9IDA7CisJfQorCWVsc2UKKwl7CisJCWlmIChSeFN0YUNudDIuZmllbGQuUnhGaWZvT3ZlcmZsb3dDb3VudCkKKwkJCXBBZC0+d2F0Y2hEb2dSeE92ZXJGbG93Q250Kys7CisJCWVsc2UKKwkJCXBBZC0+d2F0Y2hEb2dSeE92ZXJGbG93Q250ID0gMDsKKwl9CisjZW5kaWYgLy8gUlQyODcwIC8vCisKKworCS8vaWYgKCFPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1RYX1JBVEVfU1dJVENIX0VOQUJMRUQpIHx8CisJLy8JKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfVFhfUkFURV9TV0lUQ0hfRU5BQkxFRCkgJiYgKHBBZC0+TWFjVGFiLlNpemUgIT0gMSkpKQorCWlmICghcEFkLT5iVXBkYXRlQmNuQ250RG9uZSkKKwl7CisJLy8gVXBkYXRlIEJFQUNPTiBzZW50IGNvdW50CisJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9TVEFfQ05UMCwgJlR4U3RhQ250MC53b3JkKTsKKwlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX1NUQV9DTlQxLCAmU3RhVHgxLndvcmQpOworCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfU1RBX0NOVDIsICZTdGFUeDIud29yZCk7CisJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNCZWFjb25TZW50Q250ICs9IFR4U3RhQ250MC5maWVsZC5UeEJlYWNvbkNvdW50OworCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhSZXRyeU9rQ291bnQgKz0gU3RhVHgxLmZpZWxkLlR4UmV0cmFuc21pdDsKKwlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4Tm9SZXRyeU9rQ291bnQgKz0gU3RhVHgxLmZpZWxkLlR4U3VjY2VzczsKKwlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4RmFpbENvdW50ICs9IFR4U3RhQ250MC5maWVsZC5UeEZhaWxDb3VudDsKKwlwQWQtPldsYW5Db3VudGVycy5UcmFuc21pdHRlZEZyYWdtZW50Q291bnQudS5Mb3dQYXJ0ICs9IFN0YVR4MS5maWVsZC5UeFN1Y2Nlc3M7CisJcEFkLT5XbGFuQ291bnRlcnMuUmV0cnlDb3VudC51Lkxvd1BhcnQgKz0gU3RhVHgxLmZpZWxkLlR4UmV0cmFuc21pdDsKKwlwQWQtPldsYW5Db3VudGVycy5GYWlsZWRDb3VudC51Lkxvd1BhcnQgKz0gVHhTdGFDbnQwLmZpZWxkLlR4RmFpbENvdW50OworCX0KKworI2lmIDAKKwlSZXRyeSA9IFN0YVR4MS5maWVsZC5UeFJldHJhbnNtaXQ7CisJRmFpbCA9IFR4U3RhQ250MC5maWVsZC5UeEZhaWxDb3VudDsKKwlUeEVycm9yUmF0aW8gPSAwOworCU9uZVNlY1RyYW5zbWl0Q291bnQgPSBwQWQtPldsYW5Db3VudGVycy5UcmFuc21pdHRlZEZyYWdtZW50Q291bnQudS5Mb3dQYXJ0LSBwQWQtPldsYW5Db3VudGVycy5MYXN0VHJhbnNtaXR0ZWRGcmFnbWVudENvdW50LnUuTG93UGFydDsKKwlpZiAoKE9uZVNlY1RyYW5zbWl0Q291bnQrUmV0cnkgKyBGYWlsKSA+IDApCisJCVR4RXJyb3JSYXRpbyA9ICgoIFJldHJ5ICsgRmFpbCkgKjEwMCkgLyAoT25lU2VjVHJhbnNtaXRDb3VudCtSZXRyeSArIEZhaWwpOworCisJaWYgKChPbmVTZWNUcmFuc21pdENvdW50K1JldHJ5ICsgRmFpbCkgPiAwKQorCQlUeEVycm9yUmF0aW8gPSAoKCBSZXRyeSArIEZhaWwpICoxMDApIC8gKE9uZVNlY1RyYW5zbWl0Q291bnQrUmV0cnkgKyBGYWlsKTsKKwlEQkdQUklOVChSVF9ERUJVR19JTkZPLCAoIlRYIEVSUk9SIFJhdGUgPSAlbGQgJSUsIFJldHJ5ID0gJWxkLCBGYWlsID0gJWxkLCBUb3RhbCA9ICVsZCAgXG4iLFR4RXJyb3JSYXRpbywgUmV0cnksIEZhaWwsIChPbmVTZWNUcmFuc21pdENvdW50K1JldHJ5ICsgRmFpbCkpKTsKKwlwQWQtPldsYW5Db3VudGVycy5MYXN0VHJhbnNtaXR0ZWRGcmFnbWVudENvdW50LnUuTG93UGFydCA9IHBBZC0+V2xhbkNvdW50ZXJzLlRyYW5zbWl0dGVkRnJhZ21lbnRDb3VudC51Lkxvd1BhcnQ7CisjZW5kaWYKKworCS8vaWYgKHBBZC0+YlN0YUZpZm9UZXN0ID09IFRSVUUpCisJeworCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0FHR19DTlQsICZUeEFnZ0NudC53b3JkKTsKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9BR0dfQ05UMCwgJlR4QWdnQ250MC53b3JkKTsKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9BR0dfQ05UMSwgJlR4QWdnQ250MS53b3JkKTsKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9BR0dfQ05UMiwgJlR4QWdnQ250Mi53b3JkKTsKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9BR0dfQ05UMywgJlR4QWdnQ250My53b3JkKTsKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9BR0dfQ05UNCwgJlR4QWdnQ250NC53b3JkKTsKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9BR0dfQ05UNSwgJlR4QWdnQ250NS53b3JkKTsKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9BR0dfQ05UNiwgJlR4QWdnQ250Ni53b3JkKTsKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9BR0dfQ05UNywgJlR4QWdnQ250Ny53b3JkKTsKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5UeEFnZ0NvdW50ICs9IFR4QWdnQ250LmZpZWxkLkFnZ1R4Q291bnQ7CisJCXBBZC0+UmFsaW5rQ291bnRlcnMuVHhOb25BZ2dDb3VudCArPSBUeEFnZ0NudC5maWVsZC5Ob25BZ2dUeENvdW50OworCQlwQWQtPlJhbGlua0NvdW50ZXJzLlR4QWdnMU1QRFVDb3VudCArPSBUeEFnZ0NudDAuZmllbGQuQWdnU2l6ZTFDb3VudDsKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5UeEFnZzJNUERVQ291bnQgKz0gVHhBZ2dDbnQwLmZpZWxkLkFnZ1NpemUyQ291bnQ7CisKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5UeEFnZzNNUERVQ291bnQgKz0gVHhBZ2dDbnQxLmZpZWxkLkFnZ1NpemUzQ291bnQ7CisJCXBBZC0+UmFsaW5rQ291bnRlcnMuVHhBZ2c0TVBEVUNvdW50ICs9IFR4QWdnQ250MS5maWVsZC5BZ2dTaXplNENvdW50OworCQlwQWQtPlJhbGlua0NvdW50ZXJzLlR4QWdnNU1QRFVDb3VudCArPSBUeEFnZ0NudDIuZmllbGQuQWdnU2l6ZTVDb3VudDsKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5UeEFnZzZNUERVQ291bnQgKz0gVHhBZ2dDbnQyLmZpZWxkLkFnZ1NpemU2Q291bnQ7CisKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5UeEFnZzdNUERVQ291bnQgKz0gVHhBZ2dDbnQzLmZpZWxkLkFnZ1NpemU3Q291bnQ7CisJCXBBZC0+UmFsaW5rQ291bnRlcnMuVHhBZ2c4TVBEVUNvdW50ICs9IFR4QWdnQ250My5maWVsZC5BZ2dTaXplOENvdW50OworCQlwQWQtPlJhbGlua0NvdW50ZXJzLlR4QWdnOU1QRFVDb3VudCArPSBUeEFnZ0NudDQuZmllbGQuQWdnU2l6ZTlDb3VudDsKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5UeEFnZzEwTVBEVUNvdW50ICs9IFR4QWdnQ250NC5maWVsZC5BZ2dTaXplMTBDb3VudDsKKworCQlwQWQtPlJhbGlua0NvdW50ZXJzLlR4QWdnMTFNUERVQ291bnQgKz0gVHhBZ2dDbnQ1LmZpZWxkLkFnZ1NpemUxMUNvdW50OworCQlwQWQtPlJhbGlua0NvdW50ZXJzLlR4QWdnMTJNUERVQ291bnQgKz0gVHhBZ2dDbnQ1LmZpZWxkLkFnZ1NpemUxMkNvdW50OworCQlwQWQtPlJhbGlua0NvdW50ZXJzLlR4QWdnMTNNUERVQ291bnQgKz0gVHhBZ2dDbnQ2LmZpZWxkLkFnZ1NpemUxM0NvdW50OworCQlwQWQtPlJhbGlua0NvdW50ZXJzLlR4QWdnMTRNUERVQ291bnQgKz0gVHhBZ2dDbnQ2LmZpZWxkLkFnZ1NpemUxNENvdW50OworCisJCXBBZC0+UmFsaW5rQ291bnRlcnMuVHhBZ2cxNU1QRFVDb3VudCArPSBUeEFnZ0NudDcuZmllbGQuQWdnU2l6ZTE1Q291bnQ7CisJCXBBZC0+UmFsaW5rQ291bnRlcnMuVHhBZ2cxNk1QRFVDb3VudCArPSBUeEFnZ0NudDcuZmllbGQuQWdnU2l6ZTE2Q291bnQ7CisKKwkJLy8gQ2FsY3VsYXRlIHRoZSB0cmFuc21pdHRlZCBBLU1QRFUgY291bnQKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5UcmFuc21pdHRlZEFNUERVQ291bnQudS5Mb3dQYXJ0ICs9IFR4QWdnQ250MC5maWVsZC5BZ2dTaXplMUNvdW50OworCQlwQWQtPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkQU1QRFVDb3VudC51Lkxvd1BhcnQgKz0gKFR4QWdnQ250MC5maWVsZC5BZ2dTaXplMkNvdW50IC8gMik7CisKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5UcmFuc21pdHRlZEFNUERVQ291bnQudS5Mb3dQYXJ0ICs9IChUeEFnZ0NudDEuZmllbGQuQWdnU2l6ZTNDb3VudCAvIDMpOworCQlwQWQtPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkQU1QRFVDb3VudC51Lkxvd1BhcnQgKz0gKFR4QWdnQ250MS5maWVsZC5BZ2dTaXplNENvdW50IC8gNCk7CisKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5UcmFuc21pdHRlZEFNUERVQ291bnQudS5Mb3dQYXJ0ICs9IChUeEFnZ0NudDIuZmllbGQuQWdnU2l6ZTVDb3VudCAvIDUpOworCQlwQWQtPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkQU1QRFVDb3VudC51Lkxvd1BhcnQgKz0gKFR4QWdnQ250Mi5maWVsZC5BZ2dTaXplNkNvdW50IC8gNik7CisKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5UcmFuc21pdHRlZEFNUERVQ291bnQudS5Mb3dQYXJ0ICs9IChUeEFnZ0NudDMuZmllbGQuQWdnU2l6ZTdDb3VudCAvIDcpOworCQlwQWQtPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkQU1QRFVDb3VudC51Lkxvd1BhcnQgKz0gKFR4QWdnQ250My5maWVsZC5BZ2dTaXplOENvdW50IC8gOCk7CisKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5UcmFuc21pdHRlZEFNUERVQ291bnQudS5Mb3dQYXJ0ICs9IChUeEFnZ0NudDQuZmllbGQuQWdnU2l6ZTlDb3VudCAvIDkpOworCQlwQWQtPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkQU1QRFVDb3VudC51Lkxvd1BhcnQgKz0gKFR4QWdnQ250NC5maWVsZC5BZ2dTaXplMTBDb3VudCAvIDEwKTsKKworCQlwQWQtPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkQU1QRFVDb3VudC51Lkxvd1BhcnQgKz0gKFR4QWdnQ250NS5maWVsZC5BZ2dTaXplMTFDb3VudCAvIDExKTsKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5UcmFuc21pdHRlZEFNUERVQ291bnQudS5Mb3dQYXJ0ICs9IChUeEFnZ0NudDUuZmllbGQuQWdnU2l6ZTEyQ291bnQgLyAxMik7CisKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5UcmFuc21pdHRlZEFNUERVQ291bnQudS5Mb3dQYXJ0ICs9IChUeEFnZ0NudDYuZmllbGQuQWdnU2l6ZTEzQ291bnQgLyAxMyk7CisJCXBBZC0+UmFsaW5rQ291bnRlcnMuVHJhbnNtaXR0ZWRBTVBEVUNvdW50LnUuTG93UGFydCArPSAoVHhBZ2dDbnQ2LmZpZWxkLkFnZ1NpemUxNENvdW50IC8gMTQpOworCisJCXBBZC0+UmFsaW5rQ291bnRlcnMuVHJhbnNtaXR0ZWRBTVBEVUNvdW50LnUuTG93UGFydCArPSAoVHhBZ2dDbnQ3LmZpZWxkLkFnZ1NpemUxNUNvdW50IC8gMTUpOworCQlwQWQtPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkQU1QRFVDb3VudC51Lkxvd1BhcnQgKz0gKFR4QWdnQ250Ny5maWVsZC5BZ2dTaXplMTZDb3VudCAvIDE2KTsKKwl9CisKKyNpZmRlZiBEQkdfRElBR05PU0UKKwl7CisJCVJ0bXBEaWFnU3RydWN0CSpwRGlhZzsKKwkJQ09VTlRFUl9SQUxJTksJKnBSYWxpbmtDb3VudGVyczsKKwkJVUNIQVIJCQlBcnJheUN1cklkeCwgaTsKKworCQlwRGlhZyA9ICZwQWQtPkRpYWdTdHJ1Y3Q7CisJCXBSYWxpbmtDb3VudGVycyA9ICZwQWQtPlJhbGlua0NvdW50ZXJzOworCQlBcnJheUN1cklkeCA9IHBEaWFnLT5BcnJheUN1cklkeDsKKworCQlpZiAocERpYWctPmluaXRlZCA9PSAwKQorCQl7CisJCQlOZGlzWmVyb01lbW9yeShwRGlhZywgc2l6ZW9mKHN0cnVjdCBfUnRtcERpYWdTdHJjdXRfKSk7CisJCQlwRGlhZy0+QXJyYXlTdGFydElkeCA9IHBEaWFnLT5BcnJheUN1cklkeCA9IDA7CisJCQlwRGlhZy0+aW5pdGVkID0gMTsKKwkJfQorCQllbHNlCisJCXsKKwkJCS8vIFR4CisJCQlwRGlhZy0+VHhGYWlsQ250W0FycmF5Q3VySWR4XSA9IFR4U3RhQ250MC5maWVsZC5UeEZhaWxDb3VudDsKKwkJCXBEaWFnLT5UeEFnZ0NudFtBcnJheUN1cklkeF0gPSBUeEFnZ0NudC5maWVsZC5BZ2dUeENvdW50OworCQkJcERpYWctPlR4Tm9uQWdnQ250W0FycmF5Q3VySWR4XSA9IFR4QWdnQ250LmZpZWxkLk5vbkFnZ1R4Q291bnQ7CisJCQlwRGlhZy0+VHhBTVBEVUNudFtBcnJheUN1cklkeF1bMF0gPSBUeEFnZ0NudDAuZmllbGQuQWdnU2l6ZTFDb3VudDsKKwkJCXBEaWFnLT5UeEFNUERVQ250W0FycmF5Q3VySWR4XVsxXSA9IFR4QWdnQ250MC5maWVsZC5BZ2dTaXplMkNvdW50OworCQkJcERpYWctPlR4QU1QRFVDbnRbQXJyYXlDdXJJZHhdWzJdID0gVHhBZ2dDbnQxLmZpZWxkLkFnZ1NpemUzQ291bnQ7CisJCQlwRGlhZy0+VHhBTVBEVUNudFtBcnJheUN1cklkeF1bM10gPSBUeEFnZ0NudDEuZmllbGQuQWdnU2l6ZTRDb3VudDsKKwkJCXBEaWFnLT5UeEFNUERVQ250W0FycmF5Q3VySWR4XVs0XSA9IFR4QWdnQ250Mi5maWVsZC5BZ2dTaXplNUNvdW50OworCQkJcERpYWctPlR4QU1QRFVDbnRbQXJyYXlDdXJJZHhdWzVdID0gVHhBZ2dDbnQyLmZpZWxkLkFnZ1NpemU2Q291bnQ7CisJCQlwRGlhZy0+VHhBTVBEVUNudFtBcnJheUN1cklkeF1bNl0gPSBUeEFnZ0NudDMuZmllbGQuQWdnU2l6ZTdDb3VudDsKKwkJCXBEaWFnLT5UeEFNUERVQ250W0FycmF5Q3VySWR4XVs3XSA9IFR4QWdnQ250My5maWVsZC5BZ2dTaXplOENvdW50OworCQkJcERpYWctPlR4QU1QRFVDbnRbQXJyYXlDdXJJZHhdWzhdID0gVHhBZ2dDbnQ0LmZpZWxkLkFnZ1NpemU5Q291bnQ7CisJCQlwRGlhZy0+VHhBTVBEVUNudFtBcnJheUN1cklkeF1bOV0gPSBUeEFnZ0NudDQuZmllbGQuQWdnU2l6ZTEwQ291bnQ7CisJCQlwRGlhZy0+VHhBTVBEVUNudFtBcnJheUN1cklkeF1bMTBdID0gVHhBZ2dDbnQ1LmZpZWxkLkFnZ1NpemUxMUNvdW50OworCQkJcERpYWctPlR4QU1QRFVDbnRbQXJyYXlDdXJJZHhdWzExXSA9IFR4QWdnQ250NS5maWVsZC5BZ2dTaXplMTJDb3VudDsKKwkJCXBEaWFnLT5UeEFNUERVQ250W0FycmF5Q3VySWR4XVsxMl0gPSBUeEFnZ0NudDYuZmllbGQuQWdnU2l6ZTEzQ291bnQ7CisJCQlwRGlhZy0+VHhBTVBEVUNudFtBcnJheUN1cklkeF1bMTNdID0gVHhBZ2dDbnQ2LmZpZWxkLkFnZ1NpemUxNENvdW50OworCQkJcERpYWctPlR4QU1QRFVDbnRbQXJyYXlDdXJJZHhdWzE0XSA9IFR4QWdnQ250Ny5maWVsZC5BZ2dTaXplMTVDb3VudDsKKwkJCXBEaWFnLT5UeEFNUERVQ250W0FycmF5Q3VySWR4XVsxNV0gPSBUeEFnZ0NudDcuZmllbGQuQWdnU2l6ZTE2Q291bnQ7CisKKwkJCXBEaWFnLT5SeENyY0VyckNudFtBcnJheUN1cklkeF0gPSBSeFN0YUNudDAuZmllbGQuQ3JjRXJyOworCisJCQlJTkNfUklOR19JTkRFWChwRGlhZy0+QXJyYXlDdXJJZHgsICBESUFHTk9TRV9USU1FKTsKKwkJCUFycmF5Q3VySWR4ID0gcERpYWctPkFycmF5Q3VySWR4OworCQkJZm9yIChpID0wOyBpIDwgOTsgaSsrKQorCQkJeworCQkJCXBEaWFnLT5UeERlc2NDbnRbQXJyYXlDdXJJZHhdW2ldPSAwOworCQkJCXBEaWFnLT5UeFNXUXVlQ250W0FycmF5Q3VySWR4XVtpXSA9MDsKKwkJCQlwRGlhZy0+VHhNY3NDbnRbQXJyYXlDdXJJZHhdW2ldID0gMDsKKwkJCQlwRGlhZy0+UnhNY3NDbnRbQXJyYXlDdXJJZHhdW2ldID0gMDsKKwkJCX0KKwkJCXBEaWFnLT5UeERhdGFDbnRbQXJyYXlDdXJJZHhdID0gMDsKKwkJCXBEaWFnLT5UeEZhaWxDbnRbQXJyYXlDdXJJZHhdID0gMDsKKwkJCXBEaWFnLT5SeERhdGFDbnRbQXJyYXlDdXJJZHhdID0gMDsKKwkJCXBEaWFnLT5SeENyY0VyckNudFtBcnJheUN1cklkeF0gID0gMDsKKy8vCQkJZm9yIChpID0gOTsgaSA8IDE2OyBpKyspCisJCQlmb3IgKGkgPSA5OyBpIDwgMjQ7IGkrKykgLy8gMyozCisJCQl7CisJCQkJcERpYWctPlR4RGVzY0NudFtBcnJheUN1cklkeF1baV0gPSAwOworCQkJCXBEaWFnLT5UeE1jc0NudFtBcnJheUN1cklkeF1baV0gPSAwOworCQkJCXBEaWFnLT5SeE1jc0NudFtBcnJheUN1cklkeF1baV0gPSAwOworfQorCisJCQlpZiAocERpYWctPkFycmF5Q3VySWR4ID09IHBEaWFnLT5BcnJheVN0YXJ0SWR4KQorCQkJCUlOQ19SSU5HX0lOREVYKHBEaWFnLT5BcnJheVN0YXJ0SWR4LCAgRElBR05PU0VfVElNRSk7CisJCX0KKworCX0KKyNlbmRpZiAvLyBEQkdfRElBR05PU0UgLy8KKworCit9CisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVJlc2V0IE5JQyBmcm9tIGVycm9yCisKKwlBcmd1bWVudHM6CisJCUFkYXB0ZXIJCQkJCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCUlSUUwgPSBQQVNTSVZFX0xFVkVMCisKKwlOb3RlOgorCQlSZXNldCBOSUMgZnJvbSBlcnJvciBzdGF0ZQorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlOSUNSZXNldEZyb21FcnJvcigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCkKK3sKKwkvLyBSZXNldCBCQlAgKGFjY29yZGluZyB0byBhbGV4LCByZXNldCBBU0lDIHdpbGwgZm9yY2UgcmVzZXQgQkJQCisJLy8gVGhlcmVmb3JlLCBza2lwIHRoZSByZXNldCBCQlAKKwkvLyBSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfQ1NSMSwgMHgyKTsKKworCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgMHgxKTsKKwkvLyBSZW1vdmUgQVNJQyBmcm9tIHJlc2V0IHN0YXRlCisJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCAweDApOworCisJTklDSW5pdGlhbGl6ZUFkYXB0ZXIocEFkLCBGQUxTRSk7CisJTklDSW5pdEFzaWNGcm9tRUVQUk9NKHBBZCk7CisKKwkvLyBTd2l0Y2ggdG8gY3VycmVudCBjaGFubmVsLCBzaW5jZSBkdXJpbmcgcmVzZXQgcHJvY2VzcywgdGhlIGNvbm5lY3Rpb24gc2hvdWxkIHJlbWFpbnMgb24uCisJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCwgRkFMU0UpOworCUFzaWNMb2NrQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCWVyYXNlIDgwNTEgZmlybXdhcmUgaW1hZ2UgaW4gTUFDIEFTSUMKKworCUFyZ3VtZW50czoKKwkJQWRhcHRlcgkJCQkJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKworCUlSUUwgPSBQQVNTSVZFX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIE5JQ0VyYXNlRmlybXdhcmUoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJVUxPTkcgaTsKKworCWZvcihpPTA7IGk8TUFYX0ZJUk1XQVJFX0lNQUdFX1NJWkU7IGkrPTQpCisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIEZJUk1XQVJFX0lNQUdFX0JBU0UgKyBpLCAwKTsKKworfS8qIEVuZCBvZiBOSUNFcmFzZUZpcm13YXJlICovCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlMb2FkIDgwNTEgZmlybXdhcmUgUlQyNTYxLkJJTiBmaWxlIGludG8gTUFDIEFTSUMKKworCUFyZ3VtZW50czoKKwkJQWRhcHRlcgkJCQkJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKworCVJldHVybiBWYWx1ZToKKwkJTkRJU19TVEFUVVNfU1VDQ0VTUyAgICAgICAgIGZpcm13YXJlIGltYWdlIGxvYWQgb2sKKwkJTkRJU19TVEFUVVNfRkFJTFVSRSAgICAgICAgIGltYWdlIG5vdCBmb3VuZAorCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK05ESVNfU1RBVFVTIE5JQ0xvYWRGaXJtd2FyZSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKyNpZmRlZiBCSU5fSU5fRklMRQorI2RlZmluZSBOSUNMRl9ERUZBVUxUX1VTRSgpCVwKKwlmbGdfZGVmYXVsdF9maXJtX3VzZSA9IFRSVUU7IFwKKwlwcmludGsoIiVzIC0gVXNlIGRlZmF1bHQgZmlybXdhcmUhXG4iLCBfX2Z1bmNfXyk7CisKKwlORElTX1NUQVRVUwkJU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKwlQVUNIQVIJCQlzcmM7CisJc3RydWN0IGZpbGUJCSpzcmNmOworCUlOVCAJCQlyZXR2YWwsIG9yZ2ZzdWlkLCBvcmdmc2dpZCwgaTsKKyAgIAltbV9zZWdtZW50X3QJb3JnZnM7CisJUFVDSEFSCQkJcEZpcm13YXJlSW1hZ2U7CisJVUlOVAkJCUZpbGVMZW5ndGggPSAwOworCVVJTlQzMgkJCU1hY1JlZzsKKwlVTE9ORwkJCUluZGV4OworCVVMT05HCQkJZmlybTsKKwlCT09MRUFOCQkJZmxnX2RlZmF1bHRfZmlybV91c2UgPSBGQUxTRTsKKworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PiAlc1xuIiwgX19mdW5jX18pKTsKKworCS8qIGluaXQgKi8KKwlwRmlybXdhcmVJbWFnZSA9IE5VTEw7CisJc3JjID0gUlRNUF9GSVJNV0FSRV9GSUxFX05BTUU7CisKKwkvKiBzYXZlIHVpZCBhbmQgZ2lkIHVzZWQgZm9yIGZpbGVzeXN0ZW0gYWNjZXNzLgorCSAgIHNldCB1c2VyIGFuZCBncm91cCB0byAwIChyb290KSAqLworCW9yZ2ZzdWlkID0gY3VycmVudC0+ZnN1aWQ7CisJb3JnZnNnaWQgPSBjdXJyZW50LT5mc2dpZDsKKwljdXJyZW50LT5mc3VpZCA9IGN1cnJlbnQtPmZzZ2lkID0gMDsKKyAgICBvcmdmcyA9IGdldF9mcygpOworICAgIHNldF9mcyhLRVJORUxfRFMpOworCisJcEFkLT5GaXJtd2FyZVZlcnNpb24gPSAoRklSTVdBUkVfTUFKT1JfVkVSU0lPTiA8PCA4KSArIFwKKwkJCQkJCSAgIEZJUk1XQVJFX01JTk9SX1ZFUlNJT047CisKKworCS8qIGFsbG9jYXRlIGZpcm13YXJlIGJ1ZmZlciAqLworICAgIHBGaXJtd2FyZUltYWdlID0ga21hbGxvYyhNQVhfRklSTVdBUkVfSU1BR0VfU0laRSwgTUVNX0FMTE9DX0ZMQUcpOworICAgIGlmIChwRmlybXdhcmVJbWFnZSA9PSBOVUxMKQorCXsKKwkJLyogYWxsb2NhdGUgZmFpbCwgdXNlIGRlZmF1bHQgZmlybXdhcmUgYXJyYXkgaW4gZmlybXdhcmUuaCAqLworCQlwcmludGsoIiVzIC0gQWxsb2NhdGUgbWVtb3J5IGZhaWwhXG4iLCBfX2Z1bmNfXyk7CisJCU5JQ0xGX0RFRkFVTFRfVVNFKCk7CisgICAgfQorCWVsc2UKKwl7CisJCS8qIGFsbG9jYXRlIG9rISB6ZXJvIHRoZSBmaXJtd2FyZSBidWZmZXIgKi8KKwkJbWVtc2V0KHBGaXJtd2FyZUltYWdlLCAweDAwLCBNQVhfRklSTVdBUkVfSU1BR0VfU0laRSk7CisJfSAvKiBFbmQgb2YgaWYgKi8KKworCisJLyogaWYgb2ssIHJlYWQgZmlybXdhcmUgZmlsZSBmcm9tICouYmluIGZpbGUgKi8KKwlpZiAoZmxnX2RlZmF1bHRfZmlybV91c2UgPT0gRkFMU0UpCisJeworCQlkbworCQl7CisJCQkvKiBvcGVuIHRoZSBiaW4gZmlsZSAqLworCQkJc3JjZiA9IGZpbHBfb3BlbihzcmMsIE9fUkRPTkxZLCAwKTsKKworCQkJaWYgKElTX0VSUihzcmNmKSkKKwkJCXsKKwkJCQlwcmludGsoIiVzIC0gRXJyb3IgJWxkIG9wZW5pbmcgJXNcbiIsCisJCQkJCSAgIF9fZnVuY19fLCAtUFRSX0VSUihzcmNmKSwgc3JjKTsKKwkJCQlOSUNMRl9ERUZBVUxUX1VTRSgpOworCQkJCWJyZWFrOworCQkJfSAvKiBFbmQgb2YgaWYgKi8KKworCQkJLyogdGhlIG9iamVjdCBtdXN0IGhhdmUgYSByZWFkIG1ldGhvZCAqLworCQkJaWYgKChzcmNmLT5mX29wID09IE5VTEwpIHx8IChzcmNmLT5mX29wLT5yZWFkID09IE5VTEwpKQorCQkJeworCQkJCXByaW50aygiJXMgLSAlcyBkb2VzIG5vdCBoYXZlIGEgd3JpdGUgbWV0aG9kXG4iLCBfX2Z1bmNfXywgc3JjKTsKKwkJCQlOSUNMRl9ERUZBVUxUX1VTRSgpOworCQkJCWJyZWFrOworCQkJfSAvKiBFbmQgb2YgaWYgKi8KKworCQkJLyogcmVhZCB0aGUgZmlybXdhcmUgZnJvbSB0aGUgZmlsZSAqLmJpbiAqLworCQkJRmlsZUxlbmd0aCA9IHNyY2YtPmZfb3AtPnJlYWQoc3JjZiwKKwkJCQkJCQkJCQkgIHBGaXJtd2FyZUltYWdlLAorCQkJCQkJCQkJCSAgTUFYX0ZJUk1XQVJFX0lNQUdFX1NJWkUsCisJCQkJCQkJCQkJICAmc3JjZi0+Zl9wb3MpOworCisJCQlpZiAoRmlsZUxlbmd0aCAhPSBNQVhfRklSTVdBUkVfSU1BR0VfU0laRSkKKwkJCXsKKwkJCQlwcmludGsoIiVzOiBlcnJvciBmaWxlIGxlbmd0aCAoPSVkKSBpbiBSVDI4NjBBUC5CSU5cbiIsCisJCQkJCSAgIF9fZnVuY19fLCBGaWxlTGVuZ3RoKTsKKwkJCQlOSUNMRl9ERUZBVUxUX1VTRSgpOworCQkJCWJyZWFrOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCVBVQ0hBUiBwdHIgPSBwRmlybXdhcmVJbWFnZTsKKwkJCQlVU0hPUlQgY3JjID0gMHhmZmZmOworCisKKwkJCQkvKiBjYWxjdWxhdGUgZmlybXdhcmUgQ1JDICovCisJCQkJZm9yKGk9MDsgaTwoTUFYX0ZJUk1XQVJFX0lNQUdFX1NJWkUtMik7IGkrKywgcHRyKyspCisJCQkJCWNyYyA9IEJ5dGVDUkMxNihCaXRSZXZlcnNlKCpwdHIpLCBjcmMpOworCQkJCS8qIEVuZCBvZiBmb3IgKi8KKworCQkJCWlmICgocEZpcm13YXJlSW1hZ2VbTUFYX0ZJUk1XQVJFX0lNQUdFX1NJWkUtMl0gIT0gXAorCQkJCQkJCQkoVUNIQVIpQml0UmV2ZXJzZSgoVUNIQVIpKGNyYz4+OCkpKSB8fAorCQkJCQkocEZpcm13YXJlSW1hZ2VbTUFYX0ZJUk1XQVJFX0lNQUdFX1NJWkUtMV0gIT0gXAorCQkJCQkJCQkoVUNIQVIpQml0UmV2ZXJzZSgoVUNIQVIpY3JjKSkpCisJCQkJeworCQkJCQkvKiBDUkMgZmFpbCAqLworCQkJCQlwcmludGsoIiVzOiBDUkMgPSAweCUwMnggMHglMDJ4ICIKKwkJCQkJCSAgICJlcnJvciwgc2hvdWxkIGJlIDB4JTAyeCAweCUwMnhcbiIsCisJCQkJCQkgICBfX2Z1bmNfXywKKwkJCQkJCSAgIHBGaXJtd2FyZUltYWdlW01BWF9GSVJNV0FSRV9JTUFHRV9TSVpFLTJdLAorCQkJCQkJICAgcEZpcm13YXJlSW1hZ2VbTUFYX0ZJUk1XQVJFX0lNQUdFX1NJWkUtMV0sCisJCQkJCQkgICAoVUNIQVIpKGNyYz4+OCksIChVQ0hBUikoY3JjKSk7CisJCQkJCU5JQ0xGX0RFRkFVTFRfVVNFKCk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQkvKiBmaXJtd2FyZSBpcyBvayAqLworCQkJCQlwQWQtPkZpcm13YXJlVmVyc2lvbiA9IFwKKwkJCQkJCShwRmlybXdhcmVJbWFnZVtNQVhfRklSTVdBUkVfSU1BR0VfU0laRS00XSA8PCA4KSArCisJCQkJCQlwRmlybXdhcmVJbWFnZVtNQVhfRklSTVdBUkVfSU1BR0VfU0laRS0zXTsKKworCQkJCQkvKiBjaGVjayBpZiBmaXJtd2FyZSB2ZXJzaW9uIG9mIHRoZSBmaWxlIGlzIHRvbyBvbGQgKi8KKwkJCQkJaWYgKChwQWQtPkZpcm13YXJlVmVyc2lvbikgPCBcCisJCQkJCQkJCQkJCSgoRklSTVdBUkVfTUFKT1JfVkVSU0lPTiA8PCA4KSArCisJCQkJCQkJCQkgIAkgCSBGSVJNV0FSRV9NSU5PUl9WRVJTSU9OKSkKKwkJCQkJeworCQkJCQkJcHJpbnRrKCIlczogZmlybXdhcmUgdmVyc2lvbiB0b28gb2xkIVxuIiwgX19mdW5jX18pOworCQkJCQkJTklDTEZfREVGQVVMVF9VU0UoKTsKKwkJCQkJCWJyZWFrOworCQkJCQl9IC8qIEVuZCBvZiBpZiAqLworCQkJCX0gLyogRW5kIG9mIGlmICovCisKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkJCSAoIk5JQ0xvYWRGaXJtd2FyZTogQ1JDIG9rLCB2ZXI9JWQuJWRcbiIsCisJCQkJCQkgIHBGaXJtd2FyZUltYWdlW01BWF9GSVJNV0FSRV9JTUFHRV9TSVpFLTRdLAorCQkJCQkJICBwRmlybXdhcmVJbWFnZVtNQVhfRklSTVdBUkVfSU1BR0VfU0laRS0zXSkpOworCQkJfSAvKiBFbmQgb2YgaWYgKEZpbGVMZW5ndGggPT0gTUFYX0ZJUk1XQVJFX0lNQUdFX1NJWkUpICovCisJCQlicmVhazsKKwkJfSB3aGlsZShUUlVFKTsKKworCQkvKiBjbG9zZSBmaXJtd2FyZSBmaWxlICovCisJCWlmIChJU19FUlIoc3JjZikpCisJCQk7CisJCWVsc2UKKwkJeworCQkJcmV0dmFsID0gZmlscF9jbG9zZShzcmNmLCBOVUxMKTsKKwkJCWlmIChyZXR2YWwpCisJCQl7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkJCQkgKCItLT4gRXJyb3IgJWQgY2xvc2luZyAlc1xuIiwgLXJldHZhbCwgc3JjKSk7CisJCQl9IC8qIEVuZCBvZiBpZiAqLworCQl9IC8qIEVuZCBvZiBpZiAqLworCX0gLyogRW5kIG9mIGlmICovCisKKworCS8qIHdyaXRlIGZpcm13YXJlIHRvIEFTSUMgKi8KKwlpZiAoZmxnX2RlZmF1bHRfZmlybV91c2UgPT0gVFJVRSkKKwl7CisJCS8qIHVzZSBkZWZhdWx0IGZpbWV3YXJlLCBmcmVlIGFsbG9jYXRlZCBidWZmZXIgKi8KKwkJaWYgKHBGaXJtd2FyZUltYWdlICE9IE5VTEwpCisJCQlrZnJlZShwRmlybXdhcmVJbWFnZSk7CisJCS8qIEVuZCBvZiBpZiAqLworCisJCS8qIHVzZSBkZWZhdWx0ICouYmluIGFycmF5ICovCisJCXBGaXJtd2FyZUltYWdlID0gRmlybXdhcmVJbWFnZTsKKwkJRmlsZUxlbmd0aCA9IHNpemVvZihGaXJtd2FyZUltYWdlKTsKKwl9IC8qIEVuZCBvZiBpZiAqLworCisJLyogZW5hYmxlIEhvc3QgcHJvZ3JhbSByYW0gd3JpdGUgc2VsZWN0aW9uICovCisJUlRNUF9JT19XUklURTMyKHBBZCwgUEJGX1NZU19DVFJMLCAweDEwMDAwKTsKKworCWZvcihpPTA7IGk8RmlsZUxlbmd0aDsgaSs9NCkKKwl7CisJCWZpcm0gPSBwRmlybXdhcmVJbWFnZVtpXSArCisJCQkgICAocEZpcm13YXJlSW1hZ2VbaSszXSA8PCAyNCkgKworCQkJICAgKHBGaXJtd2FyZUltYWdlW2krMl0gPDwgMTYpICsKKwkJCSAgIChwRmlybXdhcmVJbWFnZVtpKzFdIDw8IDgpOworCisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIEZJUk1XQVJFX0lNQUdFX0JBU0UgKyBpLCBmaXJtKTsKKwl9IC8qIEVuZCBvZiBmb3IgKi8KKworCVJUTVBfSU9fV1JJVEUzMihwQWQsIFBCRl9TWVNfQ1RSTCwgMHgwMDAwMCk7CisJUlRNUF9JT19XUklURTMyKHBBZCwgUEJGX1NZU19DVFJMLCAweDAwMDAxKTsKKworCS8qIGluaXRpYWxpemUgQkJQIFIvVyBhY2Nlc3MgYWdlbnQgKi8KKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBIMk1fQkJQX0FHRU5ULCAwKTsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBIMk1fTUFJTEJPWF9DU1IsIDApOworCisJaWYgKGZsZ19kZWZhdWx0X2Zpcm1fdXNlID09IEZBTFNFKQorCXsKKwkJLyogdXNlIGZpbGUgZmlybXdhcmUsIGZyZWUgYWxsb2NhdGVkIGJ1ZmZlciAqLworCQlpZiAocEZpcm13YXJlSW1hZ2UgIT0gTlVMTCkKKwkJCWtmcmVlKHBGaXJtd2FyZUltYWdlKTsKKwkJLyogRW5kIG9mIGlmICovCisJfSAvKiBFbmQgb2YgaWYgKi8KKworCXNldF9mcyhvcmdmcyk7CisJY3VycmVudC0+ZnN1aWQgPSBvcmdmc3VpZDsKKwljdXJyZW50LT5mc2dpZCA9IG9yZ2ZzZ2lkOworI2Vsc2UKKworCU5ESVNfU1RBVFVTCQlTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworCVBVQ0hBUgkJCXBGaXJtd2FyZUltYWdlOworCVVMT05HCQkJRmlsZUxlbmd0aCwgSW5kZXg7CisJLy9VTE9ORwkJCWZpcm07CisJVUlOVDMyCQkJTWFjUmVnID0gMDsKKyNpZmRlZiBSVDI4NzAKKwlVSU5UMzIJCQlWZXJzaW9uID0gKHBBZC0+TUFDVmVyc2lvbiA+PiAxNik7CisjZW5kaWYgLy8gUlQyODcwIC8vCisKKwlwRmlybXdhcmVJbWFnZSA9IEZpcm13YXJlSW1hZ2U7CisJRmlsZUxlbmd0aCA9IHNpemVvZihGaXJtd2FyZUltYWdlKTsKKyNpZmRlZiBSVDI4NzAKKwkvLyBOZXcgOGsgYnl0ZSBmaXJtd2FyZSBzaXplIGZvciBSVDMwNzEvUlQzMDcyCisJLy9wcmludGsoIlVzYiBDaGlwXG4iKTsKKwlpZiAoRklSTVdBUkVJTUFHRV9MRU5HVEggPT0gRklSTVdBUkVJTUFHRV9NQVhfTEVOR1RIKQorCS8vVGhlIGZpcm13YXJlIGltYWdlIGNvbnNpc3RzIG9mIHR3byBwYXJ0cy4gT25lIGlzIHRoZSBvcmlnaWFubCBhbmQgdGhlIG90aGVyIGlzIHRoZSBuZXcuCisJLy9Vc2UgU2Vjb25kIFBhcnQKKwl7CisJCWlmICgoVmVyc2lvbiAhPSAweDI4NjApICYmIChWZXJzaW9uICE9IDB4Mjg3MikgJiYgKFZlcnNpb24gIT0gMHgzMDcwKSkKKwkJewkvLyBVc2UgRmlybXdhcmUgVjIuCisJCQkvL3ByaW50aygiS0g6VXNlIE5ldyBWZXJzaW9uLHBhcnQyXG4iKTsKKwkJCXBGaXJtd2FyZUltYWdlID0gKFBVQ0hBUikmRmlybXdhcmVJbWFnZVtGSVJNV0FSRUlNQUdFVjFfTEVOR1RIXTsKKwkJCUZpbGVMZW5ndGggPSBGSVJNV0FSRUlNQUdFVjJfTEVOR1RIOworCQl9CisJCWVsc2UKKwkJeworCQkJLy9wcmludGsoIktIOlVzZSBOZXcgVmVyc2lvbixwYXJ0MVxuIik7CisJCQlwRmlybXdhcmVJbWFnZSA9IEZpcm13YXJlSW1hZ2U7CisJCQlGaWxlTGVuZ3RoID0gRklSTVdBUkVJTUFHRVYxX0xFTkdUSDsKKwkJfQorCX0KKwllbHNlCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJLSDogYmluIGZpbGUgc2hvdWxkIGJlIDhLQi5cbiIpKTsKKwkJU3RhdHVzID0gTkRJU19TVEFUVVNfRkFJTFVSRTsKKwl9CisKKyNlbmRpZiAvLyBSVDI4NzAgLy8KKworI2lmIDAKKwkvKiBlbmFibGUgSG9zdCBwcm9ncmFtIHJhbSB3cml0ZSBzZWxlY3Rpb24gKi8KKwlSVDI4WFhfRklSTVVEX0lOSVQocEFkKTsKKworCWZvcihpPTA7IGk8RmlsZUxlbmd0aDsgaSs9NCkKKwl7CisJCWZpcm0gPSBwRmlybXdhcmVJbWFnZVtpXSArCisJCQkgICAocEZpcm13YXJlSW1hZ2VbaSszXSA8PCAyNCkgKworCQkJICAgKHBGaXJtd2FyZUltYWdlW2krMl0gPDwgMTYpICsKKwkJCSAgIChwRmlybXdhcmVJbWFnZVtpKzFdIDw8IDgpOworCisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIEZJUk1XQVJFX0lNQUdFX0JBU0UgKyBpLCBmaXJtKTsKKwl9IC8qIEVuZCBvZiBmb3IgKi8KKworCVJUMjhYWF9GSVJNVURfRU5EKHBBZCk7CisjZWxzZQorCVJUMjhYWF9XUklURV9GSVJNV0FSRShwQWQsIHBGaXJtd2FyZUltYWdlLCBGaWxlTGVuZ3RoKTsKKyNlbmRpZgorCisjZW5kaWYKKworCS8qIGNoZWNrIGlmIE1DVSBpcyByZWFkeSAqLworCUluZGV4ID0gMDsKKwlkbworCXsKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBQQkZfU1lTX0NUUkwsICZNYWNSZWcpOworCisJCWlmIChNYWNSZWcgJiAweDgwKQorCQkJYnJlYWs7CisKKwkJUlRNUHVzZWNEZWxheSgxMDAwKTsKKwl9IHdoaWxlIChJbmRleCsrIDwgMTAwMCk7CisKKyAgICBpZiAoSW5kZXggPj0gMTAwMCkKKwl7CisJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX0ZBSUxVUkU7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIk5JQ0xvYWRGaXJtd2FyZTogTUNVIGlzIG5vdCByZWFkeVxuXG5cbiIpKTsKKwl9IC8qIEVuZCBvZiBpZiAqLworCisjaWYgMAorICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiPD09PSAlcyAoc3JjPSVzLCBzdGF0dXM9JWQpXG4iLCBfX2Z1bmNfXywgc3JjLCBTdGF0dXMpKTsKKyNlbHNlCisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCI8PT09ICVzIChzdGF0dXM9JWQpXG4iLCBfX2Z1bmNfXywgU3RhdHVzKSk7CisjZW5kaWYKKyAgICByZXR1cm4gU3RhdHVzOworfSAvKiBFbmQgb2YgTklDTG9hZEZpcm13YXJlICovCisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCUxvYWQgVHggcmF0ZSBzd2l0Y2hpbmcgcGFyYW1ldGVycworCisJQXJndW1lbnRzOgorCQlBZGFwdGVyCQkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCisJUmV0dXJuIFZhbHVlOgorCQlORElTX1NUQVRVU19TVUNDRVNTICAgICAgICAgZmlybXdhcmUgaW1hZ2UgbG9hZCBvaworCQlORElTX1NUQVRVU19GQUlMVVJFICAgICAgICAgaW1hZ2Ugbm90IGZvdW5kCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCisJUmF0ZSBUYWJsZSBGb3JtYXQ6CisJCTEuIChCMDogVmFsaWQgSXRlbSBudW1iZXIpIChCMTpJbml0aWFsIGl0ZW0gZnJvbSB6ZXJvKQorCQkyLiBJdGVtIE51bWJlcihEZWMpICAgICAgTW9kZShIZXgpICAgICBDdXJyZW50IE1DUyhEZWMpICAgIFRyYWluVXAoRGVjKSAgICBUcmFpbkRvd24oRGVjKQorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworTkRJU19TVEFUVVMgTklDTG9hZFJhdGVTd2l0Y2hpbmdQYXJhbXMoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisjaWYgMAorCU5ESVNfU1RBVFVTIFN0YXR1czsKKworCU5ESVNfSEFORExFIEZpbGVIYW5kbGU7CisJVUlOVCBGaWxlTGVuZ3RoID0gMCwgaSwgajsKKwlQVUNIQVIgcEZpcm13YXJlSW1hZ2U7CisJTkRJU19TVFJJTkcgRmlsZU5hbWU7CisJTkRJU19QSFlTSUNBTF9BRERSRVNTIEhpZ2hlc3RBY2NlcHRhYmxlTWF4ID0gTkRJU19QSFlTSUNBTF9BRERSRVNTX0NPTlNUKC0xLCAtMSk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIj09PT4gTklDTG9hZFJhdGVTd2l0Y2hpbmdQYXJhbXMgXG4iKSk7CisJcEFkLT5Db21tb25DZmcuVHhSYXRlVGFibGVTaXplID0gMDsKKworCWlmICgocEFkLT5EZXZpY2VJRCA9PSBOSUMyODYwX1BDSV9ERVZJQ0VfSUQpIHx8IChwQWQtPkRldmljZUlEID09IE5JQzI4NjBfUENJZV9ERVZJQ0VfSUQpKQorCXsKKwkJTmRpc0luaXRpYWxpemVTdHJpbmcoJkZpbGVOYW1lLCJyYXRlLmJpbiIpOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJOSUNMb2FkUmF0ZVN3aXRjaGluZ1BhcmFtczogbG9hZCBmaWxlIC0gcmF0ZS5iaW4gZm9yIHR4IHJhdGUgc3dpdGNoIFxuIikpOworCX0KKwllbHNlCisJeworCQlEQkdQUklOVF9FUlIoKCJOSUNMb2FkUmF0ZVN3aXRjaGluZ1BhcmFtczogd3JvbmcgRGV2aWNlSUQgPSAweCUwNHgsIGNhbid0IGZpbmQgVHggcmF0ZSBzd2l0Y2ggcGFyYW1ldGVycyBmaWxlXG4iLCBwQWQtPkRldmljZUlEKSk7CisJCXJldHVybiBORElTX1NUQVRVU19TVUNDRVNTOworCX0KKwlOZGlzT3BlbkZpbGUoJlN0YXR1cywgJkZpbGVIYW5kbGUsICZGaWxlTGVuZ3RoLCAmRmlsZU5hbWUsIEhpZ2hlc3RBY2NlcHRhYmxlTWF4KTsKKwlOZGlzRnJlZVN0cmluZyhGaWxlTmFtZSk7CisKKwlpZiAoU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJOSUNMb2FkUmF0ZVN3aXRjaGluZ1BhcmFtczogTmRpc09wZW5GaWxlKCkgZmFpbGVkLCB1c2VkIFJhdGVTd2l0Y2hUYWJsZSBpbnN0ZWFkXG4iKSk7CisJCXJldHVybiBORElTX1NUQVRVU19TVUNDRVNTOworCX0KKworCWlmICgoRmlsZUxlbmd0aCA9PSAwKSB8fCAoRmlsZUxlbmd0aCA+IChNQVhfU1RFUF9PRl9UWF9SQVRFX1NXSVRDSCsxKSoxNikpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJOSUNMb2FkUmF0ZVN3aXRjaGluZ1BhcmFtczogZmlsZSBzaXplIGlzIG5vdCByZWFzb25hYmxlLCB1c2VkIFJhdGVTd2l0Y2hUYWJsZSBpbnN0ZWFkXG4iKSk7CisKKwkJTmRpc0Nsb3NlRmlsZShGaWxlSGFuZGxlKTsKKwkJcmV0dXJuIE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisJfQorCWVsc2UKKwl7CisJCS8vCisJCS8vIE5ESVNfU1RBVFVTX1NVQ0NFU1MgbWVhbnMKKwkJLy8gVGhlIGhhbmRsZSBhdCBGaWxlSGFuZGxlIGlzIHZhbGlkIGZvciBhIHN1YnNlcXVlbnQgY2FsbCB0byBOZGlzTWFwRmlsZS4KKwkJLy8KKwkJTmRpc01hcEZpbGUoJlN0YXR1cywgJnBGaXJtd2FyZUltYWdlLCBGaWxlSGFuZGxlKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTmRpc01hcEZpbGUgRmlsZUxlbmd0aD0lZFxuIiwgRmlsZUxlbmd0aCkpOworCX0KKworCWZvciAoaT0wLCBqPTA7IGk8RmlsZUxlbmd0aDsgaSsrKQorCXsKKwkJaWYgKChpJTE2KSA8PSA0KQkvLyB0cmltIHJlc2VydmVkIGZpZWxkCisJCXsKKwkJCWlmIChpJTE2ID09IDEpCS8vIGRlYWwgd2l0aCBERUMgYW5kIEhFWCwgb25seSByb3cwIGlzIEhleCwgb3RoZXJzIGFyZSBEZWMKKwkJCXsKKwkJCQlSYXRlU3dpdGNoVGFibGVbal0gPSAqKHBGaXJtd2FyZUltYWdlICsgaSk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJUmF0ZVN3aXRjaFRhYmxlW2pdID0gKCoocEZpcm13YXJlSW1hZ2UgKyBpKT4+NCkgKiAxMCArICgqKHBGaXJtd2FyZUltYWdlICsgaSkgJiAweDBGKTsKKwkJCX0KKworCQkJaisrOworCQl9CisJfQorCisJcEFkLT5Db21tb25DZmcuVHhSYXRlVGFibGVTaXplID0gUmF0ZVN3aXRjaFRhYmxlWzBdOwkJLy8gYmFja3VwIHRhYmxlIHNpemUKKworCWlmIChTdGF0dXMgPT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwl7CisJCU5kaXNVbm1hcEZpbGUoRmlsZUhhbmRsZSk7CisJCU5kaXNDbG9zZUZpbGUoRmlsZUhhbmRsZSk7CisJfQorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCI8PT09IE5JQ0xvYWRSYXRlU3dpdGNoaW5nUGFyYW1zKFZhbGlkIFR4UmF0ZVRhYmxlIGl0ZW0gbnVtYmVyPSVkKVxuIiwgcEFkLT5Db21tb25DZmcuVHhSYXRlVGFibGVTaXplKSk7CisjZW5kaWYKKwlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCWlmICBwU3JjMSBhbGwgemVybyB3aXRoIGxlbmd0aCBMZW5ndGgsIHJldHVybiAwLgorCQlJZiBub3QgYWxsIHplcm8sIHJldHVybiAxCisKKwlBcmd1bWVudHM6CisJCXBTcmMxCisKKwlSZXR1cm4gVmFsdWU6CisJCTE6CQkJbm90IGFsbCB6ZXJvCisJCTA6CQkJYWxsIHplcm8KKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1VMT05HCVJUTVBOb3RBbGxaZXJvKAorCUlOCVBWT0lECXBTcmMxLAorCUlOCVVMT05HCUxlbmd0aCkKK3sKKwlQVUNIQVIJcE1lbTE7CisJVUxPTkcJSW5kZXggPSAwOworCisJcE1lbTEgPSAoUFVDSEFSKSBwU3JjMTsKKworCWZvciAoSW5kZXggPSAwOyBJbmRleCA8IExlbmd0aDsgSW5kZXgrKykKKwl7CisJCWlmIChwTWVtMVtJbmRleF0gIT0gMHgwKQorCQl7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChJbmRleCA9PSBMZW5ndGgpCisJeworCQlyZXR1cm4gKDApOworCX0KKwllbHNlCisJeworCQlyZXR1cm4gKDEpOworCX0KK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCUNvbXBhcmUgdHdvIG1lbW9yeSBibG9jaworCisJQXJndW1lbnRzOgorCQlwU3JjMQkJUG9pbnRlciB0byBmaXJzdCBtZW1vcnkgYWRkcmVzcworCQlwU3JjMgkJUG9pbnRlciB0byBzZWNvbmQgbWVtb3J5IGFkZHJlc3MKKworCVJldHVybiBWYWx1ZToKKwkJMDoJCQltZW1vcnkgaXMgZXF1YWwKKwkJMToJCQlwU3JjMSBtZW1vcnkgaXMgbGFyZ2VyCisJCTI6CQkJcFNyYzIgbWVtb3J5IGlzIGxhcmdlcgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVUxPTkcJUlRNUENvbXBhcmVNZW1vcnkoCisJSU4JUFZPSUQJcFNyYzEsCisJSU4JUFZPSUQJcFNyYzIsCisJSU4JVUxPTkcJTGVuZ3RoKQoreworCVBVQ0hBUglwTWVtMTsKKwlQVUNIQVIJcE1lbTI7CisJVUxPTkcJSW5kZXggPSAwOworCisJcE1lbTEgPSAoUFVDSEFSKSBwU3JjMTsKKwlwTWVtMiA9IChQVUNIQVIpIHBTcmMyOworCisJZm9yIChJbmRleCA9IDA7IEluZGV4IDwgTGVuZ3RoOyBJbmRleCsrKQorCXsKKwkJaWYgKHBNZW0xW0luZGV4XSA+IHBNZW0yW0luZGV4XSkKKwkJCXJldHVybiAoMSk7CisJCWVsc2UgaWYgKHBNZW0xW0luZGV4XSA8IHBNZW0yW0luZGV4XSkKKwkJCXJldHVybiAoMik7CisJfQorCisJLy8gRXF1YWwKKwlyZXR1cm4gKDApOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJWmVybyBvdXQgbWVtb3J5IGJsb2NrCisKKwlBcmd1bWVudHM6CisJCXBTcmMxCQlQb2ludGVyIHRvIG1lbW9yeSBhZGRyZXNzCisJCUxlbmd0aAkJU2l6ZQorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJUlRNUFplcm9NZW1vcnkoCisJSU4JUFZPSUQJcFNyYywKKwlJTglVTE9ORwlMZW5ndGgpCit7CisJUFVDSEFSCXBNZW07CisJVUxPTkcJSW5kZXggPSAwOworCisJcE1lbSA9IChQVUNIQVIpIHBTcmM7CisKKwlmb3IgKEluZGV4ID0gMDsgSW5kZXggPCBMZW5ndGg7IEluZGV4KyspCisJeworCQlwTWVtW0luZGV4XSA9IDB4MDA7CisJfQorfQorCitWT0lECVJUTVBGaWxsTWVtb3J5KAorCUlOCVBWT0lECXBTcmMsCisJSU4JVUxPTkcJTGVuZ3RoLAorCUlOCVVDSEFSCUZpbGwpCit7CisJUFVDSEFSCXBNZW07CisJVUxPTkcJSW5kZXggPSAwOworCisJcE1lbSA9IChQVUNIQVIpIHBTcmM7CisKKwlmb3IgKEluZGV4ID0gMDsgSW5kZXggPCBMZW5ndGg7IEluZGV4KyspCisJeworCQlwTWVtW0luZGV4XSA9IEZpbGw7CisJfQorfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJQ29weSBkYXRhIGZyb20gbWVtb3J5IGJsb2NrIDEgdG8gbWVtb3J5IGJsb2NrIDIKKworCUFyZ3VtZW50czoKKwkJcERlc3QJCVBvaW50ZXIgdG8gZGVzdGluYXRpb24gbWVtb3J5IGFkZHJlc3MKKwkJcFNyYwkJUG9pbnRlciB0byBzb3VyY2UgbWVtb3J5IGFkZHJlc3MKKwkJTGVuZ3RoCQlDb3B5IHNpemUKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECVJUTVBNb3ZlTWVtb3J5KAorCU9VVAlQVk9JRAlwRGVzdCwKKwlJTglQVk9JRAlwU3JjLAorCUlOCVVMT05HCUxlbmd0aCkKK3sKKwlQVUNIQVIJcE1lbTE7CisJUFVDSEFSCXBNZW0yOworCVVJTlQJSW5kZXg7CisKKwlBU1NFUlQoKExlbmd0aD09MCkgfHwgKHBEZXN0ICYmIHBTcmMpKTsKKworCXBNZW0xID0gKFBVQ0hBUikgcERlc3Q7CisJcE1lbTIgPSAoUFVDSEFSKSBwU3JjOworCisJZm9yIChJbmRleCA9IDA7IEluZGV4IDwgTGVuZ3RoOyBJbmRleCsrKQorCXsKKwkJcE1lbTFbSW5kZXhdID0gcE1lbTJbSW5kZXhdOworCX0KK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCUluaXRpYWxpemUgcG9ydCBjb25maWd1cmF0aW9uIHN0cnVjdHVyZQorCisJQXJndW1lbnRzOgorCQlBZGFwdGVyCQkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJVXNlckNmZ0luaXQoCisJSU4JUFJUTVBfQURBUFRFUiBwQWQpCit7CisvLwlFRENBX1BBUk0gRGVmYXVsdEVkY2FQYXJtOworICAgIFVJTlQga2V5X2luZGV4LCBic3NfaW5kZXg7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLT4gVXNlckNmZ0luaXRcbiIpKTsKKworCS8vCisJLy8gIHBhcnQgSS4gaW50aWFsaXplIGNvbW1vbiBjb25maWd1cmF0aW9uCisJLy8KKyNpZmRlZiBSVDI4NzAKKwlwQWQtPkJ1bGtPdXRSZXEgPSAwOworCisJcEFkLT5CdWxrT3V0Q29tcGxldGUgPSAwOworCXBBZC0+QnVsa091dENvbXBsZXRlT3RoZXIgPSAwOworCXBBZC0+QnVsa091dENvbXBsZXRlQ2FuY2VsID0gMDsKKwlwQWQtPkJ1bGtJblJlcSA9IDA7CisJcEFkLT5CdWxrSW5Db21wbGV0ZSA9IDA7CisJcEFkLT5CdWxrSW5Db21wbGV0ZUZhaWwgPSAwOworCisJLy9wQWQtPlF1aWNrVGltZXJQID0gMTAwOworCS8vcEFkLT5UdXJuQWdnckJ1bGtJbkNvdW50ID0gMDsKKwlwQWQtPmJVc2JUeEJ1bGtBZ2dyZSA9IDA7CisKKwkvLyBpbml0IGFzIHVuc2VkIHZhbHVlIHRvIGVuc3VyZSBkcml2ZXIgd2lsbCBzZXQgdG8gTUNVIG9uY2UuCisJcEFkLT5MZWRJbmRpY2F0b3JTdHJlZ3RoID0gMHhGRjsKKworCXBBZC0+Q29tbW9uQ2ZnLk1heFBrdE9uZVR4QnVsayA9IDI7CisJcEFkLT5Db21tb25DZmcuVHhCdWxrRmFjdG9yID0gMTsKKwlwQWQtPkNvbW1vbkNmZy5SeEJ1bGtGYWN0b3IgPTE7CisKKwlwQWQtPkNvbW1vbkNmZy5UeFBvd2VyID0gMTAwOyAvL21XCisKKwlOZGlzWmVyb01lbW9yeSgmcEFkLT5Db21tb25DZmcuSU9UZXN0UGFybSwgc2l6ZW9mKHBBZC0+Q29tbW9uQ2ZnLklPVGVzdFBhcm0pKTsKKyNlbmRpZiAvLyBSVDI4NzAgLy8KKworCWZvcihrZXlfaW5kZXg9MDsga2V5X2luZGV4PFNIQVJFX0tFWV9OVU07IGtleV9pbmRleCsrKQorCXsKKwkJZm9yKGJzc19pbmRleCA9IDA7IGJzc19pbmRleCA8IE1BWF9NQlNTSURfTlVNOyBic3NfaW5kZXgrKykKKwkJeworCQkJcEFkLT5TaGFyZWRLZXlbYnNzX2luZGV4XVtrZXlfaW5kZXhdLktleUxlbiA9IDA7CisJCQlwQWQtPlNoYXJlZEtleVtic3NfaW5kZXhdW2tleV9pbmRleF0uQ2lwaGVyQWxnID0gQ0lQSEVSX05PTkU7CisJCX0KKwl9CisKKwlwQWQtPkFudGVubmEud29yZCA9IDA7CisJcEFkLT5Db21tb25DZmcuQkJQQ3VycmVudEJXID0gQldfMjA7CisKKwlwQWQtPkxlZENudGwud29yZCA9IDA7CisKKwlwQWQtPmJBdXRvVHhBZ2NBID0gRkFMU0U7CQkJLy8gRGVmYXVsdCBpcyBPRkYKKwlwQWQtPmJBdXRvVHhBZ2NHID0gRkFMU0U7CQkJLy8gRGVmYXVsdCBpcyBPRkYKKwlwQWQtPlJmSWNUeXBlID0gUkZJQ18yODIwOworCisJLy8gSW5pdCB0aW1lciBmb3IgcmVzZXQgY29tcGxldGUgZXZlbnQKKwlwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA9IDE7CisJcEFkLT5iRm9yY2VQcmludFRYID0gRkFMU0U7CisJcEFkLT5iRm9yY2VQcmludFJYID0gRkFMU0U7CisJcEFkLT5iU3RhRmlmb1Rlc3QgPSBGQUxTRTsKKwlwQWQtPmJQcm90ZWN0aW9uVGVzdCA9IEZBTFNFOworCXBBZC0+YkhDQ0FUZXN0ID0gRkFMU0U7CisJcEFkLT5iR2VuT25lSENDQSA9IEZBTFNFOworCXBBZC0+Q29tbW9uQ2ZnLkRzaWZzID0gMTA7ICAgICAgLy8gaW4gdW5pdHMgb2YgdXNlYworCXBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXIgPSAxMDA7IC8vbVcKKwlwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA9IDB4ZmZmZmZmZmY7IC8vIEFVVE8KKwlwQWQtPkNvbW1vbkNmZy5UeFBvd2VyRGVmYXVsdCA9IDB4ZmZmZmZmZmY7IC8vIEFVVE8KKwlwQWQtPkNvbW1vbkNmZy5UeFByZWFtYmxlID0gUnQ4MDJfMTFQcmVhbWJsZUF1dG87IC8vIHVzZSBMb25nIHByZWFtYmxlIG9uIFRYIGJ5IGRlZmF1dAorCXBBZC0+Q29tbW9uQ2ZnLmJVc2VaZXJvVG9EaXNhYmxlRnJhZ21lbnQgPSBGQUxTRTsKKwlwQWQtPkNvbW1vbkNmZy5SdHNUaHJlc2hvbGQgPSAyMzQ3OworCXBBZC0+Q29tbW9uQ2ZnLkZyYWdtZW50VGhyZXNob2xkID0gMjM0NjsKKwlwQWQtPkNvbW1vbkNmZy5Vc2VCR1Byb3RlY3Rpb24gPSAwOyAgICAvLyAwOiBBVVRPCisJcEFkLT5Db21tb25DZmcuYkVuYWJsZVR4QnVyc3QgPSBUUlVFOyAvLzA7CisJcEFkLT5Db21tb25DZmcuUGh5TW9kZSA9IDB4ZmY7ICAgICAvLyB1bmtub3duCisJcEFkLT5Db21tb25DZmcuQmFuZFN0YXRlID0gVU5LTk9XTl9CQU5EOworCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LkNTUGVyaW9kID0gMTA7CisJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuQ1NDb3VudCA9IDA7CisJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkRNb2RlID0gUkRfTk9STUFMX01PREU7CisJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuQ2hNb3ZpbmdUaW1lID0gNjU7CisJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuTG9uZ1B1bHNlUmFkYXJUaCA9IDM7CisJcEFkLT5Db21tb25DZmcuYkFQU0RDYXBhYmxlID0gRkFMU0U7CisJcEFkLT5Db21tb25DZmcuYk5lZWRTZW5kVHJpZ2dlckZyYW1lID0gRkFMU0U7CisJcEFkLT5Db21tb25DZmcuVHJpZ2dlclRpbWVyQ291bnQgPSAwOworCXBBZC0+Q29tbW9uQ2ZnLmJBUFNERm9yY2VQb3dlclNhdmUgPSBGQUxTRTsKKwlwQWQtPkNvbW1vbkNmZy5iQ291bnRyeUZsYWcgPSBGQUxTRTsKKwlwQWQtPkNvbW1vbkNmZy5UeFN0cmVhbSA9IDA7CisJcEFkLT5Db21tb25DZmcuUnhTdHJlYW0gPSAwOworCisJTmRpc1plcm9NZW1vcnkoJnBBZC0+QmVhY29uVHhXSSwgc2l6ZW9mKHBBZC0+QmVhY29uVHhXSSkpOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJTmRpc1plcm9NZW1vcnkoJnBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eSwgc2l6ZW9mKHBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eSkpOworCXBBZC0+SFRDRW5hYmxlID0gRkFMU0U7CisJcEFkLT5iQnJvYWRDb21IVCA9IEZBTFNFOworCXBBZC0+Q29tbW9uQ2ZnLmJSZGcgPSBGQUxTRTsKKworI2lmZGVmIERPVDExTl9EUkFGVDMKKwlwQWQtPkNvbW1vbkNmZy5Eb3QxMU9Cc3NTY2FuUGFzc2l2ZUR3ZWxsID0gZG90MTFPQlNTU2NhblBhc3NpdmVEd2VsbDsJLy8gVW5pdCA6IFRVLiA1fjEwMDAKKwlwQWQtPkNvbW1vbkNmZy5Eb3QxMU9Cc3NTY2FuQWN0aXZlRHdlbGwgPSBkb3QxMU9CU1NTY2FuQWN0aXZlRHdlbGw7CS8vIFVuaXQgOiBUVS4gMTB+MTAwMAorCXBBZC0+Q29tbW9uQ2ZnLkRvdDExQnNzV2lkdGhUcmlnZ2VyU2NhbkludCA9IGRvdDExQlNTV2lkdGhUcmlnZ2VyU2NhbkludGVydmFsOwkvLyBVbml0IDogU2Vjb25kCisJcEFkLT5Db21tb25DZmcuRG90MTFPQnNzU2NhblBhc3NpdmVUb3RhbFBlckNoYW5uZWwgPSBkb3QxMU9CU1NTY2FuUGFzc2l2ZVRvdGFsUGVyQ2hhbm5lbDsJLy8gVW5pdCA6IFRVLiAyMDB+MTAwMDAKKwlwQWQtPkNvbW1vbkNmZy5Eb3QxMU9Cc3NTY2FuQWN0aXZlVG90YWxQZXJDaGFubmVsID0gZG90MTFPQlNTU2NhbkFjdGl2ZVRvdGFsUGVyQ2hhbm5lbDsJLy8gVW5pdCA6IFRVLiAyMH4xMDAwMAorCXBBZC0+Q29tbW9uQ2ZnLkRvdDExQnNzV2lkdGhDaGFuVHJhbkRlbGF5RmFjdG9yID0gZG90MTFCU1NXaWR0aENoYW5uZWxUcmFuc2FjdGlvbkRlbGF5RmFjdG9yOworCXBBZC0+Q29tbW9uQ2ZnLkRvdDExT0Jzc1NjYW5BY3Rpdml0eVRocmUgPSBkb3QxMUJTU1NjYW5BY3Rpdml0eVRocmVzaG9sZDsJLy8gVW5pdCA6IHBlcmNlbnRhZ2UKKwlwQWQtPkNvbW1vbkNmZy5Eb3QxMUJzc1dpZHRoQ2hhblRyYW5EZWxheSA9IChwQWQtPkNvbW1vbkNmZy5Eb3QxMUJzc1dpZHRoVHJpZ2dlclNjYW5JbnQgKiBwQWQtPkNvbW1vbkNmZy5Eb3QxMUJzc1dpZHRoQ2hhblRyYW5EZWxheUZhY3Rvcik7CisjZW5kaWYgIC8vIERPVDExTl9EUkFGVDMgLy8KKworCU5kaXNaZXJvTWVtb3J5KCZwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8sIHNpemVvZihwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8pKTsKKwlwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTU1QU21vZGUgPSBNTVBTX0VOQUJMRTsKKwlwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTXBkdURlbnNpdHkgPSAwOworCXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5Qb2xpY3kgPSBJTU1FRF9CQTsKKwlwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuUnhCQVdpbkxpbWl0ID0gNjQ7IC8vMzI7CisJcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlR4QkFXaW5MaW1pdCA9IDY0OyAvLzMyOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPiBVc2VyQ2ZnSW5pdC4gQkFDYXBhYmlsaXR5ID0gMHgleFxuIiwgcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LndvcmQpKTsKKworCXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BdXRvQkEgPSBGQUxTRTsKKwlCQVRhYmxlSW5pdChwQWQsICZwQWQtPkJBVGFibGUpOworCisJcEFkLT5Db21tb25DZmcuYkV4dENoYW5uZWxTd2l0Y2hBbm5vdW5jZW1lbnQgPSAxOworCXBBZC0+Q29tbW9uQ2ZnLmJIVFByb3RlY3QgPSAxOworCXBBZC0+Q29tbW9uQ2ZnLmJNSU1PUFNFbmFibGUgPSBUUlVFOworCXBBZC0+Q29tbW9uQ2ZnLmJCQURlY2xpbmUgPSBGQUxTRTsKKwlwQWQtPkNvbW1vbkNmZy5iRGlzYWJsZVJlb3JkZXJpbmcgPSBGQUxTRTsKKworCXBBZC0+Q29tbW9uQ2ZnLlR4QkFTaXplID0gNzsKKworCXBBZC0+Q29tbW9uQ2ZnLlJFR0JBQ2FwYWJpbGl0eS53b3JkID0gcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LndvcmQ7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwkvL3BBZC0+Q29tbW9uQ2ZnLkhUUGh5TW9kZS5maWVsZC5CVyA9IEJXXzIwOworCS8vcEFkLT5Db21tb25DZmcuSFRQaHlNb2RlLmZpZWxkLk1DUyA9IE1DU19BVVRPOworCS8vcEFkLT5Db21tb25DZmcuSFRQaHlNb2RlLmZpZWxkLlNob3J0R0kgPSBHSV84MDA7CisJLy9wQWQtPkNvbW1vbkNmZy5IVFBoeU1vZGUuZmllbGQuU1RCQyA9IFNUQkNfTk9ORTsKKwlwQWQtPkNvbW1vbkNmZy5UeFJhdGUgPSBSQVRFXzY7CisKKwlwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTUNTID0gTUNTX1JBVEVfNjsKKwlwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuQlcgPSBCV18yMDsKKwlwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTU9ERSA9IE1PREVfT0ZETTsKKworCXBBZC0+Q29tbW9uQ2ZnLkJlYWNvblBlcmlvZCA9IDEwMDsgICAgIC8vIGluIG1TZWMKKworCS8vCisJLy8gcGFydCBJSS4gaW50aWFsaXplIFNUQSBzcGVjaWZpYyBjb25maWd1cmF0aW9uCisJLy8KKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCXsKKwkJUlhfRklMVEVSX1NFVF9GTEFHKHBBZCwgZlJYX0ZJTFRFUl9BQ0NFUFRfRElSRUNUKTsKKwkJUlhfRklMVEVSX0NMRUFSX0ZMQUcocEFkLCBmUlhfRklMVEVSX0FDQ0VQVF9NVUxUSUNBU1QpOworCQlSWF9GSUxURVJfU0VUX0ZMQUcocEFkLCBmUlhfRklMVEVSX0FDQ0VQVF9CUk9BRENBU1QpOworCQlSWF9GSUxURVJfU0VUX0ZMQUcocEFkLCBmUlhfRklMVEVSX0FDQ0VQVF9BTExfTVVMVElDQVNUKTsKKworCQlwQWQtPlN0YUNmZy5Qc20gPSBQV1JfQUNUSVZFOworCisJCXBBZC0+U3RhQ2ZnLk9yaWdXZXBTdGF0dXMgPSBOZGlzODAyXzExRW5jcnlwdGlvbkRpc2FibGVkOworCQlwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb25EaXNhYmxlZDsKKwkJcEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbkRpc2FibGVkOworCQlwQWQtPlN0YUNmZy5iTWl4Q2lwaGVyID0gRkFMU0U7CisJCXBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCA9IDA7CisKKwkJLy8gODAyLjF4IHBvcnQgY29udHJvbAorCQlwQWQtPlN0YUNmZy5Qcml2YWN5RmlsdGVyID0gTmRpczgwMl8xMVByaXZGaWx0ZXI4MDIxeFdFUDsKKwkJcEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQ7CisJCXBBZC0+U3RhQ2ZnLkxhc3RNaWNFcnJvclRpbWUgPSAwOworCQlwQWQtPlN0YUNmZy5NaWNFcnJDbnQgICAgICAgID0gMDsKKwkJcEFkLT5TdGFDZmcuYkJsb2NrQXNzb2MgICAgICA9IEZBTFNFOworCQlwQWQtPlN0YUNmZy5XcGFTdGF0ZSAgICAgICAgID0gU1NfTk9UVVNFOworCisJCXBBZC0+Q29tbW9uQ2ZnLk5kaXNSYWRpb1N0YXRlT2ZmID0gRkFMU0U7CQkvLyBOZXcgdG8gc3VwcG9ydCBtaWNyb3NvZnQgZGlzYWJsZSByYWRpbyB3aXRoIE9JRCBjb21tYW5kCisKKwkJcEFkLT5TdGFDZmcuUnNzaVRyaWdnZXIgPSAwOworCQlOZGlzWmVyb01lbW9yeSgmcEFkLT5TdGFDZmcuUnNzaVNhbXBsZSwgc2l6ZW9mKFJTU0lfU0FNUExFKSk7CisJCXBBZC0+U3RhQ2ZnLlJzc2lUcmlnZ2VyTW9kZSA9IFJTU0lfVFJJR0dFUkVEX1VQT05fQkVMT1dfVEhSRVNIT0xEOworCQlwQWQtPlN0YUNmZy5BdGltV2luID0gMDsKKwkJcEFkLT5TdGFDZmcuRGVmYXVsdExpc3RlbkNvdW50ID0gMzsvL2RlZmF1bHQgbGlzdGVuIGNvdW50OworCQlwQWQtPlN0YUNmZy5Cc3NUeXBlID0gQlNTX0lORlJBOyAgLy8gQlNTX0lORlJBIG9yIEJTU19BREhPQyBvciBCU1NfTU9OSVRPUgorCQlwQWQtPlN0YUNmZy5iU2NhblJlcUlzRnJvbVdlYlVJID0gRkFMU0U7CisJCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0RPWkUpOworCQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19XQUtFVVBfTk9XKTsKKworCQlwQWQtPlN0YUNmZy5iQXV0b1R4UmF0ZVN3aXRjaCA9IFRSVUU7CisJCXBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTX0FVVE87CisJfQorCisjaWZkZWYgRVhUX0JVSUxEX0NIQU5ORUxfTElTVAorCXBBZC0+U3RhQ2ZnLklFRUU4MDIxMWRDbGllbnRNb2RlID0gUnQ4MDJfMTFfRF9Ob25lOworI2VuZGlmIC8vIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QgLy8KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCS8vIGdsb2JhbCB2YXJpYWJsZXMgbVhYWFggdXNlZCBpbiBNQUMgcHJvdG9jb2wgc3RhdGUgbWFjaGluZXMKKwlPUFNUQVRVU19TRVRfRkxBRyhwQWQsIGZPUF9TVEFUVVNfUkVDRUlWRV9EVElNKTsKKwlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19BREhPQ19PTik7CisJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfSU5GUkFfT04pOworCisJLy8gUEhZIHNwZWNpZmljYXRpb24KKwlwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID0gUEhZXzExQkdfTUlYRUQ7CQkvLyBkZWZhdWx0IFBIWSBtb2RlCisJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfU0hPUlRfUFJFQU1CTEVfSU5VU0VEKTsgIC8vIENDSyB1c2UgTE9ORyBwcmVhbWJsZQorCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwl7CisJCS8vIHVzZXIgZGVzaXJlZCBwb3dlciBtb2RlCisJCXBBZC0+U3RhQ2ZnLldpbmRvd3NQb3dlck1vZGUgPSBOZGlzODAyXzExUG93ZXJNb2RlQ0FNOworCQlwQWQtPlN0YUNmZy5XaW5kb3dzQmF0dGVyeVBvd2VyTW9kZSA9IE5kaXM4MDJfMTFQb3dlck1vZGVDQU07CisJCXBBZC0+U3RhQ2ZnLmJXaW5kb3dzQUNDQU1FbmFibGUgPSBGQUxTRTsKKworI2lmZGVmIExFQVBfU1VQUE9SVAorCQkvLyBDQ1ggdjEuMCByZWxlYXRlZCBpbml0IHZhbHVlCisJCVJUTVBJbml0VGltZXIocEFkLCAmcEFkLT5TdGFDZmcuTGVhcEF1dGhUaW1lciwgR0VUX1RJTUVSX0ZVTkNUSU9OKExlYXBBdXRoVGltZW91dCksIHBBZCwgRkFMU0UpOworCQlwQWQtPlN0YUNmZy5MZWFwQXV0aE1vZGUgPSBDSVNDT19BdXRoTW9kZUxFQVBOb25lOworCQlwQWQtPlN0YUNmZy5iQ2tpcE9uID0gRkFMU0U7CisjZW5kaWYgLy8gTEVBUF9TVVBQT1JUIC8vCisKKwkJUlRNUEluaXRUaW1lcihwQWQsICZwQWQtPlN0YUNmZy5TdGFRdWlja1Jlc3BvbmVGb3JSYXRlVXBUaW1lciwgR0VUX1RJTUVSX0ZVTkNUSU9OKFN0YVF1aWNrUmVzcG9uZUZvclJhdGVVcEV4ZWMpLCBwQWQsIEZBTFNFKTsKKwkJcEFkLT5TdGFDZmcuU3RhUXVpY2tSZXNwb25lRm9yUmF0ZVVwVGltZXJSdW5uaW5nID0gRkFMU0U7CisKKwkJLy8gUGF0Y2ggZm9yIE5kdGVzdAorCQlwQWQtPlN0YUNmZy5TY2FuQ250ID0gMDsKKworCQkvLyBDQ1ggMi4wIGNvbnRyb2wgZmxhZyBpbml0CisJCXBBZC0+U3RhQ2ZnLkNDWEVuYWJsZSA9IEZBTFNFOworCQlwQWQtPlN0YUNmZy5DQ1hSZXFUeXBlID0gTVNSTl9UWVBFX1VOVVNFRDsKKwkJcEFkLT5TdGFDZmcuQ0NYUW9zRUNXTWluCT0gNDsKKwkJcEFkLT5TdGFDZmcuQ0NYUW9zRUNXTWF4CT0gMTA7CisKKwkJcEFkLT5TdGFDZmcuYkh3UmFkaW8gID0gVFJVRTsgLy8gRGVmYXVsdCBIYXJkd2FyZSBSYWRpbyBzdGF0dXMgaXMgT24KKwkJcEFkLT5TdGFDZmcuYlN3UmFkaW8gID0gVFJVRTsgLy8gRGVmYXVsdCBTb2Z0d2FyZSBSYWRpbyBzdGF0dXMgaXMgT24KKwkJcEFkLT5TdGFDZmcuYlJhZGlvICAgID0gVFJVRTsgLy8gYkh3UmFkaW8gJiYgYlN3UmFkaW8KKwkJcEFkLT5TdGFDZmcuYkhhcmR3YXJlUmFkaW8gPSBGQUxTRTsJCS8vIERlZmF1bHQgaXMgT0ZGCisJCXBBZC0+U3RhQ2ZnLmJTaG93SGlkZGVuU1NJRCA9IEZBTFNFOwkJLy8gRGVmYXVsdCBubyBzaG93CisKKwkJLy8gTml0cm8gbW9kZSBjb250cm9sCisJCXBBZC0+U3RhQ2ZnLmJBdXRvUmVjb25uZWN0ID0gVFJVRTsKKworCQkvLyBTYXZlIHRoZSBpbml0IHRpbWUgYXMgbGFzdCBzY2FuIHRpbWUsIHRoZSBzeXN0ZW0gc2hvdWxkIGRvIHNjYW4gYWZ0ZXIgMiBzZWNvbmRzLgorCQkvLyBUaGlzIHBhdGNoIGlzIGZvciBkcml2ZXIgd2FrZSB1cCBmcm9tIHN0YW5kYnkgbW9kZSwgc3lzdGVtIHdpbGwgZG8gc2NhbiByaWdodCBhd2F5LgorCQlwQWQtPlN0YUNmZy5MYXN0U2NhblRpbWUgPSAwOworCQlOZGlzWmVyb01lbW9yeShwQWQtPm5pY2tuYW1lLCBJV19FU1NJRF9NQVhfU0laRSsxKTsKKwkJc3ByaW50ZihwQWQtPm5pY2tuYW1lLCAiJXMiLCBTVEFfTklDX0RFVklDRV9OQU1FKTsKKwkJUlRNUEluaXRUaW1lcihwQWQsICZwQWQtPlN0YUNmZy5XcGFEaXNhc3NvY0FuZEJsb2NrQXNzb2NUaW1lciwgR0VUX1RJTUVSX0ZVTkNUSU9OKFdwYURpc2Fzc29jQXBBbmRCbG9ja0Fzc29jKSwgcEFkLCBGQUxTRSk7CisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorCQlwQWQtPlN0YUNmZy5JRUVFODAyMVggPSBGQUxTRTsKKwkJcEFkLT5TdGFDZmcuSUVFRTgwMjF4X3JlcXVpcmVkX2tleXMgPSBGQUxTRTsKKwkJcEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQID0gV1BBX1NVUFBMSUNBTlRfRElTQUJMRTsKKyNpZmRlZiBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorCQlwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgPSBXUEFfU1VQUExJQ0FOVF9FTkFCTEU7CisjZW5kaWYgLy8gTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisKKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwkvLyBEZWZhdWx0IGZvciBleHRyYSBpbmZvcm1hdGlvbiBpcyBub3QgdmFsaWQKKwlwQWQtPkV4dHJhSW5mbyA9IEVYVFJBX0lORk9fQ0xFQVI7CisKKwkvLyBEZWZhdWx0IENvbmZpZyBjaGFuZ2UgZmxhZworCXBBZC0+YkNvbmZpZ0NoYW5nZWQgPSBGQUxTRTsKKworCS8vCisJLy8gcGFydCBJSUkuIEFQIGNvbmZpZ3VyYXRpb25zCisJLy8KKworCisJLy8KKwkvLyBwYXJ0IElWLiBvdGhlcnMKKwkvLworCS8vIGR5bmFtaWMgQkJQIFI2NjpzZW5zaWJpdHkgdHVuaW5nIHRvIG92ZXJjb21lIGJhY2tncm91bmQgbm9pc2UKKwlwQWQtPkJicFR1bmluZy5iRW5hYmxlICAgICAgICAgICAgICAgID0gVFJVRTsKKwlwQWQtPkJicFR1bmluZy5GYWxzZUNjYUxvd2VyVGhyZXNob2xkID0gMTAwOworCXBBZC0+QmJwVHVuaW5nLkZhbHNlQ2NhVXBwZXJUaHJlc2hvbGQgPSA1MTI7CisJcEFkLT5CYnBUdW5pbmcuUjY2RGVsdGEgICAgICAgICAgICAgICA9IDQ7CisJcEFkLT5NbG1lLmJFbmFibGVBdXRvQW50ZW5uYUNoZWNrID0gVFJVRTsKKworCS8vCisJLy8gQWxzbyBpbml0aWFsIFI2NkN1cnJlbnRWYWx1ZSwgUlRVU0JSZXN1bWVNc2R1VHJhbnNtaXNzaW9uIG1pZ2h0IHVzZSB0aGlzIHZhbHVlLgorCS8vIGlmIG5vdCBpbml0aWFsIHRoaXMgdmFsdWUsIHRoZSBkZWZhdWx0IHZhbHVlIHdpbGwgYmUgMC4KKwkvLworCXBBZC0+QmJwVHVuaW5nLlI2NkN1cnJlbnRWYWx1ZSA9IDB4Mzg7CisKKwlwQWQtPkJicDk0ID0gQkJQUjk0X0RFRkFVTFQ7CisJcEFkLT5CYnBGb3JDQ0sgPSBGQUxTRTsKKworCS8vIERlZmF1bHQgaXMgRkFMU0UgZm9yIHRlc3QgYml0IDEKKwkvL3BBZC0+YlRlc3QxID0gRkFMU0U7CisKKwkvLyBpbml0aWFsaXplIE1BQyB0YWJsZSBhbmQgYWxsb2NhdGUgc3BpbiBsb2NrCisJTmRpc1plcm9NZW1vcnkoJnBBZC0+TWFjVGFiLCBzaXplb2YoTUFDX1RBQkxFKSk7CisJSW5pdGlhbGl6ZVF1ZXVlSGVhZGVyKCZwQWQtPk1hY1RhYi5NY2FzdFBzUXVldWUpOworCU5kaXNBbGxvY2F0ZVNwaW5Mb2NrKCZwQWQtPk1hY1RhYkxvY2spOworCisJLy9SVE1QSW5pdFRpbWVyKHBBZCwgJnBBZC0+UkVDQkFUaW1lciwgUkVDQkFUaW1lclRpbWVvdXQsIHBBZCwgVFJVRSk7CisJLy9SVE1QU2V0VGltZXIoJnBBZC0+UkVDQkFUaW1lciwgUkVPUkRFUl9FWEVDX0lOVFYpOworCisjaWZkZWYgUkFMSU5LX0FURQorCU5kaXNaZXJvTWVtb3J5KCZwQWQtPmF0ZSwgc2l6ZW9mKEFURV9JTkZPKSk7CisJcEFkLT5hdGUuTW9kZSA9IEFURV9TVE9QOworCXBBZC0+YXRlLlR4Q291bnQgPSAyMDA7LyogdG8gZXhjZWVkIFRYX1JJTkdfU0laRSAuLi4gKi8KKwlwQWQtPmF0ZS5UeExlbmd0aCA9IDEwMjQ7CisJcEFkLT5hdGUuVHhXSS5TaG9ydEdJID0gMDsvLyBMT05HIEdJIDogODAwIG5zCisJcEFkLT5hdGUuVHhXSS5QSFlNT0RFID0gTU9ERV9DQ0s7CisJcEFkLT5hdGUuVHhXSS5NQ1MgPSAzOworCXBBZC0+YXRlLlR4V0kuQlcgPSBCV18yMDsKKwlwQWQtPmF0ZS5DaGFubmVsID0gMTsKKwlwQWQtPmF0ZS5RSUQgPSBRSURfQUNfQkU7CisJcEFkLT5hdGUuQWRkcjFbMF0gPSAweDAwOworCXBBZC0+YXRlLkFkZHIxWzFdID0gMHgxMTsKKwlwQWQtPmF0ZS5BZGRyMVsyXSA9IDB4MjI7CisJcEFkLT5hdGUuQWRkcjFbM10gPSAweEFBOworCXBBZC0+YXRlLkFkZHIxWzRdID0gMHhCQjsKKwlwQWQtPmF0ZS5BZGRyMVs1XSA9IDB4Q0M7CisJTmRpc01vdmVNZW1vcnkocEFkLT5hdGUuQWRkcjIsIHBBZC0+YXRlLkFkZHIxLCBFVEhfTEVOR1RIX09GX0FERFJFU1MpOworCU5kaXNNb3ZlTWVtb3J5KHBBZC0+YXRlLkFkZHIzLCBwQWQtPmF0ZS5BZGRyMSwgRVRIX0xFTkdUSF9PRl9BRERSRVNTKTsKKwlwQWQtPmF0ZS5iUnhGZXIgPSAwOworCXBBZC0+YXRlLmJRQVR4U3RhcnQgPSBGQUxTRTsKKwlwQWQtPmF0ZS5iUUFSeFN0YXJ0ID0gRkFMU0U7CisjaWZkZWYgUkFMSU5LXzI4eHhfUUEKKwkvL3BBZC0+YXRlLlJlcGVhdCA9IDA7CisJcEFkLT5hdGUuVHhTdGF0dXMgPSAwOworCXBBZC0+YXRlLkF0ZVBpZCA9IFRIUkVBRF9QSURfSU5JVF9WQUxVRTsKKyNlbmRpZiAvLyBSQUxJTktfMjh4eF9RQSAvLworI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKworCisJcEFkLT5Db21tb25DZmcuYldpRmlUZXN0ID0gRkFMU0U7CisKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjwtLSBVc2VyQ2ZnSW5pdFxuIikpOworfQorCisvLyBJUlFMID0gUEFTU0lWRV9MRVZFTAorVUNIQVIgQnRvSChjaGFyIGNoKQoreworCWlmIChjaCA+PSAnMCcgJiYgY2ggPD0gJzknKSByZXR1cm4gKGNoIC0gJzAnKTsgICAgICAgIC8vIEhhbmRsZSBudW1lcmFscworCWlmIChjaCA+PSAnQScgJiYgY2ggPD0gJ0YnKSByZXR1cm4gKGNoIC0gJ0EnICsgMHhBKTsgIC8vIEhhbmRsZSBjYXBpdG9sIGhleCBkaWdpdHMKKwlpZiAoY2ggPj0gJ2EnICYmIGNoIDw9ICdmJykgcmV0dXJuIChjaCAtICdhJyArIDB4QSk7ICAvLyBIYW5kbGUgc21hbGwgaGV4IGRpZ2l0cworCXJldHVybigyNTUpOworfQorCisvLworLy8gIEZVTkNUSU9OOiBBdG9IKGNoYXIgKiwgVUNIQVIgKiwgaW50KQorLy8KKy8vICBQVVJQT1NFOiAgQ29udmVydHMgYXNjaWkgc3RyaW5nIHRvIG5ldHdvcmsgb3JkZXIgaGV4CisvLworLy8gIFBBUkFNRVRFUlM6CisvLyAgICBzcmMgICAgLSBwb2ludGVyIHRvIGlucHV0IGFzY2lpIHN0cmluZworLy8gICAgZGVzdCAgIC0gcG9pbnRlciB0byBvdXRwdXQgaGV4CisvLyAgICBkZXN0bGVuIC0gc2l6ZSBvZiBkZXN0CisvLworLy8gIENPTU1FTlRTOgorLy8KKy8vICAgIDIgYXNjaWkgYnl0ZXMgbWFrZSBhIGhleCBieXRlIHNvIG11c3QgcHV0IDFzdCBhc2NpaSBieXRlIG9mIHBhaXIKKy8vICAgIGludG8gdXBwZXIgbmliYmxlIGFuZCAybmQgYXNjaWkgYnl0ZSBvZiBwYWlyIGludG8gbG93ZXIgbmliYmxlLgorLy8KKy8vIElSUUwgPSBQQVNTSVZFX0xFVkVMCisKK3ZvaWQgQXRvSChjaGFyICogc3JjLCBVQ0hBUiAqIGRlc3QsIGludCBkZXN0bGVuKQoreworCWNoYXIgKiBzcmNwdHI7CisJUFVDSEFSIGRlc3RUZW1wOworCisJc3JjcHRyID0gc3JjOworCWRlc3RUZW1wID0gKFBVQ0hBUikgZGVzdDsKKworCXdoaWxlKGRlc3RsZW4tLSkKKwl7CisJCSpkZXN0VGVtcCA9IEJ0b0goKnNyY3B0cisrKSA8PCA0OyAgICAvLyBQdXQgMXN0IGFzY2lpIGJ5dGUgaW4gdXBwZXIgbmliYmxlLgorCQkqZGVzdFRlbXAgKz0gQnRvSCgqc3JjcHRyKyspOyAgICAgIC8vIEFkZCAybmQgYXNjaWkgYnl0ZSB0byBhYm92ZS4KKwkJZGVzdFRlbXArKzsKKwl9Cit9CisKK1ZPSUQJUlRNUFBhdGNoTWFjQmJwQnVnKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKQoreworCVVMT05HCUluZGV4OworCisJLy8gSW5pdGlhbGl6ZSBCQlAgcmVnaXN0ZXIgdG8gZGVmYXVsdCB2YWx1ZQorCWZvciAoSW5kZXggPSAwOyBJbmRleCA8IE5VTV9CQlBfUkVHX1BBUk1TOyBJbmRleCsrKQorCXsKKwkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUFJlZ1RhYmxlW0luZGV4XS5SZWdpc3RlciwgKFVDSEFSKUJCUFJlZ1RhYmxlW0luZGV4XS5WYWx1ZSk7CisJfQorCisJLy8gSW5pdGlhbGl6ZSBSRiByZWdpc3RlciB0byBkZWZhdWx0IHZhbHVlCisJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsLCBGQUxTRSk7CisJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCk7CisKKwkvLyBSZS1pbml0IEJCUCByZWdpc3RlciBmcm9tIEVFUFJPTSB2YWx1ZQorCU5JQ0luaXRBc2ljRnJvbUVFUFJPTShwQWQpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJSW5pdCB0aW1lciBvYmplY3RzCisKKwlBcmd1bWVudHM6CisJCXBBZAkJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKwkJcFRpbWVyCQkJCVRpbWVyIHN0cnVjdHVyZQorCQlwVGltZXJGdW5jCQkJRnVuY3Rpb24gdG8gZXhlY3V0ZSB3aGVuIHRpbWVyIGV4cGlyZWQKKwkJUmVwZWF0CQkJCVR1cmUgZm9yIHBlcmlvZCB0aW1lcgorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlSVE1QSW5pdFRpbWVyKAorCUlOCVBSVE1QX0FEQVBURVIJCQlwQWQsCisJSU4JUFJBTElOS19USU1FUl9TVFJVQ1QJcFRpbWVyLAorCUlOCVBWT0lECQkJCQlwVGltZXJGdW5jLAorCUlOCVBWT0lECQkJCQlwRGF0YSwKKwlJTglCT09MRUFOCQkJCQlSZXBlYXQpCit7CisJLy8KKwkvLyBTZXQgVmFsaWQgdG8gVFJVRSBmb3IgbGF0ZXIgdXNlZC4KKwkvLyBJdCB3aWxsIGNyYXNoIGlmIHdlIGNhbmNlbCBhIHRpbWVyIG9yIHNldCBhIHRpbWVyCisJLy8gdGhhdCB3ZSBoYXZlbid0IGluaXRpYWxpemUgYmVmb3JlLgorCS8vCisJcFRpbWVyLT5WYWxpZCAgICAgID0gVFJVRTsKKworCXBUaW1lci0+UGVyaW9kaWNUeXBlID0gUmVwZWF0OworCXBUaW1lci0+U3RhdGUgICAgICA9IEZBTFNFOworCXBUaW1lci0+Y29va2llID0gKFVMT05HKSBwRGF0YTsKKworI2lmZGVmIFJUMjg3MAorCXBUaW1lci0+cEFkID0gcEFkOworI2VuZGlmIC8vIFJUMjg3MCAvLworCisJUlRNUF9PU19Jbml0X1RpbWVyKHBBZCwJJnBUaW1lci0+VGltZXJPYmosCXBUaW1lckZ1bmMsIChQVk9JRCkgcFRpbWVyKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCUluaXQgdGltZXIgb2JqZWN0cworCisJQXJndW1lbnRzOgorCQlwVGltZXIJCQkJVGltZXIgc3RydWN0dXJlCisJCVZhbHVlCQkJCVRpbWVyIHZhbHVlIGluIG1pbGxpc2Vjb25kcworCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlOb3RlOgorCQlUbyB1c2UgdGhpcyByb3V0aW5lLCBtdXN0IGNhbGwgUlRNUEluaXRUaW1lciBiZWZvcmUuCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECVJUTVBTZXRUaW1lcigKKwlJTglQUkFMSU5LX1RJTUVSX1NUUlVDVAlwVGltZXIsCisJSU4JVUxPTkcJCQkJCVZhbHVlKQoreworCWlmIChwVGltZXItPlZhbGlkKQorCXsKKwkJcFRpbWVyLT5UaW1lclZhbHVlID0gVmFsdWU7CisJCXBUaW1lci0+U3RhdGUgICAgICA9IEZBTFNFOworCQlpZiAocFRpbWVyLT5QZXJpb2RpY1R5cGUgPT0gVFJVRSkKKwkJeworCQkJcFRpbWVyLT5SZXBlYXQgPSBUUlVFOworCQkJUlRNUF9TZXRQZXJpb2RpY1RpbWVyKCZwVGltZXItPlRpbWVyT2JqLCBWYWx1ZSk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlwVGltZXItPlJlcGVhdCA9IEZBTFNFOworCQkJUlRNUF9PU19BZGRfVGltZXIoJnBUaW1lci0+VGltZXJPYmosIFZhbHVlKTsKKwkJfQorCX0KKwllbHNlCisJeworCQlEQkdQUklOVF9FUlIoKCJSVE1QU2V0VGltZXIgZmFpbGVkLCBUaW1lciBoYXNuJ3QgYmVlbiBpbml0aWFsaXplIVxuIikpOworCX0KK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJSW5pdCB0aW1lciBvYmplY3RzCisKKwlBcmd1bWVudHM6CisJCXBUaW1lcgkJCQlUaW1lciBzdHJ1Y3R1cmUKKwkJVmFsdWUJCQkJVGltZXIgdmFsdWUgaW4gbWlsbGlzZWNvbmRzCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCU5vdGU6CisJCVRvIHVzZSB0aGlzIHJvdXRpbmUsIG11c3QgY2FsbCBSVE1QSW5pdFRpbWVyIGJlZm9yZS4KKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJUlRNUE1vZFRpbWVyKAorCUlOCVBSQUxJTktfVElNRVJfU1RSVUNUCXBUaW1lciwKKwlJTglVTE9ORwkJCQkJVmFsdWUpCit7CisJQk9PTEVBTglDYW5jZWw7CisKKwlpZiAocFRpbWVyLT5WYWxpZCkKKwl7CisJCXBUaW1lci0+VGltZXJWYWx1ZSA9IFZhbHVlOworCQlwVGltZXItPlN0YXRlICAgICAgPSBGQUxTRTsKKwkJaWYgKHBUaW1lci0+UGVyaW9kaWNUeXBlID09IFRSVUUpCisJCXsKKwkJCVJUTVBDYW5jZWxUaW1lcihwVGltZXIsICZDYW5jZWwpOworCQkJUlRNUFNldFRpbWVyKHBUaW1lciwgVmFsdWUpOworCQl9CisJCWVsc2UKKwkJeworCQkJUlRNUF9PU19Nb2RfVGltZXIoJnBUaW1lci0+VGltZXJPYmosIFZhbHVlKTsKKwkJfQorCX0KKwllbHNlCisJeworCQlEQkdQUklOVF9FUlIoKCJSVE1QTW9kVGltZXIgZmFpbGVkLCBUaW1lciBoYXNuJ3QgYmVlbiBpbml0aWFsaXplIVxuIikpOworCX0KK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCUNhbmNlbCB0aW1lciBvYmplY3RzCisKKwlBcmd1bWVudHM6CisJCUFkYXB0ZXIJCQkJCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCUlSUUwgPSBQQVNTSVZFX0xFVkVMCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwlOb3RlOgorCQkxLikgVG8gdXNlIHRoaXMgcm91dGluZSwgbXVzdCBjYWxsIFJUTVBJbml0VGltZXIgYmVmb3JlLgorCQkyLikgUmVzZXQgTklDIHRvIGluaXRpYWwgc3RhdGUgQVMgSVMgc3lzdGVtIGJvb3QgdXAgdGltZS4KKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJUlRNUENhbmNlbFRpbWVyKAorCUlOCVBSQUxJTktfVElNRVJfU1RSVUNUCXBUaW1lciwKKwlPVVQJQk9PTEVBTgkJCQkJKnBDYW5jZWxsZWQpCit7CisJaWYgKHBUaW1lci0+VmFsaWQpCisJeworCQlpZiAocFRpbWVyLT5TdGF0ZSA9PSBGQUxTRSkKKwkJCXBUaW1lci0+UmVwZWF0ID0gRkFMU0U7CisJCQlSVE1QX09TX0RlbF9UaW1lcigmcFRpbWVyLT5UaW1lck9iaiwgcENhbmNlbGxlZCk7CisKKwkJaWYgKCpwQ2FuY2VsbGVkID09IFRSVUUpCisJCQlwVGltZXItPlN0YXRlID0gVFJVRTsKKworI2lmZGVmIFJUMjg3MAorCQkvLyBXZSBuZWVkIHRvIGdvLXRocm91Z2ggdGhlIFRpbWVyUSB0byBmaW5kb3V0IHRoaXMgdGltZXIgaGFuZGxlciBhbmQgcmVtb3ZlIGl0IGlmCisJCS8vCQlpdCdzIHN0aWxsIHdhaXRpbmcgZm9yIGV4ZWN1dGlvbi4KKworCQlSVDI4NzBfVGltZXJRX1JlbW92ZShwVGltZXItPnBBZCwgcFRpbWVyKTsKKyNlbmRpZiAvLyBSVDI4NzAgLy8KKwl9CisJZWxzZQorCXsKKwkJLy8KKwkJLy8gTmRpc01DYW5jZWxUaW1lciBqdXN0IGNhbmNlZCB0aGUgdGltZXIgYW5kIG5vdCBtZWFuIHJlbGVhc2UgdGhlIHRpbWVyLgorCQkvLyBBbmQgZG9uJ3Qgc2V0IHRoZSAiVmFsaWQiIHRvIEZhbHNlLiBTbyB0aGF0IHdlIGNhbiB1c2UgdGhpcyB0aW1lciBhZ2Fpbi4KKwkJLy8KKwkJREJHUFJJTlRfRVJSKCgiUlRNUENhbmNlbFRpbWVyIGZhaWxlZCwgVGltZXIgaGFzbid0IGJlZW4gaW5pdGlhbGl6ZSFcbiIpKTsKKwl9Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlTZXQgTEVEIFN0YXR1cworCisJQXJndW1lbnRzOgorCQlwQWQJCQkJCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisJCVN0YXR1cwkJCQkJTEVEIFN0YXR1cworCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgUlRNUFNldExFRCgKKwlJTiBQUlRNUF9BREFQVEVSIAlwQWQsCisJSU4gVUNIQVIJCQlTdGF0dXMpCit7CisJLy9VTE9ORwkJCWRhdGE7CisJVUNIQVIJCQlIaWdoQnl0ZSA9IDA7CisJVUNIQVIJCQlMb3dCeXRlOworCisvLyBJbiBBVEUgbW9kZSBvZiBSVDI4NjAgQVAvU1RBLCB3ZSBoYXZlIGVyYXNlZCA4MDUxIGZpcm13YXJlLgorLy8gU28gTEVEIG1vZGUgaXMgbm90IHN1cHBvcnRlZCB3aGVuIEFURSBpcyBydW5uaW5nLgorI2lmZGVmIFJBTElOS19BVEUKKwlpZiAoQVRFX09OKHBBZCkpCisJCXJldHVybjsKKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisKKwlMb3dCeXRlID0gcEFkLT5MZWRDbnRsLmZpZWxkLkxlZE1vZGUmMHg3ZjsKKwlzd2l0Y2ggKFN0YXR1cykKKwl7CisJCWNhc2UgTEVEX0xJTktfRE9XTjoKKwkJCUhpZ2hCeXRlID0gMHgyMDsKKwkJCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHg1MCwgMHhmZiwgTG93Qnl0ZSwgSGlnaEJ5dGUpOworCQkJcEFkLT5MZWRJbmRpY2F0b3JTdHJlZ3RoID0gMDsKKwkJCWJyZWFrOworCQljYXNlIExFRF9MSU5LX1VQOgorCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPiAxNCkKKwkJCQlIaWdoQnl0ZSA9IDB4YTA7CisJCQllbHNlCisJCQkJSGlnaEJ5dGUgPSAweDYwOworCQkJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDUwLCAweGZmLCBMb3dCeXRlLCBIaWdoQnl0ZSk7CisJCQlicmVhazsKKwkJY2FzZSBMRURfUkFESU9fT046CisJCQlIaWdoQnl0ZSA9IDB4MjA7CisJCQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4NTAsIDB4ZmYsIExvd0J5dGUsIEhpZ2hCeXRlKTsKKwkJCWJyZWFrOworCQljYXNlIExFRF9IQUxUOgorCQkJTG93Qnl0ZSA9IDA7IC8vIERyaXZlciBzZXRzIE1BQyByZWdpc3RlciBhbmQgTUFDIGNvbnRyb2xzIExFRAorCQljYXNlIExFRF9SQURJT19PRkY6CisJCQlIaWdoQnl0ZSA9IDA7CisJCQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4NTAsIDB4ZmYsIExvd0J5dGUsIEhpZ2hCeXRlKTsKKwkJCWJyZWFrOworICAgICAgICBjYXNlIExFRF9XUFM6CisJCQlIaWdoQnl0ZSA9IDB4MTA7CisJCQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4NTAsIDB4ZmYsIExvd0J5dGUsIEhpZ2hCeXRlKTsKKwkJCWJyZWFrOworCQljYXNlIExFRF9PTl9TSVRFX1NVUlZFWToKKwkJCUhpZ2hCeXRlID0gMHgwODsKKwkJCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHg1MCwgMHhmZiwgTG93Qnl0ZSwgSGlnaEJ5dGUpOworCQkJYnJlYWs7CisJCWNhc2UgTEVEX1BPV0VSX1VQOgorCQkJSGlnaEJ5dGUgPSAweDA0OworCQkJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDUwLCAweGZmLCBMb3dCeXRlLCBIaWdoQnl0ZSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1dBUk4sICgiUlRNUFNldExFRDo6VW5rbm93biBTdGF0dXMgJWRcbiIsIFN0YXR1cykpOworCQkJYnJlYWs7CisJfQorCisgICAgLy8KKwkvLyBLZWVwIExFRCBzdGF0dXMgZm9yIExFRCBTaXRlU3VydmV5IG1vZGUuCisJLy8gQWZ0ZXIgU2l0ZVN1cnZleSwgd2Ugd2lsbCBzZXQgdGhlIExFRCBtb2RlIHRvIHByZXZpb3VzIHN0YXR1cy4KKwkvLworCWlmICgoU3RhdHVzICE9IExFRF9PTl9TSVRFX1NVUlZFWSkgJiYgKFN0YXR1cyAhPSBMRURfUE9XRVJfVVApKQorCQlwQWQtPkxlZFN0YXR1cyA9IFN0YXR1czsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJUTVBTZXRMRUQ6Ok1vZGU9JWQsSGlnaEJ5dGU9MHglMDJ4LExvd0J5dGU9MHglMDJ4XG4iLCBwQWQtPkxlZENudGwuZmllbGQuTGVkTW9kZSwgSGlnaEJ5dGUsIExvd0J5dGUpKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVNldCBMRUQgU2lnbmFsIFN0cmVndGgKKworCUFyZ3VtZW50czoKKwkJcEFkCQkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCQlEYm0JCQkJCQlTaWduYWwgU3RyZWd0aAorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCisJTm90ZToKKwkJQ2FuIGJlIHJ1biBvbiBhbnkgSVJRTCBsZXZlbC4KKworCQlBY2NvcmRpbmcgdG8gTWljcm9zb2Z0IFplcm8gQ29uZmlnIFdpcmVsZXNzIFNpZ25hbCBTdHJlZ3RoIGRlZmluaXRpb24gYXMgYmVsb3dzLgorCQk8PSAtOTAgIE5vIFNpZ25hbAorCQk8PSAtODEgIFZlcnkgTG93CisJCTw9IC03MSAgTG93CisJCTw9IC02NyAgR29vZAorCQk8PSAtNTcgIFZlcnkgR29vZAorCQkgPiAtNTcgIEV4Y2VsbGVudAorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgUlRNUFNldFNpZ25hbExFRCgKKwlJTiBQUlRNUF9BREFQVEVSIAlwQWQsCisJSU4gTkRJU184MDJfMTFfUlNTSSBEYm0pCit7CisJVUNIQVIJCW5MZWQgPSAwOworCisJLy8KKwkvLyBpZiBub3QgU2lnbmFsIFN0cmVndGgsIHRoZW4gZG8gbm90aGluZy4KKwkvLworCWlmIChwQWQtPkxlZENudGwuZmllbGQuTGVkTW9kZSAhPSBMRURfTU9ERV9TSUdOQUxfU1RSRUdUSCkKKwl7CisJCXJldHVybjsKKwl9CisKKwlpZiAoRGJtIDw9IC05MCkKKwkJbkxlZCA9IDA7CisJZWxzZSBpZiAoRGJtIDw9IC04MSkKKwkJbkxlZCA9IDE7CisJZWxzZSBpZiAoRGJtIDw9IC03MSkKKwkJbkxlZCA9IDM7CisJZWxzZSBpZiAoRGJtIDw9IC02NykKKwkJbkxlZCA9IDc7CisJZWxzZSBpZiAoRGJtIDw9IC01NykKKwkJbkxlZCA9IDE1OworCWVsc2UKKwkJbkxlZCA9IDMxOworCisJLy8KKwkvLyBVcGRhdGUgU2lnbmFsIFN0cmVndGggdG8gZmlybXdhcmUgaWYgY2hhbmdlZC4KKwkvLworCWlmIChwQWQtPkxlZEluZGljYXRvclN0cmVndGggIT0gbkxlZCkKKwl7CisJCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHg1MSwgMHhmZiwgbkxlZCwgcEFkLT5MZWRDbnRsLmZpZWxkLlBvbGFyaXR5KTsKKwkJcEFkLT5MZWRJbmRpY2F0b3JTdHJlZ3RoID0gbkxlZDsKKwl9Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlFbmFibGUgUlgKKworCUFyZ3VtZW50czoKKwkJcEFkCQkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMIDw9IERJU1BBVENIX0xFVkVMCisKKwlOb3RlOgorCQlCZWZvcmUgRW5hYmxlIFJYLCBtYWtlIHN1cmUgeW91IGhhdmUgZW5hYmxlZCBJbnRlcnJ1cHQuCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBSVE1QRW5hYmxlUnhUeCgKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCkKK3sKKy8vCVdQRE1BX0dMT19DRkdfU1RSVUMJR2xvQ2ZnOworLy8JVUxPTkcJaSA9IDA7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT4gUlRNUEVuYWJsZVJ4VHhcbiIpKTsKKworI2lmIDAKKwkvLyBFbmFibGUgUnggRE1BLgorCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgMHg0KTsKKwlkbworCXsKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBXUERNQV9HTE9fQ0ZHLCAmR2xvQ2ZnLndvcmQpOworCQlpZiAoKEdsb0NmZy5maWVsZC5UeERNQUJ1c3kgPT0gMCkgICYmIChHbG9DZmcuZmllbGQuUnhETUFCdXN5ID09IDApKQorCQkJYnJlYWs7CisKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT0+ICBETUFCdXN5XG4iKSk7CisJCVJUTVB1c2VjRGVsYXkoMTAwMCk7CisJCWkrKzsKKwl9d2hpbGUgKCBpIDwyMDApOworCisJUlRNUHVzZWNEZWxheSg1MCk7CisJUlQyOFhYX0RNQV9XUklURV9JTklUKEdsb0NmZyk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPD09IFdSSVRFIERNQSBvZmZzZXQgMHgyMDggPSAweCV4XG4iLCBHbG9DZmcud29yZCkpOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIFdQRE1BX0dMT19DRkcsIEdsb0NmZy53b3JkKTsKKworCVJUMjhYWF9ETUFfUE9TVF9XUklURShwQWQpOworI2Vsc2UKKwkvLyBFbmFibGUgUnggRE1BLgorCVJUMjhYWERNQUVuYWJsZShwQWQpOworI2VuZGlmCisKKwkvLyBlbmFibGUgUlggb2YgTUFDIGJsb2NrCisJaWYgKHBBZC0+T3BNb2RlID09IE9QTU9ERV9BUCkKKwl7CisJCVVJTlQzMiByeF9maWx0ZXJfZmxhZyA9IEFQTk9STUFMOworCisKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgUlhfRklMVFJfQ0ZHLCByeF9maWx0ZXJfZmxhZyk7ICAgICAvLyBlbmFibGUgUlggb2YgRE1BIGJsb2NrCisJfQorCWVsc2UKKwl7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFJYX0ZJTFRSX0NGRywgU1RBTk9STUFMKTsgICAgIC8vIFN0YWlvbiBub3QgZHJvcCBjb250cm9sIGZyYW1lIHdpbGwgZmFpbCBXaUZpIENlcnRpZmljYXRpb24uCisJfQorCisJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCAweGMpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PSBSVE1QRW5hYmxlUnhUeFxuIikpOworfQorCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL3J0bXBfdGtpcC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vcnRtcF90a2lwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjg0NzQwOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL3J0bXBfdGtpcC5jCkBAIC0wLDAgKzEsMTYxMyBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwlNb2R1bGUgTmFtZToKKwlydG1wX3RraXAuYworCisJQWJzdHJhY3Q6CisKKwlSZXZpc2lvbiBIaXN0b3J5OgorCVdobwkJCVdoZW4JCQlXaGF0CisJLS0tLS0tLS0JLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCVBhdWwgV3UJCTAyLTI1LTAyCQlJbml0aWFsCisqLworCisjaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCisKKy8vIFJvdGF0aW9uIGZ1bmN0aW9ucyBvbiAzMiBiaXQgdmFsdWVzCisjZGVmaW5lIFJPTDMyKCBBLCBuICkgXAorCSggKChBKSA8PCAobikpIHwgKCAoKEEpPj4oMzItKG4pKSkgJiAoICgxVUwgPDwgKG4pKSAtIDEgKSApICkKKyNkZWZpbmUgUk9SMzIoIEEsIG4gKSBST0wzMiggKEEpLCAzMi0obikgKQorCitVSU5UIFRraXBfU2JveF9Mb3dlclsyNTZdID0KK3sKKwkweEE1LDB4ODQsMHg5OSwweDhELDB4MEQsMHhCRCwweEIxLDB4NTQsCisJMHg1MCwweDAzLDB4QTksMHg3RCwweDE5LDB4NjIsMHhFNiwweDlBLAorCTB4NDUsMHg5RCwweDQwLDB4ODcsMHgxNSwweEVCLDB4QzksMHgwQiwKKwkweEVDLDB4NjcsMHhGRCwweEVBLDB4QkYsMHhGNywweDk2LDB4NUIsCisJMHhDMiwweDFDLDB4QUUsMHg2QSwweDVBLDB4NDEsMHgwMiwweDRGLAorCTB4NUMsMHhGNCwweDM0LDB4MDgsMHg5MywweDczLDB4NTMsMHgzRiwKKwkweDBDLDB4NTIsMHg2NSwweDVFLDB4MjgsMHhBMSwweDBGLDB4QjUsCisJMHgwOSwweDM2LDB4OUIsMHgzRCwweDI2LDB4NjksMHhDRCwweDlGLAorCTB4MUIsMHg5RSwweDc0LDB4MkUsMHgyRCwweEIyLDB4RUUsMHhGQiwKKwkweEY2LDB4NEQsMHg2MSwweENFLDB4N0IsMHgzRSwweDcxLDB4OTcsCisJMHhGNSwweDY4LDB4MDAsMHgyQywweDYwLDB4MUYsMHhDOCwweEVELAorCTB4QkUsMHg0NiwweEQ5LDB4NEIsMHhERSwweEQ0LDB4RTgsMHg0QSwKKwkweDZCLDB4MkEsMHhFNSwweDE2LDB4QzUsMHhENywweDU1LDB4OTQsCisJMHhDRiwweDEwLDB4MDYsMHg4MSwweEYwLDB4NDQsMHhCQSwweEUzLAorCTB4RjMsMHhGRSwweEMwLDB4OEEsMHhBRCwweEJDLDB4NDgsMHgwNCwKKwkweERGLDB4QzEsMHg3NSwweDYzLDB4MzAsMHgxQSwweDBFLDB4NkQsCisJMHg0QywweDE0LDB4MzUsMHgyRiwweEUxLDB4QTIsMHhDQywweDM5LAorCTB4NTcsMHhGMiwweDgyLDB4NDcsMHhBQywweEU3LDB4MkIsMHg5NSwKKwkweEEwLDB4OTgsMHhEMSwweDdGLDB4NjYsMHg3RSwweEFCLDB4ODMsCisJMHhDQSwweDI5LDB4RDMsMHgzQywweDc5LDB4RTIsMHgxRCwweDc2LAorCTB4M0IsMHg1NiwweDRFLDB4MUUsMHhEQiwweDBBLDB4NkMsMHhFNCwKKwkweDVELDB4NkUsMHhFRiwweEE2LDB4QTgsMHhBNCwweDM3LDB4OEIsCisJMHgzMiwweDQzLDB4NTksMHhCNywweDhDLDB4NjQsMHhEMiwweEUwLAorCTB4QjQsMHhGQSwweDA3LDB4MjUsMHhBRiwweDhFLDB4RTksMHgxOCwKKwkweEQ1LDB4ODgsMHg2RiwweDcyLDB4MjQsMHhGMSwweEM3LDB4NTEsCisJMHgyMywweDdDLDB4OUMsMHgyMSwweERELDB4REMsMHg4NiwweDg1LAorCTB4OTAsMHg0MiwweEM0LDB4QUEsMHhEOCwweDA1LDB4MDEsMHgxMiwKKwkweEEzLDB4NUYsMHhGOSwweEQwLDB4OTEsMHg1OCwweDI3LDB4QjksCisJMHgzOCwweDEzLDB4QjMsMHgzMywweEJCLDB4NzAsMHg4OSwweEE3LAorCTB4QjYsMHgyMiwweDkyLDB4MjAsMHg0OSwweEZGLDB4NzgsMHg3QSwKKwkweDhGLDB4RjgsMHg4MCwweDE3LDB4REEsMHgzMSwweEM2LDB4QjgsCisJMHhDMywweEIwLDB4NzcsMHgxMSwweENCLDB4RkMsMHhENiwweDNBCit9OworCitVSU5UIFRraXBfU2JveF9VcHBlclsyNTZdID0KK3sKKwkweEM2LDB4RjgsMHhFRSwweEY2LDB4RkYsMHhENiwweERFLDB4OTEsCisJMHg2MCwweDAyLDB4Q0UsMHg1NiwweEU3LDB4QjUsMHg0RCwweEVDLAorCTB4OEYsMHgxRiwweDg5LDB4RkEsMHhFRiwweEIyLDB4OEUsMHhGQiwKKwkweDQxLDB4QjMsMHg1RiwweDQ1LDB4MjMsMHg1MywweEU0LDB4OUIsCisJMHg3NSwweEUxLDB4M0QsMHg0QywweDZDLDB4N0UsMHhGNSwweDgzLAorCTB4NjgsMHg1MSwweEQxLDB4RjksMHhFMiwweEFCLDB4NjIsMHgyQSwKKwkweDA4LDB4OTUsMHg0NiwweDlELDB4MzAsMHgzNywweDBBLDB4MkYsCisJMHgwRSwweDI0LDB4MUIsMHhERiwweENELDB4NEUsMHg3RiwweEVBLAorCTB4MTIsMHgxRCwweDU4LDB4MzQsMHgzNiwweERDLDB4QjQsMHg1QiwKKwkweEE0LDB4NzYsMHhCNywweDdELDB4NTIsMHhERCwweDVFLDB4MTMsCisJMHhBNiwweEI5LDB4MDAsMHhDMSwweDQwLDB4RTMsMHg3OSwweEI2LAorCTB4RDQsMHg4RCwweDY3LDB4NzIsMHg5NCwweDk4LDB4QjAsMHg4NSwKKwkweEJCLDB4QzUsMHg0RiwweEVELDB4ODYsMHg5QSwweDY2LDB4MTEsCisJMHg4QSwweEU5LDB4MDQsMHhGRSwweEEwLDB4NzgsMHgyNSwweDRCLAorCTB4QTIsMHg1RCwweDgwLDB4MDUsMHgzRiwweDIxLDB4NzAsMHhGMSwKKwkweDYzLDB4NzcsMHhBRiwweDQyLDB4MjAsMHhFNSwweEZELDB4QkYsCisJMHg4MSwweDE4LDB4MjYsMHhDMywweEJFLDB4MzUsMHg4OCwweDJFLAorCTB4OTMsMHg1NSwweEZDLDB4N0EsMHhDOCwweEJBLDB4MzIsMHhFNiwKKwkweEMwLDB4MTksMHg5RSwweEEzLDB4NDQsMHg1NCwweDNCLDB4MEIsCisJMHg4QywweEM3LDB4NkIsMHgyOCwweEE3LDB4QkMsMHgxNiwweEFELAorCTB4REIsMHg2NCwweDc0LDB4MTQsMHg5MiwweDBDLDB4NDgsMHhCOCwKKwkweDlGLDB4QkQsMHg0MywweEM0LDB4MzksMHgzMSwweEQzLDB4RjIsCisJMHhENSwweDhCLDB4NkUsMHhEQSwweDAxLDB4QjEsMHg5QywweDQ5LAorCTB4RDgsMHhBQywweEYzLDB4Q0YsMHhDQSwweEY0LDB4NDcsMHgxMCwKKwkweDZGLDB4RjAsMHg0QSwweDVDLDB4MzgsMHg1NywweDczLDB4OTcsCisJMHhDQiwweEExLDB4RTgsMHgzRSwweDk2LDB4NjEsMHgwRCwweDBGLAorCTB4RTAsMHg3QywweDcxLDB4Q0MsMHg5MCwweDA2LDB4RjcsMHgxQywKKwkweEMyLDB4NkEsMHhBRSwweDY5LDB4MTcsMHg5OSwweDNBLDB4MjcsCisJMHhEOSwweEVCLDB4MkIsMHgyMiwweEQyLDB4QTksMHgwNywweDMzLAorCTB4MkQsMHgzQywweDE1LDB4QzksMHg4NywweEFBLDB4NTAsMHhBNSwKKwkweDAzLDB4NTksMHgwOSwweDFBLDB4NjUsMHhENywweDg0LDB4RDAsCisJMHg4MiwweDI5LDB4NUEsMHgxRSwweDdCLDB4QTgsMHg2RCwweDJDCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKiogU0JPWCBUYWJsZSAqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK1VDSEFSIFNib3hUYWJsZVsyNTZdID0KK3sKKwkweDYzLCAweDdjLCAweDc3LCAweDdiLCAweGYyLCAweDZiLCAweDZmLCAweGM1LAorCTB4MzAsIDB4MDEsIDB4NjcsIDB4MmIsIDB4ZmUsIDB4ZDcsIDB4YWIsIDB4NzYsCisJMHhjYSwgMHg4MiwgMHhjOSwgMHg3ZCwgMHhmYSwgMHg1OSwgMHg0NywgMHhmMCwKKwkweGFkLCAweGQ0LCAweGEyLCAweGFmLCAweDljLCAweGE0LCAweDcyLCAweGMwLAorCTB4YjcsIDB4ZmQsIDB4OTMsIDB4MjYsIDB4MzYsIDB4M2YsIDB4ZjcsIDB4Y2MsCisJMHgzNCwgMHhhNSwgMHhlNSwgMHhmMSwgMHg3MSwgMHhkOCwgMHgzMSwgMHgxNSwKKwkweDA0LCAweGM3LCAweDIzLCAweGMzLCAweDE4LCAweDk2LCAweDA1LCAweDlhLAorCTB4MDcsIDB4MTIsIDB4ODAsIDB4ZTIsIDB4ZWIsIDB4MjcsIDB4YjIsIDB4NzUsCisJMHgwOSwgMHg4MywgMHgyYywgMHgxYSwgMHgxYiwgMHg2ZSwgMHg1YSwgMHhhMCwKKwkweDUyLCAweDNiLCAweGQ2LCAweGIzLCAweDI5LCAweGUzLCAweDJmLCAweDg0LAorCTB4NTMsIDB4ZDEsIDB4MDAsIDB4ZWQsIDB4MjAsIDB4ZmMsIDB4YjEsIDB4NWIsCisJMHg2YSwgMHhjYiwgMHhiZSwgMHgzOSwgMHg0YSwgMHg0YywgMHg1OCwgMHhjZiwKKwkweGQwLCAweGVmLCAweGFhLCAweGZiLCAweDQzLCAweDRkLCAweDMzLCAweDg1LAorCTB4NDUsIDB4ZjksIDB4MDIsIDB4N2YsIDB4NTAsIDB4M2MsIDB4OWYsIDB4YTgsCisJMHg1MSwgMHhhMywgMHg0MCwgMHg4ZiwgMHg5MiwgMHg5ZCwgMHgzOCwgMHhmNSwKKwkweGJjLCAweGI2LCAweGRhLCAweDIxLCAweDEwLCAweGZmLCAweGYzLCAweGQyLAorCTB4Y2QsIDB4MGMsIDB4MTMsIDB4ZWMsIDB4NWYsIDB4OTcsIDB4NDQsIDB4MTcsCisJMHhjNCwgMHhhNywgMHg3ZSwgMHgzZCwgMHg2NCwgMHg1ZCwgMHgxOSwgMHg3MywKKwkweDYwLCAweDgxLCAweDRmLCAweGRjLCAweDIyLCAweDJhLCAweDkwLCAweDg4LAorCTB4NDYsIDB4ZWUsIDB4YjgsIDB4MTQsIDB4ZGUsIDB4NWUsIDB4MGIsIDB4ZGIsCisJMHhlMCwgMHgzMiwgMHgzYSwgMHgwYSwgMHg0OSwgMHgwNiwgMHgyNCwgMHg1YywKKwkweGMyLCAweGQzLCAweGFjLCAweDYyLCAweDkxLCAweDk1LCAweGU0LCAweDc5LAorCTB4ZTcsIDB4YzgsIDB4MzcsIDB4NmQsIDB4OGQsIDB4ZDUsIDB4NGUsIDB4YTksCisJMHg2YywgMHg1NiwgMHhmNCwgMHhlYSwgMHg2NSwgMHg3YSwgMHhhZSwgMHgwOCwKKwkweGJhLCAweDc4LCAweDI1LCAweDJlLCAweDFjLCAweGE2LCAweGI0LCAweGM2LAorCTB4ZTgsIDB4ZGQsIDB4NzQsIDB4MWYsIDB4NGIsIDB4YmQsIDB4OGIsIDB4OGEsCisJMHg3MCwgMHgzZSwgMHhiNSwgMHg2NiwgMHg0OCwgMHgwMywgMHhmNiwgMHgwZSwKKwkweDYxLCAweDM1LCAweDU3LCAweGI5LCAweDg2LCAweGMxLCAweDFkLCAweDllLAorCTB4ZTEsIDB4ZjgsIDB4OTgsIDB4MTEsIDB4NjksIDB4ZDksIDB4OGUsIDB4OTQsCisJMHg5YiwgMHgxZSwgMHg4NywgMHhlOSwgMHhjZSwgMHg1NSwgMHgyOCwgMHhkZiwKKwkweDhjLCAweGExLCAweDg5LCAweDBkLCAweGJmLCAweGU2LCAweDQyLCAweDY4LAorCTB4NDEsIDB4OTksIDB4MmQsIDB4MGYsIDB4YjAsIDB4NTQsIDB4YmIsIDB4MTYKK307CisKK1ZPSUQgeG9yXzMyKAorCUlOICBQVUNIQVIgICAgICAgICAgICAgIGEsCisJSU4gIFBVQ0hBUiAgICAgICAgICAgICAgYiwKKwlPVVQgUFVDSEFSICAgICAgICAgICAgICBvdXQpOworCitWT0lEIHhvcl8xMjgoCisJSU4gIFBVQ0hBUiAgICAgICAgICAgICAgYSwKKwlJTiAgUFVDSEFSICAgICAgICAgICAgICBiLAorCU9VVCBQVUNIQVIgICAgICAgICAgICAgIG91dCk7CisKK1ZPSUQgbmV4dF9rZXkoCisJSU4gIFBVQ0hBUiAgICAgICAgICAgICAga2V5LAorCUlOICBJTlQgICAgICAgICAgICAgICAgIHJvdW5kKTsKKworVk9JRCBieXRlX3N1YigKKwlJTiAgUFVDSEFSICAgICAgICAgICAgICBpbiwKKwlPVVQgUFVDSEFSICAgICAgICAgICAgICBvdXQpOworCitWT0lEIHNoaWZ0X3JvdygKKwlJTiAgUFVDSEFSICAgICAgICAgICAgICBpbiwKKwlPVVQgUFVDSEFSICAgICAgICAgICAgICBvdXQpOworCitWT0lEIG1peF9jb2x1bW4oCisJSU4gIFBVQ0hBUiAgICAgICAgICAgICAgaW4sCisJT1VUIFBVQ0hBUiAgICAgICAgICAgICAgb3V0KTsKKworVUNIQVIgUlRNUENraXBTYm94KAorCUlOICBVQ0hBUiAgICAgICAgICAgICAgIGEpOworLy8KKy8vIEV4cGFuZGVkIElWIGZvciBUS0lQIGZ1bmN0aW9uLgorLy8KK3R5cGVkZWYJc3RydWN0CVBBQ0tFRCBfSVZfQ09OVFJPTF8KK3sKKwl1bmlvbiBQQUNLRUQKKwl7CisJCXN0cnVjdCBQQUNLRUQKKwkJeworCQkJVUNIQVIJCXJjMDsKKwkJCVVDSEFSCQlyYzE7CisJCQlVQ0hBUgkJcmMyOworCisJCQl1bmlvbiBQQUNLRUQKKwkJCXsKKwkJCQlzdHJ1Y3QgUEFDS0VECisJCQkJeworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwkJCQkJVUNIQVIJS2V5SUQ6MjsKKwkJCQkJVUNIQVIJRXh0SVY6MTsKKwkJCQkJVUNIQVIJUnN2ZDo1OworI2Vsc2UKKwkJCQkJVUNIQVIJUnN2ZDo1OworCQkJCQlVQ0hBUglFeHRJVjoxOworCQkJCQlVQ0hBUglLZXlJRDoyOworI2VuZGlmCisJCQkJfQlmaWVsZDsKKwkJCQlVQ0hBUgkJQnl0ZTsKKwkJCX0JQ09OVFJPTDsKKwkJfQlmaWVsZDsKKworCQlVTE9ORwl3b3JkOworCX0JSVYxNjsKKworCVVMT05HCUlWMzI7Cit9CVRLSVBfSVYsICpQVEtJUF9JVjsKKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZQlEZXNjcmlwdGlvbjoKKwkJQ29udmVydCBmcm9tIFVDSEFSW10gdG8gVUxPTkcgaW4gYSBwb3J0YWJsZSB3YXkKKworCUFyZ3VtZW50czoKKyAgICAgIHBNSUNLZXkJCXBvaW50ZXIgdG8gTUlDIEtleQorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVUxPTkcJUlRNUFRraXBHZXRVSW50MzIoCisJSU4JUFVDSEFSCXBNSUNLZXkpCit7CisJVUxPTkcJcmVzID0gMDsKKwlJTlQJCWk7CisKKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorCXsKKwkJcmVzIHw9ICgqcE1JQ0tleSsrKSA8PCAoOCAqIGkpOworCX0KKworCXJldHVybiByZXM7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lCURlc2NyaXB0aW9uOgorCQlDb252ZXJ0IGZyb20gVUxPTkcgdG8gVUNIQVJbXSBpbiBhIHBvcnRhYmxlIHdheQorCisJQXJndW1lbnRzOgorICAgICAgcERzdAkJCXBvaW50ZXIgdG8gZGVzdGluYXRpb24gZm9yIGNvbnZlcnQgVUxPTkcgdG8gVUNIQVJbXQorICAgICAgdmFsCQkJdGhlIHZhbHVlIGZvciBjb252ZXJ0CisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJUlRNUFRraXBQdXRVSW50MzIoCisJSU4gT1VUCVBVQ0hBUgkJcERzdCwKKwlJTgkJVUxPTkcJCXZhbCkKK3sKKwlJTlQgaTsKKworCWZvcihpID0gMDsgaSA8IDQ7IGkrKykKKwl7CisJCSpwRHN0KysgPSAoVUNIQVIpICh2YWwgJiAweGZmKTsKKwkJdmFsID4+PSA4OworCX0KK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUJRGVzY3JpcHRpb246CisJCVNldCB0aGUgTUlDIEtleS4KKworCUFyZ3VtZW50czoKKyAgICAgIHBBZAkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorICAgICAgcE1JQ0tleQkJcG9pbnRlciB0byBNSUMgS2V5CisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgUlRNUFRraXBTZXRNSUNLZXkoCisJSU4JUFRLSVBfS0VZX0lORk8JcFRraXAsCisJSU4JUFVDSEFSCQkJcE1JQ0tleSkKK3sKKwkvLyBTZXQgdGhlIGtleQorCXBUa2lwLT5LMCA9IFJUTVBUa2lwR2V0VUludDMyKHBNSUNLZXkpOworCXBUa2lwLT5LMSA9IFJUTVBUa2lwR2V0VUludDMyKHBNSUNLZXkgKyA0KTsKKwkvLyBhbmQgcmVzZXQgdGhlIG1lc3NhZ2UKKwlwVGtpcC0+TCA9IHBUa2lwLT5LMDsKKwlwVGtpcC0+UiA9IHBUa2lwLT5LMTsKKwlwVGtpcC0+bkJ5dGVzSW5NID0gMDsKKwlwVGtpcC0+TSA9IDA7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lCURlc2NyaXB0aW9uOgorCQlDYWxjdWxhdGUgdGhlIE1JQyBWYWx1ZS4KKworCUFyZ3VtZW50czoKKyAgICAgIHBBZAkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorICAgICAgdUNoYXIJCQlBcHBlbmQgdGhpcyB1Q2hhcgorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECVJUTVBUa2lwQXBwZW5kQnl0ZSgKKwlJTglQVEtJUF9LRVlfSU5GTwlwVGtpcCwKKwlJTglVQ0hBUiAJCQl1Q2hhcikKK3sKKwkvLyBBcHBlbmQgdGhlIGJ5dGUgdG8gb3VyIHdvcmQtc2l6ZWQgYnVmZmVyCisJcFRraXAtPk0gfD0gKHVDaGFyIDw8ICg4KiBwVGtpcC0+bkJ5dGVzSW5NKSk7CisJcFRraXAtPm5CeXRlc0luTSsrOworCS8vIFByb2Nlc3MgdGhlIHdvcmQgaWYgaXQgaXMgZnVsbC4KKwlpZiggcFRraXAtPm5CeXRlc0luTSA+PSA0ICkKKwl7CisJCXBUa2lwLT5MIF49IHBUa2lwLT5NOworCQlwVGtpcC0+UiBePSBST0wzMiggcFRraXAtPkwsIDE3ICk7CisJCXBUa2lwLT5MICs9IHBUa2lwLT5SOworCQlwVGtpcC0+UiBePSAoKHBUa2lwLT5MICYgMHhmZjAwZmYwMCkgPj4gOCkgfCAoKHBUa2lwLT5MICYgMHgwMGZmMDBmZikgPDwgOCk7CisJCXBUa2lwLT5MICs9IHBUa2lwLT5SOworCQlwVGtpcC0+UiBePSBST0wzMiggcFRraXAtPkwsIDMgKTsKKwkJcFRraXAtPkwgKz0gcFRraXAtPlI7CisJCXBUa2lwLT5SIF49IFJPUjMyKCBwVGtpcC0+TCwgMiApOworCQlwVGtpcC0+TCArPSBwVGtpcC0+UjsKKwkJLy8gQ2xlYXIgdGhlIGJ1ZmZlcgorCQlwVGtpcC0+TSA9IDA7CisJCXBUa2lwLT5uQnl0ZXNJbk0gPSAwOworCX0KK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUJRGVzY3JpcHRpb246CisJCUNhbGN1bGF0ZSB0aGUgTUlDIFZhbHVlLgorCisJQXJndW1lbnRzOgorICAgICAgcEFkCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisgICAgICBwU3JjCQkJUG9pbnRlciB0byBzb3VyY2UgZGF0YSBmb3IgQ2FsY3VsYXRlIE1JQyBWYWx1ZQorICAgICAgTGVuCQkJSW5kaWNhdGUgdGhlIGxlbmd0aCBvZiB0aGUgc291cmNlIGRhdGEKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlSVE1QVGtpcEFwcGVuZCgKKwlJTglQVEtJUF9LRVlfSU5GTwlwVGtpcCwKKwlJTglQVUNIQVIJCQlwU3JjLAorCUlOCVVJTlQJCQluQnl0ZXMpCit7CisJLy8gVGhpcyBpcyBzaW1wbGUKKwl3aGlsZShuQnl0ZXMgPiAwKQorCXsKKwkJUlRNUFRraXBBcHBlbmRCeXRlKHBUa2lwLCAqcFNyYysrKTsKKwkJbkJ5dGVzLS07CisJfQorfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZQlEZXNjcmlwdGlvbjoKKwkJR2V0IHRoZSBNSUMgVmFsdWUuCisKKwlBcmd1bWVudHM6CisgICAgICBwQWQJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwlOb3RlOgorCQl0aGUgTUlDIFZhbHVlIGlzIHN0b3JlIGluIHBBZC0+UHJpdmF0ZUluZm8uTUlDCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlSVE1QVGtpcEdldE1JQygKKwlJTglQVEtJUF9LRVlfSU5GTwlwVGtpcCkKK3sKKwkvLyBBcHBlbmQgdGhlIG1pbmltdW0gcGFkZGluZworCVJUTVBUa2lwQXBwZW5kQnl0ZShwVGtpcCwgMHg1YSApOworCVJUTVBUa2lwQXBwZW5kQnl0ZShwVGtpcCwgMCApOworCVJUTVBUa2lwQXBwZW5kQnl0ZShwVGtpcCwgMCApOworCVJUTVBUa2lwQXBwZW5kQnl0ZShwVGtpcCwgMCApOworCVJUTVBUa2lwQXBwZW5kQnl0ZShwVGtpcCwgMCApOworCS8vIGFuZCB0aGVuIHplcm9lcyB1bnRpbCB0aGUgbGVuZ3RoIGlzIGEgbXVsdGlwbGUgb2YgNAorCXdoaWxlKCBwVGtpcC0+bkJ5dGVzSW5NICE9IDAgKQorCXsKKwkJUlRNUFRraXBBcHBlbmRCeXRlKHBUa2lwLCAwICk7CisJfQorCS8vIFRoZSBhcHBlbmRCeXRlIGZ1bmN0aW9uIGhhcyBhbHJlYWR5IGNvbXB1dGVkIHRoZSByZXN1bHQuCisJUlRNUFRraXBQdXRVSW50MzIocFRraXAtPk1JQywgcFRraXAtPkwpOworCVJUTVBUa2lwUHV0VUludDMyKHBUa2lwLT5NSUMgKyA0LCBwVGtpcC0+Uik7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lCURlc2NyaXB0aW9uOgorCQlJbml0IFRraXAgZnVuY3Rpb24uCisKKwlBcmd1bWVudHM6CisgICAgICBwQWQJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKwkJcFRLZXkgICAgICAgUG9pbnRlciB0byB0aGUgVGVtcG9yYWwgS2V5IChUSyksIFRLIHNoYWxsIGJlIDEyOGJpdHMuCisJCUtleUlkCQlUSyBLZXkgSUQKKwkJcFRBCQkJUG9pbnRlciB0byB0cmFuc21pdHRlciBhZGRyZXNzCisJCXBNSUNLZXkJCXBvaW50ZXIgdG8gTUlDIEtleQorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECVJUTVBJbml0VGtpcEVuZ2luZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlwS2V5LAorCUlOCVVDSEFSCQkJS2V5SWQsCisJSU4JUFVDSEFSCQkJcFRBLAorCUlOCVBVQ0hBUgkJCXBNSUNLZXksCisJSU4JUFVDSEFSCQkJcFRTQywKKwlPVVQJUFVMT05HCQkJcElWMTYsCisJT1VUCVBVTE9ORwkJCXBJVjMyKQoreworCVRLSVBfSVYJdGtpcEl2OworCisJLy8gUHJlcGFyZSA4IGJ5dGVzIFRLSVAgZW5jYXBzdWxhdGlvbiBmb3IgTVBEVQorCU5kaXNaZXJvTWVtb3J5KCZ0a2lwSXYsIHNpemVvZihUS0lQX0lWKSk7CisJdGtpcEl2LklWMTYuZmllbGQucmMwID0gKihwVFNDICsgMSk7CisJdGtpcEl2LklWMTYuZmllbGQucmMxID0gKHRraXBJdi5JVjE2LmZpZWxkLnJjMCB8IDB4MjApICYgMHg3ZjsKKwl0a2lwSXYuSVYxNi5maWVsZC5yYzIgPSAqcFRTQzsKKwl0a2lwSXYuSVYxNi5maWVsZC5DT05UUk9MLmZpZWxkLkV4dElWID0gMTsgIC8vIDA6IG5vbi1leHRlbmRlZCBJViwgMTogYW4gZXh0ZW5kZWQgSVYKKwl0a2lwSXYuSVYxNi5maWVsZC5DT05UUk9MLmZpZWxkLktleUlEID0gS2V5SWQ7CisvLwl0a2lwSXYuSVYzMiA9ICooUFVMT05HKShwVFNDICsgMik7CisJTmRpc01vdmVNZW1vcnkoJnRraXBJdi5JVjMyLCAocFRTQyArIDIpLCA0KTsgICAvLyBDb3B5IElWCisKKwkqcElWMTYgPSB0a2lwSXYuSVYxNi53b3JkOworCSpwSVYzMiA9IHRraXBJdi5JVjMyOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZQlEZXNjcmlwdGlvbjoKKwkJSW5pdCBNSUMgVmFsdWUgY2FsY3VsYXRpb24gZnVuY3Rpb24gd2hpY2ggaW5jbHVkZSBzZXQgTUlDIGtleSAmCisJCWNhbGN1bGF0ZSBmaXJzdCAxNiBieXRlcyAoREEgKyBTQSArIHByaW9yaXR5ICsgIDApCisKKwlBcmd1bWVudHM6CisgICAgICBwQWQJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKwkJcFRLZXkgICAgICAgUG9pbnRlciB0byB0aGUgVGVtcG9yYWwgS2V5IChUSyksIFRLIHNoYWxsIGJlIDEyOGJpdHMuCisJCXBEQQkJCVBvaW50ZXIgdG8gREEgYWRkcmVzcworCQlwU0EJCQlQb2ludGVyIHRvIFNBIGFkZHJlc3MKKwkJcE1JQ0tleQkJcG9pbnRlciB0byBNSUMgS2V5CisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECVJUTVBJbml0TUlDRW5naW5lKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCXBLZXksCisJSU4JUFVDSEFSCQkJcERBLAorCUlOCVBVQ0hBUgkJCXBTQSwKKwlJTiAgVUNIQVIgICAgICAgICAgIFVzZXJQcmlvcml0eSwKKwlJTglQVUNIQVIJCQlwTUlDS2V5KQoreworCVVMT05HIFByaW9yaXR5ID0gVXNlclByaW9yaXR5OworCisJLy8gSW5pdCBNSUMgdmFsdWUgY2FsY3VsYXRpb24KKwlSVE1QVGtpcFNldE1JQ0tleSgmcEFkLT5Qcml2YXRlSW5mby5UeCwgcE1JQ0tleSk7CisJLy8gREEKKwlSVE1QVGtpcEFwcGVuZCgmcEFkLT5Qcml2YXRlSW5mby5UeCwgcERBLCBNQUNfQUREUl9MRU4pOworCS8vIFNBCisJUlRNUFRraXBBcHBlbmQoJnBBZC0+UHJpdmF0ZUluZm8uVHgsIHBTQSwgTUFDX0FERFJfTEVOKTsKKwkvLyBQcmlvcml0eSArIDMgYnl0ZXMgb2YgMAorCVJUTVBUa2lwQXBwZW5kKCZwQWQtPlByaXZhdGVJbmZvLlR4LCAoUFVDSEFSKSZQcmlvcml0eSwgNCk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lCURlc2NyaXB0aW9uOgorCQlDb21wYXJlIE1JQyB2YWx1ZSBvZiByZWNlaXZlZCBNU0RVCisKKwlBcmd1bWVudHM6CisJCXBBZAlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisJCXBTcmMgICAgICAgIFBvaW50ZXIgdG8gdGhlIHJlY2VpdmVkIFBsYWluIHRleHQgZGF0YQorCQlwREEJCQlQb2ludGVyIHRvIERBIGFkZHJlc3MKKwkJcFNBCQkJUG9pbnRlciB0byBTQSBhZGRyZXNzCisJCXBNSUNLZXkJCXBvaW50ZXIgdG8gTUlDIEtleQorCQlMZW4gICAgICAgICB0aGUgbGVuZ3RoIG9mIHRoZSByZWNlaXZlZCBwbGFpbiB0ZXh0IGRhdGEgZXhjbHVkZSBNSUMgdmFsdWUKKworCVJldHVybiBWYWx1ZToKKwkJVFJVRSAgICAgICAgTUlDIHZhbHVlIG1hdGNoZWQKKwkJRkFMU0UgICAgICAgTUlDIHZhbHVlIG1pc21hdGNoZWQKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0JPT0xFQU4JUlRNUFRraXBDb21wYXJlTUlDVmFsdWUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJcFNyYywKKwlJTglQVUNIQVIJCQlwREEsCisJSU4JUFVDSEFSCQkJcFNBLAorCUlOCVBVQ0hBUgkJCXBNSUNLZXksCisJSU4JVUNIQVIJCQlVc2VyUHJpb3JpdHksCisJSU4JVUlOVAkJCUxlbikKK3sKKwlVQ0hBUglPbGRNaWNbOF07CisJVUxPTkcJUHJpb3JpdHkgPSBVc2VyUHJpb3JpdHk7CisKKwkvLyBJbml0IE1JQyB2YWx1ZSBjYWxjdWxhdGlvbgorCVJUTVBUa2lwU2V0TUlDS2V5KCZwQWQtPlByaXZhdGVJbmZvLlJ4LCBwTUlDS2V5KTsKKwkvLyBEQQorCVJUTVBUa2lwQXBwZW5kKCZwQWQtPlByaXZhdGVJbmZvLlJ4LCBwREEsIE1BQ19BRERSX0xFTik7CisJLy8gU0EKKwlSVE1QVGtpcEFwcGVuZCgmcEFkLT5Qcml2YXRlSW5mby5SeCwgcFNBLCBNQUNfQUREUl9MRU4pOworCS8vIFByaW9yaXR5ICsgMyBieXRlcyBvZiAwCisJUlRNUFRraXBBcHBlbmQoJnBBZC0+UHJpdmF0ZUluZm8uUngsIChQVUNIQVIpJlByaW9yaXR5LCA0KTsKKworCS8vIENhbGN1bGF0ZSBNSUMgdmFsdWUgZnJvbSBwbGFpbiB0ZXh0IGRhdGEKKwlSVE1QVGtpcEFwcGVuZCgmcEFkLT5Qcml2YXRlSW5mby5SeCwgcFNyYywgTGVuKTsKKworCS8vIEdldCBNSUMgdmFsdWRlIGZyb20gcmVjZWl2ZWQgZnJhbWUKKwlOZGlzTW92ZU1lbW9yeShPbGRNaWMsIHBTcmMgKyBMZW4sIDgpOworCisJLy8gR2V0IE1JQyB2YWx1ZSBmcm9tIGRlY3J5cHRlZCBwbGFpbiBkYXRhCisJUlRNUFRraXBHZXRNSUMoJnBBZC0+UHJpdmF0ZUluZm8uUngpOworCisJLy8gTW92ZSBNSUMgdmFsdWUgZnJvbSBNU0RVLCB0aGlzIHN0ZXBzIHNob3VsZCBtb3ZlIHRvIGRhdGEgcGF0aC4KKwkvLyBTaW5jZSB0aGUgTUlDIHZhbHVlIG1pZ2h0IGNyb3NzIE1QRFVzLgorCWlmKCFOZGlzRXF1YWxNZW1vcnkocEFkLT5Qcml2YXRlSW5mby5SeC5NSUMsIE9sZE1pYywgOCkpCisJeworCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgiUlRNUFRraXBDb21wYXJlTUlDVmFsdWUoKTogVEtJUCBNSUMgRXJyb3IgIVxuIikpOyAgLy9NSUMgZXJyb3IuCisKKworCQlyZXR1cm4gKEZBTFNFKTsKKwl9CisJcmV0dXJuIChUUlVFKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUJRGVzY3JpcHRpb246CisJCUNvbXBhcmUgTUlDIHZhbHVlIG9mIHJlY2VpdmVkIE1TRFUKKworCUFyZ3VtZW50czoKKwkJcEFkCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKwkJcExMQwkJTExDIGhlYWRlcgorCQlwU3JjICAgICAgICBQb2ludGVyIHRvIHRoZSByZWNlaXZlZCBQbGFpbiB0ZXh0IGRhdGEKKwkJcERBCQkJUG9pbnRlciB0byBEQSBhZGRyZXNzCisJCXBTQQkJCVBvaW50ZXIgdG8gU0EgYWRkcmVzcworCQlwTUlDS2V5CQlwb2ludGVyIHRvIE1JQyBLZXkKKwkJTGVuICAgICAgICAgdGhlIGxlbmd0aCBvZiB0aGUgcmVjZWl2ZWQgcGxhaW4gdGV4dCBkYXRhIGV4Y2x1ZGUgTUlDIHZhbHVlCisKKwlSZXR1cm4gVmFsdWU6CisJCVRSVUUgICAgICAgIE1JQyB2YWx1ZSBtYXRjaGVkCisJCUZBTFNFICAgICAgIE1JQyB2YWx1ZSBtaXNtYXRjaGVkCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitCT09MRUFOCVJUTVBUa2lwQ29tcGFyZU1JQ1ZhbHVlV2l0aExMQygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlwTExDLAorCUlOCVBVQ0hBUgkJCXBTcmMsCisJSU4JUFVDSEFSCQkJcERBLAorCUlOCVBVQ0hBUgkJCXBTQSwKKwlJTglQVUNIQVIJCQlwTUlDS2V5LAorCUlOCVVJTlQJCQlMZW4pCit7CisJVUNIQVIJT2xkTWljWzhdOworCVVMT05HCVByaW9yaXR5ID0gMDsKKworCS8vIEluaXQgTUlDIHZhbHVlIGNhbGN1bGF0aW9uCisJUlRNUFRraXBTZXRNSUNLZXkoJnBBZC0+UHJpdmF0ZUluZm8uUngsIHBNSUNLZXkpOworCS8vIERBCisJUlRNUFRraXBBcHBlbmQoJnBBZC0+UHJpdmF0ZUluZm8uUngsIHBEQSwgTUFDX0FERFJfTEVOKTsKKwkvLyBTQQorCVJUTVBUa2lwQXBwZW5kKCZwQWQtPlByaXZhdGVJbmZvLlJ4LCBwU0EsIE1BQ19BRERSX0xFTik7CisJLy8gUHJpb3JpdHkgKyAzIGJ5dGVzIG9mIDAKKwlSVE1QVGtpcEFwcGVuZCgmcEFkLT5Qcml2YXRlSW5mby5SeCwgKFBVQ0hBUikmUHJpb3JpdHksIDQpOworCisJLy8gU3RhcnQgd2l0aCBMTEMgaGVhZGVyCisJUlRNUFRraXBBcHBlbmQoJnBBZC0+UHJpdmF0ZUluZm8uUngsIHBMTEMsIDgpOworCisJLy8gQ2FsY3VsYXRlIE1JQyB2YWx1ZSBmcm9tIHBsYWluIHRleHQgZGF0YQorCVJUTVBUa2lwQXBwZW5kKCZwQWQtPlByaXZhdGVJbmZvLlJ4LCBwU3JjLCBMZW4pOworCisJLy8gR2V0IE1JQyB2YWx1ZGUgZnJvbSByZWNlaXZlZCBmcmFtZQorCU5kaXNNb3ZlTWVtb3J5KE9sZE1pYywgcFNyYyArIExlbiwgOCk7CisKKwkvLyBHZXQgTUlDIHZhbHVlIGZyb20gZGVjcnlwdGVkIHBsYWluIGRhdGEKKwlSVE1QVGtpcEdldE1JQygmcEFkLT5Qcml2YXRlSW5mby5SeCk7CisKKwkvLyBNb3ZlIE1JQyB2YWx1ZSBmcm9tIE1TRFUsIHRoaXMgc3RlcHMgc2hvdWxkIG1vdmUgdG8gZGF0YSBwYXRoLgorCS8vIFNpbmNlIHRoZSBNSUMgdmFsdWUgbWlnaHQgY3Jvc3MgTVBEVXMuCisJaWYoIU5kaXNFcXVhbE1lbW9yeShwQWQtPlByaXZhdGVJbmZvLlJ4Lk1JQywgT2xkTWljLCA4KSkKKwl7CisJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwgKCJSVE1QVGtpcENvbXBhcmVNSUNWYWx1ZVdpdGhMTEMoKTogVEtJUCBNSUMgRXJyb3IgIVxuIikpOyAgLy9NSUMgZXJyb3IuCisKKworCQlyZXR1cm4gKEZBTFNFKTsKKwl9CisJcmV0dXJuIChUUlVFKTsKK30KKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lCURlc2NyaXB0aW9uOgorCQlDb3B5IGZyYW1lIGZyb20gd2FpdGluZyBxdWV1ZSBpbnRvIHJlbGF0aXZlIHJpbmcgYnVmZmVyIGFuZCBzZXQKKwlhcHByb3ByaWF0ZSBBU0lDIHJlZ2lzdGVyIHRvIGtpY2sgaGFyZHdhcmUgdHJhbnNtaXQgZnVuY3Rpb24KKworCUFyZ3VtZW50czoKKwkJcEFkCQlQb2ludGVyCXRvIG91ciBhZGFwdGVyCisJCVBORElTX1BBQ0tFVAlQb2ludGVyIHRvIE5kaXMgUGFja2V0IGZvciBNSUMgY2FsY3VsYXRpb24KKwkJcEVuY2FwCQkJUG9pbnRlciB0byBMTEMgZW5jYXAgZGF0YQorCQlMZW5FbmNhcAkJVG90YWwgZW5jYXAgbGVuZ3RoLCBtaWdodCBiZSAwIHdoaWNoIGluZGljYXRlcyBubyBlbmNhcAorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECVJUTVBDYWxjdWxhdGVNSUNWYWx1ZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQTkRJU19QQUNLRVQJcFBhY2tldCwKKwlJTglQVUNIQVIJCQlwRW5jYXAsCisJSU4JUENJUEhFUl9LRVkJCXBLZXksCisJSU4JVUNIQVIJCQlhcGlkeCkKK3sKKwlQQUNLRVRfSU5GTwkJUGFja2V0SW5mbzsKKwlQVUNIQVIJCQlwU3JjQnVmVkE7CisJVUlOVAkJCVNyY0J1ZkxlbjsKKwlQVUNIQVIJCQlwU3JjOworICAgIFVDSEFSICAgICAgICAgICBVc2VyUHJpb3JpdHk7CisJVUNIQVIJCQl2bGFuX29mZnNldCA9IDA7CisKKwlSVE1QX1F1ZXJ5UGFja2V0SW5mbyhwUGFja2V0LCAmUGFja2V0SW5mbywgJnBTcmNCdWZWQSwgJlNyY0J1Zkxlbik7CisKKwlVc2VyUHJpb3JpdHkgPSBSVE1QX0dFVF9QQUNLRVRfVVAocFBhY2tldCk7CisJcFNyYyA9IHBTcmNCdWZWQTsKKworCS8vIGRldGVybWluZSBpZiB0aGlzIGlzIGEgdmxhbiBwYWNrZXQKKwlpZiAoKCgqKHBTcmMgKyAxMikgPDwgOCkgKyAqKHBTcmMgKyAxMykpID09IDB4ODEwMCkKKwkJdmxhbl9vZmZzZXQgPSA0OworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJeworCQlSVE1QSW5pdE1JQ0VuZ2luZSgKKwkJCXBBZCwKKwkJCXBLZXktPktleSwKKwkJCXBTcmMsCisJCQlwU3JjICsgNiwKKwkJCVVzZXJQcmlvcml0eSwKKwkJCXBLZXktPlR4TWljKTsKKwl9CisKKworCWlmIChwRW5jYXAgIT0gTlVMTCkKKwl7CisJCS8vIExMQyBlbmNhcHN1bGF0aW9uCisJCVJUTVBUa2lwQXBwZW5kKCZwQWQtPlByaXZhdGVJbmZvLlR4LCBwRW5jYXAsIDYpOworCQkvLyBQcm90b2NvbCBUeXBlCisJCVJUTVBUa2lwQXBwZW5kKCZwQWQtPlByaXZhdGVJbmZvLlR4LCBwU3JjICsgMTIgKyB2bGFuX29mZnNldCwgMik7CisJfQorCVNyY0J1ZkxlbiAtPSAoMTQgKyB2bGFuX29mZnNldCk7CisJcFNyYyArPSAoMTQgKyB2bGFuX29mZnNldCk7CisJZG8KKwl7CisJCWlmIChTcmNCdWZMZW4gPiAwKQorCQl7CisJCQlSVE1QVGtpcEFwcGVuZCgmcEFkLT5Qcml2YXRlSW5mby5UeCwgcFNyYywgU3JjQnVmTGVuKTsKKwkJfQorCisJCWJyZWFrOwkvLyBObyBuZWVkIGhhbmRsZSBuZXh0IHBhY2tldAorCisJfQl3aGlsZSAoVFJVRSk7CQkvLyBFbmQgb2YgY29weWluZyBwYXlsb2FkCisKKwkvLyBDb21wdXRlIHRoZSBmaW5hbCBNSUMgVmFsdWUKKwlSVE1QVGtpcEdldE1JQygmcEFkLT5Qcml2YXRlSW5mby5UeCk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIHRraXBfc2JveCgpCQkJCQkJCQkJCQkJCQkJCSovCisvKiBSZXR1cm5zIGEgMTYgYml0IHZhbHVlIGZyb20gYSA2NEsgZW50cnkgdGFibGUuIFRoZSBUYWJsZSAqLworLyogaXMgc3ludGhlc2l6ZWQgZnJvbSB0d28gMjU2IGVudHJ5IGJ5dGUgd2lkZSB0YWJsZXMuCQkqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworVUlOVCB0a2lwX3Nib3goVUlOVCBpbmRleCkKK3sKKwlVSU5UIGluZGV4X2xvdzsKKwlVSU5UIGluZGV4X2hpZ2g7CisJVUlOVCBsZWZ0LCByaWdodDsKKworCWluZGV4X2xvdyA9IChpbmRleCAlIDI1Nik7CisJaW5kZXhfaGlnaCA9ICgoaW5kZXggPj4gOCkgJSAyNTYpOworCisJbGVmdCA9IFRraXBfU2JveF9Mb3dlcltpbmRleF9sb3ddICsgKFRraXBfU2JveF9VcHBlcltpbmRleF9sb3ddICogMjU2KTsKKwlyaWdodCA9IFRraXBfU2JveF9VcHBlcltpbmRleF9oaWdoXSArIChUa2lwX1Nib3hfTG93ZXJbaW5kZXhfaGlnaF0gKiAyNTYpOworCisJcmV0dXJuIChsZWZ0IF4gcmlnaHQpOworfQorCitVSU5UIHJvdHIxKFVJTlQgYSkKK3sKKwl1bnNpZ25lZCBpbnQgYjsKKworCWlmICgoYSAmIDB4MDEpID09IDB4MDEpCisJeworCQliID0gKGEgPj4gMSkgfCAweDgwMDA7CisJfQorCWVsc2UKKwl7CisJCWIgPSAoYSA+PiAxKSAmIDB4N2ZmZjsKKwl9CisJYiA9IGIgJSA2NTUzNjsKKwlyZXR1cm4gYjsKK30KKworVk9JRCBSVE1QVGtpcE1peEtleSgKKwlVQ0hBUiAqa2V5LAorCVVDSEFSICp0YSwKKwlVTE9ORyBwbmwsIC8qIExlYXN0IHNpZ25pZmljYW50IDE2IGJpdHMgb2YgUE4gKi8KKwlVTE9ORyBwbmgsIC8qIE1vc3Qgc2lnbmlmaWNhbnQgMzIgYml0cyBvZiBQTiAqLworCVVDSEFSICpyYzRrZXksCisJVUlOVCAqcDFrKQoreworCisJVUlOVCB0c2MwOworCVVJTlQgdHNjMTsKKwlVSU5UIHRzYzI7CisKKwlVSU5UIHBwazA7CisJVUlOVCBwcGsxOworCVVJTlQgcHBrMjsKKwlVSU5UIHBwazM7CisJVUlOVCBwcGs0OworCVVJTlQgcHBrNTsKKworCUlOVCBpOworCUlOVCBqOworCisJdHNjMCA9ICh1bnNpZ25lZCBpbnQpKChwbmggPj4gMTYpICUgNjU1MzYpOyAvKiBtc2IgKi8KKwl0c2MxID0gKHVuc2lnbmVkIGludCkocG5oICUgNjU1MzYpOworCXRzYzIgPSAodW5zaWduZWQgaW50KShwbmwgJSA2NTUzNik7IC8qIGxzYiAqLworCisJLyogUGhhc2UgMSwgc3RlcCAxICovCisJcDFrWzBdID0gdHNjMTsKKwlwMWtbMV0gPSB0c2MwOworCXAxa1syXSA9IChVSU5UKSh0YVswXSArICh0YVsxXSoyNTYpKTsKKwlwMWtbM10gPSAoVUlOVCkodGFbMl0gKyAodGFbM10qMjU2KSk7CisJcDFrWzRdID0gKFVJTlQpKHRhWzRdICsgKHRhWzVdKjI1NikpOworCisJLyogUGhhc2UgMSwgc3RlcCAyICovCisJZm9yIChpPTA7IGk8ODsgaSsrKQorCXsKKwkJaiA9IDIqKGkgJiAxKTsKKwkJcDFrWzBdID0gKHAxa1swXSArIHRraXBfc2JveCggKHAxa1s0XSBeICgoMjU2KmtleVsxK2pdKSArIGtleVtqXSkpICUgNjU1MzYgKSkgJSA2NTUzNjsKKwkJcDFrWzFdID0gKHAxa1sxXSArIHRraXBfc2JveCggKHAxa1swXSBeICgoMjU2KmtleVs1K2pdKSArIGtleVs0K2pdKSkgJSA2NTUzNiApKSAlIDY1NTM2OworCQlwMWtbMl0gPSAocDFrWzJdICsgdGtpcF9zYm94KCAocDFrWzFdIF4gKCgyNTYqa2V5Wzkral0pICsga2V5Wzgral0pKSAlIDY1NTM2ICkpICUgNjU1MzY7CisJCXAxa1szXSA9IChwMWtbM10gKyB0a2lwX3Nib3goIChwMWtbMl0gXiAoKDI1NiprZXlbMTMral0pICsga2V5WzEyK2pdKSkgJSA2NTUzNiApKSAlIDY1NTM2OworCQlwMWtbNF0gPSAocDFrWzRdICsgdGtpcF9zYm94KCAocDFrWzNdIF4gKCgoMjU2KmtleVsxK2pdKSArIGtleVtqXSkpKSAlIDY1NTM2ICkpICUgNjU1MzY7CisJCXAxa1s0XSA9IChwMWtbNF0gKyBpKSAlIDY1NTM2OworCX0KKworCS8qIFBoYXNlIDIsIFN0ZXAgMSAqLworCXBwazAgPSBwMWtbMF07CisJcHBrMSA9IHAxa1sxXTsKKwlwcGsyID0gcDFrWzJdOworCXBwazMgPSBwMWtbM107CisJcHBrNCA9IHAxa1s0XTsKKwlwcGs1ID0gKHAxa1s0XSArIHRzYzIpICUgNjU1MzY7CisKKwkvKiBQaGFzZTIsIFN0ZXAgMiAqLworCXBwazAgPSBwcGswICsgdGtpcF9zYm94KCAocHBrNSBeICgoMjU2KmtleVsxXSkgKyBrZXlbMF0pKSAlIDY1NTM2KTsKKwlwcGsxID0gcHBrMSArIHRraXBfc2JveCggKHBwazAgXiAoKDI1NiprZXlbM10pICsga2V5WzJdKSkgJSA2NTUzNik7CisJcHBrMiA9IHBwazIgKyB0a2lwX3Nib3goIChwcGsxIF4gKCgyNTYqa2V5WzVdKSArIGtleVs0XSkpICUgNjU1MzYpOworCXBwazMgPSBwcGszICsgdGtpcF9zYm94KCAocHBrMiBeICgoMjU2KmtleVs3XSkgKyBrZXlbNl0pKSAlIDY1NTM2KTsKKwlwcGs0ID0gcHBrNCArIHRraXBfc2JveCggKHBwazMgXiAoKDI1NiprZXlbOV0pICsga2V5WzhdKSkgJSA2NTUzNik7CisJcHBrNSA9IHBwazUgKyB0a2lwX3Nib3goIChwcGs0IF4gKCgyNTYqa2V5WzExXSkgKyBrZXlbMTBdKSkgJSA2NTUzNik7CisKKwlwcGswID0gcHBrMCArIHJvdHIxKHBwazUgXiAoKDI1NiprZXlbMTNdKSArIGtleVsxMl0pKTsKKwlwcGsxID0gcHBrMSArIHJvdHIxKHBwazAgXiAoKDI1NiprZXlbMTVdKSArIGtleVsxNF0pKTsKKwlwcGsyID0gcHBrMiArIHJvdHIxKHBwazEpOworCXBwazMgPSBwcGszICsgcm90cjEocHBrMik7CisJcHBrNCA9IHBwazQgKyByb3RyMShwcGszKTsKKwlwcGs1ID0gcHBrNSArIHJvdHIxKHBwazQpOworCisJLyogUGhhc2UgMiwgU3RlcCAzICovCisgICAgLyogUGhhc2UgMiwgU3RlcCAzICovCisKKwl0c2MwID0gKHVuc2lnbmVkIGludCkoKHBuaCA+PiAxNikgJSA2NTUzNik7IC8qIG1zYiAqLworCXRzYzEgPSAodW5zaWduZWQgaW50KShwbmggJSA2NTUzNik7CisJdHNjMiA9ICh1bnNpZ25lZCBpbnQpKHBubCAlIDY1NTM2KTsgLyogbHNiICovCisKKwlyYzRrZXlbMF0gPSAodHNjMiA+PiA4KSAlIDI1NjsKKwlyYzRrZXlbMV0gPSAoKCh0c2MyID4+IDgpICUgMjU2KSB8IDB4MjApICYgMHg3ZjsKKwlyYzRrZXlbMl0gPSB0c2MyICUgMjU2OworCXJjNGtleVszXSA9ICgocHBrNSBeICgoMjU2KmtleVsxXSkgKyBrZXlbMF0pKSA+PiAxKSAlIDI1NjsKKworCXJjNGtleVs0XSA9IHBwazAgJSAyNTY7CisJcmM0a2V5WzVdID0gKHBwazAgPj4gOCkgJSAyNTY7CisKKwlyYzRrZXlbNl0gPSBwcGsxICUgMjU2OworCXJjNGtleVs3XSA9IChwcGsxID4+IDgpICUgMjU2OworCisJcmM0a2V5WzhdID0gcHBrMiAlIDI1NjsKKwlyYzRrZXlbOV0gPSAocHBrMiA+PiA4KSAlIDI1NjsKKworCXJjNGtleVsxMF0gPSBwcGszICUgMjU2OworCXJjNGtleVsxMV0gPSAocHBrMyA+PiA4KSAlIDI1NjsKKworCXJjNGtleVsxMl0gPSBwcGs0ICUgMjU2OworCXJjNGtleVsxM10gPSAocHBrNCA+PiA4KSAlIDI1NjsKKworCXJjNGtleVsxNF0gPSBwcGs1ICUgMjU2OworCXJjNGtleVsxNV0gPSAocHBrNSA+PiA4KSAlIDI1NjsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogY29uc3RydWN0X21pY19oZWFkZXIxKCkgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEJ1aWxkcyB0aGUgZmlyc3QgTUlDIGhlYWRlciBibG9jayBmcm9tICAgICAgICovCisvKiBoZWFkZXIgZmllbGRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBjb25zdHJ1Y3RfbWljX2hlYWRlcjEoCisJdW5zaWduZWQgY2hhciAqbWljX2hlYWRlcjEsCisJaW50IGhlYWRlcl9sZW5ndGgsCisJdW5zaWduZWQgY2hhciAqbXBkdSkKK3sKKwltaWNfaGVhZGVyMVswXSA9ICh1bnNpZ25lZCBjaGFyKSgoaGVhZGVyX2xlbmd0aCAtIDIpIC8gMjU2KTsKKwltaWNfaGVhZGVyMVsxXSA9ICh1bnNpZ25lZCBjaGFyKSgoaGVhZGVyX2xlbmd0aCAtIDIpICUgMjU2KTsKKwltaWNfaGVhZGVyMVsyXSA9IG1wZHVbMF0gJiAweGNmOyAgICAvKiBNdXRlIENGIHBvbGwgJiBDRiBhY2sgYml0cyAqLworCW1pY19oZWFkZXIxWzNdID0gbXBkdVsxXSAmIDB4Yzc7ICAgIC8qIE11dGUgcmV0cnksIG1vcmUgZGF0YSBhbmQgcHdyIG1ndCBiaXRzICovCisJbWljX2hlYWRlcjFbNF0gPSBtcGR1WzRdOyAgICAgICAvKiBBMSAqLworCW1pY19oZWFkZXIxWzVdID0gbXBkdVs1XTsKKwltaWNfaGVhZGVyMVs2XSA9IG1wZHVbNl07CisJbWljX2hlYWRlcjFbN10gPSBtcGR1WzddOworCW1pY19oZWFkZXIxWzhdID0gbXBkdVs4XTsKKwltaWNfaGVhZGVyMVs5XSA9IG1wZHVbOV07CisJbWljX2hlYWRlcjFbMTBdID0gbXBkdVsxMF07ICAgICAvKiBBMiAqLworCW1pY19oZWFkZXIxWzExXSA9IG1wZHVbMTFdOworCW1pY19oZWFkZXIxWzEyXSA9IG1wZHVbMTJdOworCW1pY19oZWFkZXIxWzEzXSA9IG1wZHVbMTNdOworCW1pY19oZWFkZXIxWzE0XSA9IG1wZHVbMTRdOworCW1pY19oZWFkZXIxWzE1XSA9IG1wZHVbMTVdOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogY29uc3RydWN0X21pY19oZWFkZXIyKCkgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEJ1aWxkcyB0aGUgbGFzdCBNSUMgaGVhZGVyIGJsb2NrIGZyb20gICAgICAgICovCisvKiBoZWFkZXIgZmllbGRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBjb25zdHJ1Y3RfbWljX2hlYWRlcjIoCisJdW5zaWduZWQgY2hhciAqbWljX2hlYWRlcjIsCisJdW5zaWduZWQgY2hhciAqbXBkdSwKKwlpbnQgYTRfZXhpc3RzLAorCWludCBxY19leGlzdHMpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpPDE2OyBpKyspIG1pY19oZWFkZXIyW2ldPTB4MDA7CisKKwltaWNfaGVhZGVyMlswXSA9IG1wZHVbMTZdOyAgICAvKiBBMyAqLworCW1pY19oZWFkZXIyWzFdID0gbXBkdVsxN107CisJbWljX2hlYWRlcjJbMl0gPSBtcGR1WzE4XTsKKwltaWNfaGVhZGVyMlszXSA9IG1wZHVbMTldOworCW1pY19oZWFkZXIyWzRdID0gbXBkdVsyMF07CisJbWljX2hlYWRlcjJbNV0gPSBtcGR1WzIxXTsKKworCS8vIEluIFNlcXVlbmNlIENvbnRyb2wgZmllbGQsIG11dGUgc2VxdWVuY2UgbnVtZXIgYml0cyAoMTItYml0KQorCW1pY19oZWFkZXIyWzZdID0gbXBkdVsyMl0gJiAweDBmOyAgIC8qIFNDICovCisJbWljX2hlYWRlcjJbN10gPSAweDAwOyAvKiBtcGR1WzIzXTsgKi8KKworCWlmICgoIXFjX2V4aXN0cykgJiBhNF9leGlzdHMpCisJeworCQlmb3IgKGk9MDtpPDY7aSsrKSBtaWNfaGVhZGVyMls4K2ldID0gbXBkdVsyNCtpXTsgICAvKiBBNCAqLworCisJfQorCisJaWYgKHFjX2V4aXN0cyAmJiAoIWE0X2V4aXN0cykpCisJeworCQltaWNfaGVhZGVyMls4XSA9IG1wZHVbMjRdICYgMHgwZjsgLyogbXV0ZSBiaXRzIDE1IC0gNCAqLworCQltaWNfaGVhZGVyMls5XSA9IG1wZHVbMjVdICYgMHgwMDsKKwl9CisKKwlpZiAocWNfZXhpc3RzICYmIGE0X2V4aXN0cykKKwl7CisJCWZvciAoaT0wO2k8NjtpKyspIG1pY19oZWFkZXIyWzgraV0gPSBtcGR1WzI0K2ldOyAgIC8qIEE0ICovCisKKwkJbWljX2hlYWRlcjJbMTRdID0gbXBkdVszMF0gJiAweDBmOworCQltaWNfaGVhZGVyMlsxNV0gPSBtcGR1WzMxXSAmIDB4MDA7CisJfQorfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBjb25zdHJ1Y3RfbWljX2l2KCkgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogQnVpbGRzIHRoZSBNSUMgSVYgZnJvbSBoZWFkZXIgZmllbGRzIGFuZCBQTiAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgY29uc3RydWN0X21pY19pdigKKwl1bnNpZ25lZCBjaGFyICptaWNfaXYsCisJaW50IHFjX2V4aXN0cywKKwlpbnQgYTRfZXhpc3RzLAorCXVuc2lnbmVkIGNoYXIgKm1wZHUsCisJdW5zaWduZWQgaW50IHBheWxvYWRfbGVuZ3RoLAorCXVuc2lnbmVkIGNoYXIgKnBuX3ZlY3RvcikKK3sKKwlpbnQgaTsKKworCW1pY19pdlswXSA9IDB4NTk7CisJaWYgKHFjX2V4aXN0cyAmJiBhNF9leGlzdHMpCisJCW1pY19pdlsxXSA9IG1wZHVbMzBdICYgMHgwZjsgICAgLyogUW9TX1RDICAgICAgICAgICAqLworCWlmIChxY19leGlzdHMgJiYgIWE0X2V4aXN0cykKKwkJbWljX2l2WzFdID0gbXBkdVsyNF0gJiAweDBmOyAgIC8qIG11dGUgYml0cyA3LTQgICAgKi8KKwlpZiAoIXFjX2V4aXN0cykKKwkJbWljX2l2WzFdID0gMHgwMDsKKwlmb3IgKGkgPSAyOyBpIDwgODsgaSsrKQorCQltaWNfaXZbaV0gPSBtcGR1W2kgKyA4XTsgICAgICAgICAgICAgICAgICAgIC8qIG1pY19pdlsyOjddID0gQTJbMDo1XSA9IG1wZHVbMTA6MTVdICovCisjaWZkZWYgQ09OU0lTVEVOVF9QTl9PUkRFUgorCQlmb3IgKGkgPSA4OyBpIDwgMTQ7IGkrKykKKwkJCW1pY19pdltpXSA9IHBuX3ZlY3RvcltpIC0gOF07ICAgICAgICAgICAvKiBtaWNfaXZbODoxM10gPSBQTlswOjVdICovCisjZWxzZQorCQlmb3IgKGkgPSA4OyBpIDwgMTQ7IGkrKykKKwkJCW1pY19pdltpXSA9IHBuX3ZlY3RvclsxMyAtIGldOyAgICAgICAgICAvKiBtaWNfaXZbODoxM10gPSBQTls1OjBdICovCisjZW5kaWYKKwlpID0gKHBheWxvYWRfbGVuZ3RoIC8gMjU2KTsKKwlpID0gKHBheWxvYWRfbGVuZ3RoICUgMjU2KTsKKwltaWNfaXZbMTRdID0gKHVuc2lnbmVkIGNoYXIpIChwYXlsb2FkX2xlbmd0aCAvIDI1Nik7CisJbWljX2l2WzE1XSA9ICh1bnNpZ25lZCBjaGFyKSAocGF5bG9hZF9sZW5ndGggJSAyNTYpOworCit9CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogYml0d2lzZV94b3IoKSAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEEgMTI4IGJpdCwgYml0d2lzZSBleGNsdXNpdmUgb3IgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIGJpdHdpc2VfeG9yKHVuc2lnbmVkIGNoYXIgKmluYSwgdW5zaWduZWQgY2hhciAqaW5iLCB1bnNpZ25lZCBjaGFyICpvdXQpCit7CisJaW50IGk7CisJZm9yIChpPTA7IGk8MTY7IGkrKykKKwl7CisJCW91dFtpXSA9IGluYVtpXSBeIGluYltpXTsKKwl9Cit9CisKKwordm9pZCBhZXMxMjhrMTI4ZCh1bnNpZ25lZCBjaGFyICprZXksIHVuc2lnbmVkIGNoYXIgKmRhdGEsIHVuc2lnbmVkIGNoYXIgKmNpcGhlcnRleHQpCit7CisJaW50IHJvdW5kOworCWludCBpOworCXVuc2lnbmVkIGNoYXIgaW50ZXJtZWRpYXRlYVsxNl07CisJdW5zaWduZWQgY2hhciBpbnRlcm1lZGlhdGViWzE2XTsKKwl1bnNpZ25lZCBjaGFyIHJvdW5kX2tleVsxNl07CisKKwlmb3IoaT0wOyBpPDE2OyBpKyspIHJvdW5kX2tleVtpXSA9IGtleVtpXTsKKworCWZvciAocm91bmQgPSAwOyByb3VuZCA8IDExOyByb3VuZCsrKQorCXsKKwkJaWYgKHJvdW5kID09IDApCisJCXsKKwkJCXhvcl8xMjgocm91bmRfa2V5LCBkYXRhLCBjaXBoZXJ0ZXh0KTsKKwkJCW5leHRfa2V5KHJvdW5kX2tleSwgcm91bmQpOworCQl9CisJCWVsc2UgaWYgKHJvdW5kID09IDEwKQorCQl7CisJCQlieXRlX3N1YihjaXBoZXJ0ZXh0LCBpbnRlcm1lZGlhdGVhKTsKKwkJCXNoaWZ0X3JvdyhpbnRlcm1lZGlhdGVhLCBpbnRlcm1lZGlhdGViKTsKKwkJCXhvcl8xMjgoaW50ZXJtZWRpYXRlYiwgcm91bmRfa2V5LCBjaXBoZXJ0ZXh0KTsKKwkJfQorCQllbHNlICAgIC8qIDEgLSA5ICovCisJCXsKKwkJCWJ5dGVfc3ViKGNpcGhlcnRleHQsIGludGVybWVkaWF0ZWEpOworCQkJc2hpZnRfcm93KGludGVybWVkaWF0ZWEsIGludGVybWVkaWF0ZWIpOworCQkJbWl4X2NvbHVtbigmaW50ZXJtZWRpYXRlYlswXSwgJmludGVybWVkaWF0ZWFbMF0pOworCQkJbWl4X2NvbHVtbigmaW50ZXJtZWRpYXRlYls0XSwgJmludGVybWVkaWF0ZWFbNF0pOworCQkJbWl4X2NvbHVtbigmaW50ZXJtZWRpYXRlYls4XSwgJmludGVybWVkaWF0ZWFbOF0pOworCQkJbWl4X2NvbHVtbigmaW50ZXJtZWRpYXRlYlsxMl0sICZpbnRlcm1lZGlhdGVhWzEyXSk7CisJCQl4b3JfMTI4KGludGVybWVkaWF0ZWEsIHJvdW5kX2tleSwgY2lwaGVydGV4dCk7CisJCQluZXh0X2tleShyb3VuZF9rZXksIHJvdW5kKTsKKwkJfQorCX0KKworfQorCit2b2lkIGNvbnN0cnVjdF9jdHJfcHJlbG9hZCgKKwl1bnNpZ25lZCBjaGFyICpjdHJfcHJlbG9hZCwKKwlpbnQgYTRfZXhpc3RzLAorCWludCBxY19leGlzdHMsCisJdW5zaWduZWQgY2hhciAqbXBkdSwKKwl1bnNpZ25lZCBjaGFyICpwbl92ZWN0b3IsCisJaW50IGMpCit7CisKKwlpbnQgaSA9IDA7CisJZm9yIChpPTA7IGk8MTY7IGkrKykgY3RyX3ByZWxvYWRbaV0gPSAweDAwOworCWkgPSAwOworCisJY3RyX3ByZWxvYWRbMF0gPSAweDAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmbGFnICovCisJaWYgKHFjX2V4aXN0cyAmJiBhNF9leGlzdHMpIGN0cl9wcmVsb2FkWzFdID0gbXBkdVszMF0gJiAweDBmOyAgIC8qIFFvQ19Db250cm9sICAqLworCWlmIChxY19leGlzdHMgJiYgIWE0X2V4aXN0cykgY3RyX3ByZWxvYWRbMV0gPSBtcGR1WzI0XSAmIDB4MGY7CisKKwlmb3IgKGkgPSAyOyBpIDwgODsgaSsrKQorCQljdHJfcHJlbG9hZFtpXSA9IG1wZHVbaSArIDhdOyAgICAgICAgICAgICAgICAgICAgICAgLyogY3RyX3ByZWxvYWRbMjo3XSA9IEEyWzA6NV0gPSBtcGR1WzEwOjE1XSAqLworI2lmZGVmIENPTlNJU1RFTlRfUE5fT1JERVIKKwkgIGZvciAoaSA9IDg7IGkgPCAxNDsgaSsrKQorCQkJY3RyX3ByZWxvYWRbaV0gPSAgICBwbl92ZWN0b3JbaSAtIDhdOyAgICAgICAgICAgLyogY3RyX3ByZWxvYWRbODoxM10gPSBQTlswOjVdICovCisjZWxzZQorCSAgZm9yIChpID0gODsgaSA8IDE0OyBpKyspCisJCQljdHJfcHJlbG9hZFtpXSA9ICAgIHBuX3ZlY3RvclsxMyAtIGldOyAgICAgICAgICAvKiBjdHJfcHJlbG9hZFs4OjEzXSA9IFBOWzU6MF0gKi8KKyNlbmRpZgorCWN0cl9wcmVsb2FkWzE0XSA9ICAodW5zaWduZWQgY2hhcikgKGMgLyAyNTYpOyAvLyBDdHIKKwljdHJfcHJlbG9hZFsxNV0gPSAgKHVuc2lnbmVkIGNoYXIpIChjICUgMjU2KTsKKworfQorCisKKy8vCisvLyBUUlVFOiBTdWNjZXNzIQorLy8gRkFMU0U6IERlY3J5cHQgRXJyb3IhCisvLworQk9PTEVBTiBSVE1QU29mdERlY3J5cHRUS0lQKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFBVQ0hBUglwRGF0YSwKKwlJTiBVTE9ORwlEYXRhQnl0ZUNudCwKKwlJTiBVQ0hBUiAgICBVc2VyUHJpb3JpdHksCisJSU4gUENJUEhFUl9LRVkJcFdwYUtleSkKK3sKKwlVQ0hBUgkJCUtleUlEOworCVVJTlQJCQlIZWFkZXJMZW47CisgICAgVUNIQVIJCQlmYzA7CisJVUNIQVIJCQlmYzE7CisJVVNIT1JUCQkJZmM7CisJVUlOVAkJCWZyYW1lX3R5cGU7CisJVUlOVAkJCWZyYW1lX3N1YnR5cGU7CisgICAgVUlOVAkJCWZyb21fZHM7CisgICAgVUlOVAkJCXRvX2RzOworCUlOVAkJCQlhNF9leGlzdHM7CisJSU5UCQkJCXFjX2V4aXN0czsKKwlVU0hPUlQJCQlkdXJhdGlvbjsKKwlVU0hPUlQJCQlzZXFfY29udHJvbDsKKwlVU0hPUlQJCQlxb3NfY29udHJvbDsKKwlVQ0hBUgkJCVRBW01BQ19BRERSX0xFTl07CisJVUNIQVIJCQlEQVtNQUNfQUREUl9MRU5dOworCVVDSEFSCQkJU0FbTUFDX0FERFJfTEVOXTsKKwlVQ0hBUgkJCVJDNEtleVsxNl07CisJVUlOVAkJCXAxa1s1XTsgLy9mb3IgbWl4X2tleTsKKwlVTE9ORwkJCXBubDsvKiBMZWFzdCBzaWduaWZpY2FudCAxNiBiaXRzIG9mIFBOICovCisJVUxPTkcJCQlwbmg7LyogTW9zdCBzaWduaWZpY2FudCAzMiBiaXRzIG9mIFBOICovCisJVUlOVAkJCW51bV9ibG9ja3M7CisJVUlOVAkJCXBheWxvYWRfcmVtYWluZGVyOworCUFSQ0ZPVVJDT05URVhUIAlBcmNGb3VyQ29udGV4dDsKKwlVSU5UCQkJY3JjMzIgPSAwOworCVVJTlQJCQl0cmFpbGZjcyA9IDA7CisJVUNIQVIJCQlNSUNbOF07CisJVUNIQVIJCQlUcmFpbE1JQ1s4XTsKKworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwlSVE1QRnJhbWVFbmRpYW5DaGFuZ2UocEFkLCAoUFVDSEFSKXBEYXRhLCBESVJfUkVBRCwgRkFMU0UpOworI2VuZGlmCisKKwlmYzAgPSAqcERhdGE7CisJZmMxID0gKihwRGF0YSArIDEpOworCisJZmMgPSAqKChQVVNIT1JUKXBEYXRhKTsKKworCWZyYW1lX3R5cGUgPSAoKGZjMCA+PiAyKSAmIDB4MDMpOworCWZyYW1lX3N1YnR5cGUgPSAoKGZjMCA+PiA0KSAmIDB4MGYpOworCisgICAgZnJvbV9kcyA9IChmYzEgJiAweDIpID4+IDE7CisgICAgdG9fZHMgPSAoZmMxICYgMHgxKTsKKworICAgIGE0X2V4aXN0cyA9IChmcm9tX2RzICYgdG9fZHMpOworICAgIHFjX2V4aXN0cyA9ICgoZnJhbWVfc3VidHlwZSA9PSAweDA4KSB8fCAgICAvKiBBc3N1bWVkIFFvUyBzdWJ0eXBlcyAqLworICAgICAgICAgICAgICAgICAgKGZyYW1lX3N1YnR5cGUgPT0gMHgwOSkgfHwgICAvKiBMaWtlbHkgdG8gY2hhbmdlLiAgICAqLworICAgICAgICAgICAgICAgICAgKGZyYW1lX3N1YnR5cGUgPT0gMHgwYSkgfHwKKyAgICAgICAgICAgICAgICAgIChmcmFtZV9zdWJ0eXBlID09IDB4MGIpCisgICAgICAgICAgICAgICAgICk7CisKKwlIZWFkZXJMZW4gPSAyNDsKKwlpZiAoYTRfZXhpc3RzKQorCQlIZWFkZXJMZW4gKz0gNjsKKworCUtleUlEID0gKigoUFVDSEFSKShwRGF0YSsgSGVhZGVyTGVuICsgMykpOworCUtleUlEID0gS2V5SUQgPj4gNjsKKworCWlmIChwV3BhS2V5W0tleUlEXS5LZXlMZW4gPT0gMCkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJUTVBTb2Z0RGVjcnlwdFRLSVAgZmFpbGVkIShLZXlJRFslZF0gTGVuZ3RoIGNhbiBub3QgYmUgMClcbiIsIEtleUlEKSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlkdXJhdGlvbiA9ICooKFBVU0hPUlQpKHBEYXRhKzIpKTsKKworCXNlcV9jb250cm9sID0gKigoUFVTSE9SVCkocERhdGErMjIpKTsKKworCWlmIChxY19leGlzdHMpCisJeworCQlpZiAoYTRfZXhpc3RzKQorCQl7CisJCQlxb3NfY29udHJvbCA9ICooKFBVU0hPUlQpKHBEYXRhKzMwKSk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlxb3NfY29udHJvbCA9ICooKFBVU0hPUlQpKHBEYXRhKzI0KSk7CisJCX0KKwl9CisKKwlpZiAodG9fZHMgPT0gMCAmJiBmcm9tX2RzID09IDEpCisJeworCQlOZGlzTW92ZU1lbW9yeShEQSwgcERhdGErNCwgTUFDX0FERFJfTEVOKTsKKwkJTmRpc01vdmVNZW1vcnkoU0EsIHBEYXRhKzE2LCBNQUNfQUREUl9MRU4pOworCQlOZGlzTW92ZU1lbW9yeShUQSwgcERhdGErMTAsIE1BQ19BRERSX0xFTik7ICAvL0JTU0lECisJfQorCWVsc2UgaWYgKHRvX2RzID09IDAgJiYgZnJvbV9kcyA9PSAwICkKKwl7CisJCU5kaXNNb3ZlTWVtb3J5KFRBLCBwRGF0YSsxMCwgTUFDX0FERFJfTEVOKTsKKwkJTmRpc01vdmVNZW1vcnkoREEsIHBEYXRhKzQsIE1BQ19BRERSX0xFTik7CisJCU5kaXNNb3ZlTWVtb3J5KFNBLCBwRGF0YSsxMCwgTUFDX0FERFJfTEVOKTsKKwl9CisJZWxzZSBpZiAodG9fZHMgPT0gMSAmJiBmcm9tX2RzID09IDApCisJeworCQlOZGlzTW92ZU1lbW9yeShTQSwgcERhdGErMTAsIE1BQ19BRERSX0xFTik7CisJCU5kaXNNb3ZlTWVtb3J5KFRBLCBwRGF0YSsxMCwgTUFDX0FERFJfTEVOKTsKKwkJTmRpc01vdmVNZW1vcnkoREEsIHBEYXRhKzE2LCBNQUNfQUREUl9MRU4pOworCX0KKwllbHNlIGlmICh0b19kcyA9PSAxICYmIGZyb21fZHMgPT0gMSkKKwl7CisJCU5kaXNNb3ZlTWVtb3J5KFRBLCBwRGF0YSsxMCwgTUFDX0FERFJfTEVOKTsKKwkJTmRpc01vdmVNZW1vcnkoREEsIHBEYXRhKzE2LCBNQUNfQUREUl9MRU4pOworCQlOZGlzTW92ZU1lbW9yeShTQSwgcERhdGErMjIsIE1BQ19BRERSX0xFTik7CisJfQorCisJbnVtX2Jsb2NrcyA9IChEYXRhQnl0ZUNudCAtIDE2KSAvIDE2OworCXBheWxvYWRfcmVtYWluZGVyID0gKERhdGFCeXRlQ250IC0gMTYpICUgMTY7CisKKwlwbmwgPSAoKihwRGF0YSArIEhlYWRlckxlbikpICogMjU2ICsgKihwRGF0YSArIEhlYWRlckxlbiArIDIpOworCXBuaCA9ICooKFBVTE9ORykocERhdGEgKyBIZWFkZXJMZW4gKyA0KSk7CisJcG5oID0gY3B1MmxlMzIocG5oKTsKKwlSVE1QVGtpcE1peEtleShwV3BhS2V5W0tleUlEXS5LZXksIFRBLCBwbmwsIHBuaCwgUkM0S2V5LCBwMWspOworCisJQVJDRk9VUl9JTklUKCZBcmNGb3VyQ29udGV4dCwgUkM0S2V5LCAxNik7CisKKwlBUkNGT1VSX0RFQ1JZUFQoJkFyY0ZvdXJDb250ZXh0LCBwRGF0YSArIEhlYWRlckxlbiwgcERhdGEgKyBIZWFkZXJMZW4gKyA4LCBEYXRhQnl0ZUNudCAtIEhlYWRlckxlbiAtIDgpOworCU5kaXNNb3ZlTWVtb3J5KCZ0cmFpbGZjcywgcERhdGEgKyBEYXRhQnl0ZUNudCAtIDggLSA0LCA0KTsKKwljcmMzMiA9IFJUTVBfQ0FMQ19GQ1MzMihQUFBJTklURkNTMzIsIHBEYXRhICsgSGVhZGVyTGVuLCBEYXRhQnl0ZUNudCAtIEhlYWRlckxlbiAtIDggLSA0KTsgIC8vU2tpcCBJVitFSVYgOCBieXRlcyAmIFNraXAgbGFzdCA0IGJ5dGVzKEZDUykuCisJY3JjMzIgXj0gMHhmZmZmZmZmZjsgICAgICAgICAgICAgLyogY29tcGxlbWVudCAqLworCisgICAgaWYoY3JjMzIgIT0gY3B1MmxlMzIodHJhaWxmY3MpKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlRNUFNvZnREZWNyeXB0VEtJUCwgV0VQIERhdGEgSUNWIEVycm9yICFcbiIpKTsJIC8vSUNWIGVycm9yLgorCisJCXJldHVybiAoRkFMU0UpOworCX0KKworCU5kaXNNb3ZlTWVtb3J5KFRyYWlsTUlDLCBwRGF0YSArIERhdGFCeXRlQ250IC0gOCAtIDggLSA0LCA4KTsKKwlSVE1QSW5pdE1JQ0VuZ2luZShwQWQsIHBXcGFLZXlbS2V5SURdLktleSwgREEsIFNBLCBVc2VyUHJpb3JpdHksIHBXcGFLZXlbS2V5SURdLlJ4TWljKTsKKwlSVE1QVGtpcEFwcGVuZCgmcEFkLT5Qcml2YXRlSW5mby5UeCwgcERhdGEgKyBIZWFkZXJMZW4sIERhdGFCeXRlQ250IC0gSGVhZGVyTGVuIC0gOCAtIDEyKTsKKwlSVE1QVGtpcEdldE1JQygmcEFkLT5Qcml2YXRlSW5mby5UeCk7CisJTmRpc01vdmVNZW1vcnkoTUlDLCBwQWQtPlByaXZhdGVJbmZvLlR4Lk1JQywgOCk7CisKKwlpZiAoIU5kaXNFcXVhbE1lbW9yeShNSUMsIFRyYWlsTUlDLCA4KSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlJUTVBTb2Z0RGVjcnlwdFRLSVAsIFdFUCBEYXRhIE1JQyBFcnJvciAhXG4iKSk7CSAvL01JQyBlcnJvci4KKwkJLy9SVE1QUmVwb3J0TWljRXJyb3IocEFkLCAmcFdwYUtleVtLZXlJRF0pOwkvLyBtYXJrZWQgYnkgQWxiZXJ0WSBAIDIwMDYwNjMwCisJCXJldHVybiAoRkFMU0UpOworCX0KKworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwlSVE1QRnJhbWVFbmRpYW5DaGFuZ2UocEFkLCAoUFVDSEFSKXBEYXRhLCBESVJfUkVBRCwgRkFMU0UpOworI2VuZGlmCisJLy9EQkdQUklOVChSVF9ERUJVR19UUkFDRSwgIlJUTVBTb2Z0RGVjcnlwdFRLSVAgRGVjcmlwdCBkb25lISFcbiIpOworCXJldHVybiBUUlVFOworfQorCisKKworCitCT09MRUFOIFJUTVBTb2Z0RGVjcnlwdEFFUygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBQVUNIQVIJcERhdGEsCisJSU4gVUxPTkcJRGF0YUJ5dGVDbnQsCisJSU4gUENJUEhFUl9LRVkJcFdwYUtleSkKK3sKKwlVQ0hBUgkJCUtleUlEOworCVVJTlQJCQlIZWFkZXJMZW47CisJVUNIQVIJCQlQTls2XTsKKwlVSU5UCQkJcGF5bG9hZF9sZW47CisJVUlOVAkJCW51bV9ibG9ja3M7CisJVUlOVAkJCXBheWxvYWRfcmVtYWluZGVyOworCVVTSE9SVAkJCWZjOworCVVDSEFSCQkJZmMwOworCVVDSEFSCQkJZmMxOworCVVJTlQJCQlmcmFtZV90eXBlOworCVVJTlQJCQlmcmFtZV9zdWJ0eXBlOworCVVJTlQJCQlmcm9tX2RzOworCVVJTlQJCQl0b19kczsKKwlJTlQJCQkJYTRfZXhpc3RzOworCUlOVAkJCQlxY19leGlzdHM7CisJVUNIQVIJCQlhZXNfb3V0WzE2XTsKKwlpbnQgCQkJcGF5bG9hZF9pbmRleDsKKwlVSU5UIAkJCWk7CisJVUNIQVIgCQkJY3RyX3ByZWxvYWRbMTZdOworCVVDSEFSIAkJCWNoYWluX2J1ZmZlclsxNl07CisJVUNIQVIgCQkJcGFkZGVkX2J1ZmZlclsxNl07CisJVUNIQVIgCQkJbWljX2l2WzE2XTsKKwlVQ0hBUiAJCQltaWNfaGVhZGVyMVsxNl07CisJVUNIQVIgCQkJbWljX2hlYWRlcjJbMTZdOworCVVDSEFSCQkJTUlDWzhdOworCVVDSEFSCQkJVHJhaWxNSUNbOF07CisKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJUlRNUEZyYW1lRW5kaWFuQ2hhbmdlKHBBZCwgKFBVQ0hBUilwRGF0YSwgRElSX1JFQUQsIEZBTFNFKTsKKyNlbmRpZgorCisJZmMwID0gKnBEYXRhOworCWZjMSA9ICoocERhdGEgKyAxKTsKKworCWZjID0gKigoUFVTSE9SVClwRGF0YSk7CisKKwlmcmFtZV90eXBlID0gKChmYzAgPj4gMikgJiAweDAzKTsKKwlmcmFtZV9zdWJ0eXBlID0gKChmYzAgPj4gNCkgJiAweDBmKTsKKworCWZyb21fZHMgPSAoZmMxICYgMHgyKSA+PiAxOworCXRvX2RzID0gKGZjMSAmIDB4MSk7CisKKwlhNF9leGlzdHMgPSAoZnJvbV9kcyAmIHRvX2RzKTsKKwlxY19leGlzdHMgPSAoKGZyYW1lX3N1YnR5cGUgPT0gMHgwOCkgfHwgICAgLyogQXNzdW1lZCBRb1Mgc3VidHlwZXMgKi8KKwkJCQkgIChmcmFtZV9zdWJ0eXBlID09IDB4MDkpIHx8ICAgLyogTGlrZWx5IHRvIGNoYW5nZS4gICAgKi8KKwkJCQkgIChmcmFtZV9zdWJ0eXBlID09IDB4MGEpIHx8CisJCQkJICAoZnJhbWVfc3VidHlwZSA9PSAweDBiKQorCQkJCSApOworCisJSGVhZGVyTGVuID0gMjQ7CisJaWYgKGE0X2V4aXN0cykKKwkJSGVhZGVyTGVuICs9IDY7CisKKwlLZXlJRCA9ICooKFBVQ0hBUikocERhdGErIEhlYWRlckxlbiArIDMpKTsKKwlLZXlJRCA9IEtleUlEID4+IDY7CisKKwlpZiAocFdwYUtleVtLZXlJRF0uS2V5TGVuID09IDApCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVE1QU29mdERlY3J5cHRBRVMgZmFpbGVkIShLZXlJRFslZF0gTGVuZ3RoIGNhbiBub3QgYmUgMClcbiIsIEtleUlEKSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlQTlswXSA9ICoocERhdGErIEhlYWRlckxlbik7CisJUE5bMV0gPSAqKHBEYXRhKyBIZWFkZXJMZW4gKyAxKTsKKwlQTlsyXSA9ICoocERhdGErIEhlYWRlckxlbiArIDQpOworCVBOWzNdID0gKihwRGF0YSsgSGVhZGVyTGVuICsgNSk7CisJUE5bNF0gPSAqKHBEYXRhKyBIZWFkZXJMZW4gKyA2KTsKKwlQTls1XSA9ICoocERhdGErIEhlYWRlckxlbiArIDcpOworCisJcGF5bG9hZF9sZW4gPSBEYXRhQnl0ZUNudCAtIEhlYWRlckxlbiAtIDggLSA4OwkvLyA4IGJ5dGVzIGZvciBDQ01QIGhlYWRlciAsIDggYnl0ZXMgZm9yIE1JQworCXBheWxvYWRfcmVtYWluZGVyID0gKHBheWxvYWRfbGVuKSAlIDE2OworCW51bV9ibG9ja3MgPSAocGF5bG9hZF9sZW4pIC8gMTY7CisKKworCisJLy8gRmluZCBzdGFydCBvZiBwYXlsb2FkCisJcGF5bG9hZF9pbmRleCA9IEhlYWRlckxlbiArIDg7IC8vSVYrRUlWCisKKwlmb3IgKGk9MDsgaTwgbnVtX2Jsb2NrczsgaSsrKQorCXsKKwkJY29uc3RydWN0X2N0cl9wcmVsb2FkKGN0cl9wcmVsb2FkLAorCQkJCQkJCQlhNF9leGlzdHMsCisJCQkJCQkJCXFjX2V4aXN0cywKKwkJCQkJCQkJcERhdGEsCisJCQkJCQkJCVBOLAorCQkJCQkJCQlpKzEgKTsKKworCQlhZXMxMjhrMTI4ZChwV3BhS2V5W0tleUlEXS5LZXksIGN0cl9wcmVsb2FkLCBhZXNfb3V0KTsKKworCQliaXR3aXNlX3hvcihhZXNfb3V0LCBwRGF0YSArIHBheWxvYWRfaW5kZXgsIGNoYWluX2J1ZmZlcik7CisJCU5kaXNNb3ZlTWVtb3J5KHBEYXRhICsgcGF5bG9hZF9pbmRleCAtIDgsIGNoYWluX2J1ZmZlciwgMTYpOworCQlwYXlsb2FkX2luZGV4ICs9IDE2OworCX0KKworCS8vCisJLy8gSWYgdGhlcmUgaXMgYSBzaG9ydCBmaW5hbCBibG9jaywgdGhlbiBwYWQgaXQKKwkvLyBlbmNyeXB0IGl0IGFuZCBjb3B5IHRoZSB1bnBhZGRlZCBwYXJ0IGJhY2sKKwkvLworCWlmIChwYXlsb2FkX3JlbWFpbmRlciA+IDApCisJeworCQljb25zdHJ1Y3RfY3RyX3ByZWxvYWQoY3RyX3ByZWxvYWQsCisJCQkJCQkJCWE0X2V4aXN0cywKKwkJCQkJCQkJcWNfZXhpc3RzLAorCQkJCQkJCQlwRGF0YSwKKwkJCQkJCQkJUE4sCisJCQkJCQkJCW51bV9ibG9ja3MgKyAxKTsKKworCQlOZGlzWmVyb01lbW9yeShwYWRkZWRfYnVmZmVyLCAxNik7CisJCU5kaXNNb3ZlTWVtb3J5KHBhZGRlZF9idWZmZXIsIHBEYXRhICsgcGF5bG9hZF9pbmRleCwgcGF5bG9hZF9yZW1haW5kZXIpOworCisJCWFlczEyOGsxMjhkKHBXcGFLZXlbS2V5SURdLktleSwgY3RyX3ByZWxvYWQsIGFlc19vdXQpOworCisJCWJpdHdpc2VfeG9yKGFlc19vdXQsIHBhZGRlZF9idWZmZXIsIGNoYWluX2J1ZmZlcik7CisJCU5kaXNNb3ZlTWVtb3J5KHBEYXRhICsgcGF5bG9hZF9pbmRleCAtIDgsIGNoYWluX2J1ZmZlciwgcGF5bG9hZF9yZW1haW5kZXIpOworCQlwYXlsb2FkX2luZGV4ICs9IHBheWxvYWRfcmVtYWluZGVyOworCX0KKworCS8vCisJLy8gRGVzY3J5cHQgdGhlIE1JQworCS8vCisJY29uc3RydWN0X2N0cl9wcmVsb2FkKGN0cl9wcmVsb2FkLAorCQkJCQkJCWE0X2V4aXN0cywKKwkJCQkJCQlxY19leGlzdHMsCisJCQkJCQkJcERhdGEsCisJCQkJCQkJUE4sCisJCQkJCQkJMCk7CisJTmRpc1plcm9NZW1vcnkocGFkZGVkX2J1ZmZlciwgMTYpOworCU5kaXNNb3ZlTWVtb3J5KHBhZGRlZF9idWZmZXIsIHBEYXRhICsgcGF5bG9hZF9pbmRleCwgOCk7CisKKwlhZXMxMjhrMTI4ZChwV3BhS2V5W0tleUlEXS5LZXksIGN0cl9wcmVsb2FkLCBhZXNfb3V0KTsKKworCWJpdHdpc2VfeG9yKGFlc19vdXQsIHBhZGRlZF9idWZmZXIsIGNoYWluX2J1ZmZlcik7CisKKwlOZGlzTW92ZU1lbW9yeShUcmFpbE1JQywgY2hhaW5fYnVmZmVyLCA4KTsKKworCS8vCisJLy8gQ2FsY3VsYXRlIE1JQworCS8vCisKKwkvL0ZvcmNlIHRoZSBwcm90ZWN0ZWQgZnJhbWUgYml0IG9uCisJKihwRGF0YSArIDEpID0gKihwRGF0YSArIDEpIHwgMHg0MDsKKworCS8vIEZpbmQgc3RhcnQgb2YgcGF5bG9hZAorCS8vIEJlY2F1c2UgdGhlIENDTVAgaGVhZGVyIGhhcyBiZWVuIHJlbW92ZWQKKwlwYXlsb2FkX2luZGV4ID0gSGVhZGVyTGVuOworCisJY29uc3RydWN0X21pY19pdigKKwkJCQkJbWljX2l2LAorCQkJCQlxY19leGlzdHMsCisJCQkJCWE0X2V4aXN0cywKKwkJCQkJcERhdGEsCisJCQkJCXBheWxvYWRfbGVuLAorCQkJCQlQTik7CisKKwljb25zdHJ1Y3RfbWljX2hlYWRlcjEoCisJCQkJCQltaWNfaGVhZGVyMSwKKwkJCQkJCUhlYWRlckxlbiwKKwkJCQkJCXBEYXRhKTsKKworCWNvbnN0cnVjdF9taWNfaGVhZGVyMigKKwkJCQkJCW1pY19oZWFkZXIyLAorCQkJCQkJcERhdGEsCisJCQkJCQlhNF9leGlzdHMsCisJCQkJCQlxY19leGlzdHMpOworCisJYWVzMTI4azEyOGQocFdwYUtleVtLZXlJRF0uS2V5LCBtaWNfaXYsIGFlc19vdXQpOworCWJpdHdpc2VfeG9yKGFlc19vdXQsIG1pY19oZWFkZXIxLCBjaGFpbl9idWZmZXIpOworCWFlczEyOGsxMjhkKHBXcGFLZXlbS2V5SURdLktleSwgY2hhaW5fYnVmZmVyLCBhZXNfb3V0KTsKKwliaXR3aXNlX3hvcihhZXNfb3V0LCBtaWNfaGVhZGVyMiwgY2hhaW5fYnVmZmVyKTsKKwlhZXMxMjhrMTI4ZChwV3BhS2V5W0tleUlEXS5LZXksIGNoYWluX2J1ZmZlciwgYWVzX291dCk7CisKKwkvLyBpdGVyYXRlIHRocm91Z2ggZWFjaCAxNiBieXRlIHBheWxvYWQgYmxvY2sKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2Jsb2NrczsgaSsrKQorCXsKKwkJYml0d2lzZV94b3IoYWVzX291dCwgcERhdGEgKyBwYXlsb2FkX2luZGV4LCBjaGFpbl9idWZmZXIpOworCQlwYXlsb2FkX2luZGV4ICs9IDE2OworCQlhZXMxMjhrMTI4ZChwV3BhS2V5W0tleUlEXS5LZXksIGNoYWluX2J1ZmZlciwgYWVzX291dCk7CisJfQorCisJLy8gQWRkIG9uIHRoZSBmaW5hbCBwYXlsb2FkIGJsb2NrIGlmIGl0IG5lZWRzIHBhZGRpbmcKKwlpZiAocGF5bG9hZF9yZW1haW5kZXIgPiAwKQorCXsKKwkJTmRpc1plcm9NZW1vcnkocGFkZGVkX2J1ZmZlciwgMTYpOworCQlOZGlzTW92ZU1lbW9yeShwYWRkZWRfYnVmZmVyLCBwRGF0YSArIHBheWxvYWRfaW5kZXgsIHBheWxvYWRfcmVtYWluZGVyKTsKKworCQliaXR3aXNlX3hvcihhZXNfb3V0LCBwYWRkZWRfYnVmZmVyLCBjaGFpbl9idWZmZXIpOworCQlhZXMxMjhrMTI4ZChwV3BhS2V5W0tleUlEXS5LZXksIGNoYWluX2J1ZmZlciwgYWVzX291dCk7CisJfQorCisJLy8gYWVzX291dCBjb250YWlucyBwYWRkZWQgbWljLCBkaXNjYXJkIG1vc3Qgc2lnbmlmaWNhbnQKKwkvLyA4IGJ5dGVzIHRvIGdlbmVyYXRlIDY0IGJpdCBNSUMKKwlmb3IgKGkgPSAwIDsgaSA8IDg7IGkrKykgTUlDW2ldID0gYWVzX291dFtpXTsKKworCWlmICghTmRpc0VxdWFsTWVtb3J5KE1JQywgVHJhaWxNSUMsIDgpKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiUlRNUFNvZnREZWNyeXB0QUVTLCBNSUMgRXJyb3IgIVxuIikpOwkgLy9NSUMgZXJyb3IuCisJCXJldHVybiBGQUxTRTsKKwl9CisKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJUlRNUEZyYW1lRW5kaWFuQ2hhbmdlKHBBZCwgKFBVQ0hBUilwRGF0YSwgRElSX1JFQUQsIEZBTFNFKTsKKyNlbmRpZgorCisJcmV0dXJuIFRSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogYWVzMTI4azEyOGQoKSAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQZXJmb3JtcyBhIDEyOCBiaXQgQUVTIGVuY3J5cHQgd2l0aCAgKi8KKy8qIDEyOCBiaXQgZGF0YS4gICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitWT0lEIHhvcl8xMjgoCisJSU4gIFBVQ0hBUiAgYSwKKwlJTiAgUFVDSEFSICBiLAorCU9VVCBQVUNIQVIgIG91dCkKK3sKKwlJTlQgaTsKKworCWZvciAoaT0wO2k8MTY7IGkrKykKKwl7CisJCW91dFtpXSA9IGFbaV0gXiBiW2ldOworCX0KK30KKworVk9JRCBuZXh0X2tleSgKKwlJTiAgUFVDSEFSICBrZXksCisJSU4gIElOVCAgICAgcm91bmQpCit7CisJVUNIQVIgICAgICAgcmNvbjsKKwlVQ0hBUiAgICAgICBzYm94X2tleVs0XTsKKwlVQ0hBUiAgICAgICByY29uX3RhYmxlWzEyXSA9CisJeworCQkweDAxLCAweDAyLCAweDA0LCAweDA4LCAweDEwLCAweDIwLCAweDQwLCAweDgwLAorCQkweDFiLCAweDM2LCAweDM2LCAweDM2CisJfTsKKworCXNib3hfa2V5WzBdID0gUlRNUENraXBTYm94KGtleVsxM10pOworCXNib3hfa2V5WzFdID0gUlRNUENraXBTYm94KGtleVsxNF0pOworCXNib3hfa2V5WzJdID0gUlRNUENraXBTYm94KGtleVsxNV0pOworCXNib3hfa2V5WzNdID0gUlRNUENraXBTYm94KGtleVsxMl0pOworCisJcmNvbiA9IHJjb25fdGFibGVbcm91bmRdOworCisJeG9yXzMyKCZrZXlbMF0sIHNib3hfa2V5LCAma2V5WzBdKTsKKwlrZXlbMF0gPSBrZXlbMF0gXiByY29uOworCisJeG9yXzMyKCZrZXlbNF0sICZrZXlbMF0sICZrZXlbNF0pOworCXhvcl8zMigma2V5WzhdLCAma2V5WzRdLCAma2V5WzhdKTsKKwl4b3JfMzIoJmtleVsxMl0sICZrZXlbOF0sICZrZXlbMTJdKTsKK30KKworVk9JRCB4b3JfMzIoCisJSU4gIFBVQ0hBUiAgYSwKKwlJTiAgUFVDSEFSICBiLAorCU9VVCBQVUNIQVIgIG91dCkKK3sKKwlJTlQgaTsKKworCWZvciAoaT0wO2k8NDsgaSsrKQorCXsKKwkJb3V0W2ldID0gYVtpXSBeIGJbaV07CisJfQorfQorCitWT0lEIGJ5dGVfc3ViKAorCUlOICBQVUNIQVIgIGluLAorCU9VVCBQVUNIQVIgIG91dCkKK3sKKwlJTlQgaTsKKworCWZvciAoaT0wOyBpPCAxNjsgaSsrKQorCXsKKwkJb3V0W2ldID0gUlRNUENraXBTYm94KGluW2ldKTsKKwl9Cit9CisKK1VDSEFSIFJUTVBDa2lwU2JveCgKKwlJTiAgVUNIQVIgICBhKQoreworCXJldHVybiBTYm94VGFibGVbKGludClhXTsKK30KKworVk9JRCBzaGlmdF9yb3coCisJSU4gIFBVQ0hBUiAgaW4sCisJT1VUIFBVQ0hBUiAgb3V0KQoreworCW91dFswXSA9ICBpblswXTsKKwlvdXRbMV0gPSAgaW5bNV07CisJb3V0WzJdID0gIGluWzEwXTsKKwlvdXRbM10gPSAgaW5bMTVdOworCW91dFs0XSA9ICBpbls0XTsKKwlvdXRbNV0gPSAgaW5bOV07CisJb3V0WzZdID0gIGluWzE0XTsKKwlvdXRbN10gPSAgaW5bM107CisJb3V0WzhdID0gIGluWzhdOworCW91dFs5XSA9ICBpblsxM107CisJb3V0WzEwXSA9IGluWzJdOworCW91dFsxMV0gPSBpbls3XTsKKwlvdXRbMTJdID0gaW5bMTJdOworCW91dFsxM10gPSBpblsxXTsKKwlvdXRbMTRdID0gaW5bNl07CisJb3V0WzE1XSA9IGluWzExXTsKK30KKworVk9JRCBtaXhfY29sdW1uKAorCUlOICBQVUNIQVIgIGluLAorCU9VVCBQVUNIQVIgIG91dCkKK3sKKwlJTlQgICAgICAgICBpOworCVVDSEFSICAgICAgIGFkZDFiWzRdOworCVVDSEFSICAgICAgIGFkZDFiZjdbNF07CisJVUNIQVIgICAgICAgcm90bFs0XTsKKwlVQ0hBUiAgICAgICBzd2FwX2hhbGZzWzRdOworCVVDSEFSICAgICAgIGFuZGY3WzRdOworCVVDSEFSICAgICAgIHJvdHJbNF07CisJVUNIQVIgICAgICAgdGVtcFs0XTsKKwlVQ0hBUiAgICAgICB0ZW1wYls0XTsKKworCWZvciAoaT0wIDsgaTw0OyBpKyspCisJeworCQlpZiAoKGluW2ldICYgMHg4MCk9PSAweDgwKQorCQkJYWRkMWJbaV0gPSAweDFiOworCQllbHNlCisJCQlhZGQxYltpXSA9IDB4MDA7CisJfQorCisJc3dhcF9oYWxmc1swXSA9IGluWzJdOyAgICAvKiBTd2FwIGhhbGZzICovCisJc3dhcF9oYWxmc1sxXSA9IGluWzNdOworCXN3YXBfaGFsZnNbMl0gPSBpblswXTsKKwlzd2FwX2hhbGZzWzNdID0gaW5bMV07CisKKwlyb3RsWzBdID0gaW5bM107ICAgICAgICAvKiBSb3RhdGUgbGVmdCA4IGJpdHMgKi8KKwlyb3RsWzFdID0gaW5bMF07CisJcm90bFsyXSA9IGluWzFdOworCXJvdGxbM10gPSBpblsyXTsKKworCWFuZGY3WzBdID0gaW5bMF0gJiAweDdmOworCWFuZGY3WzFdID0gaW5bMV0gJiAweDdmOworCWFuZGY3WzJdID0gaW5bMl0gJiAweDdmOworCWFuZGY3WzNdID0gaW5bM10gJiAweDdmOworCisJZm9yIChpID0gMzsgaT4wOyBpLS0pICAgIC8qIGxvZ2ljYWwgc2hpZnQgbGVmdCAxIGJpdCAqLworCXsKKwkJYW5kZjdbaV0gPSBhbmRmN1tpXSA8PCAxOworCQlpZiAoKGFuZGY3W2ktMV0gJiAweDgwKSA9PSAweDgwKQorCQl7CisJCQlhbmRmN1tpXSA9IChhbmRmN1tpXSB8IDB4MDEpOworCQl9CisJfQorCWFuZGY3WzBdID0gYW5kZjdbMF0gPDwgMTsKKwlhbmRmN1swXSA9IGFuZGY3WzBdICYgMHhmZTsKKworCXhvcl8zMihhZGQxYiwgYW5kZjcsIGFkZDFiZjcpOworCisJeG9yXzMyKGluLCBhZGQxYmY3LCByb3RyKTsKKworCXRlbXBbMF0gPSByb3RyWzBdOyAgICAgICAgIC8qIFJvdGF0ZSByaWdodCA4IGJpdHMgKi8KKwlyb3RyWzBdID0gcm90clsxXTsKKwlyb3RyWzFdID0gcm90clsyXTsKKwlyb3RyWzJdID0gcm90clszXTsKKwlyb3RyWzNdID0gdGVtcFswXTsKKworCXhvcl8zMihhZGQxYmY3LCByb3RyLCB0ZW1wKTsKKwl4b3JfMzIoc3dhcF9oYWxmcywgcm90bCx0ZW1wYik7CisJeG9yXzMyKHRlbXAsIHRlbXBiLCBvdXQpOworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9ydG1wX3dlcC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vcnRtcF93ZXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MmY5ZTU4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vcnRtcF93ZXAuYwpAQCAtMCwwICsxLDUwOCBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwlNb2R1bGUgTmFtZToKKwlydG1wX3dlcC5jCisKKwlBYnN0cmFjdDoKKworCVJldmlzaW9uIEhpc3Rvcnk6CisJV2hvCQkJV2hlbgkJCVdoYXQKKwktLS0tLS0tLQktLS0tLS0tLS0tCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJUGF1bCBXdQkJMTAtMjgtMDIJCUluaXRpYWwKKyovCisKKyNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKKworVUlOVCBGQ1NUQUJfMzJbMjU2XSA9Cit7CisJMHgwMDAwMDAwMCwgMHg3NzA3MzA5NiwgMHhlZTBlNjEyYywgMHg5OTA5NTFiYSwKKwkweDA3NmRjNDE5LCAweDcwNmFmNDhmLCAweGU5NjNhNTM1LCAweDllNjQ5NWEzLAorCTB4MGVkYjg4MzIsIDB4NzlkY2I4YTQsIDB4ZTBkNWU5MWUsIDB4OTdkMmQ5ODgsCisJMHgwOWI2NGMyYiwgMHg3ZWIxN2NiZCwgMHhlN2I4MmQwNywgMHg5MGJmMWQ5MSwKKwkweDFkYjcxMDY0LCAweDZhYjAyMGYyLCAweGYzYjk3MTQ4LCAweDg0YmU0MWRlLAorCTB4MWFkYWQ0N2QsIDB4NmRkZGU0ZWIsIDB4ZjRkNGI1NTEsIDB4ODNkMzg1YzcsCisJMHgxMzZjOTg1NiwgMHg2NDZiYThjMCwgMHhmZDYyZjk3YSwgMHg4YTY1YzllYywKKwkweDE0MDE1YzRmLCAweDYzMDY2Y2Q5LCAweGZhMGYzZDYzLCAweDhkMDgwZGY1LAorCTB4M2I2ZTIwYzgsIDB4NGM2OTEwNWUsIDB4ZDU2MDQxZTQsIDB4YTI2NzcxNzIsCisJMHgzYzAzZTRkMSwgMHg0YjA0ZDQ0NywgMHhkMjBkODVmZCwgMHhhNTBhYjU2YiwKKwkweDM1YjVhOGZhLCAweDQyYjI5ODZjLCAweGRiYmJjOWQ2LCAweGFjYmNmOTQwLAorCTB4MzJkODZjZTMsIDB4NDVkZjVjNzUsIDB4ZGNkNjBkY2YsIDB4YWJkMTNkNTksCisJMHgyNmQ5MzBhYywgMHg1MWRlMDAzYSwgMHhjOGQ3NTE4MCwgMHhiZmQwNjExNiwKKwkweDIxYjRmNGI1LCAweDU2YjNjNDIzLCAweGNmYmE5NTk5LCAweGI4YmRhNTBmLAorCTB4MjgwMmI4OWUsIDB4NWYwNTg4MDgsIDB4YzYwY2Q5YjIsIDB4YjEwYmU5MjQsCisJMHgyZjZmN2M4NywgMHg1ODY4NGMxMSwgMHhjMTYxMWRhYiwgMHhiNjY2MmQzZCwKKwkweDc2ZGM0MTkwLCAweDAxZGI3MTA2LCAweDk4ZDIyMGJjLCAweGVmZDUxMDJhLAorCTB4NzFiMTg1ODksIDB4MDZiNmI1MWYsIDB4OWZiZmU0YTUsIDB4ZThiOGQ0MzMsCisJMHg3ODA3YzlhMiwgMHgwZjAwZjkzNCwgMHg5NjA5YTg4ZSwgMHhlMTBlOTgxOCwKKwkweDdmNmEwZGJiLCAweDA4NmQzZDJkLCAweDkxNjQ2Yzk3LCAweGU2NjM1YzAxLAorCTB4NmI2YjUxZjQsIDB4MWM2YzYxNjIsIDB4ODU2NTMwZDgsIDB4ZjI2MjAwNGUsCisJMHg2YzA2OTVlZCwgMHgxYjAxYTU3YiwgMHg4MjA4ZjRjMSwgMHhmNTBmYzQ1NywKKwkweDY1YjBkOWM2LCAweDEyYjdlOTUwLCAweDhiYmViOGVhLCAweGZjYjk4ODdjLAorCTB4NjJkZDFkZGYsIDB4MTVkYTJkNDksIDB4OGNkMzdjZjMsIDB4ZmJkNDRjNjUsCisJMHg0ZGIyNjE1OCwgMHgzYWI1NTFjZSwgMHhhM2JjMDA3NCwgMHhkNGJiMzBlMiwKKwkweDRhZGZhNTQxLCAweDNkZDg5NWQ3LCAweGE0ZDFjNDZkLCAweGQzZDZmNGZiLAorCTB4NDM2OWU5NmEsIDB4MzQ2ZWQ5ZmMsIDB4YWQ2Nzg4NDYsIDB4ZGE2MGI4ZDAsCisJMHg0NDA0MmQ3MywgMHgzMzAzMWRlNSwgMHhhYTBhNGM1ZiwgMHhkZDBkN2NjOSwKKwkweDUwMDU3MTNjLCAweDI3MDI0MWFhLCAweGJlMGIxMDEwLCAweGM5MGMyMDg2LAorCTB4NTc2OGI1MjUsIDB4MjA2Zjg1YjMsIDB4Yjk2NmQ0MDksIDB4Y2U2MWU0OWYsCisJMHg1ZWRlZjkwZSwgMHgyOWQ5Yzk5OCwgMHhiMGQwOTgyMiwgMHhjN2Q3YThiNCwKKwkweDU5YjMzZDE3LCAweDJlYjQwZDgxLCAweGI3YmQ1YzNiLCAweGMwYmE2Y2FkLAorCTB4ZWRiODgzMjAsIDB4OWFiZmIzYjYsIDB4MDNiNmUyMGMsIDB4NzRiMWQyOWEsCisJMHhlYWQ1NDczOSwgMHg5ZGQyNzdhZiwgMHgwNGRiMjYxNSwgMHg3M2RjMTY4MywKKwkweGUzNjMwYjEyLCAweDk0NjQzYjg0LCAweDBkNmQ2YTNlLCAweDdhNmE1YWE4LAorCTB4ZTQwZWNmMGIsIDB4OTMwOWZmOWQsIDB4MGEwMGFlMjcsIDB4N2QwNzllYjEsCisJMHhmMDBmOTM0NCwgMHg4NzA4YTNkMiwgMHgxZTAxZjI2OCwgMHg2OTA2YzJmZSwKKwkweGY3NjI1NzVkLCAweDgwNjU2N2NiLCAweDE5NmMzNjcxLCAweDZlNmIwNmU3LAorCTB4ZmVkNDFiNzYsIDB4ODlkMzJiZTAsIDB4MTBkYTdhNWEsIDB4NjdkZDRhY2MsCisJMHhmOWI5ZGY2ZiwgMHg4ZWJlZWZmOSwgMHgxN2I3YmU0MywgMHg2MGIwOGVkNSwKKwkweGQ2ZDZhM2U4LCAweGExZDE5MzdlLCAweDM4ZDhjMmM0LCAweDRmZGZmMjUyLAorCTB4ZDFiYjY3ZjEsIDB4YTZiYzU3NjcsIDB4M2ZiNTA2ZGQsIDB4NDhiMjM2NGIsCisJMHhkODBkMmJkYSwgMHhhZjBhMWI0YywgMHgzNjAzNGFmNiwgMHg0MTA0N2E2MCwKKwkweGRmNjBlZmMzLCAweGE4NjdkZjU1LCAweDMxNmU4ZWVmLCAweDQ2NjliZTc5LAorCTB4Y2I2MWIzOGMsIDB4YmM2NjgzMWEsIDB4MjU2ZmQyYTAsIDB4NTI2OGUyMzYsCisJMHhjYzBjNzc5NSwgMHhiYjBiNDcwMywgMHgyMjAyMTZiOSwgMHg1NTA1MjYyZiwKKwkweGM1YmEzYmJlLCAweGIyYmQwYjI4LCAweDJiYjQ1YTkyLCAweDVjYjM2YTA0LAorCTB4YzJkN2ZmYTcsIDB4YjVkMGNmMzEsIDB4MmNkOTllOGIsIDB4NWJkZWFlMWQsCisJMHg5YjY0YzJiMCwgMHhlYzYzZjIyNiwgMHg3NTZhYTM5YywgMHgwMjZkOTMwYSwKKwkweDljMDkwNmE5LCAweGViMGUzNjNmLCAweDcyMDc2Nzg1LCAweDA1MDA1NzEzLAorCTB4OTViZjRhODIsIDB4ZTJiODdhMTQsIDB4N2JiMTJiYWUsIDB4MGNiNjFiMzgsCisJMHg5MmQyOGU5YiwgMHhlNWQ1YmUwZCwgMHg3Y2RjZWZiNywgMHgwYmRiZGYyMSwKKwkweDg2ZDNkMmQ0LCAweGYxZDRlMjQyLCAweDY4ZGRiM2Y4LCAweDFmZGE4MzZlLAorCTB4ODFiZTE2Y2QsIDB4ZjZiOTI2NWIsIDB4NmZiMDc3ZTEsIDB4MThiNzQ3NzcsCisJMHg4ODA4NWFlNiwgMHhmZjBmNmE3MCwgMHg2NjA2M2JjYSwgMHgxMTAxMGI1YywKKwkweDhmNjU5ZWZmLCAweGY4NjJhZTY5LCAweDYxNmJmZmQzLCAweDE2NmNjZjQ1LAorCTB4YTAwYWUyNzgsIDB4ZDcwZGQyZWUsIDB4NGUwNDgzNTQsIDB4MzkwM2IzYzIsCisJMHhhNzY3MjY2MSwgMHhkMDYwMTZmNywgMHg0OTY5NDc0ZCwgMHgzZTZlNzdkYiwKKwkweGFlZDE2YTRhLCAweGQ5ZDY1YWRjLCAweDQwZGYwYjY2LCAweDM3ZDgzYmYwLAorCTB4YTliY2FlNTMsIDB4ZGViYjllYzUsIDB4NDdiMmNmN2YsIDB4MzBiNWZmZTksCisJMHhiZGJkZjIxYywgMHhjYWJhYzI4YSwgMHg1M2IzOTMzMCwgMHgyNGI0YTNhNiwKKwkweGJhZDAzNjA1LCAweGNkZDcwNjkzLCAweDU0ZGU1NzI5LCAweDIzZDk2N2JmLAorCTB4YjM2NjdhMmUsIDB4YzQ2MTRhYjgsIDB4NWQ2ODFiMDIsIDB4MmE2ZjJiOTQsCisJMHhiNDBiYmUzNywgMHhjMzBjOGVhMSwgMHg1YTA1ZGYxYiwgMHgyZDAyZWY4ZAorfTsKKworLyoKK1VDSEFSICAgV0VQS0VZW10gPSB7CisJCS8vSVYKKwkJMHgwMCwgMHgxMSwgMHgyMiwKKwkJLy9XRVAgS0VZCisJCTB4MDAsIDB4MTEsIDB4MjIsIDB4MzMsIDB4NDQsIDB4NTUsIDB4NjYsIDB4NzcsIDB4ODgsIDB4OTksIDB4QUEsIDB4QkIsIDB4Q0MKKwl9OworICovCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lCURlc2NyaXB0aW9uOgorCQlJbml0IFdFUCBmdW5jdGlvbi4KKworCUFyZ3VtZW50czoKKyAgICAgIHBBZAkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCQlwS2V5ICAgICAgICBQb2ludGVyIHRvIHRoZSBXRVAgS0VZCisJCUtleUlkCQkgICBXRVAgS2V5IElECisJCUtleUxlbiAgICAgIHRoZSBsZW5ndGggb2YgV0VQIEtFWQorCQlwRGVzdCAgICAgICBQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiB3aGljaCBFbmNyeXB0aW9uIGRhdGEgd2lsbCBzdG9yZSBpbi4KKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlSVE1QSW5pdFdlcEVuZ2luZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlwS2V5LAorCUlOCVVDSEFSCQkJS2V5SWQsCisJSU4JVUNIQVIJCQlLZXlMZW4sCisJSU4gT1VUCVBVQ0hBUgkJcERlc3QpCit7CisJVUlOVCBpOworCVVDSEFSICAgV0VQS0VZW10gPSB7CisJCS8vSVYKKwkJMHgwMCwgMHgxMSwgMHgyMiwKKwkJLy9XRVAgS0VZCisJCTB4MDAsIDB4MTEsIDB4MjIsIDB4MzMsIDB4NDQsIDB4NTUsIDB4NjYsIDB4NzcsIDB4ODgsIDB4OTksIDB4QUEsIDB4QkIsIDB4Q0MKKwl9OworCisJcEFkLT5Qcml2YXRlSW5mby5GQ1NDUkMzMiA9IFBQUElOSVRGQ1MzMjsgICAvL0luaXQgY3JjMzIuCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKyAgICBpZiAocEFkLT5TdGFDZmcuYkNraXBPbiAmJiAocEFkLT5TdGFDZmcuQ2tpcEZsYWcgJiAweDEwKSAmJiAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkpCisgICAgeworICAgICAgICBBUkNGT1VSX0lOSVQoJnBBZC0+UHJpdmF0ZUluZm8uV0VQQ09OVEVYVCwgcEtleSwgS2V5TGVuKTsgIC8vSU5JVCBTQk9YLCBLRVlMRU4rMyhJVikKKyAgICAgICAgTmRpc01vdmVNZW1vcnkocERlc3QsIHBLZXksIDMpOyAgLy9BcHBlbmQgSW5pdCBWZWN0b3IKKyAgICB9CisgICAgZWxzZQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworICAgIHsKKwkJTmRpc01vdmVNZW1vcnkoV0VQS0VZICsgMywgcEtleSwgS2V5TGVuKTsKKworICAgICAgICBmb3IoaSA9IDA7IGkgPCAzOyBpKyspCisJCQlXRVBLRVlbaV0gPSBSYW5kb21CeXRlKHBBZCk7ICAgLy9DYWxsIG1sbWUgUmFuZG9tQnl0ZSgpIGZ1bmN0aW9uLgorCQlBUkNGT1VSX0lOSVQoJnBBZC0+UHJpdmF0ZUluZm8uV0VQQ09OVEVYVCwgV0VQS0VZLCBLZXlMZW4gKyAzKTsgIC8vSU5JVCBTQk9YLCBLRVlMRU4rMyhJVikKKworCQlOZGlzTW92ZU1lbW9yeShwRGVzdCwgV0VQS0VZLCAzKTsgIC8vQXBwZW5kIEluaXQgVmVjdG9yCisgICAgfQorCSoocERlc3QrMykgPSAoS2V5SWQgPDwgNik7ICAgICAgIC8vQXBwZW5kIEtFWUlECisKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUJRGVzY3JpcHRpb246CisJCUVuY3J5cHQgdHJhbnNpbWl0dGVkIGRhdGEKKworCUFyZ3VtZW50czoKKyAgICAgIHBBZAkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorICAgICAgcFNyYyAgICAgICAgUG9pbnRlciB0byB0aGUgdHJhbnNpbWl0dGVkIHNvdXJjZSBkYXRhIHRoYXQgd2lsbCBiZSBlbmNyeXB0CisgICAgICBwRGVzdCAgICAgICBQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiB3aGVyZSBlbnRyeXB0aW9uIGRhdGEgd2lsbCBiZSBzdG9yZSBpbi4KKyAgICAgIExlbgkJCUluZGljYXRlIHRoZSBsZW5ndGggb2YgdGhlIHNvdXJjZSBkYXRhCisKKwlSZXR1cm4gVmFsdWU6CisgICAgICBOb25lCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECVJUTVBFbmNyeXB0RGF0YSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlwU3JjLAorCUlOCVBVQ0hBUgkJCXBEZXN0LAorCUlOCVVJTlQJCQlMZW4pCit7CisJcEFkLT5Qcml2YXRlSW5mby5GQ1NDUkMzMiA9IFJUTVBfQ0FMQ19GQ1MzMihwQWQtPlByaXZhdGVJbmZvLkZDU0NSQzMyLCBwU3JjLCBMZW4pOworCUFSQ0ZPVVJfRU5DUllQVCgmcEFkLT5Qcml2YXRlSW5mby5XRVBDT05URVhULCBwRGVzdCwgcFNyYywgTGVuKTsKK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZQlEZXNjcmlwdGlvbjoKKwkJRGVjcnlwdCByZWNlaXZlZCBXRVAgZGF0YQorCisJQXJndW1lbnRzOgorCQlwQWRhcHRlcgkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCQlwU3JjICAgICAgICBQb2ludGVyIHRvIHRoZSByZWNlaXZlZCBkYXRhCisJCUxlbiAgICAgICAgIHRoZSBsZW5ndGggb2YgdGhlIHJlY2VpdmVkIGRhdGEKKworCVJldHVybiBWYWx1ZToKKwkJVFJVRSAgICAgICAgRGVjcnlwdCBXRVAgZGF0YSBzdWNjZXNzCisJCUZBTFNFICAgICAgIERlY3J5cHQgV0VQIGRhdGEgZmFpbGVkCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworQk9PTEVBTglSVE1QU29mdERlY3J5cHRXRVAoCisJSU4gUFJUTVBfQURBUFRFUiAJcEFkLAorCUlOIFBVQ0hBUgkJCXBEYXRhLAorCUlOIFVMT05HCQkJRGF0YUJ5dGVDbnQsCisJSU4gUENJUEhFUl9LRVkJCXBHcm91cEtleSkKK3sKKwlVSU5UCXRyYWlsZmNzOworCVVJTlQgICAgY3JjMzI7CisJVUNIQVIJS2V5SWR4OworCVVDSEFSICAgV0VQS0VZW10gPSB7CisJCS8vSVYKKwkJMHgwMCwgMHgxMSwgMHgyMiwKKwkJLy9XRVAgS0VZCisJCTB4MDAsIDB4MTEsIDB4MjIsIDB4MzMsIDB4NDQsIDB4NTUsIDB4NjYsIDB4NzcsIDB4ODgsIDB4OTksIDB4QUEsIDB4QkIsIDB4Q0MKKwl9OworCVVDSEFSIAkqcFBheWxvYWQgPSAoVUNIQVIgKilwRGF0YSArIExFTkdUSF84MDJfMTE7CisJVUxPTkcJcGF5bG9hZF9sZW4gPSBEYXRhQnl0ZUNudCAtIExFTkdUSF84MDJfMTE7CisKKwlOZGlzTW92ZU1lbW9yeShXRVBLRVksIHBQYXlsb2FkLCAzKTsgICAgLy9HZXQgV0VQIElWCisKKwlLZXlJZHggPSAoKihwUGF5bG9hZCArIDMpICYgMHhjMCkgPj4gNjsKKwlpZiAocEdyb3VwS2V5W0tleUlkeF0uS2V5TGVuID09IDApCisJCXJldHVybiAoRkFMU0UpOworCisJTmRpc01vdmVNZW1vcnkoV0VQS0VZICsgMywgcEdyb3VwS2V5W0tleUlkeF0uS2V5LCBwR3JvdXBLZXlbS2V5SWR4XS5LZXlMZW4pOworCUFSQ0ZPVVJfSU5JVCgmcEFkLT5Qcml2YXRlSW5mby5XRVBDT05URVhULCBXRVBLRVksIHBHcm91cEtleVtLZXlJZHhdLktleUxlbiArIDMpOworCUFSQ0ZPVVJfREVDUllQVCgmcEFkLT5Qcml2YXRlSW5mby5XRVBDT05URVhULCBwUGF5bG9hZCwgcFBheWxvYWQgKyA0LCBwYXlsb2FkX2xlbiAtIDQpOworCU5kaXNNb3ZlTWVtb3J5KCZ0cmFpbGZjcywgcFBheWxvYWQgKyBwYXlsb2FkX2xlbiAtIDgsIDQpOworCWNyYzMyID0gUlRNUF9DQUxDX0ZDUzMyKFBQUElOSVRGQ1MzMiwgcFBheWxvYWQsIHBheWxvYWRfbGVuIC0gOCk7ICAvL1NraXAgbGFzdCA0IGJ5dGVzKEZDUykuCisJY3JjMzIgXj0gMHhmZmZmZmZmZjsgICAgICAgICAgICAgLyogY29tcGxlbWVudCAqLworCisgICAgaWYoY3JjMzIgIT0gY3B1MmxlMzIodHJhaWxmY3MpKQorICAgIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISBXRVAgRGF0YSBDUkMgRXJyb3IgIVxuIikpOwkgLy9DUkMgZXJyb3IuCisJCXJldHVybiAoRkFMU0UpOworCX0KKwlyZXR1cm4gKFRSVUUpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZQlEZXNjcmlwdGlvbjoKKwkJVGhlIFN0cmVhbSBDaXBoZXIgRW5jcnlwdGlvbiBBbGdvcml0aG0gIkFSQ0ZPVVIiIGluaXRpYWxpemUKKworCUFyZ3VtZW50czoKKwkgICBDdHggICAgICAgICBQb2ludGVyIHRvIEFSQ0ZPVVIgQ09OVEVYVCAoU0JPWCkKKwkJcEtleSAgICAgICAgUG9pbnRlciB0byB0aGUgV0VQIEtFWQorCQlLZXlMZW4gICAgICBJbmRpY2F0ZSB0aGUgbGVuZ3RoIGZvIHRoZSBXRVAgS0VZCisKKwlSZXR1cm4gVmFsdWU6CisJICAgTm9uZQorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlBUkNGT1VSX0lOSVQoCisJSU4JUEFSQ0ZPVVJDT05URVhUCUN0eCwKKwlJTglQVUNIQVIJCQlwS2V5LAorCUlOCVVJTlQJCQlLZXlMZW4pCit7CisJVUNIQVIJdCwgdTsKKwlVSU5UCWtleWluZGV4OworCVVJTlQJc3RhdGVpbmRleDsKKwlQVUNIQVIJc3RhdGU7CisJVUlOVAljb3VudGVyOworCisJc3RhdGUgPSBDdHgtPlNUQVRFOworCUN0eC0+WCA9IDA7CisJQ3R4LT5ZID0gMDsKKwlmb3IgKGNvdW50ZXIgPSAwOyBjb3VudGVyIDwgMjU2OyBjb3VudGVyKyspCisJCXN0YXRlW2NvdW50ZXJdID0gKFVDSEFSKWNvdW50ZXI7CisJa2V5aW5kZXggPSAwOworCXN0YXRlaW5kZXggPSAwOworCWZvciAoY291bnRlciA9IDA7IGNvdW50ZXIgPCAyNTY7IGNvdW50ZXIrKykKKwl7CisJCXQgPSBzdGF0ZVtjb3VudGVyXTsKKwkJc3RhdGVpbmRleCA9IChzdGF0ZWluZGV4ICsgcEtleVtrZXlpbmRleF0gKyB0KSAmIDB4ZmY7CisJCXUgPSBzdGF0ZVtzdGF0ZWluZGV4XTsKKwkJc3RhdGVbc3RhdGVpbmRleF0gPSB0OworCQlzdGF0ZVtjb3VudGVyXSA9IHU7CisJCWlmICgrK2tleWluZGV4ID49IEtleUxlbikKKwkJCWtleWluZGV4ID0gMDsKKwl9Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lCURlc2NyaXB0aW9uOgorCQlHZXQgYnl0ZXMgZnJvbSBBUkNGT1VSIENPTlRFWFQgKFMtQk9YKQorCisJQXJndW1lbnRzOgorCSAgIEN0eCAgICAgICAgIFBvaW50ZXIgdG8gQVJDRk9VUiBDT05URVhUIChTQk9YKQorCisJUmV0dXJuIFZhbHVlOgorCSAgIFVDSEFSICAtIHRoZSB2YWx1ZSBvZiB0aGUgQVJDRk9VUiBDT05URVhUIChTLUJPWCkKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitVQ0hBUglBUkNGT1VSX0JZVEUoCisJSU4JUEFSQ0ZPVVJDT05URVhUCQlDdHgpCit7CisgIFVJTlQgeDsKKyAgVUlOVCB5OworICBVQ0hBUiBzeCwgc3k7CisgIFBVQ0hBUiBzdGF0ZTsKKworICBzdGF0ZSA9IEN0eC0+U1RBVEU7CisgIHggPSAoQ3R4LT5YICsgMSkgJiAweGZmOworICBzeCA9IHN0YXRlW3hdOworICB5ID0gKHN4ICsgQ3R4LT5ZKSAmIDB4ZmY7CisgIHN5ID0gc3RhdGVbeV07CisgIEN0eC0+WCA9IHg7CisgIEN0eC0+WSA9IHk7CisgIHN0YXRlW3ldID0gc3g7CisgIHN0YXRlW3hdID0gc3k7CisKKyAgcmV0dXJuKHN0YXRlWyhzeCArIHN5KSAmIDB4ZmZdKTsKKworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZQlEZXNjcmlwdGlvbjoKKwkJVGhlIFN0cmVhbSBDaXBoZXIgRGVjcnlwdGlvbiBBbGdvcml0aG0KKworCUFyZ3VtZW50czoKKwkJQ3R4ICAgICAgICAgUG9pbnRlciB0byBBUkNGT1VSIENPTlRFWFQgKFNCT1gpCisJCXBEZXN0CQkJUG9pbnRlciB0byB0aGUgRGVzdGluYXRpb24KKwkJcFNyYyAgICAgICAgUG9pbnRlciB0byB0aGUgU291cmNlIGRhdGEKKwkJTGVuICAgICAgICAgSW5kaWNhdGUgdGhlIGxlbmd0aCBvZiB0aGUgU291cmNlIGRhdGEKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJQVJDRk9VUl9ERUNSWVBUKAorCUlOCVBBUkNGT1VSQ09OVEVYVAlDdHgsCisJSU4JUFVDSEFSCQkJcERlc3QsCisJSU4JUFVDSEFSCQkJcFNyYywKKwlJTglVSU5UCQkJTGVuKQoreworCVVJTlQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBMZW47IGkrKykKKwkJcERlc3RbaV0gPSBwU3JjW2ldIF4gQVJDRk9VUl9CWVRFKEN0eCk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lCURlc2NyaXB0aW9uOgorCQlUaGUgU3RyZWFtIENpcGhlciBFbmNyeXB0aW9uIEFsZ29yaXRobQorCisJQXJndW1lbnRzOgorCQlDdHggICAgICAgICBQb2ludGVyIHRvIEFSQ0ZPVVIgQ09OVEVYVCAoU0JPWCkKKwkJcERlc3QJCQlQb2ludGVyIHRvIHRoZSBEZXN0aW5hdGlvbgorCQlwU3JjICAgICAgICBQb2ludGVyIHRvIHRoZSBTb3VyY2UgZGF0YQorCQlMZW4gICAgICAgICBJbmRpY2F0ZSB0aGUgbGVuZ3RoIG9mIHRoZSBTb3VyY2UgZHRhCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJQVJDRk9VUl9FTkNSWVBUKAorCUlOCVBBUkNGT1VSQ09OVEVYVAlDdHgsCisJSU4JUFVDSEFSCQkJcERlc3QsCisJSU4JUFVDSEFSCQkJcFNyYywKKwlJTglVSU5UCQkJTGVuKQoreworCVVJTlQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBMZW47IGkrKykKKwkJcERlc3RbaV0gPSBwU3JjW2ldIF4gQVJDRk9VUl9CWVRFKEN0eCk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lCURlc2NyaXB0aW9uOgorCQlUaGUgU3RyZWFtIENpcGhlciBFbmNyeXB0aW9uIEFsZ29yaXRobSB3aGljaCBjb25mb3JtIHRvIHRoZSBzcGVjaWFsIHJlcXVpcmVtZW50IHRvIGVuY3J5cHQgIEdUSy4KKworCUFyZ3VtZW50czoKKwkJQ3R4ICAgICAgICAgUG9pbnRlciB0byBBUkNGT1VSIENPTlRFWFQgKFNCT1gpCisJCXBEZXN0CQkJUG9pbnRlciB0byB0aGUgRGVzdGluYXRpb24KKwkJcFNyYyAgICAgICAgUG9pbnRlciB0byB0aGUgU291cmNlIGRhdGEKKwkJTGVuICAgICAgICAgSW5kaWNhdGUgdGhlIGxlbmd0aCBvZiB0aGUgU291cmNlIGR0YQorCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCisKK1ZPSUQJV1BBQVJDRk9VUl9FTkNSWVBUKAorCUlOCVBBUkNGT1VSQ09OVEVYVAlDdHgsCisJSU4JUFVDSEFSCQkJcERlc3QsCisJSU4JUFVDSEFSCQkJcFNyYywKKwlJTglVSU5UCQkJTGVuKQoreworCVVJTlQgaTsKKyAgICAgICAgLy9kaXNjYXJkIGZpcnN0IDI1NiBieXRlcworCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKKyAgICAgICAgICAgIEFSQ0ZPVVJfQllURShDdHgpOworCisJZm9yIChpID0gMDsgaSA8IExlbjsgaSsrKQorCQlwRGVzdFtpXSA9IHBTcmNbaV0gXiBBUkNGT1VSX0JZVEUoQ3R4KTsKK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZQlEZXNjcmlwdGlvbjoKKwkJQ2FsY3VsYXRlIGEgbmV3IEZDUyBnaXZlbiB0aGUgY3VycmVudCBGQ1MgYW5kIHRoZSBuZXcgZGF0YS4KKworCUFyZ3VtZW50czoKKwkJRmNzCSAgICAgIHRoZSBvcmlnaW5hbCBGQ1MgdmFsdWUKKwkJQ3AgICAgICAgICAgcG9pbnRlciB0byB0aGUgZGF0YSB3aGljaCB3aWxsIGJlIGNhbGN1bGF0ZSB0aGUgRkNTCisJCUxlbiAgICAgICAgIHRoZSBsZW5ndGggb2YgdGhlIGRhdGEKKworCVJldHVybiBWYWx1ZToKKwkJVUlOVCAtIEZDUyAzMiBiaXRzCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitVSU5UCVJUTVBfQ0FMQ19GQ1MzMigKKwlJTglVSU5UCUZjcywKKwlJTglQVUNIQVIJQ3AsCisJSU4JSU5UCQlMZW4pCit7CisJd2hpbGUgKExlbi0tKQorCSAgIEZjcyA9ICgoKEZjcykgPj4gOCkgXiBGQ1NUQUJfMzJbKChGY3MpIF4gKCpDcCsrKSkgJiAweGZmXSk7CisKKwlyZXR1cm4gKEZjcyk7Cit9CisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUJRGVzY3JpcHRpb246CisJCUdldCBsYXN0IEZDUyBhbmQgZW5jcnlwdCBpdCB0byB0aGUgZGVzdGluYXRpb24KKworCUFyZ3VtZW50czoKKwkJcERlc3QJCQlQb2ludGVyIHRvIHRoZSBEZXN0aW5hdGlvbgorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlSVE1QU2V0SUNWKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUglwRGVzdCkKK3sKKwlwQWQtPlByaXZhdGVJbmZvLkZDU0NSQzMyIF49IDB4ZmZmZmZmZmY7ICAgICAgICAgICAgIC8qIGNvbXBsZW1lbnQgKi8KKwlwQWQtPlByaXZhdGVJbmZvLkZDU0NSQzMyID0gY3B1MmxlMzIocEFkLT5Qcml2YXRlSW5mby5GQ1NDUkMzMik7CisKKwlBUkNGT1VSX0VOQ1JZUFQoJnBBZC0+UHJpdmF0ZUluZm8uV0VQQ09OVEVYVCwgcERlc3QsIChQVUNIQVIpICZwQWQtPlByaXZhdGVJbmZvLkZDU0NSQzMyLCA0KTsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vcnR1c2JfYnVsay5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vcnR1c2JfYnVsay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0NmQ5MTYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9ydHVzYl9idWxrLmMKQEAgLTAsMCArMSwxOTgxIEBACisgLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwlNb2R1bGUgTmFtZToKKwlydHVzYl9idWxrLmMKKworCUFic3RyYWN0OgorCisJUmV2aXNpb24gSGlzdG9yeToKKwlXaG8JCQlXaGVuCQlXaGF0CisJLS0tLS0tLS0JLS0tLS0tLS0tLQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJTmFtZQkJRGF0ZQkJTW9kaWZpY2F0aW9uIGxvZ3MKKwlQYXVsIExpbgkwNi0yNS0yMDA0CWNyZWF0ZWQKKworKi8KKworI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgorLy8gTWF0Y2ggdG90YWwgNiBidWxrb3V0IGVuZHBvaW50IHRvIGNvcnJlc3BvbmRpbmcgcXVldWUuCitVQ0hBUglFcFRvUXVldWVbNl09e0ZJRk9fRURDQSwgRklGT19FRENBLCBGSUZPX0VEQ0EsIEZJRk9fRURDQSwgRklGT19FRENBLCBGSUZPX01HTVR9OworCisvL3N0YXRpYyBCT09MRUFOIFNpbmdsZUJ1bGtPdXQgPSBGQUxTRTsKKwordm9pZCBSVFVTQl9GSUxMX0JVTEtfVVJCIChzdHJ1Y3QgdXJiICpwVXJiLAorCXN0cnVjdCB1c2JfZGV2aWNlICpwVXNiX0RldiwKKwl1bnNpZ25lZCBpbnQgYnVsa3BpcGUsCisJdm9pZCAqcFRyYW5zZmVyQnVmLAorCWludCBCdWZTaXplLAorCXVzYl9jb21wbGV0ZV90IENvbXBsZXRlLAorCXZvaWQgKnBDb250ZXh0KQoreworCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQorCXVzYl9maWxsX2J1bGtfdXJiKHBVcmIsIHBVc2JfRGV2LCBidWxrcGlwZSwgcFRyYW5zZmVyQnVmLCBCdWZTaXplLCAodXNiX2NvbXBsZXRlX3QpQ29tcGxldGUsIHBDb250ZXh0KTsKKyNlbHNlCisJRklMTF9CVUxLX1VSQihwVXJiLCBwVXNiX0RldiwgYnVsa3BpcGUsIHBUcmFuc2ZlckJ1ZiwgQnVmU2l6ZSwgQ29tcGxldGUsIHBDb250ZXh0KTsKKyNlbmRpZgorCit9CisKK1ZPSUQJUlRVU0JJbml0VHhEZXNjKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBUWF9DT05URVhUCQlwVHhDb250ZXh0LAorCUlOCVVDSEFSCQkJQnVsa091dFBpcGVJZCwKKwlJTgl1c2JfY29tcGxldGVfdAlGdW5jKQoreworCVBVUkIJCQkJcFVyYjsKKwlQVUNIQVIJCQkJcFNyYyA9IE5VTEw7CisJUE9TX0NPT0tJRQkJCXBPYmogPSAoUE9TX0NPT0tJRSkgcEFkLT5PU19Db29raWU7CisKKwlwVXJiID0gcFR4Q29udGV4dC0+cFVyYjsKKwlBU1NFUlQocFVyYik7CisKKwkvLyBTdG9yZSBCdWxrT3V0IFBpcGVJZAorCXBUeENvbnRleHQtPkJ1bGtPdXRQaXBlSWQgPSBCdWxrT3V0UGlwZUlkOworCisJaWYgKHBUeENvbnRleHQtPmJBZ2dyZWdhdGlibGUpCisJeworCQlwU3JjID0gJnBUeENvbnRleHQtPlRyYW5zZmVyQnVmZmVyLT5BZ2dyZWdhdGlvblsyXTsKKwl9CisJZWxzZQorCXsKKwkJcFNyYyA9IChQVUNIQVIpIHBUeENvbnRleHQtPlRyYW5zZmVyQnVmZmVyLT5maWVsZC5XaXJlbGVzc1BhY2tldDsKKwl9CisKKworCS8vSW5pdGlhbGl6ZSBhIHR4IGJ1bGsgdXJiCisJUlRVU0JfRklMTF9CVUxLX1VSQihwVXJiLAorCQkJCQkJcE9iai0+cFVzYl9EZXYsCisJCQkJCQl1c2Jfc25kYnVsa3BpcGUocE9iai0+cFVzYl9EZXYsIHBBZC0+QnVsa091dEVwQWRkcltCdWxrT3V0UGlwZUlkXSksCisJCQkJCQlwU3JjLAorCQkJCQkJcFR4Q29udGV4dC0+QnVsa091dFNpemUsCisJCQkJCQlGdW5jLAorCQkJCQkJcFR4Q29udGV4dCk7CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApCisJaWYgKHBUeENvbnRleHQtPmJBZ2dyZWdhdGlibGUpCisJCXBVcmItPnRyYW5zZmVyX2RtYQk9IChwVHhDb250ZXh0LT5kYXRhX2RtYSArIFRYX0JVRkZFUl9OT1JNU0laRSArIDIpOworCWVsc2UKKwkJcFVyYi0+dHJhbnNmZXJfZG1hCT0gcFR4Q29udGV4dC0+ZGF0YV9kbWE7CisKKwlwVXJiLT50cmFuc2Zlcl9mbGFncyB8PSBVUkJfTk9fVFJBTlNGRVJfRE1BX01BUDsKKyNlbmRpZgorCit9CisKK1ZPSUQJUlRVU0JJbml0SFRUeERlc2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUEhUX1RYX0NPTlRFWFQJcFR4Q29udGV4dCwKKwlJTglVQ0hBUgkJCUJ1bGtPdXRQaXBlSWQsCisJSU4JVUxPTkcJCQlCdWxrT3V0U2l6ZSwKKwlJTgl1c2JfY29tcGxldGVfdAlGdW5jKQoreworCVBVUkIJCQkJcFVyYjsKKwlQVUNIQVIJCQkJcFNyYyA9IE5VTEw7CisJUE9TX0NPT0tJRQkJCXBPYmogPSAoUE9TX0NPT0tJRSkgcEFkLT5PU19Db29raWU7CisKKwlwVXJiID0gcFR4Q29udGV4dC0+cFVyYjsKKwlBU1NFUlQocFVyYik7CisKKwkvLyBTdG9yZSBCdWxrT3V0IFBpcGVJZAorCXBUeENvbnRleHQtPkJ1bGtPdXRQaXBlSWQgPSBCdWxrT3V0UGlwZUlkOworCisJcFNyYyA9ICZwVHhDb250ZXh0LT5UcmFuc2ZlckJ1ZmZlci0+ZmllbGQuV2lyZWxlc3NQYWNrZXRbcFR4Q29udGV4dC0+TmV4dEJ1bGtPdXRQb3NpdGlvbl07CisKKworCS8vSW5pdGlhbGl6ZSBhIHR4IGJ1bGsgdXJiCisJUlRVU0JfRklMTF9CVUxLX1VSQihwVXJiLAorCQkJCQkJcE9iai0+cFVzYl9EZXYsCisJCQkJCQl1c2Jfc25kYnVsa3BpcGUocE9iai0+cFVzYl9EZXYsIHBBZC0+QnVsa091dEVwQWRkcltCdWxrT3V0UGlwZUlkXSksCisJCQkJCQlwU3JjLAorCQkJCQkJQnVsa091dFNpemUsCisJCQkJCQlGdW5jLAorCQkJCQkJcFR4Q29udGV4dCk7CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApCisJcFVyYi0+dHJhbnNmZXJfZG1hCT0gKHBUeENvbnRleHQtPmRhdGFfZG1hICsgcFR4Q29udGV4dC0+TmV4dEJ1bGtPdXRQb3NpdGlvbik7CisJcFVyYi0+dHJhbnNmZXJfZmxhZ3MgfD0gVVJCX05PX1RSQU5TRkVSX0RNQV9NQVA7CisjZW5kaWYKKworfQorCitWT0lECVJUVVNCSW5pdFJ4RGVzYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQUlhfQ09OVEVYVAkJcFJ4Q29udGV4dCkKK3sKKwlQVVJCCQkJCXBVcmI7CisJUE9TX0NPT0tJRQkJCXBPYmogPSAoUE9TX0NPT0tJRSkgcEFkLT5PU19Db29raWU7CisJVUxPTkcJCQkJUlhfYnVsa19zaXplOworCisKKwlwVXJiID0gcFJ4Q29udGV4dC0+cFVyYjsKKwlBU1NFUlQocFVyYik7CisKKwlpZiAoIHBBZC0+QnVsa0luTWF4UGFja2V0U2l6ZSA9PSA2NCkKKwkJUlhfYnVsa19zaXplID0gNDA5NjsKKwllbHNlCisJCVJYX2J1bGtfc2l6ZSA9IE1BWF9SWEJVTEtfU0laRTsKKworCS8vSW5pdGlhbGl6ZSBhIHJ4IGJ1bGsgdXJiCisJUlRVU0JfRklMTF9CVUxLX1VSQihwVXJiLAorCQkJCQkJcE9iai0+cFVzYl9EZXYsCisJCQkJCQl1c2JfcmN2YnVsa3BpcGUocE9iai0+cFVzYl9EZXYsIHBBZC0+QnVsa0luRXBBZGRyKSwKKwkJCQkJCSYocFJ4Q29udGV4dC0+VHJhbnNmZXJCdWZmZXJbcEFkLT5OZXh0UnhCdWxrSW5Qb3NpdGlvbl0pLAorCQkJCQkJUlhfYnVsa19zaXplIC0gKHBBZC0+TmV4dFJ4QnVsa0luUG9zaXRpb24pLAorCQkJCQkJKHVzYl9jb21wbGV0ZV90KVJUVVNCQnVsa1J4Q29tcGxldGUsCisJCQkJCQkodm9pZCAqKXBSeENvbnRleHQpOworCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQorCXBVcmItPnRyYW5zZmVyX2RtYQk9IHBSeENvbnRleHQtPmRhdGFfZG1hICsgcEFkLT5OZXh0UnhCdWxrSW5Qb3NpdGlvbjsKKwlwVXJiLT50cmFuc2Zlcl9mbGFncyB8PSBVUkJfTk9fVFJBTlNGRVJfRE1BX01BUDsKKyNlbmRpZgorCisKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisKKwlBcmd1bWVudHM6CisKKwlSZXR1cm4gVmFsdWU6CisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworCisjZGVmaW5lIEJVTEtfT1VUX0xPQ0socExvY2ssIElycUZsYWdzKQlcCisJCWlmKDEgLyohKGluX2ludGVycnVwdCgpICYgMHhmZmZmMDAwMCkqLykJXAorCQkJUlRNUF9JUlFfTE9DSygocExvY2spLCBJcnFGbGFncyk7CisKKyNkZWZpbmUgQlVMS19PVVRfVU5MT0NLKHBMb2NrLCBJcnFGbGFncykJXAorCQlpZigxIC8qIShpbl9pbnRlcnJ1cHQoKSAmIDB4ZmZmZjAwMDApKi8pCVwKKwkJCVJUTVBfSVJRX1VOTE9DSygocExvY2spLCBJcnFGbGFncyk7CisKKworVk9JRAlSVFVTQkJ1bGtPdXREYXRhUGFja2V0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVDSEFSCQkJQnVsa091dFBpcGVJZCwKKwlJTglVQ0hBUgkJCUluZGV4KQoreworCisJUEhUX1RYX0NPTlRFWFQJcEhUVFhDb250ZXh0OworCVBVUkIJCQlwVXJiOworCWludAkJCQlyZXQgPSAwOworCVBUWElORk9fU1RSVUMJcFR4SW5mbywgcExhc3RUeEluZm8gPSBOVUxMOworCVBUWFdJX1NUUlVDICAgICAgICAgICAgIHBUeFdJOworCVVMT05HCQkJVG1wQnVsa0VuZFBvcywgVGhpc0J1bGtTaXplOworCXVuc2lnbmVkIGxvbmcJSXJxRmxhZ3MgPSAwLCBJcnFGbGFnczIgPSAwOworCVBVQ0hBUgkJCXBXaXJlbGVzc1BrdCwgcEFwcGVuZGFudDsKKwlCT09MRUFOCQkJYlR4UUxhc3RSb3VuZCA9IEZBTFNFOworCVVDSEFSCQkJYWxsemVyb1s0XT0gezB4MCwweDAsMHgwLDB4MH07CisKKwlCVUxLX09VVF9MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrW0J1bGtPdXRQaXBlSWRdLCBJcnFGbGFncyk7CisJaWYgKChwQWQtPkJ1bGtPdXRQZW5kaW5nW0J1bGtPdXRQaXBlSWRdID09IFRSVUUpIHx8IFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9ORUVEX1NUT1BfVFgpKQorCXsKKwkJQlVMS19PVVRfVU5MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrW0J1bGtPdXRQaXBlSWRdLCBJcnFGbGFncyk7CisJCXJldHVybjsKKwl9CisJcEFkLT5CdWxrT3V0UGVuZGluZ1tCdWxrT3V0UGlwZUlkXSA9IFRSVUU7CisKKwlpZiAoIU9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKQorCQkpCisJeworCQlwQWQtPkJ1bGtPdXRQZW5kaW5nW0J1bGtPdXRQaXBlSWRdID0gRkFMU0U7CisJCUJVTEtfT1VUX1VOTE9DSygmcEFkLT5CdWxrT3V0TG9ja1tCdWxrT3V0UGlwZUlkXSwgSXJxRmxhZ3MpOworCQlyZXR1cm47CisJfQorCUJVTEtfT1VUX1VOTE9DSygmcEFkLT5CdWxrT3V0TG9ja1tCdWxrT3V0UGlwZUlkXSwgSXJxRmxhZ3MpOworCisKKwlwSFRUWENvbnRleHQgPSAmKHBBZC0+VHhDb250ZXh0W0J1bGtPdXRQaXBlSWRdKTsKKworCUJVTEtfT1VUX0xPQ0soJnBBZC0+VHhDb250ZXh0UXVldWVMb2NrW0J1bGtPdXRQaXBlSWRdLCBJcnFGbGFnczIpOworCWlmICgocEhUVFhDb250ZXh0LT5FTmV4dEJ1bGtPdXRQb3NpdGlvbiA9PSBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24pCisJCXx8ICgocEhUVFhDb250ZXh0LT5FTmV4dEJ1bGtPdXRQb3NpdGlvbi04KSA9PSBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24pKQorCXsKKwkJQlVMS19PVVRfVU5MT0NLKCZwQWQtPlR4Q29udGV4dFF1ZXVlTG9ja1tCdWxrT3V0UGlwZUlkXSwgSXJxRmxhZ3MyKTsKKworCQlCVUxLX09VVF9MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrW0J1bGtPdXRQaXBlSWRdLCBJcnFGbGFncyk7CisJCXBBZC0+QnVsa091dFBlbmRpbmdbQnVsa091dFBpcGVJZF0gPSBGQUxTRTsKKworCQkvLyBDbGVhciBEYXRhIGZsYWcKKwkJUlRVU0JfQ0xFQVJfQlVMS19GTEFHKHBBZCwgKGZSVFVTQl9CVUxLX09VVF9EQVRBX0ZSQUcgPDwgQnVsa091dFBpcGVJZCkpOworCQlSVFVTQl9DTEVBUl9CVUxLX0ZMQUcocEFkLCAoZlJUVVNCX0JVTEtfT1VUX0RBVEFfTk9STUFMIDw8IEJ1bGtPdXRQaXBlSWQpKTsKKworCQlCVUxLX09VVF9VTkxPQ0soJnBBZC0+QnVsa091dExvY2tbQnVsa091dFBpcGVJZF0sIElycUZsYWdzKTsKKwkJcmV0dXJuOworCX0KKworCS8vIENsZWFyIERhdGEgZmxhZworCVJUVVNCX0NMRUFSX0JVTEtfRkxBRyhwQWQsIChmUlRVU0JfQlVMS19PVVRfREFUQV9GUkFHIDw8IEJ1bGtPdXRQaXBlSWQpKTsKKwlSVFVTQl9DTEVBUl9CVUxLX0ZMQUcocEFkLCAoZlJUVVNCX0JVTEtfT1VUX0RBVEFfTk9STUFMIDw8IEJ1bGtPdXRQaXBlSWQpKTsKKworCS8vREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJCdWxrT3V0LUI6ST0weCVseCwgQ1dQb3M9JWxkLCBDV1JQb3M9JWxkLCBOQlBvcz0lbGQsIEVOQlBvcz0lbGQsIGJDb3B5PSVkIVxuIiwgaW5faW50ZXJydXB0KCksCisJLy8JCQkJCQkJcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uLCBwSFRUWENvbnRleHQtPkN1cldyaXRlUmVhbFBvcywgcEhUVFhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uLAorCS8vCQkJCQkJCXBIVFRYQ29udGV4dC0+RU5leHRCdWxrT3V0UG9zaXRpb24sIHBIVFRYQ29udGV4dC0+YkNvcHlTYXZlUGFkKSk7CisJcEhUVFhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uID0gcEhUVFhDb250ZXh0LT5FTmV4dEJ1bGtPdXRQb3NpdGlvbjsKKwlUaGlzQnVsa1NpemUgPSAwOworCVRtcEJ1bGtFbmRQb3MgPSBwSFRUWENvbnRleHQtPk5leHRCdWxrT3V0UG9zaXRpb247CisJcFdpcmVsZXNzUGt0ID0gJnBIVFRYQ29udGV4dC0+VHJhbnNmZXJCdWZmZXItPmZpZWxkLldpcmVsZXNzUGFja2V0WzBdOworCisJaWYgKChwSFRUWENvbnRleHQtPmJDb3B5U2F2ZVBhZCA9PSBUUlVFKSkKKwl7CisJCWlmIChSVE1QRXF1YWxNZW1vcnkocEhUVFhDb250ZXh0LT5TYXZlZFBhZCwgYWxsemVybyw0KSkKKwkJeworCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCgiZTEsIGFsbHplcm8gOiAleCAgJXggICV4ICAleCAgJXggICV4ICAleCAgJXggXG4iLAorCQkJCXBIVFRYQ29udGV4dC0+U2F2ZWRQYWRbMF0sIHBIVFRYQ29udGV4dC0+U2F2ZWRQYWRbMV0sIHBIVFRYQ29udGV4dC0+U2F2ZWRQYWRbMl0scEhUVFhDb250ZXh0LT5TYXZlZFBhZFszXQorCQkJCSxwSFRUWENvbnRleHQtPlNhdmVkUGFkWzRdLCBwSFRUWENvbnRleHQtPlNhdmVkUGFkWzVdLCBwSFRUWENvbnRleHQtPlNhdmVkUGFkWzZdLHBIVFRYQ29udGV4dC0+U2F2ZWRQYWRbN10pKTsKKwkJfQorCQlOZGlzTW92ZU1lbW9yeSgmcFdpcmVsZXNzUGt0W1RtcEJ1bGtFbmRQb3NdLCBwSFRUWENvbnRleHQtPlNhdmVkUGFkLCA4KTsKKwkJcEhUVFhDb250ZXh0LT5iQ29weVNhdmVQYWQgPSBGQUxTRTsKKwkJaWYgKHBBZC0+YkZvcmNlUHJpbnRUWCA9PSBUUlVFKQorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSVFVTQkJ1bGtPdXREYXRhUGFja2V0IC0tPiBDT1BZIFBBRC4gQ3VyV3JpdGUgPSAlbGQsIE5leHRCdWxrID0gJWxkLiAgIEVOZXh0QnVsayA9ICVsZC5cbiIsICAgcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uLCBwSFRUWENvbnRleHQtPk5leHRCdWxrT3V0UG9zaXRpb24sIHBIVFRYQ29udGV4dC0+RU5leHRCdWxrT3V0UG9zaXRpb24pKTsKKwl9CisKKwlkbworCXsKKwkJcFR4SW5mbyA9IChQVFhJTkZPX1NUUlVDKSZwV2lyZWxlc3NQa3RbVG1wQnVsa0VuZFBvc107CisJCXBUeFdJID0gKFBUWFdJX1NUUlVDKSZwV2lyZWxlc3NQa3RbVG1wQnVsa0VuZFBvcyArIFRYSU5GT19TSVpFXTsKKworCQlpZiAocEFkLT5iRm9yY2VQcmludFRYID09IFRSVUUpCisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVFVTQkJ1bGtPdXREYXRhUGFja2V0IEFNUERVID0gJWQuXG4iLCAgIHBUeFdJLT5BTVBEVSkpOworCisJCS8vIGFkZCBieSBJdmVyc29uLCBsaW1pdCBCdWxrT3V0IHNpemUgdG8gNGsgdG8gcGFzcyBXTU0gYiBtb2RlIDJUMVIgdGVzdCBpdGVtcworCQkvL2lmICgoVGhpc0J1bGtTaXplICE9IDApICAmJiAocFR4V0ktPkFNUERVID09IDApKQorCQlpZiAoKFRoaXNCdWxrU2l6ZSAhPSAwKSAmJiAocFR4V0ktPlBIWU1PREUgPT0gTU9ERV9DQ0spKQorCQl7CisJCQlpZiAoKChUaGlzQnVsa1NpemUmMHhmZmZmODAwMCkgIT0gMCkgfHwgKChUaGlzQnVsa1NpemUmMHgxMDAwKSA9PSAweDEwMDApKQorCQkJeworCQkJCS8vIExpbWl0IEJ1bGtPdXQgc2l6ZSB0byBhYm91dCA0ayBieXRlcy4KKwkJCQlwSFRUWENvbnRleHQtPkVOZXh0QnVsa091dFBvc2l0aW9uID0gVG1wQnVsa0VuZFBvczsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWVsc2UgaWYgKCgocEFkLT5CdWxrT3V0TWF4UGFja2V0U2l6ZSA8IDUxMikgJiYgKChUaGlzQnVsa1NpemUmMHhmZmZmZjgwMCkgIT0gMCkgKSAvKnx8ICggKFRoaXNCdWxrU2l6ZSAhPSAwKSAgJiYgKHBUeFdJLT5BTVBEVSA9PSAwKSkqLykKKwkJCXsKKwkJCQkvLyBGb3IgVVNCIDEuMSBvciBwZWVyIHdoaWNoIGRpZG4ndCBzdXBwb3J0IEFNUERVLCBsaW1pdCB0aGUgQnVsa091dCBzaXplLgorCQkJCS8vIEZvciBwZXJmb3JtZW5jZSBpbiBiL2cgbW9kZSwgbm93IGp1c3QgY2hlY2sgZm9yIFVTQiAxLjEgYW5kIGRpZG4ndCBjYXJlIGFib3V0IHRoZSBBUE1EVSBvciBub3QhIDIwMDgvMDYvMDQuCisJCQkJcEhUVFhDb250ZXh0LT5FTmV4dEJ1bGtPdXRQb3NpdGlvbiA9IFRtcEJ1bGtFbmRQb3M7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJLy8gZW5kIEl2ZXJzb24KKwkJZWxzZQorCQl7CisJCQlpZiAoKChUaGlzQnVsa1NpemUmMHhmZmZmODAwMCkgIT0gMCkgfHwgKChUaGlzQnVsa1NpemUmMHg2MDAwKSA9PSAweDYwMDApKQorCQkJewkvLyBMaW1pdCBCdWxrT3V0IHNpemUgdG8gYWJvdXQgMjRrIGJ5dGVzLgorCQkJCXBIVFRYQ29udGV4dC0+RU5leHRCdWxrT3V0UG9zaXRpb24gPSBUbXBCdWxrRW5kUG9zOworCQkJCWJyZWFrOworCQkJfQorCQkJZWxzZSBpZiAoKChwQWQtPkJ1bGtPdXRNYXhQYWNrZXRTaXplIDwgNTEyKSAmJiAoKFRoaXNCdWxrU2l6ZSYweGZmZmZmODAwKSAhPSAwKSApIC8qfHwgKCAoVGhpc0J1bGtTaXplICE9IDApICAmJiAocFR4V0ktPkFNUERVID09IDApKSovKQorCQkJewkvLyBGb3IgVVNCIDEuMSBvciBwZWVyIHdoaWNoIGRpZG4ndCBzdXBwb3J0IEFNUERVLCBsaW1pdCB0aGUgQnVsa091dCBzaXplLgorCQkJCS8vIEZvciBwZXJmb3JtZW5jZSBpbiBiL2cgbW9kZSwgbm93IGp1c3QgY2hlY2sgZm9yIFVTQiAxLjEgYW5kIGRpZG4ndCBjYXJlIGFib3V0IHRoZSBBUE1EVSBvciBub3QhIDIwMDgvMDYvMDQuCisJCQkJcEhUVFhDb250ZXh0LT5FTmV4dEJ1bGtPdXRQb3NpdGlvbiA9IFRtcEJ1bGtFbmRQb3M7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlpZiAoVG1wQnVsa0VuZFBvcyA9PSBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24pCisJCXsKKwkJCXBIVFRYQ29udGV4dC0+RU5leHRCdWxrT3V0UG9zaXRpb24gPSBUbXBCdWxrRW5kUG9zOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAocFR4SW5mby0+UVNFTCAhPSBGSUZPX0VEQ0EpCisJCXsKKwkJCXByaW50aygiJXMoKTogPT09PT4gcFR4SW5mby0+UXVldWVTZWwoJWQpIT0gRklGT19FRENBISEhIVxuIiwgX19mdW5jX18sIHBUeEluZm8tPlFTRUwpOworCQkJcHJpbnRrKCJcdENXUG9zPSVsZCwgTkJQb3M9JWxkLCBFTkJQb3M9JWxkLCBiQ29weT0lZCFcbiIsIHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiwgcEhUVFhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uLCBwSFRUWENvbnRleHQtPkVOZXh0QnVsa091dFBvc2l0aW9uLCBwSFRUWENvbnRleHQtPmJDb3B5U2F2ZVBhZCk7CisJCQloZXhfZHVtcCgiV3JvbmcgUVNlbCBQa3Q6IiwgKFBVQ0hBUikmcFdpcmVsZXNzUGt0W1RtcEJ1bGtFbmRQb3NdLCAocEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uIC0gcEhUVFhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uKSk7CisJCX0KKworCQlpZiAocFR4SW5mby0+VVNCRE1BVHhQa3RMZW4gPD0gOCkKKwkJeworCQkJQlVMS19PVVRfVU5MT0NLKCZwQWQtPlR4Q29udGV4dFF1ZXVlTG9ja1tCdWxrT3V0UGlwZUlkXSwgSXJxRmxhZ3MyKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SIC8qUlRfREVCVUdfVFJBQ0UqLywoImUyLCBVU0JETUFUeFBrdExlbj09MCwgU2l6ZT0lbGQsIGJDU1BhZD0lZCwgQ1dQb3M9JWxkLCBOQlBvcz0lbGQsIENXUlBvcz0lbGQhXG4iLAorCQkJCQlwSFRUWENvbnRleHQtPkJ1bGtPdXRTaXplLCBwSFRUWENvbnRleHQtPmJDb3B5U2F2ZVBhZCwgcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uLCBwSFRUWENvbnRleHQtPk5leHRCdWxrT3V0UG9zaXRpb24sIHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVSZWFsUG9zKSk7CisJCQl7CisJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SIC8qUlRfREVCVUdfVFJBQ0UqLywoIiV4ICAleCAgJXggICV4ICAleCAgJXggICV4ICAleCBcbiIsCisJCQkJCXBIVFRYQ29udGV4dC0+U2F2ZWRQYWRbMF0sIHBIVFRYQ29udGV4dC0+U2F2ZWRQYWRbMV0sIHBIVFRYQ29udGV4dC0+U2F2ZWRQYWRbMl0scEhUVFhDb250ZXh0LT5TYXZlZFBhZFszXQorCQkJCQkscEhUVFhDb250ZXh0LT5TYXZlZFBhZFs0XSwgcEhUVFhDb250ZXh0LT5TYXZlZFBhZFs1XSwgcEhUVFhDb250ZXh0LT5TYXZlZFBhZFs2XSxwSFRUWENvbnRleHQtPlNhdmVkUGFkWzddKSk7CisJCQl9CisJCQlwQWQtPmJGb3JjZVByaW50VFggPSBUUlVFOworCQkJQlVMS19PVVRfTE9DSygmcEFkLT5CdWxrT3V0TG9ja1tCdWxrT3V0UGlwZUlkXSwgSXJxRmxhZ3MpOworCQkJcEFkLT5CdWxrT3V0UGVuZGluZ1tCdWxrT3V0UGlwZUlkXSA9IEZBTFNFOworCQkJQlVMS19PVVRfVU5MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrW0J1bGtPdXRQaXBlSWRdLCBJcnFGbGFncyk7CisJCQkvL0RCR1BSSU5UKFJUX0RFQlVHX0xPVUQsKCJPdXQ6cFR4SW5mby0+VVNCRE1BVHhQa3RMZW49JWQhXG4iLCBwVHhJbmZvLT5VU0JETUFUeFBrdExlbikpOworCQkJcmV0dXJuOworCQl9CisKKwkJCS8vIEluY3JlYXNlIFRvdGFsIHRyYW5zbWl0IGJ5dGUgY291bnRlcgorCQlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1RyYW5zbWl0dGVkQnl0ZUNvdW50ICs9ICBwVHhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50OworCQlwQWQtPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkQnl0ZUNvdW50ICs9ICBwVHhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50OworCisJCXBMYXN0VHhJbmZvID0gcFR4SW5mbzsKKworCQkvLyBNYWtlIHN1cmUgd2UgdXNlIEVEQ0EgUVVFVUUuCisJCXBUeEluZm8tPlFTRUwgPSBGSUZPX0VEQ0E7CisJCVRoaXNCdWxrU2l6ZSArPSAocFR4SW5mby0+VVNCRE1BVHhQa3RMZW4rNCk7CisJCVRtcEJ1bGtFbmRQb3MgKz0gKHBUeEluZm8tPlVTQkRNQVR4UGt0TGVuKzQpOworCisJCWlmIChUbXBCdWxrRW5kUG9zICE9IHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbikKKwkJCXBUeEluZm8tPlVTQkRNQU5leHRWTEQgPSAxOworCisJCWlmIChwVHhJbmZvLT5Td1VzZUxhc3RSb3VuZCA9PSAxKQorCQl7CisJCQlpZiAocEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uID09IDgpCisJCQkJcFR4SW5mby0+VVNCRE1BTmV4dFZMRCA9IDA7CisJCQlwVHhJbmZvLT5Td1VzZUxhc3RSb3VuZCA9IDA7CisKKwkJCWJUeFFMYXN0Um91bmQgPSBUUlVFOworCQkJcEhUVFhDb250ZXh0LT5FTmV4dEJ1bGtPdXRQb3NpdGlvbiA9IDg7CisKKwkjaWZkZWYgUlRfQklHX0VORElBTgorCQkJUlRNUERlc2NyaXB0b3JFbmRpYW5DaGFuZ2UoKFBVQ0hBUilwVHhJbmZvLCBUWVBFX1RYSU5GTyk7CisJCQlSVE1QV0lFbmRpYW5DaGFuZ2UoKFBVQ0hBUilwVHhXSSwgVFlQRV9UWFdJKTsKKwkjZW5kaWYgLy8gUlRfQklHX0VORElBTiAvLworCisJCQlicmVhazsKKwkJfQorCisjaWZkZWYgUlRfQklHX0VORElBTgorCQlSVE1QRGVzY3JpcHRvckVuZGlhbkNoYW5nZSgoUFVDSEFSKXBUeEluZm8sIFRZUEVfVFhJTkZPKTsKKwkJUlRNUFdJRW5kaWFuQ2hhbmdlKChQVUNIQVIpcFR4V0ksIFRZUEVfVFhXSSk7CisjZW5kaWYgLy8gUlRfQklHX0VORElBTiAvLworCisJfXdoaWxlIChUUlVFKTsKKworCS8vIGFkanVzdCB0aGUgcFR4SW5mby0+VVNCRE1BTmV4dFZMRCB2YWx1ZSBvZiBsYXN0IHBUeEluZm8uCisJaWYgKHBMYXN0VHhJbmZvKQorCXsKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJCVJUTVBEZXNjcmlwdG9yRW5kaWFuQ2hhbmdlKChQVUNIQVIpcExhc3RUeEluZm8sIFRZUEVfVFhJTkZPKTsKKyNlbmRpZiAvLyBSVF9CSUdfRU5ESUFOIC8vCisJCXBMYXN0VHhJbmZvLT5VU0JETUFOZXh0VkxEID0gMDsKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJCVJUTVBEZXNjcmlwdG9yRW5kaWFuQ2hhbmdlKChQVUNIQVIpcExhc3RUeEluZm8sIFRZUEVfVFhJTkZPKTsKKyNlbmRpZiAvLyBSVF9CSUdfRU5ESUFOIC8vCisJfQorCisJLyoKKwkJV2UgbmVlZCB0byBjb3B5IFNhdmVkUGFkIHdoZW4gZm9sbG93aW5nIGNvbmRpdGlvbiBtYXRjaGVkIQorCQkJMS4gTm90IHRoZSBsYXN0IHJvdW5kIG9mIHRoZSBUeFF1ZXVlIGFuZAorCQkJMi4gYW55IG1hdGNoIG9mIGZvbGxvd2luZyBjYXNlczoKKwkJCQkoMSkuIFRoZSBFbmQgUG9zaXRpb24gb2YgdGhpcyBidWxrIG91dCBpcyByZWFjaCB0byB0aGUgQ3VycmVuY3QgV3JpdGUgcG9zaXRpb24gYW5kCisJCQkJCQl0aGUgVHhJbmZvIGFuZCByZWxhdGVkIGhlYWRlciBhbHJlYWR5IHdyaXRlIHRvIHRoZSBDdXJXcml0ZVBvc2l0aW9uLgorCQkJICAgCQk9PihFTmV4dEJ1bGtPdXRQb3NpdGlvbiA9PSBDdXJXcml0ZVBvc2l0aW9uKSAmJiAoQ3VyV3JpdGVSZWFsUG9zID4gQ3VyV3JpdGVQb3NpdGlvbikKKworCQkJCSgyKS4gVGhlIEVuZFBvc2l0aW9uIG9mIHRoZSBidWxrIG91dCBpcyBub3QgcmVhY2ggdG8gdGhlIEN1cnJlbnQgV3JpdGUgUG9zaXRpb24uCisJCQkJCT0+KEVOZXh0QnVsa091dFBvc2l0aW9uICE9IEN1cldyaXRlUG9zaXRpb24pCisJKi8KKwlpZiAoKGJUeFFMYXN0Um91bmQgPT0gRkFMU0UpICYmCisJCSAoKChwSFRUWENvbnRleHQtPkVOZXh0QnVsa091dFBvc2l0aW9uID09IHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbikgJiYgKHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVSZWFsUG9zID4gcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uKSkgfHwKKwkJICAocEhUVFhDb250ZXh0LT5FTmV4dEJ1bGtPdXRQb3NpdGlvbiAhPSBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24pKQorCQkpCisJeworCQlOZGlzTW92ZU1lbW9yeShwSFRUWENvbnRleHQtPlNhdmVkUGFkLCAmcFdpcmVsZXNzUGt0W3BIVFRYQ29udGV4dC0+RU5leHRCdWxrT3V0UG9zaXRpb25dLCA4KTsKKwkJcEhUVFhDb250ZXh0LT5iQ29weVNhdmVQYWQgPSBUUlVFOworCQlpZiAoUlRNUEVxdWFsTWVtb3J5KHBIVFRYQ29udGV4dC0+U2F2ZWRQYWQsIGFsbHplcm8sNCkpCisJCXsKKwkJCVBVQ0hBUglwQnVmID0gJnBIVFRYQ29udGV4dC0+U2F2ZWRQYWRbMF07CisJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsKCJXQVJOSU5HLVplcm8tMzolMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCxDV1Bvcz0lbGQsIENXUlBvcz0lbGQsIGJDVz0lZCwgTkJQb3M9JWxkLCBUQlBvcz0lbGQsIFRCU2l6ZT0lbGRcbiIsCisJCQkJcEJ1ZlswXSwgcEJ1ZlsxXSwgcEJ1ZlsyXSxwQnVmWzNdLHBCdWZbNF0sIHBCdWZbNV0sIHBCdWZbNl0scEJ1Zls3XSwgcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uLCBwSFRUWENvbnRleHQtPkN1cldyaXRlUmVhbFBvcywKKwkJCQlwSFRUWENvbnRleHQtPmJDdXJXcml0aW5nLCBwSFRUWENvbnRleHQtPk5leHRCdWxrT3V0UG9zaXRpb24sIFRtcEJ1bGtFbmRQb3MsIFRoaXNCdWxrU2l6ZSkpOworCisJCQlwQnVmID0gJnBXaXJlbGVzc1BrdFtwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb25dOworCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCgiXHRDV1Bvcz0lMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeFxuIiwgcEJ1ZlswXSwgcEJ1ZlsxXSwgcEJ1ZlsyXSxwQnVmWzNdLHBCdWZbNF0sIHBCdWZbNV0sIHBCdWZbNl0scEJ1Zls3XSkpOworCQl9CisJCS8vREJHUFJJTlQoUlRfREVCVUdfTE9VRCwoIkVOUG9zPT1DV1Bvcz0lbGQsIENXUlBvcz0lbGQsIGJDU1BhZD0lZCFcbiIsIHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiwgcEhUVFhDb250ZXh0LT5DdXJXcml0ZVJlYWxQb3MsIHBIVFRYQ29udGV4dC0+YkNvcHlTYXZlUGFkKSk7CisJfQorCisJaWYgKHBBZC0+YkZvcmNlUHJpbnRUWCA9PSBUUlVFKQorCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkJ1bGtPdXQtQTpTaXplPSVsZCwgQ1dQb3M9JWxkLCBOQlBvcz0lbGQsIEVOQlBvcz0lbGQsIGJDb3B5PSVkIVxuIiwgVGhpc0J1bGtTaXplLCBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24sIHBIVFRYQ29udGV4dC0+TmV4dEJ1bGtPdXRQb3NpdGlvbiwgcEhUVFhDb250ZXh0LT5FTmV4dEJ1bGtPdXRQb3NpdGlvbiwgcEhUVFhDb250ZXh0LT5iQ29weVNhdmVQYWQpKTsKKwkvL0RCR1BSSU5UKFJUX0RFQlVHX0xPVUQsKCJCdWxrT3V0LUE6U2l6ZT0lbGQsIENXUG9zPSVsZCwgQ1dSUG9zPSVsZCwgTkJQb3M9JWxkLCBFTkJQb3M9JWxkLCBiQ29weT0lZCwgYkxSb3VuZD0lZCFcbiIsIFRoaXNCdWxrU2l6ZSwgcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uLCBwSFRUWENvbnRleHQtPkN1cldyaXRlUmVhbFBvcywgcEhUVFhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uLCBwSFRUWENvbnRleHQtPkVOZXh0QnVsa091dFBvc2l0aW9uLCBwSFRUWENvbnRleHQtPmJDb3B5U2F2ZVBhZCwgYlR4UUxhc3RSb3VuZCkpOworCisJCS8vIFVTQiBETUEgZW5naW5lIHJlcXVpcmVzIHRvIHBhZCBleHRyYSA0IGJ5dGVzLiBUaGlzIHBhZCBkb2Vzbid0IGNvdW50IGludG8gcmVhbCBidWxrb3V0c2l6ZS4KKwlwQXBwZW5kYW50ID0gJnBXaXJlbGVzc1BrdFtUbXBCdWxrRW5kUG9zXTsKKwlOZGlzWmVyb01lbW9yeShwQXBwZW5kYW50LCA4KTsKKwkJVGhpc0J1bGtTaXplICs9IDQ7CisJCXBIVFRYQ29udGV4dC0+TGFzdE9uZSA9IFRSVUU7CisJCWlmICgoVGhpc0J1bGtTaXplICUgcEFkLT5CdWxrT3V0TWF4UGFja2V0U2l6ZSkgPT0gMCkKKwkJCVRoaXNCdWxrU2l6ZSArPSA0OworCXBIVFRYQ29udGV4dC0+QnVsa091dFNpemUgPSBUaGlzQnVsa1NpemU7CisKKwlwQWQtPndhdGNoRG9nVHhQZW5kaW5nQ250W0J1bGtPdXRQaXBlSWRdID0gMTsKKwlCVUxLX09VVF9VTkxPQ0soJnBBZC0+VHhDb250ZXh0UXVldWVMb2NrW0J1bGtPdXRQaXBlSWRdLCBJcnFGbGFnczIpOworCisJLy8gSW5pdCBUeCBjb250ZXh0IGRlc2NyaXB0b3IKKwlSVFVTQkluaXRIVFR4RGVzYyhwQWQsIHBIVFRYQ29udGV4dCwgQnVsa091dFBpcGVJZCwgVGhpc0J1bGtTaXplLCAodXNiX2NvbXBsZXRlX3QpUlRVU0JCdWxrT3V0RGF0YVBhY2tldENvbXBsZXRlKTsKKworCXBVcmIgPSBwSFRUWENvbnRleHQtPnBVcmI7CisJaWYoKHJldCA9IFJUVVNCX1NVQk1JVF9VUkIocFVyYikpIT0wKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiUlRVU0JCdWxrT3V0RGF0YVBhY2tldDogU3VibWl0IFR4IFVSQiBmYWlsZWQgJWRcbiIsIHJldCkpOworCisJCUJVTEtfT1VUX0xPQ0soJnBBZC0+QnVsa091dExvY2tbQnVsa091dFBpcGVJZF0sIElycUZsYWdzKTsKKwkJcEFkLT5CdWxrT3V0UGVuZGluZ1tCdWxrT3V0UGlwZUlkXSA9IEZBTFNFOworCQlwQWQtPndhdGNoRG9nVHhQZW5kaW5nQ250W0J1bGtPdXRQaXBlSWRdID0gMDsKKwkJQlVMS19PVVRfVU5MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrW0J1bGtPdXRQaXBlSWRdLCBJcnFGbGFncyk7CisKKwkJcmV0dXJuOworCX0KKworCUJVTEtfT1VUX0xPQ0soJnBBZC0+QnVsa091dExvY2tbQnVsa091dFBpcGVJZF0sIElycUZsYWdzKTsKKwlwSFRUWENvbnRleHQtPklSUFBlbmRpbmcgPSBUUlVFOworCUJVTEtfT1VUX1VOTE9DSygmcEFkLT5CdWxrT3V0TG9ja1tCdWxrT3V0UGlwZUlkXSwgSXJxRmxhZ3MpOworCXBBZC0+QnVsa091dFJlcSsrOworCit9CisKKworVk9JRCBSVFVTQkJ1bGtPdXREYXRhUGFja2V0Q29tcGxldGUocHVyYmJfdCBwVXJiLCBzdHJ1Y3QgcHRfcmVncyAqcHRfcmVncykKK3sKKyNpZiAwIC8vIHNhbXBsZSwgSVJRIExPQ0sKKwlQUlRNUF9BREFQVEVSCQlwQWQ7CisJUE9TX0NPT0tJRQkJCXBPYmo7CisJUEhUX1RYX0NPTlRFWFQJCXBIVFRYQ29udGV4dDsKKwlVQ0hBUgkJCQlCdWxrT3V0UGlwZUlkOworCU5UU1RBVFVTCQkJU3RhdHVzOworCXVuc2lnbmVkIGxvbmcJCUlycUZsYWdzOworCisJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0lORk8sICgiLS0tPlJUVVNCQnVsa091dERhdGFQYWNrZXRDb21wbGV0ZVxuIikpOworCisJcEhUVFhDb250ZXh0CT0gKFBIVF9UWF9DT05URVhUKXBVcmItPmNvbnRleHQ7CisJcEFkCQkJPSBwSFRUWENvbnRleHQtPnBBZDsKKwlwT2JqIAkJPSAoUE9TX0NPT0tJRSkgcEFkLT5PU19Db29raWU7CisJU3RhdHVzCQk9IHBVcmItPnN0YXR1czsKKworCS8vIFN0b3JlIEJ1bGtPdXQgUGlwZUlkCisJQnVsa091dFBpcGVJZCA9IHBIVFRYQ29udGV4dC0+QnVsa091dFBpcGVJZDsKKwlwQWQtPkJ1bGtPdXREYXRhT25lU2VjQ291bnQrKzsKKworCS8vREJHUFJJTlQoUlRfREVCVUdfTE9VRCwgKCJEb25lLUIoJWQpOkk9MHglbHgsIENXUG9zPSVsZCwgTkJQb3M9JWxkLCBFTkJQb3M9JWxkLCBiQ29weT0lZCFcbiIsIEJ1bGtPdXRQaXBlSWQsIGluX2ludGVycnVwdCgpLCBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24sCisJLy8JCXBIVFRYQ29udGV4dC0+TmV4dEJ1bGtPdXRQb3NpdGlvbiwgcEhUVFhDb250ZXh0LT5FTmV4dEJ1bGtPdXRQb3NpdGlvbiwgcEhUVFhDb250ZXh0LT5iQ29weVNhdmVQYWQpKTsKKworCVJUTVBfSVJRX0xPQ0soJnBBZC0+QnVsa091dExvY2tbQnVsa091dFBpcGVJZF0sIElycUZsYWdzKTsKKwlwQWQtPkJ1bGtPdXRQZW5kaW5nW0J1bGtPdXRQaXBlSWRdID0gRkFMU0U7CisJcEhUVFhDb250ZXh0LT5JUlBQZW5kaW5nID0gRkFMU0U7CisJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrW0J1bGtPdXRQaXBlSWRdLCBJcnFGbGFncyk7CisKKwlpZiAoU3RhdHVzID09IFVTQl9TVF9OT0VSUk9SKQorCXsKKwkJcEFkLT5CdWxrT3V0Q29tcGxldGUrKzsKKworCQlwQWQtPkNvdW50ZXJzODAyMy5Hb29kVHJhbnNtaXRzKys7CisJCS8vUlRNUF9JUlFfTE9DSygmcEFkLT5UeENvbnRleHRRdWV1ZUxvY2tbQnVsa091dFBpcGVJZF0sIElycUZsYWdzKTsKKwkJRlJFRV9IVFRYX1JJTkcocEFkLCBCdWxrT3V0UGlwZUlkLCBwSFRUWENvbnRleHQpOworCQkvL1JUTVBfSVJRX1VOTE9DSygmcEFkLT5UeENvbnRleHRRdWV1ZUxvY2tbQnVsa091dFBpcGVJZF0sIElycUZsYWdzKTsKKworCisJfQorCWVsc2UJLy8gU1RBVFVTX09USEVSCisJeworCQlQVUNIQVIJcEJ1ZjsKKworCQlwQWQtPkJ1bGtPdXRDb21wbGV0ZU90aGVyKys7CisKKwkJcEJ1ZiA9ICZwSFRUWENvbnRleHQtPlRyYW5zZmVyQnVmZmVyLT5XaXJlbGVzc1BhY2tldFtwSFRUWENvbnRleHQtPk5leHRCdWxrT3V0UG9zaXRpb25dOworCisJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwgKCJCdWxrT3V0RGF0YVBhY2tldCBmYWlsZWQ6IFJlYXNvbkNvZGU9JWQhXG4iLCBTdGF0dXMpKTsKKwkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCAoIj4+QnVsa091dCBSZXE9MHglbHgsIENvbXBsZXRlPTB4JWx4LCBPdGhlcj0weCVseFxuIiwgcEFkLT5CdWxrT3V0UmVxLCBwQWQtPkJ1bGtPdXRDb21wbGV0ZSwgcEFkLT5CdWxrT3V0Q29tcGxldGVPdGhlcikpOworCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgiPj5CdWxrT3V0IEhlYWRlcjoleCAleCAleCAleCAleCAleCAleCAleFxuIiwgcEJ1ZlswXSwgcEJ1ZlsxXSwgcEJ1ZlsyXSwgcEJ1ZlszXSwgcEJ1Zls0XSwgcEJ1Zls1XSwgcEJ1Zls2XSwgcEJ1Zls3XSkpOworCQkvL0RCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwgKCI+PkJ1bGtPdXRDb21wbGV0ZUNhbmNlbD0weCV4LCBCdWxrT3V0Q29tcGxldGVPdGhlcj0weCV4XG4iLCBwQWQtPkJ1bGtPdXRDb21wbGV0ZUNhbmNlbCwgcEFkLT5CdWxrT3V0Q29tcGxldGVPdGhlcikpOworCisJCWlmICghUlRNUF9URVNUX0ZMQUcocEFkLCAoZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUyB8CisJCQkJCQkJCQlmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfAorCQkJCQkJCQkJZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUIHwKKwkJCQkJCQkJCWZSVE1QX0FEQVBURVJfQlVMS09VVF9SRVNFVCkpKQorCQl7CisJCQlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CVUxLT1VUX1JFU0VUKTsKKwkJCXBBZC0+YnVsa1Jlc2V0UGlwZWlkID0gQnVsa091dFBpcGVJZDsKKwkJfQorCX0KKworCS8vCisJLy8gYkluVXNlID0gVFJVRSwgbWVhbnMgc29tZSBwcm9jZXNzIGFyZSBmaWxsaW5nIFRYIGRhdGEsIGFmdGVyIHRoYXQgbXVzdCB0dXJuIG9uIGJXYWl0aW5nQnVsa091dAorCS8vIGJXYWl0aW5nQnVsa091dCA9IFRSVUUsIG1lYW5zIHRoZSBUWCBkYXRhIGFyZSB3YWl0aW5nIGZvciBidWxrIG91dC4KKwkvLworCS8vUlRNUF9JUlFfTE9DSygmcEFkLT5UeENvbnRleHRRdWV1ZUxvY2tbQnVsa091dFBpcGVJZF0sIElycUZsYWdzKTsKKwlpZiAoKHBIVFRYQ29udGV4dC0+RU5leHRCdWxrT3V0UG9zaXRpb24gIT0gcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uKSAmJgorCQkocEhUVFhDb250ZXh0LT5FTmV4dEJ1bGtPdXRQb3NpdGlvbiAhPSAocEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uKzgpKSAmJgorCQkhUlRVU0JfVEVTVF9CVUxLX0ZMQUcocEFkLCAoZlJUVVNCX0JVTEtfT1VUX0RBVEFfRlJBRyA8PCBCdWxrT3V0UGlwZUlkKSkpCisJeworCQkvLyBJbmRpY2F0ZSBUaGVyZSBpcyBkYXRhIGF2YWxpYWJsZQorCQlSVFVTQl9TRVRfQlVMS19GTEFHKHBBZCwgKGZSVFVTQl9CVUxLX09VVF9EQVRBX05PUk1BTCA8PCBCdWxrT3V0UGlwZUlkKSk7CisJfQorCS8vUlRNUF9JUlFfVU5MT0NLKCZwQWQtPlR4Q29udGV4dFF1ZXVlTG9ja1tCdWxrT3V0UGlwZUlkXSwgSXJxRmxhZ3MpOworCisJLy8gQWx3YXlzIGNhbGwgQnVsayByb3V0aW5lLCBldmVuIHJlc2V0IGJ1bGsuCisJLy8gVGhlIHByb3RlY3Rpb24gb2YgcmVzdCBidWxrIHNob3VsZCBiZSBpbiBCdWxrT3V0IHJvdXRpbmUKKwlSVFVTQktpY2tCdWxrT3V0KHBBZCk7CisKKworCS8vREJHUFJJTlQoUlRfREVCVUdfTE9VRCwoIkRvbmUtQSglZCk6ST0weCVseCwgQ1dQb3M9JWxkLCBOQlBvcz0lbGQsIEVOQlBvcz0lbGQsIGJDb3B5PSVkXG4iLCBCdWxrT3V0UGlwZUlkLCBpbl9pbnRlcnJ1cHQoKSwKKwkvLwkJcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uLCBwSFRUWENvbnRleHQtPk5leHRCdWxrT3V0UG9zaXRpb24sIHBIVFRYQ29udGV4dC0+RU5leHRCdWxrT3V0UG9zaXRpb24sIHBIVFRYQ29udGV4dC0+YkNvcHlTYXZlUGFkKSk7CisKKwlzd2l0Y2ggKEJ1bGtPdXRQaXBlSWQpCisJeworCQljYXNlIDA6CisJCQkJcE9iai0+YWMwX2RtYV9kb25lX3Rhc2suZGF0YSA9ICh1bnNpZ25lZCBsb25nKXBBZDsKKwkJCQl0YXNrbGV0X2hpX3NjaGVkdWxlKCZwT2JqLT5hYzBfZG1hX2RvbmVfdGFzayk7CisJCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCQlwT2JqLT5hYzFfZG1hX2RvbmVfdGFzay5kYXRhID0gKHVuc2lnbmVkIGxvbmcpcEFkOworCQkJCXRhc2tsZXRfaGlfc2NoZWR1bGUoJnBPYmotPmFjMV9kbWFfZG9uZV90YXNrKTsKKwkJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJCXBPYmotPmFjMl9kbWFfZG9uZV90YXNrLmRhdGEgPSAodW5zaWduZWQgbG9uZylwQWQ7CisJCQkJdGFza2xldF9oaV9zY2hlZHVsZSgmcE9iai0+YWMyX2RtYV9kb25lX3Rhc2spOworCQkJCWJyZWFrOworCQljYXNlIDM6CisJCQkJcE9iai0+YWMzX2RtYV9kb25lX3Rhc2suZGF0YSA9ICh1bnNpZ25lZCBsb25nKXBBZDsKKwkJCQl0YXNrbGV0X2hpX3NjaGVkdWxlKCZwT2JqLT5hYzNfZG1hX2RvbmVfdGFzayk7CisJCQkJYnJlYWs7CisJCWNhc2UgNDoKKwkJCQlwT2JqLT5oY2NhX2RtYV9kb25lX3Rhc2suZGF0YSA9ICh1bnNpZ25lZCBsb25nKXBBZDsKKwkJCQl0YXNrbGV0X2hpX3NjaGVkdWxlKCZwT2JqLT5oY2NhX2RtYV9kb25lX3Rhc2spOworCQkJCWJyZWFrOworCX0KKyNlbHNlCisKK3sKKwlQSFRfVFhfQ09OVEVYVAlwSFRUWENvbnRleHQ7CisJUFJUTVBfQURBUFRFUglwQWQ7CisJUE9TX0NPT0tJRSAJCXBPYmo7CisJVUNIQVIJCQlCdWxrT3V0UGlwZUlkOworCisKKwlwSFRUWENvbnRleHQJPSAoUEhUX1RYX0NPTlRFWFQpcFVyYi0+Y29udGV4dDsKKwlwQWQgCQkJPSBwSFRUWENvbnRleHQtPnBBZDsKKwlwT2JqIAkJCT0gKFBPU19DT09LSUUpIHBBZC0+T1NfQ29va2llOworCisJLy8gU3RvcmUgQnVsa091dCBQaXBlSWQKKwlCdWxrT3V0UGlwZUlkCT0gcEhUVFhDb250ZXh0LT5CdWxrT3V0UGlwZUlkOworCXBBZC0+QnVsa091dERhdGFPbmVTZWNDb3VudCsrOworCisJc3dpdGNoIChCdWxrT3V0UGlwZUlkKQorCXsKKwkJY2FzZSAwOgorCQkJCXBPYmotPmFjMF9kbWFfZG9uZV90YXNrLmRhdGEgPSAodW5zaWduZWQgbG9uZylwVXJiOworCQkJCXRhc2tsZXRfaGlfc2NoZWR1bGUoJnBPYmotPmFjMF9kbWFfZG9uZV90YXNrKTsKKwkJCQlicmVhazsKKwkJY2FzZSAxOgorCQkJCXBPYmotPmFjMV9kbWFfZG9uZV90YXNrLmRhdGEgPSAodW5zaWduZWQgbG9uZylwVXJiOworCQkJCXRhc2tsZXRfaGlfc2NoZWR1bGUoJnBPYmotPmFjMV9kbWFfZG9uZV90YXNrKTsKKwkJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJCXBPYmotPmFjMl9kbWFfZG9uZV90YXNrLmRhdGEgPSAodW5zaWduZWQgbG9uZylwVXJiOworCQkJCXRhc2tsZXRfaGlfc2NoZWR1bGUoJnBPYmotPmFjMl9kbWFfZG9uZV90YXNrKTsKKwkJCQlicmVhazsKKwkJY2FzZSAzOgorCQkJCXBPYmotPmFjM19kbWFfZG9uZV90YXNrLmRhdGEgPSAodW5zaWduZWQgbG9uZylwVXJiOworCQkJCXRhc2tsZXRfaGlfc2NoZWR1bGUoJnBPYmotPmFjM19kbWFfZG9uZV90YXNrKTsKKwkJCQlicmVhazsKKwkJY2FzZSA0OgorCQkJCXBPYmotPmhjY2FfZG1hX2RvbmVfdGFzay5kYXRhID0gKHVuc2lnbmVkIGxvbmcpcFVyYjsKKwkJCQl0YXNrbGV0X2hpX3NjaGVkdWxlKCZwT2JqLT5oY2NhX2RtYV9kb25lX3Rhc2spOworCQkJCWJyZWFrOworCX0KK30KKyNlbmRpZgorCisKK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKworCUFyZ3VtZW50czoKKworCVJldHVybiBWYWx1ZToKKworCU5vdGU6IE5VTEwgZnJhbWUgdXNlIEJ1bGtPdXRQaXBlSWQgPSAwCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECVJUVVNCQnVsa091dE51bGxGcmFtZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCkKK3sKKwlQVFhfQ09OVEVYVAkJcE51bGxDb250ZXh0ID0gJihwQWQtPk51bGxDb250ZXh0KTsKKwlQVVJCCQkJcFVyYjsKKwlpbnQJCQkJcmV0ID0gMDsKKwl1bnNpZ25lZCBsb25nCUlycUZsYWdzOworCisJUlRNUF9JUlFfTE9DSygmcEFkLT5CdWxrT3V0TG9ja1swXSwgSXJxRmxhZ3MpOworCWlmICgocEFkLT5CdWxrT3V0UGVuZGluZ1swXSA9PSBUUlVFKSB8fCBSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTkVFRF9TVE9QX1RYKSkKKwl7CisJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5CdWxrT3V0TG9ja1swXSwgSXJxRmxhZ3MpOworCQlyZXR1cm47CisJfQorCXBBZC0+QnVsa091dFBlbmRpbmdbMF0gPSBUUlVFOworCXBBZC0+d2F0Y2hEb2dUeFBlbmRpbmdDbnRbMF0gPSAxOworCXBOdWxsQ29udGV4dC0+SVJQUGVuZGluZyA9IFRSVUU7CisJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrWzBdLCBJcnFGbGFncyk7CisKKwkvLyBJbmNyZWFzZSBUb3RhbCB0cmFuc21pdCBieXRlIGNvdW50ZXIKKwlwQWQtPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkQnl0ZUNvdW50ICs9ICBwTnVsbENvbnRleHQtPkJ1bGtPdXRTaXplOworCisKKwkvLyBDbGVhciBOdWxsIGZyYW1lIGJ1bGsgZmxhZworCVJUVVNCX0NMRUFSX0JVTEtfRkxBRyhwQWQsIGZSVFVTQl9CVUxLX09VVF9EQVRBX05VTEwpOworCisjaWZkZWYgUlRfQklHX0VORElBTgorCVJUTVBEZXNjcmlwdG9yRW5kaWFuQ2hhbmdlKChQVUNIQVIpcE51bGxDb250ZXh0LT5UcmFuc2ZlckJ1ZmZlciwgVFlQRV9UWElORk8pOworI2VuZGlmIC8vIFJUX0JJR19FTkRJQU4gLy8KKworCS8vIEluaXQgVHggY29udGV4dCBkZXNjcmlwdG9yCisJUlRVU0JJbml0VHhEZXNjKHBBZCwgcE51bGxDb250ZXh0LCAwLCAodXNiX2NvbXBsZXRlX3QpUlRVU0JCdWxrT3V0TnVsbEZyYW1lQ29tcGxldGUpOworCisJcFVyYiA9IHBOdWxsQ29udGV4dC0+cFVyYjsKKwlpZigocmV0ID0gUlRVU0JfU1VCTUlUX1VSQihwVXJiKSkhPTApCisJeworCQlSVE1QX0lSUV9MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrWzBdLCBJcnFGbGFncyk7CisJCXBBZC0+QnVsa091dFBlbmRpbmdbMF0gPSBGQUxTRTsKKwkJcEFkLT53YXRjaERvZ1R4UGVuZGluZ0NudFswXSA9IDA7CisJCXBOdWxsQ29udGV4dC0+SVJQUGVuZGluZyA9IEZBTFNFOworCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+QnVsa091dExvY2tbMF0sIElycUZsYWdzKTsKKworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJSVFVTQkJ1bGtPdXROdWxsRnJhbWU6IFN1Ym1pdCBUeCBVUkIgZmFpbGVkICVkXG4iLCByZXQpKTsKKwkJcmV0dXJuOworCX0KKworfQorCisvLyBOVUxMIGZyYW1lIHVzZSBCdWxrT3V0UGlwZUlkID0gMAorVk9JRCBSVFVTQkJ1bGtPdXROdWxsRnJhbWVDb21wbGV0ZShwdXJiYl90IHBVcmIsIHN0cnVjdCBwdF9yZWdzICpwdF9yZWdzKQoreworCVBSVE1QX0FEQVBURVIJCXBBZDsKKwlQVFhfQ09OVEVYVAkJCXBOdWxsQ29udGV4dDsKKwlOVFNUQVRVUwkJCVN0YXR1czsKKyNpZiAwIC8vIHNhbXBsZSwgSVJRIExPQ0sKKwl1bnNpZ25lZCBsb25nCQlJcnFGbGFnczsKKyNlbmRpZgorCVBPU19DT09LSUUJCQlwT2JqOworCisKKwlwTnVsbENvbnRleHQJPSAoUFRYX0NPTlRFWFQpcFVyYi0+Y29udGV4dDsKKwlwQWQgCQkJPSBwTnVsbENvbnRleHQtPnBBZDsKKwlTdGF0dXMgCQkJPSBwVXJiLT5zdGF0dXM7CisKKyNpZiAwIC8vIHNhbXBsZSwgSVJRIExPQ0sKKwkvLyBSZXNldCBOdWxsIGZyYW1lIGNvbnRleHQgZmxhZ3MKKwlwTnVsbENvbnRleHQtPklSUFBlbmRpbmcgCT0gRkFMU0U7CisJcE51bGxDb250ZXh0LT5JblVzZSAJCT0gRkFMU0U7CisKKwlpZiAoU3RhdHVzID09IFVTQl9TVF9OT0VSUk9SKQorCXsKKwkJLy8gRG9uJ3Qgd29ycnkgYWJvdXQgdGhlIHF1ZXVlIGlzIGVtcHR5IG9yIG5vdCwgdGhpcyBmdW5jdGlvbiB3aWxsIGNoZWNrIGl0c2VsZgorCQkvL1JUTVBVU0JEZVF1ZXVlUGFja2V0KHBBZCwgMCk7CisJCVJUTVBEZVF1ZXVlUGFja2V0KHBBZCwgVFJVRSwgTlVNX09GX1RYX1JJTkcsIE1BWF9UWF9QUk9DRVNTKTsKKwl9CisJZWxzZQkvLyBTVEFUVVNfT1RIRVIKKwl7CisJCWlmICgoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUykpICYmCisJCQkoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKSkgJiYKKwkJCSghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSAmJgorCQkJKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlVMS09VVF9SRVNFVCkpKQorCQl7CisJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgiQnVsayBPdXQgTnVsbCBGcmFtZSBGYWlsZWRcbiIpKTsKKwkJCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JVTEtPVVRfUkVTRVQpOworCQkJUlRVU0JFbnF1ZXVlSW50ZXJuYWxDbWQocEFkLCBDTURUSFJFQURfUkVTRVRfQlVMS19PVVQsIE5VTEwsIDApOworCQl9CisJfQorCisJUlRNUF9JUlFfTE9DSygmcEFkLT5CdWxrT3V0TG9ja1swXSwgSXJxRmxhZ3MpOworCXBBZC0+QnVsa091dFBlbmRpbmdbMF0gPSBGQUxTRTsKKwlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+QnVsa091dExvY2tbMF0sIElycUZsYWdzKTsKKworCS8vIEFsd2F5cyBjYWxsIEJ1bGsgcm91dGluZSwgZXZlbiByZXNldCBidWxrLgorCS8vIFRoZSBwcm90ZWN0aW9vbiBvZiByZXN0IGJ1bGsgc2hvdWxkIGJlIGluIEJ1bGtPdXQgcm91dGluZQorCVJUVVNCS2lja0J1bGtPdXQocEFkKTsKKyNlbHNlCisKKwlwT2JqID0gKFBPU19DT09LSUUpIHBBZC0+T1NfQ29va2llOworCXBPYmotPm51bGxfZnJhbWVfY29tcGxldGVfdGFzay5kYXRhID0gKHVuc2lnbmVkIGxvbmcpcFVyYjsKKwl0YXNrbGV0X2hpX3NjaGVkdWxlKCZwT2JqLT5udWxsX2ZyYW1lX2NvbXBsZXRlX3Rhc2spOworI2VuZGlmCisKK30KKworI2lmIDAJLy8gRm9yIFJUMjg3MCwgUlRTIGZyYW1lIG5vdCB1c2VkIG5vdywgYnV0IG1heWJlIHdpbGwgdXNlIGl0IGxhdHRlci4KKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCisJQXJndW1lbnRzOgorCisJUmV0dXJuIFZhbHVlOgorCisJTm90ZTogUlRTIGZyYW1lIHVzZSBCdWxrT3V0UGlwZUlkID0gMAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlSVFVTQkJ1bGtPdXRSVFNGcmFtZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCkKK3sKKwlQVFhfQ09OVEVYVAkJcFJUU0NvbnRleHQgPSAmKHBBZC0+UlRTQ29udGV4dCk7CisJUFVSQgkJCXBVcmI7CisJaW50CQkJCXJldCA9IDA7CisJdW5zaWduZWQgbG9uZwlJcnFGbGFnczsKKwlVQ0hBUgkJCVBpcGVJRD0wOworCisJaWYgKFJUVVNCX1RFU1RfQlVMS19GTEFHKHBBZCwgZlJUVVNCX0JVTEtfT1VUX0RBVEFfTk9STUFMXzQpKQorCQlQaXBlSUQ9IDM7CisJZWxzZSBpZiAoUlRVU0JfVEVTVF9CVUxLX0ZMQUcocEFkLCBmUlRVU0JfQlVMS19PVVRfREFUQV9OT1JNQUxfMykpCisJCVBpcGVJRD0gMjsKKwllbHNlIGlmIChSVFVTQl9URVNUX0JVTEtfRkxBRyhwQWQsIGZSVFVTQl9CVUxLX09VVF9EQVRBX05PUk1BTF8yKSkKKwkJUGlwZUlEPSAxOworCWVsc2UgaWYgKFJUVVNCX1RFU1RfQlVMS19GTEFHKHBBZCwgZlJUVVNCX0JVTEtfT1VUX0RBVEFfTk9STUFMKSkKKwkJUGlwZUlEPSAwOworCisJUlRNUF9JUlFfTE9DSygmcEFkLT5CdWxrT3V0TG9ja1tQaXBlSURdLCBJcnFGbGFncyk7CisJaWYgKChwQWQtPkJ1bGtPdXRQZW5kaW5nW1BpcGVJRF0gPT0gVFJVRSkgfHwgUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05FRURfU1RPUF9UWCkpCisJeworCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+QnVsa091dExvY2tbUGlwZUlEXSwgSXJxRmxhZ3MpOworCQlyZXR1cm47CisJfQorCXBBZC0+QnVsa091dFBlbmRpbmdbUGlwZUlEXSA9IFRSVUU7CisJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrW1BpcGVJRF0sIElycUZsYWdzKTsKKworCS8vIEluY3JlYXNlIFRvdGFsIHRyYW5zbWl0IGJ5dGUgY291bnRlcgorCXBBZC0+UmFsaW5rQ291bnRlcnMuVHJhbnNtaXR0ZWRCeXRlQ291bnQgKz0gIHBSVFNDb250ZXh0LT5CdWxrT3V0U2l6ZTsKKworCURCR1BSSU5UX1JBVyhSVF9ERUJVR19JTkZPLCAoIi0tLT5SVFVTQkJ1bGtPdXRSVFNGcmFtZSBcbiIpKTsKKworCS8vIENsZWFyIFJUUyBmcmFtZSBidWxrIGZsYWcKKwlSVFVTQl9DTEVBUl9CVUxLX0ZMQUcocEFkLCBmUlRVU0JfQlVMS19PVVRfUlRTKTsKKworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwlSVE1QRGVzY3JpcHRvckVuZGlhbkNoYW5nZSgoUFVDSEFSKXBSVFNDb250ZXh0LT5UcmFuc2ZlckJ1ZmZlciwgVFlQRV9UWElORk8pOworI2VuZGlmIC8vIFJUX0JJR19FTkRJQU4gLy8KKworCS8vIEluaXQgVHggY29udGV4dCBkZXNjcmlwdG9yCisJUlRVU0JJbml0VHhEZXNjKHBBZCwgcFJUU0NvbnRleHQsIFBpcGVJRCwgKHVzYl9jb21wbGV0ZV90KVJUVVNCQnVsa091dFJUU0ZyYW1lQ29tcGxldGUpOworCXBSVFNDb250ZXh0LT5JUlBQZW5kaW5nID0gVFJVRTsKKworCXBVcmIgPSBwUlRTQ29udGV4dC0+cFVyYjsKKwlpZigocmV0ID0gUlRVU0JfU1VCTUlUX1VSQihwVXJiKSkhPTApCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJSVFVTQkJ1bGtPdXRSVFNGcmFtZTogU3VibWl0IFR4IFVSQiBmYWlsZWQgJWRcbiIsIHJldCkpOworCQlyZXR1cm47CisJfQorCisJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0lORk8sICgiPC0tLVJUVVNCQnVsa091dFJUU0ZyYW1lIFxuIikpOworCit9CisKKy8vIFJUUyBmcmFtZSB1c2UgQnVsa091dFBpcGVJZCA9IDAKK1ZPSUQgUlRVU0JCdWxrT3V0UlRTRnJhbWVDb21wbGV0ZShwdXJiYl90IHBVcmIsIHN0cnVjdCBwdF9yZWdzICpwdF9yZWdzKQoreworCVBSVE1QX0FEQVBURVIJcEFkOworCVBUWF9DT05URVhUCQlwUlRTQ29udGV4dDsKKwlOVFNUQVRVUwkJU3RhdHVzOworI2lmIDAgLy8gc2FtcGxlLCBJUlEgTE9DSworCXVuc2lnbmVkIGxvbmcJSXJxRmxhZ3M7CisjZW5kaWYKKwlQT1NfQ09PS0lFCQlwT2JqOworCisJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0lORk8sICgiLS0tPlJUVVNCQnVsa091dFJUU0ZyYW1lQ29tcGxldGVcbiIpKTsKKworCXBSVFNDb250ZXh0CT0gKFBUWF9DT05URVhUKXBVcmItPmNvbnRleHQ7CisJcEFkCQkJPSBwUlRTQ29udGV4dC0+cEFkOworCVN0YXR1cwkJPSBwVXJiLT5zdGF0dXM7CisKKyNpZiAwIC8vIHNhbXBsZSwgSVJRIExPQ0sKKwkvLyBSZXNldCBSVFMgZnJhbWUgY29udGV4dCBmbGFncworCXBSVFNDb250ZXh0LT5JUlBQZW5kaW5nID0gRkFMU0U7CisJcFJUU0NvbnRleHQtPkluVXNlCQk9IEZBTFNFOworCisJaWYgKFN0YXR1cyA9PSBVU0JfU1RfTk9FUlJPUikKKwl7CisJCS8vIERvbid0IHdvcnJ5IGFib3V0IHRoZSBxdWV1ZSBpcyBlbXB0eSBvciBub3QsIHRoaXMgZnVuY3Rpb24gd2lsbCBjaGVjayBpdHNlbGYKKwkJLy9SVE1QVVNCRGVRdWV1ZVBhY2tldChwQWQsIHBSVFNDb250ZXh0LT5CdWxrT3V0UGlwZUlkKTsKKwkJUlRNUERlUXVldWVQYWNrZXQocEFkLCBUUlVFLCBOVU1fT0ZfVFhfUklORywgTUFYX1RYX1BST0NFU1MpOworCX0KKwllbHNlCS8vIFNUQVRVU19PVEhFUgorCXsKKwkJaWYgKCghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTKSkgJiYKKwkJCSghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MpKSAmJgorCQkJKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpICYmCisJCQkoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CVUxLT1VUX1JFU0VUKSkpCisJCXsKKwkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwgKCJCdWxrIE91dCBSVFMgRnJhbWUgRmFpbGVkXG4iKSk7CisJCQlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CVUxLT1VUX1JFU0VUKTsKKwkJCVJUVVNCRW5xdWV1ZUludGVybmFsQ21kKHBBZCwgQ01EVEhSRUFEX1JFU0VUX0JVTEtfT1VULCBOVUxMLCAwKTsKKwkJfQorCX0KKworCVJUTVBfSVJRX0xPQ0soJnBBZC0+QnVsa091dExvY2tbcFJUU0NvbnRleHQtPkJ1bGtPdXRQaXBlSWRdLCBJcnFGbGFncyk7CisJcEFkLT5CdWxrT3V0UGVuZGluZ1twUlRTQ29udGV4dC0+QnVsa091dFBpcGVJZF0gPSBGQUxTRTsKKwlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+QnVsa091dExvY2tbcFJUU0NvbnRleHQtPkJ1bGtPdXRQaXBlSWRdLCBJcnFGbGFncyk7CisKKwkvLyBBbHdheXMgY2FsbCBCdWxrIHJvdXRpbmUsIGV2ZW4gcmVzZXQgYnVsay4KKwkvLyBUaGUgcHJvdGVjdGlvb24gb2YgcmVzdCBidWxrIHNob3VsZCBiZSBpbiBCdWxrT3V0IHJvdXRpbmUKKwlSVFVTQktpY2tCdWxrT3V0KHBBZCk7CisjZWxzZQorCisJcE9iaiA9IChQT1NfQ09PS0lFKSBwQWQtPk9TX0Nvb2tpZTsKKwlwT2JqLT5ydHNfZnJhbWVfY29tcGxldGVfdGFzay5kYXRhID0gKHVuc2lnbmVkIGxvbmcpcFVyYjsKKwl0YXNrbGV0X2hpX3NjaGVkdWxlKCZwT2JqLT5ydHNfZnJhbWVfY29tcGxldGVfdGFzayk7CisjZW5kaWYKKworCURCR1BSSU5UX1JBVyhSVF9ERUJVR19JTkZPLCAoIjwtLS1SVFVTQkJ1bGtPdXRSVFNGcmFtZUNvbXBsZXRlXG4iKSk7CisKK30KKyNlbmRpZgorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKworCUFyZ3VtZW50czoKKworCVJldHVybiBWYWx1ZToKKworCU5vdGU6IE1MTUUgdXNlIEJ1bGtPdXRQaXBlSWQgPSAwCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECVJUVVNCQnVsa091dE1MTUVQYWNrZXQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVUNIQVIJCQlJbmRleCkKK3sKKwlQVFhfQ09OVEVYVAkJcE1MTUVDb250ZXh0OworCVBVUkIJCQlwVXJiOworCWludAkJCQlyZXQgPSAwOworCXVuc2lnbmVkIGxvbmcJSXJxRmxhZ3M7CisKKwlwTUxNRUNvbnRleHQgPSAoUFRYX0NPTlRFWFQpcEFkLT5NZ210UmluZy5DZWxsW3BBZC0+TWdtdFJpbmcuVHhEbWFJZHhdLkFsbG9jVmE7CisJcFVyYiA9IHBNTE1FQ29udGV4dC0+cFVyYjsKKworCWlmICgocEFkLT5NZ210UmluZy5UeFN3RnJlZUlkeCA+PSBNR01UX1JJTkdfU0laRSkgfHwKKwkJKHBNTE1FQ29udGV4dC0+SW5Vc2UgPT0gRkFMU0UpIHx8CisJCShwTUxNRUNvbnRleHQtPmJXYWl0aW5nQnVsa091dCA9PSBGQUxTRSkpCisJeworCisKKwkJLy8gQ2xlYXIgTUxNRSBidWxrIGZsYWcKKwkJUlRVU0JfQ0xFQVJfQlVMS19GTEFHKHBBZCwgZlJUVVNCX0JVTEtfT1VUX01MTUUpOworCisJCXJldHVybjsKKwl9CisKKworCVJUTVBfSVJRX0xPQ0soJnBBZC0+QnVsa091dExvY2tbTUdNVFBJUEVJRFhdLCBJcnFGbGFncyk7CisJaWYgKChwQWQtPkJ1bGtPdXRQZW5kaW5nW01HTVRQSVBFSURYXSA9PSBUUlVFKSB8fCBSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTkVFRF9TVE9QX1RYKSkKKwl7CisJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5CdWxrT3V0TG9ja1tNR01UUElQRUlEWF0sIElycUZsYWdzKTsKKwkJcmV0dXJuOworCX0KKworCXBBZC0+QnVsa091dFBlbmRpbmdbTUdNVFBJUEVJRFhdID0gVFJVRTsKKwlwQWQtPndhdGNoRG9nVHhQZW5kaW5nQ250W01HTVRQSVBFSURYXSA9IDE7CisJcE1MTUVDb250ZXh0LT5JUlBQZW5kaW5nID0gVFJVRTsKKwlwTUxNRUNvbnRleHQtPmJXYWl0aW5nQnVsa091dCA9IEZBTFNFOworCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5CdWxrT3V0TG9ja1tNR01UUElQRUlEWF0sIElycUZsYWdzKTsKKworCS8vIEluY3JlYXNlIFRvdGFsIHRyYW5zbWl0IGJ5dGUgY291bnRlcgorCXBBZC0+UmFsaW5rQ291bnRlcnMuVHJhbnNtaXR0ZWRCeXRlQ291bnQgKz0gIHBNTE1FQ29udGV4dC0+QnVsa091dFNpemU7CisKKwkvLyBDbGVhciBNTE1FIGJ1bGsgZmxhZworCVJUVVNCX0NMRUFSX0JVTEtfRkxBRyhwQWQsIGZSVFVTQl9CVUxLX09VVF9NTE1FKTsKKworCisJLy9EQkdQUklOVF9SQVcoUlRfREVCVUdfSU5GTywgKCItLS0+UlRVU0JCdWxrT3V0TUxNRVBhY2tldFxuIikpOworI2lmIDAgLy8gZm9yIGRlYnVnCit7CisJcHJpbnRrKCJNTE1FLU91dCwgQz0lZCEsIEQ9JWQsIEY9JWQhXG4iLCBwQWQtPk1nbXRSaW5nLlR4Q3B1SWR4LCBwQWQtPk1nbXRSaW5nLlR4RG1hSWR4LCBwQWQtPk1nbXRSaW5nLlR4U3dGcmVlSWR4KTsKKworCS8vVE9ETzogTmVlZCB0byByZW1vdmUgaXQgd2hlbiBmb3JtYWwgcmVsZWFzZQorCVBUWElORk9fU1RSVUMgcFR4SW5mbzsKKworCXBUeEluZm8gPSAoUFRYSU5GT19TVFJVQylwTUxNRUNvbnRleHQtPlRyYW5zZmVyQnVmZmVyOworCWlmIChwVHhJbmZvLT5RU0VMICE9IEZJRk9fRURDQSkKKwl7CisJCQlwcmludGsoIiVzKCk6ID09PT0+IHBUeEluZm8tPlF1ZXVlU2VsKCVkKSE9IEZJRk9fRURDQSEhISFcbiIsIF9fZnVuY19fLCBwVHhJbmZvLT5RU0VMKTsKKwkJCXByaW50aygiXHRNTE1FX0luZGV4PSVkIVxuIiwgSW5kZXgpOworCQkJaGV4X2R1bXAoIldyb25nIFFTZWwgUGt0OiIsIChQVUNIQVIpcE1MTUVDb250ZXh0LT5UcmFuc2ZlckJ1ZmZlciwgcFR4SW5mby0+VVNCRE1BVHhQa3RMZW4pOworCX0KK30KKyNlbmRpZgorCisjaWZkZWYgUlRfQklHX0VORElBTgorCVJUTVBEZXNjcmlwdG9yRW5kaWFuQ2hhbmdlKChQVUNIQVIpcE1MTUVDb250ZXh0LT5UcmFuc2ZlckJ1ZmZlciwgVFlQRV9UWElORk8pOworI2VuZGlmIC8vIFJUX0JJR19FTkRJQU4gLy8KKworCS8vIEluaXQgVHggY29udGV4dCBkZXNjcmlwdG9yCisJUlRVU0JJbml0VHhEZXNjKHBBZCwgcE1MTUVDb250ZXh0LCBNR01UUElQRUlEWCwgKHVzYl9jb21wbGV0ZV90KVJUVVNCQnVsa091dE1MTUVQYWNrZXRDb21wbGV0ZSk7CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApCisJLy9Gb3IgbWdtdCB1cmIgYnVmZmVyLCBiZWNhdXNlIHdlIHVzZSBza19idWZmLCBzbyB3ZSBuZWVkIHRvIG5vdGlmeSB0aGUgVVNCIGNvbnRyb2xsZXIgZG8gZG1hIG1hcHBpbmcuCisJcFVyYi0+dHJhbnNmZXJfZG1hCT0gMDsKKwlwVXJiLT50cmFuc2Zlcl9mbGFncyAmPSAoflVSQl9OT19UUkFOU0ZFUl9ETUFfTUFQKTsKKyNlbmRpZgorCisJcFVyYiA9IHBNTE1FQ29udGV4dC0+cFVyYjsKKwlpZigocmV0ID0gUlRVU0JfU1VCTUlUX1VSQihwVXJiKSkhPTApCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJSVFVTQkJ1bGtPdXRNTE1FUGFja2V0OiBTdWJtaXQgTUxNRSBVUkIgZmFpbGVkICVkXG4iLCByZXQpKTsKKwkJUlRNUF9JUlFfTE9DSygmcEFkLT5CdWxrT3V0TG9ja1tNR01UUElQRUlEWF0sIElycUZsYWdzKTsKKwkJcEFkLT5CdWxrT3V0UGVuZGluZ1tNR01UUElQRUlEWF0gPSBGQUxTRTsKKwkJcEFkLT53YXRjaERvZ1R4UGVuZGluZ0NudFtNR01UUElQRUlEWF0gPSAwOworCQlwTUxNRUNvbnRleHQtPklSUFBlbmRpbmcgPSBGQUxTRTsKKwkJcE1MTUVDb250ZXh0LT5iV2FpdGluZ0J1bGtPdXQgPSBUUlVFOworCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+QnVsa091dExvY2tbTUdNVFBJUEVJRFhdLCBJcnFGbGFncyk7CisKKwkJcmV0dXJuOworCX0KKworCS8vREJHUFJJTlRfUkFXKFJUX0RFQlVHX0lORk8sICgiPC0tLVJUVVNCQnVsa091dE1MTUVQYWNrZXQgXG4iKSk7CisvLwlwcmludGsoIjwtLS1SVFVTQkJ1bGtPdXRNTE1FUGFja2V0LENwdT0lZCEsIERtYT0lZCwgU3dJZHg9JWQhXG4iLCBwQWQtPk1nbXRSaW5nLlR4Q3B1SWR4LCBwQWQtPk1nbXRSaW5nLlR4RG1hSWR4LCBwQWQtPk1nbXRSaW5nLlR4U3dGcmVlSWR4KTsKK30KKworCitWT0lEIFJUVVNCQnVsa091dE1MTUVQYWNrZXRDb21wbGV0ZShwdXJiYl90IHBVcmIsIHN0cnVjdCBwdF9yZWdzICpwdF9yZWdzKQoreworCVBUWF9DT05URVhUCQkJcE1MTUVDb250ZXh0OworCVBSVE1QX0FEQVBURVIJCXBBZDsKKwlOVFNUQVRVUwkJCVN0YXR1czsKKwlQT1NfQ09PS0lFIAkJCXBPYmo7CisJaW50CQkJCQlpbmRleDsKKyNpZiAwIC8vIHNhbXBsZSwgSVJRIExPQ0sKKwl1bnNpZ25lZCBsb25nCQlJcnFGbGFnczsKKwlQTkRJU19QQUNLRVQJCXBQYWNrZXQ7CisjZW5kaWYKKworCisJLy9EQkdQUklOVF9SQVcoUlRfREVCVUdfSU5GTywgKCItLS0+UlRVU0JCdWxrT3V0TUxNRVBhY2tldENvbXBsZXRlXG4iKSk7CisJcE1MTUVDb250ZXh0CT0gKFBUWF9DT05URVhUKXBVcmItPmNvbnRleHQ7CisJcEFkIAkJCT0gcE1MTUVDb250ZXh0LT5wQWQ7CisJcE9iaiAJCQk9IChQT1NfQ09PS0lFKXBBZC0+T1NfQ29va2llOworCVN0YXR1cwkJCT0gcFVyYi0+c3RhdHVzOworCWluZGV4IAkJCT0gcE1MTUVDb250ZXh0LT5TZWxmSWR4OworCisKKyNpZiAwIC8vIHNhbXBsZSwgSVJRIExPQ0sKKwlBU1NFUlQoKHBBZC0+TWdtdFJpbmcuVHhEbWFJZHggPT0gaW5kZXgpKTsKKwkvL3ByaW50aygiTUxNRS1Eb25lLUI6IEM9JWQsIEQ9JWQsIEY9JWQsIFNlbGY9JWQhXG4iLCBwQWQtPk1nbXRSaW5nLlR4Q3B1SWR4LCBwQWQtPk1nbXRSaW5nLlR4RG1hSWR4LCBwQWQtPk1nbXRSaW5nLlR4U3dGcmVlSWR4LCBwTUxNRUNvbnRleHQtPlNlbGZJZHgpOworCisJUlRNUF9JUlFfTE9DSygmcEFkLT5CdWxrT3V0TG9ja1tNR01UUElQRUlEWF0sIElycUZsYWdzKTsKKworCisJaWYgKFN0YXR1cyAhPSBVU0JfU1RfTk9FUlJPUikKKwl7CisJCS8vQnVsay1PdXQgZmFpbCBzdGF0dXMgaGFuZGxlCisJCWlmICgoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUykpICYmCisJCQkoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKSkgJiYKKwkJCSghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSAmJgorCQkJKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlVMS09VVF9SRVNFVCkpKQorCQl7CisJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgiQnVsayBPdXQgTUxNRSBGYWlsZWQsIFN0YXR1cz0lZCFcbiIsIFN0YXR1cykpOworCQkJLy8gVE9ETzogSG93IHRvIGhhbmRsZSBhYm91dCB0aGUgTUxNRUJ1bGtPdXQgZmFpbGVkIGlzc3VlLiBOZWVkIHRvIHJlc2VuZCB0aGUgbWdtdCBwa3Q/CisJCQlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CVUxLT1VUX1JFU0VUKTsKKwkJCXBBZC0+YnVsa1Jlc2V0UGlwZWlkID0gKE1HTVRQSVBFSURYIHwgQlVMS09VVF9NR01UX1JFU0VUX0ZMQUcpOworCQl9CisJfQorCXBBZC0+QnVsa091dFBlbmRpbmdbTUdNVFBJUEVJRFhdID0gRkFMU0U7CisJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrW01HTVRQSVBFSURYXSwgSXJxRmxhZ3MpOworCisJUlRNUF9JUlFfTE9DSygmcEFkLT5NTE1FQnVsa091dExvY2ssIElycUZsYWdzKTsKKwkvLyBSZXNldCBNTE1FIGNvbnRleHQgZmxhZ3MKKwlwTUxNRUNvbnRleHQtPklSUFBlbmRpbmcgPSBGQUxTRTsKKwlwTUxNRUNvbnRleHQtPkluVXNlID0gRkFMU0U7CisJcE1MTUVDb250ZXh0LT5iV2FpdGluZ0J1bGtPdXQgPSBGQUxTRTsKKwlwTUxNRUNvbnRleHQtPkJ1bGtPdXRTaXplID0gMDsKKworCXBQYWNrZXQgPSBwQWQtPk1nbXRSaW5nLkNlbGxbaW5kZXhdLnBOZGlzUGFja2V0OworCXBBZC0+TWdtdFJpbmcuQ2VsbFtpbmRleF0ucE5kaXNQYWNrZXQgPSBOVUxMOworCisJLy8gSW5jcmVhc2UgTWdtdFJpbmcgSW5kZXgKKwlJTkNfUklOR19JTkRFWChwQWQtPk1nbXRSaW5nLlR4RG1hSWR4LCBNR01UX1JJTkdfU0laRSk7CisJcEFkLT5NZ210UmluZy5UeFN3RnJlZUlkeCsrOworCisJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPk1MTUVCdWxrT3V0TG9jaywgSXJxRmxhZ3MpOworCisJLy8gTm8tbWF0dGVyIHN1Y2Nlc3Mgb3IgZmFpbCwgd2UgZnJlZSB0aGUgbWdtdCBwYWNrZXQuCisJaWYgKHBQYWNrZXQpCisJCVJUTVBGcmVlTmRpc1BhY2tldChwQWQsIHBQYWNrZXQpOworCisjaWYgMAorCS8vQnVsay1PdXQgZmFpbCBzdGF0dXMgaGFuZGxlCisJaWYgKFN0YXR1cyAhPSBVU0JfU1RfTk9FUlJPUikKKwl7CisJCWlmICgoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUykpICYmCisJCQkoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKSkgJiYKKwkJCSghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSAmJgorCQkJKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlVMS09VVF9SRVNFVCkpKQorCQl7CisJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgiQnVsayBPdXQgTUxNRSBGYWlsZWQsIFN0YXR1cz0lZCFcbiIsIFN0YXR1cykpOworCQkJLy8gVE9ETzogSG93IHRvIGhhbmRsZSBhYm91dCB0aGUgTUxNRUJ1bGtPdXQgZmFpbGVkIGlzc3VlLiBOZWVkIHRvIHJlc2V0IHRoZSBlbmRwb2ludD8KKwkJCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JVTEtPVVRfUkVTRVQpOworCQkJcEFkLT5idWxrUmVzZXRQaXBlaWQgPSAoTUdNVFBJUEVJRFggfCBCVUxLT1VUX01HTVRfUkVTRVRfRkxBRyk7CisJCX0KKwl9CisjZW5kaWYKKworCS8vcHJpbnRrKCJNTE1FLURvbmUtQTogQz0lZCwgRD0lZCwgRj0lZCFcbiIsIHBBZC0+TWdtdFJpbmcuVHhDcHVJZHgsIHBBZC0+TWdtdFJpbmcuVHhEbWFJZHgsIHBBZC0+TWdtdFJpbmcuVHhTd0ZyZWVJZHgpOworCisJcE9iai0+bWdtdF9kbWFfZG9uZV90YXNrLmRhdGEgPSAodW5zaWduZWQgbG9uZylwQWQ7CisJdGFza2xldF9oaV9zY2hlZHVsZSgmcE9iai0+bWdtdF9kbWFfZG9uZV90YXNrKTsKKworCS8vREJHUFJJTlRfUkFXKFJUX0RFQlVHX0lORk8sICgiPC0tLVJUVVNCQnVsa091dE1MTUVQYWNrZXRDb21wbGV0ZVxuIikpOworLy8JcHJpbnRrKCI8LS0tUlRVU0JCdWxrT3V0TUxNRVBhY2tldENvbXBsZXRlLCBDcHU9JWQsIERtYT0lZCwgU3dJZHg9JWQhXG4iLAorLy8JCQkJcEFkLT5NZ210UmluZy5UeENwdUlkeCwgcEFkLT5NZ210UmluZy5UeERtYUlkeCwgcEFkLT5NZ210UmluZy5UeFN3RnJlZUlkeCk7CisKKyNlbHNlCisKKwlwT2JqLT5tZ210X2RtYV9kb25lX3Rhc2suZGF0YSA9ICh1bnNpZ25lZCBsb25nKXBVcmI7CisJdGFza2xldF9oaV9zY2hlZHVsZSgmcE9iai0+bWdtdF9kbWFfZG9uZV90YXNrKTsKKyNlbmRpZgorfQorCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCisJQXJndW1lbnRzOgorCisJUmV0dXJuIFZhbHVlOgorCisJTm90ZTogUHNQb2xsIHVzZSBCdWxrT3V0UGlwZUlkID0gMAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlSVFVTQkJ1bGtPdXRQc1BvbGwoCisJSU4JUFJUTVBfQURBUFRFUglwQWQpCit7CisJUFRYX0NPTlRFWFQJCXBQc1BvbGxDb250ZXh0ID0gJihwQWQtPlBzUG9sbENvbnRleHQpOworCVBVUkIJCQlwVXJiOworCWludAkJCQlyZXQgPSAwOworCXVuc2lnbmVkIGxvbmcJSXJxRmxhZ3M7CisKKwlSVE1QX0lSUV9MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrWzBdLCBJcnFGbGFncyk7CisJaWYgKChwQWQtPkJ1bGtPdXRQZW5kaW5nWzBdID09IFRSVUUpIHx8IFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9ORUVEX1NUT1BfVFgpKQorCXsKKwkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrWzBdLCBJcnFGbGFncyk7CisJCXJldHVybjsKKwl9CisJcEFkLT5CdWxrT3V0UGVuZGluZ1swXSA9IFRSVUU7CisJcEFkLT53YXRjaERvZ1R4UGVuZGluZ0NudFswXSA9IDE7CisJcFBzUG9sbENvbnRleHQtPklSUFBlbmRpbmcgPSBUUlVFOworCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5CdWxrT3V0TG9ja1swXSwgSXJxRmxhZ3MpOworCisKKwkvLyBDbGVhciBQUy1Qb2xsIGJ1bGsgZmxhZworCVJUVVNCX0NMRUFSX0JVTEtfRkxBRyhwQWQsIGZSVFVTQl9CVUxLX09VVF9QU1BPTEwpOworCisjaWZkZWYgUlRfQklHX0VORElBTgorCVJUTVBEZXNjcmlwdG9yRW5kaWFuQ2hhbmdlKChQVUNIQVIpcFBzUG9sbENvbnRleHQtPlRyYW5zZmVyQnVmZmVyLCBUWVBFX1RYSU5GTyk7CisjZW5kaWYgLy8gUlRfQklHX0VORElBTiAvLworCisJLy8gSW5pdCBUeCBjb250ZXh0IGRlc2NyaXB0b3IKKwlSVFVTQkluaXRUeERlc2MocEFkLCBwUHNQb2xsQ29udGV4dCwgTUdNVFBJUEVJRFgsICh1c2JfY29tcGxldGVfdClSVFVTQkJ1bGtPdXRQc1BvbGxDb21wbGV0ZSk7CisKKwlwVXJiID0gcFBzUG9sbENvbnRleHQtPnBVcmI7CisJaWYoKHJldCA9IFJUVVNCX1NVQk1JVF9VUkIocFVyYikpIT0wKQorCXsKKwkJUlRNUF9JUlFfTE9DSygmcEFkLT5CdWxrT3V0TG9ja1swXSwgSXJxRmxhZ3MpOworCQlwQWQtPkJ1bGtPdXRQZW5kaW5nWzBdID0gRkFMU0U7CisJCXBBZC0+d2F0Y2hEb2dUeFBlbmRpbmdDbnRbMF0gPSAwOworCQlwUHNQb2xsQ29udGV4dC0+SVJQUGVuZGluZyA9IEZBTFNFOworCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+QnVsa091dExvY2tbMF0sIElycUZsYWdzKTsKKworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJSVFVTQkJ1bGtPdXRQc1BvbGw6IFN1Ym1pdCBUeCBVUkIgZmFpbGVkICVkXG4iLCByZXQpKTsKKwkJcmV0dXJuOworCX0KKworfQorCisvLyBQUy1Qb2xsIGZyYW1lIHVzZSBCdWxrT3V0UGlwZUlkID0gMAorVk9JRCBSVFVTQkJ1bGtPdXRQc1BvbGxDb21wbGV0ZShwdXJiYl90IHBVcmIsc3RydWN0IHB0X3JlZ3MgKnB0X3JlZ3MpCit7CisJUFJUTVBfQURBUFRFUgkJcEFkOworCVBUWF9DT05URVhUCQkJcFBzUG9sbENvbnRleHQ7CisJTlRTVEFUVVMJCQlTdGF0dXM7CisjaWYgMCAvLyBzYW1wbGUsIElSUSBMT0NLCisJdW5zaWduZWQgbG9uZwkJSXJxRmxhZ3M7CisjZW5kaWYKKwlQT1NfQ09PS0lFCQkJcE9iajsKKworCisJcFBzUG9sbENvbnRleHQ9IChQVFhfQ09OVEVYVClwVXJiLT5jb250ZXh0OworCXBBZCA9IHBQc1BvbGxDb250ZXh0LT5wQWQ7CisJU3RhdHVzID0gcFVyYi0+c3RhdHVzOworCisjaWYgMCAvLyBzYW1wbGUsIElSUSBMT0NLCisJLy8gUmVzZXQgUHNQb2xsIGNvbnRleHQgZmxhZ3MKKwlwUHNQb2xsQ29udGV4dC0+SVJQUGVuZGluZwk9IEZBTFNFOworCXBQc1BvbGxDb250ZXh0LT5JblVzZQkJPSBGQUxTRTsKKworCWlmIChTdGF0dXMgPT0gVVNCX1NUX05PRVJST1IpCisJeworCQkvLyBEb24ndCB3b3JyeSBhYm91dCB0aGUgcXVldWUgaXMgZW1wdHkgb3Igbm90LCB0aGlzIGZ1bmN0aW9uIHdpbGwgY2hlY2sgaXRzZWxmCisJCVJUTVBEZVF1ZXVlUGFja2V0KHBBZCwgVFJVRSwgTlVNX09GX1RYX1JJTkcsIE1BWF9UWF9QUk9DRVNTKTsKKwl9CisJZWxzZSAvLyBTVEFUVVNfT1RIRVIKKwl7CisJCWlmICgoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUykpICYmCisJCQkoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKSkgJiYKKwkJCSghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSAmJgorCQkJKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlVMS09VVF9SRVNFVCkpKQorCQl7CisJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgiQnVsayBPdXQgUFNQb2xsIEZhaWxlZFxuIikpOworCQkJUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlVMS09VVF9SRVNFVCk7CisJCQlSVFVTQkVucXVldWVJbnRlcm5hbENtZChwQWQsIENNRFRIUkVBRF9SRVNFVF9CVUxLX09VVCwgTlVMTCwgMCk7CisJCX0KKwl9CisKKwlSVE1QX0lSUV9MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrWzBdLCBJcnFGbGFncyk7CisJcEFkLT5CdWxrT3V0UGVuZGluZ1swXSA9IEZBTFNFOworCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5CdWxrT3V0TG9ja1swXSwgSXJxRmxhZ3MpOworCisJLy8gQWx3YXlzIGNhbGwgQnVsayByb3V0aW5lLCBldmVuIHJlc2V0IGJ1bGsuCisJLy8gVGhlIHByb3RlY3Rpb29uIG9mIHJlc3QgYnVsayBzaG91bGQgYmUgaW4gQnVsa091dCByb3V0aW5lCisJUlRVU0JLaWNrQnVsa091dChwQWQpOworI2Vsc2UKKworCXBPYmogPSAoUE9TX0NPT0tJRSkgcEFkLT5PU19Db29raWU7CisJcE9iai0+cHNwb2xsX2ZyYW1lX2NvbXBsZXRlX3Rhc2suZGF0YSA9ICh1bnNpZ25lZCBsb25nKXBVcmI7CisJdGFza2xldF9oaV9zY2hlZHVsZSgmcE9iai0+cHNwb2xsX2ZyYW1lX2NvbXBsZXRlX3Rhc2spOworI2VuZGlmCit9CisKKworI2lmIDAKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCVVTQl9SeFBhY2tldCBpbml0aWFsaXplcyBhIFVSQiBhbmQgdXNlcyB0aGUgUnggSVJQIHRvIHN1Ym1pdCBpdAorCXRvIFVTQi4gSXQgY2hlY2tzIGlmIGFuIFJ4IERlc2NyaXB0b3IgaXMgYXZhaWxhYmxlIGFuZCBwYXNzZXMgdGhlCisJdGhlIGNvcmVzcG9uZGluZyBidWZmZXIgdG8gYmUgZmlsbGVkLiBJZiBubyBkZXNjcmlwdG9yIGlzIGF2YWlsYWJsZQorCWZhaWxzIHRoZSByZXF1ZXN0LiBXaGVuIHNldHRpbmcgdGhlIGNvbXBsZXRpb24gcm91dGluZSB3ZSBwYXNzIG91cgorCUFkYXB0ZXIgT2JqZWN0IGFzIENvbnRleHQuCisKKwlBcmd1bWVudHM6CisKKwlSZXR1cm4gVmFsdWU6CisJCVRSVUUJCQlmb3VuZCBtYXRjaGVkIHR1cGxlIGNhY2hlCisJCUZBTFNFCQkJbm8gbWF0Y2hlZCBmb3VuZAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJUlRVU0JCdWxrUmVjZWl2ZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCkKK3sKKwlQUlhfQ09OVEVYVAkJcFJ4Q29udGV4dDsKKwlQVVJCCQkJcFVyYjsKKwlpbnQJCQkJcmV0ID0gMDsKKwl1bnNpZ25lZCBsb25nCUlycUZsYWdzOworCisKKwkvKiBkZXZpY2UgaGFkIGJlZW4gY2xvc2VkICovCisJaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SRU1PVkVfSU5fUFJPR1JFU1MpKQorCQlyZXR1cm47CisKKwlSVE1QX0lSUV9MT0NLKCZwQWQtPkJ1bGtJbkxvY2ssIElycUZsYWdzKTsKKworCS8vIExhc3QgaXMgdGltZSBwb2ludCBiZXR3ZWVuIDIgc2VwYXJhdGUgVVJCLgorCWlmIChwQWQtPk5leHRSeEJ1bGtJblBvc2l0aW9uID09IDApCisJeworCQkvL3BBZC0+TmV4dFJ4QnVsa0luSW5kZXggPSAocEFkLT5OZXh0UnhCdWxrSW5JbmRleCArIDEpICUgKFJYX1JJTkdfU0laRSk7CisJCUlOQ19SSU5HX0lOREVYKHBBZC0+TmV4dFJ4QnVsa0luSW5kZXgsIFJYX1JJTkdfU0laRSk7CisJfQorCWVsc2UgaWYgKChwQWQtPk5leHRSeEJ1bGtJblBvc2l0aW9uJjB4MWZmKSAhPSAwKQorCXsKKwkJLy9wQWQtPk5leHRSeEJ1bGtJbkluZGV4ID0gKHBBZC0+TmV4dFJ4QnVsa0luSW5kZXggKyAxKSAlIChSWF9SSU5HX1NJWkUpOworCQlJTkNfUklOR19JTkRFWChwQWQtPk5leHRSeEJ1bGtJbkluZGV4LCBSWF9SSU5HX1NJWkUpOworCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgicEFkLT5OZXh0UnhCdWxrSW5Qb3NpdGlvbiA9IDB4JWx4LiAgRW5kIG9mIFVSQi5cbiIsIHBBZC0+TmV4dFJ4QnVsa0luUG9zaXRpb24gKSk7CisJCXBBZC0+TmV4dFJ4QnVsa0luUG9zaXRpb24gPSAwOworCX0KKworCWlmIChwQWQtPk5leHRSeEJ1bGtJblBvc2l0aW9uID09IE1BWF9SWEJVTEtfU0laRSkKKwkJcEFkLT5OZXh0UnhCdWxrSW5Qb3NpdGlvbiA9IDA7CisKKwlwUnhDb250ZXh0ID0gJihwQWQtPlJ4Q29udGV4dFtwQWQtPk5leHRSeEJ1bGtJbkluZGV4XSk7CisKKwkvLyBUT0RPOiBXaHkgbmVlZCB0byBjaGVjayBpZiBwUnhDb250ZXh0LT5JblVzZWQgPT0gVFJVRT8KKwkvL2lmICgocFJ4Q29udGV4dC0+SW5Vc2UgPT0gVFJVRSkgfHwgKHBSeENvbnRleHQtPlJlYWRhYmxlID09IFRSVUUpKQorCWlmICgocFJ4Q29udGV4dC0+SW5Vc2UgPT0gRkFMU0UpICYmIChwUnhDb250ZXh0LT5SZWFkYWJsZSA9PSBUUlVFKSkKKwl7CisJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCJwUnhDb250ZXh0WyVkXSBJblVzZSA9ICVkLnBSeENvbnRleHQtPlJlYWRhYmxlID0gJWQuICBSZXR1cm4uXG4iLCBwQWQtPk5leHRSeEJ1bGtJbkluZGV4LHBSeENvbnRleHQtPkluVXNlLCBwUnhDb250ZXh0LT5SZWFkYWJsZSApKTsKKwkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPkJ1bGtJbkxvY2ssIElycUZsYWdzKTsKKworCQkvLyByZWFkIFJ4Q29udGV4dCwgU2luY2Ugbm90CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCVNUQVJ4RG9uZUludGVycnVwdEhhbmRsZShwQWQsIFRSVUUpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJCS8vcmV0dXJuOworCX0KKwlwUnhDb250ZXh0LT5JblVzZSA9IFRSVUU7CisJcFJ4Q29udGV4dC0+SVJQUGVuZGluZz0gVFJVRTsKKworCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5CdWxrSW5Mb2NrLCBJcnFGbGFncyk7CisKKwkvLyBJbml0IFJ4IGNvbnRleHQgZGVzY3JpcHRvcgorCU5kaXNaZXJvTWVtb3J5KHBSeENvbnRleHQtPlRyYW5zZmVyQnVmZmVyLCBCVUZGRVJfU0laRSk7CisJUlRVU0JJbml0UnhEZXNjKHBBZCwgcFJ4Q29udGV4dCk7CisKKwlwVXJiID0gcFJ4Q29udGV4dC0+cFVyYjsKKwlpZiAoKHJldCA9IFJUVVNCX1NVQk1JVF9VUkIocFVyYikpIT0wKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiUlRVU0JCdWxrUmVjZWl2ZTogU3VibWl0IFJ4IFVSQiBmYWlsZWQgJWRcbiIsIHJldCkpOworCQlyZXR1cm47CisJfQorCWVsc2UgLy8gc3VjY2VzcworCXsKKwkJTmRpc0ludGVybG9ja2VkSW5jcmVtZW50KCZwQWQtPlBlbmRpbmdSeCk7CisJCXBBZC0+QnVsa0luUmVxKys7CisJfQorCisJLy8gcmVhZCBSeENvbnRleHQsIFNpbmNlIG5vdAorI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCVNUQVJ4RG9uZUludGVycnVwdEhhbmRsZShwQWQsIEZBTFNFKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVRoaXMgcm91dGluZSBwcm9jZXNzIFJ4IElycCBhbmQgY2FsbCByeCBjb21wbGV0ZSBmdW5jdGlvbi4KKworCUFyZ3VtZW50czoKKwkJRGV2aWNlT2JqZWN0CVBvaW50ZXIgdG8gdGhlIGRldmljZSBvYmplY3QgZm9yIG5leHQgbG93ZXIKKwkJCQkJCWRldmljZS4gRGV2aWNlT2JqZWN0IHBhc3NlZCBpbiBoZXJlIGJlbG9uZ3MgdG8KKwkJCQkJCXRoZSBuZXh0IGxvd2VyIGRyaXZlciBpbiB0aGUgc3RhY2sgYmVjYXVzZSB3ZQorCQkJCQkJd2VyZSBpbnZva2VkIHZpYSBJb0NhbGxEcml2ZXIgaW4gVVNCX1J4UGFja2V0CisJCQkJCQlBTkQgaXQgaXMgbm90IE9VUiBkZXZpY2Ugb2JqZWN0CisJICBJcnAJCQkJUHRyIHRvIGNvbXBsZXRlZCBJUlAKKwkgIENvbnRleHQJCQlQdHIgdG8gb3VyIEFkYXB0ZXIgb2JqZWN0IChjb250ZXh0IHNwZWNpZmllZAorCQkJCQkJaW4gSW9TZXRDb21wbGV0aW9uUm91dGluZQorCisJUmV0dXJuIFZhbHVlOgorCQlBbHdheXMgcmV0dXJucyBTVEFUVVNfTU9SRV9QUk9DRVNTSU5HX1JFUVVJUkVECisKKwlOb3RlOgorCQlBbHdheXMgcmV0dXJucyBTVEFUVVNfTU9SRV9QUk9DRVNTSU5HX1JFUVVJUkVECisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBSVFVTQkJ1bGtSeENvbXBsZXRlKHB1cmJiX3QgcFVyYiwgc3RydWN0IHB0X3JlZ3MgKnB0X3JlZ3MpCit7CisjaWYgMAorCVBSWF9DT05URVhUCQkJcFJ4Q29udGV4dDsKKwlQUlRNUF9BREFQVEVSCQlwQWQ7CisJTlRTVEFUVVMJCQlTdGF0dXM7CisvLwlQT1NfQ09PS0lFCQkJcE9iajsKKworCXBSeENvbnRleHQJPSAoUFJYX0NPTlRFWFQpcFVyYi0+Y29udGV4dDsKKwlwQWQgCQk9IHBSeENvbnRleHQtPnBBZDsKKy8vCXBPYmoJCT0gKFBPU19DT09LSUUpIHBBZC0+T1NfQ29va2llOworCisKKwlTdGF0dXMgPSBwVXJiLT5zdGF0dXM7CisJLy9wUnhDb250ZXh0LT5wSXJwID0gTlVMTDsKKworCXBSeENvbnRleHQtPkluVXNlID0gRkFMU0U7CisJcFJ4Q29udGV4dC0+SVJQUGVuZGluZyA9IEZBTFNFOworCisJaWYgKFN0YXR1cyA9PSBVU0JfU1RfTk9FUlJPUikKKwl7CisJCXBBZC0+QnVsa0luQ29tcGxldGUrKzsKKwkJcFJ4Q29udGV4dC0+UmVhZGFibGUgPSBUUlVFOworCQlwQWQtPk5leHRSeEJ1bGtJblBvc2l0aW9uID0gMDsKKworCX0KKwllbHNlCSAvLyBTVEFUVVNfT1RIRVIKKwl7CisJCXBBZC0+QnVsa0luQ29tcGxldGVGYWlsKys7CisJCS8vIFN0aWxsIHJlYWQgdGhpcyBwYWNrZXQgYWx0aG91Z2ggaXQgbWF5IGNvbXRhaW4gd3JvbmcgYnl0ZXMuCisJCXBSeENvbnRleHQtPlJlYWRhYmxlID0gRkFMU0U7CisJCS8vIFBhcnNpbmcgYWxsIHBhY2tldHMuIGJlY2F1c2UgYWZ0ZXIgcmVzZXQsIHRoZSBpbmRleCB3aWxsIHJlc2V0IHRvIGFsbCB6ZXJvLgorCisJCWlmICgoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUykpICYmCisJCQkoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CVUxLSU5fUkVTRVQpKSAmJgorCQkJKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUykpICYmCisJCQkoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkpCisJCXsKKworCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCAoIkJ1bGsgSW4gRmFpbGVkLiBTdGF0dXMgPSAlZFxuIiwgU3RhdHVzKSk7CisJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgiPT0+TmV4dFJ4QnVsa0luSW5kZXg9MHgleCwgTmV4dFJ4QnVsa0luUmVhZEluZGV4PTB4JXgsIFRyYW5zZmVyQnVmZmVyTGVuZ3RoPSAweCV4XG4iLAorCQkJCXBBZC0+TmV4dFJ4QnVsa0luSW5kZXgsIHBBZC0+TmV4dFJ4QnVsa0luUmVhZEluZGV4LCBwUnhDb250ZXh0LT5wVXJiLT5hY3R1YWxfbGVuZ3RoKSk7CisKKwkJCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JVTEtJTl9SRVNFVCk7CisJCQlSVFVTQkVucXVldWVJbnRlcm5hbENtZChwQWQsIENNRFRIUkVBRF9SRVNFVF9CVUxLX0lOLCBOVUxMLCAwKTsKKwkJfQorCQkvL3BVcmIgPSBOVUxMOworCX0KKworCWlmICgoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUykpICYmCisJCSghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JVTEtJTl9SRVNFVCkpICYmCisvLwkJKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlVMS09VVF9SRVNFVCkpICYmCisJCSghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JBRElPX09GRikpICYmCisJCSghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MpKSAmJgorCQkoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkpCisJeworCQlSVFVTQkJ1bGtSZWNlaXZlKHBBZCk7CisjaWYgMAorI2lmIDEKKwkJU1RBUnhEb25lSW50ZXJydXB0SGFuZGxlKHBBZCwgRkFMU0UpOworI2Vsc2UKKwkJcE9iai0+cnhfYmguZGF0YSA9ICh1bnNpZ25lZCBsb25nKXBVcmI7CisJCXRhc2tsZXRfc2NoZWR1bGUoJnBPYmotPnJ4X2JoKTsKKyNlbmRpZgorI2VuZGlmCisJfQorCisJLy8gQ2FsbCBSeFBhY2tldCB0byBwcm9jZXNzIHBhY2tldCBhbmQgcmV0dXJuIHRoZSBzdGF0dXMKKwlOZGlzSW50ZXJsb2NrZWREZWNyZW1lbnQoJnBBZC0+UGVuZGluZ1J4KTsKKyNlbHNlCisKKworCS8vIHVzZSBhIHJlY2VpdmUgdGFza2xldCB0byBoYW5kbGUgcmVjZWl2ZWQgcGFja2V0czsKKwkvLyBvciBzb21ldGltZXMgaGFyZHdhcmUgSVJRIHdpbGwgYmUgZGlzYWJsZWQgaGVyZSwgc28gd2UgY2FuIG5vdAorCS8vIHVzZSBzcGluX2xvY2tfYmgoKS9zcGluX3VubG9ja19iaCgpIGFmdGVyIElSUSBpcyBkaXNhYmxlZC4gOjwKKwlQUlhfQ09OVEVYVAkJcFJ4Q29udGV4dDsKKwlQUlRNUF9BREFQVEVSCXBBZDsKKwlQT1NfQ09PS0lFIAkJcE9iajsKKworCisJcFJ4Q29udGV4dAk9IChQUlhfQ09OVEVYVClwVXJiLT5jb250ZXh0OworCXBBZCAJCT0gcFJ4Q29udGV4dC0+cEFkOworCXBPYmogCQk9IChQT1NfQ09PS0lFKSBwQWQtPk9TX0Nvb2tpZTsKKworCXBPYmotPnJ4X2RvbmVfdGFzay5kYXRhID0gKHVuc2lnbmVkIGxvbmcpcFVyYjsKKwl0YXNrbGV0X2hpX3NjaGVkdWxlKCZwT2JqLT5yeF9kb25lX3Rhc2spOworI2VuZGlmCit9CisKKyNlbHNlCisKK1ZPSUQgRG9CdWxrSW4oSU4gUlRNUF9BREFQVEVSICpwQWQpCit7CisJUFJYX0NPTlRFWFQJCXBSeENvbnRleHQ7CisJUFVSQgkJCXBVcmI7CisJaW50CQkJCXJldCA9IDA7CisJdW5zaWduZWQgbG9uZwlJcnFGbGFnczsKKworCVJUTVBfSVJRX0xPQ0soJnBBZC0+QnVsa0luTG9jaywgSXJxRmxhZ3MpOworCXBSeENvbnRleHQgPSAmKHBBZC0+UnhDb250ZXh0W3BBZC0+TmV4dFJ4QnVsa0luSW5kZXhdKTsKKwlpZiAoKHBBZC0+UGVuZGluZ1J4ID4gMCkgfHwgKHBSeENvbnRleHQtPlJlYWRhYmxlID09IFRSVUUpIHx8IChwUnhDb250ZXh0LT5JblVzZSA9PSBUUlVFKSkKKwl7CisJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5CdWxrSW5Mb2NrLCBJcnFGbGFncyk7CisJCXJldHVybjsKKwl9CisJcFJ4Q29udGV4dC0+SW5Vc2UgPSBUUlVFOworCXBSeENvbnRleHQtPklSUFBlbmRpbmcgPSBUUlVFOworCXBBZC0+UGVuZGluZ1J4Kys7CisJcEFkLT5CdWxrSW5SZXErKzsKKwlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+QnVsa0luTG9jaywgSXJxRmxhZ3MpOworCisJLy8gSW5pdCBSeCBjb250ZXh0IGRlc2NyaXB0b3IKKwlOZGlzWmVyb01lbW9yeShwUnhDb250ZXh0LT5UcmFuc2ZlckJ1ZmZlciwgcFJ4Q29udGV4dC0+QnVsa0luT2Zmc2V0KTsKKwlSVFVTQkluaXRSeERlc2MocEFkLCBwUnhDb250ZXh0KTsKKworCXBVcmIgPSBwUnhDb250ZXh0LT5wVXJiOworCWlmICgocmV0ID0gUlRVU0JfU1VCTUlUX1VSQihwVXJiKSkhPTApCisJewkvLyBmYWlsCisKKwkJUlRNUF9JUlFfTE9DSygmcEFkLT5CdWxrSW5Mb2NrLCBJcnFGbGFncyk7CisJCXBSeENvbnRleHQtPkluVXNlID0gRkFMU0U7CisJCXBSeENvbnRleHQtPklSUFBlbmRpbmcgPSBGQUxTRTsKKwkJcEFkLT5QZW5kaW5nUngtLTsKKwkJcEFkLT5CdWxrSW5SZXEtLTsKKwkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPkJ1bGtJbkxvY2ssIElycUZsYWdzKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiUlRVU0JCdWxrUmVjZWl2ZTogU3VibWl0IFJ4IFVSQiBmYWlsZWQgJWRcbiIsIHJldCkpOworCX0KKwllbHNlCisJewkvLyBzdWNjZXNzCisjaWYgMAorCQlSVE1QX0lSUV9MT0NLKCZwQWQtPkJ1bGtJbkxvY2ssIElycUZsYWdzKTsKKwkJcFJ4Q29udGV4dC0+SVJQUGVuZGluZyA9IFRSVUU7CisJCS8vTmRpc0ludGVybG9ja2VkSW5jcmVtZW50KCZwQWQtPlBlbmRpbmdSeCk7CisJCXBBZC0+UGVuZGluZ1J4Kys7CisJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5CdWxrSW5Mb2NrLCBJcnFGbGFncyk7CisJCXBBZC0+QnVsa0luUmVxKys7CisjZW5kaWYKKwkJQVNTRVJUKChwUnhDb250ZXh0LT5JblVzZSA9PSBwUnhDb250ZXh0LT5JUlBQZW5kaW5nKSk7CisJCS8vcHJpbnRrKCJCSURvbmUsIFBlbmQ9JWQsQklJZHg9JWQsQklSSWR4PSVkIVxuIiwgcEFkLT5QZW5kaW5nUngsIHBBZC0+TmV4dFJ4QnVsa0luSW5kZXgsIHBBZC0+TmV4dFJ4QnVsa0luUmVhZEluZGV4KTsKKwl9Cit9CisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJVVNCX1J4UGFja2V0IGluaXRpYWxpemVzIGEgVVJCIGFuZCB1c2VzIHRoZSBSeCBJUlAgdG8gc3VibWl0IGl0CisJdG8gVVNCLiBJdCBjaGVja3MgaWYgYW4gUnggRGVzY3JpcHRvciBpcyBhdmFpbGFibGUgYW5kIHBhc3NlcyB0aGUKKwl0aGUgY29yZXNwb25kaW5nIGJ1ZmZlciB0byBiZSBmaWxsZWQuIElmIG5vIGRlc2NyaXB0b3IgaXMgYXZhaWxhYmxlCisJZmFpbHMgdGhlIHJlcXVlc3QuIFdoZW4gc2V0dGluZyB0aGUgY29tcGxldGlvbiByb3V0aW5lIHdlIHBhc3Mgb3VyCisJQWRhcHRlciBPYmplY3QgYXMgQ29udGV4dC4KKworCUFyZ3VtZW50czoKKworCVJldHVybiBWYWx1ZToKKwkJVFJVRQkJCWZvdW5kIG1hdGNoZWQgdHVwbGUgY2FjaGUKKwkJRkFMU0UJCQlubyBtYXRjaGVkIGZvdW5kCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworI2RlZmluZSBmUlRNUF9BREFQVEVSX05FRURfU1RPUF9SWAkJXAorCQkoZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUIHwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwJXAorCQkgZlJUTVBfQURBUFRFUl9SQURJT19PRkYgfCBmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTIHwgXAorCQkgZlJUTVBfQURBUFRFUl9SRU1PVkVfSU5fUFJPR1JFU1MgfCBmUlRNUF9BREFQVEVSX0JVTEtJTl9SRVNFVCkKKworI2RlZmluZSBmUlRNUF9BREFQVEVSX05FRURfU1RPUF9IQU5ETEVfUlgJXAorCQkoZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUIHwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwJXAorCQkgZlJUTVBfQURBUFRFUl9SQURJT19PRkYgfCBmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTIHwgXAorCQkgZlJUTVBfQURBUFRFUl9SRU1PVkVfSU5fUFJPR1JFU1MpCisKK1ZPSUQJUlRVU0JCdWxrUmVjZWl2ZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCkKK3sKKwlQUlhfQ09OVEVYVAkJcFJ4Q29udGV4dDsKKwl1bnNpZ25lZCBsb25nCUlycUZsYWdzOworCisKKwkvKiBzYW5pdHkgY2hlY2sgKi8KKwlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05FRURfU1RPUF9IQU5ETEVfUlgpKQorCQlyZXR1cm47CisKKwl3aGlsZSgxKQorCXsKKworCQlSVE1QX0lSUV9MT0NLKCZwQWQtPkJ1bGtJbkxvY2ssIElycUZsYWdzKTsKKwkJcFJ4Q29udGV4dCA9ICYocEFkLT5SeENvbnRleHRbcEFkLT5OZXh0UnhCdWxrSW5SZWFkSW5kZXhdKTsKKwkJaWYgKCgocFJ4Q29udGV4dC0+SW5Vc2UgPT0gRkFMU0UpICYmIChwUnhDb250ZXh0LT5SZWFkYWJsZSA9PSBUUlVFKSkgJiYKKwkJCShwUnhDb250ZXh0LT5iUnhIYW5kbGluZyA9PSBGQUxTRSkpCisJCXsKKwkJCXBSeENvbnRleHQtPmJSeEhhbmRsaW5nID0gVFJVRTsKKwkJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5CdWxrSW5Mb2NrLCBJcnFGbGFncyk7CisKKwkJCS8vIHJlYWQgUnhDb250ZXh0LCBTaW5jZSBub3QKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCQkJU1RBUnhEb25lSW50ZXJydXB0SGFuZGxlKHBBZCwgVFJVRSk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwkJCS8vIEZpbmlzaCB0byBoYW5kbGUgdGhpcyBidWxrSW4gYnVmZmVyLgorCQkJUlRNUF9JUlFfTE9DSygmcEFkLT5CdWxrSW5Mb2NrLCBJcnFGbGFncyk7CisJCQlwUnhDb250ZXh0LT5CdWxrSW5PZmZzZXQgPSAwOworCQkJcFJ4Q29udGV4dC0+UmVhZGFibGUgPSBGQUxTRTsKKwkJCXBSeENvbnRleHQtPmJSeEhhbmRsaW5nID0gRkFMU0U7CisJCQlwQWQtPlJlYWRQb3NpdGlvbiA9IDA7CisJCQlwQWQtPlRyYW5zZmVyQnVmZmVyTGVuZ3RoID0gMDsKKwkJCUlOQ19SSU5HX0lOREVYKHBBZC0+TmV4dFJ4QnVsa0luUmVhZEluZGV4LCBSWF9SSU5HX1NJWkUpOworCQkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPkJ1bGtJbkxvY2ssIElycUZsYWdzKTsKKworCQl9CisJCWVsc2UKKwkJeworCQkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPkJ1bGtJbkxvY2ssIElycUZsYWdzKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKCEoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05FRURfU1RPUF9SWCkpKQorCQlEb0J1bGtJbihwQWQpOworCit9CisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVRoaXMgcm91dGluZSBwcm9jZXNzIFJ4IElycCBhbmQgY2FsbCByeCBjb21wbGV0ZSBmdW5jdGlvbi4KKworCUFyZ3VtZW50czoKKwkJRGV2aWNlT2JqZWN0CVBvaW50ZXIgdG8gdGhlIGRldmljZSBvYmplY3QgZm9yIG5leHQgbG93ZXIKKwkJCQkJCWRldmljZS4gRGV2aWNlT2JqZWN0IHBhc3NlZCBpbiBoZXJlIGJlbG9uZ3MgdG8KKwkJCQkJCXRoZSBuZXh0IGxvd2VyIGRyaXZlciBpbiB0aGUgc3RhY2sgYmVjYXVzZSB3ZQorCQkJCQkJd2VyZSBpbnZva2VkIHZpYSBJb0NhbGxEcml2ZXIgaW4gVVNCX1J4UGFja2V0CisJCQkJCQlBTkQgaXQgaXMgbm90IE9VUiBkZXZpY2Ugb2JqZWN0CisJICBJcnAJCQkJUHRyIHRvIGNvbXBsZXRlZCBJUlAKKwkgIENvbnRleHQJCQlQdHIgdG8gb3VyIEFkYXB0ZXIgb2JqZWN0IChjb250ZXh0IHNwZWNpZmllZAorCQkJCQkJaW4gSW9TZXRDb21wbGV0aW9uUm91dGluZQorCisJUmV0dXJuIFZhbHVlOgorCQlBbHdheXMgcmV0dXJucyBTVEFUVVNfTU9SRV9QUk9DRVNTSU5HX1JFUVVJUkVECisKKwlOb3RlOgorCQlBbHdheXMgcmV0dXJucyBTVEFUVVNfTU9SRV9QUk9DRVNTSU5HX1JFUVVJUkVECisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBSVFVTQkJ1bGtSeENvbXBsZXRlKHB1cmJiX3QgcFVyYiwgc3RydWN0IHB0X3JlZ3MgKnB0X3JlZ3MpCit7CisJLy8gdXNlIGEgcmVjZWl2ZSB0YXNrbGV0IHRvIGhhbmRsZSByZWNlaXZlZCBwYWNrZXRzOworCS8vIG9yIHNvbWV0aW1lcyBoYXJkd2FyZSBJUlEgd2lsbCBiZSBkaXNhYmxlZCBoZXJlLCBzbyB3ZSBjYW4gbm90CisJLy8gdXNlIHNwaW5fbG9ja19iaCgpL3NwaW5fdW5sb2NrX2JoKCkgYWZ0ZXIgSVJRIGlzIGRpc2FibGVkLiA6PAorCVBSWF9DT05URVhUCQlwUnhDb250ZXh0OworCVBSVE1QX0FEQVBURVIJcEFkOworCVBPU19DT09LSUUgCQlwT2JqOworCisKKwlwUnhDb250ZXh0CT0gKFBSWF9DT05URVhUKXBVcmItPmNvbnRleHQ7CisJcEFkIAkJPSBwUnhDb250ZXh0LT5wQWQ7CisJcE9iaiAJCT0gKFBPU19DT09LSUUpIHBBZC0+T1NfQ29va2llOworCisJcE9iai0+cnhfZG9uZV90YXNrLmRhdGEgPSAodW5zaWduZWQgbG9uZylwVXJiOworCXRhc2tsZXRfaGlfc2NoZWR1bGUoJnBPYmotPnJ4X2RvbmVfdGFzayk7CisKK30KKworI2VuZGlmCisKKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKworCUFyZ3VtZW50czoKKworCVJldHVybiBWYWx1ZToKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECVJUVVNCS2lja0J1bGtPdXQoCisJSU4JUFJUTVBfQURBUFRFUiBwQWQpCit7CisJLy8gQnVsa0luIFJlc2V0IHdpbGwgcmVzZXQgd2hvbGUgVVNCIFBIWS4gU28gd2UgbmVlZCB0byBtYWtlIHN1cmUgZlJUTVBfQURBUFRFUl9CVUxLSU5fUkVTRVQgbm90IGZsYWdlZC4KKwlpZiAoIVJUTVBfVEVTVF9GTEFHKHBBZCAsZlJUTVBfQURBUFRFUl9ORUVEX1NUT1BfVFgpCisjaWZkZWYgUkFMSU5LX0FURQorCQkmJiAhKEFURV9PTihwQWQpKQorI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKwkJKQorCXsKKyNpZiAwCS8vIG5vdCB1c2VkIG5vdyBpbiBSVDI4eHgsIGJ1dCBtYXkgdXNlZCBsYXR0ZXIuCisJCS8vIDEuIERhdGEgRnJhZ21lbnQgaGFzIGhpZ2hlc3QgcHJpb3JpdHkKKwkJaWYgKFJUVVNCX1RFU1RfQlVMS19GTEFHKHBBZCwgZlJUVVNCX0JVTEtfT1VUX0RBVEFfRlJBRykpCisJCXsKKwkJCWlmICgoKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpKSB8fAorCQkJCSghT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpKQorCQkJCSkpCisJCQl7CisJCQkJUlRVU0JCdWxrT3V0RGF0YVBhY2tldChwQWQsIDAsIHBBZC0+TmV4dEJ1bGtPdXRJbmRleFswXSk7CisJCQl9CisJCX0KKwkJaWYgKFJUVVNCX1RFU1RfQlVMS19GTEFHKHBBZCwgZlJUVVNCX0JVTEtfT1VUX0RBVEFfRlJBR18yKSkKKwkJeworCQkJaWYgKCgoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUykpIHx8CisJCQkJKCFPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCkpCisJCQkJKSkKKwkJCXsKKwkJCQlSVFVTQkJ1bGtPdXREYXRhUGFja2V0KHBBZCwgMSwgcEFkLT5OZXh0QnVsa091dEluZGV4WzFdKTsKKwkJCX0KKwkJfQorCQlpZiAoUlRVU0JfVEVTVF9CVUxLX0ZMQUcocEFkLCBmUlRVU0JfQlVMS19PVVRfREFUQV9GUkFHXzMpKQorCQl7CisJCQlpZiAoKCghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKSkgfHwKKwkJCQkoIU9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSkKKwkJCQkpKQorCQkJeworCQkJCVJUVVNCQnVsa091dERhdGFQYWNrZXQocEFkLCAyLCBwQWQtPk5leHRCdWxrT3V0SW5kZXhbMl0pOworCQkJfQorCQl9CisJCWlmIChSVFVTQl9URVNUX0JVTEtfRkxBRyhwQWQsIGZSVFVTQl9CVUxLX09VVF9EQVRBX0ZSQUdfNCkpCisJCXsKKwkJCWlmICgoKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpKSB8fAorCQkJCSghT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpKQorCQkJCSkpCisJCQl7CisJCQkJUlRVU0JCdWxrT3V0RGF0YVBhY2tldChwQWQsIDMsIHBBZC0+TmV4dEJ1bGtPdXRJbmRleFszXSk7CisJCQl9CisJCX0KKyNlbmRpZgorCisJCS8vIDIuIFBTLVBvbGwgZnJhbWUgaXMgbmV4dAorCQlpZiAoUlRVU0JfVEVTVF9CVUxLX0ZMQUcocEFkLCBmUlRVU0JfQlVMS19PVVRfUFNQT0xMKSkKKwkJeworCQkJUlRVU0JCdWxrT3V0UHNQb2xsKHBBZCk7CisJCX0KKworCQkvLyA1LiBNbG1lIGZyYW1lIGlzIG5leHQKKwkJZWxzZSBpZiAoKFJUVVNCX1RFU1RfQlVMS19GTEFHKHBBZCwgZlJUVVNCX0JVTEtfT1VUX01MTUUpKSAmJgorCQkJCSAocEFkLT5NZ210UmluZy5UeFN3RnJlZUlkeCA8IE1HTVRfUklOR19TSVpFKSkKKwkJeworCQkJUlRVU0JCdWxrT3V0TUxNRVBhY2tldChwQWQsIHBBZC0+TWdtdFJpbmcuVHhEbWFJZHgpOworCQl9CisKKwkJLy8gNi4gRGF0YSBmcmFtZSBub3JtYWwgaXMgbmV4dAorCQlpZiAoUlRVU0JfVEVTVF9CVUxLX0ZMQUcocEFkLCBmUlRVU0JfQlVMS19PVVRfREFUQV9OT1JNQUwpKQorCQl7CisJCQlpZiAoKCghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKSkgfHwKKwkJCQkoIU9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSkKKwkJCQkpKQorCQkJeworCQkJCVJUVVNCQnVsa091dERhdGFQYWNrZXQocEFkLCAwLCBwQWQtPk5leHRCdWxrT3V0SW5kZXhbMF0pOworCQkJfQorCQl9CisJCWlmIChSVFVTQl9URVNUX0JVTEtfRkxBRyhwQWQsIGZSVFVTQl9CVUxLX09VVF9EQVRBX05PUk1BTF8yKSkKKwkJeworCQkJaWYgKCgoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUykpIHx8CisJCQkJKCFPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCkpCisJCQkJKSkKKwkJCXsKKwkJCQlSVFVTQkJ1bGtPdXREYXRhUGFja2V0KHBBZCwgMSwgcEFkLT5OZXh0QnVsa091dEluZGV4WzFdKTsKKwkJCX0KKwkJfQorCQlpZiAoUlRVU0JfVEVTVF9CVUxLX0ZMQUcocEFkLCBmUlRVU0JfQlVMS19PVVRfREFUQV9OT1JNQUxfMykpCisJCXsKKwkJCWlmICgoKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpKSB8fAorCQkJCSghT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpKQorCQkJCSkpCisJCQl7CisJCQkJUlRVU0JCdWxrT3V0RGF0YVBhY2tldChwQWQsIDIsIHBBZC0+TmV4dEJ1bGtPdXRJbmRleFsyXSk7CisJCQl9CisJCX0KKwkJaWYgKFJUVVNCX1RFU1RfQlVMS19GTEFHKHBBZCwgZlJUVVNCX0JVTEtfT1VUX0RBVEFfTk9STUFMXzQpKQorCQl7CisJCQlpZiAoKCghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKSkgfHwKKwkJCQkoIU9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSkKKwkJCQkpKQorCQkJeworCQkJCVJUVVNCQnVsa091dERhdGFQYWNrZXQocEFkLCAzLCBwQWQtPk5leHRCdWxrT3V0SW5kZXhbM10pOworCQkJfQorCQl9CisKKwkJLy8gNy4gTnVsbCBmcmFtZSBpcyB0aGUgbGFzdAorCQllbHNlIGlmIChSVFVTQl9URVNUX0JVTEtfRkxBRyhwQWQsIGZSVFVTQl9CVUxLX09VVF9EQVRBX05VTEwpKQorCQl7CisJCQlpZiAoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUykpCisJCQl7CisJCQkJUlRVU0JCdWxrT3V0TnVsbEZyYW1lKHBBZCk7CisJCQl9CisJCX0KKworCQkvLyA4LiBObyBkYXRhIGF2YWxpYWJsZQorCQllbHNlCisJCXsKKworCQl9CisJfQorI2lmZGVmIFJBTElOS19BVEUKKwkvKiBJZiB0aGUgbW9kZSBpcyBpbiBBVEUgbW9kZS4gKi8KKwllbHNlIGlmKChBVEVfT04ocEFkKSkgJiYKKwkJIVJUTVBfVEVTVF9GTEFHKHBBZCAsZlJUTVBfQURBUFRFUl9ORUVEX1NUT1BfVFgpKS8vIFBFVEVSIDogd2F0Y2ggb3V0ICEKKwl7CisJCWlmIChSVFVTQl9URVNUX0JVTEtfRkxBRyhwQWQsIGZSVFVTQl9CVUxLX09VVF9EQVRBX0FURSkpCisJCXsKKwkJCUFURV9SVFVTQkJ1bGtPdXREYXRhUGFja2V0KHBBZCwgMCk7CisJCX0KKwl9CisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCUNhbGwgZnJvbSBSZXNldCBhY3Rpb24gYWZ0ZXIgQnVsa091dCBmYWlsZWQuCisJQXJndW1lbnRzOgorCisJUmV0dXJuIFZhbHVlOgorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJUlRVU0JDbGVhblVwRGF0YUJ1bGtPdXRRdWV1ZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCkKK3sKKwlVQ0hBUgkJCUlkeDsKKwlQSFRfVFhfQ09OVEVYVAlwVHhDb250ZXh0OworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0tPkNsZWFuVXBEYXRhQnVsa091dFF1ZXVlXG4iKSk7CisKKwlmb3IgKElkeCA9IDA7IElkeCA8IDQ7IElkeCsrKQorCXsKKwkJcFR4Q29udGV4dCA9ICZwQWQtPlR4Q29udGV4dFtJZHhdOworCisJCXBUeENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gPSBwVHhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uOworCQlwVHhDb250ZXh0LT5MYXN0T25lID0gRkFMU0U7CisJCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+QnVsa091dExvY2tbSWR4XSk7CisJCXBBZC0+QnVsa091dFBlbmRpbmdbSWR4XSA9IEZBTFNFOworCQlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPkJ1bGtPdXRMb2NrW0lkeF0pOworCX0KKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjwtLS1DbGVhblVwRGF0YUJ1bGtPdXRRdWV1ZVxuIikpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKworCUFyZ3VtZW50czoKKworCVJldHVybiBWYWx1ZToKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECVJUVVNCQ2xlYW5VcE1MTUVCdWxrT3V0UXVldWUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQpCit7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0tPkNsZWFuVXBNTE1FQnVsa091dFF1ZXVlXG4iKSk7CisKKyNpZiAwCS8vIERvIG5vdGhpbmchCisJTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5NTE1FQnVsa091dExvY2spOworCXdoaWxlIChwQWQtPlByaW9SaW5nVHhDbnQgPiAwKQorCXsKKwkJcEFkLT5NTE1FQ29udGV4dFtwQWQtPlByaW9SaW5nRmlyc3RJbmRleF0uSW5Vc2UgPSBGQUxTRTsKKworCQlwQWQtPlByaW9SaW5nRmlyc3RJbmRleCsrOworCQlpZiAocEFkLT5QcmlvUmluZ0ZpcnN0SW5kZXggPj0gTUdNVF9SSU5HX1NJWkUpCisJCXsKKwkJCXBBZC0+UHJpb1JpbmdGaXJzdEluZGV4ID0gMDsKKwkJfQorCisJCXBBZC0+UHJpb1JpbmdUeENudC0tOworCX0KKwlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPk1MTUVCdWxrT3V0TG9jayk7CisjZW5kaWYKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjwtLS1DbGVhblVwTUxNRUJ1bGtPdXRRdWV1ZVxuIikpOworfQorCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCisJQXJndW1lbnRzOgorCisJUmV0dXJuIFZhbHVlOgorCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlSVFVTQkNhbmNlbFBlbmRpbmdJUlBzKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKQoreworCVJUVVNCQ2FuY2VsUGVuZGluZ0J1bGtJbklSUChwQWQpOworCVJUVVNCQ2FuY2VsUGVuZGluZ0J1bGtPdXRJUlAocEFkKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisKKwlBcmd1bWVudHM6CisKKwlSZXR1cm4gVmFsdWU6CisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlSVFVTQkNhbmNlbFBlbmRpbmdCdWxrSW5JUlAoCisJSU4JUFJUTVBfQURBUFRFUglwQWQpCit7CisJUFJYX0NPTlRFWFQJCXBSeENvbnRleHQ7CisJVUlOVAkJCWk7CisKKwlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiLS0tPlJUVVNCQ2FuY2VsUGVuZGluZ0J1bGtJbklSUFxuIikpOworCWZvciAoIGkgPSAwOyBpIDwgKFJYX1JJTkdfU0laRSk7IGkrKykKKwl7CisJCXBSeENvbnRleHQgPSAmKHBBZC0+UnhDb250ZXh0W2ldKTsKKwkJaWYocFJ4Q29udGV4dC0+SVJQUGVuZGluZyA9PSBUUlVFKQorCQl7CisJCQlSVFVTQl9VTkxJTktfVVJCKHBSeENvbnRleHQtPnBVcmIpOworCQkJcFJ4Q29udGV4dC0+SVJQUGVuZGluZyA9IEZBTFNFOworCQkJcFJ4Q29udGV4dC0+SW5Vc2UgPSBGQUxTRTsKKwkJCS8vTmRpc0ludGVybG9ja2VkRGVjcmVtZW50KCZwQWQtPlBlbmRpbmdSeCk7CisJCQkvL3BBZC0+UGVuZGluZ1J4LS07CisJCX0KKwl9CisJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIjwtLS1SVFVTQkNhbmNlbFBlbmRpbmdCdWxrSW5JUlBcbiIpKTsKK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKworCUFyZ3VtZW50czoKKworCVJldHVybiBWYWx1ZToKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECVJUVVNCQ2FuY2VsUGVuZGluZ0J1bGtPdXRJUlAoCisJSU4JUFJUTVBfQURBUFRFUglwQWQpCit7CisJUEhUX1RYX0NPTlRFWFQJCXBIVFRYQ29udGV4dDsKKwlQVFhfQ09OVEVYVAkJCXBNTE1FQ29udGV4dDsKKwlQVFhfQ09OVEVYVAkJCXBCZWFjb25Db250ZXh0OworCVBUWF9DT05URVhUCQkJcE51bGxDb250ZXh0OworCVBUWF9DT05URVhUCQkJcFBzUG9sbENvbnRleHQ7CisJUFRYX0NPTlRFWFQJCQlwUlRTQ29udGV4dDsKKwlVSU5UCQkJCWksIElkeDsKKy8vCXVuc2lnbmVkIGludCAJCUlycUZsYWdzOworLy8JTkRJU19TUElOX0xPQ0sJCSpwTG9jazsKKy8vCUJPT0xFQU4JCQkJKnBQZW5kaW5nOworCisKKy8vCXBMb2NrID0gJnBBZC0+QnVsa091dExvY2tbTUdNVFBJUEVJRFhdOworLy8JcFBlbmRpbmcgPSAmcEFkLT5CdWxrT3V0UGVuZGluZ1tNR01UUElQRUlEWF07CisKKwlmb3IgKElkeCA9IDA7IElkeCA8IDQ7IElkeCsrKQorCXsKKwkJcEhUVFhDb250ZXh0ID0gJihwQWQtPlR4Q29udGV4dFtJZHhdKTsKKworCQlpZiAocEhUVFhDb250ZXh0LT5JUlBQZW5kaW5nID09IFRSVUUpCisJCXsKKworCQkJLy8gR2V0IHRoZSBVU0JfQ09OVEVYVCBhbmQgY2FuY2VsIGl0J3MgSVJQOyB0aGUgY29tcGxldGlvbiByb3V0aW5lIHdpbGwgaXRzZWxmCisJCQkvLyByZW1vdmUgaXQgZnJvbSB0aGUgSGVhZFBlbmRpbmdTZW5kTGlzdCBhbmQgTlVMTCBvdXQgSGVhZFBlbmRpbmdTZW5kTGlzdAorCQkJLy8Jd2hlbiB0aGUgbGFzdCBJUlAgb24gdGhlIGxpc3QgaGFzIGJlZW4JY2FuY2VsbGVkOyB0aGF0J3MgaG93IHdlIGV4aXQgdGhpcyBsb29wCisJCQkvLworCisJCQlSVFVTQl9VTkxJTktfVVJCKHBIVFRYQ29udGV4dC0+cFVyYik7CisKKwkJCS8vIFNsZWVwIDIwMCBtaWNyb3NlY29uZHMgdG8gZ2l2ZSBjYW5jZWxsYXRpb24gdGltZSB0byB3b3JrCisJCQlSVE1QdXNlY0RlbGF5KDIwMCk7CisJCX0KKworI2lmZGVmIFJBTElOS19BVEUKKwkJcEhUVFhDb250ZXh0LT5iQ29weVNhdmVQYWQgPSAwOworCQlwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gPSAwOworCQlwSFRUWENvbnRleHQtPkN1cldyaXRlUmVhbFBvcyA9IDA7CisJCXBIVFRYQ29udGV4dC0+YkN1cldyaXRpbmcgPSBGQUxTRTsKKwkJcEhUVFhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uID0gMDsKKwkJcEhUVFhDb250ZXh0LT5FTmV4dEJ1bGtPdXRQb3NpdGlvbiA9IDA7CisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCQlwQWQtPkJ1bGtPdXRQZW5kaW5nW0lkeF0gPSBGQUxTRTsKKwl9CisKKwkvL1JUTVBfSVJRX0xPQ0socExvY2ssIElycUZsYWdzKTsKKwlmb3IgKGkgPSAwOyBpIDwgTUdNVF9SSU5HX1NJWkU7IGkrKykKKwl7CisJCXBNTE1FQ29udGV4dCA9IChQVFhfQ09OVEVYVClwQWQtPk1nbXRSaW5nLkNlbGxbaV0uQWxsb2NWYTsKKwkJaWYocE1MTUVDb250ZXh0ICYmIChwTUxNRUNvbnRleHQtPklSUFBlbmRpbmcgPT0gVFJVRSkpCisJCXsKKworCQkJLy8gR2V0IHRoZSBVU0JfQ09OVEVYVCBhbmQgY2FuY2VsIGl0J3MgSVJQOyB0aGUgY29tcGxldGlvbiByb3V0aW5lIHdpbGwgaXRzZWxmCisJCQkvLyByZW1vdmUgaXQgZnJvbSB0aGUgSGVhZFBlbmRpbmdTZW5kTGlzdCBhbmQgTlVMTCBvdXQgSGVhZFBlbmRpbmdTZW5kTGlzdAorCQkJLy8Jd2hlbiB0aGUgbGFzdCBJUlAgb24gdGhlIGxpc3QgaGFzIGJlZW4JY2FuY2VsbGVkOyB0aGF0J3MgaG93IHdlIGV4aXQgdGhpcyBsb29wCisJCQkvLworCisJCQlSVFVTQl9VTkxJTktfVVJCKHBNTE1FQ29udGV4dC0+cFVyYik7CisJCQlwTUxNRUNvbnRleHQtPklSUFBlbmRpbmcgPSBGQUxTRTsKKworCQkJLy8gU2xlZXAgMjAwIG1pY3Jvc2VjcyB0byBnaXZlIGNhbmNlbGxhdGlvbiB0aW1lIHRvIHdvcmsKKwkJCVJUTVB1c2VjRGVsYXkoMjAwKTsKKwkJfQorCX0KKwlwQWQtPkJ1bGtPdXRQZW5kaW5nW01HTVRQSVBFSURYXSA9IEZBTFNFOworCS8vUlRNUF9JUlFfVU5MT0NLKHBMb2NrLCBJcnFGbGFncyk7CisKKworCWZvciAoaSA9IDA7IGkgPCBCRUFDT05fUklOR19TSVpFOyBpKyspCisJeworCQlwQmVhY29uQ29udGV4dCA9ICYocEFkLT5CZWFjb25Db250ZXh0W2ldKTsKKworCQlpZihwQmVhY29uQ29udGV4dC0+SVJQUGVuZGluZyA9PSBUUlVFKQorCQl7CisKKwkJCS8vIEdldCB0aGUgVVNCX0NPTlRFWFQgYW5kIGNhbmNlbCBpdCdzIElSUDsgdGhlIGNvbXBsZXRpb24gcm91dGluZSB3aWxsIGl0c2VsZgorCQkJLy8gcmVtb3ZlIGl0IGZyb20gdGhlIEhlYWRQZW5kaW5nU2VuZExpc3QgYW5kIE5VTEwgb3V0IEhlYWRQZW5kaW5nU2VuZExpc3QKKwkJCS8vCXdoZW4gdGhlIGxhc3QgSVJQIG9uIHRoZSBsaXN0IGhhcyBiZWVuCWNhbmNlbGxlZDsgdGhhdCdzIGhvdyB3ZSBleGl0IHRoaXMgbG9vcAorCQkJLy8KKworCQkJUlRVU0JfVU5MSU5LX1VSQihwQmVhY29uQ29udGV4dC0+cFVyYik7CisKKwkJCS8vIFNsZWVwIDIwMCBtaWNyb3NlY3MgdG8gZ2l2ZSBjYW5jZWxsYXRpb24gdGltZSB0byB3b3JrCisJCQlSVE1QdXNlY0RlbGF5KDIwMCk7CisJCX0KKwl9CisKKwlwTnVsbENvbnRleHQgPSAmKHBBZC0+TnVsbENvbnRleHQpOworCWlmIChwTnVsbENvbnRleHQtPklSUFBlbmRpbmcgPT0gVFJVRSkKKwkJUlRVU0JfVU5MSU5LX1VSQihwTnVsbENvbnRleHQtPnBVcmIpOworCisJcFJUU0NvbnRleHQgPSAmKHBBZC0+UlRTQ29udGV4dCk7CisJaWYgKHBSVFNDb250ZXh0LT5JUlBQZW5kaW5nID09IFRSVUUpCisJCVJUVVNCX1VOTElOS19VUkIocFJUU0NvbnRleHQtPnBVcmIpOworCisJcFBzUG9sbENvbnRleHQgPSAmKHBBZC0+UHNQb2xsQ29udGV4dCk7CisJaWYgKHBQc1BvbGxDb250ZXh0LT5JUlBQZW5kaW5nID09IFRSVUUpCisJCVJUVVNCX1VOTElOS19VUkIocFBzUG9sbENvbnRleHQtPnBVcmIpOworCisJZm9yIChJZHggPSAwOyBJZHggPCA0OyBJZHgrKykKKwl7CisJCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+QnVsa091dExvY2tbSWR4XSk7CisJCXBBZC0+QnVsa091dFBlbmRpbmdbSWR4XSA9IEZBTFNFOworCQlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPkJ1bGtPdXRMb2NrW0lkeF0pOworCX0KK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vcnR1c2JfZGF0YS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vcnR1c2JfZGF0YS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhMGQ3ODMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9ydHVzYl9kYXRhLmMKQEAgLTAsMCArMSwyMjkgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJTW9kdWxlIE5hbWU6CisJcnR1c2JfZGF0YS5jCisKKwlBYnN0cmFjdDoKKwlSYWxpbmsgVVNCIGRyaXZlciBUeC9SeCBmdW5jdGlvbnMuCisKKwlSZXZpc2lvbiBIaXN0b3J5OgorCVdobyAgICAgICAgIFdoZW4gICAgICAgICAgV2hhdAorCS0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCUphbiAgICAgICAgICAgIDAzLTI1LTIwMDYgICAgY3JlYXRlZAorCisqLworI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgorCitleHRlcm4gIFVDSEFSIFBoeTExQkdOZXh0UmF0ZVVwd2FyZFtdOyAvLyBkZWZpbmVkIGluIG1sbWUuYworZXh0ZXJuIFVDSEFSCUVwVG9RdWV1ZVtdOworCitWT0lEIFJFUE9SVF9BTVNEVV9GUkFNRVNfVE9fTExDKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCXBEYXRhLAorCUlOCVVMT05HCQkJRGF0YVNpemUpCit7CisJUE5ESVNfUEFDS0VUCXBQYWNrZXQ7CisJVUlOVAkJCW5NU0RVOworCXN0cnVjdAkJCXNrX2J1ZmYgKnBTa2I7CisKKwluTVNEVSA9IDA7CisJLyogYWxsb2NhdGUgYSByeCBwYWNrZXQgKi8KKwlwU2tiID0gZGV2X2FsbG9jX3NrYihSWF9CVUZGRVJfQUdHUkVTSVpFKTsKKwlwUGFja2V0ID0gKFBORElTX1BBQ0tFVClPU1BLVF9UT19SVFBLVChwU2tiKTsKKwlpZiAocFNrYikKKwl7CisKKwkJLyogY29udmVydCA4MDIuMTEgdG8gODAyLjMgcGFja2V0ICovCisJCXBTa2ItPmRldiA9IGdldF9uZXRkZXZfZnJvbV9ic3NpZChwQWQsIEJTUzApOworCQlSVE1QX1NFVF9QQUNLRVRfU09VUkNFKHBQYWNrZXQsIFBLVFNSQ19ORElTKTsKKwkJZGVhZ2dyZWdhdGVfQU1TRFVfYW5ub3VuY2UocEFkLCBwUGFja2V0LCBwRGF0YSwgRGF0YVNpemUpOworCX0KKwllbHNlCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIkNhbid0IGFsbG9jYXRlIHNrYlxuIikpOworCX0KK30KKworTkRJU19TVEFUVVMJUlRVU0JGcmVlRGVzY3JpcHRvclJlcXVlc3QoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVUNIQVIJCQlCdWxrT3V0UGlwZUlkLAorCUlOCVVJTlQzMgkJCU51bWJlclJlcXVpcmVkKQoreworLy8JVUNIQVIJCQlGcmVlTnVtYmVyID0gMDsKKy8vCVVJTlQJCQlJbmRleDsKKwlORElTX1NUQVRVUwkJU3RhdHVzID0gTkRJU19TVEFUVVNfRkFJTFVSRTsKKwl1bnNpZ25lZCBsb25nICAgSXJxRmxhZ3M7CisJSFRfVFhfQ09OVEVYVAkqcEhUVFhDb250ZXh0OworCisKKwlwSFRUWENvbnRleHQgPSAmcEFkLT5UeENvbnRleHRbQnVsa091dFBpcGVJZF07CisJUlRNUF9JUlFfTE9DSygmcEFkLT5UeENvbnRleHRRdWV1ZUxvY2tbQnVsa091dFBpcGVJZF0sIElycUZsYWdzKTsKKwlpZiAoKHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiA8IHBIVFRYQ29udGV4dC0+TmV4dEJ1bGtPdXRQb3NpdGlvbikgJiYgKChwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gKyBOdW1iZXJSZXF1aXJlZCArIExPQ0FMX1RYQlVGX1NJWkUpID4gcEhUVFhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uKSkKKwl7CisKKwkJUlRVU0JfU0VUX0JVTEtfRkxBRyhwQWQsIChmUlRVU0JfQlVMS19PVVRfREFUQV9OT1JNQUwgPDwgQnVsa091dFBpcGVJZCkpOworCX0KKwllbHNlIGlmICgocEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uID09IDgpICYmIChwSFRUWENvbnRleHQtPk5leHRCdWxrT3V0UG9zaXRpb24gPCAoTnVtYmVyUmVxdWlyZWQgKyBMT0NBTF9UWEJVRl9TSVpFKSkpCisJeworCQlSVFVTQl9TRVRfQlVMS19GTEFHKHBBZCwgKGZSVFVTQl9CVUxLX09VVF9EQVRBX05PUk1BTCA8PCBCdWxrT3V0UGlwZUlkKSk7CisJfQorCWVsc2UgaWYgKHBIVFRYQ29udGV4dC0+YkN1cldyaXRpbmcgPT0gVFJVRSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUlRVU0JGcmVlRCBjMyAtLT4gUXVlSWR4PSVkLCBDV1Bvcz0lbGQsIE5CT3V0UG9zPSVsZCFcbiIsIEJ1bGtPdXRQaXBlSWQsIHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiwgcEhUVFhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uKSk7CisJCVJUVVNCX1NFVF9CVUxLX0ZMQUcocEFkLCAoZlJUVVNCX0JVTEtfT1VUX0RBVEFfTk9STUFMIDw8IEJ1bGtPdXRQaXBlSWQpKTsKKwl9CisJZWxzZQorCXsKKwkJU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKwl9CisJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPlR4Q29udGV4dFF1ZXVlTG9ja1tCdWxrT3V0UGlwZUlkXSwgSXJxRmxhZ3MpOworCisKKwlyZXR1cm4gKFN0YXR1cyk7Cit9CisKK05ESVNfU1RBVFVTIFJUVVNCRnJlZURlc2NyaXB0b3JSZWxlYXNlKAorCUlOIFJUTVBfQURBUFRFUiAqcEFkLAorCUlOIFVDSEFSCQlCdWxrT3V0UGlwZUlkKQoreworCXVuc2lnbmVkIGxvbmcgICBJcnFGbGFnczsKKwlIVF9UWF9DT05URVhUCSpwSFRUWENvbnRleHQ7CisKKwlwSFRUWENvbnRleHQgPSAmcEFkLT5UeENvbnRleHRbQnVsa091dFBpcGVJZF07CisJUlRNUF9JUlFfTE9DSygmcEFkLT5UeENvbnRleHRRdWV1ZUxvY2tbQnVsa091dFBpcGVJZF0sIElycUZsYWdzKTsKKwlwSFRUWENvbnRleHQtPmJDdXJXcml0aW5nID0gRkFMU0U7CisJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPlR4Q29udGV4dFF1ZXVlTG9ja1tCdWxrT3V0UGlwZUlkXSwgSXJxRmxhZ3MpOworCisJcmV0dXJuIChORElTX1NUQVRVU19TVUNDRVNTKTsKK30KKworCitCT09MRUFOCVJUVVNCTmVlZFF1ZXVlQmFja0ZvckFnZygKKwlJTiBSVE1QX0FEQVBURVIgKnBBZCwKKwlJTiBVQ0hBUgkJQnVsa091dFBpcGVJZCkKK3sKKwl1bnNpZ25lZCBsb25nICAgSXJxRmxhZ3M7CisJSFRfVFhfQ09OVEVYVAkqcEhUVFhDb250ZXh0OworCUJPT0xFQU4JCQluZWVkUXVlQmFjayA9IEZBTFNFOworCisJcEhUVFhDb250ZXh0ID0gJnBBZC0+VHhDb250ZXh0W0J1bGtPdXRQaXBlSWRdOworCisJUlRNUF9JUlFfTE9DSygmcEFkLT5UeENvbnRleHRRdWV1ZUxvY2tbQnVsa091dFBpcGVJZF0sIElycUZsYWdzKTsKKwlpZiAoKHBIVFRYQ29udGV4dC0+SVJQUGVuZGluZyA9PSBUUlVFKSAgLyomJiAocEFkLT5UeFN3UXVldWVbQnVsa091dFBpcGVJZF0uTnVtYmVyID09IDApICovKQorCXsKKyNpZiAwCisJCWlmICgocEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uIDw9IDgpICYmCisJCQkocEhUVFhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uID4gOCAmJiAocEhUVFhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uK01BWF9BR0dSRUdBVElPTl9TSVpFKSA8IE1BWF9UWEJVTEtfTElNSVQpKQorCQl7CisJCQluZWVkUXVlQmFjayA9IFRSVUU7CisJCX0KKwkJZWxzZSBpZiAoKHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiA8IHBIVFRYQ29udGV4dC0+TmV4dEJ1bGtPdXRQb3NpdGlvbikgJiYKKwkJCQkgKChwSFRUWENvbnRleHQtPk5leHRCdWxrT3V0UG9zaXRpb24gKyBNQVhfQUdHUkVHQVRJT05fU0laRSkgPCBNQVhfVFhCVUxLX0xJTUlUKSkKKwkJeworCQkJbmVlZFF1ZUJhY2sgPSBUUlVFOworCQl9CisjZWxzZQorCQlpZiAoKHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiA8IHBIVFRYQ29udGV4dC0+RU5leHRCdWxrT3V0UG9zaXRpb24pICYmCisJCQkoKChwSFRUWENvbnRleHQtPkVOZXh0QnVsa091dFBvc2l0aW9uK01BWF9BR0dSRUdBVElPTl9TSVpFKSA8IE1BWF9UWEJVTEtfTElNSVQpIHx8IChwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gPiBNQVhfQUdHUkVHQVRJT05fU0laRSkpKQorCQl7CisJCQluZWVkUXVlQmFjayA9IFRSVUU7CisJCX0KKyNlbmRpZgorCQllbHNlIGlmICgocEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uID4gcEhUVFhDb250ZXh0LT5FTmV4dEJ1bGtPdXRQb3NpdGlvbikgJiYKKwkJCQkgKChwSFRUWENvbnRleHQtPkVOZXh0QnVsa091dFBvc2l0aW9uICsgTUFYX0FHR1JFR0FUSU9OX1NJWkUpIDwgcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uKSkKKwkJeworCQkJbmVlZFF1ZUJhY2sgPSBUUlVFOworCQl9CisJfQorCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5UeENvbnRleHRRdWV1ZUxvY2tbQnVsa091dFBpcGVJZF0sIElycUZsYWdzKTsKKworCXJldHVybiBuZWVkUXVlQmFjazsKKworfQorCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCisJQXJndW1lbnRzOgorCisJUmV0dXJuIFZhbHVlOgorCisJSVJRTCA9CisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlSVFVTQlJlamVjdFBlbmRpbmdQYWNrZXRzKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKQoreworCVVDSEFSCQkJSW5kZXg7CisJUFFVRVVFX0VOVFJZCXBFbnRyeTsKKwlQTkRJU19QQUNLRVQJcFBhY2tldDsKKwlQUVVFVUVfSEVBREVSCXBRdWV1ZTsKKworCisJZm9yIChJbmRleCA9IDA7IEluZGV4IDwgNDsgSW5kZXgrKykKKwl7CisJCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+VHhTd1F1ZXVlTG9ja1tJbmRleF0pOworCQl3aGlsZSAocEFkLT5UeFN3UXVldWVbSW5kZXhdLkhlYWQgIT0gTlVMTCkKKwkJeworCQkJcFF1ZXVlID0gKFBRVUVVRV9IRUFERVIpICYocEFkLT5UeFN3UXVldWVbSW5kZXhdKTsKKwkJCXBFbnRyeSA9IFJlbW92ZUhlYWRRdWV1ZShwUXVldWUpOworCQkJcFBhY2tldCA9IFFVRVVFX0VOVFJZX1RPX1BBQ0tFVChwRW50cnkpOworCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCQl9CisJCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+VHhTd1F1ZXVlTG9ja1tJbmRleF0pOworCisJfQorCit9CisKK1ZPSUQgUlRNUFdyaXRlVHhJbmZvKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBUWElORk9fU1RSVUMgCXBUeEluZm8sCisJSU4JICBVU0hPUlQJCVVTQkRNQXBrdExlbiwKKwlJTgkgIEJPT0xFQU4JCWJXaXYsCisJSU4JICBVQ0hBUgkJCVF1ZXVlU2VsLAorCUlOCSAgVUNIQVIJCQlOZXh0VmFsaWQsCisJSU4JICBVQ0hBUgkJCVR4QnVyc3QpCit7CisJcFR4SW5mby0+VVNCRE1BVHhQa3RMZW4gPSBVU0JETUFwa3RMZW47CisJcFR4SW5mby0+UVNFTCA9IFF1ZXVlU2VsOworCWlmIChRdWV1ZVNlbCAhPSBGSUZPX0VEQ0EpCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT0+IFF1ZXVlU2VsICE9IEZJRk9fRURDQTw9PT09PT09PT09PT1cbiIpKTsKKwlwVHhJbmZvLT5VU0JETUFOZXh0VkxEID0gRkFMU0U7IC8vTmV4dFZhbGlkOyAgLy8gTmVlZCB0byBjaGVjayB3aXRoIEphbiBhYm91dCB0aGlzLgorCXBUeEluZm8tPlVTQkRNQVR4YnVyc3QgPSBUeEJ1cnN0OworCXBUeEluZm8tPldJViA9IGJXaXY7CisJcFR4SW5mby0+U3dVc2VMYXN0Um91bmQgPSAwOworCXBUeEluZm8tPnJzdiA9IDA7CisJcFR4SW5mby0+cnN2MiA9IDA7Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL3J0dXNiX2lvLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9ydHVzYl9pby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkYjQ0M2UKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9ydHVzYl9pby5jCkBAIC0wLDAgKzEsMjAwNiBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAJTW9kdWxlIE5hbWU6CisJcnR1c2JfaW8uYworCisJQWJzdHJhY3Q6CisKKwlSZXZpc2lvbiBIaXN0b3J5OgorCVdobwkJCVdoZW4JICAgIFdoYXQKKwktLS0tLS0tLQktLS0tLS0tLS0tICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJTmFtZQkJRGF0ZQkgICAgTW9kaWZpY2F0aW9uIGxvZ3MKKwlQYXVsIExpbiAgICAwNi0yNS0yMDA0ICBjcmVhdGVkCisqLworCisjaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246IE5JQyBpbml0aWFsaXphdGlvbiBjb21wbGV0ZQorCisJQXJndW1lbnRzOgorCisJUmV0dXJuIFZhbHVlOgorCisJSVJRTCA9CisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworCitOVFNUQVRVUwlSVFVTQkZpcm13YXJlUnVuKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKQoreworCU5UU1RBVFVTCVN0YXR1czsKKworCVN0YXR1cyA9IFJUVVNCX1ZlbmRvclJlcXVlc3QoCisJCXBBZCwKKwkJVVNCRF9UUkFOU0ZFUl9ESVJFQ1RJT05fT1VULAorCQlERVZJQ0VfVkVORE9SX1JFUVVFU1RfT1VULAorCQkweDAxLAorCQkweDgsCisJCTAsCisJCU5VTEwsCisJCTApOworCisJcmV0dXJuIFN0YXR1czsKK30KKworCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOiBXcml0ZSBGaXJtd2FyZSB0byBOSUMuCisKKwlBcmd1bWVudHM6CisKKwlSZXR1cm4gVmFsdWU6CisKKwlJUlFMID0KKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitOVFNUQVRVUyBSVFVTQkZpcm13YXJlV3JpdGUoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gUFVDSEFSCQlwRndJbWFnZSwKKwlJTiBVTE9ORwkJRndMZW4pCit7CisJVUlOVDMyCQlNYWNSZWc7CisJTlRTVEFUVVMgCVN0YXR1czsKKy8vCVVMT05HIAkJaTsKKwlVU0hPUlQJCXdyaXRlTGVuOworCisJU3RhdHVzID0gUlRVU0JSZWFkTUFDUmVnaXN0ZXIocEFkLCBNQUNfQ1NSMCwgJk1hY1JlZyk7CisKKworCXdyaXRlTGVuID0gRndMZW47CisJUlRVU0JNdWx0aVdyaXRlKHBBZCwgRklSTVdBUkVfSU1BR0VfQkFTRSwgcEZ3SW1hZ2UsIHdyaXRlTGVuKTsKKworCVN0YXR1cyA9IFJUVVNCV3JpdGVNQUNSZWdpc3RlcihwQWQsIDB4NzAxNCwgMHhmZmZmZmZmZik7CisJU3RhdHVzID0gUlRVU0JXcml0ZU1BQ1JlZ2lzdGVyKHBBZCwgMHg3MDFjLCAweGZmZmZmZmZmKTsKKwlTdGF0dXMgPSBSVFVTQkZpcm13YXJlUnVuKHBBZCk7CisKKwlyZXR1cm4gU3RhdHVzOworfQorCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOiBHZXQgY3VycmVudCBmaXJtd2FyZSBvcGVyYXRpb24gbW9kZSAoUmV0dXJuIFZhbHVlKQorCisJQXJndW1lbnRzOgorCisJUmV0dXJuIFZhbHVlOgorCQkwIG9yIDEgPSBEb3dubG9hZGVkIGJ5IGhvc3QgZHJpdmVyCisJCW90aGVycyA9IERyaXZlciBkb2Vzbid0IGRvd25sb2FkIGZpcm13YXJlCisKKwlJUlFMID0KKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitOVFNUQVRVUwlSVFVTQkZpcm13YXJlT3Btb2RlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUlOVDMyCQkJcFZhbHVlKQoreworCU5UU1RBVFVTCVN0YXR1czsKKworCVN0YXR1cyA9IFJUVVNCX1ZlbmRvclJlcXVlc3QoCisJCXBBZCwKKwkJKFVTQkRfVFJBTlNGRVJfRElSRUNUSU9OX0lOIHwgVVNCRF9TSE9SVF9UUkFOU0ZFUl9PSyksCisJCURFVklDRV9WRU5ET1JfUkVRVUVTVF9JTiwKKwkJMHgxLAorCQkweDExLAorCQkwLAorCQlwVmFsdWUsCisJCTQpOworCXJldHVybiBTdGF0dXM7Cit9CitOVFNUQVRVUwlSVFVTQlZlbmRlclJlc2V0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKQoreworCU5UU1RBVFVTCVN0YXR1czsKKwlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgiLS0+UlRVU0JWZW5kZXJSZXNldFxuIikpOworCVN0YXR1cyA9IFJUVVNCX1ZlbmRvclJlcXVlc3QoCisJCXBBZCwKKwkJVVNCRF9UUkFOU0ZFUl9ESVJFQ1RJT05fT1VULAorCQlERVZJQ0VfVkVORE9SX1JFUVVFU1RfT1VULAorCQkweDAxLAorCQkweDEsCisJCTAsCisJCU5VTEwsCisJCTApOworCisJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCAoIjwtLVJUVVNCVmVuZGVyUmVzZXRcbiIpKTsKKwlyZXR1cm4gU3RhdHVzOworfQorLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246IFJlYWQgdmFyaW91cyBsZW5ndGggZGF0YSBmcm9tIFJUMjU3MworCisJQXJndW1lbnRzOgorCisJUmV0dXJuIFZhbHVlOgorCisJSVJRTCA9CisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworTlRTVEFUVVMJUlRVU0JNdWx0aVJlYWQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVVNIT1JUCQkJT2Zmc2V0LAorCU9VVAlQVUNIQVIJCQlwRGF0YSwKKwlJTglVU0hPUlQJCQlsZW5ndGgpCit7CisJTlRTVEFUVVMJU3RhdHVzOworCisJU3RhdHVzID0gUlRVU0JfVmVuZG9yUmVxdWVzdCgKKwkJcEFkLAorCQkoVVNCRF9UUkFOU0ZFUl9ESVJFQ1RJT05fSU4gfCBVU0JEX1NIT1JUX1RSQU5TRkVSX09LKSwKKwkJREVWSUNFX1ZFTkRPUl9SRVFVRVNUX0lOLAorCQkweDcsCisJCTAsCisJCU9mZnNldCwKKwkJcERhdGEsCisJCWxlbmd0aCk7CisKKwlyZXR1cm4gU3RhdHVzOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjogV3JpdGUgdmFyaW91cyBsZW5ndGggZGF0YSB0byBSVDI1NzMKKworCUFyZ3VtZW50czoKKworCVJldHVybiBWYWx1ZToKKworCUlSUUwgPQorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK05UU1RBVFVTCVJUVVNCTXVsdGlXcml0ZV9PbmVCeXRlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVTSE9SVAkJCU9mZnNldCwKKwlJTglQVUNIQVIJCQlwRGF0YSkKK3sKKwlOVFNUQVRVUwlTdGF0dXM7CisKKwkvLyBUT0RPOiBJbiAyODcwLCB1c2UgdGhpcyBmdW5jaXRvbiBjYXJlZnVsbHkgY2F1c2UgaXQncyBub3Qgc3RhYmxlLgorCVN0YXR1cyA9IFJUVVNCX1ZlbmRvclJlcXVlc3QoCisJCXBBZCwKKwkJVVNCRF9UUkFOU0ZFUl9ESVJFQ1RJT05fT1VULAorCQlERVZJQ0VfVkVORE9SX1JFUVVFU1RfT1VULAorCQkweDYsCisJCTAsCisJCU9mZnNldCwKKwkJcERhdGEsCisJCTEpOworCisJcmV0dXJuIFN0YXR1czsKK30KKworTlRTVEFUVVMJUlRVU0JNdWx0aVdyaXRlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVTSE9SVAkJCU9mZnNldCwKKwlJTglQVUNIQVIJCQlwRGF0YSwKKwlJTglVU0hPUlQJCQlsZW5ndGgpCit7CisJTlRTVEFUVVMJU3RhdHVzOworCisKKyAgICAgICAgVVNIT1JUICAgICAgICAgIGluZGV4ID0gMCxWYWx1ZTsKKyAgICAgICAgUFVDSEFSICAgICAgICAgIHBTcmMgPSBwRGF0YTsKKyAgICAgICAgVVNIT1JUICAgICAgICAgIHJlc3VkZSA9IDA7CisKKyAgICAgICAgcmVzdWRlID0gbGVuZ3RoICUgMjsKKwkJbGVuZ3RoICArPSByZXN1ZGU7CisJCWRvCisJCXsKKwkJCVZhbHVlID0oVVNIT1JUKSggKnBTcmMgIHwgKCoocFNyYyArIDEpIDw8IDgpKTsKKwkJU3RhdHVzID0gUlRVU0JTaW5nbGVXcml0ZShwQWQsT2Zmc2V0ICsgaW5kZXgsVmFsdWUpOworICAgICAgICAgICAgaW5kZXggKz0yOworICAgICAgICAgICAgbGVuZ3RoIC09IDI7CisgICAgICAgICAgICBwU3JjID0gcFNyYyArIDI7CisgICAgICAgIH13aGlsZShsZW5ndGggPiAwKTsKKworCXJldHVybiBTdGF0dXM7Cit9CisKKworTlRTVEFUVVMgUlRVU0JTaW5nbGVXcml0ZSgKKwlJTiAJUlRNUF9BREFQVEVSIAkqcEFkLAorCUlOCVVTSE9SVAkJCU9mZnNldCwKKwlJTglVU0hPUlQJCQlWYWx1ZSkKK3sKKwlOVFNUQVRVUwlTdGF0dXM7CisKKwlTdGF0dXMgPSBSVFVTQl9WZW5kb3JSZXF1ZXN0KAorCQlwQWQsCisJCVVTQkRfVFJBTlNGRVJfRElSRUNUSU9OX09VVCwKKwkJREVWSUNFX1ZFTkRPUl9SRVFVRVNUX09VVCwKKwkJMHgyLAorCQlWYWx1ZSwKKwkJT2Zmc2V0LAorCQlOVUxMLAorCQkwKTsKKworCXJldHVybiBTdGF0dXM7CisKK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjogUmVhZCAzMi1iaXQgTUFDIHJlZ2lzdGVyCisKKwlBcmd1bWVudHM6CisKKwlSZXR1cm4gVmFsdWU6CisKKwlJUlFMID0KKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitOVFNUQVRVUwlSVFVTQlJlYWRNQUNSZWdpc3RlcigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVU0hPUlQJCQlPZmZzZXQsCisJT1VUCVBVSU5UMzIJCQlwVmFsdWUpCit7CisJTlRTVEFUVVMJU3RhdHVzOworCVVJTlQzMgkJbG9jYWxWYWw7CisKKwlTdGF0dXMgPSBSVFVTQl9WZW5kb3JSZXF1ZXN0KAorCQlwQWQsCisJCShVU0JEX1RSQU5TRkVSX0RJUkVDVElPTl9JTiB8IFVTQkRfU0hPUlRfVFJBTlNGRVJfT0spLAorCQlERVZJQ0VfVkVORE9SX1JFUVVFU1RfSU4sCisJCTB4NywKKwkJMCwKKwkJT2Zmc2V0LAorCQkmbG9jYWxWYWwsCisJCTQpOworCisJKnBWYWx1ZSA9IGxlMmNwdTMyKGxvY2FsVmFsKTsKKworCisJaWYgKFN0YXR1cyA8IDApCisJCSpwVmFsdWUgPSAweGZmZmZmZmZmOworCisJcmV0dXJuIFN0YXR1czsKK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjogV3JpdGUgMzItYml0IE1BQyByZWdpc3RlcgorCisJQXJndW1lbnRzOgorCisJUmV0dXJuIFZhbHVlOgorCisJSVJRTCA9CisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworTlRTVEFUVVMJUlRVU0JXcml0ZU1BQ1JlZ2lzdGVyKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVTSE9SVAkJCU9mZnNldCwKKwlJTglVSU5UMzIJCQlWYWx1ZSkKK3sKKwlOVFNUQVRVUwlTdGF0dXM7CisJVUlOVDMyCQlsb2NhbFZhbDsKKworCWxvY2FsVmFsID0gVmFsdWU7CisKKwlTdGF0dXMgPSBSVFVTQlNpbmdsZVdyaXRlKHBBZCwgT2Zmc2V0LCAoVVNIT1JUKShsb2NhbFZhbCAmIDB4ZmZmZikpOworCVN0YXR1cyA9IFJUVVNCU2luZ2xlV3JpdGUocEFkLCBPZmZzZXQgKyAyLCAoVVNIT1JUKSgobG9jYWxWYWwgJiAweGZmZmYwMDAwKSA+PiAxNikpOworCisJcmV0dXJuIFN0YXR1czsKK30KKworCisKKyNpZiAxCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjogUmVhZCA4LWJpdCBCQlAgcmVnaXN0ZXIKKworCUFyZ3VtZW50czoKKworCVJldHVybiBWYWx1ZToKKworCUlSUUwgPQorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK05UU1RBVFVTCVJUVVNCUmVhZEJCUFJlZ2lzdGVyKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVDSEFSCQkJSWQsCisJSU4JUFVDSEFSCQkJcFZhbHVlKQoreworCUJCUF9DU1JfQ0ZHX1NUUlVDCUJicENzcjsKKwlVSU5UCQkJaSA9IDA7CisJTlRTVEFUVVMJCXN0YXR1czsKKworCS8vIFZlcmlmeSB0aGUgYnVzeSBjb25kaXRpb24KKwlkbworCXsKKwkJc3RhdHVzID0gUlRVU0JSZWFkTUFDUmVnaXN0ZXIocEFkLCBCQlBfQ1NSX0NGRywgJkJicENzci53b3JkKTsKKwkJaWYoc3RhdHVzID49IDApCisJCXsKKwkJaWYgKCEoQmJwQ3NyLmZpZWxkLkJ1c3kgPT0gQlVTWSkpCisJCQlicmVhazsKKwkJfQorCQlwcmludGsoIlJUVVNCUmVhZEJCUFJlZ2lzdGVyKEJCUF9DU1JfQ0ZHXzEpOnJldHJ5IGNvdW50PSVkIVxuIiwgaSk7CisJCWkrKzsKKwl9CisJd2hpbGUgKChpIDwgUkVUUllfTElNSVQpICYmICghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSk7CisKKwlpZiAoKGkgPT0gUkVUUllfTElNSVQpIHx8IChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpKQorCXsKKwkJLy8KKwkJLy8gUmVhZCBmYWlsZWQgdGhlbiBSZXR1cm4gRGVmYXVsdCB2YWx1ZS4KKwkJLy8KKwkJKnBWYWx1ZSA9IHBBZC0+QmJwV3JpdGVMYXRjaFtJZF07CisKKwkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCAoIlJldHJ5IGNvdW50IGV4aGF1c3RlZCBvciBkZXZpY2UgcmVtb3ZlZCEhIVxuIikpOworCQlyZXR1cm4gU1RBVFVTX1VOU1VDQ0VTU0ZVTDsKKwl9CisKKwkvLyBQcmVwYXJlIGZvciB3cml0ZSBtYXRlcmlhbAorCUJicENzci53b3JkIAkJCQk9IDA7CisJQmJwQ3NyLmZpZWxkLmZSZWFkCQkJPSAxOworCUJicENzci5maWVsZC5CdXN5CQkJPSAxOworCUJicENzci5maWVsZC5SZWdOdW0gCQk9IElkOworCVJUVVNCV3JpdGVNQUNSZWdpc3RlcihwQWQsIEJCUF9DU1JfQ0ZHLCBCYnBDc3Iud29yZCk7CisKKwlpID0gMDsKKwkvLyBWZXJpZnkgdGhlIGJ1c3kgY29uZGl0aW9uCisJZG8KKwl7CisJCXN0YXR1cyA9IFJUVVNCUmVhZE1BQ1JlZ2lzdGVyKHBBZCwgQkJQX0NTUl9DRkcsICZCYnBDc3Iud29yZCk7CisJCWlmIChzdGF0dXMgPj0gMCkKKwkJeworCQlpZiAoIShCYnBDc3IuZmllbGQuQnVzeSA9PSBCVVNZKSkKKwkJeworCQkJKnBWYWx1ZSA9IChVQ0hBUilCYnBDc3IuZmllbGQuVmFsdWU7CisJCQlicmVhazsKKwkJfQorCQl9CisJCXByaW50aygiUlRVU0JSZWFkQkJQUmVnaXN0ZXIoQkJQX0NTUl9DRkdfMik6cmV0cnkgY291bnQ9JWQhXG4iLCBpKTsKKwkJaSsrOworCX0KKwl3aGlsZSAoKGkgPCBSRVRSWV9MSU1JVCkgJiYgKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpKTsKKworCWlmICgoaSA9PSBSRVRSWV9MSU1JVCkgfHwgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkpCisJeworCQkvLworCQkvLyBSZWFkIGZhaWxlZCB0aGVuIFJldHVybiBEZWZhdWx0IHZhbHVlLgorCQkvLworCQkqcFZhbHVlID0gcEFkLT5CYnBXcml0ZUxhdGNoW0lkXTsKKworCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgiUmV0cnkgY291bnQgZXhoYXVzdGVkIG9yIGRldmljZSByZW1vdmVkISEhXG4iKSk7CisJCXJldHVybiBTVEFUVVNfVU5TVUNDRVNTRlVMOworCX0KKworCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKK30KKyNlbHNlCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjogUmVhZCA4LWJpdCBCQlAgcmVnaXN0ZXIgdmlhIGZpcm13YXJlCisKKwlBcmd1bWVudHM6CisKKwlSZXR1cm4gVmFsdWU6CisKKwlJUlFMID0KKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitOVFNUQVRVUwlSVFVTQlJlYWRCQlBSZWdpc3RlcigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVQ0hBUgkJCUlkLAorCUlOCVBVQ0hBUgkJCXBWYWx1ZSkKK3sKKwlCQlBfQ1NSX0NGR19TVFJVQwlCYnBDc3I7CisJaW50CQkJCQlpLCBrOworCWZvciAoaT0wOyBpPE1BWF9CVVNZX0NPVU5UOyBpKyspCisJeworCQlSVFVTQlJlYWRNQUNSZWdpc3RlcihwQWQsIEgyTV9CQlBfQUdFTlQsICZCYnBDc3Iud29yZCk7CisJCWlmIChCYnBDc3IuZmllbGQuQnVzeSA9PSBCVVNZKQorCQl7CisJCQljb250aW51ZTsKKwkJfQorCQlCYnBDc3Iud29yZCA9IDA7CisJCUJicENzci5maWVsZC5mUmVhZCA9IDE7CisJCUJicENzci5maWVsZC5CQlBfUldfTU9ERSA9IDE7CisJCUJicENzci5maWVsZC5CdXN5ID0gMTsKKwkJQmJwQ3NyLmZpZWxkLlJlZ051bSA9IElkOworCQlSVFVTQldyaXRlTUFDUmVnaXN0ZXIocEFkLCBIMk1fQkJQX0FHRU5ULCBCYnBDc3Iud29yZCk7CisJCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHg4MCwgMHhmZiwgMHgwLCAweDApOworCQlmb3IgKGs9MDsgazxNQVhfQlVTWV9DT1VOVDsgaysrKQorCQl7CisJCQlSVFVTQlJlYWRNQUNSZWdpc3RlcihwQWQsIEgyTV9CQlBfQUdFTlQsICZCYnBDc3Iud29yZCk7CisJCQlpZiAoQmJwQ3NyLmZpZWxkLkJ1c3kgPT0gSURMRSkKKwkJCQlicmVhazsKKwkJfQorCQlpZiAoKEJicENzci5maWVsZC5CdXN5ID09IElETEUpICYmCisJCQkoQmJwQ3NyLmZpZWxkLlJlZ051bSA9PSBJZCkpCisJCXsKKwkJCSpwVmFsdWUgPSAoVUNIQVIpQmJwQ3NyLmZpZWxkLlZhbHVlOworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKEJicENzci5maWVsZC5CdXN5ID09IEJVU1kpCisJeworCQlEQkdQUklOVF9FUlIoKCJCQlAgcmVhZCBSJWQ9MHgleCBmYWlsXG4iLCBJZCwgQmJwQ3NyLndvcmQpKTsKKwkJKnBWYWx1ZSA9IHBBZC0+QmJwV3JpdGVMYXRjaFtJZF07CisJCXJldHVybiBTVEFUVVNfVU5TVUNDRVNTRlVMOworCX0KKwlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7Cit9CisjZW5kaWYKKworI2lmIDEKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOiBXcml0ZSA4LWJpdCBCQlAgcmVnaXN0ZXIKKworCUFyZ3VtZW50czoKKworCVJldHVybiBWYWx1ZToKKworCUlSUUwgPQorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK05UU1RBVFVTCVJUVVNCV3JpdGVCQlBSZWdpc3RlcigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVQ0hBUgkJCUlkLAorCUlOCVVDSEFSCQkJVmFsdWUpCit7CisJQkJQX0NTUl9DRkdfU1RSVUMJQmJwQ3NyOworCVVJTlQJCQlpID0gMDsKKwlOVFNUQVRVUwkJc3RhdHVzOworCS8vIFZlcmlmeSB0aGUgYnVzeSBjb25kaXRpb24KKwlkbworCXsKKwkJc3RhdHVzID0gUlRVU0JSZWFkTUFDUmVnaXN0ZXIocEFkLCBCQlBfQ1NSX0NGRywgJkJicENzci53b3JkKTsKKwkJaWYgKHN0YXR1cyA+PSAwKQorCQl7CisJCWlmICghKEJicENzci5maWVsZC5CdXN5ID09IEJVU1kpKQorCQkJYnJlYWs7CisJCX0KKwkJcHJpbnRrKCJSVFVTQldyaXRlQkJQUmVnaXN0ZXIoQkJQX0NTUl9DRkcpOnJldHJ5IGNvdW50PSVkIVxuIiwgaSk7CisJCWkrKzsKKwl9CisJd2hpbGUgKChpIDwgUkVUUllfTElNSVQpICYmICghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSk7CisKKwlpZiAoKGkgPT0gUkVUUllfTElNSVQpIHx8IChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpKQorCXsKKwkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCAoIlJldHJ5IGNvdW50IGV4aGF1c3RlZCBvciBkZXZpY2UgcmVtb3ZlZCEhIVxuIikpOworCQlyZXR1cm4gU1RBVFVTX1VOU1VDQ0VTU0ZVTDsKKwl9CisKKwkvLyBQcmVwYXJlIGZvciB3cml0ZSBtYXRlcmlhbAorCUJicENzci53b3JkIAkJCQk9IDA7CisJQmJwQ3NyLmZpZWxkLmZSZWFkCQkJPSAwOworCUJicENzci5maWVsZC5WYWx1ZQkJCT0gVmFsdWU7CisJQmJwQ3NyLmZpZWxkLkJ1c3kJCQk9IDE7CisJQmJwQ3NyLmZpZWxkLlJlZ051bSAJCT0gSWQ7CisJUlRVU0JXcml0ZU1BQ1JlZ2lzdGVyKHBBZCwgQkJQX0NTUl9DRkcsIEJicENzci53b3JkKTsKKworCXBBZC0+QmJwV3JpdGVMYXRjaFtJZF0gPSBWYWx1ZTsKKworCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKK30KKyNlbHNlCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjogV3JpdGUgOC1iaXQgQkJQIHJlZ2lzdGVyIHZpYSBmaXJtd2FyZQorCisJQXJndW1lbnRzOgorCisJUmV0dXJuIFZhbHVlOgorCisJSVJRTCA9CisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworCitOVFNUQVRVUwlSVFVTQldyaXRlQkJQUmVnaXN0ZXIoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVUNIQVIJCQlJZCwKKwlJTglVQ0hBUgkJCVZhbHVlKQorCit7CisJQkJQX0NTUl9DRkdfU1RSVUMJQmJwQ3NyOworCWludAkJCQkJQnVzeUNudDsKKwlmb3IgKEJ1c3lDbnQ9MDsgQnVzeUNudDxNQVhfQlVTWV9DT1VOVDsgQnVzeUNudCsrKQorCXsKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBIMk1fQkJQX0FHRU5ULCAmQmJwQ3NyLndvcmQpOworCQlpZiAoQmJwQ3NyLmZpZWxkLkJ1c3kgPT0gQlVTWSkKKwkJCWNvbnRpbnVlOworCQlCYnBDc3Iud29yZCA9IDA7CisJCUJicENzci5maWVsZC5mUmVhZCA9IDA7CisJCUJicENzci5maWVsZC5CQlBfUldfTU9ERSA9IDE7CisJCUJicENzci5maWVsZC5CdXN5ID0gMTsKKwkJQmJwQ3NyLmZpZWxkLlZhbHVlID0gVmFsdWU7CisJCUJicENzci5maWVsZC5SZWdOdW0gPSBJZDsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgSDJNX0JCUF9BR0VOVCwgQmJwQ3NyLndvcmQpOworCQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4ODAsIDB4ZmYsIDB4MCwgMHgwKTsKKwkJcEFkLT5CYnBXcml0ZUxhdGNoW0lkXSA9IFZhbHVlOworCQlicmVhazsKKwl9CisJaWYgKEJ1c3lDbnQgPT0gTUFYX0JVU1lfQ09VTlQpCisJeworCQlEQkdQUklOVF9FUlIoKCJCQlAgd3JpdGUgUiVkPTB4JXggZmFpbFxuIiwgSWQsIEJicENzci53b3JkKSk7CisJCXJldHVybiBTVEFUVVNfVU5TVUNDRVNTRlVMOworCX0KKwlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7Cit9CisjZW5kaWYKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOiBXcml0ZSBSRiByZWdpc3RlciB0aHJvdWdoIE1BQworCisJQXJndW1lbnRzOgorCisJUmV0dXJuIFZhbHVlOgorCisJSVJRTCA9CisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworTlRTVEFUVVMJUlRVU0JXcml0ZVJGUmVnaXN0ZXIoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVUlOVDMyCQkJVmFsdWUpCit7CisJUEhZX0NTUjRfU1RSVUMJUGh5Q3NyNDsKKwlVSU5UCQkJaSA9IDA7CisJTlRTVEFUVVMJCXN0YXR1czsKKworCU5kaXNaZXJvTWVtb3J5KCZQaHlDc3I0LCBzaXplb2YoUEhZX0NTUjRfU1RSVUMpKTsKKwlkbworCXsKKwkJc3RhdHVzID0gUlRVU0JSZWFkTUFDUmVnaXN0ZXIocEFkLCBSRl9DU1JfQ0ZHMCwgJlBoeUNzcjQud29yZCk7CisJCWlmIChzdGF0dXMgPj0gMCkKKwkJeworCQlpZiAoIShQaHlDc3I0LmZpZWxkLkJ1c3kpKQorCQkJYnJlYWs7CisJCX0KKwkJcHJpbnRrKCJSVFVTQldyaXRlUkZSZWdpc3RlcihSRl9DU1JfQ0ZHMCk6cmV0cnkgY291bnQ9JWQhXG4iLCBpKTsKKwkJaSsrOworCX0KKwl3aGlsZSAoKGkgPCBSRVRSWV9MSU1JVCkgJiYgKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpKTsKKworCWlmICgoaSA9PSBSRVRSWV9MSU1JVCkgfHwgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkpCisJeworCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgiUmV0cnkgY291bnQgZXhoYXVzdGVkIG9yIGRldmljZSByZW1vdmVkISEhXG4iKSk7CisJCXJldHVybiBTVEFUVVNfVU5TVUNDRVNTRlVMOworCX0KKworCVJUVVNCV3JpdGVNQUNSZWdpc3RlcihwQWQsIFJGX0NTUl9DRkcwLCBWYWx1ZSk7CisKKwlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOiBXcml0ZSBSVDMwNzAgUkYgcmVnaXN0ZXIgdGhyb3VnaCBNQUMKKworCUFyZ3VtZW50czoKKworCVJldHVybiBWYWx1ZToKKworCUlSUUwgPQorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK05UU1RBVFVTCVJUMzB4eFdyaXRlUkZSZWdpc3RlcigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVQ0hBUgkJCVJlZ0lELAorCUlOCVVDSEFSCQkJVmFsdWUpCit7CisJUkZfQ1NSX0NGR19TVFJVQwlyZmNzcjsKKwlVSU5UCQkJCWkgPSAwOworCisJZG8KKwl7CisJCVJUVVNCUmVhZE1BQ1JlZ2lzdGVyKHBBZCwgUkZfQ1NSX0NGRywgJnJmY3NyLndvcmQpOworCisJCWlmICghcmZjc3IuZmllbGQuUkZfQ1NSX0tJQ0spCisJCQlicmVhazsKKwkJaSsrOworCX0KKwl3aGlsZSAoKGkgPCBSRVRSWV9MSU1JVCkgJiYgKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpKTsKKworCWlmICgoaSA9PSBSRVRSWV9MSU1JVCkgfHwgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkpCisJeworCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgiUmV0cnkgY291bnQgZXhoYXVzdGVkIG9yIGRldmljZSByZW1vdmVkISEhXG4iKSk7CisJCXJldHVybiBTVEFUVVNfVU5TVUNDRVNTRlVMOworCX0KKworCXJmY3NyLmZpZWxkLlJGX0NTUl9XUiA9IDE7CisJcmZjc3IuZmllbGQuUkZfQ1NSX0tJQ0sgPSAxOworCXJmY3NyLmZpZWxkLlRFU1RDU1JfUkZBQ0NfUkVHTlVNID0gUmVnSUQ7CisJcmZjc3IuZmllbGQuUkZfQ1NSX0RBVEEgPSBWYWx1ZTsKKworCVJUVVNCV3JpdGVNQUNSZWdpc3RlcihwQWQsIFJGX0NTUl9DRkcsIHJmY3NyLndvcmQpOworCisJcmV0dXJuIFNUQVRVU19TVUNDRVNTOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjogUmVhZCBSVDMwNzAgUkYgcmVnaXN0ZXIgdGhyb3VnaCBNQUMKKworCUFyZ3VtZW50czoKKworCVJldHVybiBWYWx1ZToKKworCUlSUUwgPQorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK05UU1RBVFVTCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVDSEFSCQkJUmVnSUQsCisJSU4JUFVDSEFSCQkJcFZhbHVlKQoreworCVJGX0NTUl9DRkdfU1RSVUMJcmZjc3I7CisJVUlOVAkJCQlpPTAsIGs7CisKKwlmb3IgKGk9MDsgaTxNQVhfQlVTWV9DT1VOVDsgaSsrKQorCXsKKwkJUlRVU0JSZWFkTUFDUmVnaXN0ZXIocEFkLCBSRl9DU1JfQ0ZHLCAmcmZjc3Iud29yZCk7CisKKwkJaWYgKHJmY3NyLmZpZWxkLlJGX0NTUl9LSUNLID09IEJVU1kpCisJCXsKKwkJCWNvbnRpbnVlOworCQl9CisJCXJmY3NyLndvcmQgPSAwOworCQlyZmNzci5maWVsZC5SRl9DU1JfV1IgPSAwOworCQlyZmNzci5maWVsZC5SRl9DU1JfS0lDSyA9IDE7CisJCXJmY3NyLmZpZWxkLlRFU1RDU1JfUkZBQ0NfUkVHTlVNID0gUmVnSUQ7CisJCVJUVVNCV3JpdGVNQUNSZWdpc3RlcihwQWQsIFJGX0NTUl9DRkcsIHJmY3NyLndvcmQpOworCQlmb3IgKGs9MDsgazxNQVhfQlVTWV9DT1VOVDsgaysrKQorCQl7CisJCQlSVFVTQlJlYWRNQUNSZWdpc3RlcihwQWQsIFJGX0NTUl9DRkcsICZyZmNzci53b3JkKTsKKworCQkJaWYgKHJmY3NyLmZpZWxkLlJGX0NTUl9LSUNLID09IElETEUpCisJCQkJYnJlYWs7CisJCX0KKwkJaWYgKChyZmNzci5maWVsZC5SRl9DU1JfS0lDSyA9PSBJRExFKSAmJgorCQkJKHJmY3NyLmZpZWxkLlRFU1RDU1JfUkZBQ0NfUkVHTlVNID09IFJlZ0lEKSkKKwkJeworCQkJKnBWYWx1ZSA9IChVQ0hBUilyZmNzci5maWVsZC5SRl9DU1JfREFUQTsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmIChyZmNzci5maWVsZC5SRl9DU1JfS0lDSyA9PSBCVVNZKQorCXsKKwkJREJHUFJJTlRfRVJSKCgiUkYgcmVhZCBSJWQ9MHgleCBmYWlsXG4iLCBSZWdJRCwgcmZjc3Iud29yZCkpOworCQlyZXR1cm4gU1RBVFVTX1VOU1VDQ0VTU0ZVTDsKKwl9CisKKwlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCisJQXJndW1lbnRzOgorCisJUmV0dXJuIFZhbHVlOgorCisJSVJRTCA9CisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworTlRTVEFUVVMJUlRVU0JSZWFkRUVQUk9NKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVTSE9SVAkJCU9mZnNldCwKKwlPVVQJUFVDSEFSCQkJcERhdGEsCisJSU4JVVNIT1JUCQkJbGVuZ3RoKQoreworCU5UU1RBVFVTCVN0YXR1cyA9IFNUQVRVU19TVUNDRVNTOworCisJU3RhdHVzID0gUlRVU0JfVmVuZG9yUmVxdWVzdCgKKwkJcEFkLAorCQkoVVNCRF9UUkFOU0ZFUl9ESVJFQ1RJT05fSU4gfCBVU0JEX1NIT1JUX1RSQU5TRkVSX09LKSwKKwkJREVWSUNFX1ZFTkRPUl9SRVFVRVNUX0lOLAorCQkweDksCisJCTAsCisJCU9mZnNldCwKKwkJcERhdGEsCisJCWxlbmd0aCk7CisKKwlyZXR1cm4gU3RhdHVzOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKworCUFyZ3VtZW50czoKKworCVJldHVybiBWYWx1ZToKKworCUlSUUwgPQorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK05UU1RBVFVTCVJUVVNCV3JpdGVFRVBST00oCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVVNIT1JUCQkJT2Zmc2V0LAorCUlOCVBVQ0hBUgkJCXBEYXRhLAorCUlOCVVTSE9SVAkJCWxlbmd0aCkKK3sKKwlOVFNUQVRVUwlTdGF0dXMgPSBTVEFUVVNfU1VDQ0VTUzsKKworCVN0YXR1cyA9IFJUVVNCX1ZlbmRvclJlcXVlc3QoCisJCXBBZCwKKwkJVVNCRF9UUkFOU0ZFUl9ESVJFQ1RJT05fT1VULAorCQlERVZJQ0VfVkVORE9SX1JFUVVFU1RfT1VULAorCQkweDgsCisJCTAsCisJCU9mZnNldCwKKwkJcERhdGEsCisJCWxlbmd0aCk7CisKKwlyZXR1cm4gU3RhdHVzOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKworCUFyZ3VtZW50czoKKworCVJldHVybiBWYWx1ZToKKworCUlSUUwgPQorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgUlRVU0JQdXRUb1NsZWVwKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKQoreworCVVJTlQzMgkJdmFsdWU7CisKKwkvLyBUaW1lb3V0IDB4NDAgeCA1MHVzCisJdmFsdWUgPSAoU0xFRVBDSUQ8PDE2KSsoT1dORVJNQ1U8PDI0KSsgKDB4NDA8PDgpKzE7CisJUlRVU0JXcml0ZU1BQ1JlZ2lzdGVyKHBBZCwgMHg3MDEwLCB2YWx1ZSk7CisJUlRVU0JXcml0ZU1BQ1JlZ2lzdGVyKHBBZCwgMHg0MDQsIDB4MzApOworCS8vUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyk7CisJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCAoIlNsZWVwIE1haWxib3ggdGVzdHZhbHVlICV4XG4iLCB2YWx1ZSkpOworCit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCisJQXJndW1lbnRzOgorCisJUmV0dXJuIFZhbHVlOgorCisJSVJRTCA9CisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworTlRTVEFUVVMgUlRVU0JXYWtlVXAoCisJSU4JUFJUTVBfQURBUFRFUglwQWQpCit7CisJTlRTVEFUVVMJU3RhdHVzOworCisJU3RhdHVzID0gUlRVU0JfVmVuZG9yUmVxdWVzdCgKKwkJcEFkLAorCQlVU0JEX1RSQU5TRkVSX0RJUkVDVElPTl9PVVQsCisJCURFVklDRV9WRU5ET1JfUkVRVUVTVF9PVVQsCisJCTB4MDEsCisJCTB4MDksCisJCTAsCisJCU5VTEwsCisJCTApOworCisJcmV0dXJuIFN0YXR1czsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisKKwlBcmd1bWVudHM6CisKKwlSZXR1cm4gVmFsdWU6CisKKwlJUlFMID0KKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECVJUVVNCSW5pdGlhbGl6ZUNtZFEoCisJSU4JUENtZFEJY21kcSkKK3sKKwljbWRxLT5oZWFkID0gTlVMTDsKKwljbWRxLT50YWlsID0gTlVMTDsKKwljbWRxLT5zaXplID0gMDsKKwljbWRxLT5DbWRRU3RhdGUgPSBSVDI4NzBfVEhSRUFEX0lOSVRFRDsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisKKwlBcmd1bWVudHM6CisKKwlSZXR1cm4gVmFsdWU6CisKKwlJUlFMID0KKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitORElTX1NUQVRVUwlSVFVTQkVucXVldWVDbWRGcm9tTmRpcygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglORElTX09JRAkJT2lkLAorCUlOCUJPT0xFQU4JCQlTZXRJbmZvcm1hdGlvbiwKKwlJTglQVk9JRAkJCXBJbmZvcm1hdGlvbkJ1ZmZlciwKKwlJTglVSU5UMzIJCQlJbmZvcm1hdGlvbkJ1ZmZlckxlbmd0aCkKK3sKKwlORElTX1NUQVRVUwlzdGF0dXM7CisJUENtZFFFbG10CWNtZHFlbG10ID0gTlVMTDsKKwlQT1NfQ09PS0lFIHBPYmogPSAoUE9TX0NPT0tJRSkgcEFkLT5PU19Db29raWU7CisKKworCUNIRUNLX1BJRF9MRUdBTElUWShwT2JqLT5SVFVTQkNtZFRocl9waWQpCisJCXJldHVybiAoTkRJU19TVEFUVVNfUkVTT1VSQ0VTKTsKKworCXN0YXR1cyA9IFJUTVBBbGxvY2F0ZU1lbW9yeSgoUFZPSUQgKikmY21kcWVsbXQsIHNpemVvZihDbWRRRWxtdCkpOworCWlmICgoc3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpIHx8IChjbWRxZWxtdCA9PSBOVUxMKSkKKwkJcmV0dXJuIChORElTX1NUQVRVU19SRVNPVVJDRVMpOworCisJCWNtZHFlbG10LT5idWZmZXIgPSBOVUxMOworCQlpZiAocEluZm9ybWF0aW9uQnVmZmVyICE9IE5VTEwpCisJCXsKKwkJCXN0YXR1cyA9IFJUTVBBbGxvY2F0ZU1lbW9yeSgoUFZPSUQgKikmY21kcWVsbXQtPmJ1ZmZlciwgSW5mb3JtYXRpb25CdWZmZXJMZW5ndGgpOworCQkJaWYgKChzdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykgfHwgKGNtZHFlbG10LT5idWZmZXIgPT0gTlVMTCkpCisJCQl7CisJCQkJa2ZyZWUoY21kcWVsbXQpOworCQkJCXJldHVybiAoTkRJU19TVEFUVVNfUkVTT1VSQ0VTKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlOZGlzTW92ZU1lbW9yeShjbWRxZWxtdC0+YnVmZmVyLCBwSW5mb3JtYXRpb25CdWZmZXIsIEluZm9ybWF0aW9uQnVmZmVyTGVuZ3RoKTsKKwkJCQljbWRxZWxtdC0+YnVmZmVybGVuZ3RoID0gSW5mb3JtYXRpb25CdWZmZXJMZW5ndGg7CisJCQl9CisJCX0KKwkJZWxzZQorCQkJY21kcWVsbXQtPmJ1ZmZlcmxlbmd0aCA9IDA7CisKKwljbWRxZWxtdC0+Y29tbWFuZCA9IE9pZDsKKwljbWRxZWxtdC0+Q21kRnJvbU5kaXMgPSBUUlVFOworCWlmIChTZXRJbmZvcm1hdGlvbiA9PSBUUlVFKQorCQljbWRxZWxtdC0+U2V0T3BlcmF0aW9uID0gVFJVRTsKKwllbHNlCisJCWNtZHFlbG10LT5TZXRPcGVyYXRpb24gPSBGQUxTRTsKKworCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+Q21kUUxvY2spOworCWlmIChwQWQtPkNtZFEuQ21kUVN0YXRlICYgUlQyODcwX1RIUkVBRF9DQU5fRE9fSU5TRVJUKQorCXsKKwkJRW5xdWV1ZUNtZCgoJnBBZC0+Q21kUSksIGNtZHFlbG10KTsKKwkJc3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKwl9CisJZWxzZQorCXsKKwkJc3RhdHVzID0gTkRJU19TVEFUVVNfRkFJTFVSRTsKKwl9CisJTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5DbWRRTG9jayk7CisKKwlpZiAoc3RhdHVzID09IE5ESVNfU1RBVFVTX0ZBSUxVUkUpCisJeworCQlpZiAoY21kcWVsbXQtPmJ1ZmZlcikKKwkJCU5kaXNGcmVlTWVtb3J5KGNtZHFlbG10LT5idWZmZXIsIGNtZHFlbG10LT5idWZmZXJsZW5ndGgsIDApOworCQlOZGlzRnJlZU1lbW9yeShjbWRxZWxtdCwgc2l6ZW9mKENtZFFFbG10KSwgMCk7CisJfQorCWVsc2UKKwlSVFVTQkNNRFVwKHBBZCk7CisKKworICAgIHJldHVybihORElTX1NUQVRVU19TVUNDRVNTKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisKKwlBcmd1bWVudHM6CisKKwlSZXR1cm4gVmFsdWU6CisKKwlJUlFMID0KKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitORElTX1NUQVRVUyBSVFVTQkVucXVldWVJbnRlcm5hbENtZCgKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiBORElTX09JRAkJCU9pZCwKKwlJTiBQVk9JRAkJCXBJbmZvcm1hdGlvbkJ1ZmZlciwKKwlJTiBVSU5UMzIJCQlJbmZvcm1hdGlvbkJ1ZmZlckxlbmd0aCkKK3sKKwlORElTX1NUQVRVUwlzdGF0dXM7CisJUENtZFFFbG10CWNtZHFlbG10ID0gTlVMTDsKKworCisJc3RhdHVzID0gUlRNUEFsbG9jYXRlTWVtb3J5KChQVk9JRCAqKSZjbWRxZWxtdCwgc2l6ZW9mKENtZFFFbG10KSk7CisJaWYgKChzdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykgfHwgKGNtZHFlbG10ID09IE5VTEwpKQorCQlyZXR1cm4gKE5ESVNfU1RBVFVTX1JFU09VUkNFUyk7CisJTmRpc1plcm9NZW1vcnkoY21kcWVsbXQsIHNpemVvZihDbWRRRWxtdCkpOworCisJaWYoSW5mb3JtYXRpb25CdWZmZXJMZW5ndGggPiAwKQorCXsKKwkJc3RhdHVzID0gUlRNUEFsbG9jYXRlTWVtb3J5KChQVk9JRCAqKSZjbWRxZWxtdC0+YnVmZmVyLCBJbmZvcm1hdGlvbkJ1ZmZlckxlbmd0aCk7CisJCWlmICgoc3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpIHx8IChjbWRxZWxtdC0+YnVmZmVyID09IE5VTEwpKQorCQl7CisJCQlOZGlzRnJlZU1lbW9yeShjbWRxZWxtdCwgc2l6ZW9mKENtZFFFbG10KSwgMCk7CisJCQlyZXR1cm4gKE5ESVNfU1RBVFVTX1JFU09VUkNFUyk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlOZGlzTW92ZU1lbW9yeShjbWRxZWxtdC0+YnVmZmVyLCBwSW5mb3JtYXRpb25CdWZmZXIsIEluZm9ybWF0aW9uQnVmZmVyTGVuZ3RoKTsKKwkJCWNtZHFlbG10LT5idWZmZXJsZW5ndGggPSBJbmZvcm1hdGlvbkJ1ZmZlckxlbmd0aDsKKwkJfQorCX0KKwllbHNlCisJeworCQljbWRxZWxtdC0+YnVmZmVyID0gTlVMTDsKKwkJY21kcWVsbXQtPmJ1ZmZlcmxlbmd0aCA9IDA7CisJfQorCisJY21kcWVsbXQtPmNvbW1hbmQgPSBPaWQ7CisJY21kcWVsbXQtPkNtZEZyb21OZGlzID0gRkFMU0U7CisKKwlpZiAoY21kcWVsbXQgIT0gTlVMTCkKKwl7CisJCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+Q21kUUxvY2spOworCQlpZiAocEFkLT5DbWRRLkNtZFFTdGF0ZSAmIFJUMjg3MF9USFJFQURfQ0FOX0RPX0lOU0VSVCkKKwkJeworCQkJRW5xdWV1ZUNtZCgoJnBBZC0+Q21kUSksIGNtZHFlbG10KTsKKwkJCXN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisJCX0KKwkJZWxzZQorCQl7CisJCQlzdGF0dXMgPSBORElTX1NUQVRVU19GQUlMVVJFOworCQl9CisJCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+Q21kUUxvY2spOworCisJCWlmIChzdGF0dXMgPT0gTkRJU19TVEFUVVNfRkFJTFVSRSkKKwkJeworCQkJaWYgKGNtZHFlbG10LT5idWZmZXIpCisJCQkJTmRpc0ZyZWVNZW1vcnkoY21kcWVsbXQtPmJ1ZmZlciwgY21kcWVsbXQtPmJ1ZmZlcmxlbmd0aCwgMCk7CisJCQlOZGlzRnJlZU1lbW9yeShjbWRxZWxtdCwgc2l6ZW9mKENtZFFFbG10KSwgMCk7CisJCX0KKwkJZWxzZQorCQlSVFVTQkNNRFVwKHBBZCk7CisJfQorCXJldHVybihORElTX1NUQVRVU19TVUNDRVNTKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisKKwlBcmd1bWVudHM6CisKKwlSZXR1cm4gVmFsdWU6CisKKwlJUlFMID0KKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECVJUVVNCRGVxdWV1ZUNtZCgKKwlJTglQQ21kUQkJY21kcSwKKwlPVVQJUENtZFFFbG10CSpwY21kcWVsbXQpCit7CisJKnBjbWRxZWxtdCA9IGNtZHEtPmhlYWQ7CisKKwlpZiAoKnBjbWRxZWxtdCAhPSBOVUxMKQorCXsKKwkJY21kcS0+aGVhZCA9IGNtZHEtPmhlYWQtPm5leHQ7CisJCWNtZHEtPnNpemUtLTsKKwkJaWYgKGNtZHEtPnNpemUgPT0gMCkKKwkJCWNtZHEtPnRhaWwgPSBOVUxMOworCX0KK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkgIHVzYl9jb250cm9sX21zZyAtIEJ1aWxkcyBhIGNvbnRyb2wgdXJiLCBzZW5kcyBpdCBvZmYgYW5kIHdhaXRzIGZvciBjb21wbGV0aW9uCisJICBAZGV2OiBwb2ludGVyIHRvIHRoZSB1c2IgZGV2aWNlIHRvIHNlbmQgdGhlIG1lc3NhZ2UgdG8KKwkgIEBwaXBlOiBlbmRwb2ludCAicGlwZSIgdG8gc2VuZCB0aGUgbWVzc2FnZSB0bworCSAgQHJlcXVlc3Q6IFVTQiBtZXNzYWdlIHJlcXVlc3QgdmFsdWUKKwkgIEByZXF1ZXN0dHlwZTogVVNCIG1lc3NhZ2UgcmVxdWVzdCB0eXBlIHZhbHVlCisJICBAdmFsdWU6IFVTQiBtZXNzYWdlIHZhbHVlCisJICBAaW5kZXg6IFVTQiBtZXNzYWdlIGluZGV4IHZhbHVlCisJICBAZGF0YTogcG9pbnRlciB0byB0aGUgZGF0YSB0byBzZW5kCisJICBAc2l6ZTogbGVuZ3RoIGluIGJ5dGVzIG9mIHRoZSBkYXRhIHRvIHNlbmQKKwkgIEB0aW1lb3V0OiB0aW1lIGluIGppZmZpZXMgdG8gd2FpdCBmb3IgdGhlIG1lc3NhZ2UgdG8gY29tcGxldGUgYmVmb3JlCisJCQkgIHRpbWluZyBvdXQgKGlmIDAgdGhlIHdhaXQgaXMgZm9yZXZlcikKKwkgIENvbnRleHQ6ICFpbl9pbnRlcnJ1cHQgKCkKKworCSAgVGhpcyBmdW5jdGlvbiBzZW5kcyBhIHNpbXBsZSBjb250cm9sIG1lc3NhZ2UgdG8gYSBzcGVjaWZpZWQgZW5kcG9pbnQKKwkgIGFuZCB3YWl0cyBmb3IgdGhlIG1lc3NhZ2UgdG8gY29tcGxldGUsIG9yIHRpbWVvdXQuCisJICBJZiBzdWNjZXNzZnVsLCBpdCByZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgdHJhbnNmZXJyZWQsIG90aGVyd2lzZSBhIG5lZ2F0aXZlIGVycm9yIG51bWJlci4KKworCSBEb24ndCB1c2UgdGhpcyBmdW5jdGlvbiBmcm9tIHdpdGhpbiBhbiBpbnRlcnJ1cHQgY29udGV4dCwgbGlrZSBhCisJICBib3R0b20gaGFsZiBoYW5kbGVyLglJZiB5b3UgbmVlZCBhbiBhc3luY2hyb25vdXMgbWVzc2FnZSwgb3IgbmVlZCB0byBzZW5kCisJICBhIG1lc3NhZ2UgZnJvbSB3aXRoaW4gaW50ZXJydXB0IGNvbnRleHQsIHVzZSB1c2Jfc3VibWl0X3VyYigpCisJICBJZiBhIHRocmVhZCBpbiB5b3VyIGRyaXZlciB1c2VzIHRoaXMgY2FsbCwgbWFrZSBzdXJlIHlvdXIgZGlzY29ubmVjdCgpCisJICBtZXRob2QgY2FuIHdhaXQgZm9yIGl0IHRvIGNvbXBsZXRlLiAgU2luY2UgeW91IGRvbid0IGhhdmUgYSBoYW5kbGUgb24KKwkgIHRoZSBVUkIgdXNlZCwgeW91IGNhbid0IGNhbmNlbCB0aGUgcmVxdWVzdC4KKworCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKworCUFyZ3VtZW50czoKKworCVJldHVybiBWYWx1ZToKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitOVFNUQVRVUyAgICBSVFVTQl9WZW5kb3JSZXF1ZXN0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVJTlQzMgkJCVRyYW5zZmVyRmxhZ3MsCisJSU4JVUNIQVIJCQlSZXF1ZXN0VHlwZSwKKwlJTglVQ0hBUgkJCVJlcXVlc3QsCisJSU4JVVNIT1JUCQkJVmFsdWUsCisJSU4JVVNIT1JUCQkJSW5kZXgsCisJSU4JUFZPSUQJCQlUcmFuc2ZlckJ1ZmZlciwKKwlJTglVSU5UMzIJCQlUcmFuc2ZlckJ1ZmZlckxlbmd0aCkKK3sKKwlpbnQJCQkJcmV0OworCVBPU19DT09LSUUJCXBPYmogPSAoUE9TX0NPT0tJRSkgcEFkLT5PU19Db29raWU7CisKKwlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiZGV2aWNlIGRpc2Nvbm5lY3RlZFxuIikpOworCQlyZXR1cm4gLTE7CisJfQorCWVsc2UgaWYgKGluX2ludGVycnVwdCgpKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiaW5faW50ZXJydXB0LCBSVFVTQl9WZW5kb3JSZXF1ZXN0IFJlcXVlc3QlMDJ4IFZhbHVlJTA0eCBPZmZzZXQlMDR4XG4iLFJlcXVlc3QsVmFsdWUsSW5kZXgpKTsKKworCQlyZXR1cm4gLTE7CisJfQorCWVsc2UKKwl7CisjZGVmaW5lIE1BWF9SRVRSWV9DT1VOVCAgMTAKKworCQlpbnQgcmV0cnlDb3VudCA9IDA7CisJCXZvaWQJKnRtcEJ1ZiA9IFRyYW5zZmVyQnVmZmVyOworCisJCS8vIEFjcXVpcmUgQ29udHJvbCB0b2tlbgorI2lmZGVmIElORl9BTUFaT05fU0UKKwkJLy9TZW1hcGhvcmUgZml4IElORl9BTUFaT05fU0UgaGFuZworCQkvL3BBZC0+VXNiVmVuZG9yUmVxQnVmIGlzIHRoZSBzd2FwIGZvciBERVZJQ0VfVkVORE9SX1JFUVVFU1RfSU4gdG8gZml4IGRtYSBidWcuCisJCXJldCA9IGRvd25faW50ZXJydXB0aWJsZSgmKHBBZC0+VXNiVmVuZG9yUmVxX3NlbWFwaG9yZSkpOworCQlpZiAocEFkLT5Vc2JWZW5kb3JSZXFCdWYpCisJCXsKKwkJCUFTU0VSVChUcmFuc2ZlckJ1ZmZlckxlbmd0aCA8TUFYX1BBUkFNX0JVRkZFUl9TSVpFKTsKKworCQkgICAJdG1wQnVmID0gKHZvaWQgKilwQWQtPlVzYlZlbmRvclJlcUJ1ZjsKKwkJICAgCU5kaXNaZXJvTWVtb3J5KHBBZC0+VXNiVmVuZG9yUmVxQnVmLCBUcmFuc2ZlckJ1ZmZlckxlbmd0aCk7CisKKwkJICAgCWlmIChSZXF1ZXN0VHlwZSA9PSBERVZJQ0VfVkVORE9SX1JFUVVFU1RfT1VUKQorCQkgICAJIE5kaXNNb3ZlTWVtb3J5KHRtcEJ1ZiwgVHJhbnNmZXJCdWZmZXIsIFRyYW5zZmVyQnVmZmVyTGVuZ3RoKTsKKwkJfQorI2VuZGlmIC8vIElORl9BTUFaT05fU0UgLy8KKwkJZG8geworCQlpZiggUmVxdWVzdFR5cGUgPT0gREVWSUNFX1ZFTkRPUl9SRVFVRVNUX09VVCkKKwkJCXJldD11c2JfY29udHJvbF9tc2cocE9iai0+cFVzYl9EZXYsIHVzYl9zbmRjdHJscGlwZSggcE9iai0+cFVzYl9EZXYsIDAgKSwgUmVxdWVzdCwgUmVxdWVzdFR5cGUsIFZhbHVlLEluZGV4LCB0bXBCdWYsIFRyYW5zZmVyQnVmZmVyTGVuZ3RoLCBDT05UUk9MX1RJTUVPVVRfSklGRklFUyk7CisJCWVsc2UgaWYoUmVxdWVzdFR5cGUgPT0gREVWSUNFX1ZFTkRPUl9SRVFVRVNUX0lOKQorCQkJcmV0PXVzYl9jb250cm9sX21zZyhwT2JqLT5wVXNiX0RldiwgdXNiX3JjdmN0cmxwaXBlKCBwT2JqLT5wVXNiX0RldiwgMCApLCBSZXF1ZXN0LCBSZXF1ZXN0VHlwZSwgVmFsdWUsSW5kZXgsIHRtcEJ1ZiwgVHJhbnNmZXJCdWZmZXJMZW5ndGgsIENPTlRST0xfVElNRU9VVF9KSUZGSUVTKTsKKwkJZWxzZQorCQl7CisJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJ2ZW5kb3IgcmVxdWVzdCBkaXJlY3Rpb24gaXMgZmFpbGVkXG4iKSk7CisJCQlyZXQgPSAtMTsKKwkJfQorCisJCQlyZXRyeUNvdW50Kys7CisJCQlpZiAocmV0IDwgMCkgeworCQkJCXByaW50aygiI1xuIik7CisJCQkJUlRNUHVzZWNEZWxheSg1MDAwKTsKKwkJCX0KKwkJfSB3aGlsZSgocmV0IDwgMCkgJiYgKHJldHJ5Q291bnQgPCBNQVhfUkVUUllfQ09VTlQpKTsKKworI2lmZGVmIElORl9BTUFaT05fU0UKKwkgIAlpZiAoKHBBZC0+VXNiVmVuZG9yUmVxQnVmKSAmJiAoUmVxdWVzdFR5cGUgPT0gREVWSUNFX1ZFTkRPUl9SRVFVRVNUX0lOKSkKKwkJCU5kaXNNb3ZlTWVtb3J5KFRyYW5zZmVyQnVmZmVyLCB0bXBCdWYsIFRyYW5zZmVyQnVmZmVyTGVuZ3RoKTsKKwkgIAl1cCgmKHBBZC0+VXNiVmVuZG9yUmVxX3NlbWFwaG9yZSkpOworI2VuZGlmIC8vIElORl9BTUFaT05fU0UgLy8KKworICAgICAgICBpZiAocmV0IDwgMCkgeworLy8JCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJVU0JWZW5kb3JSZXF1ZXN0IGZhaWxlZCByZXQ9JWQgXG4iLHJldCkpOworCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiUlRVU0JfVmVuZG9yUmVxdWVzdCBmYWlsZWQoJWQpLFR4RmxhZ3M9MHgleCwgUmVxVHlwZT0lcywgUmVxPTB4JXgsIEluZGV4PTB4JXhcbiIsCisJCQkJCQlyZXQsIFRyYW5zZmVyRmxhZ3MsIChSZXF1ZXN0VHlwZSA9PSBERVZJQ0VfVkVORE9SX1JFUVVFU1RfT1VUID8gIk9VVCIgOiAiSU4iKSwgUmVxdWVzdCwgSW5kZXgpKTsKKwkJCWlmIChSZXF1ZXN0ID09IDB4MikKKwkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJcdFJlcXVlc3QgVmFsdWU9MHglMDR4IVxuIiwgVmFsdWUpKTsKKworCQkJaWYgKChUcmFuc2ZlckJ1ZmZlciE9IE5VTEwpICYmIChUcmFuc2ZlckJ1ZmZlckxlbmd0aCA+IDApKQorCQkJCWhleF9kdW1wKCJGYWlsZWQgVHJhbnNmZXJCdWZmZXIgdmFsdWUiLCBUcmFuc2ZlckJ1ZmZlciwgVHJhbnNmZXJCdWZmZXJMZW5ndGgpOworICAgICAgICB9CisKKyNpZiAwCisgICAgICAgIC8vIHJldHJ5CisJCWlmIChyZXQgPCAwKSB7CisJCQlpbnQgdGVtcF9pPTA7CisJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJVU0JWZW5kb3JSZXF1ZXN0IGZhaWxlZCByZXQ9JWQsIFxuIixyZXQpKTsKKwkJCXJldCA9IDA7CisJCQlkbworCQkJeworCQkJCWlmKCBSZXF1ZXN0VHlwZSA9PSBERVZJQ0VfVkVORE9SX1JFUVVFU1RfT1VUKQorCQkJCQlyZXQ9dXNiX2NvbnRyb2xfbXNnKHBPYmotPnBVc2JfRGV2LCB1c2Jfc25kY3RybHBpcGUoIHBPYmotPnBVc2JfRGV2LCAwICksIFJlcXVlc3QsIFJlcXVlc3RUeXBlLCBWYWx1ZSxJbmRleCwgVHJhbnNmZXJCdWZmZXIsIFRyYW5zZmVyQnVmZmVyTGVuZ3RoLCBDT05UUk9MX1RJTUVPVVRfSklGRklFUyk7CisJCQkJZWxzZSBpZihSZXF1ZXN0VHlwZSA9PSBERVZJQ0VfVkVORE9SX1JFUVVFU1RfSU4pCisJCQkJCXJldD11c2JfY29udHJvbF9tc2cocE9iai0+cFVzYl9EZXYsIHVzYl9yY3ZjdHJscGlwZSggcE9iai0+cFVzYl9EZXYsIDAgKSwgUmVxdWVzdCwgUmVxdWVzdFR5cGUsIFZhbHVlLEluZGV4LCBUcmFuc2ZlckJ1ZmZlciwgVHJhbnNmZXJCdWZmZXJMZW5ndGgsIENPTlRST0xfVElNRU9VVF9KSUZGSUVTKTsKKwkJCQl0ZW1wX2krKzsKKwkJCX0gd2hpbGUoIChyZXQgPCAwKSAmJiAodGVtcF9pIDw9IDEpICk7CisKKwkJCWlmKCByZXQgPj0gMCkKKwkJCQlyZXR1cm4gcmV0OworCisJCX0KKyNlbmRpZgorCisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCSAgQ3JlYXRlcyBhbiBJUlAgdG8gc3VibWl0ZSBhbiBJT0NUTF9JTlRFUk5BTF9VU0JfUkVTRVRfUE9SVAorCSAgc3luY2hyb25vdXNseS4gQ2FsbGVycyBvZiB0aGlzIGZ1bmN0aW9uIG11c3QgYmUgcnVubmluZyBhdAorCSAgUEFTU0lWRSBMRVZFTC4KKworCUFyZ3VtZW50czoKKworCVJldHVybiBWYWx1ZToKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitOVFNUQVRVUwlSVFVTQl9SZXNldERldmljZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCkKK3sKKwlOVFNUQVRVUwkJU3RhdHVzID0gVFJVRTsKKworCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCItLS0+VVNCX1Jlc2V0RGV2aWNlXG4iKSk7CisJLy9SVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUyk7CisJcmV0dXJuIFN0YXR1czsKK30KKworVk9JRCBDTURIYW5kbGVyKAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCVBDbWRRRWxtdAkJY21kcWVsbXQ7CisJUFVDSEFSCQkJcERhdGE7CisJTkRJU19TVEFUVVMJCU5kaXNTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworLy8JVUxPTkcJCQlOb3cgPSAwOworCU5UU1RBVFVTCQludFN0YXR1czsKKy8vCXVuc2lnbmVkIGxvbmcJSXJxRmxhZ3M7CisKKwl3aGlsZSAocEFkLT5DbWRRLnNpemUgPiAwKQorCXsKKwkJTmRpc1N0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisKKwkJTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5DbWRRTG9jayk7CisJCVJUVVNCRGVxdWV1ZUNtZCgmcEFkLT5DbWRRLCAmY21kcWVsbXQpOworCQlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPkNtZFFMb2NrKTsKKworCQlpZiAoY21kcWVsbXQgPT0gTlVMTCkKKwkJCWJyZWFrOworCisJCXBEYXRhID0gY21kcWVsbXQtPmJ1ZmZlcjsKKworCQlpZighKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSB8fCBSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUykpKQorCQl7CisJCQlzd2l0Y2ggKGNtZHFlbG10LT5jb21tYW5kKQorCQkJeworCQkJCWNhc2UgQ01EVEhSRUFEX0NIRUNLX0dQSU86CisJCQkJCXsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJCQkJCVVJTlQzMiBkYXRhOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworI2lmZGVmIFJBTElOS19BVEUKKyAgICAgICAJCQkJCWlmKEFURV9PTihwQWQpKQorCQkJCQkJeworCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlRoZSBkcml2ZXIgaXMgaW4gQVRFIG1vZGUgbm93XG4iKSk7CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisKKworCQkJCQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJCQkJCXsKKwkJCQkJCQkvLyBSZWFkIEdQSU8gcGluMiBhcyBIYXJkd2FyZSBjb250cm9sbGVkIHJhZGlvIHN0YXRlCisKKwkJCQkJCQlSVFVTQlJlYWRNQUNSZWdpc3RlciggcEFkLCBHUElPX0NUUkxfQ0ZHLCAmZGF0YSk7CisKKwkJCQkJCQlpZiAoZGF0YSAmIDB4MDQpCisJCQkJCQkJeworCQkJCQkJCQlwQWQtPlN0YUNmZy5iSHdSYWRpbyA9IFRSVUU7CisJCQkJCQkJfQorCQkJCQkJCWVsc2UKKwkJCQkJCQl7CisJCQkJCQkJCXBBZC0+U3RhQ2ZnLmJId1JhZGlvID0gRkFMU0U7CisJCQkJCQkJfQorCisJCQkJCQkJaWYocEFkLT5TdGFDZmcuYlJhZGlvICE9IChwQWQtPlN0YUNmZy5iSHdSYWRpbyAmJiBwQWQtPlN0YUNmZy5iU3dSYWRpbykpCisJCQkJCQkJeworCQkJCQkJCQlwQWQtPlN0YUNmZy5iUmFkaW8gPSAocEFkLT5TdGFDZmcuYkh3UmFkaW8gJiYgcEFkLT5TdGFDZmcuYlN3UmFkaW8pOworCQkJCQkJCQlpZihwQWQtPlN0YUNmZy5iUmFkaW8gPT0gVFJVRSkKKwkJCQkJCQkJeworCQkJCQkJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCAoIiEhISBSYWRpbyBPbiAhISFcbiIpKTsKKworCQkJCQkJCQkJTWxtZVJhZGlvT24ocEFkKTsKKwkJCQkJCQkJCS8vIFVwZGF0ZSBleHRyYSBpbmZvcm1hdGlvbgorCQkJCQkJCQkJcEFkLT5FeHRyYUluZm8gPSBFWFRSQV9JTkZPX0NMRUFSOworCQkJCQkJCQl9CisJCQkJCQkJCWVsc2UKKwkJCQkJCQkJeworCQkJCQkJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCAoIiEhISBSYWRpbyBPZmYgISEhXG4iKSk7CisKKwkJCQkJCQkJCU1sbWVSYWRpb09mZihwQWQpOworCQkJCQkJCQkJLy8gVXBkYXRlIGV4dHJhIGluZm9ybWF0aW9uCisJCQkJCQkJCQlwQWQtPkV4dHJhSW5mbyA9IEhXX1JBRElPX09GRjsKKwkJCQkJCQkJfQorCQkJCQkJCX0KKwkJCQkJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwkJCQkJfQorCQkJCQlicmVhazsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQkJCWNhc2UgQ01EVEhSRUFEX1FLRVJJT0RJQ19FWEVDVVQ6CisJCQkJCXsKKwkJCQkJCVN0YVF1aWNrUmVzcG9uZUZvclJhdGVVcEV4ZWMoTlVMTCwgcEFkLCBOVUxMLCBOVUxMKTsKKwkJCQkJfQorCQkJCQlicmVhazsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCQkJCWNhc2UgQ01EVEhSRUFEX1JFU0VUX0JVTEtfT1VUOgorCQkJCQl7CisJCQkJCQlVSU5UMzIJCU1BQ1ZhbHVlOworCQkJCQkJVUNIQVIJCUluZGV4OworCQkJCQkJaW50CQkJcmV0PTA7CisJCQkJCQlQSFRfVFhfQ09OVEVYVAlwSFRUWENvbnRleHQ7CisvLwkJCQkJCVJUTVBfVFhfUklORyAqcFR4UmluZzsKKwkJCQkJCXVuc2lnbmVkIGxvbmcgSXJxRmxhZ3M7CisjaWZkZWYgUkFMSU5LX0FURQorCQkJCQkJUFRYX0NPTlRFWFQJCXBOdWxsQ29udGV4dCA9ICYocEFkLT5OdWxsQ29udGV4dCk7CisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCQkJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIkNtZFRocmVhZCA6IENNRFRIUkVBRF9SRVNFVF9CVUxLX09VVChSZXNldFBpcGVpZD0weCUweCk9PT0+XG4iLCBwQWQtPmJ1bGtSZXNldFBpcGVpZCkpOworCQkJCQkJLy8gQWxsIHRyYW5zZmVycyBtdXN0IGJlIGFib3J0ZWQgb3IgY2FuY2VsbGVkIGJlZm9yZSBhdHRlbXB0aW5nIHRvIHJlc2V0IHRoZSBwaXBlLgorCQkJCQkJLy9SVFVTQkNhbmNlbFBlbmRpbmdCdWxrT3V0SVJQKHBBZCk7CisJCQkJCQkvLyBXYWl0IDEwbXMgdG8gbGV0IHByZXZpb3VzIHBhY2tldCB0aGF0IGFyZSBhbHJlYWR5IGluIEhXIEZJRk8gdG8gY2xlYXIuIGJ5IE1BWExFRSAxMi0yNS0yMDA3CisJCQkJCQlJbmRleCA9IDA7CisJCQkJCQlkbworCQkJCQkJeworCQkJCQkJCVJUVVNCUmVhZE1BQ1JlZ2lzdGVyKHBBZCwgVFhSWFFfUENOVCwgJk1BQ1ZhbHVlKTsKKwkJCQkJCQlpZiAoKE1BQ1ZhbHVlICYgMHhmMDAwMDAvKjB4ODAwMDAwKi8pID09IDApCisJCQkJCQkJCWJyZWFrOworCQkJCQkJCUluZGV4Kys7CisJCQkJCQkJUlRNUHVzZWNEZWxheSgxMDAwMCk7CisJCQkJCQl9d2hpbGUoSW5kZXggPCAxMDApOworCQkJCQkJTUFDVmFsdWUgPSAwOworCQkJCQkJUlRVU0JSZWFkTUFDUmVnaXN0ZXIocEFkLCBVU0JfRE1BX0NGRywgJk1BQ1ZhbHVlKTsKKwkJCQkJCS8vIFRvIHByZXZlbnQgUmVhZCBSZWdpc3RlciBlcnJvciwgd2UgMm5kIGNoZWNrIHRoZSB2YWxpZGl0eS4KKwkJCQkJCWlmICgoTUFDVmFsdWUgJiAweGMwMDAwMCkgPT0gMCkKKwkJCQkJCQlSVFVTQlJlYWRNQUNSZWdpc3RlcihwQWQsIFVTQl9ETUFfQ0ZHLCAmTUFDVmFsdWUpOworCQkJCQkJLy8gVG8gcHJldmVudCBSZWFkIFJlZ2lzdGVyIGVycm9yLCB3ZSAzcmQgY2hlY2sgdGhlIHZhbGlkaXR5LgorCQkJCQkJaWYgKChNQUNWYWx1ZSAmIDB4YzAwMDAwKSA9PSAwKQorCQkJCQkJCVJUVVNCUmVhZE1BQ1JlZ2lzdGVyKHBBZCwgVVNCX0RNQV9DRkcsICZNQUNWYWx1ZSk7CisJCQkJCQlNQUNWYWx1ZSB8PSAweDgwMDAwOworCQkJCQkJUlRVU0JXcml0ZU1BQ1JlZ2lzdGVyKHBBZCwgVVNCX0RNQV9DRkcsIE1BQ1ZhbHVlKTsKKworCQkJCQkJLy8gV2FpdCAxbXMgdG8gcHJldmVudCBuZXh0IFVSQiB0byBidWxrb3V0IGJlZm9yZSBIVyByZXNldC4gYnkgTUFYTEVFIDEyLTI1LTIwMDcKKwkJCQkJCVJUTVB1c2VjRGVsYXkoMTAwMCk7CisKKwkJCQkJCU1BQ1ZhbHVlICY9ICh+MHg4MDAwMCk7CisJCQkJCQlSVFVTQldyaXRlTUFDUmVnaXN0ZXIocEFkLCBVU0JfRE1BX0NGRywgTUFDVmFsdWUpOworCQkJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIlx0U2V0IDB4MmEwIGJpdDE5LiBDbGVhciBVU0IgRE1BIFRYIHBhdGhcbiIpKTsKKworCQkJCQkJLy8gV2FpdCA1bXMgdG8gcHJldmVudCBuZXh0IFVSQiB0byBidWxrb3V0IGJlZm9yZSBIVyByZXNldC4gYnkgTUFYTEVFIDEyLTI1LTIwMDcKKwkJCQkJCS8vUlRNUHVzZWNEZWxheSg1MDAwKTsKKworCQkJCQkJaWYgKChwQWQtPmJ1bGtSZXNldFBpcGVpZCAmIEJVTEtPVVRfTUdNVF9SRVNFVF9GTEFHKSA9PSBCVUxLT1VUX01HTVRfUkVTRVRfRkxBRykKKwkJCQkJCXsKKwkJCQkJCQlSVE1QX0NMRUFSX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JVTEtPVVRfUkVTRVQpOworCQkJCQkJCWlmIChwQWQtPk1nbXRSaW5nLlR4U3dGcmVlSWR4IDwgTUdNVF9SSU5HX1NJWkUgLyogcE1MTUVDb250ZXh0LT5iV2FpdGluZ0J1bGtPdXQgPT0gVFJVRSAqLykKKwkJCQkJCQl7CisJCQkJCQkJCVJUVVNCX1NFVF9CVUxLX0ZMQUcocEFkLCBmUlRVU0JfQlVMS19PVVRfTUxNRSk7CisJCQkJCQkJfQorCQkJCQkJCVJUVVNCS2lja0J1bGtPdXQocEFkKTsKKworCQkJCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCJcdFRYIE1HTVQgUkVDT1ZFUiBEb25lIVxuIikpOworCQkJCQkJfQorCQkJCQkJZWxzZQorCQkJCQkJeworCQkJCQkJCXBIVFRYQ29udGV4dCA9ICYocEFkLT5UeENvbnRleHRbcEFkLT5idWxrUmVzZXRQaXBlaWRdKTsKKwkJCQkJCQkvL05kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+QnVsa091dExvY2tbcEFkLT5idWxrUmVzZXRQaXBlaWRdKTsKKwkJCQkJCQlSVE1QX0lOVF9MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrW3BBZC0+YnVsa1Jlc2V0UGlwZWlkXSwgSXJxRmxhZ3MpOworCQkJCQkJCWlmICggcEFkLT5CdWxrT3V0UGVuZGluZ1twQWQtPmJ1bGtSZXNldFBpcGVpZF0gPT0gRkFMU0UpCisJCQkJCQkJeworCQkJCQkJCQlwQWQtPkJ1bGtPdXRQZW5kaW5nW3BBZC0+YnVsa1Jlc2V0UGlwZWlkXSA9IFRSVUU7CisJCQkJCQkJCXBIVFRYQ29udGV4dC0+SVJQUGVuZGluZyA9IFRSVUU7CisJCQkJCQkJCXBBZC0+d2F0Y2hEb2dUeFBlbmRpbmdDbnRbcEFkLT5idWxrUmVzZXRQaXBlaWRdID0gMTsKKworCQkJCQkJCQkvLyBubyBtYXR0ZXIgd2hhdCwgY2xlYW4gdGhlIGZsYWcKKwkJCQkJCQkJUlRNUF9DTEVBUl9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CVUxLT1VUX1JFU0VUKTsKKworCQkJCQkJCQkvL05kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+QnVsa091dExvY2tbcEFkLT5idWxrUmVzZXRQaXBlaWRdKTsKKwkJCQkJCQkJUlRNUF9JTlRfVU5MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrW3BBZC0+YnVsa1Jlc2V0UGlwZWlkXSwgSXJxRmxhZ3MpOworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZkZWYgUkFMSU5LX0FURQorCQkJCQkJCQlpZihBVEVfT04ocEFkKSkKKwkJCQkJCQkgICAgeworCQkJCQkJCQkJcE51bGxDb250ZXh0LT5JUlBQZW5kaW5nID0gVFJVRTsKKwkJCQkJCQkJCS8vCisJCQkJCQkJCQkvLyBJZiBkcml2ZXIgaXMgc3RpbGwgaW4gQVRFIFRYRlJBTUUgbW9kZSwKKwkJCQkJCQkJCS8vIGtlZXAgb24gdHJhbnNtaXR0aW5nIEFURSBmcmFtZXMuCisJCQkJCQkJCQkvLworCQkJCQkJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoInBBZC0+YXRlLk1vZGUgPT0gJWRcbnBBZC0+Q29udGluQnVsa091dCA9PSAlZFxucEFkLT5CdWxrT3V0UmVtYWluZWQgPT0gJWRcbiIsIHBBZC0+YXRlLk1vZGUsIHBBZC0+Q29udGluQnVsa091dCwgYXRvbWljX3JlYWQoJnBBZC0+QnVsa091dFJlbWFpbmVkKSkpOworCQkJCQkJCQkJaWYoKHBBZC0+YXRlLk1vZGUgPT0gQVRFX1RYRlJBTUUpICYmICgocEFkLT5Db250aW5CdWxrT3V0ID09IFRSVUUpIHx8IChhdG9taWNfcmVhZCgmcEFkLT5CdWxrT3V0UmVtYWluZWQpID4gMCkpKQorCQkJCQkJCQkgICAgeworCQkJCQkJCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCJBZnRlciBDTURUSFJFQURfUkVTRVRfQlVMS19PVVQsIGNvbnRpbnVlIHRvIGJ1bGsgb3V0IGZyYW1lcyAhXG4iKSk7CisKKwkJCQkJCQkJCQkvLyBJbml0IFR4IGNvbnRleHQgZGVzY3JpcHRvcgorCQkJCQkJCQkJCVJUVVNCSW5pdFR4RGVzYyhwQWQsIHBOdWxsQ29udGV4dCwgMC8qIHBBZC0+YnVsa1Jlc2V0UGlwZWlkICovLCAodXNiX2NvbXBsZXRlX3QpQVRFX1JUVVNCQnVsa091dERhdGFQYWNrZXRDb21wbGV0ZSk7CisKKwkJCQkJCQkJCQlpZigocmV0ID0gUlRVU0JfU1VCTUlUX1VSQihwTnVsbENvbnRleHQtPnBVcmIpKSE9MCkKKwkJCQkJCQkJCQl7CisJCQkJCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkFURV9SVFVTQkJ1bGtPdXREYXRhUGFja2V0OiBTdWJtaXQgVHggVVJCIGZhaWxlZCAlZFxuIiwgcmV0KSk7CisJCQkJCQkJCQkJfQorCisJCQkJCQkJCQkJcEFkLT5CdWxrT3V0UmVxKys7CisJCQkJCQkJCQl9CisJCQkJCQkJCX0KKwkJCQkJCQkJZWxzZQorI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCQkJCQkJCQl7CisJCQkJCQkJCVJUVVNCSW5pdEhUVHhEZXNjKHBBZCwgcEhUVFhDb250ZXh0LCBwQWQtPmJ1bGtSZXNldFBpcGVpZCwgcEhUVFhDb250ZXh0LT5CdWxrT3V0U2l6ZSwgKHVzYl9jb21wbGV0ZV90KVJUVVNCQnVsa091dERhdGFQYWNrZXRDb21wbGV0ZSk7CisKKwkJCQkJCQkJaWYoKHJldCA9IFJUVVNCX1NVQk1JVF9VUkIocEhUVFhDb250ZXh0LT5wVXJiKSkhPTApCisJCQkJCQkJCXsKKwkJCQkJCQkJCQlSVE1QX0lOVF9MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrW3BBZC0+YnVsa1Jlc2V0UGlwZWlkXSwgSXJxRmxhZ3MpOworCQkJCQkJCQkJcEFkLT5CdWxrT3V0UGVuZGluZ1twQWQtPmJ1bGtSZXNldFBpcGVpZF0gPSBGQUxTRTsKKwkJCQkJCQkJCXBIVFRYQ29udGV4dC0+SVJQUGVuZGluZyA9IEZBTFNFOworCQkJCQkJCQkJCXBBZC0+d2F0Y2hEb2dUeFBlbmRpbmdDbnRbcEFkLT5idWxrUmVzZXRQaXBlaWRdID0gMDsKKwkJCQkJCQkJCQlSVE1QX0lOVF9VTkxPQ0soJnBBZC0+QnVsa091dExvY2tbcEFkLT5idWxrUmVzZXRQaXBlaWRdLCBJcnFGbGFncyk7CisKKwkJCQkJCQkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJDbWRUaHJlYWQgOiBDTURUSFJFQURfUkVTRVRfQlVMS19PVVQ6IFN1Ym1pdCBUeCBVUkIgZmFpbGVkICVkXG4iLCByZXQpKTsKKwkJCQkJCQkJfQorCQkJCQkJCQkJZWxzZQorCQkJCQkJCQkJeworCQkJCQkJCQkJCVJUTVBfSVJRX0xPQ0soJnBBZC0+QnVsa091dExvY2tbcEFkLT5idWxrUmVzZXRQaXBlaWRdLCBJcnFGbGFncyk7CisJCQkJCQkJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCgiXHRDTURUSFJFQURfUkVTRVRfQlVMS19PVVQ6IFR4Q29udGV4dFslZF06Q1dQb3M9JWxkLCBOQlBvcz0lbGQsIEVOQlBvcz0lbGQsIGJDb3B5PSVkLCBwZW5kaW5nPSVkIVxuIiwKKwkJCQkJCQkJCQkJCXBBZC0+YnVsa1Jlc2V0UGlwZWlkLCBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24sIHBIVFRYQ29udGV4dC0+TmV4dEJ1bGtPdXRQb3NpdGlvbiwKKwkJCQkJCQkJCQkJCQkJCXBIVFRYQ29udGV4dC0+RU5leHRCdWxrT3V0UG9zaXRpb24sIHBIVFRYQ29udGV4dC0+YkNvcHlTYXZlUGFkLCBwQWQtPkJ1bGtPdXRQZW5kaW5nW3BBZC0+YnVsa1Jlc2V0UGlwZWlkXSkpOworCQkJCQkJCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwoIlx0XHRCdWxrT3V0IFJlcT0weCVseCwgQ29tcGxldGU9MHglbHgsIE90aGVyPTB4JWx4XG4iLAorCQkJCQkJCQkJCQkJCQkJcEFkLT5CdWxrT3V0UmVxLCBwQWQtPkJ1bGtPdXRDb21wbGV0ZSwgcEFkLT5CdWxrT3V0Q29tcGxldGVPdGhlcikpOworCQkJCQkJCQkJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5CdWxrT3V0TG9ja1twQWQtPmJ1bGtSZXNldFBpcGVpZF0sIElycUZsYWdzKTsKKwkJCQkJCQkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiXHRDTURUSFJFQURfUkVTRVRfQlVMS19PVVQ6IFN1Ym1pdCBUeCBEQVRBIFVSQiBmb3IgZmFpbGVkIEJ1bGtSZXEoMHglbHgpIERvbmUsIHN0YXR1cz0lZCFcbiIsIHBBZC0+YnVsa1Jlc2V0UmVxW3BBZC0+YnVsa1Jlc2V0UGlwZWlkXSwgcEhUVFhDb250ZXh0LT5wVXJiLT5zdGF0dXMpKTsKKworCQkJCQkJCQkJfQorCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJCWVsc2UKKwkJCQkJCQl7CisJCQkJCQkJCS8vTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5CdWxrT3V0TG9ja1twQWQtPmJ1bGtSZXNldFBpcGVpZF0pOworCQkJCQkJCQkvL1JUTVBfSU5UX1VOTE9DSygmcEFkLT5CdWxrT3V0TG9ja1twQWQtPmJ1bGtSZXNldFBpcGVpZF0sIElycUZsYWdzKTsKKworCQkJCQkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgiQ21kVGhyZWFkIDogVFggREFUQSBSRUNPVkVSIEZBSUwgZm9yIEJ1bGtSZXEoMHglbHgpIGJlY2F1c2UgQnVsa091dFBlbmRpbmdbJWRdIGlzIFRSVUUhXG4iLCBwQWQtPmJ1bGtSZXNldFJlcVtwQWQtPmJ1bGtSZXNldFBpcGVpZF0sIHBBZC0+YnVsa1Jlc2V0UGlwZWlkKSk7CisJCQkJCQkJCWlmIChwQWQtPmJ1bGtSZXNldFBpcGVpZCA9PSAwKQorCQkJCQkJCQl7CisJCQkJCQkJCQlVQ0hBUglwZW5kaW5nQ29udGV4dCA9IDA7CisJCQkJCQkJCQlQSFRfVFhfQ09OVEVYVCBwSFRUWENvbnRleHQgPSAoUEhUX1RYX0NPTlRFWFQpKCZwQWQtPlR4Q29udGV4dFtwQWQtPmJ1bGtSZXNldFBpcGVpZCBdKTsKKwkJCQkJCQkJCVBUWF9DT05URVhUIHBNTE1FQ29udGV4dCA9IChQVFhfQ09OVEVYVCkocEFkLT5NZ210UmluZy5DZWxsW3BBZC0+TWdtdFJpbmcuVHhEbWFJZHhdLkFsbG9jVmEpOworCQkJCQkJCQkJUFRYX0NPTlRFWFQgcE5VTExDb250ZXh0ID0gKFBUWF9DT05URVhUKSgmcEFkLT5Qc1BvbGxDb250ZXh0KTsKKwkJCQkJCQkJCVBUWF9DT05URVhUIHBQc1BvbGxDb250ZXh0ID0gKFBUWF9DT05URVhUKSgmcEFkLT5OdWxsQ29udGV4dCk7CisKKwkJCQkJCQkJCWlmIChwSFRUWENvbnRleHQtPklSUFBlbmRpbmcpCisJCQkJCQkJCQkJcGVuZGluZ0NvbnRleHQgfD0gMTsKKwkJCQkJCQkJCWVsc2UgaWYgKHBNTE1FQ29udGV4dC0+SVJQUGVuZGluZykKKwkJCQkJCQkJCQlwZW5kaW5nQ29udGV4dCB8PSAyOworCQkJCQkJCQkJZWxzZSBpZiAocE5VTExDb250ZXh0LT5JUlBQZW5kaW5nKQorCQkJCQkJCQkJCXBlbmRpbmdDb250ZXh0IHw9IDQ7CisJCQkJCQkJCQllbHNlIGlmIChwUHNQb2xsQ29udGV4dC0+SVJQUGVuZGluZykKKwkJCQkJCQkJCQlwZW5kaW5nQ29udGV4dCB8PSA4OworCQkJCQkJCQkJZWxzZQorCQkJCQkJCQkJCXBlbmRpbmdDb250ZXh0ID0gMDsKKworCQkJCQkJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCAoIlx0VFggT2NjdXBpZWQgYnkgJWQhXG4iLCBwZW5kaW5nQ29udGV4dCkpOworCQkJCQkJCQl9CisKKwkJCQkJCQkvLyBubyBtYXR0ZXIgd2hhdCwgY2xlYW4gdGhlIGZsYWcKKwkJCQkJCQlSVE1QX0NMRUFSX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JVTEtPVVRfUkVTRVQpOworCisJCQkJCQkJCVJUTVBfSU5UX1VOTE9DSygmcEFkLT5CdWxrT3V0TG9ja1twQWQtPmJ1bGtSZXNldFBpcGVpZF0sIElycUZsYWdzKTsKKworCQkJCQkJCQlSVFVTQl9TRVRfQlVMS19GTEFHKHBBZCwgKGZSVFVTQl9CVUxLX09VVF9EQVRBX05PUk1BTCA8PCBwQWQtPmJ1bGtSZXNldFBpcGVpZCkpOworCQkJCQkJCX0KKworCQkJCQkJCVJUTVBEZVF1ZXVlUGFja2V0KHBBZCwgRkFMU0UsIE5VTV9PRl9UWF9SSU5HLCBNQVhfVFhfUFJPQ0VTUyk7CisJCQkJCQkJLy9SVFVTQktpY2tCdWxrT3V0KHBBZCk7CisJCQkJCQl9CisKKwkJCQkJfQorCQkJCQkvKgorCQkJCQkJLy8gRG9uJ3QgY2FuY2VsIEJVTEtJTi4KKwkJCQkJCXdoaWxlICgoYXRvbWljX3JlYWQoJnBBZC0+UGVuZGluZ1J4KSA+IDApICYmCisJCQkJCQkJCSghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSkKKwkJCQkJCXsKKwkJCQkJCQlpZiAoYXRvbWljX3JlYWQoJnBBZC0+UGVuZGluZ1J4KSA+IDApCisJCQkJCQkJeworCQkJCQkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgiQnVsa0luIElSUCBQZW5kaW5nISFjYW5jZWwgaXQhXG4iKSk7CisJCQkJCQkJCVJUVVNCQ2FuY2VsUGVuZGluZ0J1bGtJbklSUChwQWQpOworCQkJCQkJCX0KKwkJCQkJCQlSVE1QdXNlY0RlbGF5KDEwMDAwMCk7CisJCQkJCQl9CisKKwkJCQkJCWlmICgoYXRvbWljX3JlYWQoJnBBZC0+UGVuZGluZ1J4KSA9PSAwKSAmJiAoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKSkpCisJCQkJCQl7CisJCQkJCQkJVUNIQVIJaTsKKwkJCQkJCQlSVFVTQlJ4UGFja2V0KHBBZCk7CisJCQkJCQkJcEFkLT5OZXh0UnhCdWxrSW5SZWFkSW5kZXggPSAwOwkvLyBOZXh0IFJ4IFJlYWQgaW5kZXgKKwkJCQkJCQlwQWQtPk5leHRSeEJ1bGtJbkluZGV4CQk9IDA7CS8vIFJ4IEJ1bGsgcG9pbnRlcgorCQkJCQkJCWZvciAoaSA9IDA7IGkgPCAoUlhfUklOR19TSVpFKTsgaSsrKQorCQkJCQkJCXsKKwkJCQkJCQkJUFJYX0NPTlRFWFQgIHBSeENvbnRleHQgPSAmKHBBZC0+UnhDb250ZXh0W2ldKTsKKworCQkJCQkJCQlwUnhDb250ZXh0LT5wQWQJPSBwQWQ7CisJCQkJCQkJCXBSeENvbnRleHQtPkluVXNlCQk9IEZBTFNFOworCQkJCQkJCQlwUnhDb250ZXh0LT5JUlBQZW5kaW5nCT0gRkFMU0U7CisJCQkJCQkJCXBSeENvbnRleHQtPlJlYWRhYmxlCT0gRkFMU0U7CisJCQkJCQkJCXBSeENvbnRleHQtPlJlb3JkZXJJblVzZSA9IEZBTFNFOworCisJCQkJCQkJfQorCQkJCQkJCVJUVVNCQnVsa1JlY2VpdmUocEFkKTsKKwkJCQkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgiUlRVU0JCdWxrUmVjZWl2ZVxuIikpOworCQkJCQkJfSovCisJCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCJDbWRUaHJlYWQgOiBDTURUSFJFQURfUkVTRVRfQlVMS19PVVQ8PT09XG4iKSk7CisgICAgCSAgIAkJCWJyZWFrOworCisJCQkJY2FzZSBDTURUSFJFQURfUkVTRVRfQlVMS19JTjoKKwkJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIkNtZFRocmVhZCA6IENNRFRIUkVBRF9SRVNFVF9CVUxLX0lOID09PSA+XG4iKSk7CisKKwkJCQkJLy8gQWxsIHRyYW5zZmVycyBtdXN0IGJlIGFib3J0ZWQgb3IgY2FuY2VsbGVkIGJlZm9yZSBhdHRlbXB0aW5nIHRvIHJlc2V0IHRoZSBwaXBlLgorCQkJCQl7CisJCQkJCQlVSU5UMzIJCU1BQ1ZhbHVlOworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZkZWYgUkFMSU5LX0FURQorCQkJCQkJaWYgKEFURV9PTihwQWQpKQorCQkJCQkJeworCQkJCQkJCWlmKChwQWQtPlBlbmRpbmdSeCA+IDApICYmICghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSkKKwkJCQkJCQl7CisJCQkJCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwgKCJBVEUgOiBCdWxrSW4gSVJQIFBlbmRpbmchISFcbiIpKTsKKwkJCQkJCQkJQVRFX1JUVVNCQ2FuY2VsUGVuZGluZ0J1bGtJbklSUChwQWQpOworCQkJCQkJCQlSVE1QdXNlY0RlbGF5KDEwMDAwMCk7CisJCQkJCQkJCXBBZC0+UGVuZGluZ1J4ID0gMDsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCQllbHNlCisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJCQkJCQl7CisJCQkJCQkvL3doaWxlICgoYXRvbWljX3JlYWQoJnBBZC0+UGVuZGluZ1J4KSA+IDApICYmICghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSkKKwkJCQkJCWlmKChwQWQtPlBlbmRpbmdSeCA+IDApICYmICghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSkKKwkJCQkJCXsKKwkJCQkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgiQnVsa0luIElSUCBQZW5kaW5nISEhXG4iKSk7CisJCQkJCQkJUlRVU0JDYW5jZWxQZW5kaW5nQnVsa0luSVJQKHBBZCk7CisJCQkJCQkJUlRNUHVzZWNEZWxheSgxMDAwMDApOworCQkJCQkJCXBBZC0+UGVuZGluZ1J4ID0gMDsKKwkJCQkJCX0KKwkJCQkJCX0KKworCQkJCQkJLy8gV2FpdCAxMG1zIGJlZm9yZSByZWFkaW5nIHJlZ2lzdGVyLgorCQkJCQkJUlRNUHVzZWNEZWxheSgxMDAwMCk7CisJCQkJCQludFN0YXR1cyA9IFJUVVNCUmVhZE1BQ1JlZ2lzdGVyKHBBZCwgTUFDX0NTUjAsICZNQUNWYWx1ZSk7CisKKwkJCQkJCWlmICgoTlRfU1VDQ0VTUyhudFN0YXR1cykgPT0gVFJVRSkgJiYKKwkJCQkJCQkoIShSVE1QX1RFU1RfRkxBRyhwQWQsIChmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTIHwgZlJUTVBfQURBUFRFUl9SQURJT19PRkYgfAorCQkJCQkJCQkJCQkJCWZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyB8IGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpKSkpCisJCQkJCQl7CisJCQkJCQkJVUNIQVIJaTsKKworCQkJCQkJCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIChmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTIHwgZlJUTVBfQURBUFRFUl9SQURJT19PRkYgfAorCQkJCQkJCQkJCQkJCQlmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSkKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJcEFkLT5OZXh0UnhCdWxrSW5Qb3NpdGlvbiA9IHBBZC0+UnhDb250ZXh0W3BBZC0+TmV4dFJ4QnVsa0luSW5kZXhdLkJ1bGtJbk9mZnNldDsKKwkJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJCVUxLX0lOX1JFU0VUOiBOQklJZHg9MHgleCxOQklSSWR4PTB4JXgsIEJJUlBvcz0weCVseC4gQklSZXE9eCVseCwgQklDb21wbGV0ZT0weCVseCwgQklDRmFpbDB4JWx4XG4iLAorCQkJCQkJCQkJcEFkLT5OZXh0UnhCdWxrSW5JbmRleCwgIHBBZC0+TmV4dFJ4QnVsa0luUmVhZEluZGV4LCBwQWQtPk5leHRSeEJ1bGtJblBvc2l0aW9uLCBwQWQtPkJ1bGtJblJlcSwgcEFkLT5CdWxrSW5Db21wbGV0ZSwgcEFkLT5CdWxrSW5Db21wbGV0ZUZhaWwpKTsKKwkJCQkJCQlmb3IgKGkgPSAwOyBpIDwgUlhfUklOR19TSVpFOyBpKyspCisJCQkJCQkJeworIAkJCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiXHRSeENvbnRleHRbJWRdOiBJUlBQZW5kaW5nPSVkLCBJblVzZT0lZCwgUmVhZGFibGU9JWQhXG4iCisJCQkJCQkJCQksIGksIHBBZC0+UnhDb250ZXh0W2ldLklSUFBlbmRpbmcsIHBBZC0+UnhDb250ZXh0W2ldLkluVXNlLCBwQWQtPlJ4Q29udGV4dFtpXS5SZWFkYWJsZSkpOworCQkJCQkJCX0KKyAJCQkJCQkJLyoKKworCQkJCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwgKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIpKTsKKworCQkJCQkJCXBBZC0+TmV4dFJ4QnVsa0luUmVhZEluZGV4ID0gMDsJLy8gTmV4dCBSeCBSZWFkIGluZGV4CisJCQkJCQkJcEFkLT5OZXh0UnhCdWxrSW5JbmRleAkJPSAwOwkvLyBSeCBCdWxrIHBvaW50ZXIKKwkJCQkJCQlmb3IgKGkgPSAwOyBpIDwgKFJYX1JJTkdfU0laRSk7IGkrKykKKwkJCQkJCQl7CisJCQkJCQkJCVBSWF9DT05URVhUICBwUnhDb250ZXh0ID0gJihwQWQtPlJ4Q29udGV4dFtpXSk7CisKKwkJCQkJCQkJcFJ4Q29udGV4dC0+cEFkCT0gcEFkOworCQkJCQkJCQlwUnhDb250ZXh0LT5JblVzZQkJPSBGQUxTRTsKKwkJCQkJCQkJcFJ4Q29udGV4dC0+SVJQUGVuZGluZwk9IEZBTFNFOworCQkJCQkJCQlwUnhDb250ZXh0LT5SZWFkYWJsZQk9IEZBTFNFOworCQkJCQkJCQlwUnhDb250ZXh0LT5SZW9yZGVySW5Vc2UgPSBGQUxTRTsKKworCQkJCQkJCX0qLworCQkJCQkJCVJUTVBfQ0xFQVJfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlVMS0lOX1JFU0VUKTsKKwkJCQkJCQlmb3IgKGkgPSAwOyBpIDwgcEFkLT5Db21tb25DZmcuTnVtT2ZCdWxrSW5JUlA7IGkrKykKKwkJCQkJCQl7CisJCQkJCQkJCS8vUlRVU0JCdWxrUmVjZWl2ZShwQWQpOworCQkJCQkJCQlQUlhfQ09OVEVYVAkJcFJ4Q29udGV4dDsKKwkJCQkJCQkJUFVSQgkJCXBVcmI7CisJCQkJCQkJCWludAkJCQlyZXQgPSAwOworCQkJCQkJCQl1bnNpZ25lZCBsb25nCUlycUZsYWdzOworCisKKwkJCQkJCQkJUlRNUF9JUlFfTE9DSygmcEFkLT5CdWxrSW5Mb2NrLCBJcnFGbGFncyk7CisJCQkJCQkJCXBSeENvbnRleHQgPSAmKHBBZC0+UnhDb250ZXh0W3BBZC0+TmV4dFJ4QnVsa0luSW5kZXhdKTsKKwkJCQkJCQkJaWYgKChwQWQtPlBlbmRpbmdSeCA+IDApIHx8IChwUnhDb250ZXh0LT5SZWFkYWJsZSA9PSBUUlVFKSB8fCAocFJ4Q29udGV4dC0+SW5Vc2UgPT0gVFJVRSkpCisJCQkJCQkJCXsKKwkJCQkJCQkJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5CdWxrSW5Mb2NrLCBJcnFGbGFncyk7CisJCQkJCQkJCQlicmVhazsKKwkJCQkJCQkJfQorCQkJCQkJCQlwUnhDb250ZXh0LT5JblVzZSA9IFRSVUU7CisJCQkJCQkJCXBSeENvbnRleHQtPklSUFBlbmRpbmcgPSBUUlVFOworCQkJCQkJCQlwQWQtPlBlbmRpbmdSeCsrOworCQkJCQkJCQlwQWQtPkJ1bGtJblJlcSsrOworCQkJCQkJCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+QnVsa0luTG9jaywgSXJxRmxhZ3MpOworCisJCQkJCQkJCS8vIEluaXQgUnggY29udGV4dCBkZXNjcmlwdG9yCisJCQkJCQkJCVJUVVNCSW5pdFJ4RGVzYyhwQWQsIHBSeENvbnRleHQpOworCQkJCQkJCQlwVXJiID0gcFJ4Q29udGV4dC0+cFVyYjsKKwkJCQkJCQkJaWYgKChyZXQgPSBSVFVTQl9TVUJNSVRfVVJCKHBVcmIpKSE9MCkKKwkJCQkJCQkJewkvLyBmYWlsCisKKwkJCQkJCQkJCVJUTVBfSVJRX0xPQ0soJnBBZC0+QnVsa0luTG9jaywgSXJxRmxhZ3MpOworCQkJCQkJCQkJcFJ4Q29udGV4dC0+SW5Vc2UgPSBGQUxTRTsKKwkJCQkJCQkJCXBSeENvbnRleHQtPklSUFBlbmRpbmcgPSBGQUxTRTsKKwkJCQkJCQkJCXBBZC0+UGVuZGluZ1J4LS07CisJCQkJCQkJCQlwQWQtPkJ1bGtJblJlcS0tOworCQkJCQkJCQkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPkJ1bGtJbkxvY2ssIElycUZsYWdzKTsKKwkJCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkNNRFRIUkVBRF9SRVNFVF9CVUxLX0lOOiBTdWJtaXQgUnggVVJCIGZhaWxlZCglZCksIHN0YXR1cz0lZFxuIiwgcmV0LCBwVXJiLT5zdGF0dXMpKTsKKwkJCQkJCQkJfQorCQkJCQkJCQllbHNlCisJCQkJCQkJCXsJLy8gc3VjY2VzcworI2lmIDAKKwkJCQkJCQkJCVJUTVBfSVJRX0xPQ0soJnBBZC0+QnVsa0luTG9jaywgSXJxRmxhZ3MpOworCQkJCQkJCQkJcFJ4Q29udGV4dC0+SVJQUGVuZGluZyA9IFRSVUU7CisJCQkJCQkJCQkvL05kaXNJbnRlcmxvY2tlZEluY3JlbWVudCgmcEFkLT5QZW5kaW5nUngpOworCQkJCQkJCQkJcEFkLT5QZW5kaW5nUngrKzsKKwkJCQkJCQkJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5CdWxrSW5Mb2NrLCBJcnFGbGFncyk7CisJCQkJCQkJCQlwQWQtPkJ1bGtJblJlcSsrOworI2VuZGlmCisJCQkJCQkJCQkvL3ByaW50aygiQklEb25lLCBQZW5kPSVkLEJJSWR4PSVkLEJJUklkeD0lZCFcbiIsIHBBZC0+UGVuZGluZ1J4LCBwQWQtPk5leHRSeEJ1bGtJbkluZGV4LCBwQWQtPk5leHRSeEJ1bGtJblJlYWRJbmRleCk7CisJCQkJCQkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiQ01EVEhSRUFEX1JFU0VUX0JVTEtfSU46IFN1Ym1pdCBSeCBVUkIgRG9uZSwgc3RhdHVzPSVkIVxuIiwgcFVyYi0+c3RhdHVzKSk7CisJCQkJCQkJCQlBU1NFUlQoKHBSeENvbnRleHQtPkluVXNlID09IHBSeENvbnRleHQtPklSUFBlbmRpbmcpKTsKKwkJCQkJCQkJfQorCQkJCQkJCX0KKworCQkJCQkJfQorCQkJCQkJZWxzZQorCQkJCQkJeworCQkJCQkJCS8vIENhcmQgbXVzdCBiZSByZW1vdmVkCisJCQkJCQkJaWYgKE5UX1NVQ0NFU1MobnRTdGF0dXMpICE9IFRSVUUpCisJCQkJCQkJeworCQkJCQkJCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpOworCQkJCQkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgiQ01EVEhSRUFEX1JFU0VUX0JVTEtfSU46IFJlYWQgUmVnaXN0ZXIgRmFpbGVkIUNhcmQgbXVzdCBiZSByZW1vdmVkISFcblxuIikpOworCQkJCQkJCX0KKwkJCQkJCQllbHNlCisJCQkJCQkJeworCQkJCQkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgiQ01EVEhSRUFEX1JFU0VUX0JVTEtfSU46IENhbm5vdCBkbyBidWxrIGluIGJlY2F1c2UgZmxhZ3MoMHglbHgpIG9uICFcbiIsIHBBZC0+RmxhZ3MpKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQl9CisJCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCJDbWRUaHJlYWQgOiBDTURUSFJFQURfUkVTRVRfQlVMS19JTiA8PT09XG4iKSk7CisJCQkJCWJyZWFrOworCisJCQkJY2FzZSBDTURUSFJFQURfU0VUX0FTSUNfV0NJRDoKKwkJCQkJeworCQkJCQkJUlRfU0VUX0FTSUNfV0NJRAlTZXRBc2ljV2NpZDsKKwkJCQkJCVVTSE9SVAkJb2Zmc2V0OworCQkJCQkJVUlOVDMyCQlNQUNWYWx1ZSwgTUFDUlZhbHVlID0gMDsKKwkJCQkJCVNldEFzaWNXY2lkID0gKigoUFJUX1NFVF9BU0lDX1dDSUQpKHBEYXRhKSk7CisKKwkJCQkJCWlmIChTZXRBc2ljV2NpZC5XQ0lEID49IE1BWF9MRU5fT0ZfTUFDX1RBQkxFKQorCQkJCQkJCXJldHVybjsKKworCQkJCQkJb2Zmc2V0ID0gTUFDX1dDSURfQkFTRSArICgoVUNIQVIpU2V0QXNpY1djaWQuV0NJRCkqSFdfV0NJRF9FTlRSWV9TSVpFOworCisJCQkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiQ21kVGhyZWFkIDogQ01EVEhSRUFEX1NFVF9BU0lDX1dDSUQgOiBXQ0lEID0gJWxkLCBTZXRUaWQgID0gJWx4LCBEZWxldGVUaWQgPSAlbHguXG4iLCBTZXRBc2ljV2NpZC5XQ0lELCBTZXRBc2ljV2NpZC5TZXRUaWQsIFNldEFzaWNXY2lkLkRlbGV0ZVRpZCkpOworCQkJCQkJTUFDVmFsdWUgPSAocEFkLT5NYWNUYWIuQ29udGVudFtTZXRBc2ljV2NpZC5XQ0lEXS5BZGRyWzNdPDwyNCkrKHBBZC0+TWFjVGFiLkNvbnRlbnRbU2V0QXNpY1djaWQuV0NJRF0uQWRkclsyXTw8MTYpKyhwQWQtPk1hY1RhYi5Db250ZW50W1NldEFzaWNXY2lkLldDSURdLkFkZHJbMV08PDgpKyhwQWQtPk1hY1RhYi5Db250ZW50W1NldEFzaWNXY2lkLldDSURdLkFkZHJbMF0pOworCQkJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIjEtTUFDVmFsdWU9ICV4LFxuIiwgTUFDVmFsdWUpKTsKKwkJCQkJCVJUVVNCV3JpdGVNQUNSZWdpc3RlcihwQWQsIG9mZnNldCwgTUFDVmFsdWUpOworCQkJCQkJLy8gUmVhZCBiaXRtYXNrCisJCQkJCQlSVFVTQlJlYWRNQUNSZWdpc3RlcihwQWQsIG9mZnNldCs0LCAmTUFDUlZhbHVlKTsKKwkJCQkJCWlmICggU2V0QXNpY1djaWQuRGVsZXRlVGlkICE9IDB4ZmZmZmZmZmYpCisJCQkJCQkJTUFDUlZhbHVlICY9ICh+U2V0QXNpY1djaWQuRGVsZXRlVGlkKTsKKwkJCQkJCWlmIChTZXRBc2ljV2NpZC5TZXRUaWQgIT0gMHhmZmZmZmZmZikKKwkJCQkJCQlNQUNSVmFsdWUgfD0gKFNldEFzaWNXY2lkLlNldFRpZCk7CisJCQkJCQlNQUNSVmFsdWUgJj0gMHhmZmZmMDAwMDsKKworCQkJCQkJTUFDVmFsdWUgPSAocEFkLT5NYWNUYWIuQ29udGVudFtTZXRBc2ljV2NpZC5XQ0lEXS5BZGRyWzVdPDw4KStwQWQtPk1hY1RhYi5Db250ZW50W1NldEFzaWNXY2lkLldDSURdLkFkZHJbNF07CisJCQkJCQlNQUNWYWx1ZSB8PSBNQUNSVmFsdWU7CisJCQkJCQlSVFVTQldyaXRlTUFDUmVnaXN0ZXIocEFkLCBvZmZzZXQrNCwgTUFDVmFsdWUpOworCisJCQkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiMi1NQUNWYWx1ZT0gJXgsXG4iLCBNQUNWYWx1ZSkpOworCQkJCQl9CisJCQkJCWJyZWFrOworCisJCQkJY2FzZSBDTURUSFJFQURfU0VUX0FTSUNfV0NJRF9DSVBIRVI6CisJCQkJCXsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJCQkJCVJUX1NFVF9BU0lDX1dDSURfQVRUUkkJU2V0QXNpY1djaWRBdHRyaTsKKwkJCQkJCVVTSE9SVAkJb2Zmc2V0OworCQkJCQkJVUlOVDMyCQlNQUNSVmFsdWUgPSAwOworCQkJCQkJU0hBUkVES0VZX01PREVfU1RSVUMgY3NyMTsKKwkJCQkJCVNldEFzaWNXY2lkQXR0cmkgPSAqKChQUlRfU0VUX0FTSUNfV0NJRF9BVFRSSSkocERhdGEpKTsKKworCQkJCQkJaWYgKFNldEFzaWNXY2lkQXR0cmkuV0NJRCA+PSBNQVhfTEVOX09GX01BQ19UQUJMRSkKKwkJCQkJCQlyZXR1cm47CisKKwkJCQkJCW9mZnNldCA9IE1BQ19XQ0lEX0FUVFJJQlVURV9CQVNFICsgKChVQ0hBUilTZXRBc2ljV2NpZEF0dHJpLldDSUQpKkhXX1dDSURfQVRUUklfU0laRTsKKworCQkJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIkNtZCA6IENNRFRIUkVBRF9TRVRfQVNJQ19XQ0lEX0NJUEhFUiA6IFdDSUQgPSAlbGQsIENpcGhlciA9ICVseC5cbiIsIFNldEFzaWNXY2lkQXR0cmkuV0NJRCwgU2V0QXNpY1djaWRBdHRyaS5DaXBoZXIpKTsKKwkJCQkJCS8vIFJlYWQgYml0bWFzaworCQkJCQkJUlRVU0JSZWFkTUFDUmVnaXN0ZXIocEFkLCBvZmZzZXQsICZNQUNSVmFsdWUpOworCQkJCQkJTUFDUlZhbHVlID0gMDsKKwkJCQkJCU1BQ1JWYWx1ZSB8PSAoKChVQ0hBUilTZXRBc2ljV2NpZEF0dHJpLkNpcGhlcikgPDwgMSk7CisKKwkJCQkJCVJUVVNCV3JpdGVNQUNSZWdpc3RlcihwQWQsIG9mZnNldCwgTUFDUlZhbHVlKTsKKwkJCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCIyLW9mZnNldCA9ICV4ICwgTUFDVmFsdWU9ICV4LFxuIiwgb2Zmc2V0LCBNQUNSVmFsdWUpKTsKKworCQkJCQkJb2Zmc2V0ID0gUEFJUldJU0VfSVZFSVZfVEFCTEVfQkFTRSArICgoVUNIQVIpU2V0QXNpY1djaWRBdHRyaS5XQ0lEKSpIV19JVkVJVl9FTlRSWV9TSVpFOworCQkJCQkJTUFDUlZhbHVlID0gMDsKKwkJCQkJCWlmICggKFNldEFzaWNXY2lkQXR0cmkuQ2lwaGVyIDw9IENJUEhFUl9XRVAxMjgpKQorCQkJCQkJCU1BQ1JWYWx1ZSB8PSAoIHBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCA8PCAzMCk7CisJCQkJCQllbHNlCisJCQkJCQkJTUFDUlZhbHVlIHw9ICgweDIwMDAwMDAwKTsKKwkJCQkJCVJUVVNCV3JpdGVNQUNSZWdpc3RlcihwQWQsIG9mZnNldCwgTUFDUlZhbHVlKTsKKwkJCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCIyLW9mZnNldCA9ICV4ICwgTUFDVmFsdWU9ICV4LFxuIiwgb2Zmc2V0LCBNQUNSVmFsdWUpKTsKKworCQkJCQkJLy8KKwkJCQkJCS8vIFVwZGF0ZSBjaXBoZXIgYWxnb3JpdGhtLiBXU1RBIGFsd2F5cyB1c2UgQlNTMAorCQkJCQkJLy8KKwkJCQkJCS8vIGZvciBhZGhvYyBtb2RlIG9ubHkgLGJlY2F1c2Ugd2VwIHN0YXR1cyBzbG93IHRoYW4gYWRkIGtleSwgd2hlbiB1c2UgemVybyBjb25maWcKKwkJCQkJCWlmIChwQWQtPlN0YUNmZy5Cc3NUeXBlID09IEJTU19BREhPQyApCisJCQkJCQl7CisJCQkJCQkJb2Zmc2V0ID0gTUFDX1dDSURfQVRUUklCVVRFX0JBU0U7CisKKwkJCQkJCQlSVFVTQlJlYWRNQUNSZWdpc3RlcihwQWQsIG9mZnNldCwgJk1BQ1JWYWx1ZSk7CisJCQkJCQkJTUFDUlZhbHVlICY9ICh+MHhlKTsKKwkJCQkJCQlNQUNSVmFsdWUgfD0gKCgoVUNIQVIpU2V0QXNpY1djaWRBdHRyaS5DaXBoZXIpIDw8IDEpOworCisJCQkJCQkJUlRVU0JXcml0ZU1BQ1JlZ2lzdGVyKHBBZCwgb2Zmc2V0LCBNQUNSVmFsdWUpOworCisJCQkJCQkJLy9VcGRhdGUgZ3JvdXAga2V5IGNpcGhlciwsYmVjYXVzZSB3ZXAgc3RhdHVzIHNsb3cgdGhhbiBhZGQga2V5LCB3aGVuIHVzZSB6ZXJvIGNvbmZpZworCQkJCQkJCVJUVVNCUmVhZE1BQ1JlZ2lzdGVyKHBBZCwgU0hBUkVEX0tFWV9NT0RFX0JBU0UrNCooMC8yKSwgJmNzcjEud29yZCk7CisKKwkJCQkJCQljc3IxLmZpZWxkLkJzczBLZXkwQ2lwaGVyQWxnID0gU2V0QXNpY1djaWRBdHRyaS5DaXBoZXI7CisJCQkJCQkJY3NyMS5maWVsZC5Cc3MwS2V5MUNpcGhlckFsZyA9IFNldEFzaWNXY2lkQXR0cmkuQ2lwaGVyOworCisJCQkJCQkJUlRVU0JXcml0ZU1BQ1JlZ2lzdGVyKHBBZCwgU0hBUkVEX0tFWV9NT0RFX0JBU0UrNCooMC8yKSwgY3NyMS53b3JkKTsKKwkJCQkJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwkJCQkJfQorCQkJCQlicmVhazsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCQkJCS8vIGF2b2lkIGluIGludGVycnVwdCB3aGVuIHdyaXRlIGtleQorCQkJCWNhc2UgUlRfQ01EX1NFVF9LRVlfVEFCTEU6IC8vR2VuZXJhbCBjYWxsIGZvciBBc2ljQWRkUGFpcndpc2VLZXlFbnRyeSgpCisJCQkJCXsKKwkJCQkJCVJUX0FERF9QQUlSV0lTRV9LRVlfRU5UUlkgS2V5SW5mbzsKKwkJCQkJCUtleUluZm8gID0gKigoUFJUX0FERF9QQUlSV0lTRV9LRVlfRU5UUlkpKHBEYXRhKSk7CisJCQkJCQlBc2ljQWRkUGFpcndpc2VLZXlFbnRyeShwQWQsCisJCQkJCQkJCQkJCQlLZXlJbmZvLk1hY0FkZHIsCisJCQkJCQkJCQkJCQkoVUNIQVIpS2V5SW5mby5NYWNUYWJNYXRjaFdDSUQsCisJCQkJCQkJCQkJCQkmS2V5SW5mby5DaXBoZXJLZXkpOworCQkJCQl9CisJCQkJCWJyZWFrOworCisJCQkJY2FzZSBSVF9DTURfU0VUX1JYX1dDSURfVEFCTEU6IC8vR2VuZXJhbCBjYWxsIGZvciBSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KCkKKwkJCQkJeworCQkJCQkJUE1BQ19UQUJMRV9FTlRSWSBwRW50cnkgOworCQkJCQkJcEVudHJ5ID0gKFBNQUNfVEFCTEVfRU5UUlkpKHBEYXRhKTsKKwkJCQkJCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkocEFkLAorCQkJCQkJCQkJCQkJCUJTUzAsCisJCQkJCQkJCQkJCQkJMCwKKwkJCQkJCQkJCQkJCQlwRW50cnktPlBhaXJ3aXNlS2V5LkNpcGhlckFsZywKKwkJCQkJCQkJCQkJCQlwRW50cnkpOworCQkJCQl9CisJCQkJCWJyZWFrOworI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJCQkJY2FzZSBDTURUSFJFQURfU0VUX0NMSUVOVF9NQUNfRU5UUlk6CisJCQkJCXsKKwkJCQkJCU1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5OworCQkJCQkJcEVudHJ5ID0gKE1BQ19UQUJMRV9FTlRSWSAqKXBEYXRhOworCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJCQkJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCQkJCQl7CisJCQkJCQkJQXNpY1JlbW92ZVBhaXJ3aXNlS2V5RW50cnkocEFkLCBwRW50cnktPmFwaWR4LCAoVUNIQVIpcEVudHJ5LT5BaWQpOworCQkJCQkJCWlmICgocEVudHJ5LT5BdXRoTW9kZSA8PSBOZGlzODAyXzExQXV0aE1vZGVBdXRvU3dpdGNoKSAmJiAocEVudHJ5LT5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24xRW5hYmxlZCkpCisJCQkJCQkJeworCQkJCQkJCQlVSU5UMzIgdUlWID0gMDsKKwkJCQkJCQkJUFVDSEFSICBwdHI7CisKKwkJCQkJCQkJcHRyID0gKFBVQ0hBUikgJnVJVjsKKwkJCQkJCQkJKihwdHIgKyAzKSA9IChwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQgPDwgNik7CisJCQkJCQkJCUFzaWNVcGRhdGVXQ0lESVZFSVYocEFkLCBwRW50cnktPkFpZCwgdUlWLCAwKTsKKwkJCQkJCQkJQXNpY1VwZGF0ZVdDSURBdHRyaWJ1dGUocEFkLCBwRW50cnktPkFpZCwgQlNTMCwgcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5DaXBoZXJBbGcsIEZBTFNFKTsKKwkJCQkJCQl9CisJCQkJCQkJZWxzZSBpZiAocEVudHJ5LT5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lKQorCQkJCQkJCXsKKwkJCQkJCQkJVUlOVDMyIHVJViA9IDA7CisJCQkJCQkJCVBVQ0hBUiAgcHRyOworCisJCQkJCQkJCXB0ciA9IChQVUNIQVIpICZ1SVY7CisJCQkJCQkJCSoocHRyICsgMykgPSAocEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkIDw8IDYpOworCQkJCQkJCQlBc2ljVXBkYXRlV0NJRElWRUlWKHBBZCwgcEVudHJ5LT5BaWQsIHVJViwgMCk7CisJCQkJCQkJCUFzaWNVcGRhdGVXQ0lEQXR0cmlidXRlKHBBZCwgcEVudHJ5LT5BaWQsIEJTUzAsIHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uQ2lwaGVyQWxnLCBGQUxTRSk7CisJCQkJCQkJfQorCQkJCQkJCWVsc2UKKwkJCQkJCQl7CisJCQkJCQkJCS8vCisJCQkJCQkJCS8vIE90aGVyIGNhc2UsIGRpc2FibGUgZW5naW5lLgorCQkJCQkJCQkvLyBEb24ndCB3b3JyeSBXUEEga2V5LCB3ZSB3aWxsIGFkZCBXUEEgS2V5IGFmdGVyIDQtV2F5IGhhbmRzaGFraW5nLgorCQkJCQkJCQkvLworCQkJCQkJCQlVU0hPUlQgICBvZmZzZXQ7CisJCQkJCQkJCW9mZnNldCA9IE1BQ19XQ0lEX0FUVFJJQlVURV9CQVNFICsgKHBFbnRyeS0+QWlkICogSFdfV0NJRF9BVFRSSV9TSVpFKTsKKwkJCQkJCQkJLy8gUlhfUEtFWV9NT0RFOjAgZm9yIG5vIHNlY3VyaXR5OyBSWF9LRVlfVEFCOjAgZm9yIHNoYXJlZCBrZXkgdGFibGU7IEJTU19JRFg6MAorCQkJCQkJCQlSVFVTQldyaXRlTUFDUmVnaXN0ZXIocEFkLCBvZmZzZXQsIDApOworCQkJCQkJCX0KKwkJCQkJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCQkJCQkJQXNpY1VwZGF0ZVJ4V0NJRFRhYmxlKHBBZCwgcEVudHJ5LT5BaWQsIHBFbnRyeS0+QWRkcik7CisJCQkJCQlwcmludGsoIlVwZGF0ZVJ4V0NJRFRhYmxlKCk6IEFpZD0lZCwgQWRkcj0lMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCFcbiIsIHBFbnRyeS0+QWlkLAorCQkJCQkJCQlwRW50cnktPkFkZHJbMF0sIHBFbnRyeS0+QWRkclsxXSwgcEVudHJ5LT5BZGRyWzJdLCBwRW50cnktPkFkZHJbM10sIHBFbnRyeS0+QWRkcls0XSwgcEVudHJ5LT5BZGRyWzVdKTsKKwkJCQkJfQorCQkJCQlicmVhazsKKworCQkJCWNhc2UgT0lEXzgwMl8xMV9BRERfV0VQOgorCQkJCQl7CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCQkJCQlVSU5UCWk7CisJCQkJCQlVSU5UMzIJS2V5SWR4OworCQkJCQkJUE5ESVNfODAyXzExX1dFUAlwV2VwS2V5OworCisJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDbWRUaHJlYWQ6Ok9JRF84MDJfMTFfQUREX1dFUCAgXG4iKSk7CisKKwkJCQkJCXBXZXBLZXkgPSAoUE5ESVNfODAyXzExX1dFUClwRGF0YTsKKwkJCQkJCUtleUlkeCA9IHBXZXBLZXktPktleUluZGV4ICYgMHgwZmZmZmZmZjsKKworCQkJCQkJLy8gaXQgaXMgYSBzaGFyZWQga2V5CisJCQkJCQlpZiAoKEtleUlkeCA+PSA0KSB8fCAoKHBXZXBLZXktPktleUxlbmd0aCAhPSA1KSAmJiAocFdlcEtleS0+S2V5TGVuZ3RoICE9IDEzKSkpCisJCQkJCQl7CisJCQkJCQkJTmRpc1N0YXR1cyA9IE5ESVNfU1RBVFVTX0lOVkFMSURfREFUQTsKKwkJCQkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJDbWRUaHJlYWQ6Ok9JRF84MDJfMTFfQUREX1dFUCwgSU5WQUxJRF9EQVRBISFcbiIpKTsKKwkJCQkJCX0KKwkJCQkJCWVsc2UKKwkJCQkJCXsKKwkJCQkJCQlVQ0hBUiBDaXBoZXJBbGc7CisJCQkJCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5LZXlMZW4gPSAoVUNIQVIpIHBXZXBLZXktPktleUxlbmd0aDsKKwkJCQkJCQlOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLktleSwgJnBXZXBLZXktPktleU1hdGVyaWFsLCBwV2VwS2V5LT5LZXlMZW5ndGgpOworCQkJCQkJCUNpcGhlckFsZyA9IChwQWQtPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLktleUxlbiA9PSA1KT8gQ0lQSEVSX1dFUDY0IDogQ0lQSEVSX1dFUDEyODsKKworCQkJCQkJCS8vCisJCQkJCQkJLy8gQ2hhbmdlIHRoZSBXRVAgY2lwaGVyIHRvIENLSVAgY2lwaGVyIGlmIENLSVAgS1Agb24uCisJCQkJCQkJLy8gRnVuayBVSSBvciBNZWV0aW5naG91c2UgVUkgd2lsbCBhZGQgY2tpcCBrZXkgZnJvbSB0aGlzIHBhdGguCisJCQkJCQkJLy8KKworCQkJCQkJCWlmIChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKQorCQkJCQkJIAl7CisJCQkJCQkJCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUGFpcndpc2VLZXkuQ2lwaGVyQWxnID0gcEFkLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5DaXBoZXJBbGc7CisJCQkJCQkJCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUGFpcndpc2VLZXkuS2V5TGVuID0gcEFkLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5LZXlMZW47CisJCQkJCQkgCX0KKwkJCQkJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLkNpcGhlckFsZyA9IENpcGhlckFsZzsKKwkJCQkJCQlpZiAocFdlcEtleS0+S2V5SW5kZXggJiAweDgwMDAwMDAwKQorCQkJCQkJCXsKKwkJCQkJCQkJLy8gRGVmYXVsdCBrZXkgZm9yIHR4IChzaGFyZWQga2V5KQorCQkJCQkJCQlVQ0hBUglJVkVJVls4XTsKKwkJCQkJCQkJVUlOVDMyCVdDSURBdHRyaSwgVmFsdWU7CisJCQkJCQkJCVVTSE9SVAlvZmZzZXQsIG9mZnNldDI7CisJCQkJCQkJCU5kaXNaZXJvTWVtb3J5KElWRUlWLCA4KTsKKwkJCQkJCQkJcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkID0gKFVDSEFSKSBLZXlJZHg7CisJCQkJCQkJCS8vIEFkZCBCU1NJRCB0byBXQ1RhYmxlLiBiZWNhdXNlIHRoaXMgaXMgVHggd2VwIGtleS4KKwkJCQkJCQkJLy8gV0NJRCBBdHRyaWJ1dGUgVURGOjMsIEJTU0lkeDozLCBBbGc6MywgS2V5dGFibGU6MT1QQUlSV0lTRSBLRVksIEJTU0lkeCBpcyAwCisJCQkJCQkJCVdDSURBdHRyaSA9IChDaXBoZXJBbGc8PDEpfFNIQVJFREtFWVRBQkxFOworCisJCQkJCQkJCW9mZnNldCA9IE1BQ19XQ0lEX0FUVFJJQlVURV9CQVNFICsgKEJTU0lEX1dDSUQqIEhXX1dDSURfQVRUUklfU0laRSk7CisJCQkJCQkJCVJUVVNCV3JpdGVNQUNSZWdpc3RlcihwQWQsIG9mZnNldCwgV0NJREF0dHJpKTsKKwkJCQkJCQkJLy8gMS4gSVYvRUlWCisJCQkJCQkJCS8vIFNwZWNpZnkga2V5IGluZGV4IHRvIGZpbmQgc2hhcmVkIGtleS4KKwkJCQkJCQkJSVZFSVZbM10gPSAoVUNIQVIpKEtleUlkeDw8IDYpOwkvL1dFUCBFaXYgYml0IG9mZi4gZ3JvdXBrZXkgaW5kZXggaXMgbm90IDAKKwkJCQkJCQkJb2Zmc2V0ID0gUEFJUldJU0VfSVZFSVZfVEFCTEVfQkFTRSArIChCU1MwTWNhc3RfV0NJRCAqIEhXX0lWRUlWX0VOVFJZX1NJWkUpOworCQkJCQkJCQlvZmZzZXQyID0gUEFJUldJU0VfSVZFSVZfVEFCTEVfQkFTRSArIChCU1NJRF9XQ0lEKiBIV19JVkVJVl9FTlRSWV9TSVpFKTsKKwkJCQkJCQkJZm9yIChpPTA7IGk8ODspCisJCQkJCQkJCXsKKwkJCQkJCQkJCVZhbHVlID0gSVZFSVZbaV07CisJCQkJCQkJCQlWYWx1ZSArPSAoSVZFSVZbaSsxXTw8OCk7CisJCQkJCQkJCQlWYWx1ZSArPSAoSVZFSVZbaSsyXTw8MTYpOworCQkJCQkJCQkJVmFsdWUgKz0gKElWRUlWW2krM108PDI0KTsKKwkJCQkJCQkJCVJUVVNCV3JpdGVNQUNSZWdpc3RlcihwQWQsIG9mZnNldCtpLCBWYWx1ZSk7CisJCQkJCQkJCQlSVFVTQldyaXRlTUFDUmVnaXN0ZXIocEFkLCBvZmZzZXQyK2ksIFZhbHVlKTsKKwkJCQkJCQkJCWkrPTQ7CisJCQkJCQkJCX0KKworCQkJCQkJCQkvLyAyLiBXQ0lEIEF0dHJpYnV0ZSBVREY6MywgQlNTSWR4OjMsIEFsZzozLCBLZXl0YWJsZTp1c2Ugc2hhcmUga2V5LCBCU1NJZHggaXMgMAorCQkJCQkJCQlXQ0lEQXR0cmkgPSAocEFkLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5DaXBoZXJBbGc8PDEpfFNIQVJFREtFWVRBQkxFOworCQkJCQkJCQlvZmZzZXQgPSBNQUNfV0NJRF9BVFRSSUJVVEVfQkFTRSArIChCU1MwTWNhc3RfV0NJRCogSFdfV0NJRF9BVFRSSV9TSVpFKTsKKwkJCQkJCQkgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkJTUzBNY2FzdF9XQ0lEIDogb2Zmc2V0ID0gJXgsIFdDSURBdHRyaSA9ICV4XG4iLCBvZmZzZXQsIFdDSURBdHRyaSkpOworCQkJCQkJCQlSVFVTQldyaXRlTUFDUmVnaXN0ZXIocEFkLCBvZmZzZXQsIFdDSURBdHRyaSk7CisKKwkJCQkJCQl9CisJCQkJCQkJQXNpY0FkZFNoYXJlZEtleUVudHJ5KHBBZCwgQlNTMCwgKFVDSEFSKUtleUlkeCwgQ2lwaGVyQWxnLCBwV2VwS2V5LT5LZXlNYXRlcmlhbCwgTlVMTCwgTlVMTCk7CisJCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ21kVGhyZWFkOjpPSURfODAyXzExX0FERF9XRVAgKEtleUlkeD0lZCwgTGVuPSVkLWJ5dGUpXG4iLCBLZXlJZHgsIHBXZXBLZXktPktleUxlbmd0aCkpOworCQkJCQkJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCQkJCQl9CisJCQkJCWJyZWFrOworCisJCQkJY2FzZSBDTURUSFJFQURfODAyXzExX0NPVU5URVJfTUVBU1VSRToKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiLS0+IENvbnRyb2wgVGhyZWFkICEhIEVSUk9SICEhIFVua25vd24oY21kcWVsbXQtPmNvbW1hbmQ9MHgleCkgISEgXG4iLCBjbWRxZWxtdC0+Y29tbWFuZCkpOworCQkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCWlmIChjbWRxZWxtdC0+Q21kRnJvbU5kaXMgPT0gVFJVRSkKKwkJeworCQkJCWlmIChjbWRxZWxtdC0+YnVmZmVyICE9IE5VTEwpCisJCQkJCU5kaXNGcmVlTWVtb3J5KGNtZHFlbG10LT5idWZmZXIsIGNtZHFlbG10LT5idWZmZXJsZW5ndGgsIDApOworCisJCQlOZGlzRnJlZU1lbW9yeShjbWRxZWxtdCwgc2l6ZW9mKENtZFFFbG10KSwgMCk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlpZiAoKGNtZHFlbG10LT5idWZmZXIgIT0gTlVMTCkgJiYgKGNtZHFlbG10LT5idWZmZXJsZW5ndGggIT0gMCkpCisJCQkJTmRpc0ZyZWVNZW1vcnkoY21kcWVsbXQtPmJ1ZmZlciwgY21kcWVsbXQtPmJ1ZmZlcmxlbmd0aCwgMCk7CisgICAgICAgICAgICB7CisJCQkJTmRpc0ZyZWVNZW1vcnkoY21kcWVsbXQsIHNpemVvZihDbWRRRWxtdCksIDApOworCQkJfQorCQl9CisJfQkvKiBlbmQgb2Ygd2hpbGUgKi8KK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vc3BlY3RydW0uYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL3NwZWN0cnVtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM3ODJjZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL3NwZWN0cnVtLmMKQEAgLTAsMCArMSwxODc2IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgIE1vZHVsZSBOYW1lOgorCWFjdGlvbi5jCisKKyAgICBBYnN0cmFjdDoKKyAgICBIYW5kbGUgYXNzb2NpYXRpb24gcmVsYXRlZCByZXF1ZXN0cyBlaXRoZXIgZnJvbSBXU1RBIG9yIGZyb20gbG9jYWwgTUxNRQorCisgICAgUmV2aXNpb24gSGlzdG9yeToKKyAgICBXaG8gICAgICAgICAgV2hlbiAgICAgICAgICBXaGF0CisgICAgLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCUZvbmNoaSBXdSAgICAyMDA4CSAgCSAgIGNyZWF0ZWQgZm9yIDgwMi4xMWgKKyAqLworCisjaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCisjaW5jbHVkZSAiYWN0aW9uLmgiCisKK1ZPSUQgTWVhc3VyZVJlcVRhYkluaXQoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJTmRpc0FsbG9jYXRlU3BpbkxvY2soJnBBZC0+Q29tbW9uQ2ZnLk1lYXN1cmVSZXFUYWJMb2NrKTsKKworCXBBZC0+Q29tbW9uQ2ZnLnBNZWFzdXJlUmVxVGFiID0ga21hbGxvYyhzaXplb2YoTUVBU1VSRV9SRVFfVEFCKSwgR0ZQX0FUT01JQyk7CisJaWYgKHBBZC0+Q29tbW9uQ2ZnLnBNZWFzdXJlUmVxVGFiKQorCQlOZGlzWmVyb01lbW9yeShwQWQtPkNvbW1vbkNmZy5wTWVhc3VyZVJlcVRhYiwgc2l6ZW9mKE1FQVNVUkVfUkVRX1RBQikpOworCWVsc2UKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXMgRmFpbCB0byBhbGxvYyBtZW1vcnkgZm9yIHBBZC0+Q29tbW9uQ2ZnLnBNZWFzdXJlUmVxVGFiLlxuIiwgX19mdW5jX18pKTsKKworCXJldHVybjsKK30KKworVk9JRCBNZWFzdXJlUmVxVGFiRXhpdCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlOZGlzRnJlZVNwaW5Mb2NrKHBBZC0+Q29tbW9uQ2ZnLk1lYXN1cmVSZXFUYWJMb2NrKTsKKworCWlmIChwQWQtPkNvbW1vbkNmZy5wTWVhc3VyZVJlcVRhYikKKwkJa2ZyZWUocEFkLT5Db21tb25DZmcucE1lYXN1cmVSZXFUYWIpOworCXBBZC0+Q29tbW9uQ2ZnLnBNZWFzdXJlUmVxVGFiID0gTlVMTDsKKworCXJldHVybjsKK30KKworc3RhdGljIFBNRUFTVVJFX1JFUV9FTlRSWSBNZWFzdXJlUmVxTG9va1VwKAorCUlOIFBSVE1QX0FEQVBURVIJcEFkLAorCUlOIFVJTlQ4CQkJRGlhbG9nVG9rZW4pCit7CisJVUlOVCBIYXNoSWR4OworCVBNRUFTVVJFX1JFUV9UQUIgcFRhYiA9IHBBZC0+Q29tbW9uQ2ZnLnBNZWFzdXJlUmVxVGFiOworCVBNRUFTVVJFX1JFUV9FTlRSWSBwRW50cnkgPSBOVUxMOworCVBNRUFTVVJFX1JFUV9FTlRSWSBwUHJldkVudHJ5ID0gTlVMTDsKKworCWlmIChwVGFiID09IE5VTEwpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlczogcE1lYXN1cmVSZXFUYWIgZG9lc24ndCBleGlzdC5cbiIsIF9fZnVuY19fKSk7CisJCXJldHVybiBOVUxMOworCX0KKworCVJUTVBfU0VNX0xPQ0soJnBBZC0+Q29tbW9uQ2ZnLk1lYXN1cmVSZXFUYWJMb2NrKTsKKworCUhhc2hJZHggPSBNUV9ESUFMT0dUT0tFTl9IQVNIX0lOREVYKERpYWxvZ1Rva2VuKTsKKwlwRW50cnkgPSBwVGFiLT5IYXNoW0hhc2hJZHhdOworCisJd2hpbGUgKHBFbnRyeSkKKwl7CisJCWlmIChwRW50cnktPkRpYWxvZ1Rva2VuID09IERpYWxvZ1Rva2VuKQorCQkJYnJlYWs7CisJCWVsc2UKKwkJeworCQkJcFByZXZFbnRyeSA9IHBFbnRyeTsKKwkJCXBFbnRyeSA9IHBFbnRyeS0+cE5leHQ7CisJCX0KKwl9CisKKwlSVE1QX1NFTV9VTkxPQ0soJnBBZC0+Q29tbW9uQ2ZnLk1lYXN1cmVSZXFUYWJMb2NrKTsKKworCXJldHVybiBwRW50cnk7Cit9CisKK3N0YXRpYyBQTUVBU1VSRV9SRVFfRU5UUlkgTWVhc3VyZVJlcUluc2VydCgKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiBVSU5UOAkJCURpYWxvZ1Rva2VuKQoreworCUlOVCBpOworCVVMT05HIEhhc2hJZHg7CisJUE1FQVNVUkVfUkVRX1RBQiBwVGFiID0gcEFkLT5Db21tb25DZmcucE1lYXN1cmVSZXFUYWI7CisJUE1FQVNVUkVfUkVRX0VOVFJZIHBFbnRyeSA9IE5VTEwsIHBDdXJyRW50cnk7CisJVUxPTkcgTm93OworCisJaWYocFRhYiA9PSBOVUxMKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXM6IHBNZWFzdXJlUmVxVGFiIGRvZXNuJ3QgZXhpc3QuXG4iLCBfX2Z1bmNfXykpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlwRW50cnkgPSBNZWFzdXJlUmVxTG9va1VwKHBBZCwgRGlhbG9nVG9rZW4pOworCWlmIChwRW50cnkgPT0gTlVMTCkKKwl7CisJCVJUTVBfU0VNX0xPQ0soJnBBZC0+Q29tbW9uQ2ZnLk1lYXN1cmVSZXFUYWJMb2NrKTsKKwkJZm9yIChpID0gMDsgaSA8IE1BWF9NRUFTVVJFX1JFUV9UQUJfU0laRTsgaSsrKQorCQl7CisJCQlOZGlzR2V0U3lzdGVtVXBUaW1lKCZOb3cpOworCQkJcEVudHJ5ID0gJnBUYWItPkNvbnRlbnRbaV07CisKKwkJCWlmICgocEVudHJ5LT5WYWxpZCA9PSBUUlVFKQorCQkJCSYmIFJUTVBfVElNRV9BRlRFUigodW5zaWduZWQgbG9uZylOb3csICh1bnNpZ25lZCBsb25nKShwRW50cnktPmxhc3RUaW1lICsgTVFfUkVRX0FHRV9PVVQpKSkKKwkJCXsKKwkJCQlQTUVBU1VSRV9SRVFfRU5UUlkgcFByZXZFbnRyeSA9IE5VTEw7CisJCQkJVUxPTkcgSGFzaElkeCA9IE1RX0RJQUxPR1RPS0VOX0hBU0hfSU5ERVgocEVudHJ5LT5EaWFsb2dUb2tlbik7CisJCQkJUE1FQVNVUkVfUkVRX0VOVFJZIHBQcm9iZUVudHJ5ID0gcFRhYi0+SGFzaFtIYXNoSWR4XTsKKworCQkJCS8vIHVwZGF0ZSBIYXNoIGxpc3QKKwkJCQlkbworCQkJCXsKKwkJCQkJaWYgKHBQcm9iZUVudHJ5ID09IHBFbnRyeSkKKwkJCQkJeworCQkJCQkJaWYgKHBQcmV2RW50cnkgPT0gTlVMTCkKKwkJCQkJCXsKKwkJCQkJCQlwVGFiLT5IYXNoW0hhc2hJZHhdID0gcEVudHJ5LT5wTmV4dDsKKwkJCQkJCX0KKwkJCQkJCWVsc2UKKwkJCQkJCXsKKwkJCQkJCQlwUHJldkVudHJ5LT5wTmV4dCA9IHBFbnRyeS0+cE5leHQ7CisJCQkJCQl9CisJCQkJCQlicmVhazsKKwkJCQkJfQorCisJCQkJCXBQcmV2RW50cnkgPSBwUHJvYmVFbnRyeTsKKwkJCQkJcFByb2JlRW50cnkgPSBwUHJvYmVFbnRyeS0+cE5leHQ7CisJCQkJfSB3aGlsZSAocFByb2JlRW50cnkpOworCisJCQkJTmRpc1plcm9NZW1vcnkocEVudHJ5LCBzaXplb2YoTUVBU1VSRV9SRVFfRU5UUlkpKTsKKwkJCQlwVGFiLT5TaXplLS07CisKKwkJCQlicmVhazsKKwkJCX0KKworCQkJaWYgKHBFbnRyeS0+VmFsaWQgPT0gRkFMU0UpCisJCQkJYnJlYWs7CisJCX0KKworCQlpZiAoaSA8IE1BWF9NRUFTVVJFX1JFUV9UQUJfU0laRSkKKwkJeworCQkJTmRpc0dldFN5c3RlbVVwVGltZSgmTm93KTsKKwkJCXBFbnRyeS0+bGFzdFRpbWUgPSBOb3c7CisJCQlwRW50cnktPlZhbGlkID0gVFJVRTsKKwkJCXBFbnRyeS0+RGlhbG9nVG9rZW4gPSBEaWFsb2dUb2tlbjsKKwkJCXBUYWItPlNpemUrKzsKKwkJfQorCQllbHNlCisJCXsKKwkJCXBFbnRyeSA9IE5VTEw7CisJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlczogcE1lYXN1cmVSZXFUYWIgdGFiIGZ1bGwuXG4iLCBfX2Z1bmNfXykpOworCQl9CisKKwkJLy8gYWRkIHRoaXMgTmVpZ2hib3IgZW50cnkgaW50byBIQVNIIHRhYmxlCisJCWlmIChwRW50cnkpCisJCXsKKwkJCUhhc2hJZHggPSBNUV9ESUFMT0dUT0tFTl9IQVNIX0lOREVYKERpYWxvZ1Rva2VuKTsKKwkJCWlmIChwVGFiLT5IYXNoW0hhc2hJZHhdID09IE5VTEwpCisJCQl7CisJCQkJcFRhYi0+SGFzaFtIYXNoSWR4XSA9IHBFbnRyeTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlwQ3VyckVudHJ5ID0gcFRhYi0+SGFzaFtIYXNoSWR4XTsKKwkJCQl3aGlsZSAocEN1cnJFbnRyeS0+cE5leHQgIT0gTlVMTCkKKwkJCQkJcEN1cnJFbnRyeSA9IHBDdXJyRW50cnktPnBOZXh0OworCQkJCXBDdXJyRW50cnktPnBOZXh0ID0gcEVudHJ5OworCQkJfQorCQl9CisKKwkJUlRNUF9TRU1fVU5MT0NLKCZwQWQtPkNvbW1vbkNmZy5NZWFzdXJlUmVxVGFiTG9jayk7CisJfQorCisJcmV0dXJuIHBFbnRyeTsKK30KKworc3RhdGljIFZPSUQgTWVhc3VyZVJlcURlbGV0ZSgKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiBVSU5UOAkJCURpYWxvZ1Rva2VuKQoreworCVBNRUFTVVJFX1JFUV9UQUIgcFRhYiA9IHBBZC0+Q29tbW9uQ2ZnLnBNZWFzdXJlUmVxVGFiOworCVBNRUFTVVJFX1JFUV9FTlRSWSBwRW50cnkgPSBOVUxMOworCisJaWYocFRhYiA9PSBOVUxMKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXM6IHBNZWFzdXJlUmVxVGFiIGRvZXNuJ3QgZXhpc3QuXG4iLCBfX2Z1bmNfXykpOworCQlyZXR1cm47CisJfQorCisJLy8gaWYgZW1wdHksIHJldHVybgorCWlmIChwVGFiLT5TaXplID09IDApCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJwTWVhc3VyZVJlcVRhYiBlbXB0eS5cbiIpKTsKKwkJcmV0dXJuOworCX0KKworCXBFbnRyeSA9IE1lYXN1cmVSZXFMb29rVXAocEFkLCBEaWFsb2dUb2tlbik7CisJaWYgKHBFbnRyeSAhPSBOVUxMKQorCXsKKwkJUE1FQVNVUkVfUkVRX0VOVFJZIHBQcmV2RW50cnkgPSBOVUxMOworCQlVTE9ORyBIYXNoSWR4ID0gTVFfRElBTE9HVE9LRU5fSEFTSF9JTkRFWChwRW50cnktPkRpYWxvZ1Rva2VuKTsKKwkJUE1FQVNVUkVfUkVRX0VOVFJZIHBQcm9iZUVudHJ5ID0gcFRhYi0+SGFzaFtIYXNoSWR4XTsKKworCQlSVE1QX1NFTV9MT0NLKCZwQWQtPkNvbW1vbkNmZy5NZWFzdXJlUmVxVGFiTG9jayk7CisJCS8vIHVwZGF0ZSBIYXNoIGxpc3QKKwkJZG8KKwkJeworCQkJaWYgKHBQcm9iZUVudHJ5ID09IHBFbnRyeSkKKwkJCXsKKwkJCQlpZiAocFByZXZFbnRyeSA9PSBOVUxMKQorCQkJCXsKKwkJCQkJcFRhYi0+SGFzaFtIYXNoSWR4XSA9IHBFbnRyeS0+cE5leHQ7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCXBQcmV2RW50cnktPnBOZXh0ID0gcEVudHJ5LT5wTmV4dDsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCXBQcmV2RW50cnkgPSBwUHJvYmVFbnRyeTsKKwkJCXBQcm9iZUVudHJ5ID0gcFByb2JlRW50cnktPnBOZXh0OworCQl9IHdoaWxlIChwUHJvYmVFbnRyeSk7CisKKwkJTmRpc1plcm9NZW1vcnkocEVudHJ5LCBzaXplb2YoTUVBU1VSRV9SRVFfRU5UUlkpKTsKKwkJcFRhYi0+U2l6ZS0tOworCisJCVJUTVBfU0VNX1VOTE9DSygmcEFkLT5Db21tb25DZmcuTWVhc3VyZVJlcVRhYkxvY2spOworCX0KKworCXJldHVybjsKK30KKworVk9JRCBUcGNSZXFUYWJJbml0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCU5kaXNBbGxvY2F0ZVNwaW5Mb2NrKCZwQWQtPkNvbW1vbkNmZy5UcGNSZXFUYWJMb2NrKTsKKworCXBBZC0+Q29tbW9uQ2ZnLnBUcGNSZXFUYWIgPSBrbWFsbG9jKHNpemVvZihUUENfUkVRX1RBQiksIEdGUF9BVE9NSUMpOworCWlmIChwQWQtPkNvbW1vbkNmZy5wVHBjUmVxVGFiKQorCQlOZGlzWmVyb01lbW9yeShwQWQtPkNvbW1vbkNmZy5wVHBjUmVxVGFiLCBzaXplb2YoVFBDX1JFUV9UQUIpKTsKKwllbHNlCisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzIEZhaWwgdG8gYWxsb2MgbWVtb3J5IGZvciBwQWQtPkNvbW1vbkNmZy5wVHBjUmVxVGFiLlxuIiwgX19mdW5jX18pKTsKKworCXJldHVybjsKK30KKworVk9JRCBUcGNSZXFUYWJFeGl0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCU5kaXNGcmVlU3BpbkxvY2socEFkLT5Db21tb25DZmcuVHBjUmVxVGFiTG9jayk7CisKKwlpZiAocEFkLT5Db21tb25DZmcucFRwY1JlcVRhYikKKwkJa2ZyZWUocEFkLT5Db21tb25DZmcucFRwY1JlcVRhYik7CisJcEFkLT5Db21tb25DZmcucFRwY1JlcVRhYiA9IE5VTEw7CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBQVFBDX1JFUV9FTlRSWSBUcGNSZXFMb29rVXAoCisJSU4gUFJUTVBfQURBUFRFUglwQWQsCisJSU4gVUlOVDgJCQlEaWFsb2dUb2tlbikKK3sKKwlVSU5UIEhhc2hJZHg7CisJUFRQQ19SRVFfVEFCIHBUYWIgPSBwQWQtPkNvbW1vbkNmZy5wVHBjUmVxVGFiOworCVBUUENfUkVRX0VOVFJZIHBFbnRyeSA9IE5VTEw7CisJUFRQQ19SRVFfRU5UUlkgcFByZXZFbnRyeSA9IE5VTEw7CisKKwlpZiAocFRhYiA9PSBOVUxMKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXM6IHBUcGNSZXFUYWIgZG9lc24ndCBleGlzdC5cbiIsIF9fZnVuY19fKSk7CisJCXJldHVybiBOVUxMOworCX0KKworCVJUTVBfU0VNX0xPQ0soJnBBZC0+Q29tbW9uQ2ZnLlRwY1JlcVRhYkxvY2spOworCisJSGFzaElkeCA9IFRQQ19ESUFMT0dUT0tFTl9IQVNIX0lOREVYKERpYWxvZ1Rva2VuKTsKKwlwRW50cnkgPSBwVGFiLT5IYXNoW0hhc2hJZHhdOworCisJd2hpbGUgKHBFbnRyeSkKKwl7CisJCWlmIChwRW50cnktPkRpYWxvZ1Rva2VuID09IERpYWxvZ1Rva2VuKQorCQkJYnJlYWs7CisJCWVsc2UKKwkJeworCQkJcFByZXZFbnRyeSA9IHBFbnRyeTsKKwkJCXBFbnRyeSA9IHBFbnRyeS0+cE5leHQ7CisJCX0KKwl9CisKKwlSVE1QX1NFTV9VTkxPQ0soJnBBZC0+Q29tbW9uQ2ZnLlRwY1JlcVRhYkxvY2spOworCisJcmV0dXJuIHBFbnRyeTsKK30KKworCitzdGF0aWMgUFRQQ19SRVFfRU5UUlkgVHBjUmVxSW5zZXJ0KAorCUlOIFBSVE1QX0FEQVBURVIJcEFkLAorCUlOIFVJTlQ4CQkJRGlhbG9nVG9rZW4pCit7CisJSU5UIGk7CisJVUxPTkcgSGFzaElkeDsKKwlQVFBDX1JFUV9UQUIgcFRhYiA9IHBBZC0+Q29tbW9uQ2ZnLnBUcGNSZXFUYWI7CisJUFRQQ19SRVFfRU5UUlkgcEVudHJ5ID0gTlVMTCwgcEN1cnJFbnRyeTsKKwlVTE9ORyBOb3c7CisKKwlpZihwVGFiID09IE5VTEwpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlczogcFRwY1JlcVRhYiBkb2Vzbid0IGV4aXN0LlxuIiwgX19mdW5jX18pKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcEVudHJ5ID0gVHBjUmVxTG9va1VwKHBBZCwgRGlhbG9nVG9rZW4pOworCWlmIChwRW50cnkgPT0gTlVMTCkKKwl7CisJCVJUTVBfU0VNX0xPQ0soJnBBZC0+Q29tbW9uQ2ZnLlRwY1JlcVRhYkxvY2spOworCQlmb3IgKGkgPSAwOyBpIDwgTUFYX1RQQ19SRVFfVEFCX1NJWkU7IGkrKykKKwkJeworCQkJTmRpc0dldFN5c3RlbVVwVGltZSgmTm93KTsKKwkJCXBFbnRyeSA9ICZwVGFiLT5Db250ZW50W2ldOworCisJCQlpZiAoKHBFbnRyeS0+VmFsaWQgPT0gVFJVRSkKKwkJCQkmJiBSVE1QX1RJTUVfQUZURVIoKHVuc2lnbmVkIGxvbmcpTm93LCAodW5zaWduZWQgbG9uZykocEVudHJ5LT5sYXN0VGltZSArIFRQQ19SRVFfQUdFX09VVCkpKQorCQkJeworCQkJCVBUUENfUkVRX0VOVFJZIHBQcmV2RW50cnkgPSBOVUxMOworCQkJCVVMT05HIEhhc2hJZHggPSBUUENfRElBTE9HVE9LRU5fSEFTSF9JTkRFWChwRW50cnktPkRpYWxvZ1Rva2VuKTsKKwkJCQlQVFBDX1JFUV9FTlRSWSBwUHJvYmVFbnRyeSA9IHBUYWItPkhhc2hbSGFzaElkeF07CisKKwkJCQkvLyB1cGRhdGUgSGFzaCBsaXN0CisJCQkJZG8KKwkJCQl7CisJCQkJCWlmIChwUHJvYmVFbnRyeSA9PSBwRW50cnkpCisJCQkJCXsKKwkJCQkJCWlmIChwUHJldkVudHJ5ID09IE5VTEwpCisJCQkJCQl7CisJCQkJCQkJcFRhYi0+SGFzaFtIYXNoSWR4XSA9IHBFbnRyeS0+cE5leHQ7CisJCQkJCQl9CisJCQkJCQllbHNlCisJCQkJCQl7CisJCQkJCQkJcFByZXZFbnRyeS0+cE5leHQgPSBwRW50cnktPnBOZXh0OworCQkJCQkJfQorCQkJCQkJYnJlYWs7CisJCQkJCX0KKworCQkJCQlwUHJldkVudHJ5ID0gcFByb2JlRW50cnk7CisJCQkJCXBQcm9iZUVudHJ5ID0gcFByb2JlRW50cnktPnBOZXh0OworCQkJCX0gd2hpbGUgKHBQcm9iZUVudHJ5KTsKKworCQkJCU5kaXNaZXJvTWVtb3J5KHBFbnRyeSwgc2l6ZW9mKFRQQ19SRVFfRU5UUlkpKTsKKwkJCQlwVGFiLT5TaXplLS07CisKKwkJCQlicmVhazsKKwkJCX0KKworCQkJaWYgKHBFbnRyeS0+VmFsaWQgPT0gRkFMU0UpCisJCQkJYnJlYWs7CisJCX0KKworCQlpZiAoaSA8IE1BWF9UUENfUkVRX1RBQl9TSVpFKQorCQl7CisJCQlOZGlzR2V0U3lzdGVtVXBUaW1lKCZOb3cpOworCQkJcEVudHJ5LT5sYXN0VGltZSA9IE5vdzsKKwkJCXBFbnRyeS0+VmFsaWQgPSBUUlVFOworCQkJcEVudHJ5LT5EaWFsb2dUb2tlbiA9IERpYWxvZ1Rva2VuOworCQkJcFRhYi0+U2l6ZSsrOworCQl9CisJCWVsc2UKKwkJeworCQkJcEVudHJ5ID0gTlVMTDsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzOiBwVHBjUmVxVGFiIHRhYiBmdWxsLlxuIiwgX19mdW5jX18pKTsKKwkJfQorCisJCS8vIGFkZCB0aGlzIE5laWdoYm9yIGVudHJ5IGludG8gSEFTSCB0YWJsZQorCQlpZiAocEVudHJ5KQorCQl7CisJCQlIYXNoSWR4ID0gVFBDX0RJQUxPR1RPS0VOX0hBU0hfSU5ERVgoRGlhbG9nVG9rZW4pOworCQkJaWYgKHBUYWItPkhhc2hbSGFzaElkeF0gPT0gTlVMTCkKKwkJCXsKKwkJCQlwVGFiLT5IYXNoW0hhc2hJZHhdID0gcEVudHJ5OworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXBDdXJyRW50cnkgPSBwVGFiLT5IYXNoW0hhc2hJZHhdOworCQkJCXdoaWxlIChwQ3VyckVudHJ5LT5wTmV4dCAhPSBOVUxMKQorCQkJCQlwQ3VyckVudHJ5ID0gcEN1cnJFbnRyeS0+cE5leHQ7CisJCQkJcEN1cnJFbnRyeS0+cE5leHQgPSBwRW50cnk7CisJCQl9CisJCX0KKworCQlSVE1QX1NFTV9VTkxPQ0soJnBBZC0+Q29tbW9uQ2ZnLlRwY1JlcVRhYkxvY2spOworCX0KKworCXJldHVybiBwRW50cnk7Cit9CisKK3N0YXRpYyBWT0lEIFRwY1JlcURlbGV0ZSgKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiBVSU5UOAkJCURpYWxvZ1Rva2VuKQoreworCVBUUENfUkVRX1RBQiBwVGFiID0gcEFkLT5Db21tb25DZmcucFRwY1JlcVRhYjsKKwlQVFBDX1JFUV9FTlRSWSBwRW50cnkgPSBOVUxMOworCisJaWYocFRhYiA9PSBOVUxMKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXM6IHBUcGNSZXFUYWIgZG9lc24ndCBleGlzdC5cbiIsIF9fZnVuY19fKSk7CisJCXJldHVybjsKKwl9CisKKwkvLyBpZiBlbXB0eSwgcmV0dXJuCisJaWYgKHBUYWItPlNpemUgPT0gMCkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoInBUcGNSZXFUYWIgZW1wdHkuXG4iKSk7CisJCXJldHVybjsKKwl9CisKKwlwRW50cnkgPSBUcGNSZXFMb29rVXAocEFkLCBEaWFsb2dUb2tlbik7CisJaWYgKHBFbnRyeSAhPSBOVUxMKQorCXsKKwkJUFRQQ19SRVFfRU5UUlkgcFByZXZFbnRyeSA9IE5VTEw7CisJCVVMT05HIEhhc2hJZHggPSBUUENfRElBTE9HVE9LRU5fSEFTSF9JTkRFWChwRW50cnktPkRpYWxvZ1Rva2VuKTsKKwkJUFRQQ19SRVFfRU5UUlkgcFByb2JlRW50cnkgPSBwVGFiLT5IYXNoW0hhc2hJZHhdOworCisJCVJUTVBfU0VNX0xPQ0soJnBBZC0+Q29tbW9uQ2ZnLlRwY1JlcVRhYkxvY2spOworCQkvLyB1cGRhdGUgSGFzaCBsaXN0CisJCWRvCisJCXsKKwkJCWlmIChwUHJvYmVFbnRyeSA9PSBwRW50cnkpCisJCQl7CisJCQkJaWYgKHBQcmV2RW50cnkgPT0gTlVMTCkKKwkJCQl7CisJCQkJCXBUYWItPkhhc2hbSGFzaElkeF0gPSBwRW50cnktPnBOZXh0OworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlwUHJldkVudHJ5LT5wTmV4dCA9IHBFbnRyeS0+cE5leHQ7CisJCQkJfQorCQkJCWJyZWFrOworCQkJfQorCisJCQlwUHJldkVudHJ5ID0gcFByb2JlRW50cnk7CisJCQlwUHJvYmVFbnRyeSA9IHBQcm9iZUVudHJ5LT5wTmV4dDsKKwkJfSB3aGlsZSAocFByb2JlRW50cnkpOworCisJCU5kaXNaZXJvTWVtb3J5KHBFbnRyeSwgc2l6ZW9mKFRQQ19SRVFfRU5UUlkpKTsKKwkJcFRhYi0+U2l6ZS0tOworCisJCVJUTVBfU0VNX1VOTE9DSygmcEFkLT5Db21tb25DZmcuVHBjUmVxVGFiTG9jayk7CisJfQorCisJcmV0dXJuOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCUdldCBDdXJyZW50IFRpbWVTIHRhbXAuCisKKwlQYXJhbWV0cnM6CisKKwlSZXR1cm4JOiBDdXJyZW50IFRpbWUgU3RhbXAuCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworc3RhdGljIFVJTlQ2NCBHZXRDdXJyZW50VGltZVN0YW1wKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCS8vIGdldCBjdXJyZW50IHRpbWUgc3RhbXAuCisJcmV0dXJuIDA7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJR2V0IEN1cnJlbnQgVHJhbnNtaXQgUG93ZXIuCisKKwlQYXJhbWV0cnM6CisKKwlSZXR1cm4JOiBDdXJyZW50IFRpbWUgU3RhbXAuCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworc3RhdGljIFVJTlQ4IEdldEN1clR4UHdyKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVJTlQ4IFdjaWQpCit7CisJcmV0dXJuIDE2OyAvKiAxNiBkQm0gKi8KK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlJbnNlcnQgRGlhbG9nIFRva2VuIGludG8gZnJhbWUuCisKKwlQYXJhbWV0cnM6CisJCTEuIGZyYW1lIGJ1ZmZlciBwb2ludGVyLgorCQkyLiBmcmFtZSBsZW5ndGguCisJCTMuIERpYWxvZyB0b2tlbi4KKworCVJldHVybgk6IE5vbmUuCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworc3RhdGljIFZPSUQgSW5zZXJ0RGlhbG9nVG9rZW4oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJT1VUIFBVQ0hBUiBwRnJhbWVCdWYsCisJT1VUIFBVTE9ORyBwRnJhbWVMZW4sCisJSU4gVUlOVDggRGlhbG9nVG9rZW4pCit7CisJVUxPTkcgVGVtcExlbjsKKwlNYWtlT3V0Z29pbmdGcmFtZShwRnJhbWVCdWYsCSZUZW1wTGVuLAorCQkJCQkxLAkJCQkmRGlhbG9nVG9rZW4sCisJCQkJCUVORF9PRl9BUkdTKTsKKworCSpwRnJhbWVMZW4gPSAqcEZyYW1lTGVuICsgVGVtcExlbjsKKworCXJldHVybjsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlJbnNlcnQgVFBDIFJlcXVlc3QgSUUgaW50byBmcmFtZS4KKworCVBhcmFtZXRyczoKKwkJMS4gZnJhbWUgYnVmZmVyIHBvaW50ZXIuCisJCTIuIGZyYW1lIGxlbmd0aC4KKworCVJldHVybgk6IE5vbmUuCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworIHN0YXRpYyBWT0lEIEluc2VydFRwY1JlcUlFKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCU9VVCBQVUNIQVIgcEZyYW1lQnVmLAorCU9VVCBQVUxPTkcgcEZyYW1lTGVuKQoreworCVVMT05HIFRlbXBMZW47CisJVUxPTkcgTGVuID0gMDsKKwlVSU5UOCBFbGVtZW50SUQgPSBJRV9UUENfUkVRVUVTVDsKKworCU1ha2VPdXRnb2luZ0ZyYW1lKHBGcmFtZUJ1ZiwJCQkJCSZUZW1wTGVuLAorCQkJCQkJMSwJCQkJCQkJJkVsZW1lbnRJRCwKKwkJCQkJCTEsCQkJCQkJCSZMZW4sCisJCQkJCQlFTkRfT0ZfQVJHUyk7CisKKwkqcEZyYW1lTGVuID0gKnBGcmFtZUxlbiArIFRlbXBMZW47CisKKwlyZXR1cm47Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJSW5zZXJ0IFRQQyBSZXBvcnQgSUUgaW50byBmcmFtZS4KKworCVBhcmFtZXRyczoKKwkJMS4gZnJhbWUgYnVmZmVyIHBvaW50ZXIuCisJCTIuIGZyYW1lIGxlbmd0aC4KKwkJMy4gVHJhbnNtaXQgUG93ZXIuCisJCTQuIExpbmsgTWFyZ2luLgorCisJUmV0dXJuCTogTm9uZS4KKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisgc3RhdGljIFZPSUQgSW5zZXJ0VHBjUmVwb3J0SUUoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJT1VUIFBVQ0hBUiBwRnJhbWVCdWYsCisJT1VUIFBVTE9ORyBwRnJhbWVMZW4sCisJSU4gVUlOVDggVHhQd3IsCisJSU4gVUlOVDggTGlua01hcmdpbikKK3sKKwlVTE9ORyBUZW1wTGVuOworCVVMT05HIExlbiA9IHNpemVvZihUUENfUkVQT1JUX0lORk8pOworCVVJTlQ4IEVsZW1lbnRJRCA9IElFX1RQQ19SRVBPUlQ7CisJVFBDX1JFUE9SVF9JTkZPIFRwY1JlcG9ydElFOworCisJVHBjUmVwb3J0SUUuVHhQd3IgPSBUeFB3cjsKKwlUcGNSZXBvcnRJRS5MaW5rTWFyZ2luID0gTGlua01hcmdpbjsKKworCU1ha2VPdXRnb2luZ0ZyYW1lKHBGcmFtZUJ1ZiwJCQkJCSZUZW1wTGVuLAorCQkJCQkJMSwJCQkJCQkJJkVsZW1lbnRJRCwKKwkJCQkJCTEsCQkJCQkJCSZMZW4sCisJCQkJCQlMZW4sCQkJCQkJJlRwY1JlcG9ydElFLAorCQkJCQkJRU5EX09GX0FSR1MpOworCisJKnBGcmFtZUxlbiA9ICpwRnJhbWVMZW4gKyBUZW1wTGVuOworCisKKwlyZXR1cm47Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJSW5zZXJ0IENoYW5uZWwgU3dpdGNoIEFubm91bmNlbWVudCBJRSBpbnRvIGZyYW1lLgorCisJUGFyYW1ldHJzOgorCQkxLiBmcmFtZSBidWZmZXIgcG9pbnRlci4KKwkJMi4gZnJhbWUgbGVuZ3RoLgorCQkzLiBjaGFubmVsIHN3aXRjaCBhbm5vdW5jZW1lbnQgbW9kZS4KKwkJNC4gbmV3IHNlbGVjdGVkIGNoYW5uZWwuCisJCTUuIGNoYW5uZWwgc3dpdGNoIGFubm91bmNlbWVudCBjb3VudC4KKworCVJldHVybgk6IE5vbmUuCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworc3RhdGljIFZPSUQgSW5zZXJ0Q2hTd0FubklFKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCU9VVCBQVUNIQVIgcEZyYW1lQnVmLAorCU9VVCBQVUxPTkcgcEZyYW1lTGVuLAorCUlOIFVJTlQ4IENoU3dNb2RlLAorCUlOIFVJTlQ4IE5ld0NoYW5uZWwsCisJSU4gVUlOVDggQ2hTd0NudCkKK3sKKwlVTE9ORyBUZW1wTGVuOworCVVMT05HIExlbiA9IHNpemVvZihDSF9TV19BTk5fSU5GTyk7CisJVUlOVDggRWxlbWVudElEID0gSUVfQ0hBTk5FTF9TV0lUQ0hfQU5OT1VOQ0VNRU5UOworCUNIX1NXX0FOTl9JTkZPIENoU3dBbm5JRTsKKworCUNoU3dBbm5JRS5DaFN3TW9kZSA9IENoU3dNb2RlOworCUNoU3dBbm5JRS5DaGFubmVsID0gTmV3Q2hhbm5lbDsKKwlDaFN3QW5uSUUuQ2hTd0NudCA9IENoU3dDbnQ7CisKKwlNYWtlT3V0Z29pbmdGcmFtZShwRnJhbWVCdWYsCQkJCSZUZW1wTGVuLAorCQkJCQkJMSwJCQkJCQkmRWxlbWVudElELAorCQkJCQkJMSwJCQkJCQkmTGVuLAorCQkJCQkJTGVuLAkJCQkJJkNoU3dBbm5JRSwKKwkJCQkJCUVORF9PRl9BUkdTKTsKKworCSpwRnJhbWVMZW4gPSAqcEZyYW1lTGVuICsgVGVtcExlbjsKKworCisJcmV0dXJuOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCUluc2VydCBNZWFzdXJlIFJlcXVlc3QgSUUgaW50byBmcmFtZS4KKworCVBhcmFtZXRyczoKKwkJMS4gZnJhbWUgYnVmZmVyIHBvaW50ZXIuCisJCTIuIGZyYW1lIGxlbmd0aC4KKwkJMy4gTWVhc3VyZSBUb2tlbi4KKwkJNC4gTWVhc3VyZSBSZXF1ZXN0IE1vZGUuCisJCTUuIE1lYXN1cmUgUmVxdWVzdCBUeXBlLgorCQk2LiBNZWFzdXJlIENoYW5uZWwuCisJCTcuIE1lYXN1cmUgU3RhcnQgdGltZS4KKwkJOC4gTWVhc3VyZSBEdXJhdGlvbi4KKworCisJUmV0dXJuCTogTm9uZS4KKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitzdGF0aWMgVk9JRCBJbnNlcnRNZWFzdXJlUmVxSUUoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJT1VUIFBVQ0hBUiBwRnJhbWVCdWYsCisJT1VUIFBVTE9ORyBwRnJhbWVMZW4sCisJSU4gUE1FQVNVUkVfUkVRX0lORk8gcE1lYXN1cmVSZXFJRSkKK3sKKwlVTE9ORyBUZW1wTGVuOworCVVJTlQ4IExlbiA9IHNpemVvZihNRUFTVVJFX1JFUV9JTkZPKTsKKwlVSU5UOCBFbGVtZW50SUQgPSBJRV9NRUFTVVJFTUVOVF9SRVFVRVNUOworCisJTWFrZU91dGdvaW5nRnJhbWUocEZyYW1lQnVmLAkJCQkJJlRlbXBMZW4sCisJCQkJCQkxLAkJCQkJCQkmRWxlbWVudElELAorCQkJCQkJMSwJCQkJCQkJJkxlbiwKKwkJCQkJCUxlbiwJCQkJCQlwTWVhc3VyZVJlcUlFLAorCQkJCQkJRU5EX09GX0FSR1MpOworCisJKnBGcmFtZUxlbiA9ICpwRnJhbWVMZW4gKyBUZW1wTGVuOworCisJcmV0dXJuOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCUluc2VydCBNZWFzdXJlIFJlcG9ydCBJRSBpbnRvIGZyYW1lLgorCisJUGFyYW1ldHJzOgorCQkxLiBmcmFtZSBidWZmZXIgcG9pbnRlci4KKwkJMi4gZnJhbWUgbGVuZ3RoLgorCQkzLiBNZWFzdXJlIFRva2VuLgorCQk0LiBNZWFzdXJlIFJlcXVlc3QgTW9kZS4KKwkJNS4gTWVhc3VyZSBSZXF1ZXN0IFR5cGUuCisJCTYuIExlbmd0aCBvZiBSZXBvcnQgSW5mb21hdGlvbgorCQk3LiBQb2ludGVyIG9mIFJlcG9ydCBJbmZvbWF0aW9uIEJ1ZmZlci4KKworCVJldHVybgk6IE5vbmUuCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworc3RhdGljIFZPSUQgSW5zZXJ0TWVhc3VyZVJlcG9ydElFKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCU9VVCBQVUNIQVIgcEZyYW1lQnVmLAorCU9VVCBQVUxPTkcgcEZyYW1lTGVuLAorCUlOIFBNRUFTVVJFX1JFUE9SVF9JTkZPIHBNZWFzdXJlUmVwb3J0SUUsCisJSU4gVUlOVDggUmVwb3J0TG5mb0xlbiwKKwlJTiBQVUlOVDggcFJlcG9ydEluZm8pCit7CisJVUxPTkcgVGVtcExlbjsKKwlVTE9ORyBMZW47CisJVUlOVDggRWxlbWVudElEID0gSUVfTUVBU1VSRU1FTlRfUkVQT1JUOworCisJTGVuID0gc2l6ZW9mKE1FQVNVUkVfUkVQT1JUX0lORk8pICsgUmVwb3J0TG5mb0xlbjsKKworCU1ha2VPdXRnb2luZ0ZyYW1lKHBGcmFtZUJ1ZiwJCQkJCSZUZW1wTGVuLAorCQkJCQkJMSwJCQkJCQkJJkVsZW1lbnRJRCwKKwkJCQkJCTEsCQkJCQkJCSZMZW4sCisJCQkJCQlMZW4sCQkJCQkJcE1lYXN1cmVSZXBvcnRJRSwKKwkJCQkJCUVORF9PRl9BUkdTKTsKKworCSpwRnJhbWVMZW4gPSAqcEZyYW1lTGVuICsgVGVtcExlbjsKKworCWlmICgoUmVwb3J0TG5mb0xlbiA+IDApICYmIChwUmVwb3J0SW5mbyAhPSBOVUxMKSkKKwl7CisJCU1ha2VPdXRnb2luZ0ZyYW1lKHBGcmFtZUJ1ZiArICpwRnJhbWVMZW4sCQkmVGVtcExlbiwKKwkJCQkJCQlSZXBvcnRMbmZvTGVuLAkJCQlwUmVwb3J0SW5mbywKKwkJCQkJCQlFTkRfT0ZfQVJHUyk7CisKKwkJKnBGcmFtZUxlbiA9ICpwRnJhbWVMZW4gKyBUZW1wTGVuOworCX0KKwlyZXR1cm47Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJUHJlcGFyZSBNZWFzdXJlbWVudCByZXF1ZXN0IGFjdGlvbiBmcmFtZSBhbmQgZW5xdWV1ZSBpdCBpbnRvCisJCW1hbmFnZW1lbnQgcXVldWUgd2FpdGluZyBmb3IgdHJhbnNtaXRpb24uCisKKwlQYXJhbWV0cnM6CisJCTEuIHRoZSBkZXN0aW5hdGlvbiBtYWMgYWRkcmVzcyBvZiB0aGUgZnJhbWUuCisKKwlSZXR1cm4JOiBOb25lLgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgRW5xdWV1ZU1lYXN1cmVtZW50UmVxKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFBVQ0hBUiBwREEsCisJSU4gVUlOVDggTWVhc3VyZVRva2VuLAorCUlOIFVJTlQ4IE1lYXN1cmVSZXFNb2RlLAorCUlOIFVJTlQ4IE1lYXN1cmVSZXFUeXBlLAorCUlOIFVJTlQ4IE1lYXN1cmVDaCwKKwlJTiBVSU5UMTYgTWVhc3VyZUR1cmF0aW9uKQoreworCVBVQ0hBUiBwT3V0QnVmZmVyID0gTlVMTDsKKwlORElTX1NUQVRVUyBOU3RhdHVzOworCVVMT05HIEZyYW1lTGVuOworCUhFQURFUl84MDJfMTEgQWN0SGRyOworCU1FQVNVUkVfUkVRX0lORk8gTWVhc3VyZVJlcUlFOworCVVJTlQ4IFJtUmVxRGFpbG9nVG9rZW4gPSBSYW5kb21CeXRlKHBBZCk7CisJVUlOVDY0IE1lYXN1cmVTdGFydFRpbWUgPSBHZXRDdXJyZW50VGltZVN0YW1wKHBBZCk7CisKKwkvLyBidWlsZCBhY3Rpb24gZnJhbWUgaGVhZGVyLgorCU1ndE1hY0hlYWRlckluaXQocEFkLCAmQWN0SGRyLCBTVUJUWVBFX0FDVElPTiwgMCwgcERBLAorCQkJCQkJcEFkLT5DdXJyZW50QWRkcmVzcyk7CisKKwlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgKFBWT0lEKSZwT3V0QnVmZmVyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKKwlpZihOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcygpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWQgXG4iLCBfX2Z1bmNfXykpOworCQlyZXR1cm47CisJfQorCU5kaXNNb3ZlTWVtb3J5KHBPdXRCdWZmZXIsIChQQ0hBUikmQWN0SGRyLCBzaXplb2YoSEVBREVSXzgwMl8xMSkpOworCUZyYW1lTGVuID0gc2l6ZW9mKEhFQURFUl84MDJfMTEpOworCisJSW5zZXJ0QWN0RmllbGQocEFkLCAocE91dEJ1ZmZlciArIEZyYW1lTGVuKSwgJkZyYW1lTGVuLCBDQVRFR09SWV9TUEVDVFJVTSwgU1BFQ19NUlEpOworCisJLy8gZmlsbCBEaWFsb2cgVG9rZW4KKwlJbnNlcnREaWFsb2dUb2tlbihwQWQsIChwT3V0QnVmZmVyICsgRnJhbWVMZW4pLCAmRnJhbWVMZW4sIE1lYXN1cmVUb2tlbik7CisKKwkvLyBwcmVwYXJlIE1lYXN1cmVtZW50IElFLgorCU5kaXNaZXJvTWVtb3J5KCZNZWFzdXJlUmVxSUUsIHNpemVvZihNRUFTVVJFX1JFUV9JTkZPKSk7CisJTWVhc3VyZVJlcUlFLlRva2VuID0gUm1SZXFEYWlsb2dUb2tlbjsKKwlNZWFzdXJlUmVxSUUuUmVxTW9kZS53b3JkID0gTWVhc3VyZVJlcU1vZGU7CisJTWVhc3VyZVJlcUlFLlJlcVR5cGUgPSBNZWFzdXJlUmVxVHlwZTsKKwlNZWFzdXJlUmVxSUUuTWVhc3VyZVJlcS5DaE51bSA9IE1lYXN1cmVDaDsKKwlNZWFzdXJlUmVxSUUuTWVhc3VyZVJlcS5NZWFzdXJlU3RhcnRUaW1lID0gY3B1MmxlNjQoTWVhc3VyZVN0YXJ0VGltZSk7CisJTWVhc3VyZVJlcUlFLk1lYXN1cmVSZXEuTWVhc3VyZUR1cmF0aW9uID0gY3B1MmxlMTYoTWVhc3VyZUR1cmF0aW9uKTsKKwlJbnNlcnRNZWFzdXJlUmVxSUUocEFkLCAocE91dEJ1ZmZlciArIEZyYW1lTGVuKSwgJkZyYW1lTGVuLCAmTWVhc3VyZVJlcUlFKTsKKworCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgUUlEX0FDX0JFLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7CisJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKKworCXJldHVybjsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlQcmVwYXJlIE1lYXN1cmVtZW50IHJlcG9ydCBhY3Rpb24gZnJhbWUgYW5kIGVucXVldWUgaXQgaW50bworCQltYW5hZ2VtZW50IHF1ZXVlIHdhaXRpbmcgZm9yIHRyYW5zbWl0aW9uLgorCisJUGFyYW1ldHJzOgorCQkxLiB0aGUgZGVzdGluYXRpb24gbWFjIGFkZHJlc3Mgb2YgdGhlIGZyYW1lLgorCisJUmV0dXJuCTogTm9uZS4KKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIEVucXVldWVNZWFzdXJlbWVudFJlcCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBQVUNIQVIgcERBLAorCUlOIFVJTlQ4IERpYWxvZ1Rva2VuLAorCUlOIFVJTlQ4IE1lYXN1cmVUb2tlbiwKKwlJTiBVSU5UOCBNZWFzdXJlUmVxTW9kZSwKKwlJTiBVSU5UOCBNZWFzdXJlUmVxVHlwZSwKKwlJTiBVSU5UOCBSZXBvcnRJbmZvTGVuLAorCUlOIFBVSU5UOCBwUmVwb3J0SW5mbykKK3sKKwlQVUNIQVIgcE91dEJ1ZmZlciA9IE5VTEw7CisJTkRJU19TVEFUVVMgTlN0YXR1czsKKwlVTE9ORyBGcmFtZUxlbjsKKwlIRUFERVJfODAyXzExIEFjdEhkcjsKKwlNRUFTVVJFX1JFUE9SVF9JTkZPIE1lYXN1cmVSZXBJRTsKKworCS8vIGJ1aWxkIGFjdGlvbiBmcmFtZSBoZWFkZXIuCisJTWd0TWFjSGVhZGVySW5pdChwQWQsICZBY3RIZHIsIFNVQlRZUEVfQUNUSU9OLCAwLCBwREEsCisJCQkJCQlwQWQtPkN1cnJlbnRBZGRyZXNzKTsKKworCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAoUFZPSUQpJnBPdXRCdWZmZXIpOyAgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQorCWlmKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxlZCBcbiIsIF9fZnVuY19fKSk7CisJCXJldHVybjsKKwl9CisJTmRpc01vdmVNZW1vcnkocE91dEJ1ZmZlciwgKFBDSEFSKSZBY3RIZHIsIHNpemVvZihIRUFERVJfODAyXzExKSk7CisJRnJhbWVMZW4gPSBzaXplb2YoSEVBREVSXzgwMl8xMSk7CisKKwlJbnNlcnRBY3RGaWVsZChwQWQsIChwT3V0QnVmZmVyICsgRnJhbWVMZW4pLCAmRnJhbWVMZW4sIENBVEVHT1JZX1NQRUNUUlVNLCBTUEVDX01SUCk7CisKKwkvLyBmaWxsIERpYWxvZyBUb2tlbgorCUluc2VydERpYWxvZ1Rva2VuKHBBZCwgKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiksICZGcmFtZUxlbiwgRGlhbG9nVG9rZW4pOworCisJLy8gcHJlcGFyZSBNZWFzdXJlbWVudCBJRS4KKwlOZGlzWmVyb01lbW9yeSgmTWVhc3VyZVJlcElFLCBzaXplb2YoTUVBU1VSRV9SRVBPUlRfSU5GTykpOworCU1lYXN1cmVSZXBJRS5Ub2tlbiA9IE1lYXN1cmVUb2tlbjsKKwlNZWFzdXJlUmVwSUUuUmVwb3J0TW9kZS53b3JkID0gTWVhc3VyZVJlcU1vZGU7CisJTWVhc3VyZVJlcElFLlJlcG9ydFR5cGUgPSBNZWFzdXJlUmVxVHlwZTsKKwlJbnNlcnRNZWFzdXJlUmVwb3J0SUUocEFkLCAocE91dEJ1ZmZlciArIEZyYW1lTGVuKSwgJkZyYW1lTGVuLCAmTWVhc3VyZVJlcElFLCBSZXBvcnRJbmZvTGVuLCBwUmVwb3J0SW5mbyk7CisKKwlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIFFJRF9BQ19CRSwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOworCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7CisKKwlyZXR1cm47Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJUHJlcGFyZSBUUEMgUmVxdWVzdCBhY3Rpb24gZnJhbWUgYW5kIGVucXVldWUgaXQgaW50bworCQltYW5hZ2VtZW50IHF1ZXVlIHdhaXRpbmcgZm9yIHRyYW5zbWl0aW9uLgorCisJUGFyYW1ldHJzOgorCQkxLiB0aGUgZGVzdGluYXRpb24gbWFjIGFkZHJlc3Mgb2YgdGhlIGZyYW1lLgorCisJUmV0dXJuCTogTm9uZS4KKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIEVucXVldWVUUENSZXEoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gUFVDSEFSIHBEQSwKKwlJTiBVQ0hBUiBEaWFsb2dUb2tlbikKK3sKKwlQVUNIQVIgcE91dEJ1ZmZlciA9IE5VTEw7CisJTkRJU19TVEFUVVMgTlN0YXR1czsKKwlVTE9ORyBGcmFtZUxlbjsKKworCUhFQURFUl84MDJfMTEgQWN0SGRyOworCisJLy8gYnVpbGQgYWN0aW9uIGZyYW1lIGhlYWRlci4KKwlNZ3RNYWNIZWFkZXJJbml0KHBBZCwgJkFjdEhkciwgU1VCVFlQRV9BQ1RJT04sIDAsIHBEQSwKKwkJCQkJCXBBZC0+Q3VycmVudEFkZHJlc3MpOworCisJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsIChQVk9JRCkmcE91dEJ1ZmZlcik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5CisJaWYoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXMoKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkIFxuIiwgX19mdW5jX18pKTsKKwkJcmV0dXJuOworCX0KKwlOZGlzTW92ZU1lbW9yeShwT3V0QnVmZmVyLCAoUENIQVIpJkFjdEhkciwgc2l6ZW9mKEhFQURFUl84MDJfMTEpKTsKKwlGcmFtZUxlbiA9IHNpemVvZihIRUFERVJfODAyXzExKTsKKworCUluc2VydEFjdEZpZWxkKHBBZCwgKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiksICZGcmFtZUxlbiwgQ0FURUdPUllfU1BFQ1RSVU0sIFNQRUNfVFBDUlEpOworCisJLy8gZmlsbCBEaWFsb2cgVG9rZW4KKwlJbnNlcnREaWFsb2dUb2tlbihwQWQsIChwT3V0QnVmZmVyICsgRnJhbWVMZW4pLCAmRnJhbWVMZW4sIERpYWxvZ1Rva2VuKTsKKworCS8vIEluc2VydCBUUEMgUmVxdWVzdCBJRS4KKwlJbnNlcnRUcGNSZXFJRShwQWQsIChwT3V0QnVmZmVyICsgRnJhbWVMZW4pLCAmRnJhbWVMZW4pOworCisJTWluaXBvcnRNTVJlcXVlc3QocEFkLCBRSURfQUNfQkUsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKKwlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOworCisJcmV0dXJuOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVByZXBhcmUgVFBDIFJlcG9ydCBhY3Rpb24gZnJhbWUgYW5kIGVucXVldWUgaXQgaW50bworCQltYW5hZ2VtZW50IHF1ZXVlIHdhaXRpbmcgZm9yIHRyYW5zbWl0aW9uLgorCisJUGFyYW1ldHJzOgorCQkxLiB0aGUgZGVzdGluYXRpb24gbWFjIGFkZHJlc3Mgb2YgdGhlIGZyYW1lLgorCisJUmV0dXJuCTogTm9uZS4KKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIEVucXVldWVUUENSZXAoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gUFVDSEFSIHBEQSwKKwlJTiBVSU5UOCBEaWFsb2dUb2tlbiwKKwlJTiBVSU5UOCBUeFB3ciwKKwlJTiBVSU5UOCBMaW5rTWFyZ2luKQoreworCVBVQ0hBUiBwT3V0QnVmZmVyID0gTlVMTDsKKwlORElTX1NUQVRVUyBOU3RhdHVzOworCVVMT05HIEZyYW1lTGVuOworCisJSEVBREVSXzgwMl8xMSBBY3RIZHI7CisKKwkvLyBidWlsZCBhY3Rpb24gZnJhbWUgaGVhZGVyLgorCU1ndE1hY0hlYWRlckluaXQocEFkLCAmQWN0SGRyLCBTVUJUWVBFX0FDVElPTiwgMCwgcERBLAorCQkJCQkJcEFkLT5DdXJyZW50QWRkcmVzcyk7CisKKwlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgKFBWT0lEKSZwT3V0QnVmZmVyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKKwlpZihOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcygpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWQgXG4iLCBfX2Z1bmNfXykpOworCQlyZXR1cm47CisJfQorCU5kaXNNb3ZlTWVtb3J5KHBPdXRCdWZmZXIsIChQQ0hBUikmQWN0SGRyLCBzaXplb2YoSEVBREVSXzgwMl8xMSkpOworCUZyYW1lTGVuID0gc2l6ZW9mKEhFQURFUl84MDJfMTEpOworCisJSW5zZXJ0QWN0RmllbGQocEFkLCAocE91dEJ1ZmZlciArIEZyYW1lTGVuKSwgJkZyYW1lTGVuLCBDQVRFR09SWV9TUEVDVFJVTSwgU1BFQ19UUENSUCk7CisKKwkvLyBmaWxsIERpYWxvZyBUb2tlbgorCUluc2VydERpYWxvZ1Rva2VuKHBBZCwgKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiksICZGcmFtZUxlbiwgRGlhbG9nVG9rZW4pOworCisJLy8gSW5zZXJ0IFRQQyBSZXF1ZXN0IElFLgorCUluc2VydFRwY1JlcG9ydElFKHBBZCwgKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiksICZGcmFtZUxlbiwgVHhQd3IsIExpbmtNYXJnaW4pOworCisJTWluaXBvcnRNTVJlcXVlc3QocEFkLCBRSURfQUNfQkUsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKKwlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOworCisJcmV0dXJuOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVByZXBhcmUgQ2hhbm5lbCBTd2l0Y2ggQW5ub3VuY2VtZW50IGFjdGlvbiBmcmFtZSBhbmQgZW5xdWV1ZSBpdCBpbnRvCisJCW1hbmFnZW1lbnQgcXVldWUgd2FpdGluZyBmb3IgdHJhbnNtaXRpb24uCisKKwlQYXJhbWV0cnM6CisJCTEuIHRoZSBkZXN0aW5hdGlvbiBtYWMgYWRkcmVzcyBvZiB0aGUgZnJhbWUuCisJCTIuIENoYW5uZWwgc3dpdGNoIGFubm91bmNlbWVudCBtb2RlLgorCQkyLiBhIE5ldyBzZWxlY3RlZCBjaGFubmVsLgorCisJUmV0dXJuCTogTm9uZS4KKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIEVucXVldWVDaFN3QW5uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFBVQ0hBUiBwREEsCisJSU4gVUlOVDggQ2hTd01vZGUsCisJSU4gVUlOVDggTmV3Q2gpCit7CisJUFVDSEFSIHBPdXRCdWZmZXIgPSBOVUxMOworCU5ESVNfU1RBVFVTIE5TdGF0dXM7CisJVUxPTkcgRnJhbWVMZW47CisKKwlIRUFERVJfODAyXzExIEFjdEhkcjsKKworCS8vIGJ1aWxkIGFjdGlvbiBmcmFtZSBoZWFkZXIuCisJTWd0TWFjSGVhZGVySW5pdChwQWQsICZBY3RIZHIsIFNVQlRZUEVfQUNUSU9OLCAwLCBwREEsCisJCQkJCQlwQWQtPkN1cnJlbnRBZGRyZXNzKTsKKworCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAoUFZPSUQpJnBPdXRCdWZmZXIpOyAgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQorCWlmKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxlZCBcbiIsIF9fZnVuY19fKSk7CisJCXJldHVybjsKKwl9CisJTmRpc01vdmVNZW1vcnkocE91dEJ1ZmZlciwgKFBDSEFSKSZBY3RIZHIsIHNpemVvZihIRUFERVJfODAyXzExKSk7CisJRnJhbWVMZW4gPSBzaXplb2YoSEVBREVSXzgwMl8xMSk7CisKKwlJbnNlcnRBY3RGaWVsZChwQWQsIChwT3V0QnVmZmVyICsgRnJhbWVMZW4pLCAmRnJhbWVMZW4sIENBVEVHT1JZX1NQRUNUUlVNLCBTUEVDX0NIQU5ORUxfU1dJVENIKTsKKworCUluc2VydENoU3dBbm5JRShwQWQsIChwT3V0QnVmZmVyICsgRnJhbWVMZW4pLCAmRnJhbWVMZW4sIENoU3dNb2RlLCBOZXdDaCwgMCk7CisKKwlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIFFJRF9BQ19CRSwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOworCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBCT09MRUFOIERmc1JlcXVpcmVtZW50Q2hlY2soCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVUlOVDggQ2hhbm5lbCkKK3sKKwlCT09MRUFOIFJlc3VsdCA9IEZBTFNFOworCUlOVCBpOworCisJZG8KKwl7CisJCS8vIGNoZWNrIERGUyBwcm9jZWR1cmUgaXMgcnVubmluZy4KKwkJLy8gbWFrZSBzdXJlIERGUyBwcm9jZWR1cmUgd29uJ3Qgc3RhcnQgdHdpY2UuCisJCWlmIChwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5SRE1vZGUgIT0gUkRfTk9STUFMX01PREUpCisJCXsKKwkJCVJlc3VsdCA9IEZBTFNFOworCQkJYnJlYWs7CisJCX0KKworCQkvLyBjaGVjayB0aGUgbmV3IGNoYW5uZWwgY2FycmllZCBmcm9tIENoYW5uZWwgU3dpdGNoIEFubm91bmNlbW5ldCBpcyB2YWxpZC4KKwkJZm9yIChpPTA7IGk8cEFkLT5DaGFubmVsTGlzdE51bTsgaSsrKQorCQl7CisJCQlpZiAoKENoYW5uZWwgPT0gcEFkLT5DaGFubmVsTGlzdFtpXS5DaGFubmVsKQorCQkJCSYmKHBBZC0+Q2hhbm5lbExpc3RbaV0uUmVtYWluaW5nVGltZUZvclVzZSA9PSAwKSkKKwkJCXsKKwkJCQkvLyBmb3VuZCByYWRhciBzaWduYWwgaW4gdGhlIGNoYW5uZWwuIHRoZSBjaGFubmVsIGNhbid0IHVzZSBhdCBsZWFzdCBmb3IgMzAgbWludXRlcy4KKwkJCQlwQWQtPkNoYW5uZWxMaXN0W2ldLlJlbWFpbmluZ1RpbWVGb3JVc2UgPSAxODAwOy8vMzAgbWluID0gMTgwMCBzZWMKKwkJCQlSZXN1bHQgPSBUUlVFOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfSB3aGlsZShGQUxTRSk7CisKKwlyZXR1cm4gUmVzdWx0OworfQorCitWT0lEIE5vdGlmeUNoU3dBbm5Ub1BlZXJBUHMoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gUFVDSEFSIHBSQSwKKwlJTiBQVUNIQVIgcFRBLAorCUlOIFVJTlQ4IENoU3dNb2RlLAorCUlOIFVJTlQ4IENoYW5uZWwpCit7CisjaWZkZWYgV0RTX1NVUFBPUlQKKwlpZiAoISgocFJBWzBdICYgMHhmZikgPT0gMHhmZikpIC8vIGlzIHBSQSBhIGJyb2FkY2FzZSBhZGRyZXNzLgorCXsKKwkJSU5UIGk7CisJCS8vIGluZm8gbmVpZ2hib3IgQVBzIHRoYXQgUmFkYXIgc2lnbmFsIGZvdW5kIHRocm9naCBXRFMgbGluay4KKwkJZm9yIChpID0gMDsgaSA8IE1BWF9XRFNfRU5UUlk7IGkrKykKKwkJeworCQkJaWYgKFZhbGlkV2RzRW50cnkocEFkLCBpKSkKKwkJCXsKKwkJCQlQVUNIQVIgcERBID0gcEFkLT5XZHNUYWIuV2RzRW50cnlbaV0uUGVlcldkc0FkZHI7CisKKwkJCQkvLyBEQSBlcXVhbCB0byBTQS4gaGF2ZSBubyBuZWNlc3Nhcnkgb3JpZ25hbCBBUCB3aGljaCBmb3VuZCBSYWRhciBzaWduYWwuCisJCQkJaWYgKE1BQ19BRERSX0VRVUFMKHBUQSwgcERBKSkKKwkJCQkJY29udGludWU7CisKKwkJCQkvLyBzZW5kIENoYW5uZWwgU3dpdGNoIEFjdGlvbiBmcmFtZSB0byBpbmZvIE5laWdoYnJvIEFQcy4KKwkJCQlFbnF1ZXVlQ2hTd0FubihwQWQsIHBEQSwgQ2hTd01vZGUsIENoYW5uZWwpOworCQkJfQorCQl9CisJfQorI2VuZGlmIC8vIFdEU19TVVBQT1JUIC8vCit9CisKK3N0YXRpYyBWT0lEIFN0YXJ0REZTUHJvY2VkdXJlKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVDSEFSIENoYW5uZWwsCisJSU4gVUlOVDggQ2hTd01vZGUpCit7CisJLy8gc3RhcnQgREZTIHByb2NlZHVyZQorCXBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPSBDaGFubmVsOworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCU5fQ2hhbm5lbENoZWNrKHBBZCk7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkRNb2RlID0gUkRfU1dJVENISU5HX01PREU7CisJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuQ1NDb3VudCA9IDA7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJQ2hhbm5lbCBTd2l0Y2ggQW5ub3VuY2VtZW50IGFjdGlvbiBmcmFtZSBzYW5pdHkgY2hlY2suCisKKwlQYXJhbWV0cnM6CisJCTEuIE1MTUUgbWVzc2FnZSBjb250YWluaW5nIHRoZSByZWNlaXZlZCBmcmFtZQorCQkyLiBtZXNzYWdlIGxlbmd0aC4KKwkJMy4gQ2hhbm5lbCBzd2l0Y2ggYW5ub3VuY2VtZW50IGluZm9tYXRpb24gYnVmZmVyLgorCisKKwlSZXR1cm4JOiBOb25lLgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworLyoKKyAgQ2hhbm5lbCBTd2l0Y2ggQW5ub3VuY2VtZW50IElFLgorICArLS0tLSstLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rCisgIHwgSUQgfCBMZW4gfENoIFN3IE1vZGUgfCBOZXcgQ2ggTnVtIHwgQ2ggU3cgQ250IHwKKyAgKy0tLS0rLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tKworICAgIDEgICAgMSAgICAgICAgMSAgICAgICAgICAgMSAgICAgICAgICAgIDEKKyovCitzdGF0aWMgQk9PTEVBTiBQZWVyQ2hTd0FublNhbml0eSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBWT0lEICpwTXNnLAorCUlOIFVMT05HIE1zZ0xlbiwKKwlPVVQgUENIX1NXX0FOTl9JTkZPIHBDaFN3QW5uSW5mbykKK3sKKwlQRlJBTUVfODAyXzExIEZyID0gKFBGUkFNRV84MDJfMTEpcE1zZzsKKwlQVUNIQVIgcEZyYW1lUHRyID0gRnItPk9jdGV0OworCUJPT0xFQU4gcmVzdWx0ID0gRkFMU0U7CisJUEVJRF9TVFJVQ1QgZWlkX3B0cjsKKworCS8vIHNraXAgODAyLjExIGhlYWRlci4KKwlNc2dMZW4gLT0gc2l6ZW9mKEhFQURFUl84MDJfMTEpOworCisJLy8gc2tpcCBjYXRlZ29yeSBhbmQgYWN0aW9uIGNvZGUuCisJcEZyYW1lUHRyICs9IDI7CisJTXNnTGVuIC09IDI7CisKKwlpZiAocENoU3dBbm5JbmZvID09IE5VTEwpCisJCXJldHVybiByZXN1bHQ7CisKKwllaWRfcHRyID0gKFBFSURfU1RSVUNUKXBGcmFtZVB0cjsKKwl3aGlsZSAoKChVQ0hBUiopZWlkX3B0ciArIGVpZF9wdHItPkxlbiArIDEpIDwgKChQVUNIQVIpcEZyYW1lUHRyICsgTXNnTGVuKSkKKwl7CisJCXN3aXRjaChlaWRfcHRyLT5FaWQpCisJCXsKKwkJCWNhc2UgSUVfQ0hBTk5FTF9TV0lUQ0hfQU5OT1VOQ0VNRU5UOgorCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQ2hTd0FubkluZm8tPkNoU3dNb2RlLCBlaWRfcHRyLT5PY3RldCwgMSk7CisJCQkJTmRpc01vdmVNZW1vcnkoJnBDaFN3QW5uSW5mby0+Q2hhbm5lbCwgZWlkX3B0ci0+T2N0ZXQgKyAxLCAxKTsKKwkJCQlOZGlzTW92ZU1lbW9yeSgmcENoU3dBbm5JbmZvLT5DaFN3Q250LCBlaWRfcHRyLT5PY3RldCArIDIsIDEpOworCisJCQkJcmVzdWx0ID0gVFJVRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworCQkJZGVmYXVsdDoKKwkJCQlicmVhazsKKwkJfQorCQllaWRfcHRyID0gKFBFSURfU1RSVUNUKSgoVUNIQVIqKWVpZF9wdHIgKyAyICsgZWlkX3B0ci0+TGVuKTsKKwl9CisKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCU1lYXN1cmVtZW50IHJlcXVlc3QgYWN0aW9uIGZyYW1lIHNhbml0eSBjaGVjay4KKworCVBhcmFtZXRyczoKKwkJMS4gTUxNRSBtZXNzYWdlIGNvbnRhaW5pbmcgdGhlIHJlY2VpdmVkIGZyYW1lCisJCTIuIG1lc3NhZ2UgbGVuZ3RoLgorCQkzLiBNZWFzdXJlbWVudCByZXF1ZXN0IGluZm9tYXRpb24gYnVmZmVyLgorCisJUmV0dXJuCTogTm9uZS4KKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitzdGF0aWMgQk9PTEVBTiBQZWVyTWVhc3VyZVJlcVNhbml0eSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBWT0lEICpwTXNnLAorCUlOIFVMT05HIE1zZ0xlbiwKKwlPVVQgUFVJTlQ4IHBEaWFsb2dUb2tlbiwKKwlPVVQgUE1FQVNVUkVfUkVRX0lORk8gcE1lYXN1cmVSZXFJbmZvKQoreworCVBGUkFNRV84MDJfMTEgRnIgPSAoUEZSQU1FXzgwMl8xMSlwTXNnOworCVBVQ0hBUiBwRnJhbWVQdHIgPSBGci0+T2N0ZXQ7CisJQk9PTEVBTiByZXN1bHQgPSBGQUxTRTsKKwlQRUlEX1NUUlVDVCBlaWRfcHRyOworCVBVQ0hBUiBwdHI7CisJVUlOVDY0IE1lYXN1cmVTdGFydFRpbWU7CisJVUlOVDE2IE1lYXN1cmVEdXJhdGlvbjsKKworCS8vIHNraXAgODAyLjExIGhlYWRlci4KKwlNc2dMZW4gLT0gc2l6ZW9mKEhFQURFUl84MDJfMTEpOworCisJLy8gc2tpcCBjYXRlZ29yeSBhbmQgYWN0aW9uIGNvZGUuCisJcEZyYW1lUHRyICs9IDI7CisJTXNnTGVuIC09IDI7CisKKwlpZiAocE1lYXN1cmVSZXFJbmZvID09IE5VTEwpCisJCXJldHVybiByZXN1bHQ7CisKKwlOZGlzTW92ZU1lbW9yeShwRGlhbG9nVG9rZW4sIHBGcmFtZVB0ciwgMSk7CisJcEZyYW1lUHRyICs9IDE7CisJTXNnTGVuIC09IDE7CisKKwllaWRfcHRyID0gKFBFSURfU1RSVUNUKXBGcmFtZVB0cjsKKwl3aGlsZSAoKChVQ0hBUiopZWlkX3B0ciArIGVpZF9wdHItPkxlbiArIDEpIDwgKChQVUNIQVIpcEZyYW1lUHRyICsgTXNnTGVuKSkKKwl7CisJCXN3aXRjaChlaWRfcHRyLT5FaWQpCisJCXsKKwkJCWNhc2UgSUVfTUVBU1VSRU1FTlRfUkVRVUVTVDoKKwkJCQlOZGlzTW92ZU1lbW9yeSgmcE1lYXN1cmVSZXFJbmZvLT5Ub2tlbiwgZWlkX3B0ci0+T2N0ZXQsIDEpOworCQkJCU5kaXNNb3ZlTWVtb3J5KCZwTWVhc3VyZVJlcUluZm8tPlJlcU1vZGUud29yZCwgZWlkX3B0ci0+T2N0ZXQgKyAxLCAxKTsKKwkJCQlOZGlzTW92ZU1lbW9yeSgmcE1lYXN1cmVSZXFJbmZvLT5SZXFUeXBlLCBlaWRfcHRyLT5PY3RldCArIDIsIDEpOworCQkJCXB0ciA9IGVpZF9wdHItPk9jdGV0ICsgMzsKKwkJCQlOZGlzTW92ZU1lbW9yeSgmcE1lYXN1cmVSZXFJbmZvLT5NZWFzdXJlUmVxLkNoTnVtLCBwdHIsIDEpOworCQkJCU5kaXNNb3ZlTWVtb3J5KCZNZWFzdXJlU3RhcnRUaW1lLCBwdHIgKyAxLCA4KTsKKwkJCQlwTWVhc3VyZVJlcUluZm8tPk1lYXN1cmVSZXEuTWVhc3VyZVN0YXJ0VGltZSA9IFNXQVA2NChNZWFzdXJlU3RhcnRUaW1lKTsKKwkJCQlOZGlzTW92ZU1lbW9yeSgmTWVhc3VyZUR1cmF0aW9uLCBwdHIgKyA5LCAyKTsKKwkJCQlwTWVhc3VyZVJlcUluZm8tPk1lYXN1cmVSZXEuTWVhc3VyZUR1cmF0aW9uID0gU1dBUDE2KE1lYXN1cmVEdXJhdGlvbik7CisKKwkJCQlyZXN1bHQgPSBUUlVFOworCQkJCWJyZWFrOworCisJCQlkZWZhdWx0OgorCQkJCWJyZWFrOworCQl9CisJCWVpZF9wdHIgPSAoUEVJRF9TVFJVQ1QpKChVQ0hBUiopZWlkX3B0ciArIDIgKyBlaWRfcHRyLT5MZW4pOworCX0KKworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJTWVhc3VyZW1lbnQgcmVwb3J0IGFjdGlvbiBmcmFtZSBzYW5pdHkgY2hlY2suCisKKwlQYXJhbWV0cnM6CisJCTEuIE1MTUUgbWVzc2FnZSBjb250YWluaW5nIHRoZSByZWNlaXZlZCBmcmFtZQorCQkyLiBtZXNzYWdlIGxlbmd0aC4KKwkJMy4gTWVhc3VyZW1lbnQgcmVwb3J0IGluZm9tYXRpb24gYnVmZmVyLgorCQk0LiBiYXNpYyByZXBvcnQgaW5mb21hdGlvbiBidWZmZXIuCisKKwlSZXR1cm4JOiBOb25lLgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworLyoKKyAgTWVhc3VyZW1lbnQgUmVwb3J0IElFLgorICArLS0tLSstLS0tLSstLS0tLS0tKy0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKKyAgfCBJRCB8IExlbiB8IFRva2VuIHwgUmVwb3J0IE1vZGUgfCBNZWFzdXJlIFR5cGUgfCBNZWFzdXJlIFJlcG9ydCB8CisgICstLS0tKy0tLS0tKy0tLS0tLS0rLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKworICAgIDEgICAgIDEgICAgICAxICAgICAgICAgIDEgICAgICAgICAgICAgMSAgICAgICAgICAgIHZhcmlhYmxlCisKKyAgQmFzaWMgUmVwb3J0LgorICArLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0rLS0tLS0rCisgIHwgQ2ggTnVtIHwgU3RhcnQgVGltZSB8IER1cmF0aW9uIHwgTWFwIHwKKyAgKy0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tKy0tLS0tKworICAgICAgMSAgICAgICAgICA4ICAgICAgICAgICAyICAgICAgICAxCisKKyAgTWFwIEZpZWxkIEJpdCBGb3JtYXQuCisgICstLS0tLSstLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0rCisgIHwgQnNzIHwgT0ZETSBQcmVhbWJsZSB8IFVuaWRlbnRpZmllZCBzaWduYWwgfCBSYWRhciB8IFVubWVhc3VyZWQgfCBSZXNlcnZlZCB8CisgICstLS0tLSstLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0rCisgICAgIDAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgIDMgICAgICAgICA0ICAgICAgICAgIDUtNworKi8KK3N0YXRpYyBCT09MRUFOIFBlZXJNZWFzdXJlUmVwb3J0U2FuaXR5KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFZPSUQgKnBNc2csCisJSU4gVUxPTkcgTXNnTGVuLAorCU9VVCBQVUlOVDggcERpYWxvZ1Rva2VuLAorCU9VVCBQTUVBU1VSRV9SRVBPUlRfSU5GTyBwTWVhc3VyZVJlcG9ydEluZm8sCisJT1VUIFBVSU5UOCBwUmVwb3J0QnVmKQoreworCVBGUkFNRV84MDJfMTEgRnIgPSAoUEZSQU1FXzgwMl8xMSlwTXNnOworCVBVQ0hBUiBwRnJhbWVQdHIgPSBGci0+T2N0ZXQ7CisJQk9PTEVBTiByZXN1bHQgPSBGQUxTRTsKKwlQRUlEX1NUUlVDVCBlaWRfcHRyOworCVBVQ0hBUiBwdHI7CisKKwkvLyBza2lwIDgwMi4xMSBoZWFkZXIuCisJTXNnTGVuIC09IHNpemVvZihIRUFERVJfODAyXzExKTsKKworCS8vIHNraXAgY2F0ZWdvcnkgYW5kIGFjdGlvbiBjb2RlLgorCXBGcmFtZVB0ciArPSAyOworCU1zZ0xlbiAtPSAyOworCisJaWYgKHBNZWFzdXJlUmVwb3J0SW5mbyA9PSBOVUxMKQorCQlyZXR1cm4gcmVzdWx0OworCisJTmRpc01vdmVNZW1vcnkocERpYWxvZ1Rva2VuLCBwRnJhbWVQdHIsIDEpOworCXBGcmFtZVB0ciArPSAxOworCU1zZ0xlbiAtPSAxOworCisJZWlkX3B0ciA9IChQRUlEX1NUUlVDVClwRnJhbWVQdHI7CisJd2hpbGUgKCgoVUNIQVIqKWVpZF9wdHIgKyBlaWRfcHRyLT5MZW4gKyAxKSA8ICgoUFVDSEFSKXBGcmFtZVB0ciArIE1zZ0xlbikpCisJeworCQlzd2l0Y2goZWlkX3B0ci0+RWlkKQorCQl7CisJCQljYXNlIElFX01FQVNVUkVNRU5UX1JFUE9SVDoKKwkJCQlOZGlzTW92ZU1lbW9yeSgmcE1lYXN1cmVSZXBvcnRJbmZvLT5Ub2tlbiwgZWlkX3B0ci0+T2N0ZXQsIDEpOworCQkJCU5kaXNNb3ZlTWVtb3J5KCZwTWVhc3VyZVJlcG9ydEluZm8tPlJlcG9ydE1vZGUsIGVpZF9wdHItPk9jdGV0ICsgMSwgMSk7CisJCQkJTmRpc01vdmVNZW1vcnkoJnBNZWFzdXJlUmVwb3J0SW5mby0+UmVwb3J0VHlwZSwgZWlkX3B0ci0+T2N0ZXQgKyAyLCAxKTsKKwkJCQlpZiAocE1lYXN1cmVSZXBvcnRJbmZvLT5SZXBvcnRUeXBlID09IFJNX0JBU0lDKQorCQkJCXsKKwkJCQkJUE1FQVNVUkVfQkFTSUNfUkVQT1JUIHBSZXBvcnQgPSAoUE1FQVNVUkVfQkFTSUNfUkVQT1JUKXBSZXBvcnRCdWY7CisJCQkJCXB0ciA9IGVpZF9wdHItPk9jdGV0ICsgMzsKKwkJCQkJTmRpc01vdmVNZW1vcnkoJnBSZXBvcnQtPkNoTnVtLCBwdHIsIDEpOworCQkJCQlOZGlzTW92ZU1lbW9yeSgmcFJlcG9ydC0+TWVhc3VyZVN0YXJ0VGltZSwgcHRyICsgMSwgOCk7CisJCQkJCU5kaXNNb3ZlTWVtb3J5KCZwUmVwb3J0LT5NZWFzdXJlRHVyYXRpb24sIHB0ciArIDksIDIpOworCQkJCQlOZGlzTW92ZU1lbW9yeSgmcFJlcG9ydC0+TWFwLCBwdHIgKyAxMSwgMSk7CisKKwkJCQl9CisJCQkJZWxzZSBpZiAocE1lYXN1cmVSZXBvcnRJbmZvLT5SZXBvcnRUeXBlID09IFJNX0NDQSkKKwkJCQl7CisJCQkJCVBNRUFTVVJFX0NDQV9SRVBPUlQgcFJlcG9ydCA9IChQTUVBU1VSRV9DQ0FfUkVQT1JUKXBSZXBvcnRCdWY7CisJCQkJCXB0ciA9IGVpZF9wdHItPk9jdGV0ICsgMzsKKwkJCQkJTmRpc01vdmVNZW1vcnkoJnBSZXBvcnQtPkNoTnVtLCBwdHIsIDEpOworCQkJCQlOZGlzTW92ZU1lbW9yeSgmcFJlcG9ydC0+TWVhc3VyZVN0YXJ0VGltZSwgcHRyICsgMSwgOCk7CisJCQkJCU5kaXNNb3ZlTWVtb3J5KCZwUmVwb3J0LT5NZWFzdXJlRHVyYXRpb24sIHB0ciArIDksIDIpOworCQkJCQlOZGlzTW92ZU1lbW9yeSgmcFJlcG9ydC0+Q0NBX0J1c3lfRnJhY3Rpb24sIHB0ciArIDExLCAxKTsKKworCQkJCX0KKwkJCQllbHNlIGlmIChwTWVhc3VyZVJlcG9ydEluZm8tPlJlcG9ydFR5cGUgPT0gUk1fUlBJX0hJU1RPR1JBTSkKKwkJCQl7CisJCQkJCVBNRUFTVVJFX1JQSV9SRVBPUlQgcFJlcG9ydCA9IChQTUVBU1VSRV9SUElfUkVQT1JUKXBSZXBvcnRCdWY7CisJCQkJCXB0ciA9IGVpZF9wdHItPk9jdGV0ICsgMzsKKwkJCQkJTmRpc01vdmVNZW1vcnkoJnBSZXBvcnQtPkNoTnVtLCBwdHIsIDEpOworCQkJCQlOZGlzTW92ZU1lbW9yeSgmcFJlcG9ydC0+TWVhc3VyZVN0YXJ0VGltZSwgcHRyICsgMSwgOCk7CisJCQkJCU5kaXNNb3ZlTWVtb3J5KCZwUmVwb3J0LT5NZWFzdXJlRHVyYXRpb24sIHB0ciArIDksIDIpOworCQkJCQlOZGlzTW92ZU1lbW9yeSgmcFJlcG9ydC0+UlBJX0RlbnNpdHksIHB0ciArIDExLCA4KTsKKwkJCQl9CisJCQkJcmVzdWx0ID0gVFJVRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworCQkJZGVmYXVsdDoKKwkJCQlicmVhazsKKwkJfQorCQllaWRfcHRyID0gKFBFSURfU1RSVUNUKSgoVUNIQVIqKWVpZF9wdHIgKyAyICsgZWlkX3B0ci0+TGVuKTsKKwl9CisKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVRQQyBSZXF1ZXN0IGFjdGlvbiBmcmFtZSBzYW5pdHkgY2hlY2suCisKKwlQYXJhbWV0cnM6CisJCTEuIE1MTUUgbWVzc2FnZSBjb250YWluaW5nIHRoZSByZWNlaXZlZCBmcmFtZQorCQkyLiBtZXNzYWdlIGxlbmd0aC4KKwkJMy4gRGlhbG9nIFRva2VuLgorCisJUmV0dXJuCTogTm9uZS4KKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitzdGF0aWMgQk9PTEVBTiBQZWVyVHBjUmVxU2FuaXR5KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFZPSUQgKnBNc2csCisJSU4gVUxPTkcgTXNnTGVuLAorCU9VVCBQVUlOVDggcERpYWxvZ1Rva2VuKQoreworCVBGUkFNRV84MDJfMTEgRnIgPSAoUEZSQU1FXzgwMl8xMSlwTXNnOworCVBVQ0hBUiBwRnJhbWVQdHIgPSBGci0+T2N0ZXQ7CisJQk9PTEVBTiByZXN1bHQgPSBGQUxTRTsKKwlQRUlEX1NUUlVDVCBlaWRfcHRyOworCisJTXNnTGVuIC09IHNpemVvZihIRUFERVJfODAyXzExKTsKKworCS8vIHNraXAgY2F0ZWdvcnkgYW5kIGFjdGlvbiBjb2RlLgorCXBGcmFtZVB0ciArPSAyOworCU1zZ0xlbiAtPSAyOworCisJaWYgKHBEaWFsb2dUb2tlbiA9PSBOVUxMKQorCQlyZXR1cm4gcmVzdWx0OworCisJTmRpc01vdmVNZW1vcnkocERpYWxvZ1Rva2VuLCBwRnJhbWVQdHIsIDEpOworCXBGcmFtZVB0ciArPSAxOworCU1zZ0xlbiAtPSAxOworCisJZWlkX3B0ciA9IChQRUlEX1NUUlVDVClwRnJhbWVQdHI7CisJd2hpbGUgKCgoVUNIQVIqKWVpZF9wdHIgKyBlaWRfcHRyLT5MZW4gKyAxKSA8ICgoUFVDSEFSKXBGcmFtZVB0ciArIE1zZ0xlbikpCisJeworCQlzd2l0Y2goZWlkX3B0ci0+RWlkKQorCQl7CisJCQljYXNlIElFX1RQQ19SRVFVRVNUOgorCQkJCXJlc3VsdCA9IFRSVUU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKwkJCWRlZmF1bHQ6CisJCQkJYnJlYWs7CisJCX0KKwkJZWlkX3B0ciA9IChQRUlEX1NUUlVDVCkoKFVDSEFSKillaWRfcHRyICsgMiArIGVpZF9wdHItPkxlbik7CisJfQorCisJcmV0dXJuIHJlc3VsdDsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlUUEMgUmVwb3J0IGFjdGlvbiBmcmFtZSBzYW5pdHkgY2hlY2suCisKKwlQYXJhbWV0cnM6CisJCTEuIE1MTUUgbWVzc2FnZSBjb250YWluaW5nIHRoZSByZWNlaXZlZCBmcmFtZQorCQkyLiBtZXNzYWdlIGxlbmd0aC4KKwkJMy4gRGlhbG9nIFRva2VuLgorCQk0LiBUUEMgUmVwb3J0IElFLgorCisJUmV0dXJuCTogTm9uZS4KKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitzdGF0aWMgQk9PTEVBTiBQZWVyVHBjUmVwU2FuaXR5KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFZPSUQgKnBNc2csCisJSU4gVUxPTkcgTXNnTGVuLAorCU9VVCBQVUlOVDggcERpYWxvZ1Rva2VuLAorCU9VVCBQVFBDX1JFUE9SVF9JTkZPIHBUcGNSZXBJbmZvKQoreworCVBGUkFNRV84MDJfMTEgRnIgPSAoUEZSQU1FXzgwMl8xMSlwTXNnOworCVBVQ0hBUiBwRnJhbWVQdHIgPSBGci0+T2N0ZXQ7CisJQk9PTEVBTiByZXN1bHQgPSBGQUxTRTsKKwlQRUlEX1NUUlVDVCBlaWRfcHRyOworCisJTXNnTGVuIC09IHNpemVvZihIRUFERVJfODAyXzExKTsKKworCS8vIHNraXAgY2F0ZWdvcnkgYW5kIGFjdGlvbiBjb2RlLgorCXBGcmFtZVB0ciArPSAyOworCU1zZ0xlbiAtPSAyOworCisJaWYgKHBEaWFsb2dUb2tlbiA9PSBOVUxMKQorCQlyZXR1cm4gcmVzdWx0OworCisJTmRpc01vdmVNZW1vcnkocERpYWxvZ1Rva2VuLCBwRnJhbWVQdHIsIDEpOworCXBGcmFtZVB0ciArPSAxOworCU1zZ0xlbiAtPSAxOworCisJZWlkX3B0ciA9IChQRUlEX1NUUlVDVClwRnJhbWVQdHI7CisJd2hpbGUgKCgoVUNIQVIqKWVpZF9wdHIgKyBlaWRfcHRyLT5MZW4gKyAxKSA8ICgoUFVDSEFSKXBGcmFtZVB0ciArIE1zZ0xlbikpCisJeworCQlzd2l0Y2goZWlkX3B0ci0+RWlkKQorCQl7CisJCQljYXNlIElFX1RQQ19SRVBPUlQ6CisJCQkJTmRpc01vdmVNZW1vcnkoJnBUcGNSZXBJbmZvLT5UeFB3ciwgZWlkX3B0ci0+T2N0ZXQsIDEpOworCQkJCU5kaXNNb3ZlTWVtb3J5KCZwVHBjUmVwSW5mby0+TGlua01hcmdpbiwgZWlkX3B0ci0+T2N0ZXQgKyAxLCAxKTsKKwkJCQlyZXN1bHQgPSBUUlVFOworICAgICAgICAgICAgICAgIGJyZWFrOworCisJCQlkZWZhdWx0OgorCQkJCWJyZWFrOworCQl9CisJCWVpZF9wdHIgPSAoUEVJRF9TVFJVQ1QpKChVQ0hBUiopZWlkX3B0ciArIDIgKyBlaWRfcHRyLT5MZW4pOworCX0KKworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJQ2hhbm5lbCBTd2l0Y2ggQW5ub3VuY2VtZW50IGFjdGlvbiBmcmFtZSBoYW5kbGVyLgorCisJUGFyYW1ldHJzOgorCQlFbG1lIC0gTUxNRSBtZXNzYWdlIGNvbnRhaW5pbmcgdGhlIHJlY2VpdmVkIGZyYW1lCisKKwlSZXR1cm4JOiBOb25lLgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK3N0YXRpYyBWT0lEIFBlZXJDaFN3QW5uQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlDSF9TV19BTk5fSU5GTyBDaFN3QW5uSW5mbzsKKwlQRlJBTUVfODAyXzExIHBGciA9IChQRlJBTUVfODAyXzExKUVsZW0tPk1zZzsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlVQ0hBUiBpbmRleCA9IDAsIENoYW5uZWwgPSAwLCBOZXdDaGFubmVsID0gMDsKKwlVTE9ORyBCc3NpZHggPSAwOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJTmRpc1plcm9NZW1vcnkoJkNoU3dBbm5JbmZvLCBzaXplb2YoQ0hfU1dfQU5OX0lORk8pKTsKKwlpZiAoISBQZWVyQ2hTd0FublNhbml0eShwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuLCAmQ2hTd0FubkluZm8pKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSW52YWxpZCBDaGFubmVsIFN3aXRjaCBBY3Rpb24gRnJhbWUuXG4iKSk7CisJCXJldHVybjsKKwl9CisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCWlmIChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKQorCXsKKwkJQnNzaWR4ID0gQnNzVGFibGVTZWFyY2goJnBBZC0+U2NhblRhYiwgcEZyLT5IZHIuQWRkcjMsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpOworCQlpZiAoQnNzaWR4ID09IEJTU19OT1RfRk9VTkQpCisJCXsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXJDaFN3QW5uQWN0aW9uIC0gQnNzaWR4IGlzIG5vdCBmb3VuZFxuIikpOworCQkJcmV0dXJuOworCQl9CisKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiXG4qKioqQnNzaWR4IGlzICVkLCBDaGFubmVsID0gJWRcbiIsIGluZGV4LCBwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzaWR4XS5DaGFubmVsKSk7CisJCWhleF9kdW1wKCJTU0lEIixwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzaWR4XS5Cc3NpZCAsNik7CisKKwkJQ2hhbm5lbCA9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWw7CisJCU5ld0NoYW5uZWwgPSBDaFN3QW5uSW5mby5DaGFubmVsOworCisJCWlmICgocEFkLT5Db21tb25DZmcuYklFRUU4MDIxMUggPT0gMSkgJiYgKE5ld0NoYW5uZWwgIT0gMCkgJiYgKENoYW5uZWwgIT0gTmV3Q2hhbm5lbCkpCisJCXsKKwkJCS8vIFN3aXRjaGluZyB0byBjaGFubmVsIDEgY2FuIHByZXZlbnQgZnJvbSByZXNjYW5uaW5nIHRoZSBjdXJyZW50IGNoYW5uZWwgaW1tZWRpYXRlbHkgKGJ5IGF1dG8gcmVjb25uZWN0aW9uKS4KKwkJCS8vIEluIGFkZGl0aW9uLCBjbGVhciB0aGUgTUxNRSBxdWV1ZSBhbmQgdGhlIHNjYW4gdGFibGUgdG8gZGlzY2FyZCB0aGUgUlggcGFja2V0cyBhbmQgcHJldmlvdXMgc2Nhbm5pbmcgcmVzdWx0cy4KKwkJCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgMSwgRkFMU0UpOworCQkJQXNpY0xvY2tDaGFubmVsKHBBZCwgMSk7CisJCSAgICBMaW5rRG93bihwQWQsIEZBTFNFKTsKKwkJCU1sbWVRdWV1ZUluaXQoJnBBZC0+TWxtZS5RdWV1ZSk7CisJCQlCc3NUYWJsZUluaXQoJnBBZC0+U2NhblRhYik7CisJCSAgICBSVE1QdXNlY0RlbGF5KDEwMDAwMDApOwkJLy8gdXNlIGRlbGF5IHRvIHByZXZlbnQgU1RBIGRvIHJlYXNzb2MKKworCQkJLy8gY2hhbm5lbCBzYW5pdHkgY2hlY2sKKwkJCWZvciAoaW5kZXggPSAwIDsgaW5kZXggPCBwQWQtPkNoYW5uZWxMaXN0TnVtOyBpbmRleCsrKQorCQkJeworCQkJCWlmIChwQWQtPkNoYW5uZWxMaXN0W2luZGV4XS5DaGFubmVsID09IE5ld0NoYW5uZWwpCisJCQkJeworCQkJCQlwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzaWR4XS5DaGFubmVsID0gTmV3Q2hhbm5lbDsKKwkJCQkJcEFkLT5Db21tb25DZmcuQ2hhbm5lbCA9IE5ld0NoYW5uZWw7CisJCQkJCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCwgRkFMU0UpOworCQkJCQlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKTsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJiYmJiYmJiYmJiYmJiYmJlBlZXJDaFN3QW5uQWN0aW9uIC0gU1RBIHJlY2VpdmUgY2hhbm5lbCBzd2l0Y2ggYW5ub3VuY2VtZW50IElFIChOZXcgQ2hhbm5lbCA9JWQpXG4iLCBOZXdDaGFubmVsKSk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKworCQkJaWYgKGluZGV4ID49IHBBZC0+Q2hhbm5lbExpc3ROdW0pCisJCQl7CisJCQkJREJHUFJJTlRfRVJSKCgiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiZQZWVyQ2hTd0FubkFjdGlvbihjYW4gbm90IGZpbmQgTmV3IENoYW5uZWw9JWQgaW4gQ2hhbm5lbExpc3RbJWRdXG4iLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsLCBwQWQtPkNoYW5uZWxMaXN0TnVtKSk7CisJCQl9CisJCX0KKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlyZXR1cm47Cit9CisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlNZWFzdXJlbWVudCBSZXF1ZXN0IGFjdGlvbiBmcmFtZSBoYW5kbGVyLgorCisJUGFyYW1ldHJzOgorCQlFbG1lIC0gTUxNRSBtZXNzYWdlIGNvbnRhaW5pbmcgdGhlIHJlY2VpdmVkIGZyYW1lCisKKwlSZXR1cm4JOiBOb25lLgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK3N0YXRpYyBWT0lEIFBlZXJNZWFzdXJlUmVxQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlQRlJBTUVfODAyXzExIHBGciA9IChQRlJBTUVfODAyXzExKUVsZW0tPk1zZzsKKwlVSU5UOCBEaWFsb2dUb2tlbjsKKwlNRUFTVVJFX1JFUV9JTkZPIE1lYXN1cmVSZXFJbmZvOworCU1FQVNVUkVfUkVQT1JUX01PREUgUmVwb3J0TW9kZTsKKworCWlmKFBlZXJNZWFzdXJlUmVxU2FuaXR5KHBBZCwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4sICZEaWFsb2dUb2tlbiwgJk1lYXN1cmVSZXFJbmZvKSkKKwl7CisJCVJlcG9ydE1vZGUud29yZCA9IDA7CisJCVJlcG9ydE1vZGUuZmllbGQuSW5jYXBhYmxlID0gMTsKKwkJRW5xdWV1ZU1lYXN1cmVtZW50UmVwKHBBZCwgcEZyLT5IZHIuQWRkcjIsIERpYWxvZ1Rva2VuLCBNZWFzdXJlUmVxSW5mby5Ub2tlbiwgUmVwb3J0TW9kZS53b3JkLCBNZWFzdXJlUmVxSW5mby5SZXFUeXBlLCAwLCBOVUxMKTsKKwl9CisKKwlyZXR1cm47Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJTWVhc3VyZW1lbnQgUmVwb3J0IGFjdGlvbiBmcmFtZSBoYW5kbGVyLgorCisJUGFyYW1ldHJzOgorCQlFbG1lIC0gTUxNRSBtZXNzYWdlIGNvbnRhaW5pbmcgdGhlIHJlY2VpdmVkIGZyYW1lCisKKwlSZXR1cm4JOiBOb25lLgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK3N0YXRpYyBWT0lEIFBlZXJNZWFzdXJlUmVwb3J0QWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlNRUFTVVJFX1JFUE9SVF9JTkZPIE1lYXN1cmVSZXBvcnRJbmZvOworCVBGUkFNRV84MDJfMTEgcEZyID0gKFBGUkFNRV84MDJfMTEpRWxlbS0+TXNnOworCVVJTlQ4IERpYWxvZ1Rva2VuOworCVBVSU5UOCBwTWVhc3VyZVJlcG9ydEluZm87CisKKy8vCWlmIChwQWQtPkNvbW1vbkNmZy5iSUVFRTgwMjExSCAhPSBUUlVFKQorLy8JCXJldHVybjsKKworCWlmICgocE1lYXN1cmVSZXBvcnRJbmZvID0ga21hbGxvYyhzaXplb2YoTUVBU1VSRV9SUElfUkVQT1JUKSwgR0ZQX0FUT01JQykpID09IE5VTEwpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlcyB1bmFibGUgdG8gYWxsb2MgbWVtb3J5IGZvciBtZWFzdXJlIHJlcG9ydCBidWZmZXIgKHNpemU9JWQpLlxuIiwgX19mdW5jX18sIHNpemVvZihNRUFTVVJFX1JQSV9SRVBPUlQpKSk7CisJCXJldHVybjsKKwl9CisKKwlOZGlzWmVyb01lbW9yeSgmTWVhc3VyZVJlcG9ydEluZm8sIHNpemVvZihNRUFTVVJFX1JFUE9SVF9JTkZPKSk7CisJTmRpc1plcm9NZW1vcnkocE1lYXN1cmVSZXBvcnRJbmZvLCBzaXplb2YoTUVBU1VSRV9SUElfUkVQT1JUKSk7CisJaWYgKFBlZXJNZWFzdXJlUmVwb3J0U2FuaXR5KHBBZCwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4sICZEaWFsb2dUb2tlbiwgJk1lYXN1cmVSZXBvcnRJbmZvLCBwTWVhc3VyZVJlcG9ydEluZm8pKQorCXsKKwkJZG8geworCQkJUE1FQVNVUkVfUkVRX0VOVFJZIHBFbnRyeSA9IE5VTEw7CisKKwkJCS8vIE5vdCBhIGF1dG9ub21vdXMgbWVhc3VyZSByZXBvcnQuCisJCQkvLyBjaGVjayB0aGUgZGlhbG9nIHRva2VuIGZpZWxkLiBkcm9wIGl0IGlmIHRoZSBkaWFsb2cgdG9rZW4gZG9lc24ndCBtYXRjaC4KKwkJCWlmICgoRGlhbG9nVG9rZW4gIT0gMCkKKwkJCQkmJiAoKHBFbnRyeSA9IE1lYXN1cmVSZXFMb29rVXAocEFkLCBEaWFsb2dUb2tlbikpID09IE5VTEwpKQorCQkJCWJyZWFrOworCisJCQlpZiAocEVudHJ5ICE9IE5VTEwpCisJCQkJTWVhc3VyZVJlcURlbGV0ZShwQWQsIHBFbnRyeS0+RGlhbG9nVG9rZW4pOworCisJCQlpZiAoTWVhc3VyZVJlcG9ydEluZm8uUmVwb3J0VHlwZSA9PSBSTV9CQVNJQykKKwkJCXsKKwkJCQlQTUVBU1VSRV9CQVNJQ19SRVBPUlQgcEJhc2ljUmVwb3J0ID0gKFBNRUFTVVJFX0JBU0lDX1JFUE9SVClwTWVhc3VyZVJlcG9ydEluZm87CisJCQkJaWYgKChwQmFzaWNSZXBvcnQtPk1hcC5maWVsZC5SYWRhcikKKwkJCQkJJiYgKERmc1JlcXVpcmVtZW50Q2hlY2socEFkLCBwQmFzaWNSZXBvcnQtPkNoTnVtKSA9PSBUUlVFKSkKKwkJCQl7CisJCQkJCU5vdGlmeUNoU3dBbm5Ub1BlZXJBUHMocEFkLCBwRnItPkhkci5BZGRyMSwgcEZyLT5IZHIuQWRkcjIsIDEsIHBCYXNpY1JlcG9ydC0+Q2hOdW0pOworCQkJCQlTdGFydERGU1Byb2NlZHVyZShwQWQsIHBCYXNpY1JlcG9ydC0+Q2hOdW0sIDEpOworCQkJCX0KKwkJCX0KKwkJfSB3aGlsZSAoRkFMU0UpOworCX0KKwllbHNlCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkludmFsaWQgTWVhc3VyZW1lbnQgUmVwb3J0IEZyYW1lLlxuIikpOworCisJa2ZyZWUocE1lYXN1cmVSZXBvcnRJbmZvKTsKKworCXJldHVybjsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlUUEMgUmVxdWVzdCBhY3Rpb24gZnJhbWUgaGFuZGxlci4KKworCVBhcmFtZXRyczoKKwkJRWxtZSAtIE1MTUUgbWVzc2FnZSBjb250YWluaW5nIHRoZSByZWNlaXZlZCBmcmFtZQorCisJUmV0dXJuCTogTm9uZS4KKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitzdGF0aWMgVk9JRCBQZWVyVHBjUmVxQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlQRlJBTUVfODAyXzExIHBGciA9IChQRlJBTUVfODAyXzExKUVsZW0tPk1zZzsKKwlQVUNIQVIgcEZyYW1lUHRyID0gcEZyLT5PY3RldDsKKwlVSU5UOCBEaWFsb2dUb2tlbjsKKwlVSU5UOCBUeFB3ciA9IEdldEN1clR4UHdyKHBBZCwgRWxlbS0+V2NpZCk7CisJVUlOVDggTGlua01hcmdpbiA9IDA7CisJQ0hBUiBSZWFsUnNzaTsKKworCS8vIGxpbmsgbWFyZ2luOiBSYXRpbyBvZiB0aGUgcmVjZWl2ZWQgc2lnbmFsIHBvd2VyIHRvIHRoZSBtaW5pbXVtIGRlc2lyZWQgYnkgdGhlIHN0YXRpb24gKFNUQSkuIFRoZQorCS8vCQkJCVNUQSBtYXkgaW5jb3Jwb3JhdGUgcmF0ZSBpbmZvcm1hdGlvbiBhbmQgY2hhbm5lbCBjb25kaXRpb25zLCBpbmNsdWRpbmcgaW50ZXJmZXJlbmNlLCBpbnRvIGl0cyBjb21wdXRhdGlvbgorCS8vCQkJCW9mIGxpbmsgbWFyZ2luLgorCisJUmVhbFJzc2kgPSBSVE1QTWF4UnNzaShwQWQsIENvbnZlcnRUb1Jzc2kocEFkLCBFbGVtLT5Sc3NpMCwgUlNTSV8wKSwKKwkJCQkJCQkJQ29udmVydFRvUnNzaShwQWQsIEVsZW0tPlJzc2kxLCBSU1NJXzEpLAorCQkJCQkJCQlDb252ZXJ0VG9Sc3NpKHBBZCwgRWxlbS0+UnNzaTIsIFJTU0lfMikpOworCisJLy8gc2tpcCBDYXRlZ29yeSBhbmQgYWN0aW9uIGNvZGUuCisJcEZyYW1lUHRyICs9IDI7CisKKwkvLyBEaWFsb2cgdG9rZW4uCisJTmRpc01vdmVNZW1vcnkoJkRpYWxvZ1Rva2VuLCBwRnJhbWVQdHIsIDEpOworCisJTGlua01hcmdpbiA9IChSZWFsUnNzaSAvIE1JTl9SQ1ZfUFdSKTsKKwlpZiAoUGVlclRwY1JlcVNhbml0eShwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuLCAmRGlhbG9nVG9rZW4pKQorCQlFbnF1ZXVlVFBDUmVwKHBBZCwgcEZyLT5IZHIuQWRkcjIsIERpYWxvZ1Rva2VuLCBUeFB3ciwgTGlua01hcmdpbik7CisKKwlyZXR1cm47Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJVFBDIFJlcG9ydCBhY3Rpb24gZnJhbWUgaGFuZGxlci4KKworCVBhcmFtZXRyczoKKwkJRWxtZSAtIE1MTUUgbWVzc2FnZSBjb250YWluaW5nIHRoZSByZWNlaXZlZCBmcmFtZQorCisJUmV0dXJuCTogTm9uZS4KKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitzdGF0aWMgVk9JRCBQZWVyVHBjUmVwQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlVSU5UOCBEaWFsb2dUb2tlbjsKKwlUUENfUkVQT1JUX0lORk8gVHBjUmVwSW5mbzsKKwlQVFBDX1JFUV9FTlRSWSBwRW50cnkgPSBOVUxMOworCisJTmRpc1plcm9NZW1vcnkoJlRwY1JlcEluZm8sIHNpemVvZihUUENfUkVQT1JUX0lORk8pKTsKKwlpZiAoUGVlclRwY1JlcFNhbml0eShwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuLCAmRGlhbG9nVG9rZW4sICZUcGNSZXBJbmZvKSkKKwl7CisJCWlmICgocEVudHJ5ID0gVHBjUmVxTG9va1VwKHBBZCwgRGlhbG9nVG9rZW4pKSAhPSBOVUxMKQorCQl7CisJCQlUcGNSZXFEZWxldGUocEFkLCBwRW50cnktPkRpYWxvZ1Rva2VuKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOiBEaWFsb2dUb2tlbj0leCwgVHhQd3I9JWQsIExpbmtNYXJnaW49JWRcbiIsCisJCQkJX19mdW5jX18sIERpYWxvZ1Rva2VuLCBUcGNSZXBJbmZvLlR4UHdyLCBUcGNSZXBJbmZvLkxpbmtNYXJnaW4pKTsKKwkJfQorCX0KKworCXJldHVybjsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlTcGVjdHJ1biBhY3Rpb24gZnJhbWVzIEhhbmRsZXIgc3VjaCBhcyBjaGFubmVsIHN3aXRjaCBhbm5vdWNlbWVudCwKKwkJbWVhc3VyZW1lbnQgcmVwb3J0LCBtZWFzdXJlbWVudCByZXF1ZXN0IGFjdGlvbnMgZnJhbWVzLgorCisJUGFyYW1ldHJzOgorCQlFbG1lIC0gTUxNRSBtZXNzYWdlIGNvbnRhaW5pbmcgdGhlIHJlY2VpdmVkIGZyYW1lCisKKwlSZXR1cm4JOiBOb25lLgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgUGVlclNwZWN0cnVtQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKworCVVDSEFSCUFjdGlvbiA9IEVsZW0tPk1zZ1tMRU5HVEhfODAyXzExKzFdOworCisJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJJRUVFODAyMTFIICE9IFRSVUUpCisJCXJldHVybjsKKworCXN3aXRjaChBY3Rpb24pCisJeworCQljYXNlIFNQRUNfTVJROgorCQkJLy8gY3VycmVudCBydDI4NjAgdW5hYmxlIGRvIHN1Y2ggbWVhc3VyZSBzcGVjaWZpZWQgaW4gTWVhc3VyZW1lbnQgUmVxdWVzdC4KKwkJCS8vIHJlamVjdCBhbGwgbWVhc3VyZW1lbnQgcmVxdWVzdC4KKwkJCVBlZXJNZWFzdXJlUmVxQWN0aW9uKHBBZCwgRWxlbSk7CisJCQlicmVhazsKKworCQljYXNlIFNQRUNfTVJQOgorCQkJUGVlck1lYXN1cmVSZXBvcnRBY3Rpb24ocEFkLCBFbGVtKTsKKwkJCWJyZWFrOworCisJCWNhc2UgU1BFQ19UUENSUToKKwkJCVBlZXJUcGNSZXFBY3Rpb24ocEFkLCBFbGVtKTsKKwkJCWJyZWFrOworCisJCWNhc2UgU1BFQ19UUENSUDoKKwkJCVBlZXJUcGNSZXBBY3Rpb24ocEFkLCBFbGVtKTsKKwkJCWJyZWFrOworCisJCWNhc2UgU1BFQ19DSEFOTkVMX1NXSVRDSDoKK3sKKyNpZmRlZiBET1QxMU5fRFJBRlQzCisJCQkJU0VDX0NIQV9PRkZTRVRfSUUJU2Vjb25kYXJ5OworCQkJCUNIQV9TV0lUQ0hfQU5OT1VOQ0VfSUUJQ2hhbm5lbFN3aXRjaDsKKworCQkJCS8vIDgwMi4xMWggb25seSBoYXMgQ2hhbm5lbCBTd2l0Y2ggQW5ub3VuY2VtZW50IElFLgorCQkJCVJUTVBNb3ZlTWVtb3J5KCZDaGFubmVsU3dpdGNoLCAmRWxlbS0+TXNnW0xFTkdUSF84MDJfMTErNF0sIHNpemVvZiAoQ0hBX1NXSVRDSF9BTk5PVU5DRV9JRSkpOworCisJCQkJLy8gODAyLjExbiBEMy4wMyBhZGRzIHNlY29uZGFyeSBjaGFubmVsIG9mZnNldCBlbGVtZW50IGluIHRoZSBlbmQuCisJCQkJaWYgKEVsZW0tPk1zZ0xlbiA9PSAgKExFTkdUSF84MDJfMTEgKyAyICsgc2l6ZW9mIChDSEFfU1dJVENIX0FOTk9VTkNFX0lFKSArIHNpemVvZiAoU0VDX0NIQV9PRkZTRVRfSUUpKSkKKwkJCQl7CisJCQkJCVJUTVBNb3ZlTWVtb3J5KCZTZWNvbmRhcnksICZFbGVtLT5Nc2dbTEVOR1RIXzgwMl8xMSs5XSwgc2l6ZW9mIChTRUNfQ0hBX09GRlNFVF9JRSkpOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlTZWNvbmRhcnkuU2Vjb25kYXJ5Q2hhbm5lbE9mZnNldCA9IDA7CisJCQkJfQorCisJCQkJaWYgKChFbGVtLT5Nc2dbTEVOR1RIXzgwMl8xMSsyXSA9PSBJRV9DSEFOTkVMX1NXSVRDSF9BTk5PVU5DRU1FTlQpICYmIChFbGVtLT5Nc2dbTEVOR1RIXzgwMl8xMSszXSA9PSAzKSkKKwkJCQl7CisJCQkJCUNoYW5uZWxTd2l0Y2hBY3Rpb24ocEFkLCBFbGVtLT5XY2lkLCBDaGFubmVsU3dpdGNoLk5ld0NoYW5uZWwsIFNlY29uZGFyeS5TZWNvbmRhcnlDaGFubmVsT2Zmc2V0KTsKKwkJCQl9CisjZW5kaWYgLy8gRE9UMTFOX0RSQUZUMyAvLworfQorCQkJUGVlckNoU3dBbm5BY3Rpb24ocEFkLCBFbGVtKTsKKwkJCWJyZWFrOworCX0KKworCXJldHVybjsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCisJUGFyYW1ldHJzOgorCisJUmV0dXJuCTogTm9uZS4KKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitJTlQgU2V0X01lYXN1cmVSZXFfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJVUlOVCBBaWQgPSAxOworCVVJTlQgQXJnSWR4OworCVBVQ0hBUiB0aGlzQ2hhcjsKKworCU1FQVNVUkVfUkVRX01PREUgTWVhc3VyZVJlcU1vZGU7CisJVUlOVDggTWVhc3VyZVJlcVRva2VuID0gUmFuZG9tQnl0ZShwQWQpOworCVVJTlQ4IE1lYXN1cmVSZXFUeXBlID0gUk1fQkFTSUM7CisJVUlOVDggTWVhc3VyZUNoID0gMTsKKworCUFyZ0lkeCA9IDE7CisJd2hpbGUgKCh0aGlzQ2hhciA9IHN0cnNlcCgoY2hhciAqKikmYXJnLCAiLSIpKSAhPSBOVUxMKQorCXsKKwkJc3dpdGNoKEFyZ0lkeCkKKwkJeworCQkJY2FzZSAxOgkvLyBBaWQuCisJCQkJQWlkID0gc2ltcGxlX3N0cnRvbCh0aGlzQ2hhciwgMCwgMTYpOworCQkJCWJyZWFrOworCisJCQljYXNlIDI6IC8vIE1lYXN1cmVtZW50IFJlcXVlc3QgVHlwZS4KKwkJCQlNZWFzdXJlUmVxVHlwZSA9IHNpbXBsZV9zdHJ0b2wodGhpc0NoYXIsIDAsIDE2KTsKKwkJCQlpZiAoTWVhc3VyZVJlcVR5cGUgPiAzKQorCQkJCXsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXM6IHVua25vdyBNZWFzdXJlUmVxVHlwZSglZClcbiIsIF9fZnVuY19fLCBNZWFzdXJlUmVxVHlwZSkpOworCQkJCQlyZXR1cm4gVFJVRTsKKwkJCQl9CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgMzogLy8gTWVhc3VyZW1lbnQgY2hhbm5lbC4KKwkJCQlNZWFzdXJlQ2ggPSBzaW1wbGVfc3RydG9sKHRoaXNDaGFyLCAwLCAxNik7CisJCQkJYnJlYWs7CisJCX0KKwkJQXJnSWR4Kys7CisJfQorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OkFpZCA9ICVkLCBNZWFzdXJlUmVxVHlwZT0lZCBNZWFzdXJlQ2g9JWRcbiIsIF9fZnVuY19fLCBBaWQsIE1lYXN1cmVSZXFUeXBlLCBNZWFzdXJlQ2gpKTsKKwlpZiAoIVZBTElEX1dDSUQoQWlkKSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzOiB1bmtub3cgc3RhIG9mIEFpZCglZClcbiIsIF9fZnVuY19fLCBBaWQpKTsKKwkJcmV0dXJuIFRSVUU7CisJfQorCisJTWVhc3VyZVJlcU1vZGUud29yZCA9IDA7CisJTWVhc3VyZVJlcU1vZGUuZmllbGQuRW5hYmxlID0gMTsKKworCU1lYXN1cmVSZXFJbnNlcnQocEFkLCBNZWFzdXJlUmVxVG9rZW4pOworCisJRW5xdWV1ZU1lYXN1cmVtZW50UmVxKHBBZCwgcEFkLT5NYWNUYWIuQ29udGVudFtBaWRdLkFkZHIsCisJCU1lYXN1cmVSZXFUb2tlbiwgTWVhc3VyZVJlcU1vZGUud29yZCwgTWVhc3VyZVJlcVR5cGUsIE1lYXN1cmVDaCwgMjAwMCk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworSU5UIFNldF9UcGNSZXFfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJVUlOVCBBaWQ7CisKKwlVSU5UOCBUcGNSZXFUb2tlbiA9IFJhbmRvbUJ5dGUocEFkKTsKKworCUFpZCA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxNik7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6QWlkID0gJWRcbiIsIF9fZnVuY19fLCBBaWQpKTsKKwlpZiAoIVZBTElEX1dDSUQoQWlkKSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzOiB1bmtub3cgc3RhIG9mIEFpZCglZClcbiIsIF9fZnVuY19fLCBBaWQpKTsKKwkJcmV0dXJuIFRSVUU7CisJfQorCisJVHBjUmVxSW5zZXJ0KHBBZCwgVHBjUmVxVG9rZW4pOworCisJRW5xdWV1ZVRQQ1JlcShwQWQsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQWlkXS5BZGRyLCBUcGNSZXFUb2tlbik7CisKKwlyZXR1cm4gVFJVRTsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9kZnMuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvZGZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzUyYTYzNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvZGZzLmgKQEAgLTAsMCArMSwxMDAgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgTW9kdWxlIE5hbWU6CisgICAgZGZzLmgKKworICAgIEFic3RyYWN0OgorICAgIFN1cHBvcnQgREZTIGZ1bmN0aW9uLgorCisgICAgUmV2aXNpb24gSGlzdG9yeToKKyAgICBXaG8gICAgICAgV2hlbiAgICAgICAgICAgIFdoYXQKKyAgICAtLS0tLS0tLSAgLS0tLS0tLS0tLSAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBGb25jaGkgICAgMDMtMTItMjAwNyAgICAgIGNyZWF0ZWQKKyovCisKKyNkZWZpbmUgUkFEQVJfUFVMU0UgMQorI2RlZmluZSBSQURBUl9XSURUSCAyCisKKyNkZWZpbmUgV0lEVEhfUkRfSURMRSAwCisjZGVmaW5lIFdJRFRIX1JEX0NIRUNLIDEKKworCitWT0lEIEJicFJhZGFyRGV0ZWN0aW9uU3RhcnQoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpOworCitWT0lEIEJicFJhZGFyRGV0ZWN0aW9uU3RvcCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK1ZPSUQgUmFkYXJEZXRlY3Rpb25TdGFydCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBCT09MRUFOIENUU19Qcm90ZWN0LAorCUlOIFVJTlQ4IENUU1BlcmlvZCk7CisKK1ZPSUQgUmFkYXJEZXRlY3Rpb25TdG9wKAorCUlOIFBSVE1QX0FEQVBURVIJcEFkKTsKKworVk9JRCBSYWRhckRldGVjdFBlcmlvZGljKAorCUlOIFBSVE1QX0FEQVBURVIJcEFkKTsKKworCitCT09MRUFOIFJhZGFyQ2hhbm5lbENoZWNrKAorCUlOIFBSVE1QX0FEQVBURVIJcEFkLAorCUlOIFVDSEFSCQkJQ2gpOworCitVTE9ORyBKYXBSYWRhclR5cGUoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpOworCitVTE9ORyBSVE1QQmJwUmVhZFJhZGFyRHVyYXRpb24oCisJSU4gUFJUTVBfQURBUFRFUglwQWQpOworCitVTE9ORyBSVE1QUmVhZFJhZGFyRHVyYXRpb24oCisJSU4gUFJUTVBfQURBUFRFUglwQWQpOworCitWT0lEIFJUTVBDbGVhblJhZGFyRHVyYXRpb24oCisJSU4gUFJUTVBfQURBUFRFUglwQWQpOworCitWT0lEIFJUTVBQcmVwYXJlUkRDVFNGcmFtZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlwREEsCisJSU4JVUxPTkcJCQlEdXJhdGlvbiwKKwlJTiAgVUNIQVIgICAgICAgICAgIFJUU1JhdGUsCisJSU4gIFVMT05HICAgICAgICAgICBDVFNCYXNlQWRkciwKKwlJTiAgVUNIQVIJCQlGcmFtZUdhcCk7CisKK1ZPSUQgUlRNUFByZXBhcmVSYWRhckRldGVjdFBhcmFtcygKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCk7CisKKworSU5UIFNldF9DaE1vdmluZ1RpbWVfUHJvYygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBQVUNIQVIgYXJnKTsKKworSU5UIFNldF9Mb25nUHVsc2VSYWRhclRoX1Byb2MoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gUFVDSEFSIGFyZyk7CisKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9sZWFwLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2xlYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODE4YzFmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9sZWFwLmgKQEAgLTAsMCArMSwyMTUgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJTW9kdWxlIE5hbWU6CisJbGVhcC5oCisKKwlBYnN0cmFjdDoKKworCVJldmlzaW9uIEhpc3Rvcnk6CisJV2hvCQkJV2hlbgkJCVdoYXQKKwktLS0tLS0tLQktLS0tLS0tLS0tCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJTmFtZQkJRGF0ZQkJCU1vZGlmaWNhdGlvbiBsb2dzCisqLworI2lmbmRlZiBfX0xFQVBfSF9fCisjZGVmaW5lIF9fTEVBUF9IX18KKworLy8gTWVzc2FnZXMgZm9yIEFzc29jaWF0ZSBzdGF0ZSBtYWNoaW5lCisjZGVmaW5lIExFQVBfTUFDSElORV9CQVNFICAgICAgICAgICAgICAgICAgIDMwCisKKyNkZWZpbmUgTEVBUF9NU0dfUkVRVUVTVF9JREVOVElUWSAgICAgICAgICAgMzEKKyNkZWZpbmUgTEVBUF9NU0dfUkVRVUVTVF9MRUFQICAgICAgICAgICAgICAgMzIKKyNkZWZpbmUgTEVBUF9NU0dfU1VDQ0VTUyAgICAgICAgICAgICAgICAgICAgMzMKKyNkZWZpbmUgTEVBUF9NU0dfRkFJTEVEICAgICAgICAgICAgICAgICAgICAgMzQKKyNkZWZpbmUgTEVBUF9NU0dfUkVTUE9OU0VfTEVBUCAgICAgICAgICAgICAgMzUKKyNkZWZpbmUgTEVBUF9NU0dfRUFQT0xLRVkgICAgICAgICAgICAgICAgICAgMzYKKyNkZWZpbmUgTEVBUF9NU0dfVU5LTk9XTiAgICAgICAgICAgICAgICAgICAgMzcKKyNkZWZpbmUgTEVBUF9NU0cgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzgKKy8vISBhc3NvYyBzdGF0ZS1tYWNoaW5lIHN0YXRlcworI2RlZmluZSBMRUFQX0lETEUgICAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIExFQVBfV0FJVF9JREVOVElUWV9SRVFVRVNUICAgICAgICAgIDEKKyNkZWZpbmUgTEVBUF9XQUlUX0NIQU5MTEVOR0VfUkVRVUVTVCAgICAgICAgMgorI2RlZmluZSBMRUFQX1dBSVRfU1VDQ0VTUyAgICAgICAgICAgICAgICAgICAzCisjZGVmaW5lIExFQVBfV0FJVF9DSEFOTExFTkdFX1JFU1BPTlNFICAgICAgIDQKKyNkZWZpbmUgTEVBUF9XQUlUX0VBUE9MS0VZICAgICAgICAgICAgICAgICAgNQorCisjZGVmaW5lIExFQVBfUkVBU09OX0lOVkFMSURfQVVUSCAgICAgICAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBMRUFQX1JFQVNPTl9BVVRIX1RJTUVPVVQgICAgICAgICAgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgTEVBUF9SRUFTT05fQ0hBTExFTkdFX0ZST01fQVBfRkFJTEVEICAgICAgICAweDAzCisjZGVmaW5lIExFQVBfUkVBU09OX0NIQUxMRU5HRV9UT19BUF9GQUlMRUQgICAgICAgICAgMHgwNAorCisjZGVmaW5lIENJU0NPX0F1dGhNb2RlTEVBUCAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MAorI2RlZmluZSBDSVNDT19BdXRoTW9kZUxFQVBOb25lICAgICAgICAgICAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgTEVBUF9BVVRIX1RJTUVPVVQgICAgICAgICAgICAgICAgICAgICAgICAgICAzMDAwMAorI2RlZmluZSBMRUFQX0NIQUxMRU5HRV9SRVNQT05TRV9MRU5HVEggICAgICAgICAgICAgIDI0CisjZGVmaW5lIExFQVBfQ0hBTExFTkdFX1JFUVVFU1RfTEVOR1RIICAgICAgICAgICAgICAgOAorCit0eXBlZGVmIHN0cnVjdCBfTEVBUF9FQVBPTF9IRUFERVJfIHsKKyAgICBVQ0hBUiAgICAgICBWZXJzaW9uOworICAgIFVDSEFSICAgICAgIFR5cGU7CisgICAgVUNIQVIgICAgICAgTGVuZ3RoWzJdOworfSBMRUFQX0VBUE9MX0hFQURFUiwgKlBMRUFQX0VBUE9MX0hFQURFUjsKKwordHlwZWRlZiBzdHJ1Y3QgX0xFQVBfRUFQT0xfUEFDS0VUXyB7CisgICAgVUNIQVIgICAgICAgQ29kZTsKKyAgICBVQ0hBUiAgICAgICBJZGVudGlmaWVyOworICAgIFVDSEFSICAgICAgIExlbmd0aFsyXTsKKyAgICBVQ0hBUiAgICAgICBUeXBlOworfSBMRUFQX0VBUE9MX1BBQ0tFVCwgKlBMRUFQX0VBUE9MX1BBQ0tFVDsKKwordHlwZWRlZiBzdHJ1Y3QgX0xFQVBfRUFQX0NPTlRFTlRTXyB7CisgICAgVUNIQVIgICAgICAgVmVyc2lvbjsKKyAgICBVQ0hBUiAgICAgICBSZXNlcnZlZDsKKyAgICBVQ0hBUiAgICAgICBMZW5ndGg7Cit9IExFQVBfRUFQX0NPTlRFTlRTLCAqUExFQVBfRUFQX0NPTlRFTlRTOworCisvKioqIEVBUE9MIGtleSAqKiovCit0eXBlZGVmIHN0cnVjdCBfRUFQT0xfS0VZX0hFQURFUl8geworICAgIFVDSEFSICAgICAgIFR5cGU7CisgICAgVUNIQVIgICAgICAgTGVuZ3RoWzJdOworICAgIFVDSEFSICAgICAgIENvdW50ZXJbOF07CisgICAgVUNIQVIgICAgICAgSVZbMTZdOworICAgIFVDSEFSICAgICAgIEluZGV4OworICAgIFVDSEFSICAgICAgIFNpZ25hdHVyZVsxNl07Cit9IEVBUE9MX0tFWV9IRUFERVIsICpQRUFQT0xfS0VZX0hFQURFUjsKKworQk9PTEVBTiBMZWFwTXNnVHlwZVN1YnN0KAorICAgIElOICBVQ0hBUiAgIEVBUFR5cGUsCisgICAgT1VUIFVMT05HICAgKk1zZ1R5cGUpOworCitWT0lEIExlYXBNYWNoaW5lUGVyZm9ybUFjdGlvbigKKyAgICBJTiBQUlRNUF9BREFQVEVSICAgIHBBZCwKKyAgICBJTiBTVEFURV9NQUNISU5FICAgICpTLAorICAgIElOIE1MTUVfUVVFVUVfRUxFTSAgKkVsZW0pOworCitWT0lEIExlYXBNYWNIZWFkZXJJbml0KAorICAgIElOICBQUlRNUF9BREFQVEVSICAgICAgIHBBZCwKKyAgICBJTiAgT1VUIFBIRUFERVJfODAyXzExICBwSGRyODAyMTEsCisgICAgSU4gIFVDSEFSICAgICAgICAgICAgICAgd2VwLAorICAgIElOICBQVUNIQVIgICAgICAgICAgICAgIHBBZGRyMyk7CisKK1ZPSUQgTGVhcFN0YXJ0QWN0aW9uKAorICAgIElOIFBSVE1QX0FEQVBURVIgICAgcEFkLAorICAgIElOIE1MTUVfUVVFVUVfRUxFTSAgKkVsZW0pOworCitWT0lEIExlYXBJZGVudGl0eUFjdGlvbigKKyAgICBJTiBQUlRNUF9BREFQVEVSICAgIHBBZCwKKyAgICBJTiBNTE1FX1FVRVVFX0VMRU0gICpFbGVtKTsKKworVk9JRCBMZWFwUGVlckNoYWxsZW5nZUFjdGlvbigKKyAgICBJTiBQUlRNUF9BREFQVEVSICAgIHBBZCwKKyAgICBJTiBNTE1FX1FVRVVFX0VMRU0gICpFbGVtKTsKKworVk9JRCBIYXNoUHdkKAorICAgIElOICBQVUNIQVIgIHB3ZCwKKyAgICBJTiAgSU5UICAgICBwd2RsZW4sCisgICAgT1VUIFBVQ0hBUiAgaGFzaCk7CisKK1ZPSUQgUGVlckNoYWxsZW5nZVJlc3BvbnNlKAorICAgIElOICBQVUNIQVIgIHN6Q2hhbGxlbmdlLAorICAgIElOICBQVUNIQVIgIHNtYlBhc3N3ZCwKKyAgICBPVVQgUFVDSEFSICBzelJlc3BvbnNlKTsKKworVk9JRCBQYXJpdHlLZXkoCisgICAgT1VUIFBVQ0hBUiAgc3pPdXQsCisgICAgSU4gIFBVQ0hBUiAgc3pJbik7CisKK1ZPSUQgRGVzS2V5KAorICAgIE9VVCBVTE9ORyAgIGtbMTZdWzJdLAorICAgIElOICBQVUNIQVIgIGtleSwKKyAgICBJTiAgSU5UICAgICBkZWNyeXB0KTsKKworVk9JRCBEZXMoCisgICAgSU4gIFVMT05HICAga3NbMTZdWzJdLAorICAgIE9VVCBVQ0hBUiAgIGJsb2NrWzhdKTsKKworVk9JRCBEZXNFbmNyeXB0KAorICAgIElOICBQVUNIQVIgIHN6Q2xlYXIsCisgICAgSU4gIFBVQ0hBUiAgc3pLZXksCisgICAgT1VUIFBVQ0hBUiAgc3pPdXQpOworCitWT0lEIExlYXBOZXR3b3JrQ2hhbGxlbmdlQWN0aW9uKAorICAgIElOIFBSVE1QX0FEQVBURVIgICAgcEFkLAorICAgIElOIE1MTUVfUVVFVUVfRUxFTSAgKkVsZW0pOworCitWT0lEIExlYXBOZXR3b3JrQ2hhbGxlbmdlUmVzcG9uc2UoCisgICAgSU4gUFJUTVBfQURBUFRFUiAgICBwQWQsCisgICAgSU4gTUxNRV9RVUVVRV9FTEVNICAqRWxlbSk7CisKK1ZPSUQgSGFzaHB3ZEhhc2goCisgICAgSU4gIFBVQ0hBUiAgaGFzaCwKKyAgICBJTiAgUFVDSEFSICBoYXNoaGFzaCk7CisKK1ZPSUQgUHJvY2Vzc1Nlc3Npb25LZXkoCisgICAgT1VUIFBVQ0hBUiAgU2Vzc2lvbktleSwKKyAgICBJTiAgUFVDSEFSICBoYXNoMiwKKyAgICBJTiAgUFVDSEFSICBDaGFsbGVuZ2VUb1JhZGl1cywKKyAgICBJTiAgUFVDSEFSICBDaGFsbGVuZ2VSZXNwb25zZUZyb21SYWRpdXMsCisgICAgSU4gIFBVQ0hBUiAgQ2hhbGxlbmdlRnJvbVJhZGl1cywKKyAgICBJTiAgUFVDSEFSICBDaGFsbGVuZ2VSZXNwb25zZVRvUmFkaXVzKTsKKworVk9JRCBMZWFwRWFwb2xLZXlBY3Rpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUiAgICBwQWQsCisgICAgSU4gTUxNRV9RVUVVRV9FTEVNICAqRWxlbSk7CisKK1ZPSUQgUm9ndWVBcFRhYmxlSW5pdCgKKyAgICBJTiBST0dVRUFQX1RBQkxFICAgICpUYWIpOworCitVTE9ORyBSb2d1ZUFwVGFibGVTZWFyY2goCisgICAgSU4gUk9HVUVBUF9UQUJMRSAgICAqVGFiLAorICAgIElOIFBVQ0hBUiAgICAgICAgICAgcEFkZHIpOworCitWT0lEIFJvZ3VlQXBFbnRyeVNldCgKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKyAgICBPVVQgUk9HVUVBUF9FTlRSWSAgICpwUm9ndWVBcCwKKyAgICBJTiBQVUNIQVIgICAgICAgICAgIHBBZGRyLAorICAgIElOIFVDSEFSICAgICAgICAgICAgRmFpbGVDb2RlKTsKKworVUxPTkcgUm9ndWVBcFRhYmxlU2V0RW50cnkoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisgICAgT1VUIFJPR1VFQVBfVEFCTEUgICpUYWIsCisgICAgSU4gUFVDSEFSICAgICAgICAgICBwQWRkciwKKyAgICBJTiBVQ0hBUiAgICAgICAgICAgIEZhaWxlQ29kZSk7CisKK1ZPSUQgUm9ndWVBcFRhYmxlRGVsZXRlRW50cnkoCisgICAgSU4gT1VUIFJPR1VFQVBfVEFCTEUgKlRhYiwKKyAgICBJTiBQVUNIQVIgICAgICAgICAgcEFkZHIpOworCitWT0lEIExlYXBBdXRoVGltZW91dCgKKyAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCisgICAgSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAorICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKKyAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpOworCitWT0lEIExlYXBTZW5kUm9ndWVBUFJlcG9ydCgKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK0JPT0xFQU4gQ0NLTUFzc29jUnNwU2FuaXR5KAorICAgIElOIFBSVE1QX0FEQVBURVIgICAgcEFkLAorICAgIElOIFZPSUQgICAgICAgICAgICAgKk1zZywKKyAgICBJTiBVTE9ORyAgICAgICAgICAgIE1zZ0xlbik7CisKKyNlbmRpZiAgLy8gX19MRUFQX0hfXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9saW5rX2xpc3QuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvbGlua19saXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY1MjExMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvbGlua19saXN0LmgKQEAgLTAsMCArMSwxMzQgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKyNpZm5kZWYgX19MSU5LX0xJU1RfSF9fCisjZGVmaW5lIF9fTElOS19MSVNUX0hfXworCit0eXBlZGVmIHN0cnVjdCBfTElTVF9FTlRSWQoreworCXN0cnVjdCBfTElTVF9FTlRSWSAqcE5leHQ7Cit9IExJU1RfRU5UUlksICpQTElTVF9FTlRSWTsKKwordHlwZWRlZiBzdHJ1Y3QgX0xJU1RfSEVBRFIKK3sKKwlQTElTVF9FTlRSWSBwSGVhZDsKKwlQTElTVF9FTlRSWSBwVGFpbDsKKwlVQ0hBUiBzaXplOworfSBMSVNUX0hFQURFUiwgKlBMSVNUX0hFQURFUjsKKworc3RhdGljIGlubGluZSBWT0lEIGluaXRMaXN0KAorCUlOIFBMSVNUX0hFQURFUiBwTGlzdCkKK3sKKwlwTGlzdC0+cEhlYWQgPSBwTGlzdC0+cFRhaWwgPSBOVUxMOworCXBMaXN0LT5zaXplID0gMDsKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBpbmxpbmUgVk9JRCBpbnNlcnRUYWlsTGlzdCgKKwlJTiBQTElTVF9IRUFERVIgcExpc3QsCisJSU4gUExJU1RfRU5UUlkgcEVudHJ5KQoreworCXBFbnRyeS0+cE5leHQgPSBOVUxMOworCWlmIChwTGlzdC0+cFRhaWwpCisJCXBMaXN0LT5wVGFpbC0+cE5leHQgPSBwRW50cnk7CisJZWxzZQorCQlwTGlzdC0+cEhlYWQgPSBwRW50cnk7CisJcExpc3QtPnBUYWlsID0gcEVudHJ5OworCXBMaXN0LT5zaXplKys7CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBpbmxpbmUgUExJU1RfRU5UUlkgcmVtb3ZlSGVhZExpc3QoCisJSU4gUExJU1RfSEVBREVSIHBMaXN0KQoreworCVBMSVNUX0VOVFJZIHBOZXh0OworCVBMSVNUX0VOVFJZIHBFbnRyeTsKKworCXBFbnRyeSA9IHBMaXN0LT5wSGVhZDsKKwlpZiAocExpc3QtPnBIZWFkICE9IE5VTEwpCisJeworCQlwTmV4dCA9IHBMaXN0LT5wSGVhZC0+cE5leHQ7CisJCXBMaXN0LT5wSGVhZCA9IHBOZXh0OworCQlpZiAocE5leHQgPT0gTlVMTCkKKwkJCXBMaXN0LT5wVGFpbCA9IE5VTEw7CisJCXBMaXN0LT5zaXplLS07CisJfQorCXJldHVybiBwRW50cnk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGdldExpc3RTaXplKAorCUlOIFBMSVNUX0hFQURFUiBwTGlzdCkKK3sKKwlyZXR1cm4gcExpc3QtPnNpemU7Cit9CisKK3N0YXRpYyBpbmxpbmUgUExJU1RfRU5UUlkgZGVsRW50cnlMaXN0KAorCUlOIFBMSVNUX0hFQURFUiBwTGlzdCwKKwlJTiBQTElTVF9FTlRSWSBwRW50cnkpCit7CisJUExJU1RfRU5UUlkgcEN1ckVudHJ5OworCVBMSVNUX0VOVFJZIHBQcnZFbnRyeTsKKworCWlmKHBMaXN0LT5wSGVhZCA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCWlmKHBFbnRyeSA9PSBwTGlzdC0+cEhlYWQpCisJeworCQlwQ3VyRW50cnkgPSBwTGlzdC0+cEhlYWQ7CisJCXBMaXN0LT5wSGVhZCA9IHBDdXJFbnRyeS0+cE5leHQ7CisKKwkJaWYocExpc3QtPnBIZWFkID09IE5VTEwpCisJCQlwTGlzdC0+cFRhaWwgPSBOVUxMOworCisJCXBMaXN0LT5zaXplLS07CisJCXJldHVybiBwQ3VyRW50cnk7CisJfQorCisJcFBydkVudHJ5ID0gcExpc3QtPnBIZWFkOworCXBDdXJFbnRyeSA9IHBQcnZFbnRyeS0+cE5leHQ7CisJd2hpbGUocEN1ckVudHJ5ICE9IE5VTEwpCisJeworCQlpZiAocEVudHJ5ID09IHBDdXJFbnRyeSkKKwkJeworCQkJcFBydkVudHJ5LT5wTmV4dCA9IHBDdXJFbnRyeS0+cE5leHQ7CisKKwkJCWlmKHBFbnRyeSA9PSBwTGlzdC0+cFRhaWwpCisJCQkJcExpc3QtPnBUYWlsID0gcFBydkVudHJ5OworCisJCQlwTGlzdC0+c2l6ZS0tOworCQkJYnJlYWs7CisJCX0KKwkJcFBydkVudHJ5ID0gcEN1ckVudHJ5OworCQlwQ3VyRW50cnkgPSBwUHJ2RW50cnktPnBOZXh0OworCX0KKworCXJldHVybiBwQ3VyRW50cnk7Cit9CisKKyNlbmRpZiAvLyBfX19MSU5LX0xJU1RfSF9fIC8vCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvbWQ0LmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL21kNC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxZTViNTIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL21kNC5oCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKyNpZm5kZWYgX19NRDRfSF9fCisjZGVmaW5lIF9fTUQ0X0hfXworCisvKiBNRDQgY29udGV4dC4gKi8KK3R5cGVkZWYJc3RydWN0CV9NRDRfQ1RYXwl7CisJVUxPTkcJc3RhdGVbNF07ICAgICAgICAvKiBzdGF0ZSAoQUJDRCkgKi8KKwlVTE9ORwljb3VudFsyXTsgICAgICAgIC8qIG51bWJlciBvZiBiaXRzLCBtb2R1bG8gMl42NCAobHNiIGZpcnN0KSAqLworCVVDSEFSCWJ1ZmZlcls2NF07ICAgICAgLyogaW5wdXQgYnVmZmVyICovCit9CU1ENF9DVFg7CisKK1ZPSUQgTUQ0SW5pdCAoTUQ0X0NUWCAqKTsKK1ZPSUQgTUQ0VXBkYXRlIChNRDRfQ1RYICosIFBVQ0hBUiwgVUlOVCk7CitWT0lEIE1ENEZpbmFsIChVQ0hBUiBbMTZdLCBNRDRfQ1RYICopOworCisjZW5kaWYgLy9fX01ENF9IX18KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL21kNS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9tZDUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODVkYjEyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9tZDUuaApAQCAtMCwwICsxLDEwNyBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwlNb2R1bGUgTmFtZToKKwltZDUuaAorCisJQWJzdHJhY3Q6CisKKwlSZXZpc2lvbiBIaXN0b3J5OgorCVdobwkJCVdoZW4JCQlXaGF0CisJLS0tLS0tLS0JLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCU5hbWUJCURhdGUJCQlNb2RpZmljYXRpb24gbG9ncworCWphbgkJCTEwLTI4LTAzCQlJbml0aWFsCisJUml0YSAgICAJMTEtMjMtMDQJCU1vZGlmeSBNRDUgYW5kIFNIQS0xCisqLworCisjaWZuZGVmCXVpbnQ4CisjZGVmaW5lCXVpbnQ4ICB1bnNpZ25lZAljaGFyCisjZW5kaWYKKworI2lmbmRlZgl1aW50MzIKKyNkZWZpbmUJdWludDMyIHVuc2lnbmVkCWxvbmcgaW50CisjZW5kaWYKKworCisjaWZuZGVmCV9fTUQ1X0hfXworI2RlZmluZQlfX01ENV9IX18KKworI2RlZmluZSBNRDVfTUFDX0xFTiAxNgorCit0eXBlZGVmIHN0cnVjdCBfTUQ1X0NUWCB7CisgICAgVUlOVDMyICAgQnVmWzRdOyAgICAgICAgICAgICAvLyBidWZmZXJzIG9mIGZvdXIgc3RhdGVzCisJVUNIQVIgICBJbnB1dFs2NF07ICAgICAgICAgIC8vIGlucHV0IG1lc3NhZ2UKKwlVSU5UMzIgICBMZW5JbkJpdENvdW50WzJdOyAgIC8vIGxlbmd0aCBjb3VudGVyIGZvciBpbnB1dCBtZXNzYWdlLCAwIHVwIHRvIDY0IGJpdHMKK30gICBNRDVfQ1RYOworCitWT0lEIE1ENUluaXQoTUQ1X0NUWCAqcEN0eCk7CitWT0lEIE1ENVVwZGF0ZShNRDVfQ1RYICpwQ3R4LCBVQ0hBUiAqcERhdGEsIFVJTlQzMiBMZW5JbkJ5dGVzKTsKK1ZPSUQgTUQ1RmluYWwoVUNIQVIgRGlnZXN0WzE2XSwgTUQ1X0NUWCAqcEN0eCk7CitWT0lEIE1ENVRyYW5zZm9ybShVSU5UMzIgQnVmWzRdLCBVSU5UMzIgTWVzWzE2XSk7CisKK3ZvaWQgbWQ1X21hYyh1OCAqa2V5LCBzaXplX3Qga2V5X2xlbiwgdTggKmRhdGEsIHNpemVfdCBkYXRhX2xlbiwgdTggKm1hYyk7Cit2b2lkIGhtYWNfbWQ1KHU4ICprZXksIHNpemVfdCBrZXlfbGVuLCB1OCAqZGF0YSwgc2l6ZV90IGRhdGFfbGVuLCB1OCAqbWFjKTsKKworLy8KKy8vIFNIQSBjb250ZXh0CisvLwordHlwZWRlZglzdHJ1Y3QgX1NIQV9DVFgKK3sKKwlVSU5UMzIgICBCdWZbNV07ICAgICAgICAgICAgIC8vIGJ1ZmZlcnMgb2YgZml2ZSBzdGF0ZXMKKwlVQ0hBUiAgIElucHV0WzgwXTsgICAgICAgICAgLy8gaW5wdXQgbWVzc2FnZQorCVVJTlQzMiAgIExlbkluQml0Q291bnRbMl07ICAgLy8gbGVuZ3RoIGNvdW50ZXIgZm9yIGlucHV0IG1lc3NhZ2UsIDAgdXAgdG8gNjQgYml0cworCit9CVNIQV9DVFg7CisKK1ZPSUQgU0hBSW5pdChTSEFfQ1RYICpwQ3R4KTsKK1VDSEFSIFNIQVVwZGF0ZShTSEFfQ1RYICpwQ3R4LCBVQ0hBUiAqcERhdGEsIFVJTlQzMiBMZW5JbkJ5dGVzKTsKK1ZPSUQgU0hBRmluYWwoU0hBX0NUWCAqcEN0eCwgVUNIQVIgRGlnZXN0WzIwXSk7CitWT0lEIFNIQVRyYW5zZm9ybShVSU5UMzIgQnVmWzVdLCBVSU5UMzIgTWVzWzIwXSk7CisKKyNkZWZpbmUgU0hBX0RJR0VTVF9MRU4gMjAKKyNlbmRpZiAvLyBfX01ENV9IX18KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYJX0FFU19ICisjZGVmaW5lCV9BRVNfSAorCit0eXBlZGVmCXN0cnVjdAoreworCXVpbnQzMiBlcmtbNjRdOwkJLyogZW5jcnlwdGlvbiByb3VuZAlrZXlzICovCisJdWludDMyIGRya1s2NF07CQkvKiBkZWNyeXB0aW9uIHJvdW5kCWtleXMgKi8KKwlpbnQJbnI7CQkJCS8qIG51bWJlciBvZiByb3VuZHMJKi8KK30KK2Flc19jb250ZXh0OworCitpbnQJIHJ0bXBfYWVzX3NldF9rZXkoIGFlc19jb250ZXh0ICpjdHgsCXVpbnQ4ICprZXksCWludAluYml0cyApOwordm9pZCBydG1wX2Flc19lbmNyeXB0KCBhZXNfY29udGV4dCAqY3R4LAl1aW50OCBpbnB1dFsxNl0sIHVpbnQ4IG91dHB1dFsxNl0gKTsKK3ZvaWQgcnRtcF9hZXNfZGVjcnlwdCggYWVzX2NvbnRleHQgKmN0eCwJdWludDggaW5wdXRbMTZdLCB1aW50OCBvdXRwdXRbMTZdICk7CisKK3ZvaWQgRihjaGFyICpwYXNzd29yZCwgdW5zaWduZWQgY2hhciAqc3NpZCwgaW50IHNzaWRsZW5ndGgsIGludCBpdGVyYXRpb25zLCBpbnQgY291bnQsIHVuc2lnbmVkIGNoYXIgKm91dHB1dCk7CitpbnQgUGFzc3dvcmRIYXNoKGNoYXIgKnBhc3N3b3JkLCB1bnNpZ25lZCBjaGFyICpzc2lkLCBpbnQgc3NpZGxlbmd0aCwgdW5zaWduZWQgY2hhciAqb3V0cHV0KTsKKworI2VuZGlmIC8qIGFlcy5oCSovCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvbWxtZS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9tbG1lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTJmYjhlMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvbWxtZS5oCkBAIC0wLDAgKzEsMTQ3MSBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwlNb2R1bGUgTmFtZToKKwltbG1lLmgKKworCUFic3RyYWN0OgorCisJUmV2aXNpb24gSGlzdG9yeToKKwlXaG8JCQlXaGVuCQkJV2hhdAorCS0tLS0tLS0tCS0tLS0tLS0tLS0JCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlKb2huIENoYW5nCTIwMDMtMDgtMjgJCUNyZWF0ZWQKKwlKb2huIENoYW5nICAyMDA0LTA5LTA2ICAgICAgbW9kaWZpZWQgZm9yIFJUMjYwMAorCisqLworI2lmbmRlZiBfX01MTUVfSF9fCisjZGVmaW5lIF9fTUxNRV9IX18KKworLy9leHRlcm4gVUNIQVIgQlJPQURDQVNUX0FERFJbXTsKKworLy8gbWF4aW11bSBzdXBwb3J0ZWQgY2FwYWJpbGl0eSBpbmZvcm1hdGlvbiAtCisvLyBFU1MsIElCU1MsIFByaXZhY3ksIFNob3J0IFByZWFtYmxlLCBTcGVjdHJ1bSBtZ210LCBTaG9ydCBTbG90CisjZGVmaW5lIFNVUFBPUlRFRF9DQVBBQklMSVRZX0lORk8gICAweDA1MzMKKworI2RlZmluZSBFTkRfT0ZfQVJHUyAgICAgICAgICAgICAgICAgLTEKKyNkZWZpbmUgTEZTUl9NQVNLICAgICAgICAgICAgICAgICAgIDB4ODAwMDAwNTcKKyNkZWZpbmUgTUxNRV9UQVNLX0VYRUNfSU5UViAgICAgICAgIDEwMC8qMjAwKi8gICAgICAgLy8KKyNkZWZpbmUgTEVBRF9USU1FICAgICAgICAgICAgICAgICAgIDUKKyNkZWZpbmUgTUxNRV9UQVNLX0VYRUNfTVVMVElQTEUgICAgICAgMTAgIC8qNSovICAgICAgIC8vIE1MTUVfVEFTS19FWEVDX01VTFRJUExFICogTUxNRV9UQVNLX0VYRUNfSU5UViA9IDEgc2VjCisjZGVmaW5lIFJFT1JERVJfRVhFQ19JTlRWICAgICAgICAgCTEwMCAgICAgICAvLyAwLjEgc2VjCisvLyNkZWZpbmUgVEJUVF9QUkVMT0FEX1RJTUUgICAgICAgICAzODQgICAgICAgIC8vIHVzZWMuIExvbWdQcmVhbWJsZSArIDI0LWJ5dGUgYXQgMU1icHMKKworLy8gVGhlIGRlZmluaXRpb24gb2YgUmFkYXIgZGV0ZWN0aW9uIGR1cmF0aW9uIHJlZ2lvbgorI2RlZmluZSBDRQkJMAorI2RlZmluZSBGQ0MJCTEKKyNkZWZpbmUgSkFQCQkyCisjZGVmaW5lIEpBUF9XNTMJMworI2RlZmluZSBKQVBfVzU2CTQKKyNkZWZpbmUgTUFYX1JEX1JFR0lPTiA1CisKKyNpZmRlZglORElTNTFfTUlOSVBPUlQKKyNkZWZpbmUgQkVBQ09OX0xPU1RfVElNRSAgICAgICAgICAgIDQwMDAgICAgICAgLy8gMjA0OCBtc2VjID0gMiBzZWMKKyNlbHNlCisjZGVmaW5lIEJFQUNPTl9MT1NUX1RJTUUgICAgICAgICAgICA0ICogT1NfSFogICAgLy8gMjA0OCBtc2VjID0gMiBzZWMKKyNlbmRpZgorCisjZGVmaW5lIERMU19USU1FT1VUICAgICAgICAgICAgICAgICAxMjAwICAgICAgLy8gdW5pdDogbXNlYworI2RlZmluZSBBVVRIX1RJTUVPVVQgICAgICAgICAgICAgICAgMzAwICAgICAgIC8vIHVuaXQ6IG1zZWMKKyNkZWZpbmUgQVNTT0NfVElNRU9VVCAgICAgICAgICAgICAgIDMwMCAgICAgICAvLyB1bml0OiBtc2VjCisjZGVmaW5lIEpPSU5fVElNRU9VVCAgICAgICAgICAgICAgICAyICogT1NfSFogICAgICAvLyB1bml0OiBtc2VjCisjZGVmaW5lIFNIT1JUX0NIQU5ORUxfVElNRSAgICAgICAgICA5MCAgICAgICAgLy8gdW5pdDogbXNlYworI2RlZmluZSBNSU5fQ0hBTk5FTF9USU1FICAgICAgICAgICAgMTEwICAgICAgICAvLyB1bml0OiBtc2VjLCBmb3IgZHVhbCBiYW5kIHNjYW4KKyNkZWZpbmUgTUFYX0NIQU5ORUxfVElNRSAgICAgICAgICAgIDE0MCAgICAgICAvLyB1bml0OiBtc2VjLCBmb3Igc2luZ2xlIGJhbmQgc2NhbgorI2RlZmluZQlGQVNUX0FDVElWRV9TQ0FOX1RJTUUJICAgIDMwIAkJICAvLyBBY3RpdmUgc2NhbiB3YWl0aW5nIGZvciBwcm9iZSByZXNwb25zZSB0aW1lCisjZGVmaW5lIENXX01JTl9JTl9CSVRTICAgICAgICAgICAgICA0ICAgICAgICAgLy8gYWN0dWFsIEN3TWluID0gMl5DV19NSU5fSU5fQklUUyAtIDEKKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisjaWZuZGVmIENPTkZJR19BUF9TVVBQT1JUCisjZGVmaW5lIENXX01BWF9JTl9CSVRTICAgICAgICAgICAgICAxMCAgICAgICAgLy8gYWN0dWFsIEN3TWF4ID0gMl5DV19NQVhfSU5fQklUUyAtIDEKKyNlbmRpZgorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisjaWZkZWYgQ09ORklHX0FQU1RBX01JWEVEX1NVUFBPUlQKK2V4dGVybiBVSU5UMzIgQ1dfTUFYX0lOX0JJVFM7CisjZW5kaWYgLy8gQ09ORklHX0FQU1RBX01JWEVEX1NVUFBPUlQgLy8KKworLy8gTm90ZTogUlNTSV9UT19EQk1fT0ZGU0VUIGhhcyBiZWVuIGNoYW5nZWQgdG8gdmFyaWFibGUgZm9yIG5ldyBSRiAoMjAwNC0wNzIwKS4KKy8vIFNIb3VsZCBub3QgcmVmZXIgdG8gdGhpcyBjb25zdGFudCBhbnltb3JlCisvLyNkZWZpbmUgUlNTSV9UT19EQk1fT0ZGU0VUICAgICAgICAgIDEyMCAvLyBmb3IgUlQyNTMwIFJTU0ktMTE1ID0gZEJtCisjZGVmaW5lIFJTU0lfRk9SX01JRF9UWF9QT1dFUiAgICAgICAtNTUgIC8vIC01NSBkYiBpcyBjb25zaWRlcmVkIG1pZC1kaXN0YW5jZQorI2RlZmluZSBSU1NJX0ZPUl9MT1dfVFhfUE9XRVIgICAgICAgLTQ1ICAvLyAtNDUgZGIgaXMgY29uc2lkZXJlZCB2ZXJ5IHNob3J0IGRpc3RhbmNlIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVsaWdpYmxlIHRvIHVzZSBhIGxvd2VyIFRYIHBvd2VyCisjZGVmaW5lIFJTU0lfRk9SX0xPV0VTVF9UWF9QT1dFUiAgICAtMzAKKy8vI2RlZmluZSBNSURfVFhfUE9XRVJfREVMVEEgICAgICAgICAgMCAgIC8vIDAgZGIgZnJvbSBmdWxsIFRYIHBvd2VyIHVwb24gbWlkLWRpc3RhbmNlIHRvIEFQCisjZGVmaW5lIExPV19UWF9QT1dFUl9ERUxUQSAgICAgICAgICA2ICAgIC8vIC0zIGRiIGZyb20gZnVsbCBUWCBwb3dlciB1cG9uIHZlcnkgc2hvcnQgZGlzdGFuY2UuIDEgZ3JhZGUgaXMgMC41IGRiCisjZGVmaW5lIExPV0VTVF9UWF9QT1dFUl9ERUxUQSAgICAgICAxNiAgIC8vIC04IGRiIGZyb20gZnVsbCBUWCBwb3dlciB1cG9uIHNob3J0ZXN0IGRpc3RhbmNlLiAxIGdyYWRlIGlzIDAuNSBkYgorCisjZGVmaW5lIFJTU0lfVFJJR0dFUkVEX1VQT05fQkVMT1dfVEhSRVNIT0xEICAgICAwCisjZGVmaW5lIFJTU0lfVFJJR0dFUkVEX1VQT05fRVhDQ0VFRF9USFJFU0hPTEQgICAxCisjZGVmaW5lIFJTU0lfVEhSRVNIT0xEX0ZPUl9ST0FNSU5HICAgICAgICAgICAgICAyNQorI2RlZmluZSBSU1NJX0RFTFRBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNQorCisvLyBDaGFubmVsIFF1YWxpdHkgSW5kaWNhdGlvbgorI2RlZmluZSBDUUlfSVNfR09PRChjcWkpICAgICAgICAgICAgKChjcWkpID49IDUwKQorLy8jZGVmaW5lIENRSV9JU19GQUlSKGNxaSkgICAgICAgICAgKCgoY3FpKSA+PSAyMCkgJiYgKChjcWkpIDwgNTApKQorI2RlZmluZSBDUUlfSVNfUE9PUihjcWkpICAgICAgICAgICAgKGNxaSA8IDUwKSAgLy8oKChjcWkpID49IDUpICYmICgoY3FpKSA8IDIwKSkKKyNkZWZpbmUgQ1FJX0lTX0JBRChjcWkpICAgICAgICAgICAgIChjcWkgPCA1KQorI2RlZmluZSBDUUlfSVNfREVBRChjcWkpICAgICAgICAgICAgKGNxaSA9PSAwKQorCisvLyB3ZWlnaHRpbmcgZmFjdG9yIHRvIGNhbGN1bGF0ZSBDaGFubmVsIHF1YWxpdHksIHRvdGFsIHNob3VsZCBiZSAxMDAlCisjZGVmaW5lIFJTU0lfV0VJR0hUSU5HICAgICAgICAgICAgICAgICAgIDUwCisjZGVmaW5lIFRYX1dFSUdIVElORyAgICAgICAgICAgICAgICAgICAgIDMwCisjZGVmaW5lIFJYX1dFSUdIVElORyAgICAgICAgICAgICAgICAgICAgIDIwCisKKy8vI2RlZmluZSBQRUVSX0tFWV9OT1RfVVNFRCAgICAgICAgICAgICAgICAwCisvLyNkZWZpbmUgUEVFUl9LRVlfNjRfQklUICAgICAgICAgICAgICAgICAgNjQKKy8vI2RlZmluZSBQRUVSX0tFWV8xMjhfQklUICAgICAgICAgICAgICAgICAxMjgKKworLy8jZGVmaW5lIFBFRVJfS0VZXzY0QklUX0xFTiAgICAgICAgICAgICAgIDgKKy8vI2RlZmluZSBQRUVSX0tFWV8xMjhCSVRfTEVOICAgICAgICAgICAgICAxNgorCisjZGVmaW5lIEJTU19OT1RfRk9VTkQgICAgICAgICAgICAgICAgICAgIDB4RkZGRkZGRkYKKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisjZGVmaW5lIE1BWF9MRU5fT0ZfTUxNRV9RVUVVRSAgICAgICAgICAgIDQwIC8vMTAKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworI2RlZmluZSBTQ0FOX1BBU1NJVkUgICAgICAgICAgICAgICAgICAgICAxOAkJLy8gc2NhbiB3aXRoIG5vIHByb2JlIHJlcXVlc3QsIG9ubHkgd2FpdCBiZWFjb24gYW5kIHByb2JlIHJlc3BvbnNlCisjZGVmaW5lIFNDQU5fQUNUSVZFICAgICAgICAgICAgICAgICAgICAgIDE5CQkvLyBzY2FuIHdpdGggcHJvYmUgcmVxdWVzdCwgYW5kIHdhaXQgYmVhY29uIGFuZCBwcm9iZSByZXNwb25zZQorI2RlZmluZQlTQ0FOX0NJU0NPX1BBU1NJVkUJCQkJIDIwCQkvLyBTaW5nbGUgY2hhbm5lbCBwYXNzaXZlIHNjYW4KKyNkZWZpbmUJU0NBTl9DSVNDT19BQ1RJVkUJCQkJIDIxCQkvLyBTaW5nbGUgY2hhbm5lbCBhY3RpdmUgc2NhbgorI2RlZmluZQlTQ0FOX0NJU0NPX05PSVNFCQkJCSAyMgkJLy8gU2luZ2xlIGNoYW5uZWwgcGFzc2l2ZSBzY2FuIGZvciBub2lzZSBoaXN0b2dyYW0gY29sbGVjdGlvbgorI2RlZmluZQlTQ0FOX0NJU0NPX0NIQU5ORUxfTE9BRAkJCSAyMwkJLy8gU2luZ2xlIGNoYW5uZWwgcGFzc2l2ZSBzY2FuIGZvciBjaGFubmVsIGxvYWQgY29sbGVjdGlvbgorI2RlZmluZSBGQVNUX1NDQU5fQUNUSVZFICAgICAgICAgICAgICAgICAyNAkJLy8gc2NhbiB3aXRoIHByb2JlIHJlcXVlc3QsIGFuZCB3YWl0IGJlYWNvbiBhbmQgcHJvYmUgcmVzcG9uc2UKKworI2lmZGVmIERPVDExTl9EUkFGVDMKKyNkZWZpbmUgU0NBTl8yMDQwX0JTU19DT0VYSVNUICAgICAgICAgICAgICAgICAgMjYKKyNlbmRpZiAvLyBET1QxMU5fRFJBRlQzIC8vCisKKy8vI2RlZmluZSBCU1NfVEFCTEVfRU1QVFkoeCkgICAgICAgICAgICAgKCh4KS5Cc3NOciA9PSAwKQorI2RlZmluZSBNQUNfQUREUl9JU19HUk9VUChBZGRyKSAgICAgICAoKChBZGRyWzBdKSAmIDB4MDEpKQorI2RlZmluZSBNQUNfQUREUl9IQVNIKEFkZHIpICAgICAgICAgICAgKEFkZHJbMF0gXiBBZGRyWzFdIF4gQWRkclsyXSBeIEFkZHJbM10gXiBBZGRyWzRdIF4gQWRkcls1XSkKKyNkZWZpbmUgTUFDX0FERFJfSEFTSF9JTkRFWChBZGRyKSAgICAgIChNQUNfQUREUl9IQVNIKEFkZHIpICUgSEFTSF9UQUJMRV9TSVpFKQorI2RlZmluZSBUSURfTUFDX0hBU0goQWRkcixUSUQpICAgICAgICAgICAgKFRJRF5BZGRyWzBdIF4gQWRkclsxXSBeIEFkZHJbMl0gXiBBZGRyWzNdIF4gQWRkcls0XSBeIEFkZHJbNV0pCisjZGVmaW5lIFRJRF9NQUNfSEFTSF9JTkRFWChBZGRyLFRJRCkgICAgICAoVElEX01BQ19IQVNIKEFkZHIsVElEKSAlIEhBU0hfVEFCTEVfU0laRSkKKworLy8gTEVEIENvbnRyb2wKKy8vIGFzc29pYXRpb24gT04uIG9uZSBMRUQgT04uIGFub3RoZXIgYmxpbmtpbmcgd2hlbiBUWCwgT0ZGIHdoZW4gaWRsZQorLy8gbm8gYXNzb2NpYXRpb24sIGJvdGggTEVEIG9mZgorI2RlZmluZSBBU0lDX0xFRF9BQ1RfT04ocEFkKSAgICAgICAgUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX0NTUjE0LCAweDAwMDMxZTQ2KQorI2RlZmluZSBBU0lDX0xFRF9BQ1RfT0ZGKHBBZCkgICAgICAgUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX0NTUjE0LCAweDAwMDAxZTQ2KQorCisvLyBiaXQgZGVmaW5pdGlvbiBvZiB0aGUgMi1ieXRlIHBCRUFDT04tPkNhcGFiaWxpdHkgZmllbGQKKyNkZWZpbmUgQ0FQX0lTX0VTU19PTih4KSAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDAwMDEpICE9IDApCisjZGVmaW5lIENBUF9JU19JQlNTX09OKHgpICAgICAgICAgICAgICAgICgoKHgpICYgMHgwMDAyKSAhPSAwKQorI2RlZmluZSBDQVBfSVNfQ0ZfUE9MTEFCTEVfT04oeCkgICAgICAgICAoKCh4KSAmIDB4MDAwNCkgIT0gMCkKKyNkZWZpbmUgQ0FQX0lTX0NGX1BPTExfUkVRX09OKHgpICAgICAgICAgKCgoeCkgJiAweDAwMDgpICE9IDApCisjZGVmaW5lIENBUF9JU19QUklWQUNZX09OKHgpICAgICAgICAgICAgICgoKHgpICYgMHgwMDEwKSAhPSAwKQorI2RlZmluZSBDQVBfSVNfU0hPUlRfUFJFQU1CTEVfT04oeCkgICAgICAoKCh4KSAmIDB4MDAyMCkgIT0gMCkKKyNkZWZpbmUgQ0FQX0lTX1BCQ0NfT04oeCkgICAgICAgICAgICAgICAgKCgoeCkgJiAweDAwNDApICE9IDApCisjZGVmaW5lIENBUF9JU19BR0lMSVRZX09OKHgpICAgICAgICAgICAgICgoKHgpICYgMHgwMDgwKSAhPSAwKQorI2RlZmluZSBDQVBfSVNfU1BFQ1RSVU1fTUdNVCh4KSAgICAgICAgICAoKCh4KSAmIDB4MDEwMCkgIT0gMCkgIC8vIDgwMi4xMWUgZDkKKyNkZWZpbmUgQ0FQX0lTX1FPUyh4KSAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDAyMDApICE9IDApICAvLyA4MDIuMTFlIGQ5CisjZGVmaW5lIENBUF9JU19TSE9SVF9TTE9UKHgpICAgICAgICAgICAgICgoKHgpICYgMHgwNDAwKSAhPSAwKQorI2RlZmluZSBDQVBfSVNfQVBTRCh4KSAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MDgwMCkgIT0gMCkgIC8vIDgwMi4xMWUgZDkKKyNkZWZpbmUgQ0FQX0lTX0lNTUVEX0JBKHgpICAgICAgICAgICAgICAgKCgoeCkgJiAweDEwMDApICE9IDApICAvLyA4MDIuMTFlIGQ5CisjZGVmaW5lIENBUF9JU19EU1NTX09GRE0oeCkgICAgICAgICAgICAgICgoKHgpICYgMHgyMDAwKSAhPSAwKQorI2RlZmluZSBDQVBfSVNfREVMQVlfQkEoeCkgICAgICAgICAgICAgICAoKCh4KSAmIDB4NDAwMCkgIT0gMCkgIC8vIDgwMi4xMWUgZDkKKworI2RlZmluZSBDQVBfR0VORVJBVEUoZXNzLGlic3MscHJpdixzX3ByZSxzX3Nsb3Qsc3BlY3RydW0pICAoKChlc3MpID8gMHgwMDAxIDogMHgwMDAwKSB8ICgoaWJzcykgPyAweDAwMDIgOiAweDAwMDApIHwgKChwcml2KSA/IDB4MDAxMCA6IDB4MDAwMCkgfCAoKHNfcHJlKSA/IDB4MDAyMCA6IDB4MDAwMCkgfCAoKHNfc2xvdCkgPyAweDA0MDAgOiAweDAwMDApIHwgKChzcGVjdHJ1bSkgPyAweDAxMDAgOiAweDAwMDApKQorCisvLyNkZWZpbmUgU1RBX1FPU19DQVBBQklMSVRZICAgICAgICAgICAgICAgMCAvLyAxLWJ5dGUuIHNlZSA4MDIuMTFlIGQ5LjAgZm9yIGJpdCBkZWZpbml0aW9uCisKKyNkZWZpbmUgRVJQX0lTX05PTl9FUlBfUFJFU0VOVCh4KSAgICAgICAgKCgoeCkgJiAweDAxKSAhPSAwKSAgICAvLyA4MDIuMTFnCisjZGVmaW5lIEVSUF9JU19VU0VfUFJPVEVDVElPTih4KSAgICAgICAgICgoKHgpICYgMHgwMikgIT0gMCkgICAgLy8gODAyLjExZworI2RlZmluZSBFUlBfSVNfVVNFX0JBUktFUl9QUkVBTUJMRSh4KSAgICAoKCh4KSAmIDB4MDQpICE9IDApICAgIC8vIDgwMi4xMWcKKworI2RlZmluZSBEUlNfVFhfUVVBTElUWV9XT1JTVF9CT1VORCAgICAgICA4Ly8gMyAgLy8ganVzdCB0ZXN0IGJ5IGdhcnkKKyNkZWZpbmUgRFJTX1BFTkFMVFkgICAgICAgICAgICAgICAgICAgICAgOAorCisjZGVmaW5lIEJBX05PVFVTRSAJMgorLy9CQSBQb2xpY3kgc3ViZmlsZWQgdmFsdWUgaW4gQUREQkEgZnJhbWUKKyNkZWZpbmUgSU1NRURfQkEgCTEKKyNkZWZpbmUgREVMQVlfQkEJMAorCisvLyBCQSBJbml0aWF0b3Igc3ViZmllbGQgaW4gREVMQkEgZnJhbWUKKyNkZWZpbmUgT1JJR0lOQVRPUgkxCisjZGVmaW5lIFJFQ0lQSUVOVAkwCisKKy8vIEFEREJBIFN0YXR1cyBDb2RlCisjZGVmaW5lIEFEREJBX1JFU1VMVENPREVfU1VDQ0VTUwkJCQkJMAorI2RlZmluZSBBRERCQV9SRVNVTFRDT0RFX1JFRlVTRUQJCQkJCTM3CisjZGVmaW5lIEFEREJBX1JFU1VMVENPREVfSU5WQUxJRF9QQVJBTUVURVJTCQkJMzgKKworLy8gREVMQkEgUmVhc29uIENvZGUKKyNkZWZpbmUgREVMQkFfUkVBU09OQ09ERV9RU1RBX0xFQVZJTkcJCQkJMzYKKyNkZWZpbmUgREVMQkFfUkVBU09OQ09ERV9FTkRfQkEJCQkJCQkzNworI2RlZmluZSBERUxCQV9SRUFTT05DT0RFX1VOS05PV05fQkEJCQkJCTM4CisjZGVmaW5lIERFTEJBX1JFQVNPTkNPREVfVElNRU9VVAkJCQkJMzkKKworLy8gcmVzZXQgYWxsIE9uZVNlY1R4IGNvdW50ZXJzCisjZGVmaW5lIFJFU0VUX09ORV9TRUNfVFhfQ05UKF9fcEVudHJ5KSBcCitpZiAoKChfX3BFbnRyeSkpICE9IE5VTEwpIFwKK3sgXAorCShfX3BFbnRyeSktPk9uZVNlY1R4UmV0cnlPa0NvdW50ID0gMDsgXAorCShfX3BFbnRyeSktPk9uZVNlY1R4RmFpbENvdW50ID0gMDsgXAorCShfX3BFbnRyeSktPk9uZVNlY1R4Tm9SZXRyeU9rQ291bnQgPSAwOyBcCit9CisKKy8vCisvLyA4MDIuMTEgZnJhbWUgZm9ybWF0cworLy8KKy8vICBIVCBDYXBhYmlsaXR5IElORk8gZmllbGQgaW4gSFQgQ2FwIElFIC4KK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCB7CisjaWZkZWYgUlRfQklHX0VORElBTgorCVVTSE9SVAlMU0lHVHhvcFByb1N1cDoxOworCVVTSE9SVAlGb3J0eV9NaHpfSW50b2xlcmFudDoxOworCVVTSE9SVAlQU01QOjE7CisJVVNIT1JUCUNDS21vZGVpbjQwOjE7CisJVVNIT1JUCUFNc2R1U2l6ZToxOworCVVTSE9SVAlEZWxheWVkQkE6MTsJLy9ydDI4NjBjIG5vdCBzdXBwb3J0CisJVVNIT1JUCVJ4U1RCQzoyOworCVVTSE9SVAlUeFNUQkM6MTsKKwlVU0hPUlQJU2hvcnRHSWZvcjQwOjE7CS8vZm9yNDBNSHoKKwlVU0hPUlQJU2hvcnRHSWZvcjIwOjE7CisJVVNIT1JUCUdGOjE7CS8vZ3JlZW4gZmllbGQKKwlVU0hPUlQJTWltb1BzOjI7Ly9tb21pIHBvd2VyIHNhZmUKKwlVU0hPUlQJQ2hhbm5lbFdpZHRoOjE7CisJVVNIT1JUCUFkdkNvZGluZzoxOworI2Vsc2UKKwlVU0hPUlQJQWR2Q29kaW5nOjE7CisJVVNIT1JUCUNoYW5uZWxXaWR0aDoxOworCVVTSE9SVAlNaW1vUHM6MjsvL21vbWkgcG93ZXIgc2FmZQorCVVTSE9SVAlHRjoxOwkvL2dyZWVuIGZpZWxkCisJVVNIT1JUCVNob3J0R0lmb3IyMDoxOworCVVTSE9SVAlTaG9ydEdJZm9yNDA6MTsJLy9mb3I0ME1IegorCVVTSE9SVAlUeFNUQkM6MTsKKwlVU0hPUlQJUnhTVEJDOjI7CisJVVNIT1JUCURlbGF5ZWRCQToxOwkvL3J0Mjg2MGMgbm90IHN1cHBvcnQKKwlVU0hPUlQJQU1zZHVTaXplOjE7CS8vIG9ubHkgc3VwcG9ydCBhcyB6ZXJvCisJVVNIT1JUCUNDS21vZGVpbjQwOjE7CisJVVNIT1JUCVBTTVA6MTsKKwlVU0hPUlQJRm9ydHlfTWh6X0ludG9sZXJhbnQ6MTsKKwlVU0hPUlQJTFNJR1R4b3BQcm9TdXA6MTsKKyNlbmRpZgkvKiAhUlRfQklHX0VORElBTiAqLworfSBIVF9DQVBfSU5GTywgKlBIVF9DQVBfSU5GTzsKKworLy8gIEhUIENhcGFiaWxpdHkgSU5GTyBmaWVsZCBpbiBIVCBDYXAgSUUgLgordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIHsKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJVUNIQVIJcnN2OjM7Ly9tb21pIHBvd2VyIHNhZmUKKwlVQ0hBUglNcGR1RGVuc2l0eTozOworCVVDSEFSCU1heFJBbXBkdUZhY3RvcjoyOworI2Vsc2UKKwlVQ0hBUglNYXhSQW1wZHVGYWN0b3I6MjsKKwlVQ0hBUglNcGR1RGVuc2l0eTozOworCVVDSEFSCXJzdjozOy8vbW9taSBwb3dlciBzYWZlCisjZW5kaWYgLyogIVJUX0JJR19FTkRJQU4gKi8KK30gSFRfQ0FQX1BBUk0sICpQSFRfQ0FQX1BBUk07CisKKy8vICBIVCBDYXBhYmlsaXR5IElORk8gZmllbGQgaW4gSFQgQ2FwIElFIC4KK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCB7CisJVUNIQVIJTUNTU2V0WzEwXTsKKwlVQ0hBUglTdXBSYXRlWzJdOyAgLy8gdW5pdCA6IDFNYnBzCisjaWZkZWYgUlRfQklHX0VORElBTgorCVVDSEFSCXJzdjozOworCVVDSEFSCU1wZHVEZW5zaXR5OjE7CisJVUNIQVIJVHhTdHJlYW06MjsKKwlVQ0hBUglUeFJ4Tm90RXF1YWw6MTsKKwlVQ0hBUglUeE1DU1NldERlZmluZWQ6MTsKKyNlbHNlCisJVUNIQVIJVHhNQ1NTZXREZWZpbmVkOjE7CisJVUNIQVIJVHhSeE5vdEVxdWFsOjE7CisJVUNIQVIJVHhTdHJlYW06MjsKKwlVQ0hBUglNcGR1RGVuc2l0eToxOworCVVDSEFSCXJzdjozOworI2VuZGlmIC8vIFJUX0JJR19FTkRJQU4gLy8KKwlVQ0hBUglyc3YzWzNdOworfSBIVF9NQ1NfU0VULCAqUEhUX01DU19TRVQ7CisKKy8vICBIVCBDYXBhYmlsaXR5IElORk8gZmllbGQgaW4gSFQgQ2FwIElFIC4KK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCB7CisjaWZkZWYgUlRfQklHX0VORElBTgorCVVTSE9SVAlyc3YyOjQ7CisJVVNIT1JUCVJER1N1cHBvcnQ6MTsJLy9yZXZlcnNlIERpcmVjdGlvbiBHcmFudCAgc3VwcG9ydAorCVVTSE9SVAlQbHVzSFRDOjE7CS8vK0hUQyBjb250cm9sIGZpZWxkIHN1cHBvcnQKKwlVU0hPUlQJTUNTRmVlZGJhY2s6MjsJLy8wOm5vIE1DUyBmZWVkYmFjaywgMjp1bnNvbGljaXRlZCBNQ1MgZmVlZGJhY2ssIDM6RnVsbCBNQ1MgZmVlZGJhY2ssICAxOnJzdi4KKwlVU0hPUlQJcnN2OjU7Ly9tb21pIHBvd2VyIHNhZmUKKwlVU0hPUlQJVHJhblRpbWU6MjsKKwlVU0hPUlQJUGNvOjE7CisjZWxzZQorCVVTSE9SVAlQY286MTsKKwlVU0hPUlQJVHJhblRpbWU6MjsKKwlVU0hPUlQJcnN2OjU7Ly9tb21pIHBvd2VyIHNhZmUKKwlVU0hPUlQJTUNTRmVlZGJhY2s6MjsJLy8wOm5vIE1DUyBmZWVkYmFjaywgMjp1bnNvbGljaXRlZCBNQ1MgZmVlZGJhY2ssIDM6RnVsbCBNQ1MgZmVlZGJhY2ssICAxOnJzdi4KKwlVU0hPUlQJUGx1c0hUQzoxOwkvLytIVEMgY29udHJvbCBmaWVsZCBzdXBwb3J0CisJVVNIT1JUCVJER1N1cHBvcnQ6MTsJLy9yZXZlcnNlIERpcmVjdGlvbiBHcmFudCAgc3VwcG9ydAorCVVTSE9SVAlyc3YyOjQ7CisjZW5kaWYgLyogUlRfQklHX0VORElBTiAqLworfSBFWFRfSFRfQ0FQX0lORk8sICpQRVhUX0hUX0NBUF9JTkZPOworCisvLyAgSFQgQmVhbWZvcm1pbmcgZmllbGQgaW4gSFQgQ2FwIElFIC4KK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfSFRfQkZfQ0FQeworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwlVTE9ORwlyc3Y6MzsKKwlVTE9ORwlDaGFuRXN0aW1hdGlvbjoyOworCVVMT05HCUNTSVJvd0JGU3VwOjI7CisJVUxPTkcJQ29tU3RlZXJCRkFudFN1cDoyOworCVVMT05HCU5vQ29tU3RlZXJCRkFudFN1cDoyOworCVVMT05HCUNTSUJGQW50U3VwOjI7CisJVUxPTkcJTWluR3JvdXBpbmc6MjsKKwlVTE9ORwlFeHBDb21CRjoyOworCVVMT05HCUV4cE5vQ29tQkY6MjsKKwlVTE9ORwlFeHBDU0lGYms6MjsKKwlVTE9ORwlFeHBDb21TdGVlckNhcGFibGU6MTsKKwlVTE9ORwlFeHBOb0NvbVN0ZWVyQ2FwYWJsZToxOworCVVMT05HCUV4cENTSUNhcGFibGU6MTsKKwlVTE9ORwlDYWxpYnJhdGlvbjoyOworCVVMT05HCUltcFR4QkZDYXBhYmxlOjE7CisJVUxPTkcJVHhORFBDYXBhYmxlOjE7CisJVUxPTkcJUnhORFBDYXBhYmxlOjE7CisJVUxPTkcJVHhTb3VuZENhcGFibGU6MTsKKwlVTE9ORwlSeFNvdW5kQ2FwYWJsZToxOworCVVMT05HCVR4QkZSZWNDYXBhYmxlOjE7CisjZWxzZQorCVVMT05HCVR4QkZSZWNDYXBhYmxlOjE7CisJVUxPTkcJUnhTb3VuZENhcGFibGU6MTsKKwlVTE9ORwlUeFNvdW5kQ2FwYWJsZToxOworCVVMT05HCVJ4TkRQQ2FwYWJsZToxOworCVVMT05HCVR4TkRQQ2FwYWJsZToxOworCVVMT05HCUltcFR4QkZDYXBhYmxlOjE7CisJVUxPTkcJQ2FsaWJyYXRpb246MjsKKwlVTE9ORwlFeHBDU0lDYXBhYmxlOjE7CisJVUxPTkcJRXhwTm9Db21TdGVlckNhcGFibGU6MTsKKwlVTE9ORwlFeHBDb21TdGVlckNhcGFibGU6MTsKKwlVTE9ORwlFeHBDU0lGYms6MjsKKwlVTE9ORwlFeHBOb0NvbUJGOjI7CisJVUxPTkcJRXhwQ29tQkY6MjsKKwlVTE9ORwlNaW5Hcm91cGluZzoyOworCVVMT05HCUNTSUJGQW50U3VwOjI7CisJVUxPTkcJTm9Db21TdGVlckJGQW50U3VwOjI7CisJVUxPTkcJQ29tU3RlZXJCRkFudFN1cDoyOworCVVMT05HCUNTSVJvd0JGU3VwOjI7CisJVUxPTkcJQ2hhbkVzdGltYXRpb246MjsKKwlVTE9ORwlyc3Y6MzsKKyNlbmRpZiAvLyBSVF9CSUdfRU5ESUFOIC8vCit9IEhUX0JGX0NBUCwgKlBIVF9CRl9DQVA7CisKKy8vICBIVCBhbnRlbm5hIHNlbGVjdGlvbiBmaWVsZCBpbiBIVCBDYXAgSUUgLgordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9IVF9BU19DQVB7CisjaWZkZWYgUlRfQklHX0VORElBTgorCVVDSEFSCXJzdjoxOworCVVDSEFSCVR4U291bmRQUERVOjE7CisJVUNIQVIJUnhBU2VsOjE7CisJVUNIQVIJQW50SW5kRmJrOjE7CisJVUNIQVIJRXhwQ1NJRmJrOjE7CisJVUNIQVIJQW50SW5kRmJrVHhBU0VMOjE7CisJVUNIQVIJRXhwQ1NJRmJrVHhBU0VMOjE7CisJVUNIQVIJQW50U2VsZWN0OjE7CisjZWxzZQorCVVDSEFSCUFudFNlbGVjdDoxOworCVVDSEFSCUV4cENTSUZia1R4QVNFTDoxOworCVVDSEFSCUFudEluZEZia1R4QVNFTDoxOworCVVDSEFSCUV4cENTSUZiazoxOworCVVDSEFSCUFudEluZEZiazoxOworCVVDSEFSCVJ4QVNlbDoxOworCVVDSEFSCVR4U291bmRQUERVOjE7CisJVUNIQVIJcnN2OjE7CisjZW5kaWYgLy8gUlRfQklHX0VORElBTiAvLworfSBIVF9BU19DQVAsICpQSFRfQVNfQ0FQOworCisvLyBEcmFmdCAxLjAgc2V0IElFIGxlbmd0aCAyNiwgYnV0IGlzIGV4dGVuc2libGUuLgorI2RlZmluZSBTSVpFX0hUX0NBUF9JRQkJMjYKKy8vIFRoZSBzdHJ1Y3R1cmUgZm9yIEhUIENhcGFiaWxpdHkgSUUuCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX0hUX0NBUEFCSUxJVFlfSUV7CisJSFRfQ0FQX0lORk8JCUh0Q2FwSW5mbzsKKwlIVF9DQVBfUEFSTQkJSHRDYXBQYXJtOworLy8JSFRfTUNTX1NFVAkJSHRNQ1NTZXQ7CisJVUNIQVIJCQlNQ1NTZXRbMTZdOworCUVYVF9IVF9DQVBfSU5GTwlFeHRIdENhcEluZm87CisJSFRfQkZfQ0FQCQlUeEJGQ2FwOwkvLyBiZWFtZm9ybWluZyBjYXAuIHJ0Mjg2MGMgbm90IHN1cHBvcnQgYmVhbWZvcm1pbmcuCisJSFRfQVNfQ0FQCQlBU0NhcDsJLy9hbnRlbm5hIHNlbGVjdGlvbi4KK30gSFRfQ0FQQUJJTElUWV9JRSwgKlBIVF9DQVBBQklMSVRZX0lFOworCisKKy8vIDgwMi4xMW4gZHJhZnQzIHJlbGF0ZWQgc3RydWN0dXJlIGRlZmluaXRpb25zLgorLy8gNy4zLjIuNjAKKyNkZWZpbmUgZG90MTFPQlNTU2NhblBhc3NpdmVEd2VsbAkJCQkJCQkyMAkvLyBpbiBUVS4gbWluIGFtb3VudCBvZiB0aW1lIHRoYXQgdGhlIFNUQSBjb250aW5vdXNseSBzY2FucyBlYWNoIGNoYW5uZWwgd2hlbiBwZXJmb3JtaW5nIGFuIGFjdGl2ZSBPQlNTIHNjYW4uCisjZGVmaW5lIGRvdDExT0JTU1NjYW5BY3RpdmVEd2VsbAkJCQkJCQkxMAkvLyBpbiBUVS5taW4gYW1vdW50IG9mIHRpbWUgdGhhdCB0aGUgU1RBIGNvbnRpbm91c2x5IHNjYW5zIGVhY2ggY2hhbm5lbCB3aGVuIHBlcmZvcm1pbmcgYW4gcGFzc2l2ZSBPQlNTIHNjYW4uCisjZGVmaW5lIGRvdDExQlNTV2lkdGhUcmlnZ2VyU2NhbkludGVydmFsCQkJCQkzMDAgIC8vIGluIHNlYy4gbWF4IGludGVydmFsIGJldHdlZW4gc2NhbiBvcGVyYXRpb25zIHRvIGJlIHBlcmZvcm1lZCB0byBkZXRlY3QgQlNTIGNoYW5uZWwgd2lkdGggdHJpZ2dlciBldmVudHMuCisjZGVmaW5lIGRvdDExT0JTU1NjYW5QYXNzaXZlVG90YWxQZXJDaGFubmVsCQkJCQkyMDAJLy8gaW4gVFUuIG1pbiB0b3RhbCBhbW91bnQgb2YgdGltZSB0aGF0IHRoZSBTVEEgc2NhbnMgZWFjaCBjaGFubmVsIHdoZW4gcGVyZm9ybWluZyBhIHBhc3NpdmUgT0JTUyBzY2FuLgorI2RlZmluZSBkb3QxMU9CU1NTY2FuQWN0aXZlVG90YWxQZXJDaGFubmVsCQkJCQkyMAkvL2luIFRVLiBtaW4gdG90YWwgYW1vdW50IG9mIHRpbWUgdGhhdCB0aGUgU1RBIHNjYW5zIGVhY2ggY2hhbm5lbCB3aGVuIHBlcmZvcm1pbmcgYSBhY3RpdmUgT0JTUyBzY2FuCisjZGVmaW5lIGRvdDExQlNTV2lkdGhDaGFubmVsVHJhbnNhY3Rpb25EZWxheUZhY3RvcgkJCTUJLy8gbWluIHJhdGlvIGJldHdlZW4gdGhlIGRlbGF5IHRpbWUgaW4gcGVyZm9ybWluZyBhIHN3aXRjaCBmcm9tIDIwTUh6IEJTUyB0byAyMC80MCBCU1Mgb3BlcmF0aW9uIGFuZCB0aGUgbWF4aW1hCisJCQkJCQkJCQkJCQkJCQkJLy8JaW50ZXJ2YWwgYmV0d2VlbiBvdmVybGFwcGluZyBCU1Mgc2NhbiBvcGVyYXRpb25zLgorI2RlZmluZSBkb3QxMUJTU1NjYW5BY3Rpdml0eVRocmVzaG9sZAkJCQkJCTI1CS8vIGluICUlLCBtYXggdG90YWwgdGltZSB0aGF0IGEgU1RBIG1heSBiZSBhY3RpdmUgb24gdGhlIG1lZGl1bSBkdXJpbmcgYSBwZXJpb2Qgb2YKKwkJCQkJCQkJCQkJCQkJCQkvLwkoZG90MTFCU1NXaWR0aENoYW5uZWxUcmFuc2FjdGlvbkRlbGF5RmFjdG9yICogZG90MTFCU1NXaWR0aFRyaWdnZXJTY2FuSW50ZXJ2YWwpIHNlY29uZHMgd2l0aG91dAorCQkJCQkJCQkJCQkJCQkJCS8vCWJlaW5nIG9ibGlnYXRlZCB0byBwZXJmb3JtIE9CU1MgU2NhbiBvcGVyYXRpb25zLiBkZWZhdWx0IGlzIDI1KD09IDAuMjUlKQorCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX09WRVJMQVBfQlNTX1NDQU5fSUV7CisJVVNIT1JUCQlTY2FuUGFzc2l2ZUR3ZWxsOworCVVTSE9SVAkJU2NhbkFjdGl2ZUR3ZWxsOworCVVTSE9SVAkJVHJpZ2dlclNjYW5JbnQ7CQkJCS8vIFRyaWdnZXIgc2NhbiBpbnRlcnZhbAorCVVTSE9SVAkJUGFzc2l2ZVRhbFBlckNoYW5uZWw7CQkvLyBwYXNzaXZlIHRvdGFsIHBlciBjaGFubmVsCisJVVNIT1JUCQlBY3RpdmVUYWxQZXJDaGFubmVsOwkJLy8gYWN0aXZlIHRvdGFsIHBlciBjaGFubmVsCisJVVNIT1JUCQlEZWxheUZhY3RvcjsJCQkJLy8gQlNTIHdpZHRoIGNoYW5uZWwgdHJhbnNpdGlvbiBkZWxheSBmYWN0b3IKKwlVU0hPUlQJCVNjYW5BY3RUaHJlOwkJCQkvLyBTY2FuIEFjdGl2aXR5IHRocmVzaG9sZAorfU9WRVJMQVBfQlNTX1NDQU5fSUUsICpQT1ZFUkxBUF9CU1NfU0NBTl9JRTsKKworCisvLyAgNy4zLjIuNTYuIDIwLzQwIENvZXhpc3RlbmNlIGVsZW1lbnQgdXNlZCBpbiAgRWxlbWVudCBJRCA9IDcyID0gSUVfMjA0MF9CU1NfQ09FWElTVAordHlwZWRlZiB1bmlvbiBQQUNLRUQgX0JTU18yMDQwX0NPRVhJU1RfSUV7Cisgc3RydWN0IFBBQ0tFRCB7CisgI2lmZGVmIFJUX0JJR19FTkRJQU4KKwlVQ0hBUglyc3Y6NTsKKwlVQ0hBUglCU1MyMFdpZHRoUmVxOjE7CisJVUNIQVIJSW50b2xlcmFudDQwOjE7CisJVUNIQVIJSW5mb1JlcToxOworICNlbHNlCisJVUNIQVIJSW5mb1JlcToxOworCVVDSEFSCUludG9sZXJhbnQ0MDoxOwkJCS8vIEludGVyLUJTUy4gc2V0IDEgd2hlbiBwcm9oaWJpdHMgYSByZWNlaXZpbmcgQlNTIGZyb20gb3BlcmF0aW5nIGFzIGEgMjAvNDAgTWh6IEJTUy4KKwlVQ0hBUglCU1MyMFdpZHRoUmVxOjE7CQkvLyBJbnRyYS1CU1Mgc2V0IDEgd2hlbiBwcm9oaWJpdHMgYSByZWNlaXZpbmcgQVAgZnJvbSBvcGVyYXRpbmcgaXRzIEJTUyBhcyBhIDIwLzQwTUh6IEJTUy4KKwlVQ0hBUglyc3Y6NTsKKyNlbmRpZiAvLyBSVF9CSUdfRU5ESUFOIC8vCisgICAgfSBmaWVsZDsKKyBVQ0hBUiAgIHdvcmQ7Cit9IEJTU18yMDQwX0NPRVhJU1RfSUUsICpQQlNTXzIwNDBfQ09FWElTVF9JRTsKKworCit0eXBlZGVmIHN0cnVjdCAgX1RSSUdHRVJfRVZFTlRBeworCUJPT0xFQU4JCQliVmFsaWQ7CisJVUNIQVIJQlNTSURbNl07CisJVUNIQVIJUmVnQ2xhc3M7CS8vIFJlZ3VsYXRvcnkgQ2xhc3MKKwlVU0hPUlQJQ2hhbm5lbDsKKwlVTE9ORwlDRENvdW50ZXI7ICAgLy8gTWFpbnRhaW4gYSBzZXBlcmF0ZSBjb3VudCBkb3duIGNvdW50ZXIgZm9yIGVhY2ggRXZlbnQgQS4KK30gVFJJR0dFUl9FVkVOVEEsICpQVFJJR0dFUl9FVkVOVEE7CisKKy8vIDIwLzQwIHRyaWdnZXIgZXZlbnQgdGFibGUKKy8vIElmIG9uZSBFdmVudCBBIGRlbGV0ZSBvciBjcmVhdGVkLCBvciBpZiBFdmVudCBCIGlzIGRldGVjdGVkIG9yIG5vdCBkZXRlY3RlZCwgU1RBIHNob3VsZCBzZW5kIDIwNDBCU1NDb2V4aXN0ZW5jZSB0byBBUC4KKyNkZWZpbmUgTUFYX1RSSUdHRVJfRVZFTlQJCTY0Cit0eXBlZGVmIHN0cnVjdCAgX1RSSUdHRVJfRVZFTlRfVEFCeworCVVDSEFSCUV2ZW50QU5vOworCVRSSUdHRVJfRVZFTlRBCUV2ZW50QVtNQVhfVFJJR0dFUl9FVkVOVF07CisJVUxPTkcJCQlFdmVudEJDb3VudERvd247CS8vIENvdW50IGRvd24gY291bnRlciBmb3IgRXZlbnQgQi4KK30gVFJJR0dFUl9FVkVOVF9UQUIsICpQVFJJR0dFUl9FVkVOVF9UQUI7CisKKy8vIDcuMy4yNyAyMC80MCBCc3MgQ29leGlzdGVuY2UgTWdtdCBjYXBhYmlsaXR5IHVzZWQgaW4gZXh0ZW5kZWQgY2FwYWJpbGl0aWVzIGluZm9ybWF0aW9uIElFKCBJRCA9IDEyNyA9IElFX0VYVF9DQVBBQklMSVRZKS4KKy8vCVRoaXMgaXMgdGhlIGZpcnN0IG9jdGV0IGFuZCB3YXMgZGVmaW5lZCBpbiA4MDIuMTFuIEQzLjAzIGFuZCA4MDIuMTF5RDkuMAordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9FWFRfQ0FQX0lORk9fRUxFTUVOVHsKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJVUNIQVIJcnN2Mjo1OworCVVDSEFSCUV4dGVuZENoYW5uZWxTd2l0Y2g6MTsKKwlVQ0hBUglyc3Y6MTsKKwlVQ0hBUglCc3NDb2V4aXN0TWdtdFN1cHBvcnQ6MTsKKyNlbHNlCisJVUNIQVIJQnNzQ29leGlzdE1nbXRTdXBwb3J0OjE7CisJVUNIQVIJcnN2OjE7CisJVUNIQVIJRXh0ZW5kQ2hhbm5lbFN3aXRjaDoxOworCVVDSEFSCXJzdjI6NTsKKyNlbmRpZiAvLyBSVF9CSUdfRU5ESUFOIC8vCit9RVhUX0NBUF9JTkZPX0VMRU1FTlQsICpQRVhUX0NBUF9JTkZPX0VMRU1FTlQ7CisKKworLy8gODAyLjExbiA3LjMuMi42MQordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9CU1NfMjA0MF9DT0VYSVNUX0VMRU1FTlR7CisJVUNIQVIJCQkJCUVsZW1lbnRJRDsJCS8vIElEID0gSUVfMjA0MF9CU1NfQ09FWElTVCA9IDcyCisJVUNIQVIJCQkJCUxlbjsKKwlCU1NfMjA0MF9DT0VYSVNUX0lFCQlCc3NDb2V4aXN0SWU7Cit9QlNTXzIwNDBfQ09FWElTVF9FTEVNRU5ULCAqUEJTU18yMDQwX0NPRVhJU1RfRUxFTUVOVDsKKworCisvLzgwMi4xMW4gNy4zLjIuNTkKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfQlNTXzIwNDBfSU5UT0xFUkFOVF9DSF9SRVBPUlR7CisJVUNIQVIJCQkJRWxlbWVudElEOwkJLy8gSUQgPSBJRV8yMDQwX0JTU19JTlRPTEVSQU5UX1JFUE9SVCA9IDczCisJVUNIQVIJCQkJTGVuOworCVVDSEFSCQkJCVJlZ3VsYXRvcnlDbGFzczsKKwlVQ0hBUgkJCQlDaExpc3RbMF07Cit9QlNTXzIwNDBfSU5UT0xFUkFOVF9DSF9SRVBPUlQsICpQQlNTXzIwNDBfSU5UT0xFUkFOVF9DSF9SRVBPUlQ7CisKKworLy8gVGhlIHN0cnVjdHVyZSBmb3IgY2hhbm5lbCBzd2l0Y2ggYW5ub3VjZW1lbnQgSUUuIFRoaXMgaXMgaW4gODAyLjExbiBEMy4wMwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9DSEFfU1dJVENIX0FOTk9VTkNFX0lFeworCVVDSEFSCQkJU3dpdGNoTW9kZTsJLy9jaGFubmVsIHN3aXRjaCBtb2RlCisJVUNIQVIJCQlOZXdDaGFubmVsOwkvLworCVVDSEFSCQkJU3dpdGNoQ291bnQ7CS8vCit9IENIQV9TV0lUQ0hfQU5OT1VOQ0VfSUUsICpQQ0hBX1NXSVRDSF9BTk5PVU5DRV9JRTsKKworCisvLyBUaGUgc3RydWN0dXJlIGZvciBjaGFubmVsIHN3aXRjaCBhbm5vdWNlbWVudCBJRS4gVGhpcyBpcyBpbiA4MDIuMTFuIEQzLjAzCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX1NFQ19DSEFfT0ZGU0VUX0lFeworCVVDSEFSCQkJU2Vjb25kYXJ5Q2hhbm5lbE9mZnNldDsJIC8vIDE6IFNlY29uZGFyeSBhYm92ZSwgMzogU2Vjb25kYXJ5IGJlbG93LCAwOiBubyBTZWNvbmRhcnkKK30gU0VDX0NIQV9PRkZTRVRfSUUsICpQU0VDX0NIQV9PRkZTRVRfSUU7CisKKworLy8gVGhpcyBzdHJ1Y3R1cmUgaXMgZXh0cmFjdGVkIGZyb20gc3RydWN0IFJUX0hUX0NBUEFCSUxJVFkKK3R5cGVkZWYgc3RydWN0IHsKKwlCT09MRUFOCQkJYkh0RW5hYmxlOwkgLy8gSWYgd2Ugc2hvdWxkIHVzZSBodCByYXRlLgorCUJPT0xFQU4JCQliUHJlTkh0OwkgLy8gSWYgd2Ugc2hvdWxkIHVzZSBodCByYXRlLgorCS8vU3Vic3RyYWN0IGZyb20gSFQgQ2FwYWJpbGl0eSBJRQorCVVDSEFSCQkJTUNTU2V0WzE2XTsJLy9vbmx5IHN1cG9vcnQgTUNTPTAtMTUsMzIgLAorfSBSVF9IVF9QSFlfSU5GTywgKlBSVF9IVF9QSFlfSU5GTzsKKworLy9UaGlzIHN0cnVjdHVyZSBzdWJzdHJhY3RzIHJhbGluayBzdXBwb3J0cyBmcm9tIGFsbCA4MDIuMTFuLXJlbGF0ZWQgZmVhdHVyZXMuCisvL0ZlYXR1cmVzIG5vdCBsaXN0ZWQgaGVyZSBidXQgY29udGFpbmVkIGluIDgwMi4xMW4gc3BlYyBhcmUgbm90IHN1cHBvcnRlZCBpbiBydDI4NjAuCit0eXBlZGVmIHN0cnVjdCB7CisjaWYgMAkvLyBtb3ZlIHRvCisJQk9PTEVBTgkJCWJIdEVuYWJsZTsJIC8vIElmIHdlIHNob3VsZCB1c2UgaHQgcmF0ZS4KKwlCT09MRUFOCQkJYlByZU5IdDsJIC8vIElmIHdlIHNob3VsZCB1c2UgaHQgcmF0ZS4KKwkvL1N1YnN0cmFjdCBmcm9tIEhUIENhcGFiaWxpdHkgSUUKKwlVQ0hBUgkJCU1DU1NldFsxNl07CS8vb25seSBzdXBvb3J0IE1DUz0wLTE1LDMyICwKKyNlbmRpZgorI2lmZGVmIFJUX0JJR19FTkRJQU4KKwlVU0hPUlQJcnN2OjU7CisJVVNIT1JUCUFtc2R1U2l6ZToxOwkvLyBNYXggcmVjZWl2aW5nIEEtTVNEVSBzaXplCisJVVNIT1JUCUFtc2R1RW5hYmxlOjE7CS8vIEVuYWJsZSB0byB0cmFuc21pdCBBLU1TRFUuIFN1Z2dlc3QgZGlzYWJsZS4gV2Ugc2hvdWxkIHVzZSBBLU1QRFUgdG8gZ2FpbiBiZXN0IGJlbmlmaXQgb2YgODAyLjExbgorCVVTSE9SVAlSeFNUQkM6MjsJLy8gMiBiaXRzCisJVVNIT1JUCVR4U1RCQzoxOworCVVTSE9SVAlTaG9ydEdJZm9yNDA6MTsJLy9mb3I0ME1IegorCVVTSE9SVAlTaG9ydEdJZm9yMjA6MTsKKwlVU0hPUlQJR0Y6MTsJLy9ncmVlbiBmaWVsZAorCVVTSE9SVAlNaW1vUHM6MjsvL21pbW8gcG93ZXIgc2FmZSBNTVBTXworCVVTSE9SVAlDaGFubmVsV2lkdGg6MTsKKyNlbHNlCisJVVNIT1JUCUNoYW5uZWxXaWR0aDoxOworCVVTSE9SVAlNaW1vUHM6MjsvL21pbW8gcG93ZXIgc2FmZSBNTVBTXworCVVTSE9SVAlHRjoxOwkvL2dyZWVuIGZpZWxkCisJVVNIT1JUCVNob3J0R0lmb3IyMDoxOworCVVTSE9SVAlTaG9ydEdJZm9yNDA6MTsJLy9mb3I0ME1IegorCVVTSE9SVAlUeFNUQkM6MTsKKwlVU0hPUlQJUnhTVEJDOjI7CS8vIDIgYml0cworCVVTSE9SVAlBbXNkdUVuYWJsZToxOwkvLyBFbmFibGUgdG8gdHJhbnNtaXQgQS1NU0RVLiBTdWdnZXN0IGRpc2FibGUuIFdlIHNob3VsZCB1c2UgQS1NUERVIHRvIGdhaW4gYmVzdCBiZW5pZml0IG9mIDgwMi4xMW4KKwlVU0hPUlQJQW1zZHVTaXplOjE7CS8vIE1heCByZWNlaXZpbmcgQS1NU0RVIHNpemUKKwlVU0hPUlQJcnN2OjU7CisjZW5kaWYKKworCS8vU3Vic3RyYWN0IGZyb20gQWRkaW9udCBIVCBJTkZPIElFCisjaWZkZWYgUlRfQklHX0VORElBTgorCVVDSEFSCVJlY29tV2lkdGg6MTsKKwlVQ0hBUglFeHRDaGFuT2Zmc2V0OjI7CS8vIFBsZWFzZSBub3QgdGhlIGRpZmZlcmVuY2Ugd2l0aCBmb2xsb3dpbmcgCVVDSEFSCU5ld0V4dENoYW5uZWxPZmZzZXQ7IGZyb20gODAyLjExbgorCVVDSEFSCU1wZHVEZW5zaXR5OjM7CisJVUNIQVIJTWF4UkFtcGR1RmFjdG9yOjI7CisjZWxzZQorCVVDSEFSCU1heFJBbXBkdUZhY3RvcjoyOworCVVDSEFSCU1wZHVEZW5zaXR5OjM7CisJVUNIQVIJRXh0Q2hhbk9mZnNldDoyOwkvLyBQbGVhc2Ugbm90IHRoZSBkaWZmZXJlbmNlIHdpdGggZm9sbG93aW5nIAlVQ0hBUglOZXdFeHRDaGFubmVsT2Zmc2V0OyBmcm9tIDgwMi4xMW4KKwlVQ0hBUglSZWNvbVdpZHRoOjE7CisjZW5kaWYKKworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwlVU0hPUlQJcnN2MjoxMTsKKwlVU0hPUlQJT0JTU19Ob25IVEV4aXN0OjE7CisJVVNIT1JUCXJzdjM6MTsKKwlVU0hPUlQJTm9uR2ZQcmVzZW50OjE7CisJVVNIT1JUCU9wZXJhaW9uTW9kZToyOworI2Vsc2UKKwlVU0hPUlQJT3BlcmFpb25Nb2RlOjI7CisJVVNIT1JUCU5vbkdmUHJlc2VudDoxOworCVVTSE9SVAlyc3YzOjE7CisJVVNIT1JUCU9CU1NfTm9uSFRFeGlzdDoxOworCVVTSE9SVAlyc3YyOjExOworI2VuZGlmCisKKwkvLyBOZXcgRXh0ZW5zaW9uIENoYW5uZWwgT2Zmc2V0IElFCisJVUNIQVIJTmV3RXh0Q2hhbm5lbE9mZnNldDsKKwkvLyBFeHRlbnNpb24gQ2FwYWJpbGl0eSBJRSA9IDEyNworCVVDSEFSCUJTU0NvZXhpc3QyMDQwOworfSBSVF9IVF9DQVBBQklMSVRZLCAqUFJUX0hUX0NBUEFCSUxJVFk7CisKKy8vICAgZmllbGQgaW4gQWRkdGlvbmFsIEhUIEluZm9ybWF0aW9uIElFIC4KK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCB7CisjaWZkZWYgUlRfQklHX0VORElBTgorCVVDSEFSCVNlckludGVyR3JhbnU6MzsKKwlVQ0hBUglTX1BTTVBTdXA6MTsKKwlVQ0hBUglSaWZzTW9kZToxOworCVVDSEFSCVJlY29tV2lkdGg6MTsKKwlVQ0hBUglFeHRDaGFuT2Zmc2V0OjI7CisjZWxzZQorCVVDSEFSCUV4dENoYW5PZmZzZXQ6MjsKKwlVQ0hBUglSZWNvbVdpZHRoOjE7CisJVUNIQVIJUmlmc01vZGU6MTsKKwlVQ0hBUglTX1BTTVBTdXA6MTsJIC8vSW5kaWNhdGUgc3VwcG9ydCBmb3Igc2NoZWR1bGVkIFBTTVAKKwlVQ0hBUglTZXJJbnRlckdyYW51OjM7CSAvL3NlcnZpY2UgaW50ZXJ2YWwgZ3JhbnVsYXJpdHkKKyNlbmRpZgorfSBBRERfSFRJTkZPLCAqUEFERF9IVElORk87CisKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRHsKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJVVNIT1JUCXJzdjI6MTE7CisJVVNIT1JUCU9CU1NfTm9uSFRFeGlzdDoxOworCVVTSE9SVAlyc3Y6MTsKKwlVU0hPUlQJTm9uR2ZQcmVzZW50OjE7CisJVVNIT1JUCU9wZXJhaW9uTW9kZToyOworI2Vsc2UKKwlVU0hPUlQJT3BlcmFpb25Nb2RlOjI7CisJVVNIT1JUCU5vbkdmUHJlc2VudDoxOworCVVTSE9SVAlyc3Y6MTsKKwlVU0hPUlQJT0JTU19Ob25IVEV4aXN0OjE7CisJVVNIT1JUCXJzdjI6MTE7CisjZW5kaWYKK30gQUREX0hUSU5GTzIsICpQQUREX0hUSU5GTzI7CisKKworLy8gVE9ETzogTmVlZCBzeW5jIHdpdGggc3BlYyBhYm91dCB0aGUgZGVmaW5pdGlvbiBvZiBTdGJjTWNzLiBJbiBEcmFmdCAzLjAzLCBpdCdzIHJlc2VydmVkLgordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEeworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwlVU0hPUlQJcnN2OjQ7CisJVVNIT1JUCVBjb1BoYXNlOjE7CisJVVNIT1JUCVBjb0FjdGl2ZToxOworCVVTSE9SVAlMc2lnVHhvcFByb3Q6MTsKKwlVU0hPUlQJU1RCQ0JlYWNvbjoxOworCVVTSE9SVAlEdWFsQ1RTUHJvdGVjdDoxOworCVVTSE9SVAlEdWFsQmVhY29uOjE7CisJVVNIT1JUCVN0YmNNY3M6NjsKKyNlbHNlCisJVVNIT1JUCVN0YmNNY3M6NjsKKwlVU0hPUlQJRHVhbEJlYWNvbjoxOworCVVTSE9SVAlEdWFsQ1RTUHJvdGVjdDoxOworCVVTSE9SVAlTVEJDQmVhY29uOjE7CisJVVNIT1JUCUxzaWdUeG9wUHJvdDoxOwkvLyBMLVNJRyBUWE9QIHByb3RlY3Rpb24gZnVsbCBzdXBwb3J0CisJVVNIT1JUCVBjb0FjdGl2ZToxOworCVVTSE9SVAlQY29QaGFzZToxOworCVVTSE9SVAlyc3Y6NDsKKyNlbmRpZiAvLyBSVF9CSUdfRU5ESUFOIC8vCit9IEFERF9IVElORk8zLCAqUEFERF9IVElORk8zOworCisjZGVmaW5lIFNJWkVfQUREX0hUX0lORk9fSUUJCTIyCit0eXBlZGVmIHN0cnVjdCAgUEFDS0VEeworCVVDSEFSCQkJCUNvbnRyb2xDaGFuOworCUFERF9IVElORk8JCQlBZGRIdEluZm87CisJQUREX0hUSU5GTzIJCQlBZGRIdEluZm8yOworCUFERF9IVElORk8zCQkJQWRkSHRJbmZvMzsKKwlVQ0hBUgkJCQlNQ1NTZXRbMTZdOwkJLy8gQmFzaWMgTUNTIHNldAorfSBBRERfSFRfSU5GT19JRSwgKlBBRERfSFRfSU5GT19JRTsKKwordHlwZWRlZiBzdHJ1Y3QgIFBBQ0tFRHsKKwlVQ0hBUgkJCQlOZXdFeHRDaGFuT2Zmc2V0OworfSBORVdfRVhUX0NIQU5fSUUsICpQTkVXX0VYVF9DSEFOX0lFOworCisKKy8vIDQtYnl0ZSBIVEMgZmllbGQuICBtYXliZSBpbmNsdWRlZCBpbiBhbnkgZnJhbWUgZXhjZXB0IG5vbi1RT1MgZGF0YSBmcmFtZS4gIFRoZSBPcmRlciBiaXQgbXVzdCBzZXQgMS4KK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCB7CisjaWZkZWYgUlRfQklHX0VORElBTgorICAgIFVJTlQzMgkJUkRHOjE7CS8vUkRHIC8gTW9yZSBQUERVCisgICAgVUlOVDMyCQlBQ0NvbnN0cmFpbnQ6MTsJLy9mZWVkYmFjayByZXF1ZXN0CisgICAgVUlOVDMyCQlyc3Y6NTsgIC8vY2FsaWJyYXRpb24gc2VxdWVuY2UKKyAgICBVSU5UMzIJCVpMRkFubm91Y2U6MTsJLy8gWkxGIGFubm91bmNlbWVudAorICAgIFVJTlQzMgkJQ1NJU1RFRVJJTkc6MjsJLy9DU0kvIFNURUVSSU5HCisgICAgVUlOVDMyCQlGQktSZXE6MjsJLy9mZWVkYmFjayByZXF1ZXN0CisgICAgVUlOVDMyCQlDYWxTZXE6MjsgIC8vY2FsaWJyYXRpb24gc2VxdWVuY2UKKyAgICBVSU5UMzIJCUNhbFBvczoyOwkvLyBjYWxpYnJhdGlvbiBwb3NpdGlvbgorICAgIFVJTlQzMgkJTUZCb3JBU0M6NzsJLy9MaW5rIGFkYXB0YXRpb24gZmVlZGJhY2sgY29udGFpbmluZyByZWNvbW1lbmRlZCBNQ1MuIDB4N2YgZm9yIG5vIGZlZWRiYWNrIG9yIG5vdCBhdmFpbGFibGUKKyAgICBVSU5UMzIJCU1GUzozOwkvL1NFVCB0byB0aGUgcmVjZWl2ZWQgdmFsdWUgb2YgTVJTLiAweDExMSBmb3IgdW5zb2xpY2l0ZWQgTUZCLgorICAgIFVJTlQzMgkJTVJTb3JBU0k6MzsJLy8gTVJRIFNlcXVlbmNlIGlkZW50aWZpZXIuIHVuY2hhbmdlZCBkdXJpbmcgZW50aXJlIHByb2NlZHVyZS4gMHgwMDAtMHgxMTAuCisgICAgVUlOVDMyCQlNUlE6MTsJLy9NQ1MgZmVlZGJhY2suIFJlcXVlc3QgZm9yIGEgTUNTIGZlZWRiYWNrCisgICAgVUlOVDMyCQlUUlE6MTsJLy9zb3VuZGluZyByZXF1ZXN0CisgICAgVUlOVDMyCQlNQToxOwkvL21hbmFnZW1lbnQgYWN0aW9uIHBheWxvYWQgZXhpc3QgaW4gKFFvUyBOdWxsK0hUQykKKyNlbHNlCisgICAgVUlOVDMyCQlNQToxOwkvL21hbmFnZW1lbnQgYWN0aW9uIHBheWxvYWQgZXhpc3QgaW4gKFFvUyBOdWxsK0hUQykKKyAgICBVSU5UMzIJCVRSUToxOwkvL3NvdW5kaW5nIHJlcXVlc3QKKyAgICBVSU5UMzIJCU1SUToxOwkvL01DUyBmZWVkYmFjay4gUmVxdWVzdCBmb3IgYSBNQ1MgZmVlZGJhY2sKKyAgICBVSU5UMzIJCU1SU29yQVNJOjM7CS8vIE1SUSBTZXF1ZW5jZSBpZGVudGlmaWVyLiB1bmNoYW5nZWQgZHVyaW5nIGVudGlyZSBwcm9jZWR1cmUuIDB4MDAwLTB4MTEwLgorICAgIFVJTlQzMgkJTUZTOjM7CS8vU0VUIHRvIHRoZSByZWNlaXZlZCB2YWx1ZSBvZiBNUlMuIDB4MTExIGZvciB1bnNvbGljaXRlZCBNRkIuCisgICAgVUlOVDMyCQlNRkJvckFTQzo3OwkvL0xpbmsgYWRhcHRhdGlvbiBmZWVkYmFjayBjb250YWluaW5nIHJlY29tbWVuZGVkIE1DUy4gMHg3ZiBmb3Igbm8gZmVlZGJhY2sgb3Igbm90IGF2YWlsYWJsZQorICAgIFVJTlQzMgkJQ2FsUG9zOjI7CS8vIGNhbGlicmF0aW9uIHBvc2l0aW9uCisgICAgVUlOVDMyCQlDYWxTZXE6MjsgIC8vY2FsaWJyYXRpb24gc2VxdWVuY2UKKyAgICBVSU5UMzIJCUZCS1JlcToyOwkvL2ZlZWRiYWNrIHJlcXVlc3QKKyAgICBVSU5UMzIJCUNTSVNURUVSSU5HOjI7CS8vQ1NJLyBTVEVFUklORworICAgIFVJTlQzMgkJWkxGQW5ub3VjZToxOwkvLyBaTEYgYW5ub3VuY2VtZW50CisgICAgVUlOVDMyCQlyc3Y6NTsgIC8vY2FsaWJyYXRpb24gc2VxdWVuY2UKKyAgICBVSU5UMzIJCUFDQ29uc3RyYWludDoxOwkvL2ZlZWRiYWNrIHJlcXVlc3QKKyAgICBVSU5UMzIJCVJERzoxOwkvL1JERyAvIE1vcmUgUFBEVQorI2VuZGlmIC8qICFSVF9CSUdfRU5ESUFOICovCit9IEhUX0NPTlRST0wsICpQSFRfQ09OVFJPTDsKKworLy8gMi1ieXRlIFFPUyBDT05UUk9MIGZpZWxkCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgeworI2lmZGVmIFJUX0JJR19FTkRJQU4KKyAgICBVU0hPUlQgICAgICBUeG9wX1F1ZXVlU2l6ZTo4OworICAgIFVTSE9SVCAgICAgIEFNc2R1UHJlc2VudDoxOworICAgIFVTSE9SVCAgICAgIEFja1BvbGljeToyOyAgLy8wOiBub3JtYWwgQUNLIDE6Tm8gQUNLIDI6c2NoZWR1bGVkIHVuZGVyIE1UQkEvUFNNUCAgMzogQkEKKyAgICBVU0hPUlQgICAgICBFT1NQOjE7CisgICAgVVNIT1JUICAgICAgVElEOjQ7CisjZWxzZQorICAgIFVTSE9SVCAgICAgIFRJRDo0OworICAgIFVTSE9SVCAgICAgIEVPU1A6MTsKKyAgICBVU0hPUlQgICAgICBBY2tQb2xpY3k6MjsgIC8vMDogbm9ybWFsIEFDSyAxOk5vIEFDSyAyOnNjaGVkdWxlZCB1bmRlciBNVEJBL1BTTVAgIDM6IEJBCisgICAgVVNIT1JUICAgICAgQU1zZHVQcmVzZW50OjE7CisgICAgVVNIT1JUICAgICAgVHhvcF9RdWV1ZVNpemU6ODsKKyNlbmRpZiAvKiAhUlRfQklHX0VORElBTiAqLworfSBRT1NfQ09OVFJPTCwgKlBRT1NfQ09OVFJPTDsKKworLy8gMi1ieXRlIEZyYW1lIGNvbnRyb2wgZmllbGQKK3R5cGVkZWYJc3RydWN0CVBBQ0tFRCB7CisjaWZkZWYgUlRfQklHX0VORElBTgorCVVTSE9SVAkJT3JkZXI6MTsJCQkvLyBTdHJpY3Qgb3JkZXIgZXhwZWN0ZWQKKwlVU0hPUlQJCVdlcDoxOwkJCQkvLyBXZXAgZGF0YQorCVVTSE9SVAkJTW9yZURhdGE6MTsJCQkvLyBNb3JlIGRhdGEgYml0CisJVVNIT1JUCQlQd3JNZ210OjE7CQkJLy8gUG93ZXIgbWFuYWdlbWVudCBiaXQKKwlVU0hPUlQJCVJldHJ5OjE7CQkJLy8gUmV0cnkgc3RhdHVzIGJpdAorCVVTSE9SVAkJTW9yZUZyYWc6MTsJCQkvLyBNb3JlIGZyYWdtZW50IGJpdAorCVVTSE9SVAkJRnJEczoxOwkJCQkvLyBGcm9tIERTIGluZGljYXRpb24KKwlVU0hPUlQJCVRvRHM6MTsJCQkJLy8gVG8gRFMgaW5kaWNhdGlvbgorCVVTSE9SVAkJU3ViVHlwZTo0OwkJCS8vIE1TRFUgc3VidHlwZQorCVVTSE9SVAkJVHlwZToyOwkJCQkvLyBNU0RVIHR5cGUKKwlVU0hPUlQJCVZlcjoyOwkJCQkvLyBQcm90b2NvbCB2ZXJzaW9uCisjZWxzZQorCVVTSE9SVAkJVmVyOjI7CQkJCS8vIFByb3RvY29sIHZlcnNpb24KKwlVU0hPUlQJCVR5cGU6MjsJCQkJLy8gTVNEVSB0eXBlCisJVVNIT1JUCQlTdWJUeXBlOjQ7CQkJLy8gTVNEVSBzdWJ0eXBlCisJVVNIT1JUCQlUb0RzOjE7CQkJCS8vIFRvIERTIGluZGljYXRpb24KKwlVU0hPUlQJCUZyRHM6MTsJCQkJLy8gRnJvbSBEUyBpbmRpY2F0aW9uCisJVVNIT1JUCQlNb3JlRnJhZzoxOwkJCS8vIE1vcmUgZnJhZ21lbnQgYml0CisJVVNIT1JUCQlSZXRyeToxOwkJCS8vIFJldHJ5IHN0YXR1cyBiaXQKKwlVU0hPUlQJCVB3ck1nbXQ6MTsJCQkvLyBQb3dlciBtYW5hZ2VtZW50IGJpdAorCVVTSE9SVAkJTW9yZURhdGE6MTsJCQkvLyBNb3JlIGRhdGEgYml0CisJVVNIT1JUCQlXZXA6MTsJCQkJLy8gV2VwIGRhdGEKKwlVU0hPUlQJCU9yZGVyOjE7CQkJLy8gU3RyaWN0IG9yZGVyIGV4cGVjdGVkCisjZW5kaWYgLyogIVJUX0JJR19FTkRJQU4gKi8KK30gRlJBTUVfQ09OVFJPTCwgKlBGUkFNRV9DT05UUk9MOworCit0eXBlZGVmCXN0cnVjdAlQQUNLRUQgX0hFQURFUl84MDJfMTEJeworICAgIEZSQU1FX0NPTlRST0wgICBGQzsKKyAgICBVU0hPUlQgICAgICAgICAgRHVyYXRpb247CisgICAgVUNIQVIgICAgICAgICAgIEFkZHIxW01BQ19BRERSX0xFTl07CisgICAgVUNIQVIgICAgICAgICAgIEFkZHIyW01BQ19BRERSX0xFTl07CisJVUNIQVIJCQlBZGRyM1tNQUNfQUREUl9MRU5dOworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwlVU0hPUlQJCQlTZXF1ZW5jZToxMjsKKwlVU0hPUlQJCQlGcmFnOjQ7CisjZWxzZQorCVVTSE9SVAkJCUZyYWc6NDsKKwlVU0hPUlQJCQlTZXF1ZW5jZToxMjsKKyNlbmRpZiAvKiAhUlRfQklHX0VORElBTiAqLworCVVDSEFSCQkJT2N0ZXRbMF07Cit9CUhFQURFUl84MDJfMTEsICpQSEVBREVSXzgwMl8xMTsKKwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9GUkFNRV84MDJfMTEgeworICAgIEhFQURFUl84MDJfMTEgICBIZHI7CisgICAgVUNIQVIgICAgICAgICAgICBPY3RldFsxXTsKK30gICBGUkFNRV84MDJfMTEsICpQRlJBTUVfODAyXzExOworCisvLyBRb1NOdWxsIGVtYmVkZGluZyBvZiBtYW5hZ2VtZW50IGFjdGlvbi4gV2hlbiBIVCBDb250cm9sIE1BIGZpZWxkIHNldCB0byAxLgordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9NQV9CT0RZIHsKKyAgICBVQ0hBUiAgICAgICAgICAgIENhdGVnb3J5OworICAgIFVDSEFSICAgICAgICAgICAgQWN0aW9uOworICAgIFVDSEFSICAgICAgICAgICAgT2N0ZXRbMV07Cit9ICAgTUFfQk9EWSwgKlBNQV9CT0RZOworCit0eXBlZGVmCXN0cnVjdAlQQUNLRUQgX0hFQURFUl84MDJfMwl7CisgICAgVUNIQVIgICAgICAgICAgIERBQWRkcjFbTUFDX0FERFJfTEVOXTsKKyAgICBVQ0hBUiAgICAgICAgICAgU0FBZGRyMltNQUNfQUREUl9MRU5dOworICAgIFVDSEFSICAgICAgICAgICBPY3RldFsyXTsKK30JSEVBREVSXzgwMl8zLCAqUEhFQURFUl84MDJfMzsKKy8vLy9CbG9jayBBQ0sgcmVsYXRlZCBmb3JtYXQKKy8vIDItYnl0ZSBCQSBQYXJhbWV0ZXIgIGZpZWxkICBpbiAJREVMQkEgZnJhbWVzIHRvIHRlcm1pbmF0ZSBhbiBhbHJlYWR5IHNldCB1cCBiQQordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEeworI2lmZGVmIFJUX0JJR19FTkRJQU4KKyAgICBVU0hPUlQgICAgICBUSUQ6NDsJLy8gdmFsdWUgb2YgVEMgb3MgVFMKKyAgICBVU0hPUlQgICAgICBJbml0aWF0b3I6MTsJLy8gMTogb3JpZ2luYXRvciAgICAwOnJlY2lwaWVudAorICAgIFVTSE9SVCAgICAgIFJzdjoxMTsJLy8gYWx3YXlzIHNldCB0byAwCisjZWxzZQorICAgIFVTSE9SVCAgICAgIFJzdjoxMTsJLy8gYWx3YXlzIHNldCB0byAwCisgICAgVVNIT1JUICAgICAgSW5pdGlhdG9yOjE7CS8vIDE6IG9yaWdpbmF0b3IgICAgMDpyZWNpcGllbnQKKyAgICBVU0hPUlQgICAgICBUSUQ6NDsJLy8gdmFsdWUgb2YgVEMgb3MgVFMKKyNlbmRpZiAvKiAhUlRfQklHX0VORElBTiAqLworfSBERUxCQV9QQVJNLCAqUERFTEJBX1BBUk07CisKKy8vIDItYnl0ZSBCQSBQYXJhbWV0ZXIgU2V0IGZpZWxkICBpbiBBRERCQSBmcmFtZXMgdG8gc2lnbmFsIHBhcm0gZm9yIHNldHRpbmcgdXAgYSBCQQordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIHsKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisgICAgVVNIT1JUICAgICAgQnVmU2l6ZToxMDsJLy8gbnVtYmVyIG9mIGJ1ZmZlIG9mIHNpemUgMjMwNCBvY3RldHNyCisgICAgVVNIT1JUICAgICAgVElEOjQ7CS8vIHZhbHVlIG9mIFRDIG9zIFRTCisgICAgVVNIT1JUICAgICAgQkFQb2xpY3k6MTsJLy8gMTogaW1tZWRpYXRlbHkgQkEgICAgMDpkZWxheWVkIEJBCisgICAgVVNIT1JUICAgICAgQU1TRFVTdXBwb3J0ZWQ6MTsJLy8gMDogbm90IHBlcm1pdHRlZAkJMTogcGVybWl0dGVkCisjZWxzZQorICAgIFVTSE9SVCAgICAgIEFNU0RVU3VwcG9ydGVkOjE7CS8vIDA6IG5vdCBwZXJtaXR0ZWQJCTE6IHBlcm1pdHRlZAorICAgIFVTSE9SVCAgICAgIEJBUG9saWN5OjE7CS8vIDE6IGltbWVkaWF0ZWx5IEJBICAgIDA6ZGVsYXllZCBCQQorICAgIFVTSE9SVCAgICAgIFRJRDo0OwkvLyB2YWx1ZSBvZiBUQyBvcyBUUworICAgIFVTSE9SVCAgICAgIEJ1ZlNpemU6MTA7CS8vIG51bWJlciBvZiBidWZmZSBvZiBzaXplIDIzMDQgb2N0ZXRzcgorI2VuZGlmIC8qICFSVF9CSUdfRU5ESUFOICovCit9IEJBX1BBUk0sICpQQkFfUEFSTTsKKworLy8gMi1ieXRlIEJBIFN0YXJ0aW5nIFNlcSBDT05UUk9MIGZpZWxkCit0eXBlZGVmIHVuaW9uIFBBQ0tFRCB7CisgICAgc3RydWN0IFBBQ0tFRCB7CisjaWZkZWYgUlRfQklHX0VORElBTgorICAgIFVTSE9SVCAgICAgIFN0YXJ0U2VxOjEyOyAgIC8vIHNlcXVlbmNlIG51bWJlciBvZiB0aGUgMXN0IE1TRFUgZm9yIHdoaWNoIHRoaXMgQkFSIGlzIHNlbnQKKwlVU0hPUlQgICAgICBGcmFnTnVtOjQ7CS8vIGFsd2F5cyBzZXQgdG8gMAorI2Vsc2UKKyAgICBVU0hPUlQgICAgICBGcmFnTnVtOjQ7CS8vIGFsd2F5cyBzZXQgdG8gMAorCVVTSE9SVCAgICAgIFN0YXJ0U2VxOjEyOyAgIC8vIHNlcXVlbmNlIG51bWJlciBvZiB0aGUgMXN0IE1TRFUgZm9yIHdoaWNoIHRoaXMgQkFSIGlzIHNlbnQKKyNlbmRpZiAvKiBSVF9CSUdfRU5ESUFOICovCisgICAgfSAgIGZpZWxkOworICAgIFVTSE9SVCAgICAgICAgICAgd29yZDsKK30gQkFTRVFfQ09OVFJPTCwgKlBCQVNFUV9DT05UUk9MOworCisvL0JBQ29udHJvbCBhbmQgQkFSQ29udHJvbCBhcmUgdGhlIHNhbWUKKy8vIDItYnl0ZSBCQSBDT05UUk9MIGZpZWxkIGluIEJBIGZyYW1lCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgeworI2lmZGVmIFJUX0JJR19FTkRJQU4KKyAgICBVU0hPUlQgICAgICBUSUQ6NDsKKyAgICBVU0hPUlQgICAgICBSc3Y6OTsKKyAgICBVU0hPUlQgICAgICBDb21wcmVzc2VkOjE7CisgICAgVVNIT1JUICAgICAgTVRJRDoxOwkJLy9FV0MgVjEuMjQKKyAgICBVU0hPUlQgICAgICBBQ0tQb2xpY3k6MTsgLy8gb25seSByZWxhdGVkIHRvIE4tRGVsYXllZCBCQS4gQnV0IG5vdCBzdXBwb3J0IGluIFJUMjg2MGIuIDA6Tm9ybWFsQUNLICAxOk5vIEFDSworI2Vsc2UKKyAgICBVU0hPUlQgICAgICBBQ0tQb2xpY3k6MTsgLy8gb25seSByZWxhdGVkIHRvIE4tRGVsYXllZCBCQS4gQnV0IG5vdCBzdXBwb3J0IGluIFJUMjg2MGIuIDA6Tm9ybWFsQUNLICAxOk5vIEFDSworICAgIFVTSE9SVCAgICAgIE1USUQ6MTsJCS8vRVdDIFYxLjI0CisgICAgVVNIT1JUICAgICAgQ29tcHJlc3NlZDoxOworICAgIFVTSE9SVCAgICAgIFJzdjo5OworICAgIFVTSE9SVCAgICAgIFRJRDo0OworI2VuZGlmIC8qICFSVF9CSUdfRU5ESUFOICovCit9IEJBX0NPTlRST0wsICpQQkFfQ09OVFJPTDsKKworLy8gMi1ieXRlIEJBUiBDT05UUk9MIGZpZWxkIGluIEJBUiBmcmFtZQordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIHsKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisgICAgVVNIT1JUICAgICAgVElEOjQ7CisgICAgVVNIT1JUICAgICAgUnN2MTo5OworICAgIFVTSE9SVCAgICAgIENvbXByZXNzZWQ6MTsKKyAgICBVU0hPUlQgICAgICBNVElEOjE7CQkvL2lmIHRoaXMgYml0MSwgdXNlICBGUkFNRV9NVEJBX1JFUSwgIGlmIDAsIHVzZSBGUkFNRV9CQV9SRVEKKyAgICBVU0hPUlQgICAgICBBQ0tQb2xpY3k6MTsKKyNlbHNlCisgICAgVVNIT1JUICAgICAgQUNLUG9saWN5OjE7IC8vIDA6bm9ybWFsIGFjaywgIDE6bm8gYWNrLgorICAgIFVTSE9SVCAgICAgIE1USUQ6MTsJCS8vaWYgdGhpcyBiaXQxLCB1c2UgIEZSQU1FX01UQkFfUkVRLCAgaWYgMCwgdXNlIEZSQU1FX0JBX1JFUQorICAgIFVTSE9SVCAgICAgIENvbXByZXNzZWQ6MTsKKyAgICBVU0hPUlQgICAgICBSc3YxOjk7CisgICAgVVNIT1JUICAgICAgVElEOjQ7CisjZW5kaWYgLyogIVJUX0JJR19FTkRJQU4gKi8KK30gQkFSX0NPTlRST0wsICpQQkFSX0NPTlRST0w7CisKKy8vIEJBUkNvbnRyb2wgaW4gTVRCQVIgZnJhbWUKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCB7CisjaWZkZWYgUlRfQklHX0VORElBTgorICAgIFVTSE9SVCAgICAgIE51bVRJRDo0OworICAgIFVTSE9SVCAgICAgIFJzdjE6OTsKKyAgICBVU0hPUlQgICAgICBDb21wcmVzc2VkOjE7CisgICAgVVNIT1JUICAgICAgTVRJRDoxOworICAgIFVTSE9SVCAgICAgIEFDS1BvbGljeToxOworI2Vsc2UKKyAgICBVU0hPUlQgICAgICBBQ0tQb2xpY3k6MTsKKyAgICBVU0hPUlQgICAgICBNVElEOjE7CisgICAgVVNIT1JUICAgICAgQ29tcHJlc3NlZDoxOworICAgIFVTSE9SVCAgICAgIFJzdjE6OTsKKyAgICBVU0hPUlQgICAgICBOdW1USUQ6NDsKKyNlbmRpZiAvKiAhUlRfQklHX0VORElBTiAqLworfSBNVEJBUl9DT05UUk9MLCAqUE1UQkFSX0NPTlRST0w7CisKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCB7CisjaWZkZWYgUlRfQklHX0VORElBTgorICAgIFVTSE9SVCAgICAgIFRJRDo0OworICAgIFVTSE9SVCAgICAgIFJzdjE6MTI7CisjZWxzZQorICAgIFVTSE9SVCAgICAgIFJzdjE6MTI7CisgICAgVVNIT1JUICAgICAgVElEOjQ7CisjZW5kaWYgLyogIVJUX0JJR19FTkRJQU4gKi8KK30gUEVSX1RJRF9JTkZPLCAqUFBFUl9USURfSU5GTzsKKwordHlwZWRlZiBzdHJ1Y3QgeworCVBFUl9USURfSU5GTyAgICAgIFBlclRJRDsKKwlCQVNFUV9DT05UUk9MIAkgQkFTdGFydGluZ1NlcTsKK30gRUFDSF9USUQsICpQRUFDSF9USUQ7CisKKwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9QU1BPTExfRlJBTUUgeworICAgIEZSQU1FX0NPTlRST0wgICBGQzsKKyAgICBVU0hPUlQgICAgICAgICAgQWlkOworICAgIFVDSEFSICAgICAgICAgICBCc3NpZFtNQUNfQUREUl9MRU5dOworICAgIFVDSEFSICAgICAgICAgICBUYVtNQUNfQUREUl9MRU5dOworfSAgIFBTUE9MTF9GUkFNRSwgKlBQU1BPTExfRlJBTUU7CisKK3R5cGVkZWYJc3RydWN0CVBBQ0tFRCBfUlRTX0ZSQU1FCXsKKyAgICBGUkFNRV9DT05UUk9MICAgRkM7CisgICAgVVNIT1JUICAgICAgICAgIER1cmF0aW9uOworICAgIFVDSEFSICAgICAgICAgICBBZGRyMVtNQUNfQUREUl9MRU5dOworICAgIFVDSEFSICAgICAgICAgICBBZGRyMltNQUNfQUREUl9MRU5dOworfVJUU19GUkFNRSwgKlBSVFNfRlJBTUU7CisKKy8vIEJBUkVRIEFORCBNVEJBUkVRIGhhdmUgdGhlIHNhbWUgc3VidHlwZSBCQVIsIDgwMi4xMW4gQkFSIHVzZSBjb21wcmVzc2VkIGJpdG1hcC4KK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfRlJBTUVfQkFfUkVRIHsKKwlGUkFNRV9DT05UUk9MICAgRkM7CisJVVNIT1JUICAgICAgICAgIER1cmF0aW9uOworCVVDSEFSICAgICAgICAgICBBZGRyMVtNQUNfQUREUl9MRU5dOworCVVDSEFSICAgICAgICAgICBBZGRyMltNQUNfQUREUl9MRU5dOworCUJBUl9DT05UUk9MICBCQVJDb250cm9sOworCUJBU0VRX0NPTlRST0wgCSBCQVN0YXJ0aW5nU2VxOworfSAgIEZSQU1FX0JBX1JFUSwgKlBGUkFNRV9CQV9SRVE7CisKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfRlJBTUVfTVRCQV9SRVEgeworCUZSQU1FX0NPTlRST0wgICBGQzsKKwlVU0hPUlQgICAgICAgICAgRHVyYXRpb247CisJVUNIQVIgICAgICAgICAgIEFkZHIxW01BQ19BRERSX0xFTl07CisJVUNIQVIgICAgICAgICAgIEFkZHIyW01BQ19BRERSX0xFTl07CisJTVRCQVJfQ09OVFJPTCAgTVRCQVJDb250cm9sOworCVBFUl9USURfSU5GTwlQZXJUSURJbmZvOworCUJBU0VRX0NPTlRST0wgCSBCQVN0YXJ0aW5nU2VxOworfSAgIEZSQU1FX01UQkFfUkVRLCAqUEZSQU1FX01UQkFfUkVROworCisvLyBDb21wcmVzc2VkIGZvcm1hdCBpcyBtYW5kYW50b3J5IGluIEhUIFNUQQordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9GUkFNRV9NVEJBIHsKKwlGUkFNRV9DT05UUk9MICAgRkM7CisJVVNIT1JUICAgICAgICAgIER1cmF0aW9uOworCVVDSEFSICAgICAgICAgICBBZGRyMVtNQUNfQUREUl9MRU5dOworCVVDSEFSICAgICAgICAgICBBZGRyMltNQUNfQUREUl9MRU5dOworCUJBX0NPTlRST0wgIEJBQ29udHJvbDsKKwlCQVNFUV9DT05UUk9MIAkgQkFTdGFydGluZ1NlcTsKKwlVQ0hBUgkJQml0TWFwWzhdOworfSAgIEZSQU1FX01UQkEsICpQRlJBTUVfTVRCQTsKKwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9GUkFNRV9QU01QX0FDVElPTiB7CisJSEVBREVSXzgwMl8xMSAgIEhkcjsKKwlVQ0hBUglDYXRlZ29yeTsKKwlVQ0hBUglBY3Rpb247CisJVUNIQVIJUHNtcDsJLy8gNy4zLjEuMjUKK30gICBGUkFNRV9QU01QX0FDVElPTiwgKlBGUkFNRV9QU01QX0FDVElPTjsKKwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9GUkFNRV9BQ1RJT05fSERSIHsKKwlIRUFERVJfODAyXzExICAgSGRyOworCVVDSEFSCUNhdGVnb3J5OworCVVDSEFSCUFjdGlvbjsKK30gICBGUkFNRV9BQ1RJT05fSERSLCAqUEZSQU1FX0FDVElPTl9IRFI7CisKKy8vQWN0aW9uIEZyYW1lCisvL0FjdGlvbiBGcmFtZSAgQ2F0ZWdvcnk6U3BlY3RydW0sICBBY3Rpb246Q2hhbm5lbCBTd2l0Y2guIDcuMy4yLjIwCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX0NIQU5fU1dJVENIX0FOTk9VTkNFIHsKKwlVQ0hBUgkJCQkJRWxlbWVudElEOwkvLyBJRCA9IElFX0NIQU5ORUxfU1dJVENIX0FOTk9VTkNFTUVOVCA9IDM3CisJVUNIQVIJCQkJCUxlbjsKKwlDSEFfU1dJVENIX0FOTk9VTkNFX0lFCUNTQW5ub3VuY2VJZTsKK30gICBDSEFOX1NXSVRDSF9BTk5PVU5DRSwgKlBDSEFOX1NXSVRDSF9BTk5PVU5DRTsKKworCisvLzgwMi4xMW4gOiA3LjMuMi4yMGEKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfU0VDT05EX0NIQU5fT0ZGU0VUIHsKKwlVQ0hBUgkJCQlFbGVtZW50SUQ7CQkvLyBJRCA9IElFX1NFQ09OREFSWV9DSF9PRkZTRVQgPSA2MgorCVVDSEFSCQkJCUxlbjsKKwlTRUNfQ0hBX09GRlNFVF9JRQlTZWNDaE9mZnNldEllOworfSAgIFNFQ09ORF9DSEFOX09GRlNFVCwgKlBTRUNPTkRfQ0hBTl9PRkZTRVQ7CisKKwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9GUkFNRV9TUEVUUlVNX0NTIHsKKwlIRUFERVJfODAyXzExICAgSGRyOworCVVDSEFSCUNhdGVnb3J5OworCVVDSEFSCUFjdGlvbjsKKwlDSEFOX1NXSVRDSF9BTk5PVU5DRQlDU0Fubm91bmNlOworCVNFQ09ORF9DSEFOX09GRlNFVAkJU2Vjb25kQ2hhbm5lbDsKK30gICBGUkFNRV9TUEVUUlVNX0NTLCAqUEZSQU1FX1NQRVRSVU1fQ1M7CisKKwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9GUkFNRV9BRERCQV9SRVEgeworCUhFQURFUl84MDJfMTEgICBIZHI7CisJVUNIQVIJQ2F0ZWdvcnk7CisJVUNIQVIJQWN0aW9uOworCVVDSEFSCVRva2VuOwkvLyAxCisJQkFfUEFSTQkJQmFQYXJtOwkgICAgICAvLyAgMiAtIDEwCisJVVNIT1JUCQlUaW1lT3V0VmFsdWU7CS8vIDAgLSAwCisJQkFTRVFfQ09OVFJPTAlCYVN0YXJ0U2VxOyAvLyAwLTAKK30gICBGUkFNRV9BRERCQV9SRVEsICpQRlJBTUVfQUREQkFfUkVROworCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX0ZSQU1FX0FEREJBX1JTUCB7CisJSEVBREVSXzgwMl8xMSAgIEhkcjsKKwlVQ0hBUglDYXRlZ29yeTsKKwlVQ0hBUglBY3Rpb247CisJVUNIQVIJVG9rZW47CisJVVNIT1JUCVN0YXR1c0NvZGU7CisJQkFfUEFSTQkJQmFQYXJtOyAvLzAgLSAyCisJVVNIT1JUCQlUaW1lT3V0VmFsdWU7Cit9ICAgRlJBTUVfQUREQkFfUlNQLCAqUEZSQU1FX0FEREJBX1JTUDsKKwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9GUkFNRV9ERUxCQV9SRVEgeworCUhFQURFUl84MDJfMTEgICBIZHI7CisJVUNIQVIJQ2F0ZWdvcnk7CisJVUNIQVIJQWN0aW9uOworCURFTEJBX1BBUk0JCURlbGJhUGFybTsKKwlVU0hPUlQJUmVhc29uQ29kZTsKK30gICBGUkFNRV9ERUxCQV9SRVEsICpQRlJBTUVfREVMQkFfUkVROworCisKKy8vNy4yLjEuNwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9GUkFNRV9CQVIgeworCUZSQU1FX0NPTlRST0wgICBGQzsKKwlVU0hPUlQgICAgICAgICAgRHVyYXRpb247CisJVUNIQVIgICAgICAgICAgIEFkZHIxW01BQ19BRERSX0xFTl07CisJVUNIQVIgICAgICAgICAgIEFkZHIyW01BQ19BRERSX0xFTl07CisJQkFSX0NPTlRST0wJCUJhckNvbnRyb2w7CisJQkFTRVFfQ09OVFJPTAlTdGFydGluZ1NlcTsKK30gICBGUkFNRV9CQVIsICpQRlJBTUVfQkFSOworCisvLzcuMi4xLjcKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfRlJBTUVfQkEgeworCUZSQU1FX0NPTlRST0wgICBGQzsKKwlVU0hPUlQgICAgICAgICAgRHVyYXRpb247CisJVUNIQVIgICAgICAgICAgIEFkZHIxW01BQ19BRERSX0xFTl07CisJVUNIQVIgICAgICAgICAgIEFkZHIyW01BQ19BRERSX0xFTl07CisJQkFSX0NPTlRST0wJCUJhckNvbnRyb2w7CisJQkFTRVFfQ09OVFJPTAlTdGFydGluZ1NlcTsKKwlVQ0hBUgkJYml0bWFza1s4XTsKK30gICBGUkFNRV9CQSwgKlBGUkFNRV9CQTsKKworCisvLyBSYWRpbyBNZWFzdWVtZW50IFJlcXVlc3QgRnJhbWUgRm9ybWF0Cit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX0ZSQU1FX1JNX1JFUV9BQ1RJT04geworCUhFQURFUl84MDJfMTEgICBIZHI7CisJVUNIQVIJQ2F0ZWdvcnk7CisJVUNIQVIJQWN0aW9uOworCVVDSEFSCVRva2VuOworCVVTSE9SVAlSZXBldGl0aW9uOworCVVDSEFSICAgZGF0YVswXTsKK30gICBGUkFNRV9STV9SRVFfQUNUSU9OLCAqUEZSQU1FX1JNX1JFUV9BQ1RJT047CisKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCB7CisJVUNIQVIJCUlEOworCVVDSEFSCQlMZW5ndGg7CisJVUNIQVIJCUNoYW5uZWxTd2l0Y2hNb2RlOworCVVDSEFSCQlOZXdSZWdDbGFzczsKKwlVQ0hBUgkJTmV3Q2hhbm5lbE51bTsKKwlVQ0hBUgkJQ2hhbm5lbFN3aXRjaENvdW50OworfSBIVF9FWFRfQ0hBTk5FTF9TV0lUQ0hfQU5OT1VOQ0VNRU5UX0lFLCAqUEhUX0VYVF9DSEFOTkVMX1NXSVRDSF9BTk5PVU5DRU1FTlRfSUU7CisKKworLy8KKy8vIF9MaW1pdCBtdXN0IGJlIHRoZSAyKipuIC0gMQorLy8gX1NFUTEgLCBfU0VRMiBtdXN0IGJlIHdpdGhpbiAwIH4gX0xpbWl0CisvLworI2RlZmluZSBTRVFfU1RFUE9ORShfU0VRMSwgX1NFUTIsIF9MaW1pdCkJKChfU0VRMSA9PSAoKF9TRVEyKzEpICYgX0xpbWl0KSkpCisjZGVmaW5lIFNFUV9TTUFMTEVSKF9TRVExLCBfU0VRMiwgX0xpbWl0KQkoKChfU0VRMS1fU0VRMikgJiAoKF9MaW1pdCsxKT4+MSkpKQorI2RlZmluZSBTRVFfTEFSR0VSKF9TRVExLCBfU0VRMiwgX0xpbWl0KQkoKF9TRVExICE9IF9TRVEyKSAmJiAhKCgoX1NFUTEtX1NFUTIpICYgKChfTGltaXQrMSk+PjEpKSkpCisjZGVmaW5lIFNFUV9XSVRISU5fV0lOKF9TRVExLCBfU0VRMiwgX1dJTiwgX0xpbWl0KSAoU0VRX0xBUkdFUihfU0VRMSwgX1NFUTIsIF9MaW1pdCkgJiYgIFwKKwkJCQkJCQkJCQkJCVNFUV9TTUFMTEVSKF9TRVExLCAoKF9TRVEyK19XSU4rMSkmX0xpbWl0KSwgX0xpbWl0KSkKKworLy8KKy8vIENvbnRlbnRpb24tZnJlZSBwYXJhbWV0ZXIgKHdpdGhvdXQgSUQgYW5kIExlbmd0aCkKKy8vCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgeworICAgIEJPT0xFQU4gICAgIGJWYWxpZDsgICAgICAgICAvLyAxOiB2YXJpYWJsZSBjb250YWlucyB2YWxpZCB2YWx1ZQorICAgIFVDSEFSICAgICAgIENmcENvdW50OworICAgIFVDSEFSICAgICAgIENmcFBlcmlvZDsKKyAgICBVU0hPUlQgICAgICBDZnBNYXhEdXJhdGlvbjsKKyAgICBVU0hPUlQgICAgICBDZnBEdXJSZW1haW5pbmc7Cit9IENGX1BBUk0sICpQQ0ZfUEFSTTsKKwordHlwZWRlZglzdHJ1Y3QJX0NJUEhFUl9TVUlURQl7CisJTkRJU184MDJfMTFfRU5DUllQVElPTl9TVEFUVVMJUGFpckNpcGhlcjsJCS8vIFVuaWNhc3QgY2lwaGVyIDEsIHRoaXMgb25lIGhhcyBtb3JlIHNlY3VyZWQgY2lwaGVyIHN1aXRlCisJTkRJU184MDJfMTFfRU5DUllQVElPTl9TVEFUVVMJUGFpckNpcGhlckF1eDsJLy8gVW5pY2FzdCBjaXBoZXIgMiBpZiBBUCBhbm5vdW5jZSB0d28gdW5pY2FzdCBjaXBoZXIgc3VpdGUKKwlORElTXzgwMl8xMV9FTkNSWVBUSU9OX1NUQVRVUwlHcm91cENpcGhlcjsJLy8gR3JvdXAgY2lwaGVyCisJVVNIT1JUCQkJCQkJCVJzbkNhcGFiaWxpdHk7CS8vIFJTTiBjYXBhYmlsaXR5IGZyb20gYmVhY29uCisJQk9PTEVBTgkJCQkJCQliTWl4TW9kZTsJCS8vIEluZGljYXRlIFBhaXIgJiBHcm91cCBjaXBoZXIgbWlnaHQgYmUgZGlmZmVyZW50Cit9CUNJUEhFUl9TVUlURSwgKlBDSVBIRVJfU1VJVEU7CisKKy8vIEVEQ0EgY29uZmlndXJhdGlvbiBmcm9tIEFQJ3MgQkVBQ09OL1Byb2JlUnNwCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQk9PTEVBTiAgICAgYlZhbGlkOyAgICAgICAgIC8vIDE6IHZhcmlhYmxlIGNvbnRhaW5zIHZhbGlkIHZhbHVlCisgICAgQk9PTEVBTiAgICAgYkFkZDsgICAgICAgICAvLyAxOiB2YXJpYWJsZSBjb250YWlucyB2YWxpZCB2YWx1ZQorICAgIEJPT0xFQU4gICAgIGJRQWNrOworICAgIEJPT0xFQU4gICAgIGJRdWV1ZVJlcXVlc3Q7CisgICAgQk9PTEVBTiAgICAgYlR4b3BSZXF1ZXN0OworICAgIEJPT0xFQU4gICAgIGJBUFNEQ2FwYWJsZTsKKy8vICBCT09MRUFOICAgICBiTW9yZURhdGFBY2s7CisgICAgVUNIQVIgICAgICAgRWRjYVVwZGF0ZUNvdW50OworICAgIFVDSEFSICAgICAgIEFpZnNuWzRdOyAgICAgICAvLyAwOkFDX0JLLCAxOkFDX0JFLCAyOkFDX1ZJLCAzOkFDX1ZPCisgICAgVUNIQVIgICAgICAgQ3dtaW5bNF07CisgICAgVUNIQVIgICAgICAgQ3dtYXhbNF07CisgICAgVVNIT1JUICAgICAgVHhvcFs0XTsgICAgICAvLyBpbiB1bml0IG9mIDMyLXVzCisgICAgQk9PTEVBTiAgICAgYkFDTVs0XTsgICAgICAvLyAxOiBBZG1pc3Npb24gQ29udHJvbCBvZiBBQ19CSyBpcyBtYW5kYXR0b3J5Cit9IEVEQ0FfUEFSTSwgKlBFRENBX1BBUk07CisKKy8vIFFCU1MgTE9BRCBpbmZvcm1hdGlvbiBmcm9tIFFBUCdzIEJFQUNPTi9Qcm9iZVJzcAordHlwZWRlZiBzdHJ1Y3QgeworICAgIEJPT0xFQU4gICAgIGJWYWxpZDsgICAgICAgICAgICAgICAgICAgICAvLyAxOiB2YXJpYWJsZSBjb250YWlucyB2YWxpZCB2YWx1ZQorICAgIFVTSE9SVCAgICAgIFN0YU51bTsKKyAgICBVQ0hBUiAgICAgICBDaGFubmVsVXRpbGl6YXRpb247CisgICAgVVNIT1JUICAgICAgUmVtYWluaW5nQWRtaXNzaW9uQ29udHJvbDsgIC8vIGluIHVuaXQgb2YgMzItdXMKK30gUUJTU19MT0FEX1BBUk0sICpQUUJTU19MT0FEX1BBUk07CisKKy8vIFFCU1MgSW5mbyBmaWVsZCBpbiBRU1RBJ3MgYXNzb2MgcmVxCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgeworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwlVQ0hBUgkJUnN2MjoxOworCVVDSEFSCQlNYXhTUExlbmd0aDoyOworCVVDSEFSCQlSc3YxOjE7CisJVUNIQVIJCVVBUFNEX0FDX0JFOjE7CisJVUNIQVIJCVVBUFNEX0FDX0JLOjE7CisJVUNIQVIJCVVBUFNEX0FDX1ZJOjE7CisJVUNIQVIJCVVBUFNEX0FDX1ZPOjE7CisjZWxzZQorICAgIFVDSEFSCQlVQVBTRF9BQ19WTzoxOworCVVDSEFSCQlVQVBTRF9BQ19WSToxOworCVVDSEFSCQlVQVBTRF9BQ19CSzoxOworCVVDSEFSCQlVQVBTRF9BQ19CRToxOworCVVDSEFSCQlSc3YxOjE7CisJVUNIQVIJCU1heFNQTGVuZ3RoOjI7CisJVUNIQVIJCVJzdjI6MTsKKyNlbmRpZiAvKiAhUlRfQklHX0VORElBTiAqLworfSBRQlNTX1NUQV9JTkZPX1BBUk0sICpQUUJTU19TVEFfSU5GT19QQVJNOworCisvLyBRQlNTIEluZm8gZmllbGQgaW4gUUFQJ3MgQmVhY29uL1Byb2JlUnNwCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgeworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwlVQ0hBUgkJVUFQU0Q6MTsKKwlVQ0hBUgkJUnN2OjM7CisgICAgVUNIQVIJCVBhcmFtU2V0Q291bnQ6NDsKKyNlbHNlCisgICAgVUNIQVIJCVBhcmFtU2V0Q291bnQ6NDsKKwlVQ0hBUgkJUnN2OjM7CisJVUNIQVIJCVVBUFNEOjE7CisjZW5kaWYgLyogIVJUX0JJR19FTkRJQU4gKi8KK30gUUJTU19BUF9JTkZPX1BBUk0sICpQUUJTU19BUF9JTkZPX1BBUk07CisKKy8vIFFPUyBDYXBhYmlsaXR5IHJlcG9ydGVkIGluIFFBUCdzIEJFQUNPTi9Qcm9iZVJzcAorLy8gUU9TIENhcGFiaWxpdHkgc2VudCBvdXQgaW4gUVNUQSdzIEFzc29jaWF0ZVJlcS9SZUFzc29jaWF0ZVJlcQordHlwZWRlZiBzdHJ1Y3QgeworICAgIEJPT0xFQU4gICAgIGJWYWxpZDsgICAgICAgICAgICAgICAgICAgICAvLyAxOiB2YXJpYWJsZSBjb250YWlucyB2YWxpZCB2YWx1ZQorICAgIEJPT0xFQU4gICAgIGJRQWNrOworICAgIEJPT0xFQU4gICAgIGJRdWV1ZVJlcXVlc3Q7CisgICAgQk9PTEVBTiAgICAgYlR4b3BSZXF1ZXN0OworLy8gIEJPT0xFQU4gICAgIGJNb3JlRGF0YUFjazsKKyAgICBVQ0hBUiAgICAgICBFZGNhVXBkYXRlQ291bnQ7Cit9IFFPU19DQVBBQklMSVRZX1BBUk0sICpQUU9TX0NBUEFCSUxJVFlfUEFSTTsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAordHlwZWRlZiBzdHJ1Y3QgeworICAgIFVDSEFSICAgICAgIElFTGVuOworICAgIFVDSEFSICAgICAgIElFW01BWF9DVVNUT01fTEVOXTsKK30gV1BBX0lFXzsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgVUNIQVIgICBCc3NpZFtNQUNfQUREUl9MRU5dOworICAgIFVDSEFSICAgQ2hhbm5lbDsKKwlVQ0hBUiAgIENlbnRyYWxDaGFubmVsOwkvL1N0b3JlIHRoZSB3aWRlLWJhbmQgY2VudHJhbCBjaGFubmVsIGZvciA0ME1Iei4gIC51c2VkIGluIDQwTUh6IEFQLiBPciB0aGlzIGlzIHRoZSBzYW1lIGFzIENoYW5uZWwuCisgICAgVUNIQVIgICBCc3NUeXBlOworICAgIFVTSE9SVCAgQXRpbVdpbjsKKyAgICBVU0hPUlQgIEJlYWNvblBlcmlvZDsKKworICAgIFVDSEFSICAgU3VwUmF0ZVtNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFU107CisgICAgVUNIQVIgICBTdXBSYXRlTGVuOworICAgIFVDSEFSICAgRXh0UmF0ZVtNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFU107CisgICAgVUNIQVIgICBFeHRSYXRlTGVuOworCUhUX0NBUEFCSUxJVFlfSUUgSHRDYXBhYmlsaXR5OworCVVDSEFSCQkJSHRDYXBhYmlsaXR5TGVuOworCUFERF9IVF9JTkZPX0lFIEFkZEh0SW5mbzsJLy8gQVAgbWlnaHQgdXNlIHRoaXMgYWRkaXRpb25hbCBodCBpbmZvIElFCisJVUNIQVIJCQlBZGRIdEluZm9MZW47CisJVUNIQVIJCQlOZXdFeHRDaGFuT2Zmc2V0OworCUNIQVIgICAgUnNzaTsKKyAgICBVQ0hBUiAgIFByaXZhY3k7CQkJLy8gSW5kaWNhdGUgc2VjdXJpdHkgZnVuY3Rpb24gT04vT0ZGLiBEb24ndCBtZXNzIHVwIHdpdGggYXV0aCBtb2RlLgorCVVDSEFSCUhpZGRlbjsKKworICAgIFVTSE9SVCAgRHRpbVBlcmlvZDsKKyAgICBVU0hPUlQgIENhcGFiaWxpdHlJbmZvOworCisgICAgVVNIT1JUICBDZnBDb3VudDsKKyAgICBVU0hPUlQgIENmcFBlcmlvZDsKKyAgICBVU0hPUlQgIENmcE1heER1cmF0aW9uOworICAgIFVTSE9SVCAgQ2ZwRHVyUmVtYWluaW5nOworICAgIFVDSEFSICAgU3NpZExlbjsKKyAgICBDSEFSICAgIFNzaWRbTUFYX0xFTl9PRl9TU0lEXTsKKworICAgIFVMT05HICAgTGFzdEJlYWNvblJ4VGltZTsgLy8gT1MncyB0aW1lc3RhbXAKKworCUJPT0xFQU4JYlNFUzsKKworCS8vIE5ldyBmb3IgV1BBMgorCUNJUEhFUl9TVUlURQkJCQkJV1BBOwkJCS8vIEFQIGFubm91bmNlZCBXUEEgY2lwaGVyIHN1aXRlCisJQ0lQSEVSX1NVSVRFCQkJCQlXUEEyOwkJCS8vIEFQIGFubm91bmNlZCBXUEEyIGNpcGhlciBzdWl0ZQorCisJLy8gTmV3IGZvciBtaWNyb3NvZnQgV1BBIHN1cHBvcnQKKwlORElTXzgwMl8xMV9GSVhFRF9JRXMJRml4SUVzOworCU5ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREUJQXV0aE1vZGVBdXg7CS8vIEFkZGl0aW9uIG1vZGUgZm9yIFdQQTIgLyBXUEEgY2FwYWJsZSBBUAorCU5ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREUJQXV0aE1vZGU7CisJTkRJU184MDJfMTFfV0VQX1NUQVRVUwlXZXBTdGF0dXM7CQkJCS8vIFVuaWNhc3QgRW5jcnlwdGlvbiBBbGdvcml0aG0gZXh0cmFjdCBmcm9tIFZBUl9JRQorCVVTSE9SVAkJCQkJVmFySUVMZW47CQkJCS8vIExlbmd0aCBvZiBuZXh0IFZJRSBpbmNsdWRlIEVJRCAmIExlbmd0aAorCVVDSEFSCQkJCQlWYXJJRXNbTUFYX1ZJRV9MRU5dOworCisJLy8gQ0NYIENraXAgaW5mb3JtYXRpb24KKyAgICBVQ0hBUiAgIENraXBGbGFnOworCisJLy8gQ0NYIDIgVFNGCisJVUNIQVIJUFRTRls0XTsJCS8vIFBhcmVudCBUU0YKKwlVQ0hBUglUVFNGWzhdOwkJLy8gVGFyZ2V0IFRTRgorCisgICAgLy8gODAyLjExZSBkOSwgYW5kIFdNTQorCUVEQ0FfUEFSTSAgICAgICAgICAgRWRjYVBhcm07CisJUU9TX0NBUEFCSUxJVFlfUEFSTSBRb3NDYXBhYmlsaXR5OworCVFCU1NfTE9BRF9QQVJNICAgICAgUWJzc0xvYWQ7CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisgICAgV1BBX0lFXyAgICAgV3BhSUU7CisgICAgV1BBX0lFXyAgICAgUnNuSUU7CisjaWZkZWYgRVhUX0JVSUxEX0NIQU5ORUxfTElTVAorCVVDSEFSCQlDb3VudHJ5U3RyaW5nWzNdOworCUJPT0xFQU4JCWJIYXNDb3VudHJ5SUU7CisjZW5kaWYgLy8gRVhUX0JVSUxEX0NIQU5ORUxfTElTVCAvLworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworfSBCU1NfRU5UUlksICpQQlNTX0VOVFJZOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgVUNIQVIgICAgICAgICAgIEJzc05yOworICAgIFVDSEFSICAgICAgICAgICBCc3NPdmVybGFwTnI7CisgICAgQlNTX0VOVFJZICAgICAgIEJzc0VudHJ5W01BWF9MRU5fT0ZfQlNTX1RBQkxFXTsKK30gQlNTX1RBQkxFLCAqUEJTU19UQUJMRTsKKworCit0eXBlZGVmIHN0cnVjdCBfTUxNRV9RVUVVRV9FTEVNIHsKKyAgICBVTE9ORyAgICAgICAgICAgICBNYWNoaW5lOworICAgIFVMT05HICAgICAgICAgICAgIE1zZ1R5cGU7CisgICAgVUxPTkcgICAgICAgICAgICAgTXNnTGVuOworICAgIFVDSEFSICAgICAgICAgICAgIE1zZ1tNR01UX0RNQV9CVUZGRVJfU0laRV07CisgICAgTEFSR0VfSU5URUdFUiAgICAgVGltZVN0YW1wOworICAgIFVDSEFSICAgICAgICAgICAgIFJzc2kwOworICAgIFVDSEFSICAgICAgICAgICAgIFJzc2kxOworICAgIFVDSEFSICAgICAgICAgICAgIFJzc2kyOworICAgIFVDSEFSICAgICAgICAgICAgIFNpZ25hbDsKKyAgICBVQ0hBUiAgICAgICAgICAgICBDaGFubmVsOworICAgIFVDSEFSICAgICAgICAgICAgIFdjaWQ7CisgICAgQk9PTEVBTiAgICAgICAgICAgT2NjdXBpZWQ7Cit9IE1MTUVfUVVFVUVfRUxFTSwgKlBNTE1FX1FVRVVFX0VMRU07CisKK3R5cGVkZWYgc3RydWN0IF9NTE1FX1FVRVVFIHsKKyAgICBVTE9ORyAgICAgICAgICAgICBOdW07CisgICAgVUxPTkcgICAgICAgICAgICAgSGVhZDsKKyAgICBVTE9ORyAgICAgICAgICAgICBUYWlsOworICAgIE5ESVNfU1BJTl9MT0NLICAgTG9jazsKKyAgICBNTE1FX1FVRVVFX0VMRU0gIEVudHJ5W01BWF9MRU5fT0ZfTUxNRV9RVUVVRV07Cit9IE1MTUVfUVVFVUUsICpQTUxNRV9RVUVVRTsKKwordHlwZWRlZiBWT0lEICgqU1RBVEVfTUFDSElORV9GVU5DKShWT0lEICpBZGFwdG9yLCBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCit0eXBlZGVmIHN0cnVjdCBfU1RBVEVfTUFDSElORSB7CisgICAgVUxPTkcgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNlOworICAgIFVMT05HICAgICAgICAgICAgICAgICAgICAgICAgICAgTnJTdGF0ZTsKKyAgICBVTE9ORyAgICAgICAgICAgICAgICAgICAgICAgICAgIE5yTXNnOworICAgIFVMT05HICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3VyclN0YXRlOworICAgIFNUQVRFX01BQ0hJTkVfRlVOQyAgICAgICAgICAgICAqVHJhbnNGdW5jOworfSBTVEFURV9NQUNISU5FLCAqUFNUQVRFX01BQ0hJTkU7CisKKworLy8gTUxNRSBBVVggZGF0YSBzdHJ1Y3R1cmUgdGhhdCBob2xkIHRlbXBvcmFybGl5IHNldHRpbmdzIGR1cmluZyBhIGNvbm5lY3Rpb24gYXR0ZW1wdC4KKy8vIE9uY2UgdGhpcyBhdHRlbXAgc3VjY2VlZHMsIGFsbCBzZXR0aW5ncyB3aWxsIGJlIGNvcHkgdG8gcEFkLT5TdGFBY3RpdmUuCisvLyBBIGNvbm5lY3Rpb24gYXR0ZW1wdCAodXNlciBzZXQgT0lELCByb2FtaW5nLCBDQ1ggZmFzdCByb2FtaW5nLC4uKSBjb25zaXN0cyBvZgorLy8gc2V2ZXJhbCBzdGVwcyAoSk9JTiwgQVVUSCwgQVNTT0Mgb3IgUkVBU1NPQykgYW5kIG1heSBmYWlsIGF0IGFueSBzdGVwLiBXZSBwdXJwb3NlbHkKKy8vIHNlcGFyYXRlIHRoaXMgdW5kZXItdHJpYWwgc2V0dGluZ3MgYXdheSBmcm9tIHBBZC0+U3RhQWN0aXZlIHNvIHRoYXQgb25jZQorLy8gdGhpcyBuZXcgYXR0ZW1wdCBmYWlsZWQsIGRyaXZlciBjYW4gYXV0by1yZWNvdmVyIGJhY2sgdG8gdGhlIGFjdGl2ZSBzZXR0aW5ncy4KK3R5cGVkZWYgc3RydWN0IF9NTE1FX0FVWCB7CisgICAgVUNIQVIgICAgICAgICAgICAgICBCc3NUeXBlOworICAgIFVDSEFSICAgICAgICAgICAgICAgU3NpZFtNQVhfTEVOX09GX1NTSURdOworICAgIFVDSEFSICAgICAgICAgICAgICAgU3NpZExlbjsKKyAgICBVQ0hBUiAgICAgICAgICAgICAgIEJzc2lkW01BQ19BRERSX0xFTl07CisJVUNIQVIJCQkJQXV0b1JlY29ubmVjdFNzaWRbTUFYX0xFTl9PRl9TU0lEXTsKKwlVQ0hBUgkJCQlBdXRvUmVjb25uZWN0U3NpZExlbjsKKyAgICBVU0hPUlQgICAgICAgICAgICAgIEFsZzsKKyAgICBVQ0hBUiAgICAgICAgICAgICAgIFNjYW5UeXBlOworICAgIFVDSEFSICAgICAgICAgICAgICAgQ2hhbm5lbDsKKwlVQ0hBUiAgICAgICAgICAgICAgIENlbnRyYWxDaGFubmVsOworICAgIFVTSE9SVCAgICAgICAgICAgICAgQWlkOworICAgIFVTSE9SVCAgICAgICAgICAgICAgQ2FwYWJpbGl0eUluZm87CisgICAgVVNIT1JUICAgICAgICAgICAgICBCZWFjb25QZXJpb2Q7CisgICAgVVNIT1JUICAgICAgICAgICAgICBDZnBNYXhEdXJhdGlvbjsKKyAgICBVU0hPUlQgICAgICAgICAgICAgIENmcFBlcmlvZDsKKyAgICBVU0hPUlQgICAgICAgICAgICAgIEF0aW1XaW47CisKKwkvLyBDb3B5IHN1cHBvcnRlZCByYXRlIGZyb20gZGVzaXJlZCBBUCdzIGJlYWNvbi4gV2UgYXJlIHRyeWluZyB0byBtYXRjaAorCS8vIEFQJ3Mgc3VwcG9ydGVkIGFuZCBleHRlbmRlZCByYXRlIHNldHRpbmdzLgorCVVDSEFSCQkgICAgICAgIFN1cFJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdOworCVVDSEFSCQkgICAgICAgIEV4dFJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdOworCVVDSEFSCQkgICAgICAgIFN1cFJhdGVMZW47CisJVUNIQVIJCSAgICAgICAgRXh0UmF0ZUxlbjsKKwlIVF9DQVBBQklMSVRZX0lFCQlIdENhcGFiaWxpdHk7CisJVUNIQVIJCSAgICAgICAgCUh0Q2FwYWJpbGl0eUxlbjsKKwlBRERfSFRfSU5GT19JRQkJQWRkSHRJbmZvOwkvLyBBUCBtaWdodCB1c2UgdGhpcyBhZGRpdGlvbmFsIGh0IGluZm8gSUUKKwlVQ0hBUgkJCU5ld0V4dENoYW5uZWxPZmZzZXQ7CisJLy9SVF9IVF9DQVBBQklMSVRZCVN1cHBvcnRlZEh0UGh5OworCisgICAgLy8gbmV3IGZvciBRT1MKKyAgICBRT1NfQ0FQQUJJTElUWV9QQVJNIEFQUW9zQ2FwYWJpbGl0eTsgICAgLy8gUU9TIGNhcGFiaWxpdHkgb2YgdGhlIGN1cnJlbnQgYXNzb2NpYXRlZCBBUAorICAgIEVEQ0FfUEFSTSAgICAgICAgICAgQVBFZGNhUGFybTsgICAgICAgICAvLyBFRENBIHBhcmFtZXRlcnMgb2YgdGhlIGN1cnJlbnQgYXNzb2NpYXRlZCBBUAorICAgIFFCU1NfTE9BRF9QQVJNICAgICAgQVBRYnNzTG9hZDsgICAgICAgICAvLyBRQlNTIGxvYWQgb2YgdGhlIGN1cnJlbnQgYXNzb2NpYXRlZCBBUAorCisgICAgLy8gbmV3IHRvIGtlZXAgUmFsaW5rIHNwZWNpZmljIGZlYXR1cmUKKyAgICBVTE9ORyAgICAgICAgICAgICAgIEFQUmFsaW5rSWU7CisKKyAgICBCU1NfVEFCTEUgICAgICAgICAgIFNzaWRCc3NUYWI7ICAgICAvLyBBUCBsaXN0IGZvciB0aGUgc2FtZSBTU0lECisgICAgQlNTX1RBQkxFICAgICAgICAgICBSb2FtVGFiOyAgICAgICAgLy8gQVAgbGlzdCBlbGlnaWJsZSBmb3Igcm9hbWluZworICAgIFVMT05HICAgICAgICAgICAgICAgQnNzSWR4OworICAgIFVMT05HICAgICAgICAgICAgICAgUm9hbUlkeDsKKworCUJPT0xFQU4JCQkJQ3VyclJlcUlzRnJvbU5kaXM7CisKKyAgICBSQUxJTktfVElNRVJfU1RSVUNUIEJlYWNvblRpbWVyLCBTY2FuVGltZXI7CisgICAgUkFMSU5LX1RJTUVSX1NUUlVDVCBBdXRoVGltZXI7CisgICAgUkFMSU5LX1RJTUVSX1NUUlVDVCBBc3NvY1RpbWVyLCBSZWFzc29jVGltZXIsIERpc2Fzc29jVGltZXI7Cit9IE1MTUVfQVVYLCAqUE1MTUVfQVVYOworCit0eXBlZGVmIHN0cnVjdCBfTUxNRV9BRERCQV9SRVFfU1RSVUNUeworCVVDSEFSICAgV2NpZDsJLy8KKwlVQ0hBUiAgIHBBZGRyW01BQ19BRERSX0xFTl07CisJVUNIQVIgICBCYUJ1ZlNpemU7CisJVVNIT1JUCVRpbWVPdXRWYWx1ZTsKKwlVQ0hBUiAgIFRJRDsKKwlVQ0hBUiAgIFRva2VuOworCVVTSE9SVAlCYVN0YXJ0U2VxOworfSBNTE1FX0FEREJBX1JFUV9TVFJVQ1QsICpQTUxNRV9BRERCQV9SRVFfU1RSVUNUOworCisKK3R5cGVkZWYgc3RydWN0IF9NTE1FX0RFTEJBX1JFUV9TVFJVQ1R7CisJVUNIQVIgICBXY2lkOwkvLworCVVDSEFSICAgICBBZGRyW01BQ19BRERSX0xFTl07CisJVUNIQVIgICBUSUQ7CisJVUNIQVIJSW5pdGlhdG9yOworfSBNTE1FX0RFTEJBX1JFUV9TVFJVQ1QsICpQTUxNRV9ERUxCQV9SRVFfU1RSVUNUOworCisvLyBhc3NvYyBzdHJ1Y3QgaXMgZXF1YWwgdG8gcmVhc3NvYwordHlwZWRlZiBzdHJ1Y3QgX01MTUVfQVNTT0NfUkVRX1NUUlVDVHsKKyAgICBVQ0hBUiAgICAgQWRkcltNQUNfQUREUl9MRU5dOworICAgIFVTSE9SVCAgICBDYXBhYmlsaXR5SW5mbzsKKyAgICBVU0hPUlQgICAgTGlzdGVuSW50djsKKyAgICBVTE9ORyAgICAgVGltZW91dDsKK30gTUxNRV9BU1NPQ19SRVFfU1RSVUNULCAqUE1MTUVfQVNTT0NfUkVRX1NUUlVDVCwgTUxNRV9SRUFTU09DX1JFUV9TVFJVQ1QsICpQTUxNRV9SRUFTU09DX1JFUV9TVFJVQ1Q7CisKK3R5cGVkZWYgc3RydWN0IF9NTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1R7CisgICAgVUNIQVIgICAgIEFkZHJbTUFDX0FERFJfTEVOXTsKKyAgICBVU0hPUlQgICAgUmVhc29uOworfSBNTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1QsICpQTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNUOworCit0eXBlZGVmIHN0cnVjdCBfTUxNRV9BVVRIX1JFUV9TVFJVQ1QgeworICAgIFVDSEFSICAgICAgICBBZGRyW01BQ19BRERSX0xFTl07CisgICAgVVNIT1JUICAgICAgIEFsZzsKKyAgICBVTE9ORyAgICAgICAgVGltZW91dDsKK30gTUxNRV9BVVRIX1JFUV9TVFJVQ1QsICpQTUxNRV9BVVRIX1JFUV9TVFJVQ1Q7CisKK3R5cGVkZWYgc3RydWN0IF9NTE1FX0RFQVVUSF9SRVFfU1RSVUNUIHsKKyAgICBVQ0hBUiAgICAgICAgQWRkcltNQUNfQUREUl9MRU5dOworICAgIFVTSE9SVCAgICAgICBSZWFzb247Cit9IE1MTUVfREVBVVRIX1JFUV9TVFJVQ1QsICpQTUxNRV9ERUFVVEhfUkVRX1NUUlVDVDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFVMT05HICAgICAgQnNzSWR4OworfSBNTE1FX0pPSU5fUkVRX1NUUlVDVDsKKwordHlwZWRlZiBzdHJ1Y3QgX01MTUVfU0NBTl9SRVFfU1RSVUNUIHsKKyAgICBVQ0hBUiAgICAgIEJzc2lkW01BQ19BRERSX0xFTl07CisgICAgVUNIQVIgICAgICBCc3NUeXBlOworICAgIFVDSEFSICAgICAgU2NhblR5cGU7CisgICAgVUNIQVIgICAgICBTc2lkTGVuOworICAgIENIQVIgICAgICAgU3NpZFtNQVhfTEVOX09GX1NTSURdOworfSBNTE1FX1NDQU5fUkVRX1NUUlVDVCwgKlBNTE1FX1NDQU5fUkVRX1NUUlVDVDsKKwordHlwZWRlZiBzdHJ1Y3QgX01MTUVfU1RBUlRfUkVRX1NUUlVDVCB7CisgICAgQ0hBUiAgICAgICAgU3NpZFtNQVhfTEVOX09GX1NTSURdOworICAgIFVDSEFSICAgICAgIFNzaWRMZW47Cit9IE1MTUVfU1RBUlRfUkVRX1NUUlVDVCwgKlBNTE1FX1NUQVJUX1JFUV9TVFJVQ1Q7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKy8vIHN0cnVjdHVyZSBmb3IgRExTCit0eXBlZGVmIHN0cnVjdCBfUlRfODAyXzExX0RMUyB7CisJVVNIT1JUCQkJCQkJVGltZU91dDsJCS8vIFVzZSB0byB0aW1lIG91dCB3aGlsZSBzbGllbmNlLCB1bml0OiBzZWNvbmQgLCBzZXQgYnkgVUkKKwlVU0hPUlQJCQkJCQlDb3VudERvd25UaW1lcjsJLy8gVXNlIHRvIHRpbWUgb3V0IHdoaWxlIHNsaWVuY2UsdW5pdDogc2Vjb25kICwgdXNlZCBieSBkcml2ZXIgb25seQorCU5ESVNfODAyXzExX01BQ19BRERSRVNTCQlNYWNBZGRyOwkJLy8gc2V0IGJ5IFVJCisJVUNIQVIJCQkJCQlTdGF0dXM7CQkJLy8gMDogbm9uZSAsIDE6IHdhaXQgU1RBa2V5LCAyOiBmaW5pc2ggRExTIHNldHVwICwgc2V0IGJ5IGRyaXZlciBvbmx5CisJQk9PTEVBTgkJCQkJCVZhbGlkOwkJCS8vIDE6IHZhbGlkICwgMDogaW52YWxpZCAsIHNldCBieSBVSSwgdXNlIHRvIHNldHVwIG9yIHRlYXIgZG93biBETFMgbGluaworCVJBTElOS19USU1FUl9TVFJVQ1QJCQlUaW1lcjsJCQkvLyBVc2UgdG8gdGltZSBvdXQgd2hpbGUgaGFuZHNoYWtlCisJVVNIT1JUCQkJCQkJU2VxdWVuY2U7CisJVVNIT1JUCQkJCQkJTWFjVGFiTWF0Y2hXQ0lEOwkvLyBBU0lDCisJQk9PTEVBTgkJCQkJCWJIVENhcDsKKwlQVk9JRAkJCQkJCXBBZDsKK30gUlRfODAyXzExX0RMUywgKlBSVF84MDJfMTFfRExTOworCit0eXBlZGVmIHN0cnVjdCBfTUxNRV9ETFNfUkVRX1NUUlVDVCB7CisgICAgUFJUXzgwMl8xMV9ETFMJcERMUzsKKyAgICBVU0hPUlQJCQlSZWFzb247Cit9IE1MTUVfRExTX1JFUV9TVFJVQ1QsICpQTUxNRV9ETFNfUkVRX1NUUlVDVDsKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIHsKKyAgICBVQ0hBUiAgIEVpZDsKKyAgICBVQ0hBUiAgIExlbjsKKyAgICBDSEFSICAgT2N0ZXRbMV07Cit9IEVJRF9TVFJVQ1QsKlBFSURfU1RSVUNULCBCRUFDT05fRUlEX1NUUlVDVCwgKlBCRUFDT05fRUlEX1NUUlVDVDsKKwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9SVE1QX1RYX1JBVEVfU1dJVENICit7CisJVUNIQVIgICBJdGVtTm87CisjaWZkZWYgUlRfQklHX0VORElBTgorCVVDSEFSCVJzdjI6MjsKKwlVQ0hBUglNb2RlOjI7CisJVUNIQVIJUnN2MToxOworCVVDSEFSCUJXOjE7CisJVUNIQVIJU2hvcnRHSToxOworCVVDSEFSCVNUQkM6MTsKKyNlbHNlCisJVUNIQVIJU1RCQzoxOworCVVDSEFSCVNob3J0R0k6MTsKKwlVQ0hBUglCVzoxOworCVVDSEFSCVJzdjE6MTsKKwlVQ0hBUglNb2RlOjI7CisJVUNIQVIJUnN2MjoyOworI2VuZGlmCisJVUNIQVIgICBDdXJyTUNTOworCVVDSEFSICAgVHJhaW5VcDsKKwlVQ0hBUiAgIFRyYWluRG93bjsKK30gUlJUTVBfVFhfUkFURV9TV0lUQ0gsICpQUlRNUF9UWF9SQVRFX1NXSVRDSDsKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT0gQVAgbWxtZS5oID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyNkZWZpbmUgVEJUVF9QUkVMT0FEX1RJTUUgICAgICAgMzg0ICAgICAgICAvLyB1c2VjLiBMb21nUHJlYW1ibGUgKyAyNC1ieXRlIGF0IDFNYnBzCisjZGVmaW5lIERFRkFVTFRfRFRJTV9QRVJJT0QgICAgIDEKKworLy8gd2VpZ2h0aW5nIGZhY3RvciB0byBjYWxjdWxhdGUgQ2hhbm5lbCBxdWFsaXR5LCB0b3RhbCBzaG91bGQgYmUgMTAwJQorLy8jZGVmaW5lIFJTU0lfV0VJR0hUSU5HICAgICAgICAgICAgICAgICAgIDAKKy8vI2RlZmluZSBUWF9XRUlHSFRJTkcgICAgICAgICAgICAgICAgICAgICA0MAorLy8jZGVmaW5lIFJYX1dFSUdIVElORyAgICAgICAgICAgICAgICAgICAgIDYwCisKKyNkZWZpbmUgTUFDX1RBQkxFX0FHRU9VVF9USU1FCQkJMzAwCQkJLy8gdW5pdDogc2VjCisjZGVmaW5lIE1BQ19UQUJMRV9BU1NPQ19USU1FT1VUCQkJNQkJCS8vIHVuaXQ6IHNlYworI2RlZmluZSBNQUNfVEFCTEVfRlVMTChUYWIpCQkJCSgoVGFiKS5zaXplID09IE1BWF9MRU5fT0ZfTUFDX1RBQkxFKQorCisvLyBBUCBzaGFsbCBkcm9wIHRoZSBzdGEgaWYgY29udGluZSBUeCBmYWlsIGNvdW50IHJlYWNoIGl0LgorI2RlZmluZSBNQUNfRU5UUllfTElGRV9DSEVDS19DTlQJCTIwCQkJLy8gcGFja2V0IGNudC4KKworLy8gVmFsdWUgZG9tYWluIG9mIHBNYWNFbnRyeS0+U3N0Cit0eXBlZGVmIGVudW0gX1NzdCB7CisgICAgU1NUX05PVF9BVVRILCAgIC8vIDA6IGVxdWl2YWxlbnQgdG8gSUVFRSA4MDIuMTEvMTk5OSBzdGF0ZSAxCisgICAgU1NUX0FVVEgsICAgICAgIC8vIDE6IGVxdWl2YWxlbnQgdG8gSUVFRSA4MDIuMTEvMTk5OSBzdGF0ZSAyCisgICAgU1NUX0FTU09DICAgICAgIC8vIDI6IGVxdWl2YWxlbnQgdG8gSUVFRSA4MDIuMTEvMTk5OSBzdGF0ZSAzCit9IFNTVDsKKworLy8gdmFsdWUgZG9tYWluIG9mIHBNYWNFbnRyeS0+QXV0aFN0YXRlCit0eXBlZGVmIGVudW0gX0F1dGhTdGF0ZSB7CisgICAgQVNfTk9UX0FVVEgsCisgICAgQVNfQVVUSF9PUEVOLCAgICAgICAvLyBTVEEgaGFzIGJlZW4gYXV0aGVudGljYXRlZCB1c2luZyBPUEVOIFNZU1RFTQorICAgIEFTX0FVVEhfS0VZLCAgICAgICAgLy8gU1RBIGhhcyBiZWVuIGF1dGhlbnRpY2F0ZWQgdXNpbmcgU0hBUkVEIEtFWQorICAgIEFTX0FVVEhFTlRJQ0FUSU5HICAgLy8gU1RBIGlzIHdhaXRpbmcgZm9yIEFVVEggc2VxIzMgdXNpbmcgU0hBUkVEIEtFWQorfSBBVVRIX1NUQVRFOworCisvL2Zvci13cGEgdmFsdWUgZG9tYWluIG9mIHBNYWNFbnRyeS0+V3BhU3RhdGUgIDgwMi4xaSBEMyAgIHAuMTE0Cit0eXBlZGVmIGVudW0gX0FwV3BhU3RhdGUgeworICAgIEFTX05PVFVTRSwgICAgICAgICAgICAgIC8vIDAKKyAgICBBU19ESVNDT05ORUNULCAgICAgICAgICAvLyAxCisgICAgQVNfRElTQ09OTkVDVEVELCAgICAgICAgLy8gMgorICAgIEFTX0lOSVRJQUxJWkUsICAgICAgICAgIC8vIDMKKyAgICBBU19BVVRIRU5USUNBVElPTiwgICAgICAvLyA0CisgICAgQVNfQVVUSEVOVElDQVRJT04yLCAgICAgLy8gNQorICAgIEFTX0lOSVRQTUssICAgICAgICAgICAgIC8vIDYKKyAgICBBU19JTklUUFNLLCAgICAgICAgICAgICAvLyA3CisgICAgQVNfUFRLU1RBUlQsICAgICAgICAgICAgLy8gOAorICAgIEFTX1BUS0lOSVRfTkVHT1RJQVRJTkcsIC8vIDkKKyAgICBBU19QVEtJTklURE9ORSwgICAgICAgICAvLyAxMAorICAgIEFTX1VQREFURUtFWVMsICAgICAgICAgIC8vIDExCisgICAgQVNfSU5URUdSSVRZX0ZBSUxVUkUsICAgLy8gMTIKKyAgICBBU19LRVlVUERBVEUsICAgICAgICAgICAvLyAxMworfSBBUF9XUEFfU1RBVEU7CisKKy8vIGZvci13cGEgdmFsdWUgZG9tYWluIG9mIHBNYWNFbnRyeS0+V3BhU3RhdGUgIDgwMi4xaSBEMyAgIHAuMTE0Cit0eXBlZGVmIGVudW0gX0dUS1N0YXRlIHsKKyAgICBSRUtFWV9ORUdPVElBVElORywKKyAgICBSRUtFWV9FU1RBQkxJU0hFRCwKKyAgICBLRVlFUlJPUiwKK30gR1RLX1NUQVRFOworCisvLyAgZm9yLXdwYSAgdmFsdWUgZG9tYWluIG9mIHBNYWNFbnRyeS0+V3BhU3RhdGUgIDgwMi4xaSBEMyAgIHAuMTE0Cit0eXBlZGVmIGVudW0gX1dwYUdUS1N0YXRlIHsKKyAgICBTRVRLRVlTLAorICAgIFNFVEtFWVNfRE9ORSwKK30gV1BBX0dUS19TVEFURTsKKy8vID09PT09PT09PT09PT09PT09PT09PT0gZW5kIG9mIEFQIG1sbWUuaCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKworI2VuZGlmCS8vIE1MTUVfSF9fCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL25ldGlmX2Jsb2NrLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL25ldGlmX2Jsb2NrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmU1MTUxYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvbmV0aWZfYmxvY2suaApAQCAtMCwwICsxLDU4IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisjaWZuZGVmIF9fTkVUX0lGX0JMT0NLX0hfXworI2RlZmluZSBfX05FVF9JRl9CTE9DS19IX18KKworLy8jaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSAibGlua19saXN0LmgiCisjaW5jbHVkZSAicnRtcC5oIgorCisjZGVmaW5lIEZSRUVfTkVUSUZfUE9PTF9TSVpFIDMyCisKK3R5cGVkZWYgc3RydWN0IF9ORVRJRl9FTlRSWQoreworCXN0cnVjdCBfTkVUSUZfRU5UUlkgKnBOZXh0OworCVBORVRfREVWIHBOZXREZXY7Cit9IE5FVElGX0VOVFJZLCAqUE5FVElGX0VOVFJZOworCit2b2lkIGluaXRibG9ja1F1ZXVlVGFiKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKworQk9PTEVBTiBibG9ja05ldElmKAorCUlOIFBCTE9DS19RVUVVRV9FTlRSWSBwQmxvY2tRdWV1ZUVudHJ5LAorCUlOIFBORVRfREVWIHBOZXREZXYpOworCitWT0lEIHJlbGVhc2VOZXRJZigKKwlJTiBQQkxPQ0tfUVVFVUVfRU5UUlkgcEJsb2NrUXVldWVFbnRyeSk7CisKK1ZPSUQgU3RvcE5ldElmUXVldWUoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVUNIQVIgUXVlSWR4LAorCUlOIFBORElTX1BBQ0tFVCBwUGFja2V0KTsKKyNlbmRpZiAvLyBfX05FVF9JRl9CTE9DS19IX18KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9vaWQuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvb2lkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDc4OGRiNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvb2lkLmgKQEAgLTAsMCArMSwxMDkxIEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCU1vZHVsZSBOYW1lOgorCW9pZC5oCisKKwlBYnN0cmFjdDoKKworCVJldmlzaW9uIEhpc3Rvcnk6CisJV2hvCQkJV2hlbgkJCVdoYXQKKwktLS0tLS0tLQktLS0tLS0tLS0tCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJTmFtZQkJRGF0ZQkJCU1vZGlmaWNhdGlvbiBsb2dzCisqLworI2lmbmRlZiBfT0lEX0hfCisjZGVmaW5lIF9PSURfSF8KKworI2RlZmluZSBUUlVFCQkJCTEKKyNkZWZpbmUgRkFMU0UJCQkJMAorLy8KKy8vIElFRUUgODAyLjExIFN0cnVjdHVyZXMgYW5kIGRlZmluaXRpb25zCisvLworI2RlZmluZSBNQVhfVFhfUE9XRVJfTEVWRUwgICAgICAgICAgICAgIDEwMCAgIC8qIG1XICovCisjZGVmaW5lIE1BWF9SU1NJX1RSSUdHRVIgICAgICAgICAgICAgICAgLTEwICAgIC8qIGRCbSAqLworI2RlZmluZSBNSU5fUlNTSV9UUklHR0VSICAgICAgICAgICAgICAgIC0yMDAgICAvKiBkQm0gKi8KKyNkZWZpbmUgTUFYX0ZSQUdfVEhSRVNIT0xEICAgICAgICAgICAgICAyMzQ2ICAvKiBieXRlIGNvdW50ICovCisjZGVmaW5lIE1JTl9GUkFHX1RIUkVTSE9MRCAgICAgICAgICAgICAgMjU2ICAgLyogYnl0ZSBjb3VudCAqLworI2RlZmluZSBNQVhfUlRTX1RIUkVTSE9MRCAgICAgICAgICAgICAgIDIzNDcgIC8qIGJ5dGUgY291bnQgKi8KKworLy8gbmV3IHR5cGVzIGZvciBNZWRpYSBTcGVjaWZpYyBJbmRpY2F0aW9ucworLy8gRXh0ZW5zaW9uIGNoYW5uZWwgb2Zmc2V0CisjZGVmaW5lIEVYVENIQV9OT05FCQkJMAorI2RlZmluZSBFWFRDSEFfQUJPVkUJCTB4MQorI2RlZmluZSBFWFRDSEFfQkVMT1cJCTB4MworCisvLyBCVworI2RlZmluZSBCQU5EX1dJRFRIXzIwCQkwCisjZGVmaW5lIEJBTkRfV0lEVEhfNDAJCTEKKyNkZWZpbmUgQkFORF9XSURUSF9CT1RICQkyCisjZGVmaW5lIEJBTkRfV0lEVEhfMTAJCTMJLy8gODAyLjExaiBoYXMgMTBNSHouIFRoaXMgZGVmaW5pdGlvbiBpcyBmb3IgaW50ZXJuYWwgdXNhZ2UuIGRvZXNuJ3QgZmlsbCBpbiB0aGUgSUUgb3Igb3RoZXIgZmllbGQuCisvLyBTSE9SVEdJCisjZGVmaW5lIEdBUF9JTlRFUlZBTF80MDAJMQkvLyBvbmx5IHN1cHBvcnQgaW4gSFQgbW9kZQorI2RlZmluZSBHQVBfSU5URVJWQUxfODAwCTAKKyNkZWZpbmUgR0FQX0lOVEVSVkFMX0JPVEgJMgorCisjZGVmaW5lIE5kaXNNZWRpYVN0YXRlQ29ubmVjdGVkCQkJMQorI2RlZmluZSBOZGlzTWVkaWFTdGF0ZURpc2Nvbm5lY3RlZAkJMAorCisjZGVmaW5lIE5ESVNfODAyXzExX0xFTkdUSF9TU0lEICAgICAgICAgMzIKKyNkZWZpbmUgTkRJU184MDJfMTFfTEVOR1RIX1JBVEVTICAgICAgICA4CisjZGVmaW5lIE5ESVNfODAyXzExX0xFTkdUSF9SQVRFU19FWCAgICAgMTYKKyNkZWZpbmUgTUFDX0FERFJfTEVOR1RIICAgICAgICAgICAgICAgICA2CisjZGVmaW5lIE1BWF9OVU1fT0ZfQ0hTCQkJCQk0OSAvLyAxNCBjaGFubmVscyBAMi40RyArICAxMkBVTklJICsgNCBATU1BQyArIDExIEBIaXBlckxBTjIgKyA3IEBKYXBhbiArIDEgYXMgTlVMTCB0ZXJtaW5hdGlvbmMKKyNkZWZpbmUgTUFYX05VTUJFUl9PRl9FVkVOVAkJCQkxMCAgLy8gZW50cnkgIyBpbiBFVkVOVCB0YWJsZQorI2RlZmluZSBNQVhfTlVNQkVSX09GX01BQwkJCQkzMiAvLyBpZiBNQVhfTUJTU0lEX05VTSBpcyA4LCB0aGlzIHZhbHVlIGNhbid0IGJlIGxhcmdlciB0aGFuIDIxMQorI2RlZmluZSBNQVhfTlVNQkVSX09GX0FDTAkJCQk2NAorI2RlZmluZSBNQVhfTEVOR1RIX09GX1NVUFBPUlRfUkFURVMJCTEyICAgIC8vIDEsIDIsIDUuNSwgMTEsIDYsIDksIDEyLCAxOCwgMjQsIDM2LCA0OCwgNTQKKyNkZWZpbmUgTUFYX05VTUJFUl9PRl9ETFNfRU5UUlkJCQk0CisKKyNpZm5kZWYgVU5ERVJfQ0UKKy8vIE9JRCBkZWZpbml0aW9uLCBzaW5jZSBORElTIDUuMCBkaWRuJ3QgZGVmaW5lIHRoZXNlLCB3ZSBuZWVkIHRvIGRlZmluZSBmb3Igb3VyIG93bgorLy8jaWYgX1dJTjMyX1dJTk5UPD0weDA1MDAKKworI2RlZmluZSBPSURfR0VOX01BQ0hJTkVfTkFNRSAgICAgICAgICAgICAgIDB4MDAwMTAyMUEKKworI2lmZGVmIFJBTElOS19BVEUKKyNkZWZpbmUgUlRfUVVFUllfQVRFX1RYRE9ORV9DT1VOVAkJCTB4MDQwMQorI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKyNkZWZpbmUgUlRfUVVFUllfU0lHTkFMX0NPTlRFWFQJCQkJMHgwNDAyCisjZGVmaW5lIFJUX1NFVF9JQVBQX1BJRCAgICAgICAgICAgICAgICAgCTB4MDQwNAorI2RlZmluZSBSVF9TRVRfQVBEX1BJRAkJCQkJCTB4MDQwNQorI2RlZmluZSBSVF9TRVRfREVMX01BQ19FTlRSWQkJCQkweDA0MDYKKworLy8KKy8vIElFRUUgODAyLjExIE9JRHMKKy8vCisjZGVmaW5lCU9JRF9HRVRfU0VUX1RPR0dMRQkJCTB4ODAwMAorCisjZGVmaW5lCU9JRF84MDJfMTFfTkVUV09SS19UWVBFU19TVVBQT1JURUQJCQkweDAxMDMKKyNkZWZpbmUJT0lEXzgwMl8xMV9ORVRXT1JLX1RZUEVfSU5fVVNFCQkJCTB4MDEwNAorI2RlZmluZQlPSURfODAyXzExX1JTU0lfVFJJR0dFUgkJCQkJCTB4MDEwNworI2RlZmluZQlSVF9PSURfODAyXzExX1JTU0kJCQkJCQkJMHgwMTA4IC8vcnQyODYwCW9ubHkgLCBrYXRoeQorI2RlZmluZQlSVF9PSURfODAyXzExX1JTU0lfMQkJCQkJCTB4MDEwOSAvL3J0Mjg2MAlvbmx5ICwga2F0aHkKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9SU1NJXzIJCQkJCQkweDAxMEEgLy9ydDI4NjAJb25seSAsIGthdGh5CisjZGVmaW5lCU9JRF84MDJfMTFfTlVNQkVSX09GX0FOVEVOTkFTCQkJCTB4MDEwQgorI2RlZmluZQlPSURfODAyXzExX1JYX0FOVEVOTkFfU0VMRUNURUQJCQkJMHgwMTBDCisjZGVmaW5lCU9JRF84MDJfMTFfVFhfQU5URU5OQV9TRUxFQ1RFRAkJCQkweDAxMEQKKyNkZWZpbmUJT0lEXzgwMl8xMV9TVVBQT1JURURfUkFURVMJCQkJCTB4MDEwRQorI2RlZmluZQlPSURfODAyXzExX0FERF9XRVAJCQkJCQkJMHgwMTEyCisjZGVmaW5lCU9JRF84MDJfMTFfUkVNT1ZFX1dFUAkJCQkJCTB4MDExMworI2RlZmluZQlPSURfODAyXzExX0RJU0FTU09DSUFURQkJCQkJCTB4MDExNAorI2RlZmluZQlPSURfODAyXzExX1BSSVZBQ1lfRklMVEVSCQkJCQkweDAxMTgKKyNkZWZpbmUJT0lEXzgwMl8xMV9BU1NPQ0lBVElPTl9JTkZPUk1BVElPTgkJCTB4MDExRQorI2RlZmluZQlPSURfODAyXzExX1RFU1QJCQkJCQkJCTB4MDExRgorI2RlZmluZQlSVF9PSURfODAyXzExX0NPVU5UUllfUkVHSU9OCQkJCTB4MDUwNworI2RlZmluZQlPSURfODAyXzExX0JTU0lEX0xJU1RfU0NBTgkJCQkJMHgwNTA4CisjZGVmaW5lCU9JRF84MDJfMTFfU1NJRAkJCQkJCQkJMHgwNTA5CisjZGVmaW5lCU9JRF84MDJfMTFfQlNTSUQJCQkJCQkJMHgwNTBBCisjZGVmaW5lCVJUX09JRF84MDJfMTFfUkFESU8JCQkJCQkJMHgwNTBCCisjZGVmaW5lCVJUX09JRF84MDJfMTFfUEhZX01PREUJCQkJCQkweDA1MEMKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9TVEFfQ09ORklHCQkJCQkweDA1MEQKKyNkZWZpbmUJT0lEXzgwMl8xMV9ERVNJUkVEX1JBVEVTCQkJCQkweDA1MEUKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9QUkVBTUJMRQkJCQkJCTB4MDUwRgorI2RlZmluZQlPSURfODAyXzExX1dFUF9TVEFUVVMJCQkJCQkweDA1MTAKKyNkZWZpbmUJT0lEXzgwMl8xMV9BVVRIRU5USUNBVElPTl9NT0RFCQkJCTB4MDUxMQorI2RlZmluZQlPSURfODAyXzExX0lORlJBU1RSVUNUVVJFX01PREUJCQkJMHgwNTEyCisjZGVmaW5lCVJUX09JRF84MDJfMTFfUkVTRVRfQ09VTlRFUlMJCQkJMHgwNTEzCisjZGVmaW5lCU9JRF84MDJfMTFfUlRTX1RIUkVTSE9MRAkJCQkJMHgwNTE0CisjZGVmaW5lCU9JRF84MDJfMTFfRlJBR01FTlRBVElPTl9USFJFU0hPTEQJCQkweDA1MTUKKyNkZWZpbmUJT0lEXzgwMl8xMV9QT1dFUl9NT0RFCQkJCQkJMHgwNTE2CisjZGVmaW5lCU9JRF84MDJfMTFfVFhfUE9XRVJfTEVWRUwJCQkJCTB4MDUxNworI2RlZmluZQlSVF9PSURfODAyXzExX0FERF9XUEEJCQkJCQkweDA1MTgKKyNkZWZpbmUJT0lEXzgwMl8xMV9SRU1PVkVfS0VZCQkJCQkJMHgwNTE5CisjZGVmaW5lCU9JRF84MDJfMTFfQUREX0tFWQkJCQkJCQkweDA1MjAKKyNkZWZpbmUJT0lEXzgwMl8xMV9DT05GSUdVUkFUSU9OCQkJCQkweDA1MjEKKyNkZWZpbmUJT0lEXzgwMl8xMV9UWF9QQUNLRVRfQlVSU1QJCQkJCTB4MDUyMgorI2RlZmluZQlSVF9PSURfODAyXzExX1FVRVJZX05PSVNFX0xFVkVMCQkJCTB4MDUyMworI2RlZmluZQlSVF9PSURfODAyXzExX0VYVFJBX0lORk8JCQkJCTB4MDUyNAorI2lmZGVmCURCRworI2RlZmluZQlSVF9PSURfODAyXzExX0hBUkRXQVJFX1JFR0lTVEVSCQkJCTB4MDUyNQorI2VuZGlmCisjZGVmaW5lIE9JRF84MDJfMTFfRU5DUllQVElPTl9TVEFUVVMgICAgICAgICAgICBPSURfODAyXzExX1dFUF9TVEFUVVMKKyNkZWZpbmUgT0lEXzgwMl8xMV9ERUFVVEhFTlRJQ0FUSU9OICAgICAgICAgICAgICAgICAweDA1MjYKKyNkZWZpbmUgT0lEXzgwMl8xMV9EUk9QX1VORU5DUllQVEVEICAgICAgICAgICAgICAgICAweDA1MjcKKyNkZWZpbmUgT0lEXzgwMl8xMV9NSUNfRkFJTFVSRV9SRVBPUlRfRlJBTUUgICAgICAgICAweDA1MjgKKworLy8gRm9yIDgwMi4xeCBkYWVtaW4gdXNpbmcgdG8gcmVxdWlyZSBjdXJyZW50IGRyaXZlciBjb25maWd1cmF0aW9uCisjZGVmaW5lIE9JRF84MDJfMTFfUkFESVVTX1FVRVJZX1NFVFRJTkcJCQkJMHgwNTQwCisKKyNkZWZpbmUJUlRfT0lEX0RFVklDRV9OQU1FCQkJCQkJCTB4MDYwNworI2RlZmluZQlSVF9PSURfVkVSU0lPTl9JTkZPCQkJCQkJCTB4MDYwOAorI2RlZmluZQlPSURfODAyXzExX0JTU0lEX0xJU1QJCQkJCQkweDA2MDkKKyNkZWZpbmUJT0lEXzgwMl8zX0NVUlJFTlRfQUREUkVTUwkJCQkJMHgwNjBBCisjZGVmaW5lCU9JRF9HRU5fTUVESUFfQ09OTkVDVF9TVEFUVVMJCQkJMHgwNjBCCisjZGVmaW5lCVJUX09JRF84MDJfMTFfUVVFUllfTElOS19TVEFUVVMJCQkJMHgwNjBDCisjZGVmaW5lCU9JRF84MDJfMTFfUlNTSQkJCQkJCQkJMHgwNjBECisjZGVmaW5lCU9JRF84MDJfMTFfU1RBVElTVElDUwkJCQkJCTB4MDYwRQorI2RlZmluZQlPSURfR0VOX1JDVl9PSwkJCQkJCQkJMHgwNjBGCisjZGVmaW5lCU9JRF9HRU5fUkNWX05PX0JVRkZFUgkJCQkJCTB4MDYxMAorI2RlZmluZQlSVF9PSURfODAyXzExX1FVRVJZX0VFUFJPTV9WRVJTSU9OCQkJMHgwNjExCisjZGVmaW5lCVJUX09JRF84MDJfMTFfUVVFUllfRklSTVdBUkVfVkVSU0lPTgkJMHgwNjEyCisjZGVmaW5lCVJUX09JRF84MDJfMTFfUVVFUllfTEFTVF9SWF9SQVRFCQkJMHgwNjEzCisjZGVmaW5lCVJUX09JRF84MDJfMTFfVFhfUE9XRVJfTEVWRUxfMQkJCQkweDA2MTQKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9RVUVSWV9QSURWSUQJCQkJCTB4MDYxNQorLy9mb3IgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorI2RlZmluZSBPSURfU0VUX0NPVU5URVJNRUFTVVJFUyAgICAgICAgICAgICAgICAgICAgIDB4MDYxNgorI2RlZmluZSBPSURfODAyXzExX1NFVF9JRUVFODAyMVggICAgICAgICAgICAgICAgICAgIDB4MDYxNworI2RlZmluZSBPSURfODAyXzExX1NFVF9JRUVFODAyMVhfUkVRVUlSRV9LRVkgICAgICAgIDB4MDYxOAorI2RlZmluZSBPSURfODAyXzExX1BNS0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDYyMAorI2RlZmluZSBSVF9PSURfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAgICAgICAgICAgICAgIDB4MDYyMQorI2RlZmluZSBSVF9PSURfV0VfVkVSU0lPTl9DT01QSUxFRCAgICAgICAgICAgICAgICAgIDB4MDYyMgorI2RlZmluZSBSVF9PSURfTkVXX0RSSVZFUiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDYyMworCisKKy8vcnQyODYwICwga2F0aHkKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9TTlJfMAkJCQkJCQkweDA2MzAKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9TTlJfMQkJCQkJCQkweDA2MzEKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9RVUVSWV9MQVNUX1RYX1JBVEUJCQkweDA2MzIKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9RVUVSWV9IVF9QSFlNT0RFCQkJCTB4MDYzMworI2RlZmluZQlSVF9PSURfODAyXzExX1NFVF9IVF9QSFlNT0RFCQkJCTB4MDYzNAorI2RlZmluZQlPSURfODAyXzExX1JFTE9BRF9ERUZBVUxUUwkJCQkJMHgwNjM1CisjZGVmaW5lCVJUX09JRF84MDJfMTFfUVVFUllfQVBTRF9TRVRUSU5HCQkJMHgwNjM2CisjZGVmaW5lCVJUX09JRF84MDJfMTFfU0VUX0FQU0RfU0VUVElORwkJCQkweDA2MzcKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9RVUVSWV9BUFNEX1BTTQkJCQkweDA2MzgKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9TRVRfQVBTRF9QU00JCQkJCTB4MDYzOQorI2RlZmluZQlSVF9PSURfODAyXzExX1FVRVJZX0RMUwkJCQkJCTB4MDYzQQorI2RlZmluZQlSVF9PSURfODAyXzExX1NFVF9ETFMJCQkJCQkweDA2M0IKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9RVUVSWV9ETFNfUEFSQU0JCQkJMHgwNjNDCisjZGVmaW5lCVJUX09JRF84MDJfMTFfU0VUX0RMU19QQVJBTQkJCQkJMHgwNjNECisjZGVmaW5lIFJUX09JRF84MDJfMTFfUVVFUllfV01NICAgICAgICAgICAgICAJCTB4MDYzRQorI2RlZmluZSBSVF9PSURfODAyXzExX1NFVF9XTU0gICAgICAJCQkJCTB4MDYzRgorI2RlZmluZSBSVF9PSURfODAyXzExX1FVRVJZX0lNTUVfQkFfQ0FQCQkJCTB4MDY0MAorI2RlZmluZSBSVF9PSURfODAyXzExX1NFVF9JTU1FX0JBX0NBUAkJCQkweDA2NDEKKyNkZWZpbmUgUlRfT0lEXzgwMl8xMV9RVUVSWV9CQVRBQkxFCQkJCQkweDA2NDIKKyNkZWZpbmUgUlRfT0lEXzgwMl8xMV9BRERfSU1NRV9CQQkJCQkJMHgwNjQzCisjZGVmaW5lIFJUX09JRF84MDJfMTFfVEVBUl9JTU1FX0JBCQkJCQkweDA2NDQKKyNkZWZpbmUgUlRfT0lEX0RSSVZFUl9ERVZJQ0VfTkFNRSAgICAgICAgICAgICAgICAgICAweDA2NDUKKyNkZWZpbmUgUlRfT0lEXzgwMl8xMV9RVUVSWV9EQVRfSFRfUEhZTU9ERSAgICAgICAgICAweDA2NDYKKyNkZWZpbmUgUlRfT0lEX1FVRVJZX01VTFRJUExFX0NBUkRfU1VQUE9SVCAgICAgICAgICAweDA2NDcKKworLy8gUmFsaW5rIGRlZmluZWQgT0lEcworLy8gRGVubmlzIExlZSBtb3ZlIHRvIHBsYXRmb3JtIHNwZWNpZmljCisKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9CU1NJRAkJCQkJICAoT0lEX0dFVF9TRVRfVE9HR0xFIHwJT0lEXzgwMl8xMV9CU1NJRCkKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9TU0lECQkJCQkgIChPSURfR0VUX1NFVF9UT0dHTEUgfAlPSURfODAyXzExX1NTSUQpCisjZGVmaW5lCVJUX09JRF84MDJfMTFfSU5GUkFTVFJVQ1RVUkVfTU9ERQkgIChPSURfR0VUX1NFVF9UT0dHTEUgfAlPSURfODAyXzExX0lORlJBU1RSVUNUVVJFX01PREUpCisjZGVmaW5lCVJUX09JRF84MDJfMTFfQUREX1dFUAkJCQkgIChPSURfR0VUX1NFVF9UT0dHTEUgfAlPSURfODAyXzExX0FERF9XRVApCisjZGVmaW5lCVJUX09JRF84MDJfMTFfQUREX0tFWQkJCQkgIChPSURfR0VUX1NFVF9UT0dHTEUgfAlPSURfODAyXzExX0FERF9LRVkpCisjZGVmaW5lCVJUX09JRF84MDJfMTFfUkVNT1ZFX1dFUAkJCSAgKE9JRF9HRVRfU0VUX1RPR0dMRSB8CU9JRF84MDJfMTFfUkVNT1ZFX1dFUCkKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9SRU1PVkVfS0VZCQkJICAoT0lEX0dFVF9TRVRfVE9HR0xFIHwJT0lEXzgwMl8xMV9SRU1PVkVfS0VZKQorI2RlZmluZQlSVF9PSURfODAyXzExX0RJU0FTU09DSUFURQkJCSAgKE9JRF9HRVRfU0VUX1RPR0dMRSB8CU9JRF84MDJfMTFfRElTQVNTT0NJQVRFKQorI2RlZmluZQlSVF9PSURfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREUJICAoT0lEX0dFVF9TRVRfVE9HR0xFIHwJT0lEXzgwMl8xMV9BVVRIRU5USUNBVElPTl9NT0RFKQorI2RlZmluZQlSVF9PSURfODAyXzExX1BSSVZBQ1lfRklMVEVSCQkgIChPSURfR0VUX1NFVF9UT0dHTEUgfAlPSURfODAyXzExX1BSSVZBQ1lfRklMVEVSKQorI2RlZmluZQlSVF9PSURfODAyXzExX0JTU0lEX0xJU1RfU0NBTgkJICAoT0lEX0dFVF9TRVRfVE9HR0xFIHwJT0lEXzgwMl8xMV9CU1NJRF9MSVNUX1NDQU4pCisjZGVmaW5lCVJUX09JRF84MDJfMTFfV0VQX1NUQVRVUwkJCSAgKE9JRF9HRVRfU0VUX1RPR0dMRSB8CU9JRF84MDJfMTFfV0VQX1NUQVRVUykKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9SRUxPQURfREVGQVVMVFMJCSAgKE9JRF9HRVRfU0VUX1RPR0dMRSB8CU9JRF84MDJfMTFfUkVMT0FEX0RFRkFVTFRTKQorI2RlZmluZQlSVF9PSURfODAyXzExX05FVFdPUktfVFlQRV9JTl9VU0UJICAoT0lEX0dFVF9TRVRfVE9HR0xFIHwJT0lEXzgwMl8xMV9ORVRXT1JLX1RZUEVfSU5fVVNFKQorI2RlZmluZQlSVF9PSURfODAyXzExX1RYX1BPV0VSX0xFVkVMCQkgIChPSURfR0VUX1NFVF9UT0dHTEUgfAlPSURfODAyXzExX1RYX1BPV0VSX0xFVkVMKQorI2RlZmluZQlSVF9PSURfODAyXzExX1JTU0lfVFJJR0dFUgkJCSAgKE9JRF9HRVRfU0VUX1RPR0dMRSB8CU9JRF84MDJfMTFfUlNTSV9UUklHR0VSKQorI2RlZmluZQlSVF9PSURfODAyXzExX0ZSQUdNRU5UQVRJT05fVEhSRVNIT0xEIChPSURfR0VUX1NFVF9UT0dHTEUgfAlPSURfODAyXzExX0ZSQUdNRU5UQVRJT05fVEhSRVNIT0xEKQorI2RlZmluZQlSVF9PSURfODAyXzExX1JUU19USFJFU0hPTEQJCQkgIChPSURfR0VUX1NFVF9UT0dHTEUgfAlPSURfODAyXzExX1JUU19USFJFU0hPTEQpCisjZGVmaW5lCVJUX09JRF84MDJfMTFfUlhfQU5URU5OQV9TRUxFQ1RFRAkgIChPSURfR0VUX1NFVF9UT0dHTEUgfAlPSURfODAyXzExX1JYX0FOVEVOTkFfU0VMRUNURUQpCisjZGVmaW5lCVJUX09JRF84MDJfMTFfVFhfQU5URU5OQV9TRUxFQ1RFRAkgIChPSURfR0VUX1NFVF9UT0dHTEUgfAlPSURfODAyXzExX1RYX0FOVEVOTkFfU0VMRUNURUQpCisjZGVmaW5lCVJUX09JRF84MDJfMTFfU1VQUE9SVEVEX1JBVEVTCQkgIChPSURfR0VUX1NFVF9UT0dHTEUgfAlPSURfODAyXzExX1NVUFBPUlRFRF9SQVRFUykKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9ERVNJUkVEX1JBVEVTCQkJICAoT0lEX0dFVF9TRVRfVE9HR0xFIHwJT0lEXzgwMl8xMV9ERVNJUkVEX1JBVEVTKQorI2RlZmluZQlSVF9PSURfODAyXzExX0NPTkZJR1VSQVRJT04JCQkgIChPSURfR0VUX1NFVF9UT0dHTEUgfAlPSURfODAyXzExX0NPTkZJR1VSQVRJT04pCisjZGVmaW5lCVJUX09JRF84MDJfMTFfUE9XRVJfTU9ERQkJCSAgKE9JRF9HRVRfU0VUX1RPR0dMRSB8CU9JRF84MDJfMTFfUE9XRVJfTU9ERSkKKwordHlwZWRlZiBlbnVtIF9ORElTXzgwMl8xMV9TVEFUVVNfVFlQRQoreworICAgIE5kaXM4MDJfMTFTdGF0dXNUeXBlX0F1dGhlbnRpY2F0aW9uLAorICAgIE5kaXM4MDJfMTFTdGF0dXNUeXBlX01lZGlhU3RyZWFtTW9kZSwKKyAgICBOZGlzODAyXzExU3RhdHVzVHlwZV9QTUtJRF9DYW5kaWRhdGVMaXN0LAorICAgIE5kaXM4MDJfMTFTdGF0dXNUeXBlTWF4ICAgIC8vIG5vdCBhIHJlYWwgdHlwZSwgZGVmaW5lZCBhcyBhbiB1cHBlciBib3VuZAorfSBORElTXzgwMl8xMV9TVEFUVVNfVFlQRSwgKlBORElTXzgwMl8xMV9TVEFUVVNfVFlQRTsKKwordHlwZWRlZiBVQ0hBUiAgIE5ESVNfODAyXzExX01BQ19BRERSRVNTWzZdOworCit0eXBlZGVmIHN0cnVjdCBfTkRJU184MDJfMTFfU1RBVFVTX0lORElDQVRJT04KK3sKKyAgICBORElTXzgwMl8xMV9TVEFUVVNfVFlQRSBTdGF0dXNUeXBlOworfSBORElTXzgwMl8xMV9TVEFUVVNfSU5ESUNBVElPTiwgKlBORElTXzgwMl8xMV9TVEFUVVNfSU5ESUNBVElPTjsKKworLy8gbWFzayBmb3IgYXV0aGVudGljYXRpb24vaW50ZWdyaXR5IGZpZWxkcworI2RlZmluZSBORElTXzgwMl8xMV9BVVRIX1JFUVVFU1RfQVVUSF9GSUVMRFMgICAgICAgIDB4MGYKKworI2RlZmluZSBORElTXzgwMl8xMV9BVVRIX1JFUVVFU1RfUkVBVVRIICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgTkRJU184MDJfMTFfQVVUSF9SRVFVRVNUX0tFWVVQREFURSAgICAgICAgICAweDAyCisjZGVmaW5lIE5ESVNfODAyXzExX0FVVEhfUkVRVUVTVF9QQUlSV0lTRV9FUlJPUiAgICAgMHgwNgorI2RlZmluZSBORElTXzgwMl8xMV9BVVRIX1JFUVVFU1RfR1JPVVBfRVJST1IgICAgICAgIDB4MEUKKwordHlwZWRlZiBzdHJ1Y3QgX05ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX1JFUVVFU1QKK3sKKyAgICBVTE9ORyBMZW5ndGg7ICAgICAgICAgICAgLy8gTGVuZ3RoIG9mIHN0cnVjdHVyZQorICAgIE5ESVNfODAyXzExX01BQ19BRERSRVNTIEJzc2lkOworICAgIFVMT05HIEZsYWdzOworfSBORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9SRVFVRVNULCAqUE5ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX1JFUVVFU1Q7CisKKy8vQWRkZWQgbmV3IHR5cGVzIGZvciBQTUtJRCBDYW5kaWRhdGUgbGlzdHMuCit0eXBlZGVmIHN0cnVjdCBfUE1LSURfQ0FORElEQVRFIHsKKyAgICBORElTXzgwMl8xMV9NQUNfQUREUkVTUyBCU1NJRDsKKyAgICBVTE9ORyBGbGFnczsKK30gUE1LSURfQ0FORElEQVRFLCAqUFBNS0lEX0NBTkRJREFURTsKKwordHlwZWRlZiBzdHJ1Y3QgX05ESVNfODAyXzExX1BNS0lEX0NBTkRJREFURV9MSVNUCit7CisgICAgVUxPTkcgVmVyc2lvbjsgICAgICAgLy8gVmVyc2lvbiBvZiB0aGUgc3RydWN0dXJlCisgICAgVUxPTkcgTnVtQ2FuZGlkYXRlczsgLy8gTm8uIG9mIHBta2lkIGNhbmRpZGF0ZXMKKyAgICBQTUtJRF9DQU5ESURBVEUgQ2FuZGlkYXRlTGlzdFsxXTsKK30gTkRJU184MDJfMTFfUE1LSURfQ0FORElEQVRFX0xJU1QsICpQTkRJU184MDJfMTFfUE1LSURfQ0FORElEQVRFX0xJU1Q7CisKKy8vRmxhZ3MgZm9yIFBNS0lEIENhbmRpZGF0ZSBsaXN0IHN0cnVjdHVyZQorI2RlZmluZSBORElTXzgwMl8xMV9QTUtJRF9DQU5ESURBVEVfUFJFQVVUSF9FTkFCTEVECTB4MDEKKworLy8gQWRkZWQgbmV3IHR5cGVzIGZvciBPRkRNIDVHIGFuZCAyLjRHCit0eXBlZGVmIGVudW0gX05ESVNfODAyXzExX05FVFdPUktfVFlQRQoreworICAgTmRpczgwMl8xMUZILAorICAgTmRpczgwMl8xMURTLAorICAgIE5kaXM4MDJfMTFPRkRNNSwKKyAgICBOZGlzODAyXzExT0ZETTVfTiwKKyAgICBOZGlzODAyXzExT0ZETTI0LAorICAgIE5kaXM4MDJfMTFPRkRNMjRfTiwKKyAgIE5kaXM4MDJfMTFBdXRvbW9kZSwKKyAgICBOZGlzODAyXzExTmV0d29ya1R5cGVNYXggICAgLy8gbm90IGEgcmVhbCB0eXBlLCBkZWZpbmVkIGFzIGFuIHVwcGVyIGJvdW5kCit9IE5ESVNfODAyXzExX05FVFdPUktfVFlQRSwgKlBORElTXzgwMl8xMV9ORVRXT1JLX1RZUEU7CisKK3R5cGVkZWYgc3RydWN0IF9ORElTXzgwMl8xMV9ORVRXT1JLX1RZUEVfTElTVAoreworICAgIFVJTlQgICAgICAgICAgICAgICAgICAgICAgIE51bWJlck9mSXRlbXM7ICAvLyBpbiBsaXN0IGJlbG93LCBhdCBsZWFzdCAxCisgICBORElTXzgwMl8xMV9ORVRXT1JLX1RZUEUgICAgTmV0d29ya1R5cGUgWzFdOworfSBORElTXzgwMl8xMV9ORVRXT1JLX1RZUEVfTElTVCwgKlBORElTXzgwMl8xMV9ORVRXT1JLX1RZUEVfTElTVDsKKwordHlwZWRlZiBlbnVtIF9ORElTXzgwMl8xMV9QT1dFUl9NT0RFCit7CisgICAgTmRpczgwMl8xMVBvd2VyTW9kZUNBTSwKKyAgICBOZGlzODAyXzExUG93ZXJNb2RlTUFYX1BTUCwKKyAgICBOZGlzODAyXzExUG93ZXJNb2RlRmFzdF9QU1AsCisgICAgTmRpczgwMl8xMVBvd2VyTW9kZUxlZ2FjeV9QU1AsCisgICAgTmRpczgwMl8xMVBvd2VyTW9kZU1heCAgICAgIC8vIG5vdCBhIHJlYWwgbW9kZSwgZGVmaW5lZCBhcyBhbiB1cHBlciBib3VuZAorfSBORElTXzgwMl8xMV9QT1dFUl9NT0RFLCAqUE5ESVNfODAyXzExX1BPV0VSX01PREU7CisKK3R5cGVkZWYgVUxPTkcgICBORElTXzgwMl8xMV9UWF9QT1dFUl9MRVZFTDsgLy8gaW4gbWlsbGl3YXR0cworCisvLworLy8gUmVjZWl2ZWQgU2lnbmFsIFN0cmVuZ3RoIEluZGljYXRpb24KKy8vCit0eXBlZGVmIExPTkcgICAgTkRJU184MDJfMTFfUlNTSTsgICAgICAgICAgIC8vIGluIGRCbQorCit0eXBlZGVmIHN0cnVjdCBfTkRJU184MDJfMTFfQ09ORklHVVJBVElPTl9GSAoreworICAgVUxPTkcgICAgICAgICAgIExlbmd0aDsgICAgICAgICAgICAvLyBMZW5ndGggb2Ygc3RydWN0dXJlCisgICBVTE9ORyAgICAgICAgICAgSG9wUGF0dGVybjsgICAgICAgIC8vIEFzIGRlZmluZWQgYnkgODAyLjExLCBNU0Igc2V0CisgICBVTE9ORyAgICAgICAgICAgSG9wU2V0OyAgICAgICAgICAgIC8vIHRvIG9uZSBpZiBub24tODAyLjExCisgICBVTE9ORyAgICAgICAgICAgRHdlbGxUaW1lOyAgICAgICAgIC8vIHVuaXRzIGFyZSBLdXNlYworfSBORElTXzgwMl8xMV9DT05GSUdVUkFUSU9OX0ZILCAqUE5ESVNfODAyXzExX0NPTkZJR1VSQVRJT05fRkg7CisKK3R5cGVkZWYgc3RydWN0IF9ORElTXzgwMl8xMV9DT05GSUdVUkFUSU9OCit7CisgICBVTE9ORyAgICAgICAgICAgICAgICAgICAgICAgICAgIExlbmd0aDsgICAgICAgICAgICAgLy8gTGVuZ3RoIG9mIHN0cnVjdHVyZQorICAgVUxPTkcgICAgICAgICAgICAgICAgICAgICAgICAgICBCZWFjb25QZXJpb2Q7ICAgICAgIC8vIHVuaXRzIGFyZSBLdXNlYworICAgVUxPTkcgICAgICAgICAgICAgICAgICAgICAgICAgICBBVElNV2luZG93OyAgICAgICAgIC8vIHVuaXRzIGFyZSBLdXNlYworICAgVUxPTkcgICAgICAgICAgICAgICAgICAgICAgICAgICBEU0NvbmZpZzsgICAgICAgICAgIC8vIEZyZXF1ZW5jeSwgdW5pdHMgYXJlIGtIegorICAgTkRJU184MDJfMTFfQ09ORklHVVJBVElPTl9GSCAgICBGSENvbmZpZzsKK30gTkRJU184MDJfMTFfQ09ORklHVVJBVElPTiwgKlBORElTXzgwMl8xMV9DT05GSUdVUkFUSU9OOworCit0eXBlZGVmIHN0cnVjdCBfTkRJU184MDJfMTFfU1RBVElTVElDUworeworICAgVUxPTkcgICAgICAgICAgIExlbmd0aDsgICAgICAgICAgICAgLy8gTGVuZ3RoIG9mIHN0cnVjdHVyZQorICAgTEFSR0VfSU5URUdFUiAgIFRyYW5zbWl0dGVkRnJhZ21lbnRDb3VudDsKKyAgIExBUkdFX0lOVEVHRVIgICBNdWx0aWNhc3RUcmFuc21pdHRlZEZyYW1lQ291bnQ7CisgICBMQVJHRV9JTlRFR0VSICAgRmFpbGVkQ291bnQ7CisgICBMQVJHRV9JTlRFR0VSICAgUmV0cnlDb3VudDsKKyAgIExBUkdFX0lOVEVHRVIgICBNdWx0aXBsZVJldHJ5Q291bnQ7CisgICBMQVJHRV9JTlRFR0VSICAgUlRTU3VjY2Vzc0NvdW50OworICAgTEFSR0VfSU5URUdFUiAgIFJUU0ZhaWx1cmVDb3VudDsKKyAgIExBUkdFX0lOVEVHRVIgICBBQ0tGYWlsdXJlQ291bnQ7CisgICBMQVJHRV9JTlRFR0VSICAgRnJhbWVEdXBsaWNhdGVDb3VudDsKKyAgIExBUkdFX0lOVEVHRVIgICBSZWNlaXZlZEZyYWdtZW50Q291bnQ7CisgICBMQVJHRV9JTlRFR0VSICAgTXVsdGljYXN0UmVjZWl2ZWRGcmFtZUNvdW50OworICAgTEFSR0VfSU5URUdFUiAgIEZDU0Vycm9yQ291bnQ7CisgICBMQVJHRV9JTlRFR0VSICAgVEtJUExvY2FsTUlDRmFpbHVyZXM7CisgICBMQVJHRV9JTlRFR0VSICAgVEtJUFJlbW90ZU1JQ0Vycm9yczsKKyAgIExBUkdFX0lOVEVHRVIgICBUS0lQSUNWRXJyb3JzOworICAgTEFSR0VfSU5URUdFUiAgIFRLSVBDb3VudGVyTWVhc3VyZXNJbnZva2VkOworICAgTEFSR0VfSU5URUdFUiAgIFRLSVBSZXBsYXlzOworICAgTEFSR0VfSU5URUdFUiAgIENDTVBGb3JtYXRFcnJvcnM7CisgICBMQVJHRV9JTlRFR0VSICAgQ0NNUFJlcGxheXM7CisgICBMQVJHRV9JTlRFR0VSICAgQ0NNUERlY3J5cHRFcnJvcnM7CisgICBMQVJHRV9JTlRFR0VSICAgRm91cldheUhhbmRzaGFrZUZhaWx1cmVzOworfSBORElTXzgwMl8xMV9TVEFUSVNUSUNTLCAqUE5ESVNfODAyXzExX1NUQVRJU1RJQ1M7CisKK3R5cGVkZWYgIFVMT05HICBORElTXzgwMl8xMV9LRVlfSU5ERVg7Cit0eXBlZGVmIFVMT05HTE9ORyAgIE5ESVNfODAyXzExX0tFWV9SU0M7CisKKyNkZWZpbmUgTUFYX1JBRElVU19TUlZfTlVNCQkJMgkgIC8vIDgwMi4xeCBmYWlsb3ZlciBudW1iZXIKKwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9SQURJVVNfU1JWX0lORk8geworCVVJTlQzMgkJCXJhZGl1c19pcDsKKwlVSU5UMzIJCQlyYWRpdXNfcG9ydDsKKwlVQ0hBUgkJCXJhZGl1c19rZXlbNjRdOworCVVDSEFSCQkJcmFkaXVzX2tleV9sZW47Cit9IFJBRElVU19TUlZfSU5GTywgKlBSQURJVVNfU1JWX0lORk87CisKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfUkFESVVTX0tFWV9JTkZPCit7CisJVUNIQVIJCQlyYWRpdXNfc3J2X251bTsKKwlSQURJVVNfU1JWX0lORk8JcmFkaXVzX3Nydl9pbmZvW01BWF9SQURJVVNfU1JWX05VTV07CisJVUNIQVIJCQlpZWVlODAyMXhXRVA7CQkgLy8gZHluYW1pYyBXRVAKKyAgICBVQ0hBUiAgICAgICAgICAga2V5X2luZGV4OworICAgIFVDSEFSICAgICAgICAgICBrZXlfbGVuZ3RoOyAgICAgICAgICAvLyBsZW5ndGggb2Yga2V5IGluIGJ5dGVzCisgICAgVUNIQVIgICAgICAgICAgIGtleV9tYXRlcmlhbFsxM107Cit9IFJBRElVU19LRVlfSU5GTywgKlBSQURJVVNfS0VZX0lORk87CisKKy8vIEl0J3MgdXNlZCBieSA4MDIuMXggZGFlbW9uIHRvIHJlcXVpcmUgcmVsYXRpdmUgY29uZmlndXJhdGlvbgordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9SQURJVVNfQ09ORgoreworICAgIFVJTlQzMiAgICAgICAgICBMZW5ndGg7ICAgICAgICAgICAgIC8vIExlbmd0aCBvZiB0aGlzIHN0cnVjdHVyZQorICAgIFVDSEFSCQkJbWJzc19udW07CQkJLy8gaW5kaWNhdGUgbXVsdGlwbGUgQlNTIG51bWJlcgorCVVJTlQzMgkJCW93bl9pcF9hZGRyOworCVVJTlQzMgkJCXJldHJ5X2ludGVydmFsOworCVVJTlQzMgkJCXNlc3Npb25fdGltZW91dF9pbnRlcnZhbDsKKwlVQ0hBUgkJCUVBUGlmbmFtZVtJRk5BTVNJWl07CisJVUNIQVIJCQlFQVBpZm5hbWVfbGVuOworCVVDSEFSIAkJCVByZUF1dGhpZm5hbWVbSUZOQU1TSVpdOworCVVDSEFSCQkJUHJlQXV0aGlmbmFtZV9sZW47CisJUkFESVVTX0tFWV9JTkZPCVJhZGl1c0luZm9bOC8qTUFYX01CU1NJRF9OVU0qL107Cit9IFJBRElVU19DT05GLCAqUFJBRElVU19DT05GOworCisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorLy8gS2V5IG1hcHBpbmcga2V5cyByZXF1aXJlIGEgQlNTSUQKK3R5cGVkZWYgc3RydWN0IF9ORElTXzgwMl8xMV9LRVkKK3sKKyAgICBVSU5UICAgICAgICAgICBMZW5ndGg7ICAgICAgICAgICAgIC8vIExlbmd0aCBvZiB0aGlzIHN0cnVjdHVyZQorICAgIFVJTlQgICAgICAgICAgIEtleUluZGV4OworICAgIFVJTlQgICAgICAgICAgIEtleUxlbmd0aDsgICAgICAgICAgLy8gbGVuZ3RoIG9mIGtleSBpbiBieXRlcworICAgIE5ESVNfODAyXzExX01BQ19BRERSRVNTIEJTU0lEOworICAgIE5ESVNfODAyXzExX0tFWV9SU0MgS2V5UlNDOworICAgIFVDSEFSICAgICAgICAgICBLZXlNYXRlcmlhbFsxXTsgICAgIC8vIHZhcmlhYmxlIGxlbmd0aCBkZXBlbmRpbmcgb24gYWJvdmUgZmllbGQKK30gTkRJU184MDJfMTFfS0VZLCAqUE5ESVNfODAyXzExX0tFWTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwordHlwZWRlZiBzdHJ1Y3QgX05ESVNfODAyXzExX1JFTU9WRV9LRVkKK3sKKyAgICBVSU5UICAgICAgICAgICBMZW5ndGg7ICAgICAgICAgICAgIC8vIExlbmd0aCBvZiB0aGlzIHN0cnVjdHVyZQorICAgIFVJTlQgICAgICAgICAgIEtleUluZGV4OworICAgIE5ESVNfODAyXzExX01BQ19BRERSRVNTIEJTU0lEOworfSBORElTXzgwMl8xMV9SRU1PVkVfS0VZLCAqUE5ESVNfODAyXzExX1JFTU9WRV9LRVk7CisKK3R5cGVkZWYgc3RydWN0IF9ORElTXzgwMl8xMV9XRVAKK3sKKyAgIFVJTlQgICAgIExlbmd0aDsgICAgICAgIC8vIExlbmd0aCBvZiB0aGlzIHN0cnVjdHVyZQorICAgVUlOVCAgICAgS2V5SW5kZXg7ICAgICAgICAgICAvLyAwIGlzIHRoZSBwZXItY2xpZW50IGtleSwgMS1OIGFyZSB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBnbG9iYWwga2V5cworICAgVUlOVCAgICAgS2V5TGVuZ3RoOyAgICAgLy8gbGVuZ3RoIG9mIGtleSBpbiBieXRlcworICAgVUNIQVIgICAgIEtleU1hdGVyaWFsWzFdOy8vIHZhcmlhYmxlIGxlbmd0aCBkZXBlbmRpbmcgb24gYWJvdmUgZmllbGQKK30gTkRJU184MDJfMTFfV0VQLCAqUE5ESVNfODAyXzExX1dFUDsKKworCit0eXBlZGVmIGVudW0gX05ESVNfODAyXzExX05FVFdPUktfSU5GUkFTVFJVQ1RVUkUKK3sKKyAgIE5kaXM4MDJfMTFJQlNTLAorICAgTmRpczgwMl8xMUluZnJhc3RydWN0dXJlLAorICAgTmRpczgwMl8xMUF1dG9Vbmtub3duLAorICAgTmRpczgwMl8xMU1vbml0b3IsCisgICBOZGlzODAyXzExSW5mcmFzdHJ1Y3R1cmVNYXggICAgIC8vIE5vdCBhIHJlYWwgdmFsdWUsIGRlZmluZWQgYXMgdXBwZXIgYm91bmQKK30gTkRJU184MDJfMTFfTkVUV09SS19JTkZSQVNUUlVDVFVSRSwgKlBORElTXzgwMl8xMV9ORVRXT1JLX0lORlJBU1RSVUNUVVJFOworCisvLyBBZGQgbmV3IGF1dGhlbnRpY2F0aW9uIG1vZGVzCit0eXBlZGVmIGVudW0gX05ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREUKK3sKKyAgIE5kaXM4MDJfMTFBdXRoTW9kZU9wZW4sCisgICBOZGlzODAyXzExQXV0aE1vZGVTaGFyZWQsCisgICBOZGlzODAyXzExQXV0aE1vZGVBdXRvU3dpdGNoLAorICAgIE5kaXM4MDJfMTFBdXRoTW9kZVdQQSwKKyAgICBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0ssCisgICAgTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZSwKKyAgIE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIsCisgICBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLLAorICAgCU5kaXM4MDJfMTFBdXRoTW9kZVdQQTFXUEEyLAorCU5kaXM4MDJfMTFBdXRoTW9kZVdQQTFQU0tXUEEyUFNLLAorICAgTmRpczgwMl8xMUF1dGhNb2RlTWF4ICAgICAgICAgICAvLyBOb3QgYSByZWFsIG1vZGUsIGRlZmluZWQgYXMgdXBwZXIgYm91bmQKK30gTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fTU9ERSwgKlBORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9NT0RFOworCit0eXBlZGVmIFVDSEFSICAgTkRJU184MDJfMTFfUkFURVNbTkRJU184MDJfMTFfTEVOR1RIX1JBVEVTXTsgICAgICAgIC8vIFNldCBvZiA4IGRhdGEgcmF0ZXMKK3R5cGVkZWYgVUNIQVIgICBORElTXzgwMl8xMV9SQVRFU19FWFtORElTXzgwMl8xMV9MRU5HVEhfUkFURVNfRVhdOyAgLy8gU2V0IG9mIDE2IGRhdGEgcmF0ZXMKKwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9ORElTXzgwMl8xMV9TU0lECit7CisgICAgVUlOVCAgIFNzaWRMZW5ndGg7ICAgICAgICAgLy8gbGVuZ3RoIG9mIFNTSUQgZmllbGQgYmVsb3csIGluIGJ5dGVzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGNhbiBiZSB6ZXJvLgorICAgIFVDSEFSICAgU3NpZFtORElTXzgwMl8xMV9MRU5HVEhfU1NJRF07ICAgICAgICAgICAvLyBTU0lEIGluZm9ybWF0aW9uIGZpZWxkCit9IE5ESVNfODAyXzExX1NTSUQsICpQTkRJU184MDJfMTFfU1NJRDsKKworCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX05ESVNfV0xBTl9CU1NJRAoreworICAgVUxPTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGVuZ3RoOyAgICAgLy8gTGVuZ3RoIG9mIHRoaXMgc3RydWN0dXJlCisgICBORElTXzgwMl8xMV9NQUNfQUREUkVTUyAgICAgICAgICAgICBNYWNBZGRyZXNzOyAvLyBCU1NJRAorICAgVUNIQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWRbMl07CisgICBORElTXzgwMl8xMV9TU0lEICAgICAgICAgICAgICAgICAgICBTc2lkOyAgICAgICAvLyBTU0lECisgICBVTE9ORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcml2YWN5OyAgICAvLyBXRVAgZW5jcnlwdGlvbiByZXF1aXJlbWVudAorICAgTkRJU184MDJfMTFfUlNTSSAgICAgICAgICAgICAgICAgICAgUnNzaTsgICAgICAgLy8gcmVjZWl2ZSBzaWduYWwgc3RyZW5ndGggaW4gZEJtCisgICBORElTXzgwMl8xMV9ORVRXT1JLX1RZUEUgICAgICAgICAgICBOZXR3b3JrVHlwZUluVXNlOworICAgTkRJU184MDJfMTFfQ09ORklHVVJBVElPTiAgICAgICAgICAgQ29uZmlndXJhdGlvbjsKKyAgIE5ESVNfODAyXzExX05FVFdPUktfSU5GUkFTVFJVQ1RVUkUgIEluZnJhc3RydWN0dXJlTW9kZTsKKyAgIE5ESVNfODAyXzExX1JBVEVTICAgICAgICAgICAgICAgICAgIFN1cHBvcnRlZFJhdGVzOworfSBORElTX1dMQU5fQlNTSUQsICpQTkRJU19XTEFOX0JTU0lEOworCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX05ESVNfODAyXzExX0JTU0lEX0xJU1QKK3sKKyAgIFVJTlQgICAgICAgICAgIE51bWJlck9mSXRlbXM7ICAgICAgLy8gaW4gbGlzdCBiZWxvdywgYXQgbGVhc3QgMQorICAgTkRJU19XTEFOX0JTU0lEIEJzc2lkWzFdOworfSBORElTXzgwMl8xMV9CU1NJRF9MSVNULCAqUE5ESVNfODAyXzExX0JTU0lEX0xJU1Q7CisKKy8vIEFkZGVkIENhcGFiaWxpdGllcywgSUVMZW5ndGggYW5kIElFcyBmb3IgZWFjaCBCU1NJRAordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9ORElTX1dMQU5fQlNTSURfRVgKK3sKKyAgICBVTE9ORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMZW5ndGg7ICAgICAgICAgICAgIC8vIExlbmd0aCBvZiB0aGlzIHN0cnVjdHVyZQorICAgIE5ESVNfODAyXzExX01BQ19BRERSRVNTICAgICAgICAgICAgIE1hY0FkZHJlc3M7ICAgICAgICAgLy8gQlNTSUQKKyAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZFsyXTsKKyAgICBORElTXzgwMl8xMV9TU0lEICAgICAgICAgICAgICAgICAgICBTc2lkOyAgICAgICAgICAgICAgIC8vIFNTSUQKKyAgICBVSU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcml2YWN5OyAgICAgICAgICAgIC8vIFdFUCBlbmNyeXB0aW9uIHJlcXVpcmVtZW50CisgICAgTkRJU184MDJfMTFfUlNTSSAgICAgICAgICAgICAgICAgICAgUnNzaTsgICAgICAgICAgICAgICAvLyByZWNlaXZlIHNpZ25hbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RyZW5ndGggaW4gZEJtCisgICAgTkRJU184MDJfMTFfTkVUV09SS19UWVBFICAgICAgICAgICAgTmV0d29ya1R5cGVJblVzZTsKKyAgICBORElTXzgwMl8xMV9DT05GSUdVUkFUSU9OICAgICAgICAgICBDb25maWd1cmF0aW9uOworICAgIE5ESVNfODAyXzExX05FVFdPUktfSU5GUkFTVFJVQ1RVUkUgIEluZnJhc3RydWN0dXJlTW9kZTsKKyAgICBORElTXzgwMl8xMV9SQVRFU19FWCAgICAgICAgICAgICAgICBTdXBwb3J0ZWRSYXRlczsKKyAgICBVTE9ORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRUxlbmd0aDsKKyAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRXNbMV07Cit9IE5ESVNfV0xBTl9CU1NJRF9FWCwgKlBORElTX1dMQU5fQlNTSURfRVg7CisKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfTkRJU184MDJfMTFfQlNTSURfTElTVF9FWAoreworICAgIFVJTlQgICAgICAgICAgICAgICAgICAgTnVtYmVyT2ZJdGVtczsgICAgICAvLyBpbiBsaXN0IGJlbG93LCBhdCBsZWFzdCAxCisgICAgTkRJU19XTEFOX0JTU0lEX0VYICAgICAgQnNzaWRbMV07Cit9IE5ESVNfODAyXzExX0JTU0lEX0xJU1RfRVgsICpQTkRJU184MDJfMTFfQlNTSURfTElTVF9FWDsKKwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9ORElTXzgwMl8xMV9GSVhFRF9JRXMKK3sKKyAgICBVQ0hBUiBUaW1lc3RhbXBbOF07CisgICAgVVNIT1JUIEJlYWNvbkludGVydmFsOworICAgIFVTSE9SVCBDYXBhYmlsaXRpZXM7Cit9IE5ESVNfODAyXzExX0ZJWEVEX0lFcywgKlBORElTXzgwMl8xMV9GSVhFRF9JRXM7CisKK3R5cGVkZWYgc3RydWN0IF9ORElTXzgwMl8xMV9WQVJJQUJMRV9JRXMKK3sKKyAgICBVQ0hBUiBFbGVtZW50SUQ7CisgICAgVUNIQVIgTGVuZ3RoOyAgICAvLyBOdW1iZXIgb2YgYnl0ZXMgaW4gZGF0YSBmaWVsZAorICAgIFVDSEFSIGRhdGFbMV07Cit9IE5ESVNfODAyXzExX1ZBUklBQkxFX0lFcywgKlBORElTXzgwMl8xMV9WQVJJQUJMRV9JRXM7CisKK3R5cGVkZWYgIFVMT05HICAgTkRJU184MDJfMTFfRlJBR01FTlRBVElPTl9USFJFU0hPTEQ7CisKK3R5cGVkZWYgIFVMT05HICAgTkRJU184MDJfMTFfUlRTX1RIUkVTSE9MRDsKKwordHlwZWRlZiAgVUxPTkcgICBORElTXzgwMl8xMV9BTlRFTk5BOworCit0eXBlZGVmIGVudW0gX05ESVNfODAyXzExX1BSSVZBQ1lfRklMVEVSCit7CisgICBOZGlzODAyXzExUHJpdkZpbHRlckFjY2VwdEFsbCwKKyAgIE5kaXM4MDJfMTFQcml2RmlsdGVyODAyMXhXRVAKK30gTkRJU184MDJfMTFfUFJJVkFDWV9GSUxURVIsICpQTkRJU184MDJfMTFfUFJJVkFDWV9GSUxURVI7CisKKy8vIEFkZGVkIG5ldyBlbmNyeXB0aW9uIHR5cGVzCisvLyBBbHNvIGFsaWFzZWQgdHlwZWRlZiB0byBuZXcgbmFtZQordHlwZWRlZiBlbnVtIF9ORElTXzgwMl8xMV9XRVBfU1RBVFVTCit7CisgICBOZGlzODAyXzExV0VQRW5hYmxlZCwKKyAgICBOZGlzODAyXzExRW5jcnlwdGlvbjFFbmFibGVkID0gTmRpczgwMl8xMVdFUEVuYWJsZWQsCisgICBOZGlzODAyXzExV0VQRGlzYWJsZWQsCisgICAgTmRpczgwMl8xMUVuY3J5cHRpb25EaXNhYmxlZCA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZCwKKyAgIE5kaXM4MDJfMTFXRVBLZXlBYnNlbnQsCisgICAgTmRpczgwMl8xMUVuY3J5cHRpb24xS2V5QWJzZW50ID0gTmRpczgwMl8xMVdFUEtleUFic2VudCwKKyAgIE5kaXM4MDJfMTFXRVBOb3RTdXBwb3J0ZWQsCisgICAgTmRpczgwMl8xMUVuY3J5cHRpb25Ob3RTdXBwb3J0ZWQgPSBOZGlzODAyXzExV0VQTm90U3VwcG9ydGVkLAorICAgIE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQsCisgICAgTmRpczgwMl8xMUVuY3J5cHRpb24yS2V5QWJzZW50LAorICAgIE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQsCisgICAgTmRpczgwMl8xMUVuY3J5cHRpb24zS2V5QWJzZW50LAorICAgIE5kaXM4MDJfMTFFbmNyeXB0aW9uNEVuYWJsZWQsCS8vIFRLSVAgb3IgQUVTIG1peAorICAgIE5kaXM4MDJfMTFFbmNyeXB0aW9uNEtleUFic2VudCwKKyAgICBOZGlzODAyXzExR3JvdXBXRVA0MEVuYWJsZWQsCisJTmRpczgwMl8xMUdyb3VwV0VQMTA0RW5hYmxlZCwKK30gTkRJU184MDJfMTFfV0VQX1NUQVRVUywgKlBORElTXzgwMl8xMV9XRVBfU1RBVFVTLAorICBORElTXzgwMl8xMV9FTkNSWVBUSU9OX1NUQVRVUywgKlBORElTXzgwMl8xMV9FTkNSWVBUSU9OX1NUQVRVUzsKKwordHlwZWRlZiBlbnVtIF9ORElTXzgwMl8xMV9SRUxPQURfREVGQVVMVFMKK3sKKyAgIE5kaXM4MDJfMTFSZWxvYWRXRVBLZXlzCit9IE5ESVNfODAyXzExX1JFTE9BRF9ERUZBVUxUUywgKlBORElTXzgwMl8xMV9SRUxPQURfREVGQVVMVFM7CisKKyNkZWZpbmUgTkRJU184MDJfMTFfQUlfUkVRRklfQ0FQQUJJTElUSUVTICAgICAgMQorI2RlZmluZSBORElTXzgwMl8xMV9BSV9SRVFGSV9MSVNURU5JTlRFUlZBTCAgICAyCisjZGVmaW5lIE5ESVNfODAyXzExX0FJX1JFUUZJX0NVUlJFTlRBUEFERFJFU1MgIDQKKworI2RlZmluZSBORElTXzgwMl8xMV9BSV9SRVNGSV9DQVBBQklMSVRJRVMgICAgICAxCisjZGVmaW5lIE5ESVNfODAyXzExX0FJX1JFU0ZJX1NUQVRVU0NPREUgICAgICAgIDIKKyNkZWZpbmUgTkRJU184MDJfMTFfQUlfUkVTRklfQVNTT0NJQVRJT05JRCAgICAgNAorCit0eXBlZGVmIHN0cnVjdCBfTkRJU184MDJfMTFfQUlfUkVRRkkKK3sKKyAgICBVU0hPUlQgQ2FwYWJpbGl0aWVzOworICAgIFVTSE9SVCBMaXN0ZW5JbnRlcnZhbDsKKyAgICBORElTXzgwMl8xMV9NQUNfQUREUkVTUyAgQ3VycmVudEFQQWRkcmVzczsKK30gTkRJU184MDJfMTFfQUlfUkVRRkksICpQTkRJU184MDJfMTFfQUlfUkVRRkk7CisKK3R5cGVkZWYgc3RydWN0IF9ORElTXzgwMl8xMV9BSV9SRVNGSQoreworICAgIFVTSE9SVCBDYXBhYmlsaXRpZXM7CisgICAgVVNIT1JUIFN0YXR1c0NvZGU7CisgICAgVVNIT1JUIEFzc29jaWF0aW9uSWQ7Cit9IE5ESVNfODAyXzExX0FJX1JFU0ZJLCAqUE5ESVNfODAyXzExX0FJX1JFU0ZJOworCit0eXBlZGVmIHN0cnVjdCBfTkRJU184MDJfMTFfQVNTT0NJQVRJT05fSU5GT1JNQVRJT04KK3sKKyAgICBVTE9ORyAgICAgICAgICAgICAgICAgICBMZW5ndGg7CisgICAgVVNIT1JUICAgICAgICAgICAgICAgICAgQXZhaWxhYmxlUmVxdWVzdEZpeGVkSUVzOworICAgIE5ESVNfODAyXzExX0FJX1JFUUZJICAgIFJlcXVlc3RGaXhlZElFczsKKyAgICBVTE9ORyAgICAgICAgICAgICAgICAgICBSZXF1ZXN0SUVMZW5ndGg7CisgICAgVUxPTkcgICAgICAgICAgICAgICAgICAgT2Zmc2V0UmVxdWVzdElFczsKKyAgICBVU0hPUlQgICAgICAgICAgICAgICAgICBBdmFpbGFibGVSZXNwb25zZUZpeGVkSUVzOworICAgIE5ESVNfODAyXzExX0FJX1JFU0ZJICAgIFJlc3BvbnNlRml4ZWRJRXM7CisgICAgVUxPTkcgICAgICAgICAgICAgICAgICAgUmVzcG9uc2VJRUxlbmd0aDsKKyAgICBVTE9ORyAgICAgICAgICAgICAgICAgICBPZmZzZXRSZXNwb25zZUlFczsKK30gTkRJU184MDJfMTFfQVNTT0NJQVRJT05fSU5GT1JNQVRJT04sICpQTkRJU184MDJfMTFfQVNTT0NJQVRJT05fSU5GT1JNQVRJT047CisKK3R5cGVkZWYgc3RydWN0IF9ORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9FVkVOVAoreworICAgIE5ESVNfODAyXzExX1NUQVRVU19JTkRJQ0FUSU9OICAgICAgIFN0YXR1czsKKyAgICBORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9SRVFVRVNUICBSZXF1ZXN0WzFdOworfSBORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9FVkVOVCwgKlBORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9FVkVOVDsKKworLyoKK3R5cGVkZWYgc3RydWN0IF9ORElTXzgwMl8xMV9URVNUCit7CisgICAgVUxPTkcgTGVuZ3RoOworICAgIFVMT05HIFR5cGU7CisgICAgdW5pb24KKyAgICB7CisgICAgICAgIE5ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX0VWRU5UIEF1dGhlbnRpY2F0aW9uRXZlbnQ7CisgICAgICAgIE5ESVNfODAyXzExX1JTU0kgUnNzaVRyaWdnZXI7CisgICAgfTsKK30gTkRJU184MDJfMTFfVEVTVCwgKlBORElTXzgwMl8xMV9URVNUOworICovCisKKy8vIDgwMi4xMSBNZWRpYSBzdHJlYW0gY29uc3RyYWludHMsIGFzc29jaWF0ZWQgd2l0aCBPSURfODAyXzExX01FRElBX1NUUkVBTV9NT0RFCit0eXBlZGVmIGVudW0gX05ESVNfODAyXzExX01FRElBX1NUUkVBTV9NT0RFCit7CisgICAgTmRpczgwMl8xMU1lZGlhU3RyZWFtT2ZmLAorICAgIE5kaXM4MDJfMTFNZWRpYVN0cmVhbU9uLAorfSBORElTXzgwMl8xMV9NRURJQV9TVFJFQU1fTU9ERSwgKlBORElTXzgwMl8xMV9NRURJQV9TVFJFQU1fTU9ERTsKKworLy8gUE1LSUQgU3RydWN0dXJlcwordHlwZWRlZiBVQ0hBUiAgIE5ESVNfODAyXzExX1BNS0lEX1ZBTFVFWzE2XTsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAordHlwZWRlZiBzdHJ1Y3QgX0JTU0lEX0lORk8KK3sKKyAgICBORElTXzgwMl8xMV9NQUNfQUREUkVTUyBCU1NJRDsKKyAgICBORElTXzgwMl8xMV9QTUtJRF9WQUxVRSBQTUtJRDsKK30gQlNTSURfSU5GTywgKlBCU1NJRF9JTkZPOworCit0eXBlZGVmIHN0cnVjdCBfTkRJU184MDJfMTFfUE1LSUQKK3sKKyAgICBVSU5UICAgIExlbmd0aDsKKyAgICBVSU5UICAgIEJTU0lESW5mb0NvdW50OworICAgIEJTU0lEX0lORk8gQlNTSURJbmZvWzFdOworfSBORElTXzgwMl8xMV9QTUtJRCwgKlBORElTXzgwMl8xMV9QTUtJRDsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCit0eXBlZGVmIHN0cnVjdCBfTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fRU5DUllQVElPTgoreworICAgIE5ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREUgQXV0aE1vZGVTdXBwb3J0ZWQ7CisgICAgTkRJU184MDJfMTFfRU5DUllQVElPTl9TVEFUVVMgRW5jcnlwdFN0YXR1c1N1cHBvcnRlZDsKK30gTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fRU5DUllQVElPTiwgKlBORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9FTkNSWVBUSU9OOworCit0eXBlZGVmIHN0cnVjdCBfTkRJU184MDJfMTFfQ0FQQUJJTElUWQoreworICAgICBVTE9ORyBMZW5ndGg7CisgICAgIFVMT05HIFZlcnNpb247CisgICAgIFVMT05HIE5vT2ZQTUtJRHM7CisgICAgIFVMT05HIE5vT2ZBdXRoRW5jcnlwdFBhaXJzU3VwcG9ydGVkOworICAgICBORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9FTkNSWVBUSU9OIEF1dGhlbnRpY2F0aW9uRW5jcnlwdGlvblN1cHBvcnRlZFsxXTsKK30gTkRJU184MDJfMTFfQ0FQQUJJTElUWSwgKlBORElTXzgwMl8xMV9DQVBBQklMSVRZOworCisvLyNlbmRpZiAvL29mIFdJTiAyaworI2VuZGlmIC8vVU5ERVJfQ0UKKworI2lmIFdJUkVMRVNTX0VYVCA8PSAxMQorI2lmbmRlZiBTSU9DREVWUFJJVkFURQorI2RlZmluZSBTSU9DREVWUFJJVkFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEJFMAorI2VuZGlmCisjZGVmaW5lIFNJT0NJV0ZJUlNUUFJJVgkJCQkJCQkJU0lPQ0RFVlBSSVZBVEUKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisjZGVmaW5lIFJUUFJJVl9JT0NUTF9TRVQJCQkJCQkJKFNJT0NJV0ZJUlNUUFJJViArIDB4MDIpCisKKyNpZmRlZiBEQkcKKyNkZWZpbmUgUlRQUklWX0lPQ1RMX0JCUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU0lPQ0lXRklSU1RQUklWICsgMHgwMykKKyNkZWZpbmUgUlRQUklWX0lPQ1RMX01BQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU0lPQ0lXRklSU1RQUklWICsgMHgwNSkKKyNkZWZpbmUgUlRQUklWX0lPQ1RMX0UyUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU0lPQ0lXRklSU1RQUklWICsgMHgwNykKKyNlbmRpZgorCisjaWZkZWYgUkFMSU5LX0FURQorI2lmZGVmIFJBTElOS18yOHh4X1FBCisjZGVmaW5lIFJUUFJJVl9JT0NUTF9BVEUJCQkJCQkJKFNJT0NJV0ZJUlNUUFJJViArIDB4MDgpCisjZW5kaWYgLy8gUkFMSU5LXzI4eHhfUUEgLy8KKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisKKyNkZWZpbmUgUlRQUklWX0lPQ1RMX1NUQVRJU1RJQ1MgICAgICAgICAgICAgICAgICAgICAoU0lPQ0lXRklSU1RQUklWICsgMHgwOSkKKyNkZWZpbmUgUlRQUklWX0lPQ1RMX0FERF9QTUtJRF9DQUNIRSAgICAgICAgICAgICAgICAoU0lPQ0lXRklSU1RQUklWICsgMHgwQSkKKyNkZWZpbmUgUlRQUklWX0lPQ1RMX1JBRElVU19EQVRBICAgICAgICAgICAgICAgICAgICAoU0lPQ0lXRklSU1RQUklWICsgMHgwQykKKyNkZWZpbmUgUlRQUklWX0lPQ1RMX0dTSVRFU1VSVkVZCQkJCQkoU0lPQ0lXRklSU1RQUklWICsgMHgwRCkKKyNkZWZpbmUgUlRfUFJJVl9JT0NUTAkJCQkJCQkJKFNJT0NJV0ZJUlNUUFJJViArIDB4MEUpIC8vIFN5bmMuIHdpdGggUlQ2MSAoZm9yIHdwYV9zdXBwbGljYW50KQorI2RlZmluZSBSVFBSSVZfSU9DVExfR0VUX01BQ19UQUJMRQkJCQkJKFNJT0NJV0ZJUlNUUFJJViArIDB4MEYpCisKKyNkZWZpbmUgUlRQUklWX0lPQ1RMX1NIT1cJCQkJCQkJKFNJT0NJV0ZJUlNUUFJJViArIDB4MTEpCitlbnVtIHsKKyAgICBTSE9XX0NPTk5fU1RBVFVTID0gNCwKKyAgICBTSE9XX0RSVklFUl9WRVJJT04gPSA1LAorICAgIFNIT1dfQkFfSU5GTyA9IDYsCisJU0hPV19ERVNDX0lORk8gPSA3LAorI2lmZGVmIFJUMjg3MAorCVNIT1dfUlhCVUxLX0lORk8gPSA4LAorCVNIT1dfVFhCVUxLX0lORk8gPSA5LAorI2VuZGlmIC8vIFJUMjg3MCAvLworICAgIFJBSU9fT0ZGID0gMTAsCisgICAgUkFJT19PTiA9IDExLAorI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCVNIT1dfRExTX0VOVFJZX0lORk8gPSAxOSwKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKwlTSE9XX0NGR19WQUxVRSA9IDIwLAorCVNIT1dfQURIT0NfRU5UUllfSU5GTyA9IDIxLAorfTsKKworCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKyNpZmRlZiBTTk1QX1NVUFBPUlQKKy8vU05NUCBpZWVlIDgwMmRvdDExLCBrYXRoeSAsIDIwMDhfMDIyMAorLy8gZG90MTFyZXMoMykKKyNkZWZpbmUgUlRfT0lEXzgwMl8xMV9NQU5VRkFDVFVSRVJPVUkJCQkweDA3MDAKKyNkZWZpbmUgUlRfT0lEXzgwMl8xMV9NQU5VRkFDVFVSRVJOQU1FCQkJMHgwNzAxCisjZGVmaW5lIFJUX09JRF84MDJfMTFfUkVTT1VSQ0VUWVBFSUROQU1FCQkweDA3MDIKKworLy8gZG90MTFzbXQoMSkKKyNkZWZpbmUgUlRfT0lEXzgwMl8xMV9QUklWQUNZT1BUSU9OSU1QTEVNRU5URUQJMHgwNzAzCisjZGVmaW5lIFJUX09JRF84MDJfMTFfUE9XRVJNQU5BR0VNRU5UTU9ERQkJMHgwNzA0CisjZGVmaW5lIE9JRF84MDJfMTFfV0VQREVGQVVMVEtFWVZBTFVFCQkJMHgwNzA1IC8vIHJlYWQgLCB3cml0ZQorI2RlZmluZSBPSURfODAyXzExX1dFUERFRkFVTFRLRVlJRAkJCQkweDA3MDYKKyNkZWZpbmUgUlRfT0lEXzgwMl8xMV9XRVBLRVlNQVBQSU5HTEVOR1RICQkweDA3MDcKKyNkZWZpbmUgT0lEXzgwMl8xMV9TSE9SVFJFVFJZTElNSVQJCQkJMHgwNzA4CisjZGVmaW5lIE9JRF84MDJfMTFfTE9OR1JFVFJZTElNSVQJCQkJMHgwNzA5CisjZGVmaW5lIFJUX09JRF84MDJfMTFfUFJPRFVDVElECQkJCQkweDA3MTAKKyNkZWZpbmUgUlRfT0lEXzgwMl8xMV9NQU5VRkFDVFVSRUlECQkJCTB4MDcxMQorCisvLyAvL2RvdDExUGh5KDQpCisjZGVmaW5lIE9JRF84MDJfMTFfQ1VSUkVOVENIQU5ORUwJCQkJMHgwNzEyCisKKy8vZG90MTFtYWMKKyNkZWZpbmUgUlRfT0lEXzgwMl8xMV9NQUNfQUREUkVTUwkJCQkweDA3MTMKKyNlbmRpZiAvLyBTTk1QX1NVUFBPUlQgLy8KKworI2RlZmluZSBPSURfODAyXzExX0JVSUxEX0NIQU5ORUxfRVgJCQkJMHgwNzE0CisjZGVmaW5lIE9JRF84MDJfMTFfR0VUX0NIX0xJU1QJCQkJCTB4MDcxNQorI2RlZmluZSBPSURfODAyXzExX0dFVF9DT1VOVFJZX0NPREUJCQkJMHgwNzE2CisjZGVmaW5lIE9JRF84MDJfMTFfR0VUX0NIQU5ORUxfR0VPR1JBUEhZCQkweDA3MTcKKworI2lmZGVmIExMVERfU1VQUE9SVAorLy8gZm9yIGNvbnNpc3RlbmN5IHdpdGggUlQ2MQorI2RlZmluZSBSVF9PSURfR0VUX1BIWV9NT0RFICAgICAgICAgICAgICAgICAgICAgICAgIDB4NzYxCisjZW5kaWYgLy8gTExURF9TVVBQT1JUIC8vCisKKy8vIE1JTU8gVHggcGFyYW1ldGVyLCBTaG9ydEdJLCBNQ1MsIFNUQkMsIGV0Yy4gIHRoZXNlIGFyZSBmaWVsZHMgaW4gVFhXSS4gRG9uJ3QgY2hhbmdlIHRoaXMgZGVmaW5pdGlvbiEhIQordHlwZWRlZiB1bmlvbiAgX0hUVFJBTlNNSVRfU0VUVElORyB7CisjaWZkZWYgUlRfQklHX0VORElBTgorCXN0cnVjdAl7CisJVVNIT1JUCQlNT0RFOjI7CS8vIFVzZSBkZWZpbml0aW9uIE1PREVfeHh4LgorLy8JVVNIT1JUCQlyc3Y6MzsKKwlVU0hPUlQJCVR4QkY6MTsKKwlVU0hPUlQJCXJzdjoyOworCVVTSE9SVAkJU1RCQzoyOwkvL1NQQUNFCisJVVNIT1JUCQlTaG9ydEdJOjE7CisJVVNIT1JUCQlCVzoxOwkvL2NoYW5uZWwgYmFuZHdpZHRoIDIwTUh6IG9yIDQwIE1IegorCVVTSE9SVCAgIAlNQ1M6NzsgICAgICAgICAgICAgICAgIC8vIE1DUworCX0JZmllbGQ7CisjZWxzZQorCXN0cnVjdAl7CisJVVNIT1JUICAgCU1DUzo3OyAgICAgICAgICAgICAgICAgLy8gTUNTCisJVVNIT1JUCQlCVzoxOwkvL2NoYW5uZWwgYmFuZHdpZHRoIDIwTUh6IG9yIDQwIE1IegorCVVTSE9SVAkJU2hvcnRHSToxOworCVVTSE9SVAkJU1RCQzoyOwkvL1NQQUNFCisvLwlVU0hPUlQJCXJzdjozOworCVVTSE9SVAkJcnN2OjI7CisJVVNIT1JUCQlUeEJGOjE7CisJVVNIT1JUCQlNT0RFOjI7CS8vIFVzZSBkZWZpbml0aW9uIE1PREVfeHh4LgorCX0JZmllbGQ7CisjZW5kaWYKKwlVU0hPUlQJCXdvcmQ7CisgfSBIVFRSQU5TTUlUX1NFVFRJTkcsICpQSFRUUkFOU01JVF9TRVRUSU5HOworCit0eXBlZGVmIGVudW0gX1JUXzgwMl8xMV9QUkVBTUJMRSB7CisgICAgUnQ4MDJfMTFQcmVhbWJsZUxvbmcsCisgICAgUnQ4MDJfMTFQcmVhbWJsZVNob3J0LAorICAgIFJ0ODAyXzExUHJlYW1ibGVBdXRvCit9IFJUXzgwMl8xMV9QUkVBTUJMRSwgKlBSVF84MDJfMTFfUFJFQU1CTEU7CisKKy8vIE9ubHkgZm9yIFNUQSwgbmVlZCB0byBzeW5jIHdpdGggQVAKK3R5cGVkZWYgZW51bSBfUlRfODAyXzExX1BIWV9NT0RFIHsKKwlQSFlfMTFCR19NSVhFRCA9IDAsCisJUEhZXzExQiwKKwlQSFlfMTFBLAorCVBIWV8xMUFCR19NSVhFRCwKKwlQSFlfMTFHLAorI2lmZGVmIERPVDExX05fU1VQUE9SVAorCVBIWV8xMUFCR05fTUlYRUQsCS8vIGJvdGggYmFuZCAgIDUKKwlQSFlfMTFOXzJfNEcsCQkvLyAxMW4tb25seSB3aXRoIDIuNEcgYmFuZCAgIAk2CisJUEhZXzExR05fTUlYRUQsCS8vIDIuNEcgYmFuZCAgICAgIDcKKwlQSFlfMTFBTl9NSVhFRCwJLy8gNUcgIGJhbmQgICAgICAgOAorCVBIWV8xMUJHTl9NSVhFRCwJLy8gaWYgY2hlY2sgODAyLjExYi4gICAgICA5CisJUEhZXzExQUdOX01JWEVELAkvLyBpZiBjaGVjayA4MDIuMTFiLiAgICAgIDEwCisJUEhZXzExTl81RywJCQkvLyAxMW4tb25seSB3aXRoIDVHIGJhbmQJCTExCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCit9IFJUXzgwMl8xMV9QSFlfTU9ERTsKKworLy8gcHV0IGFsbCBwcm9wcmlldGVyeSBmb3ItcXVlcnkgb2JqZWN0cyBoZXJlIHRvIHJlZHVjZSAjIG9mIFF1ZXJ5X09JRAordHlwZWRlZiBzdHJ1Y3QgX1JUXzgwMl8xMV9MSU5LX1NUQVRVUyB7CisgICAgVUxPTkcgICBDdXJyVHhSYXRlOyAgICAgICAgIC8vIGluIHVuaXRzIG9mIDAuNU1icHMKKyAgICBVTE9ORyAgIENoYW5uZWxRdWFsaXR5OyAgICAgLy8gMC4uMTAwICUKKyAgICBVTE9ORyAgIFR4Qnl0ZUNvdW50OyAgICAgICAgLy8gYm90aCBvayBhbmQgZmFpbAorICAgIFVMT05HICAgUnhCeXRlQ291bnQ7ICAgICAgICAvLyBib3RoIG9rIGFuZCBmYWlsCisgICAgVUxPTkcJQ2VudHJhbENoYW5uZWw7CQkvLyA0ME1IeiBjZW50cmFsIGNoYW5uZWwgbnVtYmVyCit9IFJUXzgwMl8xMV9MSU5LX1NUQVRVUywgKlBSVF84MDJfMTFfTElOS19TVEFUVVM7CisKK3R5cGVkZWYgc3RydWN0IF9SVF84MDJfMTFfRVZFTlRfTE9HIHsKKyAgICBMQVJHRV9JTlRFR0VSICAgU3lzdGVtVGltZTsgIC8vIHRpbWVzdGFtbXAgdmlhIE5kaXNHZXRDdXJyZW50U3lzdGVtVGltZSgpCisgICAgVUNIQVIgICAgICAgICAgIEFkZHJbTUFDX0FERFJfTEVOR1RIXTsKKyAgICBVU0hPUlQgICAgICAgICAgRXZlbnQ7ICAgICAgIC8vIEVWRU5UX3h4eAorfSBSVF84MDJfMTFfRVZFTlRfTE9HLCAqUFJUXzgwMl8xMV9FVkVOVF9MT0c7CisKK3R5cGVkZWYgc3RydWN0IF9SVF84MDJfMTFfRVZFTlRfVEFCTEUgeworICAgIFVMT05HICAgICAgIE51bTsKKyAgICBVTE9ORyAgICAgICBSc3Y7ICAgICAvLyB0byBhbGlnbiBMb2dbXSBhdCBMQVJHRV9JTkVHRVIgYm91bmRhcnkKKyAgICBSVF84MDJfMTFfRVZFTlRfTE9HICAgTG9nW01BWF9OVU1CRVJfT0ZfRVZFTlRdOworfSBSVF84MDJfMTFfRVZFTlRfVEFCTEUsIFBSVF84MDJfMTFfRVZFTlRfVEFCTEU7CisKKy8vIE1JTU8gVHggcGFyYW1ldGVyLCBTaG9ydEdJLCBNQ1MsIFNUQkMsIGV0Yy4gIHRoZXNlIGFyZSBmaWVsZHMgaW4gVFhXSS4gRG9uJ3QgY2hhbmdlIHRoaXMgZGVmaW5pdGlvbiEhIQordHlwZWRlZiB1bmlvbiAgX01BQ0hUVFJBTlNNSVRfU0VUVElORyB7CisJc3RydWN0CXsKKwlVU0hPUlQgICAJTUNTOjc7ICAgICAgICAgICAgICAgICAvLyBNQ1MKKwlVU0hPUlQJCUJXOjE7CS8vY2hhbm5lbCBiYW5kd2lkdGggMjBNSHogb3IgNDAgTUh6CisJVVNIT1JUCQlTaG9ydEdJOjE7CisJVVNIT1JUCQlTVEJDOjI7CS8vU1BBQ0UKKwlVU0hPUlQJCXJzdjozOworCVVTSE9SVAkJTU9ERToyOwkvLyBVc2UgZGVmaW5pdGlvbiBNT0RFX3h4eC4KKwl9CWZpZWxkOworCVVTSE9SVAkJd29yZDsKKyB9IE1BQ0hUVFJBTlNNSVRfU0VUVElORywgKlBNQUNIVFRSQU5TTUlUX1NFVFRJTkc7CisKK3R5cGVkZWYgc3RydWN0IF9SVF84MDJfMTFfTUFDX0VOVFJZIHsKKyAgICBVQ0hBUiAgICAgICBBZGRyW01BQ19BRERSX0xFTkdUSF07CisgICAgVUNIQVIgICAgICAgQWlkOworICAgIFVDSEFSICAgICAgIFBzbTsgICAgIC8vIDA6UFdSX0FDVElWRSwgMTpQV1JfU0FWRQorICAgIFVDSEFSCQlNaW1vUHM7ICAvLyAwOk1NUFNfU1RBVElDLCAxOk1NUFNfRFlOQU1JQywgMzpNTVBTX0VuYWJsZWQKKyAgICBDSEFSCQlBdmdSc3NpMDsKKwlDSEFSCQlBdmdSc3NpMTsKKwlDSEFSCQlBdmdSc3NpMjsKKwlVSU5UMzIJCUNvbm5lY3RlZFRpbWU7CisgICAgTUFDSFRUUkFOU01JVF9TRVRUSU5HCVR4UmF0ZTsKK30gUlRfODAyXzExX01BQ19FTlRSWSwgKlBSVF84MDJfMTFfTUFDX0VOVFJZOworCit0eXBlZGVmIHN0cnVjdCBfUlRfODAyXzExX01BQ19UQUJMRSB7CisgICAgVUxPTkcgICAgICAgTnVtOworICAgIFJUXzgwMl8xMV9NQUNfRU5UUlkgRW50cnlbTUFYX05VTUJFUl9PRl9NQUNdOworfSBSVF84MDJfMTFfTUFDX1RBQkxFLCAqUFJUXzgwMl8xMV9NQUNfVEFCTEU7CisKKy8vIHN0cnVjdHVyZSBmb3IgcXVlcnkvc2V0IGhhcmR3YXJlIHJlZ2lzdGVyIC0gTUFDLCBCQlAsIFJGIHJlZ2lzdGVyCit0eXBlZGVmIHN0cnVjdCBfUlRfODAyXzExX0hBUkRXQVJFX1JFR0lTVEVSIHsKKyAgICBVTE9ORyAgIEhhcmR3YXJlVHlwZTsgICAgICAgLy8gMDpNQUMsIDE6QkJQLCAyOlJGIHJlZ2lzdGVyLCAzOkVFUFJPTQorICAgIFVMT05HICAgT2Zmc2V0OyAgICAgICAgICAgICAvLyBRL1MgcmVnaXN0ZXIgb2Zmc2V0IGFkZHIKKyAgICBVTE9ORyAgIERhdGE7ICAgICAgICAgICAgICAgLy8gUi9XIGRhdGEgYnVmZmVyCit9IFJUXzgwMl8xMV9IQVJEV0FSRV9SRUdJU1RFUiwgKlBSVF84MDJfMTFfSEFSRFdBUkVfUkVHSVNURVI7CisKKy8vIHN0cnVjdHVyZSB0byB0dW5lIEJCUCBSMTcgIlJYIEFHQyBWR0MgaW5pdCIKKy8vdHlwZWRlZiBzdHJ1Y3QgX1JUXzgwMl8xMV9SWF9BR0NfVkdDX1RVTklORyB7CisvLyAgICBVQ0hBUiAgIEZhbHNlQ2NhTG93ZXJUaHJlc2hvbGQ7ICAvLyAwLTI1NSwgZGVmIDEwCisvLyAgICBVQ0hBUiAgIEZhbHNlQ2NhVXBwZXJUaHJlc2hvbGQ7ICAvLyAwLTI1NSwgZGVmIDEwMAorLy8gICAgVUNIQVIgICBWZ2NEZWx0YTsgICAgICAgICAgICAgICAgLy8gUjE3ICstPSBWZ2NEZWx0YSB3aGVuZXZlciBmbGFzZSBDQ0Egb3ZlciBVcHByVGhyZXNob2xkCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvciBsb3dlciB0aGFuIExvd2VyVGhyZXNob2xkdXBwZXIgdGhyZXNob2xkCisvLyAgICBVQ0hBUiAgIFZnY1VwcGVyQm91bmQ7ICAgICAgICAgICAvLyBtYXggdmFsdWUgb2YgUjE3CisvL30gUlRfODAyXzExX1JYX0FHQ19WR0NfVFVOSU5HLCAqUFJUXzgwMl8xMV9SWF9BR0NfVkdDX1RVTklORzsKKwordHlwZWRlZiBzdHJ1Y3QgX1JUXzgwMl8xMV9BUF9DT05GSUcgeworICAgIFVMT05HICAgRW5hYmxlVHhCdXJzdDsgICAgICAvLyAwLWRpc2FibGUsIDEtZW5hYmxlCisgICAgVUxPTkcgICBFbmFibGVUdXJib1JhdGU7ICAgIC8vIDAtZGlzYWJsZSwgMS1lbmFibGUgNzIvMTAwbWJwcyB0dXJibyByYXRlCisgICAgVUxPTkcgICBJc29sYXRlSW50ZXJTdGFUcmFmZmljOyAgICAgLy8gMC1kaXNhYmxlLCAxLWVuYWJsZSBpc29sYXRpb24KKyAgICBVTE9ORyAgIEhpZGVTc2lkOyAgICAgICAgICAgLy8gMC1kaXNhYmxlLCAxLWVuYWJsZSBoaWRpbmcKKyAgICBVTE9ORyAgIFVzZUJHUHJvdGVjdGlvbjsgICAgLy8gMC1BVVRPLCAxLWFsd2F5cyBPTiwgMi1hbHdheXMgT0ZGCisgICAgVUxPTkcgICBVc2VTaG9ydFNsb3RUaW1lOyAgIC8vIDAtbm8gdXNlLCAxLXVzZSA5LXVzIHNob3J0IHNsb3QgdGltZQorICAgIFVMT05HICAgUnN2MTsgICAgICAgICAgICAgICAvLyBtdXN0IGJlIDAKKyAgICBVTE9ORyAgIFN5c3RlbUVycm9yQml0bWFwOyAgLy8gaWdub3JlIHVwb24gU0VULCByZXR1cm4gc3lzdGVtIGVycm9yIHVwb24gUVVFUlkKK30gUlRfODAyXzExX0FQX0NPTkZJRywgKlBSVF84MDJfMTFfQVBfQ09ORklHOworCisvLyBzdHJ1Y3R1cmUgdG8gcXVlcnkvc2V0IFNUQV9DT05GSUcKK3R5cGVkZWYgc3RydWN0IF9SVF84MDJfMTFfU1RBX0NPTkZJRyB7CisgICAgVUxPTkcgICBFbmFibGVUeEJ1cnN0OyAgICAgIC8vIDAtZGlzYWJsZSwgMS1lbmFibGUKKyAgICBVTE9ORyAgIEVuYWJsZVR1cmJvUmF0ZTsgICAgLy8gMC1kaXNhYmxlLCAxLWVuYWJsZSA3Mi8xMDBtYnBzIHR1cmJvIHJhdGUKKyAgICBVTE9ORyAgIFVzZUJHUHJvdGVjdGlvbjsgICAgLy8gMC1BVVRPLCAxLWFsd2F5cyBPTiwgMi1hbHdheXMgT0ZGCisgICAgVUxPTkcgICBVc2VTaG9ydFNsb3RUaW1lOyAgIC8vIDAtbm8gdXNlLCAxLXVzZSA5LXVzIHNob3J0IHNsb3QgdGltZSB3aGVuIGFwcGxpY2FibGUKKyAgICBVTE9ORyAgIEFkaG9jTW9kZTsgCQkJLy8gMC0xMWIgcmF0ZXMgb25seSAoV0lGSSBzcGVjKSwgMSAtIGIvZyBtaXhlZCwgMiAtIGcgb25seQorICAgIFVMT05HICAgSHdSYWRpb1N0YXR1czsgICAgICAvLyAwLU9GRiwgMS1PTiwgZGVmYXVsdCBpcyAxLCBSZWFkLU9ubHkKKyAgICBVTE9ORyAgIFJzdjE7ICAgICAgICAgICAgICAgLy8gbXVzdCBiZSAwCisgICAgVUxPTkcgICBTeXN0ZW1FcnJvckJpdG1hcDsgIC8vIGlnbm9yZSB1cG9uIFNFVCwgcmV0dXJuIHN5c3RlbSBlcnJvciB1cG9uIFFVRVJZCit9IFJUXzgwMl8xMV9TVEFfQ09ORklHLCAqUFJUXzgwMl8xMV9TVEFfQ09ORklHOworCisvLworLy8gIEZvciBPSUQgUXVlcnkgb3IgU2V0IGFib3V0IEJBIHN0cnVjdHVyZQorLy8KK3R5cGVkZWYJc3RydWN0CV9PSURfQkFDQVBfU1RSVUMJeworCQlVQ0hBUgkJUnhCQVdpbkxpbWl0OworCQlVQ0hBUgkJVHhCQVdpbkxpbWl0OworCQlVQ0hBUgkJUG9saWN5OwkvLyAwOiBERUxBWV9CQSAxOklNTUVEX0JBICAoLy9CQSBQb2xpY3kgc3ViZmlsZWQgdmFsdWUgaW4gQUREQkEgZnJhbWUpICAgMjpCQS1ub3QgdXNlLiBvdGhlciB2YWx1ZSBpbnZhbGlkCisJCVVDSEFSCQlNcGR1RGVuc2l0eTsJLy8gMDogREVMQVlfQkEgMTpJTU1FRF9CQSAgKC8vQkEgUG9saWN5IHN1YmZpbGVkIHZhbHVlIGluIEFEREJBIGZyYW1lKSAgIDI6QkEtbm90IHVzZS4gb3RoZXIgdmFsdWUgaW52YWxpZAorCQlVQ0hBUiAgICAgICAJQW1zZHVFbmFibGU7CS8vRW5hYmxlIEFNU0RVIHRyYW5zbWlzc3Rpb24KKwkJVUNIQVIgICAgICAgCUFtc2R1U2l6ZTsJLy8gMDozODM5LCAxOjc5MzUgYnl0ZXMuIFVJTlQgIE1TRFVTaXplVG9CeXRlc1tdCT0geyAzODM5LCA3OTM1fTsKKwkJVUNIQVIgICAgICAgCU1NUFNtb2RlOwkvLyBNSU1PIHBvd2VyIHNhdmUgbW9yZSwgMDpzdGF0aWMsIDE6ZHluYW1pYywgMjpyc3YsIDM6bWltbyBlbmFibGUKKwkJQk9PTEVBTgkJQXV0b0JBOwkvLyBBdXRvIEJBIHdpbGwgYXV0b21hdGljYWxseQorfSBPSURfQkFDQVBfU1RSVUMsICpQT0lEX0JBQ0FQX1NUUlVDOworCit0eXBlZGVmIHN0cnVjdCBfUlRfODAyXzExX0FDTF9FTlRSWSB7CisgICAgVUNIQVIgICBBZGRyW01BQ19BRERSX0xFTkdUSF07CisgICAgVVNIT1JUICBSc3Y7Cit9IFJUXzgwMl8xMV9BQ0xfRU5UUlksICpQUlRfODAyXzExX0FDTF9FTlRSWTsKKwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9SVF84MDJfMTFfQUNMIHsKKyAgICBVTE9ORyAgIFBvbGljeTsgICAgICAgICAgICAgLy8gMC1kaXNhYmxlLCAxLXBvc2l0aXZlIGxpc3QsIDItbmVnYXRpdmUgbGlzdAorICAgIFVMT05HICAgTnVtOworICAgIFJUXzgwMl8xMV9BQ0xfRU5UUlkgRW50cnlbTUFYX05VTUJFUl9PRl9BQ0xdOworfSBSVF84MDJfMTFfQUNMLCAqUFJUXzgwMl8xMV9BQ0w7CisKK3R5cGVkZWYgc3RydWN0IF9SVF84MDJfMTFfV0RTIHsKKyAgICBVTE9ORwkJCQkJCU51bTsKKyAgICBORElTXzgwMl8xMV9NQUNfQUREUkVTUwkJRW50cnlbMjQvKk1BWF9OVU1fT0ZfV0RTX0xJTksqL107CisJVUxPTkcJCQkJCQlLZXlMZW5ndGg7CisJVUNIQVIJCQkJCQlLZXlNYXRlcmlhbFszMl07Cit9IFJUXzgwMl8xMV9XRFMsICpQUlRfODAyXzExX1dEUzsKKwordHlwZWRlZiBzdHJ1Y3QgX1JUXzgwMl8xMV9UWF9SQVRFU18geworICAgIFVDSEFSICAgICAgIFN1cFJhdGVMZW47CisgICAgVUNIQVIgICAgICAgU3VwUmF0ZVtNQVhfTEVOR1RIX09GX1NVUFBPUlRfUkFURVNdOworICAgIFVDSEFSICAgICAgIEV4dFJhdGVMZW47CisgICAgVUNIQVIgICAgICAgRXh0UmF0ZVtNQVhfTEVOR1RIX09GX1NVUFBPUlRfUkFURVNdOworfSBSVF84MDJfMTFfVFhfUkFURVMsICpQUlRfODAyXzExX1RYX1JBVEVTOworCisKKy8vIERlZmluaXRpb24gb2YgZXh0cmEgaW5mb3JtYXRpb24gY29kZQorI2RlZmluZQlHRU5FUkFMX0xJTktfVVAJCQkweDAJCQkvLyBMaW5rIGlzIFVwCisjZGVmaW5lCUdFTkVSQUxfTElOS19ET1dOCQkweDEJCQkvLyBMaW5rIGlzIERvd24KKyNkZWZpbmUJSFdfUkFESU9fT0ZGCQkJMHgyCQkJLy8gSGFyZHdhcmUgcmFkaW8gb2ZmCisjZGVmaW5lCVNXX1JBRElPX09GRgkJCTB4MwkJCS8vIFNvZnR3YXJlIHJhZGlvIG9mZgorI2RlZmluZQlBVVRIX0ZBSUwJCQkJMHg0CQkJLy8gT3BlbiBhdXRoZW50aWNhdGlvbiBmYWlsCisjZGVmaW5lCUFVVEhfRkFJTF9LRVlTCQkJMHg1CQkJLy8gU2hhcmVkIGF1dGhlbnRpY2F0aW9uIGZhaWwKKyNkZWZpbmUJQVNTT0NfRkFJTAkJCQkweDYJCQkvLyBBc3NvY2lhdGlvbiBmYWlsZWQKKyNkZWZpbmUJRUFQX01JQ19GQUlMVVJFCQkJMHg3CQkJLy8gRGVhdXRoZW5jYXRpb24gYmVjYXVzZSBNSUMgZmFpbHVyZQorI2RlZmluZQlFQVBfNFdBWV9USU1FT1VUCQkweDgJCQkvLyBEZWF1dGhlbmNhdGlvbiBvbiA0LXdheSBoYW5kc2hha2UgdGltZW91dAorI2RlZmluZQlFQVBfR1JPVVBfS0VZX1RJTUVPVVQJMHg5CQkJLy8gRGVhdXRoZW5jYXRpb24gb24gZ3JvdXAga2V5IGhhbmRzaGFrZSB0aW1lb3V0CisjZGVmaW5lCUVBUF9TVUNDRVNTCQkJCTB4YQkJCS8vIEVBUCBzdWNjZWVkCisjZGVmaW5lCURFVEVDVF9SQURBUl9TSUdOQUwJCTB4YiAgICAgICAgIC8vIFJhZGFyIHNpZ25hbCBvY2N1ciBpbiBjdXJyZW50IGNoYW5uZWwKKyNkZWZpbmUgRVhUUkFfSU5GT19NQVgJCQkweGIJCQkvLyBJbmRpY2F0ZSBMYXN0IE9JRAorCisjZGVmaW5lIEVYVFJBX0lORk9fQ0xFQVIJCTB4ZmZmZmZmZmYKKworLy8gVGhpcyBpcyBPSUQgc2V0dGluZyBzdHJ1Y3R1cmUuIFNvIG9ubHkgR0Ygb3IgTU0gYXMgTW9kZS4gVGhpcyBpcyB2YWxpZCB3aGVuIG91ciB3aXJlbHNzIG1vZGUgaGFzIDgwMi4xMW4gaW4gdXNlLgordHlwZWRlZiBzdHJ1Y3QgeworCVJUXzgwMl8xMV9QSFlfTU9ERQkJUGh5TW9kZTsgCS8vCisJVUNIQVIJCVRyYW5zbWl0Tm87CisJVUNIQVIJCUh0TW9kZTsgCS8vSFRNT0RFX0dGIG9yIEhUTU9ERV9NTQorCVVDSEFSCQlFeHRPZmZzZXQ7CS8vZXh0ZW5zaW9uIGNoYW5uZWwgYWJvdmUgb3IgYmVsb3cKKwlVQ0hBUgkJTUNTOworCVVDSEFSICAgCUJXOworCVVDSEFSCQlTVEJDOworCVVDSEFSCQlTSE9SVEdJOworCVVDSEFSCQlyc3Y7Cit9IE9JRF9TRVRfSFRfUEhZTU9ERSwgKlBPSURfU0VUX0hUX1BIWU1PREU7CisKKyNpZmRlZiBOSU5URU5ET19BUAorI2RlZmluZSBOSU5URU5ET19NQVhfRU5UUlkgMTYKKyNkZWZpbmUgTklOVEVORE9fU1NJRF9OQU1FX0xOIDgKKyNkZWZpbmUgTklOVEVORE9fU1NJRF9OQU1FICJOV0NVU0JBUCIKKyNkZWZpbmUgTklOVEVORE9fUFJPQkVfUkVRX0ZMQUdfTUFTSyAweDAzCisjZGVmaW5lIE5JTlRFTkRPX1BST0JFX1JFUV9PTiAweDAxCisjZGVmaW5lIE5JTlRFTkRPX1BST0JFX1JFUV9TSUdOQUwgMHgwMgorI2RlZmluZSBOSU5URU5ET19QUk9CRV9SU1BfT04gMHgwMQorI2RlZmluZSBOSU5URU5ET19TU0lEX05JQ0tOQU1FX0xOIDIwCisKKyNkZWZpbmUgTklOVEVORE9fV0VQS0VZX0xOIDEzCisKK3R5cGVkZWYgc3RydWN0IF9OSU5URU5ET19TU0lECit7CisJVUNIQVIJTklOVEVORE9GaXhDaGFyW05JTlRFTkRPX1NTSURfTkFNRV9MTl07CisJVUNIQVIJemVybzE7CisJVUNIQVIJcmVnaXN0ZTsKKwlVQ0hBUglJRDsKKwlVQ0hBUgl6ZXJvMjsKKwlVQ0hBUglOSUNLbmFtZVtOSU5URU5ET19TU0lEX05JQ0tOQU1FX0xOXTsKK30gUlRfTklOVEVORE9fU1NJRCwgKlBSVF9OSU5URU5ET19TU0lEOworCit0eXBlZGVmIHN0cnVjdCBfTklOVEVORE9fRU5UUlkKK3sKKwlVQ0hBUglOSUNLbmFtZVtOSU5URU5ET19TU0lEX05JQ0tOQU1FX0xOXTsKKyAgICBVQ0hBUiAgIERTX0FkZHJbRVRIX0xFTkdUSF9PRl9BRERSRVNTXTsKKwlVQ0hBUglyZWdpc3RlOworCVVDSEFSCVVzZXJTcGFjZUFjazsKK30gUlRfTklOVEVORE9fRU5UUlksICpQUlRfTklOVEVORE9fRU5UUlk7CisKKy8vUlRQUklWX0lPQ1RMX05JTlRFTkRPX0dFVF9UQUJMRQorLy9SVFBSSVZfSU9DVExfTklOVEVORE9fU0VUX1RBQkxFCit0eXBlZGVmIHN0cnVjdCBfTklOVEVORE9fVEFCTEUKK3sKKwlVSU5UCQkJCW51bWJlcjsKKwlSVF9OSU5URU5ET19FTlRSWQllbnRyeVtOSU5URU5ET19NQVhfRU5UUlldOworfSBSVF9OSU5URU5ET19UQUJMRSwgKlBSVF9OSU5URU5ET19UQUJMRTsKKworLy9SVFBSSVZfSU9DVExfTklOVEVORE9fU0VFRF9XRVBLRVkKK3R5cGVkZWYgc3RydWN0IF9OSU5URU5ET19TRUVEX1dFUEtFWQoreworCVVDSEFSCXNlZWRbTklOVEVORE9fU1NJRF9OSUNLTkFNRV9MTl07CisJVUNIQVIJd2Vwa2V5WzE2XTsvL3VzZSAxMyBmb3IgMTA0IGJpdHMgd2VwIGtleQorfSBSVF9OSU5URU5ET19TRUVEX1dFUEtFWSwgKlBSVF9OSU5URU5ET19TRUVEX1dFUEtFWTsKKyNlbmRpZiAvLyBOSU5URU5ET19BUCAvLworCisjaWZkZWYgTExURF9TVVBQT1JUCit0eXBlZGVmIHN0cnVjdCBfUlRfTExURF9BU1NPSUNBVElPTl9FTlRSWSB7CisgICAgVUNIQVIgICAgICAgICAgIEFkZHJbRVRIX0xFTkdUSF9PRl9BRERSRVNTXTsKKyAgICB1bnNpZ25lZCBzaG9ydCAgTU9SOyAgICAgICAgLy8gbWF4aW11bSBvcGVyYXRpb25hbCByYXRlCisgICAgVUNIQVIgICAgICAgICAgIHBoeU1vZGU7Cit9IFJUX0xMVERfQVNTT0lDQVRJT05fRU5UUlksICpQUlRfTExURF9BU1NPSUNBVElPTl9FTlRSWTsKKwordHlwZWRlZiBzdHJ1Y3QgX1JUX0xMVERfQVNTT0lDQVRJT05fVEFCTEUgeworICAgIHVuc2lnbmVkIGludCAgICAgICAgICAgICAgICBOdW07CisgICAgUlRfTExURF9BU1NPSUNBVElPTl9FTlRSWSAgIEVudHJ5W01BWF9OVU1CRVJfT0ZfTUFDXTsKK30gUlRfTExURF9BU1NPSUNBVElPTl9UQUJMRSwgKlBSVF9MTFREX0FTU09JQ0FUSU9OX1RBQkxFOworI2VuZGlmIC8vIExMVERfU1VQUE9SVCAvLworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisvL3J0Mjg2MCwga2F0aHkgMjAwNy0wMTE4CisvLyBzdHJ1Y3R1cmUgZm9yIERMUwordHlwZWRlZiBzdHJ1Y3QgX1JUXzgwMl8xMV9ETFNfVUkgeworCVVTSE9SVAkJCQkJCVRpbWVPdXQ7CQkvLyB1bml0OiBzZWNvbmQgLCBzZXQgYnkgVUkKKwlVU0hPUlQJCQkJCQlDb3VudERvd25UaW1lcjsJLy8gdW5pdDogc2Vjb25kICwgdXNlZCBieSBkcml2ZXIgb25seQorCU5ESVNfODAyXzExX01BQ19BRERSRVNTCQlNYWNBZGRyOwkJLy8gc2V0IGJ5IFVJCisJVUNIQVIJCQkJCQlTdGF0dXM7CQkJLy8gMDogbm9uZSAsIDE6IHdhaXQgU1RBa2V5LCAyOiBmaW5pc2ggRExTIHNldHVwICwgc2V0IGJ5IGRyaXZlciBvbmx5CisJQk9PTEVBTgkJCQkJCVZhbGlkOwkJCS8vIDE6IHZhbGlkICwgMDogaW52YWxpZCAsIHNldCBieSBVSSwgdXNlIHRvIHNldHVwIG9yIHRlYXIgZG93biBETFMgbGluaworfSBSVF84MDJfMTFfRExTX1VJLCAqUFJUXzgwMl8xMV9ETFNfVUk7CisKK3R5cGVkZWYgc3RydWN0IF9SVF84MDJfMTFfRExTX0lORk8geworCVJUXzgwMl8xMV9ETFNfVUkJRW50cnlbTUFYX05VTUJFUl9PRl9ETFNfRU5UUlldOworCVVDSEFSCQkJCW51bTsKK30gUlRfODAyXzExX0RMU19JTkZPLCAqUFJUXzgwMl8xMV9ETFNfSU5GTzsKKwordHlwZWRlZiBlbnVtIF9SVF84MDJfMTFfRExTX01PREUgeworICAgIERMU19OT05FLAorICAgIERMU19XQUlUX0tFWSwKKyAgICBETFNfRklOSVNICit9IFJUXzgwMl8xMV9ETFNfTU9ERTsKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyNpZm5kZWYgTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyNkZWZpbmUJUlRfQVNTT0NfRVZFTlRfRkxBRyAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDEKKyNkZWZpbmUJUlRfRElTQVNTT0NfRVZFTlRfRkxBRyAgICAgICAgICAgICAgICAgICAgICAweDAxMDIKKyNkZWZpbmUJUlRfUkVRSUVfRVZFTlRfRkxBRyAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDMKKyNkZWZpbmUJUlRfUkVTUElFX0VWRU5UX0ZMQUcgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDQKKyNkZWZpbmUJUlRfQVNTT0NJTkZPX0VWRU5UX0ZMQUcgICAgICAgICAgICAgICAgICAgICAweDAxMDUKKyNkZWZpbmUgUlRfUE1LSURDQU5EX0ZMQUcgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDYKKyNkZWZpbmUgUlRfSU5URVJGQUNFX0RPV04gICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDcKKyNkZWZpbmUgUlRfSU5URVJGQUNFX1VQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDgKKyNlbmRpZiAvLyBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCisjZGVmaW5lIE1BWF9DVVNUT01fTEVOIDEyOAorCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCit0eXBlZGVmIGVudW0gX1JUXzgwMl8xMV9EX0NMSUVOVF9NT0RFCit7CisgICBSdDgwMl8xMV9EX05vbmUsCisgICBSdDgwMl8xMV9EX0ZsZXhpYmxlLAorICAgUnQ4MDJfMTFfRF9TdHJpY3QsCit9IFJUXzgwMl8xMV9EX0NMSUVOVF9NT0RFLCAqUFJUXzgwMl8xMV9EX0NMSUVOVF9NT0RFOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCit0eXBlZGVmIHN0cnVjdCBfUlRfQ0hBTk5FTF9MSVNUX0lORk8KK3sKKwlVQ0hBUiBDaGFubmVsTGlzdFtNQVhfTlVNX09GX0NIU107ICAgLy8gbGlzdCBhbGwgc3VwcG9ydGVkIGNoYW5uZWxzIGZvciBzaXRlIHN1cnZleQorCVVDSEFSIENoYW5uZWxMaXN0TnVtOyAvLyBudW1iZXIgb2YgY2hhbm5lbCBpbiBDaGFubmVsTGlzdFtdCit9IFJUX0NIQU5ORUxfTElTVF9JTkZPLCAqUFJUX0NIQU5ORUxfTElTVF9JTkZPOworCisvLyBXU0MgY29uZmlndXJlZCBjcmVkZW50aWFsCit0eXBlZGVmCXN0cnVjdAlfV1NDX0NSRURFTlRJQUwKK3sKKwlORElTXzgwMl8xMV9TU0lECVNTSUQ7CQkJCS8vIG1hbmRhdG9yeQorCVVTSE9SVAkJCQlBdXRoVHlwZTsJCQkvLyBtYW5kYXRvcnksIDE6IG9wZW4sIDI6IHdwYS1wc2ssIDQ6IHNoYXJlZCwgODp3cGEsIDB4MTA6IHdwYTIsIDB4MjA6IHdwYTItcHNrCisJVVNIT1JUCQkJCUVuY3JUeXBlOwkJCS8vIG1hbmRhdG9yeSwgMTogbm9uZSwgMjogd2VwLCA0OiB0a2lwLCA4OiBhZXMKKwlVQ0hBUgkJCQlLZXlbNjRdOwkJCS8vIG1hbmRhdG9yeSwgTWF4aW11bSA2NCBieXRlCisJVVNIT1JUCQkJCUtleUxlbmd0aDsKKwlVQ0hBUgkJCQlNYWNBZGRyWzZdOwkJCS8vIG1hbmRhdG9yeSwgQVAgTUFDIGFkZHJlc3MKKwlVQ0hBUgkJCQlLZXlJbmRleDsJCQkvLyBvcHRpb25hbCwgZGVmYXVsdCBpcyAxCisJVUNIQVIJCQkJUnN2ZFszXTsJCQkvLyBNYWtlIGFsaWdubWVudAorfQlXU0NfQ1JFREVOVElBTCwgKlBXU0NfQ1JFREVOVElBTDsKKworLy8gV1NDIGNvbmZpZ3VyZWQgcHJvZmlsZXMKK3R5cGVkZWYJc3RydWN0CV9XU0NfUFJPRklMRQoreworCVVJTlQJCQlQcm9maWxlQ250OworCVdTQ19DUkVERU5USUFMCVByb2ZpbGVbOF07CQkJCS8vIFN1cHBvcnQgdXAgdG8gOCBwcm9maWxlcworfQlXU0NfUFJPRklMRSwgKlBXU0NfUFJPRklMRTsKKworCisjZW5kaWYgLy8gX09JRF9IXworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3J0Mjg3MC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9ydDI4NzAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMGFmNGI1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9ydDI4NzAuaApAQCAtMCwwICsxLDc2MSBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworI2lmbmRlZiBfX1JUMjg3MF9IX18KKyNkZWZpbmUgX19SVDI4NzBfSF9fCisKKy8vdXNiIGhlYWRlciBmaWxlcworI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorCisvKiBydG1wX2RlZi5oICovCisvLworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDUsMCkKKyNkZWZpbmUgQlVMS0FHR1JFX1pJU0UgICAgICAgICAgMTAwCisjZGVmaW5lIFJUMjhYWF9EUlZEQVRBX1NFVChfYSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2Jfc2V0X2ludGZkYXRhKF9hLCBwQWQpOworI2RlZmluZSBSVDI4WFhfUFVUX0RFVklDRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNiX3B1dF9kZXYKKyNkZWZpbmUgUlRVU0JfQUxMT0NfVVJCKGlzbykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzYl9hbGxvY191cmIoaXNvLCBHRlBfQVRPTUlDKQorI2RlZmluZSBSVFVTQl9TVUJNSVRfVVJCKHBVcmIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNiX3N1Ym1pdF91cmIocFVyYiwgR0ZQX0FUT01JQykKKyNkZWZpbmUJUlRVU0JfVVJCX0FMTE9DX0JVRkZFUihwVXNiX0RldiwgQnVmU2l6ZSwgcERtYV9hZGRyKSAgICAgICAgICAgICAgIHVzYl9idWZmZXJfYWxsb2MocFVzYl9EZXYsIEJ1ZlNpemUsIEdGUF9BVE9NSUMsIHBEbWFfYWRkcikKKyNkZWZpbmUJUlRVU0JfVVJCX0ZSRUVfQlVGRkVSKHBVc2JfRGV2LCBCdWZTaXplLCBwVHJhbnNmZXJCdWYsIERtYV9hZGRyKSAgIHVzYl9idWZmZXJfZnJlZShwVXNiX0RldiwgQnVmU2l6ZSwgcFRyYW5zZmVyQnVmLCBEbWFfYWRkcikKKyNlbHNlCisjZGVmaW5lIEJVTEtBR0dSRV9aSVNFICAgICAgICAgIDYwCisjZGVmaW5lIFJUMjhYWF9EUlZEQVRBX1NFVChfYSkKKyNkZWZpbmUgUlQyOFhYX1BVVF9ERVZJQ0UoZGV2X3ApCisjZGVmaW5lIFJUVVNCX0FMTE9DX1VSQihpc28pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2JfYWxsb2NfdXJiKGlzbykKKyNkZWZpbmUgUlRVU0JfU1VCTUlUX1VSQihwVXJiKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzYl9zdWJtaXRfdXJiKHBVcmIpCisjZGVmaW5lIFJUVVNCX1VSQl9BTExPQ19CVUZGRVIocFVzYl9EZXYsIEJ1ZlNpemUsIHBEbWFfYWRkcikgICAgICAgICAgICAgICBrbWFsbG9jKEJ1ZlNpemUsIEdGUF9BVE9NSUMpCisjZGVmaW5lCVJUVVNCX1VSQl9GUkVFX0JVRkZFUihwVXNiX0RldiwgQnVmU2l6ZSwgcFRyYW5zZmVyQnVmLCBEbWFfYWRkcikgICBrZnJlZShwVHJhbnNmZXJCdWYpCisjZW5kaWYKKworI2RlZmluZSBSWEJVTEtBR0dSRV9aSVNFICAgICAgICAxMgorI2RlZmluZSBNQVhfVFhCVUxLX0xJTUlUICAgICAgICAoTE9DQUxfVFhCVUZfU0laRSooQlVMS0FHR1JFX1pJU0UtMSkpCisjZGVmaW5lIE1BWF9UWEJVTEtfU0laRSAgICAgICAgIChMT0NBTF9UWEJVRl9TSVpFKkJVTEtBR0dSRV9aSVNFKQorI2RlZmluZSBNQVhfUlhCVUxLX1NJWkUgICAgICAgICAoTE9DQUxfVFhCVUZfU0laRSpSWEJVTEtBR0dSRV9aSVNFKQorI2RlZmluZSBNQVhfTUxNRV9IQU5ETEVSX01FTU9SWSAyMAorI2RlZmluZQlSRVRSWV9MSU1JVCAgICAgICAgICAgICAxMAorI2RlZmluZSBCVUZGRVJfU0laRQkJCQkyNDAwCS8vMjA0OAorI2RlZmluZQlUWF9SSU5HCQkJCQkweGEKKyNkZWZpbmUJUFJJT19SSU5HCQkJCTB4YworCisKKy8vIEZsYWdzIGZvciBCdWxrZmxhZ3MgY29udHJvbCBmb3IgYnVsayBvdXQgZGF0YQorLy8KKyNkZWZpbmUJZlJUVVNCX0JVTEtfT1VUX0RBVEFfTlVMTAkJCQkweDAwMDAwMDAxCisjZGVmaW5lIGZSVFVTQl9CVUxLX09VVF9SVFMJCQkJCQkweDAwMDAwMDAyCisjZGVmaW5lCWZSVFVTQl9CVUxLX09VVF9NTE1FCQkJCQkweDAwMDAwMDA0CisKKyNkZWZpbmUJZlJUVVNCX0JVTEtfT1VUX0RBVEFfTk9STUFMCQkJCTB4MDAwMTAwMDAKKyNkZWZpbmUJZlJUVVNCX0JVTEtfT1VUX0RBVEFfTk9STUFMXzIJCQkweDAwMDIwMDAwCisjZGVmaW5lCWZSVFVTQl9CVUxLX09VVF9EQVRBX05PUk1BTF8zCQkJMHgwMDA0MDAwMAorI2RlZmluZQlmUlRVU0JfQlVMS19PVVRfREFUQV9OT1JNQUxfNAkJCTB4MDAwODAwMDAKKworI2RlZmluZQlmUlRVU0JfQlVMS19PVVRfUFNQT0xMCQkJCQkweDAwMDAwMDIwCisjZGVmaW5lCWZSVFVTQl9CVUxLX09VVF9EQVRBX0ZSQUcJCQkJMHgwMDAwMDA0MAorI2RlZmluZQlmUlRVU0JfQlVMS19PVVRfREFUQV9GUkFHXzIJCQkJMHgwMDAwMDA4MAorI2RlZmluZQlmUlRVU0JfQlVMS19PVVRfREFUQV9GUkFHXzMJCQkJMHgwMDAwMDEwMAorI2RlZmluZQlmUlRVU0JfQlVMS19PVVRfREFUQV9GUkFHXzQJCQkJMHgwMDAwMDIwMAorCisjaWZkZWYgUkFMSU5LX0FURQorI2RlZmluZQlmUlRVU0JfQlVMS19PVVRfREFUQV9BVEUJCQkJMHgwMDEwMDAwMAorI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKworI2RlZmluZSBSVDI4NzBfVVNCX0RFVklDRVMJXAorewlcCisJe1VTQl9ERVZJQ0UoMHgxNDhGLDB4Mjc3MCl9LCAvKiBSYWxpbmsgKi8JCVwKKwl7VVNCX0RFVklDRSgweDE0OEYsMHgyODcwKX0sIC8qIFJhbGluayAqLwkJXAorCXtVU0JfREVWSUNFKDB4MTQ4RiwweDMwNzApfSwgLyogUmFsaW5rICovCQlcCisJe1VTQl9ERVZJQ0UoMHgwQjA1LDB4MTczMSl9LCAvKiBBc3VzICovCQkJXAorCXtVU0JfREVWSUNFKDB4MEIwNSwweDE3MzIpfSwgLyogQXN1cyAqLwkJCVwKKwl7VVNCX0RFVklDRSgweDBCMDUsMHgxNzQyKX0sIC8qIEFzdXMgKi8JCQlcCisJe1VTQl9ERVZJQ0UoMHgwREY2LDB4MDAxNyl9LCAvKiBTaXRlY29tICovCQlcCisJe1VTQl9ERVZJQ0UoMHgwREY2LDB4MDAyQil9LCAvKiBTaXRlY29tICovCQlcCisJe1VTQl9ERVZJQ0UoMHgwREY2LDB4MDAyQyl9LCAvKiBTaXRlY29tICovCQlcCisJe1VTQl9ERVZJQ0UoMHgwREY2LDB4MDAyRCl9LCAvKiBTaXRlY29tICovCQlcCisJe1VTQl9ERVZJQ0UoMHgxNEIyLDB4M0MwNil9LCAvKiBDb25jZXB0cm9uaWMgKi8JCVwKKwl7VVNCX0RFVklDRSgweDE0QjIsMHgzQzI4KX0sIC8qIENvbmNlcHRyb25pYyAqLwkJXAorCXtVU0JfREVWSUNFKDB4MjAxOSwweEVEMDYpfSwgLyogUGxhbmV4IENvbW11bmljYXRpb25zLCBJbmMuICovCQlcCisJe1VTQl9ERVZJQ0UoMHgyMDE5LDB4QUIyNSl9LCAvKiBQbGFuZXggQ29tbXVuaWNhdGlvbnMsIEluYy4gUlQzMDcwICovCQlcCisJe1VTQl9ERVZJQ0UoMHgwN0QxLDB4M0MwOSl9LCAvKiBELUxpbmsgKi8JCVwKKwl7VVNCX0RFVklDRSgweDA3RDEsMHgzQzExKX0sIC8qIEQtTGluayAqLwkJXAorCXtVU0JfREVWSUNFKDB4MTRCMiwweDNDMDcpfSwgLyogQUwgKi8JCQlcCisJe1VTQl9ERVZJQ0UoMHgxNEIyLDB4M0MxMil9LCAvKiBBTCAqLyAgICAgICAgICAgXAorCXtVU0JfREVWSUNFKDB4MDUwRCwweDgwNTMpfSwgLyogQmVsa2luICovCQlcCisJe1VTQl9ERVZJQ0UoMHgxNEIyLDB4M0MyMyl9LCAvKiBBaXJsaW5rICovCQlcCisJe1VTQl9ERVZJQ0UoMHgxNEIyLDB4M0MyNyl9LCAvKiBBaXJsaW5rICovCQlcCisJe1VTQl9ERVZJQ0UoMHgwN0FBLDB4MDAyRil9LCAvKiBDb3JlZ2EgKi8JCVwKKwl7VVNCX0RFVklDRSgweDA3QUEsMHgwMDNDKX0sIC8qIENvcmVnYSAqLwkJXAorCXtVU0JfREVWSUNFKDB4MDdBQSwweDAwM0YpfSwgLyogQ29yZWdhICovCQlcCisJe1VTQl9ERVZJQ0UoMHgxOEM1LDB4MDAxMil9LCAvKiBDb3JlZ2EgKi8JCVwKKwl7VVNCX0RFVklDRSgweDEwNDQsMHg4MDBCKX0sIC8qIEdpZ2FieXRlICovCQlcCisJe1VTQl9ERVZJQ0UoMHgxNUE5LDB4MDAwNil9LCAvKiBTcGFya2xhbiAqLwkJXAorCXtVU0JfREVWSUNFKDB4MDgzQSwweEI1MjIpfSwgLyogU01DICovCQkJXAorCXtVU0JfREVWSUNFKDB4MDgzQSwweEE2MTgpfSwgLyogU01DICovCQkJXAorCXtVU0JfREVWSUNFKDB4MDgzQSwweDc1MjIpfSwgLyogQXJjYWR5YW4gKi8JCVwKKwl7VVNCX0RFVklDRSgweDBDREUsMHgwMDIyKX0sIC8qIFpDT00gKi8JCQlcCisJe1VTQl9ERVZJQ0UoMHgwNTg2LDB4MzQxNil9LCAvKiBaeXhlbCAqLwkJXAorCXtVU0JfREVWSUNFKDB4MENERSwweDAwMjUpfSwgLyogWnl4ZWwgKi8JCVwKKwl7VVNCX0RFVklDRSgweDE3NDAsMHg5NzAxKX0sIC8qIEVuR2VuaXVzICovCQlcCisJe1VTQl9ERVZJQ0UoMHgxNzQwLDB4OTcwMil9LCAvKiBFbkdlbml1cyAqLwkJXAorCXtVU0JfREVWSUNFKDB4MDQ3MSwweDIwMGYpfSwgLyogUGhpbGlwcyAqLwkJXAorCXtVU0JfREVWSUNFKDB4MTRCMiwweDNDMjUpfSwgLyogRHJheXRlayAqLwkJXAorCXtVU0JfREVWSUNFKDB4MTNEMywweDMyNDcpfSwgLyogQXp1cmVXYXZlICovCVwKKwl7VVNCX0RFVklDRSgweDA4M0EsMHg2NjE4KX0sIC8qIEFjY3RvbiAqLwkJXAorCXtVU0JfREVWSUNFKDB4MTVjNSwweDAwMDgpfSwgLyogQW1pdCAqLwkJCVwKKwl7VVNCX0RFVklDRSgweDBFNjYsMHgwMDAxKX0sIC8qIEhhd2tpbmcgKi8JCVwKKwl7VVNCX0RFVklDRSgweDBFNjYsMHgwMDAzKX0sIC8qIEhhd2tpbmcgKi8JCVwKKwl7VVNCX0RFVklDRSgweDEyOUIsMHgxODI4KX0sIC8qIFNpZW1lbnMgKi8JCVwKKwl7VVNCX0RFVklDRSgweDE1N0UsMHgzMDBFKX0sCS8qIFUtTWVkaWEgKi8JXAorCXtVU0JfREVWSUNFKDB4MDUwZCwweDgwNWMpfSwJCQkJCVwKKwl7VVNCX0RFVklDRSgweDE0ODIsMHgzQzA5KX0sIC8qIEFib2NvbSovCQlcCisJe1VTQl9ERVZJQ0UoMHgxNEIyLDB4M0MwOSl9LCAvKiBBbHBoYSAqLwkJXAorCXtVU0JfREVWSUNFKDB4MDRFOCwweDIwMTgpfSwgLyogc2Ftc3VuZyAqLyAgCVwKKwl7VVNCX0RFVklDRSgweDA3QjgsMHgzMDcwKX0sIC8qIEFib0NvbSAqLwkJXAorCXtVU0JfREVWSUNFKDB4MDdCOCwweDMwNzEpfSwgLyogQWJvQ29tICovCQlcCisJe1VTQl9ERVZJQ0UoMHgwN0I4LDB4Mjg3MCl9LCAvKiBBYm9Db20gKi8JCVwKKwl7VVNCX0RFVklDRSgweDA3QjgsMHgyNzcwKX0sIC8qIEFib0NvbSAqLwkJXAorCXtVU0JfREVWSUNFKDB4NzM5MiwweDc3MTEpfSwgLyogRWRpbWF4ICovCQlcCisJe1VTQl9ERVZJQ0UoMHg1QTU3LDB4MDI4MCl9LCAvKiBaaW53ZWxsICovCQlcCisJe1VTQl9ERVZJQ0UoMHg1QTU3LDB4MDI4Mil9LCAvKiBaaW53ZWxsICovCQlcCisJe1VTQl9ERVZJQ0UoMHgwNzg5LDB4MDE2Mil9LCAvKiBMb2dpdGVjICovCQlcCisJe1VTQl9ERVZJQ0UoMHgwNzg5LDB4MDE2Myl9LCAvKiBMb2dpdGVjICovCQlcCisJe1VTQl9ERVZJQ0UoMHgwNzg5LDB4MDE2NCl9LCAvKiBMb2dpdGVjICovCQlcCisJeyB9LyogVGVybWluYXRpbmcgZW50cnkgKi8gICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjZGVmaW5lCUZSRUVfSFRUWF9SSU5HKF9wLCBfYiwgX3QpCQkJXAorewkJCQkJCQkJCQlcCisJaWYgKChfdCktPkVOZXh0QnVsa091dFBvc2l0aW9uID09IChfdCktPkN1cldyaXRlUG9zaXRpb24pCQkJCVwKKwl7CQkJCQkJCQkJCQkJCQkJCQlcCisJCShfdCktPmJSaW5nRW1wdHkgPSBUUlVFOwkJCVwKKwl9CQkJCQkJCQkJCQkJCQkJCQlcCisJLypOZGlzSW50ZXJsb2NrZWREZWNyZW1lbnQoJihfcCktPlR4Q291bnQpOyAqL1wKK30KKworLy8KKy8vIFJYSU5GTyBhcHBlbmRzIGF0IHRoZSBlbmQgb2YgZWFjaCByeCBwYWNrZXQuCisvLworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJc3RydWN0CVBBQ0tFRCBfUlhJTkZPX1NUUlVDIHsKKwlVSU5UMzIJCVBsY3BTaWduYWw6MTI7CisJVUlOVDMyCQlMYXN0QU1TRFU6MTsKKwlVSU5UMzIJCUNpcGhlckFsZzoxOworCVVJTlQzMgkJUGxjcFJzc2lsOjE7CisJVUlOVDMyCQlEZWNyeXB0ZWQ6MTsKKwlVSU5UMzIJCUFNUERVOjE7CQkvLyBUbyBiZSBtb3ZlZAorCVVJTlQzMgkJTDJQQUQ6MTsKKwlVSU5UMzIJCVJTU0k6MTsKKwlVSU5UMzIJCUhUQzoxOworCVVJTlQzMgkJQU1TRFU6MTsJCS8vIHJ4IHdpdGggODAyLjMgaGVhZGVyLCBub3QgODAyLjExIGhlYWRlci4KKwlVSU5UMzIJCUNpcGhlckVycjoyOyAgICAgICAgLy8gMDogZGVjcnlwdGlvbiBva2F5LCAxOklDViBlcnJvciwgMjpNSUMgZXJyb3IsIDM6S0VZIG5vdCB2YWxpZAorCVVJTlQzMgkJQ3JjOjE7ICAgICAgICAgICAgICAvLyAxOiBDUkMgZXJyb3IKKwlVSU5UMzIJCU15QnNzOjE7ICAJLy8gMTogdGhpcyBmcmFtZSBiZWxvbmdzIHRvIHRoZSBzYW1lIEJTU0lECisJVUlOVDMyCQlCY2FzdDoxOyAgICAgICAgICAgIC8vIDE6IHRoaXMgaXMgYSBicm9hZGNhc3QgZnJhbWUKKwlVSU5UMzIJCU1jYXN0OjE7ICAgICAgICAgICAgLy8gMTogdGhpcyBpcyBhIG11bHRpY2FzdCBmcmFtZQorCVVJTlQzMgkJVTJNOjE7ICAgICAgICAgICAgICAvLyAxOiB0aGlzIFJYIGZyYW1lIGlzIHVuaWNhc3QgdG8gbWUKKwlVSU5UMzIJCUZSQUc6MTsKKwlVSU5UMzIJCU5VTExEQVRBOjE7CisJVUlOVDMyCQlEQVRBOjE7CisJVUlOVDMyCQlCQToxOworfQlSWElORk9fU1RSVUMsICpQUlhJTkZPX1NUUlVDLCBSVDI4WFhfUlhEX1NUUlVDLCAqUFJUMjhYWF9SWERfU1RSVUM7CisjZWxzZQordHlwZWRlZglzdHJ1Y3QJUEFDS0VEIF9SWElORk9fU1RSVUMgeworCVVJTlQzMgkJQkE6MTsKKwlVSU5UMzIJCURBVEE6MTsKKwlVSU5UMzIJCU5VTExEQVRBOjE7CisJVUlOVDMyCQlGUkFHOjE7CisJVUlOVDMyCQlVMk06MTsgICAgICAgICAgICAgIC8vIDE6IHRoaXMgUlggZnJhbWUgaXMgdW5pY2FzdCB0byBtZQorCVVJTlQzMgkJTWNhc3Q6MTsgICAgICAgICAgICAvLyAxOiB0aGlzIGlzIGEgbXVsdGljYXN0IGZyYW1lCisJVUlOVDMyCQlCY2FzdDoxOyAgICAgICAgICAgIC8vIDE6IHRoaXMgaXMgYSBicm9hZGNhc3QgZnJhbWUKKwlVSU5UMzIJCU15QnNzOjE7ICAJLy8gMTogdGhpcyBmcmFtZSBiZWxvbmdzIHRvIHRoZSBzYW1lIEJTU0lECisJVUlOVDMyCQlDcmM6MTsgICAgICAgICAgICAgIC8vIDE6IENSQyBlcnJvcgorCVVJTlQzMgkJQ2lwaGVyRXJyOjI7ICAgICAgICAvLyAwOiBkZWNyeXB0aW9uIG9rYXksIDE6SUNWIGVycm9yLCAyOk1JQyBlcnJvciwgMzpLRVkgbm90IHZhbGlkCisJVUlOVDMyCQlBTVNEVToxOwkJLy8gcnggd2l0aCA4MDIuMyBoZWFkZXIsIG5vdCA4MDIuMTEgaGVhZGVyLgorCVVJTlQzMgkJSFRDOjE7CisJVUlOVDMyCQlSU1NJOjE7CisJVUlOVDMyCQlMMlBBRDoxOworCVVJTlQzMgkJQU1QRFU6MTsJCS8vIFRvIGJlIG1vdmVkCisJVUlOVDMyCQlEZWNyeXB0ZWQ6MTsKKwlVSU5UMzIJCVBsY3BSc3NpbDoxOworCVVJTlQzMgkJQ2lwaGVyQWxnOjE7CisJVUlOVDMyCQlMYXN0QU1TRFU6MTsKKwlVSU5UMzIJCVBsY3BTaWduYWw6MTI7Cit9CVJYSU5GT19TVFJVQywgKlBSWElORk9fU1RSVUMsIFJUMjhYWF9SWERfU1RSVUMsICpQUlQyOFhYX1JYRF9TVFJVQzsKKyNlbmRpZgorCisKKy8vCisvLyBUWElORk8KKy8vCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZglzdHJ1Y3QJX1RYSU5GT19TVFJVQyB7CisJLy8gV29yZAkwCisJVUlOVDMyCQlVU0JETUFUeGJ1cnN0OjE7Ly91c2VkIE9OTFkgaW4gVVNCIGJ1bGsgQWdncmUuIEZvcmNlIFVTQiBETUEgdHJhbnNtaXQgZnJhbWUgZnJvbSBjdXJyZW50IHNlbGVjdGVkIGVuZHBvaW50CisJVUlOVDMyCQlVU0JETUFOZXh0VkxEOjE7CS8vdXNlZCBPTkxZIGluIFVTQiBidWxrIEFnZ3JlZ2F0aW9uLCBOZXh0VmFsaWQKKwlVSU5UMzIJCXJzdjI6MjsgIC8vIFNvZnR3YXJlIHVzZS4KKwlVSU5UMzIJCVN3VXNlTGFzdFJvdW5kOjE7IC8vIFNvZnR3YXJlIHVzZS4KKwlVSU5UMzIJCVFTRUw6MjsJLy8gc2VsZWN0IG9uLWNoaXAgRklGTyBJRCBmb3IgMm5kLXN0YWdlIG91dHB1dCBzY2hlZHVsZXIuMDpNR01ULCAxOkhDQ0EgMjpFRENBCisJVUlOVDMyCQlXSVY6MTsJLy8gV2lyZWxlc3MgSW5mbyBWYWxpZC4gMSBpZiBEcml2ZXIgYWxyZWFkeSBmaWxsIFdJLCAgbyBpZiBETUEgbmVlZHMgdG8gY29weSBXSSB0byBjb3JyZWN0cG9zaXRpb24KKwlVSU5UMzIJCXJzdjo4OworCVVJTlQzMgkJVVNCRE1BVHhQa3RMZW46MTY7CS8vdXNlZCBPTkxZIGluIFVTQiBidWxrIEFnZ3JlZ2F0aW9uLCAgVG90YWwgYnl0ZSBjb3VudHMgb2YgYWxsIHN1Yi1mcmFtZS4KK30JVFhJTkZPX1NUUlVDLCAqUFRYSU5GT19TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXN0cnVjdAlfVFhJTkZPX1NUUlVDIHsKKwkvLyBXb3JkCTAKKwlVSU5UMzIJCVVTQkRNQVR4UGt0TGVuOjE2OwkvL3VzZWQgT05MWSBpbiBVU0IgYnVsayBBZ2dyZWdhdGlvbiwgIFRvdGFsIGJ5dGUgY291bnRzIG9mIGFsbCBzdWItZnJhbWUuCisJVUlOVDMyCQlyc3Y6ODsKKwlVSU5UMzIJCVdJVjoxOwkvLyBXaXJlbGVzcyBJbmZvIFZhbGlkLiAxIGlmIERyaXZlciBhbHJlYWR5IGZpbGwgV0ksICBvIGlmIERNQSBuZWVkcyB0byBjb3B5IFdJIHRvIGNvcnJlY3Rwb3NpdGlvbgorCVVJTlQzMgkJUVNFTDoyOwkvLyBzZWxlY3Qgb24tY2hpcCBGSUZPIElEIGZvciAybmQtc3RhZ2Ugb3V0cHV0IHNjaGVkdWxlci4wOk1HTVQsIDE6SENDQSAyOkVEQ0EKKwlVSU5UMzIJCVN3VXNlTGFzdFJvdW5kOjE7IC8vIFNvZnR3YXJlIHVzZS4KKwlVSU5UMzIJCXJzdjI6MjsgIC8vIFNvZnR3YXJlIHVzZS4KKwlVSU5UMzIJCVVTQkRNQU5leHRWTEQ6MTsJLy91c2VkIE9OTFkgaW4gVVNCIGJ1bGsgQWdncmVnYXRpb24sIE5leHRWYWxpZAorCVVJTlQzMgkJVVNCRE1BVHhidXJzdDoxOy8vdXNlZCBPTkxZIGluIFVTQiBidWxrIEFnZ3JlLiBGb3JjZSBVU0IgRE1BIHRyYW5zbWl0IGZyYW1lIGZyb20gY3VycmVudCBzZWxlY3RlZCBlbmRwb2ludAorfQlUWElORk9fU1RSVUMsICpQVFhJTkZPX1NUUlVDOworI2VuZGlmCisKKyNkZWZpbmUgVFhJTkZPX1NJWkUJCQkJNAorI2RlZmluZSBSWElORk9fU0laRQkJCQk0CisjZGVmaW5lIFRYUEFERElOR19TSVpFCQkJMTEKKworLy8KKy8vIE1hbmFnZW1lbnQgcmluZyBidWZmZXIgZm9ybWF0CisvLwordHlwZWRlZglzdHJ1Y3QJX01HTVRfU1RSVUMJeworCUJPT0xFQU4JCVZhbGlkOworCVBVQ0hBUgkJcEJ1ZmZlcjsKKwlVTE9ORwkJTGVuZ3RoOworfQlNR01UX1NUUlVDLCAqUE1HTVRfU1RSVUM7CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0gRUVQUk9NIFJlbGF0ZWQgTUFDUk8gLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyNkZWZpbmUgUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBvZmZzZXQsIHZhcikJCQkJCVwKKwlkbyB7CQkJCQkJCQkJCQkJCQlcCisJCVJUVVNCUmVhZEVFUFJPTShwQWQsIG9mZnNldCwgKFBVQ0hBUikmKHZhciksIDIpOwkJXAorCQl2YXIgPSBsZTJjcHUxNih2YXIpOwkJCQkJCQkJCVwKKwl9d2hpbGUoMCkKKworI2RlZmluZSBSVDI4eHhfRUVQUk9NX1dSSVRFMTYocEFkLCBvZmZzZXQsIHZhcikJCQkJCVwKKwlkb3sJCQkJCQkJCQkJCQkJCQlcCisJCVVTSE9SVCBfdG1wVmFyOwkJCQkJCQkJCQkJXAorCQlfdG1wVmFyID0gY3B1MmxlMTYodmFyKTsJCQkJCQkJCVwKKwkJUlRVU0JXcml0ZUVFUFJPTShwQWQsIG9mZnNldCwgKFBVQ0hBUikmKF90bXBWYXIpLCAyKTsJXAorCX13aGlsZSgwKQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLSBUQVNLL1RIUkVBRCBSZWxhdGVkIE1BQ1JPIC0tLS0tLS0tLS0tLS0tLS0tICovCisjZGVmaW5lIFJUMjhYWF9UQVNLX1RIUkVBRF9JTklUKHBBZCwgU3RhdHVzKQkJXAorCVN0YXR1cyA9IENyZWF0ZVRocmVhZHMobmV0X2Rldik7CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0gRnJpbXdhcmUgUmVsYXRlZCBNQUNSTyAtLS0tLS0tLS0tLS0tLS0tLSAqLworI2lmIDAKKyNkZWZpbmUgUlQyOFhYX0ZJUk1VRF9JTklUKHBBZCkJCVwKKwl7CVVJTlQzMglNYWNSZWc7CQkJCVwKKwkJUlRVU0JSZWFkTUFDUmVnaXN0ZXIocEFkLCBNQUNfQ1NSMCwgJk1hY1JlZyk7IH0KKworI2RlZmluZSBSVDI4WFhfRklSTVVEX0VORChwQWQpCVwKKwlSVFVTQldyaXRlTUFDUmVnaXN0ZXIocEFkLCAweDcwMTQsIDB4ZmZmZmZmZmYpOwlcCisJUlRVU0JXcml0ZU1BQ1JlZ2lzdGVyKHBBZCwgMHg3MDFjLCAweGZmZmZmZmZmKTsJXAorCVJUVVNCRmlybXdhcmVSdW4ocEFkKTsKKyNlbHNlCisjZGVmaW5lIFJUMjhYWF9XUklURV9GSVJNV0FSRShfcEFkLCBfcEZ3SW1hZ2UsIF9Gd0xlbikJCVwKKwlSVFVTQkZpcm13YXJlV3JpdGUoX3BBZCwgX3BGd0ltYWdlLCBfRndMZW4pCisjZW5kaWYKKworLyogLS0tLS0tLS0tLS0tLS0tLS0gVFggUmVsYXRlZCBNQUNSTyAtLS0tLS0tLS0tLS0tLS0tLSAqLworI2RlZmluZSBSVDI4WFhfU1RBUlRfREVRVUVVRShwQWQsIFF1ZUlkeCwgaXJxRmxhZ3MpCQkJCVwKKwkJCXsJCQkJCQkJCQkJCQkJXAorCQkJCVJUTVBfSVJRX0xPQ0soJnBBZC0+RGVRdWV1ZUxvY2tbUXVlSWR4XSwgaXJxRmxhZ3MpOwkJXAorCQkJCWlmIChwQWQtPkRlUXVldWVSdW5uaW5nW1F1ZUlkeF0pCQkJCQkJXAorCQkJCXsJCQkJCQkJCQkJCQkJCVwKKwkJCQkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPkRlUXVldWVMb2NrW1F1ZUlkeF0sIGlycUZsYWdzKTtcCisJCQkJCXByaW50aygiRGVRdWV1ZVJ1bm5pbmdbJWRdPSBUUlVFIVxuIiwgUXVlSWR4KTsJCVwKKwkJCQkJY29udGludWU7CQkJCQkJCQkJCQlcCisJCQkJfQkJCQkJCQkJCQkJCQkJXAorCQkJCWVsc2UJCQkJCQkJCQkJCQkJXAorCQkJCXsJCQkJCQkJCQkJCQkJCVwKKwkJCQkJcEFkLT5EZVF1ZXVlUnVubmluZ1tRdWVJZHhdID0gVFJVRTsJCQkJCVwKKwkJCQkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPkRlUXVldWVMb2NrW1F1ZUlkeF0sIGlycUZsYWdzKTtcCisJCQkJfQkJCQkJCQkJCQkJCQkJXAorCQkJfQorI2RlZmluZSBSVDI4WFhfU1RPUF9ERVFVRVVFKHBBZCwgUXVlSWR4LCBpcnFGbGFncykJCQkJCQlcCisJCQlkb3sJCQkJCQkJCQkJCQkJCQlcCisJCQkJUlRNUF9JUlFfTE9DSygmcEFkLT5EZVF1ZXVlTG9ja1tRdWVJZHhdLCBpcnFGbGFncyk7CQlcCisJCQkJcEFkLT5EZVF1ZXVlUnVubmluZ1tRdWVJZHhdID0gRkFMU0U7CQkJCQlcCisJCQkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPkRlUXVldWVMb2NrW1F1ZUlkeF0sIGlycUZsYWdzKTsJXAorCQkJfXdoaWxlKDApCisKKworI2RlZmluZQlSVDI4WFhfSEFTX0VOT1VHSF9GUkVFX0RFU0MocEFkLCBwVHhCbGssIGZyZWVOdW0sIHBQYWNrZXQpIFwKKwkJKFJUVVNCRnJlZURlc2NyaXB0b3JSZXF1ZXN0KHBBZCwgcFR4QmxrLT5RdWVJZHgsIChwVHhCbGstPlRvdGFsRnJhbWVMZW4gKyBHRVRfT1NfUEtUX0xFTihwUGFja2V0KSkpID09IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisKKyNkZWZpbmUgUlQyOFhYX1JFTEVBU0VfREVTQ19SRVNPVVJDRShwQWQsIFF1ZUlkeCkJCQlcCisJCWRve313aGlsZSgwKQorCisjZGVmaW5lIE5FRURfUVVFVUVfQkFDS19GT1JfQUdHKF9wQWQsIF9RdWVJZHgsIF9mcmVlTnVtLCBfVHhGcmFtZVR5cGUpIAkJXAorCQkoKF9UeEZyYW1lVHlwZSA9PSBUWF9SQUxJTktfRlJBTUUpICYmIChSVFVTQk5lZWRRdWV1ZUJhY2tGb3JBZ2coX3BBZCwgX1F1ZUlkeCkpKQorCisKKworI2RlZmluZSBmUlRNUF9BREFQVEVSX05FRURfU1RPUF9UWAkJXAorCQkoZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUIHwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwJXAorCQkgZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUyB8IGZSVE1QX0FEQVBURVJfQlVMS09VVF9SRVNFVCB8IFwKKwkJIGZSVE1QX0FEQVBURVJfUkFESU9fT0ZGIHwgZlJUTVBfQURBUFRFUl9SRU1PVkVfSU5fUFJPR1JFU1MpCisKKworI2RlZmluZSBIQUxfV3JpdGVTdWJUeFJlc291cmNlKHBBZCwgcFR4QmxrLCBiSXNMYXN0LCBwRnJlZU51bWJlcikJXAorCQkJUnRtcFVTQl9Xcml0ZVN1YlR4UmVzb3VyY2UocEFkLCBwVHhCbGssIGJJc0xhc3QsIHBGcmVlTnVtYmVyKQorCisjZGVmaW5lIEhBTF9Xcml0ZVR4UmVzb3VyY2UocEFkLCBwVHhCbGssYklzTGFzdCwgcEZyZWVOdW1iZXIpCVwKKwkJCVJ0bXBVU0JfV3JpdGVTaW5nbGVUeFJlc291cmNlKHBBZCwgcFR4QmxrLGJJc0xhc3QsIHBGcmVlTnVtYmVyKQorCisjZGVmaW5lIEhBTF9Xcml0ZUZyYWdUeFJlc291cmNlKHBBZCwgcFR4QmxrLCBmcmFnTnVtLCBwRnJlZU51bWJlcikgXAorCQkJUnRtcFVTQl9Xcml0ZUZyYWdUeFJlc291cmNlKHBBZCwgcFR4QmxrLCBmcmFnTnVtLCBwRnJlZU51bWJlcikKKworI2RlZmluZSBIQUxfV3JpdGVNdWx0aVR4UmVzb3VyY2UocEFkLCBwVHhCbGssZnJhbWVOdW0sIHBGcmVlTnVtYmVyKQlcCisJCQlSdG1wVVNCX1dyaXRlTXVsdGlUeFJlc291cmNlKHBBZCwgcFR4QmxrLGZyYW1lTnVtLCBwRnJlZU51bWJlcikKKworI2RlZmluZSBIQUxfRmluYWxXcml0ZVR4UmVzb3VyY2UocEFkLCBwVHhCbGssIHRvdGFsTVBEVVNpemUsIFR4SWR4KQlcCisJCQlSdG1wVVNCX0ZpbmFsV3JpdGVUeFJlc291cmNlKHBBZCwgcFR4QmxrLCB0b3RhbE1QRFVTaXplLCBUeElkeCkKKworI2RlZmluZSBIQUxfTGFzdFR4SWR4KHBBZCwgUXVlSWR4LFR4SWR4KSBcCisJCQkvKlJ0bXBVU0JEYXRhTGFzdFR4SWR4KHBBZCwgUXVlSWR4LFR4SWR4KSovCisKKyNkZWZpbmUgSEFMX0tpY2tPdXRUeChwQWQsIHBUeEJsaywgUXVlSWR4KQlcCisJCQlSdG1wVVNCRGF0YUtpY2tPdXQocEFkLCBwVHhCbGssIFF1ZUlkeCkKKworCisjZGVmaW5lIEhBTF9LaWNrT3V0TWdtdFR4KHBBZCwgUXVlSWR4LCBwUGFja2V0LCBwU3JjQnVmVkEsIFNyY0J1ZkxlbikJXAorCQkJUnRtcFVTQk1nbXRLaWNrT3V0KHBBZCwgUXVlSWR4LCBwUGFja2V0LCBwU3JjQnVmVkEsIFNyY0J1ZkxlbikKKworI2RlZmluZSBIQUxfS2lja091dE51bGxGcmFtZVR4KF9wQWQsIF9RdWVJZHgsIF9wTnVsbEZyYW1lLCBfZnJhbWVMZW4pCVwKKwkJCVJ0bXBVU0JOdWxsRnJhbWVLaWNrT3V0KF9wQWQsIF9RdWVJZHgsIF9wTnVsbEZyYW1lLCBfZnJhbWVMZW4pCisKKyNkZWZpbmUgUlRNUF9QS1RfVEFJTF9QQURESU5HIAkxMSAvLyAzKG1heCA0IGJ5dGUgcGFkZGluZykgKyA0IChsYXN0IHBhY2tldCBwYWRkaW5nKSArIDQgKE1heEJ1bGtPdXRzaXplIGFsaWduIHBhZGRpbmcpCisKK2V4dGVybiBVQ0hBUiBFcFRvUXVldWVbNl07CisKKworI2lmZGVmIFJUMjg3MAorI2RlZmluZSBHRVRfVFhSSU5HX0ZSRUVOTyhfcEFkLCBfUXVlSWR4KSAJKF9RdWVJZHgpIC8vKF9wQWQtPlR4UmluZ1tfUXVlSWR4XS5UeFN3RnJlZUlkeCkKKyNkZWZpbmUgR0VUX01HTVRSSU5HX0ZSRUVOTyhfcEFkKSAJCQkoX3BBZC0+TWdtdFJpbmcuVHhTd0ZyZWVJZHgpCisjZW5kaWYgLy8gUlQyODcwIC8vCisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0gUlggUmVsYXRlZCBNQUNSTyAtLS0tLS0tLS0tLS0tLS0tLSAqLworLy8jZGVmaW5lIFJUMjhYWF9SWF9FUlJPUl9DSEVDSwkJCQlSVE1QQ2hlY2tSeFdJCisKKyNpZiAwCisjZGVmaW5lIFJUMjhYWF9SQ1ZfSU5JVChwQWQpCQkJCQlcCisJcEFkLT5UcmFuc2ZlckJ1ZmZlckxlbmd0aCA9IDA7CQkJCVwKKwlwQWQtPlJlYWRQb3NpdGlvbiA9IDA7CQkJCQkJXAorCXBBZC0+cEN1cnJSeENvbnRleHQgPSBOVUxMOworI2VuZGlmCisKKyNkZWZpbmUgUlQyOFhYX1JWX0FMTF9CVUZfRU5EKGJCdWxrUmVjZWl2ZSkJCVwKKwkvKiBXZSByZXR1cm4gU1RBVFVTX01PUkVfUFJPQ0VTU0lOR19SRVFVSVJFRCBzbyB0aGF0IHRoZSBjb21wbGV0aW9uICovCVwKKwkvKiByb3V0aW5lIChJb2ZDb21wbGV0ZVJlcXVlc3QpIHdpbGwgc3RvcCB3b3JraW5nIG9uIHRoZSBpcnAuICovCQlcCisJaWYgKGJCdWxrUmVjZWl2ZSA9PSBUUlVFKQlSVFVTQkJ1bGtSZWNlaXZlKHBBZCk7CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0gQVNJQyBSZWxhdGVkIE1BQ1JPIC0tLS0tLS0tLS0tLS0tLS0tICovCisjaWYgMAorI2RlZmluZSBSVDI4WFhfRE1BX1dSSVRFX0lOSVQoR2xvQ2ZnKQkJCVwKKwl7CUdsb0NmZy5maWVsZC5FblRYV3JpdGVCYWNrRERPTkUgPSAxOwlcCisJCUdsb0NmZy5maWVsZC5FbmFibGVSeERNQSA9IDE7CQkJXAorCQlHbG9DZmcuZmllbGQuRW5hYmxlVHhETUEgPSAxOyB9CisKKyNkZWZpbmUgUlQyOFhYX0RNQV9QT1NUX1dSSVRFKF9wQWQpCQkJCVwKKwlkb3sJVVNCX0RNQV9DRkdfU1RSVUMJVXNiQ2ZnOwkJCQlcCisJCVVzYkNmZy53b3JkID0gMDsJCQkJCQlcCisJCS8qIGZvciBsYXN0IHBhY2tldCwgUEJGIG1pZ2h0IHVzZSBtb3JlIHRoYW4gbGltaXRlZCwgc28gbWludXMgMiB0byBwcmV2ZW50IGZyb20gZXJyb3IgKi8gXAorCQlVc2JDZmcuZmllbGQuUnhCdWxrQWdnTG10ID0gKE1BWF9SWEJVTEtfU0laRSAvMTAyNCktMzsJXAorCQlVc2JDZmcuZmllbGQucGh5Y2xlYXIgPSAwOwkJCQkJCQkJXAorCQkvKiB1c2IgdmVyc2lvbiBpcyAxLjEsZG8gbm90IHVzZSBidWxrIGluIGFnZ3JlZ2F0aW9uICovCVwKKwkJaWYgKF9wQWQtPkJ1bGtJbk1heFBhY2tldFNpemUgPT0gNTEyKQkJCQkJXAorCQkJVXNiQ2ZnLmZpZWxkLlJ4QnVsa0FnZ0VuID0gMTsJCQkJCQlcCisJCVVzYkNmZy5maWVsZC5SeEJ1bGtFbiA9IDE7CQkJCQkJCQlcCisJCVVzYkNmZy5maWVsZC5UeEJ1bGtFbiA9IDE7CQkJCQkJCQlcCisJCVVzYkNmZy5maWVsZC5SeEJ1bGtBZ2dUT3V0ID0gMHg4MDsgLyogMjAwNi0xMC0xOCAqLwkJXAorCQlSVFVTQldyaXRlTUFDUmVnaXN0ZXIoX3BBZCwgVVNCX0RNQV9DRkcsIFVzYkNmZy53b3JkKTsgCVwKKwl9d2hpbGUoMCkKKyNlbmRpZgorCisvLyByZXNldCBNQUMgb2YgYSBzdGF0aW9uIGVudHJ5IHRvIDB4RkZGRkZGRkZGRkZGCisjZGVmaW5lIFJUMjhYWF9TVEFfRU5UUllfTUFDX1JFU0VUKHBBZCwgV2NpZCkJCQkJCVwKKwl7CVJUX1NFVF9BU0lDX1dDSUQJU2V0QXNpY1djaWQ7CQkJCQkJXAorCQlTZXRBc2ljV2NpZC5XQ0lEID0gV2NpZDsJCQkJCQkJCVwKKwkJU2V0QXNpY1djaWQuU2V0VGlkID0gMHhmZmZmZmZmZjsJCQkJCQlcCisJCVNldEFzaWNXY2lkLkRlbGV0ZVRpZCA9IDB4ZmZmZmZmZmY7CQkJCQkJXAorCQlSVFVTQkVucXVldWVJbnRlcm5hbENtZChwQWQsIENNRFRIUkVBRF9TRVRfQVNJQ19XQ0lELCAJXAorCQkJCSZTZXRBc2ljV2NpZCwgc2l6ZW9mKFJUX1NFVF9BU0lDX1dDSUQpKTsJfQorCisvLyBhZGQgdGhpcyBlbnRyeSBpbnRvIEFTSUMgUlggV0NJRCBzZWFyY2ggdGFibGUKKyNkZWZpbmUgUlQyOFhYX1NUQV9FTlRSWV9BREQocEFkLCBwRW50cnkpCQkJCQkJCVwKKwlSVFVTQkVucXVldWVJbnRlcm5hbENtZChwQWQsIENNRFRIUkVBRF9TRVRfQ0xJRU5UX01BQ19FTlRSWSwgCVwKKwkJCQkJCQlwRW50cnksIHNpemVvZihNQUNfVEFCTEVfRU5UUlkpKTsKKworLy8gcmVtb3ZlIFBhaXItd2lzZSBrZXkgbWF0ZXJpYWwgZnJvbSBBU0lDCisvLyB5ZXQgaW1wbGVtZW50CisjZGVmaW5lIFJUMjhYWF9TVEFfRU5UUllfS0VZX0RFTChwQWQsIEJzc0lkeCwgV2NpZCkKKworLy8gYWRkIENsaWVudCBzZWN1cml0eSBpbmZvcm1hdGlvbiBpbnRvIEFTSUMgV0NJRCB0YWJsZSBhbmQgSVZFSVYgdGFibGUKKyNkZWZpbmUgUlQyOFhYX1NUQV9TRUNVUklUWV9JTkZPX0FERChwQWQsIGFwaWR4LCBLZXlJRCwgcEVudHJ5KQkJCQkJCVwKKwl7CVJUMjhYWF9TVEFfRU5UUllfTUFDX1JFU0VUKHBBZCwgcEVudHJ5LT5BaWQpOwkJCQkJCQkJXAorCQlpZiAocEVudHJ5LT5BaWQgPj0gMSkgewkJCQkJCQkJCQkJCQkJXAorCQkJUlRfU0VUX0FTSUNfV0NJRF9BVFRSSQlTZXRBc2ljV2NpZEF0dHJpOwkJCQkJCQkJXAorCQkJU2V0QXNpY1djaWRBdHRyaS5XQ0lEID0gcEVudHJ5LT5BaWQ7CQkJCQkJCQkJXAorCQkJaWYgKChwRW50cnktPkF1dGhNb2RlIDw9IE5kaXM4MDJfMTFBdXRoTW9kZUF1dG9Td2l0Y2gpICYmCQkJCVwKKwkJCQkocEVudHJ5LT5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24xRW5hYmxlZCkpCQkJCVwKKwkJCXsJCQkJCQkJCQkJCQkJCQkJCQlcCisJCQkJU2V0QXNpY1djaWRBdHRyaS5DaXBoZXIgPSBwQWQtPlNoYXJlZEtleVthcGlkeF1bS2V5SURdLkNpcGhlckFsZzsJXAorCQkJfQkJCQkJCQkJCQkJCQkJCQkJCVwKKwkJCWVsc2UgaWYgKHBFbnRyeS0+QXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZSkJCQkJCVwKKwkJCXsJCQkJCQkJCQkJCQkJCQkJCQlcCisJCQkJU2V0QXNpY1djaWRBdHRyaS5DaXBoZXIgPSBwQWQtPlNoYXJlZEtleVthcGlkeF1bS2V5SURdLkNpcGhlckFsZzsJXAorCQkJfQkJCQkJCQkJCQkJCQkJCQkJCVwKKwkJCWVsc2UgU2V0QXNpY1djaWRBdHRyaS5DaXBoZXIgPSAwOwkJCQkJCQkJCQlcCisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJhaWQgY2lwaGVyID0gJWxkXG4iLFNldEFzaWNXY2lkQXR0cmkuQ2lwaGVyKSk7ICAgICAgIFwKKwkJCVJUVVNCRW5xdWV1ZUludGVybmFsQ21kKHBBZCwgQ01EVEhSRUFEX1NFVF9BU0lDX1dDSURfQ0lQSEVSLCAJCQlcCisJCQkJCQkJJlNldEFzaWNXY2lkQXR0cmksIHNpemVvZihSVF9TRVRfQVNJQ19XQ0lEX0FUVFJJKSk7IH0gfQorCisvLyBJbnNlcnQgdGhlIEJBIGJpdG1hcCB0byBBU0lDIGZvciB0aGUgV2NpZCBlbnRyeQorI2RlZmluZSBSVDI4WFhfQUREX0JBX1NFU1NJT05fVE9fQVNJQyhfcEFkLCBfQWlkLCBfVElEKQkJCQkJXAorCQlkb3sJCQkJCQkJCQkJCQkJCQkJXAorCQkJUlRfU0VUX0FTSUNfV0NJRAlTZXRBc2ljV2NpZDsJCQkJCQkJXAorCQkJU2V0QXNpY1djaWQuV0NJRCA9IChfQWlkKTsJCQkJCQkJCQlcCisJCQlTZXRBc2ljV2NpZC5TZXRUaWQgPSAoMHgxMDAwMDw8KF9USUQpKTsJCQkJCQlcCisJCQlTZXRBc2ljV2NpZC5EZWxldGVUaWQgPSAweGZmZmZmZmZmOwkJCQkJCQlcCisJCQlSVFVTQkVucXVldWVJbnRlcm5hbENtZCgoX3BBZCksIENNRFRIUkVBRF9TRVRfQVNJQ19XQ0lELCAmU2V0QXNpY1djaWQsIHNpemVvZihSVF9TRVRfQVNJQ19XQ0lEKSk7CVwKKwkJfXdoaWxlKDApCisKKy8vIFJlbW92ZSB0aGUgQkEgYml0bWFwIGZyb20gQVNJQyBmb3IgdGhlIFdjaWQgZW50cnkKKyNkZWZpbmUgUlQyOFhYX0RFTF9CQV9TRVNTSU9OX0ZST01fQVNJQyhfcEFkLCBfV2NpZCwgX1RJRCkJCQkJXAorCQlkb3sJCQkJCQkJCQkJCQkJCQkJXAorCQkJUlRfU0VUX0FTSUNfV0NJRAlTZXRBc2ljV2NpZDsJCQkJCQkJXAorCQkJU2V0QXNpY1djaWQuV0NJRCA9IChfV2NpZCk7CQkJCQkJCQkJXAorCQkJU2V0QXNpY1djaWQuU2V0VGlkID0gKDB4ZmZmZmZmZmYpOwkJCQkJCQlcCisJCQlTZXRBc2ljV2NpZC5EZWxldGVUaWQgPSAoMHgxMDAwMDw8KF9USUQpICk7CQkJCQlcCisJCQlSVFVTQkVucXVldWVJbnRlcm5hbENtZCgoX3BBZCksIENNRFRIUkVBRF9TRVRfQVNJQ19XQ0lELCAmU2V0QXNpY1djaWQsIHNpemVvZihSVF9TRVRfQVNJQ19XQ0lEKSk7CVwKKwkJfXdoaWxlKDApCisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0gUENJL1VTQiBSZWxhdGVkIE1BQ1JPIC0tLS0tLS0tLS0tLS0tLS0tICovCisjZGVmaW5lIFJUMjhYWF9IQU5ETEVfREVWX0FTU0lHTihoYW5kbGUsIGRldl9wKQkJCVwKKwkoKFBPU19DT09LSUUpaGFuZGxlKS0+cFVzYl9EZXYgPSBkZXZfcDsKKworLy8gbm8gdXNlCisjZGVmaW5lIFJUMjhYWF9VTk1BUCgpCisjZGVmaW5lIFJUMjhYWF9JUlFfUkVRVUVTVChuZXRfZGV2KQorI2RlZmluZSBSVDI4WFhfSVJRX1JFTEVBU0UobmV0X2RldikKKyNkZWZpbmUgUlQyOFhYX0lSUV9JTklUKHBBZCkKKyNkZWZpbmUgUlQyOFhYX0lSUV9FTkFCTEUocEFkKQorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tIE1MTUUgUmVsYXRlZCBNQUNSTyAtLS0tLS0tLS0tLS0tLS0tLSAqLworI2RlZmluZSBSVDI4WFhfTUxNRV9IQU5ETEVSKHBBZCkJCQlSVFVTQk1sbWVVcChwQWQpCisKKyNkZWZpbmUgUlQyOFhYX01MTUVfUFJFX1NBTklUWV9DSEVDSyhwQWQpCQkJCQkJCQlcCisJewlpZiAoKHBBZC0+Q29tbW9uQ2ZnLmJIYXJkd2FyZVJhZGlvID09IFRSVUUpICYmIAkJCQkJXAorCQkJKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpICYmCQlcCisJCQkoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKSkpIHsJXAorCQkJUlRVU0JFbnF1ZXVlSW50ZXJuYWxDbWQocEFkLCBDTURUSFJFQURfQ0hFQ0tfR1BJTywgTlVMTCwgMCk7IH0gfQorCisjZGVmaW5lIFJUMjhYWF9NTE1FX1NUQV9RVUlDS19SU1BfV0FLRV9VUChwQWQpCVwKKwl7CVJUVVNCRW5xdWV1ZUludGVybmFsQ21kKHBBZCwgQ01EVEhSRUFEX1FLRVJJT0RJQ19FWEVDVVQsIE5VTEwsIDApOwlcCisJCVJUVVNCTWxtZVVwKHBBZCk7IH0KKworI2RlZmluZSBSVDI4WFhfTUxNRV9SRVNFVF9TVEFURV9NQUNISU5FKHBBZCkJXAorCQkgICAgICAgIE1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9SRVNFVF9DT05GLCAwLCBOVUxMKTsJXAorCQkgICAgICAgIFJUVVNCTWxtZVVwKHBBZCk7CisKKyNkZWZpbmUgUlQyOFhYX0hBTkRMRV9DT1VOVEVSX01FQVNVUkUoX3BBZCwgX3BFbnRyeSkJCVwKKwl7CVJUVVNCRW5xdWV1ZUludGVybmFsQ21kKF9wQWQsIENNRFRIUkVBRF84MDJfMTFfQ09VTlRFUl9NRUFTVVJFLCBfcEVudHJ5LCBzaXplb2YoTUFDX1RBQkxFX0VOVFJZKSk7CVwKKwkJUlRVU0JNbG1lVXAoX3BBZCk7CQkJCQkJCQkJXAorCX0KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLSBQb3dlciBTYXZlIFJlbGF0ZWQgTUFDUk8gLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyNkZWZpbmUgUlQyOFhYX1BTX1BPTExfRU5RVUVVRShwQWQpCQkJCQkJXAorCXsJUlRVU0JfU0VUX0JVTEtfRkxBRyhwQWQsIGZSVFVTQl9CVUxLX09VVF9QU1BPTEwpOwlcCisJCVJUVVNCS2lja0J1bGtPdXQocEFkKTsgfQorCisjZGVmaW5lIFJUMjh4eF9DSElQX05BTUUgICAgICAgICAgICAiUlQyODcwIgorI2RlZmluZSBVU0JfQ1lDX0NGRyAgICAgICAgICAgICAgICAgMHgwMmE0CisjZGVmaW5lIFNUQVRVU19TVUNDRVNTCQkJCTB4MDAKKyNkZWZpbmUgU1RBVFVTX1VOU1VDQ0VTU0ZVTCAJCTB4MDEKKyNkZWZpbmUgTlRfU1VDQ0VTUyhzdGF0dXMpCQkJKCgoc3RhdHVzKSA+IDApID8gKDEpOigwKSkKKyNkZWZpbmUgSW50ZXJsb2NrZWRJbmNyZW1lbnQgCSAJYXRvbWljX2luYworI2RlZmluZSBOZGlzSW50ZXJsb2NrZWRJbmNyZW1lbnQgCWF0b21pY19pbmMKKyNkZWZpbmUgSW50ZXJsb2NrZWREZWNyZW1lbnQJCWF0b21pY19kZWMKKyNkZWZpbmUgTmRpc0ludGVybG9ja2VkRGVjcmVtZW50IAlhdG9taWNfZGVjCisjZGVmaW5lIEludGVybG9ja2VkRXhjaGFuZ2UJCQlhdG9taWNfc2V0CisvLyNkZWZpbmUgTmRpc01TZW5kQ29tcGxldGUJCQlSVE1QX1NlbmRDb21wbGV0ZQorI2RlZmluZSBOZGlzTUNhbmNlbFRpbWVyCQkJUlRNUENhbmNlbFRpbWVyCisjZGVmaW5lIE5kaXNBbGxvY01lbW9yeShfcHRyLCBfc2l6ZSwgX2ZsYWcpCVwKKwkJCQkJCQkJCWRve19wdHIgPSBrbWFsbG9jKChfc2l6ZSksKF9mbGFnKSk7fXdoaWxlKDApCisjZGVmaW5lIE5kaXNGcmVlTWVtb3J5KGEsIGIsIGMpIAlrZnJlZSgoYSkpCisjZGVmaW5lIE5kaXNNU2xlZXAJCQkJCVJUTVB1c2VjRGVsYXkJCS8qIHVuaXQ6IG1pY3Jvc2Vjb25kICovCisKKworI2RlZmluZSBVU0JEX1RSQU5TRkVSX0RJUkVDVElPTl9PVVQJCTAKKyNkZWZpbmUgVVNCRF9UUkFOU0ZFUl9ESVJFQ1RJT05fSU4JCTAKKyNkZWZpbmUgVVNCRF9TSE9SVF9UUkFOU0ZFUl9PSwkJCTAKKyNkZWZpbmUgUFVSQgkJCXB1cmJiX3QKKworI2RlZmluZSBSVFVTQl9GUkVFX1VSQihwVXJiKQl1c2JfZnJlZV91cmIocFVyYikKKworLy8jdW5kZWYgTWxtZUFsbG9jYXRlTWVtb3J5CisvLyN1bmRlZiBNbG1lRnJlZU1lbW9yeQorCit0eXBlZGVmIGludAkJCQlOVFNUQVRVUzsKK3R5cGVkZWYgc3RydWN0IHVzYl9kZXZpY2UJKiBQVVNCX0RFVjsKKworLyogTUFDUk8gZm9yIGxpbnV4IHVzYiAqLwordHlwZWRlZiBzdHJ1Y3QgdXJiICpwdXJiYl90OwordHlwZWRlZiBzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0IGRldmN0cmxyZXF1ZXN0OworI2RlZmluZSBQSVJQCQlQVk9JRAorI2RlZmluZSBQTURMCQlQVk9JRAorI2RlZmluZSBORElTX09JRAlVSU5UCisjaWZuZGVmIFVTQl9TVF9OT0VSUk9SCisjZGVmaW5lIFVTQl9TVF9OT0VSUk9SICAgICAwCisjZW5kaWYKKworLy8gdmVuZG9yLXNwZWNpZmljIGNvbnRyb2wgb3BlcmF0aW9ucworI2RlZmluZSBDT05UUk9MX1RJTUVPVVRfSklGRklFUyAoICgxMDAgKiBIWikgLyAxMDAwKQorI2RlZmluZSBVTkxJTktfVElNRU9VVF9NUwkJMworCisvKiB1bmxpbmsgdXJiCSovCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiw3KQorI2RlZmluZSBSVFVTQl9VTkxJTktfVVJCKHBVcmIpCQl1c2Jfa2lsbF91cmIocFVyYikKKyNlbHNlCisjZGVmaW5lIFJUVVNCX1VOTElOS19VUkIocFVyYikJCXVzYl91bmxpbmtfdXJiKHBVcmIpCisjZW5kaWYKKworLy8gUHJvdG90eXBlcyBvZiBjb21wbGV0aW9uIGZ1bnVjLgorI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQorI2RlZmluZSBSVFVTQkJ1bGtPdXREYXRhUGFja2V0Q29tcGxldGUocHVyYiwgcHRfcmVncykgICAgUlRVU0JCdWxrT3V0RGF0YVBhY2tldENvbXBsZXRlKHB1cmIpCisjZGVmaW5lIFJUVVNCQnVsa091dE1MTUVQYWNrZXRDb21wbGV0ZShwVXJiLCBwdF9yZWdzKSAgICBSVFVTQkJ1bGtPdXRNTE1FUGFja2V0Q29tcGxldGUocFVyYikKKyNkZWZpbmUgUlRVU0JCdWxrT3V0TnVsbEZyYW1lQ29tcGxldGUocFVyYiwgcHRfcmVncykgICAgIFJUVVNCQnVsa091dE51bGxGcmFtZUNvbXBsZXRlKHBVcmIpCisjZGVmaW5lIFJUVVNCQnVsa091dFJUU0ZyYW1lQ29tcGxldGUocFVyYiwgcHRfcmVncykgICAgICBSVFVTQkJ1bGtPdXRSVFNGcmFtZUNvbXBsZXRlKHBVcmIpCisjZGVmaW5lIFJUVVNCQnVsa091dFBzUG9sbENvbXBsZXRlKHBVcmIsIHB0X3JlZ3MpICAgICAgICBSVFVTQkJ1bGtPdXRQc1BvbGxDb21wbGV0ZShwVXJiKQorI2RlZmluZSBSVFVTQkJ1bGtSeENvbXBsZXRlKHBVcmIsIHB0X3JlZ3MpICAgICAgICAgICAgICAgUlRVU0JCdWxrUnhDb21wbGV0ZShwVXJiKQorI2VuZGlmCisKKworVk9JRCBSVFVTQkJ1bGtPdXREYXRhUGFja2V0Q29tcGxldGUocHVyYmJfdCBwdXJiLCBzdHJ1Y3QgcHRfcmVncyAqcHRfcmVncyk7CitWT0lEIFJUVVNCQnVsa091dE1MTUVQYWNrZXRDb21wbGV0ZShwdXJiYl90IHBVcmIsIHN0cnVjdCBwdF9yZWdzICpwdF9yZWdzKTsKK1ZPSUQgUlRVU0JCdWxrT3V0TnVsbEZyYW1lQ29tcGxldGUocHVyYmJfdCBwVXJiLCBzdHJ1Y3QgcHRfcmVncyAqcHRfcmVncyk7CitWT0lEIFJUVVNCQnVsa091dFJUU0ZyYW1lQ29tcGxldGUocHVyYmJfdCBwVXJiLCBzdHJ1Y3QgcHRfcmVncyAqcHRfcmVncyk7CitWT0lEIFJUVVNCQnVsa091dFBzUG9sbENvbXBsZXRlKHB1cmJiX3QgcFVyYiwgc3RydWN0IHB0X3JlZ3MgKnB0X3JlZ3MpOworVk9JRCBSVFVTQkJ1bGtSeENvbXBsZXRlKHB1cmJiX3QgcFVyYiwgc3RydWN0IHB0X3JlZ3MgKnB0X3JlZ3MpOworCisKKyNkZWZpbmUgUlRVU0JNbG1lVXAocEFkKQkgICAgICAgIFwKK3sJCQkJCQkJCSAgICBcCisJUE9TX0NPT0tJRSBwT2JqID0gKFBPU19DT09LSUUpIHBBZC0+T1NfQ29va2llOwlcCisJQ0hFQ0tfUElEX0xFR0FMSVRZKHBPYmotPk1MTUVUaHJfcGlkKQkJICAgIFwKKyAgICAgICAgdXAoJihwQWQtPm1sbWVfc2VtYXBob3JlKSk7IFwKK30KKworI2RlZmluZSBSVFVTQkNNRFVwKHBBZCkJICAgICAgICAgICAgICAgIFwKK3sJCQkJCQkJCQkgICAgXAorCVBPU19DT09LSUUgcE9iaiA9IChQT1NfQ09PS0lFKSBwQWQtPk9TX0Nvb2tpZTsJXAorCUNIRUNLX1BJRF9MRUdBTElUWShwT2JqLT5SVFVTQkNtZFRocl9waWQpCSAgICBcCisJICAgIHVwKCYocEFkLT5SVFVTQkNtZF9zZW1hcGhvcmUpKTsgXAorfQorCisKK3N0YXRpYyBpbmxpbmUgTkRJU19TVEFUVVMgUlRNUEFsbG9jYXRlTWVtb3J5KAorCU9VVCBQVk9JRCAqcHRyLAorCUlOIHNpemVfdCBzaXplKQoreworCSpwdHIgPSBrbWFsbG9jKHNpemUsIEdGUF9BVE9NSUMpOworCWlmKCpwdHIpCisJCXJldHVybiBORElTX1NUQVRVU19TVUNDRVNTOworCWVsc2UKKwkJcmV0dXJuIE5ESVNfU1RBVFVTX1JFU09VUkNFUzsKK30KKworLyogcnRtcC5oICovCisjZGVmaW5lCUJFQUNPTl9SSU5HX1NJWkUgICAgICAgICAgICAgICAgMgorI2RlZmluZSBERVZJQ0VfVkVORE9SX1JFUVVFU1RfT1VUICAgICAgIDB4NDAKKyNkZWZpbmUgREVWSUNFX1ZFTkRPUl9SRVFVRVNUX0lOICAgICAgICAweGMwCisjZGVmaW5lIElOVEVSRkFDRV9WRU5ET1JfUkVRVUVTVF9PVVQgICAgMHg0MQorI2RlZmluZSBJTlRFUkZBQ0VfVkVORE9SX1JFUVVFU1RfSU4gICAgIDB4YzEKKyNkZWZpbmUgTUdNVFBJUEVJRFgJCQkJCQkwCS8vIEVQNiBpcyBoaWdoZXN0IHByaW9yaXR5CisKKyNkZWZpbmUgQlVMS09VVF9NR01UX1JFU0VUX0ZMQUcJCQkJMHg4MAorCisjZGVmaW5lIFJUVVNCX1NFVF9CVUxLX0ZMQUcoX00sIF9GKQkJCQkoKF9NKS0+QnVsa0ZsYWdzIHw9IChfRikpCisjZGVmaW5lIFJUVVNCX0NMRUFSX0JVTEtfRkxBRyhfTSwgX0YpCQkJKChfTSktPkJ1bGtGbGFncyAmPSB+KF9GKSkKKyNkZWZpbmUgUlRVU0JfVEVTVF9CVUxLX0ZMQUcoX00sIF9GKQkJCSgoKF9NKS0+QnVsa0ZsYWdzICYgKF9GKSkgIT0gMCkKKworI2RlZmluZSBFbnF1ZXVlQ21kKGNtZHEsIGNtZHFlbG10KQkJXAorewkJCQkJCQkJCQlcCisJaWYgKGNtZHEtPnNpemUgPT0gMCkJCQkJXAorCQljbWRxLT5oZWFkID0gY21kcWVsbXQ7CQkJXAorCWVsc2UJCQkJCQkJCVwKKwkJY21kcS0+dGFpbC0+bmV4dCA9IGNtZHFlbG10OwlcCisJY21kcS0+dGFpbCA9IGNtZHFlbG10OwkJCQlcCisJY21kcWVsbXQtPm5leHQgPSBOVUxMOwkJCQlcCisJY21kcS0+c2l6ZSsrOwkJCQkJCVwKK30KKwordHlwZWRlZiBzdHJ1Y3QgICBfUlRfU0VUX0FTSUNfV0NJRCB7CisJVUxPTkcgV0NJRDsgICAgICAgICAgLy8gbWVjaGFuaXNtIGZvciByZWtleWluZzogMDpkaXNhYmxlLCAxOiB0aW1lLWJhc2VkLCAyOiBwYWNrZXQtYmFzZWQKKwlVTE9ORyBTZXRUaWQ7ICAgICAgICAvLyB0aW1lLWJhc2VkOiBzZWNvbmRzLCBwYWNrZXQtYmFzZWQ6IGtpbG8tcGFja2V0cworCVVMT05HIERlbGV0ZVRpZDsgICAgICAgIC8vIHRpbWUtYmFzZWQ6IHNlY29uZHMsIHBhY2tldC1iYXNlZDoga2lsby1wYWNrZXRzCisJVUNIQVIgQWRkcltNQUNfQUREUl9MRU5dOwkvLyBhdm9pZCBpbiBpbnRlcnJ1cHQgd2hlbiB3cml0ZSBrZXkKK30gUlRfU0VUX0FTSUNfV0NJRCwqUFJUX1NFVF9BU0lDX1dDSUQ7CisKK3R5cGVkZWYgc3RydWN0ICAgX1JUX1NFVF9BU0lDX1dDSURfQVRUUkkgeworCVVMT05HCVdDSUQ7ICAgICAgICAgIC8vIG1lY2hhbmlzbSBmb3IgcmVrZXlpbmc6IDA6ZGlzYWJsZSwgMTogdGltZS1iYXNlZCwgMjogcGFja2V0LWJhc2VkCisJVUxPTkcJQ2lwaGVyOyAgICAgICAgLy8gQVNJQyBDaXBoZXIgZGVmaW5pdGlvbgorCVVDSEFSCUFkZHJbRVRIX0xFTkdUSF9PRl9BRERSRVNTXTsKK30gUlRfU0VUX0FTSUNfV0NJRF9BVFRSSSwqUFJUX1NFVF9BU0lDX1dDSURfQVRUUkk7CisKK3R5cGVkZWYgc3RydWN0IF9NTE1FX01FTU9SWV9TVFJVQ1QgeworCVBWT0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxsb2NWYTsgICAgLy9Qb2ludGVyIHRvIHRoZSBiYXNlIHZpcnR1YWwgYWRkcmVzcyBvZiB0aGUgYWxsb2NhdGVkIG1lbW9yeQorCXN0cnVjdCBfTUxNRV9NRU1PUllfU1RSVUNUICAgICAgKk5leHQ7ICAgICAgLy9Qb2ludGVyIHRvIHRoZSBuZXh0IHZpcnR1YWwgYWRkcmVzcyBvZiB0aGUgYWxsb2NhdGVkIG1lbW9yeQorfSAgIE1MTUVfTUVNT1JZX1NUUlVDVCwgKlBNTE1FX01FTU9SWV9TVFJVQ1Q7CisKK3R5cGVkZWYgc3RydWN0ICBfTUxNRV9NRU1PUllfSEFORExFUiB7CisJQk9PTEVBTiAgICAgICAgICAgICAgICAgTWVtUnVubmluZzsgICAgICAgICAvL1RoZSBmbGFnIG9mIHRoZSBNbG1lIG1lbW9yeSBoYW5kbGVyJ3Mgc3RhdHVzCisJVUlOVCAgICAgICAgICAgICAgICAgICAgTWVtb3J5Q291bnQ7ICAgICAgICAvL1RvdGFsIG5vbnBhZ2VkIHN5c3RlbS1zcGFjZSBtZW1vcnkgbm90IHNpemUKKwlVSU5UICAgICAgICAgICAgICAgICAgICBJblVzZUNvdW50OyAgICAgICAgIC8vTm9ucGFnZWQgc3lzdGVtLXNwYWNlIG1lbW9yeSBpbiB1c2VkIGNvdW50cworCVVJTlQgICAgICAgICAgICAgICAgICAgIFVuVXNlQ291bnQ7ICAgICAgICAgLy9Ob25wYWdlZCBzeXN0ZW0tc3BhY2UgbWVtb3J5IGF2YWlsYWJsZSBjb3VudHMKKwlJTlQgICAgICAgICAgICAgICAgICAgIFBlbmRpbmdDb3VudDsgICAgICAgLy9Ob25wYWdlZCBzeXN0ZW0tc3BhY2UgbWVtb3J5IGZvciBmcmVlIGNvdW50cworCVBNTE1FX01FTU9SWV9TVFJVQ1QgICAgIHBJblVzZUhlYWQ7ICAgICAgICAgLy9Qb2ludGVyIHRvIHRoZSBmaXJzdCBub25wYWVkIG1lbW9yeSBub3QgdXNlZAorCVBNTE1FX01FTU9SWV9TVFJVQ1QgICAgIHBJblVzZVRhaWw7ICAgICAgICAgLy9Qb2ludGVyIHRvIHRoZSBsYXN0IG5vbnBhZ2VkIG1lbW9yeSBub3QgdXNlZAorCVBNTE1FX01FTU9SWV9TVFJVQ1QgICAgIHBVblVzZUhlYWQ7ICAgICAgICAgLy9Qb2ludGVyIHRvIHRoZSBmaXJzdCBub25wYWdlZCBtZW1vcnkgaW4gdXNlZAorCVBNTE1FX01FTU9SWV9TVFJVQ1QgICAgIHBVblVzZVRhaWw7ICAgICAgICAgLy9Qb2ludGVyIHRvIHRoZSBsYXN0IG5vbnBhZ2VkIG1lbW9yeSBpbiB1c2VkCisJUFVMT05HICAgICAgICAgICAgICAgICAgTWVtRnJlZVBlbmRpbmdbTUFYX01MTUVfSEFORExFUl9NRU1PUlldOyAgIC8vYW4gYXJyYXkgdG8ga2VlcCBwZW5kaW5nIGZyZWUtbWVtb3J5J3MgcG9pbnRlciAoMzJiaXRzKQorfSAgIE1MTUVfTUVNT1JZX0hBTkRMRVIsICpQTUxNRV9NRU1PUllfSEFORExFUjsKKwordHlwZWRlZglzdHJ1Y3QgX0NtZFFFbG10CXsKKwlVSU5UCQkJCWNvbW1hbmQ7CisJUFZPSUQJCQkJYnVmZmVyOworCVVMT05HCQkJCWJ1ZmZlcmxlbmd0aDsKKwlCT09MRUFOCQkJCUNtZEZyb21OZGlzOworCUJPT0xFQU4JCQkJU2V0T3BlcmF0aW9uOworCXN0cnVjdCBfQ21kUUVsbXQJKm5leHQ7Cit9CUNtZFFFbG10LCAqUENtZFFFbG10OworCit0eXBlZGVmCXN0cnVjdAlfQ21kUQl7CisJVUlOVAkJc2l6ZTsKKwlDbWRRRWxtdAkqaGVhZDsKKwlDbWRRRWxtdAkqdGFpbDsKKwlVSU5UMzIJCUNtZFFTdGF0ZTsKK31DbWRRLCAqUENtZFE7CisKKy8vCisvLyBGb3IgV1BBIFNVUFBMSUNBTlQ6IFdJUkVMRVNTIEVYVCBzdXBwb3J0IHdpcmVsZXNzIGV2ZW50czogdjE0IG9yIG5ld2VyCisvLworI2lmIFdJUkVMRVNTX0VYVCA+PSAxNAorLy8jZGVmaW5lIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgIDEKKyNlbmRpZgorCisvKiBvaWQuaCAqLworLy8gQ2lwaGVyIHN1aXRlIHR5cGUgZm9yIG1peGVkIG1vZGUgZ3JvdXAgY2lwaGVyLCBQODAyLjExaS0yMDA0Cit0eXBlZGVmIGVudW0gX1JUXzgwMl8xMV9DSVBIRVJfU1VJVEVfVFlQRSB7CisJQ2lwaGVyX1R5cGVfTk9ORSwKKwlDaXBoZXJfVHlwZV9XRVA0MCwKKwlDaXBoZXJfVHlwZV9US0lQLAorCUNpcGhlcl9UeXBlX1JTVkQsCisJQ2lwaGVyX1R5cGVfQ0NNUCwKKwlDaXBoZXJfVHlwZV9XRVAxMDQKK30gUlRfODAyXzExX0NJUEhFUl9TVUlURV9UWVBFLCAqUFJUXzgwMl8xMV9DSVBIRVJfU1VJVEVfVFlQRTsKKworLy9DTURUSFJFQURfTVVMVElfUkVBRF9NQUMKKy8vQ01EVEhSRUFEX01VTFRJX1dSSVRFX01BQworLy9DTURUSFJFQURfVkVORE9SX0VFUFJPTV9SRUFECisvL0NNRFRIUkVBRF9WRU5ET1JfRUVQUk9NX1dSSVRFCit0eXBlZGVmCXN0cnVjdAlfQ01ESGFuZGxlcl9UTFYJeworCVVTSE9SVAkJT2Zmc2V0OworCVVTSE9SVAkJTGVuZ3RoOworCVVDSEFSCQlEYXRhRmlyc3Q7Cit9CUNNREhhbmRsZXJfVExWLCAqUENNREhhbmRsZXJfVExWOworCisvLyBOZXcgZm9yIE1lZXRpbmdIb3VzZSBBcGkgc3VwcG9ydAorI2RlZmluZSBDTURUSFJFQURfVkVORE9SX1JFU0VUICAgICAgICAgICAgICAgICAgICAgIDB4MEQ3MzAxMDEJLy8gY21kCisjZGVmaW5lIENNRFRIUkVBRF9WRU5ET1JfVU5QTFVHICAgICAgICAgICAgICAgICAgICAgMHgwRDczMDEwMgkvLyBjbWQKKyNkZWZpbmUgQ01EVEhSRUFEX1ZFTkRPUl9TV0lUQ0hfRlVOQ1RJT04gICAgICAgICAgICAweDBENzMwMTAzCS8vIGNtZAorI2RlZmluZSBDTURUSFJFQURfTVVMVElfV1JJVEVfTUFDICAgICAgICAgICAgICAgICAgIDB4MEQ3MzAxMDcJLy8gY21kCisjZGVmaW5lIENNRFRIUkVBRF9NVUxUSV9SRUFEX01BQyAgICAgICAgICAgICAgICAgICAgMHgwRDczMDEwOAkvLyBjbWQKKyNkZWZpbmUgQ01EVEhSRUFEX1ZFTkRPUl9FRVBST01fV1JJVEUgICAgICAgICAgICAgICAweDBENzMwMTBBCS8vIGNtZAorI2RlZmluZSBDTURUSFJFQURfVkVORE9SX0VFUFJPTV9SRUFEICAgICAgICAgICAgICAgIDB4MEQ3MzAxMEIJLy8gY21kCisjZGVmaW5lIENNRFRIUkVBRF9WRU5ET1JfRU5URVJfVEVTVE1PREUgICAgICAgICAgICAgMHgwRDczMDEwQwkvLyBjbWQKKyNkZWZpbmUgQ01EVEhSRUFEX1ZFTkRPUl9FWElUX1RFU1RNT0RFICAgICAgICAgICAgICAweDBENzMwMTBECS8vIGNtZAorI2RlZmluZSBDTURUSFJFQURfVkVORE9SX1dSSVRFX0JCUCAgICAgICAgICAgICAgICAgIDB4MEQ3MzAxMTkJLy8gY21kCisjZGVmaW5lIENNRFRIUkVBRF9WRU5ET1JfUkVBRF9CQlAgICAgICAgICAgICAgICAgICAgMHgwRDczMDExOAkvLyBjbWQKKyNkZWZpbmUgQ01EVEhSRUFEX1ZFTkRPUl9XUklURV9SRiAgICAgICAgICAgICAgICAgICAweDBENzMwMTFBCS8vIGNtZAorI2RlZmluZSBDTURUSFJFQURfVkVORE9SX0ZMSVBfSVEgICAgICAgICAgICAgICAgICAgIDB4MEQ3MzAxMUQJLy8gY21kCisjZGVmaW5lIENNRFRIUkVBRF9SRVNFVF9CVUxLX09VVCAgICAgICAgICAgICAgICAgICAgMHgwRDczMDIxMAkvLyBjbWQKKyNkZWZpbmUgQ01EVEhSRUFEX1JFU0VUX0JVTEtfSU4gICAgICAgICAgICAgICAgICAgICAweDBENzMwMjExCS8vIGNtZAorI2RlZmluZSBDTURUSFJFQURfU0VUX1BTTV9CSVRfU0FWRSAgICAgICAgICAgICAgICAgIDB4MEQ3MzAyMTIJLy8gY21kCisjZGVmaW5lIENNRFRIUkVBRF9TRVRfUkFESU8gICAgICAgICAgICAgICAgICAgICAgICAgMHgwRDczMDIxNAkvLyBjbWQKKyNkZWZpbmUgQ01EVEhSRUFEX1VQREFURV9UWF9SQVRFICAgICAgICAgICAgICAgICAgICAweDBENzMwMjE2CS8vIGNtZAorI2RlZmluZSBDTURUSFJFQURfODAyXzExX0FERF9LRVlfV0VQICAgICAgICAgICAgICAgIDB4MEQ3MzAyMTgJLy8gY21kCisjZGVmaW5lIENNRFRIUkVBRF9SRVNFVF9GUk9NX0VSUk9SICAgICAgICAgICAgICAgICAgMHgwRDczMDIxQQkvLyBjbWQKKyNkZWZpbmUgQ01EVEhSRUFEX0xJTktfRE9XTiAgICAgICAgICAgICAgICAgICAgICAgICAweDBENzMwMjFCCS8vIGNtZAorI2RlZmluZSBDTURUSFJFQURfUkVTRVRfRlJPTV9ORElTICAgICAgICAgICAgICAgICAgIDB4MEQ3MzAyMUMJLy8gY21kCisjZGVmaW5lIENNRFRIUkVBRF9DSEVDS19HUElPICAgICAgICAgICAgICAgICAgICAgICAgMHgwRDczMDIxNQkvLyBjbWQKKyNkZWZpbmUgQ01EVEhSRUFEX0ZPUkNFX1dBS0VfVVAgICAgICAgICAgICAgICAgICAgICAweDBENzMwMjIyCS8vIGNtZAorI2RlZmluZSBDTURUSFJFQURfU0VUX0JXICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEQ3MzAyMjUJLy8gY21kCisjZGVmaW5lIENNRFRIUkVBRF9TRVRfQVNJQ19XQ0lEICAgICAgICAgICAgICAgICAgICAgMHgwRDczMDIyNgkvLyBjbWQKKyNkZWZpbmUgQ01EVEhSRUFEX1NFVF9BU0lDX1dDSURfQ0lQSEVSICAgICAgICAgICAgICAweDBENzMwMjI3CS8vIGNtZAorI2RlZmluZSBDTURUSFJFQURfUUtFUklPRElDX0VYRUNVVCAgICAgICAgICAgICAgICAgIDB4MEQ3MzAyM0QJLy8gY21kCisjZGVmaW5lIFJUX0NNRF9TRVRfS0VZX1RBQkxFICAgICAgICAgICAgICAgICAgICAgICAgMHgwRDczMDIyOCAgLy8gY21kCisjZGVmaW5lIFJUX0NNRF9TRVRfUlhfV0NJRF9UQUJMRSAgICAgICAgICAgICAgICAgICAgMHgwRDczMDIyOSAgLy8gY21kCisjZGVmaW5lIENNRFRIUkVBRF9TRVRfQ0xJRU5UX01BQ19FTlRSWSAgICAgICAgICAgICAgMHgwRDczMDIzRQkvLyBjbWQKKyNkZWZpbmUgQ01EVEhSRUFEXzgwMl8xMV9RVUVSWV9IQVJEV0FSRV9SRUdJU1RFUiAgICAweDBENzEwMTA1CS8vIGNtZAorI2RlZmluZSBDTURUSFJFQURfODAyXzExX1NFVF9QSFlfTU9ERSAgICAgICAgICAgICAgIDB4MEQ3OTAxMEMJLy8gY21kCisjZGVmaW5lIENNRFRIUkVBRF84MDJfMTFfU0VUX1NUQV9DT05GSUcgICAgICAgICAgICAgMHgwRDc5MDExMQkvLyBjbWQKKyNkZWZpbmUgQ01EVEhSRUFEXzgwMl8xMV9TRVRfUFJFQU1CTEUgICAgICAgICAgICAgICAweDBENzkwMTAxCS8vIGNtZAorI2RlZmluZSBDTURUSFJFQURfODAyXzExX0NPVU5URVJfTUVBU1VSRQkJCTB4MEQ3OTAxMDIJLy8gY21kCisKKworI2RlZmluZSBXUEExQUtNQklUCSAgICAweDAxCisjZGVmaW5lIFdQQTJBS01CSVQJICAgIDB4MDIKKyNkZWZpbmUgV1BBMVBTS0FLTUJJVCAgIDB4MDQKKyNkZWZpbmUgV1BBMlBTS0FLTUJJVCAgIDB4MDgKKyNkZWZpbmUgVEtJUEJJVCAgICAgICAgIDB4MDEKKyNkZWZpbmUgQ0NNUEJJVCAgICAgICAgIDB4MDIKKworCisjZGVmaW5lIFJUMjhYWF9TVEFfRk9SQ0VfV0FLRVVQKHBBZCwgYkZyb21UeCkgXAorICAgIFJUMjh4eFVzYlN0YUFzaWNGb3JjZVdha2V1cChwQWQsIGJGcm9tVHgpOworCisjZGVmaW5lIFJUMjhYWF9TVEFfU0xFRVBfVEhFTl9BVVRPX1dBS0VVUChwQWQsIFRidHROdW1Ub05leHRXYWtlVXApIFwKKyAgICBSVDI4eHhVc2JTdGFBc2ljU2xlZXBUaGVuQXV0b1dha2V1cChwQWQsIFRidHROdW1Ub05leHRXYWtlVXApOworCisjZGVmaW5lIFJUMjhYWF9NTE1FX1JBRElPX09OKHBBZCkgXAorICAgIFJUMjh4eFVzYk1sbWVSYWRpb09uKHBBZCk7CisKKyNkZWZpbmUgUlQyOFhYX01MTUVfUkFESU9fT0ZGKHBBZCkgXAorICAgIFJUMjh4eFVzYk1sbWVSYWRpb09GRihwQWQpOworCisjZW5kaWYgLy9fX1JUMjg3MF9IX18KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvcnQyOHh4LmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3J0Mjh4eC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5MjdkMjIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3J0Mjh4eC5oCkBAIC0wLDAgKzEsMjY4OSBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwlNb2R1bGUgTmFtZToKKwlydDI4eHguaAorCisJQWJzdHJhY3Q6CisJUlQyOHh4IEFTSUMgcmVsYXRlZCBkZWZpbml0aW9uICYgc3RydWN0dXJlcworCisJUmV2aXNpb24gSGlzdG9yeToKKwlXaG8JCQlXaGVuCQkgIFdoYXQKKwktLS0tLS0tLQktLS0tLS0tLS0tCSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgIEphbiBMZWUgICAgICAgICAgIEphbi0zLTIwMDYgICAgIGNyZWF0ZWQgZm9yIFJUMjg2MGMKKyovCisKKyNpZm5kZWYJX19SVDI4WFhfSF9fCisjZGVmaW5lCV9fUlQyOFhYX0hfXworCisKKy8vCisvLyBQQ0kgcmVnaXN0ZXJzIC0gYmFzZSBhZGRyZXNzIDB4MDAwMAorLy8KKyNkZWZpbmUgUENJX0NGRwkJCTB4MDAwMAorI2RlZmluZSBQQ0lfRUVDVFJMCQkJMHgwMDA0CisjZGVmaW5lIFBDSV9NQ1VDVFJMCQkJMHgwMDA4CisKKy8vCisvLyBTQ0gvRE1BIHJlZ2lzdGVycyAtIGJhc2UgYWRkcmVzcyAweDAyMDAKKy8vCisvLyBJTlRfU09VUkNFX0NTUjogSW50ZXJydXB0IHNvdXJjZSByZWdpc3Rlci4gV3JpdGUgb25lIHRvIGNsZWFyIGNvcnJlc3BvbmRpbmcgYml0CisvLworI2RlZmluZSBETUFfQ1NSMCAgICAgIDB4MjAwCisjZGVmaW5lIElOVF9TT1VSQ0VfQ1NSICAgICAgMHgyMDAKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9JTlRfU09VUkNFX0NTUl9TVFJVQwl7CisJc3RydWN0CXsKKwkJVUlOVDMyICAgICAgIAk6MTQ7CisJCVVJTlQzMiAgICAgICAJVHhDb2hlcmVudDoxOworCQlVSU5UMzIgICAgICAgCVJ4Q29oZXJlbnQ6MTsKKwkJVUlOVDMyICAgICAgIAlHUFRpbWVyOjE7CisJCVVJTlQzMiAgICAgICAJQXV0b1dha2V1cDoxOy8vYml0MTQKKwkJVUlOVDMyICAgICAgIAlUWEZpZm9TdGF0dXNJbnQ6MTsvL0ZJRk8gU3RhdGlzdGljcyBpcyBmdWxsLCBzdyBzaG91bGQgcmVhZCAweDE3MWMKKwkJVUlOVDMyICAgICAgIAlQcmVUQlRUOjE7CisJCVVJTlQzMiAgICAgICAJVEJUVEludDoxOworCQlVSU5UMzIgICAgICAgCVJ4VHhDb2hlcmVudDoxOworCQlVSU5UMzIgICAgICAgCU1DVUNvbW1hbmRJTlQ6MTsKKwkJVUlOVDMyICAgICAgIAlNZ210RG1hRG9uZToxOworCQlVSU5UMzIgICAgICAgCUhjY2FEbWFEb25lOjE7CisJCVVJTlQzMiAgICAgICAJQWMzRG1hRG9uZToxOworCQlVSU5UMzIgICAgICAgCUFjMkRtYURvbmU6MTsKKwkJVUlOVDMyICAgICAgIAlBYzFEbWFEb25lOjE7CisJCVVJTlQzMgkJQWMwRG1hRG9uZToxOworCQlVSU5UMzIJCVJ4RG9uZToxOworCQlVSU5UMzIJCVR4RGVsYXlJTlQ6MTsJLy9kZWxheWVkIGludGVycnVwdCwgbm90IGludGVycnVwdCB1bnRpbCBzZXZlcmFsIGludCBvciB0aW1lIGxpbWl0IGhpdAorCQlVSU5UMzIJCVJ4RGVsYXlJTlQ6MTsgLy9kZWFseWVkIGludGVycnVwdAorCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JSU5UX1NPVVJDRV9DU1JfU1RSVUMsICpQSU5UX1NPVVJDRV9DU1JfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfSU5UX1NPVVJDRV9DU1JfU1RSVUMJeworCXN0cnVjdAl7CisJCVVJTlQzMgkJUnhEZWxheUlOVDoxOworCQlVSU5UMzIJCVR4RGVsYXlJTlQ6MTsKKwkJVUlOVDMyCQlSeERvbmU6MTsKKwkJVUlOVDMyCQlBYzBEbWFEb25lOjE7Ly80CisJCVVJTlQzMiAgICAgICAJQWMxRG1hRG9uZToxOworCQlVSU5UMzIgICAgICAgCUFjMkRtYURvbmU6MTsKKwkJVUlOVDMyICAgICAgIAlBYzNEbWFEb25lOjE7CisJCVVJTlQzMiAgICAgICAJSGNjYURtYURvbmU6MTsgLy8gYml0NworCQlVSU5UMzIgICAgICAgCU1nbXREbWFEb25lOjE7CisJCVVJTlQzMiAgICAgICAJTUNVQ29tbWFuZElOVDoxOy8vYml0IDkKKwkJVUlOVDMyICAgICAgIAlSeFR4Q29oZXJlbnQ6MTsKKwkJVUlOVDMyICAgICAgIAlUQlRUSW50OjE7CisJCVVJTlQzMiAgICAgICAJUHJlVEJUVDoxOworCQlVSU5UMzIgICAgICAgCVRYRmlmb1N0YXR1c0ludDoxOy8vRklGTyBTdGF0aXN0aWNzIGlzIGZ1bGwsIHN3IHNob3VsZCByZWFkIDB4MTcxYworCQlVSU5UMzIgICAgICAgCUF1dG9XYWtldXA6MTsvL2JpdDE0CisJCVVJTlQzMiAgICAgICAJR1BUaW1lcjoxOworCQlVSU5UMzIgICAgICAgCVJ4Q29oZXJlbnQ6MTsvL2JpdDE2CisJCVVJTlQzMiAgICAgICAJVHhDb2hlcmVudDoxOworCQlVSU5UMzIgICAgICAgCToxNDsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9IElOVF9TT1VSQ0VfQ1NSX1NUUlVDLCAqUElOVF9TT1VSQ0VfQ1NSX1NUUlVDOworI2VuZGlmCisKKy8vCisvLyBJTlRfTUFTS19DU1I6ICAgSW50ZXJydXB0IE1BU0sgcmVnaXN0ZXIuICAgMTogdGhlIGludGVycnVwdCBpcyBtYXNrIE9GRgorLy8KKyNkZWZpbmUgSU5UX01BU0tfQ1NSICAgICAgICAweDIwNAorI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX0lOVF9NQVNLX0NTUl9TVFJVQwl7CisJc3RydWN0CXsKKwkJVUlOVDMyICAgICAgIAlUeENvaGVyZW50OjE7CisJCVVJTlQzMiAgICAgICAJUnhDb2hlcmVudDoxOworCQlVSU5UMzIgICAgICAgCToyMDsKKwkJVUlOVDMyICAgICAgIAlNQ1VDb21tYW5kSU5UOjE7CisJCVVJTlQzMiAgICAgICAJTWdtdERtYURvbmU6MTsKKwkJVUlOVDMyICAgICAgIAlIY2NhRG1hRG9uZToxOworCQlVSU5UMzIgICAgICAgCUFjM0RtYURvbmU6MTsKKwkJVUlOVDMyICAgICAgIAlBYzJEbWFEb25lOjE7CisJCVVJTlQzMiAgICAgICAJQWMxRG1hRG9uZToxOworCQlVSU5UMzIJCUFjMERtYURvbmU6MTsKKwkJVUlOVDMyCQlSeERvbmU6MTsKKwkJVUlOVDMyCQlUeERlbGF5OjE7CisJCVVJTlQzMgkJUlhEZWxheV9JTlRfTVNLOjE7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfUlOVF9NQVNLX0NTUl9TVFJVQywgKlBJTlRfTUFTS19DU1JfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfSU5UX01BU0tfQ1NSX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVSU5UMzIJCVJYRGVsYXlfSU5UX01TSzoxOworCQlVSU5UMzIJCVR4RGVsYXk6MTsKKwkJVUlOVDMyCQlSeERvbmU6MTsKKwkJVUlOVDMyCQlBYzBEbWFEb25lOjE7CisJCVVJTlQzMiAgICAgICAJQWMxRG1hRG9uZToxOworCQlVSU5UMzIgICAgICAgCUFjMkRtYURvbmU6MTsKKwkJVUlOVDMyICAgICAgIAlBYzNEbWFEb25lOjE7CisJCVVJTlQzMiAgICAgICAJSGNjYURtYURvbmU6MTsKKwkJVUlOVDMyICAgICAgIAlNZ210RG1hRG9uZToxOworCQlVSU5UMzIgICAgICAgCU1DVUNvbW1hbmRJTlQ6MTsKKwkJVUlOVDMyICAgICAgIAk6MjA7CisJCVVJTlQzMiAgICAgICAJUnhDb2hlcmVudDoxOworCQlVSU5UMzIgICAgICAgCVR4Q29oZXJlbnQ6MTsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9IElOVF9NQVNLX0NTUl9TVFJVQywgKlBJTlRfTUFTS19DU1JfU1RSVUM7CisjZW5kaWYKKyNkZWZpbmUgV1BETUFfR0xPX0NGRyAJMHgyMDgKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9XUERNQV9HTE9fQ0ZHX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVSU5UMzIgICAgICAgCUhEUl9TRUdfTEVOOjE2OworCQlVSU5UMzIgICAgICAgCVJYSGRyU2NhdGVyOjg7CisJCVVJTlQzMiAgICAgICAJQmlnRW5kaWFuOjE7CisJCVVJTlQzMiAgICAgICAJRW5UWFdyaXRlQmFja0RET05FOjE7CisJCVVJTlQzMiAgICAgICAJV1BETUFCdXJzdFNJWkU6MjsKKwkJVUlOVDMyCQlSeERNQUJ1c3k6MTsKKwkJVUlOVDMyCQlFbmFibGVSeERNQToxOworCQlVSU5UMzIJCVR4RE1BQnVzeToxOworCQlVSU5UMzIJCUVuYWJsZVR4RE1BOjE7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfVdQRE1BX0dMT19DRkdfU1RSVUMsICpQV1BETUFfR0xPX0NGR19TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9XUERNQV9HTE9fQ0ZHX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVSU5UMzIJCUVuYWJsZVR4RE1BOjE7CisJCVVJTlQzMgkJVHhETUFCdXN5OjE7CisJCVVJTlQzMgkJRW5hYmxlUnhETUE6MTsKKwkJVUlOVDMyCQlSeERNQUJ1c3k6MTsKKwkJVUlOVDMyICAgICAgIAlXUERNQUJ1cnN0U0laRToyOworCQlVSU5UMzIgICAgICAgCUVuVFhXcml0ZUJhY2tERE9ORToxOworCQlVSU5UMzIgICAgICAgCUJpZ0VuZGlhbjoxOworCQlVSU5UMzIgICAgICAgCVJYSGRyU2NhdGVyOjg7CisJCVVJTlQzMiAgICAgICAJSERSX1NFR19MRU46MTY7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfSBXUERNQV9HTE9fQ0ZHX1NUUlVDLCAqUFdQRE1BX0dMT19DRkdfU1RSVUM7CisjZW5kaWYKKyNkZWZpbmUgV1BETUFfUlNUX0lEWCAJMHgyMGMKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9XUERNQV9SU1RfSURYX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVSU5UMzIgICAgICAgCToxNTsKKwkJVUlOVDMyICAgICAgIAlSU1RfRFJYX0lEWDA6MTsKKwkJVUlOVDMyICAgICAgIAlyc3Y6MTA7CisJCVVJTlQzMiAgICAgICAJUlNUX0RUWF9JRFg1OjE7CisJCVVJTlQzMiAgICAgICAJUlNUX0RUWF9JRFg0OjE7CisJCVVJTlQzMgkJUlNUX0RUWF9JRFgzOjE7CisJCVVJTlQzMgkJUlNUX0RUWF9JRFgyOjE7CisJCVVJTlQzMgkJUlNUX0RUWF9JRFgxOjE7CisJCVVJTlQzMgkJUlNUX0RUWF9JRFgwOjE7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfVdQRE1BX1JTVF9JRFhfU1RSVUMsICpQV1BETUFfUlNUX0lEWF9TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9XUERNQV9SU1RfSURYX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVSU5UMzIJCVJTVF9EVFhfSURYMDoxOworCQlVSU5UMzIJCVJTVF9EVFhfSURYMToxOworCQlVSU5UMzIJCVJTVF9EVFhfSURYMjoxOworCQlVSU5UMzIJCVJTVF9EVFhfSURYMzoxOworCQlVSU5UMzIgICAgICAgCVJTVF9EVFhfSURYNDoxOworCQlVSU5UMzIgICAgICAgCVJTVF9EVFhfSURYNToxOworCQlVSU5UMzIgICAgICAgCXJzdjoxMDsKKwkJVUlOVDMyICAgICAgIAlSU1RfRFJYX0lEWDA6MTsKKwkJVUlOVDMyICAgICAgIAk6MTU7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfSBXUERNQV9SU1RfSURYX1NUUlVDLCAqUFdQRE1BX1JTVF9JRFhfU1RSVUM7CisjZW5kaWYKKyNkZWZpbmUgREVMQVlfSU5UX0NGRyAgMHgwMjEwCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfREVMQVlfSU5UX0NGR19TVFJVQwl7CisJc3RydWN0CXsKKwkJVUlOVDMyICAgICAgIAlUWERMWV9JTlRfRU46MTsKKwkJVUlOVDMyICAgICAgIAlUWE1BWF9QSU5UOjc7CisJCVVJTlQzMiAgICAgICAJVFhNQVhfUFRJTUU6ODsKKwkJVUlOVDMyICAgICAgIAlSWERMWV9JTlRfRU46MTsKKwkJVUlOVDMyICAgICAgIAlSWE1BWF9QSU5UOjc7CisJCVVJTlQzMgkJUlhNQVhfUFRJTUU6ODsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9REVMQVlfSU5UX0NGR19TVFJVQywgKlBERUxBWV9JTlRfQ0ZHX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX0RFTEFZX0lOVF9DRkdfU1RSVUMJeworCXN0cnVjdAl7CisJCVVJTlQzMgkJUlhNQVhfUFRJTUU6ODsKKwkJVUlOVDMyICAgICAgIAlSWE1BWF9QSU5UOjc7CisJCVVJTlQzMiAgICAgICAJUlhETFlfSU5UX0VOOjE7CisJCVVJTlQzMiAgICAgICAJVFhNQVhfUFRJTUU6ODsKKwkJVUlOVDMyICAgICAgIAlUWE1BWF9QSU5UOjc7CisJCVVJTlQzMiAgICAgICAJVFhETFlfSU5UX0VOOjE7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfSBERUxBWV9JTlRfQ0ZHX1NUUlVDLCAqUERFTEFZX0lOVF9DRkdfU1RSVUM7CisjZW5kaWYKKyNkZWZpbmUgV01NX0FJRlNOX0NGRyAgIDB4MDIxNAorI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX0FJRlNOX0NTUl9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVUlOVDMyICAgUnN2OjE2OworCSAgICBVSU5UMzIgICBBaWZzbjM6NDsgICAgICAgLy8gZm9yIEFDX1ZPCisJICAgIFVJTlQzMiAgIEFpZnNuMjo0OyAgICAgICAvLyBmb3IgQUNfVkkKKwkgICAgVUlOVDMyICAgQWlmc24xOjQ7ICAgICAgIC8vIGZvciBBQ19CSworCSAgICBVSU5UMzIgICBBaWZzbjA6NDsgICAgICAgLy8gZm9yIEFDX0JFCisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlBSUZTTl9DU1JfU1RSVUMsICpQQUlGU05fQ1NSX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX0FJRlNOX0NTUl9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVUlOVDMyICAgQWlmc24wOjQ7ICAgICAgIC8vIGZvciBBQ19CRQorCSAgICBVSU5UMzIgICBBaWZzbjE6NDsgICAgICAgLy8gZm9yIEFDX0JLCisJICAgIFVJTlQzMiAgIEFpZnNuMjo0OyAgICAgICAvLyBmb3IgQUNfVkkKKwkgICAgVUlOVDMyICAgQWlmc24zOjQ7ICAgICAgIC8vIGZvciBBQ19WTworCSAgICBVSU5UMzIgICBSc3Y6MTY7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlBSUZTTl9DU1JfU1RSVUMsICpQQUlGU05fQ1NSX1NUUlVDOworI2VuZGlmCisvLworLy8gQ1dNSU5fQ1NSOiBDV21pbiBmb3IgZWFjaCBFRENBIEFDCisvLworI2RlZmluZSBXTU1fQ1dNSU5fQ0ZHICAgMHgwMjE4CisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfQ1dNSU5fQ1NSX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVSU5UMzIgICBSc3Y6MTY7CisJICAgIFVJTlQzMiAgIEN3bWluMzo0OyAgICAgICAvLyBmb3IgQUNfVk8KKwkgICAgVUlOVDMyICAgQ3dtaW4yOjQ7ICAgICAgIC8vIGZvciBBQ19WSQorCSAgICBVSU5UMzIgICBDd21pbjE6NDsgICAgICAgLy8gZm9yIEFDX0JLCisJICAgIFVJTlQzMiAgIEN3bWluMDo0OyAgICAgICAvLyBmb3IgQUNfQkUKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CUNXTUlOX0NTUl9TVFJVQywgKlBDV01JTl9DU1JfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfQ1dNSU5fQ1NSX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVSU5UMzIgICBDd21pbjA6NDsgICAgICAgLy8gZm9yIEFDX0JFCisJICAgIFVJTlQzMiAgIEN3bWluMTo0OyAgICAgICAvLyBmb3IgQUNfQksKKwkgICAgVUlOVDMyICAgQ3dtaW4yOjQ7ICAgICAgIC8vIGZvciBBQ19WSQorCSAgICBVSU5UMzIgICBDd21pbjM6NDsgICAgICAgLy8gZm9yIEFDX1ZPCisJICAgIFVJTlQzMiAgIFJzdjoxNjsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CUNXTUlOX0NTUl9TVFJVQywgKlBDV01JTl9DU1JfU1RSVUM7CisjZW5kaWYKKworLy8KKy8vIENXTUFYX0NTUjogQ1dtaW4gZm9yIGVhY2ggRURDQSBBQworLy8KKyNkZWZpbmUgV01NX0NXTUFYX0NGRyAgIDB4MDIxYworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX0NXTUFYX0NTUl9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVUlOVDMyICAgUnN2OjE2OworCSAgICBVSU5UMzIgICBDd21heDM6NDsgICAgICAgLy8gZm9yIEFDX1ZPCisJICAgIFVJTlQzMiAgIEN3bWF4Mjo0OyAgICAgICAvLyBmb3IgQUNfVkkKKwkgICAgVUlOVDMyICAgQ3dtYXgxOjQ7ICAgICAgIC8vIGZvciBBQ19CSworCSAgICBVSU5UMzIgICBDd21heDA6NDsgICAgICAgLy8gZm9yIEFDX0JFCisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlDV01BWF9DU1JfU1RSVUMsICpQQ1dNQVhfQ1NSX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX0NXTUFYX0NTUl9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVUlOVDMyICAgQ3dtYXgwOjQ7ICAgICAgIC8vIGZvciBBQ19CRQorCSAgICBVSU5UMzIgICBDd21heDE6NDsgICAgICAgLy8gZm9yIEFDX0JLCisJICAgIFVJTlQzMiAgIEN3bWF4Mjo0OyAgICAgICAvLyBmb3IgQUNfVkkKKwkgICAgVUlOVDMyICAgQ3dtYXgzOjQ7ICAgICAgIC8vIGZvciBBQ19WTworCSAgICBVSU5UMzIgICBSc3Y6MTY7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlDV01BWF9DU1JfU1RSVUMsICpQQ1dNQVhfQ1NSX1NUUlVDOworI2VuZGlmCisKKworLy8KKy8vIEFDX1RYT1BfQ1NSMDogQUNfQksvQUNfQkUgVFhPUCByZWdpc3RlcgorLy8KKyNkZWZpbmUgV01NX1RYT1AwX0NGRyAgICAweDAyMjAKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9BQ19UWE9QX0NTUjBfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVTSE9SVCAgQWMxVHhvcDsgICAgICAgIC8vIGZvciBBQ19CRSwgaW4gdW5pdCBvZiAzMnVzCisJICAgIFVTSE9SVCAgQWMwVHhvcDsgICAgICAgIC8vIGZvciBBQ19CSywgaW4gdW5pdCBvZiAzMnVzCisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlBQ19UWE9QX0NTUjBfU1RSVUMsICpQQUNfVFhPUF9DU1IwX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX0FDX1RYT1BfQ1NSMF9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVVNIT1JUICBBYzBUeG9wOyAgICAgICAgLy8gZm9yIEFDX0JLLCBpbiB1bml0IG9mIDMydXMKKwkgICAgVVNIT1JUICBBYzFUeG9wOyAgICAgICAgLy8gZm9yIEFDX0JFLCBpbiB1bml0IG9mIDMydXMKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CUFDX1RYT1BfQ1NSMF9TVFJVQywgKlBBQ19UWE9QX0NTUjBfU1RSVUM7CisjZW5kaWYKKworLy8KKy8vIEFDX1RYT1BfQ1NSMTogQUNfVk8vQUNfVkkgVFhPUCByZWdpc3RlcgorLy8KKyNkZWZpbmUgV01NX1RYT1AxX0NGRyAgICAweDAyMjQKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9BQ19UWE9QX0NTUjFfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVTSE9SVCAgQWMzVHhvcDsgICAgICAgIC8vIGZvciBBQ19WTywgaW4gdW5pdCBvZiAzMnVzCisJICAgIFVTSE9SVCAgQWMyVHhvcDsgICAgICAgIC8vIGZvciBBQ19WSSwgaW4gdW5pdCBvZiAzMnVzCisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlBQ19UWE9QX0NTUjFfU1RSVUMsICpQQUNfVFhPUF9DU1IxX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX0FDX1RYT1BfQ1NSMV9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVVNIT1JUICBBYzJUeG9wOyAgICAgICAgLy8gZm9yIEFDX1ZJLCBpbiB1bml0IG9mIDMydXMKKwkgICAgVVNIT1JUICBBYzNUeG9wOyAgICAgICAgLy8gZm9yIEFDX1ZPLCBpbiB1bml0IG9mIDMydXMKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CUFDX1RYT1BfQ1NSMV9TVFJVQywgKlBBQ19UWE9QX0NTUjFfU1RSVUM7CisjZW5kaWYKKyNkZWZpbmUgUklOR1JFR19ESUZGCQkJMHgxMAorI2RlZmluZSBHUElPX0NUUkxfQ0ZHICAgIDB4MDIyOAkvL01BQ19DU1IxMworI2RlZmluZSBNQ1VfQ01EX0NGRyAgICAweDAyMmMKKyNkZWZpbmUgVFhfQkFTRV9QVFIwICAgICAweDAyMzAJLy9BQ19CSyBiYXNlIGFkZHJlc3MKKyNkZWZpbmUgVFhfTUFYX0NOVDAgICAgICAweDAyMzQKKyNkZWZpbmUgVFhfQ1RYX0lEWDAgICAgICAgMHgwMjM4CisjZGVmaW5lIFRYX0RUWF9JRFgwICAgICAgMHgwMjNjCisjZGVmaW5lIFRYX0JBU0VfUFRSMSAgICAgMHgwMjQwIAkvL0FDX0JFIGJhc2UgYWRkcmVzcworI2RlZmluZSBUWF9NQVhfQ05UMSAgICAgIDB4MDI0NAorI2RlZmluZSBUWF9DVFhfSURYMSAgICAgICAweDAyNDgKKyNkZWZpbmUgVFhfRFRYX0lEWDEgICAgICAweDAyNGMKKyNkZWZpbmUgVFhfQkFTRV9QVFIyICAgICAweDAyNTAgCS8vQUNfVkkgYmFzZSBhZGRyZXNzCisjZGVmaW5lIFRYX01BWF9DTlQyICAgICAgMHgwMjU0CisjZGVmaW5lIFRYX0NUWF9JRFgyICAgICAgIDB4MDI1OAorI2RlZmluZSBUWF9EVFhfSURYMiAgICAgIDB4MDI1YworI2RlZmluZSBUWF9CQVNFX1BUUjMgICAgIDB4MDI2MCAJLy9BQ19WTyBiYXNlIGFkZHJlc3MKKyNkZWZpbmUgVFhfTUFYX0NOVDMgICAgICAweDAyNjQKKyNkZWZpbmUgVFhfQ1RYX0lEWDMgICAgICAgMHgwMjY4CisjZGVmaW5lIFRYX0RUWF9JRFgzICAgICAgMHgwMjZjCisjZGVmaW5lIFRYX0JBU0VfUFRSNCAgICAgMHgwMjcwIAkvL0hDQ0EgYmFzZSBhZGRyZXNzCisjZGVmaW5lIFRYX01BWF9DTlQ0ICAgICAgMHgwMjc0CisjZGVmaW5lIFRYX0NUWF9JRFg0ICAgICAgIDB4MDI3OAorI2RlZmluZSBUWF9EVFhfSURYNCAgICAgIDB4MDI3YworI2RlZmluZSBUWF9CQVNFX1BUUjUgICAgIDB4MDI4MCAJLy9NR01UIGJhc2UgYWRkcmVzcworI2RlZmluZSAgVFhfTUFYX0NOVDUgICAgIDB4MDI4NAorI2RlZmluZSBUWF9DVFhfSURYNSAgICAgICAweDAyODgKKyNkZWZpbmUgVFhfRFRYX0lEWDUgICAgICAweDAyOGMKKyNkZWZpbmUgVFhfTUdNVE1BWF9DTlQgICAgICBUWF9NQVhfQ05UNQorI2RlZmluZSBUWF9NR01UQ1RYX0lEWCAgICAgICBUWF9DVFhfSURYNQorI2RlZmluZSBUWF9NR01URFRYX0lEWCAgICAgIFRYX0RUWF9JRFg1CisjZGVmaW5lIFJYX0JBU0VfUFRSICAgICAweDAyOTAgCS8vUlggYmFzZSBhZGRyZXNzCisjZGVmaW5lIFJYX01BWF9DTlQgICAgICAweDAyOTQKKyNkZWZpbmUgUlhfQ1JYX0lEWCAgICAgICAweDAyOTgKKyNkZWZpbmUgUlhfRFJYX0lEWCAgICAgIDB4MDI5YworI2RlZmluZSBVU0JfRE1BX0NGRyAgICAgIDB4MDJhMAorI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX1VTQl9ETUFfQ0ZHX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVSU5UMzIgIFR4QnVzeToxOyAgIAkvL1VTQiBETUEgVFggRlNNIGJ1c3kgLiBkZWJ1ZyBvbmx5CisJICAgIFVJTlQzMiAgUnhCdXN5OjE7ICAgICAgICAvL1VTQiBETUEgUlggRlNNIGJ1c3kgLiBkZWJ1ZyBvbmx5CisJICAgIFVJTlQzMiAgRXBvdXRWYWxpZDo2OyAgICAgICAgLy9PVVQgZW5kcG9pbnQgZGF0YSB2YWxpZC4gZGVidWcgb25seQorCSAgICBVSU5UMzIgIFR4QnVsa0VuOjE7ICAgICAgICAvL0VuYWJsZSBVU0IgRE1BIFR4CisJICAgIFVJTlQzMiAgUnhCdWxrRW46MTsgICAgICAgIC8vRW5hYmxlIFVTQiBETUEgUngKKwkgICAgVUlOVDMyICBSeEJ1bGtBZ2dFbjoxOyAgICAgICAgLy9FbmFibGUgUnggQnVsayBBZ2dyZWdhdGlvbgorCSAgICBVSU5UMzIgIFR4b3BIYWx0OjE7ICAgICAgICAvL0hhbHQgVFhPUCBjb3VudCBkb3duIHdoZW4gVFggYnVmZmVyIGlzIGZ1bGwuCisJICAgIFVJTlQzMiAgVHhDbGVhcjoxOyAgICAgICAgLy9DbGVhciBVU0IgRE1BIFRYIHBhdGgKKwkgICAgVUlOVDMyICByc3Y6MjsKKwkgICAgVUlOVDMyICBwaHljbGVhcjoxOyAgICAgICAgCQkvL3BoeSB3YXRjaCBkb2cgZW5hYmxlLiB3cml0ZSAxCisJICAgIFVJTlQzMiAgUnhCdWxrQWdnTG10Ojg7ICAgICAgICAvL1J4IEJ1bGsgQWdncmVnYXRpb24gTGltaXQgIGluIHVuaXQgb2YgMTAyNCBieXRlcworCSAgICBVSU5UMzIgIFJ4QnVsa0FnZ1RPdXQ6ODsgICAgICAgIC8vUnggQnVsayBBZ2dyZWdhdGlvbiBUaW1lT3V0ICBpbiB1bml0IG9mIDMzbnMKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVVTQl9ETUFfQ0ZHX1NUUlVDLCAqUFVTQl9ETUFfQ0ZHX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX1VTQl9ETUFfQ0ZHX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVSU5UMzIgIFJ4QnVsa0FnZ1RPdXQ6ODsgICAgICAgIC8vUnggQnVsayBBZ2dyZWdhdGlvbiBUaW1lT3V0ICBpbiB1bml0IG9mIDMzbnMKKwkgICAgVUlOVDMyICBSeEJ1bGtBZ2dMbXQ6ODsgICAgICAgIC8vUnggQnVsayBBZ2dyZWdhdGlvbiBMaW1pdCAgaW4gdW5pdCBvZiAyNTYgYnl0ZXMKKwkgICAgVUlOVDMyICBwaHljbGVhcjoxOyAgICAgICAgCQkvL3BoeSB3YXRjaCBkb2cgZW5hYmxlLiB3cml0ZSAxCisJICAgIFVJTlQzMiAgcnN2OjI7CisJICAgIFVJTlQzMiAgVHhDbGVhcjoxOyAgICAgICAgLy9DbGVhciBVU0IgRE1BIFRYIHBhdGgKKwkgICAgVUlOVDMyICBUeG9wSGFsdDoxOyAgICAgICAgLy9IYWx0IFRYT1AgY291bnQgZG93biB3aGVuIFRYIGJ1ZmZlciBpcyBmdWxsLgorCSAgICBVSU5UMzIgIFJ4QnVsa0FnZ0VuOjE7ICAgICAgICAvL0VuYWJsZSBSeCBCdWxrIEFnZ3JlZ2F0aW9uCisJICAgIFVJTlQzMiAgUnhCdWxrRW46MTsgICAgICAgIC8vRW5hYmxlIFVTQiBETUEgUngKKwkgICAgVUlOVDMyICBUeEJ1bGtFbjoxOyAgICAgICAgLy9FbmFibGUgVVNCIERNQSBUeAorCSAgICBVSU5UMzIgIEVwb3V0VmFsaWQ6NjsgICAgICAgIC8vT1VUIGVuZHBvaW50IGRhdGEgdmFsaWQKKwkgICAgVUlOVDMyICBSeEJ1c3k6MTsgICAgICAgIC8vVVNCIERNQSBSWCBGU00gYnVzeQorCSAgICBVSU5UMzIgIFR4QnVzeToxOyAgIAkvL1VTQiBETUEgVFggRlNNIGJ1c3kKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVVTQl9ETUFfQ0ZHX1NUUlVDLCAqUFVTQl9ETUFfQ0ZHX1NUUlVDOworI2VuZGlmCisKKy8vCisvLyAgMyAgUEJGICByZWdpc3RlcnMKKy8vCisvLworLy8gTW9zdCBhcmUgZm9yIGRlYnVnLiBEcml2ZXIgZG9lc24ndCB0b3VjaCBQQkYgcmVnaXN0ZXIuCisjZGVmaW5lIAlQQkZfU1lTX0NUUkwgCSAweDA0MDAKKyNkZWZpbmUgICAgIFBCRl9DRkcgICAgICAgICAgICAgICAgIDB4MDQwOAorI2RlZmluZSAJUEJGX01BWF9QQ05UIAkgMHgwNDBDCisjZGVmaW5lIAlQQkZfQ1RSTAkgCTB4MDQxMAorI2RlZmluZSAJUEJGX0lOVF9TVEEJIDB4MDQxNAorI2RlZmluZSAJUEJGX0lOVF9FTkEJIDB4MDQxOAorI2RlZmluZSAJVFhSWFFfUENOVCAgCSAweDA0MzgKKyNkZWZpbmUgCVBCRl9EQkcgCSAJIDB4MDQzYworI2RlZmluZSAgICAgUEJGX0NBUF9DVFJMICAgICAweDA0NDAKKworLy8KKy8vICA0ICBNQUMgIHJlZ2lzdGVycworLy8KKy8vCisvLyAgNC4xIE1BQyBTWVNURU0gIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzIChvZmZzZXQ6MHgxMDAwKQorLy8KKyNkZWZpbmUgTUFDX0NTUjAgICAgICAgICAgICAweDEwMDAKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9BU0lDX1ZFUl9JRF9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVVNIT1JUICBBU0lDVmVyOyAgICAgICAgLy8gdmVyc2lvbiA6IDI4NjAKKwkgICAgVVNIT1JUICBBU0lDUmV2OyAgICAgICAgLy8gcmV2ZXJzaW9uICA6IDAKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CUFTSUNfVkVSX0lEX1NUUlVDLCAqUEFTSUNfVkVSX0lEX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX0FTSUNfVkVSX0lEX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVU0hPUlQgIEFTSUNSZXY7ICAgICAgICAvLyByZXZlcnNpb24gIDogMAorCSAgICBVU0hPUlQgIEFTSUNWZXI7ICAgICAgICAvLyB2ZXJzaW9uIDogMjg2MAorCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JQVNJQ19WRVJfSURfU1RSVUMsICpQQVNJQ19WRVJfSURfU1RSVUM7CisjZW5kaWYKKyNkZWZpbmUgTUFDX1NZU19DVFJMICAgICAgICAgICAgMHgxMDA0CQkvL01BQ19DU1IxCisjZGVmaW5lIE1BQ19BRERSX0RXMCAgICAgICAgICAgIAkJMHgxMDA4CQkvLyBNQUMgQUREUiBEVzAKKyNkZWZpbmUgTUFDX0FERFJfRFcxICAgICAgICAgICAJCSAweDEwMGMJCS8vIE1BQyBBRERSIERXMQorLy8KKy8vIE1BQ19DU1IyOiBTVEEgTUFDIHJlZ2lzdGVyIDAKKy8vCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfTUFDX0RXMF9TVFJVQwl7CisJc3RydWN0CXsKKwkJVUNIQVIJCUJ5dGUzOwkJLy8gTUFDIGFkZHJlc3MgYnl0ZSAzCisJCVVDSEFSCQlCeXRlMjsJCS8vIE1BQyBhZGRyZXNzIGJ5dGUgMgorCQlVQ0hBUgkJQnl0ZTE7CQkvLyBNQUMgYWRkcmVzcyBieXRlIDEKKwkJVUNIQVIJCUJ5dGUwOwkJLy8gTUFDIGFkZHJlc3MgYnl0ZSAwCisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlNQUNfRFcwX1NUUlVDLCAqUE1BQ19EVzBfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfTUFDX0RXMF9TVFJVQwl7CisJc3RydWN0CXsKKwkJVUNIQVIJCUJ5dGUwOwkJLy8gTUFDIGFkZHJlc3MgYnl0ZSAwCisJCVVDSEFSCQlCeXRlMTsJCS8vIE1BQyBhZGRyZXNzIGJ5dGUgMQorCQlVQ0hBUgkJQnl0ZTI7CQkvLyBNQUMgYWRkcmVzcyBieXRlIDIKKwkJVUNIQVIJCUJ5dGUzOwkJLy8gTUFDIGFkZHJlc3MgYnl0ZSAzCisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlNQUNfRFcwX1NUUlVDLCAqUE1BQ19EVzBfU1RSVUM7CisjZW5kaWYKKworLy8KKy8vIE1BQ19DU1IzOiBTVEEgTUFDIHJlZ2lzdGVyIDEKKy8vCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfTUFDX0RXMV9TVFJVQwl7CisJc3RydWN0CXsKKwkJVUNIQVIJCVJzdmQxOworCQlVQ0hBUgkJVTJNZU1hc2s7CisJCVVDSEFSCQlCeXRlNTsJCS8vIE1BQyBhZGRyZXNzIGJ5dGUgNQorCQlVQ0hBUgkJQnl0ZTQ7CQkvLyBNQUMgYWRkcmVzcyBieXRlIDQKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CU1BQ19EVzFfU1RSVUMsICpQTUFDX0RXMV9TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9NQUNfRFcxX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVQ0hBUgkJQnl0ZTQ7CQkvLyBNQUMgYWRkcmVzcyBieXRlIDQKKwkJVUNIQVIJCUJ5dGU1OwkJLy8gTUFDIGFkZHJlc3MgYnl0ZSA1CisJCVVDSEFSCQlVMk1lTWFzazsKKwkJVUNIQVIJCVJzdmQxOworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JTUFDX0RXMV9TVFJVQywgKlBNQUNfRFcxX1NUUlVDOworI2VuZGlmCisKKyNkZWZpbmUgTUFDX0JTU0lEX0RXMCAgICAgICAgICAgIAkJMHgxMDEwCQkvLyBNQUMgQlNTSUQgRFcwCisjZGVmaW5lIE1BQ19CU1NJRF9EVzEgICAgICAgICAgICAJCTB4MTAxNAkJLy8gTUFDIEJTU0lEIERXMQorCisvLworLy8gTUFDX0NTUjU6IEJTU0lEIHJlZ2lzdGVyIDEKKy8vCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfTUFDX0NTUjVfU1RSVUMJeworCXN0cnVjdAl7CisJCVVTSE9SVAkJUnN2ZDoxMTsKKwkJVVNIT1JUCQlNQnNzQmNuTnVtOjM7CisJCVVTSE9SVAkJQnNzSWRNb2RlOjI7IC8vIDA6IG9uZSBCU1NJRCwgMTA6IDQgQlNTSUQsICAwMTogMiBCU1NJRCAsIDExOiA4QlNTSUQKKwkJVUNIQVIJCUJ5dGU1OwkJIC8vIEJTU0lEIGJ5dGUgNQorCQlVQ0hBUgkJQnl0ZTQ7CQkgLy8gQlNTSUQgYnl0ZSA0CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlNQUNfQ1NSNV9TVFJVQywgKlBNQUNfQ1NSNV9TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9NQUNfQ1NSNV9TVFJVQwl7CisJc3RydWN0CXsKKwkJVUNIQVIJCUJ5dGU0OwkJIC8vIEJTU0lEIGJ5dGUgNAorCQlVQ0hBUgkJQnl0ZTU7CQkgLy8gQlNTSUQgYnl0ZSA1CisJCVVTSE9SVCAgICAgIAlCc3NJZE1hc2s6MjsgLy8gMDogb25lIEJTU0lELCAxMDogNCBCU1NJRCwgIDAxOiAyIEJTU0lEICwgMTE6IDhCU1NJRAorCQlVU0hPUlQJCU1Cc3NCY25OdW06MzsKKwkJVVNIT1JUCQlSc3ZkOjExOworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JTUFDX0NTUjVfU1RSVUMsICpQTUFDX0NTUjVfU1RSVUM7CisjZW5kaWYKKworI2RlZmluZSBNQVhfTEVOX0NGRyAgICAgICAgICAgICAgMHgxMDE4CQkvLyBydDI4NjBiIG1heCAxNmsgYnl0ZXMuIGJpdDEyOjEzIE1heGltdW0gUFNEVSBsZW5ndGggKHBvd2VyIGZhY3RvcikgMDoyXjEzLCAxOjJeMTQsIDI6Ml4xNSwgMzoyXjE2CisjZGVmaW5lIEJCUF9DU1JfQ0ZHICAgICAgICAgICAgCQkweDEwMWMJCS8vCisvLworLy8gQkJQX0NTUl9DRkc6IEJCUCBzZXJpYWwgY29udHJvbCByZWdpc3RlcgorLy8KKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9CQlBfQ1NSX0NGR19TVFJVQwl7CisJc3RydWN0CXsKKwkJVUlOVDMyCQk6MTI7CisJCVVJTlQzMgkJQkJQX1JXX01PREU6MTsJCS8vIDA6IHVzZSBzZXJpYWwgbW9kZSAgMTpwYXJhbGxlbAorCQlVSU5UMzIJCUJCUF9QQVJfRFVSOjE7CQkgICAgLy8gMDogNCBNQUMgY2xvY2sgY3ljbGVzICAxOiA4IE1BQyBjbG9jayBjeWNsZXMKKwkJVUlOVDMyCQlCdXN5OjE7CQkJCS8vIDE6IEFTSUMgaXMgYnVzeSBleGVjdXRlIEJCUCBwcm9ncmFtbWluZy4KKwkJVUlOVDMyCQlmUmVhZDoxOwkJICAgIC8vIDA6IFdyaXRlCUJCUCwgMToJUmVhZCBCQlAKKwkJVUlOVDMyCQlSZWdOdW06ODsJCQkvLyBTZWxlY3RlZAlCQlAJcmVnaXN0ZXIKKwkJVUlOVDMyCQlWYWx1ZTo4OwkJCS8vIFJlZ2lzdGVyCXZhbHVlIHRvIHByb2dyYW0gaW50byBCQlAKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CUJCUF9DU1JfQ0ZHX1NUUlVDLCAqUEJCUF9DU1JfQ0ZHX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX0JCUF9DU1JfQ0ZHX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVSU5UMzIJCVZhbHVlOjg7CQkJLy8gUmVnaXN0ZXIJdmFsdWUgdG8gcHJvZ3JhbSBpbnRvIEJCUAorCQlVSU5UMzIJCVJlZ051bTo4OwkJCS8vIFNlbGVjdGVkCUJCUAlyZWdpc3RlcgorCQlVSU5UMzIJCWZSZWFkOjE7CQkgICAgLy8gMDogV3JpdGUJQkJQLCAxOglSZWFkIEJCUAorCQlVSU5UMzIJCUJ1c3k6MTsJCQkJLy8gMTogQVNJQyBpcyBidXN5IGV4ZWN1dGUgQkJQIHByb2dyYW1taW5nLgorCQlVSU5UMzIJCUJCUF9QQVJfRFVSOjE7CQkgICAgIC8vIDA6IDQgTUFDIGNsb2NrIGN5Y2xlcyAgMTogOCBNQUMgY2xvY2sgY3ljbGVzCisJCVVJTlQzMgkJQkJQX1JXX01PREU6MTsJCS8vIDA6IHVzZSBzZXJpYWwgbW9kZSAgMTpwYXJhbGxlbAorCQlVSU5UMzIJCToxMjsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CUJCUF9DU1JfQ0ZHX1NUUlVDLCAqUEJCUF9DU1JfQ0ZHX1NUUlVDOworI2VuZGlmCisjZGVmaW5lIFJGX0NTUl9DRkcwICAgICAgICAgICAgCQkweDEwMjAKKy8vCisvLyBSRl9DU1JfQ0ZHOiBSRiBjb250cm9sIHJlZ2lzdGVyCisvLworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX1JGX0NTUl9DRkcwX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVSU5UMzIJCUJ1c3k6MTsJCSAgICAvLyAwOiBpZGxlIDE6IDhidXN5CisJCVVJTlQzMgkJU2VsOjE7CQkJCS8vIDA6UkZfTEUwIGFjdGl2YXRlICAxOlJGX0xFMSBhY3RpdmF0ZQorCQlVSU5UMzIJCVN0YW5kYnlNb2RlOjE7CQkgICAgLy8gMDogaGlnaCB3aGVuIHN0YW5kIGJ5IDE6CWxvdyB3aGVuIHN0YW5kYnkKKwkJVUlOVDMyCQliaXR3aWR0aDo1OwkJCS8vIFNlbGVjdGVkCUJCUAlyZWdpc3RlcgorCQlVSU5UMzIJCVJlZ0lkQW5kQ29udGVudDoyNDsJCQkvLyBSZWdpc3Rlcgl2YWx1ZSB0byBwcm9ncmFtIGludG8gQkJQCisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlSRl9DU1JfQ0ZHMF9TVFJVQywgKlBSRl9DU1JfQ0ZHMF9TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9SRl9DU1JfQ0ZHMF9TVFJVQwl7CisJc3RydWN0CXsKKwkJVUlOVDMyCQlSZWdJZEFuZENvbnRlbnQ6MjQ7CQkJLy8gUmVnaXN0ZXIJdmFsdWUgdG8gcHJvZ3JhbSBpbnRvIEJCUAorCQlVSU5UMzIJCWJpdHdpZHRoOjU7CQkJLy8gU2VsZWN0ZWQJQkJQCXJlZ2lzdGVyCisJCVVJTlQzMgkJU3RhbmRieU1vZGU6MTsJCSAgICAvLyAwOiBoaWdoIHdoZW4gc3RhbmQgYnkgMToJbG93IHdoZW4gc3RhbmRieQorCQlVSU5UMzIJCVNlbDoxOwkJCQkvLyAwOlJGX0xFMCBhY3RpdmF0ZSAgMTpSRl9MRTEgYWN0aXZhdGUKKwkJVUlOVDMyCQlCdXN5OjE7CQkgICAgLy8gMDogaWRsZSAxOiA4YnVzeQorCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JUkZfQ1NSX0NGRzBfU1RSVUMsICpQUkZfQ1NSX0NGRzBfU1RSVUM7CisjZW5kaWYKKyNkZWZpbmUgUkZfQ1NSX0NGRzEgICAgICAgICAgIAkJMHgxMDI0CisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfUkZfQ1NSX0NGRzFfU1RSVUMJeworCXN0cnVjdAl7CisJCVVJTlQzMgkJcnN2Ojc7CQkgICAgLy8gMDogaWRsZSAxOiA4YnVzeQorCQlVSU5UMzIJCVJGR2FwOjU7CQkJLy8gR2FwIGJldHdlZW4gQkJfQ09OVFJPTF9SRiBhbmQgUkZfTEUuIDA6IDMgc3lzdGVtIGNsb2NrIGN5Y2xlICgzNy41dXNlYykgMTogNSBzeXN0ZW0gY2xvY2sgY3ljbGUgKDYyLjV1c2VjKQorCQlVSU5UMzIJCVJlZ0lkQW5kQ29udGVudDoyNDsJCQkvLyBSZWdpc3Rlcgl2YWx1ZSB0byBwcm9ncmFtIGludG8gQkJQCisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlSRl9DU1JfQ0ZHMV9TVFJVQywgKlBSRl9DU1JfQ0ZHMV9TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9SRl9DU1JfQ0ZHMV9TVFJVQwl7CisJc3RydWN0CXsKKwkJVUlOVDMyCQlSZWdJZEFuZENvbnRlbnQ6MjQ7CQkJLy8gUmVnaXN0ZXIJdmFsdWUgdG8gcHJvZ3JhbSBpbnRvIEJCUAorCQlVSU5UMzIJCVJGR2FwOjU7CQkJLy8gR2FwIGJldHdlZW4gQkJfQ09OVFJPTF9SRiBhbmQgUkZfTEUuIDA6IDMgc3lzdGVtIGNsb2NrIGN5Y2xlICgzNy41dXNlYykgMTogNSBzeXN0ZW0gY2xvY2sgY3ljbGUgKDYyLjV1c2VjKQorCQlVSU5UMzIJCXJzdjo3OwkJICAgIC8vIDA6IGlkbGUgMTogOGJ1c3kKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVJGX0NTUl9DRkcxX1NUUlVDLCAqUFJGX0NTUl9DRkcxX1NUUlVDOworI2VuZGlmCisjZGVmaW5lIFJGX0NTUl9DRkcyICAgICAgICAgICAJCTB4MTAyOAkJLy8KKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9SRl9DU1JfQ0ZHMl9TVFJVQwl7CisJc3RydWN0CXsKKwkJVUlOVDMyCQlyc3Y6ODsJCSAgICAvLyAwOiBpZGxlIDE6IDhidXN5CisJCVVJTlQzMgkJUmVnSWRBbmRDb250ZW50OjI0OwkJCS8vIFJlZ2lzdGVyCXZhbHVlIHRvIHByb2dyYW0gaW50byBCQlAKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVJGX0NTUl9DRkcyX1NUUlVDLCAqUFJGX0NTUl9DRkcyX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX1JGX0NTUl9DRkcyX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVSU5UMzIJCVJlZ0lkQW5kQ29udGVudDoyNDsJCQkvLyBSZWdpc3Rlcgl2YWx1ZSB0byBwcm9ncmFtIGludG8gQkJQCisJCVVJTlQzMgkJcnN2Ojg7CQkgICAgLy8gMDogaWRsZSAxOiA4YnVzeQorCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JUkZfQ1NSX0NGRzJfU1RSVUMsICpQUkZfQ1NSX0NGRzJfU1RSVUM7CisjZW5kaWYKKyNkZWZpbmUgTEVEX0NGRyAgICAgICAgICAgCQkweDEwMmMJCS8vICBNQUNfQ1NSMTQKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9MRURfQ0ZHX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVSU5UMzIJCToxOworCQlVSU5UMzIJCUxlZFBvbGFyOjE7CQkJLy8gTGVkIFBvbGFyaXR5LiAgMDogYWN0aXZlIGxvdzE6IGFjdGl2ZSBoaWdoCisJCVVJTlQzMgkJWUxlZE1vZGU6MjsJCQkvLyB5ZWxsb3cgTGVkIE1vZGUKKwkJVUlOVDMyCQlHTGVkTW9kZToyOwkJCS8vIGdyZWVuIExlZCBNb2RlCisJCVVJTlQzMgkJUkxlZE1vZGU6MjsJCQkvLyByZWQgTGVkIE1vZGUgICAgMDogb2ZmMTogYmxpbmtpbmcgdXBvbiBUWDI6IHBlcmlvZGljIHNsb3cgYmxpbmtpbmczOiBhbHdheXMgb24KKwkJVUlOVDMyCQlyc3Y6MjsKKwkJVUlOVDMyCQlTbG93QmxpbmtQZXJpb2Q6NjsJCQkvLyBzbG93IGJsaW5raW5nIHBlcmlvZC4gdW5pdDoxbXMKKwkJVUlOVDMyCQlPZmZQZXJpb2Q6ODsJCQkvLyBibGlua2luZyBvZmYgcGVyaW9kIHVuaXQgMW1zCisJCVVJTlQzMgkJT25QZXJpb2Q6ODsJCQkvLyBibGlua2luZyBvbiBwZXJpb2QgdW5pdCAxbXMKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CUxFRF9DRkdfU1RSVUMsICpQTEVEX0NGR19TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9MRURfQ0ZHX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVSU5UMzIJCU9uUGVyaW9kOjg7CQkJLy8gYmxpbmtpbmcgb24gcGVyaW9kIHVuaXQgMW1zCisJCVVJTlQzMgkJT2ZmUGVyaW9kOjg7CQkJLy8gYmxpbmtpbmcgb2ZmIHBlcmlvZCB1bml0IDFtcworCQlVSU5UMzIJCVNsb3dCbGlua1BlcmlvZDo2OwkJCS8vIHNsb3cgYmxpbmtpbmcgcGVyaW9kLiB1bml0OjFtcworCQlVSU5UMzIJCXJzdjoyOworCQlVSU5UMzIJCVJMZWRNb2RlOjI7CQkJLy8gcmVkIExlZCBNb2RlICAgIDA6IG9mZjE6IGJsaW5raW5nIHVwb24gVFgyOiBwZXJpb2RpYyBzbG93IGJsaW5raW5nMzogYWx3YXlzIG9uCisJCVVJTlQzMgkJR0xlZE1vZGU6MjsJCQkvLyBncmVlbiBMZWQgTW9kZQorCQlVSU5UMzIJCVlMZWRNb2RlOjI7CQkJLy8geWVsbG93IExlZCBNb2RlCisJCVVJTlQzMgkJTGVkUG9sYXI6MTsJCQkvLyBMZWQgUG9sYXJpdHkuICAwOiBhY3RpdmUgbG93MTogYWN0aXZlIGhpZ2gKKwkJVUlOVDMyCQk6MTsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CUxFRF9DRkdfU1RSVUMsICpQTEVEX0NGR19TVFJVQzsKKyNlbmRpZgorLy8KKy8vICA0LjIgTUFDIFRJTUlORyAgY29uZmlndXJhdGlvbiByZWdpc3RlcnMgKG9mZnNldDoweDExMDApCisvLworI2RlZmluZSBYSUZTX1RJTUVfQ0ZHICAgICAgICAgICAgIDB4MTEwMAkJIC8vIE1BQ19DU1I4ICBNQUNfQ1NSOQorI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX0lGU19TTE9UX0NGR19TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVUlOVDMyICByc3Y6MjsKKwkgICAgVUlOVDMyICBCQlJ4ZW5kRW5hYmxlOjE7ICAgICAgICAvLyAgcmVmZXJlbmNlIFJYRU5EIHNpZ25hbCB0byBiZWdpbiBYSUZTIGRlZmVyCisJICAgIFVJTlQzMiAgRUlGUzo5OyAgICAgICAgLy8gIHVuaXQgMXVzCisJICAgIFVJTlQzMiAgT2ZkbVhpZnNUaW1lOjQ7ICAgICAgICAvL09GRE0gU0lGUy4gdW5pdCAxdXMuIEFwcGxpZWQgYWZ0ZXIgT0ZETSBSWCB3aGVuIE1BQyBkb2Vzbid0IHJlZmVyZW5jZSBCQlAgc2lnbmFsIEJCUlhFTkQKKwkgICAgVUlOVDMyICBPZmRtU2lmc1RpbWU6ODsgICAgICAgIC8vICB1bml0IDF1cy4gQXBwbGllZCBhZnRlciBPRkRNIFJYL1RYCisJICAgIFVJTlQzMiAgQ2NrbVNpZnNUaW1lOjg7ICAgICAgICAvLyAgdW5pdCAxdXMuIEFwcGxpZWQgYWZ0ZXIgQ0NLIFJYL1RYCisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlJRlNfU0xPVF9DRkdfU1RSVUMsICpQSUZTX1NMT1RfQ0ZHX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX0lGU19TTE9UX0NGR19TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVUlOVDMyICBDY2ttU2lmc1RpbWU6ODsgICAgICAgIC8vICB1bml0IDF1cy4gQXBwbGllZCBhZnRlciBDQ0sgUlgvVFgKKwkgICAgVUlOVDMyICBPZmRtU2lmc1RpbWU6ODsgICAgICAgIC8vICB1bml0IDF1cy4gQXBwbGllZCBhZnRlciBPRkRNIFJYL1RYCisJICAgIFVJTlQzMiAgT2ZkbVhpZnNUaW1lOjQ7ICAgICAgICAvL09GRE0gU0lGUy4gdW5pdCAxdXMuIEFwcGxpZWQgYWZ0ZXIgT0ZETSBSWCB3aGVuIE1BQyBkb2Vzbid0IHJlZmVyZW5jZSBCQlAgc2lnbmFsIEJCUlhFTkQKKwkgICAgVUlOVDMyICBFSUZTOjk7ICAgICAgICAvLyAgdW5pdCAxdXMKKwkgICAgVUlOVDMyICBCQlJ4ZW5kRW5hYmxlOjE7ICAgICAgICAvLyAgcmVmZXJlbmNlIFJYRU5EIHNpZ25hbCB0byBiZWdpbiBYSUZTIGRlZmVyCisJICAgIFVJTlQzMiAgcnN2OjI7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlJRlNfU0xPVF9DRkdfU1RSVUMsICpQSUZTX1NMT1RfQ0ZHX1NUUlVDOworI2VuZGlmCisKKyNkZWZpbmUgQktPRkZfU0xPVF9DRkcgICAgICAgICAgICAgMHgxMTA0CQkgLy8gIG1hY19jc3I5IGxhc3QgOCBiaXRzCisjZGVmaW5lIE5BVl9USU1FX0NGRyAgICAgICAgICAgICAweDExMDgJCSAvLyBOQVYgIChNQUNfQ1NSMTUpCisjZGVmaW5lIENIX1RJTUVfQ0ZHICAgICAgICAgICAgIDB4MTEwQwkJIAkvLyBDb3VudCBhcyBjaGFubmVsIGJ1c3kKKyNkZWZpbmUgUEJGX0xJRkVfVElNRVIgICAgICAgICAgICAgMHgxMTEwCQkgLy9UWC9SWCBNUERVIHRpbWVzdGFtcCB0aW1lciAoZnJlZSBydW4pVW5pdDogMXVzCisjZGVmaW5lIEJDTl9USU1FX0NGRyAgICAgICAgICAgICAweDExMTQJCSAvLyBUWFJYX0NTUjkKKworI2RlZmluZSBCQ05fT0ZGU0VUMAkJCQkweDA0MkMKKyNkZWZpbmUgQkNOX09GRlNFVDEJCQkJMHgwNDMwCisKKy8vCisvLyBCQ05fVElNRV9DRkcgOiBTeW5jaHJvbml6YXRpb24gY29udHJvbCByZWdpc3RlcgorLy8KKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9CQ05fVElNRV9DRkdfU1RSVUMJeworCXN0cnVjdAl7CisJCVVJTlQzMgkJVHhUaW1lc3RhbXBDb21wZW5zYXRlOjg7CisgICAgICAgIFVJTlQzMiAgICAgICA6MzsKKwkJVUlOVDMyCQliQmVhY29uR2VuOjE7CQkvLyBFbmFibGUgYmVhY29uIGdlbmVyYXRvcgorICAgICAgICBVSU5UMzIgICAgICAgYlRCVFRFbmFibGU6MTsKKwkJVUlOVDMyCQlUc2ZTeW5jTW9kZToyOwkJLy8gRW5hYmxlIFRTRiBzeW5jLCAwMDogZGlzYWJsZSwgMDE6IGluZnJhIG1vZGUsIDEwOiBhZC1ob2MgbW9kZQorCQlVSU5UMzIJCWJUc2ZUaWNraW5nOjE7CQkvLyBFbmFibGUgVFNGIGF1dG8gY291bnRpbmcKKwkJVUlOVDMyICAgICAgIEJlYWNvbkludGVydmFsOjE2OyAgLy8gaW4gdW5pdCBvZiAxLzE2IFRVCisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlCQ05fVElNRV9DRkdfU1RSVUMsICpQQkNOX1RJTUVfQ0ZHX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX0JDTl9USU1FX0NGR19TVFJVQwl7CisJc3RydWN0CXsKKwkJVUlOVDMyICAgICAgIEJlYWNvbkludGVydmFsOjE2OyAgLy8gaW4gdW5pdCBvZiAxLzE2IFRVCisJCVVJTlQzMgkJYlRzZlRpY2tpbmc6MTsJCS8vIEVuYWJsZSBUU0YgYXV0byBjb3VudGluZworCQlVSU5UMzIJCVRzZlN5bmNNb2RlOjI7CQkvLyBFbmFibGUgVFNGIHN5bmMsIDAwOiBkaXNhYmxlLCAwMTogaW5mcmEgbW9kZSwgMTA6IGFkLWhvYyBtb2RlCisgICAgICAgIFVJTlQzMiAgICAgICBiVEJUVEVuYWJsZToxOworCQlVSU5UMzIJCWJCZWFjb25HZW46MTsJCS8vIEVuYWJsZSBiZWFjb24gZ2VuZXJhdG9yCisgICAgICAgIFVJTlQzMiAgICAgICA6MzsKKwkJVUlOVDMyCQlUeFRpbWVzdGFtcENvbXBlbnNhdGU6ODsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CUJDTl9USU1FX0NGR19TVFJVQywgKlBCQ05fVElNRV9DRkdfU1RSVUM7CisjZW5kaWYKKyNkZWZpbmUgVEJUVF9TWU5DX0NGRyAgICAgICAgICAgIDB4MTExOCAgCQkvLyB0eHJ4X2NzcjEwCisjZGVmaW5lIFRTRl9USU1FUl9EVzAgICAgICAgICAgICAgMHgxMTFDICAJCS8vIExvY2FsIFRTRiB0aW1lciBsc2IgMzIgYml0cy4gUmVhZC1vbmx5CisjZGVmaW5lIFRTRl9USU1FUl9EVzEgICAgICAgICAgICAgMHgxMTIwICAJCS8vIG1zYiAzMiBiaXRzLiBSZWFkLW9ubHkuCisjZGVmaW5lIFRCVFRfVElNRVIgICAgICAgICAgICAgCTB4MTEyNCAgCQkvLyBUSW1lciByZW1haW5zIHRpbGwgbmV4dCBUQlRULiBSZWFkLW9ubHkuICBUWFJYX0NTUjE0CisjZGVmaW5lIElOVF9USU1FUl9DRkcgICAgICAgICAgICAgIAkweDExMjggIAkJLy8KKyNkZWZpbmUgSU5UX1RJTUVSX0VOICAgICAgICAgICAgIAkweDExMmMgIAkJLy8gIEdQLXRpbWVyIGFuZCBwcmUtdGJ0dCBJbnQgZW5hYmxlCisjZGVmaW5lIENIX0lETEVfU1RBICAgICAgICAgICAgICAJMHgxMTMwICAJCS8vICBjaGFubmVsIGlkbGUgdGltZQorI2RlZmluZSBDSF9CVVNZX1NUQSAgICAgICAgICAgICAgCTB4MTEzNCAgCQkvLyAgY2hhbm5sZSBidXN5IHRpbWUKKy8vCisvLyAgNC4yIE1BQyBQT1dFUiAgY29uZmlndXJhdGlvbiByZWdpc3RlcnMgKG9mZnNldDoweDEyMDApCisvLworI2RlZmluZSBNQUNfU1RBVFVTX0NGRyAgICAgICAgICAgICAweDEyMDAJCSAvLyBvbGQgTUFDX0NTUjEyCisjZGVmaW5lIFBXUl9QSU5fQ0ZHICAgICAgICAgICAgIDB4MTIwNAkJIC8vIG9sZCBNQUNfQ1NSMTIKKyNkZWZpbmUgQVVUT19XQUtFVVBfQ0ZHICAgICAgICAgICAgIDB4MTIwOAkJIC8vIG9sZCBNQUNfQ1NSMTAKKy8vCisvLyBBVVRPX1dBS0VVUF9DRkc6IE1hbnVhbCBwb3dlciBjb250cm9sIC8gc3RhdHVzIHJlZ2lzdGVyCisvLworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX0FVVE9fV0FLRVVQX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVSU5UMzIJCToxNjsKKwkJVUlOVDMyCQlFbmFibGVBdXRvV2FrZXVwOjE7CS8vIDA6c2xlZXAsIDE6YXdha2UKKwkJVUlOVDMyICAgICAgIE51bW9mU2xlZXBpbmdUYnR0Ojc7ICAgICAgICAgIC8vIEZvcmNlV2FrZSBoYXMgaGlnaCBwcml2aWxlZ2UgdGhhbiBQdXRUb1NsZWVwIHdoZW4gYm90aCBzZXQKKwkJVUlOVDMyICAgICAgIEF1dG9MZWFkVGltZTo4OworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JQVVUT19XQUtFVVBfU1RSVUMsICpQQVVUT19XQUtFVVBfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfQVVUT19XQUtFVVBfU1RSVUMJeworCXN0cnVjdAl7CisJCVVJTlQzMiAgICAgICBBdXRvTGVhZFRpbWU6ODsKKwkJVUlOVDMyICAgICAgIE51bW9mU2xlZXBpbmdUYnR0Ojc7ICAgICAgICAgIC8vIEZvcmNlV2FrZSBoYXMgaGlnaCBwcml2aWxlZ2UgdGhhbiBQdXRUb1NsZWVwIHdoZW4gYm90aCBzZXQKKwkJVUlOVDMyCQlFbmFibGVBdXRvV2FrZXVwOjE7CS8vIDA6c2xlZXAsIDE6YXdha2UKKwkJVUlOVDMyCQk6MTY7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlBVVRPX1dBS0VVUF9TVFJVQywgKlBBVVRPX1dBS0VVUF9TVFJVQzsKKyNlbmRpZgorLy8KKy8vICA0LjMgTUFDIFRYICBjb25maWd1cmF0aW9uIHJlZ2lzdGVycyAob2Zmc2V0OjB4MTMwMCkKKy8vCisKKyNkZWZpbmUgRURDQV9BQzBfQ0ZHCTB4MTMwMAkJLy9BQ19UWE9QX0NTUjAgMHgzNDc0CisjZGVmaW5lIEVEQ0FfQUMxX0NGRwkweDEzMDQKKyNkZWZpbmUgRURDQV9BQzJfQ0ZHCTB4MTMwOAorI2RlZmluZSBFRENBX0FDM19DRkcJMHgxMzBjCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfRURDQV9BQ19DRkdfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVJTlQzMiAgOjEyOyAgICAgICAgLy8KKwkgICAgVUlOVDMyICBDd21heDo0OyAgICAgICAgLy91bml0IHBvd2VyIG9mIDIKKwkgICAgVUlOVDMyICBDd21pbjo0OyAgICAgICAgLy8KKwkgICAgVUlOVDMyICBBaWZzbjo0OyAgICAgICAgLy8gIyBvZiBzbG90IHRpbWUKKwkgICAgVUlOVDMyICBBY1R4b3A6ODsgICAgICAgIC8vICBpbiB1bml0IG9mIDMydXMKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CUVEQ0FfQUNfQ0ZHX1NUUlVDLCAqUEVEQ0FfQUNfQ0ZHX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX0VEQ0FfQUNfQ0ZHX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVSU5UMzIgIEFjVHhvcDo4OyAgICAgICAgLy8gIGluIHVuaXQgb2YgMzJ1cworCSAgICBVSU5UMzIgIEFpZnNuOjQ7ICAgICAgICAvLyAjIG9mIHNsb3QgdGltZQorCSAgICBVSU5UMzIgIEN3bWluOjQ7ICAgICAgICAvLworCSAgICBVSU5UMzIgIEN3bWF4OjQ7ICAgICAgICAvL3VuaXQgcG93ZXIgb2YgMgorCSAgICBVSU5UMzIgIDoxMjsgICAgICAgLy8KKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CUVEQ0FfQUNfQ0ZHX1NUUlVDLCAqUEVEQ0FfQUNfQ0ZHX1NUUlVDOworI2VuZGlmCisKKyNkZWZpbmUgRURDQV9USURfQUNfTUFQCTB4MTMxMAorI2RlZmluZSBUWF9QV1JfQ0ZHXzAJMHgxMzE0CisjZGVmaW5lIFRYX1BXUl9DRkdfMQkweDEzMTgKKyNkZWZpbmUgVFhfUFdSX0NGR18yCTB4MTMxQworI2RlZmluZSBUWF9QV1JfQ0ZHXzMJMHgxMzIwCisjZGVmaW5lIFRYX1BXUl9DRkdfNAkweDEzMjQKKyNkZWZpbmUgVFhfUElOX0NGRwkJMHgxMzI4CisjZGVmaW5lIFRYX0JBTkRfQ0ZHCTB4MTMyYwkJLy8gMHgxIHVzZSB1cHBlciAyME1Iei4gMCBqdXNlIGxvd2VyIDIwTUh6CisjZGVmaW5lIFRYX1NXX0NGRzAJCTB4MTMzMAorI2RlZmluZSBUWF9TV19DRkcxCQkweDEzMzQKKyNkZWZpbmUgVFhfU1dfQ0ZHMgkJMHgxMzM4CisjZGVmaW5lIFRYT1BfVEhSRVNfQ0ZHCQkweDEzM2MKKyNkZWZpbmUgVFhPUF9DVFJMX0NGRwkJMHgxMzQwCisjZGVmaW5lIFRYX1JUU19DRkcJCTB4MTM0NAorCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfVFhfUlRTX0NGR19TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVUlOVDMyICAgICAgIHJzdjo3OworCSAgICBVSU5UMzIgICAgICAgUnRzRmJrRW46MTsgICAgLy8gZW5hYmxlIHJ0cyByYXRlIGZhbGxiYWNrCisJICAgIFVJTlQzMiAgICAgICBSdHNUaHJlczoxNjsgICAgLy8gdW5pdDpieXRlCisJICAgIFVJTlQzMiAgICAgICBBdXRvUnRzUmV0cnlMaW1pdDo4OworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JVFhfUlRTX0NGR19TVFJVQywgKlBUWF9SVFNfQ0ZHX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX1RYX1JUU19DRkdfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVJTlQzMiAgICAgICBBdXRvUnRzUmV0cnlMaW1pdDo4OworCSAgICBVSU5UMzIgICAgICAgUnRzVGhyZXM6MTY7ICAgIC8vIHVuaXQ6Ynl0ZQorCSAgICBVSU5UMzIgICAgICAgUnRzRmJrRW46MTsgICAgLy8gZW5hYmxlIHJ0cyByYXRlIGZhbGxiYWNrCisJICAgIFVJTlQzMiAgICAgICByc3Y6NzsgICAgIC8vIDE6IEhUIG5vbi1TVEJDIGNvbnRyb2wgZnJhbWUgZW5hYmxlCisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlUWF9SVFNfQ0ZHX1NUUlVDLCAqUFRYX1JUU19DRkdfU1RSVUM7CisjZW5kaWYKKyNkZWZpbmUgVFhfVElNRU9VVF9DRkcJMHgxMzQ4CisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfVFhfVElNRU9VVF9DRkdfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVJTlQzMiAgICAgICByc3YyOjg7CisJICAgIFVJTlQzMiAgICAgICBUeG9wVGltZW91dDo4OwkvL1RYT1AgdGltZW91dCB2YWx1ZSBmb3IgVFhPUCB0cnVuY2F0aW9uLiAgSXQgaXMgcmVjb21tZW5kZWQgdGhhdCAoU0xPVF9USU1FKSA+IChUWF9PUF9USU1FT1VUKSA+IChSWF9BQ0tfVElNRU9VVCkKKwkgICAgVUlOVDMyICAgICAgIFJ4QWNrVGltZW91dDo4OwkvLyB1bml0OnNsb3QuIFVzZWQgZm9yIFRYIHByZWNlZHVyZQorCSAgICBVSU5UMzIgICAgICAgTXBkdUxpZmVUaW1lOjQ7ICAgIC8vICBleHBpcmF0aW9uIHRpbWUgPSAyXig5K01QRFUgTElGRSBUSU1FKSAgdXMKKwkgICAgVUlOVDMyICAgICAgIHJzdjo0OworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JVFhfVElNRU9VVF9DRkdfU1RSVUMsICpQVFhfVElNRU9VVF9DRkdfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfVFhfVElNRU9VVF9DRkdfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVJTlQzMiAgICAgICByc3Y6NDsKKwkgICAgVUlOVDMyICAgICAgIE1wZHVMaWZlVGltZTo0OyAgICAvLyAgZXhwaXJhdGlvbiB0aW1lID0gMl4oOStNUERVIExJRkUgVElNRSkgIHVzCisJICAgIFVJTlQzMiAgICAgICBSeEFja1RpbWVvdXQ6ODsJLy8gdW5pdDpzbG90LiBVc2VkIGZvciBUWCBwcmVjZWR1cmUKKwkgICAgVUlOVDMyICAgICAgIFR4b3BUaW1lb3V0Ojg7CS8vVFhPUCB0aW1lb3V0IHZhbHVlIGZvciBUWE9QIHRydW5jYXRpb24uICBJdCBpcyByZWNvbW1lbmRlZCB0aGF0IChTTE9UX1RJTUUpID4gKFRYX09QX1RJTUVPVVQpID4gKFJYX0FDS19USU1FT1VUKQorCSAgICBVSU5UMzIgICAgICAgcnN2Mjo4OyAgICAgLy8gMTogSFQgbm9uLVNUQkMgY29udHJvbCBmcmFtZSBlbmFibGUKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVRYX1RJTUVPVVRfQ0ZHX1NUUlVDLCAqUFRYX1RJTUVPVVRfQ0ZHX1NUUlVDOworI2VuZGlmCisjZGVmaW5lIFRYX1JUWV9DRkcJMHgxMzRjCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbiBQQUNLRUQgX1RYX1JUWV9DRkdfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVJTlQzMiAgICAgICByc3Y6MTsKKwkgICAgVUlOVDMyICAgICAgIFR4YXV0b0ZCRW5hYmxlOjE7ICAgIC8vIFR4IHJldHJ5IFBIWSByYXRlIGF1dG8gZmFsbGJhY2sgZW5hYmxlCisJICAgIFVJTlQzMiAgICAgICBBZ2dSdHlNb2RlOjE7CS8vIEFnZ3JlZ2F0ZSBNUERVIHJldHJ5IG1vZGUuICAwOmV4cGlyZWQgYnkgcmV0cnkgbGltaXQsIDE6IGV4cGlyZWQgYnkgbXBkdSBsaWZlIHRpbWVyCisJICAgIFVJTlQzMiAgICAgICBOb25BZ2dSdHlNb2RlOjE7CS8vIE5vbi1BZ2dyZWdhdGUgTVBEVSByZXRyeSBtb2RlLiAgMDpleHBpcmVkIGJ5IHJldHJ5IGxpbWl0LCAxOiBleHBpcmVkIGJ5IG1wZHUgbGlmZSB0aW1lcgorCSAgICBVSU5UMzIgICAgICAgTG9uZ1J0eVRocmU6MTI7CS8vIExvbmcgcmV0cnkgdGhyZXNob29sZAorCSAgICBVSU5UMzIgICAgICAgTG9uZ1J0eUxpbWl0Ojg7CS8vbG9uZyByZXRyeSBsaW1pdAorCSAgICBVSU5UMzIgICAgICAgU2hvcnRSdHlMaW1pdDo4OwkvLyAgc2hvcnQgcmV0cnkgbGltaXQKKworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JVFhfUlRZX0NGR19TVFJVQywgKlBUWF9SVFlfQ0ZHX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24gUEFDS0VEIF9UWF9SVFlfQ0ZHX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVSU5UMzIgICAgICAgU2hvcnRSdHlMaW1pdDo4OwkvLyAgc2hvcnQgcmV0cnkgbGltaXQKKwkgICAgVUlOVDMyICAgICAgIExvbmdSdHlMaW1pdDo4OwkvL2xvbmcgcmV0cnkgbGltaXQKKwkgICAgVUlOVDMyICAgICAgIExvbmdSdHlUaHJlOjEyOwkvLyBMb25nIHJldHJ5IHRocmVzaG9vbGQKKwkgICAgVUlOVDMyICAgICAgIE5vbkFnZ1J0eU1vZGU6MTsJLy8gTm9uLUFnZ3JlZ2F0ZSBNUERVIHJldHJ5IG1vZGUuICAwOmV4cGlyZWQgYnkgcmV0cnkgbGltaXQsIDE6IGV4cGlyZWQgYnkgbXBkdSBsaWZlIHRpbWVyCisJICAgIFVJTlQzMiAgICAgICBBZ2dSdHlNb2RlOjE7CS8vIEFnZ3JlZ2F0ZSBNUERVIHJldHJ5IG1vZGUuICAwOmV4cGlyZWQgYnkgcmV0cnkgbGltaXQsIDE6IGV4cGlyZWQgYnkgbXBkdSBsaWZlIHRpbWVyCisJICAgIFVJTlQzMiAgICAgICBUeGF1dG9GQkVuYWJsZToxOyAgICAvLyBUeCByZXRyeSBQSFkgcmF0ZSBhdXRvIGZhbGxiYWNrIGVuYWJsZQorCSAgICBVSU5UMzIgICAgICAgcnN2OjE7ICAgICAvLyAxOiBIVCBub24tU1RCQyBjb250cm9sIGZyYW1lIGVuYWJsZQorCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JVFhfUlRZX0NGR19TVFJVQywgKlBUWF9SVFlfQ0ZHX1NUUlVDOworI2VuZGlmCisjZGVmaW5lIFRYX0xJTktfQ0ZHCTB4MTM1MAorI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JUEFDS0VEIF9UWF9MSU5LX0NGR19TVFJVQwl7CisJc3RydWN0IFBBQ0tFRCB7CisJICAgIFVJTlQzMiAgICAgICBSZW1vdE1GUzo4OwkvL3JlbW90ZSBNQ1MgZmVlZGJhY2sgc2VxdWVuY2UgbnVtYmVyCisJICAgIFVJTlQzMiAgICAgICBSZW1vdE1GQjo4OyAgICAvLyAgcmVtb3RlIE1DUyBmZWVkYmFjaworCSAgICBVSU5UMzIgICAgICAgcnN2OjM7CS8vCisJICAgIFVJTlQzMiAgICAgICBUeENGQWNrRW46MTsJLy8gICBQaWdneWJhY2sgQ0YtQUNLIGVuYWJsZQorCSAgICBVSU5UMzIgICAgICAgVHhSREdFbjoxOwkvLyBSREcgVFggZW5hYmxlCisJICAgIFVJTlQzMiAgICAgICBUeE1SUUVuOjE7CS8vICBNQ1MgcmVxdWVzdCBUWCBlbmFibGUKKwkgICAgVUlOVDMyICAgICAgIFJlbW90ZVVNRlNFbmFibGU6MTsJLy8gIHJlbW90ZSB1bnNvbGljaXQgIE1GQiBlbmFibGUuICAwOiBub3QgYXBwbHkgcmVtb3RlIHJlbW90ZSB1bnNvbGljaXQgKE1GUz03KQorCSAgICBVSU5UMzIgICAgICAgTUZCRW5hYmxlOjE7CS8vICBUWCBhcHBseSByZW1vdGUgTUZCIDE6ZW5hYmxlCisJICAgIFVJTlQzMiAgICAgICBSZW1vdGVNRkJMaWZlVGltZTo4OwkvL3JlbW90ZSBNRkIgbGlmZSB0aW1lLiB1bml0IDogMzJ1cworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JVFhfTElOS19DRkdfU1RSVUMsICpQVFhfTElOS19DRkdfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglQQUNLRUQgX1RYX0xJTktfQ0ZHX1NUUlVDCXsKKwlzdHJ1Y3QgUEFDS0VEIHsKKwkgICAgVUlOVDMyICAgICAgIFJlbW90ZU1GQkxpZmVUaW1lOjg7CS8vcmVtb3RlIE1GQiBsaWZlIHRpbWUuIHVuaXQgOiAzMnVzCisJICAgIFVJTlQzMiAgICAgICBNRkJFbmFibGU6MTsJLy8gIFRYIGFwcGx5IHJlbW90ZSBNRkIgMTplbmFibGUKKwkgICAgVUlOVDMyICAgICAgIFJlbW90ZVVNRlNFbmFibGU6MTsJLy8gIHJlbW90ZSB1bnNvbGljaXQgIE1GQiBlbmFibGUuICAwOiBub3QgYXBwbHkgcmVtb3RlIHJlbW90ZSB1bnNvbGljaXQgKE1GUz03KQorCSAgICBVSU5UMzIgICAgICAgVHhNUlFFbjoxOwkvLyAgTUNTIHJlcXVlc3QgVFggZW5hYmxlCisJICAgIFVJTlQzMiAgICAgICBUeFJER0VuOjE7CS8vIFJERyBUWCBlbmFibGUKKwkgICAgVUlOVDMyICAgICAgIFR4Q0ZBY2tFbjoxOwkvLyAgIFBpZ2d5YmFjayBDRi1BQ0sgZW5hYmxlCisJICAgIFVJTlQzMiAgICAgICByc3Y6MzsJLy8KKwkgICAgVUlOVDMyICAgICAgIFJlbW90TUZCOjg7ICAgIC8vICByZW1vdGUgTUNTIGZlZWRiYWNrCisJICAgIFVJTlQzMiAgICAgICBSZW1vdE1GUzo4OwkvL3JlbW90ZSBNQ1MgZmVlZGJhY2sgc2VxdWVuY2UgbnVtYmVyCisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlUWF9MSU5LX0NGR19TVFJVQywgKlBUWF9MSU5LX0NGR19TVFJVQzsKKyNlbmRpZgorI2RlZmluZSBIVF9GQktfQ0ZHMAkweDEzNTQKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uIFBBQ0tFRCBfSFRfRkJLX0NGRzBfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVJTlQzMiAgICAgICBIVE1DUzdGQks6NDsKKwkgICAgVUlOVDMyICAgICAgIEhUTUNTNkZCSzo0OworCSAgICBVSU5UMzIgICAgICAgSFRNQ1M1RkJLOjQ7CisJICAgIFVJTlQzMiAgICAgICBIVE1DUzRGQks6NDsKKwkgICAgVUlOVDMyICAgICAgIEhUTUNTM0ZCSzo0OworCSAgICBVSU5UMzIgICAgICAgSFRNQ1MyRkJLOjQ7CisJICAgIFVJTlQzMiAgICAgICBIVE1DUzFGQks6NDsKKwkgICAgVUlOVDMyICAgICAgIEhUTUNTMEZCSzo0OworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JSFRfRkJLX0NGRzBfU1RSVUMsICpQSFRfRkJLX0NGRzBfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbiBQQUNLRUQgX0hUX0ZCS19DRkcwX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVSU5UMzIgICAgICAgSFRNQ1MwRkJLOjQ7CisJICAgIFVJTlQzMiAgICAgICBIVE1DUzFGQks6NDsKKwkgICAgVUlOVDMyICAgICAgIEhUTUNTMkZCSzo0OworCSAgICBVSU5UMzIgICAgICAgSFRNQ1MzRkJLOjQ7CisJICAgIFVJTlQzMiAgICAgICBIVE1DUzRGQks6NDsKKwkgICAgVUlOVDMyICAgICAgIEhUTUNTNUZCSzo0OworCSAgICBVSU5UMzIgICAgICAgSFRNQ1M2RkJLOjQ7CisJICAgIFVJTlQzMiAgICAgICBIVE1DUzdGQks6NDsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CUhUX0ZCS19DRkcwX1NUUlVDLCAqUEhUX0ZCS19DRkcwX1NUUlVDOworI2VuZGlmCisjZGVmaW5lIEhUX0ZCS19DRkcxCTB4MTM1OAorI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX0hUX0ZCS19DRkcxX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVSU5UMzIgICAgICAgSFRNQ1MxNUZCSzo0OworCSAgICBVSU5UMzIgICAgICAgSFRNQ1MxNEZCSzo0OworCSAgICBVSU5UMzIgICAgICAgSFRNQ1MxM0ZCSzo0OworCSAgICBVSU5UMzIgICAgICAgSFRNQ1MxMkZCSzo0OworCSAgICBVSU5UMzIgICAgICAgSFRNQ1MxMUZCSzo0OworCSAgICBVSU5UMzIgICAgICAgSFRNQ1MxMEZCSzo0OworCSAgICBVSU5UMzIgICAgICAgSFRNQ1M5RkJLOjQ7CisJICAgIFVJTlQzMiAgICAgICBIVE1DUzhGQks6NDsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CUhUX0ZCS19DRkcxX1NUUlVDLCAqUEhUX0ZCS19DRkcxX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX0hUX0ZCS19DRkcxX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVSU5UMzIgICAgICAgSFRNQ1M4RkJLOjQ7CisJICAgIFVJTlQzMiAgICAgICBIVE1DUzlGQks6NDsKKwkgICAgVUlOVDMyICAgICAgIEhUTUNTMTBGQks6NDsKKwkgICAgVUlOVDMyICAgICAgIEhUTUNTMTFGQks6NDsKKwkgICAgVUlOVDMyICAgICAgIEhUTUNTMTJGQks6NDsKKwkgICAgVUlOVDMyICAgICAgIEhUTUNTMTNGQks6NDsKKwkgICAgVUlOVDMyICAgICAgIEhUTUNTMTRGQks6NDsKKwkgICAgVUlOVDMyICAgICAgIEhUTUNTMTVGQks6NDsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CUhUX0ZCS19DRkcxX1NUUlVDLCAqUEhUX0ZCS19DRkcxX1NUUlVDOworI2VuZGlmCisjZGVmaW5lIExHX0ZCS19DRkcwCTB4MTM1YworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX0xHX0ZCS19DRkcwX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVSU5UMzIgICAgICAgT0ZETU1DUzdGQks6NDsJLy9pbml0aWFsIHZhbHVlIGlzIDYKKwkgICAgVUlOVDMyICAgICAgIE9GRE1NQ1M2RkJLOjQ7CS8vaW5pdGlhbCB2YWx1ZSBpcyA1CisJICAgIFVJTlQzMiAgICAgICBPRkRNTUNTNUZCSzo0OwkvL2luaXRpYWwgdmFsdWUgaXMgNAorCSAgICBVSU5UMzIgICAgICAgT0ZETU1DUzRGQks6NDsJLy9pbml0aWFsIHZhbHVlIGlzIDMKKwkgICAgVUlOVDMyICAgICAgIE9GRE1NQ1MzRkJLOjQ7CS8vaW5pdGlhbCB2YWx1ZSBpcyAyCisJICAgIFVJTlQzMiAgICAgICBPRkRNTUNTMkZCSzo0OwkvL2luaXRpYWwgdmFsdWUgaXMgMQorCSAgICBVSU5UMzIgICAgICAgT0ZETU1DUzFGQks6NDsJLy9pbml0aWFsIHZhbHVlIGlzIDAKKwkgICAgVUlOVDMyICAgICAgIE9GRE1NQ1MwRkJLOjQ7CS8vaW5pdGlhbCB2YWx1ZSBpcyAwCisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlMR19GQktfQ0ZHMF9TVFJVQywgKlBMR19GQktfQ0ZHMF9TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9MR19GQktfQ0ZHMF9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVUlOVDMyICAgICAgIE9GRE1NQ1MwRkJLOjQ7CS8vaW5pdGlhbCB2YWx1ZSBpcyAwCisJICAgIFVJTlQzMiAgICAgICBPRkRNTUNTMUZCSzo0OwkvL2luaXRpYWwgdmFsdWUgaXMgMAorCSAgICBVSU5UMzIgICAgICAgT0ZETU1DUzJGQks6NDsJLy9pbml0aWFsIHZhbHVlIGlzIDEKKwkgICAgVUlOVDMyICAgICAgIE9GRE1NQ1MzRkJLOjQ7CS8vaW5pdGlhbCB2YWx1ZSBpcyAyCisJICAgIFVJTlQzMiAgICAgICBPRkRNTUNTNEZCSzo0OwkvL2luaXRpYWwgdmFsdWUgaXMgMworCSAgICBVSU5UMzIgICAgICAgT0ZETU1DUzVGQks6NDsJLy9pbml0aWFsIHZhbHVlIGlzIDQKKwkgICAgVUlOVDMyICAgICAgIE9GRE1NQ1M2RkJLOjQ7CS8vaW5pdGlhbCB2YWx1ZSBpcyA1CisJICAgIFVJTlQzMiAgICAgICBPRkRNTUNTN0ZCSzo0OwkvL2luaXRpYWwgdmFsdWUgaXMgNgorCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JTEdfRkJLX0NGRzBfU1RSVUMsICpQTEdfRkJLX0NGRzBfU1RSVUM7CisjZW5kaWYKKyNkZWZpbmUgTEdfRkJLX0NGRzEJCTB4MTM2MAorI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX0xHX0ZCS19DRkcxX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVSU5UMzIgICAgICAgcnN2OjE2OworCSAgICBVSU5UMzIgICAgICAgQ0NLTUNTM0ZCSzo0OwkvL2luaXRpYWwgdmFsdWUgaXMgMgorCSAgICBVSU5UMzIgICAgICAgQ0NLTUNTMkZCSzo0OwkvL2luaXRpYWwgdmFsdWUgaXMgMQorCSAgICBVSU5UMzIgICAgICAgQ0NLTUNTMUZCSzo0OwkvL2luaXRpYWwgdmFsdWUgaXMgMAorCSAgICBVSU5UMzIgICAgICAgQ0NLTUNTMEZCSzo0OwkvL2luaXRpYWwgdmFsdWUgaXMgMAorCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JTEdfRkJLX0NGRzFfU1RSVUMsICpQTEdfRkJLX0NGRzFfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfTEdfRkJLX0NGRzFfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVJTlQzMiAgICAgICBDQ0tNQ1MwRkJLOjQ7CS8vaW5pdGlhbCB2YWx1ZSBpcyAwCisJICAgIFVJTlQzMiAgICAgICBDQ0tNQ1MxRkJLOjQ7CS8vaW5pdGlhbCB2YWx1ZSBpcyAwCisJICAgIFVJTlQzMiAgICAgICBDQ0tNQ1MyRkJLOjQ7CS8vaW5pdGlhbCB2YWx1ZSBpcyAxCisJICAgIFVJTlQzMiAgICAgICBDQ0tNQ1MzRkJLOjQ7CS8vaW5pdGlhbCB2YWx1ZSBpcyAyCisJICAgIFVJTlQzMiAgICAgICByc3Y6MTY7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlMR19GQktfQ0ZHMV9TVFJVQywgKlBMR19GQktfQ0ZHMV9TVFJVQzsKKyNlbmRpZgorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vPT09PT09PT09PT09PT09PSBQcm90ZWN0aW9uIFBhcmFtYXRlcj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyNkZWZpbmUgQ0NLX1BST1RfQ0ZHCTB4MTM2NAkJLy9DQ0sgUHJvdGVjdGlvbgorI2RlZmluZSBBU0lDX1NIT1JUTkFWCQkxCisjZGVmaW5lIEFTSUNfTE9OR05BVgkJMgorI2RlZmluZSBBU0lDX1JUUwkJMQorI2RlZmluZSBBU0lDX0NUUwkJMgorI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX1BST1RfQ0ZHX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVSU5UMzIgICAgICAgcnN2OjU7CisJICAgIFVJTlQzMiAgICAgICBSVFNUaEVuOjE7CS8vUlRTIHRocmVzaG9sZCBlbmFibGUgb24gQ0NLIFRYCisJICAgIFVJTlQzMiAgICAgICBUeG9wQWxsb3dHRjQwOjE7CS8vQ0NLIFRYT1AgYWxsb3dhbmNlLjA6ZGlzYWxsb3cuCisJICAgIFVJTlQzMiAgICAgICBUeG9wQWxsb3dHRjIwOjE7CS8vQ0NLIFRYT1AgYWxsb3dhbmNlLjA6ZGlzYWxsb3cuCisJICAgIFVJTlQzMiAgICAgICBUeG9wQWxsb3dNTTQwOjE7CS8vQ0NLIFRYT1AgYWxsb3dhbmNlLjA6ZGlzYWxsb3cuCisJICAgIFVJTlQzMiAgICAgICBUeG9wQWxsb3dNTTIwOjE7CS8vQ0NLIFRYT1AgYWxsb3dhbmNlLiAwOmRpc2FsbG93LgorCSAgICBVSU5UMzIgICAgICAgVHhvcEFsbG93T2ZkbToxOwkvL0NDSyBUWE9QIGFsbG93YW5jZS4wOmRpc2FsbG93LgorCSAgICBVSU5UMzIgICAgICAgVHhvcEFsbG93Q2NrOjE7CS8vQ0NLIFRYT1AgYWxsb3dhbmNlLjA6ZGlzYWxsb3cuCisJICAgIFVJTlQzMiAgICAgICBQcm90ZWN0TmF2OjI7CS8vVFhPUCBwcm90ZWN0aW9uIHR5cGUgZm9yIENDSyBUWC4gMDpOb25lLCAxOlNob3J0TkFWcHJvdGVjdCwgIDI6TG9uZ05BVlByb3RlY3QsIDM6cnN2CisJICAgIFVJTlQzMiAgICAgICBQcm90ZWN0Q3RybDoyOwkvL1Byb3RlY3Rpb24gY29udHJvbCBmcmFtZSB0eXBlIGZvciBDQ0sgVFguIDE6UlRTL0NUUywgMjpDVFMtdG8tc2VsZiwgMDpOb25lLCAzOnJzdgorCSAgICBVSU5UMzIgICAgICAgUHJvdGVjdFJhdGU6MTY7CS8vUHJvdGVjdGlvbiBjb250cm9sIGZyYW1lIHJhdGUgZm9yIENDSyBUWChSVFMvQ1RTL0NGRW5kKS4KKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVBST1RfQ0ZHX1NUUlVDLCAqUFBST1RfQ0ZHX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX1BST1RfQ0ZHX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVSU5UMzIgICAgICAgUHJvdGVjdFJhdGU6MTY7CS8vUHJvdGVjdGlvbiBjb250cm9sIGZyYW1lIHJhdGUgZm9yIENDSyBUWChSVFMvQ1RTL0NGRW5kKS4KKwkgICAgVUlOVDMyICAgICAgIFByb3RlY3RDdHJsOjI7CS8vUHJvdGVjdGlvbiBjb250cm9sIGZyYW1lIHR5cGUgZm9yIENDSyBUWC4gMTpSVFMvQ1RTLCAyOkNUUy10by1zZWxmLCAwOk5vbmUsIDM6cnN2CisJICAgIFVJTlQzMiAgICAgICBQcm90ZWN0TmF2OjI7CS8vVFhPUCBwcm90ZWN0aW9uIHR5cGUgZm9yIENDSyBUWC4gMDpOb25lLCAxOlNob3J0TkFWcHJvdGVjdCwgIDI6TG9uZ05BVlByb3RlY3QsIDM6cnN2CisJICAgIFVJTlQzMiAgICAgICBUeG9wQWxsb3dDY2s6MTsJLy9DQ0sgVFhPUCBhbGxvd2FuY2UuMDpkaXNhbGxvdy4KKwkgICAgVUlOVDMyICAgICAgIFR4b3BBbGxvd09mZG06MTsJLy9DQ0sgVFhPUCBhbGxvd2FuY2UuMDpkaXNhbGxvdy4KKwkgICAgVUlOVDMyICAgICAgIFR4b3BBbGxvd01NMjA6MTsJLy9DQ0sgVFhPUCBhbGxvd2FuY2UuIDA6ZGlzYWxsb3cuCisJICAgIFVJTlQzMiAgICAgICBUeG9wQWxsb3dNTTQwOjE7CS8vQ0NLIFRYT1AgYWxsb3dhbmNlLjA6ZGlzYWxsb3cuCisJICAgIFVJTlQzMiAgICAgICBUeG9wQWxsb3dHRjIwOjE7CS8vQ0NLIFRYT1AgYWxsb3dhbmNlLjA6ZGlzYWxsb3cuCisJICAgIFVJTlQzMiAgICAgICBUeG9wQWxsb3dHRjQwOjE7CS8vQ0NLIFRYT1AgYWxsb3dhbmNlLjA6ZGlzYWxsb3cuCisJICAgIFVJTlQzMiAgICAgICBSVFNUaEVuOjE7CS8vUlRTIHRocmVzaG9sZCBlbmFibGUgb24gQ0NLIFRYCisJICAgIFVJTlQzMiAgICAgICByc3Y6NTsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVBST1RfQ0ZHX1NUUlVDLCAqUFBST1RfQ0ZHX1NUUlVDOworI2VuZGlmCisKKyNkZWZpbmUgT0ZETV9QUk9UX0NGRwkweDEzNjgJCS8vT0ZETSBQcm90ZWN0aW9uCisjZGVmaW5lIE1NMjBfUFJPVF9DRkcJMHgxMzZDCQkvL01NMjAgUHJvdGVjdGlvbgorI2RlZmluZSBNTTQwX1BST1RfQ0ZHCTB4MTM3MAkJLy9NTTQwIFByb3RlY3Rpb24KKyNkZWZpbmUgR0YyMF9QUk9UX0NGRwkweDEzNzQJCS8vR0YyMCBQcm90ZWN0aW9uCisjZGVmaW5lIEdGNDBfUFJPVF9DRkcJMHgxMzc4CQkvL0dSNDAgUHJvdGVjdGlvbgorI2RlZmluZSBFWFBfQ1RTX1RJTUUJMHgxMzdDCQkvLworI2RlZmluZSBFWFBfQUNLX1RJTUUJMHgxMzgwCQkvLworCisvLworLy8gIDQuNCBNQUMgUlggY29uZmlndXJhdGlvbiByZWdpc3RlcnMgKG9mZnNldDoweDE0MDApCisvLworI2RlZmluZSBSWF9GSUxUUl9DRkcJMHgxNDAwCQkJLy9UWFJYX0NTUjAKKyNkZWZpbmUgQVVUT19SU1BfQ0ZHCTB4MTQwNAkJCS8vVFhSWF9DU1I0CisvLworLy8gVFhSWF9DU1I0OiBBdXRvLVJlc3BvbmRlci8KKy8vCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZiB1bmlvbiBfQVVUT19SU1BfQ0ZHX1NUUlVDIHsKKyBzdHJ1Y3QgeworICAgICBVSU5UMzIgICAgICAgIDoyNDsKKyAgICAgVUlOVDMyICAgICAgIEFja0N0c1BzbUJpdDoxOyAgIC8vIFBvd2VyIGJpdCB2YWx1ZSBpbiBjb25ydHJvbCBmcmFtZQorICAgICBVSU5UMzIgICAgICAgRHVhbENUU0VuOjE7ICAgLy8gUG93ZXIgYml0IHZhbHVlIGluIGNvbnJ0cm9sIGZyYW1lCisgICAgIFVJTlQzMiAgICAgICByc3Y6MTsgICAvLyBQb3dlciBiaXQgdmFsdWUgaW4gY29ucnRyb2wgZnJhbWUKKyAgICAgVUlOVDMyICAgICAgIEF1dG9SZXNwb25kZXJQcmVhbWJsZToxOyAgICAvLyAwOmxvbmcsIDE6c2hvcnQgcHJlYW1ibGUKKyAgICAgVUlOVDMyICAgICAgIENUUzQwTVJlZjoxOyAgLy8gUmVzcG9uc2UgQ1RTIDQwTUh6IGR1cGxpY2F0ZSBtb2RlCisgICAgIFVJTlQzMiAgICAgICBDVFM0ME1Nb2RlOjE7ICAvLyBSZXNwb25zZSBDVFMgNDBNSHogZHVwbGljYXRlIG1vZGUKKyAgICAgVUlOVDMyICAgICAgIEJBQ0Fja1BvbGljeUVuYWJsZToxOyAgICAvLyAwOmxvbmcsIDE6c2hvcnQgcHJlYW1ibGUKKyAgICAgVUlOVDMyICAgICAgIEF1dG9SZXNwb25kZXJFbmFibGU6MTsKKyB9IGZpZWxkOworIFVJTlQzMiAgIHdvcmQ7Cit9IEFVVE9fUlNQX0NGR19TVFJVQywgKlBBVVRPX1JTUF9DRkdfU1RSVUM7CisjZWxzZQordHlwZWRlZiB1bmlvbiBfQVVUT19SU1BfQ0ZHX1NUUlVDIHsKKyBzdHJ1Y3QgeworICAgICBVSU5UMzIgICAgICAgQXV0b1Jlc3BvbmRlckVuYWJsZToxOworICAgICBVSU5UMzIgICAgICAgQkFDQWNrUG9saWN5RW5hYmxlOjE7ICAgIC8vIDA6bG9uZywgMTpzaG9ydCBwcmVhbWJsZQorICAgICBVSU5UMzIgICAgICAgQ1RTNDBNTW9kZToxOyAgLy8gUmVzcG9uc2UgQ1RTIDQwTUh6IGR1cGxpY2F0ZSBtb2RlCisgICAgIFVJTlQzMiAgICAgICBDVFM0ME1SZWY6MTsgIC8vIFJlc3BvbnNlIENUUyA0ME1IeiBkdXBsaWNhdGUgbW9kZQorICAgICBVSU5UMzIgICAgICAgQXV0b1Jlc3BvbmRlclByZWFtYmxlOjE7ICAgIC8vIDA6bG9uZywgMTpzaG9ydCBwcmVhbWJsZQorICAgICBVSU5UMzIgICAgICAgcnN2OjE7ICAgLy8gUG93ZXIgYml0IHZhbHVlIGluIGNvbnJ0cm9sIGZyYW1lCisgICAgIFVJTlQzMiAgICAgICBEdWFsQ1RTRW46MTsgICAvLyBQb3dlciBiaXQgdmFsdWUgaW4gY29ucnRyb2wgZnJhbWUKKyAgICAgVUlOVDMyICAgICAgIEFja0N0c1BzbUJpdDoxOyAgIC8vIFBvd2VyIGJpdCB2YWx1ZSBpbiBjb25ydHJvbCBmcmFtZQorICAgICBVSU5UMzIgICAgICAgIDoyNDsKKyB9IGZpZWxkOworIFVJTlQzMiAgIHdvcmQ7Cit9IEFVVE9fUlNQX0NGR19TVFJVQywgKlBBVVRPX1JTUF9DRkdfU1RSVUM7CisjZW5kaWYKKworI2RlZmluZSBMRUdBQ1lfQkFTSUNfUkFURQkweDE0MDgJLy8gIFRYUlhfQ1NSNSAgICAgICAgICAgMHgzMDU0CisjZGVmaW5lIEhUX0JBU0lDX1JBVEUJCTB4MTQwYworI2RlZmluZSBIVF9DVFJMX0NGRwkJMHgxNDEwCisjZGVmaW5lIFNJRlNfQ09TVF9DRkcJCTB4MTQxNAorI2RlZmluZSBSWF9QQVJTRVJfQ0ZHCQkweDE0MTgJLy9TZXQgTkFWIGZvciBhbGwgcmVjZWl2ZWQgZnJhbWVzCisKKy8vCisvLyAgNC41IE1BQyBTZWN1cml0eSBjb25maWd1cmF0aW9uIChvZmZzZXQ6MHgxNTAwKQorLy8KKyNkZWZpbmUgVFhfU0VDX0NOVDAJCTB4MTUwMAkJLy8KKyNkZWZpbmUgUlhfU0VDX0NOVDAJCTB4MTUwNAkJLy8KKyNkZWZpbmUgQ0NNUF9GQ19NVVRFCQkweDE1MDgJCS8vCisvLworLy8gIDQuNiBIQ0NBL1BTTVAgKG9mZnNldDoweDE2MDApCisvLworI2RlZmluZSBUWE9QX0hMRFJfQUREUjAJCTB4MTYwMAorI2RlZmluZSBUWE9QX0hMRFJfQUREUjEJCTB4MTYwNAorI2RlZmluZSBUWE9QX0hMRFJfRVQJCTB4MTYwOAorI2RlZmluZSBRT1NfQ0ZQT0xMX1JBX0RXMAkJMHgxNjBjCisjZGVmaW5lIFFPU19DRlBPTExfQTFfRFcxCQkweDE2MTAKKyNkZWZpbmUgUU9TX0NGUE9MTF9RQwkJMHgxNjE0CisvLworLy8gIDQuNyBNQUMgU3RhdGlzdGlzIHJlZ2lzdGVycyAob2Zmc2V0OjB4MTcwMCkKKy8vCisjZGVmaW5lIFJYX1NUQV9DTlQwCQkweDE3MDAJCS8vCisjZGVmaW5lIFJYX1NUQV9DTlQxCQkweDE3MDQJCS8vCisjZGVmaW5lIFJYX1NUQV9DTlQyCQkweDE3MDgJCS8vCisKKy8vCisvLyBSWF9TVEFfQ05UMF9TVFJVQzogUlggUExDUCBlcnJvciBjb3VudCAmIFJYIENSQyBlcnJvciBjb3VudAorLy8KKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9SWF9TVEFfQ05UMF9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVVNIT1JUICBQaHlFcnI7CisJICAgIFVTSE9SVCAgQ3JjRXJyOworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JUlhfU1RBX0NOVDBfU1RSVUMsICpQUlhfU1RBX0NOVDBfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfUlhfU1RBX0NOVDBfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVTSE9SVCAgQ3JjRXJyOworCSAgICBVU0hPUlQgIFBoeUVycjsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVJYX1NUQV9DTlQwX1NUUlVDLCAqUFJYX1NUQV9DTlQwX1NUUlVDOworI2VuZGlmCisKKy8vCisvLyBSWF9TVEFfQ05UMV9TVFJVQzogUlggRmFsc2UgQ0NBIGNvdW50ICYgUlggTE9ORyBmcmFtZSBjb3VudAorLy8KKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9SWF9TVEFfQ05UMV9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVVNIT1JUICBQbGNwRXJyOworCSAgICBVU0hPUlQgIEZhbHNlQ2NhOworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JUlhfU1RBX0NOVDFfU1RSVUMsICpQUlhfU1RBX0NOVDFfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfUlhfU1RBX0NOVDFfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVTSE9SVCAgRmFsc2VDY2E7CisJICAgIFVTSE9SVCAgUGxjcEVycjsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVJYX1NUQV9DTlQxX1NUUlVDLCAqUFJYX1NUQV9DTlQxX1NUUlVDOworI2VuZGlmCisKKy8vCisvLyBSWF9TVEFfQ05UMl9TVFJVQzoKKy8vCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfUlhfU1RBX0NOVDJfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVTSE9SVCAgUnhGaWZvT3ZlcmZsb3dDb3VudDsKKwkgICAgVVNIT1JUICBSeER1cGxpQ291bnQ7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlSWF9TVEFfQ05UMl9TVFJVQywgKlBSWF9TVEFfQ05UMl9TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9SWF9TVEFfQ05UMl9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVVNIT1JUICBSeER1cGxpQ291bnQ7CisJICAgIFVTSE9SVCAgUnhGaWZvT3ZlcmZsb3dDb3VudDsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVJYX1NUQV9DTlQyX1NUUlVDLCAqUFJYX1NUQV9DTlQyX1NUUlVDOworI2VuZGlmCisjZGVmaW5lIFRYX1NUQV9DTlQwCQkweDE3MEMJCS8vCisvLworLy8gU1RBX0NTUjM6IFRYIEJlYWNvbiBjb3VudAorLy8KKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9UWF9TVEFfQ05UMF9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVVNIT1JUICBUeEJlYWNvbkNvdW50OworCSAgICBVU0hPUlQgIFR4RmFpbENvdW50OworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JVFhfU1RBX0NOVDBfU1RSVUMsICpQVFhfU1RBX0NOVDBfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfVFhfU1RBX0NOVDBfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVTSE9SVCAgVHhGYWlsQ291bnQ7CisJICAgIFVTSE9SVCAgVHhCZWFjb25Db3VudDsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVRYX1NUQV9DTlQwX1NUUlVDLCAqUFRYX1NUQV9DTlQwX1NUUlVDOworI2VuZGlmCisjZGVmaW5lIFRYX1NUQV9DTlQxCQkweDE3MTAJCS8vCisvLworLy8gVFhfU1RBX0NOVDE6IFRYIHR4IGNvdW50CisvLworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX1RYX1NUQV9DTlQxX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVU0hPUlQgIFR4UmV0cmFuc21pdDsKKwkgICAgVVNIT1JUICBUeFN1Y2Nlc3M7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlUWF9TVEFfQ05UMV9TVFJVQywgKlBUWF9TVEFfQ05UMV9TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9UWF9TVEFfQ05UMV9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVVNIT1JUICBUeFN1Y2Nlc3M7CisJICAgIFVTSE9SVCAgVHhSZXRyYW5zbWl0OworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JVFhfU1RBX0NOVDFfU1RSVUMsICpQVFhfU1RBX0NOVDFfU1RSVUM7CisjZW5kaWYKKyNkZWZpbmUgVFhfU1RBX0NOVDIJCTB4MTcxNAkJLy8KKy8vCisvLyBUWF9TVEFfQ05UMjogVFggdHggY291bnQKKy8vCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfVFhfU1RBX0NOVDJfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVTSE9SVCAgVHhVbmRlckZsb3dDb3VudDsKKwkgICAgVVNIT1JUICBUeFplcm9MZW5Db3VudDsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVRYX1NUQV9DTlQyX1NUUlVDLCAqUFRYX1NUQV9DTlQyX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX1RYX1NUQV9DTlQyX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVU0hPUlQgIFR4WmVyb0xlbkNvdW50OworCSAgICBVU0hPUlQgIFR4VW5kZXJGbG93Q291bnQ7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlUWF9TVEFfQ05UMl9TVFJVQywgKlBUWF9TVEFfQ05UMl9TVFJVQzsKKyNlbmRpZgorI2RlZmluZSBUWF9TVEFfRklGTwkJMHgxNzE4CQkvLworLy8KKy8vIFRYX1NUQV9GSUZPX1NUUlVDOiBUWCBSZXN1bHQgZm9yIHNwZWNpZmljIFBJRCBzdGF0dXMgZmlmbyByZWdpc3RlcgorLy8KKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uIFBBQ0tFRCBfVFhfU1RBX0ZJRk9fU1RSVUMJeworCXN0cnVjdAl7CisJCVVJTlQzMgkJUmVzZXJ2ZToyOworCQlVSU5UMzIJCVR4QkY6MTsgLy8gMyozCisJCVVJTlQzMgkJU3VjY2Vzc1JhdGU6MTM7CS8vaW5jbHVkZSBNQ1MsIG1vZGUgLHNob3J0R0ksIEJXIHNldHRpbmdTYW1lIGZvcm1hdCBhcyBUWFdJIFdvcmQgMCBCaXQgMzEtMTYuCisvLwkJVUlOVDMyCQlTdWNjZXNzUmF0ZToxNjsJLy9pbmNsdWRlIE1DUywgbW9kZSAsc2hvcnRHSSwgQlcgc2V0dGluZ1NhbWUgZm9ybWF0IGFzIFRYV0kgV29yZCAwIEJpdCAzMS0xNi4KKwkJVUlOVDMyCQl3Y2lkOjg7CQkvL3dpcmVsZXNzIGNsaWVudCBpbmRleAorCQlVSU5UMzIgICAgICAgCVR4QWNrUmVxdWlyZWQ6MTsgICAgLy8gYWNrIHJlcXVpcmVkCisJCVVJTlQzMiAgICAgICAJVHhBZ2dyZToxOyAgICAvLyBUeCBpcyBhZ2dyZWdhdGVkCisJCVVJTlQzMiAgICAgICAJVHhTdWNjZXNzOjE7ICAgLy8gVHggc3VjY2Vzcy4gd2hldGhlciBzdWNjZXNzIG9yIG5vdAorCQlVSU5UMzIgICAgICAgCVBpZFR5cGU6NDsKKwkJVUlOVDMyICAgICAgIAliVmFsaWQ6MTsgICAvLyAxOlRoaXMgcmVnaXN0ZXIgY29udGFpbnMgYSB2YWxpZCBUWCByZXN1bHQKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVRYX1NUQV9GSUZPX1NUUlVDLCAqUFRYX1NUQV9GSUZPX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24gUEFDS0VEIF9UWF9TVEFfRklGT19TVFJVQwl7CisJc3RydWN0CXsKKwkJVUlOVDMyICAgICAgIAliVmFsaWQ6MTsgICAvLyAxOlRoaXMgcmVnaXN0ZXIgY29udGFpbnMgYSB2YWxpZCBUWCByZXN1bHQKKwkJVUlOVDMyICAgICAgIAlQaWRUeXBlOjQ7CisJCVVJTlQzMiAgICAgICAJVHhTdWNjZXNzOjE7ICAgLy8gVHggTm8gcmV0cnkgc3VjY2VzcworCQlVSU5UMzIgICAgICAgCVR4QWdncmU6MTsgICAgLy8gVHggUmV0cnkgU3VjY2VzcworCQlVSU5UMzIgICAgICAgCVR4QWNrUmVxdWlyZWQ6MTsgICAgLy8gVHggZmFpbAorCQlVSU5UMzIJCXdjaWQ6ODsJCS8vd2lyZWxlc3MgY2xpZW50IGluZGV4CisvLwkJVUlOVDMyCQlTdWNjZXNzUmF0ZToxNjsJLy9pbmNsdWRlIE1DUywgbW9kZSAsc2hvcnRHSSwgQlcgc2V0dGluZ1NhbWUgZm9ybWF0IGFzIFRYV0kgV29yZCAwIEJpdCAzMS0xNi4KKwkJVUlOVDMyCQlTdWNjZXNzUmF0ZToxMzsJLy9pbmNsdWRlIE1DUywgbW9kZSAsc2hvcnRHSSwgQlcgc2V0dGluZ1NhbWUgZm9ybWF0IGFzIFRYV0kgV29yZCAwIEJpdCAzMS0xNi4KKwkJVUlOVDMyCQlUeEJGOjE7CisJCVVJTlQzMgkJUmVzZXJ2ZToyOworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JVFhfU1RBX0ZJRk9fU1RSVUMsICpQVFhfU1RBX0ZJRk9fU1RSVUM7CisjZW5kaWYKKy8vIERlYnVnIGNvdW50ZXIKKyNkZWZpbmUgVFhfQUdHX0NOVAkweDE3MWMKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9UWF9BR0dfQ05UX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVU0hPUlQgIEFnZ1R4Q291bnQ7CisJICAgIFVTSE9SVCAgTm9uQWdnVHhDb3VudDsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVRYX0FHR19DTlRfU1RSVUMsICpQVFhfQUdHX0NOVF9TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9UWF9BR0dfQ05UX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVU0hPUlQgIE5vbkFnZ1R4Q291bnQ7CisJICAgIFVTSE9SVCAgQWdnVHhDb3VudDsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVRYX0FHR19DTlRfU1RSVUMsICpQVFhfQUdHX0NOVF9TVFJVQzsKKyNlbmRpZgorLy8gRGVidWcgY291bnRlcgorI2RlZmluZSBUWF9BR0dfQ05UMAkweDE3MjAKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9UWF9BR0dfQ05UMF9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVVNIT1JUICBBZ2dTaXplMkNvdW50OworCSAgICBVU0hPUlQgIEFnZ1NpemUxQ291bnQ7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlUWF9BR0dfQ05UMF9TVFJVQywgKlBUWF9BR0dfQ05UMF9TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9UWF9BR0dfQ05UMF9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVVNIT1JUICBBZ2dTaXplMUNvdW50OworCSAgICBVU0hPUlQgIEFnZ1NpemUyQ291bnQ7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlUWF9BR0dfQ05UMF9TVFJVQywgKlBUWF9BR0dfQ05UMF9TVFJVQzsKKyNlbmRpZgorLy8gRGVidWcgY291bnRlcgorI2RlZmluZSBUWF9BR0dfQ05UMQkweDE3MjQKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9UWF9BR0dfQ05UMV9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVVNIT1JUICBBZ2dTaXplNENvdW50OworCSAgICBVU0hPUlQgIEFnZ1NpemUzQ291bnQ7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlUWF9BR0dfQ05UMV9TVFJVQywgKlBUWF9BR0dfQ05UMV9TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9UWF9BR0dfQ05UMV9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVVNIT1JUICBBZ2dTaXplM0NvdW50OworCSAgICBVU0hPUlQgIEFnZ1NpemU0Q291bnQ7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlUWF9BR0dfQ05UMV9TVFJVQywgKlBUWF9BR0dfQ05UMV9TVFJVQzsKKyNlbmRpZgorI2RlZmluZSBUWF9BR0dfQ05UMgkweDE3MjgKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9UWF9BR0dfQ05UMl9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVVNIT1JUICBBZ2dTaXplNkNvdW50OworCSAgICBVU0hPUlQgIEFnZ1NpemU1Q291bnQ7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlUWF9BR0dfQ05UMl9TVFJVQywgKlBUWF9BR0dfQ05UMl9TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9UWF9BR0dfQ05UMl9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVVNIT1JUICBBZ2dTaXplNUNvdW50OworCSAgICBVU0hPUlQgIEFnZ1NpemU2Q291bnQ7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlUWF9BR0dfQ05UMl9TVFJVQywgKlBUWF9BR0dfQ05UMl9TVFJVQzsKKyNlbmRpZgorLy8gRGVidWcgY291bnRlcgorI2RlZmluZSBUWF9BR0dfQ05UMwkweDE3MmMKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9UWF9BR0dfQ05UM19TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVVNIT1JUICBBZ2dTaXplOENvdW50OworCSAgICBVU0hPUlQgIEFnZ1NpemU3Q291bnQ7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlUWF9BR0dfQ05UM19TVFJVQywgKlBUWF9BR0dfQ05UM19TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9UWF9BR0dfQ05UM19TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVVNIT1JUICBBZ2dTaXplN0NvdW50OworCSAgICBVU0hPUlQgIEFnZ1NpemU4Q291bnQ7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlUWF9BR0dfQ05UM19TVFJVQywgKlBUWF9BR0dfQ05UM19TVFJVQzsKKyNlbmRpZgorLy8gRGVidWcgY291bnRlcgorI2RlZmluZSBUWF9BR0dfQ05UNAkweDE3MzAKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9UWF9BR0dfQ05UNF9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVVNIT1JUICBBZ2dTaXplMTBDb3VudDsKKwkgICAgVVNIT1JUICBBZ2dTaXplOUNvdW50OworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JVFhfQUdHX0NOVDRfU1RSVUMsICpQVFhfQUdHX0NOVDRfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfVFhfQUdHX0NOVDRfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVTSE9SVCAgQWdnU2l6ZTlDb3VudDsKKwkgICAgVVNIT1JUICBBZ2dTaXplMTBDb3VudDsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVRYX0FHR19DTlQ0X1NUUlVDLCAqUFRYX0FHR19DTlQ0X1NUUlVDOworI2VuZGlmCisjZGVmaW5lIFRYX0FHR19DTlQ1CTB4MTczNAorI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX1RYX0FHR19DTlQ1X1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVU0hPUlQgIEFnZ1NpemUxMkNvdW50OworCSAgICBVU0hPUlQgIEFnZ1NpemUxMUNvdW50OworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JVFhfQUdHX0NOVDVfU1RSVUMsICpQVFhfQUdHX0NOVDVfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfVFhfQUdHX0NOVDVfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVTSE9SVCAgQWdnU2l6ZTExQ291bnQ7CisJICAgIFVTSE9SVCAgQWdnU2l6ZTEyQ291bnQ7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlUWF9BR0dfQ05UNV9TVFJVQywgKlBUWF9BR0dfQ05UNV9TVFJVQzsKKyNlbmRpZgorI2RlZmluZSBUWF9BR0dfQ05UNgkJMHgxNzM4CisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfVFhfQUdHX0NOVDZfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVTSE9SVCAgQWdnU2l6ZTE0Q291bnQ7CisJICAgIFVTSE9SVCAgQWdnU2l6ZTEzQ291bnQ7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlUWF9BR0dfQ05UNl9TVFJVQywgKlBUWF9BR0dfQ05UNl9TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9UWF9BR0dfQ05UNl9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVVNIT1JUICBBZ2dTaXplMTNDb3VudDsKKwkgICAgVVNIT1JUICBBZ2dTaXplMTRDb3VudDsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVRYX0FHR19DTlQ2X1NUUlVDLCAqUFRYX0FHR19DTlQ2X1NUUlVDOworI2VuZGlmCisjZGVmaW5lIFRYX0FHR19DTlQ3CQkweDE3M2MKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9UWF9BR0dfQ05UN19TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVVNIT1JUICBBZ2dTaXplMTZDb3VudDsKKwkgICAgVVNIT1JUICBBZ2dTaXplMTVDb3VudDsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVRYX0FHR19DTlQ3X1NUUlVDLCAqUFRYX0FHR19DTlQ3X1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX1RYX0FHR19DTlQ3X1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVU0hPUlQgIEFnZ1NpemUxNUNvdW50OworCSAgICBVU0hPUlQgIEFnZ1NpemUxNkNvdW50OworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JVFhfQUdHX0NOVDdfU1RSVUMsICpQVFhfQUdHX0NOVDdfU1RSVUM7CisjZW5kaWYKKyNkZWZpbmUgTVBEVV9ERU5TSVRZX0NOVAkJMHgxNzQwCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfTVBEVV9ERU5fQ05UX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVU0hPUlQgIFJYWmVyb0RlbENvdW50OwkvL1JYIHplcm8gbGVuZ3RoIGRlbGltaXRlciBjb3VudAorCSAgICBVU0hPUlQgIFRYWmVyb0RlbENvdW50OwkvL1RYIHplcm8gbGVuZ3RoIGRlbGltaXRlciBjb3VudAorCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JTVBEVV9ERU5fQ05UX1NUUlVDLCAqUE1QRFVfREVOX0NOVF9TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9NUERVX0RFTl9DTlRfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVTSE9SVCAgVFhaZXJvRGVsQ291bnQ7CS8vVFggemVybyBsZW5ndGggZGVsaW1pdGVyIGNvdW50CisJICAgIFVTSE9SVCAgUlhaZXJvRGVsQ291bnQ7CS8vUlggemVybyBsZW5ndGggZGVsaW1pdGVyIGNvdW50CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlNUERVX0RFTl9DTlRfU1RSVUMsICpQTVBEVV9ERU5fQ05UX1NUUlVDOworI2VuZGlmCisvLworLy8gVFhSWCBjb250cm9sIHJlZ2lzdGVycyAtIGJhc2UgYWRkcmVzcyAweDMwMDAKKy8vCisvLyBydDI4NjBiICBVTktOT1dOIHJlZyB1c2UgUi9PIFJlZyBBZGRyIDB4NzdkMCBmaXJzdC4uCisjZGVmaW5lIFRYUlhfQ1NSMSAgICAgICAgICAgMHg3N2QwCisKKy8vCisvLyBTZWN1cml0eSBrZXkgdGFibGUgbWVtb3J5LCBiYXNlIGFkZHJlc3MgPSAweDEwMDAKKy8vCisjZGVmaW5lIE1BQ19XQ0lEX0JBU0UJCTB4MTgwMCAvLzgtYnl0ZXModXNlIG9ubHkgNi1ieXRlcykgKiAyNTYgZW50cnkgPQorI2RlZmluZSBIV19XQ0lEX0VOVFJZX1NJWkUgICA4CisjZGVmaW5lIFBBSVJXSVNFX0tFWV9UQUJMRV9CQVNFICAgICAweDQwMDAgICAgICAvLyAzMi1ieXRlICogMjU2LWVudHJ5ID0gIC1ieXRlCisjZGVmaW5lIEhXX0tFWV9FTlRSWV9TSVpFICAgICAgICAgICAweDIwCisjZGVmaW5lIFBBSVJXSVNFX0lWRUlWX1RBQkxFX0JBU0UgICAgIDB4NjAwMCAgICAgIC8vIDgtYnl0ZSAqIDI1Ni1lbnRyeSA9ICAtYnl0ZQorI2RlZmluZSBNQUNfSVZFSVZfVEFCTEVfQkFTRSAgICAgMHg2MDAwICAgICAgLy8gOC1ieXRlICogMjU2LWVudHJ5ID0gIC1ieXRlCisjZGVmaW5lIEhXX0lWRUlWX0VOVFJZX1NJWkUgICA4CisjZGVmaW5lIE1BQ19XQ0lEX0FUVFJJQlVURV9CQVNFICAgICAweDY4MDAgICAgICAvLyA0LWJ5dGUgKiAyNTYtZW50cnkgPSAgLWJ5dGUKKyNkZWZpbmUgSFdfV0NJRF9BVFRSSV9TSVpFICAgNAorI2RlZmluZSBXQ0lEX1JFU0VSVkVEICAgICAgICAgIAkJMHg2YmZjCisjZGVmaW5lIFNIQVJFRF9LRVlfVEFCTEVfQkFTRSAgICAgICAweDZjMDAgICAgICAvLyAzMi1ieXRlICogMTYtZW50cnkgPSA1MTItYnl0ZQorI2RlZmluZSBTSEFSRURfS0VZX01PREVfQkFTRSAgICAgICAweDcwMDAgICAgICAvLyAzMi1ieXRlICogMTYtZW50cnkgPSA1MTItYnl0ZQorI2RlZmluZSBIV19TSEFSRURfS0VZX01PREVfU0laRSAgIDQKKyNkZWZpbmUgU0hBUkVES0VZVEFCTEUJCQkwCisjZGVmaW5lIFBBSVJXSVNFS0VZVEFCTEUJCQkxCisKKworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX1NIQVJFREtFWV9NT0RFX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVSU5UMzIgICAgICAgOjE7CisJCVVJTlQzMiAgICAgICBCc3MxS2V5M0NpcGhlckFsZzozOworCQlVSU5UMzIgICAgICAgOjE7CisJCVVJTlQzMiAgICAgICBCc3MxS2V5MkNpcGhlckFsZzozOworCQlVSU5UMzIgICAgICAgOjE7CisJCVVJTlQzMiAgICAgICBCc3MxS2V5MUNpcGhlckFsZzozOworCQlVSU5UMzIgICAgICAgOjE7CisJCVVJTlQzMiAgICAgICBCc3MxS2V5MENpcGhlckFsZzozOworCQlVSU5UMzIgICAgICAgOjE7CisJCVVJTlQzMiAgICAgICBCc3MwS2V5M0NpcGhlckFsZzozOworCQlVSU5UMzIgICAgICAgOjE7CisJCVVJTlQzMiAgICAgICBCc3MwS2V5MkNpcGhlckFsZzozOworCQlVSU5UMzIgICAgICAgOjE7CisJCVVJTlQzMiAgICAgICBCc3MwS2V5MUNpcGhlckFsZzozOworCQlVSU5UMzIgICAgICAgOjE7CisJCVVJTlQzMiAgICAgICBCc3MwS2V5MENpcGhlckFsZzozOworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JU0hBUkVES0VZX01PREVfU1RSVUMsICpQU0hBUkVES0VZX01PREVfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfU0hBUkVES0VZX01PREVfU1RSVUMJeworCXN0cnVjdAl7CisJCVVJTlQzMiAgICAgICBCc3MwS2V5MENpcGhlckFsZzozOworCQlVSU5UMzIgICAgICAgOjE7CisJCVVJTlQzMiAgICAgICBCc3MwS2V5MUNpcGhlckFsZzozOworCQlVSU5UMzIgICAgICAgOjE7CisJCVVJTlQzMiAgICAgICBCc3MwS2V5MkNpcGhlckFsZzozOworCQlVSU5UMzIgICAgICAgOjE7CisJCVVJTlQzMiAgICAgICBCc3MwS2V5M0NpcGhlckFsZzozOworCQlVSU5UMzIgICAgICAgOjE7CisJCVVJTlQzMiAgICAgICBCc3MxS2V5MENpcGhlckFsZzozOworCQlVSU5UMzIgICAgICAgOjE7CisJCVVJTlQzMiAgICAgICBCc3MxS2V5MUNpcGhlckFsZzozOworCQlVSU5UMzIgICAgICAgOjE7CisJCVVJTlQzMiAgICAgICBCc3MxS2V5MkNpcGhlckFsZzozOworCQlVSU5UMzIgICAgICAgOjE7CisJCVVJTlQzMiAgICAgICBCc3MxS2V5M0NpcGhlckFsZzozOworCQlVSU5UMzIgICAgICAgOjE7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlTSEFSRURLRVlfTU9ERV9TVFJVQywgKlBTSEFSRURLRVlfTU9ERV9TVFJVQzsKKyNlbmRpZgorLy8gNjQtZW50cnkgZm9yIHBhaXJ3aXNlIGtleSB0YWJsZQordHlwZWRlZiBzdHJ1Y3QgX0hXX1dDSURfRU5UUlkgeyAgLy8gOC1ieXRlIHBlciBlbnRyeQorICAgIFVDSEFSICAgQWRkcmVzc1s2XTsKKyAgICBVQ0hBUiAgIFJzdlsyXTsKK30gSFdfV0NJRF9FTlRSWSwgUEhXX1dDSURfRU5UUlk7CisKKworCisvLworLy8gT3RoZXIgb24tY2hpcCBzaGFyZWQgbWVtb3J5IHNwYWNlLCBiYXNlID0gMHgyMDAwCisvLworCisvLyBDSVMgc3BhY2UgLSBiYXNlIGFkZHJlc3MgPSAweDIwMDAKKyNkZWZpbmUgSFdfQ0lTX0JBU0UgICAgICAgICAgICAgMHgyMDAwCisKKy8vIENhcnJpZXItc2Vuc2UgQ1RTIGZyYW1lIGJhc2UgYWRkcmVzcy4gSXQncyB3aGVyZSBtYWMgc3RvcmVzIGNhcnJpZXItc2Vuc2UgZnJhbWUgZm9yIGNhcnJpZXItc2Vuc2UgZnVuY3Rpb24uCisjZGVmaW5lIEhXX0NTX0NUU19CQVNFCQkJMHg3NzAwCisvLyBERlMgQ1RTIGZyYW1lIGJhc2UgYWRkcmVzcy4gSXQncyB3aGVyZSBtYWMgc3RvcmVzIENUUyBmcmFtZSBmb3IgREZTLgorI2RlZmluZSBIV19ERlNfQ1RTX0JBU0UJCQkweDc3ODAKKyNkZWZpbmUgSFdfQ1RTX0ZSQU1FX1NJWkUJCTB4ODAKKworLy8gMjAwNC0xMS0wOCBqb2huIC0gc2luY2UgTlVMTCBmcmFtZSB3b24ndCBiZSB0aGF0IGxvbmcgKDI1NiBieXRlKS4gV2Ugc3RlYWwgMTYgdGFpbCBieXRlcworLy8gdG8gc2F2ZSBkZWJ1Z2dpbmcgc2V0dGluZ3MKKyNkZWZpbmUgSFdfREVCVUdfU0VUVElOR19CQVNFICAgMHg3N2YwICAvLyAweDc3ZjB+MHg3N2ZmIHRvdGFsIDE2IGJ5dGVzCisjZGVmaW5lIEhXX0RFQlVHX1NFVFRJTkdfQkFTRTIgICAweDc3NzAgIC8vIDB4NzdmMH4weDc3ZmYgdG90YWwgMTYgYnl0ZXMKKworI2lmIDAKKy8vIG9uLWNoaXAgQkVBQ09OIGZyYW1lIHNwYWNlIC0gYmFzZSBhZGRyZXNzID0gMHg3ODAwCisjZGVmaW5lIEhXX0JFQUNPTl9NQVhfU0laRSAgICAgIDB4MDgwMCAvKiB1bml0OiBieXRlICovCisjZGVmaW5lIEhXX0JFQUNPTl9CQVNFMCAgICAgICAgIDB4NzgwMAorI2RlZmluZSBIV19CRUFDT05fQkFTRTEgICAgICAgICAweDc5MDAKKyNkZWZpbmUgSFdfQkVBQ09OX0JBU0UyICAgICAgICAgMHg3YTAwCisjZGVmaW5lIEhXX0JFQUNPTl9CQVNFMyAgICAgICAgIDB4N2IwMAorI2RlZmluZSBIV19CRUFDT05fQkFTRTQgICAgICAgICAweDdjMDAKKyNkZWZpbmUgSFdfQkVBQ09OX0JBU0U1ICAgICAgICAgMHg3ZDAwCisjZGVmaW5lIEhXX0JFQUNPTl9CQVNFNiAgICAgICAgIDB4N2UwMAorI2RlZmluZSBIV19CRUFDT05fQkFTRTcgICAgICAgICAweDdmMDAKKy8qIDEuIEhXX0JFQUNPTl9PRkZTRVQvNjRCIG11c3QgYmUgMDsKKyAgIDIuIEJDTl9PRkZTRVQwIG11c3QgYWxzbyBiZSBjaGFuZ2VkIGluIE5JQ0luaXRpYWxpemVBc2ljKCk7CisgICAzLiBtYXggMHgwODAwIGZvciA4IGJlYWNvbiBmcmFtZXM7ICovCisjZWxzZQorLy8gSW4gb3JkZXIgdG8gc3VwcG9ydCBtYXhpbXVtIDggTUJTUyBhbmQgaXRzIG1heGltdW0gbGVuZ3RoIGlzIDUxMiBmb3IgZWFjaCBiZWFjb24KKy8vIFRocmVlIHNlY3Rpb24gZGlzY29udGludWUgbWVtb3J5IHNlZ21lbnRzIHdpbGwgYmUgdXNlZC4KKy8vIDEuIFRoZSBvcmlnaW5hbCByZWdpb24gZm9yIEJDTiAwfjMKKy8vIDIuIEV4dHJhY3QgbWVtb3J5IGZyb20gRkNFIHRhYmxlIGZvciBCQ04gNH41CisvLyAzLiBFeHRyYWN0IG1lbW9yeSBmcm9tIFBhaXItd2lzZSBrZXkgdGFibGUgZm9yIEJDTiA2fjcKKy8vCSAgSXQgb2NjdXBpZWQgdGhvc2UgbWVtb3J5IG9mIHdjaWQgMjM4fjI1MyBmb3IgQkNOIDYKKy8vCQkJCQkJICAgICAgYW5kIHdjaWQgMjIyfjIzNyBmb3IgQkNOIDcKKyNkZWZpbmUgSFdfQkVBQ09OX01BWF9TSVpFICAgICAgMHgxMDAwIC8qIHVuaXQ6IGJ5dGUgKi8KKyNkZWZpbmUgSFdfQkVBQ09OX0JBU0UwICAgICAgICAgMHg3ODAwCisjZGVmaW5lIEhXX0JFQUNPTl9CQVNFMSAgICAgICAgIDB4N0EwMAorI2RlZmluZSBIV19CRUFDT05fQkFTRTIgICAgICAgICAweDdDMDAKKyNkZWZpbmUgSFdfQkVBQ09OX0JBU0UzICAgICAgICAgMHg3RTAwCisjZGVmaW5lIEhXX0JFQUNPTl9CQVNFNCAgICAgICAgIDB4NzIwMAorI2RlZmluZSBIV19CRUFDT05fQkFTRTUgICAgICAgICAweDc0MDAKKyNkZWZpbmUgSFdfQkVBQ09OX0JBU0U2ICAgICAgICAgMHg1REMwCisjZGVmaW5lIEhXX0JFQUNPTl9CQVNFNyAgICAgICAgIDB4NUJDMAorI2VuZGlmCisKKyNkZWZpbmUgSFdfQkVBQ09OX01BWF9DT1VOVCAgICAgOAorI2RlZmluZSBIV19CRUFDT05fT0ZGU0VUCQkweDAyMDAKKyNkZWZpbmUgSFdfQkVBQ09OX0NPTlRFTlRfTEVOCShIV19CRUFDT05fT0ZGU0VUIC0gVFhXSV9TSVpFKQorCisvLyBIT1NULU1DVSBzaGFyZWQgbWVtb3J5IC0gYmFzZSBhZGRyZXNzID0gMHgyMTAwCisjZGVmaW5lIEhPU1RfQ01EX0NTUgkJMHg0MDQKKyNkZWZpbmUgSDJNX01BSUxCT1hfQ1NSICAgICAgICAgMHg3MDEwCisjZGVmaW5lIEgyTV9NQUlMQk9YX0NJRCAgICAgICAgIDB4NzAxNAorI2RlZmluZSBIMk1fTUFJTEJPWF9TVEFUVVMgICAgICAweDcwMWMKKyNkZWZpbmUgSDJNX0lOVF9TUkMgICAgICAgICAgICAgMHg3MDI0CisjZGVmaW5lIEgyTV9CQlBfQUdFTlQgICAgICAgICAgIDB4NzAyOAorI2RlZmluZSBNMkhfQ01EX0RPTkVfQ1NSICAgICAgICAweDAwMGMKKyNkZWZpbmUgTUNVX1RYT1BfQVJSQVlfQkFTRSAgICAgMHgwMDBjICAgLy8gVE9ETzogdG8gYmUgcHJvdmlkZWQgYnkgQWxiZXJ0CisjZGVmaW5lIE1DVV9UWE9QX0VOVFJZX1NJWkUgICAgIDMyICAgICAgIC8vIFRPRE86IHRvIGJlIHByb3ZpZGVkIGJ5IEFsYmVydAorI2RlZmluZSBNQVhfTlVNX09GX1RYT1BfRU5UUlkgICAxNiAgICAgICAvLyBUT0RPOiBtdXN0IGJlIHNhbWUgd2l0aCA4MDUxIGZpcm13YXJlCisjZGVmaW5lIE1DVV9NQk9YX1ZFUlNJT04gICAgICAgIDB4MDEgICAgIC8vIFRPRE86IHRvIGJlIGNvbmZpcm1lZCBieSBBbGJlcnQKKyNkZWZpbmUgTUNVX01CT1hfVkVSU0lPTl9PRkZTRVQgNSAgICAgICAgLy8gVE9ETzogdG8gYmUgcHJvdmlkZWQgYnkgQWxiZXJ0CisKKy8vCisvLyBIb3N0IERNQSByZWdpc3RlcnMgLSBiYXNlIGFkZHJlc3MgMHgyMDAgLiAgVFgwLTM9RURDQVFpZDAtMywgVFg0PUhDQ0EsIFRYNT1NR01ULAorLy8KKy8vCisvLyAgRE1BIFJJTkcgREVTQ1JJUFRPUgorLy8KKyNkZWZpbmUgRTJQUk9NX0NTUiAgICAgICAgICAweDAwMDQKKyNkZWZpbmUgSU9fQ05UTF9DU1IgICAgICAgICAweDc3ZDAKKworI2lmZGVmIFJUMjg3MAorLy8gODA1MSBmaXJtd2FyZSBpbWFnZSBmb3IgdXNiIC0gdXNlIGxhc3QtaGFsZiBiYXNlIGFkZHJlc3MgPSAweDMwMDAKKyNkZWZpbmUgRklSTVdBUkVfSU1BR0VfQkFTRSAgICAgMHgzMDAwCisjZGVmaW5lIE1BWF9GSVJNV0FSRV9JTUFHRV9TSVpFIDB4MTAwMCAgICAvLyA0a2J5dGUKKyNlbmRpZiAvLyBSVDI4NzAgLy8KKworLy8gVE9ETzogPz8/Pz8gb2xkIFJUMjU2MCByZWdpc3RlcnMuIHRvIGtlZXAgdGhlbSBvciByZW1vdmUgdGhlbT8KKy8vI2RlZmluZSBNQ0FTVDAgICAgICAgICAgICAgICAgICAweDAxNzggIC8vIG11bHRpY2FzdCBmaWx0ZXIgcmVnaXN0ZXIgMAorLy8jZGVmaW5lIE1DQVNUMSAgICAgICAgICAgICAgICAgIDB4MDE3YyAgLy8gbXVsdGljYXN0IGZpbHRlciByZWdpc3RlciAxCisKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gVHggLwlSeCAvIE1nbXQgcmluZyBkZXNjcmlwdG9yIGRlZmluaXRpb24KKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLy8gdGhlIGZvbGxvd2luZyBQSUQgdmFsdWVzIGFyZSB1c2VkIHRvIG1hcmsgb3V0Z29pbmcgZnJhbWUgdHlwZSBpbiBUWEQtPlBJRCBzbyB0aGF0CisvLyBwcm9wZXIgVFggc3RhdGlzdGljcyBjYW4gYmUgY29sbGVjdGVkIGJhc2VkIG9uIHRoZXNlIGNhdGVnb3JpZXMKKy8vIGIzLTIgb2YgUElEIGZpZWxkIC0KKyNkZWZpbmUgUElEX01HTVQJCQkweDA1CisjZGVmaW5lIFBJRF9CRUFDT04JCQkweDBjCisjZGVmaW5lIFBJRF9EQVRBX05PUk1BTFVDQVNUCSAJMHgwMgorI2RlZmluZSBQSURfREFUQV9BTVBEVQkgCTB4MDQKKyNkZWZpbmUgUElEX0RBVEFfTk9fQUNLICAgIAkweDA4CisjZGVmaW5lIFBJRF9EQVRBX05PVF9OT1JNX0FDSwkgCTB4MDMKKyNpZiAwCisjZGVmaW5lIFBUWVBFX0RBVEFfUkVRVUlSRV9BQ0sgIDB4MDAgLy8gYjctNjowMCwgYjUtMDogMH41OSBpcyBNQUMgdGFibGUgaW5kZXggKEFJRD8pLCA2MH42MyBpcyBXRFMgaW5kZXgKKyNkZWZpbmUgUFRZUEVfTlVMTF9BVF9ISUdIX1JBVEUgMHgwNCAvLyBiNy02OjAxLCBiNS0wOiAwfjU5IGlzIE1BQyB0YWJsZSBpbmRleCAoQUlEPyksIDYwfjYzIGlzIFdEUyBpbmRleAorI2RlZmluZSBQVFlQRV9SRVNFUlZFRCAgICAgICAgICAweDA4IC8vIGI3LTY6MTAKKyNkZWZpbmUgUFRZUEVfU1BFQ0lBTCAgICAgICAgICAgMHgwYyAvLyBiNy02OjExCisKKy8vIHdoZW4gYjMtMj0xMSAoUFRZUEVfU1BFQ0lBTCksIGIxLTAgY291YmUgYmUgLi4uCisjZGVmaW5lIFBTVUJUWVBFX0RBVEFfTk9fQUNLICAgIDB4MDAKKyNkZWZpbmUgUFNVQlRZUEVfTUdNVCAgICAgICAgICAgMHgwMQorI2RlZmluZSBQU1VCVFlQRV9PVEhFUl9DTlRMICAgICAweDAyCisjZGVmaW5lIFBTVUJUWVBFX1JUUyAgICAgICAgICAgIDB4MDMKKyNlbmRpZgorLy8gdmFsdWUgZG9tYWluIG9mIHBUeEQtPkhvc3RRSWQgKDQtYml0OiAwfjE1KQorI2RlZmluZSBRSURfQUNfQksgICAgICAgICAgICAgICAxICAgLy8gbWVldCBBQ0kgZGVmaW5pdGlvbiBpbiA4MDIuMTFlCisjZGVmaW5lIFFJRF9BQ19CRSAgICAgICAgICAgICAgIDAgICAvLyBtZWV0IEFDSSBkZWZpbml0aW9uIGluIDgwMi4xMWUKKyNkZWZpbmUgUUlEX0FDX1ZJICAgICAgICAgICAgICAgMgorI2RlZmluZSBRSURfQUNfVk8gICAgICAgICAgICAgICAzCisjZGVmaW5lIFFJRF9IQ0NBICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgTlVNX09GX1RYX1JJTkcgICAgICAgICAgNQorI2RlZmluZSBRSURfTUdNVCAgICAgICAgICAgICAgICAxMworI2RlZmluZSBRSURfUlggICAgICAgICAgICAgICAgICAxNAorI2RlZmluZSBRSURfT1RIRVIgICAgICAgICAgICAgICAxNQorCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQkJQICYgUkYJZGVmaW5pdGlvbgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZGVmaW5lCUJVU1kJCSAgICAgICAgICAgICAgICAxCisjZGVmaW5lCUlETEUJCSAgICAgICAgICAgICAgICAwCisKKyNkZWZpbmUJUkZfUjAwCQkJCQkgICAgMAorI2RlZmluZQlSRl9SMDEJCQkJCSAgICAxCisjZGVmaW5lCVJGX1IwMgkJCQkJICAgIDIKKyNkZWZpbmUJUkZfUjAzCQkJCQkgICAgMworI2RlZmluZQlSRl9SMDQJCQkJCSAgICA0CisjZGVmaW5lCVJGX1IwNQkJCQkJICAgIDUKKyNkZWZpbmUJUkZfUjA2CQkJCQkgICAgNgorI2RlZmluZQlSRl9SMDcJCQkJCSAgICA3CisjZGVmaW5lCVJGX1IwOAkJCQkJICAgIDgKKyNkZWZpbmUJUkZfUjA5CQkJCQkgICAgOQorI2RlZmluZQlSRl9SMTAJCQkJCSAgICAxMAorI2RlZmluZQlSRl9SMTEJCQkJCSAgICAxMQorI2RlZmluZQlSRl9SMTIJCQkJCSAgICAxMgorI2RlZmluZQlSRl9SMTMJCQkJCSAgICAxMworI2RlZmluZQlSRl9SMTQJCQkJCSAgICAxNAorI2RlZmluZQlSRl9SMTUJCQkJCSAgICAxNQorI2RlZmluZQlSRl9SMTYJCQkJCSAgICAxNgorI2RlZmluZQlSRl9SMTcJCQkJCSAgICAxNworI2RlZmluZQlSRl9SMTgJCQkJCSAgICAxOAorI2RlZmluZQlSRl9SMTkJCQkJCSAgICAxOQorI2RlZmluZQlSRl9SMjAJCQkJCSAgICAyMAorI2RlZmluZQlSRl9SMjEJCQkJCSAgICAyMQorI2RlZmluZQlSRl9SMjIJCQkJCSAgICAyMgorI2RlZmluZQlSRl9SMjMJCQkJCSAgICAyMworI2RlZmluZQlSRl9SMjQJCQkJCSAgICAyNAorI2RlZmluZQlSRl9SMjUJCQkJCSAgICAyNQorI2RlZmluZQlSRl9SMjYJCQkJCSAgICAyNgorI2RlZmluZQlSRl9SMjcJCQkJCSAgICAyNworI2RlZmluZQlSRl9SMjgJCQkJCSAgICAyOAorI2RlZmluZQlSRl9SMjkJCQkJCSAgICAyOQorI2RlZmluZQlSRl9SMzAJCQkJCSAgICAzMAorI2RlZmluZQlSRl9SMzEJCQkJCSAgICAzMQorCisjZGVmaW5lCUJCUF9SMAkJCQkJICAgIDAgIC8vIHZlcnNpb24KKyNkZWZpbmUJQkJQX1IxCQkJCSAgICAgICAgMSAgLy8gVFNTSQorI2RlZmluZQlCQlBfUjIgICAgICAgICAgCQkJMiAgLy8gVFggY29uZmlndXJlCisjZGVmaW5lIEJCUF9SMyAgICAgICAgICAgICAgICAgICAgICAzCisjZGVmaW5lIEJCUF9SNCAgICAgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIEJCUF9SNSAgICAgICAgICAgICAgICAgICAgICA1CisjZGVmaW5lIEJCUF9SNiAgICAgICAgICAgICAgICAgICAgICA2CisjZGVmaW5lCUJCUF9SMTQJCQkgICAgICAgICAgICAxNCAvLyBSWCBjb25maWd1cmUKKyNkZWZpbmUgQkJQX1IxNiAgICAgICAgICAgICAgICAgICAgIDE2CisjZGVmaW5lIEJCUF9SMTcgICAgICAgICAgICAgICAgICAgICAxNyAvLyBSWCBzZW5zaWJpbGl0eQorI2RlZmluZSBCQlBfUjE4ICAgICAgICAgICAgICAgICAgICAgMTgKKyNkZWZpbmUgQkJQX1IyMSAgICAgICAgICAgICAgICAgICAgIDIxCisjZGVmaW5lIEJCUF9SMjIgICAgICAgICAgICAgICAgICAgICAyMgorI2RlZmluZSBCQlBfUjI0ICAgICAgICAgICAgICAgICAgICAgMjQKKyNkZWZpbmUgQkJQX1IyNSAgICAgICAgICAgICAgICAgICAgIDI1CisjZGVmaW5lIEJCUF9SNDkgICAgICAgICAgICAgICAgICAgICA0OSAvL1RTU0kKKyNkZWZpbmUgQkJQX1I1MCAgICAgICAgICAgICAgICAgICAgIDUwCisjZGVmaW5lIEJCUF9SNTEgICAgICAgICAgICAgICAgICAgICA1MQorI2RlZmluZSBCQlBfUjUyICAgICAgICAgICAgICAgICAgICAgNTIKKyNkZWZpbmUgQkJQX1I1NSAgICAgICAgICAgICAgICAgICAgIDU1CisjZGVmaW5lIEJCUF9SNjIgICAgICAgICAgICAgICAgICAgICA2MiAvLyBSeCBTUTAgVGhyZXNob2xkIEhJR0gKKyNkZWZpbmUgQkJQX1I2MyAgICAgICAgICAgICAgICAgICAgIDYzCisjZGVmaW5lIEJCUF9SNjQgICAgICAgICAgICAgICAgICAgICA2NAorI2RlZmluZSBCQlBfUjY1ICAgICAgICAgICAgICAgICAgICAgNjUKKyNkZWZpbmUgQkJQX1I2NiAgICAgICAgICAgICAgICAgICAgIDY2CisjZGVmaW5lIEJCUF9SNjcgICAgICAgICAgICAgICAgICAgICA2NworI2RlZmluZSBCQlBfUjY4ICAgICAgICAgICAgICAgICAgICAgNjgKKyNkZWZpbmUgQkJQX1I2OSAgICAgICAgICAgICAgICAgICAgIDY5CisjZGVmaW5lIEJCUF9SNzAgICAgICAgICAgICAgICAgICAgICA3MCAvLyBSeCBBR0MgU1EgQ0NLIFhjb3JyIHRocmVzaG9sZAorI2RlZmluZSBCQlBfUjczICAgICAgICAgICAgICAgICAgICAgNzMKKyNkZWZpbmUgQkJQX1I3NQkJCQkJCTc1CisjZGVmaW5lIEJCUF9SNzcgICAgICAgICAgICAgICAgICAgICA3NworI2RlZmluZSBCQlBfUjgxICAgICAgICAgICAgICAgICAgICAgODEKKyNkZWZpbmUgQkJQX1I4MiAgICAgICAgICAgICAgICAgICAgIDgyCisjZGVmaW5lIEJCUF9SODMgICAgICAgICAgICAgICAgICAgICA4MworI2RlZmluZSBCQlBfUjg0ICAgICAgICAgICAgICAgICAgICAgODQKKyNkZWZpbmUgQkJQX1I4NgkJCQkJCTg2CisjZGVmaW5lIEJCUF9SOTEJCQkJCQk5MQorI2RlZmluZSBCQlBfUjkyCQkJCQkJOTIKKyNkZWZpbmUgQkJQX1I5NCAgICAgICAgICAgICAgICAgICAgIDk0IC8vIFR4IEdhaW4gQ29udHJvbAorI2RlZmluZSBCQlBfUjEwMyAgICAgICAgICAgICAgICAgICAgMTAzCisjZGVmaW5lIEJCUF9SMTA1ICAgICAgICAgICAgICAgICAgICAxMDUKKyNkZWZpbmUgQkJQX1IxMTMgICAgICAgICAgICAgICAgICAgIDExMworI2RlZmluZSBCQlBfUjExNCAgICAgICAgICAgICAgICAgICAgMTE0CisjZGVmaW5lIEJCUF9SMTE1ICAgICAgICAgICAgICAgICAgICAxMTUKKyNkZWZpbmUgQkJQX1IxMTYgICAgICAgICAgICAgICAgICAgIDExNgorI2RlZmluZSBCQlBfUjExNyAgICAgICAgICAgICAgICAgICAgMTE3CisjZGVmaW5lIEJCUF9SMTE4ICAgICAgICAgICAgICAgICAgICAxMTgKKyNkZWZpbmUgQkJQX1IxMTkgICAgICAgICAgICAgICAgICAgIDExOQorI2RlZmluZSBCQlBfUjEyMCAgICAgICAgICAgICAgICAgICAgMTIwCisjZGVmaW5lIEJCUF9SMTIxICAgICAgICAgICAgICAgICAgICAxMjEKKyNkZWZpbmUgQkJQX1IxMjIgICAgICAgICAgICAgICAgICAgIDEyMgorI2RlZmluZSBCQlBfUjEyMyAgICAgICAgICAgICAgICAgICAgMTIzCisKKworI2RlZmluZSBCQlBSOTRfREVGQVVMVCAgICAgICAgICAgICAgMHgwNiAvLyBBZGQgMSB2YWx1ZSB3aWxsIGdhaW4gMWRiCisKKy8vI2RlZmluZSBQSFlfVFJfU1dJVENIX1RJTUUgICAgICAgICAgNSAgLy8gdXNlYworCisvLyNkZWZpbmUgQkJQX1IxN19MT1dfU0VOU0lCSUxJVFkgICAgIDB4NTAKKy8vI2RlZmluZSBCQlBfUjE3X01JRF9TRU5TSUJJTElUWSAgICAgMHg0MQorLy8jZGVmaW5lIEJCUF9SMTdfRFlOQU1JQ19VUF9CT1VORCAgICAweDQwCisjZGVmaW5lIFJTU0lfRk9SX1ZFUllfTE9XX1NFTlNJQklMSVRZIC0zNQorI2RlZmluZSBSU1NJX0ZPUl9MT1dfU0VOU0lCSUxJVFkgICAgICAtNTgKKyNkZWZpbmUgUlNTSV9GT1JfTUlEX0xPV19TRU5TSUJJTElUWSAgLTgwCisjZGVmaW5lIFJTU0lfRk9SX01JRF9TRU5TSUJJTElUWSAgICAgIC05MAorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEVFUFJPTSBkZWZpbml0aW9uCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgRUVETyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDgKKyNkZWZpbmUgRUVESSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQKKyNkZWZpbmUgRUVDUyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgRUVTSyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgRUVSTCAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAKKworI2RlZmluZSBFRVBST01fV1JJVEVfT1BDT0RFICAgICAgICAgMHgwNQorI2RlZmluZSBFRVBST01fUkVBRF9PUENPREUgICAgICAgICAgMHgwNgorI2RlZmluZSBFRVBST01fRVdEU19PUENPREUgICAgICAgICAgMHgxMAorI2RlZmluZSBFRVBST01fRVdFTl9PUENPREUgICAgICAgICAgMHgxMworCisjZGVmaW5lCU5VTV9FRVBST01fQkJQX1BBUk1TCQkxOQkJCS8vIEluY2x1ZGUgTklDIENvbmZpZyAwLCAxLCBDUiwgVFggQUxDIHN0ZXAsIEJCUHMKKyNkZWZpbmUJTlVNX0VFUFJPTV9UWF9HX1BBUk1TCQk3CisjZGVmaW5lCUVFUFJPTV9OSUMxX09GRlNFVCAgICAgICAgICAweDM0CQkvLyBUaGUgYWRkcmVzcyBpcyBmcm9tIE5JQyBjb25maWcgMCwgbm90IEJCUCByZWdpc3RlciBJRAorI2RlZmluZQlFRVBST01fTklDMl9PRkZTRVQgICAgICAgICAgMHgzNgkJLy8gVGhlIGFkZHJlc3MgaXMgZnJvbSBOSUMgY29uZmlnIDAsIG5vdCBCQlAgcmVnaXN0ZXIgSUQKKyNkZWZpbmUJRUVQUk9NX0JCUF9CQVNFX09GRlNFVAkJMHhmMAkJLy8gVGhlIGFkZHJlc3MgaXMgZnJvbSBOSUMgY29uZmlnIDAsIG5vdCBCQlAgcmVnaXN0ZXIgSUQKKyNkZWZpbmUJRUVQUk9NX0dfVFhfUFdSX09GRlNFVAkJMHg1MgorI2RlZmluZQlFRVBST01fR19UWDJfUFdSX09GRlNFVAkJMHg2MAorI2RlZmluZSBFRVBST01fTEVEMV9PRkZTRVQJCQkweDNjCisjZGVmaW5lIEVFUFJPTV9MRUQyX09GRlNFVAkJCTB4M2UKKyNkZWZpbmUgRUVQUk9NX0xFRDNfT0ZGU0VUCQkJMHg0MAorI2RlZmluZSBFRVBST01fTE5BX09GRlNFVAkJCTB4NDQKKyNkZWZpbmUgRUVQUk9NX1JTU0lfQkdfT0ZGU0VUCQkweDQ2CisjZGVmaW5lIEVFUFJPTV9SU1NJX0FfT0ZGU0VUCQkweDRhCisjZGVmaW5lIEVFUFJPTV9ERUZJTkVfTUFYX1RYUFdSCQkweDRlCisjZGVmaW5lIEVFUFJPTV9UWFBPV0VSX0JZUkFURV8yME1IWl8yXzRHCTB4ZGUJLy8gMjBNSFogMi40RyB0eCBwb3dlci4KKyNkZWZpbmUgRUVQUk9NX1RYUE9XRVJfQllSQVRFXzQwTUhaXzJfNEcJMHhlZQkvLyA0ME1IWiAyLjRHIHR4IHBvd2VyLgorI2RlZmluZSBFRVBST01fVFhQT1dFUl9CWVJBVEVfMjBNSFpfNUcJCTB4ZmEJLy8gMjBNSFogNUcgdHggcG93ZXIuCisjZGVmaW5lIEVFUFJPTV9UWFBPV0VSX0JZUkFURV80ME1IWl81RwkJMHgxMGEJLy8gNDBNSFogNUcgdHggcG93ZXIuCisjZGVmaW5lIEVFUFJPTV9BX1RYX1BXUl9PRkZTRVQgICAgICAweDc4CisjZGVmaW5lIEVFUFJPTV9BX1RYMl9QV1JfT0ZGU0VUICAgICAgMHhhNgorLy8jZGVmaW5lIEVFUFJPTV9KYXBhbl9UWF9QV1JfT0ZGU0VUICAgICAgMHg5MCAvLyA4MDIuMTFqCisvLyNkZWZpbmUgRUVQUk9NX0phcGFuX1RYMl9QV1JfT0ZGU0VUICAgICAgMHhiZQorLy8jZGVmaW5lIEVFUFJPTV9UU1NJX1JFRl9PRkZTRVQJMHg1NAorLy8jZGVmaW5lIEVFUFJPTV9UU1NJX0RFTFRBX09GRlNFVAkweDI0CisvLyNkZWZpbmUgRUVQUk9NX0NDS19UWF9QV1JfT0ZGU0VUICAweDYyCisvLyNkZWZpbmUgRUVQUk9NX0NBTElCUkFURV9PRkZTRVQJMHg3YworI2RlZmluZSBFRVBST01fVkVSU0lPTl9PRkZTRVQgICAgICAgMHgwMgorI2RlZmluZQlFRVBST01fRlJFUV9PRkZTRVQJCQkweDNhCisjZGVmaW5lIEVFUFJPTV9UWFBPV0VSX0JZUkFURSAJMHhkZQkvLyAyME1IWiBwb3dlci4KKyNkZWZpbmUgRUVQUk9NX1RYUE9XRVJfREVMVEEJCTB4NTAJLy8gMjBNSFogQU5EIDQwIE1IWiB1c2UgZGlmZmVyZW50IHBvd2VyLiBUaGlzIGlzIGRlbHRhIGluIDQwTUhaLgorI2RlZmluZSBWQUxJRF9FRVBST01fVkVSU0lPTiAgICAgICAgMQorCisvLyBQYWlyS2V5TW9kZSBkZWZpbml0aW9uCisjZGVmaW5lIFBLTU9ERV9OT05FICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFBLTU9ERV9XRVA2NCAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFBLTU9ERV9XRVAxMjggICAgICAgICAgICAgICAyCisjZGVmaW5lIFBLTU9ERV9US0lQICAgICAgICAgICAgICAgICAzCisjZGVmaW5lIFBLTU9ERV9BRVMgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIFBLTU9ERV9DS0lQNjQgICAgICAgICAgICAgICA1CisjZGVmaW5lIFBLTU9ERV9DS0lQMTI4ICAgICAgICAgICAgICA2CisjZGVmaW5lIFBLTU9ERV9US0lQX05PX01JQyAgICAgICAgICA3ICAgICAgIC8vIE1JQyBhcHBlbmRlZCBieSBkcml2ZXI6IG5vdCBhIHZhbGlkIHZhbHVlIGluIGhhcmR3YXJlIGtleSB0YWJsZQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIFdDSUQgIGZvcm1hdAorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLzcuMQlXQ0lEICBFTlRSWSAgZm9ybWF0ICA6IDhieXRlcwordHlwZWRlZglzdHJ1Y3QJX1dDSURfRU5UUllfU1RSVUMgeworCVVDSEFSCQlSWEJBQml0bWFwNzsgICAgLy8gYml0MCBmb3IgVElEOCwgYml0NyBmb3IgVElEIDE1CisJVUNIQVIJCVJYQkFCaXRtYXAwOyAgICAvLyBiaXQwIGZvciBUSUQwLCBiaXQ3IGZvciBUSUQgNworCVVDSEFSCQlNQUNbNl07CS8vIDAgZm9yIHNoYXJlZCBrZXkgdGFibGUuICAxIGZvciBwYWlyd2lzZSBrZXkgdGFibGUKK30JV0NJRF9FTlRSWV9TVFJVQywgKlBXQ0lEX0VOVFJZX1NUUlVDOworCisvLzguMS4xCVNFQ1VSSVRZICBLRVkgIGZvcm1hdCAgOiA4RFcKKy8vIDMyLWJ5dGUgcGVyIGVudHJ5LCB0b3RhbCAxNi1lbnRyeSBmb3Igc2hhcmVkIGtleSB0YWJsZSwgNjQtZW50cnkgZm9yIHBhaXJ3aXNlIGtleSB0YWJsZQordHlwZWRlZiBzdHJ1Y3QgX0hXX0tFWV9FTlRSWSB7ICAgICAgICAgIC8vIDMyLWJ5dGUgcGVyIGVudHJ5CisgICAgVUNIQVIgICBLZXlbMTZdOworICAgIFVDSEFSICAgVHhNaWNbOF07CisgICAgVUNIQVIgICBSeE1pY1s4XTsKK30gSFdfS0VZX0VOVFJZLCAqUEhXX0tFWV9FTlRSWTsKKworLy84LjEuMglJVi9FSVYgIGZvcm1hdCAgOiAyRFcKKworLy84LjEuMwlSWCBhdHRyaWJ1dGUgZW50cnkgZm9ybWF0ICA6IDFEVworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJc3RydWN0CV9NQUNfQVRUUklCVVRFX1NUUlVDIHsKKwlVSU5UMzIJCXJzdjoyMjsKKwlVSU5UMzIJCVJYV0lVREY6MzsKKwlVSU5UMzIJCUJTU0lESWR4OjM7IC8vbXVsdGlwbGVCU1MgaW5kZXggZm9yIHRoZSBXQ0lECisJVUlOVDMyCQlQYWlyS2V5TW9kZTozOworCVVJTlQzMgkJS2V5VGFiOjE7CS8vIDAgZm9yIHNoYXJlZCBrZXkgdGFibGUuICAxIGZvciBwYWlyd2lzZSBrZXkgdGFibGUKK30JTUFDX0FUVFJJQlVURV9TVFJVQywgKlBNQUNfQVRUUklCVVRFX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJc3RydWN0CV9NQUNfQVRUUklCVVRFX1NUUlVDIHsKKwlVSU5UMzIJCUtleVRhYjoxOwkvLyAwIGZvciBzaGFyZWQga2V5IHRhYmxlLiAgMSBmb3IgcGFpcndpc2Uga2V5IHRhYmxlCisJVUlOVDMyCQlQYWlyS2V5TW9kZTozOworCVVJTlQzMgkJQlNTSURJZHg6MzsgLy9tdWx0aXBsZUJTUyBpbmRleCBmb3IgdGhlIFdDSUQKKwlVSU5UMzIJCVJYV0lVREY6MzsKKwlVSU5UMzIJCXJzdjoyMjsKK30JTUFDX0FUVFJJQlVURV9TVFJVQywgKlBNQUNfQVRUUklCVVRFX1NUUlVDOworI2VuZGlmCisKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBUWCAvIFJYIHJpbmcgZGVzY3JpcHRvciBmb3JtYXQKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisvLyB0aGUgZmlyc3QgMjQtYnl0ZSBpbiBUWEQgaXMgY2FsbGVkIFRYSU5GTyBhbmQgd2lsbCBiZSBETUFlZCB0byBNQUMgYmxvY2sgdGhyb3VnaCBUWEZJRk8uCisvLyBNQUMgYmxvY2sgdXNlIHRoaXMgVFhJTkZPIHRvIGNvbnRyb2wgdGhlIHRyYW5zbWlzc2lvbiBiZWhhdmlvciBvZiB0aGlzIGZyYW1lLgorI2RlZmluZSBGSUZPX01HTVQgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgRklGT19IQ0NBICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEZJRk9fRURDQSAgICAgICAgICAgICAgICAgMgorCisvLworLy8gVFggZGVzY3JpcHRvciBmb3JtYXQsIFR4CXJpbmcsIE1nbXQgUmluZworLy8KKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXN0cnVjdAlQQUNLRUQgX1RYRF9TVFJVQyB7CisJLy8gV29yZCAwCisJVUlOVDMyCQlTRFB0cjA7CisJLy8gV29yZCAxCisJVUlOVDMyCQlETUFET05FOjE7CisJVUlOVDMyCQlMYXN0U2VjMDoxOworCVVJTlQzMgkJU0RMZW4wOjE0OworCVVJTlQzMgkJQnVyc3Q6MTsKKwlVSU5UMzIJCUxhc3RTZWMxOjE7CisJVUlOVDMyCQlTRExlbjE6MTQ7CisJLy8gV29yZCAyCisJVUlOVDMyCQlTRFB0cjE7CisJLy8gV29yZCAzCisJVUlOVDMyCQlJQ086MTsKKwlVSU5UMzIJCVVDTzoxOworCVVJTlQzMgkJVENPOjE7CisJVUlOVDMyCQlyc3Y6MjsKKwlVSU5UMzIJCVFTRUw6MjsJLy8gc2VsZWN0IG9uLWNoaXAgRklGTyBJRCBmb3IgMm5kLXN0YWdlIG91dHB1dCBzY2hlZHVsZXIuMDpNR01ULCAxOkhDQ0EgMjpFRENBCisJVUlOVDMyCQlXSVY6MTsJLy8gV2lyZWxlc3MgSW5mbyBWYWxpZC4gMSBpZiBEcml2ZXIgYWxyZWFkeSBmaWxsIFdJLCAgbyBpZiBETUEgbmVlZHMgdG8gY29weSBXSSB0byBjb3JyZWN0cG9zaXRpb24KKwlVSU5UMzIJCXJzdjI6MjQ7Cit9CVRYRF9TVFJVQywgKlBUWERfU1RSVUM7CisjZWxzZQordHlwZWRlZglzdHJ1Y3QJUEFDS0VEIF9UWERfU1RSVUMgeworCS8vIFdvcmQJMAorCVVJTlQzMgkJU0RQdHIwOworCS8vIFdvcmQJMQorCVVJTlQzMgkJU0RMZW4xOjE0OworCVVJTlQzMgkJTGFzdFNlYzE6MTsKKwlVSU5UMzIJCUJ1cnN0OjE7CisJVUlOVDMyCQlTRExlbjA6MTQ7CisJVUlOVDMyCQlMYXN0U2VjMDoxOworCVVJTlQzMgkJRE1BRE9ORToxOworCS8vV29yZDIKKwlVSU5UMzIJCVNEUHRyMTsKKwkvL1dvcmQzCisJVUlOVDMyCQlyc3YyOjI0OworCVVJTlQzMgkJV0lWOjE7CS8vIFdpcmVsZXNzIEluZm8gVmFsaWQuIDEgaWYgRHJpdmVyIGFscmVhZHkgZmlsbCBXSSwgIG8gaWYgRE1BIG5lZWRzIHRvIGNvcHkgV0kgdG8gY29ycmVjdHBvc2l0aW9uCisJVUlOVDMyCQlRU0VMOjI7CS8vIHNlbGVjdCBvbi1jaGlwIEZJRk8gSUQgZm9yIDJuZC1zdGFnZSBvdXRwdXQgc2NoZWR1bGVyLjA6TUdNVCwgMTpIQ0NBIDI6RURDQQorCVVJTlQzMgkJcnN2OjI7CisJVUlOVDMyCQlUQ086MTsJLy8KKwlVSU5UMzIJCVVDTzoxOwkvLworCVVJTlQzMgkJSUNPOjE7CS8vCit9CVRYRF9TVFJVQywgKlBUWERfU1RSVUM7CisjZW5kaWYKKworCisvLworLy8gVFhEIFdpcmVsZXNzIEluZm9ybWF0aW9uIGZvcm1hdCBmb3IgVHggcmluZyBhbmQgTWdtdCBSaW5nCisvLworLy90eG9wIDogZm9yIHR4b3AgbW9kZQorLy8gMDp0eG9wIGZvciB0aGUgTVBEVSBmcmFtZSB3aWxsIGJlIGhhbmRsZXMgYnkgQVNJQyBieSByZWdpc3RlcgorLy8gMS8yLzM6dGhlIE1QRFUgZnJhbWUgaXMgc2VuZCBhZnRlciBQSUZTL2JhY2tvZmYvU0lGUworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJc3RydWN0CVBBQ0tFRCBfVFhXSV9TVFJVQyB7CisJLy8gV29yZCAwCisJVUlOVDMyCQlQSFlNT0RFOjI7CisJVUlOVDMyCQlUeEJGOjE7CS8vIDMqMworCVVJTlQzMgkJcnN2MjoxOworLy8JVUlOVDMyCQlyc3YyOjI7CisJVUlOVDMyCQlJZnM6MTsJLy8KKwlVSU5UMzIJCVNUQkM6MjsJLy9jaGFubmVsIGJhbmR3aWR0aCAyME1IeiBvciA0MCBNSHoKKwlVSU5UMzIJCVNob3J0R0k6MTsKKwlVSU5UMzIJCUJXOjE7CS8vY2hhbm5lbCBiYW5kd2lkdGggMjBNSHogb3IgNDAgTUh6CisJVUlOVDMyCQlNQ1M6NzsKKworCVVJTlQzMgkJcnN2OjY7CisJVUlOVDMyCQl0eG9wOjI7CS8vdHggYmFjayBvZmYgbW9kZSAwOkhUIFRYT1AgcnVsZSAsIDE6UElGUyBUWCAsMjpCYWNrb2ZmLCAzOnNpZnMgb25seSB3aGVuIHByZXZpb3VzIGZyYW1lIGV4Y2hhbmdlIGlzIHN1Y2Nlc3NmdWwuCisJVUlOVDMyCQlNcGR1RGVuc2l0eTozOworCVVJTlQzMgkJQU1QRFU6MTsKKworCVVJTlQzMgkJVFM6MTsKKwlVSU5UMzIJCUNGQUNLOjE7CisJVUlOVDMyCQlNSU1PcHM6MTsJLy8gdGhlIHJlbW90ZSBwZWVyIGlzIGluIGR5bmFtaWMgTUlNTy1QUyBtb2RlCisJVUlOVDMyCQlGUkFHOjE7CQkvLyAxIHRvIGluZm9ybSBUS0lQIGVuZ2luZSB0aGlzIGlzIGEgZnJhZ21lbnQuCisJLy8gV29yZCAxCisJVUlOVDMyCQlQYWNrZXRJZDo0OworCVVJTlQzMgkJTVBEVXRvdGFsQnl0ZUNvdW50OjEyOworCVVJTlQzMgkJV2lyZWxlc3NDbGlJRDo4OworCVVJTlQzMgkJQkFXaW5TaXplOjY7CisJVUlOVDMyCQlOU0VROjE7CisJVUlOVDMyCQlBQ0s6MTsKKwkvLyBXb3JkIDIKKwlVSU5UMzIJCUlWOworCS8vIFdvcmQgMworCVVJTlQzMgkJRUlWOworfQlUWFdJX1NUUlVDLCAqUFRYV0lfU1RSVUM7CisjZWxzZQordHlwZWRlZglzdHJ1Y3QJUEFDS0VEIF9UWFdJX1NUUlVDIHsKKwkvLyBXb3JkCTAKKwlVSU5UMzIJCUZSQUc6MTsJCS8vIDEgdG8gaW5mb3JtIFRLSVAgZW5naW5lIHRoaXMgaXMgYSBmcmFnbWVudC4KKwlVSU5UMzIJCU1JTU9wczoxOwkvLyB0aGUgcmVtb3RlIHBlZXIgaXMgaW4gZHluYW1pYyBNSU1PLVBTIG1vZGUKKwlVSU5UMzIJCUNGQUNLOjE7CisJVUlOVDMyCQlUUzoxOworCisJVUlOVDMyCQlBTVBEVToxOworCVVJTlQzMgkJTXBkdURlbnNpdHk6MzsKKwlVSU5UMzIJCXR4b3A6MjsJLy9GT1IgIlRISVMiIGZyYW1lLiAwOkhUIFRYT1AgcnVsZSAsIDE6UElGUyBUWCAsMjpCYWNrb2ZmLCAzOnNpZnMgb25seSB3aGVuIHByZXZpb3VzIGZyYW1lIGV4Y2hhbmdlIGlzIHN1Y2Nlc3NmdWwuCisJVUlOVDMyCQlyc3Y6NjsKKworCVVJTlQzMgkJTUNTOjc7CisJVUlOVDMyCQlCVzoxOwkvL2NoYW5uZWwgYmFuZHdpZHRoIDIwTUh6IG9yIDQwIE1IegorCVVJTlQzMgkJU2hvcnRHSToxOworCVVJTlQzMgkJU1RCQzoyOwkvLyAxOiBTVEJDIHN1cHBvcnQgTUNTID0wLTcsICAgMiwzIDogUkVTRVJWRQorCVVJTlQzMgkJSWZzOjE7CS8vCisvLwlVSU5UMzIJCXJzdjI6MjsJLy9jaGFubmVsIGJhbmR3aWR0aCAyME1IeiBvciA0MCBNSHoKKwlVSU5UMzIJCXJzdjI6MTsKKwlVSU5UMzIJCVR4QkY6MTsJLy8gMyozCisJVUlOVDMyCQlQSFlNT0RFOjI7CisJLy8gV29yZAkxCisJVUlOVDMyCQlBQ0s6MTsKKwlVSU5UMzIJCU5TRVE6MTsKKwlVSU5UMzIJCUJBV2luU2l6ZTo2OworCVVJTlQzMgkJV2lyZWxlc3NDbGlJRDo4OworCVVJTlQzMgkJTVBEVXRvdGFsQnl0ZUNvdW50OjEyOworCVVJTlQzMgkJUGFja2V0SWQ6NDsKKwkvL1dvcmQyCisJVUlOVDMyCQlJVjsKKwkvL1dvcmQzCisJVUlOVDMyCQlFSVY7Cit9CVRYV0lfU1RSVUMsICpQVFhXSV9TVFJVQzsKKyNlbmRpZgorLy8KKy8vIFJ4IGRlc2NyaXB0b3IgZm9ybWF0LCBSeAlSaW5nCisvLworLy8KKy8vIFJYV0kgd2lyZWxlc3MgaW5mb3JtYXRpb24gZm9ybWF0LCBpbiBQQkYuIGludmlzaWJsZSBpbiBkcml2ZXIuCisvLworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJc3RydWN0CVBBQ0tFRCBfUlhXSV9TVFJVQyB7CisJLy8gV29yZCAwCisJVUlOVDMyCQlUSUQ6NDsKKwlVSU5UMzIJCU1QRFV0b3RhbEJ5dGVDb3VudDoxMjsKKwlVSU5UMzIJCVVERjozOworCVVJTlQzMgkJQlNTSUQ6MzsKKwlVSU5UMzIJCUtleUluZGV4OjI7CisJVUlOVDMyCQlXaXJlbGVzc0NsaUlEOjg7CisJLy8gV29yZCAxCisJVUlOVDMyCQlQSFlNT0RFOjI7ICAgICAgICAgICAgICAvLyAxOiB0aGlzIFJYIGZyYW1lIGlzIHVuaWNhc3QgdG8gbWUKKwlVSU5UMzIJCXJzdjozOworCVVJTlQzMgkJU1RCQzoyOworCVVJTlQzMgkJU2hvcnRHSToxOworCVVJTlQzMgkJQlc6MTsKKwlVSU5UMzIJCU1DUzo3OworCVVJTlQzMgkJU0VRVUVOQ0U6MTI7CisJVUlOVDMyCQlGUkFHOjQ7CisJLy8gV29yZCAyCisJVUlOVDMyCQlyc3YxOjg7CisJVUlOVDMyCQlSU1NJMjo4OworCVVJTlQzMgkJUlNTSTE6ODsKKwlVSU5UMzIJCVJTU0kwOjg7CisJLy8gV29yZCAzCisJVUlOVDMyCQlyc3YyOjE2OworCVVJTlQzMgkJU05SMTo4OworCVVJTlQzMgkJU05SMDo4OworfQlSWFdJX1NUUlVDLCAqUFJYV0lfU1RSVUM7CisjZWxzZQordHlwZWRlZglzdHJ1Y3QJUEFDS0VEIF9SWFdJX1NUUlVDIHsKKwkvLyBXb3JkCTAKKwlVSU5UMzIJCVdpcmVsZXNzQ2xpSUQ6ODsKKwlVSU5UMzIJCUtleUluZGV4OjI7CisJVUlOVDMyCQlCU1NJRDozOworCVVJTlQzMgkJVURGOjM7CisJVUlOVDMyCQlNUERVdG90YWxCeXRlQ291bnQ6MTI7CisJVUlOVDMyCQlUSUQ6NDsKKwkvLyBXb3JkCTEKKwlVSU5UMzIJCUZSQUc6NDsKKwlVSU5UMzIJCVNFUVVFTkNFOjEyOworCVVJTlQzMgkJTUNTOjc7CisJVUlOVDMyCQlCVzoxOworCVVJTlQzMgkJU2hvcnRHSToxOworCVVJTlQzMgkJU1RCQzoyOworCVVJTlQzMgkJcnN2OjM7CisJVUlOVDMyCQlQSFlNT0RFOjI7ICAgICAgICAgICAgICAvLyAxOiB0aGlzIFJYIGZyYW1lIGlzIHVuaWNhc3QgdG8gbWUKKwkvL1dvcmQyCisJVUlOVDMyCQlSU1NJMDo4OworCVVJTlQzMgkJUlNTSTE6ODsKKwlVSU5UMzIJCVJTU0kyOjg7CisJVUlOVDMyCQlyc3YxOjg7CisJLy9Xb3JkMworCVVJTlQzMgkJU05SMDo4OworCVVJTlQzMgkJU05SMTo4OworCVVJTlQzMgkJcnN2MjoxNjsKK30JUlhXSV9TVFJVQywgKlBSWFdJX1NUUlVDOworI2VuZGlmCisKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBIT1NULU1DVSBjb21tdW5pY2F0aW9uIGRhdGEgc3RydWN0dXJlCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLy8KKy8vIEgyTV9NQUlMQk9YX0NTUjogSG9zdC10by1NQ1UgTWFpbGJveAorLy8KKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmIHVuaW9uICBfSDJNX01BSUxCT1hfU1RSVUMgeworICAgIHN0cnVjdCB7CisgICAgICAgIFVJTlQzMiAgICAgICBPd25lcjo4OworICAgICAgICBVSU5UMzIgICAgICAgQ21kVG9rZW46ODsgICAgLy8gMHhmZiB0ZWxscyBNQ1Ugbm90IHRvIHJlcG9ydCBDbWREb25lSW50IGFmdGVyIGV4Y3V0aW5nIHRoZSBjb21tYW5kCisgICAgICAgIFVJTlQzMiAgICAgICBIaWdoQnl0ZTo4OworICAgICAgICBVSU5UMzIgICAgICAgTG93Qnl0ZTo4OworICAgIH0gICBmaWVsZDsKKyAgICBVSU5UMzIgICAgICAgICAgIHdvcmQ7Cit9IEgyTV9NQUlMQk9YX1NUUlVDLCAqUEgyTV9NQUlMQk9YX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYgdW5pb24gIF9IMk1fTUFJTEJPWF9TVFJVQyB7CisgICAgc3RydWN0IHsKKyAgICAgICAgVUlOVDMyICAgICAgIExvd0J5dGU6ODsKKyAgICAgICAgVUlOVDMyICAgICAgIEhpZ2hCeXRlOjg7CisgICAgICAgIFVJTlQzMiAgICAgICBDbWRUb2tlbjo4OworICAgICAgICBVSU5UMzIgICAgICAgT3duZXI6ODsKKyAgICB9ICAgZmllbGQ7CisgICAgVUlOVDMyICAgICAgICAgICB3b3JkOworfSBIMk1fTUFJTEJPWF9TVFJVQywgKlBIMk1fTUFJTEJPWF9TVFJVQzsKKyNlbmRpZgorCisvLworLy8gTTJIX0NNRF9ET05FX0NTUjogTUNVLXRvLUhvc3QgY29tbWFuZCBjb21wbGV0ZSBpbmRpY2F0aW9uCisvLworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYgdW5pb24gX00ySF9DTURfRE9ORV9TVFJVQyB7CisgICAgc3RydWN0ICB7CisgICAgICAgIFVJTlQzMiAgICAgICBDbWRUb2tlbjM7CisgICAgICAgIFVJTlQzMiAgICAgICBDbWRUb2tlbjI7CisgICAgICAgIFVJTlQzMiAgICAgICBDbWRUb2tlbjE7CisgICAgICAgIFVJTlQzMiAgICAgICBDbWRUb2tlbjA7CisgICAgfSBmaWVsZDsKKyAgICBVSU5UMzIgICAgICAgICAgIHdvcmQ7Cit9IE0ySF9DTURfRE9ORV9TVFJVQywgKlBNMkhfQ01EX0RPTkVfU1RSVUM7CisjZWxzZQordHlwZWRlZiB1bmlvbiBfTTJIX0NNRF9ET05FX1NUUlVDIHsKKyAgICBzdHJ1Y3QgIHsKKyAgICAgICAgVUlOVDMyICAgICAgIENtZFRva2VuMDsKKyAgICAgICAgVUlOVDMyICAgICAgIENtZFRva2VuMTsKKyAgICAgICAgVUlOVDMyICAgICAgIENtZFRva2VuMjsKKyAgICAgICAgVUlOVDMyICAgICAgIENtZFRva2VuMzsKKyAgICB9IGZpZWxkOworICAgIFVJTlQzMiAgICAgICAgICAgd29yZDsKK30gTTJIX0NNRF9ET05FX1NUUlVDLCAqUE0ySF9DTURfRE9ORV9TVFJVQzsKKyNlbmRpZgorCisKKworLy8KKy8vIE1DVV9MRURDUzogTUNVIExFRCBDb250cm9sIFNldHRpbmcuCisvLworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYgdW5pb24gIF9NQ1VfTEVEQ1NfU1RSVUMgeworCXN0cnVjdAl7CisJCVVDSEFSCQlQb2xhcml0eToxOworCQlVQ0hBUgkJTGVkTW9kZTo3OworCX0gZmllbGQ7CisJVUNIQVIJCQkJd29yZDsKK30gTUNVX0xFRENTX1NUUlVDLCAqUE1DVV9MRURDU19TVFJVQzsKKyNlbHNlCit0eXBlZGVmIHVuaW9uICBfTUNVX0xFRENTX1NUUlVDIHsKKwlzdHJ1Y3QJeworCQlVQ0hBUgkJTGVkTW9kZTo3OworCQlVQ0hBUgkJUG9sYXJpdHk6MTsKKwl9IGZpZWxkOworCVVDSEFSCQkJd29yZDsKK30gTUNVX0xFRENTX1NUUlVDLCAqUE1DVV9MRURDU19TVFJVQzsKKyNlbmRpZgorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBSZWdpc3RlciBmb3JtYXQKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisKKworLy9OQVZfVElNRV9DRkcgOk5BVgorI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX05BVl9USU1FX0NGR19TVFJVQwl7CisJc3RydWN0CXsKKwkJVVNIT1JUCQlyc3Y6NjsKKwkJVVNIT1JUCQlaZXJvU2lmczoxOyAgICAgICAgICAgICAgIC8vIEFwcGxpZWQgemVybyBTSUZTIHRpbWVyIGFmdGVyIE9GRE0gUlggMDogZGlzYWJsZQorCQlVU0hPUlQJCUVpZnM6OTsgICAgICAgICAgICAgICAvLyBpbiB1bml0IG9mIDEtdXMKKwkJVUNIQVIgICAgICAgU2xvdFRpbWU7ICAgIC8vIGluIHVuaXQgb2YgMS11cworCQlVQ0hBUgkJU2lmczsgICAgICAgICAgICAgICAvLyBpbiB1bml0IG9mIDEtdXMKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CU5BVl9USU1FX0NGR19TVFJVQywgKlBOQVZfVElNRV9DRkdfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfTkFWX1RJTUVfQ0ZHX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVQ0hBUgkJU2lmczsgICAgICAgICAgICAgICAvLyBpbiB1bml0IG9mIDEtdXMKKwkJVUNIQVIgICAgICAgU2xvdFRpbWU7ICAgIC8vIGluIHVuaXQgb2YgMS11cworCQlVU0hPUlQJCUVpZnM6OTsgICAgICAgICAgICAgICAvLyBpbiB1bml0IG9mIDEtdXMKKwkJVVNIT1JUCQlaZXJvU2lmczoxOyAgICAgICAgICAgICAgIC8vIEFwcGxpZWQgemVybyBTSUZTIHRpbWVyIGFmdGVyIE9GRE0gUlggMDogZGlzYWJsZQorCQlVU0hPUlQJCXJzdjo2OworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JTkFWX1RJTUVfQ0ZHX1NUUlVDLCAqUE5BVl9USU1FX0NGR19TVFJVQzsKKyNlbmRpZgorCisKKworCisKKy8vCisvLyBSWF9GSUxUUl9DRkc6ICAvUlggY29uZmlndXJhdGlvbiByZWdpc3RlcgorLy8KKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCVJYX0ZJTFRSX0NGR19TVFJVQwl7CisJc3RydWN0CXsKKwkJVUlOVDMyCQk6MTU7CisJCVVJTlQzMiAgICAgICBEcm9wUnN2Q250bFR5cGU6MTsKKworICAgICAgICAJVUlOVDMyICAgICAgIAlEcm9wQkFSOjE7ICAgICAgIC8vCisJCVVJTlQzMgkJRHJvcEJBOjE7CQkvLworCQlVSU5UMzIJCURyb3BQc1BvbGw6MTsJCS8vIERyb3AgUHMtUG9sbAorCQlVSU5UMzIJCURyb3BSdHM6MTsJCS8vIERyb3AgUHMtUG9sbAorCisJCVVJTlQzMgkJRHJvcEN0czoxOwkJLy8gRHJvcCBQcy1Qb2xsCisJCVVJTlQzMgkJRHJvcEFjazoxOwkJLy8gRHJvcCBQcy1Qb2xsCisJCVVJTlQzMgkJRHJvcENGRW5kOjE7CQkvLyBEcm9wIFBzLVBvbGwKKwkJVUlOVDMyCQlEcm9wQ0ZFbmRBY2s6MTsJCS8vIERyb3AgUHMtUG9sbAorCisJCVVJTlQzMgkJRHJvcER1cGxpY2F0ZToxOwkJLy8gRHJvcCBkdXBsaWNhdGUgZnJhbWUKKwkJVUlOVDMyCQlEcm9wQmNhc3Q6MTsJCS8vIERyb3AgYnJvYWRjYXN0IGZyYW1lcworCQlVSU5UMzIJCURyb3BNY2FzdDoxOwkJLy8gRHJvcCBtdWx0aWNhc3QgZnJhbWVzCisJCVVJTlQzMgkJRHJvcFZlckVycjoxOwkgICAgLy8gRHJvcCB2ZXJzaW9uIGVycm9yIGZyYW1lCisKKwkJVUlOVDMyCQlEcm9wTm90TXlCU1NJRDoxOwkJCS8vIERyb3AgZnJhbSBUb0RzIGJpdCBpcyB0cnVlCisJCVVJTlQzMgkJRHJvcE5vdFRvTWU6MTsJCS8vIERyb3Agbm90IHRvIG1lIHVuaWNhc3QgZnJhbWUKKwkJVUlOVDMyCQlEcm9wUGh5RXJyOjE7CQkvLyBEcm9wIHBoeXNpY2FsIGVycm9yCisJCVVJTlQzMgkJRHJvcENSQ0VycjoxOwkJLy8gRHJvcCBDUkMgZXJyb3IKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVJYX0ZJTFRSX0NGR19TVFJVQywgKlBSWF9GSUxUUl9DRkdfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfUlhfRklMVFJfQ0ZHX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVSU5UMzIJCURyb3BDUkNFcnI6MTsJCS8vIERyb3AgQ1JDIGVycm9yCisJCVVJTlQzMgkJRHJvcFBoeUVycjoxOwkJLy8gRHJvcCBwaHlzaWNhbCBlcnJvcgorCQlVSU5UMzIJCURyb3BOb3RUb01lOjE7CQkvLyBEcm9wIG5vdCB0byBtZSB1bmljYXN0IGZyYW1lCisJCVVJTlQzMgkJRHJvcE5vdE15QlNTSUQ6MTsJCQkvLyBEcm9wIGZyYW0gVG9EcyBiaXQgaXMgdHJ1ZQorCisJCVVJTlQzMgkJRHJvcFZlckVycjoxOwkgICAgLy8gRHJvcCB2ZXJzaW9uIGVycm9yIGZyYW1lCisJCVVJTlQzMgkJRHJvcE1jYXN0OjE7CQkvLyBEcm9wIG11bHRpY2FzdCBmcmFtZXMKKwkJVUlOVDMyCQlEcm9wQmNhc3Q6MTsJCS8vIERyb3AgYnJvYWRjYXN0IGZyYW1lcworCQlVSU5UMzIJCURyb3BEdXBsaWNhdGU6MTsJCS8vIERyb3AgZHVwbGljYXRlIGZyYW1lCisKKwkJVUlOVDMyCQlEcm9wQ0ZFbmRBY2s6MTsJCS8vIERyb3AgUHMtUG9sbAorCQlVSU5UMzIJCURyb3BDRkVuZDoxOwkJLy8gRHJvcCBQcy1Qb2xsCisJCVVJTlQzMgkJRHJvcEFjazoxOwkJLy8gRHJvcCBQcy1Qb2xsCisJCVVJTlQzMgkJRHJvcEN0czoxOwkJLy8gRHJvcCBQcy1Qb2xsCisKKwkJVUlOVDMyCQlEcm9wUnRzOjE7CQkvLyBEcm9wIFBzLVBvbGwKKwkJVUlOVDMyCQlEcm9wUHNQb2xsOjE7CQkvLyBEcm9wIFBzLVBvbGwKKwkJVUlOVDMyCQlEcm9wQkE6MTsJCS8vCisgICAgICAgIAlVSU5UMzIgICAgICAgCURyb3BCQVI6MTsgICAgICAgLy8KKworCQlVSU5UMzIgICAgICAgCURyb3BSc3ZDbnRsVHlwZToxOworCQlVSU5UMzIJCToxNTsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVJYX0ZJTFRSX0NGR19TVFJVQywgKlBSWF9GSUxUUl9DRkdfU1RSVUM7CisjZW5kaWYKKworCisKKworLy8KKy8vIFBIWV9DU1I0OiBSRiBzZXJpYWwgY29udHJvbCByZWdpc3RlcgorLy8KKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9QSFlfQ1NSNF9TVFJVQwl7CisJc3RydWN0CXsKKwkJVUlOVDMyCQlCdXN5OjE7CQkJCS8vIDE6IEFTSUMgaXMgYnVzeSBleGVjdXRlIFJGIHByb2dyYW1taW5nLgorCQlVSU5UMzIJCVBMTF9MRDoxOwkJCS8vIFJGIFBMTF9MRCBzdGF0dXMKKwkJVUlOVDMyCQlJRlNlbGVjdDoxOwkJCS8vIDE6IHNlbGVjdCBJRgl0byBwcm9ncmFtLAkwOiBzZWxlY3QgUkYgdG8JcHJvZ3JhbQorCQlVSU5UMzIJCU51bWJlck9mQml0czo1OwkJLy8gTnVtYmVyIG9mIGJpdHMgdXNlZCBpbiBSRlJlZ1ZhbHVlIChJOjIwLAlSRk1EOjIyKQorCQlVSU5UMzIJCVJGUmVnVmFsdWU6MjQ7CQkvLyBSZWdpc3Rlcgl2YWx1ZSAoaW5jbHVkZSByZWdpc3RlcglpZCkJc2VyaWFsIG91dCB0byBSRi9JRgljaGlwLgorCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JUEhZX0NTUjRfU1RSVUMsICpQUEhZX0NTUjRfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfUEhZX0NTUjRfU1RSVUMJeworCXN0cnVjdAl7CisJCVVJTlQzMgkJUkZSZWdWYWx1ZToyNDsJCS8vIFJlZ2lzdGVyCXZhbHVlIChpbmNsdWRlIHJlZ2lzdGVyCWlkKQlzZXJpYWwgb3V0IHRvIFJGL0lGCWNoaXAuCisJCVVJTlQzMgkJTnVtYmVyT2ZCaXRzOjU7CQkvLyBOdW1iZXIgb2YgYml0cyB1c2VkIGluIFJGUmVnVmFsdWUgKEk6MjAsCVJGTUQ6MjIpCisJCVVJTlQzMgkJSUZTZWxlY3Q6MTsJCQkvLyAxOiBzZWxlY3QgSUYJdG8gcHJvZ3JhbSwJMDogc2VsZWN0IFJGIHRvCXByb2dyYW0KKwkJVUlOVDMyCQlQTExfTEQ6MTsJCQkvLyBSRiBQTExfTEQgc3RhdHVzCisJCVVJTlQzMgkJQnVzeToxOwkJCQkvLyAxOiBBU0lDIGlzIGJ1c3kgZXhlY3V0ZSBSRiBwcm9ncmFtbWluZy4KKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVBIWV9DU1I0X1NUUlVDLCAqUFBIWV9DU1I0X1NUUlVDOworI2VuZGlmCisKKworLy8KKy8vIFNFQ19DU1I1OiBzaGFyZWQga2V5IHRhYmxlIHNlY3VyaXR5IG1vZGUgcmVnaXN0ZXIKKy8vCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfU0VDX0NTUjVfU1RSVUMJeworCXN0cnVjdAl7CisgICAgICAgIFVJTlQzMiAgICAgICA6MTsKKyAgICAgICAgVUlOVDMyICAgICAgIEJzczNLZXkzQ2lwaGVyQWxnOjM7CisgICAgICAgIFVJTlQzMiAgICAgICA6MTsKKyAgICAgICAgVUlOVDMyICAgICAgIEJzczNLZXkyQ2lwaGVyQWxnOjM7CisgICAgICAgIFVJTlQzMiAgICAgICA6MTsKKyAgICAgICAgVUlOVDMyICAgICAgIEJzczNLZXkxQ2lwaGVyQWxnOjM7CisgICAgICAgIFVJTlQzMiAgICAgICA6MTsKKyAgICAgICAgVUlOVDMyICAgICAgIEJzczNLZXkwQ2lwaGVyQWxnOjM7CisgICAgICAgIFVJTlQzMiAgICAgICA6MTsKKyAgICAgICAgVUlOVDMyICAgICAgIEJzczJLZXkzQ2lwaGVyQWxnOjM7CisgICAgICAgIFVJTlQzMiAgICAgICA6MTsKKyAgICAgICAgVUlOVDMyICAgICAgIEJzczJLZXkyQ2lwaGVyQWxnOjM7CisgICAgICAgIFVJTlQzMiAgICAgICA6MTsKKyAgICAgICAgVUlOVDMyICAgICAgIEJzczJLZXkxQ2lwaGVyQWxnOjM7CisgICAgICAgIFVJTlQzMiAgICAgICA6MTsKKyAgICAgICAgVUlOVDMyICAgICAgIEJzczJLZXkwQ2lwaGVyQWxnOjM7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlTRUNfQ1NSNV9TVFJVQywgKlBTRUNfQ1NSNV9TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9TRUNfQ1NSNV9TVFJVQwl7CisJc3RydWN0CXsKKyAgICAgICAgVUlOVDMyICAgICAgIEJzczJLZXkwQ2lwaGVyQWxnOjM7CisgICAgICAgIFVJTlQzMiAgICAgICA6MTsKKyAgICAgICAgVUlOVDMyICAgICAgIEJzczJLZXkxQ2lwaGVyQWxnOjM7CisgICAgICAgIFVJTlQzMiAgICAgICA6MTsKKyAgICAgICAgVUlOVDMyICAgICAgIEJzczJLZXkyQ2lwaGVyQWxnOjM7CisgICAgICAgIFVJTlQzMiAgICAgICA6MTsKKyAgICAgICAgVUlOVDMyICAgICAgIEJzczJLZXkzQ2lwaGVyQWxnOjM7CisgICAgICAgIFVJTlQzMiAgICAgICA6MTsKKyAgICAgICAgVUlOVDMyICAgICAgIEJzczNLZXkwQ2lwaGVyQWxnOjM7CisgICAgICAgIFVJTlQzMiAgICAgICA6MTsKKyAgICAgICAgVUlOVDMyICAgICAgIEJzczNLZXkxQ2lwaGVyQWxnOjM7CisgICAgICAgIFVJTlQzMiAgICAgICA6MTsKKyAgICAgICAgVUlOVDMyICAgICAgIEJzczNLZXkyQ2lwaGVyQWxnOjM7CisgICAgICAgIFVJTlQzMiAgICAgICA6MTsKKyAgICAgICAgVUlOVDMyICAgICAgIEJzczNLZXkzQ2lwaGVyQWxnOjM7CisgICAgICAgIFVJTlQzMiAgICAgICA6MTsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVNFQ19DU1I1X1NUUlVDLCAqUFNFQ19DU1I1X1NUUlVDOworI2VuZGlmCisKKworLy8KKy8vIEhPU1RfQ01EX0NTUjogRm9yIEhPU1QgdG8gaW50ZXJydXB0IGVtYmVkZGVkIHByb2Nlc3NvcgorLy8KKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9IT1NUX0NNRF9DU1JfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVJTlQzMiAgIFJzdjoyNDsKKwkgICAgVUlOVDMyICAgSG9zdENvbW1hbmQ6ODsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CUhPU1RfQ01EX0NTUl9TVFJVQywgKlBIT1NUX0NNRF9DU1JfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfSE9TVF9DTURfQ1NSX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVSU5UMzIgICBIb3N0Q29tbWFuZDo4OworCSAgICBVSU5UMzIgICBSc3Y6MjQ7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlIT1NUX0NNRF9DU1JfU1RSVUMsICpQSE9TVF9DTURfQ1NSX1NUUlVDOworI2VuZGlmCisKKworLy8KKy8vIEFJRlNOX0NTUjogQUlGU04gZm9yIGVhY2ggRURDQSBBQworLy8KKworCisKKy8vCisvLyBFMlBST01fQ1NSOiBFRVBST00gY29udHJvbCByZWdpc3RlcgorLy8KKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9FMlBST01fQ1NSX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVSU5UMzIJCVJzdmQ6MjU7CisJCVVJTlQzMiAgICAgICBMb2FkU3RhdHVzOjE7ICAgLy8gMTpsb2FkaW5nLCAwOmRvbmUKKwkJVUlOVDMyCQlUeXBlOjE7CQkJLy8gMTogOTNDNDYsIDA6OTNDNjYKKwkJVUlOVDMyCQlFZXByb21ETzoxOworCQlVSU5UMzIJCUVlcHJvbURJOjE7CisJCVVJTlQzMgkJRWVwcm9tQ1M6MTsKKwkJVUlOVDMyCQlFZXByb21TSzoxOworCQlVSU5UMzIJCVJlbG9hZDoxOwkJLy8gUmVsb2FkIEVFUFJPTSBjb250ZW50LCB3cml0ZSBvbmUgdG8gcmVsb2FkLCBzZWxmLWNsZWFyZWQuCisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlFMlBST01fQ1NSX1NUUlVDLCAqUEUyUFJPTV9DU1JfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfRTJQUk9NX0NTUl9TVFJVQwl7CisJc3RydWN0CXsKKwkJVUlOVDMyCQlSZWxvYWQ6MTsJCS8vIFJlbG9hZCBFRVBST00gY29udGVudCwgd3JpdGUgb25lIHRvIHJlbG9hZCwgc2VsZi1jbGVhcmVkLgorCQlVSU5UMzIJCUVlcHJvbVNLOjE7CisJCVVJTlQzMgkJRWVwcm9tQ1M6MTsKKwkJVUlOVDMyCQlFZXByb21ESToxOworCQlVSU5UMzIJCUVlcHJvbURPOjE7CisJCVVJTlQzMgkJVHlwZToxOwkJCS8vIDE6IDkzQzQ2LCAwOjkzQzY2CisJCVVJTlQzMiAgICAgICBMb2FkU3RhdHVzOjE7ICAgLy8gMTpsb2FkaW5nLCAwOmRvbmUKKwkJVUlOVDMyCQlSc3ZkOjI1OworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JRTJQUk9NX0NTUl9TVFJVQywgKlBFMlBST01fQ1NSX1NUUlVDOworI2VuZGlmCisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIEUyUFJPTSBkYXRhIGxheW91dAorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLworLy8gRUVQUk9NIGFudGVubmEgc2VsZWN0IGZvcm1hdAorLy8KKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9FRVBST01fQU5URU5OQV9TVFJVQwl7CisJc3RydWN0CXsKKwkJVVNIT1JUICAgICAgUnN2OjQ7CisJCVVTSE9SVCAgICAgIFJmSWNUeXBlOjQ7ICAgICAgICAgICAgIC8vIHNlZSBFMlBST00gZG9jdW1lbnQKKwkJVVNIT1JUCQlUeFBhdGg6NDsJLy8gMTogMVQsIDI6IDJUCisJCVVTSE9SVAkJUnhQYXRoOjQ7CS8vIDE6IDFSLCAyOiAyUiwgMzogM1IKKwl9CWZpZWxkOworCVVTSE9SVAkJCXdvcmQ7Cit9CUVFUFJPTV9BTlRFTk5BX1NUUlVDLCAqUEVFUFJPTV9BTlRFTk5BX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX0VFUFJPTV9BTlRFTk5BX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVU0hPUlQJCVJ4UGF0aDo0OwkvLyAxOiAxUiwgMjogMlIsIDM6IDNSCisJCVVTSE9SVAkJVHhQYXRoOjQ7CS8vIDE6IDFULCAyOiAyVAorCQlVU0hPUlQgICAgICBSZkljVHlwZTo0OyAgICAgICAgICAgICAvLyBzZWUgRTJQUk9NIGRvY3VtZW50CisJCVVTSE9SVCAgICAgIFJzdjo0OworCX0JZmllbGQ7CisJVVNIT1JUCQkJd29yZDsKK30JRUVQUk9NX0FOVEVOTkFfU1RSVUMsICpQRUVQUk9NX0FOVEVOTkFfU1RSVUM7CisjZW5kaWYKKworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24gX0VFUFJPTV9OSUNfQ0lORklHMl9TVFJVQwl7CisJc3RydWN0CXsKKyAgICAgICAgVVNIT1JUCQlSc3YyOjY7CQkJCQkvLyBtdXN0IGJlIDAKKwkJVVNIT1JUCQlCVzQwTUF2YWlsRm9yQToxOwkJCS8vIDA6ZW5hYmxlLCAxOmRpc2FibGUKKwkJVVNIT1JUCQlCVzQwTUF2YWlsRm9yRzoxOwkJCS8vIDA6ZW5hYmxlLCAxOmRpc2FibGUKKwkJVVNIT1JUCQlFbmFibGVXUFNQQkM6MTsgICAgICAgICAgICAgICAgIC8vIFdQUyBQQkMgQ29udHJvbCBiaXQKKwkJVVNIT1JUCQlCVzQwTVNpZGViYW5kRm9yQToxOworCQlVU0hPUlQJCUJXNDBNU2lkZWJhbmRGb3JHOjE7CisJCVVTSE9SVAkJQ2FyZGJ1c0FjY2VsZXJhdGlvbjoxOwkvLyAhISEgTk9URTogMCAtIGVuYWJsZSwgMSAtIGRpc2FibGUKKwkJVVNIT1JUCQlFeHRlcm5hbExOQUZvckE6MTsJCQkvLyBleHRlcm5hbCBMTkEgZW5hYmxlIGZvciA1RworCQlVU0hPUlQJCUV4dGVybmFsTE5BRm9yRzoxOwkJCS8vIGV4dGVybmFsIExOQSBlbmFibGUgZm9yIDIuNEcKKwkJVVNIT1JUCQlEeW5hbWljVHhBZ2NDb250cm9sOjE7CQkJLy8KKwkJVVNIT1JUCQlIYXJkd2FyZVJhZGlvQ29udHJvbDoxOwkvLyBXaGV0aGVyIFJGIGlzIGNvbnRyb2xsZWQgYnkgZHJpdmVyIG9yIEhXLiAxOmVuYWJsZSBodyBjb250cm9sLCAwOmRpc2FibGUKKwl9CWZpZWxkOworCVVTSE9SVAkJCXdvcmQ7Cit9CUVFUFJPTV9OSUNfQ09ORklHMl9TVFJVQywgKlBFRVBST01fTklDX0NPTkZJRzJfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbiBfRUVQUk9NX05JQ19DSU5GSUcyX1NUUlVDCXsKKwlzdHJ1Y3QgeworCQlVU0hPUlQJCUhhcmR3YXJlUmFkaW9Db250cm9sOjE7CS8vIDE6ZW5hYmxlLCAwOmRpc2FibGUKKwkJVVNIT1JUCQlEeW5hbWljVHhBZ2NDb250cm9sOjE7CQkJLy8KKwkJVVNIT1JUCQlFeHRlcm5hbExOQUZvckc6MTsJCQkJLy8KKwkJVVNIT1JUCQlFeHRlcm5hbExOQUZvckE6MTsJCQkvLyBleHRlcm5hbCBMTkEgZW5hYmxlIGZvciAyLjRHCisJCVVTSE9SVAkJQ2FyZGJ1c0FjY2VsZXJhdGlvbjoxOwkvLyAhISEgTk9URTogMCAtIGVuYWJsZSwgMSAtIGRpc2FibGUKKwkJVVNIT1JUCQlCVzQwTVNpZGViYW5kRm9yRzoxOworCQlVU0hPUlQJCUJXNDBNU2lkZWJhbmRGb3JBOjE7CisJCVVTSE9SVAkJRW5hYmxlV1BTUEJDOjE7ICAgICAgICAgICAgICAgICAvLyBXUFMgUEJDIENvbnRyb2wgYml0CisJCVVTSE9SVAkJQlc0ME1BdmFpbEZvckc6MTsJCQkvLyAwOmVuYWJsZSwgMTpkaXNhYmxlCisJCVVTSE9SVAkJQlc0ME1BdmFpbEZvckE6MTsJCQkvLyAwOmVuYWJsZSwgMTpkaXNhYmxlCisJCVVTSE9SVAkJUnN2Mjo2OyAgICAgICAgICAgICAgICAgLy8gbXVzdCBiZSAwCisJfQlmaWVsZDsKKwlVU0hPUlQJCQl3b3JkOworfQlFRVBST01fTklDX0NPTkZJRzJfU1RSVUMsICpQRUVQUk9NX05JQ19DT05GSUcyX1NUUlVDOworI2VuZGlmCisKKy8vCisvLyBUWF9QV1IgVmFsdWUgdmFsaWQgcmFuZ2UgMHhGQSgtNikgfiAweDI0KDM2KQorLy8KKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9FRVBST01fVFhfUFdSX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlDSEFSCUJ5dGUxOwkJCQkvLyBIaWdoIEJ5dGUKKwkJQ0hBUglCeXRlMDsJCQkJLy8gTG93IEJ5dGUKKwl9CWZpZWxkOworCVVTSE9SVAl3b3JkOworfQlFRVBST01fVFhfUFdSX1NUUlVDLCAqUEVFUFJPTV9UWF9QV1JfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfRUVQUk9NX1RYX1BXUl9TVFJVQwl7CisJc3RydWN0CXsKKwkJQ0hBUglCeXRlMDsJCQkJLy8gTG93IEJ5dGUKKwkJQ0hBUglCeXRlMTsJCQkJLy8gSGlnaCBCeXRlCisJfQlmaWVsZDsKKwlVU0hPUlQJd29yZDsKK30JRUVQUk9NX1RYX1BXUl9TVFJVQywgKlBFRVBST01fVFhfUFdSX1NUUlVDOworI2VuZGlmCisKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9FRVBST01fVkVSU0lPTl9TVFJVQwl7CisJc3RydWN0CXsKKwkJVUNIQVIJVmVyc2lvbjsJCQkvLyBIaWdoIEJ5dGUKKwkJVUNIQVIJRmFlUmVsZWFzZU51bWJlcjsJLy8gTG93IEJ5dGUKKwl9CWZpZWxkOworCVVTSE9SVAl3b3JkOworfQlFRVBST01fVkVSU0lPTl9TVFJVQywgKlBFRVBST01fVkVSU0lPTl9TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9FRVBST01fVkVSU0lPTl9TVFJVQwl7CisJc3RydWN0CXsKKwkJVUNIQVIJRmFlUmVsZWFzZU51bWJlcjsJLy8gTG93IEJ5dGUKKwkJVUNIQVIJVmVyc2lvbjsJCQkvLyBIaWdoIEJ5dGUKKwl9CWZpZWxkOworCVVTSE9SVAl3b3JkOworfQlFRVBST01fVkVSU0lPTl9TVFJVQywgKlBFRVBST01fVkVSU0lPTl9TVFJVQzsKKyNlbmRpZgorCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfRUVQUk9NX0xFRF9TVFJVQwl7CisJc3RydWN0CXsKKwkJVVNIT1JUCVJzdmQ6MzsJCQkJLy8gUmVzZXJ2ZWQKKwkJVVNIT1JUCUxlZE1vZGU6NTsJCQkvLyBMZWQgbW9kZS4KKwkJVVNIT1JUCVBvbGFyaXR5R1BJT180OjE7CS8vIFBvbGFyaXR5IEdQSU8jNCBzZXR0aW5nLgorCQlVU0hPUlQJUG9sYXJpdHlHUElPXzM6MTsJLy8gUG9sYXJpdHkgR1BJTyMzIHNldHRpbmcuCisJCVVTSE9SVAlQb2xhcml0eUdQSU9fMjoxOwkvLyBQb2xhcml0eSBHUElPIzIgc2V0dGluZy4KKwkJVVNIT1JUCVBvbGFyaXR5R1BJT18xOjE7CS8vIFBvbGFyaXR5IEdQSU8jMSBzZXR0aW5nLgorCQlVU0hPUlQJUG9sYXJpdHlHUElPXzA6MTsJLy8gUG9sYXJpdHkgR1BJTyMwIHNldHRpbmcuCisJCVVTSE9SVAlQb2xhcml0eUFDVDoxOwkJLy8gUG9sYXJpdHkgQUNUIHNldHRpbmcuCisJCVVTSE9SVAlQb2xhcml0eVJEWV9BOjE7CQkvLyBQb2xhcml0eSBSRFlfQSBzZXR0aW5nLgorCQlVU0hPUlQJUG9sYXJpdHlSRFlfRzoxOwkJLy8gUG9sYXJpdHkgUkRZX0cgc2V0dGluZy4KKwl9CWZpZWxkOworCVVTSE9SVAl3b3JkOworfQlFRVBST01fTEVEX1NUUlVDLCAqUEVFUFJPTV9MRURfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfRUVQUk9NX0xFRF9TVFJVQwl7CisJc3RydWN0CXsKKwkJVVNIT1JUCVBvbGFyaXR5UkRZX0c6MTsJCS8vIFBvbGFyaXR5IFJEWV9HIHNldHRpbmcuCisJCVVTSE9SVAlQb2xhcml0eVJEWV9BOjE7CQkvLyBQb2xhcml0eSBSRFlfQSBzZXR0aW5nLgorCQlVU0hPUlQJUG9sYXJpdHlBQ1Q6MTsJCS8vIFBvbGFyaXR5IEFDVCBzZXR0aW5nLgorCQlVU0hPUlQJUG9sYXJpdHlHUElPXzA6MTsJLy8gUG9sYXJpdHkgR1BJTyMwIHNldHRpbmcuCisJCVVTSE9SVAlQb2xhcml0eUdQSU9fMToxOwkvLyBQb2xhcml0eSBHUElPIzEgc2V0dGluZy4KKwkJVVNIT1JUCVBvbGFyaXR5R1BJT18yOjE7CS8vIFBvbGFyaXR5IEdQSU8jMiBzZXR0aW5nLgorCQlVU0hPUlQJUG9sYXJpdHlHUElPXzM6MTsJLy8gUG9sYXJpdHkgR1BJTyMzIHNldHRpbmcuCisJCVVTSE9SVAlQb2xhcml0eUdQSU9fNDoxOwkvLyBQb2xhcml0eSBHUElPIzQgc2V0dGluZy4KKwkJVVNIT1JUCUxlZE1vZGU6NTsJCQkvLyBMZWQgbW9kZS4KKwkJVVNIT1JUCVJzdmQ6MzsJCQkJLy8gUmVzZXJ2ZWQKKwl9CWZpZWxkOworCVVTSE9SVAl3b3JkOworfQlFRVBST01fTEVEX1NUUlVDLCAqUEVFUFJPTV9MRURfU1RSVUM7CisjZW5kaWYKKworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX0VFUFJPTV9UWFBPV0VSX0RFTFRBX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVQ0hBUglUeFBvd2VyRW5hYmxlOjE7Ly8gRW5hYmxlCisJCVVDSEFSCVR5cGU6MTsJCQkvLyAxOiBwbHVzIHRoZSBkZWx0YSB2YWx1ZSwgMDogbWludXMgdGhlIGRlbHRhIHZhbHVlCisJCVVDSEFSCURlbHRhVmFsdWU6NjsJLy8gVHggUG93ZXIgZGFsdGEgdmFsdWUgKE1BWD00KQorCX0JZmllbGQ7CisJVUNIQVIJdmFsdWU7Cit9CUVFUFJPTV9UWFBPV0VSX0RFTFRBX1NUUlVDLCAqUEVFUFJPTV9UWFBPV0VSX0RFTFRBX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX0VFUFJPTV9UWFBPV0VSX0RFTFRBX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVQ0hBUglEZWx0YVZhbHVlOjY7CS8vIFR4IFBvd2VyIGRhbHRhIHZhbHVlIChNQVg9NCkKKwkJVUNIQVIJVHlwZToxOwkJCS8vIDE6IHBsdXMgdGhlIGRlbHRhIHZhbHVlLCAwOiBtaW51cyB0aGUgZGVsdGEgdmFsdWUKKwkJVUNIQVIJVHhQb3dlckVuYWJsZToxOy8vIEVuYWJsZQorCX0JZmllbGQ7CisJVUNIQVIJdmFsdWU7Cit9CUVFUFJPTV9UWFBPV0VSX0RFTFRBX1NUUlVDLCAqUEVFUFJPTV9UWFBPV0VSX0RFTFRBX1NUUlVDOworI2VuZGlmCisKKy8vCisvLyBRT1NfQ1NSMDogVFhPUCBob2xkZXIgYWRkcmVzczAgcmVnaXN0ZXIKKy8vCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfUU9TX0NTUjBfU1RSVUMJeworCXN0cnVjdAl7CisJCVVDSEFSCQlCeXRlMzsJCS8vIE1BQyBhZGRyZXNzIGJ5dGUgMworCQlVQ0hBUgkJQnl0ZTI7CQkvLyBNQUMgYWRkcmVzcyBieXRlIDIKKwkJVUNIQVIJCUJ5dGUxOwkJLy8gTUFDIGFkZHJlc3MgYnl0ZSAxCisJCVVDSEFSCQlCeXRlMDsJCS8vIE1BQyBhZGRyZXNzIGJ5dGUgMAorCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JUU9TX0NTUjBfU1RSVUMsICpQUU9TX0NTUjBfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfUU9TX0NTUjBfU1RSVUMJeworCXN0cnVjdAl7CisJCVVDSEFSCQlCeXRlMDsJCS8vIE1BQyBhZGRyZXNzIGJ5dGUgMAorCQlVQ0hBUgkJQnl0ZTE7CQkvLyBNQUMgYWRkcmVzcyBieXRlIDEKKwkJVUNIQVIJCUJ5dGUyOwkJLy8gTUFDIGFkZHJlc3MgYnl0ZSAyCisJCVVDSEFSCQlCeXRlMzsJCS8vIE1BQyBhZGRyZXNzIGJ5dGUgMworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JUU9TX0NTUjBfU1RSVUMsICpQUU9TX0NTUjBfU1RSVUM7CisjZW5kaWYKKworLy8KKy8vIFFPU19DU1IxOiBUWE9QIGhvbGRlciBhZGRyZXNzMSByZWdpc3RlcgorLy8KKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9RT1NfQ1NSMV9TVFJVQwl7CisJc3RydWN0CXsKKwkJVUNIQVIJCVJzdmQxOworCQlVQ0hBUgkJUnN2ZDA7CisJCVVDSEFSCQlCeXRlNTsJCS8vIE1BQyBhZGRyZXNzIGJ5dGUgNQorCQlVQ0hBUgkJQnl0ZTQ7CQkvLyBNQUMgYWRkcmVzcyBieXRlIDQKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVFPU19DU1IxX1NUUlVDLCAqUFFPU19DU1IxX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX1FPU19DU1IxX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVQ0hBUgkJQnl0ZTQ7CQkvLyBNQUMgYWRkcmVzcyBieXRlIDQKKwkJVUNIQVIJCUJ5dGU1OwkJLy8gTUFDIGFkZHJlc3MgYnl0ZSA1CisJCVVDSEFSCQlSc3ZkMDsKKwkJVUNIQVIJCVJzdmQxOworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JUU9TX0NTUjFfU1RSVUMsICpQUU9TX0NTUjFfU1RSVUM7CisjZW5kaWYKKworI2RlZmluZQlSRl9DU1JfQ0ZHCTB4NTAwCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfUkZfQ1NSX0NGR19TVFJVQwl7CisJc3RydWN0CXsKKwkJVUlOVAlSc3ZkMToxNDsJCQkJLy8gUmVzZXJ2ZWQKKwkJVUlOVAlSRl9DU1JfS0lDSzoxOwkJCS8vIGtpY2sgUkYgcmVnaXN0ZXIgcmVhZC93cml0ZQorCQlVSU5UCVJGX0NTUl9XUjoxOwkJCS8vIDA6IHJlYWQgIDE6IHdyaXRlCisJCVVJTlQJUnN2ZDI6MzsJCQkJLy8gUmVzZXJ2ZWQKKwkJVUlOVAlURVNUQ1NSX1JGQUNDX1JFR05VTTo1OwkvLyBSRiByZWdpc3RlciBJRAorCQlVSU5UCVJGX0NTUl9EQVRBOjg7CQkJLy8gREFUQQorCX0JZmllbGQ7CisJVUlOVAl3b3JkOworfQlSRl9DU1JfQ0ZHX1NUUlVDLCAqUFJGX0NTUl9DRkdfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfUkZfQ1NSX0NGR19TVFJVQwl7CisJc3RydWN0CXsKKwkJVUlOVAlSRl9DU1JfREFUQTo4OwkJCS8vIERBVEEKKwkJVUlOVAlURVNUQ1NSX1JGQUNDX1JFR05VTTo1OwkvLyBSRiByZWdpc3RlciBJRAorCQlVSU5UCVJzdmQyOjM7CQkJCS8vIFJlc2VydmVkCisJCVVJTlQJUkZfQ1NSX1dSOjE7CQkJLy8gMDogcmVhZCAgMTogd3JpdGUKKwkJVUlOVAlSRl9DU1JfS0lDSzoxOwkJCS8vIGtpY2sgUkYgcmVnaXN0ZXIgcmVhZC93cml0ZQorCQlVSU5UCVJzdmQxOjE0OwkJCQkvLyBSZXNlcnZlZAorCX0JZmllbGQ7CisJVUlOVAl3b3JkOworfQlSRl9DU1JfQ0ZHX1NUUlVDLCAqUFJGX0NTUl9DRkdfU1RSVUM7CisjZW5kaWYKKworI2VuZGlmCS8vIF9fUlQyOFhYX0hfXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9ydF9hdGUuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvcnRfYXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjdjNzYzZWUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3J0X2F0ZS5jCkBAIC0wLDAgKzEsNjQ1MiBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworI2luY2x1ZGUgInJ0X2NvbmZpZy5oIgorCisjaWZkZWYgVUNPUworSU5UIElvY3RsUmVzcG9uc2UoUFVDSEFSIHBheWxvYWQsIFBVQ0hBUiBtc2csIElOVCBsZW4pOworI2VuZGlmIC8vIFVDT1MgLy8KKworI2lmZGVmIFJBTElOS19BVEUKK1VDSEFSIFRlbXBsYXRlRnJhbWVbMjRdID0gezB4MDgvKiBEYXRhIHR5cGUgKi8sMHgwMCwweDAwLDB4MDAsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHgwMCwweEFBLDB4QkIsMHgxMiwweDM0LDB4NTYsMHgwMCwweDExLDB4MjIsMHhBQSwweEJCLDB4Q0MsMHgwMCwweDAwfTsJLy8gODAyLjExIE1BQyBIZWFkZXIsIFR5cGU6RGF0YSwgTGVuZ3RoOjI0Ynl0ZXMKK2V4dGVybiBSVE1QX1JGX1JFR1MgUkYyODUwUmVnVGFibGVbXTsKK2V4dGVybiBVQ0hBUiBOVU1fT0ZfMjg1MF9DSE5MOworCisjaWZkZWYgUlQyODcwCitleHRlcm4gVUNIQVIgRXBUb1F1ZXVlW107CitleHRlcm4gVk9JRAlSVFVTQlJlamVjdFBlbmRpbmdQYWNrZXRzKAlJTglQUlRNUF9BREFQVEVSCXBBZCk7CisjZW5kaWYgLy8gUlQyODcwIC8vCisKKyNpZmRlZiBVQ09TCitleHRlcm4gSU5UIENvbnNvbGVSZXNwb25zZShJTiBQVUNIQVIgYnVmZik7CitleHRlcm4gaW50ICgqcmVtb3RlX2Rpc3BsYXkpKGNoYXIgKik7CisjZW5kaWYgLy8gVUNPUyAvLworCitzdGF0aWMgQ0hBUiBDQ0tSYXRlVGFibGVbXSA9IHswLCAxLCAyLCAzLCA4LCA5LCAxMCwgMTEsIC0xfTsgLyogQ0NLIE1vZGUuICovCitzdGF0aWMgQ0hBUiBPRkRNUmF0ZVRhYmxlW10gPSB7MCwgMSwgMiwgMywgNCwgNSwgNiwgNywgLTF9OyAvKiBPRkRNIE1vZGUuICovCitzdGF0aWMgQ0hBUiBIVE1JWFJhdGVUYWJsZVtdID0gezAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsIC0xfTsgLyogSFQgTWl4IE1vZGUuICovCisKK3N0YXRpYyBJTlQgVHhEbWFCdXN5KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKworc3RhdGljIElOVCBSeERtYUJ1c3koCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpOworCitzdGF0aWMgVk9JRCBSdG1wRG1hRW5hYmxlKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIElOVCBFbmFibGUpOworCitzdGF0aWMgVk9JRCBCYnBTb2Z0UmVzZXQoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpOworCitzdGF0aWMgVk9JRCBSdG1wUmZJb1dyaXRlKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKworc3RhdGljIElOVCBBVEVTZXRVcEZyYW1lKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVJTlQzMiBUeElkeCk7CisKK3N0YXRpYyBJTlQgQVRFVHhQd3JIYW5kbGVyKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIGNoYXIgaW5kZXgpOworCitzdGF0aWMgSU5UIEFURUNtZEhhbmRsZXIoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworc3RhdGljIGludCBDaGVja01DU1ZhbGlkKAorCUlOIFVDSEFSIE1vZGUsCisJSU4gVUNIQVIgTWNzKTsKKworCisjaWZkZWYgUlQyODcwCitzdGF0aWMgVk9JRCBBVEVXcml0ZVR4SW5mbygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVFhJTkZPX1NUUlVDIAlwVHhJbmZvLAorCUlOCSAgVVNIT1JUCQlVU0JETUFwa3RMZW4sCisJSU4JICBCT09MRUFOCQliV2l2LAorCUlOCSAgVUNIQVIJCQlRdWV1ZVNlbCwKKwlJTgkgIFVDSEFSCQkJTmV4dFZhbGlkLAorCUlOCSAgVUNIQVIJCQlUeEJ1cnN0KTsKKworc3RhdGljIFZPSUQgQVRFV3JpdGVUeFdJKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBUWFdJX1NUUlVDIAlwVHhXSSwKKwlJTglCT09MRUFOCQkJRlJBRywKKwlJTglCT09MRUFOCQkJSW5zVGltZXN0YW1wLAorCUlOCUJPT0xFQU4gCQlBTVBEVSwKKwlJTglCT09MRUFOIAkJQWNrLAorCUlOCUJPT0xFQU4gCQlOU2VxLAkJLy8gSFcgbmV3IGEgc2VxdWVuY2UuCisJSU4JVUNIQVIJCQlCQVNpemUsCisJSU4JVUNIQVIJCQlXQ0lELAorCUlOCVVMT05HCQkJTGVuZ3RoLAorCUlOCVVDSEFSIAkJCVBJRCwKKwlJTglVQ0hBUgkJCU1JTU9wcywKKwlJTglVQ0hBUgkJCVR4b3Btb2RlLAorCUlOCUJPT0xFQU4JCQlDZkFjaywKKwlJTglIVFRSQU5TTUlUX1NFVFRJTkcJVHJhbnNtaXQpOworCisjZW5kaWYgLy8gUlQyODcwIC8vCisKK3N0YXRpYyBWT0lEIFNldEphcGFuRmlsdGVyKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKTsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09ZW5kIG9mIHByb3RvdHlwZT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKyNpZmRlZiBSVDI4NzAKK3N0YXRpYyBJTlQgVHhEbWFCdXN5KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCUlOVCByZXN1bHQ7CisJVVNCX0RNQV9DRkdfU1RSVUMgVXNiQ2ZnOworCisJUlRNUF9JT19SRUFEMzIocEFkLCBVU0JfRE1BX0NGRywgJlVzYkNmZy53b3JkKTsJLy8gZGlzYWJsZSBETUEKKwlpZiAoVXNiQ2ZnLmZpZWxkLlR4QnVzeSkKKwkJcmVzdWx0ID0gMTsKKwllbHNlCisJCXJlc3VsdCA9IDA7CisKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgSU5UIFJ4RG1hQnVzeSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlJTlQgcmVzdWx0OworCVVTQl9ETUFfQ0ZHX1NUUlVDIFVzYkNmZzsKKworCVJUTVBfSU9fUkVBRDMyKHBBZCwgVVNCX0RNQV9DRkcsICZVc2JDZmcud29yZCk7CS8vIGRpc2FibGUgRE1BCisJaWYgKFVzYkNmZy5maWVsZC5SeEJ1c3kpCisJCXJlc3VsdCA9IDE7CisJZWxzZQorCQlyZXN1bHQgPSAwOworCisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIFZPSUQgUnRtcERtYUVuYWJsZSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBJTlQgRW5hYmxlKQoreworCUJPT0xFQU4gdmFsdWU7CisJVUxPTkcgV2FpdENudDsKKwlVU0JfRE1BX0NGR19TVFJVQyBVc2JDZmc7CisKKwl2YWx1ZSA9IEVuYWJsZSA+IDAgPyAxIDogMDsKKworCS8vIGNoZWNrIERNQSBpcyBpbiBidXN5IG1vZGUuCisJV2FpdENudCA9IDA7CisJd2hpbGUgKFR4RG1hQnVzeShwQWQpIHx8IFJ4RG1hQnVzeShwQWQpKQorCXsKKwkJUlRNUHVzZWNEZWxheSgxMCk7CisJCWlmIChXYWl0Q250KysgPiAxMDApCisJCQlicmVhazsKKwl9CisKKwkvL1doeSBub3QgdG8gY2xlYXIgVVNCIERNQSBUWCBwYXRoIGZpcnN0ID8/PworCVJUTVBfSU9fUkVBRDMyKHBBZCwgVVNCX0RNQV9DRkcsICZVc2JDZmcud29yZCk7CS8vIGRpc2FibGUgRE1BCisJVXNiQ2ZnLmZpZWxkLlR4QnVsa0VuID0gdmFsdWU7CisJVXNiQ2ZnLmZpZWxkLlJ4QnVsa0VuID0gdmFsdWU7CisJUlRNUF9JT19XUklURTMyKHBBZCwgVVNCX0RNQV9DRkcsIFVzYkNmZy53b3JkKTsJLy8gYWJvcnQgYWxsIFRYIHJpbmdzCisJUlRNUHVzZWNEZWxheSg1MDAwKTsKKworCXJldHVybjsKK30KKyNlbmRpZiAvLyBSVDI4NzAgLy8KKworc3RhdGljIFZPSUQgQmJwU29mdFJlc2V0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCVVDSEFSIEJicERhdGEgPSAwOworCisJLy8gU29mdCByZXNldCwgc2V0IEJCUCBSMjEgYml0MD0xLT4wCisJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjIxLCAmQmJwRGF0YSk7CisJQmJwRGF0YSB8PSAweDAwMDAwMDAxOyAvL3NldCBiaXQwPTEKKwlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjIxLCBCYnBEYXRhKTsKKworCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IyMSwgJkJicERhdGEpOworCUJicERhdGEgJj0gfigweDAwMDAwMDAxKTsgLy9zZXQgYml0MD0wCisJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IyMSwgQmJwRGF0YSk7CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBWT0lEIFJ0bXBSZklvV3JpdGUoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJLy8gU2V0IFJGIHZhbHVlIDEncyBzZXQgUjNbYml0Ml0gPSBbMF0KKwlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCBwQWQtPkxhdGNoUmZSZWdzLlIxKTsKKwlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCBwQWQtPkxhdGNoUmZSZWdzLlIyKTsKKwlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCAocEFkLT5MYXRjaFJmUmVncy5SMyAmICh+MHgwNCkpKTsKKwlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCBwQWQtPkxhdGNoUmZSZWdzLlI0KTsKKworCVJUTVB1c2VjRGVsYXkoMjAwKTsKKworCS8vIFNldCBSRiB2YWx1ZSAyJ3Mgc2V0IFIzW2JpdDJdID0gWzFdCisJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgcEFkLT5MYXRjaFJmUmVncy5SMSk7CisJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgcEFkLT5MYXRjaFJmUmVncy5SMik7CisJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgKHBBZC0+TGF0Y2hSZlJlZ3MuUjMgfCAweDA0KSk7CisJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgcEFkLT5MYXRjaFJmUmVncy5SNCk7CisKKwlSVE1QdXNlY0RlbGF5KDIwMCk7CisKKwkvLyBTZXQgUkYgdmFsdWUgMydzIHNldCBSM1tiaXQyXSA9IFswXQorCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIHBBZC0+TGF0Y2hSZlJlZ3MuUjEpOworCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIHBBZC0+TGF0Y2hSZlJlZ3MuUjIpOworCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIChwQWQtPkxhdGNoUmZSZWdzLlIzICYgKH4weDA0KSkpOworCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIHBBZC0+TGF0Y2hSZlJlZ3MuUjQpOworCisJcmV0dXJuOworfQorCitzdGF0aWMgaW50IENoZWNrTUNTVmFsaWQoCisJVUNIQVIgTW9kZSwKKwlVQ0hBUiBNY3MpCit7CisJaW50IGk7CisJUENIQVIgcFJhdGVUYWI7CisKKwlzd2l0Y2goTW9kZSkKKwl7CisJCWNhc2UgMDoKKwkJCXBSYXRlVGFiID0gQ0NLUmF0ZVRhYmxlOworCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCXBSYXRlVGFiID0gT0ZETVJhdGVUYWJsZTsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCWNhc2UgMzoKKwkJCXBSYXRlVGFiID0gSFRNSVhSYXRlVGFibGU7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoInVucmVjb2duaXphYmxlIFR4IE1vZGUgJWRcbiIsIE1vZGUpKTsKKwkJCXJldHVybiAtMTsKKwkJCWJyZWFrOworCX0KKworCWkgPSAwOworCXdoaWxlKHBSYXRlVGFiW2ldICE9IC0xKQorCXsKKwkJaWYgKHBSYXRlVGFiW2ldID09IE1jcykKKwkJCXJldHVybiAwOworCQlpKys7CisJfQorCisJcmV0dXJuIC0xOworfQorCisjaWYgMQorc3RhdGljIElOVCBBVEVUeFB3ckhhbmRsZXIoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gY2hhciBpbmRleCkKK3sKKwlVTE9ORyBSOworCUNIQVIgVHhQb3dlcjsKKwlVQ0hBUiBCYnA5NCA9IDA7CisJQk9PTEVBTiBiUG93ZXJSZWR1Y2UgPSBGQUxTRTsKKworI2lmZGVmIFJBTElOS18yOHh4X1FBCisJaWYgKChwQWQtPmF0ZS5iUUFUeFN0YXJ0ID09IFRSVUUpIHx8IChwQWQtPmF0ZS5iUUFSeFN0YXJ0ID09IFRSVUUpKQorCXsKKwkJLyogV2hlbiBRQSBpcyB1c2VkIGZvciBUeCwgcEFkLT5hdGUuVHhQb3dlcjAvMSBhbmQgcmVhbCB0eCBwb3dlcgorCQkqKiBhcmUgbm90IHN5bmNocm9uaXplZC4KKwkJKi8KKy8qCisJCXBBZC0+YXRlLlR4UG93ZXIwID0gcEFkLT5MYXRjaFJmUmVncy54eHg7CisJCXBBZC0+YXRlLlR4UG93ZXIxID0gcEFkLT5MYXRjaFJmUmVncy54eHg7CisqLworCQlyZXR1cm4gMDsKKwl9CisJZWxzZQorI2VuZGlmIC8vIFJBTElOS18yOHh4X1FBIC8vCisJeworCQlUeFBvd2VyID0gaW5kZXggPT0gMCA/IHBBZC0+YXRlLlR4UG93ZXIwIDogcEFkLT5hdGUuVHhQb3dlcjE7CisKKwkJaWYgKHBBZC0+YXRlLkNoYW5uZWwgPD0gMTQpCisJCXsKKwkJCWlmIChUeFBvd2VyID4gMzEpCisJCQl7CisJCQkJLy8KKwkJCQkvLyBSMywgUjQgY2FuJ3QgbGFyZ2UgdGhhbiAzMSAoMHgyNCksIDMxIH4gMzYgdXNlZCBieSBCQlAgOTQKKwkJCQkvLworCQkJCVIgPSAzMTsKKwkJCQlpZiAoVHhQb3dlciA8PSAzNikKKwkJCQkJQmJwOTQgPSBCQlBSOTRfREVGQVVMVCArIChVQ0hBUikoVHhQb3dlciAtIDMxKTsKKwkJCX0KKwkJCWVsc2UgaWYgKFR4UG93ZXIgPCAwKQorCQkJeworCQkJCS8vCisJCQkJLy8gUjMsIFI0IGNhbid0IGxlc3MgdGhhbiAwLCAtMSB+IC02IHVzZWQgYnkgQkJQIDk0CisJCQkJLy8KKwkJCQlSID0gMDsKKwkJCQlpZiAoVHhQb3dlciA+PSAtNikKKwkJCQkJQmJwOTQgPSBCQlBSOTRfREVGQVVMVCArIFR4UG93ZXI7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJLy8gMCB+IDMxCisJCQkJUiA9IChVTE9ORykgVHhQb3dlcjsKKwkJCQlCYnA5NCA9IEJCUFI5NF9ERUZBVUxUOworCQkJfQorCisJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcyAoVHhQb3dlcj0lZCwgUj0lbGQsIEJCUF9SOTQ9JWQpXG4iLCBfX2Z1bmNfXywgVHhQb3dlciwgUiwgQmJwOTQpKTsKKwkJfQorCQllbHNlLy8gNS41IEdIegorCQl7CisJCQlpZiAoVHhQb3dlciA+IDE1KQorCQkJeworCQkJCS8vCisJCQkJLy8gUjMsIFI0IGNhbid0IGxhcmdlIHRoYW4gMTUgKDB4MEYpCisJCQkJLy8KKwkJCQlSID0gMTU7CisJCQl9CisJCQllbHNlIGlmIChUeFBvd2VyIDwgMCkKKwkJCXsKKwkJCQkvLworCQkJCS8vIFIzLCBSNCBjYW4ndCBsZXNzIHRoYW4gMAorCQkJCS8vCisJCQkJLy8gLTEgfiAtNworCQkJCUFTU0VSVCgoVHhQb3dlciA+PSAtNykpOworCQkJCVIgPSAoVUxPTkcpKFR4UG93ZXIgKyA3KTsKKwkJCQliUG93ZXJSZWR1Y2UgPSBUUlVFOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCS8vIDAgfiAxNQorCQkJCVIgPSAoVUxPTkcpIFR4UG93ZXI7CisJCQl9CisKKwkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzIChUeFBvd2VyPSVkLCBSPSVsdSlcbiIsIF9fZnVuY19fLCBUeFBvd2VyLCBSKSk7CisJCX0KKworCQlpZiAocEFkLT5hdGUuQ2hhbm5lbCA8PSAxNCkKKwkJeworCQkJaWYgKGluZGV4ID09IDApCisJCQl7CisJCQkJUiA9IFIgPDwgOTsJCS8vIHNoaWZ0IFRYIHBvd2VyIGNvbnRyb2wgdG8gY29ycmVjdCBSRihSMykgcmVnaXN0ZXIgYml0IHBvc2l0aW9uCisJCQkJUiB8PSAocEFkLT5MYXRjaFJmUmVncy5SMyAmIDB4ZmZmZmMxZmYpOworCQkJCXBBZC0+TGF0Y2hSZlJlZ3MuUjMgPSBSOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCVIgPSBSIDw8IDY7CQkvLyBzaGlmdCBUWCBwb3dlciBjb250cm9sIHRvIGNvcnJlY3QgUkYoUjQpIHJlZ2lzdGVyIGJpdCBwb3NpdGlvbgorCQkJCVIgfD0gKHBBZC0+TGF0Y2hSZlJlZ3MuUjQgJiAweGZmZmZmODNmKTsKKwkJCQlwQWQtPkxhdGNoUmZSZWdzLlI0ID0gUjsKKwkJCX0KKwkJfQorCQllbHNlLy8gNS41R0h6CisJCXsKKwkJCWlmIChiUG93ZXJSZWR1Y2UgPT0gRkFMU0UpCisJCQl7CisJCQkJaWYgKGluZGV4ID09IDApCisJCQkJeworCQkJCQlSID0gKFIgPDwgMTApIHwgKDEgPDwgOSk7CQkvLyBzaGlmdCBUWCBwb3dlciBjb250cm9sIHRvIGNvcnJlY3QgUkYoUjMpIHJlZ2lzdGVyIGJpdCBwb3NpdGlvbgorCQkJCQlSIHw9IChwQWQtPkxhdGNoUmZSZWdzLlIzICYgMHhmZmZmYzFmZik7CisJCQkJCXBBZC0+TGF0Y2hSZlJlZ3MuUjMgPSBSOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlSID0gKFIgPDwgNykgfCAoMSA8PCA2KTsJCS8vIHNoaWZ0IFRYIHBvd2VyIGNvbnRyb2wgdG8gY29ycmVjdCBSRihSNCkgcmVnaXN0ZXIgYml0IHBvc2l0aW9uCisJCQkJCVIgfD0gKHBBZC0+TGF0Y2hSZlJlZ3MuUjQgJiAweGZmZmZmODNmKTsKKwkJCQkJcEFkLT5MYXRjaFJmUmVncy5SNCA9IFI7CisJCQkJfQorCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWlmIChpbmRleCA9PSAwKQorCQkJCXsKKwkJCQkJUiA9IChSIDw8IDEwKTsJCS8vIHNoaWZ0IFRYIHBvd2VyIGNvbnRyb2wgdG8gY29ycmVjdCBSRihSMykgcmVnaXN0ZXIgYml0IHBvc2l0aW9uCisJCQkJCVIgfD0gKHBBZC0+TGF0Y2hSZlJlZ3MuUjMgJiAweGZmZmZjMWZmKTsKKworCQkJCQkvKiBDbGVhciBiaXQgOSBvZiBSMyB0byByZWR1Y2UgN2RCLiAqLworCQkJCQlwQWQtPkxhdGNoUmZSZWdzLlIzID0gKFIgJiAofigxIDw8IDkpKSk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCVIgPSAoUiA8PCA3KTsJCS8vIHNoaWZ0IFRYIHBvd2VyIGNvbnRyb2wgdG8gY29ycmVjdCBSRihSNCkgcmVnaXN0ZXIgYml0IHBvc2l0aW9uCisJCQkJCVIgfD0gKHBBZC0+TGF0Y2hSZlJlZ3MuUjQgJiAweGZmZmZmODNmKTsKKworCQkJCQkvKiBDbGVhciBiaXQgNiBvZiBSNCB0byByZWR1Y2UgN2RCLiAqLworCQkJCQlwQWQtPkxhdGNoUmZSZWdzLlI0ID0gKFIgJiAofigxIDw8IDYpKSk7CisJCQkJfQorCQkJfQorCQl9CisKKwkJUnRtcFJmSW9Xcml0ZShwQWQpOworCisJCXJldHVybiAwOworCX0KK30KKyNlbHNlLy8gMSAvLworc3RhdGljIElOVCBBVEVUeFB3ckhhbmRsZXIoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gY2hhciBpbmRleCkKK3sKKwlVTE9ORyBSOworCUNIQVIgVHhQb3dlcjsKKwlVQ0hBUiBCYnA5NCA9IDA7CisKKyNpZmRlZiBSQUxJTktfMjh4eF9RQQorCWlmICgocEFkLT5hdGUuYlFBVHhTdGFydCA9PSBUUlVFKSB8fCAocEFkLT5hdGUuYlFBUnhTdGFydCA9PSBUUlVFKSkKKwl7CisJCS8vIFRPRE86IGhvdyB0byBnZXQgY3VycmVudCBUeFBvd2VyMC8xIGZyb20gcEFkLT5MYXRjaFJmUmVncyA/CisJCS8qIFdoZW4gUUEgaXMgdXNlZCBmb3IgVHgsIHBBZC0+YXRlLlR4UG93ZXIwLzEgYW5kIHJlYWwgdHggcG93ZXIKKwkJKiogYXJlIG5vdCBzeW5jaHJvbml6ZWQuCisJCSovCisvKgorCQlwQWQtPmF0ZS5UeFBvd2VyMCA9IHBBZC0+TGF0Y2hSZlJlZ3MueHh4OworCQlwQWQtPmF0ZS5UeFBvd2VyMSA9IHBBZC0+TGF0Y2hSZlJlZ3MueHh4OworKi8KKwkJcmV0dXJuIDA7CisJfQorCWVsc2UKKyNlbmRpZiAvLyBSQUxJTktfMjh4eF9RQSAvLworCXsKKwkJVHhQb3dlciA9IGluZGV4ID09IDAgPyBwQWQtPmF0ZS5UeFBvd2VyMCA6IHBBZC0+YXRlLlR4UG93ZXIxOworCisJaWYgKFR4UG93ZXIgPiAzMSkKKwl7CisJCS8vCisJCS8vIFIzLCBSNCBjYW4ndCBsYXJnZSB0aGFuIDM2ICgweDI0KSwgMzEgfiAzNiB1c2VkIGJ5IEJCUCA5NAorCQkvLworCQlSID0gMzE7CisJCWlmIChUeFBvd2VyIDw9IDM2KQorCQkJQmJwOTQgPSBCQlBSOTRfREVGQVVMVCArIChVQ0hBUikoVHhQb3dlciAtIDMxKTsKKwl9CisJZWxzZSBpZiAoVHhQb3dlciA8IDApCisJeworCQkvLworCQkvLyBSMywgUjQgY2FuJ3QgbGVzcyB0aGFuIDAsIC0xIH4gLTYgdXNlZCBieSBCQlAgOTQKKwkJLy8KKwkJUiA9IDA7CisJCWlmIChUeFBvd2VyID49IC02KQorCQkJQmJwOTQgPSBCQlBSOTRfREVGQVVMVCArIFR4UG93ZXI7CisJfQorCWVsc2UKKwl7CisJCS8vIDAgfiAzMQorCQlSID0gKFVMT05HKSBUeFBvd2VyOworCQlCYnA5NCA9IEJCUFI5NF9ERUZBVUxUOworCX0KKworCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzIChUeFBvd2VyPSVkLCBSMz0lbGQsIEJCUF9SOTQ9JWQpXG4iLCBfX2Z1bmNfXywgVHhQb3dlciwgUiwgQmJwOTQpKTsKKworCQlpZiAocEFkLT5hdGUuQ2hhbm5lbCA8PSAxNCkKKwkJeworCWlmIChpbmRleCA9PSAwKQorCXsKKwkJUiA9IFIgPDwgOTsJCS8vIHNoaWZ0IFRYIHBvd2VyIGNvbnRyb2wgdG8gY29ycmVjdCBSRihSMykgcmVnaXN0ZXIgYml0IHBvc2l0aW9uCisJCVIgfD0gKHBBZC0+TGF0Y2hSZlJlZ3MuUjMgJiAweGZmZmZjMWZmKTsKKwkJcEFkLT5MYXRjaFJmUmVncy5SMyA9IFI7CisJfQorCWVsc2UKKwl7CisJCVIgPSBSIDw8IDY7CQkvLyBzaGlmdCBUWCBwb3dlciBjb250cm9sIHRvIGNvcnJlY3QgUkYoUjQpIHJlZ2lzdGVyIGJpdCBwb3NpdGlvbgorCQlSIHw9IChwQWQtPkxhdGNoUmZSZWdzLlI0ICYgMHhmZmZmZjgzZik7CisJCXBBZC0+TGF0Y2hSZlJlZ3MuUjQgPSBSOworCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCWlmIChpbmRleCA9PSAwKQorCQkJeworCQkJCVIgPSAoUiA8PCAxMCkgfCAoMSA8PCA5KTsJCS8vIHNoaWZ0IFRYIHBvd2VyIGNvbnRyb2wgdG8gY29ycmVjdCBSRihSMykgcmVnaXN0ZXIgYml0IHBvc2l0aW9uCisJCQkJUiB8PSAocEFkLT5MYXRjaFJmUmVncy5SMyAmIDB4ZmZmZmMxZmYpOworCQkJCXBBZC0+TGF0Y2hSZlJlZ3MuUjMgPSBSOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCVIgPSAoUiA8PCA3KSB8ICgxIDw8IDYpOwkJLy8gc2hpZnQgVFggcG93ZXIgY29udHJvbCB0byBjb3JyZWN0IFJGKFI0KSByZWdpc3RlciBiaXQgcG9zaXRpb24KKwkJCQlSIHw9IChwQWQtPkxhdGNoUmZSZWdzLlI0ICYgMHhmZmZmZjgzZik7CisJCQkJcEFkLT5MYXRjaFJmUmVncy5SNCA9IFI7CisJCQl9CisJCX0KKworCVJ0bXBSZklvV3JpdGUocEFkKTsKKworCXJldHVybiAwOworCX0KK30KKyNlbmRpZiAvLyAxIC8vCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBBVEUgb3BlcmF0aW9uIG1vZGUgdG8KKyAgICAgICAgMC4gQVRFU1RBUlQgID0gU3RhcnQgQVRFIE1vZGUKKyAgICAgICAgMS4gQVRFU1RPUCAgID0gU3RvcCBBVEUgTW9kZQorICAgICAgICAyLiBUWENPTlQgICAgPSBDb250aW51b3VzIFRyYW5zbWl0CisgICAgICAgIDMuIFRYQ0FSUiAgICA9IFRyYW5zbWl0IENhcnJpZXIKKyAgICAgICAgNC4gVFhGUkFNRSAgID0gVHJhbnNtaXQgRnJhbWVzCisgICAgICAgIDUuIFJYRlJBTUUgICA9IFJlY2VpdmUgRnJhbWVzCisjaWZkZWYgUkFMSU5LXzI4eHhfUUEKKyAgICAgICAgNi4gVFhTVE9QICAgID0gU3RvcCBBbnkgVHlwZSBvZiBUcmFuc21pdGlvbgorICAgICAgICA3LiBSWFNUT1AgICAgPSBTdG9wIFJlY2VpdmluZyBGcmFtZXMKKyNlbmRpZiAvLyBSQUxJTktfMjh4eF9RQSAvLworICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qPT09PT09PT09PT09PT09PT09PT09PT1FbmQgb2YgUlQyODYwPT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKy8qPT09PT09PT09PT09PT09PT09PT09PVN0YXJ0IG9mIFJUMjg3MD09PT09PT09PT09PT09PT09PT09PT0qLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworI2lmZGVmIFJUMjg3MAorc3RhdGljIElOVAlBVEVDbWRIYW5kbGVyKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVSU5UMzIJCQlWYWx1ZTsKKwlVQ0hBUgkJCUJicERhdGE7CisJVUlOVDMyICAgICAgICAgIE1hY0RhdGE7CisJVUlOVAkJCWk9MCwgYXRlbW9kZTsKKwkvL05ESVNfU1RBVFVTCQlTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworCS8vUFVDSEFSCQkJcERlc3Q7CisJVUlOVDMyIAkJCXRlbXA7CisJVUxPTkcJCQlJcnFGbGFnczsKKworCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT4gQVRFQ21kSGFuZGxlcigpXG4iKSk7CisJQVRFQXNpY1N3aXRjaENoYW5uZWwocEFkKTsKKwkvKiBBc2ljTG9ja0NoYW5uZWwoKSBpcyBlbXB0eSBmdW5jdGlvbiBzbyBmYXIgaW4gZmFjdCAqLworCUFzaWNMb2NrQ2hhbm5lbChwQWQsIHBBZC0+YXRlLkNoYW5uZWwpOworCisJUlRNUHVzZWNEZWxheSg1MDAwKTsKKworCS8vIERlZmF1bHQgdmFsdWUgaW4gQkJQIFIyMiBpcyAweDAuCisJQmJwRGF0YSA9IDA7CisKKwkvKiBFbnRlciBBVEUgbW9kZSBhbmQgc2V0IFR4L1J4IElkbGUgKi8KKwlpZiAoIXN0cmNtcChhcmcsICJBVEVTVEFSVCIpKQorCXsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJQk9PTEVBTiAgICAgICBDYW5jZWxsZWQ7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFURTogQVRFU1RBUlRcbiIpKTsKKworCQluZXRpZl9zdG9wX3F1ZXVlKHBBZC0+bmV0X2Rldik7CisKKwkJYXRlbW9kZSA9IHBBZC0+YXRlLk1vZGU7CisJCXBBZC0+YXRlLk1vZGUgPSBBVEVfU1RBUlQ7CisvLwkJcEFkLT5hdGUuVHhEb25lQ291bnQgPSBwQWQtPmF0ZS5UeENvdW50OworCQkvLyBEaXNhYmxlIFJ4CisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgTUFDX1NZU19DVFJMLCAmVmFsdWUpOworCQlWYWx1ZSAmPSB+KDEgPDwgMyk7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgVmFsdWUpOworCisJCS8vIERpc2FibGUgYXV0byByZXNwb25kZXIKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBBVVRPX1JTUF9DRkcsICZ0ZW1wKTsKKwkJdGVtcCA9IHRlbXAgJiAweEZGRkZGRkZFOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBBVVRPX1JTUF9DRkcsIHRlbXApOworCisJCS8vIHJlYWQgTUFDX1NZU19DVFJMIGFuZCBiYWNrdXAgTUFDX1NZU19DVFJMIHZhbHVlLgorCQlSVE1QX0lPX1JFQUQzMihwQWQsIE1BQ19TWVNfQ1RSTCwgJk1hY0RhdGEpOworCQkvLyBjbGVhbiBiaXQ0IHRvIHN0b3AgY29udGludW91cyBUeCBwcm9kdWN0aW9uIHRlc3QuCisJCU1hY0RhdGEgJj0gMHhGRkZGRkZFRjsKKwkJLy8gU3RvcCBjb250aW51b3VzIFRYIHByb2R1Y3Rpb24gdGVzdC4KKwkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCBNYWNEYXRhKTsvL2Rpc2FibGUgb3IgY2FuY2VsIHBlbmRpbmcgaXJwIGZpcnN0ID8/PworCisgICAgICAgIGlmIChhdGVtb2RlICYgQVRFX1RYQ0FSUikKKwkJeworCQkJLy8gTm8gQ2FycmllciBUZXN0IHNldCBCQlAgUjIyIGJpdDc9MCwgYml0Nj0wLCBiaXRbNX4wXT0weDAKKwkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IyMiwgJkJicERhdGEpOworCQkJQmJwRGF0YSAmPSAweEZGRkZGRjAwOyAvL2NsZWFyIGJpdDcsIGJpdDYsIGJpdFs1fjBdCisJCSAgICBBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjIyLCBCYnBEYXRhKTsKKwkJfQorCQllbHNlIGlmIChhdGVtb2RlICYgQVRFX1RYQ0FSUlNVUFApCisJCXsKKwkJCS8vIE5vIENvbnQuIFRYIHNldCBCQlAgUjIyIGJpdDc9MAorCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjIyLCAmQmJwRGF0YSk7CisJCQlCYnBEYXRhICY9IH4oMSA8PCA3KTsgLy9zZXQgYml0Nz0wCisJCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjIyLCBCYnBEYXRhKTsKKworCQkJLy8gTm8gQ2FycmllciBTdXBwcmVzc2lvbiBzZXQgQkJQIFIyNCBiaXQwPTAKKwkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IyNCwgJkJicERhdGEpOworCQkJQmJwRGF0YSAmPSAweEZGRkZGRkZFOyAvL2NsZWFyIGJpdDAKKwkJICAgIEFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMjQsIEJicERhdGEpOworCQl9CisJCS8vIFdlIHNob3VsZCBmcmVlIHNvbWUgcmVzb3VyY2Ugd2hpY2ggYWxsb2NhdGUgd2hlbiBBVEVfVFhGUkFNRSAsIEFURV9TVE9QLCBhbmQgQVRFX1RYQ09OVC4KKwkJLy8gVE9ETzpTaG91bGQgd2UgZnJlZSBzb21lIHJlc291cmNlIHdoaWNoIHdhcyBhbGxvY2F0ZWQgd2hlbiBMb29wQmFjayBhbmQgQVRFX1NUT1AgPworCQllbHNlIGlmICgoYXRlbW9kZSAmIEFURV9UWEZSQU1FKSB8fCAoYXRlbW9kZSA9PSBBVEVfU1RPUCkpCisJCXsKKwkJCWlmIChhdGVtb2RlICYgQVRFX1RYQ09OVCkKKwkJCXsKKwkJCQkvLyBOb3QgQ29udC4gVFggYW55bW9yZSwgc28gc2V0IEJCUCBSMjIgYml0Nz0wCisJCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjIyLCAmQmJwRGF0YSk7CisJCQkJQmJwRGF0YSAmPSB+KDEgPDwgNyk7IC8vc2V0IGJpdDc9MAorCQkJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMjIsIEJicERhdGEpOworCQkJfQorCQkJLy8gQWJvcnQgVHgsIFJ4IERNQS4KKwkJCVJ0bXBEbWFFbmFibGUocEFkLCAwKTsKKworCQkJeworCQkJCS8vIEl0IHNlZW1zIG5vdGhpbmcgdG8gZnJlZSwKKwkJCQkvLyBiZWNhdXNlIHdlIGRpZG4ndCBhbGxvY2F0ZSBhbnkgcmVzb3VyY2Ugd2hlbiB3ZSBlbnRlcmVkIEFURV9UWEZSQU1FIG1vZGUgbGF0ZXN0bHkuCisJCQl9CisKKwkJCS8vIFN0YXJ0IFR4LCBSWCBETUEKKwkJCVJ0bXBEbWFFbmFibGUocEFkLCAxKTsKKwkJfQorCisJCVJUVVNCUmVqZWN0UGVuZGluZ1BhY2tldHMocEFkKTsKKwkJUlRVU0JDbGVhblVwRGF0YUJ1bGtPdXRRdWV1ZShwQWQpOworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCS8vCisJCS8vIEl0IHdpbGwgYmUgY2FsbGVkIGluIE1sbWVTdXNwZW5kKCkuCisJCS8vCisJCS8vIENhbmNlbCBwZW5kaW5nIHRpbWVycworCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5Bc3NvY1RpbWVyLCAgICAgJkNhbmNlbGxlZCk7CisJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LlJlYXNzb2NUaW1lciwgICAmQ2FuY2VsbGVkKTsKKwkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguRGlzYXNzb2NUaW1lciwgICAmQ2FuY2VsbGVkKTsKKwkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguQXV0aFRpbWVyLCAgICAgICAmQ2FuY2VsbGVkKTsKKwkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguQmVhY29uVGltZXIsICAgICAmQ2FuY2VsbGVkKTsKKwkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguU2NhblRpbWVyLCAgICAgICAmQ2FuY2VsbGVkKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCQkvL1JUVVNCQ2xlYW5VcE1MTUVXYWl0UXVldWUocEFkKTsJLyogbm90IHVzZWQgaW4gUlQyOHh4ICovCisJCVJUVVNCQ2xlYW5VcE1MTUVCdWxrT3V0UXVldWUocEFkKTsKKworCQkvLyBTb21ldGltZXMga2VybmVsIHdpbGwgaGFuZyBvbiwgc28gd2UgYXZvaWQgY2FsbGluZyBNbG1lU3VzcGVuZCgpLgorLy8JCU1sbWVTdXNwZW5kKHBBZCwgVFJVRSk7CisJCS8vUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWUuUGVyaW9kaWNUaW1lciwgJkNhbmNlbGxlZCk7CisKKwkJLy8gRGlzYWJsZSBSeAorCQlSVE1QX0lPX1JFQUQzMihwQWQsIE1BQ19TWVNfQ1RSTCwgJlZhbHVlKTsKKwkJVmFsdWUgJj0gfigxIDw8IDMpOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIFZhbHVlKTsKKworCQkvLyBBYm9ydCBUeCwgUlggRE1BLgorCQlSdG1wRG1hRW5hYmxlKHBBZCwgMCk7CisKKwkJLy8gRGlzYWJsZSBUeAorCQlSVE1QX0lPX1JFQUQzMihwQWQsIE1BQ19TWVNfQ1RSTCwgJlZhbHVlKTsKKwkJVmFsdWUgJj0gfigxIDw8IDIpOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIFZhbHVlKTsKKworCQkvLyBNYWtlIHN1cmUgdGhlcmUgYXJlIG5vIHBlbmRpbmcgYnVsayBpbi9vdXQgSVJQcyBiZWZvcmUgd2UgZ28gb24uCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCQkvKiBwQWQtPlBlbmRpbmdSeCBpcyBub3Qgb2YgdHlwZSBhdG9taWNfdCBhbnltb3JlIGluIDI4eHggKi8KKy8vCQl3aGlsZSAoKGF0b21pY19yZWFkKCZwQWQtPlBlbmRpbmdSeCkgPiAwKSkJLy9wQWQtPkJ1bGtGbGFncyAhPSAwIHdhaXQgYnVsayBvdXQgZmluaXNoCisJCXdoaWxlICgocEFkLT5QZW5kaW5nUnggPiAwKSkJLy9wQWQtPkJ1bGtGbGFncyAhPSAwIHdhaXQgYnVsayBvdXQgZmluaXNoCisJCXsKKyNpZiAxCisJCQlBVEVfUlRVU0JDYW5jZWxQZW5kaW5nQnVsa0luSVJQKHBBZCk7CisjZWxzZQorCQkJTmRpc0ludGVybG9ja2VkRGVjcmVtZW50KCZwQWQtPlBlbmRpbmdSeCk7CisjZW5kaWYKKwkJCS8qIGRlbGF5IDAuNSBzZWNvbmRzICovCisJCQlSVE1QdXNlY0RlbGF5KDUwMDAwMCk7CisJCQlwQWQtPlBlbmRpbmdSeCA9IDA7CisJCX0KKwkJLyogcGV0ZXIgOiB3aHkgZG9uJ3Qgd2UgaGF2ZSB0byBnZXQgQnVsa091dExvY2sgZmlyc3QgPyAqLworCQl3aGlsZSAoKChwQWQtPkJ1bGtPdXRQZW5kaW5nWzBdID09IFRSVUUpIHx8CisJCQkJKHBBZC0+QnVsa091dFBlbmRpbmdbMV0gPT0gVFJVRSkgfHwKKwkJCQkocEFkLT5CdWxrT3V0UGVuZGluZ1syXSA9PSBUUlVFKSB8fAorCQkJCShwQWQtPkJ1bGtPdXRQZW5kaW5nWzNdID09IFRSVUUpKSAmJiAocEFkLT5CdWxrRmxhZ3MgIT0gMCkpCS8vcEFkLT5CdWxrRmxhZ3MgIT0gMCB3YWl0IGJ1bGsgb3V0IGZpbmlzaAorCQl7CisJCQlkbworCQkJeworCQkJCS8qIHBBZC0+QnVsa091dFBlbmRpbmdbeV0gd2lsbCBiZSBzZXQgdG8gRkFMU0UgaW4gUlRVU0JDYW5jZWxQZW5kaW5nQnVsa091dElSUChwQWQpICovCisJCQkJUlRVU0JDYW5jZWxQZW5kaW5nQnVsa091dElSUChwQWQpOworCQkJfSB3aGlsZSAoRkFMU0UpOworCisJCQkvKiB3ZSBoYXZlIGVub3VnaCB0aW1lIGRlbGF5IGluIFJUVVNCQ2FuY2VsUGVuZGluZ0J1bGtPdXRJUlAocEFkKQorCQkJKiogc28gdGhpcyBpcyBub3QgbmVjZXNzYXJ5CisJCQkqLworLy8JCQlSVE1QdXNlY0RlbGF5KDUwMDAwMCk7CisJCX0KKworCQkvKiBwQWQtPlBlbmRpbmdSeCBpcyBub3Qgb2YgdHlwZSBhdG9taWNfdCBhbnltb3JlIGluIDI4eHggKi8KKy8vCQlBU1NFUlQoYXRvbWljX3JlYWQoJnBBZC0+UGVuZGluZ1J4KSA9PSAwKTsKKwkJQVNTRVJUKHBBZC0+UGVuZGluZ1J4ID09IDApOworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCQkvLyByZXNldCBSeCBzdGF0aXN0aWNzLgorCQlwQWQtPmF0ZS5MYXN0U05SMCA9IDA7CisJCXBBZC0+YXRlLkxhc3RTTlIxID0gMDsKKwkJcEFkLT5hdGUuTGFzdFJzc2kwID0gMDsKKwkJcEFkLT5hdGUuTGFzdFJzc2kxID0gMDsKKwkJcEFkLT5hdGUuTGFzdFJzc2kyID0gMDsKKwkJcEFkLT5hdGUuQXZnUnNzaTAgPSAwOworCQlwQWQtPmF0ZS5BdmdSc3NpMSA9IDA7CisJCXBBZC0+YXRlLkF2Z1Jzc2kyID0gMDsKKwkJcEFkLT5hdGUuQXZnUnNzaTBYOCA9IDA7CisJCXBBZC0+YXRlLkF2Z1Jzc2kxWDggPSAwOworCQlwQWQtPmF0ZS5BdmdSc3NpMlg4ID0gMDsKKwkJcEFkLT5hdGUuTnVtT2ZBdmdSc3NpU2FtcGxlID0gMDsKKworI2lmZGVmIFJBTElOS18yOHh4X1FBCisJCS8vIFR4IGZyYW1lCisJCXBBZC0+YXRlLmJRQVR4U3RhcnQgPSBGQUxTRTsKKwkJcEFkLT5hdGUuYlFBUnhTdGFydCA9IEZBTFNFOworCQlwQWQtPmF0ZS5zZXEgPSAwOworCisJCS8vIGNvdW50ZXJzCisJCXBBZC0+YXRlLlUyTSA9IDA7CisJCXBBZC0+YXRlLk90aGVyRGF0YSA9IDA7CisJCXBBZC0+YXRlLkJlYWNvbiA9IDA7CisJCXBBZC0+YXRlLk90aGVyQ291bnQgPSAwOworCQlwQWQtPmF0ZS5UeEFjMCA9IDA7CisJCXBBZC0+YXRlLlR4QWMxID0gMDsKKwkJcEFkLT5hdGUuVHhBYzIgPSAwOworCQlwQWQtPmF0ZS5UeEFjMyA9IDA7CisJCXBBZC0+YXRlLlR4SENDQSA9IDA7CisJCXBBZC0+YXRlLlR4TWdtdCA9IDA7CisJCXBBZC0+YXRlLlJTU0kwID0gMDsKKwkJcEFkLT5hdGUuUlNTSTEgPSAwOworCQlwQWQtPmF0ZS5SU1NJMiA9IDA7CisJCXBBZC0+YXRlLlNOUjAgPSAwOworCQlwQWQtPmF0ZS5TTlIxID0gMDsKKworCQkvLyBjb250cm9sCisJCXBBZC0+YXRlLlR4RG9uZUNvdW50ID0gMDsKKwkJcEFkLT5hdGUuVHhTdGF0dXMgPSAwOyAvLyB0YXNrIFR4IHN0YXR1cyAvLyAwIC0tPiB0YXNrIGlzIGlkbGUsIDEgLS0+IHRhc2sgaXMgcnVubmluZworI2VuZGlmIC8vIFJBTElOS18yOHh4X1FBIC8vCisKKwkJLy8gU29mdCByZXNldCBCQlAuCisJCUJicFNvZnRSZXNldChwQWQpOworCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJQXNpY0Rpc2FibGVTeW5jKHBBZCk7CisKKwkJLyoKKwkJKiogSWYgd2Ugc2tpcCAiTGlua0Rvd24oKSIsIHdlIHNob3VsZCBkaXNhYmxlIHByb3RlY3Rpb24KKwkJKiogdG8gcHJldmVudCBmcm9tIHNlbmRpbmcgb3V0IFJUUyBvciBDVFMtdG8tc2VsZi4KKwkJKi8KKwkJQVRFRGlzYWJsZUFzaWNQcm90ZWN0KHBBZCk7CisJCVJUTVBTdGF0aW9uU3RvcChwQWQpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJCS8vIERlZmF1bHQgdmFsdWUgaW4gQkJQIFIyMiBpcyAweDAuCisJCUJicERhdGEgPSAwOworCQlSVE1QX0lPX1JFQUQzMihwQWQsIE1BQ19TWVNfQ1RSTCwgJk1hY0RhdGEpOworCisJCS8vIENsZWFuIGJpdDQgdG8gc3RvcCBjb250aW51b3VzIFR4IHByb2R1Y3Rpb24gdGVzdC4KKwkJTWFjRGF0YSAmPSAweEZGRkZGRkVGOworCSAgIAlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjIyLCBCYnBEYXRhKTsKKwkgICAgCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgTWFjRGF0YSk7CisJCS8vQ2xlYW4gQVRFIEJ1bGsgaW4vb3V0IGNvdW50ZXIgYW5kIGNvbnRpbnVlIHNldHVwCisJCUludGVybG9ja2VkRXhjaGFuZ2UoJnBBZC0+QnVsa091dFJlbWFpbmVkLCAwKTsKKworCQkvKiBOZGlzQWNxdWlyZVNwaW5Mb2NrKCkvTmRpc1JlbGVhc2VTcGluTG9jaygpIG5lZWQgb25seSBvbmUgYXJndW1lbnQgaW4gUlQyOHh4ICovCisJCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+R2VuZXJpY0xvY2spOworCQlwQWQtPkNvbnRpbkJ1bGtPdXQgPSBGQUxTRTsKKwkJcEFkLT5Db250aW5CdWxrSW4gPSBGQUxTRTsKKwkJTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5HZW5lcmljTG9jayk7CisKKwkJUlRVU0JfQ0xFQVJfQlVMS19GTEFHKHBBZCwgZlJUVVNCX0JVTEtfT1VUX0RBVEFfQVRFKTsKKwl9CisJZWxzZSBpZiAoIXN0cmNtcChhcmcsICJBVEVTVE9QIikpCisJeworCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBVEUgOiBBVEVTVE9QID09PT5cbiIpKTsKKworCQkvLyBEZWZhdWx0IHZhbHVlIGluIEJCUCBSMjIgaXMgMHgwLgorCQlCYnBEYXRhID0gMDsKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBNQUNfU1lTX0NUUkwsICZNYWNEYXRhKTsvLzA4MjAKKwkJLy8gQ2xlYW4gYml0NCB0byBzdG9wIGNvbnRpbnVvdXMgVHggcHJvZHVjdGlvbiB0ZXN0LgorCQlNYWNEYXRhICY9IDB4RkZGRkZGRUY7CisJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMjIsIEJicERhdGEpOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIE1hY0RhdGEpOyAvLyByZWNvdmVyIHRoZSBNQUNfU1lTX0NUUkwgcmVnaXN0ZXIgYmFjay4KKworCQkvLyBEaXNhYmxlIFJ4CisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgTUFDX1NZU19DVFJMLCAmVmFsdWUpOworCQlWYWx1ZSAmPSB+KDEgPDwgMyk7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgVmFsdWUpOworCisJCS8qCisJCSoqIEFib3J0IFR4LCBSWCBETUEuCisJCSoqIFEgICA6IEhvdyB0byBkbyB0aGUgZm9sbG93aW5nIEkvTyBpZiBUeCwgUnggRE1BIGlzIGFib3J0ZWQgPworCQkqKiBBbnMgOiBCdWxrIGVuZHBvaW50cyBhcmUgYWJvcnRlZCwgd2hpbGUgdGhlIGNvbnRyb2wgZW5kcG9pbnQgaXMgbm90LgorCQkqLworCQlSdG1wRG1hRW5hYmxlKHBBZCwgMCk7CisKKwkJLy8gRGlzYWJsZSBUeAorCQlSVE1QX0lPX1JFQUQzMihwQWQsIE1BQ19TWVNfQ1RSTCwgJlZhbHVlKTsKKwkJVmFsdWUgJj0gfigxIDw8IDIpOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIFZhbHVlKTsKKworCQkvKiBNYWtlIHN1cmUgdGhlcmUgYXJlIG5vIHBlbmRpbmcgYnVsayBpbi9vdXQgSVJQcyBiZWZvcmUgd2UgZ28gb24uICovCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworLy8JCXdoaWxlICgoYXRvbWljX3JlYWQoJnBBZC0+UGVuZGluZ1J4KSA+IDApKQkvL3BBZC0+QnVsa0ZsYWdzICE9IDAgd2FpdCBidWxrIG91dCBmaW5pc2gKKwkJd2hpbGUgKHBBZC0+UGVuZGluZ1J4ID4gMCkKKwkJeworI2lmIDEKKwkJCUFURV9SVFVTQkNhbmNlbFBlbmRpbmdCdWxrSW5JUlAocEFkKTsKKyNlbHNlCisvLwkJCU5kaXNJbnRlcmxvY2tlZERlY3JlbWVudCgmcEFkLT5QZW5kaW5nUngpOworCQkJcEFkLT5QZW5kaW5nUngtLTsKKyNlbmRpZgorCQkJUlRNUHVzZWNEZWxheSg1MDAwMDApOworCQl9CisKKwkJd2hpbGUgKCgocEFkLT5CdWxrT3V0UGVuZGluZ1swXSA9PSBUUlVFKSB8fAorCQkJCShwQWQtPkJ1bGtPdXRQZW5kaW5nWzFdID09IFRSVUUpIHx8CisJCQkJKHBBZC0+QnVsa091dFBlbmRpbmdbMl0gPT0gVFJVRSkgfHwKKwkJCQkocEFkLT5CdWxrT3V0UGVuZGluZ1szXSA9PSBUUlVFKSkgJiYgKHBBZC0+QnVsa0ZsYWdzICE9IDApKQkvL3BBZC0+QnVsa0ZsYWdzICE9IDAgd2FpdCBidWxrIG91dCBmaW5pc2gKKwkJeworCQkJZG8KKwkJCXsKKwkJCQlSVFVTQkNhbmNlbFBlbmRpbmdCdWxrT3V0SVJQKHBBZCk7CisJCQl9IHdoaWxlIChGQUxTRSk7CisKKwkJCVJUTVB1c2VjRGVsYXkoNTAwMDAwKTsKKwkJfQorCisvLwkJQVNTRVJUKGF0b21pY19yZWFkKCZwQWQtPlBlbmRpbmdSeCkgPT0gMCk7CisJCUFTU0VSVChwQWQtPlBlbmRpbmdSeCA9PSAwKTsKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisvKiAgICAgIFJlc2V0IFJ4IFJJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKy8vCQlJbnRlcmxvY2tlZEV4Y2hhbmdlKCZwQWQtPlBlbmRpbmdSeCwgMCk7CisJCXBBZC0+UGVuZGluZ1J4ID0gMDsKKwkJcEFkLT5OZXh0UnhCdWxrSW5SZWFkSW5kZXggPSAwOwkvLyBOZXh0IFJ4IFJlYWQgaW5kZXgKKwkJcEFkLT5OZXh0UnhCdWxrSW5JbmRleCA9IFJYX1JJTkdfU0laRSAtIDE7CS8vIFJ4IEJ1bGsgcG9pbnRlcgorCQlwQWQtPk5leHRSeEJ1bGtJblBvc2l0aW9uID0gMDsKKwkJZm9yIChpID0gMDsgaSA8IChSWF9SSU5HX1NJWkUpOyBpKyspCisJCXsKKwkJCVBSWF9DT05URVhUICBwUnhDb250ZXh0ID0gJihwQWQtPlJ4Q29udGV4dFtpXSk7CisJCQlOZGlzWmVyb01lbW9yeShwUnhDb250ZXh0LT5UcmFuc2ZlckJ1ZmZlciwgTUFYX1JYQlVMS19TSVpFKTsKKwkJCS8qIHBldGVyIDogd2h5IGRvbid0IHdlIGhhdmUgdG8gZ2V0IEJ1bGtJbkxvY2sgZmlyc3QgPyAqLworCQkJcFJ4Q29udGV4dC0+cEFkCT0gcEFkOworCQkJcFJ4Q29udGV4dC0+cElycCA9IE5VTEw7CisgICAgICAgICAgICAvKiBwZXRlciBkZWJ1ZyArKyAqLworCQkJcFJ4Q29udGV4dC0+QnVsa0luT2Zmc2V0ID0gMDsKKwkJCXBSeENvbnRleHQtPmJSeEhhbmRsaW5nID0gRkFMU0U7CisgICAgICAgICAgICAvKiBwZXRlciBkZWJ1ZyAtLSAqLworCQkJcFJ4Q29udGV4dC0+SW5Vc2UJCT0gRkFMU0U7CisJCQlwUnhDb250ZXh0LT5JUlBQZW5kaW5nCT0gRkFMU0U7CisJCQlwUnhDb250ZXh0LT5SZWFkYWJsZQk9IEZBTFNFOworLy8JCQlwUnhDb250ZXh0LT5SZW9yZGVySW5Vc2UgPSBGQUxTRTsKKy8vCQkJcFJ4Q29udGV4dC0+UmVhZFBvc09mZnNldCA9IDA7CisJCX0KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKy8qICAgICAgUmVzZXQgVHggUklORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCQlkbworCQl7CisJCQlSVFVTQkNhbmNlbFBlbmRpbmdCdWxrT3V0SVJQKHBBZCk7CisJCX0gd2hpbGUgKEZBTFNFKTsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKwkJLy8gRW5hYmxlIGF1dG8gcmVzcG9uZGVyLgorCQlSVE1QX0lPX1JFQUQzMihwQWQsIEFVVE9fUlNQX0NGRywgJnRlbXApOworCQl0ZW1wID0gdGVtcCB8ICgweDAxKTsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgQVVUT19SU1BfQ0ZHLCB0ZW1wKTsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCQlBc2ljRW5hYmxlQnNzU3luYyhwQWQpOworCisJCS8qIFNvZnQgcmVzZXQgQkJQLiovCisJCS8qIEluIDI4NzAgY2hpcHNldCwgQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQoKSA9PSBSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQoKSAqLworCQkvKiBCb3RoIHJ0Mjg3MGFwIGFuZCBydDI4NzBzdGEgdXNlIEJicFNvZnRSZXNldChwQWQpIHRvIGRvIEJCUCBzb2Z0IHJlc2V0ICovCisJCUJicFNvZnRSZXNldChwQWQpOworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCQl7CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCQkvLyBTZXQgYWxsIHN0YXRlIG1hY2hpbmVzIGJhY2sgSURMRQorCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSAgICA9IENOVExfSURMRTsKKwkJCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlICAgPSBBU1NPQ19JRExFOworCQkJcEFkLT5NbG1lLkF1dGhNYWNoaW5lLkN1cnJTdGF0ZSAgICA9IEFVVEhfUkVRX0lETEU7CisJCQlwQWQtPk1sbWUuQXV0aFJzcE1hY2hpbmUuQ3VyclN0YXRlID0gQVVUSF9SU1BfSURMRTsKKwkJCXBBZC0+TWxtZS5TeW5jTWFjaGluZS5DdXJyU3RhdGUgICAgPSBTWU5DX0lETEU7CisJCQlwQWQtPk1sbWUuQWN0TWFjaGluZS5DdXJyU3RhdGUgICAgPSBBQ1RfSURMRTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCQkJLy8KKwkJCS8vID09PT4gcmVmZXIgdG8gTWxtZVJlc3RhcnRTdGF0ZU1hY2hpbmUoKS4KKwkJCS8vIFdoZW4gd2UgZW50ZXJlZCBBVEVfU1RBUlQgbW9kZSwgUGVyaW9kaWNUaW1lciB3YXMgbm90IGNhbmNlbGxlZC4KKwkJCS8vIFNvIHdlIGRvbid0IGhhdmUgdG8gc2V0IGl0IGhlcmUuCisJCQkvLworCQkJLy9SVE1QU2V0VGltZXIocEFkLCAmcEFkLT5NbG1lLlBlcmlvZGljVGltZXIsIE1MTUVfVEFTS19FWEVDX0lOVFYpOworCisJCQlBU1NFUlQocEFkLT5Db21tb25DZmcuQ2hhbm5lbCAhPSAwKTsKKworCQkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsLCBGQUxTRSk7CisJCQlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKTsKKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCSAgICBSVE1QU3RhdGlvblN0YXJ0KHBBZCk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJCX0KKy8vCisvLyBUaGVzZSB0d28gc3RlcHMgaGF2ZSBiZWVuIGRvbmUgd2hlbiBlbnRlcmluZyBBVEVfU1RPUCBtb2RlLgorLy8KKyNpZiAwCisJICAgIFJUVVNCV3JpdGVCQlBSZWdpc3RlcihwQWQsIEJCUF9SMjIsIEJicERhdGEpOworCSAgIAlSVFVTQldyaXRlTUFDUmVnaXN0ZXIocEFkLCBNQUNfU1lTX0NUUkwsIE1hY0RhdGEpOworI2VuZGlmCisJCS8vIENsZWFuIEFURSBCdWxrIGluL291dCBjb3VudGVyIGFuZCBjb250aW51ZSBzZXR1cC4KKwkJSW50ZXJsb2NrZWRFeGNoYW5nZSgmcEFkLT5CdWxrT3V0UmVtYWluZWQsIDApOworCQlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPkdlbmVyaWNMb2NrKTsKKwkJcEFkLT5Db250aW5CdWxrT3V0ID0gRkFMU0U7CisJCXBBZC0+Q29udGluQnVsa0luID0gRkFMU0U7CisJCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+R2VuZXJpY0xvY2spOworCisJCS8qIFdhaXQgNTBtcyB0byBwcmV2ZW50IG5leHQgVVJCIHRvIGJ1bGtvdXQgZHVyaW5nIEhXIHJlc2V0LiAqLworCQkvKiB0b2RvIDogcmVtb3ZlIHRoaXMgaWYgbm90IG5lY2Vzc2FyeSAqLworCQlOZGlzTVNsZWVwKDUwMDAwKTsKKworCQlwQWQtPmF0ZS5Nb2RlID0gQVRFX1NUT1A7CisKKwkJLy8gRW5hYmxlIFR4CisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgTUFDX1NZU19DVFJMLCAmVmFsdWUpOworCQlWYWx1ZSB8PSAoMSA8PCAyKTsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCBWYWx1ZSk7CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisJCS8qIHJlc3RvcmUgUlhfRklMVFJfQ0ZHICovCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCS8qIHJlc3RvcmUgUlhfRklMVFJfQ0ZHIGluIG9yZGVyIHRoYXQgUUEgbWF5YmUgc2V0IGl0IHRvIDB4MyAqLworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBSWF9GSUxUUl9DRkcsIFNUQU5PUk1BTCk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisJCS8vIEVuYWJsZSBUeCwgUlggRE1BLgorCQlSdG1wRG1hRW5hYmxlKHBBZCwgMSk7CisKKwkJLy8gRW5hYmxlIFJ4CisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgTUFDX1NZU19DVFJMLCAmVmFsdWUpOworCQlWYWx1ZSB8PSAoMSA8PCAzKTsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCBWYWx1ZSk7CisKKwkJLy8gV2FpdCAxMG1zIHRvIHdhaXQgYWxsIG9mIHRoZSBidWxrLWluIFVSQnMgdG8gY29tcGxldGUuCisJCS8qIHRvZG8gOiByZW1vdmUgdGhpcyBpZiBub3QgbmVjZXNzYXJ5ICovCisJCU5kaXNNU2xlZXAoMTAwMDApOworCisJCS8vIEV2ZXJ5dGhpbmcgaXMgcmVhZHkgdG8gc3RhcnQgbm9ybWFsIFR4L1J4LgorCQlSVFVTQkJ1bGtSZWNlaXZlKHBBZCk7CisJCW5ldGlmX3N0YXJ0X3F1ZXVlKHBBZC0+bmV0X2Rldik7CisKKwkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPD09PSBBVEUgOiBBVEVTVE9QIFxuIikpOworCX0KKwllbHNlIGlmICghc3RyY21wKGFyZywgIlRYQ0FSUiIpKQkvLyBUeCBDYXJyaWVyCisJeworCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBVEU6IFRYQ0FSUlxuIikpOworCQlwQWQtPmF0ZS5Nb2RlIHw9IEFURV9UWENBUlI7CisKKwkJLy8gRGlzYWJsZSBSeAorCQkvLyBNYXkgYmUgd2UgbmVlZCBub3QgdG8gZG8gdGhpcywgYmVjYXVzZSB0aGVzZSBoYXZlIGJlZW4gZG9uZSBpbiBBVEVfU1RBUlQgbW9kZSA/Pz8KKwkJUlRNUF9JT19SRUFEMzIocEFkLCBNQUNfU1lTX0NUUkwsICZWYWx1ZSk7CisJCVZhbHVlICY9IH4oMSA8PCAzKTsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCBWYWx1ZSk7CisKKwkJLy8gUUEgaGFzIGRvbmUgdGhlIGZvbGxvd2luZyBzdGVwcyBpZiBpdCBpcyB1c2VkLgorCQlpZiAocEFkLT5hdGUuYlFBVHhTdGFydCA9PSBGQUxTRSkKKwkJeworCQkJLy8gU29mdCByZXNldCBCQlAuCisJCQlCYnBTb2Z0UmVzZXQocEFkKTsKKworCQkJLy8gQ2FycmllciBUZXN0IHNldCBCQlAgUjIyIGJpdDc9MSwgYml0Nj0xLCBiaXRbNX4wXT0weDAxCisJCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMjIsICZCYnBEYXRhKTsKKwkJCUJicERhdGEgJj0gMHhGRkZGRkYwMDsgLy9jbGVhciBiaXQ3LCBiaXQ2LCBiaXRbNX4wXQorCQkJQmJwRGF0YSB8PSAweDAwMDAwMEMxOyAvL3NldCBiaXQ3PTEsIGJpdDY9MSwgYml0WzV+MF09MHgwMQorCQkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IyMiwgQmJwRGF0YSk7CisKKwkJCS8vIHNldCBNQUNfU1lTX0NUUkwoMHgxMDA0KSBDb250aW51b3VzIFR4IFByb2R1Y3Rpb24gVGVzdCAoYml0NCkgPSAxCisJCQlSVE1QX0lPX1JFQUQzMihwQWQsIE1BQ19TWVNfQ1RSTCwgJlZhbHVlKTsKKwkJCVZhbHVlID0gVmFsdWUgfCAweDAwMDAwMDEwOworCQkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCBWYWx1ZSk7CisJCX0KKwl9CisJZWxzZSBpZiAoIXN0cmNtcChhcmcsICJUWENPTlQiKSkJLy8gVHggQ29udGludWUKKwl7CisJCWlmIChwQWQtPmF0ZS5iUUFUeFN0YXJ0ID09IFRSVUUpCisJCXsKKwkJCS8qIHNldCBNQUNfU1lTX0NUUkwoMHgxMDA0KSBiaXQ0KENvbnRpbnVvdXMgVHggUHJvZHVjdGlvbiBUZXN0KQorCQkJICAgYW5kIGJpdDIoTUFDIFRYIGVuYWJsZSkgYmFjayB0byB6ZXJvLiAqLworCQkJUlRNUF9JT19SRUFEMzIocEFkLCBNQUNfU1lTX0NUUkwsICZNYWNEYXRhKTsKKwkJCU1hY0RhdGEgJj0gMHhGRkZGRkZFQjsKKwkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgTWFjRGF0YSk7CisKKwkJCS8vIHNldCBCQlAgUjIyIGJpdDc9MAorCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjIyLCAmQmJwRGF0YSk7CisJCQlCYnBEYXRhICY9IDB4RkZGRkZGN0Y7IC8vc2V0IGJpdDc9MAorCQkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IyMiwgQmJwRGF0YSk7CisJCX0KKworCQkvKiBmb3IgVHhDb250IG1vZGUuCisJCSoqIFN0ZXAgMTogU2VuZCA1MCBwYWNrZXRzIGZpcnN0IHRoZW4gd2FpdCBmb3IgYSBtb21lbnQuCisJCSoqIFN0ZXAgMjogU2VuZCBtb3JlIDUwIHBhY2tldCB0aGVuIHN0YXJ0IGNvbnRpbnVlIG1vZGUuCisJCSovCisJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFURTogVFhDT05UXG4iKSk7CisJCS8vIFN0ZXAgMTogc2VuZCA1MCBwYWNrZXRzIGZpcnN0LgorCQlwQWQtPmF0ZS5Nb2RlIHw9IEFURV9UWENPTlQ7CisJCXBBZC0+YXRlLlR4Q291bnQgPSA1MDsKKwkJcEFkLT5hdGUuVHhEb25lQ291bnQgPSAwOworCisJCS8vIFNvZnQgcmVzZXQgQkJQLgorCQlCYnBTb2Z0UmVzZXQocEFkKTsKKworCQkvLyBBYm9ydCBUeCwgUlggRE1BLgorCQlSdG1wRG1hRW5hYmxlKHBBZCwgMCk7CisKKworCQkvKiBPbmx5IG5lZWRlZCBpZiB3ZSBoYXZlIHRvIHNlbmQgc29tZSBub3JtYWwgZnJhbWVzLiAqLworCQlTZXRKYXBhbkZpbHRlcihwQWQpOworCisJCS8vIFNldHVwIGZyYW1lIGZvcm1hdC4KKwkJQVRFU2V0VXBGcmFtZShwQWQsIDApOworCisJCS8vIEVuYWJsZSBUeAorCQlSVE1QX0lPX1JFQUQzMihwQWQsIE1BQ19TWVNfQ1RSTCwgJlZhbHVlKTsKKwkJVmFsdWUgfD0gKDEgPDwgMik7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgVmFsdWUpOworCisJCS8vIERpc2FibGUgUngKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBNQUNfU1lTX0NUUkwsICZWYWx1ZSk7CisJCVZhbHVlICY9IH4oMSA8PCAzKTsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCBWYWx1ZSk7CisKKwkJLy8gU3RhcnQgVHgsIFJYIERNQS4KKwkJUnRtcERtYUVuYWJsZShwQWQsIDEpOworCisJCUludGVybG9ja2VkRXhjaGFuZ2UoJnBBZC0+QnVsa091dFJlbWFpbmVkLCBwQWQtPmF0ZS5UeENvdW50KTsKKworI2lmZGVmCVJBTElOS18yOHh4X1FBCisJCWlmIChwQWQtPmF0ZS5iUUFUeFN0YXJ0ID09IFRSVUUpCisJCXsKKwkJCXBBZC0+YXRlLlR4U3RhdHVzID0gMTsKKwkJCS8vcEFkLT5hdGUuUmVwZWF0ID0gMDsKKwkJfQorI2VuZGlmCS8vIFJBTElOS18yOHh4X1FBIC8vCisKKwkJTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5HZW5lcmljTG9jayk7Ly8wODIwCisJCXBBZC0+Q29udGluQnVsa091dCA9IEZBTFNFOworCQlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPkdlbmVyaWNMb2NrKTsKKworCQlSVFVTQl9TRVRfQlVMS19GTEFHKHBBZCwgZlJUVVNCX0JVTEtfT1VUX0RBVEFfQVRFKTsKKworCQkvLyBLaWNrIGJ1bGsgb3V0CisJCVJUVVNCS2lja0J1bGtPdXQocEFkKTsKKworCQkvKiBUbyBtYWtlIHN1cmUgYWxsIHRoZSA1MCBmcmFtZXMgaGF2ZSBiZWVuIGJ1bGsgb3V0IGJlZm9yZSBleGVjdXRpbmcgc3RlcCAyICovCisJCXdoaWxlIChhdG9taWNfcmVhZCgmcEFkLT5CdWxrT3V0UmVtYWluZWQpID4gMCkKKwkJeworCQkJUlRNUHVzZWNEZWxheSg1MDAwKTsKKwkJfQorCisJCS8vIFN0ZXAgMjogc2VuZCBtb3JlIDUwIHBhY2tldHMgdGhlbiBzdGFydCBjb250aW51ZSBtb2RlLgorCQkvLyBBYm9ydCBUeCwgUlggRE1BLgorCQlSdG1wRG1hRW5hYmxlKHBBZCwgMCk7CisKKwkJLy8gQ29udC4gVFggc2V0IEJCUCBSMjIgYml0Nz0xCisJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IyMiwgJkJicERhdGEpOworCQlCYnBEYXRhIHw9IDB4MDAwMDAwODA7IC8vc2V0IGJpdDc9MQorCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjIyLCBCYnBEYXRhKTsKKworCQlwQWQtPmF0ZS5UeENvdW50ID0gNTA7CisJCXBBZC0+YXRlLlR4RG9uZUNvdW50ID0gMDsKKworCQlTZXRKYXBhbkZpbHRlcihwQWQpOworCisJCS8vIFNldHVwIGZyYW1lIGZvcm1hdC4KKwkJQVRFU2V0VXBGcmFtZShwQWQsIDApOworCisJCS8vIEVuYWJsZSBUeAorCQlSVE1QX0lPX1JFQUQzMihwQWQsIE1BQ19TWVNfQ1RSTCwgJlZhbHVlKTsKKwkJVmFsdWUgfD0gKDEgPDwgMik7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgVmFsdWUpOworCisJCS8vIERpc2FibGUgUngKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBNQUNfU1lTX0NUUkwsICZWYWx1ZSk7CisJCVZhbHVlICY9IH4oMSA8PCAzKTsKKworCQkvLyBTdGFydCBUeCwgUlggRE1BLgorCQlSdG1wRG1hRW5hYmxlKHBBZCwgMSk7CisKKwkJSW50ZXJsb2NrZWRFeGNoYW5nZSgmcEFkLT5CdWxrT3V0UmVtYWluZWQsIHBBZC0+YXRlLlR4Q291bnQpOworCisjaWZkZWYJUkFMSU5LXzI4eHhfUUEKKwkJaWYgKHBBZC0+YXRlLmJRQVR4U3RhcnQgPT0gVFJVRSkKKwkJeworCQkJcEFkLT5hdGUuVHhTdGF0dXMgPSAxOworCQkJLy9wQWQtPmF0ZS5SZXBlYXQgPSAwOworCQl9CisjZW5kaWYJLy8gUkFMSU5LXzI4eHhfUUEgLy8KKworCQlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPkdlbmVyaWNMb2NrKTsvLzA4MjAKKwkJcEFkLT5Db250aW5CdWxrT3V0ID0gRkFMU0U7CisJCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+R2VuZXJpY0xvY2spOworCisJCVJUVVNCX1NFVF9CVUxLX0ZMQUcocEFkLCBmUlRVU0JfQlVMS19PVVRfREFUQV9BVEUpOworCQkvLyBLaWNrIGJ1bGsgb3V0CisJCVJUVVNCS2lja0J1bGtPdXQocEFkKTsKKworI2lmIDEKKwkJUlRNUHVzZWNEZWxheSg1MDApOworI2Vsc2UKKwkJd2hpbGUgKGF0b21pY19yZWFkKCZwQWQtPkJ1bGtPdXRSZW1haW5lZCkgPiAwKQorCQl7CisJCQlSVE1QdXNlY0RlbGF5KDUwMDApOworCQl9CisjZW5kaWYgLy8gMSAvLworCisJCS8vIFNldCBNQUNfU1lTX0NUUkwoMHgxMDA0KSBDb250aW51b3VzIFR4IFByb2R1Y3Rpb24gVGVzdCAoYml0NCkgPSAxLgorCQlSVE1QX0lPX1JFQUQzMihwQWQsIE1BQ19TWVNfQ1RSTCwgJk1hY0RhdGEpOworCQlNYWNEYXRhIHw9IDB4MDAwMDAwMTA7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgTWFjRGF0YSk7CisJfQorCWVsc2UgaWYgKCFzdHJjbXAoYXJnLCAiVFhGUkFNRSIpKQkvLyBUeCBGcmFtZXMKKwl7CisJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFURTogVFhGUkFNRShDb3VudD0weCUwOHgpXG4iLCBwQWQtPmF0ZS5UeENvdW50KSk7CisJCXBBZC0+YXRlLk1vZGUgfD0gQVRFX1RYRlJBTUU7CisKKwkJLy8gU29mdCByZXNldCBCQlAuCisJCUJicFNvZnRSZXNldChwQWQpOworCisJCS8vIERlZmF1bHQgdmFsdWUgaW4gQkJQIFIyMiBpcyAweDAuCisJCUJicERhdGEgPSAwOworCisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgTUFDX1NZU19DVFJMLCAmTWFjRGF0YSk7CisKKwkJLy8gQ2xlYW4gYml0NCB0byBzdG9wIGNvbnRpbnVvdXMgVHggcHJvZHVjdGlvbiB0ZXN0LgorCQlNYWNEYXRhICY9IDB4RkZGRkZGRUY7CisKKwkgICAJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IyMiwgQmJwRGF0YSk7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgTWFjRGF0YSk7CisKKyNpZmRlZiBSQUxJTktfMjh4eF9RQQorCQkvLyBhZGQgdGhpcyBmb3IgTG9vcEJhY2sgbW9kZQorCQlpZiAocEFkLT5hdGUuYlFBUnhTdGFydCA9PSBGQUxTRSkKKwkJeworCQkJLy8gRGlzYWJsZSBSeAorCQkJUlRNUF9JT19SRUFEMzIocEFkLCBNQUNfU1lTX0NUUkwsICZWYWx1ZSk7CisJCQlWYWx1ZSAmPSB+KDEgPDwgMyk7CisJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIFZhbHVlKTsKKwkJfQorCisJCWlmIChwQWQtPmF0ZS5iUUFUeFN0YXJ0ID09IFRSVUUpCisJCXsKKwkJCXBBZC0+YXRlLlR4U3RhdHVzID0gMTsKKwkJCS8vcEFkLT5hdGUuUmVwZWF0ID0gMDsKKwkJfQorI2Vsc2UKKwkJLy8gRGlzYWJsZSBSeAorCQlSVE1QX0lPX1JFQUQzMihwQWQsIE1BQ19TWVNfQ1RSTCwgJlZhbHVlKTsKKwkJVmFsdWUgJj0gfigxIDw8IDMpOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIFZhbHVlKTsKKyNlbmRpZiAvLyBSQUxJTktfMjh4eF9RQSAvLworCisJCS8vIEVuYWJsZSBUeAorCQlSVE1QX0lPX1JFQUQzMihwQWQsIE1BQ19TWVNfQ1RSTCwgJlZhbHVlKTsKKwkJVmFsdWUgfD0gKDEgPDwgMik7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgVmFsdWUpOworCisgICAgICAgIFNldEphcGFuRmlsdGVyKHBBZCk7CisKKwkJLy8gQWJvcnQgVHgsIFJYIERNQS4KKwkJUnRtcERtYUVuYWJsZShwQWQsIDApOworCisJCXBBZC0+YXRlLlR4RG9uZUNvdW50ID0gMDsKKworICAgICAgICAvLyBTZXR1cCBmcmFtZSBmb3JtYXQKKwkJQVRFU2V0VXBGcmFtZShwQWQsIDApOworCisJCS8vIFN0YXJ0IFR4LCBSWCBETUEuCisJCVJ0bXBEbWFFbmFibGUocEFkLCAxKTsKKworCQkvLyBDaGVjayBjb3VudCBpcyBjb250aW51b3VzIG9yIG5vdCB5ZXQuCisJCS8vCisJCS8vIER1ZSB0byB0aGUgdHlwZSBtaXNtYXRjaCBiZXR3ZWVuICJwQWQtPkJ1bGtPdXRSZW1haW5lZCIoYXRvbWljX3QpIGFuZCAicEFkLT5hdGUuVHhDb3VudCIoVUlOVDMyKQorCQkvLworCQlpZiAocEFkLT5hdGUuVHhDb3VudCA9PSAwKQorCQl7CisJCQlJbnRlcmxvY2tlZEV4Y2hhbmdlKCZwQWQtPkJ1bGtPdXRSZW1haW5lZCwgMCk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlJbnRlcmxvY2tlZEV4Y2hhbmdlKCZwQWQtPkJ1bGtPdXRSZW1haW5lZCwgcEFkLT5hdGUuVHhDb3VudCk7CisJCX0KKwkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiYnVsayBvdXQgY291bnQgPSAlZFxuIiwgYXRvbWljX3JlYWQoJnBBZC0+QnVsa091dFJlbWFpbmVkKSkpOworCQlBU1NFUlQoKGF0b21pY19yZWFkKCZwQWQtPkJ1bGtPdXRSZW1haW5lZCkgPj0gMCkpOworCisJCWlmIChhdG9taWNfcmVhZCgmcEFkLT5CdWxrT3V0UmVtYWluZWQpID09IDApCisJCXsKKwkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNlbmQgcGFja2V0IGNvdW50aW51b3VzbHlcbiIpKTsKKworCQkJLyogSW4gMjh4eCwgTmRpc0FjcXVpcmVTcGluTG9jaygpID09IHNwaW5fbG9ja19iaCgpICovCisJCQkvKiBOZGlzQWNxdWlyZVNwaW5Mb2NrIG9ubHkgbmVlZCBvbmUgYXJndW1lbnQgaW4gMjh4eC4gKi8KKwkJCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+R2VuZXJpY0xvY2spOworCQkJcEFkLT5Db250aW5CdWxrT3V0ID0gVFJVRTsKKwkJCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+R2VuZXJpY0xvY2spOworCisJCQkvKiBJbiAyOHh4LCBCVUxLX09VVF9MT0NLKCkgPT0gc3Bpbl9sb2NrX2lycXNhdmUoKSAqLworCQkJQlVMS19PVVRfTE9DSygmcEFkLT5CdWxrT3V0TG9ja1swXSwgSXJxRmxhZ3MpOy8vIHBldGVyIDogTmRpc0FjcXVpcmVTcGluTG9jayA9PT4gQlVMS19PVVRfTE9DSworCQkJcEFkLT5CdWxrT3V0UGVuZGluZ1swXSA9IEZBTFNFOworCQkJQlVMS19PVVRfVU5MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrWzBdLCBJcnFGbGFncyk7Ly8gcGV0ZXIgOiBOZGlzQWNxdWlyZVNwaW5Mb2NrID09PiBCVUxLX09VVF9MT0NLCisJCX0KKwkJZWxzZQorCQl7CisJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZW5kIHBhY2tldHMgZGVwZW5kIG9uIGNvdW50ZXJcbiIpKTsKKworCQkJTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5HZW5lcmljTG9jayk7CisJCQlwQWQtPkNvbnRpbkJ1bGtPdXQgPSBGQUxTRTsKKwkJCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+R2VuZXJpY0xvY2spOworCisJCQlCVUxLX09VVF9MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrWzBdLCBJcnFGbGFncyk7CisJCQlwQWQtPkJ1bGtPdXRQZW5kaW5nWzBdID0gRkFMU0U7CisJCQlCVUxLX09VVF9VTkxPQ0soJnBBZC0+QnVsa091dExvY2tbMF0sIElycUZsYWdzKTsKKwkJfQorCisJCVJUVVNCX1NFVF9CVUxLX0ZMQUcocEFkLCBmUlRVU0JfQlVMS19PVVRfREFUQV9BVEUpOworCisJCS8vIEtpY2sgYnVsayBvdXQKKwkJUlRVU0JLaWNrQnVsa091dChwQWQpOworCX0KKyNpZmRlZiBSQUxJTktfMjh4eF9RQQorCWVsc2UgaWYgKCFzdHJjbXAoYXJnLCAiVFhTVE9QIikpIAkJLy9FbnRlciBBVEUgbW9kZSBhbmQgc2V0IFR4L1J4IElkbGUKKwl7CisJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFURTogVFhTVE9QXG4iKSk7CisKKwkJYXRlbW9kZSA9IHBBZC0+YXRlLk1vZGU7CisJCXBBZC0+YXRlLk1vZGUgJj0gQVRFX1RYU1RPUDsKKwkJcEFkLT5hdGUuYlFBVHhTdGFydCA9IEZBTFNFOworLy8JCXBBZC0+YXRlLlR4RG9uZUNvdW50ID0gcEFkLT5hdGUuVHhDb3VudDsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKwkJaWYgKGF0ZW1vZGUgJiBBVEVfVFhDQVJSKQorCQl7CisJCQkvLyBObyBDYXJyaWVyIFRlc3Qgc2V0IEJCUCBSMjIgYml0Nz0wLCBiaXQ2PTAsIGJpdFs1fjBdPTB4MAorCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjIyLCAmQmJwRGF0YSk7CisJCQlCYnBEYXRhICY9IDB4RkZGRkZGMDA7IC8vY2xlYXIgYml0NywgYml0NiwgYml0WzV+MF0KKwkJICAgIEFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMjIsIEJicERhdGEpOworCQl9CisJCWVsc2UgaWYgKGF0ZW1vZGUgJiBBVEVfVFhDQVJSU1VQUCkKKwkJeworCQkJLy8gTm8gQ29udC4gVFggc2V0IEJCUCBSMjIgYml0Nz0wCisJCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMjIsICZCYnBEYXRhKTsKKwkJCUJicERhdGEgJj0gfigxIDw8IDcpOyAvL3NldCBiaXQ3PTAKKwkJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMjIsIEJicERhdGEpOworCisJCQkvLyBObyBDYXJyaWVyIFN1cHByZXNzaW9uIHNldCBCQlAgUjI0IGJpdDA9MAorCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjI0LCAmQmJwRGF0YSk7CisJCQlCYnBEYXRhICY9IDB4RkZGRkZGRkU7IC8vY2xlYXIgYml0MAorCQkgICAgQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IyNCwgQmJwRGF0YSk7CisJCX0KKwkJZWxzZSBpZiAoKGF0ZW1vZGUgJiBBVEVfVFhGUkFNRSkgfHwgKGF0ZW1vZGUgPT0gQVRFX1NUT1ApKQorCQl7CisJCQlpZiAoYXRlbW9kZSAmIEFURV9UWENPTlQpCisJCQl7CisJCQkJLy8gTm8gQ29udC4gVFggc2V0IEJCUCBSMjIgYml0Nz0wCisJCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjIyLCAmQmJwRGF0YSk7CisJCQkJQmJwRGF0YSAmPSB+KDEgPDwgNyk7IC8vc2V0IGJpdDc9MAorCQkJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMjIsIEJicERhdGEpOworCQkJfQorCQl9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisJCVJUVVNCUmVqZWN0UGVuZGluZ1BhY2tldHMocEFkKTsKKwkJUlRVU0JDbGVhblVwRGF0YUJ1bGtPdXRRdWV1ZShwQWQpOworCisJCS8qIG5vdCB1c2VkIGluIFJUMjh4eCAqLworCQkvL1JUVVNCQ2xlYW5VcE1MTUVXYWl0UXVldWUocEFkKTsKKwkJLyogZW1wdHkgZnVuY3Rpb24gc28gZmFyICovCisJCVJUVVNCQ2xlYW5VcE1MTUVCdWxrT3V0UXVldWUocEFkKTsKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisJCS8vIEFib3J0IFR4LCBSWCBETUEuCisJCVJ0bXBEbWFFbmFibGUocEFkLCAwKTsKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKwkJLyogSW4gMjh4eCwgcEFkLT5QZW5kaW5nUnggaXMgbm90IG9mIHR5cGUgYXRvbWljX3QgYW55bW9yZSAqLworLy8JCXdoaWxlICgoYXRvbWljX3JlYWQoJnBBZC0+UGVuZGluZ1J4KSA+IDApKQkvL3BBZC0+QnVsa0ZsYWdzICE9IDAgd2FpdCBidWxrIG91dCBmaW5pc2gKKwkJLyogcGV0ZXIgdG9kbyA6IEJ1bGtJbkxvY2sgKi8KKwkJd2hpbGUgKHBBZC0+UGVuZGluZ1J4ID4gMCkKKwkJeworI2lmIDEKKwkJCUFURV9SVFVTQkNhbmNlbFBlbmRpbmdCdWxrSW5JUlAocEFkKTsKKyNlbHNlCisvLwkJCU5kaXNJbnRlcmxvY2tlZERlY3JlbWVudCgmcEFkLT5QZW5kaW5nUngpOworCQkJcEFkLT5QZW5kaW5nUngtLTsKKyNlbmRpZgorCQkJUlRNUHVzZWNEZWxheSg1MDAwMDApOworCQl9CisKKwkJd2hpbGUgKCgocEFkLT5CdWxrT3V0UGVuZGluZ1swXSA9PSBUUlVFKSB8fAorCQkJCShwQWQtPkJ1bGtPdXRQZW5kaW5nWzFdID09IFRSVUUpIHx8CisJCQkJKHBBZC0+QnVsa091dFBlbmRpbmdbMl0gPT0gVFJVRSkgfHwKKwkJCQkocEFkLT5CdWxrT3V0UGVuZGluZ1szXSA9PSBUUlVFKSkgJiYgKHBBZC0+QnVsa0ZsYWdzICE9IDApKQkvL3BBZC0+QnVsa0ZsYWdzICE9IDAgd2FpdCBidWxrIG91dCBmaW5pc2gKKwkJeworCQkJZG8KKwkJCXsKKwkJCQlSVFVTQkNhbmNlbFBlbmRpbmdCdWxrT3V0SVJQKHBBZCk7CisJCQl9IHdoaWxlIChGQUxTRSk7CisKKwkJCVJUTVB1c2VjRGVsYXkoNTAwMDAwKTsKKwkJfQorCisJCUFTU0VSVChwQWQtPlBlbmRpbmdSeCA9PSAwKTsKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisJCS8vIEVuYWJsZSBUeCwgUnggRE1BLgorCQlSdG1wRG1hRW5hYmxlKHBBZCwgMSk7CisKKwkJLyogdGFzayBUeCBzdGF0dXMgOiAwIC0tPiB0YXNrIGlzIGlkbGUsIDEgLS0+IHRhc2sgaXMgcnVubmluZyAqLworCQlwQWQtPmF0ZS5UeFN0YXR1cyA9IDA7CisKKwkJLy8gU29mdCByZXNldCBCQlAuCisJCUJicFNvZnRSZXNldChwQWQpOworCisJCS8vIERpc2FibGUgVHgKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBNQUNfU1lTX0NUUkwsICZNYWNEYXRhKTsKKwkJTWFjRGF0YSAmPSAoMHhmZmZmZmZmYik7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgTWFjRGF0YSk7CisKKwkJLy9DbGVhbiBBVEUgQnVsayBpbi9vdXQgY291bnRlciBhbmQgY29udGludWUgc2V0dXAKKwkJSW50ZXJsb2NrZWRFeGNoYW5nZSgmcEFkLT5CdWxrT3V0UmVtYWluZWQsIDApOworCisJCXBBZC0+Q29udGluQnVsa091dCA9IEZBTFNFOworCX0KKwllbHNlIGlmICghc3RyY21wKGFyZywgIlJYU1RPUCIpKQorCXsKKwkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVRFOiBSWFNUT1BcbiIpKTsKKwkJYXRlbW9kZSA9IHBBZC0+YXRlLk1vZGU7CisKKwkJLy8gRGlzYWJsZSBSeAorCQlSVE1QX0lPX1JFQUQzMihwQWQsIE1BQ19TWVNfQ1RSTCwgJlZhbHVlKTsKKwkJVmFsdWUgJj0gfigxIDw8IDMpOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIFZhbHVlKTsKKworCQlwQWQtPmF0ZS5Nb2RlICY9IEFURV9SWFNUT1A7CisJCXBBZC0+YXRlLmJRQVJ4U3RhcnQgPSBGQUxTRTsKKy8vCQlwQWQtPmF0ZS5UeERvbmVDb3VudCA9IHBBZC0+YXRlLlR4Q291bnQ7CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisJCVJUVVNCUmVqZWN0UGVuZGluZ1BhY2tldHMocEFkKTsKKwkJUlRVU0JDbGVhblVwRGF0YUJ1bGtPdXRRdWV1ZShwQWQpOworCisJCS8qIG5vdCB1c2VkIGluIFJUMjh4eCAqLworCQkvL1JUVVNCQ2xlYW5VcE1MTUVXYWl0UXVldWUocEFkKTsKKwkJUlRVU0JDbGVhblVwTUxNRUJ1bGtPdXRRdWV1ZShwQWQpOworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCQkvLyBBYm9ydCBUeCwgUlggRE1BLgorCQlSdG1wRG1hRW5hYmxlKHBBZCwgMCk7CisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworLy8JCXdoaWxlICgoYXRvbWljX3JlYWQoJnBBZC0+UGVuZGluZ1J4KSA+IDApKQorCQl3aGlsZSAocEFkLT5QZW5kaW5nUnggPiAwKQorCQl7CisjaWYgMQorCQkJQVRFX1JUVVNCQ2FuY2VsUGVuZGluZ0J1bGtJbklSUChwQWQpOworI2Vsc2UKKy8vCQkJTmRpc0ludGVybG9ja2VkRGVjcmVtZW50KCZwQWQtPlBlbmRpbmdSeCk7CisJCQlwQWQtPlBlbmRpbmdSeC0tOworI2VuZGlmCisJCQlSVE1QdXNlY0RlbGF5KDUwMDAwMCk7CisJCX0KKworCQl3aGlsZSAoKChwQWQtPkJ1bGtPdXRQZW5kaW5nWzBdID09IFRSVUUpIHx8CisJCQkJKHBBZC0+QnVsa091dFBlbmRpbmdbMV0gPT0gVFJVRSkgfHwKKwkJCQkocEFkLT5CdWxrT3V0UGVuZGluZ1syXSA9PSBUUlVFKSB8fAorCQkJCShwQWQtPkJ1bGtPdXRQZW5kaW5nWzNdID09IFRSVUUpKSAmJiAocEFkLT5CdWxrRmxhZ3MgIT0gMCkpCS8vcEFkLT5CdWxrRmxhZ3MgIT0gMCB3YWl0IGJ1bGsgb3V0IGZpbmlzaAorCQl7CisJCQlkbworCQkJeworCQkJCVJUVVNCQ2FuY2VsUGVuZGluZ0J1bGtPdXRJUlAocEFkKTsKKwkJCX0gd2hpbGUgKEZBTFNFKTsKKworCQkJUlRNUHVzZWNEZWxheSg1MDAwMDApOworCQl9CisKKwkJQVNTRVJUKHBBZC0+UGVuZGluZ1J4ID09IDApOworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCQkvLyBTb2Z0IHJlc2V0IEJCUC4KKwkJQmJwU29mdFJlc2V0KHBBZCk7CisJCXBBZC0+Q29udGluQnVsa0luID0gRkFMU0U7CisJfQorI2VuZGlmIC8vIFJBTElOS18yOHh4X1FBIC8vCisJZWxzZSBpZiAoIXN0cmNtcChhcmcsICJSWEZSQU1FIikpIC8vIFJ4IEZyYW1lcworCXsKKwkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVRFOiBSWEZSQU1FXG4iKSk7CisKKwkJLy8gRGlzYWJsZSBSeCBvZiBNQUMgYmxvY2sKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBNQUNfU1lTX0NUUkwsICZWYWx1ZSk7CisJCVZhbHVlICY9IH4oMSA8PCAzKTsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCBWYWx1ZSk7CisKKwkJLy8gRGVmYXVsdCB2YWx1ZSBpbiBCQlAgUjIyIGlzIDB4MC4KKwkJQmJwRGF0YSA9IDA7CisKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBNQUNfU1lTX0NUUkwsICZNYWNEYXRhKTsKKwkJLy8gQ2xlYW4gYml0NCB0byBzdG9wIGNvbnRpbnVvdXMgVHggcHJvZHVjdGlvbiB0ZXN0LgorCQlNYWNEYXRhICY9IDB4RkZGRkZGRUY7CisKKwkgICAJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IyMiwgQmJwRGF0YSk7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgTWFjRGF0YSk7CisKKwkJcEFkLT5hdGUuTW9kZSB8PSBBVEVfUlhGUkFNRTsKKworCQkvLyBBYm9ydCBUeCwgUlggRE1BLgorCQlSdG1wRG1hRW5hYmxlKHBBZCwgMCk7CisKKwkJLy8gRGlzYWJsZSBUWCBvZiBNQUMgYmxvY2sKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBNQUNfU1lTX0NUUkwsICZWYWx1ZSk7CisJCVZhbHVlICY9IH4oMSA8PCAyKTsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCBWYWx1ZSk7CisKKyAgICAgICAgLy8gUmVzZXQgUnggUklORy4KKwkJZm9yICggaSA9IDA7IGkgPCAoUlhfUklOR19TSVpFKTsgaSsrKQorCQl7CisJCQlQUlhfQ09OVEVYVCAgcFJ4Q29udGV4dCA9ICYocEFkLT5SeENvbnRleHRbaV0pOworCisJCQlwUnhDb250ZXh0LT5JblVzZSA9IEZBTFNFOworCQkJcFJ4Q29udGV4dC0+SVJQUGVuZGluZyA9IEZBTFNFOworCQkJcFJ4Q29udGV4dC0+UmVhZGFibGUgPSBGQUxTRTsKKworCQkJLy8KKwkJCS8vIEdldCB0aGUgdXJiIGZyb20ga2VybmVsIGJhY2sgdG8gZHJpdmVyLgorCQkJLy8KKwkJCVJUVVNCX1VOTElOS19VUkIocFJ4Q29udGV4dC0+cFVyYik7CisKKwkJCS8qIFNsZWVwIDIwMCBtaWNyb3NlY3MgdG8gZ2l2ZSBjYW5jZWxsYXRpb24gdGltZSB0byB3b3JrLiAqLworCQkJTmRpc01TbGVlcCgyMDApOworCQkJcEFkLT5CdWxrSW5SZXEgPSAwOworCisvLwkJCUludGVybG9ja2VkRXhjaGFuZ2UoJnBBZC0+UGVuZGluZ1J4LCAwKTsKKwkJCXBBZC0+UGVuZGluZ1J4ID0gMDsKKwkJCXBBZC0+TmV4dFJ4QnVsa0luUmVhZEluZGV4ID0gMDsJLy8gTmV4dCBSeCBSZWFkIGluZGV4CisJCQlwQWQtPk5leHRSeEJ1bGtJbkluZGV4CQk9IFJYX1JJTkdfU0laRSAtIDE7CS8vIFJ4IEJ1bGsgcG9pbnRlcgorCQkJcEFkLT5OZXh0UnhCdWxrSW5Qb3NpdGlvbiA9IDA7CisJCX0KKworCQkvLyByZWFkIHRvIGNsZWFyIGNvdW50ZXJzCisJCVJUVVNCUmVhZE1BQ1JlZ2lzdGVyKHBBZCwgUlhfU1RBX0NOVDAsICZ0ZW1wKTsgLy9SWCBQSFkgJiBSWCBDUkMgY291bnQKKwkJUlRVU0JSZWFkTUFDUmVnaXN0ZXIocEFkLCBSWF9TVEFfQ05UMSwgJnRlbXApOyAvL1JYIFBMQ1AgZXJyb3IgY291bnQgJiBDQ0EgZmFsc2UgYWxhcm0gY291bnQKKwkJUlRVU0JSZWFkTUFDUmVnaXN0ZXIocEFkLCBSWF9TVEFfQ05UMiwgJnRlbXApOyAvL1JYIEZJRk8gb3ZlcmZsb3cgZnJhbWUgY291bnQgJiBSWCBkdXBsaWNhdGVkIGZpbHRlcmVkIGZyYW1lIGNvdW50CisKKwkJcEFkLT5Db250aW5CdWxrSW4gPSBUUlVFOworCisJCS8vIEVuYWJsZSBUeCwgUlggRE1BLgorCQlSdG1wRG1hRW5hYmxlKHBBZCwgMSk7CisKKwkJLy8gRW5hYmxlIFJYIG9mIE1BQyBibG9jaworCQlSVE1QX0lPX1JFQUQzMihwQWQsIE1BQ19TWVNfQ1RSTCwgJlZhbHVlKTsKKwkJVmFsdWUgfD0gKDEgPDwgMyk7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgVmFsdWUpOworCisJCS8vIEtpY2sgYnVsayBpbgorCQlSVFVTQkJ1bGtSZWNlaXZlKHBBZCk7CisJfQorCWVsc2UKKwl7CisJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFURTogSW52YWxpZCBhcmchXG4iKSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisJUlRNUHVzZWNEZWxheSg1MDAwKTsKKworCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PT0gQVRFQ21kSGFuZGxlcigpXG4iKSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKyNlbmRpZiAvLyBSVDI4NzAgLy8KKworSU5UCVNldF9BVEVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJaWYgKEFURUNtZEhhbmRsZXIocEFkLCBhcmcpKQorCXsKKwkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmFsaW5rOiBTZXRfQVRFX1Byb2MgU3VjY2Vzc1xuIikpOworCisKKwkJcmV0dXJuIFRSVUU7CisJfQorCWVsc2UKKwl7CisJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJhbGluazogU2V0X0FURV9Qcm9jIEZhaWxlZFxuIikpOworCQlyZXR1cm4gRkFMU0U7CisJfQorfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBBVEUgQUREUjE9REEgZm9yIFR4RnJhbWUoQVAgIDogVG8gRFMgPSAwIDsgRnJvbSBEUyA9IDEpCisgICAgICAgIG9yCisgICAgICAgIFNldCBBVEUgQUREUjM9REEgZm9yIFR4RnJhbWUoU1RBIDogVG8gRFMgPSAxIDsgRnJvbSBEUyA9IDApCisKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVAlTZXRfQVRFX0RBX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCUNIQVIJCQkJKnZhbHVlOworCUlOVAkJCQkJaTsKKworCWlmKHN0cmxlbihhcmcpICE9IDE3KSAgLy9NYWMgYWRkcmVzcyBhY2NlcHRhYmxlIGZvcm1hdCAwMTowMjowMzowNDowNTowNiBsZW5ndGggMTcKKwkJcmV0dXJuIEZBTFNFOworCisgICAgZm9yIChpPTAsIHZhbHVlID0gcnN0cnRvayhhcmcsICI6Iik7IHZhbHVlOyB2YWx1ZSA9IHJzdHJ0b2soTlVMTCwgIjoiKSkKKwl7CisJCWlmKChzdHJsZW4odmFsdWUpICE9IDIpIHx8ICghaXN4ZGlnaXQoKnZhbHVlKSkgfHwgKCFpc3hkaWdpdCgqKHZhbHVlKzEpKSkgKQorCQkJcmV0dXJuIEZBTFNFOyAgLy9JbnZhbGlkCisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQlBdG9IKHZhbHVlLCAmcEFkLT5hdGUuQWRkcjNbaSsrXSwgMSk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJfQorCisJaWYoaSAhPSA2KQorCQlyZXR1cm4gRkFMU0U7ICAvL0ludmFsaWQKKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0FURV9EQV9Qcm9jIChEQSA9ICUyWDolMlg6JTJYOiUyWDolMlg6JTJYKVxuIiwgcEFkLT5hdGUuQWRkcjNbMF0sCisJCXBBZC0+YXRlLkFkZHIzWzFdLCBwQWQtPmF0ZS5BZGRyM1syXSwgcEFkLT5hdGUuQWRkcjNbM10sIHBBZC0+YXRlLkFkZHIzWzRdLCBwQWQtPmF0ZS5BZGRyM1s1XSkpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmFsaW5rOiBTZXRfQVRFX0RBX1Byb2MgU3VjY2Vzc1xuIikpOworCisJcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IEFURSBBRERSMz1TQSBmb3IgVHhGcmFtZShBUCAgOiBUbyBEUyA9IDAgOyBGcm9tIERTID0gMSkKKyAgICAgICAgb3IKKyAgICAgICAgU2V0IEFURSBBRERSMj1TQSBmb3IgVHhGcmFtZShTVEEgOiBUbyBEUyA9IDEgOyBGcm9tIERTID0gMCkKKworICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UCVNldF9BVEVfU0FfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJQ0hBUgkJCQkqdmFsdWU7CisJSU5UCQkJCQlpOworCisJaWYoc3RybGVuKGFyZykgIT0gMTcpICAvL01hYyBhZGRyZXNzIGFjY2VwdGFibGUgZm9ybWF0IDAxOjAyOjAzOjA0OjA1OjA2IGxlbmd0aCAxNworCQlyZXR1cm4gRkFMU0U7CisKKyAgICBmb3IgKGk9MCwgdmFsdWUgPSByc3RydG9rKGFyZywgIjoiKTsgdmFsdWU7IHZhbHVlID0gcnN0cnRvayhOVUxMLCAiOiIpKQorCXsKKwkJaWYoKHN0cmxlbih2YWx1ZSkgIT0gMikgfHwgKCFpc3hkaWdpdCgqdmFsdWUpKSB8fCAoIWlzeGRpZ2l0KCoodmFsdWUrMSkpKSApCisJCQlyZXR1cm4gRkFMU0U7ICAvL0ludmFsaWQKKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCUF0b0godmFsdWUsICZwQWQtPmF0ZS5BZGRyMltpKytdLCAxKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwl9CisKKwlpZihpICE9IDYpCisJCXJldHVybiBGQUxTRTsgIC8vSW52YWxpZAorCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfQVRFX1NBX1Byb2MgKFNBID0gJTJYOiUyWDolMlg6JTJYOiUyWDolMlgpXG4iLCBwQWQtPmF0ZS5BZGRyMlswXSwKKwkJcEFkLT5hdGUuQWRkcjJbMV0sIHBBZC0+YXRlLkFkZHIyWzJdLCBwQWQtPmF0ZS5BZGRyMlszXSwgcEFkLT5hdGUuQWRkcjJbNF0sIHBBZC0+YXRlLkFkZHIyWzVdKSk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSYWxpbms6IFNldF9BVEVfU0FfUHJvYyBTdWNjZXNzXG4iKSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgQVRFIEFERFIyPUJTU0lEIGZvciBUeEZyYW1lKEFQICA6IFRvIERTID0gMCA7IEZyb20gRFMgPSAxKQorICAgICAgICBvcgorICAgICAgICBTZXQgQVRFIEFERFIxPUJTU0lEIGZvciBUeEZyYW1lKFNUQSA6IFRvIERTID0gMSA7IEZyb20gRFMgPSAwKQorCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQJU2V0X0FURV9CU1NJRF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlDSEFSCQkJCSp2YWx1ZTsKKwlJTlQJCQkJCWk7CisKKwlpZihzdHJsZW4oYXJnKSAhPSAxNykgIC8vTWFjIGFkZHJlc3MgYWNjZXB0YWJsZSBmb3JtYXQgMDE6MDI6MDM6MDQ6MDU6MDYgbGVuZ3RoIDE3CisJCXJldHVybiBGQUxTRTsKKworICAgIGZvciAoaT0wLCB2YWx1ZSA9IHJzdHJ0b2soYXJnLCAiOiIpOyB2YWx1ZTsgdmFsdWUgPSByc3RydG9rKE5VTEwsICI6IikpCisJeworCQlpZigoc3RybGVuKHZhbHVlKSAhPSAyKSB8fCAoIWlzeGRpZ2l0KCp2YWx1ZSkpIHx8ICghaXN4ZGlnaXQoKih2YWx1ZSsxKSkpICkKKwkJCXJldHVybiBGQUxTRTsgIC8vSW52YWxpZAorCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJQXRvSCh2YWx1ZSwgJnBBZC0+YXRlLkFkZHIxW2krK10sIDEpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCX0KKworCWlmKGkgIT0gNikKKwkJcmV0dXJuIEZBTFNFOyAgLy9JbnZhbGlkCisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9BVEVfQlNTSURfUHJvYyAoQlNTSUQgPSAlMlg6JTJYOiUyWDolMlg6JTJYOiUyWClcbiIsCXBBZC0+YXRlLkFkZHIxWzBdLAorCQlwQWQtPmF0ZS5BZGRyMVsxXSwgcEFkLT5hdGUuQWRkcjFbMl0sIHBBZC0+YXRlLkFkZHIxWzNdLCBwQWQtPmF0ZS5BZGRyMVs0XSwgcEFkLT5hdGUuQWRkcjFbNV0pKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJhbGluazogU2V0X0FURV9CU1NJRF9Qcm9jIFN1Y2Nlc3NcbiIpKTsKKworCXJldHVybiBUUlVFOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBBVEUgVHggQ2hhbm5lbAorCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQJU2V0X0FURV9DSEFOTkVMX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCVVDSEFSIGNoYW5uZWw7CisKKwljaGFubmVsID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKworCWlmICgoY2hhbm5lbCA8IDEpIHx8IChjaGFubmVsID4gMjE2KSkvLyB0byBhbGxvdyBBIGJhbmQgY2hhbm5lbCA6ICgoY2hhbm5lbCA8IDEpIHx8IChjaGFubmVsID4gMTQpKQorCXsKKwkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiU2V0X0FURV9DSEFOTkVMX1Byb2M6Ok91dCBvZiByYW5nZSwgaXQgc2hvdWxkIGJlIGluIHJhbmdlIG9mIDF+MTQuXG4iKSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisJcEFkLT5hdGUuQ2hhbm5lbCA9IGNoYW5uZWw7CisKKwlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfQVRFX0NIQU5ORUxfUHJvYyAoQVRFIENoYW5uZWwgPSAlZClcbiIsIHBBZC0+YXRlLkNoYW5uZWwpKTsKKwlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSYWxpbms6IFNldF9BVEVfQ0hBTk5FTF9Qcm9jIFN1Y2Nlc3NcbiIpKTsKKworCisJcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IEFURSBUeCBQb3dlcjAKKworICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UCVNldF9BVEVfVFhfUE9XRVIwX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCUNIQVIgVHhQb3dlcjsKKworCVR4UG93ZXIgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCisJaWYgKHBBZC0+YXRlLkNoYW5uZWwgPD0gMTQpCisJeworCQlpZiAoKFR4UG93ZXIgPiAzMSkgfHwgKFR4UG93ZXIgPCAwKSkKKwkJeworCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiU2V0X0FURV9UWF9QT1dFUjBfUHJvYzo6T3V0IG9mIHJhbmdlIChWYWx1ZT0lZClcbiIsIFR4UG93ZXIpKTsKKwkJCXJldHVybiBGQUxTRTsKKwkJfQorCX0KKwllbHNlLy8gNS41R0h6CisJeworCQlpZiAoKFR4UG93ZXIgPiAxNSkgfHwgKFR4UG93ZXIgPCAtNykpCisJCXsKKwkJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlNldF9BVEVfVFhfUE9XRVIwX1Byb2M6Ok91dCBvZiByYW5nZSAoVmFsdWU9JWQpXG4iLCBUeFBvd2VyKSk7CisJCQlyZXR1cm4gRkFMU0U7CisJCX0KKwl9CisKKwlwQWQtPmF0ZS5UeFBvd2VyMCA9IFR4UG93ZXI7CisJQVRFVHhQd3JIYW5kbGVyKHBBZCwgMCk7CisJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmFsaW5rOiBTZXRfQVRFX1RYX1BPV0VSMF9Qcm9jIFN1Y2Nlc3NcbiIpKTsKKworCisJcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IEFURSBUeCBQb3dlcjEKKworICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UCVNldF9BVEVfVFhfUE9XRVIxX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCUNIQVIgVHhQb3dlcjsKKworCVR4UG93ZXIgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCisJaWYgKHBBZC0+YXRlLkNoYW5uZWwgPD0gMTQpCisJeworCWlmICgoVHhQb3dlciA+IDMxKSB8fCAoVHhQb3dlciA8IDApKQorCXsKKwkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiU2V0X0FURV9UWF9QT1dFUjFfUHJvYzo6T3V0IG9mIHJhbmdlIChWYWx1ZT0lZClcbiIsIFR4UG93ZXIpKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKwl9CisJZWxzZQorCXsKKwkJaWYgKChUeFBvd2VyID4gMTUpIHx8IChUeFBvd2VyIDwgLTcpKQorCQl7CisJCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJTZXRfQVRFX1RYX1BPV0VSMV9Qcm9jOjpPdXQgb2YgcmFuZ2UgKFZhbHVlPSVkKVxuIiwgVHhQb3dlcikpOworCQkJcmV0dXJuIEZBTFNFOworCQl9CisJfQorCisJcEFkLT5hdGUuVHhQb3dlcjEgPSBUeFBvd2VyOworCUFURVR4UHdySGFuZGxlcihwQWQsIDEpOworCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJhbGluazogU2V0X0FURV9UWF9QT1dFUjFfUHJvYyBTdWNjZXNzXG4iKSk7CisKKworCXJldHVybiBUUlVFOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBBVEUgVHggQW50ZW5uYQorCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQJU2V0X0FURV9UWF9BbnRlbm5hX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCUNIQVIgdmFsdWU7CisKKwl2YWx1ZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisKKwlpZiAoKHZhbHVlID4gMikgfHwgKHZhbHVlIDwgMCkpCisJeworCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJTZXRfQVRFX1RYX0FudGVubmFfUHJvYzo6T3V0IG9mIHJhbmdlIChWYWx1ZT0lZClcbiIsIHZhbHVlKSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlwQWQtPmF0ZS5UeEFudGVubmFTZWwgPSB2YWx1ZTsKKworCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9BVEVfVFhfQW50ZW5uYV9Qcm9jIChBbnRlbm5hID0gJWQpXG4iLCBwQWQtPmF0ZS5UeEFudGVubmFTZWwpKTsKKwlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJhbGluazogU2V0X0FURV9UWF9BbnRlbm5hX1Byb2MgU3VjY2Vzc1xuIikpOworCisKKwlyZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgQVRFIFJ4IEFudGVubmEKKworICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UCVNldF9BVEVfUlhfQW50ZW5uYV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlDSEFSIHZhbHVlOworCisJdmFsdWUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCisJaWYgKCh2YWx1ZSA+IDMpIHx8ICh2YWx1ZSA8IDApKQorCXsKKwkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiU2V0X0FURV9SWF9BbnRlbm5hX1Byb2M6Ok91dCBvZiByYW5nZSAoVmFsdWU9JWQpXG4iLCB2YWx1ZSkpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJcEFkLT5hdGUuUnhBbnRlbm5hU2VsID0gdmFsdWU7CisKKwlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfQVRFX1JYX0FudGVubmFfUHJvYyAoQW50ZW5uYSA9ICVkKVxuIiwgcEFkLT5hdGUuUnhBbnRlbm5hU2VsKSk7CisJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmFsaW5rOiBTZXRfQVRFX1JYX0FudGVubmFfUHJvYyBTdWNjZXNzXG4iKSk7CisKKworCXJldHVybiBUUlVFOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBBVEUgUkYgZnJlcXVlbmNlIG9mZnNldAorCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQJU2V0X0FURV9UWF9GUkVRT0ZGU0VUX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCVVDSEFSIFJGRnJlcU9mZnNldDsKKwlVTE9ORyBSNDsKKworCVJGRnJlcU9mZnNldCA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisKKwlpZihSRkZyZXFPZmZzZXQgPj0gNjQpCisJeworCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJTZXRfQVRFX1RYX0ZSRVFPRkZTRVRfUHJvYzo6T3V0IG9mIHJhbmdlLCBpdCBzaG91bGQgYmUgaW4gcmFuZ2Ugb2YgMH42My5cbiIpKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCXBBZC0+YXRlLlJGRnJlcU9mZnNldCA9IFJGRnJlcU9mZnNldDsKKwlSNCA9IHBBZC0+YXRlLlJGRnJlcU9mZnNldCA8PCAxNTsJCS8vIHNoaWZ0IFRYIHBvd2VyIGNvbnRyb2wgdG8gY29ycmVjdCBSRiByZWdpc3RlciBiaXQgcG9zaXRpb24KKwlSNCB8PSAocEFkLT5MYXRjaFJmUmVncy5SNCAmICgofjB4MDAxZjgwMDApKSk7CisJcEFkLT5MYXRjaFJmUmVncy5SNCA9IFI0OworCisJUnRtcFJmSW9Xcml0ZShwQWQpOworCisJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0FURV9UWF9GUkVRT0ZGU0VUX1Byb2MgKFJGRnJlcU9mZnNldCA9ICVkKVxuIiwgcEFkLT5hdGUuUkZGcmVxT2Zmc2V0KSk7CisJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmFsaW5rOiBTZXRfQVRFX1RYX0ZSRVFPRkZTRVRfUHJvYyBTdWNjZXNzXG4iKSk7CisKKworCXJldHVybiBUUlVFOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBBVEUgUkYgQlcKKworICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UCVNldF9BVEVfVFhfQldfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJaW50IGk7CisJVUNIQVIgdmFsdWUgPSAwOworCVVDSEFSIEJCUEN1cnJlbnRCVzsKKworCUJCUEN1cnJlbnRCVyA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisKKwlpZihCQlBDdXJyZW50QlcgPT0gMCkKKwkJcEFkLT5hdGUuVHhXSS5CVyA9IEJXXzIwOworCWVsc2UKKwkJcEFkLT5hdGUuVHhXSS5CVyA9IEJXXzQwOworCisJaWYocEFkLT5hdGUuVHhXSS5CVyA9PSBCV18yMCkKKwl7CisJCWlmKHBBZC0+YXRlLkNoYW5uZWwgPD0gMTQpCisJCXsKKyAJCWZvciAoaT0wOyBpPDU7IGkrKykKKyAJCXsKKwkJCQlpZiAocEFkLT5UeDIwTVB3ckNmZ0dCYW5kW2ldICE9IDB4ZmZmZmZmZmYpCisJCQkJeworCQkJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9QV1JfQ0ZHXzAgKyBpKjQsIHBBZC0+VHgyME1Qd3JDZmdHQmFuZFtpXSk7CisJCQkJCVJUTVB1c2VjRGVsYXkoNTAwMCk7CisJCQkJfQorCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJZm9yIChpPTA7IGk8NTsgaSsrKQorCQkJeworCQkJCWlmIChwQWQtPlR4MjBNUHdyQ2ZnQUJhbmRbaV0gIT0gMHhmZmZmZmZmZikKKyAJCQl7CisJCQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX1BXUl9DRkdfMCArIGkqNCwgcEFkLT5UeDIwTVB3ckNmZ0FCYW5kW2ldKTsKKyAJCQkJUlRNUHVzZWNEZWxheSg1MDAwKTsKKyAJCQl9CisgCQl9CisJCX0KKworCQkvL1NldCBCQlAgUjQgYml0WzQ6M109MDowCisgCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgJnZhbHVlKTsKKyAJCXZhbHVlICY9ICh+MHgxOCk7CisgCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsIHZhbHVlKTsKKworICAJCS8vU2V0IEJCUCBSNjY9MHgzQworIAkJdmFsdWUgPSAweDNDOworIAkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2NiwgdmFsdWUpOworCQkvL1NldCBCQlAgUjY4PTB4MEIKKwkJLy90byBpbXByb3ZlIFJ4IHNlbnNpdGl2aXR5LgorCQl2YWx1ZSA9IDB4MEI7CisJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjgsIHZhbHVlKTsKKwkJLy9TZXQgQkJQIFI2OT0weDE2CisJCXZhbHVlID0gMHgxNjsKKyAJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjksIHZhbHVlKTsKKwkJLy9TZXQgQkJQIFI3MD0weDA4CisJCXZhbHVlID0gMHgwODsKKyAJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNzAsIHZhbHVlKTsKKwkJLy9TZXQgQkJQIFI3Mz0weDExCisJCXZhbHVlID0gMHgxMTsKKyAJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNzMsIHZhbHVlKTsKKworCSAgICAvLyBJZiBDaGFubmVsPTE0LCBCYW5kd2lkdGg9MjBNIGFuZCBNb2RlPUNDSywgU2V0IEJCUCBSNCBiaXQ1PTEKKwkgICAgLy8gKEphcGFuIGZpbHRlciBjb2VmZmljaWVudHMpCisJICAgIC8vIFRoaXMgc2VnbWVudCBvZiBjb2RlIHdpbGwgb25seSB3b3JrcyB3aGVuIEFURVRYTU9ERSBhbmQgQVRFQ0hBTk5FTAorCSAgICAvLyB3ZXJlIHNldCB0byBNT0RFX0NDSyBhbmQgMTQgcmVzcGVjdGl2ZWx5IGJlZm9yZSBBVEVUWEJXIGlzIHNldCB0byAwLgorCSAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCQlpZiAocEFkLT5hdGUuQ2hhbm5lbCA9PSAxNCkKKwkJeworCQkJaW50IFR4TW9kZSA9IHBBZC0+YXRlLlR4V0kuUEhZTU9ERTsKKwkJCWlmIChUeE1vZGUgPT0gTU9ERV9DQ0spCisJCQl7CisJCQkJLy8gd2hlbiBDaGFubmVsPT0xNCAmJiBNb2RlPT1DQ0sgJiYgQmFuZFdpZHRoPT0yME0sIEJCUCBSNCBiaXQ1PTEKKyAJCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsICZ2YWx1ZSk7CisJCQkJdmFsdWUgfD0gMHgyMDsgLy9zZXQgYml0NT0xCisgCQkJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgdmFsdWUpOworCQkJfQorCQl9CisKKwkgICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkJLy8gSWYgYmFuZHdpZHRoICE9IDQwTSwgUkYgUmVnNCBiaXQgMjEgPSAwLgorCQlwQWQtPkxhdGNoUmZSZWdzLlI0ICY9IH4weDAwMjAwMDAwOworCQlSdG1wUmZJb1dyaXRlKHBBZCk7CisJfQorCWVsc2UgaWYocEFkLT5hdGUuVHhXSS5CVyA9PSBCV180MCkKKwl7CisJCWlmKHBBZC0+YXRlLkNoYW5uZWwgPD0gMTQpCisJCXsKKwkJCWZvciAoaT0wOyBpPDU7IGkrKykKKwkJCXsKKwkJCQlpZiAocEFkLT5UeDQwTVB3ckNmZ0dCYW5kW2ldICE9IDB4ZmZmZmZmZmYpCisJCQkJeworCQkJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9QV1JfQ0ZHXzAgKyBpKjQsIHBBZC0+VHg0ME1Qd3JDZmdHQmFuZFtpXSk7CisJCQkJCVJUTVB1c2VjRGVsYXkoNTAwMCk7CisJCQkJfQorCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJZm9yIChpPTA7IGk8NTsgaSsrKQorCQkJeworCQkJCWlmIChwQWQtPlR4NDBNUHdyQ2ZnQUJhbmRbaV0gIT0gMHhmZmZmZmZmZikKKwkJCQl7CisJCQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX1BXUl9DRkdfMCArIGkqNCwgcEFkLT5UeDQwTVB3ckNmZ0FCYW5kW2ldKTsKKwkJCQkJUlRNUHVzZWNEZWxheSg1MDAwKTsKKwkJCQl9CisJCQl9CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQlpZiAoKHBBZC0+YXRlLlR4V0kuUEhZTU9ERSA+PSBNT0RFX0hUTUlYKSAmJiAocEFkLT5hdGUuVHhXSS5NQ1MgPT0gNykpCisJCQl7CisgICAgCQkJdmFsdWUgPSAweDI4OworICAgIAkJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjcsIHZhbHVlKTsKKwkJCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJfQorCisJCS8vU2V0IEJCUCBSNCBiaXRbNDozXT0xOjAKKwkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsICZ2YWx1ZSk7CisJCXZhbHVlICY9ICh+MHgxOCk7CisJCXZhbHVlIHw9IDB4MTA7CisJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgdmFsdWUpOworCisJCS8vU2V0IEJCUCBSNjY9MHgzQworCQl2YWx1ZSA9IDB4M0M7CisJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjYsIHZhbHVlKTsKKwkJLy9TZXQgQkJQIFI2OD0weDBDCisJCS8vdG8gaW1wcm92ZSBSeCBzZW5zaXRpdml0eS4KKwkJdmFsdWUgPSAweDBDOworCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY4LCB2YWx1ZSk7CisJCS8vU2V0IEJCUCBSNjk9MHgxQQorCQl2YWx1ZSA9IDB4MUE7CisJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjksIHZhbHVlKTsKKwkJLy9TZXQgQkJQIFI3MD0weDBBCisJCXZhbHVlID0gMHgwQTsKKwkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I3MCwgdmFsdWUpOworCQkvL1NldCBCQlAgUjczPTB4MTYKKwkJdmFsdWUgPSAweDE2OworCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjczLCB2YWx1ZSk7CisKKwkJLy8gSWYgYmFuZHdpZHRoID0gNDBNLCBzZXQgUkYgUmVnNCBiaXQgMjEgPSAxLgorCQlwQWQtPkxhdGNoUmZSZWdzLlI0IHw9IDB4MDAyMDAwMDA7CisJCVJ0bXBSZklvV3JpdGUocEFkKTsKKwl9CisKKwlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfQVRFX1RYX0JXX1Byb2MgKEJCUEN1cnJlbnRCVyA9ICVkKVxuIiwgcEFkLT5hdGUuVHhXSS5CVykpOworCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJhbGluazogU2V0X0FURV9UWF9CV19Qcm9jIFN1Y2Nlc3NcbiIpKTsKKworCisJcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IEFURSBUeCBmcmFtZSBsZW5ndGgKKworICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UCVNldF9BVEVfVFhfTEVOR1RIX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCXBBZC0+YXRlLlR4TGVuZ3RoID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKworCWlmKChwQWQtPmF0ZS5UeExlbmd0aCA8IDI0KSB8fCAocEFkLT5hdGUuVHhMZW5ndGggPiAoTUFYX0ZSQU1FX1NJWkUgLSAzNC8qID09IDIzMTIgKi8pKSkKKwl7CisJCXBBZC0+YXRlLlR4TGVuZ3RoID0gKE1BWF9GUkFNRV9TSVpFIC0gMzQvKiA9PSAyMzEyICovKTsKKwkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiU2V0X0FURV9UWF9MRU5HVEhfUHJvYzo6T3V0IG9mIHJhbmdlLCBpdCBzaG91bGQgYmUgaW4gcmFuZ2Ugb2YgMjR+JWQuXG4iLCAoTUFYX0ZSQU1FX1NJWkUgLSAzNC8qID09IDIzMTIgKi8pKSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfQVRFX1RYX0xFTkdUSF9Qcm9jIChUeExlbmd0aCA9ICVkKVxuIiwgcEFkLT5hdGUuVHhMZW5ndGgpKTsKKwlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSYWxpbms6IFNldF9BVEVfVFhfTEVOR1RIX1Byb2MgU3VjY2Vzc1xuIikpOworCisKKwlyZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgQVRFIFR4IGZyYW1lIGNvdW50CisKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVAlTZXRfQVRFX1RYX0NPVU5UX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCXBBZC0+YXRlLlR4Q291bnQgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCisJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0FURV9UWF9DT1VOVF9Qcm9jIChUeENvdW50ID0gJWQpXG4iLCBwQWQtPmF0ZS5UeENvdW50KSk7CisJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmFsaW5rOiBTZXRfQVRFX1RYX0NPVU5UX1Byb2MgU3VjY2Vzc1xuIikpOworCisKKwlyZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgQVRFIFR4IGZyYW1lIE1DUworCisgICAgICAgIFJldHVybjoKKyAgICAgICAgCVRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVAlTZXRfQVRFX1RYX01DU19Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVQ0hBUiBNQ1M7CisJaW50IHJlc3VsdDsKKworCU1DUyA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisJcmVzdWx0ID0gQ2hlY2tNQ1NWYWxpZChwQWQtPmF0ZS5UeFdJLlBIWU1PREUsIE1DUyk7CisKKwlpZiAocmVzdWx0ICE9IC0xKQorCXsKKwkJcEFkLT5hdGUuVHhXSS5NQ1MgPSAoVUNIQVIpTUNTOworCX0KKwllbHNlCisJeworCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJTZXRfQVRFX1RYX01DU19Qcm9jOjpPdXQgb2YgcmFuZ2UsIHJlZmVyIHRvIHJhdGUgdGFibGUuXG4iKSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfQVRFX1RYX01DU19Qcm9jIChNQ1MgPSAlZClcbiIsIHBBZC0+YXRlLlR4V0kuTUNTKSk7CisJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmFsaW5rOiBTZXRfQVRFX1RYX01DU19Qcm9jIFN1Y2Nlc3NcbiIpKTsKKworCisJcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IEFURSBUeCBmcmFtZSBNb2RlCisgICAgICAgIDA6IE1PREVfQ0NLCisgICAgICAgIDE6IE1PREVfT0ZETQorICAgICAgICAyOiBNT0RFX0hUTUlYCisgICAgICAgIDM6IE1PREVfSFRHUkVFTkZJRUxECisKKyAgICAgICAgUmV0dXJuOgorICAgICAgICAJVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UCVNldF9BVEVfVFhfTU9ERV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlwQWQtPmF0ZS5UeFdJLlBIWU1PREUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCisJaWYocEFkLT5hdGUuVHhXSS5QSFlNT0RFID4gMykKKwl7CisJCXBBZC0+YXRlLlR4V0kuUEhZTU9ERSA9IDA7CisJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlNldF9BVEVfVFhfTU9ERV9Qcm9jOjpPdXQgb2YgcmFuZ2UuIGl0IHNob3VsZCBiZSBpbiByYW5nZSBvZiAwfjNcbiIpKTsKKwkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiMDogQ0NLLCAxOiBPRkRNLCAyOiBIVF9NSVgsIDM6IEhUX0dSRUVOX0ZJRUxELlxuIikpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0FURV9UWF9NT0RFX1Byb2MgKFR4TW9kZSA9ICVkKVxuIiwgcEFkLT5hdGUuVHhXSS5QSFlNT0RFKSk7CisJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmFsaW5rOiBTZXRfQVRFX1RYX01PREVfUHJvYyBTdWNjZXNzXG4iKSk7CisKKworCXJldHVybiBUUlVFOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBBVEUgVHggZnJhbWUgR0kKKworICAgICAgICBSZXR1cm46CisgICAgICAgIAlUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQJU2V0X0FURV9UWF9HSV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlwQWQtPmF0ZS5UeFdJLlNob3J0R0kgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCisJaWYocEFkLT5hdGUuVHhXSS5TaG9ydEdJID4gMSkKKwl7CisJCXBBZC0+YXRlLlR4V0kuU2hvcnRHSSA9IDA7CisJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlNldF9BVEVfVFhfR0lfUHJvYzo6T3V0IG9mIHJhbmdlXG4iKSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfQVRFX1RYX0dJX1Byb2MgKEdJID0gJWQpXG4iLCBwQWQtPmF0ZS5UeFdJLlNob3J0R0kpKTsKKwlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSYWxpbms6IFNldF9BVEVfVFhfR0lfUHJvYyBTdWNjZXNzXG4iKSk7CisKKworCXJldHVybiBUUlVFOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworSU5UCVNldF9BVEVfUlhfRkVSX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCXBBZC0+YXRlLmJSeEZlciA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisKKwlpZiAocEFkLT5hdGUuYlJ4RmVyID09IDEpCisJeworCQlwQWQtPmF0ZS5SeENudFBlclNlYyA9IDA7CisJCXBBZC0+YXRlLlJ4VG90YWxDbnQgPSAwOworCX0KKworCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9BVEVfUlhfRkVSX1Byb2MgKGJSeEZlciA9ICVkKVxuIiwgcEFkLT5hdGUuYlJ4RmVyKSk7CisJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmFsaW5rOiBTZXRfQVRFX1JYX0ZFUl9Qcm9jIFN1Y2Nlc3NcbiIpKTsKKworCisJcmV0dXJuIFRSVUU7Cit9CisKK0lOVCBTZXRfQVRFX1JlYWRfUkZfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJYXRlX3ByaW50KEtFUk5fRU1FUkcgIlIxID0gJWx4XG4iLCBwQWQtPkxhdGNoUmZSZWdzLlIxKTsKKwlhdGVfcHJpbnQoS0VSTl9FTUVSRyAiUjIgPSAlbHhcbiIsIHBBZC0+TGF0Y2hSZlJlZ3MuUjIpOworCWF0ZV9wcmludChLRVJOX0VNRVJHICJSMyA9ICVseFxuIiwgcEFkLT5MYXRjaFJmUmVncy5SMyk7CisJYXRlX3ByaW50KEtFUk5fRU1FUkcgIlI0ID0gJWx4XG4iLCBwQWQtPkxhdGNoUmZSZWdzLlI0KTsKKworCXJldHVybiBUUlVFOworfQorCitJTlQgU2V0X0FURV9Xcml0ZV9SRjFfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJVUlOVDMyIHZhbHVlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDE2KTsKKworCXBBZC0+TGF0Y2hSZlJlZ3MuUjEgPSB2YWx1ZTsKKwlSdG1wUmZJb1dyaXRlKHBBZCk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworSU5UIFNldF9BVEVfV3JpdGVfUkYyX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCVVJTlQzMiB2YWx1ZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxNik7CisKKwlwQWQtPkxhdGNoUmZSZWdzLlIyID0gdmFsdWU7CisJUnRtcFJmSW9Xcml0ZShwQWQpOworCisJcmV0dXJuIFRSVUU7Cit9CisKK0lOVCBTZXRfQVRFX1dyaXRlX1JGM19Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVSU5UMzIgdmFsdWUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTYpOworCisJcEFkLT5MYXRjaFJmUmVncy5SMyA9IHZhbHVlOworCVJ0bXBSZklvV3JpdGUocEFkKTsKKworCXJldHVybiBUUlVFOworfQorCitJTlQgU2V0X0FURV9Xcml0ZV9SRjRfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJVUlOVDMyIHZhbHVlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDE2KTsKKworCXBBZC0+TGF0Y2hSZlJlZ3MuUjQgPSB2YWx1ZTsKKwlSdG1wUmZJb1dyaXRlKHBBZCk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBMb2FkIGFuZCBXcml0ZSBFRVBST00gZnJvbSBhIGJpbmFyeSBmaWxlIHByZXBhcmVkIGluIGFkdmFuY2UuCisKKyAgICAgICAgUmV0dXJuOgorICAgICAgICAJVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworI2lmbmRlZiBVQ09TCitJTlQgU2V0X0FURV9Mb2FkX0UyUF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlCT09MRUFOCQkgICAgcmV0ID0gRkFMU0U7CisJUFVDSEFSCQkJc3JjID0gRUVQUk9NX0JJTl9GSUxFX05BTUU7CisJc3RydWN0IGZpbGUJCSpzcmNmOworCUlOVDMyIAkJCXJldHZhbCwgb3JnZnN1aWQsIG9yZ2ZzZ2lkOworICAgCW1tX3NlZ21lbnRfdAlvcmdmczsKKwlVU0hPUlQgCQkJV3JpdGVFRVBST01bKEVFUFJPTV9TSVpFLzIpXTsKKwlVSU5UMzIJCQlGaWxlTGVuZ3RoID0gMDsKKwlVSU5UMzIgCQkJdmFsdWUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCisJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiPT09PiAlcyAodmFsdWU9JWQpXG5cbiIsIF9fZnVuY19fLCB2YWx1ZSkpOworCisJaWYgKHZhbHVlID4gMCkKKwl7CisJCS8qIHplcm8gdGhlIGUycCBidWZmZXIgKi8KKwkJTmRpc1plcm9NZW1vcnkoKFBVQ0hBUilXcml0ZUVFUFJPTSwgRUVQUk9NX1NJWkUpOworCisJCS8qIHNhdmUgdWlkIGFuZCBnaWQgdXNlZCBmb3IgZmlsZXN5c3RlbSBhY2Nlc3MuCisJICAgICoqIHNldCB1c2VyIGFuZCBncm91cCB0byAwIChyb290KQorCSAgICAqLworCQlvcmdmc3VpZCA9IGN1cnJlbnQtPmZzdWlkOworCQlvcmdmc2dpZCA9IGN1cnJlbnQtPmZzZ2lkOworCQkvKiBhcyByb290ICovCisJCWN1cnJlbnQtPmZzdWlkID0gY3VycmVudC0+ZnNnaWQgPSAwOworICAgIAlvcmdmcyA9IGdldF9mcygpOworICAgIAlzZXRfZnMoS0VSTkVMX0RTKTsKKworCQlkbworCQl7CisJCQkvKiBvcGVuIHRoZSBiaW4gZmlsZSAqLworCQkJc3JjZiA9IGZpbHBfb3BlbihzcmMsIE9fUkRPTkxZLCAwKTsKKworCQkJaWYgKElTX0VSUihzcmNmKSkKKwkJCXsKKwkJCQlhdGVfcHJpbnQoIiVzIC0gRXJyb3IgJWxkIG9wZW5pbmcgJXNcbiIsIF9fZnVuY19fLCAtUFRSX0VSUihzcmNmKSwgc3JjKTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJLyogdGhlIG9iamVjdCBtdXN0IGhhdmUgYSByZWFkIG1ldGhvZCAqLworCQkJaWYgKChzcmNmLT5mX29wID09IE5VTEwpIHx8IChzcmNmLT5mX29wLT5yZWFkID09IE5VTEwpKQorCQkJeworCQkJCWF0ZV9wcmludCgiJXMgLSAlcyBkb2VzIG5vdCBoYXZlIGEgcmVhZCBtZXRob2RcbiIsIF9fZnVuY19fLCBzcmMpOworCQkJCWJyZWFrOworCQkJfQorCisJCQkvKiByZWFkIHRoZSBmaXJtd2FyZSBmcm9tIHRoZSBmaWxlICouYmluICovCisJCQlGaWxlTGVuZ3RoID0gc3JjZi0+Zl9vcC0+cmVhZChzcmNmLAorCQkJCQkJCQkJCSAgKFBVQ0hBUilXcml0ZUVFUFJPTSwKKwkJCQkJCQkJCQkgIEVFUFJPTV9TSVpFLAorCQkJCQkJCQkJCSAgJnNyY2YtPmZfcG9zKTsKKworCQkJaWYgKEZpbGVMZW5ndGggIT0gRUVQUk9NX1NJWkUpCisJCQl7CisJCQkJYXRlX3ByaW50KCIlczogZXJyb3IgZmlsZSBsZW5ndGggKD0lZCkgaW4gZTJwLmJpblxuIiwKKwkJCQkJICAgX19mdW5jX18sIEZpbGVMZW5ndGgpOworCQkJCWJyZWFrOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCS8qIHdyaXRlIHRoZSBjb250ZW50IG9mIC5iaW4gZmlsZSB0byBFRVBST00gKi8KKwkJCQlydF9lZV93cml0ZV9hbGwocEFkLCBXcml0ZUVFUFJPTSk7CisJCQkJcmV0ID0gVFJVRTsKKwkJCX0KKwkJCWJyZWFrOworCQl9IHdoaWxlKFRSVUUpOworCisJCS8qIGNsb3NlIGZpcm13YXJlIGZpbGUgKi8KKwkJaWYgKElTX0VSUihzcmNmKSkKKwkJeworCQkJCTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXJldHZhbCA9IGZpbHBfY2xvc2Uoc3JjZiwgTlVMTCk7CisJCQlpZiAocmV0dmFsKQorCQkJeworCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIi0tPiBFcnJvciAlZCBjbG9zaW5nICVzXG4iLCAtcmV0dmFsLCBzcmMpKTsKKworCQkJfQorCQl9CisKKwkJLyogcmVzdG9yZSAqLworCQlzZXRfZnMob3JnZnMpOworCQljdXJyZW50LT5mc3VpZCA9IG9yZ2ZzdWlkOworCQljdXJyZW50LT5mc2dpZCA9IG9yZ2ZzZ2lkOworCX0KKyAgICBBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCI8PT09ICVzIChyZXQ9JWQpXG4iLCBfX2Z1bmNfXywgcmV0KSk7CisKKyAgICByZXR1cm4gcmV0OworCit9CisjZWxzZQorSU5UIFNldF9BVEVfTG9hZF9FMlBfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJVVNIT1JUIAkJCVdyaXRlRUVQUk9NWyhFRVBST01fU0laRS8yKV07CisJc3RydWN0IGl3cmVxCSp3cnEgPSAoc3RydWN0IGl3cmVxICopYXJnOworCisJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PiAlcyAod3JxLT51LmRhdGEubGVuZ3RoID0gJWQpXG5cbiIsIF9fZnVuY19fLCB3cnEtPnUuZGF0YS5sZW5ndGgpKTsKKworCWlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gRUVQUk9NX1NJWkUpCisJeworCQlhdGVfcHJpbnQoIiVzOiBlcnJvciBsZW5ndGggKD0lZCkgZnJvbSBob3N0XG4iLAorCQkJICAgX19mdW5jX18sIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCXJldHVybiBGQUxTRTsKKwl9CisJZWxzZS8qICh3cnEtPnUuZGF0YS5sZW5ndGggPT0gRUVQUk9NX1NJWkUpICovCisJeworCQkvKiB6ZXJvIHRoZSBlMnAgYnVmZmVyICovCisJCU5kaXNaZXJvTWVtb3J5KChQVUNIQVIpV3JpdGVFRVBST00sIEVFUFJPTV9TSVpFKTsKKworCQkvKiBmaWxsIHRoZSBsb2NhbCBidWZmZXIgKi8KKwkJTmRpc01vdmVNZW1vcnkoKFBVQ0hBUilXcml0ZUVFUFJPTSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKworCQlkbworCQl7CisJCQkJLyogd3JpdGUgdGhlIGNvbnRlbnQgb2YgLmJpbiBmaWxlIHRvIEVFUFJPTSAqLworCQkJCXJ0X2VlX3dyaXRlX2FsbChwQWQsIFdyaXRlRUVQUk9NKTsKKworCQl9IHdoaWxlKEZBTFNFKTsKKwkJfQorCisgICAgQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPD09PSAlc1xuIiwgX19mdW5jX18pKTsKKworICAgIHJldHVybiBUUlVFOworCit9CisjZW5kaWYgLy8gIVVDT1MgLy8KKworSU5UIFNldF9BVEVfUmVhZF9FMlBfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJVVNIT1JUIGJ1ZmZlcltFRVBST01fU0laRS8yXTsKKwlVU0hPUlQgKnA7CisJaW50IGk7CisKKwlydF9lZV9yZWFkX2FsbChwQWQsIChVU0hPUlQgKilidWZmZXIpOworCXAgPSBidWZmZXI7CisJZm9yIChpID0gMDsgaSA8IChFRVBST01fU0laRS8yKTsgaSsrKQorCXsKKwkJYXRlX3ByaW50KCIlNC40eCAiLCAqcCk7CisJCWlmICgoKGkrMSkgJSAxNikgPT0gMCkKKwkJCWF0ZV9wcmludCgiXG4iKTsKKwkJcCsrOworCX0KKwlyZXR1cm4gVFJVRTsKK30KKworSU5UCVNldF9BVEVfU2hvd19Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlhdGVfcHJpbnQoIk1vZGU9JWRcbiIsIHBBZC0+YXRlLk1vZGUpOworCWF0ZV9wcmludCgiVHhQb3dlcjA9JWRcbiIsIHBBZC0+YXRlLlR4UG93ZXIwKTsKKwlhdGVfcHJpbnQoIlR4UG93ZXIxPSVkXG4iLCBwQWQtPmF0ZS5UeFBvd2VyMSk7CisJYXRlX3ByaW50KCJUeEFudGVubmFTZWw9JWRcbiIsIHBBZC0+YXRlLlR4QW50ZW5uYVNlbCk7CisJYXRlX3ByaW50KCJSeEFudGVubmFTZWw9JWRcbiIsIHBBZC0+YXRlLlJ4QW50ZW5uYVNlbCk7CisJYXRlX3ByaW50KCJCQlBDdXJyZW50Qlc9JWRcbiIsIHBBZC0+YXRlLlR4V0kuQlcpOworCWF0ZV9wcmludCgiR0k9JWRcbiIsIHBBZC0+YXRlLlR4V0kuU2hvcnRHSSk7CisJYXRlX3ByaW50KCJNQ1M9JWRcbiIsIHBBZC0+YXRlLlR4V0kuTUNTKTsKKwlhdGVfcHJpbnQoIlR4TW9kZT0lZFxuIiwgcEFkLT5hdGUuVHhXSS5QSFlNT0RFKTsKKwlhdGVfcHJpbnQoIkFkZHIxPSUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorCQlwQWQtPmF0ZS5BZGRyMVswXSwgcEFkLT5hdGUuQWRkcjFbMV0sIHBBZC0+YXRlLkFkZHIxWzJdLCBwQWQtPmF0ZS5BZGRyMVszXSwgcEFkLT5hdGUuQWRkcjFbNF0sIHBBZC0+YXRlLkFkZHIxWzVdKTsKKwlhdGVfcHJpbnQoIkFkZHIyPSUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorCQlwQWQtPmF0ZS5BZGRyMlswXSwgcEFkLT5hdGUuQWRkcjJbMV0sIHBBZC0+YXRlLkFkZHIyWzJdLCBwQWQtPmF0ZS5BZGRyMlszXSwgcEFkLT5hdGUuQWRkcjJbNF0sIHBBZC0+YXRlLkFkZHIyWzVdKTsKKwlhdGVfcHJpbnQoIkFkZHIzPSUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorCQlwQWQtPmF0ZS5BZGRyM1swXSwgcEFkLT5hdGUuQWRkcjNbMV0sIHBBZC0+YXRlLkFkZHIzWzJdLCBwQWQtPmF0ZS5BZGRyM1szXSwgcEFkLT5hdGUuQWRkcjNbNF0sIHBBZC0+YXRlLkFkZHIzWzVdKTsKKwlhdGVfcHJpbnQoIkNoYW5uZWw9JWRcbiIsIHBBZC0+YXRlLkNoYW5uZWwpOworCWF0ZV9wcmludCgiVHhMZW5ndGg9JWRcbiIsIHBBZC0+YXRlLlR4TGVuZ3RoKTsKKwlhdGVfcHJpbnQoIlR4Q291bnQ9JXVcbiIsIHBBZC0+YXRlLlR4Q291bnQpOworCWF0ZV9wcmludCgiUkZGcmVxT2Zmc2V0PSVkXG4iLCBwQWQtPmF0ZS5SRkZyZXFPZmZzZXQpOworCWF0ZV9wcmludChLRVJOX0VNRVJHICJTZXRfQVRFX1Nob3dfUHJvYyBTdWNjZXNzXG4iKTsKKwlyZXR1cm4gVFJVRTsKK30KKworSU5UCVNldF9BVEVfSGVscF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlhdGVfcHJpbnQoIkFURT1BVEVTVEFSVCwgQVRFU1RPUCwgVFhDT05ULCBUWENBUlIsIFRYRlJBTUUsIFJYRlJBTUVcbiIpOworCWF0ZV9wcmludCgiQVRFREFcbiIpOworCWF0ZV9wcmludCgiQVRFU0FcbiIpOworCWF0ZV9wcmludCgiQVRFQlNTSURcbiIpOworCWF0ZV9wcmludCgiQVRFQ0hBTk5FTCwgcmFuZ2U6MH4xNCh1bmxlc3MgQSBiYW5kICEpXG4iKTsKKwlhdGVfcHJpbnQoIkFURVRYUE9XMCwgc2V0IHBvd2VyIGxldmVsIG9mIGFudGVubmEgMS5cbiIpOworCWF0ZV9wcmludCgiQVRFVFhQT1cxLCBzZXQgcG93ZXIgbGV2ZWwgb2YgYW50ZW5uYSAyLlxuIik7CisJYXRlX3ByaW50KCJBVEVUWEFOVCwgc2V0IFRYIGFudGVubmEuIDA6YWxsLCAxOmFudGVubmEgb25lLCAyOmFudGVubmEgdHdvLlxuIik7CisJYXRlX3ByaW50KCJBVEVSWEFOVCwgc2V0IFJYIGFudGVubmEuMDphbGwsIDE6YW50ZW5uYSBvbmUsIDI6YW50ZW5uYSB0d28sIDM6YW50ZW5uYSB0aHJlZS5cbiIpOworCWF0ZV9wcmludCgiQVRFVFhGUkVRT0ZGU0VULCBzZXQgZnJlcXVlbmN5IG9mZnNldCwgcmFuZ2UgMH42M1xuIik7CisJYXRlX3ByaW50KCJBVEVUWEJXLCBzZXQgQmFuZFdpZHRoLCAwOjIwTUh6LCAxOjQwTUh6LlxuIik7CisJYXRlX3ByaW50KCJBVEVUWExFTiwgc2V0IEZyYW1lIGxlbmd0aCwgcmFuZ2UgMjR+JWRcbiIsIChNQVhfRlJBTUVfU0laRSAtIDM0LyogPT0gMjMxMiAqLykpOworCWF0ZV9wcmludCgiQVRFVFhDTlQsIHNldCBob3cgbWFueSBmcmFtZSBnb2luZyB0byB0cmFuc21pdC5cbiIpOworCWF0ZV9wcmludCgiQVRFVFhNQ1MsIHNldCBNQ1MsIHJlZmVyZW5jZSB0byByYXRlIHRhYmxlLlxuIik7CisJYXRlX3ByaW50KCJBVEVUWE1PREUsIHNldCBNb2RlIDA6Q0NLLCAxOk9GRE0sIDI6SFQtTWl4LCAzOkdyZWVuRmllbGQsIHJlZmVyZW5jZSB0byByYXRlIHRhYmxlLlxuIik7CisJYXRlX3ByaW50KCJBVEVUWEdJLCBzZXQgR0kgaW50ZXJ2YWwsIDA6TG9uZywgMTpTaG9ydFxuIik7CisJYXRlX3ByaW50KCJBVEVSWEZFUiwgMDpkaXNhYmxlIFJ4IEZyYW1lIGVycm9yIHJhdGUuIDE6ZW5hYmxlIFJ4IEZyYW1lIGVycm9yIHJhdGUuXG4iKTsKKwlhdGVfcHJpbnQoIkFURVJSRiwgc2hvdyBhbGwgUkYgcmVnaXN0ZXJzLlxuIik7CisJYXRlX3ByaW50KCJBVEVXUkYxLCBzZXQgUkYxIHJlZ2lzdGVyLlxuIik7CisJYXRlX3ByaW50KCJBVEVXUkYyLCBzZXQgUkYyIHJlZ2lzdGVyLlxuIik7CisJYXRlX3ByaW50KCJBVEVXUkYzLCBzZXQgUkYzIHJlZ2lzdGVyLlxuIik7CisJYXRlX3ByaW50KCJBVEVXUkY0LCBzZXQgUkY0IHJlZ2lzdGVyLlxuIik7CisJYXRlX3ByaW50KCJBVEVMREUyUCwgbG9hZCBFRVBST00gZnJvbSAuYmluIGZpbGUuXG4iKTsKKwlhdGVfcHJpbnQoIkFURVJFMlAsIGRpc3BsYXkgYWxsIEVFUFJPTSBjb250ZW50LlxuIik7CisJYXRlX3ByaW50KCJBVEVTSE9XLCBkaXNwbGF5IGFsbCBwYXJhbWV0ZXJzIG9mIEFURS5cbiIpOworCWF0ZV9wcmludCgiQVRFSEVMUCwgb25saW5lIGhlbHAuXG4iKTsKKworCXJldHVybiBUUlVFOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisKKwlBc2ljU3dpdGNoQ2hhbm5lbCgpIGRlZGljYXRlZCBmb3IgQVRFLgorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIEFURUFzaWNTd2l0Y2hDaGFubmVsKAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCVVJTlQzMiBSMiA9IDAsIFIzID0gREVGQVVMVF9SRl9UWF9QT1dFUiwgUjQgPSAwLCBWYWx1ZSA9IDA7CisJQ0hBUiBUeFB3ZXIgPSAwLCBUeFB3ZXIyID0gMDsKKwlVQ0hBUiBpbmRleCwgQmJwVmFsdWUgPSAwLCBSNjYgPSAweDMwOworCVJUTVBfUkZfUkVHUyAqUkZSZWdUYWJsZTsKKwlVQ0hBUiBDaGFubmVsOworCisjaWZkZWYgUkFMSU5LXzI4eHhfUUEKKwlpZiAoKHBBZC0+YXRlLmJRQVR4U3RhcnQgPT0gVFJVRSkgfHwgKHBBZC0+YXRlLmJRQVJ4U3RhcnQgPT0gVFJVRSkpCisJeworCQlpZiAocEFkLT5hdGUuQ2hhbm5lbCAhPSBwQWQtPkxhdGNoUmZSZWdzLkNoYW5uZWwpCisJCXsKKwkJCXBBZC0+YXRlLkNoYW5uZWwgPSBwQWQtPkxhdGNoUmZSZWdzLkNoYW5uZWw7CisJCX0KKwkJcmV0dXJuOworCX0KKwllbHNlCisjZW5kaWYgLy8gUkFMSU5LXzI4eHhfUUEgLy8KKwlDaGFubmVsID0gcEFkLT5hdGUuQ2hhbm5lbDsKKworCS8vIFNlbGVjdCBhbnRlbm5hCisJQXNpY0FudGVubmFTZWxlY3QocEFkLCBDaGFubmVsKTsKKworCS8vIGZpbGwgVHggcG93ZXIgdmFsdWUKKwlUeFB3ZXIgPSBwQWQtPmF0ZS5UeFBvd2VyMDsKKwlUeFB3ZXIyID0gcEFkLT5hdGUuVHhQb3dlcjE7CisKKwlSRlJlZ1RhYmxlID0gUkYyODUwUmVnVGFibGU7CisKKwlzd2l0Y2ggKHBBZC0+UmZJY1R5cGUpCisJeworCQkvKiBCdXQgb25seSAyODUwIGFuZCAyNzUwIHN1cHBvcnQgNS41R0h6IGJhbmQuLi4gKi8KKwkJY2FzZSBSRklDXzI4MjA6CisJCWNhc2UgUkZJQ18yODUwOgorCQljYXNlIFJGSUNfMjcyMDoKKwkJY2FzZSBSRklDXzI3NTA6CisKKwkJCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IE5VTV9PRl8yODUwX0NITkw7IGluZGV4KyspCisJCQl7CisJCQkJaWYgKENoYW5uZWwgPT0gUkZSZWdUYWJsZVtpbmRleF0uQ2hhbm5lbCkKKwkJCQl7CisJCQkJCVIyID0gUkZSZWdUYWJsZVtpbmRleF0uUjI7CisJCQkJCWlmIChwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoID09IDEpCisJCQkJCXsKKwkJCQkJCVIyIHw9IDB4NDAwMDsJLy8gSWYgVFhwYXRoIGlzIDEsIGJpdCAxNCA9IDE7CisJCQkJCX0KKworCQkJCQlpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAyKQorCQkJCQl7CisJCQkJCQlzd2l0Y2ggKHBBZC0+YXRlLlJ4QW50ZW5uYVNlbCkKKwkJCQkJCXsKKwkJCQkJCQljYXNlIDE6CisJCQkJCQkJCVIyIHw9IDB4MjAwNDA7CisJCQkJCQkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCAmQmJwVmFsdWUpOworCQkJCQkJCQlCYnBWYWx1ZSAmPSAweEU0OworCQkJCQkJCQlCYnBWYWx1ZSB8PSAweDAwOworCQkJCQkJCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsIEJicFZhbHVlKTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSAyOgorCQkJCQkJCQlSMiB8PSAweDEwMDQwOworCQkJCQkJCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgJkJicFZhbHVlKTsKKwkJCQkJCQkJQmJwVmFsdWUgJj0gMHhFNDsKKwkJCQkJCQkJQmJwVmFsdWUgfD0gMHgwMTsKKwkJCQkJCQkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCBCYnBWYWx1ZSk7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWRlZmF1bHQ6CisJCQkJCQkJCVIyIHw9IDB4NDA7CisJCQkJCQkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCAmQmJwVmFsdWUpOworCQkJCQkJCQlCYnBWYWx1ZSAmPSAweEU0OworCQkJCQkJCQkvKiBPbmx5IGVuYWJsZSB0d28gQW50ZW5uYSB0byByZWNlaXZlLiAqLworCQkJCQkJCQlCYnBWYWx1ZSB8PSAweDA4OworCQkJCQkJCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsIEJicFZhbHVlKTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJZWxzZSBpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAxKQorCQkJCQl7CisJCQkJCQlSMiB8PSAweDIwMDQwOwkvLyB3cml0ZSAxIHRvIG9mZiBSeFBhdGgKKwkJCQkJfQorCisJCQkJCWlmIChwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoID09IDIpCisJCQkJCXsKKwkJCQkJCWlmIChwQWQtPmF0ZS5UeEFudGVubmFTZWwgPT0gMSkKKwkJCQkJCXsKKwkJCQkJCQlSMiB8PSAweDQwMDA7CS8vIElmIFRYIEFudGVubmEgc2VsZWN0IGlzIDEgLCBiaXQgMTQgPSAxOyBEaXNhYmxlIEFudCAyCisJCQkJCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjEsICZCYnBWYWx1ZSk7CisJCQkJCQkJQmJwVmFsdWUgJj0gMHhFNzsJCS8vMTExMDAxMTFCCisJCQkJCQkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IxLCBCYnBWYWx1ZSk7CisJCQkJCQl9CisJCQkJCQllbHNlIGlmIChwQWQtPmF0ZS5UeEFudGVubmFTZWwgPT0gMikKKwkJCQkJCXsKKwkJCQkJCQlSMiB8PSAweDgwMDA7CS8vIElmIFRYIEFudGVubmEgc2VsZWN0IGlzIDIgLCBiaXQgMTUgPSAxOyBEaXNhYmxlIEFudCAxCisJCQkJCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjEsICZCYnBWYWx1ZSk7CisJCQkJCQkJQmJwVmFsdWUgJj0gMHhFNzsKKwkJCQkJCQlCYnBWYWx1ZSB8PSAweDA4OworCQkJCQkJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMSwgQmJwVmFsdWUpOworCQkJCQkJfQorCQkJCQkJZWxzZQorCQkJCQkJeworCQkJCQkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IxLCAmQmJwVmFsdWUpOworCQkJCQkJCUJicFZhbHVlICY9IDB4RTc7CisJCQkJCQkJQmJwVmFsdWUgfD0gMHgxMDsKKwkJCQkJCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjEsIEJicFZhbHVlKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQlpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAzKQorCQkJCQl7CisJCQkJCQlzd2l0Y2ggKHBBZC0+YXRlLlJ4QW50ZW5uYVNlbCkKKwkJCQkJCXsKKwkJCQkJCQljYXNlIDE6CisJCQkJCQkJCVIyIHw9IDB4MjAwNDA7CisJCQkJCQkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCAmQmJwVmFsdWUpOworCQkJCQkJCQlCYnBWYWx1ZSAmPSAweEU0OworCQkJCQkJCQlCYnBWYWx1ZSB8PSAweDAwOworCQkJCQkJCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsIEJicFZhbHVlKTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSAyOgorCQkJCQkJCQlSMiB8PSAweDEwMDQwOworCQkJCQkJCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgJkJicFZhbHVlKTsKKwkJCQkJCQkJQmJwVmFsdWUgJj0gMHhFNDsKKwkJCQkJCQkJQmJwVmFsdWUgfD0gMHgwMTsKKwkJCQkJCQkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCBCYnBWYWx1ZSk7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgMzoKKwkJCQkJCQkJUjIgfD0gMHgzMDAwMDsKKwkJCQkJCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsICZCYnBWYWx1ZSk7CisJCQkJCQkJCUJicFZhbHVlICY9IDB4RTQ7CisJCQkJCQkJCUJicFZhbHVlIHw9IDB4MDI7CisJCQkJCQkJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgQmJwVmFsdWUpOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQlkZWZhdWx0OgorCQkJCQkJCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgJkJicFZhbHVlKTsKKwkJCQkJCQkJQmJwVmFsdWUgJj0gMHhFNDsKKwkJCQkJCQkJQmJwVmFsdWUgfD0gMHgxMDsKKwkJCQkJCQkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCBCYnBWYWx1ZSk7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQl9CisKKwkJCQkJaWYgKENoYW5uZWwgPiAxNCkKKwkJCQkJeworCQkJCQkJLy8gaW5pdGlhbGl6ZSBSMywgUjQKKwkJCQkJCVIzID0gKFJGUmVnVGFibGVbaW5kZXhdLlIzICYgMHhmZmZmYzFmZik7CisJCQkJCQlSNCA9IChSRlJlZ1RhYmxlW2luZGV4XS5SNCAmICh+MHgwMDFmODdjMCkpIHwgKHBBZC0+YXRlLlJGRnJlcU9mZnNldCA8PCAxNSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFjY29yZGluZyB0aGUgUm9yeSdzIHN1Z2dlc3Rpb24gdG8gc29sdmUgdGhlIG1pZGRsZSByYW5nZSBpc3N1ZS4KKwkJCQkJCS8vIDUuNUcgYmFuZCBwb3dlciByYW5nZTogMHhGOX4wWDBGLCBUWDAgUmVnMyBiaXQ5L1RYMSBSZWc0IGJpdDY9IjAiIG1lYW5zIHRoZSBUWCBwb3dlciByZWR1Y2UgN2RCCisJCQkJCQkvLyBSMworCQkJCQkJaWYgKChUeFB3ZXIgPj0gLTcpICYmIChUeFB3ZXIgPCAwKSkKKwkJCQkJCXsKKwkJCQkJCQlUeFB3ZXIgPSAoNytUeFB3ZXIpOworCQkJCQkJCVR4UHdlciA9IChUeFB3ZXIgPiAweEYpID8gKDB4RikgOiAoVHhQd2VyKTsKKwkJCQkJCQlSMyB8PSAoVHhQd2VyIDw8IDEwKTsKKwkJCQkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBVEVBc2ljU3dpdGNoQ2hhbm5lbDogVHhQd2VyPSVkIFxuIiwgVHhQd2VyKSk7CisJCQkJCQl9CisJCQkJCQllbHNlCisJCQkJCQl7CisJCQkJCQkJVHhQd2VyID0gKFR4UHdlciA+IDB4RikgPyAoMHhGKSA6IChUeFB3ZXIpOworCQkJCQkJCVIzIHw9IChUeFB3ZXIgPDwgMTApIHwgKDEgPDwgOSk7CisJCQkJCQl9CisKKwkJCQkJCS8vIFI0CisJCQkJCQlpZiAoKFR4UHdlcjIgPj0gLTcpICYmIChUeFB3ZXIyIDwgMCkpCisJCQkJCQl7CisJCQkJCQkJVHhQd2VyMiA9ICg3K1R4UHdlcjIpOworCQkJCQkJCVR4UHdlcjIgPSAoVHhQd2VyMiA+IDB4RikgPyAoMHhGKSA6IChUeFB3ZXIyKTsKKwkJCQkJCQlSNCB8PSAoVHhQd2VyMiA8PCA3KTsKKwkJCQkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBVEVBc2ljU3dpdGNoQ2hhbm5lbDogVHhQd2VyMj0lZCBcbiIsIFR4UHdlcjIpKTsKKwkJCQkJCX0KKwkJCQkJCWVsc2UKKwkJCQkJCXsKKwkJCQkJCQlUeFB3ZXIyID0gKFR4UHdlcjIgPiAweEYpID8gKDB4RikgOiAoVHhQd2VyMik7CisJCQkJCQkJUjQgfD0gKFR4UHdlcjIgPDwgNykgfCAoMSA8PCA2KTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCVIzID0gKFJGUmVnVGFibGVbaW5kZXhdLlIzICYgMHhmZmZmYzFmZikgfCAoVHhQd2VyIDw8IDkpOyAvLyBzZXQgVFggcG93ZXIwCisJCQkJCQlSNCA9IChSRlJlZ1RhYmxlW2luZGV4XS5SNCAmICh+MHgwMDFmODdjMCkpIHwgKHBBZC0+YXRlLlJGRnJlcU9mZnNldCA8PCAxNSkgfCAoVHhQd2VyMiA8PDYpOy8vIFNldCBmcmVxIG9mZnNldCAmIFR4UHdyMQorCQkJCQl9CisKKwkJCQkJLy8gQmFzZWQgb24gQkJQIGN1cnJlbnQgbW9kZSBiZWZvcmUgY2hhbmdpbmcgUkYgY2hhbm5lbC4KKwkJCQkJaWYgKHBBZC0+YXRlLlR4V0kuQlcgPT0gQldfNDApCisJCQkJCXsKKwkJCQkJCVI0IHw9MHgyMDAwMDA7CisJCQkJCX0KKworCQkJCQkvLyBVcGRhdGUgdmFyaWFibGVzCisJCQkJCXBBZC0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbCA9IENoYW5uZWw7CisJCQkJCXBBZC0+TGF0Y2hSZlJlZ3MuUjEgPSBSRlJlZ1RhYmxlW2luZGV4XS5SMTsKKwkJCQkJcEFkLT5MYXRjaFJmUmVncy5SMiA9IFIyOworCQkJCQlwQWQtPkxhdGNoUmZSZWdzLlIzID0gUjM7CisJCQkJCXBBZC0+TGF0Y2hSZlJlZ3MuUjQgPSBSNDsKKworCQkJCQlSdG1wUmZJb1dyaXRlKHBBZCk7CisKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCX0KKworCS8vIENoYW5nZSBCQlAgc2V0dGluZyBkdXJpbmcgc3dpdGNoIGZyb20gYS0+ZywgZy0+YQorCWlmIChDaGFubmVsIDw9IDE0KQorCXsKKwkgICAgVUxPTkcJVHhQaW5DZmcgPSAweDAwMDUwRjBBOy8vIDIwMDcuMTAuMDkgYnkgQnJpYW4gOiAweDAwMDUwNTBBID09PiAweDAwMDUwRjBBCisKKwkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2MiwgKDB4MzcgLSBHRVRfTE5BX0dBSU4ocEFkKSkpOworCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjYzLCAoMHgzNyAtIEdFVF9MTkFfR0FJTihwQWQpKSk7CisJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjQsICgweDM3IC0gR0VUX0xOQV9HQUlOKHBBZCkpKTsKKworCQkvKiBGb3IgMVQvMlIgY2hpcCBvbmx5Li4uICovCisJICAgIGlmIChwQWQtPk5pY0NvbmZpZzIuZmllbGQuRXh0ZXJuYWxMTkFGb3JHKQorCSAgICB7CisJICAgICAgICBBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjgyLCAweDYyKTsKKwkgICAgfQorCSAgICBlbHNlCisJICAgIHsKKwkgICAgICAgIEFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SODIsIDB4ODQpOworCSAgICB9CisKKyAgICAgICAgLy8gQWNjb3JkaW5nIHRoZSBSb3J5J3Mgc3VnZ2VzdGlvbiB0byBzb2x2ZSB0aGUgbWlkZGxlIHJhbmdlIGlzc3VlLgorCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SODYsICZCYnBWYWx1ZSk7CisJCUFTU0VSVCgoQmJwVmFsdWUgPT0gMHgwMCkpOworCQlpZiAoKEJicFZhbHVlICE9IDB4MDApKQorCQl7CisJCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjg2LCAweDAwKTsKKwkJfQorCisJCS8vIDUuNUdIeiBiYW5kIHNlbGVjdGlvbiBQSU4sIGJpdDEgYW5kIGJpdDIgYXJlIGNvbXBsZW1lbnQKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9CQU5EX0NGRywgJlZhbHVlKTsKKwkJVmFsdWUgJj0gKH4weDYpOworCQlWYWx1ZSB8PSAoMHgwNCk7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX0JBTkRfQ0ZHLCBWYWx1ZSk7CisKKyAgICAgICAgLy8gVHVybiBvZmYgdW51c2VkIFBBIG9yIExOQSB3aGVuIG9ubHkgMVQgb3IgMVIuCisJCWlmIChwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoID09IDEpCisJCXsKKwkJCVR4UGluQ2ZnICY9IDB4RkZGRkZGRjM7CisJCX0KKwkJaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPT0gMSkKKwkJeworCQkJVHhQaW5DZmcgJj0gMHhGRkZGRjNGRjsKKwkJfQorCisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX1BJTl9DRkcsIFR4UGluQ2ZnKTsKKwl9CisJZWxzZQorCXsKKwkgICAgVUxPTkcJVHhQaW5DZmcgPSAweDAwMDUwRjA1Oy8vMjAwNy4xMC4wOSBieSBCcmlhbiA6IDB4MDAwNTA1MDUgPT0+IDB4MDAwNTBGMDUKKworCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjYyLCAoMHgzNyAtIEdFVF9MTkFfR0FJTihwQWQpKSk7CisJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjMsICgweDM3IC0gR0VUX0xOQV9HQUlOKHBBZCkpKTsKKwkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2NCwgKDB4MzcgLSBHRVRfTE5BX0dBSU4ocEFkKSkpOworCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjgyLCAweEYyKTsKKworICAgICAgICAvLyBBY2NvcmRpbmcgdGhlIFJvcnkncyBzdWdnZXN0aW9uIHRvIHNvbHZlIHRoZSBtaWRkbGUgcmFuZ2UgaXNzdWUuCisJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I4NiwgJkJicFZhbHVlKTsKKwkJQVNTRVJUKChCYnBWYWx1ZSA9PSAweDAwKSk7CisJCWlmICgoQmJwVmFsdWUgIT0gMHgwMCkpCisJCXsKKwkJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SODYsIDB4MDApOworCQl9CisJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I5MSwgJkJicFZhbHVlKTsKKwkJQVNTRVJUKChCYnBWYWx1ZSA9PSAweDA0KSk7CisKKwkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjkyLCAmQmJwVmFsdWUpOworCQlBU1NFUlQoKEJicFZhbHVlID09IDB4MDApKTsKKworCQkvLyA1LjVHSHogYmFuZCBzZWxlY3Rpb24gUElOLCBiaXQxIGFuZCBiaXQyIGFyZSBjb21wbGVtZW50CisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfQkFORF9DRkcsICZWYWx1ZSk7CisJCVZhbHVlICY9ICh+MHg2KTsKKwkJVmFsdWUgfD0gKDB4MDIpOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9CQU5EX0NGRywgVmFsdWUpOworCisgICAgICAgIC8vIFR1cm4gb2ZmIHVudXNlZCBQQSBvciBMTkEgd2hlbiBvbmx5IDFUIG9yIDFSLgorCQlpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCA9PSAxKQorCQl7CisJCQlUeFBpbkNmZyAmPSAweEZGRkZGRkYzOworCSAgICB9CisJCWlmIChwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDEpCisJCXsKKwkJCVR4UGluQ2ZnICY9IDB4RkZGRkYzRkY7CisJCX0KKworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9QSU5fQ0ZHLCBUeFBpbkNmZyk7CisJfQorCisgICAgLy8gUjY2IHNob3VsZCBiZSBzZXQgYWNjb3JkaW5nIHRvIENoYW5uZWwgYW5kIHVzZSAyME1IeiB3aGVuIHNjYW5uaW5nCisJaWYgKENoYW5uZWwgPD0gMTQpCisJeworCQkvLyBCRyBiYW5kCisJCVI2NiA9IDB4MkUgKyBHRVRfTE5BX0dBSU4ocEFkKTsKKwkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2NiwgUjY2KTsKKwl9CisJZWxzZQorCXsKKwkJLy8gNS41IEdIeiBiYW5kCisJCWlmIChwQWQtPmF0ZS5UeFdJLkJXID09IEJXXzIwKQorCQl7CisJCQlSNjYgPSAoVUNIQVIpKDB4MzIgKyAoR0VUX0xOQV9HQUlOKHBBZCkqNSkvMyk7CisgICAgCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY2LCBSNjYpOworCQl9CisJCWVsc2UKKwkJeworCQkJUjY2ID0gKFVDSEFSKSgweDNBICsgKEdFVF9MTkFfR0FJTihwQWQpKjUpLzMpOworCQkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2NiwgUjY2KTsKKwkJfQorCX0KKworCS8vCisJLy8gT24gMTFBLCBXZSBzaG91bGQgZGVsYXkgYW5kIHdhaXQgUkYvQkJQIHRvIGJlIHN0YWJsZQorCS8vIGFuZCB0aGUgYXBwcm9wcmlhdGUgdGltZSBzaG91bGQgYmUgMTAwMCBtaWNybyBzZWNvbmRzCisJLy8gMjAwNS8wNi8wNSAtIE9uIDExRywgV2UgYWxzbyBuZWVkIHRoaXMgZGVsYXkgdGltZS4gT3RoZXJ3aXNlIGl0J3MgZGlmZmljdWx0IHRvIHBhc3MgdGhlIFdIUUwuCisJLy8KKwlSVE1QdXNlY0RlbGF5KDEwMDApOworCisJaWYgKENoYW5uZWwgPiAxNCkKKwl7CisJCS8vIFdoZW4gNS41R0h6IGJhbmQgdGhlIExTQiBvZiBUeFB3ciB3aWxsIGJlIHVzZWQgdG8gcmVkdWNlZCA3ZEIgb3Igbm90LgorCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTd2l0Y2hDaGFubmVsIyVkKFJGPSVkLCAlZFQpIHRvICwgUjE9MHglMDhseCwgUjI9MHglMDhseCwgUjM9MHglMDhseCwgUjQ9MHglMDhseFxuIiwKKwkJCQkJCQkJICBDaGFubmVsLAorCQkJCQkJCQkgIHBBZC0+UmZJY1R5cGUsCisJCQkJCQkJCSAgcEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCwKKwkJCQkJCQkJICBwQWQtPkxhdGNoUmZSZWdzLlIxLAorCQkJCQkJCQkgIHBBZC0+TGF0Y2hSZlJlZ3MuUjIsCisJCQkJCQkJCSAgcEFkLT5MYXRjaFJmUmVncy5SMywKKwkJCQkJCQkJICBwQWQtPkxhdGNoUmZSZWdzLlI0KSk7CisJfQorCWVsc2UKKwl7CisJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlN3aXRjaENoYW5uZWwjJWQoUkY9JWQsIFB3cjA9JXUsIFB3cjE9JXUsICVkVCkgdG8gLCBSMT0weCUwOGx4LCBSMj0weCUwOGx4LCBSMz0weCUwOGx4LCBSND0weCUwOGx4XG4iLAorCQkJCQkJCQkgIENoYW5uZWwsCisJCQkJCQkJCSAgcEFkLT5SZkljVHlwZSwKKwkJCQkJCQkJICAoUjMgJiAweDAwMDAzZTAwKSA+PiA5LAorCQkJCQkJCQkgIChSNCAmIDB4MDAwMDA3YzApID4+IDYsCisJCQkJCQkJCSAgcEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCwKKwkJCQkJCQkJICBwQWQtPkxhdGNoUmZSZWdzLlIxLAorCQkJCQkJCQkgIHBBZC0+TGF0Y2hSZlJlZ3MuUjIsCisJCQkJCQkJCSAgcEFkLT5MYXRjaFJmUmVncy5SMywKKwkJCQkJCQkJICBwQWQtPkxhdGNoUmZSZWdzLlI0KSk7CisgICAgfQorfQorCisvLworLy8gSW4gZmFjdCwgbm8gb25lIHdpbGwgY2FsbCB0aGlzIHJvdXRpbmUgc28gZmFyICEKKy8vCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCUdpdmVzIENDSyBUWCByYXRlIDIgbW9yZSBkQiBUWCBwb3dlci4KKwkJVGhpcyByb3V0aW5lIHdvcmtzIG9ubHkgaW4gQVRFIG1vZGUuCisKKwkJY2FsY3VsYXRlIGRlc2lyZWQgVHggcG93ZXIgaW4gUkYgUjMuVHgwfjUsCXNob3VsZCBjb25zaWRlciAtCisJCTAuIGlmIGN1cnJlbnQgcmFkaW8gaXMgYSBub2lzeSBlbnZpcm9ubWVudCAocEFkLT5EcnNDb3VudGVycy5mTm9pc3lFbnZpcm9ubWVudCkKKwkJMS4gVHhQb3dlclBlcmNlbnRhZ2UKKwkJMi4gYXV0byBjYWxpYnJhdGlvbiBiYXNlZCBvbiBUU1NJIGZlZWRiYWNrCisJCTMuIGV4dHJhIDIgZGIgZm9yIENDSworCQk0LiAtMTAgZGIgdXBvbiB2ZXJ5LXNob3J0IGRpc3RhbmNlIChBdmdSU1NJID49IC00MGRiKSB0byBBUAorCisJTk9URTogU2luY2UgdGhpcyByb3V0aW5lIHJlcXVpcmVzIHRoZSB2YWx1ZSBvZiAocEFkLT5EcnNDb3VudGVycy5mTm9pc3lFbnZpcm9ubWVudCksCisJCWl0IHNob3VsZCBiZSBjYWxsZWQgQUZURVIgTWxtZUR5bmFtaWNUeFJhdGVTd2l0Y2hpbmcoKQorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgQVRFQXNpY0FkanVzdFR4UG93ZXIoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJSU5UCQkJaSwgajsKKwlDSEFSCQlEZWx0YVB3ciA9IDA7CisJQk9PTEVBTgkJYkF1dG9UeEFnYyA9IEZBTFNFOworCVVDSEFSCQlUc3NpUmVmLCAqcFRzc2lNaW51c0JvdW5kYXJ5LCAqcFRzc2lQbHVzQm91bmRhcnksIFR4QWdjU3RlcDsKKwlVQ0hBUgkJQmJwUjQ5ID0gMCwgaWR4OworCVBDSEFSCQlwVHhBZ2NDb21wZW5zYXRlOworCVVMT05HCQlUeFB3cls1XTsKKwlDSEFSCQlWYWx1ZTsKKworCS8qIG5vIG9uZSBjYWxscyB0aGlzIHByb2NlZHVyZSBzbyBmYXIgKi8KKwlpZiAocEFkLT5hdGUuVHhXSS5CVyA9PSBCV180MCkKKwl7CisJCWlmIChwQWQtPmF0ZS5DaGFubmVsID4gMTQpCisJCXsKKwkJCVR4UHdyWzBdID0gcEFkLT5UeDQwTVB3ckNmZ0FCYW5kWzBdOworCQkJVHhQd3JbMV0gPSBwQWQtPlR4NDBNUHdyQ2ZnQUJhbmRbMV07CisJCQlUeFB3clsyXSA9IHBBZC0+VHg0ME1Qd3JDZmdBQmFuZFsyXTsKKwkJCVR4UHdyWzNdID0gcEFkLT5UeDQwTVB3ckNmZ0FCYW5kWzNdOworCQkJVHhQd3JbNF0gPSBwQWQtPlR4NDBNUHdyQ2ZnQUJhbmRbNF07CisJCX0KKwkJZWxzZQorCQl7CisJCQlUeFB3clswXSA9IHBBZC0+VHg0ME1Qd3JDZmdHQmFuZFswXTsKKwkJCVR4UHdyWzFdID0gcEFkLT5UeDQwTVB3ckNmZ0dCYW5kWzFdOworCQkJVHhQd3JbMl0gPSBwQWQtPlR4NDBNUHdyQ2ZnR0JhbmRbMl07CisJCQlUeFB3clszXSA9IHBBZC0+VHg0ME1Qd3JDZmdHQmFuZFszXTsKKwkJCVR4UHdyWzRdID0gcEFkLT5UeDQwTVB3ckNmZ0dCYW5kWzRdOworCQl9CisJfQorCWVsc2UKKwl7CisJCWlmIChwQWQtPmF0ZS5DaGFubmVsID4gMTQpCisJCXsKKwkJCVR4UHdyWzBdID0gcEFkLT5UeDIwTVB3ckNmZ0FCYW5kWzBdOworCQkJVHhQd3JbMV0gPSBwQWQtPlR4MjBNUHdyQ2ZnQUJhbmRbMV07CisJCQlUeFB3clsyXSA9IHBBZC0+VHgyME1Qd3JDZmdBQmFuZFsyXTsKKwkJCVR4UHdyWzNdID0gcEFkLT5UeDIwTVB3ckNmZ0FCYW5kWzNdOworCQkJVHhQd3JbNF0gPSBwQWQtPlR4MjBNUHdyQ2ZnQUJhbmRbNF07CisJCX0KKwkJZWxzZQorCQl7CisJCQlUeFB3clswXSA9IHBBZC0+VHgyME1Qd3JDZmdHQmFuZFswXTsKKwkJCVR4UHdyWzFdID0gcEFkLT5UeDIwTVB3ckNmZ0dCYW5kWzFdOworCQkJVHhQd3JbMl0gPSBwQWQtPlR4MjBNUHdyQ2ZnR0JhbmRbMl07CisJCQlUeFB3clszXSA9IHBBZC0+VHgyME1Qd3JDZmdHQmFuZFszXTsKKwkJCVR4UHdyWzRdID0gcEFkLT5UeDIwTVB3ckNmZ0dCYW5kWzRdOworCQl9CisJfQorCisJLy8gVFggcG93ZXIgY29tcGVuc2F0aW9uIGZvciB0ZW1wZXJhdHVyZSB2YXJpYXRpb24gYmFzZWQgb24gVFNTSS4KKwkvLyBEbyBpdCBwZXIgNCBzZWNvbmRzLgorCWlmIChwQWQtPk1sbWUuT25lU2VjUGVyaW9kaWNSb3VuZCAlIDQgPT0gMCkKKwl7CisJCWlmIChwQWQtPmF0ZS5DaGFubmVsIDw9IDE0KQorCQl7CisJCQkvKiBiZyBjaGFubmVsICovCisJCQliQXV0b1R4QWdjICAgICAgICAgPSBwQWQtPmJBdXRvVHhBZ2NHOworCQkJVHNzaVJlZiAgICAgICAgICAgID0gcEFkLT5Uc3NpUmVmRzsKKwkJCXBUc3NpTWludXNCb3VuZGFyeSA9ICZwQWQtPlRzc2lNaW51c0JvdW5kYXJ5R1swXTsKKwkJCXBUc3NpUGx1c0JvdW5kYXJ5ICA9ICZwQWQtPlRzc2lQbHVzQm91bmRhcnlHWzBdOworCQkJVHhBZ2NTdGVwICAgICAgICAgID0gcEFkLT5UeEFnY1N0ZXBHOworCQkJcFR4QWdjQ29tcGVuc2F0ZSAgID0gJnBBZC0+VHhBZ2NDb21wZW5zYXRlRzsKKwkJfQorCQllbHNlCisJCXsKKwkJCS8qIGEgY2hhbm5lbCAqLworCQkJYkF1dG9UeEFnYyAgICAgICAgID0gcEFkLT5iQXV0b1R4QWdjQTsKKwkJCVRzc2lSZWYgICAgICAgICAgICA9IHBBZC0+VHNzaVJlZkE7CisJCQlwVHNzaU1pbnVzQm91bmRhcnkgPSAmcEFkLT5Uc3NpTWludXNCb3VuZGFyeUFbMF07CisJCQlwVHNzaVBsdXNCb3VuZGFyeSAgPSAmcEFkLT5Uc3NpUGx1c0JvdW5kYXJ5QVswXTsKKwkJCVR4QWdjU3RlcCAgICAgICAgICA9IHBBZC0+VHhBZ2NTdGVwQTsKKwkJCXBUeEFnY0NvbXBlbnNhdGUgICA9ICZwQWQtPlR4QWdjQ29tcGVuc2F0ZUE7CisJCX0KKworCQlpZiAoYkF1dG9UeEFnYykKKwkJeworCQkJLyogQmJwUjQ5IGlzIHVuc2lnbmVkIGNoYXIgKi8KKwkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I0OSwgJkJicFI0OSk7CisKKwkJCS8qIChwKSBUc3NpUGx1c0JvdW5kYXJ5R1swXSA9IDAgPSAobSkgVHNzaU1pbnVzQm91bmRhcnlHWzBdICovCisJCQkvKiBjb21wZW5zYXRlOiArNCAgICAgKzMgICArMiAgICsxICAgIDAgICAtMSAgIC0yICAgLTMgICAtNCAqIHN0ZXBzICovCisJCQkvKiBzdGVwIHZhbHVlIGlzIGRlZmluZWQgaW4gcEFkLT5UeEFnY1N0ZXBHIGZvciB0eCBwb3dlciB2YWx1ZSAqLworCisJCQkvKiBbNF0rMStbNF0gICBwNCAgICAgcDMgICBwMiAgIHAxICAgbzEgICBtMSAgIG0yICAgbTMgICBtNCAqLworCQkJLyogZXg6ICAgICAgICAgMHgwMCAweDE1IDB4MjUgMHg0NSAweDg4IDB4QTAgMHhCNSAweEQwIDB4RjAKKwkJCSAgIGFib3ZlIHZhbHVlIGFyZSBleGFtaW5lZCBpbiBtYXNzIGZhY3RvcnkgcHJvZHVjdGlvbiAqLworCQkJLyogICAgICAgICAgICAgWzRdICAgIFszXSAgWzJdICBbMV0gIFswXSAgWzFdICBbMl0gIFszXSAgWzRdICovCisKKwkJCS8qIHBsdXMgaXMgMHgxMCB+IDB4NDAsIG1pbnVzIGlzIDB4NjAgfiAweDkwICovCisJCQkvKiBpZiB2YWx1ZSBpcyBiZXR3ZWVuIHAxIH4gbzEgb3IgbzEgfiBzMSwgbm8gbmVlZCB0byBhZGp1c3QgdHggcG93ZXIgKi8KKwkJCS8qIGlmIHZhbHVlIGlzIDB4NjUsIHR4IHBvd2VyIHdpbGwgYmUgLT0gVHhBZ2NTdGVwKigyLTEpICovCisKKwkJCWlmIChCYnBSNDkgPiBwVHNzaU1pbnVzQm91bmRhcnlbMV0pCisJCQl7CisJCQkJLy8gUmVhZGluZyBpcyBsYXJnZXIgdGhhbiB0aGUgcmVmZXJlbmNlIHZhbHVlLgorCQkJCS8vIENoZWNrIGZvciBob3cgbGFyZ2Ugd2UgbmVlZCB0byBkZWNyZWFzZSB0aGUgVHggcG93ZXIuCisJCQkJZm9yIChpZHggPSAxOyBpZHggPCA1OyBpZHgrKykKKwkJCQl7CisJCQkJCWlmIChCYnBSNDkgPD0gcFRzc2lNaW51c0JvdW5kYXJ5W2lkeF0pICAvLyBGb3VuZCB0aGUgcmFuZ2UKKwkJCQkJCWJyZWFrOworCQkJCX0KKwkJCQkvLyBUaGUgaW5kZXggaXMgdGhlIHN0ZXAgd2Ugc2hvdWxkIGRlY3JlYXNlLCBpZHggPSAwIG1lYW5zIHRoZXJlIGlzIG5vdGhpbmcgdG8gY29tcGVuc2F0ZQorLy8JCQkJaWYgKFIzID4gKFVMT05HKSAoVHhBZ2NTdGVwICogKGlkeC0xKSkpCisJCQkJCSpwVHhBZ2NDb21wZW5zYXRlID0gLShUeEFnY1N0ZXAgKiAoaWR4LTEpKTsKKy8vCQkJCWVsc2UKKy8vCQkJCQkqcFR4QWdjQ29tcGVuc2F0ZSA9IC0oKFVDSEFSKVIzKTsKKworCQkJCURlbHRhUHdyICs9ICgqcFR4QWdjQ29tcGVuc2F0ZSk7CisJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0gVHggUG93ZXIsIEJCUCBSMT0leCwgVHNzaVJlZj0leCwgVHhBZ2NTdGVwPSV4LCBzdGVwID0gLSVkXG4iLAorCQkJCQlCYnBSNDksIFRzc2lSZWYsIFR4QWdjU3RlcCwgaWR4LTEpKTsKKwkJCX0KKwkJCWVsc2UgaWYgKEJicFI0OSA8IHBUc3NpUGx1c0JvdW5kYXJ5WzFdKQorCQkJeworCQkJCS8vIFJlYWRpbmcgaXMgc21hbGxlciB0aGFuIHRoZSByZWZlcmVuY2UgdmFsdWUKKwkJCQkvLyBjaGVjayBmb3IgaG93IGxhcmdlIHdlIG5lZWQgdG8gaW5jcmVhc2UgdGhlIFR4IHBvd2VyCisJCQkJZm9yIChpZHggPSAxOyBpZHggPCA1OyBpZHgrKykKKwkJCQl7CisJCQkJCWlmIChCYnBSNDkgPj0gcFRzc2lQbHVzQm91bmRhcnlbaWR4XSkgICAvLyBGb3VuZCB0aGUgcmFuZ2UKKwkJCQkJCWJyZWFrOworCQkJCX0KKwkJCQkvLyBUaGUgaW5kZXggaXMgdGhlIHN0ZXAgd2Ugc2hvdWxkIGluY3JlYXNlLCBpZHggPSAwIG1lYW5zIHRoZXJlIGlzIG5vdGhpbmcgdG8gY29tcGVuc2F0ZQorCQkJCSpwVHhBZ2NDb21wZW5zYXRlID0gVHhBZ2NTdGVwICogKGlkeC0xKTsKKwkJCQlEZWx0YVB3ciArPSAoKnBUeEFnY0NvbXBlbnNhdGUpOworCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIisrIFR4IFBvd2VyLCBCQlAgUjE9JXgsIFRzc2lSZWY9JXgsIFR4QWdjU3RlcD0leCwgc3RlcCA9ICslZFxuIiwKKwkJCQkJQmJwUjQ5LCBUc3NpUmVmLCBUeEFnY1N0ZXAsIGlkeC0xKSk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJKnBUeEFnY0NvbXBlbnNhdGUgPSAwOworCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiAgIFR4IFBvd2VyLCBCQlAgUjE9JXgsIFRzc2lSZWY9JXgsIFR4QWdjU3RlcD0leCwgc3RlcCA9ICslZFxuIiwKKwkJCQkJQmJwUjQ5LCBUc3NpUmVmLCBUeEFnY1N0ZXAsIDApKTsKKwkJCX0KKwkJfQorCX0KKwllbHNlCisJeworCQlpZiAocEFkLT5hdGUuQ2hhbm5lbCA8PSAxNCkKKwkJeworCQkJYkF1dG9UeEFnYyAgICAgICAgID0gcEFkLT5iQXV0b1R4QWdjRzsKKwkJCXBUeEFnY0NvbXBlbnNhdGUgICA9ICZwQWQtPlR4QWdjQ29tcGVuc2F0ZUc7CisJCX0KKwkJZWxzZQorCQl7CisJCQliQXV0b1R4QWdjICAgICAgICAgPSBwQWQtPmJBdXRvVHhBZ2NBOworCQkJcFR4QWdjQ29tcGVuc2F0ZSAgID0gJnBBZC0+VHhBZ2NDb21wZW5zYXRlQTsKKwkJfQorCisJCWlmIChiQXV0b1R4QWdjKQorCQkJRGVsdGFQd3IgKz0gKCpwVHhBZ2NDb21wZW5zYXRlKTsKKwl9CisKKwkvKiBjYWxjdWxhdGUgZGVsdGEgcG93ZXIgYmFzZWQgb24gdGhlIHBlcmNlbnRhZ2Ugc3BlY2lmaWVkIGZyb20gVUkgKi8KKwkvLyBFMlBST00gc2V0dGluZyBpcyBjYWxpYnJhdGVkIGZvciBtYXhpbXVtIFRYIHBvd2VyIChpLmUuIDEwMCUpCisJLy8gV2UgbG93ZXIgVFggcG93ZXIgaGVyZSBhY2NvcmRpbmcgdG8gdGhlIHBlcmNlbnRhZ2Ugc3BlY2lmaWVkIGZyb20gVUkKKwlpZiAocEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UgPT0gMHhmZmZmZmZmZikgICAgICAgLy8gQVVUTyBUWCBQT1dFUiBjb250cm9sCisJCTsKKwllbHNlIGlmIChwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA+IDkwKSAgLy8gOTEgfiAxMDAlICYgQVVUTywgdHJlYXQgYXMgMTAwJSBpbiB0ZXJtcyBvZiBtVworCQk7CisJZWxzZSBpZiAocEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UgPiA2MCkgIC8vIDYxIH4gOTAlLCB0cmVhdCBhcyA3NSUgaW4gdGVybXMgb2YgbVcKKwl7CisJCURlbHRhUHdyIC09IDE7CisJfQorCWVsc2UgaWYgKHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID4gMzApICAvLyAzMSB+IDYwJSwgdHJlYXQgYXMgNTAlIGluIHRlcm1zIG9mIG1XCisJeworCQlEZWx0YVB3ciAtPSAzOworCX0KKwllbHNlIGlmIChwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA+IDE1KSAgLy8gMTYgfiAzMCUsIHRyZWF0IGFzIDI1JSBpbiB0ZXJtcyBvZiBtVworCXsKKwkJRGVsdGFQd3IgLT0gNjsKKwl9CisJZWxzZSBpZiAocEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UgPiA5KSAgIC8vIDEwIH4gMTUlLCB0cmVhdCBhcyAxMi41JSBpbiB0ZXJtcyBvZiBtVworCXsKKwkJRGVsdGFQd3IgLT0gOTsKKwl9CisJZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwIH4gOSAlLCB0cmVhdCBhcyBNSU4ofjMlKSBpbiB0ZXJtcyBvZiBtVworCXsKKwkJRGVsdGFQd3IgLT0gMTI7CisJfQorCisJLyogcmVzZXQgZGlmZmVyZW50IG5ldyB0eCBwb3dlciBmb3IgZGlmZmVyZW50IFRYIHJhdGUgKi8KKwlmb3IoaT0wOyBpPDU7IGkrKykKKwl7CisJCWlmIChUeFB3cltpXSAhPSAweGZmZmZmZmZmKQorCQl7CisJCQlmb3IgKGo9MDsgajw4OyBqKyspCisJCQl7CisJCQkJVmFsdWUgPSAoQ0hBUikoKFR4UHdyW2ldID4+IGoqNCkgJiAweDBGKTsgLyogMCB+IDE1ICovCisKKwkJCQlpZiAoKFZhbHVlICsgRGVsdGFQd3IpIDwgMCkKKwkJCQl7CisJCQkJCVZhbHVlID0gMDsgLyogbWluICovCisJCQkJfQorCQkJCWVsc2UgaWYgKChWYWx1ZSArIERlbHRhUHdyKSA+IDB4RikKKwkJCQl7CisJCQkJCVZhbHVlID0gMHhGOyAvKiBtYXggKi8KKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJVmFsdWUgKz0gRGVsdGFQd3I7IC8qIHRlbXBlcmF0dXJlIGNvbXBlbnNhdGlvbiAqLworCQkJCX0KKworCQkJCS8qIGZpbGwgbmV3IHZhbHVlIHRvIENTUiBvZmZzZXQgKi8KKwkJCQlUeFB3cltpXSA9IChUeFB3cltpXSAmIH4oMHgwMDAwMDAwRiA8PCBqKjQpKSB8IChWYWx1ZSA8PCBqKjQpOworCQkJfQorCisJCQkvKiB3cml0ZSB0eCBwb3dlciB2YWx1ZSB0byBDU1IgKi8KKwkJCS8qIFRYX1BXUl9DRkdfMCAoOCB0eCByYXRlKSBmb3IJVFggcG93ZXIgZm9yIE9GRE0gMTJNLzE4TQorCQkJCQkJCQkJCQlUWCBwb3dlciBmb3IgT0ZETSA2TS85TQorCQkJCQkJCQkJCQlUWCBwb3dlciBmb3IgQ0NLNS41TS8xMU0KKwkJCQkJCQkJCQkJVFggcG93ZXIgZm9yIENDSzFNLzJNICovCisJCQkvKiBUWF9QV1JfQ0ZHXzEgfiBUWF9QV1JfQ0ZHXzQgKi8KKwkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX1BXUl9DRkdfMCArIGkqNCwgVHhQd3JbaV0pOworCisKKwkJfQorCX0KKworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVdyaXRlIFR4V0kgZm9yIEFURSBtb2RlLgorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworCisjaWZkZWYgUlQyODcwCitzdGF0aWMgVk9JRCBBVEVXcml0ZVR4V0koCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFRYV0lfU1RSVUMgCXBUeFdJLAorCUlOCUJPT0xFQU4JCQlGUkFHLAorCUlOCUJPT0xFQU4JCQlJbnNUaW1lc3RhbXAsCisJSU4JQk9PTEVBTiAJCUFNUERVLAorCUlOCUJPT0xFQU4gCQlBY2ssCisJSU4JQk9PTEVBTiAJCU5TZXEsCQkvLyBIVyBuZXcgYSBzZXF1ZW5jZS4KKwlJTglVQ0hBUgkJCUJBU2l6ZSwKKwlJTglVQ0hBUgkJCVdDSUQsCisJSU4JVUxPTkcJCQlMZW5ndGgsCisJSU4JVUNIQVIgCQkJUElELAorCUlOCVVDSEFSCQkJTUlNT3BzLAorCUlOCVVDSEFSCQkJVHhvcG1vZGUsCisJSU4JQk9PTEVBTgkJCUNmQWNrLAorCUlOCUhUVFJBTlNNSVRfU0VUVElORwlUcmFuc21pdCkKK3sKKwkvLworCS8vIEFsd2F5cyB1c2UgTG9uZyBwcmVhbWJsZSBiZWZvcmUgdmVyaWZpYXRpb24gc2hvcnQgcHJlYW1ibGUgZnVuY3Rpb25hbGl0eSB3b3JrcyB3ZWxsLgorCS8vIFRvZG86IHJlbW92ZSB0aGUgZm9sbG93aW5nIGxpbmUgaWYgc2hvcnQgcHJlYW1ibGUgZnVuY3Rpb25hbGl0eSB3b3JrcworCS8vCisJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfU0hPUlRfUFJFQU1CTEVfSU5VU0VEKTsKKwlwVHhXSS0+RlJBRz0gRlJBRzsKKwlwVHhXSS0+VFM9IEluc1RpbWVzdGFtcDsKKwlwVHhXSS0+QU1QRFUgPSBBTVBEVTsKKworCXBUeFdJLT5NSU1PcHMgPSBQV1JfQUNUSVZFOworCXBUeFdJLT5NcGR1RGVuc2l0eSA9IDQ7CisJcFR4V0ktPkFDSyA9IEFjazsKKwlwVHhXSS0+dHhvcCA9IFR4b3Btb2RlOworCXBUeFdJLT5OU0VRID0gTlNlcTsKKwlwVHhXSS0+QkFXaW5TaXplID0gQkFTaXplOworCisJcFR4V0ktPldpcmVsZXNzQ2xpSUQgPSBXQ0lEOworCXBUeFdJLT5NUERVdG90YWxCeXRlQ291bnQgPSBMZW5ndGg7CisJcFR4V0ktPlBhY2tldElkID0gUElEOworCisJcFR4V0ktPkJXID0gVHJhbnNtaXQuZmllbGQuQlc7CisJcFR4V0ktPlNob3J0R0kgPSBUcmFuc21pdC5maWVsZC5TaG9ydEdJOworCXBUeFdJLT5TVEJDPSBUcmFuc21pdC5maWVsZC5TVEJDOworCisJcFR4V0ktPk1DUyA9IFRyYW5zbWl0LmZpZWxkLk1DUzsKKwlwVHhXSS0+UEhZTU9ERT0gVHJhbnNtaXQuZmllbGQuTU9ERTsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCS8vCisJLy8gTU1QUyBpcyA4MDIuMTFuIGZlYXR1cmVzLiBCZWNhdXNlIFR4V0ktPk1DUyA+IDcgbXVzdCBiZSBIVCBtb2RlLAorCS8vIHNvIG5lZWQgbm90IGNoZWNrIGlmIGl0J3MgSFQgcmF0ZS4KKwkvLworCWlmICgoTUlNT3BzID09IE1NUFNfU1RBVElDKSAmJiAocFR4V0ktPk1DUyA+IDcpKQorCQlwVHhXSS0+TUNTID0gNzsKKworCWlmICgoTUlNT3BzID09IE1NUFNfRFlOQU1JQykgJiYgKHBUeFdJLT5NQ1MgPiA3KSkgLy8gU01QUyBwcm90ZWN0IDIgc3BhdGlhbC4KKwkJcFR4V0ktPk1JTU9wcyA9IDE7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwlwVHhXSS0+Q0ZBQ0sgPSBDZkFjazsKKworCXJldHVybjsKK30KKyNlbmRpZiAvLyBSVDI4NzAgLy8KKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlEaXNhYmxlIHByb3RlY3Rpb24gZm9yIEFURS4KKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIEFURURpc2FibGVBc2ljUHJvdGVjdCgKKwlJTgkJUFJUTVBfQURBUFRFUglwQWQpCit7CisJUFJPVF9DRkdfU1RSVUMJUHJvdENmZywgUHJvdENmZzQ7CisJVUlOVDMyIFByb3RlY3RbNl07CisJVVNIT1JUCQkJb2Zmc2V0OworCVVDSEFSCQkJaTsKKwlVSU5UMzIgTWFjUmVnID0gMDsKKworCS8vIENvbmZpZyBBU0lDIFJUUyB0aHJlc2hvbGQgcmVnaXN0ZXIKKwlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX1JUU19DRkcsICZNYWNSZWcpOworCU1hY1JlZyAmPSAweEZGMDAwMEZGOworCU1hY1JlZyB8PSAocEFkLT5Db21tb25DZmcuUnRzVGhyZXNob2xkIDw8IDgpOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX1JUU19DRkcsIE1hY1JlZyk7CisKKwkvLyBJbml0aWFsIGNvbW1vbiBwcm90ZWN0aW9uIHNldHRpbmdzCisJUlRNUFplcm9NZW1vcnkoUHJvdGVjdCwgc2l6ZW9mKFByb3RlY3QpKTsKKwlQcm90Q2ZnNC53b3JkID0gMDsKKwlQcm90Q2ZnLndvcmQgPSAwOworCVByb3RDZmcuZmllbGQuVHhvcEFsbG93R0Y0MCA9IDE7CisJUHJvdENmZy5maWVsZC5UeG9wQWxsb3dHRjIwID0gMTsKKwlQcm90Q2ZnLmZpZWxkLlR4b3BBbGxvd01NNDAgPSAxOworCVByb3RDZmcuZmllbGQuVHhvcEFsbG93TU0yMCA9IDE7CisJUHJvdENmZy5maWVsZC5UeG9wQWxsb3dPZmRtID0gMTsKKwlQcm90Q2ZnLmZpZWxkLlR4b3BBbGxvd0NjayA9IDE7CisJUHJvdENmZy5maWVsZC5SVFNUaEVuID0gMTsKKwlQcm90Q2ZnLmZpZWxkLlByb3RlY3ROYXYgPSBBU0lDX1NIT1JUTkFWOworCisJLy8gSGFuZGxlIGxlZ2FjeShCL0cpIHByb3RlY3Rpb24KKwlQcm90Q2ZnLmZpZWxkLlByb3RlY3RSYXRlID0gcEFkLT5Db21tb25DZmcuUnRzUmF0ZTsKKwlQcm90Q2ZnLmZpZWxkLlByb3RlY3RDdHJsID0gMDsKKwlQcm90ZWN0WzBdID0gUHJvdENmZy53b3JkOworCVByb3RlY3RbMV0gPSBQcm90Q2ZnLndvcmQ7CisKKwkvLyBOTyBQUk9URUNUCisJLy8gMS5BbGwgU1RBcyBpbiB0aGUgQlNTIGFyZSAyMC80MCBNSHogSFQKKwkvLyAyLiBpbiBhaSAyMC80ME1IeiBCU1MKKwkvLyAzLiBhbGwgU1RBcyBhcmUgMjBNSHogaW4gYSAyME1IeiBCU1MKKwkvLyBQdXJlIEhULiBubyBwcm90ZWN0aW9uLgorCisJLy8gTU0yMF9QUk9UX0NGRworCS8vCVJlc2VydmVkICgzMToyNykKKwkvLyAJUFJPVF9UWE9QKDI1OjIwKSAtLSAwMTAxMTEKKwkvLwlQUk9UX05BVigxOToxOCkgIC0tIDAxIChTaG9ydCBOQVYgcHJvdGVjdGlvbikKKwkvLyAgUFJPVF9DVFJMKDE3OjE2KSAtLSAwMCAoTm9uZSkKKwkvLyAJUFJPVF9SQVRFKDE1OjApICAtLSAweDQwMDQgKE9GRE0gMjRNKQorCVByb3RlY3RbMl0gPSAweDAxNzQ0MDA0OworCisJLy8gTU00MF9QUk9UX0NGRworCS8vCVJlc2VydmVkICgzMToyNykKKwkvLyAJUFJPVF9UWE9QKDI1OjIwKSAtLSAxMTExMTEKKwkvLwlQUk9UX05BVigxOToxOCkgIC0tIDAxIChTaG9ydCBOQVYgcHJvdGVjdGlvbikKKwkvLyAgUFJPVF9DVFJMKDE3OjE2KSAtLSAwMCAoTm9uZSkKKwkvLyAJUFJPVF9SQVRFKDE1OjApICAtLSAweDQwODQgKGR1cGxpY2F0ZSBPRkRNIDI0TSkKKwlQcm90ZWN0WzNdID0gMHgwM2Y0NDA4NDsKKworCS8vIENGMjBfUFJPVF9DRkcKKwkvLwlSZXNlcnZlZCAoMzE6MjcpCisJLy8gCVBST1RfVFhPUCgyNToyMCkgLS0gMDEwMTExCisJLy8JUFJPVF9OQVYoMTk6MTgpICAtLSAwMSAoU2hvcnQgTkFWIHByb3RlY3Rpb24pCisJLy8gIFBST1RfQ1RSTCgxNzoxNikgLS0gMDAgKE5vbmUpCisJLy8gCVBST1RfUkFURSgxNTowKSAgLS0gMHg0MDA0IChPRkRNIDI0TSkKKwlQcm90ZWN0WzRdID0gMHgwMTc0NDAwNDsKKworCS8vIENGNDBfUFJPVF9DRkcKKwkvLwlSZXNlcnZlZCAoMzE6MjcpCisJLy8gCVBST1RfVFhPUCgyNToyMCkgLS0gMTExMTExCisJLy8JUFJPVF9OQVYoMTk6MTgpICAtLSAwMSAoU2hvcnQgTkFWIHByb3RlY3Rpb24pCisJLy8gIFBST1RfQ1RSTCgxNzoxNikgLS0gMDAgKE5vbmUpCisJLy8gCVBST1RfUkFURSgxNTowKSAgLS0gMHg0MDg0IChkdXBsaWNhdGUgT0ZETSAyNE0pCisJUHJvdGVjdFs1XSA9IDB4MDNmNDQwODQ7CisKKwlwQWQtPkNvbW1vbkNmZy5JT1Rlc3RQYXJtLmJSVFNMb25nUHJvdE9uID0gRkFMU0U7CisKKwlvZmZzZXQgPSBDQ0tfUFJPVF9DRkc7CisJZm9yIChpID0gMDtpIDwgNjtpKyspCisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIG9mZnNldCArIGkqNCwgUHJvdGVjdFtpXSk7CisKK30KKworI2lmZGVmIFJUMjg3MAorLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlSb3V0aW5lCURlc2NyaXB0aW9uOgorCQlXcml0ZSBUeEluZm8gZm9yIEFURSBtb2RlLgorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworc3RhdGljIFZPSUQgQVRFV3JpdGVUeEluZm8oCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFRYSU5GT19TVFJVQyAJcFR4SW5mbywKKwlJTglVU0hPUlQJCVVTQkRNQXBrdExlbiwKKwlJTglCT09MRUFOCQliV2l2LAorCUlOCVVDSEFSCQkJUXVldWVTZWwsCisJSU4JVUNIQVIJCQlOZXh0VmFsaWQsCisJSU4JVUNIQVIJCQlUeEJ1cnN0KQoreworCXBUeEluZm8tPlVTQkRNQVR4UGt0TGVuID0gVVNCRE1BcGt0TGVuOworCXBUeEluZm8tPlFTRUwgPSBRdWV1ZVNlbDsKKworCWlmIChRdWV1ZVNlbCAhPSBGSUZPX0VEQ0EpCisJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT09PT0+IFF1ZXVlU2VsICE9IEZJRk9fRURDQTw9PT09PT09XG4iKSk7CisKKwlwVHhJbmZvLT5VU0JETUFOZXh0VkxEID0gTmV4dFZhbGlkOworCXBUeEluZm8tPlVTQkRNQVR4YnVyc3QgPSBUeEJ1cnN0OworCXBUeEluZm8tPldJViA9IGJXaXY7CisJcFR4SW5mby0+U3dVc2VMYXN0Um91bmQgPSAwOworCXBUeEluZm8tPnJzdiA9IDA7CisJcFR4SW5mby0+cnN2MiA9IDA7CisKKwlyZXR1cm47Cit9CisjZW5kaWYgLy8gUlQyODcwIC8vCisKKy8qIFRoZXJlIGFyZSB0d28gd2F5cyB0byBjb252ZXJ0IFJzc2kgKi8KKyNpZiAxCisvLworLy8gVGhlIHdheSB1c2VkIHdpdGggR0VUX0xOQV9HQUlOKCkuCisvLworQ0hBUiBBVEVDb252ZXJ0VG9Sc3NpKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOCUNIQVIJUnNzaSwKKwlJTiAgVUNIQVIgICBSc3NpTnVtYmVyKQoreworCVVDSEFSCVJzc2lPZmZzZXQsIExOQUdhaW47CisKKwkvLyBSc3NpIGVxdWFscyB0byB6ZXJvIHNob3VsZCBiZSBhbiBpbnZhbGlkIHZhbHVlCisJaWYgKFJzc2kgPT0gMCkKKwkJcmV0dXJuIC05OTsKKworCUxOQUdhaW4gPSBHRVRfTE5BX0dBSU4ocEFkKTsKKwlpZiAocEFkLT5MYXRjaFJmUmVncy5DaGFubmVsID4gMTQpCisJeworCQlpZiAoUnNzaU51bWJlciA9PSAwKQorCQkJUnNzaU9mZnNldCA9IHBBZC0+QVJzc2lPZmZzZXQwOworCQllbHNlIGlmIChSc3NpTnVtYmVyID09IDEpCisJCQlSc3NpT2Zmc2V0ID0gcEFkLT5BUnNzaU9mZnNldDE7CisJCWVsc2UKKwkJCVJzc2lPZmZzZXQgPSBwQWQtPkFSc3NpT2Zmc2V0MjsKKwl9CisJZWxzZQorCXsKKwkJaWYgKFJzc2lOdW1iZXIgPT0gMCkKKwkJCVJzc2lPZmZzZXQgPSBwQWQtPkJHUnNzaU9mZnNldDA7CisJCWVsc2UgaWYgKFJzc2lOdW1iZXIgPT0gMSkKKwkJCVJzc2lPZmZzZXQgPSBwQWQtPkJHUnNzaU9mZnNldDE7CisJCWVsc2UKKwkJCVJzc2lPZmZzZXQgPSBwQWQtPkJHUnNzaU9mZnNldDI7CisJfQorCisJcmV0dXJuICgtMTIgLSBSc3NpT2Zmc2V0IC0gTE5BR2FpbiAtIFJzc2kpOworfQorI2Vsc2UKKy8vCisvLyBUaGUgd2F5IG9yaWdpbmFsbHkgdXNlZCBpbiBBVEUgb2YgcnQyODYwYXAuCisvLworQ0hBUiBBVEVDb252ZXJ0VG9Sc3NpKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOCUNIQVIJCQlSc3NpLAorCUlOICBVQ0hBUiAgIFJzc2lOdW1iZXIpCit7CisJVUNIQVIJUnNzaU9mZnNldCwgTE5BR2FpbjsKKworCS8vIFJzc2kgZXF1YWxzIHRvIHplcm8gc2hvdWxkIGJlIGFuIGludmFsaWQgdmFsdWUKKwlpZiAoUnNzaSA9PSAwKQorCQlyZXR1cm4gLTk5OworCisgICAgaWYgKHBBZC0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbCA+IDE0KQorICAgIHsKKyAgICAgICAgTE5BR2FpbiA9IHBBZC0+QUxOQUdhaW47CisgICAgICAgIGlmIChSc3NpTnVtYmVyID09IDApCisJCQlSc3NpT2Zmc2V0ID0gcEFkLT5BUnNzaU9mZnNldDA7CisJCWVsc2UgaWYgKFJzc2lOdW1iZXIgPT0gMSkKKwkJCVJzc2lPZmZzZXQgPSBwQWQtPkFSc3NpT2Zmc2V0MTsKKwkJZWxzZQorCQkJUnNzaU9mZnNldCA9IHBBZC0+QVJzc2lPZmZzZXQyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBMTkFHYWluID0gcEFkLT5CTE5BR2FpbjsKKyAgICAgICAgaWYgKFJzc2lOdW1iZXIgPT0gMCkKKwkJCVJzc2lPZmZzZXQgPSBwQWQtPkJHUnNzaU9mZnNldDA7CisJCWVsc2UgaWYgKFJzc2lOdW1iZXIgPT0gMSkKKwkJCVJzc2lPZmZzZXQgPSBwQWQtPkJHUnNzaU9mZnNldDE7CisJCWVsc2UKKwkJCVJzc2lPZmZzZXQgPSBwQWQtPkJHUnNzaU9mZnNldDI7CisgICAgfQorCisgICAgcmV0dXJuICgtMzIgLSBSc3NpT2Zmc2V0ICsgTE5BR2FpbiAtIFJzc2kpOworfQorI2VuZGlmIC8qIGVuZCBvZiAjaWYgMSAqLworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJU2V0IEphcGFuIGZpbHRlciBjb2VmZmljaWVudHMgaWYgbmVlZGVkLgorCU5vdGU6CisJCVRoaXMgcm91dGluZSBzaG91bGQgb25seSBiZSBjYWxsZWQgd2hlbgorCQllbnRlcmluZyBUWEZSQU1FIG1vZGUgb3IgVFhDT05UIG1vZGUuCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitzdGF0aWMgVk9JRCBTZXRKYXBhbkZpbHRlcigKKwlJTgkJUFJUTVBfQURBUFRFUglwQWQpCit7CisJVUNIQVIJCQlCYnBEYXRhID0gMDsKKworCS8vCisJLy8gSWYgQ2hhbm5lbD0xNCBhbmQgQmFuZHdpZHRoPTIwTSBhbmQgTW9kZT1DQ0ssIHNldCBCQlAgUjQgYml0NT0xCisJLy8gKEphcGFuIFR4IGZpbHRlciBjb2VmZmljaWVudHMpd2hlbiAoVFhGUkFNRSBvciBUWENPTlQpLgorCS8vCisJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsICZCYnBEYXRhKTsKKworICAgIGlmICgocEFkLT5hdGUuVHhXSS5QSFlNT0RFID09IE1PREVfQ0NLKSAmJiAocEFkLT5hdGUuQ2hhbm5lbCA9PSAxNCkgJiYgKHBBZC0+YXRlLlR4V0kuQlcgPT0gQldfMjApKQorICAgIHsKKyAgICAgICAgQmJwRGF0YSB8PSAweDIwOyAgICAvLyB0dXJuIG9uCisgICAgICAgIEFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldEphcGFuRmlsdGVyISEhXG4iKSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJCUJicERhdGEgJj0gMHhkZjsgICAgLy8gdHVybiBvZmYKKwkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ2xlYXJKYXBhbkZpbHRlciEhIVxuIikpOworICAgIH0KKworCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgQmJwRGF0YSk7Cit9CisKK1ZPSUQgQVRFU2FtcGxlUnNzaSgKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiBQUlhXSV9TVFJVQwkJcFJ4V0kpCit7CisJLyogVGhlcmUgYXJlIHR3byB3YXlzIHRvIGNvbGxlY3QgUlNTSS4gKi8KKyNpZiAxCisJLy9wQWQtPkxhc3RSeFJhdGUgPSAoVVNIT1JUKSgocFJ4V0ktPk1DUykgKyAocFJ4V0ktPkJXIDw8NykgKyAocFJ4V0ktPlNob3J0R0kgPDw4KSsgKHBSeFdJLT5QSFlNT0RFIDw8MTQpKSA7CisJaWYgKHBSeFdJLT5SU1NJMCAhPSAwKQorCXsKKwkJcEFkLT5hdGUuTGFzdFJzc2kwCT0gQVRFQ29udmVydFRvUnNzaShwQWQsIChDSEFSKSBwUnhXSS0+UlNTSTAsIFJTU0lfMCk7CisJCXBBZC0+YXRlLkF2Z1Jzc2kwWDgJPSAocEFkLT5hdGUuQXZnUnNzaTBYOCAtIHBBZC0+YXRlLkF2Z1Jzc2kwKSArIHBBZC0+YXRlLkxhc3RSc3NpMDsKKwkJcEFkLT5hdGUuQXZnUnNzaTAgIAk9IHBBZC0+YXRlLkF2Z1Jzc2kwWDggPj4gMzsKKwl9CisJaWYgKHBSeFdJLT5SU1NJMSAhPSAwKQorCXsKKwkJcEFkLT5hdGUuTGFzdFJzc2kxCT0gQVRFQ29udmVydFRvUnNzaShwQWQsIChDSEFSKSBwUnhXSS0+UlNTSTEsIFJTU0lfMSk7CisJCXBBZC0+YXRlLkF2Z1Jzc2kxWDgJPSAocEFkLT5hdGUuQXZnUnNzaTFYOCAtIHBBZC0+YXRlLkF2Z1Jzc2kxKSArIHBBZC0+YXRlLkxhc3RSc3NpMTsKKwkJcEFkLT5hdGUuQXZnUnNzaTEJPSBwQWQtPmF0ZS5BdmdSc3NpMVg4ID4+IDM7CisJfQorCWlmIChwUnhXSS0+UlNTSTIgIT0gMCkKKwl7CisJCXBBZC0+YXRlLkxhc3RSc3NpMgk9IEFURUNvbnZlcnRUb1Jzc2kocEFkLCAoQ0hBUikgcFJ4V0ktPlJTU0kyLCBSU1NJXzIpOworCQlwQWQtPmF0ZS5BdmdSc3NpMlg4CT0gKHBBZC0+YXRlLkF2Z1Jzc2kyWDggLSBwQWQtPmF0ZS5BdmdSc3NpMikgKyBwQWQtPmF0ZS5MYXN0UnNzaTI7CisJCXBBZC0+YXRlLkF2Z1Jzc2kyCT0gcEFkLT5hdGUuQXZnUnNzaTJYOCA+PiAzOworCX0KKworCXBBZC0+YXRlLkxhc3RTTlIwID0gKENIQVIpKHBSeFdJLT5TTlIwKTsvLyBDSEFSID09PiBVQ0hBUiA/CisJcEFkLT5hdGUuTGFzdFNOUjEgPSAoQ0hBUikocFJ4V0ktPlNOUjEpOy8vIENIQVIgPT0+IFVDSEFSID8KKworCXBBZC0+YXRlLk51bU9mQXZnUnNzaVNhbXBsZSArKzsKKyNlbHNlCisJcEFkLT5hdGUuTGFzdFNOUjAgPSAoQ0hBUikocFJ4V0ktPlNOUjApOworCXBBZC0+YXRlLkxhc3RTTlIxID0gKENIQVIpKHBSeFdJLT5TTlIxKTsKKwlwQWQtPmF0ZS5SeENudFBlclNlYysrOworCXBBZC0+YXRlLkxhc3RSc3NpMCA9IEFURUNvbnZlcnRUb1Jzc2kocEFkLCAoQ0hBUikgcFJ4V0ktPlJTU0kwLCBSU1NJXzApOworCXBBZC0+YXRlLkxhc3RSc3NpMSA9IEFURUNvbnZlcnRUb1Jzc2kocEFkLCAoQ0hBUikgcFJ4V0ktPlJTU0kxLCBSU1NJXzEpOworCXBBZC0+YXRlLkxhc3RSc3NpMiA9IEFURUNvbnZlcnRUb1Jzc2kocEFkLCAoQ0hBUikgcFJ4V0ktPlJTU0kyLCBSU1NJXzIpOworCXBBZC0+YXRlLkF2Z1Jzc2kwWDggPSAocEFkLT5hdGUuQXZnUnNzaTBYOCAtIHBBZC0+YXRlLkF2Z1Jzc2kwKSArIHBBZC0+YXRlLkxhc3RSc3NpMDsKKwlwQWQtPmF0ZS5BdmdSc3NpMCA9IHBBZC0+YXRlLkF2Z1Jzc2kwWDggPj4gMzsKKwlwQWQtPmF0ZS5BdmdSc3NpMVg4ID0gKHBBZC0+YXRlLkF2Z1Jzc2kxWDggLSBwQWQtPmF0ZS5BdmdSc3NpMSkgKyBwQWQtPmF0ZS5MYXN0UnNzaTE7CisJcEFkLT5hdGUuQXZnUnNzaTEgPSBwQWQtPmF0ZS5BdmdSc3NpMVg4ID4+IDM7CisJcEFkLT5hdGUuQXZnUnNzaTJYOCA9IChwQWQtPmF0ZS5BdmdSc3NpMlg4IC0gcEFkLT5hdGUuQXZnUnNzaTIpICsgcEFkLT5hdGUuTGFzdFJzc2kyOworCXBBZC0+YXRlLkF2Z1Jzc2kyID0gcEFkLT5hdGUuQXZnUnNzaTJYOCA+PiAzOworCXBBZC0+YXRlLk51bU9mQXZnUnNzaVNhbXBsZSArKzsKKyNlbmRpZgorfQorCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCitWT0lEIFJUTVBTdGF0aW9uU3RvcCgKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCkKK3sKKy8vCUJPT0xFQU4gICAgICAgQ2FuY2VsbGVkOworCisgICAgQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT0+IFJUTVBTdGF0aW9uU3RvcFxuIikpOworCisjaWYgMAorCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LkFzc29jVGltZXIsICAgICAgJkNhbmNlbGxlZCk7CisJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguUmVhc3NvY1RpbWVyLCAgICAmQ2FuY2VsbGVkKTsKKwlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5EaXNhc3NvY1RpbWVyLCAgICZDYW5jZWxsZWQpOworCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LkF1dGhUaW1lciwgICAgICAgJkNhbmNlbGxlZCk7CisJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguQmVhY29uVGltZXIsICAgICAmQ2FuY2VsbGVkKTsKKwlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5TY2FuVGltZXIsICAgICAgICZDYW5jZWxsZWQpOworI2VuZGlmCisJLy8gRm9yIHJ4IHN0YXRpc3RpY3MsIHdlIG5lZWQgdG8ga2VlcCB0aGlzIHRpbWVyIHJ1bm5pbmcuCisvLwlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZS5QZXJpb2RpY1RpbWVyLCAgICAgICZDYW5jZWxsZWQpOworCisgICAgQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPD09IFJUTVBTdGF0aW9uU3RvcFxuIikpOworfQorCitWT0lEIFJUTVBTdGF0aW9uU3RhcnQoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpCit7CisgICAgQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT0+IFJUTVBTdGF0aW9uU3RhcnRcbiIpKTsKKwlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT0gUlRNUFN0YXRpb25TdGFydFxuIikpOworfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVNldHVwIEZyYW1lIGZvcm1hdC4KKwlOT1RFOgorCQlUaGlzIHJvdXRpbmUgc2hvdWxkIG9ubHkgYmUgdXNlZCBpbiBBVEUgbW9kZS4KKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZmRlZiBSVDI4NzAKKy8qPT09PT09PT09PT09PT09PT09PT09PVN0YXJ0IG9mIFJUMjg3MD09PT09PT09PT09PT09PT09PT09PT0qLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3N0YXRpYyBJTlQgQVRFU2V0VXBGcmFtZSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVSU5UMzIgVHhJZHgpCit7CisJVUlOVCBqOworCVBUWF9DT05URVhUCXBOdWxsQ29udGV4dDsKKwlQVUNIQVIJCQlwRGVzdDsKKwlIVFRSQU5TTUlUX1NFVFRJTkcJVHhIVFBoeU1vZGU7CisJUFRYV0lfU1RSVUMJCXBUeFdJOworCVBUWElORk9fU1RSVUMJCXBUeEluZm87CisJVUlOVDMyCQkJVHJhbnNmZXJCdWZmZXJMZW5ndGgsIE9yZ0J1ZmZlckxlbmd0aCA9IDA7CisJVUNIQVIJCQlwYWRMZW4gPSAwOworI2lmZGVmIFJBTElOS18yOHh4X1FBCisJUEhFQURFUl84MDJfMTEJcEhlYWRlcjgwMjExID0gTlVMTDsKKyNlbmRpZiAvLyBSQUxJTktfMjh4eF9RQSAvLworCisJaWYgKChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkVTRVRfSU5fUFJPR1JFU1MpKSB8fAorCQkoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JVTEtPVVRfUkVTRVQpKSB8fAorCQkoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MpKSB8fAorCQkoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSkKKwl7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBXZSBhbHdheXMgdXNlIFFJRF9BQ19CRSBhbmQgRklGT19FRENBIGluIEFURSBtb2RlLiAqLworCisJcE51bGxDb250ZXh0ID0gJihwQWQtPk51bGxDb250ZXh0KTsKKwlBU1NFUlQocE51bGxDb250ZXh0ICE9IE5VTEwpOworCisJaWYgKHBOdWxsQ29udGV4dC0+SW5Vc2UgPT0gRkFMU0UpCisJeworCQkvLyBTZXQgdGhlIGluIHVzZSBiaXQKKwkJcE51bGxDb250ZXh0LT5JblVzZSA9IFRSVUU7CisJCU5kaXNaZXJvTWVtb3J5KCYocEFkLT5OdWxsRnJhbWUpLCBzaXplb2YoSEVBREVSXzgwMl8xMSkpOworCisJCS8vIEZpbGwgODAyLjExIGhlYWRlci4KKyNpZmRlZiBSQUxJTktfMjh4eF9RQQorCQlpZiAocEFkLT5hdGUuYlFBVHhTdGFydCA9PSBUUlVFKQorCQl7CisJCQlwSGVhZGVyODAyMTEgPSBOZGlzTW92ZU1lbW9yeSgmKHBBZC0+TnVsbEZyYW1lKSwgcEFkLT5hdGUuSGVhZGVyLCBwQWQtPmF0ZS5ITGVuKTsKKy8vCQkJcERlc3QgPSBOZGlzTW92ZU1lbW9yeSgmKHBBZC0+TnVsbEZyYW1lKSwgcEFkLT5hdGUuSGVhZGVyLCBwQWQtPmF0ZS5ITGVuKTsKKy8vCQkJcEhlYWRlcjgwMjExID0gKFBIRUFERVJfODAyXzExKXBEZXN0OworCQl9CisJCWVsc2UKKyNlbmRpZiAvLyBSQUxJTktfMjh4eF9RQSAvLworCQl7CisJCQkvLyBGaWxsIDgwMi4xMSBoZWFkZXIuCisJCQlOZGlzTW92ZU1lbW9yeSgmKHBBZC0+TnVsbEZyYW1lKSwgVGVtcGxhdGVGcmFtZSwgc2l6ZW9mKEhFQURFUl84MDJfMTEpKTsKKwkJfQorI2lmZGVmIFJUX0JJR19FTkRJQU4KKwkJUlRNUEZyYW1lRW5kaWFuQ2hhbmdlKHBBZCwgKFBVQ0hBUikmKHBBZC0+TnVsbEZyYW1lKSwgRElSX1JFQUQsIEZBTFNFKTsKKyNlbmRpZiAvLyBSVF9CSUdfRU5ESUFOIC8vCisKKyNpZmRlZiBSQUxJTktfMjh4eF9RQQorCQlpZiAocEFkLT5hdGUuYlFBVHhTdGFydCA9PSBUUlVFKQorCQl7CisJCQkvKiBtb2RpZnkgc2VxdWVuY2UgbnVtYmVyLi4uLiAqLworCQkJaWYgKHBBZC0+YXRlLlR4RG9uZUNvdW50ID09IDApCisJCQl7CisJCQkJcEFkLT5hdGUuc2VxID0gcEhlYWRlcjgwMjExLT5TZXF1ZW5jZTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlwSGVhZGVyODAyMTEtPlNlcXVlbmNlID0gKytwQWQtPmF0ZS5zZXE7CisJCQl9CisJCQkvKiBXZSBhbHJlYWR5IGdvdCBhbGwgdGhlIGFkZHIuIGZpZWxkcyBmcm9tIFFBIEdVSS4gKi8KKwkJfQorCQllbHNlCisjZW5kaWYgLy8gUkFMSU5LXzI4eHhfUUEgLy8KKwkJeworCQkJQ09QWV9NQUNfQUREUihwQWQtPk51bGxGcmFtZS5BZGRyMSwgcEFkLT5hdGUuQWRkcjEpOworCQkJQ09QWV9NQUNfQUREUihwQWQtPk51bGxGcmFtZS5BZGRyMiwgcEFkLT5hdGUuQWRkcjIpOworCQkJQ09QWV9NQUNfQUREUihwQWQtPk51bGxGcmFtZS5BZGRyMywgcEFkLT5hdGUuQWRkcjMpOworCQl9CisKKwkJUlRNUFplcm9NZW1vcnkoJnBBZC0+TnVsbENvbnRleHQuVHJhbnNmZXJCdWZmZXItPmZpZWxkLldpcmVsZXNzUGFja2V0WzBdLCBUWF9CVUZGRVJfTk9STVNJWkUpOy8vPz8/CisJCXBUeEluZm8gPSAoUFRYSU5GT19TVFJVQykmcEFkLT5OdWxsQ29udGV4dC5UcmFuc2ZlckJ1ZmZlci0+ZmllbGQuV2lyZWxlc3NQYWNrZXRbMF07CisKKyNpZmRlZiBSQUxJTktfMjh4eF9RQQorCQlpZiAocEFkLT5hdGUuYlFBVHhTdGFydCA9PSBUUlVFKQorCQl7CisJCQkvLyBBdm9pZCB0byBleGNlZWQgdGhlIHJhbmdlIG9mIFdpcmVsZXNzUGFja2V0W10uCisJCQlBU1NFUlQocEFkLT5hdGUuVHhJbmZvLlVTQkRNQVR4UGt0TGVuIDw9IChNQVhfRlJBTUVfU0laRSAtIDM0LyogPT0gMjMxMiAqLykpOworCQkJTmRpc01vdmVNZW1vcnkocFR4SW5mbywgJihwQWQtPmF0ZS5UeEluZm8pLCBzaXplb2YocEFkLT5hdGUuVHhJbmZvKSk7CisJCX0KKwkJZWxzZQorI2VuZGlmIC8vIFJBTElOS18yOHh4X1FBIC8vCisJCXsKKwkJCS8vIEF2b2lkIHRvIGV4Y2VlZCB0aGUgcmFuZ2Ugb2YgV2lyZWxlc3NQYWNrZXRbXS4KKwkJCUFTU0VSVChwQWQtPmF0ZS5UeExlbmd0aCA8PSAoTUFYX0ZSQU1FX1NJWkUgLSAzNC8qID09IDIzMTIgKi8pKTsKKworCQkJLy8gcFR4SW5mby0+VVNCRE1BVHhQa3RMZW4gd2lsbCBiZSB1cGRhdGVkIHRvIGluY2x1ZGUgcGFkZGluZyBsYXRlci4KKwkJCUFURVdyaXRlVHhJbmZvKHBBZCwgcFR4SW5mbywgKFVTSE9SVCkoVFhXSV9TSVpFICsgcEFkLT5hdGUuVHhMZW5ndGgpLCBUUlVFLCBFcFRvUXVldWVbTUdNVFBJUEVJRFhdLCBGQUxTRSwgIEZBTFNFKTsKKwkJCXBUeEluZm8tPlFTRUwgPSBGSUZPX0VEQ0E7CisJCX0KKworCQlwVHhXSSA9IChQVFhXSV9TVFJVQykmcEFkLT5OdWxsQ29udGV4dC5UcmFuc2ZlckJ1ZmZlci0+ZmllbGQuV2lyZWxlc3NQYWNrZXRbVFhJTkZPX1NJWkVdOworCisJCS8vIEZpbGwgVHhXSS4KKwkJaWYgKHBBZC0+YXRlLmJRQVR4U3RhcnQgPT0gVFJVRSkKKwkJeworCQkJVHhIVFBoeU1vZGUuZmllbGQuQlcgPSBwQWQtPmF0ZS5UeFdJLkJXOworCQkJVHhIVFBoeU1vZGUuZmllbGQuU2hvcnRHSSA9IHBBZC0+YXRlLlR4V0kuU2hvcnRHSTsKKwkJCVR4SFRQaHlNb2RlLmZpZWxkLlNUQkMgPSBwQWQtPmF0ZS5UeFdJLlNUQkM7CisJCQlUeEhUUGh5TW9kZS5maWVsZC5NQ1MgPSBwQWQtPmF0ZS5UeFdJLk1DUzsKKwkJCVR4SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBwQWQtPmF0ZS5UeFdJLlBIWU1PREU7CisJCQlBVEVXcml0ZVR4V0kocEFkLCBwVHhXSSwgcEFkLT5hdGUuVHhXSS5GUkFHLCBwQWQtPmF0ZS5UeFdJLlRTLCBwQWQtPmF0ZS5UeFdJLkFNUERVLCBwQWQtPmF0ZS5UeFdJLkFDSywgcEFkLT5hdGUuVHhXSS5OU0VRLAorCQkJCXBBZC0+YXRlLlR4V0kuQkFXaW5TaXplLCBCU1NJRF9XQ0lELCBwQWQtPmF0ZS5UeFdJLk1QRFV0b3RhbEJ5dGVDb3VudC8qIGluY2x1ZGUgODAyLjExIGhlYWRlciAqLywgcEFkLT5hdGUuVHhXSS5QYWNrZXRJZCwgMCwgcEFkLT5hdGUuVHhXSS50eG9wLypJRlNfSFRUWE9QKi8sIHBBZC0+YXRlLlR4V0kuQ0ZBQ0svKkZBTFNFKi8sIFR4SFRQaHlNb2RlKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCVR4SFRQaHlNb2RlLmZpZWxkLkJXID0gcEFkLT5hdGUuVHhXSS5CVzsKKwkJCVR4SFRQaHlNb2RlLmZpZWxkLlNob3J0R0kgPSBwQWQtPmF0ZS5UeFdJLlNob3J0R0k7CisJCQlUeEhUUGh5TW9kZS5maWVsZC5TVEJDID0gMDsKKwkJCVR4SFRQaHlNb2RlLmZpZWxkLk1DUyA9IHBBZC0+YXRlLlR4V0kuTUNTOworCQkJVHhIVFBoeU1vZGUuZmllbGQuTU9ERSA9IHBBZC0+YXRlLlR4V0kuUEhZTU9ERTsKKworCQkJQVRFV3JpdGVUeFdJKHBBZCwgcFR4V0ksICBGQUxTRSwgRkFMU0UsIEZBTFNFLCBGQUxTRS8qIE5vIGFjayByZXF1aXJlZC4gKi8sIEZBTFNFLCAwLCBCU1NJRF9XQ0lELCBwQWQtPmF0ZS5UeExlbmd0aCwKKwkJCQkwLCAwLCBJRlNfSFRUWE9QLCBGQUxTRSwgVHhIVFBoeU1vZGUpOy8vICJNTVBTX1NUQVRJQyIgaW5zdGVhZCBvZiAiTU1QU19EWU5BTUlDIiA/Pz8KKwkJfQorCisJCVJUTVBNb3ZlTWVtb3J5KCZwQWQtPk51bGxDb250ZXh0LlRyYW5zZmVyQnVmZmVyLT5maWVsZC5XaXJlbGVzc1BhY2tldFtUWElORk9fU0laRStUWFdJX1NJWkVdLCAmcEFkLT5OdWxsRnJhbWUsIHNpemVvZihIRUFERVJfODAyXzExKSk7CisKKwkJcERlc3QgPSAmKHBBZC0+TnVsbENvbnRleHQuVHJhbnNmZXJCdWZmZXItPmZpZWxkLldpcmVsZXNzUGFja2V0W1RYSU5GT19TSVpFK1RYV0lfU0laRStzaXplb2YoSEVBREVSXzgwMl8xMSldKTsKKworCQkvLyBQcmVwYXJlIGZyYW1lIHBheWxvYWQKKyNpZmRlZiBSQUxJTktfMjh4eF9RQQorCQlpZiAocEFkLT5hdGUuYlFBVHhTdGFydCA9PSBUUlVFKQorCQl7CisJCQkvLyBjb3B5IHBhdHRlcm4KKwkJCWlmICgocEFkLT5hdGUuUExlbiAhPSAwKSkKKwkJCXsKKwkJCQlmb3IgKGogPSAwOyBqIDwgcEFkLT5hdGUuRExlbjsgais9cEFkLT5hdGUuUExlbikKKwkJCQl7CisJCQkJCVJUTVBNb3ZlTWVtb3J5KHBEZXN0LCBwQWQtPmF0ZS5QYXR0ZXJuLCBwQWQtPmF0ZS5QTGVuKTsKKwkJCQkJcERlc3QgKz0gcEFkLT5hdGUuUExlbjsKKwkJCQl9CisJCQl9CisJCQlUcmFuc2ZlckJ1ZmZlckxlbmd0aCA9IFRYSU5GT19TSVpFICsgVFhXSV9TSVpFICsgcEFkLT5hdGUuVHhXSS5NUERVdG90YWxCeXRlQ291bnQ7CisJCX0KKwkJZWxzZQorI2VuZGlmIC8vIFJBTElOS18yOHh4X1FBIC8vCisJCXsKKwkJICAgIGZvciAoaiA9IDA7IGogPCAocEFkLT5hdGUuVHhMZW5ndGggLSBzaXplb2YoSEVBREVSXzgwMl8xMSkpOyBqKyspCisJCSAgICB7CisJCQkJKnBEZXN0ID0gMHhBNTsKKwkJCQlwRGVzdCArPSAxOworCQkgICAgfQorCQkJVHJhbnNmZXJCdWZmZXJMZW5ndGggPSBUWElORk9fU0laRSArIFRYV0lfU0laRSArIHBBZC0+YXRlLlR4TGVuZ3RoOworCQl9CisKKyNpZiAxCisJCU9yZ0J1ZmZlckxlbmd0aCA9IFRyYW5zZmVyQnVmZmVyTGVuZ3RoOworCQlUcmFuc2ZlckJ1ZmZlckxlbmd0aCA9IChUcmFuc2ZlckJ1ZmZlckxlbmd0aCArIDMpICYgKH4zKTsKKworCQkvLyBBbHdheXMgYWRkIDQgZXh0cmEgYnl0ZXMgYXQgZXZlcnkgcGFja2V0LgorCQlwYWRMZW4gPSBUcmFuc2ZlckJ1ZmZlckxlbmd0aCAtIE9yZ0J1ZmZlckxlbmd0aCArIDQ7LyogNCA9PSBsYXN0IHBhY2tldCBwYWRkaW5nICovCisJCUFTU0VSVCgocGFkTGVuIDw9IChSVE1QX1BLVF9UQUlMX1BBRERJTkcgLSA0LyogNCA9PSBNYXhCdWxrT3V0c2l6ZSBhbGlnbm1lbnQgcGFkZGluZyAqLykpKTsKKworCQkvKiBOb3cgbWVtemVybyBhbGwgZXh0cmEgcGFkZGluZyBieXRlcy4gKi8KKwkJTmRpc1plcm9NZW1vcnkocERlc3QsIHBhZExlbik7CisJCXBEZXN0ICs9IHBhZExlbjsKKyNlbHNlCisJCWlmICgoVHJhbnNmZXJCdWZmZXJMZW5ndGggJSA0KSA9PSAxKQorCQl7CisJCQlOZGlzWmVyb01lbW9yeShwRGVzdCwgNyk7CisJCQlwRGVzdCArPSA3OworCQkJVHJhbnNmZXJCdWZmZXJMZW5ndGggICs9IDM7CisJCX0KKwkJZWxzZSBpZiAoKFRyYW5zZmVyQnVmZmVyTGVuZ3RoICUgNCkgPT0gMikKKwkJeworCQkJTmRpc1plcm9NZW1vcnkocERlc3QsIDYpOworCQkJcERlc3QgKz0gNjsKKwkJCVRyYW5zZmVyQnVmZmVyTGVuZ3RoICArPSAyOworCQl9CisJCWVsc2UgaWYgKChUcmFuc2ZlckJ1ZmZlckxlbmd0aCAlIDQpID09IDMpCisJCXsKKwkJCU5kaXNaZXJvTWVtb3J5KHBEZXN0LCA1KTsKKwkJCXBEZXN0ICs9IDU7CisJCQlUcmFuc2ZlckJ1ZmZlckxlbmd0aCAgKz0gMTsKKwkJfQorI2VuZGlmIC8vIDEgLy8KKworCQkvLyBVcGRhdGUgcFR4SW5mby0+VVNCRE1BVHhQa3RMZW4gdG8gaW5jbHVkZSBwYWRkaW5nLgorCQlwVHhJbmZvLT5VU0JETUFUeFBrdExlbiA9IFRyYW5zZmVyQnVmZmVyTGVuZ3RoIC0gVFhJTkZPX1NJWkU7CisKKwkJVHJhbnNmZXJCdWZmZXJMZW5ndGggKz0gNDsKKworCQkvLyBJZiBUcmFuc2ZlckJ1ZmZlckxlbmd0aCBpcyBtdWx0aXBsZSBvZiA2NCwgYWRkIGV4dHJhIDQgYnl0ZXMgYWdhaW4uCisJCWlmICgoVHJhbnNmZXJCdWZmZXJMZW5ndGggJSBwQWQtPkJ1bGtPdXRNYXhQYWNrZXRTaXplKSA9PSAwKQorCQl7CisJCQlOZGlzWmVyb01lbW9yeShwRGVzdCwgNCk7CisJCQlUcmFuc2ZlckJ1ZmZlckxlbmd0aCArPSA0OworCQl9CisKKwkJLy8gRmlsbCBvdXQgZnJhbWUgbGVuZ3RoIGluZm9ybWF0aW9uIGZvciBnbG9iYWwgQnVsayBvdXQgYXJiaXRvcgorCQlwQWQtPk51bGxDb250ZXh0LkJ1bGtPdXRTaXplID0gVHJhbnNmZXJCdWZmZXJMZW5ndGg7CisJfQorI2lmZGVmIFJUX0JJR19FTkRJQU4KKwlSVE1QV0lFbmRpYW5DaGFuZ2UoKFBVQ0hBUilwVHhXSSwgVFlQRV9UWFdJKTsKKwlSVE1QRnJhbWVFbmRpYW5DaGFuZ2UocEFkLCAoKChQVUNIQVIpcFR4SW5mbykrVFhXSV9TSVpFK1RYSU5GT19TSVpFKSwgRElSX1dSSVRFLCBGQUxTRSk7CisgICAgUlRNUERlc2NyaXB0b3JFbmRpYW5DaGFuZ2UoKFBVQ0hBUilwVHhJbmZvLCBUWVBFX1RYSU5GTyk7CisjZW5kaWYgLy8gUlRfQklHX0VORElBTiAvLworCXJldHVybiAwOworfQorCitWT0lEIEFURV9SVFVTQkJ1bGtPdXREYXRhUGFja2V0Q29tcGxldGUocHVyYmJfdCBwVXJiLCBzdHJ1Y3QgcHRfcmVncyAqcHRfcmVncykKK3sKKwlQUlRNUF9BREFQVEVSCQlwQWQ7CisJUFRYX0NPTlRFWFQJCSAgICBwTnVsbENvbnRleHQ7CisJVUNIQVIJCQkJQnVsa091dFBpcGVJZDsKKwlOVFNUQVRVUwkJCVN0YXR1czsKKwl1bnNpZ25lZCBsb25nCQlJcnFGbGFnczsKKwlVTE9ORwkJCSAgICBPbGRWYWx1ZTsKKworCXBOdWxsQ29udGV4dCA9IChQVFhfQ09OVEVYVClwVXJiLT5jb250ZXh0OworCXBBZCA9IHBOdWxsQ29udGV4dC0+cEFkOworCisKKwkvLyBSZXNldCBOdWxsIGZyYW1lIGNvbnRleHQgZmxhZ3MKKwlwTnVsbENvbnRleHQtPklSUFBlbmRpbmcgPSBGQUxTRTsKKwlwTnVsbENvbnRleHQtPkluVXNlID0gRkFMU0U7CisJU3RhdHVzID0gcFVyYi0+c3RhdHVzOworCisJLy8gU3RvcmUgQnVsa091dCBQaXBlSWQKKwlCdWxrT3V0UGlwZUlkID0gcE51bGxDb250ZXh0LT5CdWxrT3V0UGlwZUlkOworCXBBZC0+QnVsa091dERhdGFPbmVTZWNDb3VudCsrOworCisJaWYgKFN0YXR1cyA9PSBVU0JfU1RfTk9FUlJPUikKKwl7CisjaWZkZWYgUkFMSU5LXzI4eHhfUUEKKwkJaWYgKChBVEVfT04ocEFkKSkgJiYgKHBBZC0+YXRlLmJRQVR4U3RhcnQgPT0gVFJVRSkpCisJCXsKKwkJCWlmIChwQWQtPmF0ZS5RSUQgPT0gQnVsa091dFBpcGVJZCkKKwkJCXsKKwkJCQkvLyBMZXQgUnggY2FuIGhhdmUgYSBjaGFuY2UgdG8gYnJlYWsgaW4gZHVyaW5nIFR4IHByb2Nlc3MsCisJCQkJLy8gZXNwZWNpYWxseSBmb3IgbG9vcGJhY2sgbW9kZSBpbiBRQSBBVEUuCisJCQkJLy8gVG8gdHJhZGUgb2ZmIGJldHdlZW4gdHggcGVyZm9ybWFuY2UgYW5kIGxvb3BiYWNrIG1vZGUgaW50ZWdyaXR5LgorCQkJCS8qIFEgICA6IE5vdyBSeCBpcyBoYW5kbGVkIGJ5IHRhc2tsZXQsIGRvIHdlIHN0aWxsIG5lZWQgdGhpcyBkZWxheSA/ICovCisJCQkJLyogQW5zIDogRXZlbiB0YXNrbGV0IGlzIHVzZWQsIFJ4L1R4IDwgMSBpZiB3ZSBkbyBub3QgZGVsYXkgZm9yIGEgd2hpbGUgcmlnaHQgaGVyZS4gKi8KKwkJCQlSVE1QdXNlY0RlbGF5KDUwMCk7CisJCQkJcEFkLT5hdGUuVHhEb25lQ291bnQrKzsKKwkJCQlwQWQtPlJhbGlua0NvdW50ZXJzLktpY2tUeENvdW50Kys7CisJCQkJQVNTRVJUKHBBZC0+YXRlLlFJRCA9PSAwKTsKKwkJCQlwQWQtPmF0ZS5UeEFjMCsrOworCQkJfQorCQl9CisjZW5kaWYgLy8gUkFMSU5LXzI4eHhfUUEgLy8KKwkJcEFkLT5CdWxrT3V0Q29tcGxldGUrKzsKKworCQlwQWQtPkNvdW50ZXJzODAyMy5Hb29kVHJhbnNtaXRzKys7CisKKwkJLyogRG9uJ3Qgd29ycnkgYWJvdXQgdGhlIHF1ZXVlIGlzIGVtcHR5IG9yIG5vdC4gVGhpcyBmdW5jdGlvbiB3aWxsIGNoZWNrIGl0c2VsZi4gKi8KKwkJUlRNUERlUXVldWVQYWNrZXQocEFkLCBUUlVFLCBCdWxrT3V0UGlwZUlkLCBNQVhfVFhfUFJPQ0VTUyk7CisKKwkJLyogSW4gMjh4eCwgU2VuZFR4V2FpdFF1ZXVlID09PiBUeFN3UXVldWUgICovCisvKgorCQlpZiAocEFkLT5TZW5kVHhXYWl0UXVldWVbQnVsa091dFBpcGVJZF0uTnVtYmVyID4gMCkKKwkJeworCQkJUlRNUERlUXVldWVQYWNrZXQocEFkLCBCdWxrT3V0UGlwZUlkKTsKKwkJfQorKi8KKwl9CisJZWxzZQkvLyBTVEFUVVNfT1RIRVIKKwl7CisJCXBBZC0+QnVsa091dENvbXBsZXRlT3RoZXIrKzsKKworCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJCdWxrT3V0RGF0YVBhY2tldCBGYWlsZWQgU1RBVFVTX09USEVSID0gMHgleCAuIFxuIiwgU3RhdHVzKSk7CisJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIj4+QnVsa091dFJlcT0weCVseCwgQnVsa091dENvbXBsZXRlPTB4JWx4XG4iLCBwQWQtPkJ1bGtPdXRSZXEsIHBBZC0+QnVsa091dENvbXBsZXRlKSk7CisKKwkJaWYgKCghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTKSkgJiYKKwkJCSghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MpKSAmJgorCQkJKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpICYmCisJCQkoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CVUxLT1VUX1JFU0VUKSkpCisJCXsKKwkJCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JVTEtPVVRfUkVTRVQpOworCQkJLyogSW4gMjh4eCwgUlRfT0lEX1VTQl9SRVNFVF9CVUxLX09VVCA9PT4gQ01EVEhSRUFEX1JFU0VUX0JVTEtfT1VUICovCisJCQlSVFVTQkVucXVldWVJbnRlcm5hbENtZChwQWQsIENNRFRIUkVBRF9SRVNFVF9CVUxLX09VVCwgTlVMTCwgMCk7CisJCQkvLyBDaGVjaworCQkJQlVMS19PVVRfTE9DSygmcEFkLT5CdWxrT3V0TG9ja1tCdWxrT3V0UGlwZUlkXSwgSXJxRmxhZ3MpOworCQkJcEFkLT5CdWxrT3V0UGVuZGluZ1tCdWxrT3V0UGlwZUlkXSA9IEZBTFNFOworCQkJcEFkLT5idWxrUmVzZXRQaXBlaWQgPSBCdWxrT3V0UGlwZUlkOworCQkJQlVMS19PVVRfVU5MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrW0J1bGtPdXRQaXBlSWRdLCBJcnFGbGFncyk7CisJCQlyZXR1cm47CisJCX0KKwl9CisKKworCisJaWYgKGF0b21pY19yZWFkKCZwQWQtPkJ1bGtPdXRSZW1haW5lZCkgPiAwKQorCXsKKwkJYXRvbWljX2RlYygmcEFkLT5CdWxrT3V0UmVtYWluZWQpOworCX0KKworCS8vIDFzdCAtIFRyYW5zbWl0IFN1Y2Nlc3MKKwlPbGRWYWx1ZSA9IHBBZC0+V2xhbkNvdW50ZXJzLlRyYW5zbWl0dGVkRnJhZ21lbnRDb3VudC51Lkxvd1BhcnQ7CisJcEFkLT5XbGFuQ291bnRlcnMuVHJhbnNtaXR0ZWRGcmFnbWVudENvdW50LnUuTG93UGFydCsrOworCisJaWYgKHBBZC0+V2xhbkNvdW50ZXJzLlRyYW5zbWl0dGVkRnJhZ21lbnRDb3VudC51Lkxvd1BhcnQgPCBPbGRWYWx1ZSkKKwl7CisJCXBBZC0+V2xhbkNvdW50ZXJzLlRyYW5zbWl0dGVkRnJhZ21lbnRDb3VudC51LkhpZ2hQYXJ0Kys7CisJfQorCisJaWYoKChwQWQtPkNvbnRpbkJ1bGtPdXQgPT0gVFJVRSApIHx8KGF0b21pY19yZWFkKCZwQWQtPkJ1bGtPdXRSZW1haW5lZCkgPiAwKSkgJiYgKHBBZC0+YXRlLk1vZGUgJiBBVEVfVFhGUkFNRSkpCisJeworCQlSVFVTQl9TRVRfQlVMS19GTEFHKHBBZCwgZlJUVVNCX0JVTEtfT1VUX0RBVEFfQVRFKTsKKwl9CisJZWxzZQorCXsKKwkJUlRVU0JfQ0xFQVJfQlVMS19GTEFHKHBBZCwgZlJUVVNCX0JVTEtfT1VUX0RBVEFfQVRFKTsKKyNpZmRlZiBSQUxJTktfMjh4eF9RQQorCQlwQWQtPmF0ZS5UeFN0YXR1cyA9IDA7CisjZW5kaWYgLy8gUkFMSU5LXzI4eHhfUUEgLy8KKwl9CisKKwlCVUxLX09VVF9MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrW0J1bGtPdXRQaXBlSWRdLCBJcnFGbGFncyk7CisJcEFkLT5CdWxrT3V0UGVuZGluZ1tCdWxrT3V0UGlwZUlkXSA9IEZBTFNFOworCUJVTEtfT1VUX1VOTE9DSygmcEFkLT5CdWxrT3V0TG9ja1tCdWxrT3V0UGlwZUlkXSwgSXJxRmxhZ3MpOworCisJLy8gQWx3YXlzIGNhbGwgQnVsayByb3V0aW5lLCBldmVuIHJlc2V0IGJ1bGsuCisJLy8gVGhlIHByb3RlY3Rpb24gb2YgcmVzdCBidWxrIHNob3VsZCBiZSBpbiBCdWxrT3V0IHJvdXRpbmUuCisJUlRVU0JLaWNrQnVsa091dChwQWQpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKworCUFyZ3VtZW50czoKKworCVJldHVybiBWYWx1ZToKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECUFURV9SVFVTQkJ1bGtPdXREYXRhUGFja2V0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVDSEFSCQkJQnVsa091dFBpcGVJZCkKK3sKKwlQVFhfQ09OVEVYVAkJcE51bGxDb250ZXh0ID0gJihwQWQtPk51bGxDb250ZXh0KTsKKwlQVVJCCQkJcFVyYjsKKwlpbnQJCQkJcmV0ID0gMDsKKwl1bnNpZ25lZCBsb25nCUlycUZsYWdzOworCisKKwlBU1NFUlQoQnVsa091dFBpcGVJZCA9PSAwKTsKKworCS8qIEJ1aWxkIHVwIHRoZSBmcmFtZSBmaXJzdC4gKi8KKy8vCUFURVNldFVwRnJhbWUocEFkLCAwKTsKKworCUJVTEtfT1VUX0xPQ0soJnBBZC0+QnVsa091dExvY2tbQnVsa091dFBpcGVJZF0sIElycUZsYWdzKTsKKworCWlmIChwQWQtPkJ1bGtPdXRQZW5kaW5nW0J1bGtPdXRQaXBlSWRdID09IFRSVUUpCisJeworCQlCVUxLX09VVF9VTkxPQ0soJnBBZC0+QnVsa091dExvY2tbQnVsa091dFBpcGVJZF0sIElycUZsYWdzKTsKKwkJcmV0dXJuOworCX0KKworCXBBZC0+QnVsa091dFBlbmRpbmdbQnVsa091dFBpcGVJZF0gPSBUUlVFOworCUJVTEtfT1VUX1VOTE9DSygmcEFkLT5CdWxrT3V0TG9ja1tCdWxrT3V0UGlwZUlkXSwgSXJxRmxhZ3MpOworCisJLy8gSW5jcmVhc2UgVG90YWwgdHJhbnNtaXQgYnl0ZSBjb3VudGVyCisJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUcmFuc21pdHRlZEJ5dGVDb3VudCArPSAgcE51bGxDb250ZXh0LT5CdWxrT3V0U2l6ZTsKKwlwQWQtPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkQnl0ZUNvdW50ICs9ICBwTnVsbENvbnRleHQtPkJ1bGtPdXRTaXplOworCisJLy8gQ2xlYXIgQVRFIGZyYW1lIGJ1bGsgb3V0IGZsYWcKKwlSVFVTQl9DTEVBUl9CVUxLX0ZMQUcocEFkLCBmUlRVU0JfQlVMS19PVVRfREFUQV9BVEUpOworCisJLy8gSW5pdCBUeCBjb250ZXh0IGRlc2NyaXB0b3IKKwlwTnVsbENvbnRleHQtPklSUFBlbmRpbmcgPSBUUlVFOworCVJUVVNCSW5pdFR4RGVzYyhwQWQsIHBOdWxsQ29udGV4dCwgQnVsa091dFBpcGVJZCwgKHVzYl9jb21wbGV0ZV90KUFURV9SVFVTQkJ1bGtPdXREYXRhUGFja2V0Q29tcGxldGUpOworCXBVcmIgPSBwTnVsbENvbnRleHQtPnBVcmI7CisKKwlpZigocmV0ID0gUlRVU0JfU1VCTUlUX1VSQihwVXJiKSkhPTApCisJeworCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJBVEVfUlRVU0JCdWxrT3V0RGF0YVBhY2tldDogU3VibWl0IFR4IFVSQiBmYWlsZWQgJWRcbiIsIHJldCkpOworCQlyZXR1cm47CisJfQorCisJcEFkLT5CdWxrT3V0UmVxKys7CisJcmV0dXJuOworCit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCisJQXJndW1lbnRzOgorCisJUmV0dXJuIFZhbHVlOgorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJQVRFX1JUVVNCQ2FuY2VsUGVuZGluZ0J1bGtJbklSUCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCkKK3sKKwlQUlhfQ09OVEVYVAkJcFJ4Q29udGV4dDsKKwlVSU5UCQkJaTsKKworCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tLT5BVEVfUlRVU0JDYW5jZWxQZW5kaW5nQnVsa0luSVJQXG4iKSk7CisjaWYgMQorCWZvciAoIGkgPSAwOyBpIDwgKFJYX1JJTkdfU0laRSk7IGkrKykKKwl7CisJCXBSeENvbnRleHQgPSAmKHBBZC0+UnhDb250ZXh0W2ldKTsKKwkJaWYocFJ4Q29udGV4dC0+SVJQUGVuZGluZyA9PSBUUlVFKQorCQl7CisJCQlSVFVTQl9VTkxJTktfVVJCKHBSeENvbnRleHQtPnBVcmIpOworCQkJcFJ4Q29udGV4dC0+SVJQUGVuZGluZyA9IEZBTFNFOworCQkJcFJ4Q29udGV4dC0+SW5Vc2UgPSBGQUxTRTsKKwkJCS8vTmRpc0ludGVybG9ja2VkRGVjcmVtZW50KCZwQWQtPlBlbmRpbmdSeCk7CisJCQkvL3BBZC0+UGVuZGluZ1J4LS07CisJCX0KKwl9CisjZWxzZQorCWZvciAoIGkgPSAwOyBpIDwgKFJYX1JJTkdfU0laRSk7IGkrKykKKwl7CisJCXBSeENvbnRleHQgPSAmKHBBZC0+UnhDb250ZXh0W2ldKTsKKwkJaWYoYXRvbWljX3JlYWQoJnBSeENvbnRleHQtPklycExvY2spID09IElSUExPQ0tfQ0FOQ0VMQUJMRSkKKwkJeworCQkJUlRVU0JfVU5MSU5LX1VSQihwUnhDb250ZXh0LT5wVXJiKTsKKwkJfQorCQlJbnRlcmxvY2tlZEV4Y2hhbmdlKCZwUnhDb250ZXh0LT5JcnBMb2NrLCBJUlBMT0NLX0NBTkNFX1NUQVJUKTsKKwl9CisjZW5kaWYgLy8gMSAvLworCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjwtLS1BVEVfUlRVU0JDYW5jZWxQZW5kaW5nQnVsa0luSVJQXG4iKSk7CisJcmV0dXJuOworfQorI2VuZGlmIC8vIFJUMjg3MCAvLworCitWT0lEIHJ0X2VlX3JlYWRfYWxsKFBSVE1QX0FEQVBURVIgcEFkLCBVU0hPUlQgKkRhdGEpCit7CisJVVNIT1JUIGk7CisJVVNIT1JUIHZhbHVlOworCisJZm9yIChpID0gMCA7IGkgPCBFRVBST01fU0laRS8yIDsgKQorCXsKKwkJLyogInZhbHVlIiBpcyBleHBlY2lhbGx5IGZvciBzb21lIGNvbXBpbGVycy4uLiAqLworCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIGkqMiwgdmFsdWUpOworCQlEYXRhW2ldID0gdmFsdWU7CisJCWkrKzsKKwl9Cit9CisKK1ZPSUQgcnRfZWVfd3JpdGVfYWxsKFBSVE1QX0FEQVBURVIgcEFkLCBVU0hPUlQgKkRhdGEpCit7CisJVVNIT1JUIGk7CisJVVNIT1JUIHZhbHVlOworCisJZm9yIChpID0gMCA7IGkgPCBFRVBST01fU0laRS8yIDsgKQorCXsKKwkJLyogInZhbHVlIiBpcyBleHBlY2lhbGx5IGZvciBzb21lIGNvbXBpbGVycy4uLiAqLworCQl2YWx1ZSA9IERhdGFbaV07CisJCVJUMjh4eF9FRVBST01fV1JJVEUxNihwQWQsIGkqMiwgdmFsdWUpOworCQlpICsrOworCX0KK30KKyNpZmRlZiBSQUxJTktfMjh4eF9RQQorVk9JRCBBVEVfUUFfU3RhdGlzdGljcygKKwlJTiBQUlRNUF9BREFQVEVSCQkJcEFkLAorCUlOIFBSWFdJX1NUUlVDCQkJCXBSeFdJLAorCUlOIFBSVDI4WFhfUlhEX1NUUlVDCQlwUnhELAorCUlOIFBIRUFERVJfODAyXzExCQkJcEhlYWRlcikKK3sKKwkvLyB1cGRhdGUgY291bnRlciBmaXJzdAorCWlmIChwSGVhZGVyICE9IE5VTEwpCisJeworCQlpZiAocEhlYWRlci0+RkMuVHlwZSA9PSBCVFlQRV9EQVRBKQorCQl7CisJCQlpZiAocFJ4RC0+VTJNKQorCQkJCXBBZC0+YXRlLlUyTSsrOworCQkJZWxzZQorCQkJCXBBZC0+YXRlLk90aGVyRGF0YSsrOworCQl9CisJCWVsc2UgaWYgKHBIZWFkZXItPkZDLlR5cGUgPT0gQlRZUEVfTUdNVCkKKwkJeworCQkJaWYgKHBIZWFkZXItPkZDLlN1YlR5cGUgPT0gU1VCVFlQRV9CRUFDT04pCisJCQkJcEFkLT5hdGUuQmVhY29uKys7CisJCQllbHNlCisJCQkJcEFkLT5hdGUuT3RoZXJDb3VudCsrOworCQl9CisJCWVsc2UgaWYgKHBIZWFkZXItPkZDLlR5cGUgPT0gQlRZUEVfQ05UTCkKKwkJeworCQkJcEFkLT5hdGUuT3RoZXJDb3VudCsrOworCQl9CisJfQorCXBBZC0+YXRlLlJTU0kwID0gcFJ4V0ktPlJTU0kwOworCXBBZC0+YXRlLlJTU0kxID0gcFJ4V0ktPlJTU0kxOworCXBBZC0+YXRlLlJTU0kyID0gcFJ4V0ktPlJTU0kyOworCXBBZC0+YXRlLlNOUjAgPSBwUnhXSS0+U05SMDsKKwlwQWQtPmF0ZS5TTlIxID0gcFJ4V0ktPlNOUjE7Cit9CisKKy8qIGNvbW1hbmQgaWQgd2l0aCBDbWQgVHlwZSA9PSAweDAwMDgoZm9yIDI4eHgpLzB4MDAwNShmb3IgaU5JQykgKi8KKyNkZWZpbmUgUkFDRkdfQ01EX1JGX1dSSVRFX0FMTAkJMHgwMDAwCisjZGVmaW5lIFJBQ0ZHX0NNRF9FMlBST01fUkVBRDE2CQkweDAwMDEKKyNkZWZpbmUgUkFDRkdfQ01EX0UyUFJPTV9XUklURTE2CTB4MDAwMgorI2RlZmluZSBSQUNGR19DTURfRTJQUk9NX1JFQURfQUxMCTB4MDAwMworI2RlZmluZSBSQUNGR19DTURfRTJQUk9NX1dSSVRFX0FMTAkweDAwMDQKKyNkZWZpbmUgUkFDRkdfQ01EX0lPX1JFQUQJCQkweDAwMDUKKyNkZWZpbmUgUkFDRkdfQ01EX0lPX1dSSVRFCQkJMHgwMDA2CisjZGVmaW5lIFJBQ0ZHX0NNRF9JT19SRUFEX0JVTEsJCTB4MDAwNworI2RlZmluZSBSQUNGR19DTURfQkJQX1JFQUQ4CQkJMHgwMDA4CisjZGVmaW5lIFJBQ0ZHX0NNRF9CQlBfV1JJVEU4CQkweDAwMDkKKyNkZWZpbmUgUkFDRkdfQ01EX0JCUF9SRUFEX0FMTAkJMHgwMDBhCisjZGVmaW5lIFJBQ0ZHX0NNRF9HRVRfQ09VTlRFUgkJMHgwMDBiCisjZGVmaW5lIFJBQ0ZHX0NNRF9DTEVBUl9DT1VOVEVSCQkweDAwMGMKKworI2RlZmluZSBSQUNGR19DTURfUlNWMQkJCQkweDAwMGQKKyNkZWZpbmUgUkFDRkdfQ01EX1JTVjIJCQkJMHgwMDBlCisjZGVmaW5lIFJBQ0ZHX0NNRF9SU1YzCQkJCTB4MDAwZgorCisjZGVmaW5lIFJBQ0ZHX0NNRF9UWF9TVEFSVAkJCTB4MDAxMAorI2RlZmluZSBSQUNGR19DTURfR0VUX1RYX1NUQVRVUwkJMHgwMDExCisjZGVmaW5lIFJBQ0ZHX0NNRF9UWF9TVE9QCQkJMHgwMDEyCisjZGVmaW5lIFJBQ0ZHX0NNRF9SWF9TVEFSVAkJCTB4MDAxMworI2RlZmluZSBSQUNGR19DTURfUlhfU1RPUAkJCTB4MDAxNAorI2RlZmluZSBSQUNGR19DTURfR0VUX05PSVNFX0xFVkVMCTB4MDAxNQorCisjZGVmaW5lIFJBQ0ZHX0NNRF9BVEVfU1RBUlQJCQkweDAwODAKKyNkZWZpbmUgUkFDRkdfQ01EX0FURV9TVE9QCQkJMHgwMDgxCisKKyNkZWZpbmUgUkFDRkdfQ01EX0FURV9TVEFSVF9UWF9DQVJSSUVSCQkweDAxMDAKKyNkZWZpbmUgUkFDRkdfQ01EX0FURV9TVEFSVF9UWF9DT05UCQkJMHgwMTAxCisjZGVmaW5lIFJBQ0ZHX0NNRF9BVEVfU1RBUlRfVFhfRlJBTUUJCTB4MDEwMgorI2RlZmluZSBSQUNGR19DTURfQVRFX1NFVF9CVwkgICAgICAgICAgICAweDAxMDMKKyNkZWZpbmUgUkFDRkdfQ01EX0FURV9TRVRfVFhfUE9XRVIwCSAgICAgICAgMHgwMTA0CisjZGVmaW5lIFJBQ0ZHX0NNRF9BVEVfU0VUX1RYX1BPV0VSMQkJCTB4MDEwNQorI2RlZmluZSBSQUNGR19DTURfQVRFX1NFVF9GUkVRX09GRlNFVAkJMHgwMTA2CisjZGVmaW5lIFJBQ0ZHX0NNRF9BVEVfR0VUX1NUQVRJU1RJQ1MJCTB4MDEwNworI2RlZmluZSBSQUNGR19DTURfQVRFX1JFU0VUX0NPVU5URVIJCQkweDAxMDgKKyNkZWZpbmUgUkFDRkdfQ01EX0FURV9TRUxfVFhfQU5URU5OQQkJMHgwMTA5CisjZGVmaW5lIFJBQ0ZHX0NNRF9BVEVfU0VMX1JYX0FOVEVOTkEJCTB4MDEwYQorI2RlZmluZSBSQUNGR19DTURfQVRFX1NFVF9QUkVBTUJMRQkJCTB4MDEwYgorI2RlZmluZSBSQUNGR19DTURfQVRFX1NFVF9DSEFOTkVMCQkJMHgwMTBjCisjZGVmaW5lIFJBQ0ZHX0NNRF9BVEVfU0VUX0FERFIxCQkJCTB4MDEwZAorI2RlZmluZSBSQUNGR19DTURfQVRFX1NFVF9BRERSMgkJCQkweDAxMGUKKyNkZWZpbmUgUkFDRkdfQ01EX0FURV9TRVRfQUREUjMJCQkJMHgwMTBmCisjZGVmaW5lIFJBQ0ZHX0NNRF9BVEVfU0VUX1JBVEUJCQkJMHgwMTEwCisjZGVmaW5lIFJBQ0ZHX0NNRF9BVEVfU0VUX1RYX0ZSQU1FX0xFTgkJMHgwMTExCisjZGVmaW5lIFJBQ0ZHX0NNRF9BVEVfU0VUX1RYX0ZSQU1FX0NPVU5UCTB4MDExMgorI2RlZmluZSBSQUNGR19DTURfQVRFX1NUQVJUX1JYX0ZSQU1FCQkweDAxMTMKKyNkZWZpbmUgUkFDRkdfQ01EX0FURV9FMlBST01fUkVBRF9CVUxLCTB4MDExNAorI2RlZmluZSBSQUNGR19DTURfQVRFX0UyUFJPTV9XUklURV9CVUxLCTB4MDExNQorI2RlZmluZSBSQUNGR19DTURfQVRFX0lPX1dSSVRFX0JVTEsJCTB4MDExNgorI2RlZmluZSBSQUNGR19DTURfQVRFX0JCUF9SRUFEX0JVTEsJCTB4MDExNworI2RlZmluZSBSQUNGR19DTURfQVRFX0JCUF9XUklURV9CVUxLCTB4MDExOAorI2RlZmluZSBSQUNGR19DTURfQVRFX1JGX1JFQURfQlVMSwkJMHgwMTE5CisjZGVmaW5lIFJBQ0ZHX0NNRF9BVEVfUkZfV1JJVEVfQlVMSwkJMHgwMTFhCisKKworCisjZGVmaW5lIEEySGV4KF9YLCBfcCkgCQkJCVwKK3sJCQkJCQkJCQlcCisJVUNIQVIgKnA7CQkJCQkJXAorCV9YID0gMDsJCQkJCQkJXAorCXAgPSBfcDsJCQkJCQkJXAorCXdoaWxlICgoKCpwID49ICdhJykgJiYgKCpwIDw9ICdmJykpIHx8ICgoKnAgPj0gJ0EnKSAmJiAoKnAgPD0gJ0YnKSkgfHwgKCgqcCA+PSAnMCcpICYmICgqcCA8PSAnOScpKSkJCVwKKwl7CQkJCQkJCQkJCQkJXAorCQlpZiAoKCpwID49ICdhJykgJiYgKCpwIDw9ICdmJykpCQkJCVwKKwkJCV9YID0gX1ggKiAxNiArICpwIC0gODc7CQkJCQlcCisJCWVsc2UgaWYgKCgqcCA+PSAnQScpICYmICgqcCA8PSAnRicpKQkJXAorCQkJX1ggPSBfWCAqIDE2ICsgKnAgLSA1NTsJCQkJCVwKKwkJZWxzZSBpZiAoKCpwID49ICcwJykgJiYgKCpwIDw9ICc5JykpCQlcCisJCQlfWCA9IF9YICogMTYgKyAqcCAtIDQ4OwkJCQkJXAorCQlwKys7CQkJCQkJCQkJCVwKKwl9CQkJCQkJCQkJCQkJXAorfQorCisKK3N0YXRpYyBWT0lEIG1lbWNweV9leGwoUFJUTVBfQURBUFRFUiBwQWQsIFVDSEFSICpkc3QsIFVDSEFSICpzcmMsIFVMT05HIGxlbik7CitzdGF0aWMgVk9JRCBtZW1jcHlfZXhzKFBSVE1QX0FEQVBURVIgcEFkLCBVQ0hBUiAqZHN0LCBVQ0hBUiAqc3JjLCBVTE9ORyBsZW4pOworc3RhdGljIFZPSUQgUlRNUF9JT19SRUFEX0JVTEsoUFJUTVBfQURBUFRFUiBwQWQsIFVDSEFSICpkc3QsIFVDSEFSICpzcmMsIFVJTlQzMiBsZW4pOworCisjaWZkZWYgVUNPUworaW50IGF0ZV9jb3B5X3RvX3VzZXIoCisJSU4gUFVDSEFSIHBheWxvYWQsCisJSU4gUFVDSEFSIG1zZywKKwlJTiBJTlQgICAgbGVuKQoreworCW1lbW1vdmUocGF5bG9hZCwgbXNnLCBsZW4pOworCXJldHVybiAwOworfQorCisjdW5kZWYJY29weV90b191c2VyCisjZGVmaW5lIGNvcHlfdG9fdXNlcih4LHkseikgYXRlX2NvcHlfdG9fdXNlcigoUFVDSEFSKXgsIChQVUNIQVIpeSwgeikKKyNlbmRpZiAvLyBVQ09TIC8vCisKKyNkZWZpbmUJTEVOX09GX0FSRyAxNgorCitWT0lEIFJ0bXBEb0F0ZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAorCUlOCXN0cnVjdCBpd3JlcQkqd3JxKQoreworCXVuc2lnbmVkIHNob3J0IENvbW1hbmRfSWQ7CisJc3RydWN0IGF0ZV9yYWNmZ2hkciAqcFJhQ2ZnOworCUlOVAlTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworCisKKworCWlmKChwUmFDZmcgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgYXRlX3JhY2ZnaGRyKSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpCisJeworCQlTdGF0dXMgPSAtRUlOVkFMOworCQlyZXR1cm47CisJfQorCisJTmRpc1plcm9NZW1vcnkocFJhQ2ZnLCBzaXplb2Yoc3RydWN0IGF0ZV9yYWNmZ2hkcikpOworCisgICAgaWYgKGNvcHlfZnJvbV91c2VyKChQVUNIQVIpcFJhQ2ZnLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorCXsKKwkJU3RhdHVzID0gLUVGQVVMVDsKKwkJa2ZyZWUocFJhQ2ZnKTsKKwkJcmV0dXJuOworCX0KKworCisJQ29tbWFuZF9JZCA9IG50b2hzKHBSYUNmZy0+Y29tbWFuZF9pZCk7CisKKwlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlxuJXM6IENvbW1hbmRfSWQgPSAweCUwNHggIVxuIiwgX19mdW5jX18sIENvbW1hbmRfSWQpKTsKKworCXN3aXRjaCAoQ29tbWFuZF9JZCkKKwl7CisgCQkvLyBXZSB3aWxsIGdldCB0aGlzIGNvbW1hbmQgd2hlbiBRQSBzdGFydHMuCisJCWNhc2UgUkFDRkdfQ01EX0FURV9TVEFSVDoKKwkJCXsKKwkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJBQ0ZHX0NNRF9BVEVfU1RBUlRcbiIpKTsKKworCQkJCS8vIHByZXBhcmUgZmVlZGJhY2sgYXMgc29vbiBhcyB3ZSBjYW4gdG8gYXZvaWQgUUEgdGltZW91dC4KKwkJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDIpOworCQkJCXBSYUNmZy0+c3RhdHVzID0gaHRvbnMoMCk7CisKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKwkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJ3cnEtPnUuZGF0YS5sZW5ndGggPSAlZFxuIiwgd3JxLT51LmRhdGEubGVuZ3RoKSk7CisKKyAgICAgICAgICAgIAlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfQVRFX1NUQVJUXG4iKSk7CisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICAJfQorCQkJCWVsc2UKKwkJCQl7CisgICAgICAgICAgICAgICAgCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJBQ0ZHX0NNRF9BVEVfU1RBUlQgaXMgZG9uZSAhXG4iKSk7CisJCQkJfQorCQkJCVNldF9BVEVfUHJvYyhwQWRhcHRlciwgIkFURVNUQVJUIik7CisJCQl9CisJCQlicmVhazsKKworIAkJLy8gV2Ugd2lsbCBnZXQgdGhpcyBjb21tYW5kIGVpdGhlciBRQSBpcyBjbG9zZWQgb3IgYXRlZCBpcyBraWxsZWQgYnkgdXNlci4KKwkJY2FzZSBSQUNGR19DTURfQVRFX1NUT1A6CisJCQl7CisjaWZuZGVmIFVDT1MKKwkJCQlJTlQzMiByZXQ7CisjZW5kaWYgLy8gIVVDT1MgLy8KKworCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUkFDRkdfQ01EX0FURV9TVE9QXG4iKSk7CisKKwkJCQkvLyBEaXN0aW5ndWlzaCB0aGlzIGNvbW1hbmQgY2FtZSBmcm9tIFFBKHZpYSBhdGVkKQorCQkJCS8vIG9yIGF0ZSBkYWVtb24gYWNjb3JkaW5nIHRvIHRoZSBleGlzdGVuY2Ugb2YgcGlkIGluIHBheWxvYWQuCisJCQkJLy8gTm8gbmVlZCB0byBwcmVwYXJlIGZlZWRiYWNrIGlmIHRoaXMgY21kIGNhbWUgZGlyZWN0bHkgZnJvbSBhdGUgZGFlbW9uLgorCQkJCXBSYUNmZy0+bGVuZ3RoID0gbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworCisJCQkJaWYgKHBSYUNmZy0+bGVuZ3RoID09IHNpemVvZihwQWRhcHRlci0+YXRlLkF0ZVBpZCkpCisJCQkJeworCQkJCQkvLyBUaGlzIGNvbW1hbmQgY2FtZSBmcm9tIFFBLgorCQkJCQkvLyBHZXQgdGhlIHBpZCBvZiBBVEUgZGFlbW9uLgorCQkJCQltZW1jcHkoKFVDSEFSICopJnBBZGFwdGVyLT5hdGUuQXRlUGlkLAorCQkJCQkJKCZwUmFDZmctPmRhdGFbMF0pIC0gMi8qID09ICYocFJhQ2ZnLT5zdGF0dXMpICovLAorCQkJCQkJc2l6ZW9mKHBBZGFwdGVyLT5hdGUuQXRlUGlkKSk7CisKKwkJCQkJLy8gcHJlcGFyZSBmZWVkYmFjayBhcyBzb29uIGFzIHdlIGNhbiB0byBhdm9pZCBRQSB0aW1lb3V0LgorCQkJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDIpOworCQkJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDApOworCisJCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihwUmFDZmctPm1hZ2ljX25vKSArIHNpemVvZihwUmFDZmctPmNvbW1hbmRfdHlwZSkKKwkJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworCisJCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIndycS0+dS5kYXRhLmxlbmd0aCA9ICVkXG4iLCB3cnEtPnUuZGF0YS5sZW5ndGgpKTsKKworCSAgICAgICAgICAgIAlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKwkgICAgICAgICAgICAJeworCSAgICAgICAgICAgIAkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY29weV90b191c2VyKCkgZmFpbCBpbiBjYXNlIFJBQ0ZHX0NNRF9BVEVfU1RPUFxuIikpOworCSAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKwkgICAgICAgICAgICAJfQorCisJCQkJCS8vCisJCQkJCS8vIGtpbGwgQVRFIGRhZW1vbiB3aGVuIGxlYXZpbmcgQVRFIG1vZGUuCisJCQkJCS8vIFdlIG11c3Qga2lsbCBBVEUgZGFlbW9uIGZpcnN0IGJlZm9yZSBzZXR0aW5nIEFURVNUT1AsCisJCQkJCS8vIG9yIE1pY3Jvc29mdCB3aWxsIHJlcG9ydCBzdGguIHdyb25nLgorI2lmbmRlZiBVQ09TCisJCQkJCXJldCA9IEtJTExfVEhSRUFEX1BJRChwQWRhcHRlci0+YXRlLkF0ZVBpZCwgU0lHVEVSTSwgMSk7CisJCQkJCWlmIChyZXQpCisJCQkJCXsKKwkJCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzOiB1bmFibGUgdG8gc2lnbmFsIHRocmVhZFxuIiwgcEFkYXB0ZXItPm5ldF9kZXYtPm5hbWUpKTsKKwkJCQkJfQorI2VuZGlmIC8vICFVQ09TIC8vCisJCQkJfQorCisJCQkJLy8gQVAgbWlnaHQgaGF2ZSBpbiBBVEVfU1RPUCBtb2RlIGR1ZSB0byBjbWQgZnJvbSBRQS4KKwkJCQlpZiAoQVRFX09OKHBBZGFwdGVyKSkKKwkJCQl7CisJCQkJCS8vIFNvbWVvbmUgaGFzIGtpbGxlZCBhdGUgZGFlbW9uIHdoaWxlIFFBIEdVSSBpcyBzdGlsbCBvcGVuLgorCQkJCQlTZXRfQVRFX1Byb2MocEFkYXB0ZXIsICJBVEVTVE9QIik7CisJCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJBQ0ZHX0NNRF9BUF9TVEFSVCBpcyBkb25lICFcbiIpKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFJBQ0ZHX0NNRF9SRl9XUklURV9BTEw6CisJCQl7CisJCQkJVUlOVDMyIFIxLCBSMiwgUjMsIFI0OworCQkJCVVTSE9SVCBjaGFubmVsOworCisJCQkJbWVtY3B5KCZSMSwgcFJhQ2ZnLT5kYXRhLTIsIDQpOworCQkJCW1lbWNweSgmUjIsIHBSYUNmZy0+ZGF0YSsyLCA0KTsKKwkJCQltZW1jcHkoJlIzLCBwUmFDZmctPmRhdGErNiwgNCk7CisJCQkJbWVtY3B5KCZSNCwgcFJhQ2ZnLT5kYXRhKzEwLCA0KTsKKwkJCQltZW1jcHkoJmNoYW5uZWwsIHBSYUNmZy0+ZGF0YSsxNCwgMik7CisKKwkJCQlwQWRhcHRlci0+TGF0Y2hSZlJlZ3MuUjEgPSBudG9obChSMSk7CisJCQkJcEFkYXB0ZXItPkxhdGNoUmZSZWdzLlIyID0gbnRvaGwoUjIpOworCQkJCXBBZGFwdGVyLT5MYXRjaFJmUmVncy5SMyA9IG50b2hsKFIzKTsKKwkJCQlwQWRhcHRlci0+TGF0Y2hSZlJlZ3MuUjQgPSBudG9obChSNCk7CisJCQkJcEFkYXB0ZXItPkxhdGNoUmZSZWdzLkNoYW5uZWwgPSBudG9ocyhjaGFubmVsKTsKKworCQkJCVJUTVBfUkZfSU9fV1JJVEUzMihwQWRhcHRlciwgcEFkYXB0ZXItPkxhdGNoUmZSZWdzLlIxKTsKKwkJCQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkYXB0ZXIsIHBBZGFwdGVyLT5MYXRjaFJmUmVncy5SMik7CisJCQkJUlRNUF9SRl9JT19XUklURTMyKHBBZGFwdGVyLCBwQWRhcHRlci0+TGF0Y2hSZlJlZ3MuUjMpOworCQkJCVJUTVBfUkZfSU9fV1JJVEUzMihwQWRhcHRlciwgcEFkYXB0ZXItPkxhdGNoUmZSZWdzLlI0KTsKKworCQkJCS8vIHByZXBhcmUgZmVlZGJhY2sKKwkJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDIpOworCQkJCXBSYUNmZy0+c3RhdHVzID0gaHRvbnMoMCk7CisKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKwkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJ3cnEtPnUuZGF0YS5sZW5ndGggPSAlZFxuIiwgd3JxLT51LmRhdGEubGVuZ3RoKSk7CisgICAgICAgICAgICAJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwUmFDZmcsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjb3B5X3RvX3VzZXIoKSBmYWlsIGluIGNhc2UgUkFDRkdfQ01EX1JGX1dSSVRFX0FMTFxuIikpOworICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgCX0KKwkJCQllbHNlCisJCQkJeworICAgICAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSQUNGR19DTURfUkZfV1JJVEVfQUxMIGlzIGRvbmUgIVxuIikpOworCQkJCX0KKwkJCX0KKyAgICAgICAgICAgIGJyZWFrOworCisJCWNhc2UgUkFDRkdfQ01EX0UyUFJPTV9SRUFEMTY6CisJCQl7CisJCQkJVVNIT1JUCW9mZnNldCwgdmFsdWUsIHRtcDsKKworCQkJCW9mZnNldCA9IG50b2hzKHBSYUNmZy0+c3RhdHVzKTsKKwkJCQkvKiAidG1wIiBpcyBleHBlY2lhbGx5IGZvciBzb21lIGNvbXBpbGVycy4uLiAqLworCQkJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZGFwdGVyLCBvZmZzZXQsIHRtcCk7CisJCQkJdmFsdWUgPSB0bXA7CisJCQkJdmFsdWUgPSBodG9ucyh2YWx1ZSk7CisKKwkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkVFUFJPTSBSZWFkIG9mZnNldCA9IDB4JTA0eCwgdmFsdWUgPSAweCUwNHhcbiIsIG9mZnNldCwgdmFsdWUpKTsKKworCQkJCS8vIHByZXBhcmUgZmVlZGJhY2sKKwkJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDQpOworCQkJCXBSYUNmZy0+c3RhdHVzID0gaHRvbnMoMCk7CisJCQkJbWVtY3B5KHBSYUNmZy0+ZGF0YSwgJnZhbHVlLCAyKTsKKworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihwUmFDZmctPm1hZ2ljX25vKSArIHNpemVvZihwUmFDZmctPmNvbW1hbmRfdHlwZSkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF9pZCkgKyBzaXplb2YocFJhQ2ZnLT5sZW5ndGgpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPnNlcXVlbmNlKSArIG50b2hzKHBSYUNmZy0+bGVuZ3RoKTsKKworCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoInNpemVvZihzdHJ1Y3QgYXRlX3JhY2ZnaGRyKSA9ICVkXG4iLCBzaXplb2Yoc3RydWN0IGF0ZV9yYWNmZ2hkcikpKTsKKwkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJ3cnEtPnUuZGF0YS5sZW5ndGggPSAlZFxuIiwgd3JxLT51LmRhdGEubGVuZ3RoKSk7CisKKyAgICAgICAgICAgIAlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfRTJQUk9NX1JFQUQxNlxuIikpOworICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgCX0KKwkJCQllbHNlCisJCQkJeworICAgICAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSQUNGR19DTURfRTJQUk9NX1JFQUQxNiBpcyBkb25lICFcbiIpKTsKKwkJCQl9CisgICAgICAgICAgIAl9CisJCQlicmVhazsKKworCQljYXNlIFJBQ0ZHX0NNRF9FMlBST01fV1JJVEUxNjoKKwkJCXsKKwkJCQlVU0hPUlQJb2Zmc2V0LCB2YWx1ZTsKKworCQkJCW9mZnNldCA9IG50b2hzKHBSYUNmZy0+c3RhdHVzKTsKKwkJCQltZW1jcHkoJnZhbHVlLCBwUmFDZmctPmRhdGEsIDIpOworCQkJCXZhbHVlID0gbnRvaHModmFsdWUpOworCQkJCVJUMjh4eF9FRVBST01fV1JJVEUxNihwQWRhcHRlciwgb2Zmc2V0LCB2YWx1ZSk7CisKKwkJCQkvLyBwcmVwYXJlIGZlZWRiYWNrCisJCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygyKTsKKwkJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDApOworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihwUmFDZmctPm1hZ2ljX25vKSArIHNpemVvZihwUmFDZmctPmNvbW1hbmRfdHlwZSkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF9pZCkgKyBzaXplb2YocFJhQ2ZnLT5sZW5ndGgpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPnNlcXVlbmNlKSArIG50b2hzKHBSYUNmZy0+bGVuZ3RoKTsKKworICAgICAgICAgICAgCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFJhQ2ZnLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY29weV90b191c2VyKCkgZmFpbCBpbiBjYXNlIFJBQ0ZHX0NNRF9FMlBST01fV1JJVEUxNlxuIikpOworICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgCX0KKwkJCQllbHNlCisJCQkJeworICAgICAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSQUNGR19DTURfRTJQUk9NX1dSSVRFMTYgaXMgZG9uZSAhXG4iKSk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSQUNGR19DTURfRTJQUk9NX1JFQURfQUxMOgorCQkJeworCQkJCVVTSE9SVCBidWZmZXJbRUVQUk9NX1NJWkUvMl07CisKKwkJCQlydF9lZV9yZWFkX2FsbChwQWRhcHRlciwoVVNIT1JUICopYnVmZmVyKTsKKwkJCQltZW1jcHlfZXhzKHBBZGFwdGVyLCBwUmFDZmctPmRhdGEsIChVQ0hBUiAqKWJ1ZmZlciwgRUVQUk9NX1NJWkUpOworCisJCQkJLy8gcHJlcGFyZSBmZWVkYmFjaworCQkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoMitFRVBST01fU0laRSk7CisJCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKyAgICAgICAgICAgIAlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfRTJQUk9NX1JFQURfQUxMXG4iKSk7CisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICAJfQorCQkJCWVsc2UKKwkJCQl7CisgICAgICAgICAgICAgICAgCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJBQ0ZHX0NNRF9FMlBST01fUkVBRF9BTEwgaXMgZG9uZSAhXG4iKSk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSQUNGR19DTURfRTJQUk9NX1dSSVRFX0FMTDoKKwkJCXsKKwkJCQlVU0hPUlQgYnVmZmVyW0VFUFJPTV9TSVpFLzJdOworCisJCQkJTmRpc1plcm9NZW1vcnkoKFVDSEFSICopYnVmZmVyLCBFRVBST01fU0laRSk7CisJCQkJbWVtY3B5X2V4cyhwQWRhcHRlciwgKFVDSEFSICopYnVmZmVyLCAoVUNIQVIgKikmcFJhQ2ZnLT5zdGF0dXMsIEVFUFJPTV9TSVpFKTsKKwkJCQlydF9lZV93cml0ZV9hbGwocEFkYXB0ZXIsKFVTSE9SVCAqKWJ1ZmZlcik7CisKKwkJCQkvLyBwcmVwYXJlIGZlZWRiYWNrCisJCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygyKTsKKwkJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDApOworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihwUmFDZmctPm1hZ2ljX25vKSArIHNpemVvZihwUmFDZmctPmNvbW1hbmRfdHlwZSkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF9pZCkgKyBzaXplb2YocFJhQ2ZnLT5sZW5ndGgpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPnNlcXVlbmNlKSArIG50b2hzKHBSYUNmZy0+bGVuZ3RoKTsKKworICAgICAgICAgICAgCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFJhQ2ZnLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY29weV90b191c2VyKCkgZmFpbCBpbiBjYXNlIFJBQ0ZHX0NNRF9FMlBST01fV1JJVEVfQUxMXG4iKSk7CisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICAJfQorCQkJCWVsc2UKKwkJCQl7CisgICAgICAgICAgICAgICAgCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlJBQ0ZHX0NNRF9FMlBST01fV1JJVEVfQUxMIGlzIGRvbmUgIVxuIikpOworCQkJCX0KKworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSQUNGR19DTURfSU9fUkVBRDoKKwkJCXsKKwkJCQlVSU5UMzIJb2Zmc2V0OworCQkJCVVJTlQzMgl2YWx1ZTsKKworCQkJCW1lbWNweSgmb2Zmc2V0LCAmcFJhQ2ZnLT5zdGF0dXMsIDQpOworCQkJCW9mZnNldCA9IG50b2hsKG9mZnNldCk7CisKKwkJCQkvLyBXZSBkbyBub3QgbmVlZCB0aGUgYmFzZSBhZGRyZXNzLgorCQkJCS8vIFNvIGp1c3QgZXh0cmFjdCB0aGUgb2Zmc2V0IG91dC4KKwkJCQlvZmZzZXQgJj0gMHgwMDAwRkZGRjsKKwkJCQlSVE1QX0lPX1JFQUQzMihwQWRhcHRlciwgb2Zmc2V0LCAmdmFsdWUpOworCQkJCXZhbHVlID0gaHRvbmwodmFsdWUpOworCisJCQkJLy8gcHJlcGFyZSBmZWVkYmFjaworCQkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoNik7CisJCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKwkJCQltZW1jcHkocFJhQ2ZnLT5kYXRhLCAmdmFsdWUsIDQpOworCisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBSYUNmZy0+bWFnaWNfbm8pICsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF90eXBlKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX2lkKSArIHNpemVvZihwUmFDZmctPmxlbmd0aCkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworCisgICAgICAgICAgICAJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwUmFDZmcsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjb3B5X3RvX3VzZXIoKSBmYWlsIGluIGNhc2UgUkFDRkdfQ01EX0lPX1JFQURcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIAl9CisJCQkJZWxzZQorCQkJCXsKKyAgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX0lPX1JFQUQgaXMgZG9uZSAhXG4iKSk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSQUNGR19DTURfSU9fV1JJVEU6CisJCQl7CisJCQkJVUlOVDMyCW9mZnNldCwgdmFsdWU7CisKKwkJCQltZW1jcHkoJm9mZnNldCwgcFJhQ2ZnLT5kYXRhLTIsIDQpOworCQkJCW1lbWNweSgmdmFsdWUsIHBSYUNmZy0+ZGF0YSsyLCA0KTsKKworCQkJCW9mZnNldCA9IG50b2hsKG9mZnNldCk7CisKKwkJCQkvLyBXZSBkbyBub3QgbmVlZCB0aGUgYmFzZSBhZGRyZXNzLgorCQkJCS8vIFNvIGp1c3QgZXh0cmFjdCBvdXQgdGhlIG9mZnNldC4KKwkJCQlvZmZzZXQgJj0gMHgwMDAwRkZGRjsKKwkJCQl2YWx1ZSA9IG50b2hsKHZhbHVlKTsKKwkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJBQ0ZHX0NNRF9JT19XUklURTogb2Zmc2V0ID0gJXgsIHZhbHVlID0gJXhcbiIsIG9mZnNldCwgdmFsdWUpKTsKKwkJCQlSVE1QX0lPX1dSSVRFMzIocEFkYXB0ZXIsIG9mZnNldCwgdmFsdWUpOworCisJCQkJLy8gcHJlcGFyZSBmZWVkYmFjaworCQkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoMik7CisJCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKyAgICAgICAgICAgIAlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfSU9fV1JJVEVcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIAl9CisJCQkJZWxzZQorCQkJCXsKKyAgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX0lPX1dSSVRFIGlzIGRvbmUgIVxuIikpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUkFDRkdfQ01EX0lPX1JFQURfQlVMSzoKKwkJCXsKKwkJCQlVSU5UMzIJb2Zmc2V0OworCQkJCVVTSE9SVAlsZW47CisKKwkJCQltZW1jcHkoJm9mZnNldCwgJnBSYUNmZy0+c3RhdHVzLCA0KTsKKwkJCQlvZmZzZXQgPSBudG9obChvZmZzZXQpOworCisJCQkJLy8gV2UgZG8gbm90IG5lZWQgdGhlIGJhc2UgYWRkcmVzcy4KKwkJCQkvLyBTbyBqdXN0IGV4dHJhY3QgdGhlIG9mZnNldC4KKwkJCQlvZmZzZXQgJj0gMHgwMDAwRkZGRjsKKwkJCQltZW1jcHkoJmxlbiwgcFJhQ2ZnLT5kYXRhKzIsIDIpOworCQkJCWxlbiA9IG50b2hzKGxlbik7CisKKwkJCQlpZiAobGVuID4gMzcxKQorCQkJCXsKKwkJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJsZW4gaXMgdG9vIGxhcmdlLCBtYWtlIGl0IHNtYWxsZXJcbiIpKTsKKwkJCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygyKTsKKwkJCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygxKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJUlRNUF9JT19SRUFEX0JVTEsocEFkYXB0ZXIsIHBSYUNmZy0+ZGF0YSwgKFVDSEFSICopb2Zmc2V0LCBsZW4qNCk7Ly8gdW5pdCBpbiBmb3VyIGJ5dGVzCisKKwkJCQkvLyBwcmVwYXJlIGZlZWRiYWNrCisJCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygyK2xlbio0KTsvLyB1bml0IGluIGZvdXIgYnl0ZXMKKwkJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDApOworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihwUmFDZmctPm1hZ2ljX25vKSArIHNpemVvZihwUmFDZmctPmNvbW1hbmRfdHlwZSkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF9pZCkgKyBzaXplb2YocFJhQ2ZnLT5sZW5ndGgpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPnNlcXVlbmNlKSArIG50b2hzKHBSYUNmZy0+bGVuZ3RoKTsKKworICAgICAgICAgICAgCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFJhQ2ZnLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY29weV90b191c2VyKCkgZmFpbCBpbiBjYXNlIFJBQ0ZHX0NNRF9JT19SRUFEX0JVTEtcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIAl9CisJCQkJZWxzZQorCQkJCXsKKyAgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX0lPX1JFQURfQlVMSyBpcyBkb25lICFcbiIpKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFJBQ0ZHX0NNRF9CQlBfUkVBRDg6CisJCQl7CisJCQkJVVNIT1JUCW9mZnNldDsKKwkJCQlVQ0hBUgl2YWx1ZTsKKworCQkJCXZhbHVlID0gMDsKKwkJCQlvZmZzZXQgPSBudG9ocyhwUmFDZmctPnN0YXR1cyk7CisKKwkJCQlpZiAoQVRFX09OKHBBZGFwdGVyKSkKKwkJCQl7CisJCQkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZGFwdGVyLCBvZmZzZXQsICAmdmFsdWUpOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkYXB0ZXIsIG9mZnNldCwgICZ2YWx1ZSk7CisJCQkJfQorCQkJCS8vIHByZXBhcmUgZmVlZGJhY2sKKwkJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDMpOworCQkJCXBSYUNmZy0+c3RhdHVzID0gaHRvbnMoMCk7CisJCQkJcFJhQ2ZnLT5kYXRhWzBdID0gdmFsdWU7CisKKwkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkJCUCB2YWx1ZSA9ICV4XG4iLCB2YWx1ZSkpOworCisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBSYUNmZy0+bWFnaWNfbm8pICsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF90eXBlKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX2lkKSArIHNpemVvZihwUmFDZmctPmxlbmd0aCkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworCisgICAgICAgICAgICAJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwUmFDZmcsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjb3B5X3RvX3VzZXIoKSBmYWlsIGluIGNhc2UgUkFDRkdfQ01EX0JCUF9SRUFEOFxuIikpOworICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgCX0KKwkJCQllbHNlCisJCQkJeworICAgICAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSQUNGR19DTURfQkJQX1JFQUQ4IGlzIGRvbmUgIVxuIikpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFJBQ0ZHX0NNRF9CQlBfV1JJVEU4OgorCQkJeworCQkJCVVTSE9SVAlvZmZzZXQ7CisJCQkJVUNIQVIJdmFsdWU7CisKKwkJCQlvZmZzZXQgPSBudG9ocyhwUmFDZmctPnN0YXR1cyk7CisJCQkJbWVtY3B5KCZ2YWx1ZSwgcFJhQ2ZnLT5kYXRhLCAxKTsKKworCQkJCWlmIChBVEVfT04ocEFkYXB0ZXIpKQorCQkJCXsKKwkJCQkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZGFwdGVyLCBvZmZzZXQsICB2YWx1ZSk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkYXB0ZXIsIG9mZnNldCwgIHZhbHVlKTsKKwkJCQl9CisKKwkJCQlpZiAoKG9mZnNldCA9PSBCQlBfUjEpIHx8IChvZmZzZXQgPT0gQkJQX1IzKSkKKwkJCQl7CisJCQkJCVN5bmNUeFJ4Q29uZmlnKHBBZGFwdGVyLCBvZmZzZXQsIHZhbHVlKTsKKwkJCQl9CisKKwkJCQkvLyBwcmVwYXJlIGZlZWRiYWNrCisJCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygyKTsKKwkJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDApOworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihwUmFDZmctPm1hZ2ljX25vKSArIHNpemVvZihwUmFDZmctPmNvbW1hbmRfdHlwZSkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF9pZCkgKyBzaXplb2YocFJhQ2ZnLT5sZW5ndGgpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPnNlcXVlbmNlKSArIG50b2hzKHBSYUNmZy0+bGVuZ3RoKTsKKworICAgICAgICAgICAgCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFJhQ2ZnLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY29weV90b191c2VyKCkgZmFpbCBpbiBjYXNlIFJBQ0ZHX0NNRF9CQlBfV1JJVEU4XG4iKSk7CisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICAJfQorCQkJCWVsc2UKKwkJCQl7CisgICAgICAgICAgICAgICAgCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJBQ0ZHX0NNRF9CQlBfV1JJVEU4IGlzIGRvbmUgIVxuIikpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUkFDRkdfQ01EX0JCUF9SRUFEX0FMTDoKKwkJCXsKKwkJCQlVU0hPUlQgajsKKworCQkJCWZvciAoaiA9IDA7IGogPCAxMzc7IGorKykKKwkJCQl7CisJCQkJCXBSYUNmZy0+ZGF0YVtqXSA9IDA7CisKKwkJCQkJaWYgKEFURV9PTihwQWRhcHRlcikpCisJCQkJCXsKKwkJCQkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZGFwdGVyLCBqLCAgJnBSYUNmZy0+ZGF0YVtqXSk7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkYXB0ZXIsIGosICAmcFJhQ2ZnLT5kYXRhW2pdKTsKKwkJCQkJfQorCQkJCX0KKworCQkJCS8vIHByZXBhcmUgZmVlZGJhY2sKKwkJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDIrMTM3KTsKKwkJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDApOworCisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBSYUNmZy0+bWFnaWNfbm8pICsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF90eXBlKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX2lkKSArIHNpemVvZihwUmFDZmctPmxlbmd0aCkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworCisgICAgICAgICAgICAJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwUmFDZmcsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjb3B5X3RvX3VzZXIoKSBmYWlsIGluIGNhc2UgUkFDRkdfQ01EX0JCUF9SRUFEX0FMTFxuIikpOworICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgCX0KKwkJCQllbHNlCisJCQkJeworICAgICAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSQUNGR19DTURfQkJQX1JFQURfQUxMIGlzIGRvbmUgIVxuIikpOworCQkJCX0KKwkJCX0KKworCQkJYnJlYWs7CisKKwkJY2FzZSBSQUNGR19DTURfQVRFX0UyUFJPTV9SRUFEX0JVTEs6CisJCXsKKwkJCVVTSE9SVCBvZmZzZXQ7CisJCQlVU0hPUlQgbGVuOworCQkJVVNIT1JUIGJ1ZmZlcltFRVBST01fU0laRS8yXTsKKworCQkJb2Zmc2V0ID0gbnRvaHMocFJhQ2ZnLT5zdGF0dXMpOworCQkJbWVtY3B5KCZsZW4sIHBSYUNmZy0+ZGF0YSwgMik7CisJCQlsZW4gPSBudG9ocyhsZW4pOworCisJCQlydF9lZV9yZWFkX2FsbChwQWRhcHRlciwoVVNIT1JUICopYnVmZmVyKTsKKwkJCWlmIChvZmZzZXQgKyBsZW4gPD0gRUVQUk9NX1NJWkUpCisJCQkJbWVtY3B5X2V4cyhwQWRhcHRlciwgcFJhQ2ZnLT5kYXRhLCAoVUNIQVIgKilidWZmZXIrb2Zmc2V0LCBsZW4pOworCQkJZWxzZQorCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImV4Y2VlZCBFRVBST00gc2l6ZVxuIikpOworCisJCQkvLyBwcmVwYXJlIGZlZWRiYWNrCisJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDIrbGVuKTsKKwkJCXBSYUNmZy0+c3RhdHVzID0gaHRvbnMoMCk7CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKyAgICAgICAgICAgIGlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFJhQ2ZnLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfQVRFX0UyUFJPTV9SRUFEX0JVTEtcbiIpKTsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgfQorCQkJZWxzZQorCQkJeworICAgICAgICAgICAgICAgCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJBQ0ZHX0NNRF9BVEVfRTJQUk9NX1JFQURfQlVMSyBpcyBkb25lICFcbiIpKTsKKwkJCX0KKworCQl9CisJCQlicmVhazsKKworCQljYXNlIFJBQ0ZHX0NNRF9BVEVfRTJQUk9NX1dSSVRFX0JVTEs6CisJCXsKKwkJCVVTSE9SVCBvZmZzZXQ7CisJCQlVU0hPUlQgbGVuOworCQkJVVNIT1JUIGJ1ZmZlcltFRVBST01fU0laRS8yXTsKKworCQkJb2Zmc2V0ID0gbnRvaHMocFJhQ2ZnLT5zdGF0dXMpOworCQkJbWVtY3B5KCZsZW4sIHBSYUNmZy0+ZGF0YSwgMik7CisJCQlsZW4gPSBudG9ocyhsZW4pOworCisJCQlydF9lZV9yZWFkX2FsbChwQWRhcHRlciwoVVNIT1JUICopYnVmZmVyKTsKKwkJCW1lbWNweV9leHMocEFkYXB0ZXIsIChVQ0hBUiAqKWJ1ZmZlciArIG9mZnNldCwgKFVDSEFSICopcFJhQ2ZnLT5kYXRhICsgMiwgbGVuKTsKKwkJCXJ0X2VlX3dyaXRlX2FsbChwQWRhcHRlciwoVVNIT1JUICopYnVmZmVyKTsKKworCQkJLy8gcHJlcGFyZSBmZWVkYmFjaworCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygyKTsKKwkJCXBSYUNmZy0+c3RhdHVzID0gaHRvbnMoMCk7CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF9pZCkgKyBzaXplb2YocFJhQ2ZnLT5sZW5ndGgpCisJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworICAgICAgICAgICAgaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwUmFDZmcsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY29weV90b191c2VyKCkgZmFpbCBpbiBjYXNlIFJBQ0ZHX0NNRF9BVEVfRTJQUk9NX1dSSVRFX0JVTEtcbiIpKTsKKyAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgfQorCQkJZWxzZQorCQkJeworICAgICAgICAgICAgICAgCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlJBQ0ZHX0NNRF9BVEVfRTJQUk9NX1dSSVRFX0JVTEsgaXMgZG9uZSAhXG4iKSk7CisJCQl9CisKKwkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSQUNGR19DTURfQVRFX0lPX1dSSVRFX0JVTEs6CisJCXsKKwkJCVVJTlQzMiBvZmZzZXQsIGksIHZhbHVlOworCQkJVVNIT1JUIGxlbjsKKworCQkJbWVtY3B5KCZvZmZzZXQsICZwUmFDZmctPnN0YXR1cywgNCk7CisJCQlvZmZzZXQgPSBudG9obChvZmZzZXQpOworCQkJbWVtY3B5KCZsZW4sIHBSYUNmZy0+ZGF0YSsyLCAyKTsKKwkJCWxlbiA9IG50b2hzKGxlbik7CisKKwkJCWZvciAoaSA9IDA7IGkgPCBsZW47IGkgKz0gNCkKKwkJCXsKKwkJCQltZW1jcHlfZXhsKHBBZGFwdGVyLCAoVUNIQVIgKikmdmFsdWUsIHBSYUNmZy0+ZGF0YSs0K2ksIDQpOworCQkJCXByaW50aygiV3JpdGUgJXggJXhcbiIsIG9mZnNldCArIGksIHZhbHVlKTsKKwkJCQlSVE1QX0lPX1dSSVRFMzIocEFkYXB0ZXIsIChvZmZzZXQgK2kpICYgMHhmZmZmLCB2YWx1ZSk7CisJCQl9CisKKwkJCS8vIHByZXBhcmUgZmVlZGJhY2sKKwkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoMik7CisJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDApOworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBSYUNmZy0+bWFnaWNfbm8pICsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF90eXBlKQorCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPnNlcXVlbmNlKSArIG50b2hzKHBSYUNmZy0+bGVuZ3RoKTsKKyAgICAgICAgICAgIGlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFJhQ2ZnLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfQVRFX0lPX1dSSVRFX0JVTEtcbiIpKTsKKyAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgfQorCQkJZWxzZQorCQkJeworICAgICAgICAgICAgICAgCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlJBQ0ZHX0NNRF9BVEVfSU9fV1JJVEVfQlVMSyBpcyBkb25lICFcbiIpKTsKKwkJCX0KKworCQl9CisJCQlicmVhazsKKworCQljYXNlIFJBQ0ZHX0NNRF9BVEVfQkJQX1JFQURfQlVMSzoKKwkJeworCQkJVVNIT1JUIG9mZnNldDsKKwkJCVVTSE9SVCBsZW47CisJCQlVU0hPUlQgajsKKworCQkJb2Zmc2V0ID0gbnRvaHMocFJhQ2ZnLT5zdGF0dXMpOworCQkJbWVtY3B5KCZsZW4sIHBSYUNmZy0+ZGF0YSwgMik7CisJCQlsZW4gPSBudG9ocyhsZW4pOworCisKKwkJCWZvciAoaiA9IG9mZnNldDsgaiA8IChvZmZzZXQrbGVuKTsgaisrKQorCQkJeworCQkJCXBSYUNmZy0+ZGF0YVtqIC0gb2Zmc2V0XSA9IDA7CisKKwkJCQlpZiAocEFkYXB0ZXItPmF0ZS5Nb2RlID09IEFURV9TVE9QKQorCQkJCXsKKwkJCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZGFwdGVyLCBqLCAgJnBSYUNmZy0+ZGF0YVtqIC0gb2Zmc2V0XSk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZGFwdGVyLCBqLCAgJnBSYUNmZy0+ZGF0YVtqIC0gb2Zmc2V0XSk7CisJCQkJfQorCQkJfQorCisJCQkvLyBwcmVwYXJlIGZlZWRiYWNrCisJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDIrbGVuKTsKKwkJCXBSYUNmZy0+c3RhdHVzID0gaHRvbnMoMCk7CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF9pZCkgKyBzaXplb2YocFJhQ2ZnLT5sZW5ndGgpCisJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworCisgICAgICAgICAgICBpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjb3B5X3RvX3VzZXIoKSBmYWlsIGluIGNhc2UgUkFDRkdfQ01EX0FURV9CQlBfUkVBRF9CVUxLXG4iKSk7CisgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIH0KKwkJCWVsc2UKKwkJCXsKKyAgICAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSQUNGR19DTURfQVRFX0JCUF9SRUFEX0JVTEsgaXMgZG9uZSAhXG4iKSk7CisJCQl9CisKKwkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSQUNGR19DTURfQVRFX0JCUF9XUklURV9CVUxLOgorCQl7CisJCQlVU0hPUlQgb2Zmc2V0OworCQkJVVNIT1JUIGxlbjsKKwkJCVVTSE9SVCBqOworCQkJVUNIQVIgKnZhbHVlOworCisJCQlvZmZzZXQgPSBudG9ocyhwUmFDZmctPnN0YXR1cyk7CisJCQltZW1jcHkoJmxlbiwgcFJhQ2ZnLT5kYXRhLCAyKTsKKwkJCWxlbiA9IG50b2hzKGxlbik7CisKKwkJCWZvciAoaiA9IG9mZnNldDsgaiA8IChvZmZzZXQrbGVuKTsgaisrKQorCQkJeworCQkJCXZhbHVlID0gcFJhQ2ZnLT5kYXRhICsgMiArIChqIC0gb2Zmc2V0KTsKKwkJCQlpZiAocEFkYXB0ZXItPmF0ZS5Nb2RlID09IEFURV9TVE9QKQorCQkJCXsKKwkJCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWRhcHRlciwgaiwgICp2YWx1ZSk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWRhcHRlciwgaiwgICp2YWx1ZSk7CisJCQkJfQorCQkJfQorCisJCQkvLyBwcmVwYXJlIGZlZWRiYWNrCisJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDIpOworCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihwUmFDZmctPm1hZ2ljX25vKSArIHNpemVvZihwUmFDZmctPmNvbW1hbmRfdHlwZSkKKwkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX2lkKSArIHNpemVvZihwUmFDZmctPmxlbmd0aCkKKwkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKyAgICAgICAgICAgIGlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFJhQ2ZnLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfQVRFX0JCUF9XUklURV9CVUxLXG4iKSk7CisgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIH0KKwkJCWVsc2UKKwkJCXsKKyAgICAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSQUNGR19DTURfQVRFX0JCUF9XUklURV9CVUxLIGlzIGRvbmUgIVxuIikpOworCQkJfQorCQl9CisJCQlicmVhazsKKworI2lmZGVmIENPTkZJR19SQUxJTktfUlQzMDUyCisJCWNhc2UgUkFDRkdfQ01EX0FURV9SRl9SRUFEX0JVTEs6CisJCXsKKwkJCVVTSE9SVCBvZmZzZXQ7CisJCQlVU0hPUlQgbGVuOworCQkJVVNIT1JUIGo7CisKKwkJCW9mZnNldCA9IG50b2hzKHBSYUNmZy0+c3RhdHVzKTsKKwkJCW1lbWNweSgmbGVuLCBwUmFDZmctPmRhdGEsIDIpOworCQkJbGVuID0gbnRvaHMobGVuKTsKKworCQkJZm9yIChqID0gb2Zmc2V0OyBqIDwgKG9mZnNldCtsZW4pOyBqKyspCisJCQl7CisJCQkJcFJhQ2ZnLT5kYXRhW2ogLSBvZmZzZXRdID0gMDsKKwkJCQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWRhcHRlciwgaiwgICZwUmFDZmctPmRhdGFbaiAtIG9mZnNldF0pOworCQkJfQorCisJCQkvLyBwcmVwYXJlIGZlZWRiYWNrCisJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDIrbGVuKTsKKwkJCXBSYUNmZy0+c3RhdHVzID0gaHRvbnMoMCk7CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF9pZCkgKyBzaXplb2YocFJhQ2ZnLT5sZW5ndGgpCisJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworCisgICAgICAgICAgICBpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjb3B5X3RvX3VzZXIoKSBmYWlsIGluIGNhc2UgUkFDRkdfQ01EX0FURV9SRl9SRUFEX0JVTEtcbiIpKTsKKyAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgfQorCQkJZWxzZQorCQkJeworICAgICAgICAgICAgICAgCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJBQ0ZHX0NNRF9BVEVfUkZfUkVBRF9CVUxLIGlzIGRvbmUgIVxuIikpOworCQkJfQorCisJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUkFDRkdfQ01EX0FURV9SRl9XUklURV9CVUxLOgorCQl7CisJCQlVU0hPUlQgb2Zmc2V0OworCQkJVVNIT1JUIGxlbjsKKwkJCVVTSE9SVCBqOworCQkJVUNIQVIgKnZhbHVlOworCisJCQlvZmZzZXQgPSBudG9ocyhwUmFDZmctPnN0YXR1cyk7CisJCQltZW1jcHkoJmxlbiwgcFJhQ2ZnLT5kYXRhLCAyKTsKKwkJCWxlbiA9IG50b2hzKGxlbik7CisKKwkJCWZvciAoaiA9IG9mZnNldDsgaiA8IChvZmZzZXQrbGVuKTsgaisrKQorCQkJeworCQkJCXZhbHVlID0gcFJhQ2ZnLT5kYXRhICsgMiArIChqIC0gb2Zmc2V0KTsKKwkJCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkYXB0ZXIsIGosICAqdmFsdWUpOworCQkJfQorCisJCQkvLyBwcmVwYXJlIGZlZWRiYWNrCisJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDIpOworCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihwUmFDZmctPm1hZ2ljX25vKSArIHNpemVvZihwUmFDZmctPmNvbW1hbmRfdHlwZSkKKwkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX2lkKSArIHNpemVvZihwUmFDZmctPmxlbmd0aCkKKwkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKyAgICAgICAgICAgIGlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFJhQ2ZnLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfQVRFX1JGX1dSSVRFX0JVTEtcbiIpKTsKKyAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgfQorCQkJZWxzZQorCQkJeworICAgICAgICAgICAgICAgCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJBQ0ZHX0NNRF9BVEVfUkZfV1JJVEVfQlVMSyBpcyBkb25lICFcbiIpKTsKKwkJCX0KKworCQl9CisJCQlicmVhazsKKyNlbmRpZgorCisKKwkJY2FzZSBSQUNGR19DTURfR0VUX05PSVNFX0xFVkVMOgorCQkJeworCQkJCVVDSEFSCWNoYW5uZWw7CisJCQkJSU5UMzIgICBidWZmZXJbM11bMTBdOy8qIDMgOiBSeFBhdGggOyAxMCA6IG5vLiBvZiBwZXIgcnNzaSBzYW1wbGVzICovCisKKwkJCQljaGFubmVsID0gKG50b2hzKHBSYUNmZy0+c3RhdHVzKSAmIDB4MDBGRik7CisJCQkJQ2FsTm9pc2VMZXZlbChwQWRhcHRlciwgY2hhbm5lbCwgYnVmZmVyKTsKKwkJCQltZW1jcHlfZXhsKHBBZGFwdGVyLCAoVUNIQVIgKilwUmFDZmctPmRhdGEsIChVQ0hBUiAqKSYoYnVmZmVyWzBdWzBdKSwgKHNpemVvZihJTlQzMikqMyoxMCkpOworCisJCQkJLy8gcHJlcGFyZSBmZWVkYmFjaworCQkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoMiArIChzaXplb2YoSU5UMzIpKjMqMTApKTsKKwkJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDApOworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihwUmFDZmctPm1hZ2ljX25vKSArIHNpemVvZihwUmFDZmctPmNvbW1hbmRfdHlwZSkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF9pZCkgKyBzaXplb2YocFJhQ2ZnLT5sZW5ndGgpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPnNlcXVlbmNlKSArIG50b2hzKHBSYUNmZy0+bGVuZ3RoKTsKKworICAgICAgICAgICAgCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFJhQ2ZnLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY29weV90b191c2VyKCkgZmFpbCBpbiBjYXNlIFJBQ0ZHX0NNRF9HRVRfTk9JU0VfTEVWRUxcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIAl9CisJCQkJZWxzZQorCQkJCXsKKyAgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX0dFVF9OT0lTRV9MRVZFTCBpcyBkb25lICFcbiIpKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFJBQ0ZHX0NNRF9HRVRfQ09VTlRFUjoKKwkJCXsKKwkJCQltZW1jcHlfZXhsKHBBZGFwdGVyLCAmcFJhQ2ZnLT5kYXRhWzBdLCAoVUNIQVIgKikmcEFkYXB0ZXItPmF0ZS5VMk0sIDQpOworCQkJCW1lbWNweV9leGwocEFkYXB0ZXIsICZwUmFDZmctPmRhdGFbNF0sIChVQ0hBUiAqKSZwQWRhcHRlci0+YXRlLk90aGVyRGF0YSwgNCk7CisJCQkJbWVtY3B5X2V4bChwQWRhcHRlciwgJnBSYUNmZy0+ZGF0YVs4XSwgKFVDSEFSICopJnBBZGFwdGVyLT5hdGUuQmVhY29uLCA0KTsKKwkJCQltZW1jcHlfZXhsKHBBZGFwdGVyLCAmcFJhQ2ZnLT5kYXRhWzEyXSwgKFVDSEFSICopJnBBZGFwdGVyLT5hdGUuT3RoZXJDb3VudCwgNCk7CisJCQkJbWVtY3B5X2V4bChwQWRhcHRlciwgJnBSYUNmZy0+ZGF0YVsxNl0sIChVQ0hBUiAqKSZwQWRhcHRlci0+YXRlLlR4QWMwLCA0KTsKKwkJCQltZW1jcHlfZXhsKHBBZGFwdGVyLCAmcFJhQ2ZnLT5kYXRhWzIwXSwgKFVDSEFSICopJnBBZGFwdGVyLT5hdGUuVHhBYzEsIDQpOworCQkJCW1lbWNweV9leGwocEFkYXB0ZXIsICZwUmFDZmctPmRhdGFbMjRdLCAoVUNIQVIgKikmcEFkYXB0ZXItPmF0ZS5UeEFjMiwgNCk7CisJCQkJbWVtY3B5X2V4bChwQWRhcHRlciwgJnBSYUNmZy0+ZGF0YVsyOF0sIChVQ0hBUiAqKSZwQWRhcHRlci0+YXRlLlR4QWMzLCA0KTsKKwkJCQltZW1jcHlfZXhsKHBBZGFwdGVyLCAmcFJhQ2ZnLT5kYXRhWzMyXSwgKFVDSEFSICopJnBBZGFwdGVyLT5hdGUuVHhIQ0NBLCA0KTsKKwkJCQltZW1jcHlfZXhsKHBBZGFwdGVyLCAmcFJhQ2ZnLT5kYXRhWzM2XSwgKFVDSEFSICopJnBBZGFwdGVyLT5hdGUuVHhNZ210LCA0KTsKKwkJCQltZW1jcHlfZXhsKHBBZGFwdGVyLCAmcFJhQ2ZnLT5kYXRhWzQwXSwgKFVDSEFSICopJnBBZGFwdGVyLT5hdGUuUlNTSTAsIDQpOworCQkJCW1lbWNweV9leGwocEFkYXB0ZXIsICZwUmFDZmctPmRhdGFbNDRdLCAoVUNIQVIgKikmcEFkYXB0ZXItPmF0ZS5SU1NJMSwgNCk7CisJCQkJbWVtY3B5X2V4bChwQWRhcHRlciwgJnBSYUNmZy0+ZGF0YVs0OF0sIChVQ0hBUiAqKSZwQWRhcHRlci0+YXRlLlJTU0kyLCA0KTsKKwkJCQltZW1jcHlfZXhsKHBBZGFwdGVyLCAmcFJhQ2ZnLT5kYXRhWzUyXSwgKFVDSEFSICopJnBBZGFwdGVyLT5hdGUuU05SMCwgNCk7CisJCQkJbWVtY3B5X2V4bChwQWRhcHRlciwgJnBSYUNmZy0+ZGF0YVs1Nl0sIChVQ0hBUiAqKSZwQWRhcHRlci0+YXRlLlNOUjEsIDQpOworCisJCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygyKzYwKTsKKwkJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDApOworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihwUmFDZmctPm1hZ2ljX25vKSArIHNpemVvZihwUmFDZmctPmNvbW1hbmRfdHlwZSkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF9pZCkgKyBzaXplb2YocFJhQ2ZnLT5sZW5ndGgpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPnNlcXVlbmNlKSArIG50b2hzKHBSYUNmZy0+bGVuZ3RoKTsKKworICAgICAgICAgICAgCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFJhQ2ZnLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY29weV90b191c2VyKCkgZmFpbCBpbiBjYXNlIFJBQ0ZHX0NNRF9HRVRfQ09VTlRFUlxuIikpOworICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgCX0KKwkJCQllbHNlCisJCQkJeworICAgICAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSQUNGR19DTURfR0VUX0NPVU5URVIgaXMgZG9uZSAhXG4iKSk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSQUNGR19DTURfQ0xFQVJfQ09VTlRFUjoKKwkJCXsKKwkJCQlwQWRhcHRlci0+YXRlLlUyTSA9IDA7CisJCQkJcEFkYXB0ZXItPmF0ZS5PdGhlckRhdGEgPSAwOworCQkJCXBBZGFwdGVyLT5hdGUuQmVhY29uID0gMDsKKwkJCQlwQWRhcHRlci0+YXRlLk90aGVyQ291bnQgPSAwOworCQkJCXBBZGFwdGVyLT5hdGUuVHhBYzAgPSAwOworCQkJCXBBZGFwdGVyLT5hdGUuVHhBYzEgPSAwOworCQkJCXBBZGFwdGVyLT5hdGUuVHhBYzIgPSAwOworCQkJCXBBZGFwdGVyLT5hdGUuVHhBYzMgPSAwOworCQkJCXBBZGFwdGVyLT5hdGUuVHhIQ0NBID0gMDsKKwkJCQlwQWRhcHRlci0+YXRlLlR4TWdtdCA9IDA7CisJCQkJcEFkYXB0ZXItPmF0ZS5UeERvbmVDb3VudCA9IDA7CisKKwkJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDIpOworCQkJCXBSYUNmZy0+c3RhdHVzID0gaHRvbnMoMCk7CisKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKyAgICAgICAgICAgIAlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfQ0xFQVJfQ09VTlRFUlxuIikpOworICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgCX0KKwkJCQllbHNlCisJCQkJeworICAgICAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSQUNGR19DTURfQ0xFQVJfQ09VTlRFUiBpcyBkb25lICFcbiIpKTsKKwkJCQl9CisJCQl9CisKKwkJCWJyZWFrOworCisJCWNhc2UgUkFDRkdfQ01EX1RYX1NUQVJUOgorCQkJeworCQkJCVVTSE9SVCAqcDsKKwkJCQlVU0hPUlQJZXJyID0gMTsKKwkJCQlVQ0hBUiAgIEJicDIyVmFsdWUgPSAwLCBCYnAyNFZhbHVlID0gMDsKKworCQkJCWlmICgocEFkYXB0ZXItPmF0ZS5UeFN0YXR1cyAhPSAwKSAmJiAocEFkYXB0ZXItPmF0ZS5Nb2RlICYgQVRFX1RYRlJBTUUpKQorCQkJCXsKKwkJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJBdGUgVHggaXMgYWxyZWFkeSBydW5uaW5nLCB0byBydW4gbmV4dCBUeCwgeW91IG11c3Qgc3RvcCBpdCBmaXJzdFxuIikpOworCQkJCQllcnIgPSAyOworCQkJCQlnb3RvIFRYX1NUQVJUX0VSUk9SOworCQkJCX0KKwkJCQllbHNlIGlmICgocEFkYXB0ZXItPmF0ZS5UeFN0YXR1cyAhPSAwKSAmJiAhKHBBZGFwdGVyLT5hdGUuTW9kZSAmIEFURV9UWEZSQU1FKSkKKwkJCQl7CisJCQkJCWludCBpID0gMDsKKworCQkJCQl3aGlsZSAoKGkrKyA8IDEwKSAmJiAocEFkYXB0ZXItPmF0ZS5UeFN0YXR1cyAhPSAwKSkKKwkJCQkJeworCQkJCQkJUlRNUHVzZWNEZWxheSg1MDAwKTsKKwkJCQkJfQorCisJCQkJCS8vIGZvcmNlIGl0IHRvIHN0b3AKKwkJCQkJcEFkYXB0ZXItPmF0ZS5UeFN0YXR1cyA9IDA7CisJCQkJCXBBZGFwdGVyLT5hdGUuVHhEb25lQ291bnQgPSAwOworCQkJCQkvL3BBZGFwdGVyLT5hdGUuUmVwZWF0ID0gMDsKKwkJCQkJcEFkYXB0ZXItPmF0ZS5iUUFUeFN0YXJ0ID0gRkFMU0U7CisJCQkJfQorCisJCQkJLy8gSWYgcFJhQ2ZnLT5sZW5ndGggPT0gMCwgdGhpcyAiUkFDRkdfQ01EX1RYX1NUQVJUIiBpcyBmb3IgQ2FycmllciB0ZXN0IG9yIENhcnJpZXIgU3VwcHJlc3Npb24uCisJCQkJaWYgKG50b2hzKHBSYUNmZy0+bGVuZ3RoKSAhPSAwKQorCQkJCXsKKwkJCQkJLy8gR2V0IGZyYW1lIGluZm8KKyNpZmRlZiBSVDI4NzAKKwkJCQkJTmRpc01vdmVNZW1vcnkoJnBBZGFwdGVyLT5hdGUuVHhJbmZvLCBwUmFDZmctPmRhdGEgLSAyLCA0KTsKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJCQkJCVJUTVBEZXNjcmlwdG9yRW5kaWFuQ2hhbmdlKChQVUNIQVIpICZwQWRhcHRlci0+YXRlLlR4SW5mbywgVFlQRV9UWElORk8pOworI2VuZGlmIC8vIFJUX0JJR19FTkRJQU4gLy8KKyNlbmRpZiAvLyBSVDI4NzAgLy8KKworCQkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkYXB0ZXItPmF0ZS5UeFdJLCBwUmFDZmctPmRhdGEgKyAyLCAxNik7CisjaWZkZWYgUlRfQklHX0VORElBTgorCQkJCQlSVE1QV0lFbmRpYW5DaGFuZ2UoKFBVQ0hBUikmcEFkYXB0ZXItPmF0ZS5UeFdJLCBUWVBFX1RYV0kpOworI2VuZGlmIC8vIFJUX0JJR19FTkRJQU4gLy8KKworCQkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkYXB0ZXItPmF0ZS5UeENvdW50LCBwUmFDZmctPmRhdGEgKyAxOCwgNCk7CisJCQkJCXBBZGFwdGVyLT5hdGUuVHhDb3VudCA9IG50b2hsKHBBZGFwdGVyLT5hdGUuVHhDb3VudCk7CisKKwkJCQkJcCA9IChVU0hPUlQgKikoJnBSYUNmZy0+ZGF0YVsyMl0pOworCQkJCQkvL3AgPSBwUmFDZmctPmRhdGEgKyAyMjsKKwkJCQkJLy8gYWx3YXlzIHVzZSBRSURfQUNfQkUKKwkJCQkJcEFkYXB0ZXItPmF0ZS5RSUQgPSAwOworCQkJCQlwID0gKFVTSE9SVCAqKSgmcFJhQ2ZnLT5kYXRhWzI0XSk7CisJCQkJCS8vcCA9IHBSYUNmZy0+ZGF0YSArIDI0OworCQkJCQlwQWRhcHRlci0+YXRlLkhMZW4gPSBudG9ocygqcCk7CisKKwkJCQkJaWYgKHBBZGFwdGVyLT5hdGUuSExlbiA+IDMyKQorCQkJCQl7CisJCQkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoInBBZGFwdGVyLT5hdGUuSExlbiA+IDMyXG4iKSk7CisJCQkJCQllcnIgPSAzOworCQkJCQkJZ290byBUWF9TVEFSVF9FUlJPUjsKKwkJCQkJfQorCisJCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWRhcHRlci0+YXRlLkhlYWRlciwgcFJhQ2ZnLT5kYXRhICsgMjYsIHBBZGFwdGVyLT5hdGUuSExlbik7CisKKworCQkJCQlwQWRhcHRlci0+YXRlLlBMZW4gPSBudG9ocyhwUmFDZmctPmxlbmd0aCkgLSAocEFkYXB0ZXItPmF0ZS5ITGVuICsgMjgpOworCisJCQkJCWlmIChwQWRhcHRlci0+YXRlLlBMZW4gPiAzMikKKwkJCQkJeworCQkJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJwQWRhcHRlci0+YXRlLlBMZW4gPiAzMlxuIikpOworCQkJCQkJZXJyID0gNDsKKwkJCQkJCWdvdG8gVFhfU1RBUlRfRVJST1I7CisJCQkJCX0KKworCQkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkYXB0ZXItPmF0ZS5QYXR0ZXJuLCBwUmFDZmctPmRhdGEgKyAyNiArIHBBZGFwdGVyLT5hdGUuSExlbiwgcEFkYXB0ZXItPmF0ZS5QTGVuKTsKKwkJCQkJcEFkYXB0ZXItPmF0ZS5ETGVuID0gcEFkYXB0ZXItPmF0ZS5UeFdJLk1QRFV0b3RhbEJ5dGVDb3VudCAtIHBBZGFwdGVyLT5hdGUuSExlbjsKKwkJCQl9CisKKwkJCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWRhcHRlciwgQkJQX1IyMiwgJkJicDIyVmFsdWUpOworCisJCQkJc3dpdGNoIChCYnAyMlZhbHVlKQorCQkJCXsKKwkJCQkJY2FzZSBCQlAyMl9UWEZSQU1FOgorCQkJCQkJeworCQkJCQkJCWlmIChwQWRhcHRlci0+YXRlLlR4Q291bnQgPT0gMCkKKwkJCQkJCQl7CisJCQkJCQkJfQorCQkJCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiU1RBUlQgVFhGUkFNRVxuIikpOworCQkJCQkJCXBBZGFwdGVyLT5hdGUuYlFBVHhTdGFydCA9IFRSVUU7CisJCQkJCQkJU2V0X0FURV9Qcm9jKHBBZGFwdGVyLCAiVFhGUkFNRSIpOworCQkJCQkJfQorCQkJCQkJYnJlYWs7CisKKwkJCQkJY2FzZSBCQlAyMl9UWENPTlRfT1JfQ0FSUlNVUFA6CisJCQkJCQl7CisJCQkJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJCQlAyMl9UWENPTlRfT1JfQ0FSUlNVUFBcbiIpKTsKKwkJCQkJCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWRhcHRlciwgMjQsICZCYnAyNFZhbHVlKTsKKworCQkJCQkJCXN3aXRjaCAoQmJwMjRWYWx1ZSkKKwkJCQkJCQl7CisJCQkJCQkJCWNhc2UgQkJQMjRfVFhDT05UOgorCQkJCQkJCQkJeworCQkJCQkJCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiU1RBUlQgVFhDT05UXG4iKSk7CisJCQkJCQkJCQkJcEFkYXB0ZXItPmF0ZS5iUUFUeFN0YXJ0ID0gVFJVRTsKKwkJCQkJCQkJCQlTZXRfQVRFX1Byb2MocEFkYXB0ZXIsICJUWENPTlQiKTsKKwkJCQkJCQkJCX0KKwkJCQkJCQkJCWJyZWFrOworCisJCQkJCQkJCWNhc2UgQkJQMjRfQ0FSUlNVUFA6CisJCQkJCQkJCQl7CisJCQkJCQkJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJTVEFSVCBUWENBUlJTVVBQXG4iKSk7CisJCQkJCQkJCQkJcEFkYXB0ZXItPmF0ZS5iUUFUeFN0YXJ0ID0gVFJVRTsKKwkJCQkJCQkJCQlwQWRhcHRlci0+YXRlLk1vZGUgfD0gQVRFX1RYQ0FSUlNVUFA7CisJCQkJCQkJCQl9CisJCQkJCQkJCQlicmVhazsKKworCQkJCQkJCQlkZWZhdWx0OgorCQkJCQkJCQkJeworCQkJCQkJCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiVW5rbm93biBTdGFydCBUWCBzdWJ0eXBlICEiKSk7CisJCQkJCQkJCQl9CisJCQkJCQkJCQlicmVhazsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCQlicmVhazsKKworCQkJCQljYXNlIEJCUDIyX1RYQ0FSUjoKKwkJCQkJCXsKKwkJCQkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlNUQVJUIFRYQ0FSUlxuIikpOworCQkJCQkJCXBBZGFwdGVyLT5hdGUuYlFBVHhTdGFydCA9IFRSVUU7CisJCQkJCQkJU2V0X0FURV9Qcm9jKHBBZGFwdGVyLCAiVFhDQVJSIik7CisJCQkJCQl9CisJCQkJCQlicmVhazsKKworCQkJCQlkZWZhdWx0OgorCQkJCQkJeworCQkJCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiVW5rbm93biBTdGFydCBUWCBzdWJ0eXBlICEiKSk7CisJCQkJCQl9CisJCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQlpZiAocEFkYXB0ZXItPmF0ZS5iUUFUeFN0YXJ0ID09IFRSVUUpCisJCQkJeworCQkJCQkvLyBwcmVwYXJlIGZlZWRiYWNrCisJCQkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoMik7CisJCQkJCXBSYUNmZy0+c3RhdHVzID0gaHRvbnMoMCk7CisKKwkJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBSYUNmZy0+bWFnaWNfbm8pICsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF90eXBlKQorCQkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF9pZCkgKyBzaXplb2YocFJhQ2ZnLT5sZW5ndGgpCisJCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKwkgICAgICAgICAgICAJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwUmFDZmcsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisJICAgICAgICAgICAgCXsKKwkgICAgICAgICAgICAJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIHdhcyBmYWlsZWQgaW4gY2FzZSBSQUNGR19DTURfVFhfU1RBUlRcbiIpKTsKKwkgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisJICAgICAgICAgICAgCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJICAgICAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSQUNGR19DTURfVFhfU1RBUlQgaXMgZG9uZSAhXG4iKSk7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJfQorCitUWF9TVEFSVF9FUlJPUjoKKwkJCQkvLyBwcmVwYXJlIGZlZWRiYWNrCisJCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygyKTsKKwkJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKGVycik7CisKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisgICAgICAgICAgICAJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwUmFDZmcsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjb3B5X3RvX3VzZXIoKSBmYWlsIGluIGNhc2UgUkFDRkdfQ01EX1RYX1NUQVJUXG4iKSk7CisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICAJfQorCQkJCWVsc2UKKwkJCQl7CisgICAgICAgICAgICAgICAgCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoImZlZWRiYWNrIG9mIFRYX1NUQVJUX0VSUk9SIGlzIGRvbmUgIVxuIikpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUkFDRkdfQ01EX0dFVF9UWF9TVEFUVVM6CisJCQl7CisJCQkJVUlOVDMyIGNvdW50OworCisJCQkJLy8gcHJlcGFyZSBmZWVkYmFjaworCQkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoNik7CisJCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKwkJCQljb3VudCA9IGh0b25sKHBBZGFwdGVyLT5hdGUuVHhEb25lQ291bnQpOworCQkJCU5kaXNNb3ZlTWVtb3J5KHBSYUNmZy0+ZGF0YSwgJmNvdW50LCA0KTsKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKyAgICAgICAgICAgIAlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfR0VUX1RYX1NUQVRVU1xuIikpOworICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgCX0KKwkJCQllbHNlCisJCQkJeworICAgICAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSQUNGR19DTURfR0VUX1RYX1NUQVRVUyBpcyBkb25lICFcbiIpKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFJBQ0ZHX0NNRF9UWF9TVE9QOgorCQkJeworCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUkFDRkdfQ01EX1RYX1NUT1BcbiIpKTsKKworCQkJCVNldF9BVEVfUHJvYyhwQWRhcHRlciwgIlRYU1RPUCIpOworCisJCQkJLy8gcHJlcGFyZSBmZWVkYmFjaworCQkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoMik7CisJCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKyAgICAgICAgICAgIAlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfVFhfU1RPUFxuIikpOworICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgCX0KKwkJCQllbHNlCisJCQkJeworICAgICAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSQUNGR19DTURfVFhfU1RPUCBpcyBkb25lICFcbiIpKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFJBQ0ZHX0NNRF9SWF9TVEFSVDoKKwkJCXsKKwkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJBQ0ZHX0NNRF9SWF9TVEFSVFxuIikpOworCisJCQkJcEFkYXB0ZXItPmF0ZS5iUUFSeFN0YXJ0ID0gVFJVRTsKKwkJCQlTZXRfQVRFX1Byb2MocEFkYXB0ZXIsICJSWEZSQU1FIik7CisKKwkJCQkvLyBwcmVwYXJlIGZlZWRiYWNrCisJCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygyKTsKKwkJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDApOworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihwUmFDZmctPm1hZ2ljX25vKSArIHNpemVvZihwUmFDZmctPmNvbW1hbmRfdHlwZSkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF9pZCkgKyBzaXplb2YocFJhQ2ZnLT5sZW5ndGgpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPnNlcXVlbmNlKSArIG50b2hzKHBSYUNmZy0+bGVuZ3RoKTsKKworICAgICAgICAgICAgCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFJhQ2ZnLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY29weV90b191c2VyKCkgZmFpbCBpbiBjYXNlIFJBQ0ZHX0NNRF9SWF9TVEFSVFxuIikpOworICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgCX0KKwkJCQllbHNlCisJCQkJeworICAgICAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSQUNGR19DTURfUlhfU1RBUlQgaXMgZG9uZSAhXG4iKSk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSQUNGR19DTURfUlhfU1RPUDoKKwkJCXsKKwkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJBQ0ZHX0NNRF9SWF9TVE9QXG4iKSk7CisKKwkJCQlTZXRfQVRFX1Byb2MocEFkYXB0ZXIsICJSWFNUT1AiKTsKKworCQkJCS8vIHByZXBhcmUgZmVlZGJhY2sKKwkJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDIpOworCQkJCXBSYUNmZy0+c3RhdHVzID0gaHRvbnMoMCk7CisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBSYUNmZy0+bWFnaWNfbm8pICsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF90eXBlKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX2lkKSArIHNpemVvZihwUmFDZmctPmxlbmd0aCkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworCisgICAgICAgICAgICAJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwUmFDZmcsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjb3B5X3RvX3VzZXIoKSBmYWlsIGluIGNhc2UgUkFDRkdfQ01EX1JYX1NUT1BcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIAl9CisJCQkJZWxzZQorCQkJCXsKKyAgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX1JYX1NUT1AgaXMgZG9uZSAhXG4iKSk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJLyogVGhlIGZvbGxvd2luZyBjYXNlcyBhcmUgZm9yIG5ldyBBVEUgR1VJKG5vdCBRQSkuICovCisJCS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCQljYXNlIFJBQ0ZHX0NNRF9BVEVfU1RBUlRfVFhfQ0FSUklFUjoKKwkJCXsKKwkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJBQ0ZHX0NNRF9BVEVfU1RBUlRfVFhfQ0FSUklFUlxuIikpOworCisJCQkJU2V0X0FURV9Qcm9jKHBBZGFwdGVyLCAiVFhDQVJSIik7CisKKwkJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDIpOworCQkJCXBSYUNmZy0+c3RhdHVzID0gaHRvbnMoMCk7CisKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKwkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJ3cnEtPnUuZGF0YS5sZW5ndGggPSAlZFxuIiwgd3JxLT51LmRhdGEubGVuZ3RoKSk7CisKKyAgICAgICAgICAgIAlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfQVRFX1NUQVJUX1RYX0NBUlJJRVJcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIAl9CisJCQkJZWxzZQorCQkJCXsKKyAgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX0FURV9TVEFSVF9UWF9DQVJSSUVSIGlzIGRvbmUgIVxuIikpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUkFDRkdfQ01EX0FURV9TVEFSVF9UWF9DT05UOgorCQkJeworCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUkFDRkdfQ01EX0FURV9TVEFSVF9UWF9DT05UXG4iKSk7CisKKwkJCQlTZXRfQVRFX1Byb2MocEFkYXB0ZXIsICJUWENPTlQiKTsKKworCQkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoMik7CisJCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihwUmFDZmctPm1hZ2ljX25vKSArIHNpemVvZihwUmFDZmctPmNvbW1hbmRfdHlwZSkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF9pZCkgKyBzaXplb2YocFJhQ2ZnLT5sZW5ndGgpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPnNlcXVlbmNlKSArIG50b2hzKHBSYUNmZy0+bGVuZ3RoKTsKKworCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIndycS0+dS5kYXRhLmxlbmd0aCA9ICVkXG4iLCB3cnEtPnUuZGF0YS5sZW5ndGgpKTsKKworICAgICAgICAgICAgCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFJhQ2ZnLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY29weV90b191c2VyKCkgZmFpbCBpbiBjYXNlIFJBQ0ZHX0NNRF9BVEVfU1RBUlRfVFhfQ09OVFxuIikpOworICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgCX0KKwkJCQllbHNlCisJCQkJeworICAgICAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSQUNGR19DTURfQVRFX1NUQVJUX1RYX0NPTlQgaXMgZG9uZSAhXG4iKSk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSQUNGR19DTURfQVRFX1NUQVJUX1RYX0ZSQU1FOgorCQkJeworCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUkFDRkdfQ01EX0FURV9TVEFSVF9UWF9GUkFNRVxuIikpOworCisJCQkJU2V0X0FURV9Qcm9jKHBBZGFwdGVyLCAiVFhGUkFNRSIpOworCisJCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygyKTsKKwkJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDApOworCisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBSYUNmZy0+bWFnaWNfbm8pICsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF90eXBlKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX2lkKSArIHNpemVvZihwUmFDZmctPmxlbmd0aCkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworCisJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgid3JxLT51LmRhdGEubGVuZ3RoID0gJWRcbiIsIHdycS0+dS5kYXRhLmxlbmd0aCkpOworCisgICAgICAgICAgICAJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwUmFDZmcsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjb3B5X3RvX3VzZXIoKSBmYWlsIGluIGNhc2UgUkFDRkdfQ01EX0FURV9TVEFSVF9UWF9GUkFNRVxuIikpOworICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgCX0KKwkJCQllbHNlCisJCQkJeworICAgICAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSQUNGR19DTURfQVRFX1NUQVJUX1RYX0ZSQU1FIGlzIGRvbmUgIVxuIikpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUkFDRkdfQ01EX0FURV9TRVRfQlc6CisJCQl7CisJCQkJU0hPUlQgICAgdmFsdWUgPSAwOworCQkJCVVDSEFSICAgIHN0cltMRU5fT0ZfQVJHXTsKKworCQkJCU5kaXNaZXJvTWVtb3J5KHN0ciwgTEVOX09GX0FSRyk7CisKKwkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJBQ0ZHX0NNRF9BVEVfU0VUX0JXXG4iKSk7CisKKwkJCQltZW1jcHkoKFBVQ0hBUikmdmFsdWUsIChQVUNIQVIpJihwUmFDZmctPnN0YXR1cyksIDIpOworCQkJCXZhbHVlID0gbnRvaHModmFsdWUpOworCQkJCXNwcmludGYoKFBDSEFSKXN0ciwgIiVkIiwgdmFsdWUpOworCisJCQkJU2V0X0FURV9UWF9CV19Qcm9jKHBBZGFwdGVyLCBzdHIpOworCisJCQkJLy8gcHJlcGFyZSBmZWVkYmFjaworCQkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoMik7CisJCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKyAgICAgICAgICAgIAlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfQVRFX1NFVF9CV1xuIikpOworICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgCX0KKwkJCQllbHNlCisJCQkJeworICAgICAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSQUNGR19DTURfQVRFX1NFVF9CVyBpcyBkb25lICFcbiIpKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFJBQ0ZHX0NNRF9BVEVfU0VUX1RYX1BPV0VSMDoKKwkJCXsKKwkJCQlTSE9SVCAgICB2YWx1ZSA9IDA7CisJCQkJVUNIQVIgICAgc3RyW0xFTl9PRl9BUkddOworCisJCQkJTmRpc1plcm9NZW1vcnkoc3RyLCBMRU5fT0ZfQVJHKTsKKworCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUkFDRkdfQ01EX0FURV9TRVRfVFhfUE9XRVIwXG4iKSk7CisKKwkJCQltZW1jcHkoKFBVQ0hBUikmdmFsdWUsIChQVUNIQVIpJihwUmFDZmctPnN0YXR1cyksIDIpOworCQkJCXZhbHVlID0gbnRvaHModmFsdWUpOworCQkJCXNwcmludGYoKFBDSEFSKXN0ciwgIiVkIiwgdmFsdWUpOworCQkJCVNldF9BVEVfVFhfUE9XRVIwX1Byb2MocEFkYXB0ZXIsIHN0cik7CisKKwkJCQkvLyBwcmVwYXJlIGZlZWRiYWNrCisJCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygyKTsKKwkJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDApOworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihwUmFDZmctPm1hZ2ljX25vKSArIHNpemVvZihwUmFDZmctPmNvbW1hbmRfdHlwZSkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF9pZCkgKyBzaXplb2YocFJhQ2ZnLT5sZW5ndGgpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPnNlcXVlbmNlKSArIG50b2hzKHBSYUNmZy0+bGVuZ3RoKTsKKworICAgICAgICAgICAgCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFJhQ2ZnLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY29weV90b191c2VyKCkgZmFpbCBpbiBjYXNlIFJBQ0ZHX0NNRF9BVEVfU0VUX1RYX1BPV0VSMFxuIikpOworICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgCX0KKwkJCQllbHNlCisJCQkJeworICAgICAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSQUNGR19DTURfQVRFX1NFVF9UWF9QT1dFUjAgaXMgZG9uZSAhXG4iKSk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSQUNGR19DTURfQVRFX1NFVF9UWF9QT1dFUjE6CisJCQl7CisJCQkJU0hPUlQgICAgdmFsdWUgPSAwOworCQkJCVVDSEFSICAgIHN0cltMRU5fT0ZfQVJHXTsKKworCQkJCU5kaXNaZXJvTWVtb3J5KHN0ciwgTEVOX09GX0FSRyk7CisKKwkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJBQ0ZHX0NNRF9BVEVfU0VUX1RYX1BPV0VSMVxuIikpOworCisJCQkJbWVtY3B5KChQVUNIQVIpJnZhbHVlLCAoUFVDSEFSKSYocFJhQ2ZnLT5zdGF0dXMpLCAyKTsKKwkJCQl2YWx1ZSA9IG50b2hzKHZhbHVlKTsKKwkJCQlzcHJpbnRmKChQQ0hBUilzdHIsICIlZCIsIHZhbHVlKTsKKwkJCQlTZXRfQVRFX1RYX1BPV0VSMV9Qcm9jKHBBZGFwdGVyLCBzdHIpOworCisJCQkJLy8gcHJlcGFyZSBmZWVkYmFjaworCQkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoMik7CisJCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKyAgICAgICAgICAgIAlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfQVRFX1NFVF9UWF9QT1dFUjFcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIAl9CisJCQkJZWxzZQorCQkJCXsKKyAgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX0FURV9TRVRfVFhfUE9XRVIxIGlzIGRvbmUgIVxuIikpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUkFDRkdfQ01EX0FURV9TRVRfRlJFUV9PRkZTRVQ6CisJCQl7CisJCQkJU0hPUlQgICAgdmFsdWUgPSAwOworCQkJCVVDSEFSICAgIHN0cltMRU5fT0ZfQVJHXTsKKworCQkJCU5kaXNaZXJvTWVtb3J5KHN0ciwgTEVOX09GX0FSRyk7CisKKwkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJBQ0ZHX0NNRF9BVEVfU0VUX0ZSRVFfT0ZGU0VUXG4iKSk7CisKKwkJCQltZW1jcHkoKFBVQ0hBUikmdmFsdWUsIChQVUNIQVIpJihwUmFDZmctPnN0YXR1cyksIDIpOworCQkJCXZhbHVlID0gbnRvaHModmFsdWUpOworCQkJCXNwcmludGYoKFBDSEFSKXN0ciwgIiVkIiwgdmFsdWUpOworCQkJCVNldF9BVEVfVFhfRlJFUU9GRlNFVF9Qcm9jKHBBZGFwdGVyLCBzdHIpOworCisJCQkJLy8gcHJlcGFyZSBmZWVkYmFjaworCQkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoMik7CisJCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKyAgICAgICAgICAgIAlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfQVRFX1NFVF9GUkVRX09GRlNFVFxuIikpOworICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgCX0KKwkJCQllbHNlCisJCQkJeworICAgICAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSQUNGR19DTURfQVRFX1NFVF9GUkVRX09GRlNFVCBpcyBkb25lICFcbiIpKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFJBQ0ZHX0NNRF9BVEVfR0VUX1NUQVRJU1RJQ1M6CisJCQl7CisJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSQUNGR19DTURfQVRFX0dFVF9TVEFUSVNUSUNTXG4iKSk7CisKKwkJCQltZW1jcHlfZXhsKHBBZGFwdGVyLCAmcFJhQ2ZnLT5kYXRhWzBdLCAoVUNIQVIgKikmcEFkYXB0ZXItPmF0ZS5UeERvbmVDb3VudCwgNCk7CisJCQkJbWVtY3B5X2V4bChwQWRhcHRlciwgJnBSYUNmZy0+ZGF0YVs0XSwgKFVDSEFSICopJnBBZGFwdGVyLT5XbGFuQ291bnRlcnMuUmV0cnlDb3VudC51Lkxvd1BhcnQsIDQpOworCQkJCW1lbWNweV9leGwocEFkYXB0ZXIsICZwUmFDZmctPmRhdGFbOF0sIChVQ0hBUiAqKSZwQWRhcHRlci0+V2xhbkNvdW50ZXJzLkZhaWxlZENvdW50LnUuTG93UGFydCwgNCk7CisJCQkJbWVtY3B5X2V4bChwQWRhcHRlciwgJnBSYUNmZy0+ZGF0YVsxMl0sIChVQ0hBUiAqKSZwQWRhcHRlci0+V2xhbkNvdW50ZXJzLlJUU1N1Y2Nlc3NDb3VudC51Lkxvd1BhcnQsIDQpOworCQkJCW1lbWNweV9leGwocEFkYXB0ZXIsICZwUmFDZmctPmRhdGFbMTZdLCAoVUNIQVIgKikmcEFkYXB0ZXItPldsYW5Db3VudGVycy5SVFNGYWlsdXJlQ291bnQudS5Mb3dQYXJ0LCA0KTsKKwkJCQltZW1jcHlfZXhsKHBBZGFwdGVyLCAmcFJhQ2ZnLT5kYXRhWzIwXSwgKFVDSEFSICopJnBBZGFwdGVyLT5XbGFuQ291bnRlcnMuUmVjZWl2ZWRGcmFnbWVudENvdW50LlF1YWRQYXJ0LCA0KTsKKwkJCQltZW1jcHlfZXhsKHBBZGFwdGVyLCAmcFJhQ2ZnLT5kYXRhWzI0XSwgKFVDSEFSICopJnBBZGFwdGVyLT5XbGFuQ291bnRlcnMuRkNTRXJyb3JDb3VudC51Lkxvd1BhcnQsIDQpOworCQkJCW1lbWNweV9leGwocEFkYXB0ZXIsICZwUmFDZmctPmRhdGFbMjhdLCAoVUNIQVIgKikmcEFkYXB0ZXItPkNvdW50ZXJzODAyMy5SeE5vQnVmZmVyLCA0KTsKKwkJCQltZW1jcHlfZXhsKHBBZGFwdGVyLCAmcFJhQ2ZnLT5kYXRhWzMyXSwgKFVDSEFSICopJnBBZGFwdGVyLT5XbGFuQ291bnRlcnMuRnJhbWVEdXBsaWNhdGVDb3VudC51Lkxvd1BhcnQsIDQpOworCQkJCW1lbWNweV9leGwocEFkYXB0ZXIsICZwUmFDZmctPmRhdGFbMzZdLCAoVUNIQVIgKikmcEFkYXB0ZXItPlJhbGlua0NvdW50ZXJzLk9uZVNlY0ZhbHNlQ0NBQ250LCA0KTsKKworCQkJCWlmIChwQWRhcHRlci0+YXRlLlJ4QW50ZW5uYVNlbCA9PSAwKQorCQkJCXsKKwkJCQkJSU5UMzIgUlNTSTAgPSAwOworCQkJCQlJTlQzMiBSU1NJMSA9IDA7CisJCQkJCUlOVDMyIFJTU0kyID0gMDsKKworCQkJCQlSU1NJMCA9IChJTlQzMikocEFkYXB0ZXItPmF0ZS5MYXN0UnNzaTAgLSBwQWRhcHRlci0+QmJwUnNzaVRvRGJtRGVsdGEpOworCQkJCQlSU1NJMSA9IChJTlQzMikocEFkYXB0ZXItPmF0ZS5MYXN0UnNzaTEgLSBwQWRhcHRlci0+QmJwUnNzaVRvRGJtRGVsdGEpOworCQkJCQlSU1NJMiA9IChJTlQzMikocEFkYXB0ZXItPmF0ZS5MYXN0UnNzaTIgLSBwQWRhcHRlci0+QmJwUnNzaVRvRGJtRGVsdGEpOworCQkJCQltZW1jcHlfZXhsKHBBZGFwdGVyLCAmcFJhQ2ZnLT5kYXRhWzQwXSwgKFVDSEFSICopJlJTU0kwLCA0KTsKKwkJCQkJbWVtY3B5X2V4bChwQWRhcHRlciwgJnBSYUNmZy0+ZGF0YVs0NF0sIChVQ0hBUiAqKSZSU1NJMSwgNCk7CisJCQkJCW1lbWNweV9leGwocEFkYXB0ZXIsICZwUmFDZmctPmRhdGFbNDhdLCAoVUNIQVIgKikmUlNTSTIsIDQpOworCQkJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDIrNTIpOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlJTlQzMiBSU1NJMCA9IDA7CisKKwkJCQkJUlNTSTAgPSAoSU5UMzIpKHBBZGFwdGVyLT5hdGUuTGFzdFJzc2kwIC0gcEFkYXB0ZXItPkJicFJzc2lUb0RibURlbHRhKTsKKwkJCQkJbWVtY3B5X2V4bChwQWRhcHRlciwgJnBSYUNmZy0+ZGF0YVs0MF0sIChVQ0hBUiAqKSZSU1NJMCwgNCk7CisJCQkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoMis0NCk7CisJCQkJfQorCQkJCXBSYUNmZy0+c3RhdHVzID0gaHRvbnMoMCk7CisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBSYUNmZy0+bWFnaWNfbm8pICsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF90eXBlKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX2lkKSArIHNpemVvZihwUmFDZmctPmxlbmd0aCkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworCisgICAgICAgICAgICAJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwUmFDZmcsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjb3B5X3RvX3VzZXIoKSBmYWlsIGluIGNhc2UgUkFDRkdfQ01EX0FURV9HRVRfU1RBVElTVElDU1xuIikpOworICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgCX0KKwkJCQllbHNlCisJCQkJeworICAgICAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSQUNGR19DTURfQVRFX0dFVF9TVEFUSVNUSUNTIGlzIGRvbmUgIVxuIikpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUkFDRkdfQ01EX0FURV9SRVNFVF9DT1VOVEVSOgorCQkJeworCQkJCVNIT1JUICAgIHZhbHVlID0gMTsKKwkJCQlVQ0hBUiAgICBzdHJbTEVOX09GX0FSR107CisKKwkJCQlOZGlzWmVyb01lbW9yeShzdHIsIExFTl9PRl9BUkcpOworCisJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSQUNGR19DTURfQVRFX1JFU0VUX0NPVU5URVJcbiIpKTsKKworCQkJCXNwcmludGYoKFBDSEFSKXN0ciwgIiVkIiwgdmFsdWUpOworCQkJCVNldF9SZXNldFN0YXRDb3VudGVyX1Byb2MocEFkYXB0ZXIsIHN0cik7CisKKwkJCQlwQWRhcHRlci0+YXRlLlR4RG9uZUNvdW50ID0gMDsKKworCQkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoMik7CisJCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihwUmFDZmctPm1hZ2ljX25vKSArIHNpemVvZihwUmFDZmctPmNvbW1hbmRfdHlwZSkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF9pZCkgKyBzaXplb2YocFJhQ2ZnLT5sZW5ndGgpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPnNlcXVlbmNlKSArIG50b2hzKHBSYUNmZy0+bGVuZ3RoKTsKKworICAgICAgICAgICAgCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFJhQ2ZnLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY29weV90b191c2VyKCkgZmFpbCBpbiBjYXNlIFJBQ0ZHX0NNRF9BVEVfUkVTRVRfQ09VTlRFUlxuIikpOworICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgCX0KKwkJCQllbHNlCisJCQkJeworICAgICAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSQUNGR19DTURfQVRFX1JFU0VUX0NPVU5URVIgaXMgZG9uZSAhXG4iKSk7CisJCQkJfQorCQkJfQorCisJCQlicmVhazsKKworCQljYXNlIFJBQ0ZHX0NNRF9BVEVfU0VMX1RYX0FOVEVOTkE6CisJCQl7CisJCQkJU0hPUlQgICAgdmFsdWUgPSAwOworCQkJCVVDSEFSICAgIHN0cltMRU5fT0ZfQVJHXTsKKworCQkJCU5kaXNaZXJvTWVtb3J5KHN0ciwgTEVOX09GX0FSRyk7CisKKwkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJBQ0ZHX0NNRF9BVEVfU0VMX1RYX0FOVEVOTkFcbiIpKTsKKworCQkJCW1lbWNweSgoUFVDSEFSKSZ2YWx1ZSwgKFBVQ0hBUikmKHBSYUNmZy0+c3RhdHVzKSwgMik7CisJCQkJdmFsdWUgPSBudG9ocyh2YWx1ZSk7CisJCQkJc3ByaW50ZigoUENIQVIpc3RyLCAiJWQiLCB2YWx1ZSk7CisJCQkJU2V0X0FURV9UWF9BbnRlbm5hX1Byb2MocEFkYXB0ZXIsIHN0cik7CisKKwkJCQkvLyBwcmVwYXJlIGZlZWRiYWNrCisJCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygyKTsKKwkJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDApOworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihwUmFDZmctPm1hZ2ljX25vKSArIHNpemVvZihwUmFDZmctPmNvbW1hbmRfdHlwZSkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF9pZCkgKyBzaXplb2YocFJhQ2ZnLT5sZW5ndGgpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPnNlcXVlbmNlKSArIG50b2hzKHBSYUNmZy0+bGVuZ3RoKTsKKworICAgICAgICAgICAgCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFJhQ2ZnLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY29weV90b191c2VyKCkgZmFpbCBpbiBjYXNlIFJBQ0ZHX0NNRF9BVEVfU0VMX1RYX0FOVEVOTkFcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIAl9CisJCQkJZWxzZQorCQkJCXsKKyAgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX0FURV9TRUxfVFhfQU5URU5OQSBpcyBkb25lICFcbiIpKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFJBQ0ZHX0NNRF9BVEVfU0VMX1JYX0FOVEVOTkE6CisJCQl7CisJCQkJU0hPUlQgICAgdmFsdWUgPSAwOworCQkJCVVDSEFSICAgIHN0cltMRU5fT0ZfQVJHXTsKKworCQkJCU5kaXNaZXJvTWVtb3J5KHN0ciwgTEVOX09GX0FSRyk7CisKKwkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJBQ0ZHX0NNRF9BVEVfU0VMX1JYX0FOVEVOTkFcbiIpKTsKKworCQkJCW1lbWNweSgoUFVDSEFSKSZ2YWx1ZSwgKFBVQ0hBUikmKHBSYUNmZy0+c3RhdHVzKSwgMik7CisJCQkJdmFsdWUgPSBudG9ocyh2YWx1ZSk7CisJCQkJc3ByaW50ZigoUENIQVIpc3RyLCAiJWQiLCB2YWx1ZSk7CisJCQkJU2V0X0FURV9SWF9BbnRlbm5hX1Byb2MocEFkYXB0ZXIsIHN0cik7CisKKwkJCQkvLyBwcmVwYXJlIGZlZWRiYWNrCisJCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygyKTsKKwkJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDApOworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihwUmFDZmctPm1hZ2ljX25vKSArIHNpemVvZihwUmFDZmctPmNvbW1hbmRfdHlwZSkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF9pZCkgKyBzaXplb2YocFJhQ2ZnLT5sZW5ndGgpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPnNlcXVlbmNlKSArIG50b2hzKHBSYUNmZy0+bGVuZ3RoKTsKKworICAgICAgICAgICAgCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFJhQ2ZnLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY29weV90b191c2VyKCkgZmFpbCBpbiBjYXNlIFJBQ0ZHX0NNRF9BVEVfU0VMX1JYX0FOVEVOTkFcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIAl9CisJCQkJZWxzZQorCQkJCXsKKyAgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX0FURV9TRUxfUlhfQU5URU5OQSBpcyBkb25lICFcbiIpKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFJBQ0ZHX0NNRF9BVEVfU0VUX1BSRUFNQkxFOgorCQkJeworCQkJCVNIT1JUICAgIHZhbHVlID0gMDsKKwkJCQlVQ0hBUiAgICBzdHJbTEVOX09GX0FSR107CisKKwkJCQlOZGlzWmVyb01lbW9yeShzdHIsIExFTl9PRl9BUkcpOworCisJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSQUNGR19DTURfQVRFX1NFVF9QUkVBTUJMRVxuIikpOworCisJCQkJbWVtY3B5KChQVUNIQVIpJnZhbHVlLCAoUFVDSEFSKSYocFJhQ2ZnLT5zdGF0dXMpLCAyKTsKKwkJCQl2YWx1ZSA9IG50b2hzKHZhbHVlKTsKKwkJCQlzcHJpbnRmKChQQ0hBUilzdHIsICIlZCIsIHZhbHVlKTsKKwkJCQlTZXRfQVRFX1RYX01PREVfUHJvYyhwQWRhcHRlciwgc3RyKTsKKworCQkJCS8vIHByZXBhcmUgZmVlZGJhY2sKKwkJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDIpOworCQkJCXBSYUNmZy0+c3RhdHVzID0gaHRvbnMoMCk7CisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBSYUNmZy0+bWFnaWNfbm8pICsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF90eXBlKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX2lkKSArIHNpemVvZihwUmFDZmctPmxlbmd0aCkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworCisgICAgICAgICAgICAJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwUmFDZmcsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjb3B5X3RvX3VzZXIoKSBmYWlsIGluIGNhc2UgUkFDRkdfQ01EX0FURV9TRVRfUFJFQU1CTEVcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIAl9CisJCQkJZWxzZQorCQkJCXsKKyAgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX0FURV9TRVRfUFJFQU1CTEUgaXMgZG9uZSAhXG4iKSk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSQUNGR19DTURfQVRFX1NFVF9DSEFOTkVMOgorCQkJeworCQkJCVNIT1JUICAgIHZhbHVlID0gMDsKKwkJCQlVQ0hBUiAgICBzdHJbTEVOX09GX0FSR107CisKKwkJCQlOZGlzWmVyb01lbW9yeShzdHIsIExFTl9PRl9BUkcpOworCisJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSQUNGR19DTURfQVRFX1NFVF9DSEFOTkVMXG4iKSk7CisKKwkJCQltZW1jcHkoKFBVQ0hBUikmdmFsdWUsIChQVUNIQVIpJihwUmFDZmctPnN0YXR1cyksIDIpOworCQkJCXZhbHVlID0gbnRvaHModmFsdWUpOworCQkJCXNwcmludGYoKFBDSEFSKXN0ciwgIiVkIiwgdmFsdWUpOworCQkJCVNldF9BVEVfQ0hBTk5FTF9Qcm9jKHBBZGFwdGVyLCBzdHIpOworCisJCQkJLy8gcHJlcGFyZSBmZWVkYmFjaworCQkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoMik7CisJCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKyAgICAgICAgICAgIAlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfQVRFX1NFVF9DSEFOTkVMXG4iKSk7CisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICAJfQorCQkJCWVsc2UKKwkJCQl7CisgICAgICAgICAgICAgICAgCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJBQ0ZHX0NNRF9BVEVfU0VUX0NIQU5ORUwgaXMgZG9uZSAhXG4iKSk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSQUNGR19DTURfQVRFX1NFVF9BRERSMToKKwkJCXsKKwkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJBQ0ZHX0NNRF9BVEVfU0VUX0FERFIxXG4iKSk7CisKKwkJCQkvLyBBZGRyIGlzIGFuIGFycmF5IG9mIFVDSEFSLAorCQkJCS8vIHNvIG5vIG5lZWQgdG8gcGVyZm9ybSBlbmRpYW4gc3dhcC4KKwkJCQltZW1jcHkocEFkYXB0ZXItPmF0ZS5BZGRyMSwgKFBVQ0hBUikocFJhQ2ZnLT5kYXRhIC0gMiksIE1BQ19BRERSX0xFTik7CisKKwkJCQkvLyBwcmVwYXJlIGZlZWRiYWNrCisJCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygyKTsKKwkJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDApOworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihwUmFDZmctPm1hZ2ljX25vKSArIHNpemVvZihwUmFDZmctPmNvbW1hbmRfdHlwZSkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF9pZCkgKyBzaXplb2YocFJhQ2ZnLT5sZW5ndGgpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPnNlcXVlbmNlKSArIG50b2hzKHBSYUNmZy0+bGVuZ3RoKTsKKworICAgICAgICAgICAgCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFJhQ2ZnLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY29weV90b191c2VyKCkgZmFpbCBpbiBjYXNlIFJBQ0ZHX0NNRF9BVEVfU0VUX0FERFIxXG4iKSk7CisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICAJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJBQ0ZHX0NNRF9BVEVfU0VUX0FERFIxIGlzIGRvbmUgIVxuIChBRERSMSA9ICUyWDolMlg6JTJYOiUyWDolMlg6JTJYKVxuIiwgcEFkYXB0ZXItPmF0ZS5BZGRyMVswXSwKKwkJCQkJCXBBZGFwdGVyLT5hdGUuQWRkcjFbMV0sIHBBZGFwdGVyLT5hdGUuQWRkcjFbMl0sIHBBZGFwdGVyLT5hdGUuQWRkcjFbM10sIHBBZGFwdGVyLT5hdGUuQWRkcjFbNF0sIHBBZGFwdGVyLT5hdGUuQWRkcjFbNV0pKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFJBQ0ZHX0NNRF9BVEVfU0VUX0FERFIyOgorCQkJeworCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUkFDRkdfQ01EX0FURV9TRVRfQUREUjJcbiIpKTsKKworCQkJCS8vIEFkZHIgaXMgYW4gYXJyYXkgb2YgVUNIQVIsCisJCQkJLy8gc28gbm8gbmVlZCB0byBwZXJmb3JtIGVuZGlhbiBzd2FwLgorCQkJCW1lbWNweShwQWRhcHRlci0+YXRlLkFkZHIyLCAoUFVDSEFSKShwUmFDZmctPmRhdGEgLSAyKSwgTUFDX0FERFJfTEVOKTsKKworCQkJCS8vIHByZXBhcmUgZmVlZGJhY2sKKwkJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDIpOworCQkJCXBSYUNmZy0+c3RhdHVzID0gaHRvbnMoMCk7CisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBSYUNmZy0+bWFnaWNfbm8pICsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF90eXBlKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX2lkKSArIHNpemVvZihwUmFDZmctPmxlbmd0aCkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworCisgICAgICAgICAgICAJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwUmFDZmcsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjb3B5X3RvX3VzZXIoKSBmYWlsIGluIGNhc2UgUkFDRkdfQ01EX0FURV9TRVRfQUREUjJcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIAl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX0FURV9TRVRfQUREUjIgaXMgZG9uZSAhXG4gKEFERFIyID0gJTJYOiUyWDolMlg6JTJYOiUyWDolMlgpXG4iLCBwQWRhcHRlci0+YXRlLkFkZHIyWzBdLAorCQkJCQkJcEFkYXB0ZXItPmF0ZS5BZGRyMlsxXSwgcEFkYXB0ZXItPmF0ZS5BZGRyMlsyXSwgcEFkYXB0ZXItPmF0ZS5BZGRyMlszXSwgcEFkYXB0ZXItPmF0ZS5BZGRyMls0XSwgcEFkYXB0ZXItPmF0ZS5BZGRyMls1XSkpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUkFDRkdfQ01EX0FURV9TRVRfQUREUjM6CisJCQl7CisJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSQUNGR19DTURfQVRFX1NFVF9BRERSM1xuIikpOworCisJCQkJLy8gQWRkciBpcyBhbiBhcnJheSBvZiBVQ0hBUiwKKwkJCQkvLyBzbyBubyBuZWVkIHRvIHBlcmZvcm0gZW5kaWFuIHN3YXAuCisJCQkJbWVtY3B5KHBBZGFwdGVyLT5hdGUuQWRkcjMsIChQVUNIQVIpKHBSYUNmZy0+ZGF0YSAtIDIpLCBNQUNfQUREUl9MRU4pOworCisJCQkJLy8gcHJlcGFyZSBmZWVkYmFjaworCQkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoMik7CisJCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKyAgICAgICAgICAgIAlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfQVRFX1NFVF9BRERSM1xuIikpOworICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSQUNGR19DTURfQVRFX1NFVF9BRERSMyBpcyBkb25lICFcbiAoQUREUjMgPSAlMlg6JTJYOiUyWDolMlg6JTJYOiUyWClcbiIsIHBBZGFwdGVyLT5hdGUuQWRkcjNbMF0sCisJCQkJCQlwQWRhcHRlci0+YXRlLkFkZHIzWzFdLCBwQWRhcHRlci0+YXRlLkFkZHIzWzJdLCBwQWRhcHRlci0+YXRlLkFkZHIzWzNdLCBwQWRhcHRlci0+YXRlLkFkZHIzWzRdLCBwQWRhcHRlci0+YXRlLkFkZHIzWzVdKSk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSQUNGR19DTURfQVRFX1NFVF9SQVRFOgorCQkJeworCQkJCVNIT1JUICAgIHZhbHVlID0gMDsKKwkJCQlVQ0hBUiAgICBzdHJbTEVOX09GX0FSR107CisKKwkJCQlOZGlzWmVyb01lbW9yeShzdHIsIExFTl9PRl9BUkcpOworCisJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSQUNGR19DTURfQVRFX1NFVF9SQVRFXG4iKSk7CisKKwkJCQltZW1jcHkoKFBVQ0hBUikmdmFsdWUsIChQVUNIQVIpJihwUmFDZmctPnN0YXR1cyksIDIpOworCQkJCXZhbHVlID0gbnRvaHModmFsdWUpOworCQkJCXNwcmludGYoKFBDSEFSKXN0ciwgIiVkIiwgdmFsdWUpOworCQkJCVNldF9BVEVfVFhfTUNTX1Byb2MocEFkYXB0ZXIsIHN0cik7CisKKwkJCQkvLyBwcmVwYXJlIGZlZWRiYWNrCisJCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygyKTsKKwkJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDApOworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihwUmFDZmctPm1hZ2ljX25vKSArIHNpemVvZihwUmFDZmctPmNvbW1hbmRfdHlwZSkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF9pZCkgKyBzaXplb2YocFJhQ2ZnLT5sZW5ndGgpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPnNlcXVlbmNlKSArIG50b2hzKHBSYUNmZy0+bGVuZ3RoKTsKKworICAgICAgICAgICAgCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFJhQ2ZnLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY29weV90b191c2VyKCkgZmFpbCBpbiBjYXNlIFJBQ0ZHX0NNRF9BVEVfU0VUX1JBVEVcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIAl9CisJCQkJZWxzZQorCQkJCXsKKyAgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX0FURV9TRVRfUkFURSBpcyBkb25lICFcbiIpKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFJBQ0ZHX0NNRF9BVEVfU0VUX1RYX0ZSQU1FX0xFTjoKKwkJCXsKKwkJCQlTSE9SVCAgICB2YWx1ZSA9IDA7CisJCQkJVUNIQVIgICAgc3RyW0xFTl9PRl9BUkddOworCisJCQkJTmRpc1plcm9NZW1vcnkoc3RyLCBMRU5fT0ZfQVJHKTsKKworCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUkFDRkdfQ01EX0FURV9TRVRfVFhfRlJBTUVfTEVOXG4iKSk7CisKKwkJCQltZW1jcHkoKFBVQ0hBUikmdmFsdWUsIChQVUNIQVIpJihwUmFDZmctPnN0YXR1cyksIDIpOworCQkJCXZhbHVlID0gbnRvaHModmFsdWUpOworCQkJCXNwcmludGYoKFBDSEFSKXN0ciwgIiVkIiwgdmFsdWUpOworCQkJCVNldF9BVEVfVFhfTEVOR1RIX1Byb2MocEFkYXB0ZXIsIHN0cik7CisKKwkJCQkvLyBwcmVwYXJlIGZlZWRiYWNrCisJCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygyKTsKKwkJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDApOworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihwUmFDZmctPm1hZ2ljX25vKSArIHNpemVvZihwUmFDZmctPmNvbW1hbmRfdHlwZSkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF9pZCkgKyBzaXplb2YocFJhQ2ZnLT5sZW5ndGgpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPnNlcXVlbmNlKSArIG50b2hzKHBSYUNmZy0+bGVuZ3RoKTsKKworICAgICAgICAgICAgCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFJhQ2ZnLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY29weV90b191c2VyKCkgZmFpbCBpbiBjYXNlIFJBQ0ZHX0NNRF9BVEVfU0VUX1RYX0ZSQU1FX0xFTlxuIikpOworICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgCX0KKwkJCQllbHNlCisJCQkJeworICAgICAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSQUNGR19DTURfQVRFX1NFVF9UWF9GUkFNRV9MRU4gaXMgZG9uZSAhXG4iKSk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSQUNGR19DTURfQVRFX1NFVF9UWF9GUkFNRV9DT1VOVDoKKwkJCXsKKwkJCQlVU0hPUlQgICAgdmFsdWUgPSAwOworCQkJCVVDSEFSICAgIHN0cltMRU5fT0ZfQVJHXTsKKworCQkJCU5kaXNaZXJvTWVtb3J5KHN0ciwgTEVOX09GX0FSRyk7CisKKwkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJBQ0ZHX0NNRF9BVEVfU0VUX1RYX0ZSQU1FX0NPVU5UXG4iKSk7CisKKwkJCQltZW1jcHkoKFBVQ0hBUikmdmFsdWUsIChQVUNIQVIpJihwUmFDZmctPnN0YXR1cyksIDIpOworCQkJCXZhbHVlID0gbnRvaHModmFsdWUpOworCQkJCXsKKwkJCQkJc3ByaW50ZigoUENIQVIpc3RyLCAiJWQiLCB2YWx1ZSk7CisJCQkJCVNldF9BVEVfVFhfQ09VTlRfUHJvYyhwQWRhcHRlciwgc3RyKTsKKwkJCQl9CisKKwkJCQkvLyBwcmVwYXJlIGZlZWRiYWNrCisJCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygyKTsKKwkJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDApOworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihwUmFDZmctPm1hZ2ljX25vKSArIHNpemVvZihwUmFDZmctPmNvbW1hbmRfdHlwZSkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF9pZCkgKyBzaXplb2YocFJhQ2ZnLT5sZW5ndGgpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPnNlcXVlbmNlKSArIG50b2hzKHBSYUNmZy0+bGVuZ3RoKTsKKworICAgICAgICAgICAgCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFJhQ2ZnLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY29weV90b191c2VyKCkgZmFpbCBpbiBjYXNlIFJBQ0ZHX0NNRF9BVEVfU0VUX1RYX0ZSQU1FX0NPVU5UXG4iKSk7CisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICAJfQorCQkJCWVsc2UKKwkJCQl7CisgICAgICAgICAgICAgICAgCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJBQ0ZHX0NNRF9BVEVfU0VUX1RYX0ZSQU1FX0NPVU5UIGlzIGRvbmUgIVxuIikpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUkFDRkdfQ01EX0FURV9TVEFSVF9SWF9GUkFNRToKKwkJCXsKKwkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJBQ0ZHX0NNRF9SWF9TVEFSVFxuIikpOworCisJCQkJU2V0X0FURV9Qcm9jKHBBZGFwdGVyLCAiUlhGUkFNRSIpOworCisJCQkJLy8gcHJlcGFyZSBmZWVkYmFjaworCQkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoMik7CisJCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKyAgICAgICAgICAgIAlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfUlhfU1RBUlRcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIAl9CisJCQkJZWxzZQorCQkJCXsKKyAgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX1JYX1NUQVJUIGlzIGRvbmUgIVxuIikpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJfQorICAgIEFTU0VSVChwUmFDZmcgIT0gTlVMTCk7CisgICAgaWYgKHBSYUNmZyAhPSBOVUxMKQorICAgIHsKKyAgICBrZnJlZShwUmFDZmcpOworICAgIH0KKwlyZXR1cm47Cit9CisKK1ZPSUQgQnViYmxlU29ydChJTlQzMiBuLCBJTlQzMiBhW10pCit7CisJSU5UMzIgaywgaiwgdGVtcDsKKworCWZvciAoayA9IG4tMTsgIGs+MDsgIGstLSkKKwl7CisJCWZvciAoaiA9IDA7IGo8azsgaisrKQorCQl7CisJCQlpZihhW2pdID4gYVtqKzFdKQorCQkJeworCQkJCXRlbXAgPSBhW2pdOworCQkJCWFbal09YVtqKzFdOworCQkJCWFbaisxXT10ZW1wOworCQkJfQorCQl9CisJfQorfQorCitWT0lEIENhbE5vaXNlTGV2ZWwoUFJUTVBfQURBUFRFUiBwQWQsIFVDSEFSIGNoYW5uZWwsIElOVDMyIFJTU0lbM11bMTBdKQoreworCUlOVDMyCQlSU1NJMCwgUlNTSTEsIFJTU0kyOworIAlDSEFSCQlSc3NpME9mZnNldCwgUnNzaTFPZmZzZXQsIFJzc2kyT2Zmc2V0OworCVVDSEFSCQlCYnBSNTBSc3NpMCA9IDAsIEJicFI1MVJzc2kxID0gMCwgQmJwUjUyUnNzaTIgPSAwOworCVVDSEFSCQlPcmdfQkJQNjZ2YWx1ZSA9IDAsIE9yZ19CQlA2OXZhbHVlID0gMCwgT3JnX0JCUDcwdmFsdWUgPSAwLCBkYXRhID0gMDsKKwlVU0hPUlQJCUxOQV9HYWluID0gMDsKKwlJTlQzMiAgICAgICBqID0gMDsKKwlVQ0hBUgkJT3JnX0NoYW5uZWwgPSBwQWQtPmF0ZS5DaGFubmVsOworCVVTSE9SVAkgICAgR2FpblZhbHVlID0gMCwgT2Zmc2V0VmFsdWUgPSAwOworCisJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY2LCAmT3JnX0JCUDY2dmFsdWUpOworCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I2OSwgJk9yZ19CQlA2OXZhbHVlKTsKKwlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNzAsICZPcmdfQkJQNzB2YWx1ZSk7CisKKwkvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkvLyBSZWFkIHRoZSB2YWx1ZSBvZiBMTkEgZ2FpbiBhbmQgUnNzaSBvZmZzZXQKKwkvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9MTkFfT0ZGU0VULCBHYWluVmFsdWUpOworCisJLy8gZm9yIE5vaXNlIExldmVsCisJaWYgKGNoYW5uZWwgPD0gMTQpCisJeworCQlMTkFfR2FpbiA9IEdhaW5WYWx1ZSAmIDB4MDBGRjsKKworCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9SU1NJX0JHX09GRlNFVCwgT2Zmc2V0VmFsdWUpOworCQlSc3NpME9mZnNldCA9IE9mZnNldFZhbHVlICYgMHgwMEZGOworCQlSc3NpMU9mZnNldCA9IChPZmZzZXRWYWx1ZSAmIDB4RkYwMCkgPj4gODsKKwkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCAoRUVQUk9NX1JTU0lfQkdfT0ZGU0VUICsgMikvKiAweDQ4ICovLCBPZmZzZXRWYWx1ZSk7CisJCVJzc2kyT2Zmc2V0ID0gT2Zmc2V0VmFsdWUgJiAweDAwRkY7CisJfQorCWVsc2UKKwl7CisJCUxOQV9HYWluID0gKEdhaW5WYWx1ZSAmIDB4RkYwMCkgPj4gODsKKworCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9SU1NJX0FfT0ZGU0VULCBPZmZzZXRWYWx1ZSk7CisJCVJzc2kwT2Zmc2V0ID0gT2Zmc2V0VmFsdWUgJiAweDAwRkY7CisJCVJzc2kxT2Zmc2V0ID0gKE9mZnNldFZhbHVlICYgMHhGRjAwKSA+PiA4OworCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIChFRVBST01fUlNTSV9BX09GRlNFVCArIDIpLyogMHg0QyAqLywgT2Zmc2V0VmFsdWUpOworCQlSc3NpMk9mZnNldCA9IE9mZnNldFZhbHVlICYgMHgwMEZGOworCX0KKwkvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwl7CisJCXBBZC0+YXRlLkNoYW5uZWwgPSBjaGFubmVsOworCQlBVEVBc2ljU3dpdGNoQ2hhbm5lbChwQWQpOworCQltZGVsYXkoNSk7CisKKwkJZGF0YSA9IDB4MTA7CisJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjYsIGRhdGEpOworCQlkYXRhID0gMHg0MDsKKwkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2OSwgZGF0YSk7CisJCWRhdGEgPSAweDQwOworCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjcwLCBkYXRhKTsKKwkJbWRlbGF5KDUpOworCisJCS8vIFN0YXJ0IFJ4CisJCXBBZC0+YXRlLmJRQVJ4U3RhcnQgPSBUUlVFOworCQlTZXRfQVRFX1Byb2MocEFkLCAiUlhGUkFNRSIpOworCisJCW1kZWxheSg1KTsKKworCQlmb3IgKGogPSAwOyBqIDwgMTA7IGorKykKKwkJeworCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjUwLCAmQmJwUjUwUnNzaTApOworCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjUxLCAmQmJwUjUxUnNzaTEpOworCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjUyLCAmQmJwUjUyUnNzaTIpOworCisJCQltZGVsYXkoMTApOworCisJCQkvLyBDYWxjdWxhdGUgUlNTSSAwCisJCQlpZiAoQmJwUjUwUnNzaTAgPT0gMCkKKwkJCXsKKwkJCQlSU1NJMCA9IC0xMDA7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJUlNTSTAgPSAoSU5UMzIpKC0xMiAtIEJicFI1MFJzc2kwIC0gTE5BX0dhaW4gLSBSc3NpME9mZnNldCk7CisJCQl9CisJCQlSU1NJWzBdW2pdID0gUlNTSTA7CisKKwkJCWlmICggcEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA+PSAyICkgLy8gMlIKKwkJCXsKKwkJCQkvLyBDYWxjdWxhdGUgUlNTSSAxCisJCQkJaWYgKEJicFI1MVJzc2kxID09IDApCisJCQkJeworCQkJCQlSU1NJMSA9IC0xMDA7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCVJTU0kxID0gKElOVDMyKSgtMTIgLSBCYnBSNTFSc3NpMSAtIExOQV9HYWluIC0gUnNzaTFPZmZzZXQpOworCQkJCX0KKwkJCQlSU1NJWzFdW2pdID0gUlNTSTE7CisJCQl9CisKKwkJCWlmICggcEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA+PSAzICkgLy8gM1IKKwkJCXsKKwkJCQkvLyBDYWxjdWxhdGUgUlNTSSAyCisJCQkJaWYgKEJicFI1MlJzc2kyID09IDApCisJCQkJCVJTU0kyID0gLTEwMDsKKwkJCQllbHNlCisJCQkJCVJTU0kyID0gKElOVDMyKSgtMTIgLSBCYnBSNTJSc3NpMiAtIExOQV9HYWluIC0gUnNzaTJPZmZzZXQpOworCisJCQkJUlNTSVsyXVtqXSA9IFJTU0kyOworCQkJfQorCQl9CisKKwkJLy8gU3RvcCBSeAorCQlTZXRfQVRFX1Byb2MocEFkLCAiUlhTVE9QIik7CisKKwkJbWRlbGF5KDUpOworCisjaWYgMC8vIERlYnVnIE1lc3NhZ2UuLi4uLi4uLi4uLi4uLi4uCisJCWF0ZV9wcmludCgiXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4iKTsKKwkJYXRlX3ByaW50KCJOb2lzZSBMZXZlbDogQ2hhbm5lbCAlZFxuIiwgY2hhbm5lbCk7CisJCWF0ZV9wcmludCgiUlNTSTAgPSAlZCwgJWQsICVkLCAlZCwgJWQsICVkLCAlZCwgJWQsICVkLCAlZFxuIiwKKwkJCVJTU0lbMF1bMF0sIFJTU0lbMF1bMV0sIFJTU0lbMF1bMl0sCisJCQlSU1NJWzBdWzNdLCBSU1NJWzBdWzRdLCBSU1NJWzBdWzVdLAorCQkJUlNTSVswXVs2XSwgUlNTSVswXVs3XSwgUlNTSVswXVs4XSwKKwkJCVJTU0lbMF1bOV0pOworCQlpZiAoIHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPj0gMiApIC8vIDJSCisJCXsKKwkJCWF0ZV9wcmludCgiUlNTSTEgPSAlZCwgJWQsICVkLCAlZCwgJWQsICVkLCAlZCwgJWQsICVkLCAlZFxuIiwKKwkJCQlSU1NJWzFdWzBdLCBSU1NJWzFdWzFdLCBSU1NJWzFdWzJdLAorCQkJCVJTU0lbMV1bM10sIFJTU0lbMV1bNF0sIFJTU0lbMV1bNV0sCisJCQkJUlNTSVsxXVs2XSwgUlNTSVsxXVs3XSwgUlNTSVsxXVs4XSwKKwkJCQlSU1NJWzFdWzldKTsKKwkJfQorCQlpZiAoIHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPj0gMyApIC8vIDNSCisJCXsKKwkJCWF0ZV9wcmludCgiUlNTSTIgPSAlZCwgJWQsICVkLCAlZCwgJWQsICVkLCAlZCwgJWQsICVkLCAlZFxuIiwKKwkJCQlSU1NJWzJdWzBdLCBSU1NJWzJdWzFdLCBSU1NJWzJdWzJdLAorCQkJCVJTU0lbMl1bM10sIFJTU0lbMl1bNF0sIFJTU0lbMl1bNV0sCisJCQkJUlNTSVsyXVs2XSwgUlNTSVsyXVs3XSwgUlNTSVsyXVs4XSwKKwkJCQlSU1NJWzJdWzldKTsKKwkJfQorI2VuZGlmIC8vIDAgLy8KKwkJQnViYmxlU29ydCgxMCwgUlNTSVswXSk7CS8vIDFSCisKKwkJaWYgKCBwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID49IDIgKSAvLyAyUgorCQl7CisJCQlCdWJibGVTb3J0KDEwLCBSU1NJWzFdKTsKKwkJfQorCisJCWlmICggcEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA+PSAzICkgLy8gM1IKKwkJeworCQkJQnViYmxlU29ydCgxMCwgUlNTSVsyXSk7CisJCX0KKworI2lmIDAvLyBEZWJ1ZyBNZXNzYWdlLi4uLi4uLi4uLi4uLi4uLgorCQlhdGVfcHJpbnQoIlxuQWZ0ZXIgU29ydGluZy4uLi5DaGFubmVsICVkXG4iLCBjaGFubmVsKTsKKwkJYXRlX3ByaW50KCJSU1NJMCA9ICVkLCAlZCwgJWQsICVkLCAlZCwgJWQsICVkLCAlZCwgJWQsICVkXG4iLAorCQkJUlNTSVswXVswXSwgUlNTSVswXVsxXSwgUlNTSVswXVsyXSwKKwkJCVJTU0lbMF1bM10sIFJTU0lbMF1bNF0sIFJTU0lbMF1bNV0sCisJCQlSU1NJWzBdWzZdLCBSU1NJWzBdWzddLCBSU1NJWzBdWzhdLAorCQkJUlNTSVswXVs5XSk7CisJCWlmICggcEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA+PSAyICkgLy8gMlIKKwkJeworCQkJYXRlX3ByaW50KCJSU1NJMSA9ICVkLCAlZCwgJWQsICVkLCAlZCwgJWQsICVkLCAlZCwgJWQsICVkXG4iLAorCQkJCVJTU0lbMV1bMF0sIFJTU0lbMV1bMV0sIFJTU0lbMV1bMl0sCisJCQkJUlNTSVsxXVszXSwgUlNTSVsxXVs0XSwgUlNTSVsxXVs1XSwKKwkJCQlSU1NJWzFdWzZdLCBSU1NJWzFdWzddLCBSU1NJWzFdWzhdLAorCQkJCVJTU0lbMV1bOV0pOworCQl9CisJCWlmICggcEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA+PSAzICkgLy8gM1IKKwkJeworCQkJYXRlX3ByaW50KCJSU1NJMiA9ICVkLCAlZCwgJWQsICVkLCAlZCwgJWQsICVkLCAlZCwgJWQsICVkXG4iLAorCQkJCVJTU0lbMl1bMF0sIFJTU0lbMl1bMV0sIFJTU0lbMl1bMl0sCisJCQkJUlNTSVsyXVszXSwgUlNTSVsyXVs0XSwgUlNTSVsyXVs1XSwKKwkJCQlSU1NJWzJdWzZdLCBSU1NJWzJdWzddLCBSU1NJWzJdWzhdLAorCQkJCVJTU0lbMl1bOV0pOworCQl9CisJCWF0ZV9wcmludCgiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuIik7CisjZW5kaWYgLy8gMCAvLworCX0KKworCXBBZC0+YXRlLkNoYW5uZWwgPSBPcmdfQ2hhbm5lbDsKKwlBVEVBc2ljU3dpdGNoQ2hhbm5lbChwQWQpOworCisJLy8gUmVzdG9yZSBvcmlnaW5hbCB2YWx1ZQorICAgIEFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjYsIE9yZ19CQlA2NnZhbHVlKTsKKyAgICBBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY5LCBPcmdfQkJQNjl2YWx1ZSk7CisgICAgQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I3MCwgT3JnX0JCUDcwdmFsdWUpOworCisJcmV0dXJuOworfQorCitCT09MRUFOIFN5bmNUeFJ4Q29uZmlnKFBSVE1QX0FEQVBURVIgcEFkLCBVU0hPUlQgb2Zmc2V0LCBVQ0hBUiB2YWx1ZSkKK3sKKwlVQ0hBUiB0bXAgPSAwLCBiYnBfZGF0YSA9IDA7CisKKwlpZiAoQVRFX09OKHBBZCkpCisJeworCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIG9mZnNldCwgJmJicF9kYXRhKTsKKwl9CisJZWxzZQorCXsKKwkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgb2Zmc2V0LCAmYmJwX2RhdGEpOworCX0KKworCS8qIGNvbmZpcm0gYWdhaW4gKi8KKwlBU1NFUlQoYmJwX2RhdGEgPT0gdmFsdWUpOworCisJc3dpdGNoKG9mZnNldCkKKwl7CisJCWNhc2UgQkJQX1IxOgorCQkJLyogTmVlZCB0byBzeW5jLiB0eCBjb25maWd1cmF0aW9uIHdpdGggbGVnYWN5IEFURS4gKi8KKwkJCXRtcCA9IChiYnBfZGF0YSAmICgoMSA8PCA0KSB8ICgxIDw8IDMpKS8qIDB4MTggKi8pID4+IDM7CisJCSAgICBzd2l0Y2godG1wKQorCQkgICAgeworCQkJCS8qIFRoZSBCQlAgUjEgYml0WzQ6M10gPSAyIDo6IEJvdGggREFDcyB3aWxsIGJlIHVzZWQgYnkgUUEuICovCisJCSAgICAgICAgY2FzZSAyOgorCQkJCQkvKiBBbGwgKi8KKwkJCQkJcEFkLT5hdGUuVHhBbnRlbm5hU2VsID0gMDsKKwkJICAgICAgICAgICAgYnJlYWs7CisJCQkJLyogVGhlIEJCUCBSMSBiaXRbNDozXSA9IDAgOjogREFDIDAgd2lsbCBiZSB1c2VkIGJ5IFFBLiAqLworCQkgICAgICAgIGNhc2UgMDoKKwkJCQkJLyogQW50ZW5uYSBvbmUgKi8KKwkJCQkJcEFkLT5hdGUuVHhBbnRlbm5hU2VsID0gMTsKKwkJICAgICAgICAgICAgYnJlYWs7CisJCQkJLyogVGhlIEJCUCBSMSBiaXRbNDozXSA9IDEgOjogREFDIDEgd2lsbCBiZSB1c2VkIGJ5IFFBLiAqLworCQkgICAgICAgIGNhc2UgMToKKwkJCQkJLyogQW50ZW5uYSB0d28gKi8KKwkJCQkJcEFkLT5hdGUuVHhBbnRlbm5hU2VsID0gMjsKKwkJICAgICAgICAgICAgYnJlYWs7CisJCSAgICAgICAgZGVmYXVsdDoKKwkJICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXMgLS0gU3RoLiB3cm9uZyEgIDogcmV0dXJuIEZBTFNFOyBcbiIsIF9fZnVuY19fKSk7CisJCSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKwkJICAgIH0KKwkJCWJyZWFrOy8qIGNhc2UgQkJQX1IxICovCisKKwkJY2FzZSBCQlBfUjM6CisJCQkvKiBOZWVkIHRvIHN5bmMuIHJ4IGNvbmZpZ3VyYXRpb24gd2l0aCBsZWdhY3kgQVRFLiAqLworCQkJdG1wID0gKGJicF9kYXRhICYgKCgxIDw8IDEpIHwgKDEgPDwgMCkpLyogMHgwMyAqLyk7CisJCSAgICBzd2l0Y2godG1wKQorCQkgICAgeworCQkJCS8qIFRoZSBCQlAgUjMgYml0WzE6MF0gPSAzIDo6IEFsbCBBRENzIHdpbGwgYmUgdXNlZCBieSBRQS4gKi8KKwkJICAgICAgICBjYXNlIDM6CisJCQkJCS8qIEFsbCAqLworCQkJCQlwQWQtPmF0ZS5SeEFudGVubmFTZWwgPSAwOworCQkgICAgICAgICAgICBicmVhazsKKwkJCQkvKiBUaGUgQkJQIFIzIGJpdFsxOjBdID0gMCA6OiBBREMgMCB3aWxsIGJlIHVzZWQgYnkgUUEsICovCisJCQkJLyogdW5sZXNzIHRoZSBCQlAgUjMgYml0WzQ6M10gPSAyICovCisJCSAgICAgICAgY2FzZSAwOgorCQkJCQkvKiBBbnRlbm5hIG9uZSAqLworCQkJCQlwQWQtPmF0ZS5SeEFudGVubmFTZWwgPSAxOworCQkJCQl0bXAgPSAoKGJicF9kYXRhICYgKCgxIDw8IDQpIHwgKDEgPDwgMykpLyogMHgwMyAqLykgPj4gMyk7CisJCQkJCWlmICh0bXAgPT0gMikvLyAzUgorCQkJCQl7CisJCQkJCQkvKiBEZWZhdWx0IDogQWxsIEFEQ3Mgd2lsbCBiZSB1c2VkIGJ5IFFBICovCisJCQkJCQlwQWQtPmF0ZS5SeEFudGVubmFTZWwgPSAwOworCQkJCQl9CisJCSAgICAgICAgICAgIGJyZWFrOworCQkJCS8qIFRoZSBCQlAgUjMgYml0WzE6MF0gPSAxIDo6IEFEQyAxIHdpbGwgYmUgdXNlZCBieSBRQS4gKi8KKwkJICAgICAgICBjYXNlIDE6CisJCQkJCS8qIEFudGVubmEgdHdvICovCisJCQkJCXBBZC0+YXRlLlJ4QW50ZW5uYVNlbCA9IDI7CisJCSAgICAgICAgICAgIGJyZWFrOworCQkJCS8qIFRoZSBCQlAgUjMgYml0WzE6MF0gPSAyIDo6IEFEQyAyIHdpbGwgYmUgdXNlZCBieSBRQS4gKi8KKwkJICAgICAgICBjYXNlIDI6CisJCQkJCS8qIEFudGVubmEgdGhyZWUgKi8KKwkJCQkJcEFkLT5hdGUuUnhBbnRlbm5hU2VsID0gMzsKKwkJICAgICAgICAgICAgYnJlYWs7CisJCSAgICAgICAgZGVmYXVsdDoKKwkJICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXMgLS0gSW1wb3NzaWJsZSEgIDogcmV0dXJuIEZBTFNFOyBcbiIsIF9fZnVuY19fKSk7CisJCSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKwkJICAgIH0KKwkJCWJyZWFrOy8qIGNhc2UgQkJQX1IzICovCisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzIC0tIFN0aC4gd3JvbmchICA6IHJldHVybiBGQUxTRTsgXG4iLCBfX2Z1bmNfXykpOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworCisJfQorCXJldHVybiBUUlVFOworfQorCitzdGF0aWMgVk9JRCBtZW1jcHlfZXhsKFBSVE1QX0FEQVBURVIgcEFkLCBVQ0hBUiAqZHN0LCBVQ0hBUiAqc3JjLCBVTE9ORyBsZW4pCit7CisJVUxPTkcgaSwgVmFsdWUgPSAwOworCVVMT05HICpwRHN0LCAqcFNyYzsKKwlVQ0hBUiAqcDg7CisKKwlwOCA9IHNyYzsKKwlwRHN0ID0gKFVMT05HICopIGRzdDsKKwlwU3JjID0gKFVMT05HICopIHNyYzsKKworCWZvciAoaSA9IDAgOyBpIDwgKGxlbi80KTsgaSsrKQorCXsKKwkJLyogRm9yIGFsaWdubWVudCBpc3N1ZSwgd2UgbmVlZCBhIHZhcmlhYmxlICJWYWx1ZSIuICovCisJCW1lbW1vdmUoJlZhbHVlLCBwU3JjLCA0KTsKKwkJVmFsdWUgPSBodG9ubChWYWx1ZSk7CisJCW1lbW1vdmUocERzdCwgJlZhbHVlLCA0KTsKKwkJcERzdCsrOworCQlwU3JjKys7CisJfQorCWlmICgobGVuICUgNCkgIT0gMCkKKwl7CisJCS8qIHdpc2ggdGhhdCBpdCB3aWxsIG5ldmVyIHJlYWNoIGhlcmUgKi8KKwkJbWVtbW92ZSgmVmFsdWUsIHBTcmMsIChsZW4gJSA0KSk7CisJCVZhbHVlID0gaHRvbmwoVmFsdWUpOworCQltZW1tb3ZlKHBEc3QsICZWYWx1ZSwgKGxlbiAlIDQpKTsKKwl9Cit9CisKK3N0YXRpYyBWT0lEIG1lbWNweV9leHMoUFJUTVBfQURBUFRFUiBwQWQsIFVDSEFSICpkc3QsIFVDSEFSICpzcmMsIFVMT05HIGxlbikKK3sKKwlVTE9ORyBpOworCVVDSEFSICpwRHN0LCAqcFNyYzsKKworCXBEc3QgPSBkc3Q7CisJcFNyYyA9IHNyYzsKKworCWZvciAoaSA9IDA7IGkgPCAobGVuLzIpOyBpKyspCisJeworCQltZW1tb3ZlKHBEc3QsIHBTcmMsIDIpOworCQkqKChVU0hPUlQgKilwRHN0KSA9IGh0b25zKCooKFVTSE9SVCAqKXBEc3QpKTsKKwkJcERzdCs9MjsKKwkJcFNyYys9MjsKKwl9CisKKwlpZiAoKGxlbiAlIDIpICE9IDApCisJeworCQltZW1tb3ZlKHBEc3QsIHBTcmMsIDEpOworCX0KK30KKworc3RhdGljIFZPSUQgUlRNUF9JT19SRUFEX0JVTEsoUFJUTVBfQURBUFRFUiBwQWQsIFVDSEFSICpkc3QsIFVDSEFSICpzcmMsIFVJTlQzMiBsZW4pCit7CisJVUlOVDMyIGksIFZhbHVlOworCVVJTlQzMiAqcERzdCwgKnBTcmM7CisKKwlwRHN0ID0gKFVJTlQzMiAqKSBkc3Q7CisJcFNyYyA9IChVSU5UMzIgKikgc3JjOworCisJZm9yIChpID0gMCA7IGkgPCAobGVuLzQpOyBpKyspCisJeworCQlSVE1QX0lPX1JFQUQzMihwQWQsIChVTE9ORylwU3JjLCAmVmFsdWUpOworCQlWYWx1ZSA9IGh0b25sKFZhbHVlKTsKKwkJbWVtbW92ZShwRHN0LCAmVmFsdWUsIDQpOworCQlwRHN0Kys7CisJCXBTcmMrKzsKKwl9CisJcmV0dXJuOworfQorCisvLyBUT0RPOgorI2lmIDAKKy8qIFRoZXNlIHdvcmsgb25seSB3aGVuIFJBTElOS19BVEUgaXMgZGVmaW5lZCAqLworSU5UIFNldF9UeFN0YXJ0X1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCVVMT05HIHZhbHVlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKwlVQ0hBUiBidWZmZXJbMjZdID0gezB4ODgsIDB4MDIsIDB4MmMsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MTEsIDB4MjIsIDB4MzMsIDB4NDQsIDB4NTUsIDB4MDAsIDB4NTUsIDB4NDQsIDB4MzMsIDB4MjIsIDB4MTEsIDB4YzAsIDB4MjIsIDB4MDAsIDB4MDB9OworCVBPU19DT09LSUUgcE9iajsKKworCWlmIChwQWQtPmF0ZS5UeFN0YXR1cyAhPSAwKQorCQlyZXR1cm4gRkFMU0U7CisKKwlwQWQtPmF0ZS5UeEluZm8gPSAweDA0MDAwMDAwOworCWJ6ZXJvKCZwQWQtPmF0ZS5UeFdJLCBzaXplb2YoVFhXSV9TVFJVQykpOworCXBBZC0+YXRlLlR4V0kuUEhZTU9ERSA9IDA7Ly8gTU9ERV9DQ0sKKwlwQWQtPmF0ZS5UeFdJLk1QRFV0b3RhbEJ5dGVDb3VudCA9IDEyMjY7CisJcEFkLT5hdGUuVHhXSS5NQ1MgPSAzOworCS8vcEFkLT5hdGUuTW9kZSA9IEFURV9TVEFSVDsKKwlwQWQtPmF0ZS5Nb2RlIHw9IEFURV9UWEZSQU1FOworCXBBZC0+YXRlLlR4Q291bnQgPSB2YWx1ZTsKKwlwQWQtPmF0ZS5RSUQgPSAwOworCXBBZC0+YXRlLkhMZW4gPSAyNjsKKwlwQWQtPmF0ZS5QTGVuID0gMDsKKwlwQWQtPmF0ZS5ETGVuID0gMTIwMDsKKwltZW1jcHkocEFkLT5hdGUuSGVhZGVyLCBidWZmZXIsIDI2KTsKKwlwQWQtPmF0ZS5iUUFUeFN0YXJ0ID0gVFJVRTsKKwkvL3BPYmogPSAoUE9TX0NPT0tJRSkgcEFkLT5PU19Db29raWU7CisJLy90YXNrbGV0X2hpX3NjaGVkdWxlKCZwT2JqLT5BdGVUeFRhc2spOworCXJldHVybiBUUlVFOworfQorI2VuZGlmICAvKiBlbmQgb2YgI2lmIDAgKi8KKworSU5UIFNldF9UeFN0b3BfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJTZXRfVHhTdG9wX1Byb2NcbiIpKTsKKworCWlmIChTZXRfQVRFX1Byb2MocEFkLCAiVFhTVE9QIikpCisJeworCXJldHVybiBUUlVFOworfQorCWVsc2UKKwl7CisJCXJldHVybiBGQUxTRTsKKwl9Cit9CisKK0lOVCBTZXRfUnhTdG9wX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiU2V0X1J4U3RvcF9Qcm9jXG4iKSk7CisKKwlpZiAoU2V0X0FURV9Qcm9jKHBBZCwgIlJYU1RPUCIpKQorCXsKKwlyZXR1cm4gVFJVRTsKK30KKwllbHNlCisJeworCQlyZXR1cm4gRkFMU0U7CisJfQorfQorCisjaWYgMAorSU5UIFNldF9FRVdyaXRlX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCVVTSE9SVCBvZmZzZXQgPSAwLCB2YWx1ZTsKKwlQVUNIQVIgcDIgPSBhcmc7CisKKwl3aGlsZSgoKnAyICE9ICc6JykgJiYgKCpwMiAhPSAnXDAnKSkKKwl7CisJCXAyKys7CisJfQorCisJaWYgKCpwMiA9PSAnOicpCisJeworCQlBMkhleChvZmZzZXQsIGFyZyk7CisJCUEySGV4KHZhbHVlLCBwMisgMSk7CisJfQorCWVsc2UKKwl7CisJCUEySGV4KHZhbHVlLCBhcmcpOworCX0KKworCWlmIChvZmZzZXQgPj0gRUVQUk9NX1NJWkUpCisJeworCQlhdGVfcHJpbnQoIk9mZnNldCBjYW4gbm90IGV4Y2VlZCBFRVBST01fU0laRSggPT0gMHglMDR4KVxuIiwgRUVQUk9NX1NJWkUpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJUlRNUF9FRVBST01fV1JJVEUxNihwQWQsIG9mZnNldCwgdmFsdWUpOworCisJcmV0dXJuIFRSVUU7Cit9CisKK0lOVCBTZXRfQkJQUmVhZF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVQ0hBUiB2YWx1ZSA9IDAsIG9mZnNldDsKKworCUEySGV4KG9mZnNldCwgYXJnKTsKKworCWlmIChBVEVfT04ocEFkKSkKKwl7CisJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgb2Zmc2V0LCAgJnZhbHVlKTsKKwl9CisJZWxzZQorCXsKKwkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgb2Zmc2V0LCAgJnZhbHVlKTsKKwl9CisKKwlhdGVfcHJpbnQoIiV4XG4iLCB2YWx1ZSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworCitJTlQgU2V0X0JCUFdyaXRlX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCVVTSE9SVCBvZmZzZXQgPSAwOworCVBVQ0hBUiBwMiA9IGFyZzsKKwlVQ0hBUiB2YWx1ZTsKKworCXdoaWxlKCgqcDIgIT0gJzonKSAmJiAoKnAyICE9ICdcMCcpKQorCXsKKwkJcDIrKzsKKwl9CisKKwlpZiAoKnAyID09ICc6JykKKwl7CisJCUEySGV4KG9mZnNldCwgYXJnKTsKKwkJQTJIZXgodmFsdWUsIHAyKyAxKTsKKwl9CisJZWxzZQorCXsKKwkJQTJIZXgodmFsdWUsIGFyZyk7CisJfQorCisJaWYgKEFURV9PTihwQWQpKQorCXsKKwkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgb2Zmc2V0LCAgdmFsdWUpOworCX0KKwllbHNlCisJeworCQlSVE5QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgb2Zmc2V0LCAgdmFsdWUpOworCX0KKworCXJldHVybiBUUlVFOworfQorCitJTlQgU2V0X1JGV3JpdGVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJUFVDSEFSIHAyLCBwMywgcDQ7CisJVUxPTkcgUjEsIFIyLCBSMywgUjQ7CisKKwlwMiA9IGFyZzsKKworCXdoaWxlKCgqcDIgIT0gJzonKSAmJiAoKnAyICE9ICdcMCcpKQorCXsKKwkJcDIrKzsKKwl9CisKKwlpZiAoKnAyICE9ICc6JykKKwkJcmV0dXJuIEZBTFNFOworCisJcDMgPSBwMiArIDE7CisKKwl3aGlsZSgoKnAzICE9ICc6JykgJiYgKCpwMyAhPSAnXDAnKSkKKwl7CisJCXAzKys7CisJfQorCisJaWYgKCpwMyAhPSAnOicpCisJCXJldHVybiBGQUxTRTsKKworCXA0ID0gcDMgKyAxOworCisJd2hpbGUoKCpwNCAhPSAnOicpICYmICgqcDQgIT0gJ1wwJykpCisJeworCQlwNCsrOworCX0KKworCWlmICgqcDQgIT0gJzonKQorCQlyZXR1cm4gRkFMU0U7CisKKworCUEySGV4KFIxLCBhcmcpOworCUEySGV4KFIyLCBwMiArIDEpOworCUEySGV4KFIzLCBwMyArIDEpOworCUEySGV4KFI0LCBwNCArIDEpOworCisJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgUjEpOworCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIFIyKTsKKwlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCBSMyk7CisJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgUjQpOworCisJcmV0dXJuIFRSVUU7Cit9CisjZW5kaWYgIC8vIGVuZCBvZiAjaWYgMCAvLworI2VuZGlmCS8vIFJBTElOS18yOHh4X1FBIC8vCisKKyNlbmRpZgkvLyBSQUxJTktfQVRFIC8vCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvcnRfYXRlLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3J0X2F0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2MThjZTMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3J0X2F0ZS5oCkBAIC0wLDAgKzEsMzE1IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisjaWZuZGVmIF9fQVRFX0hfXworI2RlZmluZSBfX0FURV9IX18KKworI2lmbmRlZiBVQ09TCisjZGVmaW5lIGF0ZV9wcmludCBwcmludGsKKyNkZWZpbmUgQVRFREJHUFJJTlQgREJHUFJJTlQKKworI2lmZGVmIFJUMjg3MAorI2RlZmluZSBFRVBST01fU0laRQkJCQkJCQkJMHg0MDAKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKyNkZWZpbmUgRUVQUk9NX0JJTl9GSUxFX05BTUUgICIvZXRjL1dpcmVsZXNzL1JUMjg3MFNUQS9lMnAuYmluIgorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworI2VuZGlmIC8vIFJUMjg3MCAvLworI2Vsc2UgLy8gIVVDT1MgLy8KKyNkZWZpbmUgZkFURV9MT0FEX0VFUFJPTQkJCQkJCTB4MEM0MworI2lmZGVmIENPTkZJR19QUklOVEsKK2V4dGVybiBJTlQgQ29uc29sZVJlc3BvbnNlKElOIFBVQ0hBUiBidWZmKTsKK2V4dGVybiBpbnQgKCpyZW1vdGVfZGlzcGxheSkoY2hhciAqKTsKK2V4dGVybiB2b2lkIHB1dHMgKGNvbnN0IGNoYXIgKnMpOworCisvKiBzcGVjaWZpY2x5IGRlZmluZWQgdG8gcmVkaXJlY3QgYW5kIHNob3cgYXRlLXJlbGF0ZWQgbWVzc2FnZXMgdG8gaG9zdC4gKi8KKy8qIFRyeSB0byBkZWZpbmUgYXRlX3ByaW50IGFzIGEgbWFjcm8uICovCisjZGVmaW5lIGF0ZV9wcmludChmbXQsIGFyZ3MuLi4pICAgICAgICAgICAgICAgICBcCitkb3sgICBpbnQgKCpvcmdfcmVtb3RlX2Rpc3BsYXkpKGNoYXIgKikgPSBOVUxMOyAgIFwKKwlvcmdfcmVtb3RlX2Rpc3BsYXkgPSByZW1vdGVfZGlzcGxheTtcCisJLyogU2F2ZSBvcmlnaW5hbCAicmVtb3RlX2Rpc3BsYXkiICovXAorCXJlbW90ZV9kaXNwbGF5ID0gKGludCAoKikoY2hhciAqKSlDb25zb2xlUmVzcG9uc2U7ICAgICAgICAgICBcCisJcHJpbnRrKGZtdCwgIyMgYXJncyk7ICAgICAgICAgICAgICAgICAgICAgICBcCisJLyogUmVzdG9yZSB0aGUgcmVtb3RlX2Rpc3BsYXkgZnVuY3Rpb24gcG9pbnRlciAqLyAgICAgICAgXAorCXJlbW90ZV9kaXNwbGF5ID0gb3JnX3JlbW90ZV9kaXNwbGF5OyB9d2hpbGUoMCkKKworI2RlZmluZSBBVEVEQkdQUklOVChMZXZlbCwgRm10KSAgICAJXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICgoTGV2ZWwpIDw9IFJURGVidWdMZXZlbCkgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGF0ZV9wcmludCBGbXQ7CQkJCQlcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisjZW5kaWYgLy8gQ09ORklHX1BSSU5USyAvLworI2VuZGlmIC8vICFVQ09TIC8vCisKKyNkZWZpbmUgQVRFX09OKF9wKSAgICAgICAgICAgICAgKCgoX3ApLT5hdGUuTW9kZSkgIT0gQVRFX1NUT1ApCisKKy8qIFJUMjg4MF9pTklDIHdpbGwgZGVmaW5lICJSVDI4NjAiLiAqLworCisvKiBSVDI4ODBfaU5JQyB3aWxsIGRlZmluZSBSVDI4NjAuICovCisKKyNpZmRlZiBSVDI4NzAKKyNkZWZpbmUgRUVQUk9NX1NJWkUJCQkJCQkJCTB4NDAwCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisjZGVmaW5lIEVFUFJPTV9CSU5fRklMRV9OQU1FICAiL2V0Yy9XaXJlbGVzcy9SVDI4NzBTVEEvZTJwLmJpbiIKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKyNlbmRpZiAvLyBSVDI4NzAgLy8KKworI2lmZGVmIFJUMjg3MAorI2RlZmluZSBBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChfQSwgX0ksIF9wVikgICAgUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKF9BLCBfSSwgX3BWKQorI2RlZmluZSBBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQoX0EsIF9JLCBfVikgICAgUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChfQSwgX0ksIF9WKQorCisjZGVmaW5lIEJVTEtfT1VUX0xPQ0socExvY2ssIElycUZsYWdzKQlcCisJCWlmKDEgLyohKGluX2ludGVycnVwdCgpICYgMHhmZmZmMDAwMCkqLykJXAorCQkJUlRNUF9JUlFfTE9DSygocExvY2spLCBJcnFGbGFncyk7CisKKyNkZWZpbmUgQlVMS19PVVRfVU5MT0NLKHBMb2NrLCBJcnFGbGFncykJXAorCQlpZigxIC8qIShpbl9pbnRlcnJ1cHQoKSAmIDB4ZmZmZjAwMDApKi8pCVwKKwkJCVJUTVBfSVJRX1VOTE9DSygocExvY2spLCBJcnFGbGFncyk7CisKKy8vIFByb3RvdHlwZXMgb2YgY29tcGxldGlvbiBmdW51Yy4KKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkKKyNkZWZpbmUgQVRFX1JUVVNCQnVsa091dERhdGFQYWNrZXRDb21wbGV0ZShwdXJiLCBwdF9yZWdzKSAgICBBVEVfUlRVU0JCdWxrT3V0RGF0YVBhY2tldENvbXBsZXRlKHB1cmIpCisjZW5kaWYKKworVk9JRCBBVEVfUlRVU0JCdWxrT3V0RGF0YVBhY2tldENvbXBsZXRlKAorCUlOIHB1cmJiX3QgcHVyYiwKKwlPVVQgc3RydWN0IHB0X3JlZ3MgKnB0X3JlZ3MpOworCitWT0lEIEFURV9SVFVTQkJ1bGtPdXREYXRhUGFja2V0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVDSEFSCQkJQnVsa091dFBpcGVJZCk7CisKK1ZPSUQgQVRFX1JUVVNCQ2FuY2VsUGVuZGluZ0J1bGtJbklSUCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCk7CisjZW5kaWYgLy8gUlQyODcwIC8vCisKK1ZPSUQgcnRfZWVfcmVhZF9hbGwoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJT1VUIFVTSE9SVCAqRGF0YSk7CisKKworVk9JRCBydF9lZV93cml0ZV9hbGwoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFVTSE9SVCAqRGF0YSk7CisKK0lOVCBTZXRfQVRFX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UCVNldF9BVEVfREFfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQJU2V0X0FURV9TQV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVAlTZXRfQVRFX0JTU0lEX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UCVNldF9BVEVfQ0hBTk5FTF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVAlTZXRfQVRFX1RYX1BPV0VSMF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVAlTZXRfQVRFX1RYX1BPV0VSMV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVAlTZXRfQVRFX1RYX0FudGVubmFfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQJU2V0X0FURV9SWF9BbnRlbm5hX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UCVNldF9BVEVfVFhfRlJFUU9GRlNFVF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVAlTZXRfQVRFX1RYX0JXX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UCVNldF9BVEVfVFhfTEVOR1RIX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UCVNldF9BVEVfVFhfQ09VTlRfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQJU2V0X0FURV9UWF9NQ1NfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQJU2V0X0FURV9UWF9NT0RFX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UCVNldF9BVEVfVFhfR0lfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCisKK0lOVAlTZXRfQVRFX1JYX0ZFUl9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVCBTZXRfQVRFX1JlYWRfUkZfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQgU2V0X0FURV9Xcml0ZV9SRjFfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQgU2V0X0FURV9Xcml0ZV9SRjJfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQgU2V0X0FURV9Xcml0ZV9SRjNfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQgU2V0X0FURV9Xcml0ZV9SRjRfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQgU2V0X0FURV9Mb2FkX0UyUF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVCBTZXRfQVRFX1JlYWRfRTJQX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UCVNldF9BVEVfU2hvd19Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVAlTZXRfQVRFX0hlbHBfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCisjaWZkZWYgUkFMSU5LX0FURQorI2lmZGVmIFJBTElOS18yOHh4X1FBCitWT0lEIEFURV9RQV9TdGF0aXN0aWNzKAorCUlOIFBSVE1QX0FEQVBURVIJCXBBZCwKKwlJTiBQUlhXSV9TVFJVQwkJCXBSeFdJLAorCUlOIFBSVDI4WFhfUlhEX1NUUlVDICAgIHAyOHh4UnhELAorCUlOIFBIRUFERVJfODAyXzExCQlwSGVhZGVyKTsKKworVk9JRCBSdG1wRG9BdGUoCisJSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKKwlJTglzdHJ1Y3QgaXdyZXEJKndycSk7CisKK1ZPSUQgQnViYmxlU29ydCgKKwlJTiAgSU5UMzIgbiwKKwlJTiAgSU5UMzIgYVtdKTsKKworVk9JRCBDYWxOb2lzZUxldmVsKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisJSU4gIFVDSEFSICAgICAgICAgICBjaGFubmVsLAorCU9VVCBJTlQzMiAgICAgICAgICAgYnVmZmVyWzNdWzEwXSk7CisKK0JPT0xFQU4gU3luY1R4UnhDb25maWcoCisJSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKKwlJTglVU0hPUlQJCQlvZmZzZXQsCisJSU4JVUNIQVIJCQl2YWx1ZSk7CisKKyNpZiAwCitJTlQgU2V0X1R4U3RhcnRfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworI2VuZGlmICAvLyAwIC8vCisKK0lOVCBTZXRfVHhTdG9wX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UIFNldF9SeFN0b3BfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCisjaWYgMAorSU5UIFNldF9FRVJlYWRfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQgU2V0X0VFV3JpdGVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQgU2V0X0JCUFJlYWRfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQgU2V0X0JCUFdyaXRlX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UIFNldF9SRldyaXRlX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKyNlbmRpZiAvLyBlbmQgb2YgI2lmIDAgLy8KKyNlbmRpZiAvLyBSQUxJTktfMjh4eF9RQSAvLworI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKworVk9JRCBBVEVBc2ljU3dpdGNoQ2hhbm5lbCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK1ZPSUQgQVRFQXNpY0FkanVzdFR4UG93ZXIoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpOworCitWT0lEIEFURURpc2FibGVBc2ljUHJvdGVjdCgKKwlJTgkJUFJUTVBfQURBUFRFUglwQWQpOworCitDSEFSIEFURUNvbnZlcnRUb1Jzc2koCisJSU4gUFJUTVBfQURBUFRFUiAgcEFkLAorCUlOIENIQVIJCQkJUnNzaSwKKwlJTiBVQ0hBUiAgICBSc3NpTnVtYmVyKTsKKworVk9JRCBBVEVTYW1wbGVSc3NpKAorCUlOIFBSVE1QX0FEQVBURVIJcEFkLAorCUlOIFBSWFdJX1NUUlVDCQlwUnhXSSk7CisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorVk9JRCBSVE1QU3RhdGlvblN0b3AoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitWT0lEIFJUTVBTdGF0aW9uU3RhcnQoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworI2VuZGlmIC8vIF9fQVRFX0hfXyAvLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9ydF9jb25maWcuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvcnRfY29uZmlnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTNmZTI2NAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvcnRfY29uZmlnLmgKQEAgLTAsMCArMSwxMDQgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJTW9kdWxlIE5hbWU6CisJcnRfY29uZmlnLmgKKworCUFic3RyYWN0OgorCUNlbnRyYWwgaGVhZGVyIGZpbGUgdG8gbWFpbnRhaW4gYWxsIGluY2x1ZGUgZmlsZXMgZm9yIGFsbCBORElTCisJbWluaXBvcnQgZHJpdmVyIHJvdXRpbmVzLgorCisJUmV2aXNpb24gSGlzdG9yeToKKwlXaG8gICAgICAgICBXaGVuICAgICAgICAgIFdoYXQKKwktLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlQYXVsIExpbiAgICAwOC0wMS0yMDAyICAgIGNyZWF0ZWQKKworKi8KKyNpZm5kZWYJX19SVF9DT05GSUdfSF9fCisjZGVmaW5lCV9fUlRfQ09ORklHX0hfXworCisjaW5jbHVkZSAgICAicnRtcF90eXBlLmgiCisjaWZkZWYgVUNPUworI2luY2x1ZGUgImluY2x1ZGVzLmgiCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIAkicnRfdWNvcy5oIgorI2VuZGlmCisKKyNpZmRlZiBMSU5VWAorI2luY2x1ZGUJInJ0X2xpbnV4LmgiCisjZW5kaWYKKyNpbmNsdWRlICAgICJydG1wX2RlZi5oIgorI2luY2x1ZGUgICAgInJ0Mjh4eC5oIgorCisKKyNpZmRlZiBSVDI4NzAKKyNpbmNsdWRlCSJydDI4NzAuaCIKKyNlbmRpZiAvLyBSVDI4NzAgLy8KKworI2luY2x1ZGUgICAgIm9pZC5oIgorI2luY2x1ZGUgICAgIm1sbWUuaCIKKyNpbmNsdWRlICAgICJ3cGEuaCIKKyNpbmNsdWRlICAgICJtZDUuaCIKKyNpbmNsdWRlICAgICJydG1wLmgiCisjaW5jbHVkZQkiYXAuaCIKKyNpbmNsdWRlCSJkZnMuaCIKKyNpbmNsdWRlCSJjaGxpc3QuaCIKKyNpbmNsdWRlCSJzcGVjdHJ1bS5oIgorCisKKyNpZmRlZiBMRUFQX1NVUFBPUlQKKyNpbmNsdWRlICAgICJsZWFwLmgiCisjZW5kaWYgLy8gTEVBUF9TVVBQT1JUIC8vCisKKyNpZmRlZiBCTE9DS19ORVRfSUYKKyNpbmNsdWRlICJuZXRpZl9ibG9jay5oIgorI2VuZGlmIC8vIEJMT0NLX05FVF9JRiAvLworCisjaWZkZWYgSUdNUF9TTk9PUF9TVVBQT1JUCisjaW5jbHVkZSAiaWdtcF9zbm9vcC5oIgorI2VuZGlmIC8vIElHTVBfU05PT1BfU1VQUE9SVCAvLworCisjaWZkZWYgUkFMSU5LX0FURQorI2luY2x1ZGUgInJ0X2F0ZS5oIgorI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKworCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKyNpZmRlZiBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorI2lmbmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisjZXJyb3IgIkJ1aWxkIGZvciBiZWluZyBjb250cm9sbGVkIGJ5IE5ldHdvcmtNYW5hZ2VyIG9yIHdleHQsIHBsZWFzZSBzZXQgSEFTX1dQQV9TVVBQTElDQU5UPXkgYW5kIEhBU19OQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVD15IgorI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKyNlbmRpZiAvLyBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKyNpZmRlZiBJS0FOT1NfVlhfMVgwCisjaW5jbHVkZQkidnJfaWthbnMuaCIKKyNlbmRpZiAvLyBJS0FOT1NfVlhfMVgwIC8vCisKKyNlbmRpZgkvLyBfX1JUX0NPTkZJR19IX18KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9ydF9saW51eC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9ydF9saW51eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5MmUzZDEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3J0X2xpbnV4LmMKQEAgLTAsMCArMSwxMDk1IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisjaW5jbHVkZSAicnRfY29uZmlnLmgiCisKK1VMT05HCVJURGVidWdMZXZlbCA9IFJUX0RFQlVHX0VSUk9SOworCitCVUlMRF9USU1FUl9GVU5DVElPTihNbG1lUGVyaW9kaWNFeGVjKTsKKy8vQlVJTERfVElNRVJfRlVOQ1RJT04oTWxtZVJzc2lSZXBvcnRFeGVjKTsKK0JVSUxEX1RJTUVSX0ZVTkNUSU9OKEFzaWNSeEFudEV2YWxUaW1lb3V0KTsKK0JVSUxEX1RJTUVSX0ZVTkNUSU9OKEFQU0RQZXJpb2RpY0V4ZWMpOworQlVJTERfVElNRVJfRlVOQ1RJT04oQXNpY1JmVHVuaW5nRXhlYyk7CisjaWZkZWYgUlQyODcwCitCVUlMRF9USU1FUl9GVU5DVElPTihCZWFjb25VcGRhdGVFeGVjKTsKKyNlbmRpZiAvLyBSVDI4NzAgLy8KKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCitCVUlMRF9USU1FUl9GVU5DVElPTihCZWFjb25UaW1lb3V0KTsKK0JVSUxEX1RJTUVSX0ZVTkNUSU9OKFNjYW5UaW1lb3V0KTsKK0JVSUxEX1RJTUVSX0ZVTkNUSU9OKEF1dGhUaW1lb3V0KTsKK0JVSUxEX1RJTUVSX0ZVTkNUSU9OKEFzc29jVGltZW91dCk7CitCVUlMRF9USU1FUl9GVU5DVElPTihSZWFzc29jVGltZW91dCk7CitCVUlMRF9USU1FUl9GVU5DVElPTihEaXNhc3NvY1RpbWVvdXQpOworQlVJTERfVElNRVJfRlVOQ1RJT04oTGlua0Rvd25FeGVjKTsKKyNpZmRlZiBMRUFQX1NVUFBPUlQKK0JVSUxEX1RJTUVSX0ZVTkNUSU9OKExlYXBBdXRoVGltZW91dCk7CisjZW5kaWYKK0JVSUxEX1RJTUVSX0ZVTkNUSU9OKFN0YVF1aWNrUmVzcG9uZUZvclJhdGVVcEV4ZWMpOworQlVJTERfVElNRVJfRlVOQ1RJT04oV3BhRGlzYXNzb2NBcEFuZEJsb2NrQXNzb2MpOworI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorQlVJTERfVElNRVJfRlVOQ1RJT04oRGxzVGltZW91dEFjdGlvbik7CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKy8vIGZvciB3aXJlbGVzcyBzeXN0ZW0gZXZlbnQgbWVzc2FnZQorY2hhciBjb25zdCAqcFdpcmVsZXNzU3lzRXZlbnRUZXh0W0lXX1NZU19FVkVOVF9UWVBFX05VTV0gPSB7CisJLy8gc3lzdGVtIHN0YXR1cyBldmVudAorICAgICJoYWQgYXNzb2NpYXRlZCBzdWNjZXNzZnVsbHkiLAkJCQkJCQkvKiBJV19BU1NPQ19FVkVOVF9GTEFHICovCisgICAgImhhZCBkaXNhc3NvY2lhdGVkIiwJCQkJCQkJCQkvKiBJV19ESVNBU1NPQ19FVkVOVF9GTEFHICovCisgICAgImhhZCBkZWF1dGhlbnRpY2F0ZWQiLAkJCQkJCQkJCS8qIElXX0RFQVVUSF9FVkVOVF9GTEFHICovCisgICAgImhhZCBiZWVuIGFnZWQtb3V0IGFuZCBkaXNhc3NvY2lhdGVkIiwJCQkJCS8qIElXX0FHRU9VVF9FVkVOVF9GTEFHICovCisgICAgIm9jY3VycmVkIENvdW50ZXJNZWFzdXJlcyBhdHRhY2siLAkJCQkJCS8qIElXX0NPVU5URVJfTUVBU1VSRVNfRVZFTlRfRkxBRyAqLworICAgICJvY2N1cnJlZCByZXBsYXkgY291bnRlciBkaWZmZXJlbnQgaW4gS2V5IEhhbmRzaGFraW5nIiwJLyogSVdfUkVQTEFZX0NPVU5URVJfRElGRl9FVkVOVF9GTEFHICovCisgICAgIm9jY3VycmVkIFJTTklFIGRpZmZlcmVudCBpbiBLZXkgSGFuZHNoYWtpbmciLAkJCS8qIElXX1JTTklFX0RJRkZfRVZFTlRfRkxBRyAqLworICAgICJvY2N1cnJlZCBNSUMgZGlmZmVyZW50IGluIEtleSBIYW5kc2hha2luZyIsCQkJLyogSVdfTUlDX0RJRkZfRVZFTlRfRkxBRyAqLworICAgICJvY2N1cnJlZCBJQ1YgZXJyb3IgaW4gUlgiLAkJCQkJCQkJLyogSVdfSUNWX0VSUk9SX0VWRU5UX0ZMQUcgKi8KKyAgICAib2NjdXJyZWQgTUlDIGVycm9yIGluIFJYIiwJCQkJCQkJCS8qIElXX01JQ19FUlJPUl9FVkVOVF9GTEFHICovCisJIkdyb3VwIEtleSBIYW5kc2hha2luZyB0aW1lb3V0IiwJCQkJCQkvKiBJV19HUk9VUF9IU19USU1FT1VUX0VWRU5UX0ZMQUcgKi8KKwkiUGFpcndpc2UgS2V5IEhhbmRzaGFraW5nIHRpbWVvdXQiLAkJCQkJCS8qIElXX1BBSVJXSVNFX0hTX1RJTUVPVVRfRVZFTlRfRkxBRyAqLworCSJSU04gSUUgc2FuaXR5IGNoZWNrIGZhaWx1cmUiLAkJCQkJCQkvKiBJV19SU05JRV9TQU5JVFlfRkFJTF9FVkVOVF9GTEFHICovCisJInNldCBrZXkgZG9uZSBpbiBXUEEvV1BBUFNLIiwJCQkJCQkJLyogSVdfU0VUX0tFWV9ET05FX1dQQTFfRVZFTlRfRkxBRyAqLworCSJzZXQga2V5IGRvbmUgaW4gV1BBMi9XUEEyUFNLIiwgICAgICAgICAgICAgICAgICAgICAgICAgLyogSVdfU0VUX0tFWV9ET05FX1dQQTJfRVZFTlRfRkxBRyAqLworCSJjb25uZWN0cyB3aXRoIG91ciB3aXJlbGVzcyBjbGllbnQiLCAgICAgICAgICAgICAgICAgICAgLyogSVdfU1RBX0xJTktVUF9FVkVOVF9GTEFHICovCisJImRpc2Nvbm5lY3RzIHdpdGggb3VyIHdpcmVsZXNzIGNsaWVudCIsICAgICAgICAgICAgICAgICAvKiBJV19TVEFfTElOS0RPV05fRVZFTlRfRkxBRyAqLworCSJzY2FuIGNvbXBsZXRlZCIJCQkJCQkJCQkJLyogSVdfU0NBTl9DT01QTEVURURfRVZFTlRfRkxBRyAqLworCSJzY2FuIHRlcm1pbmF0ZSEhIEJ1c3khISBFbnF1ZXVlIGZhaWwhISIJCQkJLyogSVdfU0NBTl9FTlFVRVVFX0ZBSUxfRVZFTlRfRkxBRyAqLworCX07CisKKy8vIGZvciB3aXJlbGVzcyBJRFNfc3Bvb2ZfYXR0YWNrIGV2ZW50IG1lc3NhZ2UKK2NoYXIgY29uc3QgKnBXaXJlbGVzc1Nwb29mRXZlbnRUZXh0W0lXX1NQT09GX0VWRU5UX1RZUEVfTlVNXSA9IHsKKyAgICAiZGV0ZWN0ZWQgY29uZmxpY3QgU1NJRCIsCQkJCQkJCQkvKiBJV19DT05GTElDVF9TU0lEX0VWRU5UX0ZMQUcgKi8KKyAgICAiZGV0ZWN0ZWQgc3Bvb2ZlZCBhc3NvY2lhdGlvbiByZXNwb25zZSIsCQkJCS8qIElXX1NQT09GX0FTU09DX1JFU1BfRVZFTlRfRkxBRyAqLworICAgICJkZXRlY3RlZCBzcG9vZmVkIHJlYXNzb2NpYXRpb24gcmVzcG9uc2VzIiwJCQkJLyogSVdfU1BPT0ZfUkVBU1NPQ19SRVNQX0VWRU5UX0ZMQUcgKi8KKyAgICAiZGV0ZWN0ZWQgc3Bvb2ZlZCBwcm9iZSByZXNwb25zZSIsCQkJCQkJLyogSVdfU1BPT0ZfUFJPQkVfUkVTUF9FVkVOVF9GTEFHICovCisgICAgImRldGVjdGVkIHNwb29mZWQgYmVhY29uIiwJCQkJCQkJCS8qIElXX1NQT09GX0JFQUNPTl9FVkVOVF9GTEFHICovCisgICAgImRldGVjdGVkIHNwb29mZWQgZGlzYXNzb2NpYXRpb24iLAkJCQkJCS8qIElXX1NQT09GX0RJU0FTU09DX0VWRU5UX0ZMQUcgKi8KKyAgICAiZGV0ZWN0ZWQgc3Bvb2ZlZCBhdXRoZW50aWNhdGlvbiIsCQkJCQkJLyogSVdfU1BPT0ZfQVVUSF9FVkVOVF9GTEFHICovCisgICAgImRldGVjdGVkIHNwb29mZWQgZGVhdXRoZW50aWNhdGlvbiIsCQkJCQkvKiBJV19TUE9PRl9ERUFVVEhfRVZFTlRfRkxBRyAqLworICAgICJkZXRlY3RlZCBzcG9vZmVkIHVua25vd24gbWFuYWdlbWVudCBmcmFtZSIsCQkJLyogSVdfU1BPT0ZfVU5LTk9XTl9NR01UX0VWRU5UX0ZMQUcgKi8KKwkiZGV0ZWN0ZWQgcmVwbGF5IGF0dGFjayIJCQkJCQkJCS8qIElXX1JFUExBWV9BVFRBQ0tfRVZFTlRfRkxBRyAqLworCX07CisKKy8vIGZvciB3aXJlbGVzcyBJRFNfZmxvb2RpbmdfYXR0YWNrIGV2ZW50IG1lc3NhZ2UKK2NoYXIgY29uc3QgKnBXaXJlbGVzc0Zsb29kRXZlbnRUZXh0W0lXX0ZMT09EX0VWRU5UX1RZUEVfTlVNXSA9IHsKKwkiZGV0ZWN0ZWQgYXV0aGVudGljYXRpb24gZmxvb2RpbmciLAkJCQkJCS8qIElXX0ZMT09EX0FVVEhfRVZFTlRfRkxBRyAqLworICAgICJkZXRlY3RlZCBhc3NvY2lhdGlvbiByZXF1ZXN0IGZsb29kaW5nIiwJCQkJLyogSVdfRkxPT0RfQVNTT0NfUkVRX0VWRU5UX0ZMQUcgKi8KKyAgICAiZGV0ZWN0ZWQgcmVhc3NvY2lhdGlvbiByZXF1ZXN0IGZsb29kaW5nIiwJCQkJLyogSVdfRkxPT0RfUkVBU1NPQ19SRVFfRVZFTlRfRkxBRyAqLworICAgICJkZXRlY3RlZCBwcm9iZSByZXF1ZXN0IGZsb29kaW5nIiwJCQkJCQkvKiBJV19GTE9PRF9QUk9CRV9SRVFfRVZFTlRfRkxBRyAqLworICAgICJkZXRlY3RlZCBkaXNhc3NvY2lhdGlvbiBmbG9vZGluZyIsCQkJCQkJLyogSVdfRkxPT0RfRElTQVNTT0NfRVZFTlRfRkxBRyAqLworICAgICJkZXRlY3RlZCBkZWF1dGhlbnRpY2F0aW9uIGZsb29kaW5nIiwJCQkJCS8qIElXX0ZMT09EX0RFQVVUSF9FVkVOVF9GTEFHICovCisgICAgImRldGVjdGVkIDgwMi4xeCBlYXAtcmVxdWVzdCBmbG9vZGluZyIJCQkJCS8qIElXX0ZMT09EX0VBUF9SRVFfRVZFTlRfRkxBRyAqLworCX07CisKKy8qIHRpbWVvdXQgLS0gbXMgKi8KK1ZPSUQgUlRNUF9TZXRQZXJpb2RpY1RpbWVyKAorCUlOCU5ESVNfTUlOSVBPUlRfVElNRVIgKnBUaW1lciwKKwlJTgl1bnNpZ25lZCBsb25nIHRpbWVvdXQpCit7CisJdGltZW91dCA9ICgodGltZW91dCpIWikgLyAxMDAwKTsKKwlwVGltZXItPmV4cGlyZXMgPSBqaWZmaWVzICsgdGltZW91dDsKKwlhZGRfdGltZXIocFRpbWVyKTsKK30KKworLyogY29udmVydCBOZGlzTUluaXRpYWxpemVUaW1lciAtLT4gUlRNUF9PU19Jbml0X1RpbWVyICovCitWT0lEIFJUTVBfT1NfSW5pdF9UaW1lcigKKwlJTglQUlRNUF9BREFQVEVSIHBBZCwKKwlJTglORElTX01JTklQT1JUX1RJTUVSICpwVGltZXIsCisJSU4JVElNRVJfRlVOQ1RJT04gZnVuY3Rpb24sCisJSU4JUFZPSUQgZGF0YSkKK3sKKwlpbml0X3RpbWVyKHBUaW1lcik7CisgICAgcFRpbWVyLT5kYXRhID0gKHVuc2lnbmVkIGxvbmcpZGF0YTsKKyAgICBwVGltZXItPmZ1bmN0aW9uID0gZnVuY3Rpb247Cit9CisKKworVk9JRCBSVE1QX09TX0FkZF9UaW1lcigKKwlJTglORElTX01JTklQT1JUX1RJTUVSCQkqcFRpbWVyLAorCUlOCXVuc2lnbmVkIGxvbmcgdGltZW91dCkKK3sKKwlpZiAodGltZXJfcGVuZGluZyhwVGltZXIpKQorCQlyZXR1cm47CisKKwl0aW1lb3V0ID0gKCh0aW1lb3V0KkhaKSAvIDEwMDApOworCXBUaW1lci0+ZXhwaXJlcyA9IGppZmZpZXMgKyB0aW1lb3V0OworCWFkZF90aW1lcihwVGltZXIpOworfQorCitWT0lEIFJUTVBfT1NfTW9kX1RpbWVyKAorCUlOCU5ESVNfTUlOSVBPUlRfVElNRVIJCSpwVGltZXIsCisJSU4JdW5zaWduZWQgbG9uZyB0aW1lb3V0KQoreworCXRpbWVvdXQgPSAoKHRpbWVvdXQqSFopIC8gMTAwMCk7CisJbW9kX3RpbWVyKHBUaW1lciwgamlmZmllcyArIHRpbWVvdXQpOworfQorCitWT0lEIFJUTVBfT1NfRGVsX1RpbWVyKAorCUlOCU5ESVNfTUlOSVBPUlRfVElNRVIJCSpwVGltZXIsCisJT1VUCUJPT0xFQU4JCQkJCSpwQ2FuY2VsbGVkKQoreworCWlmICh0aW1lcl9wZW5kaW5nKHBUaW1lcikpCisJeworCQkqcENhbmNlbGxlZCA9IGRlbF90aW1lcl9zeW5jKHBUaW1lcik7CisJfQorCWVsc2UKKwl7CisJCSpwQ2FuY2VsbGVkID0gVFJVRTsKKwl9CisKK30KKworVk9JRCBSVE1QX09TX1JlbGVhc2VfUGFja2V0KAorCUlOCVBSVE1QX0FEQVBURVIgcEFkLAorCUlOCVBRVUVVRV9FTlRSWSAgcEVudHJ5KQoreworCS8vUlRNUEZyZWVOZGlzUGFja2V0KHBBZCwgKHN0cnVjdCBza19idWZmICopcEVudHJ5KTsKK30KKworLy8gVW5pZnkgYWxsIGRlbGF5IHJvdXRpbmUgYnkgdXNpbmcgdWRlbGF5CitWT0lEIFJUTVB1c2VjRGVsYXkoCisJSU4JVUxPTkcJdXNlYykKK3sKKwlVTE9ORwlpOworCisJZm9yIChpID0gMDsgaSA8ICh1c2VjIC8gNTApOyBpKyspCisJCXVkZWxheSg1MCk7CisKKwlpZiAodXNlYyAlIDUwKQorCQl1ZGVsYXkodXNlYyAlIDUwKTsKK30KKwordm9pZCBSVE1QX0dldEN1cnJlbnRTeXN0ZW1UaW1lKExBUkdFX0lOVEVHRVIgKnRpbWUpCit7CisJdGltZS0+dS5Mb3dQYXJ0ID0gamlmZmllczsKK30KKworLy8gcEFkIE1VU1QgYWxsb3cgdG8gYmUgTlVMTAorTkRJU19TVEFUVVMgb3NfYWxsb2NfbWVtKAorCUlOCVBSVE1QX0FEQVBURVIgcEFkLAorCU9VVAlQVUNIQVIgKm1lbSwKKwlJTglVTE9ORyAgc2l6ZSkKK3sKKwkqbWVtID0gKFBVQ0hBUikga21hbGxvYyhzaXplLCBHRlBfQVRPTUlDKTsKKwlpZiAoKm1lbSkKKwkJcmV0dXJuIChORElTX1NUQVRVU19TVUNDRVNTKTsKKwllbHNlCisJCXJldHVybiAoTkRJU19TVEFUVVNfRkFJTFVSRSk7Cit9CisKKy8vIHBBZCBNVVNUIGFsbG93IHRvIGJlIE5VTEwKK05ESVNfU1RBVFVTIG9zX2ZyZWVfbWVtKAorCUlOCVBSVE1QX0FEQVBURVIgcEFkLAorCUlOCVBVQ0hBUiBtZW0pCit7CisKKwlBU1NFUlQobWVtKTsKKwlrZnJlZShtZW0pOworCXJldHVybiAoTkRJU19TVEFUVVNfU1VDQ0VTUyk7Cit9CisKKworUE5ESVNfUEFDS0VUIFJUTVBfQWxsb2NhdGVGcmFnUGFja2V0QnVmZmVyKAorCUlOCVBSVE1QX0FEQVBURVIgcEFkLAorCUlOCVVMT05HCUxlbmd0aCkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqcGt0OworCisJcGt0ID0gZGV2X2FsbG9jX3NrYihMZW5ndGgpOworCisJaWYgKHBrdCA9PSBOVUxMKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY2FuJ3QgYWxsb2NhdGUgZnJhZyByeCAlbGQgc2l6ZSBwYWNrZXRcbiIsTGVuZ3RoKSk7CisJfQorCisJaWYgKHBrdCkKKwl7CisJCVJUTVBfU0VUX1BBQ0tFVF9TT1VSQ0UoT1NQS1RfVE9fUlRQS1QocGt0KSwgUEtUU1JDX05ESVMpOworCX0KKworCXJldHVybiAoUE5ESVNfUEFDS0VUKSBwa3Q7Cit9CisKKworUE5ESVNfUEFDS0VUIFJUTVBfQWxsb2NhdGVUeFBhY2tldEJ1ZmZlcigKKwlJTglQUlRNUF9BREFQVEVSIHBBZCwKKwlJTglVTE9ORwlMZW5ndGgsCisJSU4JQk9PTEVBTglDYWNoZWQsCisJT1VUCVBWT0lECSpWaXJ0dWFsQWRkcmVzcykKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqcGt0OworCisJcGt0ID0gZGV2X2FsbG9jX3NrYihMZW5ndGgpOworCisJaWYgKHBrdCA9PSBOVUxMKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY2FuJ3QgYWxsb2NhdGUgdHggJWxkIHNpemUgcGFja2V0XG4iLExlbmd0aCkpOworCX0KKworCWlmIChwa3QpCisJeworCQlSVE1QX1NFVF9QQUNLRVRfU09VUkNFKE9TUEtUX1RPX1JUUEtUKHBrdCksIFBLVFNSQ19ORElTKTsKKwkJKlZpcnR1YWxBZGRyZXNzID0gKFBWT0lEKSBwa3QtPmRhdGE7CisJfQorCWVsc2UKKwl7CisJCSpWaXJ0dWFsQWRkcmVzcyA9IChQVk9JRCkgTlVMTDsKKwl9CisKKwlyZXR1cm4gKFBORElTX1BBQ0tFVCkgcGt0OworfQorCisKK1ZPSUQgYnVpbGRfdHhfcGFja2V0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBORElTX1BBQ0tFVAlwUGFja2V0LAorCUlOCVBVQ0hBUglwRnJhbWUsCisJSU4JVUxPTkcJRnJhbWVMZW4pCit7CisKKwlzdHJ1Y3Qgc2tfYnVmZgkqcFR4UGt0OworCisJQVNTRVJUKHBQYWNrZXQpOworCXBUeFBrdCA9IFJUUEtUX1RPX09TUEtUKHBQYWNrZXQpOworCisJTmRpc01vdmVNZW1vcnkoc2tiX3B1dChwVHhQa3QsIEZyYW1lTGVuKSwgcEZyYW1lLCBGcmFtZUxlbik7Cit9CisKK1ZPSUQJUlRNUEZyZWVBZGFwdGVyKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKQoreworICAgIFBPU19DT09LSUUgb3NfY29va2llOworCWludCBpbmRleDsKKworCW9zX2Nvb2tpZT0oUE9TX0NPT0tJRSlwQWQtPk9TX0Nvb2tpZTsKKworCWtmcmVlKHBBZC0+QmVhY29uQnVmKTsKKworCisJTmRpc0ZyZWVTcGluTG9jaygmcEFkLT5NZ210UmluZ0xvY2spOworCisKKwlmb3IgKGluZGV4ID0wIDsgaW5kZXggPCBOVU1fT0ZfVFhfUklORzsgaW5kZXgrKykKKwl7CisgICAgCU5kaXNGcmVlU3BpbkxvY2soJnBBZC0+VHhTd1F1ZXVlTG9ja1tpbmRleF0pOworCQlOZGlzRnJlZVNwaW5Mb2NrKCZwQWQtPkRlUXVldWVMb2NrW2luZGV4XSk7CisJCXBBZC0+RGVRdWV1ZVJ1bm5pbmdbaW5kZXhdID0gRkFMU0U7CisJfQorCisJTmRpc0ZyZWVTcGluTG9jaygmcEFkLT5pcnFfbG9jayk7CisKKworCXZmcmVlKHBBZCk7IC8vIHBjaV9mcmVlX2NvbnNpc3RlbnQob3NfY29va2llLT5wY2lfZGV2LHNpemVvZihSVE1QX0FEQVBURVIpLHBBZCxvc19jb29raWUtPnBBZF9wYSk7CisJa2ZyZWUob3NfY29va2llKTsKK30KKworQk9PTEVBTiBPU19OZWVkX0Nsb25lX1BhY2tldCh2b2lkKQoreworCXJldHVybiAoRkFMU0UpOworfQorCisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCWNsb25lIGFuIGlucHV0IE5ESVMgUEFDS0VUIHRvIGFub3RoZXIgb25lLiBUaGUgbmV3IGludGVybmFsbHkgY3JlYXRlZCBORElTIFBBQ0tFVAorCQltdXN0IGhhdmUgb25seSBvbmUgTkRJUyBCVUZGRVIKKwkJcmV0dXJuIC0gYnl0ZSBjb3BpZWQuIDAgbWVhbnMgY2FuJ3QgY3JlYXRlIE5ESVMgUEFDS0VUCisJCU5PVEU6IGludGVybmFsbHkgY3JlYXRlZCBORElTX1BBQ0tFVCBzaG91bGQgYmUgZGVzdHJveWVkIGJ5IFJUTVBGcmVlTmRpc1BhY2tldAorCisJQXJndW1lbnRzOgorCQlwQWQgCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKwkJcEluc0FNU0RVSGRyCUVXQyBBLU1TRFUgZm9ybWF0IGhhcyBleHRyYSAxNC1ieXRlcyBoZWFkZXIuIGlmIFRSVUUsIGluc2VydCB0aGlzIDE0LWJ5dGUgaGRyIGluIGZyb250IG9mIE1TRFUuCisJCSpwU3JjVG90YWxMZW4JCQlyZXR1cm4gdG90YWwgcGFja2V0IGxlbmd0aC4gVGhpcyBsZW5naHQgaXMgY2FsY3VsYXRlZCB3aXRoIDgwMi4zIGZvcm1hdCBwYWNrZXQuCisKKwlSZXR1cm4gVmFsdWU6CisJCU5ESVNfU1RBVFVTX1NVQ0NFU1MKKwkJTkRJU19TVEFUVVNfRkFJTFVSRQorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK05ESVNfU1RBVFVTIFJUTVBDbG9uZU5kaXNQYWNrZXQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JQk9PTEVBTgkJCXBJbnNBTVNEVUhkciwKKwlJTglQTkRJU19QQUNLRVQJcEluUGFja2V0LAorCU9VVCBQTkRJU19QQUNLRVQgICAqcHBPdXRQYWNrZXQpCit7CisKKwlzdHJ1Y3Qgc2tfYnVmZiAqcGt0OworCisJQVNTRVJUKHBJblBhY2tldCk7CisJQVNTRVJUKHBwT3V0UGFja2V0KTsKKworCS8vIDEuIEFsbG9jYXRlIGEgcGFja2V0CisJcGt0ID0gZGV2X2FsbG9jX3NrYigyMDQ4KTsKKworCWlmIChwa3QgPT0gTlVMTCkKKwl7CisJCXJldHVybiBORElTX1NUQVRVU19GQUlMVVJFOworCX0KKworIAlza2JfcHV0KHBrdCwgR0VUX09TX1BLVF9MRU4ocEluUGFja2V0KSk7CisJTmRpc01vdmVNZW1vcnkocGt0LT5kYXRhLCBHRVRfT1NfUEtUX0RBVEFQVFIocEluUGFja2V0KSwgR0VUX09TX1BLVF9MRU4ocEluUGFja2V0KSk7CisJKnBwT3V0UGFja2V0ID0gT1NQS1RfVE9fUlRQS1QocGt0KTsKKworCisJUlRNUF9TRVRfUEFDS0VUX1NPVVJDRShPU1BLVF9UT19SVFBLVChwa3QpLCBQS1RTUkNfTkRJUyk7CisKKwlwcmludGsoIiMjI0Nsb25lIyMjXG4iKTsKKworCXJldHVybiBORElTX1NUQVRVU19TVUNDRVNTOworfQorCisKKy8vIHRoZSBhbGxvY2F0ZWQgTkRJUyBQQUNLRVQgbXVzdCBiZSBmcmVlZCB2aWEgUlRNUEZyZWVOZGlzUGFja2V0KCkKK05ESVNfU1RBVFVTIFJUTVBBbGxvY2F0ZU5kaXNQYWNrZXQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUIFBORElTX1BBQ0tFVCAgICpwcFBhY2tldCwKKwlJTglQVUNIQVIJCQlwSGVhZGVyLAorCUlOCVVJTlQJCQlIZWFkZXJMZW4sCisJSU4JUFVDSEFSCQkJcERhdGEsCisJSU4JVUlOVAkJCURhdGFMZW4pCit7CisJUE5ESVNfUEFDS0VUCXBQYWNrZXQ7CisJQVNTRVJUKHBEYXRhKTsKKwlBU1NFUlQoRGF0YUxlbik7CisKKwkvLyAxLiBBbGxvY2F0ZSBhIHBhY2tldAorCXBQYWNrZXQgPSAoUE5ESVNfUEFDS0VUICopIGRldl9hbGxvY19za2IoSGVhZGVyTGVuICsgRGF0YUxlbiArIFRYUEFERElOR19TSVpFKTsKKwlpZiAocFBhY2tldCA9PSBOVUxMKQorIAl7CisJCSpwcFBhY2tldCA9IE5VTEw7CisjaWZkZWYgREVCVUcKKwkJcHJpbnRrKCJSVE1QQWxsb2NhdGVOZGlzUGFja2V0IEZhaWxcblxuIik7CisjZW5kaWYKKwkJcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkU7CisJfQorCisJLy8gMi4gY2xvbmUgdGhlIGZyYW1lIGNvbnRlbnQKKwlpZiAoSGVhZGVyTGVuID4gMCkKKwkJTmRpc01vdmVNZW1vcnkoR0VUX09TX1BLVF9EQVRBUFRSKHBQYWNrZXQpLCBwSGVhZGVyLCBIZWFkZXJMZW4pOworCWlmIChEYXRhTGVuID4gMCkKKwkJTmRpc01vdmVNZW1vcnkoR0VUX09TX1BLVF9EQVRBUFRSKHBQYWNrZXQpICsgSGVhZGVyTGVuLCBwRGF0YSwgRGF0YUxlbik7CisKKwkvLyAzLiB1cGRhdGUgbGVuZ3RoIG9mIHBhY2tldAorIAlza2JfcHV0KEdFVF9PU19QS1RfVFlQRShwUGFja2V0KSwgSGVhZGVyTGVuK0RhdGFMZW4pOworCisJUlRNUF9TRVRfUEFDS0VUX1NPVVJDRShwUGFja2V0LCBQS1RTUkNfTkRJUyk7CisvLwlwcmludGsoIiVzIDogcFBhY2tldCA9ICVwLCBsZW4gPSAlZFxuIiwgX19mdW5jX18sIHBQYWNrZXQsIEdFVF9PU19QS1RfTEVOKHBQYWNrZXQpKTsKKwkqcHBQYWNrZXQgPSBwUGFja2V0OworCXJldHVybiBORElTX1NUQVRVU19TVUNDRVNTOworfQorCisvKgorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRGVzY3JpcHRpb246CisJVGhpcyByb3V0aW5lIGZyZWVzIGEgbWluaXBvcnQgaW50ZXJuYWxseSBhbGxvY2F0ZWQgTkRJU19QQUNLRVQgYW5kIGl0cworCWNvcnJlc3BvbmRpbmcgTkRJU19CVUZGRVIgYW5kIGFsbG9jYXRlZCBtZW1vcnkuCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgUlRNUEZyZWVOZGlzUGFja2V0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFBORElTX1BBQ0tFVCAgcFBhY2tldCkKK3sKKwlkZXZfa2ZyZWVfc2tiX2FueShSVFBLVF9UT19PU1BLVChwUGFja2V0KSk7Cit9CisKKworLy8gSVJRTCA9IERJU1BBVENIX0xFVkVMCisvLyBOT1RFOiB3ZSBkbyBoYXZlIGFuIGFzc3VtcHRpb24gaGVyZSwgdGhhdCBCeXRlMCBhbmQgQnl0ZTEgYWx3YXlzIHJlYXNpZCBhdCB0aGUgc2FtZQorLy8JCQkgc2NhdHRlciBnYXRoZXIgYnVmZmVyCitORElTX1NUQVRVUyBTbmlmZjJCeXRlc0Zyb21OZGlzQnVmZmVyKAorCUlOCVBORElTX0JVRkZFUglwRmlyc3RCdWZmZXIsCisJSU4JVUNIQVIJCQlEZXNpcmVkT2Zmc2V0LAorCU9VVCBQVUNIQVIJCQlwQnl0ZTAsCisJT1VUIFBVQ0hBUgkJCXBCeXRlMSkKK3sKKyAgICAqcEJ5dGUwID0gKihQVUNIQVIpKHBGaXJzdEJ1ZmZlciArIERlc2lyZWRPZmZzZXQpOworICAgICpwQnl0ZTEgPSAqKFBVQ0hBUikocEZpcnN0QnVmZmVyICsgRGVzaXJlZE9mZnNldCArIDEpOworCisJcmV0dXJuIE5ESVNfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKwordm9pZCBSVE1QX1F1ZXJ5UGFja2V0SW5mbygKKwlJTiAgUE5ESVNfUEFDS0VUIHBQYWNrZXQsCisJT1VUIFBBQ0tFVF9JTkZPICAqcFBhY2tldEluZm8sCisJT1VUIFBVQ0hBUgkJICpwU3JjQnVmVkEsCisJT1VUCVVJTlQJCSAqcFNyY0J1ZkxlbikKK3sKKwlwUGFja2V0SW5mby0+QnVmZmVyQ291bnQgPSAxOworCXBQYWNrZXRJbmZvLT5wRmlyc3RCdWZmZXIgPSBHRVRfT1NfUEtUX0RBVEFQVFIocFBhY2tldCk7CisJcFBhY2tldEluZm8tPlBoeXNpY2FsQnVmZmVyQ291bnQgPSAxOworCXBQYWNrZXRJbmZvLT5Ub3RhbFBhY2tldExlbmd0aCA9IEdFVF9PU19QS1RfTEVOKHBQYWNrZXQpOworCisJKnBTcmNCdWZWQSA9IEdFVF9PU19QS1RfREFUQVBUUihwUGFja2V0KTsKKwkqcFNyY0J1ZkxlbiA9IEdFVF9PU19QS1RfTEVOKHBQYWNrZXQpOworfQorCit2b2lkIFJUTVBfUXVlcnlOZXh0UGFja2V0SW5mbygKKwlJTiAgUE5ESVNfUEFDS0VUICpwcFBhY2tldCwKKwlPVVQgUEFDS0VUX0lORk8gICpwUGFja2V0SW5mbywKKwlPVVQgUFVDSEFSCQkgKnBTcmNCdWZWQSwKKwlPVVQJVUlOVAkJICpwU3JjQnVmTGVuKQoreworCVBORElTX1BBQ0tFVCBwUGFja2V0ID0gTlVMTDsKKworCWlmICgqcHBQYWNrZXQpCisJCXBQYWNrZXQgPSBHRVRfT1NfUEtUX05FWFQoKnBwUGFja2V0KTsKKworCWlmIChwUGFja2V0KQorCXsKKwkJcFBhY2tldEluZm8tPkJ1ZmZlckNvdW50ID0gMTsKKwkJcFBhY2tldEluZm8tPnBGaXJzdEJ1ZmZlciA9IEdFVF9PU19QS1RfREFUQVBUUihwUGFja2V0KTsKKwkJcFBhY2tldEluZm8tPlBoeXNpY2FsQnVmZmVyQ291bnQgPSAxOworCQlwUGFja2V0SW5mby0+VG90YWxQYWNrZXRMZW5ndGggPSBHRVRfT1NfUEtUX0xFTihwUGFja2V0KTsKKworCQkqcFNyY0J1ZlZBID0gR0VUX09TX1BLVF9EQVRBUFRSKHBQYWNrZXQpOworCQkqcFNyY0J1ZkxlbiA9IEdFVF9PU19QS1RfTEVOKHBQYWNrZXQpOworCQkqcHBQYWNrZXQgPSBHRVRfT1NfUEtUX05FWFQocFBhY2tldCk7CisJfQorCWVsc2UKKwl7CisJCXBQYWNrZXRJbmZvLT5CdWZmZXJDb3VudCA9IDA7CisJCXBQYWNrZXRJbmZvLT5wRmlyc3RCdWZmZXIgPSBOVUxMOworCQlwUGFja2V0SW5mby0+UGh5c2ljYWxCdWZmZXJDb3VudCA9IDA7CisJCXBQYWNrZXRJbmZvLT5Ub3RhbFBhY2tldExlbmd0aCA9IDA7CisKKwkJKnBTcmNCdWZWQSA9IE5VTEw7CisJCSpwU3JjQnVmTGVuID0gMDsKKwkJKnBwUGFja2V0ID0gTlVMTDsKKwl9Cit9CisKKy8vIG5vdCB5ZXQgc3VwcG9ydCBNQlNTCitQTkVUX0RFViBnZXRfbmV0ZGV2X2Zyb21fYnNzaWQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCkKK3sKKyAgICBQTkVUX0RFViBkZXZfcCA9IE5VTEw7CisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJeworCQlkZXZfcCA9IHBBZC0+bmV0X2RldjsKKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlBU1NFUlQoZGV2X3ApOworCXJldHVybiBkZXZfcDsgLyogcmV0dXJuIG9uZSBvZiBNQlNTICovCit9CisKK1BORElTX1BBQ0tFVCBEdXBsaWNhdGVQYWNrZXQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUE5ESVNfUEFDS0VUCXBQYWNrZXQsCisJSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZgkqc2tiOworCVBORElTX1BBQ0tFVAlwUmV0UGFja2V0ID0gTlVMTDsKKwlVU0hPUlQJCQlEYXRhU2l6ZTsKKwlVQ0hBUgkJCSpwRGF0YTsKKworCURhdGFTaXplID0gKFVTSE9SVCkgR0VUX09TX1BLVF9MRU4ocFBhY2tldCk7CisJcERhdGEgPSAoUFVDSEFSKSBHRVRfT1NfUEtUX0RBVEFQVFIocFBhY2tldCk7CisKKworCXNrYiA9IHNrYl9jbG9uZShSVFBLVF9UT19PU1BLVChwUGFja2V0KSwgTUVNX0FMTE9DX0ZMQUcpOworCWlmIChza2IpCisJeworCQlza2ItPmRldiA9IGdldF9uZXRkZXZfZnJvbV9ic3NpZChwQWQsIEZyb21XaGljaEJTU0lEKTsKKwkJcFJldFBhY2tldCA9IE9TUEtUX1RPX1JUUEtUKHNrYik7CisJfQorCisjaWYgMAorCWlmICgoc2tiID0gX19kZXZfYWxsb2Nfc2tiKERhdGFTaXplICsgMiszMiwgTUVNX0FMTE9DX0ZMQUcpKSAhPSBOVUxMKQorCXsKKwkJc2tiX3Jlc2VydmUoc2tiLCAyKzMyKTsKKwkJTmRpc01vdmVNZW1vcnkoc2tiLT50YWlsLCBwRGF0YSwgRGF0YVNpemUpOworCQlza2JfcHV0KHNrYiwgRGF0YVNpemUpOworCQlza2ItPmRldiA9IGdldF9uZXRkZXZfZnJvbV9ic3NpZChwQWQsIEZyb21XaGljaEJTU0lEKTsKKwkJcFJldFBhY2tldCA9IE9TUEtUX1RPX1JUUEtUKHNrYik7CisJfQorI2VuZGlmCisKKwlyZXR1cm4gcFJldFBhY2tldDsKKworfQorCitQTkRJU19QQUNLRVQgZHVwbGljYXRlX3BrdCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlwSGVhZGVyODAyXzMsCisgICAgSU4gIFVJTlQgICAgICAgICAgICBIZHJMZW4sCisJSU4JUFVDSEFSCQkJcERhdGEsCisJSU4JVUxPTkcJCQlEYXRhU2l6ZSwKKwlJTglVQ0hBUgkJCUZyb21XaGljaEJTU0lEKQoreworCXN0cnVjdCBza19idWZmCSpza2I7CisJUE5ESVNfUEFDS0VUCXBQYWNrZXQgPSBOVUxMOworCisKKwlpZiAoKHNrYiA9IF9fZGV2X2FsbG9jX3NrYihIZHJMZW4gKyBEYXRhU2l6ZSArIDIsIE1FTV9BTExPQ19GTEFHKSkgIT0gTlVMTCkKKwl7CisJCXNrYl9yZXNlcnZlKHNrYiwgMik7CisJCU5kaXNNb3ZlTWVtb3J5KHNrYi0+dGFpbCwgcEhlYWRlcjgwMl8zLCBIZHJMZW4pOworCQlza2JfcHV0KHNrYiwgSGRyTGVuKTsKKwkJTmRpc01vdmVNZW1vcnkoc2tiLT50YWlsLCBwRGF0YSwgRGF0YVNpemUpOworCQlza2JfcHV0KHNrYiwgRGF0YVNpemUpOworCQlza2ItPmRldiA9IGdldF9uZXRkZXZfZnJvbV9ic3NpZChwQWQsIEZyb21XaGljaEJTU0lEKTsKKwkJcFBhY2tldCA9IE9TUEtUX1RPX1JUUEtUKHNrYik7CisJfQorCisJcmV0dXJuIHBQYWNrZXQ7Cit9CisKKworI2RlZmluZSBUS0lQX1RYX01JQ19TSVpFCQk4CitQTkRJU19QQUNLRVQgZHVwbGljYXRlX3BrdF93aXRoX1RLSVBfTUlDKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBORElTX1BBQ0tFVAlwUGFja2V0KQoreworCXN0cnVjdCBza19idWZmCSpza2IsICpuZXdza2I7CisKKworCXNrYiA9IFJUUEtUX1RPX09TUEtUKHBQYWNrZXQpOworCWlmIChza2JfdGFpbHJvb20oc2tiKSA8IFRLSVBfVFhfTUlDX1NJWkUpCisJeworCQkvLyBhbGxvYyBhIG5ldyBza2IgYW5kIGNvcHkgdGhlIHBhY2tldAorCQluZXdza2IgPSBza2JfY29weV9leHBhbmQoc2tiLCBza2JfaGVhZHJvb20oc2tiKSwgVEtJUF9UWF9NSUNfU0laRSwgR0ZQX0FUT01JQyk7CisJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJCWlmIChuZXdza2IgPT0gTlVMTCkKKwkJeworCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiRXh0ZW5kIFR4Lk1JQyBmb3IgcGFja2V0IGZhaWxlZCEsIGRyb3BwaW5nIHBhY2tldCFcbiIpKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCXNrYiA9IG5ld3NrYjsKKwl9CisKKwlyZXR1cm4gT1NQS1RfVE9fUlRQS1Qoc2tiKTsKKworI2lmIDAKKwlpZiAoKGRhdGEgPSBza2JfcHV0KHNrYiwgVEtJUF9UWF9NSUNfU0laRSkpICE9IE5VTEwpCisJewkvLyBJZiB3ZSBjYW4gZXh0ZW5kIGl0LCB3ZWxsLCBjb3B5IGl0IGZpcnN0LgorCQlOZGlzTW92ZU1lbW9yeShkYXRhLCBwQWQtPlByaXZhdGVJbmZvLlR4Lk1JQywgVEtJUF9UWF9NSUNfU0laRSk7CisJfQorCWVsc2UKKwl7CisJCS8vIE90aGVyd2lzZSwgY29weSB0aGUgcGFja2V0LgorCQluZXdza2IgPSBza2JfY29weV9leHBhbmQoc2tiLCBza2JfaGVhZHJvb20oc2tiKSwgVEtJUF9UWF9NSUNfU0laRSwgR0ZQX0FUT01JQyk7CisJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJCWlmIChuZXdza2IgPT0gTlVMTCkKKwkJeworCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiRXh0ZW5kIFR4Lk1JQyB0byBwYWNrZXQgZmFpbGVkISwgZHJvcHBpbmcgcGFja2V0XG4iKSk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQlza2IgPSBuZXdza2I7CisKKwkJTmRpc01vdmVNZW1vcnkoc2tiLT50YWlsLCBwQWQtPlByaXZhdGVJbmZvLlR4Lk1JQywgVEtJUF9UWF9NSUNfU0laRSk7CisJCXNrYl9wdXQoc2tiLCBUS0lQX1RYX01JQ19TSVpFKTsKKwl9CisKKwlyZXR1cm4gT1NQS1RfVE9fUlRQS1Qoc2tiKTsKKyNlbmRpZgorCit9CisKKworCisKK1BORElTX1BBQ0tFVCBDbG9uZVBhY2tldCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQTkRJU19QQUNLRVQJcFBhY2tldCwKKwlJTglQVUNIQVIJCQlwRGF0YSwKKwlJTglVTE9ORwkJCURhdGFTaXplKQoreworCXN0cnVjdCBza19idWZmCSpwUnhQa3Q7CisJc3RydWN0IHNrX2J1ZmYJKnBDbG9uZWRQa3Q7CisKKwlBU1NFUlQocFBhY2tldCk7CisJcFJ4UGt0ID0gUlRQS1RfVE9fT1NQS1QocFBhY2tldCk7CisKKwkvLyBjbG9uZSB0aGUgcGFja2V0CisJcENsb25lZFBrdCA9IHNrYl9jbG9uZShwUnhQa3QsIE1FTV9BTExPQ19GTEFHKTsKKworCWlmIChwQ2xvbmVkUGt0KQorCXsKKyAgICAJLy8gc2V0IHRoZSBjb3JyZWN0IGRhdGFwdHIgYW5kIGRhdGEgbGVuCisgICAgCXBDbG9uZWRQa3QtPmRldiA9IHBSeFBrdC0+ZGV2OworICAgIAlwQ2xvbmVkUGt0LT5kYXRhID0gcERhdGE7CisgICAgCXBDbG9uZWRQa3QtPmxlbiA9IERhdGFTaXplOworICAgIAlwQ2xvbmVkUGt0LT50YWlsID0gcENsb25lZFBrdC0+ZGF0YSArIHBDbG9uZWRQa3QtPmxlbjsKKwkJQVNTRVJUKERhdGFTaXplIDwgMTUzMCk7CisJfQorCXJldHVybiBwQ2xvbmVkUGt0OworfQorCisvLworLy8gY2hhbmdlIE9TIHBhY2tldCBEYXRhUHRyIGFuZCBEYXRhTGVuCisvLwordm9pZCAgdXBkYXRlX29zX3BhY2tldF9pbmZvKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVJYX0JMSwkJCSpwUnhCbGssCisJSU4gIFVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpCit7CisJc3RydWN0IHNrX2J1ZmYJKnBPU1BrdDsKKworCUFTU0VSVChwUnhCbGstPnBSeFBhY2tldCk7CisJcE9TUGt0ID0gUlRQS1RfVE9fT1NQS1QocFJ4QmxrLT5wUnhQYWNrZXQpOworCisJcE9TUGt0LT5kZXYgPSBnZXRfbmV0ZGV2X2Zyb21fYnNzaWQocEFkLCBGcm9tV2hpY2hCU1NJRCk7CisJcE9TUGt0LT5kYXRhID0gcFJ4QmxrLT5wRGF0YTsKKwlwT1NQa3QtPmxlbiA9IHBSeEJsay0+RGF0YVNpemU7CisJcE9TUGt0LT50YWlsID0gcE9TUGt0LT5kYXRhICsgcE9TUGt0LT5sZW47Cit9CisKKwordm9pZCB3bGFuXzgwMl8xMV90b184MDJfM19wYWNrZXQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUlhfQkxLCQkJKnBSeEJsaywKKwlJTglQVUNIQVIJCQlwSGVhZGVyODAyXzMsCisJSU4gIFVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpCit7CisJc3RydWN0IHNrX2J1ZmYJKnBPU1BrdDsKKworCUFTU0VSVChwUnhCbGstPnBSeFBhY2tldCk7CisJQVNTRVJUKHBIZWFkZXI4MDJfMyk7CisKKwlwT1NQa3QgPSBSVFBLVF9UT19PU1BLVChwUnhCbGstPnBSeFBhY2tldCk7CisKKwlwT1NQa3QtPmRldiA9IGdldF9uZXRkZXZfZnJvbV9ic3NpZChwQWQsIEZyb21XaGljaEJTU0lEKTsKKwlwT1NQa3QtPmRhdGEgPSBwUnhCbGstPnBEYXRhOworCXBPU1BrdC0+bGVuID0gcFJ4QmxrLT5EYXRhU2l6ZTsKKwlwT1NQa3QtPnRhaWwgPSBwT1NQa3QtPmRhdGEgKyBwT1NQa3QtPmxlbjsKKworCS8vCisJLy8gY29weSA4MDIuMyBoZWFkZXIKKwkvLworCS8vCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQlOZGlzTW92ZU1lbW9yeShza2JfcHVzaChwT1NQa3QsIExFTkdUSF84MDJfMyksIHBIZWFkZXI4MDJfMywgTEVOR1RIXzgwMl8zKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwl9CisKKworCit2b2lkIGFubm91bmNlXzgwMl8zX3BhY2tldCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQTkRJU19QQUNLRVQJcFBhY2tldCkKK3sKKworCXN0cnVjdCBza19idWZmCSpwUnhQa3Q7CisKKwlBU1NFUlQocFBhY2tldCk7CisKKwlwUnhQa3QgPSBSVFBLVF9UT19PU1BLVChwUGFja2V0KTsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisgICAgLyogUHVzaCB1cCB0aGUgcHJvdG9jb2wgc3RhY2sgKi8KKyNpZmRlZiBJS0FOT1NfVlhfMVgwCisJSUtBTk9TX0RhdGFGcmFtZVJ4KHBBZCwgcFJ4UGt0LT5kZXYsIHBSeFBrdCwgcFJ4UGt0LT5sZW4pOworI2Vsc2UKKwlwUnhQa3QtPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMocFJ4UGt0LCBwUnhQa3QtPmRldik7CisKKy8vI2lmZGVmIENPTkZJR181VlRfRU5IQU5DRQorLy8JKihpbnQqKShwUnhQa3QtPmNiKSA9IEJSSURHRV9UQUc7CisvLyNlbmRpZgorCW5ldGlmX3J4KHBSeFBrdCk7CisjZW5kaWYgLy8gSUtBTk9TX1ZYXzFYMCAvLworfQorCisKK1BSVE1QX1NDQVRURVJfR0FUSEVSX0xJU1QKK3J0X2dldF9zZ19saXN0X2Zyb21fcGFja2V0KFBORElTX1BBQ0tFVCBwUGFja2V0LCBSVE1QX1NDQVRURVJfR0FUSEVSX0xJU1QgKnNnKQoreworCXNnLT5OdW1iZXJPZkVsZW1lbnRzID0gMTsKKwlzZy0+RWxlbWVudHNbMF0uQWRkcmVzcyA9ICBHRVRfT1NfUEtUX0RBVEFQVFIocFBhY2tldCk7CisJc2ctPkVsZW1lbnRzWzBdLkxlbmd0aCA9IEdFVF9PU19QS1RfTEVOKHBQYWNrZXQpOworCXJldHVybiAoc2cpOworfQorCit2b2lkIGhleF9kdW1wKGNoYXIgKnN0ciwgdW5zaWduZWQgY2hhciAqcFNyY0J1ZlZBLCB1bnNpZ25lZCBpbnQgU3JjQnVmTGVuKQoreworCXVuc2lnbmVkIGNoYXIgKnB0OworCWludCB4OworCisJaWYgKFJURGVidWdMZXZlbCA8IFJUX0RFQlVHX1RSQUNFKQorCQlyZXR1cm47CisKKwlwdCA9IHBTcmNCdWZWQTsKKwlwcmludGsoIiVzOiAlcCwgbGVuID0gJWRcbiIsc3RyLCAgcFNyY0J1ZlZBLCBTcmNCdWZMZW4pOworCWZvciAoeD0wOyB4PFNyY0J1ZkxlbjsgeCsrKQorCXsKKwkJaWYgKHggJSAxNiA9PSAwKQorCQkJcHJpbnRrKCIweCUwNHggOiAiLCB4KTsKKwkJcHJpbnRrKCIlMDJ4ICIsICgodW5zaWduZWQgY2hhcilwdFt4XSkpOworCQlpZiAoeCUxNiA9PSAxNSkgcHJpbnRrKCJcbiIpOworCX0KKwlwcmludGsoIlxuIik7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlTZW5kIGxvZyBtZXNzYWdlIHRocm91Z2ggd2lyZWxlc3MgZXZlbnQKKworCQlTdXBwb3J0IHN0YW5kYXJkIGl3X2V2ZW50IHdpdGggSVdFVkNVU1RPTS4gSXQgaXMgdXNlZCBiZWxvdy4KKworCQlpd3JlcV9kYXRhLmRhdGEuZmxhZ3MgaXMgdXNlZCB0byBzdG9yZSBldmVudF9mbGFnIHRoYXQgaXMgZGVmaW5lZCBieSB1c2VyLgorCQlpd3JlcV9kYXRhLmRhdGEubGVuZ3RoIGlzIHRoZSBsZW5ndGggb2YgdGhlIGV2ZW50IGxvZy4KKworCQlUaGUgZm9ybWF0IG9mIHRoZSBldmVudCBsb2cgaXMgY29tcG9zZWQgb2YgdGhlIGVudHJ5J3MgTUFDIGFkZHJlc3MgYW5kCisJCXRoZSBkZXNpcmVkIGxvZyBtZXNzYWdlIChyZWZlciB0byBwV2lyZWxlc3NFdmVudFRleHQpLgorCisJCQlleDogMTE6MjI6MzM6NDQ6NTU6NjYgaGFzIGFzc29jaWF0ZWQgc3VjY2Vzc2Z1bGx5CisKKwkJcC5zLiBUaGUgcmVxdWlyZW1lbnQgb2YgV2lyZWxlc3MgRXh0ZW5zaW9uIGlzIHYxNSBvciBuZXdlci4KKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgUlRNUFNlbmRXaXJlbGVzc0V2ZW50KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVTSE9SVAkJCUV2ZW50X2ZsYWcsCisJSU4JUFVDSEFSIAkJCXBBZGRyLAorCUlOCVVDSEFSCQkJQnNzSWR4LAorCUlOCUNIQVIJCQlSc3NpKQoreworI2lmIFdJUkVMRVNTX0VYVCA+PSAxNQorCisJdW5pb24gCWl3cmVxX2RhdGEgICAgICB3cnF1OworCVBVQ0hBUiAJcEJ1ZiA9IE5VTEwsIHBCdWZQdHIgPSBOVUxMOworCVVTSE9SVAlldmVudCwgdHlwZSwgQnVmTGVuOworCVVDSEFSCWV2ZW50X3RhYmxlX2xlbiA9IDA7CisKKwl0eXBlID0gRXZlbnRfZmxhZyAmIDB4RkYwMDsKKwlldmVudCA9IEV2ZW50X2ZsYWcgJiAweDAwRkY7CisKKwlzd2l0Y2ggKHR5cGUpCisJeworCQljYXNlIElXX1NZU19FVkVOVF9GTEFHX1NUQVJUOgorCQkJZXZlbnRfdGFibGVfbGVuID0gSVdfU1lTX0VWRU5UX1RZUEVfTlVNOworCQkJYnJlYWs7CisKKwkJY2FzZSBJV19TUE9PRl9FVkVOVF9GTEFHX1NUQVJUOgorCQkJZXZlbnRfdGFibGVfbGVuID0gSVdfU1BPT0ZfRVZFTlRfVFlQRV9OVU07CisJCQlicmVhazsKKworCQljYXNlIElXX0ZMT09EX0VWRU5UX0ZMQUdfU1RBUlQ6CisJCQlldmVudF90YWJsZV9sZW4gPSBJV19GTE9PRF9FVkVOVF9UWVBFX05VTTsKKwkJCWJyZWFrOworCX0KKworCWlmIChldmVudF90YWJsZV9sZW4gPT0gMCkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzIDogVGhlIHR5cGUoJTB4MDJ4KSBpcyBub3QgdmFsaWQuXG4iLCBfX2Z1bmNfXywgdHlwZSkpOworCQlyZXR1cm47CisJfQorCisJaWYgKGV2ZW50ID49IGV2ZW50X3RhYmxlX2xlbikKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzIDogVGhlIGV2ZW50KCUweDAyeCkgaXMgbm90IHZhbGlkLlxuIiwgX19mdW5jX18sIGV2ZW50KSk7CisJCXJldHVybjsKKwl9CisKKwkvL0FsbG9jYXRlIG1lbW9yeSBhbmQgY29weSB0aGUgbXNnLgorCWlmKChwQnVmID0ga21hbGxvYyhJV19DVVNUT01fTUFYX0xFTiwgR0ZQX0FUT01JQykpICE9IE5VTEwpCisJeworCQkvL1ByZXBhcmUgdGhlIHBheWxvYWQKKwkJbWVtc2V0KHBCdWYsIDAsIElXX0NVU1RPTV9NQVhfTEVOKTsKKworCQlwQnVmUHRyID0gcEJ1ZjsKKworCQlpZiAocEFkZHIpCisJCQlwQnVmUHRyICs9IHNwcmludGYocEJ1ZlB0ciwgIihSVDI4NjApIFNUQSglMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCkgIiwgUFJJTlRfTUFDKHBBZGRyKSk7CisJCWVsc2UgaWYgKEJzc0lkeCA8IE1BWF9NQlNTSURfTlVNKQorCQkJcEJ1ZlB0ciArPSBzcHJpbnRmKHBCdWZQdHIsICIoUlQyODYwKSBCU1MocmElZCkgIiwgQnNzSWR4KTsKKwkJZWxzZQorCQkJcEJ1ZlB0ciArPSBzcHJpbnRmKHBCdWZQdHIsICIoUlQyODYwKSAiKTsKKworCQlpZiAodHlwZSA9PSBJV19TWVNfRVZFTlRfRkxBR19TVEFSVCkKKwkJCXBCdWZQdHIgKz0gc3ByaW50ZihwQnVmUHRyLCAiJXMiLCBwV2lyZWxlc3NTeXNFdmVudFRleHRbZXZlbnRdKTsKKwkJZWxzZSBpZiAodHlwZSA9PSBJV19TUE9PRl9FVkVOVF9GTEFHX1NUQVJUKQorCQkJcEJ1ZlB0ciArPSBzcHJpbnRmKHBCdWZQdHIsICIlcyAoUlNTST0lZCkiLCBwV2lyZWxlc3NTcG9vZkV2ZW50VGV4dFtldmVudF0sIFJzc2kpOworCQllbHNlIGlmICh0eXBlID09IElXX0ZMT09EX0VWRU5UX0ZMQUdfU1RBUlQpCisJCQlwQnVmUHRyICs9IHNwcmludGYocEJ1ZlB0ciwgIiVzIiwgcFdpcmVsZXNzRmxvb2RFdmVudFRleHRbZXZlbnRdKTsKKwkJZWxzZQorCQkJcEJ1ZlB0ciArPSBzcHJpbnRmKHBCdWZQdHIsICIlcyIsICJ1bmtub3duIGV2ZW50Iik7CisKKwkJcEJ1ZlB0cltwQnVmUHRyIC0gcEJ1Zl0gPSAnXDAnOworCQlCdWZMZW4gPSBwQnVmUHRyIC0gcEJ1ZjsKKworCQltZW1zZXQoJndycXUsIDAsIHNpemVvZih3cnF1KSk7CisJICAgIHdycXUuZGF0YS5mbGFncyA9IEV2ZW50X2ZsYWc7CisJCXdycXUuZGF0YS5sZW5ndGggPSBCdWZMZW47CisKKwkJLy9zZW5kIHdpcmVsZXNzIGV2ZW50CisJICAgIHdpcmVsZXNzX3NlbmRfZXZlbnQocEFkLT5uZXRfZGV2LCBJV0VWQ1VTVE9NLCAmd3JxdSwgcEJ1Zik7CisKKwkJLy9EQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcyA6ICVzXG4iLCBfX2Z1bmNfXywgcEJ1ZikpOworCisJCWtmcmVlKHBCdWYpOworCX0KKwllbHNlCisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzIDogQ2FuJ3QgYWxsb2NhdGUgbWVtb3J5IGZvciB3aXJlbGVzcyBldmVudC5cbiIsIF9fZnVuY19fKSk7CisjZWxzZQorCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzIDogVGhlIFdpcmVsZXNzIEV4dGVuc2lvbiBNVVNUIGJlIHYxNSBvciBuZXdlci5cbiIsIF9fZnVuY19fKSk7CisjZW5kaWYgIC8qIFdJUkVMRVNTX0VYVCA+PSAxNSAqLworfQorCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKK3ZvaWQgc2VuZF9tb25pdG9yX3BhY2tldHMoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUlhfQkxLCQkJKnBSeEJsaykKK3sKKyAgICBzdHJ1Y3Qgc2tfYnVmZgkqcE9TUGt0OworICAgIHdsYW5fbmdfcHJpc20yX2hlYWRlciAqcGg7CisgICAgaW50IHJhdGVfaW5kZXggPSAwOworICAgIFVTSE9SVCBoZWFkZXJfbGVuID0gMDsKKyAgICBVQ0hBUiB0ZW1wX2hlYWRlcls0MF0gPSB7MH07CisKKyAgICB1X2ludDMyX3QgcmFsaW5rcmF0ZVsyNTZdID0gezIsNCwxMSwyMiwgMTIsMTgsMjQsMzYsNDgsNzIsOTYsICAxMDgsICAgMTA5LCAxMTAsIDExMSwgMTEyLCAxMywgMjYsIDM5LCA1Miw3OCwxMDQsIDExNywgMTMwLCAyNiwgNTIsIDc4LDEwNCwgMTU2LCAyMDgsIDIzNCwgMjYwLCAyNywgNTQsODEsMTA4LDE2MiwgMjE2LCAyNDMsIDI3MCwgLy8gTGFzdCAzOAorCTU0LCAxMDgsIDE2MiwgMjE2LCAzMjQsIDQzMiwgNDg2LCA1NDAsICAxNCwgMjksIDQzLCA1NywgODcsIDExNSwgMTMwLCAxNDQsIDI5LCA1OSw4NywxMTUsIDE3MywgMjMwLDI2MCwgMjg4LCAzMCwgNjAsOTAsMTIwLDE4MCwyNDAsMjcwLDMwMCw2MCwxMjAsMTgwLDI0MCwzNjAsNDgwLDU0MCw2MDAsIDAsMSwyLDMsNCw1LDYsNyw4LDksMTAsCisJMTEsMTIsMTMsMTQsMTUsMTYsMTcsMTgsMTksMjAsMjEsMjIsMjMsMjQsMjUsMjYsMjcsMjgsMjksMzAsMzEsMzIsMzMsMzQsMzUsMzYsMzcsMzgsMzksNDAsNDEsNDIsNDMsNDQsNDUsNDYsNDcsNDgsNDksNTAsNTEsNTIsNTMsNTQsNTUsNTYsNTcsNTgsNTksNjAsNjEsNjIsNjMsNjQsNjUsNjYsNjcsNjgsNjksNzAsNzEsNzIsNzMsNzQsNzUsNzYsNzcsNzgsNzksODB9OworCisKKyAgICBBU1NFUlQocFJ4QmxrLT5wUnhQYWNrZXQpOworICAgIGlmIChwUnhCbGstPkRhdGFTaXplIDwgMTApCisgICAgeworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlcyA6IFNpemUgaXMgdG9vIHNtYWxsISAoJWQpXG4iLCBfX2Z1bmNfXywgcFJ4QmxrLT5EYXRhU2l6ZSkpOworCQlnb3RvIGVycl9mcmVlX3NrX2J1ZmY7CisgICAgfQorCisgICAgaWYgKHBSeEJsay0+RGF0YVNpemUgKyBzaXplb2Yod2xhbl9uZ19wcmlzbTJfaGVhZGVyKSA+IFJYX0JVRkZFUl9BR0dSRVNJWkUpCisgICAgeworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlcyA6IFNpemUgaXMgdG9vIGxhcmdlISAoJWQpXG4iLCBfX2Z1bmNfXywgcFJ4QmxrLT5EYXRhU2l6ZSArIHNpemVvZih3bGFuX25nX3ByaXNtMl9oZWFkZXIpKSk7CisJCWdvdG8gZXJyX2ZyZWVfc2tfYnVmZjsKKyAgICB9CisKKyAgICBwT1NQa3QgPSBSVFBLVF9UT19PU1BLVChwUnhCbGstPnBSeFBhY2tldCk7CisJcE9TUGt0LT5kZXYgPSBnZXRfbmV0ZGV2X2Zyb21fYnNzaWQocEFkLCBCU1MwKTsKKyAgICBpZiAocFJ4QmxrLT5wSGVhZGVyLT5GQy5UeXBlID09IEJUWVBFX0RBVEEpCisgICAgeworICAgICAgICBwUnhCbGstPkRhdGFTaXplIC09IExFTkdUSF84MDJfMTE7CisgICAgICAgIGlmICgocFJ4QmxrLT5wSGVhZGVyLT5GQy5Ub0RzID09IDEpICYmCisgICAgICAgICAgICAocFJ4QmxrLT5wSGVhZGVyLT5GQy5GckRzID09IDEpKQorICAgICAgICAgICAgaGVhZGVyX2xlbiA9IExFTkdUSF84MDJfMTFfV0lUSF9BRERSNDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgaGVhZGVyX2xlbiA9IExFTkdUSF84MDJfMTE7CisKKyAgICAgICAgLy8gUU9TCisgICAgCWlmIChwUnhCbGstPnBIZWFkZXItPkZDLlN1YlR5cGUgJiAweDA4KQorICAgIAl7CisgICAgCSAgICBoZWFkZXJfbGVuICs9IDI7CisgICAgCQkvLyBEYXRhIHNraXAgUU9TIGNvbnRvcmwgZmllbGQKKyAgICAJCXBSeEJsay0+RGF0YVNpemUgLT0yOworICAgIAl9CisKKyAgICAJLy8gT3JkZXIgYml0OiBBLVJhbGluayBvciBIVEMrCisgICAgCWlmIChwUnhCbGstPnBIZWFkZXItPkZDLk9yZGVyKQorICAgIAl7CisgICAgCSAgICBoZWFkZXJfbGVuICs9IDQ7CisJCQkvLyBEYXRhIHNraXAgSFRDIGNvbnRvcmwgZmllbGQKKwkJCXBSeEJsay0+RGF0YVNpemUgLT0gNDsKKyAgICAJfQorCisgICAgICAgIC8vIENvcHkgSGVhZGVyCisgICAgICAgIGlmIChoZWFkZXJfbGVuIDw9IDQwKQorICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkodGVtcF9oZWFkZXIsIHBSeEJsay0+cERhdGEsIGhlYWRlcl9sZW4pOworCisgICAgICAgIC8vIHNraXAgSFcgcGFkZGluZworICAgIAlpZiAocFJ4QmxrLT5SeEQuTDJQQUQpCisgICAgCSAgICBwUnhCbGstPnBEYXRhICs9IChoZWFkZXJfbGVuICsgMik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHBSeEJsay0+cERhdGEgKz0gaGVhZGVyX2xlbjsKKyAgICB9IC8vZW5kIGlmCisKKworCWlmIChwUnhCbGstPkRhdGFTaXplIDwgcE9TUGt0LT5sZW4pIHsKKyAgICAgICAgc2tiX3RyaW0ocE9TUGt0LHBSeEJsay0+RGF0YVNpemUpOworICAgIH0gZWxzZSB7CisgICAgICAgIHNrYl9wdXQocE9TUGt0LChwUnhCbGstPkRhdGFTaXplIC0gcE9TUGt0LT5sZW4pKTsKKyAgICB9IC8vZW5kIGlmCisKKyAgICBpZiAoKHBSeEJsay0+cERhdGEgLSBwT1NQa3QtPmRhdGEpID4gMCkgeworCSAgICBza2JfcHV0KHBPU1BrdCwocFJ4QmxrLT5wRGF0YSAtIHBPU1BrdC0+ZGF0YSkpOworCSAgICBza2JfcHVsbChwT1NQa3QsKHBSeEJsay0+cERhdGEgLSBwT1NQa3QtPmRhdGEpKTsKKyAgICB9IC8vZW5kIGlmCisKKyAgICBpZiAoc2tiX2hlYWRyb29tKHBPU1BrdCkgPCAoc2l6ZW9mKHdsYW5fbmdfcHJpc20yX2hlYWRlcikrIGhlYWRlcl9sZW4pKSB7CisgICAgICAgIGlmIChwc2tiX2V4cGFuZF9oZWFkKHBPU1BrdCwgKHNpemVvZih3bGFuX25nX3ByaXNtMl9oZWFkZXIpICsgaGVhZGVyX2xlbiksIDAsIEdGUF9BVE9NSUMpKSB7CisJICAgICAgICBEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlcyA6IFJlYWxsb2NhdGUgaGVhZGVyIHNpemUgb2Ygc2tfYnVmZiBmYWlsIVxuIiwgX19mdW5jX18pKTsKKwkJCWdvdG8gZXJyX2ZyZWVfc2tfYnVmZjsKKwkgICAgfSAvL2VuZCBpZgorICAgIH0gLy9lbmQgaWYKKworICAgIGlmIChoZWFkZXJfbGVuID4gMCkKKyAgICAgICAgTmRpc01vdmVNZW1vcnkoc2tiX3B1c2gocE9TUGt0LCBoZWFkZXJfbGVuKSwgdGVtcF9oZWFkZXIsIGhlYWRlcl9sZW4pOworCisgICAgcGggPSAod2xhbl9uZ19wcmlzbTJfaGVhZGVyICopIHNrYl9wdXNoKHBPU1BrdCwgc2l6ZW9mKHdsYW5fbmdfcHJpc20yX2hlYWRlcikpOworCU5kaXNaZXJvTWVtb3J5KHBoLCBzaXplb2Yod2xhbl9uZ19wcmlzbTJfaGVhZGVyKSk7CisKKyAgICBwaC0+bXNnY29kZQkJICAgID0gRElEbXNnX2xueGluZF93bGFuc25pZmZybTsKKwlwaC0+bXNnbGVuCQkgICAgPSBzaXplb2Yod2xhbl9uZ19wcmlzbTJfaGVhZGVyKTsKKwlzdHJjcHkocGgtPmRldm5hbWUsIHBBZC0+bmV0X2Rldi0+bmFtZSk7CisKKyAgICBwaC0+aG9zdHRpbWUuZGlkID0gRElEbXNnX2xueGluZF93bGFuc25pZmZybV9ob3N0dGltZTsKKwlwaC0+aG9zdHRpbWUuc3RhdHVzID0gMDsKKwlwaC0+aG9zdHRpbWUubGVuID0gNDsKKwlwaC0+aG9zdHRpbWUuZGF0YSA9IGppZmZpZXM7CisKKwlwaC0+bWFjdGltZS5kaWQgPSBESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX21hY3RpbWU7CisJcGgtPm1hY3RpbWUuc3RhdHVzID0gMDsKKwlwaC0+bWFjdGltZS5sZW4gPSAwOworCXBoLT5tYWN0aW1lLmRhdGEgPSAwOworCisgICAgcGgtPmlzdHguZGlkID0gRElEbXNnX2xueGluZF93bGFuc25pZmZybV9pc3R4OworCXBoLT5pc3R4LnN0YXR1cyA9IDA7CisJcGgtPmlzdHgubGVuID0gMDsKKwlwaC0+aXN0eC5kYXRhID0gMDsKKworICAgIHBoLT5jaGFubmVsLmRpZCA9IERJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm1fY2hhbm5lbDsKKwlwaC0+Y2hhbm5lbC5zdGF0dXMgPSAwOworCXBoLT5jaGFubmVsLmxlbiA9IDQ7CisKKyAgICBwaC0+Y2hhbm5lbC5kYXRhID0gKHVfaW50MzJfdClwQWQtPkNvbW1vbkNmZy5DaGFubmVsOworCisgICAgcGgtPnJzc2kuZGlkID0gRElEbXNnX2xueGluZF93bGFuc25pZmZybV9yc3NpOworCXBoLT5yc3NpLnN0YXR1cyA9IDA7CisJcGgtPnJzc2kubGVuID0gNDsKKyAgICBwaC0+cnNzaS5kYXRhID0gKHVfaW50MzJfdClSVE1QTWF4UnNzaShwQWQsIENvbnZlcnRUb1Jzc2kocEFkLCBwUnhCbGstPnBSeFdJLT5SU1NJMCwgUlNTSV8wKSwgQ29udmVydFRvUnNzaShwQWQsIHBSeEJsay0+cFJ4V0ktPlJTU0kxLCBSU1NJXzEpLCBDb252ZXJ0VG9Sc3NpKHBBZCwgcFJ4QmxrLT5wUnhXSS0+UlNTSTIsIFJTU0lfMikpOzsKKworCXBoLT5zaWduYWwuZGlkID0gRElEbXNnX2xueGluZF93bGFuc25pZmZybV9zaWduYWw7CisJcGgtPnNpZ25hbC5zdGF0dXMgPSAwOworCXBoLT5zaWduYWwubGVuID0gNDsKKwlwaC0+c2lnbmFsLmRhdGEgPSAwOyAvL3Jzc2kgKyBub2lzZTsKKworCXBoLT5ub2lzZS5kaWQgPSBESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX25vaXNlOworCXBoLT5ub2lzZS5zdGF0dXMgPSAwOworCXBoLT5ub2lzZS5sZW4gPSA0OworCXBoLT5ub2lzZS5kYXRhID0gMDsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorICAgIGlmIChwUnhCbGstPnBSeFdJLT5QSFlNT0RFID49IE1PREVfSFRNSVgpCisgICAgeworICAgIAlyYXRlX2luZGV4ID0gMTYgKyAoKFVDSEFSKXBSeEJsay0+cFJ4V0ktPkJXICoxNikgKyAoKFVDSEFSKXBSeEJsay0+cFJ4V0ktPlNob3J0R0kgKjMyKSArICgoVUNIQVIpcFJ4QmxrLT5wUnhXSS0+TUNTKTsKKyAgICB9CisgICAgZWxzZQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCWlmIChwUnhCbGstPnBSeFdJLT5QSFlNT0RFID09IE1PREVfT0ZETSkKKyAgICAJcmF0ZV9pbmRleCA9IChVQ0hBUikocFJ4QmxrLT5wUnhXSS0+TUNTKSArIDQ7CisgICAgZWxzZQorICAgIAlyYXRlX2luZGV4ID0gKFVDSEFSKShwUnhCbGstPnBSeFdJLT5NQ1MpOworICAgIGlmIChyYXRlX2luZGV4IDwgMCkKKyAgICAgICAgcmF0ZV9pbmRleCA9IDA7CisgICAgaWYgKHJhdGVfaW5kZXggPiAyNTUpCisgICAgICAgIHJhdGVfaW5kZXggPSAyNTU7CisKKwlwaC0+cmF0ZS5kaWQgPSBESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX3JhdGU7CisJcGgtPnJhdGUuc3RhdHVzID0gMDsKKwlwaC0+cmF0ZS5sZW4gPSA0OworICAgIHBoLT5yYXRlLmRhdGEgPSByYWxpbmtyYXRlW3JhdGVfaW5kZXhdOworCisJcGgtPmZybWxlbi5kaWQgPSBESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX2ZybWxlbjsKKyAgICBwaC0+ZnJtbGVuLnN0YXR1cyA9IDA7CisJcGgtPmZybWxlbi5sZW4gPSA0OworCXBoLT5mcm1sZW4uZGF0YQk9ICh1X2ludDMyX3QpcFJ4QmxrLT5EYXRhU2l6ZTsKKworCisgICAgcE9TUGt0LT5wa3RfdHlwZSA9IFBBQ0tFVF9PVEhFUkhPU1Q7CisgICAgcE9TUGt0LT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHBPU1BrdCwgcE9TUGt0LT5kZXYpOworICAgIHBPU1BrdC0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsKKyAgICBuZXRpZl9yeChwT1NQa3QpOworCisgICAgcmV0dXJuOworCitlcnJfZnJlZV9za19idWZmOgorCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhCbGstPnBSeFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJcmV0dXJuOworCit9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwordm9pZCBydG1wX29zX3RocmVhZF9pbml0KFBVQ0hBUiBwVGhyZWFkTmFtZSwgUFZPSUQgcE5vdGlmeSkKK3sKKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDUsMCkKKwlkYWVtb25pemUocFRocmVhZE5hbWUgLyoiJXMiLHBBZC0+bmV0X2Rldi0+bmFtZSovKTsKKworCWFsbG93X3NpZ25hbChTSUdURVJNKTsKKwlhbGxvd19zaWduYWwoU0lHS0lMTCk7CisJY3VycmVudC0+ZmxhZ3MgfD0gUEZfTk9GUkVFWkU7CisjZWxzZQorCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlkYWVtb25pemUoKTsKKwlyZXBhcmVudF90b19pbml0KCk7CisJc3RyY3B5KGN1cnJlbnQtPmNvbW0sIHBUaHJlYWROYW1lKTsKKworCXNpZ2luaXRzZXRpbnYoJmN1cnJlbnQtPmJsb2NrZWQsIHNpZ21hc2soU0lHVEVSTSkgfCBzaWdtYXNrKFNJR0tJTEwpKTsKKworCS8qIEFsbG93IGludGVyY2VwdGlvbiBvZiBTSUdLSUxMIG9ubHkKKwkgKiBEb24ndCBhbGxvdyBvdGhlciBzaWduYWxzIHRvIGludGVycnVwdCB0aGUgdHJhbnNtaXNzaW9uICovCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw0LDIyKQorCXNwaW5fbG9ja19pcnFzYXZlKCZjdXJyZW50LT5zaWdtYXNrX2xvY2ssIGZsYWdzKTsKKwlmbHVzaF9zaWduYWxzKGN1cnJlbnQpOworCXJlY2FsY19zaWdwZW5kaW5nKGN1cnJlbnQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmN1cnJlbnQtPnNpZ21hc2tfbG9jaywgZmxhZ3MpOworI2VuZGlmCisjZW5kaWYKKworICAgIC8qIHNpZ25hbCB0aGF0IHdlJ3ZlIHN0YXJ0ZWQgdGhlIHRocmVhZCAqLworCWNvbXBsZXRlKHBOb3RpZnkpOworCit9CisKK3ZvaWQgUlRNUF9JbmRpY2F0ZU1lZGlhU3RhdGUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQpCit7CisJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJXaXJlbGVzc0V2ZW50KQorCXsKKwkJaWYgKHBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID09IE5kaXNNZWRpYVN0YXRlQ29ubmVjdGVkKQorCQl7CisJCQlSVE1QU2VuZFdpcmVsZXNzRXZlbnQocEFkLCBJV19TVEFfTElOS1VQX0VWRU5UX0ZMQUcsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQWRkciwgQlNTMCwgMCk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlSVE1QU2VuZFdpcmVsZXNzRXZlbnQocEFkLCBJV19TVEFfTElOS0RPV05fRVZFTlRfRkxBRywgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5BZGRyLCBCU1MwLCAwKTsKKwkJfQorCX0KK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9ydF9saW51eC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9ydF9saW51eC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1OWY5Y2UKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3J0X2xpbnV4LmgKQEAgLTAsMCArMSw5MDggQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgUHJvZ3JhbTogICAgcnRfbGludXguYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgQ3JlYXRlZDogICAgNC8yMS8yMDA2IDE6MTc6MzggUE0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgQXV0aG9yOiAgICAgV3UgWGktS3VuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgQ29tbWVudHM6ICAgYGRlc2NyaXB0aW9uYCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEhpc3Rvcnk6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIFJldmlzaW9uIDEuMSA0LzIxLzIwMDYgMToxNzozOCBQTSAgeHNpa3VuICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEluaXRpYWwgcmV2aXNpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgInJ0bXBfdHlwZS5oIgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKworI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CisjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKworCisjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KKyNpbmNsdWRlIDxuZXQvaXdfaGFuZGxlci5oPgorCisvLyBsb2FkIGZpcm13YXJlCisjZGVmaW5lIF9fS0VSTkVMX1NZU0NBTExTX18KKyNpbmNsdWRlIDxsaW51eC91bmlzdGQuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisKKyNkZWZpbmUgTUVNX0FMTE9DX0ZMQUcgICAgICAoR0ZQX0FUT01JQykgLy8oR0ZQX0RNQSB8IEdGUF9BVE9NSUMpCisKKyNpZm5kZWYgSUZOQU1TSVoKKyNkZWZpbmUgSUZOQU1TSVogMTYKKyNlbmRpZgorCisvLyNkZWZpbmUgQ09ORklHX0NLSVBfU1VQUE9SVAorCisjdW5kZWYgX19pbmxpbmUKKyNkZWZpbmUgX19pbmxpbmUJICAgc3RhdGljIGlubGluZQorCit0eXBlZGVmIGludCAoKkhBUkRfU1RBUlRfWE1JVF9GVU5DKShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2Rldik7CisKKy8vIGFkZCBieSBrYXRoeQorCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisKKyNpZmRlZiBSVDI4NzAKKyNkZWZpbmUgU1RBX1BST0ZJTEVfUEFUSAkJCSIvZXRjL1dpcmVsZXNzL1JUMjg3MFNUQS9SVDI4NzBTVEEuZGF0IgorI2RlZmluZSBTVEFfUlQyODcwX0lNQUdFX0ZJTEVfTkFNRSAgIi9ldGMvV2lyZWxlc3MvUlQyODcwU1RBL3J0Mjg3MC5iaW4iCisjZGVmaW5lIFNUQV9OSUNfREVWSUNFX05BTUUJCQkiUlQyODcwU1RBIgorI2RlZmluZSBTVEFfRFJJVkVSX1ZFUlNJT04JCQkiMS40LjAuMCIKKyNpZmRlZiBNVUxUSVBMRV9DQVJEX1NVUFBPUlQKKyNkZWZpbmUgQ0FSRF9JTkZPX1BBVEgJCQkiL2V0Yy9XaXJlbGVzcy9SVDI4NzBTVEEvUlQyODcwU1RBQ2FyZC5kYXQiCisjZW5kaWYgLy8gTVVMVElQTEVfQ0FSRF9TVVBQT1JUIC8vCisjZW5kaWYgLy8gUlQyODcwIC8vCisKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQorCisjZGVmaW5lIFJUTVBfVElNRV9BRlRFUihhLGIpCQlcCisJKHR5cGVjaGVjayh1bnNpZ25lZCBsb25nLCAodW5zaWduZWQgbG9uZylhKSAmJiBcCisJIHR5cGVjaGVjayh1bnNpZ25lZCBsb25nLCAodW5zaWduZWQgbG9uZyliKSAmJiBcCisJICgobG9uZykoYikgLSAobG9uZykoYSkgPCAwKSkKKworI2RlZmluZSBSVE1QX1RJTUVfQUZURVJfRVEoYSxiKQlcCisJKHR5cGVjaGVjayh1bnNpZ25lZCBsb25nLCAodW5zaWduZWQgbG9uZylhKSAmJiBcCisJIHR5cGVjaGVjayh1bnNpZ25lZCBsb25nLCAodW5zaWduZWQgbG9uZyliKSAmJiBcCisJICgobG9uZykoYSkgLSAobG9uZykoYikgPj0gMCkpCisjZGVmaW5lIFJUTVBfVElNRV9CRUZPUkUoYSxiKQlSVE1QX1RJTUVfQUZURVJfRVEoYixhKQorI2Vsc2UKKyNkZWZpbmUgUlRNUF9USU1FX0FGVEVSKGEsYikgdGltZV9hZnRlcihhLCBiKQorI2VuZGlmCisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApCisjZGVmaW5lIFJUX01PRF9JTkNfVVNFX0NPVU5UKCkgXAorCWlmICghdHJ5X21vZHVsZV9nZXQoVEhJU19NT0RVTEUpKSBcCisJeyBcCisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzOiBjYW5ub3QgcmVzZXJ2ZSBtb2R1bGVcbiIsIF9fZnVuY19fKSk7IFwKKwkJcmV0dXJuIC0xOyBcCisJfQorCisjZGVmaW5lIFJUX01PRF9ERUNfVVNFX0NPVU5UKCkgbW9kdWxlX3B1dChUSElTX01PRFVMRSk7CisjZWxzZQorI2RlZmluZSBSVF9NT0RfSU5DX1VTRV9DT1VOVCgpCU1PRF9JTkNfVVNFX0NPVU5UOworI2RlZmluZSBSVF9NT0RfREVDX1VTRV9DT1VOVCgpIE1PRF9ERUNfVVNFX0NPVU5UOworI2VuZGlmCisKKyNkZWZpbmUgT1NfSFoJCQlIWgorCisjZGVmaW5lIEVUSF9MRU5HVEhfT0ZfQUREUkVTUwk2CisKKyNkZWZpbmUgSU4KKyNkZWZpbmUgT1VUCisKKyNkZWZpbmUgTkRJU19TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVAorI2RlZmluZSBORElTX1NUQVRVU19TVUNDRVNTICAgICAgICAgICAgICAgICAgICAgMHgwMAorI2RlZmluZSBORElTX1NUQVRVU19GQUlMVVJFICAgICAgICAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBORElTX1NUQVRVU19JTlZBTElEX0RBVEEJCQkJMHgwMgorI2RlZmluZSBORElTX1NUQVRVU19SRVNPVVJDRVMgICAgICAgICAgICAgICAgICAgMHgwMworCisjZGVmaW5lIE1JTl9ORVRfREVWSUNFX0ZPUl9BSUQJCQkweDAwCQkvLzB4MDB+MHgzZgorI2RlZmluZSBNSU5fTkVUX0RFVklDRV9GT1JfTUJTU0lECQkweDAwCQkvLzB4MDAsMHgxMCwweDIwLDB4MzAKKyNkZWZpbmUgTUlOX05FVF9ERVZJQ0VfRk9SX1dEUwkJCTB4MTAJCS8vMHg0MCwweDUwLDB4NjAsMHg3MAorI2RlZmluZSBNSU5fTkVUX0RFVklDRV9GT1JfQVBDTEkJCTB4MjAKKyNkZWZpbmUgTUlOX05FVF9ERVZJQ0VfRk9SX01FU0gJCQkweDMwCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisjZGVmaW5lIE1JTl9ORVRfREVWSUNFX0ZPUl9ETFMJCQkweDQwCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorI2RlZmluZSBORElTX1BBQ0tFVF9UWVBFX0RJUkVDVEVECQkwCisjZGVmaW5lIE5ESVNfUEFDS0VUX1RZUEVfTVVMVElDQVNUCQkxCisjZGVmaW5lIE5ESVNfUEFDS0VUX1RZUEVfQlJPQURDQVNUCQkyCisjZGVmaW5lIE5ESVNfUEFDS0VUX1RZUEVfQUxMX01VTFRJQ0FTVAkzCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDI3KQordHlwZWRlZglzdHJ1Y3QgcGlkICoJVEhSRUFEX1BJRDsKKyNkZWZpbmUJVEhSRUFEX1BJRF9JTklUX1ZBTFVFCU5VTEwKKyNkZWZpbmUJR0VUX1BJRChfdikJZmluZF9nZXRfcGlkKF92KQorI2RlZmluZQlHRVRfUElEX05VTUJFUihfdikJcGlkX25yKF92KQorI2RlZmluZSBDSEVDS19QSURfTEVHQUxJVFkoX3BpZCkJaWYgKHBpZF9ucihfcGlkKSA+PSAwKQorI2RlZmluZSBLSUxMX1RIUkVBRF9QSUQoX0EsIF9CLCBfQykJa2lsbF9waWQoX0EsIF9CLCBfQykKKyNlbHNlCit0eXBlZGVmCXBpZF90CVRIUkVBRF9QSUQ7CisjZGVmaW5lCVRIUkVBRF9QSURfSU5JVF9WQUxVRQktMQorI2RlZmluZQlHRVRfUElEKF92KQlfdgorI2RlZmluZQlHRVRfUElEX05VTUJFUihfdikJX3YKKyNkZWZpbmUgQ0hFQ0tfUElEX0xFR0FMSVRZKF9waWQpCWlmIChfcGlkID49IDApCisjZGVmaW5lIEtJTExfVEhSRUFEX1BJRChfQSwgX0IsIF9DKQlraWxsX3Byb2MoX0EsIF9CLCBfQykKKyNlbmRpZgorCitzdHJ1Y3Qgb3NfbG9jayAgeworCXNwaW5sb2NrX3QJCWxvY2s7CisJdW5zaWduZWQgbG9uZyAgCWZsYWdzOworfTsKKworCitzdHJ1Y3Qgb3NfY29va2llIHsKKworI2lmZGVmIFJUMjg3MAorCXN0cnVjdCB1c2JfZGV2aWNlCQkqcFVzYl9EZXY7CisKKwlUSFJFQURfUElECQkJCU1MTUVUaHJfcGlkOworCVRIUkVBRF9QSUQJCQkJUlRVU0JDbWRUaHJfcGlkOworCVRIUkVBRF9QSUQJCQkJVGltZXJRVGhyX3BpZDsKKyNlbmRpZiAvLyBSVDI4NzAgLy8KKworCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCAJcnhfZG9uZV90YXNrOworCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCAJbWdtdF9kbWFfZG9uZV90YXNrOworCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCAJYWMwX2RtYV9kb25lX3Rhc2s7CisJc3RydWN0IHRhc2tsZXRfc3RydWN0IAlhYzFfZG1hX2RvbmVfdGFzazsKKwlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgCWFjMl9kbWFfZG9uZV90YXNrOworCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCAJYWMzX2RtYV9kb25lX3Rhc2s7CisJc3RydWN0IHRhc2tsZXRfc3RydWN0IAloY2NhX2RtYV9kb25lX3Rhc2s7CisJc3RydWN0IHRhc2tsZXRfc3RydWN0CXRidHRfdGFzazsKKyNpZmRlZiBSVDI4NzAKKwlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QJbnVsbF9mcmFtZV9jb21wbGV0ZV90YXNrOworCXN0cnVjdCB0YXNrbGV0X3N0cnVjdAlydHNfZnJhbWVfY29tcGxldGVfdGFzazsKKwlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QJcHNwb2xsX2ZyYW1lX2NvbXBsZXRlX3Rhc2s7CisjZW5kaWYgLy8gUlQyODcwIC8vCisKKworCXVuc2lnbmVkIGxvbmcJCQlhcGRfcGlkOyAvLzgwMi4xeCBkYWVtb24gcGlkCisJSU5UCQkJCQkJaW9jdGxfaWZfdHlwZTsKKwlJTlQgCQkJCQlpb2N0bF9pZjsKK307CisKK3R5cGVkZWYgc3RydWN0IF9WSVJUVUFMX0FEQVBURVIKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZQkJKlJ0bXBEZXY7CisJc3RydWN0IG5ldF9kZXZpY2UJCSpWaXJ0dWFsRGV2OworfSBWSVJUVUFMX0FEQVBURVIsIFBWSVJUVUFMX0FEQVBURVI7CisKKyN1bmRlZiAgQVNTRVJUCisjZGVmaW5lIEFTU0VSVCh4KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICghKHgpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcHJpbnRrKEtFUk5fV0FSTklORyBfX0ZJTEVfXyAiOiVkIGFzc2VydCAiICN4ICJmYWlsZWRcbiIsIF9fTElORV9fKTsgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKK3R5cGVkZWYgc3RydWN0IG9zX2Nvb2tpZQkqIFBPU19DT09LSUU7Cit0eXBlZGVmIHN0cnVjdCBwY2lfZGV2IAkJKiBQUENJX0RFVjsKK3R5cGVkZWYgc3RydWN0IG5ldF9kZXZpY2UJKiBQTkVUX0RFVjsKK3R5cGVkZWYgdm9pZAkJCQkqIFBORElTX1BBQ0tFVDsKK3R5cGVkZWYgY2hhcgkJCQlORElTX1BBQ0tFVDsKK3R5cGVkZWYgUE5ESVNfUEFDS0VUCQkqIFBQTkRJU19QQUNLRVQ7Cit0eXBlZGVmCWRtYV9hZGRyX3QJCQlORElTX1BIWVNJQ0FMX0FERFJFU1M7Cit0eXBlZGVmCWRtYV9hZGRyX3QJCQkqIFBORElTX1BIWVNJQ0FMX0FERFJFU1M7CisvL3R5cGVkZWYgc3RydWN0IHRpbWVyX2xpc3QJUkFMSU5LX1RJTUVSX1NUUlVDVDsKKy8vdHlwZWRlZiBzdHJ1Y3QgdGltZXJfbGlzdAkqIFBSQUxJTktfVElNRVJfU1RSVUNUOworLy90eXBlZGVmIHN0cnVjdCBvc19sb2NrCQlORElTX1NQSU5fTE9DSzsKK3R5cGVkZWYgc3BpbmxvY2tfdAkJCU5ESVNfU1BJTl9MT0NLOwordHlwZWRlZiBzdHJ1Y3QgdGltZXJfbGlzdAlORElTX01JTklQT1JUX1RJTUVSOwordHlwZWRlZiB2b2lkCQkJCSogTkRJU19IQU5ETEU7Cit0eXBlZGVmIGNoYXIgCQkJCSogUE5ESVNfQlVGRkVSOworCisKKwordm9pZCBoZXhfZHVtcChjaGFyICpzdHIsIHVuc2lnbmVkIGNoYXIgKnBTcmNCdWZWQSwgdW5zaWduZWQgaW50IFNyY0J1Zkxlbik7CisKK2RtYV9hZGRyX3QgbGludXhfcGNpX21hcF9zaW5nbGUodm9pZCAqaGFuZGxlLCB2b2lkICpwdHIsIHNpemVfdCBzaXplLCBpbnQgc2RfaWR4LCBpbnQgZGlyZWN0aW9uKTsKK3ZvaWQgbGludXhfcGNpX3VubWFwX3NpbmdsZSh2b2lkICpoYW5kbGUsIGRtYV9hZGRyX3QgZG1hX2FkZHIsIHNpemVfdCBzaXplLCBpbnQgZGlyZWN0aW9uKTsKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBNT1ZFIFRPIHJ0bXAuaCA/CisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworI2RlZmluZSBQS1RTUkNfTkRJUyAgICAgICAgICAgICAweDdmCisjZGVmaW5lIFBLVFNSQ19EUklWRVIgICAgICAgICAgIDB4MGYKKyNkZWZpbmUgUFJJTlRfTUFDKGFkZHIpCVwKKwlhZGRyWzBdLCBhZGRyWzFdLCBhZGRyWzJdLCBhZGRyWzNdLCBhZGRyWzRdLCBhZGRyWzVdCisKKworI2RlZmluZSBSVDI4NjBfUENJX0RFVklDRV9JRAkJMHgwNjAxCisKKworI2lmZGVmIFJUMjg3MAorI2RlZmluZSBQQ0lfTUFQX1NJTkdMRShfaGFuZGxlLCBfcHRyLCBfc2l6ZSwgX2RpcikgKFVMT05HKTAKKworI2RlZmluZSBQQ0lfVU5NQVBfU0lOR0xFKF9oYW5kbGUsIF9wdHIsIF9zaXplLCBfZGlyKQorI2VuZGlmIC8vIFJUMjg3MCAvLworCisKKyNkZWZpbmUgQkVBQ09OX0ZSQU1FX0RNQV9DQUNIRV9XQkFDSyhfcHRyLCBfc2l6ZSkJXAorCWRtYV9jYWNoZV93YmFjayhfcHRyLCBfc2l6ZSkKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCisjZGVmaW5lIE5kaXNNSW5kaWNhdGVTdGF0dXMoX3csIF94LCBfeSwgX3opCisKK3R5cGVkZWYgc3RydWN0IHRpbWVyX2xpc3QJUlRNUF9PU19USU1FUjsKKworI2lmZGVmIFJUMjg3MAorLyogLS0tLS0tLS0tLS0tLS0tLS0gVGltZXIgUmVsYXRlZCBNQVJDTyAtLS0tLS0tLS0tLS0tLS0qLworLy8gSW4gUlQyODcwLCB3ZSBoYXZlIGEgbG90IG9mIHRpbWVyIGZ1bmN0aW9ucyBhbmQgd2lsbCByZWFkL3dyaXRlIHJlZ2lzdGVyLCBpdCdzCisvLwlub3QgYWxsb3dlZCBpbiBMaW51eCBVU0Igc3ViLXN5c3RlbSB0byBkbyBpdCAoIGJlY2F1c2Ugb2Ygc2xlZXAgaXNzdWUgd2hlbiBzdWJtaXQKKy8vICB0byBjdHJsIHBpcGUpLiBTbyB3ZSBuZWVkIGEgd3JhcHBlciBmdW5jdGlvbiB0byB0YWtlIGNhcmUgaXQuCisKK3R5cGVkZWYgVk9JRCAoKlJUMjg3MF9USU1FUl9IQU5ETEUpKAorCUlOICBQVk9JRCAgIFN5c3RlbVNwZWNpZmljMSwKKwlJTiAgUFZPSUQgICBGdW5jdGlvbkNvbnRleHQsCisJSU4gIFBWT0lEICAgU3lzdGVtU3BlY2lmaWMyLAorCUlOICBQVk9JRCAgIFN5c3RlbVNwZWNpZmljMyk7CisjZW5kaWYgLy8gUlQyODcwIC8vCisKKwordHlwZWRlZiBzdHJ1Y3QgIF9SQUxJTktfVElNRVJfU1RSVUNUICAgIHsKKyAgICBSVE1QX09TX1RJTUVSCQlUaW1lck9iajsgICAgICAgLy8gTmRpcyBUaW1lciBvYmplY3QKKwlCT09MRUFOCQkJCVZhbGlkOwkJCS8vIFNldCB0byBUcnVlIHdoZW4gY2FsbCBSVE1QSW5pdFRpbWVyCisgICAgQk9PTEVBTiAgICAgICAgICAgICBTdGF0ZTsgICAgICAgICAgLy8gVHJ1ZSBpZiB0aW1lciBjYW5jZWxsZWQKKyAgICBCT09MRUFOCSAgICAgIAkJUGVyaW9kaWNUeXBlOwkvLyBUcnVlIGlmIHRpbWVyIGlzIHBlcmlvZGljIHRpbWVyCisgICAgQk9PTEVBTiAgICAgICAgICAgICBSZXBlYXQ7ICAgICAgICAgLy8gVHJ1ZSBpZiBwZXJpb2RpYyB0aW1lcgorICAgIFVMT05HICAgICAgICAgICAgICAgVGltZXJWYWx1ZTsgICAgIC8vIFRpbWVyIHZhbHVlIGluIG1pbGxpc2Vjb25kcworCVVMT05HCQkJCWNvb2tpZTsJCQkvLyBvcyBzcGVjaWZpYyBvYmplY3QKKyNpZmRlZiBSVDI4NzAKKwlSVDI4NzBfVElNRVJfSEFORExFCWhhbmRsZTsKKwl2b2lkCQkJCSpwQWQ7CisjZW5kaWYgLy8gUlQyODcwIC8vCit9ICAgUkFMSU5LX1RJTUVSX1NUUlVDVCwgKlBSQUxJTktfVElNRVJfU1RSVUNUOworCisKKyNpZmRlZiBSVDI4NzAKKwordHlwZWRlZiBlbnVtIF9SVDI4NzBfS0VSTkVMX1RIUkVBRF9TVEFUVVNfCit7CisJUlQyODcwX1RIUkVBRF9VTktOT1dOID0gMCwKKwlSVDI4NzBfVEhSRUFEX0lOSVRFRCA9IDEsCisJUlQyODcwX1RIUkVBRF9SVU5OSU5HID0gMiwKKwlSVDI4NzBfVEhSRUFEX1NUT1BFRCA9IDQsCit9UlQyODcwX0tFUk5FTF9USFJFQURfU1RBVFVTOworCisjZGVmaW5lIFJUMjg3MF9USFJFQURfQ0FOX0RPX0lOU0VSVAkJKFJUMjg3MF9USFJFQURfSU5JVEVEIHxSVDI4NzBfVEhSRUFEX1JVTk5JTkcpCisKK3R5cGVkZWYgc3RydWN0IF9SVDI4NzBfVElNRVJfRU5UUllfCit7CisJUkFMSU5LX1RJTUVSX1NUUlVDVCAJCQkqcFJhVGltZXI7CisJc3RydWN0IF9SVDI4NzBfVElNRVJfRU5UUllfIAkqcE5leHQ7Cit9UlQyODcwX1RJTUVSX0VOVFJZOworCisKKyNkZWZpbmUgVElNRVJfUVVFVUVfU0laRV9NQVgJMTI4Cit0eXBlZGVmIHN0cnVjdCBfUlQyODcwX1RJTUVSX1FVRVVFXworeworCXVuc2lnbmVkIGludAkJc3RhdHVzOworCS8vd2FpdF9xdWV1ZV9oZWFkX3QgCXRpbWVyV2FpdFE7CisJLy9hdG9taWNfdAkJCWNvdW50OworCVVDSEFSCQkJCSpwVGltZXJRUG9sbDsKKwlSVDI4NzBfVElNRVJfRU5UUlkJKnBRUG9sbEZyZWVMaXN0OworCVJUMjg3MF9USU1FUl9FTlRSWSAJKnBRSGVhZDsKKwlSVDI4NzBfVElNRVJfRU5UUlkgCSpwUVRhaWw7Cit9UlQyODcwX1RJTUVSX1FVRVVFOworI2VuZGlmIC8vIFJUMjg3MCAvLworCisKKy8vI2RlZmluZSBEQkcJMQorCisvLworLy8gIE1BQ1JPIGZvciBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24KKy8vCisKKyNpZmRlZiBEQkcKK2V4dGVybiBVTE9ORyAgICBSVERlYnVnTGV2ZWw7CisKKyNkZWZpbmUgREJHUFJJTlRfUkFXKExldmVsLCBGbXQpICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoTGV2ZWwgPD0gUlREZWJ1Z0xldmVsKSAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcHJpbnRrIEZtdDsgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKyNkZWZpbmUgREJHUFJJTlQoTGV2ZWwsIEZtdCkgICAgREJHUFJJTlRfUkFXKExldmVsLCBGbXQpCisKKworI2RlZmluZSBEQkdQUklOVF9FUlIoRm10KSAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHByaW50aygiRVJST1IhISEgIik7ICAgICAgICAgIFwKKyAgICBwcmludGsgRm10OyAgICAgICAgICAgICAgICAgIFwKK30KKworI2RlZmluZSBEQkdQUklOVF9TKFN0YXR1cywgRm10KQkJXAorewkJCQkJCQkJCVwKKwlwcmludGsgRm10OwkJCQkJXAorfQorCisKKyNlbHNlCisjZGVmaW5lIERCR1BSSU5UKExldmVsLCBGbXQpCisjZGVmaW5lIERCR1BSSU5UX1JBVyhMZXZlbCwgRm10KQorI2RlZmluZSBEQkdQUklOVF9TKFN0YXR1cywgRm10KQorI2RlZmluZSBEQkdQUklOVF9FUlIoRm10KQorI2VuZGlmCisKKworLy8KKy8vICBzcGluX2xvY2sgZW5oYW5jZWQgZm9yIE5lc3RlZCBzcGluIGxvY2sKKy8vCisjZGVmaW5lIE5kaXNBbGxvY2F0ZVNwaW5Mb2NrKF9fbG9jaykgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHNwaW5fbG9ja19pbml0KChzcGlubG9ja190ICopKF9fbG9jaykpOyAgICAgICAgICAgICAgIFwKK30KKworI2RlZmluZSBOZGlzRnJlZVNwaW5Mb2NrKGxvY2spICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKworI2RlZmluZSBSVE1QX1NFTV9MT0NLKF9fbG9jaykJCQkJCVwKK3sJCQkJCQkJCQkJCQlcCisJc3Bpbl9sb2NrX2JoKChzcGlubG9ja190ICopKF9fbG9jaykpOwkJCQlcCit9CisKKyNkZWZpbmUgUlRNUF9TRU1fVU5MT0NLKF9fbG9jaykJCQkJCVwKK3sJCQkJCQkJCQkJCQlcCisJc3Bpbl91bmxvY2tfYmgoKHNwaW5sb2NrX3QgKikoX19sb2NrKSk7CQkJCVwKK30KKworI2lmIDAgLy8gc2FtcGxlLCBJUlEgTE9DSworI2RlZmluZSBSVE1QX0lSUV9MT0NLKF9fbG9jaywgX19pcnFmbGFncykJCQkJCVwKK3sJCQkJCQkJCQkJCQkJXAorCXNwaW5fbG9ja19pcnFzYXZlKChzcGlubG9ja190ICopX19sb2NrLCBfX2lycWZsYWdzKTsJXAorCXBBZC0+aXJxX2Rpc2FibGVkIHw9IDE7IFwKK30KKworI2RlZmluZSBSVE1QX0lSUV9VTkxPQ0soX19sb2NrLCBfX2lycWZsYWcpCQkJCQkJXAorewkJCQkJCQkJCQkJCQkJXAorCXBBZC0+aXJxX2Rpc2FibGVkICY9IDA7IFwKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKChzcGlubG9ja190ICopKF9fbG9jayksICgodW5zaWduZWQgbG9uZylfX2lycWZsYWcpKTsJXAorfQorI2Vsc2UKKworLy8gc2FtcGxlLCB1c2Ugc2VtYXBob3JlIGxvY2sgdG8gcmVwbGFjZSBJUlEgbG9jaywgMjAwNy8xMS8xNQorI2RlZmluZSBSVE1QX0lSUV9MT0NLKF9fbG9jaywgX19pcnFmbGFncykJCQlcCit7CQkJCQkJCQkJCQkJCVwKKwlfX2lycWZsYWdzID0gMDsJCQkJCQkJCQlcCisJc3Bpbl9sb2NrX2JoKChzcGlubG9ja190ICopKF9fbG9jaykpOwkJCVwKKwlwQWQtPmlycV9kaXNhYmxlZCB8PSAxOyBcCit9CisKKyNkZWZpbmUgUlRNUF9JUlFfVU5MT0NLKF9fbG9jaywgX19pcnFmbGFnKQkJCVwKK3sJCQkJCQkJCQkJCQkJXAorCXBBZC0+aXJxX2Rpc2FibGVkICY9IDA7IFwKKwlzcGluX3VubG9ja19iaCgoc3BpbmxvY2tfdCAqKShfX2xvY2spKTsJCQlcCit9CisKKyNkZWZpbmUgUlRNUF9JTlRfTE9DSyhfX2xvY2ssIF9faXJxZmxhZ3MpCQkJXAorewkJCQkJCQkJCQkJCQlcCisJc3Bpbl9sb2NrX2lycXNhdmUoKHNwaW5sb2NrX3QgKilfX2xvY2ssIF9faXJxZmxhZ3MpOwlcCit9CisKKyNkZWZpbmUgUlRNUF9JTlRfVU5MT0NLKF9fbG9jaywgX19pcnFmbGFnKQkJCVwKK3sJCQkJCQkJCQkJCQkJXAorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoKHNwaW5sb2NrX3QgKikoX19sb2NrKSwgKCh1bnNpZ25lZCBsb25nKV9faXJxZmxhZykpOwlcCit9CisjZW5kaWYKKworCisKKyNpZmRlZiBSVDI4NzAKKy8vUGF0Y2ggZm9yIEFTSUMgdHVyc3QgcmVhZC93cml0ZSBidWcsIG5lZWRzIHRvIHJlbW92ZSBhZnRlciBtZXRlbCBmaXgKKyNkZWZpbmUgUlRNUF9JT19SRUFEMzIoX0EsIF9SLCBfcFYpCQkJCQkJCQlcCisJUlRVU0JSZWFkTUFDUmVnaXN0ZXIoX0EsIF9SLCBfcFYpCisKKyNkZWZpbmUgUlRNUF9JT19SRUFEOChfQSwgX1IsIF9wVikJCQkJCQkJCVwKK3sJCQkJCQkJCQkJCQkJCQkJXAorfQorCisjZGVmaW5lIFJUTVBfSU9fV1JJVEUzMihfQSwgX1IsIF9WKQkJCQkJCQkJXAorCVJUVVNCV3JpdGVNQUNSZWdpc3RlcihfQSwgX1IsIF9WKQorCisKKyNkZWZpbmUgUlRNUF9JT19XUklURTgoX0EsIF9SLCBfVikJCQkJCQkJCVwKK3sJCQkJCQkJCQkJCQkJCQkJXAorCVVTSE9SVAlfVmFsID0gX1Y7CQkJCQkJCQkJCQlcCisJUlRVU0JTaW5nbGVXcml0ZShfQSwgX1IsIF9WYWwpOwkJCQkJCQkJXAorfQorCisKKyNkZWZpbmUgUlRNUF9JT19XUklURTE2KF9BLCBfUiwgX1YpCQkJCQkJCQlcCit7CQkJCQkJCQkJCQkJCQkJCVwKKwlSVFVTQlNpbmdsZVdyaXRlKF9BLCBfUiwgX1YpOwkJCQkJCQkJXAorfQorI2VuZGlmIC8vIFJUMjg3MCAvLworCisjaWZuZGVmIHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0CisjZGVmaW5lIF9fd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQod3EsIGNvbmRpdGlvbiwgcmV0KSBcCitkbyB7IFwKKyAgICAgICAgd2FpdF9xdWV1ZV90IF9fd2FpdDsgXAorICAgICAgICBpbml0X3dhaXRxdWV1ZV9lbnRyeSgmX193YWl0LCBjdXJyZW50KTsgXAorICAgICAgICBhZGRfd2FpdF9xdWV1ZSgmd3EsICZfX3dhaXQpOyBcCisgICAgICAgIGZvciAoOzspIHsgXAorICAgICAgICAgICAgICAgIHNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7IFwKKyAgICAgICAgICAgICAgICBpZiAoY29uZGl0aW9uKSBcCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgXAorICAgICAgICAgICAgICAgIGlmICghc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gc2NoZWR1bGVfdGltZW91dChyZXQpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJldCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgXAorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7IFwKKyAgICAgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgICAgICByZXQgPSAtRVJFU1RBUlRTWVM7IFwKKyAgICAgICAgICAgICAgICBicmVhazsgXAorICAgICAgICB9IFwKKyAgICAgICAgY3VycmVudC0+c3RhdGUgPSBUQVNLX1JVTk5JTkc7IFwKKyAgICAgICAgcmVtb3ZlX3dhaXRfcXVldWUoJndxLCAmX193YWl0KTsgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dCh3cSwgY29uZGl0aW9uLCB0aW1lb3V0KSBcCisoeyBcCisgICAgICAgIGxvbmcgX19yZXQgPSB0aW1lb3V0OyBcCisgICAgICAgIGlmICghKGNvbmRpdGlvbikpIFwKKyAgICAgICAgICAgICAgICBfX3dhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KHdxLCBjb25kaXRpb24sIF9fcmV0KTsgXAorICAgICAgICBfX3JldDsgXAorfSkKKyNlbmRpZgorI2RlZmluZSBPTkVfVElDSyAxCisjZGVmaW5lIE9TX1dBSVQoX3RpbWUpIFwKK3sJaW50IF9pOyBcCisJbG9uZyBfbG9vcCA9ICgoX3RpbWUpLygxMDAwL09TX0haKSkgPiAwID8gKChfdGltZSkvKDEwMDAvT1NfSFopKSA6IDE7XAorCXdhaXRfcXVldWVfaGVhZF90IF93YWl0OyBcCisJaW5pdF93YWl0cXVldWVfaGVhZCgmX3dhaXQpOyBcCisJZm9yIChfaT0wOyBfaTwoX2xvb3ApOyBfaSsrKSBcCisJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KF93YWl0LCAwLCBPTkVfVElDSyk7IH0KKworCit0eXBlZGVmIHZvaWQgKCpUSU1FUl9GVU5DVElPTikodW5zaWduZWQgbG9uZyk7CisKKyNkZWZpbmUgQ09QWV9NQUNfQUREUihBZGRyMSwgQWRkcjIpICAgICAgICAgICAgIG1lbWNweSgoQWRkcjEpLCAoQWRkcjIpLCBNQUNfQUREUl9MRU4pCisKKyNkZWZpbmUgTWxtZUFsbG9jYXRlTWVtb3J5KF9wQWQsIF9wcFZBKSBvc19hbGxvY19tZW0oX3BBZCwgX3BwVkEsIE1HTVRfRE1BX0JVRkZFUl9TSVpFKQorI2RlZmluZSBNbG1lRnJlZU1lbW9yeShfcEFkLCBfcFZBKSAgICAgb3NfZnJlZV9tZW0oX3BBZCwgX3BWQSkKKworCisjaWZkZWYgUlQyODcwCisjZGVmaW5lIEJVSUxEX1RJTUVSX0ZVTkNUSU9OKF9mdW5jKQkJCQkJCQkJCQkJCQlcCit2b2lkIGxpbnV4XyMjX2Z1bmModW5zaWduZWQgbG9uZyBkYXRhKQkJCQkJCQkJCQkJCVwKK3sJCQkJCQkJCQkJCQkJCQkJCQkJCQlcCisJUFJBTElOS19USU1FUl9TVFJVQ1QJX3BUaW1lciA9IChQUkFMSU5LX1RJTUVSX1NUUlVDVClkYXRhOwkJCQkJXAorCVJUMjg3MF9USU1FUl9FTlRSWQkJKl9wUU5vZGU7CQkJCQkJCQkJCQkJXAorCVJUTVBfQURBUFRFUgkJCSpfcEFkOwkJCQkJCQkJCQkJCQlcCisJCQkJCQkJCQkJCQkJCQkJCQkJCVwKKwlfcFRpbWVyLT5oYW5kbGUgPSBfZnVuYzsJCQkJCQkJCQkJCQkJCQlcCisJX3BBZCA9IChSVE1QX0FEQVBURVIgKilfcFRpbWVyLT5wQWQ7CQkJCQkJCQkJCQkJXAorCV9wUU5vZGUgPSBSVDI4NzBfVGltZXJRX0luc2VydChfcEFkLCBfcFRpbWVyKTsgCQkJCQkJCQkJXAorCWlmICgoX3BRTm9kZSA9PSBOVUxMKSAmJiAoX3BBZC0+VGltZXJRLnN0YXR1cyAmIFJUMjg3MF9USFJFQURfQ0FOX0RPX0lOU0VSVCkpCVwKKwkJUlRNUF9PU19BZGRfVGltZXIoJl9wVGltZXItPlRpbWVyT2JqLCBIWik7ICAgICAgICAgICAgICAgCQkJCQlcCit9CisjZW5kaWYgLy8gUlQyODcwIC8vCisKKworI2RlZmluZSBERUNMQVJFX1RJTUVSX0ZVTkNUSU9OKF9mdW5jKQkJCVwKK3ZvaWQgbGludXhfIyNfZnVuYyh1bnNpZ25lZCBsb25nIGRhdGEpCisKKyNkZWZpbmUgR0VUX1RJTUVSX0ZVTkNUSU9OKF9mdW5jKQkJCQlcCisJCWxpbnV4XyMjX2Z1bmMKKworREVDTEFSRV9USU1FUl9GVU5DVElPTihNbG1lUGVyaW9kaWNFeGVjKTsKK0RFQ0xBUkVfVElNRVJfRlVOQ1RJT04oTWxtZVJzc2lSZXBvcnRFeGVjKTsKK0RFQ0xBUkVfVElNRVJfRlVOQ1RJT04oQXNpY1J4QW50RXZhbFRpbWVvdXQpOworREVDTEFSRV9USU1FUl9GVU5DVElPTihBUFNEUGVyaW9kaWNFeGVjKTsKK0RFQ0xBUkVfVElNRVJfRlVOQ1RJT04oQXNpY1JmVHVuaW5nRXhlYyk7CisjaWZkZWYgUlQyODcwCitERUNMQVJFX1RJTUVSX0ZVTkNUSU9OKEJlYWNvblVwZGF0ZUV4ZWMpOworI2VuZGlmIC8vIFJUMjg3MCAvLworCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKK0RFQ0xBUkVfVElNRVJfRlVOQ1RJT04oQmVhY29uVGltZW91dCk7CitERUNMQVJFX1RJTUVSX0ZVTkNUSU9OKFNjYW5UaW1lb3V0KTsKK0RFQ0xBUkVfVElNRVJfRlVOQ1RJT04oQXV0aFRpbWVvdXQpOworREVDTEFSRV9USU1FUl9GVU5DVElPTihBc3NvY1RpbWVvdXQpOworREVDTEFSRV9USU1FUl9GVU5DVElPTihSZWFzc29jVGltZW91dCk7CitERUNMQVJFX1RJTUVSX0ZVTkNUSU9OKERpc2Fzc29jVGltZW91dCk7CitERUNMQVJFX1RJTUVSX0ZVTkNUSU9OKExpbmtEb3duRXhlYyk7CisjaWZkZWYgTEVBUF9TVVBQT1JUCitERUNMQVJFX1RJTUVSX0ZVTkNUSU9OKExlYXBBdXRoVGltZW91dCk7CisjZW5kaWYKK0RFQ0xBUkVfVElNRVJfRlVOQ1RJT04oU3RhUXVpY2tSZXNwb25lRm9yUmF0ZVVwRXhlYyk7CitERUNMQVJFX1RJTUVSX0ZVTkNUSU9OKFdwYURpc2Fzc29jQXBBbmRCbG9ja0Fzc29jKTsKK0RFQ0xBUkVfVElNRVJfRlVOQ1RJT04oUHNQb2xsV2FrZUV4ZWMpOworREVDTEFSRV9USU1FUl9GVU5DVElPTihSYWRpb09uRXhlYyk7CisKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKK0RFQ0xBUkVfVElNRVJfRlVOQ1RJT04oRGxzVGltZW91dEFjdGlvbik7CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKK3ZvaWQgUlRNUF9HZXRDdXJyZW50U3lzdGVtVGltZShMQVJHRV9JTlRFR0VSICp0aW1lKTsKKworCisvKgorICogcGFja2V0IGhlbHBlcgorICogCS0gY29udmVydCBpbnRlcm5hbCBydCBwYWNrZXQgdG8gb3MgcGFja2V0IG9yCisgKiAgICAgICAgICAgICBvcyBwYWNrZXQgdG8gcnQgcGFja2V0CisgKi8KKyNkZWZpbmUgUlRQS1RfVE9fT1NQS1QoX3ApCQkoKHN0cnVjdCBza19idWZmICopKF9wKSkKKyNkZWZpbmUgT1NQS1RfVE9fUlRQS1QoX3ApCQkoKFBORElTX1BBQ0tFVCkoX3ApKQorCisjZGVmaW5lIEdFVF9PU19QS1RfREFUQVBUUihfcGt0KSBcCisJCShSVFBLVF9UT19PU1BLVChfcGt0KS0+ZGF0YSkKKworI2RlZmluZSBHRVRfT1NfUEtUX0xFTihfcGt0KSBcCisJCShSVFBLVF9UT19PU1BLVChfcGt0KS0+bGVuKQorCisjZGVmaW5lIEdFVF9PU19QS1RfREFUQVRBSUwoX3BrdCkgXAorCQkoUlRQS1RfVE9fT1NQS1QoX3BrdCktPnRhaWwpCisKKyNkZWZpbmUgR0VUX09TX1BLVF9IRUFEKF9wa3QpIFwKKwkJKFJUUEtUX1RPX09TUEtUKF9wa3QpLT5oZWFkKQorCisjZGVmaW5lIEdFVF9PU19QS1RfRU5EKF9wa3QpIFwKKwkJKFJUUEtUX1RPX09TUEtUKF9wa3QpLT5lbmQpCisKKyNkZWZpbmUgR0VUX09TX1BLVF9ORVRERVYoX3BrdCkgXAorCQkoUlRQS1RfVE9fT1NQS1QoX3BrdCktPmRldikKKworI2RlZmluZSBHRVRfT1NfUEtUX1RZUEUoX3BrdCkgXAorCQkoUlRQS1RfVE9fT1NQS1QoX3BrdCkpCisKKyNkZWZpbmUgR0VUX09TX1BLVF9ORVhUKF9wa3QpIFwKKwkJKFJUUEtUX1RPX09TUEtUKF9wa3QpLT5uZXh0KQorCisKKyNkZWZpbmUgT1NfTlRPSFMoX1ZhbCkgXAorCQkobnRvaHMoX1ZhbCkpCisjZGVmaW5lIE9TX0hUT05TKF9WYWwpIFwKKwkJKGh0b25zKF9WYWwpKQorI2RlZmluZSBPU19OVE9ITChfVmFsKSBcCisJCShudG9obChfVmFsKSkKKyNkZWZpbmUgT1NfSFRPTkwoX1ZhbCkgXAorCQkoaHRvbmwoX1ZhbCkpCisKKy8qIHN0YXRpc3RpY3MgY291bnRlciAqLworI2RlZmluZSBTVEFUU19JTkNfUlhfUEFDS0VUUyhfcEFkLCBfZGV2KQorI2RlZmluZSBTVEFUU19JTkNfVFhfUEFDS0VUUyhfcEFkLCBfZGV2KQorCisjZGVmaW5lIFNUQVRTX0lOQ19SWF9CWVRFU1MoX3BBZCwgX2RldiwgbGVuKQorI2RlZmluZSBTVEFUU19JTkNfVFhfQllURVNTKF9wQWQsIF9kZXYsIGxlbikKKworI2RlZmluZSBTVEFUU19JTkNfUlhfRVJST1JTKF9wQWQsIF9kZXYpCisjZGVmaW5lIFNUQVRTX0lOQ19UWF9FUlJPUlMoX3BBZCwgX2RldikKKworI2RlZmluZSBTVEFUU19JTkNfUlhfRFJPUFBFRChfcEFkLCBfZGV2KQorI2RlZmluZSBTVEFUU19JTkNfVFhfRFJPUFBFRChfcEFkLCBfZGV2KQorCisKKyNkZWZpbmUgQ0JfT0ZGICAxMAorCisKKy8vICAgY2hlY2sgRERLIE5ESVNfUEFDS0VUIGRhdGEgc3RydWN0dXJlIGFuZCBmaW5kIG91dCBvbmx5IE1pbmlwb3J0UmVzZXJ2ZWRFeFswLi43XSBjYW4gYmUgdXNlZCBieSBvdXIgZHJpdmVyIHdpdGhvdXQKKy8vICAgYW1iaWd1aXR5LiBGaWVsZHMgYWZ0ZXIgcFBhY2tldC0+TWluaXBvcnRSZXNlcnZlZEV4WzhdIG1heSBiZSB1c2VkIGJ5IG90aGVyIHdyYXBwZXIgbGF5ZXIgdGh1cyBjcmFzaGVzIHRoZSBkcml2ZXIKKy8vCisvLyNkZWZpbmUgUlRNUF9HRVRfUEFDS0VUX01SKF9wKQkJCShSVFBLVF9UT19PU1BLVChfcCkpCisKKy8vIFVzZXIgUHJpb3JpdHkKKyNkZWZpbmUgUlRNUF9TRVRfUEFDS0VUX1VQKF9wLCBfcHJpbykJCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMF0gPSBfcHJpbykKKyNkZWZpbmUgUlRNUF9HRVRfUEFDS0VUX1VQKF9wKQkJCQkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzBdKQorCisvLyBGcmFnbWVudCAjCisjZGVmaW5lIFJUTVBfU0VUX1BBQ0tFVF9GUkFHTUVOVFMoX3AsIF9udW0pCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMV0gPSBfbnVtKQorI2RlZmluZSBSVE1QX0dFVF9QQUNLRVRfRlJBR01FTlRTKF9wKQkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRisxXSkKKworLy8gMHgwIH4weDdmOiBUWCB0byBBUCdzIG93biBCU1Mgd2hpY2ggaGFzIHRoZSBzcGVjaWZpZWQgQUlELiBpZiBBSUQ+MTI3LCBzZXQgYml0IDcgaW4gUlRNUF9TRVRfUEFDS0VUX0VNQUNUQUIgdG9vLgorLy8odGhpcyB2YWx1ZSBhbHNvIGFzIE1BQyhvbi1jaGlwIFdDSUQpIHRhYmxlIGluZGV4KQorLy8gMHg4MH4weGZmOiBUWCB0byBhIFdEUyBsaW5rLiBiMH42OiBXRFMgaW5kZXgKKyNkZWZpbmUgUlRNUF9TRVRfUEFDS0VUX1dDSUQoX3AsIF93ZHNpZHgpCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMl0gPSBfd2RzaWR4KQorI2RlZmluZSBSVE1QX0dFVF9QQUNLRVRfV0NJRChfcCkgICAgICAgICAgCQkoKFVDSEFSKShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRisyXSkpCisKKy8vIDB4ZmY6IFBLVFNSQ19ORElTLCBvdGhlcnM6IGxvY2FsIFRYIGJ1ZmZlciBpbmRleC4gVGhpcyB2YWx1ZSBhZmZlY3RzIGhvdyB0byBhIHBhY2tldAorI2RlZmluZSBSVE1QX1NFVF9QQUNLRVRfU09VUkNFKF9wLCBfcGt0c3JjKQkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzNdID0gX3BrdHNyYykKKyNkZWZpbmUgUlRNUF9HRVRfUEFDS0VUX1NPVVJDRShfcCkgICAgICAgCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrM10pCisKKy8vIFJUUy9DVFMtdG8tc2VsZiBwcm90ZWN0aW9uIG1ldGhvZAorI2RlZmluZSBSVE1QX1NFVF9QQUNLRVRfUlRTKF9wLCBfbnVtKSAgICAgIAkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzRdID0gX251bSkKKyNkZWZpbmUgUlRNUF9HRVRfUEFDS0VUX1JUUyhfcCkgICAgICAgICAgCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrNF0pCisvLyBzZWUgUlRNUF9TKEcpRVRfUEFDS0VUX0VNQUNUQUIKKworLy8gVFggcmF0ZSBpbmRleAorI2RlZmluZSBSVE1QX1NFVF9QQUNLRVRfVFhSQVRFKF9wLCBfcmF0ZSkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRis1XSA9IF9yYXRlKQorI2RlZmluZSBSVE1QX0dFVF9QQUNLRVRfVFhSQVRFKF9wKQkJICAJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRis1XSkKKworLy8gRnJvbSB3aGljaCBJbnRlcmZhY2UKKyNkZWZpbmUgUlRNUF9TRVRfUEFDS0VUX0lGKF9wLCBfaWZkeCkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRis2XSA9IF9pZmR4KQorI2RlZmluZSBSVE1QX0dFVF9QQUNLRVRfSUYoX3ApCQkgIAkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzZdKQorI2RlZmluZSBSVE1QX1NFVF9QQUNLRVRfTkVUX0RFVklDRV9NQlNTSUQoX3AsIF9ic3MpCQlSVE1QX1NFVF9QQUNLRVRfSUYoKF9wKSwgKF9ic3MpKQorI2RlZmluZSBSVE1QX1NFVF9QQUNLRVRfTkVUX0RFVklDRV9XRFMoX3AsIF9ic3MpCQlSVE1QX1NFVF9QQUNLRVRfSUYoKF9wKSwgKChfYnNzKSArIE1JTl9ORVRfREVWSUNFX0ZPUl9XRFMpKQorI2RlZmluZSBSVE1QX1NFVF9QQUNLRVRfTkVUX0RFVklDRV9BUENMSShfcCwgX2lkeCkgICAJUlRNUF9TRVRfUEFDS0VUX0lGKChfcCksICgoX2lkeCkgKyBNSU5fTkVUX0RFVklDRV9GT1JfQVBDTEkpKQorI2RlZmluZSBSVE1QX1NFVF9QQUNLRVRfTkVUX0RFVklDRV9NRVNIKF9wLCBfaWR4KSAgIAlSVE1QX1NFVF9QQUNLRVRfSUYoKF9wKSwgKChfaWR4KSArIE1JTl9ORVRfREVWSUNFX0ZPUl9NRVNIKSkKKyNkZWZpbmUgUlRNUF9HRVRfUEFDS0VUX05FVF9ERVZJQ0VfTUJTU0lEKF9wKQkJCVJUTVBfR0VUX1BBQ0tFVF9JRigoX3ApKQorI2RlZmluZSBSVE1QX0dFVF9QQUNLRVRfTkVUX0RFVklDRShfcCkJCQkJCVJUTVBfR0VUX1BBQ0tFVF9JRigoX3ApKQorCisjZGVmaW5lIFJUTVBfU0VUX1BBQ0tFVF9NT1JFREFUQShfcCwgX21vcmViaXQpCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrN10gPSBfbW9yZWJpdCkKKyNkZWZpbmUgUlRNUF9HRVRfUEFDS0VUX01PUkVEQVRBKF9wKQkJCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrN10pCisKKy8vI2RlZmluZSBSVE1QX1NFVF9QQUNLRVRfTkVUX0RFVklDRV9NQlNTSUQoX3AsIF9ic3MpCShSVFBLVF9UT19PU1BLVChfcCktPmNiWzhdID0gX2JzcykKKy8vI2RlZmluZSBSVE1QX0dFVF9QQUNLRVRfTkVUX0RFVklDRV9NQlNTSUQoX3ApCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYls4XSkKKworCisKKworI2lmIDAKKy8vI2RlZmluZSBSVE1QX1NFVF9QQUNLRVRfREhDUChfcCwgX2ZsZykgICAJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzExXSA9IF9mbGcpCisvLyNkZWZpbmUgUlRNUF9HRVRfUEFDS0VUX0RIQ1AoX3ApICAgICAgICAgCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRisxMV0pCisjZWxzZQorLy8KKy8vCVNlcGNpZmljIFBha2NldCBUeXBlIGRlZmluaXRpb24KKy8vCisjZGVmaW5lIFJUTVBfUEFDS0VUX1NQRUNJRklDX0NCX09GRlNFVAkxMQorCisjZGVmaW5lIFJUTVBfUEFDS0VUX1NQRUNJRklDX0RIQ1AJCTB4MDEKKyNkZWZpbmUgUlRNUF9QQUNLRVRfU1BFQ0lGSUNfRUFQT0wJCTB4MDIKKyNkZWZpbmUgUlRNUF9QQUNLRVRfU1BFQ0lGSUNfSVBWNAkJMHgwNAorI2RlZmluZSBSVE1QX1BBQ0tFVF9TUEVDSUZJQ19XQUkJCTB4MDgKKyNkZWZpbmUgUlRNUF9QQUNLRVRfU1BFQ0lGSUNfVkxBTgkJMHgxMAorI2RlZmluZSBSVE1QX1BBQ0tFVF9TUEVDSUZJQ19MTENTTkFQCTB4MjAKKworLy9TcGVjaWZpYworI2RlZmluZSBSVE1QX1NFVF9QQUNLRVRfU1BFQ0lGSUMoX3AsIF9mbGcpCSAgIAkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMTFdID0gX2ZsZykKKworLy9ESENQCisjZGVmaW5lIFJUTVBfU0VUX1BBQ0tFVF9ESENQKF9wLCBfZmxnKSAgIAkJCQkJCQkJCQkJCQlcCisJCQlkb3sJCQkJCQkJCQkJCQkJCQkJCQkJCVwKKwkJCQlpZiAoX2ZsZykJCQkJCQkJCQkJCQkJCQkJCVwKKwkJCQkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzExXSkgfD0gKFJUTVBfUEFDS0VUX1NQRUNJRklDX0RIQ1ApOwkJXAorCQkJCWVsc2UJCQkJCQkJCQkJCQkJCQkJCQlcCisJCQkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRisxMV0pICY9ICghUlRNUF9QQUNLRVRfU1BFQ0lGSUNfREhDUCk7CVwKKwkJCX13aGlsZSgwKQorI2RlZmluZSBSVE1QX0dFVF9QQUNLRVRfREhDUChfcCkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRisxMV0gJiBSVE1QX1BBQ0tFVF9TUEVDSUZJQ19ESENQKQorCisvL0VBUE9MCisjZGVmaW5lIFJUTVBfU0VUX1BBQ0tFVF9FQVBPTChfcCwgX2ZsZykgICAJCQkJCQkJCQkJCQkJXAorCQkJZG97CQkJCQkJCQkJCQkJCQkJCQkJCQlcCisJCQkJaWYgKF9mbGcpCQkJCQkJCQkJCQkJCQkJCQlcCisJCQkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRisxMV0pIHw9IChSVE1QX1BBQ0tFVF9TUEVDSUZJQ19FQVBPTCk7CQlcCisJCQkJZWxzZQkJCQkJCQkJCQkJCQkJCQkJCVwKKwkJCQkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzExXSkgJj0gKCFSVE1QX1BBQ0tFVF9TUEVDSUZJQ19FQVBPTCk7CVwKKwkJCX13aGlsZSgwKQorI2RlZmluZSBSVE1QX0dFVF9QQUNLRVRfRUFQT0woX3ApCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMTFdICYgUlRNUF9QQUNLRVRfU1BFQ0lGSUNfRUFQT0wpCisKKy8vV0FJCisjZGVmaW5lIFJUTVBfU0VUX1BBQ0tFVF9XQUkoX3AsIF9mbGcpICAgCQkJCQkJCQkJCQkJCVwKKwkJCWRvewkJCQkJCQkJCQkJCQkJCQkJCQkJXAorCQkJCWlmIChfZmxnKQkJCQkJCQkJCQkJCQkJCQkJXAorCQkJCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMTFdKSB8PSAoUlRNUF9QQUNLRVRfU1BFQ0lGSUNfV0FJKTsJCVwKKwkJCQllbHNlCQkJCQkJCQkJCQkJCQkJCQkJXAorCQkJCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMTFdKSAmPSAoIVJUTVBfUEFDS0VUX1NQRUNJRklDX1dBSSk7CVwKKwkJCX13aGlsZSgwKQorI2RlZmluZSBSVE1QX0dFVF9QQUNLRVRfV0FJKF9wKQkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzExXSAmIFJUTVBfUEFDS0VUX1NQRUNJRklDX1dBSSkKKworI2RlZmluZSBSVE1QX0dFVF9QQUNLRVRfTE9XUkFURShfcCkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRisxMV0gJiAoUlRNUF9QQUNLRVRfU1BFQ0lGSUNfRUFQT0wgfCBSVE1QX1BBQ0tFVF9TUEVDSUZJQ19ESENQIHwgUlRNUF9QQUNLRVRfU1BFQ0lGSUNfV0FJKSkKKworLy9WTEFOCisjZGVmaW5lIFJUTVBfU0VUX1BBQ0tFVF9WTEFOKF9wLCBfZmxnKSAgIAkJCQkJCQkJCQkJCQlcCisJCQlkb3sJCQkJCQkJCQkJCQkJCQkJCQkJCVwKKwkJCQlpZiAoX2ZsZykJCQkJCQkJCQkJCQkJCQkJCVwKKwkJCQkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzExXSkgfD0gKFJUTVBfUEFDS0VUX1NQRUNJRklDX1ZMQU4pOwkJXAorCQkJCWVsc2UJCQkJCQkJCQkJCQkJCQkJCQlcCisJCQkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRisxMV0pICY9ICghUlRNUF9QQUNLRVRfU1BFQ0lGSUNfVkxBTik7CVwKKwkJCX13aGlsZSgwKQorI2RlZmluZSBSVE1QX0dFVF9QQUNLRVRfVkxBTihfcCkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRisxMV0gJiBSVE1QX1BBQ0tFVF9TUEVDSUZJQ19WTEFOKQorCisvL0xMQy9TTkFQCisjZGVmaW5lIFJUTVBfU0VUX1BBQ0tFVF9MTENTTkFQKF9wLCBfZmxnKSAgIAkJCQkJCQkJCQkJCQlcCisJCQlkb3sJCQkJCQkJCQkJCQkJCQkJCQkJCVwKKwkJCQlpZiAoX2ZsZykJCQkJCQkJCQkJCQkJCQkJCVwKKwkJCQkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzExXSkgfD0gKFJUTVBfUEFDS0VUX1NQRUNJRklDX0xMQ1NOQVApOwkJXAorCQkJCWVsc2UJCQkJCQkJCQkJCQkJCQkJCQlcCisJCQkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRisxMV0pICY9ICghUlRNUF9QQUNLRVRfU1BFQ0lGSUNfTExDU05BUCk7CQlcCisJCQl9d2hpbGUoMCkKKworI2RlZmluZSBSVE1QX0dFVF9QQUNLRVRfTExDU05BUChfcCkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRisxMV0gJiBSVE1QX1BBQ0tFVF9TUEVDSUZJQ19MTENTTkFQKQorCisvLyBJUAorI2RlZmluZSBSVE1QX1NFVF9QQUNLRVRfSVBWNChfcCwgX2ZsZykJCQkJCQkJCQkJCQkJCVwKKwkJCWRvewkJCQkJCQkJCQkJCQkJCQkJCQkJXAorCQkJCWlmIChfZmxnKQkJCQkJCQkJCQkJCQkJCQkJXAorCQkJCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMTFdKSB8PSAoUlRNUF9QQUNLRVRfU1BFQ0lGSUNfSVBWNCk7CQlcCisJCQkJZWxzZQkJCQkJCQkJCQkJCQkJCQkJCVwKKwkJCQkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzExXSkgJj0gKCFSVE1QX1BBQ0tFVF9TUEVDSUZJQ19JUFY0KTsJXAorCQkJfXdoaWxlKDApCisKKyNkZWZpbmUgUlRNUF9HRVRfUEFDS0VUX0lQVjQoX3ApCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMTFdICYgUlRNUF9QQUNLRVRfU1BFQ0lGSUNfSVBWNCkKKworI2VuZGlmCisKKworLy8gSWYgdGhpcyBmbGFnIGlzIHNldCwgaXQgaW5kaWNhdGVzIHRoYXQgdGhpcyBFQVBvTCBmcmFtZSBNVVNUIGJlIGNsZWFyLgorI2RlZmluZSBSVE1QX1NFVF9QQUNLRVRfQ0xFQVJfRUFQX0ZSQU1FKF9wLCBfZmxnKSAgIChSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRisxMl0gPSBfZmxnKQorI2RlZmluZSBSVE1QX0dFVF9QQUNLRVRfQ0xFQVJfRUFQX0ZSQU1FKF9wKSAgICAgICAgIChSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRisxMl0pCisKKyNkZWZpbmUgUlRNUF9TRVRfUEFDS0VUXzVWVChfcCwgX2ZsZykgICAoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMjJdID0gX2ZsZykKKyNkZWZpbmUgUlRNUF9HRVRfUEFDS0VUXzVWVChfcCkgICAgICAgICAoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMjJdKQorCisKKyNpZmRlZiBDT05GSUdfNVZUX0VOSEFOQ0UKKyNkZWZpbmUgQlJJREdFX1RBRyAweDM1NTY0MjUyICAgIC8vIGRlcGVuZHMgb24gNVZUIGRlZmluZSBpbiBicl9pbnB1dC5jCisjZW5kaWYKKworCisjZGVmaW5lIE5ESVNfU0VUX1BBQ0tFVF9TVEFUVVMoX3AsIF9zdGF0dXMpCisKKworI2RlZmluZSBHRVRfU0dfTElTVF9GUk9NX1BBQ0tFVChfcCwgX3NjKQlcCisgICAgcnRfZ2V0X3NnX2xpc3RfZnJvbV9wYWNrZXQoX3AsIF9zYykKKworCisjZGVmaW5lIE5kaXNNb3ZlTWVtb3J5KERlc3RpbmF0aW9uLCBTb3VyY2UsIExlbmd0aCkgbWVtbW92ZShEZXN0aW5hdGlvbiwgU291cmNlLCBMZW5ndGgpCisjZGVmaW5lIE5kaXNaZXJvTWVtb3J5KERlc3RpbmF0aW9uLCBMZW5ndGgpICAgICAgICAgbWVtc2V0KERlc3RpbmF0aW9uLCAwLCBMZW5ndGgpCisjZGVmaW5lIE5kaXNGaWxsTWVtb3J5KERlc3RpbmF0aW9uLCBMZW5ndGgsIEZpbGwpICAgbWVtc2V0KERlc3RpbmF0aW9uLCBGaWxsLCBMZW5ndGgpCisjZGVmaW5lIE5kaXNFcXVhbE1lbW9yeShTb3VyY2UxLCBTb3VyY2UyLCBMZW5ndGgpICAgKCFtZW1jbXAoU291cmNlMSwgU291cmNlMiwgTGVuZ3RoKSkKKyNkZWZpbmUgUlRNUEVxdWFsTWVtb3J5KFNvdXJjZTEsIFNvdXJjZTIsIExlbmd0aCkJKCFtZW1jbXAoU291cmNlMSwgU291cmNlMiwgTGVuZ3RoKSkKKworCisjZGVmaW5lIFJUTVBfSU5DX1JFRihfQSkJCTAKKyNkZWZpbmUgUlRNUF9ERUNfUkVGKF9BKQkJMAorI2RlZmluZSBSVE1QX0dFVF9SRUYoX0EpCQkwCisKKworCisvKgorICogVUxPTkcKKyAqIFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzTG93KAorICogICBJTiBORElTX1BIWVNJQ0FMX0FERFJFU1MgIFBoeXNpY2FsQWRkcmVzcyk7CisgKi8KKyNkZWZpbmUgUlRNUF9HZXRQaHlzaWNhbEFkZHJlc3NMb3coUGh5c2ljYWxBZGRyZXNzKQkJKFBoeXNpY2FsQWRkcmVzcykKKworLyoKKyAqIFVMT05HCisgKiBSVE1QX0dldFBoeXNpY2FsQWRkcmVzc0hpZ2goCisgKiAgIElOIE5ESVNfUEhZU0lDQUxfQUREUkVTUyAgUGh5c2ljYWxBZGRyZXNzKTsKKyAqLworI2RlZmluZSBSVE1QX0dldFBoeXNpY2FsQWRkcmVzc0hpZ2goUGh5c2ljYWxBZGRyZXNzKQkJKDApCisKKy8qCisgKiBWT0lECisgKiBSVE1QX1NldFBoeXNpY2FsQWRkcmVzc0xvdygKKyAqICAgSU4gTkRJU19QSFlTSUNBTF9BRERSRVNTICBQaHlzaWNhbEFkZHJlc3MsCisgKiAgIElOIFVMT05HICBWYWx1ZSk7CisgKi8KKyNkZWZpbmUgUlRNUF9TZXRQaHlzaWNhbEFkZHJlc3NMb3coUGh5c2ljYWxBZGRyZXNzLCBWYWx1ZSkJXAorCQkJUGh5c2ljYWxBZGRyZXNzID0gVmFsdWU7CisKKy8qCisgKiBWT0lECisgKiBSVE1QX1NldFBoeXNpY2FsQWRkcmVzc0hpZ2goCisgKiAgIElOIE5ESVNfUEhZU0lDQUxfQUREUkVTUyAgUGh5c2ljYWxBZGRyZXNzLAorICogICBJTiBVTE9ORyAgVmFsdWUpOworICovCisjZGVmaW5lIFJUTVBfU2V0UGh5c2ljYWxBZGRyZXNzSGlnaChQaHlzaWNhbEFkZHJlc3MsIFZhbHVlKQorCisKKy8vQ09OVEFJTklOR19SRUNPUkQocEVudHJ5LCBORElTX1BBQ0tFVCwgTWluaXBvcnRSZXNlcnZlZEV4KTsKKyNkZWZpbmUgUVVFVUVfRU5UUllfVE9fUEFDS0VUKHBFbnRyeSkgXAorCShQTkRJU19QQUNLRVQpKHBFbnRyeSkKKworI2RlZmluZSBQQUNLRVRfVE9fUVVFVUVfRU5UUlkocFBhY2tldCkgXAorCShQUVVFVUVfRU5UUlkpKHBQYWNrZXQpCisKKworI2lmbmRlZiBDT05UQUlOSU5HX1JFQ09SRAorI2RlZmluZSBDT05UQUlOSU5HX1JFQ09SRChhZGRyZXNzLCB0eXBlLCBmaWVsZCkJCQlcCisoKHR5cGUgKikoKFBDSEFSKShhZGRyZXNzKSAtIG9mZnNldG9mKHR5cGUsIGZpZWxkKSkpCisjZW5kaWYKKworCisjZGVmaW5lIFJFTEVBU0VfTkRJU19QQUNLRVQoX3BBZCwgX3BQYWNrZXQsIF9TdGF0dXMpICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFJUTVBGcmVlTmRpc1BhY2tldChfcEFkLCBfcFBhY2tldCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKworI2RlZmluZSBTV0lUQ0hfUGh5QUIoX3BBQSwgX3BCQikgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBVTE9ORwlBQUJhc2VQYUhpZ2g7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFVMT05HCUFBQmFzZVBhTG93OyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBVTE9ORwlCQkJhc2VQYUhpZ2g7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFVMT05HCUJCQmFzZVBhTG93OyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBCQkJhc2VQYUhpZ2ggPSBSVE1QX0dldFBoeXNpY2FsQWRkcmVzc0hpZ2goX3BCQik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBCQkJhc2VQYUxvdyA9IFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzTG93KF9wQkIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQUFCYXNlUGFIaWdoID0gUlRNUF9HZXRQaHlzaWNhbEFkZHJlc3NIaWdoKF9wQUEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQUFCYXNlUGFMb3cgPSBSVE1QX0dldFBoeXNpY2FsQWRkcmVzc0xvdyhfcEFBKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFJUTVBfU2V0UGh5c2ljYWxBZGRyZXNzSGlnaChfcEFBLCBCQkJhc2VQYUhpZ2gpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgUlRNUF9TZXRQaHlzaWNhbEFkZHJlc3NMb3coX3BBQSwgQkJCYXNlUGFMb3cpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgUlRNUF9TZXRQaHlzaWNhbEFkZHJlc3NIaWdoKF9wQkIsIEFBQmFzZVBhSGlnaCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBSVE1QX1NldFBoeXNpY2FsQWRkcmVzc0xvdyhfcEJCLCBBQUJhc2VQYUxvdyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworCisjZGVmaW5lIE5kaXNXcml0ZUVycm9yTG9nRW50cnkoX2EsIF9iLCBfYywgX2QpCisjZGVmaW5lIE5kaXNNQWxsb2NhdGVNYXBSZWdpc3RlcnMoX2EsIF9iLCBfYywgX2QsIF9lKQkJTkRJU19TVEFUVVNfU1VDQ0VTUworCisKKyNkZWZpbmUgTmRpc0FjcXVpcmVTcGluTG9jawkJUlRNUF9TRU1fTE9DSworI2RlZmluZSBOZGlzUmVsZWFzZVNwaW5Mb2NrCQlSVE1QX1NFTV9VTkxPQ0sKKworc3RhdGljIGlubGluZSB2b2lkIE5kaXNHZXRTeXN0ZW1VcFRpbWUoVUxPTkcgKnRpbWUpCit7CisJKnRpbWUgPSBqaWZmaWVzOworfQorCisvL3BQYWNrZXQgPSBDT05UQUlOSU5HX1JFQ09SRChwRW50cnksIE5ESVNfUEFDS0VULCBNaW5pcG9ydFJlc2VydmVkRXgpOworI2RlZmluZSBRVUVVRV9FTlRSWV9UT19QS1QocEVudHJ5KSBcCisJCSgoUE5ESVNfUEFDS0VUKSAocEVudHJ5KSkKKworaW50IHJ0Mjh4eF9wYWNrZXRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKKworCisKK3ZvaWQgcnRtcF9vc190aHJlYWRfaW5pdChQVUNIQVIgcFRocmVhZE5hbWUsIFBWT0lEIHBOb3RpZnkpOworCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvcnRfbWFpbl9kZXYuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvcnRfbWFpbl9kZXYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTNlY2VhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9ydF9tYWluX2Rldi5jCkBAIC0wLDAgKzEsMTg2MyBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICBNb2R1bGUgTmFtZToKKyAgICBydF9tYWluX2Rldi5jCisKKyAgICBBYnN0cmFjdDoKKyAgICBDcmVhdGUgYW5kIHJlZ2lzdGVyIG5ldHdvcmsgaW50ZXJmYWNlLgorCisgICAgUmV2aXNpb24gSGlzdG9yeToKKyAgICBXaG8gICAgICAgICBXaGVuICAgICAgICAgICAgV2hhdAorICAgIC0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJU2FtcGxlCQlNYXIvMjEvMDcJCU1lcmdlIFJUMjg3MCBhbmQgUlQyODYwIGRyaXZlcnMuCisqLworCisjaW5jbHVkZSAicnRfY29uZmlnLmgiCisKKyNkZWZpbmUgRk9SVFlfTUhaX0lOVE9MRVJBTlRfSU5URVJWQUwJKDYwKjEwMDApIC8vIDEgbWluCisKKyNpZmRlZiBNVUxUSVBMRV9DQVJEX1NVUFBPUlQKKy8vIHJlY29yZCB3aGV0aGVyIHRoZSBjYXJkIGluIHRoZSBjYXJkIGxpc3QgaXMgdXNlZCBpbiB0aGUgY2FyZCBmaWxlCitVSU5UOCAgTUNfQ2FyZFVzZWRbTUFYX05VTV9PRl9NVUxUSVBMRV9DQVJEXTsKKy8vIHJlY29yZCB1c2VkIGNhcmQgbWFjIGFkZHJlc3MgaW4gdGhlIGNhcmQgbGlzdAorc3RhdGljIFVJTlQ4ICBNQ19DYXJkTWFjW01BWF9OVU1fT0ZfTVVMVElQTEVfQ0FSRF1bNl07CisjZW5kaWYgLy8gTVVMVElQTEVfQ0FSRF9TVVBQT1JUIC8vCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgVmFyaWFibGVzIFVzZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8vc3RhdGljIFJBTElOS19USU1FUl9TVFJVQ1QgICAgIFBlcmlvZGljVGltZXI7CisKK2NoYXIgKm1hYyA9ICIiOwkJICAgLy8gZGVmYXVsdCAwMDowMDowMDowMDowMDowMAorY2hhciAqaG9zdG5hbWUgPSAiIjsKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPD0gS0VSTkVMX1ZFUlNJT04oMiw2LDEyKQorTU9EVUxFX1BBUk0gKG1hYywgInMiKTsKKyNlbHNlCittb2R1bGVfcGFyYW0gKG1hYywgY2hhcnAsIDApOworI2VuZGlmCitNT0RVTEVfUEFSTV9ERVNDIChtYWMsICJydDI4eHg6IHdpcmVsZXNzIG1hYyBhZGRyIik7CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJvdG90eXBlcyBvZiBGdW5jdGlvbnMgVXNlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmZGVmIERPVDExX05fU1VQUE9SVAorZXh0ZXJuIEJPT0xFQU4gYmFfcmVvcmRlcmluZ19yZXNvdXJjZV9pbml0KFBSVE1QX0FEQVBURVIgcEFkLCBpbnQgbnVtKTsKK2V4dGVybiB2b2lkIGJhX3Jlb3JkZXJpbmdfcmVzb3VyY2VfcmVsZWFzZShQUlRNUF9BREFQVEVSIHBBZCk7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCitleHRlcm4gTkRJU19TVEFUVVMgTklDTG9hZFJhdGVTd2l0Y2hpbmdQYXJhbXMoSU4gUFJUTVBfQURBUFRFUiBwQWQpOworCisKKy8vIHB1YmxpYyBmdW5jdGlvbiBwcm90b3R5cGUKK0lOVCBfX2RldmluaXQgcnQyOHh4X3Byb2JlKElOIHZvaWQgKl9kZXZfcCwgSU4gdm9pZCAqX2Rldl9pZF9wLAorCQkJCQkJCUlOIFVJTlQgYXJnYywgT1VUIFBSVE1QX0FEQVBURVIgKnBwQWQpOworCisvLyBwcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZQorc3RhdGljIGludCBydDI4eHhfaW5pdChJTiBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2Rldik7CitJTlQgcnQyOHh4X3NlbmRfcGFja2V0cyhJTiBzdHJ1Y3Qgc2tfYnVmZiAqc2tiX3AsIElOIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2KTsKKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8PSAweDIwNDAyCS8vIFJlZCBIYXQgNy4xCitzdHJ1Y3QgbmV0X2RldmljZSAqYWxsb2NfbmV0ZGV2KAorCWludCBzaXplb2ZfcHJpdiwKKwljb25zdCBjaGFyICptYXNrLAorCXZvaWQgKCpzZXR1cCkoc3RydWN0IG5ldF9kZXZpY2UgKikpOworI2VuZGlmIC8vIExJTlVYX1ZFUlNJT05fQ09ERSAvLworCitzdGF0aWMgdm9pZCBDZmdJbml0SG9vayhQUlRNUF9BREFQVEVSIHBBZCk7CisvL3N0YXRpYyBCT09MRUFOIFJUMjhYWEF2YWlsUkFOYW1lQXNzaWduKElOIENIQVIgKm5hbWVfcCk7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKK2V4dGVybgljb25zdCBzdHJ1Y3QgaXdfaGFuZGxlcl9kZWYgcnQyOHh4X2l3X2hhbmRsZXJfZGVmOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisjaWYgV0lSRUxFU1NfRVhUID49IDEyCisvLyBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIHdoZW4gcXVlcnkgL3Byb2MKK3N0cnVjdCBpd19zdGF0aXN0aWNzICpydDI4eHhfZ2V0X3dpcmVsZXNzX3N0YXRzKAorICAgIElOIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2KTsKKyNlbmRpZgorCitzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqUlQyOHh4X2dldF9ldGhlcl9zdGF0cygKKyAgICBJTiAgc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpOworCisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgIENsb3NlIHJheHggaW50ZXJmYWNlLgorCitBcmd1bWVudHM6CisJKm5ldF9kZXYJCQl0aGUgcmF4eCBpbnRlcmZhY2UgcG9pbnRlcgorCitSZXR1cm4gVmFsdWU6CisgICAgMAkJCQkJT3BlbiBPSworCW90aGVyd2lzZQkJCU9wZW4gRmFpbAorCitOb3RlOgorCTEuIGlmIG9wZW4gZmFpbCwga2VybmVsIHdpbGwgbm90IGNhbGwgdGhlIGNsb3NlIGZ1bmN0aW9uLgorCTIuIEZyZWUgbWVtb3J5IGZvcgorCQkoMSkgTWxtZSBNZW1vcnkgSGFuZGxlcjoJCU1sbWVIYWx0KCkKKwkJKDIpIFRYICYgUlg6CQkJCQlSVE1QRnJlZVR4UnhSaW5nTWVtb3J5KCkKKwkJKDMpIEJBIFJlb3JkZXJpbmc6IAkJCQliYV9yZW9yZGVyaW5nX3Jlc291cmNlX3JlbGVhc2UoKQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworaW50IE1haW5WaXJ0dWFsSUZfY2xvc2UoSU4gc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpCit7CisgICAgUlRNUF9BREFQVEVSICpwQWQgPSBuZXRfZGV2LT5tbF9wcml2OworCisJLy8gU2FuaXR5IGNoZWNrIGZvciBwQWQKKwlpZiAocEFkID09IE5VTEwpCisJCXJldHVybiAwOyAvLyBjbG9zZSBvaworCisJbmV0aWZfY2Fycmllcl9vZmYocEFkLT5uZXRfZGV2KTsKKwluZXRpZl9zdG9wX3F1ZXVlKHBBZC0+bmV0X2Rldik7CisKKworCisJVklSVFVBTF9JRl9ET1dOKHBBZCk7CisKKwlSVF9NT0RfREVDX1VTRV9DT1VOVCgpOworCisJcmV0dXJuIDA7IC8vIGNsb3NlIG9rCit9CisKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1JvdXRpbmUgRGVzY3JpcHRpb246CisgICAgT3BlbiByYXh4IGludGVyZmFjZS4KKworQXJndW1lbnRzOgorCSpuZXRfZGV2CQkJdGhlIHJheHggaW50ZXJmYWNlIHBvaW50ZXIKKworUmV0dXJuIFZhbHVlOgorICAgIDAJCQkJCU9wZW4gT0sKKwlvdGhlcndpc2UJCQlPcGVuIEZhaWwKKworTm90ZToKKwkxLiBpZiBvcGVuIGZhaWwsIGtlcm5lbCB3aWxsIG5vdCBjYWxsIHRoZSBjbG9zZSBmdW5jdGlvbi4KKwkyLiBGcmVlIG1lbW9yeSBmb3IKKwkJKDEpIE1sbWUgTWVtb3J5IEhhbmRsZXI6CQlNbG1lSGFsdCgpCisJCSgyKSBUWCAmIFJYOgkJCQkJUlRNUEZyZWVUeFJ4UmluZ01lbW9yeSgpCisJCSgzKSBCQSBSZW9yZGVyaW5nOiAJCQkJYmFfcmVvcmRlcmluZ19yZXNvdXJjZV9yZWxlYXNlKCkKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK2ludCBNYWluVmlydHVhbElGX29wZW4oSU4gc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpCit7CisgICAgUlRNUF9BREFQVEVSICpwQWQgPSBuZXRfZGV2LT5tbF9wcml2OworCisJLy8gU2FuaXR5IGNoZWNrIGZvciBwQWQKKwlpZiAocEFkID09IE5VTEwpCisJCXJldHVybiAwOyAvLyBjbG9zZSBvaworCisJaWYgKFZJUlRVQUxfSUZfVVAocEFkKSAhPSAwKQorCQlyZXR1cm4gLTE7CisKKwkvLyBpbmNyZWFzZSBNT0RVTEUgdXNlIGNvdW50CisJUlRfTU9EX0lOQ19VU0VfQ09VTlQoKTsKKworCW5ldGlmX3N0YXJ0X3F1ZXVlKG5ldF9kZXYpOworCW5ldGlmX2NhcnJpZXJfb24obmV0X2Rldik7CisJbmV0aWZfd2FrZV9xdWV1ZShuZXRfZGV2KTsKKworCXJldHVybiAwOworfQorCisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgIENsb3NlIHJheHggaW50ZXJmYWNlLgorCitBcmd1bWVudHM6CisJKm5ldF9kZXYJCQl0aGUgcmF4eCBpbnRlcmZhY2UgcG9pbnRlcgorCitSZXR1cm4gVmFsdWU6CisgICAgMAkJCQkJT3BlbiBPSworCW90aGVyd2lzZQkJCU9wZW4gRmFpbAorCitOb3RlOgorCTEuIGlmIG9wZW4gZmFpbCwga2VybmVsIHdpbGwgbm90IGNhbGwgdGhlIGNsb3NlIGZ1bmN0aW9uLgorCTIuIEZyZWUgbWVtb3J5IGZvcgorCQkoMSkgTWxtZSBNZW1vcnkgSGFuZGxlcjoJCU1sbWVIYWx0KCkKKwkJKDIpIFRYICYgUlg6CQkJCQlSVE1QRnJlZVR4UnhSaW5nTWVtb3J5KCkKKwkJKDMpIEJBIFJlb3JkZXJpbmc6IAkJCQliYV9yZW9yZGVyaW5nX3Jlc291cmNlX3JlbGVhc2UoKQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworaW50IHJ0Mjh4eF9jbG9zZShJTiBQTkVUX0RFViBkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKiBuZXRfZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopZGV2OworICAgIFJUTVBfQURBUFRFUgkqcEFkID0gbmV0X2Rldi0+bWxfcHJpdjsKKwlCT09MRUFOIAkJQ2FuY2VsbGVkID0gRkFMU0U7CisJVUlOVDMyCQkJaSA9IDA7CisjaWZkZWYgUlQyODcwCisJREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQodW5saW5rX3dha2V1cCk7CisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisKKwkvL1JUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JFTU9WRV9JTl9QUk9HUkVTUyk7CisjZW5kaWYgLy8gUlQyODcwIC8vCisKKworICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT4gcnQyOHh4X2Nsb3NlXG4iKSk7CisKKwkvLyBTYW5pdHkgY2hlY2sgZm9yIHBBZAorCWlmIChwQWQgPT0gTlVMTCkKKwkJcmV0dXJuIDA7IC8vIGNsb3NlIG9rCisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJeworCisJCS8vIElmIGRpcnZlciBkb2Vzbid0IHdha2UgdXAgZmlybXdhcmUgaGVyZSwKKwkJLy8gTklDTG9hZEZpcm13YXJlIHdpbGwgaGFuZyBmb3JldmVyIHdoZW4gaW50ZXJmYWNlIGlzIHVwIGFnYWluLgorCQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKSkKKyAgICAgICAgeworCQkgICAgQXNpY0ZvcmNlV2FrZXVwKHBBZCwgVFJVRSk7CisgICAgICAgIH0KKworI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCQkvLyBzZW5kIERMUy1URUFSX0RPV04gbWVzc2FnZSwKKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJETFNDYXBhYmxlKQorCQl7CisJCQlVQ0hBUiBpOworCisJCQkvLyB0ZWFyIGRvd24gbG9jYWwgZGxzIHRhYmxlIGVudHJ5CisJCQlmb3IgKGk9MDsgaTxNQVhfTlVNX09GX0lOSVRfRExTX0VOVFJZOyBpKyspCisJCQl7CisJCQkJaWYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkICYmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPT0gRExTX0ZJTklTSCkpCisJCQkJeworCQkJCQlSVE1QU2VuZERMU1RlYXJEb3duRnJhbWUocEFkLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKTsKKwkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzCT0gRExTX05PTkU7CisJCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkCT0gRkFMU0U7CisJCQkJfQorCQkJfQorCisJCQkvLyB0ZWFyIGRvd24gcGVlciBkbHMgdGFibGUgZW50cnkKKwkJCWZvciAoaT1NQVhfTlVNX09GX0lOSVRfRExTX0VOVFJZOyBpPE1BWF9OVU1fT0ZfRExTX0VOVFJZOyBpKyspCisJCQl7CisJCQkJaWYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkICYmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPT0gRExTX0ZJTklTSCkpCisJCQkJeworCQkJCQlSVE1QU2VuZERMU1RlYXJEb3duRnJhbWUocEFkLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKTsKKwkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID0gRExTX05PTkU7CisJCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkCT0gRkFMU0U7CisJCQkJfQorCQkJfQorCQkJUlQyOFhYX01MTUVfSEFORExFUihwQWQpOworCQl9CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisKKwkJaWYgKElORlJBX09OKHBBZCkgJiYKKwkJCSghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSkKKwkJeworCQkJTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNUCURpc1JlcTsKKwkJCU1MTUVfUVVFVUVfRUxFTSAqTXNnRWxlbSA9IChNTE1FX1FVRVVFX0VMRU0gKikga21hbGxvYyhzaXplb2YoTUxNRV9RVUVVRV9FTEVNKSwgTUVNX0FMTE9DX0ZMQUcpOworCisJCQlDT1BZX01BQ19BRERSKERpc1JlcS5BZGRyLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisJCQlEaXNSZXEuUmVhc29uID0gIFJFQVNPTl9ERUFVVEhfU1RBX0xFQVZJTkc7CisKKwkJCU1zZ0VsZW0tPk1hY2hpbmUgPSBBU1NPQ19TVEFURV9NQUNISU5FOworCQkJTXNnRWxlbS0+TXNnVHlwZSA9IE1UMl9NTE1FX0RJU0FTU09DX1JFUTsKKwkJCU1zZ0VsZW0tPk1zZ0xlbiA9IHNpemVvZihNTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1QpOworCQkJTmRpc01vdmVNZW1vcnkoTXNnRWxlbS0+TXNnLCAmRGlzUmVxLCBzaXplb2YoTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNUKSk7CisKKwkJCS8vIFByZXZlbnQgdG8gY29ubmVjdCBBUCBhZ2FpbiBpbiBTVEFNbG1lUGVyaW9kaWNFeGVjCisJCQlwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWRMZW49IDMyOworCQkJTmRpc1plcm9NZW1vcnkocEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkLCBwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWRMZW4pOworCisJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX09JRF9ESVNBU1NPQzsKKwkJCU1sbWVEaXNhc3NvY1JlcUFjdGlvbihwQWQsIE1zZ0VsZW0pOworCQkJa2ZyZWUoTXNnRWxlbSk7CisKKwkJCVJUTVB1c2VjRGVsYXkoMTAwMCk7CisJCX0KKworI2lmZGVmIFJUMjg3MAorCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JFTU9WRV9JTl9QUk9HUkVTUyk7CisjZW5kaWYgLy8gUlQyODcwIC8vCisKKyNpZmRlZiBDQ1hfU1VQUE9SVAorCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+U3RhQ2ZnLkxlYXBBdXRoVGltZXIsICZDYW5jZWxsZWQpOworI2VuZGlmCisKKwkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPlN0YUNmZy5TdGFRdWlja1Jlc3BvbmVGb3JSYXRlVXBUaW1lciwgJkNhbmNlbGxlZCk7CisJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5TdGFDZmcuV3BhRGlzYXNzb2NBbmRCbG9ja0Fzc29jVGltZXIsICZDYW5jZWxsZWQpOworCisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorI2lmbmRlZiBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorCQl7CisJCQl1bmlvbiBpd3JlcV9kYXRhICAgIHdycXU7CisJCQkvLyBzZW5kIHdpcmVsZXNzIGV2ZW50IHRvIHdwYV9zdXBwbGljYW50IGZvciBpbmZyb21pbmcgaW50ZXJmYWNlIGRvd24uCisJCQltZW1zZXQoJndycXUsIDAsIHNpemVvZih3cnF1KSk7CisJCQl3cnF1LmRhdGEuZmxhZ3MgPSBSVF9JTlRFUkZBQ0VfRE9XTjsKKwkJCXdpcmVsZXNzX3NlbmRfZXZlbnQocEFkLT5uZXRfZGV2LCBJV0VWQ1VTVE9NLCAmd3JxdSwgTlVMTCk7CisJCX0KKyNlbmRpZiAvLyBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKworCQlNbG1lUmFkaW9PZmYocEFkKTsKKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKTsKKworCWZvciAoaSA9IDAgOyBpIDwgTlVNX09GX1RYX1JJTkc7IGkrKykKKwl7CisJCXdoaWxlIChwQWQtPkRlUXVldWVSdW5uaW5nW2ldID09IFRSVUUpCisJCXsKKwkJCXByaW50aygiV2FpdGluZyBmb3IgVHhRdWV1ZVslZF0gZG9uZS4uLi4uLi4uLi5cbiIsIGkpOworCQkJUlRNUHVzZWNEZWxheSgxMDAwKTsKKwkJfQorCX0KKworI2lmZGVmIFJUMjg3MAorCS8vIGVuc3VyZSB0aGVyZSBhcmUgbm8gbW9yZSBhY3RpdmUgdXJicy4KKwlhZGRfd2FpdF9xdWV1ZSAoJnVubGlua193YWtldXAsICZ3YWl0KTsKKwlwQWQtPndhaXQgPSAmdW5saW5rX3dha2V1cDsKKworCS8vIG1heWJlIHdhaXQgZm9yIGRlbGV0aW9ucyB0byBmaW5pc2guCisJaSA9IDA7CisJLy93aGlsZSgoaSA8IDI1KSAmJiBhdG9taWNfcmVhZCgmcEFkLT5QZW5kaW5nUngpID4gMCkKKwl3aGlsZShpIDwgMjUpCisJeworCQl1bnNpZ25lZCBsb25nIElycUZsYWdzOworCisJCVJUTVBfSVJRX0xPQ0soJnBBZC0+QnVsa0luTG9jaywgSXJxRmxhZ3MpOworCQlpZiAocEFkLT5QZW5kaW5nUnggPT0gMCkKKwkJeworCQkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPkJ1bGtJbkxvY2ssIElycUZsYWdzKTsKKwkJCWJyZWFrOworCQl9CisJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5CdWxrSW5Mb2NrLCBJcnFGbGFncyk7CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDYsOSkKKwkJbXNsZWVwKFVOTElOS19USU1FT1VUX01TKTsJLy9UaW1lIGluIG1pbGxpc2Vjb25kCisjZWxzZQorCQlSVE1QdXNlY0RlbGF5KFVOTElOS19USU1FT1VUX01TKjEwMDApOwkvL1RpbWUgaW4gbWljcm9zZWNvbmQKKyNlbmRpZgorCQlpKys7CisJfQorCXBBZC0+d2FpdCA9IE5VTEw7CisJcmVtb3ZlX3dhaXRfcXVldWUgKCZ1bmxpbmtfd2FrZXVwLCAmd2FpdCk7CisjZW5kaWYgLy8gUlQyODcwIC8vCisKKwkvL1JUVVNCQ2xlYW5VcE1MTUVXYWl0UXVldWUocEFkKTsJLypub3QgdXNlZCBpbiBSVDI4eHgqLworCisKKyNpZmRlZiBSVDI4NzAKKwkvLyBXZSBuZWVkIGNsZWFyIHRpbWVyUSByZWxhdGVkIHN0cnVjdHVyZSBiZWZvcmUgZXhpdHMgb2YgdGhlIHRpbWVyIHRocmVhZC4KKwlSVDI4NzBfVGltZXJRX0V4aXQocEFkKTsKKwkvLyBDbG9zZSBrZXJuZWwgdGhyZWFkcyBvciB0YXNrbGV0cworCVJUMjh4eFRocmVhZFRlcm1pbmF0ZShwQWQpOworI2VuZGlmIC8vIFJUMjg3MCAvLworCisJLy8gU3RvcCBNbG1lIHN0YXRlIG1hY2hpbmUKKwlNbG1lSGFsdChwQWQpOworCisJLy8gQ2xvc2Uga2VybmVsIHRocmVhZHMgb3IgdGFza2xldHMKKwlraWxsX3RocmVhZF90YXNrKHBBZCk7CisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJeworCQlNYWNUYWJsZVJlc2V0KHBBZCk7CisJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisKKwlNZWFzdXJlUmVxVGFiRXhpdChwQWQpOworCVRwY1JlcVRhYkV4aXQocEFkKTsKKworCisKKworCS8vIEZyZWUgUmluZyBvciBVU0IgYnVmZmVycworCVJUTVBGcmVlVHhSeFJpbmdNZW1vcnkocEFkKTsKKworCVJUTVBfQ0xFQVJfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyk7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkvLyBGcmVlIEJBIHJlb3JkZXIgcmVzb3VyY2UKKwliYV9yZW9yZGVyaW5nX3Jlc291cmNlX3JlbGVhc2UocEFkKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworI2lmZGVmIFJUMjg3MAorI2lmZGVmIElORl9BTUFaT05fU0UKKwlpZiAocEFkLT5Vc2JWZW5kb3JSZXFCdWYpCisJCW9zX2ZyZWVfbWVtKHBBZCwgcEFkLT5Vc2JWZW5kb3JSZXFCdWYpOworI2VuZGlmIC8vIElORl9BTUFaT05fU0UgLy8KKyNlbmRpZiAvLyBSVDI4NzAgLy8KKworCVJUTVBfQ0xFQVJfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfU1RBUlRfVVApOworCisJcmV0dXJuIDA7IC8vIGNsb3NlIG9rCit9IC8qIEVuZCBvZiBydDI4eHhfY2xvc2UgKi8KKworc3RhdGljIGludCBydDI4eHhfaW5pdChJTiBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldikKK3sKKwlQUlRNUF9BREFQVEVSIAkJCXBBZCA9IG5ldF9kZXYtPm1sX3ByaXY7CisJVUlOVAkJCQkJaW5kZXg7CisJVUNIQVIJCQkJCVRtcFBoeTsKKwlORElTX1NUQVRVUwkJCQlTdGF0dXM7CisJVUlOVDMyIAkJTWFjQ3NyMCA9IDA7CisKKyNpZmRlZiBSVDI4NzAKKyNpZmRlZiBJTkZfQU1BWk9OX1NFCisJaW5pdF9NVVRFWCgmKHBBZC0+VXNiVmVuZG9yUmVxX3NlbWFwaG9yZSkpOworCW9zX2FsbG9jX21lbShwQWQsIChQVUNIQVIpJnBBZC0+VXNiVmVuZG9yUmVxQnVmLCBNQVhfUEFSQU1fQlVGRkVSX1NJWkUgLSAxKTsKKwlpZiAocEFkLT5Vc2JWZW5kb3JSZXFCdWYgPT0gTlVMTCkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkFsbG9jYXRlIHZlbmRvciByZXF1ZXN0IHRlbXAgYnVmZmVyIGZhaWxlZCFcbiIpKTsKKwkJZ290byBlcnIwOworCX0KKyNlbmRpZiAvLyBJTkZfQU1BWk9OX1NFIC8vCisjZW5kaWYgLy8gUlQyODcwIC8vCisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkvLyBBbGxvY2F0ZSBCQSBSZW9yZGVyaW5nIG1lbW9yeQorCWJhX3Jlb3JkZXJpbmdfcmVzb3VyY2VfaW5pdChwQWQsIE1BWF9SRU9SREVSSU5HX01QRFVfTlVNKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCS8vIE1ha2Ugc3VyZSBNQUMgZ2V0cyByZWFkeS4KKwlpbmRleCA9IDA7CisJZG8KKwl7CisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgTUFDX0NTUjAsICZNYWNDc3IwKTsKKwkJcEFkLT5NQUNWZXJzaW9uID0gTWFjQ3NyMDsKKworCQlpZiAoKHBBZC0+TUFDVmVyc2lvbiAhPSAweDAwKSAmJiAocEFkLT5NQUNWZXJzaW9uICE9IDB4RkZGRkZGRkYpKQorCQkJYnJlYWs7CisKKwkJUlRNUHVzZWNEZWxheSgxMCk7CisJfSB3aGlsZSAoaW5kZXgrKyA8IDEwMCk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNQUNfQ1NSMCAgWyBWZXI6UmV2PTB4JTA4eF1cbiIsIHBBZC0+TUFDVmVyc2lvbikpOworCisJLy8gRGlzYWJsZSBETUEKKwlSVDI4WFhETUFEaXNhYmxlKHBBZCk7CisKKworCS8vIExvYWQgODA1MSBmaXJtd2FyZQorCVN0YXR1cyA9IE5JQ0xvYWRGaXJtd2FyZShwQWQpOworCWlmIChTdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwl7CisJCURCR1BSSU5UX0VSUigoIk5JQ0xvYWRGaXJtd2FyZSBmYWlsZWQsIFN0YXR1c1s9MHglMDh4XVxuIiwgU3RhdHVzKSk7CisJCWdvdG8gZXJyMTsKKwl9CisKKwlOSUNMb2FkUmF0ZVN3aXRjaGluZ1BhcmFtcyhwQWQpOworCisJLy8gRGlzYWJsZSBpbnRlcnJ1cHRzIGhlcmUgd2hpY2ggaXMgYXMgc29vbiBhcyBwb3NzaWJsZQorCS8vIFRoaXMgc3RhdGVtZW50IHNob3VsZCBuZXZlciBiZSB0cnVlLiBXZSBtaWdodCBjb25zaWRlciB0byByZW1vdmUgaXQgbGF0ZXIKKworCVN0YXR1cyA9IFJUTVBBbGxvY1R4UnhSaW5nTWVtb3J5KHBBZCk7CisJaWYgKFN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCXsKKwkJREJHUFJJTlRfRVJSKCgiUlRNUEFsbG9jRE1BTWVtb3J5IGZhaWxlZCwgU3RhdHVzWz0weCUwOHhdXG4iLCBTdGF0dXMpKTsKKwkJZ290byBlcnIxOworCX0KKworCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpOworCisJLy8gaW5pdGlhbGl6ZSBNTE1FCisJLy8KKworCVN0YXR1cyA9IE1sbWVJbml0KHBBZCk7CisJaWYgKFN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCXsKKwkJREJHUFJJTlRfRVJSKCgiTWxtZUluaXQgZmFpbGVkLCBTdGF0dXNbPTB4JTA4eF1cbiIsIFN0YXR1cykpOworCQlnb3RvIGVycjI7CisJfQorCisJLy8gSW5pdGlhbGl6ZSBwQWQtPlN0YUNmZywgcEFkLT5BcENmZywgcEFkLT5Db21tb25DZmcgdG8gbWFudWZhY3R1cmUgZGVmYXVsdAorCS8vCisJVXNlckNmZ0luaXQocEFkKTsKKworI2lmZGVmIFJUMjg3MAorCS8vIFdlIG5lZWQgaW5pdCB0aW1lclEgcmVsYXRlZCBzdHJ1Y3R1cmUgYmVmb3JlIGNyZWF0ZSB0aGUgdGltZXIgdGhyZWFkLgorCVJUMjg3MF9UaW1lclFfSW5pdChwQWQpOworI2VuZGlmIC8vIFJUMjg3MCAvLworCisJUlQyOFhYX1RBU0tfVEhSRUFEX0lOSVQocEFkLCBTdGF0dXMpOworCWlmIChTdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJZ290byBlcnIxOworCisvLwlDT1BZX01BQ19BRERSKHBBZC0+QXBDZmcuTUJTU0lEW2FwaWR4XS5Cc3NpZCwgbmV0aWYtPmh3YWRkcik7CisvLwlwQWQtPmJGb3JjZVByaW50VFggPSBUUlVFOworCisJQ2ZnSW5pdEhvb2socEFkKTsKKworCisjaWZkZWYgQkxPQ0tfTkVUX0lGCisJaW5pdGJsb2NrUXVldWVUYWIocEFkKTsKKyNlbmRpZiAvLyBCTE9DS19ORVRfSUYgLy8KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCU5kaXNBbGxvY2F0ZVNwaW5Mb2NrKCZwQWQtPk1hY1RhYkxvY2spOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJTWVhc3VyZVJlcVRhYkluaXQocEFkKTsKKwlUcGNSZXFUYWJJbml0KHBBZCk7CisKKwkvLworCS8vIEluaXQgdGhlIGhhcmR3YXJlLCB3ZSBuZWVkIHRvIGluaXQgYXNpYyBiZWZvcmUgcmVhZCByZWdpc3RyeSwgb3RoZXJ3aXNlIG1hYyByZWdpc3RlciB3aWxsIGJlIHJlc2V0CisJLy8KKwlTdGF0dXMgPSBOSUNJbml0aWFsaXplQWRhcHRlcihwQWQsIFRSVUUpOworCWlmIChTdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwl7CisJCURCR1BSSU5UX0VSUigoIk5JQ0luaXRpYWxpemVBZGFwdGVyIGZhaWxlZCwgU3RhdHVzWz0weCUwOHhdXG4iLCBTdGF0dXMpKTsKKwkJaWYgKFN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCQlnb3RvIGVycjM7CisJfQorCisJLy8gUmVhZCBwYXJhbWV0ZXJzIGZyb20gQ29uZmlnIEZpbGUKKwlTdGF0dXMgPSBSVE1QUmVhZFBhcmFtZXRlcnNIb29rKHBBZCk7CisKKwlwcmludGsoIjEuIFBoeSBNb2RlID0gJWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUpOworCWlmIChTdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwl7CisJCURCR1BSSU5UX0VSUigoIk5JQ1JlYWRSZWdQYXJhbWV0ZXJzIGZhaWxlZCwgU3RhdHVzWz0weCUwOHhdXG4iLFN0YXR1cykpOworCQlnb3RvIGVycjQ7CisJfQorCisjaWZkZWYgUlQyODcwCisJcEFkLT5Db21tb25DZmcuYk11bHRpcGxlSVJQID0gRkFMU0U7CisKKwlpZiAocEFkLT5Db21tb25DZmcuYk11bHRpcGxlSVJQKQorCQlwQWQtPkNvbW1vbkNmZy5OdW1PZkJ1bGtJbklSUCA9IFJYX1JJTkdfU0laRTsKKwllbHNlCisJCXBBZC0+Q29tbW9uQ2ZnLk51bU9mQnVsa0luSVJQID0gMTsKKyNlbmRpZiAvLyBSVDI4NzAgLy8KKworCisgICAJLy9Jbml0IEJhIENhcGFiaWxpdHkgcGFyYW1ldGVycy4KKy8vCVJUMjhYWF9CQV9JTklUKHBBZCk7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5Lk1wZHVEZW5zaXR5ID0gKFVDSEFSKXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5NcGR1RGVuc2l0eTsKKwlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQW1zZHVFbmFibGUgPSAoVVNIT1JUKXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BbXNkdUVuYWJsZTsKKwlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQW1zZHVTaXplID0gKFVTSE9SVClwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQW1zZHVTaXplOworCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5NaW1vUHMgPSAoVVNIT1JUKXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5NTVBTbW9kZTsKKwkvLyBVUGRhdGEgdG8gSFQgSUUKKwlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLk1pbW9QcyA9IChVU0hPUlQpcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1NUFNtb2RlOworCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQU1zZHVTaXplID0gKFVTSE9SVClwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQW1zZHVTaXplOworCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcFBhcm0uTXBkdURlbnNpdHkgPSAoVUNIQVIpcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1wZHVEZW5zaXR5OworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJLy8gYWZ0ZXIgcmVhZGluZyBSZWdpc3RyeSwgd2Ugbm93IGtub3cgaWYgaW4gQVAgbW9kZSBvciBTVEEgbW9kZQorCisJLy8gTG9hZCA4MDUxIGZpcm13YXJlOyBjcmFzaCB3aGVuIEZXIGltYWdlIG5vdCBleGlzdGVudAorCS8vIFN0YXR1cyA9IE5JQ0xvYWRGaXJtd2FyZShwQWQpOworCS8vIGlmIChTdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkvLyAgICBicmVhazsKKworCXByaW50aygiMi4gUGh5IE1vZGUgPSAlZFxuIiwgcEFkLT5Db21tb25DZmcuUGh5TW9kZSk7CisKKwkvLyBXZSBzaG91bGQgcmVhZCBFRVBST00gZm9yIGFsbCBjYXNlcy4gIHJ0Mjg2MGIKKwlOSUNSZWFkRUVQUk9NUGFyYW1ldGVycyhwQWQsIG1hYyk7CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlwcmludGsoIjMuIFBoeSBNb2RlID0gJWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUpOworCisJTklDSW5pdEFzaWNGcm9tRUVQUk9NKHBBZCk7IC8vcnQyODYwYgorCisJLy8gU2V0IFBIWSB0byBhcHByb3ByaWF0ZSBtb2RlCisJVG1wUGh5ID0gcEFkLT5Db21tb25DZmcuUGh5TW9kZTsKKwlwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID0gMHhmZjsKKwlSVE1QU2V0UGh5TW9kZShwQWQsIFRtcFBoeSk7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJU2V0Q29tbW9uSFQocEFkKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCS8vIE5vIHZhbGlkIGNoYW5uZWxzLgorCWlmIChwQWQtPkNoYW5uZWxMaXN0TnVtID09IDApCisJeworCQlwcmludGsoIldyb25nIGNvbmZpZ3VyYXRpb24uIE5vIHZhbGlkIGNoYW5uZWwgZm91bmQuIENoZWNrIFwiQ29udHJ5Q29kZVwiIGFuZCBcIkNoYW5uZWxHZW9ncmFwaHlcIiBzZXR0aW5nLlxuIik7CisJCWdvdG8gZXJyNDsKKwl9CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwlwcmludGsoIk1DUyBTZXQgPSAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnhcbiIsIHBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMF0sCisgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMV0sIHBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMl0sCisgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5NQ1NTZXRbM10sIHBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5NQ1NTZXRbNF0pOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisjaWZkZWYgUlQyODcwCisgICAgLy9Jbml0IFJUMzB4eCBSRlJlZ2lzdGVycyBhZnRlciByZWFkIFJGSUMgdHlwZSBmcm9tIEVFUFJPTQorCU5JQ0luaXRSVDMweHhSRlJlZ2lzdGVycyhwQWQpOworI2VuZGlmIC8vIFJUMjg3MCAvLworCisjaWYgMAorCS8vIFBhdGNoIGNhcmRidXMgY29udHJvbGxlciBpZiBFRVBST00gc2FpZCBzby4KKwlpZiAocEFkLT5iVGVzdDEgPT0gRkFMU0UpCisJCVJUTVBQYXRjaENhcmRCdXMocEFkKTsKKyNlbmRpZgorCisKKy8vCQlBUEluaXRpYWxpemUocEFkKTsKKworI2lmZGVmIElLQU5PU19WWF8xWDAKKwlWUl9JS0FOT1NfRlBfSW5pdChwQWQtPkFwQ2ZnLkJzc2lkTnVtLCBwQWQtPlBlcm1hbmVudEFkZHJlc3MpOworI2VuZGlmIC8vIElLQU5PU19WWF8xWDAgLy8KKworCQkvLworCS8vIEluaXRpYWxpemUgUkYgcmVnaXN0ZXIgdG8gZGVmYXVsdCB2YWx1ZQorCS8vCisJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsLCBGQUxTRSk7CisJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCk7CisKKwkvLyA4MDUxIGZpcm13YXJlIHJlcXVpcmUgdGhlIHNpZ25hbCBkdXJpbmcgYm9vdGluZyB0aW1lLgorCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHg3MiwgMHhGRiwgMHgwMCwgMHgwMCk7CisKKwlpZiAocEFkICYmIChTdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykpCisJeworCQkvLworCQkvLyBVbmRvIGV2ZXJ5dGhpbmcgaWYgaXQgZmFpbGVkCisJCS8vCisJCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCisJCXsKKy8vCQkJTmRpc01EZXJlZ2lzdGVySW50ZXJydXB0KCZwQWQtPkludGVycnVwdCk7CisJCQlSVE1QX0NMRUFSX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpOworCQl9CisvLwkJUlRNUEZyZWVBZGFwdGVyKHBBZCk7IC8vIHdlIHdpbGwgZnJlZSBpdCBpbiBkaXNjb25uZWN0KCkKKwl9CisJZWxzZSBpZiAocEFkKQorCXsKKwkJLy8gTWljcm9zb2Z0IEhDVCByZXF1aXJlIGRyaXZlciBzZW5kIGEgZGlzY29ubmVjdCBldmVudCBhZnRlciBkcml2ZXIgaW5pdGlhbGl6YXRpb24uCisJCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCk7CisvLwkJcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZURpc2Nvbm5lY3RlZDsKKwkJUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTUVESUFfU1RBVEVfQ0hBTkdFKTsKKworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJORElTX1NUQVRVU19NRURJQV9ESVNDT05ORUNUIEV2ZW50IEIhXG4iKSk7CisKKworI2lmZGVmIFJUMjg3MAorCQlSVE1QX0NMRUFSX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTKTsKKwkJUlRNUF9DTEVBUl9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SRU1PVkVfSU5fUFJPR1JFU1MpOworCisJCS8vCisJCS8vIFN1cHBvcnQgbXVsdGlwbGUgQnVsa0luIElSUCwKKwkJLy8gdGhlIHZhbHVlIG9uIHBBZC0+Q29tbW9uQ2ZnLk51bU9mQnVsa0luSVJQIG1heSBiZSBsYXJnZSB0aGFuIDEuCisJCS8vCisJCWZvcihpbmRleD0wOyBpbmRleDxwQWQtPkNvbW1vbkNmZy5OdW1PZkJ1bGtJbklSUDsgaW5kZXgrKykKKwkJeworCQkJUlRVU0JCdWxrUmVjZWl2ZShwQWQpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlRVU0JCdWxrUmVjZWl2ZSFcbiIgKSk7CisJCX0KKyNlbmRpZiAvLyBSVDI4NzAgLy8KKwl9Ly8gZW5kIG9mIGVsc2UKKworCisJREJHUFJJTlRfUyhTdGF0dXMsICgiPD09PT0gUlRNUEluaXRpYWxpemUsIFN0YXR1cz0leFxuIiwgU3RhdHVzKSk7CisKKwlyZXR1cm4gVFJVRTsKKworCitlcnI0OgorZXJyMzoKKwlNbG1lSGFsdChwQWQpOworZXJyMjoKKwlSVE1QRnJlZVR4UnhSaW5nTWVtb3J5KHBBZCk7CisvLwlSVE1QRnJlZUFkYXB0ZXIocEFkKTsKK2VycjE6CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwlvc19mcmVlX21lbShwQWQsIHBBZC0+bXBkdV9ibGtfcG9vbC5tZW0pOyAvLyBmcmVlIEJBIHBvb2wKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwlSVDI4WFhfSVJRX1JFTEVBU0UobmV0X2Rldik7CisKKwkvLyBzaGFsbCBub3Qgc2V0IG1sX3ByaXYgdG8gTlVMTCBoZXJlIGJlY2F1c2UgdGhlIG1sX3ByaXYgZGlkbid0IGJlZW4gZnJlZSB5ZXQuCisJLy9uZXRfZGV2LT5tbF9wcml2ID0gMDsKKyNpZmRlZiBJTkZfQU1BWk9OX1NFCitlcnIwOgorI2VuZGlmIC8vIElORl9BTUFaT05fU0UgLy8KKwlwcmludGsoIiEhISAlcyBJbml0aWFsaXplZCBmYWlsICEhIVxuIiwgUlQyOHh4X0NISVBfTkFNRSk7CisJcmV0dXJuIEZBTFNFOworfSAvKiBFbmQgb2YgcnQyOHh4X2luaXQgKi8KKworCisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgIE9wZW4gcmF4eCBpbnRlcmZhY2UuCisKK0FyZ3VtZW50czoKKwkqbmV0X2RldgkJCXRoZSByYXh4IGludGVyZmFjZSBwb2ludGVyCisKK1JldHVybiBWYWx1ZToKKyAgICAwCQkJCQlPcGVuIE9LCisJb3RoZXJ3aXNlCQkJT3BlbiBGYWlsCisKK05vdGU6Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitpbnQgcnQyOHh4X29wZW4oSU4gUE5FVF9ERVYgZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICogbmV0X2RldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWRldjsKKwlQUlRNUF9BREFQVEVSIHBBZCA9IG5ldF9kZXYtPm1sX3ByaXY7CisJaW50IHJldHZhbCA9IDA7CisgCVBPU19DT09LSUUgcE9iajsKKworCisJLy8gU2FuaXR5IGNoZWNrIGZvciBwQWQKKwlpZiAocEFkID09IE5VTEwpCisJeworCQkvKiBpZiAxc3Qgb3BlbiBmYWlsLCBwQWQgd2lsbCBiZSBmcmVlOworCQkgICBTbyB0aGUgbmV0X2Rldi0+bWxfcHJpdiB3aWxsIGJlIE5VTEwgaW4gMnJkIG9wZW4gKi8KKwkJcmV0dXJuIC0xOworCX0KKworI2lmZGVmIENPTkZJR19BUFNUQV9NSVhFRF9TVVBQT1JUCisJaWYgKHBBZC0+T3BNb2RlID09IE9QTU9ERV9BUCkKKwl7CisJCUNXX01BWF9JTl9CSVRTID0gNjsKKwl9CisJZWxzZSBpZiAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkKKwl7CisJCUNXX01BWF9JTl9CSVRTID0gMTA7CisJfQorCisjaWYgV0lSRUxFU1NfRVhUID49IDEyCisJaWYgKG5ldF9kZXYtPnByaXZfZmxhZ3MgPT0gSU5UX01BSU4pCisJeworCQlpZiAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX0FQKQorCQkJbmV0X2Rldi0+d2lyZWxlc3NfaGFuZGxlcnMgPSAoc3RydWN0IGl3X2hhbmRsZXJfZGVmICopICZydDI4eHhfYXBfaXdfaGFuZGxlcl9kZWY7CisJCWVsc2UgaWYgKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpCisJCQluZXRfZGV2LT53aXJlbGVzc19oYW5kbGVycyA9IChzdHJ1Y3QgaXdfaGFuZGxlcl9kZWYgKikgJnJ0Mjh4eF9pd19oYW5kbGVyX2RlZjsKKwl9CisjZW5kaWYgLy8gV0lSRUxFU1NfRVhUID49IDEyIC8vCisjZW5kaWYgLy8gQ09ORklHX0FQU1RBX01JWEVEX1NVUFBPUlQgLy8KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJLy8gSW5pdAorIAlwT2JqID0gKFBPU19DT09LSUUpcEFkLT5PU19Db29raWU7CisKKwkvLyByZXNldCBBZGFwdGVyIGZsYWdzCisJUlRNUF9DTEVBUl9GTEFHUyhwQWQpOworCisJLy8gUmVxdWVzdCBpbnRlcnJ1cHQgc2VydmljZSByb3V0aW5lIGZvciBQQ0kgZGV2aWNlCisJLy8gcmVnaXN0ZXIgdGhlIGludGVycnVwdCByb3V0aW5lIHdpdGggdGhlIG9zCisJUlQyOFhYX0lSUV9SRVFVRVNUKG5ldF9kZXYpOworCisKKwkvLyBJbml0IEJzc1RhYiAmIENoYW5uZWxJbmZvIHRhYmJsZXMgZm9yIGF1dG8gY2hhbm5lbCBzZWxlY3QuCisKKworCS8vIENoaXAgJiBvdGhlciBpbml0CisJaWYgKHJ0Mjh4eF9pbml0KG5ldF9kZXYpID09IEZBTFNFKQorCQlnb3RvIGVycjsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJeworCQlOZGlzWmVyb01lbW9yeShwQWQtPlN0YUNmZy5kZXZfbmFtZSwgMTYpOworCQlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5kZXZfbmFtZSwgbmV0X2Rldi0+bmFtZSwgc3RybGVuKG5ldF9kZXYtPm5hbWUpKTsKKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwkvLyBTZXQgdXAgdGhlIE1hYyBhZGRyZXNzCisJTmRpc01vdmVNZW1vcnkobmV0X2Rldi0+ZGV2X2FkZHIsICh2b2lkICopIHBBZC0+Q3VycmVudEFkZHJlc3MsIDYpOworCisJLy8gSW5pdCBJUlEgcGFyYW1ldGVycworCVJUMjhYWF9JUlFfSU5JVChwQWQpOworCisJLy8gVmFyaW91cyBBUCBmdW5jdGlvbiBpbml0CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCXsKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisjaWZuZGVmIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisJCXsKKwkJCXVuaW9uIGl3cmVxX2RhdGEgICAgd3JxdTsKKwkJCS8vIHNlbmQgd2lyZWxlc3MgZXZlbnQgdG8gd3BhX3N1cHBsaWNhbnQgZm9yIGluZnJvbWluZyBpbnRlcmZhY2UgZG93bi4KKwkJCW1lbXNldCgmd3JxdSwgMCwgc2l6ZW9mKHdycXUpKTsKKwkJCXdycXUuZGF0YS5mbGFncyA9IFJUX0lOVEVSRkFDRV9VUDsKKwkJCXdpcmVsZXNzX3NlbmRfZXZlbnQocEFkLT5uZXRfZGV2LCBJV0VWQ1VTVE9NLCAmd3JxdSwgTlVMTCk7CisJCX0KKyNlbmRpZiAvLyBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKworCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCS8vIEVuYWJsZSBJbnRlcnJ1cHQKKwlSVDI4WFhfSVJRX0VOQUJMRShwQWQpOworCisJLy8gTm93IEVuYWJsZSBSeFR4CisJUlRNUEVuYWJsZVJ4VHgocEFkKTsKKwlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9TVEFSVF9VUCk7CisKKwl7CisJVUlOVDMyIHJlZyA9IDA7CisJUlRNUF9JT19SRUFEMzIocEFkLCAweDEzMDAsICZyZWcpOyAgLy8gY2xlYXIgZ2FyYmFnZSBpbnRlcnJ1cHRzCisJcHJpbnRrKCIweDEzMDAgPSAlMDh4XG4iLCByZWcpOworCX0KKworCXsKKy8vCXUzMiByZWc7CisvLwl1OCAgYnl0ZTsKKy8vCXUxNiB0bXA7CisKKy8vCVJUTVBfSU9fUkVBRDMyKHBBZCwgWElGU19USU1FX0NGRywgJnJlZyk7CisKKy8vCXRtcCA9IDB4MDgwNTsKKy8vCXJlZyAgPSAocmVnICYgMHhmZmZmMDAwMCkgfCB0bXA7CisvLwlSVE1QX0lPX1dSSVRFMzIocEFkLCBYSUZTX1RJTUVfQ0ZHLCByZWcpOworCisJfQorCisjaWYgMAorCS8qCisJICogZGVidWdnaW5nIGhlbHBlcgorCSAqIAkJc2hvdyB0aGUgc2l6ZSBvZiBtYWluIHRhYmxlIGluIEFkYXB0ZXIgc3RydWN0dXJlCisJICoJCU1hY1RhYiAgLS0gMTg1SworCSAqCQlCQVRhYmxlIC0tIDEzN0sKKwkgKiAJCVRvdGFsIAktLSAzODVLICAhISEhISAoNS8yNi8yMDA2KQorCSAqLworCXByaW50aygic2l6ZW9mKHBBZC0+TWFjVGFiKSA9ICVsZFxuIiwgc2l6ZW9mKHBBZC0+TWFjVGFiKSk7CisJcHJpbnRrKCJzaXplb2YocEFkLT5BY2Nlc3NDb250cm9sTGlzdCkgPSAlbGRcbiIsIHNpemVvZihwQWQtPkFjY2Vzc0NvbnRyb2xMaXN0KSk7CisJcHJpbnRrKCJzaXplb2YocEFkLT5BcENmZykgPSAlbGRcbiIsIHNpemVvZihwQWQtPkFwQ2ZnKSk7CisJcHJpbnRrKCJzaXplb2YocEFkLT5CQVRhYmxlKSA9ICVsZFxuIiwgc2l6ZW9mKHBBZC0+QkFUYWJsZSkpOworCUJVRygpOworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCXJldHVybiAocmV0dmFsKTsKKworZXJyOgorCXJldHVybiAoLTEpOworfSAvKiBFbmQgb2YgcnQyOHh4X29wZW4gKi8KKworCisvKiBNdXN0IG5vdCBiZSBjYWxsZWQgZm9yIG1kZXYgYW5kIGFwZGV2ICovCitzdGF0aWMgTkRJU19TVEFUVVMgcnRfaWVlZTgwMjExX2lmX3NldHVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIFBSVE1QX0FEQVBURVIgcEFkKQoreworCU5ESVNfU1RBVFVTIFN0YXR1czsKKwlJTlQgICAgIGk9MDsKKwlDSEFSICAgIHNsb3RfbmFtZVtJRk5BTVNJWl07CisJc3RydWN0IG5ldF9kZXZpY2UgICAqZGV2aWNlOworCisKKwkvL2V0aGVyX3NldHVwKGRldik7CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBydDI4eHhfc2VuZF9wYWNrZXRzOworCisjaWZkZWYgSUtBTk9TX1ZYXzFYMAorCWRldi0+aGFyZF9zdGFydF94bWl0ID0gSUtBTk9TX0RhdGFGcmFtZXNUeDsKKyNlbmRpZiAvLyBJS0FOT1NfVlhfMVgwIC8vCisKKy8vCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gaWVlZTgwMjExX3NldF9tdWx0aWNhc3RfbGlzdDsKKy8vCWRldi0+Y2hhbmdlX210dSA9IGllZWU4MDIxMV9jaGFuZ2VfbXR1OworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorI2lmIFdJUkVMRVNTX0VYVCA+PSAxMgorCWlmIChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKQorCXsKKwkJZGV2LT53aXJlbGVzc19oYW5kbGVycyA9ICZydDI4eHhfaXdfaGFuZGxlcl9kZWY7CisJfQorI2VuZGlmIC8vV0lSRUxFU1NfRVhUID49IDEyCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKyNpZmRlZiBDT05GSUdfQVBTVEFfTUlYRURfU1VQUE9SVAorI2lmIFdJUkVMRVNTX0VYVCA+PSAxMgorCWlmIChwQWQtPk9wTW9kZSA9PSBPUE1PREVfQVApCisJeworCQlkZXYtPndpcmVsZXNzX2hhbmRsZXJzID0gJnJ0Mjh4eF9hcF9pd19oYW5kbGVyX2RlZjsKKwl9CisjZW5kaWYgLy9XSVJFTEVTU19FWFQgPj0gMTIKKyNlbmRpZiAvLyBDT05GSUdfQVBTVEFfTUlYRURfU1VQUE9SVCAvLworCisjaWYgV0lSRUxFU1NfRVhUIDwgMjEKKwkJZGV2LT5nZXRfd2lyZWxlc3Nfc3RhdHMgPSBydDI4eHhfZ2V0X3dpcmVsZXNzX3N0YXRzOworI2VuZGlmCisJZGV2LT5nZXRfc3RhdHMgPSBSVDI4eHhfZ2V0X2V0aGVyX3N0YXRzOworCWRldi0+b3BlbiA9IE1haW5WaXJ0dWFsSUZfb3BlbjsgLy9ydDI4eHhfb3BlbjsKKwlkZXYtPnN0b3AgPSBNYWluVmlydHVhbElGX2Nsb3NlOyAvL3J0Mjh4eF9jbG9zZTsKKy8vCWRldi0+dW5pbml0ID0gaWVlZTgwMjExX2lmX3JlaW5pdDsKKy8vCWRldi0+ZGVzdHJ1Y3RvciA9IGllZWU4MDIxMV9pZl9mcmVlOworCWRldi0+cHJpdl9mbGFncyA9IElOVF9NQUlOOworCWRldi0+ZG9faW9jdGwgPSBydDI4eHhfaW9jdGw7CisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwyNCkKKyAgICBkZXYtPnZhbGlkYXRlX2FkZHIgPSBOVUxMOworI2VuZGlmCisJLy8gZmluZCBhdmFpbGFibGUgZGV2aWNlIG5hbWUKKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorCXsKKyNpZmRlZiBNVUxUSVBMRV9DQVJEX1NVUFBPUlQKKwkJaWYgKHBBZC0+TUNfUm93SUQgPj0gMCkKKwkJCXNwcmludGYoc2xvdF9uYW1lLCAicmElMDJkXyVkIiwgcEFkLT5NQ19Sb3dJRCwgaSk7CisJCWVsc2UKKyNlbmRpZiAvLyBNVUxUSVBMRV9DQVJEX1NVUFBPUlQgLy8KKwkJc3ByaW50ZihzbG90X25hbWUsICJyYSVkIiwgaSk7CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwyNCkKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDI2KQorICAgICAgICBkZXZpY2UgPSBkZXZfZ2V0X2J5X25hbWUoZGV2X25ldChkZXYpLCBzbG90X25hbWUpOworI2Vsc2UKKyAgICAgICAgZGV2aWNlID0gZGV2X2dldF9ieV9uYW1lKGRldi0+bmRfbmV0LCBzbG90X25hbWUpOworI2VuZGlmCisjZWxzZQorCQlkZXZpY2UgPSBkZXZfZ2V0X2J5X25hbWUoc2xvdF9uYW1lKTsKKyNlbmRpZgorCQlpZiAoZGV2aWNlICE9IE5VTEwpIGRldl9wdXQoZGV2aWNlKTsKKyNlbHNlCisJCWZvciAoZGV2aWNlID0gZGV2X2Jhc2U7IGRldmljZSAhPSBOVUxMOyBkZXZpY2UgPSBkZXZpY2UtPm5leHQpCisJCXsKKwkJCWlmIChzdHJuY21wKGRldmljZS0+bmFtZSwgc2xvdF9uYW1lLCA0KSA9PSAwKQorCQkJCWJyZWFrOworCQl9CisjZW5kaWYKKwkJaWYoZGV2aWNlID09IE5VTEwpCisJCQlicmVhazsKKwl9CisKKwlpZihpID09IDgpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJObyBhdmFpbGFibGUgc2xvdCBuYW1lXG4iKSk7CisJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX0ZBSUxVUkU7CisJfQorCWVsc2UKKwl7CisjaWZkZWYgTVVMVElQTEVfQ0FSRF9TVVBQT1JUCisJCWlmIChwQWQtPk1DX1Jvd0lEID49IDApCisJICAgICAgICBzcHJpbnRmKGRldi0+bmFtZSwgInJhJTAyZF8lZCIsIHBBZC0+TUNfUm93SUQsIGkpOworCQllbHNlCisjZW5kaWYgLy8gTVVMVElQTEVfQ0FSRF9TVVBQT1JUIC8vCisJCXNwcmludGYoZGV2LT5uYW1lLCAicmElZCIsIGkpOworCQlTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworCX0KKworCXJldHVybiBTdGF0dXM7CisKK30KKworCisjaWZkZWYgTVVMVElQTEVfQ0FSRF9TVVBQT1JUCisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgIEdldCBjYXJkIHByb2ZpbGUgcGF0aC4KKworQXJndW1lbnRzOgorICAgIHBBZAorCitSZXR1cm4gVmFsdWU6CisgICAgVFJVRQkJLSBGaW5kIGEgY2FyZCBwcm9maWxlCisJRkFMU0UJCS0gdXNlIGRlZmF1bHQgcHJvZmlsZQorCitOb3RlOgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworZXh0ZXJuIElOVCBSVE1QR2V0S2V5UGFyYW1ldGVyKAorICAgIElOICBQQ0hBUiAgIGtleSwKKyAgICBPVVQgUENIQVIgICBkZXN0LAorICAgIElOICBJTlQgICAgIGRlc3RzaXplLAorICAgIElOICBQQ0hBUiAgIGJ1ZmZlcik7CisKK0JPT0xFQU4gUlRNUF9DYXJkSW5mb1JlYWQoCisJSU4JUFJUTVBfQURBUFRFUiBwQWQpCit7CisjZGVmaW5lIE1DX1NFTEVDVF9DQVJESUQJCTAJLyogdXNlIENBUkQgSUQgKDAgfiAzMSkgdG8gaWRlbnRpZnkgZGlmZmVyZW50IGNhcmRzICovCisjZGVmaW5lIE1DX1NFTEVDVF9NQUMJCQkxCS8qIHVzZSBDQVJEIE1BQyB0byBpZGVudGlmeSBkaWZmZXJlbnQgY2FyZHMgKi8KKyNkZWZpbmUgTUNfU0VMRUNUX0NBUkRUWVBFCQkyCS8qIHVzZSBDQVJEIHR5cGUgKGFiZ24gb3IgYmduKSB0byBpZGVudGlmeSBkaWZmZXJlbnQgY2FyZHMgKi8KKworI2RlZmluZSBMRVRURVJfQ0FTRV9UUkFOU0xBVEUodHh0X3AsIGNhcmRfaWQpCQkJXAorCXsJVUlOVDMyIF9sZW47IGNoYXIgX2NoYXI7CQkJCQkJXAorCQlmb3IoX2xlbj0wOyBfbGVuPHN0cmxlbihjYXJkX2lkKTsgX2xlbisrKSB7CQlcCisJCQlfY2hhciA9ICoodHh0X3AgKyBfbGVuKTsJCQkJCVwKKwkJCWlmICgoJ0EnIDw9IF9jaGFyKSAmJiAoX2NoYXIgPD0gJ1onKSkJCVwKKwkJCQkqKHR4dF9wK19sZW4pID0gJ2EnKyhfY2hhci0nQScpOwkJXAorCQl9IH0KKworCXN0cnVjdCBmaWxlICpzcmNmOworCUlOVCByZXR2YWwsIG9yZ2ZzdWlkLCBvcmdmc2dpZDsKKyAgIAltbV9zZWdtZW50X3Qgb3JnZnM7CisJQ0hBUiAqYnVmZmVyLCAqdG1wYnVmLCBjYXJkX2lkX2J1ZlszMF0sIFJGSUNfd29yZFszMF07CisJQk9PTEVBTiBmbGdfbWF0Y2hfb2sgPSBGQUxTRTsKKwlJTlQzMiBjYXJkX3NlbGVjdF9tZXRob2Q7CisJSU5UMzIgY2FyZF9mcmVlX2lkLCBjYXJkX25vdXNlX2lkLCBjYXJkX3NhbWVfbWFjX2lkLCBjYXJkX21hdGNoX2lkOworCUVFUFJPTV9BTlRFTk5BX1NUUlVDIGFudGVubmE7CisJVVNIT1JUIGFkZHIwMSwgYWRkcjIzLCBhZGRyNDU7CisJVUlOVDggbWFjWzZdOworCVVJTlQzMiBkYXRhLCBjYXJkX2luZGV4OworCVVDSEFSICpzdGFydF9wdHI7CisKKworCS8vIGluaXQKKwlidWZmZXIgPSBrbWFsbG9jKE1BWF9JTklfQlVGRkVSX1NJWkUsIE1FTV9BTExPQ19GTEFHKTsKKwlpZiAoYnVmZmVyID09IE5VTEwpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworCXRtcGJ1ZiA9IGttYWxsb2MoTUFYX1BBUkFNX0JVRkZFUl9TSVpFLCBNRU1fQUxMT0NfRkxBRyk7CisJaWYodG1wYnVmID09IE5VTEwpCisJeworCQlrZnJlZShidWZmZXIpOworICAgICAgICByZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRTsKKwl9CisKKwlvcmdmc3VpZCA9IGN1cnJlbnQtPmZzdWlkOworCW9yZ2ZzZ2lkID0gY3VycmVudC0+ZnNnaWQ7CisJY3VycmVudC0+ZnN1aWQgPSBjdXJyZW50LT5mc2dpZCA9IDA7CisgICAgb3JnZnMgPSBnZXRfZnMoKTsKKyAgICBzZXRfZnMoS0VSTkVMX0RTKTsKKworCS8vIGdldCBSRiBJQyB0eXBlCisJUlRNUF9JT19SRUFEMzIocEFkLCBFMlBST01fQ1NSLCAmZGF0YSk7CisKKwlpZiAoKGRhdGEgJiAweDMwKSA9PSAwKQorCQlwQWQtPkVFUFJPTUFkZHJlc3NOdW0gPSA2OwkvLyA5M0M0NgorCWVsc2UgaWYgKChkYXRhICYgMHgzMCkgPT0gMHgxMCkKKwkJcEFkLT5FRVBST01BZGRyZXNzTnVtID0gODsJLy8gOTNDNjYKKwllbHNlCisJCXBBZC0+RUVQUk9NQWRkcmVzc051bSA9IDg7CS8vIDkzQzg2CisKKwkvL2FudGVubmEud29yZCA9IFJUTVBfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9OSUMxX09GRlNFVCk7CisJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fTklDMV9PRkZTRVQsIGFudGVubmEud29yZCk7CisKKwlpZiAoKGFudGVubmEuZmllbGQuUmZJY1R5cGUgPT0gUkZJQ18yODUwKSB8fAorCQkoYW50ZW5uYS5maWVsZC5SZkljVHlwZSA9PSBSRklDXzI3NTApKQorCXsKKwkJLyogQUJHTiBjYXJkICovCisJCXN0cmNweShSRklDX3dvcmQsICJhYmduIik7CisJfQorCWVsc2UKKwl7CisJCS8qIEJHTiBjYXJkICovCisJCXN0cmNweShSRklDX3dvcmQsICJiZ24iKTsKKwl9CisKKwkvLyBnZXQgTUFDIGFkZHJlc3MKKwkvL2FkZHIwMSA9IFJUTVBfRUVQUk9NX1JFQUQxNihwQWQsIDB4MDQpOworCS8vYWRkcjIzID0gUlRNUF9FRVBST01fUkVBRDE2KHBBZCwgMHgwNik7CisJLy9hZGRyNDUgPSBSVE1QX0VFUFJPTV9SRUFEMTYocEFkLCAweDA4KTsKKwlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIDB4MDQsIGFkZHIwMSk7CisJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCAweDA2LCBhZGRyMjMpOworCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgMHgwOCwgYWRkcjQ1KTsKKworCW1hY1swXSA9IChVQ0hBUikoYWRkcjAxICYgMHhmZik7CisJbWFjWzFdID0gKFVDSEFSKShhZGRyMDEgPj4gOCk7CisJbWFjWzJdID0gKFVDSEFSKShhZGRyMjMgJiAweGZmKTsKKwltYWNbM10gPSAoVUNIQVIpKGFkZHIyMyA+PiA4KTsKKwltYWNbNF0gPSAoVUNIQVIpKGFkZHI0NSAmIDB4ZmYpOworCW1hY1s1XSA9IChVQ0hBUikoYWRkcjQ1ID4+IDgpOworCisJLy8gb3BlbiBjYXJkIGluZm9ybWF0aW9uIGZpbGUKKwlzcmNmID0gZmlscF9vcGVuKENBUkRfSU5GT19QQVRILCBPX1JET05MWSwgMCk7CisJaWYgKElTX0VSUihzcmNmKSkKKwl7CisJCS8qIGNhcmQgaW5mb3JtYXRpb24gZmlsZSBkb2VzIG5vdCBleGlzdCAqLworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJKCItLT4gRXJyb3IgJWxkIG9wZW5pbmcgJXNcbiIsIC1QVFJfRVJSKHNyY2YpLCBDQVJEX0lORk9fUEFUSCkpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJaWYgKHNyY2YtPmZfb3AgJiYgc3JjZi0+Zl9vcC0+cmVhZCkKKwl7CisJCS8qIGNhcmQgaW5mb3JtYXRpb24gZmlsZSBleGlzdHMgc28gcmVhZGluZyB0aGUgY2FyZCBpbmZvcm1hdGlvbiAqLworCQltZW1zZXQoYnVmZmVyLCAweDAwLCBNQVhfSU5JX0JVRkZFUl9TSVpFKTsKKwkJcmV0dmFsID0gc3JjZi0+Zl9vcC0+cmVhZChzcmNmLCBidWZmZXIsIE1BWF9JTklfQlVGRkVSX1NJWkUsICZzcmNmLT5mX3Bvcyk7CisJCWlmIChyZXR2YWwgPCAwKQorCQl7CisJCQkvKiByZWFkIGZhaWwgKi8KKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkJKCItLT4gUmVhZCAlcyBlcnJvciAlZFxuIiwgQ0FSRF9JTkZPX1BBVEgsIC1yZXR2YWwpKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCS8qIGdldCBjYXJkIHNlbGVjdGlvbiBtZXRob2QgKi8KKwkJCW1lbXNldCh0bXBidWYsIDB4MDAsIE1BWF9QQVJBTV9CVUZGRVJfU0laRSk7CisJCQljYXJkX3NlbGVjdF9tZXRob2QgPSBNQ19TRUxFQ1RfQ0FSRFRZUEU7IC8vIGRlZmF1bHQKKworCQkJaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIlNFTEVDVCIsIHRtcGJ1ZiwgMjU2LCBidWZmZXIpKQorCQkJeworCQkJCWlmIChzdHJjbXAodG1wYnVmLCAiQ0FSRElEIikgPT0gMCkKKwkJCQkJY2FyZF9zZWxlY3RfbWV0aG9kID0gTUNfU0VMRUNUX0NBUkRJRDsKKwkJCQllbHNlIGlmIChzdHJjbXAodG1wYnVmLCAiTUFDIikgPT0gMCkKKwkJCQkJY2FyZF9zZWxlY3RfbWV0aG9kID0gTUNfU0VMRUNUX01BQzsKKwkJCQllbHNlIGlmIChzdHJjbXAodG1wYnVmLCAiQ0FSRFRZUEUiKSA9PSAwKQorCQkJCQljYXJkX3NlbGVjdF9tZXRob2QgPSBNQ19TRUxFQ1RfQ0FSRFRZUEU7CisJCQl9CisKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCQkoIk1DPiBDYXJkIFNlbGVjdGlvbiA9ICVkXG4iLCBjYXJkX3NlbGVjdF9tZXRob2QpKTsKKworCQkJLy8gaW5pdAorCQkJY2FyZF9mcmVlX2lkID0gLTE7CisJCQljYXJkX25vdXNlX2lkID0gLTE7CisJCQljYXJkX3NhbWVfbWFjX2lkID0gLTE7CisJCQljYXJkX21hdGNoX2lkID0gLTE7CisKKwkJCS8vIHNlYXJjaCBjdXJyZW50IGNhcmQgaW5mb3JtYXRpb24gcmVjb3JkcworCQkJZm9yKGNhcmRfaW5kZXg9MDsKKwkJCQljYXJkX2luZGV4PE1BWF9OVU1fT0ZfTVVMVElQTEVfQ0FSRDsKKwkJCQljYXJkX2luZGV4KyspCisJCQl7CisJCQkJaWYgKCgqKFVJTlQzMiAqKSZNQ19DYXJkTWFjW2NhcmRfaW5kZXhdWzBdID09IDApICYmCisJCQkJCSgqKFVJTlQxNiAqKSZNQ19DYXJkTWFjW2NhcmRfaW5kZXhdWzRdID09IDApKQorCQkJCXsKKwkJCQkJLy8gTUFDIGlzIGFsbC0wIHNvIHRoZSBlbnRyeSBpcyBhdmFpbGFibGUKKwkJCQkJTUNfQ2FyZFVzZWRbY2FyZF9pbmRleF0gPSAwOworCisJCQkJCWlmIChjYXJkX2ZyZWVfaWQgPCAwKQorCQkJCQkJY2FyZF9mcmVlX2lkID0gY2FyZF9pbmRleDsgLy8gMXN0IGZyZWUgZW50cnkKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJaWYgKG1lbWNtcChNQ19DYXJkTWFjW2NhcmRfaW5kZXhdLCBtYWMsIDYpID09IDApCisJCQkJCXsKKwkJCQkJCS8vIHdlIGZpbmQgdGhlIGVudHJ5IHdpdGggc2FtZSBNQUMKKwkJCQkJCWlmIChjYXJkX3NhbWVfbWFjX2lkIDwgMCkKKwkJCQkJCQljYXJkX3NhbWVfbWFjX2lkID0gY2FyZF9pbmRleDsgLy8gMXN0IHNhbWUgZW50cnkKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCS8vIE1BQyBpcyBub3QgYWxsLTAgYnV0IHVzZWQgZmxhZyA9PSAwCisJCQkJCQlpZiAoKE1DX0NhcmRVc2VkW2NhcmRfaW5kZXhdID09IDApICYmCisJCQkJCQkJKGNhcmRfbm91c2VfaWQgPCAwKSkKKwkJCQkJCXsKKwkJCQkJCQljYXJkX25vdXNlX2lkID0gY2FyZF9pbmRleDsgLy8gMXN0IGF2YWlsYWJsZSBlbnRyeQorCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkJKCJNQz4gRnJlZSA9ICVkLCBTYW1lID0gJWQsIE5PVVNFID0gJWRcbiIsCisJCQkJCWNhcmRfZnJlZV9pZCwgY2FyZF9zYW1lX21hY19pZCwgY2FyZF9ub3VzZV9pZCkpOworCisJCQlpZiAoKGNhcmRfc2FtZV9tYWNfaWQgPj0gMCkgJiYKKwkJCQkoKGNhcmRfc2VsZWN0X21ldGhvZCA9PSBNQ19TRUxFQ1RfQ0FSRElEKSB8fAorCQkJCShjYXJkX3NlbGVjdF9tZXRob2QgPT0gTUNfU0VMRUNUX0NBUkRUWVBFKSkpCisJCQl7CisJCQkJLy8gc2FtZSBNQUMgZW50cnkgaXMgZm91bmQKKwkJCQljYXJkX21hdGNoX2lkID0gY2FyZF9zYW1lX21hY19pZDsKKworCQkJCWlmIChjYXJkX3NlbGVjdF9tZXRob2QgPT0gTUNfU0VMRUNUX0NBUkRUWVBFKQorCQkJCXsKKwkJCQkJLy8gZm9yIENBUkRUWVBFCisJCQkJCXNwcmludGYoY2FyZF9pZF9idWYsICIlMDJkQ0FSRFRZUEUlcyIsCisJCQkJCQkJY2FyZF9tYXRjaF9pZCwgUkZJQ193b3JkKTsKKworCQkJCQlpZiAoKHN0YXJ0X3B0cj1ydHN0cnN0cnVuY2FzZWNtcChidWZmZXIsIGNhcmRfaWRfYnVmKSkgIT0gTlVMTCkKKwkJCQkJeworCQkJCQkJLy8gd2UgZm91bmQgdGhlIGNhcmQgSUQKKwkJCQkJCUxFVFRFUl9DQVNFX1RSQU5TTEFURShzdGFydF9wdHIsIGNhcmRfaWRfYnVmKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQkvLyB0aGUgY2FyZCBpcyAxc3QgcGx1Zy1pbiwgdHJ5IHRvIGZpbmQgdGhlIG1hdGNoIGNhcmQgcHJvZmlsZQorCQkJCXN3aXRjaChjYXJkX3NlbGVjdF9tZXRob2QpCisJCQkJeworCQkJCQljYXNlIE1DX1NFTEVDVF9DQVJESUQ6IC8vIENBUkRJRAorCQkJCQlkZWZhdWx0OgorCQkJCQkJaWYgKGNhcmRfZnJlZV9pZCA+PSAwKQorCQkJCQkJCWNhcmRfbWF0Y2hfaWQgPSBjYXJkX2ZyZWVfaWQ7CisJCQkJCQllbHNlCisJCQkJCQkJY2FyZF9tYXRjaF9pZCA9IGNhcmRfbm91c2VfaWQ7CisJCQkJCQlicmVhazsKKworCQkJCQljYXNlIE1DX1NFTEVDVF9NQUM6IC8vIE1BQworCQkJCQkJc3ByaW50ZihjYXJkX2lkX2J1ZiwgIk1BQyUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IiwKKwkJCQkJCQkJbWFjWzBdLCBtYWNbMV0sIG1hY1syXSwKKwkJCQkJCQkJbWFjWzNdLCBtYWNbNF0sIG1hY1s1XSk7CisKKwkJCQkJCS8qIHRyeSB0byBmaW5kIHRoZSBrZXkgd29yZCBpbiB0aGUgY2FyZCBmaWxlICovCisJCQkJCQlpZiAoKHN0YXJ0X3B0cj1ydHN0cnN0cnVuY2FzZWNtcChidWZmZXIsIGNhcmRfaWRfYnVmKSkgIT0gTlVMTCkKKwkJCQkJCXsKKwkJCQkJCQlMRVRURVJfQ0FTRV9UUkFOU0xBVEUoc3RhcnRfcHRyLCBjYXJkX2lkX2J1Zik7CisKKwkJCQkJCQkvKiBnZXQgdGhlIHJvdyBJRCAoMiBBU0NJSSBjaGFyYWN0ZXJzKSAqLworCQkJCQkJCXN0YXJ0X3B0ciAtPSAyOworCQkJCQkJCWNhcmRfaWRfYnVmWzBdID0gKihzdGFydF9wdHIpOworCQkJCQkJCWNhcmRfaWRfYnVmWzFdID0gKihzdGFydF9wdHIrMSk7CisJCQkJCQkJY2FyZF9pZF9idWZbMl0gPSAweDAwOworCisJCQkJCQkJY2FyZF9tYXRjaF9pZCA9IHNpbXBsZV9zdHJ0b2woY2FyZF9pZF9idWYsIDAsIDEwKTsKKwkJCQkJCX0KKwkJCQkJCWJyZWFrOworCisJCQkJCWNhc2UgTUNfU0VMRUNUX0NBUkRUWVBFOiAvLyBDQVJEVFlQRQorCQkJCQkJY2FyZF9ub3VzZV9pZCA9IC0xOworCisJCQkJCQlmb3IoY2FyZF9pbmRleD0wOworCQkJCQkJCWNhcmRfaW5kZXg8TUFYX05VTV9PRl9NVUxUSVBMRV9DQVJEOworCQkJCQkJCWNhcmRfaW5kZXgrKykKKwkJCQkJCXsKKwkJCQkJCQlzcHJpbnRmKGNhcmRfaWRfYnVmLCAiJTAyZENBUkRUWVBFJXMiLAorCQkJCQkJCQkJY2FyZF9pbmRleCwgUkZJQ193b3JkKTsKKworCQkJCQkJCWlmICgoc3RhcnRfcHRyPXJ0c3Ryc3RydW5jYXNlY21wKGJ1ZmZlciwKKwkJCQkJCQkJCQkJCQkJY2FyZF9pZF9idWYpKSAhPSBOVUxMKQorCQkJCQkJCXsKKwkJCQkJCQkJTEVUVEVSX0NBU0VfVFJBTlNMQVRFKHN0YXJ0X3B0ciwgY2FyZF9pZF9idWYpOworCisJCQkJCQkJCWlmIChNQ19DYXJkVXNlZFtjYXJkX2luZGV4XSA9PSAwKQorCQkJCQkJCQl7CisJCQkJCQkJCQkvKiBjdXJyZW50IHRoZSBjYXJkIHByb2ZpbGUgaXMgbm90IHVzZWQgKi8KKwkJCQkJCQkJCWlmICgoKihVSU5UMzIgKikmTUNfQ2FyZE1hY1tjYXJkX2luZGV4XVswXSA9PSAwKSAmJgorCQkJCQkJCQkJCSgqKFVJTlQxNiAqKSZNQ19DYXJkTWFjW2NhcmRfaW5kZXhdWzRdID09IDApKQorCQkJCQkJCQkJeworCQkJCQkJCQkJCS8vIGZpbmQgaXQgYW5kIG5vIHByZXZpb3VzIGNhcmQgdXNlIGl0CisJCQkJCQkJCQkJY2FyZF9tYXRjaF9pZCA9IGNhcmRfaW5kZXg7CisJCQkJCQkJCQkJYnJlYWs7CisJCQkJCQkJCQl9CisJCQkJCQkJCQllbHNlCisJCQkJCQkJCQl7CisJCQkJCQkJCQkJLy8gZXZlciBhIGNhcmQgdXNlIGl0CisJCQkJCQkJCQkJaWYgKGNhcmRfbm91c2VfaWQgPCAwKQorCQkJCQkJCQkJCQljYXJkX25vdXNlX2lkID0gY2FyZF9pbmRleDsKKwkJCQkJCQkJCX0KKwkJCQkJCQkJfQorCQkJCQkJCX0KKwkJCQkJCX0KKworCQkJCQkJLy8gaWYgbm90IGZpbmQgYSBmcmVlIG9uZSwgdXNlIHRoZSBhdmFpbGFibGUgb25lCisJCQkJCQlpZiAoY2FyZF9tYXRjaF9pZCA8IDApCisJCQkJCQkJY2FyZF9tYXRjaF9pZCA9IGNhcmRfbm91c2VfaWQ7CisJCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisKKwkJCWlmIChjYXJkX21hdGNoX2lkID49IDApCisJCQl7CisJCQkJLy8gbWFrZSB1cCBzZWFyY2gga2V5d29yZAorCQkJCXN3aXRjaChjYXJkX3NlbGVjdF9tZXRob2QpCisJCQkJeworCQkJCQljYXNlIE1DX1NFTEVDVF9DQVJESUQ6IC8vIENBUkRJRAorCQkJCQkJc3ByaW50ZihjYXJkX2lkX2J1ZiwgIiUwMmRDQVJESUQiLCBjYXJkX21hdGNoX2lkKTsKKwkJCQkJCWJyZWFrOworCisJCQkJCWNhc2UgTUNfU0VMRUNUX01BQzogLy8gTUFDCisJCQkJCQlzcHJpbnRmKGNhcmRfaWRfYnVmLAorCQkJCQkJCQkiJTAyZG1hYyUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IiwKKwkJCQkJCQkJY2FyZF9tYXRjaF9pZCwKKwkJCQkJCQkJbWFjWzBdLCBtYWNbMV0sIG1hY1syXSwKKwkJCQkJCQkJbWFjWzNdLCBtYWNbNF0sIG1hY1s1XSk7CisJCQkJCQlicmVhazsKKworCQkJCQljYXNlIE1DX1NFTEVDVF9DQVJEVFlQRTogLy8gQ0FSRFRZUEUKKwkJCQkJZGVmYXVsdDoKKwkJCQkJCXNwcmludGYoY2FyZF9pZF9idWYsICIlMDJkY2FyZHR5cGUlcyIsCisJCQkJCQkJCWNhcmRfbWF0Y2hfaWQsIFJGSUNfd29yZCk7CisJCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZWFyY2ggS2V5d29yZCA9ICVzXG4iLCBjYXJkX2lkX2J1ZikpOworCisJCQkJLy8gcmVhZCBjYXJkIGZpbGUgcGF0aAorCQkJCWlmIChSVE1QR2V0S2V5UGFyYW1ldGVyKGNhcmRfaWRfYnVmLCB0bXBidWYsIDI1NiwgYnVmZmVyKSkKKwkJCQl7CisJCQkJCWlmIChzdHJsZW4odG1wYnVmKSA8IHNpemVvZihwQWQtPk1DX0ZpbGVOYW1lKSkKKwkJCQkJeworCQkJCQkJLy8gYmFja3VwIGNhcmQgaW5mb3JtYXRpb24KKwkJCQkJCXBBZC0+TUNfUm93SUQgPSBjYXJkX21hdGNoX2lkOyAvKiBiYXNlIDAgKi8KKwkJCQkJCU1DX0NhcmRVc2VkW2NhcmRfbWF0Y2hfaWRdID0gMTsKKwkJCQkJCW1lbWNweShNQ19DYXJkTWFjW2NhcmRfbWF0Y2hfaWRdLCBtYWMsIHNpemVvZihtYWMpKTsKKworCQkJCQkJLy8gYmFja3VwIGNhcmQgZmlsZSBwYXRoCisJCQkJCQlOZGlzTW92ZU1lbW9yeShwQWQtPk1DX0ZpbGVOYW1lLCB0bXBidWYgLCBzdHJsZW4odG1wYnVmKSk7CisJCQkJCQlwQWQtPk1DX0ZpbGVOYW1lW3N0cmxlbih0bXBidWYpXSA9ICdcMCc7CisJCQkJCQlmbGdfbWF0Y2hfb2sgPSBUUlVFOworCisJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkJCQkJKCJDYXJkIFByb2ZpbGUgTmFtZSA9ICVzXG4iLCBwQWQtPk1DX0ZpbGVOYW1lKSk7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCQkJCQkJKCJDYXJkIFByb2ZpbGUgTmFtZSBsZW5ndGggdG9vIGxhcmdlIVxuIikpOworCQkJCQl9CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJCQkJCSgiQ2FuIG5vdCBmaW5kIHNlYXJjaCBrZXkgd29yZCBpbiBjYXJkLmRhdCFcbiIpKTsKKwkJCQl9CisKKwkJCQlpZiAoKGZsZ19tYXRjaF9vayAhPSBUUlVFKSAmJgorCQkJCQkoY2FyZF9tYXRjaF9pZCA8IE1BWF9OVU1fT0ZfTVVMVElQTEVfQ0FSRCkpCisJCQkJeworCQkJCQlNQ19DYXJkVXNlZFtjYXJkX21hdGNoX2lkXSA9IDA7CisJCQkJCW1lbXNldChNQ19DYXJkTWFjW2NhcmRfbWF0Y2hfaWRdLCAwLCBzaXplb2YobWFjKSk7CisJCQkJfQorCQkJfSAvLyBpZiAoY2FyZF9tYXRjaF9pZCA+PSAwKQorCQl9CisJfQorCisJLy8gY2xvc2UgZmlsZQorCXJldHZhbCA9IGZpbHBfY2xvc2Uoc3JjZiwgTlVMTCk7CisJc2V0X2ZzKG9yZ2ZzKTsKKwljdXJyZW50LT5mc3VpZCA9IG9yZ2ZzdWlkOworCWN1cnJlbnQtPmZzZ2lkID0gb3JnZnNnaWQ7CisJa2ZyZWUoYnVmZmVyKTsKKwlrZnJlZSh0bXBidWYpOworCXJldHVybiBmbGdfbWF0Y2hfb2s7Cit9CisjZW5kaWYgLy8gTVVMVElQTEVfQ0FSRF9TVVBQT1JUIC8vCisKKworLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICBQcm9iZSBSVDI4WFggY2hpcHNldC4KKworQXJndW1lbnRzOgorICAgIF9kZXZfcAkJCQlQb2ludCB0byB0aGUgUENJIG9yIFVTQiBkZXZpY2UKKwlfZGV2X2lkX3AJCQlQb2ludCB0byB0aGUgUENJIG9yIFVTQiBkZXZpY2UgSUQKKworUmV0dXJuIFZhbHVlOgorICAgIDAJCQkJCVByb2JlIE9LCisJLUVOT0RFVgkJCQlQcm9iZSBGYWlsCisKK05vdGU6Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQgX19kZXZpbml0ICAgcnQyOHh4X3Byb2JlKAorICAgIElOICB2b2lkICpfZGV2X3AsCisgICAgSU4gIHZvaWQgKl9kZXZfaWRfcCwKKwlJTiAgVUlOVCBhcmdjLAorCU9VVCBQUlRNUF9BREFQVEVSICpwcEFkKQoreworICAgIHN0cnVjdCAgbmV0X2RldmljZQkqbmV0X2RldjsKKyAgICBQUlRNUF9BREFQVEVSICAgICAgIHBBZCA9IChQUlRNUF9BREFQVEVSKSBOVUxMOworICAgIElOVCAgICAgICAgICAgICAgICAgc3RhdHVzOworCVBWT0lECQkJCWhhbmRsZTsKKyNpZmRlZiBSVDI4NzAKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkJLyoga2VybmVsIDIuNCBzZXJpZXMgKi8KKwlzdHJ1Y3QgdXNiX2RldmljZSAqZGV2X3AgPSAoc3RydWN0IHVzYl9kZXZpY2UgKilfZGV2X3A7CisjZWxzZQorCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmID0gKHN0cnVjdCB1c2JfaW50ZXJmYWNlICopX2Rldl9wOworCXN0cnVjdCB1c2JfZGV2aWNlICpkZXZfcCA9IGludGVyZmFjZV90b191c2JkZXYoaW50Zik7CisKKwlkZXZfcCA9IHVzYl9nZXRfZGV2KGRldl9wKTsKKyNlbmRpZiAvLyBMSU5VWF9WRVJTSU9OX0NPREUgLy8KKyNlbmRpZiAvLyBSVDI4NzAgLy8KKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU1RBIERyaXZlciB2ZXJzaW9uLSVzXG4iLCBTVEFfRFJJVkVSX1ZFUlNJT04pKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCS8vIENoZWNrIGNoaXBzZXQgdmVuZG9yL3Byb2R1Y3QgSUQKKy8vCWlmIChSVDI4WFhDaGlwc2V0Q2hlY2soX2Rldl9wKSA9PSBGQUxTRSkKKy8vCQlnb3RvIGVycl9vdXQ7CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPD0gMHgyMDQwMiAgICAgICAvLyBSZWQgSGF0IDcuMQorICAgIG5ldF9kZXYgPSBhbGxvY19uZXRkZXYoc2l6ZW9mKFBSVE1QX0FEQVBURVIpLCAiZXRoJWQiLCBldGhlcl9zZXR1cCk7CisjZWxzZQorICAgIG5ldF9kZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2YoUFJUTVBfQURBUFRFUikpOworI2VuZGlmCisgICAgaWYgKG5ldF9kZXYgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIHByaW50aygiYWxsb2NfbmV0ZGV2IGZhaWxlZFxuIik7CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDE1KQorCQltb2R1bGVfcHV0KFRISVNfTU9EVUxFKTsKKyNlbmRpZiAvL0xJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwxNSkKKyNlbHNlCisJCU1PRF9ERUNfVVNFX0NPVU5UOworI2VuZGlmCisgICAgICAgIGdvdG8gZXJyX291dDsKKyAgICB9CisKKy8vIHNhbXBsZQorLy8JaWYgKHJ0X2llZWU4MDIxMV9pZl9zZXR1cChuZXRfZGV2KSAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorLy8JCWdvdG8gZXJyX291dDsKKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwyNCkKKyAgICBTRVRfTU9EVUxFX09XTkVSKG5ldF9kZXYpOworI2VuZGlmCisKKwluZXRpZl9zdG9wX3F1ZXVlKG5ldF9kZXYpOworI2lmZGVmIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisvKiBmb3Igc3VwcG9ydGluZyBOZXR3b3JrIE1hbmFnZXIgKi8KKy8qIFNldCB0aGUgc3lzZnMgcGh5c2ljYWwgZGV2aWNlIHJlZmVyZW5jZSBmb3IgdGhlIG5ldHdvcmsgbG9naWNhbCBkZXZpY2UKKyAqIGlmIHNldCBwcmlvciB0byByZWdpc3RyYXRpb24gd2lsbCBjYXVzZSBhIHN5bWxpbmsgZHVyaW5nIGluaXRpYWxpemF0aW9uLgorICovCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMCkpCisgICAgU0VUX05FVERFVl9ERVYobmV0X2RldiwgJihkZXZfcC0+ZGV2KSk7CisjZW5kaWYKKyNlbmRpZiAvLyBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCisJLy8gQWxsb2NhdGUgUlRNUF9BREFQVEVSIG1pbmlwb3J0IGFkYXB0ZXIgc3RydWN0dXJlCisJaGFuZGxlID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IG9zX2Nvb2tpZSksIEdGUF9LRVJORUwpOworCVJUMjhYWF9IQU5ETEVfREVWX0FTU0lHTihoYW5kbGUsIGRldl9wKTsKKworCXN0YXR1cyA9IFJUTVBBbGxvY0FkYXB0ZXJCbG9jayhoYW5kbGUsICZwQWQpOworCWlmIChzdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJZ290byBlcnJfb3V0X2ZyZWVfbmV0ZGV2OworCisJbmV0X2Rldi0+bWxfcHJpdiA9IChQVk9JRClwQWQ7CisgICAgcEFkLT5uZXRfZGV2ID0gbmV0X2RldjsgLy8gbXVzdCBiZSBiZWZvcmUgUlQyOFhYTmV0RGV2SW5pdCgpCisKKwlSVDI4WFhOZXREZXZJbml0KF9kZXZfcCwgbmV0X2RldiwgcEFkKTsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorICAgIHBBZC0+U3RhQ2ZnLk9yaURldlR5cGUgPSBuZXRfZGV2LT50eXBlOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJLy8gRmluZCBhbmQgYXNzaWduIGEgZnJlZSBpbnRlcmZhY2UgbmFtZSwgcmF4eAorLy8JUlQyOFhYQXZhaWxSQU5hbWVBc3NpZ24obmV0X2Rldi0+bmFtZSk7CisKKwkvLyBQb3N0IGNvbmZpZworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQorCWlmIChSVDI4WFhQcm9iZVBvc3RDb25maWcoX2Rldl9wLCBwQWQsIGFyZ2MpID09IEZBTFNFKQorCQlnb3RvIGVycl9vdXRfdW5tYXA7CisjZWxzZQorCWlmIChSVDI4WFhQcm9iZVBvc3RDb25maWcoX2Rldl9wLCBwQWQsIDApID09IEZBTFNFKQorCQlnb3RvIGVycl9vdXRfdW5tYXA7CisjZW5kaWYgLy8gTElOVVhfVkVSU0lPTl9DT0RFIC8vCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlwQWQtPk9wTW9kZSA9IE9QTU9ERV9TVEE7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKworI2lmZGVmIE1VTFRJUExFX0NBUkRfU1VQUE9SVAorCS8vIGZpbmQgaXRzIHByb2ZpbGUgcGF0aAorCXBBZC0+TUNfUm93SUQgPSAtMTsgLy8gdXNlIGRlZmF1bHQgcHJvZmlsZSBwYXRoCisJUlRNUF9DYXJkSW5mb1JlYWQocEFkKTsKKworCWlmIChwQWQtPk1DX1Jvd0lEID09IC0xKQorI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQlzdHJjcHkocEFkLT5NQ19GaWxlTmFtZSwgU1RBX1BST0ZJTEVfUEFUSCk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSgiTUM+IFJPVyA9ICVkLCBQQVRIID0gJXNcbiIsIHBBZC0+TUNfUm93SUQsIHBBZC0+TUNfRmlsZU5hbWUpKTsKKyNlbmRpZiAvLyBNVUxUSVBMRV9DQVJEX1NVUFBPUlQgLy8KKworCS8vIHNhbXBsZSBtb3ZlCisJaWYgKHJ0X2llZWU4MDIxMV9pZl9zZXR1cChuZXRfZGV2LCBwQWQpICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJCWdvdG8gZXJyX291dF91bm1hcDsKKworICAgIC8vIFJlZ2lzdGVyIHRoaXMgZGV2aWNlCisgICAgc3RhdHVzID0gcmVnaXN0ZXJfbmV0ZGV2KG5ldF9kZXYpOworICAgIGlmIChzdGF0dXMpCisgICAgICAgIGdvdG8gZXJyX291dF91bm1hcDsKKworICAgIC8vIFNldCBkcml2ZXIgZGF0YQorCVJUMjhYWF9EUlZEQVRBX1NFVChfZGV2X3ApOworCisKKworCSpwcEFkID0gcEFkOworICAgIHJldHVybiAwOyAvLyBwcm9iZSBvaworCisKKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRVJST1IgSEFORExFIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworZXJyX291dF91bm1hcDoKKwlSVE1QRnJlZUFkYXB0ZXIocEFkKTsKKwlSVDI4WFhfVU5NQVAoKTsKKworZXJyX291dF9mcmVlX25ldGRldjoKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApCisgICAgZnJlZV9uZXRkZXYobmV0X2Rldik7CisjZWxzZQorCWtmcmVlKG5ldF9kZXYpOworI2VuZGlmCisKK2Vycl9vdXQ6CisJUlQyOFhYX1BVVF9ERVZJQ0UoZGV2X3ApOworCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDApCisJcmV0dXJuIChMT05HKU5VTEw7CisjZWxzZQorICAgIHJldHVybiAtRU5PREVWOyAvKiBwcm9iZSBmYWlsICovCisjZW5kaWYgLy8gTElOVVhfVkVSU0lPTl9DT0RFIC8vCit9IC8qIEVuZCBvZiBydDI4eHhfcHJvYmUgKi8KKworCisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgIFRoZSBlbnRyeSBwb2ludCBmb3IgTGludXgga2VybmVsIHNlbnQgcGFja2V0IHRvIG91ciBkcml2ZXIuCisKK0FyZ3VtZW50czoKKyAgICBza19idWZmICpza2IJCXRoZSBwb2ludGVyIHJlZmVyIHRvIGEgc2tfYnVmZmVyLgorCitSZXR1cm4gVmFsdWU6CisgICAgMAorCitOb3RlOgorCVRoaXMgZnVuY3Rpb24gaXMgdGhlIGVudHJ5IHBvaW50IG9mIFR4IFBhdGggZm9yIE9zIGRlbGl2ZXJ5IHBhY2tldCB0bworCW91ciBkcml2ZXIuIFlvdSBvbmx5IGNhbiBwdXQgT1MtZGVwZW5lZCAmIFNUQS9BUCBjb21tb24gaGFuZGxlIHByb2NlZHVyZXMKKwlpbiBoZXJlLgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworaW50IHJ0Mjh4eF9wYWNrZXRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2ID0gc2tiLT5kZXY7CisJUFJUTVBfQURBUFRFUiBwQWQgPSBuZXRfZGV2LT5tbF9wcml2OworCWludCBzdGF0dXMgPSAwOworCVBORElTX1BBQ0tFVCBwUGFja2V0ID0gKFBORElTX1BBQ0tFVCkgc2tiOworCisJLyogUlQyODcwU1RBIGRvZXMgdGhpcyBpbiBSVE1QU2VuZFBhY2tldHMoKSAqLworI2lmZGVmIFJBTElOS19BVEUKKwlpZiAoQVRFX09OKHBBZCkpCisJeworCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFBhY2tldCwgTkRJU19TVEFUVVNfUkVTT1VSQ0VTKTsKKwkJcmV0dXJuIDA7CisJfQorI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJeworCQkvLyBEcm9wIHNlbmQgcmVxdWVzdCBzaW5jZSB3ZSBhcmUgaW4gbW9uaXRvciBtb2RlCisJCWlmIChNT05JVE9SX09OKHBBZCkpCisJCXsKKwkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworICAgICAgICAvLyBFYXBvbFN0YXJ0IHNpemUgaXMgMTgKKwlpZiAoc2tiLT5sZW4gPCAxNCkKKwl7CisJCS8vcHJpbnRrKCJiYWQgcGFja2V0IHNpemU6ICVkXG4iLCBwa3QtPmxlbik7CisJCWhleF9kdW1wKCJiYWQgcGFja2V0Iiwgc2tiLT5kYXRhLCBza2ItPmxlbik7CisJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJZ290byBkb25lOworCX0KKworI2lmIDAKKy8vCWlmICgocGt0LT5kYXRhWzBdICYgMHgxKSA9PSAwKQorCXsKKwkJLy9oZXhfZHVtcChfX2Z1bmNfXywgcGt0LT5kYXRhLCBwa3QtPmxlbik7CisJCXByaW50aygicFBhY2tldCA9ICV4XG4iLCBwUGFja2V0KTsKKwl9CisjZW5kaWYKKworCVJUTVBfU0VUX1BBQ0tFVF81VlQocFBhY2tldCwgMCk7CisvLwlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIHBrdC0+ZGF0YSwgcGt0LT5sZW4pOworI2lmZGVmIENPTkZJR181VlRfRU5IQU5DRQorICAgIGlmICgqKGludCopKHNrYi0+Y2IpID09IEJSSURHRV9UQUcpIHsKKwkJUlRNUF9TRVRfUEFDS0VUXzVWVChwUGFja2V0LCAxKTsKKyAgICB9CisjZW5kaWYKKworCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCXsKKworCQlTVEFTZW5kUGFja2V0cygoTkRJU19IQU5ETEUpcEFkLCAoUFBORElTX1BBQ0tFVCkgJnBQYWNrZXQsIDEpOworCX0KKworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJc3RhdHVzID0gMDsKK2RvbmU6CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1JvdXRpbmUgRGVzY3JpcHRpb246CisgICAgU2VuZCBhIHBhY2tldCB0byBXTEFOLgorCitBcmd1bWVudHM6CisgICAgc2tiX3AgICAgICAgICAgIHBvaW50cyB0byBvdXIgYWRhcHRlcgorICAgIGRldl9wICAgICAgICAgICB3aGljaCBXTEFOIG5ldHdvcmsgaW50ZXJmYWNlCisKK1JldHVybiBWYWx1ZToKKyAgICAwOiB0cmFuc21pdCBzdWNjZXNzZnVsbHkKKyAgICBvdGhlcndpc2U6IHRyYW5zbWl0IGZhaWwKKworTm90ZToKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVCBydDI4eHhfc2VuZF9wYWNrZXRzKAorCUlOIHN0cnVjdCBza19idWZmIAkJKnNrYl9wLAorCUlOIHN0cnVjdCBuZXRfZGV2aWNlIAkqbmV0X2RldikKK3sKKyAgICBSVE1QX0FEQVBURVIgKnBBZCA9IG5ldF9kZXYtPm1sX3ByaXY7CisKKwlpZiAoIShuZXRfZGV2LT5mbGFncyAmIElGRl9VUCkpCisJeworCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgKFBORElTX1BBQ0tFVClza2JfcCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCXJldHVybiAwOworCX0KKworCU5kaXNaZXJvTWVtb3J5KChQVUNIQVIpJnNrYl9wLT5jYltDQl9PRkZdLCAxNSk7CisJUlRNUF9TRVRfUEFDS0VUX05FVF9ERVZJQ0VfTUJTU0lEKHNrYl9wLCBNQUlOX01CU1NJRCk7CisKKwlyZXR1cm4gcnQyOHh4X3BhY2tldF94bWl0KHNrYl9wKTsKK30gLyogRW5kIG9mIE1CU1NfVmlydHVhbElGX1BhY2tldFNlbmQgKi8KKworCisKKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8PSAweDIwNDAyCS8vIFJlZCBIYXQgNy4xCisvL3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqYWxsb2NfbmV0ZGV2KGludCBzaXplb2ZfcHJpdiwgY29uc3QgY2hhciAqbWFzaywgdm9pZCAoKnNldHVwKShzdHJ1Y3QgbmV0X2RldmljZSAqKSkgLy9zYW1wbGUKK3N0cnVjdCBuZXRfZGV2aWNlICphbGxvY19uZXRkZXYoCisJaW50IHNpemVvZl9wcml2LAorCWNvbnN0IGNoYXIgKm1hc2ssCisJdm9pZCAoKnNldHVwKShzdHJ1Y3QgbmV0X2RldmljZSAqKSkKK3sKKyAgICBzdHJ1Y3QgbmV0X2RldmljZQkqZGV2OworICAgIElOVAkJCQkJYWxsb2Nfc2l6ZTsKKworCisgICAgLyogZW5zdXJlIDMyLWJ5dGUgYWxpZ25tZW50IG9mIHRoZSBwcml2YXRlIGFyZWEgKi8KKyAgICBhbGxvY19zaXplID0gc2l6ZW9mICgqZGV2KSArIHNpemVvZl9wcml2ICsgMzE7CisKKyAgICBkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKikga21hbGxvYyhhbGxvY19zaXplLCBHRlBfS0VSTkVMKTsKKyAgICBpZiAoZGV2ID09IE5VTEwpCisgICAgeworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCQkoImFsbG9jX25ldGRldjogVW5hYmxlIHRvIGFsbG9jYXRlIGRldmljZSBtZW1vcnkuXG4iKSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIG1lbXNldChkZXYsIDAsIGFsbG9jX3NpemUpOworCisgICAgaWYgKHNpemVvZl9wcml2KQorICAgICAgICBkZXYtPnByaXYgPSAodm9pZCAqKSAoKChsb25nKShkZXYgKyAxKSArIDMxKSAmIH4zMSk7CisKKyAgICBzZXR1cChkZXYpOworICAgIHN0cmNweShkZXYtPm5hbWUsIG1hc2spOworCisgICAgcmV0dXJuIGRldjsKK30KKyNlbmRpZiAvLyBMSU5VWF9WRVJTSU9OX0NPREUgLy8KKworCit2b2lkIENmZ0luaXRIb29rKFBSVE1QX0FEQVBURVIgcEFkKQoreworCXBBZC0+YkJyb2FkQ29tSFQgPSBUUlVFOworfSAvKiBFbmQgb2YgQ2ZnSW5pdEhvb2sgKi8KKworCisjaWYgMAkvLyBOb3QgdXNlZCBub3csIHNob3VsZCBrZWVwIGl0IGluIG91ciBzb3VyY2UgdHJlZT8/CisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgIEZpbmQgYW5kIGFzc2lnbiBhIGZyZWUgaW50ZXJmYWNlIG5hbWUgKHJheHgpLgorCitBcmd1bWVudHM6CisgICAgKm5hbWVfcAkJCQl0aGUgaW50ZXJmYWNlIG5hbWUgcG9pbnRlcgorCitSZXR1cm4gVmFsdWU6CisJVFJVRQkJCQlPSworCUZBTFNFCQkJCUZBSUwKKworTm90ZToKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK3N0YXRpYyBCT09MRUFOIFJUMjhYWEF2YWlsUkFOYW1lQXNzaWduKAorCUlOIENIQVIJCQkqbmFtZV9wKQoreworICAgIENIQVIJCQkJc2xvdF9uYW1lW0lGTkFNU0laXTsKKyAgICBzdHJ1Y3QgbmV0X2RldmljZQkqZGV2aWNlOworCVVJTlQzMgkJCQlpZl9pZDsKKworCisgICAgZm9yKGlmX2lkPTA7IGlmX2lkPDg7IGlmX2lkKyspCisgICAgeworICAgICAgICBzcHJpbnRmKHNsb3RfbmFtZSwgInJhJWQiLCBpZl9pZCk7CisKKyAgICAgICAgZm9yKGRldmljZT1kZXZfYmFzZTsgZGV2aWNlIT1OVUxMOyBkZXZpY2U9ZGV2aWNlLT5uZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoc3RybmNtcChkZXZpY2UtPm5hbWUsIHNsb3RfbmFtZSwgNCkgPT0gMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChkZXZpY2UgPT0gTlVMTCkKKwkJCWJyZWFrOworICAgIH0KKworICAgIGlmIChpZl9pZCA9PSA4KQorICAgIHsKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiTm8gYXZhaWxhYmxlIHNsb3QgbmFtZVxuIikpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgc3ByaW50ZihuYW1lX3AsICJyYSVkIiwgaWZfaWQpOworCXJldHVybiBUUlVFOworfSAvKiBFbmQgb2YgUlQyOFhYQXZhaWxSQU5hbWVBc3NpZ24gKi8KKyNlbmRpZgorCisjaWYgV0lSRUxFU1NfRVhUID49IDEyCisvLyBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIHdoZW4gcXVlcnkgL3Byb2MKK3N0cnVjdCBpd19zdGF0aXN0aWNzICpydDI4eHhfZ2V0X3dpcmVsZXNzX3N0YXRzKAorICAgIElOIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2KQoreworCVBSVE1QX0FEQVBURVIgcEFkID0gbmV0X2Rldi0+bWxfcHJpdjsKKworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgicnQyOHh4X2dldF93aXJlbGVzc19zdGF0cyAtLS0+XG4iKSk7CisKKwlwQWQtPml3X3N0YXRzLnN0YXR1cyA9IDA7IC8vIFN0YXR1cyAtIGRldmljZSBkZXBlbmRlbnQgZm9yIG5vdworCisJLy8gbGluayBxdWFsaXR5CisJcEFkLT5pd19zdGF0cy5xdWFsLnF1YWwgPSAoKHBBZC0+TWxtZS5DaGFubmVsUXVhbGl0eSAqIDEyKS8xMCArIDEwKTsKKwlpZihwQWQtPml3X3N0YXRzLnF1YWwucXVhbCA+IDEwMCkKKwkJcEFkLT5pd19zdGF0cy5xdWFsLnF1YWwgPSAxMDA7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlpZiAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkKKwkJcEFkLT5pd19zdGF0cy5xdWFsLmxldmVsID0gUlRNUE1heFJzc2kocEFkLCBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMCwgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTEsIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kyKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCXBBZC0+aXdfc3RhdHMucXVhbC5ub2lzZSA9IHBBZC0+QmJwV3JpdGVMYXRjaFs2Nl07IC8vIG5vaXNlIGxldmVsIChkQm0pCisKKwlwQWQtPml3X3N0YXRzLnF1YWwubm9pc2UgKz0gMjU2IC0gMTQzOworCXBBZC0+aXdfc3RhdHMucXVhbC51cGRhdGVkID0gMTsgICAgIC8vIEZsYWdzIHRvIGtub3cgaWYgdXBkYXRlZAorI2lmZGVmIElXX1FVQUxfREJNCisJcEFkLT5pd19zdGF0cy5xdWFsLnVwZGF0ZWQgfD0gSVdfUVVBTF9EQk07CS8vIExldmVsICsgTm9pc2UgYXJlIGRCbQorI2VuZGlmIC8vIElXX1FVQUxfREJNIC8vCisKKwlwQWQtPml3X3N0YXRzLmRpc2NhcmQubndpZCA9IDA7ICAgICAvLyBSeCA6IFdyb25nIG53aWQvZXNzaWQKKwlwQWQtPml3X3N0YXRzLm1pc3MuYmVhY29uID0gMDsgICAgICAvLyBNaXNzZWQgYmVhY29ucy9zdXBlcmZyYW1lCisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8LS0tIHJ0Mjh4eF9nZXRfd2lyZWxlc3Nfc3RhdHNcbiIpKTsKKwlyZXR1cm4gJnBBZC0+aXdfc3RhdHM7Cit9IC8qIEVuZCBvZiBydDI4eHhfZ2V0X3dpcmVsZXNzX3N0YXRzICovCisjZW5kaWYgLy8gV0lSRUxFU1NfRVhUIC8vCisKKworCit2b2lkIHRidHRfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisjZGVmaW5lIE1BWF9UWF9JTl9UQlRUCQkoMTYpCisKK30KKworSU5UIHJ0Mjh4eF9pb2N0bCgKKwlJTglzdHJ1Y3QgbmV0X2RldmljZQkqbmV0X2RldiwKKwlJTglPVVQJc3RydWN0IGlmcmVxCSpycSwKKwlJTglJTlQJCQkJCWNtZCkKK3sKKwlWSVJUVUFMX0FEQVBURVIJKnBWaXJ0dWFsQWQgPSBOVUxMOworCVJUTVBfQURBUFRFUgkqcEFkID0gTlVMTDsKKwlJTlQJCQkJcmV0ID0gMDsKKworCWlmIChuZXRfZGV2LT5wcml2X2ZsYWdzID09IElOVF9NQUlOKQorCXsKKwkJcEFkID0gbmV0X2Rldi0+bWxfcHJpdjsKKwl9CisJZWxzZQorCXsKKwkJcFZpcnR1YWxBZCA9IG5ldF9kZXYtPm1sX3ByaXY7CisJCXBBZCA9IHBWaXJ0dWFsQWQtPlJ0bXBEZXYtPm1sX3ByaXY7CisJfQorCisJaWYgKHBBZCA9PSBOVUxMKQorCXsKKwkJLyogaWYgMXN0IG9wZW4gZmFpbCwgcEFkIHdpbGwgYmUgZnJlZTsKKwkJICAgU28gdGhlIG5ldF9kZXYtPm1sX3ByaXYgd2lsbCBiZSBOVUxMIGluIDJyZCBvcGVuICovCisJCXJldHVybiAtRU5FVERPV047CisJfQorCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCXsKKwkJcmV0ID0gcnQyOHh4X3N0YV9pb2N0bChuZXRfZGV2LCBycSwgY21kKTsKKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlyZXR1cm4gcmV0OworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICAgICAgcmV0dXJuIGV0aGVybmV0IHN0YXRpc3RpY3MgY291bnRlcgorCisgICAgQXJndW1lbnRzOgorICAgICAgICBuZXRfZGV2ICAgICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byBuZXRfZGV2aWNlCisKKyAgICBSZXR1cm4gVmFsdWU6CisgICAgICAgIG5ldF9kZXZpY2Vfc3RhdHMqCisKKyAgICBOb3RlOgorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKlJUMjh4eF9nZXRfZXRoZXJfc3RhdHMoCisgICAgSU4gIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2KQoreworICAgIFJUTVBfQURBUFRFUiAqcEFkID0gTlVMTDsKKworCWlmIChuZXRfZGV2KQorCQlwQWQgPSBuZXRfZGV2LT5tbF9wcml2OworCisJaWYgKHBBZCkKKwl7CisKKwkJcEFkLT5zdGF0cy5yeF9wYWNrZXRzID0gcEFkLT5XbGFuQ291bnRlcnMuUmVjZWl2ZWRGcmFnbWVudENvdW50LlF1YWRQYXJ0OworCQlwQWQtPnN0YXRzLnR4X3BhY2tldHMgPSBwQWQtPldsYW5Db3VudGVycy5UcmFuc21pdHRlZEZyYWdtZW50Q291bnQuUXVhZFBhcnQ7CisKKwkJcEFkLT5zdGF0cy5yeF9ieXRlcyA9IHBBZC0+UmFsaW5rQ291bnRlcnMuUmVjZWl2ZWRCeXRlQ291bnQ7CisJCXBBZC0+c3RhdHMudHhfYnl0ZXMgPSBwQWQtPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkQnl0ZUNvdW50OworCisJCXBBZC0+c3RhdHMucnhfZXJyb3JzID0gcEFkLT5Db3VudGVyczgwMjMuUnhFcnJvcnM7CisJCXBBZC0+c3RhdHMudHhfZXJyb3JzID0gcEFkLT5Db3VudGVyczgwMjMuVHhFcnJvcnM7CisKKwkJcEFkLT5zdGF0cy5yeF9kcm9wcGVkID0gMDsKKwkJcEFkLT5zdGF0cy50eF9kcm9wcGVkID0gMDsKKworCSAgICBwQWQtPnN0YXRzLm11bHRpY2FzdCA9IHBBZC0+V2xhbkNvdW50ZXJzLk11bHRpY2FzdFJlY2VpdmVkRnJhbWVDb3VudC5RdWFkUGFydDsgICAvLyBtdWx0aWNhc3QgcGFja2V0cyByZWNlaXZlZAorCSAgICBwQWQtPnN0YXRzLmNvbGxpc2lvbnMgPSBwQWQtPkNvdW50ZXJzODAyMy5PbmVDb2xsaXNpb24gKyBwQWQtPkNvdW50ZXJzODAyMy5Nb3JlQ29sbGlzaW9uczsgIC8vIENvbGxpc2lvbiBwYWNrZXRzCisKKwkgICAgcEFkLT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzID0gMDsKKwkgICAgcEFkLT5zdGF0cy5yeF9vdmVyX2Vycm9ycyA9IHBBZC0+Q291bnRlcnM4MDIzLlJ4Tm9CdWZmZXI7ICAgICAgICAgICAgICAgICAgIC8vIHJlY2VpdmVyIHJpbmcgYnVmZiBvdmVyZmxvdworCSAgICBwQWQtPnN0YXRzLnJ4X2NyY19lcnJvcnMgPSAwOy8vcEFkLT5XbGFuQ291bnRlcnMuRkNTRXJyb3JDb3VudDsgICAgIC8vIHJlY3ZlZCBwa3Qgd2l0aCBjcmMgZXJyb3IKKwkgICAgcEFkLT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMgPSBwQWQtPkNvdW50ZXJzODAyMy5SY3ZBbGlnbm1lbnRFcnJvcnM7ICAgICAgICAgIC8vIHJlY3YnZCBmcmFtZSBhbGlnbm1lbnQgZXJyb3IKKwkgICAgcEFkLT5zdGF0cy5yeF9maWZvX2Vycm9ycyA9IHBBZC0+Q291bnRlcnM4MDIzLlJ4Tm9CdWZmZXI7ICAgICAgICAgICAgICAgICAgIC8vIHJlY3YnciBmaWZvIG92ZXJydW4KKwkgICAgcEFkLT5zdGF0cy5yeF9taXNzZWRfZXJyb3JzID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlY2VpdmVyIG1pc3NlZCBwYWNrZXQKKworCSAgICAvLyBkZXRhaWxlZCB0eF9lcnJvcnMKKwkgICAgcEFkLT5zdGF0cy50eF9hYm9ydGVkX2Vycm9ycyA9IDA7CisJICAgIHBBZC0+c3RhdHMudHhfY2Fycmllcl9lcnJvcnMgPSAwOworCSAgICBwQWQtPnN0YXRzLnR4X2ZpZm9fZXJyb3JzID0gMDsKKwkgICAgcEFkLT5zdGF0cy50eF9oZWFydGJlYXRfZXJyb3JzID0gMDsKKwkgICAgcEFkLT5zdGF0cy50eF93aW5kb3dfZXJyb3JzID0gMDsKKworCSAgICAvLyBmb3IgY3NsaXAgZXRjCisJICAgIHBBZC0+c3RhdHMucnhfY29tcHJlc3NlZCA9IDA7CisJICAgIHBBZC0+c3RhdHMudHhfY29tcHJlc3NlZCA9IDA7CisKKwkJcmV0dXJuICZwQWQtPnN0YXRzOworCX0KKwllbHNlCisgICAgCXJldHVybiBOVUxMOworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3J0X3Byb2ZpbGUuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvcnRfcHJvZmlsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2N2ZlYTMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3J0X3Byb2ZpbGUuYwpAQCAtMCwwICsxLDIwMjAgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKyNpbmNsdWRlICJydF9jb25maWcuaCIKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorc3RhdGljIHZvaWQgSFRQYXJhbWV0ZXJzSG9vaygKKwlJTglQUlRNUF9BREFQVEVSIHBBZCwKKwlJTglDSEFSCQkgICpwVmFsdWVTdHIsCisJSU4JQ0hBUgkJICAqcElucHV0KTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworI2RlZmluZSBFVEhfTUFDX0FERFJfU1RSX0xFTiAxNyAgLy8gaW4gZm9ybWF0IG9mIHh4Onh4Onh4Onh4Onh4Onh4CisKKy8vIFdlIGFzc3VtZSB0aGUgczEgaXMgYSBzdGluZywgczIgaXMgYSBtZW1vcnkgc3BhY2Ugd2l0aCA2IGJ5dGVzLiBhbmQgY29udGVudCBvZiBzMSB3aWxsIGJlIGNoYW5nZWQuCitCT09MRUFOIHJ0c3RybWFjdG9oZXgoY2hhciAqczEsIGNoYXIgKnMyKQoreworCWludCBpID0gMDsKKwljaGFyICpwdG9rUyA9IHMxLCAqcHRva0UgPSBzMTsKKworCWlmIChzdHJsZW4oczEpICE9IEVUSF9NQUNfQUREUl9TVFJfTEVOKQorCQlyZXR1cm4gRkFMU0U7CisKKwl3aGlsZSgoKnB0b2tTKSAhPSAnXDAnKQorCXsKKwkJaWYoKHB0b2tFID0gc3RyY2hyKHB0b2tTLCAnOicpKSAhPSBOVUxMKQorCQkJKnB0b2tFKysgPSAnXDAnOworCQlpZiAoKHN0cmxlbihwdG9rUykgIT0gMikgfHwgKCFpc3hkaWdpdCgqcHRva1MpKSB8fCAoIWlzeGRpZ2l0KCoocHRva1MrMSkpKSkKKwkJCWJyZWFrOyAvLyBmYWlsCisJCUF0b0gocHRva1MsICZzMltpKytdLCAxKTsKKwkJcHRva1MgPSBwdG9rRTsKKwkJaWYgKGkgPT0gNikKKwkJCWJyZWFrOyAvLyBwYXJzaW5nIGZpbmlzaGVkCisJfQorCisJcmV0dXJuICggaSA9PSA2ID8gVFJVRSA6IEZBTFNFKTsKKworfQorCisKKy8vIHdlIGFzc3VtZSB0aGUgczEgYW5kIHMyIGJvdGggYXJlIHN0cmluZ3MuCitCT09MRUFOIHJ0c3RyY2FzZWNtcChjaGFyICpzMSwgY2hhciAqczIpCit7CisJY2hhciAqcDEgPSBzMSwgKnAyID0gczI7CisKKwlpZiAoc3RybGVuKHMxKSAhPSBzdHJsZW4oczIpKQorCQlyZXR1cm4gRkFMU0U7CisKKwl3aGlsZSgqcDEgIT0gJ1wwJykKKwl7CisJCWlmKCgqcDEgIT0gKnAyKSAmJiAoKCpwMSBeICpwMikgIT0gMHgyMCkpCisJCQlyZXR1cm4gRkFMU0U7CisJCXAxKys7CisJCXAyKys7CisJfQorCisJcmV0dXJuIFRSVUU7Cit9CisKKy8vIHdlIGFzc3VtZSB0aGUgczEgKGJ1ZmZlcikgYW5kIHMyIChrZXkpIGJvdGggYXJlIHN0cmluZ3MuCitjaGFyICogcnRzdHJzdHJ1bmNhc2VjbXAoY2hhciAqIHMxLCBjaGFyICogczIpCit7CisJSU5UIGwxLCBsMiwgaTsKKwljaGFyIHRlbXAxLCB0ZW1wMjsKKworCWwyID0gc3RybGVuKHMyKTsKKwlpZiAoIWwyKQorCQlyZXR1cm4gKGNoYXIgKikgczE7CisKKwlsMSA9IHN0cmxlbihzMSk7CisKKwl3aGlsZSAobDEgPj0gbDIpCisJeworCQlsMS0tOworCisJCWZvcihpPTA7IGk8bDI7IGkrKykKKwkJeworCQkJdGVtcDEgPSAqKHMxK2kpOworCQkJdGVtcDIgPSAqKHMyK2kpOworCisJCQlpZiAoKCdhJyA8PSB0ZW1wMSkgJiYgKHRlbXAxIDw9ICd6JykpCisJCQkJdGVtcDEgPSAnQScrKHRlbXAxLSdhJyk7CisJCQlpZiAoKCdhJyA8PSB0ZW1wMikgJiYgKHRlbXAyIDw9ICd6JykpCisJCQkJdGVtcDIgPSAnQScrKHRlbXAyLSdhJyk7CisKKwkJCWlmICh0ZW1wMSAhPSB0ZW1wMikKKwkJCQlicmVhazsKKwkJfQorCisJCWlmIChpID09IGwyKQorCQkJcmV0dXJuIChjaGFyICopIHMxOworCisJCXMxKys7CisJfQorCisJcmV0dXJuIE5VTEw7IC8vIG5vdCBmb3VuZAorfQorCisvL2FkZCBieSBrYXRoeQorCisgLyoqCisgICogc3Ryc3RyIC0gRmluZCB0aGUgZmlyc3Qgc3Vic3RyaW5nIGluIGEgJU5VTCB0ZXJtaW5hdGVkIHN0cmluZworICAqIEBzMTogVGhlIHN0cmluZyB0byBiZSBzZWFyY2hlZAorICAqIEBzMjogVGhlIHN0cmluZyB0byBzZWFyY2ggZm9yCisgICovCitjaGFyICogcnRzdHJzdHIoY29uc3QgY2hhciAqIHMxLGNvbnN0IGNoYXIgKiBzMikKK3sKKwlJTlQgbDEsIGwyOworCisJbDIgPSBzdHJsZW4oczIpOworCWlmICghbDIpCisJCXJldHVybiAoY2hhciAqKSBzMTsKKworCWwxID0gc3RybGVuKHMxKTsKKworCXdoaWxlIChsMSA+PSBsMikKKwl7CisJCWwxLS07CisJCWlmICghbWVtY21wKHMxLHMyLGwyKSkKKwkJCXJldHVybiAoY2hhciAqKSBzMTsKKwkJczErKzsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworLyoqCisgKiByc3RydG9rIC0gU3BsaXQgYSBzdHJpbmcgaW50byB0b2tlbnMKKyAqIEBzOiBUaGUgc3RyaW5nIHRvIGJlIHNlYXJjaGVkCisgKiBAY3Q6IFRoZSBjaGFyYWN0ZXJzIHRvIHNlYXJjaCBmb3IKKyAqICogV0FSTklORzogc3RydG9rIGlzIGRlcHJlY2F0ZWQsIHVzZSBzdHJzZXAgaW5zdGVhZC4gSG93ZXZlciBzdHJzZXAgaXMgbm90IGNvbXBhdGlibGUgd2l0aCBvbGQgYXJjaGl0ZWN0dXJlLgorICovCitjaGFyICogX19yc3RydG9rOworY2hhciAqIHJzdHJ0b2soY2hhciAqIHMsY29uc3QgY2hhciAqIGN0KQoreworCWNoYXIgKnNiZWdpbiwgKnNlbmQ7CisKKwlzYmVnaW4gID0gcyA/IHMgOiBfX3JzdHJ0b2s7CisJaWYgKCFzYmVnaW4pCisJeworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlzYmVnaW4gKz0gc3Ryc3BuKHNiZWdpbixjdCk7CisJaWYgKCpzYmVnaW4gPT0gJ1wwJykKKwl7CisJCV9fcnN0cnRvayA9IE5VTEw7CisJCXJldHVybiggTlVMTCApOworCX0KKworCXNlbmQgPSBzdHJwYnJrKCBzYmVnaW4sIGN0KTsKKwlpZiAoc2VuZCAmJiAqc2VuZCAhPSAnXDAnKQorCQkqc2VuZCsrID0gJ1wwJzsKKworCV9fcnN0cnRvayA9IHNlbmQ7CisKKwlyZXR1cm4gKHNiZWdpbik7Cit9CisKKy8qKgorICogZGVsaW1pdGNudCAtIHJldHVybiB0aGUgY291bnQgb2YgYSBnaXZlbiBkZWxpbWl0ZXIgaW4gYSBnaXZlbiBzdHJpbmcuCisgKiBAczogVGhlIHN0cmluZyB0byBiZSBzZWFyY2hlZC4KKyAqIEBjdDogVGhlIGRlbGltaXRlciB0byBzZWFyY2ggZm9yLgorICogTm90aWNlIDogV2Ugc3VwcG9zZSB0aGUgZGVsaW1pdGVyIGlzIGEgc2luZ2xlLWNoYXIgc3RyaW5nKGZvciBleGFtcGxlIDogIjsiKS4KKyAqLworSU5UIGRlbGltaXRjbnQoY2hhciAqIHMsY29uc3QgY2hhciAqIGN0KQoreworCUlOVCBjb3VudCA9IDA7CisJLyogcG9pbnQgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbGluZSAqLworCWNvbnN0IGNoYXIgKnRva2VuID0gczsKKworCWZvciAoIDs7ICkKKwl7CisJCXRva2VuID0gc3RycGJyayh0b2tlbiwgY3QpOyAvKiBzZWFyY2ggZm9yIGRlbGltaXRlcnMgKi8KKworICAgICAgICBpZiAoIHRva2VuID09IE5VTEwgKQorCQl7CisJCQkvKiBhZHZhbmNlZCB0byB0aGUgdGVybWluYXRpbmcgbnVsbCBjaGFyYWN0ZXIgKi8KKwkJCWJyZWFrOworCQl9CisJCS8qIHNraXAgdGhlIGRlbGltaXRlciAqLworCSAgICArK3Rva2VuOworCisJCS8qCisJCSAqIFByaW50IHRoZSBmb3VuZCB0ZXh0OiB1c2UgbGVuIHdpdGggJS4qcyB0byBzcGVjaWZ5IGZpZWxkIHdpZHRoLgorCQkgKi8KKworCQkvKiBhY2N1bXVsYXRlIGRlbGltaXRlciBjb3VudCAqLworCSAgICArK2NvdW50OworCX0KKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qCisgICogY29udmVydHMgdGhlIEludGVybmV0IGhvc3QgYWRkcmVzcyBmcm9tIHRoZSBzdGFuZGFyZCBudW1iZXJzLWFuZC1kb3RzIG5vdGF0aW9uCisgICogaW50byBiaW5hcnkgZGF0YS4KKyAgKiByZXR1cm5zIG5vbnplcm8gaWYgdGhlIGFkZHJlc3MgaXMgdmFsaWQsIHplcm8gaWYgbm90LgorICAqLworaW50IHJ0aW5ldF9hdG9uKGNvbnN0IGNoYXIgKmNwLCB1bnNpZ25lZCBpbnQgKmFkZHIpCit7CisJdW5zaWduZWQgaW50IAl2YWw7CisJaW50ICAgICAgICAgCWJhc2UsIG47CisJY2hhciAgICAgICAgCWM7CisJdW5zaWduZWQgaW50ICAgIHBhcnRzWzRdOworCXVuc2lnbmVkIGludCAgICAqcHAgPSBwYXJ0czsKKworCWZvciAoOzspCisgICAgeworICAgICAgICAgLyoKKyAgICAgICAgICAqIENvbGxlY3QgbnVtYmVyIHVwIHRvIGBgLicnLgorICAgICAgICAgICogVmFsdWVzIGFyZSBzcGVjaWZpZWQgYXMgZm9yIEM6CisgICAgICAgICAgKgkweD1oZXgsIDA9b2N0YWwsIG90aGVyPWRlY2ltYWwuCisgICAgICAgICAgKi8KKyAgICAgICAgIHZhbCA9IDA7CisgICAgICAgICBiYXNlID0gMTA7CisgICAgICAgICBpZiAoKmNwID09ICcwJykKKyAgICAgICAgIHsKKyAgICAgICAgICAgICBpZiAoKisrY3AgPT0gJ3gnIHx8ICpjcCA9PSAnWCcpCisgICAgICAgICAgICAgICAgIGJhc2UgPSAxNiwgY3ArKzsKKyAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgIGJhc2UgPSA4OworICAgICAgICAgfQorICAgICAgICAgd2hpbGUgKChjID0gKmNwKSAhPSAnXDAnKQorICAgICAgICAgeworICAgICAgICAgICAgIGlmIChpc2RpZ2l0KCh1bnNpZ25lZCBjaGFyKSBjKSkKKyAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgIHZhbCA9ICh2YWwgKiBiYXNlKSArIChjIC0gJzAnKTsKKyAgICAgICAgICAgICAgICAgY3ArKzsKKyAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgfQorICAgICAgICAgICAgIGlmIChiYXNlID09IDE2ICYmIGlzeGRpZ2l0KCh1bnNpZ25lZCBjaGFyKSBjKSkKKyAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgIHZhbCA9ICh2YWwgPDwgNCkgKworICAgICAgICAgICAgICAgICAgICAgKGMgKyAxMCAtIChpc2xvd2VyKCh1bnNpZ25lZCBjaGFyKSBjKSA/ICdhJyA6ICdBJykpOworICAgICAgICAgICAgICAgICBjcCsrOworICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICB9CisgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICB9CisgICAgICAgICBpZiAoKmNwID09ICcuJykKKyAgICAgICAgIHsKKyAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAqIEludGVybmV0IGZvcm1hdDogYS5iLmMuZCBhLmIuYyAgICh3aXRoIGMgdHJlYXRlZCBhcyAxNi1iaXRzKQorICAgICAgICAgICAgICAqIGEuYiAgICAgKHdpdGggYiB0cmVhdGVkIGFzIDI0IGJpdHMpCisgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgaWYgKHBwID49IHBhcnRzICsgMyB8fCB2YWwgPiAweGZmKQorICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAqcHArKyA9IHZhbCwgY3ArKzsKKyAgICAgICAgIH0KKyAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICBicmVhazsKKyAgICAgfQorCisgICAgIC8qCisgICAgICAqIENoZWNrIGZvciB0cmFpbGluZyBqdW5rLgorICAgICAgKi8KKyAgICAgd2hpbGUgKCpjcCkKKyAgICAgICAgIGlmICghaXNzcGFjZSgodW5zaWduZWQgY2hhcikgKmNwKyspKQorICAgICAgICAgICAgIHJldHVybiAwOworCisgICAgIC8qCisgICAgICAqIENvbmNvY3QgdGhlIGFkZHJlc3MgYWNjb3JkaW5nIHRvIHRoZSBudW1iZXIgb2YgcGFydHMgc3BlY2lmaWVkLgorICAgICAgKi8KKyAgICAgbiA9IHBwIC0gcGFydHMgKyAxOworICAgICBzd2l0Y2ggKG4pCisgICAgIHsKKworICAgICAgICAgY2FzZSAxOiAgICAgICAgIC8qIGEgLS0gMzIgYml0cyAqLworICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICBjYXNlIDI6ICAgICAgICAgLyogYS5iIC0tIDguMjQgYml0cyAqLworICAgICAgICAgICAgIGlmICh2YWwgPiAweGZmZmZmZikKKyAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgdmFsIHw9IHBhcnRzWzBdIDw8IDI0OworICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICBjYXNlIDM6ICAgICAgICAgLyogYS5iLmMgLS0gOC44LjE2IGJpdHMgKi8KKyAgICAgICAgICAgICBpZiAodmFsID4gMHhmZmZmKQorICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICB2YWwgfD0gKHBhcnRzWzBdIDw8IDI0KSB8IChwYXJ0c1sxXSA8PCAxNik7CisgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgIGNhc2UgNDogICAgICAgICAvKiBhLmIuYy5kIC0tIDguOC44LjggYml0cyAqLworICAgICAgICAgICAgIGlmICh2YWwgPiAweGZmKQorICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICB2YWwgfD0gKHBhcnRzWzBdIDw8IDI0KSB8IChwYXJ0c1sxXSA8PCAxNikgfCAocGFydHNbMl0gPDwgOCk7CisgICAgICAgICAgICAgYnJlYWs7CisgICAgIH0KKworICAgICAqYWRkciA9IGh0b25sKHZhbCk7CisgICAgIHJldHVybiAxOworCit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICBSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgICAgICBGaW5kIGtleSBzZWN0aW9uIGZvciBHZXQga2V5IHBhcmFtZXRlci4KKworICAgIEFyZ3VtZW50czoKKyAgICAgICAgYnVmZmVyICAgICAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byBzdGFydCBmaW5kIHRoZSBrZXkgc2VjdGlvbgorICAgICAgICBzZWN0aW9uICAgICAgICAgICAgICAgICAgICAgdGhlIGtleSBvZiB0aGUgc2VjaW9uIHRvIGJlIGZpbmQKKworICAgIFJldHVybiBWYWx1ZToKKyAgICAgICAgTlVMTCAgICAgICAgICAgICAgICAgICAgICAgIEZhaWwKKyAgICAgICAgT3RoZXJzICAgICAgICAgICAgICAgICAgICAgIFN1Y2Nlc3MKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitQVUNIQVIgIFJUTVBGaW5kU2VjdGlvbigKKyAgICBJTiAgUENIQVIgICBidWZmZXIpCit7CisgICAgQ0hBUiB0ZW1wX2J1ZlszMl07CisgICAgUFVDSEFSICBwdHI7CisKKyAgICBzdHJjcHkodGVtcF9idWYsICJEZWZhdWx0Iik7CisKKyAgICBpZigocHRyID0gcnRzdHJzdHIoYnVmZmVyLCB0ZW1wX2J1ZikpICE9IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gKHB0citzdHJsZW4oIlxuIikpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIFJvdXRpbmUgRGVzY3JpcHRpb246CisgICAgICAgIEdldCBrZXkgcGFyYW1ldGVyLgorCisgICAgQXJndW1lbnRzOgorICAgICAgICBrZXkgICAgICAgICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byBrZXkgc3RyaW5nCisgICAgICAgIGRlc3QgICAgICAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIGRlc3RpbmF0aW9uCisgICAgICAgIGRlc3RzaXplICAgICAgICAgICAgICAgICAgICBUaGUgZGF0YXNpemUgb2YgdGhlIGRlc3RpbmF0aW9uCisgICAgICAgIGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gc3RhcnQgZmluZCB0aGUga2V5CisKKyAgICBSZXR1cm4gVmFsdWU6CisgICAgICAgIFRSVUUgICAgICAgICAgICAgICAgICAgICAgICBTdWNjZXNzCisgICAgICAgIEZBTFNFICAgICAgICAgICAgICAgICAgICAgICBGYWlsCisKKyAgICBOb3RlOgorICAgICAgICBUaGlzIHJvdXRpbmUgZ2V0IHRoZSB2YWx1ZSB3aXRoIHRoZSBtYXRjaGVkIGtleSAoY2FzZSBjYXNlLXNlbnNpdGl2ZSkKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQgUlRNUEdldEtleVBhcmFtZXRlcigKKyAgICBJTiAgUENIQVIgICBrZXksCisgICAgT1VUIFBDSEFSICAgZGVzdCwKKyAgICBJTiAgSU5UICAgICBkZXN0c2l6ZSwKKyAgICBJTiAgUENIQVIgICBidWZmZXIpCit7CisgICAgVUNIQVIgKnRlbXBfYnVmMSA9IE5VTEw7CisgICAgVUNIQVIgKnRlbXBfYnVmMiA9IE5VTEw7CisgICAgQ0hBUiAqc3RhcnRfcHRyOworICAgIENIQVIgKmVuZF9wdHI7CisgICAgQ0hBUiAqcHRyOworICAgIENIQVIgKm9mZnNldCA9IDA7CisgICAgSU5UICBsZW47CisKKwkvL3RlbXBfYnVmMSA9IGttYWxsb2MoTUFYX1BBUkFNX0JVRkZFUl9TSVpFLCBNRU1fQUxMT0NfRkxBRyk7CisJb3NfYWxsb2NfbWVtKE5VTEwsICZ0ZW1wX2J1ZjEsIE1BWF9QQVJBTV9CVUZGRVJfU0laRSk7CisKKwlpZih0ZW1wX2J1ZjEgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIChGQUxTRSk7CisKKwkvL3RlbXBfYnVmMiA9IGttYWxsb2MoTUFYX1BBUkFNX0JVRkZFUl9TSVpFLCBNRU1fQUxMT0NfRkxBRyk7CisJb3NfYWxsb2NfbWVtKE5VTEwsICZ0ZW1wX2J1ZjIsIE1BWF9QQVJBTV9CVUZGRVJfU0laRSk7CisJaWYodGVtcF9idWYyID09IE5VTEwpCisJeworCQlvc19mcmVlX21lbShOVUxMLCB0ZW1wX2J1ZjEpOworICAgICAgICByZXR1cm4gKEZBTFNFKTsKKwl9CisKKyAgICAvL2ZpbmQgc2VjdGlvbgorICAgIGlmKChvZmZzZXQgPSBSVE1QRmluZFNlY3Rpb24oYnVmZmVyKSkgPT0gTlVMTCkKKyAgICB7CisgICAgCW9zX2ZyZWVfbWVtKE5VTEwsIHRlbXBfYnVmMSk7CisgICAgCW9zX2ZyZWVfbWVtKE5VTEwsIHRlbXBfYnVmMik7CisgICAgICAgIHJldHVybiAoRkFMU0UpOworICAgIH0KKworICAgIHN0cmNweSh0ZW1wX2J1ZjEsICJcbiIpOworICAgIHN0cmNhdCh0ZW1wX2J1ZjEsIGtleSk7CisgICAgc3RyY2F0KHRlbXBfYnVmMSwgIj0iKTsKKworICAgIC8vc2VhcmNoIGtleQorICAgIGlmKChzdGFydF9wdHI9cnRzdHJzdHIob2Zmc2V0LCB0ZW1wX2J1ZjEpKT09TlVMTCkKKyAgICB7CisJCW9zX2ZyZWVfbWVtKE5VTEwsIHRlbXBfYnVmMSk7CisgICAgCW9zX2ZyZWVfbWVtKE5VTEwsIHRlbXBfYnVmMik7CisgICAgICAgIHJldHVybiAoRkFMU0UpOworICAgIH0KKworICAgIHN0YXJ0X3B0cis9c3RybGVuKCJcbiIpOworICAgIGlmKChlbmRfcHRyPXJ0c3Ryc3RyKHN0YXJ0X3B0ciwgIlxuIikpPT1OVUxMKQorICAgICAgIGVuZF9wdHI9c3RhcnRfcHRyK3N0cmxlbihzdGFydF9wdHIpOworCisgICAgaWYgKGVuZF9wdHI8c3RhcnRfcHRyKQorICAgIHsKKwkJb3NfZnJlZV9tZW0oTlVMTCwgdGVtcF9idWYxKTsKKyAgICAJb3NfZnJlZV9tZW0oTlVMTCwgdGVtcF9idWYyKTsKKyAgICAgICAgcmV0dXJuIChGQUxTRSk7CisgICAgfQorCisgICAgTmRpc01vdmVNZW1vcnkodGVtcF9idWYyLCBzdGFydF9wdHIsIGVuZF9wdHItc3RhcnRfcHRyKTsKKyAgICB0ZW1wX2J1ZjJbZW5kX3B0ci1zdGFydF9wdHJdPSdcMCc7CisgICAgbGVuID0gc3RybGVuKHRlbXBfYnVmMik7CisgICAgc3RyY3B5KHRlbXBfYnVmMSwgdGVtcF9idWYyKTsKKyAgICBpZigoc3RhcnRfcHRyPXJ0c3Ryc3RyKHRlbXBfYnVmMSwgIj0iKSkgPT0gTlVMTCkKKyAgICB7CisJCW9zX2ZyZWVfbWVtKE5VTEwsIHRlbXBfYnVmMSk7CisgICAgCW9zX2ZyZWVfbWVtKE5VTEwsIHRlbXBfYnVmMik7CisgICAgICAgIHJldHVybiAoRkFMU0UpOworICAgIH0KKworICAgIHN0cmNweSh0ZW1wX2J1ZjIsIHN0YXJ0X3B0cisxKTsKKyAgICBwdHIgPSB0ZW1wX2J1ZjI7CisgICAgLy90cmltIHNwYWNlIG9yIHRhYgorICAgIHdoaWxlKCpwdHIgIT0gMHgwMCkKKyAgICB7CisgICAgICAgIGlmKCAoKnB0ciA9PSAnICcpIHx8ICgqcHRyID09ICdcdCcpICkKKyAgICAgICAgICAgIHB0cisrOworICAgICAgICBlbHNlCisgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGxlbiA9IHN0cmxlbihwdHIpOworICAgIG1lbXNldChkZXN0LCAweDAwLCBkZXN0c2l6ZSk7CisgICAgc3RybmNweShkZXN0LCBwdHIsIGxlbiA+PSBkZXN0c2l6ZSA/ICBkZXN0c2l6ZTogbGVuKTsKKworCW9zX2ZyZWVfbWVtKE5VTEwsIHRlbXBfYnVmMSk7CisgICAgb3NfZnJlZV9tZW0oTlVMTCwgdGVtcF9idWYyKTsKKyAgICByZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIFJvdXRpbmUgRGVzY3JpcHRpb246CisgICAgICAgIEdldCBrZXkgcGFyYW1ldGVyLgorCisgICAgQXJndW1lbnRzOgorICAgICAgICBrZXkgICAgICAgICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byBrZXkgc3RyaW5nCisgICAgICAgIGRlc3QgICAgICAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIGRlc3RpbmF0aW9uCisgICAgICAgIGRlc3RzaXplICAgICAgICAgICAgICAgICAgICBUaGUgZGF0YXNpemUgb2YgdGhlIGRlc3RpbmF0aW9uCisgICAgICAgIGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gc3RhcnQgZmluZCB0aGUga2V5CisKKyAgICBSZXR1cm4gVmFsdWU6CisgICAgICAgIFRSVUUgICAgICAgICAgICAgICAgICAgICAgICBTdWNjZXNzCisgICAgICAgIEZBTFNFICAgICAgICAgICAgICAgICAgICAgICBGYWlsCisKKyAgICBOb3RlOgorICAgICAgICBUaGlzIHJvdXRpbmUgZ2V0IHRoZSB2YWx1ZSB3aXRoIHRoZSBtYXRjaGVkIGtleSAoY2FzZSBjYXNlLXNlbnNpdGl2ZSkuCisgICAgICAgIEl0IGlzIGNhbGxlZCBmb3IgcGFyc2luZyBTU0lEIGFuZCBhbnkga2V5IHN0cmluZy4KKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQgUlRNUEdldENyaXRpY2FsUGFyYW1ldGVyKAorICAgIElOICBQQ0hBUiAgIGtleSwKKyAgICBPVVQgUENIQVIgICBkZXN0LAorICAgIElOICBJTlQgICAgIGRlc3RzaXplLAorICAgIElOICBQQ0hBUiAgIGJ1ZmZlcikKK3sKKyAgICBVQ0hBUiAqdGVtcF9idWYxID0gTlVMTDsKKyAgICBVQ0hBUiAqdGVtcF9idWYyID0gTlVMTDsKKyAgICBDSEFSICpzdGFydF9wdHI7CisgICAgQ0hBUiAqZW5kX3B0cjsKKyAgICBDSEFSICpwdHI7CisgICAgQ0hBUiAqb2Zmc2V0ID0gMDsKKyAgICBJTlQgIGxlbjsKKworCS8vdGVtcF9idWYxID0ga21hbGxvYyhNQVhfUEFSQU1fQlVGRkVSX1NJWkUsIE1FTV9BTExPQ19GTEFHKTsKKwlvc19hbGxvY19tZW0oTlVMTCwgJnRlbXBfYnVmMSwgTUFYX1BBUkFNX0JVRkZFUl9TSVpFKTsKKworCWlmKHRlbXBfYnVmMSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gKEZBTFNFKTsKKworCS8vdGVtcF9idWYyID0ga21hbGxvYyhNQVhfUEFSQU1fQlVGRkVSX1NJWkUsIE1FTV9BTExPQ19GTEFHKTsKKwlvc19hbGxvY19tZW0oTlVMTCwgJnRlbXBfYnVmMiwgTUFYX1BBUkFNX0JVRkZFUl9TSVpFKTsKKwlpZih0ZW1wX2J1ZjIgPT0gTlVMTCkKKwl7CisJCW9zX2ZyZWVfbWVtKE5VTEwsIHRlbXBfYnVmMSk7CisgICAgICAgIHJldHVybiAoRkFMU0UpOworCX0KKworICAgIC8vZmluZCBzZWN0aW9uCisgICAgaWYoKG9mZnNldCA9IFJUTVBGaW5kU2VjdGlvbihidWZmZXIpKSA9PSBOVUxMKQorICAgIHsKKyAgICAJb3NfZnJlZV9tZW0oTlVMTCwgdGVtcF9idWYxKTsKKyAgICAJb3NfZnJlZV9tZW0oTlVMTCwgdGVtcF9idWYyKTsKKyAgICAgICAgcmV0dXJuIChGQUxTRSk7CisgICAgfQorCisgICAgc3RyY3B5KHRlbXBfYnVmMSwgIlxuIik7CisgICAgc3RyY2F0KHRlbXBfYnVmMSwga2V5KTsKKyAgICBzdHJjYXQodGVtcF9idWYxLCAiPSIpOworCisgICAgLy9zZWFyY2gga2V5CisgICAgaWYoKHN0YXJ0X3B0cj1ydHN0cnN0cihvZmZzZXQsIHRlbXBfYnVmMSkpPT1OVUxMKQorICAgIHsKKwkJb3NfZnJlZV9tZW0oTlVMTCwgdGVtcF9idWYxKTsKKyAgICAJb3NfZnJlZV9tZW0oTlVMTCwgdGVtcF9idWYyKTsKKyAgICAgICAgcmV0dXJuIChGQUxTRSk7CisgICAgfQorCisgICAgc3RhcnRfcHRyKz1zdHJsZW4oIlxuIik7CisgICAgaWYoKGVuZF9wdHI9cnRzdHJzdHIoc3RhcnRfcHRyLCAiXG4iKSk9PU5VTEwpCisgICAgICAgZW5kX3B0cj1zdGFydF9wdHIrc3RybGVuKHN0YXJ0X3B0cik7CisKKyAgICBpZiAoZW5kX3B0cjxzdGFydF9wdHIpCisgICAgeworCQlvc19mcmVlX21lbShOVUxMLCB0ZW1wX2J1ZjEpOworICAgIAlvc19mcmVlX21lbShOVUxMLCB0ZW1wX2J1ZjIpOworICAgICAgICByZXR1cm4gKEZBTFNFKTsKKyAgICB9CisKKyAgICBOZGlzTW92ZU1lbW9yeSh0ZW1wX2J1ZjIsIHN0YXJ0X3B0ciwgZW5kX3B0ci1zdGFydF9wdHIpOworICAgIHRlbXBfYnVmMltlbmRfcHRyLXN0YXJ0X3B0cl09J1wwJzsKKyAgICBsZW4gPSBzdHJsZW4odGVtcF9idWYyKTsKKyAgICBzdHJjcHkodGVtcF9idWYxLCB0ZW1wX2J1ZjIpOworICAgIGlmKChzdGFydF9wdHI9cnRzdHJzdHIodGVtcF9idWYxLCAiPSIpKSA9PSBOVUxMKQorICAgIHsKKwkJb3NfZnJlZV9tZW0oTlVMTCwgdGVtcF9idWYxKTsKKyAgICAJb3NfZnJlZV9tZW0oTlVMTCwgdGVtcF9idWYyKTsKKyAgICAgICAgcmV0dXJuIChGQUxTRSk7CisgICAgfQorCisgICAgc3RyY3B5KHRlbXBfYnVmMiwgc3RhcnRfcHRyKzEpOworICAgIHB0ciA9IHRlbXBfYnVmMjsKKworICAgIC8vdHJpbSB0YWIKKyAgICAvKiBXZSBjYW5ub3QgdHJpbSBzcGFjZSgnICcpIGZvciBTU0lEIGFuZCBrZXkgc3RyaW5nLiAqLworICAgIHdoaWxlKCpwdHIgIT0gMHgwMCkKKyAgICB7CisgICAgICAgIC8vaWYoICgqcHRyID09ICcgJykgfHwgKCpwdHIgPT0gJ1x0JykgKQorICAgICAgICBpZiggKCpwdHIgPT0gJ1x0JykgKQorICAgICAgICAgICAgcHRyKys7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgbGVuID0gc3RybGVuKHB0cik7CisgICAgbWVtc2V0KGRlc3QsIDB4MDAsIGRlc3RzaXplKTsKKyAgICBzdHJuY3B5KGRlc3QsIHB0ciwgbGVuID49IGRlc3RzaXplID8gIGRlc3RzaXplOiBsZW4pOworCisJb3NfZnJlZV9tZW0oTlVMTCwgdGVtcF9idWYxKTsKKyAgICBvc19mcmVlX21lbShOVUxMLCB0ZW1wX2J1ZjIpOworICAgIHJldHVybiBUUlVFOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICAgICAgR2V0IG11bHRpcGxlIGtleSBwYXJhbWV0ZXIuCisKKyAgICBBcmd1bWVudHM6CisgICAgICAgIGtleSAgICAgICAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIGtleSBzdHJpbmcKKyAgICAgICAgZGVzdCAgICAgICAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gZGVzdGluYXRpb24KKyAgICAgICAgZGVzdHNpemUgICAgICAgICAgICAgICAgICAgIFRoZSBkYXRhc2l6ZSBvZiB0aGUgZGVzdGluYXRpb24KKyAgICAgICAgYnVmZmVyICAgICAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byBzdGFydCBmaW5kIHRoZSBrZXkKKworICAgIFJldHVybiBWYWx1ZToKKyAgICAgICAgVFJVRSAgICAgICAgICAgICAgICAgICAgICAgIFN1Y2Nlc3MKKyAgICAgICAgRkFMU0UgICAgICAgICAgICAgICAgICAgICAgIEZhaWwKKworICAgIE5vdGU6CisgICAgICAgIFRoaXMgcm91dGluZSBnZXQgdGhlIHZhbHVlIHdpdGggdGhlIG1hdGNoZWQga2V5IChjYXNlIGNhc2Utc2Vuc2l0aXZlKQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVCBSVE1QR2V0S2V5UGFyYW1ldGVyV2l0aE9mZnNldCgKKyAgICBJTiAgUENIQVIgICBrZXksCisgICAgT1VUIFBDSEFSICAgZGVzdCwKKyAgICBPVVQJVVNIT1JUCSplbmRfb2Zmc2V0LAorICAgIElOICBJTlQgICAgIGRlc3RzaXplLAorICAgIElOICBQQ0hBUiAgIGJ1ZmZlciwKKyAgICBJTglCT09MRUFOCWJUcmltU3BhY2UpCit7CisgICAgVUNIQVIgKnRlbXBfYnVmMSA9IE5VTEw7CisgICAgVUNIQVIgKnRlbXBfYnVmMiA9IE5VTEw7CisgICAgQ0hBUiAqc3RhcnRfcHRyOworICAgIENIQVIgKmVuZF9wdHI7CisgICAgQ0hBUiAqcHRyOworICAgIENIQVIgKm9mZnNldCA9IDA7CisgICAgSU5UICBsZW47CisKKwlpZiAoKmVuZF9vZmZzZXQgPj0gTUFYX0lOSV9CVUZGRVJfU0laRSkKKwkJcmV0dXJuIChGQUxTRSk7CisKKwlvc19hbGxvY19tZW0oTlVMTCwgJnRlbXBfYnVmMSwgTUFYX1BBUkFNX0JVRkZFUl9TSVpFKTsKKworCWlmKHRlbXBfYnVmMSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gKEZBTFNFKTsKKworCW9zX2FsbG9jX21lbShOVUxMLCAmdGVtcF9idWYyLCBNQVhfUEFSQU1fQlVGRkVSX1NJWkUpOworCWlmKHRlbXBfYnVmMiA9PSBOVUxMKQorCXsKKwkJb3NfZnJlZV9tZW0oTlVMTCwgdGVtcF9idWYxKTsKKyAgICAgICAgcmV0dXJuIChGQUxTRSk7CisJfQorCisgICAgLy9maW5kIHNlY3Rpb24KKwlpZigqZW5kX29mZnNldCA9PSAwKQorICAgIHsKKwkJaWYgKChvZmZzZXQgPSBSVE1QRmluZFNlY3Rpb24oYnVmZmVyKSkgPT0gTlVMTCkKKwkJeworCQkJb3NfZnJlZV9tZW0oTlVMTCwgdGVtcF9idWYxKTsKKwkgICAgCW9zX2ZyZWVfbWVtKE5VTEwsIHRlbXBfYnVmMik7CisgICAgCSAgICByZXR1cm4gKEZBTFNFKTsKKwkJfQorICAgIH0KKwllbHNlCisJCW9mZnNldCA9IGJ1ZmZlciArICgqZW5kX29mZnNldCk7CisKKyAgICBzdHJjcHkodGVtcF9idWYxLCAiXG4iKTsKKyAgICBzdHJjYXQodGVtcF9idWYxLCBrZXkpOworICAgIHN0cmNhdCh0ZW1wX2J1ZjEsICI9Iik7CisKKyAgICAvL3NlYXJjaCBrZXkKKyAgICBpZigoc3RhcnRfcHRyPXJ0c3Ryc3RyKG9mZnNldCwgdGVtcF9idWYxKSk9PU5VTEwpCisgICAgeworCQlvc19mcmVlX21lbShOVUxMLCB0ZW1wX2J1ZjEpOworICAgIAlvc19mcmVlX21lbShOVUxMLCB0ZW1wX2J1ZjIpOworICAgICAgICByZXR1cm4gKEZBTFNFKTsKKyAgICB9CisKKyAgICBzdGFydF9wdHIrPXN0cmxlbigiXG4iKTsKKyAgICBpZigoZW5kX3B0cj1ydHN0cnN0cihzdGFydF9wdHIsICJcbiIpKT09TlVMTCkKKyAgICAgICBlbmRfcHRyPXN0YXJ0X3B0citzdHJsZW4oc3RhcnRfcHRyKTsKKworICAgIGlmIChlbmRfcHRyPHN0YXJ0X3B0cikKKyAgICB7CisJCW9zX2ZyZWVfbWVtKE5VTEwsIHRlbXBfYnVmMSk7CisgICAgCW9zX2ZyZWVfbWVtKE5VTEwsIHRlbXBfYnVmMik7CisgICAgICAgIHJldHVybiAoRkFMU0UpOworICAgIH0KKworCSplbmRfb2Zmc2V0ID0gZW5kX3B0ciAtIGJ1ZmZlcjsKKworICAgIE5kaXNNb3ZlTWVtb3J5KHRlbXBfYnVmMiwgc3RhcnRfcHRyLCBlbmRfcHRyLXN0YXJ0X3B0cik7CisgICAgdGVtcF9idWYyW2VuZF9wdHItc3RhcnRfcHRyXT0nXDAnOworICAgIGxlbiA9IHN0cmxlbih0ZW1wX2J1ZjIpOworICAgIHN0cmNweSh0ZW1wX2J1ZjEsIHRlbXBfYnVmMik7CisgICAgaWYoKHN0YXJ0X3B0cj1ydHN0cnN0cih0ZW1wX2J1ZjEsICI9IikpID09IE5VTEwpCisgICAgeworCQlvc19mcmVlX21lbShOVUxMLCB0ZW1wX2J1ZjEpOworICAgIAlvc19mcmVlX21lbShOVUxMLCB0ZW1wX2J1ZjIpOworICAgICAgICByZXR1cm4gKEZBTFNFKTsKKyAgICB9CisKKyAgICBzdHJjcHkodGVtcF9idWYyLCBzdGFydF9wdHIrMSk7CisgICAgcHRyID0gdGVtcF9idWYyOworICAgIC8vdHJpbSBzcGFjZSBvciB0YWIKKyAgICB3aGlsZSgqcHRyICE9IDB4MDApCisgICAgeworICAgICAgICBpZigoYlRyaW1TcGFjZSAmJiAoKnB0ciA9PSAnICcpKSB8fCAoKnB0ciA9PSAnXHQnKSApCisgICAgICAgICAgICBwdHIrKzsKKyAgICAgICAgZWxzZQorICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBsZW4gPSBzdHJsZW4ocHRyKTsKKyAgICBtZW1zZXQoZGVzdCwgMHgwMCwgZGVzdHNpemUpOworICAgIHN0cm5jcHkoZGVzdCwgcHRyLCBsZW4gPj0gZGVzdHNpemUgPyAgZGVzdHNpemU6IGxlbik7CisKKwlvc19mcmVlX21lbShOVUxMLCB0ZW1wX2J1ZjEpOworICAgIG9zX2ZyZWVfbWVtKE5VTEwsIHRlbXBfYnVmMik7CisgICAgcmV0dXJuIFRSVUU7Cit9CisKKworc3RhdGljIGludCBydG1wX3BhcnNlX2tleV9idWZmZXJfZnJvbV9maWxlKElOICBQUlRNUF9BREFQVEVSIHBBZCxJTiAgY2hhciAqYnVmZmVyLElOICBVTE9ORyBLZXlUeXBlLElOICBJTlQgQlNTSWR4LElOICBJTlQgS2V5SWR4KQoreworCVBVQ0hBUgkJa2V5YnVmZjsKKwlJTlQJCQlpID0gQlNTSWR4LCBpZHggPSBLZXlJZHg7CisJVUxPTkcJCUtleUxlbjsKKwlVQ0hBUgkJQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OworCisJa2V5YnVmZiA9IGJ1ZmZlcjsKKwlLZXlMZW4gPSBzdHJsZW4oa2V5YnVmZik7CisKKwlpZiAoS2V5VHlwZSA9PSAxKQorCXsvL0FzY2lpCisJCWlmKCAoS2V5TGVuID09IDUpIHx8IChLZXlMZW4gPT0gMTMpKQorCQl7CisJCQlwQWQtPlNoYXJlZEtleVtpXVtpZHhdLktleUxlbiA9IEtleUxlbjsKKwkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W2ldW2lkeF0uS2V5LCBrZXlidWZmLCBLZXlMZW4pOworCQkJaWYgKEtleUxlbiA9PSA1KQorCQkJCUNpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKKwkJCWVsc2UKKwkJCQlDaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OworCQkJcEFkLT5TaGFyZWRLZXlbaV1baWR4XS5DaXBoZXJBbGcgPSBDaXBoZXJBbGc7CisKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkkvRihyYSVkKSBLZXklZFN0cj0lcyBhbmQgdHlwZT0lc1xuIiwgaSwgaWR4KzEsIGtleWJ1ZmYsIChLZXlUeXBlID09IDApID8gIkhleCI6IkFzY2lpIikpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJZWxzZQorCQl7Ly9JbnZhbGlkIGtleSBsZW5ndGgKKwkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIktleSVkU3RyIGlzIEludmFsaWQga2V5IGxlbmd0aCEgS2V5TGVuID0gJWxkIVxuIiwgaWR4KzEsIEtleUxlbikpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJZWxzZQorCXsvL0hleCB0eXBlCisJCWlmKCAoS2V5TGVuID09IDEwKSB8fCAoS2V5TGVuID09IDI2KSkKKwkJeworCQkJcEFkLT5TaGFyZWRLZXlbaV1baWR4XS5LZXlMZW4gPSBLZXlMZW4gLyAyOworCQkJQXRvSChrZXlidWZmLCBwQWQtPlNoYXJlZEtleVtpXVtpZHhdLktleSwgS2V5TGVuIC8gMik7CisJCQlpZiAoS2V5TGVuID09IDEwKQorCQkJCUNpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKKwkJCWVsc2UKKwkJCQlDaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OworCQkJcEFkLT5TaGFyZWRLZXlbaV1baWR4XS5DaXBoZXJBbGcgPSBDaXBoZXJBbGc7CisKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkkvRihyYSVkKSBLZXklZFN0cj0lcyBhbmQgdHlwZT0lc1xuIiwgaSwgaWR4KzEsIGtleWJ1ZmYsIChLZXlUeXBlID09IDApID8gIkhleCI6IkFzY2lpIikpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJZWxzZQorCQl7Ly9JbnZhbGlkIGtleSBsZW5ndGgKKwkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkkvRihyYSVkKSBLZXklZFN0ciBpcyBJbnZhbGlkIGtleSBsZW5ndGghIEtleUxlbiA9ICVsZCFcbiIsIGksIGlkeCsxLCBLZXlMZW4pKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorfQorc3RhdGljIHZvaWQgcnRtcF9yZWFkX2tleV9wYXJtc19mcm9tX2ZpbGUoSU4gIFBSVE1QX0FEQVBURVIgcEFkLCBjaGFyICp0bXBidWYsIGNoYXIgKmJ1ZmZlcikKK3sKKwljaGFyCQl0b2tfc3RyWzE2XTsKKwlQVUNIQVIJCW1hY3B0cjsKKwlJTlQJCQlpID0gMCwgaWR4OworCVVMT05HCQlLZXlUeXBlW01BWF9NQlNTSURfTlVNXTsKKwlVTE9ORwkJS2V5SWR4OworCisJTmRpc1plcm9NZW1vcnkoS2V5VHlwZSwgTUFYX01CU1NJRF9OVU0pOworCisJLy9EZWZhdWx0S2V5SUQKKwlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJEZWZhdWx0S2V5SUQiLCB0bXBidWYsIDI1LCBidWZmZXIpKQorCXsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQl7CisJCQlLZXlJZHggPSBzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApOworCQkJaWYoKEtleUlkeCA+PSAxICkgJiYgKEtleUlkeCA8PSA0KSkKKwkJCQlwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQgPSAoVUNIQVIpIChLZXlJZHggLSAxKTsKKwkJCWVsc2UKKwkJCQlwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQgPSAwOworCisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJEZWZhdWx0S2V5SUQoMH4zKT0lZFxuIiwgcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkKSk7CisJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwl9CisKKworCWZvciAoaWR4ID0gMDsgaWR4IDwgNDsgaWR4KyspCisJeworCQlzcHJpbnRmKHRva19zdHIsICJLZXklZFR5cGUiLCBpZHggKyAxKTsKKwkJLy9LZXkxVHlwZQorCQlpZiAoUlRNUEdldEtleVBhcmFtZXRlcih0b2tfc3RyLCB0bXBidWYsIDEyOCwgYnVmZmVyKSkKKwkJeworCQkgICAgZm9yIChpID0gMCwgbWFjcHRyID0gcnN0cnRvayh0bXBidWYsIjsiKTsgbWFjcHRyOyBtYWNwdHIgPSByc3RydG9rKE5VTEwsIjsiKSwgaSsrKQorCQkgICAgeworCQkJICAgIEtleVR5cGVbaV0gPSBzaW1wbGVfc3RydG9sKG1hY3B0ciwgMCwgMTApOworCQkgICAgfQorCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQkJeworCQkJCXNwcmludGYodG9rX3N0ciwgIktleSVkU3RyIiwgaWR4ICsgMSk7CisJCQkJaWYgKFJUTVBHZXRDcml0aWNhbFBhcmFtZXRlcih0b2tfc3RyLCB0bXBidWYsIDEyOCwgYnVmZmVyKSkKKwkJCQl7CisJCQkJCXJ0bXBfcGFyc2Vfa2V5X2J1ZmZlcl9mcm9tX2ZpbGUocEFkLCB0bXBidWYsIEtleVR5cGVbQlNTMF0sIEJTUzAsIGlkeCk7CisJCQkJfQorCQkJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCQl9CisJfQorfQorCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKK3N0YXRpYyB2b2lkIHJ0bXBfcmVhZF9zdGFfd21tX3Bhcm1zX2Zyb21fZmlsZShJTiAgUFJUTVBfQURBUFRFUiBwQWQsIGNoYXIgKnRtcGJ1ZiwgY2hhciAqYnVmZmVyKQoreworCVBVQ0hBUgkJCQkJbWFjcHRyOworCUlOVAkJCQkJCWk9MDsKKwlCT09MRUFOCQkJCQliV21tRW5hYmxlID0gRkFMU0U7CisKKwkvL1dtbUNhcGFibGUKKwlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJXbW1DYXBhYmxlIiwgdG1wYnVmLCAzMiwgYnVmZmVyKSkKKwl7CisJCWlmKHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCkgIT0gMCkgLy9FbmFibGUKKwkJeworCQkJcEFkLT5Db21tb25DZmcuYldtbUNhcGFibGUgPSBUUlVFOworCQkJYldtbUVuYWJsZSA9IFRSVUU7CisJCX0KKwkJZWxzZSAvL0Rpc2FibGUKKwkJeworCQkJcEFkLT5Db21tb25DZmcuYldtbUNhcGFibGUgPSBGQUxTRTsKKwkJfQorCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIldtbUNhcGFibGU9JWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLmJXbW1DYXBhYmxlKSk7CisJfQorCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJLy9ETFNDYXBhYmxlCisJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiRExTQ2FwYWJsZSIsIHRtcGJ1ZiwgMzIsIGJ1ZmZlcikpCisJeworCQlpZihzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApICE9IDApICAvL0VuYWJsZQorCQl7CisJCQlwQWQtPkNvbW1vbkNmZy5iRExTQ2FwYWJsZSA9IFRSVUU7CisJCX0KKwkJZWxzZSAvL0Rpc2FibGUKKwkJeworCQkJcEFkLT5Db21tb25DZmcuYkRMU0NhcGFibGUgPSBGQUxTRTsKKwkJfQorCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoImJETFNDYXBhYmxlPSVkXG4iLCBwQWQtPkNvbW1vbkNmZy5iRExTQ2FwYWJsZSkpOworCX0KKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKworCS8vQWNrUG9saWN5IGZvciBBQ19CSywgQUNfQkUsIEFDX1ZJLCBBQ19WTworCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkFja1BvbGljeSIsIHRtcGJ1ZiwgMzIsIGJ1ZmZlcikpCisJeworCQlmb3IgKGkgPSAwLCBtYWNwdHIgPSByc3RydG9rKHRtcGJ1ZiwiOyIpOyBtYWNwdHI7IG1hY3B0ciA9IHJzdHJ0b2soTlVMTCwiOyIpLCBpKyspCisJCXsKKwkJCXBBZC0+Q29tbW9uQ2ZnLkFja1BvbGljeVtpXSA9IChVQ0hBUilzaW1wbGVfc3RydG9sKG1hY3B0ciwgMCwgMTApOworCisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBY2tQb2xpY3lbJWRdPSVkXG4iLCBpLCBwQWQtPkNvbW1vbkNmZy5BY2tQb2xpY3lbaV0pKTsKKwkJfQorCX0KKworCWlmIChiV21tRW5hYmxlKQorCXsKKwkJLy9BUFNEQ2FwYWJsZQorCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJBUFNEQ2FwYWJsZSIsIHRtcGJ1ZiwgMTAsIGJ1ZmZlcikpCisJCXsKKwkJCWlmKHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCkgIT0gMCkgIC8vRW5hYmxlCisJCQkJcEFkLT5Db21tb25DZmcuYkFQU0RDYXBhYmxlID0gVFJVRTsKKwkJCWVsc2UKKwkJCQlwQWQtPkNvbW1vbkNmZy5iQVBTRENhcGFibGUgPSBGQUxTRTsKKworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVBTRENhcGFibGU9JWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLmJBUFNEQ2FwYWJsZSkpOworCQl9CisKKwkJLy9BUFNEQUMgZm9yIEFDX0JFLCBBQ19CSywgQUNfVkksIEFDX1ZPCisJCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkFQU0RBQyIsIHRtcGJ1ZiwgMzIsIGJ1ZmZlcikpCisJCXsKKwkJCUJPT0xFQU4gYXBzZF9hY1s0XTsKKworCQkJZm9yIChpID0gMCwgbWFjcHRyID0gcnN0cnRvayh0bXBidWYsIjsiKTsgbWFjcHRyOyBtYWNwdHIgPSByc3RydG9rKE5VTEwsIjsiKSwgaSsrKQorCQkJeworCQkJCWFwc2RfYWNbaV0gPSAoQk9PTEVBTilzaW1wbGVfc3RydG9sKG1hY3B0ciwgMCwgMTApOworCisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVBTREFDJWQgICVkXG4iLCBpLCAgYXBzZF9hY1tpXSkpOworCQkJfQorCisJCQlwQWQtPkNvbW1vbkNmZy5iQVBTREFDX0JFID0gYXBzZF9hY1swXTsKKwkJCXBBZC0+Q29tbW9uQ2ZnLmJBUFNEQUNfQksgPSBhcHNkX2FjWzFdOworCQkJcEFkLT5Db21tb25DZmcuYkFQU0RBQ19WSSA9IGFwc2RfYWNbMl07CisJCQlwQWQtPkNvbW1vbkNmZy5iQVBTREFDX1ZPID0gYXBzZF9hY1szXTsKKwkJfQorCX0KKworfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisKK05ESVNfU1RBVFVTCVJUTVBSZWFkUGFyYW1ldGVyc0hvb2soCisJSU4JUFJUTVBfQURBUFRFUiBwQWQpCit7CisJUFVDSEFSCQkJCQlzcmMgPSBOVUxMOworCXN0cnVjdCBmaWxlCQkJCSpzcmNmOworCUlOVCAJCQkJCXJldHZhbCwgb3JnZnN1aWQsIG9yZ2ZzZ2lkOworICAgCW1tX3NlZ21lbnRfdAkJCW9yZ2ZzOworCUNIQVIJCQkJCSpidWZmZXI7CisJQ0hBUgkJCQkJKnRtcGJ1ZjsKKwlVTE9ORwkJCQkJUnRzVGhyZXNoOworCVVMT05HCQkJCQlGcmFnVGhyZXNoOworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCVVDSEFSCSAgICAgICAgICAgICAgICBrZXlNYXRlcmlhbFs0MF07CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKworCVBVQ0hBUgkJCQkJbWFjcHRyOworCUlOVAkJCQkJCWkgPSAwOworCisJYnVmZmVyID0ga21hbGxvYyhNQVhfSU5JX0JVRkZFUl9TSVpFLCBNRU1fQUxMT0NfRkxBRyk7CisJaWYoYnVmZmVyID09IE5VTEwpCisgICAgICAgIHJldHVybiBORElTX1NUQVRVU19GQUlMVVJFOworCisJdG1wYnVmID0ga21hbGxvYyhNQVhfUEFSQU1fQlVGRkVSX1NJWkUsIE1FTV9BTExPQ19GTEFHKTsKKwlpZih0bXBidWYgPT0gTlVMTCkKKwl7CisJCWtmcmVlKGJ1ZmZlcik7CisgICAgICAgIHJldHVybiBORElTX1NUQVRVU19GQUlMVVJFOworCX0KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCXNyYyA9IFNUQV9QUk9GSUxFX1BBVEg7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisjaWZkZWYgTVVMVElQTEVfQ0FSRF9TVVBQT1JUCisJc3JjID0gcEFkLT5NQ19GaWxlTmFtZTsKKyNlbmRpZiAvLyBNVUxUSVBMRV9DQVJEX1NVUFBPUlQgLy8KKworCS8vIFNhdmUgdWlkIGFuZCBnaWQgdXNlZCBmb3IgZmlsZXN5c3RlbSBhY2Nlc3MuCisJLy8gU2V0IHVzZXIgYW5kIGdyb3VwIHRvIDAgKHJvb3QpCisJb3JnZnN1aWQgPSBjdXJyZW50X2ZzdWlkKCk7CisJb3JnZnNnaWQgPSBjdXJyZW50X2ZzZ2lkKCk7CisJLyogSG0sIGNhbid0IHJlYWxseSBkbyB0aGlzIG5pY2VseSBhbnltb3JlLCBzbyByZWx5IG9uIHRoZXNlIGZpbGVzCisJICogYmVpbmcgc2V0IHRvIHRoZSBwcm9wZXIgcGVybWlzc2lvbiB0byByZWFkIHRoZW0uLi4gKi8KKwkvKiBjdXJyZW50LT5jcmVkLT5mc3VpZCA9IGN1cnJlbnQtPmNyZWQtPmZzZ2lkID0gMDsgKi8KKyAgICBvcmdmcyA9IGdldF9mcygpOworICAgIHNldF9mcyhLRVJORUxfRFMpOworCisJaWYgKHNyYyAmJiAqc3JjKQorCXsKKwkJc3JjZiA9IGZpbHBfb3BlbihzcmMsIE9fUkRPTkxZLCAwKTsKKwkJaWYgKElTX0VSUihzcmNmKSkKKwkJeworCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiLS0+IEVycm9yICVsZCBvcGVuaW5nICVzXG4iLCAtUFRSX0VSUihzcmNmKSxzcmMpKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCS8vIFRoZSBvYmplY3QgbXVzdCBoYXZlIGEgcmVhZCBtZXRob2QKKwkJCWlmIChzcmNmLT5mX29wICYmIHNyY2YtPmZfb3AtPnJlYWQpCisJCQl7CisJCQkJbWVtc2V0KGJ1ZmZlciwgMHgwMCwgTUFYX0lOSV9CVUZGRVJfU0laRSk7CisJCQkJcmV0dmFsPXNyY2YtPmZfb3AtPnJlYWQoc3JjZiwgYnVmZmVyLCBNQVhfSU5JX0JVRkZFUl9TSVpFLCAmc3JjZi0+Zl9wb3MpOworCQkJCWlmIChyZXR2YWwgPCAwKQorCQkJCXsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+IFJlYWQgJXMgZXJyb3IgJWRcbiIsIHNyYywgLXJldHZhbCkpOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQkvLyBzZXQgZmlsZSBwYXJhbWV0ZXIgdG8gcG9ydGNmZworCQkJCQkvL0NvdW50cnlSZWdpb24KKwkJCQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiQ291bnRyeVJlZ2lvbiIsIHRtcGJ1ZiwgMjUsIGJ1ZmZlcikpCisJCQkJCXsKKwkJCQkJCXBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb24gPSAoVUNIQVIpIHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCk7CisJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDb3VudHJ5UmVnaW9uPSVkXG4iLCBwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uKSk7CisJCQkJCX0KKwkJCQkJLy9Db3VudHJ5UmVnaW9uQUJhbmQKKwkJCQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiQ291bnRyeVJlZ2lvbkFCYW5kIiwgdG1wYnVmLCAyNSwgYnVmZmVyKSkKKwkJCQkJeworCQkJCQkJcEFkLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbkZvckFCYW5kPSAoVUNIQVIpIHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCk7CisJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDb3VudHJ5UmVnaW9uQUJhbmQ9JWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb25Gb3JBQmFuZCkpOworCQkJCQl9CisJCQkJCS8vQ291bnRyeUNvZGUKKwkJCQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiQ291bnRyeUNvZGUiLCB0bXBidWYsIDI1LCBidWZmZXIpKQorCQkJCQl7CisJCQkJCQlOZGlzTW92ZU1lbW9yeShwQWQtPkNvbW1vbkNmZy5Db3VudHJ5Q29kZSwgdG1wYnVmICwgMik7CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisjaWZkZWYgRVhUX0JVSUxEX0NIQU5ORUxfTElTVAorCQkJCQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJCQkJCQlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5TdGFPcmlDb3VudHJ5Q29kZSwgdG1wYnVmICwgMik7CisjZW5kaWYgLy8gRVhUX0JVSUxEX0NIQU5ORUxfTElTVCAvLworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCQkJCQkJaWYgKHN0cmxlbihwQWQtPkNvbW1vbkNmZy5Db3VudHJ5Q29kZSkgIT0gMCkKKwkJCQkJCXsKKwkJCQkJCQlwQWQtPkNvbW1vbkNmZy5iQ291bnRyeUZsYWcgPSBUUlVFOworCQkJCQkJfQorCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ291bnRyeUNvZGU9JXNcbiIsIHBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlDb2RlKSk7CisJCQkJCX0KKwkJCQkJLy9DaGFubmVsR2VvZ3JhcGh5CisJCQkJCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkNoYW5uZWxHZW9ncmFwaHkiLCB0bXBidWYsIDI1LCBidWZmZXIpKQorCQkJCQl7CisJCQkJCQlVQ0hBUiBHZW9ncmFwaHkgPSAoVUNIQVIpIHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCk7CisJCQkJCQlpZiAoR2VvZ3JhcGh5IDw9IEJPVEgpCisJCQkJCQl7CisJCQkJCQkJcEFkLT5Db21tb25DZmcuR2VvZ3JhcGh5ID0gR2VvZ3JhcGh5OworCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlDb2RlWzJdID0KKwkJCQkJCQkJKHBBZC0+Q29tbW9uQ2ZnLkdlb2dyYXBoeSA9PSBCT1RIKSA/ICcgJyA6ICgocEFkLT5Db21tb25DZmcuR2VvZ3JhcGh5ID09IElET1IpID8gJ0knIDogJ08nKTsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKyNpZmRlZiBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUCisJCQkJCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQkJCQkJCXBBZC0+U3RhQ2ZnLlN0YU9yaUdlb2dyYXBoeSA9IHBBZC0+Q29tbW9uQ2ZnLkdlb2dyYXBoeTsKKyNlbmRpZiAvLyBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUIC8vCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ2hhbm5lbEdlb2dyYXBoeT0lZFxuIiwgcEFkLT5Db21tb25DZmcuR2VvZ3JhcGh5KSk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlwQWQtPkNvbW1vbkNmZy5HZW9ncmFwaHkgPSBCT1RIOworCQkJCQkJcEFkLT5Db21tb25DZmcuQ291bnRyeUNvZGVbMl0gPSAnICc7CisJCQkJCX0KKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCQkJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCQkJCXsKKwkJCQkJCS8vU1NJRAorCQkJCQkJaWYgKFJUTVBHZXRDcml0aWNhbFBhcmFtZXRlcigiU1NJRCIsIHRtcGJ1ZiwgMjU2LCBidWZmZXIpKQorCQkJCQkJeworCQkJCQkJCWlmIChzdHJsZW4odG1wYnVmKSA8PSAzMikKKwkJCQkJCQl7CisJCQkgCQkJCQlwQWQtPkNvbW1vbkNmZy5Tc2lkTGVuID0gKFVDSEFSKSBzdHJsZW4odG1wYnVmKTsKKwkJCQkJCQkJTmRpc1plcm9NZW1vcnkocEFkLT5Db21tb25DZmcuU3NpZCwgTkRJU184MDJfMTFfTEVOR1RIX1NTSUQpOworCQkJCQkJCQlOZGlzTW92ZU1lbW9yeShwQWQtPkNvbW1vbkNmZy5Tc2lkLCB0bXBidWYsIHBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW4pOworCQkJCQkJCQlwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWRMZW4gPSBwQWQtPkNvbW1vbkNmZy5Tc2lkTGVuOworCQkJCQkJCQlOZGlzWmVyb01lbW9yeShwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWQsIE5ESVNfODAyXzExX0xFTkdUSF9TU0lEKTsKKwkJCQkJCQkJTmRpc01vdmVNZW1vcnkocEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkLCB0bXBidWYsIHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbik7CisJCQkJCQkJCXBBZC0+TWxtZUF1eC5Tc2lkTGVuID0gcEFkLT5Db21tb25DZmcuU3NpZExlbjsKKwkJCQkJCQkJTmRpc1plcm9NZW1vcnkocEFkLT5NbG1lQXV4LlNzaWQsIE5ESVNfODAyXzExX0xFTkdUSF9TU0lEKTsKKwkJCQkJCQkJTmRpc01vdmVNZW1vcnkocEFkLT5NbG1lQXV4LlNzaWQsIHRtcGJ1ZiwgcEFkLT5NbG1lQXV4LlNzaWRMZW4pOworCQkJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6KFNTSUQ9JXMpXG4iLCBfX2Z1bmNfXywgdG1wYnVmKSk7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJCQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJCQkJeworCQkJCQkJLy9OZXR3b3JrVHlwZQorCQkJCQkJaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIk5ldHdvcmtUeXBlIiwgdG1wYnVmLCAyNSwgYnVmZmVyKSkKKwkJCQkJCXsKKwkJCQkJCQlwQWQtPmJDb25maWdDaGFuZ2VkID0gVFJVRTsKKwkJCQkJCQlpZiAoc3RyY21wKHRtcGJ1ZiwgIkFkaG9jIikgPT0gMCkKKwkJCQkJCQkJcEFkLT5TdGFDZmcuQnNzVHlwZSA9IEJTU19BREhPQzsKKwkJCQkJCQllbHNlIC8vRGVmYXVsdCBJbmZyYXN0cnVjdHVyZSBtb2RlCisJCQkJCQkJCXBBZC0+U3RhQ2ZnLkJzc1R5cGUgPSBCU1NfSU5GUkE7CisJCQkJCQkJLy8gUmVzZXQgUmFsaW5rIHN1cHBsaWNhbnQgdG8gbm90IHVzZSwgaXQgd2lsbCBiZSBzZXQgdG8gc3RhcnQgd2hlbiBVSSBzZXQgUE1LIGtleQorCQkJCQkJCXBBZC0+U3RhQ2ZnLldwYVN0YXRlID0gU1NfTk9UVVNFOworCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjooTmV0d29ya1R5cGU9JWQpXG4iLCBfX2Z1bmNfXywgcEFkLT5TdGFDZmcuQnNzVHlwZSkpOworCQkJCQkJfQorCQkJCQl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJCQkJCS8vQ2hhbm5lbAorCQkJCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJDaGFubmVsIiwgdG1wYnVmLCAxMCwgYnVmZmVyKSkKKwkJCQkJeworCQkJCQkJcEFkLT5Db21tb25DZmcuQ2hhbm5lbCA9IChVQ0hBUikgc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKTsKKwkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNoYW5uZWw9JWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpKTsKKwkJCQkJfQorCQkJCQkvL1dpcmVsZXNzTW9kZQorCQkJCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJXaXJlbGVzc01vZGUiLCB0bXBidWYsIDEwLCBidWZmZXIpKQorCQkJCQl7CisJCQkJCQlpbnQgdmFsdWUgID0gMCwgbWF4UGh5TW9kZSA9IFBIWV8xMUc7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCQkJCW1heFBoeU1vZGUgPSBQSFlfMTFOXzVHOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJCQkJCQl2YWx1ZSA9IHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCk7CisKKwkJCQkJCWlmICh2YWx1ZSA8PSBtYXhQaHlNb2RlKQorCQkJCQkJeworCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPSB2YWx1ZTsKKwkJCQkJCX0KKwkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBoeU1vZGU9JWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUpKTsKKwkJCQkJfQorICAgICAgICAgICAgICAgICAgICAvL0Jhc2ljUmF0ZQorCQkJCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJCYXNpY1JhdGUiLCB0bXBidWYsIDEwLCBidWZmZXIpKQorCQkJCQl7CisJCQkJCQlwQWQtPkNvbW1vbkNmZy5CYXNpY1JhdGVCaXRtYXAgPSAoVUxPTkcpIHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCk7CisJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJCYXNpY1JhdGU9JWxkXG4iLCBwQWQtPkNvbW1vbkNmZy5CYXNpY1JhdGVCaXRtYXApKTsKKwkJCQkJfQorCQkJCQkvL0JlYWNvblBlcmlvZAorCQkJCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJCZWFjb25QZXJpb2QiLCB0bXBidWYsIDEwLCBidWZmZXIpKQorCQkJCQl7CisJCQkJCQlwQWQtPkNvbW1vbkNmZy5CZWFjb25QZXJpb2QgPSAoVVNIT1JUKSBzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApOworCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQmVhY29uUGVyaW9kPSVkXG4iLCBwQWQtPkNvbW1vbkNmZy5CZWFjb25QZXJpb2QpKTsKKwkJCQkJfQorICAgICAgICAgICAgICAgICAgICAvL1R4UG93ZXIKKwkJCQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiVHhQb3dlciIsIHRtcGJ1ZiwgMTAsIGJ1ZmZlcikpCisJCQkJCXsKKwkJCQkJCXBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID0gKFVMT05HKSBzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApOworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQkJCQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJCQkJCQlwQWQtPkNvbW1vbkNmZy5UeFBvd2VyRGVmYXVsdCA9IHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiVHhQb3dlcj0lbGRcbiIsIHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlKSk7CisJCQkJCX0KKwkJCQkJLy9CR1Byb3RlY3Rpb24KKwkJCQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiQkdQcm90ZWN0aW9uIiwgdG1wYnVmLCAxMCwgYnVmZmVyKSkKKwkJCQkJeworCQkJCQkJc3dpdGNoIChzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApKQorCQkJCQkJeworCQkJCQkJCWNhc2UgMTogLy9BbHdheXMgT24KKwkJCQkJCQkJcEFkLT5Db21tb25DZmcuVXNlQkdQcm90ZWN0aW9uID0gMTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSAyOiAvL0Fsd2F5cyBPRkYKKwkJCQkJCQkJcEFkLT5Db21tb25DZmcuVXNlQkdQcm90ZWN0aW9uID0gMjsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSAwOiAvL0FVVE8KKwkJCQkJCQlkZWZhdWx0OgorCQkJCQkJCQlwQWQtPkNvbW1vbkNmZy5Vc2VCR1Byb3RlY3Rpb24gPSAwOworCQkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkJHUHJvdGVjdGlvbj0lbGRcbiIsIHBBZC0+Q29tbW9uQ2ZnLlVzZUJHUHJvdGVjdGlvbikpOworCQkJCQl9CisJCQkJCS8vT0xCQ0RldGVjdGlvbgorCQkJCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJEaXNhYmxlT0xCQyIsIHRtcGJ1ZiwgMTAsIGJ1ZmZlcikpCisJCQkJCXsKKwkJCQkJCXN3aXRjaCAoc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKSkKKwkJCQkJCXsKKwkJCQkJCQljYXNlIDE6IC8vZGlzYWJsZSBPTEJDIERldGVjdGlvbgorCQkJCQkJCQlwQWQtPkNvbW1vbkNmZy5EaXNhYmxlT0xCQ0RldGVjdCA9IDE7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgMDogLy9lbmFibGUgT0xCQyBEZXRlY3Rpb24KKwkJCQkJCQkJcEFkLT5Db21tb25DZmcuRGlzYWJsZU9MQkNEZXRlY3QgPSAwOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQlkZWZhdWx0OgorCQkJCQkJCQlwQWQtPkNvbW1vbkNmZy5EaXNhYmxlT0xCQ0RldGVjdD0gMDsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJPTEJDRGV0ZWN0aW9uPSVsZFxuIiwgcEFkLT5Db21tb25DZmcuRGlzYWJsZU9MQkNEZXRlY3QpKTsKKwkJCQkJfQorCQkJCQkvL1R4UHJlYW1ibGUKKwkJCQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiVHhQcmVhbWJsZSIsIHRtcGJ1ZiwgMTAsIGJ1ZmZlcikpCisJCQkJCXsKKwkJCQkJCXN3aXRjaCAoc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKSkKKwkJCQkJCXsKKwkJCQkJCQljYXNlIFJ0ODAyXzExUHJlYW1ibGVTaG9ydDoKKwkJCQkJCQkJcEFkLT5Db21tb25DZmcuVHhQcmVhbWJsZSA9IFJ0ODAyXzExUHJlYW1ibGVTaG9ydDsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSBSdDgwMl8xMVByZWFtYmxlTG9uZzoKKwkJCQkJCQlkZWZhdWx0OgorCQkJCQkJCQlwQWQtPkNvbW1vbkNmZy5UeFByZWFtYmxlID0gUnQ4MDJfMTFQcmVhbWJsZUxvbmc7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiVHhQcmVhbWJsZT0lbGRcbiIsIHBBZC0+Q29tbW9uQ2ZnLlR4UHJlYW1ibGUpKTsKKwkJCQkJfQorCQkJCQkvL1JUU1RocmVzaG9sZAorCQkJCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJSVFNUaHJlc2hvbGQiLCB0bXBidWYsIDEwLCBidWZmZXIpKQorCQkJCQl7CisJCQkJCQlSdHNUaHJlc2ggPSBzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApOworCQkJCQkJaWYoIChSdHNUaHJlc2ggPj0gMSkgJiYgKFJ0c1RocmVzaCA8PSBNQVhfUlRTX1RIUkVTSE9MRCkgKQorCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLlJ0c1RocmVzaG9sZCAgPSAoVVNIT1JUKVJ0c1RocmVzaDsKKwkJCQkJCWVsc2UKKwkJCQkJCQlwQWQtPkNvbW1vbkNmZy5SdHNUaHJlc2hvbGQgPSBNQVhfUlRTX1RIUkVTSE9MRDsKKworCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlRTVGhyZXNob2xkPSVkXG4iLCBwQWQtPkNvbW1vbkNmZy5SdHNUaHJlc2hvbGQpKTsKKwkJCQkJfQorCQkJCQkvL0ZyYWdUaHJlc2hvbGQKKwkJCQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiRnJhZ1RocmVzaG9sZCIsIHRtcGJ1ZiwgMTAsIGJ1ZmZlcikpCisJCQkJCXsKKwkJCQkJCUZyYWdUaHJlc2ggPSBzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApOworCQkJCQkJcEFkLT5Db21tb25DZmcuYlVzZVplcm9Ub0Rpc2FibGVGcmFnbWVudCA9IEZBTFNFOworCisJCQkJCQlpZiAoRnJhZ1RocmVzaCA+IE1BWF9GUkFHX1RIUkVTSE9MRCB8fCBGcmFnVGhyZXNoIDwgTUlOX0ZSQUdfVEhSRVNIT0xEKQorCQkJCQkJeyAvL2lsbGVnYWwgRnJhZ1RocmVzaCBzbyB3ZSBzZXQgaXQgdG8gZGVmYXVsdAorCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLkZyYWdtZW50VGhyZXNob2xkID0gTUFYX0ZSQUdfVEhSRVNIT0xEOworCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLmJVc2VaZXJvVG9EaXNhYmxlRnJhZ21lbnQgPSBUUlVFOworCQkJCQkJfQorCQkJCQkJZWxzZSBpZiAoRnJhZ1RocmVzaCAlIDIgPT0gMSkKKwkJCQkJCXsKKwkJCQkJCQkvLyBUaGUgbGVuZ3RoIG9mIGVhY2ggZnJhZ21lbnQgc2hhbGwgYWx3YXlzIGJlIGFuIGV2ZW4gbnVtYmVyIG9mIG9jdGV0cywgZXhjZXB0IGZvciB0aGUgbGFzdCBmcmFnbWVudAorCQkJCQkJCS8vIG9mIGFuIE1TRFUgb3IgTU1QRFUsIHdoaWNoIG1heSBiZSBlaXRoZXIgYW4gZXZlbiBvciBhbiBvZGQgbnVtYmVyIG9mIG9jdGV0cy4KKwkJCQkJCQlwQWQtPkNvbW1vbkNmZy5GcmFnbWVudFRocmVzaG9sZCA9IChVU0hPUlQpKEZyYWdUaHJlc2ggLSAxKTsKKwkJCQkJCX0KKwkJCQkJCWVsc2UKKwkJCQkJCXsKKwkJCQkJCQlwQWQtPkNvbW1vbkNmZy5GcmFnbWVudFRocmVzaG9sZCA9IChVU0hPUlQpRnJhZ1RocmVzaDsKKwkJCQkJCX0KKwkJCQkJCS8vcEFkLT5Db21tb25DZmcuQWxsb3dGcmFnU2l6ZSA9IChwQWQtPkNvbW1vbkNmZy5GcmFnbWVudFRocmVzaG9sZCkgLSBMRU5HVEhfODAyXzExIC0gTEVOR1RIX0NSQzsKKwkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkZyYWdUaHJlc2hvbGQ9JWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLkZyYWdtZW50VGhyZXNob2xkKSk7CisJCQkJCX0KKwkJCQkJLy9UeEJ1cnN0CisJCQkJCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIlR4QnVyc3QiLCB0bXBidWYsIDEwLCBidWZmZXIpKQorCQkJCQl7CisvLyNpZmRlZiBXSUZJX1RFU1QKKy8vCQkJCQkJcEFkLT5Db21tb25DZmcuYkVuYWJsZVR4QnVyc3QgPSBGQUxTRTsKKy8vI2Vsc2UKKwkJCQkJCWlmKHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCkgIT0gMCkgIC8vRW5hYmxlCisJCQkJCQkJcEFkLT5Db21tb25DZmcuYkVuYWJsZVR4QnVyc3QgPSBUUlVFOworCQkJCQkJZWxzZSAvL0Rpc2FibGUKKwkJCQkJCQlwQWQtPkNvbW1vbkNmZy5iRW5hYmxlVHhCdXJzdCA9IEZBTFNFOworLy8jZW5kaWYKKwkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlR4QnVyc3Q9JWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLmJFbmFibGVUeEJ1cnN0KSk7CisJCQkJCX0KKworI2lmZGVmIEFHR1JFR0FUSU9OX1NVUFBPUlQKKwkJCQkJLy9Qa3RBZ2dyZWdhdGUKKwkJCQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiUGt0QWdncmVnYXRlIiwgdG1wYnVmLCAxMCwgYnVmZmVyKSkKKwkJCQkJeworCQkJCQkJaWYoc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKSAhPSAwKSAgLy9FbmFibGUKKwkJCQkJCQlwQWQtPkNvbW1vbkNmZy5iQWdncmVnYXRpb25DYXBhYmxlID0gVFJVRTsKKwkJCQkJCWVsc2UgLy9EaXNhYmxlCisJCQkJCQkJcEFkLT5Db21tb25DZmcuYkFnZ3JlZ2F0aW9uQ2FwYWJsZSA9IEZBTFNFOworI2lmZGVmIFBJR0dZQkFDS19TVVBQT1JUCisJCQkJCQlwQWQtPkNvbW1vbkNmZy5iUGlnZ3lCYWNrQ2FwYWJsZSA9IHBBZC0+Q29tbW9uQ2ZnLmJBZ2dyZWdhdGlvbkNhcGFibGU7CisjZW5kaWYgLy8gUElHR1lCQUNLX1NVUFBPUlQgLy8KKwkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBrdEFnZ3JlZ2F0ZT0lZFxuIiwgcEFkLT5Db21tb25DZmcuYkFnZ3JlZ2F0aW9uQ2FwYWJsZSkpOworCQkJCQl9CisjZWxzZQorCQkJCQlwQWQtPkNvbW1vbkNmZy5iQWdncmVnYXRpb25DYXBhYmxlID0gRkFMU0U7CisJCQkJCXBBZC0+Q29tbW9uQ2ZnLmJQaWdneUJhY2tDYXBhYmxlID0gRkFMU0U7CisjZW5kaWYgLy8gQUdHUkVHQVRJT05fU1VQUE9SVCAvLworCisJCQkJCS8vIFdtbUNhcGFibGUKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQkJCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQkJCQkJcnRtcF9yZWFkX3N0YV93bW1fcGFybXNfZnJvbV9maWxlKHBBZCwgdG1wYnVmLCBidWZmZXIpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJCQkJCS8vU2hvcnRTbG90CisJCQkJCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIlNob3J0U2xvdCIsIHRtcGJ1ZiwgMTAsIGJ1ZmZlcikpCisJCQkJCXsKKwkJCQkJCWlmKHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCkgIT0gMCkgIC8vRW5hYmxlCisJCQkJCQkJcEFkLT5Db21tb25DZmcuYlVzZVNob3J0U2xvdFRpbWUgPSBUUlVFOworCQkJCQkJZWxzZSAvL0Rpc2FibGUKKwkJCQkJCQlwQWQtPkNvbW1vbkNmZy5iVXNlU2hvcnRTbG90VGltZSA9IEZBTFNFOworCisJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTaG9ydFNsb3Q9JWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLmJVc2VTaG9ydFNsb3RUaW1lKSk7CisJCQkJCX0KKwkJCQkJLy9JRUVFODAyMTFICisJCQkJCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIklFRUU4MDIxMUgiLCB0bXBidWYsIDEwLCBidWZmZXIpKQorCQkJCQl7CisJCQkJCSAgICBmb3IgKGkgPSAwLCBtYWNwdHIgPSByc3RydG9rKHRtcGJ1ZiwiOyIpOyBtYWNwdHI7IG1hY3B0ciA9IHJzdHJ0b2soTlVMTCwiOyIpLCBpKyspCisJCQkJCSAgICB7CisgICAgCQkJCQkJaWYoc2ltcGxlX3N0cnRvbChtYWNwdHIsIDAsIDEwKSAhPSAwKSAgLy9FbmFibGUKKyAgICAJCQkJCQkJcEFkLT5Db21tb25DZmcuYklFRUU4MDIxMUggPSBUUlVFOworICAgIAkJCQkJCWVsc2UgLy9EaXNhYmxlCisgICAgCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLmJJRUVFODAyMTFIID0gRkFMU0U7CisKKyAgICAJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJRUVFODAyMTFIPSVkXG4iLCBwQWQtPkNvbW1vbkNmZy5iSUVFRTgwMjExSCkpOworCQkJCQkgICAgfQorCQkJCQl9CisJCQkJCS8vQ1NQZXJpb2QKKwkJCQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiQ1NQZXJpb2QiLCB0bXBidWYsIDEwLCBidWZmZXIpKQorCQkJCQl7CisJCQkJCSAgICBpZihzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApICE9IDApCisJCQkJCQkJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuQ1NQZXJpb2QgPSBzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApOworCQkJCQkJZWxzZQorCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LkNTUGVyaW9kID0gMDsKKworICAgCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ1NQZXJpb2Q9JWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LkNTUGVyaW9kKSk7CisJCQkJCX0KKworCQkJCQkvL1JEUmVnaW9uCisJCQkJCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIlJEUmVnaW9uIiwgdG1wYnVmLCAxMjgsIGJ1ZmZlcikpCisJCQkJCXsKKwkJCQkJCWlmICgoc3RybmNtcCh0bXBidWYsICJKQVBfVzUzIiwgNykgPT0gMCkgfHwgKHN0cm5jbXAodG1wYnVmLCAiamFwX3c1MyIsIDcpID09IDApKQorCQkJCQkJeworCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJERHVyUmVnaW9uID0gSkFQX1c1MzsKKwkJCQkJCQlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5EZnNTZXNzaW9uVGltZSA9IDE1OworCQkJCQkJfQorCQkJCQkJZWxzZSBpZiAoKHN0cm5jbXAodG1wYnVmLCAiSkFQX1c1NiIsIDcpID09IDApIHx8IChzdHJuY21wKHRtcGJ1ZiwgImphcF93NTYiLCA3KSA9PSAwKSkKKwkJCQkJCXsKKwkJCQkJCQlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5SRER1clJlZ2lvbiA9IEpBUF9XNTY7CisJCQkJCQkJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuRGZzU2Vzc2lvblRpbWUgPSAxMzsKKwkJCQkJCX0KKwkJCQkJCWVsc2UgaWYgKChzdHJuY21wKHRtcGJ1ZiwgIkpBUCIsIDMpID09IDApIHx8IChzdHJuY21wKHRtcGJ1ZiwgImphcCIsIDMpID09IDApKQorCQkJCQkJeworCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJERHVyUmVnaW9uID0gSkFQOworCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LkRmc1Nlc3Npb25UaW1lID0gNTsKKwkJCQkJCX0KKwkJCQkJCWVsc2UgIGlmICgoc3RybmNtcCh0bXBidWYsICJGQ0MiLCAzKSA9PSAwKSB8fCAoc3RybmNtcCh0bXBidWYsICJmY2MiLCAzKSA9PSAwKSkKKwkJCQkJCXsKKwkJCQkJCQlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5SRER1clJlZ2lvbiA9IEZDQzsKKwkJCQkJCQlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5EZnNTZXNzaW9uVGltZSA9IDU7CisJCQkJCQl9CisJCQkJCQllbHNlIGlmICgoc3RybmNtcCh0bXBidWYsICJDRSIsIDIpID09IDApIHx8IChzdHJuY21wKHRtcGJ1ZiwgImNlIiwgMikgPT0gMCkpCisJCQkJCQl7CisJCQkJCQkJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkREdXJSZWdpb24gPSBDRTsKKwkJCQkJCQlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5EZnNTZXNzaW9uVGltZSA9IDEzOworCQkJCQkJfQorCQkJCQkJZWxzZQorCQkJCQkJeworCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJERHVyUmVnaW9uID0gQ0U7CisJCQkJCQkJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuRGZzU2Vzc2lvblRpbWUgPSAxMzsKKwkJCQkJCX0KKworCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkRSZWdpb249JWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJERHVyUmVnaW9uKSk7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5SRER1clJlZ2lvbiA9IENFOworCQkJCQkJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuRGZzU2Vzc2lvblRpbWUgPSAxMzsKKwkJCQkJfQorCisJCQkJCS8vV2lyZWxlc3NFdmVudAorCQkJCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJXaXJlbGVzc0V2ZW50IiwgdG1wYnVmLCAxMCwgYnVmZmVyKSkKKwkJCQkJeworI2lmIFdJUkVMRVNTX0VYVCA+PSAxNQorCQkJCQkgICAgaWYoc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKSAhPSAwKQorCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLmJXaXJlbGVzc0V2ZW50ID0gc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKTsKKwkJCQkJCWVsc2UKKwkJCQkJCQlwQWQtPkNvbW1vbkNmZy5iV2lyZWxlc3NFdmVudCA9IDA7CS8vIGRpc2FibGUKKyNlbHNlCisJCQkJCQlwQWQtPkNvbW1vbkNmZy5iV2lyZWxlc3NFdmVudCA9IDA7CS8vIGRpc2FibGUKKyNlbmRpZgorICAgCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiV2lyZWxlc3NFdmVudD0lZFxuIiwgcEFkLT5Db21tb25DZmcuYldpcmVsZXNzRXZlbnQpKTsKKwkJCQkJfQorCQkJCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJXaUZpVGVzdCIsIHRtcGJ1ZiwgMTAsIGJ1ZmZlcikpCisJCQkJCXsKKwkJCQkJICAgIGlmKHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCkgIT0gMCkKKwkJCQkJCQlwQWQtPkNvbW1vbkNmZy5iV2lGaVRlc3Q9IHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCk7CisJCQkJCQllbHNlCisJCQkJCQkJcEFkLT5Db21tb25DZmcuYldpRmlUZXN0ID0gMDsJLy8gZGlzYWJsZQorCisgICAJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJXaUZpVGVzdD0lZFxuIiwgcEFkLT5Db21tb25DZmcuYldpRmlUZXN0KSk7CisJCQkJCX0KKwkJCQkJLy9BdXRoTW9kZQorCQkJCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJBdXRoTW9kZSIsIHRtcGJ1ZiwgMTI4LCBidWZmZXIpKQorCQkJCQl7CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCQkJCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQkJCQkJeworCQkJCQkJCWlmICgoc3RyY21wKHRtcGJ1ZiwgIldFUEFVVE8iKSA9PSAwKSB8fCAoc3RyY21wKHRtcGJ1ZiwgIndlcGF1dG8iKSA9PSAwKSkKKwkJCQkJCQkgICAgcEFkLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVBdXRvU3dpdGNoOworCQkJCQkJCWVsc2UgaWYgKChzdHJjbXAodG1wYnVmLCAiU0hBUkVEIikgPT0gMCkgfHwgKHN0cmNtcCh0bXBidWYsICJzaGFyZWQiKSA9PSAwKSkKKwkJCQkJCQkgICAgcEFkLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVTaGFyZWQ7CisJCQkJCQkJZWxzZSBpZiAoKHN0cmNtcCh0bXBidWYsICJXUEFQU0siKSA9PSAwKSB8fCAoc3RyY21wKHRtcGJ1ZiwgIndwYXBzayIpID09IDApKQorCQkJCQkJCSAgICBwQWQtPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSzsKKwkJCQkJCQllbHNlIGlmICgoc3RyY21wKHRtcGJ1ZiwgIldQQU5PTkUiKSA9PSAwKSB8fCAoc3RyY21wKHRtcGJ1ZiwgIndwYW5vbmUiKSA9PSAwKSkKKwkJCQkJCQkgICAgcEFkLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lOworCQkJCQkJCWVsc2UgaWYgKChzdHJjbXAodG1wYnVmLCAiV1BBMlBTSyIpID09IDApIHx8IChzdHJjbXAodG1wYnVmLCAid3BhMnBzayIpID09IDApKQorCQkJCQkJCSAgICBwQWQtPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0s7CisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorCQkJCQkJCWVsc2UgaWYgKChzdHJjbXAodG1wYnVmLCAiV1BBIikgPT0gMCkgfHwgKHN0cmNtcCh0bXBidWYsICJ3cGEiKSA9PSAwKSkKKwkJCQkJCQkgICAgcEFkLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVXUEE7CisJCQkJCQkJZWxzZSBpZiAoKHN0cmNtcCh0bXBidWYsICJXUEEyIikgPT0gMCkgfHwgKHN0cmNtcCh0bXBidWYsICJ3cGEyIikgPT0gMCkpCisJCQkJCQkJICAgIHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMjsKKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisJCQkJICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorCQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWQtPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZU9wZW47CisKKwkJCQkgICAgICAgICAgICAgICAgICAgICAgICBwQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9OT1RfU0VDVVJFRDsKKworCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjooRW5jcnlwVHlwZT0lZClcbiIsIF9fZnVuY19fLCBwQWQtPlN0YUNmZy5XZXBTdGF0dXMpKTsKKwkJCQkJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwkJCQkJfQorCQkJCQkvL0VuY3J5cFR5cGUKKwkJCQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiRW5jcnlwVHlwZSIsIHRtcGJ1ZiwgMTI4LCBidWZmZXIpKQorCQkJCQl7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJCQkJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCQkJCQl7CisJCQkJCQkJaWYgKChzdHJjbXAodG1wYnVmLCAiV0VQIikgPT0gMCkgfHwgKHN0cmNtcCh0bXBidWYsICJ3ZXAiKSA9PSAwKSkKKwkJCQkJCQkJcEFkLT5TdGFDZmcuV2VwU3RhdHVzCT0gTmRpczgwMl8xMVdFUEVuYWJsZWQ7CisJCQkJCQkJZWxzZSBpZiAoKHN0cmNtcCh0bXBidWYsICJUS0lQIikgPT0gMCkgfHwgKHN0cmNtcCh0bXBidWYsICJ0a2lwIikgPT0gMCkpCisJCQkJCQkJCXBBZC0+U3RhQ2ZnLldlcFN0YXR1cwk9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ7CisJCQkJCQkJZWxzZSBpZiAoKHN0cmNtcCh0bXBidWYsICJBRVMiKSA9PSAwKSB8fCAoc3RyY21wKHRtcGJ1ZiwgImFlcyIpID09IDApKQorCQkJCQkJCQlwQWQtPlN0YUNmZy5XZXBTdGF0dXMJPSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkOworCQkJCQkJCWVsc2UKKwkJCQkJCQkJcEFkLT5TdGFDZmcuV2VwU3RhdHVzCT0gTmRpczgwMl8xMVdFUERpc2FibGVkOworCisJCQkJCQkJLy8gVXBkYXRlIGFsbCB3ZXBzdGF0dXMgcmVsYXRlZAorCQkJCQkJCXBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIJCT0gcEFkLT5TdGFDZmcuV2VwU3RhdHVzOworCQkJCQkJCXBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyIAk9IHBBZC0+U3RhQ2ZnLldlcFN0YXR1czsKKwkJCQkJCQlwQWQtPlN0YUNmZy5PcmlnV2VwU3RhdHVzIAk9IHBBZC0+U3RhQ2ZnLldlcFN0YXR1czsKKwkJCQkJCQlwQWQtPlN0YUNmZy5iTWl4Q2lwaGVyIAkJPSBGQUxTRTsKKworCQkJCQkJCS8vUlRNUE1ha2VSU05JRShwQWQsIHBBZC0+U3RhQ2ZnLkF1dGhNb2RlLCBwQWQtPlN0YUNmZy5XZXBTdGF0dXMsIDApOworCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjooRW5jcnlwVHlwZT0lZClcbiIsIF9fZnVuY19fLCBwQWQtPlN0YUNmZy5XZXBTdGF0dXMpKTsKKwkJCQkJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwkJCQkJfQorCisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQkJCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQkJCQl7CisJCQkJCQlpZihSVE1QR2V0Q3JpdGljYWxQYXJhbWV0ZXIoIldQQVBTSyIsIHRtcGJ1ZiwgNTEyLCBidWZmZXIpKQorCQkJCQkJeworCQkJCQkJCWludCAgICAgZXJyPTA7CisKKwkJCQkJCQl0bXBidWZbc3RybGVuKHRtcGJ1ZildID0gJ1wwJzsgLy8gbWFrZSBTVEEgY2FuIHByb2Nlc3MgLiReJiBmb3IgV1BBUFNLIGlucHV0CisKKwkJCQkJCQlpZiAoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlICE9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykgJiYKKwkJCQkJCQkJKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlICE9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spICYmCisJCQkJCQkJCShwQWQtPlN0YUNmZy5BdXRoTW9kZSAhPSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lKQorCQkJCQkJCQkpCisJCQkJCQkJeworCQkJCQkJCQllcnIgPSAxOworCQkJCQkJCX0KKwkJCQkJCQllbHNlIGlmICgoc3RybGVuKHRtcGJ1ZikgPj0gOCkgJiYgKHN0cmxlbih0bXBidWYpIDwgNjQpKQorCQkJCQkJCXsKKwkJCQkJCQkJUGFzc3dvcmRIYXNoKChjaGFyICopdG1wYnVmLCBwQWQtPkNvbW1vbkNmZy5Tc2lkLCBwQWQtPkNvbW1vbkNmZy5Tc2lkTGVuLCBrZXlNYXRlcmlhbCk7CisJCQkJCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLlBNSywga2V5TWF0ZXJpYWwsIDMyKTsKKworCQkJCQkJCX0KKwkJCQkJCQllbHNlIGlmIChzdHJsZW4odG1wYnVmKSA9PSA2NCkKKwkJCQkJCQl7CisJCQkJCQkJCUF0b0godG1wYnVmLCBrZXlNYXRlcmlhbCwgMzIpOworCQkJCQkJCQlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5QTUssIGtleU1hdGVyaWFsLCAzMik7CisJCQkJCQkJfQorCQkJCQkJCWVsc2UKKwkJCQkJCQl7CisJCQkJCQkJCWVyciA9IDE7CisJCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzOjooV1BBUFNLIGtleS1zdHJpbmcgcmVxdWlyZWQgOCB+IDY0IGNoYXJhY3RlcnMhKVxuIiwgX19mdW5jX18pKTsKKwkJCQkJCQl9CisKKwkJCQkJCQlpZiAoZXJyID09IDApCisJICAgICAgICAgICAgICAgICAgICAgICAgCQkJeworCSAgICAgICAgICAgICAgICAgICAgICAgIAkJCQlpZiAoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykgfHwKKwkJCQkJCQkJCShwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKSkKKwkJCQkJCQkJeworCQkJCQkJCQkJLy8gU3RhcnQgU1RBIHN1cHBsaWNhbnQgc3RhdGUgbWFjaGluZQorCQkJCQkJCQkJcEFkLT5TdGFDZmcuV3BhU3RhdGUgPSBTU19TVEFSVDsKKwkJCQkJCQkJfQorCQkJCQkJCQllbHNlIGlmIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lKQorCQkJCQkJCQl7CisJLyoKKwkJCQkJCQkJCU5kaXNaZXJvTWVtb3J5KCZwQWQtPlNoYXJlZEtleVtCU1MwXVswXSwgc2l6ZW9mKENJUEhFUl9LRVkpKTsKKwkJCQkJCQkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLktleUxlbiA9IExFTl9US0lQX0VLOworCQkJCQkJCQkJTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5LCBwQWQtPlN0YUNmZy5QTUssIExFTl9US0lQX0VLKTsKKwkJCQkJCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLlJ4TWljLCAmcEFkLT5TdGFDZmcuUE1LWzE2XSwgTEVOX1RLSVBfUlhNSUNLKTsKKwkJCQkJCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLlR4TWljLCAmcEFkLT5TdGFDZmcuUE1LWzE2XSwgTEVOX1RLSVBfVFhNSUNLKTsKKworCQkJCQkJCQkJLy8gRGVjaWRlIGl0cyBDaGlwZXJBbGcKKwkJCQkJCQkJCWlmIChwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpCisJCQkJCQkJCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnID0gQ0lQSEVSX1RLSVA7CisJCQkJCQkJCQllbHNlIGlmIChwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCisJCQkJCQkJCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnID0gQ0lQSEVSX0FFUzsKKwkJCQkJCQkJCWVsc2UKKwkJCQkJCQkJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcgPSBDSVBIRVJfTk9ORTsKKwkqLworCQkJCQkJCQkJcEFkLT5TdGFDZmcuV3BhU3RhdGUgPSBTU19OT1RVU0U7CisJCQkJCQkJCX0KKworCQkJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6KFdQQVBTSz0lcylcbiIsIF9fZnVuY19fLCB0bXBidWYpKTsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCQkJCQkvL0RlZmF1bHRLZXlJRCwgS2V5VHlwZSwgS2V5U3RyCisJCQkJCXJ0bXBfcmVhZF9rZXlfcGFybXNfZnJvbV9maWxlKHBBZCwgdG1wYnVmLCBidWZmZXIpOworCisKKwkJCQkJLy9IU0NvdW50ZXIKKwkJCQkJLyppZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJIU0NvdW50ZXIiLCB0bXBidWYsIDEwLCBidWZmZXIpKQorCQkJCQl7CisJCQkJCQlzd2l0Y2ggKHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCkpCisJCQkJCQl7CisJCQkJCQkJY2FzZSAxOiAvL0VuYWJsZQorCQkJCQkJCQlwQWQtPkNvbW1vbkNmZy5iRW5hYmxlSFNDb3VudGVyID0gVFJVRTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSAwOiAvL0Rpc2FibGUKKwkJCQkJCQlkZWZhdWx0OgorCQkJCQkJCQlwQWQtPkNvbW1vbkNmZy5iRW5hYmxlSFNDb3VudGVyID0gRkFMU0U7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICJIU0NvdW50ZXI9JWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLmJFbmFibGVIU0NvdW50ZXIpOworCQkJCQl9Ki8KKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJCQlIVFBhcmFtZXRlcnNIb29rKHBBZCwgdG1wYnVmLCBidWZmZXIpOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisKKyNpZmRlZiBDQVJSSUVSX0RFVEVDVElPTl9TVVBQT1JUCisJCQkJCQkvL0NhcnJpZXJEZXRlY3QKKwkJCQkJCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkNhcnJpZXJEZXRlY3QiLCB0bXBidWYsIDEyOCwgYnVmZmVyKSkKKwkJCQkJCXsKKwkJCQkJCQlpZiAoKHN0cm5jbXAodG1wYnVmLCAiMCIsIDEpID09IDApKQorCQkJCQkJCQlwQWQtPkNvbW1vbkNmZy5DYXJyaWVyRGV0ZWN0LkVuYWJsZSA9IEZBTFNFOworCQkJCQkJCWVsc2UgaWYgKChzdHJuY21wKHRtcGJ1ZiwgIjEiLCAxKSA9PSAwKSkKKwkJCQkJCQkJcEFkLT5Db21tb25DZmcuQ2FycmllckRldGVjdC5FbmFibGUgPSBUUlVFOworCQkJCQkJCWVsc2UKKwkJCQkJCQkJcEFkLT5Db21tb25DZmcuQ2FycmllckRldGVjdC5FbmFibGUgPSBGQUxTRTsKKworCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNhcnJpZXJEZXRlY3QuRW5hYmxlPSVkXG4iLCBwQWQtPkNvbW1vbkNmZy5DYXJyaWVyRGV0ZWN0LkVuYWJsZSkpOworCQkJCQkJfQorCQkJCQkJZWxzZQorCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLkNhcnJpZXJEZXRlY3QuRW5hYmxlID0gRkFMU0U7CisjZW5kaWYgLy8gQ0FSUklFUl9ERVRFQ1RJT05fU1VQUE9SVCAvLworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCQkJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCQkJCXsKKwkJCQkJCS8vUFNNb2RlCisJCQkJCQlpZiAoUlRNUEdldEtleVBhcmFtZXRlcigiUFNNb2RlIiwgdG1wYnVmLCAxMCwgYnVmZmVyKSkKKwkJCQkJCXsKKwkJCQkJCQlpZiAocEFkLT5TdGFDZmcuQnNzVHlwZSA9PSBCU1NfSU5GUkEpCisJCQkJCQkJeworCQkJCQkJCQlpZiAoKHN0cmNtcCh0bXBidWYsICJNQVhfUFNQIikgPT0gMCkgfHwgKHN0cmNtcCh0bXBidWYsICJtYXhfcHNwIikgPT0gMCkpCisJCQkJCQkJCXsKKwkJCQkJCQkJCS8vIGRvIE5PVCB0dXJuIG9uIFBTTSBiaXQgaGVyZSwgd2FpdCB1bnRpbCBNbG1lQ2hlY2tGb3JQc21DaGFuZ2UoKQorCQkJCQkJCQkJLy8gdG8gZXhjbHVkZSBjZXJ0YWluIHNpdHVhdGlvbnMuCisJCQkJCQkJCQkvLwkgICBNbG1lU2V0UHNtKHBBZCwgUFdSX1NBVkUpOworCQkJCQkJCQkJT1BTVEFUVVNfU0VUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1JFQ0VJVkVfRFRJTSk7CisJCQkJCQkJCQlpZiAocEFkLT5TdGFDZmcuYldpbmRvd3NBQ0NBTUVuYWJsZSA9PSBGQUxTRSkKKwkJCQkJCQkJCQlwQWQtPlN0YUNmZy5XaW5kb3dzUG93ZXJNb2RlID0gTmRpczgwMl8xMVBvd2VyTW9kZU1BWF9QU1A7CisJCQkJCQkJCQlwQWQtPlN0YUNmZy5XaW5kb3dzQmF0dGVyeVBvd2VyTW9kZSA9IE5kaXM4MDJfMTFQb3dlck1vZGVNQVhfUFNQOworCQkJCQkJCQkJcEFkLT5TdGFDZmcuRGVmYXVsdExpc3RlbkNvdW50ID0gNTsKKwkJCQkJCQkJfQorCQkJCQkJCQllbHNlIGlmICgoc3RyY21wKHRtcGJ1ZiwgIkZhc3RfUFNQIikgPT0gMCkgfHwgKHN0cmNtcCh0bXBidWYsICJmYXN0X3BzcCIpID09IDApCisJCQkJCQkJCQl8fCAoc3RyY21wKHRtcGJ1ZiwgIkZBU1RfUFNQIikgPT0gMCkpCisJCQkJCQkJCXsKKwkJCQkJCQkJCS8vIGRvIE5PVCB0dXJuIG9uIFBTTSBiaXQgaGVyZSwgd2FpdCB1bnRpbCBNbG1lQ2hlY2tGb3JQc21DaGFuZ2UoKQorCQkJCQkJCQkJLy8gdG8gZXhjbHVkZSBjZXJ0YWluIHNpdHVhdGlvbnMuCisJCQkJCQkJCQkvLwkgICBNbG1lU2V0UHNtQml0KHBBZCwgUFdSX1NBVkUpOworCQkJCQkJCQkJT1BTVEFUVVNfU0VUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1JFQ0VJVkVfRFRJTSk7CisJCQkJCQkJCQlpZiAocEFkLT5TdGFDZmcuYldpbmRvd3NBQ0NBTUVuYWJsZSA9PSBGQUxTRSkKKwkJCQkJCQkJCQlwQWQtPlN0YUNmZy5XaW5kb3dzUG93ZXJNb2RlID0gTmRpczgwMl8xMVBvd2VyTW9kZUZhc3RfUFNQOworCQkJCQkJCQkJcEFkLT5TdGFDZmcuV2luZG93c0JhdHRlcnlQb3dlck1vZGUgPSBOZGlzODAyXzExUG93ZXJNb2RlRmFzdF9QU1A7CisJCQkJCQkJCQlwQWQtPlN0YUNmZy5EZWZhdWx0TGlzdGVuQ291bnQgPSAzOworCQkJCQkJCQl9CisJCQkJCQkJCWVsc2UgaWYgKChzdHJjbXAodG1wYnVmLCAiTGVnYWN5X1BTUCIpID09IDApIHx8IChzdHJjbXAodG1wYnVmLCAibGVnYWN5X3BzcCIpID09IDApCisJCQkJCQkJCQl8fCAoc3RyY21wKHRtcGJ1ZiwgIkxFR0FDWV9QU1AiKSA9PSAwKSkKKwkJCQkJCQkJeworCQkJCQkJCQkJLy8gZG8gTk9UIHR1cm4gb24gUFNNIGJpdCBoZXJlLCB3YWl0IHVudGlsIE1sbWVDaGVja0ZvclBzbUNoYW5nZSgpCisJCQkJCQkJCQkvLyB0byBleGNsdWRlIGNlcnRhaW4gc2l0dWF0aW9ucy4KKwkJCQkJCQkJCS8vCSAgIE1sbWVTZXRQc21CaXQocEFkLCBQV1JfU0FWRSk7CisJCQkJCQkJCQlPUFNUQVRVU19TRVRfRkxBRyhwQWQsIGZPUF9TVEFUVVNfUkVDRUlWRV9EVElNKTsKKwkJCQkJCQkJCWlmIChwQWQtPlN0YUNmZy5iV2luZG93c0FDQ0FNRW5hYmxlID09IEZBTFNFKQorCQkJCQkJCQkJCXBBZC0+U3RhQ2ZnLldpbmRvd3NQb3dlck1vZGUgPSBOZGlzODAyXzExUG93ZXJNb2RlTGVnYWN5X1BTUDsKKwkJCQkJCQkJCXBBZC0+U3RhQ2ZnLldpbmRvd3NCYXR0ZXJ5UG93ZXJNb2RlID0gTmRpczgwMl8xMVBvd2VyTW9kZUxlZ2FjeV9QU1A7CisJCQkJCQkJCQlwQWQtPlN0YUNmZy5EZWZhdWx0TGlzdGVuQ291bnQgPSAzOworCQkJCQkJCQl9CisJCQkJCQkJCWVsc2UKKwkJCQkJCQkJeyAvL0RlZmF1bHQgTmRpczgwMl8xMVBvd2VyTW9kZUNBTQorCQkJCQkJCQkJLy8gY2xlYXIgUFNNIGJpdCBpbW1lZGlhdGVseQorCQkJCQkJCQkJTWxtZVNldFBzbUJpdChwQWQsIFBXUl9BQ1RJVkUpOworCQkJCQkJCQkJT1BTVEFUVVNfU0VUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1JFQ0VJVkVfRFRJTSk7CisJCQkJCQkJCQlpZiAocEFkLT5TdGFDZmcuYldpbmRvd3NBQ0NBTUVuYWJsZSA9PSBGQUxTRSkKKwkJCQkJCQkJCQlwQWQtPlN0YUNmZy5XaW5kb3dzUG93ZXJNb2RlID0gTmRpczgwMl8xMVBvd2VyTW9kZUNBTTsKKwkJCQkJCQkJCXBBZC0+U3RhQ2ZnLldpbmRvd3NCYXR0ZXJ5UG93ZXJNb2RlID0gTmRpczgwMl8xMVBvd2VyTW9kZUNBTTsKKwkJCQkJCQkJfQorCQkJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQU01vZGU9JWxkXG4iLCBwQWQtPlN0YUNmZy5XaW5kb3dzUG93ZXJNb2RlKSk7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQkJLy8gRmFzdFJvYW1pbmcKKwkJCQkJCWlmIChSVE1QR2V0S2V5UGFyYW1ldGVyKCJGYXN0Um9hbWluZyIsIHRtcGJ1ZiwgMzIsIGJ1ZmZlcikpCisJCQkJCQl7CisJCQkJCQkJaWYgKHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCkgPT0gMCkKKwkJCQkJCQkJcEFkLT5TdGFDZmcuYkZhc3RSb2FtaW5nID0gRkFMU0U7CisJCQkJCQkJZWxzZQorCQkJCQkJCQlwQWQtPlN0YUNmZy5iRmFzdFJvYW1pbmcgPSBUUlVFOworCisJCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiRmFzdFJvYW1pbmc9JWRcbiIsIHBBZC0+U3RhQ2ZnLmJGYXN0Um9hbWluZykpOworCQkJCQkJfQorCQkJCQkJLy8gUm9hbVRocmVzaG9sZAorCQkJCQkJaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIlJvYW1UaHJlc2hvbGQiLCB0bXBidWYsIDMyLCBidWZmZXIpKQorCQkJCQkJeworCQkJCQkJCWxvbmcgbEluZm8gPSBzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApOworCisJCQkJCQkJaWYgKGxJbmZvID4gOTAgfHwgbEluZm8gPCA2MCkKKwkJCQkJCQkJcEFkLT5TdGFDZmcuZEJtVG9Sb2FtID0gLTcwOworCQkJCQkJCWVsc2UKKwkJCQkJCQkJcEFkLT5TdGFDZmcuZEJtVG9Sb2FtID0gKENIQVIpKC0xKSpsSW5mbzsKKworCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJvYW1UaHJlc2hvbGQ9JWQgIGRCbVxuIiwgcEFkLT5TdGFDZmcuZEJtVG9Sb2FtKSk7CisJCQkJCQl9CisKKwkJCQkJCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIlRHbldpZmlUZXN0IiwgdG1wYnVmLCAxMCwgYnVmZmVyKSkKKwkJCQkJCXsKKwkJCQkJCQlpZihzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApID09IDApCisJCQkJCQkJCXBBZC0+U3RhQ2ZnLmJUR25XaWZpVGVzdCA9IEZBTFNFOworCQkJCQkJCWVsc2UKKwkJCQkJCQkJcEFkLT5TdGFDZmcuYlRHbldpZmlUZXN0ID0gVFJVRTsKKwkJCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiVEduV2lmaVRlc3Q9JWRcbiIsIHBBZC0+U3RhQ2ZnLmJUR25XaWZpVGVzdCkpOworCQkJCQkJfQorCQkJCQl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKworCisJCQkJfQorCQkJfQorCQkJZWxzZQorCQkJeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPiAlcyBkb2VzIG5vdCBoYXZlIGEgd3JpdGUgbWV0aG9kXG4iLCBzcmMpKTsKKwkJCX0KKworCQkJcmV0dmFsPWZpbHBfY2xvc2Uoc3JjZixOVUxMKTsKKworCQkJaWYgKHJldHZhbCkKKwkJCXsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLT4gRXJyb3IgJWQgY2xvc2luZyAlc1xuIiwgLXJldHZhbCwgc3JjKSk7CisJCQl9CisJCX0KKwl9CisKKwlzZXRfZnMob3JnZnMpOworI2lmIDAKKwljdXJyZW50LT5mc3VpZCA9IG9yZ2ZzdWlkOworCWN1cnJlbnQtPmZzZ2lkID0gb3JnZnNnaWQ7CisjZW5kaWYKKworCWtmcmVlKGJ1ZmZlcik7CisJa2ZyZWUodG1wYnVmKTsKKworCXJldHVybiAoTkRJU19TVEFUVVNfU1VDQ0VTUyk7Cit9CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKK3N0YXRpYyB2b2lkCUhUUGFyYW1ldGVyc0hvb2soCisJSU4JUFJUTVBfQURBUFRFUiBwQWQsCisJSU4JQ0hBUgkJICAqcFZhbHVlU3RyLAorCUlOCUNIQVIJCSAgKnBJbnB1dCkKK3sKKworCUlOVCBWYWx1ZTsKKworICAgIGlmIChSVE1QR2V0S2V5UGFyYW1ldGVyKCJIVF9QUk9URUNUIiwgcFZhbHVlU3RyLCAyNSwgcElucHV0KSkKKyAgICB7CisgICAgICAgIFZhbHVlID0gc2ltcGxlX3N0cnRvbChwVmFsdWVTdHIsIDAsIDEwKTsKKyAgICAgICAgaWYgKFZhbHVlID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLmJIVFByb3RlY3QgPSBGQUxTRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLmJIVFByb3RlY3QgPSBUUlVFOworICAgICAgICB9CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkhUOiBQcm90ZWN0aW9uICA9ICVzXG4iLCAoVmFsdWU9PTApID8gIkRpc2FibGUiIDogIkVuYWJsZSIpKTsKKyAgICB9CisKKyAgICBpZiAoUlRNUEdldEtleVBhcmFtZXRlcigiSFRfTUlNT1BTRW5hYmxlIiwgcFZhbHVlU3RyLCAyNSwgcElucHV0KSkKKyAgICB7CisgICAgICAgIFZhbHVlID0gc2ltcGxlX3N0cnRvbChwVmFsdWVTdHIsIDAsIDEwKTsKKyAgICAgICAgaWYgKFZhbHVlID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLmJNSU1PUFNFbmFibGUgPSBGQUxTRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLmJNSU1PUFNFbmFibGUgPSBUUlVFOworICAgICAgICB9CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkhUOiBNSU1PUFNFbmFibGUgID0gJXNcbiIsIChWYWx1ZT09MCkgPyAiRGlzYWJsZSIgOiAiRW5hYmxlIikpOworICAgIH0KKworCisgICAgaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkhUX01JTU9QU01vZGUiLCBwVmFsdWVTdHIsIDI1LCBwSW5wdXQpKQorICAgIHsKKyAgICAgICAgVmFsdWUgPSBzaW1wbGVfc3RydG9sKHBWYWx1ZVN0ciwgMCwgMTApOworICAgICAgICBpZiAoVmFsdWUgPiBNTVBTX0VOQUJMRSkKKyAgICAgICAgeworCQkJcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1NUFNtb2RlID0gTU1QU19FTkFCTEU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvL1RPRE86IGFkZCBtaW1vIHBvd2VyIHNhdmluZyBtZWNoYW5pc20KKyAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5NTVBTbW9kZSA9IE1NUFNfRU5BQkxFOworCQkJLy9wQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTU1QU21vZGUgPSBWYWx1ZTsKKyAgICAgICAgfQorICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJIVDogTUlNT1BTIE1vZGUgID0gJWRcbiIsIFZhbHVlKSk7CisgICAgfQorCisgICAgaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkhUX0JBRGVjbGluZSIsIHBWYWx1ZVN0ciwgMjUsIHBJbnB1dCkpCisgICAgeworICAgICAgICBWYWx1ZSA9IHNpbXBsZV9zdHJ0b2wocFZhbHVlU3RyLCAwLCAxMCk7CisgICAgICAgIGlmIChWYWx1ZSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5iQkFEZWNsaW5lID0gRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5iQkFEZWNsaW5lID0gVFJVRTsKKyAgICAgICAgfQorICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJIVDogQkEgRGVjbGluZSAgPSAlc1xuIiwgKFZhbHVlPT0wKSA/ICJEaXNhYmxlIiA6ICJFbmFibGUiKSk7CisgICAgfQorCisKKyAgICBpZiAoUlRNUEdldEtleVBhcmFtZXRlcigiSFRfRGlzYWJsZVJlb3JkZXJpbmciLCBwVmFsdWVTdHIsIDI1LCBwSW5wdXQpKQorICAgIHsKKyAgICAgICAgVmFsdWUgPSBzaW1wbGVfc3RydG9sKHBWYWx1ZVN0ciwgMCwgMTApOworICAgICAgICBpZiAoVmFsdWUgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuYkRpc2FibGVSZW9yZGVyaW5nID0gRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5iRGlzYWJsZVJlb3JkZXJpbmcgPSBUUlVFOworICAgICAgICB9CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkhUOiBEaXNhYmxlUmVvcmRlcmluZyAgPSAlc1xuIiwgKFZhbHVlPT0wKSA/ICJEaXNhYmxlIiA6ICJFbmFibGUiKSk7CisgICAgfQorCisgICAgaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkhUX0F1dG9CQSIsIHBWYWx1ZVN0ciwgMjUsIHBJbnB1dCkpCisgICAgeworICAgICAgICBWYWx1ZSA9IHNpbXBsZV9zdHJ0b2wocFZhbHVlU3RyLCAwLCAxMCk7CisgICAgICAgIGlmIChWYWx1ZSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQXV0b0JBID0gRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQXV0b0JBID0gVFJVRTsKKyAgICAgICAgfQorICAgICAgICBwQWQtPkNvbW1vbkNmZy5SRUdCQUNhcGFiaWxpdHkuZmllbGQuQXV0b0JBID0gcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkF1dG9CQTsKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSFQ6IEF1dG8gQkEgID0gJXNcbiIsIChWYWx1ZT09MCkgPyAiRGlzYWJsZSIgOiAiRW5hYmxlIikpOworICAgIH0KKworCS8vIFR4XytIVEMgZnJhbWUKKyAgICBpZiAoUlRNUEdldEtleVBhcmFtZXRlcigiSFRfSFRDIiwgcFZhbHVlU3RyLCAyNSwgcElucHV0KSkKKwl7CisJCVZhbHVlID0gc2ltcGxlX3N0cnRvbChwVmFsdWVTdHIsIDAsIDEwKTsKKwkJaWYgKFZhbHVlID09IDApCisJCXsKKwkJCXBBZC0+SFRDRW5hYmxlID0gRkFMU0U7CisJCX0KKwkJZWxzZQorCQl7CisgICAgICAgICAgICAJCXBBZC0+SFRDRW5hYmxlID0gVFJVRTsKKwkJfQorCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJIVDogVHggK0hUQyBmcmFtZSA9ICVzXG4iLCAoVmFsdWU9PTApID8gIkRpc2FibGUiIDogIkVuYWJsZSIpKTsKKwl9CisKKwkvLyBFbmFibGUgSFQgTGluayBBZGFwdGF0aW9uIENvbnRyb2wKKwlpZiAoUlRNUEdldEtleVBhcmFtZXRlcigiSFRfTGlua0FkYXB0IiwgcFZhbHVlU3RyLCAyNSwgcElucHV0KSkKKwl7CisJCVZhbHVlID0gc2ltcGxlX3N0cnRvbChwVmFsdWVTdHIsIDAsIDEwKTsKKwkJaWYgKFZhbHVlID09IDApCisJCXsKKwkJCXBBZC0+YkxpbmtBZGFwdCA9IEZBTFNFOworCQl9CisJCWVsc2UKKwkJeworCQkJcEFkLT5IVENFbmFibGUgPSBUUlVFOworCQkJcEFkLT5iTGlua0FkYXB0ID0gVFJVRTsKKwkJfQorCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJIVDogTGluayBBZGFwdGF0aW9uIENvbnRyb2wgPSAlc1xuIiwgKFZhbHVlPT0wKSA/ICJEaXNhYmxlIiA6ICJFbmFibGUoK0hUQykiKSk7CisJfQorCisJLy8gUmV2ZXJzZSBEaXJlY3Rpb24gTWVjaGFuaXNtCisgICAgaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkhUX1JERyIsIHBWYWx1ZVN0ciwgMjUsIHBJbnB1dCkpCisJeworCQlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2wocFZhbHVlU3RyLCAwLCAxMCk7CisJCWlmIChWYWx1ZSA9PSAwKQorCQl7CisJCQlwQWQtPkNvbW1vbkNmZy5iUmRnID0gRkFMU0U7CisJCX0KKwkJZWxzZQorCQl7CisJCQlwQWQtPkhUQ0VuYWJsZSA9IFRSVUU7CisgICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5iUmRnID0gVFJVRTsKKwkJfQorCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJIVDogUkRHID0gJXNcbiIsIChWYWx1ZT09MCkgPyAiRGlzYWJsZSIgOiAiRW5hYmxlKCtIVEMpIikpOworCX0KKworCisKKworCS8vIFR4IEEtTVNVRCA/CisgICAgaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkhUX0FNU0RVIiwgcFZhbHVlU3RyLCAyNSwgcElucHV0KSkKKwl7CisJCVZhbHVlID0gc2ltcGxlX3N0cnRvbChwVmFsdWVTdHIsIDAsIDEwKTsKKwkJaWYgKFZhbHVlID09IDApCisJCXsKKwkJCXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BbXNkdUVuYWJsZSA9IEZBTFNFOworCQl9CisJCWVsc2UKKwkJeworICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkFtc2R1RW5hYmxlID0gVFJVRTsKKwkJfQorCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJIVDogVHggQS1NU0RVID0gJXNcbiIsIChWYWx1ZT09MCkgPyAiRGlzYWJsZSIgOiAiRW5hYmxlIikpOworCX0KKworCS8vIE1QRFUgRGVuc2l0eQorICAgIGlmIChSVE1QR2V0S2V5UGFyYW1ldGVyKCJIVF9NcGR1RGVuc2l0eSIsIHBWYWx1ZVN0ciwgMjUsIHBJbnB1dCkpCisJeworCQlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2wocFZhbHVlU3RyLCAwLCAxMCk7CisJCWlmIChWYWx1ZSA8PTcgJiYgVmFsdWUgPj0gMCkKKwkJeworCQkJcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1wZHVEZW5zaXR5ID0gVmFsdWU7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJIVDogTVBEVSBEZW5zaXR5ID0gJWRcbiIsIFZhbHVlKSk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTXBkdURlbnNpdHkgPSA0OworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSFQ6IE1QRFUgRGVuc2l0eSA9ICVkIChEZWZhdWx0KVxuIiwgNCkpOworCQl9CisJfQorCisJLy8gTWF4IFJ4IEJBIFdpbmRvdyBTaXplCisgICAgaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkhUX0JBV2luU2l6ZSIsIHBWYWx1ZVN0ciwgMjUsIHBJbnB1dCkpCisJeworCQlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2wocFZhbHVlU3RyLCAwLCAxMCk7CisKKwkJaWYgKFZhbHVlID49MSAmJiBWYWx1ZSA8PSA2NCkKKwkJeworCQkJcEFkLT5Db21tb25DZmcuUkVHQkFDYXBhYmlsaXR5LmZpZWxkLlJ4QkFXaW5MaW1pdCA9IFZhbHVlOworCQkJcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlJ4QkFXaW5MaW1pdCA9IFZhbHVlOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSFQ6IEJBIFdpbmR3IFNpemUgPSAlZFxuIiwgVmFsdWUpKTsKKwkJfQorCQllbHNlCisJCXsKKyAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLlJFR0JBQ2FwYWJpbGl0eS5maWVsZC5SeEJBV2luTGltaXQgPSA2NDsKKwkJCXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5SeEJBV2luTGltaXQgPSA2NDsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkhUOiBCQSBXaW5kdyBTaXplID0gNjQgKERlZnVhbHQpXG4iKSk7CisJCX0KKworCX0KKworCS8vIEd1YXJkIEludGVydmFsCisJaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkhUX0dJIiwgcFZhbHVlU3RyLCAyNSwgcElucHV0KSkKKwl7CisJCVZhbHVlID0gc2ltcGxlX3N0cnRvbChwVmFsdWVTdHIsIDAsIDEwKTsKKworCQlpZiAoVmFsdWUgPT0gR0lfNDAwKQorCQl7CisJCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuU2hvcnRHSSA9IEdJXzQwMDsKKwkJfQorCQllbHNlCisJCXsKKwkJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5TaG9ydEdJID0gR0lfODAwOworCQl9CisKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSFQ6IEd1YXJkIEludGVydmFsID0gJXNcbiIsIChWYWx1ZT09R0lfNDAwKSA/ICI0MDAiIDogIjgwMCIgKSk7CisJfQorCisJLy8gSFQgT3BlcmF0aW9uIE1vZGUgOiBNaXhlZCBNb2RlICwgR3JlZW4gRmllbGQKKwlpZiAoUlRNUEdldEtleVBhcmFtZXRlcigiSFRfT3BNb2RlIiwgcFZhbHVlU3RyLCAyNSwgcElucHV0KSkKKwl7CisJCVZhbHVlID0gc2ltcGxlX3N0cnRvbChwVmFsdWVTdHIsIDAsIDEwKTsKKworCQlpZiAoVmFsdWUgPT0gSFRNT0RFX0dGKQorCQl7CisKKwkJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5IVE1PREUgID0gSFRNT0RFX0dGOworCQl9CisJCWVsc2UKKwkJeworCQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkhUTU9ERSAgPSBIVE1PREVfTU07CisJCX0KKworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJIVDogT3BlcmF0ZSBNb2RlID0gJXNcbiIsIChWYWx1ZT09SFRNT0RFX0dGKSA/ICJHcmVlbiBGaWVsZCIgOiAiTWl4ZWQgTW9kZSIgKSk7CisJfQorCisJLy8gRml4ZWQgVHggbW9kZSA6IENDSywgT0ZETQorCWlmIChSVE1QR2V0S2V5UGFyYW1ldGVyKCJGaXhlZFR4TW9kZSIsIHBWYWx1ZVN0ciwgMjUsIHBJbnB1dCkpCisJeworCQlVQ0hBUglmaXhfdHhfbW9kZTsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQl7CisJCQlmaXhfdHhfbW9kZSA9IEZJWEVEX1RYTU9ERV9IVDsKKworCQkJaWYgKHN0cmNtcChwVmFsdWVTdHIsICJPRkRNIikgPT0gMCB8fCBzdHJjbXAocFZhbHVlU3RyLCAib2ZkbSIpID09IDApCisJCQl7CisJCQkJZml4X3R4X21vZGUgPSBGSVhFRF9UWE1PREVfT0ZETTsKKwkJCX0KKwkJCWVsc2UgaWYgKHN0cmNtcChwVmFsdWVTdHIsICJDQ0siKSA9PSAwIHx8IHN0cmNtcChwVmFsdWVTdHIsICJjY2siKSA9PSAwKQorCQkJeworCQkgICAgICAgIGZpeF90eF9tb2RlID0gRklYRURfVFhNT0RFX0NDSzsKKwkJCX0KKwkJCWVsc2UgaWYgKHN0cmNtcChwVmFsdWVTdHIsICJIVCIpID09IDAgfHwgc3RyY21wKHBWYWx1ZVN0ciwgImh0IikgPT0gMCkKKwkJCXsKKwkJICAgICAgICBmaXhfdHhfbW9kZSA9IEZJWEVEX1RYTU9ERV9IVDsKKwkJfQorCQllbHNlCisJCXsKKwkJCQlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2wocFZhbHVlU3RyLCAwLCAxMCk7CisJCQkJLy8gMSA6IENDSworCQkJCS8vIDIgOiBPRkRNCisJCQkJLy8gb3RoZXJ3aXNlIDogSFQKKwkJCQlpZiAoVmFsdWUgPT0gRklYRURfVFhNT0RFX0NDSyB8fCBWYWx1ZSA9PSBGSVhFRF9UWE1PREVfT0ZETSkKKwkJCQkJZml4X3R4X21vZGUgPSBWYWx1ZTsKKwkJCQllbHNlCisJCQkJCWZpeF90eF9tb2RlID0gRklYRURfVFhNT0RFX0hUOworCQl9CisKKwkJCXBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuRml4ZWRUeE1vZGUgPSBmaXhfdHhfbW9kZTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkZpeGVkIFR4IE1vZGUgPSAlZFxuIiwgZml4X3R4X21vZGUpKTsKKworCQl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJfQorCisKKwkvLyBDaGFubmVsIFdpZHRoCisJaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkhUX0JXIiwgcFZhbHVlU3RyLCAyNSwgcElucHV0KSkKKwl7CisJCVZhbHVlID0gc2ltcGxlX3N0cnRvbChwVmFsdWVTdHIsIDAsIDEwKTsKKworCQlpZiAoVmFsdWUgPT0gQldfNDApCisJCXsKKwkJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5CVyAgPSBCV180MDsKKwkJfQorCQllbHNlCisJCXsKKyAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5CVyAgPSBCV18yMDsKKwkJfQorCisjaWZkZWYgTUNBU1RfUkFURV9TUEVDSUZJQworCQlwQWQtPkNvbW1vbkNmZy5NQ2FzdFBoeU1vZGUuZmllbGQuQlcgPSBwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlc7CisjZW5kaWYgLy8gTUNBU1RfUkFURV9TUEVDSUZJQyAvLworCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkhUOiBDaGFubmVsIFdpZHRoID0gJXNcbiIsIChWYWx1ZT09QldfNDApID8gIjQwIE1IeiIgOiAiMjAgTUh6IiApKTsKKwl9CisKKwlpZiAoUlRNUEdldEtleVBhcmFtZXRlcigiSFRfRVhUQ0hBIiwgcFZhbHVlU3RyLCAyNSwgcElucHV0KSkKKwl7CisJCVZhbHVlID0gc2ltcGxlX3N0cnRvbChwVmFsdWVTdHIsIDAsIDEwKTsKKworCQlpZiAoVmFsdWUgPT0gMCkKKwkJeworCisJCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuRVhUQ0hBICA9IEVYVENIQV9CRUxPVzsKKwkJfQorCQllbHNlCisJCXsKKyAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5FWFRDSEEgPSBFWFRDSEFfQUJPVkU7CisJCX0KKworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJIVDogRXh0IENoYW5uZWwgPSAlc1xuIiwgKFZhbHVlPT0wKSA/ICJCRUxPVyIgOiAiQUJPVkUiICkpOworCX0KKworCS8vIE1TQworCWlmIChSVE1QR2V0S2V5UGFyYW1ldGVyKCJIVF9NQ1MiLCBwVmFsdWVTdHIsIDUwLCBwSW5wdXQpKQorCXsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQl7CisJCQlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2wocFZhbHVlU3RyLCAwLCAxMCk7CisKKy8vCQkJaWYgKChWYWx1ZSA+PSAwICYmIFZhbHVlIDw9IDE1KSB8fCAoVmFsdWUgPT0gMzIpKQorCQkJaWYgKChWYWx1ZSA+PSAwICYmIFZhbHVlIDw9IDIzKSB8fCAoVmFsdWUgPT0gMzIpKSAvLyAzKjMKKwkJeworCQkJCXBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTICA9IFZhbHVlOworCQkJCXBBZC0+U3RhQ2ZnLmJBdXRvVHhSYXRlU3dpdGNoID0gRkFMU0U7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSFQ6IE1DUyA9ICVkXG4iLCBwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUykpOworCQl9CisJCWVsc2UKKwkJeworCQkJCXBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTICA9IE1DU19BVVRPOworCQkJCXBBZC0+U3RhQ2ZnLmJBdXRvVHhSYXRlU3dpdGNoID0gVFJVRTsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJIVDogTUNTID0gQVVUT1xuIikpOworCQl9CisJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCX0KKworCS8vIFNUQkMKKyAgICBpZiAoUlRNUEdldEtleVBhcmFtZXRlcigiSFRfU1RCQyIsIHBWYWx1ZVN0ciwgMjUsIHBJbnB1dCkpCisJeworCQlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2wocFZhbHVlU3RyLCAwLCAxMCk7CisJCWlmIChWYWx1ZSA9PSBTVEJDX1VTRSkKKwkJeworCQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLlNUQkMgPSBTVEJDX1VTRTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5TVEJDID0gU1RCQ19OT05FOworCQl9CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkhUOiBTVEJDID0gJWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5TVEJDKSk7CisJfQorCisJLy8gNDBfTWh6X0ludG9sZXJhbnQKKwlpZiAoUlRNUEdldEtleVBhcmFtZXRlcigiSFRfNDBNSFpfSU5UT0xFUkFOVCIsIHBWYWx1ZVN0ciwgMjUsIHBJbnB1dCkpCisJeworCQlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2wocFZhbHVlU3RyLCAwLCAxMCk7CisJCWlmIChWYWx1ZSA9PSAwKQorCQl7CisJCQlwQWQtPkNvbW1vbkNmZy5iRm9ydHlfTWh6X0ludG9sZXJhbnQgPSBGQUxTRTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXBBZC0+Q29tbW9uQ2ZnLmJGb3J0eV9NaHpfSW50b2xlcmFudCA9IFRSVUU7CisJCX0KKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSFQ6IDQwTUhaIElOVE9MRVJBTlQgPSAlZFxuIiwgcEFkLT5Db21tb25DZmcuYkZvcnR5X01oel9JbnRvbGVyYW50KSk7CisJfQorCS8vSFRfVHhTdHJlYW0KKwlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJIVF9UeFN0cmVhbSIsIHBWYWx1ZVN0ciwgMTAsIHBJbnB1dCkpCisJeworCQlzd2l0Y2ggKHNpbXBsZV9zdHJ0b2wocFZhbHVlU3RyLCAwLCAxMCkpCisJCXsKKwkJCWNhc2UgMToKKwkJCQlwQWQtPkNvbW1vbkNmZy5UeFN0cmVhbSA9IDE7CisJCQkJYnJlYWs7CisJCQljYXNlIDI6CisJCQkJcEFkLT5Db21tb25DZmcuVHhTdHJlYW0gPSAyOworCQkJCWJyZWFrOworCQkJY2FzZSAzOiAvLyAzKjMKKwkJCWRlZmF1bHQ6CisJCQkJcEFkLT5Db21tb25DZmcuVHhTdHJlYW0gPSAzOworCisJCQkJaWYgKHBBZC0+TUFDVmVyc2lvbiA8IFJBTElOS18yODgzX1ZFUlNJT04pCisJCQkJCXBBZC0+Q29tbW9uQ2ZnLlR4U3RyZWFtID0gMjsgLy8gb25seSAyIHR4IHN0cmVhbXMgZm9yIFJUMjg2MCBzZXJpZXMKKwkJCQlicmVhazsKKwkJfQorCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJIVDogVHggU3RyZWFtID0gJWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLlR4U3RyZWFtKSk7CisJfQorCS8vSFRfUnhTdHJlYW0KKwlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJIVF9SeFN0cmVhbSIsIHBWYWx1ZVN0ciwgMTAsIHBJbnB1dCkpCisJeworCQlzd2l0Y2ggKHNpbXBsZV9zdHJ0b2wocFZhbHVlU3RyLCAwLCAxMCkpCisJCXsKKwkJCWNhc2UgMToKKwkJCQlwQWQtPkNvbW1vbkNmZy5SeFN0cmVhbSA9IDE7CisJCQkJYnJlYWs7CisJCQljYXNlIDI6CisJCQkJcEFkLT5Db21tb25DZmcuUnhTdHJlYW0gPSAyOworCQkJCWJyZWFrOworCQkJY2FzZSAzOgorCQkJZGVmYXVsdDoKKwkJCQlwQWQtPkNvbW1vbkNmZy5SeFN0cmVhbSA9IDM7CisKKwkJCQlpZiAocEFkLT5NQUNWZXJzaW9uIDwgUkFMSU5LXzI4ODNfVkVSU0lPTikKKwkJCQkJcEFkLT5Db21tb25DZmcuUnhTdHJlYW0gPSAyOyAvLyBvbmx5IDIgcnggc3RyZWFtcyBmb3IgUlQyODYwIHNlcmllcworCQkJCWJyZWFrOworCQl9CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkhUOiBSeCBTdHJlYW0gPSAlZFxuIiwgcEFkLT5Db21tb25DZmcuUnhTdHJlYW0pKTsKKwl9CisKK30KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9ydG1wLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3J0bXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMmE0Nzg0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9ydG1wLmgKQEAgLTAsMCArMSw3NTg2IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgIE1vZHVsZSBOYW1lOgorICAgIHJ0bXAuaAorCisgICAgQWJzdHJhY3Q6CisgICAgTWluaXBvcnQgZ2VuZXJpYyBwb3J0aW9uIGhlYWRlciBmaWxlCisKKyAgICBSZXZpc2lvbiBIaXN0b3J5OgorICAgIFdobyAgICAgICAgIFdoZW4gICAgICAgICAgV2hhdAorICAgIC0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFBhdWwgTGluICAgIDIwMDItMDgtMDEgICAgY3JlYXRlZAorICAgIEphbWVzIFRhbiAgIDIwMDItMDktMDYgICAgbW9kaWZpZWQgKFJldmlzZSBOVENSZWdUYWJsZSkKKyAgICBKb2huIENoYW5nICAyMDA0LTA5LTA2ICAgIG1vZGlmaWVkIGZvciBSVDI2MDAKKyovCisjaWZuZGVmIF9fUlRNUF9IX18KKyNkZWZpbmUgX19SVE1QX0hfXworCisjaW5jbHVkZSAibGlua19saXN0LmgiCisjaW5jbHVkZSAic3BlY3RydW1fZGVmLmgiCisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorI2luY2x1ZGUgImFpcm9uZXQuaCIKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworLy8jZGVmaW5lIERCRwkJMQorCisvLyNkZWZpbmUgREJHX0RJQUdOT1NFCQkxCisKKyNpZiBkZWZpbmVkKENPTkZJR19BUF9TVVBQT1JUKSAmJiBkZWZpbmVkKENPTkZJR19TVEFfU1VQUE9SVCkKKyNkZWZpbmUgSUZfREVWX0NPTkZJR19PUE1PREVfT05fQVAoX3BBZCkJaWYoX3BBZC0+T3BNb2RlID09IE9QTU9ERV9BUCkKKyNkZWZpbmUgSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKF9wQWQpCWlmKF9wQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKQorI2Vsc2UKKyNkZWZpbmUgSUZfREVWX0NPTkZJR19PUE1PREVfT05fQVAoX3BBZCkKKyNkZWZpbmUgSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKF9wQWQpCisjZW5kaWYKKworI2RlZmluZSBWSVJUVUFMX0lGX0lOQyhfX3BBZCkgKChfX3BBZCktPlZpcnR1YWxJZkNudCsrKQorI2RlZmluZSBWSVJUVUFMX0lGX0RFQyhfX3BBZCkgKChfX3BBZCktPlZpcnR1YWxJZkNudC0tKQorI2RlZmluZSBWSVJUVUFMX0lGX05VTShfX3BBZCkgKChfX3BBZCktPlZpcnR1YWxJZkNudCkKKworI2lmZGVmIFJUMjg3MAorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gVGhlIFRYX0JVRkZFUiBzdHJ1Y3R1cmUgZm9ybXMgdGhlIHRyYW5zbWl0dGVkIFVTQiBwYWNrZXQgdG8gdGhlIGRldmljZQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwordHlwZWRlZiBzdHJ1Y3QgX19UWF9CVUZGRVJ7CisJdW5pb24JeworCQlVQ0hBUgkJCVdpcmVsZXNzUGFja2V0W1RYX0JVRkZFUl9OT1JNU0laRV07CisJCUhFQURFUl84MDJfMTEJTnVsbEZyYW1lOworCQlQU1BPTExfRlJBTUUJUHNQb2xsUGFja2V0OworCQlSVFNfRlJBTUUJCVJUU0ZyYW1lOworCX1maWVsZDsKKwlVQ0hBUgkJCUFnZ3JlZ2F0aW9uWzRdOyAgLy9CdWZmZXIgZm9yIHNhdmUgQWdncmVnYXRpb24gc2l6ZS4KK30gVFhfQlVGRkVSLCAqUFRYX0JVRkZFUjsKKwordHlwZWRlZiBzdHJ1Y3QgX19IVFRYX0JVRkZFUnsKKwl1bmlvbgl7CisJCVVDSEFSCQkJV2lyZWxlc3NQYWNrZXRbTUFYX1RYQlVMS19TSVpFXTsKKwkJSEVBREVSXzgwMl8xMQlOdWxsRnJhbWU7CisJCVBTUE9MTF9GUkFNRQlQc1BvbGxQYWNrZXQ7CisJCVJUU19GUkFNRQkJUlRTRnJhbWU7CisJfWZpZWxkOworCVVDSEFSCQkJQWdncmVnYXRpb25bNF07ICAvL0J1ZmZlciBmb3Igc2F2ZSBBZ2dyZWdhdGlvbiBzaXplLgorfSBIVFRYX0JVRkZFUiwgKlBIVFRYX0JVRkZFUjsKKworCisvLyB1c2VkIHRvIHRyYWNrIGRyaXZlci1nZW5lcmF0ZWQgd3JpdGUgaXJwcwordHlwZWRlZiBzdHJ1Y3QgX1RYX0NPTlRFWFQKK3sKKwlQVk9JRAkJCXBBZDsJCS8vSW5pdGlhbGl6ZWQgaW4gTWluaXBvcnRJbml0aWFsaXplCisJUFVSQgkJCXBVcmI7CQkJLy9Jbml0aWFsaXplZCBpbiBNaW5pcG9ydEluaXRpYWxpemUKKwlQSVJQCQkJcElycDsJCQkvL3VzZWQgdG8gY2FuY2VsIHBlbmRpbmcgYnVsayBvdXQuCisJCQkJCQkJCQkvL0luaXRpYWxpemVkIGluIE1pbmlwb3J0SW5pdGlhbGl6ZQorCVBUWF9CVUZGRVIJCVRyYW5zZmVyQnVmZmVyOwkvL0luaXRpYWxpemVkIGluIE1pbmlwb3J0SW5pdGlhbGl6ZQorCVVMT05HCQkJQnVsa091dFNpemU7CisJVUNIQVIJCQlCdWxrT3V0UGlwZUlkOworCVVDSEFSCQkJU2VsZklkeDsKKwlCT09MRUFOCQkJSW5Vc2U7CisJQk9PTEVBTgkJCWJXYWl0aW5nQnVsa091dDsgLy8gYXQgbGVhc3Qgb25lIHBhY2tldCBpcyBpbiB0aGlzIFR4Q29udGV4dCwgcmVhZHkgZm9yIG1ha2luZyBJUlAgYW55dGltZS4KKwlCT09MRUFOCQkJYkZ1bGxGb3JCdWxrT3V0OyAvLyBhbGwgdHggYnVmZmVyIGFyZSBmdWxsICwgc28gd2FpdGluZyBmb3IgdHggYnVsa291dC4KKwlCT09MRUFOCQkJSVJQUGVuZGluZzsKKwlCT09MRUFOCQkJTGFzdE9uZTsKKwlCT09MRUFOCQkJYkFnZ3JlZ2F0aWJsZTsKKwlVQ0hBUgkJCUhlYWRlcl84MDJfM1tMRU5HVEhfODAyXzNdOworCVVDSEFSCQkJUnN2WzJdOworCVVMT05HCQkJRGF0YU9mZnNldDsKKwlVSU5UCQkJVHhSYXRlOworCWRtYV9hZGRyX3QJCWRhdGFfZG1hOwkJLy8gdXJiIGRtYSBvbiBsaW51eAorCit9CVRYX0NPTlRFWFQsICpQVFhfQ09OVEVYVCwgKipQUFRYX0NPTlRFWFQ7CisKKworLy8gdXNlZCB0byB0cmFjayBkcml2ZXItZ2VuZXJhdGVkIHdyaXRlIGlycHMKK3R5cGVkZWYgc3RydWN0IF9IVF9UWF9DT05URVhUCit7CisJUFZPSUQJCQlwQWQ7CQkvL0luaXRpYWxpemVkIGluIE1pbmlwb3J0SW5pdGlhbGl6ZQorCVBVUkIJCQlwVXJiOwkJCS8vSW5pdGlhbGl6ZWQgaW4gTWluaXBvcnRJbml0aWFsaXplCisJUElSUAkJCXBJcnA7CQkJLy91c2VkIHRvIGNhbmNlbCBwZW5kaW5nIGJ1bGsgb3V0LgorCQkJCQkJCQkJLy9Jbml0aWFsaXplZCBpbiBNaW5pcG9ydEluaXRpYWxpemUKKwlQSFRUWF9CVUZGRVIJVHJhbnNmZXJCdWZmZXI7CS8vSW5pdGlhbGl6ZWQgaW4gTWluaXBvcnRJbml0aWFsaXplCisJVUxPTkcJCQlCdWxrT3V0U2l6ZTsJLy8gSW5kaWNhdGUgdGhlIHRvdGFsIGJ1bGstb3V0IHNpemUgaW4gYnl0ZXMgaW4gb25lIGJ1bGstdHJhbnNtaXNzaW9uCisJVUNIQVIJCQlCdWxrT3V0UGlwZUlkOworCUJPT0xFQU4JCQlJUlBQZW5kaW5nOworCUJPT0xFQU4JCQlMYXN0T25lOworCUJPT0xFQU4JCQliQ3VyV3JpdGluZzsKKwlCT09MRUFOCQkJYlJpbmdFbXB0eTsKKwlCT09MRUFOCQkJYkNvcHlTYXZlUGFkOworCVVDSEFSCQkJU2F2ZWRQYWRbOF07CisJVUNIQVIJCQlIZWFkZXJfODAyXzNbTEVOR1RIXzgwMl8zXTsKKwlVTE9ORwkJCUN1cldyaXRlUG9zaXRpb247CQkvLyBJbmRpY2F0ZSB0aGUgYnVmZmVyIG9mZnNldCB3aGljaCBwYWNrZXQgd2lsbCBiZSBpbnNlcnRlZCBzdGFydCBmcm9tLgorCVVMT05HCQkJQ3VyV3JpdGVSZWFsUG9zOwkJLy8gSW5kaWNhdGUgdGhlIGJ1ZmZlciBvZmZzZXQgd2hpY2ggcGFja2V0IG5vdyBhcmUgd3JpdGluZyB0by4KKwlVTE9ORwkJCU5leHRCdWxrT3V0UG9zaXRpb247CS8vIEluZGljYXRlIHRoZSBidWZmZXIgc3RhcnQgb2Zmc2V0IG9mIGEgYnVsay10cmFuc21pc3Npb24KKwlVTE9ORwkJCUVOZXh0QnVsa091dFBvc2l0aW9uOwkvLyBJbmRpY2F0ZSB0aGUgYnVmZmVyIGVuZCBvZmZzZXQgb2YgYSBidWxrLXRyYW5zbWlzc2lvbgorCVVJTlQJCQlUeFJhdGU7CisJZG1hX2FkZHJfdAkJZGF0YV9kbWE7CQkvLyB1cmIgZG1hIG9uIGxpbnV4Cit9CUhUX1RYX0NPTlRFWFQsICpQSFRfVFhfQ09OVEVYVCwgKipQUEhUX1RYX0NPTlRFWFQ7CisKKworLy8KKy8vIFN0cnVjdHVyZSB0byBrZWVwIHRyYWNrIG9mIHJlY2VpdmUgcGFja2V0cyBhbmQgYnVmZmVycyB0byBpbmRpY2F0ZQorLy8gcmVjZWl2ZSBkYXRhIHRvIHRoZSBwcm90b2NvbC4KKy8vCit0eXBlZGVmIHN0cnVjdCBfUlhfQ09OVEVYVAoreworCVBVQ0hBUgkJCQlUcmFuc2ZlckJ1ZmZlcjsKKwlQVk9JRAkJCQlwQWQ7CisJUElSUAkJCQlwSXJwOy8vdXNlZCB0byBjYW5jZWwgcGVuZGluZyBidWxrIGluLgorCVBVUkIJCQkJcFVyYjsKKwkvL1RoZXNlIDIgQm9vbGVhbiBzaG91bGRuJ3QgYm90aCBiZSAxIGF0IHRoZSBzYW1lIHRpbWUuCisJVUxPTkcJCQkJQnVsa0luT2Zmc2V0OwkvLyBudW1iZXIgb2YgcGFja2V0cyB3YWl0aW5nIGZvciByZW9yZGVyaW5nIC4KKy8vCUJPT0xFQU4JCQkJUmVvcmRlckluVXNlOwkvLyBBdCBsZWFzdCBvbmUgcGFja2V0IGluIHRoaXMgYnVmZmVyIGFyZSBpbiByZW9yZGVyaW5nIGJ1ZmZlciBhbmQgd2FpdCBmb3IgcmVjZWl2ZSBpbmRpY2F0aW9uCisJQk9PTEVBTgkJCQliUnhIYW5kbGluZzsJLy8gTm90aWZ5IHRoaXMgcGFja2V0IGlzIGJlaW5nIHByb2Nlc3Mgbm93LgorCUJPT0xFQU4JCQkJSW5Vc2U7CQkJLy8gVVNCIEhhcmR3YXJlIE9jY3VwaWVkLiBXYWl0IGZvciBVU0IgSFcgdG8gcHV0IHBhY2tldC4KKwlCT09MRUFOCQkJCVJlYWRhYmxlOwkJLy8gUmVjZWl2ZSBDb21wbGV0ZSBiYWNrLiBPSyBmb3IgZHJpdmVyIHRvIGluZGljYXRlIHJlY2VpdmluZyBwYWNrZXQuCisJQk9PTEVBTgkJCQlJUlBQZW5kaW5nOwkJLy8gVE9ETzogVG8gYmUgcmVtb3ZlZAorCWF0b21pY190CQkJSXJwTG9jazsKKwlORElTX1NQSU5fTE9DSwkJUnhDb250ZXh0TG9jazsKKwlkbWFfYWRkcl90CQkJZGF0YV9kbWE7CQkvLyB1cmIgZG1hIG9uIGxpbnV4Cit9CVJYX0NPTlRFWFQsICpQUlhfQ09OVEVYVDsKKyNlbmRpZiAvLyBSVDI4NzAgLy8KKworCisvLworLy8gIE5ESVMgVmVyc2lvbiBkZWZpbml0aW9ucworLy8KKyNpZmRlZiAgTkRJUzUwX01JTklQT1JUCisjZGVmaW5lIFJUTVBfTkRJU19NQUpPUl9WRVJTSU9OICAgICA1CisjZGVmaW5lIFJUTVBfTkRJU19NSU5PUl9WRVJTSU9OICAgICAwCisjZW5kaWYKKworI2lmZGVmICBORElTNTFfTUlOSVBPUlQKKyNkZWZpbmUgUlRNUF9ORElTX01BSk9SX1ZFUlNJT04gICAgIDUKKyNkZWZpbmUgUlRNUF9ORElTX01JTk9SX1ZFUlNJT04gICAgIDEKKyNlbmRpZgorCitleHRlcm4gIGNoYXIgICAgTklDX1ZFTkRPUl9ERVNDW107CitleHRlcm4gIGludCAgICAgTklDX1ZFTkRPUl9ERVNDX0xFTjsKKworZXh0ZXJuICB1bnNpZ25lZCBjaGFyICAgU05BUF9BSVJPTkVUW107CitleHRlcm4gIHVuc2lnbmVkIGNoYXIgICBDaXBoZXJTdWl0ZUNpc2NvQ0NLTVtdOworZXh0ZXJuICB1bnNpZ25lZCBjaGFyICAgQ2lwaGVyU3VpdGVDaXNjb0NDS01MZW47CitleHRlcm4JdW5zaWduZWQgY2hhcglDaXBoZXJTdWl0ZUNpc2NvQ0NLTTI0W107CitleHRlcm4JdW5zaWduZWQgY2hhcglDaXBoZXJTdWl0ZUNpc2NvQ0NLTTI0TGVuOworZXh0ZXJuICB1bnNpZ25lZCBjaGFyICAgQ2lwaGVyU3VpdGVDQ1hUa2lwW107CitleHRlcm4gIHVuc2lnbmVkIGNoYXIgICBDaXBoZXJTdWl0ZUNDWFRraXBMZW47CitleHRlcm4gIHVuc2lnbmVkIGNoYXIgICBDSVNDT19PVUlbXTsKK2V4dGVybiAgVUNIQVIJQmFTaXplQXJyYXlbNF07CisKK2V4dGVybiBVQ0hBUiBCUk9BRENBU1RfQUREUltNQUNfQUREUl9MRU5dOworZXh0ZXJuIFVDSEFSIE1VTFRJQ0FTVF9BRERSW01BQ19BRERSX0xFTl07CitleHRlcm4gVUNIQVIgWkVST19NQUNfQUREUltNQUNfQUREUl9MRU5dOworZXh0ZXJuIFVMT05HIEJJVDMyWzMyXTsKK2V4dGVybiBVQ0hBUiBCSVQ4WzhdOworZXh0ZXJuIGNoYXIqIENpcGhlck5hbWVbXTsKK2V4dGVybiBjaGFyKiBNQ1NUb01icHNbXTsKK2V4dGVybiBVQ0hBUgkgUnh3aU1DU1RvT2ZkbVJhdGVbMTJdOworZXh0ZXJuIFVDSEFSIFNOQVBfODAyXzFIWzZdOworZXh0ZXJuIFVDSEFSIFNOQVBfQlJJREdFX1RVTk5FTFs2XTsKK2V4dGVybiBVQ0hBUiBTTkFQX0FJUk9ORVRbOF07CitleHRlcm4gVUNIQVIgQ0tJUF9MTENfU05BUFs4XTsKK2V4dGVybiBVQ0hBUiBFQVBPTF9MTENfU05BUFs4XTsKK2V4dGVybiBVQ0hBUiBFQVBPTFsyXTsKK2V4dGVybiBVQ0hBUiBJUFhbMl07CitleHRlcm4gVUNIQVIgQVBQTEVfVEFMS1syXTsKK2V4dGVybiBVQ0hBUiBSYXRlSWRUb1BsY3BTaWduYWxbMTJdOyAvLyBzZWUgSUVFRTgwMi4xMWEtMTk5OSBwLjE0CitleHRlcm4gVUNIQVIJIE9mZG1SYXRlVG9SeHdpTUNTW107CitleHRlcm4gVUNIQVIgT2ZkbVNpZ25hbFRvUmF0ZUlkWzE2XSA7CitleHRlcm4gVUNIQVIgZGVmYXVsdF9jd21pbls0XTsKK2V4dGVybiBVQ0hBUiBkZWZhdWx0X2N3bWF4WzRdOworZXh0ZXJuIFVDSEFSIGRlZmF1bHRfc3RhX2FpZnNuWzRdOworZXh0ZXJuIFVDSEFSIE1hcFVzZXJQcmlvcml0eVRvQWNjZXNzQ2F0ZWdvcnlbOF07CisKK2V4dGVybiBVU0hPUlQgUmF0ZVVwUEVSW107CitleHRlcm4gVVNIT1JUIFJhdGVEb3duUEVSW107CitleHRlcm4gVUNIQVIgIFBoeTExQk5leHRSYXRlRG93bndhcmRbXTsKK2V4dGVybiBVQ0hBUiAgUGh5MTFCTmV4dFJhdGVVcHdhcmRbXTsKK2V4dGVybiBVQ0hBUiAgUGh5MTFCR05leHRSYXRlRG93bndhcmRbXTsKK2V4dGVybiBVQ0hBUiAgUGh5MTFCR05leHRSYXRlVXB3YXJkW107CitleHRlcm4gVUNIQVIgIFBoeTExQU5leHRSYXRlRG93bndhcmRbXTsKK2V4dGVybiBVQ0hBUiAgUGh5MTFBTmV4dFJhdGVVcHdhcmRbXTsKK2V4dGVybiBDSEFSICAgUnNzaVNhZmVMZXZlbEZvclR4UmF0ZVtdOworZXh0ZXJuIFVDSEFSICBSYXRlSWRUb01icHNbXTsKK2V4dGVybiBVU0hPUlQgUmF0ZUlkVG81MDBLYnBzW107CisKK2V4dGVybiBVQ0hBUiAgQ2lwaGVyU3VpdGVXcGFOb25lVGtpcFtdOworZXh0ZXJuIFVDSEFSICBDaXBoZXJTdWl0ZVdwYU5vbmVUa2lwTGVuOworCitleHRlcm4gVUNIQVIgIENpcGhlclN1aXRlV3BhTm9uZUFlc1tdOworZXh0ZXJuIFVDSEFSICBDaXBoZXJTdWl0ZVdwYU5vbmVBZXNMZW47CisKK2V4dGVybiBVQ0hBUiAgU3NpZEllOworZXh0ZXJuIFVDSEFSICBTdXBSYXRlSWU7CitleHRlcm4gVUNIQVIgIEV4dFJhdGVJZTsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorZXh0ZXJuIFVDSEFSICBIdENhcEllOworZXh0ZXJuIFVDSEFSICBBZGRIdEluZm9JZTsKK2V4dGVybiBVQ0hBUiAgTmV3RXh0Q2hhbkllOworI2lmZGVmIERPVDExTl9EUkFGVDMKK2V4dGVybiBVQ0hBUiAgRXh0SHRDYXBJZTsKKyNlbmRpZiAvLyBET1QxMU5fRFJBRlQzIC8vCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKK2V4dGVybiBVQ0hBUiAgRXJwSWU7CitleHRlcm4gVUNIQVIgIERzSWU7CitleHRlcm4gVUNIQVIgIFRpbUllOworZXh0ZXJuIFVDSEFSICBXcGFJZTsKK2V4dGVybiBVQ0hBUiAgV3BhMkllOworZXh0ZXJuIFVDSEFSICBJYnNzSWU7CitleHRlcm4gVUNIQVIgIENjeDJJZTsKKworZXh0ZXJuIFVDSEFSICBXUEFfT1VJW107CitleHRlcm4gVUNIQVIgIFJTTl9PVUlbXTsKK2V4dGVybiBVQ0hBUiAgV01FX0lORk9fRUxFTVtdOworZXh0ZXJuIFVDSEFSICBXTUVfUEFSTV9FTEVNW107CitleHRlcm4gVUNIQVIgIENjeDJRb3NJbmZvW107CitleHRlcm4gVUNIQVIgIENjeDJJZUluZm9bXTsKK2V4dGVybiBVQ0hBUiAgUkFMSU5LX09VSVtdOworZXh0ZXJuIFVDSEFSICBQb3dlckNvbnN0cmFpbnRJRVtdOworCisKK2V4dGVybiBVQ0hBUiAgUmF0ZVN3aXRjaFRhYmxlW107CitleHRlcm4gVUNIQVIgIFJhdGVTd2l0Y2hUYWJsZTExQltdOworZXh0ZXJuIFVDSEFSICBSYXRlU3dpdGNoVGFibGUxMUdbXTsKK2V4dGVybiBVQ0hBUiAgUmF0ZVN3aXRjaFRhYmxlMTFCR1tdOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCitleHRlcm4gVUNIQVIgIFJhdGVTd2l0Y2hUYWJsZTExQkdOMVNbXTsKK2V4dGVybiBVQ0hBUiAgUmF0ZVN3aXRjaFRhYmxlMTFCR04yU1tdOworZXh0ZXJuIFVDSEFSICBSYXRlU3dpdGNoVGFibGUxMUJHTjJTRm9yQUJhbmRbXTsKK2V4dGVybiBVQ0hBUiAgUmF0ZVN3aXRjaFRhYmxlMTFOMVNbXTsKK2V4dGVybiBVQ0hBUiAgUmF0ZVN3aXRjaFRhYmxlMTFOMlNbXTsKK2V4dGVybiBVQ0hBUiAgUmF0ZVN3aXRjaFRhYmxlMTFOMlNGb3JBQmFuZFtdOworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCitleHRlcm4gVUNIQVIgIFBSRV9OX0hUX09VSVtdOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisjZGVmaW5lCU1BWFNFUQkJKDB4RkZGKQorCisjaWZkZWYgUkFMSU5LX0FURQordHlwZWRlZglzdHJ1Y3QgX0FURV9JTkZPIHsKKwlVQ0hBUglNb2RlOworCUNIQVIJVHhQb3dlcjA7CisJQ0hBUglUeFBvd2VyMTsKKwlDSEFSICAgIFR4QW50ZW5uYVNlbDsKKwlDSEFSICAgIFJ4QW50ZW5uYVNlbDsKKwlUWFdJX1NUUlVDICBUeFdJOyAJICAvLyBUWFdJCisJVVNIT1JUCVFJRDsKKwlVQ0hBUglBZGRyMVtNQUNfQUREUl9MRU5dOworCVVDSEFSCUFkZHIyW01BQ19BRERSX0xFTl07CisJVUNIQVIJQWRkcjNbTUFDX0FERFJfTEVOXTsKKwlVQ0hBUglDaGFubmVsOworCVVJTlQzMglUeExlbmd0aDsKKwlVSU5UMzIJVHhDb3VudDsKKwlVSU5UMzIJVHhEb25lQ291bnQ7IC8vIFR4IERNQSBEb25lCisJVUlOVDMyCVJGRnJlcU9mZnNldDsKKwlCT09MRUFOCWJSeEZlcjsKKwlCT09MRUFOCWJRQVR4U3RhcnQ7IC8vIEhhdmUgY29tcGlsZWQgUUEgaW4gYW5kIHVzZSBpdCB0byBBVEUgdHguCisJQk9PTEVBTgliUUFSeFN0YXJ0OwkvLyBIYXZlIGNvbXBpbGVkIFFBIGluIGFuZCB1c2UgaXQgdG8gQVRFIHJ4LgorCVVJTlQzMglSeFRvdGFsQ250OworCVVJTlQzMglSeENudFBlclNlYzsKKworCUNIQVIJTGFzdFNOUjA7ICAgICAgICAgICAgIC8vIGxhc3QgcmVjZWl2ZWQgU05SCisJQ0hBUiAgICBMYXN0U05SMTsgICAgICAgICAgICAgLy8gbGFzdCByZWNlaXZlZCBTTlIgZm9yIDJuZCAgYW50ZW5uYQorCUNIQVIgICAgTGFzdFJzc2kwOyAgICAgICAgICAgIC8vIGxhc3QgcmVjZWl2ZWQgUlNTSQorCUNIQVIgICAgTGFzdFJzc2kxOyAgICAgICAgICAgIC8vIGxhc3QgcmVjZWl2ZWQgUlNTSSBmb3IgMm5kICBhbnRlbm5hCisJQ0hBUiAgICBMYXN0UnNzaTI7ICAgICAgICAgICAgLy8gbGFzdCByZWNlaXZlZCBSU1NJIGZvciAzcmQgIGFudGVubmEKKwlDSEFSICAgIEF2Z1Jzc2kwOyAgICAgICAgICAgICAvLyBsYXN0IDggZnJhbWVzJyBhdmVyYWdlIFJTU0kKKwlDSEFSICAgIEF2Z1Jzc2kxOyAgICAgICAgICAgICAvLyBsYXN0IDggZnJhbWVzJyBhdmVyYWdlIFJTU0kKKwlDSEFSICAgIEF2Z1Jzc2kyOyAgICAgICAgICAgICAvLyBsYXN0IDggZnJhbWVzJyBhdmVyYWdlIFJTU0kKKwlTSE9SVCAgIEF2Z1Jzc2kwWDg7ICAgICAgICAgICAvLyBzdW0gb2YgbGFzdCA4IGZyYW1lcycgUlNTSQorCVNIT1JUICAgQXZnUnNzaTFYODsgICAgICAgICAgIC8vIHN1bSBvZiBsYXN0IDggZnJhbWVzJyBSU1NJCisJU0hPUlQgICBBdmdSc3NpMlg4OyAgICAgICAgICAgLy8gc3VtIG9mIGxhc3QgOCBmcmFtZXMnIFJTU0kKKworCVVJTlQzMglOdW1PZkF2Z1Jzc2lTYW1wbGU7CisKKyNpZmRlZiBSQUxJTktfMjh4eF9RQQorCS8vIFR4IGZyYW1lCisjaWZkZWYgUlQyODcwCisJLyogbm90IHVzZWQgaW4gUlQyODYwICovCisJVFhJTkZPX1NUUlVDCQlUeEluZm87IC8vIFR4SW5mbworI2VuZGlmIC8vIFJUMjg3MCAvLworCVVTSE9SVAkJSExlbjsgLy8gSGVhZGVyIExlbmd0aAorCVVTSE9SVAkJUExlbjsgLy8gUGF0dGVybiBMZW5ndGgKKwlVQ0hBUiAJCUhlYWRlclszMl07IC8vIEhlYWRlciBidWZmZXIKKwlVQ0hBUgkJUGF0dGVyblszMl07IC8vIFBhdHRlcm4gYnVmZmVyCisJVVNIT1JUCQlETGVuOyAvLyBEYXRhIExlbmd0aAorCVVTSE9SVAkJc2VxOworCVVJTlQzMgkJQ0lEOworCVRIUkVBRF9QSUQgCQlBdGVQaWQ7CisJLy8gY291bnRlcnMKKwlVSU5UMzIJCVUyTTsKKwlVSU5UMzIJCU90aGVyRGF0YTsKKwlVSU5UMzIJCUJlYWNvbjsKKwlVSU5UMzIJCU90aGVyQ291bnQ7CisJVUlOVDMyCQlUeEFjMDsKKwlVSU5UMzIJCVR4QWMxOworCVVJTlQzMgkJVHhBYzI7CisJVUlOVDMyCQlUeEFjMzsKKwlVSU5UMzIJCVR4SENDQTsKKwlVSU5UMzIJCVR4TWdtdDsKKwlVSU5UMzIJCVJTU0kwOworCVVJTlQzMgkJUlNTSTE7CisJVUlOVDMyCQlSU1NJMjsKKwlVSU5UMzIJCVNOUjA7CisJVUlOVDMyCQlTTlIxOworCS8vIGNvbnRyb2wKKwkvL1VJTlQzMgkJUmVwZWF0OyAvLyBUeCBDcHUgY291bnQKKwlVQ0hBUgkJVHhTdGF0dXM7IC8vIHRhc2sgVHggc3RhdHVzIC8vIDAgLS0+IHRhc2sgaXMgaWRsZSwgMSAtLT4gdGFzayBpcyBydW5uaW5nCisjZW5kaWYgLy8gUkFMSU5LXzI4eHhfUUEgLy8KK30JQVRFX0lORk8sICpQQVRFX0lORk87CisKKyNpZmRlZiBSQUxJTktfMjh4eF9RQQorc3RydWN0IGF0ZV9yYWNmZ2hkciB7CisgCVVJTlQzMgkJbWFnaWNfbm87CisJVVNIT1JUCQljb21tYW5kX3R5cGU7CisJVVNIT1JUCQljb21tYW5kX2lkOworCVVTSE9SVAkJbGVuZ3RoOworCVVTSE9SVAkJc2VxdWVuY2U7CisJVVNIT1JUCQlzdGF0dXM7CisJVUNIQVIJCWRhdGFbMjA0Nl07Cit9ICBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKyNlbmRpZiAvLyBSQUxJTktfMjh4eF9RQSAvLworI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorc3RydWN0IHJlb3JkZXJpbmdfbXBkdQoreworCXN0cnVjdCByZW9yZGVyaW5nX21wZHUJKm5leHQ7CisJUE5ESVNfUEFDS0VUCQkJcFBhY2tldDsJCS8qIGNvdmVydGVkIHRvIDgwMi4zIGZyYW1lICovCisJaW50CQkJCQkJU2VxdWVuY2U7CQkvKiBzZXF1ZW5jZSBudW1iZXIgb2YgTVBEVSAqLworCUJPT0xFQU4JCQkJCWJBTVNEVTsKK307CisKK3N0cnVjdCByZW9yZGVyaW5nX2xpc3QKK3sKKwlzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1ICpuZXh0OworCWludCAJcWxlbjsKK307CisKK3N0cnVjdCByZW9yZGVyaW5nX21wZHVfcG9vbAoreworCVBWT0lECQkJCQltZW07CisJTkRJU19TUElOX0xPQ0sJCQlsb2NrOworCXN0cnVjdCByZW9yZGVyaW5nX2xpc3QgCWZyZWVsaXN0OworfTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwordHlwZWRlZiBzdHJ1Y3QgCV9SU1NJX1NBTVBMRSB7CisJQ0hBUgkJCUxhc3RSc3NpMDsgICAgICAgICAgICAgLy8gbGFzdCByZWNlaXZlZCBSU1NJCisJQ0hBUgkJCUxhc3RSc3NpMTsgICAgICAgICAgICAgLy8gbGFzdCByZWNlaXZlZCBSU1NJCisJQ0hBUgkJCUxhc3RSc3NpMjsgICAgICAgICAgICAgLy8gbGFzdCByZWNlaXZlZCBSU1NJCisJQ0hBUgkJCUF2Z1Jzc2kwOworCUNIQVIJCQlBdmdSc3NpMTsKKwlDSEFSCQkJQXZnUnNzaTI7CisJU0hPUlQJCQlBdmdSc3NpMFg4OworCVNIT1JUCQkJQXZnUnNzaTFYODsKKwlTSE9SVAkJCUF2Z1Jzc2kyWDg7Cit9IFJTU0lfU0FNUExFOworCisvLworLy8gIFF1ZXVlIHN0cnVjdHVyZSBhbmQgbWFjcm9zCisvLwordHlwZWRlZiBzdHJ1Y3QgIF9RVUVVRV9FTlRSWSAgICB7CisJc3RydWN0IF9RVUVVRV9FTlRSWSAgICAgKk5leHQ7Cit9ICAgUVVFVUVfRU5UUlksICpQUVVFVUVfRU5UUlk7CisKKy8vIFF1ZXVlIHN0cnVjdHVyZQordHlwZWRlZiBzdHJ1Y3QgIF9RVUVVRV9IRUFERVIgICB7CisJUFFVRVVFX0VOVFJZICAgIEhlYWQ7CisJUFFVRVVFX0VOVFJZICAgIFRhaWw7CisJVUxPTkcgICAgICAgICAgIE51bWJlcjsKK30gICBRVUVVRV9IRUFERVIsICpQUVVFVUVfSEVBREVSOworCisjZGVmaW5lIEluaXRpYWxpemVRdWV1ZUhlYWRlcihRdWV1ZUhlYWRlcikgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCShRdWV1ZUhlYWRlciktPkhlYWQgPSAoUXVldWVIZWFkZXIpLT5UYWlsID0gTlVMTDsgICBcCisJKFF1ZXVlSGVhZGVyKS0+TnVtYmVyID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI2RlZmluZSBSZW1vdmVIZWFkUXVldWUoUXVldWVIZWFkZXIpICAgICAgICAgICAgICAgIFwKKyhRdWV1ZUhlYWRlciktPkhlYWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCVBRVUVVRV9FTlRSWSBwTmV4dDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlpZiAoKFF1ZXVlSGVhZGVyKS0+SGVhZCAhPSBOVUxMKQkJCQlcCisJewkJCQkJCQkJCQkJCVwKKwkJcE5leHQgPSAoUXVldWVIZWFkZXIpLT5IZWFkLT5OZXh0OyAgICAgICAgICBcCisJCShRdWV1ZUhlYWRlciktPkhlYWQgPSBwTmV4dDsgICAgICAgICAgICAgICAgXAorCQlpZiAocE5leHQgPT0gTlVMTCkgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJCShRdWV1ZUhlYWRlciktPlRhaWwgPSBOVUxMOyAgICAgICAgICAgICBcCisJCShRdWV1ZUhlYWRlciktPk51bWJlci0tOyAgICAgICAgICAgICAgICAgICAgXAorCX0JCQkJCQkJCQkJCQlcCit9CisKKyNkZWZpbmUgSW5zZXJ0SGVhZFF1ZXVlKFF1ZXVlSGVhZGVyLCBRdWV1ZUVudHJ5KSAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJKChQUVVFVUVfRU5UUlkpUXVldWVFbnRyeSktPk5leHQgPSAoUXVldWVIZWFkZXIpLT5IZWFkOyBcCisJCShRdWV1ZUhlYWRlciktPkhlYWQgPSAoUFFVRVVFX0VOVFJZKShRdWV1ZUVudHJ5KTsgICAgICAgXAorCQlpZiAoKFF1ZXVlSGVhZGVyKS0+VGFpbCA9PSBOVUxMKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJCShRdWV1ZUhlYWRlciktPlRhaWwgPSAoUFFVRVVFX0VOVFJZKShRdWV1ZUVudHJ5KTsgICBcCisJCShRdWV1ZUhlYWRlciktPk51bWJlcisrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjZGVmaW5lIEluc2VydFRhaWxRdWV1ZShRdWV1ZUhlYWRlciwgUXVldWVFbnRyeSkgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkoKFBRVUVVRV9FTlRSWSlRdWV1ZUVudHJ5KS0+TmV4dCA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICBcCisJaWYgKChRdWV1ZUhlYWRlciktPlRhaWwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkoUXVldWVIZWFkZXIpLT5UYWlsLT5OZXh0ID0gKFBRVUVVRV9FTlRSWSkoUXVldWVFbnRyeSk7IFwKKwllbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCShRdWV1ZUhlYWRlciktPkhlYWQgPSAoUFFVRVVFX0VOVFJZKShRdWV1ZUVudHJ5KTsgICAgICAgXAorCShRdWV1ZUhlYWRlciktPlRhaWwgPSAoUFFVRVVFX0VOVFJZKShRdWV1ZUVudHJ5KTsgICAgICAgICAgIFwKKwkoUXVldWVIZWFkZXIpLT5OdW1iZXIrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKy8vCisvLyAgTWFjcm9zIGZvciBmbGFnIGFuZCByZWYgY291bnQgb3BlcmF0aW9ucworLy8KKyNkZWZpbmUgUlRNUF9TRVRfRkxBRyhfTSwgX0YpICAgICAgICgoX00pLT5GbGFncyB8PSAoX0YpKQorI2RlZmluZSBSVE1QX0NMRUFSX0ZMQUcoX00sIF9GKSAgICAgKChfTSktPkZsYWdzICY9IH4oX0YpKQorI2RlZmluZSBSVE1QX0NMRUFSX0ZMQUdTKF9NKSAgICAgICAgKChfTSktPkZsYWdzID0gMCkKKyNkZWZpbmUgUlRNUF9URVNUX0ZMQUcoX00sIF9GKSAgICAgICgoKF9NKS0+RmxhZ3MgJiAoX0YpKSAhPSAwKQorI2RlZmluZSBSVE1QX1RFU1RfRkxBR1MoX00sIF9GKSAgICAgKCgoX00pLT5GbGFncyAmIChfRikpID09IChfRikpCisKKyNkZWZpbmUgT1BTVEFUVVNfU0VUX0ZMQUcoX3BBZCwgX0YpICAgICAoKF9wQWQpLT5Db21tb25DZmcuT3BTdGF0dXNGbGFncyB8PSAoX0YpKQorI2RlZmluZSBPUFNUQVRVU19DTEVBUl9GTEFHKF9wQWQsIF9GKSAgICgoX3BBZCktPkNvbW1vbkNmZy5PcFN0YXR1c0ZsYWdzICY9IH4oX0YpKQorI2RlZmluZSBPUFNUQVRVU19URVNUX0ZMQUcoX3BBZCwgX0YpICAgICgoKF9wQWQpLT5Db21tb25DZmcuT3BTdGF0dXNGbGFncyAmIChfRikpICE9IDApCisKKyNkZWZpbmUgQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhfcEVudHJ5LF9GKSAgICAgICgoX3BFbnRyeSktPkNsaWVudFN0YXR1c0ZsYWdzIHw9IChfRikpCisjZGVmaW5lIENMSUVOVF9TVEFUVVNfQ0xFQVJfRkxBRyhfcEVudHJ5LF9GKSAgICAoKF9wRW50cnkpLT5DbGllbnRTdGF0dXNGbGFncyAmPSB+KF9GKSkKKyNkZWZpbmUgQ0xJRU5UX1NUQVRVU19URVNUX0ZMQUcoX3BFbnRyeSxfRikgICAgICgoKF9wRW50cnkpLT5DbGllbnRTdGF0dXNGbGFncyAmIChfRikpICE9IDApCisKKyNkZWZpbmUgUlhfRklMVEVSX1NFVF9GTEFHKF9wQWQsIF9GKSAgICAoKF9wQWQpLT5Db21tb25DZmcuUGFja2V0RmlsdGVyIHw9IChfRikpCisjZGVmaW5lIFJYX0ZJTFRFUl9DTEVBUl9GTEFHKF9wQWQsIF9GKSAgKChfcEFkKS0+Q29tbW9uQ2ZnLlBhY2tldEZpbHRlciAmPSB+KF9GKSkKKyNkZWZpbmUgUlhfRklMVEVSX1RFU1RfRkxBRyhfcEFkLCBfRikgICAoKChfcEFkKS0+Q29tbW9uQ2ZnLlBhY2tldEZpbHRlciAmIChfRikpICE9IDApCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKyNkZWZpbmUgU1RBX05PX1NFQ1VSSVRZX09OKF9wKSAgICAgICAgICAoX3AtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb25EaXNhYmxlZCkKKyNkZWZpbmUgU1RBX1dFUF9PTihfcCkgICAgICAgICAgICAgICAgICAoX3AtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24xRW5hYmxlZCkKKyNkZWZpbmUgU1RBX1RLSVBfT04oX3ApICAgICAgICAgICAgICAgICAoX3AtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkKKyNkZWZpbmUgU1RBX0FFU19PTihfcCkgICAgICAgICAgICAgICAgICAoX3AtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKKworI2RlZmluZSBTVEFfVEdOX1dJRklfT04oX3ApICAgICAgICAgICAgIChfcC0+U3RhQ2ZnLmJUR25XaWZpVGVzdCA9PSBUUlVFKQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisjZGVmaW5lIENLSVBfS1BfT04oX3ApCQkJCSgoKChfcCktPlN0YUNmZy5Da2lwRmxhZykgJiAweDEwKSAmJiAoKF9wKS0+U3RhQ2ZnLmJDa2lwQ21pY09uID09IFRSVUUpKQorI2RlZmluZSBDS0lQX0NNSUNfT04oX3ApCQkJKCgoKF9wKS0+U3RhQ2ZnLkNraXBGbGFnKSAmIDB4MDgpICYmICgoX3ApLT5TdGFDZmcuYkNraXBDbWljT24gPT0gVFJVRSkpCisKKworI2RlZmluZSBJTkNfUklOR19JTkRFWChfaWR4LCBfUmluZ1NpemUpICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKF9pZHgpID0gKF9pZHgrMSkgJSAoX1JpbmdTaXplKTsgICAgICAgXAorfQorCisjZGVmaW5lIElTX1JUMzA3MChfcEFkKQkJCQkoKChfcEFkKS0+TUFDVmVyc2lvbiAmIDB4ZmZmZjAwMDApID09IDB4MzA3MDAwMDApCisKKyNkZWZpbmUgUklOR19QQUNLRVRfSU5JVChfVHhSaW5nLCBfaWR4KSAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9UeFJpbmctPkNlbGxbX2lkeF0ucE5kaXNQYWNrZXQgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfVHhSaW5nLT5DZWxsW19pZHhdLnBOZXh0TmRpc1BhY2tldCA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjZGVmaW5lIFRYRFRfSU5JVChfVHhEKSAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCU5kaXNaZXJvTWVtb3J5KF9UeEQsIFRYRF9TSVpFKTsJXAorCV9UeEQtPkRNQURPTkUgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworLy9TZXQgbGFzdCBkYXRhIHNlZ21lbnQKKyNkZWZpbmUgUklOR19TRVRfTEFTVERTKF9UeEQsIF9Jc1NEMCkgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoX0lzU0QwKSB7X1R4RC0+TGFzdFNlYzAgPSAxO30gICAgIFwKKyAgICBlbHNlIHtfVHhELT5MYXN0U2VjMSA9IDE7fSAgICAgXAorfQorCisvLyBJbmNyZWFzZSBUeFRzYyB2YWx1ZSBmb3IgbmV4dCB0cmFuc21pc3Npb24KKy8vIFRPRE86CisvLyBXaGVuIGk9PTYsIG1lYW5zIFRTQyBoYXMgZG9uZSBvbmUgZnVsbCBjeWNsZSwgZG8gcmUta2V5aW5nIHN0dWZmIGZvbGxvdyBzcGVjcworLy8gU2hvdWxkIHNlbmQgYSBzcGVjaWFsIGV2ZW50IG1pY3Jvc29mdCBkZWZpbmVkIHRvIHJlcXVlc3QgcmUta2V5CisjZGVmaW5lIElOQ19UWF9UU0MoX3RzYykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCBpPTA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgd2hpbGUgKCsrX3RzY1tpXSA9PSAweDApICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpKys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChpID09IDYpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKy8vIFN0YUFjdGl2ZS5TdXBwb3J0ZWRIdFBoeS5NQ1NTZXQgaXMgY29waWVkIGZyb20gQVAgYmVhY29uLiAgRG9uJ3QgbmVlZCB0byB1cGRhdGUgaGVyZS4KKyNkZWZpbmUgQ09QWV9IVFNFVFRJTkdTX0ZST01fTUxNRV9BVVhfVE9fQUNUSVZFX0NGRyhfcEFkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJX3BBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZEh0UGh5LkNoYW5uZWxXaWR0aCA9IF9wQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5DaGFubmVsV2lkdGg7ICAgICAgXAorCV9wQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRIdFBoeS5NaW1vUHMgPSBfcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uTWltb1BzOyAgICAgIFwKKwlfcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkSHRQaHkuR0YgPSBfcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uR0Y7ICAgICAgXAorCV9wQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRIdFBoeS5TaG9ydEdJZm9yMjAgPSBfcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uU2hvcnRHSWZvcjIwOyAgICAgIFwKKwlfcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkSHRQaHkuU2hvcnRHSWZvcjQwID0gX3BBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLlNob3J0R0lmb3I0MDsgICAgICBcCisJX3BBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZEh0UGh5LlR4U1RCQyA9IF9wQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5UeFNUQkM7ICAgICAgXAorCV9wQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRIdFBoeS5SeFNUQkMgPSBfcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uUnhTVEJDOyAgICAgIFwKKwlfcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkSHRQaHkuRXh0Q2hhbk9mZnNldCA9IF9wQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mby5FeHRDaGFuT2Zmc2V0OyAgICAgIFwKKwlfcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkSHRQaHkuUmVjb21XaWR0aCA9IF9wQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mby5SZWNvbVdpZHRoOyAgICAgIFwKKwlfcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkSHRQaHkuT3BlcmFpb25Nb2RlID0gX3BBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi5PcGVyYWlvbk1vZGU7ICAgICAgXAorCV9wQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRIdFBoeS5Ob25HZlByZXNlbnQgPSBfcEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLk5vbkdmUHJlc2VudDsgICAgICBcCisJTmRpc01vdmVNZW1vcnkoKF9wQWQpLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5IVENhcGFiaWxpdHkuTUNTU2V0LCAoX3BBZCktPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLk1DU1NldCwgc2l6ZW9mKFVDSEFSKSAqIDE2KTtcCit9CisKKyNkZWZpbmUgQ09QWV9BUF9IVFNFVFRJTkdTX0ZST01fQkVBQ09OKF9wQWQsIF9wSHRDYXBhYmlsaXR5KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJX3BBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQU1zZHVTaXplID0gKFVDSEFSKShfcEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLkFNc2R1U2l6ZSk7CVwKKwlfcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5NbXBzTW9kZT0gKFVDSEFSKShfcEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLk1pbW9Qcyk7CVwKKwlfcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5NYXhSQW1wZHVGYWN0b3IgPSAoVUNIQVIpKF9wSHRDYXBhYmlsaXR5LT5IdENhcFBhcm0uTWF4UkFtcGR1RmFjdG9yKTsJXAorfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisvLworLy8gQkJQICYgUkYgYXJlIHVzaW5nIGluZGlyZWN0IGFjY2Vzcy4gQmVmb3JlIHdyaXRlIGFueSB2YWx1ZSBpbnRvIGl0LgorLy8gV2UgaGF2ZSB0byBtYWtlIHN1cmUgdGhlcmUgaXMgbm8gb3V0c3RhbmRpbmcgY29tbWFuZCBwZW5kaW5nIHZpYSBjaGVja2luZyBidXN5IGJpdC4KKy8vCisjZGVmaW5lIE1BWF9CVVNZX0NPVU5UICAxMDAgICAgICAgICAvLyBOdW1iZXIgb2YgcmV0cnkgYmVmb3JlIGZhaWxpbmcgYWNjZXNzIEJCUCAmIFJGIGluZGlyZWN0IHJlZ2lzdGVyCisvLworCisjaWZkZWYgUlQyODcwCisjZGVmaW5lIFJUTVBfUkZfSU9fV1JJVEUzMihfQSwgX1YpICAgICAgICAgICAgICAgICBSVFVTQldyaXRlUkZSZWdpc3RlcihfQSwgX1YpCisjZGVmaW5lIFJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChfQSwgX0ksIF9wVikgICBSVFVTQlJlYWRCQlBSZWdpc3RlcihfQSwgX0ksIF9wVikKKyNkZWZpbmUgUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChfQSwgX0ksIF9WKSAgIFJUVVNCV3JpdGVCQlBSZWdpc3RlcihfQSwgX0ksIF9WKQorCisjZGVmaW5lIEJCUF9JT19XUklURThfQllfUkVHX0lEKF9BLCBfSSwgX1YpCQkJUlRVU0JXcml0ZUJCUFJlZ2lzdGVyKF9BLCBfSSwgX1YpCisjZGVmaW5lIEJCUF9JT19SRUFEOF9CWV9SRUdfSUQoX0EsIF9JLCBfcFYpICAgCQlSVFVTQlJlYWRCQlBSZWdpc3RlcihfQSwgX0ksIF9wVikKKyNlbmRpZiAvLyBSVDI4NzAgLy8KKworI2RlZmluZSAgICAgTUFQX0NIQU5ORUxfSURfVE9fS0haKGNoLCBraHopICB7ICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHN3aXRjaCAoY2gpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDE6ICAgICBraHogPSAyNDEyMDAwOyAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDI6ICAgICBraHogPSAyNDE3MDAwOyAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDM6ICAgICBraHogPSAyNDIyMDAwOyAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6ICAgICBraHogPSAyNDI3MDAwOyAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDU6ICAgICBraHogPSAyNDMyMDAwOyAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDY6ICAgICBraHogPSAyNDM3MDAwOyAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDc6ICAgICBraHogPSAyNDQyMDAwOyAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDg6ICAgICBraHogPSAyNDQ3MDAwOyAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDk6ICAgICBraHogPSAyNDUyMDAwOyAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDEwOiAgICBraHogPSAyNDU3MDAwOyAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDExOiAgICBraHogPSAyNDYyMDAwOyAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDEyOiAgICBraHogPSAyNDY3MDAwOyAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDEzOiAgICBraHogPSAyNDcyMDAwOyAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDE0OiAgICBraHogPSAyNDg0MDAwOyAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDM2OiAgLyogVU5JSSAqLyAga2h6ID0gNTE4MDAwMDsgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA0MDogIC8qIFVOSUkgKi8gIGtoeiA9IDUyMDAwMDA7ICAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNDQ6ICAvKiBVTklJICovICBraHogPSA1MjIwMDAwOyAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDQ4OiAgLyogVU5JSSAqLyAga2h6ID0gNTI0MDAwMDsgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA1MjogIC8qIFVOSUkgKi8gIGtoeiA9IDUyNjAwMDA7ICAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNTY6ICAvKiBVTklJICovICBraHogPSA1MjgwMDAwOyAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDYwOiAgLyogVU5JSSAqLyAga2h6ID0gNTMwMDAwMDsgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA2NDogIC8qIFVOSUkgKi8gIGtoeiA9IDUzMjAwMDA7ICAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMTQ5OiAvKiBVTklJICovICBraHogPSA1NzQ1MDAwOyAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDE1MzogLyogVU5JSSAqLyAga2h6ID0gNTc2NTAwMDsgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxNTc6IC8qIFVOSUkgKi8gIGtoeiA9IDU3ODUwMDA7ICAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMTYxOiAvKiBVTklJICovICBraHogPSA1ODA1MDAwOyAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDE2NTogLyogVU5JSSAqLyAga2h6ID0gNTgyNTAwMDsgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDA6IC8qIEhpcGVyTEFOMiAqLyAga2h6ID0gNTUwMDAwMDsgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDQ6IC8qIEhpcGVyTEFOMiAqLyAga2h6ID0gNTUyMDAwMDsgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDg6IC8qIEhpcGVyTEFOMiAqLyAga2h6ID0gNTU0MDAwMDsgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxMTI6IC8qIEhpcGVyTEFOMiAqLyAga2h6ID0gNTU2MDAwMDsgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxMTY6IC8qIEhpcGVyTEFOMiAqLyAga2h6ID0gNTU4MDAwMDsgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjA6IC8qIEhpcGVyTEFOMiAqLyAga2h6ID0gNTYwMDAwMDsgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjQ6IC8qIEhpcGVyTEFOMiAqLyAga2h6ID0gNTYyMDAwMDsgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjg6IC8qIEhpcGVyTEFOMiAqLyAga2h6ID0gNTY0MDAwMDsgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzI6IC8qIEhpcGVyTEFOMiAqLyAga2h6ID0gNTY2MDAwMDsgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzY6IC8qIEhpcGVyTEFOMiAqLyAga2h6ID0gNTY4MDAwMDsgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxNDA6IC8qIEhpcGVyTEFOMiAqLyAga2h6ID0gNTcwMDAwMDsgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAzNDogIC8qIEphcGFuIE1NQUMgKi8gICBraHogPSA1MTcwMDAwOyAgIGJyZWFrOyAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAzODogIC8qIEphcGFuIE1NQUMgKi8gICBraHogPSA1MTkwMDAwOyAgIGJyZWFrOyAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA0MjogIC8qIEphcGFuIE1NQUMgKi8gICBraHogPSA1MjEwMDAwOyAgIGJyZWFrOyAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA0NjogIC8qIEphcGFuIE1NQUMgKi8gICBraHogPSA1MjMwMDAwOyAgIGJyZWFrOyAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxODQ6IC8qIEphcGFuICovICAga2h6ID0gNDkyMDAwMDsgICBicmVhazsgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMTg4OiAvKiBKYXBhbiAqLyAgIGtoeiA9IDQ5NDAwMDA7ICAgYnJlYWs7ICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDE5MjogLyogSmFwYW4gKi8gICBraHogPSA0OTYwMDAwOyAgIGJyZWFrOyAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxOTY6IC8qIEphcGFuICovICAga2h6ID0gNDk4MDAwMDsgICBicmVhazsgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjA4OiAvKiBKYXBhbiwgbWVhbnMgSjA4ICovICAga2h6ID0gNTA0MDAwMDsgICBicmVhazsgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjEyOiAvKiBKYXBhbiwgbWVhbnMgSjEyICovICAga2h6ID0gNTA2MDAwMDsgICBicmVhazsgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjE2OiAvKiBKYXBhbiwgbWVhbnMgSjE2ICovICAga2h6ID0gNTA4MDAwMDsgICBicmVhazsgICBcCisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6ICAgIGtoeiA9IDI0MTIwMDA7ICAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9CisKKyNkZWZpbmUgICAgIE1BUF9LSFpfVE9fQ0hBTk5FTF9JRChraHosIGNoKSAgeyAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGtoeikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDEyMDAwOiAgICBjaCA9IDE7ICAgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDE3MDAwOiAgICBjaCA9IDI7ICAgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDIyMDAwOiAgICBjaCA9IDM7ICAgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDI3MDAwOiAgICBjaCA9IDQ7ICAgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDMyMDAwOiAgICBjaCA9IDU7ICAgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDM3MDAwOiAgICBjaCA9IDY7ICAgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDQyMDAwOiAgICBjaCA9IDc7ICAgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDQ3MDAwOiAgICBjaCA9IDg7ICAgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDUyMDAwOiAgICBjaCA9IDk7ICAgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDU3MDAwOiAgICBjaCA9IDEwOyAgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDYyMDAwOiAgICBjaCA9IDExOyAgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDY3MDAwOiAgICBjaCA9IDEyOyAgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDcyMDAwOiAgICBjaCA9IDEzOyAgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDg0MDAwOiAgICBjaCA9IDE0OyAgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA1MTgwMDAwOiAgICBjaCA9IDM2OyAgLyogVU5JSSAqLyAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNTIwMDAwMDogICAgY2ggPSA0MDsgIC8qIFVOSUkgKi8gIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDUyMjAwMDA6ICAgIGNoID0gNDQ7ICAvKiBVTklJICovICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA1MjQwMDAwOiAgICBjaCA9IDQ4OyAgLyogVU5JSSAqLyAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNTI2MDAwMDogICAgY2ggPSA1MjsgIC8qIFVOSUkgKi8gIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDUyODAwMDA6ICAgIGNoID0gNTY7ICAvKiBVTklJICovICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA1MzAwMDAwOiAgICBjaCA9IDYwOyAgLyogVU5JSSAqLyAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNTMyMDAwMDogICAgY2ggPSA2NDsgIC8qIFVOSUkgKi8gIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDU3NDUwMDA6ICAgIGNoID0gMTQ5OyAvKiBVTklJICovICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA1NzY1MDAwOiAgICBjaCA9IDE1MzsgLyogVU5JSSAqLyAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNTc4NTAwMDogICAgY2ggPSAxNTc7IC8qIFVOSUkgKi8gIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDU4MDUwMDA6ICAgIGNoID0gMTYxOyAvKiBVTklJICovICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA1ODI1MDAwOiAgICBjaCA9IDE2NTsgLyogVU5JSSAqLyAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNTUwMDAwMDogICAgY2ggPSAxMDA7IC8qIEhpcGVyTEFOMiAqLyAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNTUyMDAwMDogICAgY2ggPSAxMDQ7IC8qIEhpcGVyTEFOMiAqLyAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNTU0MDAwMDogICAgY2ggPSAxMDg7IC8qIEhpcGVyTEFOMiAqLyAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNTU2MDAwMDogICAgY2ggPSAxMTI7IC8qIEhpcGVyTEFOMiAqLyAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNTU4MDAwMDogICAgY2ggPSAxMTY7IC8qIEhpcGVyTEFOMiAqLyAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNTYwMDAwMDogICAgY2ggPSAxMjA7IC8qIEhpcGVyTEFOMiAqLyAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNTYyMDAwMDogICAgY2ggPSAxMjQ7IC8qIEhpcGVyTEFOMiAqLyAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNTY0MDAwMDogICAgY2ggPSAxMjg7IC8qIEhpcGVyTEFOMiAqLyAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNTY2MDAwMDogICAgY2ggPSAxMzI7IC8qIEhpcGVyTEFOMiAqLyAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNTY4MDAwMDogICAgY2ggPSAxMzY7IC8qIEhpcGVyTEFOMiAqLyAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNTcwMDAwMDogICAgY2ggPSAxNDA7IC8qIEhpcGVyTEFOMiAqLyAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNTE3MDAwMDogICAgY2ggPSAzNDsgIC8qIEphcGFuIE1NQUMgKi8gICBicmVhazsgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNTE5MDAwMDogICAgY2ggPSAzODsgIC8qIEphcGFuIE1NQUMgKi8gICBicmVhazsgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNTIxMDAwMDogICAgY2ggPSA0MjsgIC8qIEphcGFuIE1NQUMgKi8gICBicmVhazsgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNTIzMDAwMDogICAgY2ggPSA0NjsgIC8qIEphcGFuIE1NQUMgKi8gICBicmVhazsgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNDkyMDAwMDogICAgY2ggPSAxODQ7IC8qIEphcGFuICovICBicmVhazsgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNDk0MDAwMDogICAgY2ggPSAxODg7IC8qIEphcGFuICovICBicmVhazsgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNDk2MDAwMDogICAgY2ggPSAxOTI7IC8qIEphcGFuICovICBicmVhazsgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNDk4MDAwMDogICAgY2ggPSAxOTY7IC8qIEphcGFuICovICBicmVhazsgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNTA0MDAwMDogICAgY2ggPSAyMDg7IC8qIEphcGFuLCBtZWFucyBKMDggKi8gIGJyZWFrOyAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA1MDYwMDAwOiAgICBjaCA9IDIxMjsgLyogSmFwYW4sIG1lYW5zIEoxMiAqLyAgYnJlYWs7ICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDUwODAwMDA6ICAgIGNoID0gMjE2OyAvKiBKYXBhbiwgbWVhbnMgSjE2ICovICBicmVhazsgICBcCisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgY2ggPSAxOyAgICAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9CisKKy8vCisvLyBDb21tb24gZnJhZ21lbnQgbGlzdCBzdHJ1Y3R1cmUgLSAgSWRlbnRpY2FsIHRvIHRoZSBzY2F0dGVyIGdhdGhlciBmcmFnIGxpc3Qgc3RydWN0dXJlCisvLworLy8jZGVmaW5lIFJUTVBfU0NBVFRFUl9HQVRIRVJfRUxFTUVOVCAgICAgICAgIFNDQVRURVJfR0FUSEVSX0VMRU1FTlQKKy8vI2RlZmluZSBQUlRNUF9TQ0FUVEVSX0dBVEhFUl9FTEVNRU5UICAgICAgICBQU0NBVFRFUl9HQVRIRVJfRUxFTUVOVAorI2RlZmluZSBOSUNfTUFYX1BIWVNfQlVGX0NPVU5UICAgICAgICAgICAgICA4CisKK3R5cGVkZWYgc3RydWN0IF9SVE1QX1NDQVRURVJfR0FUSEVSX0VMRU1FTlQgeworICAgIFBWT0lECQlBZGRyZXNzOworICAgIFVMT05HCQlMZW5ndGg7CisgICAgUFVMT05HCQlSZXNlcnZlZDsKK30gUlRNUF9TQ0FUVEVSX0dBVEhFUl9FTEVNRU5ULCAqUFJUTVBfU0NBVFRFUl9HQVRIRVJfRUxFTUVOVDsKKworCit0eXBlZGVmIHN0cnVjdCBfUlRNUF9TQ0FUVEVSX0dBVEhFUl9MSVNUIHsKKyAgICBVTE9ORyAgTnVtYmVyT2ZFbGVtZW50czsKKyAgICBQVUxPTkcgUmVzZXJ2ZWQ7CisgICAgUlRNUF9TQ0FUVEVSX0dBVEhFUl9FTEVNRU5UIEVsZW1lbnRzW05JQ19NQVhfUEhZU19CVUZfQ09VTlRdOworfSBSVE1QX1NDQVRURVJfR0FUSEVSX0xJU1QsICpQUlRNUF9TQ0FUVEVSX0dBVEhFUl9MSVNUOworCisvLworLy8gIFNvbWUgdXRpbGl0eSBtYWNyb3MKKy8vCisjaWZuZGVmIG1pbgorI2RlZmluZSBtaW4oX2EsIF9iKSAgICAgKCgoX2EpIDwgKF9iKSkgPyAoX2EpIDogKF9iKSkKKyNlbmRpZgorCisjaWZuZGVmIG1heAorI2RlZmluZSBtYXgoX2EsIF9iKSAgICAgKCgoX2EpID4gKF9iKSkgPyAoX2EpIDogKF9iKSkKKyNlbmRpZgorCisjZGVmaW5lIEdFVF9MTkFfR0FJTihfcEFkKQkoKF9wQWQtPkxhdGNoUmZSZWdzLkNoYW5uZWwgPD0gMTQpID8gKF9wQWQtPkJMTkFHYWluKSA6ICgoX3BBZC0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbCA8PSA2NCkgPyAoX3BBZC0+QUxOQUdhaW4wKSA6ICgoX3BBZC0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbCA8PSAxMjgpID8gKF9wQWQtPkFMTkFHYWluMSkgOiAoX3BBZC0+QUxOQUdhaW4yKSkpKQorCisjZGVmaW5lIElOQ19DT1VOVEVSNjQoVmFsKSAgICAgICAgICAoVmFsLlF1YWRQYXJ0KyspCisKKyNkZWZpbmUgSU5GUkFfT04oX3ApICAgICAgICAgICAgICAgIChPUFNUQVRVU19URVNUX0ZMQUcoX3AsIGZPUF9TVEFUVVNfSU5GUkFfT04pKQorI2RlZmluZSBBREhPQ19PTihfcCkgICAgICAgICAgICAgICAgKE9QU1RBVFVTX1RFU1RfRkxBRyhfcCwgZk9QX1NUQVRVU19BREhPQ19PTikpCisjZGVmaW5lIE1PTklUT1JfT04oX3ApICAgICAgICAgICAgICAoKChfcCktPlN0YUNmZy5Cc3NUeXBlKSA9PSBCU1NfTU9OSVRPUikKKyNkZWZpbmUgSURMRV9PTihfcCkgICAgICAgICAgICAgICAgICghSU5GUkFfT04oX3ApICYmICFBREhPQ19PTihfcCkpCisKKy8vIENoZWNrIExFQVAgJiBDQ0tNIGZsYWdzCisjZGVmaW5lIExFQVBfT04oX3ApICAgICAgICAgICAgICAgICAoKChfcCktPlN0YUNmZy5MZWFwQXV0aE1vZGUpID09IENJU0NPX0F1dGhNb2RlTEVBUCkKKyNkZWZpbmUgTEVBUF9DQ0tNX09OKF9wKSAgICAgICAgICAgICgoKChfcCktPlN0YUNmZy5MZWFwQXV0aE1vZGUpID09IENJU0NPX0F1dGhNb2RlTEVBUCkgJiYgKChfcCktPlN0YUNmZy5MZWFwQXV0aEluZm8uQ0NLTSA9PSBUUlVFKSkKKworLy8gaWYgb3JnaW5hbCBFdGhlcm5ldCBmcmFtZSBjb250YWlucyBubyBMTEMvU05BUCwgdGhlbiBhbiBleHRyYSBMTEMvU05BUCBlbmNhcCBpcyByZXF1aXJlZAorI2RlZmluZSBFWFRSQV9MTENTTkFQX0VOQ0FQX0ZST01fUEtUX1NUQVJUKF9wQnVmVkEsIF9wRXh0cmFMbGNTbmFwRW5jYXApCQlcCit7CQkJCQkJCQkJCQkJCQkJCVwKKwlpZiAoKCgqKF9wQnVmVkEgKyAxMikgPDwgOCkgKyAqKF9wQnVmVkEgKyAxMykpID4gMTUwMCkJCVwKKwl7CQkJCQkJCQkJCQkJCQkJXAorCQlfcEV4dHJhTGxjU25hcEVuY2FwID0gU05BUF84MDJfMUg7CQkJCQkJXAorCQlpZiAoTmRpc0VxdWFsTWVtb3J5KElQWCwgX3BCdWZWQSArIDEyLCAyKSB8fCAJCQlcCisJCQlOZGlzRXF1YWxNZW1vcnkoQVBQTEVfVEFMSywgX3BCdWZWQSArIDEyLCAyKSkJCVwKKwkJewkJCQkJCQkJCQkJCQkJXAorCQkJX3BFeHRyYUxsY1NuYXBFbmNhcCA9IFNOQVBfQlJJREdFX1RVTk5FTDsJCQlcCisJCX0JCQkJCQkJCQkJCQkJCVwKKwl9CQkJCQkJCQkJCQkJCQkJXAorCWVsc2UJCQkJCQkJCQkJCQkJCVwKKwl7CQkJCQkJCQkJCQkJCQkJXAorCQlfcEV4dHJhTGxjU25hcEVuY2FwID0gTlVMTDsJCQkJCQkJCVwKKwl9CQkJCQkJCQkJCQkJCQkJXAorfQorCisvLyBOZXcgRGVmaW5lIGZvciBuZXcgVHggUGF0aC4KKyNkZWZpbmUgRVhUUkFfTExDU05BUF9FTkNBUF9GUk9NX1BLVF9PRkZTRVQoX3BCdWZWQSwgX3BFeHRyYUxsY1NuYXBFbmNhcCkJXAorewkJCQkJCQkJCQkJCQkJCQlcCisJaWYgKCgoKihfcEJ1ZlZBKSA8PCA4KSArICooX3BCdWZWQSArIDEpKSA+IDE1MDApCQkJXAorCXsJCQkJCQkJCQkJCQkJCQlcCisJCV9wRXh0cmFMbGNTbmFwRW5jYXAgPSBTTkFQXzgwMl8xSDsJCQkJCQlcCisJCWlmIChOZGlzRXF1YWxNZW1vcnkoSVBYLCBfcEJ1ZlZBLCAyKSB8fCAJCQkJXAorCQkJTmRpc0VxdWFsTWVtb3J5KEFQUExFX1RBTEssIF9wQnVmVkEsIDIpKQkJCVwKKwkJewkJCQkJCQkJCQkJCQkJXAorCQkJX3BFeHRyYUxsY1NuYXBFbmNhcCA9IFNOQVBfQlJJREdFX1RVTk5FTDsJCQlcCisJCX0JCQkJCQkJCQkJCQkJCVwKKwl9CQkJCQkJCQkJCQkJCQkJXAorCWVsc2UJCQkJCQkJCQkJCQkJCVwKKwl7CQkJCQkJCQkJCQkJCQkJXAorCQlfcEV4dHJhTGxjU25hcEVuY2FwID0gTlVMTDsJCQkJCQkJCVwKKwl9CQkJCQkJCQkJCQkJCQkJXAorfQorCisKKyNkZWZpbmUgTUFLRV84MDJfM19IRUFERVIoX3AsIF9wTWFjMSwgX3BNYWMyLCBfcFR5cGUpICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBOZGlzTW92ZU1lbW9yeShfcCwgX3BNYWMxLCBNQUNfQUREUl9MRU4pOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBOZGlzTW92ZU1lbW9yeSgoX3AgKyBNQUNfQUREUl9MRU4pLCBfcE1hYzIsIE1BQ19BRERSX0xFTik7ICAgICAgICAgIFwKKyAgICBOZGlzTW92ZU1lbW9yeSgoX3AgKyBNQUNfQUREUl9MRU4gKiAyKSwgX3BUeXBlLCBMRU5HVEhfODAyXzNfVFlQRSk7IFwKK30KKworLy8gaWYgcERhdGEgaGFzIG5vIExMQy9TTkFQIChuZWl0aGVyIFJGQzEwNDIgbm9yIEJyaWRnZSB0dW5uZWwpLCBrZWVwIGl0IHRoYXQgd2F5LgorLy8gZWxzZSBpZiB0aGUgcmVjZWl2ZWQgZnJhbWUgaXMgTExDL1NOQVAtZW5jYXBlZCBJUFggb3IgQVBQTEVUQUxLLCBwcmVzZXJ2ZSB0aGUgTExDL1NOQVAgZmllbGQKKy8vIGVsc2UgcmVtb3ZlIHRoZSBMTEMvU05BUCBmaWVsZCBmcm9tIHRoZSByZXN1bHQgRXRoZXJuZXQgZnJhbWUKKy8vIFBhdGNoIGZvciBXSFFMIG9ubHksIHdoaWNoIGRpZCBub3QgdHVybiBvbiBOZXRiaW9zIGJ1dCB1c2UgSVBYIHdpdGhpbiBpdHMgcGF5bG9hZAorLy8gTm90ZToKKy8vICAgICBfcERhdGEgJiBfRGF0YVNpemUgbWF5IGJlIGFsdGVyZWQgKHJlbW92ZSA4LWJ5dGUgTExDL1NOQVApIGJ5IHRoaXMgTUFDUk8KKy8vICAgICBfcFJlbW92ZWRMTENTTkFQOiBwb2ludGVyIHRvIHJlbW92ZWQgTExDL1NOQVA7IE5VTEwgaXMgbm90IHJlbW92ZWQKKyNkZWZpbmUgQ09OVkVSVF9UT184MDJfMyhfcDgwMjNoZHIsIF9wREEsIF9wU0EsIF9wRGF0YSwgX0RhdGFTaXplLCBfcFJlbW92ZWRMTENTTkFQKSAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjaGFyIExMQ19MZW5bMl07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfcFJlbW92ZWRMTENTTkFQID0gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoTmRpc0VxdWFsTWVtb3J5KFNOQVBfODAyXzFILCBfcERhdGEsIDYpICB8fCAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgTmRpc0VxdWFsTWVtb3J5KFNOQVBfQlJJREdFX1RVTk5FTCwgX3BEYXRhLCA2KSkgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgUFVDSEFSIHBQcm90byA9IF9wRGF0YSArIDY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKChOZGlzRXF1YWxNZW1vcnkoSVBYLCBwUHJvdG8sIDIpIHx8IE5kaXNFcXVhbE1lbW9yeShBUFBMRV9UQUxLLCBwUHJvdG8sIDIpKSAmJiAgXAorICAgICAgICAgICAgTmRpc0VxdWFsTWVtb3J5KFNOQVBfODAyXzFILCBfcERhdGEsIDYpKSAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgTExDX0xlblswXSA9IChVQ0hBUikoX0RhdGFTaXplIC8gMjU2KTsgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgTExDX0xlblsxXSA9IChVQ0hBUikoX0RhdGFTaXplICUgMjU2KTsgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgTUFLRV84MDJfM19IRUFERVIoX3A4MDIzaGRyLCBfcERBLCBfcFNBLCBMTENfTGVuKTsgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgTUFLRV84MDJfM19IRUFERVIoX3A4MDIzaGRyLCBfcERBLCBfcFNBLCBwUHJvdG8pOyAgICAgICAgICAgXAorICAgICAgICAgICAgX3BSZW1vdmVkTExDU05BUCA9IF9wRGF0YTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgX0RhdGFTaXplIC09IExFTkdUSF84MDJfMV9IOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgX3BEYXRhICs9IExFTkdUSF84MDJfMV9IOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBMTENfTGVuWzBdID0gKFVDSEFSKShfRGF0YVNpemUgLyAyNTYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBMTENfTGVuWzFdID0gKFVDSEFSKShfRGF0YVNpemUgJSAyNTYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBNQUtFXzgwMl8zX0hFQURFUihfcDgwMjNoZHIsIF9wREEsIF9wU0EsIExMQ19MZW4pOyAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjZGVmaW5lIFNXSVRDSF9BQiggX3BBQSwgX3BCQikgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBQVk9JRCBwQ0M7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBwQ0MgPSBfcEJCOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX3BCQiA9IF9wQUE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfcEFBID0gcENDOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKy8vIEVucXVldWUgdGhpcyBmcmFtZSB0byBNTE1FIGVuZ2luZQorLy8gV2UgbmVlZCB0byBlbnF1ZXVlIHRoZSB3aG9sZSBmcmFtZSBiZWNhdXNlIE1MTUUgbmVlZCB0byBwYXNzIGRhdGEgdHlwZQorLy8gaW5mb3JtYXRpb24gZnJvbSA4MDIuMTEgaGVhZGVyCisjaWZkZWYgUlQyODcwCisjZGVmaW5lIFJFUE9SVF9NR01UX0ZSQU1FX1RPX01MTUUoX3BBZCwgV2NpZCwgX3BGcmFtZSwgX0ZyYW1lU2l6ZSwgX1Jzc2kwLCBfUnNzaTEsIF9Sc3NpMiwgX1BsY3BTaWduYWwpICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFVJTlQzMiBIaWdoMzJUU0Y9MCwgTG93MzJUU0Y9MDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE1sbWVFbnF1ZXVlRm9yUmVjdihfcEFkLCBXY2lkLCBIaWdoMzJUU0YsIExvdzMyVFNGLCAoVUNIQVIpX1Jzc2kwLCAoVUNIQVIpX1Jzc2kxLChVQ0hBUilfUnNzaTIsX0ZyYW1lU2l6ZSwgX3BGcmFtZSwgKFVDSEFSKV9QbGNwU2lnbmFsKTsgICBcCit9CisjZW5kaWYgLy8gUlQyODcwIC8vCisKKyNkZWZpbmUgTkRJU19RVUVSWV9CVUZGRVIoX05kaXNCdWYsIF9wcFZBLCBfcEJ1ZkxlbikgICAgICAgICAgICAgICAgICAgIFwKKyAgICBOZGlzUXVlcnlCdWZmZXIoX05kaXNCdWYsIF9wcFZBLCBfcEJ1ZkxlbikKKworI2RlZmluZSBNQUNfQUREUl9FUVVBTChwQWRkcjEscEFkZHIyKSAgICAgICAgICAgUlRNUEVxdWFsTWVtb3J5KChQVk9JRCkocEFkZHIxKSwgKFBWT0lEKShwQWRkcjIpLCBNQUNfQUREUl9MRU4pCisjZGVmaW5lIFNTSURfRVFVQUwoc3NpZDEsIGxlbjEsIHNzaWQyLCBsZW4yKSAgICAoKGxlbjE9PWxlbjIpICYmIChSVE1QRXF1YWxNZW1vcnkoc3NpZDEsIHNzaWQyLCBsZW4xKSkpCisKKy8vCisvLyBDaGVjayBpZiBpdCBpcyBKYXBhbiBXNTMoY2g1Miw1Niw2MCw2NCkgY2hhbm5lbC4KKy8vCisjZGVmaW5lIEphcGFuQ2hhbm5lbENoZWNrKGNoYW5uZWwpICAoKGNoYW5uZWwgPT0gNTIpIHx8IChjaGFubmVsID09IDU2KSB8fCAoY2hhbm5lbCA9PSA2MCkgfHwgKGNoYW5uZWwgPT0gNjQpKQorCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisjZGVmaW5lIFNUQV9QT1JUX1NFQ1VSRUQoX3BBZCkgXAoreyBcCisJX3BBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQ7IFwKKwlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZfcEFkLT5NYWNUYWJMb2NrKTsgXAorCV9wQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlBvcnRTZWN1cmVkID0gX3BBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkOyBcCisJTmRpc1JlbGVhc2VTcGluTG9jaygmX3BBZC0+TWFjVGFiTG9jayk7IFwKK30KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCisvLworLy8gUmVnaXN0ZXIgc2V0IHBhaXIgZm9yIGluaXRpYWx6YXRpb24gcmVnaXN0ZXIgc2V0IGRlZmluaXRpb24KKy8vCit0eXBlZGVmIHN0cnVjdCAgX1JUTVBfUkVHX1BBSVIKK3sKKwlVTE9ORyAgIFJlZ2lzdGVyOworCVVMT05HICAgVmFsdWU7Cit9IFJUTVBfUkVHX1BBSVIsICpQUlRNUF9SRUdfUEFJUjsKKwordHlwZWRlZiBzdHJ1Y3QgIF9SRUdfUEFJUgoreworCVVDSEFSICAgUmVnaXN0ZXI7CisJVUNIQVIgICBWYWx1ZTsKK30gUkVHX1BBSVIsICpQUkVHX1BBSVI7CisKKy8vCisvLyBSZWdpc3RlciBzZXQgcGFpciBmb3IgaW5pdGlhbHphdGlvbiByZWdpc3RlciBzZXQgZGVmaW5pdGlvbgorLy8KK3R5cGVkZWYgc3RydWN0ICBfUlRNUF9SRl9SRUdTCit7CisJVUNIQVIgICBDaGFubmVsOworCVVMT05HICAgUjE7CisJVUxPTkcgICBSMjsKKwlVTE9ORyAgIFIzOworCVVMT05HICAgUjQ7Cit9IFJUTVBfUkZfUkVHUywgKlBSVE1QX1JGX1JFR1M7CisKK3R5cGVkZWYgc3RydWN0IF9GUkVRVUVOQ1lfSVRFTSB7CisJVUNIQVIJQ2hhbm5lbDsKKwlVQ0hBUglOOworCVVDSEFSCVI7CisJVUNIQVIJSzsKK30gRlJFUVVFTkNZX0lURU0sICpQRlJFUVVFTkNZX0lURU07CisKKy8vCisvLyAgRGF0YSBidWZmZXIgZm9yIERNQSBvcGVyYXRpb24sIHRoZSBidWZmZXIgbXVzdCBiZSBjb250aWd1b3VzIHBoeXNpY2FsIG1lbW9yeQorLy8gIEJvdGggRE1BIHRvIC8gZnJvbSBDUFUgdXNlIHRoZSBzYW1lIHN0cnVjdHVyZS4KKy8vCit0eXBlZGVmIHN0cnVjdCAgX1JUTVBfRE1BQlVGCit7CisJVUxPTkcgICAgICAgICAgICAgICAgICAgQWxsb2NTaXplOworCVBWT0lEICAgICAgICAgICAgICAgICAgIEFsbG9jVmE7ICAgICAgICAgICAgLy8gVHhCdWYgdmlydHVhbCBhZGRyZXNzCisJTkRJU19QSFlTSUNBTF9BRERSRVNTICAgQWxsb2NQYTsgICAgICAgICAgICAvLyBUeEJ1ZiBwaHlzaWNhbCBhZGRyZXNzCit9IFJUTVBfRE1BQlVGLCAqUFJUTVBfRE1BQlVGOworCisKK3R5cGVkZWYJdW5pb24JX0hFQURFUl84MDJfMTFfU0VReworI2lmZGVmIFJUX0JJR19FTkRJQU4KKyAgICBzdHJ1Y3QgeworICAgCVVTSE9SVAkJCVNlcXVlbmNlOjEyOworCVVTSE9SVAkJCUZyYWc6NDsKKyAgICB9ICAgZmllbGQ7CisjZWxzZQorICAgIHN0cnVjdCB7CisJVVNIT1JUCQkJRnJhZzo0OworCVVTSE9SVAkJCVNlcXVlbmNlOjEyOworICAgIH0gICBmaWVsZDsKKyNlbmRpZgorICAgIFVTSE9SVCAgICAgICAgICAgdmFsdWU7Cit9CUhFQURFUl84MDJfMTFfU0VRLCAqUEhFQURFUl84MDJfMTFfU0VROworCisvLworLy8gIERhdGEgYnVmZmVyIGZvciBETUEgb3BlcmF0aW9uLCB0aGUgYnVmZmVyIG11c3QgYmUgY29udGlndW91cyBwaHlzaWNhbCBtZW1vcnkKKy8vICBCb3RoIERNQSB0byAvIGZyb20gQ1BVIHVzZSB0aGUgc2FtZSBzdHJ1Y3R1cmUuCisvLwordHlwZWRlZiBzdHJ1Y3QgIF9SVE1QX1JFT1JERVJCVUYKK3sKKwlCT09MRUFOCQkJSXNGdWxsOworCVBWT0lEICAgICAgICAgICAgICAgICAgIEFsbG9jVmE7ICAgICAgICAgICAgLy8gVHhCdWYgdmlydHVhbCBhZGRyZXNzCisJVUNIQVIJCQlIZWFkZXI4MDJfM1sxNF07CisJSEVBREVSXzgwMl8xMV9TRVEJCQlTZXF1ZW5jZTsJLy9zdXBwb3J0IGNvbXByZXNzZWQgYml0bWFwIEJBLCBzbyBubyBjb25zaWRlciBmcmFnbWVudCBpbiBCQQorCVVDSEFSIAkJRGF0YU9mZnNldDsKKwlVU0hPUlQgCQlEYXRhc2l6ZTsKKwlVTE9ORyAgICAgICAgICAgICAgICAgICBBbGxvY1NpemU7CisjaWZkZWYgUlQyODcwCisJUFVDSEFSCQkJCQlBbGxvY1BhOworI2VuZGlmIC8vIFJUMjg3MCAvLworfSAgIFJUTVBfUkVPUkRFUkJVRiwgKlBSVE1QX1JFT1JERVJCVUY7CisKKy8vCisvLyBDb250cm9sIGJsb2NrIChEZXNjcmlwdG9yKSBmb3IgYWxsIHJpbmcgZGVzY3JpcHRvciBETUEgb3BlcmF0aW9uLCBidWZmZXIgbXVzdCBiZQorLy8gY29udGlndW91cyBwaHlzaWNhbCBtZW1vcnkuIE5ESVNfUEFDS0VUIHN0b3JlZCB0aGUgYmluZGluZyBSeCBwYWNrZXQgZGVzY3JpcHRvcgorLy8gd2hpY2ggd29uJ3QgYmUgcmVsZWFzZWQsIGRyaXZlciBoYXMgdG8gd2FpdCB1bnRpbCB1cHBlciBsYXllciByZXR1cm4gdGhlIHBhY2tldAorLy8gYmVmb3JlIGdpdmVpbmcgdXAgdGhpcyByeCByaW5nIGRlc2NyaXB0b3IgdG8gQVNJQy4gTkRJU19CVUZGRVIgaXMgYXNzb2NhaXRlZCBwYWlyCisvLyB0byBkZXNjcmliZSB0aGUgcGFja2V0IGJ1ZmZlci4gRm9yIFR4LCBORElTX1BBQ0tFVCBzdG9yZWQgdGhlIHR4IHBhY2tldCBkZXNjcmlwdG9yCisvLyB3aGljaCBkcml2ZXIgc2hvdWxkIEFDSyB1cHBlciBsYXllciB3aGVuIHRoZSB0eCBpcyBwaHlzaWNhbGx5IGRvbmUgb3IgZmFpbGVkLgorLy8KK3R5cGVkZWYgc3RydWN0IF9SVE1QX0RNQUNCCit7CisJVUxPTkcgICAgICAgICAgICAgICAgICAgQWxsb2NTaXplOyAgICAgICAgICAvLyBDb250cm9sIGJsb2NrIHNpemUKKwlQVk9JRCAgICAgICAgICAgICAgICAgICBBbGxvY1ZhOyAgICAgICAgICAgIC8vIENvbnRyb2wgYmxvY2sgdmlydHVhbCBhZGRyZXNzCisJTkRJU19QSFlTSUNBTF9BRERSRVNTICAgQWxsb2NQYTsgICAgICAgICAgICAvLyBDb250cm9sIGJsb2NrIHBoeXNpY2FsIGFkZHJlc3MKKwlQTkRJU19QQUNLRVQgcE5kaXNQYWNrZXQ7CisJUE5ESVNfUEFDS0VUIHBOZXh0TmRpc1BhY2tldDsKKworCVJUTVBfRE1BQlVGICAgICAgICAgICAgIERtYUJ1ZjsgICAgICAgICAgICAgLy8gQXNzb2NpYXRlZCBETUEgYnVmZmVyIHN0cnVjdHVyZQorfSBSVE1QX0RNQUNCLCAqUFJUTVBfRE1BQ0I7CisKK3R5cGVkZWYgc3RydWN0IF9SVE1QX1RYX0JVRgoreworCVBRVUVVRV9FTlRSWSAgICBOZXh0OworCVVDSEFSICAgICAgICAgICBJbmRleDsKKwlVTE9ORyAgICAgICAgICAgICAgICAgICBBbGxvY1NpemU7ICAgICAgICAgIC8vIENvbnRyb2wgYmxvY2sgc2l6ZQorCVBWT0lEICAgICAgICAgICAgICAgICAgIEFsbG9jVmE7ICAgICAgICAgICAgLy8gQ29udHJvbCBibG9jayB2aXJ0dWFsIGFkZHJlc3MKKwlORElTX1BIWVNJQ0FMX0FERFJFU1MgICBBbGxvY1BhOyAgICAgICAgICAgIC8vIENvbnRyb2wgYmxvY2sgcGh5c2ljYWwgYWRkcmVzcworfSBSVE1QX1RYQlVGLCAqUFJUTVBfVFhCVUY7CisKK3R5cGVkZWYgc3RydWN0IF9SVE1QX1JYX0JVRgoreworCUJPT0xFQU4gICAgICAgICAgIEluVXNlOworCVVMT05HICAgICAgICAgICAJQnlCYVJlY0luZGV4OworCVJUTVBfUkVPUkRFUkJVRglNQVBfUlhCdWZbTUFYX1JYX1JFT1JERVJCVUZdOworfSBSVE1QX1JYQlVGLCAqUFJUTVBfUlhCVUY7Cit0eXBlZGVmIHN0cnVjdCBfUlRNUF9UWF9SSU5HCit7CisJUlRNUF9ETUFDQiAgQ2VsbFtUWF9SSU5HX1NJWkVdOworCVVJTlQzMgkJVHhDcHVJZHg7CisJVUlOVDMyCQlUeERtYUlkeDsKKwlVSU5UMzIJCVR4U3dGcmVlSWR4OyAJLy8gc29mdHdhcmUgbmV4dCBmcmVlIHR4IGluZGV4Cit9IFJUTVBfVFhfUklORywgKlBSVE1QX1RYX1JJTkc7CisKK3R5cGVkZWYgc3RydWN0IF9SVE1QX1JYX1JJTkcKK3sKKwlSVE1QX0RNQUNCICBDZWxsW1JYX1JJTkdfU0laRV07CisJVUlOVDMyCQlSeENwdUlkeDsKKwlVSU5UMzIJCVJ4RG1hSWR4OworCUlOVDMyCQlSeFN3UmVhZElkeDsgCS8vIHNvZnR3YXJlIG5leHQgcmVhZCBpbmRleAorfSBSVE1QX1JYX1JJTkcsICpQUlRNUF9SWF9SSU5HOworCit0eXBlZGVmIHN0cnVjdCBfUlRNUF9NR01UX1JJTkcKK3sKKwlSVE1QX0RNQUNCICBDZWxsW01HTVRfUklOR19TSVpFXTsKKwlVSU5UMzIJCVR4Q3B1SWR4OworCVVJTlQzMgkJVHhEbWFJZHg7CisJVUlOVDMyCQlUeFN3RnJlZUlkeDsgLy8gc29mdHdhcmUgbmV4dCBmcmVlIHR4IGluZGV4Cit9IFJUTVBfTUdNVF9SSU5HLCAqUFJUTVBfTUdNVF9SSU5HOworCisvLworLy8gIFN0YXRpc3RpYyBjb3VudGVyIHN0cnVjdHVyZQorLy8KK3R5cGVkZWYgc3RydWN0IF9DT1VOVEVSXzgwMl8zCit7CisJLy8gR2VuZXJhbCBTdGF0cworCVVMT05HICAgICAgIEdvb2RUcmFuc21pdHM7CisJVUxPTkcgICAgICAgR29vZFJlY2VpdmVzOworCVVMT05HICAgICAgIFR4RXJyb3JzOworCVVMT05HICAgICAgIFJ4RXJyb3JzOworCVVMT05HICAgICAgIFJ4Tm9CdWZmZXI7CisKKwkvLyBFdGhlcm5ldCBTdGF0cworCVVMT05HICAgICAgIFJjdkFsaWdubWVudEVycm9yczsKKwlVTE9ORyAgICAgICBPbmVDb2xsaXNpb247CisJVUxPTkcgICAgICAgTW9yZUNvbGxpc2lvbnM7CisKK30gQ09VTlRFUl84MDJfMywgKlBDT1VOVEVSXzgwMl8zOworCit0eXBlZGVmIHN0cnVjdCBfQ09VTlRFUl84MDJfMTEgeworCVVMT05HICAgICAgICAgICBMZW5ndGg7CisJTEFSR0VfSU5URUdFUiAgIExhc3RUcmFuc21pdHRlZEZyYWdtZW50Q291bnQ7CisJTEFSR0VfSU5URUdFUiAgIFRyYW5zbWl0dGVkRnJhZ21lbnRDb3VudDsKKwlMQVJHRV9JTlRFR0VSICAgTXVsdGljYXN0VHJhbnNtaXR0ZWRGcmFtZUNvdW50OworCUxBUkdFX0lOVEVHRVIgICBGYWlsZWRDb3VudDsKKwlMQVJHRV9JTlRFR0VSICAgUmV0cnlDb3VudDsKKwlMQVJHRV9JTlRFR0VSICAgTXVsdGlwbGVSZXRyeUNvdW50OworCUxBUkdFX0lOVEVHRVIgICBSVFNTdWNjZXNzQ291bnQ7CisJTEFSR0VfSU5URUdFUiAgIFJUU0ZhaWx1cmVDb3VudDsKKwlMQVJHRV9JTlRFR0VSICAgQUNLRmFpbHVyZUNvdW50OworCUxBUkdFX0lOVEVHRVIgICBGcmFtZUR1cGxpY2F0ZUNvdW50OworCUxBUkdFX0lOVEVHRVIgICBSZWNlaXZlZEZyYWdtZW50Q291bnQ7CisJTEFSR0VfSU5URUdFUiAgIE11bHRpY2FzdFJlY2VpdmVkRnJhbWVDb3VudDsKKwlMQVJHRV9JTlRFR0VSICAgRkNTRXJyb3JDb3VudDsKK30gQ09VTlRFUl84MDJfMTEsICpQQ09VTlRFUl84MDJfMTE7CisKK3R5cGVkZWYgc3RydWN0IF9DT1VOVEVSX1JBTElOSyB7CisJVUxPTkcgICAgICAgICAgIFRyYW5zbWl0dGVkQnl0ZUNvdW50OyAgIC8vIGJvdGggc3VjY2Vzc2Z1bCBhbmQgZmFpbHVyZSwgdXNlZCB0byBjYWxjdWxhdGUgVFggdGhyb3VnaHB1dAorCVVMT05HICAgICAgICAgICBSZWNlaXZlZEJ5dGVDb3VudDsgICAgICAvLyBib3RoIENSQyBva2F5IGFuZCBDUkMgZXJyb3IsIHVzZWQgdG8gY2FsY3VsYXRlIFJYIHRocm91Z2hwdXQKKwlVTE9ORyAgICAgICAgICAgQmVlbkRpc2Fzc29jaWF0ZWRDb3VudDsKKwlVTE9ORyAgICAgICAgICAgQmFkQ1FJQXV0b1JlY292ZXJ5Q291bnQ7CisJVUxPTkcgICAgICAgICAgIFBvb3JDUUlSb2FtaW5nQ291bnQ7CisJVUxPTkcgICAgICAgICAgIE1nbXRSaW5nRnVsbENvdW50OworCVVMT05HICAgICAgICAgICBSeENvdW50U2luY2VMYXN0TlVMTDsKKwlVTE9ORyAgICAgICAgICAgUnhDb3VudDsKKwlVTE9ORyAgICAgICAgICAgUnhSaW5nRXJyQ291bnQ7CisJVUxPTkcgICAgICAgICAgIEtpY2tUeENvdW50OworCVVMT05HICAgICAgICAgICBUeFJpbmdFcnJDb3VudDsKKwlMQVJHRV9JTlRFR0VSICAgUmVhbEZjc0VyckNvdW50OworCVVMT05HICAgICAgICAgICBQZW5kaW5nTmRpc1BhY2tldENvdW50OworCisJVUxPTkcgICAgICAgICAgIE9uZVNlY09zVHhDb3VudFtOVU1fT0ZfVFhfUklOR107CisJVUxPTkcgICAgICAgICAgIE9uZVNlY0RtYURvbmVDb3VudFtOVU1fT0ZfVFhfUklOR107CisJVUlOVDMyICAgICAgICAgIE9uZVNlY1R4RG9uZUNvdW50OworCVVMT05HICAgICAgICAgICBPbmVTZWNSeENvdW50OworCVVJTlQzMiAgICAgICAgICBPbmVTZWNUeEFnZ3JlZ2F0aW9uQ291bnQ7CisJVUlOVDMyICAgICAgICAgIE9uZVNlY1J4QWdncmVnYXRpb25Db3VudDsKKworCVVJTlQzMiAgIAkJT25lU2VjRnJhbWVEdXBsaWNhdGVDb3VudDsKKworI2lmZGVmIFJUMjg3MAorCVVMT05HICAgICAgICAgICBPbmVTZWNUcmFuc21pdHRlZEJ5dGVDb3VudDsgICAvLyBib3RoIHN1Y2Nlc3NmdWwgYW5kIGZhaWx1cmUsIHVzZWQgdG8gY2FsY3VsYXRlIFRYIHRocm91Z2hwdXQKKyNlbmRpZiAvLyBSVDI4NzAgLy8KKworCVVJTlQzMiAgICAgICAgICBPbmVTZWNUeE5vUmV0cnlPa0NvdW50OworCVVJTlQzMiAgICAgICAgICBPbmVTZWNUeFJldHJ5T2tDb3VudDsKKwlVSU5UMzIgICAgICAgICAgT25lU2VjVHhGYWlsQ291bnQ7CisJVUlOVDMyICAgICAgICAgIE9uZVNlY0ZhbHNlQ0NBQ250OyAgICAgIC8vIENDQSBlcnJvciBjb3VudCwgZm9yIGRlYnVnIHB1cnBvc2UsIG1pZ2h0IG1vdmUgdG8gZ2xvYmFsIGNvdW50ZXIKKwlVSU5UMzIgICAgICAgICAgT25lU2VjUnhPa0NudDsgICAgICAgICAgLy8gUlggd2l0aG91dCBlcnJvcgorCVVJTlQzMiAgICAgICAgICBPbmVTZWNSeE9rRGF0YUNudDsgICAgICAvLyB1bmljYXN0LXRvLW1lIERBVEEgZnJhbWUgY291bnQKKwlVSU5UMzIgICAgICAgICAgT25lU2VjUnhGY3NFcnJDbnQ7ICAgICAgLy8gQ1JDIGVycm9yCisJVUlOVDMyICAgICAgICAgIE9uZVNlY0JlYWNvblNlbnRDbnQ7CisJVUlOVDMyICAgICAgICAgIExhc3RPbmVTZWNUb3RhbFR4Q291bnQ7IC8vIE9uZVNlY1R4Tm9SZXRyeU9rQ291bnQgKyBPbmVTZWNUeFJldHJ5T2tDb3VudCArIE9uZVNlY1R4RmFpbENvdW50CisJVUlOVDMyICAgICAgICAgIExhc3RPbmVTZWNSeE9rRGF0YUNudDsgIC8vIE9uZVNlY1J4T2tEYXRhQ250CisJVUxPTkcJCUR1cGxpY2F0ZVJjdjsKKwlVTE9ORwkJVHhBZ2dDb3VudDsKKwlVTE9ORwkJVHhOb25BZ2dDb3VudDsKKwlVTE9ORwkJVHhBZ2cxTVBEVUNvdW50OworCVVMT05HCQlUeEFnZzJNUERVQ291bnQ7CisJVUxPTkcJCVR4QWdnM01QRFVDb3VudDsKKwlVTE9ORwkJVHhBZ2c0TVBEVUNvdW50OworCVVMT05HCQlUeEFnZzVNUERVQ291bnQ7CisJVUxPTkcJCVR4QWdnNk1QRFVDb3VudDsKKwlVTE9ORwkJVHhBZ2c3TVBEVUNvdW50OworCVVMT05HCQlUeEFnZzhNUERVQ291bnQ7CisJVUxPTkcJCVR4QWdnOU1QRFVDb3VudDsKKwlVTE9ORwkJVHhBZ2cxME1QRFVDb3VudDsKKwlVTE9ORwkJVHhBZ2cxMU1QRFVDb3VudDsKKwlVTE9ORwkJVHhBZ2cxMk1QRFVDb3VudDsKKwlVTE9ORwkJVHhBZ2cxM01QRFVDb3VudDsKKwlVTE9ORwkJVHhBZ2cxNE1QRFVDb3VudDsKKwlVTE9ORwkJVHhBZ2cxNU1QRFVDb3VudDsKKwlVTE9ORwkJVHhBZ2cxNk1QRFVDb3VudDsKKworCUxBUkdFX0lOVEVHRVIgICAgICAgVHJhbnNtaXR0ZWRPY3RldHNJbkFNU0RVOworCUxBUkdFX0lOVEVHRVIgICAgICAgVHJhbnNtaXR0ZWRBTVNEVUNvdW50OworCUxBUkdFX0lOVEVHRVIgICAgICAgUmVjZWl2ZWRPY3Rlc0luQU1TRFVDb3VudDsKKwlMQVJHRV9JTlRFR0VSICAgICAgIFJlY2VpdmVkQU1TRFVDb3VudDsKKwlMQVJHRV9JTlRFR0VSICAgICAgIFRyYW5zbWl0dGVkQU1QRFVDb3VudDsKKwlMQVJHRV9JTlRFR0VSICAgICAgIFRyYW5zbWl0dGVkTVBEVXNJbkFNUERVQ291bnQ7CisJTEFSR0VfSU5URUdFUiAgICAgICBUcmFuc21pdHRlZE9jdGV0c0luQU1QRFVDb3VudDsKKwlMQVJHRV9JTlRFR0VSICAgICAgIE1QRFVJblJlY2VpdmVkQU1QRFVDb3VudDsKK30gQ09VTlRFUl9SQUxJTkssICpQQ09VTlRFUl9SQUxJTks7CisKK3R5cGVkZWYgc3RydWN0IF9QSURfQ09VTlRFUiB7CisJVUxPTkcgICAgICAgICAgIFR4QWNrUmVxdWlyZWRDb3VudDsgICAgICAvLyBDUkMgZXJyb3IKKwlVTE9ORyAgICAgICAgICAgVHhBZ2dyZUNvdW50OworCVVMT05HICAgICAgICAgICBUeFN1Y2Nlc3NDb3VudDsgLy8gT25lU2VjVHhOb1JldHJ5T2tDb3VudCArIE9uZVNlY1R4UmV0cnlPa0NvdW50ICsgT25lU2VjVHhGYWlsQ291bnQKKwlVTE9ORwkJTGFzdFN1Y2Nlc3NSYXRlOworfSBQSURfQ09VTlRFUiwgKlBQSURfQ09VTlRFUjsKKwordHlwZWRlZiBzdHJ1Y3QgX0NPVU5URVJfRFJTIHsKKwkvLyB0byByZWNvcmQgdGhlIGVhY2ggVFggcmF0ZSdzIHF1YWxpdHkuIDAgaXMgYmVzdCwgdGhlIGJpZ2dlciB0aGUgd29yc2UuCisJVVNIT1JUICAgICAgICAgIFR4UXVhbGl0eVtNQVhfU1RFUF9PRl9UWF9SQVRFX1NXSVRDSF07CisJVUNIQVIgICAgICAgICAgIFBFUltNQVhfU1RFUF9PRl9UWF9SQVRFX1NXSVRDSF07CisJVUNIQVIgICAgICAgICAgIFR4UmF0ZVVwUGVuYWx0eTsgICAgICAvLyBleHRyYSAjIG9mIHNlY29uZCBwZW5hbHR5IGR1ZSB0byBsYXN0IHVuc3RhYmxlIGNvbmRpdGlvbgorCVVMT05HICAgICAgICAgICBDdXJyVHhSYXRlU3RhYmxlVGltZTsgLy8gIyBvZiBzZWNvbmQgaW4gY3VycmVudCBUWCByYXRlCisJQk9PTEVBTiAgICAgICAgIGZOb2lzeUVudmlyb25tZW50OworCUJPT0xFQU4gICAgICAgICBmTGFzdFNlY0FjY29yZGluZ1JTU0k7CisJVUNIQVIgICAgICAgICAgIExhc3RTZWNUeFJhdGVDaGFuZ2VBY3Rpb247IC8vIDA6IG5vIGNoYW5nZSwgMTpyYXRlIFVQLCAyOnJhdGUgZG93bgorCVVDSEFSCQkJTGFzdFRpbWVUeFJhdGVDaGFuZ2VBY3Rpb247IC8vS2VlcCBsYXN0IHRpbWUgdmFsdWUgb2YgTGFzdFNlY1R4UmF0ZUNoYW5nZUFjdGlvbgorCVVMT05HCQkJTGFzdFR4T2tDb3VudDsKK30gQ09VTlRFUl9EUlMsICpQQ09VTlRFUl9EUlM7CisKKy8vCisvLyAgQXJjZm91ciBTdHJ1Y3R1cmUgQWRkZWQgYnkgUGF1bFd1CisvLwordHlwZWRlZiBzdHJ1Y3QgIF9BUkNGT1VSCit7CisJVUlOVCAgICAgICAgICAgIFg7CisJVUlOVCAgICAgICAgICAgIFk7CisJVUNIQVIgICAgICAgICAgIFNUQVRFWzI1Nl07Cit9IEFSQ0ZPVVJDT05URVhULCAqUEFSQ0ZPVVJDT05URVhUOworCisvLyBNSU1PIFR4IHBhcmFtZXRlciwgU2hvcnRHSSwgTUNTLCBTVEJDLCBldGMuICB0aGVzZSBhcmUgZmllbGRzIGluIFRYV0kgdG9vLiBqdXN0IGNvcHkgdG8gVFhXSS4KK3R5cGVkZWYgc3RydWN0ICBfUkVDRUlWRV9TRVRUSU5HIHsKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJVVNIT1JUCQlNSU1POjE7CisJVVNIT1JUCQlPRkRNOjE7CisJVVNIT1JUCQlyc3Y6MzsKKwlVU0hPUlQJCVNUQkM6MjsJLy9TUEFDRQorCVVTSE9SVAkJU2hvcnRHSToxOworCVVTSE9SVAkJTW9kZToyOwkvL2NoYW5uZWwgYmFuZHdpZHRoIDIwTUh6IG9yIDQwIE1IegorCVVTSE9SVCAgIAlOdW1PZlJYOjI7ICAgICAgICAgICAgICAgICAvLyBNSU1PLiBXRSBIQVZFIDNSCisjZWxzZQorCVVTSE9SVCAgIAlOdW1PZlJYOjI7ICAgICAgICAgICAgICAgICAvLyBNSU1PLiBXRSBIQVZFIDNSCisJVVNIT1JUCQlNb2RlOjI7CS8vY2hhbm5lbCBiYW5kd2lkdGggMjBNSHogb3IgNDAgTUh6CisJVVNIT1JUCQlTaG9ydEdJOjE7CisJVVNIT1JUCQlTVEJDOjI7CS8vU1BBQ0UKKwlVU0hPUlQJCXJzdjozOworCVVTSE9SVAkJT0ZETToxOworCVVTSE9SVAkJTUlNTzoxOworI2VuZGlmCisgfSBSRUNFSVZFX1NFVFRJTkcsICpQUkVDRUlWRV9TRVRUSU5HOworCisvLyBTaGFyZWQga2V5IGRhdGEgc3RydWN0dXJlCit0eXBlZGVmIHN0cnVjdCAgX1dFUF9LRVkgeworCVVDSEFSICAgS2V5TGVuOyAgICAgICAgICAgICAgICAgICAgIC8vIEtleSBsZW5ndGggZm9yIGVhY2gga2V5LCAwOiBlbnRyeSBpcyBpbnZhbGlkCisJVUNIQVIgICBLZXlbTUFYX0xFTl9PRl9LRVldOyAgICAgICAgLy8gcmlnaHQgbm93IHdlIGltcGxlbWVudCA0IGtleXMsIDEyOCBiaXRzIG1heAorfSBXRVBfS0VZLCAqUFdFUF9LRVk7CisKK3R5cGVkZWYgc3RydWN0IF9DSVBIRVJfS0VZIHsKKwlVQ0hBUiAgIEtleVsxNl07ICAgICAgICAgICAgLy8gcmlnaHQgbm93IHdlIGltcGxlbWVudCA0IGtleXMsIDEyOCBiaXRzIG1heAorCVVDSEFSICAgUnhNaWNbOF07CQkJLy8gbWFrZSBhbGlnbm1lbnQKKwlVQ0hBUiAgIFR4TWljWzhdOworCVVDSEFSICAgVHhUc2NbNl07ICAgICAgICAgICAvLyA0OGJpdCBUU0MgdmFsdWUKKwlVQ0hBUiAgIFJ4VHNjWzZdOyAgICAgICAgICAgLy8gNDhiaXQgVFNDIHZhbHVlCisJVUNIQVIgICBDaXBoZXJBbGc7ICAgICAgICAgIC8vIDAtbm9uZSwgMTpXRVA2NCwgMjpXRVAxMjgsIDM6VEtJUCwgNDpBRVMsIDU6Q0tJUDY0LCA2OkNLSVAxMjgKKwlVQ0hBUiAgIEtleUxlbjsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlVQ0hBUiAgIEJzc0lkWzZdOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworICAgICAgICAgICAgLy8gS2V5IGxlbmd0aCBmb3IgZWFjaCBrZXksIDA6IGVudHJ5IGlzIGludmFsaWQKKwlVQ0hBUiAgIFR5cGU7ICAgICAgICAgICAgICAgLy8gSW5kaWNhdGUgUGFpcndpc2UvR3JvdXAgd2hlbiByZXBvcnRpbmcgTUlDIGVycm9yCit9IENJUEhFUl9LRVksICpQQ0lQSEVSX0tFWTsKKwordHlwZWRlZiBzdHJ1Y3QgX0JCUF9UVU5JTkdfU1RSVUNUIHsKKwlCT09MRUFOICAgICBFbmFibGU7CisJVUNIQVIgICAgICAgRmFsc2VDY2FDb3VudFVwcGVyQm91bmQ7ICAvLyAxMDAgcGVyIHNlYworCVVDSEFSICAgICAgIEZhbHNlQ2NhQ291bnRMb3dlckJvdW5kOyAgLy8gMTAgcGVyIHNlYworCVVDSEFSICAgICAgIFIxN0xvd2VyQm91bmQ7ICAgICAgICAgICAgLy8gc3BlY2lmaWVkIGluIEUyUFJPTQorCVVDSEFSICAgICAgIFIxN1VwcGVyQm91bmQ7ICAgICAgICAgICAgLy8gMHg2OCBhY2NvcmRpbmcgdG8gRGF2aWQgVHVuZworCVVDSEFSICAgICAgIEN1cnJlbnRSMTdWYWx1ZTsKK30gQkJQX1RVTklORywgKlBCQlBfVFVOSU5HOworCit0eXBlZGVmIHN0cnVjdCBfU09GVF9SWF9BTlRfRElWRVJTSVRZX1NUUlVDVCB7CisJVUNIQVIgICAgIEV2YWx1YXRlUGVyaW9kOwkJIC8vIDA6bm90IGV2YWx1dGUgc3RhdHVzLCAxOiBldmFsdWF0ZSBzdGF0dXMsIDI6IHN3aXRjaGluZyBzdGF0dXMKKwlVQ0hBUiAgICAgUGFpcjFQcmltYXJ5UnhBbnQ7ICAgICAvLyAwOkFudC1FMSwgMTpBbnQtRTIKKwlVQ0hBUiAgICAgUGFpcjFTZWNvbmRhcnlSeEFudDsgICAvLyAwOkFudC1FMSwgMTpBbnQtRTIKKwlVQ0hBUiAgICAgUGFpcjJQcmltYXJ5UnhBbnQ7ICAgICAvLyAwOkFudC1FMywgMTpBbnQtRTQKKwlVQ0hBUiAgICAgUGFpcjJTZWNvbmRhcnlSeEFudDsgICAvLyAwOkFudC1FMywgMTpBbnQtRTQKKwlTSE9SVCAgICAgUGFpcjFBdmdSc3NpWzJdOyAgICAgICAvLyBBdmdSc3NpWzBdOkUxLCBBdmdSc3NpWzFdOkUyCisJU0hPUlQgICAgIFBhaXIyQXZnUnNzaVsyXTsgICAgICAgLy8gQXZnUnNzaVswXTpFMywgQXZnUnNzaVsxXTpFNAorCVNIT1JUICAgICBQYWlyMUxhc3RBdmdSc3NpOyAgICAgIC8vCisJU0hPUlQgICAgIFBhaXIyTGFzdEF2Z1Jzc2k7ICAgICAgLy8KKwlVTE9ORyAgICAgUmN2UGt0TnVtV2hlbkV2YWx1YXRlOworCUJPT0xFQU4gICBGaXJzdFBrdEFycml2ZWRXaGVuRXZhbHVhdGU7CisJUkFMSU5LX1RJTUVSX1NUUlVDVCAgICBSeEFudERpdmVyc2l0eVRpbWVyOworfSBTT0ZUX1JYX0FOVF9ESVZFUlNJVFksICpQU09GVF9SWF9BTlRfRElWRVJTSVRZOworCit0eXBlZGVmIHN0cnVjdCBfTEVBUF9BVVRIX0lORk8geworCUJPT0xFQU4gICAgICAgICBFbmFibGVkOyAgICAgICAgLy9UdXJlOiBFbmFibGUgTEVBUCBBdXRoZW50aWNhdGlvbgorCUJPT0xFQU4gICAgICAgICBDQ0tNOyAgICAgICAgICAgLy9UdXJlOiBVc2UgRmFzdCBSZWF1dGhlbnRpY2F0aW9uIHdpdGggQ0NLTQorCVVDSEFSICAgICAgICAgICBSZXNlcnZlWzJdOworCVVDSEFSICAgICAgICAgICBVc2VyTmFtZVsyNTZdOyAgLy9MRUFQLCBVc2VyIG5hbWUKKwlVTE9ORyAgICAgICAgICAgVXNlck5hbWVMZW47CisJVUNIQVIgICAgICAgICAgIFBhc3N3b3JkWzI1Nl07ICAvL0xFQVAsIFVzZXIgUGFzc3dvcmQKKwlVTE9ORyAgICAgICAgICAgUGFzc3dvcmRMZW47Cit9IExFQVBfQVVUSF9JTkZPLCAqUExFQVBfQVVUSF9JTkZPOworCit0eXBlZGVmIHN0cnVjdCB7CisJVUNIQVIgICAgICAgIEFkZHJbTUFDX0FERFJfTEVOXTsKKwlVQ0hBUiAgICAgICAgRXJyb3JDb2RlWzJdOyAgLy8wMCAwMS1JbnZhbGlkIGF1dGhlbnRpY2F0aW9uIHR5cGUKKwkJCQkJCQkJLy8wMCAwMi1BdXRoZW50aWNhdGlvbiB0aW1lb3V0CisJCQkJCQkJCS8vMDAgMDMtQ2hhbGxlbmdlIGZyb20gQVAgZmFpbGVkCisJCQkJCQkJCS8vMDAgMDQtQ2hhbGxlbmdlIHRvIEFQIGZhaWxlZAorCUJPT0xFQU4gICAgICBSZXBvcnRlZDsKK30gUk9HVUVBUF9FTlRSWSwgKlBST0dVRUFQX0VOVFJZOworCit0eXBlZGVmIHN0cnVjdCB7CisJVUNIQVIgICAgICAgICAgICAgICBSb2d1ZUFwTnI7CisJUk9HVUVBUF9FTlRSWSAgICAgICBSb2d1ZUFwRW50cnlbTUFYX0xFTl9PRl9CU1NfVEFCTEVdOworfSBST0dVRUFQX1RBQkxFLCAqUFJPR1VFQVBfVEFCTEU7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlCT09MRUFOICAgICBFbmFibGU7CisJVUNIQVIgICAgICAgRGVsdGE7CisJQk9PTEVBTiAgICAgUGx1c1NpZ247Cit9IENDS19UWF9QT1dFUl9DQUxJQlJBVEUsICpQQ0NLX1RYX1BPV0VSX0NBTElCUkFURTsKKworLy8KKy8vIFJlY2VpdmUgVHVwbGUgQ2FjaGUgRm9ybWF0CisvLwordHlwZWRlZiBzdHJ1Y3QgIF9UVVBMRV9DQUNIRSAgICB7CisJQk9PTEVBTiAgICAgICAgIFZhbGlkOworCVVDSEFSICAgICAgICAgICBNYWNBZGRyZXNzW01BQ19BRERSX0xFTl07CisJVVNIT1JUICAgICAgICAgIFNlcXVlbmNlOworCVVTSE9SVCAgICAgICAgICBGcmFnOworfSBUVVBMRV9DQUNIRSwgKlBUVVBMRV9DQUNIRTsKKworLy8KKy8vIEZyYWdtZW50IEZyYW1lIHN0cnVjdHVyZQorLy8KK3R5cGVkZWYgc3RydWN0ICBfRlJBR01FTlRfRlJBTUUgeworCVBORElTX1BBQ0tFVCAgICBwRnJhZ1BhY2tldDsKKwlVTE9ORyAgICAgICBSeFNpemU7CisJVVNIT1JUICAgICAgU2VxdWVuY2U7CisJVVNIT1JUICAgICAgTGFzdEZyYWc7CisJVUxPTkcgICAgICAgRmxhZ3M7ICAgICAgICAgIC8vIFNvbWUgZXh0cmEgZnJhbWUgaW5mb3JtYXRpb24uIGJpdCAwOiBMTEMgcHJlc2VudGVkCit9IEZSQUdNRU5UX0ZSQU1FLCAqUEZSQUdNRU5UX0ZSQU1FOworCisKKy8vCisvLyBQYWNrZXQgaW5mb3JtYXRpb24gZm9yIE5kaXNRdWVyeVBhY2tldAorLy8KK3R5cGVkZWYgc3RydWN0ICBfUEFDS0VUX0lORk8gICAgeworCVVJTlQgICAgICAgICAgICBQaHlzaWNhbEJ1ZmZlckNvdW50OyAgICAvLyBQaHlzaWNhbCBicmVha3Mgb2YgYnVmZmVyIGRlc2NyaXBvciBjaGFpbmVkCisJVUlOVCAgICAgICAgICAgIEJ1ZmZlckNvdW50IDsgICAgICAgICAgIC8vIE51bWJlciBvZiBCdWZmZXIgZGVzY3JpcHRvciBjaGFpbmVkCisJVUlOVCAgICAgICAgICAgIFRvdGFsUGFja2V0TGVuZ3RoIDsgICAgIC8vIFNlbGYgZXhwbGFpbmVkCisJUE5ESVNfQlVGRkVSICAgIHBGaXJzdEJ1ZmZlcjsgICAgICAgICAgIC8vIFBvaW50ZXIgdG8gZmlyc3QgYnVmZmVyIGRlc2NyaXB0b3IKK30gUEFDS0VUX0lORk8sICpQUEFDS0VUX0lORk87CisKKy8vCisvLyBUa2lwIEtleSBzdHJ1Y3R1cmUgd2hpY2ggUkM0IGtleSAmIE1JQyBjYWxjdWxhdGlvbgorLy8KK3R5cGVkZWYgc3RydWN0ICBfVEtJUF9LRVlfSU5GTyAgeworCVVJTlQgICAgICAgIG5CeXRlc0luTTsgIC8vICMgYnl0ZXMgaW4gTSBmb3IgTUlDS0VZCisJVUxPTkcgICAgICAgSVYxNjsKKwlVTE9ORyAgICAgICBJVjMyOworCVVMT05HICAgICAgIEswOyAgICAgICAgIC8vIGZvciBNSUNLRVkgTG93CisJVUxPTkcgICAgICAgSzE7ICAgICAgICAgLy8gZm9yIE1JQ0tFWSBIaWcKKwlVTE9ORyAgICAgICBMOyAgICAgICAgICAvLyBDdXJyZW50IHN0YXRlIGZvciBNSUNLRVkKKwlVTE9ORyAgICAgICBSOyAgICAgICAgICAvLyBDdXJyZW50IHN0YXRlIGZvciBNSUNLRVkKKwlVTE9ORyAgICAgICBNOyAgICAgICAgICAvLyBNZXNzYWdlIGFjY3VtdWxhdG9yIGZvciBNSUNLRVkKKwlVQ0hBUiAgICAgICBSQzRLRVlbMTZdOworCVVDSEFSICAgICAgIE1JQ1s4XTsKK30gVEtJUF9LRVlfSU5GTywgKlBUS0lQX0tFWV9JTkZPOworCisvLworLy8gUHJpdmF0ZSAvIE1pc2MgZGF0YSwgY291bnRlcnMgZm9yIGRyaXZlciBpbnRlcm5hbCB1c2UKKy8vCit0eXBlZGVmIHN0cnVjdCAgX19QUklWQVRFX1NUUlVDIHsKKwlVSU5UICAgICAgIFN5c3RlbVJlc2V0Q250OyAgICAgICAgIC8vIFN5c3RlbSByZXNldCBjb3VudGVyCisJVUlOVCAgICAgICBUeFJpbmdGdWxsQ250OyAgICAgICAgICAvLyBUeCByaW5nIGZ1bGwgb2NjdXJyYW5jZSBudW1iZXIKKwlVSU5UICAgICAgIFBoeVJ4RXJyQ250OyAgICAgICAgICAgIC8vIFBIWSBSeCBlcnJvciBjb3VudCwgZm9yIGRlYnVnIHB1cnBvc2UsIG1pZ2h0IG1vdmUgdG8gZ2xvYmFsIGNvdW50ZXIKKwkvLyBWYXJpYWJsZXMgZm9yIFdFUCBlbmNyeXB0aW9uIC8gZGVjcnlwdGlvbiBpbiBydG1wX3dlcC5jCisJVUlOVCAgICAgICBGQ1NDUkMzMjsKKwlBUkNGT1VSQ09OVEVYVCAgV0VQQ09OVEVYVDsKKwkvLyBUa2lwIHN0dWZmCisJVEtJUF9LRVlfSU5GTyAgIFR4OworCVRLSVBfS0VZX0lORk8gICBSeDsKK30gUFJJVkFURV9TVFJVQywgKlBQUklWQVRFX1NUUlVDOworCisvLyBzdHJ1Y3R1cmUgdG8gdHVuZSBCQlAgUjY2IChCQlAgVFVOSU5HKQordHlwZWRlZiBzdHJ1Y3QgX0JCUF9SNjZfVFVOSU5HIHsKKwlCT09MRUFOICAgICBiRW5hYmxlOworCVVTSE9SVCAgICAgIEZhbHNlQ2NhTG93ZXJUaHJlc2hvbGQ7ICAvLyBkZWZhdWx0IDEwMAorCVVTSE9SVCAgICAgIEZhbHNlQ2NhVXBwZXJUaHJlc2hvbGQ7ICAvLyBkZWZhdWx0IDUxMgorCVVDSEFSICAgICAgIFI2NkRlbHRhOworCVVDSEFSICAgICAgIFI2NkN1cnJlbnRWYWx1ZTsKKwlCT09MRUFOCQlSNjZMb3dlclVwcGVyU2VsZWN0OyAvL0JlZm9yZSBMaW5rVXAsIFVzZWQgTG93ZXJCb3VuZCBvciBVcHBlckJvdW5kIGFzIFI2NiB2YWx1ZS4KK30gQkJQX1I2Nl9UVU5JTkcsICpQQkJQX1I2Nl9UVU5JTkc7CisKKy8vIHN0cnVjdHVyZSB0byBzdG9yZSBjaGFubmVsIFRYIHBvd2VyCit0eXBlZGVmIHN0cnVjdCBfQ0hBTk5FTF9UWF9QT1dFUiB7CisJVVNIT1JUICAgICBSZW1haW5pbmdUaW1lRm9yVXNlOwkJLy91bml0OiBzZWMKKwlVQ0hBUiAgICAgIENoYW5uZWw7CisjaWZkZWYgRE9UMTFOX0RSQUZUMworCUJPT0xFQU4gICAgICAgYkVmZmVjdGVkQ2hhbm5lbDsJLy8gRm9yIEJXIDQwIG9wZXJhdGluZyBpbiAyLjRHSHogLCB0aGUgImVmZmVjdGVkIGNoYW5uZWwiIGlzIHRoZSBjaGFubmVsIHRoYXQgaXMgY292ZXJlZCBpbiA0ME1oei4KKyNlbmRpZiAvLyBET1QxMU5fRFJBRlQzIC8vCisJQ0hBUiAgICAgICBQb3dlcjsKKwlDSEFSICAgICAgIFBvd2VyMjsKKwlVQ0hBUiAgICAgIE1heFR4UHdyOworCVVDSEFSICAgICAgRGZzUmVxOworfSBDSEFOTkVMX1RYX1BPV0VSLCAqUENIQU5ORUxfVFhfUE9XRVI7CisKKy8vIHN0cnVjdHVyZSB0byBzdG9yZSA4MDIuMTFqIGNoYW5uZWwgVFggcG93ZXIKK3R5cGVkZWYgc3RydWN0IF9DSEFOTkVMXzExSl9UWF9QT1dFUiB7CisJVUNIQVIgICAgICBDaGFubmVsOworCVVDSEFSICAgICAgQlc7CS8vIEJXXzEwIG9yIEJXXzIwCisJQ0hBUiAgICAgICBQb3dlcjsKKwlDSEFSICAgICAgIFBvd2VyMjsKKwlVU0hPUlQgICAgIFJlbWFpbmluZ1RpbWVGb3JVc2U7CQkvL3VuaXQ6IHNlYworfSBDSEFOTkVMXzExSl9UWF9QT1dFUiwgKlBDSEFOTkVMXzExSl9UWF9QT1dFUjsKKwordHlwZWRlZiBlbnVtIF9BQkdCQU5EX1NUQVRFXyB7CisJVU5LTk9XTl9CQU5ELAorCUJHX0JBTkQsCisJQV9CQU5ELAorfSBBQkdCQU5EX1NUQVRFOworCit0eXBlZGVmIHN0cnVjdCBfTUxNRV9TVFJVQ1QgeworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCS8vIFNUQSBzdGF0ZSBtYWNoaW5lcworCVNUQVRFX01BQ0hJTkUgICAgICAgICAgIENudGxNYWNoaW5lOworCVNUQVRFX01BQ0hJTkUgICAgICAgICAgIEFzc29jTWFjaGluZTsKKwlTVEFURV9NQUNISU5FICAgICAgICAgICBBdXRoTWFjaGluZTsKKwlTVEFURV9NQUNISU5FICAgICAgICAgICBBdXRoUnNwTWFjaGluZTsKKwlTVEFURV9NQUNISU5FICAgICAgICAgICBTeW5jTWFjaGluZTsKKwlTVEFURV9NQUNISU5FICAgICAgICAgICBXcGFQc2tNYWNoaW5lOworCVNUQVRFX01BQ0hJTkUgICAgICAgICAgIExlYXBNYWNoaW5lOworCVNUQVRFX01BQ0hJTkUgICAgICAgICAgIEFpcm9uZXRNYWNoaW5lOworCVNUQVRFX01BQ0hJTkVfRlVOQyAgICAgIEFzc29jRnVuY1tBU1NPQ19GVU5DX1NJWkVdOworCVNUQVRFX01BQ0hJTkVfRlVOQyAgICAgIEF1dGhGdW5jW0FVVEhfRlVOQ19TSVpFXTsKKwlTVEFURV9NQUNISU5FX0ZVTkMgICAgICBBdXRoUnNwRnVuY1tBVVRIX1JTUF9GVU5DX1NJWkVdOworCVNUQVRFX01BQ0hJTkVfRlVOQyAgICAgIFN5bmNGdW5jW1NZTkNfRlVOQ19TSVpFXTsKKwlTVEFURV9NQUNISU5FX0ZVTkMgICAgICBXcGFQc2tGdW5jW1dQQV9QU0tfRlVOQ19TSVpFXTsKKwlTVEFURV9NQUNISU5FX0ZVTkMgICAgICBBaXJvbmV0RnVuY1tBSVJPTkVUX0ZVTkNfU0laRV07CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJU1RBVEVfTUFDSElORV9GVU5DICAgICAgQWN0RnVuY1tBQ1RfRlVOQ19TSVpFXTsKKwkvLyBBY3Rpb24KKwlTVEFURV9NQUNISU5FICAgICAgICAgICBBY3RNYWNoaW5lOworCisKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwlTVEFURV9NQUNISU5FCQkJRGxzTWFjaGluZTsKKwlTVEFURV9NQUNISU5FX0ZVTkMgICAgICBEbHNGdW5jW0RMU19GVU5DX1NJWkVdOworI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCisKKworCisJVUxPTkcgICAgICAgICAgICAgICAgICAgQ2hhbm5lbFF1YWxpdHk7ICAvLyAwLi4xMDAsIENoYW5uZWwgUXVhbGl0eSBJbmRpY2F0aW9uIGZvciBSb2FtaW5nCisJVUxPTkcgICAgICAgICAgICAgICAgICAgTm93MzI7ICAgICAgICAgICAvLyBsYXRjaCB0aGUgdmFsdWUgb2YgTmRpc0dldFN5c3RlbVVwVGltZSgpCisJVUxPTkcgICAgICAgICAgICAgICAgICAgTGFzdFNlbmROVUxMcHNtVGltZTsKKworCUJPT0xFQU4gICAgICAgICAgICAgICAgIGJSdW5uaW5nOworCU5ESVNfU1BJTl9MT0NLICAgICAgICAgIFRhc2tMb2NrOworCU1MTUVfUVVFVUUgICAgICAgICAgICAgIFF1ZXVlOworCisJVUlOVCAgICAgICAgICAgICAgICAgICAgU2hpZnRSZWc7CisKKwlSQUxJTktfVElNRVJfU1RSVUNUICAgICBQZXJpb2RpY1RpbWVyOworCVJBTElOS19USU1FUl9TVFJVQ1QgICAgIEFQU0RQZXJpb2RpY1RpbWVyOworCVJBTElOS19USU1FUl9TVFJVQ1QgICAgIExpbmtEb3duVGltZXI7CisJUkFMSU5LX1RJTUVSX1NUUlVDVCAgICAgTGlua1VwVGltZXI7CisJVUxPTkcgICAgICAgICAgICAgICAgICAgUGVyaW9kaWNSb3VuZDsKKwlVTE9ORyAgICAgICAgICAgICAgICAgICBPbmVTZWNQZXJpb2RpY1JvdW5kOworCisJVUNIQVIJCQkJCVJlYWxSeFBhdGg7CisJQk9PTEVBTgkJCQkJYkxvd1Rocm91Z2hwdXQ7CisJQk9PTEVBTgkJCQkJYkVuYWJsZUF1dG9BbnRlbm5hQ2hlY2s7CisJUkFMSU5LX1RJTUVSX1NUUlVDVAkJUnhBbnRFdmFsVGltZXI7CisKKyNpZmRlZiBSVDI4NzAKKwlVQ0hBUiBDYWxpQlc0MFJmUjI0OworCVVDSEFSIENhbGlCVzIwUmZSMjQ7CisjZW5kaWYgLy8gUlQyODcwIC8vCisKK30gTUxNRV9TVFJVQ1QsICpQTUxNRV9TVFJVQ1Q7CisKKy8vIHN0cnVjdHVyZSBmb3IgcmFkYXIgZGV0ZWN0aW9uIGFuZCBjaGFubmVsIHN3aXRjaAordHlwZWRlZiBzdHJ1Y3QgX1JBREFSX0RFVEVDVF9TVFJVQ1QgeworICAgIC8vQk9PTEVBTgkJSUVFRTgwMjExSDsJCQkvLyAwOiBkaXNhYmxlLCAxOiBlbmFibGUgSUVFRTgwMi4xMWgKKwlVQ0hBUgkJQ1NDb3VudDsJCQkvL0NoYW5uZWwgc3dpdGNoIGNvdW50ZXIKKwlVQ0hBUgkJQ1NQZXJpb2Q7CQkJLy9DaGFubmVsIHN3aXRjaCBwZXJpb2QgKGJlYWNvbiBjb3VudCkKKwlVQ0hBUgkJUkRDb3VudDsJCQkvL1JhZGFyIGRldGVjdGlvbiBjb3VudGVyCisJVUNIQVIJCVJETW9kZTsJCQkJLy9SYWRhciBEZXRlY3Rpb24gbW9kZQorCVVDSEFSCQlSRER1clJlZ2lvbjsJCS8vUmFkYXIgZGV0ZWN0aW9uIGR1cmF0aW9uIHJlZ2lvbgorCVVDSEFSCQlCQlBSMTY7CisJVUNIQVIJCUJCUFIxNzsKKwlVQ0hBUgkJQkJQUjE4OworCVVDSEFSCQlCQlBSMjE7CisJVUNIQVIJCUJCUFIyMjsKKwlVQ0hBUgkJQkJQUjY0OworCVVMT05HCQlJblNlcnZpY2VNb25pdG9yQ291bnQ7IC8vIHVuaXQ6IHNlYworCVVJTlQ4CQlEZnNTZXNzaW9uVGltZTsKKwlCT09MRUFOCQliRmFzdERmczsKKwlVSU5UOAkJQ2hNb3ZpbmdUaW1lOworCVVJTlQ4CQlMb25nUHVsc2VSYWRhclRoOworfSBSQURBUl9ERVRFQ1RfU1RSVUNULCAqUFJBREFSX0RFVEVDVF9TVFJVQ1Q7CisKKyNpZmRlZiBDQVJSSUVSX0RFVEVDVElPTl9TVVBQT1JUCit0eXBlZGVmIGVudW0gQ0RfU1RBVEVfbgoreworCUNEX05PUk1BTCwKKwlDRF9TSUxFTkNFLAorCUNEX01BWF9TVEFURQorfSBDRF9TVEFURTsKKwordHlwZWRlZiBzdHJ1Y3QgQ0FSUklFUl9ERVRFQ1RJT05fcworeworCUJPT0xFQU4JCQkJCUVuYWJsZTsKKwlVSU5UOAkJCQkJQ0RTZXNzaW9uVGltZTsKKwlVSU5UOAkJCQkJQ0RQZXJpb2Q7CisJQ0RfU1RBVEUJCQkJQ0RfU3RhdGU7Cit9IENBUlJJRVJfREVURUNUSU9OLCAqUENBUlJJRVJfREVURUNUSU9OOworI2VuZGlmIC8vIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQgLy8KKwordHlwZWRlZiBlbnVtIF9SRUNfQkxPQ0tBQ0tfU1RBVFVTCit7CisgICAgUmVjaXBpZW50X05PTkU9MCwKKwlSZWNpcGllbnRfVVNFRCwKKwlSZWNpcGllbnRfSGFuZGxlUmVzLAorICAgIFJlY2lwaWVudF9BY2NlcHQKK30gUkVDX0JMT0NLQUNLX1NUQVRVUywgKlBSRUNfQkxPQ0tBQ0tfU1RBVFVTOworCit0eXBlZGVmIGVudW0gX09SSV9CTE9DS0FDS19TVEFUVVMKK3sKKyAgICBPcmlnaW5hdG9yX05PTkU9MCwKKwlPcmlnaW5hdG9yX1VTRUQsCisgICAgT3JpZ2luYXRvcl9XYWl0UmVzLAorICAgIE9yaWdpbmF0b3JfRG9uZQorfSBPUklfQkxPQ0tBQ0tfU1RBVFVTLCAqUE9SSV9CTE9DS0FDS19TVEFUVVM7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKK3R5cGVkZWYgc3RydWN0IF9CQV9PUklfRU5UUll7CisJVUNIQVIgICBXY2lkOworCVVDSEFSICAgVElEOworCVVDSEFSICAgQkFXaW5TaXplOworCVVDSEFSICAgVG9rZW47CisvLyBTZXF1ZW5jZSBpcyB0byBmaWxsIGV2ZXJ5IG91dGdvaW5nIFFvUyBEQVRBIGZyYW1lJ3Mgc2VxdWVuY2UgZmllbGQgaW4gODAyLjExIGhlYWRlci4KKwlVU0hPUlQJU2VxdWVuY2U7CisJVVNIT1JUCVRpbWVPdXRWYWx1ZTsKKwlPUklfQkxPQ0tBQ0tfU1RBVFVTICBPUklfQkFfU3RhdHVzOworCVJBTElOS19USU1FUl9TVFJVQ1QgT1JJQkFUaW1lcjsKKwlQVk9JRAlwQWRhcHRlcjsKK30gQkFfT1JJX0VOVFJZLCAqUEJBX09SSV9FTlRSWTsKKwordHlwZWRlZiBzdHJ1Y3QgX0JBX1JFQ19FTlRSWSB7CisJVUNIQVIgICBXY2lkOworCVVDSEFSICAgVElEOworCVVDSEFSICAgQkFXaW5TaXplOwkvLyA3LjMuMS4xNC4gZWFjaCBidWZmZXIgaXMgY2FwYWJsZSBvZiBob2xkaW5nIGEgbWF4IEFNU0RVIG9yIE1TRFUuCisJLy9VQ0hBUglOdW1PZlJ4UGt0OworCS8vVUNIQVIgICAgQ3VyaW5kaWR4OyAvLyB0aGUgaGVhZCBpbiB0aGUgUlggcmVvcmRlcmluZyBidWZmZXIKKwlVU0hPUlQJCUxhc3RJbmRTZXE7CisvLwlVU0hPUlQJCUxhc3RJbmRTZXFBdFRpbWVyOworCVVTSE9SVAkJVGltZU91dFZhbHVlOworCVJBTElOS19USU1FUl9TVFJVQ1QgUkVDQkFUaW1lcjsKKwlVTE9ORwkJTGFzdEluZFNlcUF0VGltZXI7CisJVUxPTkcJCW5Ecm9wUGFja2V0OworCVVMT05HCQlyY3ZTZXE7CisJUkVDX0JMT0NLQUNLX1NUQVRVUyAgUkVDX0JBX1N0YXR1czsKKy8vCVVDSEFSCVJ4QnVmSWR4VXNlZDsKKwkvLyBjb3JyZXNwb25kaW5nIHZpcnR1YWwgYWRkcmVzcyBmb3IgUlggcmVvcmRlcmluZyBwYWNrZXQgc3RvcmFnZS4KKwkvL1JUTVBfUkVPUkRFUkRNQUJVRiBNQVBfUlhCdWZbTUFYX1JYX1JFT1JERVJCVUZdOworCU5ESVNfU1BJTl9MT0NLICAgICAgICAgIFJ4UmVSaW5nTG9jazsgICAgICAgICAgICAgICAgIC8vIFJ4IFJpbmcgc3BpbmxvY2sKKy8vCXN0cnVjdCBfQkFfUkVDX0VOVFJZICpwTmV4dDsKKwlQVk9JRAlwQWRhcHRlcjsKKwlzdHJ1Y3QgcmVvcmRlcmluZ19saXN0CWxpc3Q7Cit9IEJBX1JFQ19FTlRSWSwgKlBCQV9SRUNfRU5UUlk7CisKKwordHlwZWRlZiBzdHJ1Y3QgeworCVVMT05HCQludW1Bc1JlY2lwaWVudDsJCS8vIEkgYW0gcmVjaXBpZW50IG9mIG51bUFzUmVjaXBpZW50IGNsaWVudHMuIFRoZXNlIGNsaWVudCBhcmUgaW4gdGhlIEJBUmVjRW50cnlbXQorCVVMT05HCQludW1Bc09yaWdpbmF0b3I7CS8vIEkgYW0gb3JpZ2luYXRvciBvZiAJbnVtQXNPcmlnaW5hdG9yIGNsaWVudHMuIFRoZXNlIGNsaWVudHMgYXJlIGluIHRoZSBCQU9yaUVudHJ5W10KKwlCQV9PUklfRU5UUlkgICAgICAgQkFPcmlFbnRyeVtNQVhfTEVOX09GX0JBX09SSV9UQUJMRV07CisJQkFfUkVDX0VOVFJZICAgICAgIEJBUmVjRW50cnlbTUFYX0xFTl9PRl9CQV9SRUNfVEFCTEVdOworfSBCQV9UQUJMRSwgKlBCQV9UQUJMRTsKKworLy9Gb3IgUXVyZXlCQVRhYmxlT0lEIHVzZTsKK3R5cGVkZWYgc3RydWN0ICBQQUNLRUQgX09JRF9CQV9SRUNfRU5UUll7CisJVUNIQVIgICBNQUNBZGRyW01BQ19BRERSX0xFTl07CisJVUNIQVIgICBCYUJpdG1hcDsgICAvLyBpZiAoQmFCaXRtYXAmKDE8PFRJRCkpLCB0aGlzIHNlc3Npb24gd2l0aHtNQUNBZGRyLCBUSUR9ZXhpc3RzLCBzbyByZWFkIEJ1ZlNpemVbVElEXSBmb3IgQnVmZmVyU2l6ZQorCVVDSEFSICAgcnN2OworCVVDSEFSICAgQnVmU2l6ZVs4XTsKKwlSRUNfQkxPQ0tBQ0tfU1RBVFVTCVJFQ19CQV9TdGF0dXNbOF07Cit9IE9JRF9CQV9SRUNfRU5UUlksICpQT0lEX0JBX1JFQ19FTlRSWTsKKworLy9Gb3IgUXVyZXlCQVRhYmxlT0lEIHVzZTsKK3R5cGVkZWYgc3RydWN0ICBQQUNLRUQgX09JRF9CQV9PUklfRU5UUll7CisJVUNIQVIgICBNQUNBZGRyW01BQ19BRERSX0xFTl07CisJVUNIQVIgICBCYUJpdG1hcDsgIC8vIGlmIChCYUJpdG1hcCYoMTw8VElEKSksIHRoaXMgc2Vzc2lvbiB3aXRoe01BQ0FkZHIsIFRJRH1leGlzdHMsIHNvIHJlYWQgQnVmU2l6ZVtUSURdIGZvciBCdWZmZXJTaXplLCByZWFkIE9SSV9CQV9TdGF0dXNbVElEXSBmb3Igc3RhdHVzCisJVUNIQVIgICByc3Y7CisJVUNIQVIgICBCdWZTaXplWzhdOworCU9SSV9CTE9DS0FDS19TVEFUVVMgIE9SSV9CQV9TdGF0dXNbOF07Cit9IE9JRF9CQV9PUklfRU5UUlksICpQT0lEX0JBX09SSV9FTlRSWTsKKwordHlwZWRlZiBzdHJ1Y3QgX1FVRVJZQkFfVEFCTEV7CisJT0lEX0JBX09SSV9FTlRSWSAgICAgICBCQU9yaUVudHJ5WzMyXTsKKwlPSURfQkFfUkVDX0VOVFJZICAgICAgIEJBUmVjRW50cnlbMzJdOworCVVDSEFSICAgT3JpTnVtOy8vIE51bWJlciBvZiBiZWxvdyBCQU9yaUVudHJ5CisJVUNIQVIgICBSZWNOdW07Ly8gTnVtYmVyIG9mIGJlbG93IEJBUmVjRW50cnkKK30gUVVFUllCQV9UQUJMRSwgKlBRVUVSWUJBX1RBQkxFOworCit0eXBlZGVmCXVuaW9uCV9CQUNBUF9TVFJVQwl7CisjaWZkZWYgUlRfQklHX0VORElBTgorCXN0cnVjdAl7CisJCVVJTlQzMiAgICAgOjQ7CisJCVVJTlQzMiAgICAgYjIwNDBDb2V4aXN0U2NhblN1cDoxOwkJLy9BcyBTdGEsIHN1cHBvcnQgZG8gMjA0MCBjb2V4aXN0ZW5jZSBzY2FuIGZvciBBUC4gQXMgQXAsIHN1cHBvcnQgbW9uaXRvciB0cmlnZ2VyIGV2ZW50IHRvIGNoZWNrIGlmIGNhbiB1c2UgQlcgNDBNSHouCisJCVVJTlQzMiAgICAgYkh0QWRob2M6MTsJCQkvLyBhZGhvYyBjYW4gdXNlIGh0IHJhdGUuCisJCVVJTlQzMiAgICAgTU1QU21vZGU6MjsJLy8gTUlNTyBwb3dlciBzYXZlIG1vcmUsIDA6c3RhdGljLCAxOmR5bmFtaWMsIDI6cnN2LCAzOm1pbW8gZW5hYmxlCisJCVVJTlQzMiAgICAgQW1zZHVTaXplOjE7CS8vIDA6MzgzOSwgMTo3OTM1IGJ5dGVzLiBVSU5UICBNU0RVU2l6ZVRvQnl0ZXNbXQk9IHsgMzgzOSwgNzkzNX07CisJCVVJTlQzMiAgICAgQW1zZHVFbmFibGU6MTsJLy9FbmFibGUgQU1TRFUgdHJhbnNtaXNzdGlvbgorCQlVSU5UMzIJCU1wZHVEZW5zaXR5OjM7CisJCVVJTlQzMgkJUG9saWN5OjI7CS8vIDA6IERFTEFZX0JBIDE6SU1NRURfQkEgICgvL0JBIFBvbGljeSBzdWJmaWxlZCB2YWx1ZSBpbiBBRERCQSBmcmFtZSkgICAyOkJBLW5vdCB1c2UKKwkJVUlOVDMyCQlBdXRvQkE6MTsJLy8gYXV0b21hdGljYWxseSBCQQorCQlVSU5UMzIJCVR4QkFXaW5MaW1pdDo4OworCQlVSU5UMzIJCVJ4QkFXaW5MaW1pdDo4OworCX0JZmllbGQ7CisjZWxzZQorCXN0cnVjdAl7CisJCVVJTlQzMgkJUnhCQVdpbkxpbWl0Ojg7CisJCVVJTlQzMgkJVHhCQVdpbkxpbWl0Ojg7CisJCVVJTlQzMgkJQXV0b0JBOjE7CS8vIGF1dG9tYXRpY2FsbHkgQkEKKwkJVUlOVDMyCQlQb2xpY3k6MjsJLy8gMDogREVMQVlfQkEgMTpJTU1FRF9CQSAgKC8vQkEgUG9saWN5IHN1YmZpbGVkIHZhbHVlIGluIEFEREJBIGZyYW1lKSAgIDI6QkEtbm90IHVzZQorCQlVSU5UMzIJCU1wZHVEZW5zaXR5OjM7CisJCVVJTlQzMiAgICAgICAJQW1zZHVFbmFibGU6MTsJLy9FbmFibGUgQU1TRFUgdHJhbnNtaXNzdGlvbgorCQlVSU5UMzIgICAgICAgCUFtc2R1U2l6ZToxOwkvLyAwOjM4MzksIDE6NzkzNSBieXRlcy4gVUlOVCAgTVNEVVNpemVUb0J5dGVzW10JPSB7IDM4MzksIDc5MzV9OworCQlVSU5UMzIgICAgICAgCU1NUFNtb2RlOjI7CS8vIE1JTU8gcG93ZXIgc2F2ZSBtb3JlLCAwOnN0YXRpYywgMTpkeW5hbWljLCAyOnJzdiwgMzptaW1vIGVuYWJsZQorCQlVSU5UMzIgICAgICAgCWJIdEFkaG9jOjE7CQkJLy8gYWRob2MgY2FuIHVzZSBodCByYXRlLgorCQlVSU5UMzIgICAgICAgCWIyMDQwQ29leGlzdFNjYW5TdXA6MTsJCS8vQXMgU3RhLCBzdXBwb3J0IGRvIDIwNDAgY29leGlzdGVuY2Ugc2NhbiBmb3IgQVAuIEFzIEFwLCBzdXBwb3J0IG1vbml0b3IgdHJpZ2dlciBldmVudCB0byBjaGVjayBpZiBjYW4gdXNlIEJXIDQwTUh6LgorCQlVSU5UMzIgICAgICAgCTo0OworCX0JZmllbGQ7CisjZW5kaWYKKwlVSU5UMzIJCQl3b3JkOworfSBCQUNBUF9TVFJVQywgKlBCQUNBUF9TVFJVQzsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworLy9UaGlzIHN0cnVjdHVyZSBpcyBmb3IgYWxsIDgwMi4xMW4gY2FyZCBJbnRlck9wdGliaWxpdHlUZXN0IGFjdGlvbi4gUmVzZXQgYWxsIE51bSBldmVyeSBuIHNlY29uZC4gIChEZXRhaWxzIHNlZSBNTE1FUGVyaW9kaWMpCit0eXBlZGVmCXN0cnVjdAlfSU9UX1NUUlVDCXsKKwlVQ0hBUgkJCVRocmVzaG9sZFsyXTsKKwlVQ0hBUgkJCVJlb3JkZXJUaW1lT3V0TnVtW01BWF9MRU5fT0ZfQkFfUkVDX1RBQkxFXTsJLy8gY29tcGFyZSB3aXRoIHRocmVzaG9sZFswXQorCVVDSEFSCQkJUmVmcmVzaE51bVtNQVhfTEVOX09GX0JBX1JFQ19UQUJMRV07CS8vIGNvbXBhcmUgd2l0aCB0aHJlc2hvbGRbMV0KKwlVTE9ORwkJCU9uZVNlY0luV2luZG93Q291bnQ7CisJVUxPTkcJCQlPbmVTZWNGcmFtZUR1cGxpY2F0ZUNvdW50OworCVVMT05HCQkJT25lU2VjT3V0V2luZG93Q291bnQ7CisJVUNIQVIJCQlEZWxPcmlBY3Q7CisJVUNIQVIJCQlEZWxSZWNBY3Q7CisJVUNIQVIJCQlSVFNTaG9ydFByb3Q7CisJVUNIQVIJCQlSVFNMb25nUHJvdDsKKwlCT09MRUFOCQkJYlJUU0xvbmdQcm90T247CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJQk9PTEVBTgkJCWJMYXN0QXRoZXJvczsKKyAgICBCT09MRUFOCQkJYkN1cnJlbnRBdGhlcm9zOworICAgIEJPT0xFQU4gICAgICAgICBiTm93QXRoZXJvc0J1cnN0T247CisJQk9PTEVBTgkJCWJOZXh0RGlzYWJsZVJ4QkE7CisgICAgQk9PTEVBTgkJCWJUb2dnbGU7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCit9IElPVF9TVFJVQywgKlBJT1RfU1RSVUM7CisKKy8vIFRoaXMgaXMgdGhlIHJlZ2lzdHJ5IHNldHRpbmcgZm9yIDgwMi4xMW4gdHJhbnNtaXQgc2V0dGluZy4gIFVzZWQgaW4gYWR2YW5jZWQgcGFnZS4KK3R5cGVkZWYgdW5pb24gX1JFR19UUkFOU01JVF9TRVRUSU5HIHsKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisgc3RydWN0IHsKKyAgICAgICAgIFVJTlQzMiAgcnN2OjEzOworCQkgVUlOVDMyICBFWFRDSEE6MjsKKwkJIFVJTlQzMiAgSFRNT0RFOjE7CisJCSBVSU5UMzIgIFRSQU5TTk86MjsKKwkJIFVJTlQzMiAgU1RCQzoxOyAvL1NQQUNFCisJCSBVSU5UMzIgIFNob3J0R0k6MTsKKwkJIFVJTlQzMiAgQlc6MTsgLy9jaGFubmVsIGJhbmR3aWR0aCAyME1IeiBvciA0MCBNSHoKKwkJIFVJTlQzMiAgVHhCRjoxOyAvLyAzKjMKKwkJIFVJTlQzMiAgcnN2MDoxMDsKKwkJIC8vVUlOVDMyICBNQ1M6NzsgICAgICAgICAgICAgICAgIC8vIE1DUworICAgICAgICAgLy9VSU5UMzIgIFBoeU1vZGU6NDsKKyAgICB9IGZpZWxkOworI2Vsc2UKKyBzdHJ1Y3QgeworICAgICAgICAgLy9VSU5UMzIgIFBoeU1vZGU6NDsKKyAgICAgICAgIC8vVUlOVDMyICBNQ1M6NzsgICAgICAgICAgICAgICAgIC8vIE1DUworCQkgVUlOVDMyICByc3YwOjEwOworCQkgVUlOVDMyICBUeEJGOjE7CisgICAgICAgICBVSU5UMzIgIEJXOjE7IC8vY2hhbm5lbCBiYW5kd2lkdGggMjBNSHogb3IgNDAgTUh6CisgICAgICAgICBVSU5UMzIgIFNob3J0R0k6MTsKKyAgICAgICAgIFVJTlQzMiAgU1RCQzoxOyAvL1NQQUNFCisgICAgICAgICBVSU5UMzIgIFRSQU5TTk86MjsKKyAgICAgICAgIFVJTlQzMiAgSFRNT0RFOjE7CisgICAgICAgICBVSU5UMzIgIEVYVENIQToyOworICAgICAgICAgVUlOVDMyICByc3Y6MTM7CisgICAgfSBmaWVsZDsKKyNlbmRpZgorIFVJTlQzMiAgIHdvcmQ7Cit9IFJFR19UUkFOU01JVF9TRVRUSU5HLCAqUFJFR19UUkFOU01JVF9TRVRUSU5HOworCit0eXBlZGVmIHVuaW9uICBfREVTSVJFRF9UUkFOU01JVF9TRVRUSU5HIHsKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJc3RydWN0CXsKKwkJCVVTSE9SVAkJcnN2OjM7CisJCQlVU0hPUlQJCUZpeGVkVHhNb2RlOjI7CQkJLy8gSWYgTUNTIGlzbid0IEFVVE8sIGZpeCByYXRlIGluIENDSywgT0ZETSBvciBIVCBtb2RlLgorCQkJVVNIT1JUCQlQaHlNb2RlOjQ7CisJCQlVU0hPUlQgICAJTUNTOjc7ICAgICAgICAgICAgICAgICAvLyBNQ1MKKwl9CWZpZWxkOworI2Vsc2UKKwlzdHJ1Y3QJeworCQkJVVNIT1JUICAgCU1DUzo3OyAgICAgICAgICAgICAgICAgCS8vIE1DUworCQkJVVNIT1JUCQlQaHlNb2RlOjQ7CisJCQlVU0hPUlQJIAlGaXhlZFR4TW9kZToyOwkJCS8vIElmIE1DUyBpc24ndCBBVVRPLCBmaXggcmF0ZSBpbiBDQ0ssIE9GRE0gb3IgSFQgbW9kZS4KKwkJCVVTSE9SVAkJcnN2OjM7CisJfQlmaWVsZDsKKyNlbmRpZgorCVVTSE9SVAkJd29yZDsKKyB9IERFU0lSRURfVFJBTlNNSVRfU0VUVElORywgKlBERVNJUkVEX1RSQU5TTUlUX1NFVFRJTkc7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlCT09MRUFOCQlJc1JlY2lwaWVudDsKKwlVQ0hBUiAgIE1BQ0FkZHJbTUFDX0FERFJfTEVOXTsKKwlVQ0hBUiAgIFRJRDsKKwlVQ0hBUiAgIG5NU0RVOworCVVTSE9SVCAgIFRpbWVPdXQ7CisJQk9PTEVBTiBiQWxsVGlkOyAgLy8gSWYgVHJ1ZSwgZGVsZXRlIGFsbCBUSUQgZm9yIEJBIHNlc3Npb25zIHdpdGggdGhpcyBNQUNhZGRyLgorfSBPSURfQUREX0JBX0VOVFJZLCAqUE9JRF9BRERfQkFfRU5UUlk7CisKKy8vCisvLyBNdWx0aXBsZSBTU0lEIHN0cnVjdHVyZQorLy8KKyNkZWZpbmUgV0xBTl9NQVhfTlVNX09GX1RJTQkJCSgoTUFYX0xFTl9PRl9NQUNfVEFCTEUgPj4gMykgKyAxKSAvKiAvOCArIDEgKi8KKyNkZWZpbmUgV0xBTl9DVF9USU1fQkNNQ19PRkZTRVQJCTAgLyogdW5pdDogMzJCICovCisKKy8qIGNsZWFyIGJjbWMgVElNIGJpdCAqLworI2RlZmluZSBXTEFOX01SX1RJTV9CQ01DX0NMRUFSKGFwaWR4KSBcCisJcEFkLT5BcENmZy5NQlNTSURbYXBpZHhdLlRpbUJpdG1hcHNbV0xBTl9DVF9USU1fQkNNQ19PRkZTRVRdICY9IH5CSVQ4WzBdOworCisvKiBzZXQgYmNtYyBUSU0gYml0ICovCisjZGVmaW5lIFdMQU5fTVJfVElNX0JDTUNfU0VUKGFwaWR4KSBcCisJcEFkLT5BcENmZy5NQlNTSURbYXBpZHhdLlRpbUJpdG1hcHNbV0xBTl9DVF9USU1fQkNNQ19PRkZTRVRdIHw9IEJJVDhbMF07CisKKy8qIGNsZWFyIGEgc3RhdGlvbiBQUyBUSU0gYml0ICovCisjZGVmaW5lIFdMQU5fTVJfVElNX0JJVF9DTEVBUihhZF9wLCBhcGlkeCwgd2NpZCkgXAorCXsJVUNIQVIgdGltX29mZnNldCA9IHdjaWQgPj4gMzsgXAorCQlVQ0hBUiBiaXRfb2Zmc2V0ID0gd2NpZCAmIDB4NzsgXAorCQlhZF9wLT5BcENmZy5NQlNTSURbYXBpZHhdLlRpbUJpdG1hcHNbdGltX29mZnNldF0gJj0gKH5CSVQ4W2JpdF9vZmZzZXRdKTsgfQorCisvKiBzZXQgYSBzdGF0aW9uIFBTIFRJTSBiaXQgKi8KKyNkZWZpbmUgV0xBTl9NUl9USU1fQklUX1NFVChhZF9wLCBhcGlkeCwgd2NpZCkgXAorCXsJVUNIQVIgdGltX29mZnNldCA9IHdjaWQgPj4gMzsgXAorCQlVQ0hBUiBiaXRfb2Zmc2V0ID0gd2NpZCAmIDB4NzsgXAorCQlhZF9wLT5BcENmZy5NQlNTSURbYXBpZHhdLlRpbUJpdG1hcHNbdGltX29mZnNldF0gfD0gQklUOFtiaXRfb2Zmc2V0XTsgfQorCisjaWZkZWYgUlQyODcwCisjZGVmaW5lIEJFQUNPTl9CSVRNQVBfTUFTSwkJMHhmZgordHlwZWRlZiBzdHJ1Y3QgX0JFQUNPTl9TWU5DX1NUUlVDVF8KK3sKKwlVQ0hBUiAgICAgICAgCQkJQmVhY29uQnVmW0hXX0JFQUNPTl9NQVhfQ09VTlRdW0hXX0JFQUNPTl9PRkZTRVRdOworCVVDSEFSCQkJCQlCZWFjb25UeFdJW0hXX0JFQUNPTl9NQVhfQ09VTlRdW1RYV0lfU0laRV07CisJVUxPTkcgCQkJCQlUaW1JRUxvY2F0aW9uSW5CZWFjb25bSFdfQkVBQ09OX01BWF9DT1VOVF07CisJVUxPTkcJCQkJCUNhcGFiaWxpdHlJbmZvTG9jYXRpb25JbkJlYWNvbltIV19CRUFDT05fTUFYX0NPVU5UXTsKKwlCT09MRUFOCQkJCQlFbmFibGVCZWFjb247CQkvLyB0cmlnZ2VyIHRvIGVuYWJsZSBiZWFjb24gdHJhbnNtaXNzaW9uLgorCVVDSEFSCQkJCQlCZWFjb25CaXRNYXA7CQkvLyBOT1RFOiBJZiB0aGUgTUFYX01CU1NJRF9OVU0gaXMgbGFyZ2VyIHRoYW4gOCwgdGhpcyBwYXJhbWV0ZXIgbmVlZCB0byBjaGFuZ2UuCisJVUNIQVIJCQkJCUR0aW1CaXRPbjsJCQkvLyBOT1RFOiBJZiB0aGUgTUFYX01CU1NJRF9OVU0gaXMgbGFyZ2VyIHRoYW4gOCwgdGhpcyBwYXJhbWV0ZXIgbmVlZCB0byBjaGFuZ2UuCit9QkVBQ09OX1NZTkNfU1RSVUNUOworI2VuZGlmIC8vIFJUMjg3MCAvLworCit0eXBlZGVmIHN0cnVjdCBfTVVMVElTU0lEX1NUUlVDVCB7CisJVUNIQVIJCQkJCQkJCUJzc2lkW01BQ19BRERSX0xFTl07CisgICAgVUNIQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3NpZExlbjsKKyAgICBDSEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTc2lkW01BWF9MRU5fT0ZfU1NJRF07CisgICAgVVNIT1JUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FwYWJpbGl0eUluZm87CisKKyAgICBQTkVUX0RFViAgICAgICAgICAgICAgICAgICAJCQlNU1NJRERldjsKKworCU5ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREUgICAgIEF1dGhNb2RlOworCU5ESVNfODAyXzExX1dFUF9TVEFUVVMgICAgICAgICAgICAgIFdlcFN0YXR1czsKKwlORElTXzgwMl8xMV9XRVBfU1RBVFVTCQkJCUdyb3VwS2V5V2VwU3RhdHVzOworCVdQQV9NSVhfUEFJUl9DSVBIRVIJCQkJCVdwYU1peFBhaXJDaXBoZXI7CisKKwlVTE9ORwkJCQkJCQkJVHhDb3VudDsKKwlVTE9ORwkJCQkJCQkJUnhDb3VudDsKKwlVTE9ORwkJCQkJCQkJUmVjZWl2ZWRCeXRlQ291bnQ7CisJVUxPTkcJCQkJCQkJCVRyYW5zbWl0dGVkQnl0ZUNvdW50OworCVVMT05HCQkJCQkJCQlSeEVycm9yQ291bnQ7CisJVUxPTkcJCQkJCQkJCVJ4RHJvcENvdW50OworCisJSFRUUkFOU01JVF9TRVRUSU5HCQkJCQlIVFBoeU1vZGUsIE1heEhUUGh5TW9kZSwgTWluSFRQaHlNb2RlOy8vIEZvciB0cmFuc21pdCBwaHkgc2V0dGluZyBpbiBUWFdJLgorCVJUX0hUX1BIWV9JTkZPCQkJCQkJRGVzaXJlZEh0UGh5SW5mbzsKKwlERVNJUkVEX1RSQU5TTUlUX1NFVFRJTkcgICAgICAgIAlEZXNpcmVkVHJhbnNtaXRTZXR0aW5nOyAvLyBEZXNpcmVkIHRyYW5zbWl0IHNldHRpbmcuIHRoaXMgaXMgZm9yIHJlYWRpbmcgcmVnaXN0cnkgc2V0dGluZyBvbmx5LiBub3QgdXNlZnVsLgorCUJPT0xFQU4JCQkJCQkJCWJBdXRvVHhSYXRlU3dpdGNoOworCisJLy9DSVBIRVJfS0VZICAgICAgICAgICAgICAgICAgICAgICAgICBTaGFyZWRLZXlbU0hBUkVfS0VZX05VTV07IC8vIHJlZiBwQWQtPlNoYXJlZEtleVtCU1NdWzRdCisJVUNIQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdEtleUlkOworCisJVUNIQVIJCQkJCQkJCVR4UmF0ZTsgICAgICAgLy8gUkFURV8xLCBSQVRFXzIsIFJBVEVfNV81LCBSQVRFXzExLCAuLi4KKwlVQ0hBUiAgICAgCQkJCQkJCURlc2lyZWRSYXRlc1tNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFU107Ly8gT0lEXzgwMl8xMV9ERVNJUkVEX1JBVEVTCisJVUNIQVIJCQkJCQkJCURlc2lyZWRSYXRlc0luZGV4OworCVVDSEFSICAgICAJCQkJCQkJTWF4VHhSYXRlOyAgICAgICAgICAgIC8vIFJBVEVfMSwgUkFURV8yLCBSQVRFXzVfNSwgUkFURV8xMQorCisvLwlVTE9ORyAgICAgICAgICAgCQkJCQlUaW1CaXRtYXA7ICAgICAgLy8gYml0MCBmb3IgYnJvYWRjYXN0LCAxIGZvciBBSUQxLCAyIGZvciBBSUQyLCAuLi5zbyBvbgorLy8gICAgVUxPTkcgICAgICAgICAgIAkJCQkJVGltQml0bWFwMjsgICAgIC8vIGIwIGZvciBBSUQzMiwgYjEgZm9yIEFJRDMzLCAuLi4gYW5kIHNvIG9uCisJVUNIQVIJCQkJCQkJCVRpbUJpdG1hcHNbV0xBTl9NQVhfTlVNX09GX1RJTV07CisKKyAgICAvLyBXUEEKKyAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTUtbMzJdOworICAgIFVDSEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBNS1szMl07CisJVUNIQVIJCQkJCQkJCUdUS1szMl07CisgICAgQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUVFRTgwMjFYOworICAgIEJPT0xFQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByZUF1dGg7CisgICAgVUNIQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR05vbmNlWzMyXTsKKyAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb3J0U2VjdXJlZDsKKyAgICBORElTXzgwMl8xMV9QUklWQUNZX0ZJTFRFUiAgICAgICAgICBQcml2YWN5RmlsdGVyOworICAgIFVDSEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJBTkNsYXNzM0RhdGE7CisgICAgVUxPTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSXNvbGF0ZUludGVyU3RhVHJhZmZpYzsKKworICAgIFVDSEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJTTklFX0xlblsyXTsKKyAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSU05fSUVbMl1bTUFYX0xFTl9PRl9SU05JRV07CisKKworICAgIFVDSEFSICAgICAgICAgICAgICAgICAgIAkJCVRpbUlFTG9jYXRpb25JbkJlYWNvbjsKKyAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICAJCQlDYXBhYmlsaXR5SW5mb0xvY2F0aW9uSW5CZWFjb247CisgICAgLy8gb3V0Z29pbmcgQkVBQ09OIGZyYW1lIGJ1ZmZlciBhbmQgY29ycmVzcG9uZGluZyBUWFdJCisJLy8gUFRYV0lfU1RSVUMgICAgICAgICAgICAgICAgICAgICAgICAgICBCZWFjb25UeFdJOyAvLworICAgIENIQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJlYWNvbkJ1ZltNQVhfQkVBQ09OX1NJWkVdOyAvLyBOT1RFOiBCZWFjb25CdWYgc2hvdWxkIGJlIDQtYnl0ZSBhbGlnbmVkCisKKyAgICBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiSGlkZVNzaWQ7CisJVUlOVDE2CQkJCQkJCQlTdGF0aW9uS2VlcEFsaXZlVGltZTsgLy8gdW5pdDogc2Vjb25kCisKKyAgICBVU0hPUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWTEFOX1ZJRDsKKyAgICBVU0hPUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWTEFOX1ByaW9yaXR5OworCisgICAgUlRfODAyXzExX0FDTAkJCQkJCUFjY2Vzc0NvbnRyb2xMaXN0OworCisJLy8gRURDQSBRb3MKKyAgICBCT09MRUFOCQkJCQkJCQliV21tQ2FwYWJsZTsJLy8gMDpkaXNhYmxlIFdNTSwgMTplbmFibGUgV01NCisgICAgQk9PTEVBTgkJCQkJCQkJYkRMU0NhcGFibGU7CS8vIDA6ZGlzYWJsZSBETFMsIDE6ZW5hYmxlIERMUworCisJVUNIQVIgICAgICAgICAgIAkJCQkJRGxzUFRLWzY0XTsJCS8vIER1ZSB0byB3aW5kb3dzIGRpcnZlciBjb3VudCBvbiBtZWV0aW5naG91c2UgdG8gaGFuZGxlIDQtd2F5IHNoYWtlCisKKwkvLyBGb3IgODAyLjF4IGRhZW1vbiBzZXR0aW5nIHBlciBCU1MKKwlVQ0hBUgkJCQkJCQkJcmFkaXVzX3Nydl9udW07CisJUkFESVVTX1NSVl9JTkZPCQkJCQkJcmFkaXVzX3Nydl9pbmZvW01BWF9SQURJVVNfU1JWX05VTV07CisKKyNpZmRlZiBSVEw4NjVYX1NPQworCXVuc2lnbmVkIGludAkJCQkJCW15bGlua2lkOworI2VuZGlmCisKKworCVVJTlQzMgkJCQkJUmN2ZENvbmZsaWN0U3NpZENvdW50OworCVVJTlQzMgkJCQkJUmN2ZFNwb29mZWRBc3NvY1Jlc3BDb3VudDsKKwlVSU5UMzIJCQkJCVJjdmRTcG9vZmVkUmVhc3NvY1Jlc3BDb3VudDsKKwlVSU5UMzIJCQkJCVJjdmRTcG9vZmVkUHJvYmVSZXNwQ291bnQ7CisJVUlOVDMyCQkJCQlSY3ZkU3Bvb2ZlZEJlYWNvbkNvdW50OworCVVJTlQzMgkJCQkJUmN2ZFNwb29mZWREaXNhc3NvY0NvdW50OworCVVJTlQzMgkJCQkJUmN2ZFNwb29mZWRBdXRoQ291bnQ7CisJVUlOVDMyCQkJCQlSY3ZkU3Bvb2ZlZERlYXV0aENvdW50OworCVVJTlQzMgkJCQkJUmN2ZFNwb29mZWRVbmtub3duTWdtdENvdW50OworCVVJTlQzMgkJCQkJUmN2ZFJlcGxheUF0dGFja0NvdW50OworCisJQ0hBUgkJCQkJUnNzaU9mUmN2ZENvbmZsaWN0U3NpZDsKKwlDSEFSCQkJCQlSc3NpT2ZSY3ZkU3Bvb2ZlZEFzc29jUmVzcDsKKwlDSEFSCQkJCQlSc3NpT2ZSY3ZkU3Bvb2ZlZFJlYXNzb2NSZXNwOworCUNIQVIJCQkJCVJzc2lPZlJjdmRTcG9vZmVkUHJvYmVSZXNwOworCUNIQVIJCQkJCVJzc2lPZlJjdmRTcG9vZmVkQmVhY29uOworCUNIQVIJCQkJCVJzc2lPZlJjdmRTcG9vZmVkRGlzYXNzb2M7CisJQ0hBUgkJCQkJUnNzaU9mUmN2ZFNwb29mZWRBdXRoOworCUNIQVIJCQkJCVJzc2lPZlJjdmRTcG9vZmVkRGVhdXRoOworCUNIQVIJCQkJCVJzc2lPZlJjdmRTcG9vZmVkVW5rbm93bk1nbXQ7CisJQ0hBUgkJCQkJUnNzaU9mUmN2ZFJlcGxheUF0dGFjazsKKworCUJPT0xFQU4JCQkJCWJCY25TbnRSZXE7CisJVUNIQVIJCQkJCUJjbkJ1ZklkeDsKK30gTVVMVElTU0lEX1NUUlVDVCwgKlBNVUxUSVNTSURfU1RSVUNUOworCisKKworI2lmZGVmIERPVDExTl9EUkFGVDMKK3R5cGVkZWYgZW51bSBfQlNTMjA0MENPRVhJU1RfRkxBR3sKKwlCU1NfMjA0MF9DT0VYSVNUX0RJU0FCTEUgPSAwLAorCUJTU18yMDQwX0NPRVhJU1RfVElNRVJfRklSRUQgID0gMSwKKwlCU1NfMjA0MF9DT0VYSVNUX0lORk9fU1lOQyA9IDIsCisJQlNTXzIwNDBfQ09FWElTVF9JTkZPX05PVElGWSA9IDQsCit9QlNTMjA0MENPRVhJU1RfRkxBRzsKKyNlbmRpZiAvLyBET1QxMU5fRFJBRlQzIC8vCisKKy8vIGNvbmZpZ3VyYXRpb24gY29tbW9uIHRvIE9QTU9ERV9BUCBhcyB3ZWxsIGFzIE9QTU9ERV9TVEEKK3R5cGVkZWYgc3RydWN0IF9DT01NT05fQ09ORklHIHsKKworCUJPT0xFQU4JCWJDb3VudHJ5RmxhZzsKKwlVQ0hBUgkJQ291bnRyeUNvZGVbM107CisJVUNIQVIJCUdlb2dyYXBoeTsKKwlVQ0hBUiAgICAgICBDb3VudHJ5UmVnaW9uOyAgICAgIC8vIEVudW0gb2YgY291bnRyeSByZWdpb24sIDA6RkNDLCAxOklDLCAyOkVUU0ksIDM6U1BBSU4sIDQ6RnJhbmNlLCA1Ok1LSywgNjpNS0sxLCA3OklzcmFlbAorCVVDSEFSICAgICAgIENvdW50cnlSZWdpb25Gb3JBQmFuZDsJLy8gRW51bSBvZiBjb3VudHJ5IHJlZ2lvbiBmb3IgQSBiYW5kCisJVUNIQVIgICAgICAgUGh5TW9kZTsgICAgICAgICAgICAvLyBQSFlfMTFBLCBQSFlfMTFCLCBQSFlfMTFCR19NSVhFRCwgUEhZX0FCR19NSVhFRAorCVVTSE9SVCAgICAgIERzaWZzOyAgICAgICAgICAgICAgLy8gaW4gdW5pdHMgb2YgdXNlYworCVVMT05HICAgICAgIFBhY2tldEZpbHRlcjsgICAgICAgLy8gUGFja2V0IGZpbHRlciBmb3IgcmVjZWl2aW5nCisKKwlDSEFSICAgICAgICBTc2lkW01BWF9MRU5fT0ZfU1NJRF07IC8vIE5PVCBOVUxMLXRlcm1pbmF0ZWQKKwlVQ0hBUiAgICAgICBTc2lkTGVuOyAgICAgICAgICAgICAgIC8vIHRoZSBhY3R1YWwgc3NpZCBsZW5ndGggaW4gdXNlZAorCVVDSEFSICAgICAgIExhc3RTc2lkTGVuOyAgICAgICAgICAgICAgIC8vIHRoZSBhY3R1YWwgc3NpZCBsZW5ndGggaW4gdXNlZAorCUNIQVIgICAgICAgIExhc3RTc2lkW01BWF9MRU5fT0ZfU1NJRF07IC8vIE5PVCBOVUxMLXRlcm1pbmF0ZWQKKwlVQ0hBUgkJTGFzdEJzc2lkW01BQ19BRERSX0xFTl07CisKKwlVQ0hBUiAgICAgICBCc3NpZFtNQUNfQUREUl9MRU5dOworCVVTSE9SVCAgICAgIEJlYWNvblBlcmlvZDsKKwlVQ0hBUiAgICAgICBDaGFubmVsOworCVVDSEFSICAgICAgIENlbnRyYWxDaGFubmVsOyAgICAJLy8gQ2VudHJhbCBDaGFubmVsIHdoZW4gdXNpbmcgNDBNSHogaXMgaW5kaWNhdGluZy4gbm90IHJlYWwgY2hhbm5lbC4KKworI2lmIDAJLy8gbW92ZSB0byBTVEFfQURNSU5fQ09ORklHCisJVUNIQVIgICAgICAgRGVmYXVsdEtleUlkOworCisJTkRJU184MDJfMTFfUFJJVkFDWV9GSUxURVIgICAgICAgICAgUHJpdmFjeUZpbHRlcjsgIC8vIFByaXZhY3lGaWx0ZXIgZW51bSBmb3IgODAyLjFYCisJTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fTU9ERSAgICAgQXV0aE1vZGU7ICAgICAgIC8vIFRoaXMgc2hvdWxkIG1hdGNoIHRvIHdoYXRldmVyIG1pY3Jvc29mdCBkZWZpbmVkCisJTkRJU184MDJfMTFfV0VQX1NUQVRVUyAgICAgICAgICAgICAgV2VwU3RhdHVzOworCU5ESVNfODAyXzExX1dFUF9TVEFUVVMJCQkJT3JpZ1dlcFN0YXR1czsJLy8gT3JpZ2luYWwgd2VwIHN0YXR1cyBzZXQgZnJvbSBPSUQKKworCS8vIEFkZCB0byBzdXBwb3J0IGRpZmZlcmVudCBjaXBoZXIgc3VpdGUgZm9yIFdQQTIvV1BBIG1vZGUKKwlORElTXzgwMl8xMV9FTkNSWVBUSU9OX1NUQVRVUwkJR3JvdXBDaXBoZXI7CQkvLyBNdWx0aWNhc3QgY2lwaGVyIHN1aXRlCisJTkRJU184MDJfMTFfRU5DUllQVElPTl9TVEFUVVMJCVBhaXJDaXBoZXI7CQkJLy8gVW5pY2FzdCBjaXBoZXIgc3VpdGUKKwlCT09MRUFOCQkJCQkJCQliTWl4Q2lwaGVyOwkJCS8vIEluZGljYXRlIGN1cnJlbnQgUGFpciAmIEdyb3VwIHVzZSBkaWZmZXJlbnQgY2lwaGVyIHN1aXRlcworCVVTSE9SVAkJCQkJCQkJUnNuQ2FwYWJpbGl0eTsKKworCU5ESVNfODAyXzExX1dFUF9TVEFUVVMgICAgICAgICAgICAgIEdyb3VwS2V5V2VwU3RhdHVzOworI2VuZGlmCisKKwlVQ0hBUiAgICAgICBTdXBSYXRlW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXTsKKwlVQ0hBUiAgICAgICBTdXBSYXRlTGVuOworCVVDSEFSICAgICAgIEV4dFJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdOworCVVDSEFSICAgICAgIEV4dFJhdGVMZW47CisJVUNIQVIgICAgICAgRGVzaXJlUmF0ZVtNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFU107ICAgICAgLy8gT0lEXzgwMl8xMV9ERVNJUkVEX1JBVEVTCisJVUNIQVIgICAgICAgTWF4RGVzaXJlZFJhdGU7CisJVUNIQVIgICAgICAgRXhwZWN0ZWRBQ0tSYXRlW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXTsKKworCVVMT05HICAgICAgIEJhc2ljUmF0ZUJpdG1hcDsgICAgICAgIC8vIGJhY2t1cCBiYXNpYyByYXRlYml0bWFwCisKKwlCT09MRUFOCQliQVBTRENhcGFibGU7CisJQk9PTEVBTgkJYkluU2VydmljZVBlcmlvZDsKKwlCT09MRUFOCQliQVBTREFDX0JFOworCUJPT0xFQU4JCWJBUFNEQUNfQks7CisJQk9PTEVBTgkJYkFQU0RBQ19WSTsKKwlCT09MRUFOCQliQVBTREFDX1ZPOworCUJPT0xFQU4JCWJOZWVkU2VuZFRyaWdnZXJGcmFtZTsKKwlCT09MRUFOCQliQVBTREZvcmNlUG93ZXJTYXZlOwkvLyBGb3JjZSBwb3dlciBzYXZlIG1vZGUsIHNob3VsZCBvbmx5IHVzZSBpbiBBUFNELVNUQVVUCisJVUxPTkcJCVRyaWdnZXJUaW1lckNvdW50OworCVVDSEFSCQlNYXhTUExlbmd0aDsKKwlVQ0hBUgkJQkJQQ3VycmVudEJXOwkvLyBCV18xMCwgCUJXXzIwLCBCV180MAorCS8vIG1vdmUgdG8gTVVMVElTU0lEX1NUUlVDVCBmb3IgTUJTUworCS8vSFRUUkFOU01JVF9TRVRUSU5HCUhUUGh5TW9kZSwgTWF4SFRQaHlNb2RlLCBNaW5IVFBoeU1vZGU7Ly8gRm9yIHRyYW5zbWl0IHBoeSBzZXR0aW5nIGluIFRYV0kuCisJUkVHX1RSQU5TTUlUX1NFVFRJTkcgICAgICAgIFJlZ1RyYW5zbWl0U2V0dGluZzsgLy9yZWdpc3RyeSB0cmFuc21pdCBzZXR0aW5nLiB0aGlzIGlzIGZvciByZWFkaW5nIHJlZ2lzdHJ5IHNldHRpbmcgb25seS4gbm90IHVzZWZ1bC4KKwkvL1VDSEFSICAgICAgIEZpeGVkVHhNb2RlOyAgICAgICAgICAgICAgLy8gRml4ZWQgVHggTW9kZSAoQ0NLLCBPRkRNKSwgZm9yIEhUIGZpeGVkIHR4IG1vZGUgKEdGLCBNSVgpICwgcmVmZXIgdG8gUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkhUTW9kZQorCVVDSEFSICAgICAgIFR4UmF0ZTsgICAgICAgICAgICAgICAgIC8vIFNhbWUgdmFsdWUgdG8gZmlsbCBpbiBUWEQuIFR4UmF0ZSBpcyA2LWJpdAorCVVDSEFSICAgICAgIE1heFR4UmF0ZTsgICAgICAgICAgICAgIC8vIFJBVEVfMSwgUkFURV8yLCBSQVRFXzVfNSwgUkFURV8xMQorCVVDSEFSICAgICAgIFR4UmF0ZUluZGV4OyAgICAgICAgICAgIC8vIFR4IHJhdGUgaW5kZXggaW4gUmF0ZVN3aXRjaFRhYmxlCisJVUNIQVIgICAgICAgVHhSYXRlVGFibGVTaXplOyAgICAgICAgLy8gVmFsaWQgVHggcmF0ZSB0YWJsZSBzaXplIGluIFJhdGVTd2l0Y2hUYWJsZQorCS8vQk9PTEVBTgkJYkF1dG9UeFJhdGVTd2l0Y2g7CisJVUNIQVIgICAgICAgTWluVHhSYXRlOyAgICAgICAgICAgICAgLy8gUkFURV8xLCBSQVRFXzIsIFJBVEVfNV81LCBSQVRFXzExCisJVUNIQVIgICAgICAgUnRzUmF0ZTsgICAgICAgICAgICAgICAgLy8gUkFURV94eHgKKwlIVFRSQU5TTUlUX1NFVFRJTkcJTWxtZVRyYW5zbWl0OyAgIC8vIE1HTVQgZnJhbWUgUEhZIHJhdGUgc2V0dGluZyB3aGVuIG9wZXJhdGluIGF0IEh0IHJhdGUuCisJVUNIQVIgICAgICAgTWxtZVJhdGU7ICAgICAgICAgICAgICAgLy8gUkFURV94eHgsIHVzZWQgdG8gc2VuZCBNTE1FIGZyYW1lcworCVVDSEFSICAgICAgIEJhc2ljTWxtZVJhdGU7ICAgICAgICAgIC8vIERlZmF1bHQgUmF0ZSBmb3Igc2VuZGluZyBNTE1FIGZyYW1lcworCisJVVNIT1JUICAgICAgUnRzVGhyZXNob2xkOyAgICAgICAgICAgLy8gaW4gdW5pdCBvZiBCWVRFCisJVVNIT1JUICAgICAgRnJhZ21lbnRUaHJlc2hvbGQ7ICAgICAgLy8gaW4gdW5pdCBvZiBCWVRFCisKKwlVQ0hBUiAgICAgICBUeFBvd2VyOyAgICAgICAgICAgICAgICAvLyBpbiB1bml0IG9mIG1XCisJVUxPTkcgICAgICAgVHhQb3dlclBlcmNlbnRhZ2U7ICAgICAgLy8gMH4xMDAgJQorCVVMT05HICAgICAgIFR4UG93ZXJEZWZhdWx0OyAgICAgICAgIC8vIGtlZXAgZm9yIFR4UG93ZXJQZXJjZW50YWdlCisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwlCQUNBUF9TVFJVQyAgICAgICAgQkFDYXBhYmlsaXR5OyAvLyAgIE5PIFVTRSA9IDBYRkYgIDsgIElNTUVEX0JBID0xICA7ICBERUxBWV9CQT0wCisJQkFDQVBfU1RSVUMgICAgICAgIFJFR0JBQ2FwYWJpbGl0eTsgLy8gICBOTyBVU0UgPSAwWEZGICA7ICBJTU1FRF9CQSA9MSAgOyAgREVMQVlfQkE9MAorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCUlPVF9TVFJVQwkJSU9UZXN0UGFybTsJLy8gODAyLjExbiBJbnRlck9wYmlsaXR5IFRlc3QgUGFyYW1ldGVyOworCVVMT05HICAgICAgIFR4UHJlYW1ibGU7ICAgICAgICAgICAgIC8vIFJ0ODAyXzExUHJlYW1ibGVMb25nLCBSdDgwMl8xMVByZWFtYmxlU2hvcnQsIFJ0ODAyXzExUHJlYW1ibGVBdXRvCisJQk9PTEVBTiAgICAgYlVzZVplcm9Ub0Rpc2FibGVGcmFnbWVudDsgICAgIC8vIE1pY3Jvc29mdCB1c2UgMCBhcyBkaXNhYmxlCisJVUxPTkcgICAgICAgVXNlQkdQcm90ZWN0aW9uOyAgICAgICAgLy8gMDogYXV0bywgMTogYWx3YXlzIHVzZSwgMjogYWx3YXlzIG5vdCB1c2UKKwlCT09MRUFOICAgICBiVXNlU2hvcnRTbG90VGltZTsgICAgICAvLyAwOiBkaXNhYmxlLCAxIC0gdXNlIHNob3J0IHNsb3QgKDl1cykKKwlCT09MRUFOICAgICBiRW5hYmxlVHhCdXJzdDsgICAgICAgICAvLyAxOiBlbmJsZSBUWCBQQUNLRVQgQlVSU1QsIDA6IGRpc2FibGUgVFggUEFDS0VUIEJVUlNUCisJQk9PTEVBTiAgICAgYkFnZ3JlZ2F0aW9uQ2FwYWJsZTsgICAgICAvLyAxOiBlbmFibGUgVFggYWdncmVnYXRpb24gd2hlbiB0aGUgcGVlciBzdXBwb3J0cyBpdAorCUJPT0xFQU4gICAgIGJQaWdneUJhY2tDYXBhYmxlOwkJLy8gMTogZW5hYmxlIFRYIHBpZ2d5LWJhY2sgYWNjb3JkaW5nIE1BQydzIHZlcnNpb24KKwlCT09MRUFOICAgICBiSUVFRTgwMjExSDsJCQkvLyAxOiBlbmFibGUgSUVFRTgwMi4xMWggc3BlYy4KKwlVTE9ORwkJRGlzYWJsZU9MQkNEZXRlY3Q7CQkvLyAwOiBlbmFibGUgT0xCQyBkZXRlY3Q7IDEgZGlzYWJsZSBPTEJDIGRldGVjdAorCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJQk9PTEVBTgkJCQliUmRnOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCUJPT0xFQU4gICAgICAgICAgICAgYldtbUNhcGFibGU7ICAgICAgICAvLyAwOmRpc2FibGUgV01NLCAxOmVuYWJsZSBXTU0KKwlRT1NfQ0FQQUJJTElUWV9QQVJNIEFQUW9zQ2FwYWJpbGl0eTsgICAgLy8gUU9TIGNhcGFiaWxpdHkgb2YgdGhlIGN1cnJlbnQgYXNzb2NpYXRlZCBBUAorCUVEQ0FfUEFSTSAgICAgICAgICAgQVBFZGNhUGFybTsgICAgICAgICAvLyBFRENBIHBhcmFtZXRlcnMgb2YgdGhlIGN1cnJlbnQgYXNzb2NpYXRlZCBBUAorCVFCU1NfTE9BRF9QQVJNICAgICAgQVBRYnNzTG9hZDsgICAgICAgICAvLyBRQlNTIGxvYWQgb2YgdGhlIGN1cnJlbnQgYXNzb2NpYXRlZCBBUAorCVVDSEFSICAgICAgICAgICAgICAgQWNrUG9saWN5WzRdOyAgICAgICAvLyBBQ0sgcG9saWN5IG9mIHRoZSBzcGVjaWZpZWQgQUMuIHNlZSBBQ0tfeHh4CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJQk9PTEVBTgkJCQliRExTQ2FwYWJsZTsJCS8vIDA6ZGlzYWJsZSBETFMsIDE6ZW5hYmxlIERMUworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCS8vIGEgYml0bWFwIG9mIEJPT0xFQU4gZmxhZ3MuIGVhY2ggYml0IHJlcHJlc2VudCBhbiBvcGVyYXRpb24gc3RhdHVzIG9mIGEgcGFydGljdWxhcgorCS8vIEJPT0xFQU4gY29udHJvbCwgZWl0aGVyIE9OIG9yIE9GRi4gVGhlc2UgZmxhZ3Mgc2hvdWxkIGFsd2F5cyBiZSBhY2Nlc3NlZCB2aWEKKwkvLyBPUFNUQVRVU19URVNUX0ZMQUcoKSwgT1BTVEFUVVNfU0VUX0ZMQUcoKSwgT1BfU1RBVFVTX0NMRUFSX0ZMQUcoKSBtYWNyb3MuCisJLy8gc2VlIGZPUF9TVEFUVVNfeHh4IGluIFJUTVBfREVGLkMgZm9yIGRldGFpbCBiaXQgZGVmaW5pdGlvbgorCVVMT05HICAgICAgICAgICAgICAgT3BTdGF0dXNGbGFnczsKKworCUJPT0xFQU4JCQkJTmRpc1JhZGlvU3RhdGVPZmY7IC8vRm9yIEhDVCAxMi4wLCBzZXQgdGhpcyBmbGFnIHRvIFRSVUUgaW5zdGVhZCBvZiBjYWxsZWQgTWxtZVJhZGlvT2ZmLgorCUFCR0JBTkRfU1RBVEUJCUJhbmRTdGF0ZTsJCS8vIEZvciBzZXR0aW5nIEJCUCB1c2VkIG9uIEIvRyBvciBBIG1vZGUuCisKKwkvLyBJRUVFODAyLjExSC0tREZTLgorCVJBREFSX0RFVEVDVF9TVFJVQ1QJUmFkYXJEZXRlY3Q7CisKKyNpZmRlZiBDQVJSSUVSX0RFVEVDVElPTl9TVVBQT1JUCisJQ0FSUklFUl9ERVRFQ1RJT04JCUNhcnJpZXJEZXRlY3Q7CisjZW5kaWYgLy8gQ0FSUklFUl9ERVRFQ1RJT05fU1VQUE9SVCAvLworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJLy8gSFQKKwlVQ0hBUgkJCUJBU2l6ZTsJCS8vIFVTZXIgZGVzaXJlZCBCQVdpbmRvd1NpemUuIFNob3VsZCBub3QgZXhjZWVkIG91ciBtYXggY2FwYWJpbGl0eQorCS8vUlRfSFRfQ0FQQUJJTElUWQlTdXBwb3J0ZWRIdFBoeTsKKwlSVF9IVF9DQVBBQklMSVRZCURlc2lyZWRIdFBoeTsKKwlIVF9DQVBBQklMSVRZX0lFCQlIdENhcGFiaWxpdHk7CisJQUREX0hUX0lORk9fSUUJCUFkZEhUSW5mbzsJLy8gVXNlZnVsIGFzIEFQLgorCS8vVGhpcyBJRSBpcyB1c2VkIHdpdGggY2hhbm5lbCBzd2l0Y2ggYW5ub3VuY2VtZW50IGVsZW1lbnQgd2hlbiBjaGFuZ2luZyB0byBhIG5ldyA0ME1Iei4KKwkvL1RoaXMgSUUgaXMgaW5jbHVkZWQgaW4gY2hhbm5lbCBzd2l0Y2ggYW1tb3VuY2VtZW50IGZyYW1lcyA3LjQuMS41LCBiZWFjb25zLCBwcm9iZSBSc3AuCisJTkVXX0VYVF9DSEFOX0lFCU5ld0V4dENoYW5PZmZzZXQ7CS8vNy4zLjIuMjBBLCAxIGlmIGV4dGVuc2lvbiBjaGFubmVsIGlzIGFib3ZlIHRoZSBjb250cm9sIGNoYW5uZWwsIDMgaWYgYmVsb3csIDAgaWYgbm90IHByZXNlbnQKKworI2lmZGVmIERPVDExTl9EUkFGVDMKKwlVQ0hBUgkJCQkJQnNzMjA0MENvZXhpc3RGbGFnOwkJLy8gYml0IDA6IGJCc3NDb2V4aXN0VGltZXJSdW5uaW5nLCBiaXQgMTogTmVlZFN5bmNBZGRIdEluZm8uCisJUkFMSU5LX1RJTUVSX1NUUlVDVAlCc3MyMDQwQ29leGlzdFRpbWVyOworCisJLy9UaGlzIElFIGlzIHVzZWQgZm9yIDIwLzQwIEJTUyBDb2V4aXN0ZW5jZS4KKwlCU1NfMjA0MF9DT0VYSVNUX0lFCQlCU1MyMDQwQ29leGlzdEluZm87CisJLy8gPT09PT09IDExbiBEMy4wID09PT09PT09PT09PT09PT09PT09PT09PgorCVVTSE9SVAkJCQkJRG90MTFPQnNzU2NhblBhc3NpdmVEd2VsbDsJCQkJLy8gVW5pdCA6IFRVLiA1fjEwMDAKKwlVU0hPUlQJCQkJCURvdDExT0Jzc1NjYW5BY3RpdmVEd2VsbDsJCQkJLy8gVW5pdCA6IFRVLiAxMH4xMDAwCisJVVNIT1JUCQkJCQlEb3QxMUJzc1dpZHRoVHJpZ2dlclNjYW5JbnQ7CQkJLy8gVW5pdCA6IFNlY29uZAorCVVTSE9SVAkJCQkJRG90MTFPQnNzU2NhblBhc3NpdmVUb3RhbFBlckNoYW5uZWw7CS8vIFVuaXQgOiBUVS4gMjAwfjEwMDAwCisJVVNIT1JUCQkJCQlEb3QxMU9Cc3NTY2FuQWN0aXZlVG90YWxQZXJDaGFubmVsOwkvLyBVbml0IDogVFUuIDIwfjEwMDAwCisJVVNIT1JUCQkJCQlEb3QxMUJzc1dpZHRoQ2hhblRyYW5EZWxheUZhY3RvcjsKKwlVU0hPUlQJCQkJCURvdDExT0Jzc1NjYW5BY3Rpdml0eVRocmU7CQkJCS8vIFVuaXQgOiBwZXJjZW50YWdlCisKKwlVTE9ORwkJCQkJRG90MTFCc3NXaWR0aENoYW5UcmFuRGVsYXk7CQkJLy8gbXVsdGlwbGUgb2YgKERvdDExQnNzV2lkdGhUcmlnZ2VyU2NhbkludCAqIERvdDExQnNzV2lkdGhDaGFuVHJhbkRlbGF5RmFjdG9yKQorCVVMT05HCQkJCQlDb3VudERvd25DdHI7CS8vIENvdW50RG93biBDb3VudGVyIGZyb20gKERvdDExQnNzV2lkdGhUcmlnZ2VyU2NhbkludCAqIERvdDExQnNzV2lkdGhDaGFuVHJhbkRlbGF5RmFjdG9yKQorCisJTkRJU19TUElOX0xPQ0sgICAgICAgICAgVHJpZ2dlckV2ZW50VGFiTG9jazsKKwlCU1NfMjA0MF9DT0VYSVNUX0lFCQlMYXN0QlNTQ29leGlzdDIwNDA7CisJQlNTXzIwNDBfQ09FWElTVF9JRQkJQlNTQ29leGlzdDIwNDA7CisJVFJJR0dFUl9FVkVOVF9UQUIJCVRyaWdnZXJFdmVudFRhYjsKKwlVQ0hBUgkJCQkJQ2hhbm5lbExpc3RJZHg7CisJLy8gPD09PT09PSAxMW4gRDMuMCA9PT09PT09PT09PT09PT09PT09PT09PQorCUJPT0xFQU4JCQkJCWJPdmVybGFwU2Nhbm5pbmc7CisjZW5kaWYgLy8gRE9UMTFOX0RSQUZUMyAvLworCisgICAgQk9PTEVBTiAgICAgICAgICAgICAgICAgYkhUUHJvdGVjdDsKKyAgICBCT09MRUFOICAgICAgICAgICAgICAgICBiTUlNT1BTRW5hYmxlOworICAgIEJPT0xFQU4JCQkJCWJCQURlY2xpbmU7CisJQk9PTEVBTgkJCQkJYkRpc2FibGVSZW9yZGVyaW5nOworCUJPT0xFQU4JCQkJCWJGb3J0eV9NaHpfSW50b2xlcmFudDsKKwlCT09MRUFOCQkJCQliRXh0Q2hhbm5lbFN3aXRjaEFubm91bmNlbWVudDsKKwlCT09MRUFOCQkJCQliUmN2QlNTV2lkdGhUcmlnZ2VyRXZlbnRzOworCVVMT05HCQkJCQlMYXN0UmN2QlNTV2lkdGhUcmlnZ2VyRXZlbnRzVGltZTsKKworCVVDSEFSCQkJCQlUeEJBU2l6ZTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCS8vIEVuYWJsZSB3aXJlbGVzcyBldmVudAorCUJPT0xFQU4JCQkJYldpcmVsZXNzRXZlbnQ7CisJQk9PTEVBTgkJCQliV2lGaVRlc3Q7CQkJCS8vIEVuYWJsZSB0aGlzIHBhcmFtZXRlciBmb3IgV2lGaSB0ZXN0CisKKwkvLyBUeCAmIFJ4IFN0cmVhbSBudW1iZXIgc2VsZWN0aW9uCisJVUNIQVIJCQkJVHhTdHJlYW07CisJVUNIQVIJCQkJUnhTdHJlYW07CisKKwkvLyB0cmFuc21pdCBwaHkgbW9kZSwgdHJhc21pdCByYXRlIGZvciBNdWx0aWNhc3QuCisjaWZkZWYgTUNBU1RfUkFURV9TUEVDSUZJQworCVVDSEFSCQkJCU1jYXN0VHJhbnNtaXRNY3M7CisJVUNIQVIJCQkJTWNhc3RUcmFuc21pdFBoeU1vZGU7CisjZW5kaWYgLy8gTUNBU1RfUkFURV9TUEVDSUZJQyAvLworCisJQk9PTEVBTiAgICAgCQliSGFyZHdhcmVSYWRpbzsgICAgIC8vIEhhcmR3YXJlIGNvbnRyb2xsZWQgUmFkaW8gZW5hYmxlZAorCisjaWZkZWYgUlQyODcwCisJQk9PTEVBTiAgICAgCQliTXVsdGlwbGVJUlA7ICAgICAgIC8vIE11bHRpcGxlIEJ1bGsgSU4gZmxhZworCVVDSEFSICAgICAgIAkJTnVtT2ZCdWxrSW5JUlA7ICAgICAvLyBpZiBiTXVsdGlwbGVJUlAgPT0gVFJVRSwgTnVtT2ZCdWxrSW5JUlAgd2lsbCBiZSA0IG90aGVyd2lzZSBiZSAxCisgCVJUX0hUX0NBUEFCSUxJVFkJU3VwcG9ydGVkSHRQaHk7CisJVUxPTkcJCQkJTWF4UGt0T25lVHhCdWxrOworCVVDSEFSCQkJCVR4QnVsa0ZhY3RvcjsKKwlVQ0hBUgkJCQlSeEJ1bGtGYWN0b3I7CisKKwlCRUFDT05fU1lOQ19TVFJVQ1QJKnBCZWFjb25TeW5jOworCVJBTElOS19USU1FUl9TVFJVQ1QJQmVhY29uVXBkYXRlVGltZXI7CisJVUlOVDMyCQkJCUJlYWNvbkFkanVzdDsKKwlVSU5UMzIJCQkJQmVhY29uRmFjdG9yOworCVVJTlQzMgkJCQlCZWFjb25SZW1haW47CisjZW5kaWYgLy8gUlQyODcwIC8vCisKKworIAlORElTX1NQSU5fTE9DSwkJCU1lYXN1cmVSZXFUYWJMb2NrOworCVBNRUFTVVJFX1JFUV9UQUIJCXBNZWFzdXJlUmVxVGFiOworCisJTkRJU19TUElOX0xPQ0sJCQlUcGNSZXFUYWJMb2NrOworCVBUUENfUkVRX1RBQgkJCXBUcGNSZXFUYWI7CisKKwkvLyB0cmFuc21pdCBwaHkgbW9kZSwgdHJhc21pdCByYXRlIGZvciBNdWx0aWNhc3QuCisjaWZkZWYgTUNBU1RfUkFURV9TUEVDSUZJQworCUhUVFJBTlNNSVRfU0VUVElORwkJTUNhc3RQaHlNb2RlOworI2VuZGlmIC8vIE1DQVNUX1JBVEVfU1BFQ0lGSUMgLy8KKworI2lmZGVmIFNJTkdMRV9TS1UKKwlVSU5UMTYJCQkJCURlZmluZU1heFR4UHdyOworI2VuZGlmIC8vIFNJTkdMRV9TS1UgLy8KKworCit9IENPTU1PTl9DT05GSUcsICpQQ09NTU9OX0NPTkZJRzsKKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisvKiBNb2RpZmllZCBieSBXdSBYaS1LdW4gNC8yMS8yMDA2ICovCisvLyBTVEEgY29uZmlndXJhdGlvbiBhbmQgc3RhdHVzCit0eXBlZGVmIHN0cnVjdCBfU1RBX0FETUlOX0NPTkZJRyB7CisJLy8gR1JPVVAgMSAtCisJLy8gICBVc2VyIGNvbmZpZ3VyYXRpb24gbG9hZGVkIGZyb20gUmVnaXN0cnksIEUyUFJPTSBvciBPSURfeHh4LiBUaGVzZSBzZXR0aW5ncyBkZXNjcmliZQorCS8vICAgdGhlIHVzZXIgaW50ZW5kZWQgY29uZmlndXJhdGlvbiwgYnV0IG5vdCBuZWNlc3NhcnkgZnVsbHkgZXF1YWwgdG8gdGhlIGZpbmFsCisJLy8gICBzZXR0aW5ncyBpbiBBQ1RJVkUgQlNTIGFmdGVyIG5lZ290aWF0aW9uL2NvbXByb21pemUgd2l0aCB0aGUgQlNTIGhvbGRlciAoZWl0aGVyCisJLy8gICBBUCBvciBJQlNTIGhvbGRlcikuCisJLy8gICBPbmNlIGluaXRpYWxpemVkLCB1c2VyIGNvbmZpZ3VyYXRpb24gY2FuIG9ubHkgYmUgY2hhbmdlZCB2aWEgT0lEX3h4eAorCVVDSEFSICAgICAgIEJzc1R5cGU7ICAgICAgICAgICAgICAvLyBCU1NfSU5GUkEgb3IgQlNTX0FESE9DCisJVVNIT1JUICAgICAgQXRpbVdpbjsgICAgICAgICAgLy8gdXNlZCB3aGVuIHN0YXJ0aW5nIGEgbmV3IElCU1MKKworCS8vIEdST1VQIDIgLQorCS8vICAgVXNlciBjb25maWd1cmF0aW9uIGxvYWRlZCBmcm9tIFJlZ2lzdHJ5LCBFMlBST00gb3IgT0lEX3h4eC4gVGhlc2Ugc2V0dGluZ3MgZGVzY3JpYmUKKwkvLyAgIHRoZSB1c2VyIGludGVuZGVkIGNvbmZpZ3VyYXRpb24sIGFuZCBzaG91bGQgYmUgYWx3YXlzIGFwcGxpZWQgdG8gdGhlIGZpbmFsCisJLy8gICBzZXR0aW5ncyBpbiBBQ1RJVkUgQlNTIHdpdGhvdXQgY29tcHJvbWlzaW5nIHdpdGggdGhlIEJTUyBob2xkZXIuCisJLy8gICBPbmNlIGluaXRpYWxpemVkLCB1c2VyIGNvbmZpZ3VyYXRpb24gY2FuIG9ubHkgYmUgY2hhbmdlZCB2aWEgT0lEX3h4eAorCVVDSEFSICAgICAgIFJzc2lUcmlnZ2VyOworCVVDSEFSICAgICAgIFJzc2lUcmlnZ2VyTW9kZTsgICAgICAvLyBSU1NJX1RSSUdHRVJFRF9VUE9OX0JFTE9XX1RIUkVTSE9MRCBvciBSU1NJX1RSSUdHRVJFRF9VUE9OX0VYQ0NFRURfVEhSRVNIT0xECisJVVNIT1JUICAgICAgRGVmYXVsdExpc3RlbkNvdW50OyAgIC8vIGRlZmF1bHQgbGlzdGVuIGNvdW50OworCVVMT05HICAgICAgIFdpbmRvd3NQb3dlck1vZGU7ICAgICAgICAgICAvLyBQb3dlciBtb2RlIGZvciBBQyBwb3dlcgorCVVMT05HICAgICAgIFdpbmRvd3NCYXR0ZXJ5UG93ZXJNb2RlOyAgICAvLyBQb3dlciBtb2RlIGZvciBiYXR0ZXJ5IGlmIGV4aXN0cworCUJPT0xFQU4gICAgIGJXaW5kb3dzQUNDQU1FbmFibGU7ICAgICAgICAvLyBFbmFibGUgQ0FNIHBvd2VyIG1vZGUgd2hlbiBBQyBvbgorCUJPT0xFQU4gICAgIGJBdXRvUmVjb25uZWN0OyAgICAgICAgIC8vIFNldCB0byBUUlVFIHdoZW4gc2V0dGluZyBPSURfODAyXzExX1NTSUQgd2l0aCBubyBtYXRjaGluZyBCU1NJRAorCVVMT05HICAgICAgIFdpbmRvd3NQb3dlclByb2ZpbGU7ICAgIC8vIFdpbmRvd3MgcG93ZXIgcHJvZmlsZSwgZm9yIE5ESVM1LjEgUG5QCisKKwkvLyBNSUI6aWVlZTgwMmRvdDExLmRvdDExc210KDEpLmRvdDExU3RhdGlvbkNvbmZpZ1RhYmxlKDEpCisJVVNIT1JUICAgICAgUHNtOyAgICAgICAgICAgICAgICAgIC8vIHBvd2VyIG1hbmFnZW1lbnQgbW9kZSAgIChQV1JfQUNUSVZFfFBXUl9TQVZFKQorCVVTSE9SVCAgICAgIERpc2Fzc29jUmVhc29uOworCVVDSEFSICAgICAgIERpc2Fzc29jU3RhW01BQ19BRERSX0xFTl07CisJVVNIT1JUICAgICAgRGVhdXRoUmVhc29uOworCVVDSEFSICAgICAgIERlYXV0aFN0YVtNQUNfQUREUl9MRU5dOworCVVTSE9SVCAgICAgIEF1dGhGYWlsUmVhc29uOworCVVDSEFSICAgICAgIEF1dGhGYWlsU3RhW01BQ19BRERSX0xFTl07CisKKwlORElTXzgwMl8xMV9QUklWQUNZX0ZJTFRFUiAgICAgICAgICBQcml2YWN5RmlsdGVyOyAgLy8gUHJpdmFjeUZpbHRlciBlbnVtIGZvciA4MDIuMVgKKwlORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9NT0RFICAgICBBdXRoTW9kZTsgICAgICAgLy8gVGhpcyBzaG91bGQgbWF0Y2ggdG8gd2hhdGV2ZXIgbWljcm9zb2Z0IGRlZmluZWQKKwlORElTXzgwMl8xMV9XRVBfU1RBVFVTICAgICAgICAgICAgICBXZXBTdGF0dXM7CisJTkRJU184MDJfMTFfV0VQX1NUQVRVUwkJCQlPcmlnV2VwU3RhdHVzOwkvLyBPcmlnaW5hbCB3ZXAgc3RhdHVzIHNldCBmcm9tIE9JRAorCisJLy8gQWRkIHRvIHN1cHBvcnQgZGlmZmVyZW50IGNpcGhlciBzdWl0ZSBmb3IgV1BBMi9XUEEgbW9kZQorCU5ESVNfODAyXzExX0VOQ1JZUFRJT05fU1RBVFVTCQlHcm91cENpcGhlcjsJCS8vIE11bHRpY2FzdCBjaXBoZXIgc3VpdGUKKwlORElTXzgwMl8xMV9FTkNSWVBUSU9OX1NUQVRVUwkJUGFpckNpcGhlcjsJCQkvLyBVbmljYXN0IGNpcGhlciBzdWl0ZQorCUJPT0xFQU4JCQkJCQkJCWJNaXhDaXBoZXI7CQkJLy8gSW5kaWNhdGUgY3VycmVudCBQYWlyICYgR3JvdXAgdXNlIGRpZmZlcmVudCBjaXBoZXIgc3VpdGVzCisJVVNIT1JUCQkJCQkJCQlSc25DYXBhYmlsaXR5OworCisJTkRJU184MDJfMTFfV0VQX1NUQVRVUyAgICAgICAgICAgICAgR3JvdXBLZXlXZXBTdGF0dXM7CisKKwlVQ0hBUgkJUE1LWzMyXTsgICAgICAgICAgICAgICAgLy8gV1BBIFBTSyBtb2RlIFBNSworCVVDSEFSICAgICAgIFBUS1s2NF07ICAgICAgICAgICAgICAgIC8vIFdQQSBQU0sgbW9kZSBQVEsKKwlVQ0hBUgkJR1RLWzMyXTsJCQkJLy8gR1RLIGZyb20gYXV0aGVudGljYXRvcgorCUJTU0lEX0lORk8JU2F2ZWRQTUtbUE1LSURfTk9dOworCVVJTlQJCVNhdmVkUE1LTnVtOwkJCS8vIFNhdmVkIFBNS0lEIG51bWJlcgorCisJVUNIQVIJCURlZmF1bHRLZXlJZDsKKworCisJLy8gV1BBIDgwMi4xeCBwb3J0IGNvbnRyb2wsIFdQQV84MDJfMVhfUE9SVF9TRUNVUkVELCBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQKKwlVQ0hBUiAgICAgICBQb3J0U2VjdXJlZDsKKworCS8vIEZvciBXUEEgY291bnRlcm1lYXN1cmVzCisJVUxPTkcgICAgICAgTGFzdE1pY0Vycm9yVGltZTsgICAvLyByZWNvcmQgbGFzdCBNSUMgZXJyb3IgdGltZQorCVVMT05HICAgICAgIE1pY0VyckNudDsgICAgICAgICAgLy8gU2hvdWxkIGJlIDAsIDEsIDIsIHRoZW4gcmVzZXQgdG8gemVybyAoYWZ0ZXIgZGlzYXNzb2ljaWF0aW9uKS4KKwlCT09MRUFOICAgICBiQmxvY2tBc3NvYzsgICAgICAgIC8vIEJsb2NrIGFzc29jaWF0ZSBhdHRlbXB0IGZvciA2MCBzZWNvbmRzIGFmdGVyIGNvdW50ZXIgbWVhc3VyZSBvY2N1cnJlZC4KKwkvLyBGb3IgV1BBLVBTSyBzdXBwbGljYW50IHN0YXRlCisJV1BBX1NUQVRFICAgV3BhU3RhdGU7ICAgICAgICAgICAvLyBEZWZhdWx0IGlzIFNTX05PVFVTRSBhbmQgaGFuZGxlZCBieSBtaWNyb3NvZnQgODAyLjF4CisJVUNIQVIgICAgICAgUmVwbGF5Q291bnRlcls4XTsKKwlVQ0hBUiAgICAgICBBTm9uY2VbMzJdOyAgICAgICAgIC8vIEFOb25jZSBmb3IgV1BBLVBTSyBmcm9tIGF1cmhlbnRpY2F0b3IKKwlVQ0hBUiAgICAgICBTTm9uY2VbMzJdOyAgICAgICAgIC8vIFNOb25jZSBmb3IgV1BBLVBTSworCisJVUNIQVIgICAgICAgTGFzdFNOUjA7ICAgICAgICAgICAgIC8vIGxhc3QgcmVjZWl2ZWQgQkVBQ09OJ3MgU05SCisJVUNIQVIgICAgICAgTGFzdFNOUjE7ICAgICAgICAgICAgLy8gbGFzdCByZWNlaXZlZCBCRUFDT04ncyBTTlIgZm9yIDJuZCAgYW50ZW5uYQorCVJTU0lfU0FNUExFIFJzc2lTYW1wbGU7CisJVUxPTkcgICAgICAgTnVtT2ZBdmdSc3NpU2FtcGxlOworCisJVUxPTkcgICAgICAgTGFzdEJlYWNvblJ4VGltZTsgICAgIC8vIE9TJ3MgdGltZXN0YW1wIG9mIHRoZSBsYXN0IEJFQUNPTiBSWCB0aW1lCisJVUxPTkcgICAgICAgTGFzdDExYkJlYWNvblJ4VGltZTsgIC8vIE9TJ3MgdGltZXN0YW1wIG9mIHRoZSBsYXN0IDExQiBCRUFDT04gUlggdGltZQorCVVMT05HCQlMYXN0MTFnQmVhY29uUnhUaW1lOwkvLyBPUydzIHRpbWVzdGFtcCBvZiB0aGUgbGFzdCAxMUcgQkVBQ09OIFJYIHRpbWUKKwlVTE9ORwkJTGFzdDIwTkJlYWNvblJ4VGltZTsJLy8gT1MncyB0aW1lc3RhbXAgb2YgdGhlIGxhc3QgMjBNSHogTiBCRUFDT04gUlggdGltZQorCisJVUxPTkcgICAgICAgTGFzdFNjYW5UaW1lOyAgICAgICAvLyBSZWNvcmQgbGFzdCBzY2FuIHRpbWUgZm9yIGlzc3VlIEJTU0lEX1NDQU5fTElTVAorCVVMT05HICAgICAgIFNjYW5DbnQ7ICAgICAgICAgICAgLy8gU2NhbiBjb3VudHMgc2luY2UgbW9zdCByZWNlbnQgU1NJRCwgQlNTSUQsIFNDQU4gT0lEIHJlcXVlc3QKKwlCT09MRUFOICAgICBiU3dSYWRpbzsgICAgICAgICAgIC8vIFNvZnR3YXJlIGNvbnRyb2xsZWQgUmFkaW8gT24vT2ZmLCBUUlVFOiBPbgorCUJPT0xFQU4gICAgIGJId1JhZGlvOyAgICAgICAgICAgLy8gSGFyZHdhcmUgY29udHJvbGxlZCBSYWRpbyBPbi9PZmYsIFRSVUU6IE9uCisJQk9PTEVBTiAgICAgYlJhZGlvOyAgICAgICAgICAgICAvLyBSYWRpbyBzdGF0ZSwgQW5kIG9mIFN3ICYgSHcgcmFkaW8gc3RhdGUKKwlCT09MRUFOICAgICBiSGFyZHdhcmVSYWRpbzsgICAgIC8vIEhhcmR3YXJlIGNvbnRyb2xsZWQgUmFkaW8gZW5hYmxlZAorCUJPT0xFQU4gICAgIGJTaG93SGlkZGVuU1NJRDsgICAgLy8gU2hvdyBhbGwga25vd24gU1NJRCBpbiBTU0lEIGxpc3QgZ2V0IG9wZXJhdGlvbgorCisKKwkvLyBOZXcgZm9yIFdQQSwgd2luZG93cyB3YW50IHVzIHRvIHRvIGtlZXAgYXNzb2NpYXRpb24gaW5mb3JtYXRpb24gYW5kCisJLy8gRml4ZWQgSUVzIGZyb20gbGFzdCBhc3NvY2lhdGlvbiByZXNwb25zZQorCU5ESVNfODAyXzExX0FTU09DSUFUSU9OX0lORk9STUFUSU9OICAgICBBc3NvY0luZm87CisJVVNIT1JUICAgICAgIFJlcVZhcklFTGVuOyAgICAgICAgICAgICAgICAvLyBMZW5ndGggb2YgbmV4dCBWSUUgaW5jbHVkZSBFSUQgJiBMZW5ndGgKKwlVQ0hBUiAgICAgICBSZXFWYXJJRXNbTUFYX1ZJRV9MRU5dOwkJLy8gVGhlIGNvbnRlbnQgc2F2ZWQgaGVyZSBzaG91bGQgYmUgbGl0dGxlLWVuZGlhbiBmb3JtYXQuCisJVVNIT1JUICAgICAgIFJlc1ZhcklFTGVuOyAgICAgICAgICAgICAgICAvLyBMZW5ndGggb2YgbmV4dCBWSUUgaW5jbHVkZSBFSUQgJiBMZW5ndGgKKwlVQ0hBUiAgICAgICBSZXNWYXJJRXNbTUFYX1ZJRV9MRU5dOworCisJVUNIQVIgICAgICAgUlNOSUVfTGVuOworCVVDSEFSICAgICAgIFJTTl9JRVtNQVhfTEVOX09GX1JTTklFXTsJLy8gVGhlIGNvbnRlbnQgc2F2ZWQgaGVyZSBzaG91bGQgYmUgbGl0dGxlLWVuZGlhbiBmb3JtYXQuCisKKwkvLyBOZXcgdmFyaWFibGVzIHVzZWQgZm9yIENDWCAxLjAKKwlCT09MRUFOICAgICAgICAgICAgIGJDa2lwT247CisJQk9PTEVBTiAgICAgICAgICAgICBiQ2tpcENtaWNPbjsKKwlVQ0hBUiAgICAgICAgICAgICAgIENraXBGbGFnOworCVVDSEFSICAgICAgICAgICAgICAgR0lWWzNdOyAgLy9mb3IgQ0NYIGl2CisJVUNIQVIgICAgICAgICAgICAgICBSeFNFUVs0XTsKKwlVQ0hBUiAgICAgICAgICAgICAgIFR4U0VRWzRdOworCVVDSEFSICAgICAgICAgICAgICAgQ0tJUE1JQ1s0XTsKKwlVQ0hBUiAgICAgICAgICAgICAgIExlYXBBdXRoTW9kZTsKKwlMRUFQX0FVVEhfSU5GTyAgICAgIExlYXBBdXRoSW5mbzsKKwlVQ0hBUiAgICAgICAgICAgICAgIEhhc2hQd2RbMTZdOworCVVDSEFSICAgICAgICAgICAgICAgTmV0d29ya0NoYWxsZW5nZVs4XTsKKwlVQ0hBUiAgICAgICAgICAgICAgIE5ldHdvcmtDaGFsbGVuZ2VSZXNwb25zZVsyNF07CisJVUNIQVIgICAgICAgICAgICAgICBQZWVyQ2hhbGxlbmdlWzhdOworCisJVUNIQVIgICAgICAgICAgICAgICBQZWVyQ2hhbGxlbmdlUmVzcG9uc2VbMjRdOworCVVDSEFSICAgICAgICAgICAgICAgU2Vzc2lvbktleVsxNl07IC8vTmV0d29yayBzZXNzaW9uIGtleXMgKE5TSykKKwlSQUxJTktfVElNRVJfU1RSVUNUIExlYXBBdXRoVGltZXI7CisJUk9HVUVBUF9UQUJMRSAgICAgICBSb2d1ZUFwVGFiOyAgIC8vQ2lzY28gQ0NYMSBSb2d1ZSBBUCBEZXRlY3Rpb24KKworCS8vIE5ldyBjb250cm9sIGZsYWdzIGZvciBDQ1gKKwlDQ1hfQ09OVFJPTCAgICAgICAgIENDWENvbnRyb2w7ICAgICAgICAgICAgICAgICAvLyBNYXN0ZXIgYWRtaW5pc3RyYXRpb24gc3RhdGUKKwlCT09MRUFOICAgICAgICAgICAgIENDWEVuYWJsZTsgICAgICAgICAgICAgICAgICAvLyBBY3R1YWwgQ0NYIHN0YXRlCisJVUNIQVIgICAgICAgICAgICAgICBDQ1hTY2FuQ2hhbm5lbDsgICAgICAgICAgICAgLy8gU2VsZWN0ZWQgY2hhbm5lbCBmb3IgQ0NYIGJlYWNvbiByZXF1ZXN0CisJVVNIT1JUICAgICAgICAgICAgICBDQ1hTY2FuVGltZTsgICAgICAgICAgICAgICAgLy8gVGltZSBvdXQgdG8gd2FpdCBmb3IgYmVhY29uIGFuZCBwcm9iZSByZXNwb25zZQorCVVDSEFSICAgICAgICAgICAgICAgQ0NYUmVxVHlwZTsgICAgICAgICAgICAgICAgIC8vIEN1cnJlbnQgcHJvY2Vzc2luZyBDQ1ggcmVxdWVzdCB0eXBlCisJQlNTX1RBQkxFICAgICAgICAgICBDQ1hCc3NUYWI7ICAgICAgICAgICAgICAgICAgLy8gQlNTIFRhYmxlCisJVUNIQVIgICAgICAgICAgICAgICBGcmFtZVJlcG9ydEJ1ZlsyMDQ4XTsgICAgICAgLy8gQnVmZmVyIGZvciBjcmVhdGluZyBmcmFtZSByZXBvcnQKKwlVU0hPUlQgICAgICAgICAgICAgIEZyYW1lUmVwb3J0TGVuOyAgICAgICAgICAgICAvLyBDdXJyZW50IEZyYW1lIHJlcG9ydCBsZW5ndGgKKwlVTE9ORyAgICAgICAgICAgICAgIENMQnVzeUJ5dGVzOyAgICAgICAgICAgICAgICAvLyBTYXZlIHRoZSB0b3RhbCBieXRlcyByZWNlaXZlZCBkdXJuaW5nIGNoYW5uZWwgbG9hZCBzY2FuIHRpbWUKKwlVU0hPUlQgICAgICAgICAgICAgIFJQSURlbnNpdHlbOF07ICAgICAgICAgICAgICAvLyBBcnJheSBmb3IgUlBJIGRlbnNpdHkgY29sbGVjdGlvbgorCS8vIFN0YXJ0IGFkZHJlc3Mgb2YgZWFjaCBCU1MgdGFibGUgd2l0aGluIEZyYW1lUmVwb3J0QnVmCisJLy8gSXQncyBpbXBvcnRhbnQgdG8gdXBkYXRlIHRoZSBSeFBvd2VyIG9mIHRoZSBjb3JyZXNwb25kaW5nIEJzcworCVVTSE9SVCAgICAgICAgICAgICAgQnNzUmVwb3J0T2Zmc2V0W01BWF9MRU5fT0ZfQlNTX1RBQkxFXTsKKwlVU0hPUlQgICAgICAgICAgICAgIEJlYWNvblRva2VuOyAgICAgICAgICAgICAgICAvLyBUb2tlbiBmb3IgYmVhY29uIHJlcG9ydAorCVVMT05HICAgICAgICAgICAgICAgTGFzdEJzc0luZGV4OyAgICAgICAgICAgICAgIC8vIE1vc3QgY3VycmVudCByZXBvcnRlZCBCc3MgaW5kZXgKKwlSTV9SRVFVRVNUX0FDVElPTiAgIE1lYXN1cmVtZW50UmVxdWVzdFsxNl07ICAgICAvLyBTYXZlZCBtZWFzdXJlbWVudCByZXF1ZXN0CisJVUNIQVIgICAgICAgICAgICAgICBSTVJlcUNudDsgICAgICAgICAgICAgICAgICAgLy8gTnVtYmVyIG9mIG1lYXN1cmVtZW50IHJlcXVlc3Qgc2F2ZWQuCisJVUNIQVIgICAgICAgICAgICAgICBDdXJyZW50Uk1SZXFJZHg7ICAgICAgICAgICAgLy8gTnVtYmVyIG9mIG1lYXN1cmVtZW50IHJlcXVlc3Qgc2F2ZWQuCisJQk9PTEVBTiAgICAgICAgICAgICBQYXJhbGxlbFJlcTsgICAgICAgICAgICAgICAgLy8gUGFyYWxsZWwgbWVhc3VyZW1lbnQsIG9ubHkgb25lIHJlcXVlc3QgcGVyZm9ybWVkLAorCQkJCQkJCQkJCQkJCS8vIEl0IG11c3QgYmUgdGhlIHNhbWUgY2hhbm5lbCB3aXRoIG1heGltdW0gZHVyYXRpb24KKwlVU0hPUlQgICAgICAgICAgICAgIFBhcmFsbGVsRHVyYXRpb247ICAgICAgICAgICAvLyBNYXhpbXVtIGR1cmF0aW9uIGZvciBwYXJhbGxlbCBtZWFzdXJlbWVudAorCVVDSEFSICAgICAgICAgICAgICAgUGFyYWxsZWxDaGFubmVsOyAgICAgICAgICAgIC8vIE9ubHkgb25lIGNoYW5uZWwgd2l0aCBwYXJhbGxlbCBtZWFzdXJlbWVudAorCVVTSE9SVCAgICAgICAgICAgICAgSUFQUFRva2VuOyAgICAgICAgICAgICAgICAgIC8vIElBUFAgZGlhbG9nIHRva2VuCisJVUNIQVIgICAgICAgICAgICAgICBDQ1hRb3NFQ1dNaW47ICAgICAgICAgICAgICAgLy8gQ2lzY28gUU9TIEVDV01pbiBmb3IgQUMgMAorCVVDSEFSICAgICAgICAgICAgICAgQ0NYUW9zRUNXTWF4OyAgICAgICAgICAgICAgIC8vIENpc2NvIFFPUyBFQ1dNYXggZm9yIEFDIDAKKwkvLyBIYWNrIGZvciBjaGFubmVsIGxvYWQgYW5kIG5vaXNlIGhpc3RvZ3JhbSBwYXJhbWV0ZXJzCisJVUNIQVIgICAgICAgICAgICAgICBOSEZhY3RvcjsgICAgICAgICAgICAgICAgICAgLy8gUGFyYW1ldGVyIGZvciBOb2lzZSBoaXN0b2dyYW0KKwlVQ0hBUiAgICAgICAgICAgICAgIENMRmFjdG9yOyAgICAgICAgICAgICAgICAgICAvLyBQYXJhbWV0ZXIgZm9yIGNoYW5uZWwgbG9hZAorCisJVUNIQVIgICAgICAgICAgICAgICBLUktbMTZdOyAgICAgICAgLy9LZXkgUmVmcmVzaCBLZXkuCisJVUNIQVIgICAgICAgICAgICAgICBCVEtbMzJdOyAgICAgICAgLy9CYXNlIFRyYW5zaWVudCBLZXkKKwlCT09MRUFOICAgICAgICAgICAgIENDS01MaW5rVXBGbGFnOworCVVMT05HICAgICAgICAgICAgICAgQ0NLTVJOOyAgICAvLyhSZSlBc3NvY2lhdGlvbiByZXF1ZXN0IG51bWJlci4KKwlMQVJHRV9JTlRFR0VSICAgICAgIENDS01CZWFjb25BdEpvaW5UaW1lU3RhbXA7ICAvL1RTRiB0aW1lciBmb3IgUmUtYXNzb2NhaXRlIHRvIHRoZSBuZXcgQVAKKwlVQ0hBUiAgICAgICAgICAgICAgIEFpcm9uZXRDZWxsUG93ZXJMaW1pdDsgICAgICAvL2luIGRCbQorCVVDSEFSICAgICAgICAgICAgICAgQWlyb25ldElQQWRkcmVzc1s0XTsgICAgICAgIC8vZWcuIDE5Mi4xNjguMS4xCisJQk9PTEVBTiAgICAgICAgICAgICBDQ1hBZGphY2VudEFQUmVwb3J0RmxhZzsgICAgLy9mbGFnIGZvciBkZXRlcm1pbmluZyByZXBvcnQgQXNzb2MgTG9zdCB0aW1lCisJQ0hBUiAgICAgICAgICAgICAgICBDQ1hBZGphY2VudEFQU3NpZFtNQVhfTEVOX09GX1NTSURdOyAvL0FkamFjZW50IEFQJ3MgU1NJRCByZXBvcnQKKwlVQ0hBUiAgICAgICAgICAgICAgIENDWEFkamFjZW50QVBTc2lkTGVuOyAgICAgICAgICAgICAgIC8vIHRoZSBhY3R1YWwgc3NpZCBsZW5ndGggaW4gdXNlZAorCVVDSEFSICAgICAgICAgICAgICAgQ0NYQWRqYWNlbnRBUEJzc2lkW01BQ19BRERSX0xFTl07ICAgICAgICAgLy9BZGphY2VudCBBUCdzIEJTU0lEIHJlcG9ydAorCVVTSE9SVCAgICAgICAgICAgICAgQ0NYQWRqYWNlbnRBUENoYW5uZWw7CisJVUxPTkcgICAgICAgICAgICAgICBDQ1hBZGphY2VudEFQTGlua0Rvd25UaW1lOyAgLy9mb3IgU3BlYyBTMzIuCisKKwlSQUxJTktfVElNRVJfU1RSVUNUCVN0YVF1aWNrUmVzcG9uZUZvclJhdGVVcFRpbWVyOworCUJPT0xFQU4JCQkJU3RhUXVpY2tSZXNwb25lRm9yUmF0ZVVwVGltZXJSdW5uaW5nOworCisJVUNIQVIgICAgICAgICAgIAlEdGltQ291bnQ7ICAgICAgLy8gMC4uIER0aW1QZXJpb2QtMQorCVVDSEFSICAgICAgICAgICAJRHRpbVBlcmlvZDsgICAgIC8vIGRlZmF1bHQgPSAzCisKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwlSVF84MDJfMTFfRExTCQlETFNFbnRyeVtNQVhfTlVNX09GX0RMU19FTlRSWV07CisJVUNIQVIJCQkJRGxzUmVwbGF5Q291bnRlcls4XTsKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gVGhpcyBpcyBvbmx5IGZvciBXSFFMIHRlc3QuCisJQk9PTEVBTgkJCQlXaHFsVGVzdDsKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICBSQUxJTktfVElNRVJfU1RSVUNUIFdwYURpc2Fzc29jQW5kQmxvY2tBc3NvY1RpbWVyOworICAgIC8vIEZhc3QgUm9hbWluZworCUJPT0xFQU4JCSAgICAgICAgYkZhc3RSb2FtaW5nOyAgICAgICAvLyAwOmRpc2FibGUgZmFzdCByb2FtaW5nLCAxOmVuYWJsZSBmYXN0IHJvYW1pbmcKKwlDSEFSCQkgICAgICAgIGRCbVRvUm9hbTsgICAgICAgICAgLy8gdGhlIGNvbmRpdGlvbiB0byByb2FtIHdoZW4gcmVjZWl2aW5nIFJzc2kgbGVzcyB0aGFuIHRoaXMgdmFsdWUuIEl0J3MgbmVnYXRpdmUgdmFsdWUuCisKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgQk9PTEVBTiAgICAgICAgICAgICBJRUVFODAyMVg7CisgICAgQk9PTEVBTiAgICAgICAgICAgICBJRUVFODAyMXhfcmVxdWlyZWRfa2V5czsKKyAgICBDSVBIRVJfS0VZCSAgICAgICAgRGVzaXJlU2hhcmVkS2V5WzRdOwkvLyBSZWNvcmQgdXNlciBkZXNpcmVkIFdFUCBrZXlzCisgICAgVUNIQVIgICAgICAgICAgICAgICBEZXNpcmVTaGFyZWRLZXlJZDsKKworICAgIC8vIDA6IGRyaXZlciBpZ25vcmVzIHdwYV9zdXBwbGljYW50CisgICAgLy8gMTogd3BhX3N1cHBsaWNhbnQgaW5pdGlhdGVzIHNjYW5uaW5nIGFuZCBBUCBzZWxlY3Rpb24KKyAgICAvLyAyOiBkcml2ZXIgdGFrZXMgY2FyZSBvZiBzY2FubmluZywgQVAgc2VsZWN0aW9uLCBhbmQgSUVFRSA4MDIuMTEgYXNzb2NpYXRpb24gcGFyYW1ldGVycworICAgIFVDSEFSICAgICAgICAgICAgICAgV3BhU3VwcGxpY2FudFVQOworCVVDSEFSCQkJCVdwYVN1cHBsaWNhbnRTY2FuQ291bnQ7CisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCisgICAgQ0hBUiAgICAgICAgICAgICAgICBkZXZfbmFtZVsxNl07CisgICAgVVNIT1JUICAgICAgICAgICAgICBPcmlEZXZUeXBlOworCisgICAgQk9PTEVBTiAgICAgICAgICAgICBiVEduV2lmaVRlc3Q7CisJQk9PTEVBTgkJCSAgICBiU2NhblJlcUlzRnJvbVdlYlVJOworCisJSFRUUkFOU01JVF9TRVRUSU5HCQkJCUhUUGh5TW9kZSwgTWF4SFRQaHlNb2RlLCBNaW5IVFBoeU1vZGU7Ly8gRm9yIHRyYW5zbWl0IHBoeSBzZXR0aW5nIGluIFRYV0kuCisJREVTSVJFRF9UUkFOU01JVF9TRVRUSU5HICAgICAgIAlEZXNpcmVkVHJhbnNtaXRTZXR0aW5nOworCVJUX0hUX1BIWV9JTkZPCQkJCQlEZXNpcmVkSHRQaHlJbmZvOworCUJPT0xFQU4JCQkJCQkJYkF1dG9UeFJhdGVTd2l0Y2g7CisKKworI2lmZGVmIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QKKwlVQ0hBUgkJCQlJRUVFODAyMTFkQ2xpZW50TW9kZTsKKwlVQ0hBUgkJCQlTdGFPcmlDb3VudHJ5Q29kZVszXTsKKwlVQ0hBUgkJCQlTdGFPcmlHZW9ncmFwaHk7CisjZW5kaWYgLy8gRVhUX0JVSUxEX0NIQU5ORUxfTElTVCAvLworfSBTVEFfQURNSU5fQ09ORklHLCAqUFNUQV9BRE1JTl9DT05GSUc7CisKKy8vIFRoaXMgZGF0YSBzdHJ1Y3R1cmUga2VlcCB0aGUgY3VycmVudCBhY3RpdmUgQlNTL0lCU1MncyBjb25maWd1cmF0aW9uIHRoYXQgdGhpcyBTVEEKKy8vIGhhZCBhZ3JlZWQgdXBvbiBqb2luaW5nIHRoZSBuZXR3b3JrLiBXaGljaCBtZWFucyB0aGVzZSBwYXJhbWV0ZXJzIGFyZSB1c3VhbGx5IGRlY2lkZWQKKy8vIGJ5IHRoZSBCU1MvSUJTUyBjcmVhdG9yIGluc3RlYWQgb2YgdXNlciBjb25maWd1cmF0aW9uLiBEYXRhIGluIHRoaXMgZGF0YSBzdHJ1Y3R1cnJlCisvLyBpcyB2YWxpZCBvbmx5IHdoZW4gZWl0aGVyIEFESE9DX09OKHBBZCkgb3IgSU5GUkFfT04ocEFkKSBpcyBUUlVFLgorLy8gTm9ybWFsbHksIGFmdGVyIFNDQU4gb3IgZmFpbGVkIHJvYW1pbmcgYXR0ZW1wdHMsIHdlIG5lZWQgdG8gcmVjb3ZlciBiYWNrIHRvCisvLyB0aGUgY3VycmVudCBhY3RpdmUgc2V0dGluZ3MuCit0eXBlZGVmIHN0cnVjdCBfU1RBX0FDVElWRV9DT05GSUcgeworCVVTSE9SVCAgICAgIEFpZDsKKwlVU0hPUlQgICAgICBBdGltV2luOyAgICAgICAgICAgICAgICAvLyBpbiBrdXNlYzsgSUJTUyBwYXJhbWV0ZXIgc2V0IGVsZW1lbnQKKwlVU0hPUlQgICAgICBDYXBhYmlsaXR5SW5mbzsKKwlVU0hPUlQgICAgICBDZnBNYXhEdXJhdGlvbjsKKwlVU0hPUlQgICAgICBDZnBQZXJpb2Q7CisKKwkvLyBDb3B5IHN1cHBvcnRlZCByYXRlIGZyb20gZGVzaXJlZCBBUCdzIGJlYWNvbi4gV2UgYXJlIHRyeWluZyB0byBtYXRjaAorCS8vIEFQJ3Mgc3VwcG9ydGVkIGFuZCBleHRlbmRlZCByYXRlIHNldHRpbmdzLgorCVVDSEFSICAgICAgIFN1cFJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdOworCVVDSEFSICAgICAgIEV4dFJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdOworCVVDSEFSICAgICAgIFN1cFJhdGVMZW47CisJVUNIQVIgICAgICAgRXh0UmF0ZUxlbjsKKwkvLyBDb3B5IHN1cHBvcnRlZCBodCBmcm9tIGRlc2lyZWQgQVAncyBiZWFjb24uIFdlIGFyZSB0cnlpbmcgdG8gbWF0Y2gKKwlSVF9IVF9QSFlfSU5GTwkJU3VwcG9ydGVkUGh5SW5mbzsKKwlSVF9IVF9DQVBBQklMSVRZCVN1cHBvcnRlZEh0UGh5OworfSBTVEFfQUNUSVZFX0NPTkZJRywgKlBTVEFfQUNUSVZFX0NPTkZJRzsKKworI2lmZGVmIFJUMjg3MAorLy8gZm9yIFVTQiBpbnRlcmZhY2UsIGF2b2lkIGluIGludGVycnVwdCB3aGVuIHdyaXRlIGtleQordHlwZWRlZiBzdHJ1Y3QgICBSVF9BRERfUEFJUldJU0VfS0VZX0VOVFJZIHsKKyAgICAgICAgTkRJU184MDJfMTFfTUFDX0FERFJFU1MgICAgICAgICBNYWNBZGRyOworICAgICAgICBVU0hPUlQgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY1RhYk1hdGNoV0NJRDsgICAgICAgIC8vIEFTSUMKKyAgICAgICAgQ0lQSEVSX0tFWSAgICAgICAgICAgICAgICAgICAgICBDaXBoZXJLZXk7Cit9IFJUX0FERF9QQUlSV0lTRV9LRVlfRU5UUlksKlBSVF9BRERfUEFJUldJU0VfS0VZX0VOVFJZOworI2VuZGlmIC8vIFJUMjg3MCAvLworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisvLyAtLS0tLS0tLS0tLSBzdGFydCBvZiBBUCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQVVUSC1SU1AgU3RhdGUgTWFjaGluZSBBdXggZGF0YSBzdHJ1Y3R1cmUKK3R5cGVkZWYgc3RydWN0IF9BUF9NTE1FX0FVWCB7CisJVUNIQVIgICAgICAgICAgICAgICBBZGRyW01BQ19BRERSX0xFTl07CisJVVNIT1JUICAgICAgICAgICAgICBBbGc7CisJQ0hBUiAgICAgICAgICAgICAgICBDaGFsbGVuZ2VbQ0lQSEVSX1RFWFRfTEVOXTsKK30gQVBfTUxNRV9BVVgsICpQQVBfTUxNRV9BVVg7CisKKy8vIHN0cnVjdHVyZSB0byBkZWZpbmUgV1BBIEdyb3VwIEtleSBSZWtleSBJbnRlcnZhbAordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9SVF84MDJfMTFfV1BBX1JFS0VZIHsKKwlVTE9ORyBSZUtleU1ldGhvZDsgICAgICAgICAgLy8gbWVjaGFuaXNtIGZvciByZWtleWluZzogMDpkaXNhYmxlLCAxOiB0aW1lLWJhc2VkLCAyOiBwYWNrZXQtYmFzZWQKKwlVTE9ORyBSZUtleUludGVydmFsOyAgICAgICAgLy8gdGltZS1iYXNlZDogc2Vjb25kcywgcGFja2V0LWJhc2VkOiBraWxvLXBhY2tldHMKK30gUlRfV1BBX1JFS0VZLCpQUlRfV1BBX1JFS0VZLCBSVF84MDJfMTFfV1BBX1JFS0VZLCAqUFJUXzgwMl8xMV9XUEFfUkVLRVk7CisKK3R5cGVkZWYgc3RydWN0IF9NQUNfVEFCTEVfRU5UUlkgeworCS8vQ2hvb3NlIDEgZnJvbSBWYWxpZEFzV0RTIGFuZCBWYWxpZEFzQ0xJICB0byB2YWxpZGl6ZS4KKwlCT09MRUFOCQlWYWxpZEFzQ0xJOwkJLy8gU3RhIG1vZGUsIHNldCB0aGlzIFRSVUUgYWZ0ZXIgTGlua3VwLHRvby4KKwlCT09MRUFOCQlWYWxpZEFzV0RTOwkvLyBUaGlzIGlzIFdEUyBFbnRyeS4gb25seSBmb3IgQVAgbW9kZS4KKwlCT09MRUFOCQlWYWxpZEFzQXBDbGk7ICAgLy9UaGlzIGlzIGEgQVAtQ2xpZW50IGVudHJ5LCBvbmx5IGZvciBBUCBtb2RlIHdoaWNoIGVuYWJsZSBBUC1DbGllbnQgZnVuY3Rpb25zLgorCUJPT0xFQU4JCVZhbGlkQXNNZXNoOworCUJPT0xFQU4JCVZhbGlkQXNEbHM7CS8vIFRoaXMgaXMgRExTIEVudHJ5LiBvbmx5IGZvciBTVEEgbW9kZS4KKwlCT09MRUFOCQlpc0NhY2hlZDsKKwlCT09MRUFOCQliSUFtQmFkQXRoZXJvczsJLy8gRmxhZyBpZiB0aGlzIGlzIEF0aGVyb3MgY2hpcCB0aGF0IGhhcyBJT1QgcHJvYmxlbS4gIFdlIG5lZWQgdG8gdHVybiBvbiBSVFMvQ1RTIHByb3RlY3Rpb24uCisKKwlVQ0hBUiAgICAgICAgIAlFbnF1ZXVlRWFwb2xTdGFydFRpbWVyUnVubmluZzsgIC8vIEVucXVldWUgRUFQb0wtU3RhcnQgZm9yIHRyaWdnZXJpbmcgRUFQIFNNCisJLy9qYW4gZm9yIHdwYQorCS8vIHJlY29yZCB3aGljaCBlbnRyeSByZXZva2UgTUlDIEZhaWx1cmUgLCBpZiBpdCBsZWF2ZXMgdGhlIEJTUyBpdHNlbGYsIEFQIHdvbid0IHVwZGF0ZSBhTUlDRmFpbFRpbWUgTUlCCisJVUNIQVIgICAgICAgICAgIENNVGltZXJSdW5uaW5nOworCVVDSEFSICAgICAgICAgICBhcGlkeDsJCQkvLyBNQlNTIG51bWJlcgorCVVDSEFSICAgICAgICAgICBSU05JRV9MZW47CisJVUNIQVIgICAgICAgICAgIFJTTl9JRVtNQVhfTEVOX09GX1JTTklFXTsKKwlVQ0hBUiAgICAgICAgICAgQU5vbmNlW0xFTl9LRVlfREVTQ19OT05DRV07CisJVUNIQVIgICAgICAgICAgIFJfQ291bnRlcltMRU5fS0VZX0RFU0NfUkVQTEFZXTsKKwlVQ0hBUiAgICAgICAgICAgUFRLWzY0XTsKKwlVQ0hBUiAgICAgICAgICAgUmVUcnlDb3VudGVyOworCVJBTElOS19USU1FUl9TVFJVQ1QgICAgICAgICAgICAgICAgIFJldHJ5VGltZXI7CisJUkFMSU5LX1RJTUVSX1NUUlVDVAkJCQkJRW5xdWV1ZVN0YXJ0Rm9yUFNLVGltZXI7CS8vIEEgdGltZXIgd2hpY2ggZW5xdWV1ZSBFQVBvTC1TdGFydCBmb3IgdHJpZ2dlcmluZyBQU0sgU00KKwlORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9NT0RFICAgICBBdXRoTW9kZTsgICAvLyBUaGlzIHNob3VsZCBtYXRjaCB0byB3aGF0ZXZlciBtaWNyb3NvZnQgZGVmaW5lZAorCU5ESVNfODAyXzExX1dFUF9TVEFUVVMgICAgICAgICAgICAgIFdlcFN0YXR1czsKKwlBUF9XUEFfU1RBVEUgICAgV3BhU3RhdGU7CisJR1RLX1NUQVRFICAgICAgIEdUS1N0YXRlOworCVVTSE9SVCAgICAgICAgICBQb3J0U2VjdXJlZDsKKwlORElTXzgwMl8xMV9QUklWQUNZX0ZJTFRFUiAgUHJpdmFjeUZpbHRlcjsgICAgICAvLyBQcml2YWN5RmlsdGVyIGVudW0gZm9yIDgwMi4xWAorCUNJUEhFUl9LRVkgICAgICBQYWlyd2lzZUtleTsKKwlQVk9JRCAgICAgICAgICAgcEFkOworICAgIElOVAkJCQlQTUtJRF9DYWNoZUlkeDsKKyAgICBVQ0hBUgkJCVBNS0lEW0xFTl9QTUtJRF07CisKKworCVVDSEFSICAgICAgICAgICBBZGRyW01BQ19BRERSX0xFTl07CisJVUNIQVIgICAgICAgICAgIFBzTW9kZTsKKwlTU1QgICAgICAgICAgICAgU3N0OworCUFVVEhfU1RBVEUgICAgICBBdXRoU3RhdGU7IC8vIGZvciBTSEFSRUQgS0VZIGF1dGhlbnRpY2F0aW9uIHN0YXRlIG1hY2hpbmUgdXNlZCBvbmx5CisJQk9PTEVBTgkJCUlzUmVhc3NvY1N0YTsJLy8gSW5kaWNhdGUgd2hldGhlciB0aGlzIGlzIGEgcmVhc3NvY2lhdGlvbiBwcm9jZWR1cmUKKwlVU0hPUlQgICAgICAgICAgQWlkOworCVVTSE9SVCAgICAgICAgICBDYXBhYmlsaXR5SW5mbzsKKwlVQ0hBUiAgICAgICAgICAgTGFzdFJzc2k7CisJVUxPTkcgICAgICAgICAgIE5vRGF0YUlkbGVDb3VudDsKKwlVSU5UMTYJCQlTdGF0aW9uS2VlcEFsaXZlQ291bnQ7IC8vIHVuaXQ6IHNlY29uZAorCVVMT05HICAgICAgICAgICBQc1FJZGxlQ291bnQ7CisJUVVFVUVfSEVBREVSICAgIFBzUXVldWU7CisKKwlVSU5UMzIJCQlTdGFDb25uZWN0VGltZTsJCS8vIHRoZSBsaXZlIHRpbWUgb2YgdGhpcyBzdGF0aW9uIHNpbmNlIGFzc29jaWF0ZWQgd2l0aCBBUAorCisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwlCT09MRUFOCQkJYlNlbmRCQVI7CisJVVNIT1JUCQkJTm9CQURhdGFDb3VudERvd247CisKKwlVSU5UMzIgICAJCUNhY2hlZEJ1ZlsxNl07CQkvLyBVSU5UICg0IGJ5dGVzKSBmb3IgYWxpZ25tZW50CisJVUlOVAkJCVR4QkZDb3VudDsgLy8gMyozCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJVUlOVAkJCUZJRk9Db3VudDsKKwlVSU5UCQkJRGVidWdGSUZPQ291bnQ7CisJVUlOVAkJCURlYnVnVHhDb3VudDsKKyAgICBCT09MRUFOCQkJYkRsc0luaXQ7CisKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvL1dEUyBlbnRyeSBuZWVkcyB0aGVzZQorLy8gcnQyODYwIGFkZCB0aGlzLiBpZiBWYWxpZEFzV0RTPT1UUlVFLCBNYXRjaFdEU1RhYklkeCBpcyB0aGUgaW5kZXggaW4gV2RzVGFiLk1hY1RhYgorCVVJTlQJCQlNYXRjaFdEU1RhYklkeDsKKwlVQ0hBUiAgICAgICAgICAgTWF4U3VwcG9ydGVkUmF0ZTsKKwlVQ0hBUiAgICAgICAgICAgQ3VyclR4UmF0ZTsKKwlVQ0hBUiAgICAgICAgICAgQ3VyclR4UmF0ZUluZGV4OworCS8vIHRvIHJlY29yZCB0aGUgZWFjaCBUWCByYXRlJ3MgcXVhbGl0eS4gMCBpcyBiZXN0LCB0aGUgYmlnZ2VyIHRoZSB3b3JzZS4KKwlVU0hPUlQgICAgICAgICAgVHhRdWFsaXR5W01BWF9TVEVQX09GX1RYX1JBVEVfU1dJVENIXTsKKy8vCVVTSE9SVCAgICAgICAgICBPbmVTZWNUeE9rQ291bnQ7CisJVUlOVDMyCQkJT25lU2VjVHhOb1JldHJ5T2tDb3VudDsKKwlVSU5UMzIgICAgICAgICAgT25lU2VjVHhSZXRyeU9rQ291bnQ7CisJVUlOVDMyICAgICAgICAgIE9uZVNlY1R4RmFpbENvdW50OworCVVJTlQzMgkJCUNvbnRpbnVlVHhGYWlsQ250OworCVVJTlQzMiAgICAgICAgICBDdXJyVHhSYXRlU3RhYmxlVGltZTsgLy8gIyBvZiBzZWNvbmQgaW4gY3VycmVudCBUWCByYXRlCisJVUNIQVIgICAgICAgICAgIFR4UmF0ZVVwUGVuYWx0eTsgICAgICAvLyBleHRyYSAjIG9mIHNlY29uZCBwZW5hbHR5IGR1ZSB0byBsYXN0IHVuc3RhYmxlIGNvbmRpdGlvbgorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJVUlOVAkJCU1hdGNoRGxzRW50cnlJZHg7IC8vIGluZGljYXRlIHRoZSBpbmRleCBpbiBwQWQtPlN0YUNmZy5ETFNFbnRyeQorI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJQk9PTEVBTiAgICAgICAgIGZOb2lzeUVudmlyb25tZW50OworCUJPT0xFQU4JCQlmTGFzdFNlY0FjY29yZGluZ1JTU0k7CisJVUNIQVIgICAgICAgICAgIExhc3RTZWNUeFJhdGVDaGFuZ2VBY3Rpb247IC8vIDA6IG5vIGNoYW5nZSwgMTpyYXRlIFVQLCAyOnJhdGUgZG93bgorCUNIQVIJCQlMYXN0VGltZVR4UmF0ZUNoYW5nZUFjdGlvbjsgLy9LZWVwIGxhc3QgdGltZSB2YWx1ZSBvZiBMYXN0U2VjVHhSYXRlQ2hhbmdlQWN0aW9uCisJVUxPTkcJCQlMYXN0VHhPa0NvdW50OworCVVDSEFSICAgICAgICAgICBQRVJbTUFYX1NURVBfT0ZfVFhfUkFURV9TV0lUQ0hdOworCisJLy8gYSBiaXRtYXAgb2YgQk9PTEVBTiBmbGFncy4gZWFjaCBiaXQgcmVwcmVzZW50IGFuIG9wZXJhdGlvbiBzdGF0dXMgb2YgYSBwYXJ0aWN1bGFyCisJLy8gQk9PTEVBTiBjb250cm9sLCBlaXRoZXIgT04gb3IgT0ZGLiBUaGVzZSBmbGFncyBzaG91bGQgYWx3YXlzIGJlIGFjY2Vzc2VkIHZpYQorCS8vIENMSUVOVF9TVEFUVVNfVEVTVF9GTEFHKCksIENMSUVOVF9TVEFUVVNfU0VUX0ZMQUcoKSwgQ0xJRU5UX1NUQVRVU19DTEVBUl9GTEFHKCkgbWFjcm9zLgorCS8vIHNlZSBmT1BfU1RBVFVTX3h4eCBpbiBSVE1QX0RFRi5DIGZvciBkZXRhaWwgYml0IGRlZmluaXRpb24uIGZDTElFTlRfU1RBVFVTX0FNU0RVX0lOVVNFRAorCVVMT05HICAgICAgICAgICBDbGllbnRTdGF0dXNGbGFnczsKKworCS8vIFRPRE86IFNoYWxsIHdlIG1vdmUgdGhhdCB0byBET1QxMV9OX1NVUFBPUlQ/Pz8KKwlIVFRSQU5TTUlUX1NFVFRJTkcJSFRQaHlNb2RlLCBNYXhIVFBoeU1vZGUsIE1pbkhUUGh5TW9kZTsvLyBGb3IgdHJhbnNtaXQgcGh5IHNldHRpbmcgaW4gVFhXSS4KKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCS8vIEhUIEVXQyBNSU1PLU4gdXNlZCBwYXJhbWV0ZXJzCisJVVNIT1JUCQlSWEJBYml0bWFwOwkvLyBmaWxsIHRvIG9uLWNoaXAgIFJYV0lfQkFfQklUTUFTSyBpbiA4LjEuM1JYIGF0dHJpYnV0ZSBlbnRyeSBmb3JtYXQKKwlVU0hPUlQJCVRYQkFiaXRtYXA7CS8vIFRoaXMgYml0bWFwIGFzIG9yaWdpbmF0b3IsIG9ubHkga2VlcCBpbiBzb2Z0d2FyZSB1c2VkIHRvIG1hcmsgQU1QRFUgYml0IGluIFRYV0kKKwlVU0hPUlQJCVRYQXV0b0JBYml0bWFwOworCVVTSE9SVAkJQkFEZWNsaW5lQml0bWFwOworCVVTSE9SVAkJQkFSZWNXY2lkQXJyYXlbTlVNX09GX1RJRF07CS8vIFRoZSBtYXBwaW5nIHdjaWQgb2YgcmVjaXBpZW50IHNlc3Npb24uIGlmIFJYQkFiaXRtYXAgYml0IGlzIG1hc2tlZAorCVVTSE9SVAkJQkFPcmlXY2lkQXJyYXlbTlVNX09GX1RJRF07IC8vIFRoZSBtYXBwaW5nIHdjaWQgb2Ygb3JpZ2luYXRvciBzZXNzaW9uLiBpZiBUWEJBYml0bWFwIGJpdCBpcyBtYXNrZWQKKwlVU0hPUlQJCUJBT3JpU2VxdWVuY2VbTlVNX09GX1RJRF07IC8vIFRoZSBtYXBwaW5nIHdjaWQgb2Ygb3JpZ2luYXRvciBzZXNzaW9uLiBpZiBUWEJBYml0bWFwIGJpdCBpcyBtYXNrZWQKKworCS8vIDgwMi4xMW4gZmVhdHVyZXMuCisJVUNIQVIJCU1wZHVEZW5zaXR5OworCVVDSEFSCQlNYXhSQW1wZHVGYWN0b3I7CisJVUNIQVIJCUFNc2R1U2l6ZTsKKwlVQ0hBUgkJTW1wc01vZGU7CS8vIE1JTU8gcG93ZXIgc2F2ZSBtb3JlLgorCisJSFRfQ0FQQUJJTElUWV9JRQkJSFRDYXBhYmlsaXR5OworCisjaWZkZWYgRE9UMTFOX0RSQUZUMworCVVDSEFSCQlCU1MyMDQwQ29leGlzdGVuY2VNZ210U3VwcG9ydDsKKyNlbmRpZiAvLyBET1QxMU5fRFJBRlQzIC8vCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwlCT09MRUFOCQliQXV0b1R4UmF0ZVN3aXRjaDsKKworCVVDSEFSICAgICAgIFJhdGVMZW47CisJc3RydWN0IF9NQUNfVEFCTEVfRU5UUlkgKnBOZXh0OworICAgIFVTSE9SVCAgICAgIFR4U2VxW05VTV9PRl9USURdOworCVVTSE9SVAkJTm9uUW9zRGF0YVNlcTsKKworCVJTU0lfU0FNUExFCVJzc2lTYW1wbGU7CisKKwlVSU5UMzIJCQlUWE1DU0V4cGVjdGVkWzE2XTsKKwlVSU5UMzIJCQlUWE1DU1N1Y2Nlc3NmdWxbMTZdOworCVVJTlQzMgkJCVRYTUNTRmFpbGVkWzE2XTsKKwlVSU5UMzIJCQlUWE1DU0F1dG9GYWxsQmFja1sxNl1bMTZdOworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJVUxPTkcgICAJCUxhc3RCZWFjb25SeFRpbWU7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCit9IE1BQ19UQUJMRV9FTlRSWSwgKlBNQUNfVEFCTEVfRU5UUlk7CisKK3R5cGVkZWYgc3RydWN0IF9NQUNfVEFCTEUgeworCVVTSE9SVAkJCVNpemU7CisJTUFDX1RBQkxFX0VOVFJZICpIYXNoW0hBU0hfVEFCTEVfU0laRV07CisJTUFDX1RBQkxFX0VOVFJZIENvbnRlbnRbTUFYX0xFTl9PRl9NQUNfVEFCTEVdOworCVFVRVVFX0hFQURFUiAgICBNY2FzdFBzUXVldWU7CisJVUxPTkcgICAgICAgICAgIFBzUUlkbGVDb3VudDsKKwlCT09MRUFOICAgICAgICAgZkFueVN0YXRpb25JblBzbTsKKwlCT09MRUFOICAgICAgICAgZkFueVN0YXRpb25CYWRBdGhlcm9zOwkvLyBDaGVjayBpZiBhbnkgU3RhdGlvbiBpcyBhdGhlcm9zIDgwMi4xMW4gQ2hpcC4gIFdlIG5lZWQgdG8gdXNlIFJUUy9DVFMgd2l0aCBBdGhlcm9zIDgwMiwuMTFuIGNoaXAuCisJQk9PTEVBTgkJCWZBbnlUeE9QRm9yY2VEaXNhYmxlOwkvLyBDaGVjayBpZiBpdCBpcyBuZWNlc3NhcnkgdG8gZGlzYWJsZSBCRSBUeE9QCisJQk9PTEVBTgkJCWZBbGxTdGF0aW9uQXNSYWxpbms7IAkvLyBDaGVjayBpZiBhbGwgc3RhdGlvbnMgYXJlIHJhbGluay1jaGlwc2V0CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJQk9PTEVBTiAgICAgICAgIGZBbnlTdGF0aW9uSXNMZWdhY3k7CS8vIENoZWNrIGlmIEkgdXNlIGxlZ2FjeSByYXRlIHRvIHRyYW5zbWl0IHRvIG15IEJTUyBTdGF0aW9uLworCUJPT0xFQU4gICAgICAgICBmQW55U3RhdGlvbk5vbkdGOwkJLy8gQ2hlY2sgaWYgYW55IFN0YXRpb24gY2FuJ3Qgc3VwcG9ydCBHRi4KKwlCT09MRUFOICAgICAgICAgZkFueVN0YXRpb24yME9ubHk7CQkvLyBDaGVjayBpZiBhbnkgU3RhdGlvbiBjYW4ndCBzdXBwb3J0IEdGLgorCUJPT0xFQU4JCQlmQW55U3RhdGlvbk1JTU9QU0R5bmFtaWM7IC8vIENoZWNrIGlmIGFueSBTdGF0aW9uIGlzIE1JTU8gRHluYW1pYworCUJPT0xFQU4gICAgICAgICBmQW55QkFTZXNzaW9uOyAgIC8vIENoZWNrIGlmIHRoZXJlIGlzIEJBIHNlc3Npb24uICBGb3JjZSB0dXJuIG9uIFJUUy9DVFMKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KK30gTUFDX1RBQkxFLCAqUE1BQ19UQUJMRTsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorI2RlZmluZSBJU19IVF9TVEEoX3BNYWNFbnRyeSkJXAorCShfcE1hY0VudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTU9ERSA+PSBNT0RFX0hUTUlYKQorCisjZGVmaW5lIElTX0hUX1JBVEUoX3BNYWNFbnRyeSkJXAorCShfcE1hY0VudHJ5LT5IVFBoeU1vZGUuZmllbGQuTU9ERSA+PSBNT0RFX0hUTUlYKQorCisjZGVmaW5lIFBFRVJfSVNfSFRfUkFURShfcE1hY0VudHJ5KQlcCisJKF9wTWFjRW50cnktPkhUUGh5TW9kZS5maWVsZC5NT0RFID49IE1PREVfSFRNSVgpCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKK3R5cGVkZWYgc3RydWN0IF9XRFNfRU5UUlkgeworCUJPT0xFQU4gICAgICAgICBWYWxpZDsKKwlVQ0hBUiAgICAgICAgICAgQWRkcltNQUNfQUREUl9MRU5dOworCVVMT05HICAgICAgICAgICBOb0RhdGFJZGxlQ291bnQ7CisJc3RydWN0IF9XRFNfRU5UUlkgKnBOZXh0OworfSBXRFNfRU5UUlksICpQV0RTX0VOVFJZOworCit0eXBlZGVmIHN0cnVjdCAgX1dEU19UQUJMRV9FTlRSWSB7CisJVVNIT1JUCQkJU2l6ZTsKKwlVQ0hBUiAgICAgICAgICAgV2RzQWRkcltNQUNfQUREUl9MRU5dOworCVdEU19FTlRSWSAgICAgICAqSGFzaFtIQVNIX1RBQkxFX1NJWkVdOworCVdEU19FTlRSWSAgICAgICBDb250ZW50W01BWF9MRU5fT0ZfTUFDX1RBQkxFXTsKKwlVQ0hBUiAgICAgICAgICAgTWF4U3VwcG9ydGVkUmF0ZTsKKwlVQ0hBUiAgICAgICAgICAgQ3VyclR4UmF0ZTsKKwlVU0hPUlQgICAgICAgICAgVHhRdWFsaXR5W01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXTsKKwlVU0hPUlQgICAgICAgICAgT25lU2VjVHhPa0NvdW50OworCVVTSE9SVCAgICAgICAgICBPbmVTZWNUeFJldHJ5T2tDb3VudDsKKwlVU0hPUlQgICAgICAgICAgT25lU2VjVHhGYWlsQ291bnQ7CisJVUxPTkcgICAgICAgICAgIEN1cnJUeFJhdGVTdGFibGVUaW1lOyAvLyAjIG9mIHNlY29uZCBpbiBjdXJyZW50IFRYIHJhdGUKKwlVQ0hBUiAgICAgICAgICAgVHhSYXRlVXBQZW5hbHR5OyAgICAgIC8vIGV4dHJhICMgb2Ygc2Vjb25kIHBlbmFsdHkgZHVlIHRvIGxhc3QgdW5zdGFibGUgY29uZGl0aW9uCit9IFdEU19UQUJMRV9FTlRSWSwgKlBXRFNfVEFCTEVfRU5UUlk7CisKK3R5cGVkZWYgc3RydWN0IF9SVF84MDJfMTFfV0RTX0VOVFJZIHsKKwlQTkVUX0RFVgkJCWRldjsKKwlVQ0hBUgkJCQlWYWxpZDsKKwlVQ0hBUgkJCQlQaHlNb2RlOworCVVDSEFSCQkJCVBlZXJXZHNBZGRyW01BQ19BRERSX0xFTl07CisJVUNIQVIJCQkJTWFjVGFiTWF0Y2hXQ0lEOwkvLyBBU0lDCisJTkRJU184MDJfMTFfV0VQX1NUQVRVUyAgV2VwU3RhdHVzOworCVVDSEFSCQkJCQlLZXlJZHg7CisJQ0lQSEVSX0tFWSAgICAgICAgICAJV2RzS2V5OworCUhUVFJBTlNNSVRfU0VUVElORwkJCQlIVFBoeU1vZGUsIE1heEhUUGh5TW9kZSwgTWluSFRQaHlNb2RlOworCVJUX0hUX1BIWV9JTkZPCQkJCQlEZXNpcmVkSHRQaHlJbmZvOworCUJPT0xFQU4JCQkJCQkJYkF1dG9UeFJhdGVTd2l0Y2g7CisJREVTSVJFRF9UUkFOU01JVF9TRVRUSU5HICAgICAgIAlEZXNpcmVkVHJhbnNtaXRTZXR0aW5nOyAvLyBEZXNpcmVkIHRyYW5zbWl0IHNldHRpbmcuCit9IFJUXzgwMl8xMV9XRFNfRU5UUlksICpQUlRfODAyXzExX1dEU19FTlRSWTsKKwordHlwZWRlZiBzdHJ1Y3QgX1dEU19UQUJMRSB7CisJVUNIQVIgICAgICAgICAgICAgICBNb2RlOworCVVMT05HICAgICAgICAgICAgICAgU2l6ZTsKKwlSVF84MDJfMTFfV0RTX0VOVFJZCVdkc0VudHJ5W01BWF9XRFNfRU5UUlldOworfSBXRFNfVEFCTEUsICpQV0RTX1RBQkxFOworCit0eXBlZGVmIHN0cnVjdCBfQVBDTElfU1RSVUNUIHsKKwlQTkVUX0RFVgkJCQlkZXY7CisjaWZkZWYgUlRMODY1WF9TT0MKKwl1bnNpZ25lZCBpbnQgICAgICAgICAgICBteWxpbmtpZDsKKyNlbmRpZgorCUJPT0xFQU4gICAgICAgICAgICAgICAgIEVuYWJsZTsJLy8gU2V0IGl0IGFzIDEgaWYgdGhlIGFwY2xpIGludGVyZmFjZSB3YXMgY29uZmlndXJlZCB0byAiMSIgIG9yIGJ5IGl3cHJpdiBjbWQgIkFwQ2xpRW5hYmxlIgorCUJPT0xFQU4gICAgICAgICAgICAgICAgIFZhbGlkOwkvLyBTZXQgaXQgYXMgMSBpZiB0aGUgYXBjbGkgaW50ZXJmYWNlIGFzc29jaWF0ZWQgc3VjY2VzcyB0byByZW1vdGUgQVAuCisJVUNIQVIJCQkJCU1hY1RhYldDSUQ7CS8vV0NJRCB2YWx1ZSwgd2hpY2ggcG9pbnQgdG8gdGhlIGVudHJ5IG9mIEFTSUMgTWFjIHRhYmxlLgorCVVDSEFSICAgICAgICAgICAgICAgICAgIFNzaWRMZW47CisJQ0hBUiAgICAgICAgICAgICAgICAgICAgU3NpZFtNQVhfTEVOX09GX1NTSURdOworCisJVUNIQVIgICAgICAgICAgICAgICAgICAgQ2ZnU3NpZExlbjsKKwlDSEFSICAgICAgICAgICAgICAgICAgICBDZmdTc2lkW01BWF9MRU5fT0ZfU1NJRF07CisJVUNIQVIgICAgICAgICAgICAgICAgICAgQ2ZnQXBDbGlCc3NpZFtFVEhfTEVOR1RIX09GX0FERFJFU1NdOworCVVDSEFSICAgICAgICAgICAgICAgICAgIEN1cnJlbnRBZGRyZXNzW0VUSF9MRU5HVEhfT0ZfQUREUkVTU107CisKKwlVTE9ORyAgICAgICAgICAgICAgICAgICBBcENsaVJjdkJlYWNvblRpbWU7CisKKwlVTE9ORyAgICAgICAgICAgICAgICAgICBDdHJsQ3VyclN0YXRlOworCVVMT05HICAgICAgICAgICAgICAgICAgIFN5bmNDdXJyU3RhdGU7CisJVUxPTkcgICAgICAgICAgICAgICAgICAgQXV0aEN1cnJTdGF0ZTsKKwlVTE9ORyAgICAgICAgICAgICAgICAgICBBc3NvY0N1cnJTdGF0ZTsKKwlVTE9ORwkJCQkJV3BhUHNrQ3VyclN0YXRlOworCisJVVNIT1JUICAgICAgICAgICAgICAgICAgQXV0aFJlcUNudDsKKwlVU0hPUlQgICAgICAgICAgICAgICAgICBBc3NvY1JlcUNudDsKKworCVVMT05HICAgICAgICAgICAgICAgICAgIENsaWVudFN0YXR1c0ZsYWdzOworCVVDSEFSICAgICAgICAgICAgICAgICAgIE1wZHVEZW5zaXR5OworCisJTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fTU9ERSAgICAgQXV0aE1vZGU7ICAgLy8gVGhpcyBzaG91bGQgbWF0Y2ggdG8gd2hhdGV2ZXIgbWljcm9zb2Z0IGRlZmluZWQKKwlORElTXzgwMl8xMV9XRVBfU1RBVFVTICAgICAgICAgICAgICBXZXBTdGF0dXM7CisKKwkvLyBBZGQgdG8gc3VwcG9ydCBkaWZmZXJlbnQgY2lwaGVyIHN1aXRlIGZvciBXUEEyL1dQQSBtb2RlCisJTkRJU184MDJfMTFfRU5DUllQVElPTl9TVEFUVVMJCUdyb3VwQ2lwaGVyOwkJLy8gTXVsdGljYXN0IGNpcGhlciBzdWl0ZQorCU5ESVNfODAyXzExX0VOQ1JZUFRJT05fU1RBVFVTCQlQYWlyQ2lwaGVyOwkJCS8vIFVuaWNhc3QgY2lwaGVyIHN1aXRlCisJQk9PTEVBTgkJCQkJCQkJYk1peENpcGhlcjsJCQkvLyBJbmRpY2F0ZSBjdXJyZW50IFBhaXIgJiBHcm91cCB1c2UgZGlmZmVyZW50IGNpcGhlciBzdWl0ZXMKKwlVU0hPUlQJCQkJCQkJCVJzbkNhcGFiaWxpdHk7CisKKwlVQ0hBUgkJUFNLWzEwMF07CQkJCS8vIHJlc2VydmUgUFNLIGtleSBtYXRlcmlhbAorCVVDSEFSICAgICAgIFBTS0xlbjsKKwlVQ0hBUiAgICAgICBQTUtbMzJdOyAgICAgICAgICAgICAgICAvLyBXUEEgUFNLIG1vZGUgUE1LCisJLy9VQ0hBUiAgICAgICBQVEtbNjRdOyAgICAgICAgICAgICAgICAvLyBXUEEgUFNLIG1vZGUgUFRLCisJVUNIQVIJCUdUS1szMl07CQkJCS8vIEdUSyBmcm9tIGF1dGhlbnRpY2F0b3IKKworCS8vQ0lQSEVSX0tFWQkJUGFpcndpc2VLZXk7CisJQ0lQSEVSX0tFWSAgICAgIFNoYXJlZEtleVtTSEFSRV9LRVlfTlVNXTsKKwlVQ0hBUiAgICAgICAgICAgRGVmYXVsdEtleUlkOworCisJLy8gV1BBIDgwMi4xeCBwb3J0IGNvbnRyb2wsIFdQQV84MDJfMVhfUE9SVF9TRUNVUkVELCBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQKKwkvL1VDSEFSICAgICAgIFBvcnRTZWN1cmVkOworCisJLy8gc3RvcmUgUlNOX0lFIGJ1aWx0IGJ5IGRyaXZlcgorCVVDSEFSCQlSU05fSUVbTUFYX0xFTl9PRl9SU05JRV07ICAvLyBUaGUgY29udGVudCBzYXZlZCBoZXJlIHNob3VsZCBiZSBjb252ZXJ0IHRvIGxpdHRsZS1lbmRpYW4gZm9ybWF0LgorCVVDSEFSCQlSU05JRV9MZW47CisKKwkvLyBGb3IgV1BBIGNvdW50ZXJtZWFzdXJlcworCVVMT05HICAgICAgIExhc3RNaWNFcnJvclRpbWU7ICAgLy8gcmVjb3JkIGxhc3QgTUlDIGVycm9yIHRpbWUKKwkvL1VMT05HICAgICAgIE1pY0VyckNudDsgICAgICAgICAgLy8gU2hvdWxkIGJlIDAsIDEsIDIsIHRoZW4gcmVzZXQgdG8gemVybyAoYWZ0ZXIgZGlzYXNzb2ljaWF0aW9uKS4KKwlCT09MRUFOICAgICAgICAgICAgICAgICBiQmxvY2tBc3NvYzsgLy8gQmxvY2sgYXNzb2NpYXRlIGF0dGVtcHQgZm9yIDYwIHNlY29uZHMgYWZ0ZXIgY291bnRlciBtZWFzdXJlIG9jY3VycmVkLgorCisJLy8gRm9yIFdQQS1QU0sgc3VwcGxpY2FudCBzdGF0ZQorCS8vV1BBX1NUQVRFICAgCVdwYVN0YXRlOyAgICAgICAgICAgLy8gRGVmYXVsdCBpcyBTU19OT1RVU0UKKwkvL1VDSEFSICAgICAgIAlSZXBsYXlDb3VudGVyWzhdOworCS8vVUNIQVIgICAgICAgCUFOb25jZVszMl07ICAgICAgICAgLy8gQU5vbmNlIGZvciBXUEEtUFNLIGZyb20gYXV0aGVudGljYXRvcgorCVVDSEFSICAgICAgIAlTTm9uY2VbMzJdOyAgICAgICAgIC8vIFNOb25jZSBmb3IgV1BBLVBTSworCVVDSEFSCQkJR05vbmNlWzMyXTsJCQkvLyBHTm9uY2UgZm9yIFdQQS1QU0sgZnJvbSBhdXRoZW50aWNhdG9yCisKKwlIVFRSQU5TTUlUX1NFVFRJTkcJCQkJSFRQaHlNb2RlLCBNYXhIVFBoeU1vZGUsIE1pbkhUUGh5TW9kZTsKKwlSVF9IVF9QSFlfSU5GTwkJCQkJRGVzaXJlZEh0UGh5SW5mbzsKKwlCT09MRUFOCQkJCQkJCWJBdXRvVHhSYXRlU3dpdGNoOworCURFU0lSRURfVFJBTlNNSVRfU0VUVElORyAgICAgICAJRGVzaXJlZFRyYW5zbWl0U2V0dGluZzsgLy8gRGVzaXJlZCB0cmFuc21pdCBzZXR0aW5nLgorfSBBUENMSV9TVFJVQ1QsICpQQVBDTElfU1RSVUNUOworCisvLyAtLS0tLS0tLS0tLSBlbmQgb2YgQVAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWZkZWYgQkxPQ0tfTkVUX0lGCit0eXBlZGVmIHN0cnVjdCBfQkxPQ0tfUVVFVUVfRU5UUlkKK3sKKwlCT09MRUFOIFN3VHhRdWV1ZUJsb2NrRmxhZzsKKwlMSVNUX0hFQURFUiBOZXRJZkxpc3Q7Cit9IEJMT0NLX1FVRVVFX0VOVFJZLCAqUEJMT0NLX1FVRVVFX0VOVFJZOworI2VuZGlmIC8vIEJMT0NLX05FVF9JRiAvLworCitzdHJ1Y3Qgd2lmaWNvbmYKK3sKKwlCT09MRUFOCWJTaG9ydEdJOworCUJPT0xFQU4gYkdyZWVuRmllbGQ7Cit9OworCisKKwordHlwZWRlZiBzdHJ1Y3QgX0lORl9QQ0lfQ09ORklHCit7CisJUFVDSEFSICAgICAgICAgICAgICAgICAgQ1NSQmFzZUFkZHJlc3M7ICAgICAvLyBQQ0kgTU1JTyBCYXNlIEFkZHJlc3MsIGFsbCBhY2Nlc3Mgd2lsbCB1c2UKK31JTkZfUENJX0NPTkZJRzsKKwordHlwZWRlZiBzdHJ1Y3QgX0lORl9VU0JfQ09ORklHCit7CisJVUlOVCAgICAgICAgICAgICAgICBCdWxrSW5FcEFkZHI7CQkvLyBidWxrLWluIGVuZHBvaW50IGFkZHJlc3MKKwlVSU5UICAgICAgICAgICAgICAgIEJ1bGtPdXRFcEFkZHJbNl07CS8vIGJ1bGstb3V0IGVuZHBvaW50IGFkZHJlc3MKKworfUlORl9VU0JfQ09ORklHOworCisjaWZkZWYgSUtBTk9TX1ZYXzFYMAorCXR5cGVkZWYgdm9pZCAoKklrYW5vc1dsYW5UeENiRnVuY1ApKHZvaWQgKiwgdm9pZCAqKTsKKworCXN0cnVjdCBJS0FOT1NfVFhfSU5GTworCXsKKwkJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKKwkJSWthbm9zV2xhblR4Q2JGdW5jUCAqZnA7CisJfTsKKyNlbmRpZiAvLyBJS0FOT1NfVlhfMVgwIC8vCisKKyNpZmRlZiBOSU5URU5ET19BUAordHlwZWRlZiBzdHJ1Y3QgX05JTkRPX0NUUkxfQkxPQ0sgeworCisJUlRfTklOVEVORE9fVEFCTEUJRFNfVEFCTEU7CisKKyNpZmRlZiBDSElQMjVYWAorCXNwaW5sb2NrX3QJCQlOSU5URU5ET19UQUJMRV9Mb2NrOworI2Vsc2UKKwlORElTX1NQSU5fTE9DSwkJTklOVEVORE9fVEFCTEVfTG9jazsKKyNlbmRpZiAvLyBDSElQMjVYWCAvLworCisJVUNIQVIJCQkJTklOVEVORE9fVVBfQlVGRkVSWzUxMl07CisJVUNIQVIJCQkJTG9jYWxfS2V5SWR4OworCUNJUEhFUl9LRVkJCQlMb2NhbF9TaGFyZWRLZXk7CisJVUNIQVIJCQkJTG9jYWxfYkhpZGVTc2lkOworCVVDSEFSCQkJCUxvY2FsX0F1dGhNb2RlOworCVVDSEFSCQkJCUxvY2FsX1dlcFN0YXR1czsKKwlVU0hPUlQJCQkJTG9jYWxfQ2FwYWJpbGl0eUluZm87Cit9IE5JTkRPX0NUUkxfQkxPQ0s7CisjZW5kaWYgLy8gTklOVEVORE9fQVAgLy8KKworCisjaWZkZWYgREJHX0RJQUdOT1NFCisjZGVmaW5lIERJQUdOT1NFX1RJTUUJMTAgICAvLyAxMCBzZWMKK3R5cGVkZWYgc3RydWN0IF9SdG1wRGlhZ1N0cmN1dF8KK3sJLy8gRGlhZ25vc2lzIFJlbGF0ZWQgZWxlbWVudAorCXVuc2lnbmVkIGNoYXIJCWluaXRlZDsKKwl1bnNpZ25lZCBjaGFyIAlxSWR4OworCXVuc2lnbmVkIGNoYXIgCUFycmF5U3RhcnRJZHg7CisJdW5zaWduZWQgY2hhcgkJQXJyYXlDdXJJZHg7CisJLy8gVHggUmVsYXRlZCBDb3VudAorCVVTSE9SVAkJCVR4RGF0YUNudFtESUFHTk9TRV9USU1FXTsKKwlVU0hPUlQJCQlUeEZhaWxDbnRbRElBR05PU0VfVElNRV07CisvLwlVU0hPUlQJCQlUeERlc2NDbnRbRElBR05PU0VfVElNRV1bMTZdOwkJLy8gVHhEZXNjIHF1ZXVlIGxlbmd0aCBpbiBzY2FsZSBvZiAwfjE0LCA+PTE1CisJVVNIT1JUCQkJVHhEZXNjQ250W0RJQUdOT1NFX1RJTUVdWzI0XTsgLy8gMyozCS8vIFR4RGVzYyBxdWV1ZSBsZW5ndGggaW4gc2NhbGUgb2YgMH4xNCwgPj0xNQorLy8JVVNIT1JUCQkJVHhNY3NDbnRbRElBR05PU0VfVElNRV1bMTZdOwkJCS8vIFR4RGF0ZSBNQ1MgQ291bnQgaW4gcmFuZ2UgZnJvbSAwIHRvIDE1LCBzdGVwIGluIDEuCisJVVNIT1JUCQkJVHhNY3NDbnRbRElBR05PU0VfVElNRV1bMjRdOyAvLyAzKjMKKwlVU0hPUlQJCQlUeFNXUXVlQ250W0RJQUdOT1NFX1RJTUVdWzldOwkJLy8gVHhTd1F1ZXVlIGxlbmd0aCBpbiBzY2FsZSBvZiAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA+PTgKKworCVVTSE9SVAkJCVR4QWdnQ250W0RJQUdOT1NFX1RJTUVdOworCVVTSE9SVAkJCVR4Tm9uQWdnQ250W0RJQUdOT1NFX1RJTUVdOworLy8JVVNIT1JUCQkJVHhBTVBEVUNudFtESUFHTk9TRV9USU1FXVsxNl07CQkvLyAxMCBzZWMsIFR4RE1BIEFQTURVIEFnZ3JlZ2F0aW9uIGNvdW50IGluIHJhbmdlIGZyb20gMCB0byAxNSwgaW4gc2V0cCBvZiAxLgorCVVTSE9SVAkJCVR4QU1QRFVDbnRbRElBR05PU0VfVElNRV1bMjRdOyAvLyAzKjMgLy8gMTAgc2VjLCBUeERNQSBBUE1EVSBBZ2dyZWdhdGlvbiBjb3VudCBpbiByYW5nZSBmcm9tIDAgdG8gMTUsIGluIHNldHAgb2YgMS4KKwlVU0hPUlQJCQlUeFJhbGlua0NudFtESUFHTk9TRV9USU1FXTsJCQkvLyBUeFJhbGluayBBZ2dyZWdhdGlvbiBDb3VudCBpbiAxIHNlYyBzY2FsZS4KKwlVU0hPUlQJCQlUeEFNU0RVQ250W0RJQUdOT1NFX1RJTUVdOwkJCS8vIFR4QU1TVUQgQWdncmVnYXRpb24gQ291bnQgaW4gMSBzZWMgc2NhbGUuCisKKwkvLyBSeCBSZWxhdGVkIENvdW50CisJVVNIT1JUCQkJUnhEYXRhQ250W0RJQUdOT1NFX1RJTUVdOwkJCS8vIFJ4IFRvdGFsIERhdGEgY291bnQuCisJVVNIT1JUCQkJUnhDcmNFcnJDbnRbRElBR05PU0VfVElNRV07CisvLwlVU0hPUlQJCQlSeE1jc0NudFtESUFHTk9TRV9USU1FXVsxNl07CQkvLyBSeCBNQ1MgQ291bnQgaW4gcmFuZ2UgZnJvbSAwIHRvIDE1LCBzdGVwIGluIDEuCisJVVNIT1JUCQkJUnhNY3NDbnRbRElBR05PU0VfVElNRV1bMjRdOyAvLyAzKjMKK31SdG1wRGlhZ1N0cnVjdDsKKyNlbmRpZiAvLyBEQkdfRElBR05PU0UgLy8KKworCisvLworLy8gIFRoZSBtaW5pcG9ydCBhZGFwdGVyIHN0cnVjdHVyZQorLy8KK3R5cGVkZWYgc3RydWN0IF9SVE1QX0FEQVBURVIKK3sKKwlQVk9JRAkJCQkJT1NfQ29va2llOwkvLyBzYXZlIHNwZWNpZmljIHN0cnVjdHVyZSByZWxhdGl2ZSB0byBPUworCVBORVRfREVWCQkJCW5ldF9kZXY7CisJVUxPTkcJCQkJCVZpcnR1YWxJZkNudDsKKworCisKKwlORElTX1NQSU5fTE9DSyAgICAgICAgICBpcnFfbG9jazsKKwlVQ0hBUiAgICAgICAgICAgICAgICAgICBpcnFfZGlzYWJsZWQ7CisKKyNpZmRlZiBSVDI4NzAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgVVNCIHJlbGF0ZWQgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwlzdHJ1Y3QgdXNiX2NvbmZpZ19kZXNjcmlwdG9yCQkqY29uZmlnOworCVVJTlQJCQkJCQkJCUJ1bGtJbkVwQWRkcjsJCS8vIGJ1bGstaW4gZW5kcG9pbnQgYWRkcmVzcworCVVJTlQJCQkJCQkJCUJ1bGtPdXRFcEFkZHJbNl07CS8vIGJ1bGstb3V0IGVuZHBvaW50IGFkZHJlc3MKKworCVVJTlQJCQkJCQkJCU51bWJlck9mUGlwZXM7CisJVVNIT1JUCQkJCQkJCQlCdWxrT3V0TWF4UGFja2V0U2l6ZTsKKwlVU0hPUlQJCQkJCQkJCUJ1bGtJbk1heFBhY2tldFNpemU7CisKKwkvLz09PT09PUNvbnRyb2wgRmxhZ3MKKwlMT05HICAgICAgICAgICAgICAgICAgICAJUGVuZGluZ0lvQ291bnQ7CisJVUxPTkcJCQkJCQlCdWxrRmxhZ3M7CisJQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgIGJVc2JUeEJ1bGtBZ2dyZTsJLy8gRmxhZ3MgZm9yIGJ1bGsgb3V0IGRhdGEgcHJpb3JpdHkKKworCisJLy89PT09PT1UaW1lciBUaHJlYWQKKwlSVDI4NzBfVElNRVJfUVVFVUUJCVRpbWVyUTsKKwlORElTX1NQSU5fTE9DSwkJCVRpbWVyUUxvY2s7CisKKworCS8vPT09PT09Q21kIFRocmVhZAorCUNtZFEJCQkJCUNtZFE7CisJTkRJU19TUElOX0xPQ0sJCQlDbWRRTG9jazsJCQkJLy8gQ21kUUxvY2sgc3BpbmxvY2sKKworCUJPT0xFQU4JCQkJCVRpbWVyRnVuY19raWxsOworCUJPT0xFQU4JCQkJCW1sbWVfa2lsbDsKKworCisJLy89PT09PT1TZW1hcGhvcmVzIChldmVudCkKKwlzdHJ1Y3Qgc2VtYXBob3JlCQkJbWxtZV9zZW1hcGhvcmU7CQkJLyogdG8gc2xlZXAgdGhyZWFkIG9uCSovCisJc3RydWN0IHNlbWFwaG9yZQkJCVJUVVNCQ21kX3NlbWFwaG9yZTsJCS8qIHRvIHNsZWVwIHRocmVhZCBvbgkqLworCXN0cnVjdCBzZW1hcGhvcmUJCQlSVFVTQlRpbWVyX3NlbWFwaG9yZTsKKyNpZmRlZiBJTkZfQU1BWk9OX1NFCisJc3RydWN0IHNlbWFwaG9yZQkJCVVzYlZlbmRvclJlcV9zZW1hcGhvcmU7CisJUFZPSUQJCQkJCQlVc2JWZW5kb3JSZXFCdWY7CisjZW5kaWYgLy8gSU5GX0FNQVpPTl9TRSAvLworCXN0cnVjdCBjb21wbGV0aW9uCQkJVGltZXJRQ29tcGxldGU7CisJc3RydWN0IGNvbXBsZXRpb24JCQltbG1lQ29tcGxldGU7CisJc3RydWN0IGNvbXBsZXRpb24JCQlDbWRRQ29tcGxldGU7CisJd2FpdF9xdWV1ZV9oZWFkX3QJCQkqd2FpdDsKKworCS8vPT09PT09TG9jayBmb3IgMjg3MCBBVEUKKyNpZmRlZiBSQUxJTktfQVRFCisJTkRJU19TUElOX0xPQ0sJCQlHZW5lcmljTG9jazsJCS8vIEFURSBUeC9SeCBnZW5lcmljIHNwaW5sb2NrCisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCisjZW5kaWYgLy8gUlQyODcwIC8vCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCS8qICAgICAgQm90aCBQQ0kvVVNCIHJlbGF0ZWQgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgIFR4IHJlbGF0ZWQgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwlCT09MRUFOICAgICAgICAgICAgICAgICBEZVF1ZXVlUnVubmluZ1tOVU1fT0ZfVFhfUklOR107ICAvLyBmb3IgZW5zdXJpbmcgUlRVU0JEZVF1ZXVlUGFja2V0IGdldCBjYWxsIG9uY2UKKwlORElTX1NQSU5fTE9DSyAgICAgICAgICBEZVF1ZXVlTG9ja1tOVU1fT0ZfVFhfUklOR107CisKKyNpZmRlZiBSVDI4NzAKKwkvLyBEYXRhIHJlbGF0ZWQgY29udGV4dCBhbmQgQUMgc3BlY2lmaWVkLCA0IEFDIHN1cHBvcnRlZAorCU5ESVNfU1BJTl9MT0NLCQkJQnVsa091dExvY2tbNl07CQkJLy8gQnVsa091dCBzcGlubG9jayBmb3IgNCBBQ3MKKwlORElTX1NQSU5fTE9DSwkJCU1MTUVCdWxrT3V0TG9jazsJLy8gTUxNRSBCdWxrT3V0IGxvY2sKKworCUhUX1RYX0NPTlRFWFQJCQlUeENvbnRleHRbTlVNX09GX1RYX1JJTkddOworCU5ESVNfU1BJTl9MT0NLCQkJVHhDb250ZXh0UXVldWVMb2NrW05VTV9PRl9UWF9SSU5HXTsJCS8vIFR4Q29udGV4dFF1ZXVlIHNwaW5sb2NrCisKKwkvLyA0IHNldHMgb2YgQnVsayBPdXQgaW5kZXggYW5kIHBlbmRpbmcgZmxhZworCVVDSEFSCQkJCQlOZXh0QnVsa091dEluZGV4WzRdOwkvLyBvbmx5IHVzZWQgZm9yIDQgRURDQSBidWxrb3V0IHBpcGUKKworCUJPT0xFQU4JCQkJCUJ1bGtPdXRQZW5kaW5nWzZdOwkvLyB1c2VkIGZvciB0b3RhbCA2IGJ1bGtvdXQgcGlwZQorCVVDSEFSCQkJCQlidWxrUmVzZXRQaXBlaWQ7CisJQk9PTEVBTgkJCQkJTWdtdEJ1bGtQZW5kaW5nOworCVVMT05HCQkJCQlidWxrUmVzZXRSZXFbNl07CisjZW5kaWYgLy8gUlQyODcwIC8vCisKKwkvLyByZXNvdXJjZSBmb3Igc29mdHdhcmUgYmFja2xvZyBxdWV1ZXMKKwlRVUVVRV9IRUFERVIgICAgICAgICAgICBUeFN3UXVldWVbTlVNX09GX1RYX1JJTkddOyAgLy8gNCBBQyArIDEgSENDQQorCU5ESVNfU1BJTl9MT0NLICAgICAgICAgIFR4U3dRdWV1ZUxvY2tbTlVNX09GX1RYX1JJTkddOwkvLyBUeFN3UXVldWUgc3BpbmxvY2sKKworCVJUTVBfRE1BQlVGICAgICAgICAgICAgIE1nbXREZXNjUmluZzsgICAgICAgICAgICAgICAJLy8gU2hhcmVkIG1lbW9yeSBmb3IgTUdNVCBkZXNjcmlwdG9ycworCVJUTVBfTUdNVF9SSU5HICAgICAgICAgIE1nbXRSaW5nOworCU5ESVNfU1BJTl9MT0NLICAgICAgICAgIE1nbXRSaW5nTG9jazsgICAgICAgICAgICAgICAJLy8gUHJpbyBSaW5nIHNwaW5sb2NrCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICBSeCByZWxhdGVkIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI2lmZGVmIFJUMjg3MAorCVJYX0NPTlRFWFQJCQkJUnhDb250ZXh0W1JYX1JJTkdfU0laRV07ICAvLyAxIGZvciByZWR1bmRhbnQgbXVsdGlwbGUgSVJQIGJ1bGsgaW4uCisJTkRJU19TUElOX0xPQ0sJCQlCdWxrSW5Mb2NrOwkJCQkvLyBCdWxrSW4gc3BpbmxvY2sgZm9yIDQgQUNzCisJVUNIQVIJCQkJCVBlbmRpbmdSeDsJCQkJLy8gVGhlIE1heGltYSBwZW5kaW5nIFJ4IHZhbHVlIHNob3VsZCBiZSAJUlhfUklOR19TSVpFLgorCVVDSEFSCQkJCQlOZXh0UnhCdWxrSW5JbmRleDsJCS8vIEluZGljYXRlIHRoZSBjdXJyZW50IFJ4Q29udGV4dCBJbmRleCB3aGljaCBob2xkIGJ5IEhvc3QgY29udHJvbGxlci4KKwlVQ0hBUgkJCQkJTmV4dFJ4QnVsa0luUmVhZEluZGV4OwkvLyBJbmRpY2F0ZSB0aGUgY3VycmVudCBSeENvbnRleHQgSW5kZXggd2hpY2ggZHJpdmVyIGNhbiByZWFkICYgcHJvY2VzcyBpdC4KKwlVTE9ORwkJCQkJTmV4dFJ4QnVsa0luUG9zaXRpb247ICAgLy8gV2FudCB0byBjb250YXRlbmF0ZSAyIFVSQiBidWZmZXIgd2hpbGUgMXN0IGlzIGJ1bGtpbiBmYWlsZWQgVVJCLiBUaGlzIFBvc2l0aW9uIGlzIDFzdCBVUkIgVHJhbnNmZXJMZW5ndGguCisJVUxPTkcJCQkJCVRyYW5zZmVyQnVmZmVyTGVuZ3RoOwkvLyBjdXJyZW50IGxlbmd0aCBvZiB0aGUgcGFja2V0IGJ1ZmZlcgorCVVMT05HCQkJCQlSZWFkUG9zaXRpb247CQkJLy8gY3VycmVudCByZWFkIHBvc2l0aW9uIGluIGEgcGFja2V0IGJ1ZmZlcgorI2VuZGlmIC8vIFJUMjg3MCAvLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgQVNJQyByZWxhdGVkIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwlVSU5UMzIgICAgICAgICAgICAgICAJTUFDVmVyc2lvbjsgICAgICAJLy8gTUFDIHZlcnNpb24uIFJlY29yZCBydDI4NjBDKDB4Mjg2MDAxMDApIG9yIHJ0Mjg2MEQgKDB4Mjg2MDAxMDEpLi4KKworCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCS8vIEUyUFJPTQorCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCVVMT05HICAgICAgICAgICAgICAgICAgIEVlcHJvbVZlcnNpb247ICAgICAgICAgIC8vIGJ5dGUgMDogdmVyc2lvbiwgYnl0ZSAxOiByZXZpc2lvbiwgYnl0ZSAyfjM6IHVudXNlZAorCVVDSEFSICAgICAgICAgICAgICAgICAgIEVFUFJPTUFkZHJlc3NOdW07ICAgICAgIC8vIDkzYzQ2PTYgIDkzYzY2PTgKKwlVU0hPUlQgICAgICAgICAgICAgICAgICBFRVBST01EZWZhdWx0VmFsdWVbTlVNX0VFUFJPTV9CQlBfUEFSTVNdOworCVVMT05HICAgICAgICAgICAgICAgICAgIEZpcm13YXJlVmVyc2lvbjsgICAgICAgIC8vIGJ5dGUgMDogTWlub3IgdmVyc2lvbiwgYnl0ZSAxOiBNYWpvciB2ZXJzaW9uLCBvdGhlcndpc2UgdW51c2VkLgorCisJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJLy8gQkJQIENvbnRyb2wKKwkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlVQ0hBUiAgICAgICAgICAgICAgICAgICBCYnBXcml0ZUxhdGNoWzE0MF07ICAgICAvLyByZWNvcmQgbGFzdCBCQlAgcmVnaXN0ZXIgdmFsdWUgd3JpdHRlbiB2aWEgQkJQX0lPX1dSSVRFL0JCUF9JT19XUklURV9WWV9SRUdfSUQKKwlVQ0hBUiAgICAgICAgICAgICAgICAgICBCYnBSc3NpVG9EYm1EZWx0YTsKKwlCQlBfUjY2X1RVTklORyAgICAgICAgICBCYnBUdW5pbmc7CisKKwkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJLy8gUkZJQyBjb250cm9sCisJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCVVDSEFSICAgICAgICAgICAgICAgICAgIFJmSWNUeXBlOyAgICAgICAvLyBSRklDX3h4eAorCVVMT05HICAgICAgICAgICAgICAgICAgIFJmRnJlcU9mZnNldDsgICAvLyBGcmVxdWVuY3kgb2Zmc2V0IGZvciBjaGFubmVsIHN3aXRjaGluZworCVJUTVBfUkZfUkVHUyAgICAgICAgICAgIExhdGNoUmZSZWdzOyAgICAvLyBsYXRjaCB0aCBsYXRlc3QgUkYgcHJvZ3JhbW1pbmcgdmFsdWUgc2luY2UgUkYgSUMgZG9lc24ndCBzdXBwb3J0IFJFQUQKKworCUVFUFJPTV9BTlRFTk5BX1NUUlVDICAgIEFudGVubmE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNpbmNlIEFOdGVubmEgZGVmaW5pdGlvbiBpcyBkaWZmZXJlbnQgZm9yIGEgJiBnLiBXZSBuZWVkIHRvIHNhdmUgaXQgZm9yIGZ1dHVyZSByZWZlcmVuY2UuCisJRUVQUk9NX05JQ19DT05GSUcyX1NUUlVDICAgIE5pY0NvbmZpZzI7CisKKwkvLyBUaGlzIHNvZnQgUnggQW50ZW5uYSBEaXZlcnNpdHkgbWVjaGFuaXNtIGlzIHVzZWQgb25seSB3aGVuIHVzZXIgc2V0CisJLy8gUlggQW50ZW5uYSA9IERJVkVSU0lUWSBPTgorCVNPRlRfUlhfQU5UX0RJVkVSU0lUWSAgIFJ4QW50OworCisJVUNIQVIgICAgICAgICAgICAgICAgICAgUkZQcm9nU2VxOworCUNIQU5ORUxfVFhfUE9XRVIgICAgICAgIFR4UG93ZXJbTUFYX05VTV9PRl9DSEFOTkVMU107ICAgICAgIC8vIFN0b3JlIFR4IHBvd2VyIHZhbHVlIGZvciBhbGwgY2hhbm5lbHMuCisJQ0hBTk5FTF9UWF9QT1dFUiAgICAgICAgQ2hhbm5lbExpc3RbTUFYX05VTV9PRl9DSEFOTkVMU107ICAgLy8gbGlzdCBhbGwgc3VwcG9ydGVkIGNoYW5uZWxzIGZvciBzaXRlIHN1cnZleQorCUNIQU5ORUxfMTFKX1RYX1BPV0VSICAgIFR4UG93ZXIxMUpbTUFYX05VTV9PRl8xMUpDSEFOTkVMU107ICAgICAgIC8vIDgwMi4xMWogY2hhbm5lbCBhbmQgYncKKwlDSEFOTkVMXzExSl9UWF9QT1dFUiAgICBDaGFubmVsTGlzdDExSltNQVhfTlVNX09GXzExSkNIQU5ORUxTXTsgICAvLyBsaXN0IGFsbCBzdXBwb3J0ZWQgY2hhbm5lbHMgZm9yIHNpdGUgc3VydmV5CisKKwlVQ0hBUiAgICAgICAgICAgICAgICAgICBDaGFubmVsTGlzdE51bTsgICAgICAgICAgICAgICAgICAgICAvLyBudW1iZXIgb2YgY2hhbm5lbCBpbiBDaGFubmVsTGlzdFtdCisJVUNIQVIJCQkJCUJicDk0OworCUJPT0xFQU4JCQkJCUJicEZvckNDSzsKKwlVTE9ORwkJVHgyME1Qd3JDZmdBQmFuZFs1XTsKKwlVTE9ORwkJVHgyME1Qd3JDZmdHQmFuZFs1XTsKKwlVTE9ORwkJVHg0ME1Qd3JDZmdBQmFuZFs1XTsKKwlVTE9ORwkJVHg0ME1Qd3JDZmdHQmFuZFs1XTsKKworCUJPT0xFQU4gICAgIGJBdXRvVHhBZ2NBOyAgICAgICAgICAgICAgICAvLyBFbmFibGUgZHJpdmVyIGF1dG8gVHggQWdjIGNvbnRyb2wKKwlVQ0hBUgkgICAgVHNzaVJlZkE7CQkJCQkvLyBTdG9yZSBUc3NpIHJlZmVyZW5jZSB2YWx1ZSBhcyAyNSB0ZW1wZXJhdHVyZS4KKwlVQ0hBUgkgICAgVHNzaVBsdXNCb3VuZGFyeUFbNV07CQkvLyBUc3NpIGJvdW5kYXJ5IGZvciBpbmNyZWFzZSBUeCBwb3dlciB0byBjb21wZW5zYXRlLgorCVVDSEFSCSAgICBUc3NpTWludXNCb3VuZGFyeUFbNV07CQkvLyBUc3NpIGJvdW5kYXJ5IGZvciBkZWNyZWFzZSBUeCBwb3dlciB0byBjb21wZW5zYXRlLgorCVVDSEFSCSAgICBUeEFnY1N0ZXBBOwkJCQkJLy8gU3RvcmUgVHggVFNTSSBkZWx0YSBpbmNyZW1lbnQgLyBkZWNyZW1lbnQgdmFsdWUKKwlDSEFSCQlUeEFnY0NvbXBlbnNhdGVBOwkJCS8vIFN0b3JlIHRoZSBjb21wZW5zYXRpb24gKFR4QWdjU3RlcCAqIChpZHgtMSkpCisKKwlCT09MRUFOICAgICBiQXV0b1R4QWdjRzsgICAgICAgICAgICAgICAgLy8gRW5hYmxlIGRyaXZlciBhdXRvIFR4IEFnYyBjb250cm9sCisJVUNIQVIJICAgIFRzc2lSZWZHOwkJCQkJLy8gU3RvcmUgVHNzaSByZWZlcmVuY2UgdmFsdWUgYXMgMjUgdGVtcGVyYXR1cmUuCisJVUNIQVIJICAgIFRzc2lQbHVzQm91bmRhcnlHWzVdOwkJLy8gVHNzaSBib3VuZGFyeSBmb3IgaW5jcmVhc2UgVHggcG93ZXIgdG8gY29tcGVuc2F0ZS4KKwlVQ0hBUgkgICAgVHNzaU1pbnVzQm91bmRhcnlHWzVdOwkJLy8gVHNzaSBib3VuZGFyeSBmb3IgZGVjcmVhc2UgVHggcG93ZXIgdG8gY29tcGVuc2F0ZS4KKwlVQ0hBUgkgICAgVHhBZ2NTdGVwRzsJCQkJCS8vIFN0b3JlIFR4IFRTU0kgZGVsdGEgaW5jcmVtZW50IC8gZGVjcmVtZW50IHZhbHVlCisJQ0hBUgkJVHhBZ2NDb21wZW5zYXRlRzsJCQkvLyBTdG9yZSB0aGUgY29tcGVuc2F0aW9uIChUeEFnY1N0ZXAgKiAoaWR4LTEpKQorCisJLy8rKytGb3IgUlQyODcwLCB0aGUgcGFyYW1ldGVyZXMgaXMgc3RhcnQgZnJvbSBCR1Jzc2lPZmZzZXQxIH4gQkdSc3NpT2Zmc2V0MworCUNIQVIJCUJHUnNzaU9mZnNldDA7CQkJCS8vIFN0b3JlIEIvRyBSU1NJIzAgT2Zmc2V0IHZhbHVlIG9uIEVFUFJPTSAweDQ2aAorCUNIQVIJCUJHUnNzaU9mZnNldDE7CQkJCS8vIFN0b3JlIEIvRyBSU1NJIzEgT2Zmc2V0IHZhbHVlCisJQ0hBUgkJQkdSc3NpT2Zmc2V0MjsJCQkJLy8gU3RvcmUgQi9HIFJTU0kjMiBPZmZzZXQgdmFsdWUKKwkvLy0tLQorCisJLy8rKytGb3IgUlQyODcwLCB0aGUgcGFyYW1ldGVyZXMgaXMgc3RhcnQgZnJvbSBBUnNzaU9mZnNldDEgfiBBUnNzaU9mZnNldDMKKwlDSEFSCQlBUnNzaU9mZnNldDA7CQkJCS8vIFN0b3JlIEEgUlNTSSMwIE9mZnNldCB2YWx1ZSBvbiBFRVBST00gMHg0QWgKKwlDSEFSCQlBUnNzaU9mZnNldDE7CQkJCS8vIFN0b3JlIEEgUlNTSSMxIE9mZnNldCB2YWx1ZQorCUNIQVIJCUFSc3NpT2Zmc2V0MjsJCQkJLy8gU3RvcmUgQSBSU1NJIzIgT2Zmc2V0IHZhbHVlCisJLy8tLS0KKworCUNIQVIJCUJMTkFHYWluOwkJCQkJLy8gU3RvcmUgQi9HIGV4dGVybmFsIExOQSMwIHZhbHVlIG9uIEVFUFJPTSAweDQ0aAorCUNIQVIJCUFMTkFHYWluMDsJCQkJCS8vIFN0b3JlIEEgZXh0ZXJuYWwgTE5BIzAgdmFsdWUgZm9yIGNoMzZ+NjQKKwlDSEFSCQlBTE5BR2FpbjE7CQkJCQkvLyBTdG9yZSBBIGV4dGVybmFsIExOQSMxIHZhbHVlIGZvciBjaDEwMH4xMjgKKwlDSEFSCQlBTE5BR2FpbjI7CQkJCQkvLyBTdG9yZSBBIGV4dGVybmFsIExOQSMyIHZhbHVlIGZvciBjaDEzMn4xNjUKKworCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkvLyBMRUQgY29udHJvbAorCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlNQ1VfTEVEQ1NfU1RSVUMJCUxlZENudGw7CisJVVNIT1JUCQkJCUxlZDE7CS8vIHJlYWQgZnJvbSBFRVBST00gMHgzYworCVVTSE9SVAkJCQlMZWQyOwkvLyBFRVBST00gMHgzZQorCVVTSE9SVAkJCQlMZWQzOwkvLyBFRVBST00gMHg0MAorCVVDSEFSCQkJCUxlZEluZGljYXRvclN0cmVndGg7CisJVUNIQVIJCQkJUnNzaVNpbmdhbHN0cmVuZ3RoT2ZmZXQ7CisgICAgQk9PTEVBTgkJCQliTGVkT25TY2FubmluZzsKKwlVQ0hBUgkJCQlMZWRTdGF0dXM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgODAyLjExIHJlbGF0ZWQgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwkvLyBvdXRnb2luZyBCRUFDT04gZnJhbWUgYnVmZmVyIGFuZCBjb3JyZXNwb25kaW5nIFRYRAorCVRYV0lfU1RSVUMgICAgICAgICAgICAgIAlCZWFjb25UeFdJOworCVBVQ0hBUgkJCQkJCUJlYWNvbkJ1ZjsKKwlVU0hPUlQJCQkJCQlCZWFjb25PZmZzZXRbSFdfQkVBQ09OX01BWF9DT1VOVF07CisKKwkvLyBwcmUtYnVpbGQgUFMtUE9MTCBhbmQgTlVMTCBmcmFtZSB1cG9uIGxpbmsgdXAuIGZvciBlZmZpY2llbmN5IHB1cnBvc2UuCisJUFNQT0xMX0ZSQU1FICAgICAgICAgICAgCVBzUG9sbEZyYW1lOworCUhFQURFUl84MDJfMTEgICAgICAgICAgIAlOdWxsRnJhbWU7CisKKyNpZmRlZiBSVDI4NzAKKwlUWF9DT05URVhUCQkJCUJlYWNvbkNvbnRleHRbQkVBQ09OX1JJTkdfU0laRV07CisJVFhfQ09OVEVYVAkJCQlOdWxsQ29udGV4dDsKKwlUWF9DT05URVhUCQkJCVBzUG9sbENvbnRleHQ7CisJVFhfQ09OVEVYVAkJCQlSVFNDb250ZXh0OworI2VuZGlmIC8vIFJUMjg3MCAvLworCisKKworLy89PT09PT09PT1BUD09PT09PT09PT09CisKKworLy89PT09PT09U1RBPT09PT09PT09PT0KKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKy8qIE1vZGlmaWVkIGJ5IFd1IFhpLUt1biA0LzIxLzIwMDYgKi8KKwkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCS8vIFNUQSBzcGVjaWZpYyBjb25maWd1cmF0aW9uICYgb3BlcmF0aW9uIHN0YXR1cworCS8vIHVzZWQgb25seSB3aGVuIHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEKKwkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCVNUQV9BRE1JTl9DT05GSUcgICAgICAgIFN0YUNmZzsgICAgICAgICAgIC8vIHVzZXIgZGVzaXJlZCBzZXR0aW5ncworCVNUQV9BQ1RJVkVfQ09ORklHICAgICAgIFN0YUFjdGl2ZTsgICAgICAgICAvLyB2YWxpZCBvbmx5IHdoZW4gQURIT0NfT04ocEFkKSB8fCBJTkZSQV9PTihwQWQpCisJQ0hBUiAgICAgICAgICAgICAgICAgICAgbmlja25hbWVbSVdfRVNTSURfTUFYX1NJWkUrMV07IC8vIG5pY2tuYW1lLCBvbmx5IHVzZWQgaW4gdGhlIGl3Y29uZmlnIGkvZgorCU5ESVNfTUVESUFfU1RBVEUgICAgICAgIFByZU1lZGlhU3RhdGU7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKy8vPT09PT09PUNvbW1vbj09PT09PT09PT09CisJLy8gT1AgbW9kZTogZWl0aGVyIEFQIG9yIFNUQQorCVVDSEFSICAgICAgICAgICAgICAgICAgIE9wTW9kZTsgICAgICAgICAgICAgICAgICAgICAvLyBPUE1PREVfU1RBLCBPUE1PREVfQVAKKworCU5ESVNfTUVESUFfU1RBVEUgICAgICAgIEluZGljYXRlTWVkaWFTdGF0ZTsJCQkvLyBCYXNlIG9uIEluZGljYXRpb24gc3RhdGUsIGRlZmF1bHQgaXMgTmRpc01lZGlhU3RhdGVEaXNDb25uZWN0ZWQKKworCisJLy8gY29uZmlndXJhdGlvbjogcmVhZCBmcm9tIFJlZ2lzdHJ5ICYgRTJQUk9NCisJQk9PTEVBTiAgICAgICAgICAgICAgICAgYkxvY2FsQWRtaW5NQUM7ICAgICAgICAgICAgIC8vIFVzZSB1c2VyIGNoYW5nZWQgTUFDCisJVUNIQVIgICAgICAgICAgICAgICAgICAgUGVybWFuZW50QWRkcmVzc1tNQUNfQUREUl9MRU5dOyAgICAvLyBGYWN0b3J5IGRlZmF1bHQgTUFDIGFkZHJlc3MKKwlVQ0hBUiAgICAgICAgICAgICAgICAgICBDdXJyZW50QWRkcmVzc1tNQUNfQUREUl9MRU5dOyAgICAgIC8vIFVzZXIgY2hhbmdlZCBNQUMgYWRkcmVzcworCisJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJLy8gY29tbW9uIGNvbmZpZ3VyYXRpb24gdG8gYm90aCBPUE1PREVfU1RBIGFuZCBPUE1PREVfQVAKKwkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlDT01NT05fQ09ORklHICAgICAgICAgICBDb21tb25DZmc7CisJTUxNRV9TVFJVQ1QgICAgICAgICAgICAgTWxtZTsKKworCS8vIEFQIG5lZWRzIHRob3NlIHZhaWFibGVzIGZvciBzaXRlIHN1cnZleSBmZWF0dXJlLgorCU1MTUVfQVVYICAgICAgICAgICAgICAgIE1sbWVBdXg7ICAgICAgICAgICAvLyB0ZW1wb3Jhcnkgc2V0dGluZ3MgdXNlZCBkdXJpbmcgTUxNRSBzdGF0ZSBtYWNoaW5lCisJQlNTX1RBQkxFICAgICAgICAgICAgICAgU2NhblRhYjsgICAgICAgICAgIC8vIHN0b3JlIHRoZSBsYXRlc3QgU0NBTiByZXN1bHQKKworCS8vQWJvdXQgTWFjVGFiLCB0aGUgc3RhIGRyaXZlciB3aWxsIHVzZSAjMCBhbmQgIzEgZm9yIG11bHRpY2FzdCBhbmQgQVAuCisJTUFDX1RBQkxFICAgICAgICAgICAgICAgICBNYWNUYWI7ICAgICAvLyBBU0lDIG9uLWNoaXAgV0NJRCBlbnRyeSB0YWJsZS4gIEF0IFRYLCBBU0lDIGFsd2F5cyB1c2Uga2V5IGFjY29yZGluZyB0byB0aGlzIG9uLWNoaXAgdGFibGUuCisJTkRJU19TUElOX0xPQ0sgICAgICAgICAgTWFjVGFiTG9jazsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCUJBX1RBQkxFCQkJQkFUYWJsZTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwlORElTX1NQSU5fTE9DSyAgICAgICAgICBCQVRhYkxvY2s7CisJUkFMSU5LX1RJTUVSX1NUUlVDVCBSRUNCQVRpbWVyOworCisJLy8gZW5jcnlwdGlvbi9kZWNyeXB0aW9uIEtFWSB0YWJsZXMKKwlDSVBIRVJfS0VZICAgICAgICAgICAgICBTaGFyZWRLZXlbTUFYX01CU1NJRF9OVU1dWzRdOyAvLyBTVEEgYWx3YXlzIHVzZSBTaGFyZWRLZXlbQlNTMF1bMC4uM10KKworCQkvLyBSWCByZS1hc3NlbWJseSBidWZmZXIgZm9yIGZyYWdtZW50YXRpb24KKwlGUkFHTUVOVF9GUkFNRSAgICAgICAgICBGcmFnRnJhbWU7ICAgICAgICAgICAgICAgICAgLy8gRnJhbWUgc3RvcmFnZSBmb3IgZnJhZ21lbnQgZnJhbWUKKworCS8vIHZhcmlvdXMgQ291bnRlcnMKKwlDT1VOVEVSXzgwMl8zICAgICAgICAgICBDb3VudGVyczgwMjM7ICAgICAgICAgICAgICAgLy8gODAyLjMgY291bnRlcnMKKwlDT1VOVEVSXzgwMl8xMSAgICAgICAgICBXbGFuQ291bnRlcnM7ICAgICAgICAgICAgICAgLy8gODAyLjExIE1JQiBjb3VudGVycworCUNPVU5URVJfUkFMSU5LICAgICAgICAgIFJhbGlua0NvdW50ZXJzOyAgICAgICAgICAgICAvLyBSYWxpbmsgcHJvcHJpZXR5IGNvdW50ZXJzCisJQ09VTlRFUl9EUlMgICAgICAgICAgICAgRHJzQ291bnRlcnM7ICAgICAgICAgICAgICAgIC8vIGNvdW50ZXJzIGZvciBEeW5hbWljIFRYIFJhdGUgU3dpdGNoaW5nCisJUFJJVkFURV9TVFJVQyAgICAgICAgICAgUHJpdmF0ZUluZm87ICAgICAgICAgICAgICAgIC8vIFByaXZhdGUgaW5mb3JtYXRpb24gJiBjb3VudGVycworCisJLy8gZmxhZ3MsIHNlZSBmUlRNUF9BREFQVEVSX3h4eCBmbGFncworCVVMT05HICAgICAgICAgICAgICAgICAgIEZsYWdzOyAgICAgICAgICAgICAgICAgICAgICAvLyBSZXByZXNlbnQgY3VycmVudCBkZXZpY2Ugc3RhdHVzCisKKwkvLyBjdXJyZW50IFRYIHNlcXVlbmNlICMKKwlVU0hPUlQgICAgICAgICAgICAgICAgICBTZXF1ZW5jZTsKKworCS8vIENvbnRyb2wgZGlzY29ubmVjdCAvIGNvbm5lY3QgZXZlbnQgZ2VuZXJhdGlvbgorCS8vKysrRGlkbid0IHVzZWQgYW55bW9yZQorCVVMT05HICAgICAgICAgICAgICAgICAgIExpbmtEb3duVGltZTsKKwkvLy0tLQorCVVMT05HICAgICAgICAgICAgICAgICAgIExhc3RSeFJhdGU7CisJVUxPTkcgICAgICAgICAgICAgICAgICAgTGFzdFR4UmF0ZTsKKwkvLysrK1VzZWQgb25seSBmb3IgU3RhdGlvbgorCUJPT0xFQU4gICAgICAgICAgICAgICAgIGJDb25maWdDaGFuZ2VkOyAgICAgICAgIC8vIENvbmZpZyBDaGFuZ2UgZmxhZyBmb3IgdGhlIHNhbWUgU1NJRCBzZXR0aW5nCisJLy8tLS0KKworCVVMT05HICAgICAgICAgICAgICAgICAgIEV4dHJhSW5mbzsgICAgICAgICAgICAgIC8vIEV4dHJhIGluZm9ybWF0aW9uIGZvciBkaXNwbGF5aW5nIHN0YXR1cworCVVMT05HICAgICAgICAgICAgICAgICAgIFN5c3RlbUVycm9yQml0bWFwOyAgICAgIC8vIGIwOiBFMlBST00gdmVyc2lvbiBlcnJvcgorCisJLy8rKytEaWRuJ3QgdXNlZCBhbnltb3JlCisJVUxPTkcgICAgICAgICAgICAgICAgICAgTWFjSWNWZXJzaW9uOyAgICAgICAgICAgLy8gTUFDL0JCUCBzZXJpYWwgaW50ZXJmYWNlIGlzc3VlIHNvbHZlZCBhZnRlciB2ZXIuRAorCS8vLS0tCisKKwkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkvLyBTeXN0ZW0gZXZlbnQgbG9nCisJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJUlRfODAyXzExX0VWRU5UX1RBQkxFICAgRXZlbnRUYWI7CisKKworCUJPT0xFQU4JCUhUQ0VuYWJsZTsKKworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwkvKiAgICAgIFN0YXRpc3RpYyByZWxhdGVkIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIFJUMjg3MAorCVVMT05HCQkJCQkJQnVsa091dERhdGFPbmVTZWNDb3VudDsKKwlVTE9ORwkJCQkJCUJ1bGtJbkRhdGFPbmVTZWNDb3VudDsKKwlVTE9ORwkJCQkJCUJ1bGtMYXN0T25lU2VjQ291bnQ7IC8vIEJ1bGtPdXREYXRhT25lU2VjQ291bnQgKyBCdWxrSW5EYXRhT25lU2VjQ291bnQKKwlVTE9ORwkJCQkJCXdhdGNoRG9nUnhDbnQ7CisJVUxPTkcJCQkJCQl3YXRjaERvZ1J4T3ZlckZsb3dDbnQ7CisJVUxPTkcJCQkJCQl3YXRjaERvZ1R4UGVuZGluZ0NudFtOVU1fT0ZfVFhfUklOR107CisjZW5kaWYgLy8gUlQyODcwIC8vCisKKwlCT09MRUFOCQkJCQkJYlVwZGF0ZUJjbkNudERvbmU7CisJVUxPTkcJCQkJCQl3YXRjaERvZ01hY0RlYWRsb2NrOwkvLyBwcmV2ZW50IE1BQy9CQlAgaW50byBkZWFkbG9jayBjb25kaXRpb24KKwkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJLy8gREVCVUcgcGFyYW1lcnRzCisJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCS8vVUxPTkcJCURlYnVnU2V0dGluZ1s0XTsKKwlCT09MRUFOCQliQmFuQWxsQmFTZXR1cDsKKwlCT09MRUFOCQliUHJvbWlzY3VvdXM7CisKKwkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJLy8gcnQyODYwYyBlbXVsYXRpb24tdXNlIFBhcmFtZXRlcnMKKwkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJVUxPTkcJCXJ0c2FjY3VbMzBdOworCVVMT05HCQljdHNhY2N1WzMwXTsKKwlVTE9ORwkJY2ZlbmRhY2N1WzMwXTsKKwlVTE9ORwkJYmFjb250ZW50WzE2XTsKKwlVTE9ORwkJcnhpbnRbUlhfUklOR19TSVpFKzFdOworCVVDSEFSCQlyY3ZiYVs2MF07CisJQk9PTEVBTgkJYkxpbmtBZGFwdDsKKwlCT09MRUFOCQliRm9yY2VQcmludFRYOworCUJPT0xFQU4JCWJGb3JjZVByaW50Ulg7CisJQk9PTEVBTgkJYkRpc2FibGVzY2FubmluZzsJCS8vZGVmaW5lZCBpbiBSVDI4NzAgVVNCCisJQk9PTEVBTgkJYlN0YUZpZm9UZXN0OworCUJPT0xFQU4JCWJQcm90ZWN0aW9uVGVzdDsKKwlCT09MRUFOCQliSENDQVRlc3Q7CisJQk9PTEVBTgkJYkdlbk9uZUhDQ0E7CisJQk9PTEVBTgkJYkJyb2FkQ29tSFQ7CisJLy8rKytGb2xsb3dpbmcgYWRkIGZyb20gUlQyODcwIFVTQi4KKwlVTE9ORwkJQnVsa091dFJlcTsKKwlVTE9ORwkJQnVsa091dENvbXBsZXRlOworCVVMT05HCQlCdWxrT3V0Q29tcGxldGVPdGhlcjsKKwlVTE9ORwkJQnVsa091dENvbXBsZXRlQ2FuY2VsOwkvLyBzZWVtcyBub3QgdXNlIG5vdz8KKwlVTE9ORwkJQnVsa0luUmVxOworCVVMT05HCQlCdWxrSW5Db21wbGV0ZTsKKwlVTE9ORwkJQnVsa0luQ29tcGxldGVGYWlsOworCS8vLS0tCisKKyAgICBzdHJ1Y3Qgd2lmaWNvbmYJCQlXSUZJdGVzdGJlZDsKKworI2lmZGVmIFJBTElOS19BVEUKKwlBVEVfSU5GTwkJCQlhdGU7CisjaWZkZWYgUlQyODcwCisJQk9PTEVBTgkJCQkJQ29udGluQnVsa091dDsJCS8vQVRFIGJ1bGsgb3V0IGNvbnRyb2wKKwlCT09MRUFOCQkJCQlDb250aW5CdWxrSW47CQkvL0FURSBidWxrIGluIGNvbnRyb2wKKwlhdG9taWNfdAkJCQlCdWxrT3V0UmVtYWluZWQ7CisJYXRvbWljX3QJCQkJQnVsa0luUmVtYWluZWQ7CisjZW5kaWYgLy8gUlQyODcwIC8vCisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJc3RydWN0IHJlb3JkZXJpbmdfbXBkdV9wb29sIG1wZHVfYmxrX3Bvb2w7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwlVTE9ORwkJCQkJT25lU2Vjb25kbm9uQkVwYWNrZXRzOwkJLy8gcmVjb3JkIG5vbiBCRSBwYWNrZXRzIHBlciBzZWNvbmQKKworI2lmIFdJUkVMRVNTX0VYVCA+PSAxMgorICAgIHN0cnVjdCBpd19zdGF0aXN0aWNzICAgIGl3X3N0YXRzOworI2VuZGlmCisKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cwlzdGF0czsKKworI2lmZGVmIEJMT0NLX05FVF9JRgorCUJMT0NLX1FVRVVFX0VOVFJZCQlibG9ja1F1ZXVlVGFiW05VTV9PRl9UWF9SSU5HXTsKKyNlbmRpZiAvLyBCTE9DS19ORVRfSUYgLy8KKworCisKKyNpZmRlZiBNVUxUSVBMRV9DQVJEX1NVUFBPUlQKKwlJTlQzMgkJCQkJTUNfUm93SUQ7CisJVUNIQVIJCQkJCU1DX0ZpbGVOYW1lWzI1Nl07CisjZW5kaWYgLy8gTVVMVElQTEVfQ0FSRF9TVVBQT1JUIC8vCisKKwlVTE9ORwkJCQkJVGJ0dFRpY2tDb3VudDsKKyNpZmRlZiBQQ0lfTVNJX1NVUFBPUlQKKwlCT09MRUFOCQkJCQlIYXZlTXNpOworI2VuZGlmIC8vIFBDSV9NU0lfU1VQUE9SVCAvLworCisKKwlVQ0hBUgkJCQkJaXNfb247CisKKyNkZWZpbmUgVElNRV9CQVNFCQkJKDEwMDAwMDAvT1NfSFopCisjZGVmaW5lIFRJTUVfT05FX1NFQ09ORAkJKDEwMDAwMDAvVElNRV9CQVNFKQorCVVDSEFSCQkJCQlmbGdfYmVfYWRqdXN0OworCVVMT05HCQkJCQliZV9hZGp1c3RfbGFzdF90aW1lOworCisKKyNpZmRlZiBJS0FOT1NfVlhfMVgwCisJc3RydWN0IElLQU5PU19UWF9JTkZPCUlrYW5vc1R4SW5mbzsKKwlzdHJ1Y3QgSUtBTk9TX1RYX0lORk8JSWthbm9zUnhJbmZvW01BWF9NQlNTSURfTlVNICsgTUFYX1dEU19FTlRSWSArIE1BWF9BUENMSV9OVU0gKyBNQVhfTUVTSF9OVU1dOworI2VuZGlmIC8vIElLQU5PU19WWF8xWDAgLy8KKworCisjaWZkZWYgREJHX0RJQUdOT1NFCisJUnRtcERpYWdTdHJ1Y3QJRGlhZ1N0cnVjdDsKKyNlbmRpZiAvLyBEQkdfRElBR05PU0UgLy8KKworCisJVUlOVDgJCQkJCVBNX0ZsZ1N1c3BlbmQ7Cit9IFJUTVBfQURBUFRFUiwgKlBSVE1QX0FEQVBURVI7CisKKy8vCisvLyBDaXNjbyBJQVBQIGZvcm1hdAorLy8KK3R5cGVkZWYgc3RydWN0ICBfQ0lTQ09fSUFQUF9DT05URU5UXworeworCVVTSE9SVCAgICAgTGVuZ3RoOyAgICAgICAgLy9JQVBQIExlbmd0aAorCVVDSEFSICAgICAgTWVzc2FnZVR5cGU7ICAgICAgLy9JQVBQIHR5cGUKKwlVQ0hBUiAgICAgIEZ1bmN0aW9uQ29kZTsgICAgIC8vSUFQUCBmdW5jdGlvbiB0eXBlCisJVUNIQVIgICAgICBEZXN0aW5haW9uTUFDW01BQ19BRERSX0xFTl07CisJVUNIQVIgICAgICBTb3VyY2VNQUNbTUFDX0FERFJfTEVOXTsKKwlVU0hPUlQgICAgIFRhZzsgICAgICAgICAgIC8vVGFnKGVsZW1lbnQgSUUpIC0gQWRqYWNlbnQgQVAgcmVwb3J0CisJVVNIT1JUICAgICBUYWdMZW5ndGg7ICAgICAvL0xlbmd0aCBvZiBlbGVtZW50IG5vdCBpbmNsdWRpbmcgNCBieXRlIGhlYWRlcgorCVVDSEFSICAgICAgT1VJWzRdOyAgICAgICAgICAgLy8weDAwLCAweDQwLCAweDk2LCAweDAwCisJVUNIQVIgICAgICBQcmV2aW91c0FQW01BQ19BRERSX0xFTl07ICAgICAgIC8vTUFDIEFkZHJlc3Mgb2YgYWNjZXNzIHBvaW50CisJVVNIT1JUICAgICBDaGFubmVsOworCVVTSE9SVCAgICAgU3NpZExlbjsKKwlVQ0hBUiAgICAgIFNzaWRbTUFYX0xFTl9PRl9TU0lEXTsKKwlVU0hPUlQgICAgIFNlY29uZHM7ICAgICAgICAgIC8vU2Vjb25kcyB0aGF0IHRoZSBjbGllbnQgaGFzIGJlZW4gZGlzYXNzb2NpYXRlZC4KK30gQ0lTQ09fSUFQUF9DT05URU5ULCAqUENJU0NPX0lBUFBfQ09OVEVOVDsKKworI2RlZmluZSBERUxBWUlOVE1BU0sJCTB4MDAwM2ZmZmIKKyNkZWZpbmUgSU5UTUFTSwkJCQkweDAwMDNmZmZiCisjZGVmaW5lIEluZE1hc2sJCQkJMHgwMDAzZmZmYworI2RlZmluZSBSeElOVAkJCQkweDAwMDAwMDA1CS8vIERlbGF5ZWQgUnggb3IgaW5kaXZpIHJ4CisjZGVmaW5lIFR4RGF0YUludAkJCTB4MDAwMDAwZmEJLy8gRGVsYXllZCBUeCBvciBpbmRpdmkgdHgKKyNkZWZpbmUgVHhNZ210SW50CQkJMHgwMDAwMDEwMgkvLyBEZWxheWVkIFR4IG9yIGluZGl2aSB0eAorI2RlZmluZSBUeENvaGVyZW50CQkJMHgwMDAyMDAwMAkvLyB0eCBjb2hlcmVudAorI2RlZmluZSBSeENvaGVyZW50CQkJMHgwMDAxMDAwMAkvLyByeCBjb2hlcmVudAorI2RlZmluZSBNY3VDb21tYW5kCQkJMHgwMDAwMDIwMAkvLyBtY3UKKyNkZWZpbmUgUHJlVEJUVEludAkJCTB4MDAwMDEwMDAJLy8gUHJlLVRCVFQgaW50ZXJydXB0CisjZGVmaW5lIFRCVFRJbnQJCQkJMHgwMDAwMDgwMAkJLy8gVEJUVCBpbnRlcnJ1cHQKKyNkZWZpbmUgR1BUaW1lT3V0SW50CQkJMHgwMDAwODAwMAkJLy8gR1B0aW1lb3V0IGludGVycnVwdAorI2RlZmluZSBBdXRvV2FrZXVwSW50CQkweDAwMDA0MDAwCQkvLyBBdXRvV2FrZXVwSW50IGludGVycnVwdAorI2RlZmluZSBGaWZvU3RhRnVsbEludAkJCTB4MDAwMDIwMDAJLy8gIGZpZm8gc3RhdGlzdGljcyBmdWxsIGludGVycnVwdAorCisKK3R5cGVkZWYgc3RydWN0IF9SWF9CTEtfCit7CisvLwlSWERfU1RSVUMJCVJ4RDsgLy8gc2FtcGxlCisJUlQyOFhYX1JYRF9TVFJVQwlSeEQ7CisJUFJYV0lfU1RSVUMJCQlwUnhXSTsKKwlQSEVBREVSXzgwMl8xMQkJcEhlYWRlcjsKKwlQTkRJU19QQUNLRVQJCXBSeFBhY2tldDsKKwlVQ0hBUgkJCQkqcERhdGE7CisJVVNIT1JUCQkJCURhdGFTaXplOworCVVTSE9SVAkJCQlGbGFnczsKKwlVQ0hBUgkJCQlVc2VyUHJpb3JpdHk7CS8vIGZvciBjYWxjdWxhdGUgVEtJUCBNSUMgdXNpbmcKK30gUlhfQkxLOworCisKKyNkZWZpbmUgUlhfQkxLX1NFVF9GTEFHKF9wUnhCbGssIF9mbGFnKQkJKF9wUnhCbGstPkZsYWdzIHw9IF9mbGFnKQorI2RlZmluZSBSWF9CTEtfVEVTVF9GTEFHKF9wUnhCbGssIF9mbGFnKQkoX3BSeEJsay0+RmxhZ3MgJiBfZmxhZykKKyNkZWZpbmUgUlhfQkxLX0NMRUFSX0ZMQUcoX3BSeEJsaywgX2ZsYWcpCShfcFJ4QmxrLT5GbGFncyAmPSB+KF9mbGFnKSkKKworCisjZGVmaW5lIGZSWF9XRFMJCQkweDAwMDEKKyNkZWZpbmUgZlJYX0FNU0RVICAgICAgIDB4MDAwMgorI2RlZmluZSBmUlhfQVJBTElOSyAgICAgMHgwMDA0CisjZGVmaW5lIGZSWF9IVEMgICAgICAgICAweDAwMDgKKyNkZWZpbmUgZlJYX1BBRCAgICAgICAgIDB4MDAxMAorI2RlZmluZSBmUlhfQU1QRFUgICAgICAgMHgwMDIwCisjZGVmaW5lIGZSWF9RT1MJCQkweDAwNDAKKyNkZWZpbmUgZlJYX0lORlJBCQkweDAwODAKKyNkZWZpbmUgZlJYX0VBUAkJCTB4MDEwMAorI2RlZmluZSBmUlhfTUVTSAkJMHgwMjAwCisjZGVmaW5lIGZSWF9BUENMSQkJMHgwNDAwCisjZGVmaW5lIGZSWF9ETFMJCQkweDA4MDAKKyNkZWZpbmUgZlJYX1dQSQkJCTB4MTAwMAorCisjZGVmaW5lIExFTkdUSF9BTVNEVV9TVUJGUkFNRUhFQUQJMTQKKyNkZWZpbmUgTEVOR1RIX0FSQUxJTktfU1VCRlJBTUVIRUFECTE0CisjZGVmaW5lIExFTkdUSF9BUkFMSU5LX0hFQURFUl9GSUVMRAkgMgorCisjZGVmaW5lIFRYX1VOS09XTl9GUkFNRQkJCTB4MDAKKyNkZWZpbmUgVFhfTUNBU1RfRlJBTUUJCQkweDAxCisjZGVmaW5lIFRYX0xFR0FDWV9GUkFNRQkJCTB4MDIKKyNkZWZpbmUgVFhfQU1QRFVfRlJBTUUJCQkweDA0CisjZGVmaW5lIFRYX0FNU0RVX0ZSQU1FCQkJMHgwOAorI2RlZmluZSBUWF9SQUxJTktfRlJBTUUJCQkweDEwCisjZGVmaW5lIFRYX0ZSQUdfRlJBTUUJCQkweDIwCisKKworLy8JQ3VycmVudGx5IHRoZSBzaXplb2YoVFhfQkxLKSBpcyAxNDggYnl0ZXMuCit0eXBlZGVmIHN0cnVjdCBfVFhfQkxLXworeworCVVDSEFSCQkJCVF1ZUlkeDsKKwlVQ0hBUgkJCQlUeEZyYW1lVHlwZTsJCQkJLy8gSW5kaWNhdGUgdGhlIFRyYW5zbWlzc2lvbiB0eXBlIG9mIHRoZSBhbGwgZnJhbWVzIGluIG9uZSBiYXRjaAorCVVDSEFSCQkJCVRvdGFsRnJhbWVOdW07CQkJCS8vIFRvdGFsIGZyYW1lIG51bWJlciB3YW50IHRvIHNlbmQtb3V0IGluIG9uZSBiYXRjaAorCVVTSE9SVAkJCQlUb3RhbEZyYWdOdW07CQkJCS8vIFRvdGFsIGZyYW1lIGZyYWdtZW50cyByZXF1aXJlZCBpbiBvbmUgYmF0Y2gKKwlVU0hPUlQJCQkJVG90YWxGcmFtZUxlbjsJCQkJLy8gVG90YWwgbGVuZ3RoIG9mIGFsbCBmcmFtZXMgd2FudCB0byBzZW5kLW91dCBpbiBvbmUgYmF0Y2gKKworCVFVRVVFX0hFQURFUgkJVHhQYWNrZXRMaXN0OworCU1BQ19UQUJMRV9FTlRSWQkJKnBNYWNFbnRyeTsJCQkJCS8vIE5VTEw6IHBhY2tldCB3aXRoIDgwMi4xMSBSQSBmaWVsZCBpcyBtdWx0aWNhc3QvYnJvYWRjYXN0IGFkZHJlc3MKKwlIVFRSQU5TTUlUX1NFVFRJTkcJKnBUcmFuc21pdDsKKworCS8vIEZvbGxvd2luZyBzdHJ1Y3R1cmUgdXNlZCBmb3IgdGhlIGNoYXJhY3RlcmlzdGljcyBvZiBhIHNwZWNpZmljIHBhY2tldC4KKwlQTkRJU19QQUNLRVQJCXBQYWNrZXQ7CisJUFVDSEFSCQkJCXBTcmNCdWZIZWFkZXI7CQkJCS8vIFJlZmVyZW5jZSB0byB0aGUgaGVhZCBvZiBza19idWZmLT5kYXRhCisJUFVDSEFSCQkJCXBTcmNCdWZEYXRhOwkJCQkvLyBSZWZlcmVuY2UgdG8gdGhlIHNrX2J1ZmYtPmRhdGEsIHdpbGwgY2hhbmdlZCBkZXBlbmRzIG9uIGhhbmxkaW5nIHByb2dyZXNzcworCVVJTlQJCQkJU3JjQnVmTGVuOwkJCQkJLy8gTGVuZ3RoIG9mIHBhY2tldCBwYXlsb2FkIHdoaWNoIG5vdCBpbmNsdWRpbmcgTGF5ZXIgMiBoZWFkZXIKKwlQVUNIQVIJCQkJcEV4dHJhTGxjU25hcEVuY2FwOwkJCS8vIE5VTEwgbWVhbnMgbm8gZXh0cmEgTExDL1NOQVAgaXMgcmVxdWlyZWQKKwlVQ0hBUgkJCQlIZWFkZXJCdWZbODBdOwkJCQkvLyBUZW1wQnVmZmVyIGZvciBUWF9JTkZPICsgVFhfV0kgKyA4MDIuMTEgSGVhZGVyICsgcGFkZGluZyArIEFNU0RVIFN1YkhlYWRlciArIExMQy9TTkFQCisJVUNIQVIJCQkJTXBkdUhlYWRlckxlbjsJCQkJLy8gODAyLjExIGhlYWRlciBsZW5ndGggTk9UIGluY2x1ZGluZyB0aGUgcGFkZGluZworCVVDSEFSCQkJCUhkclBhZExlbjsJCQkJCS8vIHJlY29yZGluZyBIZWFkZXIgUGFkZGluZyBMZW5ndGg7CisJVUNIQVIJCQkJYXBpZHg7CQkJCQkJLy8gVGhlIGludGVyZmFjZSBhc3NvY2lhdGVkIHRvIHRoaXMgcGFja2V0CisJVUNIQVIJCQkJV2NpZDsJCQkJCQkvLyBUaGUgTUFDIGVudHJ5IGFzc29jaWF0ZWQgdG8gdGhpcyBwYWNrZXQKKwlVQ0hBUgkJCQlVc2VyUHJpb3JpdHk7CQkJCS8vIHByaW9yaXR5IGNsYXNzIG9mIHBhY2tldAorCVVDSEFSCQkJCUZyYW1lR2FwOwkJCQkJLy8gd2hhdCBraW5kIG9mIElGUyB0aGlzIHBhY2tldCB1c2UKKwlVQ0hBUgkJCQlNcGR1UmVxTnVtOwkJCQkJLy8gbnVtYmVyIG9mIGZyYWdtZW50cyBvZiB0aGlzIGZyYW1lCisJVUNIQVIJCQkJVHhSYXRlOwkJCQkJCS8vIFRPRE86IE9ic29sZXRlZD8gU2hvdWxkIGNoYW5nZSB0byBNQ1M/CisJVUNIQVIJCQkJQ2lwaGVyQWxnOwkJCQkJLy8gY2lwaGVyIGFsb2dyaXRobQorCVBDSVBIRVJfS0VZCQkJcEtleTsKKworCisKKwlVU0hPUlQJCQkJRmxhZ3M7CQkJCQkJLy9TZWUgZm9sbG93aW5nIGRlZmluaXRpb25zIGZvciBkZXRhaWwuCisKKwkvL1lPVSBTSE9VTEQgTk9UIFRPVUNIIElUISBGb2xsb3dpbmcgcGFyYW1ldGVycyBhcmUgdXNlZCBmb3IgaGFyZHdhcmUtZGVwZW5kZWQgbGF5ZXIuCisJVUxPTkcJCQkJUHJpdjsJCQkJCQkvLyBIYXJkd2FyZSBzcGVjaWZpYyB2YWx1ZSBzYXZlZCBpbiBoZXJlLgorfSBUWF9CTEssICpQVFhfQkxLOworCisKKyNkZWZpbmUgZlRYX2JSdHNSZXF1aXJlZAkJMHgwMDAxCS8vIEluZGljYXRlIGlmIG5lZWQgc2VuZCBSVFMgZnJhbWUgZm9yIHByb3RlY3Rpb24uIE5vdCB1c2VkIGluIFJUMjg2MC9SVDI4NzAuCisjZGVmaW5lIGZUWF9iQWNrUmVxdWlyZWQgICAgICAgCTB4MDAwMgkvLyB0aGUgcGFja2V0IG5lZWQgYWNrIHJlc3BvbnNlCisjZGVmaW5lIGZUWF9iUGlnZ3lCYWNrICAgICAJCTB4MDAwNAkvLyBMZWdhY3kgZGV2aWNlIHVzZSBQaWdnYmFjayBvciBub3QKKyNkZWZpbmUgZlRYX2JIVFJhdGUgICAgICAgICAJMHgwMDA4CS8vIGFsbG93IHRvIHVzZSBIVCByYXRlCisvLyNkZWZpbmUgZlRYX2JGb3JjZUxvd1JhdGUgICAgICAgMHgwMDEwCS8vIGZvcmNlIHRvIHVzZSBMb3cgUmF0ZQorI2RlZmluZSBmVFhfYkZvcmNlTm9uUW9TICAgICAgIAkweDAwMTAJLy8gZm9yY2UgdG8gdHJhbnNtaXQgZnJhbWUgd2l0aG91dCBXTU0tUW9TIGluIEhUIG1vZGUKKyNkZWZpbmUgZlRYX2JBbGxvd0ZyYWcgICAgICAgCTB4MDAyMAkvLyBhbGxvdyB0byBmcmFnbWVudCB0aGUgcGFja2V0LCBBLU1QRFUsIEEtTVNEVSwgQS1SYWxpbmsgaXMgbm90IGFsbG93ZWQgdG8gZnJhZ21lbnQKKyNkZWZpbmUgZlRYX2JNb3JlRGF0YQkJCTB4MDA0MAkvLyB0aGVyZSBhcmUgbW9yZSBkYXRhIHBhY2tldHMgaW4gUG93ZXJTYXZlIFF1ZXVlCisjZGVmaW5lIGZUWF9iV01NCQkJCTB4MDA4MAkvLyBRT1MgRGF0YQorCisjZGVmaW5lIGZUWF9iQ2xlYXJFQVBGcmFtZQkJMHgwMTAwCisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisKKworI2RlZmluZSBUWF9CTEtfQVNTSUdOX0ZMQUcoX3BUeEJsaywgX2ZsYWcsIHZhbHVlKQlcCisJCWRvIHsJCQkJCQkJCQkJXAorCQkJaWYgKHZhbHVlKSAJCQkJCQkJCVwKKwkJCQkoX3BUeEJsay0+RmxhZ3MgfD0gX2ZsYWcpIAkJCVwKKwkJCWVsc2UgCQkJCQkJCQkJXAorCQkJCShfcFR4QmxrLT5GbGFncyAmPSB+KF9mbGFnKSkJCVwKKwkJfXdoaWxlKDApCisKKyNkZWZpbmUgVFhfQkxLX1NFVF9GTEFHKF9wVHhCbGssIF9mbGFnKQkJKF9wVHhCbGstPkZsYWdzIHw9IF9mbGFnKQorI2RlZmluZSBUWF9CTEtfVEVTVF9GTEFHKF9wVHhCbGssIF9mbGFnKQkoKChfcFR4QmxrLT5GbGFncyAmIF9mbGFnKSA9PSBfZmxhZykgPyAxIDogMCkKKyNkZWZpbmUgVFhfQkxLX0NMRUFSX0ZMQUcoX3BUeEJsaywgX2ZsYWcpCShfcFR4QmxrLT5GbGFncyAmPSB+KF9mbGFnKSkKKworCisKKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKKworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3N0YXRpYyBpbmxpbmUgVk9JRAlXcml0ZUJhY2tUb0Rlc2NyaXB0b3IoCisJSU4gIFBVQ0hBUgkJCURlc3QsCisgCUlOCVBVQ0hBUgkJCVNyYywKKyAgICBJTiAgQk9PTEVBTgkJCURvRW5jcnlwdCwKKwlJTiAgVUxPTkcgICAgICAgICAgIERlc2NyaXB0b3JUeXBlKQoreworCVVJTlQzMiAqcDEsICpwMjsKKworCXAxID0gKChVSU5UMzIgKilEZXN0KTsKKwlwMiA9ICgoVUlOVDMyICopU3JjKTsKKworCSpwMSA9ICpwMjsKKwkqKHAxKzIpID0gKihwMisyKTsKKwkqKHAxKzMpID0gKihwMiszKTsKKwkqKHAxKzEpID0gKihwMisxKTsgLy8gV29yZCAxOyB0aGlzIG11c3QgYmUgd3JpdHRlbiBiYWNrIGxhc3QKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCUVuZGlhbiBjb252ZXJzaW9uIG9mIFR4L1J4IGRlc2NyaXB0b3IgLgorCisJQXJndW1lbnRzOgorCQlwQWQgCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKwkJcERhdGEJCQlQb2ludGVyIHRvIFR4L1J4IGRlc2NyaXB0b3IKKwkJRGVzY3JpcHRvclR5cGUJRGlyZWN0aW9uIG9mIHRoZSBmcmFtZQorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlOb3RlOgorCQlDYWxsIHRoaXMgZnVuY3Rpb24gd2hlbiByZWFkIG9yIHVwZGF0ZSBkZXNjcmlwdG9yCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworc3RhdGljIGlubGluZSBWT0lECVJUTVBXSUVuZGlhbkNoYW5nZSgKKwlJTglQVUNIQVIJCQlwRGF0YSwKKwlJTglVTE9ORwkJCURlc2NyaXB0b3JUeXBlKQoreworCWludCBzaXplOworCWludCBpOworCisJc2l6ZSA9ICgoRGVzY3JpcHRvclR5cGUgPT0gVFlQRV9UWFdJKSA/IFRYV0lfU0laRSA6IFJYV0lfU0laRSk7CisKKwlpZihEZXNjcmlwdG9yVHlwZSA9PSBUWVBFX1RYV0kpCisJeworCQkqKChVSU5UMzIgKikocERhdGEpKSA9IFNXQVAzMigqKChVSU5UMzIgKikocERhdGEpKSk7CQkvLyBCeXRlIDB+MworCQkqKChVSU5UMzIgKikocERhdGEgKyA0KSkgPSBTV0FQMzIoKigoVUlOVDMyICopKHBEYXRhKzQpKSk7CS8vIEJ5dGUgNH43CisJfQorCWVsc2UKKwl7CisJCWZvcihpPTA7IGkgPCBzaXplLzQgOyBpKyspCisJCQkqKCgoVUlOVDMyICopcERhdGEpICtpKSA9IFNXQVAzMigqKCgoVUlOVDMyICopcERhdGEpK2kpKTsKKwl9Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlFbmRpYW4gY29udmVyc2lvbiBvZiBUeC9SeCBkZXNjcmlwdG9yIC4KKworCUFyZ3VtZW50czoKKwkJcEFkIAlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisJCXBEYXRhCQkJUG9pbnRlciB0byBUeC9SeCBkZXNjcmlwdG9yCisJCURlc2NyaXB0b3JUeXBlCURpcmVjdGlvbiBvZiB0aGUgZnJhbWUKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJTm90ZToKKwkJQ2FsbCB0aGlzIGZ1bmN0aW9uIHdoZW4gcmVhZCBvciB1cGRhdGUgZGVzY3JpcHRvcgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KKworI2lmZGVmIFJUMjg3MAorc3RhdGljIGlubGluZSBWT0lECVJUTVBEZXNjcmlwdG9yRW5kaWFuQ2hhbmdlKAorCUlOCVBVQ0hBUgkJCXBEYXRhLAorCUlOCVVMT05HCQkJRGVzY3JpcHRvclR5cGUpCit7CisJKigoVUlOVDMyICopKHBEYXRhKSkgPSBTV0FQMzIoKigoVUlOVDMyICopKHBEYXRhKSkpOworfQorI2VuZGlmIC8vIFJUMjg3MCAvLworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCUVuZGlhbiBjb252ZXJzaW9uIG9mIGFsbCBraW5kcyBvZiA4MDIuMTEgZnJhbWVzIC4KKworCUFyZ3VtZW50czoKKwkJcEFkIAlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisJCXBEYXRhCQkJUG9pbnRlciB0byB0aGUgODAyLjExIGZyYW1lIHN0cnVjdHVyZQorCQlEaXIgCQkJRGlyZWN0aW9uIG9mIHRoZSBmcmFtZQorCQlGcm9tUnhEb25lSW50CUNhbGxlciBpcyBmcm9tIFJ4RG9uZSBpbnRlcnJ1cHQKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJTm90ZToKKwkJQ2FsbCB0aGlzIGZ1bmN0aW9uIHdoZW4gcmVhZCBvciB1cGRhdGUgYnVmZmVyIGRhdGEKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitzdGF0aWMgaW5saW5lIFZPSUQJUlRNUEZyYW1lRW5kaWFuQ2hhbmdlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCXBEYXRhLAorCUlOCVVMT05HCQkJRGlyLAorCUlOCUJPT0xFQU4gCQlGcm9tUnhEb25lSW50KQoreworCVBIRUFERVJfODAyXzExIHBGcmFtZTsKKwlQVUNIQVIJcE1hY0hkcjsKKworCS8vIHN3YWIgMTYgYml0IGZpZWxkcyAtIEZyYW1lIENvbnRyb2wgZmllbGQKKwlpZihEaXIgPT0gRElSX1JFQUQpCisJeworCQkqKFVTSE9SVCAqKXBEYXRhID0gU1dBUDE2KCooVVNIT1JUICopcERhdGEpOworCX0KKworCXBGcmFtZSA9IChQSEVBREVSXzgwMl8xMSkgcERhdGE7CisJcE1hY0hkciA9IChQVUNIQVIpIHBGcmFtZTsKKworCS8vIHN3YWIgMTYgYml0IGZpZWxkcyAtIER1cmF0aW9uL0lEIGZpZWxkCisJKihVU0hPUlQgKikocE1hY0hkciArIDIpID0gU1dBUDE2KCooVVNIT1JUICopKHBNYWNIZHIgKyAyKSk7CisKKwkvLyBzd2FiIDE2IGJpdCBmaWVsZHMgLSBTZXF1ZW5jZSBDb250cm9sIGZpZWxkCisJKihVU0hPUlQgKikocE1hY0hkciArIDIyKSA9IFNXQVAxNigqKFVTSE9SVCAqKShwTWFjSGRyICsgMjIpKTsKKworCWlmKHBGcmFtZS0+RkMuVHlwZSA9PSBCVFlQRV9NR01UKQorCXsKKwkJc3dpdGNoKHBGcmFtZS0+RkMuU3ViVHlwZSkKKwkJeworCQkJY2FzZSBTVUJUWVBFX0FTU09DX1JFUToKKwkJCWNhc2UgU1VCVFlQRV9SRUFTU09DX1JFUToKKwkJCQkvLyBzd2FiIDE2IGJpdCBmaWVsZHMgLSBDYXBhYmlsaXR5SW5mbyBmaWVsZAorCQkJCXBNYWNIZHIgKz0gc2l6ZW9mKEhFQURFUl84MDJfMTEpOworCQkJCSooVVNIT1JUICopcE1hY0hkciA9IFNXQVAxNigqKFVTSE9SVCAqKXBNYWNIZHIpOworCisJCQkJLy8gc3dhYiAxNiBiaXQgZmllbGRzIC0gTGlzdGVuIEludGVydmFsIGZpZWxkCisJCQkJcE1hY0hkciArPSAyOworCQkJCSooVVNIT1JUICopcE1hY0hkciA9IFNXQVAxNigqKFVTSE9SVCAqKXBNYWNIZHIpOworCQkJCWJyZWFrOworCisJCQljYXNlIFNVQlRZUEVfQVNTT0NfUlNQOgorCQkJY2FzZSBTVUJUWVBFX1JFQVNTT0NfUlNQOgorCQkJCS8vIHN3YWIgMTYgYml0IGZpZWxkcyAtIENhcGFiaWxpdHlJbmZvIGZpZWxkCisJCQkJcE1hY0hkciArPSBzaXplb2YoSEVBREVSXzgwMl8xMSk7CisJCQkJKihVU0hPUlQgKilwTWFjSGRyID0gU1dBUDE2KCooVVNIT1JUICopcE1hY0hkcik7CisKKwkJCQkvLyBzd2FiIDE2IGJpdCBmaWVsZHMgLSBTdGF0dXMgQ29kZSBmaWVsZAorCQkJCXBNYWNIZHIgKz0gMjsKKwkJCQkqKFVTSE9SVCAqKXBNYWNIZHIgPSBTV0FQMTYoKihVU0hPUlQgKilwTWFjSGRyKTsKKworCQkJCS8vIHN3YWIgMTYgYml0IGZpZWxkcyAtIEFJRCBmaWVsZAorCQkJCXBNYWNIZHIgKz0gMjsKKwkJCQkqKFVTSE9SVCAqKXBNYWNIZHIgPSBTV0FQMTYoKihVU0hPUlQgKilwTWFjSGRyKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBTVUJUWVBFX0FVVEg6CisJCQkJLy8gSWYgZnJvbSBBUEhhbmRsZVJ4RG9uZUludGVycnVwdCByb3V0aW5lLCBpdCBpcyBzdGlsbCBhIGVuY3J5cHQgZm9ybWF0LgorCQkJCS8vIFRoZSBjb252ZXJ0aW9uIGlzIGRlbGF5ZWQgdG8gUlRNUEhhbmRsZURlY3J5cHRpb25Eb25lSW50ZXJydXB0LgorCQkJCWlmKCFGcm9tUnhEb25lSW50ICYmIHBGcmFtZS0+RkMuV2VwID09IDEpCisJCQkJCWJyZWFrOworCQkJCWVsc2UKKwkJCQl7CisJCQkJCS8vIHN3YWIgMTYgYml0IGZpZWxkcyAtIEF1dGggQWxnIE5vLiBmaWVsZAorCQkJCQlwTWFjSGRyICs9IHNpemVvZihIRUFERVJfODAyXzExKTsKKwkJCQkJKihVU0hPUlQgKilwTWFjSGRyID0gU1dBUDE2KCooVVNIT1JUICopcE1hY0hkcik7CisKKwkJCQkJLy8gc3dhYiAxNiBiaXQgZmllbGRzIC0gQXV0aCBTZXEgTm8uIGZpZWxkCisJCQkJCXBNYWNIZHIgKz0gMjsKKwkJCQkJKihVU0hPUlQgKilwTWFjSGRyID0gU1dBUDE2KCooVVNIT1JUICopcE1hY0hkcik7CisKKwkJCQkJLy8gc3dhYiAxNiBiaXQgZmllbGRzIC0gU3RhdHVzIENvZGUgZmllbGQKKwkJCQkJcE1hY0hkciArPSAyOworCQkJCQkqKFVTSE9SVCAqKXBNYWNIZHIgPSBTV0FQMTYoKihVU0hPUlQgKilwTWFjSGRyKTsKKwkJCQl9CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgU1VCVFlQRV9CRUFDT046CisJCQljYXNlIFNVQlRZUEVfUFJPQkVfUlNQOgorCQkJCS8vIHN3YWIgMTYgYml0IGZpZWxkcyAtIEJlYWNvbkludGVydmFsIGZpZWxkCisJCQkJcE1hY0hkciArPSAoc2l6ZW9mKEhFQURFUl84MDJfMTEpICsgVElNRVNUQU1QX0xFTik7CisJCQkJKihVU0hPUlQgKilwTWFjSGRyID0gU1dBUDE2KCooVVNIT1JUICopcE1hY0hkcik7CisKKwkJCQkvLyBzd2FiIDE2IGJpdCBmaWVsZHMgLSBDYXBhYmlsaXR5SW5mbyBmaWVsZAorCQkJCXBNYWNIZHIgKz0gc2l6ZW9mKFVTSE9SVCk7CisJCQkJKihVU0hPUlQgKilwTWFjSGRyID0gU1dBUDE2KCooVVNIT1JUICopcE1hY0hkcik7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgU1VCVFlQRV9ERUFVVEg6CisJCQljYXNlIFNVQlRZUEVfRElTQVNTT0M6CisJCQkJLy8gc3dhYiAxNiBiaXQgZmllbGRzIC0gUmVhc29uIGNvZGUgZmllbGQKKwkJCQlwTWFjSGRyICs9IHNpemVvZihIRUFERVJfODAyXzExKTsKKwkJCQkqKFVTSE9SVCAqKXBNYWNIZHIgPSBTV0FQMTYoKihVU0hPUlQgKilwTWFjSGRyKTsKKwkJCQlicmVhazsKKwkJfQorCX0KKwllbHNlIGlmKCBwRnJhbWUtPkZDLlR5cGUgPT0gQlRZUEVfREFUQSApCisJeworCX0KKwllbHNlIGlmKHBGcmFtZS0+RkMuVHlwZSA9PSBCVFlQRV9DTlRMKQorCXsKKwkJc3dpdGNoKHBGcmFtZS0+RkMuU3ViVHlwZSkKKwkJeworCQkJY2FzZSBTVUJUWVBFX0JMT0NLX0FDS19SRVE6CisJCQkJeworCQkJCQlQRlJBTUVfQkFfUkVRIHBCQVJlcSA9IChQRlJBTUVfQkFfUkVRKXBGcmFtZTsKKwkJCQkJKihVU0hPUlQgKikoJnBCQVJlcS0+QkFSQ29udHJvbCkgPSBTV0FQMTYoKihVU0hPUlQgKikoJnBCQVJlcS0+QkFSQ29udHJvbCkpOworCQkJCQlwQkFSZXEtPkJBU3RhcnRpbmdTZXEud29yZCA9IFNXQVAxNihwQkFSZXEtPkJBU3RhcnRpbmdTZXEud29yZCk7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSBTVUJUWVBFX0JMT0NLX0FDSzoKKwkJCQkvLyBGb3IgQmxvY2sgQWNrIHBhY2tldCwgdGhlIEhUX0NPTlRST0wgZmllbGQgaXMgaW4gdGhlIHNhbWUgb2Zmc2V0IHdpdGggQWRkcjMKKwkJCQkqKFVJTlQzMiAqKSgmcEZyYW1lLT5BZGRyM1swXSkgPSBTV0FQMzIoKihVSU5UMzIgKikoJnBGcmFtZS0+QWRkcjNbMF0pKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBTVUJUWVBFX0FDSzoKKwkJCQkvL0ZvciBBQ0sgcGFja2V0LCB0aGUgSFRfQ09OVFJPTCBmaWVsZCBpcyBpbiB0aGUgc2FtZSBvZmZzZXQgd2l0aCBBZGRyMgorCQkJCSooVUlOVDMyICopKCZwRnJhbWUtPkFkZHIyWzBdKT0JU1dBUDMyKCooVUlOVDMyICopKCZwRnJhbWUtPkFkZHIyWzBdKSk7CisJCQkJYnJlYWs7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJJbnZhbGlkIEZyYW1lIFR5cGUhISFcbiIpKTsKKwl9CisKKwkvLyBzd2FiIDE2IGJpdCBmaWVsZHMgLSBGcmFtZSBDb250cm9sCisJaWYoRGlyID09IERJUl9XUklURSkKKwl7CisJCSooVVNIT1JUICopcERhdGEgPSBTV0FQMTYoKihVU0hPUlQgKilwRGF0YSk7CisJfQorfQorI2VuZGlmIC8vIFJUX0JJR19FTkRJQU4gLy8KKworCitzdGF0aWMgaW5saW5lIFZPSUQgQ29udmVydE11bHRpY2FzdElQMk1BQygKKwlJTiBQVUNIQVIgcElwQWRkciwKKwlJTiBQVUNIQVIgKnBwTWFjQWRkciwKKwlJTiBVSU5UMTYgUHJvdG9UeXBlKQoreworCWlmIChwSXBBZGRyID09IE5VTEwpCisJCXJldHVybjsKKworCWlmIChwcE1hY0FkZHIgPT0gTlVMTCB8fCAqcHBNYWNBZGRyID09IE5VTEwpCisJCXJldHVybjsKKworCXN3aXRjaCAoUHJvdG9UeXBlKQorCXsKKwkJY2FzZSBFVEhfUF9JUFY2OgorLy8JCQltZW1zZXQoKnBwTWFjQWRkciwgMCwgRVRIX0xFTkdUSF9PRl9BRERSRVNTKTsKKwkJCSooKnBwTWFjQWRkcikgPSAweDMzOworCQkJKigqcHBNYWNBZGRyICsgMSkgPSAweDMzOworCQkJKigqcHBNYWNBZGRyICsgMikgPSBwSXBBZGRyWzEyXTsKKwkJCSooKnBwTWFjQWRkciArIDMpID0gcElwQWRkclsxM107CisJCQkqKCpwcE1hY0FkZHIgKyA0KSA9IHBJcEFkZHJbMTRdOworCQkJKigqcHBNYWNBZGRyICsgNSkgPSBwSXBBZGRyWzE1XTsKKwkJCWJyZWFrOworCisJCWNhc2UgRVRIX1BfSVA6CisJCWRlZmF1bHQ6CisvLwkJCW1lbXNldCgqcHBNYWNBZGRyLCAwLCBFVEhfTEVOR1RIX09GX0FERFJFU1MpOworCQkJKigqcHBNYWNBZGRyKSA9IDB4MDE7CisJCQkqKCpwcE1hY0FkZHIgKyAxKSA9IDB4MDA7CisJCQkqKCpwcE1hY0FkZHIgKyAyKSA9IDB4NWU7CisJCQkqKCpwcE1hY0FkZHIgKyAzKSA9IHBJcEFkZHJbMV0gJiAweDdmOworCQkJKigqcHBNYWNBZGRyICsgNCkgPSBwSXBBZGRyWzJdOworCQkJKigqcHBNYWNBZGRyICsgNSkgPSBwSXBBZGRyWzNdOworCQkJYnJlYWs7CisJfQorCisJcmV0dXJuOworfQorCitCT09MRUFOIFJUTVBDaGVja0ZvckhhbmcoCisJSU4gIE5ESVNfSEFORExFIE1pbmlwb3J0QWRhcHRlckNvbnRleHQKKwkpOworCitWT0lEICBSVE1QSGFsdCgKKwlJTiAgTkRJU19IQU5ETEUgTWluaXBvcnRBZGFwdGVyQ29udGV4dAorCSk7CisKKy8vCisvLyAgUHJpdmF0ZSByb3V0aW5lcyBpbiBydG1wX2luaXQuYworLy8KK05ESVNfU1RBVFVTIFJUTVBBbGxvY0FkYXB0ZXJCbG9jaygKKwlJTiBQVk9JRAkJCWhhbmRsZSwKKwlPVVQgUFJUTVBfQURBUFRFUiAgICpwcEFkYXB0ZXIKKwkpOworCitORElTX1NUQVRVUyBSVE1QQWxsb2NUeFJ4UmluZ01lbW9yeSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZAorCSk7CisKK05ESVNfU1RBVFVTIFJUTVBGaW5kQWRhcHRlcigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTkRJU19IQU5ETEUgICAgIFdyYXBwZXJDb25maWd1cmF0aW9uQ29udGV4dAorCSk7CisKK05ESVNfU1RBVFVTCVJUTVBSZWFkUGFyYW1ldGVyc0hvb2soCisJSU4JUFJUTVBfQURBUFRFUiBwQWQKKwkpOworCitWT0lEIFJUTVBGcmVlQWRhcHRlcigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZAorCSk7CisKK05ESVNfU1RBVFVTIE5JQ1JlYWRSZWdQYXJhbWV0ZXJzKAorCUlOICBQUlRNUF9BREFQVEVSICAgICAgIHBBZCwKKwlJTiAgTkRJU19IQU5ETEUgICAgICAgICBXcmFwcGVyQ29uZmlndXJhdGlvbkNvbnRleHQKKwkpOworCisjaWZkZWYgUlQyODcwCitWT0lEIE5JQ0luaXRSVDMweHhSRlJlZ2lzdGVycygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisjZW5kaWYgLy8gUlQyODcwIC8vCisKK1ZPSUQgTklDUmVhZEVFUFJPTVBhcmFtZXRlcnMoCisJSU4gIFBSVE1QX0FEQVBURVIgICAgICAgcEFkLAorCUlOCVBVQ0hBUgkJCQltYWNfYWRkcik7CisKK1ZPSUQgTklDSW5pdEFzaWNGcm9tRUVQUk9NKAorCUlOICBQUlRNUF9BREFQVEVSICAgICAgIHBBZCk7CisKK1ZPSUQgTklDSW5pdFR4UnhSaW5nQW5kQmFja2xvZ1F1ZXVlKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworTkRJU19TVEFUVVMgTklDSW5pdGlhbGl6ZUFkYXB0ZXIoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gICBCT09MRUFOICAgIGJIYXJkUmVzZXQpOworCitORElTX1NUQVRVUyBOSUNJbml0aWFsaXplQXNpYygKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgQk9PTEVBTgkJYkhhcmRSZXNldCk7CisKK1ZPSUQgTklDSXNzdWVSZXNldCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK1ZPSUQgUlRNUFJpbmdDbGVhblVwKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBVQ0hBUiAgICAgICAgICAgUmluZ1R5cGUpOworCitWT0lEIFJ4VGVzdCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK05ESVNfU1RBVFVTIERiZ1NlbmRQYWNrZXQoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFBORElTX1BBQ0tFVCAgICBwUGFja2V0KTsKKworVk9JRCBVc2VyQ2ZnSW5pdCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK1ZPSUQgTklDUmVzZXRGcm9tRXJyb3IoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitWT0lEIE5JQ0VyYXNlRmlybXdhcmUoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpOworCitORElTX1NUQVRVUyBOSUNMb2FkRmlybXdhcmUoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitORElTX1NUQVRVUyBOSUNMb2FkUmF0ZVN3aXRjaGluZ1BhcmFtcygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK0JPT0xFQU4gTklDQ2hlY2tGb3JIYW5nKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworVk9JRCBOSUNVcGRhdGVGaWZvU3RhQ291bnRlcnMoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpOworCitWT0lEIE5JQ1VwZGF0ZVJhd0NvdW50ZXJzKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworI2lmIDAKK1VMT05HIFJUTVBFcXVhbE1lbW9yeSgKKwlJTiAgUFZPSUQgICBwU3JjMSwKKwlJTiAgUFZPSUQgICBwU3JjMiwKKwlJTiAgVUxPTkcgICBMZW5ndGgpOworI2VuZGlmCisKK1VMT05HCVJUTVBOb3RBbGxaZXJvKAorCUlOCVBWT0lECXBTcmMxLAorCUlOCVVMT05HCUxlbmd0aCk7CisKK1ZPSUQgUlRNUFplcm9NZW1vcnkoCisJSU4gIFBWT0lEICAgcFNyYywKKwlJTiAgVUxPTkcgICBMZW5ndGgpOworCitVTE9ORyBSVE1QQ29tcGFyZU1lbW9yeSgKKwlJTiAgUFZPSUQgICBwU3JjMSwKKwlJTiAgUFZPSUQgICBwU3JjMiwKKwlJTiAgVUxPTkcgICBMZW5ndGgpOworCitWT0lEIFJUTVBNb3ZlTWVtb3J5KAorCU9VVCBQVk9JRCAgIHBEZXN0LAorCUlOICBQVk9JRCAgIHBTcmMsCisJSU4gIFVMT05HICAgTGVuZ3RoKTsKKworVk9JRCBBdG9IKAorCWNoYXIJKnNyYywKKwlVQ0hBUgkqZGVzdCwKKwlpbnQJCWRlc3RsZW4pOworCitVQ0hBUiBCdG9IKAorCWNoYXIgY2gpOworCitWT0lEIFJUTVBQYXRjaE1hY0JicEJ1ZygKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK1ZPSUQgUlRNUFBhdGNoQ2FyZEJ1cygKKwlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyKTsKKworVk9JRCBSVE1QUGF0Y2hSYWxpbmtDYXJkQnVzKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCisJSU4JVUxPTkcJCQlCdXMpOworCitVTE9ORyBSVE1QUmVhZENCQ29uZmlnKAorCUlOCVVMT05HCUJ1cywKKwlJTglVTE9ORwlTbG90LAorCUlOCVVMT05HCUZ1bmMsCisJSU4JVUxPTkcJT2Zmc2V0KTsKKworVk9JRCBSVE1QV3JpdGVDQkNvbmZpZygKKwlJTglVTE9ORwlCdXMsCisJSU4JVUxPTkcJU2xvdCwKKwlJTglVTE9ORwlGdW5jLAorCUlOCVVMT05HCU9mZnNldCwKKwlJTglVTE9ORwlWYWx1ZSk7CisKK1ZPSUQgUlRNUEluaXRUaW1lcigKKwlJTiAgUFJUTVBfQURBUFRFUiAgICAgICAgICAgcEFkLAorCUlOICBQUkFMSU5LX1RJTUVSX1NUUlVDVCAgICBwVGltZXIsCisJSU4gIFBWT0lEICAgICAgICAgICAgICAgICAgIHBUaW1lckZ1bmMsCisJSU4JUFZPSUQJCQkJCXBEYXRhLAorCUlOICBCT09MRUFOICAgICAgICAgICAgICAgICBSZXBlYXQpOworCitWT0lEIFJUTVBTZXRUaW1lcigKKwlJTiAgUFJBTElOS19USU1FUl9TVFJVQ1QgICAgcFRpbWVyLAorCUlOICBVTE9ORyAgICAgICAgICAgICAgICAgICBWYWx1ZSk7CisKKworVk9JRCBSVE1QTW9kVGltZXIoCisJSU4JUFJBTElOS19USU1FUl9TVFJVQ1QJcFRpbWVyLAorCUlOCVVMT05HCQkJCQlWYWx1ZSk7CisKK1ZPSUQgUlRNUENhbmNlbFRpbWVyKAorCUlOICBQUkFMSU5LX1RJTUVSX1NUUlVDVCAgICBwVGltZXIsCisJT1VUIEJPT0xFQU4gICAgICAgICAgICAgICAgICpwQ2FuY2VsbGVkKTsKKworVk9JRCBSVE1QU2V0TEVEKAorCUlOIFBSVE1QX0FEQVBURVIgCXBBZCwKKwlJTiBVQ0hBUgkJCVN0YXR1cyk7CisKK1ZPSUQgUlRNUFNldFNpZ25hbExFRCgKKwlJTiBQUlRNUF9BREFQVEVSIAlwQWQsCisJSU4gTkRJU184MDJfMTFfUlNTSSBEYm0pOworCitWT0lEIFJUTVBFbmFibGVSeFR4KAorCUlOIFBSVE1QX0FEQVBURVIJcEFkKTsKKworLy8KKy8vIHByb3RvdHlwZSBpbiBhY3Rpb24uYworLy8KK1ZPSUQgQWN0aW9uU3RhdGVNYWNoaW5lSW5pdCgKKyAgICBJTglQUlRNUF9BREFQVEVSCXBBZCwKKyAgICBJTiAgU1RBVEVfTUFDSElORSAqUywKKyAgICBPVVQgU1RBVEVfTUFDSElORV9GVU5DIFRyYW5zW10pOworCitWT0lEIE1sbWVBRERCQUFjdGlvbigKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIE1sbWVERUxCQUFjdGlvbigKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIE1sbWVETFNBY3Rpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBNbG1lSW52YWxpZEFjdGlvbigKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIE1sbWVRT1NBY3Rpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorVk9JRCBQZWVyQWRkQkFSZXFBY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBQZWVyQWRkQkFSc3BBY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBQZWVyRGVsQkFBY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBQZWVyQkFBY3Rpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworVk9JRCBTZW5kUFNNUEFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiBVQ0hBUgkJCVdjaWQsCisJSU4gVUNIQVIJCQlQc21wKTsKKworCisjaWZkZWYgRE9UMTFOX0RSQUZUMworVk9JRCBTZW5kQlNTMjA0MENvZXhpc3RNZ210QWN0aW9uKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVDSEFSCVdjaWQsCisJSU4JVUNIQVIJYXBpZHgsCisJSU4JVUNIQVIJSW5mb1JlcSk7CisKK1ZPSUQgU2VuZE5vdGlmeUJXQWN0aW9uRnJhbWUoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVUNIQVIgIFdjaWQsCisJSU4gVUNIQVIgYXBpZHgpOworCitCT09MRUFOIENoYW5uZWxTd2l0Y2hTYW5pdHlDaGVjaygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiAgICBVQ0hBUiAgV2NpZCwKKwlJTiAgICBVQ0hBUiAgTmV3Q2hhbm5lbCwKKwlJTiAgICBVQ0hBUiAgU2Vjb25kYXJ5KTsKKworVk9JRCBDaGFubmVsU3dpdGNoQWN0aW9uKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOICAgIFVDSEFSICBXY2lkLAorCUlOICAgIFVDSEFSICBDaGFubmVsLAorCUlOICAgIFVDSEFSICBTZWNvbmRhcnkpOworCitVTE9ORyBCdWlsZEludG9sZXJhbnRDaGFubmVsUmVwKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOICAgIFBVQ0hBUiAgcERlc3QpOworCitWT0lEIFVwZGF0ZTIwNDBDb2V4aXN0RnJhbWVBbmROb3RpZnkoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4gICAgVUNIQVIgIFdjaWQsCisJSU4JQk9PTEVBTgliQWRkSW50b2xlcmFudENoYSk7CisKK1ZPSUQgU2VuZDIwNDBDb2V4aXN0QWN0aW9uKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOICAgIFVDSEFSICBXY2lkLAorCUlOCUJPT0xFQU4JYkFkZEludG9sZXJhbnRDaGEpOworI2VuZGlmIC8vIERPVDExTl9EUkFGVDMgLy8KKworVk9JRCBQZWVyUk1BY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBQZWVyUHVibGljQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKK1ZPSUQgU3RhUHVibGljQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVDSEFSIEJzczIwNDBDb2V4aXN0KTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCitWT0lEIFBlZXJCU1NUcmFuQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKK1ZPSUQgUGVlckhUQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKK1ZPSUQgUGVlclFPU0FjdGlvbigKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCitWT0lEIFBlZXJETFNBY3Rpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorVk9JRCBEbHNQYXJtRmlsbCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBPVVQgTUxNRV9ETFNfUkVRX1NUUlVDVCAqcERsc1JlcSwKKwlJTiBQUlRfODAyXzExX0RMUyBwRGxzLAorCUlOIFVTSE9SVCByZWFzb24pOworI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCitWT0lEIFJFQ0JBVGltZXJUaW1lb3V0KAorICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKKyAgICBJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCisgICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAorICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMyk7CisKK1ZPSUQgT1JJQkFUaW1lclRpbWVvdXQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQpOworCitWT0lEIFNlbmRSZWZyZXNoQkFSKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCU1BQ19UQUJMRV9FTlRSWQkqcEVudHJ5KTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworVk9JRCBBY3RIZWFkZXJJbml0KAorICAgIElOCVBSVE1QX0FEQVBURVIJcEFkLAorICAgIElOIE9VVCBQSEVBREVSXzgwMl8xMSBwSGRyODAyMTEsCisgICAgSU4gUFVDSEFSIEFkZHIxLAorICAgIElOIFBVQ0hBUiBBZGRyMiwKKyAgICBJTiBQVUNIQVIgQWRkcjMpOworCitWT0lEIEJhckhlYWRlckluaXQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4gT1VUIFBGUkFNRV9CQVIgcENudGxCYXIsCisJSU4gUFVDSEFSIHBEQSwKKwlJTiBQVUNIQVIgcFNBKTsKKworVk9JRCBJbnNlcnRBY3RGaWVsZCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlPVVQgUFVDSEFSIHBGcmFtZUJ1ZiwKKwlPVVQgUFVMT05HIHBGcmFtZUxlbiwKKwlJTiBVSU5UOCBDYXRlZ29yeSwKKwlJTiBVSU5UOCBBY3RDb2RlKTsKKworQk9PTEVBTiBRb3NCQURhdGFQYXJzZSgKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiBCT09MRUFOIGJBTVNEVSwKKwlJTiBQVUNIQVIgcDgwMjNIZWFkZXIsCisJSU4gVUNIQVIJV0NJRCwKKwlJTiBVQ0hBUglUSUQsCisJSU4gVVNIT1JUIFNlcXVlbmNlLAorCUlOIFVDSEFSIERhdGFPZmZzZXQsCisJSU4gVVNIT1JUIERhdGFzaXplLAorCUlOIFVJTlQgICBDdXJSeEluZGV4KTsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorQk9PTEVBTiBDbnRsRW5xdWV1ZUZvclJlY3YoCisgICAgSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4gVUxPTkcgV2NpZCwKKyAgICBJTiBVTE9ORyBNc2dMZW4sCisJSU4gUEZSQU1FX0JBX1JFUSBwTXNnKTsKKworVk9JRCBCYUF1dG9NYW5Td2l0Y2goCisJSU4JUFJUTVBfQURBUFRFUglwQWQpOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCitWT0lEIEhUSU9UQ2hlY2soCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4gICAgVUNIQVIgICAgIEJhdFJlY0lkeCk7CisKKy8vCisvLyBQcml2YXRlIHJvdXRpbmVzIGluIHJ0bXBfZGF0YS5jCisvLworQk9PTEVBTiBSVE1QSGFuZGxlUnhEb25lSW50ZXJydXB0KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworVk9JRCBSVE1QSGFuZGxlVHhEb25lSW50ZXJydXB0KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworQk9PTEVBTiBSVE1QSGFuZGxlVHhSaW5nRG1hRG9uZUludGVycnVwdCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgSU5UX1NPVVJDRV9DU1JfU1RSVUMgVHhSaW5nQml0bWFwKTsKKworVk9JRCBSVE1QSGFuZGxlTWdtdFJpbmdEbWFEb25lSW50ZXJydXB0KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworVk9JRCBSVE1QSGFuZGxlVEJUVEludGVycnVwdCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK1ZPSUQgUlRNUEhhbmRsZVByZVRCVFRJbnRlcnJ1cHQoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCit2b2lkIFJUTVBIYW5kbGVUd2FrZXVwSW50ZXJydXB0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKworVk9JRAlSVE1QSGFuZGxlUnhDb2hlcmVudEludGVycnVwdCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCk7CisKK0JPT0xFQU4gVHhGcmFtZUlzQWdncmVnYXRpYmxlKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBQVUNIQVIgICAgICAgICAgcFByZXZBZGRyMSwKKwlJTiAgUFVDSEFSICAgICAgICAgIHA4MDIzaGRyKTsKKworQk9PTEVBTiBQZWVySXNBZ2dyZU9uKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorICAgIElOICBVTE9ORyAgICAgICAgICBUeFJhdGUsCisgICAgSU4gIFBNQUNfVEFCTEVfRU5UUlkgcE1hY0VudHJ5KTsKKworI2lmIDAJLy8gSXQncyBub3QgYmUgdXNlZAorSFRUUkFOU01JVF9TRVRUSU5HICAqR2V0VHhNb2RlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVRYX0JMSwkJCSpwVHhCbGspOworI2VuZGlmCisKK05ESVNfU1RBVFVTIFNuaWZmMkJ5dGVzRnJvbU5kaXNCdWZmZXIoCisJSU4gIFBORElTX0JVRkZFUiAgICBwRmlyc3RCdWZmZXIsCisJSU4gIFVDSEFSICAgICAgICAgICBEZXNpcmVkT2Zmc2V0LAorCU9VVCBQVUNIQVIgICAgICAgICAgcEJ5dGUwLAorCU9VVCBQVUNIQVIgICAgICAgICAgcEJ5dGUxKTsKKworTkRJU19TVEFUVVMgU1RBU2VuZFBhY2tldCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgUE5ESVNfUEFDS0VUICAgIHBQYWNrZXQpOworCitWT0lEIFNUQVNlbmRQYWNrZXRzKAorCUlOICBORElTX0hBTkRMRSAgICAgTWluaXBvcnRBZGFwdGVyQ29udGV4dCwKKwlJTiAgUFBORElTX1BBQ0tFVCAgIHBwUGFja2V0QXJyYXksCisJSU4gIFVJTlQgICAgICAgICAgICBOdW1iZXJPZlBhY2tldHMpOworCitWT0lEIFJUTVBEZVF1ZXVlUGFja2V0KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorICAgCUlOCUJPT0xFQU4JCQliSW50Q29udGV4dCwKKwlJTiAgVUNIQVIJCQlRdWVJZHgsCisJSU4JVUNIQVIJCQlNYXhfVHhfUGFja2V0cyk7CisKK05ESVNfU1RBVFVTCVJUTVBIYXJkVHJhbnNtaXQoCisJSU4gUFJUTVBfQURBUFRFUglwQWQsCisJSU4gUE5ESVNfUEFDS0VUCQlwUGFja2V0LAorCUlOICBVQ0hBUgkJCVF1ZUlkeCwKKwlPVVQJUFVMT05HCQkJcEZyZWVUWERMZWZ0KTsKKworTkRJU19TVEFUVVMJU1RBSGFyZFRyYW5zbWl0KAorCUlOIFBSVE1QX0FEQVBURVIJcEFkLAorCUlOIFRYX0JMSwkJCSpwVHhCbGssCisJSU4gIFVDSEFSCQkJUXVlSWR4KTsKKworVk9JRCBTVEFSeEVBUE9MRnJhbWVJbmRpY2F0ZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglNQUNfVEFCTEVfRU5UUlkJKnBFbnRyeSwKKwlJTglSWF9CTEsJCQkqcFJ4QmxrLAorCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpOworCitORElTX1NUQVRVUyBSVE1QRnJlZVRYRFJlcXVlc3QoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFVDSEFSICAgICAgICAgICBSaW5nVHlwZSwKKwlJTiAgVUNIQVIgICAgICAgICAgIE51bWJlclJlcXVpcmVkLAorCUlOIAlQVUNIQVIgICAgICAgICAgRnJlZU51bWJlcklzKTsKKworTkRJU19TVEFUVVMgTWxtZUhhcmRUcmFuc21pdCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgVUNIQVIJUXVlSWR4LAorCUlOICBQTkRJU19QQUNLRVQgICAgcFBhY2tldCk7CisKK05ESVNfU1RBVFVTIE1sbWVIYXJkVHJhbnNtaXRNZ210UmluZygKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgVUNIQVIJUXVlSWR4LAorCUlOICBQTkRJU19QQUNLRVQgICAgcFBhY2tldCk7CisKK05ESVNfU1RBVFVTIE1sbWVIYXJkVHJhbnNtaXRUeFJpbmcoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFVDSEFSCVF1ZUlkeCwKKwlJTiAgUE5ESVNfUEFDS0VUICAgIHBQYWNrZXQpOworCitVU0hPUlQgIFJUTVBDYWxjRHVyYXRpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFVDSEFSICAgICAgICAgICBSYXRlLAorCUlOICBVTE9ORyAgICAgICAgICAgU2l6ZSk7CisKK1ZPSUQgUlRNUFdyaXRlVHhXSSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVFhXSV9TVFJVQwkJcFR4V0ksCisJSU4gIEJPT0xFQU4gICAgCQlGUkFHLAorCUlOICBCT09MRUFOICAgIAkJQ0ZBQ0ssCisJSU4gIEJPT0xFQU4gICAgCQlJbnNUaW1lc3RhbXAsCisJSU4JQk9PTEVBTgkJCUFNUERVLAorCUlOCUJPT0xFQU4JCQlBY2ssCisJSU4JQk9PTEVBTgkJCU5TZXEsCQkvLyBIVyBuZXcgYSBzZXF1ZW5jZS4KKwlJTglVQ0hBUgkJCUJBU2l6ZSwKKwlJTglVQ0hBUgkJCVdDSUQsCisJSU4JVUxPTkcJCQlMZW5ndGgsCisJSU4gIFVDSEFSICAgICAgCQlQSUQsCisJSU4JVUNIQVIJCQlUSUQsCisJSU4JVUNIQVIJCQlUeFJhdGUsCisJSU4JVUNIQVIJCQlUeG9wbW9kZSwKKwlJTglCT09MRUFOCQkJQ2ZBY2ssCisJSU4JSFRUUkFOU01JVF9TRVRUSU5HCSpwVHJhbnNtaXQpOworCisKK1ZPSUQgUlRNUFdyaXRlVHhXSV9EYXRhKAorCUlOCVBSVE1QX0FEQVBURVIJCXBBZCwKKwlJTglPVVQgUFRYV0lfU1RSVUMJCXBUeFdJLAorCUlOCVRYX0JMSwkJCQkqcFR4QmxrKTsKKworCitWT0lEIFJUTVBXcml0ZVR4V0lfQ2FjaGUoCisJSU4JUFJUTVBfQURBUFRFUgkJcEFkLAorCUlOCU9VVCBQVFhXSV9TVFJVQwkJcFR4V0ksCisJSU4JVFhfQkxLCQkJCSpwVHhCbGspOworCitWT0lEIFJUTVBXcml0ZVR4RGVzY3JpcHRvcigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVFhEX1NUUlVDCQlwVHhELAorCUlOCUJPT0xFQU4JCQliV0lWLAorCUlOCVVDSEFSCQkJUVNFTCk7CisKK1ZPSUQgUlRNUFN1c3BlbmRNc2R1VHJhbnNtaXNzaW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworVk9JRCBSVE1QUmVzdW1lTXNkdVRyYW5zbWlzc2lvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK05ESVNfU1RBVFVTIE1pbmlwb3J0TU1SZXF1ZXN0KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOCVVDSEFSCQkJUXVlSWR4LAorCUlOCVBVQ0hBUgkJCXBEYXRhLAorCUlOICBVSU5UICAgICAgICAgICAgTGVuZ3RoKTsKKworTkRJU19TVEFUVVMgTWluaXBvcnREYXRhTU1SZXF1ZXN0KAorCSBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwkgSU4gIFVDSEFSICAgICAgICAgICBRdWVJZHgsCisJIElOICBQVUNIQVIgICAgICAgICAgcERhdGEsCisJIElOICBVSU5UICAgICAgICAgICAgTGVuZ3RoKTsKKworVk9JRCBSVE1QU2VuZE51bGxGcmFtZSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgVUNIQVIgICAgICAgICAgIFR4UmF0ZSwKKwlJTglCT09MRUFOCQkJYlFvc051bGwpOworCitWT0lEIFJUTVBTZW5kRGlzYXNzb2NpYXRpb25GcmFtZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCk7CisKK1ZPSUQgUlRNUFNlbmRSVFNGcmFtZSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBEQSwKKwlJTgl1bnNpZ25lZCBpbnQJTmV4dE1wZHVTaXplLAorCUlOICBVQ0hBUiAgICAgICAgICAgVHhSYXRlLAorCUlOICBVQ0hBUiAgICAgICAgICAgUlRTUmF0ZSwKKwlJTiAgVVNIT1JUICAgICAgICAgIEFja0R1cmF0aW9uLAorCUlOICBVQ0hBUiAgICAgICAgICAgUXVlSWR4LAorCUlOICBVQ0hBUgkJCUZyYW1lR2FwKTsKKworCitORElTX1NUQVRVUyBSVE1QQXBwbHlQYWNrZXRGaWx0ZXIoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFBSVDI4WFhfUlhEX1NUUlVDICAgICAgcFJ4RCwKKwlJTiAgUEhFQURFUl84MDJfMTEgIHBIZWFkZXIpOworCitQUVVFVUVfSEVBREVSICAgUlRNUENoZWNrVHhTd1F1ZXVlKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCU9VVCBVQ0hBUiAgICAgICAgICAgKlF1ZUlkeCk7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKK1ZPSUQgUlRNUFJlcG9ydE1pY0Vycm9yKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBQQ0lQSEVSX0tFWSAgICAgcFdwYUtleSk7CisKK1ZPSUQJV3BhTWljRmFpbHVyZVJlcG9ydEZyYW1lKAorCUlOICBQUlRNUF9BREFQVEVSICAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCAgICBXcGFEaXNhc3NvY0FwQW5kQmxvY2tBc3NvYygKKyAgICBJTiAgUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorICAgIElOICBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCisgICAgSU4gIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKKyAgICBJTiAgUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworTkRJU19TVEFUVVMgUlRNUENsb25lTmRpc1BhY2tldCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTglCT09MRUFOICAgIHBJbnNBTVNEVUhkciwKKwlJTiAgUE5ESVNfUEFDS0VUICAgIHBJblBhY2tldCwKKwlPVVQgUE5ESVNfUEFDS0VUICAgKnBwT3V0UGFja2V0KTsKKworTkRJU19TVEFUVVMgUlRNUEFsbG9jYXRlTmRpc1BhY2tldCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgUE5ESVNfUEFDS0VUICAgICpwUGFja2V0LAorCUlOICBQVUNIQVIgICAgICAgICAgcEhlYWRlciwKKwlJTiAgVUlOVCAgICAgICAgICAgIEhlYWRlckxlbiwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBEYXRhLAorCUlOICBVSU5UICAgICAgICAgICAgRGF0YUxlbik7CisKK1ZPSUQgUlRNUEZyZWVOZGlzUGFja2V0KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBQTkRJU19QQUNLRVQgICAgcFBhY2tldCk7CisKK0JPT0xFQU4gUlRNUEZyZWVUWERVcG9uVHhEbWFEb25lKAorCUlOIFBSVE1QX0FEQVBURVIgICAgcEFkLAorCUlOIFVDSEFSICAgICAgICAgICAgUXVlSWR4KTsKKworQk9PTEVBTiBSVE1QQ2hlY2tESENQRnJhbWUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUE5ESVNfUEFDS0VUCXBQYWNrZXQpOworCisKK0JPT0xFQU4gUlRNUENoZWNrRXRoZXJUeXBlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBORElTX1BBQ0tFVAlwUGFja2V0KTsKKworCitWT0lEIFJUTVBDY2tCYnBUdW5pbmcoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVUlOVAkJCVR4UmF0ZSk7CisKKy8vCisvLyBQcml2YXRlIHJvdXRpbmVzIGluIHJ0bXBfd2VwLmMKKy8vCitWT0lEIFJUTVBJbml0V2VwRW5naW5lKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBQVUNIQVIgICAgICAgICAgcEtleSwKKwlJTiAgVUNIQVIgICAgICAgICAgIEtleUlkLAorCUlOICBVQ0hBUiAgICAgICAgICAgS2V5TGVuLAorCUlOICBQVUNIQVIgICAgICAgICAgcERlc3QpOworCitWT0lEIFJUTVBFbmNyeXB0RGF0YSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBTcmMsCisJSU4gIFBVQ0hBUiAgICAgICAgICBwRGVzdCwKKwlJTiAgVUlOVCAgICAgICAgICAgIExlbik7CisKK0JPT0xFQU4JUlRNUERlY3J5cHREYXRhKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCisJSU4JUFVDSEFSCQkJcFNyYywKKwlJTglVSU5UCQkJTGVuLAorCUlOCVVJTlQJCQlpZHgpOworCitCT09MRUFOCVJUTVBTb2Z0RGVjcnlwdFdFUCgKKwlJTiBQUlRNUF9BREFQVEVSIAlwQWQsCisJSU4gUFVDSEFSCQkJcERhdGEsCisJSU4gVUxPTkcJCQlEYXRhQnl0ZUNudCwKKwlJTiBQQ0lQSEVSX0tFWQkJcEdyb3VwS2V5KTsKKworVk9JRCBSVE1QU2V0SUNWKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBQVUNIQVIgICAgICAgICAgcERlc3QpOworCitWT0lEIEFSQ0ZPVVJfSU5JVCgKKwlJTiAgUEFSQ0ZPVVJDT05URVhUIEN0eCwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBLZXksCisJSU4gIFVJTlQgICAgICAgICAgICBLZXlMZW4pOworCitVQ0hBUiAgIEFSQ0ZPVVJfQllURSgKKwlJTiAgUEFSQ0ZPVVJDT05URVhUICAgICBDdHgpOworCitWT0lEIEFSQ0ZPVVJfREVDUllQVCgKKwlJTiAgUEFSQ0ZPVVJDT05URVhUIEN0eCwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBEZXN0LAorCUlOICBQVUNIQVIgICAgICAgICAgcFNyYywKKwlJTiAgVUlOVCAgICAgICAgICAgIExlbik7CisKK1ZPSUQgQVJDRk9VUl9FTkNSWVBUKAorCUlOICBQQVJDRk9VUkNPTlRFWFQgQ3R4LAorCUlOICBQVUNIQVIgICAgICAgICAgcERlc3QsCisJSU4gIFBVQ0hBUiAgICAgICAgICBwU3JjLAorCUlOICBVSU5UICAgICAgICAgICAgTGVuKTsKKworVk9JRCBXUEFBUkNGT1VSX0VOQ1JZUFQoCisJSU4gIFBBUkNGT1VSQ09OVEVYVCBDdHgsCisJSU4gIFBVQ0hBUiAgICAgICAgICBwRGVzdCwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBTcmMsCisJSU4gIFVJTlQgICAgICAgICAgICBMZW4pOworCitVSU5UIFJUTVBfQ0FMQ19GQ1MzMigKKwlJTiAgVUlOVCAgIEZjcywKKwlJTiAgUFVDSEFSICBDcCwKKwlJTiAgSU5UICAgICBMZW4pOworCisvLworLy8gTUxNRSByb3V0aW5lcworLy8KKworLy8gQXNpYy9SRi9CQlAgcmVsYXRlZCBmdW5jdGlvbnMKKworVk9JRCBBc2ljQWRqdXN0VHhQb3dlcigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK1ZPSUQgCUFzaWNVcGRhdGVQcm90ZWN0KAorCUlOCQlQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiAJCVVTSE9SVAkJCU9wZXJhaW9uTW9kZSwKKwlJTiAJCVVDSEFSCQkJU2V0TWFzaywKKwlJTgkJQk9PTEVBTgkJCWJEaXNhYmxlQkdQcm90ZWN0LAorCUlOCQlCT09MRUFOCQkJYk5vbkdGRXhpc3QpOworCitWT0lEIEFzaWNTd2l0Y2hDaGFubmVsKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOCVVDSEFSCQkJQ2hhbm5lbCwKKwlJTglCT09MRUFOCQkJYlNjYW4pOworCitWT0lEIEFzaWNMb2NrQ2hhbm5lbCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVQ0hBUiBDaGFubmVsKSA7CisKK1ZPSUQgQXNpY0FudGVubmFTZWxlY3QoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFVDSEFSICAgICAgICAgICBDaGFubmVsKTsKKworVk9JRCBBc2ljQW50ZW5uYVNldHRpbmcoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JQUJHQkFORF9TVEFURQlCYW5kU3RhdGUpOworCitWT0lEIEFzaWNSZlR1bmluZ0V4ZWMoCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorVk9JRCBBc2ljU2xlZXBUaGVuQXV0b1dha2V1cCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgVVNIT1JUIFRidHROdW1Ub05leHRXYWtlVXApOworCitWT0lEIEFzaWNGb3JjZVNsZWVwKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKworVk9JRCBBc2ljRm9yY2VXYWtldXAoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gQk9PTEVBTiAgICBiRnJvbVR4KTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworVk9JRCBBc2ljU2V0QnNzaWQoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFBVQ0hBUiBwQnNzaWQpOworCitWT0lEIEFzaWNTZXRNY2FzdFdDKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKworI2lmIDAJLy8gcmVtb3ZlZCBieSBBbGJlcnRZCitWT0lEIEFzaWNTZXRCc3NpZFdDKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFBVQ0hBUiBwQnNzaWQpOworI2VuZGlmCisKK1ZPSUQgQXNpY0RlbFdjaWRUYWIoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVUNIQVIJV2NpZCk7CisKK1ZPSUQgQXNpY0VuYWJsZVJERygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK1ZPSUQgQXNpY0Rpc2FibGVSREcoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpOworCitWT0lEIEFzaWNEaXNhYmxlU3luYygKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK1ZPSUQgQXNpY0VuYWJsZUJzc1N5bmMoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitWT0lEIEFzaWNFbmFibGVJYnNzU3luYygKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK1ZPSUQgQXNpY1NldEVkY2FQYXJtKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFBFRENBX1BBUk0gICAgcEVkY2FQYXJtKTsKKworVk9JRCBBc2ljU2V0U2xvdFRpbWUoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gQk9PTEVBTiBiVXNlU2hvcnRTbG90VGltZSk7CisKKyNpZiAwCitWT0lEIEFzaWNBZGRXY2lkQ2lwaGVyRW50cnkoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVUNIQVIJCSBXQ0lELAorCUlOIFVDSEFSCQkgQnNzSW5kZXgsCisJSU4gVUNIQVIJCSBLZXlUYWJsZSwKKwlJTiBVQ0hBUgkJIENpcGhlckFsZywKKwlJTiBQVUNIQVIJCSBwQWRkciwKKwlJTiBDSVBIRVJfS0VZCQkgKnBDaXBoZXJLZXkpOworI2VuZGlmCisKK1ZPSUQgQXNpY0FkZFNoYXJlZEtleUVudHJ5KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVDSEFSICAgICAgICAgQnNzSW5kZXgsCisJSU4gVUNIQVIgICAgICAgICBLZXlJZHgsCisJSU4gVUNIQVIgICAgICAgICBDaXBoZXJBbGcsCisJSU4gUFVDSEFSICAgICAgICBwS2V5LAorCUlOIFBVQ0hBUiAgICAgICAgcFR4TWljLAorCUlOIFBVQ0hBUiAgICAgICAgcFJ4TWljKTsKKworVk9JRCBBc2ljUmVtb3ZlU2hhcmVkS2V5RW50cnkoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVUNIQVIgICAgICAgICBCc3NJbmRleCwKKwlJTiBVQ0hBUiAgICAgICAgIEtleUlkeCk7CisKK1ZPSUQgQXNpY1VwZGF0ZVdDSURBdHRyaWJ1dGUoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVVNIT1JUCQlXQ0lELAorCUlOIFVDSEFSCQlCc3NJbmRleCwKKwlJTiBVQ0hBUiAgICAgICAgQ2lwaGVyQWxnLAorCUlOIEJPT0xFQU4JCWJVc2VQYWlyZXdpc2VLZXlUYWJsZSk7CisKK1ZPSUQgQXNpY1VwZGF0ZVdDSURJVkVJVigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVU0hPUlQJCVdDSUQsCisJSU4gVUxPTkcgICAgICAgIHVJViwKKwlJTiBVTE9ORyAgICAgICAgdUVJVik7CisKK1ZPSUQgQXNpY1VwZGF0ZVJ4V0NJRFRhYmxlKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVTSE9SVAkJV0NJRCwKKwlJTiBQVUNIQVIgICAgICAgIHBBZGRyKTsKKworVk9JRCBBc2ljQWRkS2V5RW50cnkoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVVNIT1JUCQlXQ0lELAorCUlOIFVDSEFSCQlCc3NJbmRleCwKKwlJTiBVQ0hBUgkJS2V5SWR4LAorCUlOIFBDSVBIRVJfS0VZCXBDaXBoZXJLZXksCisJSU4gQk9PTEVBTgkJYlVzZVBhaXJld2lzZUtleVRhYmxlLAorCUlOIEJPT0xFQU4JCWJUeEtleSk7CisKK1ZPSUQgQXNpY0FkZFBhaXJ3aXNlS2V5RW50cnkoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gUFVDSEFSICAgICAgICBwQWRkciwKKwlJTiBVQ0hBUgkJV0NJRCwKKwlJTiBDSVBIRVJfS0VZCQkgKnBDaXBoZXJLZXkpOworCitWT0lEIEFzaWNSZW1vdmVQYWlyd2lzZUtleUVudHJ5KAorCUlOIFBSVE1QX0FEQVBURVIgIHBBZCwKKwlJTiBVQ0hBUgkJIEJzc0lkeCwKKwlJTiBVQ0hBUgkJIFdjaWQpOworCitCT09MRUFOIEFzaWNTZW5kQ29tbWFuZFRvTWN1KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVDSEFSICAgICAgICAgQ29tbWFuZCwKKwlJTiBVQ0hBUiAgICAgICAgIFRva2VuLAorCUlOIFVDSEFSICAgICAgICAgQXJnMCwKKwlJTiBVQ0hBUiAgICAgICAgIEFyZzEpOworCisKK1ZPSUQgTWFjQWRkclJhbmRvbUJzc2lkKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCU9VVCBQVUNIQVIgcEFkZHIpOworCitWT0lEIE1ndE1hY0hlYWRlckluaXQoCisJSU4gIFBSVE1QX0FEQVBURVIgICAgIHBBZCwKKwlJTiBPVVQgUEhFQURFUl84MDJfMTEgcEhkcjgwMjExLAorCUlOIFVDSEFSIFN1YlR5cGUsCisJSU4gVUNIQVIgVG9EcywKKwlJTiBQVUNIQVIgcERBLAorCUlOIFBVQ0hBUiBwQnNzaWQpOworCitWT0lEIE1sbWVSYWRpb09mZigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK1ZPSUQgTWxtZVJhZGlvT24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpOworCisKK1ZPSUQgQnNzVGFibGVJbml0KAorCUlOIEJTU19UQUJMRSAqVGFiKTsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorVk9JRCBCQVRhYmxlSW5pdCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBCQV9UQUJMRSAqVGFiKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworVUxPTkcgQnNzVGFibGVTZWFyY2goCisJSU4gQlNTX1RBQkxFICpUYWIsCisJSU4gUFVDSEFSIHBCc3NpZCwKKwlJTiBVQ0hBUiBDaGFubmVsKTsKKworVUxPTkcgQnNzU3NpZFRhYmxlU2VhcmNoKAorCUlOIEJTU19UQUJMRSAqVGFiLAorCUlOIFBVQ0hBUiAgICBwQnNzaWQsCisJSU4gUFVDSEFSICAgIHBTc2lkLAorCUlOIFVDSEFSICAgICBTc2lkTGVuLAorCUlOIFVDSEFSICAgICBDaGFubmVsKTsKKworVUxPTkcgQnNzVGFibGVTZWFyY2hXaXRoU1NJRCgKKwlJTiBCU1NfVEFCTEUgKlRhYiwKKwlJTiBQVUNIQVIgICAgQnNzaWQsCisJSU4gUFVDSEFSICAgIHBTc2lkLAorCUlOIFVDSEFSICAgICBTc2lkTGVuLAorCUlOIFVDSEFSICAgICBDaGFubmVsKTsKKworVk9JRCBCc3NUYWJsZURlbGV0ZUVudHJ5KAorCUlOIE9VVCAgUEJTU19UQUJMRSBwVGFiLAorCUlOICAgICAgUFVDSEFSIHBCc3NpZCwKKwlJTiAgICAgIFVDSEFSIENoYW5uZWwpOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCitWT0lEIEJBVGFibGVEZWxldGVPUklFbnRyeSgKKwlJTiBPVVQJUFJUTVBfQURBUFRFUiBwQWQsCisJSU4JCUJBX09SSV9FTlRSWQkqcEJBT1JJRW50cnkpOworCitWT0lEIEJBVGFibGVEZWxldGVSRUNFbnRyeSgKKwlJTiBPVVQJUFJUTVBfQURBUFRFUiBwQWQsCisJSU4JCUJBX1JFQ19FTlRSWQkqcEJBUkVDRW50cnkpOworCitWT0lEIEJBVGFibGVUZWFyT1JJRW50cnkoCisJSU4gT1VUCVBSVE1QX0FEQVBURVIgcEFkLAorCUlOCQlVQ0hBUiBUSUQsCisJSU4JCVVDSEFSIFdjaWQsCisJSU4JCUJPT0xFQU4gYkZvcmNlRGVsZXRlLAorCUlOCQlCT09MRUFOIEFMTCk7CisKK1ZPSUQgQkFUYWJsZVRlYXJSRUNFbnRyeSgKKwlJTiBPVVQJUFJUTVBfQURBUFRFUiBwQWQsCisJSU4JCVVDSEFSIFRJRCwKKwlJTgkJVUNIQVIgV0NJRCwKKwlJTgkJQk9PTEVBTiBBTEwpOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCitWT0lEICBCc3NFbnRyeVNldCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlPVVQgUEJTU19FTlRSWSBwQnNzLAorCUlOIFBVQ0hBUiBwQnNzaWQsCisJSU4gQ0hBUiBTc2lkW10sCisJSU4gVUNIQVIgU3NpZExlbiwKKwlJTiBVQ0hBUiBCc3NUeXBlLAorCUlOIFVTSE9SVCBCZWFjb25QZXJpb2QsCisJSU4gUENGX1BBUk0gQ2ZQYXJtLAorCUlOIFVTSE9SVCBBdGltV2luLAorCUlOIFVTSE9SVCBDYXBhYmlsaXR5SW5mbywKKwlJTiBVQ0hBUiBTdXBSYXRlW10sCisJSU4gVUNIQVIgU3VwUmF0ZUxlbiwKKwlJTiBVQ0hBUiBFeHRSYXRlW10sCisJSU4gVUNIQVIgRXh0UmF0ZUxlbiwKKwlJTiBIVF9DQVBBQklMSVRZX0lFICpwSHRDYXBhYmlsaXR5LAorCUlOIEFERF9IVF9JTkZPX0lFICpwQWRkSHRJbmZvLAkvLyBBUCBtaWdodCB1c2UgdGhpcyBhZGRpdGlvbmFsIGh0IGluZm8gSUUKKwlJTiBVQ0hBUgkJCUh0Q2FwYWJpbGl0eUxlbiwKKwlJTiBVQ0hBUgkJCUFkZEh0SW5mb0xlbiwKKwlJTiBVQ0hBUgkJCU5ld0V4dENoYW5PZmZzZXQsCisJSU4gVUNIQVIgQ2hhbm5lbCwKKwlJTiBDSEFSIFJzc2ksCisJSU4gTEFSR0VfSU5URUdFUiBUaW1lU3RhbXAsCisJSU4gVUNIQVIgQ2tpcEZsYWcsCisJSU4gUEVEQ0FfUEFSTSBwRWRjYVBhcm0sCisJSU4gUFFPU19DQVBBQklMSVRZX1BBUk0gcFFvc0NhcGFiaWxpdHksCisJSU4gUFFCU1NfTE9BRF9QQVJNIHBRYnNzTG9hZCwKKwlJTiBVU0hPUlQgTGVuZ3RoVklFLAorCUlOIFBORElTXzgwMl8xMV9WQVJJQUJMRV9JRXMgcFZJRSk7CisKK1VMT05HICBCc3NUYWJsZVNldEVudHJ5KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCU9VVCBQQlNTX1RBQkxFIHBUYWIsCisJSU4gUFVDSEFSIHBCc3NpZCwKKwlJTiBDSEFSIFNzaWRbXSwKKwlJTiBVQ0hBUiBTc2lkTGVuLAorCUlOIFVDSEFSIEJzc1R5cGUsCisJSU4gVVNIT1JUIEJlYWNvblBlcmlvZCwKKwlJTiBDRl9QQVJNICpDZlBhcm0sCisJSU4gVVNIT1JUIEF0aW1XaW4sCisJSU4gVVNIT1JUIENhcGFiaWxpdHlJbmZvLAorCUlOIFVDSEFSIFN1cFJhdGVbXSwKKwlJTiBVQ0hBUiBTdXBSYXRlTGVuLAorCUlOIFVDSEFSIEV4dFJhdGVbXSwKKwlJTiBVQ0hBUiBFeHRSYXRlTGVuLAorCUlOIEhUX0NBUEFCSUxJVFlfSUUgKnBIdENhcGFiaWxpdHksCisJSU4gQUREX0hUX0lORk9fSUUgKnBBZGRIdEluZm8sCS8vIEFQIG1pZ2h0IHVzZSB0aGlzIGFkZGl0aW9uYWwgaHQgaW5mbyBJRQorCUlOIFVDSEFSCQkJSHRDYXBhYmlsaXR5TGVuLAorCUlOIFVDSEFSCQkJQWRkSHRJbmZvTGVuLAorCUlOIFVDSEFSCQkJTmV3RXh0Q2hhbk9mZnNldCwKKwlJTiBVQ0hBUiBDaGFubmVsLAorCUlOIENIQVIgUnNzaSwKKwlJTiBMQVJHRV9JTlRFR0VSIFRpbWVTdGFtcCwKKwlJTiBVQ0hBUiBDa2lwRmxhZywKKwlJTiBQRURDQV9QQVJNIHBFZGNhUGFybSwKKwlJTiBQUU9TX0NBUEFCSUxJVFlfUEFSTSBwUW9zQ2FwYWJpbGl0eSwKKwlJTiBQUUJTU19MT0FEX1BBUk0gcFFic3NMb2FkLAorCUlOIFVTSE9SVCBMZW5ndGhWSUUsCisJSU4gUE5ESVNfODAyXzExX1ZBUklBQkxFX0lFcyBwVklFKTsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorVk9JRCBCQVRhYmxlSW5zZXJ0RW50cnkoCisgICAgSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4gVVNIT1JUIEFpZCwKKyAgICBJTiBVU0hPUlQJCVRpbWVPdXRWYWx1ZSwKKwlJTiBVU0hPUlQJCVN0YXJ0aW5nU2VxLAorICAgIElOIFVDSEFSIFRJRCwKKwlJTiBVQ0hBUiBCQVdpblNpemUsCisJSU4gVUNIQVIgT3JpZ2luYXRvclN0YXR1cywKKyAgICBJTiBCT09MRUFOIElzUmVjaXBpZW50KTsKKworI2lmZGVmIERPVDExTl9EUkFGVDMKK1ZPSUQgQnNzMjA0MENvZXhpc3RUaW1lT3V0KAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKKwlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMyk7CisKKworVk9JRCAgVHJpRXZlbnRJbml0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKTsKKworVUxPTkcgVHJpRXZlbnRUYWJsZVNldEVudHJ5KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVCBUUklHR0VSX0VWRU5UX1RBQiAqVGFiLAorCUlOIFBVQ0hBUiBwQnNzaWQsCisJSU4gSFRfQ0FQQUJJTElUWV9JRSAqcEh0Q2FwYWJpbGl0eSwKKwlJTiBVQ0hBUgkJCUh0Q2FwYWJpbGl0eUxlbiwKKwlJTiBVQ0hBUgkJCVJlZ0NsYXNzLAorCUlOIFVDSEFSIENoYW5uZWxObyk7CisKK1ZPSUQgVHJpRXZlbnRDb3VudGVyTWFpbnRlbmFuY2UoCisJSU4JUFJUTVBfQURBUFRFUglwQWQpOworI2VuZGlmIC8vIERPVDExTl9EUkFGVDMgLy8KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworVk9JRCBCc3NUYWJsZVNzaWRTb3J0KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCU9VVCBCU1NfVEFCTEUgKk91dFRhYiwKKwlJTiAgQ0hBUiBTc2lkW10sCisJSU4gIFVDSEFSIFNzaWRMZW4pOworCitWT0lEICBCc3NUYWJsZVNvcnRCeVJzc2koCisJSU4gT1VUIEJTU19UQUJMRSAqT3V0VGFiKTsKKworVk9JRCBCc3NDaXBoZXJQYXJzZSgKKwlJTiBPVVQgIFBCU1NfRU5UUlkgIHBCc3MpOworCitORElTX1NUQVRVUyAgTWxtZVF1ZXVlSW5pdCgKKwlJTiBNTE1FX1FVRVVFICpRdWV1ZSk7CisKK1ZPSUQgIE1sbWVRdWV1ZURlc3Ryb3koCisJSU4gTUxNRV9RVUVVRSAqUXVldWUpOworCitCT09MRUFOIE1sbWVFbnF1ZXVlKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVMT05HIE1hY2hpbmUsCisJSU4gVUxPTkcgTXNnVHlwZSwKKwlJTiBVTE9ORyBNc2dMZW4sCisJSU4gVk9JRCAqTXNnKTsKKworQk9PTEVBTiBNbG1lRW5xdWV1ZUZvclJlY3YoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gVUxPTkcgV2NpZCwKKwlJTiBVTE9ORyBUaW1lU3RhbXBIaWdoLAorCUlOIFVMT05HIFRpbWVTdGFtcExvdywKKwlJTiBVQ0hBUiBSc3NpMCwKKwlJTiBVQ0hBUiBSc3NpMSwKKwlJTiBVQ0hBUiBSc3NpMiwKKwlJTiBVTE9ORyBNc2dMZW4sCisJSU4gUFZPSUQgTXNnLAorCUlOIFVDSEFSIFNpZ25hbCk7CisKKworQk9PTEVBTiBNbG1lRGVxdWV1ZSgKKwlJTiBNTE1FX1FVRVVFICpRdWV1ZSwKKwlPVVQgTUxNRV9RVUVVRV9FTEVNICoqRWxlbSk7CisKK1ZPSUQgICAgTWxtZVJlc3RhcnRTdGF0ZU1hY2hpbmUoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitCT09MRUFOICBNbG1lUXVldWVFbXB0eSgKKwlJTiBNTE1FX1FVRVVFICpRdWV1ZSk7CisKK0JPT0xFQU4gIE1sbWVRdWV1ZUZ1bGwoCisJSU4gTUxNRV9RVUVVRSAqUXVldWUpOworCitCT09MRUFOICBNc2dUeXBlU3Vic3QoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gUEZSQU1FXzgwMl8xMSBwRnJhbWUsCisJT1VUIElOVCAqTWFjaGluZSwKKwlPVVQgSU5UICpNc2dUeXBlKTsKKworVk9JRCBTdGF0ZU1hY2hpbmVJbml0KAorCUlOIFNUQVRFX01BQ0hJTkUgKlNtLAorCUlOIFNUQVRFX01BQ0hJTkVfRlVOQyBUcmFuc1tdLAorCUlOIFVMT05HIFN0TnIsCisJSU4gVUxPTkcgTXNnTnIsCisJSU4gU1RBVEVfTUFDSElORV9GVU5DIERlZkZ1bmMsCisJSU4gVUxPTkcgSW5pdFN0YXRlLAorCUlOIFVMT05HIEJhc2UpOworCitWT0lEIFN0YXRlTWFjaGluZVNldEFjdGlvbigKKwlJTiBTVEFURV9NQUNISU5FICpTLAorCUlOIFVMT05HIFN0LAorCVVMT05HIE1zZywKKwlJTiBTVEFURV9NQUNISU5FX0ZVTkMgRik7CisKK1ZPSUQgU3RhdGVNYWNoaW5lUGVyZm9ybUFjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiBTVEFURV9NQUNISU5FICpTLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgRHJvcCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIEFzc29jU3RhdGVNYWNoaW5lSW5pdCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgU1RBVEVfTUFDSElORSAqU20sCisJT1VUIFNUQVRFX01BQ0hJTkVfRlVOQyBUcmFuc1tdKTsKKworVk9JRCBSZWFzc29jVGltZW91dCgKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCisJSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpOworCitWT0lEIEFzc29jVGltZW91dCgKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCisJSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpOworCitWT0lEIERpc2Fzc29jVGltZW91dCgKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCisJSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1ZPSUQgTWxtZURpc2Fzc29jUmVxQWN0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIE1sbWVBc3NvY1JlcUFjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBNbG1lUmVhc3NvY1JlcUFjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBNbG1lRGlzYXNzb2NSZXFBY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgUGVlckFzc29jUnNwQWN0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIFBlZXJSZWFzc29jUnNwQWN0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIFBlZXJEaXNhc3NvY0FjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBEaXNhc3NvY1RpbWVvdXRBY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgQXNzb2NUaW1lb3V0QWN0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEICBSZWFzc29jVGltZW91dEFjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCAgQ2xzM2VyckFjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgUFVDSEFSIHBBZGRyKTsKKworVk9JRCBTd2l0Y2hCZXR3ZWVuV2VwQW5kQ2tpcCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK1ZPSUQgIEludmFsaWRTdGF0ZVdoZW5Bc3NvYygKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCAgSW52YWxpZFN0YXRlV2hlblJlYXNzb2MoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgSW52YWxpZFN0YXRlV2hlbkRpc2Fzc29jaWF0ZSgKKwlJTiAgUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKKyNpZmRlZiBSVDI4NzAKK1ZPSUQgTWxtZUNudGxDb25maXJtKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVMT05HIE1zZ1R5cGUsCisJSU4gVVNIT1JUIE1zZyk7CisjZW5kaWYgLy8gUlQyODcwIC8vCisKK1ZPSUQgIENvbXBvc2VQc1BvbGwoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitWT0lEICBDb21wb3NlTnVsbEZyYW1lKAorCUlOICBQUlRNUF9BREFQVEVSIHBBZCk7CisKK1ZPSUQgIEFzc29jUG9zdFByb2MoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFBVQ0hBUiBwQWRkcjIsCisJSU4gIFVTSE9SVCBDYXBhYmlsaXR5SW5mbywKKwlJTiAgVVNIT1JUIEFpZCwKKwlJTiAgVUNIQVIgU3VwUmF0ZVtdLAorCUlOICBVQ0hBUiBTdXBSYXRlTGVuLAorCUlOICBVQ0hBUiBFeHRSYXRlW10sCisJSU4gIFVDSEFSIEV4dFJhdGVMZW4sCisJSU4gUEVEQ0FfUEFSTSBwRWRjYVBhcm0sCisJSU4gSFRfQ0FQQUJJTElUWV9JRQkJKnBIdENhcGFiaWxpdHksCisJSU4gIFVDSEFSIEh0Q2FwYWJpbGl0eUxlbiwKKwlJTiBBRERfSFRfSU5GT19JRQkJKnBBZGRIdEluZm8pOworCitWT0lEIEF1dGhTdGF0ZU1hY2hpbmVJbml0KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOIFBTVEFURV9NQUNISU5FIHNtLAorCU9VVCBTVEFURV9NQUNISU5FX0ZVTkMgVHJhbnNbXSk7CisKK1ZPSUQgQXV0aFRpbWVvdXQoCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKKworVk9JRCBNbG1lQXV0aFJlcUFjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBQZWVyQXV0aFJzcEF0U2VxMkFjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBQZWVyQXV0aFJzcEF0U2VxNEFjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBBdXRoVGltZW91dEFjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBDbHMyZXJyQWN0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBQVUNIQVIgcEFkZHIpOworCitWT0lEIE1sbWVEZWF1dGhSZXFBY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgSW52YWxpZFN0YXRlV2hlbkF1dGgoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1ZPSUQgQXV0aFJzcFN0YXRlTWFjaGluZUluaXQoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFBTVEFURV9NQUNISU5FIFNtLAorCUlOICBTVEFURV9NQUNISU5FX0ZVTkMgVHJhbnNbXSk7CisKK1ZPSUQgUGVlckRlYXV0aEFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIFBlZXJBdXRoU2ltcGxlUnNwR2VuQW5kU2VuZCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgUEhFQURFUl84MDJfMTEgIHBIZHI4MDIxMSwKKwlJTiAgVVNIT1JUIEFsZywKKwlJTiAgVVNIT1JUIFNlcSwKKwlJTiAgVVNIT1JUIFJlYXNvbiwKKwlJTiAgVVNIT1JUIFN0YXR1cyk7CisKKy8vCisvLyBQcml2YXRlIHJvdXRpbmVzIGluIGRscy5jCisvLworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCit2b2lkIERsc1N0YXRlTWFjaGluZUluaXQoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gU1RBVEVfTUFDSElORSAqU20sCisgICAgT1VUIFNUQVRFX01BQ0hJTkVfRlVOQyBUcmFuc1tdKTsKKworVk9JRCBNbG1lRGxzUmVxQWN0aW9uKAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgUGVlckRsc1JlcUFjdGlvbigKKyAgICBJTiBQUlRNUF9BREFQVEVSCXBBZCwKKyAgICBJTiBNTE1FX1FVRVVFX0VMRU0JKkVsZW0pOworCitWT0lEIFBlZXJEbHNSc3BBY3Rpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUglwQWQsCisgICAgSU4gTUxNRV9RVUVVRV9FTEVNCSpFbGVtKTsKKworVk9JRCBNbG1lRGxzVGVhckRvd25BY3Rpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBQZWVyRGxzVGVhckRvd25BY3Rpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUglwQWQsCisgICAgSU4gTUxNRV9RVUVVRV9FTEVNCSpFbGVtKTsKKworVk9JRCBSVE1QQ2hlY2tETFNUaW1lT3V0KAorCUlOIFBSVE1QX0FEQVBURVIJcEFkKTsKKworQk9PTEVBTiBSVE1QUmN2RnJhbWVETFNDaGVjaygKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiBQSEVBREVSXzgwMl8xMQlwSGVhZGVyLAorCUlOIFVMT05HCQkJTGVuLAorCUlOIFBSVDI4WFhfUlhEX1NUUlVDCXBSeEQpOworCitJTlQJUlRNUENoZWNrRExTRnJhbWUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4gIFBVQ0hBUiAgICAgICAgICBwREEpOworCitWT0lEIFJUTVBTZW5kRExTVGVhckRvd25GcmFtZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBEQSk7CisKK05ESVNfU1RBVFVTIFJUTVBTZW5kU1RBS2V5UmVxdWVzdCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlwREEpOworCitORElTX1NUQVRVUyBSVE1QU2VuZFNUQUtleUhhbmRTaGFrZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlwREEpOworCitWT0lEIERsc1RpbWVvdXRBY3Rpb24oCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKKworQk9PTEVBTiBNbG1lRGxzUmVxU2FuaXR5KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIFZPSUQgKk1zZywKKyAgICBJTiBVTE9ORyBNc2dMZW4sCisgICAgT1VUIFBSVF84MDJfMTFfRExTICpwRExTLAorICAgIE9VVCBQVVNIT1JUIHBSZWFzb24pOworCitJTlQgU2V0X0Rsc0VudHJ5SW5mb19EaXNwbGF5X1Byb2MoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gUFVDSEFSIGFyZyk7CisKK01BQ19UQUJMRV9FTlRSWSAqTWFjVGFibGVJbnNlcnREbHNFbnRyeSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgUFVDSEFSCXBBZGRyLAorCUlOICBVSU5UCURsc0VudHJ5SWR4KTsKKworQk9PTEVBTiBNYWNUYWJsZURlbGV0ZURsc0VudHJ5KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVTSE9SVCB3Y2lkLAorCUlOIFBVQ0hBUiBwQWRkcik7CisKK01BQ19UQUJMRV9FTlRSWSAqRGxzRW50cnlUYWJsZUxvb2t1cCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBQVUNIQVIJcEFkZHIsCisJSU4gQk9PTEVBTgliUmVzZXRJZGVsQ291bnQpOworCitNQUNfVEFCTEVfRU5UUlkgKkRsc0VudHJ5VGFibGVMb29rdXBCeVdjaWQoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVUNIQVIJd2NpZCwKKwlJTiBQVUNIQVIJcEFkZHIsCisJSU4gQk9PTEVBTgliUmVzZXRJZGVsQ291bnQpOworCitJTlQJU2V0X0Rsc0FkZEVudHJ5X1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UCVNldF9EbHNUZWFyRG93bkVudHJ5X1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorQk9PTEVBTiBQZWVyRGxzUmVxU2FuaXR5KAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIFZPSUQgKk1zZywKKyAgICBJTiBVTE9ORyBNc2dMZW4sCisgICAgT1VUIFBVQ0hBUiBwREEsCisgICAgT1VUIFBVQ0hBUiBwU0EsCisgICAgT1VUIFVTSE9SVCAqcENhcGFiaWxpdHlJbmZvLAorICAgIE9VVCBVU0hPUlQgKnBEbHNUaW1lb3V0LAorICAgIE9VVCBVQ0hBUiAqcFJhdGVzTGVuLAorICAgIE9VVCBVQ0hBUiBSYXRlc1tdLAorICAgIE9VVCBVQ0hBUiAqcEh0Q2FwYWJpbGl0eUxlbiwKKyAgICBPVVQgSFRfQ0FQQUJJTElUWV9JRSAqcEh0Q2FwYWJpbGl0eSk7CisKK0JPT0xFQU4gUGVlckRsc1JzcFNhbml0eSgKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBWT0lEICpNc2csCisgICAgSU4gVUxPTkcgTXNnTGVuLAorICAgIE9VVCBQVUNIQVIgcERBLAorICAgIE9VVCBQVUNIQVIgcFNBLAorICAgIE9VVCBVU0hPUlQgKnBDYXBhYmlsaXR5SW5mbywKKyAgICBPVVQgVVNIT1JUICpwU3RhdHVzLAorICAgIE9VVCBVQ0hBUiAqcFJhdGVzTGVuLAorICAgIE9VVCBVQ0hBUiBSYXRlc1tdLAorICAgIE9VVCBVQ0hBUiAqcEh0Q2FwYWJpbGl0eUxlbiwKKyAgICBPVVQgSFRfQ0FQQUJJTElUWV9JRSAqcEh0Q2FwYWJpbGl0eSk7CisKK0JPT0xFQU4gUGVlckRsc1RlYXJEb3duU2FuaXR5KAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIFZPSUQgKk1zZywKKyAgICBJTiBVTE9ORyBNc2dMZW4sCisgICAgT1VUIFBVQ0hBUiBwREEsCisgICAgT1VUIFBVQ0hBUiBwU0EsCisgICAgT1VUIFVTSE9SVCAqcFJlYXNvbik7CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitWT0lEIFN5bmNTdGF0ZU1hY2hpbmVJbml0KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBTVEFURV9NQUNISU5FICpTbSwKKwlPVVQgU1RBVEVfTUFDSElORV9GVU5DIFRyYW5zW10pOworCitWT0lEIEJlYWNvblRpbWVvdXQoCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKKworVk9JRCBTY2FuVGltZW91dCgKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCisJSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpOworCitWT0lEIE1sbWVTY2FuUmVxQWN0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIEludmFsaWRTdGF0ZVdoZW5TY2FuKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIEludmFsaWRTdGF0ZVdoZW5Kb2luKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIEludmFsaWRTdGF0ZVdoZW5TdGFydCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBQZWVyQmVhY29uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIEVucXVldWVQcm9iZVJlcXVlc3QoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpOworCitCT09MRUFOIFNjYW5SdW5uaW5nKAorCQlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1ZPSUQgTWxtZUNudGxJbml0KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBTVEFURV9NQUNISU5FICpTLAorCU9VVCBTVEFURV9NQUNISU5FX0ZVTkMgVHJhbnNbXSk7CisKK1ZPSUQgTWxtZUNudGxNYWNoaW5lUGVyZm9ybUFjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgU1RBVEVfTUFDSElORSAqUywKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBDbnRsSWRsZVByb2MoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgQ250bE9pZFNjYW5Qcm9jKAorCUlOICBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBDbnRsT2lkU3NpZFByb2MoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqIEVsZW0pOworCitWT0lEIENudGxPaWRSVEJzc2lkUHJvYygKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICogRWxlbSk7CisKK1ZPSUQgQ250bE1sbWVSb2FtaW5nUHJvYygKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICogRWxlbSk7CisKK1ZPSUQgQ250bFdhaXREaXNhc3NvY1Byb2MoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgQ250bFdhaXRKb2luUHJvYygKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBDbnRsV2FpdFJlYXNzb2NQcm9jKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIENudGxXYWl0U3RhcnRQcm9jKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIENudGxXYWl0QXV0aFByb2MoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgQ250bFdhaXRBdXRoUHJvYzIoCisJSU4gIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIENudGxXYWl0QXNzb2NQcm9jKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCitWT0lEIENudGxPaWRETFNTZXR1cFByb2MoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKworVk9JRCBMaW5rVXAoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFVDSEFSIEJzc1R5cGUpOworCitWT0lEIExpbmtEb3duKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBCT09MRUFOICAgICAgICAgSXNSZXFGcm9tQVApOworCitWT0lEIEl0ZXJhdGVPbkJzc1RhYigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK1ZPSUQgSXRlcmF0ZU9uQnNzVGFiMigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7OworCitWT0lEIEpvaW5QYXJtRmlsbCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgT1VUIE1MTUVfSk9JTl9SRVFfU1RSVUNUICpKb2luUmVxLAorCUlOICBVTE9ORyBCc3NJZHgpOworCitWT0lEIEFzc29jUGFybUZpbGwoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gT1VUIE1MTUVfQVNTT0NfUkVRX1NUUlVDVCAqQXNzb2NSZXEsCisJSU4gIFBVQ0hBUiBwQWRkciwKKwlJTiAgVVNIT1JUIENhcGFiaWxpdHlJbmZvLAorCUlOICBVTE9ORyBUaW1lb3V0LAorCUlOICBVU0hPUlQgTGlzdGVuSW50dik7CisKK1ZPSUQgU2NhblBhcm1GaWxsKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBPVVQgTUxNRV9TQ0FOX1JFUV9TVFJVQ1QgKlNjYW5SZXEsCisJSU4gIENIQVIgU3NpZFtdLAorCUlOICBVQ0hBUiBTc2lkTGVuLAorCUlOICBVQ0hBUiBCc3NUeXBlLAorCUlOICBVQ0hBUiBTY2FuVHlwZSk7CisKK1ZPSUQgRGlzYXNzb2NQYXJtRmlsbCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgT1VUIE1MTUVfRElTQVNTT0NfUkVRX1NUUlVDVCAqRGlzYXNzb2NSZXEsCisJSU4gIFBVQ0hBUiBwQWRkciwKKwlJTiAgVVNIT1JUIFJlYXNvbik7CisKK1ZPSUQgU3RhcnRQYXJtRmlsbCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgT1VUIE1MTUVfU1RBUlRfUkVRX1NUUlVDVCAqU3RhcnRSZXEsCisJSU4gIENIQVIgU3NpZFtdLAorCUlOICBVQ0hBUiBTc2lkTGVuKTsKKworVk9JRCBBdXRoUGFybUZpbGwoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE9VVCBNTE1FX0FVVEhfUkVRX1NUUlVDVCAqQXV0aFJlcSwKKwlJTiAgUFVDSEFSIHBBZGRyLAorCUlOICBVU0hPUlQgQWxnKTsKKworVk9JRCBFbnF1ZXVlUHNQb2xsKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworVk9JRCBFbnF1ZXVlQmVhY29uRnJhbWUoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitWT0lEIE1sbWVKb2luUmVxQWN0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIE1sbWVTY2FuUmVxQWN0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIE1sbWVTdGFydFJlcUFjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBTY2FuVGltZW91dEFjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBCZWFjb25UaW1lb3V0QXRKb2luQWN0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIFBlZXJCZWFjb25BdFNjYW5BY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgUGVlckJlYWNvbkF0Sm9pbkFjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBQZWVyQmVhY29uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIFBlZXJQcm9iZVJlcUFjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgU2Nhbk5leHRDaGFubmVsKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworVUxPTkcgTWFrZUlic3NCZWFjb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitWT0lEIENDWEFkamFjZW50QVBSZXBvcnQoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitCT09MRUFOIE1sbWVTY2FuUmVxU2FuaXR5KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBWT0lEICpNc2csCisJSU4gIFVMT05HIE1zZ0xlbiwKKwlPVVQgVUNIQVIgKkJzc1R5cGUsCisJT1VUIENIQVIgc3NpZFtdLAorCU9VVCBVQ0hBUiAqU3NpZExlbiwKKwlPVVQgVUNIQVIgKlNjYW5UeXBlKTsKKworQk9PTEVBTiBQZWVyQmVhY29uQW5kUHJvYmVSc3BTYW5pdHkoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFZPSUQgKk1zZywKKwlJTiAgVUxPTkcgTXNnTGVuLAorCUlOICBVQ0hBUiBNc2dDaGFubmVsLAorCU9VVCBQVUNIQVIgcEFkZHIyLAorCU9VVCBQVUNIQVIgcEJzc2lkLAorCU9VVCBDSEFSIFNzaWRbXSwKKwlPVVQgVUNIQVIgKnBTc2lkTGVuLAorCU9VVCBVQ0hBUiAqcEJzc1R5cGUsCisJT1VUIFVTSE9SVCAqcEJlYWNvblBlcmlvZCwKKwlPVVQgVUNIQVIgKnBDaGFubmVsLAorCU9VVCBVQ0hBUiAqcE5ld0NoYW5uZWwsCisJT1VUIExBUkdFX0lOVEVHRVIgKnBUaW1lc3RhbXAsCisJT1VUIENGX1BBUk0gKnBDZlBhcm0sCisJT1VUIFVTSE9SVCAqcEF0aW1XaW4sCisJT1VUIFVTSE9SVCAqcENhcGFiaWxpdHlJbmZvLAorCU9VVCBVQ0hBUiAqcEVycCwKKwlPVVQgVUNIQVIgKnBEdGltQ291bnQsCisJT1VUIFVDSEFSICpwRHRpbVBlcmlvZCwKKwlPVVQgVUNIQVIgKnBCY2FzdEZsYWcsCisJT1VUIFVDSEFSICpwTWVzc2FnZVRvTWUsCisJT1VUIFVDSEFSIFN1cFJhdGVbXSwKKwlPVVQgVUNIQVIgKnBTdXBSYXRlTGVuLAorCU9VVCBVQ0hBUiBFeHRSYXRlW10sCisJT1VUIFVDSEFSICpwRXh0UmF0ZUxlbiwKKwlPVVQJVUNIQVIgKnBDa2lwRmxhZywKKwlPVVQJVUNIQVIgKnBBaXJvbmV0Q2VsbFBvd2VyTGltaXQsCisJT1VUIFBFRENBX1BBUk0gICAgICAgcEVkY2FQYXJtLAorCU9VVCBQUUJTU19MT0FEX1BBUk0gIHBRYnNzTG9hZCwKKwlPVVQgUFFPU19DQVBBQklMSVRZX1BBUk0gcFFvc0NhcGFiaWxpdHksCisJT1VUIFVMT05HICpwUmFsaW5rSWUsCisJT1VUIFVDSEFSCQkgKnBIdENhcGFiaWxpdHlMZW4sCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJT1VUIFVDSEFSCQkgKnBQcmVOSHRDYXBhYmlsaXR5TGVuLAorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCU9VVCBIVF9DQVBBQklMSVRZX0lFICpwSHRDYXBhYmlsaXR5LAorCU9VVCBVQ0hBUgkJICpBZGRIdEluZm9MZW4sCisJT1VUIEFERF9IVF9JTkZPX0lFICpBZGRIdEluZm8sCisJT1VUIFVDSEFSICpOZXdFeHRDaGFubmVsLAorCU9VVCBVU0hPUlQgKkxlbmd0aFZJRSwKKwlPVVQgUE5ESVNfODAyXzExX1ZBUklBQkxFX0lFcyBwVklFKTsKKworQk9PTEVBTiBQZWVyQWRkQkFSZXFBY3Rpb25TYW5pdHkoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gVk9JRCAqcE1zZywKKyAgICBJTiBVTE9ORyBNc2dMZW4sCisJT1VUIFBVQ0hBUiBwQWRkcjIpOworCitCT09MRUFOIFBlZXJBZGRCQVJzcEFjdGlvblNhbml0eSgKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBWT0lEICpwTXNnLAorICAgIElOIFVMT05HIE1zZ0xlbik7CisKK0JPT0xFQU4gUGVlckRlbEJBQWN0aW9uU2FuaXR5KAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIFVDSEFSIFdjaWQsCisgICAgSU4gVk9JRCAqcE1zZywKKyAgICBJTiBVTE9ORyBNc2dMZW4pOworCitCT09MRUFOIE1sbWVBc3NvY1JlcVNhbml0eSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgVk9JRCAqTXNnLAorCUlOICBVTE9ORyBNc2dMZW4sCisJT1VUIFBVQ0hBUiBwQXBBZGRyLAorCU9VVCBVU0hPUlQgKkNhcGFiaWxpdHlJbmZvLAorCU9VVCBVTE9ORyAqVGltZW91dCwKKwlPVVQgVVNIT1JUICpMaXN0ZW5JbnR2KTsKKworQk9PTEVBTiBNbG1lQXV0aFJlcVNhbml0eSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgVk9JRCAqTXNnLAorCUlOICBVTE9ORyBNc2dMZW4sCisJT1VUIFBVQ0hBUiBwQWRkciwKKwlPVVQgVUxPTkcgKlRpbWVvdXQsCisJT1VUIFVTSE9SVCAqQWxnKTsKKworQk9PTEVBTiBNbG1lU3RhcnRSZXFTYW5pdHkoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFZPSUQgKk1zZywKKwlJTiAgVUxPTkcgTXNnTGVuLAorCU9VVCBDSEFSIFNzaWRbXSwKKwlPVVQgVUNIQVIgKlNzaWRsZW4pOworCitCT09MRUFOIFBlZXJBdXRoU2FuaXR5KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBWT0lEICpNc2csCisJSU4gIFVMT05HIE1zZ0xlbiwKKwlPVVQgUFVDSEFSIHBBZGRyLAorCU9VVCBVU0hPUlQgKkFsZywKKwlPVVQgVVNIT1JUICpTZXEsCisJT1VUIFVTSE9SVCAqU3RhdHVzLAorCU9VVCBDSEFSIENobGdUZXh0W10pOworCitCT09MRUFOIFBlZXJBc3NvY1JzcFNhbml0eSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKyAgICBJTiBWT0lEICpwTXNnLAorCUlOICBVTE9ORyBNc2dMZW4sCisJT1VUIFBVQ0hBUiBwQWRkcjIsCisJT1VUIFVTSE9SVCAqcENhcGFiaWxpdHlJbmZvLAorCU9VVCBVU0hPUlQgKnBTdGF0dXMsCisJT1VUIFVTSE9SVCAqcEFpZCwKKwlPVVQgVUNIQVIgU3VwUmF0ZVtdLAorCU9VVCBVQ0hBUiAqcFN1cFJhdGVMZW4sCisJT1VUIFVDSEFSIEV4dFJhdGVbXSwKKwlPVVQgVUNIQVIgKnBFeHRSYXRlTGVuLAorICAgIE9VVCBIVF9DQVBBQklMSVRZX0lFCQkqcEh0Q2FwYWJpbGl0eSwKKyAgICBPVVQgQUREX0hUX0lORk9fSUUJCSpwQWRkSHRJbmZvLAkvLyBBUCBtaWdodCB1c2UgdGhpcyBhZGRpdGlvbmFsIGh0IGluZm8gSUUKKyAgICBPVVQgVUNIQVIJCQkqcEh0Q2FwYWJpbGl0eUxlbiwKKyAgICBPVVQgVUNIQVIJCQkqcEFkZEh0SW5mb0xlbiwKKyAgICBPVVQgVUNIQVIJCQkqcE5ld0V4dENoYW5uZWxPZmZzZXQsCisJT1VUIFBFRENBX1BBUk0gcEVkY2FQYXJtLAorCU9VVCBVQ0hBUiAqcENraXBGbGFnKTsKKworQk9PTEVBTiBQZWVyRGlzYXNzb2NTYW5pdHkoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFZPSUQgKk1zZywKKwlJTiAgVUxPTkcgTXNnTGVuLAorCU9VVCBQVUNIQVIgcEFkZHIyLAorCU9VVCBVU0hPUlQgKlJlYXNvbik7CisKK0JPT0xFQU4gUGVlcldwYU1lc3NhZ2VTYW5pdHkoCisgICAgSU4gCVBSVE1QX0FEQVBURVIgCQlwQWQsCisgICAgSU4gCVBFQVBPTF9QQUNLRVQgCQlwTXNnLAorICAgIElOIAlVTE9ORyAJCQkJTXNnTGVuLAorICAgIElOIAlVQ0hBUgkJCQlNc2dUeXBlLAorICAgIElOIAlNQUNfVEFCTEVfRU5UUlkgIAkqcEVudHJ5KTsKKworQk9PTEVBTiBQZWVyRGVhdXRoU2FuaXR5KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBWT0lEICpNc2csCisJSU4gIFVMT05HIE1zZ0xlbiwKKwlPVVQgUFVDSEFSIHBBZGRyMiwKKwlPVVQgVVNIT1JUICpSZWFzb24pOworCitCT09MRUFOIFBlZXJQcm9iZVJlcVNhbml0eSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgVk9JRCAqTXNnLAorCUlOICBVTE9ORyBNc2dMZW4sCisJT1VUIFBVQ0hBUiBwQWRkcjIsCisJT1VUIENIQVIgU3NpZFtdLAorCU9VVCBVQ0hBUiAqcFNzaWRMZW4pOworCitCT09MRUFOIEdldFRpbUJpdCgKKwlJTiAgQ0hBUiAqUHRyLAorCUlOICBVU0hPUlQgQWlkLAorCU9VVCBVQ0hBUiAqVGltTGVuLAorCU9VVCBVQ0hBUiAqQmNhc3RGbGFnLAorCU9VVCBVQ0hBUiAqRHRpbUNvdW50LAorCU9VVCBVQ0hBUiAqRHRpbVBlcmlvZCwKKwlPVVQgVUNIQVIgKk1lc3NhZ2VUb01lKTsKKworVUNIQVIgQ2hhbm5lbFNhbml0eSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVQ0hBUiBjaGFubmVsKTsKKworTkRJU184MDJfMTFfTkVUV09SS19UWVBFIE5ldHdvcmtUeXBlSW5Vc2VTYW5pdHkoCisJSU4gUEJTU19FTlRSWSBwQnNzKTsKKworI2lmIDAJLy8gSXQncyBvbWl0dGVkCitORElTX1NUQVRVUwlSVE1QV2VwS2V5U2FuaXR5KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCisJSU4JUFZPSUQJCQlwQnVmKTsKKyNlbmRpZgorCitCT09MRUFOIE1sbWVEZWxCQVJlcVNhbml0eSgKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBWT0lEICpNc2csCisgICAgSU4gVUxPTkcgTXNnTGVuKTsKKworQk9PTEVBTiBNbG1lQWRkQkFSZXFTYW5pdHkoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gVk9JRCAqTXNnLAorICAgIElOIFVMT05HIE1zZ0xlbiwKKyAgICBPVVQgUFVDSEFSIHBBZGRyMik7CisKK1VMT05HIE1ha2VPdXRnb2luZ0ZyYW1lKAorCU9VVCBDSEFSICpCdWZmZXIsCisJT1VUIFVMT05HICpMZW5ndGgsIC4uLik7CisKK1ZPSUQgIExmc3JJbml0KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBVTE9ORyBTZWVkKTsKKworVUNIQVIgUmFuZG9tQnl0ZSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK1ZPSUQgQXNpY1VwZGF0ZUF1dG9GYWxsQmFja1RhYmxlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCXBUeFJhdGUpOworCitWT0lEICBNbG1lUGVyaW9kaWNFeGVjKAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKKwlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMyk7CisKK1ZPSUQgTGlua0Rvd25FeGVjKAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKKwlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMyk7CisKK1ZPSUQgTGlua1VwRXhlYygKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCisJSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpOworCitWT0lEIFNUQU1sbWVQZXJpb2RpY0V4ZWMoCisJUFJUTVBfQURBUFRFUiBwQWQpOworCitWT0lEIE1sbWVBdXRvU2NhbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK1ZPSUQgTWxtZUF1dG9SZWNvbm5lY3RMYXN0U1NJRCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK0JPT0xFQU4gTWxtZVZhbGlkYXRlU1NJRCgKKwlJTiBQVUNIQVIgcFNzaWQsCisJSU4gVUNIQVIgIFNzaWRMZW4pOworCitWT0lEIE1sbWVDaGVja0ZvclJvYW1pbmcoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVUxPTkcgICAgTm93MzIpOworCitWT0lEIE1sbWVDaGVja0ZvckZhc3RSb2FtaW5nKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBVTE9ORyAgICAgICAgICAgTm93KTsKKworVk9JRCBNbG1lRHluYW1pY1R4UmF0ZVN3aXRjaGluZygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK1ZPSUQgTWxtZVNldFR4UmF0ZSgKKwlJTiBQUlRNUF9BREFQVEVSCQlwQWQsCisJSU4gUE1BQ19UQUJMRV9FTlRSWQkJcEVudHJ5LAorCUlOIFBSVE1QX1RYX1JBVEVfU1dJVENICXBUeFJhdGUpOworCitWT0lEIE1sbWVTZWxlY3RUeFJhdGVUYWJsZSgKKwlJTiBQUlRNUF9BREFQVEVSCQlwQWQsCisJSU4gUE1BQ19UQUJMRV9FTlRSWQkJcEVudHJ5LAorCUlOIFBVQ0hBUgkJCQkqcHBUYWJsZSwKKwlJTiBQVUNIQVIJCQkJcFRhYmxlU2l6ZSwKKwlJTiBQVUNIQVIJCQkJcEluaXRUeFJhdGVJZHgpOworCitWT0lEIE1sbWVDYWxjdWxhdGVDaGFubmVsUXVhbGl0eSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVTE9ORyBOb3cpOworCitWT0lEIE1sbWVDaGVja1BzbUNoYW5nZSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVTE9ORyAgICBOb3czMik7CisKK1ZPSUQgTWxtZVNldFBzbUJpdCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVU0hPUlQgcHNtKTsKKworVk9JRCBNbG1lU2V0VHhQcmVhbWJsZSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVU0hPUlQgVHhQcmVhbWJsZSk7CisKK1ZPSUQgVXBkYXRlQmFzaWNSYXRlQml0bWFwKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKTsKKworVk9JRCBNbG1lVXBkYXRlVHhSYXRlcygKKwlJTiBQUlRNUF9BREFQVEVSIAlwQWQsCisJSU4gCUJPT0xFQU4JCSAJYkxpbmtVcCwKKwlJTglVQ0hBUgkJCWFwaWR4KTsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorVk9JRCBNbG1lVXBkYXRlSHRUeFJhdGVzKAorCUlOIFBSVE1QX0FEQVBURVIgCQlwQWQsCisJSU4JVUNIQVIJCQkJYXBpZHgpOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCitWT0lEICAgIFJUTVBDaGVja1JhdGVzKAorCUlOICAgICAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiBPVVQgIFVDSEFSICAgICAgICAgICBTdXBSYXRlW10sCisJSU4gT1VUICBVQ0hBUiAgICAgICAgICAgKlN1cFJhdGVMZW4pOworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCitCT09MRUFOIFJUTVBDaGVja0NoYW5uZWwoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVUNIQVIJCUNlbnRyYWxDaGFubmVsLAorCUlOIFVDSEFSCQlDaGFubmVsKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworQk9PTEVBTiAJUlRNUENoZWNrSHQoCisJSU4JCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCQlVQ0hBUglXY2lkLAorCUlOIE9VVAlIVF9DQVBBQklMSVRZX0lFCQkJKnBIdENhcGFiaWxpdHksCisJSU4gT1VUCUFERF9IVF9JTkZPX0lFCQkJKnBBZGRIdEluZm8pOworCitWT0lEIFN0YVF1aWNrUmVzcG9uZUZvclJhdGVVcEV4ZWMoCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKKworVk9JRCBBc2ljQmJwVHVuaW5nMSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK1ZPSUQgQXNpY0JicFR1bmluZzIoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpOworCitWT0lEIFJUTVBVcGRhdGVNbG1lUmF0ZSgKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCk7CisKK0NIQVIgUlRNUE1heFJzc2koCisJSU4gUFJUTVBfQURBUFRFUglwQWQsCisJSU4gQ0hBUgkJCQlSc3NpMCwKKwlJTiBDSEFSCQkJCVJzc2kxLAorCUlOIENIQVIJCQkJUnNzaTIpOworCitWT0lEIEFzaWNFdmFsdWF0ZVJ4QW50KAorCUlOIFBSVE1QX0FEQVBURVIJcEFkKTsKKworVk9JRCBBc2ljUnhBbnRFdmFsVGltZW91dCgKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCisJSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpOworCitWT0lEIEFQU0RQZXJpb2RpY0V4ZWMoCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKKworQk9PTEVBTiBSVE1QQ2hlY2tFbnRyeUVuYWJsZUF1dG9SYXRlU3dpdGNoKAorCUlOIFBSVE1QX0FEQVBURVIgICAgcEFkLAorCUlOIFBNQUNfVEFCTEVfRU5UUlkJcEVudHJ5KTsKKworVUNIQVIgUlRNUFN0YUZpeGVkVHhNb2RlKAorCUlOIFBSVE1QX0FEQVBURVIgICAgcEFkLAorCUlOIFBNQUNfVEFCTEVfRU5UUlkJcEVudHJ5KTsKKworVk9JRCBSVE1QVXBkYXRlTGVnYWN5VHhTZXR0aW5nKAorCQlVQ0hBUgkJCQlmaXhlZF90eF9tb2RlLAorCQlQTUFDX1RBQkxFX0VOVFJZCXBFbnRyeSk7CisKK0JPT0xFQU4gUlRNUEF1dG9SYXRlU3dpdGNoQ2hlY2soCisJSU4gUFJUTVBfQURBUFRFUiAgICBwQWQpOworCitORElTX1NUQVRVUyBNbG1lSW5pdCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK1ZPSUQgTWxtZUhhbmRsZXIoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitWT0lEIE1sbWVIYWx0KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworVk9JRCBNbG1lUmVzZXRSYWxpbmtDb3VudGVycygKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK1ZPSUQgQnVpbGRDaGFubmVsTGlzdCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK1VDSEFSIEZpcnN0Q2hhbm5lbCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK1VDSEFSIE5leHRDaGFubmVsKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBVQ0hBUiBjaGFubmVsKTsKKworVk9JRCBDaGFuZ2VUb0NlbGxQb3dlckxpbWl0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVDSEFSICAgICAgICAgQWlyb25ldENlbGxQb3dlckxpbWl0KTsKKworVk9JRCBSYWlzZUNsb2NrKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBVSU5UMzIgKngpOworCitWT0lEIExvd2VyQ2xvY2soCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFVJTlQzMiAqeCk7CisKK1VTSE9SVCBTaGlmdEluQml0cygKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK1ZPSUQgU2hpZnRPdXRCaXRzKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBVU0hPUlQgZGF0YSwKKwlJTiAgVVNIT1JUIGNvdW50KTsKKworVk9JRCBFRXByb21DbGVhbnVwKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworVk9JRCBFV0RTKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworVk9JRCBFV0VOKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworVVNIT1JUIFJUTVBfRUVQUk9NX1JFQUQxNigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgVVNIT1JUIE9mZnNldCk7CisKK1ZPSUQgUlRNUF9FRVBST01fV1JJVEUxNigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgVVNIT1JUIE9mZnNldCwKKwlJTiAgVVNIT1JUIERhdGEpOworCisvLworLy8gUHJvdG90eXBlcyBvZiBmdW5jdGlvbiBkZWZpbml0aW9uIGluIHJ0bXBfdGtpcC5jCisvLworVk9JRCAgICBSVE1QSW5pdFRraXBFbmdpbmUoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFBVQ0hBUiAgICAgICAgICBwVEtleSwKKwlJTiAgVUNIQVIgICAgICAgICAgIEtleUlkLAorCUlOICBQVUNIQVIgICAgICAgICAgcFRBLAorCUlOICBQVUNIQVIgICAgICAgICAgcE1JQ0tleSwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBUU0MsCisJT1VUIFBVTE9ORyAgICAgICAgICBwSVYxNiwKKwlPVVQgUFVMT05HICAgICAgICAgIHBJVjMyKTsKKworVk9JRCAgICBSVE1QSW5pdE1JQ0VuZ2luZSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBLZXksCisJSU4gIFBVQ0hBUiAgICAgICAgICBwREEsCisJSU4gIFBVQ0hBUiAgICAgICAgICBwU0EsCisJSU4gIFVDSEFSICAgICAgICAgICBVc2VyUHJpb3JpdHksCisJSU4gIFBVQ0hBUiAgICAgICAgICBwTUlDS2V5KTsKKworQk9PTEVBTiBSVE1QVGtpcENvbXBhcmVNSUNWYWx1ZSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBTcmMsCisJSU4gIFBVQ0hBUiAgICAgICAgICBwREEsCisJSU4gIFBVQ0hBUiAgICAgICAgICBwU0EsCisJSU4gIFBVQ0hBUiAgICAgICAgICBwTUlDS2V5LAorCUlOCVVDSEFSCQkJVXNlclByaW9yaXR5LAorCUlOICBVSU5UICAgICAgICAgICAgTGVuKTsKKworVk9JRCAgICBSVE1QQ2FsY3VsYXRlTUlDVmFsdWUoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFBORElTX1BBQ0tFVCAgICBwUGFja2V0LAorCUlOICBQVUNIQVIgICAgICAgICAgcEVuY2FwLAorCUlOICBQQ0lQSEVSX0tFWSAgICAgcEtleSwKKwlJTglVQ0hBUgkJCWFwaWR4KTsKKworQk9PTEVBTiBSVE1QVGtpcENvbXBhcmVNSUNWYWx1ZVdpdGhMTEMoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFBVQ0hBUiAgICAgICAgICBwTExDLAorCUlOICBQVUNIQVIgICAgICAgICAgcFNyYywKKwlJTiAgUFVDSEFSICAgICAgICAgIHBEQSwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBTQSwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBNSUNLZXksCisJSU4gIFVJTlQgICAgICAgICAgICBMZW4pOworCitWT0lEICAgIFJUTVBUa2lwQXBwZW5kQnl0ZSgKKwlJTiAgUFRLSVBfS0VZX0lORk8gIHBUa2lwLAorCUlOICBVQ0hBUiAgICAgICAgICAgdUNoYXIpOworCitWT0lEICAgIFJUTVBUa2lwQXBwZW5kKAorCUlOICBQVEtJUF9LRVlfSU5GTyAgcFRraXAsCisJSU4gIFBVQ0hBUiAgICAgICAgICBwU3JjLAorCUlOICBVSU5UICAgICAgICAgICAgbkJ5dGVzKTsKKworVk9JRCAgICBSVE1QVGtpcEdldE1JQygKKwlJTiAgUFRLSVBfS0VZX0lORk8gIHBUa2lwKTsKKworQk9PTEVBTiBSVE1QU29mdERlY3J5cHRUS0lQKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFBVQ0hBUglwRGF0YSwKKwlJTiBVTE9ORwlEYXRhQnl0ZUNudCwKKwlJTiBVQ0hBUiAgICBVc2VyUHJpb3JpdHksCisJSU4gUENJUEhFUl9LRVkJcFdwYUtleSk7CisKK0JPT0xFQU4gUlRNUFNvZnREZWNyeXB0QUVTKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFBVQ0hBUglwRGF0YSwKKwlJTiBVTE9ORwlEYXRhQnl0ZUNudCwKKwlJTiBQQ0lQSEVSX0tFWQlwV3BhS2V5KTsKKworI2lmIDAJLy8gcmVtb3ZlZCBieSBBbGJlcnRZCitORElTX1NUQVRVUyBSVE1QV1BBQWRkS2V5UHJvYygKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgUFZPSUQgICAgICAgICAgIHBCdWYpOworI2VuZGlmCisKKy8vCisvLyBQcm90b3R5cGVzIG9mIGZ1bmN0aW9uIGRlZmluaXRpb24gaW4gY21tX2luZm8uYworLy8KK05ESVNfU1RBVFVTIFJUTVBXUEFSZW1vdmVLZXlQcm9jKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBQVk9JRCAgICAgICAgICAgcEJ1Zik7CisKK1ZPSUQgICAgUlRNUFdQQVJlbW92ZUFsbEtleXMoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitCT09MRUFOIFJUTVBDaGVja1N0clByaW50QWJsZSgKKyAgICBJTiAgQ0hBUiAqcEluUHV0U3RyLAorICAgIElOICBVQ0hBUiBzdHJMZW4pOworCitWT0lEICAgIFJUTVBTZXRQaHlNb2RlKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBVTE9ORyBwaHltb2RlKTsKKworVk9JRAlSVE1QVXBkYXRlSFRJRSgKKwlJTglSVF9IVF9DQVBBQklMSVRZCSpwUnRIdCwKKwlJTgkJVUNIQVIJCQkJKnBNY3NTZXQsCisJT1VUCQlIVF9DQVBBQklMSVRZX0lFICpwSHRDYXBhYmlsaXR5LAorCU9VVAkJQUREX0hUX0lORk9fSUUJCSpwQWRkSHRJbmZvKTsKKworVk9JRAlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVDSEFSCQkJQnNzSWR4LAorCUlOIAlVQ0hBUgkJIAlLZXlJZHgsCisJSU4gCVVDSEFSCQkgCUNpcGhlckFsZywKKwlJTiAJTUFDX1RBQkxFX0VOVFJZICpwRW50cnkpOworCitDSEFSICpHZXRFbmNyeXB0VHlwZSgKKwlDSEFSIGVuYyk7CisKK0NIQVIgKkdldEF1dGhNb2RlKAorCUNIQVIgYXV0aCk7CisKK1ZPSUQgUlRNUElvY3RsR2V0U2l0ZVN1cnZleSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAorCUlOCXN0cnVjdCBpd3JlcQkqd3JxKTsKKworVk9JRCBSVE1QSW9jdGxHZXRNYWNUYWJsZSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBzdHJ1Y3QgaXdyZXEgKndycSk7CisKK1ZPSUQgUlRNUEluZGljYXRlV1BBMlN0YXR1cygKKwlJTiAgUFJUTVBfQURBUFRFUiAgcEFkYXB0ZXIpOworCitWT0lECVJUTVBPUE1vZGVTd2l0Y2hpbmcoCisJSU4JUFJUTVBfQURBUFRFUglwQWQpOworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCitWT0lEICAgIFJUTVBBZGRCU1NJRENpcGhlcigKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTglVQ0hBUglBaWQsCisgICAgSU4gIFBORElTXzgwMl8xMV9LRVkgICAgcEtleSwKKyAgICBJTiAgVUNIQVIgICBDaXBoZXJBbGcpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCitWT0lECVJUTVBTZXRIVCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglPSURfU0VUX0hUX1BIWU1PREUgKnBIVFBoeU1vZGUpOworCitWT0lECVJUTVBTZXRJbmRpdmlkdWFsSFQoCisJSU4JUFJUTVBfQURBUFRFUgkJcEFkLAorCUlOCVVDSEFSCQkJCWFwaWR4KTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworVk9JRCBSVE1QU2VuZFdpcmVsZXNzRXZlbnQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVVNIT1JUCQkJRXZlbnRfZmxhZywKKwlJTglQVUNIQVIgCQkJcEFkZHIsCisJSU4gIFVDSEFSCQkJQnNzSWR4LAorCUlOCUNIQVIJCQlSc3NpKTsKKworVk9JRAlOSUNVcGRhdGVDbnRsQ291bnRlcnMoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUEhFQURFUl84MDJfMTEJcEhlYWRlciwKKwlJTiAgICBVQ0hBUgkJCVN1YlR5cGUsCisJSU4JUFJYV0lfU1RSVUMgCXBSeFdJKTsKKy8vCisvLyBwcm90b3R5cGUgaW4gd3BhLmMKKy8vCitCT09MRUFOIFdwYU1zZ1R5cGVTdWJzdCgKKwlJTiAgVUNIQVIgICBFQVBUeXBlLAorCU9VVCBJTlQJCSpNc2dUeXBlKTsKKworVk9JRCBXcGFQc2tTdGF0ZU1hY2hpbmVJbml0KAorCUlOICBQUlRNUF9BREFQVEVSICAgICAgIHBBZCwKKwlJTiAgU1RBVEVfTUFDSElORSAgICAgICAqUywKKwlPVVQgU1RBVEVfTUFDSElORV9GVU5DIFRyYW5zW10pOworCitWT0lEIFdwYUVBUE9MS2V5QWN0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEICAgIFdwYVBhaXJNc2cxQWN0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEICAgIFdwYVBhaXJNc2czQWN0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEICAgIFdwYUdyb3VwTXNnMUFjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCAgICBXcGFNYWNIZWFkZXJJbml0KAorCUlOICAgICAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiBPVVQgIFBIRUFERVJfODAyXzExICBwSGRyODAyMTEsCisJSU4gICAgICBVQ0hBUiAgICAgICAgICAgd2VwLAorCUlOICAgICAgUFVDSEFSICAgICAgICAgIHBBZGRyMSk7CisKK1ZPSUQgICAgV3BhMlBhaXJNc2cxQWN0aW9uKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorICAgIElOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEICAgIFdwYTJQYWlyTXNnM0FjdGlvbigKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKyAgICBJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworQk9PTEVBTiBQYXJzZUtleURhdGEoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBwS2V5RGF0YSwKKyAgICBJTiAgVUNIQVIgICAgICAgICAgIEtleURhdGFMZW4sCisJSU4JVUNIQVIJCQliUGFpcmV3aXNlKTsKKworVk9JRCAgICBSVE1QVG9XaXJlbGVzc1N0YSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBIZWFkZXI4MDJfMywKKyAgICBJTiAgVUlOVCAgICAgICAgICAgIEhkckxlbiwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBEYXRhLAorICAgIElOICBVSU5UICAgICAgICAgICAgRGF0YUxlbiwKKyAgICBJTglCT09MRUFOCQkJaXM0d2F5RnJhbWUpOworCitWT0lEICAgIEhNQUNfU0hBMSgKKwlJTiAgVUNIQVIgICAqdGV4dCwKKwlJTiAgVUlOVCAgICB0ZXh0X2xlbiwKKwlJTiAgVUNIQVIgICAqa2V5LAorCUlOICBVSU5UICAgIGtleV9sZW4sCisJSU4gIFVDSEFSICAgKmRpZ2VzdCk7CisKK1ZPSUQgICAgUFJGKAorCUlOICBVQ0hBUiAgICprZXksCisJSU4gIElOVCAgICAga2V5X2xlbiwKKwlJTiAgVUNIQVIgICAqcHJlZml4LAorCUlOICBJTlQgICAgIHByZWZpeF9sZW4sCisJSU4gIFVDSEFSICAgKmRhdGEsCisJSU4gIElOVCAgICAgZGF0YV9sZW4sCisJT1VUIFVDSEFSICAgKm91dHB1dCwKKwlJTiAgSU5UICAgICBsZW4pOworCitWT0lEICAgIENDS01QUkYoCisJSU4gIFVDSEFSICAgKmtleSwKKwlJTiAgSU5UICAgICBrZXlfbGVuLAorCUlOICBVQ0hBUiAgICpkYXRhLAorCUlOICBJTlQgICAgIGRhdGFfbGVuLAorCU9VVCBVQ0hBUiAgICpvdXRwdXQsCisJSU4gIElOVCAgICAgbGVuKTsKKworVk9JRCBXcGFDb3VudFBUSygKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgVUNIQVIgICAqUE1LLAorCUlOICBVQ0hBUiAgICpBTm9uY2UsCisJSU4gIFVDSEFSICAgKkFBLAorCUlOICBVQ0hBUiAgICpTTm9uY2UsCisJSU4gIFVDSEFSICAgKlNBLAorCU9VVCBVQ0hBUiAgICpvdXRwdXQsCisJSU4gIFVJTlQgICAgbGVuKTsKKworVk9JRCAgICBHZW5SYW5kb20oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4JVUNIQVIJCQkqbWFjQWRkciwKKwlPVVQJVUNIQVIJCQkqcmFuZG9tKTsKKworLy8KKy8vIHByb3RvdHlwZSBpbiBhaXJvbmV0LmMKKy8vCitWT0lEICAgIEFpcm9uZXRTdGF0ZU1hY2hpbmVJbml0KAorCUlOICBQUlRNUF9BREFQVEVSICAgICAgIHBBZCwKKwlJTiAgU1RBVEVfTUFDSElORSAgICAgICAqUywKKwlPVVQgU1RBVEVfTUFDSElORV9GVU5DICBUcmFuc1tdKTsKKworVk9JRCAgICBBaXJvbmV0TXNnQWN0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEICAgIEFpcm9uZXRSZXF1ZXN0QWN0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEICAgIENoYW5uZWxMb2FkUmVxdWVzdEFjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgVUNIQVIgICAgICAgICAgIEluZGV4KTsKKworVk9JRCAgICBOb2lzZUhpc3RSZXF1ZXN0QWN0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBVQ0hBUiAgICAgICAgICAgSW5kZXgpOworCitWT0lEICAgIEJlYWNvblJlcXVlc3RBY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFVDSEFSICAgICAgICAgICBJbmRleCk7CisKK1ZPSUQgICAgQWlyb25ldFJlcG9ydEFjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCAgICBDaGFubmVsTG9hZFJlcG9ydEFjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgVUNIQVIgICAgICAgICAgIEluZGV4KTsKKworVk9JRCAgICBOb2lzZUhpc3RSZXBvcnRBY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFVDSEFSICAgICAgICAgICBJbmRleCk7CisKK1ZPSUQgICAgQWlyb25ldEZpbmFsUmVwb3J0QWN0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworVk9JRCAgICBCZWFjb25SZXBvcnRBY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFVDSEFSICAgICAgICAgICBJbmRleCk7CisKK1ZPSUQgICAgQWlyb25ldEFkZEJlYWNvblJlcG9ydCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgICAgICBwQWQsCisJSU4gIFVMT05HICAgICAgICAgICAgICAgSW5kZXgsCisJSU4gIFBNTE1FX1FVRVVFX0VMRU0gICAgcEVsZW0pOworCitWT0lEICAgIEFpcm9uZXRDcmVhdGVCZWFjb25SZXBvcnRGcm9tQnNzVGFibGUoCisJSU4gIFBSVE1QX0FEQVBURVIgICAgICAgcEFkKTsKKworVk9JRCAgICBEQkdQUklOVF9UWF9SSU5HKAorCUlOIFBSVE1QX0FEQVBURVIgIHBBZCwKKwlJTiBVQ0hBUiAgICAgICAgICBRdWVJZHgpOworCitWT0lEIERCR1BSSU5UX1JYX1JJTkcoCisJSU4gUFJUTVBfQURBUFRFUiAgcEFkKTsKKworQ0hBUiAgICBDb252ZXJ0VG9Sc3NpKAorCUlOIFBSVE1QX0FEQVBURVIgIHBBZCwKKwlJTiBDSEFSCQkJCVJzc2ksCisJSU4gVUNIQVIgICAgUnNzaU51bWJlcik7CisKKworI2lmZGVmIERPVDExTl9EUkFGVDMKK1ZPSUQgQnVpbGRFZmZlY3RlZENoYW5uZWxMaXN0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKyNlbmRpZiAvLyBET1QxMU5fRFJBRlQzIC8vCisKKworVk9JRCBBUEFzaWNFdmFsdWF0ZVJ4QW50KAorCUlOIFBSVE1QX0FEQVBURVIJcEFkKTsKKworCitWT0lEIEFQQXNpY1J4QW50RXZhbFRpbWVvdXQoCisJSU4gUFJUTVBfQURBUFRFUglwQWQpOworCisvLworLy8gZnVuY3Rpb24gcHJvdG90eXBlIGluIGNtbV93cGEuYworLy8KK0JPT0xFQU4gUlRNUENoZWNrV1BBZnJhbWUoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gUE1BQ19UQUJMRV9FTlRSWQlwRW50cnksCisJSU4gUFVDSEFSIAkJCXBEYXRhLAorCUlOIFVMT05HIAkJCURhdGFCeXRlQ291bnQsCisJSU4gVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCk7CisKK1ZPSUQgQUVTX0dUS19LRVlfVU5XUkFQKAorCUlOICBVQ0hBUiAgICprZXksCisJT1VUIFVDSEFSICAgKnBsYWludGV4dCwKKwlJTglVQ0hBUgljX2xlbiwKKwlJTiAgVUNIQVIgICAqY2lwaGVydGV4dCk7CisKK0JPT0xFQU4gUlRNUENoZWNrUlNOSUUoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFBVQ0hBUiAgICAgICAgICBwRGF0YSwKKwlJTiAgVUNIQVIgICAgICAgICAgIERhdGFMZW4sCisJSU4gIE1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5LAorCU9VVAlVQ0hBUgkJCSpPZmZzZXQpOworCitCT09MRUFOIFJUTVBQYXJzZUVhcG9sS2V5RGF0YSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBLZXlEYXRhLAorCUlOICBVQ0hBUiAgICAgICAgICAgS2V5RGF0YUxlbiwKKwlJTglVQ0hBUgkJCUdyb3VwS2V5SW5kZXgsCisJSU4JVUNIQVIJCQlNc2dUeXBlLAorCUlOCUJPT0xFQU4JCQliV1BBMiwKKwlJTiAgTUFDX1RBQkxFX0VOVFJZICpwRW50cnkpOworCitWT0lECUNvbnN0cnVjdEVhcG9sTXNnKAorCUlOIAlQUlRNUF9BREFQVEVSICAgIAlwQWQsCisgICAgSU4gCVVDSEFSCQkJCVBlZXJBdXRoTW9kZSwKKyAgICBJTiAJVUNIQVIJCQkJUGVlcldlcFN0YXR1cywKKyAgICBJTiAJVUNIQVIJCQkJTXlHcm91cEtleVdlcFN0YXR1cywKKyAgICBJTiAJVUNIQVIJCQkJTXNnVHlwZSwKKyAgICBJTglVQ0hBUgkJCQlEZWZhdWx0S2V5SWR4LAorICAgIElOIAlVQ0hBUgkJCQkqUmVwbGF5Q291bnRlciwKKwlJTiAJVUNIQVIJCQkJKktleU5vbmNlLAorCUlOCVVDSEFSCQkJCSpUeFJTQywKKwlJTglVQ0hBUgkJCQkqUFRLLAorCUlOCVVDSEFSCQkJCSpHVEssCisJSU4JVUNIQVIJCQkJKlJTTklFLAorCUlOCVVDSEFSCQkJCVJTTklFX0xlbiwKKyAgICBPVVQgUEVBUE9MX1BBQ0tFVCAgICAgICBwTXNnKTsKKworVk9JRAlDYWxjdWxhdGVNSUMoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVUNIQVIJCQlQZWVyV2VwU3RhdHVzLAorCUlOCVVDSEFSCQkJKlBUSywKKwlPVVQgUEVBUE9MX1BBQ0tFVCAgIHBNc2cpOworCitORElTX1NUQVRVUwlSVE1QU29mdERlY3J5cHRCcm9hZENhc3REYXRhKAorCUlOCVBSVE1QX0FEQVBURVIJCQkJCXBBZCwKKwlJTglSWF9CTEsJCQkJCQkJKnBSeEJsaywKKwlJTiAgTkRJU184MDJfMTFfRU5DUllQVElPTl9TVEFUVVMgCUdyb3VwQ2lwaGVyLAorCUlOICBQQ0lQSEVSX0tFWQkJCQkJCXBTaGFyZF9rZXkpOworCitWT0lECUNvbnN0cnVjdEVhcG9sS2V5RGF0YSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVQ0hBUgkJCVBlZXJBdXRoTW9kZSwKKwlJTglVQ0hBUgkJCVBlZXJXZXBTdGF0dXMsCisJSU4JVUNIQVIJCQlHcm91cEtleVdlcFN0YXR1cywKKwlJTiAJVUNIQVIJCQlNc2dUeXBlLAorCUlOCVVDSEFSCQkJRGVmYXVsdEtleUlkeCwKKwlJTglCT09MRUFOCQkJYldQQTJDYXBhYmxlLAorCUlOCVVDSEFSCQkJKlBUSywKKwlJTglVQ0hBUgkJCSpHVEssCisJSU4JVUNIQVIJCQkqUlNOSUUsCisJSU4JVUNIQVIJCQlSU05JRV9MRU4sCisJT1VUIFBFQVBPTF9QQUNLRVQgICBwTXNnKTsKKworVk9JRCBSVE1QTWFrZVJTTklFKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBVSU5UICAgICAgICAgICAgQXV0aE1vZGUsCisJSU4gIFVJTlQgICAgICAgICAgICBXZXBTdGF0dXMsCisJSU4JVUNIQVIJCQlhcGlkeCk7CisKKy8vCisvLyBmdW5jdGlvbiBwcm90b3R5cGUgaW4gYXBfd3BhLmMKKy8vCisKK0JPT0xFQU4gQVBXcGFNc2dUeXBlU3Vic3QoCisJSU4gVUNIQVIgICAgRUFQVHlwZSwKKwlPVVQgSU5UICpNc2dUeXBlKSA7CisKK01BQ19UQUJMRV9FTlRSWSAqUEFDSW5xdWlyeSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgVUxPTkcgICAgICAgICAgIFdjaWQpOworCitCT09MRUFOIFJUTVBDaGVja01jYXN0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFBFSURfU1RSVUNUICAgICAgZWlkX3B0ciwKKwlJTiBNQUNfVEFCTEVfRU5UUlkgICpwRW50cnkpOworCitCT09MRUFOIFJUTVBDaGVja1VjYXN0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFBFSURfU1RSVUNUICAgICAgZWlkX3B0ciwKKwlJTiBNQUNfVEFCTEVfRU5UUlkgICpwRW50cnkpOworCitCT09MRUFOIFJUTVBDaGVja0FVVEgoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gUEVJRF9TVFJVQ1QgICAgICBlaWRfcHRyLAorCUlOIE1BQ19UQUJMRV9FTlRSWSAgKnBFbnRyeSk7CisKK1ZPSUQgV1BBU3RhcnQ0V2F5SFMoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5LAorCUlOCVVMT05HCQkJVGltZUludGVydmFsKTsKKworVk9JRCBXUEFTdGFydDJXYXlHcm91cEhTKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeSk7CisKK1ZPSUQgQVBXcGFFQVBQYWNrZXRBY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBBUFdwYUVBUE9MU3RhcnRBY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBBUFdwYUVBUE9MTG9nb2ZmQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgQVBXcGFFQVBPTEtleUFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIEFQV3BhRUFQT0xBU0ZBbGVydEFjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAgKkVsZW0pOworCitWT0lEIEhhbmRsZUNvdW50ZXJNZWFzdXJlKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1BQ19UQUJMRV9FTlRSWSAgKnBFbnRyeSk7CisKK1ZPSUQgUGVlclBhaXJNc2cyQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1BQ19UQUJMRV9FTlRSWSAgKnBFbnRyeSwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIFBlZXJQYWlyTXNnNEFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNQUNfVEFCTEVfRU5UUlkgICpwRW50cnksCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBDTVRpbWVyRXhlYygKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCisJSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpOworCitWT0lEIFdQQVJldHJ5RXhlYygKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCisJSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpOworCitWT0lEIEVucXVldWVTdGFydEZvclBTS0V4ZWMoCisgICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorICAgIElOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKKyAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisgICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKKworVk9JRCBSVE1QSGFuZGxlU1RBS2V5KAorICAgIElOIFBSVE1QX0FEQVBURVIgICAgcEFkYXB0ZXIsCisgICAgSU4gTUFDX1RBQkxFX0VOVFJZICAqcEVudHJ5LAorICAgIElOIE1MTUVfUVVFVUVfRUxFTSAgKkVsZW0pOworCisjaWYgMCAvLyBtZXJnZSBpbnRvIFBlZXJQYWlyTXNnNEFjdGlvbgorVk9JRCBXcGExUGVlclBhaXJNc2c0QWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1BQ19UQUJMRV9FTlRSWSAgKnBFbnRyeSwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIFdwYTJQZWVyUGFpck1zZzRBY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICAgcEFkLAorCUlOICBQTUFDX1RBQkxFX0VOVFJZIHBFbnRyeSwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICAqRWxlbSk7CisjZW5kaWYgLy8gMCAvLworCitWT0lEIFBlZXJHcm91cE1zZzJBY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICAgcEFkLAorCUlOICBQTUFDX1RBQkxFX0VOVFJZIHBFbnRyeSwKKwlJTiAgVk9JRCAgICAgICAgICAgICAqTXNnLAorCUlOICBVSU5UICAgICAgICAgICAgIE1zZ0xlbik7CisKKyNpZiAwCS8vIHJlcGxhY2VkIGJ5IFdQQVN0YXJ0MldheUdyb3VwSFMKK05ESVNfU1RBVFVTIEFQV3BhSGFyZFRyYW5zbWl0KAorCUlOICBQUlRNUF9BREFQVEVSICAgIHBBZCwKKwlJTiAgUE1BQ19UQUJMRV9FTlRSWSBwRW50cnkpOworI2VuZGlmIC8vIDAgLy8KKworVk9JRCBQYWlyRGlzQXNzb2NBY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICAgcEFkLAorCUlOICBQTUFDX1RBQkxFX0VOVFJZIHBFbnRyeSwKKwlJTiAgVVNIT1JUICAgICAgICAgICBSZWFzb24pOworCitWT0lEIE1sbWVEZUF1dGhBY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICAgcEFkLAorCUlOICBQTUFDX1RBQkxFX0VOVFJZIHBFbnRyeSwKKwlJTiAgVVNIT1JUICAgICAgICAgICBSZWFzb24pOworCitWT0lEIEdSRUtFWVBlcmlvZGljRXhlYygKKwlJTiAgUFZPSUQgICBTeXN0ZW1TcGVjaWZpYzEsCisJSU4gIFBWT0lEICAgRnVuY3Rpb25Db250ZXh0LAorCUlOICBQVk9JRCAgIFN5c3RlbVNwZWNpZmljMiwKKwlJTiAgUFZPSUQgICBTeXN0ZW1TcGVjaWZpYzMpOworCitWT0lEIENvdW50R1RLKAorCUlOICBVQ0hBUiAgICpQTUssCisJSU4gIFVDSEFSICAgKkdOb25jZSwKKwlJTiAgVUNIQVIgICAqQUEsCisJT1VUIFVDSEFSICAgKm91dHB1dCwKKwlJTiAgVUlOVCAgICBsZW4pOworCitWT0lEICAgIEdldFNtYWxsKAorCUlOICBQVk9JRCAgIHBTcmMxLAorCUlOICBQVk9JRCAgIHBTcmMyLAorCU9VVCBQVUNIQVIgIG91dCwKKwlJTiAgVUxPTkcgICBMZW5ndGgpOworCitWT0lEICAgIEdldExhcmdlKAorCUlOICBQVk9JRCAgIHBTcmMxLAorCUlOICBQVk9JRCAgIHBTcmMyLAorCU9VVCBQVUNIQVIgIG91dCwKKwlJTiAgVUxPTkcgICBMZW5ndGgpOworCitWT0lEIEFQR2VuUmFuZG9tKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCU9VVCBVQ0hBUiAgICAgICAqcmFuZG9tKTsKKworVk9JRCBBRVNfR1RLX0tFWV9XUkFQKAorCUlOIFVDSEFSICprZXksCisJSU4gVUNIQVIgKnBsYWludGV4dCwKKwlJTiBVQ0hBUiBwX2xlbiwKKwlPVVQgVUNIQVIgKmNpcGhlcnRleHQpOworCitWT0lEICAgIFdwYVNlbmQoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIHBQYWNrZXQsCisgICAgSU4gIFVMT05HICAgICAgICAgICBMZW4pOworCitWT0lEICAgIEFQVG9XaXJlbGVzc1N0YSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUFDX1RBQkxFX0VOVFJZICpwRW50cnksCisJSU4gIFBVQ0hBUiAgICAgICAgICBwSGVhZGVyODAyXzMsCisJSU4gIFVJTlQgICAgICAgICAgICBIZHJMZW4sCisJSU4gIFBVQ0hBUiAgICAgICAgICBwRGF0YSwKKwlJTiAgVUlOVCAgICAgICAgICAgIERhdGFMZW4sCisgICAgSU4JQk9PTEVBTgkJCWJDbGVhckZyYW1lKTsKKworVk9JRCBSVE1QQWRkUE1LSURDYWNoZSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIAkJcEFkLAorCUlOCUlOVAkJCQkJCWFwaWR4LAorCUlOCVBVQ0hBUgkJCQlwQWRkciwKKwlJTglVQ0hBUgkJCQkJKlBNS0lELAorCUlOCVVDSEFSCQkJCQkqUE1LKTsKKworSU5UIFJUTVBTZWFyY2hQTUtJRENhY2hlKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOCUlOVAkJCQlhcGlkeCwKKwlJTglQVUNIQVIJCXBBZGRyKTsKKworVk9JRCBSVE1QRGVsZXRlUE1LSURDYWNoZSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTglJTlQJCQkJYXBpZHgsCisJSU4gIElOVAkJCQlpZHgpOworCitWT0lEIFJUTVBNYWludGFpblBNS0lEQ2FjaGUoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitWT0lECVJUTVBTZW5kVHJpZ2dlckZyYW1lKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBWT0lECQkJcEJ1ZmZlciwKKwlJTglVTE9ORwkJCUxlbmd0aCwKKwlJTiAgVUNIQVIgICAgICAgICAgIFR4UmF0ZSwKKwlJTglCT09MRUFOCQkJYlFvc051bGwpOworCisKKy8vdHlwZWRlZiB2b2lkICgqVElNRVJfRlVOQ1RJT04pKHVuc2lnbmVkIGxvbmcpOworCisKKy8qIHRpbWVvdXQgLS0gbXMgKi8KK1ZPSUQgUlRNUF9TZXRQZXJpb2RpY1RpbWVyKAorCUlOCU5ESVNfTUlOSVBPUlRfVElNRVIgKnBUaW1lciwKKwlJTgl1bnNpZ25lZCBsb25nIHRpbWVvdXQpOworCitWT0lEIFJUTVBfT1NfSW5pdF9UaW1lcigKKwlJTglQUlRNUF9BREFQVEVSIHBBZCwKKwlJTglORElTX01JTklQT1JUX1RJTUVSICpwVGltZXIsCisJSU4JVElNRVJfRlVOQ1RJT04gZnVuY3Rpb24sCisJSU4JUFZPSUQgZGF0YSk7CisKK1ZPSUQgUlRNUF9PU19BZGRfVGltZXIoCisJSU4JTkRJU19NSU5JUE9SVF9USU1FUgkqcFRpbWVyLAorCUlOCXVuc2lnbmVkIGxvbmcgdGltZW91dCk7CisKK1ZPSUQgUlRNUF9PU19Nb2RfVGltZXIoCisJSU4JTkRJU19NSU5JUE9SVF9USU1FUgkqcFRpbWVyLAorCUlOCXVuc2lnbmVkIGxvbmcgdGltZW91dCk7CisKKworVk9JRCBSVE1QX09TX0RlbF9UaW1lcigKKwlJTglORElTX01JTklQT1JUX1RJTUVSCSpwVGltZXIsCisJT1VUCUJPT0xFQU4JCQkJICpwQ2FuY2VsbGVkKTsKKworCitWT0lEIFJUTVBfT1NfUmVsZWFzZV9QYWNrZXQoCisJSU4JUFJUTVBfQURBUFRFUiBwQWQsCisJSU4JUFFVRVVFX0VOVFJZICBwRW50cnkpOworCitWT0lEIFJUTVB1c2VjRGVsYXkoCisJSU4JVUxPTkcJdXNlYyk7CisKK05ESVNfU1RBVFVTIG9zX2FsbG9jX21lbSgKKwlJTglQUlRNUF9BREFQVEVSIHBBZCwKKwlPVVQJUFVDSEFSICptZW0sCisJSU4JVUxPTkcgIHNpemUpOworCitORElTX1NUQVRVUyBvc19mcmVlX21lbSgKKwlJTglQUlRNUF9BREFQVEVSIHBBZCwKKwlJTglQVUNIQVIgbWVtKTsKKworCit2b2lkIFJUTVBfQWxsb2NhdGVTaGFyZWRNZW1vcnkoCisJSU4JUFJUTVBfQURBUFRFUiBwQWQsCisJSU4JVUxPTkcJTGVuZ3RoLAorCUlOCUJPT0xFQU4JQ2FjaGVkLAorCU9VVAlQVk9JRAkqVmlydHVhbEFkZHJlc3MsCisJT1VUCVBORElTX1BIWVNJQ0FMX0FERFJFU1MgUGh5c2ljYWxBZGRyZXNzKTsKKworVk9JRCBSVE1QRnJlZVR4UnhSaW5nTWVtb3J5KAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworTkRJU19TVEFUVVMgQWRhcHRlckJsb2NrQWxsb2NhdGVNZW1vcnkoCisJSU4gUFZPSUQJaGFuZGxlLAorCU9VVAlQVk9JRAkqcHBBZCk7CisKK3ZvaWQgUlRNUF9BbGxvY2F0ZVR4RGVzY01lbW9yeSgKKwlJTglQUlRNUF9BREFQVEVSIHBBZCwKKwlJTglVSU5UCUluZGV4LAorCUlOCVVMT05HCUxlbmd0aCwKKwlJTglCT09MRUFOCUNhY2hlZCwKKwlPVVQJUFZPSUQJKlZpcnR1YWxBZGRyZXNzLAorCU9VVAlQTkRJU19QSFlTSUNBTF9BRERSRVNTIFBoeXNpY2FsQWRkcmVzcyk7CisKK3ZvaWQgUlRNUF9BbGxvY2F0ZUZpcnN0VHhCdWZmZXIoCisJSU4JUFJUTVBfQURBUFRFUiBwQWQsCisJSU4JVUlOVAlJbmRleCwKKwlJTglVTE9ORwlMZW5ndGgsCisJSU4JQk9PTEVBTglDYWNoZWQsCisJT1VUCVBWT0lECSpWaXJ0dWFsQWRkcmVzcywKKwlPVVQJUE5ESVNfUEhZU0lDQUxfQUREUkVTUyBQaHlzaWNhbEFkZHJlc3MpOworCit2b2lkIFJUTVBfQWxsb2NhdGVNZ210RGVzY01lbW9yeSgKKwlJTglQUlRNUF9BREFQVEVSIHBBZCwKKwlJTglVTE9ORwlMZW5ndGgsCisJSU4JQk9PTEVBTglDYWNoZWQsCisJT1VUCVBWT0lECSpWaXJ0dWFsQWRkcmVzcywKKwlPVVQJUE5ESVNfUEhZU0lDQUxfQUREUkVTUyBQaHlzaWNhbEFkZHJlc3MpOworCit2b2lkIFJUTVBfQWxsb2NhdGVSeERlc2NNZW1vcnkoCisJSU4JUFJUTVBfQURBUFRFUiBwQWQsCisJSU4JVUxPTkcJTGVuZ3RoLAorCUlOCUJPT0xFQU4JQ2FjaGVkLAorCU9VVAlQVk9JRAkqVmlydHVhbEFkZHJlc3MsCisJT1VUCVBORElTX1BIWVNJQ0FMX0FERFJFU1MgUGh5c2ljYWxBZGRyZXNzKTsKKworUE5ESVNfUEFDS0VUIFJUTVBfQWxsb2NhdGVSeFBhY2tldEJ1ZmZlcigKKwlJTglQUlRNUF9BREFQVEVSIHBBZCwKKwlJTglVTE9ORwlMZW5ndGgsCisJSU4JQk9PTEVBTglDYWNoZWQsCisJT1VUCVBWT0lECSpWaXJ0dWFsQWRkcmVzcywKKwlPVVQJUE5ESVNfUEhZU0lDQUxfQUREUkVTUyBQaHlzaWNhbEFkZHJlc3MpOworCitQTkRJU19QQUNLRVQgUlRNUF9BbGxvY2F0ZVR4UGFja2V0QnVmZmVyKAorCUlOCVBSVE1QX0FEQVBURVIgcEFkLAorCUlOCVVMT05HCUxlbmd0aCwKKwlJTglCT09MRUFOCUNhY2hlZCwKKwlPVVQJUFZPSUQJKlZpcnR1YWxBZGRyZXNzKTsKKworUE5ESVNfUEFDS0VUIFJUTVBfQWxsb2NhdGVGcmFnUGFja2V0QnVmZmVyKAorCUlOCVBSVE1QX0FEQVBURVIgcEFkLAorCUlOCVVMT05HCUxlbmd0aCk7CisKK3ZvaWQgUlRNUF9RdWVyeVBhY2tldEluZm8oCisJSU4gIFBORElTX1BBQ0tFVCBwUGFja2V0LAorCU9VVCBQQUNLRVRfSU5GTyAgKnBQYWNrZXRJbmZvLAorCU9VVCBQVUNIQVIJCSAqcFNyY0J1ZlZBLAorCU9VVAlVSU5UCQkgKnBTcmNCdWZMZW4pOworCit2b2lkIFJUTVBfUXVlcnlOZXh0UGFja2V0SW5mbygKKwlJTiAgUE5ESVNfUEFDS0VUICpwcFBhY2tldCwKKwlPVVQgUEFDS0VUX0lORk8gICpwUGFja2V0SW5mbywKKwlPVVQgUFVDSEFSCQkgKnBTcmNCdWZWQSwKKwlPVVQJVUlOVAkJICpwU3JjQnVmTGVuKTsKKworCitCT09MRUFOIFJUTVBfRmlsbFR4QmxrSW5mbygKKwlJTiBSVE1QX0FEQVBURVIgKnBBZCwKKwlJTiBUWF9CTEsgKnBUeEJsayk7CisKKworUFJUTVBfU0NBVFRFUl9HQVRIRVJfTElTVAorcnRfZ2V0X3NnX2xpc3RfZnJvbV9wYWNrZXQoUE5ESVNfUEFDS0VUIHBQYWNrZXQsIFJUTVBfU0NBVFRFUl9HQVRIRVJfTElTVCAqc2cpOworCisKKyB2b2lkIGFubm91bmNlXzgwMl8zX3BhY2tldCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQTkRJU19QQUNLRVQJcFBhY2tldCk7CisKKworVUlOVCBCQV9SZW9yZGVyX0FNU0RVX0Fubm5vdW5jZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQTkRJU19QQUNLRVQJcFBhY2tldCk7CisKKworVUlOVCBIYW5kbGVfQU1TRFVfUGFja2V0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCXBEYXRhLAorCUlOCVVMT05HCQkJRGF0YVNpemUsCisJSU4gIFVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpOworCisKK3ZvaWQgY29udmVydF84MDJfMTFfdG9fODAyXzNfcGFja2V0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBORElTX1BBQ0tFVAlwUGFja2V0LAorCUlOCVBVQ0hBUgkJCXA4MDIzaGRyLAorCUlOCVBVQ0hBUgkJCXBEYXRhLAorCUlOCVVMT05HCQkJRGF0YVNpemUsCisJSU4gIFVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpOworCisKK1BORVRfREVWIGdldF9uZXRkZXZfZnJvbV9ic3NpZCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVQ0hBUgkJCUZyb21XaGljaEJTU0lEKTsKKworCitQTkRJU19QQUNLRVQgZHVwbGljYXRlX3BrdCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlwSGVhZGVyODAyXzMsCisgICAgSU4gIFVJTlQgICAgICAgICAgICBIZHJMZW4sCisJSU4JUFVDSEFSCQkJcERhdGEsCisJSU4JVUxPTkcJCQlEYXRhU2l6ZSwKKwlJTglVQ0hBUgkJCUZyb21XaGljaEJTU0lEKTsKKworCitQTkRJU19QQUNLRVQgZHVwbGljYXRlX3BrdF93aXRoX1RLSVBfTUlDKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBORElTX1BBQ0tFVAlwT2xkUGt0KTsKKworUE5ESVNfUEFDS0VUIGR1cGxpY2F0ZV9wa3Rfd2l0aF9WTEFOKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCXBIZWFkZXI4MDJfMywKKyAgICBJTiAgVUlOVCAgICAgICAgICAgIEhkckxlbiwKKwlJTglQVUNIQVIJCQlwRGF0YSwKKwlJTglVTE9ORwkJCURhdGFTaXplLAorCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpOworCitQTkRJU19QQUNLRVQgZHVwbGljYXRlX3BrdF93aXRoX1dQSSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQTkRJU19QQUNLRVQJcFBhY2tldCwKKwlJTglVSU5UMzIJCQlleHRfaGVhZF9sZW4sCisJSU4JVUlOVDMyCQkJZXh0X3RhaWxfbGVuKTsKKworVUNIQVIgVkxBTl84MDIzX0hlYWRlcl9Db3B5KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCXBIZWFkZXI4MDJfMywKKwlJTglVSU5UICAgICAgICAgICAgSGRyTGVuLAorCU9VVCBQVUNIQVIJCQlwRGF0YSwKKwlJTglVQ0hBUgkJCUZyb21XaGljaEJTU0lEKTsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAordm9pZCBiYV9mbHVzaF9yZW9yZGVyaW5nX3RpbWVvdXRfbXBkdXMoCisJSU4gUFJUTVBfQURBUFRFUglwQWQsCisJSU4gUEJBX1JFQ19FTlRSWQlwQkFFbnRyeSwKKwlJTiBVTE9ORwkJCU5vdzMyKTsKKworCitWT0lEIEJBT3JpU2Vzc2lvblNldFVwKAorCQkJSU4gUFJUTVBfQURBUFRFUiAgICBwQWQsCisJCQlJTiBNQUNfVEFCTEVfRU5UUlkJKnBFbnRyeSwKKwkJCUlOIFVDSEFSCQkJVElELAorCQkJSU4gVVNIT1JUCQkJVGltZU91dCwKKwkJCUlOIFVMT05HCQkJRGVsYXlUaW1lLAorCQkJSU4gQk9PTEVBTgkJaXNGb3JjZWQpOworCitWT0lEIEJBU2Vzc2lvblRlYXJEb3duQUxMKAorCUlOIE9VVAlQUlRNUF9BREFQVEVSIHBBZCwKKwlJTgkJVUNIQVIgV2NpZCk7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKK0JPT0xFQU4gT1NfTmVlZF9DbG9uZV9QYWNrZXQodm9pZCk7CisKKworVk9JRCBidWlsZF90eF9wYWNrZXQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUE5ESVNfUEFDS0VUCXBQYWNrZXQsCisJSU4JUFVDSEFSCXBGcmFtZSwKKwlJTglVTE9ORwlGcmFtZUxlbik7CisKKworVk9JRCBCQU9yaVNlc3Npb25UZWFyRG93bigKKwlJTiBPVVQJUFJUTVBfQURBUFRFUglwQWQsCisJSU4JCVVDSEFSCQkJV2NpZCwKKwlJTgkJVUNIQVIJCQlUSUQsCisJSU4JCUJPT0xFQU4JCQliUGFzc2l2ZSwKKwlJTgkJQk9PTEVBTgkJCWJGb3JjZVNlbmQpOworCitWT0lEIEJBUmVjU2Vzc2lvblRlYXJEb3duKAorCUlOIE9VVAlQUlRNUF9BREFQVEVSCXBBZCwKKwlJTgkJVUNIQVIJCQlXY2lkLAorCUlOCQlVQ0hBUgkJCVRJRCwKKwlJTgkJQk9PTEVBTgkJCWJQYXNzaXZlKTsKKworQk9PTEVBTiBiYV9yZW9yZGVyaW5nX3Jlc291cmNlX2luaXQoUFJUTVBfQURBUFRFUiBwQWQsIGludCBudW0pOwordm9pZCBiYV9yZW9yZGVyaW5nX3Jlc291cmNlX3JlbGVhc2UoUFJUTVBfQURBUFRFUiBwQWQpOworCitVTE9ORyBBdXRvQ2hCc3NJbnNlcnRFbnRyeSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBQVUNIQVIgcEJzc2lkLAorCUlOIENIQVIgU3NpZFtdLAorCUlOIFVDSEFSIFNzaWRMZW4sCisJSU4gVUNIQVIgQ2hhbm5lbE5vLAorCUlOIENIQVIgUnNzaSk7CisKK3ZvaWQgQXV0b0NoQnNzVGFibGVJbml0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKwordm9pZCBDaGFubmVsSW5mb0luaXQoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpOworCit2b2lkIEF1dG9DaEJzc1RhYmxlRGVzdHJveSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK3ZvaWQgQ2hhbm5lbEluZm9EZXN0cm95KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKworVUNIQVIgTmV3X0FwQXV0b1NlbGVjdENoYW5uZWwoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpOworCitCT09MRUFOIHJ0c3RybWFjdG9oZXgoCisJSU4gY2hhciAqczEsCisJSU4gY2hhciAqczIpOworCitCT09MRUFOIHJ0c3RyY2FzZWNtcCgKKwlJTiBjaGFyICpzMSwKKwlJTiBjaGFyICpzMik7CisKK2NoYXIgKnJ0c3Ryc3RydW5jYXNlY21wKAorCUlOIGNoYXIgKnMxLAorCUlOIGNoYXIgKnMyKTsKKworY2hhciAgICAqcnRzdHJzdHIoCisJSU4JY29uc3QgY2hhciAqIHMxLAorCUlOCWNvbnN0IGNoYXIgKiBzMik7CisKK2NoYXIgKnJzdHJ0b2soCisJSU4gY2hhciAqIHMsCisJSU4gY29uc3QgY2hhciAqIGN0KTsKKworaW50IHJ0aW5ldF9hdG9uKAorCWNvbnN0IGNoYXIgKmNwLAorCXVuc2lnbmVkIGludCAqYWRkcik7CisKKy8vLy8vLy8vLy8gY29tbW9uIGlvY3RsIGZ1bmN0aW9ucyAvLy8vLy8vLy8vCitJTlQgU2V0X0RyaXZlclZlcnNpb25fUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQgU2V0X0NvdW50cnlSZWdpb25fUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQgU2V0X0NvdW50cnlSZWdpb25BQmFuZF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVCBTZXRfV2lyZWxlc3NNb2RlX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UIFNldF9DaGFubmVsX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UCVNldF9TaG9ydFNsb3RfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQJU2V0X1R4UG93ZXJfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQgU2V0X0JHUHJvdGVjdGlvbl9Qcm9jKAorCUlOICBQUlRNUF9BREFQVEVSCQlwQWQsCisJSU4gIFBVQ0hBUgkJCWFyZyk7CisKK0lOVCBTZXRfVHhQcmVhbWJsZV9Qcm9jKAorCUlOICBQUlRNUF9BREFQVEVSCQlwQWQsCisJSU4gIFBVQ0hBUgkJCWFyZyk7CisKK0lOVCBTZXRfUlRTVGhyZXNob2xkX1Byb2MoCisJSU4gIFBSVE1QX0FEQVBURVIJCXBBZCwKKwlJTiAgUFVDSEFSCQkJYXJnKTsKKworSU5UIFNldF9GcmFnVGhyZXNob2xkX1Byb2MoCisJSU4gIFBSVE1QX0FEQVBURVIJCXBBZCwKKwlJTiAgUFVDSEFSCQkJYXJnKTsKKworSU5UIFNldF9UeEJ1cnN0X1Byb2MoCisJSU4gIFBSVE1QX0FEQVBURVIJCXBBZCwKKwlJTiAgUFVDSEFSCQkJYXJnKTsKKworI2lmZGVmIEFHR1JFR0FUSU9OX1NVUFBPUlQKK0lOVAlTZXRfUGt0QWdncmVnYXRlX1Byb2MoCisJSU4gIFBSVE1QX0FEQVBURVIJCXBBZCwKKwlJTiAgUFVDSEFSCQkJYXJnKTsKKyNlbmRpZgorCitJTlQJU2V0X0lFRUU4MDIxMUhfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCisjaWZkZWYgREJHCitJTlQJU2V0X0RlYnVnX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKyNlbmRpZgorCitJTlQJU2hvd19EZXNjSW5mb19Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVAlTZXRfUmVzZXRTdGF0Q291bnRlcl9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKK0lOVAlTZXRfQkFTZXR1cF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVAlTZXRfQkFEZWNsaW5lX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UCVNldF9CQU9yaVRlYXJEb3duX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UCVNldF9CQVJlY1RlYXJEb3duX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UCVNldF9IdEJ3X1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UCVNldF9IdE1jc19Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVAlTZXRfSHRHaV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVAlTZXRfSHRPcE1vZGVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQJU2V0X0h0U3RiY19Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVAlTZXRfSHRIdGNfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQJU2V0X0h0RXh0Y2hhX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UCVNldF9IdE1wZHVEZW5zaXR5X1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UCVNldF9IdEJhV2luU2l6ZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVAlTZXRfSHRSZGdfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQJU2V0X0h0TGlua0FkYXB0X1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UCVNldF9IdEFtc2R1X1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UCVNldF9IdEF1dG9CYV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVAlTZXRfSHRQcm90ZWN0X1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UCVNldF9IdE1pbW9Qc19Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKKworSU5UCVNldF9Gb3JjZVNob3J0R0lfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQJU2V0X0ZvcmNlR0ZfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQJU2V0Q29tbW9uSFQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQpOworCitJTlQJU2V0X1NlbmRQU01QQWN0aW9uX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UCVNldF9IdE1JTU9QU21vZGVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCisKK0lOVAlTZXRfSHRUeEJBU2l6ZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisvL0RscyAsCWthdGh5CitWT0lEIFJUTVBTZW5kRExTVGVhckRvd25GcmFtZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlwREEpOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisvL0Jsb2NrIEFDSworVk9JRCBRdWVyeUJBVEFCTEUoCisJSU4gIFBSVE1QX0FEQVBURVIgcEFkLAorCU9VVCBQUVVFUllCQV9UQUJMRSBwQkFUKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKK0lOVAkgICAgV3BhQ2hlY2tFYXBDb2RlKAorCUlOICBQUlRNUF9BREFQVEVSICAgCXBBZCwKKwlJTiAgUFVDSEFSCQkJCXBGcmFtZSwKKwlJTiAgVVNIT1JUCQkJCUZyYW1lTGVuLAorCUlOICBVU0hPUlQJCQkJT2ZmU2V0KTsKKworVk9JRCAgICBXcGFTZW5kTWljRmFpbHVyZVRvV3BhU3VwcGxpY2FudCgKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgICAgICBwQWQsCisgICAgSU4gIEJPT0xFQU4gICAgICAgICAgICAgYlVuaWNhc3QpOworCitWT0lEICAgIFNlbmRBc3NvY0lFc1RvV3BhU3VwcGxpY2FudCgKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgICAgICBwQWQpOworI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKworI2lmZGVmIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUCitpbnQgd2V4dF9ub3RpZnlfZXZlbnRfYXNzb2MoCisJSU4gIFJUTVBfQURBUFRFUiAqcEFkKTsKKyNlbmRpZiAvLyBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCitWT0lEIEhhbmRsZV9CU1NfV2lkdGhfVHJpZ2dlcl9FdmVudHMoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpOworCit2b2lkIGJ1aWxkX2V4dF9jaGFubmVsX3N3aXRjaF9pZSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBIVF9FWFRfQ0hBTk5FTF9TV0lUQ0hfQU5OT1VOQ0VNRU5UX0lFICpwSUUpOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisKK0JPT0xFQU4gQVBSeERvbmVJbnRlcnJ1cHRIYW5kbGUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQpOworCitCT09MRUFOIFNUQVJ4RG9uZUludGVycnVwdEhhbmRsZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglCT09MRUFOCQkJYXJnYyk7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKy8vIEFNUERVIHBhY2tldCBpbmRpY2F0aW9uCitWT0lEIEluZGljYXRlX0FNUERVX1BhY2tldCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglSWF9CTEsJCQkqcFJ4QmxrLAorCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpOworCisvLyBBTVNEVSBwYWNrZXQgaW5kaWNhdGlvbgorVk9JRCBJbmRpY2F0ZV9BTVNEVV9QYWNrZXQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUlhfQkxLCQkJKnBSeEJsaywKKwlJTglVQ0hBUgkJCUZyb21XaGljaEJTU0lEKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworLy8gTm9ybWFsIGxlZ2FjeSBSeCBwYWNrZXQgaW5kaWNhdGlvbgorVk9JRCBJbmRpY2F0ZV9MZWdhY3lfUGFja2V0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVJYX0JMSwkJCSpwUnhCbGssCisJSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCk7CisKK1ZPSUQgSW5kaWNhdGVfRUFQT0xfUGFja2V0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVJYX0JMSwkJCSpwUnhCbGssCisJSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCk7CisKK3ZvaWQgIHVwZGF0ZV9vc19wYWNrZXRfaW5mbygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglSWF9CTEsJCQkqcFJ4QmxrLAorCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpOworCit2b2lkIHdsYW5fODAyXzExX3RvXzgwMl8zX3BhY2tldCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglSWF9CTEsJCQkqcFJ4QmxrLAorCUlOCVBVQ0hBUgkJCXBIZWFkZXI4MDJfMywKKwlJTiAgVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCk7CisKK1VJTlQgZGVhZ2dyZWdhdGVfQU1TRFVfYW5ub3VuY2UoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJUE5ESVNfUEFDS0VUCQlwUGFja2V0LAorCUlOCVBVQ0hBUgkJCXBEYXRhLAorCUlOCVVMT05HCQkJRGF0YVNpemUpOworCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKy8vIHJlbW92ZSBMTEMgYW5kIGdldCA4MDJfMyBIZWFkZXIKKyNkZWZpbmUgIFJUTVBfODAyXzExX1JFTU9WRV9MTENfQU5EX0NPTlZFUlRfVE9fODAyXzMoX3BSeEJsaywgX3BIZWFkZXI4MDJfMykJXAorewkJCQkJCQkJCQkJCQkJCQkJCQkJXAorCVBVQ0hBUiBfcFJlbW92ZWRMTENTTkFQID0gTlVMTCwgX3BEQSwgX3BTQTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCQkJCQkJCQkJCQkJCQkJCQkJCVwKKwlpZiAoUlhfQkxLX1RFU1RfRkxBRyhfcFJ4QmxrLCBmUlhfTUVTSCkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCV9wREEgPSBfcFJ4QmxrLT5wSGVhZGVyLT5BZGRyMzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJX3BTQSA9IChQVUNIQVIpX3BSeEJsay0+cEhlYWRlciArIHNpemVvZihIRUFERVJfODAyXzExKTsgICAgICAgICAgICAgICAgXAorCX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwl7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQlpZiAoUlhfQkxLX1RFU1RfRkxBRyhfcFJ4QmxrLCBmUlhfSU5GUkEpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAlcCisJCXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJCV9wREEgPSBfcFJ4QmxrLT5wSGVhZGVyLT5BZGRyMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQlpZiAoUlhfQkxLX1RFU1RfRkxBRyhfcFJ4QmxrLCBmUlhfRExTKSkJCQkJCQkJCQlcCisJCQlfcFNBID0gX3BSeEJsay0+cEhlYWRlci0+QWRkcjI7CQkJCQkJCQkJCVwKKwkJZWxzZQkJCQkJCQkJCQkJCQkJCQkJXAorCQkJX3BTQSA9IF9wUnhCbGstPnBIZWFkZXItPkFkZHIzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQl7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCQlfcERBID0gX3BSeEJsay0+cEhlYWRlci0+QWRkcjE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJCV9wU0EgPSBfcFJ4QmxrLT5wSGVhZGVyLT5BZGRyMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJCQkJCQkJCQkJCQkJCQkJCQkJXAorCUNPTlZFUlRfVE9fODAyXzMoX3BIZWFkZXI4MDJfMywgX3BEQSwgX3BTQSwgX3BSeEJsay0+cERhdGEsIAkJCQlcCisJCV9wUnhCbGstPkRhdGFTaXplLCBfcFJlbW92ZWRMTENTTkFQKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCitCT09MRUFOIEFQRm93YXJkV2lyZWxlc3NTdGFUb1dpcmVsZXNzU3RhKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBORElTX1BBQ0tFVAlwUGFja2V0LAorCUlOCVVMT05HCQkJRnJvbVdoaWNoQlNTSUQpOworCitWT0lEIEFubm91bmNlX29yX0ZvcndhcmRfODAyXzNfUGFja2V0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBORElTX1BBQ0tFVAlwUGFja2V0LAorCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpOworCitWT0lEIFN0YV9Bbm5vdW5jZV9vcl9Gb3J3YXJkXzgwMl8zX1BhY2tldCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQTkRJU19QQUNLRVQJcFBhY2tldCwKKwlJTglVQ0hBUgkJCUZyb21XaGljaEJTU0lEKTsKKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisjZGVmaW5lIEFOTk9VTkNFX09SX0ZPUldBUkRfODAyXzNfUEFDS0VUKF9wQWQsIF9wUGFja2V0LCBfRnJvbVdoaWNoQlNTKVwKKwkJCVN0YV9Bbm5vdW5jZV9vcl9Gb3J3YXJkXzgwMl8zX1BhY2tldChfcEFkLCBfcFBhY2tldCwgX0Zyb21XaGljaEJTUyk7CisJCQkvL2Fubm91bmNlXzgwMl8zX3BhY2tldChfcEFkLCBfcFBhY2tldCk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKworUE5ESVNfUEFDS0VUIER1cGxpY2F0ZVBhY2tldCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQTkRJU19QQUNLRVQJcFBhY2tldCwKKwlJTglVQ0hBUgkJCUZyb21XaGljaEJTU0lEKTsKKworCitQTkRJU19QQUNLRVQgQ2xvbmVQYWNrZXQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUE5ESVNfUEFDS0VUCXBQYWNrZXQsCisJSU4JUFVDSEFSCQkJcERhdGEsCisJSU4JVUxPTkcJCQlEYXRhU2l6ZSk7CisKKworLy8gTm9ybWFsLCBBTVBEVSBvciBBTVNEVQorVk9JRCBDbW1SeG5vblJhbGlua0ZyYW1lSW5kaWNhdGUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUlhfQkxLCQkJKnBSeEJsaywKKwlJTglVQ0hBUgkJCUZyb21XaGljaEJTU0lEKTsKKworVk9JRCBDbW1SeFJhbGlua0ZyYW1lSW5kaWNhdGUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JTUFDX1RBQkxFX0VOVFJZCSpwRW50cnksCisJSU4JUlhfQkxLCQkJKnBSeEJsaywKKwlJTglVQ0hBUgkJCUZyb21XaGljaEJTU0lEKTsKKworVk9JRCBVcGRhdGVfUnNzaV9TYW1wbGUoCisJSU4gUFJUTVBfQURBUFRFUglwQWQsCisJSU4gUlNTSV9TQU1QTEUJCSpwUnNzaSwKKwlJTiBQUlhXSV9TVFJVQwkJcFJ4V0kpOworCitQTkRJU19QQUNLRVQgR2V0UGFja2V0RnJvbVJ4UmluZygKKwlJTgkJUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCQlQUlQyOFhYX1JYRF9TVFJVQwkJcFNhdmVSeEQsCisJT1VUCQlCT09MRUFOCQkJKnBiUmVzY2hlZHVsZSwKKwlJTiBPVVQJVUlOVDMyCQkJKnBSeFBlbmRpbmcpOworCitQTkRJU19QQUNLRVQgUlRNUERlRnJhZ21lbnREYXRhRnJhbWUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUlhfQkxLCQkJKnBSeEJsayk7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCisKKworCisjaWZkZWYgU05NUF9TVVBQT1JUCisvL2ZvciBzbm1wICwga2F0aHkKK3R5cGVkZWYgc3RydWN0IF9EZWZhdWx0S2V5SWR4VmFsdWUKK3sKKwlVQ0hBUglLZXlJZHg7CisJVUNIQVIJVmFsdWVbMTZdOworfSBEZWZhdWx0S2V5SWR4VmFsdWUsICpQRGVmYXVsdEtleUlkeFZhbHVlOworI2VuZGlmCisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorZW51bSB7CisJRElEbXNnX2xueGluZF93bGFuc25pZmZybQkJPSAweDAwMDAwMDQ0LAorCURJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm1faG9zdHRpbWUJPSAweDAwMDEwMDQ0LAorCURJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm1fbWFjdGltZQk9IDB4MDAwMjAwNDQsCisJRElEbXNnX2xueGluZF93bGFuc25pZmZybV9jaGFubmVsCT0gMHgwMDAzMDA0NCwKKwlESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX3Jzc2kJCT0gMHgwMDA0MDA0NCwKKwlESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX3NxCQk9IDB4MDAwNTAwNDQsCisJRElEbXNnX2xueGluZF93bGFuc25pZmZybV9zaWduYWwJPSAweDAwMDYwMDQ0LAorCURJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm1fbm9pc2UJCT0gMHgwMDA3MDA0NCwKKwlESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX3JhdGUJCT0gMHgwMDA4MDA0NCwKKwlESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX2lzdHgJCT0gMHgwMDA5MDA0NCwKKwlESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX2ZybWxlbgk9IDB4MDAwQTAwNDQKK307CitlbnVtIHsKKwlQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX25vX3ZhbHVlCT0gMHgwMAorfTsKK2VudW0geworCVA4MDIxMUVOVU1fdHJ1dGhfZmFsc2UJCQk9IDB4MDAsCisJUDgwMjExRU5VTV90cnV0aF90cnVlCQkJPSAweDAxCit9OworCisvKiBEZWZpbml0aW9uIGZyb20gbWFkd2lmaSAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgICAgICBVSU5UMzIgZGlkOworICAgICAgICBVSU5UMTYgc3RhdHVzOworICAgICAgICBVSU5UMTYgbGVuOworICAgICAgICBVSU5UMzIgZGF0YTsKK30gcDgwMjExaXRlbV91aW50MzJfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgICAgICBVSU5UMzIgbXNnY29kZTsKKyAgICAgICAgVUlOVDMyIG1zZ2xlbjsKKyNkZWZpbmUgV0xBTl9ERVZOQU1FTEVOX01BWCAxNgorICAgICAgICBVSU5UOCBkZXZuYW1lW1dMQU5fREVWTkFNRUxFTl9NQVhdOworICAgICAgICBwODAyMTFpdGVtX3VpbnQzMl90IGhvc3R0aW1lOworICAgICAgICBwODAyMTFpdGVtX3VpbnQzMl90IG1hY3RpbWU7CisgICAgICAgIHA4MDIxMWl0ZW1fdWludDMyX3QgY2hhbm5lbDsKKyAgICAgICAgcDgwMjExaXRlbV91aW50MzJfdCByc3NpOworICAgICAgICBwODAyMTFpdGVtX3VpbnQzMl90IHNxOworICAgICAgICBwODAyMTFpdGVtX3VpbnQzMl90IHNpZ25hbDsKKyAgICAgICAgcDgwMjExaXRlbV91aW50MzJfdCBub2lzZTsKKyAgICAgICAgcDgwMjExaXRlbV91aW50MzJfdCByYXRlOworICAgICAgICBwODAyMTFpdGVtX3VpbnQzMl90IGlzdHg7CisgICAgICAgIHA4MDIxMWl0ZW1fdWludDMyX3QgZnJtbGVuOworfSB3bGFuX25nX3ByaXNtMl9oZWFkZXI7CisKKy8qIFRoZSByYWRpbyBjYXB0dXJlIGhlYWRlciBwcmVjZWRlcyB0aGUgODAyLjExIGhlYWRlci4gKi8KK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfaWVlZTgwMjExX3JhZGlvdGFwX2hlYWRlciB7CisgICAgVUlOVDgJaXRfdmVyc2lvbjsJLyogVmVyc2lvbiAwLiBPbmx5IGluY3JlYXNlcworCQkJCSAqIGZvciBkcmFzdGljIGNoYW5nZXMsCisJCQkJICogaW50cm9kdWN0aW9uIG9mIGNvbXBhdGlibGUKKwkJCQkgKiBuZXcgZmllbGRzIGRvZXMgbm90IGNvdW50LgorCQkJCSAqLworICAgIFVJTlQ4CWl0X3BhZDsKKyAgICBVSU5UMTYgICAgIGl0X2xlbjsgICAgICAgICAvKiBsZW5ndGggb2YgdGhlIHdob2xlCisJCQkJICogaGVhZGVyIGluIGJ5dGVzLCBpbmNsdWRpbmcKKwkJCQkgKiBpdF92ZXJzaW9uLCBpdF9wYWQsCisJCQkJICogaXRfbGVuLCBhbmQgZGF0YSBmaWVsZHMuCisJCQkJICovCisgICAgVUlOVDMyICAgaXRfcHJlc2VudDsJLyogQSBiaXRtYXAgdGVsbGluZyB3aGljaAorCQkJCQkgKiBmaWVsZHMgYXJlIHByZXNlbnQuIFNldCBiaXQgMzEKKwkJCQkJICogKDB4ODAwMDAwMDApIHRvIGV4dGVuZCB0aGUKKwkJCQkJICogYml0bWFwIGJ5IGFub3RoZXIgMzIgYml0cy4KKwkJCQkJICogQWRkaXRpb25hbCBleHRlbnNpb25zIGFyZSBtYWRlCisJCQkJCSAqIGJ5IHNldHRpbmcgYml0IDMxLgorCQkJCQkgKi8KK31pZWVlODAyMTFfcmFkaW90YXBfaGVhZGVyIDsKKworZW51bSBpZWVlODAyMTFfcmFkaW90YXBfdHlwZSB7CisgICAgSUVFRTgwMjExX1JBRElPVEFQX1RTRlQgPSAwLAorICAgIElFRUU4MDIxMV9SQURJT1RBUF9GTEFHUyA9IDEsCisgICAgSUVFRTgwMjExX1JBRElPVEFQX1JBVEUgPSAyLAorICAgIElFRUU4MDIxMV9SQURJT1RBUF9DSEFOTkVMID0gMywKKyAgICBJRUVFODAyMTFfUkFESU9UQVBfRkhTUyA9IDQsCisgICAgSUVFRTgwMjExX1JBRElPVEFQX0RCTV9BTlRTSUdOQUwgPSA1LAorICAgIElFRUU4MDIxMV9SQURJT1RBUF9EQk1fQU5UTk9JU0UgPSA2LAorICAgIElFRUU4MDIxMV9SQURJT1RBUF9MT0NLX1FVQUxJVFkgPSA3LAorICAgIElFRUU4MDIxMV9SQURJT1RBUF9UWF9BVFRFTlVBVElPTiA9IDgsCisgICAgSUVFRTgwMjExX1JBRElPVEFQX0RCX1RYX0FUVEVOVUFUSU9OID0gOSwKKyAgICBJRUVFODAyMTFfUkFESU9UQVBfREJNX1RYX1BPV0VSID0gMTAsCisgICAgSUVFRTgwMjExX1JBRElPVEFQX0FOVEVOTkEgPSAxMSwKKyAgICBJRUVFODAyMTFfUkFESU9UQVBfREJfQU5UU0lHTkFMID0gMTIsCisgICAgSUVFRTgwMjExX1JBRElPVEFQX0RCX0FOVE5PSVNFID0gMTMKK307CisKKyNkZWZpbmUgV0xBTl9SQURJT1RBUF9QUkVTRU5UICgJCQlcCisJKDEgPDwgSUVFRTgwMjExX1JBRElPVEFQX1RTRlQpCXwJXAorCSgxIDw8IElFRUU4MDIxMV9SQURJT1RBUF9GTEFHUykgfAlcCisJKDEgPDwgSUVFRTgwMjExX1JBRElPVEFQX1JBVEUpICB8IAlcCisJIDApCisKK3R5cGVkZWYgc3RydWN0IF93bGFuX3JhZGlvdGFwX2hlYWRlciB7CisJaWVlZTgwMjExX3JhZGlvdGFwX2hlYWRlciB3dF9paGRyOworCUlOVDY0IHd0X3RzZnQ7CisJVUlOVDggd3RfZmxhZ3M7CisJVUlOVDggd3RfcmF0ZTsKK30gd2xhbl9yYWRpb3RhcF9oZWFkZXI7CisvKiBEZWZpbml0aW9uIGZyb20gbWFkd2lmaSAqLworCit2b2lkIHNlbmRfbW9uaXRvcl9wYWNrZXRzKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVJYX0JMSwkJCSpwUnhCbGspOworCisjaWYgV0lSRUxFU1NfRVhUID49IDEyCisvLyBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIHdoZW4gcXVlcnkgL3Byb2MKK3N0cnVjdCBpd19zdGF0aXN0aWNzICpydDI4eHhfZ2V0X3dpcmVsZXNzX3N0YXRzKAorICAgIElOIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2KTsKKyNlbmRpZgorCitWT0lEICAgIFJUTVBTZXREZXNpcmVkUmF0ZXMoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgTE9ORyAgICAgICAgICAgIFJhdGVzKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworSU5UCVNldF9GaXhlZFR4TW9kZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKKyNpZmRlZiBDT05GSUdfQVBTVEFfTUlYRURfU1VQUE9SVAorSU5UCVNldF9PcE1vZGVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworI2VuZGlmIC8vIENPTkZJR19BUFNUQV9NSVhFRF9TVVBQT1JUIC8vCisKK3N0YXRpYyBpbmxpbmUgY2hhciogR2V0UGh5TW9kZSgKKwlpbnQgTW9kZSkKK3sKKwlzd2l0Y2goTW9kZSkKKwl7CisJCWNhc2UgTU9ERV9DQ0s6CisJCQlyZXR1cm4gIkNDSyI7CisKKwkJY2FzZSBNT0RFX09GRE06CisJCQlyZXR1cm4gIk9GRE0iOworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQljYXNlIE1PREVfSFRNSVg6CisJCQlyZXR1cm4gIkhUTUlYIjsKKworCQljYXNlIE1PREVfSFRHUkVFTkZJRUxEOgorCQkJcmV0dXJuICJHUkVFTiI7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gIk4vQSI7CisJfQorfQorCisKK3N0YXRpYyBpbmxpbmUgY2hhciogR2V0QlcoCisJaW50IEJXKQoreworCXN3aXRjaChCVykKKwl7CisJCWNhc2UgQldfMTA6CisJCQlyZXR1cm4gIjEwTSI7CisKKwkJY2FzZSBCV18yMDoKKwkJCXJldHVybiAiMjBNIjsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJY2FzZSBCV180MDoKKwkJCXJldHVybiAiNDBNIjsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJZGVmYXVsdDoKKwkJCXJldHVybiAiTi9BIjsKKwl9Cit9CisKKworVk9JRCBSVDI4eHhUaHJlYWRUZXJtaW5hdGUoCisJSU4gUlRNUF9BREFQVEVSICpwQWQpOworCitCT09MRUFOIFJUMjhYWENoaXBzZXRDaGVjaygKKwlJTiB2b2lkICpfZGV2X3ApOworCitCT09MRUFOIFJUMjhYWE5ldERldkluaXQoCisJSU4gdm9pZCAJCQkJKl9kZXZfcCwKKwlJTiBzdHJ1Y3QgIG5ldF9kZXZpY2UJKm5ldF9kZXYsCisJSU4gUlRNUF9BREFQVEVSIAkJKnBBZCk7CisKK0JPT0xFQU4gUlQyOFhYUHJvYmVQb3N0Q29uZmlnKAorCUlOIHZvaWQgCQkJCSpfZGV2X3AsCisJSU4gUlRNUF9BREFQVEVSIAkJKnBBZCwKKwlJTiBJTlQzMgkJCQlhcmdjKTsKKworVk9JRCBSVDI4WFhETUFEaXNhYmxlKAorCUlOIFJUTVBfQURBUFRFUiAJCSpwQWQpOworCitWT0lEIFJUMjhYWERNQUVuYWJsZSgKKwlJTiBSVE1QX0FEQVBURVIgCQkqcEFkKTsKKworVk9JRCBSVDI4eHhfVXBkYXRlQmVhY29uVG9Bc2ljKAorCUlOIFJUTVBfQURBUFRFUiAqIHBBZCwKKwlJTiBJTlQgYXBpZHgsCisJSU4gVUxPTkcgQmVhY29uTGVuLAorCUlOIFVMT05HIFVwZGF0ZVBvcyk7CisKK0lOVCBydDI4eHhfaW9jdGwoCisJSU4Jc3RydWN0IG5ldF9kZXZpY2UJKm5ldF9kZXYsCisJSU4JT1VUCXN0cnVjdCBpZnJlcQkqcnEsCisJSU4JSU5UCQkJY21kKTsKKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCitJTlQgcnQyOHh4X3N0YV9pb2N0bCgKKwlJTglzdHJ1Y3QgbmV0X2RldmljZQkqbmV0X2RldiwKKwlJTglPVVQJc3RydWN0IGlmcmVxCSpycSwKKwlJTglJTlQJCQljbWQpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCitCT09MRUFOIFJUMjhYWFNlY3VyaXR5S2V5QWRkKAorCUlOCQlQUlRNUF9BREFQVEVSCQlwQWQsCisJSU4JCVVMT05HCQkJCWFwaWR4LAorCUlOCQlVTE9ORwkJCQlLZXlJZHgsCisJSU4JCU1BQ19UQUJMRV9FTlRSWSAJKnBFbnRyeSk7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KK1BORElTX1BBQ0tFVCBHZXRQYWNrZXRGcm9tUnhSaW5nKAorCUlOCQlQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJCVBSVDI4WFhfUlhEX1NUUlVDCXBTYXZlUnhELAorCU9VVAkJQk9PTEVBTgkJCSpwYlJlc2NoZWR1bGUsCisJSU4gT1VUCVVJTlQzMgkJCSpwUnhQZW5kaW5nKTsKKworCit2b2lkIGtpbGxfdGhyZWFkX3Rhc2soUFJUTVBfQURBUFRFUiBwQWQpOworCit2b2lkIHRidHRfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpOworCisKK1ZPSUQgQXNpY1R1cm5PZmZSRkNsaygKKwlJTiBQUlRNUF9BREFQVEVSICAgIHBBZCwKKwlJTglVQ0hBUiAgICAgICAgICAgQ2hhbm5lbCk7CisKK1ZPSUQgQXNpY1R1cm5PblJGQ2xrKAorCUlOIFBSVE1QX0FEQVBURVIgCXBBZCwKKwlJTglVQ0hBUgkJCUNoYW5uZWwpOworCisjaWZkZWYgUlQyODcwCisvLworLy8gRnVuY3Rpb24gUHJvdG90eXBlIGluIHJ0dXNiX2J1bGsuYworLy8KK1ZPSUQJUlRVU0JJbml0VHhEZXNjKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBUWF9DT05URVhUCQlwVHhDb250ZXh0LAorCUlOCVVDSEFSCQkJQnVsa091dFBpcGVJZCwKKwlJTgl1c2JfY29tcGxldGVfdAlGdW5jKTsKKworVk9JRAlSVFVTQkluaXRIVFR4RGVzYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQSFRfVFhfQ09OVEVYVAlwVHhDb250ZXh0LAorCUlOCVVDSEFSCQkJQnVsa091dFBpcGVJZCwKKwlJTglVTE9ORwkJCUJ1bGtPdXRTaXplLAorCUlOCXVzYl9jb21wbGV0ZV90CUZ1bmMpOworCitWT0lECVJUVVNCSW5pdFJ4RGVzYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQUlhfQ09OVEVYVAkJcFJ4Q29udGV4dCk7CisKK1ZPSUQgUlRVU0JDbGVhblVwRGF0YUJ1bGtPdXRRdWV1ZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCk7CisKK1ZPSUQgUlRVU0JDYW5jZWxQZW5kaW5nQnVsa091dElSUCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCk7CisKK1ZPSUQgUlRVU0JCdWxrT3V0RGF0YVBhY2tldCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVQ0hBUgkJCUJ1bGtPdXRQaXBlSWQsCisJSU4JVUNIQVIJCQlJbmRleCk7CisKK1ZPSUQgUlRVU0JCdWxrT3V0TnVsbEZyYW1lKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKTsKKworVk9JRCBSVFVTQkJ1bGtPdXRSVFNGcmFtZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCk7CisKK1ZPSUQgUlRVU0JDYW5jZWxQZW5kaW5nQnVsa0luSVJQKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKTsKKworVk9JRCBSVFVTQkNhbmNlbFBlbmRpbmdJUlBzKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKTsKKworVk9JRCBSVFVTQkJ1bGtPdXRNTE1FUGFja2V0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVDSEFSCQkJSW5kZXgpOworCitWT0lEIFJUVVNCQnVsa091dFBzUG9sbCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCk7CisKK1ZPSUQgUlRVU0JDbGVhblVwTUxNRUJ1bGtPdXRRdWV1ZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCk7CisKK1ZPSUQgUlRVU0JLaWNrQnVsa091dCgKKwlJTglQUlRNUF9BREFQVEVSIHBBZCk7CisKK1ZPSUQJUlRVU0JCdWxrUmVjZWl2ZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCk7CisKK1ZPSUQgRG9CdWxrSW4oCisJSU4gUlRNUF9BREFQVEVSICpwQWQpOworCitWT0lEIFJUVVNCSW5pdFJ4RGVzYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiAgUFJYX0NPTlRFWFQJCXBSeENvbnRleHQpOworCitWT0lEIFJUVVNCQnVsa1J4SGFuZGxlKAorCUlOIHVuc2lnbmVkIGxvbmcgZGF0YSk7CisKKy8vCisvLyBGdW5jdGlvbiBQcm90b3R5cGUgaW4gcnR1c2JfaW8uYworLy8KK05UU1RBVFVTIFJUVVNCTXVsdGlSZWFkKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVTSE9SVAkJCU9mZnNldCwKKwlPVVQJUFVDSEFSCQkJcERhdGEsCisJSU4JVVNIT1JUCQkJbGVuZ3RoKTsKKworTlRTVEFUVVMgUlRVU0JNdWx0aVdyaXRlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVTSE9SVAkJCU9mZnNldCwKKwlJTglQVUNIQVIJCQlwRGF0YSwKKwlJTglVU0hPUlQJCQlsZW5ndGgpOworCitOVFNUQVRVUyBSVFVTQk11bHRpV3JpdGVfT25lQnl0ZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVU0hPUlQJCQlPZmZzZXQsCisJSU4JUFVDSEFSCQkJcERhdGEpOworCitOVFNUQVRVUyBSVFVTQlJlYWRCQlBSZWdpc3RlcigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVQ0hBUgkJCUlkLAorCUlOCVBVQ0hBUgkJCXBWYWx1ZSk7CisKK05UU1RBVFVTIFJUVVNCV3JpdGVCQlBSZWdpc3RlcigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVQ0hBUgkJCUlkLAorCUlOCVVDSEFSCQkJVmFsdWUpOworCitOVFNUQVRVUyBSVFVTQldyaXRlUkZSZWdpc3RlcigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVSU5UMzIJCQlWYWx1ZSk7CisKK05UU1RBVFVTCVJUMzB4eFdyaXRlUkZSZWdpc3RlcigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVQ0hBUgkJCVJlZ0lELAorCUlOCVVDSEFSCQkJVmFsdWUpOworCitOVFNUQVRVUwlSVDMweHhSZWFkUkZSZWdpc3RlcigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVQ0hBUgkJCVJlZ0lELAorCUlOCVBVQ0hBUgkJCXBWYWx1ZSk7CisKK05UU1RBVFVTIFJUVVNCX1ZlbmRvclJlcXVlc3QoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVUlOVDMyCQkJVHJhbnNmZXJGbGFncywKKwlJTglVQ0hBUgkJCVJlc2VydmVkQml0cywKKwlJTglVQ0hBUgkJCVJlcXVlc3QsCisJSU4JVVNIT1JUCQkJVmFsdWUsCisJSU4JVVNIT1JUCQkJSW5kZXgsCisJSU4JUFZPSUQJCQlUcmFuc2ZlckJ1ZmZlciwKKwlJTglVSU5UMzIJCQlUcmFuc2ZlckJ1ZmZlckxlbmd0aCk7CisKK05UU1RBVFVTIFJUVVNCUmVhZEVFUFJPTSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVU0hPUlQJCQlPZmZzZXQsCisJT1VUCVBVQ0hBUgkJCXBEYXRhLAorCUlOCVVTSE9SVAkJCWxlbmd0aCk7CisKK05UU1RBVFVTIFJUVVNCV3JpdGVFRVBST00oCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVVNIT1JUCQkJT2Zmc2V0LAorCUlOCVBVQ0hBUgkJCXBEYXRhLAorCUlOCVVTSE9SVAkJCWxlbmd0aCk7CisKK1ZPSUQgUlRVU0JQdXRUb1NsZWVwKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKTsKKworTlRTVEFUVVMgUlRVU0JXYWtlVXAoCisJSU4JUFJUTVBfQURBUFRFUglwQWQpOworCitWT0lEIFJUVVNCSW5pdGlhbGl6ZUNtZFEoCisJSU4JUENtZFEJY21kcSk7CisKK05ESVNfU1RBVFVTCVJUVVNCRW5xdWV1ZUNtZEZyb21OZGlzKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCU5ESVNfT0lECQlPaWQsCisJSU4JQk9PTEVBTgkJCVNldEluZm9ybWF0aW9uLAorCUlOCVBWT0lECQkJcEluZm9ybWF0aW9uQnVmZmVyLAorCUlOCVVJTlQzMgkJCUluZm9ybWF0aW9uQnVmZmVyTGVuZ3RoKTsKKworTkRJU19TVEFUVVMgUlRVU0JFbnF1ZXVlSW50ZXJuYWxDbWQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4gTkRJU19PSUQJCQlPaWQsCisJSU4gUFZPSUQJCQlwSW5mb3JtYXRpb25CdWZmZXIsCisJSU4gVUlOVDMyCQkJSW5mb3JtYXRpb25CdWZmZXJMZW5ndGgpOworCitWT0lEIFJUVVNCRGVxdWV1ZUNtZCgKKwlJTglQQ21kUQkJY21kcSwKKwlPVVQJUENtZFFFbG10CSpwY21kcWVsbXQpOworCitJTlQgUlRVU0JDbWRUaHJlYWQoCisJSU4gT1VUIFBWT0lEIENvbnRleHQpOworCitJTlQgVGltZXJRVGhyZWFkKAorCUlOIE9VVCBQVk9JRCBDb250ZXh0KTsKKworUlQyODcwX1RJTUVSX0VOVFJZICpSVDI4NzBfVGltZXJRX0luc2VydCgKKwlJTiBSVE1QX0FEQVBURVIgKnBBZCwKKwlJTiBSQUxJTktfVElNRVJfU1RSVUNUICpwVGltZXIpOworCitCT09MRUFOIFJUMjg3MF9UaW1lclFfUmVtb3ZlKAorCUlOIFJUTVBfQURBUFRFUiAqcEFkLAorCUlOIFJBTElOS19USU1FUl9TVFJVQ1QgKnBUaW1lcik7CisKK3ZvaWQgUlQyODcwX1RpbWVyUV9FeGl0KAorCUlOIFJUTVBfQURBUFRFUiAqcEFkKTsKKwordm9pZCBSVDI4NzBfVGltZXJRX0luaXQoCisJSU4gUlRNUF9BREFQVEVSICpwQWQpOworCitWT0lEIFJUMjg3MF9Cc3NCZWFjb25FeGl0KAorCUlOIFJUTVBfQURBUFRFUiAqcEFkKTsKKworVk9JRCBSVDI4NzBfQnNzQmVhY29uU3RvcCgKKwlJTiBSVE1QX0FEQVBURVIgKnBBZCk7CisKK1ZPSUQgUlQyODcwX0Jzc0JlYWNvblN0YXJ0KAorCUlOIFJUTVBfQURBUFRFUiAqIHBBZCk7CisKK1ZPSUQgUlQyODcwX0Jzc0JlYWNvbkluaXQoCisJSU4gUlRNUF9BREFQVEVSICpwQWQpOworCitWT0lEIFJUMjg3MF9XYXRjaERvZygKKwlJTiBSVE1QX0FEQVBURVIgKnBBZCk7CisKK05UU1RBVFVTIFJUVVNCV3JpdGVNQUNSZWdpc3RlcigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVU0hPUlQJCQlPZmZzZXQsCisJSU4JVUlOVDMyCQkJVmFsdWUpOworCitOVFNUQVRVUyBSVFVTQlJlYWRNQUNSZWdpc3RlcigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVU0hPUlQJCQlPZmZzZXQsCisJT1VUCVBVSU5UMzIJCQlwVmFsdWUpOworCitOVFNUQVRVUyBSVFVTQlNpbmdsZVdyaXRlKAorCUlOIAlSVE1QX0FEQVBURVIgCSpwQWQsCisJSU4JVVNIT1JUCQkJT2Zmc2V0LAorCUlOCVVTSE9SVAkJCVZhbHVlKTsKKworTlRTVEFUVVMgUlRVU0JGaXJtd2FyZVJ1bigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCk7CisKK05UU1RBVFVTIFJUVVNCRmlybXdhcmVXcml0ZSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBQVUNIQVIJCXBGd0ltYWdlLAorCUlOIFVMT05HCQlGd0xlbik7CisKK05UU1RBVFVTCVJUVVNCRmlybXdhcmVPcG1vZGUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVSU5UMzIJCQlwVmFsdWUpOworCitOVFNUQVRVUwlSVFVTQlZlbmRlclJlc2V0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKTsKKworTkRJU19TVEFUVVMgUlRVU0JTZXRIYXJkV2FyZVJlZ2lzdGVyKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCisJSU4JUFZPSUQJCQlwQnVmKTsKKworTkRJU19TVEFUVVMgUlRVU0JRdWVyeUhhcmRXYXJlUmVnaXN0ZXIoCisJSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKKwlJTglQVk9JRAkJCXBCdWYpOworCitWT0lEIENNREhhbmRsZXIoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQpOworCisKK05ESVNfU1RBVFVTCSBDcmVhdGVUaHJlYWRzKAorCUlOCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2ICk7CisKKworVk9JRCBNYWNUYWJsZUluaXRpYWxpemUoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitWT0lEIE1sbWVTZXRQc20oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVVNIT1JUIHBzbSk7CisKK05ESVNfU1RBVFVTIFJUTVBXUEFBZGRLZXlQcm9jKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBQVk9JRCAgICAgICAgICAgcEJ1Zik7CisKK1ZPSUQgQXNpY1J4QW50RXZhbEFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKKyNpZiAwIC8vIE1hcmsgYmVjYXVzZSBub3QgdXNlZCBpbiBSVDI4eHguCitOVFNUQVRVUyBSVFVTQlJ4UGFja2V0KAorCUlOCVBSVE1QX0FEQVBURVIgIHBBZCwKKwlJTiAgICBCT09MRUFOICAgICAgICAgIGJCdWxrUmVjZWl2ZSk7CisKK1ZPSUQgUlRVU0JEZXF1ZXVlTUxNRVBhY2tldCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCk7CisKK1ZPSUQgUlRVU0JDbGVhblVwTUxNRVdhaXRRdWV1ZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCk7CisjZW5kaWYKKwordm9pZCBhcHBlbmRfcGt0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCXBIZWFkZXI4MDJfMywKKyAgICBJTiAgVUlOVCAgICAgICAgICAgIEhkckxlbiwKKwlJTglQVUNIQVIJCQlwRGF0YSwKKwlJTglVTE9ORwkJCURhdGFTaXplLAorCU9VVCAgUE5ESVNfUEFDS0VUCSpwcFBhY2tldCk7CisKK1VJTlQgZGVhZ2dyZWdhdGVfQU1TRFVfYW5ub3VuY2UoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJUE5ESVNfUEFDS0VUCQlwUGFja2V0LAorCUlOCVBVQ0hBUgkJCXBEYXRhLAorCUlOCVVMT05HCQkJRGF0YVNpemUpOworCitORElTX1NUQVRVUwlSVE1QQ2hlY2tSeEVycm9yKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBIRUFERVJfODAyXzExCXBIZWFkZXIsCisJSU4JUFJYV0lfU1RSVUMJcFJ4V0ksCisJSU4JUFJUMjhYWF9SWERfU1RSVUMJcFJ4SU5GTyk7CisKKworVk9JRCBSVFVTQk1sbWVIYXJkVHJhbnNtaXQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUE1HTVRfU1RSVUMJCXBNZ210KTsKKworSU5UIE1sbWVUaHJlYWQoCisJSU4gUFZPSUQgQ29udGV4dCk7CisKKyNpZiAwCitWT0lEICAgIFJUVVNCUmVzdW1lTXNkdVRyYW5zbWlzc2lvbigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCk7CisKK1ZPSUQgICAgUlRVU0JTdXNwZW5kTXNkdVRyYW5zbWlzc2lvbigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCk7CisjZW5kaWYKKworLy8KKy8vIEZ1bmN0aW9uIFByb3RvdHlwZSBpbiBydHVzYl9kYXRhLmMKKy8vCitORElTX1NUQVRVUwlSVFVTQkZyZWVEZXNjcmlwdG9yUmVxdWVzdCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVQ0hBUgkJCUJ1bGtPdXRQaXBlSWQsCisJSU4JVUlOVDMyCQkJTnVtYmVyUmVxdWlyZWQpOworCisKK0JPT0xFQU4JUlRVU0JOZWVkUXVldWVCYWNrRm9yQWdnKAorCUlOIFJUTVBfQURBUFRFUiAqcEFkLAorCUlOIFVDSEFSCQlCdWxrT3V0UGlwZUlkKTsKKworCitWT0lEIFJUTVBXcml0ZVR4SW5mbygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVFhJTkZPX1NUUlVDIAlwVHhJbmZvLAorCUlOCSAgVVNIT1JUCQlVU0JETUFwa3RMZW4sCisJSU4JICBCT09MRUFOCQliV2l2LAorCUlOCSAgVUNIQVIJCQlRdWV1ZVNlbCwKKwlJTgkgIFVDSEFSCQkJTmV4dFZhbGlkLAorCUlOCSAgVUNIQVIJCQlUeEJ1cnN0KTsKKworLy8KKy8vIEZ1bmN0aW9uIFByb3RvdHlwZSBpbiBjbW1fZGF0YV8yODcwLmMKKy8vCitVU0hPUlQgUnRtcFVTQl9Xcml0ZVN1YlR4UmVzb3VyY2UoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVFhfQkxLCQkJKnBUeEJsaywKKwlJTglCT09MRUFOCQkJYklzTGFzdCwKKwlPVVQJVVNIT1JUCQkJKkZyZWVOdW1iZXIpOworCitVU0hPUlQgUnRtcFVTQl9Xcml0ZVNpbmdsZVR4UmVzb3VyY2UoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVFhfQkxLCQkJKnBUeEJsaywKKwlJTglCT09MRUFOCQkJYklzTGFzdCwKKwlPVVQJVVNIT1JUCQkJKkZyZWVOdW1iZXIpOworCitVU0hPUlQJUnRtcFVTQl9Xcml0ZUZyYWdUeFJlc291cmNlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVRYX0JMSwkJCSpwVHhCbGssCisJSU4JVUNIQVIJCQlmcmFnTnVtLAorCU9VVAlVU0hPUlQJCQkqRnJlZU51bWJlcik7CisKK1VTSE9SVCBSdG1wVVNCX1dyaXRlTXVsdGlUeFJlc291cmNlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVRYX0JMSwkJCSpwVHhCbGssCisJSU4JVUNIQVIJCQlmcmFtZU51bSwKKwlPVVQJVVNIT1JUCQkJKkZyZWVOdW1iZXIpOworCitWT0lEIFJ0bXBVU0JfRmluYWxXcml0ZVR4UmVzb3VyY2UoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVFhfQkxLCQkJKnBUeEJsaywKKwlJTglVU0hPUlQJCQl0b3RhbE1QRFVTaXplLAorCUlOCVVTSE9SVAkJCVR4SWR4KTsKKworVk9JRCBSdG1wVVNCRGF0YUxhc3RUeElkeCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVQ0hBUgkJCVF1ZUlkeCwKKwlJTglVU0hPUlQJCQlUeElkeCk7CisKK1ZPSUQgUnRtcFVTQkRhdGFLaWNrT3V0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVRYX0JMSwkJCSpwVHhCbGssCisJSU4JVUNIQVIJCQlRdWVJZHgpOworCisKK2ludCBSdG1wVVNCTWdtdEtpY2tPdXQoCisJSU4gUlRNUF9BREFQVEVSIAkqcEFkLAorCUlOIFVDSEFSIAkJCVF1ZUlkeCwKKwlJTiBQTkRJU19QQUNLRVQJCXBQYWNrZXQsCisJSU4gUFVDSEFSCQkJcFNyY0J1ZlZBLAorCUlOIFVJTlQgCQkJU3JjQnVmTGVuKTsKKworVk9JRCBSdG1wVVNCTnVsbEZyYW1lS2lja091dCgKKwlJTiBSVE1QX0FEQVBURVIgKnBBZCwKKwlJTiBVQ0hBUgkJUXVlSWR4LAorCUlOIFVDSEFSCQkqcE51bGxGcmFtZSwKKwlJTiBVSU5UMzIJCWZyYW1lTGVuKTsKKworVk9JRCBSVDI4eHhVc2JTdGFBc2ljRm9yY2VXYWtldXAoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gQk9PTEVBTiAgICAgICBiRnJvbVR4KTsKKworVk9JRCBSVDI4eHhVc2JTdGFBc2ljU2xlZXBUaGVuQXV0b1dha2V1cCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVU0hPUlQgVGJ0dE51bVRvTmV4dFdha2VVcCk7CisKK1ZPSUQgUlQyOHh4VXNiTWxtZVJhZGlvT24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpOworCitWT0lEIFJUMjh4eFVzYk1sbWVSYWRpb09GRigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisjZW5kaWYgLy8gUlQyODcwIC8vCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworVk9JRCBRQlNTX0xvYWRJbml0KAorIAlJTgkJUlRNUF9BREFQVEVSCSpwQWQpOworCitVSU5UMzIgUUJTU19Mb2FkRWxlbWVudEFwcGVuZCgKKyAJSU4JCVJUTVBfQURBUFRFUgkqcEFkLAorCU9VVAkJVUlOVDgJCQkqYnVmX3ApOworCitWT0lEIFFCU1NfTG9hZFVwZGF0ZSgKKyAJSU4JCVJUTVBfQURBUFRFUgkqcEFkKTsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCitJTlQgUlRNUFNob3dDZmdWYWx1ZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlwTmFtZSwKKwlJTglQVUNIQVIJCQlwQnVmKTsKKworUENIQVIgICBSVE1QR2V0UmFsaW5rQXV0aE1vZGVTdHIoCisgICAgSU4gIE5ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREUgYXV0aE1vZGUpOworCitQQ0hBUiAgIFJUTVBHZXRSYWxpbmtFbmNyeU1vZGVTdHIoCisgICAgSU4gIFVTSE9SVCBlbmNyeU1vZGUpOworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorVk9JRCBBc2ljU3RhQmJwVHVuaW5nKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKworQk9PTEVBTiBTdGFBZGRNYWNUYWJsZUVudHJ5KAorCUlOICBQUlRNUF9BREFQVEVSCQlwQWQsCisJSU4gIFBNQUNfVEFCTEVfRU5UUlkJcEVudHJ5LAorCUlOICBVQ0hBUgkJCQlNYXhTdXBwb3J0ZWRSYXRlSW41MDBLYnBzLAorCUlOICBIVF9DQVBBQklMSVRZX0lFCSpwSHRDYXBhYmlsaXR5LAorCUlOICBVQ0hBUgkJCQlIdENhcGFiaWxpdHlMZW4sCisJSU4gIFVTSE9SVCAgICAgICAgCQlDYXBhYmlsaXR5SW5mbyk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKK3ZvaWQgUlRNUF9JbmRpY2F0ZU1lZGlhU3RhdGUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQpOworCitWT0lEIFJlU3luY0JlYWNvblRpbWUoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitWT0lEIFJUTVBTZXRBR0NJbml0VmFsdWUoCisJSU4gUFJUTVBfQURBUFRFUglwQWQsCisJSU4gVUNIQVIJCQlCYW5kV2lkdGgpOworCitpbnQgcnQyOHh4X2Nsb3NlKElOIFBORVRfREVWIGRldik7CitpbnQgcnQyOHh4X29wZW4oSU4gUE5FVF9ERVYgZGV2KTsKKworX19pbmxpbmUgSU5UIFZJUlRVQUxfSUZfVVAoUFJUTVBfQURBUFRFUiBwQWQpCit7CitleHRlcm4gVk9JRCBNZXNoTWFrZUJlYWNvbihJTiBQUlRNUF9BREFQVEVSIHBBZCwgSU4gVUNIQVIgaWR4KTsKK2V4dGVybiBWT0lEIE1lc2hVcGRhdGVCZWFjb25GcmFtZShJTiBQUlRNUF9BREFQVEVSIHBBZCwgSU4gVUNIQVIgaWR4KTsKKworCWlmIChWSVJUVUFMX0lGX05VTShwQWQpID09IDApCisJeworCQlpZiAocnQyOHh4X29wZW4ocEFkLT5uZXRfZGV2KSAhPSAwKQorCQkJcmV0dXJuIC0xOworCX0KKwllbHNlCisJeworCX0KKwlWSVJUVUFMX0lGX0lOQyhwQWQpOworCXJldHVybiAwOworfQorCitfX2lubGluZSBWT0lEIFZJUlRVQUxfSUZfRE9XTihQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlWSVJUVUFMX0lGX0RFQyhwQWQpOworCWlmIChWSVJUVUFMX0lGX05VTShwQWQpID09IDApCisJCXJ0Mjh4eF9jbG9zZShwQWQtPm5ldF9kZXYpOworCXJldHVybjsKK30KKworCisjZW5kaWYgIC8vIF9fUlRNUF9IX18KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9ydG1wX2NraXBtaWMuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvcnRtcF9ja2lwbWljLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTNkOTQ5YQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvcnRtcF9ja2lwbWljLmgKQEAgLTAsMCArMSwxMTMgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJTW9kdWxlIE5hbWU6CisJcnRtcF9ja2lwbWljLmgKKworCUFic3RyYWN0OgorCisJUmV2aXNpb24gSGlzdG9yeToKKwlXaG8JCQlXaGVuCQkJV2hhdAorCS0tLS0tLS0tCS0tLS0tLS0tLS0JCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlOYW1lCQlEYXRlCQkJTW9kaWZpY2F0aW9uIGxvZ3MKKyovCisjaWZuZGVmCV9fUlRNUF9DS0lQTUlDX0hfXworI2RlZmluZQlfX1JUTVBfQ0tJUE1JQ19IX18KKwordHlwZWRlZglzdHJ1Y3QJX01JQ19DT05URVhUCXsKKwkvKiAtLS0gTU1IIGNvbnRleHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwlVQ0hBUgkJQ0tbMTZdOwkJCQkvKiB0aGUga2V5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwlVQ0hBUgkJY29lZmZpY2llbnRbMTZdOwkvKiBjdXJyZW50IGFlcyBjb3VudGVyIG1vZGUgY29lZmZpY2llbnRzICAgICAgKi8KKwlVTE9OR0xPTkcJYWNjdW07CQkJCS8qIGFjY3VtdWxhdGVkIG1pYywgcmVkdWNlZCB0byB1MzIgaW4gZmluYWwoKSAqLworCVVJTlQJCXBvc2l0aW9uOwkJCS8qIGN1cnJlbnQgcG9zaXRpb24gKGJ5dGUgb2Zmc2V0KSBpbiBtZXNzYWdlICAqLworCVVDSEFSCQlwYXJ0WzRdOwkJCS8qIGZvciBjb252ZXJzaW9uIG9mIG1lc3NhZ2UgdG8gdTMyIGZvciBtbWggICAqLworfQlNSUNfQ09OVEVYVCwgKlBNSUNfQ09OVEVYVDsKKworVk9JRAlDS0lQX2tleV9wZXJtdXRlKAorCU9VVAlVQ0hBUgkqUEssCQkJLyogb3V0cHV0IHBlcm11dGVkIGtleSAqLworCUlOCVVDSEFSCSpDSywJCQkvKiBpbnB1dCBDS0lQIGtleSAqLworCUlOCVVDSEFSCXRvRHNGcm9tRHMsCQkvKiBpbnB1dCB0b0RzL0Zyb21EcyBiaXRzICovCisJSU4JVUNIQVIJKnBpdik7CQkJLyogaW5wdXQgcG9pbnRlciB0byBJViAqLworCitWT0lECVJUTVBDa2lwTWljSW5pdCgKKwlJTglQTUlDX0NPTlRFWFQJCXBDb250ZXh0LAorCUlOCVBVQ0hBUgkJCQlDSyk7CisKK1ZPSUQgUlRNUE1pY1VwZGF0ZSgKKyAgICBJTiAgUE1JQ19DT05URVhUICAgICAgICBwQ29udGV4dCwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgICAgICBwT2N0ZXRzLAorICAgIElOICBJTlQgICAgICAgICAgICAgICAgIGxlbik7CisKK1VMT05HIFJUTVBNaWNHZXRDb2VmZmljaWVudCgKKyAgICBJTiAgUE1JQ19DT05URVhUICAgICAgICAgcENvbnRleHQpOworCitWT0lEIHhvcl8xMjgoCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICAgICAgYSwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgICAgICBiLAorICAgIE9VVCBQVUNIQVIgICAgICAgICAgICAgIG91dCk7CisKK1VDSEFSIFJUTVBDa2lwU2JveCgKKyAgICBJTiAgVUNIQVIgICAgICAgICAgICAgICBhKTsKKworVk9JRCB4b3JfMzIoCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICAgICAgYSwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgICAgICBiLAorICAgIE9VVCBQVUNIQVIgICAgICAgICAgICAgIG91dCk7CisKK1ZPSUQgbmV4dF9rZXkoCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICAgICAga2V5LAorICAgIElOICBJTlQgICAgICAgICAgICAgICAgIHJvdW5kKTsKKworVk9JRCBieXRlX3N1YigKKyAgICBJTiAgUFVDSEFSICAgICAgICAgICAgICBpbiwKKyAgICBPVVQgUFVDSEFSICAgICAgICAgICAgICBvdXQpOworCitWT0lEIHNoaWZ0X3JvdygKKyAgICBJTiAgUFVDSEFSICAgICAgICAgICAgICBpbiwKKyAgICBPVVQgUFVDSEFSICAgICAgICAgICAgICBvdXQpOworCitWT0lEIG1peF9jb2x1bW4oCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICAgICAgaW4sCisgICAgT1VUIFBVQ0hBUiAgICAgICAgICAgICAgb3V0KTsKKworVk9JRCBSVE1QQWVzRW5jcnlwdCgKKyAgICBJTiAgUFVDSEFSICAgICAgICAgICAgICBrZXksCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICAgICAgZGF0YSwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgICAgICBjaXBoZXJ0ZXh0KTsKKworVk9JRCBSVE1QTWljRmluYWwoCisgICAgSU4gIFBNSUNfQ09OVEVYVCAgICAgICAgcENvbnRleHQsCisgICAgT1VUIFVDSEFSICAgICAgICAgICAgICAgZGlnZXN0WzRdKTsKKworVk9JRCBSVE1QQ2tpcEluc2VydENNSUMoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisgICAgT1VUIFBVQ0hBUiAgICAgICAgICBwTUlDLAorICAgIElOICBQVUNIQVIgICAgICAgICAgcDgwMjExaGRyLAorICAgIElOICBQTkRJU19QQUNLRVQgICAgcFBhY2tldCwKKyAgICBJTiAgUENJUEhFUl9LRVkgICAgIHBLZXksCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBtaWNfc25hcCk7CisKKyNlbmRpZiAvL19fUlRNUF9DS0lQTUlDX0hfXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9ydG1wX2RlZi5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9ydG1wX2RlZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwZjc1NjEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3J0bXBfZGVmLmgKQEAgLTAsMCArMSwxNjIyIEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgIE1vZHVsZSBOYW1lOgorICAgIHJ0bXBfZGVmLmgKKworICAgIEFic3RyYWN0OgorICAgIE1pbmlwb3J0IHJlbGF0ZWQgZGVmaW5pdGlvbiBoZWFkZXIKKworICAgIFJldmlzaW9uIEhpc3Rvcnk6CisgICAgV2hvICAgICAgICAgV2hlbiAgICAgICAgICBXaGF0CisgICAgLS0tLS0tLS0gICAgLS0tLS0tLS0tLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgUGF1bCBMaW4gICAgMDgtMDEtMjAwMiAgICBjcmVhdGVkCisgICAgSm9obiBDaGFuZyAgMDgtMDUtMjAwMyAgICBhZGQgZGVmaW5pdGlvbiBmb3IgMTFnICYgb3RoZXIgZHJhZnRzCisqLworI2lmbmRlZiBfX1JUTVBfREVGX0hfXworI2RlZmluZSBfX1JUTVBfREVGX0hfXworCisjaW5jbHVkZSAib2lkLmgiCisKKy8vCisvLyAgRGVidWcgaW5mb3JtYXRpb24gdmVyYm9zaXR5OiBsb3dlciB2YWx1ZXMgaW5kaWNhdGUgaGlnaGVyIHVyZ2VuY3kKKy8vCisjZGVmaW5lIFJUX0RFQlVHX09GRiAgICAgICAgMAorI2RlZmluZSBSVF9ERUJVR19FUlJPUiAgICAgIDEKKyNkZWZpbmUgUlRfREVCVUdfV0FSTiAgICAgICAyCisjZGVmaW5lIFJUX0RFQlVHX1RSQUNFICAgICAgMworI2RlZmluZSBSVF9ERUJVR19JTkZPICAgICAgIDQKKyNkZWZpbmUgUlRfREVCVUdfTE9VRCAgICAgICA1CisKKyNkZWZpbmUgTklDX1RBRyAgICAgICAgICAgICAoKFVMT05HKScwNjgyJykKKyNkZWZpbmUgTklDX0RCR19TVFJJTkcgICAgICAoIioqUlQyOHh4KioiKQorCisjaWZkZWYgU05NUF9TVVBQT1JUCisvLyBmb3Igc25tcAorLy8gdG8gZ2V0IG1hbnVmYWN0dXJlciBPVUksIGthdGh5LCAyMDA4XzAyMjAKKyNkZWZpbmUgTWFudWZhY3R1cmVyT1VJX0xFTgkJCTMKKyNkZWZpbmUgTWFudWZhY3R1cmVyTkFNRQkJCSgiUmFsaW5rIFRlY2hub2xvZ3kgQ29tcGFueS4iKQorI2RlZmluZQlSZXNvdXJjZVR5cGVJZE5hbWUJCQkoIlJhbGlua19JRCIpCisjZW5kaWYKKworCisvLyNkZWZpbmUgUEFDS0VECisKKyNkZWZpbmUgUkFMSU5LXzI4ODNfVkVSU0lPTgkJKChVSU5UMzIpMHgyODgzMDMwMCkKKyNkZWZpbmUgUkFMSU5LXzI4ODBFX1ZFUlNJT04JKChVSU5UMzIpMHgyODcyMDIwMCkKKyNkZWZpbmUgUkFMSU5LXzMwNzBfVkVSU0lPTgkJKChVSU5UMzIpMHgzMDcwMDIwMCkKKworLy8KKy8vIE5ESVMgdmVyc2lvbiBpbiB1c2UgYnkgdGhlIE5JQyBkcml2ZXIuCisvLyBUaGUgaGlnaCBieXRlIGlzIHRoZSBtYWpvciB2ZXJzaW9uLiBUaGUgbG93IGJ5dGUgaXMgdGhlIG1pbm9yIHZlcnNpb24uCisvLworI2lmZGVmICBORElTNTFfTUlOSVBPUlQKKyNkZWZpbmUgTklDX0RSSVZFUl9WRVJTSU9OICAgICAgMHgwNTAxCisjZWxzZQorI2RlZmluZSBOSUNfRFJJVkVSX1ZFUlNJT04gICAgICAweDA1MDAKKyNlbmRpZgorCisvLworLy8gTkRJUyBtZWRpYSB0eXBlLCBjdXJyZW50IGlzIGV0aGVybmV0LCBjaGFuZ2UgaWYgbmF0aXZlIHdpcmVsZXNzIHN1cHBvcnRlZAorLy8KKyNkZWZpbmUgTklDX01FRElBX1RZUEUgICAgICAgICAgTmRpc01lZGl1bTgwMl8zCisjZGVmaW5lIE5JQ19QQ0lfSERSX0xFTkdUSCAgICAgIDB4ZTIKKyNkZWZpbmUgTklDX01BWF9QQUNLRVRfU0laRSAgICAgMjMwNAorI2RlZmluZSBOSUNfSEVBREVSX1NJWkUgICAgICAgICAxNAorI2RlZmluZSBNQVhfTUFQX1JFR0lTVEVSU19ORUVERUQgMzIKKyNkZWZpbmUgTUlOX01BUF9SRUdJU1RFUlNfTkVFREVEIDIgICAvL1RvZG86IHNob3VsZCBjb25zaWRlciBmcmFnbWVudCBpc3N1ZS4KKworLy8KKy8vIGludGVyZmFjZSB0eXBlLCB3ZSB1c2UgUENJCisvLworI2RlZmluZSBOSUNfSU5URVJGQUNFX1RZUEUgICAgICBOZGlzSW50ZXJmYWNlUGNpCisjZGVmaW5lIE5JQ19JTlRFUlJVUFRfTU9ERSAgICAgIE5kaXNJbnRlcnJ1cHRMZXZlbFNlbnNpdGl2ZQorCisvLworLy8gYnVmZmVyIHNpemUgcGFzc2VkIGluIE5kaXNNUXVlcnlBZGFwdGVyUmVzb3VyY2VzCisvLyBXZSBzaG91bGQgb25seSBuZWVkIHRocmVlIGFkYXB0ZXIgcmVzb3VyY2VzIChJTywgaW50ZXJydXB0IGFuZCBtZW1vcnkpLAorLy8gU29tZSBkZXZpY2VzIGdldCBleHRyYSByZXNvdXJjZXMsIHNvIGhhdmUgcm9vbSBmb3IgMTAgcmVzb3VyY2VzCisvLyAgICAgICAgICAgICAgICAgICAgVUZfU0laRSAgIChzaXplb2YoTkRJU19SRVNPVVJDRV9MSVNUKSArICgxMCpzaXplb2YoQ01fUEFSVElBTF9SRVNPVVJDRV9ERVNDUklQVE9SKSkpCisKKworI2RlZmluZSBOSUNfUkVTT1VSQ0VfQi8vCisvLyBJTyBzcGFjZSBsZW5ndGgKKy8vCisjZGVmaW5lIE5JQ19NQVBfSU9TUEFDRV9MRU5HVEggIHNpemVvZihDU1JfU1RSVUMpCisKKyNkZWZpbmUgTUFYX1JYX1BLVF9MRU4JMTUyMAorCisvLworLy8gRW50cnkgbnVtYmVyIGZvciBlYWNoIERNQSBkZXNjcmlwdG9yIHJpbmcKKy8vCisKKworI2lmZGVmIFJUMjg3MAorI2RlZmluZSBUWF9SSU5HX1NJWkUgICAgICAgICAgICA4IC8vIDEKKyNkZWZpbmUgUFJJT19SSU5HX1NJWkUgICAgICAgICAgOAorI2RlZmluZSBNR01UX1JJTkdfU0laRSAgICAgICAzMiAvLyBQUklPX1JJTkdfU0laRQorI2RlZmluZSBSWF9SSU5HX1NJWkUgICAgICAgICAgICA4CisjZGVmaW5lIE1BWF9UWF9QUk9DRVNTICAgICAgICAgIDQKKyNkZWZpbmUgTE9DQUxfVFhCVUZfU0laRSAgICAgICAgMjA0OAorI2VuZGlmIC8vIFJUMjg3MCAvLworCisjaWZkZWYgTVVMVElQTEVfQ0FSRF9TVVBQT1JUCisvLyBNQzogTXVsdHBsZSBDYXJkcworI2RlZmluZSBNQVhfTlVNX09GX01VTFRJUExFX0NBUkQJCTMyCisjZW5kaWYgLy8gTVVMVElQTEVfQ0FSRF9TVVBQT1JUIC8vCisKKyNkZWZpbmUgTUFYX1JYX1BST0NFU1MgICAgICAgICAgMTI4IC8vNjQgLy8zMgorI2RlZmluZSBOVU1fT0ZfTE9DQUxfVFhCVUYgICAgICAyCisjZGVmaW5lIFRYRF9TSVpFICAgICAgICAgICAgICAgIDE2CisjZGVmaW5lIFRYV0lfU0laRSAgICAgICAgICAgICAgIDE2CisjZGVmaW5lIFJYRF9TSVpFICAgICAgICAgICAgICAgCTE2CisjZGVmaW5lIFJYV0lfU0laRSAgICAgICAgICAgICAJMTYKKy8vIFRYSU5GT19TSVpFICsgVFhXSV9TSVpFICsgODAyLjExIEhlYWRlciBTaXplICsgQU1TRFUgc3ViIGZyYW1lIGhlYWRlcgorI2RlZmluZSBUWF9ETUFfMVNUX0JVRkZFUl9TSVpFICA5NiAgICAvLyBvbmx5IHRoZSAxc3QgcGh5c2ljYWwgYnVmZmVyIGlzIHByZS1hbGxvY2F0ZWQKKyNkZWZpbmUgTUdNVF9ETUFfQlVGRkVSX1NJWkUgICAgMTUzNiAvLzIwNDgKKyNkZWZpbmUgUlhfQlVGRkVSX0FHR1JFU0laRSAgICAgMzg0MCAvLzM5MDQgLy8zOTY4IC8vNDA5NiAvLzIwNDggLy80MDk2CisjZGVmaW5lIFJYX0JVRkZFUl9OT1JNU0laRSAgICAgIDM4NDAgLy8zOTA0IC8vMzk2OCAvLzQwOTYgLy8yMDQ4IC8vNDA5NgorI2RlZmluZSBUWF9CVUZGRVJfTk9STVNJWkUJCVJYX0JVRkZFUl9OT1JNU0laRQorI2RlZmluZSBNQVhfRlJBTUVfU0laRSAgICAgICAgICAyMzQ2ICAgICAgICAgICAgICAgICAgICAvLyBNYXhpbXVtIDgwMi4xMSBmcmFtZSBzaXplCisjZGVmaW5lIE1BWF9BR0dSRUdBVElPTl9TSVpFICAgIDM4NDAgLy8zOTA0IC8vMzk2OCAvLzQwOTYKKyNkZWZpbmUgTUFYX05VTV9PRl9UVVBMRV9DQUNIRSAgMgorI2RlZmluZSBNQVhfTUNBU1RfTElTVF9TSVpFICAgICAzMgorI2RlZmluZSBNQVhfTEVOX09GX1ZFTkRPUl9ERVNDICA2NAorLy8jZGVmaW5lIE1BWF9TSVpFX09GX01DQVNUX1BTUSAgIChOVU1fT0ZfTE9DQUxfVFhCVUYgPj4gMikgLy8gQVAgd29uJ3Qgc3BlbmQgbW9yZSB0aGFuIDEvNCBvZiB0b3RhbCBidWZmZXJzIG9uIE0vQkNBU1QgUFNRCisjZGVmaW5lIE1BWF9TSVpFX09GX01DQVNUX1BTUSAgICAgICAgICAgICAgIDMyCisKKyNkZWZpbmUgTUFYX1JYX1BST0NFU1NfQ05UCShSWF9SSU5HX1NJWkUpCisKKworI2RlZmluZSBNQVhfUEFDS0VUU19JTl9RVUVVRQkJCQkoNTEyKSAvLyg1MTIpICAgIC8vIHRvIHBhc3MgV01NIEE1LVdQQVBTSworI2RlZmluZSBNQVhfUEFDS0VUU19JTl9NQ0FTVF9QU19RVUVVRQkJMzIKKyNkZWZpbmUgTUFYX1BBQ0tFVFNfSU5fUFNfUVVFVUUJCQkJMTI4CS8vMzIKKyNkZWZpbmUgV01NX05VTV9PRl9BQyAgICAgICAgICAgICAgICAgICAgICAgNCAgLyogQUMwLCBBQzEsIEFDMiwgYW5kIEFDMyAqLworCisKKworLy8gUnhGaWx0ZXIKKyNkZWZpbmUgU1RBTk9STUFMCSAweDE3Zjk3CisjZGVmaW5lIEFQTk9STUFMCSAweDE1Zjk3CisvLworLy8gIFJUTVBfQURBUFRFUiBmbGFncworLy8KKyNkZWZpbmUgZlJUTVBfQURBUFRFUl9NQVBfUkVHSVNURVIgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIGZSVE1QX0FEQVBURVJfSEFSRFdBUkVfRVJST1IgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgZlJUTVBfQURBUFRFUl9TQ0FUVEVSX0dBVEhFUiAgICAgICAgMHgwMDAwMDAwOAorI2RlZmluZSBmUlRNUF9BREFQVEVSX1NFTkRfUEFDS0VUX0VSUk9SICAgICAweDAwMDAwMDEwCisjZGVmaW5lIGZSVE1QX0FEQVBURVJfTUxNRV9SRVNFVF9JTl9QUk9HUkVTUyAweDAwMDAwMDIwCisjZGVmaW5lIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyAgICAgIDB4MDAwMDAwNDAKKyNkZWZpbmUgZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUyAgICAgMHgwMDAwMDA4MAorI2RlZmluZSBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QgICAgICAgICAweDAwMDAwMTAwCisjZGVmaW5lIGZSVE1QX0FEQVBURVJfVFhfUklOR19BTExPQ0FURUQgICAgIDB4MDAwMDAyMDAKKyNkZWZpbmUgZlJUTVBfQURBUFRFUl9SRU1PVkVfSU5fUFJPR1JFU1MgICAgMHgwMDAwMDQwMAorI2RlZmluZSBmUlRNUF9BREFQVEVSX01JTU9SQVRFX0lOVVNFRCAgICAgICAweDAwMDAwODAwCisjZGVmaW5lIGZSVE1QX0FEQVBURVJfUlhfUklOR19BTExPQ0FURUQgICAgIDB4MDAwMDEwMDAKKyNkZWZpbmUgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfQUNUSVZFICAgICAgMHgwMDAwMjAwMAorI2RlZmluZSBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTICAweDAwMDA0MDAwCisjZGVmaW5lCWZSVE1QX0FEQVBURVJfUkVBU1NPQ19JTl9QUk9HUkVTUwkweDAwMDA4MDAwCisjZGVmaW5lCWZSVE1QX0FEQVBURVJfTUVESUFfU1RBVEVfUEVORElORwkweDAwMDEwMDAwCisjZGVmaW5lCWZSVE1QX0FEQVBURVJfUkFESU9fT0ZGCQkJCTB4MDAwMjAwMDAKKyNkZWZpbmUgZlJUTVBfQURBUFRFUl9CVUxLT1VUX1JFU0VUCQkJMHgwMDA0MDAwMAorI2RlZmluZQlmUlRNUF9BREFQVEVSX0JVTEtJTl9SRVNFVAkJCTB4MDAwODAwMDAKKyNkZWZpbmUgZlJUTVBfQURBUFRFUl9SREdfQUNUSVZFCQkJMHgwMDEwMDAwMAorI2RlZmluZSBmUlRNUF9BREFQVEVSX0RZTkFNSUNfQkVfVFhPUF9BQ1RJVkUgMHgwMDIwMDAwMAorI2RlZmluZSBmUlRNUF9BREFQVEVSX1NDQU5fMjA0MCAJCQkweDA0MDAwMDAwCisjZGVmaW5lCWZSVE1QX0FEQVBURVJfUkFESU9fTUVBU1VSRU1FTlQJCTB4MDgwMDAwMDAKKworI2RlZmluZSBmUlRNUF9BREFQVEVSX1NUQVJUX1VQICAgICAgICAgCQkweDEwMDAwMDAwCS8vRGV2aXZlIGFscmVhZHkgaW5pdGlhbGl6ZWQgYW5kIGVuYWJsZWQgVHgvUnguCisjZGVmaW5lIGZSVE1QX0FEQVBURVJfTUVESUFfU1RBVEVfQ0hBTkdFICAgIDB4MjAwMDAwMDAKKyNkZWZpbmUgZlJUTVBfQURBUFRFUl9JRExFX1JBRElPX09GRiAgICAgICAgMHg0MDAwMDAwMAorCisvLyBMb2NrIGJpdCBmb3IgYWNjZXNzaW5nIGRpZmZlcmVudCByaW5nIGJ1ZmZlcnMKKy8vI2RlZmluZSBmUlRNUF9BREFQVEVSX1RYX1JJTkdfQlVTWSAgICAgICAgMHg4MDAwMDAwMAorLy8jZGVmaW5lIGZSVE1QX0FEQVBURVJfTUdNVF9SSU5HX0JVU1kgICAgICAweDQwMDAwMDAwCisvLyNkZWZpbmUgZlJUTVBfQURBUFRFUl9BVElNX1JJTkdfQlVTWSAgICAgIDB4MjAwMDAwMDAKKy8vI2RlZmluZSBmUlRNUF9BREFQVEVSX1JYX1JJTkdfQlVTWSAgICAgICAgMHgxMDAwMDAwMAorCisvLyBMb2NrIGJpdCBmb3IgYWNjZXNzaW5nIGRpZmZlcmVudCBxdWV1ZQorLy8jZGVmaW5lICAgZlJUTVBfQURBUFRFUl9UWF9RVUVVRV9CVVNZICAgICAweDA4MDAwMDAwCisvLyNkZWZpbmUgICBmUlRNUF9BREFQVEVSX01HTVRfUVVFVUVfQlVTWSAgIDB4MDQwMDAwMDAKKworLy8KKy8vICBTVEEgb3BlcmF0aW9uIHN0YXR1cyBmbGFncworLy8KKyNkZWZpbmUgZk9QX1NUQVRVU19JTkZSQV9PTiAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBmT1BfU1RBVFVTX0FESE9DX09OICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIGZPUF9TVEFUVVNfQkdfUFJPVEVDVElPTl9JTlVTRUQgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgZk9QX1NUQVRVU19TSE9SVF9TTE9UX0lOVVNFRCAgICAgICAgMHgwMDAwMDAwOAorI2RlZmluZSBmT1BfU1RBVFVTX1NIT1JUX1BSRUFNQkxFX0lOVVNFRCAgICAweDAwMDAwMDEwCisjZGVmaW5lIGZPUF9TVEFUVVNfUkVDRUlWRV9EVElNICAgICAgICAgICAgIDB4MDAwMDAwMjAKKy8vI2RlZmluZSBmT1BfU1RBVFVTX1RYX1JBVEVfU1dJVENIX0VOQUJMRUQgICAweDAwMDAwMDQwCisjZGVmaW5lIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEICAgIDB4MDAwMDAwODAKKyNkZWZpbmUgZk9QX1NUQVRVU19XTU1fSU5VU0VEICAgICAgICAgICAgICAgMHgwMDAwMDEwMAorI2RlZmluZSBmT1BfU1RBVFVTX0FHR1JFR0FUSU9OX0lOVVNFRCAgICAgICAweDAwMDAwMjAwCisjZGVmaW5lIGZPUF9TVEFUVVNfRE9aRSAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0MDAgIC8vIGRlYnVnIHB1cnBvc2UKKyNkZWZpbmUgZk9QX1NUQVRVU19QSUdHWUJBQ0tfSU5VU0VEICAgICAgICAgMHgwMDAwMDgwMCAgLy8gcGlnZ3ktYmFjaywgYW5kIGFnZ3JlZ2F0aW9uCisjZGVmaW5lIGZPUF9TVEFUVVNfQVBTRF9JTlVTRUQJCQkJMHgwMDAwMTAwMAorI2RlZmluZSBmT1BfU1RBVFVTX1RYX0FNU0RVX0lOVVNFRAkJCTB4MDAwMDIwMDAKKyNkZWZpbmUgZk9QX1NUQVRVU19NQVhfUkVUUllfRU5BQkxFRAkJMHgwMDAwNDAwMAorI2RlZmluZSBmT1BfU1RBVFVTX1dBS0VVUF9OT1cgICAgICAgICAgICAgICAweDAwMDA4MDAwCisjZGVmaW5lIGZPUF9TVEFUVVNfQURWQU5DRV9QT1dFUl9TQVZFX1BDSUVfREVWSUNFICAgICAgIDB4MDAwMjAwMDAKKworI2lmZGVmIERPVDExTl9EUkFGVDMKKyNkZWZpbmUgZk9QX1NUQVRVU19TQ0FOXzIwNDAgICAgICAgICAgICAgICAJICAgIDB4MDAwNDAwMDAKKyNlbmRpZiAvLyBET1QxMU5fRFJBRlQzIC8vCisKKyNkZWZpbmUgQ0NLU0VUUFJPVEVDVAkJMHgxCisjZGVmaW5lIE9GRE1TRVRQUk9URUNUCQkweDIKKyNkZWZpbmUgTU0yMFNFVFBST1RFQ1QJCTB4NAorI2RlZmluZSBNTTQwU0VUUFJPVEVDVAkJMHg4CisjZGVmaW5lIEdGMjBTRVRQUk9URUNUCQkweDEwCisjZGVmaW5lIEdSNDBTRVRQUk9URUNUCQkweDIwCisjZGVmaW5lIEFMTE5fU0VUUFJPVEVDVAkJKEdSNDBTRVRQUk9URUNUIHwgR0YyMFNFVFBST1RFQ1QgfCBNTTQwU0VUUFJPVEVDVCB8IE1NMjBTRVRQUk9URUNUKQorCisvLworLy8gIEFQJ3MgY2xpZW50IHRhYmxlIG9wZXJhdGlvbiBzdGF0dXMgZmxhZ3MKKy8vCisjZGVmaW5lIGZDTElFTlRfU1RBVFVTX1dNTV9DQVBBQkxFICAgICAgICAgIDB4MDAwMDAwMDEgIC8vIENMSUVOVCBjYW4gcGFyc2UgUU9TIERBVEEgZnJhbWUKKyNkZWZpbmUgZkNMSUVOVF9TVEFUVVNfQUdHUkVHQVRJT05fQ0FQQUJMRSAgMHgwMDAwMDAwMiAgLy8gQ0xJRU5UIGNhbiByZWNlaXZlIFJhbGluaydzIHByb3ByaWV0YXJ5IFRYIGFnZ3JlZ2F0aW9uIGZyYW1lCisjZGVmaW5lIGZDTElFTlRfU1RBVFVTX1BJR0dZQkFDS19DQVBBQkxFICAgIDB4MDAwMDAwMDQgIC8vIENMSUVOVCBzdXBwb3J0IHBpZ2d5LWJhY2sKKyNkZWZpbmUgZkNMSUVOVF9TVEFUVVNfQU1TRFVfSU5VU0VECQkJMHgwMDAwMDAwOAorI2RlZmluZSBmQ0xJRU5UX1NUQVRVU19TR0kyMF9DQVBBQkxFCQkweDAwMDAwMDEwCisjZGVmaW5lIGZDTElFTlRfU1RBVFVTX1NHSTQwX0NBUEFCTEUJCTB4MDAwMDAwMjAKKyNkZWZpbmUgZkNMSUVOVF9TVEFUVVNfVHhTVEJDX0NBUEFCTEUJCTB4MDAwMDAwNDAKKyNkZWZpbmUgZkNMSUVOVF9TVEFUVVNfUnhTVEJDX0NBUEFCTEUJCTB4MDAwMDAwODAKKyNkZWZpbmUgZkNMSUVOVF9TVEFUVVNfSFRDX0NBUEFCTEUJCQkweDAwMDAwMTAwCisjZGVmaW5lIGZDTElFTlRfU1RBVFVTX1JER19DQVBBQkxFCQkJMHgwMDAwMDIwMAorI2RlZmluZSBmQ0xJRU5UX1NUQVRVU19NQ1NGRUVEQkFDS19DQVBBQkxFICAweDAwMDAwNDAwCisjZGVmaW5lIGZDTElFTlRfU1RBVFVTX0FQU0RfQ0FQQUJMRSAgICAgICAgIDB4MDAwMDA4MDAgIC8qIFVBUFNEIFNUQVRJT04gKi8KKworI2lmZGVmIERPVDExTl9EUkFGVDMKKyNkZWZpbmUgZkNMSUVOVF9TVEFUVVNfQlNTQ09FWElTVF9DQVBBQkxFCTB4MDAwMDEwMDAKKyNlbmRpZiAvLyBET1QxMU5fRFJBRlQzIC8vCisKKyNkZWZpbmUgZkNMSUVOVF9TVEFUVVNfUkFMSU5LX0NISVBTRVQJCTB4MDAxMDAwMDAKKy8vCisvLyAgU1RBIGNvbmZpZ3VyYXRpb24gZmxhZ3MKKy8vCisvLyNkZWZpbmUgZlNUQV9DRkdfRU5BQkxFX1RYX0JVUlNUICAgICAgICAgIDB4MDAwMDAwMDEKKworLy8gODAyLjExbiBPcGVyYXRpbmcgTW9kZSBEZWZpbml0aW9uLiAwLTMgYWxzbyB1c2VkIGluIEFTSUNVUGRhdGVQcm90ZWN0IHN3aXRjaCBjYXNlCisjZGVmaW5lIEhUX05PX1BST1RFQ1QJMAorI2RlZmluZSBIVF9MRUdBQ1lfUFJPVEVDVAkxCisjZGVmaW5lIEhUXzQwX1BST1RFQ1QJMgorI2RlZmluZSBIVF8yMDQwX1BST1RFQ1QJMworI2RlZmluZSBIVF9SVFNDVFNfNk0JNworLy9mb2xsb3dpbmcgaXMgb3VyIG93biBkZWZpbml0aW9uIGluIG9yZGVyIHRvIHR1cm4gb24gb3VyIEFTSUMgcHJvdGVjdGlvbiByZWdpc3RlciBpbiBJTkZSQVNUUlVDVFVSRS4KKyNkZWZpbmUgSFRfQVRIRVJPUwk4CS8vIHJ0Mjg2MGMgaGFzIHByb2JsZW0gd2l0aCBhdGhlcm9zIGNoaXAuIHdlIG5lZWQgdG8gdHVybiBvbiBSVFMvQ1RTIC4KKyNkZWZpbmUgSFRfRk9SQ0VSVFNDVFMJOQkvLyBGb3JjZSB0dXJuIG9uIFJUUy9DVFMgZmlyc3QuIHRoZW4gZ28gdG8gZXZhbHVhdGUgaWYgdGhpcyBmb3JjZSBSVFMgaXMgbmVjZXNzYXJ5LgorCisvLworLy8gUlggUGFja2V0IEZpbHRlciBjb250cm9sIGZsYWdzLiBBcHBseSBvbiBwQWQtPlBhY2tldEZpbHRlcgorLy8KKyNkZWZpbmUgZlJYX0ZJTFRFUl9BQ0NFUFRfRElSRUNUICAgICAgICAgICAgTkRJU19QQUNLRVRfVFlQRV9ESVJFQ1RFRAorI2RlZmluZSBmUlhfRklMVEVSX0FDQ0VQVF9NVUxUSUNBU1QgICAgICAgICBORElTX1BBQ0tFVF9UWVBFX01VTFRJQ0FTVAorI2RlZmluZSBmUlhfRklMVEVSX0FDQ0VQVF9CUk9BRENBU1QgICAgICAgICBORElTX1BBQ0tFVF9UWVBFX0JST0FEQ0FTVAorI2RlZmluZSBmUlhfRklMVEVSX0FDQ0VQVF9BTExfTVVMVElDQVNUICAgICBORElTX1BBQ0tFVF9UWVBFX0FMTF9NVUxUSUNBU1QKKworLy8KKy8vIEVycm9yIGNvZGUgc2VjdGlvbgorLy8KKy8vIE5ESVNfRVJST1JfQ09ERV9BREFQVEVSX05PVF9GT1VORAorI2RlZmluZSBFUlJMT0dfUkVBRF9QQ0lfU0xPVF9GQUlMRUQgICAgIDB4MDAwMDAxMDFMCisjZGVmaW5lIEVSUkxPR19XUklURV9QQ0lfU0xPVF9GQUlMRUQgICAgMHgwMDAwMDEwMkwKKyNkZWZpbmUgRVJSTE9HX1ZFTkRPUl9ERVZJQ0VfTk9NQVRDSCAgICAweDAwMDAwMTAzTAorCisvLyBORElTX0VSUk9SX0NPREVfQURBUFRFUl9ESVNBQkxFRAorI2RlZmluZSBFUlJMT0dfQlVTX01BU1RFUl9ESVNBQkxFRCAgICAgIDB4MDAwMDAyMDFMCisKKy8vIE5ESVNfRVJST1JfQ09ERV9VTlNVUFBPUlRFRF9DT05GSUdVUkFUSU9OCisjZGVmaW5lIEVSUkxPR19JTlZBTElEX1NQRUVEX0RVUExFWCAgICAgMHgwMDAwMDMwMUwKKyNkZWZpbmUgRVJSTE9HX1NFVF9TRUNPTkRBUllfRkFJTEVEICAgICAweDAwMDAwMzAyTAorCisvLyBORElTX0VSUk9SX0NPREVfT1VUX09GX1JFU09VUkNFUworI2RlZmluZSBFUlJMT0dfT1VUX09GX01FTU9SWSAgICAgICAgICAgIDB4MDAwMDA0MDFMCisjZGVmaW5lIEVSUkxPR19PVVRfT0ZfU0hBUkVEX01FTU9SWSAgICAgMHgwMDAwMDQwMkwKKyNkZWZpbmUgRVJSTE9HX09VVF9PRl9NQVBfUkVHSVNURVJTICAgICAweDAwMDAwNDAzTAorI2RlZmluZSBFUlJMT0dfT1VUX09GX0JVRkZFUl9QT09MICAgICAgIDB4MDAwMDA0MDRMCisjZGVmaW5lIEVSUkxPR19PVVRfT0ZfTkRJU19CVUZGRVIgICAgICAgMHgwMDAwMDQwNUwKKyNkZWZpbmUgRVJSTE9HX09VVF9PRl9QQUNLRVRfUE9PTCAgICAgICAweDAwMDAwNDA2TAorI2RlZmluZSBFUlJMT0dfT1VUX09GX05ESVNfUEFDS0VUICAgICAgIDB4MDAwMDA0MDdMCisjZGVmaW5lIEVSUkxPR19PVVRfT0ZfTE9PS0FTSURFX01FTU9SWSAgMHgwMDAwMDQwOEwKKworLy8gTkRJU19FUlJPUl9DT0RFX0hBUkRXQVJFX0ZBSUxVUkUKKyNkZWZpbmUgRVJSTE9HX1NFTEZURVNUX0ZBSUxFRCAgICAgICAgICAweDAwMDAwNTAxTAorI2RlZmluZSBFUlJMT0dfSU5JVElBTElaRV9BREFQVEVSICAgICAgIDB4MDAwMDA1MDJMCisjZGVmaW5lIEVSUkxPR19SRU1PVkVfTUlOSVBPUlQgICAgICAgICAgMHgwMDAwMDUwM0wKKworLy8gTkRJU19FUlJPUl9DT0RFX1JFU09VUkNFX0NPTkZMSUNUCisjZGVmaW5lIEVSUkxPR19NQVBfSU9fU1BBQ0UgICAgICAgICAgICAgMHgwMDAwMDYwMUwKKyNkZWZpbmUgRVJSTE9HX1FVRVJZX0FEQVBURVJfUkVTT1VSQ0VTICAweDAwMDAwNjAyTAorI2RlZmluZSBFUlJMT0dfTk9fSU9fUkVTT1VSQ0UgICAgICAgICAgIDB4MDAwMDA2MDNMCisjZGVmaW5lIEVSUkxPR19OT19JTlRFUlJVUFRfUkVTT1VSQ0UgICAgMHgwMDAwMDYwNEwKKyNkZWZpbmUgRVJSTE9HX05PX01FTU9SWV9SRVNPVVJDRSAgICAgICAweDAwMDAwNjA1TAorCisKKy8vIFdEUyBkZWZpbml0aW9uCisjZGVmaW5lCU1BWF9XRFNfRU5UUlkgICAgICAgICAgICAgICA0CisjZGVmaW5lIFdEU19QQUlSV0lTRV9LRVlfT0ZGU0VUICAgICA2MCAgICAvLyBXRFMgbGlua3MgdXNlcyBwYWlyd2lzZSBrZXkjNjAgfiA2MyBpbiBBU0lDIHBhaXJ3aXNlIGtleSB0YWJsZQorCisjZGVmaW5lCVdEU19ESVNBQkxFX01PREUgICAgICAgICAgICAwCisjZGVmaW5lCVdEU19SRVNUUklDVF9NT0RFICAgICAgICAgICAxCisjZGVmaW5lCVdEU19CUklER0VfTU9ERSAgICAgICAgICAgICAyCisjZGVmaW5lCVdEU19SRVBFQVRFUl9NT0RFICAgICAgICAgICAzCisjZGVmaW5lCVdEU19MQVpZX01PREUgICAgICAgICAgICAgICA0CisKKworI2RlZmluZSBNQVhfTUVTSF9OVU0JCQkJMAorCisjZGVmaW5lIE1BWF9BUENMSV9OVU0JCQkJMAorI2lmZGVmIEFQQ0xJX1NVUFBPUlQKKyN1bmRlZglNQVhfQVBDTElfTlVNCisjZGVmaW5lIE1BWF9BUENMSV9OVU0JCQkJMQorI2VuZGlmIC8vIEFQQ0xJX1NVUFBPUlQgLy8KKworI2RlZmluZSBNQVhfTUJTU0lEX05VTQkJCQkxCisKKy8qIHNhbml0eSBjaGVjayBmb3IgYXBpZHggKi8KKyNkZWZpbmUgTUJTU19NUl9BUElEWF9TQU5JVFlfQ0hFQ0soYXBpZHgpIFwKKyAgICB7IGlmIChhcGlkeCA+IE1BWF9NQlNTSURfTlVNKSB7IFwKKyAgICAgICAgICBwcmludGsoIiVzPiBFcnJvciEgYXBpZHggPSAlZCA+IE1BWF9NQlNTSURfTlVNIVxuIiwgX19mdW5jX18sIGFwaWR4KTsgXAorCSAgYXBpZHggPSBNQUlOX01CU1NJRDsgfSB9CisKKyNkZWZpbmUgVkFMSURfV0NJRChfd2NpZCkJKChfd2NpZCkgPiAwICYmIChfd2NpZCkgPCBNQVhfTEVOX09GX01BQ19UQUJMRSApCisKKyNkZWZpbmUgTUFJTl9NQlNTSUQgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgRklSU1RfTUJTU0lEICAgICAgICAgICAgICAgIDEKKworCisjZGVmaW5lIE1BWF9CRUFDT05fU0laRQkJCQk1MTIKKy8vIElmIHRoZSBNQVhfTUJTU0lEX05VTSBpcyBsYXJnZXIgdGhhbiA2LAorLy8gaXQgc2hhbGwgcmVzZXJ2ZSBzb21lIFdDSUQgc3BhY2Uod2NpZCAyMjJ+MjUzKSBmb3IgYmVhY29uIGZyYW1lcy4KKy8vIC0JdGhlc2Ugd2NpZCAyMzh+MjUzIGFyZSByZXNlcnZlZCBmb3IgYmVhY29uIzYocmE2KS4KKy8vIC0JdGhlc2Ugd2NpZCAyMjJ+MjM3IGFyZSByZXNlcnZlZCBmb3IgYmVhY29uIzcocmE3KS4KKyNpZiBkZWZpbmVkKE1BWF9NQlNTSURfTlVNKSAmJiAoTUFYX01CU1NJRF9OVU0gPT0gOCkKKyNkZWZpbmUgSFdfUkVTRVJWRURfV0NJRAkyMjIKKyNlbGlmIGRlZmluZWQoTUFYX01CU1NJRF9OVU0pICYmIChNQVhfTUJTU0lEX05VTSA9PSA3KQorI2RlZmluZSBIV19SRVNFUlZFRF9XQ0lECTIzOAorI2Vsc2UKKyNkZWZpbmUgSFdfUkVTRVJWRURfV0NJRAkyNTUKKyNlbmRpZgorCisvLyBUaGVuIGRlZGljYXRlIHdjaWQgb2YgREZTIGFuZCBDYXJyaWVyLVNlbnNlLgorI2RlZmluZSBERlNfQ1RTX1dDSUQgCQkoSFdfUkVTRVJWRURfV0NJRCAtIDEpCisjZGVmaW5lIENTX0NUU19XQ0lEIAkJKEhXX1JFU0VSVkVEX1dDSUQgLSAyKQorI2RlZmluZSBMQVNUX1NQRUNJRklDX1dDSUQJKEhXX1JFU0VSVkVEX1dDSUQgLSAyKQorCisvLyBJZiBNQVhfTUJTU0lEX05VTSBpcyA4LCB0aGUgbWF4aW11bSBhdmFpbGFibGUgd2NpZCBmb3IgdGhlIGFzc29jaWF0ZWQgU1RBIGlzIDIxMS4KKy8vIElmIE1BWF9NQlNTSURfTlVNIGlzIDcsIHRoZSBtYXhpbXVtIGF2YWlsYWJsZSB3Y2lkIGZvciB0aGUgYXNzb2NpYXRlZCBTVEEgaXMgMjI4LgorI2RlZmluZSBNQVhfQVZBSUxBQkxFX0NMSUVOVF9XQ0lECShMQVNUX1NQRUNJRklDX1dDSUQgLSBNQVhfTUJTU0lEX05VTSAtIDEpCisKKy8vIFRYIG5lZWQgV0NJRCB0byBmaW5kIENpcGhlciBLZXkKKy8vIHRoZXNlIHdjaWQgMjEyIH4gMjE5IGFyZSByZXNlcnZlZCBmb3IgYmMvbWMgcGFja2V0cyBpZiBNQVhfTUJTU0lEX05VTSBpcyA4LgorI2RlZmluZSBHRVRfR3JvdXBLZXlfV0NJRChfX3djaWQsIF9fYnNzaWR4KSBcCisJewkJCQkJCQkJCQlcCisJCV9fd2NpZCA9IExBU1RfU1BFQ0lGSUNfV0NJRCAtIChNQVhfTUJTU0lEX05VTSkgKyBfX2Jzc2lkeDsJXAorCX0KKworI2RlZmluZSBJc0dyb3VwS2V5V0NJRChfX3djaWQpICgoKF9fd2NpZCkgPCBMQVNUX1NQRUNJRklDX1dDSUQpICYmICgoX193Y2lkKSA+PSAoTEFTVF9TUEVDSUZJQ19XQ0lEIC0gKE1BWF9NQlNTSURfTlVNKSkpKQorCisKKy8vIGRlZmluaXRpb24gdG8gc3VwcG9ydCBtdWx0aXBsZSBCU1NJRAorI2RlZmluZSBCU1MwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQlNTMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEJTUzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBCU1MzICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgQlNTNCAgICAgICAgICAgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIEJTUzUgICAgICAgICAgICAgICAgICAgICAgICAgICAgNQorI2RlZmluZSBCU1M2ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYKKyNkZWZpbmUgQlNTNyAgICAgICAgICAgICAgICAgICAgICAgICAgICA3CisKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIExlbmd0aCBkZWZpbml0aW9ucworI2RlZmluZSBQRUVSX0tFWV9OTyAgICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgTUFDX0FERFJfTEVOICAgICAgICAgICAgICAgICAgICA2CisjZGVmaW5lIFRJTUVTVEFNUF9MRU4gICAgICAgICAgICAgICAgICAgOAorI2RlZmluZSBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUyAgICAgIE1BWF9MRU5HVEhfT0ZfU1VQUE9SVF9SQVRFUyAvLyAxLCAyLCA1LjUsIDExLCA2LCA5LCAxMiwgMTgsIDI0LCAzNiwgNDgsIDU0CisjZGVmaW5lIE1BWF9MRU5fT0ZfS0VZICAgICAgICAgICAgICAgICAgMzIgICAgICAvLyAzMiBvY3RldHMgPT0gMjU2IGJpdHMsIFJlZGVmaW5lIGZvciBXUEEKKyNkZWZpbmUgTUFYX05VTV9PRl9DSEFOTkVMUyAgICAgICAgICAgICBNQVhfTlVNX09GX0NIUyAgICAgIC8vIDE0IGNoYW5uZWxzIEAyLjRHICsgIDEyQFVOSUkgKyA0IEBNTUFDICsgMTEgQEhpcGVyTEFOMiArIDcgQEphcGFuICsgMSBhcyBOVUxMIHRlcm1pbmF0aW9uCisjZGVmaW5lIE1BWF9OVU1fT0ZfMTFKQ0hBTk5FTFMgICAgICAgICAgICAgMjAgICAgICAvLyAxNCBjaGFubmVscyBAMi40RyArICAxMkBVTklJICsgNCBATU1BQyArIDExIEBIaXBlckxBTjIgKyA3IEBKYXBhbiArIDEgYXMgTlVMTCB0ZXJtaW5hdGlvbgorI2RlZmluZSBNQVhfTEVOX09GX1NTSUQgICAgICAgICAgICAgICAgIDMyCisjZGVmaW5lIENJUEhFUl9URVhUX0xFTiAgICAgICAgICAgICAgICAgMTI4CisjZGVmaW5lIEhBU0hfVEFCTEVfU0laRSAgICAgICAgICAgICAgICAgMjU2CisjZGVmaW5lIE1BWF9WSUVfTEVOICAgICAgICAgICAgICAgICAgICAgMTAyNCAgIC8vIE5ldyBmb3IgV1BBIGNpcGhlciBzdWl0ZSB2YXJpYWJsZSBJRSBzaXplcy4KKyNkZWZpbmUgTUFYX1NVUFBPUlRfTUNTICAgICAgICAgICAgIDMyCisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBBU0lDIFdDSUQgVGFibGUgZGVmaW5pdGlvbi4KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjZGVmaW5lIEJTU0lEX1dDSUQJCTEJLy8gaW4gaW5mcmEgbW9kZSwgYWx3YXlzIHB1dCBic3NpZCB3aXRoIHRoaXMgV0NJRAorI2RlZmluZSBNQ0FTVF9XQ0lECTB4MAorI2RlZmluZSBCU1MwTWNhc3RfV0NJRAkweDAKKyNkZWZpbmUgQlNTMU1jYXN0X1dDSUQJMHhmOAorI2RlZmluZSBCU1MyTWNhc3RfV0NJRAkweGY5CisjZGVmaW5lIEJTUzNNY2FzdF9XQ0lECTB4ZmEKKyNkZWZpbmUgQlNTNE1jYXN0X1dDSUQJMHhmYgorI2RlZmluZSBCU1M1TWNhc3RfV0NJRAkweGZjCisjZGVmaW5lIEJTUzZNY2FzdF9XQ0lECTB4ZmQKKyNkZWZpbmUgQlNTN01jYXN0X1dDSUQJMHhmZQorI2RlZmluZSBSRVNFUlZFRF9XQ0lECQkweGZmCisKKyNkZWZpbmUgTUFYX05VTV9PRl9BQ0xfTElTVAkJCQlNQVhfTlVNQkVSX09GX0FDTAorCisjZGVmaW5lIE1BWF9MRU5fT0ZfTUFDX1RBQkxFICAgICAgICAgICAgTUFYX05VTUJFUl9PRl9NQUMgLy8gaWYgTUFYX01CU1NJRF9OVU0gaXMgOCwgdGhpcyB2YWx1ZSBjYW4ndCBiZSBsYXJnZXIgdGhhbiAyMTEKKworI2lmIE1BWF9MRU5fT0ZfTUFDX1RBQkxFPk1BWF9BVkFJTEFCTEVfQ0xJRU5UX1dDSUQKKyNlcnJvciBNQVhfTEVOX09GX01BQ19UQUJMRSBjYW4gbm90IGJlIGxhcmdlciB0aGFuIE1BWF9BVkFJTEFCTEVfQ0xJRU5UX1dDSUQhISEhCisjZW5kaWYKKworI2RlZmluZSBNQVhfTlVNX09GX1dEU19MSU5LX1BFUkJTU0lECSAgICAgICAgICAgIDMKKyNkZWZpbmUgTUFYX05VTV9PRl9XRFNfTElOSwkgICAgICAgICAgICAoTUFYX05VTV9PRl9XRFNfTElOS19QRVJCU1NJRCpNQVhfTUJTU0lEX05VTSkKKyNkZWZpbmUgTUFYX05VTV9PRl9FVkVOVCAgICAgICAgICAgICAgICBNQVhfTlVNQkVSX09GX0VWRU5UCisjZGVmaW5lIFdEU19MSU5LX1NUQVJUX1dDSUQJCQkJKE1BWF9MRU5fT0ZfTUFDX1RBQkxFLTEpCisKKyNkZWZpbmUgTlVNX09GX1RJRAkJCTgKKyNkZWZpbmUgTUFYX0FJRF9CQSAgICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBNQVhfTEVOX09GX0JBX1JFQ19UQUJMRSAgICAgICAgICAoKE5VTV9PRl9USUQgKiBNQVhfTEVOX09GX01BQ19UQUJMRSkvMikvLyAgIChOVU1fT0ZfVElEKk1BWF9BSURfQkEgKyAzMikJIC8vQmxvY2sgQUNLIHJlY2lwaWVudAorI2RlZmluZSBNQVhfTEVOX09GX0JBX09SSV9UQUJMRSAgICAgICAgICAoKE5VTV9PRl9USUQgKiBNQVhfTEVOX09GX01BQ19UQUJMRSkvMikvLyAgIChOVU1fT0ZfVElEKk1BWF9BSURfQkEgKyAzMikgICAvLyBCbG9jayBBQ0sgb3JpZ2luYXRvcgorI2RlZmluZSBNQVhfTEVOX09GX0JTU19UQUJMRSAgICAgICAgICAgICA2NAorI2RlZmluZSBNQVhfUkVPUkRFUklOR19NUERVX05VTQkJCSA1MTIKKworLy8ga2V5IHJlbGF0ZWQgZGVmaW5pdGlvbnMKKyNkZWZpbmUgU0hBUkVfS0VZX05VTSAgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIE1BWF9MRU5fT0ZfU0hBUkVfS0VZICAgICAgICAgICAgMTYgICAgLy8gYnl0ZSBjb3VudAorI2RlZmluZSBNQVhfTEVOX09GX1BFRVJfS0VZICAgICAgICAgICAgIDE2ICAgIC8vIGJ5dGUgY291bnQKKyNkZWZpbmUgUEFJUldJU0VfS0VZX05VTSAgICAgICAgICAgICAgICA2NCAgICAvLyBpbiBNQUMgQVNJQyBwYWlyd2lzZSBrZXkgdGFibGUKKyNkZWZpbmUgR1JPVVBfS0VZX05VTSAgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIFBNS19MRU4gICAgICAgICAgICAgICAgICAgICAgICAgMzIKKyNkZWZpbmUgV0RTX1BBSVJXSVNFX0tFWV9PRkZTRVQgICAgICAgICA2MCAgICAvLyBXRFMgbGlua3MgdXNlcyBwYWlyd2lzZSBrZXkjNjAgfiA2MyBpbiBBU0lDIHBhaXJ3aXNlIGtleSB0YWJsZQorI2RlZmluZQlQTUtJRF9OTyAgICAgICAgICAgICAgICAgICAgICAgIDQgICAgIC8vIE51bWJlciBvZiBQTUtJRCBzYXZlZCBzdXBwb3J0ZWQKKyNkZWZpbmUgTUFYX0xFTl9PRl9NTE1FX0JVRkZFUiAgICAgICAgICAyMDQ4CisKKy8vIHBvd2VyIHN0YXR1cyByZWxhdGVkIGRlZmluaXRpb25zCisjZGVmaW5lIFBXUl9BQ1RJVkUgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBQV1JfU0FWRSAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgUFdSX01NUFMgICAgICAgICAgICAgICAgICAgICAgICAyCQkJLy9NSU1PIHBvd2VyIHNhdmUKKy8vI2RlZmluZSBQV1JfVU5LTk9XTiAgICAgICAgICAgICAgICAgICAyCisKKy8vIEF1dGggYW5kIEFzc29jIG1vZGUgcmVsYXRlZCBkZWZpbml0aW9ucworI2RlZmluZSBBVVRIX01PREVfT1BFTiAgICAgICAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgQVVUSF9NT0RFX0tFWSAgICAgICAgICAgICAgICAgICAweDAxCisvLyNkZWZpbmUgQVVUSF9NT0RFX0FVVE9fU1dJVENIICAgICAgICAgMHgwMworLy8jZGVmaW5lIEFVVEhfTU9ERV9ERUFVVEggICAgICAgICAgICAgIDB4MDQKKy8vI2RlZmluZSBBVVRIX01PREVfVVBMQVlFUiAgICAgICAgICAgICAweDA1IC8vIHJlc2VydmVkIGZvciA4MDIuMTFpIHVzZQorCisvLyBCU1MgVHlwZSBkZWZpbml0aW9ucworI2RlZmluZSBCU1NfQURIT0MgICAgICAgICAgICAgICAgICAgICAgIDAgIC8vID0gTmRpczgwMl8xMUlCU1MKKyNkZWZpbmUgQlNTX0lORlJBICAgICAgICAgICAgICAgICAgICAgICAxICAvLyA9IE5kaXM4MDJfMTFJbmZyYXN0cnVjdHVyZQorI2RlZmluZSBCU1NfQU5ZICAgICAgICAgICAgICAgICAgICAgICAgIDIgIC8vID0gTmRpczgwMl8xMUF1dG9Vbmtub3duCisjZGVmaW5lIEJTU19NT05JVE9SCQkJICAgICAgICAgICAgMyAgLy8gPSBOZGlzODAyXzExTW9uaXRvcgorCisKKy8vIFJlYXNvbiBjb2RlIGRlZmluaXRpb25zCisjZGVmaW5lIFJFQVNPTl9SRVNFUlZFRCAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBSRUFTT05fVU5TUEVDSUZZICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgUkVBU09OX05PX0xPTkdFUl9WQUxJRCAgICAgICAgICAyCisjZGVmaW5lIFJFQVNPTl9ERUFVVEhfU1RBX0xFQVZJTkcgICAgICAgMworI2RlZmluZSBSRUFTT05fRElTQVNTT0NfSU5BQ1RJVkUgICAgICAgIDQKKyNkZWZpbmUgUkVBU09OX0RJU0FTU1BDX0FQX1VOQUJMRSAgICAgICA1CisjZGVmaW5lIFJFQVNPTl9DTFMyRVJSICAgICAgICAgICAgICAgICAgNgorI2RlZmluZSBSRUFTT05fQ0xTM0VSUiAgICAgICAgICAgICAgICAgIDcKKyNkZWZpbmUgUkVBU09OX0RJU0FTU09DX1NUQV9MRUFWSU5HICAgICA4CisjZGVmaW5lIFJFQVNPTl9TVEFfUkVRX0FTU09DX05PVF9BVVRIICAgOQorI2RlZmluZSBSRUFTT05fSU5WQUxJRF9JRSAgICAgICAgICAgICAgIDEzCisjZGVmaW5lIFJFQVNPTl9NSUNfRkFJTFVSRSAgICAgICAgICAgICAgMTQKKyNkZWZpbmUgUkVBU09OXzRfV0FZX1RJTUVPVVQgICAgICAgICAgICAxNQorI2RlZmluZSBSRUFTT05fR1JPVVBfS0VZX0hTX1RJTUVPVVQgICAgIDE2CisjZGVmaW5lIFJFQVNPTl9JRV9ESUZGRVJFTlQgICAgICAgICAgICAgMTcKKyNkZWZpbmUgUkVBU09OX01DSVBIRVJfTk9UX1ZBTElEICAgICAgICAxOAorI2RlZmluZSBSRUFTT05fVUNJUEhFUl9OT1RfVkFMSUQgICAgICAgIDE5CisjZGVmaW5lIFJFQVNPTl9BS01QX05PVF9WQUxJRCAgICAgICAgICAgMjAKKyNkZWZpbmUgUkVBU09OX1VOU1VQUE9SVF9SU05FX1ZFUiAgICAgICAyMQorI2RlZmluZSBSRUFTT05fSU5WQUxJRF9SU05FX0NBUCAgICAgICAgIDIyCisjZGVmaW5lIFJFQVNPTl84MDIxWF9BVVRIX0ZBSUwgICAgICAgICAgMjMKKyNkZWZpbmUgUkVBU09OX0NJUEhFUl9TVUlURV9SRUpFQ1RFRCAgICAyNAorI2RlZmluZSBSRUFTT05fREVDTElORUQgICAgICAgICAgICAgICAgIDM3CisKKyNkZWZpbmUgUkVBU09OX1FPU19VTlNQRUNJRlkgICAgICAgICAgICAgIDMyCisjZGVmaW5lIFJFQVNPTl9RT1NfTEFDS19CQU5EV0lEVEggICAgICAgICAzMworI2RlZmluZSBSRUFTT05fUE9PUl9DSEFOTkVMX0NPTkRJVElPTiAgICAgMzQKKyNkZWZpbmUgUkVBU09OX1FPU19PVVRTSURFX1RYT1BfTElNSVRJT04gIDM1CisjZGVmaW5lIFJFQVNPTl9RT1NfUVNUQV9MRUFWSU5HX1FCU1MgICAgICAzNgorI2RlZmluZSBSRUFTT05fUU9TX1VOV0FOVEVEX01FQ0hBTklTTSAgICAgMzcKKyNkZWZpbmUgUkVBU09OX1FPU19NRUNIX1NFVFVQX1JFUVVJUkVEICAgIDM4CisjZGVmaW5lIFJFQVNPTl9RT1NfUkVRVUVTVF9USU1FT1VUICAgICAgICAzOQorI2RlZmluZSBSRUFTT05fUU9TX0NJUEhFUl9OT1RfU1VQUE9SVCAgICAgNDUKKworLy8gU3RhdHVzIGNvZGUgZGVmaW5pdGlvbnMKKyNkZWZpbmUgTUxNRV9TVUNDRVNTICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIE1MTUVfVU5TUEVDSUZZX0ZBSUwgICAgICAgICAgICAgMQorI2RlZmluZSBNTE1FX0NBTk5PVF9TVVBQT1JUX0NBUCAgICAgICAgIDEwCisjZGVmaW5lIE1MTUVfUkVBU1NPQ19ERU5ZX0FTU09DX0VYSVNUICAgMTEKKyNkZWZpbmUgTUxNRV9BU1NPQ19ERU5ZX09VVF9TQ09QRSAgICAgICAxMgorI2RlZmluZSBNTE1FX0FMR19OT1RfU1VQUE9SVCAgICAgICAgICAgIDEzCisjZGVmaW5lIE1MTUVfU0VRX05SX09VVF9PRl9TRVFVRU5DRSAgICAgMTQKKyNkZWZpbmUgTUxNRV9SRUpfQ0hBTExFTkdFX0ZBSUxVUkUgICAgICAxNQorI2RlZmluZSBNTE1FX1JFSl9USU1FT1VUICAgICAgICAgICAgICAgICAgMTYKKyNkZWZpbmUgTUxNRV9BU1NPQ19SRUpfVU5BQkxFX0hBTkRMRV9TVEEgIDE3CisjZGVmaW5lIE1MTUVfQVNTT0NfUkVKX0RBVEFfUkFURSAgICAgICAgICAxOAorCisjZGVmaW5lIE1MTUVfQVNTT0NfUkVKX05PX0VYVF9SQVRFICAgICAgICAyMgorI2RlZmluZSBNTE1FX0FTU09DX1JFSl9OT19FWFRfUkFURV9QQkNDICAgMjMKKyNkZWZpbmUgTUxNRV9BU1NPQ19SRUpfTk9fQ0NLX09GRE0gICAgICAgIDI0CisKKyNkZWZpbmUgTUxNRV9RT1NfVU5TUEVDSUZZICAgICAgICAgICAgICAgIDMyCisjZGVmaW5lIE1MTUVfUkVRVUVTVF9ERUNMSU5FRCAgICAgICAgICAgICAzNworI2RlZmluZSBNTE1FX1JFUVVFU1RfV0lUSF9JTlZBTElEX1BBUkFNICAgMzgKKyNkZWZpbmUgTUxNRV9ETFNfTk9UX0FMTE9XX0lOX1FCU1MgICAgICAgIDQ4CisjZGVmaW5lIE1MTUVfREVTVF9TVEFfTk9UX0lOX1FCU1MgICAgICAgICA0OQorI2RlZmluZSBNTE1FX0RFU1RfU1RBX0lTX05PVF9BX1FTVEEgICAgICAgNTAKKworI2RlZmluZSBNTE1FX0lOVkFMSURfRk9STUFUICAgICAgICAgICAgIDB4NTEKKyNkZWZpbmUgTUxNRV9GQUlMX05PX1JFU09VUkNFICAgICAgICAgICAweDUyCisjZGVmaW5lIE1MTUVfU1RBVEVfTUFDSElORV9SRUpFQ1QgICAgICAgMHg1MworI2RlZmluZSBNTE1FX01BQ19UQUJMRV9GQUlMICAgICAgICAgICAgIDB4NTQKKworLy8gSUUgY29kZQorI2RlZmluZSBJRV9TU0lEICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgSUVfU1VQUF9SQVRFUyAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIElFX0ZIX1BBUk0gICAgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBJRV9EU19QQVJNICAgICAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgSUVfQ0ZfUEFSTSAgICAgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIElFX1RJTSAgICAgICAgICAgICAgICAgICAgICAgICAgNQorI2RlZmluZSBJRV9JQlNTX1BBUk0gICAgICAgICAgICAgICAgICAgIDYKKyNkZWZpbmUgSUVfQ09VTlRSWSAgICAgICAgICAgICAgICAgICAgICA3ICAgICAvLyA4MDIuMTFkCisjZGVmaW5lIElFXzgwMl8xMURfUkVRVUVTVCAgICAgICAgICAgICAgMTAgICAgLy8gODAyLjExZAorI2RlZmluZSBJRV9RQlNTX0xPQUQgICAgICAgICAgICAgICAgICAgIDExICAgIC8vIDgwMi4xMWUgZDkKKyNkZWZpbmUgSUVfRURDQV9QQVJBTUVURVIgICAgICAgICAgICAgICAxMiAgICAvLyA4MDIuMTFlIGQ5CisjZGVmaW5lIElFX1RTUEVDICAgICAgICAgICAgICAgICAgICAgICAgMTMgICAgLy8gODAyLjExZSBkOQorI2RlZmluZSBJRV9UQ0xBUyAgICAgICAgICAgICAgICAgICAgICAgIDE0ICAgIC8vIDgwMi4xMWUgZDkKKyNkZWZpbmUgSUVfU0NIRURVTEUgICAgICAgICAgICAgICAgICAgICAxNSAgICAvLyA4MDIuMTFlIGQ5CisjZGVmaW5lIElFX0NIQUxMRU5HRV9URVhUICAgICAgICAgICAgICAgMTYKKyNkZWZpbmUgSUVfUE9XRVJfQ09OU1RSQUlOVCAgICAgICAgICAgICAzMiAgICAvLyA4MDIuMTFoIGQzLjMKKyNkZWZpbmUgSUVfUE9XRVJfQ0FQQUJJTElUWSAgICAgICAgICAgICAzMyAgICAvLyA4MDIuMTFoIGQzLjMKKyNkZWZpbmUgSUVfVFBDX1JFUVVFU1QgICAgICAgICAgICAgICAgICAzNCAgICAvLyA4MDIuMTFoIGQzLjMKKyNkZWZpbmUgSUVfVFBDX1JFUE9SVCAgICAgICAgICAgICAgICAgICAzNSAgICAvLyA4MDIuMTFoIGQzLjMKKyNkZWZpbmUgSUVfU1VQUF9DSEFOTkVMUyAgICAgICAgICAgICAgICAzNiAgICAvLyA4MDIuMTFoIGQzLjMKKyNkZWZpbmUgSUVfQ0hBTk5FTF9TV0lUQ0hfQU5OT1VOQ0VNRU5UICAzNyAgICAvLyA4MDIuMTFoIGQzLjMKKyNkZWZpbmUgSUVfTUVBU1VSRU1FTlRfUkVRVUVTVCAgICAgICAgICAzOCAgICAvLyA4MDIuMTFoIGQzLjMKKyNkZWZpbmUgSUVfTUVBU1VSRU1FTlRfUkVQT1JUICAgICAgICAgICAzOSAgICAvLyA4MDIuMTFoIGQzLjMKKyNkZWZpbmUgSUVfUVVJRVQgICAgICAgICAgICAgICAgICAgICAgICA0MCAgICAvLyA4MDIuMTFoIGQzLjMKKyNkZWZpbmUgSUVfSUJTU19ERlMgICAgICAgICAgICAgICAgICAgICA0MSAgICAvLyA4MDIuMTFoIGQzLjMKKyNkZWZpbmUgSUVfRVJQICAgICAgICAgICAgICAgICAgICAgICAgICA0MiAgICAvLyA4MDIuMTFnCisjZGVmaW5lIElFX1RTX0RFTEFZICAgICAgICAgICAgICAgICAgICAgNDMgICAgLy8gODAyLjExZSBkOQorI2RlZmluZSBJRV9UQ0xBU19QUk9DRVNTSU5HICAgICAgICAgICAgIDQ0ICAgIC8vIDgwMi4xMWUgZDkKKyNkZWZpbmUgSUVfUU9TX0NBUEFCSUxJVFkgICAgICAgICAgICAgICA0NiAgICAvLyA4MDIuMTFlIGQ2CisjZGVmaW5lIElFX0hUX0NBUCAgICAgICAgICAgICAgICAgICAgICAgNDUgICAgLy8gODAyLjExbiBkMS4gSFQgQ0FQQUJJTElUWS4gRUxFTUVOVCBJRCBUQkQKKyNkZWZpbmUgSUVfQVBfQ0hBTk5FTF9SRVBPUlQJCQk1MSAgICAvLyA4MDIuMTFrIGQ2CisjZGVmaW5lIElFX0hUX0NBUDIgICAgICAgICAgICAgICAgICAgICAgICAgNTIgICAgLy8gODAyLjExbiBkMS4gSFQgQ0FQQUJJTElUWS4gRUxFTUVOVCBJRCBUQkQKKyNkZWZpbmUgSUVfUlNOICAgICAgICAgICAgICAgICAgICAgICAgICA0OCAgICAvLyA4MDIuMTFpIGQzLjAKKyNkZWZpbmUgSUVfV1BBMiAgICAgICAgICAgICAgICAgICAgICAgICA0OCAgICAvLyBXUEEyCisjZGVmaW5lIElFX0VYVF9TVVBQX1JBVEVTICAgICAgICAgICAgICAgNTAgICAgLy8gODAyLjExZworI2RlZmluZSBJRV9TVVBQX1JFR19DTEFTUyAgICAgICAgICAgICAgIDU5ICAgIC8vIDgwMi4xMXkuIFN1cHBvcnRlZCByZWd1bGF0b3J5IGNsYXNzZXMuCisjZGVmaW5lIElFX0VYVF9DSEFOTkVMX1NXSVRDSF9BTk5PVU5DRU1FTlQJNjAJLy8gODAyLjExbgorI2RlZmluZSBJRV9BRERfSFQgICAgICAgICAgICAgICAgICAgICAgICAgNjEgICAgLy8gODAyLjExbiBkMS4gQURESVRJT05BTCBIVCBDQVBBQklMSVRZLiBFTEVNRU5UIElEIFRCRAorI2RlZmluZSBJRV9BRERfSFQyICAgICAgICAgICAgICAgICAgICAgICAgNTMgICAgLy8gODAyLjExbiBkMS4gQURESVRJT05BTCBIVCBDQVBBQklMSVRZLiBFTEVNRU5UIElEIFRCRAorCisKKy8vIEZvciA4MDIuMTFuIEQzLjAzCisvLyNkZWZpbmUgSUVfTkVXX0VYVF9DSEFfT0ZGU0VUICAgICAgICAgICAgIDYyICAgIC8vIDgwMi4xMW4gZDEuIE5ldyBleHRlbnNpb24gY2hhbm5lbCBvZmZzZXQgZWxlbWV0CisjZGVmaW5lIElFX1NFQ09OREFSWV9DSF9PRkZTRVQJCTYyCS8vIDgwMi4xMW4gRDMuMDMJU2Vjb25kYXJ5IENoYW5uZWwgT2Zmc2V0IGVsZW1lbnQKKyNkZWZpbmUgSUVfV0FQSQkJCQkJCQk2OAkJLy8gV0FQSSBpbmZvcm1hdGlvbiBlbGVtZW50CisjZGVmaW5lIElFXzIwNDBfQlNTX0NPRVhJU1QgICAgICAgICAgICAgICA3MiAgICAvLyA4MDIuMTFuIEQzLjAuMworI2RlZmluZSBJRV8yMDQwX0JTU19JTlRPTEVSQU5UX1JFUE9SVCAgICAgNzMgICAgLy8gODAyLjExbiBEMy4wMworI2RlZmluZSBJRV9PVkVSTEFQQlNTX1NDQU5fUEFSTSAgICAgICAgICAgNzQgICAgLy8gODAyLjExbiBEMy4wMworI2RlZmluZSBJRV9FWFRfQ0FQQUJJTElUWSAgICAgICAgICAgICAgICAxMjcgICAvLyA4MDIuMTFuIEQzLjAzCisKKworI2RlZmluZSBJRV9XUEEgICAgICAgICAgICAgICAgICAgICAgICAgIDIyMSAgIC8vIFdQQQorI2RlZmluZSBJRV9WRU5ET1JfU1BFQ0lGSUMgICAgICAgICAgICAgIDIyMSAgIC8vIFdpZmkgV01NIChXTUUpCisKKyNkZWZpbmUgT1VJX0JST0FEQ09NX0hUICAgICAgICAgICAgICA1MSAgIC8vCisjZGVmaW5lIE9VSV9CUk9BRENPTV9IVEFERCAgICAgICAgICAgICAgNTIgICAvLworI2RlZmluZSBPVUlfUFJFTl9IVF9DQVAgICAgICAgICAgICAgIDUxICAgLy8KKyNkZWZpbmUgT1VJX1BSRU5fQUREX0hUICAgICAgICAgICAgICA1MiAgIC8vCisKKy8vIENDWCBpbmZvcm1hdGlvbgorI2RlZmluZSBJRV9BSVJPTkVUX0NLSVAgICAgICAgICAgICAgICAgIDEzMyAgIC8vIENDWDEuMCBJRCA4NUggZm9yIENLSVAKKyNkZWZpbmUgSUVfQVBfVFhfUE9XRVIgICAgICAgICAgICAgICAgICAxNTAgICAvLyBDQ1ggMi4wIGZvciBBUCB0cmFuc21pdCBwb3dlcgorI2RlZmluZSBJRV9NRUFTVVJFTUVOVF9DQVBBQklMSVRZICAgICAgIDIyMSAgIC8vIENDWCAyLjAKKyNkZWZpbmUgSUVfQ0NYX1YyICAgICAgICAgICAgICAgICAgICAgICAyMjEKKyNkZWZpbmUgSUVfQUlST05FVF9JUEFERFJFU1MgICAgICAgICAgICAxNDkgICAvLyBDQ1ggSUQgOTVIIGZvciBJUCBBZGRyZXNzCisjZGVmaW5lIElFX0FJUk9ORVRfQ0NLTVJFQVNTT0MgICAgICAgICAgMTU2ICAgLy8gQ0NYIElEIDlDSCBmb3IgQ0NLTSBSZWFzc29jaWF0aW9uIFJlcXVlc3QgZWxlbWVudAorI2RlZmluZSBDS0lQX05FR09USUFUSU9OX0xFTkdUSCAgICAgICAgIDMwCisjZGVmaW5lIEFJUk9ORVRfSVBBRERSRVNTX0xFTkdUSCAgICAgICAgMTAKKyNkZWZpbmUgQUlST05FVF9DQ0tNUkVBU1NPQ19MRU5HVEggICAgICAyNAorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gTUxNRSBzdGF0ZSBtYWNoaW5lIGRlZmluaXRpb24KKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKy8vIFNUQSBNTE1FIHN0YXRlIG1haGNpbmVzCisjZGVmaW5lIEFTU09DX1NUQVRFX01BQ0hJTkUgICAgICAgICAgICAgMQorI2RlZmluZSBBVVRIX1NUQVRFX01BQ0hJTkUgICAgICAgICAgICAgIDIKKyNkZWZpbmUgQVVUSF9SU1BfU1RBVEVfTUFDSElORSAgICAgICAgICAzCisjZGVmaW5lIFNZTkNfU1RBVEVfTUFDSElORSAgICAgICAgICAgICAgNAorI2RlZmluZSBNTE1FX0NOVExfU1RBVEVfTUFDSElORSAgICAgICAgIDUKKyNkZWZpbmUgV1BBX1BTS19TVEFURV9NQUNISU5FICAgICAgICAgICA2CisjZGVmaW5lIExFQVBfU1RBVEVfTUFDSElORSAgICAgICAgICAgICAgNworI2RlZmluZSBBSVJPTkVUX1NUQVRFX01BQ0hJTkUgICAgICAgICAgIDgKKyNkZWZpbmUgQUNUSU9OX1NUQVRFX01BQ0hJTkUgICAgICAgICAgIDkKKworLy8gQVAgTUxNRSBzdGF0ZSBtYWNoaW5lcworI2RlZmluZSBBUF9BU1NPQ19TVEFURV9NQUNISU5FICAgICAgICAgIDExCisjZGVmaW5lIEFQX0FVVEhfU1RBVEVfTUFDSElORSAgICAgICAgICAgMTIKKyNkZWZpbmUgQVBfQVVUSF9SU1BfU1RBVEVfTUFDSElORSAgICAgICAxMworI2RlZmluZSBBUF9TWU5DX1NUQVRFX01BQ0hJTkUgICAgICAgICAgIDE0CisjZGVmaW5lIEFQX0NOVExfU1RBVEVfTUFDSElORSAgICAgICAgICAgMTUKKyNkZWZpbmUgQVBfV1BBX1NUQVRFX01BQ0hJTkUgICAgICAgICAgICAxNgorCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisjZGVmaW5lIERMU19TVEFURV9NQUNISU5FICAgICAgICAgICAgICAgMjYKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKworLy8KKy8vIFNUQSdzIENPTlRST0wvQ09OTkVDVCBzdGF0ZSBtYWNoaW5lOiBzdGF0ZXMsIGV2ZW50cywgdG90YWwgZnVuY3Rpb24gIworLy8KKyNkZWZpbmUgQ05UTF9JRExFICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIENOVExfV0FJVF9ESVNBU1NPQyAgICAgICAgICAgICAgMQorI2RlZmluZSBDTlRMX1dBSVRfSk9JTiAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgQ05UTF9XQUlUX1JFQVNTT0MgICAgICAgICAgICAgICAzCisjZGVmaW5lIENOVExfV0FJVF9TVEFSVCAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBDTlRMX1dBSVRfQVVUSCAgICAgICAgICAgICAgICAgIDUKKyNkZWZpbmUgQ05UTF9XQUlUX0FTU09DICAgICAgICAgICAgICAgICA2CisjZGVmaW5lIENOVExfV0FJVF9BVVRIMiAgICAgICAgICAgICAgICAgNworI2RlZmluZSBDTlRMX1dBSVRfT0lEX0xJU1RfU0NBTiAgICAgICAgIDgKKyNkZWZpbmUgQ05UTF9XQUlUX09JRF9ESVNBU1NPQyAgICAgICAgICA5CisjaWZkZWYgUlQyODcwCisjZGVmaW5lIENOVExfV0FJVF9TQ0FOX0ZPUl9DT05ORUNUICAgICAgMTAKKyNlbmRpZiAvLyBSVDI4NzAgLy8KKworI2RlZmluZSBNVDJfQVNTT0NfQ09ORiAgICAgICAgICAgICAgICAgIDM0CisjZGVmaW5lIE1UMl9BVVRIX0NPTkYgICAgICAgICAgICAgICAgICAgMzUKKyNkZWZpbmUgTVQyX0RFQVVUSF9DT05GICAgICAgICAgICAgICAgICAzNgorI2RlZmluZSBNVDJfRElTQVNTT0NfQ09ORiAgICAgICAgICAgICAgIDM3CisjZGVmaW5lIE1UMl9SRUFTU09DX0NPTkYgICAgICAgICAgICAgICAgMzgKKyNkZWZpbmUgTVQyX1BXUl9NR01UX0NPTkYgICAgICAgICAgICAgICAzOQorI2RlZmluZSBNVDJfSk9JTl9DT05GICAgICAgICAgICAgICAgICAgIDQwCisjZGVmaW5lIE1UMl9TQ0FOX0NPTkYgICAgICAgICAgICAgICAgICAgNDEKKyNkZWZpbmUgTVQyX1NUQVJUX0NPTkYgICAgICAgICAgICAgICAgICA0MgorI2RlZmluZSBNVDJfR0VUX0NPTkYgICAgICAgICAgICAgICAgICAgIDQzCisjZGVmaW5lIE1UMl9TRVRfQ09ORiAgICAgICAgICAgICAgICAgICAgNDQKKyNkZWZpbmUgTVQyX1JFU0VUX0NPTkYgICAgICAgICAgICAgICAgICA0NQorI2RlZmluZSBNVDJfTUxNRV9ST0FNSU5HX1JFUSAgICAgICAgICAgIDUyCisKKyNkZWZpbmUgQ05UTF9GVU5DX1NJWkUgICAgICAgICAgICAgICAgICAxCisKKy8vCisvLyBTVEEncyBBU1NPQyBzdGF0ZSBtYWNoaW5lOiBzdGF0ZXMsIGV2ZW50cywgdG90YWwgZnVuY3Rpb24gIworLy8KKyNkZWZpbmUgQVNTT0NfSURMRSAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEFTU09DX1dBSVRfUlNQICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBSRUFTU09DX1dBSVRfUlNQICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgRElTQVNTT0NfV0FJVF9SU1AgICAgICAgICAgICAgICAzCisjZGVmaW5lIE1BWF9BU1NPQ19TVEFURSAgICAgICAgICAgICAgICAgNAorCisjZGVmaW5lIEFTU09DX01BQ0hJTkVfQkFTRSAgICAgICAgICAgICAgMAorI2RlZmluZSBNVDJfTUxNRV9BU1NPQ19SRVEgICAgICAgICAgICAgIDAKKyNkZWZpbmUgTVQyX01MTUVfUkVBU1NPQ19SRVEgICAgICAgICAgICAxCisjZGVmaW5lIE1UMl9NTE1FX0RJU0FTU09DX1JFUSAgICAgICAgICAgMgorI2RlZmluZSBNVDJfUEVFUl9ESVNBU1NPQ19SRVEgICAgICAgICAgIDMKKyNkZWZpbmUgTVQyX1BFRVJfQVNTT0NfUkVRICAgICAgICAgICAgICA0CisjZGVmaW5lIE1UMl9QRUVSX0FTU09DX1JTUCAgICAgICAgICAgICAgNQorI2RlZmluZSBNVDJfUEVFUl9SRUFTU09DX1JFUSAgICAgICAgICAgIDYKKyNkZWZpbmUgTVQyX1BFRVJfUkVBU1NPQ19SU1AgICAgICAgICAgICA3CisjZGVmaW5lIE1UMl9ESVNBU1NPQ19USU1FT1VUICAgICAgICAgICAgOAorI2RlZmluZSBNVDJfQVNTT0NfVElNRU9VVCAgICAgICAgICAgICAgIDkKKyNkZWZpbmUgTVQyX1JFQVNTT0NfVElNRU9VVCAgICAgICAgICAgICAxMAorI2RlZmluZSBNQVhfQVNTT0NfTVNHICAgICAgICAgICAgICAgICAgIDExCisKKyNkZWZpbmUgQVNTT0NfRlVOQ19TSVpFICAgICAgICAgICAgICAgICAoTUFYX0FTU09DX1NUQVRFICogTUFYX0FTU09DX01TRykKKworLy8KKy8vIEFDVCBzdGF0ZSBtYWNoaW5lOiBzdGF0ZXMsIGV2ZW50cywgdG90YWwgZnVuY3Rpb24gIworLy8KKyNkZWZpbmUgQUNUX0lETEUgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBNQVhfQUNUX1NUQVRFICAgICAgICAgICAgICAgICAxCisKKyNkZWZpbmUgQUNUX01BQ0hJTkVfQkFTRSAgICAgICAgICAgICAgMAorCisvL1Rob3NlIFBFRVJfeHhfQ0FURSBudW1iZXIgaXMgYmFzZWQgb24gcmVhbCBDYXRlZ2FyeSB2YWx1ZSBpbiBJRUVFIHNwZWMuIFBsZWFzZSBkb24nZXMgbW9kaWZ5IGl0IGJ5IHlvdXIgc2VsZi4KKy8vQ2F0ZWdvcnkKKyNkZWZpbmUgTVQyX1BFRVJfU1BFQ1RSVU1fQ0FURSAgICAgICAgICAgICAgMAorI2RlZmluZSBNVDJfUEVFUl9RT1NfQ0FURSAgICAgICAgICAgICAgMQorI2RlZmluZSBNVDJfUEVFUl9ETFNfQ0FURSAgICAgICAgICAgICAyCisjZGVmaW5lIE1UMl9QRUVSX0JBX0NBVEUgICAgICAgICAgICAgMworI2RlZmluZSBNVDJfUEVFUl9QVUJMSUNfQ0FURSAgICAgICAgICAgICA0CisjZGVmaW5lIE1UMl9QRUVSX1JNX0NBVEUgICAgICAgICAgICAgNQorI2RlZmluZSBNVDJfUEVFUl9IVF9DQVRFICAgICAgICAgICAgIDcJLy8JNy40LjcKKyNkZWZpbmUgTUFYX1BFRVJfQ0FURV9NU0cgICAgICAgICAgICAgICAgICAgNworI2RlZmluZSBNVDJfTUxNRV9BRERfQkFfQ0FURSAgICAgICAgICAgICA4CisjZGVmaW5lIE1UMl9NTE1FX09SSV9ERUxCQV9DQVRFICAgICAgICAgICAgIDkKKyNkZWZpbmUgTVQyX01MTUVfUkVDX0RFTEJBX0NBVEUgICAgICAgICAgICAgMTAKKyNkZWZpbmUgTVQyX01MTUVfUU9TX0NBVEUgICAgICAgICAgICAgIDExCisjZGVmaW5lIE1UMl9NTE1FX0RMU19DQVRFICAgICAgICAgICAgIDEyCisjZGVmaW5lIE1UMl9BQ1RfSU5WQUxJRCAgICAgICAgICAgICAxMworI2RlZmluZSBNQVhfQUNUX01TRyAgICAgICAgICAgICAgICAgICAxNAorCisvL0NhdGVnb3J5IGZpZWxkCisjZGVmaW5lIENBVEVHT1JZX1NQRUNUUlVNCQkwCisjZGVmaW5lIENBVEVHT1JZX1FPUwkJCTEKKyNkZWZpbmUgQ0FURUdPUllfRExTCQkJMgorI2RlZmluZSBDQVRFR09SWV9CQQkJCTMKKyNkZWZpbmUgQ0FURUdPUllfUFVCTElDCQk0CisjZGVmaW5lIENBVEVHT1JZX1JNCQkJNQorI2RlZmluZSBDQVRFR09SWV9IVAkJCTcKKworCisvLyBETFMgQWN0aW9uIGZyYW1lIGRlZmluaXRpb24KKyNkZWZpbmUgQUNUSU9OX0RMU19SRVFVRVNUCQkJMAorI2RlZmluZSBBQ1RJT05fRExTX1JFU1BPTlNFCQkJMQorI2RlZmluZSBBQ1RJT05fRExTX1RFQVJET1dOCQkJMgorCisvL1NwZWN0cnVtICBBY3Rpb24gZmllbGQgdmFsdWUgODAyLjExaCA3LjQuMQorI2RlZmluZSBTUEVDX01SUQkwCS8vIFJlcXVlc3QKKyNkZWZpbmUgU1BFQ19NUlAJMQkvL1JlcG9ydAorI2RlZmluZSBTUEVDX1RQQ1JRCTIKKyNkZWZpbmUgU1BFQ19UUENSUAkzCisjZGVmaW5lIFNQRUNfQ0hBTk5FTF9TV0lUQ0gJNAorCisKKy8vQkEgIEFjdGlvbiBmaWVsZCB2YWx1ZQorI2RlZmluZSBBRERCQV9SRVEJMAorI2RlZmluZSBBRERCQV9SRVNQCTEKKyNkZWZpbmUgREVMQkEgICAyCisKKy8vUHVibGljJ3MgIEFjdGlvbiBmaWVsZCB2YWx1ZSBpbiBQdWJsaWMgQ2F0ZWdvcnkuICBTb21lIGluIDgwMi4xMXkgYW5kIHNvbWUgaW4gMTFuCisjZGVmaW5lIEFDVElPTl9CU1NfMjA0MF9DT0VYSVNUCQkJCTAJLy8gMTFuCisjZGVmaW5lIEFDVElPTl9EU0VfRU5BQkxFTUVOVAkJCQkJMQkvLyAxMXkgRDkuMAorI2RlZmluZSBBQ1RJT05fRFNFX0RFRU5BQkxFTUVOVAkJCQkyCS8vIDExeSBEOS4wCisjZGVmaW5lIEFDVElPTl9EU0VfUkVHX0xPQ0FUSU9OX0FOTk9VTkNFCTMJLy8gMTF5IEQ5LjAKKyNkZWZpbmUgQUNUSU9OX0VYVF9DSF9TV0lUQ0hfQU5OT1VOQ0UJCTQJLy8gMTF5IEQ5LjAKKyNkZWZpbmUgQUNUSU9OX0RTRV9NRUFTVVJFTUVOVF9SRVEJCQk1CS8vIDExeSBEOS4wCisjZGVmaW5lIEFDVElPTl9EU0VfTUVBU1VSRU1FTlRfUkVQT1JUCQk2CS8vIDExeSBEOS4wCisjZGVmaW5lIEFDVElPTl9NRUFTVVJFTUVOVF9QSUxPVF9BQ1RJT04JCTcgIAkvLyAxMXkgRDkuMAorI2RlZmluZSBBQ1RJT05fRFNFX1BPV0VSX0NPTlNUUkFJTlQJCQk4CS8vIDExeSBEOS4wCisKKworLy9IVCAgQWN0aW9uIGZpZWxkIHZhbHVlCisjZGVmaW5lIE5PVElGWV9CV19BQ1RJT04JCQkJMAorI2RlZmluZSBTTVBTX0FDVElPTgkJCQkJCTEKKyNkZWZpbmUgUFNNUF9BQ1RJT04gICAJCQkJCTIKKyNkZWZpbmUgU0VUUENPX0FDVElPTgkJCQkJMworI2RlZmluZSBNSU1PX0NIQV9NRUFTVVJFX0FDVElPTgkJCTQKKyNkZWZpbmUgTUlNT19OX0JFQUNPTkZPUk0JCQkJNQorI2RlZmluZSBNSU1PX0JFQUNPTkZPUk0JCQkJCTYKKyNkZWZpbmUgQU5URU5OQV9TRUxFQ1QJCQkJCTcKKyNkZWZpbmUgSFRfSU5GT19FWENIQU5HRQkJCQk4CisKKyNkZWZpbmUgQUNUX0ZVTkNfU0laRSAgICAgICAgICAgICAgICAgKE1BWF9BQ1RfU1RBVEUgKiBNQVhfQUNUX01TRykKKy8vCisvLyBTVEEncyBBVVRIRU5USUNBVElPTiBzdGF0ZSBtYWNoaW5lOiBzdGF0ZXMsIGV2dmVudHMsIHRvdGFsIGZ1bmN0aW9uICMKKy8vCisjZGVmaW5lIEFVVEhfUkVRX0lETEUgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBBVVRIX1dBSVRfU0VRMiAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgQVVUSF9XQUlUX1NFUTQgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIE1BWF9BVVRIX1NUQVRFICAgICAgICAgICAgICAgICAgMworCisjZGVmaW5lIEFVVEhfTUFDSElORV9CQVNFICAgICAgICAgICAgICAgMAorI2RlZmluZSBNVDJfTUxNRV9BVVRIX1JFUSAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgTVQyX1BFRVJfQVVUSF9FVkVOICAgICAgICAgICAgICAxCisjZGVmaW5lIE1UMl9BVVRIX1RJTUVPVVQgICAgICAgICAgICAgICAgMgorI2RlZmluZSBNQVhfQVVUSF9NU0cgICAgICAgICAgICAgICAgICAgIDMKKworI2RlZmluZSBBVVRIX0ZVTkNfU0laRSAgICAgICAgICAgICAgICAgIChNQVhfQVVUSF9TVEFURSAqIE1BWF9BVVRIX01TRykKKworLy8KKy8vIFNUQSdzIEFVVEhfUlNQIHN0YXRlIG1hY2hpbmU6IHN0YXRlcywgZXZlbnRzLCB0b3RhbCBmdW5jdGlvbiAjCisvLworI2RlZmluZSBBVVRIX1JTUF9JRExFICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQVVUSF9SU1BfV0FJVF9DSEFMICAgICAgICAgICAgICAxCisjZGVmaW5lIE1BWF9BVVRIX1JTUF9TVEFURSAgICAgICAgICAgICAgMgorCisjZGVmaW5lIEFVVEhfUlNQX01BQ0hJTkVfQkFTRSAgICAgICAgICAgMAorI2RlZmluZSBNVDJfQVVUSF9DSEFMTEVOR0VfVElNRU9VVCAgICAgIDAKKyNkZWZpbmUgTVQyX1BFRVJfQVVUSF9PREQgICAgICAgICAgICAgICAxCisjZGVmaW5lIE1UMl9QRUVSX0RFQVVUSCAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBNQVhfQVVUSF9SU1BfTVNHICAgICAgICAgICAgICAgIDMKKworI2RlZmluZSBBVVRIX1JTUF9GVU5DX1NJWkUgICAgICAgICAgICAgIChNQVhfQVVUSF9SU1BfU1RBVEUgKiBNQVhfQVVUSF9SU1BfTVNHKQorCisvLworLy8gU1RBJ3MgU1lOQyBzdGF0ZSBtYWNoaW5lOiBzdGF0ZXMsIGV2ZW50cywgdG90YWwgZnVuY3Rpb24gIworLy8KKyNkZWZpbmUgU1lOQ19JRExFICAgICAgICAgICAgICAgICAgICAgICAwICAvLyBtZXJnZSBOT19CU1MsSUJTU19JRExFLElCU1NfQUNUSVZFIGFuZCBCU1MgaW4gdG8gMSBzdGF0ZQorI2RlZmluZSBKT0lOX1dBSVRfQkVBQ09OICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgU0NBTl9MSVNURU4gICAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIE1BWF9TWU5DX1NUQVRFICAgICAgICAgICAgICAgICAgMworCisjZGVmaW5lIFNZTkNfTUFDSElORV9CQVNFICAgICAgICAgICAgICAgMAorI2RlZmluZSBNVDJfTUxNRV9TQ0FOX1JFUSAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgTVQyX01MTUVfSk9JTl9SRVEgICAgICAgICAgICAgICAxCisjZGVmaW5lIE1UMl9NTE1FX1NUQVJUX1JFUSAgICAgICAgICAgICAgMgorI2RlZmluZSBNVDJfUEVFUl9CRUFDT04gICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgTVQyX1BFRVJfUFJPQkVfUlNQICAgICAgICAgICAgICA0CisjZGVmaW5lIE1UMl9QRUVSX0FUSU0gICAgICAgICAgICAgICAgICAgNQorI2RlZmluZSBNVDJfU0NBTl9USU1FT1VUICAgICAgICAgICAgICAgIDYKKyNkZWZpbmUgTVQyX0JFQUNPTl9USU1FT1VUICAgICAgICAgICAgICA3CisjZGVmaW5lIE1UMl9BVElNX1RJTUVPVVQgICAgICAgICAgICAgICAgOAorI2RlZmluZSBNVDJfUEVFUl9QUk9CRV9SRVEgICAgICAgICAgICAgIDkKKyNkZWZpbmUgTUFYX1NZTkNfTVNHICAgICAgICAgICAgICAgICAgICAxMAorCisjZGVmaW5lIFNZTkNfRlVOQ19TSVpFICAgICAgICAgICAgICAgICAgKE1BWF9TWU5DX1NUQVRFICogTUFYX1NZTkNfTVNHKQorCisvL01lc3NhZ2VzIGZvciB0aGUgRExTIHN0YXRlIG1hY2hpbmUKKyNkZWZpbmUgRExTX0lETEUJCQkJCQkwCisjZGVmaW5lIE1BWF9ETFNfU1RBVEUJCQkJCTEKKworI2RlZmluZSBETFNfTUFDSElORV9CQVNFCQkJCTAKKyNkZWZpbmUgTVQyX01MTUVfRExTX1JFUQkJCSAgICAwCisjZGVmaW5lIE1UMl9QRUVSX0RMU19SRVEJCQkgICAgMQorI2RlZmluZSBNVDJfUEVFUl9ETFNfUlNQCQkJICAgIDIKKyNkZWZpbmUgTVQyX01MTUVfRExTX1RFQVJfRE9XTgkJICAgIDMKKyNkZWZpbmUgTVQyX1BFRVJfRExTX1RFQVJfRE9XTgkJICAgIDQKKyNkZWZpbmUgTUFYX0RMU19NU0cJCQkJICAgICAgICA1CisKKyNkZWZpbmUgRExTX0ZVTkNfU0laRQkJCQkJKE1BWF9ETFNfU1RBVEUgKiBNQVhfRExTX01TRykKKworLy8KKy8vIFNUQSdzIFdQQS1QU0sgU3RhdGUgbWFjaGluZTogc3RhdGVzLCBldmVudHMsIHRvdGFsIGZ1bmN0aW9uICMKKy8vCisjZGVmaW5lIFdQQV9QU0tfSURMRQkJCQkJMAorI2RlZmluZSBNQVhfV1BBX1BTS19TVEFURQkJCQkxCisKKyNkZWZpbmUgV1BBX01BQ0hJTkVfQkFTRSAgICAgICAgICAgICAgICAwCisjZGVmaW5lIE1UMl9FQVBQYWNrZXQgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBNVDJfRUFQT0xTdGFydCAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgTVQyX0VBUE9MTG9nb2ZmICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIE1UMl9FQVBPTEtleSAgICAgICAgICAgICAgICAgICAgMworI2RlZmluZSBNVDJfRUFQT0xBU0ZBbGVydCAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgTUFYX1dQQV9QU0tfTVNHICAgICAgICAgICAgICAgICA1CisKKyNkZWZpbmUJV1BBX1BTS19GVU5DX1NJWkUJCQkJKE1BWF9XUEFfUFNLX1NUQVRFICogTUFYX1dQQV9QU0tfTVNHKQorCisvLworLy8gU1RBJ3MgQ0lTQ08tQUlST05FVCBTdGF0ZSBtYWNoaW5lOiBzdGF0ZXMsIGV2ZW50cywgdG90YWwgZnVuY3Rpb24gIworLy8KKyNkZWZpbmUgQUlST05FVF9JRExFCQkJCQkwCisjZGVmaW5lCUFJUk9ORVRfU0NBTk5JTkcJCQkJMQorI2RlZmluZSBNQVhfQUlST05FVF9TVEFURQkJCQkyCisKKyNkZWZpbmUgQUlST05FVF9NQUNISU5FX0JBU0UJCSAgICAwCisjZGVmaW5lIE1UMl9BSVJPTkVUX01TRwkJCQkgICAgMAorI2RlZmluZSBNVDJfQUlST05FVF9TQ0FOX1JFUQkJICAgIDEKKyNkZWZpbmUgTVQyX0FJUk9ORVRfU0NBTl9ET05FCQkgICAgMgorI2RlZmluZSBNQVhfQUlST05FVF9NU0cJCQkJICAgIDMKKworI2RlZmluZQlBSVJPTkVUX0ZVTkNfU0laRQkJCQkoTUFYX0FJUk9ORVRfU1RBVEUgKiBNQVhfQUlST05FVF9NU0cpCisKKy8vCisvLyBBUCdzIENPTlRST0wvQ09OTkVDVCBzdGF0ZSBtYWNoaW5lOiBzdGF0ZXMsIGV2ZW50cywgdG90YWwgZnVuY3Rpb24gIworLy8KKyNkZWZpbmUgQVBfQ05UTF9GVU5DX1NJWkUgICAgICAgICAgICAgICAxCisKKy8vCisvLyBBUCdzIEFTU09DIHN0YXRlIG1hY2hpbmU6IHN0YXRlcywgZXZlbnRzLCB0b3RhbCBmdW5jdGlvbiAjCisvLworI2RlZmluZSBBUF9BU1NPQ19JRExFICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQVBfTUFYX0FTU09DX1NUQVRFICAgICAgICAgICAgICAxCisKKyNkZWZpbmUgQVBfQVNTT0NfTUFDSElORV9CQVNFICAgICAgICAgICAwCisjZGVmaW5lIEFQTVQyX01MTUVfRElTQVNTT0NfUkVRICAgICAgICAgMAorI2RlZmluZSBBUE1UMl9QRUVSX0RJU0FTU09DX1JFUSAgICAgICAgIDEKKyNkZWZpbmUgQVBNVDJfUEVFUl9BU1NPQ19SRVEgICAgICAgICAgICAyCisjZGVmaW5lIEFQTVQyX1BFRVJfUkVBU1NPQ19SRVEgICAgICAgICAgMworI2RlZmluZSBBUE1UMl9DTFMzRVJSICAgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgQVBfTUFYX0FTU09DX01TRyAgICAgICAgICAgICAgICA1CisKKyNkZWZpbmUgQVBfQVNTT0NfRlVOQ19TSVpFICAgICAgICAgICAgICAoQVBfTUFYX0FTU09DX1NUQVRFICogQVBfTUFYX0FTU09DX01TRykKKworLy8KKy8vIEFQJ3MgQVVUSEVOVElDQVRJT04gc3RhdGUgbWFjaGluZTogc3RhdGVzLCBldmVudHMsIHRvdGFsIGZ1bmN0aW9uICMKKy8vCisjZGVmaW5lIEFQX0FVVEhfUkVRX0lETEUgICAgICAgICAgICAgICAgMAorI2RlZmluZSBBUF9NQVhfQVVUSF9TVEFURSAgICAgICAgICAgICAgIDEKKworI2RlZmluZSBBUF9BVVRIX01BQ0hJTkVfQkFTRSAgICAgICAgICAgIDAKKyNkZWZpbmUgQVBNVDJfTUxNRV9ERUFVVEhfUkVRICAgICAgICAgICAwCisjZGVmaW5lIEFQTVQyX0NMUzJFUlIgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBBUF9NQVhfQVVUSF9NU0cgICAgICAgICAgICAgICAgIDIKKworI2RlZmluZSBBUF9BVVRIX0ZVTkNfU0laRSAgICAgICAgICAgICAgIChBUF9NQVhfQVVUSF9TVEFURSAqIEFQX01BWF9BVVRIX01TRykKKworLy8KKy8vIEFQJ3MgQVVUSC1SU1Agc3RhdGUgbWFjaGluZTogc3RhdGVzLCBldmVudHMsIHRvdGFsIGZ1bmN0aW9uICMKKy8vCisjZGVmaW5lIEFQX0FVVEhfUlNQX0lETEUgICAgICAgICAgICAgICAgMAorI2RlZmluZSBBUF9NQVhfQVVUSF9SU1BfU1RBVEUgICAgICAgICAgIDEKKworI2RlZmluZSBBUF9BVVRIX1JTUF9NQUNISU5FX0JBU0UgICAgICAgIDAKKyNkZWZpbmUgQVBNVDJfQVVUSF9DSEFMTEVOR0VfVElNRU9VVCAgICAwCisjZGVmaW5lIEFQTVQyX1BFRVJfQVVUSF9PREQgICAgICAgICAgICAgMQorI2RlZmluZSBBUE1UMl9QRUVSX0RFQVVUSCAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgQVBfTUFYX0FVVEhfUlNQX01TRyAgICAgICAgICAgICAzCisKKyNkZWZpbmUgQVBfQVVUSF9SU1BfRlVOQ19TSVpFICAgICAgICAgICAoQVBfTUFYX0FVVEhfUlNQX1NUQVRFICogQVBfTUFYX0FVVEhfUlNQX01TRykKKworLy8KKy8vIEFQJ3MgU1lOQyBzdGF0ZSBtYWNoaW5lOiBzdGF0ZXMsIGV2ZW50cywgdG90YWwgZnVuY3Rpb24gIworLy8KKyNkZWZpbmUgQVBfU1lOQ19JRExFICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEFQX1NDQU5fTElTVEVOCQkJCQkxCisjZGVmaW5lIEFQX01BWF9TWU5DX1NUQVRFICAgICAgICAgICAgICAgMgorCisjZGVmaW5lIEFQX1NZTkNfTUFDSElORV9CQVNFICAgICAgICAgICAgMAorI2RlZmluZSBBUE1UMl9QRUVSX1BST0JFX1JFUSAgICAgICAgICAgIDAKKyNkZWZpbmUgQVBNVDJfUEVFUl9CRUFDT04gICAgICAgICAgICAgICAxCisjZGVmaW5lIEFQTVQyX01MTUVfU0NBTl9SRVEJCQkJMgorI2RlZmluZSBBUE1UMl9QRUVSX1BST0JFX1JTUAkJCTMKKyNkZWZpbmUgQVBNVDJfU0NBTl9USU1FT1VUCQkJCTQKKyNkZWZpbmUgQVBNVDJfTUxNRV9TQ0FOX0NOQ0wJCQk1CisjZGVmaW5lIEFQX01BWF9TWU5DX01TRyAgICAgICAgICAgICAgICAgNgorCisjZGVmaW5lIEFQX1NZTkNfRlVOQ19TSVpFICAgICAgICAgICAgICAgKEFQX01BWF9TWU5DX1NUQVRFICogQVBfTUFYX1NZTkNfTVNHKQorCisvLworLy8gQVAncyBXUEEgc3RhdGUgbWFjaGluZTogc3RhdGVzLCBldmVudHMsIHRvdGFsIGZ1bmN0aW9uICMKKy8vCisjZGVmaW5lIEFQX1dQQV9QVEsgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBBUF9NQVhfV1BBX1BUS19TVEFURSAgICAgICAgICAgIDEKKworI2RlZmluZSBBUF9XUEFfTUFDSElORV9CQVNFICAgICAgICAgICAgIDAKKyNkZWZpbmUgQVBNVDJfRUFQUGFja2V0ICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEFQTVQyX0VBUE9MU3RhcnQgICAgICAgICAgICAgICAgMQorI2RlZmluZSBBUE1UMl9FQVBPTExvZ29mZiAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgQVBNVDJfRUFQT0xLZXkgICAgICAgICAgICAgICAgICAzCisjZGVmaW5lIEFQTVQyX0VBUE9MQVNGQWxlcnQgICAgICAgICAgICAgNAorI2RlZmluZSBBUF9NQVhfV1BBX01TRyAgICAgICAgICAgICAgICAgIDUKKworI2RlZmluZSBBUF9XUEFfRlVOQ19TSVpFICAgICAgICAgICAgICAgIChBUF9NQVhfV1BBX1BUS19TVEFURSAqIEFQX01BWF9XUEFfTVNHKQorCisjaWZkZWYgQVBDTElfU1VQUE9SVAorLy9BcENsaSBhdXRoZW50aWNhdGlvbiBzdGF0ZSBtYWNoaW5lCisjZGVmaW5lIEFQQ0xJX0FVVEhfUkVRX0lETEUgICAgICAgICAgICAgICAgMAorI2RlZmluZSBBUENMSV9BVVRIX1dBSVRfU0VRMiAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgQVBDTElfQVVUSF9XQUlUX1NFUTQgICAgICAgICAgICAgICAyCisjZGVmaW5lIEFQQ0xJX01BWF9BVVRIX1NUQVRFICAgICAgICAgICAgICAgMworCisjZGVmaW5lIEFQQ0xJX0FVVEhfTUFDSElORV9CQVNFICAgICAgICAgICAgMAorI2RlZmluZSBBUENMSV9NVDJfTUxNRV9BVVRIX1JFUSAgICAgICAgICAgIDAKKyNkZWZpbmUgQVBDTElfTVQyX01MTUVfREVBVVRIX1JFUSAgICAgICAgICAxCisjZGVmaW5lIEFQQ0xJX01UMl9QRUVSX0FVVEhfRVZFTiAgICAgICAgICAgMgorI2RlZmluZSBBUENMSV9NVDJfUEVFUl9ERUFVVEggICAgICAgICAgICAgIDMKKyNkZWZpbmUgQVBDTElfTVQyX0FVVEhfVElNRU9VVCAgICAgICAgICAgICA0CisjZGVmaW5lIEFQQ0xJX01BWF9BVVRIX01TRyAgICAgICAgICAgICAgICAgNQorCisjZGVmaW5lIEFQQ0xJX0FVVEhfRlVOQ19TSVpFICAgICAgICAgICAgICAgKEFQQ0xJX01BWF9BVVRIX1NUQVRFICogQVBDTElfTUFYX0FVVEhfTVNHKQorCisvL0FwQ2xpIGFzc29jaWF0aW9uIHN0YXRlIG1hY2hpbmUKKyNkZWZpbmUgQVBDTElfQVNTT0NfSURMRSAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEFQQ0xJX0FTU09DX1dBSVRfUlNQICAgICAgICAgICAgICAgMQorI2RlZmluZSBBUENMSV9NQVhfQVNTT0NfU1RBVEUgICAgICAgICAgICAgIDIKKworI2RlZmluZSBBUENMSV9BU1NPQ19NQUNISU5FX0JBU0UgICAgICAgICAgIDAKKyNkZWZpbmUgQVBDTElfTVQyX01MTUVfQVNTT0NfUkVRICAgICAgICAgICAwCisjZGVmaW5lIEFQQ0xJX01UMl9NTE1FX0RJU0FTU09DX1JFUSAgICAgICAgMQorI2RlZmluZSBBUENMSV9NVDJfUEVFUl9ESVNBU1NPQ19SRVEgICAgICAgIDIKKyNkZWZpbmUgQVBDTElfTVQyX1BFRVJfQVNTT0NfUlNQICAgICAgICAgICAzCisjZGVmaW5lIEFQQ0xJX01UMl9BU1NPQ19USU1FT1VUICAgICAgICAgICAgNAorI2RlZmluZSBBUENMSV9NQVhfQVNTT0NfTVNHICAgICAgICAgICAgICAgIDUKKworI2RlZmluZSBBUENMSV9BU1NPQ19GVU5DX1NJWkUgICAgICAgICAgICAgIChBUENMSV9NQVhfQVNTT0NfU1RBVEUgKiBBUENMSV9NQVhfQVNTT0NfTVNHKQorCisvL0FwQ2xpIHN5bmMgc3RhdGUgbWFjaGluZQorI2RlZmluZSBBUENMSV9TWU5DX0lETEUgICAgICAgICAgICAgICAgICAgMCAgLy8gbWVyZ2UgTk9fQlNTLElCU1NfSURMRSxJQlNTX0FDVElWRSBhbmQgQlNTIGluIHRvIDEgc3RhdGUKKyNkZWZpbmUgQVBDTElfSk9JTl9XQUlUX1BST0JFX1JTUCAgICAgICAgIDEKKyNkZWZpbmUgQVBDTElfTUFYX1NZTkNfU1RBVEUgICAgICAgICAgICAgIDIKKworI2RlZmluZSBBUENMSV9TWU5DX01BQ0hJTkVfQkFTRSAgICAgICAgICAgMAorI2RlZmluZSBBUENMSV9NVDJfTUxNRV9QUk9CRV9SRVEgICAgICAgICAgMAorI2RlZmluZSBBUENMSV9NVDJfUEVFUl9QUk9CRV9SU1AgICAgICAgICAgMQorI2RlZmluZSBBUENMSV9NVDJfUFJPQkVfVElNRU9VVCAgICAgICAgICAgMgorI2RlZmluZSBBUENMSV9NQVhfU1lOQ19NU0cgICAgICAgICAgICAgICAgMworCisjZGVmaW5lIEFQQ0xJX1NZTkNfRlVOQ19TSVpFICAgICAgICAgICAgICAoQVBDTElfTUFYX1NZTkNfU1RBVEUgKiBBUENMSV9NQVhfU1lOQ19NU0cpCisKKy8vQXBDbGkgY3RybCBzdGF0ZSBtYWNoaW5lCisjZGVmaW5lIEFQQ0xJX0NUUkxfRElTQ09OTkVDVEVEICAgICAgICAgICAwICAvLyBtZXJnZSBOT19CU1MsSUJTU19JRExFLElCU1NfQUNUSVZFIGFuZCBCU1MgaW4gdG8gMSBzdGF0ZQorI2RlZmluZSBBUENMSV9DVFJMX1BST0JFICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBBUENMSV9DVFJMX0FVVEggICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBBUENMSV9DVFJMX0FVVEhfMiAgICAgICAgICAgICAgICAgMworI2RlZmluZSBBUENMSV9DVFJMX0FTU09DICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBBUENMSV9DVFJMX0RFQVNTT0MgICAgICAgICAgICAgICAgNQorI2RlZmluZSBBUENMSV9DVFJMX0NPTk5FQ1RFRCAgICAgICAgICAgICAgNgorI2RlZmluZSBBUENMSV9NQVhfQ1RSTF9TVEFURSAgICAgICAgICAgICAgNworCisjZGVmaW5lIEFQQ0xJX0NUUkxfTUFDSElORV9CQVNFICAgICAgICAgICAwCisjZGVmaW5lIEFQQ0xJX0NUUkxfSk9JTl9SRVEgICAgICAgICAgICAgICAwCisjZGVmaW5lIEFQQ0xJX0NUUkxfUFJPQkVfUlNQICAgICAgICAgICAgICAxCisjZGVmaW5lIEFQQ0xJX0NUUkxfQVVUSF9SU1AgICAgICAgICAgICAgICAyCisjZGVmaW5lIEFQQ0xJX0NUUkxfRElTQ09OTkVDVF9SRVEgICAgICAgICAzCisjZGVmaW5lIEFQQ0xJX0NUUkxfUEVFUl9ESVNDT05ORUNUX1JFUSAgICA0CisjZGVmaW5lIEFQQ0xJX0NUUkxfQVNTT0NfUlNQICAgICAgICAgICAgICA1CisjZGVmaW5lIEFQQ0xJX0NUUkxfREVBU1NPQ19SU1AgICAgICAgICAgICA2CisjZGVmaW5lIEFQQ0xJX0NUUkxfSk9JTl9SRVFfVElNRU9VVCAgICAgICA3CisjZGVmaW5lIEFQQ0xJX0NUUkxfQVVUSF9SRVFfVElNRU9VVCAgICAgICA4CisjZGVmaW5lIEFQQ0xJX0NUUkxfQVNTT0NfUkVRX1RJTUVPVVQgICAgICA5CisjZGVmaW5lIEFQQ0xJX01BWF9DVFJMX01TRyAgICAgICAgICAgICAgICAxMAorCisjZGVmaW5lIEFQQ0xJX0NUUkxfRlVOQ19TSVpFICAgICAgICAgICAgICAoQVBDTElfTUFYX0NUUkxfU1RBVEUgKiBBUENMSV9NQVhfQ1RSTF9NU0cpCisKKyNpZiAwCS8vIHJlbW92ZSB0aG9zZSB2YXJpYWJsZXMgYnkgQWxiZXJ0WQorLy8gQXBDbGkgV1BBIHN0YXRlIG1hY2hpbmUKKyNkZWZpbmUgQVBDTElfV1BBX1BTS19JRExFCQkJCTAKKyNkZWZpbmUgQVBDTElfTUFYX1dQQV9QU0tfU1RBVEUJCQkxCisKKy8vIEFwQ2xpIFdQQSBNU0cgVHlwZQorI2RlZmluZSBBUENMSV9XUEFfTUFDSElORV9CQVNFCQkJMAorI2RlZmluZSBBUENMSV9NVDJfRUFQUGFja2V0CQkJCTAKKyNkZWZpbmUgQVBDTElfTVQyX0VBUE9MU3RhcnQJCQkxCisjZGVmaW5lIEFQQ0xJX01UMl9FQVBPTExvZ29mZgkJCTIKKyNkZWZpbmUgQVBDTElfTVQyX0VBUE9MS2V5CQkJCTMKKyNkZWZpbmUgQVBDTElfTVQyX0VBUE9MQVNGQWxlcnQJCQk0CisjZGVmaW5lIEFQQ0xJX01BWF9XUEFfUFNLX01TRwkJCTUKKworI2RlZmluZQlBUENMSV9XUEFfUFNLX0ZVTkNfU0laRQkJCShBUENMSV9NQVhfV1BBX1BTS19TVEFURSAqIEFQQ0xJX01BWF9XUEFfUFNLX01TRykKKyNlbmRpZiAvLyBlbmQgLSAwIC8vCisKKyNlbmRpZgkvLyBBUENMSV9TVVBQT1JUIC8vCisKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLy8gdmFsdWUgZG9tYWluIG9mIDgwMi4xMSBoZWFkZXIgRkMuVHl0ZSwgd2hpY2ggaXMgYjMuLmIyIG9mIHRoZSAxc3QtYnl0ZSBvZiBNQUMgaGVhZGVyCisjZGVmaW5lIEJUWVBFX01HTVQgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEJUWVBFX0NOVEwgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEJUWVBFX0RBVEEgICAgICAgICAgICAgICAgICAyCisKKy8vIHZhbHVlIGRvbWFpbiBvZiA4MDIuMTEgTUdNVCBmcmFtZSdzIEZDLnN1YnR5cGUsIHdoaWNoIGlzIGI3Li40IG9mIHRoZSAxc3QtYnl0ZSBvZiBNQUMgaGVhZGVyCisjZGVmaW5lIFNVQlRZUEVfQVNTT0NfUkVRICAgICAgICAgICAwCisjZGVmaW5lIFNVQlRZUEVfQVNTT0NfUlNQICAgICAgICAgICAxCisjZGVmaW5lIFNVQlRZUEVfUkVBU1NPQ19SRVEgICAgICAgICAyCisjZGVmaW5lIFNVQlRZUEVfUkVBU1NPQ19SU1AgICAgICAgICAzCisjZGVmaW5lIFNVQlRZUEVfUFJPQkVfUkVRICAgICAgICAgICA0CisjZGVmaW5lIFNVQlRZUEVfUFJPQkVfUlNQICAgICAgICAgICA1CisjZGVmaW5lIFNVQlRZUEVfQkVBQ09OICAgICAgICAgICAgICA4CisjZGVmaW5lIFNVQlRZUEVfQVRJTSAgICAgICAgICAgICAgICA5CisjZGVmaW5lIFNVQlRZUEVfRElTQVNTT0MgICAgICAgICAgICAxMAorI2RlZmluZSBTVUJUWVBFX0FVVEggICAgICAgICAgICAgICAgMTEKKyNkZWZpbmUgU1VCVFlQRV9ERUFVVEggICAgICAgICAgICAgIDEyCisjZGVmaW5lIFNVQlRZUEVfQUNUSU9OICAgICAgICAgICAgICAxMworI2RlZmluZSBTVUJUWVBFX0FDVElPTl9OT19BQ0sgICAgICAgICAgICAgIDE0CisKKy8vIHZhbHVlIGRvbWFpbiBvZiA4MDIuMTEgQ05UTCBmcmFtZSdzIEZDLnN1YnR5cGUsIHdoaWNoIGlzIGI3Li40IG9mIHRoZSAxc3QtYnl0ZSBvZiBNQUMgaGVhZGVyCisjZGVmaW5lIFNVQlRZUEVfV1JBUFBFUiAgICAgICAJNworI2RlZmluZSBTVUJUWVBFX0JMT0NLX0FDS19SRVEgICAgICAgOAorI2RlZmluZSBTVUJUWVBFX0JMT0NLX0FDSyAgICAgICAgICAgOQorI2RlZmluZSBTVUJUWVBFX1BTX1BPTEwgICAgICAgICAgICAgMTAKKyNkZWZpbmUgU1VCVFlQRV9SVFMgICAgICAgICAgICAgICAgIDExCisjZGVmaW5lIFNVQlRZUEVfQ1RTICAgICAgICAgICAgICAgICAxMgorI2RlZmluZSBTVUJUWVBFX0FDSyAgICAgICAgICAgICAgICAgMTMKKyNkZWZpbmUgU1VCVFlQRV9DRkVORCAgICAgICAgICAgICAgIDE0CisjZGVmaW5lIFNVQlRZUEVfQ0ZFTkRfQ0ZBQ0sgICAgICAgICAxNQorCisvLyB2YWx1ZSBkb21haW4gb2YgODAyLjExIERBVEEgZnJhbWUncyBGQy5zdWJ0eXBlLCB3aGljaCBpcyBiNy4uNCBvZiB0aGUgMXN0LWJ5dGUgb2YgTUFDIGhlYWRlcgorI2RlZmluZSBTVUJUWVBFX0RBVEEgICAgICAgICAgICAgICAgMAorI2RlZmluZSBTVUJUWVBFX0RBVEFfQ0ZBQ0sgICAgICAgICAgMQorI2RlZmluZSBTVUJUWVBFX0RBVEFfQ0ZQT0xMICAgICAgICAgMgorI2RlZmluZSBTVUJUWVBFX0RBVEFfQ0ZBQ0tfQ0ZQT0xMICAgMworI2RlZmluZSBTVUJUWVBFX05VTExfRlVOQyAgICAgICAgICAgNAorI2RlZmluZSBTVUJUWVBFX0NGQUNLICAgICAgICAgICAgICAgNQorI2RlZmluZSBTVUJUWVBFX0NGUE9MTCAgICAgICAgICAgICAgNgorI2RlZmluZSBTVUJUWVBFX0NGQUNLX0NGUE9MTCAgICAgICAgNworI2RlZmluZSBTVUJUWVBFX1FEQVRBICAgICAgICAgICAgICAgOAorI2RlZmluZSBTVUJUWVBFX1FEQVRBX0NGQUNLICAgICAgICAgOQorI2RlZmluZSBTVUJUWVBFX1FEQVRBX0NGUE9MTCAgICAgICAgMTAKKyNkZWZpbmUgU1VCVFlQRV9RREFUQV9DRkFDS19DRlBPTEwgIDExCisjZGVmaW5lIFNVQlRZUEVfUU9TX05VTEwgICAgICAgICAgICAxMgorI2RlZmluZSBTVUJUWVBFX1FPU19DRkFDSyAgICAgICAgICAgMTMKKyNkZWZpbmUgU1VCVFlQRV9RT1NfQ0ZQT0xMICAgICAgICAgIDE0CisjZGVmaW5lIFNVQlRZUEVfUU9TX0NGQUNLX0NGUE9MTCAgICAxNQorCisvLyBBQ0sgcG9saWN5IG9mIFFPUyBDb250cm9sIGZpZWxkIGJpdCA2OjUKKyNkZWZpbmUgTk9STUFMX0FDSyAgICAgICAgICAgICAgICAgIDB4MDAgIC8vIGI2OjUgPSAwMAorI2RlZmluZSBOT19BQ0sgICAgICAgICAgICAgICAgICAgICAgMHgyMCAgLy8gYjY6NSA9IDAxCisjZGVmaW5lIE5PX0VYUExJQ0lUX0FDSyAgICAgICAgICAgICAweDQwICAvLyBiNjo1ID0gMTAKKyNkZWZpbmUgQkxPQ0tfQUNLICAgICAgICAgICAgICAgICAgIDB4NjAgIC8vIGI2OjUgPSAxMQorCisvLworLy8gcnRtcF9kYXRhLmMgdXNlIHRoZXNlIGRlZmluaXRpb24KKy8vCisjZGVmaW5lIExFTkdUSF84MDJfMTEgICAgICAgICAgICAgICAyNAorI2RlZmluZSBMRU5HVEhfODAyXzExX0FORF9IICAgICAgICAgMzAKKyNkZWZpbmUgTEVOR1RIXzgwMl8xMV9DUkNfSCAgICAgICAgIDM0CisjZGVmaW5lIExFTkdUSF84MDJfMTFfQ1JDICAgICAgICAgICAyOAorI2RlZmluZSBMRU5HVEhfODAyXzExX1dJVEhfQUREUjQgICAgMzAKKyNkZWZpbmUgTEVOR1RIXzgwMl8zICAgICAgICAgICAgICAgIDE0CisjZGVmaW5lIExFTkdUSF84MDJfM19UWVBFICAgICAgICAgICAyCisjZGVmaW5lIExFTkdUSF84MDJfMV9IICAgICAgICAgICAgICA4CisjZGVmaW5lIExFTkdUSF9FQVBPTF9IICAgICAgICAgICAgICA0CisjZGVmaW5lIExFTkdUSF9XTU1RT1NfSAkJCQkyCisjZGVmaW5lIExFTkdUSF9DUkMgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIE1BWF9TRVFfTlVNQkVSICAgICAgICAgICAgICAweDBmZmYKKyNkZWZpbmUgTEVOR1RIXzgwMl8zX05PX1RZUEUJCTEyCisjZGVmaW5lIExFTkdUSF84MDJfMVEJCQkJNCAvKiBWTEFOIHJlbGF0ZWQgKi8KKworLy8gU1RBX0NTUjQuZmllbGQuVHhSZXN1bHQKKyNkZWZpbmUgVFhfUkVTVUxUX1NVQ0NFU1MgICAgICAgICAgIDAKKyNkZWZpbmUgVFhfUkVTVUxUX1pFUk9fTEVOR1RIICAgICAgIDEKKyNkZWZpbmUgVFhfUkVTVUxUX1VOREVSX1JVTiAgICAgICAgIDIKKyNkZWZpbmUgVFhfUkVTVUxUX09IWV9FUlJPUiAgICAgICAgIDQKKyNkZWZpbmUgVFhfUkVTVUxUX1JFVFJZX0ZBSUwgICAgICAgIDYKKworLy8gQWxsIFBIWSByYXRlIHN1bW1hcnkgaW4gVFhECisvLyBQcmVhbWJsZSBNT0RFIGluIFR4RAorI2RlZmluZSBNT0RFX0NDSwkwCisjZGVmaW5lIE1PREVfT0ZETSAgIDEKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKyNkZWZpbmUgTU9ERV9IVE1JWAkyCisjZGVmaW5lIE1PREVfSFRHUkVFTkZJRUxECTMKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKy8vIE1DUyBmb3IgQ0NLLiAgQlcuU0dJLlNUQkMgYXJlIHJlc2VydmVkCisjZGVmaW5lIE1DU19MT05HUF9SQVRFXzEgICAgICAgICAgICAgICAgICAgICAgMAkgLy8gbG9uZyBwcmVhbWJsZSBDQ0sgMU1icHMKKyNkZWZpbmUgTUNTX0xPTkdQX1JBVEVfMiAgICAgICAgICAgICAgICAgICAgICAxCS8vIGxvbmcgcHJlYW1ibGUgQ0NLIDFNYnBzCisjZGVmaW5lIE1DU19MT05HUF9SQVRFXzVfNSAgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBNQ1NfTE9OR1BfUkFURV8xMSAgICAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgTUNTX1NIT1JUUF9SQVRFXzEgICAgICAgICAgICAgICAgICAgICAgNAkgLy8gbG9uZyBwcmVhbWJsZSBDQ0sgMU1icHMuIHNob3J0IGlzIGZvcmJpZGRlbiBpbiAxTWJwcworI2RlZmluZSBNQ1NfU0hPUlRQX1JBVEVfMiAgICAgICAgICAgICAgICAgICAgICA1CS8vIHNob3J0IHByZWFtYmxlIENDSyAyTWJwcworI2RlZmluZSBNQ1NfU0hPUlRQX1JBVEVfNV81ICAgICAgICAgICAgICAgICAgICA2CisjZGVmaW5lIE1DU19TSE9SVFBfUkFURV8xMSAgICAgICAgICAgICAgICAgICAgIDcKKy8vIFRvIHNlbmQgZHVwbGljYXRlIGxlZ2FjeSBPRkRNLiBzZXQgQlc9QldfNDAuICBTR0kuU1RCQyBhcmUgcmVzZXJ2ZWQKKyNkZWZpbmUgTUNTX1JBVEVfNiAgICAgICAgICAgICAgICAgICAgICAwICAgLy8gbGVnYWN5IE9GRE0KKyNkZWZpbmUgTUNTX1JBVEVfOSAgICAgICAgICAgICAgICAgICAgICAxICAgLy8gT0ZETQorI2RlZmluZSBNQ1NfUkFURV8xMiAgICAgICAgICAgICAgICAgICAgIDIgICAvLyBPRkRNCisjZGVmaW5lIE1DU19SQVRFXzE4ICAgICAgICAgICAgICAgICAgICAgMyAgIC8vIE9GRE0KKyNkZWZpbmUgTUNTX1JBVEVfMjQgICAgICAgICAgICAgICAgICAgICA0ICAvLyBPRkRNCisjZGVmaW5lIE1DU19SQVRFXzM2ICAgICAgICAgICAgICAgICAgICAgNSAgIC8vIE9GRE0KKyNkZWZpbmUgTUNTX1JBVEVfNDggICAgICAgICAgICAgICAgICAgICA2ICAvLyBPRkRNCisjZGVmaW5lIE1DU19SQVRFXzU0ICAgICAgICAgICAgICAgICAgICAgNyAvLyBPRkRNCisvLyBIVAorI2RlZmluZSBNQ1NfMAkJMAkvLyAxUworI2RlZmluZSBNQ1NfMQkJMQorI2RlZmluZSBNQ1NfMgkJMgorI2RlZmluZSBNQ1NfMwkJMworI2RlZmluZSBNQ1NfNAkJNAorI2RlZmluZSBNQ1NfNQkJNQorI2RlZmluZSBNQ1NfNgkJNgorI2RlZmluZSBNQ1NfNwkJNworI2RlZmluZSBNQ1NfOAkJOAkvLyAyUworI2RlZmluZSBNQ1NfOQkJOQorI2RlZmluZSBNQ1NfMTAJCTEwCisjZGVmaW5lIE1DU18xMQkJMTEKKyNkZWZpbmUgTUNTXzEyCQkxMgorI2RlZmluZSBNQ1NfMTMJCTEzCisjZGVmaW5lIE1DU18xNAkJMTQKKyNkZWZpbmUgTUNTXzE1CQkxNQorI2RlZmluZSBNQ1NfMTYJCTE2CS8vIDMqMworI2RlZmluZSBNQ1NfMTcJCTE3CisjZGVmaW5lIE1DU18xOAkJMTgKKyNkZWZpbmUgTUNTXzE5CQkxOQorI2RlZmluZSBNQ1NfMjAJCTIwCisjZGVmaW5lIE1DU18yMQkJMjEKKyNkZWZpbmUgTUNTXzIyCQkyMgorI2RlZmluZSBNQ1NfMjMJCTIzCisjZGVmaW5lIE1DU18zMgkJMzIKKyNkZWZpbmUgTUNTX0FVVE8JCTMzCisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKy8vIE9JRF9IVFBIWU1PREUKKy8vIE1PREUKKyNkZWZpbmUgSFRNT0RFX01NCTAKKyNkZWZpbmUgSFRNT0RFX0dGCTEKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworLy8gRml4ZWQgVHggTU9ERSAtIEhULCBDQ0sgb3IgT0ZETQorI2RlZmluZSBGSVhFRF9UWE1PREVfSFQJCTAKKyNkZWZpbmUgRklYRURfVFhNT0RFX0NDSwkxCisjZGVmaW5lIEZJWEVEX1RYTU9ERV9PRkRNIAkyCisvLyBCVworI2RlZmluZSBCV18yMAkJQkFORF9XSURUSF8yMAorI2RlZmluZSBCV180MAkJQkFORF9XSURUSF80MAorI2RlZmluZSBCV19CT1RICQlCQU5EX1dJRFRIX0JPVEgKKyNkZWZpbmUgQldfMTAJCUJBTkRfV0lEVEhfMTAJLy8gODAyLjExaiBoYXMgMTBNSHouIFRoaXMgZGVmaW5pdGlvbiBpcyBmb3IgaW50ZXJuYWwgdXNhZ2UuIGRvZXNuJ3QgZmlsbCBpbiB0aGUgSUUgb3Igb3RoZXIgZmllbGQuCisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKy8vIFNIT1JUR0kKKyNkZWZpbmUgR0lfNDAwCQlHQVBfSU5URVJWQUxfNDAwCS8vIG9ubHkgc3VwcG9ydCBpbiBIVCBtb2RlCisjZGVmaW5lIEdJX0JPVEgJCUdBUF9JTlRFUlZBTF9CT1RICisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisjZGVmaW5lIEdJXzgwMAkJR0FQX0lOVEVSVkFMXzgwMAorLy8gU1RCQworI2RlZmluZSBTVEJDX05PTkUJMAorI2lmZGVmIERPVDExX05fU1VQUE9SVAorI2RlZmluZSBTVEJDX1VTRQkxCS8vIGxpbWl0ZWQgdXNlIGluIHJ0Mjg2MGIgcGh5CisjZGVmaW5lIFJYU1RCQ19PTkUJMQkvLyByeCBzdXBwb3J0IG9mIG9uZSBzcGF0aWFsIHN0cmVhbQorI2RlZmluZSBSWFNUQkNfVFdPCTIJLy8gcnggc3VwcG9ydCBvZiAxIGFuZCAyIHNwYXRpYWwgc3RyZWFtCisjZGVmaW5lIFJYU1RCQ19USFIJMwkvLyByeCBzdXBwb3J0IG9mIDF+MyBzcGF0aWFsIHN0cmVhbQorLy8gTUNTIEZFRURCQUNLCisjZGVmaW5lIE1DU0ZCS19OT05FCTAgIC8vIG5vdCBzdXBwb3J0IG1jcyBmZWVkYmFjayAvCisjZGVmaW5lIE1DU0ZCS19SU1YJMQkvLyByZXNlcnZlZAorI2RlZmluZSBNQ1NGQktfVU5TT0xJQ0lUCTIJLy8gb25seSBzdXBwb3J0IHVuc29saWN0IG1jcyBmZWVkYmFjaworI2RlZmluZSBNQ1NGQktfTVJRCTMJLy8gcmVzcG9uc2UgdG8gYm90aCBNUlEgYW5kIHVuc29saWN0IG1jcyBmZWVkYmFjaworCisvLyBNSU1PIHBvd2VyIHNhZmUKKyNkZWZpbmUJTU1QU19TVEFUSUMJMAorI2RlZmluZQlNTVBTX0RZTkFNSUMJCTEKKyNkZWZpbmUgICBNTVBTX1JTVgkJMgorI2RlZmluZSBNTVBTX0VOQUJMRQkJMworCisKKy8vIEEtTVNEVSBzaXplCisjZGVmaW5lCUFNU0RVXzAJMAorI2RlZmluZQlBTVNEVV8xCQkxCisKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworLy8gTUNTIHVzZSA3IGJpdHMKKyNkZWZpbmUgVFhSQVRFTUlNTwkJMHg4MAorI2RlZmluZSBUWFJBVEVNQ1MJCTB4N0YKKyNkZWZpbmUgVFhSQVRFT0ZETQkJMHg3RgorI2RlZmluZSBSQVRFXzEgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBSQVRFXzIgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBSQVRFXzVfNSAgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBSQVRFXzExICAgICAgICAgICAgICAgICAgICAgMworI2RlZmluZSBSQVRFXzYgICAgICAgICAgICAgICAgICAgICAgNCAgIC8vIE9GRE0KKyNkZWZpbmUgUkFURV85ICAgICAgICAgICAgICAgICAgICAgIDUgICAvLyBPRkRNCisjZGVmaW5lIFJBVEVfMTIgICAgICAgICAgICAgICAgICAgICA2ICAgLy8gT0ZETQorI2RlZmluZSBSQVRFXzE4ICAgICAgICAgICAgICAgICAgICAgNyAgIC8vIE9GRE0KKyNkZWZpbmUgUkFURV8yNCAgICAgICAgICAgICAgICAgICAgIDggICAvLyBPRkRNCisjZGVmaW5lIFJBVEVfMzYgICAgICAgICAgICAgICAgICAgICA5ICAgLy8gT0ZETQorI2RlZmluZSBSQVRFXzQ4ICAgICAgICAgICAgICAgICAgICAgMTAgIC8vIE9GRE0KKyNkZWZpbmUgUkFURV81NCAgICAgICAgICAgICAgICAgICAgIDExICAvLyBPRkRNCisjZGVmaW5lIFJBVEVfRklSU1RfT0ZETV9SQVRFICAgICAgICBSQVRFXzYKKyNkZWZpbmUgUkFURV9MQVNUX09GRE1fUkFURSAgICAgICAgCVJBVEVfNTQKKyNkZWZpbmUgUkFURV82XzUgICAgICAgICAgICAgICAgICAgIDEyICAvLyBIVCBtaXgKKyNkZWZpbmUgUkFURV8xMyAgICAgICAgICAgICAgICAgICAgIDEzICAvLyBIVCBtaXgKKyNkZWZpbmUgUkFURV8xOV81ICAgICAgICAgICAgICAgICAgIDE0ICAvLyBIVCBtaXgKKyNkZWZpbmUgUkFURV8yNiAgICAgICAgICAgICAgICAgICAgIDE1ICAvLyBIVCBtaXgKKyNkZWZpbmUgUkFURV8zOSAgICAgICAgICAgICAgICAgICAgIDE2ICAvLyBIVCBtaXgKKyNkZWZpbmUgUkFURV81MiAgICAgICAgICAgICAgICAgICAgIDE3ICAvLyBIVCBtaXgKKyNkZWZpbmUgUkFURV81OF81ICAgICAgICAgICAgICAgICAgIDE4ICAvLyBIVCBtaXgKKyNkZWZpbmUgUkFURV82NSAgICAgICAgICAgICAgICAgICAgIDE5ICAvLyBIVCBtaXgKKyNkZWZpbmUgUkFURV83OCAgICAgICAgICAgICAgICAgICAgIDIwICAvLyBIVCBtaXgKKyNkZWZpbmUgUkFURV8xMDQgICAgICAgICAgICAgICAgICAgIDIxICAvLyBIVCBtaXgKKyNkZWZpbmUgUkFURV8xMTcgICAgICAgICAgICAgICAgICAgIDIyICAvLyBIVCBtaXgKKyNkZWZpbmUgUkFURV8xMzAgICAgICAgICAgICAgICAgICAgIDIzICAvLyBIVCBtaXgKKy8vI2RlZmluZSBSQVRFX0FVVE9fU1dJVENIICAgICAgICAgICAgMjU1IC8vIGZvciBTdGFDZmcuRml4ZWRUeFJhdGUgb25seQorI2RlZmluZSBIVFJBVEVfMCAgICAgICAgICAgICAgICAgICAgICAxMgorI2RlZmluZSBSQVRFX0ZJUlNUX01NX1JBVEUgICAgICAgIEhUUkFURV8wCisjZGVmaW5lIFJBVEVfRklSU1RfSFRfUkFURSAgICAgICAgSFRSQVRFXzAKKyNkZWZpbmUgUkFURV9MQVNUX0hUX1JBVEUgICAgICAgIEhUUkFURV8wCisKKy8vIHBUeFdJLT50eG9wCisjZGVmaW5lIElGU19IVFRYT1AgICAgICAgICAgICAgICAgIDAJLy8gVGhlIHR4b3Agd2lsbCBiZSBoYW5kbGVzIGJ5IEFTSUMuCisjZGVmaW5lIElGU19QSUZTICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIElGU19TSUZTICAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIElGU19CQUNLT0ZGICAgICAgICAgICAgICAgICAzCisKKy8vIHBUeEQtPlJldHJ5TW9kZQorI2RlZmluZSBMT05HX1JFVFJZICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBTSE9SVF9SRVRSWSAgICAgICAgICAgICAgICAgMAorCisvLyBDb3VudHJ5IFJlZ2lvbiBkZWZpbml0aW9uCisjZGVmaW5lIFJFR0lPTl9NSU5JTVVNX0JHX0JBTkQgICAgICAgICAgICAwCisjZGVmaW5lIFJFR0lPTl8wX0JHX0JBTkQgICAgICAgICAgICAgICAgICAwICAgICAgIC8vIDEtMTEKKyNkZWZpbmUgUkVHSU9OXzFfQkdfQkFORCAgICAgICAgICAgICAgICAgIDEgICAgICAgLy8gMS0xMworI2RlZmluZSBSRUdJT05fMl9CR19CQU5EICAgICAgICAgICAgICAgICAgMiAgICAgICAvLyAxMC0xMQorI2RlZmluZSBSRUdJT05fM19CR19CQU5EICAgICAgICAgICAgICAgICAgMyAgICAgICAvLyAxMC0xMworI2RlZmluZSBSRUdJT05fNF9CR19CQU5EICAgICAgICAgICAgICAgICAgNCAgICAgICAvLyAxNAorI2RlZmluZSBSRUdJT05fNV9CR19CQU5EICAgICAgICAgICAgICAgICAgNSAgICAgICAvLyAxLTE0CisjZGVmaW5lIFJFR0lPTl82X0JHX0JBTkQgICAgICAgICAgICAgICAgICA2ICAgICAgIC8vIDMtOQorI2RlZmluZSBSRUdJT05fN19CR19CQU5EICAgICAgICAgICAgICAgICAgNyAgICAgICAvLyA1LTEzCisjZGVmaW5lIFJFR0lPTl8zMV9CR19CQU5EICAgICAgICAgICAgICAgICAzMSAgICAgICAvLyA1LTEzCisjZGVmaW5lIFJFR0lPTl9NQVhJTVVNX0JHX0JBTkQgICAgICAgICAgICA3CisKKyNkZWZpbmUgUkVHSU9OX01JTklNVU1fQV9CQU5EICAgICAgICAgICAgIDAKKyNkZWZpbmUgUkVHSU9OXzBfQV9CQU5EICAgICAgICAgICAgICAgICAgIDAgICAgICAgLy8gMzYsIDQwLCA0NCwgNDgsIDUyLCA1NiwgNjAsIDY0LCAxNDksIDE1MywgMTU3LCAxNjEsIDE2NQorI2RlZmluZSBSRUdJT05fMV9BX0JBTkQgICAgICAgICAgICAgICAgICAgMSAgICAgICAvLyAzNiwgNDAsIDQ0LCA0OCwgNTIsIDU2LCA2MCwgNjQsIDEwMCwgMTA0LCAxMDgsIDExMiwgMTE2LCAxMjAsIDEyNCwgMTI4LCAxMzIsIDEzNiwgMTQwCisjZGVmaW5lIFJFR0lPTl8yX0FfQkFORCAgICAgICAgICAgICAgICAgICAyICAgICAgIC8vIDM2LCA0MCwgNDQsIDQ4LCA1MiwgNTYsIDYwLCA2NAorI2RlZmluZSBSRUdJT05fM19BX0JBTkQgICAgICAgICAgICAgICAgICAgMyAgICAgICAvLyA1MiwgNTYsIDYwLCA2NCwgMTQ5LCAxNTMsIDE1NywgMTYxCisjZGVmaW5lIFJFR0lPTl80X0FfQkFORCAgICAgICAgICAgICAgICAgICA0ICAgICAgIC8vIDE0OSwgMTUzLCAxNTcsIDE2MSwgMTY1CisjZGVmaW5lIFJFR0lPTl81X0FfQkFORCAgICAgICAgICAgICAgICAgICA1ICAgICAgIC8vIDE0OSwgMTUzLCAxNTcsIDE2MQorI2RlZmluZSBSRUdJT05fNl9BX0JBTkQgICAgICAgICAgICAgICAgICAgNiAgICAgICAvLyAzNiwgNDAsIDQ0LCA0OAorI2RlZmluZSBSRUdJT05fN19BX0JBTkQgICAgICAgICAgICAgICAgICAgNyAgICAgICAvLyAzNiwgNDAsIDQ0LCA0OCwgNTIsIDU2LCA2MCwgNjQsIDEwMCwgMTA0LCAxMDgsIDExMiwgMTE2LCAxMjAsIDEyNCwgMTI4LCAxMzIsIDEzNiwgMTQwLCAxNDksIDE1MywgMTU3LCAxNjEsIDE2NQorI2RlZmluZSBSRUdJT05fOF9BX0JBTkQgICAgICAgICAgICAgICAgICAgOCAgICAgICAvLyA1MiwgNTYsIDYwLCA2NAorI2RlZmluZSBSRUdJT05fOV9BX0JBTkQgICAgICAgICAgICAgICAgICAgOSAgICAgICAvLyAzNiwgNDAsIDQ0LCA0OCwgNTIsIDU2LCA2MCwgNjQsIDEwMCwgMTA0LCAxMDgsIDExMiwgMTE2LCAxMzIsIDEzNiwgMTQwLCAxNDksIDE1MywgMTU3LCAxNjEsIDE2NQorI2RlZmluZSBSRUdJT05fMTBfQV9CQU5EICAgICAgICAgICAgICAgICAgMTAJICAvLyAzNiwgNDAsIDQ0LCA0OCwgMTQ5LCAxNTMsIDE1NywgMTYxLCAxNjUKKyNkZWZpbmUgUkVHSU9OXzExX0FfQkFORCAgICAgICAgICAgICAgICAgIDExCSAgLy8gMzYsIDQwLCA0NCwgNDgsIDUyLCA1NiwgNjAsIDY0LCAxMDAsIDEwNCwgMTA4LCAxMTIsIDExNiwgMTIwLCAxNDksIDE1MywgMTU3LCAxNjEKKyNkZWZpbmUgUkVHSU9OX01BWElNVU1fQV9CQU5EICAgICAgICAgICAgIDExCisKKy8vIHBUeEQtPkNpcGhlckFsZworI2RlZmluZSBDSVBIRVJfTk9ORSAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBDSVBIRVJfV0VQNjQgICAgICAgICAgICAgICAgMQorI2RlZmluZSBDSVBIRVJfV0VQMTI4ICAgICAgICAgICAgICAgMgorI2RlZmluZSBDSVBIRVJfVEtJUCAgICAgICAgICAgICAgICAgMworI2RlZmluZSBDSVBIRVJfQUVTICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBDSVBIRVJfQ0tJUDY0ICAgICAgICAgICAgICAgNQorI2RlZmluZSBDSVBIRVJfQ0tJUDEyOCAgICAgICAgICAgICAgNgorI2RlZmluZSBDSVBIRVJfVEtJUF9OT19NSUMgICAgICAgICAgNyAgICAgICAvLyBNSUMgYXBwZW5kZWQgYnkgZHJpdmVyOiBub3QgYSB2YWxpZCB2YWx1ZSBpbiBoYXJkd2FyZSBrZXkgdGFibGUKKyNkZWZpbmUgQ0lQSEVSX1NNUzQJCQkJCTgKKworLy8gdmFsdWUgZG9tYWluIG9mIHBBZC0+UmZJY1R5cGUKKyNkZWZpbmUgUkZJQ18yODIwICAgICAgICAgICAgICAgICAgIDEgICAgICAgLy8gMi40RyAyVDNSCisjZGVmaW5lIFJGSUNfMjg1MCAgICAgICAgICAgICAgICAgICAyICAgICAgIC8vIDIuNEcvNUcgMlQzUgorI2RlZmluZSBSRklDXzI3MjAgICAgICAgICAgICAgICAgICAgMyAgICAgICAvLyAyLjRHIDFUMlIKKyNkZWZpbmUgUkZJQ18yNzUwICAgICAgICAgICAgICAgICAgIDQgICAgICAgLy8gMi40Ry81RyAxVDJSCisjZGVmaW5lIFJGSUNfMzAyMCAgICAgICAgICAgICAgICAgICA1ICAgICAgIC8vIDIuNEcgMVQxUgorI2RlZmluZSBSRklDXzIwMjAgICAgICAgICAgICAgICAgICAgNiAgICAgICAvLyAyLjRHIEIvRworCisvLyBMRUQgU3RhdHVzLgorI2RlZmluZSBMRURfTElOS19ET1dOICAgICAgICAgICAgICAgMAorI2RlZmluZSBMRURfTElOS19VUCAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBMRURfUkFESU9fT0ZGICAgICAgICAgICAgICAgMgorI2RlZmluZSBMRURfUkFESU9fT04gICAgICAgICAgICAgICAgMworI2RlZmluZSBMRURfSEFMVCAgICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBMRURfV1BTICAgICAgICAgICAgICAgICAgICAgNQorI2RlZmluZSBMRURfT05fU0lURV9TVVJWRVkgICAgICAgICAgNgorI2RlZmluZSBMRURfUE9XRVJfVVAgICAgICAgICAgICAgICAgNworCisvLyB2YWx1ZSBkb21haW4gb2YgcEFkLT5MZWRDbnRsLkxlZE1vZGUgYW5kIEUyUFJPTQorI2RlZmluZSBMRURfTU9ERV9ERUZBVUxUICAgICAgICAgICAgMAorI2RlZmluZSBMRURfTU9ERV9UV09fTEVECQkJMQorI2RlZmluZSBMRURfTU9ERV9TSUdOQUxfU1RSRUdUSAkJOCAgLy8gRUVQUk9NIGRlZmluZSA9OAorCisvLyBSQzQgaW5pdCB2YWx1ZSwgdXNlZCBmcm8gV0VQICYgVEtJUAorI2RlZmluZSBQUFBJTklURkNTMzIgICAgICAgICAgICAgICAgMHhmZmZmZmZmZiAgIC8qIEluaXRpYWwgRkNTIHZhbHVlICovCisKKy8vIHZhbHVlIGRvbWFpbiBvZiBwQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZC4gODAyLjFYIGNvbnRyb2xsZWQgcG9ydCBkZWZpbml0aW9uCisjZGVmaW5lIFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEICAgICAxCisjZGVmaW5lIFdQQV84MDJfMVhfUE9SVF9OT1RfU0VDVVJFRCAyCisKKyNkZWZpbmUgUEFJUldJU0VfS0VZICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgR1JPVVBfS0VZICAgICAgICAgICAgICAgICAgIDIKKworLy9kZWZpbml0aW9uIG9mIERSUworI2RlZmluZSBNQVhfU1RFUF9PRl9UWF9SQVRFX1NXSVRDSAkzMgorCisKKy8vIHByZS1hbGxvY2F0ZWQgZnJlZSBORElTIFBBQ0tFVC9CVUZGRVIgcG9sbCBmb3IgaW50ZXJuYWwgdXNhZ2UKKyNkZWZpbmUgTUFYX05VTV9PRl9GUkVFX05ESVNfUEFDS0VUIDEyOAorCisvL0Jsb2NrIEFDSworI2RlZmluZSBNQVhfVFhfUkVPUkRFUkJVRiAgIDY0CisjZGVmaW5lIE1BWF9SWF9SRU9SREVSQlVGICAgNjQKKyNkZWZpbmUgREVGQVVMVF9UWF9USU1FT1VUICAgMzAKKyNkZWZpbmUgREVGQVVMVF9SWF9USU1FT1VUICAgMzAKKworLy8gZGVmaW5pdGlvbiBvZiBSZWNpcGllbnQgb3IgT3JpZ2luYXRvcgorI2RlZmluZSBJX1JFQ0lQSUVOVCAgICAgICAgICAgICAgICAgIFRSVUUKKyNkZWZpbmUgSV9PUklHSU5BVE9SICAgICAgICAgICAgICAgICAgIEZBTFNFCisKKyNkZWZpbmUgREVGQVVMVF9CQlBfVFhfUE9XRVIgICAgICAgIDAKKyNkZWZpbmUgREVGQVVMVF9SRl9UWF9QT1dFUiAgICAgICAgIDUKKworI2RlZmluZSBNQVhfSU5JX0JVRkZFUl9TSVpFCQkJNDA5NgorI2RlZmluZSBNQVhfUEFSQU1fQlVGRkVSX1NJWkUJCSgyMDQ4KSAvLyBlbm91Z2ggZm9yIEFDTCAoMTgqNjQpCisJCQkJCQkJCQkJCS8vMTggOiB0aGUgbGVuZ3RoIG9mIE1hYyBhZGRyZXNzIGFjY2VwdGFibGUgZm9ybWF0ICIwMTowMjowMzowNDowNTowNjsiKQorCQkJCQkJCQkJCQkvLzY0IDogTUFYX05VTV9PRl9BQ0xfTElTVAorLy8gZGVmaW5pdGlvbiBvZiBwQWQtPk9wTW9kZQorI2RlZmluZSBPUE1PREVfU1RBICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBPUE1PREVfQVAgICAgICAgICAgICAgICAgICAgMQorLy8jZGVmaW5lIE9QTU9ERV9MM19CUkcgICAgICAgICAgICAgICAyICAgICAgIC8vIGFzIEFQIGFuZCBTVEEgYXQgdGhlIHNhbWUgdGltZQorCisjaWZkZWYgUlRfQklHX0VORElBTgorI2RlZmluZSBESVJfUkVBRCAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBESVJfV1JJVEUgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBUWVBFX1RYRCAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBUWVBFX1JYRCAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBUWVBFX1RYSU5GTwkJCQkJMAorI2RlZmluZSBUWVBFX1JYSU5GTwkJCQkJMQorI2RlZmluZSBUWVBFX1RYV0kJCQkJCTAKKyNkZWZpbmUgVFlQRV9SWFdJCQkJCQkxCisjZW5kaWYKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PSBBUCBydG1wX2RlZi5oID09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gdmFsdWUgZG9tYWluIGZvciBwQWQtPkV2ZW50VGFiLkxvZ1tdLkV2ZW50CisjZGVmaW5lIEVWRU5UX1JFU0VUX0FDQ0VTU19QT0lOVCAgICAwIC8vIExvZyA9ICJoaDptbTpzcyAgIFJlc3RhcnQgQWNjZXNzIFBvaW50IgorI2RlZmluZSBFVkVOVF9BU1NPQ0lBVEVEICAgICAgICAgICAgMSAvLyBMb2cgPSAiaGg6bW06c3MgICBTVEEgMDA6MDE6MDI6MDM6MDQ6MDUgYXNzb2NpYXRlZCIKKyNkZWZpbmUgRVZFTlRfRElTQVNTT0NJQVRFRCAgICAgICAgIDIgLy8gTG9nID0gImhoOm1tOnNzICAgU1RBIDAwOjAxOjAyOjAzOjA0OjA1IGxlZnQgdGhpcyBCU1MiCisjZGVmaW5lIEVWRU5UX0FHRURfT1VUICAgICAgICAgICAgICAzIC8vIExvZyA9ICJoaDptbTpzcyAgIFNUQSAwMDowMTowMjowMzowNDowNSB3YXMgYWdlZC1vdXQgYW5kIHJlbW92ZWQgZnJvbSB0aGlzIEJTUyIKKyNkZWZpbmUgRVZFTlRfQ09VTlRFUl9NICAgICAgICAgICAgIDQKKyNkZWZpbmUgRVZFTlRfSU5WQUxJRF9QU0sgICAgICAgICAgIDUKKyNkZWZpbmUgRVZFTlRfTUFYX0VWRU5UX1RZUEUgICAgICAgIDYKKy8vID09PT0gZW5kIG9mIEFQIHJ0bXBfZGVmLmggPT09PT09PT09PT09CisKKy8vIGRlZmluaXRpb24gUlNTSSBOdW1iZXIKKyNkZWZpbmUgUlNTSV8wCQkJCQkwCisjZGVmaW5lIFJTU0lfMQkJCQkJMQorI2RlZmluZSBSU1NJXzIJCQkJCTIKKworLy8gZGVmaW5pdGlvbiBvZiByYWRhciBkZXRlY3Rpb24KKyNkZWZpbmUgUkRfTk9STUFMX01PREUJCQkJMAkvLyBOb3QgZm91bmQgcmFkYXIgc2lnbmFsCisjZGVmaW5lIFJEX1NXSVRDSElOR19NT0RFCQkJMQkvLyBGb3VuZCByYWRhciBzaWduYWwsIGFuZCBkb2luZyBjaGFubmVsIHN3aXRjaAorI2RlZmluZSBSRF9TSUxFTkNFX01PREUJCQkJMgkvLyBBZnRlciBjaGFubmVsIHN3aXRjaCwgbmVlZCB0byBiZSBzaWxlbmNlIGEgd2hpbGUgdG8gZW5zdXJlIHJhZGFyIG5vdCBmb3VuZAorCisvL0RyaXZlciBkZWZpbmVkIGNpZCBmb3IgbWFwcGluZyBzdGF0dXMgYW5kIGNvbW1hbmQuCisjZGVmaW5lICBTTEVFUENJRAkweDExCisjZGVmaW5lICBXQUtFQ0lECTB4MjIKKyNkZWZpbmUgIFFVRVJZUE9XRVJDSUQJMHgzMworI2RlZmluZSAgT1dORVJNQ1UJMHgxCisjZGVmaW5lICBPV05FUkNQVQkweDAKKworLy8gTUJTU0lEIGRlZmluaXRpb24KKyNkZWZpbmUgRU5UUllfTk9UX0ZPVU5EICAgICAgICAgICAgIDB4RkYKKworCisvKiBBZnRlciBMaW51eCAyLjYuOSwKKyAqIFZMQU4gbW9kdWxlIHVzZSBQcml2YXRlIChmcm9tIHVzZXIpIGludGVyZmFjZSBmbGFncyAobmV0ZGV2aWNlLT5wcml2X2ZsYWdzKS4KKyAqICNkZWZpbmUgSUZGXzgwMl8xUV9WTEFOIDB4MSAgICAgICAgIC0tICAgIDgwMi4xUSBWTEFOIGRldmljZS4gIGluIGlmLmgKKyAqIHJlZiB0byBpcF9zYWJvdGFnZV9vdXQoKSBbIG91dC0+cHJpdl9mbGFncyAmIElGRl84MDJfMVFfVkxBTiBdIGluIGJyX25ldGZpbHRlci5jCisgKgorICogRm9yIHRoaXMgcmVhc29uLCB3ZSBNVVNUIHVzZSBFVkVOIHZhbHVlIGluIHByaXZfZmxhZ3MKKyAqLworI2RlZmluZSBJTlRfTUFJTiAgICAgICAgICAgICAgICAgICAgMHgwMTAwCisjZGVmaW5lIElOVF9NQlNTSUQgICAgICAgICAgICAgICAgICAweDAyMDAKKyNkZWZpbmUgSU5UX1dEUyAgICAgICAgICAgICAgICAgICAgIDB4MDMwMAorI2RlZmluZSBJTlRfQVBDTEkgICAgICAgICAgICAgICAgICAgMHgwNDAwCisjZGVmaW5lIElOVF9NRVNIICAgICAgICAgICAgICAgICAgIAkweDA1MDAKKworLy8gVXNlIGJpdG1hcCB0byBhbGxvdyBjb2V4aXN0IG9mIEFURV9UWEZSQU1FIGFuZCBBVEVfUlhGUkFNRShpLmUuLHRvIHN1cHBvcnQgTG9vcEJhY2sgbW9kZSkKKyNpZmRlZiBSQUxJTktfQVRFCisjZGVmaW5lCUFURV9TVEFSVCAgICAgICAgICAgICAgICAgICAweDAwICAgLy8gU3RhcnQgQVRFCisjZGVmaW5lCUFURV9TVE9QICAgICAgICAgICAgICAgICAgICAweDgwICAgLy8gU3RvcCBBVEUKKyNkZWZpbmUJQVRFX1RYQ09OVCAgICAgICAgICAgICAgICAgIDB4MDUgICAvLyBDb250aW51b3VzIFRyYW5zbWl0CisjZGVmaW5lCUFURV9UWENBUlIgICAgICAgICAgICAgICAgICAweDA5ICAgLy8gVHJhbnNtaXQgQ2FycmllcgorI2RlZmluZQlBVEVfVFhDQVJSU1VQUCAgICAgICAgICAgICAgMHgxMSAgIC8vIFRyYW5zbWl0IENhcnJpZXIgU3VwcHJlc3Npb24KKyNkZWZpbmUJQVRFX1RYRlJBTUUgICAgICAgICAgICAgICAgIDB4MDEgICAvLyBUcmFuc21pdCBGcmFtZXMKKyNkZWZpbmUJQVRFX1JYRlJBTUUgICAgICAgICAgICAgICAgIDB4MDIgICAvLyBSZWNlaXZlIEZyYW1lcworI2lmZGVmIFJBTElOS18yOHh4X1FBCisjZGVmaW5lIEFURV9UWFNUT1AgICAgICAgICAgICAgICAgICAweGUyICAgLy8gU3RvcCBUcmFuc21pdGlvbihpLmUuLCBUWENPTlQsIFRYQ0FSUiwgVFhDQVJSU1VQUCwgYW5kIFRYRlJBTUUpCisjZGVmaW5lIEFURV9SWFNUT1AJCQkJCTB4ZmQgICAvLyBTdG9wIHJlY2VpdmluZyBGcmFtZXMKKyNkZWZpbmUJQkJQMjJfVFhGUkFNRSAgICAgCQkJMHgwMCAgIC8vIFRyYW5zbWl0IEZyYW1lcworI2RlZmluZQlCQlAyMl9UWENPTlRfT1JfQ0FSUlNVUFAgICAgMHg4MCAgIC8vIENvbnRpbnVvdXMgVHJhbnNtaXQgb3IgQ2FycmllciBTdXBwcmVzc2lvbgorI2RlZmluZQlCQlAyMl9UWENBUlIgICAgICAgICAgICAgICAgMHhjMSAgIC8vIFRyYW5zbWl0IENhcnJpZXIKKyNkZWZpbmUJQkJQMjRfVFhDT05UICAgICAgICAgICAgICAgIDB4MDAgICAvLyBDb250aW51b3VzIFRyYW5zbWl0CisjZGVmaW5lCUJCUDI0X0NBUlJTVVBQICAgICAgICAgICAgICAweDAxICAgLy8gQ2FycmllciBTdXBwcmVzc2lvbgorI2VuZGlmIC8vIFJBTElOS18yOHh4X1FBIC8vCisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCisvLyBXRVAgS2V5IFRZUEUKKyNkZWZpbmUgV0VQX0hFWEFERUNJTUFMX1RZUEUgICAgMAorI2RlZmluZSBXRVBfQVNDSUlfVFlQRSAgICAgICAgICAxCisKKworCisvLyBXSVJFTEVTUyBFVkVOVFMgZGVmaW5pdGlvbgorLyogTWF4IG51bWJlciBvZiBjaGFyIGluIGN1c3RvbSBldmVudCwgcmVmZXIgdG8gd2lyZWxlc3NfdG9vbHMuMjgvd2lyZWxlc3MuMjAuaCAqLworI2RlZmluZSBJV19DVVNUT01fTUFYX0xFTgkJCQkgIAkJCTI1NQkvKiBJbiBieXRlcyAqLworCisvLyBGb3Igc3lzdGVtIGV2ZW50IC0gc3RhcnQKKyNkZWZpbmUJSVdfU1lTX0VWRU5UX0ZMQUdfU1RBUlQgICAgICAgICAgICAgICAgICAgICAweDAyMDAKKyNkZWZpbmUJSVdfQVNTT0NfRVZFTlRfRkxBRyAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMDAKKyNkZWZpbmUJSVdfRElTQVNTT0NfRVZFTlRfRkxBRyAgICAgICAgICAgICAgICAgICAgICAweDAyMDEKKyNkZWZpbmUJSVdfREVBVVRIX0VWRU5UX0ZMQUcgICAgICAgICAgICAgICAgICAgICAgCTB4MDIwMgorI2RlZmluZQlJV19BR0VPVVRfRVZFTlRfRkxBRyAgICAgICAgICAgICAgICAgICAgICAJMHgwMjAzCisjZGVmaW5lCUlXX0NPVU5URVJfTUVBU1VSRVNfRVZFTlRfRkxBRyAgICAgICAgICAgICAgMHgwMjA0CisjZGVmaW5lCUlXX1JFUExBWV9DT1VOVEVSX0RJRkZfRVZFTlRfRkxBRyAgICAgICAgICAgMHgwMjA1CisjZGVmaW5lCUlXX1JTTklFX0RJRkZfRVZFTlRfRkxBRyAgICAgICAgICAgCQkJMHgwMjA2CisjZGVmaW5lCUlXX01JQ19ESUZGX0VWRU5UX0ZMQUcgICAgICAgICAgIAkJCTB4MDIwNworI2RlZmluZSBJV19JQ1ZfRVJST1JfRVZFTlRfRkxBRwkJCQkJCTB4MDIwOAorI2RlZmluZSBJV19NSUNfRVJST1JfRVZFTlRfRkxBRwkJCQkJCTB4MDIwOQorI2RlZmluZSBJV19HUk9VUF9IU19USU1FT1VUX0VWRU5UX0ZMQUcJCQkJMHgwMjBBCisjZGVmaW5lCUlXX1BBSVJXSVNFX0hTX1RJTUVPVVRfRVZFTlRfRkxBRwkJCTB4MDIwQgorI2RlZmluZSBJV19SU05JRV9TQU5JVFlfRkFJTF9FVkVOVF9GTEFHCQkJCTB4MDIwQworI2RlZmluZSBJV19TRVRfS0VZX0RPTkVfV1BBMV9FVkVOVF9GTEFHCQkJCTB4MDIwRAorI2RlZmluZSBJV19TRVRfS0VZX0RPTkVfV1BBMl9FVkVOVF9GTEFHCQkJCTB4MDIwRQorI2RlZmluZSBJV19TVEFfTElOS1VQX0VWRU5UX0ZMQUcJCQkJCTB4MDIwRgorI2RlZmluZSBJV19TVEFfTElOS0RPV05fRVZFTlRfRkxBRwkJCQkJMHgwMjEwCisjZGVmaW5lIElXX1NDQU5fQ09NUExFVEVEX0VWRU5UX0ZMQUcJCQkJMHgwMjExCisjZGVmaW5lIElXX1NDQU5fRU5RVUVVRV9GQUlMX0VWRU5UX0ZMQUcJCQkJMHgwMjEyCisvLyBpZiBhZGQgbmV3IHN5c3RlbSBldmVudCBmbGFnLCBwbGVhc2UgdXBhZHRlIHRoZSBJV19TWVNfRVZFTlRfRkxBR19FTkQKKyNkZWZpbmUJSVdfU1lTX0VWRU5UX0ZMQUdfRU5EICAgICAgICAgICAgICAgICAgICAgICAweDAyMTIKKyNkZWZpbmUJSVdfU1lTX0VWRU5UX1RZUEVfTlVNCQkJCQkJKElXX1NZU19FVkVOVF9GTEFHX0VORCAtIElXX1NZU19FVkVOVF9GTEFHX1NUQVJUICsgMSkKKy8vIEZvciBzeXN0ZW0gZXZlbnQgLSBlbmQKKworLy8gRm9yIHNwb29mIGF0dGFjayBldmVudCAtIHN0YXJ0CisjZGVmaW5lCUlXX1NQT09GX0VWRU5UX0ZMQUdfU1RBUlQgICAgICAgICAgICAgICAgICAgMHgwMzAwCisjZGVmaW5lIElXX0NPTkZMSUNUX1NTSURfRVZFTlRfRkxBRwkJCQkJMHgwMzAwCisjZGVmaW5lIElXX1NQT09GX0FTU09DX1JFU1BfRVZFTlRfRkxBRwkJCQkweDAzMDEKKyNkZWZpbmUgSVdfU1BPT0ZfUkVBU1NPQ19SRVNQX0VWRU5UX0ZMQUcJCQkweDAzMDIKKyNkZWZpbmUgSVdfU1BPT0ZfUFJPQkVfUkVTUF9FVkVOVF9GTEFHCQkJCTB4MDMwMworI2RlZmluZSBJV19TUE9PRl9CRUFDT05fRVZFTlRfRkxBRwkJCQkJMHgwMzA0CisjZGVmaW5lIElXX1NQT09GX0RJU0FTU09DX0VWRU5UX0ZMQUcJCQkJMHgwMzA1CisjZGVmaW5lIElXX1NQT09GX0FVVEhfRVZFTlRfRkxBRwkJCQkJMHgwMzA2CisjZGVmaW5lIElXX1NQT09GX0RFQVVUSF9FVkVOVF9GTEFHCQkJCQkweDAzMDcKKyNkZWZpbmUgSVdfU1BPT0ZfVU5LTk9XTl9NR01UX0VWRU5UX0ZMQUcJCQkweDAzMDgKKyNkZWZpbmUgSVdfUkVQTEFZX0FUVEFDS19FVkVOVF9GTEFHCQkJCQkweDAzMDkKKy8vIGlmIGFkZCBuZXcgc3Bvb2YgYXR0YWNrIGV2ZW50IGZsYWcsIHBsZWFzZSB1cGFkdGUgdGhlIElXX1NQT09GX0VWRU5UX0ZMQUdfRU5ECisjZGVmaW5lCUlXX1NQT09GX0VWRU5UX0ZMQUdfRU5EICAgICAgICAgICAgICAgICAgICAgMHgwMzA5CisjZGVmaW5lCUlXX1NQT09GX0VWRU5UX1RZUEVfTlVNCQkJCQkJKElXX1NQT09GX0VWRU5UX0ZMQUdfRU5EIC0gSVdfU1BPT0ZfRVZFTlRfRkxBR19TVEFSVCArIDEpCisvLyBGb3Igc3Bvb2YgYXR0YWNrIGV2ZW50IC0gZW5kCisKKy8vIEZvciBmbG9vZGluZyBhdHRhY2sgZXZlbnQgLSBzdGFydAorI2RlZmluZQlJV19GTE9PRF9FVkVOVF9GTEFHX1NUQVJUICAgICAgICAgICAgICAgICAgIDB4MDQwMAorI2RlZmluZSBJV19GTE9PRF9BVVRIX0VWRU5UX0ZMQUcJCQkJCTB4MDQwMAorI2RlZmluZSBJV19GTE9PRF9BU1NPQ19SRVFfRVZFTlRfRkxBRwkJCQkweDA0MDEKKyNkZWZpbmUgSVdfRkxPT0RfUkVBU1NPQ19SRVFfRVZFTlRfRkxBRwkJCQkweDA0MDIKKyNkZWZpbmUgSVdfRkxPT0RfUFJPQkVfUkVRX0VWRU5UX0ZMQUcJCQkJMHgwNDAzCisjZGVmaW5lIElXX0ZMT09EX0RJU0FTU09DX0VWRU5UX0ZMQUcJCQkJMHgwNDA0CisjZGVmaW5lIElXX0ZMT09EX0RFQVVUSF9FVkVOVF9GTEFHCQkJCQkweDA0MDUKKyNkZWZpbmUgSVdfRkxPT0RfRUFQX1JFUV9FVkVOVF9GTEFHCQkJCQkweDA0MDYKKy8vIGlmIGFkZCBuZXcgZmxvb2RpbmcgYXR0YWNrIGV2ZW50IGZsYWcsIHBsZWFzZSB1cGFkdGUgdGhlIElXX0ZMT09EX0VWRU5UX0ZMQUdfRU5ECisjZGVmaW5lCUlXX0ZMT09EX0VWRU5UX0ZMQUdfRU5EICAgICAgICAgICAgICAgICAgIAkweDA0MDYKKyNkZWZpbmUJSVdfRkxPT0RfRVZFTlRfVFlQRV9OVU0JCQkJCQkoSVdfRkxPT0RfRVZFTlRfRkxBR19FTkQgLSBJV19GTE9PRF9FVkVOVF9GTEFHX1NUQVJUICsgMSkKKy8vIEZvciBmbG9vZGluZyBhdHRhY2sgLSBlbmQKKworLy8gRW5kIC0gV0lSRUxFU1MgRVZFTlRTIGRlZmluaXRpb24KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorLy8gZGVmaW5pdGlvbiBmb3IgRExTLCBrYXRoeQorI2RlZmluZQlNQVhfTlVNX09GX0lOSVRfRExTX0VOVFJZICAgMQorI2RlZmluZQlNQVhfTlVNX09GX0RMU19FTlRSWSAgICAgICAgTUFYX05VTUJFUl9PRl9ETFNfRU5UUlkKKworLy9CbG9jayBBQ0sgLCBydDI4NjAsIGthdGh5CisjZGVmaW5lIE1BWF9UWF9SRU9SREVSQlVGCQk2NAorI2RlZmluZSBNQVhfUlhfUkVPUkRFUkJVRgkJNjQKKyNkZWZpbmUgREVGQVVMVF9UWF9USU1FT1VUCQkzMAorI2RlZmluZSBERUZBVUxUX1JYX1RJTUVPVVQJCTMwCisjaWZuZGVmIENPTkZJR19BUF9TVVBQT1JUCisjZGVmaW5lIE1BWF9CQVJFQ0lfU0VTU0lPTgkJOAorI2VuZGlmCisKKyNpZm5kZWYgSVdfRVNTSURfTUFYX1NJWkUKKy8qIE1heGltdW0gc2l6ZSBvZiB0aGUgRVNTSUQgYW5kIHBBZC0+bmlja25hbWUgc3RyaW5ncyAqLworI2RlZmluZSBJV19FU1NJRF9NQVhfU0laRSAgIAkJMzIKKyNlbmRpZgorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisjaWZkZWYgTUNBU1RfUkFURV9TUEVDSUZJQworI2RlZmluZSBNQ0FTVF9ESVNBQkxFCTAKKyNkZWZpbmUgTUNBU1RfQ0NLCQkxCisjZGVmaW5lIE1DQVNUX09GRE0JCTIKKyNkZWZpbmUgTUNBU1RfSFRNSVgJCTMKKyNlbmRpZiAvLyBNQ0FTVF9SQVRFX1NQRUNJRklDIC8vCisKKy8vIEZvciBBc2ljUmFkaW9PZmYvQXNpY1JhZGlvT24gZnVuY3Rpb24KKyNkZWZpbmUgRE9UMTFQT1dFUlNBVkUJCTAKKyNkZWZpbmUgR1VJUkFESU9fT0ZGCQkxCisjZGVmaW5lIFJUTVBfSEFMVAkJICAgIDIKKyNkZWZpbmUgR1VJX0lETEVfUE9XRVJfU0FWRQkJMworLy8gLS0KKworCisvLyBkZWZpbml0aW9uIGZvciBXcGFTdXBwb3J0IGZsYWcKKyNkZWZpbmUgV1BBX1NVUFBMSUNBTlRfRElTQUJMRQkJCQkwCisjZGVmaW5lIFdQQV9TVVBQTElDQU5UX0VOQUJMRQkJCQkxCisjZGVmaW5lCVdQQV9TVVBQTElDQU5UX0VOQUJMRV9XSVRIX1dFQl9VSQkyCisKKy8vIEVuZGlhbiBieXRlIHN3YXBwaW5nIGNvZGVzCisjZGVmaW5lIFNXQVAxNih4KSBcCisgICAgKChVSU5UMTYpKCBcCisgICAgKCgoVUlOVDE2KSh4KSAmIChVSU5UMTYpIDB4MDBmZlUpIDw8IDgpIHwgXAorICAgICgoKFVJTlQxNikoeCkgJiAoVUlOVDE2KSAweGZmMDBVKSA+PiA4KSApKQorCisjZGVmaW5lIFNXQVAzMih4KSBcCisgICAgKChVSU5UMzIpKCBcCisgICAgKCgoVUlOVDMyKSh4KSAmIChVSU5UMzIpIDB4MDAwMDAwZmZVTCkgPDwgMjQpIHwgXAorICAgICgoKFVJTlQzMikoeCkgJiAoVUlOVDMyKSAweDAwMDBmZjAwVUwpIDw8ICA4KSB8IFwKKyAgICAoKChVSU5UMzIpKHgpICYgKFVJTlQzMikgMHgwMGZmMDAwMFVMKSA+PiAgOCkgfCBcCisgICAgKCgoVUlOVDMyKSh4KSAmIChVSU5UMzIpIDB4ZmYwMDAwMDBVTCkgPj4gMjQpICkpCisKKyNkZWZpbmUgU1dBUDY0KHgpIFwKKyAgICAoKFVJTlQ2NCkoIFwKKyAgICAoVUlOVDY0KSgoKFVJTlQ2NCkoeCkgJiAoVUlOVDY0KSAweDAwMDAwMDAwMDAwMDAwZmZVTEwpIDw8IDU2KSB8IFwKKyAgICAoVUlOVDY0KSgoKFVJTlQ2NCkoeCkgJiAoVUlOVDY0KSAweDAwMDAwMDAwMDAwMGZmMDBVTEwpIDw8IDQwKSB8IFwKKyAgICAoVUlOVDY0KSgoKFVJTlQ2NCkoeCkgJiAoVUlOVDY0KSAweDAwMDAwMDAwMDBmZjAwMDBVTEwpIDw8IDI0KSB8IFwKKyAgICAoVUlOVDY0KSgoKFVJTlQ2NCkoeCkgJiAoVUlOVDY0KSAweDAwMDAwMDAwZmYwMDAwMDBVTEwpIDw8ICA4KSB8IFwKKyAgICAoVUlOVDY0KSgoKFVJTlQ2NCkoeCkgJiAoVUlOVDY0KSAweDAwMDAwMGZmMDAwMDAwMDBVTEwpID4+ICA4KSB8IFwKKyAgICAoVUlOVDY0KSgoKFVJTlQ2NCkoeCkgJiAoVUlOVDY0KSAweDAwMDBmZjAwMDAwMDAwMDBVTEwpID4+IDI0KSB8IFwKKyAgICAoVUlOVDY0KSgoKFVJTlQ2NCkoeCkgJiAoVUlOVDY0KSAweDAwZmYwMDAwMDAwMDAwMDBVTEwpID4+IDQwKSB8IFwKKyAgICAoVUlOVDY0KSgoKFVJTlQ2NCkoeCkgJiAoVUlOVDY0KSAweGZmMDAwMDAwMDAwMDAwMDBVTEwpID4+IDU2KSApKQorCisjaWZkZWYgUlRfQklHX0VORElBTgorCisjZGVmaW5lIGNwdTJsZTY0KHgpIFNXQVA2NCgoeCkpCisjZGVmaW5lIGxlMmNwdTY0KHgpIFNXQVA2NCgoeCkpCisjZGVmaW5lIGNwdTJsZTMyKHgpIFNXQVAzMigoeCkpCisjZGVmaW5lIGxlMmNwdTMyKHgpIFNXQVAzMigoeCkpCisjZGVmaW5lIGNwdTJsZTE2KHgpIFNXQVAxNigoeCkpCisjZGVmaW5lIGxlMmNwdTE2KHgpIFNXQVAxNigoeCkpCisjZGVmaW5lIGNwdTJiZTY0KHgpICgoVUlOVDY0KSh4KSkKKyNkZWZpbmUgYmUyY3B1NjQoeCkgKChVSU5UNjQpKHgpKQorI2RlZmluZSBjcHUyYmUzMih4KSAoKFVJTlQzMikoeCkpCisjZGVmaW5lIGJlMmNwdTMyKHgpICgoVUlOVDMyKSh4KSkKKyNkZWZpbmUgY3B1MmJlMTYoeCkgKChVSU5UMTYpKHgpKQorI2RlZmluZSBiZTJjcHUxNih4KSAoKFVJTlQxNikoeCkpCisKKyNlbHNlICAgLy8gTGl0dGxlX0VuZGlhbgorCisjZGVmaW5lIGNwdTJsZTY0KHgpICgoVUlOVDY0KSh4KSkKKyNkZWZpbmUgbGUyY3B1NjQoeCkgKChVSU5UNjQpKHgpKQorI2RlZmluZSBjcHUybGUzMih4KSAoKFVJTlQzMikoeCkpCisjZGVmaW5lIGxlMmNwdTMyKHgpICgoVUlOVDMyKSh4KSkKKyNkZWZpbmUgY3B1MmxlMTYoeCkgKChVSU5UMTYpKHgpKQorI2RlZmluZSBsZTJjcHUxNih4KSAoKFVJTlQxNikoeCkpCisjZGVmaW5lIGNwdTJiZTY0KHgpIFNXQVA2NCgoeCkpCisjZGVmaW5lIGJlMmNwdTY0KHgpIFNXQVA2NCgoeCkpCisjZGVmaW5lIGNwdTJiZTMyKHgpIFNXQVAzMigoeCkpCisjZGVmaW5lIGJlMmNwdTMyKHgpIFNXQVAzMigoeCkpCisjZGVmaW5lIGNwdTJiZTE2KHgpIFNXQVAxNigoeCkpCisjZGVmaW5lIGJlMmNwdTE2KHgpIFNXQVAxNigoeCkpCisKKyNlbmRpZiAgLy8gUlRfQklHX0VORElBTgorCisjZW5kaWYgIC8vIF9fUlRNUF9ERUZfSF9fCisKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9ydG1wX3R5cGUuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvcnRtcF90eXBlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWZkN2RmMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvcnRtcF90eXBlLmgKQEAgLTAsMCArMSw5NCBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICBNb2R1bGUgTmFtZToKKyAgICBydG1wX3R5cGUuaAorCisgICAgQWJzdHJhY3Q6CisKKyAgICBSZXZpc2lvbiBIaXN0b3J5OgorICAgIFdobyAgICAgICAgIFdoZW4gICAgICAgICAgICBXaGF0CisgICAgLS0tLS0tLS0gICAgLS0tLS0tLS0tLSAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBOYW1lICAgICAgICBEYXRlICAgICAgICAgICAgTW9kaWZpY2F0aW9uIGxvZ3MKKyAgICBQYXVsIExpbiAgICAxLTItMjAwNAorKi8KKyNpZm5kZWYgX19SVE1QX1RZUEVfSF9fCisjZGVmaW5lIF9fUlRNUF9UWVBFX0hfXworCisjZGVmaW5lIFBBQ0tFRCAgX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpCisKKy8vIFB1dCBwbGF0Zm9ybSBkZXBlbmRlbnQgZGVjbGFyYXRpb24gaGVyZQorLy8gRm9yIGV4YW1wbGUsIGxpbnV4IHR5cGUgZGVmaW5pdGlvbgordHlwZWRlZiB1bnNpZ25lZCBjaGFyCQlVSU5UODsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQJCVVJTlQxNjsKK3R5cGVkZWYgdW5zaWduZWQgaW50CQlVSU5UMzI7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZwlVSU5UNjQ7Cit0eXBlZGVmIGludAkJCQkJSU5UMzI7Cit0eXBlZGVmIGxvbmcgbG9uZyAJCQlJTlQ2NDsKKwordHlwZWRlZiB1bnNpZ25lZCBjaGFyICoJCQlQVUlOVDg7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0ICoJCVBVSU5UMTY7Cit0eXBlZGVmIHVuc2lnbmVkIGludCAqCQkJUFVJTlQzMjsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nICoJUFVJTlQ2NDsKK3R5cGVkZWYgaW50CSoJCQkJCVBJTlQzMjsKK3R5cGVkZWYgbG9uZyBsb25nICogCQkJUElOVDY0OworCit0eXBlZGVmIHNpZ25lZCBjaGFyCQkJQ0hBUjsKK3R5cGVkZWYgc2lnbmVkIHNob3J0CQlTSE9SVDsKK3R5cGVkZWYgc2lnbmVkIGludAkJCUlOVDsKK3R5cGVkZWYgc2lnbmVkIGxvbmcJCQlMT05HOwordHlwZWRlZiBzaWduZWQgbG9uZyBsb25nCUxPTkdMT05HOworCisKK3R5cGVkZWYgdW5zaWduZWQgY2hhcgkJVUNIQVI7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0CQlVU0hPUlQ7Cit0eXBlZGVmIHVuc2lnbmVkIGludAkJVUlOVDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZwkJVUxPTkc7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZwlVTE9OR0xPTkc7CisKK3R5cGVkZWYgdW5zaWduZWQgY2hhcgkJQk9PTEVBTjsKK3R5cGVkZWYgdm9pZAkJCQlWT0lEOworCit0eXBlZGVmIFZPSUQgKgkJCQlQVk9JRDsKK3R5cGVkZWYgQ0hBUiAqCQkJCVBDSEFSOwordHlwZWRlZiBVQ0hBUiAqIAkJCVBVQ0hBUjsKK3R5cGVkZWYgVVNIT1JUICoJCQlQVVNIT1JUOwordHlwZWRlZiBMT05HICoJCQkJUExPTkc7Cit0eXBlZGVmIFVMT05HICoJCQkJUFVMT05HOwordHlwZWRlZiBVSU5UICoJCQkJUFVJTlQ7CisKK3R5cGVkZWYgdW5zaWduZWQgaW50CU5ESVNfTUVESUFfU1RBVEU7CisKK3R5cGVkZWYgdW5pb24gX0xBUkdFX0lOVEVHRVIgeworICAgIHN0cnVjdCB7CisgICAgICAgIFVJTlQgTG93UGFydDsKKyAgICAgICAgSU5UMzIgSGlnaFBhcnQ7CisgICAgfSB1OworICAgIElOVDY0IFF1YWRQYXJ0OworfSBMQVJHRV9JTlRFR0VSOworCisjZW5kaWYgIC8vIF9fUlRNUF9UWVBFX0hfXworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3NwZWN0cnVtLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3NwZWN0cnVtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTRjZmE1YgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvc3BlY3RydW0uaApAQCAtMCwwICsxLDMyMiBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworI2lmbmRlZiBfX1NQRUNUUlVNX0hfXworI2RlZmluZSBfX1NQRUNUUlVNX0hfXworCisjaW5jbHVkZSAicnRtcF90eXBlLmgiCisjaW5jbHVkZSAic3BlY3RydW1fZGVmLmgiCisKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfVFBDX1JFUE9SVF9JTkZPCit7CisJVUlOVDggVHhQd3I7CisJVUlOVDggTGlua01hcmdpbjsKK30gVFBDX1JFUE9SVF9JTkZPLCAqUFRQQ19SRVBPUlRfSU5GTzsKKwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9DSF9TV19BTk5fSU5GTworeworCVVJTlQ4IENoU3dNb2RlOworCVVJTlQ4IENoYW5uZWw7CisJVUlOVDggQ2hTd0NudDsKK30gQ0hfU1dfQU5OX0lORk8sICpQQ0hfU1dfQU5OX0lORk87CisKK3R5cGVkZWYgdW5pb24gUEFDS0VEIF9NRUFTVVJFX1JFUV9NT0RFCit7CisjaWZkZWYgUlRfQklHX0VORElBTgorCXN0cnVjdCBQQUNLRUQKKwl7CisJCVVJTlQ4IFJldjE6NDsKKwkJVUlOVDggUmVwb3J0OjE7CisJCVVJTlQ4IFJlcXVlc3Q6MTsKKwkJVUlOVDggRW5hYmxlOjE7CisJCVVJTlQ4IFJldjA6MTsKKwl9IGZpZWxkOworI2Vsc2UKKwlzdHJ1Y3QgUEFDS0VECisJeworCQlVSU5UOCBSZXYwOjE7CisJCVVJTlQ4IEVuYWJsZToxOworCQlVSU5UOCBSZXF1ZXN0OjE7CisJCVVJTlQ4IFJlcG9ydDoxOworCQlVSU5UOCBSZXYxOjQ7CisJfSBmaWVsZDsKKyNlbmRpZiAvLyBSVF9CSUdfRU5ESUFOIC8vCisJVUlOVDggd29yZDsKK30gTUVBU1VSRV9SRVFfTU9ERSwgKlBNRUFTVVJFX1JFUV9NT0RFOworCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX01FQVNVUkVfUkVRCit7CisJVUlOVDggQ2hOdW07CisJVUlOVDY0IE1lYXN1cmVTdGFydFRpbWU7CisJVUlOVDE2IE1lYXN1cmVEdXJhdGlvbjsKK30gTUVBU1VSRV9SRVEsICpQTUVBU1VSRV9SRVE7CisKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfTUVBU1VSRV9SRVFfSU5GTworeworCVVJTlQ4IFRva2VuOworCU1FQVNVUkVfUkVRX01PREUgUmVxTW9kZTsKKwlVSU5UOCBSZXFUeXBlOworCU1FQVNVUkVfUkVRIE1lYXN1cmVSZXE7Cit9IE1FQVNVUkVfUkVRX0lORk8sICpQTUVBU1VSRV9SRVFfSU5GTzsKKwordHlwZWRlZiB1bmlvbiBQQUNLRUQgX01FQVNVUkVfQkFTSUNfUkVQT1JUX01BUAoreworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwlzdHJ1Y3QgUEFDS0VECisJeworCQlVSU5UOCBSZXY6MzsKKwkJVUlOVDggVW5tZWFzdXJlOjE7CisJCVVJTlQ4IFJhZGFyOjE7CisJCVVJTlQ4IFVuaWRlbnRpZmllZFNpZ25hbDoxOworCQlVSU5UOCBPZmRtUHJlYW1ibGU6MTsKKwkJVUlOVDggQlNTOjE7CisJfSBmaWVsZDsKKyNlbHNlCisJc3RydWN0IFBBQ0tFRAorCXsKKwkJVUlOVDggQlNTOjE7CisJCVVJTlQ4IE9mZG1QcmVhbWJsZToxOworCQlVSU5UOCBVbmlkZW50aWZpZWRTaWduYWw6MTsKKwkJVUlOVDggUmFkYXI6MTsKKwkJVUlOVDggVW5tZWFzdXJlOjE7CisJCVVJTlQ4IFJldjozOworCX0gZmllbGQ7CisjZW5kaWYgLy8gUlRfQklHX0VORElBTiAvLworCVVJTlQ4IHdvcmQ7Cit9IE1FQVNVUkVfQkFTSUNfUkVQT1JUX01BUCwgKlBNRUFTVVJFX0JBU0lDX1JFUE9SVF9NQVA7CisKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfTUVBU1VSRV9CQVNJQ19SRVBPUlQKK3sKKwlVSU5UOCBDaE51bTsKKwlVSU5UNjQgTWVhc3VyZVN0YXJ0VGltZTsKKwlVSU5UMTYgTWVhc3VyZUR1cmF0aW9uOworCU1FQVNVUkVfQkFTSUNfUkVQT1JUX01BUCBNYXA7Cit9IE1FQVNVUkVfQkFTSUNfUkVQT1JULCAqUE1FQVNVUkVfQkFTSUNfUkVQT1JUOworCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX01FQVNVUkVfQ0NBX1JFUE9SVAoreworCVVJTlQ4IENoTnVtOworCVVJTlQ2NCBNZWFzdXJlU3RhcnRUaW1lOworCVVJTlQxNiBNZWFzdXJlRHVyYXRpb247CisJVUlOVDggQ0NBX0J1c3lfRnJhY3Rpb247Cit9IE1FQVNVUkVfQ0NBX1JFUE9SVCwgKlBNRUFTVVJFX0NDQV9SRVBPUlQ7CisKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfTUVBU1VSRV9SUElfUkVQT1JUCit7CisJVUlOVDggQ2hOdW07CisJVUlOVDY0IE1lYXN1cmVTdGFydFRpbWU7CisJVUlOVDE2IE1lYXN1cmVEdXJhdGlvbjsKKwlVSU5UOCBSUElfRGVuc2l0eVs4XTsKK30gTUVBU1VSRV9SUElfUkVQT1JULCAqUE1FQVNVUkVfUlBJX1JFUE9SVDsKKwordHlwZWRlZiB1bmlvbiBQQUNLRUQgX01FQVNVUkVfUkVQT1JUX01PREUKK3sKKwlzdHJ1Y3QgUEFDS0VECisJeworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwkJVUlOVDggUmV2OjU7CisJCVVJTlQ4IFJlZnVzZWQ6MTsKKwkJVUlOVDggSW5jYXBhYmxlOjE7CisJCVVJTlQ4IExhdGU6MTsKKyNlbHNlCisJCVVJTlQ4IExhdGU6MTsKKwkJVUlOVDggSW5jYXBhYmxlOjE7CisJCVVJTlQ4IFJlZnVzZWQ6MTsKKwkJVUlOVDggUmV2OjU7CisjZW5kaWYgLy8gUlRfQklHX0VORElBTiAvLworCX0gZmllbGQ7CisJVUlOVDggd29yZDsKK30gTUVBU1VSRV9SRVBPUlRfTU9ERSwgKlBNRUFTVVJFX1JFUE9SVF9NT0RFOworCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX01FQVNVUkVfUkVQT1JUX0lORk8KK3sKKwlVSU5UOCBUb2tlbjsKKwlNRUFTVVJFX1JFUE9SVF9NT0RFIFJlcG9ydE1vZGU7CisJVUlOVDggUmVwb3J0VHlwZTsKKwlVSU5UOCBPY3RlY3RbMF07Cit9IE1FQVNVUkVfUkVQT1JUX0lORk8sICpQTUVBU1VSRV9SRVBPUlRfSU5GTzsKKwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9RVUlFVF9JTkZPCit7CisJVUlOVDggUXVpZXRDbnQ7CisJVUlOVDggUXVpZXRQZXJpb2Q7CisJVUlOVDggUXVpZXREdXJhdGlvbjsKKwlVSU5UOCBRdWlldE9mZnNldDsKK30gUVVJRVRfSU5GTywgKlBRVUlFVF9JTkZPOworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVByZXBhcmUgTWVhc3VyZW1lbnQgcmVxdWVzdCBhY3Rpb24gZnJhbWUgYW5kIGVucXVldWUgaXQgaW50bworCQltYW5hZ2VtZW50IHF1ZXVlIHdhaXRpbmcgZm9yIHRyYW5zbWl0aW9uLgorCisJUGFyYW1ldHJzOgorCQkxLiB0aGUgZGVzdGluYXRpb24gbWFjIGFkZHJlc3Mgb2YgdGhlIGZyYW1lLgorCisJUmV0dXJuCTogTm9uZS4KKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIEVucXVldWVNZWFzdXJlbWVudFJlcSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBQVUNIQVIgcERBLAorCUlOIFVJTlQ4IE1lYXN1cmVUb2tlbiwKKwlJTiBVSU5UOCBNZWFzdXJlUmVxTW9kZSwKKwlJTiBVSU5UOCBNZWFzdXJlUmVxVHlwZSwKKwlJTiBVSU5UOCBNZWFzdXJlQ2gsCisJSU4gVUlOVDE2IE1lYXN1cmVEdXJhdGlvbik7CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJUHJlcGFyZSBNZWFzdXJlbWVudCByZXBvcnQgYWN0aW9uIGZyYW1lIGFuZCBlbnF1ZXVlIGl0IGludG8KKwkJbWFuYWdlbWVudCBxdWV1ZSB3YWl0aW5nIGZvciB0cmFuc21pdGlvbi4KKworCVBhcmFtZXRyczoKKwkJMS4gdGhlIGRlc3RpbmF0aW9uIG1hYyBhZGRyZXNzIG9mIHRoZSBmcmFtZS4KKworCVJldHVybgk6IE5vbmUuCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBFbnF1ZXVlTWVhc3VyZW1lbnRSZXAoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gUFVDSEFSIHBEQSwKKwlJTiBVSU5UOCBEaWFsb2dUb2tlbiwKKwlJTiBVSU5UOCBNZWFzdXJlVG9rZW4sCisJSU4gVUlOVDggTWVhc3VyZVJlcU1vZGUsCisJSU4gVUlOVDggTWVhc3VyZVJlcVR5cGUsCisJSU4gVUlOVDggUmVwb3J0SW5mb0xlbiwKKwlJTiBQVUlOVDggcFJlcG9ydEluZm8pOworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVByZXBhcmUgVFBDIFJlcXVlc3QgYWN0aW9uIGZyYW1lIGFuZCBlbnF1ZXVlIGl0IGludG8KKwkJbWFuYWdlbWVudCBxdWV1ZSB3YWl0aW5nIGZvciB0cmFuc21pdGlvbi4KKworCVBhcmFtZXRyczoKKwkJMS4gdGhlIGRlc3RpbmF0aW9uIG1hYyBhZGRyZXNzIG9mIHRoZSBmcmFtZS4KKworCVJldHVybgk6IE5vbmUuCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBFbnF1ZXVlVFBDUmVxKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFBVQ0hBUiBwREEsCisJSU4gVUNIQVIgRGlhbG9nVG9rZW4pOworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVByZXBhcmUgVFBDIFJlcG9ydCBhY3Rpb24gZnJhbWUgYW5kIGVucXVldWUgaXQgaW50bworCQltYW5hZ2VtZW50IHF1ZXVlIHdhaXRpbmcgZm9yIHRyYW5zbWl0aW9uLgorCisJUGFyYW1ldHJzOgorCQkxLiB0aGUgZGVzdGluYXRpb24gbWFjIGFkZHJlc3Mgb2YgdGhlIGZyYW1lLgorCisJUmV0dXJuCTogTm9uZS4KKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIEVucXVldWVUUENSZXAoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gUFVDSEFSIHBEQSwKKwlJTiBVSU5UOCBEaWFsb2dUb2tlbiwKKwlJTiBVSU5UOCBUeFB3ciwKKwlJTiBVSU5UOCBMaW5rTWFyZ2luKTsKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlQcmVwYXJlIENoYW5uZWwgU3dpdGNoIEFubm91bmNlbWVudCBhY3Rpb24gZnJhbWUgYW5kIGVucXVldWUgaXQgaW50bworCQltYW5hZ2VtZW50IHF1ZXVlIHdhaXRpbmcgZm9yIHRyYW5zbWl0aW9uLgorCisJUGFyYW1ldHJzOgorCQkxLiB0aGUgZGVzdGluYXRpb24gbWFjIGFkZHJlc3Mgb2YgdGhlIGZyYW1lLgorCQkyLiBDaGFubmVsIHN3aXRjaCBhbm5vdW5jZW1lbnQgbW9kZS4KKwkJMi4gYSBOZXcgc2VsZWN0ZWQgY2hhbm5lbC4KKworCVJldHVybgk6IE5vbmUuCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBFbnF1ZXVlQ2hTd0FubigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBQVUNIQVIgcERBLAorCUlOIFVJTlQ4IENoU3dNb2RlLAorCUlOIFVJTlQ4IE5ld0NoKTsKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlTcGVjdHJ1biBhY3Rpb24gZnJhbWVzIEhhbmRsZXIgc3VjaCBhcyBjaGFubmVsIHN3aXRjaCBhbm5vdWNlbWVudCwKKwkJbWVhc3VyZW1lbnQgcmVwb3J0LCBtZWFzdXJlbWVudCByZXF1ZXN0IGFjdGlvbnMgZnJhbWVzLgorCisJUGFyYW1ldHJzOgorCQlFbG1lIC0gTUxNRSBtZXNzYWdlIGNvbnRhaW5pbmcgdGhlIHJlY2VpdmVkIGZyYW1lCisKKwlSZXR1cm4JOiBOb25lLgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgUGVlclNwZWN0cnVtQWN0aW9uKAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKworCVBhcmFtZXRyczoKKworCVJldHVybgk6IE5vbmUuCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworSU5UIFNldF9NZWFzdXJlUmVxX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UIFNldF9UcGNSZXFfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitWT0lEIE1lYXN1cmVSZXFUYWJJbml0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKworVk9JRCBNZWFzdXJlUmVxVGFiRXhpdCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK1ZPSUQgVHBjUmVxVGFiSW5pdCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK1ZPSUQgVHBjUmVxVGFiRXhpdCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK1ZPSUQgTm90aWZ5Q2hTd0FublRvUGVlckFQcygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBQVUNIQVIgcFJBLAorCUlOIFBVQ0hBUiBwVEEsCisJSU4gVUlOVDggQ2hTd01vZGUsCisJSU4gVUlOVDggQ2hhbm5lbCk7CisjZW5kaWYgLy8gX19TUEVDVFJVTV9IX18gLy8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9zcGVjdHJ1bV9kZWYuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvc3BlY3RydW1fZGVmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNhNDgxNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvc3BlY3RydW1fZGVmLmgKQEAgLTAsMCArMSw5NSBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICBNb2R1bGUgTmFtZToKKwlzcGVjdHJ1bV9kZWYuaAorCisgICAgQWJzdHJhY3Q6CisgICAgSGFuZGxlIGFzc29jaWF0aW9uIHJlbGF0ZWQgcmVxdWVzdHMgZWl0aGVyIGZyb20gV1NUQSBvciBmcm9tIGxvY2FsIE1MTUUKKworICAgIFJldmlzaW9uIEhpc3Rvcnk6CisgICAgV2hvICAgICAgICAgIFdoZW4gICAgICAgICAgV2hhdAorICAgIC0tLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlGb25jaGkgV3UgICAgMjAwOAkgIAkgICBjcmVhdGVkIGZvciA4MDIuMTFoCisgKi8KKworI2lmbmRlZiBfX1NQRUNUUlVNX0RFRl9IX18KKyNkZWZpbmUgX19TUEVDVFJVTV9ERUZfSF9fCisKKyNkZWZpbmUgTUFYX01FQVNVUkVfUkVRX1RBQl9TSVpFCQkzCisjZGVmaW5lIE1BWF9IQVNIX01FQVNVUkVfUkVRX1RBQl9TSVpFCU1BWF9NRUFTVVJFX1JFUV9UQUJfU0laRQorCisjZGVmaW5lIE1BWF9UUENfUkVRX1RBQl9TSVpFCQkJMworI2RlZmluZSBNQVhfSEFTSF9UUENfUkVRX1RBQl9TSVpFCQlNQVhfVFBDX1JFUV9UQUJfU0laRQorCisjZGVmaW5lIE1JTl9SQ1ZfUFdSCQkJCTEwMAkJLyogTmVnYXRpdmUgdmFsdWUgKChkQm0pICovCisKKyNkZWZpbmUgUk1fVFBDX1JFUQkJCQkwCisjZGVmaW5lIFJNX01FQVNVUkVfUkVRCQkJMQorCisjZGVmaW5lIFJNX0JBU0lDCQkJCTAKKyNkZWZpbmUgUk1fQ0NBCQkJCQkxCisjZGVmaW5lIFJNX1JQSV9ISVNUT0dSQU0JCTIKKworI2RlZmluZSBUUENfUkVRX0FHRV9PVVQJCQk1MDAJCS8qIG1zICovCisjZGVmaW5lIE1RX1JFUV9BR0VfT1VUCQkJNTAwCQkvKiBtcyAqLworCisjZGVmaW5lIFRQQ19ESUFMT0dUT0tFTl9IQVNIX0lOREVYKF9EaWFsb2dUb2tlbikJKChfRGlhbG9nVG9rZW4pICUgTUFYX0hBU0hfVFBDX1JFUV9UQUJfU0laRSkKKyNkZWZpbmUgTVFfRElBTE9HVE9LRU5fSEFTSF9JTkRFWChfRGlhbG9nVG9rZW4pCQkoKF9EaWFsb2dUb2tlbikgJSBNQVhfTUVBU1VSRV9SRVFfVEFCX1NJWkUpCisKK3R5cGVkZWYgc3RydWN0IF9NRUFTVVJFX1JFUV9FTlRSWQoreworCXN0cnVjdCBfTUVBU1VSRV9SRVFfRU5UUlkgKnBOZXh0OworCVVMT05HIGxhc3RUaW1lOworCUJPT0xFQU4JVmFsaWQ7CisJVUlOVDggRGlhbG9nVG9rZW47CisJVUlOVDggTWVhc3VyZURpYWxvZ1Rva2VuWzNdOwkvLyAwOmJhc2ljIG1lYXN1cmUsIDE6IENDQSBtZWFzdXJlLCAyOiBSUElfSGlzdG9ncmFtIG1lYXN1cmUuCit9IE1FQVNVUkVfUkVRX0VOVFJZLCAqUE1FQVNVUkVfUkVRX0VOVFJZOworCit0eXBlZGVmIHN0cnVjdCBfTUVBU1VSRV9SRVFfVEFCCit7CisJVUNIQVIgU2l6ZTsKKwlQTUVBU1VSRV9SRVFfRU5UUlkgSGFzaFtNQVhfSEFTSF9NRUFTVVJFX1JFUV9UQUJfU0laRV07CisJTUVBU1VSRV9SRVFfRU5UUlkgQ29udGVudFtNQVhfTUVBU1VSRV9SRVFfVEFCX1NJWkVdOworfSBNRUFTVVJFX1JFUV9UQUIsICpQTUVBU1VSRV9SRVFfVEFCOworCit0eXBlZGVmIHN0cnVjdCBfVFBDX1JFUV9FTlRSWQoreworCXN0cnVjdCBfVFBDX1JFUV9FTlRSWSAqcE5leHQ7CisJVUxPTkcgbGFzdFRpbWU7CisJQk9PTEVBTiBWYWxpZDsKKwlVSU5UOCBEaWFsb2dUb2tlbjsKK30gVFBDX1JFUV9FTlRSWSwgKlBUUENfUkVRX0VOVFJZOworCit0eXBlZGVmIHN0cnVjdCBfVFBDX1JFUV9UQUIKK3sKKwlVQ0hBUiBTaXplOworCVBUUENfUkVRX0VOVFJZIEhhc2hbTUFYX0hBU0hfVFBDX1JFUV9UQUJfU0laRV07CisJVFBDX1JFUV9FTlRSWSBDb250ZW50W01BWF9UUENfUkVRX1RBQl9TSVpFXTsKK30gVFBDX1JFUV9UQUIsICpQVFBDX1JFUV9UQUI7CisKKyNlbmRpZiAvLyBfX1NQRUNUUlVNX0RFRl9IX18gLy8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9zdGEvYWlyb25ldC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9zdGEvYWlyb25ldC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhZjRhMTkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3N0YS9haXJvbmV0LmMKQEAgLTAsMCArMSwxMzEyIEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCU1vZHVsZSBOYW1lOgorCWFpcm9uZXQuYworCisJQWJzdHJhY3Q6CisKKwlSZXZpc2lvbiBIaXN0b3J5OgorCVdobwkJCVdoZW4JCQlXaGF0CisJLS0tLS0tLS0JLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCVBhdWwgTGluCTA0LTA2LTE1CQlJbml0aWFsCisqLworI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCWFzc29jaWF0aW9uCXN0YXRlIG1hY2hpbmUgaW5pdCwJaW5jbHVkaW5nIHN0YXRlCXRyYW5zaXRpb24gYW5kIHRpbWVyIGluaXQKKwlQYXJhbWV0ZXJzOgorCQlTIC0JcG9pbnRlcgl0byB0aGUgYXNzb2NpYXRpb24gc3RhdGUgbWFjaGluZQorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQJQWlyb25ldFN0YXRlTWFjaGluZUluaXQoCisJSU4JUFJUTVBfQURBUFRFUgkJcEFkLAorCUlOCVNUQVRFX01BQ0hJTkUJCSpTLAorCU9VVAlTVEFURV9NQUNISU5FX0ZVTkMJVHJhbnNbXSkKK3sKKwlTdGF0ZU1hY2hpbmVJbml0KFMsCVRyYW5zLCBNQVhfQUlST05FVF9TVEFURSwgTUFYX0FJUk9ORVRfTVNHLCAoU1RBVEVfTUFDSElORV9GVU5DKURyb3AsIEFJUk9ORVRfSURMRSwgQUlST05FVF9NQUNISU5FX0JBU0UpOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBSVJPTkVUX0lETEUsIE1UMl9BSVJPTkVUX01TRywgKFNUQVRFX01BQ0hJTkVfRlVOQylBaXJvbmV0TXNnQWN0aW9uKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQUlST05FVF9JRExFLCBNVDJfQUlST05FVF9TQ0FOX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylBaXJvbmV0UmVxdWVzdEFjdGlvbik7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFJUk9ORVRfU0NBTk5JTkcsIE1UMl9BSVJPTkVUX1NDQU5fRE9ORSwgKFNUQVRFX01BQ0hJTkVfRlVOQylBaXJvbmV0UmVwb3J0QWN0aW9uKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlUaGlzIGlzCXN0YXRlIG1hY2hpbmUgZnVuY3Rpb24uCisJCVdoZW4gcmVjZWl2aW5nIEVBUE9MIHBhY2tldHMgd2hpY2ggaXMgIGZvciA4MDIuMXgga2V5IG1hbmFnZW1lbnQuCisJCVVzZQlib3RoIGluCVdQQSwgYW5kIFdQQVBTSwljYXNlLgorCQlJbiB0aGlzCWZ1bmN0aW9uLCBmdXJ0aGVyIGRpc3BhdGNoIHRvIGRpZmZlcmVudAlmdW5jdGlvbnMgYWNjb3JkaW5nCXRvIHRoZSByZWNlaXZlZAlwYWNrZXQuCSAzIGNhdGVnb3JpZXMgYXJlIDoKKwkJICAxLiAgbm9ybWFsIDQtd2F5IHBhaXJ3aXNla2V5IGFuZCAyLXdheSBncm91cGtleSBoYW5kc2hha2UKKwkJICAyLiAgTUlDIGVycm9yCShDb3VudGVybWVhc3VyZXMgYXR0YWNrKSAgcmVwb3J0IHBhY2tldAlmcm9tIFNUQS4KKwkJICAzLiAgUmVxdWVzdCBmb3IgcGFpcndpc2UvZ3JvdXAga2V5IHVwZGF0ZQlmcm9tIFNUQQorCVJldHVybjoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJQWlyb25ldE1zZ0FjdGlvbigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglNTE1FX1FVRVVFX0VMRU0JKkVsZW0pCit7CisJVVNIT1JUCQkJCQkJCUxlbmd0aDsKKwlVQ0hBUgkJCQkJCQlJbmRleCwgaTsKKwlQVUNIQVIJCQkJCQkJcERhdGE7CisJUEFJUk9ORVRfUk1fUkVRVUVTVF9GUkFNRQkJcFJNUmVxOworCVBSTV9SRVFVRVNUX0FDVElPTgkJCQlwUmVxRWxlbTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tLS0tPiBBaXJvbmV0TXNnQWN0aW9uXG4iKSk7CisKKwkvLyAwLiBHZXQgQWlyb25ldCBJQVBQIGhlYWRlciBmaXJzdAorCXBSTVJlcSA9IChQQUlST05FVF9STV9SRVFVRVNUX0ZSQU1FKSAmRWxlbS0+TXNnW0xFTkdUSF84MDJfMTFdOworCXBEYXRhICA9IChQVUNIQVIpICZFbGVtLT5Nc2dbTEVOR1RIXzgwMl8xMV07CisKKwkvLyAxLiBDaGFuZ2UgZW5kaWFuIGZvcm1hdCBmb3JtIG5ldHdvcmsgdG8gbGl0dGxlIGVuZGlhbgorCUxlbmd0aCA9IGJlMmNwdTE2KHBSTVJlcS0+SUFQUC5MZW5ndGgpOworCisJLy8gMi4wIFNhbml0eSBjaGVjaywgdGhpcyBzaG91bGQgb25seSBoYXBwZW4gd2hlbiBDQ1ggMi4wIHN1cHBvcnQgaXMgZW5hYmxlZAorCWlmIChwQWQtPlN0YUNmZy5DQ1hFbmFibGUgIT0gVFJVRSkKKwkJcmV0dXJuOworCisJLy8gMi4xIFJhZGlvIG1lYXN1cmVtZW50IG11c3QgYmUgb24KKwlpZiAocEFkLT5TdGFDZmcuQ0NYQ29udHJvbC5maWVsZC5STUVuYWJsZSAhPSAxKQorCQlyZXR1cm47CisKKwkvLyAyLjIuIERlYnVnIHByaW50IGFsbCBiaXQgaW5mb3JtYXRpb24KKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJQVBQIElEICYgTGVuZ3RoICVkXG4iLCBMZW5ndGgpKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJQVBQIFR5cGUgJXhcbiIsIHBSTVJlcS0+SUFQUC5UeXBlKSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSUFQUCBTdWJUeXBlICV4XG4iLCBwUk1SZXEtPklBUFAuU3ViVHlwZSkpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklBUFAgRGlhbG9nIFRva2VuICV4XG4iLCBwUk1SZXEtPklBUFAuVG9rZW4pKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJQVBQIEFjdGl2YXRpb24gRGVsYXkgJXhcbiIsIHBSTVJlcS0+RGVsYXkpKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJQVBQIE1lYXN1cmVtZW50IE9mZnNldCAleFxuIiwgcFJNUmVxLT5PZmZzZXQpKTsKKworCS8vIDMuIENoZWNrIElBUFAgZnJhbWUgdHlwZSwgaXQgbXVzdCBiZSAweDMyIGZvciBDaXNjbyBBaXJvbmV0IGV4dGVuc2lvbgorCWlmIChwUk1SZXEtPklBUFAuVHlwZSAhPSBBSVJPTkVUX0lBUFBfVFlQRSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIldyb25nIElBUFAgdHlwZSBmb3IgQ2lzY28gQWlyb25ldCBleHRlbnNpb25cbiIpKTsKKwkJcmV0dXJuOworCX0KKworCS8vIDQuIENoZWNrIElBUFAgZnJhbWUgc3VidHlwZSwgaXQgbXVzdCBiZSAweDAxIGZvciBDaXNjbyBBaXJvbmV0IGV4dGVuc2lvbiByZXF1ZXN0LgorCS8vICAgIFNpbmNlIHdlIGFyZSBhY3RpbmcgYXMgY2xpZW50IG9ubHksIHdlIHdpbGwgZGlzcmVnYXJkcyByZXBseSBzdWJ0eXBlLgorCWlmIChwUk1SZXEtPklBUFAuU3ViVHlwZSAhPSBBSVJPTkVUX0lBUFBfU1VCVFlQRV9SRVFVRVNUKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiV3JvbmcgSUFQUCBzdWJ0eXBlIGZvciBDaXNjbyBBaXJvbmV0IGV4dGVuc2lvblxuIikpOworCQlyZXR1cm47CisJfQorCisJLy8gNS4gVmVyaWZ5IERlc3RpbmF0aW9uIE1BQyBhbmQgU291cmNlIE1BQywgYm90aCBzaG91bGQgYmUgYWxsIHplcm9zLgorCWlmICghIE1BQ19BRERSX0VRVUFMKHBSTVJlcS0+SUFQUC5EQSwgWkVST19NQUNfQUREUikpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJXcm9uZyBJQVBQIERBIGZvciBDaXNjbyBBaXJvbmV0IGV4dGVuc2lvbiwgaXQncyBub3QgWmVyb1xuIikpOworCQlyZXR1cm47CisJfQorCisJaWYgKCEgTUFDX0FERFJfRVFVQUwocFJNUmVxLT5JQVBQLlNBLCBaRVJPX01BQ19BRERSKSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIldyb25nIElBUFAgU0EgZm9yIENpc2NvIEFpcm9uZXQgZXh0ZW5zaW9uLCBpdCdzIG5vdCBaZXJvXG4iKSk7CisJCXJldHVybjsKKwl9CisKKwkvLyA2LiBSZWluaXQgYWxsIHJlcG9ydCByZWxhdGVkIGZpZWxkcworCU5kaXNaZXJvTWVtb3J5KHBBZC0+U3RhQ2ZnLkZyYW1lUmVwb3J0QnVmLCAyMDQ4KTsKKwlOZGlzWmVyb01lbW9yeShwQWQtPlN0YUNmZy5Cc3NSZXBvcnRPZmZzZXQsIHNpemVvZihVU0hPUlQpICogTUFYX0xFTl9PRl9CU1NfVEFCTEUpOworCU5kaXNaZXJvTWVtb3J5KHBBZC0+U3RhQ2ZnLk1lYXN1cmVtZW50UmVxdWVzdCwgc2l6ZW9mKFJNX1JFUVVFU1RfQUNUSU9OKSAqIDQpOworCisJLy8gNy4gUG9pbnQgdG8gdGhlIHN0YXJ0IG9mIGZpcnN0IGVsZW1lbnQgcmVwb3J0IGVsZW1lbnQKKwlwQWQtPlN0YUNmZy5GcmFtZVJlcG9ydExlbiAgID0gTEVOR1RIXzgwMl8xMSArIHNpemVvZihBSVJPTkVUX0lBUFBfSEVBREVSKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJGUiBsZW4gPSAlZFxuIiwgcEFkLT5TdGFDZmcuRnJhbWVSZXBvcnRMZW4pKTsKKwlwQWQtPlN0YUNmZy5MYXN0QnNzSW5kZXggICAgID0gMHhmZjsKKwlwQWQtPlN0YUNmZy5STVJlcUNudCAgICAgICAgID0gMDsKKwlwQWQtPlN0YUNmZy5QYXJhbGxlbFJlcSAgICAgID0gRkFMU0U7CisJcEFkLT5TdGFDZmcuUGFyYWxsZWxEdXJhdGlvbiA9IDA7CisJcEFkLT5TdGFDZmcuUGFyYWxsZWxDaGFubmVsICA9IDA7CisJcEFkLT5TdGFDZmcuSUFQUFRva2VuICAgICAgICA9IHBSTVJlcS0+SUFQUC5Ub2tlbjsKKwlwQWQtPlN0YUNmZy5DdXJyZW50Uk1SZXFJZHggID0gMDsKKwlwQWQtPlN0YUNmZy5DTEJ1c3lCeXRlcyAgICAgID0gMDsKKwkvLyBSZXNldCB0aGUgc3RhdGlzdGljcworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJCXBBZC0+U3RhQ2ZnLlJQSURlbnNpdHlbaV0gPSAwOworCisJSW5kZXggPSAwOworCisJLy8gOC4gU2F2ZSBkaWFsb2cgdG9rZW4gZm9yIHJlcG9ydAorCXBBZC0+U3RhQ2ZnLklBUFBUb2tlbiA9IHBSTVJlcS0+SUFQUC5Ub2tlbjsKKworCS8vIFNhdmUgQWN0aXZhdGlvbiBkZWxheSAmIG1lYXN1cmVtZW50IG9mZnNldCwgTm90IHJlYWxseSBuZWVkZWQKKworCS8vIDkuIFBvaW50IHRvIHRoZSBmaXJzdCByZXF1ZXN0IGVsZW1lbnQKKwlwRGF0YSArPSBzaXplb2YoQUlST05FVF9STV9SRVFVRVNUX0ZSQU1FKTsKKwkvLyAgICBMZW5ndGggc2hvdWxkIGV4Y2x1ZGUgdGhlIENJU0NPIEFpcm9uZXQgU05BUCBoZWFkZXIKKwlMZW5ndGggLT0gKHNpemVvZihBSVJPTkVUX1JNX1JFUVVFU1RfRlJBTUUpIC0gTEVOR1RIXzgwMl8xX0gpOworCisJLy8gMTAuIFN0YXJ0IFBhcnNpbmcgdGhlIE1lYXN1cmVtZW50IGVsZW1lbnRzLgorCS8vICAgIEJlIGNhcmVmdWwgYWJvdXQgbXVsdGlwbGUgTVIgZWxlbWVudHMgd2l0aGluIG9uZSBmcmFtZXMuCisJd2hpbGUgKExlbmd0aCA+IDApCisJeworCQlwUmVxRWxlbSA9IChQUk1fUkVRVUVTVF9BQ1RJT04pIHBEYXRhOworCQlzd2l0Y2ggKHBSZXFFbGVtLT5SZXFFbGVtLkVpZCkKKwkJeworCQkJY2FzZSBJRV9NRUFTVVJFTUVOVF9SRVFVRVNUOgorCQkJCS8vIEZyb20gdGhlIGV4YW1wbGUsIGl0IHNlZW1zIHdlIG9ubHkgbmVlZCB0byBzdXBwb3J0IG9uZSByZXF1ZXN0IGluIG9uZSBmcmFtZQorCQkJCS8vIFRoZXJlIGlzIG5vIG11bHRpcGxlIHJlcXVlc3QgaW4gb25lIGZyYW1lLgorCQkJCS8vIEJlc2lkZXMsIGxvb2tzIGxpa2Ugd2UgbmVlZCB0byB0YWtlIGNhcmUgdGhlIG1lYXN1cmVtZW50IHJlcXVlc3Qgb25seS4KKwkJCQkvLyBUaGUgbWVhc3VyZW1lbnQgcmVxdWVzdCBpcyBhbHdheXMgNCBieXRlcy4KKworCQkJCS8vIFN0YXJ0IHBhcnNpbmcgdGhpcyB0eXBlIG9mIHJlcXVlc3QuCisJCQkJLy8gMC4gRWlkIGlzIElFX01FQVNVUkVNRU5UX1JFUVVFU1QKKwkJCQkvLyAxLiBMZW5ndGggZGlkbid0IGluY2x1ZGUgRWlkIGFuZCBMZW5ndGggZmllbGQsIGl0IGFsd2F5cyBiZSA4LgorCQkJCS8vIDIuIE1lYXN1cmVtZW50IFRva2VuLCB3ZSBubmVkIHRvIHNhdmUgaXQgZm9yIHRoZSBjb3JyZXNwb25kaW5nIHJlcG9ydC4KKwkJCQkvLyAzLiBNZWFzdXJlbWVudCBNb2RlLCBBbHRob3VnaCB0aGVyZSBhcmUgZGVmaW5pdGlvbnMsIGJ1dCB3ZSBkaW4ndCBzZWUgdmFsdWUgb3RoZXIgdGhhbgorCQkJCS8vICAgIDAgZnJvbSB0ZXN0IHNwZWNzIGV4YW1wbGVzLgorCQkJCS8vIDQuIE1lYXN1cmVtZW50IFR5cGUsIHRoaXMgaXMgd2hhdCB3ZSBuZWVkIHRvIGRvLgorCQkJCXN3aXRjaCAocFJlcUVsZW0tPlJlcUVsZW0uVHlwZSkKKwkJCQl7CisJCQkJCWNhc2UgTVNSTl9UWVBFX0NIQU5ORUxfTE9BRF9SRVE6CisJCQkJCWNhc2UgTVNSTl9UWVBFX05PSVNFX0hJU1RfUkVROgorCQkJCQljYXNlIE1TUk5fVFlQRV9CRUFDT05fUkVROgorCQkJCQkJLy8gQ2hlY2sgdGhlIEVuYWJsZSBub24tc2VydmluZyBjaGFubmVsIG1lYXN1cmVtZW50IGNvbnRyb2wKKwkJCQkJCWlmIChwQWQtPlN0YUNmZy5DQ1hDb250cm9sLmZpZWxkLkRDUk1FbmFibGUgPT0gMCkKKwkJCQkJCXsKKwkJCQkJCQkvLyBDaGVjayBjaGFubmVsIGJlZm9yZSBlbnF1ZXVlIHRoZSBhY3Rpb24KKwkJCQkJCQlpZiAocFJlcUVsZW0tPk1lYXN1cmVtZW50LkNoYW5uZWwgIT0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCQllbHNlCisJCQkJCQl7CisJCQkJCQkJLy8gSWYgb2ZmIGNoYW5uZWwgbWVhc3VyZW1lbnQsIGNoZWNrIHRoZSBUVSBkdXJhdGlvbiBsaW1pdAorCQkJCQkJCWlmIChwUmVxRWxlbS0+TWVhc3VyZW1lbnQuQ2hhbm5lbCAhPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKQorCQkJCQkJCQlpZiAocFJlcUVsZW0tPk1lYXN1cmVtZW50LkR1cmF0aW9uID4gcEFkLT5TdGFDZmcuQ0NYQ29udHJvbC5maWVsZC5UdUxpbWl0KQorCQkJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisKKwkJCQkJCS8vIFNhdmUgcmVxdWVzdHMgYW5kIGV4ZWN1dGUgYWN0aW9ucyBsYXRlcgorCQkJCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+U3RhQ2ZnLk1lYXN1cmVtZW50UmVxdWVzdFtJbmRleF0sIHBSZXFFbGVtLCBzaXplb2YoUk1fUkVRVUVTVF9BQ1RJT04pKTsKKwkJCQkJCUluZGV4ICs9IDE7CisJCQkJCQlicmVhazsKKworCQkJCQljYXNlIE1TUk5fVFlQRV9GUkFNRV9SRVE6CisJCQkJCQkvLyBTaW5jZSBpdCdzIG9wdGlvbiwgd2Ugd2lsbCBzdXBwb3J0IGxhdGVyCisJCQkJCQkvLyBGcmFtZVJlcXVlc3RBY3Rpb24ocEFkLCBwRGF0YSk7CisJCQkJCQlicmVhazsKKworCQkJCQlkZWZhdWx0OgorCQkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gUG9pbnQgdG8gbmV4dCBNZWFzdXJlbWVudCByZXF1ZXN0CisJCQkJcERhdGEgICs9IHNpemVvZihSTV9SRVFVRVNUX0FDVElPTik7CisJCQkJTGVuZ3RoIC09IHNpemVvZihSTV9SRVFVRVNUX0FDVElPTik7CisJCQkJYnJlYWs7CisKKwkJCS8vIFdlIGFjY2VwdCByZXF1ZXN0IG9ubHksIGFsbCBvdGhlcnMgYXJlIGRyb3BwZWQKKwkJCWNhc2UgSUVfTUVBU1VSRU1FTlRfUkVQT1JUOgorCQkJY2FzZSBJRV9BUF9UWF9QT1dFUjoKKwkJCWNhc2UgSUVfTUVBU1VSRU1FTlRfQ0FQQUJJTElUWToKKwkJCWRlZmF1bHQ6CisJCQkJcmV0dXJuOworCQl9CisJfQorCisJLy8gMTEuIFVwZGF0ZSBzb21lIGZsYWdzIGFuZCBpbmRleAorCXBBZC0+U3RhQ2ZnLlJNUmVxQ250ID0gSW5kZXg7CisKKwlpZiAoSW5kZXgpCisJeworCQlNbG1lRW5xdWV1ZShwQWQsIEFJUk9ORVRfU1RBVEVfTUFDSElORSwgTVQyX0FJUk9ORVRfU0NBTl9SRVEsIDAsIE5VTEwpOworCQlSVDI4WFhfTUxNRV9IQU5ETEVSKHBBZCk7CisJfQorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPC0tLS0tIEFpcm9uZXRNc2dBY3Rpb25cbiIpKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisKKwlBcmd1bWVudHM6CisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECUFpcm9uZXRSZXF1ZXN0QWN0aW9uKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCU1MTUVfUVVFVUVfRUxFTQkqRWxlbSkKK3sKKwlQUk1fUkVRVUVTVF9BQ1RJT04JcFJlcTsKKworCS8vIDEuIFBvaW50IHRvIG5leHQgcmVxdWVzdCBlbGVtZW50CisJcFJlcSA9IChQUk1fUkVRVUVTVF9BQ1RJT04pICZwQWQtPlN0YUNmZy5NZWFzdXJlbWVudFJlcXVlc3RbcEFkLT5TdGFDZmcuQ3VycmVudFJNUmVxSWR4XTsKKworCS8vIDIuIFBhcnNlIG1lYXN1cmVtZW50IHR5cGUgYW5kIGNhbGwgYXBwcm9wcmlhdGUgZnVuY3Rpb25zCisJaWYgKHBSZXEtPlJlcUVsZW0uVHlwZSA9PSBNU1JOX1RZUEVfQ0hBTk5FTF9MT0FEX1JFUSkKKwkJLy8gQ2hhbm5lbCBMb2FkIG1lYXN1cmVtZW50IHJlcXVlc3QKKwkJQ2hhbm5lbExvYWRSZXF1ZXN0QWN0aW9uKHBBZCwgcEFkLT5TdGFDZmcuQ3VycmVudFJNUmVxSWR4KTsKKwllbHNlIGlmIChwUmVxLT5SZXFFbGVtLlR5cGUgPT0gTVNSTl9UWVBFX05PSVNFX0hJU1RfUkVRKQorCQkvLyBOb2lzZSBIaXN0b2dyYW0gbWVhc3VyZW1lbnQgcmVxdWVzdAorCQlOb2lzZUhpc3RSZXF1ZXN0QWN0aW9uKHBBZCwgcEFkLT5TdGFDZmcuQ3VycmVudFJNUmVxSWR4KTsKKwllbHNlIGlmIChwUmVxLT5SZXFFbGVtLlR5cGUgPT0gTVNSTl9UWVBFX0JFQUNPTl9SRVEpCisJCS8vIEJlYWNvbiBtZWFzdXJlbWVudCByZXF1ZXN0CisJCUJlYWNvblJlcXVlc3RBY3Rpb24ocEFkLCBwQWQtPlN0YUNmZy5DdXJyZW50Uk1SZXFJZHgpOworCWVsc2UKKwkJLy8gVW5rbm93bi4gRG8gbm90aGluZyBhbmQgcmV0dXJuLCB0aGlzIHNob3VsZCBuZXZlciBoYXBwZW4KKwkJcmV0dXJuOworCisJLy8gMy4gUGVlayBpbnRvIHRoZSBuZXh0IHJlcXVlc3QsIGlmIGl0J3MgcGFyYWxsZWwsIHdlIHdpbGwgdXBkYXRlIHRoZSBzY2FuIHRpbWUgdG8gdGhlIGxhcmdlc3Qgb25lCisJaWYgKChwQWQtPlN0YUNmZy5DdXJyZW50Uk1SZXFJZHggKyAxKSA8IHBBZC0+U3RhQ2ZnLlJNUmVxQ250KQorCXsKKwkJcFJlcSA9IChQUk1fUkVRVUVTVF9BQ1RJT04pICZwQWQtPlN0YUNmZy5NZWFzdXJlbWVudFJlcXVlc3RbcEFkLT5TdGFDZmcuQ3VycmVudFJNUmVxSWR4ICsgMV07CisJCS8vIENoZWNrIGZvciBwYXJhbGxlbCBiaXQKKwkJaWYgKChwUmVxLT5SZXFFbGVtLk1vZGUgJiAweDAxKSAmJiAocFJlcS0+TWVhc3VyZW1lbnQuQ2hhbm5lbCA9PSBwQWQtPlN0YUNmZy5DQ1hTY2FuQ2hhbm5lbCkpCisJCXsKKwkJCS8vIFVwZGF0ZSBwYXJhbGxlbCBtb2RlIHJlcXVlc3QgaW5mb3JtYXRpb24KKwkJCXBBZC0+U3RhQ2ZnLlBhcmFsbGVsUmVxID0gVFJVRTsKKwkJCXBBZC0+U3RhQ2ZnLkNDWFNjYW5UaW1lID0gKChwUmVxLT5NZWFzdXJlbWVudC5EdXJhdGlvbiA+IHBBZC0+U3RhQ2ZnLkNDWFNjYW5UaW1lKSA/CisJCQkocFJlcS0+TWVhc3VyZW1lbnQuRHVyYXRpb24pIDogKHBBZC0+U3RhQ2ZnLkNDWFNjYW5UaW1lKSk7CisJCX0KKwl9CisKKwkvLyA0LiBDYWxsIFJUMjhYWF9NTE1FX0hBTkRMRVIgdG8gZXhlY3V0ZSB0aGUgcmVxdWVzdCBtbG1lIGNvbW1hbmRzLCBTY2FuIHJlcXVlc3QgaXMgdGhlIG9ubHkgb25lIHVzZWQKKwlSVDI4WFhfTUxNRV9IQU5ETEVSKHBBZCk7CisKK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJUHJlcGFyZSBjaGFubmVsIGxvYWQgcmVwb3J0IGFjdGlvbiwgc3BlY2lhbCBzY2FuIG9wZXJhdGlvbiBhZGRlZAorCQl0byBzdXBwb3J0CisKKwlBcmd1bWVudHM6CisJCXBBZAlQb2ludGVyCXRvIG91ciBhZGFwdGVyCisJCXBEYXRhCQlTdGFydCBmcm9tIGVsZW1lbnQgSUQKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJQ2hhbm5lbExvYWRSZXF1ZXN0QWN0aW9uKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVDSEFSCQkJSW5kZXgpCit7CisJUFJNX1JFUVVFU1RfQUNUSU9OCQkJCXBSZXE7CisJTUxNRV9TQ0FOX1JFUV9TVFJVQ1QJCQlTY2FuUmVxOworCVVDSEFSCQkJCQkJCVplcm9Tc2lkWzMyXTsKKwlORElTX1NUQVRVUwkJCQkJCU5TdGF0dXM7CisJUFVDSEFSCQkJCQkJCXBPdXRCdWZmZXIgPSBOVUxMOworCVBIRUFERVJfODAyXzExCQkJCQlwTnVsbEZyYW1lOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ2hhbm5lbExvYWRSZXF1ZXN0QWN0aW9uIC0tLS0tPlxuIikpOworCisJcFJlcSA9IChQUk1fUkVRVUVTVF9BQ1RJT04pICZwQWQtPlN0YUNmZy5NZWFzdXJlbWVudFJlcXVlc3RbSW5kZXhdOworCU5kaXNaZXJvTWVtb3J5KFplcm9Tc2lkLCAzMik7CisKKwkvLyBQcmVwYXJlIGZvciBzcGVjaWFsIHNjYW4gcmVxdWVzdAorCS8vIFRoZSBzY2FuIGRlZmluaXRpb24gaXMgZGlmZmVyZW50IHdpdGggb3VyIEFjdGl2ZSwgUGFzc2l2ZSBzY2FuIGRlZmluaXRpb24uCisJLy8gRm9yIENDWDIsIEFjdGl2ZSBtZWFucyBzZW5kIG91dCBwcm9iZSByZXF1ZXN0IHdpdGggYnJvYWRjYXN0IEJTU0lELgorCS8vIFBhc3NpdmUgbWVhbnMgbm8gcHJvYmUgcmVxdWVzdCBzZW50LCBvbmx5IGxpc3RlbiB0byB0aGUgYmVhY29ucy4KKwkvLyBUaGUgY2hhbm5lbCBzY2FubmVkIGlzIGZpeGVkIGFzIHNwZWNpZmllZCwgbm8gbmVlZCB0byBzY2FuIGFsbCBjaGFubmVscy4KKwkvLyBUaGUgc2NhbiB3YWl0IHRpbWUgaXMgc3BlY2lmaWVkIGluIHRoZSByZXF1ZXN0IHRvby4KKwkvLyBQYXNzaXZlIHNjYW4gTW9kZQorCisJLy8gQ29udHJvbCBzdGF0ZSBtYWNoaW5lIGlzIG5vdCBpZGxlLCByZWplY3QgdGhlIHJlcXVlc3QKKwlpZiAoKHBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgIT0gQ05UTF9JRExFKSAmJiAoSW5kZXggPT0gMCkpCisJCXJldHVybjsKKworCS8vIEZpbGwgb3V0IHN0dWZmIGZvciBzY2FuIHJlcXVlc3QKKwlTY2FuUGFybUZpbGwocEFkLCAmU2NhblJlcSwgWmVyb1NzaWQsIDAsIEJTU19BTlksIFNDQU5fQ0lTQ09fQ0hBTk5FTF9MT0FEKTsKKwlNbG1lRW5xdWV1ZShwQWQsIFNZTkNfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfU0NBTl9SRVEsIHNpemVvZihNTE1FX1NDQU5fUkVRX1NUUlVDVCksICZTY2FuUmVxKTsKKwlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX09JRF9MSVNUX1NDQU47CisKKwkvLyBSZXNldCBzb21lIGludGVybmFsIGNvbnRyb2wgZmxhZ3MgdG8gbWFrZSBzdXJlIHRoaXMgc2NhbiB3b3Jrcy4KKwlCc3NUYWJsZUluaXQoJnBBZC0+U3RhQ2ZnLkNDWEJzc1RhYik7CisJcEFkLT5TdGFDZmcuU2NhbkNudCAgICAgICAgPSAwOworCXBBZC0+U3RhQ2ZnLkNDWFNjYW5DaGFubmVsID0gcFJlcS0+TWVhc3VyZW1lbnQuQ2hhbm5lbDsKKwlwQWQtPlN0YUNmZy5DQ1hTY2FuVGltZSAgICA9IHBSZXEtPk1lYXN1cmVtZW50LkR1cmF0aW9uOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiRHVyYXRpb24gJWQsIENoYW5uZWwgJWQhXG4iLCBwUmVxLT5NZWFzdXJlbWVudC5EdXJhdGlvbiwgcFJlcS0+TWVhc3VyZW1lbnQuQ2hhbm5lbCkpOworCisJLy8gSWYgaXQncyBub24gc2VydmluZyBjaGFubmVsIHNjYW4sIHNlbmQgb3V0IGEgbnVsbCBmcmFtZSB3aXRoIFBTTSBiaXQgb24uCisJaWYgKHBBZC0+U3RhQ2ZnLkNDWFNjYW5DaGFubmVsICE9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpCisJeworCQkvLyBVc2UgTUxNRSBlbnF1ZXVlIG1ldGhvZAorCQlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgKFBWT0lEKSZwT3V0QnVmZmVyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKKwkJaWYgKE5TdGF0dXMJIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJCXJldHVybjsKKworCQlwTnVsbEZyYW1lID0gKFBIRUFERVJfODAyXzExKSBwT3V0QnVmZmVyOzsKKwkJLy8gTWFrZSB0aGUgcG93ZXIgc2F2ZSBOdWxsIGZyYW1lIHdpdGggUFNNIGJpdCBvbgorCQlNZ3RNYWNIZWFkZXJJbml0KHBBZCwgcE51bGxGcmFtZSwgU1VCVFlQRV9OVUxMX0ZVTkMsIDEsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisJCXBOdWxsRnJhbWUtPkR1cmF0aW9uIAk9IDA7CisJCXBOdWxsRnJhbWUtPkZDLlR5cGUgCT0gQlRZUEVfREFUQTsKKwkJcE51bGxGcmFtZS0+RkMuUHdyTWdtdAk9IFBXUl9TQVZFOworCisJCS8vIFNlbmQgdXNpbmcgcHJpb3JpdHkgcXVldWUKKwkJTWluaXBvcnRNTVJlcXVlc3QocEFkLCAwLCBwT3V0QnVmZmVyLCBzaXplb2YoSEVBREVSXzgwMl8xMSkpOworCQlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZW5kIFBTTSBEYXRhIGZyYW1lIGZvciBvZmYgY2hhbm5lbCBSTVxuIikpOworCQlSVE1QdXNlY0RlbGF5KDUwMDApOworCX0KKworCXBBZC0+U3RhQ2ZnLkNDWFJlcVR5cGUgICAgID0gTVNSTl9UWVBFX0NIQU5ORUxfTE9BRF9SRVE7CisJcEFkLT5TdGFDZmcuQ0xCdXN5Qnl0ZXMgICAgPSAwOworCS8vIEVuYWJsZSBSeCB3aXRoIHByb21pc2N1b3VzIHJlY2VwdGlvbgorCVJUTVBfSU9fV1JJVEUzMihwQWQsIFJYX0ZJTFRSX0NGRywgMHgxMDEwKTsKKworCS8vIFNldCBjaGFubmVsIGxvYWQgbWVhc3VyZW1lbnQgZmxhZworCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JBRElPX01FQVNVUkVNRU5UKTsKKworCXBBZC0+TWxtZS5BaXJvbmV0TWFjaGluZS5DdXJyU3RhdGUgPSBBSVJPTkVUX1NDQU5OSU5HOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ2hhbm5lbExvYWRSZXF1ZXN0QWN0aW9uIDwtLS0tLVxuIikpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJUHJlcGFyZSBub2lzZSBoaXN0b2dyYW0gcmVwb3J0IGFjdGlvbiwgc3BlY2lhbCBzY2FuIG9wZXJhdGlvbiBhZGRlZAorCQl0byBzdXBwb3J0CisKKwlBcmd1bWVudHM6CisJCXBBZAlQb2ludGVyCXRvIG91ciBhZGFwdGVyCisJCXBEYXRhCQlTdGFydCBmcm9tIGVsZW1lbnQgSUQKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJTm9pc2VIaXN0UmVxdWVzdEFjdGlvbigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVQ0hBUgkJCUluZGV4KQoreworCVBSTV9SRVFVRVNUX0FDVElPTgkJCQlwUmVxOworCU1MTUVfU0NBTl9SRVFfU1RSVUNUCQkJU2NhblJlcTsKKwlVQ0hBUgkJCQkJCQlaZXJvU3NpZFszMl0sIGk7CisJTkRJU19TVEFUVVMJCQkJCQlOU3RhdHVzOworCVBVQ0hBUgkJCQkJCQlwT3V0QnVmZmVyID0gTlVMTDsKKwlQSEVBREVSXzgwMl8xMQkJCQkJcE51bGxGcmFtZTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk5vaXNlSGlzdFJlcXVlc3RBY3Rpb24gLS0tLS0+XG4iKSk7CisKKwlwUmVxID0gKFBSTV9SRVFVRVNUX0FDVElPTikgJnBBZC0+U3RhQ2ZnLk1lYXN1cmVtZW50UmVxdWVzdFtJbmRleF07CisJTmRpc1plcm9NZW1vcnkoWmVyb1NzaWQsIDMyKTsKKworCS8vIFByZXBhcmUgZm9yIHNwZWNpYWwgc2NhbiByZXF1ZXN0CisJLy8gVGhlIHNjYW4gZGVmaW5pdGlvbiBpcyBkaWZmZXJlbnQgd2l0aCBvdXIgQWN0aXZlLCBQYXNzaXZlIHNjYW4gZGVmaW5pdGlvbi4KKwkvLyBGb3IgQ0NYMiwgQWN0aXZlIG1lYW5zIHNlbmQgb3V0IHByb2JlIHJlcXVlc3Qgd2l0aCBicm9hZGNhc3QgQlNTSUQuCisJLy8gUGFzc2l2ZSBtZWFucyBubyBwcm9iZSByZXF1ZXN0IHNlbnQsIG9ubHkgbGlzdGVuIHRvIHRoZSBiZWFjb25zLgorCS8vIFRoZSBjaGFubmVsIHNjYW5uZWQgaXMgZml4ZWQgYXMgc3BlY2lmaWVkLCBubyBuZWVkIHRvIHNjYW4gYWxsIGNoYW5uZWxzLgorCS8vIFRoZSBzY2FuIHdhaXQgdGltZSBpcyBzcGVjaWZpZWQgaW4gdGhlIHJlcXVlc3QgdG9vLgorCS8vIFBhc3NpdmUgc2NhbiBNb2RlCisKKwkvLyBDb250cm9sIHN0YXRlIG1hY2hpbmUgaXMgbm90IGlkbGUsIHJlamVjdCB0aGUgcmVxdWVzdAorCWlmICgocEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSAhPSBDTlRMX0lETEUpICYmIChJbmRleCA9PSAwKSkKKwkJcmV0dXJuOworCisJLy8gRmlsbCBvdXQgc3R1ZmYgZm9yIHNjYW4gcmVxdWVzdAorCVNjYW5QYXJtRmlsbChwQWQsICZTY2FuUmVxLCBaZXJvU3NpZCwgMCwgQlNTX0FOWSwgU0NBTl9DSVNDT19OT0lTRSk7CisJTWxtZUVucXVldWUocEFkLCBTWU5DX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX1NDQU5fUkVRLCBzaXplb2YoTUxNRV9TQ0FOX1JFUV9TVFJVQ1QpLCAmU2NhblJlcSk7CisJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9PSURfTElTVF9TQ0FOOworCisJLy8gUmVzZXQgc29tZSBpbnRlcm5hbCBjb250cm9sIGZsYWdzIHRvIG1ha2Ugc3VyZSB0aGlzIHNjYW4gd29ya3MuCisJQnNzVGFibGVJbml0KCZwQWQtPlN0YUNmZy5DQ1hCc3NUYWIpOworCXBBZC0+U3RhQ2ZnLlNjYW5DbnQgICAgICAgID0gMDsKKwlwQWQtPlN0YUNmZy5DQ1hTY2FuQ2hhbm5lbCA9IHBSZXEtPk1lYXN1cmVtZW50LkNoYW5uZWw7CisJcEFkLT5TdGFDZmcuQ0NYU2NhblRpbWUgICAgPSBwUmVxLT5NZWFzdXJlbWVudC5EdXJhdGlvbjsKKwlwQWQtPlN0YUNmZy5DQ1hSZXFUeXBlICAgICA9IE1TUk5fVFlQRV9OT0lTRV9ISVNUX1JFUTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkR1cmF0aW9uICVkLCBDaGFubmVsICVkIVxuIiwgcFJlcS0+TWVhc3VyZW1lbnQuRHVyYXRpb24sIHBSZXEtPk1lYXN1cmVtZW50LkNoYW5uZWwpKTsKKworCS8vIElmIGl0J3Mgbm9uIHNlcnZpbmcgY2hhbm5lbCBzY2FuLCBzZW5kIG91dCBhIG51bGwgZnJhbWUgd2l0aCBQU00gYml0IG9uLgorCWlmIChwQWQtPlN0YUNmZy5DQ1hTY2FuQ2hhbm5lbCAhPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKQorCXsKKwkJLy8gVXNlIE1MTUUgZW5xdWV1ZSBtZXRob2QKKwkJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsIChQVk9JRCkmcE91dEJ1ZmZlcik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5CisJCWlmIChOU3RhdHVzCSE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJCQlyZXR1cm47CisKKwkJcE51bGxGcmFtZSA9IChQSEVBREVSXzgwMl8xMSkgcE91dEJ1ZmZlcjsKKwkJLy8gTWFrZSB0aGUgcG93ZXIgc2F2ZSBOdWxsIGZyYW1lIHdpdGggUFNNIGJpdCBvbgorCQlNZ3RNYWNIZWFkZXJJbml0KHBBZCwgcE51bGxGcmFtZSwgU1VCVFlQRV9OVUxMX0ZVTkMsIDEsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisJCXBOdWxsRnJhbWUtPkR1cmF0aW9uIAk9IDA7CisJCXBOdWxsRnJhbWUtPkZDLlR5cGUgIAk9IEJUWVBFX0RBVEE7CisJCXBOdWxsRnJhbWUtPkZDLlB3ck1nbXQJPSBQV1JfU0FWRTsKKworCQkvLyBTZW5kIHVzaW5nIHByaW9yaXR5IHF1ZXVlCisJCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgMCwgcE91dEJ1ZmZlciwgc2l6ZW9mKEhFQURFUl84MDJfMTEpKTsKKwkJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2VuZCBQU00gRGF0YSBmcmFtZSBmb3Igb2ZmIGNoYW5uZWwgUk1cbiIpKTsKKwkJUlRNUHVzZWNEZWxheSg1MDAwKTsKKwl9CisKKwkvLyBSZXNldCB0aGUgc3RhdGlzdGljcworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJCXBBZC0+U3RhQ2ZnLlJQSURlbnNpdHlbaV0gPSAwOworCisJLy8gRW5hYmxlIFJ4IHdpdGggcHJvbWlzY3VvdXMgcmVjZXB0aW9uCisJUlRNUF9JT19XUklURTMyKHBBZCwgUlhfRklMVFJfQ0ZHLCAweDEwMTApOworCisJLy8gU2V0IGNoYW5uZWwgbG9hZCBtZWFzdXJlbWVudCBmbGFnCisJUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkFESU9fTUVBU1VSRU1FTlQpOworCisJcEFkLT5NbG1lLkFpcm9uZXRNYWNoaW5lLkN1cnJTdGF0ZSA9IEFJUk9ORVRfU0NBTk5JTkc7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJOb2lzZUhpc3RSZXF1ZXN0QWN0aW9uIDwtLS0tLVxuIikpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJUHJlcGFyZSBCZWFjb24gcmVwb3J0IGFjdGlvbiwgc3BlY2lhbCBzY2FuIG9wZXJhdGlvbiBhZGRlZAorCQl0byBzdXBwb3J0CisKKwlBcmd1bWVudHM6CisJCXBBZAlQb2ludGVyCXRvIG91ciBhZGFwdGVyCisJCXBEYXRhCQlTdGFydCBmcm9tIGVsZW1lbnQgSUQKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJQmVhY29uUmVxdWVzdEFjdGlvbigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVQ0hBUgkJCUluZGV4KQoreworCVBSTV9SRVFVRVNUX0FDVElPTgkJCQlwUmVxOworCU5ESVNfU1RBVFVTCQkJCQkJTlN0YXR1czsKKwlQVUNIQVIJCQkJCQkJcE91dEJ1ZmZlciA9IE5VTEw7CisJUEhFQURFUl84MDJfMTEJCQkJCXBOdWxsRnJhbWU7CisJTUxNRV9TQ0FOX1JFUV9TVFJVQ1QJCQlTY2FuUmVxOworCVVDSEFSCQkJCQkJCVplcm9Tc2lkWzMyXTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkJlYWNvblJlcXVlc3RBY3Rpb24gLS0tLS0+XG4iKSk7CisKKwlwUmVxID0gKFBSTV9SRVFVRVNUX0FDVElPTikgJnBBZC0+U3RhQ2ZnLk1lYXN1cmVtZW50UmVxdWVzdFtJbmRleF07CisJTmRpc1plcm9NZW1vcnkoWmVyb1NzaWQsIDMyKTsKKworCS8vIFByZXBhcmUgZm9yIHNwZWNpYWwgc2NhbiByZXF1ZXN0CisJLy8gVGhlIHNjYW4gZGVmaW5pdGlvbiBpcyBkaWZmZXJlbnQgd2l0aCBvdXIgQWN0aXZlLCBQYXNzaXZlIHNjYW4gZGVmaW5pdGlvbi4KKwkvLyBGb3IgQ0NYMiwgQWN0aXZlIG1lYW5zIHNlbmQgb3V0IHByb2JlIHJlcXVlc3Qgd2l0aCBicm9hZGNhc3QgQlNTSUQuCisJLy8gUGFzc2l2ZSBtZWFucyBubyBwcm9iZSByZXF1ZXN0IHNlbnQsIG9ubHkgbGlzdGVuIHRvIHRoZSBiZWFjb25zLgorCS8vIFRoZSBjaGFubmVsIHNjYW5uZWQgaXMgZml4ZWQgYXMgc3BlY2lmaWVkLCBubyBuZWVkIHRvIHNjYW4gYWxsIGNoYW5uZWxzLgorCS8vIFRoZSBzY2FuIHdhaXQgdGltZSBpcyBzcGVjaWZpZWQgaW4gdGhlIHJlcXVlc3QgdG9vLgorCWlmIChwUmVxLT5NZWFzdXJlbWVudC5TY2FuTW9kZSA9PSBNU1JOX1NDQU5fTU9ERV9QQVNTSVZFKQorCXsKKwkJLy8gUGFzc2l2ZSBzY2FuIE1vZGUKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGFzc2l2ZSBTY2FuIE1vZGUhXG4iKSk7CisKKwkJLy8gQ29udHJvbCBzdGF0ZSBtYWNoaW5lIGlzIG5vdCBpZGxlLCByZWplY3QgdGhlIHJlcXVlc3QKKwkJaWYgKChwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlICE9IENOVExfSURMRSkgJiYgKEluZGV4ID09IDApKQorCQkJcmV0dXJuOworCisJCS8vIEZpbGwgb3V0IHN0dWZmIGZvciBzY2FuIHJlcXVlc3QKKwkJU2NhblBhcm1GaWxsKHBBZCwgJlNjYW5SZXEsIFplcm9Tc2lkLCAwLCBCU1NfQU5ZLCBTQ0FOX0NJU0NPX1BBU1NJVkUpOworCQlNbG1lRW5xdWV1ZShwQWQsIFNZTkNfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfU0NBTl9SRVEsIHNpemVvZihNTE1FX1NDQU5fUkVRX1NUUlVDVCksICZTY2FuUmVxKTsKKwkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9PSURfTElTVF9TQ0FOOworCisJCS8vIFJlc2V0IHNvbWUgaW50ZXJuYWwgY29udHJvbCBmbGFncyB0byBtYWtlIHN1cmUgdGhpcyBzY2FuIHdvcmtzLgorCQlCc3NUYWJsZUluaXQoJnBBZC0+U3RhQ2ZnLkNDWEJzc1RhYik7CisJCXBBZC0+U3RhQ2ZnLlNjYW5DbnQgICAgICAgID0gMDsKKwkJcEFkLT5TdGFDZmcuQ0NYU2NhbkNoYW5uZWwgPSBwUmVxLT5NZWFzdXJlbWVudC5DaGFubmVsOworCQlwQWQtPlN0YUNmZy5DQ1hTY2FuVGltZSAgICA9IHBSZXEtPk1lYXN1cmVtZW50LkR1cmF0aW9uOworCQlwQWQtPlN0YUNmZy5DQ1hSZXFUeXBlICAgICA9IE1TUk5fVFlQRV9CRUFDT05fUkVROworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJEdXJhdGlvbiAlZCFcbiIsIHBSZXEtPk1lYXN1cmVtZW50LkR1cmF0aW9uKSk7CisKKwkJLy8gSWYgaXQncyBub24gc2VydmluZyBjaGFubmVsIHNjYW4sIHNlbmQgb3V0IGEgbnVsbCBmcmFtZSB3aXRoIFBTTSBiaXQgb24uCisJCWlmIChwQWQtPlN0YUNmZy5DQ1hTY2FuQ2hhbm5lbCAhPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKQorCQl7CisJCQkvLyBVc2UgTUxNRSBlbnF1ZXVlIG1ldGhvZAorCQkJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsIChQVk9JRCkmcE91dEJ1ZmZlcik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5CisJCQlpZiAoTlN0YXR1cwkhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCQkJCXJldHVybjsKKworCQkJcE51bGxGcmFtZSA9IChQSEVBREVSXzgwMl8xMSkgcE91dEJ1ZmZlcjsKKwkJCS8vIE1ha2UgdGhlIHBvd2VyIHNhdmUgTnVsbCBmcmFtZSB3aXRoIFBTTSBiaXQgb24KKwkJCU1ndE1hY0hlYWRlckluaXQocEFkLCBwTnVsbEZyYW1lLCBTVUJUWVBFX05VTExfRlVOQywgMSwgcEFkLT5Db21tb25DZmcuQnNzaWQsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKwkJCXBOdWxsRnJhbWUtPkR1cmF0aW9uIAk9IDA7CisJCQlwTnVsbEZyYW1lLT5GQy5UeXBlICAgICA9IEJUWVBFX0RBVEE7CisJCQlwTnVsbEZyYW1lLT5GQy5Qd3JNZ210ICA9IFBXUl9TQVZFOworCisJCQkvLyBTZW5kIHVzaW5nIHByaW9yaXR5IHF1ZXVlCisJCQlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIDAsIHBPdXRCdWZmZXIsIHNpemVvZihIRUFERVJfODAyXzExKSk7CisJCQlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2VuZCBQU00gRGF0YSBmcmFtZSBmb3Igb2ZmIGNoYW5uZWwgUk1cbiIpKTsKKwkJCVJUTVB1c2VjRGVsYXkoNTAwMCk7CisJCX0KKworCQlwQWQtPk1sbWUuQWlyb25ldE1hY2hpbmUuQ3VyclN0YXRlID0gQUlST05FVF9TQ0FOTklORzsKKwl9CisJZWxzZSBpZiAocFJlcS0+TWVhc3VyZW1lbnQuU2Nhbk1vZGUgPT0gTVNSTl9TQ0FOX01PREVfQUNUSVZFKQorCXsKKwkJLy8gQWN0aXZlIHNjYW4gTW9kZQorCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBY3RpdmUgU2NhbiBNb2RlIVxuIikpOworCisJCS8vIENvbnRyb2wgc3RhdGUgbWFjaGluZSBpcyBub3QgaWRsZSwgcmVqZWN0IHRoZSByZXF1ZXN0CisJCWlmIChwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlICE9IENOVExfSURMRSkKKwkJCXJldHVybjsKKworCQkvLyBGaWxsIG91dCBzdHVmZiBmb3Igc2NhbiByZXF1ZXN0CisJCVNjYW5QYXJtRmlsbChwQWQsICZTY2FuUmVxLCBaZXJvU3NpZCwgMCwgQlNTX0FOWSwgU0NBTl9DSVNDT19BQ1RJVkUpOworCQlNbG1lRW5xdWV1ZShwQWQsIFNZTkNfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfU0NBTl9SRVEsIHNpemVvZihNTE1FX1NDQU5fUkVRX1NUUlVDVCksICZTY2FuUmVxKTsKKwkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9PSURfTElTVF9TQ0FOOworCisJCS8vIFJlc2V0IHNvbWUgaW50ZXJuYWwgY29udHJvbCBmbGFncyB0byBtYWtlIHN1cmUgdGhpcyBzY2FuIHdvcmtzLgorCQlCc3NUYWJsZUluaXQoJnBBZC0+U3RhQ2ZnLkNDWEJzc1RhYik7CisJCXBBZC0+U3RhQ2ZnLlNjYW5DbnQgICAgICAgID0gMDsKKwkJcEFkLT5TdGFDZmcuQ0NYU2NhbkNoYW5uZWwgPSBwUmVxLT5NZWFzdXJlbWVudC5DaGFubmVsOworCQlwQWQtPlN0YUNmZy5DQ1hTY2FuVGltZSAgICA9IHBSZXEtPk1lYXN1cmVtZW50LkR1cmF0aW9uOworCQlwQWQtPlN0YUNmZy5DQ1hSZXFUeXBlICAgICA9IE1TUk5fVFlQRV9CRUFDT05fUkVROworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJEdXJhdGlvbiAlZCFcbiIsIHBSZXEtPk1lYXN1cmVtZW50LkR1cmF0aW9uKSk7CisKKwkJLy8gSWYgaXQncyBub24gc2VydmluZyBjaGFubmVsIHNjYW4sIHNlbmQgb3V0IGEgbnVsbCBmcmFtZSB3aXRoIFBTTSBiaXQgb24uCisJCWlmIChwQWQtPlN0YUNmZy5DQ1hTY2FuQ2hhbm5lbCAhPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKQorCQl7CisJCQkvLyBVc2UgTUxNRSBlbnF1ZXVlIG1ldGhvZAorCQkJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsIChQVk9JRCkmcE91dEJ1ZmZlcik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5CisJCQlpZiAoTlN0YXR1cwkhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCQkJCXJldHVybjsKKworCQkJcE51bGxGcmFtZSA9IChQSEVBREVSXzgwMl8xMSkgcE91dEJ1ZmZlcjsKKwkJCS8vIE1ha2UgdGhlIHBvd2VyIHNhdmUgTnVsbCBmcmFtZSB3aXRoIFBTTSBiaXQgb24KKwkJCU1ndE1hY0hlYWRlckluaXQocEFkLCBwTnVsbEZyYW1lLCBTVUJUWVBFX05VTExfRlVOQywgMSwgcEFkLT5Db21tb25DZmcuQnNzaWQsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKwkJCXBOdWxsRnJhbWUtPkR1cmF0aW9uIAk9IDA7CisJCQlwTnVsbEZyYW1lLT5GQy5UeXBlICAgICA9IEJUWVBFX0RBVEE7CisJCQlwTnVsbEZyYW1lLT5GQy5Qd3JNZ210ICA9IFBXUl9TQVZFOworCisJCQkvLyBTZW5kIHVzaW5nIHByaW9yaXR5IHF1ZXVlCisJCQlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIDAsIHBPdXRCdWZmZXIsIHNpemVvZihIRUFERVJfODAyXzExKSk7CisJCQlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2VuZCBQU00gRGF0YSBmcmFtZSBmb3Igb2ZmIGNoYW5uZWwgUk1cbiIpKTsKKwkJCVJUTVB1c2VjRGVsYXkoNTAwMCk7CisJCX0KKworCQlwQWQtPk1sbWUuQWlyb25ldE1hY2hpbmUuQ3VyclN0YXRlID0gQUlST05FVF9TQ0FOTklORzsKKwl9CisJZWxzZSBpZiAocFJlcS0+TWVhc3VyZW1lbnQuU2Nhbk1vZGUgPT0gTVNSTl9TQ0FOX01PREVfQkVBQ09OX1RBQkxFKQorCXsKKwkJLy8gQmVhY29uIHJlcG9ydCBNb2RlLCByZXBvcnQgYWxsIHRoZSBBUFMgaW4gY3VycmVudCBic3MgdGFibGUKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQmVhY29uIFJlcG9ydCBNb2RlIVxuIikpOworCisJCS8vIENvcHkgY3VycmVudCBCU1MgdGFibGUgdG8gQ0NYIHRhYmxlLCB3ZSBjYW4gb21pdCB0aGlzIHN0ZXAgbGF0ZXIgb24uCisJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPlN0YUNmZy5DQ1hCc3NUYWIsICZwQWQtPlNjYW5UYWIsIHNpemVvZihCU1NfVEFCTEUpKTsKKworCQkvLyBDcmVhdGUgYmVhY29uIHJlcG9ydCBmcm9tIEJzcyB0YWJsZQorCQlBaXJvbmV0Q3JlYXRlQmVhY29uUmVwb3J0RnJvbUJzc1RhYmxlKHBBZCk7CisKKwkJLy8gU2V0IHN0YXRlIHRvIHNjYW5uaW5nCisJCXBBZC0+TWxtZS5BaXJvbmV0TWFjaGluZS5DdXJyU3RhdGUgPSBBSVJPTkVUX1NDQU5OSU5HOworCisJCS8vIEVucXVldWUgcmVwb3J0IHJlcXVlc3QKKwkJLy8gQ2lzY28gc2NhbiByZXF1ZXN0IGlzIGZpbmlzaGVkLCBwcmVwYXJlIGJlYWNvbiByZXBvcnQKKwkJTWxtZUVucXVldWUocEFkLCBBSVJPTkVUX1NUQVRFX01BQ0hJTkUsIE1UMl9BSVJPTkVUX1NDQU5fRE9ORSwgMCwgTlVMTCk7CisJfQorCWVsc2UKKwl7CisJCS8vIFdyb25nIHNjYW4gTW9kZQorCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJXcm9uZyBTY2FuIE1vZGUhXG4iKSk7CisJfQorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQmVhY29uUmVxdWVzdEFjdGlvbiA8LS0tLS1cbiIpKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisKKwlBcmd1bWVudHM6CisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECUFpcm9uZXRSZXBvcnRBY3Rpb24oCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JTUxNRV9RVUVVRV9FTEVNCSpFbGVtKQoreworCVBSTV9SRVFVRVNUX0FDVElPTglwUmVxOworCVVMT05HCQkJCU5vdzMyOworCisgICAgTmRpc0dldFN5c3RlbVVwVGltZSgmTm93MzIpOworCXBBZC0+U3RhQ2ZnLkxhc3RCZWFjb25SeFRpbWUgPSBOb3czMjsKKworCXBSZXEgPSAoUFJNX1JFUVVFU1RfQUNUSU9OKSAmcEFkLT5TdGFDZmcuTWVhc3VyZW1lbnRSZXF1ZXN0W3BBZC0+U3RhQ2ZnLkN1cnJlbnRSTVJlcUlkeF07CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBaXJvbmV0UmVwb3J0QWN0aW9uIC0tLS0tPlxuIikpOworCisJLy8gMS4gUGFyc2UgbWVhc3VyZW1lbnQgdHlwZSBhbmQgY2FsbCBhcHByb3ByaWF0ZSBmdW5jdGlvbnMKKwlpZiAocFJlcS0+UmVxRWxlbS5UeXBlID09IE1TUk5fVFlQRV9DSEFOTkVMX0xPQURfUkVRKQorCQkvLyBDaGFubmVsIExvYWQgbWVhc3VyZW1lbnQgcmVxdWVzdAorCQlDaGFubmVsTG9hZFJlcG9ydEFjdGlvbihwQWQsIHBBZC0+U3RhQ2ZnLkN1cnJlbnRSTVJlcUlkeCk7CisJZWxzZSBpZiAocFJlcS0+UmVxRWxlbS5UeXBlID09IE1TUk5fVFlQRV9OT0lTRV9ISVNUX1JFUSkKKwkJLy8gTm9pc2UgSGlzdG9ncmFtIG1lYXN1cmVtZW50IHJlcXVlc3QKKwkJTm9pc2VIaXN0UmVwb3J0QWN0aW9uKHBBZCwgcEFkLT5TdGFDZmcuQ3VycmVudFJNUmVxSWR4KTsKKwllbHNlIGlmIChwUmVxLT5SZXFFbGVtLlR5cGUgPT0gTVNSTl9UWVBFX0JFQUNPTl9SRVEpCisJCS8vIEJlYWNvbiBtZWFzdXJlbWVudCByZXF1ZXN0CisJCUJlYWNvblJlcG9ydEFjdGlvbihwQWQsIHBBZC0+U3RhQ2ZnLkN1cnJlbnRSTVJlcUlkeCk7CisJZWxzZQorCQkvLyBVbmtub3duLiBEbyBub3RoaW5nIGFuZCByZXR1cm4KKwkJOworCisJLy8gMi4gUG9pbnQgdG8gdGhlIGNvcnJlY3QgaW5kZXggb2YgYWN0aW9uIGVsZW1lbnQsIHN0YXJ0IGZyb20gMAorCXBBZC0+U3RhQ2ZnLkN1cnJlbnRSTVJlcUlkeCsrOworCisJLy8gMy4gQ2hlY2sgZm9yIHBhcmFsbGVsIGFjdGlvbnMKKwlpZiAocEFkLT5TdGFDZmcuUGFyYWxsZWxSZXEgPT0gVFJVRSkKKwl7CisJCXBSZXEgPSAoUFJNX1JFUVVFU1RfQUNUSU9OKSAmcEFkLT5TdGFDZmcuTWVhc3VyZW1lbnRSZXF1ZXN0W3BBZC0+U3RhQ2ZnLkN1cnJlbnRSTVJlcUlkeF07CisKKwkJLy8gUHJvY2VzcyBuZXh0IGFjdGlvbiByaWdodCBhd2F5CisJCWlmIChwUmVxLT5SZXFFbGVtLlR5cGUgPT0gTVNSTl9UWVBFX0NIQU5ORUxfTE9BRF9SRVEpCisJCQkvLyBDaGFubmVsIExvYWQgbWVhc3VyZW1lbnQgcmVxdWVzdAorCQkJQ2hhbm5lbExvYWRSZXBvcnRBY3Rpb24ocEFkLCBwQWQtPlN0YUNmZy5DdXJyZW50Uk1SZXFJZHgpOworCQllbHNlIGlmIChwUmVxLT5SZXFFbGVtLlR5cGUgPT0gTVNSTl9UWVBFX05PSVNFX0hJU1RfUkVRKQorCQkJLy8gTm9pc2UgSGlzdG9ncmFtIG1lYXN1cmVtZW50IHJlcXVlc3QKKwkJCU5vaXNlSGlzdFJlcG9ydEFjdGlvbihwQWQsIHBBZC0+U3RhQ2ZnLkN1cnJlbnRSTVJlcUlkeCk7CisKKwkJcEFkLT5TdGFDZmcuUGFyYWxsZWxSZXEgPSBGQUxTRTsKKwkJcEFkLT5TdGFDZmcuQ3VycmVudFJNUmVxSWR4Kys7CisJfQorCisJaWYgKHBBZC0+U3RhQ2ZnLkN1cnJlbnRSTVJlcUlkeCA+PSBwQWQtPlN0YUNmZy5STVJlcUNudCkKKwl7CisJCS8vIDQuIFRoZXJlIGlzIG5vIG1vcmUgdW5wcm9jZXNzZWQgbWVhc3VyZW1lbnQgcmVxdWVzdCwgZ28gZm9yIHRyYW5zbWl0IHRoaXMgcmVwb3J0CisJCUFpcm9uZXRGaW5hbFJlcG9ydEFjdGlvbihwQWQpOworCQlwQWQtPk1sbWUuQWlyb25ldE1hY2hpbmUuQ3VyclN0YXRlID0gQUlST05FVF9JRExFOworCX0KKwllbHNlCisJeworCQlwUmVxID0gKFBSTV9SRVFVRVNUX0FDVElPTikgJnBBZC0+U3RhQ2ZnLk1lYXN1cmVtZW50UmVxdWVzdFtwQWQtPlN0YUNmZy5DdXJyZW50Uk1SZXFJZHhdOworCisJCWlmIChwUmVxLT5NZWFzdXJlbWVudC5DaGFubmVsICE9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpCisJCXsKKwkJCVJUTVB1c2VjRGVsYXkoMTAwMDAwKTsKKwkJfQorCisJCS8vIDUuIFRoZXJlIGFyZSBtb3JlIHJlcXVlc3RzIHRvIGJlIG1lYXN1cmUKKwkJTWxtZUVucXVldWUocEFkLCBBSVJPTkVUX1NUQVRFX01BQ0hJTkUsIE1UMl9BSVJPTkVUX1NDQU5fUkVRLCAwLCBOVUxMKTsKKwkJUlQyOFhYX01MTUVfSEFORExFUihwQWQpOworCX0KKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFpcm9uZXRSZXBvcnRBY3Rpb24gPC0tLS0tXG4iKSk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCisJQXJndW1lbnRzOgorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlBaXJvbmV0RmluYWxSZXBvcnRBY3Rpb24oCisJSU4JUFJUTVBfQURBUFRFUglwQWQpCit7CisJUFVDSEFSCQkJCQlwRGVzdDsKKwlQQUlST05FVF9JQVBQX0hFQURFUglwSUFQUDsKKwlQSEVBREVSXzgwMl8xMQkJCXBIZWFkZXI7CisJVUNIQVIJCQkJCUFja1JhdGUgPSBSQVRFXzI7CisJVVNIT1JUCQkJCQlBY2tEdXJhdGlvbiA9IDA7CisJTkRJU19TVEFUVVMJCQkJTlN0YXR1czsKKwlQVUNIQVIJCQkJCXBPdXRCdWZmZXIgPSBOVUxMOworCVVMT05HCQkJCQlGcmFtZUxlbiA9IDA7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBaXJvbmV0RmluYWxSZXBvcnRBY3Rpb24gLS0tLS0+XG4iKSk7CisKKwkvLyAwLiBTZXQgdXAgdGhlIGZyYW1lIHBvaW50ZXIsIEZyYW1lIHdhcyBpbml0ZWQgYXQgdGhlIGVuZCBvZiBtZXNzYWdlIGFjdGlvbgorCXBEZXN0ID0gJnBBZC0+U3RhQ2ZnLkZyYW1lUmVwb3J0QnVmW0xFTkdUSF84MDJfMTFdOworCisJLy8gMS4gVXBkYXRlIHJlcG9ydCBJQVBQIGZpZWxkcworCXBJQVBQID0gKFBBSVJPTkVUX0lBUFBfSEVBREVSKSBwRGVzdDsKKworCS8vIDIuIENvcHkgQ2lzY28gU05BUCBoZWFkZXIKKwlOZGlzTW92ZU1lbW9yeShwSUFQUC0+Q2lzY29TbmFwSGVhZGVyLCBTTkFQX0FJUk9ORVQsIExFTkdUSF84MDJfMV9IKTsKKworCS8vIDMuIG5ldHdvcmsgb3JkZXIgZm9yIHRoaXMgMTZiaXQgbGVuZ3RoCisJcElBUFAtPkxlbmd0aCAgPSBjcHUyYmUxNihwQWQtPlN0YUNmZy5GcmFtZVJlcG9ydExlbiAtIExFTkdUSF84MDJfMTEgLSBMRU5HVEhfODAyXzFfSCk7CisKKwkvLyAzLjEgc2FuaXR5IGNoZWNrIHRoZSByZXBvcnQgbGVuZ3RoLCBpZ25vcmUgaXQgaWYgdGhlcmUgaXMgbm90aGluZyB0byByZXBvcnQKKwlpZiAoYmUyY3B1MTYocElBUFAtPkxlbmd0aCkgPD0gMTgpCisJCXJldHVybjsKKworCS8vIDQuIFR5cGUgbXVzdCBiZSAweDMyCisJcElBUFAtPlR5cGUgICAgPSBBSVJPTkVUX0lBUFBfVFlQRTsKKworCS8vIDUuIFN1YlR5cGUgZm9yIHJlcG9ydCBtdXN0IGJlIDB4ODEKKwlwSUFQUC0+U3ViVHlwZSA9IEFJUk9ORVRfSUFQUF9TVUJUWVBFX1JFUE9SVDsKKworCS8vIDYuIERBIGlzIG5vdCB1c2VkIGFuZCBtdXN0IGJlIHplcm8sIGFsdGhvdWdoIHRoZSB3aG9sZSBmcmFtZSB3YXMgY2xlYXJlZCBhdCB0aGUgc3RhcnQgb2YgZnVuY3Rpb24KKwkvLyAgICBXZSB3aWxsIGRvIGl0IGFnYWluIGhlcmUuIFdlIGNhbiB1c2UgQlNTSUQgaW5zdGVhZAorCUNPUFlfTUFDX0FERFIocElBUFAtPkRBLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisKKwkvLyA3LiBTQSBpcyB0aGUgY2xpZW50IHJlcG9ydGluZyB3aGljaCBtdXN0IGJlIG91ciBNQUMKKwlDT1BZX01BQ19BRERSKHBJQVBQLT5TQSwgcEFkLT5DdXJyZW50QWRkcmVzcyk7CisKKwkvLyA4LiBDb3B5IHRoZSBzYXZlZCBkaWFsb2cgdG9rZW4KKwlwSUFQUC0+VG9rZW4gPSBwQWQtPlN0YUNmZy5JQVBQVG9rZW47CisKKwkvLyA5LiBNYWtlIHRoZSBSZXBvcnQgZnJhbWUgODAyLjExIGhlYWRlcgorCS8vICAgIFJldXNlIGZ1bmN0aW9uIGluIHdwYS5jCisJcEhlYWRlciA9IChQSEVBREVSXzgwMl8xMSkgcEFkLT5TdGFDZmcuRnJhbWVSZXBvcnRCdWY7CisJcEFkLT5TZXF1ZW5jZSArKzsKKwlXcGFNYWNIZWFkZXJJbml0KHBBZCwgcEhlYWRlciwgMCwgcEFkLT5Db21tb25DZmcuQnNzaWQpOworCisJLy8gQUNLIHNpemUJaXMgMTQgaW5jbHVkZSBDUkMsIGFuZCBpdHMgcmF0ZQlpcyBiYXNlZCBvbiByZWFsIHRpbWUgaW5mb3JtYXRpb24KKwlBY2tSYXRlICAgICA9IHBBZC0+Q29tbW9uQ2ZnLkV4cGVjdGVkQUNLUmF0ZVtwQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZV07CisJQWNrRHVyYXRpb24gPSBSVE1QQ2FsY0R1cmF0aW9uKHBBZCwgQWNrUmF0ZSwgMTQpOworCXBIZWFkZXItPkR1cmF0aW9uID0gcEFkLT5Db21tb25DZmcuRHNpZnMgKyBBY2tEdXJhdGlvbjsKKworCS8vIFVzZSBNTE1FIGVucXVldWUgbWV0aG9kCisJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKKwlpZiAoTlN0YXR1cwkhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCQlyZXR1cm47CisKKwkvLyAxMC4gUHJlcGFyZSByZXBvcnQgZnJhbWUgd2l0aCBkeW5hbWljIG91dGJ1ZmZlci4gSnVzdCBzaW1wbHkgY29weSBldmVyeXRoaW5nLgorCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAgICAgICAgICAgICAgICAmRnJhbWVMZW4sCisJICAgICAgICAgICAgICAgICAgcEFkLT5TdGFDZmcuRnJhbWVSZXBvcnRMZW4sIHBBZC0+U3RhQ2ZnLkZyYW1lUmVwb3J0QnVmLAorCQkgICAgICAgICAgICAgIEVORF9PRl9BUkdTKTsKKworCS8vIDExLiBTZW5kIHVzaW5nIHByaW9yaXR5IHF1ZXVlCisJTWluaXBvcnRNTVJlcXVlc3QocEFkLCAwLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7CisJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKKworCXBBZC0+U3RhQ2ZnLkNDWFJlcVR5cGUgPSBNU1JOX1RZUEVfVU5VU0VEOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQWlyb25ldEZpbmFsUmVwb3J0QWN0aW9uIDwtLS0tLVxuIikpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKworCUFyZ3VtZW50czoKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJQ2hhbm5lbExvYWRSZXBvcnRBY3Rpb24oCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVUNIQVIJCQlJbmRleCkKK3sKKwlQTUVBU1VSRU1FTlRfUkVQT1JUX0VMRU1FTlQJcFJlcG9ydDsKKwlQQ0hBTk5FTF9MT0FEX1JFUE9SVAkJcExvYWQ7CisJUFVDSEFSCQkJCQkJcERlc3Q7CisJVUNIQVIJCQkJCQlDQ0FCdXN5RnJhY3Rpb247CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDaGFubmVsTG9hZFJlcG9ydEFjdGlvbiAtLS0tLT5cbiIpKTsKKworCS8vIERpc2FibGUgUnggd2l0aCBwcm9taXNjdW91cyByZWNlcHRpb24sIG1ha2UgaXQgYmFjayB0byBub3JtYWwKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBSWF9GSUxUUl9DRkcsIFNUQU5PUk1BTCk7IC8vIFN0YWlvbiBub3QgZHJvcCBjb250cm9sIGZyYW1lIHdpbGwgZmFpbCBXaUZpIENlcnRpZmljYXRpb24uCisKKwkvLyAwLiBTZXR1cCBwb2ludGVyIGZvciBwcm9jZXNzaW5nIGJlYWNvbiAmIHByb2JlIHJlc3BvbnNlCisJcERlc3QgPSAoUFVDSEFSKSAmcEFkLT5TdGFDZmcuRnJhbWVSZXBvcnRCdWZbcEFkLT5TdGFDZmcuRnJhbWVSZXBvcnRMZW5dOworCXBSZXBvcnQgPSAoUE1FQVNVUkVNRU5UX1JFUE9SVF9FTEVNRU5UKSBwRGVzdDsKKworCS8vIDEuIEZpbGwgTWVhc3VyZW1lbnQgcmVwb3J0IGVsZW1lbnQgZmllbGQuCisJcFJlcG9ydC0+RWlkICAgID0gSUVfTUVBU1VSRU1FTlRfUkVQT1JUOworCS8vIEZpeGVkIExlbmd0aCBhdCA5LCBub3QgaW5jbHVkZSBFaWQgYW5kIGxlbmd0aCBmaWVsZHMKKwlwUmVwb3J0LT5MZW5ndGggPSA5OworCXBSZXBvcnQtPlRva2VuICA9IHBBZC0+U3RhQ2ZnLk1lYXN1cmVtZW50UmVxdWVzdFtJbmRleF0uUmVxRWxlbS5Ub2tlbjsKKwlwUmVwb3J0LT5Nb2RlICAgPSBwQWQtPlN0YUNmZy5NZWFzdXJlbWVudFJlcXVlc3RbSW5kZXhdLlJlcUVsZW0uTW9kZTsKKwlwUmVwb3J0LT5UeXBlICAgPSBNU1JOX1RZUEVfQ0hBTk5FTF9MT0FEX1JFUTsKKworCS8vIDIuIEZpbGwgY2hhbm5lbCByZXBvcnQgbWVhc3VyZW1lbnQgZGF0YQorCXBEZXN0ICs9IHNpemVvZihNRUFTVVJFTUVOVF9SRVBPUlRfRUxFTUVOVCk7CisJcExvYWQgID0gKFBDSEFOTkVMX0xPQURfUkVQT1JUKSBwRGVzdDsKKwlwTG9hZC0+Q2hhbm5lbCAgPSBwQWQtPlN0YUNmZy5NZWFzdXJlbWVudFJlcXVlc3RbSW5kZXhdLk1lYXN1cmVtZW50LkNoYW5uZWw7CisJcExvYWQtPlNwYXJlICAgID0gMDsKKwlwTG9hZC0+RHVyYXRpb24gPSBwQWQtPlN0YUNmZy5NZWFzdXJlbWVudFJlcXVlc3RbSW5kZXhdLk1lYXN1cmVtZW50LkR1cmF0aW9uOworCisJLy8gMy4gQ2FsY3VsYXRlIHRoZSBDQ0EgQnVzeSBGcmFjdGlvbgorCS8vICAgIChCeXRlcyArIEFDSyBzaXplKSAqIDggLyBUeCBzcGVlZCAqIDI1NSAvIDEwMDAgLyBtZWFzdXJlbWVudCBkdXJhdGlvbiwgdXNlIDI0IHVzIFR4IHNwZWVkCisJLy8gICAgID0gIChCeXRlcyArIEFDSykgLyAxMiAvIGR1cmF0aW9uCisJLy8gICAgIDkgaXMgdGhlIGdvb2QgdmFsdWUgZm9yIHBBZC0+U3RhQ2ZnLkNMRmFjdG9yCisJLy8gQ0NBQnVzeUZyYWN0aW9uID0gKFVDSEFSKSAocEFkLT5TdGFDZmcuQ0xCdXN5Qnl0ZXMgLyA5IC8gcExvYWQtPkR1cmF0aW9uKTsKKwlDQ0FCdXN5RnJhY3Rpb24gPSAoVUNIQVIpIChwQWQtPlN0YUNmZy5DTEJ1c3lCeXRlcyAvIHBBZC0+U3RhQ2ZnLkNMRmFjdG9yIC8gcExvYWQtPkR1cmF0aW9uKTsKKwlpZiAoQ0NBQnVzeUZyYWN0aW9uIDwgMTApCisJCQlDQ0FCdXN5RnJhY3Rpb24gPSAoVUNIQVIpIChwQWQtPlN0YUNmZy5DTEJ1c3lCeXRlcyAvIDMgLyBwTG9hZC0+RHVyYXRpb24pICsgMTsKKworCXBMb2FkLT5DQ0FCdXN5ID0gQ0NBQnVzeUZyYWN0aW9uOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNMQnVzeUJ5dGUgJWxkLCBEdXJhdGlvbiAlZCwgUmVzdWx0LCAlZFxuIiwgcEFkLT5TdGFDZmcuQ0xCdXN5Qnl0ZXMsIHBMb2FkLT5EdXJhdGlvbiwgQ0NBQnVzeUZyYWN0aW9uKSk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJGcmFtZVJlcG9ydExlbiAlZFxuIiwgcEFkLT5TdGFDZmcuRnJhbWVSZXBvcnRMZW4pKTsKKwlwQWQtPlN0YUNmZy5GcmFtZVJlcG9ydExlbiArPSAoc2l6ZW9mKE1FQVNVUkVNRU5UX1JFUE9SVF9FTEVNRU5UKSArIHNpemVvZihDSEFOTkVMX0xPQURfUkVQT1JUKSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiRnJhbWVSZXBvcnRMZW4gJWRcbiIsIHBBZC0+U3RhQ2ZnLkZyYW1lUmVwb3J0TGVuKSk7CisKKwkvLyA0LiBDbGVhciBjaGFubmVsIGxvYWQgbWVhc3VyZW1lbnQgZmxhZworCVJUTVBfQ0xFQVJfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkFESU9fTUVBU1VSRU1FTlQpOworCisJLy8gNS4gcmVzZXQgdG8gaWRsZSBzdGF0ZQorCXBBZC0+TWxtZS5BaXJvbmV0TWFjaGluZS5DdXJyU3RhdGUgPSBBSVJPTkVUX0lETEU7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDaGFubmVsTG9hZFJlcG9ydEFjdGlvbiA8LS0tLS1cbiIpKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisKKwlBcmd1bWVudHM6CisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECU5vaXNlSGlzdFJlcG9ydEFjdGlvbigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVQ0hBUgkJCUluZGV4KQoreworCVBNRUFTVVJFTUVOVF9SRVBPUlRfRUxFTUVOVAlwUmVwb3J0OworCVBOT0lTRV9ISVNUX1JFUE9SVAkJCXBOb2lzZTsKKwlQVUNIQVIJCQkJCQlwRGVzdDsKKwlVQ0hBUgkJCQkJCWksTm9pc2VDbnQ7CisJVVNIT1JUCQkJCQkJVG90YWxSUElDbnQsIFRvdGFsUlBJU3VtOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTm9pc2VIaXN0UmVwb3J0QWN0aW9uIC0tLS0tPlxuIikpOworCisJLy8gMC4gRGlzYWJsZSBSeCB3aXRoIHByb21pc2N1b3VzIHJlY2VwdGlvbiwgbWFrZSBpdCBiYWNrIHRvIG5vcm1hbAorCVJUTVBfSU9fV1JJVEUzMihwQWQsIFJYX0ZJTFRSX0NGRywgU1RBTk9STUFMKTsgLy8gU3RhaW9uIG5vdCBkcm9wIGNvbnRyb2wgZnJhbWUgd2lsbCBmYWlsIFdpRmkgQ2VydGlmaWNhdGlvbi4KKwkvLyAxLiBTZXR1cCBwb2ludGVyIGZvciBwcm9jZXNzaW5nIGJlYWNvbiAmIHByb2JlIHJlc3BvbnNlCisJcERlc3QgPSAoUFVDSEFSKSAmcEFkLT5TdGFDZmcuRnJhbWVSZXBvcnRCdWZbcEFkLT5TdGFDZmcuRnJhbWVSZXBvcnRMZW5dOworCXBSZXBvcnQgPSAoUE1FQVNVUkVNRU5UX1JFUE9SVF9FTEVNRU5UKSBwRGVzdDsKKworCS8vIDIuIEZpbGwgTWVhc3VyZW1lbnQgcmVwb3J0IGVsZW1lbnQgZmllbGQuCisJcFJlcG9ydC0+RWlkICAgID0gSUVfTUVBU1VSRU1FTlRfUkVQT1JUOworCS8vIEZpeGVkIExlbmd0aCBhdCAxNiwgbm90IGluY2x1ZGUgRWlkIGFuZCBsZW5ndGggZmllbGRzCisJcFJlcG9ydC0+TGVuZ3RoID0gMTY7CisJcFJlcG9ydC0+VG9rZW4gID0gcEFkLT5TdGFDZmcuTWVhc3VyZW1lbnRSZXF1ZXN0W0luZGV4XS5SZXFFbGVtLlRva2VuOworCXBSZXBvcnQtPk1vZGUgICA9IHBBZC0+U3RhQ2ZnLk1lYXN1cmVtZW50UmVxdWVzdFtJbmRleF0uUmVxRWxlbS5Nb2RlOworCXBSZXBvcnQtPlR5cGUgICA9IE1TUk5fVFlQRV9OT0lTRV9ISVNUX1JFUTsKKworCS8vIDMuIEZpbGwgbm9pc2UgaGlzdG9ncmFtIHJlcG9ydCBtZWFzdXJlbWVudCBkYXRhCisJcERlc3QgKz0gc2l6ZW9mKE1FQVNVUkVNRU5UX1JFUE9SVF9FTEVNRU5UKTsKKwlwTm9pc2UgID0gKFBOT0lTRV9ISVNUX1JFUE9SVCkgcERlc3Q7CisJcE5vaXNlLT5DaGFubmVsICA9IHBBZC0+U3RhQ2ZnLk1lYXN1cmVtZW50UmVxdWVzdFtJbmRleF0uTWVhc3VyZW1lbnQuQ2hhbm5lbDsKKwlwTm9pc2UtPlNwYXJlICAgID0gMDsKKwlwTm9pc2UtPkR1cmF0aW9uID0gcEFkLT5TdGFDZmcuTWVhc3VyZW1lbnRSZXF1ZXN0W0luZGV4XS5NZWFzdXJlbWVudC5EdXJhdGlvbjsKKwkvLyA0LiBGaWxsIE5vaXNlIGhpc3RvZ3JhbSwgdGhlIHRvdGFsIFJQSSBjb3VudHMgc2hvdWxkIGJlIDAuNCAqIFRVCisJLy8gICAgV2UgZXN0aW1hdGUgNDAwMCBub3JtYWwgcGFja2V0cyByZWNlaXZlZCBkdXJuaW5nIDEwIHNlY29uZHMgdGVzdC4KKwkvLyAgICBBZGp1c3QgaXQgaWYgcmVxdWlyZWQuCisJLy8gMyBpcyBhIGdvb2QgdmFsdWUgZm9yIHBBZC0+U3RhQ2ZnLk5IRmFjdG9yCisJLy8gVG90YWxSUElDbnQgPSBwTm9pc2UtPkR1cmF0aW9uICogMyAvIDEwOworCVRvdGFsUlBJQ250ID0gcE5vaXNlLT5EdXJhdGlvbiAqIHBBZC0+U3RhQ2ZnLk5IRmFjdG9yIC8gMTA7CisJVG90YWxSUElTdW0gPSAwOworCisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKwl7CisJCVRvdGFsUlBJU3VtICs9IHBBZC0+U3RhQ2ZnLlJQSURlbnNpdHlbaV07CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJQSSAlZCBDb251dHMgJWRcbiIsIGksIHBBZC0+U3RhQ2ZnLlJQSURlbnNpdHlbaV0pKTsKKwl9CisKKwkvLyBEb3VibGUgY2hlY2sgaWYgdGhlIGNvdW50ZXIgaXMgbGFyZ2VyIHRoYW4gb3VyIGV4cGVjdGF0aW9uLgorCS8vIFdlIHdpbGwgcmVwbGFjZSBpdCB3aXRoIHRoZSB0b3RhbCBudW1iZXIgcGx1cyBhIGZyYWN0aW9uLgorCWlmIChUb3RhbFJQSVN1bSA+IFRvdGFsUlBJQ250KQorCQlUb3RhbFJQSUNudCA9IFRvdGFsUlBJU3VtICsgcE5vaXNlLT5EdXJhdGlvbiAvIDIwOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiVG90YWwgUlBJIENvbnV0cyAlZFxuIiwgVG90YWxSUElDbnQpKTsKKworCS8vIDUuIEluaXRpYWxpemUgbm9pc2UgY291bnQgZm9yIHRoZSB0b3RhbCBzdW1tYXRpb24gb2YgMHhmZgorCU5vaXNlQ250ID0gMDsKKwlmb3IgKGkgPSAxOyBpIDwgODsgaSsrKQorCXsKKwkJcE5vaXNlLT5EZW5zaXR5W2ldID0gKFVDSEFSKSAocEFkLT5TdGFDZmcuUlBJRGVuc2l0eVtpXSAqIDI1NSAvIFRvdGFsUlBJQ250KTsKKwkJaWYgKChwTm9pc2UtPkRlbnNpdHlbaV0gPT0gMCkgJiYgKHBBZC0+U3RhQ2ZnLlJQSURlbnNpdHlbaV0gIT0gMCkpCisJCQlwTm9pc2UtPkRlbnNpdHlbaV0rKzsKKwkJTm9pc2VDbnQgKz0gcE5vaXNlLT5EZW5zaXR5W2ldOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSZXBvcnRlZCBSUElbJWRdICA9IDB4JTAyeFxuIiwgaSwgcE5vaXNlLT5EZW5zaXR5W2ldKSk7CisJfQorCisJLy8gNi4gUlBJWzBdIHJlcHJlc2VudHMgdGhlIHJlc3Qgb2YgY291bnRzCisJcE5vaXNlLT5EZW5zaXR5WzBdID0gMHhmZiAtIE5vaXNlQ250OworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJlcG9ydGVkIFJQSVswXSAgPSAweCUwMnhcbiIsIHBOb2lzZS0+RGVuc2l0eVswXSkpOworCisJcEFkLT5TdGFDZmcuRnJhbWVSZXBvcnRMZW4gKz0gKHNpemVvZihNRUFTVVJFTUVOVF9SRVBPUlRfRUxFTUVOVCkgKyBzaXplb2YoTk9JU0VfSElTVF9SRVBPUlQpKTsKKworCS8vIDcuIENsZWFyIGNoYW5uZWwgbG9hZCBtZWFzdXJlbWVudCBmbGFnCisJUlRNUF9DTEVBUl9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SQURJT19NRUFTVVJFTUVOVCk7CisKKwkvLyA4LiByZXNldCB0byBpZGxlIHN0YXRlCisJcEFkLT5NbG1lLkFpcm9uZXRNYWNoaW5lLkN1cnJTdGF0ZSA9IEFJUk9ORVRfSURMRTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk5vaXNlSGlzdFJlcG9ydEFjdGlvbiA8LS0tLS1cbiIpKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVByZXBhcmUgQmVhY29uIHJlcG9ydCBhY3Rpb24sCisKKwlBcmd1bWVudHM6CisJCXBBZAlQb2ludGVyCXRvIG91ciBhZGFwdGVyCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECUJlYWNvblJlcG9ydEFjdGlvbigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVQ0hBUgkJCUluZGV4KQoreworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkJlYWNvblJlcG9ydEFjdGlvbiAtLS0tLT5cbiIpKTsKKworCS8vIExvb2tzIGxpa2Ugd2UgZG9uJ3QgaGF2ZSBhbnl0aGluZyB0aGluZyBuZWVkIHRvIGRvIGhlcmUuCisJLy8gQWxsIG1lYXN1cmVtZW50IHJlcG9ydCBhbHJlYWR5IGZpbmlzaGVkIGluIEFkZEJlYWNvblJlcG9ydAorCS8vIFRoZSBsZW5ndGggaXMgaW4gdGhlIEZyYW1lUmVwb3J0TGVuCisKKwkvLyByZXNldCBCZWFjb24gaW5kZXggZm9yIG5leHQgYmVhY29uIHJlcXVlc3QKKwlwQWQtPlN0YUNmZy5MYXN0QnNzSW5kZXggPSAweGZmOworCisJLy8gcmVzZXQgdG8gaWRsZSBzdGF0ZQorCXBBZC0+TWxtZS5BaXJvbmV0TWFjaGluZS5DdXJyU3RhdGUgPSBBSVJPTkVUX0lETEU7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJCZWFjb25SZXBvcnRBY3Rpb24gPC0tLS0tXG4iKSk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCisJQXJndW1lbnRzOgorCQlJbmRleAkJQ3VycmVudCBCU1NJRCBpbiBDQ1hCc3N0YWIgZW50cnkgaW5kZXgKKworCVJldHVybiBWYWx1ZToKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECUFpcm9uZXRBZGRCZWFjb25SZXBvcnQoCisJSU4JUFJUTVBfQURBUFRFUgkJcEFkLAorCUlOCVVMT05HCQkJCUluZGV4LAorCUlOCVBNTE1FX1FVRVVFX0VMRU0JcEVsZW0pCit7CisJUFZPSUQJCQkJCQlwTXNnOworCVBVQ0hBUgkJCQkJCXBTcmMsIHBEZXN0OworCVVDSEFSCQkJCQkJUmVxSWR4OworCVVMT05HCQkJCQkJTXNnTGVuOworCVVTSE9SVAkJCQkJCUxlbmd0aDsKKwlQRlJBTUVfODAyXzExCQkJCXBGcmFtZTsKKwlQTUVBU1VSRU1FTlRfUkVQT1JUX0VMRU1FTlQJcFJlcG9ydDsKKwlQRUlEX1NUUlVDVAkJCSAgICAgICAgcEVpZDsKKwlQQkVBQ09OX1JFUE9SVAkJCQlwQmVhY29uUmVwb3J0OworCVBCU1NfRU5UUlkJCQkJCXBCc3M7CisKKwkvLyAwLiBTZXR1cCBwb2ludGVyIGZvciBwcm9jZXNzaW5nIGJlYWNvbiAmIHByb2JlIHJlc3BvbnNlCisJcE1zZyAgID0gcEVsZW0tPk1zZzsKKwlNc2dMZW4gPSBwRWxlbS0+TXNnTGVuOworCXBGcmFtZSA9IChQRlJBTUVfODAyXzExKSBwTXNnOworCXBTcmMgICA9IHBGcmFtZS0+T2N0ZXQ7CQkJCS8vIFN0YXJ0IGZyb20gQVAgVFNGCisJcEJzcyAgID0gKFBCU1NfRU5UUlkpICZwQWQtPlN0YUNmZy5DQ1hCc3NUYWIuQnNzRW50cnlbSW5kZXhdOworCVJlcUlkeCA9IHBBZC0+U3RhQ2ZnLkN1cnJlbnRSTVJlcUlkeDsKKworCS8vIDEgQ2hlY2sgdGhlIEluZGV4LCBpZiB3ZSBhbHJlYWR5IGNyZWF0ZSB0aGlzIGVudHJ5LCBvbmx5IHVwZGF0ZSB0aGUgYXZlcmFnZSBSU1NJCisJaWYgKChJbmRleCA8PSBwQWQtPlN0YUNmZy5MYXN0QnNzSW5kZXgpICYmIChwQWQtPlN0YUNmZy5MYXN0QnNzSW5kZXggIT0gMHhmZikpCisJeworCQlwRGVzdCAgPSAoUFVDSEFSKSAmcEFkLT5TdGFDZmcuRnJhbWVSZXBvcnRCdWZbcEFkLT5TdGFDZmcuQnNzUmVwb3J0T2Zmc2V0W0luZGV4XV07CisJCS8vIFBvaW50IHRvIGJzcyByZXBvcnQgaW5mb3JtYXRpb24KKwkJcERlc3QgKz0gc2l6ZW9mKE1FQVNVUkVNRU5UX1JFUE9SVF9FTEVNRU5UKTsKKwkJcEJlYWNvblJlcG9ydCA9IChQQkVBQ09OX1JFUE9SVCkgcERlc3Q7CisKKwkJLy8gVXBkYXRlIFJ4IHBvd2VyLCBpbiBkQm0KKwkJLy8gR2V0IHRoZSBvcmlnaW5hbCBSU1NJIHJlYWRiYWNrIGZyb20gQkJQCisJCXBCZWFjb25SZXBvcnQtPlJ4UG93ZXIgKz0gcEFkLT5CYnBSc3NpVG9EYm1EZWx0YTsKKwkJLy8gQXZlcmFnZSB0aGUgUnNzaSByZWFkaW5nCisJCXBCZWFjb25SZXBvcnQtPlJ4UG93ZXIgID0gKHBCZWFjb25SZXBvcnQtPlJ4UG93ZXIgKyBwQnNzLT5Sc3NpKSAvIDI7CisJCS8vIEdldCB0byBkQm0gZm9ybWF0CisJCXBCZWFjb25SZXBvcnQtPlJ4UG93ZXIgLT0gcEFkLT5CYnBSc3NpVG9EYm1EZWx0YTsKKworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJCc3NpZCAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCAiLAorCQkJcEJzcy0+QnNzaWRbMF0sIHBCc3MtPkJzc2lkWzFdLCBwQnNzLT5Cc3NpZFsyXSwKKwkJCXBCc3MtPkJzc2lkWzNdLCBwQnNzLT5Cc3NpZFs0XSwgcEJzcy0+QnNzaWRbNV0pKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUnhQb3dlclslbGRdIFJzc2kgJWQsIEF2ZyBSc3NpICVkXG4iLCBJbmRleCwgKHBCc3MtPlJzc2kgLSBwQWQtPkJicFJzc2lUb0RibURlbHRhKSwgcEJlYWNvblJlcG9ydC0+UnhQb3dlciAtIDI1NikpOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJGcmFtZVJlcG9ydExlbiA9ICVkXG4iLCBwQWQtPlN0YUNmZy5Cc3NSZXBvcnRPZmZzZXRbSW5kZXhdKSk7CisKKwkJLy8gVXBkYXRlIG90aGVyIGluZm9ybWF0aW9uIGhlcmUKKworCQkvLyBEb25lCisJCXJldHVybjsKKwl9CisKKwkvLyAyLiBVcGRhdGUgcmVwb3J0ZWQgSW5kZXgKKwlwQWQtPlN0YUNmZy5MYXN0QnNzSW5kZXggPSBJbmRleDsKKworCS8vIDMuIFNldHVwIHRoZSBidWZmZXIgYWRkcmVzcyBmb3IgY29weWluZyB0aGlzIEJTU0lEIGludG8gcmVwb3J0aW5nIGZyYW1lCisJLy8gICAgVGhlIG9mZnNldCBzaG91bGQgc3RhcnQgYWZ0ZXIgODAyLjExIGhlYWRlciBhbmQgcmVwb3J0IGZyYW1lIGhlYWRlci4KKwlwRGVzdCA9IChQVUNIQVIpICZwQWQtPlN0YUNmZy5GcmFtZVJlcG9ydEJ1ZltwQWQtPlN0YUNmZy5GcmFtZVJlcG9ydExlbl07CisKKwkvLyA0LiBTYXZlIHRoZSBzdGFydCBvZmZzZXQgb2YgZWFjaCBCc3MgaW4gcmVwb3J0IGZyYW1lCisJcEFkLT5TdGFDZmcuQnNzUmVwb3J0T2Zmc2V0W0luZGV4XSA9IHBBZC0+U3RhQ2ZnLkZyYW1lUmVwb3J0TGVuOworCisJLy8gNS4gRmlsbCBNZWFzdXJlbWVudCByZXBvcnQgZmllbGRzCisJcFJlcG9ydCA9IChQTUVBU1VSRU1FTlRfUkVQT1JUX0VMRU1FTlQpIHBEZXN0OworCXBSZXBvcnQtPkVpZCA9IElFX01FQVNVUkVNRU5UX1JFUE9SVDsKKwlwUmVwb3J0LT5MZW5ndGggPSAwOworCXBSZXBvcnQtPlRva2VuICA9IHBBZC0+U3RhQ2ZnLk1lYXN1cmVtZW50UmVxdWVzdFtSZXFJZHhdLlJlcUVsZW0uVG9rZW47CisJcFJlcG9ydC0+TW9kZSAgID0gcEFkLT5TdGFDZmcuTWVhc3VyZW1lbnRSZXF1ZXN0W1JlcUlkeF0uUmVxRWxlbS5Nb2RlOworCXBSZXBvcnQtPlR5cGUgICA9IE1TUk5fVFlQRV9CRUFDT05fUkVROworCUxlbmd0aCAgICAgICAgICA9IHNpemVvZihNRUFTVVJFTUVOVF9SRVBPUlRfRUxFTUVOVCk7CisJcERlc3QgICAgICAgICAgKz0gc2l6ZW9mKE1FQVNVUkVNRU5UX1JFUE9SVF9FTEVNRU5UKTsKKworCS8vIDYuIFN0YXJ0IHRoZWJlYWNvbiByZXBvcnQgZm9ybWF0CisJcEJlYWNvblJlcG9ydCA9IChQQkVBQ09OX1JFUE9SVCkgcERlc3Q7CisJcERlc3QgICAgICAgICs9IHNpemVvZihCRUFDT05fUkVQT1JUKTsKKwlMZW5ndGggICAgICAgKz0gc2l6ZW9mKEJFQUNPTl9SRVBPUlQpOworCisJLy8gNy4gQ29weSBDaGFubmVsIG51bWJlcgorCXBCZWFjb25SZXBvcnQtPkNoYW5uZWwgICAgICAgID0gcEJzcy0+Q2hhbm5lbDsKKwlwQmVhY29uUmVwb3J0LT5TcGFyZSAgICAgICAgICA9IDA7CisJcEJlYWNvblJlcG9ydC0+RHVyYXRpb24gICAgICAgPSBwQWQtPlN0YUNmZy5NZWFzdXJlbWVudFJlcXVlc3RbUmVxSWR4XS5NZWFzdXJlbWVudC5EdXJhdGlvbjsKKwlwQmVhY29uUmVwb3J0LT5QaHlUeXBlICAgICAgICA9ICgocEJzcy0+U3VwUmF0ZUxlbitwQnNzLT5FeHRSYXRlTGVuID4gNCkgPyBQSFlfRVJQIDogUEhZX0RTUyk7CisJLy8gOC4gUnggcG93ZXIsIGluIGRCbQorCXBCZWFjb25SZXBvcnQtPlJ4UG93ZXIgICAgICAgID0gcEJzcy0+UnNzaSAtIHBBZC0+QmJwUnNzaVRvRGJtRGVsdGE7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJCc3NpZCAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCAiLAorCQlwQnNzLT5Cc3NpZFswXSwgcEJzcy0+QnNzaWRbMV0sIHBCc3MtPkJzc2lkWzJdLAorCQlwQnNzLT5Cc3NpZFszXSwgcEJzcy0+QnNzaWRbNF0sIHBCc3MtPkJzc2lkWzVdKSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUnhQb3dlclslbGRdLCBSc3NpICVkXG4iLCBJbmRleCwgcEJlYWNvblJlcG9ydC0+UnhQb3dlciAtIDI1NikpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkZyYW1lUmVwb3J0TGVuID0gJWRcbiIsIHBBZC0+U3RhQ2ZnLkZyYW1lUmVwb3J0TGVuKSk7CisKKwlwQmVhY29uUmVwb3J0LT5CZWFjb25JbnRlcnZhbCA9IHBCc3MtPkJlYWNvblBlcmlvZDsKKwlDT1BZX01BQ19BRERSKHBCZWFjb25SZXBvcnQtPkJTU0lELCBwRnJhbWUtPkhkci5BZGRyMyk7CisJTmRpc01vdmVNZW1vcnkocEJlYWNvblJlcG9ydC0+UGFyZW50VFNGLCBwU3JjLCA0KTsKKwlOZGlzTW92ZU1lbW9yeShwQmVhY29uUmVwb3J0LT5UYXJnZXRUU0YsICZwRWxlbS0+VGltZVN0YW1wLnUuTG93UGFydCwgNCk7CisJTmRpc01vdmVNZW1vcnkoJnBCZWFjb25SZXBvcnQtPlRhcmdldFRTRls0XSwgJnBFbGVtLT5UaW1lU3RhbXAudS5IaWdoUGFydCwgNCk7CisKKwkvLyA5LiBTa2lwIHRoZSBiZWFjb24gZnJhbWUgYW5kIG9mZnNldCB0byBzdGFydCBvZiBjYXBhYmlsaXR5aW5mbyBzaW5jZSB3ZSBhbHJlYWR5IHByb2Nlc3NlZCBjYXBhYmlsaXR5aW5mbworCXBTcmMgKz0gKFRJTUVTVEFNUF9MRU4gKyAyKTsKKwlwQmVhY29uUmVwb3J0LT5DYXBhYmlsaXR5SW5mbyA9ICooVVNIT1JUICopcFNyYzsKKworCS8vIDEwLiBQb2ludCB0byBzdGFydCBvZiBlbGVtZW50IElECisJcFNyYyArPSAyOworCXBFaWQgPSAoUEVJRF9TVFJVQ1QpIHBTcmM7CisKKwkvLyAxMS4gU3RhcnQgcHJvY2VzcyBhbGwgdmFyaWFibGUgRWlkIG9heWxvYWQgYW5kIGFkZCB0aGUgYXBwcm9wcmlhdGUgdG8gdGhlIGZyYW1lIHJlcG9ydAorCXdoaWxlICgoKFBVQ0hBUikgcEVpZCArIHBFaWQtPkxlbiArIDEpIDwgKChQVUNIQVIpIHBGcmFtZSArIE1zZ0xlbikpCisJeworCQkvLyBPbmx5IGxpbWl0ZWQgRUlEIGFyZSByZXF1aXJlZCB0byByZXBvcnQgZm9yIENDWCAyLiBJdCBpbmNsdWRlcyBTU0lELCBTdXBwb3J0ZWQgcmF0ZSwKKwkJLy8gRkggcGFyYW1lbnRlciBzZXQsIERTIHBhcmFtZXRlciBzZXQsIENGIHBhcmFtZXRlciBzZXQsIElCU1MgcGFyYW1ldGVyIHNldCwKKwkJLy8gVElNIChyZXBvcnQgZmlyc3QgNCBieXRlcyBvbmx5LCByYWRpbyBtZWFzdXJlbWVudCBjYXBhYmlsaXR5CisJCXN3aXRjaCAocEVpZC0+RWlkKQorCQl7CisJCQljYXNlIElFX1NTSUQ6CisJCQljYXNlIElFX1NVUFBfUkFURVM6CisJCQljYXNlIElFX0ZIX1BBUk06CisJCQljYXNlIElFX0RTX1BBUk06CisJCQljYXNlIElFX0NGX1BBUk06CisJCQljYXNlIElFX0lCU1NfUEFSTToKKwkJCQlOZGlzTW92ZU1lbW9yeShwRGVzdCwgcEVpZCwgcEVpZC0+TGVuICsgMik7CisJCQkJcERlc3QgICs9IChwRWlkLT5MZW4gKyAyKTsKKwkJCQlMZW5ndGggKz0gKHBFaWQtPkxlbiArIDIpOworCQkJCWJyZWFrOworCisJCQljYXNlIElFX01FQVNVUkVNRU5UX0NBUEFCSUxJVFk6CisJCQkJLy8gU2luY2UgdGhpcyBJRSBpcyBkdXBsaWNhdGVkIHdpdGggV1BBIHNlY3VyaXR5IElFLCB3ZSBoYXMgdG8gZG8gc2FuaXR5IGNoZWNrIGJlZm9yZQorCQkJCS8vIHJlY29nbml6ZSBpdC4KKwkJCQkvLyAxLiBJdCBhbHNvIGhhcyBmaXhlZCA2IGJ5dGVzIElFIGxlbmd0aC4KKwkJCQlpZiAocEVpZC0+TGVuICE9IDYpCisJCQkJCWJyZWFrOworCQkJCS8vIDIuIENoZWNrIHRoZSBDaXNjbyBBaXJvbmV0IE9VSQorCQkJCWlmIChOZGlzRXF1YWxNZW1vcnkoQ0lTQ09fT1VJLCAocFNyYyArIDIpLCAzKSkKKwkJCQl7CisJCQkJCS8vIE1hdGNoZWQsIHRoaXMgaXMgd2hhdCB3ZSB3YW50CisJCQkJCU5kaXNNb3ZlTWVtb3J5KHBEZXN0LCBwRWlkLCBwRWlkLT5MZW4gKyAyKTsKKwkJCQkJcERlc3QgICs9IChwRWlkLT5MZW4gKyAyKTsKKwkJCQkJTGVuZ3RoICs9IChwRWlkLT5MZW4gKyAyKTsKKwkJCQl9CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgSUVfVElNOgorCQkJCWlmIChwRWlkLT5MZW4gPiA0KQorCQkJCXsKKwkJCQkJLy8gTWF5IHRydW5jYXRlIGFuZCByZXBvcnQgdGhlIGZpcnN0IDQgYnl0ZXMgb25seSwgd2l0aCB0aGUgZWlkICYgbGVuLCB0b3RhbCBzaG91bGQgYmUgNgorCQkJCQlOZGlzTW92ZU1lbW9yeShwRGVzdCwgcEVpZCwgNik7CisJCQkJCXBEZXN0ICArPSA2OworCQkJCQlMZW5ndGggKz0gNjsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJTmRpc01vdmVNZW1vcnkocERlc3QsIHBFaWQsIHBFaWQtPkxlbiArIDIpOworCQkJCQlwRGVzdCAgKz0gKHBFaWQtPkxlbiArIDIpOworCQkJCQlMZW5ndGggKz0gKHBFaWQtPkxlbiArIDIpOworCQkJCX0KKwkJCQlicmVhazsKKworCQkJZGVmYXVsdDoKKwkJCQlicmVhazsKKwkJfQorCQkvLyAxMi4gTW92ZSB0byBuZXh0IGVsZW1lbnQgSUQKKwkJcFNyYyArPSAoMiArIHBFaWQtPkxlbik7CisJCXBFaWQgPSAoUEVJRF9TVFJVQ1QpIHBTcmM7CisJfQorCisJLy8gMTMuIFVwZGF0ZSB0aGUgbGVuZ3RoIGluIHRoZSBoZWFkZXIsIG5vdCBpbmNsdWRlIEVJRCBhbmQgbGVuZ3RoCisJcFJlcG9ydC0+TGVuZ3RoID0gTGVuZ3RoIC0gNDsKKworCS8vIDE0LiBVcGRhdGUgdGhlIGZyYW1lIHJlcG9ydCBidWZmZXIgZGF0YSBsZW5ndGgKKwlwQWQtPlN0YUNmZy5GcmFtZVJlcG9ydExlbiArPSBMZW5ndGg7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiRlIgbGVuID0gJWRcbiIsIHBBZC0+U3RhQ2ZnLkZyYW1lUmVwb3J0TGVuKSk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCisJQXJndW1lbnRzOgorCQlJbmRleAkJQ3VycmVudCBCU1NJRCBpbiBDQ1hCc3N0YWIgZW50cnkgaW5kZXgKKworCVJldHVybiBWYWx1ZToKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECUFpcm9uZXRDcmVhdGVCZWFjb25SZXBvcnRGcm9tQnNzVGFibGUoCisJSU4JUFJUTVBfQURBUFRFUgkJcEFkKQoreworCVBNRUFTVVJFTUVOVF9SRVBPUlRfRUxFTUVOVAlwUmVwb3J0OworCVBCRUFDT05fUkVQT1JUCQkJCXBCZWFjb25SZXBvcnQ7CisJVUNIQVIJCQkJCQlJbmRleCwgUmVxSWR4OworCVVTSE9SVAkJCQkJCUxlbmd0aDsKKwlQVUNIQVIJCQkJCQlwRGVzdDsKKwlQQlNTX0VOVFJZCQkJCQlwQnNzOworCisJLy8gMC4gc2V0dXAgYmFzZSBwb2ludGVyCisJUmVxSWR4ID0gcEFkLT5TdGFDZmcuQ3VycmVudFJNUmVxSWR4OworCisJZm9yIChJbmRleCA9IDA7IEluZGV4IDwgcEFkLT5TdGFDZmcuQ0NYQnNzVGFiLkJzc05yOyBJbmRleCsrKQorCXsKKwkJLy8gMS4gU2V0dXAgdGhlIGJ1ZmZlciBhZGRyZXNzIGZvciBjb3B5aW5nIHRoaXMgQlNTSUQgaW50byByZXBvcnRpbmcgZnJhbWUKKwkJLy8gICAgVGhlIG9mZnNldCBzaG91bGQgc3RhcnQgYWZ0ZXIgODAyLjExIGhlYWRlciBhbmQgcmVwb3J0IGZyYW1lIGhlYWRlci4KKwkJcERlc3QgID0gKFBVQ0hBUikgJnBBZC0+U3RhQ2ZnLkZyYW1lUmVwb3J0QnVmW3BBZC0+U3RhQ2ZnLkZyYW1lUmVwb3J0TGVuXTsKKwkJcEJzcyAgID0gKFBCU1NfRU5UUlkpICZwQWQtPlN0YUNmZy5DQ1hCc3NUYWIuQnNzRW50cnlbSW5kZXhdOworCQlMZW5ndGggPSAwOworCisJCS8vIDIuIEZpbGwgTWVhc3VyZW1lbnQgcmVwb3J0IGZpZWxkcworCQlwUmVwb3J0ICAgICAgICAgPSAoUE1FQVNVUkVNRU5UX1JFUE9SVF9FTEVNRU5UKSBwRGVzdDsKKwkJcFJlcG9ydC0+RWlkICAgID0gSUVfTUVBU1VSRU1FTlRfUkVQT1JUOworCQlwUmVwb3J0LT5MZW5ndGggPSAwOworCQlwUmVwb3J0LT5Ub2tlbiAgPSBwQWQtPlN0YUNmZy5NZWFzdXJlbWVudFJlcXVlc3RbUmVxSWR4XS5SZXFFbGVtLlRva2VuOworCQlwUmVwb3J0LT5Nb2RlICAgPSBwQWQtPlN0YUNmZy5NZWFzdXJlbWVudFJlcXVlc3RbUmVxSWR4XS5SZXFFbGVtLk1vZGU7CisJCXBSZXBvcnQtPlR5cGUgICA9IE1TUk5fVFlQRV9CRUFDT05fUkVROworCQlMZW5ndGggICAgICAgICAgPSBzaXplb2YoTUVBU1VSRU1FTlRfUkVQT1JUX0VMRU1FTlQpOworCQlwRGVzdCAgICAgICAgICArPSBzaXplb2YoTUVBU1VSRU1FTlRfUkVQT1JUX0VMRU1FTlQpOworCisJCS8vIDMuIFN0YXJ0IHRoZSBiZWFjb24gcmVwb3J0IGZvcm1hdAorCQlwQmVhY29uUmVwb3J0ID0gKFBCRUFDT05fUkVQT1JUKSBwRGVzdDsKKwkJcERlc3QgICAgICAgICs9IHNpemVvZihCRUFDT05fUkVQT1JUKTsKKwkJTGVuZ3RoICAgICAgICs9IHNpemVvZihCRUFDT05fUkVQT1JUKTsKKworCQkvLyA0LiBDb3B5IENoYW5uZWwgbnVtYmVyCisJCXBCZWFjb25SZXBvcnQtPkNoYW5uZWwgICAgICAgID0gcEJzcy0+Q2hhbm5lbDsKKwkJcEJlYWNvblJlcG9ydC0+U3BhcmUgICAgICAgICAgPSAwOworCQlwQmVhY29uUmVwb3J0LT5EdXJhdGlvbiAgICAgICA9IHBBZC0+U3RhQ2ZnLk1lYXN1cmVtZW50UmVxdWVzdFtSZXFJZHhdLk1lYXN1cmVtZW50LkR1cmF0aW9uOworCQlwQmVhY29uUmVwb3J0LT5QaHlUeXBlICAgICAgICA9ICgocEJzcy0+U3VwUmF0ZUxlbitwQnNzLT5FeHRSYXRlTGVuID4gNCkgPyBQSFlfRVJQIDogUEhZX0RTUyk7CisJCXBCZWFjb25SZXBvcnQtPlJ4UG93ZXIgICAgICAgID0gcEJzcy0+UnNzaSAtIHBBZC0+QmJwUnNzaVRvRGJtRGVsdGE7CisJCXBCZWFjb25SZXBvcnQtPkJlYWNvbkludGVydmFsID0gcEJzcy0+QmVhY29uUGVyaW9kOworCQlwQmVhY29uUmVwb3J0LT5DYXBhYmlsaXR5SW5mbyA9IHBCc3MtPkNhcGFiaWxpdHlJbmZvOworCQlDT1BZX01BQ19BRERSKHBCZWFjb25SZXBvcnQtPkJTU0lELCBwQnNzLT5Cc3NpZCk7CisJCU5kaXNNb3ZlTWVtb3J5KHBCZWFjb25SZXBvcnQtPlBhcmVudFRTRiwgcEJzcy0+UFRTRiwgNCk7CisJCU5kaXNNb3ZlTWVtb3J5KHBCZWFjb25SZXBvcnQtPlRhcmdldFRTRiwgcEJzcy0+VFRTRiwgOCk7CisKKwkJLy8gNS4gQ3JlYXRlIFNTSUQKKwkJKnBEZXN0KysgPSAweDAwOworCQkqcERlc3QrKyA9IHBCc3MtPlNzaWRMZW47CisJCU5kaXNNb3ZlTWVtb3J5KHBEZXN0LCBwQnNzLT5Tc2lkLCBwQnNzLT5Tc2lkTGVuKTsKKwkJcERlc3QgICs9IHBCc3MtPlNzaWRMZW47CisJCUxlbmd0aCArPSAoMiArIHBCc3MtPlNzaWRMZW4pOworCisJCS8vIDYuIENyZWF0ZSBTdXBwb3J0UmF0ZXMKKwkJKnBEZXN0KysgPSAweDAxOworCQkqcERlc3QrKyA9IHBCc3MtPlN1cFJhdGVMZW47CisJCU5kaXNNb3ZlTWVtb3J5KHBEZXN0LCBwQnNzLT5TdXBSYXRlLCBwQnNzLT5TdXBSYXRlTGVuKTsKKwkJcERlc3QgICs9IHBCc3MtPlN1cFJhdGVMZW47CisJCUxlbmd0aCArPSAoMiArIHBCc3MtPlN1cFJhdGVMZW4pOworCisJCS8vIDcuIERTIFBhcmFtZXRlcgorCQkqcERlc3QrKyA9IDB4MDM7CisJCSpwRGVzdCsrID0gMTsKKwkJKnBEZXN0KysgPSBwQnNzLT5DaGFubmVsOworCQlMZW5ndGggICs9IDM7CisKKwkJLy8gOC4gSUJTUyBwYXJhbWV0ZXIgaWYgcHJlc2VudHMKKwkJaWYgKHBCc3MtPkJzc1R5cGUgPT0gQlNTX0FESE9DKQorCQl7CisJCQkqcERlc3QrKyA9IDB4MDY7CisJCQkqcERlc3QrKyA9IDI7CisJCQkqKFBVU0hPUlQpIHBEZXN0ID0gcEJzcy0+QXRpbVdpbjsKKwkJCXBEZXN0ICAgKz0gMjsKKwkJCUxlbmd0aCAgKz0gNDsKKwkJfQorCisJCS8vIDkuIFVwZGF0ZSBsZW5ndGggZmllbGQsIG5vdCBpbmNsdWRlIEVJRCBhbmQgbGVuZ3RoCisJCXBSZXBvcnQtPkxlbmd0aCA9IExlbmd0aCAtIDQ7CisKKwkJLy8gMTAuIFVwZGF0ZSB0b3RhbCBmcmFtZSBzaXplCisJCXBBZC0+U3RhQ2ZnLkZyYW1lUmVwb3J0TGVuICs9IExlbmd0aDsKKwl9Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3N0YS9hc3NvYy5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9zdGEvYXNzb2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzZkYWI1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9zdGEvYXNzb2MuYwpAQCAtMCwwICsxLDIwMzkgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJTW9kdWxlIE5hbWU6CisJYXNzb2MuYworCisJQWJzdHJhY3Q6CisKKwlSZXZpc2lvbiBIaXN0b3J5OgorCVdobwkJCVdoZW4JCQlXaGF0CisJLS0tLS0tLS0JLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCUpvaG4JCTIwMDQtOS0zCQlwb3J0aW5nIGZyb20gUlQyNTAwCisqLworI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgorCitVQ0hBUglDaXBoZXJXcGFUZW1wbGF0ZVtdID0geworCQkweGRkLCAJCQkJCS8vIFdQQSBJRQorCQkweDE2LAkJCQkJLy8gTGVuZ3RoCisJCTB4MDAsIDB4NTAsIDB4ZjIsIDB4MDEsCS8vIG91aQorCQkweDAxLCAweDAwLAkJCQkvLyBWZXJzaW9uCisJCTB4MDAsIDB4NTAsIDB4ZjIsIDB4MDIsCS8vIE11bHRpY2FzdAorCQkweDAxLCAweDAwLAkJCQkvLyBOdW1iZXIgb2YgdW5pY2FzdAorCQkweDAwLCAweDUwLCAweGYyLCAweDAyLAkvLyB1bmljYXN0CisJCTB4MDEsIDB4MDAsCQkJCS8vIG51bWJlciBvZiBhdXRoZW50aWNhdGlvbiBtZXRob2QKKwkJMHgwMCwgMHg1MCwgMHhmMiwgMHgwMQkvLyBhdXRoZW50aWNhdGlvbgorCQl9OworCitVQ0hBUglDaXBoZXJXcGEyVGVtcGxhdGVbXSA9IHsKKwkJMHgzMCwJCQkJCS8vIFJTTiBJRQorCQkweDE0LAkJCQkJLy8gTGVuZ3RoCisJCTB4MDEsIDB4MDAsCQkJCS8vIFZlcnNpb24KKwkJMHgwMCwgMHgwZiwgMHhhYywgMHgwMiwJLy8gZ3JvdXAgY2lwaGVyLCBUS0lQCisJCTB4MDEsIDB4MDAsCQkJCS8vIG51bWJlciBvZiBwYWlyd2lzZQorCQkweDAwLCAweDBmLCAweGFjLCAweDAyLAkvLyB1bmljYXN0CisJCTB4MDEsIDB4MDAsCQkJCS8vIG51bWJlciBvZiBhdXRoZW50aWNhdGlvbiBtZXRob2QKKwkJMHgwMCwgMHgwZiwgMHhhYywgMHgwMiwJLy8gYXV0aGVudGljYXRpb24KKwkJMHgwMCwgMHgwMCwJCQkJLy8gUlNOIGNhcGFiaWxpdHkKKwkJfTsKKworVUNIQVIJQ2N4MkllSW5mb1tdID0geyAweDAwLCAweDQwLCAweDk2LCAweDAzLCAweDAyfTsKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlhc3NvY2lhdGlvbiBzdGF0ZSBtYWNoaW5lIGluaXQsIGluY2x1ZGluZyBzdGF0ZSB0cmFuc2l0aW9uIGFuZCB0aW1lciBpbml0CisJUGFyYW1ldGVyczoKKwkJUyAtIHBvaW50ZXIgdG8gdGhlIGFzc29jaWF0aW9uIHN0YXRlIG1hY2hpbmUKKworCUlSUUwgPSBQQVNTSVZFX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIEFzc29jU3RhdGVNYWNoaW5lSW5pdCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiAgU1RBVEVfTUFDSElORSAqUywKKwlPVVQgU1RBVEVfTUFDSElORV9GVU5DIFRyYW5zW10pCit7CisJU3RhdGVNYWNoaW5lSW5pdChTLCBUcmFucywgTUFYX0FTU09DX1NUQVRFLCBNQVhfQVNTT0NfTVNHLCAoU1RBVEVfTUFDSElORV9GVU5DKURyb3AsIEFTU09DX0lETEUsIEFTU09DX01BQ0hJTkVfQkFTRSk7CisKKwkvLyBmaXJzdCBjb2x1bW4KKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQVNTT0NfSURMRSwgTVQyX01MTUVfQVNTT0NfUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKU1sbWVBc3NvY1JlcUFjdGlvbik7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFTU09DX0lETEUsIE1UMl9NTE1FX1JFQVNTT0NfUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKU1sbWVSZWFzc29jUmVxQWN0aW9uKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQVNTT0NfSURMRSwgTVQyX01MTUVfRElTQVNTT0NfUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKU1sbWVEaXNhc3NvY1JlcUFjdGlvbik7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFTU09DX0lETEUsIE1UMl9QRUVSX0RJU0FTU09DX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyRGlzYXNzb2NBY3Rpb24pOworCisJLy8gc2Vjb25kIGNvbHVtbgorCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBU1NPQ19XQUlUX1JTUCwgTVQyX01MTUVfQVNTT0NfUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKUludmFsaWRTdGF0ZVdoZW5Bc3NvYyk7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFTU09DX1dBSVRfUlNQLCBNVDJfTUxNRV9SRUFTU09DX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylJbnZhbGlkU3RhdGVXaGVuUmVhc3NvYyk7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFTU09DX1dBSVRfUlNQLCBNVDJfTUxNRV9ESVNBU1NPQ19SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpSW52YWxpZFN0YXRlV2hlbkRpc2Fzc29jaWF0ZSk7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFTU09DX1dBSVRfUlNQLCBNVDJfUEVFUl9ESVNBU1NPQ19SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpUGVlckRpc2Fzc29jQWN0aW9uKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQVNTT0NfV0FJVF9SU1AsIE1UMl9QRUVSX0FTU09DX1JTUCwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyQXNzb2NSc3BBY3Rpb24pOworCS8vCisJLy8gUGF0Y2ggM0NvbSBBUCBNT2RlOjNDUldFNDU0RzcyCisJLy8gV2Ugc2VuZCBBc3NvYyByZXF1ZXN0IGZyYW1lIHRvIHRoaXMgQVAsIGl0IGFsd2F5cyBzZW5kIFJlYXNzb2MgUnNwIG5vdCBBc3NvY2lhdGUgUnNwLgorCS8vCisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFTU09DX1dBSVRfUlNQLCBNVDJfUEVFUl9SRUFTU09DX1JTUCwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyQXNzb2NSc3BBY3Rpb24pOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBU1NPQ19XQUlUX1JTUCwgTVQyX0FTU09DX1RJTUVPVVQsIChTVEFURV9NQUNISU5FX0ZVTkMpQXNzb2NUaW1lb3V0QWN0aW9uKTsKKworCS8vIHRoaXJkIGNvbHVtbgorCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBSRUFTU09DX1dBSVRfUlNQLCBNVDJfTUxNRV9BU1NPQ19SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpSW52YWxpZFN0YXRlV2hlbkFzc29jKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgUkVBU1NPQ19XQUlUX1JTUCwgTVQyX01MTUVfUkVBU1NPQ19SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpSW52YWxpZFN0YXRlV2hlblJlYXNzb2MpOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBSRUFTU09DX1dBSVRfUlNQLCBNVDJfTUxNRV9ESVNBU1NPQ19SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpSW52YWxpZFN0YXRlV2hlbkRpc2Fzc29jaWF0ZSk7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIFJFQVNTT0NfV0FJVF9SU1AsIE1UMl9QRUVSX0RJU0FTU09DX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyRGlzYXNzb2NBY3Rpb24pOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBSRUFTU09DX1dBSVRfUlNQLCBNVDJfUEVFUl9SRUFTU09DX1JTUCwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyUmVhc3NvY1JzcEFjdGlvbik7CisJLy8KKwkvLyBQYXRjaCwgQVAgZG9lc24ndCBzZW5kIFJlYXNzb2NpYXRlIFJzcCBmcmFtZSB0byBTdGF0aW9uLgorCS8vCisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIFJFQVNTT0NfV0FJVF9SU1AsIE1UMl9QRUVSX0FTU09DX1JTUCwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyUmVhc3NvY1JzcEFjdGlvbik7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIFJFQVNTT0NfV0FJVF9SU1AsIE1UMl9SRUFTU09DX1RJTUVPVVQsIChTVEFURV9NQUNISU5FX0ZVTkMpUmVhc3NvY1RpbWVvdXRBY3Rpb24pOworCisJLy8gZm91cnRoIGNvbHVtbgorCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBESVNBU1NPQ19XQUlUX1JTUCwgTVQyX01MTUVfQVNTT0NfUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKUludmFsaWRTdGF0ZVdoZW5Bc3NvYyk7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIERJU0FTU09DX1dBSVRfUlNQLCBNVDJfTUxNRV9SRUFTU09DX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylJbnZhbGlkU3RhdGVXaGVuUmVhc3NvYyk7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIERJU0FTU09DX1dBSVRfUlNQLCBNVDJfTUxNRV9ESVNBU1NPQ19SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpSW52YWxpZFN0YXRlV2hlbkRpc2Fzc29jaWF0ZSk7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIERJU0FTU09DX1dBSVRfUlNQLCBNVDJfUEVFUl9ESVNBU1NPQ19SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpUGVlckRpc2Fzc29jQWN0aW9uKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgRElTQVNTT0NfV0FJVF9SU1AsIE1UMl9ESVNBU1NPQ19USU1FT1VULCAoU1RBVEVfTUFDSElORV9GVU5DKURpc2Fzc29jVGltZW91dEFjdGlvbik7CisKKwkvLyBpbml0aWFsaXplIHRoZSB0aW1lcgorCVJUTVBJbml0VGltZXIocEFkLCAmcEFkLT5NbG1lQXV4LkFzc29jVGltZXIsIEdFVF9USU1FUl9GVU5DVElPTihBc3NvY1RpbWVvdXQpLCBwQWQsIEZBTFNFKTsKKwlSVE1QSW5pdFRpbWVyKHBBZCwgJnBBZC0+TWxtZUF1eC5SZWFzc29jVGltZXIsIEdFVF9USU1FUl9GVU5DVElPTihSZWFzc29jVGltZW91dCksIHBBZCwgRkFMU0UpOworCVJUTVBJbml0VGltZXIocEFkLCAmcEFkLT5NbG1lQXV4LkRpc2Fzc29jVGltZXIsIEdFVF9USU1FUl9GVU5DVElPTihEaXNhc3NvY1RpbWVvdXQpLCBwQWQsIEZBTFNFKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlBc3NvY2lhdGlvbiB0aW1lb3V0IHByb2NlZHVyZS4gQWZ0ZXIgYXNzb2NpYXRpb24gdGltZW91dCwgdGhpcyBmdW5jdGlvbgorCQl3aWxsIGJlIGNhbGxlZCBhbmQgaXQgd2lsbCBwdXQgYSBtZXNzYWdlIGludG8gdGhlIE1MTUUgcXVldWUKKwlQYXJhbWV0ZXJzOgorCQlTdGFuZGFyZCB0aW1lciBwYXJhbWV0ZXJzCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgQXNzb2NUaW1lb3V0KElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKKwkJCQkgSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAorCQkJCSBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisJCQkJIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMykKK3sKKwlSVE1QX0FEQVBURVIgKnBBZCA9IChSVE1QX0FEQVBURVIgKilGdW5jdGlvbkNvbnRleHQ7CisKKwkvLyBEbyBub3RoaW5nIGlmIHRoZSBkcml2ZXIgaXMgc3RhcnRpbmcgaGFsdCBzdGF0ZS4KKwkvLyBUaGlzIG1pZ2h0IGhhcHBlbiB3aGVuIHRpbWVyIGFscmVhZHkgYmVlbiBmaXJlZCBiZWZvcmUgY2FuY2VsIHRpbWVyIHdpdGggbWxtZWhhbHQKKwlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKQorCQlyZXR1cm47CisKKwlNbG1lRW5xdWV1ZShwQWQsIEFTU09DX1NUQVRFX01BQ0hJTkUsIE1UMl9BU1NPQ19USU1FT1VULCAwLCBOVUxMKTsKKwlSVDI4WFhfTUxNRV9IQU5ETEVSKHBBZCk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJUmVhc3NvY2lhdGlvbiB0aW1lb3V0IHByb2NlZHVyZS4gQWZ0ZXIgcmVhc3NvY2lhdGlvbiB0aW1lb3V0LCB0aGlzCisJCWZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIGFuZCBwdXQgYSBtZXNzYWdlIGludG8gdGhlIE1MTUUgcXVldWUKKwlQYXJhbWV0ZXJzOgorCQlTdGFuZGFyZCB0aW1lciBwYXJhbWV0ZXJzCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgUmVhc3NvY1RpbWVvdXQoSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorCQkJCQlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCisJCQkJCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKKwkJCQkJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKQoreworCVJUTVBfQURBUFRFUiAqcEFkID0gKFJUTVBfQURBUFRFUiAqKUZ1bmN0aW9uQ29udGV4dDsKKworCS8vIERvIG5vdGhpbmcgaWYgdGhlIGRyaXZlciBpcyBzdGFydGluZyBoYWx0IHN0YXRlLgorCS8vIFRoaXMgbWlnaHQgaGFwcGVuIHdoZW4gdGltZXIgYWxyZWFkeSBiZWVuIGZpcmVkIGJlZm9yZSBjYW5jZWwgdGltZXIgd2l0aCBtbG1laGFsdAorCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyB8IGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpCisJCXJldHVybjsKKworCU1sbWVFbnF1ZXVlKHBBZCwgQVNTT0NfU1RBVEVfTUFDSElORSwgTVQyX1JFQVNTT0NfVElNRU9VVCwgMCwgTlVMTCk7CisJUlQyOFhYX01MTUVfSEFORExFUihwQWQpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCURpc2Fzc29jaWF0aW9uIHRpbWVvdXQgcHJvY2VkdXJlLiBBZnRlciBkaXNhc3NvY2lhdGlvbiB0aW1lb3V0LCB0aGlzCisJCWZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIGFuZCBwdXQgYSBtZXNzYWdlIGludG8gdGhlIE1MTUUgcXVldWUKKwlQYXJhbWV0ZXJzOgorCQlTdGFuZGFyZCB0aW1lciBwYXJhbWV0ZXJzCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgRGlzYXNzb2NUaW1lb3V0KElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKKwkJCQkJSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAorCQkJCQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisJCQkJCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMykKK3sKKwlSVE1QX0FEQVBURVIgKnBBZCA9IChSVE1QX0FEQVBURVIgKilGdW5jdGlvbkNvbnRleHQ7CisKKwkvLyBEbyBub3RoaW5nIGlmIHRoZSBkcml2ZXIgaXMgc3RhcnRpbmcgaGFsdCBzdGF0ZS4KKwkvLyBUaGlzIG1pZ2h0IGhhcHBlbiB3aGVuIHRpbWVyIGFscmVhZHkgYmVlbiBmaXJlZCBiZWZvcmUgY2FuY2VsIHRpbWVyIHdpdGggbWxtZWhhbHQKKwlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKQorCQlyZXR1cm47CisKKwlNbG1lRW5xdWV1ZShwQWQsIEFTU09DX1NUQVRFX01BQ0hJTkUsIE1UMl9ESVNBU1NPQ19USU1FT1VULCAwLCBOVUxMKTsKKwlSVDI4WFhfTUxNRV9IQU5ETEVSKHBBZCk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJbWxtZSBhc3NvYyByZXEgaGFuZGxpbmcgcHJvY2VkdXJlCisJUGFyYW1ldGVyczoKKwkJQWRhcHRlciAtIEFkYXB0ZXIgcG9pbnRlcgorCQlFbGVtIC0gTUxNRSBRdWV1ZSBFbGVtZW50CisJUHJlOgorCQl0aGUgc3RhdGlvbiBoYXMgYmVlbiBhdXRoZW50aWNhdGVkIGFuZCB0aGUgZm9sbG93aW5nIGluZm9ybWF0aW9uIGlzIHN0b3JlZCBpbiB0aGUgY29uZmlnCisJCQktIyBTU0lECisJCQktIyBzdXBwb3J0ZWQgcmF0ZXMgYW5kIHRoZWlyIGxlbmd0aAorCQkJLSMgbGlzdGVuIGludGVydmFsIChBZGFwdGVyLT5TdGFDZmcuZGVmYXVsdF9saXN0ZW5fY291bnQpCisJCQktIyBUcmFuc21pdCBwb3dlciAgKEFkYXB0ZXItPlN0YUNmZy50eF9wb3dlcikKKwlQb3N0ICA6CisJCS0jIEFuIGFzc29jaWF0aW9uIHJlcXVlc3QgZnJhbWUgaXMgZ2VuZXJhdGVkIGFuZCBzZW50IHRvIHRoZSBhaXIKKwkJLSMgQXNzb2NpYXRpb24gdGltZXIgc3RhcnRzCisJCS0jIEFzc29jaWF0aW9uIHN0YXRlIC0+IEFTU09DX1dBSVRfUlNQCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgTWxtZUFzc29jUmVxQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlVQ0hBUgkJCUFwQWRkcls2XTsKKwlIRUFERVJfODAyXzExCUFzc29jSGRyOworCVVDSEFSCQkJQ2N4MkxlbiA9IDU7CisJVUNIQVIJCQlXbWVJZVs5XSA9IHtJRV9WRU5ET1JfU1BFQ0lGSUMsIDB4MDcsIDB4MDAsIDB4NTAsIDB4ZjIsIDB4MDIsIDB4MDAsIDB4MDEsIDB4MDB9OworCVVTSE9SVAkJCUxpc3RlbkludHY7CisJVUxPTkcJCQlUaW1lb3V0OworCVVTSE9SVAkJCUNhcGFiaWxpdHlJbmZvOworCUJPT0xFQU4JCQlUaW1lckNhbmNlbGxlZDsKKwlQVUNIQVIJCQlwT3V0QnVmZmVyID0gTlVMTDsKKwlORElTX1NUQVRVUwkJTlN0YXR1czsKKwlVTE9ORwkJCUZyYW1lTGVuID0gMDsKKwlVTE9ORwkJCXRtcDsKKwlVU0hPUlQJCQlWYXJJZXNPZmZzZXQ7CisJVUNIQVIJCQlDa2lwRmxhZzsKKwlVQ0hBUgkJCUNraXBOZWdvdGlhdGlvbkJ1ZmZlcltDS0lQX05FR09USUFUSU9OX0xFTkdUSF07CisJVUNIQVIJCQlBaXJvbmV0Q2tpcEllID0gSUVfQUlST05FVF9DS0lQOworCVVDSEFSCQkJQWlyb25ldENraXBMZW4gPSBDS0lQX05FR09USUFUSU9OX0xFTkdUSDsKKwlVQ0hBUgkJCUFpcm9uZXRJUEFkZHJlc3NJRSA9IElFX0FJUk9ORVRfSVBBRERSRVNTOworCVVDSEFSCQkJQWlyb25ldElQQWRkcmVzc0xlbiA9IEFJUk9ORVRfSVBBRERSRVNTX0xFTkdUSDsKKwlVQ0hBUgkJCUFpcm9uZXRJUEFkZHJlc3NCdWZmZXJbQUlST05FVF9JUEFERFJFU1NfTEVOR1RIXSA9IHsweDAwLCAweDQwLCAweDk2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAyLCAweDAwfTsKKwlVU0hPUlQJCQlTdGF0dXM7CisKKwkvLyBCbG9jayBhbGwgYXV0aGVudGljYXRpb24gcmVxdWVzdCBkdXJuaW5nIFdQQSBibG9jayBwZXJpb2QKKwlpZiAocEFkLT5TdGFDZmcuYkJsb2NrQXNzb2MgPT0gVFJVRSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFTU09DIC0gQmxvY2sgQXNzb2MgcmVxdWVzdCBkdXJuaW5nIFdQQSBibG9jayBwZXJpb2QhXG4iKSk7CisJCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlID0gQVNTT0NfSURMRTsKKwkJU3RhdHVzID0gTUxNRV9TVEFURV9NQUNISU5FX1JFSkVDVDsKKwkJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX0FTU09DX0NPTkYsIDIsICZTdGF0dXMpOworCX0KKwkvLyBjaGVjayBzYW5pdHkgZmlyc3QKKwllbHNlIGlmIChNbG1lQXNzb2NSZXFTYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbiwgQXBBZGRyLCAmQ2FwYWJpbGl0eUluZm8sICZUaW1lb3V0LCAmTGlzdGVuSW50dikpCisJeworCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5Bc3NvY1RpbWVyLCAmVGltZXJDYW5jZWxsZWQpOworCQlDT1BZX01BQ19BRERSKHBBZC0+TWxtZUF1eC5Cc3NpZCwgQXBBZGRyKTsKKworCQkvLyBHZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQorCQlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOworCQlpZiAoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCQl7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkFTU09DIC0gTWxtZUFzc29jUmVxQWN0aW9uKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxlZCBcbiIpKTsKKwkJCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlID0gQVNTT0NfSURMRTsKKwkJCVN0YXR1cyA9IE1MTUVfRkFJTF9OT19SRVNPVVJDRTsKKwkJCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9BU1NPQ19DT05GLCAyLCAmU3RhdHVzKTsKKwkJCXJldHVybjsKKwkJfQorCisJCS8vIEFkZCBieSBKYW1lcyAwMy8wNi8yNworCQlwQWQtPlN0YUNmZy5Bc3NvY0luZm8uTGVuZ3RoID0gc2l6ZW9mKE5ESVNfODAyXzExX0FTU09DSUFUSU9OX0lORk9STUFUSU9OKTsKKwkJLy8gQXNzb2NpYXRpb24gZG9uJ3QgbmVlZCB0byByZXBvcnQgTUFDIGFkZHJlc3MKKwkJcEFkLT5TdGFDZmcuQXNzb2NJbmZvLkF2YWlsYWJsZVJlcXVlc3RGaXhlZElFcyA9CisJCQlORElTXzgwMl8xMV9BSV9SRVFGSV9DQVBBQklMSVRJRVMgfCBORElTXzgwMl8xMV9BSV9SRVFGSV9MSVNURU5JTlRFUlZBTDsKKwkJcEFkLT5TdGFDZmcuQXNzb2NJbmZvLlJlcXVlc3RGaXhlZElFcy5DYXBhYmlsaXRpZXMgPSBDYXBhYmlsaXR5SW5mbzsKKwkJcEFkLT5TdGFDZmcuQXNzb2NJbmZvLlJlcXVlc3RGaXhlZElFcy5MaXN0ZW5JbnRlcnZhbCA9IExpc3RlbkludHY7CisJCS8vIE9ubHkgcmVhc3NvY2lhdGUgbmVlZCB0aGlzCisJCS8vQ09QWV9NQUNfQUREUihwQWQtPlN0YUNmZy5Bc3NvY0luZm8uUmVxdWVzdEZpeGVkSUVzLkN1cnJlbnRBUEFkZHJlc3MsIEFwQWRkcik7CisJCXBBZC0+U3RhQ2ZnLkFzc29jSW5mby5PZmZzZXRSZXF1ZXN0SUVzID0gc2l6ZW9mKE5ESVNfODAyXzExX0FTU09DSUFUSU9OX0lORk9STUFUSU9OKTsKKworICAgICAgICBOZGlzWmVyb01lbW9yeShwQWQtPlN0YUNmZy5SZXFWYXJJRXMsIE1BWF9WSUVfTEVOKTsKKwkJLy8gRmlyc3QgYWRkIFNTSUQKKwkJVmFySWVzT2Zmc2V0ID0gMDsKKwkJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuUmVxVmFySUVzICsgVmFySWVzT2Zmc2V0LCAmU3NpZEllLCAxKTsKKwkJVmFySWVzT2Zmc2V0ICs9IDE7CisJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLlJlcVZhcklFcyArIFZhckllc09mZnNldCwgJnBBZC0+TWxtZUF1eC5Tc2lkTGVuLCAxKTsKKwkJVmFySWVzT2Zmc2V0ICs9IDE7CisJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLlJlcVZhcklFcyArIFZhckllc09mZnNldCwgcEFkLT5NbG1lQXV4LlNzaWQsIHBBZC0+TWxtZUF1eC5Tc2lkTGVuKTsKKwkJVmFySWVzT2Zmc2V0ICs9IHBBZC0+TWxtZUF1eC5Tc2lkTGVuOworCisJCS8vIFNlY29uZCBhZGQgU3VwcG9ydGVkIHJhdGVzCisJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLlJlcVZhcklFcyArIFZhckllc09mZnNldCwgJlN1cFJhdGVJZSwgMSk7CisJCVZhckllc09mZnNldCArPSAxOworCQlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5SZXFWYXJJRXMgKyBWYXJJZXNPZmZzZXQsICZwQWQtPk1sbWVBdXguU3VwUmF0ZUxlbiwgMSk7CisJCVZhckllc09mZnNldCArPSAxOworCQlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5SZXFWYXJJRXMgKyBWYXJJZXNPZmZzZXQsIHBBZC0+TWxtZUF1eC5TdXBSYXRlLCBwQWQtPk1sbWVBdXguU3VwUmF0ZUxlbik7CisJCVZhckllc09mZnNldCArPSBwQWQtPk1sbWVBdXguU3VwUmF0ZUxlbjsKKwkJLy8gRW5kIEFkZCBieSBKYW1lcworCisgICAgICAgIGlmICgocEFkLT5Db21tb25DZmcuQ2hhbm5lbCA+IDE0KSAmJgorICAgICAgICAgICAgKHBBZC0+Q29tbW9uQ2ZnLmJJRUVFODAyMTFIID09IFRSVUUpKQorICAgICAgICAgICAgQ2FwYWJpbGl0eUluZm8gfD0gMHgwMTAwOworCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFTU09DIC0gU2VuZCBBU1NPQyByZXF1ZXN0Li4uXG4iKSk7CisJCU1ndE1hY0hlYWRlckluaXQocEFkLCAmQXNzb2NIZHIsIFNVQlRZUEVfQVNTT0NfUkVRLCAwLCBBcEFkZHIsIEFwQWRkcik7CisKKwkJLy8gQnVpbGQgYmFzaWMgZnJhbWUgZmlyc3QKKwkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwJCQkJJkZyYW1lTGVuLAorCQkJCQkJICBzaXplb2YoSEVBREVSXzgwMl8xMSksCSZBc3NvY0hkciwKKwkJCQkJCSAgMiwJCQkJCQkmQ2FwYWJpbGl0eUluZm8sCisJCQkJCQkgIDIsCQkJCQkJJkxpc3RlbkludHYsCisJCQkJCQkgIDEsCQkJCQkJJlNzaWRJZSwKKwkJCQkJCSAgMSwJCQkJCQkmcEFkLT5NbG1lQXV4LlNzaWRMZW4sCisJCQkJCQkgIHBBZC0+TWxtZUF1eC5Tc2lkTGVuLCAJcEFkLT5NbG1lQXV4LlNzaWQsCisJCQkJCQkgIDEsCQkJCQkJJlN1cFJhdGVJZSwKKwkJCQkJCSAgMSwJCQkJCQkmcEFkLT5NbG1lQXV4LlN1cFJhdGVMZW4sCisJCQkJCQkgIHBBZC0+TWxtZUF1eC5TdXBSYXRlTGVuLCAgcEFkLT5NbG1lQXV4LlN1cFJhdGUsCisJCQkJCQkgIEVORF9PRl9BUkdTKTsKKworCQlpZiAocEFkLT5NbG1lQXV4LkV4dFJhdGVMZW4gIT0gMCkKKwkJeworCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAgICAmdG1wLAorCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAmRXh0UmF0ZUllLAorCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAmcEFkLT5NbG1lQXV4LkV4dFJhdGVMZW4sCisJCQkJCQkJICBwQWQtPk1sbWVBdXguRXh0UmF0ZUxlbiwgIHBBZC0+TWxtZUF1eC5FeHRSYXRlLAorCQkJCQkJCSAgRU5EX09GX0FSR1MpOworCQkJRnJhbWVMZW4gKz0gdG1wOworCQl9CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJLy8gSFQKKwkJaWYgKChwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5TGVuID4gMCkgJiYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCkpCisJCXsKKwkJCVVMT05HIFRtcExlbjsKKwkJCVVDSEFSIEh0TGVuOworCQkJVUNIQVIgQlJPQURDT01bNF0gPSB7MHgwLCAweDkwLCAweDRjLCAweDMzfTsKKwkJCWlmIChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLmJQcmVOSHQgPT0gVFJVRSkKKwkJCXsKKwkJCQlIdExlbiA9IFNJWkVfSFRfQ0FQX0lFICsgNDsKKwkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sICAgICAgICAgICAgJlRtcExlbiwKKwkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmV3BhSWUsCisJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkh0TGVuLAorCQkJCQkJCSAgNCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZCUk9BRENPTVswXSwKKwkJCQkJCQkgcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eUxlbiwgICAgICAgICAgJnBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHksCisJCQkJCQkJICBFTkRfT0ZfQVJHUyk7CisJCQl9CisJCQllbHNlCisJCQl7CisjaWZkZWYgUlRfQklHX0VORElBTgorCQkgICAgICAgIEhUX0NBUEFCSUxJVFlfSUUgSHRDYXBhYmlsaXR5VG1wOworI2VuZGlmCisKKyNpZm5kZWYgUlRfQklHX0VORElBTgorCQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwgICAgICAgICAgICAmVG1wTGVuLAorCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZIdENhcEllLAorCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5TGVuLAorCQkJCQkJCSBwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5TGVuLCAgICAgICAgICAmcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eSwKKwkJCQkJCQkgIEVORF9PRl9BUkdTKTsKKyNlbHNlCisgICAgICAgICAgICAgICAgTmRpc1plcm9NZW1vcnkoJkh0Q2FwYWJpbGl0eVRtcCwgc2l6ZW9mKEhUX0NBUEFCSUxJVFlfSUUpKTsKKyAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeSgmSHRDYXBhYmlsaXR5VG1wLCAmcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eSwgcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eUxlbik7CisgICAgICAgIAkJKihVU0hPUlQgKikoJkh0Q2FwYWJpbGl0eVRtcC5IdENhcEluZm8pID0gU1dBUDE2KCooVVNIT1JUICopKCZIdENhcGFiaWxpdHlUbXAuSHRDYXBJbmZvKSk7CisgICAgICAgIAkJKihVU0hPUlQgKikoJkh0Q2FwYWJpbGl0eVRtcC5FeHRIdENhcEluZm8pID0gU1dBUDE2KCooVVNIT1JUICopKCZIdENhcGFiaWxpdHlUbXAuRXh0SHRDYXBJbmZvKSk7CisKKyAgICAgICAgCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sICAgICAgICAgJlRtcExlbiwKKyAgICAgICAgCQkJCQkJCTEsICAgICAgICAgICAgICAgICAgICAgICAgICAgJkh0Q2FwSWUsCisgICAgICAgIAkJCQkJCQkxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5TGVuLAorICAgICAgICAJCQkJCQkJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eUxlbiwmSHRDYXBhYmlsaXR5VG1wLAorICAgICAgICAJCQkJCQkJRU5EX09GX0FSR1MpOworI2VuZGlmCisJCQl9CisJCQlGcmFtZUxlbiArPSBUbXBMZW47CisJCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCQkvLyBhZGQgUmFsaW5rIHByb3ByaWV0YXJ5IElFIHRvIGluZm9ybSBBUCB0aGlzIFNUQSBpcyBnb2luZyB0byB1c2UgQUdHUkVHQVRJT04gb3IgUElHR1ktQkFDSytBR0dSRUdBVElPTgorCQkvLyBDYXNlIEk6IChBZ2dyZWdhdGlvbiArIFBpZ2d5LUJhY2spCisJCS8vIDEuIHVzZXIgZW5hYmxlIGFnZ3JlZ2F0aW9uLCBBTkQKKwkJLy8gMi4gTWFjIHN1cHBvcnQgcGlnZ3ktYmFjaworCQkvLyAzLiBBUCBhbm5vdWNlcyBpdCdzIFBJR0dZLUJBQ0srQUdHUkVHQVRJT04tY2FwYWJsZSBpbiBCRUFDT04KKwkJLy8gQ2FzZSBJSTogKEFnZ3JlZ2F0aW9uKQorCQkvLyAxLiB1c2VyIGVuYWJsZSBhZ2dyZWdhdGlvbiwgQU5ECisJCS8vIDIuIEFQIGFubm91Y2VzIGl0J3MgQUdHUkVHQVRJT04tY2FwYWJsZSBpbiBCRUFDT04KKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJBZ2dyZWdhdGlvbkNhcGFibGUpCisJCXsKKwkJCWlmICgocEFkLT5Db21tb25DZmcuYlBpZ2d5QmFja0NhcGFibGUpICYmICgocEFkLT5NbG1lQXV4LkFQUmFsaW5rSWUgJiAweDAwMDAwMDAzKSA9PSAzKSkKKwkJCXsKKwkJCQlVTE9ORyBUbXBMZW47CisJCQkJVUNIQVIgUmFsaW5rSWVbOV0gPSB7SUVfVkVORE9SX1NQRUNJRklDLCA3LCAweDAwLCAweDBjLCAweDQzLCAweDAzLCAweDAwLCAweDAwLCAweDAwfTsKKwkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyK0ZyYW1lTGVuLCAgICAgICAgICAgJlRtcExlbiwKKwkJCQkJCQkJICA5LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmFsaW5rSWUsCisJCQkJCQkJCSAgRU5EX09GX0FSR1MpOworCQkJCUZyYW1lTGVuICs9IFRtcExlbjsKKwkJCX0KKwkJCWVsc2UgaWYgKHBBZC0+TWxtZUF1eC5BUFJhbGlua0llICYgMHgwMDAwMDAwMSkKKwkJCXsKKwkJCQlVTE9ORyBUbXBMZW47CisJCQkJVUNIQVIgUmFsaW5rSWVbOV0gPSB7SUVfVkVORE9SX1NQRUNJRklDLCA3LCAweDAwLCAweDBjLCAweDQzLCAweDAxLCAweDAwLCAweDAwLCAweDAwfTsKKwkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyK0ZyYW1lTGVuLCAgICAgICAgICAgJlRtcExlbiwKKwkJCQkJCQkJICA5LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmFsaW5rSWUsCisJCQkJCQkJCSAgRU5EX09GX0FSR1MpOworCQkJCUZyYW1lTGVuICs9IFRtcExlbjsKKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCVVMT05HIFRtcExlbjsKKwkJCVVDSEFSIFJhbGlua0llWzldID0ge0lFX1ZFTkRPUl9TUEVDSUZJQywgNywgMHgwMCwgMHgwYywgMHg0MywgMHgwNiwgMHgwMCwgMHgwMCwgMHgwMH07CisJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyK0ZyYW1lTGVuLAkJICZUbXBMZW4sCisJCQkJCQkJICA5LAkJCQkJCSBSYWxpbmtJZSwKKwkJCQkJCQkgIEVORF9PRl9BUkdTKTsKKwkJCUZyYW1lTGVuICs9IFRtcExlbjsKKwkJfQorCisJCWlmIChwQWQtPk1sbWVBdXguQVBFZGNhUGFybS5iVmFsaWQpCisJCXsKKwkJCWlmIChwQWQtPkNvbW1vbkNmZy5iQVBTRENhcGFibGUgJiYgcEFkLT5NbG1lQXV4LkFQRWRjYVBhcm0uYkFQU0RDYXBhYmxlKQorCQkJeworCQkJCVFCU1NfU1RBX0lORk9fUEFSTSBRb3NJbmZvOworCisJCQkJTmRpc1plcm9NZW1vcnkoJlFvc0luZm8sIHNpemVvZihRQlNTX1NUQV9JTkZPX1BBUk0pKTsKKwkJCQlRb3NJbmZvLlVBUFNEX0FDX0JFID0gcEFkLT5Db21tb25DZmcuYkFQU0RBQ19CRTsKKwkJCQlRb3NJbmZvLlVBUFNEX0FDX0JLID0gcEFkLT5Db21tb25DZmcuYkFQU0RBQ19CSzsKKwkJCQlRb3NJbmZvLlVBUFNEX0FDX1ZJID0gcEFkLT5Db21tb25DZmcuYkFQU0RBQ19WSTsKKwkJCQlRb3NJbmZvLlVBUFNEX0FDX1ZPID0gcEFkLT5Db21tb25DZmcuYkFQU0RBQ19WTzsKKwkJCQlRb3NJbmZvLk1heFNQTGVuZ3RoID0gcEFkLT5Db21tb25DZmcuTWF4U1BMZW5ndGg7CisJCQkJV21lSWVbOF0gfD0gKihQVUNIQVIpJlFvc0luZm87CisJCQl9CisJCQllbHNlCisJCQl7CisgICAgICAgICAgICAgICAgLy8gVGhlIFBhcmFtZXRlciBTZXQgQ291bnQgaXMgc2V0IHRvIKGnMKGoIGluIHRoZSBhc3NvY2lhdGlvbiByZXF1ZXN0IGZyYW1lcworICAgICAgICAgICAgICAgIC8vIFdtZUllWzhdIHw9IChwQWQtPk1sbWVBdXguQVBFZGNhUGFybS5FZGNhVXBkYXRlQ291bnQgJiAweDBmKTsKKwkJCX0KKworCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAgICAmdG1wLAorCQkJCQkJCSAgOSwgICAgICAgICAgICAgICAgICAgICAgICAmV21lSWVbMF0sCisJCQkJCQkJICBFTkRfT0ZfQVJHUyk7CisJCQlGcmFtZUxlbiArPSB0bXA7CisJCX0KKworCQkvLworCQkvLyBMZXQgV1BBKCMyMjEpIEVsZW1lbnQgSUQgb24gdGhlIGVuZCBvZiB0aGlzIGFzc29jaWF0aW9uIGZyYW1lLgorCQkvLyBPdGhlcndpc2Ugc29tZSBBUCB3aWxsIGZhaWwgb24gcGFyc2luZyBFbGVtZW50IElEIGFuZCBzZXQgc3RhdHVzIGZhaWwgb24gQXNzb2MgUnNwLgorCQkvLyBGb3IgZXhhbXBsZTogUHV0IFZlbmRvciBTcGVjaWZpYyBJRSBvbiB0aGUgZnJvbnQgb2YgV1BBIElFLgorCQkvLyBUaGlzIGhhcHBlbnMgb24gQVAgKE1vZGVsIE5vOkxpbmtzeXMgV1JLNTRHKQorCQkvLworCQlpZiAoKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spIHx8CisgICAgICAgICAgICAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykgfHwKKyAgICAgICAgICAgIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpIHx8CisgICAgICAgICAgICAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikKKwkJCSkKKyAgICAgICAgICAgICkKKwkJeworCQkJVUNIQVIgUlNOSWUgPSBJRV9XUEE7CisKKwkJCWlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykgfHwKKyAgICAgICAgICAgICAgICAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikpCisJCQl7CisJCQkJUlNOSWUgPSBJRV9XUEEyOworCQkJfQorCisgICAgICAgICAgICAJUlRNUE1ha2VSU05JRShwQWQsIHBBZC0+U3RhQ2ZnLkF1dGhNb2RlLCBwQWQtPlN0YUNmZy5XZXBTdGF0dXMsIEJTUzApOworCisgICAgICAgICAgICAvLyBDaGVjayBmb3IgV1BBIFBNSyBjYWNoZSBsaXN0CisJCQlpZiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikKKwkJCXsKKwkJCSAgICBJTlQgICAgIGlkeDsKKyAgICAgICAgICAgICAgICBCT09MRUFOIEZvdW5kUE1LID0gRkFMU0U7CisJCQkJLy8gU2VhcmNoIGNoY2hlZCBQTUtJRCwgYXBwZW5kIGl0IGlmIGV4aXN0ZWQKKwkJCQlmb3IgKGlkeCA9IDA7IGlkeCA8IFBNS0lEX05POyBpZHgrKykKKwkJCQl7CisJCQkJCWlmIChOZGlzRXF1YWxNZW1vcnkoQXBBZGRyLCAmcEFkLT5TdGFDZmcuU2F2ZWRQTUtbaWR4XS5CU1NJRCwgNikpCisJCQkJCXsKKwkJCQkJCUZvdW5kUE1LID0gVFJVRTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCisJCQkJaWYgKEZvdW5kUE1LKQorCQkJCXsKKwkJCQkJLy8gU2V0IFBNSyBudW1iZXIKKwkJCQkJKihQVVNIT1JUKSAmcEFkLT5TdGFDZmcuUlNOX0lFW3BBZC0+U3RhQ2ZnLlJTTklFX0xlbl0gPSAxOworCQkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5TdGFDZmcuUlNOX0lFW3BBZC0+U3RhQ2ZnLlJTTklFX0xlbiArIDJdLCAmcEFkLT5TdGFDZmcuU2F2ZWRQTUtbaWR4XS5QTUtJRCwgMTYpOworICAgICAgICAgICAgICAgICAgICBwQWQtPlN0YUNmZy5SU05JRV9MZW4gKz0gMTg7CisJCQkJfQorCQkJfQorCisJCQl7CisJCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAgICAJCSZ0bXAsCisJCQkJICAgICAgICAgICAgICAJCTEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlJTTkllLAorCQkgICAgICAgICAgICAgICAgICAgICAgICAJMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEFkLT5TdGFDZmcuUlNOSUVfTGVuLAorCQkgICAgICAgICAgICAgICAgICAgICAgICAJcEFkLT5TdGFDZmcuUlNOSUVfTGVuLAkJCXBBZC0+U3RhQ2ZnLlJTTl9JRSwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgCUVORF9PRl9BUkdTKTsKKwkJCX0KKworCQkJRnJhbWVMZW4gKz0gdG1wOworCisJCQl7CisJICAgICAgICAgICAgLy8gQXBwZW5kIFZhcmlhYmxlIElFCisJICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuUmVxVmFySUVzICsgVmFySWVzT2Zmc2V0LCAmUlNOSWUsIDEpOworCSAgICAgICAgICAgIFZhckllc09mZnNldCArPSAxOworCSAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLlJlcVZhcklFcyArIFZhckllc09mZnNldCwgJnBBZC0+U3RhQ2ZnLlJTTklFX0xlbiwgMSk7CisJICAgICAgICAgICAgVmFySWVzT2Zmc2V0ICs9IDE7CisJCQl9CisJCQlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5SZXFWYXJJRXMgKyBWYXJJZXNPZmZzZXQsIHBBZC0+U3RhQ2ZnLlJTTl9JRSwgcEFkLT5TdGFDZmcuUlNOSUVfTGVuKTsKKwkJCVZhckllc09mZnNldCArPSBwQWQtPlN0YUNmZy5SU05JRV9MZW47CisKKwkJCS8vIFNldCBWYXJpYWJsZSBJRXMgTGVuZ3RoCisJCQlwQWQtPlN0YUNmZy5SZXFWYXJJRUxlbiA9IFZhckllc09mZnNldDsKKwkJfQorCisJCS8vIFdlIGhhdmUgdXBkYXRlIHRoYXQgYXQgUGVlckJlYWNvbkF0Sm9pblJlcXVlc3QoKQorCQlDa2lwRmxhZyA9IHBBZC0+U3RhQ2ZnLkNraXBGbGFnOworCQlpZiAoQ2tpcEZsYWcgIT0gMCkKKwkJeworCQkJTmRpc1plcm9NZW1vcnkoQ2tpcE5lZ290aWF0aW9uQnVmZmVyLCBDS0lQX05FR09USUFUSU9OX0xFTkdUSCk7CisJCQlDa2lwTmVnb3RpYXRpb25CdWZmZXJbMl0gPSAweDY2OworCQkJLy8gTWFrZSBpdCB0cnkgS1AgJiBNSUMsIHNpbmNlIHdlIGhhdmUgdG8gZm9sbG93IHRoZSByZXN1bHQgZnJvbSBBc3NvY1JzcAorCQkJQ2tpcE5lZ290aWF0aW9uQnVmZmVyWzhdID0gMHgxODsKKwkJCUNraXBOZWdvdGlhdGlvbkJ1ZmZlcltDS0lQX05FR09USUFUSU9OX0xFTkdUSCAtIDFdID0gMHgyMjsKKwkJCUNraXBGbGFnID0gMHgxODsKKworCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAJJnRtcCwKKwkJCQkJCTEsCQkJCQkJICAJCSZBaXJvbmV0Q2tpcEllLAorCQkJCQkJMSwJCQkJCQkgIAkJJkFpcm9uZXRDa2lwTGVuLAorCQkJCQkJQWlyb25ldENraXBMZW4sIAkJICAJCUNraXBOZWdvdGlhdGlvbkJ1ZmZlciwKKwkJCQkJCUVORF9PRl9BUkdTKTsKKwkJCUZyYW1lTGVuICs9IHRtcDsKKwkJfQorCisJCS8vIEFkZCBDQ1ggdjIgcmVxdWVzdCBpZiBDQ1gyIGFkbWluIHN0YXRlIGlzIG9uCisJCWlmIChwQWQtPlN0YUNmZy5DQ1hDb250cm9sLmZpZWxkLkVuYWJsZSA9PSAxKQorCQl7CisKKwkJCS8vCisJCQkvLyBBZGQgQWlyb25ldElQQWRkcmVzc0lFIGZvciBDaXNjbyBDQ1ggMi5YCisJCQkvLyBBZGQgQ0NYIFZlcnNpb24KKwkJCS8vCisJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sICZ0bXAsCisJCQkJCQkxLAkJCQkJCQkmQWlyb25ldElQQWRkcmVzc0lFLAorCQkJCQkJMSwJCQkJCQkJJkFpcm9uZXRJUEFkZHJlc3NMZW4sCisJCQkJCQlBaXJvbmV0SVBBZGRyZXNzTGVuLAkJQWlyb25ldElQQWRkcmVzc0J1ZmZlciwKKwkJCQkJCTEsCQkJCQkJCSZDY3gySWUsCisJCQkJCQkxLAkJCQkJCQkmQ2N4MkxlbiwKKwkJCQkJCUNjeDJMZW4sCQkJCSAgICBDY3gySWVJbmZvLAorCQkJCQkJRU5EX09GX0FSR1MpOworCQkJRnJhbWVMZW4gKz0gdG1wOworCisJCQkvLworCQkJLy8gQWRkIENpcGhlclN1aXRlIENDS00gb3IgTGVhcFRraXAgaWYgc2V0dGluZy4KKwkJCS8vCisjaWZkZWYgTEVBUF9TVVBQT1JUCisJCQlpZiAoTEVBUF9DQ0tNX09OKHBBZCkpCisJCQl7CisJCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLAkmdG1wLAorCQkJCQkJQ2lwaGVyU3VpdGVDaXNjb0NDS01MZW4sCQlDaXBoZXJTdWl0ZUNpc2NvQ0NLTSwKKwkJCQkJCUVORF9PRl9BUkdTKTsKKwkJCQlGcmFtZUxlbiArPSB0bXA7CisKKwkJCQkvLyBUaGlyZCBhZGQgUlNOCisJCQkJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuUmVxVmFySUVzICsgVmFySWVzT2Zmc2V0LCBDaXBoZXJTdWl0ZUNpc2NvQ0NLTSwgQ2lwaGVyU3VpdGVDaXNjb0NDS01MZW4pOyAvL1NhdmUgQ2lwaGVyU3VpdGUKKwkJCQlWYXJJZXNPZmZzZXQgKz0gQ2lwaGVyU3VpdGVDaXNjb0NDS01MZW47CisJCQl9CisJCQllbHNlIGlmICgocEFkLT5TdGFDZmcuTGVhcEF1dGhNb2RlID09IENJU0NPX0F1dGhNb2RlTEVBUCkgJiYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKSkKKwkJCXsKKwkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sICZ0bXAsCisJCQkJCQlDaXBoZXJTdWl0ZUNDWFRraXBMZW4sCSAgICBDaXBoZXJTdWl0ZUNDWFRraXAsCisJCQkJCQlFTkRfT0ZfQVJHUyk7CisJCQkJRnJhbWVMZW4gKz0gdG1wOworCisJCQkJLy8gVGhpcmQgYWRkIFJTTgorCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLlJlcVZhcklFcyArIFZhckllc09mZnNldCwgQ2lwaGVyU3VpdGVDQ1hUa2lwLCBDaXBoZXJTdWl0ZUNDWFRraXBMZW4pOworCQkJCVZhckllc09mZnNldCArPSBDaXBoZXJTdWl0ZUNDWFRraXBMZW47CisJCQl9CisjZW5kaWYgLy8gTEVBUF9TVVBQT1JUIC8vCisKKwkJCS8vIEFkZCBieSBKYW1lcyAwMy8wNi8yNworCQkJLy8gU2V0IFZhcmlhYmxlIElFcyBMZW5ndGgKKwkJCXBBZC0+U3RhQ2ZnLlJlcVZhcklFTGVuID0gVmFySWVzT2Zmc2V0OworCQkJcEFkLT5TdGFDZmcuQXNzb2NJbmZvLlJlcXVlc3RJRUxlbmd0aCA9IFZhckllc09mZnNldDsKKworCQkJLy8gT2Zmc2V0UmVzcG9uc2VJRXMgZm9sbG93IFJlcVZhcklFCisJCQlwQWQtPlN0YUNmZy5Bc3NvY0luZm8uT2Zmc2V0UmVzcG9uc2VJRXMgPSBzaXplb2YoTkRJU184MDJfMTFfQVNTT0NJQVRJT05fSU5GT1JNQVRJT04pICsgcEFkLT5TdGFDZmcuUmVxVmFySUVMZW47CisJCQkvLyBFbmQgQWRkIGJ5IEphbWVzCisJCX0KKworCisJCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgMCwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOworCQlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOworCisJCVJUTVBTZXRUaW1lcigmcEFkLT5NbG1lQXV4LkFzc29jVGltZXIsIFRpbWVvdXQpOworCQlwQWQtPk1sbWUuQXNzb2NNYWNoaW5lLkN1cnJTdGF0ZSA9IEFTU09DX1dBSVRfUlNQOworCX0KKwllbHNlCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkFTU09DIC0gTWxtZUFzc29jUmVxQWN0aW9uKCkgc2FuaXR5IGNoZWNrIGZhaWxlZC4gQlVHISEhISEhIFxuIikpOworCQlwQWQtPk1sbWUuQXNzb2NNYWNoaW5lLkN1cnJTdGF0ZSA9IEFTU09DX0lETEU7CisJCVN0YXR1cyA9IE1MTUVfSU5WQUxJRF9GT1JNQVQ7CisJCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9BU1NPQ19DT05GLCAyLCAmU3RhdHVzKTsKKwl9CisKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQltbG1lIHJlYXNzb2MgcmVxIGhhbmRsaW5nIHByb2NlZHVyZQorCVBhcmFtZXRlcnM6CisJCUVsZW0gLQorCVByZToKKwkJLSMgU1NJRCAgKEFkYXB0ZXItPlN0YUNmZy5zc2lkW10pCisJCS0jIEJTU0lEIChBUCBhZGRyZXNzLCBBZGFwdGVyLT5TdGFDZmcuYnNzaWQpCisJCS0jIFN1cHBvcnRlZCByYXRlcyAoQWRhcHRlci0+U3RhQ2ZnLnN1cHBvcnRlZF9yYXRlc1tdKQorCQktIyBTdXBwb3J0ZWQgcmF0ZXMgbGVuZ3RoIChBZGFwdGVyLT5TdGFDZmcuc3VwcG9ydGVkX3JhdGVzX2xlbikKKwkJLSMgVHggcG93ZXIgKEFkYXB0ZXItPlN0YUNmZy50eF9wb3dlcikKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBNbG1lUmVhc3NvY1JlcUFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisJVUNIQVIJCQlBcEFkZHJbNl07CisJSEVBREVSXzgwMl8xMQlSZWFzc29jSGRyOworCVVDSEFSCQkJQ2N4MkxlbiA9IDU7CisJVUNIQVIJCQlXbWVJZVs5XSA9IHtJRV9WRU5ET1JfU1BFQ0lGSUMsIDB4MDcsIDB4MDAsIDB4NTAsIDB4ZjIsIDB4MDIsIDB4MDAsIDB4MDEsIDB4MDB9OworCVVTSE9SVAkJCUNhcGFiaWxpdHlJbmZvLCBMaXN0ZW5JbnR2OworCVVMT05HCQkJVGltZW91dDsKKwlVTE9ORwkJCUZyYW1lTGVuID0gMDsKKwlCT09MRUFOCQkJVGltZXJDYW5jZWxsZWQ7CisJTkRJU19TVEFUVVMJCU5TdGF0dXM7CisJVUxPTkcJCQl0bXA7CisJUFVDSEFSCQkJcE91dEJ1ZmZlciA9IE5VTEw7CisvL0NDWCAyLlgKKyNpZmRlZiBMRUFQX1NVUFBPUlQKKwlVQ0hBUgkJCUNraXBGbGFnOworCVVDSEFSCQkJQ2tpcE5lZ290aWF0aW9uQnVmZmVyW0NLSVBfTkVHT1RJQVRJT05fTEVOR1RIXTsKKwlVQ0hBUgkJCUFpcm9uZXRDa2lwSWUgPSBJRV9BSVJPTkVUX0NLSVA7CisJVUNIQVIJCQlBaXJvbmV0Q2tpcExlbiA9IENLSVBfTkVHT1RJQVRJT05fTEVOR1RIOworCVVDSEFSCQkJQWlyb25ldElQQWRkcmVzc0lFID0gSUVfQUlST05FVF9JUEFERFJFU1M7CisJVUNIQVIJCQlBaXJvbmV0SVBBZGRyZXNzTGVuID0gQUlST05FVF9JUEFERFJFU1NfTEVOR1RIOworCVVDSEFSCQkJQWlyb25ldElQQWRkcmVzc0J1ZmZlcltBSVJPTkVUX0lQQUREUkVTU19MRU5HVEhdID0gezB4MDAsIDB4NDAsIDB4OTYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDIsIDB4MDB9OworCVVDSEFSCQkJQWlyb25ldENDS01SZWFzc29jSUUgPSBJRV9BSVJPTkVUX0NDS01SRUFTU09DOworCVVDSEFSCQkJQWlyb25ldENDS01SZWFzc29jTGVuID0gQUlST05FVF9DQ0tNUkVBU1NPQ19MRU5HVEg7CisJVUNIQVIJCQlBaXJvbmV0Q0NLTVJlYXNzb2NCdWZmZXJbQUlST05FVF9DQ0tNUkVBU1NPQ19MRU5HVEhdOworCVVDSEFSCQkJQWlyb25ldE9VSVtdID0gezB4MDAsIDB4NDAsIDB4OTYsIDB4MDB9OworCVVDSEFSCQkJTUlDTU5bMTZdOworCVVDSEFSCQkJQ2FsY01pY0J1ZmZlcls4MF07CisJVUxPTkcJCQlDYWxjTWljQnVmZmVyTGVuID0gMDsKKyNlbmRpZiAvLyBMRUFQX1NVUFBPUlQgLy8KKwlVU0hPUlQJCQlTdGF0dXM7CisKKwkvLyBCbG9jayBhbGwgYXV0aGVudGljYXRpb24gcmVxdWVzdCBkdXJuaW5nIFdQQSBibG9jayBwZXJpb2QKKwlpZiAocEFkLT5TdGFDZmcuYkJsb2NrQXNzb2MgPT0gVFJVRSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFTU09DIC0gQmxvY2sgUmVBc3NvYyByZXF1ZXN0IGR1cm5pbmcgV1BBIGJsb2NrIHBlcmlvZCFcbiIpKTsKKwkJcEFkLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUgPSBBU1NPQ19JRExFOworCQlTdGF0dXMgPSBNTE1FX1NUQVRFX01BQ0hJTkVfUkVKRUNUOworCQlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfUkVBU1NPQ19DT05GLCAyLCAmU3RhdHVzKTsKKwl9CisJLy8gdGhlIHBhcmFtZXRlcnMgYXJlIHRoZSBzYW1lIGFzIHRoZSBhc3NvY2lhdGlvbgorCWVsc2UgaWYoTWxtZUFzc29jUmVxU2FuaXR5KHBBZCwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4sIEFwQWRkciwgJkNhcGFiaWxpdHlJbmZvLCAmVGltZW91dCwgJkxpc3RlbkludHYpKQorCXsKKwkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguUmVhc3NvY1RpbWVyLCAmVGltZXJDYW5jZWxsZWQpOworCisJCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5CisJCWlmKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJeworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJBU1NPQyAtIE1sbWVSZWFzc29jUmVxQWN0aW9uKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxlZCBcbiIpKTsKKwkJCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlID0gQVNTT0NfSURMRTsKKwkJCVN0YXR1cyA9IE1MTUVfRkFJTF9OT19SRVNPVVJDRTsKKwkJCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9SRUFTU09DX0NPTkYsIDIsICZTdGF0dXMpOworCQkJcmV0dXJuOworCQl9CisKKwkJQ09QWV9NQUNfQUREUihwQWQtPk1sbWVBdXguQnNzaWQsIEFwQWRkcik7CisKKwkJLy8gbWFrZSBmcmFtZSwgdXNlIGJzc2lkIGFzIHRoZSBBUCBhZGRyZXNzPz8KKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVNTT0MgLSBTZW5kIFJFLUFTU09DIHJlcXVlc3QuLi5cbiIpKTsKKwkJTWd0TWFjSGVhZGVySW5pdChwQWQsICZSZWFzc29jSGRyLCBTVUJUWVBFX1JFQVNTT0NfUkVRLCAwLCBBcEFkZHIsIEFwQWRkcik7CisJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAgICAgICAgJkZyYW1lTGVuLAorCQkJCQkJICBzaXplb2YoSEVBREVSXzgwMl8xMSksICAgICZSZWFzc29jSGRyLAorCQkJCQkJICAyLCAgICAgICAgICAgICAgICAgICAgICAgICZDYXBhYmlsaXR5SW5mbywKKwkJCQkJCSAgMiwgICAgICAgICAgICAgICAgICAgICAgICAmTGlzdGVuSW50diwKKwkJCQkJCSAgTUFDX0FERFJfTEVOLCAgICAgICAgICAgICBBcEFkZHIsCisJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgJlNzaWRJZSwKKwkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAmcEFkLT5NbG1lQXV4LlNzaWRMZW4sCisJCQkJCQkgIHBBZC0+TWxtZUF1eC5Tc2lkTGVuLCAgICAgcEFkLT5NbG1lQXV4LlNzaWQsCisJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgJlN1cFJhdGVJZSwKKwkJCQkJCSAgMSwJCQkJCQkmcEFkLT5NbG1lQXV4LlN1cFJhdGVMZW4sCisJCQkJCQkgIHBBZC0+TWxtZUF1eC5TdXBSYXRlTGVuLCAgcEFkLT5NbG1lQXV4LlN1cFJhdGUsCisJCQkJCQkgIEVORF9PRl9BUkdTKTsKKworCQlpZiAocEFkLT5NbG1lQXV4LkV4dFJhdGVMZW4gIT0gMCkKKwkJeworCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAgICAgICAgJnRtcCwKKwkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICZFeHRSYXRlSWUsCisJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEFkLT5NbG1lQXV4LkV4dFJhdGVMZW4sCisJCQkJCQkJICBwQWQtPk1sbWVBdXguRXh0UmF0ZUxlbiwJICAgIHBBZC0+TWxtZUF1eC5FeHRSYXRlLAorCQkJCQkJCSAgRU5EX09GX0FSR1MpOworCQkJRnJhbWVMZW4gKz0gdG1wOworCQl9CisKKwkJaWYgKHBBZC0+TWxtZUF1eC5BUEVkY2FQYXJtLmJWYWxpZCkKKwkJeworCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJBUFNEQ2FwYWJsZSAmJiBwQWQtPk1sbWVBdXguQVBFZGNhUGFybS5iQVBTRENhcGFibGUpCisJCQl7CisJCQkJUUJTU19TVEFfSU5GT19QQVJNIFFvc0luZm87CisKKwkJCQlOZGlzWmVyb01lbW9yeSgmUW9zSW5mbywgc2l6ZW9mKFFCU1NfU1RBX0lORk9fUEFSTSkpOworCQkJCVFvc0luZm8uVUFQU0RfQUNfQkUgPSBwQWQtPkNvbW1vbkNmZy5iQVBTREFDX0JFOworCQkJCVFvc0luZm8uVUFQU0RfQUNfQksgPSBwQWQtPkNvbW1vbkNmZy5iQVBTREFDX0JLOworCQkJCVFvc0luZm8uVUFQU0RfQUNfVkkgPSBwQWQtPkNvbW1vbkNmZy5iQVBTREFDX1ZJOworCQkJCVFvc0luZm8uVUFQU0RfQUNfVk8gPSBwQWQtPkNvbW1vbkNmZy5iQVBTREFDX1ZPOworCQkJCVFvc0luZm8uTWF4U1BMZW5ndGggPSBwQWQtPkNvbW1vbkNmZy5NYXhTUExlbmd0aDsKKwkJCQlXbWVJZVs4XSB8PSAqKFBVQ0hBUikmUW9zSW5mbzsKKwkJCX0KKworCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAgICAmdG1wLAorCQkJCQkJCSAgOSwgICAgICAgICAgICAgICAgICAgICAgICAmV21lSWVbMF0sCisJCQkJCQkJICBFTkRfT0ZfQVJHUyk7CisJCQlGcmFtZUxlbiArPSB0bXA7CisJCX0KKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkvLyBIVAorCQlpZiAoKHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHlMZW4gPiAwKSAmJiAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEKSkKKwkJeworCQkJVUxPTkcgVG1wTGVuOworCQkJVUNIQVIgSHRMZW47CisJCQlVQ0hBUiBCUk9BRENPTVs0XSA9IHsweDAsIDB4OTAsIDB4NGMsIDB4MzN9OworCQkJaWYgKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uYlByZU5IdCA9PSBUUlVFKQorCQkJeworCQkJCUh0TGVuID0gU0laRV9IVF9DQVBfSUUgKyA0OworCQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwgICAgICAgICAgICAmVG1wTGVuLAorCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZXcGFJZSwKKwkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmSHRMZW4sCisJCQkJCQkJICA0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkJST0FEQ09NWzBdLAorCQkJCQkJCSBwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5TGVuLCAgICAgICAgICAmcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eSwKKwkJCQkJCQkgIEVORF9PRl9BUkdTKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sICAgICAgICAgICAgJlRtcExlbiwKKwkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmSHRDYXBJZSwKKwkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eUxlbiwKKwkJCQkJCQkgcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eUxlbiwgICAgICAgICAgJnBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHksCisJCQkJCQkJICBFTkRfT0ZfQVJHUyk7CisJCQl9CisJCQlGcmFtZUxlbiArPSBUbXBMZW47CisJCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCQkvLyBhZGQgUmFsaW5rIHByb3ByaWV0YXJ5IElFIHRvIGluZm9ybSBBUCB0aGlzIFNUQSBpcyBnb2luZyB0byB1c2UgQUdHUkVHQVRJT04gb3IgUElHR1ktQkFDSytBR0dSRUdBVElPTgorCQkvLyBDYXNlIEk6IChBZ2dyZWdhdGlvbiArIFBpZ2d5LUJhY2spCisJCS8vIDEuIHVzZXIgZW5hYmxlIGFnZ3JlZ2F0aW9uLCBBTkQKKwkJLy8gMi4gTWFjIHN1cHBvcnQgcGlnZ3ktYmFjaworCQkvLyAzLiBBUCBhbm5vdWNlcyBpdCdzIFBJR0dZLUJBQ0srQUdHUkVHQVRJT04tY2FwYWJsZSBpbiBCRUFDT04KKwkJLy8gQ2FzZSBJSTogKEFnZ3JlZ2F0aW9uKQorCQkvLyAxLiB1c2VyIGVuYWJsZSBhZ2dyZWdhdGlvbiwgQU5ECisJCS8vIDIuIEFQIGFubm91Y2VzIGl0J3MgQUdHUkVHQVRJT04tY2FwYWJsZSBpbiBCRUFDT04KKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJBZ2dyZWdhdGlvbkNhcGFibGUpCisJCXsKKwkJCWlmICgocEFkLT5Db21tb25DZmcuYlBpZ2d5QmFja0NhcGFibGUpICYmICgocEFkLT5NbG1lQXV4LkFQUmFsaW5rSWUgJiAweDAwMDAwMDAzKSA9PSAzKSkKKwkJCXsKKwkJCQlVTE9ORyBUbXBMZW47CisJCQkJVUNIQVIgUmFsaW5rSWVbOV0gPSB7SUVfVkVORE9SX1NQRUNJRklDLCA3LCAweDAwLCAweDBjLCAweDQzLCAweDAzLCAweDAwLCAweDAwLCAweDAwfTsKKwkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyK0ZyYW1lTGVuLCAgICAgICAgICAgJlRtcExlbiwKKwkJCQkJCQkJICA5LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmFsaW5rSWUsCisJCQkJCQkJCSAgRU5EX09GX0FSR1MpOworCQkJCUZyYW1lTGVuICs9IFRtcExlbjsKKwkJCX0KKwkJCWVsc2UgaWYgKHBBZC0+TWxtZUF1eC5BUFJhbGlua0llICYgMHgwMDAwMDAwMSkKKwkJCXsKKwkJCQlVTE9ORyBUbXBMZW47CisJCQkJVUNIQVIgUmFsaW5rSWVbOV0gPSB7SUVfVkVORE9SX1NQRUNJRklDLCA3LCAweDAwLCAweDBjLCAweDQzLCAweDAxLCAweDAwLCAweDAwLCAweDAwfTsKKwkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyK0ZyYW1lTGVuLCAgICAgICAgICAgJlRtcExlbiwKKwkJCQkJCQkJICA5LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmFsaW5rSWUsCisJCQkJCQkJCSAgRU5EX09GX0FSR1MpOworCQkJCUZyYW1lTGVuICs9IFRtcExlbjsKKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCVVMT05HIFRtcExlbjsKKwkJCVVDSEFSIFJhbGlua0llWzldID0ge0lFX1ZFTkRPUl9TUEVDSUZJQywgNywgMHgwMCwgMHgwYywgMHg0MywgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMH07CisJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyK0ZyYW1lTGVuLAkJICZUbXBMZW4sCisJCQkJCQkJICA5LAkJCQkJCSBSYWxpbmtJZSwKKwkJCQkJCQkgIEVORF9PRl9BUkdTKTsKKwkJCUZyYW1lTGVuICs9IFRtcExlbjsKKwkJfQorI2lmZGVmIExFQVBfU1VQUE9SVAorCQlpZiAoTEVBUF9DQ0tNX09OKHBBZCkgJiYgKHBBZC0+U3RhQ2ZnLkNDS01MaW5rVXBGbGFnID09IFRSVUUpKQorCQl7CisJCQlDa2lwRmxhZyA9IHBBZC0+U3RhQ2ZnLkNraXBGbGFnOwkvLyBXZSBoYXZlIHVwZGF0ZSB0aGF0IGF0IFBlZXJCZWFjb25BdEpvaW5SZXF1ZXN0KCkKKwkJCWlmIChDa2lwRmxhZyAhPSAwKQorCQkJeworCQkJCU5kaXNaZXJvTWVtb3J5KENraXBOZWdvdGlhdGlvbkJ1ZmZlciwgQ0tJUF9ORUdPVElBVElPTl9MRU5HVEgpOworCQkJCUNraXBOZWdvdGlhdGlvbkJ1ZmZlclsyXSA9IDB4NjY7CisJCQkJLy8gTWFrZSBpdCB0cnkgS1AgJiBNSUMsIHNpbmNlIHdlIGhhdmUgdG8gZm9sbG93IHRoZSByZXN1bHQgZnJvbSBBc3NvY1JzcAorCQkJCUNraXBOZWdvdGlhdGlvbkJ1ZmZlcls4XSA9IDB4MTg7CisJCQkJQ2tpcE5lZ290aWF0aW9uQnVmZmVyW0NLSVBfTkVHT1RJQVRJT05fTEVOR1RIIC0gMV0gPSAweDIyOworCisJCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAgICAgICAgICAgICZ0bXAsCisJCQkJCQkJCQkxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZBaXJvbmV0Q2tpcEllLAorCQkJCQkJCQkJMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQWlyb25ldENraXBMZW4sCisJCQkJCQkJCQlBaXJvbmV0Q2tpcExlbiwgICAgICAgICAgICAgICAgIENraXBOZWdvdGlhdGlvbkJ1ZmZlciwKKwkJCQkJCQkJCUVORF9PRl9BUkdTKTsKKwkJCQlGcmFtZUxlbiArPSB0bXA7CisJCQl9CisKKwkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwgJnRtcCwKKwkJCQkJCQkxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZBaXJvbmV0SVBBZGRyZXNzSUUsCisJCQkJCQkJMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQWlyb25ldElQQWRkcmVzc0xlbiwKKwkJCQkJCQlBaXJvbmV0SVBBZGRyZXNzTGVuLCAgICAgICAgICAgIEFpcm9uZXRJUEFkZHJlc3NCdWZmZXIsCisJCQkJCQkJRU5EX09GX0FSR1MpOworCQkJRnJhbWVMZW4gKz0gdG1wOworCisJCQkvLworCQkJLy8gVGhlIFJOIGlzIGluY3JlbWVudGVkIGJlZm9yZSBlYWNoIHJlYXNzb2NpYXRpb24gcmVxdWVzdC4KKwkJCS8vCisJCQlwQWQtPlN0YUNmZy5DQ0tNUk4rKzsKKwkJCS8vCisJCQkvLyBDYWxjdWxhdGUgTUlDID0gaG1hYy1tZDUoa3JrLCBTVEEtSUR8QlNTSUR8UlNOSUV8VFNGfFJOKTsKKwkJCS8vCisJCQlDT1BZX01BQ19BRERSKENhbGNNaWNCdWZmZXIsIHBBZC0+Q3VycmVudEFkZHJlc3MpOworCQkJQ2FsY01pY0J1ZmZlckxlbiA9IE1BQ19BRERSX0xFTjsKKwkJCUNPUFlfTUFDX0FERFIoQ2FsY01pY0J1ZmZlciArIENhbGNNaWNCdWZmZXJMZW4sIHBBZC0+TWxtZUF1eC5Cc3NpZCk7CisJCQlDYWxjTWljQnVmZmVyTGVuICs9IE1BQ19BRERSX0xFTjsKKwkJCU5kaXNNb3ZlTWVtb3J5KENhbGNNaWNCdWZmZXIgKyBDYWxjTWljQnVmZmVyTGVuLCBDaXBoZXJTdWl0ZUNpc2NvQ0NLTSwgQ2lwaGVyU3VpdGVDaXNjb0NDS01MZW4pOworCQkJQ2FsY01pY0J1ZmZlckxlbiArPSBDaXBoZXJTdWl0ZUNpc2NvQ0NLTUxlbjsKKwkJCU5kaXNNb3ZlTWVtb3J5KENhbGNNaWNCdWZmZXIgKyBDYWxjTWljQnVmZmVyTGVuLCAoUFVDSEFSKSAmcEFkLT5TdGFDZmcuQ0NLTUJlYWNvbkF0Sm9pblRpbWVTdGFtcCwgc2l6ZW9mKHBBZC0+U3RhQ2ZnLkNDS01CZWFjb25BdEpvaW5UaW1lU3RhbXApKTsKKwkJCUNhbGNNaWNCdWZmZXJMZW4gKz0gc2l6ZW9mKHBBZC0+U3RhQ2ZnLkNDS01CZWFjb25BdEpvaW5UaW1lU3RhbXApOworCQkJTmRpc01vdmVNZW1vcnkoQ2FsY01pY0J1ZmZlciArIENhbGNNaWNCdWZmZXJMZW4sIChQVUNIQVIpJnBBZC0+U3RhQ2ZnLkNDS01STiwgc2l6ZW9mKHBBZC0+U3RhQ2ZnLkNDS01STikpOworCQkJQ2FsY01pY0J1ZmZlckxlbiArPSBzaXplb2YocEFkLT5TdGFDZmcuQ0NLTVJOKTsKKwkJCWhtYWNfbWQ1KHBBZC0+U3RhQ2ZnLktSSywgTEVOX0VBUF9NSUNLLCBDYWxjTWljQnVmZmVyLCBDYWxjTWljQnVmZmVyTGVuLCBNSUNNTik7CisKKwkJCS8vCisJCQkvLyBmaWxsIHVwIENDS00gcmVhc3NvY2lhdGlvbiByZXF1ZXN0IGVsZW1lbnQKKwkJCS8vCisJCQlOZGlzTW92ZU1lbW9yeShBaXJvbmV0Q0NLTVJlYXNzb2NCdWZmZXIsIEFpcm9uZXRPVUksIDQpOworCQkJTmRpc01vdmVNZW1vcnkoQWlyb25ldENDS01SZWFzc29jQnVmZmVyICsgNCwgKFBVQ0hBUikmcEFkLT5TdGFDZmcuQ0NLTUJlYWNvbkF0Sm9pblRpbWVTdGFtcCwgOCk7CisJCQlOZGlzTW92ZU1lbW9yeShBaXJvbmV0Q0NLTVJlYXNzb2NCdWZmZXIgKyAxMiwgKFBVQ0hBUikgJnBBZC0+U3RhQ2ZnLkNDS01STiwgNCk7CisJCQlOZGlzTW92ZU1lbW9yeShBaXJvbmV0Q0NLTVJlYXNzb2NCdWZmZXIgKzE2LCBNSUNNTiwgOCk7CisKKwkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwgJnRtcCwKKwkJCQkJCQkxLCAgICAgICAgICAgICAgICAgICAgICAmQWlyb25ldENDS01SZWFzc29jSUUsCisJCQkJCQkJMSwgICAgICAgICAgICAgICAgICAgICAgJkFpcm9uZXRDQ0tNUmVhc3NvY0xlbiwKKwkJCQkJCQlBaXJvbmV0Q0NLTVJlYXNzb2NMZW4sICBBaXJvbmV0Q0NLTVJlYXNzb2NCdWZmZXIsCisJCQkJCQkJRU5EX09GX0FSR1MpOworCQkJRnJhbWVMZW4gKz0gdG1wOworCisJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sICZ0bXAsCisJCQkJCQkJQ2lwaGVyU3VpdGVDaXNjb0NDS01MZW4sQ2lwaGVyU3VpdGVDaXNjb0NDS00sCisJCQkJCQkJRU5EX09GX0FSR1MpOworCQkJRnJhbWVMZW4gKz0gdG1wOworCQl9CisjZW5kaWYgLy8gTEVBUF9TVVBQT1JUIC8vCisKKwkJLy8gQWRkIENDWCB2MiByZXF1ZXN0IGlmIENDWDIgYWRtaW4gc3RhdGUgaXMgb24KKwkJaWYgKHBBZC0+U3RhQ2ZnLkNDWENvbnRyb2wuZmllbGQuRW5hYmxlID09IDEpCisJCXsKKwkJCS8vCisJCQkvLyBBZGQgQ0NYIFZlcnNpb24KKwkJCS8vCisJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sICZ0bXAsCisJCQkJCQkxLAkJCQkJCQkmQ2N4MkllLAorCQkJCQkJMSwJCQkJCQkJJkNjeDJMZW4sCisJCQkJCQlDY3gyTGVuLAkJCQkgICAgQ2N4MkllSW5mbywKKwkJCQkJCUVORF9PRl9BUkdTKTsKKwkJCUZyYW1lTGVuICs9IHRtcDsKKwkJfQorCisJCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgMCwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOworCQlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOworCisJCVJUTVBTZXRUaW1lcigmcEFkLT5NbG1lQXV4LlJlYXNzb2NUaW1lciwgVGltZW91dCk7IC8qIGluIG1TZWMgKi8KKwkJcEFkLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUgPSBSRUFTU09DX1dBSVRfUlNQOworCX0KKwllbHNlCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkFTU09DIC0gTWxtZVJlYXNzb2NSZXFBY3Rpb24oKSBzYW5pdHkgY2hlY2sgZmFpbGVkLiBCVUchISEhIFxuIikpOworCQlwQWQtPk1sbWUuQXNzb2NNYWNoaW5lLkN1cnJTdGF0ZSA9IEFTU09DX0lETEU7CisJCVN0YXR1cyA9IE1MTUVfSU5WQUxJRF9GT1JNQVQ7CisJCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9SRUFTU09DX0NPTkYsIDIsICZTdGF0dXMpOworCX0KK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlVcHBlciBsYXllciBpc3N1ZXMgZGlzYXNzb2MgcmVxdWVzdAorCVBhcmFtZXRlcnM6CisJCUVsZW0gLQorCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgTWxtZURpc2Fzc29jUmVxQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlQTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNUIHBEaXNhc3NvY1JlcTsKKwlIRUFERVJfODAyXzExICAgICAgICAgRGlzYXNzb2NIZHI7CisJUEhFQURFUl84MDJfMTEgICAgICAgIHBEaXNhc3NvY0hkcjsKKwlQVUNIQVIgICAgICAgICAgICAgICAgcE91dEJ1ZmZlciA9IE5VTEw7CisJVUxPTkcgICAgICAgICAgICAgICAgIEZyYW1lTGVuID0gMDsKKwlORElTX1NUQVRVUyAgICAgICAgICAgTlN0YXR1czsKKwlCT09MRUFOICAgICAgICAgICAgICAgVGltZXJDYW5jZWxsZWQ7CisJVUxPTkcgICAgICAgICAgICAgICAgIFRpbWVvdXQgPSAwOworCVVTSE9SVCAgICAgICAgICAgICAgICBTdGF0dXM7CisKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwkvLyBzZW5kIERMUy1URUFSX0RPV04gbWVzc2FnZSwKKwlpZiAocEFkLT5Db21tb25DZmcuYkRMU0NhcGFibGUpCisJeworCQlVQ0hBUiBpOworCisJCS8vIHRlYXIgZG93biBsb2NhbCBkbHMgdGFibGUgZW50cnkKKwkJZm9yIChpPTA7IGk8TUFYX05VTV9PRl9JTklUX0RMU19FTlRSWTsgaSsrKQorCQl7CisJCQlpZiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQgJiYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9PSBETFNfRklOSVNIKSkKKwkJCXsKKwkJCQlSVE1QU2VuZERMU1RlYXJEb3duRnJhbWUocEFkLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKTsKKwkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMJPSBETFNfTk9ORTsKKwkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZAk9IEZBTFNFOworCQkJfQorCQl9CisKKwkJLy8gdGVhciBkb3duIHBlZXIgZGxzIHRhYmxlIGVudHJ5CisJCWZvciAoaT1NQVhfTlVNX09GX0lOSVRfRExTX0VOVFJZOyBpPE1BWF9OVU1fT0ZfRExTX0VOVFJZOyBpKyspCisJCXsKKwkJCWlmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZCAmJiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID09IERMU19GSU5JU0gpKQorCQkJeworCQkJCVJUTVBTZW5kRExTVGVhckRvd25GcmFtZShwQWQsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpOworCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9IERMU19OT05FOworCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkCT0gRkFMU0U7CisJCQl9CisJCX0KKwl9CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisKKwkvLyBza2lwIHNhbml0eSBjaGVjaworCXBEaXNhc3NvY1JlcSA9IChQTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNUKShFbGVtLT5Nc2cpOworCisJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKKwlpZiAoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVNTT0MgLSBNbG1lRGlzYXNzb2NSZXFBY3Rpb24oKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkXG4iKSk7CisJCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlID0gQVNTT0NfSURMRTsKKwkJU3RhdHVzID0gTUxNRV9GQUlMX05PX1JFU09VUkNFOworCQlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfRElTQVNTT0NfQ09ORiwgMiwgJlN0YXR1cyk7CisJCXJldHVybjsKKwl9CisKKworCisJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguRGlzYXNzb2NUaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFTU09DIC0gU2VuZCBESVNBU1NPQyByZXF1ZXN0W0JTU0lEOjolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCAoUmVhc29uPSVkKVxuIiwKKwkJCQlwRGlzYXNzb2NSZXEtPkFkZHJbMF0sIHBEaXNhc3NvY1JlcS0+QWRkclsxXSwgcERpc2Fzc29jUmVxLT5BZGRyWzJdLAorCQkJCXBEaXNhc3NvY1JlcS0+QWRkclszXSwgcERpc2Fzc29jUmVxLT5BZGRyWzRdLCBwRGlzYXNzb2NSZXEtPkFkZHJbNV0sIHBEaXNhc3NvY1JlcS0+UmVhc29uKSk7CisJTWd0TWFjSGVhZGVySW5pdChwQWQsICZEaXNhc3NvY0hkciwgU1VCVFlQRV9ESVNBU1NPQywgMCwgcERpc2Fzc29jUmVxLT5BZGRyLCBwRGlzYXNzb2NSZXEtPkFkZHIpOwkvLyBwYXRjaCBwZWFwIHR0bHMgc3dpdGNoaW5nIGlzc3VlCisJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICAgICZGcmFtZUxlbiwKKwkJCQkJICBzaXplb2YoSEVBREVSXzgwMl8xMSksJkRpc2Fzc29jSGRyLAorCQkJCQkgIDIsICAgICAgICAgICAgICAgICAgICAmcERpc2Fzc29jUmVxLT5SZWFzb24sCisJCQkJCSAgRU5EX09GX0FSR1MpOworCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgMCwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOworCisJLy8gVG8gcGF0Y2ggSW5zdGFuY2UgYW5kIEJ1ZmZhbG8oTikgQVAKKwkvLyBEcml2ZXIgaGFzIHRvIHNlbmQgZGVhdXRoIHRvIEluc3RhbmNlIEFQLCBidXQgQnVmZmFsbyhOKSBuZWVkcyB0byBzZW5kIGRpc2Fzc29jIHRvIHJlc2V0IEF1dGhlbnRpY2F0b3IncyBzdGF0ZSBtYWNoaW5lCisJLy8gVGhlcmVmb3JlLCB3ZSBzZW5kIGJvdGggb2YgdGhlbS4KKwlwRGlzYXNzb2NIZHIgPSAoUEhFQURFUl84MDJfMTEpcE91dEJ1ZmZlcjsKKwlwRGlzYXNzb2NIZHItPkZDLlN1YlR5cGUgPSBTVUJUWVBFX0RFQVVUSDsKKwlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIDAsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKKworCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7CisKKwlwQWQtPlN0YUNmZy5EaXNhc3NvY1JlYXNvbiA9IFJFQVNPTl9ESVNBU1NPQ19TVEFfTEVBVklORzsKKwlDT1BZX01BQ19BRERSKHBBZC0+U3RhQ2ZnLkRpc2Fzc29jU3RhLCBwRGlzYXNzb2NSZXEtPkFkZHIpOworCisJUlRNUFNldFRpbWVyKCZwQWQtPk1sbWVBdXguRGlzYXNzb2NUaW1lciwgVGltZW91dCk7IC8qIGluIG1TZWMgKi8KKwlwQWQtPk1sbWUuQXNzb2NNYWNoaW5lLkN1cnJTdGF0ZSA9IERJU0FTU09DX1dBSVRfUlNQOworCisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorI2lmbmRlZiBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgIGlmIChwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgIT0gV1BBX1NVUFBMSUNBTlRfRElTQUJMRSkKKwl7CisgICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgICAgd3JxdTsKKyAgICAgICAgLy9zZW5kIGRpc2Fzc29jaWF0ZSBldmVudCB0byB3cGFfc3VwcGxpY2FudAorICAgICAgICBtZW1zZXQoJndycXUsIDAsIHNpemVvZih3cnF1KSk7CisgICAgICAgIHdycXUuZGF0YS5mbGFncyA9IFJUX0RJU0FTU09DX0VWRU5UX0ZMQUc7CisgICAgICAgIHdpcmVsZXNzX3NlbmRfZXZlbnQocEFkLT5uZXRfZGV2LCBJV0VWQ1VTVE9NLCAmd3JxdSwgTlVMTCk7CisgICAgfQorI2VuZGlmIC8vIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCisjaWZkZWYgTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyAgICB7CisgICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgICAgd3JxdTsKKyAgICAgICAgbWVtc2V0KHdycXUuYXBfYWRkci5zYV9kYXRhLCAwLCBNQUNfQUREUl9MRU4pOworICAgICAgICB3aXJlbGVzc19zZW5kX2V2ZW50KHBBZC0+bmV0X2RldiwgU0lPQ0dJV0FQLCAmd3JxdSwgTlVMTCk7CisgICAgfQorI2VuZGlmIC8vIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlwZWVyIHNlbmRzIGFzc29jIHJzcCBiYWNrCisJUGFyYW1ldGVyczoKKwkJRWxtZSAtIE1MTUUgbWVzc2FnZSBjb250YWluaW5nIHRoZSByZWNlaXZlZCBmcmFtZQorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIFBlZXJBc3NvY1JzcEFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisJVVNIT1JUICAgICAgICBDYXBhYmlsaXR5SW5mbywgU3RhdHVzLCBBaWQ7CisJVUNIQVIgICAgICAgICBTdXBSYXRlW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXSwgU3VwUmF0ZUxlbjsKKwlVQ0hBUiAgICAgICAgIEV4dFJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdLCBFeHRSYXRlTGVuOworCVVDSEFSICAgICAgICAgQWRkcjJbTUFDX0FERFJfTEVOXTsKKwlCT09MRUFOICAgICAgIFRpbWVyQ2FuY2VsbGVkOworCVVDSEFSICAgICAgICAgQ2tpcEZsYWc7CisJRURDQV9QQVJNICAgICBFZGNhUGFybTsKKwlIVF9DQVBBQklMSVRZX0lFCQlIdENhcGFiaWxpdHk7CisJQUREX0hUX0lORk9fSUUJCUFkZEh0SW5mbzsJLy8gQVAgbWlnaHQgdXNlIHRoaXMgYWRkaXRpb25hbCBodCBpbmZvIElFCisJVUNIQVIJCQlIdENhcGFiaWxpdHlMZW47CisJVUNIQVIJCQlBZGRIdEluZm9MZW47CisJVUNIQVIJCQlOZXdFeHRDaGFubmVsT2Zmc2V0ID0gMHhmZjsKKworCWlmIChQZWVyQXNzb2NSc3BTYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbiwgQWRkcjIsICZDYXBhYmlsaXR5SW5mbywgJlN0YXR1cywgJkFpZCwgU3VwUmF0ZSwgJlN1cFJhdGVMZW4sIEV4dFJhdGUsICZFeHRSYXRlTGVuLAorCQkmSHRDYXBhYmlsaXR5LCZBZGRIdEluZm8sICZIdENhcGFiaWxpdHlMZW4sJkFkZEh0SW5mb0xlbiwmTmV3RXh0Q2hhbm5lbE9mZnNldCwgJkVkY2FQYXJtLCAmQ2tpcEZsYWcpKQorCXsKKwkJLy8gVGhlIGZyYW1lIGlzIGZvciBtZSA/CisJCWlmKE1BQ19BRERSX0VRVUFMKEFkZHIyLCBwQWQtPk1sbWVBdXguQnNzaWQpKQorCQl7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyQXNzb2NSc3BBY3Rpb24oKTpBU1NPQyAtIHJlY2VpdmUgQVNTT0NfUlNQIHRvIG1lIChzdGF0dXM9JWQpXG4iLCBTdGF0dXMpKTsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXJBc3NvY1JzcEFjdGlvbigpOk1hY1RhYmxlIFslZF0uQU1zZHVTaXplID0gJWQuIENsaWVudFN0YXR1c0ZsYWdzID0gMHglbHggXG4iLEVsZW0tPldjaWQsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQU1zZHVTaXplLCBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkNsaWVudFN0YXR1c0ZsYWdzKSk7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5Bc3NvY1RpbWVyLCAmVGltZXJDYW5jZWxsZWQpOworCQkJaWYoU3RhdHVzID09IE1MTUVfU1VDQ0VTUykKKwkJCXsKKwkJCQlVQ0hBUgkJCU1heFN1cHBvcnRlZFJhdGVJbjUwMEticHMgPSAwOworCQkJCVVDSEFSCQkJaWR4OworCisJCQkJLy8gc3VwcG9ydGVkIHJhdGVzIGFycmF5IG1heSBub3QgYmUgc29ydGVkLiBzb3J0IGl0IGFuZCBmaW5kIHRoZSBtYXhpbXVtIHJhdGUKKwkJCSAgICBmb3IgKGlkeD0wOyBpZHg8U3VwUmF0ZUxlbjsgaWR4KyspCisJCQkgICAgeworCQkJICAgICAgICBpZiAoTWF4U3VwcG9ydGVkUmF0ZUluNTAwS2JwcyA8IChTdXBSYXRlW2lkeF0gJiAweDdmKSkKKwkJCSAgICAgICAgICAgIE1heFN1cHBvcnRlZFJhdGVJbjUwMEticHMgPSBTdXBSYXRlW2lkeF0gJiAweDdmOworCQkJICAgIH0KKworCQkJCWZvciAoaWR4PTA7IGlkeDxFeHRSYXRlTGVuOyBpZHgrKykKKwkJCSAgICB7CisJCQkgICAgICAgIGlmIChNYXhTdXBwb3J0ZWRSYXRlSW41MDBLYnBzIDwgKEV4dFJhdGVbaWR4XSAmIDB4N2YpKQorCQkJICAgICAgICAgICAgTWF4U3VwcG9ydGVkUmF0ZUluNTAwS2JwcyA9IEV4dFJhdGVbaWR4XSAmIDB4N2Y7CisJCQkgICAgfQorCQkJCS8vIGdvIHRvIHByb2NlZHVyZSBsaXN0ZWQgb24gcGFnZSAzNzYKKwkJCQlBc3NvY1Bvc3RQcm9jKHBBZCwgQWRkcjIsIENhcGFiaWxpdHlJbmZvLCBBaWQsIFN1cFJhdGUsIFN1cFJhdGVMZW4sIEV4dFJhdGUsIEV4dFJhdGVMZW4sCisJCQkJCSZFZGNhUGFybSwgJkh0Q2FwYWJpbGl0eSwgSHRDYXBhYmlsaXR5TGVuLCAmQWRkSHRJbmZvKTsKKworCQkJCVN0YUFkZE1hY1RhYmxlRW50cnkocEFkLCAmcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXSwgTWF4U3VwcG9ydGVkUmF0ZUluNTAwS2JwcywgJkh0Q2FwYWJpbGl0eSwgSHRDYXBhYmlsaXR5TGVuLCBDYXBhYmlsaXR5SW5mbyk7CisKKwkJCQlwQWQtPlN0YUNmZy5Da2lwRmxhZyA9IENraXBGbGFnOworCQkJCWlmIChDa2lwRmxhZyAmIDB4MTgpCisJCQkJeworCQkJCQlOZGlzWmVyb01lbW9yeShwQWQtPlN0YUNmZy5UeFNFUSwgNCk7CisJCQkJCU5kaXNaZXJvTWVtb3J5KHBBZC0+U3RhQ2ZnLlJ4U0VRLCA0KTsKKwkJCQkJTmRpc1plcm9NZW1vcnkocEFkLT5TdGFDZmcuQ0tJUE1JQywgNCk7CisJCQkJCXBBZC0+U3RhQ2ZnLkdJVlswXSA9IFJhbmRvbUJ5dGUocEFkKTsKKwkJCQkJcEFkLT5TdGFDZmcuR0lWWzFdID0gUmFuZG9tQnl0ZShwQWQpOworCQkJCQlwQWQtPlN0YUNmZy5HSVZbMl0gPSBSYW5kb21CeXRlKHBBZCk7CisJCQkJCXBBZC0+U3RhQ2ZnLmJDa2lwT24gPSBUUlVFOworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8Q0NYPiBwQWQtPlN0YUNmZy5Da2lwRmxhZyA9IDB4JTAyeFxuIiwgcEFkLT5TdGFDZmcuQ2tpcEZsYWcpKTsKKwkJCQl9CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJLy8gRmFpbGUgb24gQXNzb2NpYXRpb24sIHdlIG5lZWQgdG8gY2hlY2sgdGhlIHN0YXR1cyBjb2RlCisJCQkJLy8gSXMgdGhhdCBhIFJvZ3VlIEFQPworI2lmZGVmIExFQVBfU1VQUE9SVAorCQkJCWlmICgocEFkLT5TdGFDZmcuTGVhcEF1dGhNb2RlID09IENJU0NPX0F1dGhNb2RlTEVBUCkgJiYgKFN0YXR1cyA9PSBNTE1FX0FMR19OT1RfU1VQUE9SVCkpCisJCQkJeyAvL1Bvc3NpYmx5IFJvZ3VlIEFQCisJCQkJCVJvZ3VlQXBUYWJsZVNldEVudHJ5KHBBZCwgJnBBZC0+U3RhQ2ZnLlJvZ3VlQXBUYWIsIHBBZC0+TWxtZUF1eC5Cc3NpZCwgTEVBUF9SRUFTT05fSU5WQUxJRF9BVVRIKTsKKwkJCQl9CisjZW5kaWYgLy8gTEVBUF9TVVBQT1JUIC8vCisJCQl9CisJCQlwQWQtPk1sbWUuQXNzb2NNYWNoaW5lLkN1cnJTdGF0ZSA9IEFTU09DX0lETEU7CisJCQlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfQVNTT0NfQ09ORiwgMiwgJlN0YXR1cyk7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVNTT0MgLSBQZWVyQXNzb2NSc3BBY3Rpb24oKSBzYW5pdHkgY2hlY2sgZmFpbFxuIikpOworCX0KK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlwZWVyIHNlbmRzIHJlYXNzb2MgcnNwCisJUGFyYW1ldHJzOgorCQlFbGVtIC0gTUxNRSBtZXNzYWdlIGNudGFpbmluZyB0aGUgcmVjZWl2ZWQgZnJhbWUKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBQZWVyUmVhc3NvY1JzcEFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisJVVNIT1JUICAgICAgQ2FwYWJpbGl0eUluZm87CisJVVNIT1JUICAgICAgU3RhdHVzOworCVVTSE9SVCAgICAgIEFpZDsKKwlVQ0hBUiAgICAgICBTdXBSYXRlW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXSwgU3VwUmF0ZUxlbjsKKwlVQ0hBUiAgICAgICBFeHRSYXRlW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXSwgRXh0UmF0ZUxlbjsKKwlVQ0hBUiAgICAgICBBZGRyMltNQUNfQUREUl9MRU5dOworCVVDSEFSICAgICAgIENraXBGbGFnOworCUJPT0xFQU4gICAgIFRpbWVyQ2FuY2VsbGVkOworCUVEQ0FfUEFSTSAgIEVkY2FQYXJtOworCUhUX0NBUEFCSUxJVFlfSUUJCUh0Q2FwYWJpbGl0eTsKKwlBRERfSFRfSU5GT19JRQkJQWRkSHRJbmZvOwkvLyBBUCBtaWdodCB1c2UgdGhpcyBhZGRpdGlvbmFsIGh0IGluZm8gSUUKKwlVQ0hBUgkJCUh0Q2FwYWJpbGl0eUxlbjsKKwlVQ0hBUgkJCUFkZEh0SW5mb0xlbjsKKwlVQ0hBUgkJCU5ld0V4dENoYW5uZWxPZmZzZXQgPSAweGZmOworCisJaWYoUGVlckFzc29jUnNwU2FuaXR5KHBBZCwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4sIEFkZHIyLCAmQ2FwYWJpbGl0eUluZm8sICZTdGF0dXMsICZBaWQsIFN1cFJhdGUsICZTdXBSYXRlTGVuLCBFeHRSYXRlLCAmRXh0UmF0ZUxlbiwKKwkJCQkJCQkJJkh0Q2FwYWJpbGl0eSwJJkFkZEh0SW5mbywgJkh0Q2FwYWJpbGl0eUxlbiwgJkFkZEh0SW5mb0xlbiwmTmV3RXh0Q2hhbm5lbE9mZnNldCwgJkVkY2FQYXJtLCAmQ2tpcEZsYWcpKQorCXsKKwkJaWYoTUFDX0FERFJfRVFVQUwoQWRkcjIsIHBBZC0+TWxtZUF1eC5Cc3NpZCkpIC8vIFRoZSBmcmFtZSBpcyBmb3IgbWUgPworCQl7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBU1NPQyAtIHJlY2VpdmUgUkVBU1NPQ19SU1AgdG8gbWUgKHN0YXR1cz0lZClcbiIsIFN0YXR1cykpOworCQkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguUmVhc3NvY1RpbWVyLCAmVGltZXJDYW5jZWxsZWQpOworCisJCQlpZihTdGF0dXMgPT0gTUxNRV9TVUNDRVNTKQorCQkJeworCQkJCS8vIGdvIHRvIHByb2NlZHVyZSBsaXN0ZWQgb24gcGFnZSAzNzYKKwkJCQlBc3NvY1Bvc3RQcm9jKHBBZCwgQWRkcjIsIENhcGFiaWxpdHlJbmZvLCBBaWQsIFN1cFJhdGUsIFN1cFJhdGVMZW4sIEV4dFJhdGUsIEV4dFJhdGVMZW4sCisJCQkJCSAmRWRjYVBhcm0sICZIdENhcGFiaWxpdHksIEh0Q2FwYWJpbGl0eUxlbiwgJkFkZEh0SW5mbyk7CisKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisjaWZuZGVmIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgICAgICAgICAgICAgaWYgKHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCAhPSBXUEFfU1VQUExJQ0FOVF9ESVNBQkxFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdW5pb24gaXdyZXFfZGF0YSAgICB3cnF1OworCisgICAgICAgICAgICAgICAgICAgIFNlbmRBc3NvY0lFc1RvV3BhU3VwcGxpY2FudChwQWQpOworICAgICAgICAgICAgICAgICAgICBtZW1zZXQoJndycXUsIDAsIHNpemVvZih3cnF1KSk7CisgICAgICAgICAgICAgICAgICAgIHdycXUuZGF0YS5mbGFncyA9IFJUX0FTU09DX0VWRU5UX0ZMQUc7CisgICAgICAgICAgICAgICAgICAgIHdpcmVsZXNzX3NlbmRfZXZlbnQocEFkLT5uZXRfZGV2LCBJV0VWQ1VTVE9NLCAmd3JxdSwgTlVMTCk7CisgICAgICAgICAgICAgICAgfQorI2VuZGlmIC8vIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCisjaWZkZWYgTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgICAgd3JxdTsKKyAgICAgICAgICAgICAgICAgICAgd2V4dF9ub3RpZnlfZXZlbnRfYXNzb2MocEFkKTsKKworICAgICAgICAgICAgICAgICAgICBtZW1zZXQod3JxdS5hcF9hZGRyLnNhX2RhdGEsIDAsIE1BQ19BRERSX0xFTik7CisgICAgICAgICAgICAgICAgICAgIG1lbWNweSh3cnF1LmFwX2FkZHIuc2FfZGF0YSwgcEFkLT5NbG1lQXV4LkJzc2lkLCBNQUNfQUREUl9MRU4pOworICAgICAgICAgICAgICAgICAgICB3aXJlbGVzc19zZW5kX2V2ZW50KHBBZC0+bmV0X2RldiwgU0lPQ0dJV0FQLCAmd3JxdSwgTlVMTCk7CisKKyAgICAgICAgICAgICAgICB9CisjZW5kaWYgLy8gTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKworCQkJfQorCisJCQkvLworCQkJLy8gQ2lzY28gTGVhcCBDQ0tNIHN1cHBvcnRlZCBSZS1hc3NvY2lhdGlvbi4KKwkJCS8vCisjaWZkZWYgTEVBUF9TVVBQT1JUCisJCQlpZiAoTEVBUF9DQ0tNX09OKHBBZCkgJiYgKHBBZC0+U3RhQ2ZnLkNDS01MaW5rVXBGbGFnID09IFRSVUUpKQorCQkJeworCQkJCWlmIChDQ0tNQXNzb2NSc3BTYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbikgPT0gVFJVRSkKKwkJCQl7CisJCQkJCXBBZC0+U3RhQ2ZnLkNraXBGbGFnID0gQ2tpcEZsYWc7CisJCQkJCWlmIChDa2lwRmxhZyAmIDB4MTgpCisJCQkJCXsKKwkJCQkJCU5kaXNaZXJvTWVtb3J5KHBBZC0+U3RhQ2ZnLlR4U0VRLCA0KTsKKwkJCQkJCU5kaXNaZXJvTWVtb3J5KHBBZC0+U3RhQ2ZnLlJ4U0VRLCA0KTsKKwkJCQkJCU5kaXNaZXJvTWVtb3J5KHBBZC0+U3RhQ2ZnLkNLSVBNSUMsIDQpOworCQkJCQkJcEFkLT5TdGFDZmcuR0lWWzBdID0gUmFuZG9tQnl0ZShwQWQpOworCQkJCQkJcEFkLT5TdGFDZmcuR0lWWzFdID0gUmFuZG9tQnl0ZShwQWQpOworCQkJCQkJcEFkLT5TdGFDZmcuR0lWWzJdID0gUmFuZG9tQnl0ZShwQWQpOworCQkJCQkJcEFkLT5TdGFDZmcuYkNraXBPbiA9IFRSVUU7CisJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8Q0NYPiBwQWQtPlN0YUNmZy5Da2lwRmxhZyA9IDB4JTAyeFxuIiwgcEFkLT5TdGFDZmcuQ2tpcEZsYWcpKTsKKwkJCQkJfQorCisJCQkJCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlID0gQVNTT0NfSURMRTsKKwkJCQkJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX1JFQVNTT0NfQ09ORiwgMiwgJlN0YXR1cyk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFTU09DIC0gQ0NLTUFzc29jUnNwU2FuaXR5KCkgc2FuaXR5IGNoZWNrIGZhaWxcbiIpKTsKKwkJCQl9CisJCQl9CisJCQllbHNlCisjZW5kaWYgLy8gTEVBUF9TVVBQT1JUIC8vCisJCQl7CisJCQkJLy8gQ2tpcEZsYWcgaXMgbm8gdXNlIGZvciByZWFzc29jaWF0ZQorCQkJCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlID0gQVNTT0NfSURMRTsKKwkJCQlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfUkVBU1NPQ19DT05GLCAyLCAmU3RhdHVzKTsKKwkJCX0KKwkJfQorCX0KKwllbHNlCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBU1NPQyAtIFBlZXJSZWFzc29jUnNwQWN0aW9uKCkgc2FuaXR5IGNoZWNrIGZhaWxcbiIpKTsKKwl9CisKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlwcm9jZWR1cmVzIG9uIElFRUUgODAyLjExLzE5OTkgcC4zNzYKKwlQYXJhbWV0cnM6CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgQXNzb2NQb3N0UHJvYygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBQVUNIQVIgcEFkZHIyLAorCUlOIFVTSE9SVCBDYXBhYmlsaXR5SW5mbywKKwlJTiBVU0hPUlQgQWlkLAorCUlOIFVDSEFSIFN1cFJhdGVbXSwKKwlJTiBVQ0hBUiBTdXBSYXRlTGVuLAorCUlOIFVDSEFSIEV4dFJhdGVbXSwKKwlJTiBVQ0hBUiBFeHRSYXRlTGVuLAorCUlOIFBFRENBX1BBUk0gcEVkY2FQYXJtLAorCUlOIEhUX0NBUEFCSUxJVFlfSUUJCSpwSHRDYXBhYmlsaXR5LAorCUlOIFVDSEFSIEh0Q2FwYWJpbGl0eUxlbiwKKwlJTiBBRERfSFRfSU5GT19JRQkJKnBBZGRIdEluZm8pCS8vIEFQIG1pZ2h0IHVzZSB0aGlzIGFkZGl0aW9uYWwgaHQgaW5mbyBJRQoreworCVVMT05HIElkeDsKKworCXBBZC0+TWxtZUF1eC5Cc3NUeXBlID0gQlNTX0lORlJBOworCUNPUFlfTUFDX0FERFIocEFkLT5NbG1lQXV4LkJzc2lkLCBwQWRkcjIpOworCXBBZC0+TWxtZUF1eC5BaWQgPSBBaWQ7CisJcEFkLT5NbG1lQXV4LkNhcGFiaWxpdHlJbmZvID0gQ2FwYWJpbGl0eUluZm8gJiBTVVBQT1JURURfQ0FQQUJJTElUWV9JTkZPOworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCS8vIFNvbWUgSFQgQVAgbWlnaHQgbG9zdCBXTU0gSUUuIFdlIGFkZCBXTU0gb3Vyc2VsdmVzLiBiZWFjdWFzZSBIVCByZXF1aXJlcyBRb1Mgb24uCisJaWYgKChIdENhcGFiaWxpdHlMZW4gPiAwKSAmJiAocEVkY2FQYXJtLT5iVmFsaWQgPT0gRkFMU0UpKQorCXsKKwkJcEVkY2FQYXJtLT5iVmFsaWQgPSBUUlVFOworCQlwRWRjYVBhcm0tPkFpZnNuWzBdID0gMzsKKwkJcEVkY2FQYXJtLT5BaWZzblsxXSA9IDc7CisJCXBFZGNhUGFybS0+QWlmc25bMl0gPSAyOworCQlwRWRjYVBhcm0tPkFpZnNuWzNdID0gMjsKKworCQlwRWRjYVBhcm0tPkN3bWluWzBdID0gNDsKKwkJcEVkY2FQYXJtLT5Dd21pblsxXSA9IDQ7CisJCXBFZGNhUGFybS0+Q3dtaW5bMl0gPSAzOworCQlwRWRjYVBhcm0tPkN3bWluWzNdID0gMjsKKworCQlwRWRjYVBhcm0tPkN3bWF4WzBdID0gMTA7CisJCXBFZGNhUGFybS0+Q3dtYXhbMV0gPSAxMDsKKwkJcEVkY2FQYXJtLT5Dd21heFsyXSA9IDQ7CisJCXBFZGNhUGFybS0+Q3dtYXhbM10gPSAzOworCisJCXBFZGNhUGFybS0+VHhvcFswXSAgPSAwOworCQlwRWRjYVBhcm0tPlR4b3BbMV0gID0gMDsKKwkJcEVkY2FQYXJtLT5UeG9wWzJdICA9IDk2OworCQlwRWRjYVBhcm0tPlR4b3BbM10gID0gNDg7CisKKwl9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwlOZGlzTW92ZU1lbW9yeSgmcEFkLT5NbG1lQXV4LkFQRWRjYVBhcm0sIHBFZGNhUGFybSwgc2l6ZW9mKEVEQ0FfUEFSTSkpOworCisJLy8gZmlsdGVyIG91dCB1bi1zdXBwb3J0ZWQgcmF0ZXMKKwlwQWQtPk1sbWVBdXguU3VwUmF0ZUxlbiA9IFN1cFJhdGVMZW47CisJTmRpc01vdmVNZW1vcnkocEFkLT5NbG1lQXV4LlN1cFJhdGUsIFN1cFJhdGUsIFN1cFJhdGVMZW4pOworCVJUTVBDaGVja1JhdGVzKHBBZCwgcEFkLT5NbG1lQXV4LlN1cFJhdGUsICZwQWQtPk1sbWVBdXguU3VwUmF0ZUxlbik7CisKKwkvLyBmaWx0ZXIgb3V0IHVuLXN1cHBvcnRlZCByYXRlcworCXBBZC0+TWxtZUF1eC5FeHRSYXRlTGVuID0gRXh0UmF0ZUxlbjsKKwlOZGlzTW92ZU1lbW9yeShwQWQtPk1sbWVBdXguRXh0UmF0ZSwgRXh0UmF0ZSwgRXh0UmF0ZUxlbik7CisJUlRNUENoZWNrUmF0ZXMocEFkLCBwQWQtPk1sbWVBdXguRXh0UmF0ZSwgJnBBZC0+TWxtZUF1eC5FeHRSYXRlTGVuKTsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCWlmIChIdENhcGFiaWxpdHlMZW4gPiAwKQorCXsKKwkJUlRNUENoZWNrSHQocEFkLCBCU1NJRF9XQ0lELCBwSHRDYXBhYmlsaXR5LCBwQWRkSHRJbmZvKTsKKwl9CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQXNzb2NQb3N0UHJvYz09PT4gIEFQLkFNc2R1U2l6ZSA9ICVkLiBDbGllbnRTdGF0dXNGbGFncyA9IDB4JWx4IFxuIiwgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5BTXNkdVNpemUsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQ2xpZW50U3RhdHVzRmxhZ3MpKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFzc29jUG9zdFByb2M9PT0+ICAgIChNbXBzPSVkLCBBbXNkdVNpemU9JWQsIClcbiIsCisJCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uTW1wc01vZGUsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQU1zZHVTaXplKSk7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwkvLyBTZXQgTmV3IFdQQSBpbmZvcm1hdGlvbgorCUlkeCA9IEJzc1RhYmxlU2VhcmNoKCZwQWQtPlNjYW5UYWIsIHBBZGRyMiwgcEFkLT5NbG1lQXV4LkNoYW5uZWwpOworCWlmIChJZHggPT0gQlNTX05PVF9GT1VORCkKKwl7CisJCURCR1BSSU5UX0VSUigoIkFTU09DIC0gQ2FuJ3QgZmluZCBCU1MgYWZ0ZXIgcmVjZWl2aW5nIEFzc29jIHJlc3BvbnNlXG4iKSk7CisJfQorCWVsc2UKKwl7CisJCS8vIEluaXQgdmFyaWFibGUKKwkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5SU05JRV9MZW4gPSAwOworCQlOZGlzWmVyb01lbW9yeShwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlJTTl9JRSwgTUFYX0xFTl9PRl9SU05JRSk7CisKKwkJLy8gU3RvcmUgYXBwcm9wcmlhdGUgUlNOX0lFIGZvciBXUEEgU00gbmVnb3RpYXRpb24gbGF0ZXIKKwkJaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpICYmIChwQWQtPlNjYW5UYWIuQnNzRW50cnlbSWR4XS5WYXJJRUxlbiAhPSAwKSkKKwkJeworCQkJUFVDSEFSICAgICAgICAgICAgICBwVklFOworCQkJVVNIT1JUICAgICAgICAgICAgICBsZW47CisJCQlQRUlEX1NUUlVDVCAgICAgICAgIHBFaWQ7CisKKwkJCXBWSUUgPSBwQWQtPlNjYW5UYWIuQnNzRW50cnlbSWR4XS5WYXJJRXM7CisJCQlsZW4JID0gcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0lkeF0uVmFySUVMZW47CisKKwkJCXdoaWxlIChsZW4gPiAwKQorCQkJeworCQkJCXBFaWQgPSAoUEVJRF9TVFJVQ1QpIHBWSUU7CisJCQkJLy8gRm9yIFdQQS9XUEFQU0sKKwkJCQlpZiAoKHBFaWQtPkVpZCA9PSBJRV9XUEEpICYmIChOZGlzRXF1YWxNZW1vcnkocEVpZC0+T2N0ZXQsIFdQQV9PVUksIDQpKQorCQkJCQkmJiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBIHx8IHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykpCisJCQkJeworCQkJCQlOZGlzTW92ZU1lbW9yeShwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlJTTl9JRSwgcFZJRSwgKHBFaWQtPkxlbiArIDIpKTsKKwkJCQkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5SU05JRV9MZW4gPSAocEVpZC0+TGVuICsgMik7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFzc29jUG9zdFByb2M9PT0+IFN0b3JlIFJTTl9JRSBmb3IgV1BBIFNNIG5lZ290aWF0aW9uIFxuIikpOworCQkJCX0KKwkJCQkvLyBGb3IgV1BBMi9XUEEyUFNLCisJCQkJZWxzZSBpZiAoKHBFaWQtPkVpZCA9PSBJRV9SU04pICYmIChOZGlzRXF1YWxNZW1vcnkocEVpZC0+T2N0ZXQgKyAyLCBSU05fT1VJLCAzKSkKKwkJCQkJJiYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIgfHwgcEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykpCisJCQkJeworCQkJCQlOZGlzTW92ZU1lbW9yeShwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlJTTl9JRSwgcFZJRSwgKHBFaWQtPkxlbiArIDIpKTsKKwkJCQkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5SU05JRV9MZW4gPSAocEVpZC0+TGVuICsgMik7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFzc29jUG9zdFByb2M9PT0+IFN0b3JlIFJTTl9JRSBmb3IgV1BBMiBTTSBuZWdvdGlhdGlvbiBcbiIpKTsKKwkJCQl9CisKKwkJCQlwVklFICs9IChwRWlkLT5MZW4gKyAyKTsKKwkJCQlsZW4gIC09IChwRWlkLT5MZW4gKyAyKTsKKwkJCX0KKwkJfQorCisJCWlmIChwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlJTTklFX0xlbiA9PSAwKQorCQl7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBc3NvY1Bvc3RQcm9jPT09PiBubyBSU05fSUUgXG4iKSk7CisJCX0KKwkJZWxzZQorCQl7CisJCQloZXhfZHVtcCgiUlNOX0lFIiwgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5SU05fSUUsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUlNOSUVfTGVuKTsKKwkJfQorCX0KK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlsZWZ0IHBhcnQgb2YgSUVFRSA4MDIuMTEvMTk5OSBwLjM3NAorCVBhcmFtZXRlcnM6CisJCUVsZW0gLSBNTE1FIG1lc3NhZ2UgY29udGFpbmluZyB0aGUgcmVjZWl2ZWQgZnJhbWUKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBQZWVyRGlzYXNzb2NBY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCVVDSEFSICAgICAgICAgQWRkcjJbTUFDX0FERFJfTEVOXTsKKwlVU0hPUlQgICAgICAgIFJlYXNvbjsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFTU09DIC0gUGVlckRpc2Fzc29jQWN0aW9uKClcbiIpKTsKKwlpZihQZWVyRGlzYXNzb2NTYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbiwgQWRkcjIsICZSZWFzb24pKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVNTT0MgLSBQZWVyRGlzYXNzb2NBY3Rpb24oKSBSZWFzb24gPSAlZFxuIiwgUmVhc29uKSk7CisJCWlmIChJTkZSQV9PTihwQWQpICYmIE1BQ19BRERSX0VRVUFMKHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBBZGRyMikpCisJCXsKKworCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJXaXJlbGVzc0V2ZW50KQorCQkJeworCQkJCVJUTVBTZW5kV2lyZWxlc3NFdmVudChwQWQsIElXX0RJU0FTU09DX0VWRU5UX0ZMQUcsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQWRkciwgQlNTMCwgMCk7CisJCQl9CisKKworI2lmZGVmIExFQVBfU1VQUE9SVAorCQkJaWYgKHBBZC0+U3RhQ2ZnLkxlYXBBdXRoTW9kZSA9PSBDSVNDT19BdXRoTW9kZUxFQVApCisJCQl7CisJCQkJLy8gQ2lzY29fTEVBUCBoYXMgc3RhcnQgYSB0aW1lcgorCQkJCS8vIFdlIHNob3VsZCBjYW5jZWwgaXQgaWYgdXNpbmcgTEVBUAorCQkJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5TdGFDZmcuTGVhcEF1dGhUaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKKwkJCQkvL0NoZWNrIGlzIGl0IG1hY2ggdGhlIExFQVAgQXV0aGVudGljYXRpb24gZmFpbGVkIGFzIHBvc3NpYmxlIGEgUm9ndWUgQVAKKwkJCQkvL29uIGl0J3MgUG9ydFNlY3VyZWQgbm90IGVxdWFsIHRvIFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEIHdoaWxlIHByb2Nlc3MgdGhlIEFzc29jaWF0aW9uLgorCQkJCWlmICgocEFkLT5NbG1lLkxlYXBNYWNoaW5lLkN1cnJTdGF0ZSAhPSBMRUFQX0lETEUpICYmIChwQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZCAhPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRCkpCisJCQkJeworCQkJCQlSb2d1ZUFwVGFibGVTZXRFbnRyeShwQWQsICZwQWQtPlN0YUNmZy5Sb2d1ZUFwVGFiLCBBZGRyMiwgTEVBUF9SRUFTT05fQVVUSF9USU1FT1VUKTsKKwkJCQl9CisJCQl9CisjZW5kaWYJLy8gTEVBUF9TVVBQT1JUIC8vCisJCQkvLworCQkJLy8gR2V0IEN1cnJlbnQgU3lzdGVtIHRpbWUgYW5kIFR1cm4gb24gQWRqYWNlbnRBUFJlcG9ydAorCQkJLy8KKwkJCU5kaXNHZXRTeXN0ZW1VcFRpbWUoJnBBZC0+U3RhQ2ZnLkNDWEFkamFjZW50QVBMaW5rRG93blRpbWUpOworCQkJcEFkLT5TdGFDZmcuQ0NYQWRqYWNlbnRBUFJlcG9ydEZsYWcgPSBUUlVFOworCQkJTGlua0Rvd24ocEFkLCBUUlVFKTsKKwkJCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlID0gQVNTT0NfSURMRTsKKworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyNpZm5kZWYgTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyAgICAgICAgICAgIGlmIChwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgIT0gV1BBX1NVUFBMSUNBTlRfRElTQUJMRSkKKwkJCXsKKyAgICAgICAgICAgICAgICB1bmlvbiBpd3JlcV9kYXRhICAgIHdycXU7CisgICAgICAgICAgICAgICAgLy9zZW5kIGRpc2Fzc29jaWF0ZSBldmVudCB0byB3cGFfc3VwcGxpY2FudAorICAgICAgICAgICAgICAgIG1lbXNldCgmd3JxdSwgMCwgc2l6ZW9mKHdycXUpKTsKKyAgICAgICAgICAgICAgICB3cnF1LmRhdGEuZmxhZ3MgPSBSVF9ESVNBU1NPQ19FVkVOVF9GTEFHOworICAgICAgICAgICAgICAgIHdpcmVsZXNzX3NlbmRfZXZlbnQocEFkLT5uZXRfZGV2LCBJV0VWQ1VTVE9NLCAmd3JxdSwgTlVMTCk7CisgICAgICAgICAgICB9CisjZW5kaWYgLy8gTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisKKyNpZmRlZiBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgICAgd3JxdTsKKyAgICAgICAgICAgICAgICBtZW1zZXQod3JxdS5hcF9hZGRyLnNhX2RhdGEsIDAsIE1BQ19BRERSX0xFTik7CisgICAgICAgICAgICAgICAgd2lyZWxlc3Nfc2VuZF9ldmVudChwQWQtPm5ldF9kZXYsIFNJT0NHSVdBUCwgJndycXUsIE5VTEwpOworICAgICAgICAgICAgfQorI2VuZGlmIC8vIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisJCX0KKwl9CisJZWxzZQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVNTT0MgLSBQZWVyRGlzYXNzb2NBY3Rpb24oKSBzYW5pdHkgY2hlY2sgZmFpbFxuIikpOworCX0KKworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCXdoYXQgdGhlIHN0YXRlIG1hY2hpbmUgd2lsbCBkbyBhZnRlciBhc3NvYyB0aW1lb3V0CisJUGFyYW1ldGVyczoKKwkJRWxtZSAtCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgQXNzb2NUaW1lb3V0QWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlVU0hPUlQgIFN0YXR1czsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBU1NPQyAtIEFzc29jVGltZW91dEFjdGlvblxuIikpOworCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlID0gQVNTT0NfSURMRTsKKwlTdGF0dXMgPSBNTE1FX1JFSl9USU1FT1VUOworCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9BU1NPQ19DT05GLCAyLCAmU3RhdHVzKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQl3aGF0IHRoZSBzdGF0ZSBtYWNoaW5lIHdpbGwgZG8gYWZ0ZXIgcmVhc3NvYyB0aW1lb3V0CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgUmVhc3NvY1RpbWVvdXRBY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCVVTSE9SVCAgU3RhdHVzOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFTU09DIC0gUmVhc3NvY1RpbWVvdXRBY3Rpb25cbiIpKTsKKwlwQWQtPk1sbWUuQXNzb2NNYWNoaW5lLkN1cnJTdGF0ZSA9IEFTU09DX0lETEU7CisJU3RhdHVzID0gTUxNRV9SRUpfVElNRU9VVDsKKwlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfUkVBU1NPQ19DT05GLCAyLCAmU3RhdHVzKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQl3aGF0IHRoZSBzdGF0ZSBtYWNoaW5lIHdpbGwgZG8gYWZ0ZXIgZGlzYXNzb2MgdGltZW91dAorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIERpc2Fzc29jVGltZW91dEFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisJVVNIT1JUICBTdGF0dXM7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVNTT0MgLSBEaXNhc3NvY1RpbWVvdXRBY3Rpb25cbiIpKTsKKwlwQWQtPk1sbWUuQXNzb2NNYWNoaW5lLkN1cnJTdGF0ZSA9IEFTU09DX0lETEU7CisJU3RhdHVzID0gTUxNRV9TVUNDRVNTOworCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9ESVNBU1NPQ19DT05GLCAyLCAmU3RhdHVzKTsKK30KKworVk9JRCBJbnZhbGlkU3RhdGVXaGVuQXNzb2MoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCVVTSE9SVCAgU3RhdHVzOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFTU09DIC0gSW52YWxpZFN0YXRlV2hlbkFzc29jKHN0YXRlPSVsZCksIHJlc2V0IEFTU09DIHN0YXRlIG1hY2hpbmVcbiIsCisJCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlKSk7CisJcEFkLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUgPSBBU1NPQ19JRExFOworCVN0YXR1cyA9IE1MTUVfU1RBVEVfTUFDSElORV9SRUpFQ1Q7CisJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX0FTU09DX0NPTkYsIDIsICZTdGF0dXMpOworfQorCitWT0lEIEludmFsaWRTdGF0ZVdoZW5SZWFzc29jKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlVU0hPUlQgU3RhdHVzOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFTU09DIC0gSW52YWxpZFN0YXRlV2hlblJlYXNzb2Moc3RhdGU9JWxkKSwgcmVzZXQgQVNTT0Mgc3RhdGUgbWFjaGluZVxuIiwKKwkJcEFkLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUpKTsKKwlwQWQtPk1sbWUuQXNzb2NNYWNoaW5lLkN1cnJTdGF0ZSA9IEFTU09DX0lETEU7CisJU3RhdHVzID0gTUxNRV9TVEFURV9NQUNISU5FX1JFSkVDVDsKKwlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfUkVBU1NPQ19DT05GLCAyLCAmU3RhdHVzKTsKK30KKworVk9JRCBJbnZhbGlkU3RhdGVXaGVuRGlzYXNzb2NpYXRlKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlVU0hPUlQgU3RhdHVzOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFTU09DIC0gSW52YWxpZFN0YXRlV2hlbkRpc2Fzc29jKHN0YXRlPSVsZCksIHJlc2V0IEFTU09DIHN0YXRlIG1hY2hpbmVcbiIsCisJCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlKSk7CisJcEFkLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUgPSBBU1NPQ19JRExFOworCVN0YXR1cyA9IE1MTUVfU1RBVEVfTUFDSElORV9SRUpFQ1Q7CisJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX0RJU0FTU09DX0NPTkYsIDIsICZTdGF0dXMpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCXJpZ2h0IHBhcnQgb2YgSUVFRSA4MDIuMTEvMTk5OSBwYWdlIDM3NAorCU5vdGU6CisJCVRoaXMgZXZlbnQgc2hvdWxkIG5ldmVyIGNhdXNlIEFTU09DIHN0YXRlIG1hY2hpbmUgcGVyZm9ybSBzdGF0ZQorCQl0cmFuc2l0aW9uLCBhbmQgaGFzIG5vIHJlbGF0aW9uc2hpcCB3aXRoIENOVEwgbWFjaGluZS4gU28gd2Ugc2VwYXJhdGUKKwkJdGhpcyByb3V0aW5lIGFzIGEgc2VydmljZSBvdXRzaWRlIG9mIEFTU09DIHN0YXRlIHRyYW5zaXRpb24gdGFibGUuCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgQ2xzM2VyckFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBQVUNIQVIgICAgICAgIHBBZGRyKQoreworCUhFQURFUl84MDJfMTEgICAgICAgICBEaXNhc3NvY0hkcjsKKwlQSEVBREVSXzgwMl8xMSAgICAgICAgcERpc2Fzc29jSGRyOworCVBVQ0hBUiAgICAgICAgICAgICAgICBwT3V0QnVmZmVyID0gTlVMTDsKKwlVTE9ORyAgICAgICAgICAgICAgICAgRnJhbWVMZW4gPSAwOworCU5ESVNfU1RBVFVTICAgICAgICAgICBOU3RhdHVzOworCVVTSE9SVCAgICAgICAgICAgICAgICBSZWFzb24gPSBSRUFTT05fQ0xTM0VSUjsKKworCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5CisJaWYgKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJcmV0dXJuOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVNTT0MgLSBDbGFzcyAzIEVycm9yLCBTZW5kIERJU0FTU09DIGZyYW1lXG4iKSk7CisJTWd0TWFjSGVhZGVySW5pdChwQWQsICZEaXNhc3NvY0hkciwgU1VCVFlQRV9ESVNBU1NPQywgMCwgcEFkZHIsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsJLy8gcGF0Y2ggcGVhcCB0dGxzIHN3aXRjaGluZyBpc3N1ZQorCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAgICAmRnJhbWVMZW4sCisJCQkJCSAgc2l6ZW9mKEhFQURFUl84MDJfMTEpLCZEaXNhc3NvY0hkciwKKwkJCQkJICAyLCAgICAgICAgICAgICAgICAgICAgJlJlYXNvbiwKKwkJCQkJICBFTkRfT0ZfQVJHUyk7CisJTWluaXBvcnRNTVJlcXVlc3QocEFkLCAwLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7CisKKwkvLyBUbyBwYXRjaCBJbnN0YW5jZSBhbmQgQnVmZmFsbyhOKSBBUAorCS8vIERyaXZlciBoYXMgdG8gc2VuZCBkZWF1dGggdG8gSW5zdGFuY2UgQVAsIGJ1dCBCdWZmYWxvKE4pIG5lZWRzIHRvIHNlbmQgZGlzYXNzb2MgdG8gcmVzZXQgQXV0aGVudGljYXRvcidzIHN0YXRlIG1hY2hpbmUKKwkvLyBUaGVyZWZvcmUsIHdlIHNlbmQgYm90aCBvZiB0aGVtLgorCXBEaXNhc3NvY0hkciA9IChQSEVBREVSXzgwMl8xMSlwT3V0QnVmZmVyOworCXBEaXNhc3NvY0hkci0+RkMuU3ViVHlwZSA9IFNVQlRZUEVfREVBVVRIOworCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgMCwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOworCisJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKKworCXBBZC0+U3RhQ2ZnLkRpc2Fzc29jUmVhc29uID0gUkVBU09OX0NMUzNFUlI7CisJQ09QWV9NQUNfQUREUihwQWQtPlN0YUNmZy5EaXNhc3NvY1N0YSwgcEFkZHIpOworfQorCisgLyoKKwkgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkgRGVzY3JpcHRpb246CisJCSBTd2l0Y2ggYmV0d2VlbiBXRVAgYW5kIENLSVAgdXBvbiBuZXcgYXNzb2NpYXRpb24gdXAuCisJIFBhcmFtZXRlcnM6CisKKwkgSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwkgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgKi8KK1ZPSUQgU3dpdGNoQmV0d2VlbldlcEFuZENraXAoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJaW50ICAgICAgICAgICAgaTsKKwlTSEFSRURLRVlfTU9ERV9TVFJVQyAgY3NyMTsKKworCS8vIGlmIEtQIGlzIHJlcXVpcmVkLiBjaGFuZ2UgdGhlIENpcGhlckFsZyBpbiBoYXJkd2FyZSBzaGFyZCBrZXkgdGFibGUgZnJvbSBXRVAKKwkvLyB0byBDS0lQLiBlbHNlIHJlbWFpbiBhcyBXRVAKKwlpZiAocEFkLT5TdGFDZmcuYkNraXBPbiAmJiAocEFkLT5TdGFDZmcuQ2tpcEZsYWcgJiAweDEwKSkKKwl7CisJCS8vIG1vZGlmeSBoYXJkd2FyZSBrZXkgdGFibGUgc28gdGhhdCBNQUMgdXNlIGNvcnJlY3QgYWxnb3JpdGhtIHRvIGRlY3J5cHQgUlgKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBTSEFSRURfS0VZX01PREVfQkFTRSwgJmNzcjEud29yZCk7CisJCWlmIChjc3IxLmZpZWxkLkJzczBLZXkwQ2lwaGVyQWxnID09IENJUEhFUl9XRVA2NCkKKwkJCWNzcjEuZmllbGQuQnNzMEtleTBDaXBoZXJBbGcgPSBDSVBIRVJfQ0tJUDY0OworCQllbHNlIGlmIChjc3IxLmZpZWxkLkJzczBLZXkwQ2lwaGVyQWxnID09IENJUEhFUl9XRVAxMjgpCisJCQljc3IxLmZpZWxkLkJzczBLZXkwQ2lwaGVyQWxnID0gQ0lQSEVSX0NLSVAxMjg7CisKKwkJaWYgKGNzcjEuZmllbGQuQnNzMEtleTFDaXBoZXJBbGcgPT0gQ0lQSEVSX1dFUDY0KQorCQkJY3NyMS5maWVsZC5Cc3MwS2V5MUNpcGhlckFsZyA9IENJUEhFUl9DS0lQNjQ7CisJCWVsc2UgaWYgKGNzcjEuZmllbGQuQnNzMEtleTFDaXBoZXJBbGcgPT0gQ0lQSEVSX1dFUDEyOCkKKwkJCWNzcjEuZmllbGQuQnNzMEtleTFDaXBoZXJBbGcgPSBDSVBIRVJfQ0tJUDEyODsKKworCQlpZiAoY3NyMS5maWVsZC5Cc3MwS2V5MkNpcGhlckFsZyA9PSBDSVBIRVJfV0VQNjQpCisJCQljc3IxLmZpZWxkLkJzczBLZXkyQ2lwaGVyQWxnID0gQ0lQSEVSX0NLSVA2NDsKKwkJZWxzZSBpZiAoY3NyMS5maWVsZC5Cc3MwS2V5MkNpcGhlckFsZyA9PSBDSVBIRVJfV0VQMTI4KQorCQkJY3NyMS5maWVsZC5Cc3MwS2V5MkNpcGhlckFsZyA9IENJUEhFUl9DS0lQMTI4OworCisJCWlmIChjc3IxLmZpZWxkLkJzczBLZXkzQ2lwaGVyQWxnID09IENJUEhFUl9XRVA2NCkKKwkJCWNzcjEuZmllbGQuQnNzMEtleTNDaXBoZXJBbGcgPSBDSVBIRVJfQ0tJUDY0OworCQllbHNlIGlmIChjc3IxLmZpZWxkLkJzczBLZXkzQ2lwaGVyQWxnID09IENJUEhFUl9XRVAxMjgpCisJCQljc3IxLmZpZWxkLkJzczBLZXkzQ2lwaGVyQWxnID0gQ0lQSEVSX0NLSVAxMjg7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFNIQVJFRF9LRVlfTU9ERV9CQVNFLCBjc3IxLndvcmQpOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTd2l0Y2hCZXR3ZWVuV2VwQW5kQ2tpcDogbW9kaWZ5IEJTUzAgY2lwaGVyIHRvICVzXG4iLCBDaXBoZXJOYW1lW2NzcjEuZmllbGQuQnNzMEtleTBDaXBoZXJBbGddKSk7CisKKwkJLy8gbW9kaWZ5IHNvZnR3YXJlIGtleSB0YWJsZSBzbyB0aGF0IGRyaXZlciBjYW4gc3BlY2lmeSBjb3JyZWN0IGFsZ29yaXRobSBpbiBUWEQgdXBvbiBUWAorCQlmb3IgKGk9MDsgaTxTSEFSRV9LRVlfTlVNOyBpKyspCisJCXsKKwkJCWlmIChwQWQtPlNoYXJlZEtleVtCU1MwXVtpXS5DaXBoZXJBbGcgPT0gQ0lQSEVSX1dFUDY0KQorCQkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW2ldLkNpcGhlckFsZyA9IENJUEhFUl9DS0lQNjQ7CisJCQllbHNlIGlmIChwQWQtPlNoYXJlZEtleVtCU1MwXVtpXS5DaXBoZXJBbGcgPT0gQ0lQSEVSX1dFUDEyOCkKKwkJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtpXS5DaXBoZXJBbGcgPSBDSVBIRVJfQ0tJUDEyODsKKwkJfQorCX0KKworCS8vIGVsc2UgaWYgS1AgTk9UIGludXNlZC4gY2hhbmdlIHRoZSBDaXBoZXJBbGcgaW4gaGFyZHdhcmUgc2hhcmQga2V5IHRhYmxlIGZyb20gQ0tJUAorCS8vIHRvIFdFUC4KKwllbHNlCisJeworCQkvLyBtb2RpZnkgaGFyZHdhcmUga2V5IHRhYmxlIHNvIHRoYXQgTUFDIHVzZSBjb3JyZWN0IGFsZ29yaXRobSB0byBkZWNyeXB0IFJYCisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgU0hBUkVEX0tFWV9NT0RFX0JBU0UsICZjc3IxLndvcmQpOworCQlpZiAoY3NyMS5maWVsZC5Cc3MwS2V5MENpcGhlckFsZyA9PSBDSVBIRVJfQ0tJUDY0KQorCQkJY3NyMS5maWVsZC5Cc3MwS2V5MENpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKKwkJZWxzZSBpZiAoY3NyMS5maWVsZC5Cc3MwS2V5MENpcGhlckFsZyA9PSBDSVBIRVJfQ0tJUDEyOCkKKwkJCWNzcjEuZmllbGQuQnNzMEtleTBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OworCisJCWlmIChjc3IxLmZpZWxkLkJzczBLZXkxQ2lwaGVyQWxnID09IENJUEhFUl9DS0lQNjQpCisJCQljc3IxLmZpZWxkLkJzczBLZXkxQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OworCQllbHNlIGlmIChjc3IxLmZpZWxkLkJzczBLZXkxQ2lwaGVyQWxnID09IENJUEhFUl9DS0lQMTI4KQorCQkJY3NyMS5maWVsZC5Cc3MwS2V5MUNpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7CisKKwkJaWYgKGNzcjEuZmllbGQuQnNzMEtleTJDaXBoZXJBbGcgPT0gQ0lQSEVSX0NLSVA2NCkKKwkJCWNzcjEuZmllbGQuQnNzMEtleTJDaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7CisJCWVsc2UgaWYgKGNzcjEuZmllbGQuQnNzMEtleTJDaXBoZXJBbGcgPT0gQ0lQSEVSX0NLSVAxMjgpCisJCQljc3IxLmZpZWxkLkJzczBLZXkyQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDEyODsKKworCQlpZiAoY3NyMS5maWVsZC5Cc3MwS2V5M0NpcGhlckFsZyA9PSBDSVBIRVJfQ0tJUDY0KQorCQkJY3NyMS5maWVsZC5Cc3MwS2V5M0NpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKKwkJZWxzZSBpZiAoY3NyMS5maWVsZC5Cc3MwS2V5M0NpcGhlckFsZyA9PSBDSVBIRVJfQ0tJUDEyOCkKKwkJCWNzcjEuZmllbGQuQnNzMEtleTNDaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OworCisJCS8vIG1vZGlmeSBzb2Z0d2FyZSBrZXkgdGFibGUgc28gdGhhdCBkcml2ZXIgY2FuIHNwZWNpZnkgY29ycmVjdCBhbGdvcml0aG0gaW4gVFhEIHVwb24gVFgKKwkJZm9yIChpPTA7IGk8U0hBUkVfS0VZX05VTTsgaSsrKQorCQl7CisJCQlpZiAocEFkLT5TaGFyZWRLZXlbQlNTMF1baV0uQ2lwaGVyQWxnID09IENJUEhFUl9DS0lQNjQpCisJCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1baV0uQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OworCQkJZWxzZSBpZiAocEFkLT5TaGFyZWRLZXlbQlNTMF1baV0uQ2lwaGVyQWxnID09IENJUEhFUl9DS0lQMTI4KQorCQkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW2ldLkNpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7CisJCX0KKworCQkvLworCQkvLyBPbiBXUEEtTk9ORSwgbXVzdCB1cGRhdGUgQ2lwaGVyQWxnLgorCQkvLyBCZWNhdXNlIHRoZSBPSURfODAyXzExX1dFUF9TVEFUVVMgd2FzIGJlZW4gc2V0IGFmdGVyIE9JRF84MDJfMTFfQUREX0tFWQorCQkvLyBhbmQgQ2lwaGVyQWxnIHdpbGwgYmUgQ0lQSEVSX05PTkUgYnkgV2luZG93cyBaZXJvQ29uZmlnLgorCQkvLyBTbyB3ZSBuZWVkIHRvIHVwZGF0ZSBDaXBoZXJBbGcgYWZ0ZXIgY29ubmVjdC4KKwkJLy8KKwkJaWYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmUpCisJCXsKKwkJCWZvciAoaSA9IDA7IGkgPCBTSEFSRV9LRVlfTlVNOyBpKyspCisJCQl7CisJCQkJaWYgKHBBZC0+U2hhcmVkS2V5W0JTUzBdW2ldLktleUxlbiAhPSAwKQorCQkJCXsKKwkJCQkJaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKQorCQkJCQl7CisJCQkJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtpXS5DaXBoZXJBbGcgPSBDSVBIRVJfVEtJUDsKKwkJCQkJfQorCQkJCQllbHNlIGlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKKwkJCQkJeworCQkJCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1baV0uQ2lwaGVyQWxnID0gQ0lQSEVSX0FFUzsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtpXS5DaXBoZXJBbGcgPSBDSVBIRVJfTk9ORTsKKwkJCQl9CisJCQl9CisKKwkJCWNzcjEuZmllbGQuQnNzMEtleTBDaXBoZXJBbGcgPSBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGc7CisJCQljc3IxLmZpZWxkLkJzczBLZXkxQ2lwaGVyQWxnID0gcEFkLT5TaGFyZWRLZXlbQlNTMF1bMV0uQ2lwaGVyQWxnOworCQkJY3NyMS5maWVsZC5Cc3MwS2V5MkNpcGhlckFsZyA9IHBBZC0+U2hhcmVkS2V5W0JTUzBdWzJdLkNpcGhlckFsZzsKKwkJCWNzcjEuZmllbGQuQnNzMEtleTNDaXBoZXJBbGcgPSBwQWQtPlNoYXJlZEtleVtCU1MwXVszXS5DaXBoZXJBbGc7CisJCX0KKwkJUlRNUF9JT19XUklURTMyKHBBZCwgU0hBUkVEX0tFWV9NT0RFX0JBU0UsIGNzcjEud29yZCk7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlN3aXRjaEJldHdlZW5XZXBBbmRDa2lwOiBtb2RpZnkgQlNTMCBjaXBoZXIgdG8gJXNcbiIsIENpcGhlck5hbWVbY3NyMS5maWVsZC5Cc3MwS2V5MENpcGhlckFsZ10pKTsKKwl9Cit9CisKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisjaWZuZGVmIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUCitWT0lEICAgIFNlbmRBc3NvY0lFc1RvV3BhU3VwcGxpY2FudCgKKyAgICBJTiAgUFJUTVBfQURBUFRFUiBwQWQpCit7CisgICAgdW5pb24gaXdyZXFfZGF0YSAgICB3cnF1OworICAgIHVuc2lnbmVkIGNoYXIgY3VzdG9tW0lXX0NVU1RPTV9NQVhdID0gezB9OworCisgICAgaWYgKChwQWQtPlN0YUNmZy5SZXFWYXJJRUxlbiArIDE3KSA8PSBJV19DVVNUT01fTUFYKQorICAgIHsKKyAgICAgICAgc3ByaW50ZihjdXN0b20sICJBU1NPQ0lORk9fUmVxSUVzPSIpOworCSAgICBOZGlzTW92ZU1lbW9yeShjdXN0b20rMTcsIHBBZC0+U3RhQ2ZnLlJlcVZhcklFcywgcEFkLT5TdGFDZmcuUmVxVmFySUVMZW4pOworCSAgICBtZW1zZXQoJndycXUsIDAsIHNpemVvZih3cnF1KSk7CisgICAgICAgIHdycXUuZGF0YS5sZW5ndGggPSBwQWQtPlN0YUNmZy5SZXFWYXJJRUxlbiArIDE3OworICAgICAgICB3cnF1LmRhdGEuZmxhZ3MgPSBSVF9SRVFJRV9FVkVOVF9GTEFHOworICAgICAgICB3aXJlbGVzc19zZW5kX2V2ZW50KHBBZC0+bmV0X2RldiwgSVdFVkNVU1RPTSwgJndycXUsIGN1c3RvbSk7CisKKyAgICAgICAgbWVtc2V0KCZ3cnF1LCAwLCBzaXplb2Yod3JxdSkpOworICAgICAgICB3cnF1LmRhdGEuZmxhZ3MgPSBSVF9BU1NPQ0lORk9fRVZFTlRfRkxBRzsKKyAgICAgICAgd2lyZWxlc3Nfc2VuZF9ldmVudChwQWQtPm5ldF9kZXYsIElXRVZDVVNUT00sICZ3cnF1LCBOVUxMKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJwQWQtPlN0YUNmZy5SZXFWYXJJRUxlbiArIDE3ID4gTUFYX0NVU1RPTV9MRU5cbiIpKTsKKworICAgIHJldHVybjsKK30KKyNlbmRpZiAvLyBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKworI2lmZGVmIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUCitpbnQgd2V4dF9ub3RpZnlfZXZlbnRfYXNzb2MoCisJSU4gIFJUTVBfQURBUFRFUiAqcEFkKQoreworICAgIHVuaW9uIGl3cmVxX2RhdGEgICAgd3JxdTsKKyAgICBjaGFyIGN1c3RvbVtJV19DVVNUT01fTUFYXSA9IHswfTsKKworI2lmIFdJUkVMRVNTX0VYVCA+IDE3CisgICAgaWYgKHBBZC0+U3RhQ2ZnLlJlcVZhcklFTGVuIDw9IElXX0NVU1RPTV9NQVgpCisgICAgeworICAgICAgICB3cnF1LmRhdGEubGVuZ3RoID0gcEFkLT5TdGFDZmcuUmVxVmFySUVMZW47CisgICAgICAgIG1lbWNweShjdXN0b20sIHBBZC0+U3RhQ2ZnLlJlcVZhcklFcywgcEFkLT5TdGFDZmcuUmVxVmFySUVMZW4pOworICAgICAgICB3aXJlbGVzc19zZW5kX2V2ZW50KHBBZC0+bmV0X2RldiwgSVdFVkFTU09DUkVRSUUsICZ3cnF1LCBjdXN0b20pOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoInBBZC0+U3RhQ2ZnLlJlcVZhcklFTGVuID4gTUFYX0NVU1RPTV9MRU5cbiIpKTsKKyNlbHNlCisgICAgaWYgKCgocEFkLT5TdGFDZmcuUmVxVmFySUVMZW4qMikgKyAxNykgPD0gSVdfQ1VTVE9NX01BWCkKKyAgICB7CisgICAgICAgIFVDSEFSICAgaWR4OworICAgICAgICB3cnF1LmRhdGEubGVuZ3RoID0gKHBBZC0+U3RhQ2ZnLlJlcVZhcklFTGVuKjIpICsgMTc7CisgICAgICAgIHNwcmludGYoY3VzdG9tLCAiQVNTT0NJTkZPKFJlcUlFcz0iKTsKKyAgICAgICAgZm9yIChpZHg9MDsgaWR4PHBBZC0+U3RhQ2ZnLlJlcVZhcklFTGVuOyBpZHgrKykKKyAgICAgICAgICAgICAgICBzcHJpbnRmKGN1c3RvbSwgIiVzJTAyeCIsIGN1c3RvbSwgcEFkLT5TdGFDZmcuUmVxVmFySUVzW2lkeF0pOworICAgICAgICB3aXJlbGVzc19zZW5kX2V2ZW50KHBBZC0+bmV0X2RldiwgSVdFVkNVU1RPTSwgJndycXUsIGN1c3RvbSk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiKHBBZC0+U3RhQ2ZnLlJlcVZhcklFTGVuKjIpICsgMTcgPiBNQVhfQ1VTVE9NX0xFTlxuIikpOworI2VuZGlmCisKKwlyZXR1cm4gMDsKKworfQorI2VuZGlmIC8vIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisKKworQk9PTEVBTiBTdGFBZGRNYWNUYWJsZUVudHJ5KAorCUlOICBQUlRNUF9BREFQVEVSCQlwQWQsCisJSU4gIFBNQUNfVEFCTEVfRU5UUlkJcEVudHJ5LAorCUlOICBVQ0hBUgkJCQlNYXhTdXBwb3J0ZWRSYXRlSW41MDBLYnBzLAorCUlOICBIVF9DQVBBQklMSVRZX0lFCSpwSHRDYXBhYmlsaXR5LAorCUlOICBVQ0hBUgkJCQlIdENhcGFiaWxpdHlMZW4sCisJSU4gIFVTSE9SVCAgICAgICAgCQlDYXBhYmlsaXR5SW5mbykKK3sKKwlVQ0hBUiAgICAgICAgICAgIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzExOworCisJaWYgKEFESE9DX09OKHBBZCkpCisJCUNMSUVOVF9TVEFUVVNfQ0xFQVJfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX1dNTV9DQVBBQkxFKTsKKworCXN3aXRjaCAoTWF4U3VwcG9ydGVkUmF0ZUluNTAwS2JwcykKKyAgICB7CisgICAgICAgIGNhc2UgMTA4OiBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV81NDsgICBicmVhazsKKyAgICAgICAgY2FzZSA5NjogIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzQ4OyAgIGJyZWFrOworICAgICAgICBjYXNlIDcyOiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMzY7ICAgYnJlYWs7CisgICAgICAgIGNhc2UgNDg6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8yNDsgICBicmVhazsKKyAgICAgICAgY2FzZSAzNjogIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzE4OyAgIGJyZWFrOworICAgICAgICBjYXNlIDI0OiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMTI7ICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTg6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV85OyAgICBicmVhazsKKyAgICAgICAgY2FzZSAxMjogIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzY7ICAgIGJyZWFrOworICAgICAgICBjYXNlIDIyOiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMTE7ICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTE6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV81XzU7ICBicmVhazsKKyAgICAgICAgY2FzZSA0OiAgIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzI7ICAgIGJyZWFrOworICAgICAgICBjYXNlIDI6ICAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMTsgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8xMTsgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExRykgJiYgKE1heFN1cHBvcnRlZFJhdGUgPCBSQVRFX0ZJUlNUX09GRE1fUkFURSkpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCS8vIDExbiBvbmx5CisJaWYgKCgocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFOXzJfNEcpIHx8IChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMU5fNUcpKSYmIChIdENhcGFiaWxpdHlMZW4gPT0gMCkpCisJCXJldHVybiBGQUxTRTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCWlmICghcEVudHJ5KQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKwlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPk1hY1RhYkxvY2spOworCWlmIChwRW50cnkpCisJeworCQlwRW50cnktPlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQ7CisJCWlmICgoTWF4U3VwcG9ydGVkUmF0ZSA8IFJBVEVfRklSU1RfT0ZETV9SQVRFKSB8fAorCQkJKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQikpCisJCXsKKwkJCXBFbnRyeS0+UmF0ZUxlbiA9IDQ7CisJCQlpZiAoTWF4U3VwcG9ydGVkUmF0ZSA+PSBSQVRFX0ZJUlNUX09GRE1fUkFURSkKKwkJCQlNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8xMTsKKwkJfQorCQllbHNlCisJCQlwRW50cnktPlJhdGVMZW4gPSAxMjsKKworCQlwRW50cnktPk1heEhUUGh5TW9kZS53b3JkID0gMDsKKwkJcEVudHJ5LT5NaW5IVFBoeU1vZGUud29yZCA9IDA7CisJCXBFbnRyeS0+SFRQaHlNb2RlLndvcmQgPSAwOworCQlwRW50cnktPk1heFN1cHBvcnRlZFJhdGUgPSBNYXhTdXBwb3J0ZWRSYXRlOworCQlpZiAocEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlIDwgUkFURV9GSVJTVF9PRkRNX1JBVEUpCisJCXsKKwkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX0NDSzsKKwkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1DUyA9IHBFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZTsKKwkJCXBFbnRyeS0+TWluSFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX0NDSzsKKwkJCXBFbnRyeS0+TWluSFRQaHlNb2RlLmZpZWxkLk1DUyA9IHBFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZTsKKwkJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX0NDSzsKKwkJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1DUyA9IHBFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX09GRE07CisJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NQ1MgPSBPZmRtUmF0ZVRvUnh3aU1DU1twRW50cnktPk1heFN1cHBvcnRlZFJhdGVdOworCQkJcEVudHJ5LT5NaW5IVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfT0ZETTsKKwkJCXBFbnRyeS0+TWluSFRQaHlNb2RlLmZpZWxkLk1DUyA9IE9mZG1SYXRlVG9SeHdpTUNTW3BFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZV07CisJCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9PRkRNOworCQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTID0gT2ZkbVJhdGVUb1J4d2lNQ1NbcEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlXTsKKwkJfQorCQlwRW50cnktPkNhcGFiaWxpdHlJbmZvID0gQ2FwYWJpbGl0eUluZm87CisJCUNMSUVOVF9TVEFUVVNfQ0xFQVJfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX0FHR1JFR0FUSU9OX0NBUEFCTEUpOworCQlDTElFTlRfU1RBVFVTX0NMRUFSX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19QSUdHWUJBQ0tfQ0FQQUJMRSk7CisJfQorCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJLy8gSWYgdGhpcyBFbnRyeSBzdXBwb3J0cyA4MDIuMTFuLCB1cGdyYWRlIHRvIEhUIHJhdGUuCisJaWYgKChIdENhcGFiaWxpdHlMZW4gIT0gMCkgJiYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCkpCisJeworCQlVQ0hBUglqLCBiaXRtYXNrOyAvL2ssYml0bWFzazsKKwkJQ0hBUiAgICBpOworCisJCWlmIChBREhPQ19PTihwQWQpKQorCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX1dNTV9DQVBBQkxFKTsKKwkJaWYgKChwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uR0YpICYmIChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuR0YpKQorCQl7CisJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9IVEdSRUVORklFTEQ7CisJCX0KKwkJZWxzZQorCQl7CisJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9IVE1JWDsKKwkJCXBBZC0+TWFjVGFiLmZBbnlTdGF0aW9uTm9uR0YgPSBUUlVFOworCQkJcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLkFkZEh0SW5mbzIuTm9uR2ZQcmVzZW50ID0gMTsKKwkJfQorCisJCWlmICgocEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLkNoYW5uZWxXaWR0aCkgJiYgKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5DaGFubmVsV2lkdGgpKQorCQl7CisJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5CVz0gQldfNDA7CisJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5TaG9ydEdJID0gKChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuU2hvcnRHSWZvcjQwKSYocEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLlNob3J0R0lmb3I0MCkpOworCQl9CisJCWVsc2UKKwkJeworCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuQlcgPSBCV18yMDsKKwkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLlNob3J0R0kgPSAoKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5TaG9ydEdJZm9yMjApJihwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uU2hvcnRHSWZvcjIwKSk7CisJCQlwQWQtPk1hY1RhYi5mQW55U3RhdGlvbjIwT25seSA9IFRSVUU7CisJCX0KKworCQkvLyAzKjMKKwkJaWYgKHBBZC0+TUFDVmVyc2lvbiA+PSBSQUxJTktfMjg4M19WRVJTSU9OICYmIHBBZC0+TUFDVmVyc2lvbiA8IFJBTElOS18zMDcwX1ZFUlNJT04pCisJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5UeEJGID0gcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLlR4QkY7CisKKwkJLy8gZmluZCBtYXggZml4ZWQgcmF0ZQorCQlmb3IgKGk9MjM7IGk+PTA7IGktLSkgLy8gMyozCisJCXsKKwkJCWogPSBpLzg7CisJCQliaXRtYXNrID0gKDE8PChpLShqKjgpKSk7CisJCQlpZiAoKHBBZC0+U3RhQ2ZnLkRlc2lyZWRIdFBoeUluZm8uTUNTU2V0W2pdICYgYml0bWFzaykgJiYgKHBIdENhcGFiaWxpdHktPk1DU1NldFtqXSAmIGJpdG1hc2spKQorCQkJeworCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1DUyA9IGk7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoaT09MCkKKwkJCQlicmVhazsKKwkJfQorCisKKwkJaWYgKHBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTICE9IE1DU19BVVRPKQorCQl7CisJCQlpZiAocEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPT0gMzIpCisJCQl7CisJCQkJLy8gRml4IE1DUyBhcyBIVCBEdXBsaWNhdGVkIE1vZGUKKwkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5CVyA9IDE7CisJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfSFRNSVg7CisJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuU1RCQyA9IDA7CisJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuU2hvcnRHSSA9IDA7CisJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTUNTID0gMzI7CisJCQl9CisJCQllbHNlIGlmIChwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NQ1MgPiBwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTUNTKQorCQkJeworCQkJCS8vIFNUQSBzdXBwb3J0cyBmaXhlZCBNQ1MKKwkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NQ1MgPSBwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTUNTOworCQkJfQorCQl9CisKKwkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuU1RCQyA9IChwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uUnhTVEJDICYgKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5UeFNUQkMpKTsKKwkJcEVudHJ5LT5NcGR1RGVuc2l0eSA9IHBIdENhcGFiaWxpdHktPkh0Q2FwUGFybS5NcGR1RGVuc2l0eTsKKwkJcEVudHJ5LT5NYXhSQW1wZHVGYWN0b3IgPSBwSHRDYXBhYmlsaXR5LT5IdENhcFBhcm0uTWF4UkFtcGR1RmFjdG9yOworCQlwRW50cnktPk1tcHNNb2RlID0gKFVDSEFSKXBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5NaW1vUHM7CisJCXBFbnRyeS0+QU1zZHVTaXplID0gKFVDSEFSKXBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5BTXNkdVNpemU7CisJCXBFbnRyeS0+SFRQaHlNb2RlLndvcmQgPSBwRW50cnktPk1heEhUUGh5TW9kZS53b3JkOworCisJCWlmIChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQW1zZHVFbmFibGUgJiYgKHBBZC0+Q29tbW9uQ2ZnLlJFR0JBQ2FwYWJpbGl0eS5maWVsZC5BdXRvQkEgPT0gRkFMU0UpKQorCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX0FNU0RVX0lOVVNFRCk7CisJCWlmIChwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uU2hvcnRHSWZvcjIwKQorCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX1NHSTIwX0NBUEFCTEUpOworCQlpZiAocEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLlNob3J0R0lmb3I0MCkKKwkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19TR0k0MF9DQVBBQkxFKTsKKwkJaWYgKHBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5UeFNUQkMpCisJCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfVHhTVEJDX0NBUEFCTEUpOworCQlpZiAocEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLlJ4U1RCQykKKwkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19SeFNUQkNfQ0FQQUJMRSk7CisJCWlmIChwSHRDYXBhYmlsaXR5LT5FeHRIdENhcEluZm8uUGx1c0hUQykKKwkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19IVENfQ0FQQUJMRSk7CisJCWlmIChwQWQtPkNvbW1vbkNmZy5iUmRnICYmIHBIdENhcGFiaWxpdHktPkV4dEh0Q2FwSW5mby5SREdTdXBwb3J0KQorCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX1JER19DQVBBQkxFKTsKKwkJaWYgKHBIdENhcGFiaWxpdHktPkV4dEh0Q2FwSW5mby5NQ1NGZWVkYmFjayA9PSAweDAzKQorCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX01DU0ZFRURCQUNLX0NBUEFCTEUpOworCX0KKwllbHNlCisJeworCQlwQWQtPk1hY1RhYi5mQW55U3RhdGlvbklzTGVnYWN5ID0gVFJVRTsKKwl9CisKKwlOZGlzTW92ZU1lbW9yeSgmcEVudHJ5LT5IVENhcGFiaWxpdHksIHBIdENhcGFiaWxpdHksIHNpemVvZihIVF9DQVBBQklMSVRZX0lFKSk7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwlwRW50cnktPkhUUGh5TW9kZS53b3JkID0gcEVudHJ5LT5NYXhIVFBoeU1vZGUud29yZDsKKwlwRW50cnktPkN1cnJUeFJhdGUgPSBwRW50cnktPk1heFN1cHBvcnRlZFJhdGU7CisKKwkvLyBTZXQgYXNpYyBhdXRvIGZhbGwgYmFjaworCWlmIChwQWQtPlN0YUNmZy5iQXV0b1R4UmF0ZVN3aXRjaCA9PSBUUlVFKQorCXsKKwkJUFVDSEFSCQkJCQlwVGFibGU7CisJCVVDSEFSCQkJCQlUYWJsZVNpemUgPSAwOworCisJCU1sbWVTZWxlY3RUeFJhdGVUYWJsZShwQWQsIHBFbnRyeSwgJnBUYWJsZSwgJlRhYmxlU2l6ZSwgJnBFbnRyeS0+Q3VyclR4UmF0ZUluZGV4KTsKKwkJcEVudHJ5LT5iQXV0b1R4UmF0ZVN3aXRjaCA9IFRSVUU7CisJfQorCWVsc2UKKwl7CisJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1PREUJPSBwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTU9ERTsKKwkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTCT0gcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1DUzsKKwkJcEVudHJ5LT5iQXV0b1R4UmF0ZVN3aXRjaCA9IEZBTFNFOworCisJCS8vIElmIHRoZSBsZWdhY3kgbW9kZSBpcyBzZXQsIG92ZXJ3cml0ZSB0aGUgdHJhbnNtaXQgc2V0dGluZyBvZiB0aGlzIGVudHJ5LgorCQlSVE1QVXBkYXRlTGVnYWN5VHhTZXR0aW5nKChVQ0hBUilwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkZpeGVkVHhNb2RlLCBwRW50cnkpOworCX0KKworCXBFbnRyeS0+UG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRDsKKwlwRW50cnktPlNzdCA9IFNTVF9BU1NPQzsKKwlwRW50cnktPkF1dGhTdGF0ZSA9IEFTX0FVVEhfT1BFTjsKKwlwRW50cnktPkF1dGhNb2RlID0gcEFkLT5TdGFDZmcuQXV0aE1vZGU7CisJcEVudHJ5LT5XZXBTdGF0dXMgPSBwQWQtPlN0YUNmZy5XZXBTdGF0dXM7CisKKwlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPk1hY1RhYkxvY2spOworCisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorI2lmbmRlZiBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgIGlmIChwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVApCisgICAgeworICAgICAgICB1bmlvbiBpd3JlcV9kYXRhICAgIHdycXU7CisKKyAgICAgICAgU2VuZEFzc29jSUVzVG9XcGFTdXBwbGljYW50KHBBZCk7CisgICAgICAgIG1lbXNldCgmd3JxdSwgMCwgc2l6ZW9mKHdycXUpKTsKKyAgICAgICAgd3JxdS5kYXRhLmZsYWdzID0gUlRfQVNTT0NfRVZFTlRfRkxBRzsKKyAgICAgICAgd2lyZWxlc3Nfc2VuZF9ldmVudChwQWQtPm5ldF9kZXYsIElXRVZDVVNUT00sICZ3cnF1LCBOVUxMKTsKKyAgICB9CisjZW5kaWYgLy8gTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisKKyNpZmRlZiBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgIHsKKyAgICAgICAgdW5pb24gaXdyZXFfZGF0YSAgICB3cnF1OworICAgICAgICB3ZXh0X25vdGlmeV9ldmVudF9hc3NvYyhwQWQpOworCisgICAgICAgIG1lbXNldCh3cnF1LmFwX2FkZHIuc2FfZGF0YSwgMCwgTUFDX0FERFJfTEVOKTsKKyAgICAgICAgbWVtY3B5KHdycXUuYXBfYWRkci5zYV9kYXRhLCBwQWQtPk1sbWVBdXguQnNzaWQsIE1BQ19BRERSX0xFTik7CisgICAgICAgIHdpcmVsZXNzX3NlbmRfZXZlbnQocEFkLT5uZXRfZGV2LCBTSU9DR0lXQVAsICZ3cnF1LCBOVUxMKTsKKworICAgIH0KKyNlbmRpZiAvLyBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCXJldHVybiBUUlVFOworfQorCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvc3RhL2F1dGguYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvc3RhL2F1dGguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43M2ZiOGQ2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9zdGEvYXV0aC5jCkBAIC0wLDAgKzEsNDc0IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCU1vZHVsZSBOYW1lOgorCWF1dGguYworCisJQWJzdHJhY3Q6CisKKwlSZXZpc2lvbiBIaXN0b3J5OgorCVdobwkJCVdoZW4JCQlXaGF0CisJLS0tLS0tLS0JLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCUpvaG4JCTIwMDQtOS0zCQlwb3J0aW5nIGZyb20gUlQyNTAwCisqLworI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIGF1dGhlbnRpY2F0ZSBzdGF0ZSBtYWNoaW5lIGluaXQsIGluY2x1ZGluZyBzdGF0ZSB0cmFuc2l0aW9uIGFuZCB0aW1lciBpbml0CisgICAgUGFyYW1ldGVyczoKKyAgICAgICAgU20gLSBwb2ludGVyIHRvIHRoZSBhdXRoIHN0YXRlIG1hY2hpbmUKKyAgICBOb3RlOgorICAgICAgICBUaGUgc3RhdGUgbWFjaGluZSBsb29rcyBsaWtlIHRoaXMKKworICAgICAgICAgICAgICAgICAgICAgICAgQVVUSF9SRVFfSURMRSAgICAgICAgICAgQVVUSF9XQUlUX1NFUTIgICAgICAgICAgICAgICAgICAgQVVUSF9XQUlUX1NFUTQKKyAgICBNVDJfTUxNRV9BVVRIX1JFUSAgIG1sbWVfYXV0aF9yZXFfYWN0aW9uICAgIGludmFsaWRfc3RhdGVfd2hlbl9hdXRoICAgICAgICAgIGludmFsaWRfc3RhdGVfd2hlbl9hdXRoCisgICAgTVQyX1BFRVJfQVVUSF9FVkVOICBkcm9wICAgICAgICAgICAgICAgICAgICBwZWVyX2F1dGhfZXZlbl9hdF9zZXEyX2FjdGlvbiAgICBwZWVyX2F1dGhfZXZlbl9hdF9zZXE0X2FjdGlvbgorICAgIE1UMl9BVVRIX1RJTUVPVVQgICAgRHJvcCAgICAgICAgICAgICAgICAgICAgYXV0aF90aW1lb3V0X2FjdGlvbiAgICAgICAgICAgICAgYXV0aF90aW1lb3V0X2FjdGlvbgorCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKwordm9pZCBBdXRoU3RhdGVNYWNoaW5lSW5pdCgKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBTVEFURV9NQUNISU5FICpTbSwKKyAgICBPVVQgU1RBVEVfTUFDSElORV9GVU5DIFRyYW5zW10pCit7CisgICAgU3RhdGVNYWNoaW5lSW5pdChTbSwgVHJhbnMsIE1BWF9BVVRIX1NUQVRFLCBNQVhfQVVUSF9NU0csIChTVEFURV9NQUNISU5FX0ZVTkMpRHJvcCwgQVVUSF9SRVFfSURMRSwgQVVUSF9NQUNISU5FX0JBU0UpOworCisgICAgLy8gdGhlIGZpcnN0IGNvbHVtbgorICAgIFN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgQVVUSF9SRVFfSURMRSwgTVQyX01MTUVfQVVUSF9SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpTWxtZUF1dGhSZXFBY3Rpb24pOworCisgICAgLy8gdGhlIHNlY29uZCBjb2x1bW4KKyAgICBTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIEFVVEhfV0FJVF9TRVEyLCBNVDJfTUxNRV9BVVRIX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylJbnZhbGlkU3RhdGVXaGVuQXV0aCk7CisgICAgU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBBVVRIX1dBSVRfU0VRMiwgTVQyX1BFRVJfQVVUSF9FVkVOLCAoU1RBVEVfTUFDSElORV9GVU5DKVBlZXJBdXRoUnNwQXRTZXEyQWN0aW9uKTsKKyAgICBTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIEFVVEhfV0FJVF9TRVEyLCBNVDJfQVVUSF9USU1FT1VULCAoU1RBVEVfTUFDSElORV9GVU5DKUF1dGhUaW1lb3V0QWN0aW9uKTsKKworICAgIC8vIHRoZSB0aGlyZCBjb2x1bW4KKyAgICBTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIEFVVEhfV0FJVF9TRVE0LCBNVDJfTUxNRV9BVVRIX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylJbnZhbGlkU3RhdGVXaGVuQXV0aCk7CisgICAgU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBBVVRIX1dBSVRfU0VRNCwgTVQyX1BFRVJfQVVUSF9FVkVOLCAoU1RBVEVfTUFDSElORV9GVU5DKVBlZXJBdXRoUnNwQXRTZXE0QWN0aW9uKTsKKyAgICBTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIEFVVEhfV0FJVF9TRVE0LCBNVDJfQVVUSF9USU1FT1VULCAoU1RBVEVfTUFDSElORV9GVU5DKUF1dGhUaW1lb3V0QWN0aW9uKTsKKworCVJUTVBJbml0VGltZXIocEFkLCAmcEFkLT5NbG1lQXV4LkF1dGhUaW1lciwgR0VUX1RJTUVSX0ZVTkNUSU9OKEF1dGhUaW1lb3V0KSwgcEFkLCBGQUxTRSk7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgZnVuY3Rpb24gdG8gYmUgZXhlY3V0ZWQgYXQgdGltZXIgdGhyZWFkIHdoZW4gYXV0aCB0aW1lciBleHBpcmVzCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgQXV0aFRpbWVvdXQoCisgICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorICAgIElOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKKyAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisgICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKQoreworICAgIFJUTVBfQURBUFRFUiAqcEFkID0gKFJUTVBfQURBUFRFUiAqKUZ1bmN0aW9uQ29udGV4dDsKKworICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQVVUSCAtIEF1dGhUaW1lb3V0XG4iKSk7CisKKwkvLyBEbyBub3RoaW5nIGlmIHRoZSBkcml2ZXIgaXMgc3RhcnRpbmcgaGFsdCBzdGF0ZS4KKwkvLyBUaGlzIG1pZ2h0IGhhcHBlbiB3aGVuIHRpbWVyIGFscmVhZHkgYmVlbiBmaXJlZCBiZWZvcmUgY2FuY2VsIHRpbWVyIHdpdGggbWxtZWhhbHQKKwlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKQorCQlyZXR1cm47CisKKwkvLyBzZW5kIGEgZGUtYXV0aCB0byByZXNldCBBUCdzIHN0YXRlIG1hY2hpbmUgKFBhdGNoIEFQLURpcjYzNSkKKwlpZiAocEFkLT5NbG1lLkF1dGhNYWNoaW5lLkN1cnJTdGF0ZSA9PSBBVVRIX1dBSVRfU0VRMikKKwkJQ2xzMmVyckFjdGlvbihwQWQsIHBBZC0+TWxtZUF1eC5Cc3NpZCk7CisKKworICAgIE1sbWVFbnF1ZXVlKHBBZCwgQVVUSF9TVEFURV9NQUNISU5FLCBNVDJfQVVUSF9USU1FT1VULCAwLCBOVUxMKTsKKyAgICBSVDI4WFhfTUxNRV9IQU5ETEVSKHBBZCk7Cit9CisKKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIE1sbWVBdXRoUmVxQWN0aW9uKAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKyAgICBVQ0hBUiAgICAgICAgICAgICAgQWRkcls2XTsKKyAgICBVU0hPUlQgICAgICAgICAgICAgQWxnLCBTZXEsIFN0YXR1czsKKyAgICBVTE9ORyAgICAgICAgICAgICAgVGltZW91dDsKKyAgICBIRUFERVJfODAyXzExICAgICAgQXV0aEhkcjsKKyAgICBCT09MRUFOICAgICAgICAgICAgVGltZXJDYW5jZWxsZWQ7CisgICAgTkRJU19TVEFUVVMgICAgICAgIE5TdGF0dXM7CisgICAgUFVDSEFSICAgICAgICAgICAgIHBPdXRCdWZmZXIgPSBOVUxMOworICAgIFVMT05HICAgICAgICAgICAgICBGcmFtZUxlbiA9IDA7CisKKwkvLyBCbG9jayBhbGwgYXV0aGVudGljYXRpb24gcmVxdWVzdCBkdXJuaW5nIFdQQSBibG9jayBwZXJpb2QKKwlpZiAocEFkLT5TdGFDZmcuYkJsb2NrQXNzb2MgPT0gVFJVRSkKKwl7CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFVVEggLSBCbG9jayBBdXRoIHJlcXVlc3QgZHVybmluZyBXUEEgYmxvY2sgcGVyaW9kIVxuIikpOworICAgICAgICBwQWQtPk1sbWUuQXV0aE1hY2hpbmUuQ3VyclN0YXRlID0gQVVUSF9SRVFfSURMRTsKKyAgICAgICAgU3RhdHVzID0gTUxNRV9TVEFURV9NQUNISU5FX1JFSkVDVDsKKyAgICAgICAgTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX0FVVEhfQ09ORiwgMiwgJlN0YXR1cyk7CisJfQorICAgIGVsc2UgaWYoTWxtZUF1dGhSZXFTYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbiwgQWRkciwgJlRpbWVvdXQsICZBbGcpKQorICAgIHsKKyAgICAgICAgLy8gcmVzZXQgdGltZXIKKyAgICAgICAgUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguQXV0aFRpbWVyLCAmVGltZXJDYW5jZWxsZWQpOworICAgICAgICBDT1BZX01BQ19BRERSKHBBZC0+TWxtZUF1eC5Cc3NpZCwgQWRkcik7CisgICAgICAgIHBBZC0+TWxtZUF1eC5BbGcgID0gQWxnOworICAgICAgICBTZXEgPSAxOworICAgICAgICBTdGF0dXMgPSBNTE1FX1NVQ0NFU1M7CisKKyAgICAgICAgTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKKyAgICAgICAgaWYoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorICAgICAgICB7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBVVRIIC0gTWxtZUF1dGhSZXFBY3Rpb24oQWxnOiVkKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkXG4iLCBBbGcpKTsKKyAgICAgICAgICAgIHBBZC0+TWxtZS5BdXRoTWFjaGluZS5DdXJyU3RhdGUgPSBBVVRIX1JFUV9JRExFOworICAgICAgICAgICAgU3RhdHVzID0gTUxNRV9GQUlMX05PX1JFU09VUkNFOworICAgICAgICAgICAgTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX0FVVEhfQ09ORiwgMiwgJlN0YXR1cyk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBVVRIIC0gU2VuZCBBVVRIIHJlcXVlc3Qgc2VxIzEgKEFsZz0lZCkuLi5cbiIsIEFsZykpOworICAgICAgICBNZ3RNYWNIZWFkZXJJbml0KHBBZCwgJkF1dGhIZHIsIFNVQlRZUEVfQVVUSCwgMCwgQWRkciwgcEFkLT5NbG1lQXV4LkJzc2lkKTsKKyAgICAgICAgTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICAgICZGcmFtZUxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEhFQURFUl84MDJfMTEpLCZBdXRoSGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgJkFsZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICZTZXEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAmU3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBFTkRfT0ZfQVJHUyk7CisgICAgICAgIE1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgMCwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOworICAgIAlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOworCisgICAgICAgIFJUTVBTZXRUaW1lcigmcEFkLT5NbG1lQXV4LkF1dGhUaW1lciwgVGltZW91dCk7CisgICAgICAgIHBBZC0+TWxtZS5BdXRoTWFjaGluZS5DdXJyU3RhdGUgPSBBVVRIX1dBSVRfU0VRMjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgREJHUFJJTlRfRVJSKCgiQVVUSCAtIE1sbWVBdXRoUmVxQWN0aW9uKCkgc2FuaXR5IGNoZWNrIGZhaWxlZFxuIikpOworICAgICAgICBwQWQtPk1sbWUuQXV0aE1hY2hpbmUuQ3VyclN0YXRlID0gQVVUSF9SRVFfSURMRTsKKyAgICAgICAgU3RhdHVzID0gTUxNRV9JTlZBTElEX0ZPUk1BVDsKKyAgICAgICAgTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX0FVVEhfQ09ORiwgMiwgJlN0YXR1cyk7CisgICAgfQorfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgUGVlckF1dGhSc3BBdFNlcTJBY3Rpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworICAgIFVDSEFSICAgICAgICAgQWRkcjJbTUFDX0FERFJfTEVOXTsKKyAgICBVU0hPUlQgICAgICAgIFNlcSwgU3RhdHVzLCBSZW1vdGVTdGF0dXMsIEFsZzsKKyAgICBVQ0hBUiAgICAgICAgIENobGdUZXh0W0NJUEhFUl9URVhUX0xFTl07CisgICAgVUNIQVIgICAgICAgICBDeXBlckNobGdUZXh0W0NJUEhFUl9URVhUX0xFTiArIDggKyA4XTsKKyAgICBVQ0hBUiAgICAgICAgIEVsZW1lbnRbMl07CisgICAgSEVBREVSXzgwMl8xMSBBdXRoSGRyOworICAgIEJPT0xFQU4gICAgICAgVGltZXJDYW5jZWxsZWQ7CisgICAgUFVDSEFSICAgICAgICBwT3V0QnVmZmVyID0gTlVMTDsKKyAgICBORElTX1NUQVRVUyAgIE5TdGF0dXM7CisgICAgVUxPTkcgICAgICAgICBGcmFtZUxlbiA9IDA7CisgICAgVVNIT1JUICAgICAgICBTdGF0dXMyOworCisgICAgaWYgKFBlZXJBdXRoU2FuaXR5KHBBZCwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4sIEFkZHIyLCAmQWxnLCAmU2VxLCAmU3RhdHVzLCBDaGxnVGV4dCkpCisgICAgeworICAgICAgICBpZiAoTUFDX0FERFJfRVFVQUwocEFkLT5NbG1lQXV4LkJzc2lkLCBBZGRyMikgJiYgU2VxID09IDIpCisgICAgICAgIHsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFVVEggLSBSZWNlaXZlIEFVVEhfUlNQIHNlcSMyIHRvIG1lIChBbGc9JWQsIFN0YXR1cz0lZClcbiIsIEFsZywgU3RhdHVzKSk7CisgICAgICAgICAgICBSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5BdXRoVGltZXIsICZUaW1lckNhbmNlbGxlZCk7CisKKyAgICAgICAgICAgIGlmIChTdGF0dXMgPT0gTUxNRV9TVUNDRVNTKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIEF1dGhlbnRpY2F0aW9uIE1vZGUgIkxFQVAiIGhhcyBhbGxvdyBmb3IgQ0NYIDEuWAorICAgICAgICAgICAgICAgIGlmICgocEFkLT5NbG1lQXV4LkFsZyA9PSBOZGlzODAyXzExQXV0aE1vZGVPcGVuKQorI2lmZGVmIExFQVBfU1VQUE9SVAorCQkJCQl8fCAocEFkLT5TdGFDZmcuTGVhcEF1dGhNb2RlID09IENJU0NPX0F1dGhNb2RlTEVBUCkKKyNlbmRpZiAvLyBMRUFQX1NVUFBPUlQgLy8KKwkJCQkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwQWQtPk1sbWUuQXV0aE1hY2hpbmUuQ3VyclN0YXRlID0gQVVUSF9SRVFfSURMRTsKKyNpZmRlZiBMRUFQX1NVUFBPUlQKKyAgICAgICAgICAgICAgICAgICAgcEFkLT5NbG1lLkxlYXBNYWNoaW5lLkN1cnJTdGF0ZSA9IExFQVBfSURMRTsKKyNlbmRpZiAvLyBMRUFQX1NVUFBPUlQgLy8KKyAgICAgICAgICAgICAgICAgICAgTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX0FVVEhfQ09ORiwgMiwgJlN0YXR1cyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIDIuIHNoYXJlZCBrZXksIG5lZWQgdG8gYmUgY2hhbGxlbmdlZAorICAgICAgICAgICAgICAgICAgICBTZXErKzsKKyAgICAgICAgICAgICAgICAgICAgUmVtb3RlU3RhdHVzID0gTUxNRV9TVUNDRVNTOworCisJCQkJCS8vIEdldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5CisgICAgICAgICAgICAgICAgICAgIE5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcik7CisgICAgICAgICAgICAgICAgICAgIGlmKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVVUSCAtIFBlZXJBdXRoUnNwQXRTZXEyQWN0aW9uKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBBZC0+TWxtZS5BdXRoTWFjaGluZS5DdXJyU3RhdGUgPSBBVVRIX1JFUV9JRExFOworICAgICAgICAgICAgICAgICAgICAgICAgU3RhdHVzMiA9IE1MTUVfRkFJTF9OT19SRVNPVVJDRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIE1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9BVVRIX0NPTkYsIDIsICZTdGF0dXMyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFVVEggLSBTZW5kIEFVVEggcmVxdWVzdCBzZXEjMy4uLlxuIikpOworICAgICAgICAgICAgICAgICAgICBNZ3RNYWNIZWFkZXJJbml0KHBBZCwgJkF1dGhIZHIsIFNVQlRZUEVfQVVUSCwgMCwgQWRkcjIsIHBBZC0+TWxtZUF1eC5Cc3NpZCk7CisgICAgICAgICAgICAgICAgICAgIEF1dGhIZHIuRkMuV2VwID0gMTsKKyAgICAgICAgICAgICAgICAgICAgLy8gRW5jcnlwdCBjaGFsbGVuZ2UgdGV4dCAmIGF1dGggaW5mb3JtYXRpb24KKyAgICAgICAgICAgICAgICAgICAgUlRNUEluaXRXZXBFbmdpbmUoCisgICAgICAgICAgICAgICAgICAgIAlwQWQsCisgICAgICAgICAgICAgICAgICAgIAlwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLktleSwKKyAgICAgICAgICAgICAgICAgICAgCXBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCwKKyAgICAgICAgICAgICAgICAgICAgCXBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uS2V5TGVuLAorICAgICAgICAgICAgICAgICAgICAJQ3lwZXJDaGxnVGV4dCk7CisKKwkJCQkJQWxnID0gY3B1MmxlMTYoKihVU0hPUlQgKikmQWxnKTsKKwkJCQkJU2VxID0gY3B1MmxlMTYoKihVU0hPUlQgKikmU2VxKTsKKwkJCQkJUmVtb3RlU3RhdHVzPSBjcHUybGUxNigqKFVTSE9SVCAqKSZSZW1vdGVTdGF0dXMpOworCisJCQkJCVJUTVBFbmNyeXB0RGF0YShwQWQsIChQVUNIQVIpICZBbGcsIEN5cGVyQ2hsZ1RleHQgKyA0LCAyKTsKKwkJCQkJUlRNUEVuY3J5cHREYXRhKHBBZCwgKFBVQ0hBUikgJlNlcSwgQ3lwZXJDaGxnVGV4dCArIDYsIDIpOworCQkJCQlSVE1QRW5jcnlwdERhdGEocEFkLCAoUFVDSEFSKSAmUmVtb3RlU3RhdHVzLCBDeXBlckNobGdUZXh0ICsgOCwgMik7CisJCQkJCUVsZW1lbnRbMF0gPSAxNjsKKwkJCQkJRWxlbWVudFsxXSA9IDEyODsKKwkJCQkJUlRNUEVuY3J5cHREYXRhKHBBZCwgRWxlbWVudCwgQ3lwZXJDaGxnVGV4dCArIDEwLCAyKTsKKwkJCQkJUlRNUEVuY3J5cHREYXRhKHBBZCwgQ2hsZ1RleHQsIEN5cGVyQ2hsZ1RleHQgKyAxMiwgMTI4KTsKKwkJCQkJUlRNUFNldElDVihwQWQsIEN5cGVyQ2hsZ1RleHQgKyAxNDApOworICAgICAgICAgICAgICAgICAgICBNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAgICAgICAgICAgICAgICZGcmFtZUxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEhFQURFUl84MDJfMTEpLCAgICAmQXV0aEhkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0lQSEVSX1RFWFRfTEVOICsgMTYsICAgICBDeXBlckNobGdUZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkRfT0ZfQVJHUyk7CisgICAgICAgICAgICAgICAgICAgIE1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgMCwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOworICAgICAgICAgICAgICAgIAlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOworCisgICAgICAgICAgICAgICAgICAgIFJUTVBTZXRUaW1lcigmcEFkLT5NbG1lQXV4LkF1dGhUaW1lciwgQVVUSF9USU1FT1VUKTsKKyAgICAgICAgICAgICAgICAgICAgcEFkLT5NbG1lLkF1dGhNYWNoaW5lLkN1cnJTdGF0ZSA9IEFVVEhfV0FJVF9TRVE0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyNpZmRlZiBMRUFQX1NVUFBPUlQKKyAgICAgICAgICAgICAgICBpZiAocEFkLT5TdGFDZmcuTGVhcEF1dGhNb2RlID09IENJU0NPX0F1dGhNb2RlTEVBUCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vSW52YWxpZCBBdXRoZW50aWNhdGlvbiBwb3NzaWJsZSByb2d1ZSBBUAorICAgICAgICAgICAgICAgICAgICAvL0FkZCB0aGlzIEFwIHRvIFJvZ3VlIEFQLgorICAgICAgICAgICAgICAgICAgICBSb2d1ZUFwVGFibGVTZXRFbnRyeShwQWQsICZwQWQtPlN0YUNmZy5Sb2d1ZUFwVGFiLCBBZGRyMiwgTEVBUF9SRUFTT05fSU5WQUxJRF9BVVRIKTsKKwkJCQl9CisjZW5kaWYgLy8gTEVBUF9TVVBQT1JUIC8vCisgICAgICAgICAgICAgICAgcEFkLT5TdGFDZmcuQXV0aEZhaWxSZWFzb24gPSBTdGF0dXM7CisgICAgICAgICAgICAgICAgQ09QWV9NQUNfQUREUihwQWQtPlN0YUNmZy5BdXRoRmFpbFN0YSwgQWRkcjIpOworICAgICAgICAgICAgICAgIHBBZC0+TWxtZS5BdXRoTWFjaGluZS5DdXJyU3RhdGUgPSBBVVRIX1JFUV9JRExFOworICAgICAgICAgICAgICAgIE1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9BVVRIX0NPTkYsIDIsICZTdGF0dXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFVVEggLSBQZWVyQXV0aFNhbml0eSgpIHNhbml0eSBjaGVjayBmYWlsXG4iKSk7CisgICAgfQorfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgUGVlckF1dGhSc3BBdFNlcTRBY3Rpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworICAgIFVDSEFSICAgICAgICAgQWRkcjJbTUFDX0FERFJfTEVOXTsKKyAgICBVU0hPUlQgICAgICAgIEFsZywgU2VxLCBTdGF0dXM7CisgICAgQ0hBUiAgICAgICAgICBDaGxnVGV4dFtDSVBIRVJfVEVYVF9MRU5dOworICAgIEJPT0xFQU4gICAgICAgVGltZXJDYW5jZWxsZWQ7CisKKyAgICBpZihQZWVyQXV0aFNhbml0eShwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuLCBBZGRyMiwgJkFsZywgJlNlcSwgJlN0YXR1cywgQ2hsZ1RleHQpKQorICAgIHsKKyAgICAgICAgaWYoTUFDX0FERFJfRVFVQUwocEFkLT5NbG1lQXV4LkJzc2lkLCBBZGRyMikgJiYgU2VxID09IDQpCisgICAgICAgIHsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFVVEggLSBSZWNlaXZlIEFVVEhfUlNQIHNlcSM0IHRvIG1lXG4iKSk7CisgICAgICAgICAgICBSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5BdXRoVGltZXIsICZUaW1lckNhbmNlbGxlZCk7CisKKyAgICAgICAgICAgIGlmIChTdGF0dXMgIT0gTUxNRV9TVUNDRVNTKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBBZC0+U3RhQ2ZnLkF1dGhGYWlsUmVhc29uID0gU3RhdHVzOworICAgICAgICAgICAgICAgIENPUFlfTUFDX0FERFIocEFkLT5TdGFDZmcuQXV0aEZhaWxTdGEsIEFkZHIyKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcEFkLT5NbG1lLkF1dGhNYWNoaW5lLkN1cnJTdGF0ZSA9IEFVVEhfUkVRX0lETEU7CisgICAgICAgICAgICBNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfQVVUSF9DT05GLCAyLCAmU3RhdHVzKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBVVRIIC0gUGVlckF1dGhSc3BBdFNlcTRBY3Rpb24oKSBzYW5pdHkgY2hlY2sgZmFpbFxuIikpOworICAgIH0KK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIE1sbWVEZWF1dGhSZXFBY3Rpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworICAgIE1MTUVfREVBVVRIX1JFUV9TVFJVQ1QgKnBJbmZvOworICAgIEhFQURFUl84MDJfMTEgRGVhdXRoSGRyOworICAgIFBVQ0hBUiAgICAgICAgcE91dEJ1ZmZlciA9IE5VTEw7CisgICAgTkRJU19TVEFUVVMgICBOU3RhdHVzOworICAgIFVMT05HICAgICAgICAgRnJhbWVMZW4gPSAwOworICAgIFVTSE9SVCAgICAgICAgU3RhdHVzOworCisgICAgcEluZm8gPSAoTUxNRV9ERUFVVEhfUkVRX1NUUlVDVCAqKUVsZW0tPk1zZzsKKworICAgIE5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5CisgICAgaWYgKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFVVEggLSBNbG1lRGVhdXRoUmVxQWN0aW9uKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxcbiIpKTsKKyAgICAgICAgcEFkLT5NbG1lLkF1dGhNYWNoaW5lLkN1cnJTdGF0ZSA9IEFVVEhfUkVRX0lETEU7CisgICAgICAgIFN0YXR1cyA9IE1MTUVfRkFJTF9OT19SRVNPVVJDRTsKKyAgICAgICAgTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX0RFQVVUSF9DT05GLCAyLCAmU3RhdHVzKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFVVEggLSBTZW5kIERFLUFVVEggcmVxdWVzdCAoUmVhc29uPSVkKS4uLlxuIiwgcEluZm8tPlJlYXNvbikpOworICAgIE1ndE1hY0hlYWRlckluaXQocEFkLCAmRGVhdXRoSGRyLCBTVUJUWVBFX0RFQVVUSCwgMCwgcEluZm8tPkFkZHIsIHBBZC0+TWxtZUF1eC5Cc3NpZCk7CisgICAgTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICAgICZGcmFtZUxlbiwKKyAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoSEVBREVSXzgwMl8xMSksJkRlYXV0aEhkciwKKyAgICAgICAgICAgICAgICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgJnBJbmZvLT5SZWFzb24sCisgICAgICAgICAgICAgICAgICAgICAgRU5EX09GX0FSR1MpOworICAgIE1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgMCwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOworCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7CisKKyAgICBwQWQtPlN0YUNmZy5EZWF1dGhSZWFzb24gPSBwSW5mby0+UmVhc29uOworICAgIENPUFlfTUFDX0FERFIocEFkLT5TdGFDZmcuRGVhdXRoU3RhLCBwSW5mby0+QWRkcik7CisgICAgcEFkLT5NbG1lLkF1dGhNYWNoaW5lLkN1cnJTdGF0ZSA9IEFVVEhfUkVRX0lETEU7CisgICAgU3RhdHVzID0gTUxNRV9TVUNDRVNTOworICAgIE1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9ERUFVVEhfQ09ORiwgMiwgJlN0YXR1cyk7CisKKwkvLyBzZW5kIHdpcmVsZXNzIGV2ZW50IC0gZm9yIGRlYXV0aGVudGljYXRpb24KKwlpZiAocEFkLT5Db21tb25DZmcuYldpcmVsZXNzRXZlbnQpCisJCVJUTVBTZW5kV2lyZWxlc3NFdmVudChwQWQsIElXX0RFQVVUSF9FVkVOVF9GTEFHLCBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkFkZHIsIEJTUzAsIDApOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgQXV0aFRpbWVvdXRBY3Rpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworICAgIFVTSE9SVCBTdGF0dXM7CisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVVUSCAtIEF1dGhUaW1lb3V0QWN0aW9uXG4iKSk7CisgICAgcEFkLT5NbG1lLkF1dGhNYWNoaW5lLkN1cnJTdGF0ZSA9IEFVVEhfUkVRX0lETEU7CisgICAgU3RhdHVzID0gTUxNRV9SRUpfVElNRU9VVDsKKyAgICBNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfQVVUSF9DT05GLCAyLCAmU3RhdHVzKTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIEludmFsaWRTdGF0ZVdoZW5BdXRoKAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKyAgICBVU0hPUlQgU3RhdHVzOworICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFVVEggLSBJbnZhbGlkU3RhdGVXaGVuQXV0aCAoc3RhdGU9JWxkKSwgcmVzZXQgQVVUSCBzdGF0ZSBtYWNoaW5lXG4iLCBwQWQtPk1sbWUuQXV0aE1hY2hpbmUuQ3VyclN0YXRlKSk7CisgICAgcEFkLT5NbG1lLkF1dGhNYWNoaW5lLkN1cnJTdGF0ZSA9IEFVVEhfUkVRX0lETEU7CisgICAgU3RhdHVzID0gTUxNRV9TVEFURV9NQUNISU5FX1JFSkVDVDsKKyAgICBNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfQVVUSF9DT05GLCAyLCAmU3RhdHVzKTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTb21lIFNUQS9BUAorICAgIE5vdGU6CisgICAgICAgIFRoaXMgYWN0aW9uIHNob3VsZCBuZXZlciB0cmlnZ2VyIEFVVEggc3RhdGUgdHJhbnNpdGlvbiwgdGhlcmVmb3JlIHdlCisgICAgICAgIHNlcGFyYXRlIGl0IGZyb20gQVVUSCBzdGF0ZSBtYWNoaW5lLCBhbmQgbWFrZSBpdCBhcyBhIHN0YW5kYWxvbmUgc2VydmljZQorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIENsczJlcnJBY3Rpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gUFVDSEFSIHBBZGRyKQoreworICAgIEhFQURFUl84MDJfMTEgRGVhdXRoSGRyOworICAgIFBVQ0hBUiAgICAgICAgcE91dEJ1ZmZlciA9IE5VTEw7CisgICAgTkRJU19TVEFUVVMgICBOU3RhdHVzOworICAgIFVMT05HICAgICAgICAgRnJhbWVMZW4gPSAwOworICAgIFVTSE9SVCAgICAgICAgUmVhc29uID0gUkVBU09OX0NMUzJFUlI7CisKKyAgICBOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOyAgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQorICAgIGlmIChOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisgICAgICAgIHJldHVybjsKKworICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFVVEggLSBDbGFzcyAyIGVycm9yLCBTZW5kIERFQVVUSCBmcmFtZS4uLlxuIikpOworICAgIE1ndE1hY0hlYWRlckluaXQocEFkLCAmRGVhdXRoSGRyLCBTVUJUWVBFX0RFQVVUSCwgMCwgcEFkZHIsIHBBZC0+TWxtZUF1eC5Cc3NpZCk7CisgICAgTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICAgICZGcmFtZUxlbiwKKyAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoSEVBREVSXzgwMl8xMSksJkRlYXV0aEhkciwKKyAgICAgICAgICAgICAgICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgJlJlYXNvbiwKKyAgICAgICAgICAgICAgICAgICAgICBFTkRfT0ZfQVJHUyk7CisgICAgTWluaXBvcnRNTVJlcXVlc3QocEFkLCAwLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7CisJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKKworICAgIHBBZC0+U3RhQ2ZnLkRlYXV0aFJlYXNvbiA9IFJlYXNvbjsKKyAgICBDT1BZX01BQ19BRERSKHBBZC0+U3RhQ2ZnLkRlYXV0aFN0YSwgcEFkZHIpOworfQorCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvc3RhL2F1dGhfcnNwLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3N0YS9hdXRoX3JzcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlM2MyZDIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3N0YS9hdXRoX3JzcC5jCkBAIC0wLDAgKzEsMTY2IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCU1vZHVsZSBOYW1lOgorCWF1dGhfcnNwLmMKKworCUFic3RyYWN0OgorCisJUmV2aXNpb24gSGlzdG9yeToKKwlXaG8JCQlXaGVuCQkJV2hhdAorCS0tLS0tLS0tCS0tLS0tLS0tLS0JCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlKb2huCQkyMDA0LTEwLTEJCWNvcHkgZnJvbSBSVDI1NjAKKyovCisjaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgYXV0aGVudGljYXRpb24gc3RhdGUgbWFjaGluZSBpbml0IHByb2NlZHVyZQorICAgIFBhcmFtZXRlcnM6CisgICAgICAgIFNtIC0gdGhlIHN0YXRlIG1hY2hpbmUKKworCUlSUUwgPSBQQVNTSVZFX0xFVkVMCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIEF1dGhSc3BTdGF0ZU1hY2hpbmVJbml0KAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIFBTVEFURV9NQUNISU5FIFNtLAorICAgIElOIFNUQVRFX01BQ0hJTkVfRlVOQyBUcmFuc1tdKQoreworICAgIFN0YXRlTWFjaGluZUluaXQoU20sIFRyYW5zLCBNQVhfQVVUSF9SU1BfU1RBVEUsIE1BWF9BVVRIX1JTUF9NU0csIChTVEFURV9NQUNISU5FX0ZVTkMpRHJvcCwgQVVUSF9SU1BfSURMRSwgQVVUSF9SU1BfTUFDSElORV9CQVNFKTsKKworICAgIC8vIGNvbHVtbiAxCisgICAgU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBBVVRIX1JTUF9JRExFLCBNVDJfUEVFUl9ERUFVVEgsIChTVEFURV9NQUNISU5FX0ZVTkMpUGVlckRlYXV0aEFjdGlvbik7CisKKyAgICAvLyBjb2x1bW4gMgorICAgIFN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgQVVUSF9SU1BfV0FJVF9DSEFMLCBNVDJfUEVFUl9ERUFVVEgsIChTVEFURV9NQUNISU5FX0ZVTkMpUGVlckRlYXV0aEFjdGlvbik7CisKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgUGVlckF1dGhTaW1wbGVSc3BHZW5BbmRTZW5kKAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIFBIRUFERVJfODAyXzExIHBIZHI4MDIxMSwKKyAgICBJTiBVU0hPUlQgQWxnLAorICAgIElOIFVTSE9SVCBTZXEsCisgICAgSU4gVVNIT1JUIFJlYXNvbiwKKyAgICBJTiBVU0hPUlQgU3RhdHVzKQoreworICAgIEhFQURFUl84MDJfMTEgICAgIEF1dGhIZHI7CisgICAgVUxPTkcgICAgICAgICAgICAgRnJhbWVMZW4gPSAwOworICAgIFBVQ0hBUiAgICAgICAgICAgIHBPdXRCdWZmZXIgPSBOVUxMOworICAgIE5ESVNfU1RBVFVTICAgICAgIE5TdGF0dXM7CisKKyAgICBpZiAoUmVhc29uICE9IE1MTUVfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXIgQVVUSCBmYWlsLi4uXG4iKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKwkvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5CisgICAgTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsKKyAgICBpZiAoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorICAgICAgICByZXR1cm47CisKKyAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZW5kIEFVVEggcmVzcG9uc2UgKHNlcSMyKS4uLlxuIikpOworICAgIE1ndE1hY0hlYWRlckluaXQocEFkLCAmQXV0aEhkciwgU1VCVFlQRV9BVVRILCAwLCBwSGRyODAyMTEtPkFkZHIyLCBwQWQtPk1sbWVBdXguQnNzaWQpOworICAgIE1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAgICAgICAgJkZyYW1lTGVuLAorICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihIRUFERVJfODAyXzExKSwgICAgJkF1dGhIZHIsCisgICAgICAgICAgICAgICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICAgICAmQWxnLAorICAgICAgICAgICAgICAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAgICAgJlNlcSwKKyAgICAgICAgICAgICAgICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgICAgICZSZWFzb24sCisgICAgICAgICAgICAgICAgICAgICAgRU5EX09GX0FSR1MpOworICAgIE1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgMCwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOworCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIFBlZXJEZWF1dGhBY3Rpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gUE1MTUVfUVVFVUVfRUxFTSBFbGVtKQoreworICAgIFVDSEFSICAgICAgIEFkZHIyW01BQ19BRERSX0xFTl07CisgICAgVVNIT1JUICAgICAgUmVhc29uOworCisgICAgaWYgKFBlZXJEZWF1dGhTYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbiwgQWRkcjIsICZSZWFzb24pKQorICAgIHsKKyAgICAgICAgaWYgKElORlJBX09OKHBBZCkgJiYgTUFDX0FERFJfRVFVQUwoQWRkcjIsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKSkKKyAgICAgICAgeworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJBVVRIX1JTUCAtIHJlY2VpdmUgREUtQVVUSCBmcm9tIG91ciBBUCAoUmVhc29uPSVkKVxuIiwgUmVhc29uKSk7CisKKyNpZmRlZiBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgICAgd3JxdTsKKyAgICAgICAgICAgICAgICBtZW1zZXQod3JxdS5hcF9hZGRyLnNhX2RhdGEsIDAsIE1BQ19BRERSX0xFTik7CisgICAgICAgICAgICAgICAgd2lyZWxlc3Nfc2VuZF9ldmVudChwQWQtPm5ldF9kZXYsIFNJT0NHSVdBUCwgJndycXUsIE5VTEwpOworICAgICAgICAgICAgfQorI2VuZGlmIC8vIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisKKworCQkJLy8gc2VuZCB3aXJlbGVzcyBldmVudCAtIGZvciBkZWF1dGhlbnRpY2F0aW9uCisJCQlpZiAocEFkLT5Db21tb25DZmcuYldpcmVsZXNzRXZlbnQpCisJCQkJUlRNUFNlbmRXaXJlbGVzc0V2ZW50KHBBZCwgSVdfREVBVVRIX0VWRU5UX0ZMQUcsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQWRkciwgQlNTMCwgMCk7CisKKyAgICAgICAgICAgIExpbmtEb3duKHBBZCwgVFJVRSk7CisKKyAgICAgICAgICAgIC8vIEF1dGhlbnRpY2F0aW9uIE1vZGUgQ2lzY29fTEVBUCBoYXMgc3RhcnQgYSB0aW1lcgorICAgICAgICAgICAgLy8gV2Ugc2hvdWxkIGNhbmNlbCBpdCBpZiB1c2luZyBMRUFQCisjaWZkZWYgTEVBUF9TVVBQT1JUCisgICAgICAgICAgICBpZiAocEFkLT5TdGFDZmcuTGVhcEF1dGhNb2RlID09IENJU0NPX0F1dGhNb2RlTEVBUCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBSVE1QQ2FuY2VsVGltZXIoJnBBZC0+U3RhQ2ZnLkxlYXBBdXRoVGltZXIsICZUaW1lckNhbmNlbGxlZCk7CisgICAgICAgICAgICAgICAgLy9DaGVjayBpcyBpdCBtYWNoIHRoZSBMRUFQIEF1dGhlbnRpY2F0aW9uIGZhaWxlZCBhcyBwb3NzaWJsZSBhIFJvZ3VlIEFQCisgICAgICAgICAgICAgICAgLy9vbiBpdCdzIFBvcnRTZWN1cmVkIG5vdCBlcXVhbCB0byBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRCB3aGlsZSBwcm9jZXNzIHRoZSBBdXRoZW50aWNhdG9uLgorICAgICAgICAgICAgICAgIGlmICgocEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQgIT0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQpICYmIChwQWQtPk1sbWUuTGVhcE1hY2hpbmUuQ3VyclN0YXRlICE9IExFQVBfSURMRSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBSb2d1ZUFwVGFibGVTZXRFbnRyeShwQWQsICZwQWQtPlN0YUNmZy5Sb2d1ZUFwVGFiLCBBZGRyMiwgTEVBUF9SRUFTT05fQVVUSF9USU1FT1VUKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisjZW5kaWYgLy8gTEVBUF9TVVBQT1JUIC8vCisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJBVVRIX1JTUCAtIFBlZXJEZWF1dGhBY3Rpb24oKSBzYW5pdHkgY2hlY2sgZmFpbFxuIikpOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9zdGEvY29ubmVjdC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9zdGEvY29ubmVjdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5MzE0MGEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3N0YS9jb25uZWN0LmMKQEAgLTAsMCArMSwyODIyIEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCU1vZHVsZSBOYW1lOgorCWNvbm5lY3QuYworCisJQWJzdHJhY3Q6CisKKwlSZXZpc2lvbiBIaXN0b3J5OgorCVdobwkJCVdoZW4JCQlXaGF0CisJLS0tLS0tLS0JLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCUpvaG4JCQkyMDA0LTA4LTA4CQkJTWFqb3IgbW9kaWZpY2F0aW9uIGZyb20gUlQyNTYwCisqLworI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgorCitVQ0hBUglDaXBoZXJTdWl0ZVdwYU5vbmVUa2lwW10gPSB7CisJCTB4MDAsIDB4NTAsIDB4ZjIsIDB4MDEsCS8vIG91aQorCQkweDAxLCAweDAwLAkJCQkvLyBWZXJzaW9uCisJCTB4MDAsIDB4NTAsIDB4ZjIsIDB4MDIsCS8vIE11bHRpY2FzdAorCQkweDAxLCAweDAwLAkJCQkvLyBOdW1iZXIgb2YgdW5pY2FzdAorCQkweDAwLCAweDUwLCAweGYyLCAweDAyLAkvLyB1bmljYXN0CisJCTB4MDEsIDB4MDAsCQkJCS8vIG51bWJlciBvZiBhdXRoZW50aWNhdGlvbiBtZXRob2QKKwkJMHgwMCwgMHg1MCwgMHhmMiwgMHgwMAkvLyBhdXRoZW50aWNhdGlvbgorCQl9OworVUNIQVIJQ2lwaGVyU3VpdGVXcGFOb25lVGtpcExlbiA9IChzaXplb2YoQ2lwaGVyU3VpdGVXcGFOb25lVGtpcCkgLyBzaXplb2YoVUNIQVIpKTsKKworVUNIQVIJQ2lwaGVyU3VpdGVXcGFOb25lQWVzW10gPSB7CisJCTB4MDAsIDB4NTAsIDB4ZjIsIDB4MDEsCS8vIG91aQorCQkweDAxLCAweDAwLAkJCQkvLyBWZXJzaW9uCisJCTB4MDAsIDB4NTAsIDB4ZjIsIDB4MDQsCS8vIE11bHRpY2FzdAorCQkweDAxLCAweDAwLAkJCQkvLyBOdW1iZXIgb2YgdW5pY2FzdAorCQkweDAwLCAweDUwLCAweGYyLCAweDA0LAkvLyB1bmljYXN0CisJCTB4MDEsIDB4MDAsCQkJCS8vIG51bWJlciBvZiBhdXRoZW50aWNhdGlvbiBtZXRob2QKKwkJMHgwMCwgMHg1MCwgMHhmMiwgMHgwMAkvLyBhdXRoZW50aWNhdGlvbgorCQl9OworVUNIQVIJQ2lwaGVyU3VpdGVXcGFOb25lQWVzTGVuID0gKHNpemVvZihDaXBoZXJTdWl0ZVdwYU5vbmVBZXMpIC8gc2l6ZW9mKFVDSEFSKSk7CisKKy8vIFRoZSBmb2xsb3dpbmcgTUFDUk8gaXMgY2FsbGVkIGFmdGVyIDEuIHN0YXJ0aW5nIGFuIG5ldyBJQlNTLCAyLiBzdWNjZXNmdWxseSBKT0lOIGFuIElCU1MsCisvLyBvciAzLiBzdWNjZXNmdWxseSBBU1NPQ0lBVEUgdG8gYSBCU1MsIDQuIHN1Y2Nlc3NmdWxseSBSRV9BU1NPQ0lBVEUgdG8gYSBCU1MKKy8vIEFsbCBzZXR0aW5ncyBzdWNjZXNzZnVseSBuZWdvdGlhdGVkIGZ1cmluZyBNTE1FIHN0YXRlIG1hY2hpbmVzIGJlY29tZSBmaW5hbCBzZXR0aW5ncworLy8gYW5kIGFyZSBjb3BpZWQgdG8gcEFkLT5TdGFBY3RpdmUKKyNkZWZpbmUgQ09QWV9TRVRUSU5HU19GUk9NX01MTUVfQVVYX1RPX0FDVElWRV9DRkcoX3BBZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCShfcEFkKS0+Q29tbW9uQ2ZnLlNzaWRMZW4gPSAoX3BBZCktPk1sbWVBdXguU3NpZExlbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlOZGlzTW92ZU1lbW9yeSgoX3BBZCktPkNvbW1vbkNmZy5Tc2lkLCAoX3BBZCktPk1sbWVBdXguU3NpZCwgKF9wQWQpLT5NbG1lQXV4LlNzaWRMZW4pOyBcCisJQ09QWV9NQUNfQUREUigoX3BBZCktPkNvbW1vbkNmZy5Cc3NpZCwgKF9wQWQpLT5NbG1lQXV4LkJzc2lkKTsgICAgICAgICAgICAgICAgICAgICAgXAorCShfcEFkKS0+Q29tbW9uQ2ZnLkNoYW5uZWwgPSAoX3BBZCktPk1sbWVBdXguQ2hhbm5lbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkoX3BBZCktPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA9IChfcEFkKS0+TWxtZUF1eC5DZW50cmFsQ2hhbm5lbDsgICAgICAgICAgICAgICAgICBcCisJKF9wQWQpLT5TdGFBY3RpdmUuQWlkID0gKF9wQWQpLT5NbG1lQXV4LkFpZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCShfcEFkKS0+U3RhQWN0aXZlLkF0aW1XaW4gPSAoX3BBZCktPk1sbWVBdXguQXRpbVdpbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkoX3BBZCktPlN0YUFjdGl2ZS5DYXBhYmlsaXR5SW5mbyA9IChfcEFkKS0+TWxtZUF1eC5DYXBhYmlsaXR5SW5mbzsgICAgICAgICAgICAgICAgICBcCisJKF9wQWQpLT5Db21tb25DZmcuQmVhY29uUGVyaW9kID0gKF9wQWQpLT5NbG1lQXV4LkJlYWNvblBlcmlvZDsgICAgICAgICAgICAgICAgICAgICAgXAorCShfcEFkKS0+U3RhQWN0aXZlLkNmcE1heER1cmF0aW9uID0gKF9wQWQpLT5NbG1lQXV4LkNmcE1heER1cmF0aW9uOyAgICAgICAgICAgICAgICAgIFwKKwkoX3BBZCktPlN0YUFjdGl2ZS5DZnBQZXJpb2QgPSAoX3BBZCktPk1sbWVBdXguQ2ZwUGVyaW9kOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJKF9wQWQpLT5TdGFBY3RpdmUuU3VwUmF0ZUxlbiA9IChfcEFkKS0+TWxtZUF1eC5TdXBSYXRlTGVuOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCU5kaXNNb3ZlTWVtb3J5KChfcEFkKS0+U3RhQWN0aXZlLlN1cFJhdGUsIChfcEFkKS0+TWxtZUF1eC5TdXBSYXRlLCAoX3BBZCktPk1sbWVBdXguU3VwUmF0ZUxlbik7XAorCShfcEFkKS0+U3RhQWN0aXZlLkV4dFJhdGVMZW4gPSAoX3BBZCktPk1sbWVBdXguRXh0UmF0ZUxlbjsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlOZGlzTW92ZU1lbW9yeSgoX3BBZCktPlN0YUFjdGl2ZS5FeHRSYXRlLCAoX3BBZCktPk1sbWVBdXguRXh0UmF0ZSwgKF9wQWQpLT5NbG1lQXV4LkV4dFJhdGVMZW4pO1wKKwlOZGlzTW92ZU1lbW9yeSgmKF9wQWQpLT5Db21tb25DZmcuQVBFZGNhUGFybSwgJihfcEFkKS0+TWxtZUF1eC5BUEVkY2FQYXJtLCBzaXplb2YoRURDQV9QQVJNKSk7XAorCU5kaXNNb3ZlTWVtb3J5KCYoX3BBZCktPkNvbW1vbkNmZy5BUFFvc0NhcGFiaWxpdHksICYoX3BBZCktPk1sbWVBdXguQVBRb3NDYXBhYmlsaXR5LCBzaXplb2YoUU9TX0NBUEFCSUxJVFlfUEFSTSkpO1wKKwlOZGlzTW92ZU1lbW9yeSgmKF9wQWQpLT5Db21tb25DZmcuQVBRYnNzTG9hZCwgJihfcEFkKS0+TWxtZUF1eC5BUFFic3NMb2FkLCBzaXplb2YoUUJTU19MT0FEX1BBUk0pKTtcCisJQ09QWV9NQUNfQUREUigoX3BBZCktPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkFkZHIsIChfcEFkKS0+TWxtZUF1eC5Cc3NpZCk7ICAgICAgXAorCShfcEFkKS0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQWlkID0gKF9wQWQpLT5NbG1lQXV4LkFpZDsgICAgICAgICAgICAgICAgICAgICAgIFwKKwkoX3BBZCktPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlBhaXJ3aXNlS2V5LkNpcGhlckFsZyA9IChfcEFkKS0+U3RhQ2ZnLlBhaXJDaXBoZXI7XAorCUNPUFlfTUFDX0FERFIoKF9wQWQpLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5QYWlyd2lzZUtleS5Cc3NJZCwgKF9wQWQpLT5NbG1lQXV4LkJzc2lkKTtcCisJKF9wQWQpLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5SYXRlTGVuID0gKF9wQWQpLT5TdGFBY3RpdmUuU3VwUmF0ZUxlbiArIChfcEFkKS0+U3RhQWN0aXZlLkV4dFJhdGVMZW47XAorfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIE1sbWVDbnRsSW5pdCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBTVEFURV9NQUNISU5FICpTLAorCU9VVCBTVEFURV9NQUNISU5FX0ZVTkMgVHJhbnNbXSkKK3sKKwkvLyBDb250cm9sIHN0YXRlIG1hY2hpbmUgZGlmZmVycyBmcm9tIG90aGVyIHN0YXRlIG1hY2hpbmVzLCB0aGUgaW50ZXJmYWNlCisJLy8gZm9sbG93cyB0aGUgc3RhbmRhcmQgaW50ZXJmYWNlCisJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfSURMRTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgTWxtZUNudGxNYWNoaW5lUGVyZm9ybUFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBTVEFURV9NQUNISU5FICpTLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlzd2l0Y2gocEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSkKKwl7CisJCWNhc2UgQ05UTF9JRExFOgorCQkJCUNudGxJZGxlUHJvYyhwQWQsIEVsZW0pOworCQkJYnJlYWs7CisJCWNhc2UgQ05UTF9XQUlUX0RJU0FTU09DOgorCQkJQ250bFdhaXREaXNhc3NvY1Byb2MocEFkLCBFbGVtKTsKKwkJCWJyZWFrOworCQljYXNlIENOVExfV0FJVF9KT0lOOgorCQkJQ250bFdhaXRKb2luUHJvYyhwQWQsIEVsZW0pOworCQkJYnJlYWs7CisKKwkJLy8gQ05UTF9XQUlUX1JFQVNTT0MgaXMgdGhlIG9ubHkgc3RhdGUgaW4gQ05UTCBtYWNoaW5lIHRoYXQgZG9lcworCQkvLyBub3QgdHJpZ2dlcmVkIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgYnkgIlJUTVBTZXRJbmZvcm1hdGlvbihPSURfeHh4KSIuCisJCS8vIFRoZXJlZm9yZSBub3QgcHJvdGVjdGVkIGJ5IE5ESVMncyAib25seSBvbmUgb3V0c3RhbmRpbmcgT0lEIHJlcXVlc3QiCisJCS8vIHJ1bGUuIFdoaWNoIG1lYW5zIE5ESVMgbWF5IFNFVCBPSUQgaW4gdGhlIG1pZGRsZSBvZiBST0FNaW5nIGF0dGVtcHRzLgorCQkvLyBDdXJyZW50IGFwcHJvYWNoIGlzIHRvIGJsb2NrIG5ldyBTRVQgcmVxdWVzdCBhdCBSVE1QU2V0SW5mb3JtYXRpb24oKQorCQkvLyB3aGVuIENudGxNYWNoaW5lLkN1cnJTdGF0ZSBpcyBub3QgQ05UTF9JRExFCisJCWNhc2UgQ05UTF9XQUlUX1JFQVNTT0M6CisJCQlDbnRsV2FpdFJlYXNzb2NQcm9jKHBBZCwgRWxlbSk7CisJCQlicmVhazsKKworCQljYXNlIENOVExfV0FJVF9TVEFSVDoKKwkJCUNudGxXYWl0U3RhcnRQcm9jKHBBZCwgRWxlbSk7CisJCQlicmVhazsKKwkJY2FzZSBDTlRMX1dBSVRfQVVUSDoKKwkJCUNudGxXYWl0QXV0aFByb2MocEFkLCBFbGVtKTsKKwkJCWJyZWFrOworCQljYXNlIENOVExfV0FJVF9BVVRIMjoKKwkJCUNudGxXYWl0QXV0aFByb2MyKHBBZCwgRWxlbSk7CisJCQlicmVhazsKKwkJY2FzZSBDTlRMX1dBSVRfQVNTT0M6CisJCQlDbnRsV2FpdEFzc29jUHJvYyhwQWQsIEVsZW0pOworCQkJYnJlYWs7CisKKwkJY2FzZSBDTlRMX1dBSVRfT0lEX0xJU1RfU0NBTjoKKwkJCWlmKEVsZW0tPk1zZ1R5cGUgPT0gTVQyX1NDQU5fQ09ORikKKwkJCXsKKwkJCQkvLyBSZXN1bWUgVHhSaW5nIGFmdGVyIFNDQU5JTkcgY29tcGxldGUuIFdlIGhvcGUgdGhlIG91dC1vZi1zZXJ2aWNlIHRpbWUKKwkJCQkvLyB3b24ndCBiZSB0b28gbG9uZyB0byBsZXQgdXBwZXIgbGF5ZXIgdGltZS1vdXQgdGhlIHdhaXRpbmcgZnJhbWVzCisJCQkJUlRNUFJlc3VtZU1zZHVUcmFuc21pc3Npb24ocEFkKTsKKwkJCQlpZiAocEFkLT5TdGFDZmcuQ0NYUmVxVHlwZSAhPSBNU1JOX1RZUEVfVU5VU0VEKQorCQkJCXsKKwkJCQkJLy8gQ2lzY28gc2NhbiByZXF1ZXN0IGlzIGZpbmlzaGVkLCBwcmVwYXJlIGJlYWNvbiByZXBvcnQKKwkJCQkJTWxtZUVucXVldWUocEFkLCBBSVJPTkVUX1NUQVRFX01BQ0hJTkUsIE1UMl9BSVJPTkVUX1NDQU5fRE9ORSwgMCwgTlVMTCk7CisJCQkJfQorCQkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX0lETEU7CisKKyAgICAgICAgICAgICAgICAvLworCQkJCS8vIFNldCBMRUQgc3RhdHVzIHRvIHByZXZpb3VzIHN0YXR1cy4KKwkJCQkvLworCQkJCWlmIChwQWQtPmJMZWRPblNjYW5uaW5nKQorCQkJCXsKKwkJCQkJcEFkLT5iTGVkT25TY2FubmluZyA9IEZBTFNFOworCQkJCQlSVE1QU2V0TEVEKHBBZCwgcEFkLT5MZWRTdGF0dXMpOworCQkJCX0KKyNpZmRlZiBET1QxMU5fRFJBRlQzCisJCQkJLy8gQVAgc2VudCBhIDIwNDBDb2V4aXN0ZW5jZSBtZ210IGZyYW1lLCB0aGVuIHN0YXRpb24gcGVyZm9ybSBhIHNjYW4sIGFuZCB0aGVuIHNlbmQgYmFjayB0aGUgcmVzcG9uZS4KKwkJCQlpZiAocEFkLT5Db21tb25DZmcuQlNTQ29leGlzdDIwNDAuZmllbGQuSW5mb1JlcSA9PSAxKQorCQkJCXsKKwkJCQkJVXBkYXRlMjA0MENvZXhpc3RGcmFtZUFuZE5vdGlmeShwQWQsIEJTU0lEX1dDSUQsIFRSVUUpOworCQkJCX0KKyNlbmRpZiAvLyBET1QxMU5fRFJBRlQzIC8vCisJCQl9CisJCQlicmVhazsKKworCQljYXNlIENOVExfV0FJVF9PSURfRElTQVNTT0M6CisJCQlpZiAoRWxlbS0+TXNnVHlwZSA9PSBNVDJfRElTQVNTT0NfQ09ORikKKwkJCXsKKwkJCQlMaW5rRG93bihwQWQsIEZBTFNFKTsKKwkJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9JRExFOworCQkJfQorCQkJYnJlYWs7CisjaWZkZWYgUlQyODcwCisJCS8vCisJCS8vIFRoaXMgc3RhdGUgaXMgZm9yIHRoYXQgd2Ugd2FudCB0byBjb25uZWN0IHRvIGFuIEFQIGJ1dAorCQkvLyBpdCBkaWRuJ3QgZmluZCBvbiBCU1MgTGlzdCB0YWJsZS4gU28gd2UgbmVlZCB0byBzY2FuIHRoZSBhaXIgZmlyc3QsCisJCS8vIGFmdGVyIHRoYXQgd2UgY2FuIHRyeSB0byBjb25uZWN0IHRvIHRoZSBkZXNpcmVkIEFQIGlmIGF2YWlsYWJsZS4KKwkJLy8KKwkJY2FzZSBDTlRMX1dBSVRfU0NBTl9GT1JfQ09OTkVDVDoKKwkJCWlmKEVsZW0tPk1zZ1R5cGUgPT0gTVQyX1NDQU5fQ09ORikKKwkJCXsKKwkJCQkvLyBSZXN1bWUgVHhSaW5nIGFmdGVyIFNDQU5JTkcgY29tcGxldGUuIFdlIGhvcGUgdGhlIG91dC1vZi1zZXJ2aWNlIHRpbWUKKwkJCQkvLyB3b24ndCBiZSB0b28gbG9uZyB0byBsZXQgdXBwZXIgbGF5ZXIgdGltZS1vdXQgdGhlIHdhaXRpbmcgZnJhbWVzCisJCQkJUlRNUFJlc3VtZU1zZHVUcmFuc21pc3Npb24ocEFkKTsKKyNpZmRlZiBDQ1hfU1VQUE9SVAorCQkJCWlmIChwQWQtPlN0YUNmZy5DQ1hSZXFUeXBlICE9IE1TUk5fVFlQRV9VTlVTRUQpCisJCQkJeworCQkJCQkvLyBDaXNjbyBzY2FuIHJlcXVlc3QgaXMgZmluaXNoZWQsIHByZXBhcmUgYmVhY29uIHJlcG9ydAorCQkJCQlNbG1lRW5xdWV1ZShwQWQsIEFJUk9ORVRfU1RBVEVfTUFDSElORSwgTVQyX0FJUk9ORVRfU0NBTl9ET05FLCAwLCBOVUxMKTsKKwkJCQl9CisjZW5kaWYgLy8gQ0NYX1NVUFBPUlQgLy8KKwkJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9JRExFOworCisJCQkJLy8KKwkJCQkvLyBDaGVjayBpZiB3ZSBjYW4gY29ubmVjdCB0by4KKwkJCQkvLworCQkJCUJzc1RhYmxlU3NpZFNvcnQocEFkLCAmcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIsIHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZCwgcEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuKTsKKwkJCQlpZiAocEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzTnIgPiAwKQorCQkJCXsKKwkJCQkJTWxtZUF1dG9SZWNvbm5lY3RMYXN0U1NJRChwQWQpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworI2VuZGlmIC8vIFJUMjg3MCAvLworCQlkZWZhdWx0OgorCQkJREJHUFJJTlRfRVJSKCgiIUVSUk9SISBDTlRMIC0gSWxsZWdhbCBtZXNzYWdlIHR5cGUoPSVsZCkiLCBFbGVtLT5Nc2dUeXBlKSk7CisJCQlicmVhazsKKwl9Cit9CisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgQ250bElkbGVQcm9jKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlNTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1QgICBEaXNhc3NvY1JlcTsKKworCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkFESU9fT0ZGKSkKKwkJcmV0dXJuOworCisJc3dpdGNoKEVsZW0tPk1zZ1R5cGUpCisJeworCQljYXNlIE9JRF84MDJfMTFfU1NJRDoKKwkJCUNudGxPaWRTc2lkUHJvYyhwQWQsIEVsZW0pOworCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfODAyXzExX0JTU0lEOgorCQkJQ250bE9pZFJUQnNzaWRQcm9jKHBBZCxFbGVtKTsKKwkJCWJyZWFrOworCisJCWNhc2UgT0lEXzgwMl8xMV9CU1NJRF9MSVNUX1NDQU46CisJCQlDbnRsT2lkU2NhblByb2MocEFkLEVsZW0pOworCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfODAyXzExX0RJU0FTU09DSUFURToKKyNpZmRlZiBSQUxJTktfQVRFCisJCQlpZihBVEVfT04ocEFkKSkKKwkJCXsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJUaGUgZHJpdmVyIGlzIGluIEFURSBtb2RlIG5vd1xuIikpOworCQkJCWJyZWFrOworCQkJfQorI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKwkJCURpc2Fzc29jUGFybUZpbGwocEFkLCAmRGlzYXNzb2NSZXEsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBSRUFTT05fRElTQVNTT0NfU1RBX0xFQVZJTkcpOworCQkJTWxtZUVucXVldWUocEFkLCBBU1NPQ19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9ESVNBU1NPQ19SRVEsIHNpemVvZihNTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1QpLCAmRGlzYXNzb2NSZXEpOworCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9PSURfRElTQVNTT0M7CisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgICAgICAgICAgaWYgKHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCAhPSBXUEFfU1VQUExJQ0FOVF9FTkFCTEVfV0lUSF9XRUJfVUkpCisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworICAgICAgICAgICAgeworICAgIAkJCS8vIFNldCB0aGUgQXV0b1JlY29ubmVjdFNzaWQgdG8gcHJldmVudCBpdCByZWNvbm5lY3QgdG8gb2xkIFNTSUQKKyAgICAJCQkvLyBTaW5jZSBjYWxsaW5nIHRoaXMgaW5kaWNhdGUgdXNlciBkb24ndCB3YW50IHRvIGNvbm5lY3QgdG8gdGhhdCBTU0lEIGFueW1vcmUuCisgICAgCQkJcEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuPSAzMjsKKyAgICAJCQlOZGlzWmVyb01lbW9yeShwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWQsIHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbik7CisgICAgICAgICAgICB9CisJCQlicmVhazsKKworCQljYXNlIE1UMl9NTE1FX1JPQU1JTkdfUkVROgorCQkJQ250bE1sbWVSb2FtaW5nUHJvYyhwQWQsIEVsZW0pOworCQkJYnJlYWs7CisKKyAgICAgICAgY2FzZSBPSURfODAyXzExX01JQ19GQUlMVVJFX1JFUE9SVF9GUkFNRToKKyAgICAgICAgICAgIFdwYU1pY0ZhaWx1cmVSZXBvcnRGcmFtZShwQWQsIEVsZW0pOworICAgICAgICAgICAgYnJlYWs7CisKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwkJY2FzZSBSVF9PSURfODAyXzExX1NFVF9ETFNfUEFSQU06CisJCQlDbnRsT2lkRExTU2V0dXBQcm9jKHBBZCwgRWxlbSk7CisJCQlicmVhazsKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKworCQlkZWZhdWx0OgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ05UTCAtIElsbGVnYWwgbWVzc2FnZSBpbiBDbnRsSWRsZVByb2MoTXNnVHlwZT0lbGQpXG4iLEVsZW0tPk1zZ1R5cGUpKTsKKwkJCWJyZWFrOworCX0KK30KKworVk9JRCBDbnRsT2lkU2NhblByb2MoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCU1MTUVfU0NBTl9SRVFfU1RSVUNUICAgICAgIFNjYW5SZXE7CisJVUxPTkcgICAgICAgICAgICAgICAgICAgICAgQnNzSWR4ID0gQlNTX05PVF9GT1VORDsKKwlCU1NfRU5UUlkgICAgICAgICAgICAgICAgICBDdXJyQnNzOworCisjaWZkZWYgUkFMSU5LX0FURQorLyogRGlzYWJsZSBzY2FubmluZyB3aGVuIEFURSBpcyBydW5uaW5nLiAqLworCWlmIChBVEVfT04ocEFkKSkKKwkJcmV0dXJuOworI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKworCisJLy8gcmVjb3JkIGN1cnJlbnQgQlNTIGlmIG5ldHdvcmsgaXMgY29ubmVjdGVkLgorCS8vIDIwMDMtMi0xMyBkbyBub3QgaW5jbHVkZSBjdXJyZW50IElCU1MgaWYgdGhpcyBpcyB0aGUgb25seSBTVEEgaW4gdGhpcyBJQlNTLgorCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCkpCisJeworCQlCc3NJZHggPSBCc3NTc2lkVGFibGVTZWFyY2goJnBBZC0+U2NhblRhYiwgcEFkLT5Db21tb25DZmcuQnNzaWQsIHBBZC0+Q29tbW9uQ2ZnLlNzaWQsIHBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW4sIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpOworCQlpZiAoQnNzSWR4ICE9IEJTU19OT1RfRk9VTkQpCisJCXsKKwkJCU5kaXNNb3ZlTWVtb3J5KCZDdXJyQnNzLCAmcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc0lkeF0sIHNpemVvZihCU1NfRU5UUlkpKTsKKwkJfQorCX0KKworCS8vIGNsZWFuIHVwIHByZXZpb3VzIFNDQU4gcmVzdWx0LCBhZGQgY3VycmVudCBCU1MgYmFjayB0byB0YWJsZSBpZiBhbnkKKwlCc3NUYWJsZUluaXQoJnBBZC0+U2NhblRhYik7CisJaWYgKEJzc0lkeCAhPSBCU1NfTk9UX0ZPVU5EKQorCXsKKwkJLy8gRERLIE5vdGU6IElmIHRoZSBOSUMgaXMgYXNzb2NpYXRlZCB3aXRoIGEgcGFydGljdWxhciBCU1NJRCBhbmQgU1NJRAorCQkvLyAgICB0aGF0IGFyZSBub3QgY29udGFpbmVkIGluIHRoZSBsaXN0IG9mIEJTU0lEcyBnZW5lcmF0ZWQgYnkgdGhpcyBzY2FuLCB0aGUKKwkJLy8gICAgQlNTSUQgZGVzY3JpcHRpb24gb2YgdGhlIGN1cnJlbnRseSBhc3NvY2lhdGVkIEJTU0lEIGFuZCBTU0lEIHNob3VsZCBiZQorCQkvLyAgICBhcHBlbmRlZCB0byB0aGUgbGlzdCBvZiBCU1NJRHMgaW4gdGhlIE5JQydzIGRhdGFiYXNlLgorCQkvLyBUbyBlbnN1cmUgdGhpcywgd2UgYXBwZW5kIHRoaXMgQlNTIGFzIHRoZSBmaXJzdCBlbnRyeSBpbiBTQ0FOIHJlc3VsdAorCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5TY2FuVGFiLkJzc0VudHJ5WzBdLCAmQ3VyckJzcywgc2l6ZW9mKEJTU19FTlRSWSkpOworCQlwQWQtPlNjYW5UYWIuQnNzTnIgPSAxOworCX0KKworCVNjYW5QYXJtRmlsbChwQWQsICZTY2FuUmVxLCAiIiwgMCwgQlNTX0FOWSwgU0NBTl9BQ1RJVkUpOworCU1sbWVFbnF1ZXVlKHBBZCwgU1lOQ19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9TQ0FOX1JFUSwKKwkJc2l6ZW9mKE1MTUVfU0NBTl9SRVFfU1RSVUNUKSwgJlNjYW5SZXEpOworCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX1dBSVRfT0lEX0xJU1RfU0NBTjsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlCZWZvcmUgY2FsbGluZyB0aGlzIHJvdXRpbmUsIHVzZXIgZGVzaXJlZCBTU0lEIHNob3VsZCBhbHJlYWR5IGJlZW4KKwkJcmVjb3JkZWQgaW4gQ29tbW9uQ2ZnLlNzaWRbXQorCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIENudGxPaWRTc2lkUHJvYygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKiBFbGVtKQoreworCVBORElTXzgwMl8xMV9TU0lEICAgICAgICAgIHBPaWRTc2lkID0gKE5ESVNfODAyXzExX1NTSUQgKilFbGVtLT5Nc2c7CisJTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNUICAgRGlzYXNzb2NSZXE7CisJVUxPTkcJCQkJCSAgIE5vdzsKKworCS8vIFN0ZXAgMS4gcmVjb3JkIHRoZSBkZXNpcmVkIHVzZXIgc2V0dGluZ3MgdG8gTWxtZUF1eAorCU5kaXNaZXJvTWVtb3J5KHBBZC0+TWxtZUF1eC5Tc2lkLCBNQVhfTEVOX09GX1NTSUQpOworCU5kaXNNb3ZlTWVtb3J5KHBBZC0+TWxtZUF1eC5Tc2lkLCBwT2lkU3NpZC0+U3NpZCwgcE9pZFNzaWQtPlNzaWRMZW5ndGgpOworCXBBZC0+TWxtZUF1eC5Tc2lkTGVuID0gKFVDSEFSKXBPaWRTc2lkLT5Tc2lkTGVuZ3RoOworCU5kaXNaZXJvTWVtb3J5KHBBZC0+TWxtZUF1eC5Cc3NpZCwgTUFDX0FERFJfTEVOKTsKKwlwQWQtPk1sbWVBdXguQnNzVHlwZSA9IHBBZC0+U3RhQ2ZnLkJzc1R5cGU7CisKKworCS8vCisJLy8gVXBkYXRlIFJlY29ubmVjdCBTc2lkLCB0aGF0IHVzZXIgZGVzaXJlZCB0byBjb25uZWN0LgorCS8vCisJTmRpc1plcm9NZW1vcnkocEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkLCBNQVhfTEVOX09GX1NTSUQpOworCU5kaXNNb3ZlTWVtb3J5KHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZCwgcEFkLT5NbG1lQXV4LlNzaWQsIHBBZC0+TWxtZUF1eC5Tc2lkTGVuKTsKKwlwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWRMZW4gPSBwQWQtPk1sbWVBdXguU3NpZExlbjsKKworCS8vIHN0ZXAgMi4gZmluZCBhbGwgbWF0Y2hpbmcgQlNTIGluIHRoZSBsYXN0ZXN0IFNDQU4gcmVzdWx0IChpbkJzc1RhYikKKwkvLyAgICAmIGxvZyB0aGVtIGludG8gTWxtZUF1eC5Tc2lkQnNzVGFiIGZvciBsYXRlci1vbiBpdGVyYXRpb24uIFNvcnQgYnkgUlNTSSBvcmRlcgorCUJzc1RhYmxlU3NpZFNvcnQocEFkLCAmcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIsIHBBZC0+TWxtZUF1eC5Tc2lkLCBwQWQtPk1sbWVBdXguU3NpZExlbik7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDbnRsT2lkU3NpZFByb2MoKTpDTlRMIC0gJWQgQlNTIG9mICVkIEJTUyBtYXRjaCB0aGUgZGVzaXJlICglZClTU0lEIC0gJXNcbiIsCisJCQlwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NOciwgcEFkLT5TY2FuVGFiLkJzc05yLCBwQWQtPk1sbWVBdXguU3NpZExlbiwgcEFkLT5NbG1lQXV4LlNzaWQpKTsKKwlOZGlzR2V0U3lzdGVtVXBUaW1lKCZOb3cpOworCisJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSAmJgorCQkocEFkLT5Db21tb25DZmcuU3NpZExlbiA9PSBwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NFbnRyeVswXS5Tc2lkTGVuKSAmJgorCQlOZGlzRXF1YWxNZW1vcnkocEFkLT5Db21tb25DZmcuU3NpZCwgcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzRW50cnlbMF0uU3NpZCwgcEFkLT5Db21tb25DZmcuU3NpZExlbikgJiYKKwkJTUFDX0FERFJfRVFVQUwocEFkLT5Db21tb25DZmcuQnNzaWQsIHBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLkJzc0VudHJ5WzBdLkJzc2lkKSkKKwl7CisJCS8vIENhc2UgMS4gYWxyZWFkeSBjb25uZWN0ZWQgd2l0aCBhbiBBUCB3aG8gaGFzIHRoZSBkZXNpcmVkIFNTSUQKKwkJLy8gICAgICAgICB3aXRoIGhpZ2hlc3QgUlNTSQorCisJCS8vIEFkZCBjaGVja2luZyBNb2RlICJMRUFQIiBmb3IgQ0NYIDEuMAorCQlpZiAoKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpIHx8CisJCQkgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykgfHwKKwkJCSAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikgfHwKKwkJCSAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykKKyNpZmRlZiBMRUFQX1NVUFBPUlQKKwkJCSB8fCAocEFkLT5TdGFDZmcuTGVhcEF1dGhNb2RlID09IENJU0NPX0F1dGhNb2RlTEVBUCkKKyNlbmRpZiAvLyBMRUFQX1NVUFBPUlQgLy8KKwkJCSApICYmCisJCQkocEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQgPT0gV1BBXzgwMl8xWF9QT1JUX05PVF9TRUNVUkVEKSkKKwkJeworCQkJLy8gY2FzZSAxLjEgRm9yIFdQQSwgV1BBLVBTSywgaWYgdGhlIDF4IHBvcnQgaXMgbm90IHNlY3VyZWQsIHdlIGhhdmUgdG8gcmVkbworCQkJLy8gICAgICAgICAgY29ubmVjdGlvbiBwcm9jZXNzCisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDbnRsT2lkU3NpZFByb2MoKTpDTlRMIC0gZGlzYXNzb2NpYXRlIHdpdGggY3VycmVudCBBUC4uLlxuIikpOworCQkJRGlzYXNzb2NQYXJtRmlsbChwQWQsICZEaXNhc3NvY1JlcSwgcEFkLT5Db21tb25DZmcuQnNzaWQsIFJFQVNPTl9ESVNBU1NPQ19TVEFfTEVBVklORyk7CisJCQlNbG1lRW5xdWV1ZShwQWQsIEFTU09DX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX0RJU0FTU09DX1JFUSwKKwkJCQkJCXNpemVvZihNTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1QpLCAmRGlzYXNzb2NSZXEpOworCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9ESVNBU1NPQzsKKwkJfQorCQllbHNlIGlmIChwQWQtPmJDb25maWdDaGFuZ2VkID09IFRSVUUpCisJCXsKKwkJCS8vIGNhc2UgMS4yIEltcG9ydGFudCBDb25maWcgaGFzIGNoYW5nZWQsIHdlIGhhdmUgdG8gcmVjb25uZWN0IHRvIHRoZSBzYW1lIEFQCisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDbnRsT2lkU3NpZFByb2MoKTpDTlRMIC0gZGlzYXNzb2NpYXRlIHdpdGggY3VycmVudCBBUCBCZWNhdXNlIGNvbmZpZyBjaGFuZ2VkLi4uXG4iKSk7CisJCQlEaXNhc3NvY1Bhcm1GaWxsKHBBZCwgJkRpc2Fzc29jUmVxLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgUkVBU09OX0RJU0FTU09DX1NUQV9MRUFWSU5HKTsKKwkJCU1sbWVFbnF1ZXVlKHBBZCwgQVNTT0NfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfRElTQVNTT0NfUkVRLAorCQkJCQkJc2l6ZW9mKE1MTUVfRElTQVNTT0NfUkVRX1NUUlVDVCksICZEaXNhc3NvY1JlcSk7CisJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX0RJU0FTU09DOworCQl9CisJCWVsc2UKKwkJeworCQkJLy8gY2FzZSAxLjMuIGFscmVhZHkgY29ubmVjdGVkIHRvIHRoZSBTU0lEIHdpdGggaGlnaGVzdCBSU1NJLgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ250bE9pZFNzaWRQcm9jKCk6Q05UTCAtIGFscmVhZHkgd2l0aCB0aGlzIEJTU0lELiBpZ25vcmUgdGhpcyBTRVRfU1NJRCByZXF1ZXN0XG4iKSk7CisJCQkvLworCQkJLy8gKEhDVCAxMi4xKSAxY193bGFuX21lZGlhZXZlbnRzIHJlcXVpcmVkCisJCQkvLyBtZWRpYSBjb25uZWN0IGV2ZW50cyBhcmUgaW5kaWNhdGVkIHdoZW4gYXNzb2NpYXRpbmcgd2l0aCB0aGUgc2FtZSBBUAorCQkJLy8KKwkJCWlmIChJTkZSQV9PTihwQWQpKQorCQkJeworCQkJCS8vCisJCQkJLy8gU2luY2UgTWVkaWFTdGF0ZSBhbHJlYWR5IGlzIE5kaXNNZWRpYVN0YXRlQ29ubmVjdGVkCisJCQkJLy8gV2UganVzdCBpbmRpY2F0ZSB0aGUgY29ubmVjdCBldmVudCBhZ2FpbiB0byBtZWV0IHRoZSBXSFFMIHJlcXVpcmVkLgorCQkJCS8vCisJCQkJcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZUNvbm5lY3RlZDsKKwkJCQlSVE1QX0luZGljYXRlTWVkaWFTdGF0ZShwQWQpOworICAgICAgICAgICAgICAgIHBBZC0+RXh0cmFJbmZvID0gR0VORVJBTF9MSU5LX1VQOyAgIC8vIFVwZGF0ZSBleHRyYSBpbmZvcm1hdGlvbiB0byBsaW5rIGlzIHVwCisJCQl9CisKKwkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX0lETEU7CisjaWZkZWYgTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1bmlvbiBpd3JlcV9kYXRhICAgIHdycXU7CisKKyAgICAgICAgICAgICAgICBtZW1zZXQod3JxdS5hcF9hZGRyLnNhX2RhdGEsIDAsIE1BQ19BRERSX0xFTik7CisgICAgICAgICAgICAgICAgbWVtY3B5KHdycXUuYXBfYWRkci5zYV9kYXRhLCBwQWQtPk1sbWVBdXguQnNzaWQsIE1BQ19BRERSX0xFTik7CisgICAgICAgICAgICAgICAgd2lyZWxlc3Nfc2VuZF9ldmVudChwQWQtPm5ldF9kZXYsIFNJT0NHSVdBUCwgJndycXUsIE5VTEwpOworCisgICAgICAgICAgICB9CisjZW5kaWYgLy8gTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKwkJfQorCX0KKwllbHNlIGlmIChJTkZSQV9PTihwQWQpKQorCXsKKwkJLy8KKwkJLy8gRm9yIFJUNjEKKwkJLy8gWzg4ODg4XSBPSURfODAyXzExX1NTSUQgc2hvdWxkIGhhdmUgcmV0dXJuZWQgTkRURVNUX1dFUF9BUDIoUmV0dXJuZWQ6ICkKKwkJLy8gUlQ2MSBtYXkgbG9zdCBTU0lELCBhbmQgbm90IGNvbm5lY3QgdG8gTkRURVNUX1dFUF9BUDIgYW5kIHdpbGwgY29ubmVjdCB0byBORFRFU1RfV0VQX0FQMiBieSBBdXRvcmVjb25uZWN0CisJCS8vIEJ1dCBtZWRpYSBzdGF0dXMgaXMgY29ubmVjdGVkLCBzbyB0aGUgU1NJRCBub3QgcmVwb3J0IGNvcnJlY3RseS4KKwkJLy8KKwkJaWYgKCFTU0lEX0VRVUFMKHBBZC0+Q29tbW9uQ2ZnLlNzaWQsIHBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW4sIHBBZC0+TWxtZUF1eC5Tc2lkLCBwQWQtPk1sbWVBdXguU3NpZExlbikpCisJCXsKKwkJCS8vCisJCQkvLyBEaWZmZXJlbnQgU1NJRCBtZWFucyBub3QgUm9hbWluZyBjYXNlLCBzbyB3ZSBsZXQgTGlua0Rvd24oKSB0byBJbmRpY2F0ZSBhIGRpc2Nvbm5lY3QgZXZlbnQuCisJCQkvLworCQkJcEFkLT5NbG1lQXV4LkN1cnJSZXFJc0Zyb21OZGlzID0gVFJVRTsKKwkJfQorCQkvLyBjYXNlIDIuIGFjdGl2ZSBJTkZSQSBhc3NvY2lhdGlvbiBleGlzdGVudAorCQkvLyAgICByb2FtaW5nIGlzIGRvbmUgd2l0aGluIG1pbmlwb3J0IGRyaXZlciwgbm90aGluZyB0byBkbyB3aXRoIGNvbmZpZ3VyYXRpb24KKwkJLy8gICAgdXRpbGl0eS4gc28gdXBvbiBhIG5ldyBTRVQoT0lEXzgwMl8xMV9TU0lEKSBpcyByZWNlaXZlZCwgd2UganVzdAorCQkvLyAgICBkaXNhc3NvY2lhdGUgd2l0aCB0aGUgY3VycmVudCBhc3NvY2lhdGVkIEFQLAorCQkvLyAgICB0aGVuIHBlcmZvcm0gYSBuZXcgYXNzb2NpYXRpb24gd2l0aCB0aGlzIG5ldyBTU0lELCBubyBtYXR0ZXIgdGhlCisJCS8vICAgIG5ldy9vbGQgU1NJRCBhcmUgdGhlIHNhbWUgb3Igbm90LgorCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDbnRsT2lkU3NpZFByb2MoKTpDTlRMIC0gZGlzYXNzb2NpYXRlIHdpdGggY3VycmVudCBBUC4uLlxuIikpOworCQlEaXNhc3NvY1Bhcm1GaWxsKHBBZCwgJkRpc2Fzc29jUmVxLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgUkVBU09OX0RJU0FTU09DX1NUQV9MRUFWSU5HKTsKKwkJTWxtZUVucXVldWUocEFkLCBBU1NPQ19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9ESVNBU1NPQ19SRVEsCisJCQkJCXNpemVvZihNTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1QpLCAmRGlzYXNzb2NSZXEpOworCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX0RJU0FTU09DOworCX0KKwllbHNlCisJeworCQlpZiAoQURIT0NfT04ocEFkKSkKKwkJeworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ250bE9pZFNzaWRQcm9jKCk6Q05UTCAtIGRyb3AgY3VycmVudCBBREhPQ1xuIikpOworCQkJTGlua0Rvd24ocEFkLCBGQUxTRSk7CisJCQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpOworCQkJcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZURpc2Nvbm5lY3RlZDsKKwkJCVJUTVBfSW5kaWNhdGVNZWRpYVN0YXRlKHBBZCk7CisgICAgICAgICAgICBwQWQtPkV4dHJhSW5mbyA9IEdFTkVSQUxfTElOS19ET1dOOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ250bE9pZFNzaWRQcm9jKCk6TkRJU19TVEFUVVNfTUVESUFfRElTQ09OTkVDVCBFdmVudCBDIVxuIikpOworCQl9CisKKwkJaWYgKChwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NOciA9PSAwKSAmJgorCQkJKHBBZC0+U3RhQ2ZnLmJBdXRvUmVjb25uZWN0ID09IFRSVUUpICYmCisJCQkocEFkLT5NbG1lQXV4LkJzc1R5cGUgPT0gQlNTX0lORlJBKSAmJgorCQkJKE1sbWVWYWxpZGF0ZVNTSUQocEFkLT5NbG1lQXV4LlNzaWQsIHBBZC0+TWxtZUF1eC5Tc2lkTGVuKSA9PSBUUlVFKQorCQkJKQorCQl7CisJCQlNTE1FX1NDQU5fUkVRX1NUUlVDVCAgICAgICBTY2FuUmVxOworCisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDbnRsT2lkU3NpZFByb2MoKTpDTlRMIC0gTm8gbWF0Y2hpbmcgQlNTLCBzdGFydCBhIG5ldyBzY2FuXG4iKSk7CisJCQlTY2FuUGFybUZpbGwocEFkLCAmU2NhblJlcSwgcEFkLT5NbG1lQXV4LlNzaWQsIHBBZC0+TWxtZUF1eC5Tc2lkTGVuLCBCU1NfQU5ZLCBTQ0FOX0FDVElWRSk7CisJCQlNbG1lRW5xdWV1ZShwQWQsIFNZTkNfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfU0NBTl9SRVEsIHNpemVvZihNTE1FX1NDQU5fUkVRX1NUUlVDVCksICZTY2FuUmVxKTsKKwkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX1dBSVRfT0lEX0xJU1RfU0NBTjsKKwkJCS8vIFJlc2V0IE1pc3NlZCBzY2FuIG51bWJlcgorCQkJcEFkLT5TdGFDZmcuTGFzdFNjYW5UaW1lID0gTm93OworCQl9CisJCWVsc2UKKwkJeworCQkJcEFkLT5NbG1lQXV4LkJzc0lkeCA9IDA7CisJCQlJdGVyYXRlT25Cc3NUYWIocEFkKTsKKwkJfQorCX0KK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBDbnRsT2lkUlRCc3NpZFByb2MoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICogRWxlbSkKK3sKKwlVTE9ORyAgICAgICBCc3NJZHg7CisJUFVDSEFSICAgICAgcE9pZEJzc2lkID0gKFBVQ0hBUilFbGVtLT5Nc2c7CisJTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNUICAgIERpc2Fzc29jUmVxOworCU1MTUVfSk9JTl9SRVFfU1RSVUNUICAgICAgICBKb2luUmVxOworCisjaWZkZWYgUkFMSU5LX0FURQorLyogTm8gbmVlZCB0byBwZXJmb3JtIHRoaXMgcm91dGluZSB3aGVuIEFURSBpcyBydW5uaW5nLiAqLworCWlmIChBVEVfT04ocEFkKSkKKwkJcmV0dXJuOworI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKworCS8vIHJlY29yZCB1c2VyIGRlc2lyZWQgc2V0dGluZ3MKKwlDT1BZX01BQ19BRERSKHBBZC0+TWxtZUF1eC5Cc3NpZCwgcE9pZEJzc2lkKTsKKwlwQWQtPk1sbWVBdXguQnNzVHlwZSA9IHBBZC0+U3RhQ2ZnLkJzc1R5cGU7CisKKwkvLworCS8vIFVwZGF0ZSBSZWNvbm5lY3QgU3NpZCwgdGhhdCB1c2VyIGRlc2lyZWQgdG8gY29ubmVjdC4KKwkvLworCU5kaXNaZXJvTWVtb3J5KHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZCwgTUFYX0xFTl9PRl9TU0lEKTsKKwlwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWRMZW4gPSBwQWQtPk1sbWVBdXguU3NpZExlbjsKKwlOZGlzTW92ZU1lbW9yeShwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWQsIHBBZC0+TWxtZUF1eC5Tc2lkLCBwQWQtPk1sbWVBdXguU3NpZExlbik7CisKKwkvLyBmaW5kIHRoZSBkZXNpcmVkIEJTUyBpbiB0aGUgbGF0ZXN0IFNDQU4gcmVzdWx0IHRhYmxlCisJQnNzSWR4ID0gQnNzVGFibGVTZWFyY2goJnBBZC0+U2NhblRhYiwgcE9pZEJzc2lkLCBwQWQtPk1sbWVBdXguQ2hhbm5lbCk7CisJaWYgKEJzc0lkeCA9PSBCU1NfTk9UX0ZPVU5EKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ05UTCAtIEJTU0lEIG5vdCBmb3VuZC4gcmVwbHkgTkRJU19TVEFUVVNfTk9UX0FDQ0VQVEVEXG4iKSk7CisJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX0lETEU7CisJCXJldHVybjsKKwl9CisKKwkvLyBjb3B5IHRoZSBtYXRjaGVkIEJTUyBlbnRyeSBmcm9tIFNjYW5UYWIgdG8gTWxtZUF1eC5Tc2lkQnNzVGFiLiBXaHk/CisJLy8gQmVjYXVzZSB3ZSBuZWVkIHRoaXMgZW50cnkgdG8gYmVjb21lIHRoZSBKT0lOIHRhcmdldCBpbiBsYXRlciBvbiBTWU5DIHN0YXRlIG1hY2hpbmUKKwlwQWQtPk1sbWVBdXguQnNzSWR4ID0gMDsKKwlwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NOciA9IDE7CisJTmRpc01vdmVNZW1vcnkoJnBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLkJzc0VudHJ5WzBdLCAmcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc0lkeF0sIHNpemVvZihCU1NfRU5UUlkpKTsKKworCS8vcEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuID0gcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc0lkeF0uU3NpZExlbjsKKwkvL05kaXNNb3ZlTWVtb3J5KHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZCwgcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc0lkeF0uU3NpZCwgcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc0lkeF0uU3NpZExlbik7CisKKwkvLyBBZGQgU1NJRCBpbnRvIE1sbWVBdXggZm9yIHNpdGUgc3VyZXkgam9pbmluZyBoaWRkZW4gU1NJRAorCS8vcEFkLT5NbG1lQXV4LlNzaWRMZW4gPSBwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzSWR4XS5Tc2lkTGVuOworCS8vTmRpc01vdmVNZW1vcnkocEFkLT5NbG1lQXV4LlNzaWQsIHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NJZHhdLlNzaWQsIHBBZC0+TWxtZUF1eC5Tc2lkTGVuKTsKKworCS8vIDIwMDItMTEtMjYgc2tpcCB0aGUgZm9sbG93aW5nIGNoZWNraW5nLiBpLmUuIGlmIHVzZXIgd2FudHMgdG8gcmUtY29ubmVjdCB0byBzYW1lIEFQCisJLy8gICB3ZSBqdXN0IGZvbGxvdyBub3JtYWwgcHJvY2VkdXJlLiBUaGUgcmVhc29uIG9mIHVzZXIgZG9pbmcgdGhpcyBtYXkgYmVjYXVzZSBoZS9zaGUgY2hhbmdlZAorCS8vICAgQVAgdG8gYW5vdGhlciBjaGFubmVsLCBidXQgd2Ugc3RpbGwgcmVjZWl2ZWQgQkVBQ09OIGZyb20gaXQgdGh1cyBkb24ndCBjbGFpbSBMaW5rIERvd24uCisJLy8gICBTaW5jZSB1c2VyIGtub3dzIGhlJ3MgY2hhbmdlZCBBUCBjaGFubmVsLCBoZSdsbCByZS1jb25uZWN0IGFnYWluLiBCeSBza2lwcGluZyB0aGUgZm9sbG93aW5nCisJLy8gICBjaGVja2luZywgd2UnbGwgZGlzYXNzb2NpYXRlIHRoZW4gcmUtZG8gbm9ybWFsIGFzc29jaWF0aW9uIHdpdGggdGhpcyBBUCBhdCB0aGUgbmV3IGNoYW5uZWwuCisJLy8gMjAwMy0xLTYgUmUtZW5hYmxlIHRoaXMgZmVhdHVyZSBiYXNlZCBvbiBtaWNyb3NvZnQgcmVxdWlyZW1lbnQgd2hpY2ggcHJlZmVyIG5vdCB0byByZS1kbworCS8vICAgY29ubmVjdGlvbiB3aGVuIHNldHRpbmcgdGhlIHNhbWUgQlNTSUQuCisJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSAmJgorCQlNQUNfQUREUl9FUVVBTChwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgcE9pZEJzc2lkKSkKKwl7CisJCS8vIGFscmVhZHkgY29ubmVjdGVkIHRvIHRoZSBzYW1lIEJTU0lELCBnbyBiYWNrIHRvIGlkbGUgc3RhdGUgZGlyZWN0bHkKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ05UTCAtIGFscmVhZHkgaW4gdGhpcyBCU1NJRC4gaWdub3JlIHRoaXMgU0VUX0JTU0lEIHJlcXVlc3RcbiIpKTsKKwkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfSURMRTsKKyNpZmRlZiBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgICAgd3JxdTsKKworICAgICAgICAgICAgICAgIG1lbXNldCh3cnF1LmFwX2FkZHIuc2FfZGF0YSwgMCwgTUFDX0FERFJfTEVOKTsKKyAgICAgICAgICAgICAgICBtZW1jcHkod3JxdS5hcF9hZGRyLnNhX2RhdGEsIHBBZC0+TWxtZUF1eC5Cc3NpZCwgTUFDX0FERFJfTEVOKTsKKyAgICAgICAgICAgICAgICB3aXJlbGVzc19zZW5kX2V2ZW50KHBBZC0+bmV0X2RldiwgU0lPQ0dJV0FQLCAmd3JxdSwgTlVMTCk7CisKKyAgICAgICAgICAgIH0KKyNlbmRpZiAvLyBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCX0KKwllbHNlCisJeworCQlpZiAoSU5GUkFfT04ocEFkKSkKKwkJeworCQkJLy8gZGlzYXNzb2MgZnJvbSBjdXJyZW50IEFQIGZpcnN0CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gZGlzYXNzb2NpYXRlIHdpdGggY3VycmVudCBBUCAuLi5cbiIpKTsKKwkJCURpc2Fzc29jUGFybUZpbGwocEFkLCAmRGlzYXNzb2NSZXEsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBSRUFTT05fRElTQVNTT0NfU1RBX0xFQVZJTkcpOworCQkJTWxtZUVucXVldWUocEFkLCBBU1NPQ19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9ESVNBU1NPQ19SRVEsCisJCQkJCQlzaXplb2YoTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNUKSwgJkRpc2Fzc29jUmVxKTsKKworCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9ESVNBU1NPQzsKKwkJfQorCQllbHNlCisJCXsKKwkJCWlmIChBREhPQ19PTihwQWQpKQorCQkJeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBkcm9wIGN1cnJlbnQgQURIT0NcbiIpKTsKKwkJCQlMaW5rRG93bihwQWQsIEZBTFNFKTsKKwkJCQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpOworCQkJCXBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID0gTmRpc01lZGlhU3RhdGVEaXNjb25uZWN0ZWQ7CisJCQkJUlRNUF9JbmRpY2F0ZU1lZGlhU3RhdGUocEFkKTsKKyAgICAgICAgICAgICAgICBwQWQtPkV4dHJhSW5mbyA9IEdFTkVSQUxfTElOS19ET1dOOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk5ESVNfU1RBVFVTX01FRElBX0RJU0NPTk5FQ1QgRXZlbnQgQyFcbiIpKTsKKwkJCX0KKworCQkJLy8gQ2hhbmdlIHRoZSB3ZXBzdGF0dXMgdG8gb3JpZ2luYWwgd2Vwc3RhdHVzCisJCQlwQWQtPlN0YUNmZy5XZXBTdGF0dXMgICA9IHBBZC0+U3RhQ2ZnLk9yaWdXZXBTdGF0dXM7CisJCQlwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyICA9IHBBZC0+U3RhQ2ZnLk9yaWdXZXBTdGF0dXM7CisJCQlwQWQtPlN0YUNmZy5Hcm91cENpcGhlciA9IHBBZC0+U3RhQ2ZnLk9yaWdXZXBTdGF0dXM7CisKKwkJCS8vIENoZWNrIGNpcGhlciBzdWl0ZSwgQVAgbXVzdCBoYXZlIG1vcmUgc2VjdXJlZCBjaXBoZXIgdGhhbiBzdGF0aW9uIHNldHRpbmcKKwkJCS8vIFNldCB0aGUgUGFpcndpc2UgYW5kIEdyb3VwIGNpcGhlciB0byBtYXRjaCB0aGUgaW50ZW5kZWQgQVAgc2V0dGluZworCQkJLy8gV2UgY2FuIG9ubHkgY29ubmVjdCB0byBBUCB3aXRoIGxlc3Mgc2VjdXJlZCBjaXBoZXIgc2V0dGluZworCQkJaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpIHx8IChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spKQorCQkJeworCQkJCXBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID0gcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc0lkeF0uV1BBLkdyb3VwQ2lwaGVyOworCisJCQkJaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzSWR4XS5XUEEuUGFpckNpcGhlcikKKwkJCQkJcEFkLT5TdGFDZmcuUGFpckNpcGhlciA9IHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NJZHhdLldQQS5QYWlyQ2lwaGVyOworCQkJCWVsc2UgaWYgKHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NJZHhdLldQQS5QYWlyQ2lwaGVyQXV4ICE9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZCkKKwkJCQkJcEFkLT5TdGFDZmcuUGFpckNpcGhlciA9IHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NJZHhdLldQQS5QYWlyQ2lwaGVyQXV4OworCQkJCWVsc2UJLy8gVGhlcmUgaXMgbm8gUGFpckNpcGhlciBBdXgsIGRvd25ncmFkZSBvdXIgY2FwYWJpbGl0eSB0byBUS0lQCisJCQkJCXBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkOworCQkJfQorCQkJZWxzZSBpZiAoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIpIHx8IChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKSkKKwkJCXsKKwkJCQlwQWQtPlN0YUNmZy5Hcm91cENpcGhlciA9IHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NJZHhdLldQQTIuR3JvdXBDaXBoZXI7CisKKwkJCQlpZiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NJZHhdLldQQTIuUGFpckNpcGhlcikKKwkJCQkJcEFkLT5TdGFDZmcuUGFpckNpcGhlciA9IHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NJZHhdLldQQTIuUGFpckNpcGhlcjsKKwkJCQllbHNlIGlmIChwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzSWR4XS5XUEEyLlBhaXJDaXBoZXJBdXggIT0gTmRpczgwMl8xMVdFUERpc2FibGVkKQorCQkJCQlwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID0gcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc0lkeF0uV1BBMi5QYWlyQ2lwaGVyQXV4OworCQkJCWVsc2UJLy8gVGhlcmUgaXMgbm8gUGFpckNpcGhlciBBdXgsIGRvd25ncmFkZSBvdXIgY2FwYWJpbGl0eSB0byBUS0lQCisJCQkJCXBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkOworCisJCQkJLy8gUlNOIGNhcGFiaWxpdHkKKwkJCQlwQWQtPlN0YUNmZy5Sc25DYXBhYmlsaXR5ID0gcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc0lkeF0uV1BBMi5Sc25DYXBhYmlsaXR5OworCQkJfQorCisJCQkvLyBTZXQgTWl4IGNpcGhlciBmbGFnCisJCQlwQWQtPlN0YUNmZy5iTWl4Q2lwaGVyID0gKHBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPT0gcEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIpID8gRkFMU0UgOiBUUlVFOworCQkJaWYgKHBBZC0+U3RhQ2ZnLmJNaXhDaXBoZXIgPT0gVFJVRSkKKwkJCXsKKwkJCQkvLyBJZiBtaXggY2lwaGVyLCByZS1idWlsZCBSU05JRQorCQkJCVJUTVBNYWtlUlNOSUUocEFkLCBwQWQtPlN0YUNmZy5BdXRoTW9kZSwgcEFkLT5TdGFDZmcuV2VwU3RhdHVzLCAwKTsKKwkJCX0KKwkJCS8vIE5vIGFjdGl2ZSBhc3NvY2lhdGlvbiwgam9pbiB0aGUgQlNTIGltbWVkaWF0ZWx5CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gam9pbmluZyAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCAuLi5cbiIsCisJCQkJcE9pZEJzc2lkWzBdLHBPaWRCc3NpZFsxXSxwT2lkQnNzaWRbMl0scE9pZEJzc2lkWzNdLHBPaWRCc3NpZFs0XSxwT2lkQnNzaWRbNV0pKTsKKworCQkJSm9pblBhcm1GaWxsKHBBZCwgJkpvaW5SZXEsIHBBZC0+TWxtZUF1eC5Cc3NJZHgpOworCQkJTWxtZUVucXVldWUocEFkLCBTWU5DX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX0pPSU5fUkVRLCBzaXplb2YoTUxNRV9KT0lOX1JFUV9TVFJVQ1QpLCAmSm9pblJlcSk7CisKKwkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX1dBSVRfSk9JTjsKKwkJfQorCX0KK30KKworLy8gUm9hbWluZyBpcyB0aGUgb25seSBleHRlcm5hbCByZXF1ZXN0IHRyaWdnZXJpbmcgQ05UTCBzdGF0ZSBtYWNoaW5lCisvLyBkZXNwaXRlIG9mIG90aGVyICJTRVQgT0lEIiBvcGVyYXRpb24uIEFsbCAiU0VUIE9JRCIgcmVsYXRlZCBvZXJhdGlvbnMKKy8vIGhhcHBlbiBpbiBzZXF1ZW5jZSwgYmVjYXVzZSBubyBvdGhlciBTRVQgT0lEIHdpbGwgYmUgc2VudCB0byB0aGlzIGRldmljZQorLy8gdW50aWwgdGhlIHRoZSBwcmV2aW91cyBTRVQgb3BlcmF0aW9uIGlzIGNvbXBsZXRlIChzdWNjZXNzZnVsIG8gZmFpbGVkKS4KKy8vIFNvLCBob3cgZG8gd2UgcXVhcmFudGVlIHRoaXMgUk9BTUlORyByZXF1ZXN0IHdvbid0IGNvcnJ1cHQgb3RoZXIgIlNFVCBPSUQiPworLy8gb3IgYmVlbiBjb3JydXB0ZWQgYnkgb3RoZXIgIlNFVCBPSUQiPworLy8KKy8vIElSUUwgPSBESVNQQVRDSF9MRVZFTAorVk9JRCBDbnRsTWxtZVJvYW1pbmdQcm9jKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwkvLyBUT0RPOgorCS8vIEFQIGluIGRpZmZlcmVudCBjaGFubmVsIG1heSBzaG93IGxvd2VyIFJTU0kgdGhhbiBhY3R1YWwgdmFsdWU/PworCS8vIHNob3VsZCB3ZSBhZGQgYSB3ZWlnaHRpbmcgZmFjdG9yIHRvIGNvbXBlbnNhdGUgaXQ/CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJDTlRMIC0gUm9hbWluZyBpbiBNbG1lQXV4LlJvYW1UYWIuLi5cbiIpKTsKKworCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPk1sbWVBdXguU3NpZEJzc1RhYiwgJnBBZC0+TWxtZUF1eC5Sb2FtVGFiLCBzaXplb2YocEFkLT5NbG1lQXV4LlJvYW1UYWIpKTsKKwlwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NOciA9IHBBZC0+TWxtZUF1eC5Sb2FtVGFiLkJzc05yOworCisJQnNzVGFibGVTb3J0QnlSc3NpKCZwQWQtPk1sbWVBdXguU3NpZEJzc1RhYik7CisJcEFkLT5NbG1lQXV4LkJzc0lkeCA9IDA7CisJSXRlcmF0ZU9uQnNzVGFiKHBBZCk7Cit9CisKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIENudGxPaWRETFNTZXR1cFByb2MoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCVBSVF84MDJfMTFfRExTCQlwRExTID0gKFBSVF84MDJfMTFfRExTKUVsZW0tPk1zZzsKKwlNTE1FX0RMU19SRVFfU1RSVUNUCU1sbWVEbHNSZXE7CisJSU5UCQkJCQlpOworCVVTSE9SVAkJCQlyZWFzb24gPSBSRUFTT05fVU5TUEVDSUZZOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJDTlRMIC0gKE9JRCBzZXQgJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnggd2l0aCBWYWxpZD0lZCwgU3RhdHVzPSVkLCBUaW1lT3V0PSVkLCBDb3VudERvd25UaW1lcj0lZClcbiIsCisJCXBETFMtPk1hY0FkZHJbMF0sIHBETFMtPk1hY0FkZHJbMV0sIHBETFMtPk1hY0FkZHJbMl0sIHBETFMtPk1hY0FkZHJbM10sIHBETFMtPk1hY0FkZHJbNF0sIHBETFMtPk1hY0FkZHJbNV0sCisJCXBETFMtPlZhbGlkLCBwRExTLT5TdGF0dXMsIHBETFMtPlRpbWVPdXQsIHBETFMtPkNvdW50RG93blRpbWVyKSk7CisKKwlpZiAoIXBBZC0+Q29tbW9uQ2ZnLmJETFNDYXBhYmxlKQorCQlyZXR1cm47CisKKwkvLyBETFMgd2lsbCBub3QgYmUgc3VwcG9ydGVkIHdoZW4gQWRob2MgbW9kZQorCWlmIChJTkZSQV9PTihwQWQpKQorCXsKKwkJZm9yIChpID0gMDsgaSA8IE1BWF9OVU1fT0ZfRExTX0VOVFJZOyBpKyspCisJCXsKKwkJCWlmIChwRExTLT5WYWxpZCAmJiBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZCAmJiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID09IERMU19GSU5JU0gpICYmCisJCQkJKHBETFMtPlRpbWVPdXQgPT0gcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVGltZU91dCkgJiYgTUFDX0FERFJfRVFVQUwocERMUy0+TWFjQWRkciwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcikpCisJCQl7CisJCQkJLy8gMS4gU2FtZSBzZXR0aW5nLCBqdXN0IGRyb3AgaXQKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkNOVEwgLSBzZXR0aW5nIHVuY2hhbmdlZFxuIikpOworCQkJCWJyZWFrOworCQkJfQorCQkJZWxzZSBpZiAoIXBETFMtPlZhbGlkICYmIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkICYmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPT0gRExTX0ZJTklTSCkgJiYKKwkJCQlNQUNfQUREUl9FUVVBTChwRExTLT5NYWNBZGRyLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKSkKKwkJCXsKKwkJCQkvLyAyLiBEaXNhYmxlIERMUyBsaW5rIGNhc2UsIGp1c3QgdGVhciBkb3duIERMUyBsaW5rCisJCQkJcmVhc29uID0gUkVBU09OX1FPU19VTldBTlRFRF9NRUNIQU5JU007CisJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQJPSBGQUxTRTsKKwkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMJPSBETFNfTk9ORTsKKwkJCQlEbHNQYXJtRmlsbChwQWQsICZNbG1lRGxzUmVxLCAmcEFkLT5TdGFDZmcuRExTRW50cnlbaV0sIHJlYXNvbik7CisJCQkJTWxtZUVucXVldWUocEFkLCBETFNfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfRExTX1RFQVJfRE9XTiwgc2l6ZW9mKE1MTUVfRExTX1JFUV9TVFJVQ1QpLCAmTWxtZURsc1JlcSk7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJDTlRMIC0gc3RhcnQgdGVhciBkb3duIHByb2NlZHVyZVxuIikpOworCQkJCWJyZWFrOworCQkJfQorCQkJZWxzZSBpZiAoKGkgPCBNQVhfTlVNX09GX0RMU19FTlRSWSkgJiYgcERMUy0+VmFsaWQgJiYgIXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkKQorCQkJeworCQkJCS8vIDMuIEVuYWJsZSBjYXNlLCBzdGFydCBETFMgc2V0dXAgcHJvY2VkdXJlCisJCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLCBwRExTLCBzaXplb2YoUlRfODAyXzExX0RMU19VSSkpOworCisJCQkJLy9VcGRhdGUgY291bnRkb3duIHRpbWVyCisJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uQ291bnREb3duVGltZXIgPSBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5UaW1lT3V0OworCQkJCURsc1Bhcm1GaWxsKHBBZCwgJk1sbWVEbHNSZXEsICZwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXSwgcmVhc29uKTsKKwkJCQlNbG1lRW5xdWV1ZShwQWQsIERMU19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9ETFNfUkVRLCBzaXplb2YoTUxNRV9ETFNfUkVRX1NUUlVDVCksICZNbG1lRGxzUmVxKTsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkNOVEwgLSBETFMgc2V0dXAgY2FzZVxuIikpOworCQkJCWJyZWFrOworCQkJfQorCQkJZWxzZSBpZiAoKGkgPCBNQVhfTlVNX09GX0RMU19FTlRSWSkgJiYgcERMUy0+VmFsaWQgJiYgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQgJiYKKwkJCQkocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID09IERMU19GSU5JU0gpICYmICFNQUNfQUREUl9FUVVBTChwRExTLT5NYWNBZGRyLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKSkKKwkJCXsKKwkJCQkvLyA0LiB1cGRhdGUgbWFjIGNhc2UsIHRlYXIgZG93biBvbGQgRExTIGFuZCBzZXR1cCBuZXcgRExTCisJCQkJcmVhc29uID0gUkVBU09OX1FPU19VTldBTlRFRF9NRUNIQU5JU007CisJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQJPSBGQUxTRTsKKwkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMJPSBETFNfTk9ORTsKKwkJCQlEbHNQYXJtRmlsbChwQWQsICZNbG1lRGxzUmVxLCAmcEFkLT5TdGFDZmcuRExTRW50cnlbaV0sIHJlYXNvbik7CisJCQkJTWxtZUVucXVldWUocEFkLCBETFNfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfRExTX1RFQVJfRE9XTiwgc2l6ZW9mKE1MTUVfRExTX1JFUV9TVFJVQ1QpLCAmTWxtZURsc1JlcSk7CisJCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLCBwRExTLCBzaXplb2YoUlRfODAyXzExX0RMU19VSSkpOworCQkJCURsc1Bhcm1GaWxsKHBBZCwgJk1sbWVEbHNSZXEsICZwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXSwgcmVhc29uKTsKKwkJCQlNbG1lRW5xdWV1ZShwQWQsIERMU19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9ETFNfUkVRLCBzaXplb2YoTUxNRV9ETFNfUkVRX1NUUlVDVCksICZNbG1lRGxzUmVxKTsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkNOVEwgLSBETFMgdGVhciBkb3duIGFuZCByZXN0YXJ0IGNhc2VcbiIpKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWVsc2UgaWYgKHBETFMtPlZhbGlkICYmIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkICYmCisJCQkJTUFDX0FERFJfRVFVQUwocERMUy0+TWFjQWRkciwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcikgJiYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlRpbWVPdXQgIT0gcERMUy0+VGltZU91dCkpCisJCQl7CisJCQkJLy8gNS4gdXBkYXRlIHRpbWVvdXQgY2FzZSwgc3RhcnQgRExTIHNldHVwIHByb2NlZHVyZSAobm8gdGVhciBkb3duKQorCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlRpbWVPdXQJPSBwRExTLT5UaW1lT3V0OworCQkJCS8vVXBkYXRlIGNvdW50ZG93biB0aW1lcgorCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLkNvdW50RG93blRpbWVyID0gcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVGltZU91dDsKKwkJCQlEbHNQYXJtRmlsbChwQWQsICZNbG1lRGxzUmVxLCAmcEFkLT5TdGFDZmcuRExTRW50cnlbaV0sIHJlYXNvbik7CisJCQkJTWxtZUVucXVldWUocEFkLCBETFNfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfRExTX1JFUSwgc2l6ZW9mKE1MTUVfRExTX1JFUV9TVFJVQ1QpLCAmTWxtZURsc1JlcSk7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJDTlRMIC0gRExTIHVwZGF0ZSB0aW1lb3V0IGNhc2VcbiIpKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWVsc2UgaWYgKHBETFMtPlZhbGlkICYmIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkICYmCisJCQkJKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyAhPSBETFNfRklOSVNIKSAmJiBNQUNfQUREUl9FUVVBTChwRExTLT5NYWNBZGRyLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKSkKKwkJCXsKKwkJCQkvLyA2LiByZS1zZXR1cCBjYXNlLCBzdGFydCBETFMgc2V0dXAgcHJvY2VkdXJlIChubyB0ZWFyIGRvd24pCisJCQkJRGxzUGFybUZpbGwocEFkLCAmTWxtZURsc1JlcSwgJnBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLCByZWFzb24pOworCQkJCU1sbWVFbnF1ZXVlKHBBZCwgRExTX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX0RMU19SRVEsIHNpemVvZihNTE1FX0RMU19SRVFfU1RSVUNUKSwgJk1sbWVEbHNSZXEpOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQ05UTCAtIERMUyByZXRyeSBzZXR1cCBwcm9jZWR1cmVcbiIpKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19XQVJOLCgiQ05UTCAtIERMUyBub3QgY2hhbmdlZCBpbiBlbnRyeSAtICVkIC0gVmFsaWQ9JWQsIFN0YXR1cz0lZCwgVGltZU91dD0lZFxuIiwKKwkJCQkJaSwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cywgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVGltZU91dCkpOworCQkJfQorCQl9CisJfQorfQorI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBDbnRsV2FpdERpc2Fzc29jUHJvYygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisJTUxNRV9TVEFSVF9SRVFfU1RSVUNUICAgICBTdGFydFJlcTsKKworCWlmIChFbGVtLT5Nc2dUeXBlID09IE1UMl9ESVNBU1NPQ19DT05GKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ05UTCAtIERpcy1hc3NvY2lhdGUgc3VjY2Vzc2Z1bFxuIikpOworCisJICAgIGlmIChwQWQtPkNvbW1vbkNmZy5iV2lyZWxlc3NFdmVudCkKKwkJeworCQkJUlRNUFNlbmRXaXJlbGVzc0V2ZW50KHBBZCwgSVdfRElTQVNTT0NfRVZFTlRfRkxBRywgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5BZGRyLCBCU1MwLCAwKTsKKwkJfQorCisJCUxpbmtEb3duKHBBZCwgRkFMU0UpOworCisJCS8vIGNhc2UgMS4gbm8gbWF0Y2hpbmcgQlNTLCBhbmQgdXNlciB3YW50cyBBREhPQywgc28gd2UganVzdCBzdGFydCBhIG5ldyBvbmUKKwkJaWYgKChwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NOcj09MCkgJiYgKHBBZC0+U3RhQ2ZnLkJzc1R5cGUgPT0gQlNTX0FESE9DKSkKKwkJeworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ05UTCAtIE5vIG1hdGNoaW5nIEJTUywgc3RhcnQgYSBuZXcgQURIT0MgKFNzaWQ9JXMpLi4uXG4iLHBBZC0+TWxtZUF1eC5Tc2lkKSk7CisJCQlTdGFydFBhcm1GaWxsKHBBZCwgJlN0YXJ0UmVxLCBwQWQtPk1sbWVBdXguU3NpZCwgcEFkLT5NbG1lQXV4LlNzaWRMZW4pOworCQkJTWxtZUVucXVldWUocEFkLCBTWU5DX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX1NUQVJUX1JFUSwgc2l6ZW9mKE1MTUVfU1RBUlRfUkVRX1NUUlVDVCksICZTdGFydFJlcSk7CisJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX1NUQVJUOworCQl9CisJCS8vIGNhc2UgMi4gdHJ5IGVhY2ggbWF0Y2hlZCBCU1MKKwkJZWxzZQorCQl7CisJCQlwQWQtPk1sbWVBdXguQnNzSWR4ID0gMDsKKworCQkJSXRlcmF0ZU9uQnNzVGFiKHBBZCk7CisJCX0KKwl9Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIENudGxXYWl0Sm9pblByb2MoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCVVTSE9SVCAgICAgICAgICAgICAgICAgICAgICBSZWFzb247CisJTUxNRV9BVVRIX1JFUV9TVFJVQ1QgICAgICAgIEF1dGhSZXE7CisKKwlpZiAoRWxlbS0+TXNnVHlwZSA9PSBNVDJfSk9JTl9DT05GKQorCXsKKwkJTmRpc01vdmVNZW1vcnkoJlJlYXNvbiwgRWxlbS0+TXNnLCBzaXplb2YoVVNIT1JUKSk7CisJCWlmIChSZWFzb24gPT0gTUxNRV9TVUNDRVNTKQorCQl7CisJCQkvLyAxLiBqb2luZWQgYW4gSUJTUywgd2UgYXJlIHByZXR0eSBtdWNoIGRvbmUgaGVyZQorCQkJaWYgKHBBZC0+TWxtZUF1eC5Cc3NUeXBlID09IEJTU19BREhPQykKKwkJCXsKKwkJCSAgICAvLworCQkJCS8vIDVHIGJhbmRzIHJ1bGVzIG9mIEphcGFuOgorCQkJCS8vIEFkIGhvYyBtdXN0IGJlIGRpc2FibGVkIGluIFc1MyhjaDUyLDU2LDYwLDY0KSBjaGFubmVscy4KKwkJCQkvLworCQkJCWlmICggKHBBZC0+Q29tbW9uQ2ZnLmJJRUVFODAyMTFIID09IDEpICYmCisgICAgICAgICAgICAgICAgICAgICAgUmFkYXJDaGFubmVsQ2hlY2socEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKQorCQkJCSAgICkKKwkJCQl7CisJCQkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX0lETEU7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBDaGFubmVsPSVkLCBKb2luIGFkaG9jIG9uIFc1Myg1Miw1Niw2MCw2NCkgQ2hhbm5lbHMgYXJlIG5vdCBhY2NlcHRlZFxuIiwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkpOworCQkJCQlyZXR1cm47CisJCQkJfQorCisJCQkJTGlua1VwKHBBZCwgQlNTX0FESE9DKTsKKwkJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9JRExFOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBqb2luIHRoZSBJQlNTID0gJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnggLi4uXG4iLAorCQkJCXBBZC0+Q29tbW9uQ2ZnLkJzc2lkWzBdLHBBZC0+Q29tbW9uQ2ZnLkJzc2lkWzFdLHBBZC0+Q29tbW9uQ2ZnLkJzc2lkWzJdLAorCQkJCXBBZC0+Q29tbW9uQ2ZnLkJzc2lkWzNdLHBBZC0+Q29tbW9uQ2ZnLkJzc2lkWzRdLHBBZC0+Q29tbW9uQ2ZnLkJzc2lkWzVdKSk7CisKKyAgICAgICAgICAgICAgICBwQWQtPkluZGljYXRlTWVkaWFTdGF0ZSA9IE5kaXNNZWRpYVN0YXRlQ29ubmVjdGVkOworICAgICAgICAgICAgICAgIHBBZC0+RXh0cmFJbmZvID0gR0VORVJBTF9MSU5LX1VQOworCQkJfQorCQkJLy8gMi4gam9pbmVkIGEgbmV3IElORlJBIG5ldHdvcmssIHN0YXJ0IGZyb20gYXV0aGVudGljYXRpb24KKwkJCWVsc2UKKwkJCXsKKyNpZmRlZiBMRUFQX1NVUFBPUlQKKwkJCQkvLyBBZGQgQXV0aE1vZGUgIkxFQVAiIGZvciBDQ1ggMS5YCisJCQkJaWYgKHBBZC0+U3RhQ2ZnLkxlYXBBdXRoTW9kZSA9PSBDSVNDT19BdXRoTW9kZUxFQVApCisJCQkJeworCQkJCQlBdXRoUGFybUZpbGwocEFkLCAmQXV0aFJlcSwgcEFkLT5NbG1lQXV4LkJzc2lkLCBDSVNDT19BdXRoTW9kZUxFQVApOworCQkJCX0KKwkJCQllbHNlCisjZW5kaWYgLy8gTEVBUF9TVVBQT1JUIC8vCisJCQkJeworCQkJCQkvLyBlaXRoZXIgTmRpczgwMl8xMUF1dGhNb2RlU2hhcmVkIG9yIE5kaXM4MDJfMTFBdXRoTW9kZUF1dG9Td2l0Y2gsIHRyeSBzaGFyZWQga2V5IGZpcnN0CisJCQkJCWlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlU2hhcmVkKSB8fAorCQkJCQkJKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZUF1dG9Td2l0Y2gpKQorCQkJCQl7CisJCQkJCQlBdXRoUGFybUZpbGwocEFkLCAmQXV0aFJlcSwgcEFkLT5NbG1lQXV4LkJzc2lkLCBOZGlzODAyXzExQXV0aE1vZGVTaGFyZWQpOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJQXV0aFBhcm1GaWxsKHBBZCwgJkF1dGhSZXEsIHBBZC0+TWxtZUF1eC5Cc3NpZCwgTmRpczgwMl8xMUF1dGhNb2RlT3Blbik7CisJCQkJCX0KKwkJCQl9CisJCQkJTWxtZUVucXVldWUocEFkLCBBVVRIX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX0FVVEhfUkVRLAorCQkJCQkJCXNpemVvZihNTE1FX0FVVEhfUkVRX1NUUlVDVCksICZBdXRoUmVxKTsKKworCQkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX1dBSVRfQVVUSDsKKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCS8vIDMuIGZhaWxlZCwgdHJ5IG5leHQgQlNTCisJCQlwQWQtPk1sbWVBdXguQnNzSWR4Kys7CisJCQlJdGVyYXRlT25Cc3NUYWIocEFkKTsKKwkJfQorCX0KK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBDbnRsV2FpdFN0YXJ0UHJvYygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisJVVNIT1JUICAgICAgUmVzdWx0OworCisJaWYgKEVsZW0tPk1zZ1R5cGUgPT0gTVQyX1NUQVJUX0NPTkYpCisJeworCQlOZGlzTW92ZU1lbW9yeSgmUmVzdWx0LCBFbGVtLT5Nc2csIHNpemVvZihVU0hPUlQpKTsKKwkJaWYgKFJlc3VsdCA9PSBNTE1FX1NVQ0NFU1MpCisJCXsKKwkJICAgIC8vCisJCQkvLyA1RyBiYW5kcyBydWxlcyBvZiBKYXBhbjoKKwkJCS8vIEFkIGhvYyBtdXN0IGJlIGRpc2FibGVkIGluIFc1MyhjaDUyLDU2LDYwLDY0KSBjaGFubmVscy4KKwkJCS8vCisJCQlpZiAoIChwQWQtPkNvbW1vbkNmZy5iSUVFRTgwMjExSCA9PSAxKSAmJgorICAgICAgICAgICAgICAgICAgUmFkYXJDaGFubmVsQ2hlY2socEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKQorCQkJICAgKQorCQkJeworCQkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX0lETEU7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ05UTCAtIENoYW5uZWw9JWQsIFN0YXJ0IGFkaG9jIG9uIFc1Myg1Miw1Niw2MCw2NCkgQ2hhbm5lbHMgYXJlIG5vdCBhY2NlcHRlZFxuIiwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkpOworCQkJCXJldHVybjsKKwkJCX0KKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCWlmIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID49IFBIWV8xMUFCR05fTUlYRUQpCisJCQl7CisJCQkJTl9DaGFubmVsQ2hlY2socEFkKTsKKwkJCQlTZXRDb21tb25IVChwQWQpOworCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPk1sbWVBdXguQWRkSHRJbmZvLCAmcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLCBzaXplb2YoQUREX0hUX0lORk9fSUUpKTsKKwkJCQlSVE1QQ2hlY2tIdChwQWQsIEJTU0lEX1dDSUQsICZwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHksICZwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8pOworCQkJCXBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uYkh0RW5hYmxlID0gVFJVRTsKKwkJCQlOZGlzWmVyb01lbW9yeSgmcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5NQ1NTZXRbMF0sIDE2KTsKKwkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5NQ1NTZXRbMF0sICZwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuTUNTU2V0WzBdLCAxNik7CisJCQkJQ09QWV9IVFNFVFRJTkdTX0ZST01fTUxNRV9BVVhfVE9fQUNUSVZFX0NGRyhwQWQpOworCisJCQkJaWYgKChwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkNoYW5uZWxXaWR0aCAgPT0gQldfNDApICYmCisJCQkJCShwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8uQWRkSHRJbmZvLkV4dENoYW5PZmZzZXQgPT0gRVhUQ0hBX0FCT1ZFKSkKKwkJCQl7CisJCQkJCXBBZC0+TWxtZUF1eC5DZW50cmFsQ2hhbm5lbCA9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgKyAyOworCQkJCX0KKwkJCQllbHNlIGlmICgocEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5DaGFubmVsV2lkdGggID09IEJXXzQwKSAmJgorCQkJCQkJIChwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8uQWRkSHRJbmZvLkV4dENoYW5PZmZzZXQgPT0gRVhUQ0hBX0JFTE9XKSkKKwkJCQl7CisJCQkJCXBBZC0+TWxtZUF1eC5DZW50cmFsQ2hhbm5lbCA9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgLSAyOworCQkJCX0KKwkJCX0KKwkJCWVsc2UKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJCXsKKwkJCQlwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLmJIdEVuYWJsZSA9IEZBTFNFOworCQkJfQorCQkJTGlua1VwKHBBZCwgQlNTX0FESE9DKTsKKwkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX0lETEU7CisJCQkvLyBCZWZvcmUgc2VuZCBiZWFjb24sIGRyaXZlciBuZWVkIGRvIHJhZGFyIGRldGVjdGlvbgorCQkJaWYgKChwQWQtPkNvbW1vbkNmZy5DaGFubmVsID4gMTQgKQorCQkJCSYmIChwQWQtPkNvbW1vbkNmZy5iSUVFRTgwMjExSCA9PSAxKQorCQkJCSYmIFJhZGFyQ2hhbm5lbENoZWNrKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkpCisJCQl7CisJCQkJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkRNb2RlID0gUkRfU0lMRU5DRV9NT0RFOworCQkJCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJEQ291bnQgPSAwOworI2lmZGVmIERGU19TVVBQT1JUCisJCQkJQmJwUmFkYXJEZXRlY3Rpb25TdGFydChwQWQpOworI2VuZGlmIC8vIERGU19TVVBQT1JUIC8vCisJCQl9CisKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBzdGFydCBhIG5ldyBJQlNTID0gJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnggLi4uXG4iLAorCQkJCXBBZC0+Q29tbW9uQ2ZnLkJzc2lkWzBdLHBBZC0+Q29tbW9uQ2ZnLkJzc2lkWzFdLHBBZC0+Q29tbW9uQ2ZnLkJzc2lkWzJdLAorCQkJCXBBZC0+Q29tbW9uQ2ZnLkJzc2lkWzNdLHBBZC0+Q29tbW9uQ2ZnLkJzc2lkWzRdLHBBZC0+Q29tbW9uQ2ZnLkJzc2lkWzVdKSk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gU3RhcnQgSUJTUyBmYWlsLiBCVUchISEhIVxuIikpOworCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfSURMRTsKKwkJfQorCX0KK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgQ250bFdhaXRBdXRoUHJvYygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisJVVNIT1JUICAgICAgICAgICAgICAgICAgICAgICBSZWFzb247CisJTUxNRV9BU1NPQ19SRVFfU1RSVUNUICAgICAgICBBc3NvY1JlcTsKKwlNTE1FX0FVVEhfUkVRX1NUUlVDVCAgICAgICAgIEF1dGhSZXE7CisKKwlpZiAoRWxlbS0+TXNnVHlwZSA9PSBNVDJfQVVUSF9DT05GKQorCXsKKwkJTmRpc01vdmVNZW1vcnkoJlJlYXNvbiwgRWxlbS0+TXNnLCBzaXplb2YoVVNIT1JUKSk7CisJCWlmIChSZWFzb24gPT0gTUxNRV9TVUNDRVNTKQorCQl7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gQVVUSCBPS1xuIikpOworCQkJQXNzb2NQYXJtRmlsbChwQWQsICZBc3NvY1JlcSwgcEFkLT5NbG1lQXV4LkJzc2lkLCBwQWQtPk1sbWVBdXguQ2FwYWJpbGl0eUluZm8sCisJCQkJCQkgIEFTU09DX1RJTUVPVVQsIHBBZC0+U3RhQ2ZnLkRlZmF1bHRMaXN0ZW5Db3VudCk7CisKKyNpZmRlZiBMRUFQX1NVUFBPUlQKKwkJCS8vCisJCQkvLyBDaXNjbyBMZWFwIENDS00gc3VwcG9ydGVkIFJlLWFzc29jaWF0aW9uLgorCQkJLy8KKwkJCWlmIChMRUFQX0NDS01fT04ocEFkKSAmJiAocEFkLT5TdGFDZmcuQ0NLTUxpbmtVcEZsYWcgPT0gVFJVRSkpCisJCQl7CisJCQkJLy9pZiBDQ0tNIGlzIHR1cm4gb24gLCB0aGF0J3MgbWVhbiBGYXN0IFJlYXV0aGVudGljYXRpb24KKwkJCQkvL1VzZSBDQ0tNIFJlYXNzb2NpYXRpb24gaW5zdGVhZCBvZiBub3JtYWwgYXNzb2NpYXRpb24gZm9yIEZhc3QgUm9hbWluZy4KKwkJCQlNbG1lRW5xdWV1ZShwQWQsIEFTU09DX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX1JFQVNTT0NfUkVRLAorCQkJCQkJCXNpemVvZihNTE1FX0FTU09DX1JFUV9TVFJVQ1QpLCAmQXNzb2NSZXEpOworCisJCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9SRUFTU09DOworCQkJfQorCQkJZWxzZQorI2VuZGlmIC8vIExFQVBfU1VQUE9SVCAvLworCQkJeworCQkJCU1sbWVFbnF1ZXVlKHBBZCwgQVNTT0NfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfQVNTT0NfUkVRLAorCQkJCQkJCXNpemVvZihNTE1FX0FTU09DX1JFUV9TVFJVQ1QpLCAmQXNzb2NSZXEpOworCisJCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9BU1NPQzsKKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCS8vIFRoaXMgZmFpbCBtYXkgYmVjYXVzZSBvZiB0aGUgQVAgYWxyZWFkeSBrZWVwIHVzIGluIGl0cyBNQUMgdGFibGUgd2l0aG91dAorCQkJLy8gYWdlaW5nLW91dC4gVGhlIHByZXZpb3VzIGF1dGhlbnRpY2F0aW9uIGF0dGVtcHQgbXVzdCBoYXZlIGxldCBpdCByZW1vdmUgdXMuCisJCQkvLyBzbyB0cnkgQXV0aGVudGljYXRpb24gYWdhaW4gbWF5IGhlbHAuIEZvciBELUxpbmsgRFdMLTkwMEFQKyBjb21wYXRpYmlsaXR5LgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ05UTCAtIEFVVEggRkFJTCwgdHJ5IGFnYWluLi4uXG4iKSk7CisjaWZkZWYgTEVBUF9TVVBQT1JUCisJCQkvL0FkZCBBdXRoTW9kZSAiTEVBUCIgZm9yIENDWCAxLlgKKwkJCWlmIChwQWQtPlN0YUNmZy5MZWFwQXV0aE1vZGUgPT0gQ0lTQ09fQXV0aE1vZGVMRUFQKQorCQkJeworCQkJCUF1dGhQYXJtRmlsbChwQWQsICZBdXRoUmVxLCBwQWQtPk1sbWVBdXguQnNzaWQsIENJU0NPX0F1dGhNb2RlTEVBUCk7CisJCQl9CisJCQllbHNlCisjZW5kaWYgLy8gTEVBUF9TVVBQT1JUIC8vCisJCQl7CisJCQkJaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVTaGFyZWQpIHx8CisJCQkJCShwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVBdXRvU3dpdGNoKSkKKwkJCQl7CisJCQkJCS8vIGVpdGhlciBOZGlzODAyXzExQXV0aE1vZGVTaGFyZWQgb3IgTmRpczgwMl8xMUF1dGhNb2RlQXV0b1N3aXRjaCwgdHJ5IHNoYXJlZCBrZXkgZmlyc3QKKwkJCQkJQXV0aFBhcm1GaWxsKHBBZCwgJkF1dGhSZXEsIHBBZC0+TWxtZUF1eC5Cc3NpZCwgTmRpczgwMl8xMUF1dGhNb2RlU2hhcmVkKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJQXV0aFBhcm1GaWxsKHBBZCwgJkF1dGhSZXEsIHBBZC0+TWxtZUF1eC5Cc3NpZCwgTmRpczgwMl8xMUF1dGhNb2RlT3Blbik7CisJCQkJfQorCQkJfQorCQkJTWxtZUVucXVldWUocEFkLCBBVVRIX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX0FVVEhfUkVRLAorCQkJCQkJc2l6ZW9mKE1MTUVfQVVUSF9SRVFfU1RSVUNUKSwgJkF1dGhSZXEpOworCisJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX0FVVEgyOworCQl9CisJfQorfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBDbnRsV2FpdEF1dGhQcm9jMigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisJVVNIT1JUICAgICAgICAgICAgICAgICAgICAgICBSZWFzb247CisJTUxNRV9BU1NPQ19SRVFfU1RSVUNUICAgICAgICBBc3NvY1JlcTsKKwlNTE1FX0FVVEhfUkVRX1NUUlVDVCAgICAgICAgIEF1dGhSZXE7CisKKwlpZiAoRWxlbS0+TXNnVHlwZSA9PSBNVDJfQVVUSF9DT05GKQorCXsKKwkJTmRpc01vdmVNZW1vcnkoJlJlYXNvbiwgRWxlbS0+TXNnLCBzaXplb2YoVVNIT1JUKSk7CisJCWlmIChSZWFzb24gPT0gTUxNRV9TVUNDRVNTKQorCQl7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gQVVUSCBPS1xuIikpOworCQkJQXNzb2NQYXJtRmlsbChwQWQsICZBc3NvY1JlcSwgcEFkLT5NbG1lQXV4LkJzc2lkLCBwQWQtPk1sbWVBdXguQ2FwYWJpbGl0eUluZm8sCisJCQkJCQkgIEFTU09DX1RJTUVPVVQsIHBBZC0+U3RhQ2ZnLkRlZmF1bHRMaXN0ZW5Db3VudCk7CisJCQlNbG1lRW5xdWV1ZShwQWQsIEFTU09DX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX0FTU09DX1JFUSwKKwkJCQkJCXNpemVvZihNTE1FX0FTU09DX1JFUV9TVFJVQ1QpLCAmQXNzb2NSZXEpOworCisJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX0FTU09DOworCQl9CisJCWVsc2UKKwkJeworI2lmZGVmIExFQVBfU1VQUE9SVAorCQkJLy8gUHJvY2VzcyBMRUFQIGZpcnN0LCBzaW5jZSBpdCB1c2UgZGlmZmVyZW50IGNvbnRyb2wgdmFyaWFibGUKKwkJCS8vIFdlIGRvbid0IHdhbnQgdG8gYWZmZWN0IG90aGVyIHBvdmVuIG9wZXJhdGlvbgorCQkJaWYgKHBBZC0+U3RhQ2ZnLkxlYXBBdXRoTW9kZSA9PSBDSVNDT19BdXRoTW9kZUxFQVApCisJCQl7CisJCQkJLy8gTEVBUCBBdXRoIG5vdCBzdWNjZXNzLCB0cnkgbmV4dCBCU1MKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gKkxFQVAqIEFVVEggRkFJTCwgZ2l2ZSB1cDsgdHJ5IG5leHQgQlNTXG4iKSk7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiVG90YWwgbWF0Y2ggQlNTSUQgWz0lZF1cbiIsIHBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLkJzc05yKSk7CisJCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfSURMRTsKKwkJCQlwQWQtPk1sbWVBdXguQnNzSWR4Kys7CisJCQkJSXRlcmF0ZU9uQnNzVGFiKHBBZCk7CisJCQl9CisJCQllbHNlCisjZW5kaWYgLy8gTEVBUF9TVVBQT1JUIC8vCisJCQlpZiAoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZUF1dG9Td2l0Y2gpICYmCisJCQkJIChwQWQtPk1sbWVBdXguQWxnID09IE5kaXM4MDJfMTFBdXRoTW9kZVNoYXJlZCkpCisJCQl7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ05UTCAtIEFVVEggRkFJTCwgdHJ5IE9QRU4gc3lzdGVtLi4uXG4iKSk7CisJCQkJQXV0aFBhcm1GaWxsKHBBZCwgJkF1dGhSZXEsIHBBZC0+TWxtZUF1eC5Cc3NpZCwgTmRpczgwMl8xMUF1dGhNb2RlT3Blbik7CisJCQkJTWxtZUVucXVldWUocEFkLCBBVVRIX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX0FVVEhfUkVRLAorCQkJCQkJCXNpemVvZihNTE1FX0FVVEhfUkVRX1NUUlVDVCksICZBdXRoUmVxKTsKKworCQkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX1dBSVRfQVVUSDI7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJLy8gbm90IHN1Y2Nlc3MsIHRyeSBuZXh0IEJTUworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBBVVRIIEZBSUwsIGdpdmUgdXA7IHRyeSBuZXh0IEJTU1xuIikpOworCQkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX0lETEU7IC8vPz8/Pz8/PworCQkJCXBBZC0+TWxtZUF1eC5Cc3NJZHgrKzsKKwkJCQlJdGVyYXRlT25Cc3NUYWIocEFkKTsKKwkJCX0KKwkJfQorCX0KK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgQ250bFdhaXRBc3NvY1Byb2MoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCVVTSE9SVCAgICAgIFJlYXNvbjsKKworCWlmIChFbGVtLT5Nc2dUeXBlID09IE1UMl9BU1NPQ19DT05GKQorCXsKKwkJTmRpc01vdmVNZW1vcnkoJlJlYXNvbiwgRWxlbS0+TXNnLCBzaXplb2YoVVNIT1JUKSk7CisJCWlmIChSZWFzb24gPT0gTUxNRV9TVUNDRVNTKQorCQl7CisJCQlMaW5rVXAocEFkLCBCU1NfSU5GUkEpOworCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfSURMRTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBBc3NvY2lhdGlvbiBzdWNjZXNzZnVsIG9uIEJTUyAjJWxkXG4iLHBBZC0+TWxtZUF1eC5Cc3NJZHgpKTsKKworCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJXaXJlbGVzc0V2ZW50KQorCQkJeworCQkJCVJUTVBTZW5kV2lyZWxlc3NFdmVudChwQWQsIElXX0FTU09DX0VWRU5UX0ZMQUcsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQWRkciwgQlNTMCwgMCk7CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQkvLyBub3Qgc3VjY2VzcywgdHJ5IG5leHQgQlNTCisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gQXNzb2NpYXRpb24gZmFpbHMgb24gQlNTICMlbGRcbiIscEFkLT5NbG1lQXV4LkJzc0lkeCkpOworCQkJcEFkLT5NbG1lQXV4LkJzc0lkeCsrOworCQkJSXRlcmF0ZU9uQnNzVGFiKHBBZCk7CisJCX0KKwl9Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIENudGxXYWl0UmVhc3NvY1Byb2MoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCVVTSE9SVCAgICAgIFJlc3VsdDsKKworCWlmIChFbGVtLT5Nc2dUeXBlID09IE1UMl9SRUFTU09DX0NPTkYpCisJeworCQlOZGlzTW92ZU1lbW9yeSgmUmVzdWx0LCBFbGVtLT5Nc2csIHNpemVvZihVU0hPUlQpKTsKKwkJaWYgKFJlc3VsdCA9PSBNTE1FX1NVQ0NFU1MpCisJCXsKKwkJCS8vCisJCQkvLyBORElTIHJlcXVpcmVzIGEgbmV3IExpbmsgVVAgaW5kaWNhdGlvbiBidXQgbm8gTGluayBEb3duIGZvciBSRS1BU1NPQworCQkJLy8KKwkJCUxpbmtVcChwQWQsIEJTU19JTkZSQSk7CisKKwkJCS8vIHNlbmQgd2lyZWxlc3MgZXZlbnQgLSBmb3IgYXNzb2NpYXRpb24KKwkJCWlmIChwQWQtPkNvbW1vbkNmZy5iV2lyZWxlc3NFdmVudCkKKwkJCQlSVE1QU2VuZFdpcmVsZXNzRXZlbnQocEFkLCBJV19BU1NPQ19FVkVOVF9GTEFHLCBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkFkZHIsIEJTUzAsIDApOworCisKKyNpZmRlZiBMRUFQX1NVUFBPUlQKKwkJCWlmIChMRUFQX0NDS01fT04ocEFkKSkKKwkJCXsKKwkJCQlTVEFfUE9SVF9TRUNVUkVEKHBBZCk7CisJCQkJcEFkLT5TdGFDZmcuV3BhU3RhdGUgPSBTU19GSU5JU0g7CisJCQl9CisjZW5kaWYgLy8gTEVBUF9TVVBQT1JUIC8vCisJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9JRExFOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ05UTCAtIFJlLWFzc29jaXRpb24gc3VjY2Vzc2Z1bCBvbiBCU1MgIyVsZFxuIiwgcEFkLT5NbG1lQXV4LlJvYW1JZHgpKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCS8vIHJlYXNzb2MgZmFpbGVkLCB0cnkgdG8gcGljayBuZXh0IEJTUyBpbiB0aGUgQlNTIFRhYmxlCisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gUmUtYXNzb2NpdGlvbiBmYWlscyBvbiBCU1MgIyVsZFxuIiwgcEFkLT5NbG1lQXV4LlJvYW1JZHgpKTsKKwkJCXBBZC0+TWxtZUF1eC5Sb2FtSWR4Kys7CisJCQlJdGVyYXRlT25Cc3NUYWIyKHBBZCk7CisJCX0KKwl9Cit9CisKKworVk9JRAlBZGhvY1R1cm5PblFvcygKKwlJTiAgUFJUTVBfQURBUFRFUiBwQWQpCit7CisjZGVmaW5lIEFDMF9ERUZfVFhPUAkJMAorI2RlZmluZSBBQzFfREVGX1RYT1AJCTAKKyNkZWZpbmUgQUMyX0RFRl9UWE9QCQk5NAorI2RlZmluZSBBQzNfREVGX1RYT1AJCTQ3CisKKwkvLyBUdXJuIG9uIFFPcyBpZiB1c2UgSFQgcmF0ZS4KKwlpZiAocEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5iVmFsaWQgPT0gRkFMU0UpCisJeworCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLmJWYWxpZCA9IFRSVUU7CisJCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uQWlmc25bMF0gPSAzOworCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLkFpZnNuWzFdID0gNzsKKwkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5BaWZzblsyXSA9IDE7CisJCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uQWlmc25bM10gPSAxOworCisJCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uQ3dtaW5bMF0gPSA0OworCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLkN3bWluWzFdID0gNDsKKwkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5Dd21pblsyXSA9IDM7CisJCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uQ3dtaW5bM10gPSAyOworCisJCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uQ3dtYXhbMF0gPSAxMDsKKwkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5Dd21heFsxXSA9IDY7CisJCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uQ3dtYXhbMl0gPSA0OworCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLkN3bWF4WzNdID0gMzsKKworCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLlR4b3BbMF0gID0gMDsKKwkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5UeG9wWzFdICA9IDA7CisJCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uVHhvcFsyXSAgPSBBQzJfREVGX1RYT1A7CisJCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uVHhvcFszXSAgPSBBQzNfREVGX1RYT1A7CisJfQorCUFzaWNTZXRFZGNhUGFybShwQWQsICZwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgTGlua1VwKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVDSEFSIEJzc1R5cGUpCit7CisJVUxPTkcJTm93OworCVVJTlQzMglEYXRhOworCUJPT0xFQU4JQ2FuY2VsbGVkOworCVVDSEFSCVZhbHVlID0gMCwgaWR4OworCU1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5ID0gTlVMTCwgKnBDdXJyRW50cnk7CisKKwlwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXTsKKworCS8vCisJLy8gQVNTT0MgLSBEaXNhc3NvY1RpbWVvdXRBY3Rpb24KKwkvLyBDTlRMIC0gRGlzLWFzc29jaWF0ZSBzdWNjZXNzZnVsCisJLy8gISEhIExJTksgRE9XTiAhISEKKwkvLyBbODg4ODhdIE9JRF84MDJfMTFfU1NJRCBzaG91bGQgaGF2ZSByZXR1cm5lZCBORFRFU1RfV0VQX0FQMihSZXR1cm5lZDogKQorCS8vCisJLy8gVG8gcHJldmVudCBEaXNhc3NvY1RpbWVvdXRBY3Rpb24gdG8gY2FsbCBMaW5rIGRvd24gYWZ0ZXIgd2UgbGluayB1cCwKKwkvLyBjYW5jZWwgdGhlIERpc2Fzc29jVGltZXIgbm8gbWF0dGVyIHdoYXQgaXQgc3RhcnQgb3Igbm90LgorCS8vCisJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguRGlzYXNzb2NUaW1lciwgICZDYW5jZWxsZWQpOworCisJQ09QWV9TRVRUSU5HU19GUk9NX01MTUVfQVVYX1RPX0FDVElWRV9DRkcocEFkKTsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCUNPUFlfSFRTRVRUSU5HU19GUk9NX01MTUVfQVVYX1RPX0FDVElWRV9DRkcocEFkKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkvLyBJdCdzIHF1aXRlIGRpZmZpY3VsdCB0byB0ZWxsIGlmIGEgbmV3bHkgYWRkZWQgS0VZIGlzIFdFUCBvciBDS0lQIHVudGlsIGEgbmV3IEJTUworCS8vIGlzIGZvcm1lZCAoZWl0aGVyIEFTU09DL1JFLUFTU09DIGRvbmUgb3IgSUJTUyBzdGFydGVkLiBMaW5rVVAgc2hvdWxkIGJlIGEgc2FmZSBwbGFjZQorCS8vIHRvIGV4YW1pbmUgaWYgY2lwaGVyIGFsZ29yaXRobSBzd2l0Y2hpbmcgaXMgcmVxdWlyZWQuCisJLy9ydDI4NjBiLiBEb24ndCBrbm93IHdoeSBuZWVkIHRoaXMKKwlTd2l0Y2hCZXR3ZWVuV2VwQW5kQ2tpcChwQWQpOworCisKKwlpZiAoQnNzVHlwZSA9PSBCU1NfQURIT0MpCisJeworCQlPUFNUQVRVU19TRVRfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQURIT0NfT04pOworCQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19JTkZSQV9PTik7CisKKyNpZmRlZiBDQVJSSUVSX0RFVEVDVElPTl9TVVBQT1JUIC8vIFJvZ2VyIHN5bmMgQ2FycmllcgorCQkvLyBObyBjYXJyaWVyIGRldGVjdGlvbiB3aGVuIGFkaG9jCisJCS8vIENhcnJpZXJEZXRlY3Rpb25TdG9wKHBBZCk7CisJCXBBZC0+Q29tbW9uQ2ZnLkNhcnJpZXJEZXRlY3QuQ0RfU3RhdGUgPSBDRF9OT1JNQUw7CisjZW5kaWYgLy8gQ0FSUklFUl9ERVRFQ1RJT05fU1VQUE9SVCAvLworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCWlmIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID49IFBIWV8xMUFCR05fTUlYRUQpCisJCQlBZGhvY1R1cm5PblFvcyhwQWQpOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhIUFkaG9jIExJTksgVVAgISEhIFxuIiApKTsKKwl9CisJZWxzZQorCXsKKwkJT1BTVEFUVVNfU0VUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0lORlJBX09OKTsKKwkJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQURIT0NfT04pOworCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhIUluZnJhIExJTksgVVAgISEhIFxuIiApKTsKKwl9CisKKwkvLyAzKjMKKwkvLyByZXNldCBUeCBiZWFtZm9ybWluZyBiaXQKKwlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsICZWYWx1ZSk7CisJVmFsdWUgJj0gKH4weDAxKTsKKwlWYWx1ZSB8PSBwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuVHhCRjsKKwlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCBWYWx1ZSk7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkvLyBDaGFuZ2UgdG8gQVAgY2hhbm5lbAorICAgIGlmICgocEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPiBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKSAmJiAocEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQ2hhbm5lbFdpZHRoID09IEJXXzQwKSkKKwl7CisJCS8vIE11c3QgdXNpbmcgNDBNSHouCisJCXBBZC0+Q29tbW9uQ2ZnLkJCUEN1cnJlbnRCVyA9IEJXXzQwOworCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsLCBGQUxTRSk7CisJCUFzaWNMb2NrQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsKTsKKworCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsICZWYWx1ZSk7CisJCVZhbHVlICY9ICh+MHgxOCk7CisJCVZhbHVlIHw9IDB4MTA7CisJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsIFZhbHVlKTsKKworCQkvLyAgUlggOiBjb250cm9sIGNoYW5uZWwgYXQgbG93ZXIKKwkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCAmVmFsdWUpOworCQlWYWx1ZSAmPSAofjB4MjApOworCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCBWYWx1ZSk7CisKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9CQU5EX0NGRywgJkRhdGEpOworCQlEYXRhICY9IDB4ZmZmZmZmZmU7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX0JBTkRfQ0ZHLCBEYXRhKTsKKworCQlpZiAocEFkLT5NQUNWZXJzaW9uID09IDB4Mjg2MDAxMDApCisJCXsKKwkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY5LCAweDFBKTsKKwkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjcwLCAweDBBKTsKKwkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjczLCAweDE2KTsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhIXJ0Mjg2MEMgISEhIFxuIiApKTsKKwkJfQorCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhITQwTUh6IExvd2VyIExJTksgVVAgISEhIENvbnRyb2wgQ2hhbm5lbCBhdCBCZWxvdy4gQ2VudHJhbCA9ICVkIFxuIiwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgKSk7CisJfQorCWVsc2UgaWYgKChwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA8IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpICYmIChwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5DaGFubmVsV2lkdGggPT0gQldfNDApKQorICAgIHsKKwkgICAgLy8gTXVzdCB1c2luZyA0ME1Iei4KKwkJcEFkLT5Db21tb25DZmcuQkJQQ3VycmVudEJXID0gQldfNDA7CisJCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwsIEZBTFNFKTsKKwkgICAgQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwpOworCisJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgJlZhbHVlKTsKKwkJVmFsdWUgJj0gKH4weDE4KTsKKwkJVmFsdWUgfD0gMHgxMDsKKwkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgVmFsdWUpOworCisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfQkFORF9DRkcsICZEYXRhKTsKKwkJRGF0YSB8PSAweDE7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX0JBTkRfQ0ZHLCBEYXRhKTsKKworCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsICZWYWx1ZSk7CisJICAgIFZhbHVlIHw9ICgweDIwKTsKKwkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgVmFsdWUpOworCisJCWlmIChwQWQtPk1BQ1ZlcnNpb24gPT0gMHgyODYwMDEwMCkKKwkJeworCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjksIDB4MUEpOworCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNzAsIDB4MEEpOworCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNzMsIDB4MTYpOworCQkJICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhIXJ0Mjg2MEMgISEhIFxuIiApKTsKKwkJfQorCisJICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISA0ME1IeiBVcHBlciBMSU5LIFVQICEhISBDb250cm9sIENoYW5uZWwgYXQgVXBwZXJDZW50cmFsID0gJWQgXG4iLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCApKTsKKyAgICB9CisgICAgZWxzZQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworICAgIHsKKwkgICAgcEFkLT5Db21tb25DZmcuQkJQQ3VycmVudEJXID0gQldfMjA7CisJCXBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsID0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbDsKKwkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsLCBGQUxTRSk7CisJCUFzaWNMb2NrQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpOworCisJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgJlZhbHVlKTsKKwkJVmFsdWUgJj0gKH4weDE4KTsKKwkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgVmFsdWUpOworCisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfQkFORF9DRkcsICZEYXRhKTsKKwkJRGF0YSAmPSAweGZmZmZmZmZlOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9CQU5EX0NGRywgRGF0YSk7CisKKwkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCAmVmFsdWUpOworCQlWYWx1ZSAmPSAofjB4MjApOworCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCBWYWx1ZSk7CisKKwkJaWYgKHBBZC0+TUFDVmVyc2lvbiA9PSAweDI4NjAwMTAwKQorCQl7CisJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2OSwgMHgxNik7CisJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I3MCwgMHgwOCk7CisJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I3MywgMHgxMSk7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISFydDI4NjBDICEhISBcbiIgKSk7CisJCX0KKworCSAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgMjBNSHogTElOSyBVUCAhISEgXG4iICkpOworICAgIH0KKworCVJUTVBTZXRBR0NJbml0VmFsdWUocEFkLCBwQWQtPkNvbW1vbkNmZy5CQlBDdXJyZW50QlcpOworCS8vCisJLy8gU2F2ZSBCQlBfUjY2IHZhbHVlLCBpdCB3aWxsIGJlIHVzZWQgaW4gUlRVU0JSZXN1bWVNc2R1VHJhbnNtaXNzaW9uCisJLy8KKwlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY2LCAmcEFkLT5CYnBUdW5pbmcuUjY2Q3VycmVudFZhbHVlKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISBMSU5LIFVQICEhISAoQnNzVHlwZT0lZCwgQUlEPSVkLCBzc2lkPSVzLCBDaGFubmVsPSVkLCBDZW50cmFsQ2hhbm5lbCA9ICVkKVxuIiwKKwkJQnNzVHlwZSwgcEFkLT5TdGFBY3RpdmUuQWlkLCBwQWQtPkNvbW1vbkNmZy5Tc2lkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCkpOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIExJTksgVVAgISEhIChEZW5zaXR5ID0lZCwgKVxuIiwgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5NcGR1RGVuc2l0eSkpOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJCUFzaWNTZXRCc3NpZChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKworCUFzaWNTZXRTbG90VGltZShwQWQsIFRSVUUpOworCUFzaWNTZXRFZGNhUGFybShwQWQsICZwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtKTsKKworCS8vIENhbGwgdGhpcyBmb3IgUlRTIHByb3RlY3Rpb25mb3IgbGVnYWN5IHJhdGUsIHdlIHdpbGwgYWx3YXlzIGVuYWJsZSBSVFMgdGhyZXNob2xkLCBidXQgbm9ybWFsbHkgaXQgd2lsbCBub3QgaGl0CisJQXNpY1VwZGF0ZVByb3RlY3QocEFkLCAwLCAoT0ZETVNFVFBST1RFQ1QgfCBDQ0tTRVRQUk9URUNUKSwgVFJVRSwgRkFMU0UpOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJaWYgKChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLmJIdEVuYWJsZSA9PSBUUlVFKSkKKwl7CisJCS8vIFVwZGF0ZSBIVCBwcm90ZWN0aW9uZm9yIGJhc2VkIG9uIEFQJ3Mgb3BlcmF0aW5nIG1vZGUuCisgICAgCWlmIChwQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzIuTm9uR2ZQcmVzZW50ID09IDEpCisgICAgCXsKKyAgICAJCUFzaWNVcGRhdGVQcm90ZWN0KHBBZCwgcEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLk9wZXJhaW9uTW9kZSwgIEFMTE5fU0VUUFJPVEVDVCwgRkFMU0UsIFRSVUUpOworICAgIAl9CisgICAgCWVsc2UKKyAgIAkJCUFzaWNVcGRhdGVQcm90ZWN0KHBBZCwgcEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLk9wZXJhaW9uTW9kZSwgIEFMTE5fU0VUUFJPVEVDVCwgRkFMU0UsIEZBTFNFKTsKKwl9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwlOZGlzWmVyb01lbW9yeSgmcEFkLT5EcnNDb3VudGVycywgc2l6ZW9mKENPVU5URVJfRFJTKSk7CisKKwlOZGlzR2V0U3lzdGVtVXBUaW1lKCZOb3cpOworCXBBZC0+U3RhQ2ZnLkxhc3RCZWFjb25SeFRpbWUgPSBOb3c7ICAgLy8gbGFzdCBSWCB0aW1lc3RhbXAKKworCWlmICgocEFkLT5Db21tb25DZmcuVHhQcmVhbWJsZSAhPSBSdDgwMl8xMVByZWFtYmxlTG9uZykgJiYKKwkJQ0FQX0lTX1NIT1JUX1BSRUFNQkxFX09OKHBBZC0+U3RhQWN0aXZlLkNhcGFiaWxpdHlJbmZvKSkKKwl7CisJCU1sbWVTZXRUeFByZWFtYmxlKHBBZCwgUnQ4MDJfMTFQcmVhbWJsZVNob3J0KTsKKwl9CisKKwlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19BR0dSRUdBVElPTl9JTlVTRUQpOworCisJaWYgKHBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJETW9kZSA9PSBSRF9TSUxFTkNFX01PREUpCisJeworI2lmZGVmIERGU19TVVBQT1JUCisJCVJhZGFyRGV0ZWN0aW9uU3RvcChwQWQpOworI2VuZGlmIC8vIERGU19TVVBQT1JUIC8vCisJfQorCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJETW9kZSA9IFJEX05PUk1BTF9NT0RFOworCisJaWYgKEJzc1R5cGUgPT0gQlNTX0FESE9DKQorCXsKKwkJTWFrZUlic3NCZWFjb24ocEFkKTsKKwkJaWYgKChwQWQtPkNvbW1vbkNmZy5DaGFubmVsID4gMTQpCisJCQkmJiAocEFkLT5Db21tb25DZmcuYklFRUU4MDIxMUggPT0gMSkKKwkJCSYmIFJhZGFyQ2hhbm5lbENoZWNrKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkpCisJCXsKKwkJCTsgLy9EbyBub3RoaW5nCisJCX0KKwkJZWxzZQorCQl7CisJCQlBc2ljRW5hYmxlSWJzc1N5bmMocEFkKTsKKwkJfQorCisJCS8vIEluIGFkIGhvYyBtb2RlLCB1c2UgTUFDIHRhYmxlIGZyb20gaW5kZXggMS4KKwkJLy8gcC5zIEFTSUMgdXNlIGFsbCAweGZmIGFzIHRlcm1pbmF0aW9uIG9mIFdDSUQgdGFibGUgc2VhcmNoLlRvIHByZXZlbnQgaXQncyAweGZmLWZmLWZmLWZmLWZmLWZmLCBXcml0ZSAwIGhlcmUuCisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19XQ0lEX0JBU0UsIDB4MDApOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCAweDE4MDgsIDB4MDApOworCisJCS8vIElmIFdFUCBpcyBlbmFibGVkLCBhZGQga2V5IG1hdGVyaWFsIGFuZCBjaXBoZXJBbGcgaW50byBBc2ljCisJCS8vIEZpbGwgaW4gU2hhcmVkIEtleSBUYWJsZShvZmZzZXQ6IDB4NmMwMCkgYW5kIFNoYXJlZCBLZXkgTW9kZShvZmZzZXQ6IDB4NzAwMCkKKworCQlpZiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFXRVBFbmFibGVkKQorCQl7CisJCQlQVUNIQVIJS2V5OworCQkJVUNIQVIgCUNpcGhlckFsZzsKKworCQkJZm9yIChpZHg9MDsgaWR4IDwgU0hBUkVfS0VZX05VTTsgaWR4KyspCisgICAgICAgIAl7CisJCQkJQ2lwaGVyQWxnID0gcEFkLT5TaGFyZWRLZXlbQlNTMF1baWR4XS5DaXBoZXJBbGc7CisgICAgCQkJS2V5ID0gcEFkLT5TaGFyZWRLZXlbQlNTMF1baWR4XS5LZXk7CisKKwkJCQlpZiAocEFkLT5TaGFyZWRLZXlbQlNTMF1baWR4XS5LZXlMZW4gPiAwKQorCQkJCXsKKwkJCQkJLy8gU2V0IGtleSBtYXRlcmlhbCBhbmQgY2lwaGVyQWxnIHRvIEFzaWMKKyAgICAJCQkJQXNpY0FkZFNoYXJlZEtleUVudHJ5KHBBZCwgQlNTMCwgaWR4LCBDaXBoZXJBbGcsIEtleSwgTlVMTCwgTlVMTCk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlkeCA9PSBwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQpCisJCQkJCXsKKwkJCQkJCS8vIFVwZGF0ZSBXQ0lEIGF0dHJpYnV0ZSB0YWJsZSBhbmQgSVZFSVYgdGFibGUgZm9yIHRoaXMgZ3JvdXAga2V5IHRhYmxlCisJCQkJCQlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZCwgQlNTMCwgaWR4LCBDaXBoZXJBbGcsIE5VTEwpOworCQkJCQl9CisJCQkJfQorCisKKwkJCX0KKwkJfQorCQkvLyBJZiBXUEFOb25lIGlzIGVuYWJsZWQsIGFkZCBrZXkgbWF0ZXJpYWwgYW5kIGNpcGhlckFsZyBpbnRvIEFzaWMKKwkJLy8gRmlsbCBpbiBTaGFyZWQgS2V5IFRhYmxlKG9mZnNldDogMHg2YzAwKSBhbmQgU2hhcmVkIEtleSBNb2RlKG9mZnNldDogMHg3MDAwKQorCQllbHNlIGlmIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lKQorCQl7CisJCQlwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQgPSAwOwkvLyBhbHdheXMgYmUgemVybworCisgICAgICAgICAgICBOZGlzWmVyb01lbW9yeSgmcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0sIHNpemVvZihDSVBIRVJfS0VZKSk7CisJCQkJCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5TGVuID0gTEVOX1RLSVBfRUs7CisJCQlOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5LZXksIHBBZC0+U3RhQ2ZnLlBNSywgTEVOX1RLSVBfRUspOworCisgICAgICAgICAgICBpZiAocEFkLT5TdGFDZmcuUGFpckNpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKQorICAgICAgICAgICAgeworICAgIAkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLlJ4TWljLCAmcEFkLT5TdGFDZmcuUE1LWzE2XSwgTEVOX1RLSVBfUlhNSUNLKTsKKyAgICAJCQlOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5UeE1pYywgJnBBZC0+U3RhQ2ZnLlBNS1sxNl0sIExFTl9US0lQX1RYTUlDSyk7CisgICAgICAgICAgICB9CisKKwkJCS8vIERlY2lkZSBpdHMgQ2hpcGVyQWxnCisJCQlpZiAocEFkLT5TdGFDZmcuUGFpckNpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKQorCQkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZyA9IENJUEhFUl9US0lQOworCQkJZWxzZSBpZiAocEFkLT5TdGFDZmcuUGFpckNpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQorCQkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZyA9IENJUEhFUl9BRVM7CisJCQllbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiVW5rbm93IENpcGhlciAoPSVkKSwgc2V0IENpcGhlciB0byBBRVNcbiIsIHBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIpKTsKKwkJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcgPSBDSVBIRVJfQUVTOworICAgICAgICAgICAgfQorCisJCQkvLyBTZXQga2V5IG1hdGVyaWFsIGFuZCBjaXBoZXJBbGcgdG8gQXNpYworCQkJQXNpY0FkZFNoYXJlZEtleUVudHJ5KHBBZCwKKwkJCQkJCQkJICBCU1MwLAorCQkJCQkJCQkgIDAsCisJCQkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnLAorCQkJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLktleSwKKwkJCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5UeE1pYywKKwkJCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5SeE1pYyk7CisKKyAgICAgICAgICAgIC8vIFVwZGF0ZSBXQ0lEIGF0dHJpYnV0ZSB0YWJsZSBhbmQgSVZFSVYgdGFibGUgZm9yIHRoaXMgZ3JvdXAga2V5IHRhYmxlCisJCQlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZCwgQlNTMCwgMCwgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnLCBOVUxMKTsKKworCQl9CisKKwl9CisJZWxzZSAvLyBCU1NfSU5GUkEKKwl7CisJCS8vIENoZWNrIHRoZSBuZXcgU1NJRCB3aXRoIGxhc3QgU1NJRAorCQl3aGlsZSAoQ2FuY2VsbGVkID09IFRSVUUpCisJCXsKKwkJCWlmIChwQWQtPkNvbW1vbkNmZy5MYXN0U3NpZExlbiA9PSBwQWQtPkNvbW1vbkNmZy5Tc2lkTGVuKQorCQkJeworCQkJCWlmIChSVE1QQ29tcGFyZU1lbW9yeShwQWQtPkNvbW1vbkNmZy5MYXN0U3NpZCwgcEFkLT5Db21tb25DZmcuU3NpZCwgcEFkLT5Db21tb25DZmcuTGFzdFNzaWRMZW4pID09IDApCisJCQkJeworCQkJCQkvLyBMaW5rIHRvIHRoZSBvbGQgb25lIG5vIGxpbmtkb3duIGlzIHJlcXVpcmVkLgorCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQkvLyBTZW5kIGxpbmsgZG93biBldmVudCBiZWZvcmUgc2V0IHRvIGxpbmsgdXAKKwkJCXBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID0gTmRpc01lZGlhU3RhdGVEaXNjb25uZWN0ZWQ7CisJCQlSVE1QX0luZGljYXRlTWVkaWFTdGF0ZShwQWQpOworICAgICAgICAgICAgcEFkLT5FeHRyYUluZm8gPSBHRU5FUkFMX0xJTktfRE9XTjsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk5ESVNfU1RBVFVTX01FRElBX0RJU0NPTk5FQ1QgRXZlbnQgQUEhXG4iKSk7CisJCQlicmVhazsKKwkJfQorCisJCS8vCisJCS8vIE9uIFdQQSBtb2RlLCBSZW1vdmUgQWxsIEtleXMgaWYgbm90IGNvbm5lY3QgdG8gdGhlIGxhc3QgQlNTSUQKKwkJLy8gS2V5IHdpbGwgYmUgc2V0IGFmdGVyIDQtd2F5IGhhbmRzaGFrZS4KKwkJLy8KKwkJaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpKQorCQl7CisJCQlVTE9ORyAJCUlWOworCisJCQkvLyBSZW1vdmUgYWxsIFdQQSBrZXlzCisJCQlSVE1QV1BBUmVtb3ZlQWxsS2V5cyhwQWQpOworCQkJcEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQ7CisJCQlwQWQtPlN0YUNmZy5Qcml2YWN5RmlsdGVyID0gTmRpczgwMl8xMVByaXZGaWx0ZXI4MDIxeFdFUDsKKworCQkJLy8gRml4ZWQgY29ubmVjdGlvbiBmYWlsZWQgd2l0aCBSYW5nZSBNYXhpbWl6ZXIgLSA1MTUgQVAgKE1hcnZlbGwgQ2hpcCkgd2hlbiBzZWN1cml0eSBpcyBXUEFQU0svVEtJUAorCQkJLy8gSWYgSVYgcmVsYXRlZCB2YWx1ZXMgYXJlIHRvbyBsYXJnZSBpbiBHcm91cE1zZzIsIEFQIHdvdWxkIGlnbm9yZSB0aGlzIG1lc3NhZ2UuCisJCQlJViA9IDA7CisJCQlJViB8PSAocEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkIDw8IDMwKTsKKwkJCUFzaWNVcGRhdGVXQ0lESVZFSVYocEFkLCBCU1NJRF9XQ0lELCBJViwgMCk7CisJCX0KKwkJLy8gTk9URToKKwkJLy8gdGhlIGRlY2lzaW9uIG9mIHVzaW5nICJzaG9ydCBzbG90IHRpbWUiIG9yIG5vdCBtYXkgY2hhbmdlIGR5bmFtaWNhbGx5IGR1ZSB0bworCQkvLyBuZXcgU1RBIGFzc29jaWF0aW9uIHRvIHRoZSBBUC4gc28gd2UgaGF2ZSB0byBkZWNpZGUgdGhhdCB1cG9uIHBhcnNpbmcgQkVBQ09OLCBub3QgaGVyZQorCisJCS8vIE5PVEU6CisJCS8vIHRoZSBkZWNpc2lvbiB0byB1c2UgIlJUQy9DVFMiIG9yICJDVFMtdG8tc2VsZiIgcHJvdGVjdGlvbiBvciBub3QgbWF5IGNoYW5nZSBkeW5hbWljYWxseQorCQkvLyBkdWUgdG8gbmV3IFNUQSBhc3NvY2lhdGlvbiB0byB0aGUgQVAuIHNvIHdlIGhhdmUgdG8gZGVjaWRlIHRoYXQgdXBvbiBwYXJzaW5nIEJFQUNPTiwgbm90IGhlcmUKKworCQlDb21wb3NlUHNQb2xsKHBBZCk7CisJCUNvbXBvc2VOdWxsRnJhbWUocEFkKTsKKworCQkJQXNpY0VuYWJsZUJzc1N5bmMocEFkKTsKKworCQkvLyBBZGQgQlNTSUQgdG8gV0NJRCBzZWFyY2ggdGFibGUKKwkJQXNpY1VwZGF0ZVJ4V0NJRFRhYmxlKHBBZCwgQlNTSURfV0NJRCwgcEFkLT5Db21tb25DZmcuQnNzaWQpOworCisJCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+TWFjVGFiTG9jayk7CisJCS8vIGFkZCB0aGlzIEJTU0lEIGVudHJ5IGludG8gSEFTSCB0YWJsZQorCQl7CisJCQlVQ0hBUiBIYXNoSWR4OworCisJCQkvL3BFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdOworCQkJSGFzaElkeCA9IE1BQ19BRERSX0hBU0hfSU5ERVgocEFkLT5Db21tb25DZmcuQnNzaWQpOworCQkJaWYgKHBBZC0+TWFjVGFiLkhhc2hbSGFzaElkeF0gPT0gTlVMTCkKKwkJCXsKKwkJCQlwQWQtPk1hY1RhYi5IYXNoW0hhc2hJZHhdID0gcEVudHJ5OworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXBDdXJyRW50cnkgPSBwQWQtPk1hY1RhYi5IYXNoW0hhc2hJZHhdOworCQkJCXdoaWxlIChwQ3VyckVudHJ5LT5wTmV4dCAhPSBOVUxMKQorCQkJCQlwQ3VyckVudHJ5ID0gcEN1cnJFbnRyeS0+cE5leHQ7CisJCQkJcEN1cnJFbnRyeS0+cE5leHQgPSBwRW50cnk7CisJCQl9CisJCX0KKwkJTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5NYWNUYWJMb2NrKTsKKworCisJCS8vIElmIFdFUCBpcyBlbmFibGVkLCBhZGQgcGFpZXdpc2UgYW5kIHNoYXJlZCBrZXkKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgICAgIGlmICgoKHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCkmJgorICAgICAgICAgICAgIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMVdFUEVuYWJsZWQpJiYKKyAgICAgICAgICAgICAocEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQgPT0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQpKSB8fAorICAgICAgICAgICAgKChwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgPT0gV1BBX1NVUFBMSUNBTlRfRElTQUJMRSkmJgorICAgICAgICAgICAgICAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFXRVBFbmFibGVkKSkpCisjZWxzZQorCQlpZiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFXRVBFbmFibGVkKQorI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKwkJeworCQkJUFVDSEFSCUtleTsKKwkJCVVDSEFSIAlDaXBoZXJBbGc7CisKKwkJCWZvciAoaWR4PTA7IGlkeCA8IFNIQVJFX0tFWV9OVU07IGlkeCsrKQorICAgICAgICAJeworCQkJCUNpcGhlckFsZyA9IHBBZC0+U2hhcmVkS2V5W0JTUzBdW2lkeF0uQ2lwaGVyQWxnOworICAgIAkJCUtleSA9IHBBZC0+U2hhcmVkS2V5W0JTUzBdW2lkeF0uS2V5OworCisJCQkJaWYgKHBBZC0+U2hhcmVkS2V5W0JTUzBdW2lkeF0uS2V5TGVuID4gMCkKKwkJCQl7CisJCQkJCS8vIFNldCBrZXkgbWF0ZXJpYWwgYW5kIGNpcGhlckFsZyB0byBBc2ljCisgICAgCQkJCUFzaWNBZGRTaGFyZWRLZXlFbnRyeShwQWQsIEJTUzAsIGlkeCwgQ2lwaGVyQWxnLCBLZXksIE5VTEwsIE5VTEwpOworCisJCQkJCWlmIChpZHggPT0gcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkKQorCQkJCQl7CisJCQkJCQkvLyBBc3NpZ24gZ3JvdXAga2V5IGluZm8KKwkJCQkJCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkocEFkLCBCU1MwLCBpZHgsIENpcGhlckFsZywgTlVMTCk7CisKKwkJCQkJCS8vIEFzc2lnbiBwYWlyd2lzZSBrZXkgaW5mbworCQkJCQkJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWQsIEJTUzAsIGlkeCwgQ2lwaGVyQWxnLCBwRW50cnkpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisKKwkJLy8gb25seSBJTkZSQVNUUlVDVFVSRSBtb2RlIG5lZWQgdG8gaW5kaWNhdGUgY29ubmVjdGl2aXR5IGltbWVkaWF0ZWx5OyBBREhPQyBtb2RlCisJCS8vIHNob3VsZCB3YWl0IHVudGlsIGF0IGxlYXN0IDIgYWN0aXZlIG5vZGVzIGluIHRoaXMgQlNTSUQuCisJCU9QU1RBVFVTX1NFVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpOworCisgICAgICAgIC8vIEZvciBHVUkgKysKKwkJaWYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlIDwgTmRpczgwMl8xMUF1dGhNb2RlV1BBKQorCQl7CisJCQlwQWQtPkluZGljYXRlTWVkaWFTdGF0ZSA9IE5kaXNNZWRpYVN0YXRlQ29ubmVjdGVkOworCQkJcEFkLT5FeHRyYUluZm8gPSBHRU5FUkFMX0xJTktfVVA7CisJCQlSVE1QX0luZGljYXRlTWVkaWFTdGF0ZShwQWQpOworCQl9CisgICAgICAgIC8vIC0tCisKKwkJLy8gQWRkIEJTU0lEIGluIG15IE1BQyBUYWJsZS4KKyAgICAgICAgTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5NYWNUYWJMb2NrKTsKKwkJUlRNUE1vdmVNZW1vcnkocEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5BZGRyLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgTUFDX0FERFJfTEVOKTsKKwkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5BaWQgPSBCU1NJRF9XQ0lEOworCQlwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLnBBZCA9IHBBZDsKKwkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5WYWxpZEFzQ0xJID0gVFJVRTsJLy9BbHRob3VnaCB0aGlzIGlzIGJzc2lkLi5zdGlsbCBzZXQgVmFsaWRBc0NsCisJCXBBZC0+TWFjVGFiLlNpemUgPSAxOwkvLyBpbmZyYSBtb2RlIGFsd2F5cyBzZXQgTUFDdGFiIHNpemUgPTEuCisJCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uU3N0ID0gU1NUX0FTU09DOworCQlwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkF1dGhTdGF0ZSA9IFNTVF9BU1NPQzsKKwkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5XZXBTdGF0dXMgPSBwQWQtPlN0YUNmZy5XZXBTdGF0dXM7CisgICAgICAgIE5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+TWFjVGFiTG9jayk7CisKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIExJTksgVVAgISEhICBDbGllbnRTdGF0dXNGbGFncz0lbHgpXG4iLAorCQkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5DbGllbnRTdGF0dXNGbGFncykpOworCisJCU1sbWVVcGRhdGVUeFJhdGVzKHBBZCwgVFJVRSwgQlNTMCk7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCU1sbWVVcGRhdGVIdFR4UmF0ZXMocEFkLCBCU1MwKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIExJTksgVVAgISEgKFN0YUFjdGl2ZS5iSHRFbmFibGUgPSVkLCApXG4iLCBwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLmJIdEVuYWJsZSkpOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJCS8vCisJCS8vIFJlcG9ydCBBZGphY2VudCBBUCByZXBvcnQuCisJCS8vCisjaWZkZWYgTEVBUF9TVVBQT1JUCisJCUNDWEFkamFjZW50QVBSZXBvcnQocEFkKTsKKyNlbmRpZiAvLyBMRUFQX1NVUFBPUlQgLy8KKworCQlpZiAocEFkLT5Db21tb25DZmcuYkFnZ3JlZ2F0aW9uQ2FwYWJsZSkKKwkJeworCQkJaWYgKChwQWQtPkNvbW1vbkNmZy5iUGlnZ3lCYWNrQ2FwYWJsZSkgJiYgKHBBZC0+TWxtZUF1eC5BUFJhbGlua0llICYgMHgwMDAwMDAwMykgPT0gMykKKwkJCXsKKworCQkJCU9QU1RBVFVTX1NFVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19QSUdHWUJBQ0tfSU5VU0VEKTsKKwkJCQlPUFNUQVRVU19TRVRfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQUdHUkVHQVRJT05fSU5VU0VEKTsKKyAgICAgICAgICAgICAgICBSVE1QU2V0UGlnZ3lCYWNrKHBBZCwgVFJVRSk7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiVHVybiBvbiBQaWdneS1CYWNrXG4iKSk7CisJCQl9CisJCQllbHNlIGlmIChwQWQtPk1sbWVBdXguQVBSYWxpbmtJZSAmIDB4MDAwMDAwMDEpCisJCQl7CisJCQkJT1BTVEFUVVNfU0VUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0FHR1JFR0FUSU9OX0lOVVNFRCk7CisJCQl9CisJCX0KKworCQlpZiAocEFkLT5NbG1lQXV4LkFQUmFsaW5rSWUgIT0gMHgwKQorCQl7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQlpZiAoQ0xJRU5UX1NUQVRVU19URVNUX0ZMQUcoJnBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0sIGZDTElFTlRfU1RBVFVTX1JER19DQVBBQkxFKSkKKwkJCXsKKwkJCQlBc2ljRW5hYmxlUkRHKHBBZCk7CisJCQl9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCQlPUFNUQVRVU19TRVRfRkxBRyhwQWQsIGZDTElFTlRfU1RBVFVTX1JBTElOS19DSElQU0VUKTsKKwkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcoJnBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0sIGZDTElFTlRfU1RBVFVTX1JBTElOS19DSElQU0VUKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmQ0xJRU5UX1NUQVRVU19SQUxJTktfQ0hJUFNFVCk7CisJCQlDTElFTlRfU1RBVFVTX0NMRUFSX0ZMQUcoJnBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0sIGZDTElFTlRfU1RBVFVTX1JBTElOS19DSElQU0VUKTsKKwkJfQorCX0KKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk5ESVNfU1RBVFVTX01FRElBX0NPTk5FQ1QgRXZlbnQgQiEuQkFDYXBhYmlsaXR5ID0gJXguIENsaWVudFN0YXR1c0ZsYWdzID0gJWx4XG4iLCBwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkud29yZCwgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5DbGllbnRTdGF0dXNGbGFncykpOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJLy8gU2V0IExFRAorCVJUTVBTZXRMRUQocEFkLCBMRURfTElOS19VUCk7CisKKwlwQWQtPk1sbWUuUGVyaW9kaWNSb3VuZCA9IDA7CisJcEFkLT5NbG1lLk9uZVNlY1BlcmlvZGljUm91bmQgPSAwOworCXBBZC0+YkNvbmZpZ0NoYW5nZWQgPSBGQUxTRTsgICAgICAgIC8vIFJlc2V0IGNvbmZpZyBmbGFnCisJcEFkLT5FeHRyYUluZm8gPSBHRU5FUkFMX0xJTktfVVA7ICAgLy8gVXBkYXRlIGV4dHJhIGluZm9ybWF0aW9uIHRvIGxpbmsgaXMgdXAKKworCS8vIFNldCBhc2ljIGF1dG8gZmFsbCBiYWNrCisJeworCQlQVUNIQVIJCQkJCXBUYWJsZTsKKwkJVUNIQVIJCQkJCVRhYmxlU2l6ZSA9IDA7CisKKwkJTWxtZVNlbGVjdFR4UmF0ZVRhYmxlKHBBZCwgJnBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0sICZwVGFibGUsICZUYWJsZVNpemUsICZwQWQtPkNvbW1vbkNmZy5UeFJhdGVJbmRleCk7CisJCUFzaWNVcGRhdGVBdXRvRmFsbEJhY2tUYWJsZShwQWQsIHBUYWJsZSk7CisJfQorCisJTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5NYWNUYWJMb2NrKTsKKyAgICBwRW50cnktPkhUUGh5TW9kZS53b3JkID0gcEFkLT5TdGFDZmcuSFRQaHlNb2RlLndvcmQ7CisgICAgcEVudHJ5LT5NYXhIVFBoeU1vZGUud29yZCA9IHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS53b3JkOworCWlmIChwQWQtPlN0YUNmZy5iQXV0b1R4UmF0ZVN3aXRjaCA9PSBGQUxTRSkKKwl7CisJCXBFbnRyeS0+YkF1dG9UeFJhdGVTd2l0Y2ggPSBGQUxTRTsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJaWYgKHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1DUyA9PSAzMikKKwkJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLlNob3J0R0kgPSBHSV84MDA7CisKKwkJaWYgKChwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NQ1MgPiBNQ1NfNykgfHwgKHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1DUyA9PSAzMikpCisJCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5TVEJDID0gU1RCQ19OT05FOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQkvLyBJZiB0aGUgbGVnYWN5IG1vZGUgaXMgc2V0LCBvdmVyd3JpdGUgdGhlIHRyYW5zbWl0IHNldHRpbmcgb2YgdGhpcyBlbnRyeS4KKwkJaWYgKHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1PREUgPD0gTU9ERV9PRkRNKQorCQkJUlRNUFVwZGF0ZUxlZ2FjeVR4U2V0dGluZygoVUNIQVIpcEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5GaXhlZFR4TW9kZSwgcEVudHJ5KTsKKwl9CisJZWxzZQorCQlwRW50cnktPmJBdXRvVHhSYXRlU3dpdGNoID0gVFJVRTsKKwlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPk1hY1RhYkxvY2spOworCisJLy8gIExldCBMaW5rIFN0YXR1cyBQYWdlIGRpc3BsYXkgZmlyc3QgaW5pdGlhbCByYXRlLgorCXBBZC0+TGFzdFR4UmF0ZSA9IChVU0hPUlQpKHBFbnRyeS0+SFRQaHlNb2RlLndvcmQpOworCS8vIFNlbGVjdCBEQUMgYWNjb3JkaW5nIHRvIEhUIG9yIExlZ2FjeQorCWlmIChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLk1DU1NldFswXSAhPSAweDAwKQorCXsKKwkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IxLCAmVmFsdWUpOworCQlWYWx1ZSAmPSAofjB4MTgpOworCQlpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCA9PSAyKQorCQl7CisJCSAgICBWYWx1ZSB8PSAweDEwOworCQl9CisJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjEsIFZhbHVlKTsKKwl9CisJZWxzZQorCXsKKwkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IxLCAmVmFsdWUpOworCQlWYWx1ZSAmPSAofjB4MTgpOworCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IxLCBWYWx1ZSk7CisJfQorCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJaWYgKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uYkh0RW5hYmxlID09IEZBTFNFKQorCXsKKwl9CisJZWxzZSBpZiAocEVudHJ5LT5NYXhSQW1wZHVGYWN0b3IgPT0gMCkKKwl7CisJICAgIC8vIElmIEhUIEFQIGRvZXNuJ3Qgc3VwcG9ydCBNYXhSQW1wZHVGYWN0b3IgPSAxLCB3ZSBuZWVkIHRvIHNldCBtYXggUFNEVSB0byAwLgorCSAgICAvLyBCZWNhdXNlIG91ciBJbml0IHZhbHVlIGlzIDEgYXQgTUFDUmVnVGFibGUuCisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BWF9MRU5fQ0ZHLCAweDBmZmYpOworCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCS8vIFBhdGNoIGZvciBNYXJ2ZWwgQVAgdG8gZ2FpbiBoaWdoIHRocm91Z2hwdXQKKwkvLyBOZWVkIHRvIHNldCBhcyBmb2xsb3dpbmcsCisJLy8gMS4gU2V0IHR4b3AgaW4gcmVnaXN0ZXItRURDQV9BQzBfQ0ZHIGFzIDB4NjAKKwkvLyAyLiBTZXQgRW5UWFdyaXRlQmFja0RET05FIGluIHJlZ2lzdGVyLVdQRE1BX0dMT19DRkcgYXMgemVybworCS8vIDMuIFBCRl9NQVhfUENOVCBhcyAweDFGM0ZCRjlGCisJLy8gNC4ga2ljayBwZXIgdHdvIHBhY2tldHMgd2hlbiBkZXF1ZXVlCisJLy8KKwkvLyBUeG9wIGNhbiBvbmx5IGJlIG1vZGlmaWVkIHdoZW4gUkRHIGlzIG9mZiwgV01NIGlzIGRpc2FibGUgYW5kIFR4QnVyc3QgaXMgZW5hYmxlCisJLy8KKwkvLyBpZiAxLiBMZWdhY3kgQVAgV01NIG9uLCAgb3IgMi4gMTFuIEFQLCBBTVBEVSBkaXNhYmxlLiAgRm9yY2UgdHVybiBvZmYgYnVyc3Qgbm8gbWF0dGVyIHdoYXQgYkVuYWJsZVR4QnVyc3QgaXMuCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJaWYgKCgocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5iSHRFbmFibGUgPT0gRkFMU0UpICYmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1dNTV9JTlVTRUQpKSkKKwkJfHwgKChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLmJIdEVuYWJsZSA9PSBUUlVFKSAmJiAocEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlBvbGljeSA9PSBCQV9OT1RVU0UpKSkKKwl7CisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgRURDQV9BQzBfQ0ZHLCAmRGF0YSk7CisJCURhdGEgICY9IDB4RkZGRkZGMDA7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIEVEQ0FfQUMwX0NGRywgRGF0YSk7CisKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgUEJGX01BWF9QQ05ULCAweDFGM0Y3RjlGKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiVHhidXJzdCAxXG4iKSk7CisJfQorCWVsc2UKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwlpZiAocEFkLT5Db21tb25DZmcuYkVuYWJsZVR4QnVyc3QpCisJeworCQlSVE1QX0lPX1JFQUQzMihwQWQsIEVEQ0FfQUMwX0NGRywgJkRhdGEpOworCQlEYXRhICAmPSAweEZGRkZGRjAwOworCQlEYXRhICB8PSAweDYwOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBFRENBX0FDMF9DRkcsIERhdGEpOworCQlwQWQtPkNvbW1vbkNmZy5JT1Rlc3RQYXJtLmJOb3dBdGhlcm9zQnVyc3RPbiA9IFRSVUU7CisKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgUEJGX01BWF9QQ05ULCAweDFGM0ZCRjlGKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiVHhidXJzdCAyXG4iKSk7CisJfQorCWVsc2UKKwl7CisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgRURDQV9BQzBfQ0ZHLCAmRGF0YSk7CisJCURhdGEgICY9IDB4RkZGRkZGMDA7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIEVEQ0FfQUMwX0NGRywgRGF0YSk7CisKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgUEJGX01BWF9QQ05ULCAweDFGM0Y3RjlGKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiVHhidXJzdCAzXG4iKSk7CisJfQorCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJLy8gUmUtY2hlY2sgdG8gdHVybiBvbiBUWCBidXJzdCBvciBub3QuCisJaWYgKChwQWQtPkNvbW1vbkNmZy5JT1Rlc3RQYXJtLmJMYXN0QXRoZXJvcyA9PSBUUlVFKSAmJiAoKFNUQV9XRVBfT04ocEFkKSl8fChTVEFfVEtJUF9PTihwQWQpKSkpCisJeworCQlwQWQtPkNvbW1vbkNmZy5JT1Rlc3RQYXJtLmJOZXh0RGlzYWJsZVJ4QkEgPSBUUlVFOworCQlpZiAocEFkLT5Db21tb25DZmcuYkVuYWJsZVR4QnVyc3QpCisJCXsKKwkJICAgIFVJTlQzMiBNQUNWYWx1ZSA9IDA7CisJCQkvLyBGb3JjZSBkaXNhYmxlICBUWE9QIHZhbHVlIGluIHRoaXMgY2FzZS4gVGhlIHNhbWUgYWN0aW9uIGluIE1MTUVVcGRhdGVQcm90ZWN0IHRvby4KKwkJCS8vIEkgZGlkbid0IGNoYW5nZSBQQkZfTUFYX1BDTlQgc2V0dGluZy4KKwkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgRURDQV9BQzBfQ0ZHLCAmTUFDVmFsdWUpOworCQkJTUFDVmFsdWUgICY9IDB4RkZGRkZGMDA7CisJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBFRENBX0FDMF9DRkcsIE1BQ1ZhbHVlKTsKKwkJCXBBZC0+Q29tbW9uQ2ZnLklPVGVzdFBhcm0uYk5vd0F0aGVyb3NCdXJzdE9uID0gRkFMU0U7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJcEFkLT5Db21tb25DZmcuSU9UZXN0UGFybS5iTmV4dERpc2FibGVSeEJBID0gRkFMU0U7CisJfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJcEFkLT5Db21tb25DZmcuSU9UZXN0UGFybS5iTGFzdEF0aGVyb3MgPSBGQUxTRTsKKwlDT1BZX01BQ19BRERSKHBBZC0+Q29tbW9uQ2ZnLkxhc3RCc3NpZCwgcEFkLT5Db21tb25DZmcuQnNzaWQpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhIXBBZC0+Yk5leHREaXNhYmxlUnhCQT0gJWQgXG4iLCBwQWQtPkNvbW1vbkNmZy5JT1Rlc3RQYXJtLmJOZXh0RGlzYWJsZVJ4QkEpKTsKKwkvLyBCU1NJRCBhZGQgaW4gb25lIE1BQyBlbnRyeSB0b28uICBCZWNhdXNlIGluIFR4LCBBU0lDIG5lZWQgdG8gY2hlY2sgQ2lwaGVyIGFuZCBJVi9FSVYsIEJBYml0bWFwCisJLy8gUHRoZXIgaW5mb3JtYXRpb24gaW4gTUFDVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0gaXMgbm90IG5lY2Vzc2FyeSBmb3IgZHJpdmVyLgorCS8vIE5vdGU6IEFzIFNUQSwgVGhlIE1BQ1RhYi5Db250ZW50W0JTU0lEX1dDSURdLiBQYWlyd2lzZUtleSBhbmQgU2hhcmVkIEtleSBmb3IgQlNTMCBhcmUgdGhlIHNhbWUuCisKKyAgICBpZiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzIDw9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZCkKKyAgICB7CisgICAgICAgIHBBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQ7CisJCXBBZC0+U3RhQ2ZnLlByaXZhY3lGaWx0ZXIgPSBOZGlzODAyXzExUHJpdkZpbHRlckFjY2VwdEFsbDsKKwl9CisKKwlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPk1hY1RhYkxvY2spOworCXBFbnRyeS0+UG9ydFNlY3VyZWQgPSBwQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZDsKKwlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPk1hY1RhYkxvY2spOworCisgICAgLy8KKwkvLyBQYXRjaCBBdGhlcm9zIEFQIFRYIHdpbGwgYnJlYWtkb3duIGlzc3VlLgorCS8vIEFQIE1vZGVsOiBETGluayBEV0wtODIwMEFQCisJLy8KKwlpZiAoSU5GUkFfT04ocEFkKSAmJiBPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1dNTV9JTlVTRUQpICYmIFNUQV9US0lQX09OKHBBZCkpCisJeworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBSWF9QQVJTRVJfQ0ZHLCAweDAxKTsKKwl9CisJZWxzZQorCXsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgUlhfUEFSU0VSX0NGRywgMHgwMCk7CisJfQorCisJUlRNUF9DTEVBUl9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUyk7CisKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorI2lmZGVmIERPVDExTl9EUkFGVDMKKwlpZiAoKHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5iMjA0MENvZXhpc3RTY2FuU3VwKSAmJiAocEFkLT5Db21tb25DZmcuQ2hhbm5lbCA8PSAxMSkpCisJeworCQlPUFNUQVRVU19TRVRfRkxBRyhwQWQsIGZPUF9TVEFUVVNfU0NBTl8yMDQwKTsKKwkJQnVpbGRFZmZlY3RlZENoYW5uZWxMaXN0KHBBZCk7CisJfQorI2VuZGlmIC8vIERPVDExTl9EUkFGVDMgLy8KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZQlEZXNjcmlwdGlvbjoKKwkJRGlzY29ubmVjdCBjdXJyZW50IEJTU0lECisKKwlBcmd1bWVudHM6CisJCXBBZAkJCQktIFBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKwkJSXNSZXFGcm9tQVAJCS0gUmVxdWVzdCBmcm9tIEFQCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJTm90ZToKKwkJV2UgbmVlZCBtb3JlIGluZm9ybWF0aW9uIHRvIGtub3cgaXQncyB0aGlzIHJlcXVzdCBmcm9tIEFQLgorCQlJZiB5ZXMhIHdlIG5lZWQgdG8gZG8gZXh0cmEgaGFuZGxpbmcsIGZvciBleGFtcGxlLCByZW1vdmUgdGhlIFdQQSBrZXkuCisJCU90aGVyd2lzZSBvbiA0LXdheSBoYW5kc2hha2luZyB3aWxsIGZhaWVkLCBzaW5jZSB0aGUgV1BBIGtleSBkaWRuJ3QgYmUKKwkJcmVtb3ZlIHdoaWxlIGF1dG8gcmVjb25uZWN0LgorCQlEaXNjb25uZWN0IHJlcXVlc3QgZnJvbSBBUCwgaXQgbWVhbnMgd2Ugd2lsbCBzdGFydCBhZnJlc2ggNC13YXkgaGFuZHNoYWtpbmcKKwkJb24gV1BBIG1vZGUuCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgTGlua0Rvd24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gIEJPT0xFQU4gICAgICBJc1JlcUZyb21BUCkKK3sKKwlVQ0hBUgkJCSAgICBpLCBCeXRlVmFsdWUgPSAwOworCisJLy8gRG8gbm90aGluZyBpZiBtb25pdG9yIG1vZGUgaXMgb24KKwlpZiAoTU9OSVRPUl9PTihwQWQpKQorCQlyZXR1cm47CisKKyNpZmRlZiBSQUxJTktfQVRFCisJLy8gTm90aGluZyB0byBkbyBpbiBBVEUgbW9kZS4KKwlpZiAoQVRFX09OKHBBZCkpCisJCXJldHVybjsKKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisKKyAgICBpZiAocEFkLT5Db21tb25DZmcuYldpcmVsZXNzRXZlbnQpCisJeworCQlSVE1QU2VuZFdpcmVsZXNzRXZlbnQocEFkLCBJV19TVEFfTElOS0RPV05fRVZFTlRfRkxBRywgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5BZGRyLCBCU1MwLCAwKTsKKwl9CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgTElOSyBET1dOICEhIVxuIikpOworCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0FHR1JFR0FUSU9OX0lOVVNFRCk7CisKKwlpZiAoQURIT0NfT04ocEFkKSkJCS8vIEFkaG9jIG1vZGUgbGluayBkb3duCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgTElOSyBET1dOIDEhISFcbiIpKTsKKworCQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19BREhPQ19PTik7CisJCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCk7CisJCXBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID0gTmRpc01lZGlhU3RhdGVEaXNjb25uZWN0ZWQ7CisJCVJUTVBfSW5kaWNhdGVNZWRpYVN0YXRlKHBBZCk7CisgICAgICAgIHBBZC0+RXh0cmFJbmZvID0gR0VORVJBTF9MSU5LX0RPV047CisJCUJzc1RhYmxlRGVsZXRlRW50cnkoJnBBZC0+U2NhblRhYiwgcEFkLT5Db21tb25DZmcuQnNzaWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgTWFjVGFiLlNpemU9JWQgISEhXG4iLCBwQWQtPk1hY1RhYi5TaXplKSk7CisJfQorCWVsc2UJCQkJCS8vIEluZnJhIHN0cnVjdHVyZSBtb2RlCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgTElOSyBET1dOIDIhISFcbiIpKTsKKworI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCQkvLyBETFMgdGVhciBkb3duIGZyYW1lIG11c3QgYmUgc2VudCBiZWZvcmUgbGluayBkb3duCisJCS8vIHNlbmQgRExTLVRFQVJfRE9XTiBtZXNzYWdlCisJCWlmIChwQWQtPkNvbW1vbkNmZy5iRExTQ2FwYWJsZSkKKwkJeworCQkJLy8gdGVhciBkb3duIGxvY2FsIGRscyB0YWJsZSBlbnRyeQorCQkJZm9yIChpPTA7IGk8TUFYX05VTV9PRl9JTklUX0RMU19FTlRSWTsgaSsrKQorCQkJeworCQkJCWlmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZCAmJiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID09IERMU19GSU5JU0gpKQorCQkJCXsKKwkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID0gRExTX05PTkU7CisJCQkJCVJUTVBTZW5kRExTVGVhckRvd25GcmFtZShwQWQsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpOworCQkJCX0KKwkJCX0KKworCQkJLy8gdGVhciBkb3duIHBlZXIgZGxzIHRhYmxlIGVudHJ5CisJCQlmb3IgKGk9TUFYX05VTV9PRl9JTklUX0RMU19FTlRSWTsgaTxNQVhfTlVNX09GX0RMU19FTlRSWTsgaSsrKQorCQkJeworCQkJCWlmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZCAmJiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID09ICBETFNfRklOSVNIKSkKKwkJCQl7CisJCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9IERMU19OT05FOworCQkJCQlSVE1QU2VuZERMU1RlYXJEb3duRnJhbWUocEFkLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKTsKKwkJCQl9CisJCQl9CisJCX0KKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKworCQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19JTkZSQV9PTik7CisJCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCk7CisKKwkJLy8gU2F2ZWQgbGFzdCBTU0lEIGZvciBsaW5rdXAgY29tcGFyaXNvbgorCQlwQWQtPkNvbW1vbkNmZy5MYXN0U3NpZExlbiA9IHBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW47CisJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+Q29tbW9uQ2ZnLkxhc3RTc2lkLCBwQWQtPkNvbW1vbkNmZy5Tc2lkLCBwQWQtPkNvbW1vbkNmZy5MYXN0U3NpZExlbik7CisJCUNPUFlfTUFDX0FERFIocEFkLT5Db21tb25DZmcuTGFzdEJzc2lkLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisJCWlmIChwQWQtPk1sbWVBdXguQ3VyclJlcUlzRnJvbU5kaXMgPT0gVFJVRSkKKwkJeworCQkJcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZURpc2Nvbm5lY3RlZDsKKwkJCVJUTVBfSW5kaWNhdGVNZWRpYVN0YXRlKHBBZCk7CisgICAgICAgICAgICBwQWQtPkV4dHJhSW5mbyA9IEdFTkVSQUxfTElOS19ET1dOOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTkRJU19TVEFUVVNfTUVESUFfRElTQ09OTkVDVCBFdmVudCBBIVxuIikpOworCQkJcEFkLT5NbG1lQXV4LkN1cnJSZXFJc0Zyb21OZGlzID0gRkFMU0U7CisJCX0KKwkJZWxzZQorCQl7CisgICAgICAgICAgICAvLworCQkJLy8gSWYgZGlzYXNzb2NpYXRpb24gcmVxdWVzdCBpcyBmcm9tIE5ESVMsIHRoZW4gd2UgZG9uJ3QgbmVlZCB0byBkZWxldGUgQlNTSUQgZnJvbSBlbnRyeS4KKwkJCS8vIE90aGVyd2lzZSBsb3N0IGJlYWNvbiBvciByZWNlaXZlIERlLUF1dGhlbnRpY2F0aW9uIGZyb20gQVAsCisJCQkvLyB0aGVuIHdlIHNob3VsZCBkZWxldGUgQlNTSUQgZnJvbSBCc3NUYWJsZS4KKwkJCS8vIElmIHdlIGRvbid0IGRlbGV0ZSBmcm9tIGVudHJ5LCByb2FtaW5nIHdpbGwgZmFpbC4KKwkJCS8vCisJCQlCc3NUYWJsZURlbGV0ZUVudHJ5KCZwQWQtPlNjYW5UYWIsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKTsKKwkJfQorCisJCS8vIHJlc3RvcmUgYmFjayB0byAtCisJCS8vICAgICAgMS4gbG9uZyBzbG90ICgyMCB1cykgb3Igc2hvcnQgc2xvdCAoOSB1cykgdGltZQorCQkvLyAgICAgIDIuIHR1cm4gb24vb2ZmIFJUUy9DVFMgYW5kL29yIENUUy10by1zZWxmIHByb3RlY3Rpb24KKwkJLy8gICAgICAzLiBzaG9ydCBwcmVhbWJsZQorCQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19CR19QUk9URUNUSU9OX0lOVVNFRCk7CisKKwkJaWYgKHBBZC0+U3RhQ2ZnLkNDWEFkamFjZW50QVBSZXBvcnRGbGFnID09IFRSVUUpCisJCXsKKwkJCS8vCisJCQkvLyBSZWNvcmQgY3VycmVudCBBUCdzIGluZm9ybWF0aW9uLgorCQkJLy8gZm9yIGxhdGVyIHVzZWQgcmVwb3J0aW5nIEFkamFjZW50IEFQIHJlcG9ydC4KKwkJCS8vCisJCQlwQWQtPlN0YUNmZy5DQ1hBZGphY2VudEFQQ2hhbm5lbCA9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWw7CisJCQlwQWQtPlN0YUNmZy5DQ1hBZGphY2VudEFQU3NpZExlbiA9IHBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW47CisJCQlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5DQ1hBZGphY2VudEFQU3NpZCwgcEFkLT5Db21tb25DZmcuU3NpZCwgcEFkLT5TdGFDZmcuQ0NYQWRqYWNlbnRBUFNzaWRMZW4pOworCQkJQ09QWV9NQUNfQUREUihwQWQtPlN0YUNmZy5DQ1hBZGphY2VudEFQQnNzaWQsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKwkJfQorCisjaWZkZWYgRVhUX0JVSUxEX0NIQU5ORUxfTElTVAorCQkvLyBDb3VudHJ5IElFIG9mIHRoZSBBUCB3aWxsIGJlIGV2YWx1YXRlZCBhbmQgd2lsbCBiZSB1c2VkLgorCQlpZiAocEFkLT5TdGFDZmcuSUVFRTgwMjExZENsaWVudE1vZGUgIT0gUnQ4MDJfMTFfRF9Ob25lKQorCQl7CisJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5Db21tb25DZmcuQ291bnRyeUNvZGVbMF0sICZwQWQtPlN0YUNmZy5TdGFPcmlDb3VudHJ5Q29kZVswXSwgMik7CisJCQlwQWQtPkNvbW1vbkNmZy5HZW9ncmFwaHkgPSBwQWQtPlN0YUNmZy5TdGFPcmlHZW9ncmFwaHk7CisJCQlCdWlsZENoYW5uZWxMaXN0RXgocEFkKTsKKwkJfQorI2VuZGlmIC8vIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QgLy8KKworCX0KKworCWZvciAoaT0xOyBpPE1BWF9MRU5fT0ZfTUFDX1RBQkxFOyBpKyspCisJeworCQlpZiAocEFkLT5NYWNUYWIuQ29udGVudFtpXS5WYWxpZEFzQ0xJID09IFRSVUUpCisJCQlNYWNUYWJsZURlbGV0ZUVudHJ5KHBBZCwgcEFkLT5NYWNUYWIuQ29udGVudFtpXS5BaWQsIHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uQWRkcik7CisJfQorCisJcEFkLT5TdGFDZmcuQ0NYUW9zRUNXTWluCT0gNDsKKwlwQWQtPlN0YUNmZy5DQ1hRb3NFQ1dNYXgJPSAxMDsKKworCUFzaWNTZXRTbG90VGltZShwQWQsIFRSVUUpOyAvL0ZBTFNFKTsKKwlBc2ljU2V0RWRjYVBhcm0ocEFkLCBOVUxMKTsKKworCS8vIFNldCBMRUQKKwlSVE1QU2V0TEVEKHBBZCwgTEVEX0xJTktfRE9XTik7CisgICAgcEFkLT5MZWRJbmRpY2F0b3JTdHJlZ3RoID0gMHhGMDsKKyAgICBSVE1QU2V0U2lnbmFsTEVEKHBBZCwgLTEwMCk7CS8vIEZvcmNlIHNpZ25hbCBzdHJlbmd0aCBMZWQgdG8gYmUgdHVybmVkIG9mZiwgZmlybXdhcmUgaXMgbm90IGRvbmUgaXQuCisKKwkJQXNpY0Rpc2FibGVTeW5jKHBBZCk7CisKKwlwQWQtPk1sbWUuUGVyaW9kaWNSb3VuZCA9IDA7CisJcEFkLT5NbG1lLk9uZVNlY1BlcmlvZGljUm91bmQgPSAwOworCisJaWYgKHBBZC0+U3RhQ2ZnLkJzc1R5cGUgPT0gQlNTX0lORlJBKQorCXsKKwkJLy8gUmVtb3ZlIFN0YUNmZyBJbmZvcm1hdGlvbiBhZnRlciBsaW5rIGRvd24KKwkJTmRpc1plcm9NZW1vcnkocEFkLT5Db21tb25DZmcuQnNzaWQsIE1BQ19BRERSX0xFTik7CisJCU5kaXNaZXJvTWVtb3J5KHBBZC0+Q29tbW9uQ2ZnLlNzaWQsIE1BWF9MRU5fT0ZfU1NJRCk7CisJCXBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW4gPSAwOworCX0KKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwlOZGlzWmVyb01lbW9yeSgmcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eSwgc2l6ZW9mKEhUX0NBUEFCSUxJVFlfSUUpKTsKKwlOZGlzWmVyb01lbW9yeSgmcEFkLT5NbG1lQXV4LkFkZEh0SW5mbywgc2l6ZW9mKEFERF9IVF9JTkZPX0lFKSk7CisJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eUxlbiA9IDA7CisJcEFkLT5NbG1lQXV4Lk5ld0V4dENoYW5uZWxPZmZzZXQgPSAweGZmOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJLy8gUmVzZXQgV1BBLVBTSyBzdGF0ZS4gT25seSByZXNldCB3aGVuIHN1cHBsaWNhbnQgZW5hYmxlZAorCWlmIChwQWQtPlN0YUNmZy5XcGFTdGF0ZSAhPSBTU19OT1RVU0UpCisJeworCQlwQWQtPlN0YUNmZy5XcGFTdGF0ZSA9IFNTX1NUQVJUOworCQkvLyBDbGVhciBSZXBsYXkgY291bnRlcgorCQlOZGlzWmVyb01lbW9yeShwQWQtPlN0YUNmZy5SZXBsYXlDb3VudGVyLCA4KTsKKworI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCQlpZiAocEFkLT5Db21tb25DZmcuYkRMU0NhcGFibGUpCisJCQlOZGlzWmVyb01lbW9yeShwQWQtPlN0YUNmZy5EbHNSZXBsYXlDb3VudGVyLCA4KTsKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKwl9CisKKworCS8vCisJLy8gaWYgbGluayBkb3duIGNvbWUgZnJvbSBBUCwgd2UgbmVlZCB0byByZW1vdmUgYWxsIFdQQSBrZXlzIG9uIFdQQSBtb2RlLgorCS8vIG90aGVyd2lzZSB3aWxsIGNhdXNlIDQtd2F5IGhhbmRzaGFraW5nIGZhaWxlZCwgc2luY2UgdGhlIFdQQSBrZXkgbm90IGVtcHR5LgorCS8vCisJaWYgKChJc1JlcUZyb21BUCkgJiYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkpCisJeworCQkvLyBSZW1vdmUgYWxsIFdQQSBrZXlzCisJCVJUTVBXUEFSZW1vdmVBbGxLZXlzKHBBZCk7CisJfQorCisJLy8gODAyLjF4IHBvcnQgY29udHJvbAorI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKwkvLyBQcmV2ZW50IGNsZWFyIFBvcnRTZWN1cmVkIGhlcmUgd2l0aCBzdGF0aWMgV0VQCisJLy8gTmV0d29ya01hbmdlciBzZXQgc2VjdXJpdHkgcG9saWN5IGZpcnN0IHRoZW4gc2V0IFNTSUQgdG8gY29ubmVjdCBBUC4KKwlpZiAocEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQICYmCisJCShwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMVdFUEVuYWJsZWQpICYmCisJCShwQWQtPlN0YUNmZy5JRUVFODAyMVggPT0gRkFMU0UpKQorCXsKKwkJcEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRDsKKwl9CisJZWxzZQorI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKwl7CisJCXBBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX05PVF9TRUNVUkVEOworCQlwQWQtPlN0YUNmZy5Qcml2YWN5RmlsdGVyID0gTmRpczgwMl8xMVByaXZGaWx0ZXI4MDIxeFdFUDsKKwl9CisKKwlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPk1hY1RhYkxvY2spOworCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUG9ydFNlY3VyZWQgPSBwQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZDsKKwlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPk1hY1RhYkxvY2spOworCisJcEFkLT5TdGFDZmcuTWljRXJyQ250ID0gMDsKKworCS8vIFR1cm4gb2ZmIENraXAgY29udHJvbCBmbGFnCisJcEFkLT5TdGFDZmcuYkNraXBPbiA9IEZBTFNFOworCXBBZC0+U3RhQ2ZnLkNDWEVuYWJsZSA9IEZBTFNFOworCisgICAgcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZURpc2Nvbm5lY3RlZDsKKwkvLyBVcGRhdGUgZXh0cmEgaW5mb3JtYXRpb24gdG8gbGluayBpcyB1cAorCXBBZC0+RXh0cmFJbmZvID0gR0VORVJBTF9MSU5LX0RPV047CisKKyAgICAvL3BBZC0+U3RhQ2ZnLkFkaG9jQk9ubHlKb2luZWQgPSBGQUxTRTsKKwkvL3BBZC0+U3RhQ2ZnLkFkaG9jQkdKb2luZWQgPSBGQUxTRTsKKwkvL3BBZC0+U3RhQ2ZnLkFkaG9jMjBOSm9pbmVkID0gRkFMU0U7CisgICAgcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5iSHRFbmFibGUgPSBGQUxTRTsKKworCS8vIFJlc2V0IHRoZSBDdXJyZW50IEFQJ3MgSVAgYWRkcmVzcworCU5kaXNaZXJvTWVtb3J5KHBBZC0+U3RhQ2ZnLkFpcm9uZXRJUEFkZHJlc3MsIDQpOworI2lmZGVmIFJUMjg3MAorCXBBZC0+YlVzYlR4QnVsa0FnZ3JlID0gRkFMU0U7CisjZW5kaWYgLy8gUlQyODcwIC8vCisKKwkvLyBDbGVhbiBhc3NvY2lhdGlvbiBpbmZvcm1hdGlvbgorCU5kaXNaZXJvTWVtb3J5KCZwQWQtPlN0YUNmZy5Bc3NvY0luZm8sIHNpemVvZihORElTXzgwMl8xMV9BU1NPQ0lBVElPTl9JTkZPUk1BVElPTikpOworCXBBZC0+U3RhQ2ZnLkFzc29jSW5mby5MZW5ndGggPSBzaXplb2YoTkRJU184MDJfMTFfQVNTT0NJQVRJT05fSU5GT1JNQVRJT04pOworCXBBZC0+U3RhQ2ZnLlJlcVZhcklFTGVuID0gMDsKKwlwQWQtPlN0YUNmZy5SZXNWYXJJRUxlbiA9IDA7CisKKwkvLworCS8vIFJlc2V0IFJTU0kgdmFsdWUgYWZ0ZXIgbGluayBkb3duCisJLy8KKwlwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kwID0gMDsKKwlwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kwWDggPSAwOworCXBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTEgPSAwOworCXBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTFYOCA9IDA7CisJcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMiA9IDA7CisJcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMlg4ID0gMDsKKworCS8vIFJlc3RvcmUgTWxtZVJhdGUKKwlwQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZSA9IHBBZC0+Q29tbW9uQ2ZnLkJhc2ljTWxtZVJhdGU7CisJcEFkLT5Db21tb25DZmcuUnRzUmF0ZSA9IHBBZC0+Q29tbW9uQ2ZnLkJhc2ljTWxtZVJhdGU7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkvLworCS8vIEFmdGVyIExpbmsgZG93biwgcmVzZXQgcGlnZ3ktYmFjayBzZXR0aW5nIGluIEFTSUMuIERpc2FibGUgUkRHLgorCS8vCisJaWYgKHBBZC0+Q29tbW9uQ2ZnLkJCUEN1cnJlbnRCVyA9PSBCV180MCkKKwl7CisJCXBBZC0+Q29tbW9uQ2ZnLkJCUEN1cnJlbnRCVyA9IEJXXzIwOworCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsICZCeXRlVmFsdWUpOworCQlCeXRlVmFsdWUgJj0gKH4weDE4KTsKKwkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgQnl0ZVZhbHVlKTsKKwl9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJLy8gUmVzZXQgREFDCisJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IxLCAmQnl0ZVZhbHVlKTsKKwlCeXRlVmFsdWUgJj0gKH4weDE4KTsKKwlpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCA9PSAyKQorCXsKKwkJQnl0ZVZhbHVlIHw9IDB4MTA7CisJfQorCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjEsIEJ5dGVWYWx1ZSk7CisKKwlSVE1QU2V0UGlnZ3lCYWNrKHBBZCxGQUxTRSk7CisJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfUElHR1lCQUNLX0lOVVNFRCk7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwlwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkud29yZCA9IHBBZC0+Q29tbW9uQ2ZnLlJFR0JBQ2FwYWJpbGl0eS53b3JkOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJLy8gUmVzdG9yZSBhbGwgc2V0dGluZ3MgaW4gdGhlIGZvbGxvd2luZy4KKwlBc2ljVXBkYXRlUHJvdGVjdChwQWQsIDAsIChBTExOX1NFVFBST1RFQ1R8Q0NLU0VUUFJPVEVDVHxPRkRNU0VUUFJPVEVDVCksIFRSVUUsIEZBTFNFKTsKKwlBc2ljRGlzYWJsZVJERyhwQWQpOworCXBBZC0+Q29tbW9uQ2ZnLklPVGVzdFBhcm0uYkN1cnJlbnRBdGhlcm9zID0gRkFMU0U7CisJcEFkLT5Db21tb25DZmcuSU9UZXN0UGFybS5iTm93QXRoZXJvc0J1cnN0T24gPSBGQUxTRTsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorI2lmZGVmIERPVDExTl9EUkFGVDMKKwlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19TQ0FOXzIwNDApOworCXBBZC0+Q29tbW9uQ2ZnLkJTU0NvZXhpc3QyMDQwLndvcmQgPSAwOworCVRyaUV2ZW50SW5pdChwQWQpOworCWZvciAoaSA9IDA7IGkgPCAocEFkLT5DaGFubmVsTGlzdE51bSAtIDEpOyBpKyspCisJeworCQlwQWQtPkNoYW5uZWxMaXN0W2ldLmJFZmZlY3RlZENoYW5uZWwgPSBGQUxTRTsKKwl9CisjZW5kaWYgLy8gRE9UMTFOX0RSQUZUMyAvLworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJUlRNUF9JT19XUklURTMyKHBBZCwgTUFYX0xFTl9DRkcsIDB4MWZmZik7CisJUlRNUF9DTEVBUl9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUyk7CisKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisjaWZuZGVmIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisJaWYgKHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCkgeworCQl1bmlvbiBpd3JlcV9kYXRhICAgIHdycXU7CisJCS8vc2VuZCBkaXNhc3NvY2lhdGUgZXZlbnQgdG8gd3BhX3N1cHBsaWNhbnQKKwkJbWVtc2V0KCZ3cnF1LCAwLCBzaXplb2Yod3JxdSkpOworCQl3cnF1LmRhdGEuZmxhZ3MgPSBSVF9ESVNBU1NPQ19FVkVOVF9GTEFHOworCQl3aXJlbGVzc19zZW5kX2V2ZW50KHBBZC0+bmV0X2RldiwgSVdFVkNVU1RPTSwgJndycXUsIE5VTEwpOworCX0KKyNlbmRpZiAvLyBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKworI2lmZGVmIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisJeworCQl1bmlvbiBpd3JlcV9kYXRhICAgIHdycXU7CisJCW1lbXNldCh3cnF1LmFwX2FkZHIuc2FfZGF0YSwgMCwgTUFDX0FERFJfTEVOKTsKKwkJd2lyZWxlc3Nfc2VuZF9ldmVudChwQWQtPm5ldF9kZXYsIFNJT0NHSVdBUCwgJndycXUsIE5VTEwpOworCX0KKyNlbmRpZiAvLyBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBJdGVyYXRlT25Cc3NUYWIoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJTUxNRV9TVEFSVF9SRVFfU1RSVUNUICAgU3RhcnRSZXE7CisJTUxNRV9KT0lOX1JFUV9TVFJVQ1QgICAgSm9pblJlcTsKKwlVTE9ORyAgICAgICAgICAgICAgICAgICBCc3NJZHg7CisKKwkvLyBDaGFuZ2UgdGhlIHdlcHN0YXR1cyB0byBvcmlnaW5hbCB3ZXBzdGF0dXMKKwlwQWQtPlN0YUNmZy5XZXBTdGF0dXMgICA9IHBBZC0+U3RhQ2ZnLk9yaWdXZXBTdGF0dXM7CisJcEFkLT5TdGFDZmcuUGFpckNpcGhlciAgPSBwQWQtPlN0YUNmZy5PcmlnV2VwU3RhdHVzOworCXBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID0gcEFkLT5TdGFDZmcuT3JpZ1dlcFN0YXR1czsKKworCUJzc0lkeCA9IHBBZC0+TWxtZUF1eC5Cc3NJZHg7CisJaWYgKEJzc0lkeCA8IHBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLkJzc05yKQorCXsKKwkJLy8gQ2hlY2sgY2lwaGVyIHN1aXRlLCBBUCBtdXN0IGhhdmUgbW9yZSBzZWN1cmVkIGNpcGhlciB0aGFuIHN0YXRpb24gc2V0dGluZworCQkvLyBTZXQgdGhlIFBhaXJ3aXNlIGFuZCBHcm91cCBjaXBoZXIgdG8gbWF0Y2ggdGhlIGludGVuZGVkIEFQIHNldHRpbmcKKwkJLy8gV2UgY2FuIG9ubHkgY29ubmVjdCB0byBBUCB3aXRoIGxlc3Mgc2VjdXJlZCBjaXBoZXIgc2V0dGluZworCQlpZiAoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkgfHwgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykpCisJCXsKKwkJCXBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID0gcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzRW50cnlbQnNzSWR4XS5XUEEuR3JvdXBDaXBoZXI7CisKKwkJCWlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzRW50cnlbQnNzSWR4XS5XUEEuUGFpckNpcGhlcikKKwkJCQlwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID0gcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzRW50cnlbQnNzSWR4XS5XUEEuUGFpckNpcGhlcjsKKwkJCWVsc2UgaWYgKHBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLkJzc0VudHJ5W0Jzc0lkeF0uV1BBLlBhaXJDaXBoZXJBdXggIT0gTmRpczgwMl8xMVdFUERpc2FibGVkKQorCQkJCXBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPSBwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NFbnRyeVtCc3NJZHhdLldQQS5QYWlyQ2lwaGVyQXV4OworCQkJZWxzZQkvLyBUaGVyZSBpcyBubyBQYWlyQ2lwaGVyIEF1eCwgZG93bmdyYWRlIG91ciBjYXBhYmlsaXR5IHRvIFRLSVAKKwkJCQlwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZDsKKwkJfQorCQllbHNlIGlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikgfHwgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spKQorCQl7CisJCQlwQWQtPlN0YUNmZy5Hcm91cENpcGhlciA9IHBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLkJzc0VudHJ5W0Jzc0lkeF0uV1BBMi5Hcm91cENpcGhlcjsKKworCQkJaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NFbnRyeVtCc3NJZHhdLldQQTIuUGFpckNpcGhlcikKKwkJCQlwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID0gcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzRW50cnlbQnNzSWR4XS5XUEEyLlBhaXJDaXBoZXI7CisJCQllbHNlIGlmIChwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NFbnRyeVtCc3NJZHhdLldQQTIuUGFpckNpcGhlckF1eCAhPSBOZGlzODAyXzExV0VQRGlzYWJsZWQpCisJCQkJcEFkLT5TdGFDZmcuUGFpckNpcGhlciA9IHBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLkJzc0VudHJ5W0Jzc0lkeF0uV1BBMi5QYWlyQ2lwaGVyQXV4OworCQkJZWxzZQkvLyBUaGVyZSBpcyBubyBQYWlyQ2lwaGVyIEF1eCwgZG93bmdyYWRlIG91ciBjYXBhYmlsaXR5IHRvIFRLSVAKKwkJCQlwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZDsKKworCQkJLy8gUlNOIGNhcGFiaWxpdHkKKwkJCXBBZC0+U3RhQ2ZnLlJzbkNhcGFiaWxpdHkgPSBwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NFbnRyeVtCc3NJZHhdLldQQTIuUnNuQ2FwYWJpbGl0eTsKKwkJfQorCisJCS8vIFNldCBNaXggY2lwaGVyIGZsYWcKKwkJcEFkLT5TdGFDZmcuYk1peENpcGhlciA9IChwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID09IHBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyKSA/IEZBTFNFIDogVFJVRTsKKwkJaWYgKHBBZC0+U3RhQ2ZnLmJNaXhDaXBoZXIgPT0gVFJVRSkKKwkJeworCQkJLy8gSWYgbWl4IGNpcGhlciwgcmUtYnVpbGQgUlNOSUUKKwkJCVJUTVBNYWtlUlNOSUUocEFkLCBwQWQtPlN0YUNmZy5BdXRoTW9kZSwgcEFkLT5TdGFDZmcuV2VwU3RhdHVzLCAwKTsKKwkJfQorCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBpdGVyYXRlIEJTUyAlbGQgb2YgJWRcbiIsIEJzc0lkeCwgcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzTnIpKTsKKwkJSm9pblBhcm1GaWxsKHBBZCwgJkpvaW5SZXEsIEJzc0lkeCk7CisJCU1sbWVFbnF1ZXVlKHBBZCwgU1lOQ19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9KT0lOX1JFUSwgc2l6ZW9mKE1MTUVfSk9JTl9SRVFfU1RSVUNUKSwKKwkJCQkJJkpvaW5SZXEpOworCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX0pPSU47CisJfQorCWVsc2UgaWYgKHBBZC0+U3RhQ2ZnLkJzc1R5cGUgPT0gQlNTX0FESE9DKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ05UTCAtIEFsbCBCU1MgZmFpbDsgc3RhcnQgYSBuZXcgQURIT0MgKFNzaWQ9JXMpLi4uXG4iLHBBZC0+TWxtZUF1eC5Tc2lkKSk7CisJCVN0YXJ0UGFybUZpbGwocEFkLCAmU3RhcnRSZXEsIHBBZC0+TWxtZUF1eC5Tc2lkLCBwQWQtPk1sbWVBdXguU3NpZExlbik7CisJCU1sbWVFbnF1ZXVlKHBBZCwgU1lOQ19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9TVEFSVF9SRVEsIHNpemVvZihNTE1FX1NUQVJUX1JFUV9TVFJVQ1QpLCAmU3RhcnRSZXEpOworCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX1NUQVJUOworCX0KKwllbHNlIC8vIG5vIG1vcmUgQlNTCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gQWxsIHJvYW1pbmcgZmFpbGVkLCBzdGF5IEAgY2ggIyVkXG4iLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKSk7CisJCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCwgRkFMU0UpOworCQlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKTsKKwkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfSURMRTsKKwl9Cit9CisKKy8vIGZvciByZS1hc3NvY2lhdGlvbiBvbmx5CisvLyBJUlFMID0gRElTUEFUQ0hfTEVWRUwKK1ZPSUQgSXRlcmF0ZU9uQnNzVGFiMigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlNTE1FX1JFQVNTT0NfUkVRX1NUUlVDVCBSZWFzc29jUmVxOworCVVMT05HICAgICAgICAgICAgICAgICAgIEJzc0lkeDsKKwlCU1NfRU5UUlkgICAgICAgICAgICAgICAqcEJzczsKKworCUJzc0lkeCA9IHBBZC0+TWxtZUF1eC5Sb2FtSWR4OworCXBCc3MgPSAmcEFkLT5NbG1lQXV4LlJvYW1UYWIuQnNzRW50cnlbQnNzSWR4XTsKKworCWlmIChCc3NJZHggPCBwQWQtPk1sbWVBdXguUm9hbVRhYi5Cc3NOcikKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBpdGVyYXRlIEJTUyAlbGQgb2YgJWRcbiIsIEJzc0lkeCwgcEFkLT5NbG1lQXV4LlJvYW1UYWIuQnNzTnIpKTsKKworCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBCc3MtPkNoYW5uZWwsIEZBTFNFKTsKKwkJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEJzcy0+Q2hhbm5lbCk7CisKKwkJLy8gcmVhc3NvY2lhdGUgbWVzc2FnZSBoYXMgdGhlIHNhbWUgc3RydWN0dXJlIGFzIGFzc29jaWF0ZSBtZXNzYWdlCisJCUFzc29jUGFybUZpbGwocEFkLCAmUmVhc3NvY1JlcSwgcEJzcy0+QnNzaWQsIHBCc3MtPkNhcGFiaWxpdHlJbmZvLAorCQkJCQkgIEFTU09DX1RJTUVPVVQsIHBBZC0+U3RhQ2ZnLkRlZmF1bHRMaXN0ZW5Db3VudCk7CisJCU1sbWVFbnF1ZXVlKHBBZCwgQVNTT0NfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfUkVBU1NPQ19SRVEsCisJCQkJCXNpemVvZihNTE1FX1JFQVNTT0NfUkVRX1NUUlVDVCksICZSZWFzc29jUmVxKTsKKworCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX1JFQVNTT0M7CisJfQorCWVsc2UgLy8gbm8gbW9yZSBCU1MKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBBbGwgZmFzdCByb2FtaW5nIGZhaWxlZCwgYmFjayB0byBjaCAjJWRcbiIscEFkLT5Db21tb25DZmcuQ2hhbm5lbCkpOworCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwsIEZBTFNFKTsKKwkJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCk7CisJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX0lETEU7CisJfQorfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBKb2luUGFybUZpbGwoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gT1VUIE1MTUVfSk9JTl9SRVFfU1RSVUNUICpKb2luUmVxLAorCUlOIFVMT05HIEJzc0lkeCkKK3sKKwlKb2luUmVxLT5Cc3NJZHggPSBCc3NJZHg7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIFNjYW5QYXJtRmlsbCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBPVVQgTUxNRV9TQ0FOX1JFUV9TVFJVQ1QgKlNjYW5SZXEsCisJSU4gQ0hBUiBTc2lkW10sCisJSU4gVUNIQVIgU3NpZExlbiwKKwlJTiBVQ0hBUiBCc3NUeXBlLAorCUlOIFVDSEFSIFNjYW5UeXBlKQoreworICAgIE5kaXNaZXJvTWVtb3J5KFNjYW5SZXEtPlNzaWQsIE1BWF9MRU5fT0ZfU1NJRCk7CisJU2NhblJlcS0+U3NpZExlbiA9IFNzaWRMZW47CisJTmRpc01vdmVNZW1vcnkoU2NhblJlcS0+U3NpZCwgU3NpZCwgU3NpZExlbik7CisJU2NhblJlcS0+QnNzVHlwZSA9IEJzc1R5cGU7CisJU2NhblJlcS0+U2NhblR5cGUgPSBTY2FuVHlwZTsKK30KKworI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgRGxzUGFybUZpbGwoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gT1VUIE1MTUVfRExTX1JFUV9TVFJVQ1QgKnBEbHNSZXEsCisJSU4gUFJUXzgwMl8xMV9ETFMgcERscywKKwlJTiBVU0hPUlQgcmVhc29uKQoreworCXBEbHNSZXEtPnBETFMgPSBwRGxzOworCXBEbHNSZXEtPlJlYXNvbiA9IHJlYXNvbjsKK30KKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgU3RhcnRQYXJtRmlsbCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBPVVQgTUxNRV9TVEFSVF9SRVFfU1RSVUNUICpTdGFydFJlcSwKKwlJTiBDSEFSIFNzaWRbXSwKKwlJTiBVQ0hBUiBTc2lkTGVuKQoreworCUFTU0VSVChTc2lkTGVuIDw9IE1BWF9MRU5fT0ZfU1NJRCk7CisJTmRpc01vdmVNZW1vcnkoU3RhcnRSZXEtPlNzaWQsIFNzaWQsIFNzaWRMZW4pOworCVN0YXJ0UmVxLT5Tc2lkTGVuID0gU3NpZExlbjsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgQXV0aFBhcm1GaWxsKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE9VVCBNTE1FX0FVVEhfUkVRX1NUUlVDVCAqQXV0aFJlcSwKKwlJTiBQVUNIQVIgcEFkZHIsCisJSU4gVVNIT1JUIEFsZykKK3sKKwlDT1BZX01BQ19BRERSKEF1dGhSZXEtPkFkZHIsIHBBZGRyKTsKKwlBdXRoUmVxLT5BbGcgPSBBbGc7CisJQXV0aFJlcS0+VGltZW91dCA9IEFVVEhfVElNRU9VVDsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKworI2lmZGVmIFJUMjg3MAorCitWT0lEIE1sbWVDbnRsQ29uZmlybSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVTE9ORyBNc2dUeXBlLAorCUlOIFVTSE9SVCBNc2cpCit7CisJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTXNnVHlwZSwgc2l6ZW9mKFVTSE9SVCksICZNc2cpOworfQorCitWT0lEIENvbXBvc2VQc1BvbGwoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJUFRYSU5GT19TVFJVQwkJcFR4SW5mbzsKKwlQVFhXSV9TVFJVQwkJcFR4V0k7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDb21wb3NlUHNQb2xsXG4iKSk7CisJTmRpc1plcm9NZW1vcnkoJnBBZC0+UHNQb2xsRnJhbWUsIHNpemVvZihQU1BPTExfRlJBTUUpKTsKKworCXBBZC0+UHNQb2xsRnJhbWUuRkMuUHdyTWdtdCA9IDA7CisJcEFkLT5Qc1BvbGxGcmFtZS5GQy5UeXBlID0gQlRZUEVfQ05UTDsKKwlwQWQtPlBzUG9sbEZyYW1lLkZDLlN1YlR5cGUgPSBTVUJUWVBFX1BTX1BPTEw7CisJcEFkLT5Qc1BvbGxGcmFtZS5BaWQgPSBwQWQtPlN0YUFjdGl2ZS5BaWQgfCAweEMwMDA7CisJQ09QWV9NQUNfQUREUihwQWQtPlBzUG9sbEZyYW1lLkJzc2lkLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisJQ09QWV9NQUNfQUREUihwQWQtPlBzUG9sbEZyYW1lLlRhLCBwQWQtPkN1cnJlbnRBZGRyZXNzKTsKKworCVJUTVBaZXJvTWVtb3J5KCZwQWQtPlBzUG9sbENvbnRleHQuVHJhbnNmZXJCdWZmZXItPmZpZWxkLldpcmVsZXNzUGFja2V0WzBdLCAxMDApOworCXBUeEluZm8gPSAoUFRYSU5GT19TVFJVQykmcEFkLT5Qc1BvbGxDb250ZXh0LlRyYW5zZmVyQnVmZmVyLT5maWVsZC5XaXJlbGVzc1BhY2tldFswXTsKKwlSVE1QV3JpdGVUeEluZm8ocEFkLCBwVHhJbmZvLCAoVVNIT1JUKShzaXplb2YoUFNQT0xMX0ZSQU1FKStUWFdJX1NJWkUpLCBUUlVFLCBFcFRvUXVldWVbTUdNVFBJUEVJRFhdLCBGQUxTRSwgIEZBTFNFKTsKKwlwVHhXSSA9IChQVFhXSV9TVFJVQykmcEFkLT5Qc1BvbGxDb250ZXh0LlRyYW5zZmVyQnVmZmVyLT5maWVsZC5XaXJlbGVzc1BhY2tldFtUWElORk9fU0laRV07CisJUlRNUFdyaXRlVHhXSShwQWQsIHBUeFdJLCBGQUxTRSwgRkFMU0UsIEZBTFNFLCBGQUxTRSwgVFJVRSwgRkFMU0UsIDAsIEJTU0lEX1dDSUQsIChzaXplb2YoUFNQT0xMX0ZSQU1FKSksCisJCTAsICAwLCAoVUNIQVIpcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1DUywgSUZTX0JBQ0tPRkYsIEZBTFNFLCAmcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0KTsKKwlSVE1QTW92ZU1lbW9yeSgmcEFkLT5Qc1BvbGxDb250ZXh0LlRyYW5zZmVyQnVmZmVyLT5maWVsZC5XaXJlbGVzc1BhY2tldFtUWFdJX1NJWkUrVFhJTkZPX1NJWkVdLCAmcEFkLT5Qc1BvbGxGcmFtZSwgc2l6ZW9mKFBTUE9MTF9GUkFNRSkpOworCS8vIEFwcGVuZCA0IGV4dHJhIHplcm8gYnl0ZXMuCisJcEFkLT5Qc1BvbGxDb250ZXh0LkJ1bGtPdXRTaXplID0gIFRYSU5GT19TSVpFICsgVFhXSV9TSVpFICsgc2l6ZW9mKFBTUE9MTF9GUkFNRSkgKyA0OworfQorCisvLyBJUlFMID0gRElTUEFUQ0hfTEVWRUwKK1ZPSUQgQ29tcG9zZU51bGxGcmFtZSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlQVFhJTkZPX1NUUlVDCQlwVHhJbmZvOworCVBUWFdJX1NUUlVDCQlwVHhXSTsKKworCU5kaXNaZXJvTWVtb3J5KCZwQWQtPk51bGxGcmFtZSwgc2l6ZW9mKEhFQURFUl84MDJfMTEpKTsKKwlwQWQtPk51bGxGcmFtZS5GQy5UeXBlID0gQlRZUEVfREFUQTsKKwlwQWQtPk51bGxGcmFtZS5GQy5TdWJUeXBlID0gU1VCVFlQRV9OVUxMX0ZVTkM7CisJcEFkLT5OdWxsRnJhbWUuRkMuVG9EcyA9IDE7CisJQ09QWV9NQUNfQUREUihwQWQtPk51bGxGcmFtZS5BZGRyMSwgcEFkLT5Db21tb25DZmcuQnNzaWQpOworCUNPUFlfTUFDX0FERFIocEFkLT5OdWxsRnJhbWUuQWRkcjIsIHBBZC0+Q3VycmVudEFkZHJlc3MpOworCUNPUFlfTUFDX0FERFIocEFkLT5OdWxsRnJhbWUuQWRkcjMsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKwlSVE1QWmVyb01lbW9yeSgmcEFkLT5OdWxsQ29udGV4dC5UcmFuc2ZlckJ1ZmZlci0+ZmllbGQuV2lyZWxlc3NQYWNrZXRbMF0sIDEwMCk7CisJcFR4SW5mbyA9IChQVFhJTkZPX1NUUlVDKSZwQWQtPk51bGxDb250ZXh0LlRyYW5zZmVyQnVmZmVyLT5maWVsZC5XaXJlbGVzc1BhY2tldFswXTsKKwlSVE1QV3JpdGVUeEluZm8ocEFkLCBwVHhJbmZvLCAoVVNIT1JUKShzaXplb2YoSEVBREVSXzgwMl8xMSkrVFhXSV9TSVpFKSwgVFJVRSwgRXBUb1F1ZXVlW01HTVRQSVBFSURYXSwgRkFMU0UsICBGQUxTRSk7CisJcFR4V0kgPSAoUFRYV0lfU1RSVUMpJnBBZC0+TnVsbENvbnRleHQuVHJhbnNmZXJCdWZmZXItPmZpZWxkLldpcmVsZXNzUGFja2V0W1RYSU5GT19TSVpFXTsKKwlSVE1QV3JpdGVUeFdJKHBBZCwgcFR4V0ksIEZBTFNFLCBGQUxTRSwgRkFMU0UsIEZBTFNFLCBUUlVFLCBGQUxTRSwgMCwgQlNTSURfV0NJRCwgKHNpemVvZihIRUFERVJfODAyXzExKSksCisJCTAsIDAsIChVQ0hBUilwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTUNTLCBJRlNfQkFDS09GRiwgRkFMU0UsICZwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQpOworCVJUTVBNb3ZlTWVtb3J5KCZwQWQtPk51bGxDb250ZXh0LlRyYW5zZmVyQnVmZmVyLT5maWVsZC5XaXJlbGVzc1BhY2tldFtUWFdJX1NJWkUrVFhJTkZPX1NJWkVdLCAmcEFkLT5OdWxsRnJhbWUsIHNpemVvZihIRUFERVJfODAyXzExKSk7CisJcEFkLT5OdWxsQ29udGV4dC5CdWxrT3V0U2l6ZSA9ICBUWElORk9fU0laRSArIFRYV0lfU0laRSArIHNpemVvZihwQWQtPk51bGxGcmFtZSkgKyA0OworfQorI2VuZGlmIC8vIFJUMjg3MCAvLworCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJUHJlLWJ1aWxkIGEgQkVBQ09OIGZyYW1lIGluIHRoZSBzaGFyZWQgbWVtb3J5CisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitVTE9ORyBNYWtlSWJzc0JlYWNvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlVQ0hBUiAgICAgICAgIERzTGVuID0gMSwgSWJzc0xlbiA9IDI7CisJVUNIQVIgICAgICAgICBMb2NhbEVycEllWzNdID0ge0lFX0VSUCwgMSwgMHgwNH07CisJSEVBREVSXzgwMl8xMSBCY25IZHI7CisJVVNIT1JUICAgICAgICBDYXBhYmlsaXR5SW5mbzsKKwlMQVJHRV9JTlRFR0VSIEZha2VUaW1lc3RhbXA7CisJVUxPTkcgICAgICAgICBGcmFtZUxlbiA9IDA7CisJUFRYV0lfU1RSVUMJICBwVHhXSSA9ICZwQWQtPkJlYWNvblR4V0k7CisJQ0hBUiAgICAgICAgICpwQmVhY29uRnJhbWUgPSBwQWQtPkJlYWNvbkJ1ZjsKKwlCT09MRUFOICAgICAgIFByaXZhY3k7CisJVUNIQVIgICAgICAgICBTdXBSYXRlW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXTsKKwlVQ0hBUiAgICAgICAgIFN1cFJhdGVMZW4gPSAwOworCVVDSEFSICAgICAgICAgRXh0UmF0ZVtNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFU107CisJVUNIQVIgICAgICAgICBFeHRSYXRlTGVuID0gMDsKKwlVQ0hBUiAgICAgICAgIFJTTkllID0gSUVfV1BBOworCisJaWYgKChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUIpICYmIChwQWQtPkNvbW1vbkNmZy5DaGFubmVsIDw9IDE0KSkKKwl7CisJCVN1cFJhdGVbMF0gPSAweDgyOyAvLyAxIG1icHMKKwkJU3VwUmF0ZVsxXSA9IDB4ODQ7IC8vIDIgbWJwcworCQlTdXBSYXRlWzJdID0gMHg4YjsgLy8gNS41IG1icHMKKwkJU3VwUmF0ZVszXSA9IDB4OTY7IC8vIDExIG1icHMKKwkJU3VwUmF0ZUxlbiA9IDQ7CisJCUV4dFJhdGVMZW4gPSAwOworCX0KKwllbHNlIGlmIChwQWQtPkNvbW1vbkNmZy5DaGFubmVsID4gMTQpCisJeworCQlTdXBSYXRlWzBdICA9IDB4OEM7ICAgIC8vIDYgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMsIGJhc2ljIHJhdGUKKwkJU3VwUmF0ZVsxXSAgPSAweDEyOyAgICAvLyA5IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCisJCVN1cFJhdGVbMl0gID0gMHg5ODsgICAgLy8gMTIgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMsIGJhc2ljIHJhdGUKKwkJU3VwUmF0ZVszXSAgPSAweDI0OyAgICAvLyAxOCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQlTdXBSYXRlWzRdICA9IDB4YjA7ICAgIC8vIDI0IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzLCBiYXNpYyByYXRlCisJCVN1cFJhdGVbNV0gID0gMHg0ODsgICAgLy8gMzYgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJU3VwUmF0ZVs2XSAgPSAweDYwOyAgICAvLyA0OCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQlTdXBSYXRlWzddICA9IDB4NmM7ICAgIC8vIDU0IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCisJCVN1cFJhdGVMZW4gID0gODsKKwkJRXh0UmF0ZUxlbiAgPSAwOworCisJCS8vCisJCS8vIEFsc28gVXBkYXRlIE1sbWVSYXRlICYgUnRzUmF0ZSBmb3IgRyBvbmx5ICYgQSBvbmx5CisJCS8vCisJCXBBZC0+Q29tbW9uQ2ZnLk1sbWVSYXRlID0gUkFURV82OworCQlwQWQtPkNvbW1vbkNmZy5SdHNSYXRlID0gUkFURV82OworCQlwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTU9ERSA9IE1PREVfT0ZETTsKKwkJcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1DUyA9IE9mZG1SYXRlVG9SeHdpTUNTW3BBZC0+Q29tbW9uQ2ZnLk1sbWVSYXRlXTsKKwkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1MwTWNhc3RfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX09GRE07CisJCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTME1jYXN0X1dDSURdLkhUUGh5TW9kZS5maWVsZC5NQ1MgPSBPZmRtUmF0ZVRvUnh3aU1DU1twQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZV07CisJfQorCWVsc2UKKwl7CisJCVN1cFJhdGVbMF0gPSAweDgyOyAvLyAxIG1icHMKKwkJU3VwUmF0ZVsxXSA9IDB4ODQ7IC8vIDIgbWJwcworCQlTdXBSYXRlWzJdID0gMHg4YjsgLy8gNS41IG1icHMKKwkJU3VwUmF0ZVszXSA9IDB4OTY7IC8vIDExIG1icHMKKwkJU3VwUmF0ZUxlbiA9IDQ7CisKKwkJRXh0UmF0ZVswXSAgPSAweDBDOyAgICAvLyA2IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzLAorCQlFeHRSYXRlWzFdICA9IDB4MTI7ICAgIC8vIDkgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJRXh0UmF0ZVsyXSAgPSAweDE4OyAgICAvLyAxMiBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcywKKwkJRXh0UmF0ZVszXSAgPSAweDI0OyAgICAvLyAxOCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQlFeHRSYXRlWzRdICA9IDB4MzA7ICAgIC8vIDI0IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzLAorCQlFeHRSYXRlWzVdICA9IDB4NDg7ICAgIC8vIDM2IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCisJCUV4dFJhdGVbNl0gID0gMHg2MDsgICAgLy8gNDggbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJRXh0UmF0ZVs3XSAgPSAweDZjOyAgICAvLyA1NCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQlFeHRSYXRlTGVuICA9IDg7CisJfQorCisJcEFkLT5TdGFBY3RpdmUuU3VwUmF0ZUxlbiA9IFN1cFJhdGVMZW47CisJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFBY3RpdmUuU3VwUmF0ZSwgU3VwUmF0ZSwgU3VwUmF0ZUxlbik7CisJcEFkLT5TdGFBY3RpdmUuRXh0UmF0ZUxlbiA9IEV4dFJhdGVMZW47CisJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFBY3RpdmUuRXh0UmF0ZSwgRXh0UmF0ZSwgRXh0UmF0ZUxlbik7CisKKwkvLyBjb21wb3NlIElCU1MgYmVhY29uIGZyYW1lCisJTWd0TWFjSGVhZGVySW5pdChwQWQsICZCY25IZHIsIFNVQlRZUEVfQkVBQ09OLCAwLCBCUk9BRENBU1RfQUREUiwgcEFkLT5Db21tb25DZmcuQnNzaWQpOworCVByaXZhY3kgPSAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMUVuYWJsZWQpIHx8CisJCQkgIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkgfHwKKwkJCSAgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKTsKKwlDYXBhYmlsaXR5SW5mbyA9IENBUF9HRU5FUkFURSgwLCAxLCBQcml2YWN5LCAocEFkLT5Db21tb25DZmcuVHhQcmVhbWJsZSA9PSBSdDgwMl8xMVByZWFtYmxlU2hvcnQpLCAwLCAwKTsKKworCU1ha2VPdXRnb2luZ0ZyYW1lKHBCZWFjb25GcmFtZSwgICAgICAgICAgICAgICAgJkZyYW1lTGVuLAorCQkJCQkgIHNpemVvZihIRUFERVJfODAyXzExKSwgICAgICAgICAgICZCY25IZHIsCisJCQkJCSAgVElNRVNUQU1QX0xFTiwgICAgICAgICAgICAgICAgICAgJkZha2VUaW1lc3RhbXAsCisJCQkJCSAgMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBBZC0+Q29tbW9uQ2ZnLkJlYWNvblBlcmlvZCwKKwkJCQkJICAyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQ2FwYWJpbGl0eUluZm8sCisJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlNzaWRJZSwKKwkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEFkLT5Db21tb25DZmcuU3NpZExlbiwKKwkJCQkJICBwQWQtPkNvbW1vbkNmZy5Tc2lkTGVuLCAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5Tc2lkLAorCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdXBSYXRlSWUsCisJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN1cFJhdGVMZW4sCisJCQkJCSAgU3VwUmF0ZUxlbiwgICAgICAgICAgICAgICAgICAgICAgU3VwUmF0ZSwKKwkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmRHNJZSwKKwkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmRHNMZW4sCisJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwsCisJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJklic3NJZSwKKwkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmSWJzc0xlbiwKKwkJCQkJICAyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEFkLT5TdGFBY3RpdmUuQXRpbVdpbiwKKwkJCQkJICBFTkRfT0ZfQVJHUyk7CisKKwkvLyBhZGQgRVJQX0lFIGFuZCBFWFRfUkFFIElFIG9mIGluIDgwMi4xMWcKKwlpZiAoRXh0UmF0ZUxlbikKKwl7CisJCVVMT05HCXRtcDsKKworCQlNYWtlT3V0Z29pbmdGcmFtZShwQmVhY29uRnJhbWUgKyBGcmFtZUxlbiwgICAgICAgICAmdG1wLAorCQkJCQkJICAzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NhbEVycEllLAorCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmRXh0UmF0ZUllLAorCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmRXh0UmF0ZUxlbiwKKwkJCQkJCSAgRXh0UmF0ZUxlbiwgICAgICAgICAgICAgICAgICAgICAgRXh0UmF0ZSwKKwkJCQkJCSAgRU5EX09GX0FSR1MpOworCQlGcmFtZUxlbiArPSB0bXA7CisJfQorCisJLy8gSWYgYWRob2Mgc2VjcnVpdHkgaXMgc2V0IGZvciBXUEEtTm9uZSwgYXBwZW5kIHRoZSBjaXBoZXIgc3VpdGUgSUUKKwlpZiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZSkKKwl7CisJCVVMT05HIHRtcDsKKyAgICAgICAgUlRNUE1ha2VSU05JRShwQWQsIHBBZC0+U3RhQ2ZnLkF1dGhNb2RlLCBwQWQtPlN0YUNmZy5XZXBTdGF0dXMsIEJTUzApOworCisJCU1ha2VPdXRnb2luZ0ZyYW1lKHBCZWFjb25GcmFtZSArIEZyYW1lTGVuLCAgICAgICAgCSZ0bXAsCisJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSZSU05JZSwKKwkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSZwQWQtPlN0YUNmZy5SU05JRV9MZW4sCisJCQkJCQkgIHBBZC0+U3RhQ2ZnLlJTTklFX0xlbiwgICAgICAJCXBBZC0+U3RhQ2ZnLlJTTl9JRSwKKwkJCQkJCSAgRU5EX09GX0FSR1MpOworCQlGcmFtZUxlbiArPSB0bXA7CisJfQorCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJaWYgKChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID49IFBIWV8xMUFCR05fTUlYRUQpKQorCXsKKwkJVUxPTkcgVG1wTGVuOworCQlVQ0hBUiBIdExlbiwgSHRMZW4xOworCisjaWZkZWYgUlRfQklHX0VORElBTgorCQlIVF9DQVBBQklMSVRZX0lFIEh0Q2FwYWJpbGl0eVRtcDsKKwkJQUREX0hUX0lORk9fSUUJYWRkSFRJbmZvVG1wOworCQlVU0hPUlQJYjJsVG1wLCBiMmxUbXAyOworI2VuZGlmCisKKwkJLy8gYWRkIEhUIENhcGFiaWxpdHkgSUUKKwkJSHRMZW4gPSBzaXplb2YocEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5KTsKKwkJSHRMZW4xID0gc2l6ZW9mKHBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mbyk7CisjaWZuZGVmIFJUX0JJR19FTkRJQU4KKwkJTWFrZU91dGdvaW5nRnJhbWUocEJlYWNvbkZyYW1lK0ZyYW1lTGVuLAkmVG1wTGVuLAorCQkJCQkJICAxLAkJCQkJCSZIdENhcEllLAorCQkJCQkJICAxLAkJCQkJCSZIdExlbiwKKwkJCQkJCSAgSHRMZW4sCQkJCQkmcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5LAorCQkJCQkJICAxLAkJCQkJCSZBZGRIdEluZm9JZSwKKwkJCQkJCSAgMSwJCQkJCQkmSHRMZW4xLAorCQkJCQkJICBIdExlbjEsCQkJCQkmcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLAorCQkJCQkJICBFTkRfT0ZfQVJHUyk7CisjZWxzZQorCQlOZGlzTW92ZU1lbW9yeSgmSHRDYXBhYmlsaXR5VG1wLCAmcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5LCBIdExlbik7CisJCSooVVNIT1JUICopKCZIdENhcGFiaWxpdHlUbXAuSHRDYXBJbmZvKSA9IFNXQVAxNigqKFVTSE9SVCAqKSgmSHRDYXBhYmlsaXR5VG1wLkh0Q2FwSW5mbykpOworCQkqKFVTSE9SVCAqKSgmSHRDYXBhYmlsaXR5VG1wLkV4dEh0Q2FwSW5mbykgPSBTV0FQMTYoKihVU0hPUlQgKikoJkh0Q2FwYWJpbGl0eVRtcC5FeHRIdENhcEluZm8pKTsKKworCQlOZGlzTW92ZU1lbW9yeSgmYWRkSFRJbmZvVG1wLCAmcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLCBIdExlbjEpOworCQkqKFVTSE9SVCAqKSgmYWRkSFRJbmZvVG1wLkFkZEh0SW5mbzIpID0gU1dBUDE2KCooVVNIT1JUICopKCZhZGRIVEluZm9UbXAuQWRkSHRJbmZvMikpOworCQkqKFVTSE9SVCAqKSgmYWRkSFRJbmZvVG1wLkFkZEh0SW5mbzMpID0gU1dBUDE2KCooVVNIT1JUICopKCZhZGRIVEluZm9UbXAuQWRkSHRJbmZvMykpOworCisJCU1ha2VPdXRnb2luZ0ZyYW1lKHBCZWFjb25GcmFtZStGcmFtZUxlbiwJJlRtcExlbiwKKwkJCQkJCSAgMSwJCQkJCQkmSHRDYXBJZSwKKwkJCQkJCSAgMSwJCQkJCQkmSHRMZW4sCisJCQkJCQkgIEh0TGVuLAkJCQkJJkh0Q2FwYWJpbGl0eVRtcCwKKwkJCQkJCSAgMSwJCQkJCQkmQWRkSHRJbmZvSWUsCisJCQkJCQkgIDEsCQkJCQkJJkh0TGVuMSwKKwkJCQkJCSAgSHRMZW4xLAkJCQkJJmFkZEhUSW5mb1RtcCwKKwkJCQkJCSAgRU5EX09GX0FSR1MpOworI2VuZGlmCisJCUZyYW1lTGVuICs9IFRtcExlbjsKKwl9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwkvL2JlYWNvbiB1c2UgcmVzZXJ2ZWQgV0NJRCAweGZmCisgICAgaWYgKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPiAxNCkKKyAgICB7CisJCVJUTVBXcml0ZVR4V0kocEFkLCBwVHhXSSwgRkFMU0UsIEZBTFNFLCAgVFJVRSwgRkFMU0UsIEZBTFNFLCBUUlVFLCAwLCAweGZmLCBGcmFtZUxlbiwKKwkJCVBJRF9NR01ULCBQSURfQkVBQ09OLCBSQVRFXzEsIElGU19IVFRYT1AsIEZBTFNFLCAmcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0KTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLy8gU2V0IHRvIHVzZSAxTWJwcyBmb3IgQWRob2MgYmVhY29uLgorCQlIVFRSQU5TTUlUX1NFVFRJTkcgVHJhbnNtaXQ7CisgICAgICAgIFRyYW5zbWl0LndvcmQgPSAwOworICAgICAgICBSVE1QV3JpdGVUeFdJKHBBZCwgcFR4V0ksIEZBTFNFLCBGQUxTRSwgIFRSVUUsIEZBTFNFLCBGQUxTRSwgVFJVRSwgMCwgMHhmZiwgRnJhbWVMZW4sCisgICAgCQlQSURfTUdNVCwgUElEX0JFQUNPTiwgUkFURV8xLCBJRlNfSFRUWE9QLCBGQUxTRSwgJlRyYW5zbWl0KTsKKyAgICB9CisKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJUlRNUEZyYW1lRW5kaWFuQ2hhbmdlKHBBZCwgcEJlYWNvbkZyYW1lLCBESVJfV1JJVEUsIEZBTFNFKTsKKwlSVE1QV0lFbmRpYW5DaGFuZ2UoKFBVQ0hBUilwVHhXSSwgVFlQRV9UWFdJKTsKKyNlbmRpZgorCisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTWFrZUlic3NCZWFjb24gKGxlbj0lbGQpLCBTdXBSYXRlTGVuPSVkLCBFeHRSYXRlTGVuPSVkLCBDaGFubmVsPSVkLCBQaHlNb2RlPSVkXG4iLAorCQkJCQlGcmFtZUxlbiwgU3VwUmF0ZUxlbiwgRXh0UmF0ZUxlbiwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCwgcEFkLT5Db21tb25DZmcuUGh5TW9kZSkpOworCXJldHVybiBGcmFtZUxlbjsKK30KKworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3N0YS9kbHMuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvc3RhL2Rscy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2YmZiYzMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3N0YS9kbHMuYwpAQCAtMCwwICsxLDIyMTAgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgTW9kdWxlIE5hbWU6CisgICAgZGxzLmMKKworICAgIEFic3RyYWN0OgorICAgIEhhbmRsZSBXTU0tRExTIHN0YXRlIG1hY2hpbmUKKworICAgIFJldmlzaW9uIEhpc3Rvcnk6CisgICAgV2hvICAgICAgICAgV2hlbiAgICAgICAgICBXaGF0CisgICAgLS0tLS0tLS0gICAgLS0tLS0tLS0tLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgUm9yeSBDaGVuICAgMDItMTQtMjAwNgorCUFydmluIFRhaQkwNi0wMy0yMDA4CSAgTW9kaWZpZWQgZm9yIFJUMjh4eAorICovCisKKyNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBkbHMgc3RhdGUgbWFjaGluZSBpbml0LCBpbmNsdWRpbmcgc3RhdGUgdHJhbnNpdGlvbiBhbmQgdGltZXIgaW5pdAorICAgIFBhcmFtZXRlcnM6CisgICAgICAgIFNtIC0gcG9pbnRlciB0byB0aGUgZGxzIHN0YXRlIG1hY2hpbmUKKyAgICBOb3RlOgorICAgICAgICBUaGUgc3RhdGUgbWFjaGluZSBsb29rcyBsaWtlIHRoaXMKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIERMU19JRExFCisgICAgTVQyX01MTUVfRExTX1JFUVVFU1QgICBNbG1lRGxzUmVxQWN0aW9uCisgICAgTVQyX1BFRVJfRExTX1JFUVVFU1QgICBQZWVyRGxzUmVxQWN0aW9uCisgICAgTVQyX1BFRVJfRExTX1JFU1BPTlNFICBQZWVyRGxzUnNwQWN0aW9uCisgICAgTVQyX01MTUVfRExTX1RFQVJET1dOICBNbG1lVGVhckRvd25BY3Rpb24KKyAgICBNVDJfUEVFUl9ETFNfVEVBUkRPV04gIFBlZXJUZWFyRG93bkFjdGlvbgorCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK3ZvaWQgRGxzU3RhdGVNYWNoaW5lSW5pdCgKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBTVEFURV9NQUNISU5FICpTbSwKKyAgICBPVVQgU1RBVEVfTUFDSElORV9GVU5DIFRyYW5zW10pCit7CisJVUNIQVIJaTsKKworICAgIFN0YXRlTWFjaGluZUluaXQoU20sIChTVEFURV9NQUNISU5FX0ZVTkMqKVRyYW5zLCBNQVhfRExTX1NUQVRFLCBNQVhfRExTX01TRywgKFNUQVRFX01BQ0hJTkVfRlVOQylEcm9wLCBETFNfSURMRSwgRExTX01BQ0hJTkVfQkFTRSk7CisKKyAgICAvLyB0aGUgZmlyc3QgY29sdW1uCisgICAgU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBETFNfSURMRSwgTVQyX01MTUVfRExTX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylNbG1lRGxzUmVxQWN0aW9uKTsKKyAgICBTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIERMU19JRExFLCBNVDJfUEVFUl9ETFNfUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKVBlZXJEbHNSZXFBY3Rpb24pOworICAgIFN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgRExTX0lETEUsIE1UMl9QRUVSX0RMU19SU1AsIChTVEFURV9NQUNISU5FX0ZVTkMpUGVlckRsc1JzcEFjdGlvbik7CisgICAgU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBETFNfSURMRSwgTVQyX01MTUVfRExTX1RFQVJfRE9XTiwgKFNUQVRFX01BQ0hJTkVfRlVOQylNbG1lRGxzVGVhckRvd25BY3Rpb24pOworICAgIFN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgRExTX0lETEUsIE1UMl9QRUVSX0RMU19URUFSX0RPV04sIChTVEFURV9NQUNISU5FX0ZVTkMpUGVlckRsc1RlYXJEb3duQWN0aW9uKTsKKworCWZvciAoaT0wOyBpPE1BWF9OVU1fT0ZfRExTX0VOVFJZOyBpKyspCisJeworCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5wQWQgPSBwQWQ7CisJCVJUTVBJbml0VGltZXIocEFkLCAmcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVGltZXIsIEdFVF9USU1FUl9GVU5DVElPTihEbHNUaW1lb3V0QWN0aW9uKSwgcEFkLCBGQUxTRSk7CisJfQorfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgTWxtZURsc1JlcUFjdGlvbigKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisJUFVDSEFSCQkJcE91dEJ1ZmZlciA9IE5VTEw7CisJTkRJU19TVEFUVVMJCU5TdGF0dXM7CisJVUxPTkcJCQlGcmFtZUxlbiA9IDA7CisJSEVBREVSXzgwMl8xMQlEbHNSZXFIZHI7CisJUFJUXzgwMl8xMV9ETFMJcERMUyA9IE5VTEw7CisJVUNIQVIJCQlDYXRlZ29yeSA9IENBVEVHT1JZX0RMUzsKKwlVQ0hBUgkJCUFjdGlvbiA9IEFDVElPTl9ETFNfUkVRVUVTVDsKKwlVTE9ORwkJCXRtcDsKKwlVU0hPUlQJCQlyZWFzb247CisJVUxPTkcJCQlUaW1lb3V0OworCUJPT0xFQU4JCQlUaW1lckNhbmNlbGxlZDsKKworCWlmKCFNbG1lRGxzUmVxU2FuaXR5KHBBZCwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4sICZwRExTLCAmcmVhc29uKSkKKwkJcmV0dXJuOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJETFMgLSBNbG1lRGxzUmVxQWN0aW9uKCkgXG4iKSk7CisKKwlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOyAgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQorCWlmIChOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIkRMUyAtIE1sbWVEbHNSZXFBY3Rpb24oKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkIFxuIikpOworCQlyZXR1cm47CisJfQorCisJQWN0SGVhZGVySW5pdChwQWQsICZEbHNSZXFIZHIsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisKKwkvLyBCdWlsZCBiYXNpYyBmcmFtZSBmaXJzdAorCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsCQkJCSZGcmFtZUxlbiwKKwkJCQkJc2l6ZW9mKEhFQURFUl84MDJfMTEpLAkJJkRsc1JlcUhkciwKKwkJCQkJMSwJCQkJCQkJJkNhdGVnb3J5LAorCQkJCQkxLAkJCQkJCQkmQWN0aW9uLAorCQkJCQk2LAkJCQkJCQkmcERMUy0+TWFjQWRkciwKKwkJCQkJNiwJCQkJCQkJcEFkLT5DdXJyZW50QWRkcmVzcywKKwkJCQkJMiwJCQkJCQkJJnBBZC0+U3RhQWN0aXZlLkNhcGFiaWxpdHlJbmZvLAorCQkJCQkyLAkJCQkJCQkmcERMUy0+VGltZU91dCwKKwkJCQkJMSwJCQkJCQkJJlN1cFJhdGVJZSwKKwkJCQkJMSwJCQkJCQkJJnBBZC0+TWxtZUF1eC5TdXBSYXRlTGVuLAorCQkJCQlwQWQtPk1sbWVBdXguU3VwUmF0ZUxlbiwJcEFkLT5NbG1lQXV4LlN1cFJhdGUsCisJCQkJCUVORF9PRl9BUkdTKTsKKworCWlmIChwQWQtPk1sbWVBdXguRXh0UmF0ZUxlbiAhPSAwKQorCXsKKwkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLAkmdG1wLAorCQkJCQkJICAxLAkJCQkJCSZFeHRSYXRlSWUsCisJCQkJCQkgIDEsCQkJCQkJJnBBZC0+TWxtZUF1eC5FeHRSYXRlTGVuLAorCQkJCQkJICBwQWQtPk1sbWVBdXguRXh0UmF0ZUxlbiwJcEFkLT5NbG1lQXV4LkV4dFJhdGUsCisJCQkJCQkgIEVORF9PRl9BUkdTKTsKKwkJRnJhbWVMZW4gKz0gdG1wOworCX0KKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCWlmICgocEFkLT5Db21tb25DZmcuUGh5TW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEKSkKKwl7CisJCVVDSEFSIEh0TGVuOworCisjaWZkZWYgUlRfQklHX0VORElBTgorCQlIVF9DQVBBQklMSVRZX0lFIEh0Q2FwYWJpbGl0eVRtcDsKKyNlbmRpZgorCisJCS8vIGFkZCBIVCBDYXBhYmlsaXR5IElFCisJCUh0TGVuID0gc2l6ZW9mKEhUX0NBUEFCSUxJVFlfSUUpOworI2lmbmRlZiBSVF9CSUdfRU5ESUFOCisJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwJJnRtcCwKKwkJCQkJCQkxLAkJCQkJCSZIdENhcEllLAorCQkJCQkJCTEsCQkJCQkJJkh0TGVuLAorCQkJCQkJCUh0TGVuLAkJCQkJJnBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eSwKKwkJCQkJCQlFTkRfT0ZfQVJHUyk7CisjZWxzZQorCQlOZGlzTW92ZU1lbW9yeSgmSHRDYXBhYmlsaXR5VG1wLCAmcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5LCBIdExlbik7CisJCQkJCQkJKihVU0hPUlQgKikoJkh0Q2FwYWJpbGl0eVRtcC5IdENhcEluZm8pID0gU1dBUDE2KCooVVNIT1JUICopKCZIdENhcGFiaWxpdHlUbXAuSHRDYXBJbmZvKSk7CisJCQkJCQkJKihVU0hPUlQgKikoJkh0Q2FwYWJpbGl0eVRtcC5FeHRIdENhcEluZm8pID0gU1dBUDE2KCooVVNIT1JUICopKCZIdENhcGFiaWxpdHlUbXAuRXh0SHRDYXBJbmZvKSk7CisKKwkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLAkmdG1wLAorCQkJCQkJCTEsCQkJCQkJJkh0Q2FwSWUsCisJCQkJCQkJMSwJCQkJCQkmSHRMZW4sCisJCQkJCQkJSHRMZW4sCQkJCQkmSHRDYXBhYmlsaXR5VG1wLAorCQkJCQkJCUVORF9PRl9BUkdTKTsKKyNlbmRpZgorCQlGcmFtZUxlbiA9IEZyYW1lTGVuICsgdG1wOworCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCVJUTVBDYW5jZWxUaW1lcigmcERMUy0+VGltZXIsICZUaW1lckNhbmNlbGxlZCk7CisJVGltZW91dCA9IERMU19USU1FT1VUOworCVJUTVBTZXRUaW1lcigmcERMUy0+VGltZXIsIFRpbWVvdXQpOworCisJTWluaXBvcnRNTVJlcXVlc3QocEFkLCBRSURfQUNfQkUsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKKwlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgUGVlckRsc1JlcUFjdGlvbigKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisJUFVDSEFSCQkJcE91dEJ1ZmZlciA9IE5VTEw7CisJTkRJU19TVEFUVVMJCU5TdGF0dXM7CisJVUxPTkcJCQlGcmFtZUxlbiA9IDA7CisJVVNIT1JUCQkJU3RhdHVzQ29kZSA9IE1MTUVfU1VDQ0VTUzsKKwlIRUFERVJfODAyXzExCURsc1JzcEhkcjsKKwlVQ0hBUgkJCUNhdGVnb3J5ID0gQ0FURUdPUllfRExTOworCVVDSEFSCQkJQWN0aW9uID0gQUNUSU9OX0RMU19SRVNQT05TRTsKKwlVTE9ORwkJCXRtcDsKKwlVU0hPUlQJCQlDYXBhYmlsaXR5SW5mbzsKKwlVQ0hBUgkJCURBW01BQ19BRERSX0xFTl0sIFNBW01BQ19BRERSX0xFTl07CisJVVNIT1JUCQkJRExTVGltZU91dDsKKwlTSE9SVAkJCWk7CisJVUxPTkcJCQlUaW1lb3V0OworCUJPT0xFQU4JCQlUaW1lckNhbmNlbGxlZDsKKwlQUlRfODAyXzExX0RMUwlwRExTID0gTlVMTDsKKwlVQ0hBUgkJCU1heFN1cHBvcnRlZFJhdGVJbjUwMEticHMgPSAwOworICAgIFVDSEFSCQkJU3VwcG9ydGVkUmF0ZXNMZW47CisgICAgVUNIQVIJCQlTdXBwb3J0ZWRSYXRlc1tNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFU107CisJVUNIQVIJCQlIdENhcGFiaWxpdHlMZW47CisJSFRfQ0FQQUJJTElUWV9JRQlIdENhcGFiaWxpdHk7CisKKwlpZiAoIVBlZXJEbHNSZXFTYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbiwgREEsIFNBLCAmQ2FwYWJpbGl0eUluZm8sICZETFNUaW1lT3V0LAorCQkJCQkJCSZTdXBwb3J0ZWRSYXRlc0xlbiwgJlN1cHBvcnRlZFJhdGVzWzBdLCAmSHRDYXBhYmlsaXR5TGVuLCAmSHRDYXBhYmlsaXR5KSkKKwkJcmV0dXJuOworCisgICAgLy8gc3VwcG9ydGVkIHJhdGVzIGFycmF5IG1heSBub3QgYmUgc29ydGVkLiBzb3J0IGl0IGFuZCBmaW5kIHRoZSBtYXhpbXVtIHJhdGUKKyAgICBmb3IgKGkgPSAwOyBpIDwgU3VwcG9ydGVkUmF0ZXNMZW47IGkrKykKKyAgICB7CisgICAgICAgIGlmIChNYXhTdXBwb3J0ZWRSYXRlSW41MDBLYnBzIDwgKFN1cHBvcnRlZFJhdGVzW2ldICYgMHg3ZikpCisgICAgICAgICAgICBNYXhTdXBwb3J0ZWRSYXRlSW41MDBLYnBzID0gU3VwcG9ydGVkUmF0ZXNbaV0gJiAweDdmOworICAgIH0KKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiRExTIC0gUGVlckRsc1JlcUFjdGlvbigpIGZyb20gJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsIFNBWzBdLCBTQVsxXSwgU0FbMl0sIFNBWzNdLCBTQVs0XSwgU0FbNV0pKTsKKworCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5CisJaWYgKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiRExTIC0gUGVlckRsc1JlcUFjdGlvbigpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWQgXG4iKSk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoIUlORlJBX09OKHBBZCkpCisJeworCQlTdGF0dXNDb2RlID0gTUxNRV9SRVFVRVNUX0RFQ0xJTkVEOworCX0KKwllbHNlIGlmICghcEFkLT5Db21tb25DZmcuYldtbUNhcGFibGUpCisJeworCQlTdGF0dXNDb2RlID0gTUxNRV9ERVNUX1NUQV9JU19OT1RfQV9RU1RBOworCX0KKwllbHNlIGlmICghcEFkLT5Db21tb25DZmcuYkRMU0NhcGFibGUpCisJeworCQlTdGF0dXNDb2RlID0gTUxNRV9SRVFVRVNUX0RFQ0xJTkVEOworCX0KKwllbHNlCisJeworCQkvLyBmaW5kIHRhYmxlIHRvIHVwZGF0ZSBwYXJhbWV0ZXJzCisJCWZvciAoaSA9IChNQVhfTlVNX09GX0RMU19FTlRSWS0xKTsgaSA+PSAwOyBpLS0pCisJCXsKKwkJCWlmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZCAmJiBNQUNfQUREUl9FUVVBTChTQSwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcikpCisJCQl7CisJCQkJaWYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKKwkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID0gRExTX1dBSVRfS0VZOworCQkJCWVsc2UKKwkJCQl7CisJCQkJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVGltZXIsICZUaW1lckNhbmNlbGxlZCk7CisJCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9IERMU19GSU5JU0g7CisJCQkJfQorCisJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU2VxdWVuY2UgPSAwOworCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlRpbWVPdXQgPSBETFNUaW1lT3V0OworCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLkNvdW50RG93blRpbWVyID0gRExTVGltZU91dDsKKwkJCQlpZiAoSHRDYXBhYmlsaXR5TGVuICE9IDApCisJCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLmJIVENhcCA9IFRSVUU7CisJCQkJZWxzZQorCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5iSFRDYXAgPSBGQUxTRTsKKwkJCQlwRExTID0gJnBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJLy8gY2FuIG5vdCBmaW5kIGluIHRhYmxlLCBjcmVhdGUgYSBuZXcgb25lCisJCWlmIChpIDwgMCkKKwkJeworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJETFMgLSBQZWVyRGxzUmVxQWN0aW9uKCkgY2FuIG5vdCBmaW5kIHNhbWUgZW50cnkgXG4iKSk7CisJCQlmb3IgKGk9KE1BWF9OVU1fT0ZfRExTX0VOVFJZIC0gMSk7IGkgPj0gTUFYX05VTV9PRl9JTklUX0RMU19FTlRSWTsgaS0tKQorCQkJeworCQkJCWlmICghcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQpCisJCQkJeworCQkJCQlNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeTsKKwkJCQkJVUNIQVIgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMTE7CisKKwkJCQkJaWYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKKwkJCQkJeworCQkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID0gRExTX1dBSVRfS0VZOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5UaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKKwkJCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9IERMU19GSU5JU0g7CisJCQkJCX0KKworCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TZXF1ZW5jZSA9IDA7CisJCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkID0gVFJVRTsKKwkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVGltZU91dCA9IERMU1RpbWVPdXQ7CisJCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLkNvdW50RG93blRpbWVyID0gRExTVGltZU91dDsKKwkJCQkJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkciwgU0EsIE1BQ19BRERSX0xFTik7CisJCQkJCWlmIChIdENhcGFiaWxpdHlMZW4gIT0gMCkKKwkJCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLmJIVENhcCA9IFRSVUU7CisJCQkJCWVsc2UKKwkJCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLmJIVENhcCA9IEZBTFNFOworCQkJCQlwRExTID0gJnBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldOworCQkJCQlwRW50cnkgPSBNYWNUYWJsZUluc2VydERsc0VudHJ5KHBBZCwgU0EsIGkpOworCisJCQkJCXN3aXRjaCAoTWF4U3VwcG9ydGVkUmF0ZUluNTAwS2JwcykKKwkJCQkJeworCQkJCQkJY2FzZSAxMDg6IE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzU0OyAgIGJyZWFrOworCQkJCQkJY2FzZSA5NjogIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzQ4OyAgIGJyZWFrOworCQkJCQkJY2FzZSA3MjogIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzM2OyAgIGJyZWFrOworCQkJCQkJY2FzZSA0ODogIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzI0OyAgIGJyZWFrOworCQkJCQkJY2FzZSAzNjogIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzE4OyAgIGJyZWFrOworCQkJCQkJY2FzZSAyNDogIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzEyOyAgIGJyZWFrOworCQkJCQkJY2FzZSAxODogIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzk7ICAgIGJyZWFrOworCQkJCQkJY2FzZSAxMjogIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzY7ICAgIGJyZWFrOworCQkJCQkJY2FzZSAyMjogIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzExOyAgIGJyZWFrOworCQkJCQkJY2FzZSAxMTogIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzVfNTsgIGJyZWFrOworCQkJCQkJY2FzZSA0OiAgIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzI7ICAgIGJyZWFrOworCQkJCQkJY2FzZSAyOiAgIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzE7ICAgIGJyZWFrOworCQkJCQkJZGVmYXVsdDogIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzExOyAgIGJyZWFrOworCQkJCQl9CisKKwkJCQkJcEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlID0gbWluKHBBZC0+Q29tbW9uQ2ZnLk1heFR4UmF0ZSwgTWF4U3VwcG9ydGVkUmF0ZSk7CisKKwkJCQkJaWYgKHBFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZSA8IFJBVEVfRklSU1RfT0ZETV9SQVRFKQorCQkJCQl7CisJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9DQ0s7CisJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NQ1MgPSBwRW50cnktPk1heFN1cHBvcnRlZFJhdGU7CisJCQkJCQlwRW50cnktPk1pbkhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9DQ0s7CisJCQkJCQlwRW50cnktPk1pbkhUUGh5TW9kZS5maWVsZC5NQ1MgPSBwRW50cnktPk1heFN1cHBvcnRlZFJhdGU7CisJCQkJCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9DQ0s7CisJCQkJCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NQ1MgPSBwRW50cnktPk1heFN1cHBvcnRlZFJhdGU7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9PRkRNOworCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTUNTID0gT2ZkbVJhdGVUb1J4d2lNQ1NbcEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlXTsKKwkJCQkJCXBFbnRyeS0+TWluSFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX09GRE07CisJCQkJCQlwRW50cnktPk1pbkhUUGh5TW9kZS5maWVsZC5NQ1MgPSBPZmRtUmF0ZVRvUnh3aU1DU1twRW50cnktPk1heFN1cHBvcnRlZFJhdGVdOworCQkJCQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfT0ZETTsKKwkJCQkJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1DUyA9IE9mZG1SYXRlVG9SeHdpTUNTW3BFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZV07CisJCQkJCX0KKworCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5CVyA9IEJXXzIwOworCQkJCQlwRW50cnktPk1pbkhUUGh5TW9kZS5maWVsZC5CVyA9IEJXXzIwOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQkJCXBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFswXSA9IDA7CisJCQkJCXBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFsxXSA9IDA7CisKKwkJCQkJLy8gSWYgdGhpcyBFbnRyeSBzdXBwb3J0cyA4MDIuMTFuLCB1cGdyYWRlIHRvIEhUIHJhdGUuCisJCQkJCWlmICgoSHRDYXBhYmlsaXR5TGVuICE9IDApICYmIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID49IFBIWV8xMUFCR05fTUlYRUQpKQorCQkJCQl7CisJCQkJCQlVQ0hBUglqLCBiaXRtYXNrOyAvL2ssYml0bWFzazsKKwkJCQkJCUNIQVIgICAgaWk7CisKKwkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX09GRiwgKCJETFMgLSBQZWVyRGxzUmVxQWN0aW9uKCkgUmVjZWl2ZSBQZWVyIEhUIENhcGFibGUgU1RBIGZyb20gJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisJCQkJCQkJCQlTQVswXSwgU0FbMV0sIFNBWzJdLCBTQVszXSwgU0FbNF0sIFNBWzVdKSk7CisKKwkJCQkJCWlmICgoSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5HRikgJiYgKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5HRikpCisJCQkJCQl7CisJCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfSFRHUkVFTkZJRUxEOworCQkJCQkJfQorCQkJCQkJZWxzZQorCQkJCQkJeworCQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX0hUTUlYOworCQkJCQkJCXBBZC0+TWFjVGFiLmZBbnlTdGF0aW9uTm9uR0YgPSBUUlVFOworCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mby5BZGRIdEluZm8yLk5vbkdmUHJlc2VudCA9IDE7CisJCQkJCQl9CisKKwkJCQkJCWlmICgoSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5DaGFubmVsV2lkdGgpICYmIChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQ2hhbm5lbFdpZHRoKSkKKwkJCQkJCXsKKwkJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5CVz0gQldfNDA7CisJCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuU2hvcnRHSSA9ICgocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LlNob3J0R0lmb3I0MCkmKEh0Q2FwYWJpbGl0eS5IdENhcEluZm8uU2hvcnRHSWZvcjQwKSk7CisJCQkJCQl9CisJCQkJCQllbHNlCisJCQkJCQl7CisJCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuQlcgPSBCV18yMDsKKwkJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5TaG9ydEdJID0gKChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuU2hvcnRHSWZvcjIwKSYoSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5TaG9ydEdJZm9yMjApKTsKKwkJCQkJCQlwQWQtPk1hY1RhYi5mQW55U3RhdGlvbjIwT25seSA9IFRSVUU7CisJCQkJCQl9CisKKwkJCQkJCS8vIGZpbmQgbWF4IGZpeGVkIHJhdGUKKwkJCQkJCWZvciAoaWk9MTU7IGlpPj0wOyBpaS0tKQorCQkJCQkJeworCQkJCQkJCWogPSBpaS84OworCQkJCQkJCWJpdG1hc2sgPSAoMTw8KGlpLShqKjgpKSk7CisJCQkJCQkJaWYgKCAocEFkLT5TdGFDZmcuRGVzaXJlZEh0UGh5SW5mby5NQ1NTZXRbal0mYml0bWFzaykgJiYgKEh0Q2FwYWJpbGl0eS5NQ1NTZXRbal0mYml0bWFzaykpCisJCQkJCQkJeworCQkJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NQ1MgPSBpaTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJfQorCQkJCQkJCWlmIChpaT09MCkKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisKKworCQkJCQkJaWYgKHBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTICE9IE1DU19BVVRPKQorCQkJCQkJeworCisJCQkJCQkJcHJpbnRrKCJAQEAgcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9ICVkXG4iLAorCQkJCQkJCQlwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyk7CisJCQkJCQkJaWYgKHBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID09IDMyKQorCQkJCQkJCXsKKwkJCQkJCQkJLy8gRml4IE1DUyBhcyBIVCBEdXBsaWNhdGVkIE1vZGUKKwkJCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuQlcgPSAxOworCQkJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9IVE1JWDsKKwkJCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuU1RCQyA9IDA7CisJCQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLlNob3J0R0kgPSAwOworCQkJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NQ1MgPSAzMjsKKwkJCQkJCQl9CisJCQkJCQkJZWxzZSBpZiAocEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTUNTID4gcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1DUykKKwkJCQkJCQl7CisJCQkJCQkJCS8vIFNUQSBzdXBwb3J0cyBmaXhlZCBNQ1MKKwkJCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTUNTID0gcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1DUzsKKwkJCQkJCQl9CisJCQkJCQl9CisKKwkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLlNUQkMgPSAoSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5SeFNUQkMgJiAocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LlR4U1RCQykpOworCQkJCQkJcEVudHJ5LT5NcGR1RGVuc2l0eSA9IEh0Q2FwYWJpbGl0eS5IdENhcFBhcm0uTXBkdURlbnNpdHk7CisJCQkJCQlwRW50cnktPk1heFJBbXBkdUZhY3RvciA9IEh0Q2FwYWJpbGl0eS5IdENhcFBhcm0uTWF4UkFtcGR1RmFjdG9yOworCQkJCQkJcEVudHJ5LT5NbXBzTW9kZSA9IChVQ0hBUilIdENhcGFiaWxpdHkuSHRDYXBJbmZvLk1pbW9QczsKKwkJCQkJCXBFbnRyeS0+QU1zZHVTaXplID0gKFVDSEFSKUh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQU1zZHVTaXplOworCQkJCQkJcEVudHJ5LT5IVFBoeU1vZGUud29yZCA9IHBFbnRyeS0+TWF4SFRQaHlNb2RlLndvcmQ7CisKKwkJCQkJCWlmIChIdENhcGFiaWxpdHkuSHRDYXBJbmZvLlNob3J0R0lmb3IyMCkKKwkJCQkJCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfU0dJMjBfQ0FQQUJMRSk7CisJCQkJCQlpZiAoSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5TaG9ydEdJZm9yNDApCisJCQkJCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX1NHSTQwX0NBUEFCTEUpOworCQkJCQkJaWYgKEh0Q2FwYWJpbGl0eS5IdENhcEluZm8uVHhTVEJDKQorCQkJCQkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19UeFNUQkNfQ0FQQUJMRSk7CisJCQkJCQlpZiAoSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5SeFNUQkMpCisJCQkJCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX1J4U1RCQ19DQVBBQkxFKTsKKwkJCQkJCWlmIChIdENhcGFiaWxpdHkuRXh0SHRDYXBJbmZvLlBsdXNIVEMpCisJCQkJCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX0hUQ19DQVBBQkxFKTsKKwkJCQkJCWlmIChwQWQtPkNvbW1vbkNmZy5iUmRnICYmIEh0Q2FwYWJpbGl0eS5FeHRIdENhcEluZm8uUkRHU3VwcG9ydCkKKwkJCQkJCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfUkRHX0NBUEFCTEUpOworCQkJCQkJaWYgKEh0Q2FwYWJpbGl0eS5FeHRIdENhcEluZm8uTUNTRmVlZGJhY2sgPT0gMHgwMykKKwkJCQkJCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfTUNTRkVFREJBQ0tfQ0FQQUJMRSk7CisKKwkJCQkJCU5kaXNNb3ZlTWVtb3J5KCZwRW50cnktPkhUQ2FwYWJpbGl0eSwgJkh0Q2FwYWJpbGl0eSwgc2l6ZW9mKEhUX0NBUEFCSUxJVFlfSUUpKTsKKwkJCQkJfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJCQkJCXBFbnRyeS0+SFRQaHlNb2RlLndvcmQgPSBwRW50cnktPk1heEhUUGh5TW9kZS53b3JkOworCQkJCQlwRW50cnktPkN1cnJUeFJhdGUgPSBwRW50cnktPk1heFN1cHBvcnRlZFJhdGU7CisJCQkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19XTU1fQ0FQQUJMRSk7CisKKwkJCQkJaWYgKHBBZC0+U3RhQ2ZnLmJBdXRvVHhSYXRlU3dpdGNoID09IFRSVUUpCisJCQkJCXsKKwkJCQkJCVBVQ0hBUiBwVGFibGU7CisJCQkJCQlVQ0hBUiBUYWJsZVNpemUgPSAwOworCisJCQkJCQlNbG1lU2VsZWN0VHhSYXRlVGFibGUocEFkLCBwRW50cnksICZwVGFibGUsICZUYWJsZVNpemUsICZwRW50cnktPkN1cnJUeFJhdGVJbmRleCk7CisJCQkJCQlwRW50cnktPmJBdXRvVHhSYXRlU3dpdGNoID0gVFJVRTsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1PREUJPSBwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTU9ERTsKKwkJCQkJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1DUwk9IHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NQ1M7CisJCQkJCQlwRW50cnktPmJBdXRvVHhSYXRlU3dpdGNoID0gRkFMU0U7CisKKwkJCQkJCVJUTVBVcGRhdGVMZWdhY3lUeFNldHRpbmcoKFVDSEFSKXBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuRml4ZWRUeE1vZGUsIHBFbnRyeSk7CisJCQkJCX0KKwkJCQkJcEVudHJ5LT5SYXRlTGVuID0gU3VwcG9ydGVkUmF0ZXNMZW47CisKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisJCVN0YXR1c0NvZGUgPSBNTE1FX1NVQ0NFU1M7CisKKwkJLy8gY2FuIG5vdCBmaW5kIGluIHRhYmxlLCBjcmVhdGUgYSBuZXcgb25lCisJCWlmIChpIDwgMCkKKwkJeworCQkJU3RhdHVzQ29kZSA9IE1MTUVfUU9TX1VOU1BFQ0lGWTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiRExTIC0gUGVlckRsc1JlcUFjdGlvbigpIERMU0VudHJ5IHRhYmxlIGZ1bGwob25seSBjYW4gc3VwcG9ydCAlZCBETFMgc2Vzc2lvbikgXG4iLCBNQVhfTlVNX09GX0RMU19FTlRSWSAtIE1BWF9OVU1fT0ZfSU5JVF9ETFNfRU5UUlkpKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiRExTIC0gUGVlckRsc1JlcUFjdGlvbigpIHVzZSBlbnRyeSglZCkgJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisJCQkJaSwgU0FbMF0sIFNBWzFdLCBTQVsyXSwgU0FbM10sIFNBWzRdLCBTQVs1XSkpOworCQl9CisJfQorCisJQWN0SGVhZGVySW5pdChwQWQsICZEbHNSc3BIZHIsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisKKwkvLyBCdWlsZCBiYXNpYyBmcmFtZSBmaXJzdAorCWlmIChTdGF0dXNDb2RlID09IE1MTUVfU1VDQ0VTUykKKwl7CisJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsCQkJCSZGcmFtZUxlbiwKKwkJCQkJCXNpemVvZihIRUFERVJfODAyXzExKSwJCSZEbHNSc3BIZHIsCisJCQkJCQkxLAkJCQkJCQkmQ2F0ZWdvcnksCisJCQkJCQkxLAkJCQkJCQkmQWN0aW9uLAorCQkJCQkJMiwJCQkJCQkJJlN0YXR1c0NvZGUsCisJCQkJCQk2LAkJCQkJCQlTQSwKKwkJCQkJCTYsCQkJCQkJCXBBZC0+Q3VycmVudEFkZHJlc3MsCisJCQkJCQkyLAkJCQkJCQkmcEFkLT5TdGFBY3RpdmUuQ2FwYWJpbGl0eUluZm8sCisJCQkJCQkxLAkJCQkJCQkmU3VwUmF0ZUllLAorCQkJCQkJMSwJCQkJCQkJJnBBZC0+TWxtZUF1eC5TdXBSYXRlTGVuLAorCQkJCQkJcEFkLT5NbG1lQXV4LlN1cFJhdGVMZW4sCXBBZC0+TWxtZUF1eC5TdXBSYXRlLAorCQkJCQkJRU5EX09GX0FSR1MpOworCisJCWlmIChwQWQtPk1sbWVBdXguRXh0UmF0ZUxlbiAhPSAwKQorCQl7CisJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sCSZ0bXAsCisJCQkJCQkJICAxLAkJCQkJCSZFeHRSYXRlSWUsCisJCQkJCQkJICAxLAkJCQkJCSZwQWQtPk1sbWVBdXguRXh0UmF0ZUxlbiwKKwkJCQkJCQkgIHBBZC0+TWxtZUF1eC5FeHRSYXRlTGVuLCAJcEFkLT5NbG1lQXV4LkV4dFJhdGUsCisJCQkJCQkJICBFTkRfT0ZfQVJHUyk7CisJCQlGcmFtZUxlbiArPSB0bXA7CisJCX0KKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCkpCisJCXsKKwkJCVVDSEFSIEh0TGVuOworCisjaWZkZWYgUlRfQklHX0VORElBTgorCQkJSFRfQ0FQQUJJTElUWV9JRSBIdENhcGFiaWxpdHlUbXA7CisjZW5kaWYKKworCQkJLy8gYWRkIEhUIENhcGFiaWxpdHkgSUUKKwkJCUh0TGVuID0gc2l6ZW9mKEhUX0NBUEFCSUxJVFlfSUUpOworI2lmbmRlZiBSVF9CSUdfRU5ESUFOCisJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sCSZ0bXAsCisJCQkJCQkJCTEsCQkJCQkJJkh0Q2FwSWUsCisJCQkJCQkJCTEsCQkJCQkJJkh0TGVuLAorCQkJCQkJCQlIdExlbiwJCQkJCSZwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHksCisJCQkJCQkJCUVORF9PRl9BUkdTKTsKKyNlbHNlCisJCQlOZGlzTW92ZU1lbW9yeSgmSHRDYXBhYmlsaXR5VG1wLCAmcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5LCBIdExlbik7CisJCQkJCQkJCSooVVNIT1JUICopKCZIdENhcGFiaWxpdHlUbXAuSHRDYXBJbmZvKSA9IFNXQVAxNigqKFVTSE9SVCAqKSgmSHRDYXBhYmlsaXR5VG1wLkh0Q2FwSW5mbykpOworCQkJCQkJCQkqKFVTSE9SVCAqKSgmSHRDYXBhYmlsaXR5VG1wLkV4dEh0Q2FwSW5mbykgPSBTV0FQMTYoKihVU0hPUlQgKikoJkh0Q2FwYWJpbGl0eVRtcC5FeHRIdENhcEluZm8pKTsKKworCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLAkmdG1wLAorCQkJCQkJCQkxLAkJCQkJCSZIdENhcEllLAorCQkJCQkJCQkxLAkJCQkJCSZIdExlbiwKKwkJCQkJCQkJSHRMZW4sCQkJCQkmSHRDYXBhYmlsaXR5VG1wLAorCQkJCQkJCQlFTkRfT0ZfQVJHUyk7CisjZW5kaWYKKwkJCUZyYW1lTGVuID0gRnJhbWVMZW4gKyB0bXA7CisJCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCQlpZiAocERMUyAmJiAocERMUy0+U3RhdHVzICE9IERMU19GSU5JU0gpKQorCQl7CisJCQlSVE1QQ2FuY2VsVGltZXIoJnBETFMtPlRpbWVyLCAmVGltZXJDYW5jZWxsZWQpOworCQkJVGltZW91dCA9IERMU19USU1FT1VUOworCQkJUlRNUFNldFRpbWVyKCZwRExTLT5UaW1lciwgVGltZW91dCk7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwJCQkJJkZyYW1lTGVuLAorCQkJCQkJc2l6ZW9mKEhFQURFUl84MDJfMTEpLAkJJkRsc1JzcEhkciwKKwkJCQkJCTEsCQkJCQkJCSZDYXRlZ29yeSwKKwkJCQkJCTEsCQkJCQkJCSZBY3Rpb24sCisJCQkJCQkyLAkJCQkJCQkmU3RhdHVzQ29kZSwKKwkJCQkJCTYsCQkJCQkJCVNBLAorCQkJCQkJNiwJCQkJCQkJcEFkLT5DdXJyZW50QWRkcmVzcywKKwkJCQkJCUVORF9PRl9BUkdTKTsKKwl9CisKKwlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIFFJRF9BQ19CRSwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOworCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBQZWVyRGxzUnNwQWN0aW9uKAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlVU0hPUlQJCUNhcGFiaWxpdHlJbmZvOworCVVDSEFSCQlEQVtNQUNfQUREUl9MRU5dLCBTQVtNQUNfQUREUl9MRU5dOworCVVTSE9SVAkJU3RhdHVzQ29kZTsKKwlTSE9SVAkJaTsKKwlCT09MRUFOCQlUaW1lckNhbmNlbGxlZDsKKwlVQ0hBUgkJTWF4U3VwcG9ydGVkUmF0ZUluNTAwS2JwcyA9IDA7CisgICAgVUNIQVIJCVN1cHBvcnRlZFJhdGVzTGVuOworICAgIFVDSEFSCQlTdXBwb3J0ZWRSYXRlc1tNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFU107CisJVUNIQVIJCUh0Q2FwYWJpbGl0eUxlbjsKKwlIVF9DQVBBQklMSVRZX0lFCUh0Q2FwYWJpbGl0eTsKKworCWlmICghcEFkLT5Db21tb25DZmcuYkRMU0NhcGFibGUpCisJCXJldHVybjsKKworCWlmICghSU5GUkFfT04ocEFkKSkKKwkJcmV0dXJuOworCisJaWYgKCFQZWVyRGxzUnNwU2FuaXR5KHBBZCwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4sIERBLCBTQSwgJkNhcGFiaWxpdHlJbmZvLCAmU3RhdHVzQ29kZSwKKwkJCQkJCQkmU3VwcG9ydGVkUmF0ZXNMZW4sICZTdXBwb3J0ZWRSYXRlc1swXSwgJkh0Q2FwYWJpbGl0eUxlbiwgJkh0Q2FwYWJpbGl0eSkpCisJCXJldHVybjsKKworICAgIC8vIHN1cHBvcnRlZCByYXRlcyBhcnJheSBtYXkgbm90IGJlIHNvcnRlZC4gc29ydCBpdCBhbmQgZmluZCB0aGUgbWF4aW11bSByYXRlCisgICAgZm9yIChpPTA7IGk8U3VwcG9ydGVkUmF0ZXNMZW47IGkrKykKKyAgICB7CisgICAgICAgIGlmIChNYXhTdXBwb3J0ZWRSYXRlSW41MDBLYnBzIDwgKFN1cHBvcnRlZFJhdGVzW2ldICYgMHg3ZikpCisgICAgICAgICAgICBNYXhTdXBwb3J0ZWRSYXRlSW41MDBLYnBzID0gU3VwcG9ydGVkUmF0ZXNbaV0gJiAweDdmOworICAgIH0KKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiRExTIC0gUGVlckRsc1JzcEFjdGlvbigpIGZyb20gJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnggd2l0aCBTdGF0dXNDb2RlPSVkLCBDYXBhYmlsaXR5SW5mbz0weCV4XG4iLAorCQlTQVswXSwgU0FbMV0sIFNBWzJdLCBTQVszXSwgU0FbNF0sIFNBWzVdLCBTdGF0dXNDb2RlLCBDYXBhYmlsaXR5SW5mbykpOworCisJZm9yIChpID0gMDsgaSA8IE1BWF9OVU1fT0ZfSU5JVF9ETFNfRU5UUlk7IGkrKykKKwl7CisJCWlmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZCAmJiBNQUNfQUREUl9FUVVBTChTQSwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcikpCisJCXsKKwkJCWlmIChTdGF0dXNDb2RlID09IE1MTUVfU1VDQ0VTUykKKwkJCXsKKwkJCQlNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeTsKKwkJCQlVQ0hBUiBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8xMTsKKworCQkJCXBFbnRyeSA9IE1hY1RhYmxlSW5zZXJ0RGxzRW50cnkocEFkLCBTQSwgaSk7CisKKwkJCQlzd2l0Y2ggKE1heFN1cHBvcnRlZFJhdGVJbjUwMEticHMpCisJCQkJeworCQkJCQljYXNlIDEwODogTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfNTQ7ICAgYnJlYWs7CisJCQkJCWNhc2UgOTY6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV80ODsgICBicmVhazsKKwkJCQkJY2FzZSA3MjogIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzM2OyAgIGJyZWFrOworCQkJCQljYXNlIDQ4OiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMjQ7ICAgYnJlYWs7CisJCQkJCWNhc2UgMzY6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8xODsgICBicmVhazsKKwkJCQkJY2FzZSAyNDogIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzEyOyAgIGJyZWFrOworCQkJCQljYXNlIDE4OiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfOTsgICAgYnJlYWs7CisJCQkJCWNhc2UgMTI6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV82OyAgICBicmVhazsKKwkJCQkJY2FzZSAyMjogIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzExOyAgIGJyZWFrOworCQkJCQljYXNlIDExOiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfNV81OyAgYnJlYWs7CisJCQkJCWNhc2UgNDogICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8yOyAgICBicmVhazsKKwkJCQkJY2FzZSAyOiAgIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzE7ICAgIGJyZWFrOworCQkJCQlkZWZhdWx0OiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMTE7ICAgYnJlYWs7CisJCQkJfQorCisJCQkJcEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlID0gbWluKHBBZC0+Q29tbW9uQ2ZnLk1heFR4UmF0ZSwgTWF4U3VwcG9ydGVkUmF0ZSk7CisKKwkJCQlpZiAocEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlIDwgUkFURV9GSVJTVF9PRkRNX1JBVEUpCisJCQkJeworCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9DQ0s7CisJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1DUyA9IHBFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZTsKKwkJCQkJcEVudHJ5LT5NaW5IVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfQ0NLOworCQkJCQlwRW50cnktPk1pbkhUUGh5TW9kZS5maWVsZC5NQ1MgPSBwRW50cnktPk1heFN1cHBvcnRlZFJhdGU7CisJCQkJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX0NDSzsKKwkJCQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTID0gcEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9PRkRNOworCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NQ1MgPSBPZmRtUmF0ZVRvUnh3aU1DU1twRW50cnktPk1heFN1cHBvcnRlZFJhdGVdOworCQkJCQlwRW50cnktPk1pbkhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9PRkRNOworCQkJCQlwRW50cnktPk1pbkhUUGh5TW9kZS5maWVsZC5NQ1MgPSBPZmRtUmF0ZVRvUnh3aU1DU1twRW50cnktPk1heFN1cHBvcnRlZFJhdGVdOworCQkJCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9PRkRNOworCQkJCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NQ1MgPSBPZmRtUmF0ZVRvUnh3aU1DU1twRW50cnktPk1heFN1cHBvcnRlZFJhdGVdOworCQkJCX0KKworCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLkJXID0gQldfMjA7CisJCQkJcEVudHJ5LT5NaW5IVFBoeU1vZGUuZmllbGQuQlcgPSBCV18yMDsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJCXBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFswXSA9IDA7CisJCQkJcEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzFdID0gMDsKKworCQkJCS8vIElmIHRoaXMgRW50cnkgc3VwcG9ydHMgODAyLjExbiwgdXBncmFkZSB0byBIVCByYXRlLgorCQkJCWlmICgoSHRDYXBhYmlsaXR5TGVuICE9IDApICYmIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID49IFBIWV8xMUFCR05fTUlYRUQpKQorCQkJCXsKKwkJCQkJVUNIQVIJaiwgYml0bWFzazsgLy9rLGJpdG1hc2s7CisJCQkJCUNIQVIgICAgaWk7CisKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfT0ZGLCAoIkRMUyAtIFBlZXJEbHNSc3BBY3Rpb24gUmVjZWl2ZSBQZWVyIEhUIENhcGFibGUgU1RBIGZyb20gJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisJCQkJCQkJCVNBWzBdLCBTQVsxXSwgU0FbMl0sIFNBWzNdLCBTQVs0XSwgU0FbNV0pKTsKKworCQkJCQlpZiAoKEh0Q2FwYWJpbGl0eS5IdENhcEluZm8uR0YpICYmIChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuR0YpKQorCQkJCQl7CisJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9IVEdSRUVORklFTEQ7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9IVE1JWDsKKwkJCQkJCXBBZC0+TWFjVGFiLmZBbnlTdGF0aW9uTm9uR0YgPSBUUlVFOworCQkJCQkJcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLkFkZEh0SW5mbzIuTm9uR2ZQcmVzZW50ID0gMTsKKwkJCQkJfQorCisJCQkJCWlmICgoSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5DaGFubmVsV2lkdGgpICYmIChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQ2hhbm5lbFdpZHRoKSkKKwkJCQkJeworCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuQlc9IEJXXzQwOworCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuU2hvcnRHSSA9ICgocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LlNob3J0R0lmb3I0MCkmKEh0Q2FwYWJpbGl0eS5IdENhcEluZm8uU2hvcnRHSWZvcjQwKSk7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5CVyA9IEJXXzIwOworCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuU2hvcnRHSSA9ICgocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LlNob3J0R0lmb3IyMCkmKEh0Q2FwYWJpbGl0eS5IdENhcEluZm8uU2hvcnRHSWZvcjIwKSk7CisJCQkJCQlwQWQtPk1hY1RhYi5mQW55U3RhdGlvbjIwT25seSA9IFRSVUU7CisJCQkJCX0KKworCQkJCQkvLyBmaW5kIG1heCBmaXhlZCByYXRlCisJCQkJCWZvciAoaWk9MTU7IGlpPj0wOyBpaS0tKQorCQkJCQl7CisJCQkJCQlqID0gaWkvODsKKwkJCQkJCWJpdG1hc2sgPSAoMTw8KGlpLShqKjgpKSk7CisJCQkJCQlpZiAoIChwQWQtPlN0YUNmZy5EZXNpcmVkSHRQaHlJbmZvLk1DU1NldFtqXSZiaXRtYXNrKSAmJiAoSHRDYXBhYmlsaXR5Lk1DU1NldFtqXSZiaXRtYXNrKSkKKwkJCQkJCXsKKwkJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NQ1MgPSBpaTsKKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJCWlmIChpaT09MCkKKwkJCQkJCQlicmVhazsKKwkJCQkJfQorCisJCQkJCWlmIChwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyAhPSBNQ1NfQVVUTykKKwkJCQkJeworCQkJCQkJaWYgKHBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID09IDMyKQorCQkJCQkJeworCQkJCQkJCS8vIEZpeCBNQ1MgYXMgSFQgRHVwbGljYXRlZCBNb2RlCisJCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuQlcgPSAxOworCQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX0hUTUlYOworCQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLlNUQkMgPSAwOworCQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLlNob3J0R0kgPSAwOworCQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1DUyA9IDMyOworCQkJCQkJfQorCQkJCQkJZWxzZSBpZiAocEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTUNTID4gcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1DUykKKwkJCQkJCXsKKwkJCQkJCQkvLyBTVEEgc3VwcG9ydHMgZml4ZWQgTUNTCisJCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTUNTID0gcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1DUzsKKwkJCQkJCX0KKwkJCQkJfQorCisJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLlNUQkMgPSAoSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5SeFNUQkMgJiAocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LlR4U1RCQykpOworCQkJCQlwRW50cnktPk1wZHVEZW5zaXR5ID0gSHRDYXBhYmlsaXR5Lkh0Q2FwUGFybS5NcGR1RGVuc2l0eTsKKwkJCQkJcEVudHJ5LT5NYXhSQW1wZHVGYWN0b3IgPSBIdENhcGFiaWxpdHkuSHRDYXBQYXJtLk1heFJBbXBkdUZhY3RvcjsKKwkJCQkJcEVudHJ5LT5NbXBzTW9kZSA9IChVQ0hBUilIdENhcGFiaWxpdHkuSHRDYXBJbmZvLk1pbW9QczsKKwkJCQkJcEVudHJ5LT5BTXNkdVNpemUgPSAoVUNIQVIpSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5BTXNkdVNpemU7CisJCQkJCXBFbnRyeS0+SFRQaHlNb2RlLndvcmQgPSBwRW50cnktPk1heEhUUGh5TW9kZS53b3JkOworCisJCQkJCWlmIChIdENhcGFiaWxpdHkuSHRDYXBJbmZvLlNob3J0R0lmb3IyMCkKKwkJCQkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19TR0kyMF9DQVBBQkxFKTsKKwkJCQkJaWYgKEh0Q2FwYWJpbGl0eS5IdENhcEluZm8uU2hvcnRHSWZvcjQwKQorCQkJCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX1NHSTQwX0NBUEFCTEUpOworCQkJCQlpZiAoSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5UeFNUQkMpCisJCQkJCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfVHhTVEJDX0NBUEFCTEUpOworCQkJCQlpZiAoSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5SeFNUQkMpCisJCQkJCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfUnhTVEJDX0NBUEFCTEUpOworCQkJCQlpZiAoSHRDYXBhYmlsaXR5LkV4dEh0Q2FwSW5mby5QbHVzSFRDKQorCQkJCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX0hUQ19DQVBBQkxFKTsKKwkJCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJSZGcgJiYgSHRDYXBhYmlsaXR5LkV4dEh0Q2FwSW5mby5SREdTdXBwb3J0KQorCQkJCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX1JER19DQVBBQkxFKTsKKwkJCQkJaWYgKEh0Q2FwYWJpbGl0eS5FeHRIdENhcEluZm8uTUNTRmVlZGJhY2sgPT0gMHgwMykKKwkJCQkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19NQ1NGRUVEQkFDS19DQVBBQkxFKTsKKworCQkJCQlOZGlzTW92ZU1lbW9yeSgmcEVudHJ5LT5IVENhcGFiaWxpdHksICZIdENhcGFiaWxpdHksIHNpemVvZihIVF9DQVBBQklMSVRZX0lFKSk7CisJCQkJfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQkJCXBFbnRyeS0+SFRQaHlNb2RlLndvcmQgPSBwRW50cnktPk1heEhUUGh5TW9kZS53b3JkOworCQkJCXBFbnRyeS0+Q3VyclR4UmF0ZSA9IHBFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZTsKKwkJCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfV01NX0NBUEFCTEUpOworCisJCQkJaWYgKHBBZC0+U3RhQ2ZnLmJBdXRvVHhSYXRlU3dpdGNoID09IFRSVUUpCisJCQkJeworCQkJCQlQVUNIQVIgcFRhYmxlOworCQkJCQlVQ0hBUiBUYWJsZVNpemUgPSAwOworCisJCQkJCU1sbWVTZWxlY3RUeFJhdGVUYWJsZShwQWQsIHBFbnRyeSwgJnBUYWJsZSwgJlRhYmxlU2l6ZSwgJnBFbnRyeS0+Q3VyclR4UmF0ZUluZGV4KTsKKwkJCQkJcEVudHJ5LT5iQXV0b1R4UmF0ZVN3aXRjaCA9IFRSVUU7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1PREUJPSBwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTU9ERTsKKwkJCQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTCT0gcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1DUzsKKwkJCQkJcEVudHJ5LT5iQXV0b1R4UmF0ZVN3aXRjaCA9IEZBTFNFOworCisJCQkJCVJUTVBVcGRhdGVMZWdhY3lUeFNldHRpbmcoKFVDSEFSKXBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuRml4ZWRUeE1vZGUsIHBFbnRyeSk7CisJCQkJfQorCQkJCXBFbnRyeS0+UmF0ZUxlbiA9IFN1cHBvcnRlZFJhdGVzTGVuOworCisJCQkJaWYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKKwkJCQl7CisJCQkJCS8vIElmIHN1cHBvcnQgV1BBIG9yIFdQQTIsIHN0YXJ0IFNUQUtleSBoYW5kIHNoYWtlLAorCQkJCQkvLyBJZiBmYWlsZWQgaGFuZCBzaGFrZSwganVzdCB0ZWFyIGRvd24gcGVlciBETFMKKwkJCQkJaWYgKFJUTVBTZW5kU1RBS2V5UmVxdWVzdChwQWQsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJCQkJCXsKKwkJCQkJCU1MTUVfRExTX1JFUV9TVFJVQ1QJTWxtZURsc1JlcTsKKwkJCQkJCVVTSE9SVAkJCQlyZWFzb24gPSBSRUFTT05fUU9TX0NJUEhFUl9OT1RfU1VQUE9SVDsKKworCQkJCQkJRGxzUGFybUZpbGwocEFkLCAmTWxtZURsc1JlcSwgJnBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLCByZWFzb24pOworCQkJCQkJTWxtZUVucXVldWUocEFkLCBETFNfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfRExTX1RFQVJfRE9XTiwgc2l6ZW9mKE1MTUVfRExTX1JFUV9TVFJVQ1QpLCAmTWxtZURsc1JlcSk7CisJCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPSBETFNfTk9ORTsKKwkJCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkCT0gRkFMU0U7CisJCQkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIkRMUyAtIFBlZXJEbHNSc3BBY3Rpb24gZmFpbGVkIHdoZW4gY2FsbCBSVE1QU2VuZFNUQUtleVJlcXVlc3QgXG4iKSk7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPSBETFNfV0FJVF9LRVk7CisJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkRMUyAtIHdhaXRpbmcgZm9yIFNUQUtleSBoYW5kc2hha2UgcHJvY2VkdXJlXG4iKSk7CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5UaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKKwkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID0gRExTX0ZJTklTSDsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJETFMgLSBQZWVyRGxzUnNwQWN0aW9uKCkgZnJvbSAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCBTdWNjZWVkIHdpdGggV0VQIG9yIG5vIHNlY3VyaXR5XG4iLCBTQVswXSwgU0FbMV0sIFNBWzJdLCBTQVszXSwgU0FbNF0sIFNBWzVdKSk7CisJCQkJfQorCisJCQkJLy9pbml0aWFsaXplIHNlcSBubyBmb3IgRExTIGZyYW1lcy4KKwkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TZXF1ZW5jZSA9IDA7CisJCQkJaWYgKEh0Q2FwYWJpbGl0eUxlbiAhPSAwKQorCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5iSFRDYXAgPSBUUlVFOworCQkJCWVsc2UKKwkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uYkhUQ2FwID0gRkFMU0U7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJLy8gRExTIHNldHVwIHByb2NlZHVyZSBmYWlsZWQuCisJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID0gRExTX05PTkU7CisJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQJPSBGQUxTRTsKKwkJCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlRpbWVyLCAmVGltZXJDYW5jZWxsZWQpOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiRExTIC0gUGVlckRsc1JzcEFjdGlvbiBmYWlsZWQgd2l0aCBTdGF0dXNDb2RlPSVkIFxuIiwgU3RhdHVzQ29kZSkpOworCQkJfQorCQl9CisJfQorCisJaWYgKGkgPj0gTUFYX05VTV9PRl9JTklUX0RMU19FTlRSWSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiRExTIC0gUGVlckRsc1JzcEFjdGlvbigpIHVwZGF0ZSB0aW1lb3V0IHZhbHVlIFxuIikpOworCQlmb3IgKGk9KE1BWF9OVU1fT0ZfRExTX0VOVFJZLTEpOyBpPj1NQVhfTlVNX09GX0lOSVRfRExTX0VOVFJZOyBpLS0pCisJCXsKKwkJCWlmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZCAmJiBNQUNfQUREUl9FUVVBTChTQSwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcikpCisJCQl7CisJCQkJaWYgKFN0YXR1c0NvZGUgPT0gTUxNRV9TVUNDRVNTKQorCQkJCXsKKwkJCQkJTUFDX1RBQkxFX0VOVFJZICpwRW50cnk7CisJCQkJCVVDSEFSIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzExOworCisJCQkJCXBFbnRyeSA9IE1hY1RhYmxlSW5zZXJ0RGxzRW50cnkocEFkLCBTQSwgaSk7CisKKwkJCQkJc3dpdGNoIChNYXhTdXBwb3J0ZWRSYXRlSW41MDBLYnBzKQorCQkJCQl7CisJCQkJCQljYXNlIDEwODogTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfNTQ7ICAgYnJlYWs7CisJCQkJCQljYXNlIDk2OiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfNDg7ICAgYnJlYWs7CisJCQkJCQljYXNlIDcyOiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMzY7ICAgYnJlYWs7CisJCQkJCQljYXNlIDQ4OiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMjQ7ICAgYnJlYWs7CisJCQkJCQljYXNlIDM2OiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMTg7ICAgYnJlYWs7CisJCQkJCQljYXNlIDI0OiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMTI7ICAgYnJlYWs7CisJCQkJCQljYXNlIDE4OiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfOTsgICAgYnJlYWs7CisJCQkJCQljYXNlIDEyOiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfNjsgICAgYnJlYWs7CisJCQkJCQljYXNlIDIyOiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMTE7ICAgYnJlYWs7CisJCQkJCQljYXNlIDExOiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfNV81OyAgYnJlYWs7CisJCQkJCQljYXNlIDQ6ICAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMjsgICAgYnJlYWs7CisJCQkJCQljYXNlIDI6ICAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMTsgICAgYnJlYWs7CisJCQkJCQlkZWZhdWx0OiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMTE7ICAgYnJlYWs7CisJCQkJCX0KKworCQkJCQlwRW50cnktPk1heFN1cHBvcnRlZFJhdGUgPSBtaW4ocEFkLT5Db21tb25DZmcuTWF4VHhSYXRlLCBNYXhTdXBwb3J0ZWRSYXRlKTsKKworCQkJCQlpZiAocEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlIDwgUkFURV9GSVJTVF9PRkRNX1JBVEUpCisJCQkJCXsKKwkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX0NDSzsKKwkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1DUyA9IHBFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZTsKKwkJCQkJCXBFbnRyeS0+TWluSFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX0NDSzsKKwkJCQkJCXBFbnRyeS0+TWluSFRQaHlNb2RlLmZpZWxkLk1DUyA9IHBFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZTsKKwkJCQkJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX0NDSzsKKwkJCQkJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1DUyA9IHBFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZTsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX09GRE07CisJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NQ1MgPSBPZmRtUmF0ZVRvUnh3aU1DU1twRW50cnktPk1heFN1cHBvcnRlZFJhdGVdOworCQkJCQkJcEVudHJ5LT5NaW5IVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfT0ZETTsKKwkJCQkJCXBFbnRyeS0+TWluSFRQaHlNb2RlLmZpZWxkLk1DUyA9IE9mZG1SYXRlVG9SeHdpTUNTW3BFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZV07CisJCQkJCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9PRkRNOworCQkJCQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTID0gT2ZkbVJhdGVUb1J4d2lNQ1NbcEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlXTsKKwkJCQkJfQorCisJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLkJXID0gQldfMjA7CisJCQkJCXBFbnRyeS0+TWluSFRQaHlNb2RlLmZpZWxkLkJXID0gQldfMjA7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCQkJcEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzBdID0gMDsKKwkJCQkJcEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzFdID0gMDsKKworCQkJCQkvLyBJZiB0aGlzIEVudHJ5IHN1cHBvcnRzIDgwMi4xMW4sIHVwZ3JhZGUgdG8gSFQgcmF0ZS4KKwkJCQkJaWYgKChIdENhcGFiaWxpdHlMZW4gIT0gMCkgJiYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCkpCisJCQkJCXsKKwkJCQkJCVVDSEFSCWosIGJpdG1hc2s7IC8vayxiaXRtYXNrOworCQkJCQkJQ0hBUiAgICBpaTsKKworCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfT0ZGLCAoIkRMUyAtIFBlZXJEbHNSc3BBY3Rpb24gUmVjZWl2ZSBQZWVyIEhUIENhcGFibGUgU1RBIGZyb20gJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisJCQkJCQkJCQlTQVswXSwgU0FbMV0sIFNBWzJdLCBTQVszXSwgU0FbNF0sIFNBWzVdKSk7CisKKwkJCQkJCWlmICgoSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5HRikgJiYgKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5HRikpCisJCQkJCQl7CisJCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfSFRHUkVFTkZJRUxEOworCQkJCQkJfQorCQkJCQkJZWxzZQorCQkJCQkJeworCQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX0hUTUlYOworCQkJCQkJCXBBZC0+TWFjVGFiLmZBbnlTdGF0aW9uTm9uR0YgPSBUUlVFOworCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mby5BZGRIdEluZm8yLk5vbkdmUHJlc2VudCA9IDE7CisJCQkJCQl9CisKKwkJCQkJCWlmICgoSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5DaGFubmVsV2lkdGgpICYmIChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQ2hhbm5lbFdpZHRoKSkKKwkJCQkJCXsKKwkJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5CVz0gQldfNDA7CisJCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuU2hvcnRHSSA9ICgocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LlNob3J0R0lmb3I0MCkmKEh0Q2FwYWJpbGl0eS5IdENhcEluZm8uU2hvcnRHSWZvcjQwKSk7CisJCQkJCQl9CisJCQkJCQllbHNlCisJCQkJCQl7CisJCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuQlcgPSBCV18yMDsKKwkJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5TaG9ydEdJID0gKChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuU2hvcnRHSWZvcjIwKSYoSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5TaG9ydEdJZm9yMjApKTsKKwkJCQkJCQlwQWQtPk1hY1RhYi5mQW55U3RhdGlvbjIwT25seSA9IFRSVUU7CisJCQkJCQl9CisKKwkJCQkJCS8vIGZpbmQgbWF4IGZpeGVkIHJhdGUKKwkJCQkJCWZvciAoaWk9MTU7IGlpPj0wOyBpaS0tKQorCQkJCQkJeworCQkJCQkJCWogPSBpaS84OworCQkJCQkJCWJpdG1hc2sgPSAoMTw8KGlpLShqKjgpKSk7CisJCQkJCQkJaWYgKCAocEFkLT5TdGFDZmcuRGVzaXJlZEh0UGh5SW5mby5NQ1NTZXRbal0mYml0bWFzaykgJiYgKEh0Q2FwYWJpbGl0eS5NQ1NTZXRbal0mYml0bWFzaykpCisJCQkJCQkJeworCQkJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NQ1MgPSBpaTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJfQorCQkJCQkJCWlmIChpaT09MCkKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisKKwkJCQkJCWlmIChwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyAhPSBNQ1NfQVVUTykKKwkJCQkJCXsKKwkJCQkJCQlwcmludGsoIkBAQCBwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gJWRcbiIsCisJCQkJCQkJCXBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTKTsKKwkJCQkJCQlpZiAocEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPT0gMzIpCisJCQkJCQkJeworCQkJCQkJCQkvLyBGaXggTUNTIGFzIEhUIER1cGxpY2F0ZWQgTW9kZQorCQkJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5CVyA9IDE7CisJCQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX0hUTUlYOworCQkJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5TVEJDID0gMDsKKwkJCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuU2hvcnRHSSA9IDA7CisJCQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1DUyA9IDMyOworCQkJCQkJCX0KKwkJCQkJCQllbHNlIGlmIChwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NQ1MgPiBwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTUNTKQorCQkJCQkJCXsKKwkJCQkJCQkJLy8gU1RBIHN1cHBvcnRzIGZpeGVkIE1DUworCQkJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NQ1MgPSBwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTUNTOworCQkJCQkJCX0KKwkJCQkJCX0KKworCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuU1RCQyA9IChIdENhcGFiaWxpdHkuSHRDYXBJbmZvLlJ4U1RCQyAmIChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuVHhTVEJDKSk7CisJCQkJCQlwRW50cnktPk1wZHVEZW5zaXR5ID0gSHRDYXBhYmlsaXR5Lkh0Q2FwUGFybS5NcGR1RGVuc2l0eTsKKwkJCQkJCXBFbnRyeS0+TWF4UkFtcGR1RmFjdG9yID0gSHRDYXBhYmlsaXR5Lkh0Q2FwUGFybS5NYXhSQW1wZHVGYWN0b3I7CisJCQkJCQlwRW50cnktPk1tcHNNb2RlID0gKFVDSEFSKUh0Q2FwYWJpbGl0eS5IdENhcEluZm8uTWltb1BzOworCQkJCQkJcEVudHJ5LT5BTXNkdVNpemUgPSAoVUNIQVIpSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5BTXNkdVNpemU7CisJCQkJCQlwRW50cnktPkhUUGh5TW9kZS53b3JkID0gcEVudHJ5LT5NYXhIVFBoeU1vZGUud29yZDsKKworCQkJCQkJaWYgKEh0Q2FwYWJpbGl0eS5IdENhcEluZm8uU2hvcnRHSWZvcjIwKQorCQkJCQkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19TR0kyMF9DQVBBQkxFKTsKKwkJCQkJCWlmIChIdENhcGFiaWxpdHkuSHRDYXBJbmZvLlNob3J0R0lmb3I0MCkKKwkJCQkJCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfU0dJNDBfQ0FQQUJMRSk7CisJCQkJCQlpZiAoSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5UeFNUQkMpCisJCQkJCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX1R4U1RCQ19DQVBBQkxFKTsKKwkJCQkJCWlmIChIdENhcGFiaWxpdHkuSHRDYXBJbmZvLlJ4U1RCQykKKwkJCQkJCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfUnhTVEJDX0NBUEFCTEUpOworCQkJCQkJaWYgKEh0Q2FwYWJpbGl0eS5FeHRIdENhcEluZm8uUGx1c0hUQykKKwkJCQkJCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfSFRDX0NBUEFCTEUpOworCQkJCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJSZGcgJiYgSHRDYXBhYmlsaXR5LkV4dEh0Q2FwSW5mby5SREdTdXBwb3J0KQorCQkJCQkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19SREdfQ0FQQUJMRSk7CisJCQkJCQlpZiAoSHRDYXBhYmlsaXR5LkV4dEh0Q2FwSW5mby5NQ1NGZWVkYmFjayA9PSAweDAzKQorCQkJCQkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19NQ1NGRUVEQkFDS19DQVBBQkxFKTsKKworCQkJCQkJTmRpc01vdmVNZW1vcnkoJnBFbnRyeS0+SFRDYXBhYmlsaXR5LCAmSHRDYXBhYmlsaXR5LCBzaXplb2YoSFRfQ0FQQUJJTElUWV9JRSkpOworCQkJCQl9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwkJCQkJcEVudHJ5LT5IVFBoeU1vZGUud29yZCA9IHBFbnRyeS0+TWF4SFRQaHlNb2RlLndvcmQ7CisJCQkJCXBFbnRyeS0+Q3VyclR4UmF0ZSA9IHBFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZTsKKwkJCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX1dNTV9DQVBBQkxFKTsKKworCQkJCQlpZiAocEFkLT5TdGFDZmcuYkF1dG9UeFJhdGVTd2l0Y2ggPT0gVFJVRSkKKwkJCQkJeworCQkJCQkJUFVDSEFSIHBUYWJsZTsKKwkJCQkJCVVDSEFSIFRhYmxlU2l6ZSA9IDA7CisKKwkJCQkJCU1sbWVTZWxlY3RUeFJhdGVUYWJsZShwQWQsIHBFbnRyeSwgJnBUYWJsZSwgJlRhYmxlU2l6ZSwgJnBFbnRyeS0+Q3VyclR4UmF0ZUluZGV4KTsKKwkJCQkJCXBFbnRyeS0+YkF1dG9UeFJhdGVTd2l0Y2ggPSBUUlVFOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTU9ERQk9IHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NT0RFOworCQkJCQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTCT0gcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1DUzsKKwkJCQkJCXBFbnRyeS0+YkF1dG9UeFJhdGVTd2l0Y2ggPSBGQUxTRTsKKworCQkJCQkJUlRNUFVwZGF0ZUxlZ2FjeVR4U2V0dGluZygoVUNIQVIpcEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5GaXhlZFR4TW9kZSwgcEVudHJ5KTsKKwkJCQkJfQorCQkJCQlwRW50cnktPlJhdGVMZW4gPSBTdXBwb3J0ZWRSYXRlc0xlbjsKKworCQkJCQlpZiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKQorCQkJCQl7CisJCQkJCQkvLyBJZiBzdXBwb3J0IFdQQSBvciBXUEEyLCBzdGFydCBTVEFLZXkgaGFuZCBzaGFrZSwKKwkJCQkJCS8vIElmIGZhaWxlZCBoYW5kIHNoYWtlLCBqdXN0IHRlYXIgZG93biBwZWVyIERMUworCQkJCQkJaWYgKFJUTVBTZW5kU1RBS2V5UmVxdWVzdChwQWQsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJCQkJCQl7CisJCQkJCQkJTUxNRV9ETFNfUkVRX1NUUlVDVAlNbG1lRGxzUmVxOworCQkJCQkJCVVTSE9SVAkJCQlyZWFzb24gPSBSRUFTT05fUU9TX0NJUEhFUl9OT1RfU1VQUE9SVDsKKworCQkJCQkJCURsc1Bhcm1GaWxsKHBBZCwgJk1sbWVEbHNSZXEsICZwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXSwgcmVhc29uKTsKKwkJCQkJCQlNbG1lRW5xdWV1ZShwQWQsIERMU19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9ETFNfVEVBUl9ET1dOLCBzaXplb2YoTUxNRV9ETFNfUkVRX1NUUlVDVCksICZNbG1lRGxzUmVxKTsKKwkJCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPSBETFNfTk9ORTsKKwkJCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZAk9IEZBTFNFOworCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiRExTIC0gUGVlckRsc1JzcEFjdGlvbiBmYWlsZWQgd2hlbiBjYWxsIFJUTVBTZW5kU1RBS2V5UmVxdWVzdCBcbiIpKTsKKwkJCQkJCX0KKwkJCQkJCWVsc2UKKwkJCQkJCXsKKwkJCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPSBETFNfV0FJVF9LRVk7CisJCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJETFMgLSB3YWl0aW5nIGZvciBTVEFLZXkgaGFuZHNoYWtlIHByb2NlZHVyZVxuIikpOworCQkJCQkJfQorCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5UaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKKwkJCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9IERMU19GSU5JU0g7CisJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkRMUyAtIFBlZXJEbHNSc3BBY3Rpb24oKSBmcm9tICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IFN1Y2NlZWQgd2l0aCBXRVAgb3Igbm8gc2VjdXJpdHlcbiIsIFNBWzBdLCBTQVsxXSwgU0FbMl0sIFNBWzNdLCBTQVs0XSwgU0FbNV0pKTsKKwkJCQkJfQorCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TZXF1ZW5jZSA9IDA7CisJCQkJCWlmIChIdENhcGFiaWxpdHlMZW4gIT0gMCkKKwkJCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLmJIVENhcCA9IFRSVUU7CisJCQkJCWVsc2UKKwkJCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLmJIVENhcCA9IEZBTFNFOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQkvLyBETFMgc2V0dXAgcHJvY2VkdXJlIGZhaWxlZC4KKwkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID0gRExTX05PTkU7CisJCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkCT0gRkFMU0U7CisJCQkJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVGltZXIsICZUaW1lckNhbmNlbGxlZCk7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiRExTIC0gUGVlckRsc1JzcEFjdGlvbiBmYWlsZWQgd2l0aCBTdGF0dXNDb2RlPSVkIFxuIiwgU3RhdHVzQ29kZSkpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIE1sbWVEbHNUZWFyRG93bkFjdGlvbigKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisJUFVDSEFSCQkJcE91dEJ1ZmZlciA9IE5VTEw7CisJTkRJU19TVEFUVVMJCU5TdGF0dXM7CisJVUxPTkcJCQlGcmFtZUxlbiA9IDA7CisJVUNIQVIJCQlDYXRlZ29yeSA9IENBVEVHT1JZX0RMUzsKKwlVQ0hBUgkJCUFjdGlvbiA9IEFDVElPTl9ETFNfVEVBUkRPV047CisJVVNIT1JUCQkJUmVhc29uQ29kZSA9IFJFQVNPTl9RT1NfVU5TUEVDSUZZOworCUhFQURFUl84MDJfMTEJRGxzVGVhckRvd25IZHI7CisJUFJUXzgwMl8xMV9ETFMJcERMUzsKKwlCT09MRUFOCQkJVGltZXJDYW5jZWxsZWQ7CisJVUNIQVIJCQlpOworCisJaWYoIU1sbWVEbHNSZXFTYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbiwgJnBETFMsICZSZWFzb25Db2RlKSkKKwkJcmV0dXJuOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJETFMgLSBNbG1lRGxzVGVhckRvd25BY3Rpb24oKSB3aXRoIFJlYXNvbkNvZGU9JWQgXG4iLCBSZWFzb25Db2RlKSk7CisKKwlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOyAgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQorCWlmIChOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIkRMUyAtIE1sbWVEbHNUZWFyRG93bkFjdGlvbigpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWQgXG4iKSk7CisJCXJldHVybjsKKwl9CisKKwlBY3RIZWFkZXJJbml0KHBBZCwgJkRsc1RlYXJEb3duSGRyLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgcEFkLT5DdXJyZW50QWRkcmVzcywgcEFkLT5Db21tb25DZmcuQnNzaWQpOworCisJLy8gQnVpbGQgYmFzaWMgZnJhbWUgZmlyc3QKKwlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLAkJCQkmRnJhbWVMZW4sCisJCQkJCXNpemVvZihIRUFERVJfODAyXzExKSwJCSZEbHNUZWFyRG93bkhkciwKKwkJCQkJMSwJCQkJCQkJJkNhdGVnb3J5LAorCQkJCQkxLAkJCQkJCQkmQWN0aW9uLAorCQkJCQk2LAkJCQkJCQkmcERMUy0+TWFjQWRkciwKKwkJCQkJNiwJCQkJCQkJcEFkLT5DdXJyZW50QWRkcmVzcywKKwkJCQkJMiwJCQkJCQkJJlJlYXNvbkNvZGUsCisJCQkJCUVORF9PRl9BUkdTKTsKKworCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgUUlEX0FDX0JFLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7CisJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKKwlSVE1QQ2FuY2VsVGltZXIoJnBETFMtPlRpbWVyLCAmVGltZXJDYW5jZWxsZWQpOworCisJLy8gUmVtb3ZlIGtleSBpbiBsb2NhbCBkbHMgdGFibGUgZW50cnkKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX05VTV9PRl9JTklUX0RMU19FTlRSWTsgaSsrKQorCXsKKwkJaWYgKE1BQ19BRERSX0VRVUFMKHBETFMtPk1hY0FkZHIsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpKQorCQl7CisJCQlNYWNUYWJsZURlbGV0ZURsc0VudHJ5KHBBZCwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjVGFiTWF0Y2hXQ0lELCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKTsKKwkJfQorCX0KKworCS8vIGNsZWFyIHBlZXIgZGxzIHRhYmxlIGVudHJ5CisJZm9yIChpID0gTUFYX05VTV9PRl9JTklUX0RMU19FTlRSWTsgaSA8IE1BWF9OVU1fT0ZfRExTX0VOVFJZOyBpKyspCisJeworCQlpZiAoTUFDX0FERFJfRVFVQUwocERMUy0+TWFjQWRkciwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcikpCisJCXsKKwkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cwk9IERMU19OT05FOworCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQJPSBGQUxTRTsKKwkJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVGltZXIsICZUaW1lckNhbmNlbGxlZCk7CisJCQlNYWNUYWJsZURlbGV0ZURsc0VudHJ5KHBBZCwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjVGFiTWF0Y2hXQ0lELCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKTsKKwkJfQorCX0KK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIFBlZXJEbHNUZWFyRG93bkFjdGlvbigKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisJVUNIQVIJCQlEQVtNQUNfQUREUl9MRU5dLCBTQVtNQUNfQUREUl9MRU5dOworCVVTSE9SVAkJCVJlYXNvbkNvZGU7CisJVUlOVAkJCWk7CisJQk9PTEVBTgkJCVRpbWVyQ2FuY2VsbGVkOworCisJaWYgKCFwQWQtPkNvbW1vbkNmZy5iRExTQ2FwYWJsZSkKKwkJcmV0dXJuOworCisJaWYgKCFJTkZSQV9PTihwQWQpKQorCQlyZXR1cm47CisKKwlpZiAoIVBlZXJEbHNUZWFyRG93blNhbml0eShwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuLCBEQSwgU0EsICZSZWFzb25Db2RlKSkKKwkJcmV0dXJuOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJETFMgLSBQZWVyRGxzVGVhckRvd25BY3Rpb24oKSBmcm9tICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IHdpdGggUmVhc29uQ29kZT0lZFxuIiwgU0FbMF0sIFNBWzFdLCBTQVsyXSwgU0FbM10sIFNBWzRdLCBTQVs1XSwgUmVhc29uQ29kZSkpOworCisJLy8gY2xlYXIgbG9jYWwgZGxzIHRhYmxlIGVudHJ5CisJZm9yIChpPTA7IGk8TUFYX05VTV9PRl9JTklUX0RMU19FTlRSWTsgaSsrKQorCXsKKwkJaWYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkICYmIE1BQ19BRERSX0VRVUFMKFNBLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKSkKKwkJeworCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzCT0gRExTX05PTkU7CisJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZAk9IEZBTFNFOworCQkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5UaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKKwkJCS8vQXNpY0RlbFdjaWRUYWIocEFkLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNUYWJNYXRjaFdDSUQpOworCQkJLy9Bc2ljUmVtb3ZlUGFpcndpc2VLZXlFbnRyeShwQWQsIEJTUzAsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY1RhYk1hdGNoV0NJRCk7CisJCQlNYWNUYWJsZURlbGV0ZURsc0VudHJ5KHBBZCwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjVGFiTWF0Y2hXQ0lELCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKTsKKwkJfQorCX0KKworCS8vIGNsZWFyIHBlZXIgZGxzIHRhYmxlIGVudHJ5CisJZm9yIChpPU1BWF9OVU1fT0ZfSU5JVF9ETFNfRU5UUlk7IGk8TUFYX05VTV9PRl9ETFNfRU5UUlk7IGkrKykKKwl7CisJCWlmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZCAmJiBNQUNfQUREUl9FUVVBTChTQSwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcikpCisJCXsKKwkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cwk9IERMU19OT05FOworCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQJPSBGQUxTRTsKKwkJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVGltZXIsICZUaW1lckNhbmNlbGxlZCk7CisJCQkvL0FzaWNEZWxXY2lkVGFiKHBBZCwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjVGFiTWF0Y2hXQ0lEKTsKKwkJCS8vQXNpY1JlbW92ZVBhaXJ3aXNlS2V5RW50cnkocEFkLCBCU1MwLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNUYWJNYXRjaFdDSUQpOworCQkJTWFjVGFibGVEZWxldGVEbHNFbnRyeShwQWQsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY1RhYk1hdGNoV0NJRCwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcik7CisJCX0KKwl9Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBSVE1QQ2hlY2tETFNUaW1lT3V0KAorCUlOIFBSVE1QX0FEQVBURVIJcEFkKQoreworCVVMT05HCQkJCWk7CisJTUxNRV9ETFNfUkVRX1NUUlVDVAlNbG1lRGxzUmVxOworCVVTSE9SVAkJCQlyZWFzb24gPSBSRUFTT05fUU9TX1VOU1BFQ0lGWTsKKworCWlmICghIHBBZC0+Q29tbW9uQ2ZnLmJETFNDYXBhYmxlKQorCQlyZXR1cm47CisKKwlpZiAoISBJTkZSQV9PTihwQWQpKQorCQlyZXR1cm47CisKKwkvLyBJZiB0aW1lb3V0IHZhbHVlIGlzIGVxdWFsZWQgdG8gemVybywgaXQgbWVhbnMgYWx3YXlzIG5vdCBiZSB0aW1lb3V0LgorCisJLy8gdXBkYXRlIGxvY2FsIGRscyB0YWJsZSBlbnRyeQorCWZvciAoaT0wOyBpPE1BWF9OVU1fT0ZfSU5JVF9ETFNfRU5UUlk7IGkrKykKKwl7CisJCWlmICgocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQpICYmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPT0gRExTX0ZJTklTSCkKKwkJCSYmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5UaW1lT3V0ICE9IDApKQorCQl7CisJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5Db3VudERvd25UaW1lciAtLTsKKworCQkJaWYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLkNvdW50RG93blRpbWVyID09IDApCisJCQl7CisJCQkJcmVhc29uID0gUkVBU09OX1FPU19SRVFVRVNUX1RJTUVPVVQ7CisJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQJPSBGQUxTRTsKKwkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMJPSBETFNfTk9ORTsKKwkJCQlEbHNQYXJtRmlsbChwQWQsICZNbG1lRGxzUmVxLCAmcEFkLT5TdGFDZmcuRExTRW50cnlbaV0sIHJlYXNvbik7CisJCQkJTWxtZUVucXVldWUocEFkLCBETFNfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfRExTX1RFQVJfRE9XTiwgc2l6ZW9mKE1MTUVfRExTX1JFUV9TVFJVQ1QpLCAmTWxtZURsc1JlcSk7CisJCQl9CisJCX0KKwl9CisKKwkvLyB1cGRhdGUgcGVlciBkbHMgdGFibGUgZW50cnkKKwlmb3IgKGk9TUFYX05VTV9PRl9JTklUX0RMU19FTlRSWTsgaTxNQVhfTlVNX09GX0RMU19FTlRSWTsgaSsrKQorCXsKKwkJaWYgKChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZCkgJiYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9PSBETFNfRklOSVNIKQorCQkJJiYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlRpbWVPdXQgIT0gMCkpCisJCXsKKwkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLkNvdW50RG93blRpbWVyIC0tOworCisJCQlpZiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uQ291bnREb3duVGltZXIgPT0gMCkKKwkJCXsKKwkJCQlyZWFzb24gPSBSRUFTT05fUU9TX1JFUVVFU1RfVElNRU9VVDsKKwkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZAk9IEZBTFNFOworCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cwk9IERMU19OT05FOworCQkJCURsc1Bhcm1GaWxsKHBBZCwgJk1sbWVEbHNSZXEsICZwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXSwgcmVhc29uKTsKKwkJCQlNbG1lRW5xdWV1ZShwQWQsIERMU19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9ETFNfVEVBUl9ET1dOLCBzaXplb2YoTUxNRV9ETFNfUkVRX1NUUlVDVCksICZNbG1lRGxzUmVxKTsKKwkJCX0KKwkJfQorCX0KK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitCT09MRUFOIFJUTVBSY3ZGcmFtZURMU0NoZWNrKAorCUlOIFBSVE1QX0FEQVBURVIJcEFkLAorCUlOIFBIRUFERVJfODAyXzExCXBIZWFkZXIsCisJSU4gVUxPTkcJCQlMZW4sCisJSU4gUFJUMjhYWF9SWERfU1RSVUMJcFJ4RCkKK3sKKwlVTE9ORwkJCWk7CisJQk9PTEVBTgkJCWJGaW5kRW50cnkgPSBGQUxTRTsKKwlCT09MRUFOCQkJYlNUQUtleUZyYW1lID0gRkFMU0U7CisJUEVBUE9MX1BBQ0tFVAlwRWFwOworCVBVQ0hBUgkJCXBQcm90bywgcEFkZHIgPSBOVUxMOworCVBVQ0hBUgkJCXBTVEFLZXkgPSBOVUxMOworCVVDSEFSCQkJWmVyb1JlcGxheVtMRU5fS0VZX0RFU0NfUkVQTEFZXTsKKwlVQ0hBUgkJCU1pY1sxNl0sIE9sZE1pY1sxNl07CisJVUNIQVIJCQlkaWdlc3RbODBdOworCVVDSEFSCQkJRGxzUFRLWzgwXTsKKwlVQ0hBUgkJCXRlbXBbNjRdOworCUJPT0xFQU4JCQlUaW1lckNhbmNlbGxlZDsKKwlDSVBIRVJfS0VZCQlQYWlyd2lzZUtleTsKKworCisJaWYgKCEgcEFkLT5Db21tb25DZmcuYkRMU0NhcGFibGUpCisJCXJldHVybiBiU1RBS2V5RnJhbWU7CisKKwlpZiAoISBJTkZSQV9PTihwQWQpKQorCQlyZXR1cm4gYlNUQUtleUZyYW1lOworCisJaWYgKCEgKHBIZWFkZXItPkZDLlN1YlR5cGUgJiAweDA4KSkKKwkJcmV0dXJuIGJTVEFLZXlGcmFtZTsKKworCWlmIChMZW4gPCBMRU5HVEhfODAyXzExICsgNiArIDIgKyAyKQorCQlyZXR1cm4gYlNUQUtleUZyYW1lOworCisJcFByb3RvCT0gKFBVQ0hBUilwSGVhZGVyICsgTEVOR1RIXzgwMl8xMSArIDIgKyA2OwkvLyBRT1MgQ29udHJvbCBmaWVsZCAsIDB4QUEgMHhBQSAweEFBIDB4MDAgMHgwMCAweDAwCisJcEFkZHIJPSBwSGVhZGVyLT5BZGRyMjsKKworCS8vIEwyUEFEIGJpdCBvbiB3aWxsIHBhZCAyIGJ5dGVzIGF0IExMQworCWlmIChwUnhELT5MMlBBRCkKKwl7CisJCXBQcm90byArPSAyOworCX0KKworCWlmIChSVE1QRXF1YWxNZW1vcnkoRUFQT0wsIHBQcm90bywgMikgJiYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID49ICBOZGlzODAyXzExQXV0aE1vZGVXUEEpKQorCXsKKwkJcEVhcCA9IChQRUFQT0xfUEFDS0VUKSAocFByb3RvICsgMik7CisKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJETFMgLSBTbmlmZiBMZW49JWxkLCBEYXRhTGVuPSVkLCBLZXlNaWM9JWQsIEluc3RhbGw9JWQsIEtleUFjaz0lZCwgU2VjdXJlPSVkLCBFS0RfREw9JWQsIEVycm9yPSVkLCBSZXF1ZXN0PSVkXG4iLCBMZW4sCisJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExFTkdUSF84MDJfMTEgKyA2ICsgMiArIDIgKyBzaXplb2YoRUFQT0xfUEFDS0VUKSAtIE1BWF9MRU5fT0ZfUlNOSUUgKyAxNiksCisJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEVhcC0+S2V5RGVzYy5LZXlJbmZvLktleU1pYywKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRWFwLT5LZXlEZXNjLktleUluZm8uSW5zdGFsbCwKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRWFwLT5LZXlEZXNjLktleUluZm8uS2V5QWNrLAorCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBFYXAtPktleURlc2MuS2V5SW5mby5TZWN1cmUsCisJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEVhcC0+S2V5RGVzYy5LZXlJbmZvLkVLRF9ETCwKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRWFwLT5LZXlEZXNjLktleUluZm8uRXJyb3IsCisJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEVhcC0+S2V5RGVzYy5LZXlJbmZvLlJlcXVlc3QpKTsKKworCQlpZiAoKExlbiA+PSAoTEVOR1RIXzgwMl8xMSArIDYgKyAyICsgMiArIHNpemVvZihFQVBPTF9QQUNLRVQpIC0gTUFYX0xFTl9PRl9SU05JRSArIDE2KSkgJiYgcEVhcC0+S2V5RGVzYy5LZXlJbmZvLktleU1pYworCQkJJiYgcEVhcC0+S2V5RGVzYy5LZXlJbmZvLkluc3RhbGwgJiYgcEVhcC0+S2V5RGVzYy5LZXlJbmZvLktleUFjayAmJiBwRWFwLT5LZXlEZXNjLktleUluZm8uU2VjdXJlCisJCQkmJiBwRWFwLT5LZXlEZXNjLktleUluZm8uRUtEX0RMICYmICFwRWFwLT5LZXlEZXNjLktleUluZm8uRXJyb3IgJiYgIXBFYXAtPktleURlc2MuS2V5SW5mby5SZXF1ZXN0KQorCQl7CisJCQkvLyBGaXJzdCB2YWxpZGF0ZSByZXBsYXkgY291bnRlciwgb25seSBhY2NlcHQgbWVzc2FnZSB3aXRoIGxhcmdlciByZXBsYXkgY291bnRlcgorCQkJLy8gTGV0IGVxdWFsIHBhc3MsIHNvbWUgQVAgc3RhcnQgd2l0aCBhbGwgemVybyByZXBsYXkgY291bnRlcgorCQkJTmRpc1plcm9NZW1vcnkoWmVyb1JlcGxheSwgTEVOX0tFWV9ERVNDX1JFUExBWSk7CisJCQlpZiAoKFJUTVBDb21wYXJlTWVtb3J5KHBFYXAtPktleURlc2MuUmVwbGF5Q291bnRlciwgcEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlciwgTEVOX0tFWV9ERVNDX1JFUExBWSkgIT0gMSkgJiYKKwkJCQkoUlRNUENvbXBhcmVNZW1vcnkocEVhcC0+S2V5RGVzYy5SZXBsYXlDb3VudGVyLCBaZXJvUmVwbGF5LCBMRU5fS0VZX0RFU0NfUkVQTEFZKSAhPSAwKSkKKwkJCQlyZXR1cm4gYlNUQUtleUZyYW1lOworCisJCQkvL1JUTVBNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXIsIHBFYXAtPktleURlc2MuUmVwbGF5Q291bnRlciwgTEVOX0tFWV9ERVNDX1JFUExBWSk7CisJCQlSVE1QTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5EbHNSZXBsYXlDb3VudGVyLCBwRWFwLT5LZXlEZXNjLlJlcGxheUNvdW50ZXIsIExFTl9LRVlfREVTQ19SRVBMQVkpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJETFMgLSBTbmlmZiByZXBsYXkgY291bnRlciAoJTAyeC0lMDJ4LSUwMngtJTAyeC0lMDJ4LSUwMngtJTAyeC0lMDJ4KSBMZW49JWxkLCBLZXlEYXRhTGVuPSVkXG4iLAorCQkJCXBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXJbMF0sIHBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXJbMV0sIHBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXJbMl0sCisJCQkJcEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlclszXSwgcEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlcls0XSwJcEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlcls1XSwKKwkJCQlwQWQtPlN0YUNmZy5SZXBsYXlDb3VudGVyWzZdLCBwQWQtPlN0YUNmZy5SZXBsYXlDb3VudGVyWzddLCBMZW4sIHBFYXAtPktleURlc2MuS2V5RGF0YVsxXSkpOworCisJCQkvLyBwdXQgdGhlc2UgY29kZSBzZWdtZW50IHRvIGdldCB0aGUgcmVwbGF5IGNvdW50ZXIKKwkJCWlmIChwQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZCA9PSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQpCisJCQkJcmV0dXJuIGJTVEFLZXlGcmFtZTsKKworCQkJLy8gQ2hlY2sgTUlDIHZhbHVlCisJCQkvLyBTYXZlIHRoZSBNSUMgYW5kIHJlcGxhY2Ugd2l0aCB6ZXJvCisJCQkvLyB1c2UgcHJvcHJpZXRhcnkgUFRLCisJCQlOZGlzWmVyb01lbW9yeSh0ZW1wLCA2NCk7CisJCQlOZGlzTW92ZU1lbW9yeSh0ZW1wLCAiSUVFRTgwMi4xMSBXSVJFTEVTUyBBQ0NFU1MgUE9JTlQiLCAzMik7CisJCQlXcGFDb3VudFBUSyhwQWQsIHRlbXAsIHRlbXAsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCB0ZW1wLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBEbHNQVEssIExFTl9QVEspOworCisJCQlOZGlzTW92ZU1lbW9yeShPbGRNaWMsIHBFYXAtPktleURlc2MuS2V5TWljLCBMRU5fS0VZX0RFU0NfTUlDKTsKKwkJCU5kaXNaZXJvTWVtb3J5KHBFYXAtPktleURlc2MuS2V5TWljLCBMRU5fS0VZX0RFU0NfTUlDKTsKKwkJCWlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKKwkJCXsKKwkJCQkvLyBBRVMKKwkJCQlITUFDX1NIQTEoKFBVQ0hBUikgcEVhcCwgcEVhcC0+Qm9keV9MZW5bMV0gKyA0LCBEbHNQVEssIExFTl9FQVBfTUlDSywgZGlnZXN0KTsKKwkJCQlOZGlzTW92ZU1lbW9yeShNaWMsCWRpZ2VzdCwJTEVOX0tFWV9ERVNDX01JQyk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJaG1hY19tZDUoRGxzUFRLLCBMRU5fRUFQX01JQ0ssIChQVUNIQVIpIHBFYXAsIHBFYXAtPkJvZHlfTGVuWzFdICsgNCwgTWljKTsKKwkJCX0KKworCQkJaWYgKCFOZGlzRXF1YWxNZW1vcnkoT2xkTWljLCBNaWMsIExFTl9LRVlfREVTQ19NSUMpKQorCQkJeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIk1JQyBEaWZmZXJlbnQgaW4gTXNnMSBvZiBTVEFLZXkgaGFuZHNoYWtlISBcbiIpKTsKKwkJCQlyZXR1cm4gYlNUQUtleUZyYW1lOworCQkJfQorCQkJZWxzZQorCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1JQyBWQUxJRCBpbiBNc2cxIG9mIFNUQUtleSBoYW5kc2hha2UhIFxuIikpOworI2lmIDEKKwkJCWlmICgocEVhcC0+S2V5RGVzYy5LZXlEYXRhWzBdID09IDB4REQpICYmIChwRWFwLT5LZXlEZXNjLktleURhdGFbMl0gPT0gMHgwMCkgJiYgKHBFYXAtPktleURlc2MuS2V5RGF0YVszXSA9PSAweDBDKQorCQkJCSYmIChwRWFwLT5LZXlEZXNjLktleURhdGFbNF0gPT0gMHg0MykgJiYgKHBFYXAtPktleURlc2MuS2V5RGF0YVs1XSA9PSAweDAyKSkKKwkJCXsKKwkJCQlwQWRkcgkJCT0gcEVhcC0+S2V5RGVzYy5LZXlEYXRhICsgODsJCS8vIFRwZSgxKSwgTGVuKDEpLCBPVUkoMyksIERhdGFUeXBlKDEpLCBSZXNlcnZlZCgyKQorCQkJCXBTVEFLZXkJCQk9IHBFYXAtPktleURlc2MuS2V5RGF0YSArIDE0OwkvLyBUcGUoMSksIExlbigxKSwgT1VJKDMpLCBEYXRhVHlwZSgxKSwgUmVzZXJ2ZWQoMiksIFNUQUtleV9NYWNfQWRkcig2KQorCisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJETFMgLSBSZWNlaXZlIFNUQUtleSBNZXNzYWdlLTEgZnJvbSAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCBMZW49JWxkLCBLZXlEYXRhTGVuPSVkXG4iLAorCQkJCQlwQWRkclswXSwgcEFkZHJbMV0sIHBBZGRyWzJdLCBwQWRkclszXSwgcEFkZHJbNF0sIHBBZGRyWzVdLCBMZW4sIHBFYXAtPktleURlc2MuS2V5RGF0YVsxXSkpOworCisJCQkJYlNUQUtleUZyYW1lID0gVFJVRTsKKwkJCX0KKyNlbHNlCisJCQlpZiAoKHBFYXAtPktleURlc2MuS2V5RGF0YVswXSA9PSAweEREKSAmJiAocEVhcC0+S2V5RGVzYy5LZXlEYXRhWzJdID09IDB4MDApICYmIChwRWFwLT5LZXlEZXNjLktleURhdGFbM10gPT0gMHgwRikKKwkJCQkmJiAocEVhcC0+S2V5RGVzYy5LZXlEYXRhWzRdID09IDB4QUMpICYmIChwRWFwLT5LZXlEZXNjLktleURhdGFbNV0gPT0gMHgwMikpCisJCQl7CisJCQkJcEFkZHIJCQk9IHBFYXAtPktleURlc2MuS2V5RGF0YSArIDg7CQkvLyBUcGUoMSksIExlbigxKSwgT1VJKDMpLCBEYXRhVHlwZSgxKSwgUmVzZXJ2ZWQoMikKKwkJCQlwU1RBS2V5CQkJPSBwRWFwLT5LZXlEZXNjLktleURhdGEgKyAxNDsJLy8gVHBlKDEpLCBMZW4oMSksIE9VSSgzKSwgRGF0YVR5cGUoMSksIFJlc2VydmVkKDIpLCBTVEFLZXlfTWFjX0FkZHIoNikKKworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiRExTIC0gUmVjZWl2ZSBTVEFLZXkgTWVzc2FnZS0xIGZyb20gJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnggTGVuPSVkLCBLZXlEYXRhTGVuPSVkXG4iLAorCQkJCQlwQWRkclswXSwgcEFkZHJbMV0sIHBBZGRyWzJdLCBwQWRkclszXSwgcEFkZHJbNF0sIHBBZGRyWzVdLCBMZW4sIHBFYXAtPktleURlc2MuS2V5RGF0YVsxXSkpOworCisJCQkJYlNUQUtleUZyYW1lID0gVFJVRTsKKwkJCX0KKyNlbmRpZgorCisJCX0KKwkJZWxzZSBpZiAoTGVuID49IChMRU5HVEhfODAyXzExICsgNiArIDIgKyAyICsgc2l6ZW9mKEVBUE9MX1BBQ0tFVCkgLSBNQVhfTEVOX09GX1JTTklFKSkKKwkJeworI2lmIDAKKwkJCVJUTVBNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXIsIHBFYXAtPktleURlc2MuUmVwbGF5Q291bnRlciwgTEVOX0tFWV9ERVNDX1JFUExBWSk7CisKKyNlbmRpZgorCQkJUlRNUE1vdmVNZW1vcnkocEFkLT5TdGFDZmcuRGxzUmVwbGF5Q291bnRlciwgcEVhcC0+S2V5RGVzYy5SZXBsYXlDb3VudGVyLCBMRU5fS0VZX0RFU0NfUkVQTEFZKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiRExTIC0gU25pZmYgcmVwbGF5IGNvdW50ZXIgMiglMDJ4LSUwMngtJTAyeC0lMDJ4LSUwMngtJTAyeC0lMDJ4LSUwMngpIExlbj0lbGQsIEtleURhdGFMZW49JWRcbiIsCisJCQkJcEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlclswXSwgcEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlclsxXSwgcEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlclsyXSwKKwkJCQlwQWQtPlN0YUNmZy5SZXBsYXlDb3VudGVyWzNdLCBwQWQtPlN0YUNmZy5SZXBsYXlDb3VudGVyWzRdLAlwQWQtPlN0YUNmZy5SZXBsYXlDb3VudGVyWzVdLAorCQkJCXBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXJbNl0sIHBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXJbN10sIExlbiwgcEVhcC0+S2V5RGVzYy5LZXlEYXRhWzFdKSk7CisKKwkJfQorCX0KKworCS8vIElmIHRpbWVvdXQgdmFsdWUgaXMgZXF1YWxlZCB0byB6ZXJvLCBpdCBtZWFucyBhbHdheXMgbm90IGJlIHRpbWVvdXQuCisJLy8gdXBkYXRlIGxvY2FsIGRscyB0YWJsZSBlbnRyeQorCWZvciAoaT0gMDsgaSA8IE1BWF9OVU1fT0ZfSU5JVF9ETFNfRU5UUlk7IGkrKykKKwl7CisJCWlmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZCAmJiBNQUNfQUREUl9FUVVBTChwQWRkciwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcikpCisJCXsKKwkJCWlmIChiU1RBS2V5RnJhbWUpCisJCQl7CisJCQkJUE1BQ19UQUJMRV9FTlRSWSBwRW50cnk7CisKKwkJCQkvLyBTVEFLZXkgZnJhbWUsIGFkZCBwYWlyd2lzZSBrZXkgdGFibGUKKwkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPSBETFNfRklOSVNIOworCQkJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVGltZXIsICZUaW1lckNhbmNlbGxlZCk7CisKKwkJCQlQYWlyd2lzZUtleS5LZXlMZW4gPSBMRU5fVEtJUF9FSzsKKwkJCQlOZGlzTW92ZU1lbW9yeShQYWlyd2lzZUtleS5LZXksICZwU1RBS2V5WzBdLCBMRU5fVEtJUF9FSyk7CisJCQkJTmRpc01vdmVNZW1vcnkoUGFpcndpc2VLZXkuVHhNaWMsICZwU1RBS2V5WzE2XSwgTEVOX1RLSVBfUlhNSUNLKTsKKwkJCQlOZGlzTW92ZU1lbW9yeShQYWlyd2lzZUtleS5SeE1pYywgJnBTVEFLZXlbMjRdLCBMRU5fVEtJUF9UWE1JQ0spOworCisJCQkJUGFpcndpc2VLZXkuQ2lwaGVyQWxnID0gcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5DaXBoZXJBbGc7CisKKwkJCQlwRW50cnkgPSBEbHNFbnRyeVRhYmxlTG9va3VwKHBBZCwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkciwgVFJVRSk7CisJCQkJLy9Bc2ljQWRkS2V5RW50cnkocEFkLCAoVVNIT1JUKShpICsgMiksIEJTUzAsIDAsICZQYWlyd2lzZUtleSwgVFJVRSwgVFJVRSk7CS8vIHJlc2VydmUgMCBmb3IgbXVsdGljYXN0LCAxIGZvciB1bmljYXN0CisJCQkJLy9Bc2ljVXBkYXRlUnhXQ0lEVGFibGUocEFkLCAoVVNIT1JUKShpICsgMiksIHBBZGRyKTsKKwkJCQkvLyBBZGQgUGFpci13aXNlIGtleSB0byBBc2ljCisjaWZkZWYgUlQyODcwCisJCQkJeworCQkJCQlSVF9BRERfUEFJUldJU0VfS0VZX0VOVFJZIEtleUluZm87CisJCQkJCUNPUFlfTUFDX0FERFIoS2V5SW5mby5NYWNBZGRyLHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpOworCQkJCQlLZXlJbmZvLk1hY1RhYk1hdGNoV0NJRD1wQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNUYWJNYXRjaFdDSUQ7CisJCQkJCU5kaXNNb3ZlTWVtb3J5KCZLZXlJbmZvLkNpcGhlcktleSwgICZQYWlyd2lzZUtleSxzaXplb2YoQ0lQSEVSX0tFWSkpOworCQkJCQlSVFVTQkVucXVldWVJbnRlcm5hbENtZChwQWQsIFJUX0NNRF9TRVRfS0VZX1RBQkxFLCAmS2V5SW5mbywgc2l6ZW9mKFJUX0FERF9QQUlSV0lTRV9LRVlfRU5UUlkpKTsKKwkJCQl9CisJCQkJeworCQkJCQlQTUFDX1RBQkxFX0VOVFJZIHBETFNFbnRyeTsKKwkJCQkJcERMU0VudHJ5ID0gRGxzRW50cnlUYWJsZUxvb2t1cChwQWQsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIsIFRSVUUpOworCQkJCQlwRExTRW50cnktPlBhaXJ3aXNlS2V5LkNpcGhlckFsZz1QYWlyd2lzZUtleS5DaXBoZXJBbGc7CisJCQkJCVJUVVNCRW5xdWV1ZUludGVybmFsQ21kKHBBZCwgUlRfQ01EX1NFVF9SWF9XQ0lEX1RBQkxFLCBwRExTRW50cnksIHNpemVvZihNQUNfVEFCTEVfRU5UUlkpKTsKKwkJCQl9CisjZW5kaWYgLy8gUlQyODcwIC8vCisJCQkJTmRpc01vdmVNZW1vcnkoJnBFbnRyeS0+UGFpcndpc2VLZXksICZQYWlyd2lzZUtleSwgc2l6ZW9mKENJUEhFUl9LRVkpKTsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkRMUyAtIFJlY2VpdmUgU1RBS2V5IE1lc3NhZ2UtMSAoUGVlciBTVEEgTUFDIEFkZHJlc3MgU1RBS2V5KSBcbiIpKTsKKworCQkJCVJUTVBTZW5kU1RBS2V5SGFuZFNoYWtlKHBBZCwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcik7CisKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkRMUyAtIEZpbmlzaCBTVEFLZXkgaGFuZHNoYWtlIHByb2NlZHVyZSAoSW5pdGlhdG9yIHNpZGUpXG4iKSk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJLy8gRGF0YSBmcmFtZSwgdXBkYXRlIHRpbWVvdXQgdmFsdWUKKwkJCQlpZiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID09IERMU19GSU5JU0gpCisJCQkJeworCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5Db3VudERvd25UaW1lciA9IHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlRpbWVPdXQ7CisJCQkJCS8vQXNpY1VwZGF0ZVJ4V0NJRFRhYmxlKHBBZCwgKFVTSE9SVCkoaSArIDIpLCBwQWRkcik7CisJCQkJfQorCQkJfQorCisJCQliRmluZEVudHJ5ID0gVFJVRTsKKwkJfQorCX0KKworCS8vIHVwZGF0ZSBwZWVyIGRscyB0YWJsZSBlbnRyeQorCWZvciAoaT1NQVhfTlVNX09GX0lOSVRfRExTX0VOVFJZOyBpPE1BWF9OVU1fT0ZfRExTX0VOVFJZOyBpKyspCisJeworCQlpZiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQgJiYgTUFDX0FERFJfRVFVQUwocEFkZHIsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpKQorCQl7CisJCQlpZiAoYlNUQUtleUZyYW1lKQorCQkJeworCQkJCVBNQUNfVEFCTEVfRU5UUlkgcEVudHJ5ID0gTlVMTDsKKworCQkJCS8vIFNUQUtleSBmcmFtZSwgYWRkIHBhaXJ3aXNlIGtleSB0YWJsZSwgYW5kIHNlbmQgU1RBa2V5IE1zZy0yCisJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID0gRExTX0ZJTklTSDsKKwkJCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlRpbWVyLCAmVGltZXJDYW5jZWxsZWQpOworCisJCQkJUGFpcndpc2VLZXkuS2V5TGVuID0gTEVOX1RLSVBfRUs7CisJCQkJTmRpc01vdmVNZW1vcnkoUGFpcndpc2VLZXkuS2V5LCAmcFNUQUtleVswXSwgTEVOX1RLSVBfRUspOworCQkJCU5kaXNNb3ZlTWVtb3J5KFBhaXJ3aXNlS2V5LlR4TWljLCAmcFNUQUtleVsxNl0sIExFTl9US0lQX1JYTUlDSyk7CisJCQkJTmRpc01vdmVNZW1vcnkoUGFpcndpc2VLZXkuUnhNaWMsICZwU1RBS2V5WzI0XSwgTEVOX1RLSVBfVFhNSUNLKTsKKworCQkJCVBhaXJ3aXNlS2V5LkNpcGhlckFsZyA9IHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uQ2lwaGVyQWxnOworCisJCQkJcEVudHJ5ID0gRGxzRW50cnlUYWJsZUxvb2t1cChwQWQsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIsIFRSVUUpOworCQkJCS8vQXNpY0FkZEtleUVudHJ5KHBBZCwgKFVTSE9SVCkoaSArIDIpLCBCU1MwLCAwLCAmUGFpcndpc2VLZXksIFRSVUUsIFRSVUUpOwkvLyByZXNlcnZlIDAgZm9yIG11bHRpY2FzdCwgMSBmb3IgdW5pY2FzdAorCQkJCS8vQXNpY1VwZGF0ZVJ4V0NJRFRhYmxlKHBBZCwgKFVTSE9SVCkoaSArIDIpLCBwQWRkcik7CisJCQkJLy8gQWRkIFBhaXItd2lzZSBrZXkgdG8gQXNpYworI2lmZGVmIFJUMjg3MAorCQkJCXsKKwkJCQkJUlRfQUREX1BBSVJXSVNFX0tFWV9FTlRSWSBLZXlJbmZvOworCQkJCQlDT1BZX01BQ19BRERSKEtleUluZm8uTWFjQWRkcixwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKTsKKwkJCQkJS2V5SW5mby5NYWNUYWJNYXRjaFdDSUQ9cEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjVGFiTWF0Y2hXQ0lEOworCQkJCQlOZGlzTW92ZU1lbW9yeSgmS2V5SW5mby5DaXBoZXJLZXksICAmUGFpcndpc2VLZXksc2l6ZW9mKENJUEhFUl9LRVkpKTsKKwkJCQkJUlRVU0JFbnF1ZXVlSW50ZXJuYWxDbWQocEFkLCBSVF9DTURfU0VUX0tFWV9UQUJMRSwgJktleUluZm8sIHNpemVvZihSVF9BRERfUEFJUldJU0VfS0VZX0VOVFJZKSk7CisJCQkJfQorCQkJCXsKKwkJCQkJUE1BQ19UQUJMRV9FTlRSWSBwRExTRW50cnk7CisJCQkJCXBETFNFbnRyeSA9IERsc0VudHJ5VGFibGVMb29rdXAocEFkLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyLCBUUlVFKTsKKwkJCQkJcERMU0VudHJ5LT5QYWlyd2lzZUtleS5DaXBoZXJBbGc9UGFpcndpc2VLZXkuQ2lwaGVyQWxnOworCQkJCQlSVFVTQkVucXVldWVJbnRlcm5hbENtZChwQWQsIFJUX0NNRF9TRVRfUlhfV0NJRF9UQUJMRSwgcERMU0VudHJ5LCBzaXplb2YoTUFDX1RBQkxFX0VOVFJZKSk7CisJCQkJfQorI2VuZGlmIC8vIFJUMjg3MCAvLworCQkJCU5kaXNNb3ZlTWVtb3J5KCZwRW50cnktPlBhaXJ3aXNlS2V5LCAmUGFpcndpc2VLZXksIHNpemVvZihDSVBIRVJfS0VZKSk7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJETFMgLSBSZWNlaXZlIFNUQUtleSBNZXNzYWdlLTEgKEluaXRpYXRvciBTVEEgTUFDIEFkZHJlc3MgU1RBS2V5KVxuIikpOworCisJCQkJLy8gSWYgc3VwcG9ydCBXUEEgb3IgV1BBMiwgc3RhcnQgU1RBS2V5IGhhbmQgc2hha2UsCisJCQkJLy8gSWYgZmFpbGVkIGhhbmQgc2hha2UsIGp1c3QgdGVhciBkb3duIHBlZXIgRExTCisJCQkJaWYgKFJUTVBTZW5kU1RBS2V5SGFuZFNoYWtlKHBBZCwgcEFkZHIpICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJCQkJeworCQkJCQlNTE1FX0RMU19SRVFfU1RSVUNUCU1sbWVEbHNSZXE7CisJCQkJCVVTSE9SVAkJCQlyZWFzb24gPSBSRUFTT05fUU9TX0NJUEhFUl9OT1RfU1VQUE9SVDsKKworCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZAk9IEZBTFNFOworCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMJPSBETFNfTk9ORTsKKwkJCQkJRGxzUGFybUZpbGwocEFkLCAmTWxtZURsc1JlcSwgJnBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLCByZWFzb24pOworCQkJCQlNbG1lRW5xdWV1ZShwQWQsIERMU19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9ETFNfVEVBUl9ET1dOLCBzaXplb2YoTUxNRV9ETFNfUkVRX1NUUlVDVCksICZNbG1lRGxzUmVxKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJETFMgLSBGaW5pc2ggU1RBS2V5IGhhbmRzaGFrZSBwcm9jZWR1cmUgKFBlZXIgc2lkZSlcbiIpKTsKKwkJCQl9CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJLy8gRGF0YSBmcmFtZSwgdXBkYXRlIHRpbWVvdXQgdmFsdWUKKwkJCQlpZiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID09IERMU19GSU5JU0gpCisJCQkJeworCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5Db3VudERvd25UaW1lciA9IHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlRpbWVPdXQ7CisJCQkJfQorCQkJfQorCisJCQliRmluZEVudHJ5ID0gVFJVRTsKKwkJfQorCX0KKworCisJcmV0dXJuIGJTVEFLZXlGcmFtZTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUJRGVzY3JpcHRpb246CisJCUNoZWNrIGlmIHRoZSBmcmFtZSBjYW4gYmUgc2VudCB0aHJvdWdoIERMUyBkaXJlY3QgbGluayBpbnRlcmZhY2UKKworCUFyZ3VtZW50czoKKwkJcEFkCQlQb2ludGVyCXRvIGFkYXB0ZXIKKworCVJldHVybiBWYWx1ZToKKwkJRExTIGVudHJ5IGluZGV4CisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UCVJUTVBDaGVja0RMU0ZyYW1lKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOICBQVUNIQVIgICAgICAgICAgcERBKQoreworCUlOVCBydmFsID0gLTE7CisJSU5UCWk7CisKKwlpZiAoIXBBZC0+Q29tbW9uQ2ZnLmJETFNDYXBhYmxlKQorCQlyZXR1cm4gcnZhbDsKKworCWlmICghSU5GUkFfT04ocEFkKSkKKwkJcmV0dXJuIHJ2YWw7CisKKwlkb3sKKwkJLy8gY2hlY2sgbG9jYWwgZGxzIHRhYmxlIGVudHJ5CisJCWZvciAoaT0wOyBpPE1BWF9OVU1fT0ZfSU5JVF9ETFNfRU5UUlk7IGkrKykKKwkJeworCQkJaWYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkICYmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPT0gRExTX0ZJTklTSCkgJiYKKwkJCQlNQUNfQUREUl9FUVVBTChwREEsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpKQorCQkJeworCQkJCXJ2YWwgPSBpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJLy8gY2hlY2sgcGVlciBkbHMgdGFibGUgZW50cnkKKwkJZm9yIChpPU1BWF9OVU1fT0ZfSU5JVF9ETFNfRU5UUlk7IGk8TUFYX05VTV9PRl9ETFNfRU5UUlk7IGkrKykKKwkJeworCQkJaWYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkICYmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPT0gRExTX0ZJTklTSCkgJiYKKwkJCQlNQUNfQUREUl9FUVVBTChwREEsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpKQorCQkJeworCQkJCXJ2YWwgPSBpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfSB3aGlsZSAoRkFMU0UpOworCisJcmV0dXJuIHJ2YWw7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBSVE1QU2VuZERMU1RlYXJEb3duRnJhbWUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4gIFBVQ0hBUiAgICAgICAgICBwREEpCit7CisJUFVDSEFSCQkJcE91dEJ1ZmZlciA9IE5VTEw7CisJTkRJU19TVEFUVVMJCU5TdGF0dXM7CisJSEVBREVSXzgwMl8xMQlEbHNUZWFyRG93bkhkcjsKKwlVTE9ORwkJCUZyYW1lTGVuID0gMDsKKwlVU0hPUlQJCQlSZWFzb24gPSBSRUFTT05fUU9TX1FTVEFfTEVBVklOR19RQlNTOworCVVDSEFSCQkJQ2F0ZWdvcnkgPSBDQVRFR09SWV9ETFM7CisJVUNIQVIJCQlBY3Rpb24gPSBBQ1RJT05fRExTX1RFQVJET1dOOworCVVDSEFSCQkJaSA9IDA7CisKKwlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTKSB8fAorCQlSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUykpCisJCXJldHVybjsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNlbmQgRExTIFRlYXJEb3duIEZyYW1lIFxuIikpOworCisJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKKwlpZiAoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJBU1NPQyAtIFJUTVBTZW5kRExTVGVhckRvd25GcmFtZSgpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWQgXG4iKSk7CisJCXJldHVybjsKKwl9CisKKwlBY3RIZWFkZXJJbml0KHBBZCwgJkRsc1RlYXJEb3duSGRyLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgcEFkLT5DdXJyZW50QWRkcmVzcywgcEFkLT5Db21tb25DZmcuQnNzaWQpOworCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsCQkJCSZGcmFtZUxlbiwKKwkJCQkJc2l6ZW9mKEhFQURFUl84MDJfMTEpLAkJJkRsc1RlYXJEb3duSGRyLAorCQkJCQkxLAkJCQkJCQkmQ2F0ZWdvcnksCisJCQkJCTEsCQkJCQkJCSZBY3Rpb24sCisJCQkJCTYsCQkJCQkJCXBEQSwKKwkJCQkJNiwJCQkJCQkJcEFkLT5DdXJyZW50QWRkcmVzcywKKwkJCQkJMiwJCQkJCQkJJlJlYXNvbiwKKwkJCQkJRU5EX09GX0FSR1MpOworCisJTWluaXBvcnRNTVJlcXVlc3QocEFkLCAwLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7CisJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKKworCS8vIFJlbW92ZSBrZXkgaW4gbG9jYWwgZGxzIHRhYmxlIGVudHJ5CisJZm9yIChpID0gMDsgaSA8IE1BWF9OVU1fT0ZfSU5JVF9ETFNfRU5UUlk7IGkrKykKKwl7CisJCWlmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZCAmJiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID09IERMU19GSU5JU0gpCisJCQkmJiBNQUNfQUREUl9FUVVBTChwREEsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpKQorCQl7CisJCQlNYWNUYWJsZURlbGV0ZURsc0VudHJ5KHBBZCwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjVGFiTWF0Y2hXQ0lELCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKTsKKwkJfQorCX0KKworCS8vIFJlbW92ZSBrZXkgaW4gcGVlciBkbHMgdGFibGUgZW50cnkKKwlmb3IgKGk9TUFYX05VTV9PRl9JTklUX0RMU19FTlRSWTsgaTxNQVhfTlVNX09GX0RMU19FTlRSWTsgaSsrKQorCXsKKwkJaWYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkICYmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPT0gRExTX0ZJTklTSCkKKwkJCSYmIE1BQ19BRERSX0VRVUFMKHBEQSwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcikpCisJCXsKKwkJCU1hY1RhYmxlRGVsZXRlRGxzRW50cnkocEFkLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNUYWJNYXRjaFdDSUQsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpOworCQl9CisJfQorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2VuZCBETFMgVGVhckRvd24gRnJhbWUgYW5kIHJlbW92ZSBrZXkgaW4gKGk9JWQpIFxuIiwgaSkpOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK05ESVNfU1RBVFVTIFJUTVBTZW5kU1RBS2V5UmVxdWVzdCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlwREEpCit7CisJVUNIQVIJCQkJSGVhZGVyODAyXzNbMTRdOworCU5ESVNfU1RBVFVTCQkJTlN0YXR1czsKKwlVTE9ORwkJCQlGcmFtZUxlbiA9IDA7CisJRUFQT0xfUEFDS0VUCQlQYWNrZXQ7CisJVUNIQVIJCQkJTWljWzE2XTsKKwlVQ0hBUgkJCQlkaWdlc3RbODBdOworCVBVQ0hBUgkJCQlwT3V0QnVmZmVyID0gTlVMTDsKKwlQTkRJU19QQUNLRVQJCXBOZGlzUGFja2V0OworCVVDSEFSCQkJCXRlbXBbNjRdOworCVVDSEFSCQkJCURsc1BUS1s4MF07CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkRMUyAtIFJUTVBTZW5kU1RBS2V5UmVxdWVzdCgpIHRvICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLCBwREFbMF0sIHBEQVsxXSwgcERBWzJdLCBwREFbM10sIHBEQVs0XSwgcERBWzVdKSk7CisKKwlwQWQtPlNlcXVlbmNlICsrOworCU1BS0VfODAyXzNfSEVBREVSKEhlYWRlcjgwMl8zLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgcEFkLT5DdXJyZW50QWRkcmVzcywgRUFQT0wpOworCisJLy8gWmVybyBtZXNzYWdlIGJvZHkKKwlOZGlzWmVyb01lbW9yeSgmUGFja2V0LCBzaXplb2YoUGFja2V0KSk7CisJUGFja2V0LlByb1ZlciA9IEVBUE9MX1ZFUjsKKwlQYWNrZXQuUHJvVHlwZSAgICA9IEVBUE9MS2V5OworCVBhY2tldC5Cb2R5X0xlblsxXSAgPSBzaXplb2YoS0VZX0RFU0NSSVBURVIpIC0gTUFYX0xFTl9PRl9SU05JRSArIDYgKyBNQUNfQUREUl9MRU47CQkvLyBkYXRhIGZpZWxkIGNvbnRhaW4gS0RFIGFuZFBlZXIgTUFDIGFkZHJlc3MKKworCS8vIFNUQUtleSBNZXNzYWdlIGlzIGFzIEVBUE9MLUtleSgxLDEsMCwwLEcvMCwwLDAsIE1JQywgMCxQZWVyIE1BQyBLREUpCisJaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpIHx8IChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spKQorICAgIHsKKyAgICAgICAgUGFja2V0LktleURlc2MuVHlwZSA9IFdQQTFfS0VZX0RFU0M7CisgICAgfQorICAgIGVsc2UgaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyKSB8fCAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykpCisgICAgeworICAgICAgICBQYWNrZXQuS2V5RGVzYy5UeXBlID0gV1BBMl9LRVlfREVTQzsKKyAgICB9CisKKwkvLyBLZXkgZGVzY3JpcHRvciB2ZXJzaW9uCisJUGFja2V0LktleURlc2MuS2V5SW5mby5LZXlEZXNjVmVyID0KKwkJKCgocEFkLT5TdGFDZmcuUGFpckNpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKSB8fCAocEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkpID8gKERFU0NfVFlQRV9BRVMpIDogKERFU0NfVFlQRV9US0lQKSk7CisKKwlQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLktleU1pYwk9IDE7CisJUGFja2V0LktleURlc2MuS2V5SW5mby5TZWN1cmUJPSAxOworCVBhY2tldC5LZXlEZXNjLktleUluZm8uUmVxdWVzdAk9IDE7CisKKwlQYWNrZXQuS2V5RGVzYy5LZXlEYXRhTGVuWzFdCT0gMTI7CisKKwkvLyB1c2Ugb3VyIG93biBPVUkgdG8gZGlzdGluZ3Vpc2ggcHJvcHJpZXRhcnkgd2l0aCBzdGFuZGFyZC4KKwlQYWNrZXQuS2V5RGVzYy5LZXlEYXRhWzBdCQk9IDB4REQ7CisJUGFja2V0LktleURlc2MuS2V5RGF0YVsxXQkJPSAweDBBOworCVBhY2tldC5LZXlEZXNjLktleURhdGFbMl0JCT0gMHgwMDsKKwlQYWNrZXQuS2V5RGVzYy5LZXlEYXRhWzNdCQk9IDB4MEM7CisJUGFja2V0LktleURlc2MuS2V5RGF0YVs0XQkJPSAweDQzOworCVBhY2tldC5LZXlEZXNjLktleURhdGFbNV0JCT0gMHgwMzsKKwlOZGlzTW92ZU1lbW9yeSgmUGFja2V0LktleURlc2MuS2V5RGF0YVs2XSwgcERBLCBNQUNfQUREUl9MRU4pOworCisJTmRpc01vdmVNZW1vcnkoUGFja2V0LktleURlc2MuUmVwbGF5Q291bnRlciwgcEFkLT5TdGFDZmcuRGxzUmVwbGF5Q291bnRlciwgTEVOX0tFWV9ERVNDX1JFUExBWSk7CisKKwkvLyBBbGxvY2F0ZSBidWZmZXIgZm9yIHRyYW5zbWl0dGluZyBtZXNzYWdlCisJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsKKwlpZiAoTlN0YXR1cwkhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCQlyZXR1cm4gTlN0YXR1czsKKworCS8vIFByZXBhcmUgRUFQT0wgZnJhbWUgZm9yIE1JQyBjYWxjdWxhdGlvbgorCS8vIEJlIGNhcmVmdWwsIG9ubHkgRUFQT0wgZnJhbWUgaXMgY291bnRlZCBmb3IgTUlDIGNhbGN1bGF0aW9uCisJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICAgICZGcmFtZUxlbiwKKwkJICAgICAgICAgICAgICBQYWNrZXQuQm9keV9MZW5bMV0gKyA0LCAgICAmUGFja2V0LAorCQkgICAgICAgICAgICAgIEVORF9PRl9BUkdTKTsKKworCS8vIHVzZSBwcm9wcmlldGFyeSBQVEsKKwlOZGlzWmVyb01lbW9yeSh0ZW1wLCA2NCk7CisJTmRpc01vdmVNZW1vcnkodGVtcCwgIklFRUU4MDIuMTEgV0lSRUxFU1MgQUNDRVNTIFBPSU5UIiwgMzIpOworCVdwYUNvdW50UFRLKHBBZCwgdGVtcCwgdGVtcCwgcEFkLT5Db21tb25DZmcuQnNzaWQsIHRlbXAsIHBBZC0+Q3VycmVudEFkZHJlc3MsIERsc1BUSywgTEVOX1BUSyk7CisKKwkvLyBjYWxjdWxhdGUgTUlDCisJaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQorCXsKKwkJLy8gQUVTCisJCU5kaXNaZXJvTWVtb3J5KGRpZ2VzdCwJc2l6ZW9mKGRpZ2VzdCkpOworCQlITUFDX1NIQTEocE91dEJ1ZmZlciwgRnJhbWVMZW4sIERsc1BUSywgTEVOX0VBUF9NSUNLLCBkaWdlc3QpOworCQlOZGlzTW92ZU1lbW9yeShQYWNrZXQuS2V5RGVzYy5LZXlNaWMsIGRpZ2VzdCwgTEVOX0tFWV9ERVNDX01JQyk7CisJfQorCWVsc2UKKwl7CisJCU5kaXNaZXJvTWVtb3J5KE1pYywJc2l6ZW9mKE1pYykpOworCQlobWFjX21kNShEbHNQVEssIExFTl9FQVBfTUlDSywgcE91dEJ1ZmZlciwgRnJhbWVMZW4sIE1pYyk7CisJCU5kaXNNb3ZlTWVtb3J5KFBhY2tldC5LZXlEZXNjLktleU1pYywgTWljLCBMRU5fS0VZX0RFU0NfTUlDKTsKKwl9CisKKwlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAgICAgICAgICAgJkZyYW1lTGVuLAorCSAgICAgICAgICAgICAgICAgIHNpemVvZihIZWFkZXI4MDJfMyksCUhlYWRlcjgwMl8zLAorCQkgICAgICAgICAgICAgIFBhY2tldC5Cb2R5X0xlblsxXSArIDQsCSZQYWNrZXQsCisJCSAgICAgICAgICAgICAgRU5EX09GX0FSR1MpOworCisJTlN0YXR1cyA9IFJUTVBBbGxvY2F0ZU5kaXNQYWNrZXQocEFkLCAmcE5kaXNQYWNrZXQsIE5VTEwsIDAsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKKwlpZiAoTlN0YXR1cyA9PSBORElTX1NUQVRVU19TVUNDRVNTKQorCXsKKwkJUlRNUF9TRVRfUEFDS0VUX1dDSUQocE5kaXNQYWNrZXQsIEJTU0lEX1dDSUQpOworCQlTVEFTZW5kUGFja2V0KHBBZCwgcE5kaXNQYWNrZXQpOworCQlSVE1QRGVRdWV1ZVBhY2tldChwQWQsIEZBTFNFLCBOVU1fT0ZfVFhfUklORywgTUFYX1RYX1BST0NFU1MpOworCX0KKworCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVE1QU2VuZFNUQUtleVJlcXVlc3QtIFNlbmQgU1RBS2V5IHJlcXVlc3QgKE5TdGF0dXM9JXgsIEZyYW1lTGVuPSVsZClcbiIsIE5TdGF0dXMsIEZyYW1lTGVuKSk7CisKKwlyZXR1cm4gTlN0YXR1czsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitORElTX1NUQVRVUyBSVE1QU2VuZFNUQUtleUhhbmRTaGFrZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlwREEpCit7CisJVUNIQVIJCQkJSGVhZGVyODAyXzNbMTRdOworCU5ESVNfU1RBVFVTCQkJTlN0YXR1czsKKwlVTE9ORwkJCQlGcmFtZUxlbiA9IDA7CisJRUFQT0xfUEFDS0VUCQlQYWNrZXQ7CisJVUNIQVIJCQkJTWljWzE2XTsKKwlVQ0hBUgkJCQlkaWdlc3RbODBdOworCVBVQ0hBUgkJCQlwT3V0QnVmZmVyID0gTlVMTDsKKwlQTkRJU19QQUNLRVQJCXBOZGlzUGFja2V0OworCVVDSEFSCQkJCXRlbXBbNjRdOworCVVDSEFSCQkJCURsc1BUS1s4MF07CQkJLy8gRHVlIHRvIGRpcnZlciBjYW4gbm90IGdldCBQVEssIHVzZSBwcm9wcmlldGFyeSBQVEsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiRExTIC0gUlRNUFNlbmRTVEFLZXlIYW5kU2hha2UoKSB0byAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwgcERBWzBdLCBwREFbMV0sIHBEQVsyXSwgcERBWzNdLCBwREFbNF0sIHBEQVs1XSkpOworCisJcEFkLT5TZXF1ZW5jZSArKzsKKwlNQUtFXzgwMl8zX0hFQURFUihIZWFkZXI4MDJfMywgcEFkLT5Db21tb25DZmcuQnNzaWQsIHBBZC0+Q3VycmVudEFkZHJlc3MsIEVBUE9MKTsKKworCS8vIFplcm8gbWVzc2FnZSBib2R5CisJTmRpc1plcm9NZW1vcnkoJlBhY2tldCwgc2l6ZW9mKFBhY2tldCkpOworCVBhY2tldC5Qcm9WZXIgPSBFQVBPTF9WRVI7CisJUGFja2V0LlByb1R5cGUgICAgPSBFQVBPTEtleTsKKwlQYWNrZXQuQm9keV9MZW5bMV0gID0gc2l6ZW9mKEtFWV9ERVNDUklQVEVSKSAtIE1BWF9MRU5fT0ZfUlNOSUUgKyA2ICsgTUFDX0FERFJfTEVOOwkJLy8gZGF0YSBmaWVsZCBjb250YWluIEtERSBhbmQgUGVlciBNQUMgYWRkcmVzcworCisJLy8gU1RBS2V5IE1lc3NhZ2UgaXMgYXMgRUFQT0wtS2V5KDEsMSwwLDAsRy8wLDAsMCwgTUlDLCAwLFBlZXIgTUFDIEtERSkKKwlpZiAoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkgfHwgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykpCisgICAgeworICAgICAgICBQYWNrZXQuS2V5RGVzYy5UeXBlID0gV1BBMV9LRVlfREVTQzsKKyAgICB9CisgICAgZWxzZSBpZiAoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIpIHx8IChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKSkKKyAgICB7CisgICAgICAgIFBhY2tldC5LZXlEZXNjLlR5cGUgPSBXUEEyX0tFWV9ERVNDOworICAgIH0KKworCS8vIEtleSBkZXNjcmlwdG9yIHZlcnNpb24KKwlQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLktleURlc2NWZXIgPQorCQkoKChwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpIHx8IChwQWQtPlN0YUNmZy5Hcm91cENpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKSkgPyAoREVTQ19UWVBFX0FFUykgOiAoREVTQ19UWVBFX1RLSVApKTsKKworCVBhY2tldC5LZXlEZXNjLktleUluZm8uS2V5TWljCT0gMTsKKwlQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLlNlY3VyZQk9IDE7CisKKwlQYWNrZXQuS2V5RGVzYy5LZXlEYXRhTGVuWzFdCT0gMTI7CisKKwkvLyB1c2Ugb3VyIG93biBPVUkgdG8gZGlzdGluZ3Vpc2ggcHJvcHJpZXRhcnkgd2l0aCBzdGFuZGFyZC4KKwlQYWNrZXQuS2V5RGVzYy5LZXlEYXRhWzBdCQk9IDB4REQ7CisJUGFja2V0LktleURlc2MuS2V5RGF0YVsxXQkJPSAweDBBOworCVBhY2tldC5LZXlEZXNjLktleURhdGFbMl0JCT0gMHgwMDsKKwlQYWNrZXQuS2V5RGVzYy5LZXlEYXRhWzNdCQk9IDB4MEM7CisJUGFja2V0LktleURlc2MuS2V5RGF0YVs0XQkJPSAweDQzOworCVBhY2tldC5LZXlEZXNjLktleURhdGFbNV0JCT0gMHgwMzsKKwlOZGlzTW92ZU1lbW9yeSgmUGFja2V0LktleURlc2MuS2V5RGF0YVs2XSwgcERBLCBNQUNfQUREUl9MRU4pOworCisJTmRpc01vdmVNZW1vcnkoUGFja2V0LktleURlc2MuUmVwbGF5Q291bnRlciwgcEFkLT5TdGFDZmcuRGxzUmVwbGF5Q291bnRlciwgTEVOX0tFWV9ERVNDX1JFUExBWSk7CisKKwkvLyBBbGxvY2F0ZSBidWZmZXIgZm9yIHRyYW5zbWl0dGluZyBtZXNzYWdlCisJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsKKwlpZiAoTlN0YXR1cwkhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCQlyZXR1cm4gTlN0YXR1czsKKworCS8vIFByZXBhcmUgRUFQT0wgZnJhbWUgZm9yIE1JQyBjYWxjdWxhdGlvbgorCS8vIEJlIGNhcmVmdWwsIG9ubHkgRUFQT0wgZnJhbWUgaXMgY291bnRlZCBmb3IgTUlDIGNhbGN1bGF0aW9uCisJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICAgICZGcmFtZUxlbiwKKwkJICAgICAgICAgICAgICBQYWNrZXQuQm9keV9MZW5bMV0gKyA0LCAgICAmUGFja2V0LAorCQkgICAgICAgICAgICAgIEVORF9PRl9BUkdTKTsKKworCS8vIHVzZSBwcm9wcmlldGFyeSBQVEsKKwlOZGlzWmVyb01lbW9yeSh0ZW1wLCA2NCk7CisJTmRpc01vdmVNZW1vcnkodGVtcCwgIklFRUU4MDIuMTEgV0lSRUxFU1MgQUNDRVNTIFBPSU5UIiwgMzIpOworCVdwYUNvdW50UFRLKHBBZCwgdGVtcCwgdGVtcCwgcEFkLT5Db21tb25DZmcuQnNzaWQsIHRlbXAsIHBBZC0+Q3VycmVudEFkZHJlc3MsIERsc1BUSywgTEVOX1BUSyk7CisKKwkvLyBjYWxjdWxhdGUgTUlDCisJaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQorCXsKKwkJLy8gQUVTCisJCU5kaXNaZXJvTWVtb3J5KGRpZ2VzdCwJc2l6ZW9mKGRpZ2VzdCkpOworCQlITUFDX1NIQTEocE91dEJ1ZmZlciwgRnJhbWVMZW4sIERsc1BUSywgTEVOX0VBUF9NSUNLLCBkaWdlc3QpOworCQlOZGlzTW92ZU1lbW9yeShQYWNrZXQuS2V5RGVzYy5LZXlNaWMsIGRpZ2VzdCwgTEVOX0tFWV9ERVNDX01JQyk7CisJfQorCWVsc2UKKwl7CisJCU5kaXNaZXJvTWVtb3J5KE1pYywJc2l6ZW9mKE1pYykpOworCQlobWFjX21kNShEbHNQVEssIExFTl9FQVBfTUlDSywgcE91dEJ1ZmZlciwgRnJhbWVMZW4sIE1pYyk7CisJCU5kaXNNb3ZlTWVtb3J5KFBhY2tldC5LZXlEZXNjLktleU1pYywgTWljLCBMRU5fS0VZX0RFU0NfTUlDKTsKKwl9CisKKwlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAgICAgICAgICAgJkZyYW1lTGVuLAorCSAgICAgICAgICAgICAgICAgIHNpemVvZihIZWFkZXI4MDJfMyksCUhlYWRlcjgwMl8zLAorCQkgICAgICAgICAgICAgIFBhY2tldC5Cb2R5X0xlblsxXSArIDQsCSZQYWNrZXQsCisJCSAgICAgICAgICAgICAgRU5EX09GX0FSR1MpOworCisJTlN0YXR1cyA9IFJUTVBBbGxvY2F0ZU5kaXNQYWNrZXQocEFkLCAmcE5kaXNQYWNrZXQsIE5VTEwsIDAsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKKwlpZiAoTlN0YXR1cyA9PSBORElTX1NUQVRVU19TVUNDRVNTKQorCXsKKwkJUlRNUF9TRVRfUEFDS0VUX1dDSUQocE5kaXNQYWNrZXQsIEJTU0lEX1dDSUQpOworCQlTVEFTZW5kUGFja2V0KHBBZCwgcE5kaXNQYWNrZXQpOworCQlSVE1QRGVRdWV1ZVBhY2tldChwQWQsIEZBTFNFLCBOVU1fT0ZfVFhfUklORywgTUFYX1RYX1BST0NFU1MpOworCX0KKworCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVE1QU2VuZFNUQUtleUhhbmRTaGFrZS0gU2VuZCBTVEFLZXkgTWVzc2FnZS0yIChOU3RhdHVzPSV4LCBGcmFtZUxlbj0lbGQpXG4iLCBOU3RhdHVzLCBGcmFtZUxlbikpOworCisJcmV0dXJuIE5TdGF0dXM7Cit9CisKK1ZPSUQgRGxzVGltZW91dEFjdGlvbigKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCisJSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpCit7CisJTUxNRV9ETFNfUkVRX1NUUlVDVAkJTWxtZURsc1JlcTsKKwlVU0hPUlQJCQkJCXJlYXNvbjsKKwlQUlRfODAyXzExX0RMUwkJCXBETFMgPSAoUFJUXzgwMl8xMV9ETFMpRnVuY3Rpb25Db250ZXh0OworCVBSVE1QX0FEQVBURVIJCQlwQWQgPSBwRExTLT5wQWQ7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJEbHNUaW1lb3V0IC0gVGVhciBkb3duIERMUyBsaW5rcyAoJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMngpXG4iLAorCQlwRExTLT5NYWNBZGRyWzBdLCBwRExTLT5NYWNBZGRyWzFdLCBwRExTLT5NYWNBZGRyWzJdLCBwRExTLT5NYWNBZGRyWzNdLCBwRExTLT5NYWNBZGRyWzRdLCBwRExTLT5NYWNBZGRyWzVdKSk7CisKKwlpZiAoKHBETFMpICYmIChwRExTLT5WYWxpZCkpCisJeworCQlyZWFzb24JCQk9IFJFQVNPTl9RT1NfUkVRVUVTVF9USU1FT1VUOworCQlwRExTLT5WYWxpZAkJPSBGQUxTRTsKKwkJcERMUy0+U3RhdHVzCT0gRExTX05PTkU7CisJCURsc1Bhcm1GaWxsKHBBZCwgJk1sbWVEbHNSZXEsIHBETFMsIHJlYXNvbik7CisJCU1sbWVFbnF1ZXVlKHBBZCwgRExTX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX0RMU19URUFSX0RPV04sIHNpemVvZihNTE1FX0RMU19SRVFfU1RSVUNUKSwgJk1sbWVEbHNSZXEpOworCQlSVDI4WFhfTUxNRV9IQU5ETEVSKHBBZCk7CisJfQorfQorCisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorRGVzY3JpcHRpb24gOiBiZWNhdXNlIERMUyBhbmQgQ0xJIHNoYXJlIHRoZSBzYW1lIFdDSUQgdGFibGUgaW4gQVNJQy4KK01lc2ggZW50cnkgYWxzbyBpbnNlcnQgdG8gcEFkLT5NYWNUYWIuY29udGVudFtdLiAgU3VjaCBpcyBtYXJrZWQgYXMgVmFsaWRBc0RscyA9IFRSVUUuCitBbHNvIGZpbGxzIHRoZSBwYWlyd2lzZSBrZXkuCitCZWNhdXNlIGZyb250IE1BWF9BSURfQkEgZW50cmllcyBoYXZlIGRpcmVjdCBtYXBwaW5nIHRvIEJBRW50cnksIHdoaWNoIGlzIG9ubHkgdXNlZCBhcyBDTEkuIFNvIHdlIGluc2VydCBEbHMKK2Zyb20gaW5kZXggTUFYX0FJRF9CQS4KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitNQUNfVEFCTEVfRU5UUlkgKk1hY1RhYmxlSW5zZXJ0RGxzRW50cnkoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFBVQ0hBUglwQWRkciwKKwlJTiAgVUlOVAlEbHNFbnRyeUlkeCkKK3sKKwlQTUFDX1RBQkxFX0VOVFJZIHBFbnRyeSA9IE5VTEw7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT09PiBNYWNUYWJsZUluc2VydERsc0VudHJ5XG4iKSk7CisJLy8gaWYgRlVMTCwgcmV0dXJuCisJaWYgKHBBZC0+TWFjVGFiLlNpemUgPj0gTUFYX0xFTl9PRl9NQUNfVEFCTEUpCisJCXJldHVybiBOVUxMOworCisJZG8KKwl7CisJCWlmKChwRW50cnkgPSBEbHNFbnRyeVRhYmxlTG9va3VwKHBBZCwgcEFkZHIsIFRSVUUpKSAhPSBOVUxMKQorCQkJYnJlYWs7CisKKwkJLy8gYWxsb2NhdGUgb25lIE1BQyBlbnRyeQorCQlwRW50cnkgPSBNYWNUYWJsZUluc2VydEVudHJ5KHBBZCwgcEFkZHIsIERsc0VudHJ5SWR4ICsgTUlOX05FVF9ERVZJQ0VfRk9SX0RMUywgVFJVRSk7CisJCWlmIChwRW50cnkpCisJCXsKKwkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W0Rsc0VudHJ5SWR4XS5NYWNUYWJNYXRjaFdDSUQgPSBwRW50cnktPkFpZDsKKwkJCXBFbnRyeS0+TWF0Y2hEbHNFbnRyeUlkeCA9IERsc0VudHJ5SWR4OworCQkJcEVudHJ5LT5BdXRoTW9kZSA9IHBBZC0+U3RhQ2ZnLkF1dGhNb2RlOworCQkJcEVudHJ5LT5XZXBTdGF0dXMgPSBwQWQtPlN0YUNmZy5XZXBTdGF0dXM7CisJCQlwRW50cnktPlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQ7CisKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1hY1RhYmxlSW5zZXJ0RGxzRW50cnkgLSBhbGxvY2F0ZSBlbnRyeSAjJWQsIFRvdGFsPSAlZFxuIixwRW50cnktPkFpZCwgcEFkLT5NYWNUYWIuU2l6ZSkpOworCisJCQkvLyBJZiBsZWdhY3kgV0VQIGlzIHVzZWQsIHNldCBwYWlyLXdpc2UgY2lwaGVyQWxnIGludG8gV0NJRCBhdHRyaWJ1dGUgdGFibGUgZm9yIHRoaXMgZW50cnkKKwkJCWlmICgocEVudHJ5LT5WYWxpZEFzRGxzKSAmJiAocEVudHJ5LT5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMVdFUEVuYWJsZWQpKQorCQkJeworCQkJCVVDSEFSIEtleUlkeCA9IDA7CisJCQkJVUNIQVIgQ2lwaGVyQWxnID0gMDsKKworCQkJCUtleUlkeAk9IHBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZDsKKworCQkJCUNpcGhlckFsZyAJPSBwQWQtPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLkNpcGhlckFsZzsKKworCQkJCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkocEFkLAorCQkJCQkJCQkJCQlCU1MwLAorCQkJCQkJCQkJCQlwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQsCisJCQkJCQkJCQkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uQ2lwaGVyQWxnLAorCQkJCQkJCQkJCQlwRW50cnkpOworCQkJfQorCisJCQlicmVhazsKKwkJfQorCX0gd2hpbGUoRkFMU0UpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPD09PT0gTWFjVGFibGVJbnNlcnREbHNFbnRyeVxuIikpOworCisJcmV0dXJuIHBFbnRyeTsKK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCURlbGV0ZSBhbGwgTWVzaCBFbnRyeSBpbiBwQWQtPk1hY1RhYgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK0JPT0xFQU4gTWFjVGFibGVEZWxldGVEbHNFbnRyeSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVU0hPUlQgd2NpZCwKKwlJTiBQVUNIQVIgcEFkZHIpCit7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PT4gTWFjVGFibGVEZWxldGVEbHNFbnRyeVxuIikpOworCisJaWYgKCFWQUxJRF9XQ0lEKHdjaWQpKQorCQlyZXR1cm4gRkFMU0U7CisKKwlNYWNUYWJsZURlbGV0ZUVudHJ5KHBBZCwgd2NpZCwgcEFkZHIpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPD09PT0gTWFjVGFibGVEZWxldGVEbHNFbnRyeVxuIikpOworCisJcmV0dXJuIFRSVUU7Cit9CisKK01BQ19UQUJMRV9FTlRSWSAqRGxzRW50cnlUYWJsZUxvb2t1cCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBQVUNIQVIJcEFkZHIsCisJSU4gQk9PTEVBTgliUmVzZXRJZGVsQ291bnQpCit7CisJVUxPTkcgSGFzaElkeDsKKwlNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeSA9IE5VTEw7CisKKwlSVE1QX1NFTV9MT0NLKCZwQWQtPk1hY1RhYkxvY2spOworCUhhc2hJZHggPSBNQUNfQUREUl9IQVNIX0lOREVYKHBBZGRyKTsKKwlwRW50cnkgPSBwQWQtPk1hY1RhYi5IYXNoW0hhc2hJZHhdOworCisJd2hpbGUgKHBFbnRyeSkKKwl7CisJCWlmICgocEVudHJ5LT5WYWxpZEFzRGxzID09IFRSVUUpCisJCQkmJiBNQUNfQUREUl9FUVVBTChwRW50cnktPkFkZHIsIHBBZGRyKSkKKwkJeworCQkJaWYoYlJlc2V0SWRlbENvdW50KQorCQkJCXBFbnRyeS0+Tm9EYXRhSWRsZUNvdW50ID0gMDsKKwkJCWJyZWFrOworCQl9CisJCWVsc2UKKwkJCXBFbnRyeSA9IHBFbnRyeS0+cE5leHQ7CisJfQorCisJUlRNUF9TRU1fVU5MT0NLKCZwQWQtPk1hY1RhYkxvY2spOworCXJldHVybiBwRW50cnk7Cit9CisKK01BQ19UQUJMRV9FTlRSWSAqRGxzRW50cnlUYWJsZUxvb2t1cEJ5V2NpZCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVQ0hBUgl3Y2lkLAorCUlOIFBVQ0hBUglwQWRkciwKKwlJTiBCT09MRUFOCWJSZXNldElkZWxDb3VudCkKK3sKKwlVTE9ORyBETHNJbmRleDsKKwlQTUFDX1RBQkxFX0VOVFJZIHBDdXJFbnRyeSA9IE5VTEw7CisJUE1BQ19UQUJMRV9FTlRSWSBwRW50cnkgPSBOVUxMOworCisJaWYgKCFWQUxJRF9XQ0lEKHdjaWQpKQorCQlyZXR1cm4gTlVMTDsKKworCVJUTVBfU0VNX0xPQ0soJnBBZC0+TWFjVGFiTG9jayk7CisKKwlkbworCXsKKwkJcEN1ckVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbd2NpZF07CisKKwkJRExzSW5kZXggPSAweGZmOworCQlpZiAoKHBDdXJFbnRyeSkgJiYgKHBDdXJFbnRyeS0+VmFsaWRBc0Rscz09IFRSVUUpKQorCQl7CisJCQlETHNJbmRleCA9IHBDdXJFbnRyeS0+TWF0Y2hEbHNFbnRyeUlkeDsKKwkJfQorCisJCWlmIChETHNJbmRleCA9PSAweGZmKQorCQkJYnJlYWs7CisKKwkJaWYgKE1BQ19BRERSX0VRVUFMKHBDdXJFbnRyeS0+QWRkciwgcEFkZHIpKQorCQl7CisJCQlpZihiUmVzZXRJZGVsQ291bnQpCisJCQkJcEN1ckVudHJ5LT5Ob0RhdGFJZGxlQ291bnQgPSAwOworCQkJcEVudHJ5ID0gcEN1ckVudHJ5OworCQkJYnJlYWs7CisJCX0KKwl9IHdoaWxlKEZBTFNFKTsKKworCVJUTVBfU0VNX1VOTE9DSygmcEFkLT5NYWNUYWJMb2NrKTsKKworCXJldHVybiBwRW50cnk7Cit9CisKK0lOVCBTZXRfRGxzRW50cnlJbmZvX0Rpc3BsYXlfUHJvYygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBQVUNIQVIgYXJnKQoreworCUlOVCBpOworCisJcHJpbnRrKCJcbiUtMTlzJS04c1xuIiwgIk1BQyIsICJUSU1FT1VUXG4iKTsKKwlmb3IgKGk9MDsgaTxNQVhfTlVNX09GX0RMU19FTlRSWTsgaSsrKQorCXsKKwkJaWYgKChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZCkgJiYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9PSBETFNfRklOSVNIKSkKKwkJeworCQkJUE1BQ19UQUJMRV9FTlRSWSBwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNUYWJNYXRjaFdDSURdOworCisJCQlwcmludGsoIiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4ICAiLAorCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHJbMF0sIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHJbMV0sIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHJbMl0sCisJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkclszXSwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcls0XSwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcls1XSk7CisJCQlwcmludGsoIiUtOGRcbiIsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlRpbWVPdXQpOworCisJCQlwcmludGsoIlxuIik7CisJCQlwcmludGsoIlxuJS0xOXMlLTRzJS00cyUtNHMlLTRzJS03cyUtN3MlLTdzIiwiTUFDIiwgIkFJRCIsICJCU1MiLCAiUFNNIiwgIldNTSIsICJSU1NJMCIsICJSU1NJMSIsICJSU1NJMiIpOworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJcHJpbnRrKCIlLThzJS0xMHMlLTZzJS02cyUtNnMlLTZzIiwgIk1JTU9QUyIsICJQaE1kIiwgIkJXIiwgIk1DUyIsICJTR0kiLCAiU1RCQyIpOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQkJcHJpbnRrKCJcbiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYICAiLAorCQkJCXBFbnRyeS0+QWRkclswXSwgcEVudHJ5LT5BZGRyWzFdLCBwRW50cnktPkFkZHJbMl0sCisJCQkJcEVudHJ5LT5BZGRyWzNdLCBwRW50cnktPkFkZHJbNF0sIHBFbnRyeS0+QWRkcls1XSk7CisJCQlwcmludGsoIiUtNGQiLCAoaW50KXBFbnRyeS0+QWlkKTsKKwkJCXByaW50aygiJS00ZCIsIChpbnQpcEVudHJ5LT5hcGlkeCk7CisJCQlwcmludGsoIiUtNGQiLCAoaW50KXBFbnRyeS0+UHNNb2RlKTsKKwkJCXByaW50aygiJS00ZCIsIChpbnQpQ0xJRU5UX1NUQVRVU19URVNUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19XTU1fQ0FQQUJMRSkpOworCQkJcHJpbnRrKCIlLTdkIiwgcEVudHJ5LT5Sc3NpU2FtcGxlLkF2Z1Jzc2kwKTsKKwkJCXByaW50aygiJS03ZCIsIHBFbnRyeS0+UnNzaVNhbXBsZS5BdmdSc3NpMSk7CisJCQlwcmludGsoIiUtN2QiLCBwRW50cnktPlJzc2lTYW1wbGUuQXZnUnNzaTIpOworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJcHJpbnRrKCIlLThkIiwgKGludClwRW50cnktPk1tcHNNb2RlKTsKKwkJCXByaW50aygiJS0xMHMiLCBHZXRQaHlNb2RlKHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1PREUpKTsKKwkJCXByaW50aygiJS02cyIsIEdldEJXKHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLkJXKSk7CisJCQlwcmludGsoIiUtNmQiLCBwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NQ1MpOworCQkJcHJpbnRrKCIlLTZkIiwgcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuU2hvcnRHSSk7CisJCQlwcmludGsoIiUtNmQiLCBwRW50cnktPkhUUGh5TW9kZS5maWVsZC5TVEJDKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJCXByaW50aygiJS0xMGQsICVkLCAlZCUlXG4iLCBwRW50cnktPkRlYnVnRklGT0NvdW50LCBwRW50cnktPkRlYnVnVHhDb3VudCwKKwkJCQkJCShwRW50cnktPkRlYnVnVHhDb3VudCkgPyAoKHBFbnRyeS0+RGVidWdUeENvdW50LXBFbnRyeS0+RGVidWdGSUZPQ291bnQpKjEwMC9wRW50cnktPkRlYnVnVHhDb3VudCkgOiAwKTsKKwkJCXByaW50aygiXG4iKTsKKworCQl9CisJfQorCisJcmV0dXJuIFRSVUU7Cit9CisKK0lOVAlTZXRfRGxzQWRkRW50cnlfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisgICAgVUNIQVIJbWFjW01BQ19BRERSX0xFTl07CisJVVNIT1JUCVRpbWVvdXQ7CisJY2hhciAqdG9rZW4sIHNlcFZhbHVlW10gPSAiOiIsIERBU0ggPSAnLSc7CisJSU5UIGk7CisgICAgUlRfODAyXzExX0RMUwlEbHM7CisKKyAgICBpZihzdHJsZW4oYXJnKSA8IDE5KSAgLy9NYWMgYWRkcmVzcyBhY2NlcHRhYmxlIGZvcm1hdCAwMTowMjowMzowNDowNTowNiBsZW5ndGggMTcgcGx1cyB0aGUgIi0iIGFuZCB0aW1lb3V0IHZhbHVlIGluIGRlY2ltYWwgZm9ybWF0LgorCQlyZXR1cm4gRkFMU0U7CisKKwl0b2tlbiA9IHN0cmNocihhcmcsIERBU0gpOworCWlmICgodG9rZW4gIT0gTlVMTCkgJiYgKHN0cmxlbih0b2tlbik+MSkpCisJeworCQlUaW1lb3V0ID0gc2ltcGxlX3N0cnRvbCgodG9rZW4rMSksIDAsIDEwKTsKKworCQkqdG9rZW4gPSAnXDAnOworCQlmb3IgKGkgPSAwLCB0b2tlbiA9IHJzdHJ0b2soYXJnLCAmc2VwVmFsdWVbMF0pOyB0b2tlbjsgdG9rZW4gPSByc3RydG9rKE5VTEwsICZzZXBWYWx1ZVswXSksIGkrKykKKwkJeworCQkJaWYoKHN0cmxlbih0b2tlbikgIT0gMikgfHwgKCFpc3hkaWdpdCgqdG9rZW4pKSB8fCAoIWlzeGRpZ2l0KCoodG9rZW4rMSkpKSkKKwkJCQlyZXR1cm4gRkFMU0U7CisJCQlBdG9IKHRva2VuLCAoUFVDSEFSKSgmbWFjW2ldKSwgMSk7CisJCX0KKwkJaWYoaSAhPSA2KQorCQkJcmV0dXJuIEZBTFNFOworCisJICAgIHByaW50aygiXG4lMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeC0lZCIsIG1hY1swXSwgbWFjWzFdLAorCSAgICAgICAgICAgbWFjWzJdLCBtYWNbM10sIG1hY1s0XSwgbWFjWzVdLCAoaW50KVRpbWVvdXQpOworCisJCU5kaXNaZXJvTWVtb3J5KCZEbHMsIHNpemVvZihSVF84MDJfMTFfRExTKSk7CisJCURscy5UaW1lT3V0ID0gVGltZW91dDsKKwkJQ09QWV9NQUNfQUREUihEbHMuTWFjQWRkciwgbWFjKTsKKwkJRGxzLlZhbGlkID0gMTsKKworCQlNbG1lRW5xdWV1ZShwQWQsCisJCQkJCU1MTUVfQ05UTF9TVEFURV9NQUNISU5FLAorCQkJCQlSVF9PSURfODAyXzExX1NFVF9ETFNfUEFSQU0sCisJCQkJCXNpemVvZihSVF84MDJfMTFfRExTKSwKKwkJCQkJJkRscyk7CisKKwkJcmV0dXJuIFRSVUU7CisJfQorCisJcmV0dXJuIEZBTFNFOworCit9CisKK0lOVAlTZXRfRGxzVGVhckRvd25FbnRyeV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVQ0hBUgkJCW1hY0FkZHJbTUFDX0FERFJfTEVOXTsKKwlDSEFSCQkJKnZhbHVlOworCUlOVAkJCQlpOworCVJUXzgwMl8xMV9ETFMJRGxzOworCisJaWYoc3RybGVuKGFyZykgIT0gMTcpICAvL01hYyBhZGRyZXNzIGFjY2VwdGFibGUgZm9ybWF0IDAxOjAyOjAzOjA0OjA1OjA2IGxlbmd0aCAxNworCQlyZXR1cm4gRkFMU0U7CisKKwlmb3IgKGk9MCwgdmFsdWUgPSByc3RydG9rKGFyZywiOiIpOyB2YWx1ZTsgdmFsdWUgPSByc3RydG9rKE5VTEwsIjoiKSkKKwl7CisJCWlmKChzdHJsZW4odmFsdWUpICE9IDIpIHx8ICghaXN4ZGlnaXQoKnZhbHVlKSkgfHwgKCFpc3hkaWdpdCgqKHZhbHVlKzEpKSkgKQorCQkJcmV0dXJuIEZBTFNFOyAgLy9JbnZhbGlkCisKKwkJQXRvSCh2YWx1ZSwgJm1hY0FkZHJbaSsrXSwgMik7CisJfQorCisJcHJpbnRrKCJcbiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IiwgbWFjQWRkclswXSwgbWFjQWRkclsxXSwKKwkgICAgICAgICAgIG1hY0FkZHJbMl0sIG1hY0FkZHJbM10sIG1hY0FkZHJbNF0sIG1hY0FkZHJbNV0pOworCisJTmRpc1plcm9NZW1vcnkoJkRscywgc2l6ZW9mKFJUXzgwMl8xMV9ETFMpKTsKKwlDT1BZX01BQ19BRERSKERscy5NYWNBZGRyLCBtYWNBZGRyKTsKKwlEbHMuVmFsaWQgPSAwOworCisJTWxtZUVucXVldWUocEFkLAorCQkJCU1MTUVfQ05UTF9TVEFURV9NQUNISU5FLAorCQkJCVJUX09JRF84MDJfMTFfU0VUX0RMU19QQVJBTSwKKwkJCQlzaXplb2YoUlRfODAyXzExX0RMUyksCisJCQkJJkRscyk7CisKKwlyZXR1cm4gVFJVRTsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9zdGEvcnRtcF9kYXRhLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3N0YS9ydG1wX2RhdGEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTQyZWNhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9zdGEvcnRtcF9kYXRhLmMKQEAgLTAsMCArMSwyNjE5IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCU1vZHVsZSBOYW1lOgorCXJ0bXBfZGF0YS5jCisKKwlBYnN0cmFjdDoKKwlEYXRhIHBhdGggc3Vicm91dGluZXMKKworCVJldmlzaW9uIEhpc3Rvcnk6CisJV2hvIAkJV2hlbgkJCVdoYXQKKwktLS0tLS0tLQktLS0tLS0tLS0tCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJSm9obgkJICAgICAgQXVnLzE3LzA0CQltYWpvciBtb2RpZmljYXRpb24gZm9yIFJUMjU2MS8yNjYxCisJSmFuIExlZQkgICAgICBNYXIvMTcvMDYJCW1ham9yIG1vZGlmaWNhdGlvbiBmb3IgUlQyODYwIE5ldyBSaW5nIERlc2lnbgorKi8KKyNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKKworCitWT0lEIFNUQVJ4RUFQT0xGcmFtZUluZGljYXRlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCU1BQ19UQUJMRV9FTlRSWQkqcEVudHJ5LAorCUlOCVJYX0JMSwkJCSpwUnhCbGssCisJSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCkKK3sKKwlQUlQyOFhYX1JYRF9TVFJVQwlwUnhEID0gJihwUnhCbGstPlJ4RCk7CisJUFJYV0lfU1RSVUMJCXBSeFdJID0gcFJ4QmxrLT5wUnhXSTsKKwlVQ0hBUgkJCSpwVG1wQnVmOworCisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorCWlmIChwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVApCisJeworCQkvLyBBbGwgRUFQb0wgZnJhbWVzIGhhdmUgdG8gcGFzcyB0byB1cHBlciBsYXllciAoZXguIFdQQV9TVVBQTElDQU5UIGRhZW1vbikKKwkJLy8gVEJEIDogcHJvY2VzcyBmcmFnbWVudGVkIEVBUG9sIGZyYW1lcworCQl7CisJCQkvLyBJbiA4MDIuMXggbW9kZSwgaWYgdGhlIHJlY2VpdmVkIGZyYW1lIGlzIEVBUC1TVUNDRVNTIHBhY2tldCwgdHVybiBvbiB0aGUgUG9ydFNlY3VyZWQgdmFyaWFibGUKKwkJCWlmICggcEFkLT5TdGFDZmcuSUVFRTgwMjFYID09IFRSVUUgJiYKKwkJCQkgKEVBUF9DT0RFX1NVQ0NFU1MgPT0gV3BhQ2hlY2tFYXBDb2RlKHBBZCwgcFJ4QmxrLT5wRGF0YSwgcFJ4QmxrLT5EYXRhU2l6ZSwgTEVOR1RIXzgwMl8xX0gpKSkKKwkJCXsKKwkJCQlQVUNIQVIJS2V5OworCQkJCVVDSEFSIAlDaXBoZXJBbGc7CisJCQkJaW50ICAgICBpZHggPSAwOworCisJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIlJlY2VpdmUgRUFQLVNVQ0NFU1MgUGFja2V0XG4iKSk7CisJCQkJLy9wQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEOworCQkJCVNUQV9QT1JUX1NFQ1VSRUQocEFkKTsKKworICAgICAgICAgICAgICAgIGlmIChwQWQtPlN0YUNmZy5JRUVFODAyMXhfcmVxdWlyZWRfa2V5cyA9PSBGQUxTRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlkeCA9IHBBZC0+U3RhQ2ZnLkRlc2lyZVNoYXJlZEtleUlkOworICAgICAgICAgICAgICAgICAgICBDaXBoZXJBbGcgPSBwQWQtPlN0YUNmZy5EZXNpcmVTaGFyZWRLZXlbaWR4XS5DaXBoZXJBbGc7CisJCQkJCUtleSA9IHBBZC0+U3RhQ2ZnLkRlc2lyZVNoYXJlZEtleVtpZHhdLktleTsKKworICAgICAgICAgICAgICAgICAgICBpZiAocEFkLT5TdGFDZmcuRGVzaXJlU2hhcmVkS2V5W2lkeF0uS2V5TGVuID4gMCkKKyAgICAJCQkJeworI2lmZGVmIFJUMjg3MAorCQkJCQkJdW5pb24KKwkJCQkJCXsKKwkJCQkJCQljaGFyIGJ1ZltzaXplb2YoTkRJU184MDJfMTFfV0VQKStNQVhfTEVOX09GX0tFWS0gMV07CisJCQkJCQkJTkRJU184MDJfMTFfV0VQIGtleWluZm87CisJCQkJCQl9ICBXZXBLZXk7CisJCQkJCQlpbnQgbGVuOworCisKKwkJCQkJCU5kaXNaZXJvTWVtb3J5KCZXZXBLZXksIHNpemVvZihXZXBLZXkpKTsKKwkJCQkJCWxlbiA9cEFkLT5TdGFDZmcuRGVzaXJlU2hhcmVkS2V5W2lkeF0uS2V5TGVuOworCisJCQkJCQlOZGlzTW92ZU1lbW9yeShXZXBLZXkua2V5aW5mby5LZXlNYXRlcmlhbCwKKwkJCQkJCQlwQWQtPlN0YUNmZy5EZXNpcmVTaGFyZWRLZXlbaWR4XS5LZXksCisJCQkJCQkJcEFkLT5TdGFDZmcuRGVzaXJlU2hhcmVkS2V5W2lkeF0uS2V5TGVuKTsKKworCQkJCQkJV2VwS2V5LmtleWluZm8uS2V5SW5kZXggPSAweDgwMDAwMDAwICsgaWR4OworCQkJCQkJV2VwS2V5LmtleWluZm8uS2V5TGVuZ3RoID0gbGVuOworCQkJCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1baWR4XS5LZXlMZW4gPShVQ0hBUikgKGxlbiA8PSA1ID8gNSA6IDEzKTsKKworCQkJCQkJcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZUNvbm5lY3RlZDsKKwkJCQkJCXBBZC0+RXh0cmFJbmZvID0gR0VORVJBTF9MSU5LX1VQOworCQkJCQkJLy8gbmVlZCB0byBlbnF1ZXVlIGNtZCB0byB0aHJlYWQKKwkJCQkJCVJUVVNCRW5xdWV1ZUNtZEZyb21OZGlzKHBBZCwgT0lEXzgwMl8xMV9BRERfV0VQLCBUUlVFLCAmV2VwS2V5LCBzaXplb2YoV2VwS2V5LmtleWluZm8pICsgbGVuIC0gMSk7CisjZW5kaWYgLy8gUlQyODcwIC8vCisJCQkJCQkvLyBGb3IgUHJldmVudGluZyBTaGFyZEtleSBUYWJsZSBpcyBjbGVhcmVkIGJ5IHJlbW92ZSBrZXkgcHJvY2VkdXJlLgorICAgIAkJCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1baWR4XS5DaXBoZXJBbGcgPSBDaXBoZXJBbGc7CisJCQkJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtpZHhdLktleUxlbiA9IHBBZC0+U3RhQ2ZnLkRlc2lyZVNoYXJlZEtleVtpZHhdLktleUxlbjsKKwkJCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdW2lkeF0uS2V5LAorCQkJCQkJCQkJICAgcEFkLT5TdGFDZmcuRGVzaXJlU2hhcmVkS2V5W2lkeF0uS2V5LAorCQkJCQkJCQkJICAgcEFkLT5TdGFDZmcuRGVzaXJlU2hhcmVkS2V5W2lkeF0uS2V5TGVuKTsKKyAgICAJCQkJfQorCQkJCX0KKwkJCX0KKworCQkJSW5kaWNhdGVfTGVnYWN5X1BhY2tldChwQWQsIHBSeEJsaywgRnJvbVdoaWNoQlNTSUQpOworCQkJcmV0dXJuOworCQl9CisJfQorCWVsc2UKKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisJeworCQkvLyBTcGVjaWFsIERBVEEgZnJhbWUgdGhhdCBoYXMgdG8gcGFzcyB0byBNTE1FCisJCS8vCSAxLiBDaXNjbyBBaXJvbmV0IGZyYW1lcyBmb3IgQ0NYMi4gV2UgbmVlZCBwYXNzIGl0IHRvIE1MTUUgZm9yIHNwZWNpYWwgcHJvY2VzcworCQkvLwkgMi4gRUFQT0wgaGFuZHNoYWtpbmcgZnJhbWVzIHdoZW4gZHJpdmVyIHN1cHBsaWNhbnQgZW5hYmxlZCwgcGFzcyB0byBNTE1FIGZvciBzcGVjaWFsIHByb2Nlc3MKKwkJeworCQkJcFRtcEJ1ZiA9IHBSeEJsay0+cERhdGEgLSBMRU5HVEhfODAyXzExOworCQkJTmRpc01vdmVNZW1vcnkocFRtcEJ1ZiwgcFJ4QmxrLT5wSGVhZGVyLCBMRU5HVEhfODAyXzExKTsKKwkJCVJFUE9SVF9NR01UX0ZSQU1FX1RPX01MTUUocEFkLCBwUnhXSS0+V2lyZWxlc3NDbGlJRCwgcFRtcEJ1ZiwgcFJ4QmxrLT5EYXRhU2l6ZSArIExFTkdUSF84MDJfMTEsIHBSeFdJLT5SU1NJMCwgcFJ4V0ktPlJTU0kxLCBwUnhXSS0+UlNTSTIsIHBSeEQtPlBsY3BTaWduYWwpOworCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIiEhISByZXBvcnQgRUFQT0wvQUlST05FVCBEQVRBIHRvIE1MTUUgKGxlbj0lZCkgISEhXG4iLCBwUnhCbGstPkRhdGFTaXplKSk7CisJCX0KKwl9CisKKwlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4QmxrLT5wUnhQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCXJldHVybjsKKworfQorCitWT0lEIFNUQVJ4RGF0YUZyYW1lQW5ub3VuY2UoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JTUFDX1RBQkxFX0VOVFJZCSpwRW50cnksCisJSU4JUlhfQkxLCQkJKnBSeEJsaywKKwlJTglVQ0hBUgkJCUZyb21XaGljaEJTU0lEKQoreworCisJLy8gbm9uLUVBUCBmcmFtZQorCWlmICghUlRNUENoZWNrV1BBZnJhbWUocEFkLCBwRW50cnksIHBSeEJsay0+cERhdGEsIHBSeEJsay0+RGF0YVNpemUsIEZyb21XaGljaEJTU0lEKSkKKwl7CisJCXsKKwkJCS8vIGRyb3AgYWxsIG5vbi1FQVAgREFUQSBmcmFtZSBiZWZvcmUKKwkJCS8vIHRoaXMgY2xpZW50J3MgUG9ydC1BY2Nlc3MtQ29udHJvbCBpcyBzZWN1cmVkCisJCQlpZiAocFJ4QmxrLT5wSGVhZGVyLT5GQy5XZXApCisJCQl7CisJCQkJLy8gdW5zdXBwb3J0ZWQgY2lwaGVyIHN1aXRlCisJCQkJaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbkRpc2FibGVkKQorCQkJCXsKKwkJCQkJLy8gcmVsZWFzZSBwYWNrZXQKKwkJCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeEJsay0+cFJ4UGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQkvLyBlbmNyeXB0aW9uIGluLXVzZSBidXQgcmVjZWl2ZSBhIG5vbi1FQVBPTCBjbGVhciB0ZXh0IGZyYW1lLCBkcm9wIGl0CisJCQkJaWYgKChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgIT0gTmRpczgwMl8xMUVuY3J5cHRpb25EaXNhYmxlZCkgJiYKKwkJCQkJKHBBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkID09IFdQQV84MDJfMVhfUE9SVF9OT1RfU0VDVVJFRCkpCisJCQkJeworCQkJCQkvLyByZWxlYXNlIHBhY2tldAorCQkJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4QmxrLT5wUnhQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCQkJCQlyZXR1cm47CisJCQkJfQorCQkJfQorCQl9CisJCVJYX0JMS19DTEVBUl9GTEFHKHBSeEJsaywgZlJYX0VBUCk7CisJCWlmICghUlhfQkxLX1RFU1RfRkxBRyhwUnhCbGssIGZSWF9BUkFMSU5LKSkKKwkJeworCQkJLy8gTm9ybWFsIGxlZ2FjeSwgQU1QRFUgb3IgQU1TRFUKKwkJCUNtbVJ4bm9uUmFsaW5rRnJhbWVJbmRpY2F0ZShwQWQsIHBSeEJsaywgRnJvbVdoaWNoQlNTSUQpOworCisJCX0KKwkJZWxzZQorCQl7CisJCQkvLyBBUkFMSU5LCisJCQlDbW1SeFJhbGlua0ZyYW1lSW5kaWNhdGUocEFkLCBwRW50cnksIHBSeEJsaywgRnJvbVdoaWNoQlNTSUQpOworCQl9CisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJCVJYX0JMS19DTEVBUl9GTEFHKHBSeEJsaywgZlJYX0RMUyk7CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisJfQorCWVsc2UKKwl7CisJCVJYX0JMS19TRVRfRkxBRyhwUnhCbGssIGZSWF9FQVApOworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQlpZiAoUlhfQkxLX1RFU1RfRkxBRyhwUnhCbGssIGZSWF9BTVBEVSkgJiYgKHBBZC0+Q29tbW9uQ2ZnLmJEaXNhYmxlUmVvcmRlcmluZyA9PSAwKSkKKwkJeworCQkJSW5kaWNhdGVfQU1QRFVfUGFja2V0KHBBZCwgcFJ4QmxrLCBGcm9tV2hpY2hCU1NJRCk7CisJCX0KKwkJZWxzZQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQl7CisJCQkvLyBEZXRlcm1pbiB0aGUgZGVzdGluYXRpb24gb2YgdGhlIEVBUCBmcmFtZQorCQkJLy8gIHRvIFdQQSBzdGF0ZSBtYWNoaW5lIG9yIHVwcGVyIGxheWVyCisJCQlTVEFSeEVBUE9MRnJhbWVJbmRpY2F0ZShwQWQsIHBFbnRyeSwgcFJ4QmxrLCBGcm9tV2hpY2hCU1NJRCk7CisJCX0KKwl9Cit9CisKKworLy8gRm9yIFRLSVAgZnJhbWUsIGNhbGN1bGF0ZSB0aGUgTUlDIHZhbHVlCitCT09MRUFOIFNUQUNoZWNrVGtpcE1JQ1ZhbHVlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCU1BQ19UQUJMRV9FTlRSWQkqcEVudHJ5LAorCUlOCVJYX0JMSwkJCSpwUnhCbGspCit7CisJUEhFQURFUl84MDJfMTEJcEhlYWRlciA9IHBSeEJsay0+cEhlYWRlcjsKKwlVQ0hBUgkJCSpwRGF0YSA9IHBSeEJsay0+cERhdGE7CisJVVNIT1JUCQkJRGF0YVNpemUgPSBwUnhCbGstPkRhdGFTaXplOworCVVDSEFSCQkJVXNlclByaW9yaXR5ID0gcFJ4QmxrLT5Vc2VyUHJpb3JpdHk7CisJUENJUEhFUl9LRVkJCXBXcGFLZXk7CisJVUNIQVIJCQkqcERBLCAqcFNBOworCisJcFdwYUtleSA9ICZwQWQtPlNoYXJlZEtleVtCU1MwXVtwUnhCbGstPnBSeFdJLT5LZXlJbmRleF07CisKKwlwREEgPSBwSGVhZGVyLT5BZGRyMTsKKwlpZiAoUlhfQkxLX1RFU1RfRkxBRyhwUnhCbGssIGZSWF9JTkZSQSkpCisJeworCQlwU0EgPSBwSGVhZGVyLT5BZGRyMzsKKwl9CisJZWxzZQorCXsKKwkJcFNBID0gcEhlYWRlci0+QWRkcjI7CisJfQorCisJaWYgKFJUTVBUa2lwQ29tcGFyZU1JQ1ZhbHVlKHBBZCwKKwkJCQkJCQkJcERhdGEsCisJCQkJCQkJCXBEQSwKKwkJCQkJCQkJcFNBLAorCQkJCQkJCQlwV3BhS2V5LT5SeE1pYywKKwkJCQkJCQkJVXNlclByaW9yaXR5LAorCQkJCQkJCQlEYXRhU2l6ZSkgPT0gRkFMU0UpCisJeworCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsKCJSeCBNSUMgVmFsdWUgZXJyb3IgMlxuIikpOworCisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorCQlpZiAocEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQKQorCQl7CisJCQlXcGFTZW5kTWljRmFpbHVyZVRvV3BhU3VwcGxpY2FudChwQWQsIChwV3BhS2V5LT5UeXBlID09IFBBSVJXSVNFS0VZKSA/IFRSVUUgOiBGQUxTRSk7CisJCX0KKwkJZWxzZQorI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKwkJeworCQkJUlRNUFJlcG9ydE1pY0Vycm9yKHBBZCwgcFdwYUtleSk7CisJCX0KKworCQkvLyByZWxlYXNlIHBhY2tldAorCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4QmxrLT5wUnhQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJcmV0dXJuIFRSVUU7Cit9CisKKworLy8KKy8vIEFsbCBSeCByb3V0aW5lcyB1c2UgUlhfQkxLIHN0cnVjdHVyZSB0byBoYW5kZSByeCBldmVudHMKKy8vIEl0IGlzIHZlcnkgaW1wb3J0YW50IHRvIGJ1aWxkIHBSeEJsayBhdHRyaWJ1dGVzCisvLyAgMS4gcEhlYWRlciBwb2ludGVyIHRvIDgwMi4xMSBIZWFkZXIKKy8vICAyLiBwRGF0YSBwb2ludGVyIHRvIHBheWxvYWQgaW5jbHVkaW5nIExMQyAoanVzdCBza2lwIEhlYWRlcikKKy8vICAzLiBzZXQgcGF5bG9hZCBzaXplIGluY2x1ZGluZyBMTEMgdG8gRGF0YVNpemUKKy8vICA0LiBzZXQgc29tZSBmbGFncyB3aXRoIFJYX0JMS19TRVRfRkxBRygpCisvLworVk9JRCBTVEFIYW5kbGVSeERhdGFGcmFtZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglSWF9CTEsJCQkqcFJ4QmxrKQoreworCVBSVDI4WFhfUlhEX1NUUlVDCQkJCXBSeEQgPSAmKHBSeEJsay0+UnhEKTsKKwlQUlhXSV9TVFJVQwkJCQkJCXBSeFdJID0gcFJ4QmxrLT5wUnhXSTsKKwlQSEVBREVSXzgwMl8xMQkJCQkJcEhlYWRlciA9IHBSeEJsay0+cEhlYWRlcjsKKwlQTkRJU19QQUNLRVQJCQkJCXBSeFBhY2tldCA9IHBSeEJsay0+cFJ4UGFja2V0OworCUJPT0xFQU4gCQkJCQkJYkZyYWdtZW50ID0gRkFMU0U7CisJTUFDX1RBQkxFX0VOVFJZCSAgICAJCQkqcEVudHJ5ID0gTlVMTDsKKwlVQ0hBUgkJCQkJCQlGcm9tV2hpY2hCU1NJRCA9IEJTUzA7CisJVUNIQVIgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VyUHJpb3JpdHkgPSAwOworCisJeworCQkvLyBiZWZvcmUgTElOSyBVUCwgYWxsIERBVEEgZnJhbWVzIGFyZSByZWplY3RlZAorCQlpZiAoIU9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSkKKwkJeworCQkJLy8gcmVsZWFzZSBwYWNrZXQKKwkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCQkJcmV0dXJuOworCQl9CisKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwkJLy9pZiAoKHBIZWFkZXItPkZDLkZyRHMgPT0gMCkgJiYgKHBIZWFkZXItPkZDLlRvRHMgPT0gMCkpCisJCWlmIChSVE1QUmN2RnJhbWVETFNDaGVjayhwQWQsIHBIZWFkZXIsIHBSeFdJLT5NUERVdG90YWxCeXRlQ291bnQsIHBSeEQpKQorCQl7CisJCQlyZXR1cm47CisJCX0KKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKworCQkvLyBEcm9wIG5vdCBteSBCU1MgZnJhbWVzCisJCWlmIChwUnhELT5NeUJzcyA9PSAwKQorCQl7CisJCQl7CisJCQkJLy8gcmVsZWFzZSBwYWNrZXQKKwkJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4UGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCX0KKworCQlwQWQtPlJhbGlua0NvdW50ZXJzLlJ4Q291bnRTaW5jZUxhc3ROVUxMKys7CisJCWlmIChwQWQtPkNvbW1vbkNmZy5iQVBTRENhcGFibGUgJiYgcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5iQVBTRENhcGFibGUgJiYgKHBIZWFkZXItPkZDLlN1YlR5cGUgJiAweDA4KSkKKwkJeworCQkJVUNIQVIgKnBEYXRhOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJiQVBTRENhcGFibGVcbiIpKTsKKworCQkJLy8gUW9zIGJpdCA0CisJCQlwRGF0YSA9IChQVUNIQVIpcEhlYWRlciArIExFTkdUSF84MDJfMTE7CisJCQlpZiAoKCpwRGF0YSA+PiA0KSAmIDB4MDEpCisJCQl7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSeERvbmUtIFJjdiBFT1NQIGZyYW1lLCBkcml2ZXIgbWF5IGZhbGwgaW50byBzbGVlcFxuIikpOworCQkJCXBBZC0+Q29tbW9uQ2ZnLmJJblNlcnZpY2VQZXJpb2QgPSBGQUxTRTsKKworCQkJCS8vIEZvcmNlIGRyaXZlciB0byBmYWxsIGludG8gc2xlZXAgbW9kZSB3aGVuIHJjdiBFT1NQIGZyYW1lCisJCQkJaWYgKCFPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0RPWkUpKQorCQkJCXsKKwkJCQkJVVNIT1JUICBUYnR0TnVtVG9OZXh0V2FrZVVwOworCQkJCQlVU0hPUlQgIE5leHREdGltID0gcEFkLT5TdGFDZmcuRHRpbVBlcmlvZDsKKwkJCQkJVUxPTkcgICBOb3c7CisKKwkJCQkJTmRpc0dldFN5c3RlbVVwVGltZSgmTm93KTsKKwkJCQkJTmV4dER0aW0gLT0gKFVTSE9SVCkoTm93IC0gcEFkLT5TdGFDZmcuTGFzdEJlYWNvblJ4VGltZSkvcEFkLT5Db21tb25DZmcuQmVhY29uUGVyaW9kOworCisJCQkJCVRidHROdW1Ub05leHRXYWtlVXAgPSBwQWQtPlN0YUNmZy5EZWZhdWx0TGlzdGVuQ291bnQ7CisJCQkJCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1JFQ0VJVkVfRFRJTSkgJiYgKFRidHROdW1Ub05leHRXYWtlVXAgPiBOZXh0RHRpbSkpCisJCQkJCQlUYnR0TnVtVG9OZXh0V2FrZVVwID0gTmV4dER0aW07CisKKwkJCQkJTWxtZVNldFBzbUJpdChwQWQsIFBXUl9TQVZFKTsKKwkJCQkJLy8gaWYgV01NLUFQU0QgaXMgZmFpbGVkLCB0cnkgdG8gZGlzYWJsZSBmb2xsb3dpbmcgbGluZQorCQkJCQlBc2ljU2xlZXBUaGVuQXV0b1dha2V1cChwQWQsIFRidHROdW1Ub05leHRXYWtlVXApOworCQkJCX0KKwkJCX0KKworCQkJaWYgKChwSGVhZGVyLT5GQy5Nb3JlRGF0YSkgJiYgKHBBZC0+Q29tbW9uQ2ZnLmJJblNlcnZpY2VQZXJpb2QpKQorCQkJeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiU2VuZGluZyBhbm90aGVyIHRyaWdnZXIgZnJhbWUgd2hlbiBNb3JlIERhdGEgYml0IGlzIHNldCB0byAxXG4iKSk7CisJCQl9CisJCX0KKworCQkvLyBEcm9wIE5VTEwsIENGLUFDSyhubyBkYXRhKSwgQ0YtUE9MTChubyBkYXRhKSwgYW5kIENGLUFDSytDRi1QT0xMKG5vIGRhdGEpIGRhdGEgZnJhbWUKKwkJaWYgKChwSGVhZGVyLT5GQy5TdWJUeXBlICYgMHgwNCkpIC8vIGJpdCAyIDogbm8gREFUQQorCQl7CisJCQkvLyByZWxlYXNlIHBhY2tldAorCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCQlyZXR1cm47CisJCX0KKworCSAgICAvLyBEcm9wIG5vdCBteSBCU1MgZnJhbWUgKHdlIGNhbiBub3Qgb25seSBjaGVjayB0aGUgTXlCc3MgYml0IGluIFJ4RCkKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwkgICAgaWYgKCFwQWQtPkNvbW1vbkNmZy5iRExTQ2FwYWJsZSkKKwkgICAgeworI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCQlpZiAoSU5GUkFfT04ocEFkKSkKKwkJeworCQkJLy8gSW5mcmFzdHJ1Y3R1cmUgbW9kZSwgY2hlY2sgYWRkcmVzcyAyIGZvciBCU1NJRAorCQkJaWYgKCFSVE1QRXF1YWxNZW1vcnkoJnBIZWFkZXItPkFkZHIyLCAmcEFkLT5Db21tb25DZmcuQnNzaWQsIDYpKQorCQkJeworCQkJCS8vIFJlY2VpdmUgZnJhbWUgbm90IG15IEJTU0lECisJICAgICAgICAgICAgLy8gcmVsZWFzZSBwYWNrZXQKKwkgICAgICAgICAgICBSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4UGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCX0KKwkJZWxzZQkvLyBBZC1Ib2MgbW9kZSBvciBOb3QgYXNzb2NpYXRlZAorCQl7CisJCQkvLyBBZC1Ib2MgbW9kZSwgY2hlY2sgYWRkcmVzcyAzIGZvciBCU1NJRAorCQkJaWYgKCFSVE1QRXF1YWxNZW1vcnkoJnBIZWFkZXItPkFkZHIzLCAmcEFkLT5Db21tb25DZmcuQnNzaWQsIDYpKQorCQkJeworCQkJCS8vIFJlY2VpdmUgZnJhbWUgbm90IG15IEJTU0lECisJICAgICAgICAgICAgLy8gcmVsZWFzZSBwYWNrZXQKKwkgICAgICAgICAgICBSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4UGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCX0KKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwkgICAgfQorI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCisJCS8vCisJCS8vIGZpbmQgcEVudHJ5CisJCS8vCisJCWlmIChwUnhXSS0+V2lyZWxlc3NDbGlJRCA8IE1BWF9MRU5fT0ZfTUFDX1RBQkxFKQorCQl7CisJCQlwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtwUnhXSS0+V2lyZWxlc3NDbGlJRF07CisJCX0KKwkJZWxzZQorCQl7CisJCQkvLyAxLiByZWxlYXNlIHBhY2tldCBpZiBpbmZyYSBtb2RlCisJCQkvLyAyLiBuZXcgYSBwRW50cnkgaWYgYWQtaG9jIG1vZGUKKwkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCQkJcmV0dXJuOworCQl9CisKKwkJLy8gaW5mcmEgb3IgYWQtaG9jCisJCWlmIChJTkZSQV9PTihwQWQpKQorCQl7CisJCQlSWF9CTEtfU0VUX0ZMQUcocFJ4QmxrLCBmUlhfSU5GUkEpOworI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCQkJaWYgKChwSGVhZGVyLT5GQy5GckRzID09IDApICYmIChwSGVhZGVyLT5GQy5Ub0RzID09IDApKQorCQkJCVJYX0JMS19TRVRfRkxBRyhwUnhCbGssIGZSWF9ETFMpOworCQkJZWxzZQorI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCQkJQVNTRVJUKHBSeFdJLT5XaXJlbGVzc0NsaUlEID09IEJTU0lEX1dDSUQpOworCQl9CisKKwkJLy8gY2hlY2sgQXRoZXJvcyBDbGllbnQKKwkJaWYgKChwRW50cnktPmJJQW1CYWRBdGhlcm9zID09IEZBTFNFKSAmJiAgKHBSeEQtPkFNUERVID09IDEpICYmIChwSGVhZGVyLT5GQy5SZXRyeSApKQorCQl7CisJCQlwRW50cnktPmJJQW1CYWRBdGhlcm9zID0gVFJVRTsKKwkJCXBBZC0+Q29tbW9uQ2ZnLklPVGVzdFBhcm0uYkN1cnJlbnRBdGhlcm9zID0gVFJVRTsKKwkJCXBBZC0+Q29tbW9uQ2ZnLklPVGVzdFBhcm0uYkxhc3RBdGhlcm9zID0gVFJVRTsKKwkJCWlmICghU1RBX0FFU19PTihwQWQpKQorCQkJeworCQkJCUFzaWNVcGRhdGVQcm90ZWN0KHBBZCwgOCwgQUxMTl9TRVRQUk9URUNULCBUUlVFLCBGQUxTRSk7CisJCQl9CisJCX0KKwl9CisKKwlwUnhCbGstPnBEYXRhID0gKFVDSEFSICopcEhlYWRlcjsKKworCS8vCisJLy8gdXBkYXRlIFJ4QmxrLT5wRGF0YSwgRGF0YVNpemUKKwkvLyA4MDIuMTEgSGVhZGVyLCBRT1MsIEhUQywgSHcgUGFkZGluZworCS8vCisKKwkvLyAxLiBza2lwIDgwMi4xMSBIRUFERVIKKwl7CisJCXBSeEJsay0+cERhdGEgKz0gTEVOR1RIXzgwMl8xMTsKKwkJcFJ4QmxrLT5EYXRhU2l6ZSAtPSBMRU5HVEhfODAyXzExOworCX0KKworCS8vIDIuIFFPUworCWlmIChwSGVhZGVyLT5GQy5TdWJUeXBlICYgMHgwOCkKKwl7CisJCVJYX0JMS19TRVRfRkxBRyhwUnhCbGssIGZSWF9RT1MpOworCQlVc2VyUHJpb3JpdHkgPSAqKHBSeEJsay0+cERhdGEpICYgMHgwZjsKKwkJLy8gYml0IDcgaW4gUW9TIENvbnRyb2wgZmllbGQgc2lnbmFscyB0aGUgSFQgQS1NU0RVIGZvcm1hdAorCQlpZiAoKCpwUnhCbGstPnBEYXRhKSAmIDB4ODApCisJCXsKKwkJCVJYX0JMS19TRVRfRkxBRyhwUnhCbGssIGZSWF9BTVNEVSk7CisJCX0KKworCQkvLyBza2lwIFFPUyBjb250b3JsIGZpZWxkCisJCXBSeEJsay0+cERhdGEgKz0gMjsKKwkJcFJ4QmxrLT5EYXRhU2l6ZSAtPTI7CisJfQorCXBSeEJsay0+VXNlclByaW9yaXR5ID0gVXNlclByaW9yaXR5OworCisJLy8gMy4gT3JkZXIgYml0OiBBLVJhbGluayBvciBIVEMrCisJaWYgKHBIZWFkZXItPkZDLk9yZGVyKQorCXsKKyNpZmRlZiBBR0dSRUdBVElPTl9TVVBQT1JUCisJCWlmICgocFJ4V0ktPlBIWU1PREUgPD0gTU9ERV9PRkRNKSAmJiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19BR0dSRUdBVElPTl9JTlVTRUQpKSkKKwkJeworCQkJUlhfQkxLX1NFVF9GTEFHKHBSeEJsaywgZlJYX0FSQUxJTkspOworCQl9CisJCWVsc2UKKyNlbmRpZgorCQl7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQlSWF9CTEtfU0VUX0ZMQUcocFJ4QmxrLCBmUlhfSFRDKTsKKwkJCS8vIHNraXAgSFRDIGNvbnRvcmwgZmllbGQKKwkJCXBSeEJsay0+cERhdGEgKz0gNDsKKwkJCXBSeEJsay0+RGF0YVNpemUgLT0gNDsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJfQorCX0KKworCS8vIDQuIHNraXAgSFcgcGFkZGluZworCWlmIChwUnhELT5MMlBBRCkKKwl7CisJCS8vIGp1c3QgbW92ZSBwRGF0YSBwb2ludGVyCisJCS8vIGJlY2F1c2UgRGF0YVNpemUgZXhjbHVkaW5nIEhXIHBhZGRpbmcKKwkJUlhfQkxLX1NFVF9GTEFHKHBSeEJsaywgZlJYX1BBRCk7CisJCXBSeEJsay0+cERhdGEgKz0gMjsKKwl9CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwlpZiAocFJ4RC0+QkEpCisJeworCQlSWF9CTEtfU0VUX0ZMQUcocFJ4QmxrLCBmUlhfQU1QRFUpOworCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCisJLy8KKwkvLyBDYXNlIEkgIFByb2Nlc3MgQnJvYWRjYXN0ICYgTXVsdGljYXN0IGRhdGEgZnJhbWUKKwkvLworCWlmIChwUnhELT5CY2FzdCB8fCBwUnhELT5NY2FzdCkKKwl7CisJCUlOQ19DT1VOVEVSNjQocEFkLT5XbGFuQ291bnRlcnMuTXVsdGljYXN0UmVjZWl2ZWRGcmFtZUNvdW50KTsKKworCQkvLyBEcm9wIE1jYXN0L0JjYXN0IGZyYW1lIHdpdGggZnJhZ21lbnQgYml0IG9uCisJCWlmIChwSGVhZGVyLT5GQy5Nb3JlRnJhZykKKwkJeworCQkJLy8gcmVsZWFzZSBwYWNrZXQKKwkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCQkJcmV0dXJuOworCQl9CisKKwkJLy8gRmlsdGVyIG91dCBCY2FzdCBmcmFtZSB3aGljaCBBUCByZWxheWVkIGZvciB1cworCQlpZiAocEhlYWRlci0+RkMuRnJEcyAmJiBNQUNfQUREUl9FUVVBTChwSGVhZGVyLT5BZGRyMywgcEFkLT5DdXJyZW50QWRkcmVzcykpCisJCXsKKwkJCS8vIHJlbGVhc2UgcGFja2V0CisJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4UGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJCXJldHVybjsKKwkJfQorCisJCUluZGljYXRlX0xlZ2FjeV9QYWNrZXQocEFkLCBwUnhCbGssIEZyb21XaGljaEJTU0lEKTsKKwkJcmV0dXJuOworCX0KKwllbHNlIGlmIChwUnhELT5VMk0pCisJeworCQlwQWQtPkxhc3RSeFJhdGUgPSAoVVNIT1JUKSgocFJ4V0ktPk1DUykgKyAocFJ4V0ktPkJXIDw8NykgKyAocFJ4V0ktPlNob3J0R0kgPDw4KSsgKHBSeFdJLT5QSFlNT0RFIDw8MTQpKSA7CisKKworI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorICAgICAgICBpZiAoUlhfQkxLX1RFU1RfRkxBRyhwUnhCbGssIGZSWF9ETFMpKQorCQl7CisJCQlNQUNfVEFCTEVfRU5UUlkgKnBEbHNFbnRyeSA9IE5VTEw7CisKKwkJCXBEbHNFbnRyeSA9IERsc0VudHJ5VGFibGVMb29rdXBCeVdjaWQocEFkLCBwUnhXSS0+V2lyZWxlc3NDbGlJRCwgcEhlYWRlci0+QWRkcjIsIFRSVUUpOworCQkJCQkJCQkJCSAgICAgICAgICAgICAgICAgICAgICAgIGlmKHBEbHNFbnRyeSkKKwkJCVVwZGF0ZV9Sc3NpX1NhbXBsZShwQWQsICZwRGxzRW50cnktPlJzc2lTYW1wbGUsIHBSeFdJKTsKKwkJfQorCQllbHNlCisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisJCWlmIChBREhPQ19PTihwQWQpKQorCQl7CisJCQlwRW50cnkgPSBNYWNUYWJsZUxvb2t1cChwQWQsIHBIZWFkZXItPkFkZHIyKTsKKwkJCWlmIChwRW50cnkpCisJCQkJVXBkYXRlX1Jzc2lfU2FtcGxlKHBBZCwgJnBFbnRyeS0+UnNzaVNhbXBsZSwgcFJ4V0kpOworCQl9CisKKworCQlVcGRhdGVfUnNzaV9TYW1wbGUocEFkLCAmcEFkLT5TdGFDZmcuUnNzaVNhbXBsZSwgcFJ4V0kpOworCisJCXBBZC0+U3RhQ2ZnLkxhc3RTTlIwID0gKFVDSEFSKShwUnhXSS0+U05SMCk7CisJCXBBZC0+U3RhQ2ZnLkxhc3RTTlIxID0gKFVDSEFSKShwUnhXSS0+U05SMSk7CisKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNSeE9rRGF0YUNudCsrOworCisKKyAgICAJaWYgKCEoKHBIZWFkZXItPkZyYWcgPT0gMCkgJiYgKHBIZWFkZXItPkZDLk1vcmVGcmFnID09IDApKSkKKyAgICAJeworICAgIAkJLy8gcmUtYXNzZW1ibGUgdGhlIGZyYWdtZW50ZWQgcGFja2V0cworICAgIAkJLy8gcmV0dXJuIGNvbXBsZXRlIGZyYW1lIChwUnhQYWNrZXQpIG9yIE5VTEwKKyAgICAJCWJGcmFnbWVudCA9IFRSVUU7CisgICAgCQlwUnhQYWNrZXQgPSBSVE1QRGVGcmFnbWVudERhdGFGcmFtZShwQWQsIHBSeEJsayk7CisgICAgCX0KKworICAgIAlpZiAocFJ4UGFja2V0KQorICAgIAl7CisJCQlwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtwUnhXSS0+V2lyZWxlc3NDbGlJRF07CisKKyAgICAJCS8vIHByb2Nlc3MgY29tcGxldGUgZnJhbWUKKyAgICAJCWlmIChiRnJhZ21lbnQgJiYgKHBSeEQtPkRlY3J5cHRlZCkgJiYgKHBFbnRyeS0+V2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpKQorICAgIAkJeworCQkJCS8vIE1pbnVzIE1JQyBsZW5ndGgKKwkJCQlwUnhCbGstPkRhdGFTaXplIC09IDg7CisKKyAgICAJCQkvLyBGb3IgVEtJUCBmcmFtZSwgY2FsY3VsYXRlIHRoZSBNSUMgdmFsdWUKKyAgICAJCQlpZiAoU1RBQ2hlY2tUa2lwTUlDVmFsdWUocEFkLCBwRW50cnksIHBSeEJsaykgPT0gRkFMU0UpCisgICAgCQkJeworICAgIAkJCQlyZXR1cm47CisgICAgCQkJfQorICAgIAkJfQorCisgICAgCQlTVEFSeERhdGFGcmFtZUFubm91bmNlKHBBZCwgcEVudHJ5LCBwUnhCbGssIEZyb21XaGljaEJTU0lEKTsKKwkJCXJldHVybjsKKyAgICAJfQorICAgIAllbHNlCisgICAgCXsKKyAgICAJCS8vIGp1c3QgcmV0dXJuCisgICAgCQkvLyBiZWNhdXNlIFJUTVBEZUZyYWdtZW50RGF0YUZyYW1lKCkgd2lsbCByZWxlYXNlIHJ4IHBhY2tldCwKKyAgICAJCS8vIGlmIHBhY2tldCBpcyBmcmFnbWVudGVkCisgICAgCQlyZXR1cm47CisgICAgCX0KKwl9CisKKwlBU1NFUlQoMCk7CisJLy8gcmVsZWFzZSBwYWNrZXQKKwlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4UGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKK30KKworVk9JRCBTVEFIYW5kbGVSeE1nbXRGcmFtZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglSWF9CTEsJCQkqcFJ4QmxrKQoreworCVBSVDI4WFhfUlhEX1NUUlVDCXBSeEQgPSAmKHBSeEJsay0+UnhEKTsKKwlQUlhXSV9TVFJVQwkJcFJ4V0kgPSBwUnhCbGstPnBSeFdJOworCVBIRUFERVJfODAyXzExCXBIZWFkZXIgPSBwUnhCbGstPnBIZWFkZXI7CisJUE5ESVNfUEFDS0VUCXBSeFBhY2tldCA9IHBSeEJsay0+cFJ4UGFja2V0OworCisJZG8KKwl7CisKKwkJLy8gV2Ugc2hvdWxkIGNvbGxlY3QgUlNTSSBub3Qgb25seSBVMk0gZGF0YSBidXQgYWxzbyBteSBiZWFjb24KKwkJaWYgKChwSGVhZGVyLT5GQy5TdWJUeXBlID09IFNVQlRZUEVfQkVBQ09OKSAmJiAoTUFDX0FERFJfRVFVQUwoJnBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCAmcEhlYWRlci0+QWRkcjIpKSkKKwkJeworCQkJVXBkYXRlX1Jzc2lfU2FtcGxlKHBBZCwgJnBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUsIHBSeFdJKTsKKworCQkJcEFkLT5TdGFDZmcuTGFzdFNOUjAgPSAoVUNIQVIpKHBSeFdJLT5TTlIwKTsKKwkJCXBBZC0+U3RhQ2ZnLkxhc3RTTlIxID0gKFVDSEFSKShwUnhXSS0+U05SMSk7CisJCX0KKworCQkvLyBGaXJzdCBjaGVjayB0aGUgc2l6ZSwgaXQgTVVTVCBub3QgZXhjZWVkIHRoZSBtbG1lIHF1ZXVlIHNpemUKKwkJaWYgKHBSeFdJLT5NUERVdG90YWxCeXRlQ291bnQgPiBNR01UX0RNQV9CVUZGRVJfU0laRSkKKwkJeworCQkJREJHUFJJTlRfRVJSKCgiU1RBSGFuZGxlUnhNZ210RnJhbWU6IGZyYW1lIHRvbyBsYXJnZSwgc2l6ZSA9ICVkIFxuIiwgcFJ4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudCkpOworCQkJYnJlYWs7CisJCX0KKworCQlSRVBPUlRfTUdNVF9GUkFNRV9UT19NTE1FKHBBZCwgcFJ4V0ktPldpcmVsZXNzQ2xpSUQsIHBIZWFkZXIsIHBSeFdJLT5NUERVdG90YWxCeXRlQ291bnQsCisJCQkJCQkJCQlwUnhXSS0+UlNTSTAsIHBSeFdJLT5SU1NJMSwgcFJ4V0ktPlJTU0kyLCBwUnhELT5QbGNwU2lnbmFsKTsKKwl9IHdoaWxlIChGQUxTRSk7CisKKwlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4UGFja2V0LCBORElTX1NUQVRVU19TVUNDRVNTKTsKK30KKworVk9JRCBTVEFIYW5kbGVSeENvbnRyb2xGcmFtZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglSWF9CTEsJCQkqcFJ4QmxrKQoreworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCVBSWFdJX1NUUlVDCQlwUnhXSSA9IHBSeEJsay0+cFJ4V0k7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJUEhFQURFUl84MDJfMTEJcEhlYWRlciA9IHBSeEJsay0+cEhlYWRlcjsKKwlQTkRJU19QQUNLRVQJcFJ4UGFja2V0ID0gcFJ4QmxrLT5wUnhQYWNrZXQ7CisKKwlzd2l0Y2ggKHBIZWFkZXItPkZDLlN1YlR5cGUpCisJeworCQljYXNlIFNVQlRZUEVfQkxPQ0tfQUNLX1JFUToKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCXsKKwkJCQlDbnRsRW5xdWV1ZUZvclJlY3YocEFkLCBwUnhXSS0+V2lyZWxlc3NDbGlJRCwgKHBSeFdJLT5NUERVdG90YWxCeXRlQ291bnQpLCAoUEZSQU1FX0JBX1JFUSlwSGVhZGVyKTsKKwkJCX0KKwkJCWJyZWFrOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQljYXNlIFNVQlRZUEVfQkxPQ0tfQUNLOgorCQljYXNlIFNVQlRZUEVfQUNLOgorCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJfQorCisJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7Cit9CisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVByb2Nlc3MgUnhEb25lIGludGVycnVwdCwgcnVubmluZyBpbiBEUEMgbGV2ZWwKKworCUFyZ3VtZW50czoKKwkJcEFkIFBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwlOb3RlOgorCQlUaGlzIHJvdXRpbmUgaGFzIHRvIG1haW50YWluIFJ4IHJpbmcgcmVhZCBwb2ludGVyLgorCQlOZWVkIHRvIGNvbnNpZGVyIFFPUyBEQVRBIGZvcm1hdCB3aGVuIGNvbnZlcnRpbmcgdG8gODAyLjMKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitCT09MRUFOIFNUQVJ4RG9uZUludGVycnVwdEhhbmRsZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglCT09MRUFOCQkJYXJnYykKK3sKKwlORElTX1NUQVRVUwkJCVN0YXR1czsKKwlVSU5UMzIJCQlSeFByb2Nlc3NlZCwgUnhQZW5kaW5nOworCUJPT0xFQU4JCQliUmVzY2hlZHVsZSA9IEZBTFNFOworCVJUMjhYWF9SWERfU1RSVUMJKnBSeEQ7CisJVUNIQVIJCQkqcERhdGE7CisJUFJYV0lfU1RSVUMJCXBSeFdJOworCVBORElTX1BBQ0tFVAlwUnhQYWNrZXQ7CisJUEhFQURFUl84MDJfMTEJcEhlYWRlcjsKKwlSWF9CTEsJCQlSeENlbGw7CisKKwlSeFByb2Nlc3NlZCA9IFJ4UGVuZGluZyA9IDA7CisKKwkvLyBwcm9jZXNzIHdob2xlIHJ4IHJpbmcKKwl3aGlsZSAoMSkKKwl7CisKKwkJaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SQURJT19PRkYgfAorCQkJCQkJCQlmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTIHwKKwkJCQkJCQkJZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwKKwkJCQkJCQkJZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSB8fAorCQkJIVJUTVBfVEVTVF9GTEFHKHBBZCxmUlRNUF9BREFQVEVSX1NUQVJUX1VQKSkKKwkJeworCQkJYnJlYWs7CisJCX0KKworCisJCVJ4UHJvY2Vzc2VkICsrOyAvLyB0ZXN0CisKKwkJLy8gMS4gYWxsb2NhdGUgYSBuZXcgZGF0YSBwYWNrZXQgaW50byByeCByaW5nIHRvIHJlcGxhY2UgcmVjZWl2ZWQgcGFja2V0CisJCS8vICAgIHRoZW4gcHJvY2Vzc2luZyB0aGUgcmVjZWl2ZWQgcGFja2V0CisJCS8vIDIuIHRoZSBjYWxsZWUgbXVzdCB0YWtlIGNoYXJnZSBvZiByZWxlYXNlIG9mIHBhY2tldAorCQkvLyAzLiBBcyBmYXIgYXMgZHJpdmVyIGlzIGNvbmNlcm5lZCAsCisJCS8vICAgIHRoZSByeCBwYWNrZXQgbXVzdAorCQkvLyAgICAgIGEuIGJlIGluZGljYXRlZCB0byB1cHBlciBsYXllciBvcgorCQkvLyAgICAgIGIuIGJlIHJlbGVhc2VkIGlmIGl0IGlzIGRpc2NhcmRlZAorCQlwUnhQYWNrZXQgPSBHZXRQYWNrZXRGcm9tUnhSaW5nKHBBZCwgJihSeENlbGwuUnhEKSwgJmJSZXNjaGVkdWxlLCAmUnhQZW5kaW5nKTsKKwkJaWYgKHBSeFBhY2tldCA9PSBOVUxMKQorCQl7CisJCQkvLyBubyBtb3JlIHBhY2tldCB0byBwcm9jZXNzCisJCQlicmVhazsKKwkJfQorCisJCS8vIGdldCByeCByaW5nIGRlc2NyaXB0b3IKKwkJcFJ4RCA9ICYoUnhDZWxsLlJ4RCk7CisJCS8vIGdldCByeCBkYXRhIGJ1ZmZlcgorCQlwRGF0YQk9IEdFVF9PU19QS1RfREFUQVBUUihwUnhQYWNrZXQpOworCQlwUnhXSQk9IChQUlhXSV9TVFJVQykgcERhdGE7CisJCXBIZWFkZXIgPSAoUEhFQURFUl84MDJfMTEpIChwRGF0YStSWFdJX1NJWkUpIDsKKworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwkgICAgUlRNUEZyYW1lRW5kaWFuQ2hhbmdlKHBBZCwgKFBVQ0hBUilwSGVhZGVyLCBESVJfUkVBRCwgVFJVRSk7CisJCVJUTVBXSUVuZGlhbkNoYW5nZSgoUFVDSEFSKXBSeFdJLCBUWVBFX1JYV0kpOworI2VuZGlmCisKKwkJLy8gYnVpbGQgUnhDZWxsCisJCVJ4Q2VsbC5wUnhXSSA9IHBSeFdJOworCQlSeENlbGwucEhlYWRlciA9IHBIZWFkZXI7CisJCVJ4Q2VsbC5wUnhQYWNrZXQgPSBwUnhQYWNrZXQ7CisJCVJ4Q2VsbC5wRGF0YSA9IChVQ0hBUiAqKSBwSGVhZGVyOworCQlSeENlbGwuRGF0YVNpemUgPSBwUnhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50OworCQlSeENlbGwuRmxhZ3MgPSAwOworCisJCS8vIEluY3JlYXNlIFRvdGFsIHJlY2VpdmUgYnl0ZSBjb3VudGVyIGFmdGVyIHJlYWwgZGF0YSByZWNlaXZlZCBubyBtYXRlciBhbnkgZXJyb3Igb3Igbm90CisJCXBBZC0+UmFsaW5rQ291bnRlcnMuUmVjZWl2ZWRCeXRlQ291bnQgKz0gIHBSeFdJLT5NUERVdG90YWxCeXRlQ291bnQ7CisJCXBBZC0+UmFsaW5rQ291bnRlcnMuUnhDb3VudCArKzsKKworCQlJTkNfQ09VTlRFUjY0KHBBZC0+V2xhbkNvdW50ZXJzLlJlY2VpdmVkRnJhZ21lbnRDb3VudCk7CisKKwkJaWYgKHBSeFdJLT5NUERVdG90YWxCeXRlQ291bnQgPCAxNCkKKwkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX0ZBSUxVUkU7CisKKyAgICAgICAgaWYgKE1PTklUT1JfT04ocEFkKSkKKwkJeworICAgICAgICAgICAgc2VuZF9tb25pdG9yX3BhY2tldHMocEFkLCAmUnhDZWxsKTsKKwkJCWJyZWFrOworCQl9CisJCS8qIFJUMjg3MCBpbnZva2VzIFNUQVJ4RG9uZUludGVycnVwdEhhbmRsZSgpIGluIHJ0dXNiX2J1bGsuYyAqLworI2lmZGVmIFJBTElOS19BVEUKKwkJaWYgKEFURV9PTihwQWQpKQorCQl7CisJCQlwQWQtPmF0ZS5SeENudFBlclNlYysrOworCQkJQVRFU2FtcGxlUnNzaShwQWQsIHBSeFdJKTsKKyNpZmRlZiBSQUxJTktfMjh4eF9RQQorCQkJaWYgKHBBZC0+YXRlLmJRQVJ4U3RhcnQgPT0gVFJVRSkKKwkJCXsKKwkJCQkvKiAoKnBSeEQpIGhhcyBiZWVuIHN3YXBwZWQgaW4gR2V0UGFja2V0RnJvbVJ4UmluZygpICovCisJCQkJQVRFX1FBX1N0YXRpc3RpY3MocEFkLCBwUnhXSSwgcFJ4RCwJcEhlYWRlcik7CisJCQl9CisjZW5kaWYgLy8gUkFMSU5LXzI4eHhfUUEgLy8KKwkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhQYWNrZXQsIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOworCQkJY29udGludWU7CisJCX0KKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisKKwkJLy8gQ2hlY2sgZm9yIGFsbCBSeEQgZXJyb3JzCisJCVN0YXR1cyA9IFJUTVBDaGVja1J4RXJyb3IocEFkLCBwSGVhZGVyLCBwUnhXSSwgcFJ4RCk7CisKKwkJLy8gSGFuZGxlIHRoZSByZWNlaXZlZCBmcmFtZQorCQlpZiAoU3RhdHVzID09IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJCXsKKwkJCXN3aXRjaCAocEhlYWRlci0+RkMuVHlwZSkKKwkJCXsKKwkJCQkvLyBDQVNFIEksIHJlY2VpdmUgYSBEQVRBIGZyYW1lCisJCQkJY2FzZSBCVFlQRV9EQVRBOgorCQkJCXsKKwkJCQkJLy8gcHJvY2VzcyBEQVRBIGZyYW1lCisJCQkJCVNUQUhhbmRsZVJ4RGF0YUZyYW1lKHBBZCwgJlJ4Q2VsbCk7CisJCQkJfQorCQkJCWJyZWFrOworCQkJCS8vIENBU0UgSUksIHJlY2VpdmUgYSBNR01UIGZyYW1lCisJCQkJY2FzZSBCVFlQRV9NR01UOgorCQkJCXsKKwkJCQkJU1RBSGFuZGxlUnhNZ210RnJhbWUocEFkLCAmUnhDZWxsKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQkJLy8gQ0FTRSBJSUkuIHJlY2VpdmUgYSBDTlRMIGZyYW1lCisJCQkJY2FzZSBCVFlQRV9DTlRMOgorCQkJCXsKKwkJCQkJU1RBSGFuZGxlUnhDb250cm9sRnJhbWUocEFkLCAmUnhDZWxsKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQkJLy8gZGlzY2FyZCBvdGhlciB0eXBlCisJCQkJZGVmYXVsdDoKKwkJCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJcEFkLT5Db3VudGVyczgwMjMuUnhFcnJvcnMrKzsKKwkJCS8vIGRpc2NhcmQgdGhpcyBmcmFtZQorCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCX0KKwl9CisKKwlyZXR1cm4gYlJlc2NoZWR1bGU7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCUFyZ3VtZW50czoKKwkJcEFkIAlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJUlRNUEhhbmRsZVR3YWtldXBJbnRlcnJ1cHQoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJQXNpY0ZvcmNlV2FrZXVwKHBBZCwgRkFMU0UpOworfQorCisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgIEVhcmx5IGNoZWNraW5nIGFuZCBPUy1kZXBlbmVkIHBhcnNpbmcgZm9yIFR4IHBhY2tldCBzZW5kIHRvIG91ciBTVEEgZHJpdmVyLgorCitBcmd1bWVudHM6CisgICAgTkRJU19IQU5ETEUgCU1pbmlwb3J0QWRhcHRlckNvbnRleHQJUG9pbnRlciByZWZlciB0byB0aGUgZGV2aWNlIGhhbmRsZSwgaS5lLiwgdGhlIHBBZC4KKwlQUE5ESVNfUEFDS0VUCXBwUGFja2V0QXJyYXkJCQlUaGUgcGFja2V0IGFycmF5IG5lZWQgdG8gZG8gdHJhbnNtaXNzaW9uLgorCVVJTlQJCQlOdW1iZXJPZlBhY2tldHMJCQlOdW1iZXIgb2YgcGFja2V0IGluIHBhY2tldCBhcnJheS4KKworUmV0dXJuIFZhbHVlOgorCU5PTkUKKworTm90ZToKKwlUaGlzIGZ1bmN0aW9uIGRvIGVhcmx5IGNoZWNraW5nIGFuZCBjbGFzc2lmaWNhdGlvbiBmb3Igc2VuZC1vdXQgcGFja2V0LgorCVlvdSBvbmx5IGNhbiBwdXQgT1MtZGVwZW5lZCAmIFNUQSByZWxhdGVkIGNvZGUgaW4gaGVyZS4KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgU1RBU2VuZFBhY2tldHMoCisJSU4JTkRJU19IQU5ETEUJCU1pbmlwb3J0QWRhcHRlckNvbnRleHQsCisJSU4JUFBORElTX1BBQ0tFVAlwcFBhY2tldEFycmF5LAorCUlOCVVJTlQJCQlOdW1iZXJPZlBhY2tldHMpCit7CisJVUlOVAkJCUluZGV4OworCVBSVE1QX0FEQVBURVIJcEFkID0gKFBSVE1QX0FEQVBURVIpIE1pbmlwb3J0QWRhcHRlckNvbnRleHQ7CisJUE5ESVNfUEFDS0VUCXBQYWNrZXQ7CisJQk9PTEVBTgkJCWFsbG93VG9TZW5kID0gRkFMU0U7CisKKworCWZvciAoSW5kZXggPSAwOyBJbmRleCA8IE51bWJlck9mUGFja2V0czsgSW5kZXgrKykKKwl7CisJCXBQYWNrZXQgPSBwcFBhY2tldEFycmF5W0luZGV4XTsKKworCQlkbworCQl7CisJCQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTKSB8fAorCQkJCVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKSB8fAorCQkJCVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SQURJT19PRkYpKQorCQkJeworCQkJCS8vIERyb3Agc2VuZCByZXF1ZXN0IHNpbmNlIGhhcmR3YXJlIGlzIGluIHJlc2V0IHN0YXRlCisJCQkJCWJyZWFrOworCQkJfQorCQkJZWxzZSBpZiAoIUlORlJBX09OKHBBZCkgJiYgIUFESE9DX09OKHBBZCkpCisJCQl7CisJCQkJLy8gRHJvcCBzZW5kIHJlcXVlc3Qgc2luY2UgdGhlcmUgYXJlIG5vIHBoeXNpY2FsIGNvbm5lY3Rpb24geWV0CisJCQkJCWJyZWFrOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCS8vIFJlY29yZCB0aGF0IG9yaWduYWwgcGFja2V0IHNvdXJjZSBpcyBmcm9tIE5ESVMgbGF5ZXIsc28gdGhhdAorCQkJCS8vIGxhdGVyIG9uIGRyaXZlciBrbm93cyBob3cgdG8gcmVsZWFzZSB0aGlzIE5ESVMgUEFDS0VUCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJCQkJTUFDX1RBQkxFX0VOVFJZICpwRW50cnk7CisJCQkJUFVDSEFSIHBTcmNCdWZWQSA9IEdFVF9PU19QS1RfREFUQVBUUihwUGFja2V0KTsKKworCQkJCXBFbnRyeSA9IE1hY1RhYmxlTG9va3VwKHBBZCwgcFNyY0J1ZlZBKTsKKwkJCQlpZiAocEVudHJ5ICYmIChwRW50cnktPlZhbGlkQXNEbHMgPT0gVFJVRSkpCisJCQkJeworCQkJCQlSVE1QX1NFVF9QQUNLRVRfV0NJRChwUGFja2V0LCBwRW50cnktPkFpZCk7CisJCQkJfQorCQkJCWVsc2UKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKwkJCQlSVE1QX1NFVF9QQUNLRVRfV0NJRChwUGFja2V0LCAwKTsgLy8gdGhpcyBmaWVsZCBpcyB1c2VsZXNzIHdoZW4gaW4gU1RBIG1vZGUKKwkJCQlSVE1QX1NFVF9QQUNLRVRfU09VUkNFKHBQYWNrZXQsIFBLVFNSQ19ORElTKTsKKwkJCQlORElTX1NFVF9QQUNLRVRfU1RBVFVTKHBQYWNrZXQsIE5ESVNfU1RBVFVTX1BFTkRJTkcpOworCQkJCXBBZC0+UmFsaW5rQ291bnRlcnMuUGVuZGluZ05kaXNQYWNrZXRDb3VudCsrOworCisJCQkJYWxsb3dUb1NlbmQgPSBUUlVFOworCQkJfQorCQl9IHdoaWxlKEZBTFNFKTsKKworCQlpZiAoYWxsb3dUb1NlbmQgPT0gVFJVRSkKKwkJCVNUQVNlbmRQYWNrZXQocEFkLCBwUGFja2V0KTsKKwkJZWxzZQorCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCX0KKworCS8vIERlcXVldWUgb3V0Z29pbmcgZnJhbWVzIGZyb20gVHhTd1F1ZXVlW10gYW5kIHByb2Nlc3MgaXQKKwlSVE1QRGVRdWV1ZVBhY2tldChwQWQsIEZBTFNFLCBOVU1fT0ZfVFhfUklORywgTUFYX1RYX1BST0NFU1MpOworCit9CisKKworLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorUm91dGluZSBEZXNjcmlwdGlvbjoKKwlUaGlzIHJvdXRpbmUgaXMgdXNlZCB0byBkbyBwYWNrZXQgcGFyc2luZyBhbmQgY2xhc3NpZmljYXRpb24gZm9yIFR4IHBhY2tldAorCXRvIFNUQSBkZXZpY2UsIGFuZCBpdCB3aWxsIGVuLXF1ZXVlIHBhY2tldHMgdG8gb3VyIFR4U3dRdWV1ZSBkZXBlbmRzIG9uIEFDCisJY2xhc3MuCisKK0FyZ3VtZW50czoKKwlwQWQgICAgCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisJcFBhY2tldCAJUG9pbnRlciB0byBzZW5kIHBhY2tldAorCitSZXR1cm4gVmFsdWU6CisJTkRJU19TVEFUVVNfU1VDQ0VTUwkJCUlmIHN1Y2NlcyB0byBxdWV1ZSB0aGUgcGFja2V0IGludG8gVHhTd1F1ZXVlLgorCU5ESVNfU1RBVFVTX0ZBSUxVUkUJCQlJZiBmYWlsZWQgdG8gZG8gZW4tcXVldWUuCisKK05vdGU6CisJWW91IG9ubHkgY2FuIHB1dCBPUy1pbmRlcGVuZWQgJiBTVEEgcmVsYXRlZCBjb2RlIGluIGhlcmUuCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitORElTX1NUQVRVUyBTVEFTZW5kUGFja2V0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBORElTX1BBQ0tFVAlwUGFja2V0KQoreworCVBBQ0tFVF9JTkZPIAlQYWNrZXRJbmZvOworCVBVQ0hBUgkJCXBTcmNCdWZWQTsKKwlVSU5UCQkJU3JjQnVmTGVuOworCVVJTlQJCQlBbGxvd0ZyYWdTaXplOworCVVDSEFSCQkJTnVtYmVyT2ZGcmFnOworLy8JVUNIQVIJCQlSVFNSZXF1aXJlZDsKKwlVQ0hBUgkJCVF1ZUlkeCwgVXNlclByaW9yaXR5OworCU1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5ID0gTlVMTDsKKwl1bnNpZ25lZCBpbnQgCUlycUZsYWdzOworCVVDSEFSCQkJRmxnSXNJUCA9IDA7CisJVUNIQVIJCQlSYXRlOworCisJLy8gUHJlcGFyZSBwYWNrZXQgaW5mb3JtYXRpb24gc3RydWN0dXJlIGZvciBidWZmZXIgZGVzY3JpcHRvcgorCS8vIGNoYWluZWQgd2l0aGluIGEgc2luZ2xlIE5ESVMgcGFja2V0LgorCVJUTVBfUXVlcnlQYWNrZXRJbmZvKHBQYWNrZXQsICZQYWNrZXRJbmZvLCAmcFNyY0J1ZlZBLCAmU3JjQnVmTGVuKTsKKworCWlmIChwU3JjQnVmVkEgPT0gTlVMTCkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiU1RBU2VuZFBhY2tldCAtLT4gcFNyY0J1ZlZBID09IE5VTEwgISEhU3JjQnVmTGVuPSV4XG4iLFNyY0J1ZkxlbikpOworCQkvLyBSZXNvdXJlY2UgaXMgbG93LCBzeXN0ZW0gZGlkIG5vdCBhbGxvY2F0ZSB2aXJ0dWFsIGFkZHJlc3MKKwkJLy8gcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkUgZGlyZWN0bHkgdG8gdXBwZXIgbGF5ZXIKKwkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCQlyZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRTsKKwl9CisKKworCWlmIChTcmNCdWZMZW4gPCAxNCkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiU1RBU2VuZFBhY2tldCAtLT4gTmRpcyBQYWNrZXQgYnVmZmVyIGVycm9yICEhIVxuIikpOworCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCXJldHVybiAoTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJfQorCisJLy8gSW4gSFQgcmF0ZSBhZGhvYyBtb2RlLCBBLU1QRFUgaXMgb2Z0ZW4gdXNlZC4gU28gbmVlZCB0byBsb29rdXAgQkEgVGFibGUgYW5kIE1BQyBFbnRyeS4KKwkvLyBOb3RlIG11bHRpY2FzdCBwYWNrZXRzIGluIGFkaG9jIGFsc28gdXNlIEJTU0lEX1dDSUQgaW5kZXguCisJeworCQlpZihJTkZSQV9PTihwQWQpKQorCQl7CisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJCQlVU0hPUlQJdG1wV2NpZDsKKworCQkJdG1wV2NpZCA9IFJUTVBfR0VUX1BBQ0tFVF9XQ0lEKHBQYWNrZXQpOworCQkJaWYgKFZBTElEX1dDSUQodG1wV2NpZCkgJiYKKwkJCQkocEFkLT5NYWNUYWIuQ29udGVudFt0bXBXY2lkXS5WYWxpZEFzRGxzPT0gVFJVRSkpCisJCQl7CisJCQkJcEVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbdG1wV2NpZF07CisJCQkJUmF0ZSA9IHBBZC0+TWFjVGFiLkNvbnRlbnRbdG1wV2NpZF0uQ3VyclR4UmF0ZTsKKwkJCX0KKwkJCWVsc2UKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKwkJCXsKKwkJCXBFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdOworCQkJUlRNUF9TRVRfUEFDS0VUX1dDSUQocFBhY2tldCwgQlNTSURfV0NJRCk7CisJCQlSYXRlID0gcEFkLT5Db21tb25DZmcuVHhSYXRlOworCQl9CisJCX0KKwkJZWxzZSBpZiAoQURIT0NfT04ocEFkKSkKKwkJeworCQkJaWYgKCpwU3JjQnVmVkEgJiAweDAxKQorCQkJeworCQkJCVJUTVBfU0VUX1BBQ0tFVF9XQ0lEKHBQYWNrZXQsIE1DQVNUX1dDSUQpOworCQkJCXBFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W01DQVNUX1dDSURdOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXBFbnRyeSA9IE1hY1RhYmxlTG9va3VwKHBBZCwgcFNyY0J1ZlZBKTsKKwkJCX0KKwkJCVJhdGUgPSBwQWQtPkNvbW1vbkNmZy5UeFJhdGU7CisJCX0KKwl9CisKKwlpZiAoIXBFbnRyeSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiU1RBU2VuZFBhY2tldC0+Q2Fubm90IGZpbmQgcEVudHJ5KCUyeDolMng6JTJ4OiUyeDolMng6JTJ4KSBpbiBNYWNUYWIhXG4iLCBQUklOVF9NQUMocFNyY0J1ZlZBKSkpOworCQkvLyBSZXNvdXJlY2UgaXMgbG93LCBzeXN0ZW0gZGlkIG5vdCBhbGxvY2F0ZSB2aXJ0dWFsIGFkZHJlc3MKKwkJLy8gcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkUgZGlyZWN0bHkgdG8gdXBwZXIgbGF5ZXIKKwkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCQlyZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRTsKKwl9CisKKwlpZiAoQURIT0NfT04ocEFkKQorCQkpCisJeworCQlSVE1QX1NFVF9QQUNLRVRfV0NJRChwUGFja2V0LCAoVUNIQVIpcEVudHJ5LT5BaWQpOworCX0KKworCS8vCisJLy8gQ2hlY2sgdGhlIEV0aGVybmV0IEZyYW1lIHR5cGUgb2YgdGhpcyBwYWNrZXQsIGFuZCBzZXQgdGhlIFJUTVBfU0VUX1BBQ0tFVF9TUEVDSUZJQyBmbGFncy4KKwkvLwkJSGVyZSB3ZSBzZXQgdGhlIFBBQ0tFVF9TUEVDSUZJQyBmbGFncyhMTEMsIFZMQU4sIERIQ1AvQVJQLCBFQVBPTCkuCisJUlRNUENoZWNrRXRoZXJUeXBlKHBBZCwgcFBhY2tldCk7CisKKworCisJLy8KKwkvLyBXUEEgODAyLjF4IHNlY3VyZWQgcG9ydCBjb250cm9sIC0gZHJvcCBhbGwgbm9uLTgwMi4xeCBmcmFtZSBiZWZvcmUgcG9ydCBzZWN1cmVkCisJLy8KKwlpZiAoKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpIHx8CisJCSAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKSB8fAorCQkgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIpIHx8CisJCSAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisJCSAgfHwgKHBBZC0+U3RhQ2ZnLklFRUU4MDIxWCA9PSBUUlVFKQorI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKyNpZmRlZiBMRUFQX1NVUFBPUlQKKwkJICB8fCAocEFkLT5TdGFDZmcuTGVhcEF1dGhNb2RlID09IENJU0NPX0F1dGhNb2RlTEVBUCkKKyNlbmRpZiAvLyBMRUFQX1NVUFBPUlQgLy8KKwkJICApCisJCSAgJiYgKChwQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZCA9PSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQpIHx8IChwQWQtPlN0YUNmZy5NaWNFcnJDbnQgPj0gMikpCisJCSAgJiYgKFJUTVBfR0VUX1BBQ0tFVF9FQVBPTChwUGFja2V0KT09IEZBTFNFKQorCQkgICkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiU1RBU2VuZFBhY2tldCAtLT4gRHJvcCBwYWNrZXQgYmVmb3JlIHBvcnQgc2VjdXJlZCAhISFcbiIpKTsKKwkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCisJCXJldHVybiAoTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJfQorCisKKwkvLyBTVEVQIDEuIERlY2lkZSBudW1iZXIgb2YgZnJhZ21lbnRzIHJlcXVpcmVkIHRvIGRlbGl2ZXIgdGhpcyBNU0RVLgorCS8vCSAgIFRoZSBlc3RpbWF0aW9uIGhlcmUgaXMgbm90IHZlcnkgYWNjdXJhdGUgYmVjYXVzZSBkaWZmaWN1bHQgdG8KKwkvLwkgICB0YWtlIGVuY3J5cHRpb24gb3ZlcmhlYWQgaW50byBjb25zaWRlcmF0aW9uIGhlcmUuIFRoZSByZXN1bHQKKwkvLwkgICAiTnVtYmVyT2ZGcmFnIiBpcyB0aGVuIGp1c3QgdXNlZCB0byBwcmUtY2hlY2sgaWYgZW5vdWdoIGZyZWUKKwkvLwkgICBUWEQgYXJlIGF2YWlsYWJsZSB0byBob2xkIHRoaXMgTVNEVS4KKworCisJaWYgKCpwU3JjQnVmVkEgJiAweDAxKQkvLyBmcmFnbWVudGF0aW9uIG5vdCBhbGxvd2VkIG9uIG11bHRpY2FzdCAmIGJyb2FkY2FzdAorCQlOdW1iZXJPZkZyYWcgPSAxOworCWVsc2UgaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQUdHUkVHQVRJT05fSU5VU0VEKSkKKwkJTnVtYmVyT2ZGcmFnID0gMTsJLy8gQWdncmVnYXRpb24gb3ZlcndoZWxtcyBmcmFnbWVudGF0aW9uCisJZWxzZSBpZiAoQ0xJRU5UX1NUQVRVU19URVNUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19BTVNEVV9JTlVTRUQpKQorCQlOdW1iZXJPZkZyYWcgPSAxOwkvLyBBZ2dyZWdhdGlvbiBvdmVyd2hlbG1zIGZyYWdtZW50YXRpb24KKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwllbHNlIGlmICgocEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1PREUgPT0gTU9ERV9IVE1JWCkgfHwgKHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NT0RFID09IE1PREVfSFRHUkVFTkZJRUxEKSkKKwkJTnVtYmVyT2ZGcmFnID0gMTsJLy8gTUlNTyBSQVRFIG92ZXJ3aGVsbXMgZnJhZ21lbnRhdGlvbgorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCWVsc2UKKwl7CisJCS8vIFRoZSBjYWxjdWxhdGVkICJOdW1iZXJPZkZyYWciIGlzIGEgcm91Z2ggZXN0aW1hdGlvbiBiZWNhdXNlIG9mIHZhcmlvdXMKKwkJLy8gZW5jcnlwdGlvbi9lbmNhcHN1bGF0aW9uIG92ZXJoZWFkIG5vdCB0YWtlbiBpbnRvIGNvbnNpZGVyYXRpb24uIFRoaXMgbnVtYmVyIGlzIGp1c3QKKwkJLy8gdXNlZCB0byBtYWtlIHN1cmUgZW5vdWdoIGZyZWUgVFhEIGFyZSBhdmFpbGFibGUgYmVmb3JlIGZyYWdtZW50YXRpb24gdGFrZXMgcGxhY2UuCisJCS8vIEluIGNhc2UgdGhlIGFjdHVhbCByZXF1aXJlZCBudW1iZXIgb2YgZnJhZ21lbnRzIG9mIGFuIE5ESVMgcGFja2V0CisJCS8vIGV4Y2NlZWRzICJOdW1iZXJPZkZyYWciY2FjdWxhdGVkIGhlcmUgYW5kIG5vdCBlbm91Z2ggZnJlZSBUWEQgYXZhaWxhYmxlLCB0aGUKKwkJLy8gbGFzdCBmcmFnbWVudCAoaS5lLiBsYXN0IE1QRFUpIHdpbGwgYmUgZHJvcHBlZCBpbiBSVE1QSGFyZFRyYW5zbWl0KCkgZHVlIHRvIG91dCBvZgorCQkvLyByZXNvdXJjZSwgYW5kIHRoZSBORElTIHBhY2tldCB3aWxsIGJlIGluZGljYXRlZCBORElTX1NUQVRVU19GQUlMVVJFLiBUaGlzIHNob3VsZAorCQkvLyByYXJlbHkgaGFwcGVuIGFuZCB0aGUgcGVuYWx0eSBpcyBqdXN0IGxpa2UgYSBUWCBSRVRSWSBmYWlsLiBBZmZvcmRhYmxlLgorCisJCUFsbG93RnJhZ1NpemUgPSAocEFkLT5Db21tb25DZmcuRnJhZ21lbnRUaHJlc2hvbGQpIC0gTEVOR1RIXzgwMl8xMSAtIExFTkdUSF9DUkM7CisJCU51bWJlck9mRnJhZyA9ICgoUGFja2V0SW5mby5Ub3RhbFBhY2tldExlbmd0aCAtIExFTkdUSF84MDJfMyArIExFTkdUSF84MDJfMV9IKSAvIEFsbG93RnJhZ1NpemUpICsgMTsKKwkJLy8gVG8gZ2V0IGFjY3VyYXRlIG51bWJlciBvZiBmcmFnbWVudGF0aW9uLCBNaW51cyAxIGlmIHRoZSBzaXplIGp1c3QgbWF0Y2ggdG8gYWxsb3dhYmxlIGZyYWdtZW50IHNpemUKKwkJaWYgKCgoUGFja2V0SW5mby5Ub3RhbFBhY2tldExlbmd0aCAtIExFTkdUSF84MDJfMyArIExFTkdUSF84MDJfMV9IKSAlIEFsbG93RnJhZ1NpemUpID09IDApCisJCXsKKwkJCU51bWJlck9mRnJhZy0tOworCQl9CisJfQorCisJLy8gU2F2ZSBmcmFnbWVudCBudW1iZXIgdG8gTmRpcyBwYWNrZXQgcmVzZXJ2ZWQgZmllbGQKKwlSVE1QX1NFVF9QQUNLRVRfRlJBR01FTlRTKHBQYWNrZXQsIE51bWJlck9mRnJhZyk7CisKKworCS8vIFNURVAgMi4gQ2hlY2sgdGhlIHJlcXVpcmVtZW50IG9mIFJUUzoKKwkvLwkgICBJZiBtdWx0aXBsZSBmcmFnbWVudCByZXF1aXJlZCwgUlRTIGlzIHJlcXVpcmVkIG9ubHkgZm9yIHRoZSBmaXJzdCBmcmFnbWVudAorCS8vCSAgIGlmIHRoZSBmcmFnbWVudCBzaXplIGxhcmdlIHRoYW4gUlRTIHRocmVzaG9sZAorCS8vICAgICBGb3IgUlQyOHh4LCBMZXQgQVNJQyBzZW5kIFJUUy9DVFMKKwlSVE1QX1NFVF9QQUNLRVRfUlRTKHBQYWNrZXQsIDApOworCVJUTVBfU0VUX1BBQ0tFVF9UWFJBVEUocFBhY2tldCwgcEFkLT5Db21tb25DZmcuVHhSYXRlKTsKKworCS8vCisJLy8gU1RFUCAzLiBUcmFmZmljIGNsYXNzaWZpY2F0aW9uLiBvdXRjb21lID0gPFVzZXJQcmlvcml0eSwgUXVlSWR4PgorCS8vCisJVXNlclByaW9yaXR5ID0gMDsKKwlRdWVJZHgJCSA9IFFJRF9BQ19CRTsKKwlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19XTU1fSU5VU0VEKSAmJgorCQlDTElFTlRfU1RBVFVTX1RFU1RfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX1dNTV9DQVBBQkxFKSkKKwl7CisJCVVTSE9SVCBQcm90b2NvbDsKKwkJVUNIQVIgIExsY1NuYXBMZW4gPSAwLCBCeXRlMCwgQnl0ZTE7CisJCWRvCisJCXsKKwkJCS8vIGdldCBFdGhlcm5ldCBwcm90b2NvbCBmaWVsZAorCQkJUHJvdG9jb2wgPSAoVVNIT1JUKSgocFNyY0J1ZlZBWzEyXSA8PCA4KSArIHBTcmNCdWZWQVsxM10pOworCQkJaWYgKFByb3RvY29sIDw9IDE1MDApCisJCQl7CisJCQkJLy8gZ2V0IEV0aGVybmV0IHByb3RvY29sIGZpZWxkIGZyb20gTExDL1NOQVAKKwkJCQlpZiAoU25pZmYyQnl0ZXNGcm9tTmRpc0J1ZmZlcihQYWNrZXRJbmZvLnBGaXJzdEJ1ZmZlciwgTEVOR1RIXzgwMl8zICsgNiwgJkJ5dGUwLCAmQnl0ZTEpICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJCQkJCWJyZWFrOworCisJCQkJUHJvdG9jb2wgPSAoVVNIT1JUKSgoQnl0ZTAgPDwgOCkgKyBCeXRlMSk7CisJCQkJTGxjU25hcExlbiA9IDg7CisJCQl9CisKKwkJCS8vIGFsd2F5cyBBQ19CRSBmb3Igbm9uLUlQIHBhY2tldAorCQkJaWYgKFByb3RvY29sICE9IDB4MDgwMCkKKwkJCQlicmVhazsKKworCQkJLy8gZ2V0IElQIGhlYWRlcgorCQkJaWYgKFNuaWZmMkJ5dGVzRnJvbU5kaXNCdWZmZXIoUGFja2V0SW5mby5wRmlyc3RCdWZmZXIsIExFTkdUSF84MDJfMyArIExsY1NuYXBMZW4sICZCeXRlMCwgJkJ5dGUxKSAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCQkJCWJyZWFrOworCisJCQkvLyByZXR1cm4gQUNfQkUgaWYgcGFja2V0IGlzIG5vdCBJUHY0CisJCQlpZiAoKEJ5dGUwICYgMHhmMCkgIT0gMHg0MCkKKwkJCQlicmVhazsKKworCQkJRmxnSXNJUCA9IDE7CisJCQlVc2VyUHJpb3JpdHkgPSAoQnl0ZTEgJiAweGUwKSA+PiA1OworCQkJUXVlSWR4ID0gTWFwVXNlclByaW9yaXR5VG9BY2Nlc3NDYXRlZ29yeVtVc2VyUHJpb3JpdHldOworCisJCQkvLyBUT0RPOiBoYXZlIHRvIGNoZWNrIEFDTSBiaXQuIGFwcGx5IFRTUEVDIGlmIEFDTSBpcyBPTgorCQkJLy8gVE9ETzogZG93bmdyYWRlIFVQICYgUXVlSWR4IGJlZm9yZSBwYXNzaW5nIEFDTQorCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uYkFDTVtRdWVJZHhdKQorCQkJeworCQkJCVVzZXJQcmlvcml0eSA9IDA7CisJCQkJUXVlSWR4CQkgPSBRSURfQUNfQkU7CisJCQl9CisJCX0gd2hpbGUgKEZBTFNFKTsKKwl9CisKKwlSVE1QX1NFVF9QQUNLRVRfVVAocFBhY2tldCwgVXNlclByaW9yaXR5KTsKKworCisKKwkvLyBNYWtlIHN1cmUgU2VuZFR4V2FpdCBxdWV1ZSByZXNvdXJjZSB3b24ndCBiZSB1c2VkIGJ5IG90aGVyIHRocmVhZHMKKwlSVE1QX0lSUV9MT0NLKCZwQWQtPmlycV9sb2NrLCBJcnFGbGFncyk7CisJaWYgKHBBZC0+VHhTd1F1ZXVlW1F1ZUlkeF0uTnVtYmVyID49IE1BWF9QQUNLRVRTX0lOX1FVRVVFKQorCXsKKwkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPmlycV9sb2NrLCBJcnFGbGFncyk7CisjaWZkZWYgQkxPQ0tfTkVUX0lGCisJCVN0b3BOZXRJZlF1ZXVlKHBBZCwgUXVlSWR4LCBwUGFja2V0KTsKKyNlbmRpZiAvLyBCTE9DS19ORVRfSUYgLy8KKwkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCisJCXJldHVybiBORElTX1NUQVRVU19GQUlMVVJFOworCX0KKwllbHNlCisJeworCQlJbnNlcnRUYWlsUXVldWUoJnBBZC0+VHhTd1F1ZXVlW1F1ZUlkeF0sIFBBQ0tFVF9UT19RVUVVRV9FTlRSWShwUGFja2V0KSk7CisJfQorCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgSXJxRmxhZ3MpOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisgICAgaWYgKChwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQXV0b0JBID09IFRSVUUpJiYKKyAgICAgICAgSVNfSFRfU1RBKHBFbnRyeSkpCisJeworCSAgICAvL1BNQUNfVEFCTEVfRU5UUlkgcE1hY0VudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF07CisJCWlmICgoKHBFbnRyeS0+VFhCQWJpdG1hcCAmICgxPDxVc2VyUHJpb3JpdHkpKSA9PSAwKSAmJgorICAgICAgICAgICAgKChwRW50cnktPkJBRGVjbGluZUJpdG1hcCAmICgxPDxVc2VyUHJpb3JpdHkpKSA9PSAwKSAmJgorICAgICAgICAgICAgKHBFbnRyeS0+UG9ydFNlY3VyZWQgPT0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQpCisJCQkgLy8gRm9yIElPVCBjb21wYXRpYmlsaXR5LCBpZgorCQkJIC8vIDEuIEl0IGlzIFJhbGluayBjaGlwIG9yCisJCQkgLy8gMi4gSXQgaXMgT1BFTiBvciBBRVMgbW9kZSwKKwkJCSAvLyB0aGVuIEJBIHNlc3Npb24gY2FuIGJlIGJ1bGl0LgorCQkJICYmICgocEVudHJ5LT5WYWxpZEFzQ0xJICYmIHBBZC0+TWxtZUF1eC5BUFJhbGlua0llICE9IDB4MCkgfHwKKwkJCSAJIChwRW50cnktPldlcFN0YXR1cyA9PSBOZGlzODAyXzExV0VQRGlzYWJsZWQgfHwgcEVudHJ5LT5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkpCisJCQkpCisJCXsKKwkJCUJBT3JpU2Vzc2lvblNldFVwKHBBZCwgcEVudHJ5LCAwLCAwLCAxMCwgRkFMU0UpOworCQl9CisJfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNPc1R4Q291bnRbUXVlSWR4XSsrOyAvLyBUT0RPOiBmb3IgZGVidWcgb25seS4gdG8gYmUgcmVtb3ZlZAorCXJldHVybiBORElTX1NUQVRVU19TVUNDRVNTOworfQorCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlUaGlzIHN1YnJvdXRpbmUgd2lsbCBzY2FuIHRocm91Z2ggcmVsZWF0aXZlIHJpbmcgZGVzY3JpcHRvciB0byBmaW5kCisJCW91dCBhdmFsaWFibGUgZnJlZSByaW5nIGRlc2NyaXB0b3IgYW5kIGNvbXBhcmUgd2l0aCByZXF1ZXN0IHNpemUuCisKKwlBcmd1bWVudHM6CisJCXBBZCBQb2ludGVyIHRvIG91ciBhZGFwdGVyCisJCVF1ZUlkeAkJU2VsZWN0ZWQgVFggUmluZworCisJUmV0dXJuIFZhbHVlOgorCQlORElTX1NUQVRVU19GQUlMVVJFIAlOb3QgZW5vdWdoIGZyZWUgZGVzY3JpcHRvcgorCQlORElTX1NUQVRVU19TVUNDRVNTIAlFbm91Z2ggZnJlZSBkZXNjcmlwdG9yCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KKworI2lmZGVmIFJUMjg3MAorLyoKKwlBY3R1YWxseSwgdGhpcyBmdW5jdGlvbiB1c2VkIHRvIGNoZWNrIGlmIHRoZSBUeEhhcmR3YXJlIFF1ZXVlIHN0aWxsIGhhcyBmcmFtZSBuZWVkIHRvIHNlbmQuCisJSWYgbm8gZnJhbWUgbmVlZCB0byBzZW5kLCBnbyB0byBzbGVlcCwgZWxzZSwgc3RpbGwgd2FrZSB1cC4KKyovCitORElTX1NUQVRVUyBSVE1QRnJlZVRYRFJlcXVlc3QoCisJSU4JCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCQlVQ0hBUgkJCVF1ZUlkeCwKKwlJTgkJVUNIQVIJCQlOdW1iZXJSZXF1aXJlZCwKKwlJTgkJUFVDSEFSCQkJRnJlZU51bWJlcklzKQoreworCS8vVUxPTkcJCUZyZWVOdW1iZXIgPSAwOworCU5ESVNfU1RBVFVTIAlTdGF0dXMgPSBORElTX1NUQVRVU19GQUlMVVJFOworCXVuc2lnbmVkIGxvbmcgICBJcnFGbGFnczsKKwlIVF9UWF9DT05URVhUCSpwSFRUWENvbnRleHQ7CisKKwlzd2l0Y2ggKFF1ZUlkeCkKKwl7CisJCWNhc2UgUUlEX0FDX0JLOgorCQljYXNlIFFJRF9BQ19CRToKKwkJY2FzZSBRSURfQUNfVkk6CisJCWNhc2UgUUlEX0FDX1ZPOgorCQljYXNlIFFJRF9IQ0NBOgorCQkJeworCQkJCXBIVFRYQ29udGV4dCA9ICZwQWQtPlR4Q29udGV4dFtRdWVJZHhdOworCQkJCVJUTVBfSVJRX0xPQ0soJnBBZC0+VHhDb250ZXh0UXVldWVMb2NrW1F1ZUlkeF0sIElycUZsYWdzKTsKKwkJCQlpZiAoKHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiAhPSBwSFRUWENvbnRleHQtPkVOZXh0QnVsa091dFBvc2l0aW9uKSB8fAorCQkJCQkocEhUVFhDb250ZXh0LT5JUlBQZW5kaW5nID09IFRSVUUpKQorCQkJCXsKKwkJCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfRkFJTFVSRTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKwkJCQl9CisJCQkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPlR4Q29udGV4dFF1ZXVlTG9ja1tRdWVJZHhdLCBJcnFGbGFncyk7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFFJRF9NR01UOgorCQkJaWYgKHBBZC0+TWdtdFJpbmcuVHhTd0ZyZWVJZHggIT0gTUdNVF9SSU5HX1NJWkUpCisJCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfRkFJTFVSRTsKKwkJCWVsc2UKKwkJCQlTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiUlRNUEZyZWVUWERSZXF1ZXN0OjpJbnZhbGlkIFF1ZUlkeCg9JWQpXG4iLCBRdWVJZHgpKTsKKwkJCWJyZWFrOworCX0KKworCXJldHVybiAoU3RhdHVzKTsKKworfQorI2VuZGlmIC8vIFJUMjg3MCAvLworCisKK1ZPSUQgUlRNUFNlbmREaXNhc3NvY2lhdGlvbkZyYW1lKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKQoreworfQorCitWT0lECVJUTVBTZW5kTnVsbEZyYW1lKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVDSEFSCQkJVHhSYXRlLAorCUlOCUJPT0xFQU4gCQliUW9zTnVsbCkKK3sKKwlVQ0hBUglOdWxsRnJhbWVbNDhdOworCVVMT05HCUxlbmd0aDsKKwlQSEVBREVSXzgwMl8xMQlwSGVhZGVyXzgwMl8xMTsKKworCisjaWZkZWYgUkFMSU5LX0FURQorCWlmKEFURV9PTihwQWQpKQorCXsKKwkJcmV0dXJuOworCX0KKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisKKyAgICAvLyBXUEEgODAyLjF4IHNlY3VyZWQgcG9ydCBjb250cm9sCisgICAgaWYgKCgocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKSB8fAorICAgICAgICAgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykgfHwKKyAgICAgICAgIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyKSB8fAorICAgICAgICAgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spCisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorCQkJICB8fCAocEFkLT5TdGFDZmcuSUVFRTgwMjFYID09IFRSVUUpCisjZW5kaWYKKyAgICAgICAgKSAmJgorICAgICAgIChwQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZCA9PSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQpKQorCXsKKwkJcmV0dXJuOworCX0KKworCU5kaXNaZXJvTWVtb3J5KE51bGxGcmFtZSwgNDgpOworCUxlbmd0aCA9IHNpemVvZihIRUFERVJfODAyXzExKTsKKworCXBIZWFkZXJfODAyXzExID0gKFBIRUFERVJfODAyXzExKSBOdWxsRnJhbWU7CisKKwlwSGVhZGVyXzgwMl8xMS0+RkMuVHlwZSA9IEJUWVBFX0RBVEE7CisJcEhlYWRlcl84MDJfMTEtPkZDLlN1YlR5cGUgPSBTVUJUWVBFX05VTExfRlVOQzsKKwlwSGVhZGVyXzgwMl8xMS0+RkMuVG9EcyA9IDE7CisJQ09QWV9NQUNfQUREUihwSGVhZGVyXzgwMl8xMS0+QWRkcjEsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKwlDT1BZX01BQ19BRERSKHBIZWFkZXJfODAyXzExLT5BZGRyMiwgcEFkLT5DdXJyZW50QWRkcmVzcyk7CisJQ09QWV9NQUNfQUREUihwSGVhZGVyXzgwMl8xMS0+QWRkcjMsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKworCWlmIChwQWQtPkNvbW1vbkNmZy5iQVBTREZvcmNlUG93ZXJTYXZlKQorCXsKKwkJcEhlYWRlcl84MDJfMTEtPkZDLlB3ck1nbXQgPSBQV1JfU0FWRTsKKwl9CisJZWxzZQorCXsKKwkJcEhlYWRlcl84MDJfMTEtPkZDLlB3ck1nbXQgPSAocEFkLT5TdGFDZmcuUHNtID09IFBXUl9TQVZFKSA/IDE6IDA7CisJfQorCXBIZWFkZXJfODAyXzExLT5EdXJhdGlvbiA9IHBBZC0+Q29tbW9uQ2ZnLkRzaWZzICsgUlRNUENhbGNEdXJhdGlvbihwQWQsIFR4UmF0ZSwgMTQpOworCisJcEFkLT5TZXF1ZW5jZSsrOworCXBIZWFkZXJfODAyXzExLT5TZXF1ZW5jZSA9IHBBZC0+U2VxdWVuY2U7CisKKwkvLyBQcmVwYXJlIFFvc051bGwgZnVuY3Rpb24gZnJhbWUKKwlpZiAoYlFvc051bGwpCisJeworCQlwSGVhZGVyXzgwMl8xMS0+RkMuU3ViVHlwZSA9IFNVQlRZUEVfUU9TX05VTEw7CisKKwkJLy8gY29weSBRT1MgY29udHJvbCBieXRlcworCQlOdWxsRnJhbWVbTGVuZ3RoXQk9ICAwOworCQlOdWxsRnJhbWVbTGVuZ3RoKzFdID0gIDA7CisJCUxlbmd0aCArPSAyOy8vIGlmIHBhZCB3aXRoIDIgYnl0ZXMgZm9yIGFsaWdubWVudCwgQVBTRCB3aWxsIGZhaWwKKwl9CisKKwlIQUxfS2lja091dE51bGxGcmFtZVR4KHBBZCwgMCwgTnVsbEZyYW1lLCBMZW5ndGgpOworCit9CisKKy8vIElSUUwgPSBESVNQQVRDSF9MRVZFTAorVk9JRAlSVE1QU2VuZFJUU0ZyYW1lKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCXBEQSwKKwlJTgl1bnNpZ25lZCBpbnQJTmV4dE1wZHVTaXplLAorCUlOCVVDSEFSCQkJVHhSYXRlLAorCUlOCVVDSEFSCQkJUlRTUmF0ZSwKKwlJTglVU0hPUlQJCQlBY2tEdXJhdGlvbiwKKwlJTglVQ0hBUgkJCVF1ZUlkeCwKKwlJTglVQ0hBUgkJCUZyYW1lR2FwKQoreworfQorCisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBGSU5EIEVOQ1JZUFQgS0VZIEFORCBERUNJREUgQ0lQSEVSIEFMR09SSVRITQorLy8JCUZpbmQgdGhlIFdQQSBrZXksIGVpdGhlciBHcm91cCBvciBQYWlyd2lzZSBLZXkKKy8vCQlMRUFQICsgVEtJUCBhbHNvIHVzZSBXUEEga2V5LgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIERlY2lkZSBXRVAgYml0IGFuZCBjaXBoZXIgc3VpdGUgdG8gYmUgdXNlZC4gU2FtZSBjaXBoZXIgc3VpdGUgc2hvdWxkIGJlIHVzZWQgZm9yIHdob2xlIGZyYWdtZW50IGJ1cnN0CisvLyBJbiBDaXNjbyBDQ1ggMi4wIExlYXAgQXV0aGVudGljYXRpb24KKy8vCQkgICBXZXBTdGF0dXMgaXMgTmRpczgwMl8xMUVuY3J5cHRpb24xRW5hYmxlZCBidXQgdGhlIGtleSB3aWxsIHVzZSBQYWlyd2lzZUtleQorLy8JCSAgIEluc3RlYWQgb2YgdGhlIFNoYXJlZEtleSwgU2hhcmVkS2V5IExlbmd0aCBtYXkgYmUgWmVyby4KK1ZPSUQgU1RBRmluZENpcGhlckFsZ29yaXRobSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglUWF9CTEsJCQkqcFR4QmxrKQoreworCU5ESVNfODAyXzExX0VOQ1JZUFRJT05fU1RBVFVTCUNpcGhlcjsJCQkJLy8gVG8gaW5kaWNhdGUgY2lwaGVyIHVzZWQgZm9yIHRoaXMgcGFja2V0CisJVUNIQVIJCQkJCQkJQ2lwaGVyQWxnID0gQ0lQSEVSX05PTkU7CQkvLyBjaXBoZXIgYWxvZ3JpdGhtCisJVUNIQVIJCQkJCQkJS2V5SWR4ID0gMHhmZjsKKwlQVUNIQVIJCQkJCQkJcFNyY0J1ZlZBOworCVBDSVBIRVJfS0VZCQkJCQkJcEtleSA9IE5VTEw7CisKKwlwU3JjQnVmVkEgPSBHRVRfT1NfUEtUX0RBVEFQVFIocFR4QmxrLT5wUGFja2V0KTsKKworCXsKKwkgICAgLy8gU2VsZWN0IENpcGhlcgorCSAgICBpZiAoKCpwU3JjQnVmVkEgJiAweDAxKSAmJiAoQURIT0NfT04ocEFkKSkpCisJICAgICAgICBDaXBoZXIgPSBwQWQtPlN0YUNmZy5Hcm91cENpcGhlcjsgLy8gQ2lwaGVyIGZvciBNdWx0aWNhc3Qgb3IgQnJvYWRjYXN0CisJICAgIGVsc2UKKwkgICAgICAgIENpcGhlciA9IHBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXI7IC8vIENpcGhlciBmb3IgVW5pY2FzdAorCisJCWlmIChSVE1QX0dFVF9QQUNLRVRfRUFQT0wocFR4QmxrLT5wUGFja2V0KSkKKwkJeworCQkJQVNTRVJUKHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZyA8PSBDSVBIRVJfQ0tJUDEyOCk7CisKKwkJCS8vIDQtd2F5IGhhbmRzaGFraW5nIGZyYW1lIG11c3QgYmUgY2xlYXIKKwkJCWlmICghKFRYX0JMS19URVNUX0ZMQUcocFR4QmxrLCBmVFhfYkNsZWFyRUFQRnJhbWUpKSAmJiAocEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnKSAmJgorCQkJCShwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5LZXlMZW4pKQorCQkJeworCQkJCUNpcGhlckFsZyA9IHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZzsKKwkJCQlLZXlJZHggPSAwOworCQkJfQorCQl9CisJCWVsc2UgaWYgKENpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjFFbmFibGVkKQorCQl7CisjaWZkZWYgTEVBUF9TVVBQT1JUCisJCQlpZiAocEFkLT5TdGFDZmcuQ2tpcEZsYWcgJiAweDEwKSAvLyBDaXNjbyBDS0lQIEtQIGlzIG9uCisJCQl7CisJCQkJaWYgKExFQVBfQ0NLTV9PTihwQWQpKQorCQkJCXsKKwkJCQkJaWYgKCgoKnBTcmNCdWZWQSAmIDB4MDEpICYmIChBREhPQ19PTihwQWQpKSkpCisJCQkJCQlLZXlJZHggPSAxOworCQkJCQllbHNlCisJCQkJCQlLZXlJZHggPSAwOworCQkJCX0KKwkJCQllbHNlCisJCQkJCUtleUlkeCA9IHBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZDsKKwkJCX0KKwkJCWVsc2UgaWYgKHBBZC0+U3RhQ2ZnLkNraXBGbGFnICYgMHgwOCkgLy8gb25seSBDS0lQIENNSUMKKwkJCQlLZXlJZHggPSBwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQ7CisJCQllbHNlIGlmIChMRUFQX0NDS01fT04ocEFkKSkKKwkJCXsKKwkJCQlpZiAoKCpwU3JjQnVmVkEgJiAweDAxKSAmJiAoQURIT0NfT04ocEFkKSkpCisJCQkJCUtleUlkeCA9IDE7CisJCQkJZWxzZQorCQkJCQlLZXlJZHggPSAwOworCQkJfQorCQkJZWxzZQkvLyBzdGFuZGFyZCBXRVA2NCBvciBXRVAxMjgKKyNlbmRpZiAvLyBMRUFQX1NVUFBPUlQgLy8KKwkJCQlLZXlJZHggPSBwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQ7CisJCX0KKwkJZWxzZSBpZiAoKENpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKSB8fAorCQkJCSAoQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpKQorCQl7CisJCQlpZiAoKCpwU3JjQnVmVkEgJiAweDAxKSAmJiAoQURIT0NfT04ocEFkKSkpIC8vIG11bHRpY2FzdAorCQkJCUtleUlkeCA9IHBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZDsKKwkJCWVsc2UgaWYgKHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLktleUxlbikKKwkJCQlLZXlJZHggPSAwOworCQkJZWxzZQorCQkJCUtleUlkeCA9IHBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZDsKKwkJfQorCisJCWlmIChLZXlJZHggPT0gMHhmZikKKwkJCUNpcGhlckFsZyA9IENJUEhFUl9OT05FOworCQllbHNlIGlmICgoQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uRGlzYWJsZWQpIHx8IChwQWQtPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLktleUxlbiA9PSAwKSkKKwkJCUNpcGhlckFsZyA9IENJUEhFUl9OT05FOworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKwkgICAgZWxzZSBpZiAoIHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCAmJgorCSAgICAgICAgICAgICAoQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMUVuYWJsZWQpICYmCisJICAgICAgICAgICAgIChwQWQtPlN0YUNmZy5JRUVFODAyMVggPT0gVFJVRSkgJiYKKwkgICAgICAgICAgICAgKHBBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkID09IFdQQV84MDJfMVhfUE9SVF9OT1RfU0VDVVJFRCkpCisJICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfTk9ORTsKKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisJCWVsc2UKKwkJeworCQkJLy9IZWFkZXJfODAyXzExLkZDLldlcCA9IDE7CisJCQlDaXBoZXJBbGcgPSBwQWQtPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLkNpcGhlckFsZzsKKwkJCXBLZXkgPSAmcEFkLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XTsKKwkJfQorCX0KKworCXBUeEJsay0+Q2lwaGVyQWxnID0gQ2lwaGVyQWxnOworCXBUeEJsay0+cEtleSA9IHBLZXk7Cit9CisKKworVk9JRCBTVEFCdWlsZENvbW1vbjgwMl8xMUhlYWRlcigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgVFhfQkxLICAgICAgICAgICpwVHhCbGspCit7CisKKwlIRUFERVJfODAyXzExCSpwSGVhZGVyXzgwMl8xMTsKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwlCT09MRUFOCWJETFNGcmFtZSA9IEZBTFNFOworCUlOVAlEbHNFbnRyeUluZGV4ID0gMDsKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKworCS8vCisJLy8gTUFLRSBBIENPTU1PTiA4MDIuMTEgSEVBREVSCisJLy8KKworCS8vIG5vcm1hbCB3bGFuIGhlYWRlciBzaXplIDogMjQgb2N0ZXRzCisJcFR4QmxrLT5NcGR1SGVhZGVyTGVuID0gc2l6ZW9mKEhFQURFUl84MDJfMTEpOworCisJcEhlYWRlcl84MDJfMTEgPSAoSEVBREVSXzgwMl8xMSAqKSAmcFR4QmxrLT5IZWFkZXJCdWZbVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkVdOworCisJTmRpc1plcm9NZW1vcnkocEhlYWRlcl84MDJfMTEsIHNpemVvZihIRUFERVJfODAyXzExKSk7CisKKwlwSGVhZGVyXzgwMl8xMS0+RkMuRnJEcyA9IDA7CisJcEhlYWRlcl84MDJfMTEtPkZDLlR5cGUgPSBCVFlQRV9EQVRBOworCXBIZWFkZXJfODAyXzExLT5GQy5TdWJUeXBlID0gKChUWF9CTEtfVEVTVF9GTEFHKHBUeEJsaywgZlRYX2JXTU0pKSA/IFNVQlRZUEVfUURBVEEgOiBTVUJUWVBFX0RBVEEpOworCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJaWYgKElORlJBX09OKHBBZCkpCisJeworCQkvLyBDaGVjayBpZiB0aGUgZnJhbWUgY2FuIGJlIHNlbnQgdGhyb3VnaCBETFMgZGlyZWN0IGxpbmsgaW50ZXJmYWNlCisJCS8vIElmIHBhY2tldCBjYW4gYmUgc2VudCB0aHJvdWdoIERMUywgdGhlbiBmb3JjZSBhZ2dyZWdhdGlvbiBkaXNhYmxlLiAoSGFyZCB0byBkZXRlcm1pbmUgcGVlciBTVEEncyBjYXBhYmlsaXR5KQorCQlEbHNFbnRyeUluZGV4ID0gUlRNUENoZWNrRExTRnJhbWUocEFkLCBwVHhCbGstPnBTcmNCdWZIZWFkZXIpOworCQlpZiAoRGxzRW50cnlJbmRleCA+PSAwKQorCQkJYkRMU0ZyYW1lID0gVFJVRTsKKwkJZWxzZQorCQkJYkRMU0ZyYW1lID0gRkFMU0U7CisJfQorI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCisgICAgaWYgKHBUeEJsay0+cE1hY0VudHJ5KQorCXsKKwkJaWYgKFRYX0JMS19URVNUX0ZMQUcocFR4QmxrLCBmVFhfYkZvcmNlTm9uUW9TKSkKKwkJeworCQkJcEhlYWRlcl84MDJfMTEtPlNlcXVlbmNlID0gcFR4QmxrLT5wTWFjRW50cnktPk5vblFvc0RhdGFTZXE7CisJCQlwVHhCbGstPnBNYWNFbnRyeS0+Tm9uUW9zRGF0YVNlcSA9IChwVHhCbGstPnBNYWNFbnRyeS0+Tm9uUW9zRGF0YVNlcSsxKSAmIE1BWFNFUTsKKwkJfQorCQllbHNlCisJCXsKKyAgICAJICAgIHBIZWFkZXJfODAyXzExLT5TZXF1ZW5jZSA9IHBUeEJsay0+cE1hY0VudHJ5LT5UeFNlcVtwVHhCbGstPlVzZXJQcmlvcml0eV07CisgICAgCSAgICBwVHhCbGstPnBNYWNFbnRyeS0+VHhTZXFbcFR4QmxrLT5Vc2VyUHJpb3JpdHldID0gKHBUeEJsay0+cE1hY0VudHJ5LT5UeFNlcVtwVHhCbGstPlVzZXJQcmlvcml0eV0rMSkgJiBNQVhTRVE7CisgICAgCX0KKwl9CisJZWxzZQorCXsKKwkJcEhlYWRlcl84MDJfMTEtPlNlcXVlbmNlID0gcEFkLT5TZXF1ZW5jZTsKKwkJcEFkLT5TZXF1ZW5jZSA9IChwQWQtPlNlcXVlbmNlKzEpICYgTUFYU0VROyAvLyBuZXh0IHNlcXVlbmNlCisJfQorCisJcEhlYWRlcl84MDJfMTEtPkZyYWcgPSAwOworCisJcEhlYWRlcl84MDJfMTEtPkZDLk1vcmVEYXRhID0gVFhfQkxLX1RFU1RfRkxBRyhwVHhCbGssIGZUWF9iTW9yZURhdGEpOworCisJeworCQlpZiAoSU5GUkFfT04ocEFkKSkKKwkJeworI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCQkJaWYgKGJETFNGcmFtZSkKKwkJCXsKKwkJCQlDT1BZX01BQ19BRERSKHBIZWFkZXJfODAyXzExLT5BZGRyMSwgcFR4QmxrLT5wU3JjQnVmSGVhZGVyKTsKKwkJCQlDT1BZX01BQ19BRERSKHBIZWFkZXJfODAyXzExLT5BZGRyMiwgcEFkLT5DdXJyZW50QWRkcmVzcyk7CisJCQkJQ09QWV9NQUNfQUREUihwSGVhZGVyXzgwMl8xMS0+QWRkcjMsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKwkJCQlwSGVhZGVyXzgwMl8xMS0+RkMuVG9EcyA9IDA7CisJCQl9CisJCQllbHNlCisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisJCQl7CisJCQlDT1BZX01BQ19BRERSKHBIZWFkZXJfODAyXzExLT5BZGRyMSwgcEFkLT5Db21tb25DZmcuQnNzaWQpOworCQkJQ09QWV9NQUNfQUREUihwSGVhZGVyXzgwMl8xMS0+QWRkcjIsIHBBZC0+Q3VycmVudEFkZHJlc3MpOworCQkJQ09QWV9NQUNfQUREUihwSGVhZGVyXzgwMl8xMS0+QWRkcjMsIHBUeEJsay0+cFNyY0J1ZkhlYWRlcik7CisJCQlwSGVhZGVyXzgwMl8xMS0+RkMuVG9EcyA9IDE7CisJCX0KKwkJfQorCQllbHNlIGlmIChBREhPQ19PTihwQWQpKQorCQl7CisJCQlDT1BZX01BQ19BRERSKHBIZWFkZXJfODAyXzExLT5BZGRyMSwgcFR4QmxrLT5wU3JjQnVmSGVhZGVyKTsKKwkJCUNPUFlfTUFDX0FERFIocEhlYWRlcl84MDJfMTEtPkFkZHIyLCBwQWQtPkN1cnJlbnRBZGRyZXNzKTsKKwkJCUNPUFlfTUFDX0FERFIocEhlYWRlcl84MDJfMTEtPkFkZHIzLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisJCQlwSGVhZGVyXzgwMl8xMS0+RkMuVG9EcyA9IDA7CisJCX0KKwl9CisKKwlpZiAocFR4QmxrLT5DaXBoZXJBbGcgIT0gQ0lQSEVSX05PTkUpCisJCXBIZWFkZXJfODAyXzExLT5GQy5XZXAgPSAxOworCisJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkvLyBTVEVQIDIuIE1BS0UgQSBDT01NT04gODAyLjExIEhFQURFUiBTSEFSRUQgQlkgRU5USVJFIEZSQUdNRU5UIEJVUlNULiBGaWxsIHNlcXVlbmNlIGxhdGVyLgorCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJBUFNERm9yY2VQb3dlclNhdmUpCisgICAgCXBIZWFkZXJfODAyXzExLT5GQy5Qd3JNZ210ID0gUFdSX1NBVkU7CisJZWxzZQorICAgIAlwSGVhZGVyXzgwMl8xMS0+RkMuUHdyTWdtdCA9IChwQWQtPlN0YUNmZy5Qc20gPT0gUFdSX1NBVkUpOworfQorCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCitWT0lEIFNUQUJ1aWxkQ2FjaGU4MDJfMTFIZWFkZXIoCisJSU4gUlRNUF9BREFQVEVSCQkqcEFkLAorCUlOIFRYX0JMSwkJCSpwVHhCbGssCisJSU4gVUNIQVIJCQkqcEhlYWRlcikKK3sKKwlNQUNfVEFCTEVfRU5UUlkJKnBNYWNFbnRyeTsKKwlQSEVBREVSXzgwMl8xMQlwSGVhZGVyODAyMTE7CisKKwlwSGVhZGVyODAyMTEgPSAoUEhFQURFUl84MDJfMTEpcEhlYWRlcjsKKwlwTWFjRW50cnkgPSBwVHhCbGstPnBNYWNFbnRyeTsKKworCS8vCisJLy8gVXBkYXRlIHRoZSBjYWNoZWQgODAyLjExIEhFQURFUgorCS8vCisKKwkvLyBub3JtYWwgd2xhbiBoZWFkZXIgc2l6ZSA6IDI0IG9jdGV0cworCXBUeEJsay0+TXBkdUhlYWRlckxlbiA9IHNpemVvZihIRUFERVJfODAyXzExKTsKKworCS8vIE1vcmUgQml0CisJcEhlYWRlcjgwMjExLT5GQy5Nb3JlRGF0YSA9IFRYX0JMS19URVNUX0ZMQUcocFR4QmxrLCBmVFhfYk1vcmVEYXRhKTsKKworCS8vIFNlcXVlbmNlCisJcEhlYWRlcjgwMjExLT5TZXF1ZW5jZSA9IHBNYWNFbnRyeS0+VHhTZXFbcFR4QmxrLT5Vc2VyUHJpb3JpdHldOworICAgIHBNYWNFbnRyeS0+VHhTZXFbcFR4QmxrLT5Vc2VyUHJpb3JpdHldID0gKHBNYWNFbnRyeS0+VHhTZXFbcFR4QmxrLT5Vc2VyUHJpb3JpdHldKzEpICYgTUFYU0VROworCisJeworCQkvLyBDaGVjayBpZiB0aGUgZnJhbWUgY2FuIGJlIHNlbnQgdGhyb3VnaCBETFMgZGlyZWN0IGxpbmsgaW50ZXJmYWNlCisJCS8vIElmIHBhY2tldCBjYW4gYmUgc2VudCB0aHJvdWdoIERMUywgdGhlbiBmb3JjZSBhZ2dyZWdhdGlvbiBkaXNhYmxlLiAoSGFyZCB0byBkZXRlcm1pbmUgcGVlciBTVEEncyBjYXBhYmlsaXR5KQorI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCQlCT09MRUFOCWJETFNGcmFtZSA9IEZBTFNFOworCQlJTlQJRGxzRW50cnlJbmRleCA9IDA7CisKKwkJRGxzRW50cnlJbmRleCA9IFJUTVBDaGVja0RMU0ZyYW1lKHBBZCwgcFR4QmxrLT5wU3JjQnVmSGVhZGVyKTsKKwkJaWYgKERsc0VudHJ5SW5kZXggPj0gMCkKKwkJCWJETFNGcmFtZSA9IFRSVUU7CisJCWVsc2UKKwkJCWJETFNGcmFtZSA9IEZBTFNFOworI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCisJCS8vIFRoZSBhZGRyMyBvZiBub3JtYWwgcGFja2V0IHNlbmQgZnJvbSBEUyBpcyBEZXN0IE1hYyBhZGRyZXNzLgorI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCQlpZiAoYkRMU0ZyYW1lKQorCQl7CisJCQlDT1BZX01BQ19BRERSKHBIZWFkZXI4MDIxMS0+QWRkcjEsIHBUeEJsay0+cFNyY0J1ZkhlYWRlcik7CisJCQlDT1BZX01BQ19BRERSKHBIZWFkZXI4MDIxMS0+QWRkcjMsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKwkJCXBIZWFkZXI4MDIxMS0+RkMuVG9EcyA9IDA7CisJCX0KKwkJZWxzZQorI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCQlpZiAoQURIT0NfT04ocEFkKSkKKwkJCUNPUFlfTUFDX0FERFIocEhlYWRlcjgwMjExLT5BZGRyMywgcEFkLT5Db21tb25DZmcuQnNzaWQpOworCQllbHNlCisJCQlDT1BZX01BQ19BRERSKHBIZWFkZXI4MDIxMS0+QWRkcjMsIHBUeEJsay0+cFNyY0J1ZkhlYWRlcik7CisJfQorCisJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkvLyBTVEVQIDIuIE1BS0UgQSBDT01NT04gODAyLjExIEhFQURFUiBTSEFSRUQgQlkgRU5USVJFIEZSQUdNRU5UIEJVUlNULiBGaWxsIHNlcXVlbmNlIGxhdGVyLgorCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJBUFNERm9yY2VQb3dlclNhdmUpCisgICAgCXBIZWFkZXI4MDIxMS0+RkMuUHdyTWdtdCA9IFBXUl9TQVZFOworCWVsc2UKKyAgICAJcEhlYWRlcjgwMjExLT5GQy5Qd3JNZ210ID0gKHBBZC0+U3RhQ2ZnLlBzbSA9PSBQV1JfU0FWRSk7Cit9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKK3N0YXRpYyBpbmxpbmUgUFVDSEFSIFNUQV9CdWlsZF9BUmFsaW5rX0ZyYW1lX0hlYWRlcigKKwlJTiBSVE1QX0FEQVBURVIgKnBBZCwKKwlJTiBUWF9CTEsJCSpwVHhCbGspCit7CisJUFVDSEFSCQkJcEhlYWRlckJ1ZlB0cjsKKwlIRUFERVJfODAyXzExCSpwSGVhZGVyXzgwMl8xMTsKKwlQTkRJU19QQUNLRVQJcE5leHRQYWNrZXQ7CisJVUlOVDMyCQkJbmV4dEJ1ZkxlbjsKKwlQUVVFVUVfRU5UUlkJcFFFbnRyeTsKKworCVNUQUZpbmRDaXBoZXJBbGdvcml0aG0ocEFkLCBwVHhCbGspOworCVNUQUJ1aWxkQ29tbW9uODAyXzExSGVhZGVyKHBBZCwgcFR4QmxrKTsKKworCisJcEhlYWRlckJ1ZlB0ciA9ICZwVHhCbGstPkhlYWRlckJ1ZltUWElORk9fU0laRSArIFRYV0lfU0laRV07CisJcEhlYWRlcl84MDJfMTEgPSAoSEVBREVSXzgwMl8xMSAqKSBwSGVhZGVyQnVmUHRyOworCisJLy8gc3RlYWwgIm9yZGVyIiBiaXQgdG8gbWFyayAiYWdncmVnYXRpb24iCisJcEhlYWRlcl84MDJfMTEtPkZDLk9yZGVyID0gMTsKKworCS8vIHNraXAgY29tbW9uIGhlYWRlcgorCXBIZWFkZXJCdWZQdHIgKz0gcFR4QmxrLT5NcGR1SGVhZGVyTGVuOworCisJaWYgKFRYX0JMS19URVNUX0ZMQUcocFR4QmxrLCBmVFhfYldNTSkpCisJeworCQkvLworCQkvLyBidWlsZCBRT1MgQ29udHJvbCBieXRlcworCQkvLworCQkqcEhlYWRlckJ1ZlB0ciA9IChwVHhCbGstPlVzZXJQcmlvcml0eSAmIDB4MEYpOworCisJCSoocEhlYWRlckJ1ZlB0cisxKSA9IDA7CisJCXBIZWFkZXJCdWZQdHIgKz0yOworCQlwVHhCbGstPk1wZHVIZWFkZXJMZW4gKz0gMjsKKwl9CisKKwkvLyBwYWRkaW5nIGF0IGZyb250IG9mIExMQyBoZWFkZXIuIExMQyBoZWFkZXIgc2hvdWxkIGF0IDQtYnl0ZXMgYWxpZ21lbnQuCisJcFR4QmxrLT5IZHJQYWRMZW4gPSAoVUxPTkcpcEhlYWRlckJ1ZlB0cjsKKwlwSGVhZGVyQnVmUHRyID0gKFBDSEFSKVJPVU5EX1VQKHBIZWFkZXJCdWZQdHIsIDQpOworCXBUeEJsay0+SGRyUGFkTGVuID0gKFVMT05HKShwSGVhZGVyQnVmUHRyIC0gcFR4QmxrLT5IZHJQYWRMZW4pOworCisJLy8gRm9yIFJBIEFnZ3JlZ2F0aW9uLAorCS8vIHB1dCB0aGUgMm5kIE1TRFUgbGVuZ3RoKGV4dHJhIDItYnl0ZSBmaWVsZCkgYWZ0ZXIgUU9TX0NPTlRST0wgaW4gbGl0dGxlIGVuZGlhbiBmb3JtYXQKKwlwUUVudHJ5ID0gcFR4QmxrLT5UeFBhY2tldExpc3QuSGVhZDsKKwlwTmV4dFBhY2tldCA9IFFVRVVFX0VOVFJZX1RPX1BLVChwUUVudHJ5KTsKKwluZXh0QnVmTGVuID0gR0VUX09TX1BLVF9MRU4ocE5leHRQYWNrZXQpOworCWlmIChSVE1QX0dFVF9QQUNLRVRfVkxBTihwTmV4dFBhY2tldCkpCisJCW5leHRCdWZMZW4gLT0gTEVOR1RIXzgwMl8xUTsKKworCSpwSGVhZGVyQnVmUHRyID0gKFVDSEFSKW5leHRCdWZMZW4gJiAweGZmOworCSoocEhlYWRlckJ1ZlB0cisxKSA9IChVQ0hBUikobmV4dEJ1ZkxlbiA+PiA4KTsKKworCXBIZWFkZXJCdWZQdHIgKz0gMjsKKwlwVHhCbGstPk1wZHVIZWFkZXJMZW4gKz0gMjsKKworCXJldHVybiBwSGVhZGVyQnVmUHRyOworCit9CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKK3N0YXRpYyBpbmxpbmUgUFVDSEFSIFNUQV9CdWlsZF9BTVNEVV9GcmFtZV9IZWFkZXIoCisJSU4gUlRNUF9BREFQVEVSICpwQWQsCisJSU4gVFhfQkxLCQkqcFR4QmxrKQoreworCVBVQ0hBUgkJCXBIZWFkZXJCdWZQdHI7Ly8sIHBTYXZlQnVmUHRyOworCUhFQURFUl84MDJfMTEJKnBIZWFkZXJfODAyXzExOworCisKKwlTVEFGaW5kQ2lwaGVyQWxnb3JpdGhtKHBBZCwgcFR4QmxrKTsKKwlTVEFCdWlsZENvbW1vbjgwMl8xMUhlYWRlcihwQWQsIHBUeEJsayk7CisKKwlwSGVhZGVyQnVmUHRyID0gJnBUeEJsay0+SGVhZGVyQnVmW1RYSU5GT19TSVpFICsgVFhXSV9TSVpFXTsKKwlwSGVhZGVyXzgwMl8xMSA9IChIRUFERVJfODAyXzExICopIHBIZWFkZXJCdWZQdHI7CisKKwkvLyBza2lwIGNvbW1vbiBoZWFkZXIKKwlwSGVhZGVyQnVmUHRyICs9IHBUeEJsay0+TXBkdUhlYWRlckxlbjsKKworCS8vCisJLy8gYnVpbGQgUU9TIENvbnRyb2wgYnl0ZXMKKwkvLworCSpwSGVhZGVyQnVmUHRyID0gKHBUeEJsay0+VXNlclByaW9yaXR5ICYgMHgwRik7CisKKwkvLworCS8vIEEtTVNEVSBwYWNrZXQKKwkvLworCSpwSGVhZGVyQnVmUHRyIHw9IDB4ODA7CisKKwkqKHBIZWFkZXJCdWZQdHIrMSkgPSAwOworCXBIZWFkZXJCdWZQdHIgKz0yOworCXBUeEJsay0+TXBkdUhlYWRlckxlbiArPSAyOworCisJLy9wU2F2ZUJ1ZlB0ciA9IHBIZWFkZXJCdWZQdHI7CisKKwkvLworCS8vIHBhZGRpbmcgYXQgZnJvbnQgb2YgTExDIGhlYWRlcgorCS8vIExMQyBoZWFkZXIgc2hvdWxkIGxvY2F0ZSBhdCA0LW9jdGV0cyBhbGlnbWVudAorCS8vCisJLy8gQEBAIE1wZHVIZWFkZXJMZW4gZXhjbHVkaW5nIHBhZGRpbmcgQEBACisJLy8KKwlwVHhCbGstPkhkclBhZExlbiA9IChVTE9ORylwSGVhZGVyQnVmUHRyOworCXBIZWFkZXJCdWZQdHIgPSAoUENIQVIpIFJPVU5EX1VQKHBIZWFkZXJCdWZQdHIsIDQpOworCXBUeEJsay0+SGRyUGFkTGVuID0gKFVMT05HKShwSGVhZGVyQnVmUHRyIC0gcFR4QmxrLT5IZHJQYWRMZW4pOworCisJcmV0dXJuIHBIZWFkZXJCdWZQdHI7CisKK30KKworCitWT0lEIFNUQV9BTVBEVV9GcmFtZV9UeCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglUWF9CTEsJCQkqcFR4QmxrKQoreworCUhFQURFUl84MDJfMTEJKnBIZWFkZXJfODAyXzExOworCVBVQ0hBUgkJCXBIZWFkZXJCdWZQdHI7CisJVVNIT1JUCQkJRnJlZU51bWJlcjsKKwlNQUNfVEFCTEVfRU5UUlkJKnBNYWNFbnRyeTsKKwlCT09MRUFOCQkJYlZMQU5Qa3Q7CisJUFFVRVVFX0VOVFJZCXBRRW50cnk7CisKKwlBU1NFUlQocFR4QmxrKTsKKworCXdoaWxlKHBUeEJsay0+VHhQYWNrZXRMaXN0LkhlYWQpCisJeworCQlwUUVudHJ5ID0gUmVtb3ZlSGVhZFF1ZXVlKCZwVHhCbGstPlR4UGFja2V0TGlzdCk7CisJCXBUeEJsay0+cFBhY2tldCA9IFFVRVVFX0VOVFJZX1RPX1BBQ0tFVChwUUVudHJ5KTsKKwkJaWYgKCBSVE1QX0ZpbGxUeEJsa0luZm8ocEFkLCBwVHhCbGspICE9IFRSVUUpCisJCXsKKwkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwVHhCbGstPnBQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCQkJY29udGludWU7CisJCX0KKworCQliVkxBTlBrdCA9IChSVE1QX0dFVF9QQUNLRVRfVkxBTihwVHhCbGstPnBQYWNrZXQpID8gVFJVRSA6IEZBTFNFKTsKKworCQlwTWFjRW50cnkgPSBwVHhCbGstPnBNYWNFbnRyeTsKKwkJaWYgKHBNYWNFbnRyeS0+aXNDYWNoZWQpCisJCXsKKwkJCS8vIE5PVEU6IFBsZWFzZSBtYWtlIHN1cmUgdGhlIHNpemUgb2YgcE1hY0VudHJ5LT5DYWNoZWRCdWZbXSBpcyBzbWFsbGVyIHRoYW4gcFR4QmxrLT5IZWFkZXJCdWZbXSEhISEKKwkJCU5kaXNNb3ZlTWVtb3J5KChQVUNIQVIpJnBUeEJsay0+SGVhZGVyQnVmW1RYSU5GT19TSVpFXSwgKFBVQ0hBUikmcE1hY0VudHJ5LT5DYWNoZWRCdWZbMF0sIFRYV0lfU0laRSArIHNpemVvZihIRUFERVJfODAyXzExKSk7CisJCQlwSGVhZGVyQnVmUHRyID0gKFBVQ0hBUikoJnBUeEJsay0+SGVhZGVyQnVmW1RYSU5GT19TSVpFICsgVFhXSV9TSVpFXSk7CisJCQlTVEFCdWlsZENhY2hlODAyXzExSGVhZGVyKHBBZCwgcFR4QmxrLCBwSGVhZGVyQnVmUHRyKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCVNUQUZpbmRDaXBoZXJBbGdvcml0aG0ocEFkLCBwVHhCbGspOworCQkJU1RBQnVpbGRDb21tb244MDJfMTFIZWFkZXIocEFkLCBwVHhCbGspOworCisJCQlwSGVhZGVyQnVmUHRyID0gJnBUeEJsay0+SGVhZGVyQnVmW1RYSU5GT19TSVpFICsgVFhXSV9TSVpFXTsKKwkJfQorCisKKwkJcEhlYWRlcl84MDJfMTEgPSAoSEVBREVSXzgwMl8xMSAqKSBwSGVhZGVyQnVmUHRyOworCisJCS8vIHNraXAgY29tbW9uIGhlYWRlcgorCQlwSGVhZGVyQnVmUHRyICs9IHBUeEJsay0+TXBkdUhlYWRlckxlbjsKKworCQkvLworCQkvLyBidWlsZCBRT1MgQ29udHJvbCBieXRlcworCQkvLworCQkqcEhlYWRlckJ1ZlB0ciA9IChwVHhCbGstPlVzZXJQcmlvcml0eSAmIDB4MEYpOworCQkqKHBIZWFkZXJCdWZQdHIrMSkgPSAwOworCQlwSGVhZGVyQnVmUHRyICs9MjsKKwkJcFR4QmxrLT5NcGR1SGVhZGVyTGVuICs9IDI7CisKKwkJLy8KKwkJLy8gYnVpbGQgSFRDKworCQkvLyBIVEMgY29udHJvbCBmaWxlZCBmb2xsb3dpbmcgUW9TIGZpZWxkCisJCS8vCisJCWlmICgocEFkLT5Db21tb25DZmcuYlJkZyA9PSBUUlVFKSAmJiBDTElFTlRfU1RBVFVTX1RFU1RfRkxBRyhwVHhCbGstPnBNYWNFbnRyeSwgZkNMSUVOVF9TVEFUVVNfUkRHX0NBUEFCTEUpKQorCQl7CisJCQlpZiAocE1hY0VudHJ5LT5pc0NhY2hlZCA9PSBGQUxTRSkKKwkJCXsKKwkJCQkvLyBtYXJrIEhUQyBiaXQKKwkJCQlwSGVhZGVyXzgwMl8xMS0+RkMuT3JkZXIgPSAxOworCisJCQkJTmRpc1plcm9NZW1vcnkocEhlYWRlckJ1ZlB0ciwgNCk7CisJCQkJKihwSGVhZGVyQnVmUHRyKzMpIHw9IDB4ODA7CisJCQl9CisJCQlwSGVhZGVyQnVmUHRyICs9IDQ7CisJCQlwVHhCbGstPk1wZHVIZWFkZXJMZW4gKz0gNDsKKwkJfQorCisJCS8vcFR4QmxrLT5NcGR1SGVhZGVyTGVuID0gcEhlYWRlckJ1ZlB0ciAtIHBUeEJsay0+SGVhZGVyQnVmIC0gVFhXSV9TSVpFIC0gVFhJTkZPX1NJWkU7CisJCUFTU0VSVChwVHhCbGstPk1wZHVIZWFkZXJMZW4gPj0gMjQpOworCisJCS8vIHNraXAgODAyLjMgaGVhZGVyCisJCXBUeEJsay0+cFNyY0J1ZkRhdGEgPSBwVHhCbGstPnBTcmNCdWZIZWFkZXIgKyBMRU5HVEhfODAyXzM7CisJCXBUeEJsay0+U3JjQnVmTGVuICAtPSBMRU5HVEhfODAyXzM7CisKKwkJLy8gc2tpcCB2bGFuIHRhZworCQlpZiAoYlZMQU5Qa3QpCisJCXsKKwkJCXBUeEJsay0+cFNyY0J1ZkRhdGEJKz0gTEVOR1RIXzgwMl8xUTsKKwkJCXBUeEJsay0+U3JjQnVmTGVuCS09IExFTkdUSF84MDJfMVE7CisJCX0KKworCQkvLworCQkvLyBwYWRkaW5nIGF0IGZyb250IG9mIExMQyBoZWFkZXIKKwkJLy8gTExDIGhlYWRlciBzaG91bGQgbG9jYXRlIGF0IDQtb2N0ZXRzIGFsaWdtZW50CisJCS8vCisJCS8vIEBAQCBNcGR1SGVhZGVyTGVuIGV4Y2x1ZGluZyBwYWRkaW5nIEBAQAorCQkvLworCQlwVHhCbGstPkhkclBhZExlbiA9IChVTE9ORylwSGVhZGVyQnVmUHRyOworCQlwSGVhZGVyQnVmUHRyID0gKFBDSEFSKSBST1VORF9VUChwSGVhZGVyQnVmUHRyLCA0KTsKKwkJcFR4QmxrLT5IZHJQYWRMZW4gPSAoVUxPTkcpKHBIZWFkZXJCdWZQdHIgLSBwVHhCbGstPkhkclBhZExlbik7CisKKwkJeworCisJCQkvLworCQkJLy8gSW5zZXJ0IExMQy1TTkFQIGVuY2Fwc3VsYXRpb24gLSA4IG9jdGV0cworCQkJLy8KKwkJCUVYVFJBX0xMQ1NOQVBfRU5DQVBfRlJPTV9QS1RfT0ZGU0VUKHBUeEJsay0+cFNyY0J1ZkRhdGEtMiwgcFR4QmxrLT5wRXh0cmFMbGNTbmFwRW5jYXApOworCQkJaWYgKHBUeEJsay0+cEV4dHJhTGxjU25hcEVuY2FwKQorCQkJeworCQkJCU5kaXNNb3ZlTWVtb3J5KHBIZWFkZXJCdWZQdHIsIHBUeEJsay0+cEV4dHJhTGxjU25hcEVuY2FwLCA2KTsKKwkJCQlwSGVhZGVyQnVmUHRyICs9IDY7CisJCQkJLy8gZ2V0IDIgb2N0ZXRzIChUeXBlb2ZMZW4pCisJCQkJTmRpc01vdmVNZW1vcnkocEhlYWRlckJ1ZlB0ciwgcFR4QmxrLT5wU3JjQnVmRGF0YS0yLCAyKTsKKwkJCQlwSGVhZGVyQnVmUHRyICs9IDI7CisJCQkJcFR4QmxrLT5NcGR1SGVhZGVyTGVuICs9IExFTkdUSF84MDJfMV9IOworCQkJfQorCisJCX0KKworCQlpZiAocE1hY0VudHJ5LT5pc0NhY2hlZCkKKwkJeworICAgICAgICAgICAgUlRNUFdyaXRlVHhXSV9DYWNoZShwQWQsIChQVFhXSV9TVFJVQykoJnBUeEJsay0+SGVhZGVyQnVmW1RYSU5GT19TSVpFXSksIHBUeEJsayk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlSVE1QV3JpdGVUeFdJX0RhdGEocEFkLCAoUFRYV0lfU1RSVUMpKCZwVHhCbGstPkhlYWRlckJ1ZltUWElORk9fU0laRV0pLCBwVHhCbGspOworCisJCQlOZGlzWmVyb01lbW9yeSgoUFVDSEFSKSgmcE1hY0VudHJ5LT5DYWNoZWRCdWZbMF0pLCBzaXplb2YocE1hY0VudHJ5LT5DYWNoZWRCdWYpKTsKKwkJCU5kaXNNb3ZlTWVtb3J5KChQVUNIQVIpKCZwTWFjRW50cnktPkNhY2hlZEJ1ZlswXSksIChQVUNIQVIpKCZwVHhCbGstPkhlYWRlckJ1ZltUWElORk9fU0laRV0pLCAocEhlYWRlckJ1ZlB0ciAtIChQVUNIQVIpKCZwVHhCbGstPkhlYWRlckJ1ZltUWElORk9fU0laRV0pKSk7CisJCQlwTWFjRW50cnktPmlzQ2FjaGVkID0gVFJVRTsKKwkJfQorCisJCS8vIGNhbGN1bGF0ZSBUcmFuc21pdHRlZCBBTVBEVSBjb3VudCBhbmQgQnl0ZUNvdW50CisJCXsKKwkJCXBBZC0+UmFsaW5rQ291bnRlcnMuVHJhbnNtaXR0ZWRNUERVc0luQU1QRFVDb3VudC51Lkxvd1BhcnQgKys7CisJCQlwQWQtPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkT2N0ZXRzSW5BTVBEVUNvdW50LlF1YWRQYXJ0ICs9IHBUeEJsay0+U3JjQnVmTGVuOworCQl9CisKKwkJLy9GcmVlTnVtYmVyID0gR0VUX1RYUklOR19GUkVFTk8ocEFkLCBRdWVJZHgpOworCisJCUhBTF9Xcml0ZVR4UmVzb3VyY2UocEFkLCBwVHhCbGssIFRSVUUsICZGcmVlTnVtYmVyKTsKKworCQkvLworCQkvLyBLaWNrIG91dCBUeAorCQkvLworCQlIQUxfS2lja091dFR4KHBBZCwgcFR4QmxrLCBwVHhCbGstPlF1ZUlkeCk7CisKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5LaWNrVHhDb3VudCsrOworCQlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4RG9uZUNvdW50Kys7CisJfQorCit9CisKKworVk9JRCBTVEFfQU1TRFVfRnJhbWVfVHgoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVFhfQkxLCQkJKnBUeEJsaykKK3sKKwlQVUNIQVIJCQlwSGVhZGVyQnVmUHRyOworCVVTSE9SVAkJCUZyZWVOdW1iZXI7CisJVVNIT1JUCQkJc3ViRnJhbWVQYXlsb2FkTGVuID0gMDsJLy8gQU1TRFUgU3ViZnJhbWUgbGVuZ3RoIHdpdGhvdXQgQU1TRFUtSGVhZGVyIC8gUGFkZGluZy4KKwlVU0hPUlQJCQl0b3RhbE1QRFVTaXplPTA7CisJVUNIQVIJCQkqc3ViRnJhbWVIZWFkZXI7CisJVUNIQVIJCQlwYWRkaW5nID0gMDsKKwlVU0hPUlQJCQlGaXJzdFR4ID0gMCwgTGFzdFR4SWR4ID0gMDsKKwlCT09MRUFOCQkJYlZMQU5Qa3Q7CisJaW50IAkJCWZyYW1lTnVtID0gMDsKKwlQUVVFVUVfRU5UUlkJcFFFbnRyeTsKKworCisJQVNTRVJUKHBUeEJsayk7CisKKwlBU1NFUlQoKHBUeEJsay0+VHhQYWNrZXRMaXN0Lk51bWJlciA+IDEpKTsKKworCXdoaWxlKHBUeEJsay0+VHhQYWNrZXRMaXN0LkhlYWQpCisJeworCQlwUUVudHJ5ID0gUmVtb3ZlSGVhZFF1ZXVlKCZwVHhCbGstPlR4UGFja2V0TGlzdCk7CisJCXBUeEJsay0+cFBhY2tldCA9IFFVRVVFX0VOVFJZX1RPX1BBQ0tFVChwUUVudHJ5KTsKKwkJaWYgKFJUTVBfRmlsbFR4QmxrSW5mbyhwQWQsIHBUeEJsaykgIT0gVFJVRSkKKwkJeworCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBUeEJsay0+cFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWJWTEFOUGt0ID0gKFJUTVBfR0VUX1BBQ0tFVF9WTEFOKHBUeEJsay0+cFBhY2tldCkgPyBUUlVFIDogRkFMU0UpOworCisJCS8vIHNraXAgODAyLjMgaGVhZGVyCisJCXBUeEJsay0+cFNyY0J1ZkRhdGEgPSBwVHhCbGstPnBTcmNCdWZIZWFkZXIgKyBMRU5HVEhfODAyXzM7CisJCXBUeEJsay0+U3JjQnVmTGVuICAtPSBMRU5HVEhfODAyXzM7CisKKwkJLy8gc2tpcCB2bGFuIHRhZworCQlpZiAoYlZMQU5Qa3QpCisJCXsKKwkJCXBUeEJsay0+cFNyY0J1ZkRhdGEJKz0gTEVOR1RIXzgwMl8xUTsKKwkJCXBUeEJsay0+U3JjQnVmTGVuCS09IExFTkdUSF84MDJfMVE7CisJCX0KKworCQlpZiAoZnJhbWVOdW0gPT0gMCkKKwkJeworCQkJcEhlYWRlckJ1ZlB0ciA9IFNUQV9CdWlsZF9BTVNEVV9GcmFtZV9IZWFkZXIocEFkLCBwVHhCbGspOworCisJCQkvLyBOT1RFOiBUeFdJLT5NUERVdG90YWxCeXRlQ291bnQgd2lsbCBiZSB1cGRhdGVkIGFmdGVyIGZpbmFsIGZyYW1lIHdhcyBoYW5kbGVkLgorCQkJUlRNUFdyaXRlVHhXSV9EYXRhKHBBZCwgKFBUWFdJX1NUUlVDKSgmcFR4QmxrLT5IZWFkZXJCdWZbVFhJTkZPX1NJWkVdKSwgcFR4QmxrKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXBIZWFkZXJCdWZQdHIgPSAmcFR4QmxrLT5IZWFkZXJCdWZbMF07CisJCQlwYWRkaW5nID0gUk9VTkRfVVAoTEVOR1RIX0FNU0RVX1NVQkZSQU1FSEVBRCArIHN1YkZyYW1lUGF5bG9hZExlbiwgNCkgLSAoTEVOR1RIX0FNU0RVX1NVQkZSQU1FSEVBRCArIHN1YkZyYW1lUGF5bG9hZExlbik7CisJCQlOZGlzWmVyb01lbW9yeShwSGVhZGVyQnVmUHRyLCBwYWRkaW5nICsgTEVOR1RIX0FNU0RVX1NVQkZSQU1FSEVBRCk7CisJCQlwSGVhZGVyQnVmUHRyICs9IHBhZGRpbmc7CisJCQlwVHhCbGstPk1wZHVIZWFkZXJMZW4gPSBwYWRkaW5nOworCQl9CisKKwkJLy8KKwkJLy8gQS1NU0RVIHN1YmZyYW1lCisJCS8vICAgREEoNikrU0EoNikrTGVuZ3RoKDIpICsgTExDL1NOQVAgRW5jYXAKKwkJLy8KKwkJc3ViRnJhbWVIZWFkZXIgPSBwSGVhZGVyQnVmUHRyOworCQlzdWJGcmFtZVBheWxvYWRMZW4gPSBwVHhCbGstPlNyY0J1ZkxlbjsKKworCQlOZGlzTW92ZU1lbW9yeShzdWJGcmFtZUhlYWRlciwgcFR4QmxrLT5wU3JjQnVmSGVhZGVyLCAxMik7CisKKworCQlwSGVhZGVyQnVmUHRyICs9IExFTkdUSF9BTVNEVV9TVUJGUkFNRUhFQUQ7CisJCXBUeEJsay0+TXBkdUhlYWRlckxlbiArPSBMRU5HVEhfQU1TRFVfU1VCRlJBTUVIRUFEOworCisKKwkJLy8KKwkJLy8gSW5zZXJ0IExMQy1TTkFQIGVuY2Fwc3VsYXRpb24gLSA4IG9jdGV0cworCQkvLworCQlFWFRSQV9MTENTTkFQX0VOQ0FQX0ZST01fUEtUX09GRlNFVChwVHhCbGstPnBTcmNCdWZEYXRhLTIsIHBUeEJsay0+cEV4dHJhTGxjU25hcEVuY2FwKTsKKworCQlzdWJGcmFtZVBheWxvYWRMZW4gPSBwVHhCbGstPlNyY0J1ZkxlbjsKKworCQlpZiAocFR4QmxrLT5wRXh0cmFMbGNTbmFwRW5jYXApCisJCXsKKwkJCU5kaXNNb3ZlTWVtb3J5KHBIZWFkZXJCdWZQdHIsIHBUeEJsay0+cEV4dHJhTGxjU25hcEVuY2FwLCA2KTsKKwkJCXBIZWFkZXJCdWZQdHIgKz0gNjsKKwkJCS8vIGdldCAyIG9jdGV0cyAoVHlwZW9mTGVuKQorCQkJTmRpc01vdmVNZW1vcnkocEhlYWRlckJ1ZlB0ciwgcFR4QmxrLT5wU3JjQnVmRGF0YS0yLCAyKTsKKwkJCXBIZWFkZXJCdWZQdHIgKz0gMjsKKwkJCXBUeEJsay0+TXBkdUhlYWRlckxlbiArPSBMRU5HVEhfODAyXzFfSDsKKwkJCXN1YkZyYW1lUGF5bG9hZExlbiArPSBMRU5HVEhfODAyXzFfSDsKKwkJfQorCisJCS8vIHVwZGF0ZSBzdWJGcmFtZSBMZW5ndGggZmllbGQKKwkJc3ViRnJhbWVIZWFkZXJbMTJdID0gKHN1YkZyYW1lUGF5bG9hZExlbiAmIDB4RkYwMCkgPj4gODsKKwkJc3ViRnJhbWVIZWFkZXJbMTNdID0gc3ViRnJhbWVQYXlsb2FkTGVuICYgMHhGRjsKKworCQl0b3RhbE1QRFVTaXplICs9IHBUeEJsay0+TXBkdUhlYWRlckxlbiArIHBUeEJsay0+U3JjQnVmTGVuOworCisJCWlmIChmcmFtZU51bSA9PTApCisJCQlGaXJzdFR4ID0gSEFMX1dyaXRlTXVsdGlUeFJlc291cmNlKHBBZCwgcFR4QmxrLCBmcmFtZU51bSwgJkZyZWVOdW1iZXIpOworCQllbHNlCisJCQlMYXN0VHhJZHggPSBIQUxfV3JpdGVNdWx0aVR4UmVzb3VyY2UocEFkLCBwVHhCbGssIGZyYW1lTnVtLCAmRnJlZU51bWJlcik7CisKKwkJZnJhbWVOdW0rKzsKKworCQlwQWQtPlJhbGlua0NvdW50ZXJzLktpY2tUeENvdW50Kys7CisJCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhEb25lQ291bnQrKzsKKworCQkvLyBjYWxjdWxhdGUgVHJhbnNtaXR0ZWQgQU1TRFUgQ291bnQgYW5kIEJ5dGVDb3VudAorCQl7CisJCQlwQWQtPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkQU1TRFVDb3VudC51Lkxvd1BhcnQgKys7CisJCQlwQWQtPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkT2N0ZXRzSW5BTVNEVS5RdWFkUGFydCArPSB0b3RhbE1QRFVTaXplOworCQl9CisKKwl9CisKKwlIQUxfRmluYWxXcml0ZVR4UmVzb3VyY2UocEFkLCBwVHhCbGssIHRvdGFsTVBEVVNpemUsIEZpcnN0VHgpOworCUhBTF9MYXN0VHhJZHgocEFkLCBwVHhCbGstPlF1ZUlkeCwgTGFzdFR4SWR4KTsKKworCS8vCisJLy8gS2ljayBvdXQgVHgKKwkvLworCUhBTF9LaWNrT3V0VHgocEFkLCBwVHhCbGssIHBUeEJsay0+UXVlSWR4KTsKK30KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworVk9JRCBTVEFfTGVnYWN5X0ZyYW1lX1R4KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVRYX0JMSwkJCSpwVHhCbGspCit7CisJSEVBREVSXzgwMl8xMQkqcEhlYWRlcl84MDJfMTE7CisJUFVDSEFSCQkJcEhlYWRlckJ1ZlB0cjsKKwlVU0hPUlQJCQlGcmVlTnVtYmVyOworCUJPT0xFQU4JCQliVkxBTlBrdDsKKwlQUVVFVUVfRU5UUlkJcFFFbnRyeTsKKworCUFTU0VSVChwVHhCbGspOworCisKKwlwUUVudHJ5ID0gUmVtb3ZlSGVhZFF1ZXVlKCZwVHhCbGstPlR4UGFja2V0TGlzdCk7CisJcFR4QmxrLT5wUGFja2V0ID0gUVVFVUVfRU5UUllfVE9fUEFDS0VUKHBRRW50cnkpOworCWlmIChSVE1QX0ZpbGxUeEJsa0luZm8ocEFkLCBwVHhCbGspICE9IFRSVUUpCisJeworCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFR4QmxrLT5wUGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChwVHhCbGstPlR4RnJhbWVUeXBlID09IFRYX01DQVNUX0ZSQU1FKQorCXsKKwkJSU5DX0NPVU5URVI2NChwQWQtPldsYW5Db3VudGVycy5NdWx0aWNhc3RUcmFuc21pdHRlZEZyYW1lQ291bnQpOworCX0KKworCWlmIChSVE1QX0dFVF9QQUNLRVRfUlRTKHBUeEJsay0+cFBhY2tldCkpCisJCVRYX0JMS19TRVRfRkxBRyhwVHhCbGssIGZUWF9iUnRzUmVxdWlyZWQpOworCWVsc2UKKwkJVFhfQkxLX0NMRUFSX0ZMQUcocFR4QmxrLCBmVFhfYlJ0c1JlcXVpcmVkKTsKKworCWJWTEFOUGt0ID0gKFJUTVBfR0VUX1BBQ0tFVF9WTEFOKHBUeEJsay0+cFBhY2tldCkgPyBUUlVFIDogRkFMU0UpOworCisJaWYgKHBUeEJsay0+VHhSYXRlIDwgcEFkLT5Db21tb25DZmcuTWluVHhSYXRlKQorCQlwVHhCbGstPlR4UmF0ZSA9IHBBZC0+Q29tbW9uQ2ZnLk1pblR4UmF0ZTsKKworCVNUQUZpbmRDaXBoZXJBbGdvcml0aG0ocEFkLCBwVHhCbGspOworCVNUQUJ1aWxkQ29tbW9uODAyXzExSGVhZGVyKHBBZCwgcFR4QmxrKTsKKworCisJLy8gc2tpcCA4MDIuMyBoZWFkZXIKKwlwVHhCbGstPnBTcmNCdWZEYXRhID0gcFR4QmxrLT5wU3JjQnVmSGVhZGVyICsgTEVOR1RIXzgwMl8zOworCXBUeEJsay0+U3JjQnVmTGVuICAtPSBMRU5HVEhfODAyXzM7CisKKwkvLyBza2lwIHZsYW4gdGFnCisJaWYgKGJWTEFOUGt0KQorCXsKKwkJcFR4QmxrLT5wU3JjQnVmRGF0YQkrPSBMRU5HVEhfODAyXzFROworCQlwVHhCbGstPlNyY0J1ZkxlbgktPSBMRU5HVEhfODAyXzFROworCX0KKworCXBIZWFkZXJCdWZQdHIgPSAmcFR4QmxrLT5IZWFkZXJCdWZbVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkVdOworCXBIZWFkZXJfODAyXzExID0gKEhFQURFUl84MDJfMTEgKikgcEhlYWRlckJ1ZlB0cjsKKworCS8vIHNraXAgY29tbW9uIGhlYWRlcgorCXBIZWFkZXJCdWZQdHIgKz0gcFR4QmxrLT5NcGR1SGVhZGVyTGVuOworCisJaWYgKFRYX0JMS19URVNUX0ZMQUcocFR4QmxrLCBmVFhfYldNTSkpCisJeworCQkvLworCQkvLyBidWlsZCBRT1MgQ29udHJvbCBieXRlcworCQkvLworCQkqcEhlYWRlckJ1ZlB0ciA9IChwVHhCbGstPlVzZXJQcmlvcml0eSAmIDB4MEYpOworCQkqKHBIZWFkZXJCdWZQdHIrMSkgPSAwOworCQlwSGVhZGVyQnVmUHRyICs9MjsKKwkJcFR4QmxrLT5NcGR1SGVhZGVyTGVuICs9IDI7CisJfQorCisJLy8gVGhlIHJlbWFpbmluZyBjb250ZW50IG9mIE1QRFUgaGVhZGVyIHNob3VsZCBsb2NhdGUgYXQgNC1vY3RldHMgYWxpZ21lbnQKKwlwVHhCbGstPkhkclBhZExlbiA9IChVTE9ORylwSGVhZGVyQnVmUHRyOworCXBIZWFkZXJCdWZQdHIgPSAoUENIQVIpIFJPVU5EX1VQKHBIZWFkZXJCdWZQdHIsIDQpOworCXBUeEJsay0+SGRyUGFkTGVuID0gKFVMT05HKShwSGVhZGVyQnVmUHRyIC0gcFR4QmxrLT5IZHJQYWRMZW4pOworCisJeworCisJCS8vCisJCS8vIEluc2VydCBMTEMtU05BUCBlbmNhcHN1bGF0aW9uIC0gOCBvY3RldHMKKwkJLy8KKwkJLy8KKyAgIAkJLy8gaWYgb3JpZ2luYWwgRXRoZXJuZXQgZnJhbWUgY29udGFpbnMgbm8gTExDL1NOQVAsCisJCS8vIHRoZW4gYW4gZXh0cmEgTExDL1NOQVAgZW5jYXAgaXMgcmVxdWlyZWQKKwkJLy8KKwkJRVhUUkFfTExDU05BUF9FTkNBUF9GUk9NX1BLVF9TVEFSVChwVHhCbGstPnBTcmNCdWZIZWFkZXIsIHBUeEJsay0+cEV4dHJhTGxjU25hcEVuY2FwKTsKKwkJaWYgKHBUeEJsay0+cEV4dHJhTGxjU25hcEVuY2FwKQorCQl7CisJCQlVQ0hBUiB2bGFuX3NpemU7CisKKwkJCU5kaXNNb3ZlTWVtb3J5KHBIZWFkZXJCdWZQdHIsIHBUeEJsay0+cEV4dHJhTGxjU25hcEVuY2FwLCA2KTsKKwkJCXBIZWFkZXJCdWZQdHIgKz0gNjsKKwkJCS8vIHNraXAgdmxhbiB0YWcKKwkJCXZsYW5fc2l6ZSA9ICAoYlZMQU5Qa3QpID8gTEVOR1RIXzgwMl8xUSA6IDA7CisJCQkvLyBnZXQgMiBvY3RldHMgKFR5cGVvZkxlbikKKwkJCU5kaXNNb3ZlTWVtb3J5KHBIZWFkZXJCdWZQdHIsIHBUeEJsay0+cFNyY0J1ZkhlYWRlcisxMit2bGFuX3NpemUsIDIpOworCQkJcEhlYWRlckJ1ZlB0ciArPSAyOworCQkJcFR4QmxrLT5NcGR1SGVhZGVyTGVuICs9IExFTkdUSF84MDJfMV9IOworCQl9CisKKwl9CisKKwkvLworCS8vIHByZXBhcmUgZm9yIFRYV0kKKwkvLyB1c2UgV2NpZCBhcyBLZXkgSW5kZXgKKwkvLworCisJUlRNUFdyaXRlVHhXSV9EYXRhKHBBZCwgKFBUWFdJX1NUUlVDKSgmcFR4QmxrLT5IZWFkZXJCdWZbVFhJTkZPX1NJWkVdKSwgcFR4QmxrKTsKKworCS8vRnJlZU51bWJlciA9IEdFVF9UWFJJTkdfRlJFRU5PKHBBZCwgUXVlSWR4KTsKKworCUhBTF9Xcml0ZVR4UmVzb3VyY2UocEFkLCBwVHhCbGssIFRSVUUsICZGcmVlTnVtYmVyKTsKKworCXBBZC0+UmFsaW5rQ291bnRlcnMuS2lja1R4Q291bnQrKzsKKwlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4RG9uZUNvdW50Kys7CisKKwkvLworCS8vIEtpY2sgb3V0IFR4CisJLy8KKwlIQUxfS2lja091dFR4KHBBZCwgcFR4QmxrLCBwVHhCbGstPlF1ZUlkeCk7Cit9CisKKworVk9JRCBTVEFfQVJhbGlua19GcmFtZV9UeCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglUWF9CTEsJCQkqcFR4QmxrKQoreworCVBVQ0hBUgkJCXBIZWFkZXJCdWZQdHI7CisJVVNIT1JUCQkJRnJlZU51bWJlcjsKKwlVU0hPUlQJCQl0b3RhbE1QRFVTaXplPTA7CisJVVNIT1JUCQkJRmlyc3RUeCwgTGFzdFR4SWR4OworCWludCAJCQlmcmFtZU51bSA9IDA7CisJQk9PTEVBTgkJCWJWTEFOUGt0OworCVBRVUVVRV9FTlRSWQlwUUVudHJ5OworCisKKwlBU1NFUlQocFR4QmxrKTsKKworCUFTU0VSVCgocFR4QmxrLT5UeFBhY2tldExpc3QuTnVtYmVyPT0gMikpOworCisKKwlGaXJzdFR4ID0gTGFzdFR4SWR4ID0gMDsgIC8vIElzIGl0IG9rIGluaXQgdGhleSBhcyAwPworCXdoaWxlKHBUeEJsay0+VHhQYWNrZXRMaXN0LkhlYWQpCisJeworCQlwUUVudHJ5ID0gUmVtb3ZlSGVhZFF1ZXVlKCZwVHhCbGstPlR4UGFja2V0TGlzdCk7CisJCXBUeEJsay0+cFBhY2tldCA9IFFVRVVFX0VOVFJZX1RPX1BBQ0tFVChwUUVudHJ5KTsKKworCQlpZiAoUlRNUF9GaWxsVHhCbGtJbmZvKHBBZCwgcFR4QmxrKSAhPSBUUlVFKQorCQl7CisJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFR4QmxrLT5wUGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJYlZMQU5Qa3QgPSAoUlRNUF9HRVRfUEFDS0VUX1ZMQU4ocFR4QmxrLT5wUGFja2V0KSA/IFRSVUUgOiBGQUxTRSk7CisKKwkJLy8gc2tpcCA4MDIuMyBoZWFkZXIKKwkJcFR4QmxrLT5wU3JjQnVmRGF0YSA9IHBUeEJsay0+cFNyY0J1ZkhlYWRlciArIExFTkdUSF84MDJfMzsKKwkJcFR4QmxrLT5TcmNCdWZMZW4gIC09IExFTkdUSF84MDJfMzsKKworCQkvLyBza2lwIHZsYW4gdGFnCisJCWlmIChiVkxBTlBrdCkKKwkJeworCQkJcFR4QmxrLT5wU3JjQnVmRGF0YQkrPSBMRU5HVEhfODAyXzFROworCQkJcFR4QmxrLT5TcmNCdWZMZW4JLT0gTEVOR1RIXzgwMl8xUTsKKwkJfQorCisJCWlmIChmcmFtZU51bSA9PSAwKQorCQl7CS8vIEZvciBmaXJzdCBmcmFtZSwgd2UgbmVlZCB0byBjcmVhdGUgdGhlIDgwMi4xMSBoZWFkZXIgKyBwYWRkaW5nKG9wdGlvbmFsKSArIFJBLUFHRy1MRU4gKyBTTkFQIEhlYWRlcgorCisJCQlwSGVhZGVyQnVmUHRyID0gU1RBX0J1aWxkX0FSYWxpbmtfRnJhbWVfSGVhZGVyKHBBZCwgcFR4QmxrKTsKKworCQkJLy8gSXQncyBvayB3cml0ZSB0aGUgVHhXSSBoZXJlLCBiZWNhdXNlIHRoZSBUeFdJLT5NUERVdG90YWxCeXRlQ291bnQKKwkJCS8vCXdpbGwgYmUgdXBkYXRlZCBhZnRlciBmaW5hbCBmcmFtZSB3YXMgaGFuZGxlZC4KKwkJCVJUTVBXcml0ZVR4V0lfRGF0YShwQWQsIChQVFhXSV9TVFJVQykoJnBUeEJsay0+SGVhZGVyQnVmW1RYSU5GT19TSVpFXSksIHBUeEJsayk7CisKKworCQkJLy8KKwkJCS8vIEluc2VydCBMTEMtU05BUCBlbmNhcHN1bGF0aW9uIC0gOCBvY3RldHMKKwkJCS8vCisJCQlFWFRSQV9MTENTTkFQX0VOQ0FQX0ZST01fUEtUX09GRlNFVChwVHhCbGstPnBTcmNCdWZEYXRhLTIsIHBUeEJsay0+cEV4dHJhTGxjU25hcEVuY2FwKTsKKworCQkJaWYgKHBUeEJsay0+cEV4dHJhTGxjU25hcEVuY2FwKQorCQkJeworCQkJCU5kaXNNb3ZlTWVtb3J5KHBIZWFkZXJCdWZQdHIsIHBUeEJsay0+cEV4dHJhTGxjU25hcEVuY2FwLCA2KTsKKwkJCQlwSGVhZGVyQnVmUHRyICs9IDY7CisJCQkJLy8gZ2V0IDIgb2N0ZXRzIChUeXBlb2ZMZW4pCisJCQkJTmRpc01vdmVNZW1vcnkocEhlYWRlckJ1ZlB0ciwgcFR4QmxrLT5wU3JjQnVmRGF0YS0yLCAyKTsKKwkJCQlwSGVhZGVyQnVmUHRyICs9IDI7CisJCQkJcFR4QmxrLT5NcGR1SGVhZGVyTGVuICs9IExFTkdUSF84MDJfMV9IOworCQkJfQorCQl9CisJCWVsc2UKKwkJewkvLyBGb3Igc2Vjb25kIGFnZ3JlZ2F0ZWQgZnJhbWUsIHdlIG5lZWQgY3JlYXRlIHRoZSA4MDIuMyBoZWFkZXIgdG8gaGVhZGVyQnVmLCBiZWNhdXNlIFBDSSB3aWxsIGNvcHkgaXQgdG8gU0RQdHIwLgorCisJCQlwSGVhZGVyQnVmUHRyID0gJnBUeEJsay0+SGVhZGVyQnVmWzBdOworCQkJcFR4QmxrLT5NcGR1SGVhZGVyTGVuID0gMDsKKworCQkJLy8gQS1SYWxpbmsgc3ViLXNlcXVlbnQgZnJhbWUgaGVhZGVyIGlzIHRoZSBzYW1lIGFzIDgwMi4zIGhlYWRlci4KKwkJCS8vICAgREEoNikrU0EoNikrRnJhbWVUeXBlKDIpCisJCQlOZGlzTW92ZU1lbW9yeShwSGVhZGVyQnVmUHRyLCBwVHhCbGstPnBTcmNCdWZIZWFkZXIsIDEyKTsKKwkJCXBIZWFkZXJCdWZQdHIgKz0gMTI7CisJCQkvLyBnZXQgMiBvY3RldHMgKFR5cGVvZkxlbikKKwkJCU5kaXNNb3ZlTWVtb3J5KHBIZWFkZXJCdWZQdHIsIHBUeEJsay0+cFNyY0J1ZkRhdGEtMiwgMik7CisJCQlwSGVhZGVyQnVmUHRyICs9IDI7CisJCQlwVHhCbGstPk1wZHVIZWFkZXJMZW4gPSBMRU5HVEhfQVJBTElOS19TVUJGUkFNRUhFQUQ7CisJCX0KKworCQl0b3RhbE1QRFVTaXplICs9IHBUeEJsay0+TXBkdUhlYWRlckxlbiArIHBUeEJsay0+U3JjQnVmTGVuOworCisJCS8vRnJlZU51bWJlciA9IEdFVF9UWFJJTkdfRlJFRU5PKHBBZCwgUXVlSWR4KTsKKwkJaWYgKGZyYW1lTnVtID09MCkKKwkJCUZpcnN0VHggPSBIQUxfV3JpdGVNdWx0aVR4UmVzb3VyY2UocEFkLCBwVHhCbGssIGZyYW1lTnVtLCAmRnJlZU51bWJlcik7CisJCWVsc2UKKwkJCUxhc3RUeElkeCA9IEhBTF9Xcml0ZU11bHRpVHhSZXNvdXJjZShwQWQsIHBUeEJsaywgZnJhbWVOdW0sICZGcmVlTnVtYmVyKTsKKworCQlmcmFtZU51bSsrOworCisJCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhBZ2dyZWdhdGlvbkNvdW50Kys7CisJCXBBZC0+UmFsaW5rQ291bnRlcnMuS2lja1R4Q291bnQrKzsKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeERvbmVDb3VudCsrOworCisJfQorCisJSEFMX0ZpbmFsV3JpdGVUeFJlc291cmNlKHBBZCwgcFR4QmxrLCB0b3RhbE1QRFVTaXplLCBGaXJzdFR4KTsKKwlIQUxfTGFzdFR4SWR4KHBBZCwgcFR4QmxrLT5RdWVJZHgsIExhc3RUeElkeCk7CisKKwkvLworCS8vIEtpY2sgb3V0IFR4CisJLy8KKwlIQUxfS2lja091dFR4KHBBZCwgcFR4QmxrLCBwVHhCbGstPlF1ZUlkeCk7CisKK30KKworCitWT0lEIFNUQV9GcmFnbWVudF9GcmFtZV9UeCgKKwlJTiBSVE1QX0FEQVBURVIgKnBBZCwKKwlJTiBUWF9CTEsJCSpwVHhCbGspCit7CisJSEVBREVSXzgwMl8xMQkqcEhlYWRlcl84MDJfMTE7CisJUFVDSEFSCQkJcEhlYWRlckJ1ZlB0cjsKKwlVU0hPUlQJCQlGcmVlTnVtYmVyOworCVVDSEFSIAkJCWZyYWdOdW0gPSAwOworCVBBQ0tFVF9JTkZPCQlQYWNrZXRJbmZvOworCVVTSE9SVAkJCUVuY3J5cHRpb25PdmVyaGVhZCA9IDA7CisJVUlOVDMyCQkJRnJlZU1wZHVTaXplLCBTcmNSZW1haW5pbmdCeXRlczsKKwlVU0hPUlQJCQlBY2tEdXJhdGlvbjsKKwlVSU5UIAkJCU5leHRNcGR1U2l6ZTsKKwlCT09MRUFOCQkJYlZMQU5Qa3Q7CisJUFFVRVVFX0VOVFJZCXBRRW50cnk7CisKKworCUFTU0VSVChwVHhCbGspOworCisJcFFFbnRyeSA9IFJlbW92ZUhlYWRRdWV1ZSgmcFR4QmxrLT5UeFBhY2tldExpc3QpOworCXBUeEJsay0+cFBhY2tldCA9IFFVRVVFX0VOVFJZX1RPX1BBQ0tFVChwUUVudHJ5KTsKKwlpZiAoUlRNUF9GaWxsVHhCbGtJbmZvKHBBZCwgcFR4QmxrKSAhPSBUUlVFKQorCXsKKwkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBUeEJsay0+cFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCXJldHVybjsKKwl9CisKKwlBU1NFUlQoVFhfQkxLX1RFU1RfRkxBRyhwVHhCbGssIGZUWF9iQWxsb3dGcmFnKSk7CisJYlZMQU5Qa3QgPSAoUlRNUF9HRVRfUEFDS0VUX1ZMQU4ocFR4QmxrLT5wUGFja2V0KSA/IFRSVUUgOiBGQUxTRSk7CisKKwlTVEFGaW5kQ2lwaGVyQWxnb3JpdGhtKHBBZCwgcFR4QmxrKTsKKwlTVEFCdWlsZENvbW1vbjgwMl8xMUhlYWRlcihwQWQsIHBUeEJsayk7CisKKwlpZiAocFR4QmxrLT5DaXBoZXJBbGcgPT0gQ0lQSEVSX1RLSVApCisJeworCQlwVHhCbGstPnBQYWNrZXQgPSBkdXBsaWNhdGVfcGt0X3dpdGhfVEtJUF9NSUMocEFkLCBwVHhCbGstPnBQYWNrZXQpOworCQlpZiAocFR4QmxrLT5wUGFja2V0ID09IE5VTEwpCisJCQlyZXR1cm47CisJCVJUTVBfUXVlcnlQYWNrZXRJbmZvKHBUeEJsay0+cFBhY2tldCwgJlBhY2tldEluZm8sICZwVHhCbGstPnBTcmNCdWZIZWFkZXIsICZwVHhCbGstPlNyY0J1Zkxlbik7CisJfQorCisJLy8gc2tpcCA4MDIuMyBoZWFkZXIKKwlwVHhCbGstPnBTcmNCdWZEYXRhID0gcFR4QmxrLT5wU3JjQnVmSGVhZGVyICsgTEVOR1RIXzgwMl8zOworCXBUeEJsay0+U3JjQnVmTGVuICAtPSBMRU5HVEhfODAyXzM7CisKKworCS8vIHNraXAgdmxhbiB0YWcKKwlpZiAoYlZMQU5Qa3QpCisJeworCQlwVHhCbGstPnBTcmNCdWZEYXRhCSs9IExFTkdUSF84MDJfMVE7CisJCXBUeEJsay0+U3JjQnVmTGVuCS09IExFTkdUSF84MDJfMVE7CisJfQorCisJcEhlYWRlckJ1ZlB0ciA9ICZwVHhCbGstPkhlYWRlckJ1ZltUWElORk9fU0laRSArIFRYV0lfU0laRV07CisJcEhlYWRlcl84MDJfMTEgPSAoSEVBREVSXzgwMl8xMSAqKXBIZWFkZXJCdWZQdHI7CisKKworCS8vIHNraXAgY29tbW9uIGhlYWRlcgorCXBIZWFkZXJCdWZQdHIgKz0gcFR4QmxrLT5NcGR1SGVhZGVyTGVuOworCisJaWYgKFRYX0JMS19URVNUX0ZMQUcocFR4QmxrLCBmVFhfYldNTSkpCisJeworCQkvLworCQkvLyBidWlsZCBRT1MgQ29udHJvbCBieXRlcworCQkvLworCQkqcEhlYWRlckJ1ZlB0ciA9IChwVHhCbGstPlVzZXJQcmlvcml0eSAmIDB4MEYpOworCisJCSoocEhlYWRlckJ1ZlB0cisxKSA9IDA7CisJCXBIZWFkZXJCdWZQdHIgKz0yOworCQlwVHhCbGstPk1wZHVIZWFkZXJMZW4gKz0gMjsKKwl9CisKKwkvLworCS8vIHBhZGRpbmcgYXQgZnJvbnQgb2YgTExDIGhlYWRlcgorCS8vIExMQyBoZWFkZXIgc2hvdWxkIGxvY2F0ZSBhdCA0LW9jdGV0cyBhbGlnbWVudAorCS8vCisJcFR4QmxrLT5IZHJQYWRMZW4gPSAoVUxPTkcpcEhlYWRlckJ1ZlB0cjsKKwlwSGVhZGVyQnVmUHRyID0gKFBDSEFSKSBST1VORF9VUChwSGVhZGVyQnVmUHRyLCA0KTsKKwlwVHhCbGstPkhkclBhZExlbiA9IChVTE9ORykocEhlYWRlckJ1ZlB0ciAtIHBUeEJsay0+SGRyUGFkTGVuKTsKKworCisKKwkvLworCS8vIEluc2VydCBMTEMtU05BUCBlbmNhcHN1bGF0aW9uIC0gOCBvY3RldHMKKwkvLworCS8vCisgICAJLy8gaWYgb3JpZ2luYWwgRXRoZXJuZXQgZnJhbWUgY29udGFpbnMgbm8gTExDL1NOQVAsCisJLy8gdGhlbiBhbiBleHRyYSBMTEMvU05BUCBlbmNhcCBpcyByZXF1aXJlZAorCS8vCisJRVhUUkFfTExDU05BUF9FTkNBUF9GUk9NX1BLVF9TVEFSVChwVHhCbGstPnBTcmNCdWZIZWFkZXIsIHBUeEJsay0+cEV4dHJhTGxjU25hcEVuY2FwKTsKKwlpZiAocFR4QmxrLT5wRXh0cmFMbGNTbmFwRW5jYXApCisJeworCQlVQ0hBUiB2bGFuX3NpemU7CisKKwkJTmRpc01vdmVNZW1vcnkocEhlYWRlckJ1ZlB0ciwgcFR4QmxrLT5wRXh0cmFMbGNTbmFwRW5jYXAsIDYpOworCQlwSGVhZGVyQnVmUHRyICs9IDY7CisJCS8vIHNraXAgdmxhbiB0YWcKKwkJdmxhbl9zaXplID0gIChiVkxBTlBrdCkgPyBMRU5HVEhfODAyXzFRIDogMDsKKwkJLy8gZ2V0IDIgb2N0ZXRzIChUeXBlb2ZMZW4pCisJCU5kaXNNb3ZlTWVtb3J5KHBIZWFkZXJCdWZQdHIsIHBUeEJsay0+cFNyY0J1ZkhlYWRlcisxMit2bGFuX3NpemUsIDIpOworCQlwSGVhZGVyQnVmUHRyICs9IDI7CisJCXBUeEJsay0+TXBkdUhlYWRlckxlbiArPSBMRU5HVEhfODAyXzFfSDsKKwl9CisKKworCS8vIElmIFRLSVAgaXMgdXNlZCBhbmQgZnJhZ21lbnRhdGlvbiBpcyByZXF1aXJlZC4gRHJpdmVyIGhhcyB0bworCS8vCWFwcGVuZCBUS0lQIE1JQyBhdCB0YWlsIG9mIHRoZSBzY2F0dGVyIGJ1ZmZlcgorCS8vCU1BQyBBU0lDIHdpbGwgb25seSBwZXJmb3JtIElWL0VJVi9JQ1YgaW5zZXJ0aW9uIGJ1dCBubyBUS0lQIE1JQworCWlmIChwVHhCbGstPkNpcGhlckFsZyA9PSBDSVBIRVJfVEtJUCkKKwl7CisKKwkJLy8gTk9URTogRE9OJ1QgcmVmZXIgdGhlIHNrYi0+bGVuIGRpcmVjdGx5IGFmdGVyIGZvbGxvd2luZyBjb3B5LiBCZWNhc3VlIHRoZSBsZW5ndGggaXMgbm90IGFkanVzdAorCQkvLwkJCXRvIGNvcnJlY3QgbGVuZ2h0LCByZWZlciB0byBwVHhCbGstPlNyY0J1ZkxlbiBmb3IgdGhlIHBhY2tldCBsZW5ndGggaW4gZm9sbG93aW5nIHByb2dyZXNzLgorCQlOZGlzTW92ZU1lbW9yeShwVHhCbGstPnBTcmNCdWZEYXRhICsgcFR4QmxrLT5TcmNCdWZMZW4sICZwQWQtPlByaXZhdGVJbmZvLlR4Lk1JQ1swXSwgOCk7CisJCS8vc2tiX3B1dCgoUlRQS1RfVE9fT1NQS1QocFR4QmxrLT5wUGFja2V0KSktPnRhaWwsIDgpOworCQlwVHhCbGstPlNyY0J1ZkxlbiArPSA4OworCQlwVHhCbGstPlRvdGFsRnJhbWVMZW4gKz0gODsKKwkJcFR4QmxrLT5DaXBoZXJBbGcgPSBDSVBIRVJfVEtJUF9OT19NSUM7CisJfQorCisJLy8KKwkvLyBjYWxjdWF0ZSB0aGUgb3ZlcmhlYWQgYnl0ZXMgdGhhdCBlbmNyeXB0aW9uIGFsZ29yaXRobSBtYXkgYWRkLiBUaGlzCisJLy8gYWZmZWN0cyB0aGUgY2FsY3VsYXRlIG9mICJkdXJhdGlvbiIgZmllbGQKKwkvLworCWlmICgocFR4QmxrLT5DaXBoZXJBbGcgPT0gQ0lQSEVSX1dFUDY0KSB8fCAocFR4QmxrLT5DaXBoZXJBbGcgPT0gQ0lQSEVSX1dFUDEyOCkpCisJCUVuY3J5cHRpb25PdmVyaGVhZCA9IDg7IC8vV0VQOiBJVls0XSArIElDVls0XTsKKwllbHNlIGlmIChwVHhCbGstPkNpcGhlckFsZyA9PSBDSVBIRVJfVEtJUF9OT19NSUMpCisJCUVuY3J5cHRpb25PdmVyaGVhZCA9IDEyOy8vVEtJUDogSVZbNF0gKyBFSVZbNF0gKyBJQ1ZbNF0sIE1JQyB3aWxsIGJlIGFkZGVkIHRvIFRvdGFsUGFja2V0TGVuZ3RoCisJZWxzZSBpZiAocFR4QmxrLT5DaXBoZXJBbGcgPT0gQ0lQSEVSX1RLSVApCisJCUVuY3J5cHRpb25PdmVyaGVhZCA9IDIwOy8vVEtJUDogSVZbNF0gKyBFSVZbNF0gKyBJQ1ZbNF0gKyBNSUNbOF0KKwllbHNlIGlmIChwVHhCbGstPkNpcGhlckFsZyA9PSBDSVBIRVJfQUVTKQorCQlFbmNyeXB0aW9uT3ZlcmhlYWQgPSAxNjsJLy8gQUVTOiBJVls0XSArIEVJVls0XSArIE1JQ1s4XQorCWVsc2UKKwkJRW5jcnlwdGlvbk92ZXJoZWFkID0gMDsKKworCS8vIGRlY2lkZSBob3cgbXVjaCB0aW1lIGFuIEFDSy9DVFMgZnJhbWUgd2lsbCBjb25zdW1lIGluIHRoZSBhaXIKKwlBY2tEdXJhdGlvbiA9IFJUTVBDYWxjRHVyYXRpb24ocEFkLCBwQWQtPkNvbW1vbkNmZy5FeHBlY3RlZEFDS1JhdGVbcFR4QmxrLT5UeFJhdGVdLCAxNCk7CisKKwkvLyBJbml0IHRoZSB0b3RhbCBwYXlsb2FkIGxlbmd0aCBvZiB0aGlzIGZyYW1lLgorCVNyY1JlbWFpbmluZ0J5dGVzID0gcFR4QmxrLT5TcmNCdWZMZW47CisKKwlwVHhCbGstPlRvdGFsRnJhZ051bSA9IDB4ZmY7CisKKwlkbyB7CisKKwkJRnJlZU1wZHVTaXplID0gcEFkLT5Db21tb25DZmcuRnJhZ21lbnRUaHJlc2hvbGQgLSBMRU5HVEhfQ1JDOworCisJCUZyZWVNcGR1U2l6ZSAtPSBwVHhCbGstPk1wZHVIZWFkZXJMZW47CisKKwkJaWYgKFNyY1JlbWFpbmluZ0J5dGVzIDw9IEZyZWVNcGR1U2l6ZSkKKwkJewkvLyB0aGlzIGlzIHRoZSBsYXN0IG9yIG9ubHkgZnJhZ21lbnQKKworCQkJcFR4QmxrLT5TcmNCdWZMZW4gPSBTcmNSZW1haW5pbmdCeXRlczsKKworCQkJcEhlYWRlcl84MDJfMTEtPkZDLk1vcmVGcmFnID0gMDsKKwkJCXBIZWFkZXJfODAyXzExLT5EdXJhdGlvbiA9IHBBZC0+Q29tbW9uQ2ZnLkRzaWZzICsgQWNrRHVyYXRpb247CisKKwkJCS8vIEluZGljYXRlIHRoZSBsb3dlciBsYXllciB0aGF0IHRoaXMncyB0aGUgbGFzdCBmcmFnbWVudC4KKwkJCXBUeEJsay0+VG90YWxGcmFnTnVtID0gZnJhZ051bTsKKwkJfQorCQllbHNlCisJCXsJLy8gbW9yZSBmcmFnbWVudCBpcyByZXF1aXJlZAorCisJCQlwVHhCbGstPlNyY0J1ZkxlbiA9IEZyZWVNcGR1U2l6ZTsKKworCQkJTmV4dE1wZHVTaXplID0gbWluKCgoVUlOVClTcmNSZW1haW5pbmdCeXRlcyAtIHBUeEJsay0+U3JjQnVmTGVuKSwgKChVSU5UKXBBZC0+Q29tbW9uQ2ZnLkZyYWdtZW50VGhyZXNob2xkKSk7CisJCQlwSGVhZGVyXzgwMl8xMS0+RkMuTW9yZUZyYWcgPSAxOworCQkJcEhlYWRlcl84MDJfMTEtPkR1cmF0aW9uID0gKDMgKiBwQWQtPkNvbW1vbkNmZy5Ec2lmcykgKyAoMiAqIEFja0R1cmF0aW9uKSArIFJUTVBDYWxjRHVyYXRpb24ocEFkLCBwVHhCbGstPlR4UmF0ZSwgTmV4dE1wZHVTaXplICsgRW5jcnlwdGlvbk92ZXJoZWFkKTsKKwkJfQorCisJCWlmIChmcmFnTnVtID09IDApCisJCQlwVHhCbGstPkZyYW1lR2FwID0gSUZTX0hUVFhPUDsKKwkJZWxzZQorCQkJcFR4QmxrLT5GcmFtZUdhcCA9IElGU19TSUZTOworCisJCVJUTVBXcml0ZVR4V0lfRGF0YShwQWQsIChQVFhXSV9TVFJVQykoJnBUeEJsay0+SGVhZGVyQnVmW1RYSU5GT19TSVpFXSksIHBUeEJsayk7CisKKwkJSEFMX1dyaXRlRnJhZ1R4UmVzb3VyY2UocEFkLCBwVHhCbGssIGZyYWdOdW0sICZGcmVlTnVtYmVyKTsKKworCQlwQWQtPlJhbGlua0NvdW50ZXJzLktpY2tUeENvdW50Kys7CisJCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhEb25lQ291bnQrKzsKKworCQkvLyBVcGRhdGUgdGhlIGZyYW1lIG51bWJlciwgcmVtYWluaW5nIHNpemUgb2YgdGhlIE5ESVMgcGFja2V0IHBheWxvYWQuCisKKwkJLy8gc3BhY2UgZm9yIDgwMi4xMSBoZWFkZXIuCisJCWlmIChmcmFnTnVtID09IDAgJiYgcFR4QmxrLT5wRXh0cmFMbGNTbmFwRW5jYXApCisJCQlwVHhCbGstPk1wZHVIZWFkZXJMZW4gLT0gTEVOR1RIXzgwMl8xX0g7CisKKwkJZnJhZ051bSsrOworCQlTcmNSZW1haW5pbmdCeXRlcyAtPSBwVHhCbGstPlNyY0J1ZkxlbjsKKwkJcFR4QmxrLT5wU3JjQnVmRGF0YSArPSBwVHhCbGstPlNyY0J1ZkxlbjsKKworCQlwSGVhZGVyXzgwMl8xMS0+RnJhZysrOwkgLy8gaW5jcmVhc2UgRnJhZyAjCisKKwl9d2hpbGUoU3JjUmVtYWluaW5nQnl0ZXMgPiAwKTsKKworCS8vCisJLy8gS2ljayBvdXQgVHgKKwkvLworCUhBTF9LaWNrT3V0VHgocEFkLCBwVHhCbGssIHBUeEJsay0+UXVlSWR4KTsKK30KKworCisjZGVmaW5lIFJFTEVBU0VfRlJBTUVTX09GX1RYQkxLKF9wQWQsIF9wVHhCbGssIF9wUUVudHJ5LCBfU3RhdHVzKSAJCQkJCQkJCQkJXAorCQl3aGlsZShfcFR4QmxrLT5UeFBhY2tldExpc3QuSGVhZCkJCQkJCQkJCQkJCQkJCVwKKwkJewkJCQkJCQkJCQkJCQkJCQkJCQkJCQlcCisJCQlfcFFFbnRyeSA9IFJlbW92ZUhlYWRRdWV1ZSgmX3BUeEJsay0+VHhQYWNrZXRMaXN0KTsJCQkJCQkJCQlcCisJCQlSRUxFQVNFX05ESVNfUEFDS0VUKF9wQWQsIFFVRVVFX0VOVFJZX1RPX1BBQ0tFVChfcFFFbnRyeSksIF9TdGF0dXMpOwlcCisJCX0KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJQ29weSBmcmFtZSBmcm9tIHdhaXRpbmcgcXVldWUgaW50byByZWxhdGl2ZSByaW5nIGJ1ZmZlciBhbmQgc2V0CisJYXBwcm9wcmlhdGUgQVNJQyByZWdpc3RlciB0byBraWNrIGhhcmR3YXJlIGVuY3J5cHRpb24gYmVmb3JlIHJlYWxseQorCXNlbnQgb3V0IHRvIGFpci4KKworCUFyZ3VtZW50czoKKwkJcEFkIAlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisJCVBORElTX1BBQ0tFVAlQb2ludGVyIHRvIG91dGdvaW5nIE5kaXMgZnJhbWUKKwkJTnVtYmVyT2ZGcmFnCU51bWJlciBvZiBmcmFnbWVudCByZXF1aXJlZAorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitORElTX1NUQVRVUyBTVEFIYXJkVHJhbnNtaXQoCisJSU4gUFJUTVBfQURBUFRFUglwQWQsCisJSU4gVFhfQkxLIAkJCSpwVHhCbGssCisJSU4JVUNIQVIJCQlRdWVJZHgpCit7CisJTkRJU19QQUNLRVQJCSpwUGFja2V0OworCVBRVUVVRV9FTlRSWQlwUUVudHJ5OworCisJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJLy8gU1RFUCAwLiBETyBTQU5JVFkgQ0hFQ0sgQU5EIFNPTUUgRUFSTFkgUFJFUEFSQVRJT04uCisJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJLy8KKwlBU1NFUlQocFR4QmxrLT5UeFBhY2tldExpc3QuTnVtYmVyKTsKKwlpZiAocFR4QmxrLT5UeFBhY2tldExpc3QuSGVhZCA9PSBOVUxMKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgicFR4QmxrLT5Ub3RhbEZyYW1lTnVtID09ICVsZCFcbiIsIHBUeEJsay0+VHhQYWNrZXRMaXN0Lk51bWJlcikpOworCQlyZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRTsKKwl9CisKKwlwUGFja2V0ID0gUVVFVUVfRU5UUllfVE9fUEFDS0VUKHBUeEJsay0+VHhQYWNrZXRMaXN0LkhlYWQpOworCisjaWYgMCAvL2RlZiBDQVJSSUVSX0RFVEVDVElPTl9TVVBQT1JUIC8vIFJvZ2VyIHN5bmMgQ2FycmllcgorCQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLkNhcnJpZXJEZXRlY3QuRW5hYmxlID09IFRSVUUpICYmIChpc0NhcnJpZXJEZXRlY3RFeGlzdChwQWQpID09IFRSVUUpKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfSU5GTywoIlNUQUhhcmRUcmFuc21pdCAtLT4gcmFkYXIgZGV0ZWN0IG5vdCBpbiBub3JtYWwgbW9kZSAhISFcbiIpKTsKKwkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCQlyZXR1cm4gKE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCX0KKyNlbmRpZiAvLyBDQVJSSUVSX0RFVEVDVElPTl9TVVBQT1JUIC8vCisKKwkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkvLyBTVEVQIDEuIFdBS0UgVVAgUEhZCisJLy8JCW91dGdvaW5nIGZyYW1lIGFsd2F5cyB3YWtldXAgUEhZIHRvIHByZXZlbnQgZnJhbWUgbG9zdCBhbmQKKwkvLwkJdHVybiBvZmYgUFNNIGJpdCB0byBpbXByb3ZlIHBlcmZvcm1hbmNlCisJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJLy8gbm90IHRvIGNoYW5nZSBQU00gYml0LCBqdXN0IHNlbmQgdGhpcyBmcmFtZSBvdXQ/CisJaWYgKChwQWQtPlN0YUNmZy5Qc20gPT0gUFdSX1NBVkUpICYmIE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSkpCisJeworCSAgICBEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiQXNpY0ZvcmNlV2FrZXVwIEF0IEhhcmRUeFxuIikpOworCQlBc2ljRm9yY2VXYWtldXAocEFkLCBUUlVFKTsKKwl9CisKKwkvLyBJdCBzaG91bGQgbm90IGNoYW5nZSBQU00gYml0LCB3aGVuIEFQU0QgdHVybiBvbi4KKwlpZiAoKCEocEFkLT5Db21tb25DZmcuYkFQU0RDYXBhYmxlICYmIHBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uYkFQU0RDYXBhYmxlKSAmJiAocEFkLT5Db21tb25DZmcuYkFQU0RGb3JjZVBvd2VyU2F2ZSA9PSBGQUxTRSkpCisJCXx8IChSVE1QX0dFVF9QQUNLRVRfRUFQT0wocFR4QmxrLT5wUGFja2V0KSkKKwkJfHwgKFJUTVBfR0VUX1BBQ0tFVF9XQUkocFR4QmxrLT5wUGFja2V0KSkpCisJeworCQlpZiAoKHBBZC0+U3RhQ2ZnLlBzbSA9PSBQV1JfU0FWRSkgJiYKKyAgICAgICAgICAgIChwQWQtPlN0YUNmZy5XaW5kb3dzUG93ZXJNb2RlID09IE5kaXM4MDJfMTFQb3dlck1vZGVGYXN0X1BTUCkpCisJCQlNbG1lU2V0UHNtQml0KHBBZCwgUFdSX0FDVElWRSk7CisJfQorCisJc3dpdGNoIChwVHhCbGstPlR4RnJhbWVUeXBlKQorCXsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJY2FzZSBUWF9BTVBEVV9GUkFNRToKKwkJCQlTVEFfQU1QRFVfRnJhbWVfVHgocEFkLCBwVHhCbGspOworCQkJYnJlYWs7CisJCWNhc2UgVFhfQU1TRFVfRlJBTUU6CisJCQkJU1RBX0FNU0RVX0ZyYW1lX1R4KHBBZCwgcFR4QmxrKTsKKwkJCWJyZWFrOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQljYXNlIFRYX0xFR0FDWV9GUkFNRToKKwkJCQlTVEFfTGVnYWN5X0ZyYW1lX1R4KHBBZCwgcFR4QmxrKTsKKwkJCWJyZWFrOworCQljYXNlIFRYX01DQVNUX0ZSQU1FOgorCQkJCVNUQV9MZWdhY3lfRnJhbWVfVHgocEFkLCBwVHhCbGspOworCQkJYnJlYWs7CisJCWNhc2UgVFhfUkFMSU5LX0ZSQU1FOgorCQkJCVNUQV9BUmFsaW5rX0ZyYW1lX1R4KHBBZCwgcFR4QmxrKTsKKwkJCWJyZWFrOworCQljYXNlIFRYX0ZSQUdfRlJBTUU6CisJCQkJU1RBX0ZyYWdtZW50X0ZyYW1lX1R4KHBBZCwgcFR4QmxrKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJeworCQkJCS8vIEl0IHNob3VsZCBub3QgaGFwcGVuZWQhCisJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiU2VuZCBhIHBhY2VrdCB3YXMgbm90IGNsYXNzaWZpZWQhISBJdCBzaG91bGQgbm90IGhhcHBlbiFcbiIpKTsKKwkJCQl3aGlsZShwVHhCbGstPlR4UGFja2V0TGlzdC5OdW1iZXIpCisJCQkJeworCQkJCQlwUUVudHJ5ID0gUmVtb3ZlSGVhZFF1ZXVlKCZwVHhCbGstPlR4UGFja2V0TGlzdCk7CisJCQkJCXBQYWNrZXQgPSBRVUVVRV9FTlRSWV9UT19QQUNLRVQocFFFbnRyeSk7CisJCQkJCWlmIChwUGFja2V0KQorCQkJCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCX0KKworCXJldHVybiAoTkRJU19TVEFUVVNfU1VDQ0VTUyk7CisKK30KKworVUxPTkcgIEhhc2hCeXRlc1BvbHlub21pYWwoVUNIQVIgKnZhbHVlLCB1bnNpZ25lZCBpbnQgbGVuKQoreworICAgdW5zaWduZWQgY2hhciAqd29yZCA9IHZhbHVlOworICAgdW5zaWduZWQgaW50IHJldCA9IDA7CisgICB1bnNpZ25lZCBpbnQgaTsKKworICAgZm9yKGk9MDsgaSA8IGxlbjsgaSsrKQorICAgeworCSAgaW50IG1vZCA9IGkgJSAzMjsKKwkgIHJldCBePSh1bnNpZ25lZCBpbnQpICh3b3JkW2ldKSA8PCBtb2Q7CisJICByZXQgXj0odW5zaWduZWQgaW50KSAod29yZFtpXSkgPj4gKDMyIC0gbW9kKTsKKyAgIH0KKyAgIHJldHVybiByZXQ7Cit9CisKK1ZPSUQgU3RhX0Fubm91bmNlX29yX0ZvcndhcmRfODAyXzNfUGFja2V0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBORElTX1BBQ0tFVAlwUGFja2V0LAorCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpCit7CisJaWYgKFRSVUUKKwkJKQorCXsKKwkJYW5ub3VuY2VfODAyXzNfcGFja2V0KHBBZCwgcFBhY2tldCk7CisJfQorCWVsc2UKKwl7CisJCS8vIHJlbGVhc2UgcGFja2V0CisJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwl9Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvc3RhL3Nhbml0eS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9zdGEvc2FuaXR5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjM5ODcyNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvc3RhL3Nhbml0eS5jCkBAIC0wLDAgKzEsNDIwIEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCU1vZHVsZSBOYW1lOgorCXNhbml0eS5jCisKKwlBYnN0cmFjdDoKKworCVJldmlzaW9uIEhpc3Rvcnk6CisJV2hvCQkJV2hlbgkJCVdoYXQKKwktLS0tLS0tLQktLS0tLS0tLS0tCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJSm9obiBDaGFuZyAgMjAwNC0wOS0wMSAgICAgIGFkZCBXTU0gc3VwcG9ydAorKi8KKyNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKKworZXh0ZXJuIFVDSEFSCUNJU0NPX09VSVtdOworCitleHRlcm4gVUNIQVIJV1BBX09VSVtdOworZXh0ZXJuIFVDSEFSCVJTTl9PVUlbXTsKK2V4dGVybiBVQ0hBUglXTUVfSU5GT19FTEVNW107CitleHRlcm4gVUNIQVIJV01FX1BBUk1fRUxFTVtdOworZXh0ZXJuIFVDSEFSCUNjeDJRb3NJbmZvW107CitleHRlcm4gVUNIQVIJUkFMSU5LX09VSVtdOworZXh0ZXJuIFVDSEFSCUJST0FEQ09NX09VSVtdOworCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIE1MTUUgbWVzc2FnZSBzYW5pdHkgY2hlY2sKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitCT09MRUFOIE1sbWVTdGFydFJlcVNhbml0eSgKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBWT0lEICpNc2csCisgICAgSU4gVUxPTkcgTXNnTGVuLAorICAgIE9VVCBDSEFSIFNzaWRbXSwKKyAgICBPVVQgVUNIQVIgKnBTc2lkTGVuKQoreworICAgIE1MTUVfU1RBUlRfUkVRX1NUUlVDVCAqSW5mbzsKKworICAgIEluZm8gPSAoTUxNRV9TVEFSVF9SRVFfU1RSVUNUICopKE1zZyk7CisKKyAgICBpZiAoSW5mby0+U3NpZExlbiA+IE1BWF9MRU5fT0ZfU1NJRCkKKyAgICB7CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1sbWVTdGFydFJlcVNhbml0eSBmYWlsIC0gd3JvbmcgU1NJRCBsZW5ndGhcbiIpKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgICpwU3NpZExlbiA9IEluZm8tPlNzaWRMZW47CisgICAgTmRpc01vdmVNZW1vcnkoU3NpZCwgSW5mby0+U3NpZCwgKnBTc2lkTGVuKTsKKworICAgIHJldHVybiBUUlVFOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIE1MTUUgbWVzc2FnZSBzYW5pdHkgY2hlY2sKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKworICAgIElSUUwgPSBESVNQQVRDSF9MRVZFTAorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworQk9PTEVBTiBQZWVyQXNzb2NSc3BTYW5pdHkoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gVk9JRCAqcE1zZywKKyAgICBJTiBVTE9ORyBNc2dMZW4sCisgICAgT1VUIFBVQ0hBUiBwQWRkcjIsCisgICAgT1VUIFVTSE9SVCAqcENhcGFiaWxpdHlJbmZvLAorICAgIE9VVCBVU0hPUlQgKnBTdGF0dXMsCisgICAgT1VUIFVTSE9SVCAqcEFpZCwKKyAgICBPVVQgVUNIQVIgU3VwUmF0ZVtdLAorICAgIE9VVCBVQ0hBUiAqcFN1cFJhdGVMZW4sCisgICAgT1VUIFVDSEFSIEV4dFJhdGVbXSwKKyAgICBPVVQgVUNIQVIgKnBFeHRSYXRlTGVuLAorICAgIE9VVCBIVF9DQVBBQklMSVRZX0lFCQkqcEh0Q2FwYWJpbGl0eSwKKyAgICBPVVQgQUREX0hUX0lORk9fSUUJCSpwQWRkSHRJbmZvLAkvLyBBUCBtaWdodCB1c2UgdGhpcyBhZGRpdGlvbmFsIGh0IGluZm8gSUUKKyAgICBPVVQgVUNIQVIJCQkqcEh0Q2FwYWJpbGl0eUxlbiwKKyAgICBPVVQgVUNIQVIJCQkqcEFkZEh0SW5mb0xlbiwKKyAgICBPVVQgVUNIQVIJCQkqcE5ld0V4dENoYW5uZWxPZmZzZXQsCisgICAgT1VUIFBFRENBX1BBUk0gcEVkY2FQYXJtLAorICAgIE9VVCBVQ0hBUiAqcENraXBGbGFnKQoreworICAgIENIQVIgICAgICAgICAgSWVUeXBlLCAqUHRyOworICAgIFBGUkFNRV84MDJfMTEgcEZyYW1lID0gKFBGUkFNRV84MDJfMTEpcE1zZzsKKyAgICBQRUlEX1NUUlVDVCAgIHBFaWQ7CisgICAgVUxPTkcgICAgICAgICBMZW5ndGggPSAwOworCisJKnBOZXdFeHRDaGFubmVsT2Zmc2V0ID0gMHhmZjsKKwkqcEh0Q2FwYWJpbGl0eUxlbiA9IDA7CisJKnBBZGRIdEluZm9MZW4gPSAwOworICAgIENPUFlfTUFDX0FERFIocEFkZHIyLCBwRnJhbWUtPkhkci5BZGRyMik7CisgICAgUHRyID0gcEZyYW1lLT5PY3RldDsKKyAgICBMZW5ndGggKz0gTEVOR1RIXzgwMl8xMTsKKworICAgIE5kaXNNb3ZlTWVtb3J5KHBDYXBhYmlsaXR5SW5mbywgJnBGcmFtZS0+T2N0ZXRbMF0sIDIpOworICAgIExlbmd0aCArPSAyOworICAgIE5kaXNNb3ZlTWVtb3J5KHBTdGF0dXMsICAgICAgICAgJnBGcmFtZS0+T2N0ZXRbMl0sIDIpOworICAgIExlbmd0aCArPSAyOworICAgICpwQ2tpcEZsYWcgPSAwOworICAgICpwRXh0UmF0ZUxlbiA9IDA7CisgICAgcEVkY2FQYXJtLT5iVmFsaWQgPSBGQUxTRTsKKworICAgIGlmICgqcFN0YXR1cyAhPSBNTE1FX1NVQ0NFU1MpCisgICAgICAgIHJldHVybiBUUlVFOworCisgICAgTmRpc01vdmVNZW1vcnkocEFpZCwgJnBGcmFtZS0+T2N0ZXRbNF0sIDIpOworICAgIExlbmd0aCArPSAyOworCisgICAgLy8gQWlkIGFscmVhZHkgc3dhcGVkIGJ5dGUgb3JkZXIgaW4gUlRNUEZyYW1lRW5kaWFuQ2hhbmdlKCkgZm9yIGJpZyBlbmRpYW4gcGxhdGZvcm0KKyAgICAqcEFpZCA9ICgqcEFpZCkgJiAweDNmZmY7IC8vIEFJRCBpcyBsb3cgMTQtYml0CisKKyAgICAvLyAtLSBnZXQgc3VwcG9ydGVkIHJhdGVzIGZyb20gcGF5bG9hZCBhbmQgYWR2YW5jZSB0aGUgcG9pbnRlcgorICAgIEllVHlwZSA9IHBGcmFtZS0+T2N0ZXRbNl07CisgICAgKnBTdXBSYXRlTGVuID0gcEZyYW1lLT5PY3RldFs3XTsKKyAgICBpZiAoKEllVHlwZSAhPSBJRV9TVVBQX1JBVEVTKSB8fCAoKnBTdXBSYXRlTGVuID4gTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVMpKQorICAgIHsKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGVlckFzc29jUnNwU2FuaXR5IGZhaWwgLSB3cm9uZyBTdXBwb3J0ZWRSYXRlcyBJRVxuIikpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgTmRpc01vdmVNZW1vcnkoU3VwUmF0ZSwgJnBGcmFtZS0+T2N0ZXRbOF0sICpwU3VwUmF0ZUxlbik7CisKKyAgICBMZW5ndGggPSBMZW5ndGggKyAyICsgKnBTdXBSYXRlTGVuOworCisgICAgLy8gbWFueSBBUCBpbXBsZW1lbnQgcHJvcHJpZXRhcnkgSUVzIGluIG5vbi1zdGFuZGFyZCBvcmRlciwgd2UnZCBiZXR0ZXIKKyAgICAvLyB0b2xlcmF0ZSBtaXMtb3JkZXJlZCBJRXMgdG8gZ2V0IGJlc3QgY29tcGF0aWJpbGl0eQorICAgIHBFaWQgPSAoUEVJRF9TVFJVQ1QpICZwRnJhbWUtPk9jdGV0WzggKyAoKnBTdXBSYXRlTGVuKV07CisKKyAgICAvLyBnZXQgdmFyaWFibGUgZmllbGRzIGZyb20gcGF5bG9hZCBhbmQgYWR2YW5jZSB0aGUgcG9pbnRlcgorICAgIHdoaWxlICgoTGVuZ3RoICsgMiArIHBFaWQtPkxlbikgPD0gTXNnTGVuKQorICAgIHsKKyAgICAgICAgc3dpdGNoIChwRWlkLT5FaWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgSUVfRVhUX1NVUFBfUkFURVM6CisgICAgICAgICAgICAgICAgaWYgKHBFaWQtPkxlbiA8PSBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KEV4dFJhdGUsIHBFaWQtPk9jdGV0LCBwRWlkLT5MZW4pOworICAgICAgICAgICAgICAgICAgICAqcEV4dFJhdGVMZW4gPSBwRWlkLT5MZW47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgY2FzZSBJRV9IVF9DQVA6CisgICAgICAgICAgICBjYXNlIElFX0hUX0NBUDI6CisJCQlpZiAocEVpZC0+TGVuID49IFNJWkVfSFRfQ0FQX0lFKSAgLy9Ob3RlOiBhbGxvdyBleHRlbnNpb24uISEKKwkJCXsKKwkJCQlOZGlzTW92ZU1lbW9yeShwSHRDYXBhYmlsaXR5LCBwRWlkLT5PY3RldCwgU0laRV9IVF9DQVBfSUUpOworCisJCQkJKihVU0hPUlQgKikoJnBIdENhcGFiaWxpdHktPkh0Q2FwSW5mbykgPSBjcHUybGUxNigqKFVTSE9SVCAqKSgmcEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvKSk7CisJCQkJKihVU0hPUlQgKikoJnBIdENhcGFiaWxpdHktPkV4dEh0Q2FwSW5mbykgPSBjcHUybGUxNigqKFVTSE9SVCAqKSgmcEh0Q2FwYWJpbGl0eS0+RXh0SHRDYXBJbmZvKSk7CisKKwkJCQkqcEh0Q2FwYWJpbGl0eUxlbiA9IFNJWkVfSFRfQ0FQX0lFOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1dBUk4sICgiUGVlckFzc29jUnNwU2FuaXR5IC0gd3JvbmcgSUVfSFRfQ0FQLiBcbiIpKTsKKwkJCX0KKworCQlicmVhazsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKyAgICAgICAgICAgIGNhc2UgSUVfQUREX0hUOgorICAgICAgICAgICAgY2FzZSBJRV9BRERfSFQyOgorCQkJaWYgKHBFaWQtPkxlbiA+PSBzaXplb2YoQUREX0hUX0lORk9fSUUpKQorCQkJeworCQkJCS8vIFRoaXMgSUUgYWxsb3dzIGV4dGVuc2lvbiwgYnV0IHdlIGNhbiBpZ25vcmUgZXh0cmEgYnl0ZXMgYmV5b25kIG91ciBrbm93bGVkZ2UgLCBzbyBvbmx5CisJCQkJLy8gY29weSBmaXJzdCBzaXplb2YoQUREX0hUX0lORk9fSUUpCisJCQkJTmRpc01vdmVNZW1vcnkocEFkZEh0SW5mbywgcEVpZC0+T2N0ZXQsIHNpemVvZihBRERfSFRfSU5GT19JRSkpOworCisJCQkJKihVU0hPUlQgKikoJnBBZGRIdEluZm8tPkFkZEh0SW5mbzIpID0gY3B1MmxlMTYoKihVU0hPUlQgKikoJnBBZGRIdEluZm8tPkFkZEh0SW5mbzIpKTsKKwkJCQkqKFVTSE9SVCAqKSgmcEFkZEh0SW5mby0+QWRkSHRJbmZvMykgPSBjcHUybGUxNigqKFVTSE9SVCAqKSgmcEFkZEh0SW5mby0+QWRkSHRJbmZvMykpOworCisJCQkJKnBBZGRIdEluZm9MZW4gPSBTSVpFX0FERF9IVF9JTkZPX0lFOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1dBUk4sICgiUGVlckFzc29jUnNwU2FuaXR5IC0gd3JvbmcgSUVfQUREX0hULiBcbiIpKTsKKwkJCX0KKworCQlicmVhazsKKyAgICAgICAgICAgIGNhc2UgSUVfU0VDT05EQVJZX0NIX09GRlNFVDoKKwkJCWlmIChwRWlkLT5MZW4gPT0gMSkKKwkJCXsKKwkJCQkqcE5ld0V4dENoYW5uZWxPZmZzZXQgPSBwRWlkLT5PY3RldFswXTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19XQVJOLCAoIlBlZXJBc3NvY1JzcFNhbml0eSAtIHdyb25nIElFX1NFQ09OREFSWV9DSF9PRkZTRVQuIFxuIikpOworCQkJfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQlicmVhazsKKyAgICAgICAgICAgIGNhc2UgSUVfQUlST05FVF9DS0lQOgorICAgICAgICAgICAgICAgIC8vIDAuIENoZWNrIEFpcm9uZXQgSUUgbGVuZ3RoLCBpdCBtdXN0IGJlIGxhcmdlciBvciBlcXVhbCB0byAyOAorICAgICAgICAgICAgICAgIC8vICAgIENpc2NvJ3MgQVAgVnhXb3JrIHZlcnNpb24od2lsbCBub3QgYmUgc3VwcG9ydGVkKSB1c2VkIHRoaXMgSUUgbGVuZ3RoIGFzIDI4CisgICAgICAgICAgICAgICAgLy8gICAgQ2lzY28ncyBBUCBJT1MgdmVyc2lvbiB1c2VkIHRoaXMgSUUgbGVuZ3RoIGFzIDMwCisgICAgICAgICAgICAgICAgaWYgKHBFaWQtPkxlbiA8IChDS0lQX05FR09USUFUSU9OX0xFTkdUSCAtIDIpKQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgLy8gMS4gQ29weSBDS0lQIGZsYWcgYnl0ZSB0byBidWZmZXIgZm9yIHByb2Nlc3MKKyAgICAgICAgICAgICAgICAqcENraXBGbGFnID0gKihwRWlkLT5PY3RldCArIDgpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIElFX0FJUk9ORVRfSVBBRERSRVNTOgorICAgICAgICAgICAgICAgIGlmIChwRWlkLT5MZW4gIT0gMHgwQSkKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIC8vIEdldCBDaXNjbyBBaXJvbmV0IElQIGluZm9ybWF0aW9uCisgICAgICAgICAgICAgICAgaWYgKE5kaXNFcXVhbE1lbW9yeShwRWlkLT5PY3RldCwgQ0lTQ09fT1VJLCAzKSA9PSAxKQorICAgICAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5BaXJvbmV0SVBBZGRyZXNzLCBwRWlkLT5PY3RldCArIDQsIDQpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAvLyBDQ1gyLCBXTU0gdXNlIHRoZSBzYW1lIElFIHZhbHVlCisgICAgICAgICAgICAvLyBjYXNlIElFX0NDWF9WMjoKKyAgICAgICAgICAgIGNhc2UgSUVfVkVORE9SX1NQRUNJRklDOgorICAgICAgICAgICAgICAgIC8vIGhhbmRsZSBXTUUgUEFSQU1URVIgRUxFTUVOVAorICAgICAgICAgICAgICAgIGlmIChOZGlzRXF1YWxNZW1vcnkocEVpZC0+T2N0ZXQsIFdNRV9QQVJNX0VMRU0sIDYpICYmIChwRWlkLT5MZW4gPT0gMjQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgUFVDSEFSIHB0cjsKKyAgICAgICAgICAgICAgICAgICAgaW50IGk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gcGFyc2luZyBFRENBIHBhcmFtZXRlcnMKKyAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5iVmFsaWQgICAgICAgICAgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPmJRQWNrICAgICAgICAgICA9IEZBTFNFOyAvLyBwRWlkLT5PY3RldFswXSAmIDB4MTA7CisgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+YlF1ZXVlUmVxdWVzdCAgID0gRkFMU0U7IC8vIHBFaWQtPk9jdGV0WzBdICYgMHgyMDsKKyAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5iVHhvcFJlcXVlc3QgICAgPSBGQUxTRTsgLy8gcEVpZC0+T2N0ZXRbMF0gJiAweDQwOworICAgICAgICAgICAgICAgICAgICAvL3BFZGNhUGFybS0+Yk1vcmVEYXRhQWNrICAgID0gRkFMU0U7IC8vIHBFaWQtPk9jdGV0WzBdICYgMHg4MDsKKyAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5FZGNhVXBkYXRlQ291bnQgPSBwRWlkLT5PY3RldFs2XSAmIDB4MGY7CisgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+YkFQU0RDYXBhYmxlICAgID0gKHBFaWQtPk9jdGV0WzZdICYgMHg4MCkgPyAxIDogMDsKKyAgICAgICAgICAgICAgICAgICAgcHRyID0gJnBFaWQtPk9jdGV0WzhdOworICAgICAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaTw0OyBpKyspCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSIGFjaSA9ICgqcHRyICYgMHg2MCkgPj4gNTsgLy8gYjV+NiBpcyBBQyBJTkRFWAorICAgICAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5iQUNNW2FjaV0gID0gKCgoKnB0cikgJiAweDEwKSA9PSAweDEwKTsgICAvLyBiNSBpcyBBQ00KKyAgICAgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+QWlmc25bYWNpXSA9ICgqcHRyKSAmIDB4MGY7ICAgICAgICAgICAgICAgLy8gYjB+MyBpcyBBSUZTTgorICAgICAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5Dd21pblthY2ldID0gKihwdHIrMSkgJiAweDBmOyAgICAgICAgICAgICAvLyBiMH40IGlzIEN3bWluCisgICAgICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPkN3bWF4W2FjaV0gPSAqKHB0cisxKSA+PiA0OyAgICAgICAgICAgICAgIC8vIGI1fjggaXMgQ3dtYXgKKyAgICAgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+VHhvcFthY2ldICA9ICoocHRyKzIpICsgMjU2ICogKCoocHRyKzMpKTsgLy8gaW4gdW5pdCBvZiAzMi11cworICAgICAgICAgICAgICAgICAgICAgICAgcHRyICs9IDQ7IC8vIHBvaW50IHRvIG5leHQgQUMKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIGhhbmRsZSBDQ1ggSUUKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyAwLiBDaGVjayB0aGUgc2l6ZSBhbmQgQ0NYIGFkbWluIGNvbnRyb2wKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBBZC0+U3RhQ2ZnLkNDWENvbnRyb2wuZmllbGQuRW5hYmxlID09IDApCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBFaWQtPkxlbiAhPSA1KQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gVHVybiBDQ1gyIGlmIG1hdGNoZWQKKyAgICAgICAgICAgICAgICAgICAgaWYgKE5kaXNFcXVhbE1lbW9yeShwRWlkLT5PY3RldCwgQ2N4MkllSW5mbywgNSkgPT0gMSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHBBZC0+U3RhQ2ZnLkNDWEVuYWJsZSA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyQXNzb2NSc3BTYW5pdHkgLSBpZ25vcmUgdW5yZWNvZ25pemVkIEVJRCA9ICVkXG4iLCBwRWlkLT5FaWQpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIExlbmd0aCA9IExlbmd0aCArIDIgKyBwRWlkLT5MZW47CisgICAgICAgIHBFaWQgPSAoUEVJRF9TVFJVQ1QpKChVQ0hBUiopcEVpZCArIDIgKyBwRWlkLT5MZW4pOworICAgIH0KKworICAgIC8vIEZvcmNlIENDWDIgZW5hYmxlIHRvIFRSVUUgZm9yIHRob3NlIEFQIGRpZG4ndCByZXBsYXkgQ0NYIHYyIElFLCB3ZSBzdGlsbCBmb3JjZSBpdCB0byBiZSBvbgorICAgIGlmIChwQWQtPlN0YUNmZy5DQ1hDb250cm9sLmZpZWxkLkVuYWJsZSA9PSAxKQorICAgICAgICBwQWQtPlN0YUNmZy5DQ1hFbmFibGUgPSBUUlVFOworCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgTUxNRSBtZXNzYWdlIHNhbml0eSBjaGVjaworICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitCT09MRUFOIFBlZXJQcm9iZVJlcVNhbml0eSgKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBWT0lEICpNc2csCisgICAgSU4gVUxPTkcgTXNnTGVuLAorICAgIE9VVCBQVUNIQVIgcEFkZHIyLAorICAgIE9VVCBDSEFSIFNzaWRbXSwKKyAgICBPVVQgVUNIQVIgKnBTc2lkTGVuKQoreworICAgIFVDSEFSICAgICAgICAgSWR4OworICAgIFVDSEFSCSAgICAgIFJhdGVMZW47CisgICAgQ0hBUiAgICAgICAgICBJZVR5cGU7CisgICAgUEZSQU1FXzgwMl8xMSBwRnJhbWUgPSAoUEZSQU1FXzgwMl8xMSlNc2c7CisKKyAgICBDT1BZX01BQ19BRERSKHBBZGRyMiwgcEZyYW1lLT5IZHIuQWRkcjIpOworCisgICAgaWYgKChwRnJhbWUtPk9jdGV0WzBdICE9IElFX1NTSUQpIHx8IChwRnJhbWUtPk9jdGV0WzFdID4gTUFYX0xFTl9PRl9TU0lEKSkKKyAgICB7CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXJQcm9iZVJlcVNhbml0eSBmYWlsIC0gd3JvbmcgU1NJRCBJRShUeXBlPSVkLExlbj0lZClcbiIscEZyYW1lLT5PY3RldFswXSxwRnJhbWUtPk9jdGV0WzFdKSk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICAqcFNzaWRMZW4gPSBwRnJhbWUtPk9jdGV0WzFdOworICAgIE5kaXNNb3ZlTWVtb3J5KFNzaWQsICZwRnJhbWUtPk9jdGV0WzJdLCAqcFNzaWRMZW4pOworCisgICAgSWR4ID0gKnBTc2lkTGVuICsgMjsKKworICAgIC8vIC0tIGdldCBzdXBwb3J0ZWQgcmF0ZXMgZnJvbSBwYXlsb2FkIGFuZCBhZHZhbmNlIHRoZSBwb2ludGVyCisgICAgSWVUeXBlID0gcEZyYW1lLT5PY3RldFtJZHhdOworICAgIFJhdGVMZW4gPSBwRnJhbWUtPk9jdGV0W0lkeCArIDFdOworICAgIGlmIChJZVR5cGUgIT0gSUVfU1VQUF9SQVRFUykKKyAgICB7CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXJQcm9iZVJlcVNhbml0eSBmYWlsIC0gd3JvbmcgU3VwcG9ydFJhdGVzIElFKFR5cGU9JWQsTGVuPSVkKVxuIixwRnJhbWUtPk9jdGV0W0lkeF0scEZyYW1lLT5PY3RldFtJZHgrMV0pKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpZiAoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExRykgJiYgKFJhdGVMZW4gPCA4KSkKKyAgICAgICAgICAgIHJldHVybiAoRkFMU0UpOworICAgIH0KKworICAgIHJldHVybiBUUlVFOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK0JPT0xFQU4gR2V0VGltQml0KAorICAgIElOIENIQVIgKlB0ciwKKyAgICBJTiBVU0hPUlQgQWlkLAorICAgIE9VVCBVQ0hBUiAqVGltTGVuLAorICAgIE9VVCBVQ0hBUiAqQmNhc3RGbGFnLAorICAgIE9VVCBVQ0hBUiAqRHRpbUNvdW50LAorICAgIE9VVCBVQ0hBUiAqRHRpbVBlcmlvZCwKKyAgICBPVVQgVUNIQVIgKk1lc3NhZ2VUb01lKQoreworICAgIFVDSEFSICAgICAgICAgIEJpdENudGwsIE4xLCBOMiwgTXlCeXRlLCBNeUJpdDsKKyAgICBDSEFSICAgICAgICAgICpJZHhQdHI7CisKKyAgICBJZHhQdHIgPSBQdHI7CisKKyAgICBJZHhQdHIgKys7CisgICAgKlRpbUxlbiA9ICpJZHhQdHI7CisKKyAgICAvLyBnZXQgRFRJTSBDb3VudCBmcm9tIFRJTSBlbGVtZW50CisgICAgSWR4UHRyICsrOworICAgICpEdGltQ291bnQgPSAqSWR4UHRyOworCisgICAgLy8gZ2V0IERUSU0gUGVyaW9kIGZyb20gVElNIGVsZW1lbnQKKyAgICBJZHhQdHIrKzsKKyAgICAqRHRpbVBlcmlvZCA9ICpJZHhQdHI7CisKKyAgICAvLyBnZXQgQml0bWFwIENvbnRyb2wgZnJvbSBUSU0gZWxlbWVudAorICAgIElkeFB0cisrOworICAgIEJpdENudGwgPSAqSWR4UHRyOworCisgICAgaWYgKCgqRHRpbUNvdW50ID09IDApICYmIChCaXRDbnRsICYgMHgwMSkpCisgICAgICAgICpCY2FzdEZsYWcgPSBUUlVFOworICAgIGVsc2UKKyAgICAgICAgKkJjYXN0RmxhZyA9IEZBTFNFOworCisgICAgLy8gUGFyc2UgUGFydGlhbCBWaXJ0dWFsIEJpdG1hcCBmcm9tIFRJTSBlbGVtZW50CisgICAgTjEgPSBCaXRDbnRsICYgMHhmZTsgICAgLy8gTjEgaXMgdGhlIGZpcnN0IGJpdG1hcCBieXRlIworICAgIE4yID0gKlRpbUxlbiAtIDQgKyBOMTsgIC8vIE4yIGlzIHRoZSBsYXN0IGJpdG1hcCBieXRlIworCisgICAgaWYgKChBaWQgPCAoTjEgPDwgMykpIHx8IChBaWQgPj0gKChOMiArIDEpIDw8IDMpKSkKKyAgICAgICAgKk1lc3NhZ2VUb01lID0gRkFMU0U7CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgTXlCeXRlID0gKEFpZCA+PiAzKSAtIE4xOyAgICAgICAgICAgICAgICAgICAgICAgLy8gbXkgYnl0ZSBwb3NpdGlvbiBpbiB0aGUgYml0bWFwIGJ5dGUtc3RyZWFtCisgICAgICAgIE15Qml0ID0gQWlkICUgMTYgLSAoKE15Qnl0ZSAmIDB4MDEpPyA4OjApOworCisgICAgICAgIElkeFB0ciArPSAoTXlCeXRlICsgMSk7CisKKyAgICAgICAgLy9pZiAoKklkeFB0cikKKyAgICAgICAgLy8gICAgREJHUFJJTlQoUlRfREVCVUdfV0FSTiwgKCJUSU0gYml0bWFwID0gMHglMDJ4XG4iLCAqSWR4UHRyKSk7CisKKyAgICAgICAgaWYgKCpJZHhQdHIgJiAoMHgwMSA8PCBNeUJpdCkpCisgICAgICAgICAgICAqTWVzc2FnZVRvTWUgPSBUUlVFOworICAgICAgICBlbHNlCisgICAgICAgICAgICAqTWVzc2FnZVRvTWUgPSBGQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gVFJVRTsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9zdGEvc3luYy5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9zdGEvc3luYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0ODk3NTUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3N0YS9zeW5jLmMKQEAgLTAsMCArMSwxNzUzIEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCU1vZHVsZSBOYW1lOgorCXN5bmMuYworCisJQWJzdHJhY3Q6CisKKwlSZXZpc2lvbiBIaXN0b3J5OgorCVdobwkJCVdoZW4JCQlXaGF0CisJLS0tLS0tLS0JLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCUpvaG4gQ2hhbmcJMjAwNC0wOS0wMSAgICAgIG1vZGlmaWVkIGZvciBydDI1NjEvMjY2MQorCUphbiBMZWUJCTIwMDYtMDgtMDEgICAgICBtb2RpZmllZCBmb3IgcnQyODYwIGZvciA4MDIuMTFuCisqLworI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgorCisjZGVmaW5lIEFESE9DX0VOVFJZX0JFQUNPTl9MT1NUX1RJTUUJKDIqT1NfSFopCS8vIDIgc2VjCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJVGhlIHN5bmMgc3RhdGUgbWFjaGluZSwKKwlQYXJhbWV0ZXJzOgorCQlTbSAtIHBvaW50ZXIgdG8gdGhlIHN0YXRlIG1hY2hpbmUKKwlOb3RlOgorCQl0aGUgc3RhdGUgbWFjaGluZSBsb29rcyBsaWtlIHRoZSBmb2xsb3dpbmcKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgU3luY1N0YXRlTWFjaGluZUluaXQoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gU1RBVEVfTUFDSElORSAqU20sCisJT1VUIFNUQVRFX01BQ0hJTkVfRlVOQyBUcmFuc1tdKQoreworCVN0YXRlTWFjaGluZUluaXQoU20sIFRyYW5zLCBNQVhfU1lOQ19TVEFURSwgTUFYX1NZTkNfTVNHLCAoU1RBVEVfTUFDSElORV9GVU5DKURyb3AsIFNZTkNfSURMRSwgU1lOQ19NQUNISU5FX0JBU0UpOworCisJLy8gY29sdW1uIDEKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIFNZTkNfSURMRSwgTVQyX01MTUVfU0NBTl9SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpTWxtZVNjYW5SZXFBY3Rpb24pOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgU1lOQ19JRExFLCBNVDJfTUxNRV9KT0lOX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylNbG1lSm9pblJlcUFjdGlvbik7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBTWU5DX0lETEUsIE1UMl9NTE1FX1NUQVJUX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylNbG1lU3RhcnRSZXFBY3Rpb24pOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgU1lOQ19JRExFLCBNVDJfUEVFUl9CRUFDT04sIChTVEFURV9NQUNISU5FX0ZVTkMpUGVlckJlYWNvbik7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBTWU5DX0lETEUsIE1UMl9QRUVSX1BST0JFX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyUHJvYmVSZXFBY3Rpb24pOworCisJLy9jb2x1bW4gMgorCVN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgSk9JTl9XQUlUX0JFQUNPTiwgTVQyX01MTUVfU0NBTl9SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpSW52YWxpZFN0YXRlV2hlblNjYW4pOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgSk9JTl9XQUlUX0JFQUNPTiwgTVQyX01MTUVfSk9JTl9SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpSW52YWxpZFN0YXRlV2hlbkpvaW4pOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgSk9JTl9XQUlUX0JFQUNPTiwgTVQyX01MTUVfU1RBUlRfUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKUludmFsaWRTdGF0ZVdoZW5TdGFydCk7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBKT0lOX1dBSVRfQkVBQ09OLCBNVDJfUEVFUl9CRUFDT04sIChTVEFURV9NQUNISU5FX0ZVTkMpUGVlckJlYWNvbkF0Sm9pbkFjdGlvbik7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBKT0lOX1dBSVRfQkVBQ09OLCBNVDJfQkVBQ09OX1RJTUVPVVQsIChTVEFURV9NQUNISU5FX0ZVTkMpQmVhY29uVGltZW91dEF0Sm9pbkFjdGlvbik7CisKKwkvLyBjb2x1bW4gMworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgU0NBTl9MSVNURU4sIE1UMl9NTE1FX1NDQU5fUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKUludmFsaWRTdGF0ZVdoZW5TY2FuKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIFNDQU5fTElTVEVOLCBNVDJfTUxNRV9KT0lOX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylJbnZhbGlkU3RhdGVXaGVuSm9pbik7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBTQ0FOX0xJU1RFTiwgTVQyX01MTUVfU1RBUlRfUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKUludmFsaWRTdGF0ZVdoZW5TdGFydCk7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBTQ0FOX0xJU1RFTiwgTVQyX1BFRVJfQkVBQ09OLCAoU1RBVEVfTUFDSElORV9GVU5DKVBlZXJCZWFjb25BdFNjYW5BY3Rpb24pOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgU0NBTl9MSVNURU4sIE1UMl9QRUVSX1BST0JFX1JTUCwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyQmVhY29uQXRTY2FuQWN0aW9uKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIFNDQU5fTElTVEVOLCBNVDJfU0NBTl9USU1FT1VULCAoU1RBVEVfTUFDSElORV9GVU5DKVNjYW5UaW1lb3V0QWN0aW9uKTsKKworCS8vIHRpbWVyIGluaXQKKwlSVE1QSW5pdFRpbWVyKHBBZCwgJnBBZC0+TWxtZUF1eC5CZWFjb25UaW1lciwgR0VUX1RJTUVSX0ZVTkNUSU9OKEJlYWNvblRpbWVvdXQpLCBwQWQsIEZBTFNFKTsKKwlSVE1QSW5pdFRpbWVyKHBBZCwgJnBBZC0+TWxtZUF1eC5TY2FuVGltZXIsIEdFVF9USU1FUl9GVU5DVElPTihTY2FuVGltZW91dCksIHBBZCwgRkFMU0UpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCUJlYWNvbiB0aW1lb3V0IGhhbmRsZXIsIGV4ZWN1dGVkIGluIHRpbWVyIHRocmVhZAorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIEJlYWNvblRpbWVvdXQoCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKQoreworCVJUTVBfQURBUFRFUiAqcEFkID0gKFJUTVBfQURBUFRFUiAqKUZ1bmN0aW9uQ29udGV4dDsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiU1lOQyAtIEJlYWNvblRpbWVvdXRcbiIpKTsKKworCS8vIERvIG5vdGhpbmcgaWYgdGhlIGRyaXZlciBpcyBzdGFydGluZyBoYWx0IHN0YXRlLgorCS8vIFRoaXMgbWlnaHQgaGFwcGVuIHdoZW4gdGltZXIgYWxyZWFkeSBiZWVuIGZpcmVkIGJlZm9yZSBjYW5jZWwgdGltZXIgd2l0aCBtbG1laGFsdAorCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUykpCisJCXJldHVybjsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCWlmICgocEFkLT5Db21tb25DZmcuQkJQQ3VycmVudEJXID09IEJXXzQwKQorCQkpCisJeworCQlVQ0hBUiAgICAgICAgQkJQVmFsdWUgPSAwOworCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsLCBGQUxTRSk7CisJCUFzaWNMb2NrQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsKTsKKwkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCAmQkJQVmFsdWUpOworCQlCQlBWYWx1ZSAmPSAofjB4MTgpOworCQlCQlBWYWx1ZSB8PSAweDEwOworCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCBCQlBWYWx1ZSk7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNZTkMgLSBFbmQgb2YgU0NBTiwgcmVzdG9yZSB0byA0ME1IeiBjaGFubmVsICVkLCBUb3RhbCBCU1NbJTAyZF1cbiIscEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwsIHBBZC0+U2NhblRhYi5Cc3NOcikpOworCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCU1sbWVFbnF1ZXVlKHBBZCwgU1lOQ19TVEFURV9NQUNISU5FLCBNVDJfQkVBQ09OX1RJTUVPVVQsIDAsIE5VTEwpOworCVJUMjhYWF9NTE1FX0hBTkRMRVIocEFkKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlTY2FuIHRpbWVvdXQgaGFuZGxlciwgZXhlY3V0ZWQgaW4gdGltZXIgdGhyZWFkCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgU2NhblRpbWVvdXQoCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKQoreworCVJUTVBfQURBUFRFUiAqcEFkID0gKFJUTVBfQURBUFRFUiAqKUZ1bmN0aW9uQ29udGV4dDsKKworCisJLy8gRG8gbm90aGluZyBpZiB0aGUgZHJpdmVyIGlzIHN0YXJ0aW5nIGhhbHQgc3RhdGUuCisJLy8gVGhpcyBtaWdodCBoYXBwZW4gd2hlbiB0aW1lciBhbHJlYWR5IGJlZW4gZmlyZWQgYmVmb3JlIGNhbmNlbCB0aW1lciB3aXRoIG1sbWVoYWx0CisJaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKSkKKwkJcmV0dXJuOworCisJaWYgKE1sbWVFbnF1ZXVlKHBBZCwgU1lOQ19TVEFURV9NQUNISU5FLCBNVDJfU0NBTl9USU1FT1VULCAwLCBOVUxMKSkKKwl7CisJCVJUMjhYWF9NTE1FX0hBTkRMRVIocEFkKTsKKwl9CisJZWxzZQorCXsKKwkJLy8gVG8gcHJldmVudCBTeW5jTWFjaGluZS5DdXJyU3RhdGUgaXMgU0NBTl9MSVNURU4gZm9yZXZlci4KKwkJcEFkLT5NbG1lQXV4LkNoYW5uZWwgPSAwOworCQlTY2FuTmV4dENoYW5uZWwocEFkKTsKKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJXaXJlbGVzc0V2ZW50KQorCQl7CisJCQlSVE1QU2VuZFdpcmVsZXNzRXZlbnQocEFkLCBJV19TQ0FOX0VOUVVFVUVfRkFJTF9FVkVOVF9GTEFHLCBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkFkZHIsIEJTUzAsIDApOworCQl9CisJfQorfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCU1MTUUgU0NBTiByZXEgc3RhdGUgbWFjaGluZSBwcm9jZWR1cmUKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIE1sbWVTY2FuUmVxQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlVQ0hBUiAgICAgICAgICBTc2lkW01BWF9MRU5fT0ZfU1NJRF0sIFNzaWRMZW4sIFNjYW5UeXBlLCBCc3NUeXBlLCBCQlBWYWx1ZSA9IDA7CisJQk9PTEVBTiAgICAgICAgVGltZXJDYW5jZWxsZWQ7CisJVUxPTkcJCSAgIE5vdzsKKwlVU0hPUlQgICAgICAgICBTdGF0dXM7CisJUEhFQURFUl84MDJfMTEgcEhkcjgwMjExOworCVBVQ0hBUiAgICAgICAgIHBPdXRCdWZmZXIgPSBOVUxMOworCU5ESVNfU1RBVFVTICAgIE5TdGF0dXM7CisKKwkvLyBDaGVjayB0aGUgdG90YWwgc2NhbiB0cmllcyBmb3Igb25lIHNpbmdsZSBPSUQgY29tbWFuZAorCS8vIElmIHRoaXMgaXMgdGhlIENDWCAyLjAgQ2FzZSwgc2tpcCB0aGF0IQorCWlmICggIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9TVEFSVF9VUCkpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTWU5DIC0gTWxtZVNjYW5SZXFBY3Rpb24gYmVmb3JlIFN0YXJ0dXBcbiIpKTsKKwkJcmV0dXJuOworCX0KKworCS8vIEluY3JlYXNlIHRoZSBzY2FuIHJldHJ5IGNvdW50ZXJzLgorCXBBZC0+U3RhQ2ZnLlNjYW5DbnQrKzsKKworCisJLy8gZmlyc3QgY2hlY2sgdGhlIHBhcmFtZXRlciBzYW5pdHkKKwlpZiAoTWxtZVNjYW5SZXFTYW5pdHkocEFkLAorCQkJCQkJICBFbGVtLT5Nc2csCisJCQkJCQkgIEVsZW0tPk1zZ0xlbiwKKwkJCQkJCSAgJkJzc1R5cGUsCisJCQkJCQkgIFNzaWQsCisJCQkJCQkgICZTc2lkTGVuLAorCQkJCQkJICAmU2NhblR5cGUpKQorCXsKKworCQkvLyBDaGVjayBmb3IgY2hhbm5lbCBsb2FkIGFuZCBub2lzZSBoaXN0IHJlcXVlc3QKKwkJLy8gU3VzcGVuZCBNU0RVIG9ubHkgYXQgc2NhbiByZXF1ZXN0LCBub3QgdGhlIGxhc3QgdHdvIG1lbnRpb25lZAorCQlpZiAoKFNjYW5UeXBlID09IFNDQU5fQ0lTQ09fTk9JU0UpIHx8IChTY2FuVHlwZSA9PSBTQ0FOX0NJU0NPX0NIQU5ORUxfTE9BRCkpCisJCXsKKwkJCWlmIChwQWQtPlN0YUNmZy5DQ1hTY2FuQ2hhbm5lbCAhPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKQorCQkJCVJUTVBTdXNwZW5kTXNkdVRyYW5zbWlzc2lvbihwQWQpOwkJCS8vIFN1c3BlbmQgTVNEVSB0cmFuc21pc3Npb24gaGVyZQorCQl9CisJCWVsc2UKKwkJeworCQkJLy8gU3VzcGVuZCBNU0RVIHRyYW5zbWlzc2lvbiBoZXJlCisJCQlSVE1QU3VzcGVuZE1zZHVUcmFuc21pc3Npb24ocEFkKTsKKwkJfQorCisJCS8vCisJCS8vIFRvIHByZXZlbnQgZGF0YSBsb3N0LgorCQkvLyBTZW5kIGFuIE5VTEwgZGF0YSB3aXRoIHR1cm5lZCBQU00gYml0IG9uIHRvIGN1cnJlbnQgYXNzb2NpYXRlZCBBUCBiZWZvcmUgU0NBTiBwcm9ncmVzcy4KKwkJLy8gQW5kIHNob3VsZCBzZW5kIGFuIE5VTEwgZGF0YSB3aXRoIHR1cm5lZCBQU00gYml0IG9mZiB0byBBUCwgd2hlbiBzY2FuIHByb2dyZXNzIGRvbmUKKwkJLy8KKwkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSAmJiAoSU5GUkFfT04ocEFkKSkpCisJCXsKKwkJCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAoUFZPSUQpJnBPdXRCdWZmZXIpOworCQkJaWYgKE5TdGF0dXMJPT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJCXsKKwkJCQlwSGRyODAyMTEgPSAoUEhFQURFUl84MDJfMTEpIHBPdXRCdWZmZXI7CisJCQkJTWd0TWFjSGVhZGVySW5pdChwQWQsIHBIZHI4MDIxMSwgU1VCVFlQRV9OVUxMX0ZVTkMsIDEsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisJCQkJcEhkcjgwMjExLT5EdXJhdGlvbiA9IDA7CisJCQkJcEhkcjgwMjExLT5GQy5UeXBlID0gQlRZUEVfREFUQTsKKwkJCQlwSGRyODAyMTEtPkZDLlB3ck1nbXQgPSBQV1JfU0FWRTsKKworCQkJCS8vIFNlbmQgdXNpbmcgcHJpb3JpdHkgcXVldWUKKwkJCQlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIDAsIHBPdXRCdWZmZXIsIHNpemVvZihIRUFERVJfODAyXzExKSk7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTWxtZVNjYW5SZXFBY3Rpb24gLS0gU2VuZCBQU00gRGF0YSBmcmFtZSBmb3Igb2ZmIGNoYW5uZWwgUk1cbiIpKTsKKwkJCQlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOworCQkJCVJUTVB1c2VjRGVsYXkoNTAwMCk7CisJCQl9CisJCX0KKworCQlOZGlzR2V0U3lzdGVtVXBUaW1lKCZOb3cpOworCQlwQWQtPlN0YUNmZy5MYXN0U2NhblRpbWUgPSBOb3c7CisJCS8vIHJlc2V0IGFsbCB0aGUgdGltZXJzCisJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LkJlYWNvblRpbWVyLCAmVGltZXJDYW5jZWxsZWQpOworCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5TY2FuVGltZXIsICZUaW1lckNhbmNlbGxlZCk7CisKKwkJLy8gcmVjb3JkIGRlc2lyZWQgQlNTIHBhcmFtZXRlcnMKKwkJcEFkLT5NbG1lQXV4LkJzc1R5cGUgPSBCc3NUeXBlOworCQlwQWQtPk1sbWVBdXguU2NhblR5cGUgPSBTY2FuVHlwZTsKKwkJcEFkLT5NbG1lQXV4LlNzaWRMZW4gPSBTc2lkTGVuOworICAgICAgICBOZGlzWmVyb01lbW9yeShwQWQtPk1sbWVBdXguU3NpZCwgTUFYX0xFTl9PRl9TU0lEKTsKKwkJTmRpc01vdmVNZW1vcnkocEFkLT5NbG1lQXV4LlNzaWQsIFNzaWQsIFNzaWRMZW4pOworCisJCS8vIHN0YXJ0IGZyb20gdGhlIGZpcnN0IGNoYW5uZWwKKwkJcEFkLT5NbG1lQXV4LkNoYW5uZWwgPSBGaXJzdENoYW5uZWwocEFkKTsKKworCQkvLyBDaGFuZ2UgdGhlIHNjYW4gY2hhbm5lbCB3aGVuIGRlYWxpbmcgd2l0aCBDQ1ggYmVhY29uIHJlcG9ydAorCQlpZiAoKFNjYW5UeXBlID09IFNDQU5fQ0lTQ09fUEFTU0lWRSkgfHwgKFNjYW5UeXBlID09IFNDQU5fQ0lTQ09fQUNUSVZFKSB8fAorCQkJKFNjYW5UeXBlID09IFNDQU5fQ0lTQ09fQ0hBTk5FTF9MT0FEKSB8fCAoU2NhblR5cGUgPT0gU0NBTl9DSVNDT19OT0lTRSkpCisJCQlwQWQtPk1sbWVBdXguQ2hhbm5lbCA9IHBBZC0+U3RhQ2ZnLkNDWFNjYW5DaGFubmVsOworCisJCS8vIExldCBCQlAgcmVnaXN0ZXIgYXQgMjBNSHogdG8gZG8gc2NhbgorCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsICZCQlBWYWx1ZSk7CisJCUJCUFZhbHVlICY9ICh+MHgxOCk7CisJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsIEJCUFZhbHVlKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU1lOQyAtIEJCUCBSNCB0byAyME1Iei5sXG4iKSk7CisJCVNjYW5OZXh0Q2hhbm5lbChwQWQpOworCX0KKwllbHNlCisJeworCQlEQkdQUklOVF9FUlIoKCJTWU5DIC0gTWxtZVNjYW5SZXFBY3Rpb24oKSBzYW5pdHkgY2hlY2sgZmFpbFxuIikpOworCQlwQWQtPk1sbWUuU3luY01hY2hpbmUuQ3VyclN0YXRlID0gU1lOQ19JRExFOworCQlTdGF0dXMgPSBNTE1FX0lOVkFMSURfRk9STUFUOworCQlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfU0NBTl9DT05GLCAyLCAmU3RhdHVzKTsKKwl9Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJTUxNRSBKT0lOIHJlcSBzdGF0ZSBtYWNoaW5lIHByb2NlZHVyZQorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgTWxtZUpvaW5SZXFBY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCVVDSEFSICAgICAgICBCQlBWYWx1ZSA9IDA7CisJQlNTX0VOVFJZICAgICpwQnNzOworCUJPT0xFQU4gICAgICAgVGltZXJDYW5jZWxsZWQ7CisJSEVBREVSXzgwMl8xMSBIZHI4MDIxMTsKKwlORElTX1NUQVRVUyAgIE5TdGF0dXM7CisJVUxPTkcgICAgICAgICBGcmFtZUxlbiA9IDA7CisJUFVDSEFSICAgICAgICBwT3V0QnVmZmVyID0gTlVMTDsKKwlQVUNIQVIgICAgICAgIHBTdXBSYXRlID0gTlVMTDsKKwlVQ0hBUiAgICAgICAgIFN1cFJhdGVMZW47CisJUFVDSEFSICAgICAgICBwRXh0UmF0ZSA9IE5VTEw7CisJVUNIQVIgICAgICAgICBFeHRSYXRlTGVuOworCVVDSEFSICAgICAgICAgQVN1cFJhdGVbXSA9IHsweDhDLCAweDEyLCAweDk4LCAweDI0LCAweGIwLCAweDQ4LCAweDYwLCAweDZDfTsKKwlVQ0hBUiAgICAgICAgIEFTdXBSYXRlTGVuID0gc2l6ZW9mKEFTdXBSYXRlKS9zaXplb2YoVUNIQVIpOworCU1MTUVfSk9JTl9SRVFfU1RSVUNUICpwSW5mbyA9IChNTE1FX0pPSU5fUkVRX1NUUlVDVCAqKShFbGVtLT5Nc2cpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU1lOQyAtIE1sbWVKb2luUmVxQWN0aW9uKEJTUyAjJWxkKVxuIiwgcEluZm8tPkJzc0lkeCkpOworCisKKwkvLyByZXNldCBhbGwgdGhlIHRpbWVycworCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LlNjYW5UaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKKwlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5CZWFjb25UaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKKworCXBCc3MgPSAmcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzRW50cnlbcEluZm8tPkJzc0lkeF07CisKKwkvLyByZWNvcmQgdGhlIGRlc2lyZWQgU1NJRCAmIEJTU0lEIHdlJ3JlIHdhaXRpbmcgZm9yCisJQ09QWV9NQUNfQUREUihwQWQtPk1sbWVBdXguQnNzaWQsIHBCc3MtPkJzc2lkKTsKKworCS8vIElmIEFQJ3MgU1NJRCBpcyBub3QgaGlkZGVuLCBpdCBpcyBPSyBmb3IgdXBkYXRpbmcgc3NpZCB0byBNbG1lQXV4IGFnYWluLgorCWlmIChwQnNzLT5IaWRkZW4gPT0gMCkKKwl7CisJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+TWxtZUF1eC5Tc2lkLCBwQnNzLT5Tc2lkLCBwQnNzLT5Tc2lkTGVuKTsKKwkJcEFkLT5NbG1lQXV4LlNzaWRMZW4gPSBwQnNzLT5Tc2lkTGVuOworCX0KKworCXBBZC0+TWxtZUF1eC5Cc3NUeXBlID0gcEJzcy0+QnNzVHlwZTsKKwlwQWQtPk1sbWVBdXguQ2hhbm5lbCA9IHBCc3MtPkNoYW5uZWw7CisJcEFkLT5NbG1lQXV4LkNlbnRyYWxDaGFubmVsID0gcEJzcy0+Q2VudHJhbENoYW5uZWw7CisKKyNpZmRlZiBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUCisJLy8gQ291bnRyeSBJRSBvZiB0aGUgQVAgd2lsbCBiZSBldmFsdWF0ZWQgYW5kIHdpbGwgYmUgdXNlZC4KKwlpZiAoKHBBZC0+U3RhQ2ZnLklFRUU4MDIxMWRDbGllbnRNb2RlICE9IFJ0ODAyXzExX0RfTm9uZSkgJiYKKwkJKHBCc3MtPmJIYXNDb3VudHJ5SUUgPT0gVFJVRSkpCisJeworCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5Db21tb25DZmcuQ291bnRyeUNvZGVbMF0sICZwQnNzLT5Db3VudHJ5U3RyaW5nWzBdLCAyKTsKKwkJaWYgKHBCc3MtPkNvdW50cnlTdHJpbmdbMl0gPT0gJ0knKQorCQkJcEFkLT5Db21tb25DZmcuR2VvZ3JhcGh5ID0gSURPUjsKKwkJZWxzZSBpZiAocEJzcy0+Q291bnRyeVN0cmluZ1syXSA9PSAnTycpCisJCQlwQWQtPkNvbW1vbkNmZy5HZW9ncmFwaHkgPSBPRE9SOworCQllbHNlCisJCQlwQWQtPkNvbW1vbkNmZy5HZW9ncmFwaHkgPSBCT1RIOworCQlCdWlsZENoYW5uZWxMaXN0RXgocEFkKTsKKwl9CisjZW5kaWYgLy8gRVhUX0JVSUxEX0NIQU5ORUxfTElTVCAvLworCisJLy8gTGV0IEJCUCByZWdpc3RlciBhdCAyME1IeiB0byBkbyBzY2FuCisJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCAmQkJQVmFsdWUpOworCUJCUFZhbHVlICY9ICh+MHgxOCk7CisJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgQkJQVmFsdWUpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNZTkMgLSBCQlAgUjQgdG8gMjBNSHoubFxuIikpOworCisJLy8gc3dpdGNoIGNoYW5uZWwgYW5kIHdhaXRpbmcgZm9yIGJlYWNvbiB0aW1lcgorCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgcEFkLT5NbG1lQXV4LkNoYW5uZWwsIEZBTFNFKTsKKwlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPk1sbWVBdXguQ2hhbm5lbCk7CisJUlRNUFNldFRpbWVyKCZwQWQtPk1sbWVBdXguQmVhY29uVGltZXIsIEpPSU5fVElNRU9VVCk7CisKKyAgICBkbworCXsKKwkJaWYgKCgocEFkLT5Db21tb25DZmcuYklFRUU4MDIxMUggPT0gMSkgJiYKKyAgICAgICAgICAgIChwQWQtPk1sbWVBdXguQ2hhbm5lbCA+IDE0KSAmJgorICAgICAgICAgICAgIFJhZGFyQ2hhbm5lbENoZWNrKHBBZCwgcEFkLT5NbG1lQXV4LkNoYW5uZWwpKQorI2lmZGVmIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQgLy8gUm9nZXIgc3luYyBDYXJyaWVyCisgICAgICAgICAgICAgfHwgKHBBZC0+Q29tbW9uQ2ZnLkNhcnJpZXJEZXRlY3QuRW5hYmxlID09IFRSVUUpCisjZW5kaWYgLy8gQ0FSUklFUl9ERVRFQ1RJT05fU1VQUE9SVCAvLworICAgICAgICAgICAgKQorCQl7CisJCQkvLworCQkJLy8gV2UgY2FuJ3Qgc2VuZCBhbnkgUHJvYmUgcmVxdWVzdCBmcmFtZSB0byBtZWV0IDgwMi4xMWguCisJCQkvLworCQkJaWYgKHBCc3MtPkhpZGRlbiA9PSAwKQorCQkJCWJyZWFrOworCQl9CisKKwkJLy8KKwkJLy8gc2VuZCBwcm9iZSByZXF1ZXN0CisJCS8vCisJCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcik7CisJCWlmIChOU3RhdHVzID09IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJCXsKKwkJCWlmIChwQWQtPk1sbWVBdXguQ2hhbm5lbCA8PSAxNCkKKwkJCXsKKwkJCQlwU3VwUmF0ZSA9IHBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGU7CisJCQkJU3VwUmF0ZUxlbiA9IHBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVMZW47CisJCQkJcEV4dFJhdGUgPSBwQWQtPkNvbW1vbkNmZy5FeHRSYXRlOworCQkJCUV4dFJhdGVMZW4gPSBwQWQtPkNvbW1vbkNmZy5FeHRSYXRlTGVuOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCS8vCisJCQkJLy8gT3ZlcndyaXRlIFN1cHBvcnQgUmF0ZSwgQ0NLIHJhdGUgYXJlIG5vdCBhbGxvd2VkCisJCQkJLy8KKwkJCQlwU3VwUmF0ZSA9IEFTdXBSYXRlOworCQkJCVN1cFJhdGVMZW4gPSBBU3VwUmF0ZUxlbjsKKwkJCQlFeHRSYXRlTGVuID0gMDsKKwkJCX0KKworCQkJaWYgKHBBZC0+TWxtZUF1eC5Cc3NUeXBlID09IEJTU19JTkZSQSkKKwkJCQlNZ3RNYWNIZWFkZXJJbml0KHBBZCwgJkhkcjgwMjExLCBTVUJUWVBFX1BST0JFX1JFUSwgMCwgcEFkLT5NbG1lQXV4LkJzc2lkLCBwQWQtPk1sbWVBdXguQnNzaWQpOworCQkJZWxzZQorCQkJCU1ndE1hY0hlYWRlckluaXQocEFkLCAmSGRyODAyMTEsIFNVQlRZUEVfUFJPQkVfUkVRLCAwLCBCUk9BRENBU1RfQUREUiwgQlJPQURDQVNUX0FERFIpOworCisJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAgICAgICAgICAgICAgICZGcmFtZUxlbiwKKwkJCQkJCQkgIHNpemVvZihIRUFERVJfODAyXzExKSwgICAgJkhkcjgwMjExLAorCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAmU3NpZEllLAorCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAmcEFkLT5NbG1lQXV4LlNzaWRMZW4sCisJCQkJCQkJICBwQWQtPk1sbWVBdXguU3NpZExlbiwJICAgIHBBZC0+TWxtZUF1eC5Tc2lkLAorCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAmU3VwUmF0ZUllLAorCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAmU3VwUmF0ZUxlbiwKKwkJCQkJCQkgIFN1cFJhdGVMZW4sICAgICAgICAgICAgICAgcFN1cFJhdGUsCisJCQkJCQkJICBFTkRfT0ZfQVJHUyk7CisKKwkJCWlmIChFeHRSYXRlTGVuKQorCQkJeworCQkJCVVMT05HIFRtcDsKKwkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sICAgICAgICAgICAgJlRtcCwKKwkJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkV4dFJhdGVJZSwKKwkJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkV4dFJhdGVMZW4sCisJCQkJCQkJCSAgRXh0UmF0ZUxlbiwgICAgICAgICAgICAgICAgICAgICAgIHBFeHRSYXRlLAorCQkJCQkJCQkgIEVORF9PRl9BUkdTKTsKKwkJCQlGcmFtZUxlbiArPSBUbXA7CisJCQl9CisKKworCQkJTWluaXBvcnRNTVJlcXVlc3QocEFkLCAwLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7CisJCQlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOworCQl9CisgICAgfSB3aGlsZSAoRkFMU0UpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU1lOQyAtIFN3aXRjaCB0byBjaCAlZCwgV2FpdCBCRUFDT04gZnJvbSAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKwkJcEJzcy0+Q2hhbm5lbCwgcEJzcy0+QnNzaWRbMF0sIHBCc3MtPkJzc2lkWzFdLCBwQnNzLT5Cc3NpZFsyXSwgcEJzcy0+QnNzaWRbM10sIHBCc3MtPkJzc2lkWzRdLCBwQnNzLT5Cc3NpZFs1XSkpOworCisJcEFkLT5NbG1lLlN5bmNNYWNoaW5lLkN1cnJTdGF0ZSA9IEpPSU5fV0FJVF9CRUFDT047Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJTUxNRSBTVEFSVCBSZXF1ZXN0IHN0YXRlIG1hY2hpbmUgcHJvY2VkdXJlLCBzdGFydGluZyBhbiBJQlNTCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBNbG1lU3RhcnRSZXFBY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCVVDSEFSICAgICAgICAgU3NpZFtNQVhfTEVOX09GX1NTSURdLCBTc2lkTGVuOworCUJPT0xFQU4gICAgICAgVGltZXJDYW5jZWxsZWQ7CisKKwkvLyBOZXcgZm9yIFdQQSBzZWN1cml0eSBzdWl0ZXMKKwlVQ0hBUgkJCQkJCVZhcklFW01BWF9WSUVfTEVOXTsgCS8vIFRvdGFsIFZJRSBsZW5ndGggPSBNQVhfVklFX0xFTiAtIC01CisJTkRJU184MDJfMTFfVkFSSUFCTEVfSUVzCSpwVklFID0gTlVMTDsKKwlMQVJHRV9JTlRFR0VSCQkJCVRpbWVTdGFtcDsKKwlCT09MRUFOIFByaXZhY3k7CisJVVNIT1JUIFN0YXR1czsKKworCS8vIEluaXQgVmFyaWFibGUgSUUgc3RydWN0dXJlCisJcFZJRSA9IChQTkRJU184MDJfMTFfVkFSSUFCTEVfSUVzKSBWYXJJRTsKKwlwVklFLT5MZW5ndGggPSAwOworCVRpbWVTdGFtcC51Lkxvd1BhcnQgID0gMDsKKwlUaW1lU3RhbXAudS5IaWdoUGFydCA9IDA7CisKKwlpZiAoTWxtZVN0YXJ0UmVxU2FuaXR5KHBBZCwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4sIFNzaWQsICZTc2lkTGVuKSkKKwl7CisJCS8vIHJlc2V0IGFsbCB0aGUgdGltZXJzCisJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LlNjYW5UaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKKwkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguQmVhY29uVGltZXIsICZUaW1lckNhbmNlbGxlZCk7CisKKwkJLy8KKwkJLy8gU3RhcnQgYSBuZXcgSUJTUy4gQWxsIElCU1MgcGFyYW1ldGVycyBhcmUgZGVjaWRlZCBub3cuLi4uCisJCS8vCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1sbWVTdGFydFJlcUFjdGlvbiAtIFN0YXJ0IGEgbmV3IElCU1MuIEFsbCBJQlNTIHBhcmFtZXRlcnMgYXJlIGRlY2lkZWQgbm93Li4uLiBcbiIpKTsKKwkJcEFkLT5NbG1lQXV4LkJzc1R5cGUgICAgICAgICAgID0gQlNTX0FESE9DOworCQlOZGlzTW92ZU1lbW9yeShwQWQtPk1sbWVBdXguU3NpZCwgU3NpZCwgU3NpZExlbik7CisJCXBBZC0+TWxtZUF1eC5Tc2lkTGVuICAgICAgICAgICA9IFNzaWRMZW47CisKKwkJLy8gZ2VuZXJhdGUgYSByYWRvbSBudW1iZXIgYXMgQlNTSUQKKwkJTWFjQWRkclJhbmRvbUJzc2lkKHBBZCwgcEFkLT5NbG1lQXV4LkJzc2lkKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTWxtZVN0YXJ0UmVxQWN0aW9uIC0gZ2VuZXJhdGUgYSByYWRvbSBudW1iZXIgYXMgQlNTSUQgXG4iKSk7CisKKwkJUHJpdmFjeSA9IChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24xRW5hYmxlZCkgfHwKKwkJCQkgIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkgfHwKKwkJCQkgIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCk7CisJCXBBZC0+TWxtZUF1eC5DYXBhYmlsaXR5SW5mbyAgICA9IENBUF9HRU5FUkFURSgwLDEsUHJpdmFjeSwgKHBBZC0+Q29tbW9uQ2ZnLlR4UHJlYW1ibGUgPT0gUnQ4MDJfMTFQcmVhbWJsZVNob3J0KSwgMSwgMCk7CisJCXBBZC0+TWxtZUF1eC5CZWFjb25QZXJpb2QgICAgICA9IHBBZC0+Q29tbW9uQ2ZnLkJlYWNvblBlcmlvZDsKKwkJcEFkLT5NbG1lQXV4LkF0aW1XaW4gICAgICAgICAgID0gcEFkLT5TdGFDZmcuQXRpbVdpbjsKKwkJcEFkLT5NbG1lQXV4LkNoYW5uZWwgICAgICAgICAgID0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbDsKKworCQlwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCAgPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsOworCQlwQWQtPk1sbWVBdXguQ2VudHJhbENoYW5uZWwgICAgPSBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbDsKKworCQlwQWQtPk1sbWVBdXguU3VwUmF0ZUxlbj0gcEFkLT5Db21tb25DZmcuU3VwUmF0ZUxlbjsKKwkJTmRpc01vdmVNZW1vcnkocEFkLT5NbG1lQXV4LlN1cFJhdGUsIHBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGUsIE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTKTsKKwkJUlRNUENoZWNrUmF0ZXMocEFkLCBwQWQtPk1sbWVBdXguU3VwUmF0ZSwgJnBBZC0+TWxtZUF1eC5TdXBSYXRlTGVuKTsKKwkJcEFkLT5NbG1lQXV4LkV4dFJhdGVMZW4gPSBwQWQtPkNvbW1vbkNmZy5FeHRSYXRlTGVuOworCQlOZGlzTW92ZU1lbW9yeShwQWQtPk1sbWVBdXguRXh0UmF0ZSwgcEFkLT5Db21tb25DZmcuRXh0UmF0ZSwgTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVMpOworCQlSVE1QQ2hlY2tSYXRlcyhwQWQsIHBBZC0+TWxtZUF1eC5FeHRSYXRlLCAmcEFkLT5NbG1lQXV4LkV4dFJhdGVMZW4pOworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQlpZiAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEKQorCQl7CisJCQlSVE1QVXBkYXRlSFRJRSgmcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LCAmcEFkLT5TdGFDZmcuRGVzaXJlZEh0UGh5SW5mby5NQ1NTZXRbMF0sICZwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5LCAmcEFkLT5NbG1lQXV4LkFkZEh0SW5mbyk7CisJCQlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5TGVuID0gc2l6ZW9mKEhUX0NBUEFCSUxJVFlfSUUpOworCQkJLy8gTm90IHR1cm4gcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkSHRQaHkuYkh0RW5hYmxlID0gVFJVRSBoZXJlLgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU1lOQyAtcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkSHRQaHkuYkh0RW5hYmxlID0gVFJVRVxuIikpOworCQl9CisJCWVsc2UKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJeworCQkJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eUxlbiA9IDA7CisJCQlwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLmJIdEVuYWJsZSA9IEZBTFNFOworCQl9CisJCS8vIHRlbXBvcmFyaWx5IG5vdCBzdXBwb3J0IFFPUyBpbiBJQlNTCisJCU5kaXNaZXJvTWVtb3J5KCZwQWQtPk1sbWVBdXguQVBFZGNhUGFybSwgc2l6ZW9mKEVEQ0FfUEFSTSkpOworCQlOZGlzWmVyb01lbW9yeSgmcEFkLT5NbG1lQXV4LkFQUWJzc0xvYWQsIHNpemVvZihRQlNTX0xPQURfUEFSTSkpOworCQlOZGlzWmVyb01lbW9yeSgmcEFkLT5NbG1lQXV4LkFQUW9zQ2FwYWJpbGl0eSwgc2l6ZW9mKFFPU19DQVBBQklMSVRZX1BBUk0pKTsKKworCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBBZC0+TWxtZUF1eC5DaGFubmVsLCBGQUxTRSk7CisJCUFzaWNMb2NrQ2hhbm5lbChwQWQsIHBBZC0+TWxtZUF1eC5DaGFubmVsKTsKKworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTWU5DIC0gTWxtZVN0YXJ0UmVxQWN0aW9uKGNoPSAlZCxzdXAgcmF0ZXM9ICVkLCBleHQgcmF0ZXM9JWQpXG4iLAorCQkJcEFkLT5NbG1lQXV4LkNoYW5uZWwsIHBBZC0+TWxtZUF1eC5TdXBSYXRlTGVuLCBwQWQtPk1sbWVBdXguRXh0UmF0ZUxlbikpOworCisJCXBBZC0+TWxtZS5TeW5jTWFjaGluZS5DdXJyU3RhdGUgPSBTWU5DX0lETEU7CisJCVN0YXR1cyA9IE1MTUVfU1VDQ0VTUzsKKwkJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX1NUQVJUX0NPTkYsIDIsICZTdGF0dXMpOworCX0KKwllbHNlCisJeworCQlEQkdQUklOVF9FUlIoKCJTWU5DIC0gTWxtZVN0YXJ0UmVxQWN0aW9uKCkgc2FuaXR5IGNoZWNrIGZhaWwuXG4iKSk7CisJCXBBZC0+TWxtZS5TeW5jTWFjaGluZS5DdXJyU3RhdGUgPSBTWU5DX0lETEU7CisJCVN0YXR1cyA9IE1MTUVfSU5WQUxJRF9GT1JNQVQ7CisJCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9TVEFSVF9DT05GLCAyLCAmU3RhdHVzKTsKKwl9Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJcGVlciBzZW5kcyBiZWFjb24gYmFjayB3aGVuIHNjYW5uaW5nCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBQZWVyQmVhY29uQXRTY2FuQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlVQ0hBUiAgICAgICAgICAgQnNzaWRbTUFDX0FERFJfTEVOXSwgQWRkcjJbTUFDX0FERFJfTEVOXTsKKwlVQ0hBUiAgICAgICAgICAgU3NpZFtNQVhfTEVOX09GX1NTSURdLCBCc3NUeXBlLCBDaGFubmVsLCBOZXdDaGFubmVsLAorCQkJCQlTc2lkTGVuLCBEdGltQ291bnQsIER0aW1QZXJpb2QsIEJjYXN0RmxhZywgTWVzc2FnZVRvTWU7CisJQ0ZfUEFSTSAgICAgICAgIENmUGFybTsKKwlVU0hPUlQgICAgICAgICAgQmVhY29uUGVyaW9kLCBBdGltV2luLCBDYXBhYmlsaXR5SW5mbzsKKwlQRlJBTUVfODAyXzExICAgcEZyYW1lOworCUxBUkdFX0lOVEVHRVIgICBUaW1lU3RhbXA7CisJVUNIQVIgICAgICAgICAgIEVycDsKKwlVQ0hBUiAgICAgICAgIAlTdXBSYXRlW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXSwgRXh0UmF0ZVtNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFU107CisJVUNIQVIJCSAgCVN1cFJhdGVMZW4sIEV4dFJhdGVMZW47CisJVVNIT1JUIAkJCUxlblZJRTsKKwlVQ0hBUgkJCUNraXBGbGFnOworCVVDSEFSCQkJQWlyb25ldENlbGxQb3dlckxpbWl0OworCUVEQ0FfUEFSTSAgICAgICBFZGNhUGFybTsKKwlRQlNTX0xPQURfUEFSTSAgUWJzc0xvYWQ7CisJUU9TX0NBUEFCSUxJVFlfUEFSTSBRb3NDYXBhYmlsaXR5OworCVVMT05HCQkJCQkJUmFsaW5rSWU7CisJVUNIQVIJCQkJCQlWYXJJRVtNQVhfVklFX0xFTl07CQkvLyBUb3RhbCBWSUUgbGVuZ3RoID0gTUFYX1ZJRV9MRU4gLSAtNQorCU5ESVNfODAyXzExX1ZBUklBQkxFX0lFcwkqcFZJRSA9IE5VTEw7CisJSFRfQ0FQQUJJTElUWV9JRQkJSHRDYXBhYmlsaXR5OworCUFERF9IVF9JTkZPX0lFCQlBZGRIdEluZm87CS8vIEFQIG1pZ2h0IHVzZSB0aGlzIGFkZGl0aW9uYWwgaHQgaW5mbyBJRQorCVVDSEFSCQkJSHRDYXBhYmlsaXR5TGVuID0gMCwgUHJlTkh0Q2FwYWJpbGl0eUxlbiA9IDA7CisJVUNIQVIJCQlBZGRIdEluZm9MZW47CisJVUNIQVIJCQlOZXdFeHRDaGFubmVsT2Zmc2V0ID0gMHhmZjsKKworCisJLy8gTmRpc0ZpbGxNZW1vcnkoU3NpZCwgTUFYX0xFTl9PRl9TU0lELCAweDAwKTsKKwlwRnJhbWUgPSAoUEZSQU1FXzgwMl8xMSkgRWxlbS0+TXNnOworCS8vIEluaXQgVmFyaWFibGUgSUUgc3RydWN0dXJlCisJcFZJRSA9IChQTkRJU184MDJfMTFfVkFSSUFCTEVfSUVzKSBWYXJJRTsKKwlwVklFLT5MZW5ndGggPSAwOworI2lmZGVmIERPVDExX05fU1VQUE9SVAorICAgIFJUTVBaZXJvTWVtb3J5KCZIdENhcGFiaWxpdHksIHNpemVvZihIdENhcGFiaWxpdHkpKTsKKwlSVE1QWmVyb01lbW9yeSgmQWRkSHRJbmZvLCBzaXplb2YoQUREX0hUX0lORk9fSUUpKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCWlmIChQZWVyQmVhY29uQW5kUHJvYmVSc3BTYW5pdHkocEFkLAorCQkJCQkJCQlFbGVtLT5Nc2csCisJCQkJCQkJCUVsZW0tPk1zZ0xlbiwKKwkJCQkJCQkJRWxlbS0+Q2hhbm5lbCwKKwkJCQkJCQkJQWRkcjIsCisJCQkJCQkJCUJzc2lkLAorCQkJCQkJCQlTc2lkLAorCQkJCQkJCQkmU3NpZExlbiwKKwkJCQkJCQkJJkJzc1R5cGUsCisJCQkJCQkJCSZCZWFjb25QZXJpb2QsCisJCQkJCQkJCSZDaGFubmVsLAorCQkJCQkJCQkmTmV3Q2hhbm5lbCwKKwkJCQkJCQkJJlRpbWVTdGFtcCwKKwkJCQkJCQkJJkNmUGFybSwKKwkJCQkJCQkJJkF0aW1XaW4sCisJCQkJCQkJCSZDYXBhYmlsaXR5SW5mbywKKwkJCQkJCQkJJkVycCwKKwkJCQkJCQkJJkR0aW1Db3VudCwKKwkJCQkJCQkJJkR0aW1QZXJpb2QsCisJCQkJCQkJCSZCY2FzdEZsYWcsCisJCQkJCQkJCSZNZXNzYWdlVG9NZSwKKwkJCQkJCQkJU3VwUmF0ZSwKKwkJCQkJCQkJJlN1cFJhdGVMZW4sCisJCQkJCQkJCUV4dFJhdGUsCisJCQkJCQkJCSZFeHRSYXRlTGVuLAorCQkJCQkJCQkmQ2tpcEZsYWcsCisJCQkJCQkJCSZBaXJvbmV0Q2VsbFBvd2VyTGltaXQsCisJCQkJCQkJCSZFZGNhUGFybSwKKwkJCQkJCQkJJlFic3NMb2FkLAorCQkJCQkJCQkmUW9zQ2FwYWJpbGl0eSwKKwkJCQkJCQkJJlJhbGlua0llLAorCQkJCQkJCQkmSHRDYXBhYmlsaXR5TGVuLAorCQkJCQkJCQkmUHJlTkh0Q2FwYWJpbGl0eUxlbiwKKwkJCQkJCQkJJkh0Q2FwYWJpbGl0eSwKKwkJCQkJCQkJJkFkZEh0SW5mb0xlbiwKKwkJCQkJCQkJJkFkZEh0SW5mbywKKwkJCQkJCQkJJk5ld0V4dENoYW5uZWxPZmZzZXQsCisJCQkJCQkJCSZMZW5WSUUsCisJCQkJCQkJCXBWSUUpKQorCXsKKwkJVUxPTkcgSWR4OworCQlDSEFSIFJzc2kgPSAwOworCisJCUlkeCA9IEJzc1RhYmxlU2VhcmNoKCZwQWQtPlNjYW5UYWIsIEJzc2lkLCBDaGFubmVsKTsKKwkJaWYgKElkeCAhPSBCU1NfTk9UX0ZPVU5EKQorCQkJUnNzaSA9IHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtJZHhdLlJzc2k7CisKKwkJUnNzaSA9IFJUTVBNYXhSc3NpKHBBZCwgQ29udmVydFRvUnNzaShwQWQsIEVsZW0tPlJzc2kwLCBSU1NJXzApLCBDb252ZXJ0VG9Sc3NpKHBBZCwgRWxlbS0+UnNzaTEsIFJTU0lfMSksIENvbnZlcnRUb1Jzc2kocEFkLCBFbGVtLT5Sc3NpMiwgUlNTSV8yKSk7CisKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQlpZiAoKEh0Q2FwYWJpbGl0eUxlbiA+IDApIHx8IChQcmVOSHRDYXBhYmlsaXR5TGVuID4gMCkpCisJCQlIdENhcGFiaWxpdHlMZW4gPSBTSVpFX0hUX0NBUF9JRTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJaWYgKChwQWQtPlN0YUNmZy5DQ1hSZXFUeXBlICE9IE1TUk5fVFlQRV9VTlVTRUQpICYmIChDaGFubmVsID09IHBBZC0+U3RhQ2ZnLkNDWFNjYW5DaGFubmVsKSkKKwkJeworCQkJSWR4ID0gQnNzVGFibGVTZXRFbnRyeShwQWQsICZwQWQtPlN0YUNmZy5DQ1hCc3NUYWIsIEJzc2lkLCBTc2lkLCBTc2lkTGVuLCBCc3NUeXBlLCBCZWFjb25QZXJpb2QsCisJCQkJCQkgJkNmUGFybSwgQXRpbVdpbiwgQ2FwYWJpbGl0eUluZm8sIFN1cFJhdGUsIFN1cFJhdGVMZW4sRXh0UmF0ZSwgRXh0UmF0ZUxlbiwgJkh0Q2FwYWJpbGl0eSwKKwkJCQkJCSAmQWRkSHRJbmZvLCBIdENhcGFiaWxpdHlMZW4sIEFkZEh0SW5mb0xlbiwgTmV3RXh0Q2hhbm5lbE9mZnNldCwgQ2hhbm5lbCwgUnNzaSwgVGltZVN0YW1wLCBDa2lwRmxhZywKKwkJCQkJCSAmRWRjYVBhcm0sICZRb3NDYXBhYmlsaXR5LCAmUWJzc0xvYWQsIExlblZJRSwgcFZJRSk7CisJCQlpZiAoSWR4ICE9IEJTU19OT1RfRk9VTkQpCisJCQl7CisJCQkJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuQ0NYQnNzVGFiLkJzc0VudHJ5W0lkeF0uUFRTRiwgJkVsZW0tPk1zZ1syNF0sIDQpOworCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPlN0YUNmZy5DQ1hCc3NUYWIuQnNzRW50cnlbSWR4XS5UVFNGWzBdLCAmRWxlbS0+VGltZVN0YW1wLnUuTG93UGFydCwgNCk7CisJCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+U3RhQ2ZnLkNDWEJzc1RhYi5Cc3NFbnRyeVtJZHhdLlRUU0ZbNF0sICZFbGVtLT5UaW1lU3RhbXAudS5Mb3dQYXJ0LCA0KTsKKwkJCQlpZiAocEFkLT5TdGFDZmcuQ0NYUmVxVHlwZSA9PSBNU1JOX1RZUEVfQkVBQ09OX1JFUSkKKwkJCQkJQWlyb25ldEFkZEJlYWNvblJlcG9ydChwQWQsIElkeCwgRWxlbSk7CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQlJZHggPSBCc3NUYWJsZVNldEVudHJ5KHBBZCwgJnBBZC0+U2NhblRhYiwgQnNzaWQsIFNzaWQsIFNzaWRMZW4sIEJzc1R5cGUsIEJlYWNvblBlcmlvZCwKKwkJCQkJCSAgJkNmUGFybSwgQXRpbVdpbiwgQ2FwYWJpbGl0eUluZm8sIFN1cFJhdGUsIFN1cFJhdGVMZW4sIEV4dFJhdGUsIEV4dFJhdGVMZW4sICAmSHRDYXBhYmlsaXR5LAorCQkJCQkJICZBZGRIdEluZm8sIEh0Q2FwYWJpbGl0eUxlbiwgQWRkSHRJbmZvTGVuLCBOZXdFeHRDaGFubmVsT2Zmc2V0LCBDaGFubmVsLCBSc3NpLCBUaW1lU3RhbXAsIENraXBGbGFnLAorCQkJCQkJICZFZGNhUGFybSwgJlFvc0NhcGFiaWxpdHksICZRYnNzTG9hZCwgTGVuVklFLCBwVklFKTsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKyNpZmRlZiBET1QxMU5fRFJBRlQzCisJCQlpZiAocEFkLT5DaGFubmVsTGlzdFtwQWQtPkNvbW1vbkNmZy5DaGFubmVsTGlzdElkeF0uYkVmZmVjdGVkQ2hhbm5lbCA9PSBUUlVFKQorCQkJeworCQkJCVVDSEFSCQlSZWdDbGFzczsKKwkJCQlQZWVyQmVhY29uQW5kUHJvYmVSc3BTYW5pdHkyKHBBZCwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4sICZSZWdDbGFzcyk7CisJCQkJVHJpRXZlbnRUYWJsZVNldEVudHJ5KHBBZCwgJnBBZC0+Q29tbW9uQ2ZnLlRyaWdnZXJFdmVudFRhYiwgQnNzaWQsICZIdENhcGFiaWxpdHksIEh0Q2FwYWJpbGl0eUxlbiwgUmVnQ2xhc3MsIENoYW5uZWwpOworCQkJfQorI2VuZGlmIC8vIERPVDExTl9EUkFGVDMgLy8KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJCWlmIChJZHggIT0gQlNTX05PVF9GT1VORCkKKwkJCXsKKwkJCQlOZGlzTW92ZU1lbW9yeShwQWQtPlNjYW5UYWIuQnNzRW50cnlbSWR4XS5QVFNGLCAmRWxlbS0+TXNnWzI0XSwgNCk7CisJCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+U2NhblRhYi5Cc3NFbnRyeVtJZHhdLlRUU0ZbMF0sICZFbGVtLT5UaW1lU3RhbXAudS5Mb3dQYXJ0LCA0KTsKKwkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0lkeF0uVFRTRls0XSwgJkVsZW0tPlRpbWVTdGFtcC51Lkxvd1BhcnQsIDQpOworCQkJfQorCQl9CisJfQorCS8vIHNhbml0eSBjaGVjayBmYWlsLCBpZ25vcmVkCit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJV2hlbiB3YWl0aW5nIGpvaW5pbmcgdGhlIChJKUJTUywgYmVhY29uIHJlY2VpdmVkIGZyb20gZXh0ZXJuYWwKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIFBlZXJCZWFjb25BdEpvaW5BY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCVVDSEFSICAgICAgICAgQnNzaWRbTUFDX0FERFJfTEVOXSwgQWRkcjJbTUFDX0FERFJfTEVOXTsKKwlVQ0hBUiAgICAgICAgIFNzaWRbTUFYX0xFTl9PRl9TU0lEXSwgU3NpZExlbiwgQnNzVHlwZSwgQ2hhbm5lbCwgTWVzc2FnZVRvTWUsCisJCQkJICBEdGltQ291bnQsIER0aW1QZXJpb2QsIEJjYXN0RmxhZywgTmV3Q2hhbm5lbDsKKwlMQVJHRV9JTlRFR0VSIFRpbWVTdGFtcDsKKwlVU0hPUlQgICAgICAgIEJlYWNvblBlcmlvZCwgQXRpbVdpbiwgQ2FwYWJpbGl0eUluZm87CisJQ0ZfUEFSTSAgICAgICBDZjsKKwlCT09MRUFOICAgICAgIFRpbWVyQ2FuY2VsbGVkOworCVVDSEFSICAgICAgICAgRXJwOworCVVDSEFSICAgICAgICAgU3VwUmF0ZVtNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFU10sIEV4dFJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdOworCVVDSEFSCQkgIFN1cFJhdGVMZW4sIEV4dFJhdGVMZW47CisJVUNIQVIgICAgICAgICBDa2lwRmxhZzsKKwlVU0hPUlQgCQkgIExlblZJRTsKKwlVQ0hBUgkJICBBaXJvbmV0Q2VsbFBvd2VyTGltaXQ7CisJRURDQV9QQVJNICAgICAgIEVkY2FQYXJtOworCVFCU1NfTE9BRF9QQVJNICBRYnNzTG9hZDsKKwlRT1NfQ0FQQUJJTElUWV9QQVJNIFFvc0NhcGFiaWxpdHk7CisJVVNIT1JUICAgICAgICBTdGF0dXM7CisJVUNIQVIJCQkJCQlWYXJJRVtNQVhfVklFX0xFTl07CQkvLyBUb3RhbCBWSUUgbGVuZ3RoID0gTUFYX1ZJRV9MRU4gLSAtNQorCU5ESVNfODAyXzExX1ZBUklBQkxFX0lFcwkqcFZJRSA9IE5VTEw7CisJVUxPTkcgICAgICAgICAgIFJhbGlua0llOworCVVMT05HICAgICAgICAgSWR4OworCUhUX0NBUEFCSUxJVFlfSUUJCUh0Q2FwYWJpbGl0eTsKKwlBRERfSFRfSU5GT19JRQkJQWRkSHRJbmZvOwkvLyBBUCBtaWdodCB1c2UgdGhpcyBhZGRpdGlvbmFsIGh0IGluZm8gSUUKKwlVQ0hBUgkJCQlIdENhcGFiaWxpdHlMZW4gPSAwLCBQcmVOSHRDYXBhYmlsaXR5TGVuID0gMDsKKwlVQ0hBUgkJCUFkZEh0SW5mb0xlbjsKKwlVQ0hBUgkJCU5ld0V4dENoYW5uZWxPZmZzZXQgPSAweGZmOworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCVVDSEFSCQkJQ2VudHJhbENoYW5uZWw7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwkvLyBJbml0IFZhcmlhYmxlIElFIHN0cnVjdHVyZQorCXBWSUUgPSAoUE5ESVNfODAyXzExX1ZBUklBQkxFX0lFcykgVmFySUU7CisJcFZJRS0+TGVuZ3RoID0gMDsKKyAgICBSVE1QWmVyb01lbW9yeSgmSHRDYXBhYmlsaXR5LCBzaXplb2YoSHRDYXBhYmlsaXR5KSk7CisJUlRNUFplcm9NZW1vcnkoJkFkZEh0SW5mbywgc2l6ZW9mKEFERF9IVF9JTkZPX0lFKSk7CisKKworCWlmIChQZWVyQmVhY29uQW5kUHJvYmVSc3BTYW5pdHkocEFkLAorCQkJCQkJCQlFbGVtLT5Nc2csCisJCQkJCQkJCUVsZW0tPk1zZ0xlbiwKKwkJCQkJCQkJRWxlbS0+Q2hhbm5lbCwKKwkJCQkJCQkJQWRkcjIsCisJCQkJCQkJCUJzc2lkLAorCQkJCQkJCQlTc2lkLAorCQkJCQkJCQkmU3NpZExlbiwKKwkJCQkJCQkJJkJzc1R5cGUsCisJCQkJCQkJCSZCZWFjb25QZXJpb2QsCisJCQkJCQkJCSZDaGFubmVsLAorCQkJCQkJCQkmTmV3Q2hhbm5lbCwKKwkJCQkJCQkJJlRpbWVTdGFtcCwKKwkJCQkJCQkJJkNmLAorCQkJCQkJCQkmQXRpbVdpbiwKKwkJCQkJCQkJJkNhcGFiaWxpdHlJbmZvLAorCQkJCQkJCQkmRXJwLAorCQkJCQkJCQkmRHRpbUNvdW50LAorCQkJCQkJCQkmRHRpbVBlcmlvZCwKKwkJCQkJCQkJJkJjYXN0RmxhZywKKwkJCQkJCQkJJk1lc3NhZ2VUb01lLAorCQkJCQkJCQlTdXBSYXRlLAorCQkJCQkJCQkmU3VwUmF0ZUxlbiwKKwkJCQkJCQkJRXh0UmF0ZSwKKwkJCQkJCQkJJkV4dFJhdGVMZW4sCisJCQkJCQkJCSZDa2lwRmxhZywKKwkJCQkJCQkJJkFpcm9uZXRDZWxsUG93ZXJMaW1pdCwKKwkJCQkJCQkJJkVkY2FQYXJtLAorCQkJCQkJCQkmUWJzc0xvYWQsCisJCQkJCQkJCSZRb3NDYXBhYmlsaXR5LAorCQkJCQkJCQkmUmFsaW5rSWUsCisJCQkJCQkJCSZIdENhcGFiaWxpdHlMZW4sCisJCQkJCQkJCSZQcmVOSHRDYXBhYmlsaXR5TGVuLAorCQkJCQkJCQkmSHRDYXBhYmlsaXR5LAorCQkJCQkJCQkmQWRkSHRJbmZvTGVuLAorCQkJCQkJCQkmQWRkSHRJbmZvLAorCQkJCQkJCQkmTmV3RXh0Q2hhbm5lbE9mZnNldCwKKwkJCQkJCQkJJkxlblZJRSwKKwkJCQkJCQkJcFZJRSkpCisJeworCQkvLyBEaXNxdWFsaWZ5IDExYiBvbmx5IGFkaG9jIHdoZW4gd2UgYXJlIGluIDExZyBvbmx5IGFkaG9jIG1vZGUKKwkJaWYgKChCc3NUeXBlID09IEJTU19BREhPQykgJiYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExRykgJiYgKChTdXBSYXRlTGVuK0V4dFJhdGVMZW4pPCAxMikpCisJCQlyZXR1cm47CisKKwkJLy8gQkVBQ09OIGZyb20gZGVzaXJlZCBCU1MvSUJTUyBmb3VuZC4gV2Ugc2hvdWxkIGJlIGFibGUgdG8gZGVjaWRlIG1vc3QKKwkJLy8gQlNTIHBhcmFtZXRlcnMgaGVyZS4KKwkJLy8gUS4gQnV0IHdoYXQgaGFwcGVuIGlmIHRoaXMgSk9JTiBkb2Vzbid0IGNvbmNsdWRlIGEgc3VjY2Vzc2Z1bCBBU1NPQ0lBVEVJT04/CisJCS8vICAgIERvIHdlIG5lZWQgdG8gcmVjZW92ZXIgYmFjayBhbGwgcGFyYW1ldGVycyBiZWxvbmdpbmcgdG8gcHJldmlvdXMgQlNTPworCQkvLyBBLiBTaG91bGQgYmUgbm90LiBUaGVyZSdzIG5vIGJhY2stZG9vciByZWNvdmVyIHRvIHByZXZpb3VzIEFQLiBJdCBzdGlsbCBuZWVkCisJCS8vICAgIGEgbmV3IEpPSU4tQVVUSC1BU1NPQyBzZXF1ZW5jZS4KKwkJaWYgKE1BQ19BRERSX0VRVUFMKHBBZC0+TWxtZUF1eC5Cc3NpZCwgQnNzaWQpKQorCQl7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTWU5DIC0gcmVjZWl2ZSBkZXNpcmVkIEJFQUNPTiBhdCBKb2luV2FpdEJlYWNvbi4uLiBDaGFubmVsID0gJWRcbiIsIENoYW5uZWwpKTsKKwkJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LkJlYWNvblRpbWVyLCAmVGltZXJDYW5jZWxsZWQpOworCisJCQkvLyBVcGRhdGUgUlNTSSB0byBwcmV2ZW50IE5vIHNpZ25hbCBkaXNwbGF5IHdoZW4gY2FyZHMgZmlyc3QgaW5pdGlhbGl6ZWQKKwkJCXBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kwCT0gQ29udmVydFRvUnNzaShwQWQsIEVsZW0tPlJzc2kwLCBSU1NJXzApOworCQkJcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTEJPSBDb252ZXJ0VG9Sc3NpKHBBZCwgRWxlbS0+UnNzaTEsIFJTU0lfMSk7CisJCQlwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMgk9IENvbnZlcnRUb1Jzc2kocEFkLCBFbGVtLT5Sc3NpMiwgUlNTSV8yKTsKKwkJCXBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTAJPSBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMDsKKwkJCXBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTBYOAk9IHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTAgPDwgMzsKKwkJCXBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTEJPSBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMTsKKwkJCXBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTFYOAk9IHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTEgPDwgMzsKKwkJCXBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTIJPSBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMjsKKwkJCXBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTJYOAk9IHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTIgPDwgMzsKKworCQkJLy8KKwkJCS8vIFdlIG5lZWQgdG8gY2hlY2sgaWYgU1NJRCBvbmx5IHNldCB0byBhbnksIHRoZW4gd2UgY2FuIHJlY29yZCB0aGUgY3VycmVudCBTU0lELgorCQkJLy8gT3RoZXJ3aXNlIHdpbGwgY2F1c2UgaGlkZGVuIFNTSUQgYXNzb2NpYXRpb24gZmFpbGVkLgorCQkJLy8KKwkJCWlmIChwQWQtPk1sbWVBdXguU3NpZExlbiA9PSAwKQorCQkJeworCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+TWxtZUF1eC5Tc2lkLCBTc2lkLCBTc2lkTGVuKTsKKwkJCQlwQWQtPk1sbWVBdXguU3NpZExlbiA9IFNzaWRMZW47CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJSWR4ID0gQnNzU3NpZFRhYmxlU2VhcmNoKCZwQWQtPlNjYW5UYWIsIEJzc2lkLCBwQWQtPk1sbWVBdXguU3NpZCwgcEFkLT5NbG1lQXV4LlNzaWRMZW4sIENoYW5uZWwpOworCisJCQkJaWYgKElkeCAhPSBCU1NfTk9UX0ZPVU5EKQorCQkJCXsKKwkJCQkJLy8KKwkJCQkJLy8gTXVsdGlwbGUgU1NJRCBjYXNlLCB1c2VkIGNvcnJlY3QgQ2FwYWJpbGl0eUluZm8KKwkJCQkJLy8KKwkJCQkJQ2FwYWJpbGl0eUluZm8gPSBwQWQtPlNjYW5UYWIuQnNzRW50cnlbSWR4XS5DYXBhYmlsaXR5SW5mbzsKKwkJCQl9CisJCQl9CisJCQlOZGlzTW92ZU1lbW9yeShwQWQtPk1sbWVBdXguQnNzaWQsIEJzc2lkLCBNQUNfQUREUl9MRU4pOworCQkJcEFkLT5NbG1lQXV4LkNhcGFiaWxpdHlJbmZvID0gQ2FwYWJpbGl0eUluZm8gJiBTVVBQT1JURURfQ0FQQUJJTElUWV9JTkZPOworCQkJcEFkLT5NbG1lQXV4LkJzc1R5cGUgPSBCc3NUeXBlOworCQkJcEFkLT5NbG1lQXV4LkJlYWNvblBlcmlvZCA9IEJlYWNvblBlcmlvZDsKKwkJCXBBZC0+TWxtZUF1eC5DaGFubmVsID0gQ2hhbm5lbDsKKwkJCXBBZC0+TWxtZUF1eC5BdGltV2luID0gQXRpbVdpbjsKKwkJCXBBZC0+TWxtZUF1eC5DZnBQZXJpb2QgPSBDZi5DZnBQZXJpb2Q7CisJCQlwQWQtPk1sbWVBdXguQ2ZwTWF4RHVyYXRpb24gPSBDZi5DZnBNYXhEdXJhdGlvbjsKKwkJCXBBZC0+TWxtZUF1eC5BUFJhbGlua0llID0gUmFsaW5rSWU7CisKKwkJCS8vIENvcHkgQVAncyBzdXBwb3J0ZWQgcmF0ZSB0byBNbG1lQXV4IGZvciBjcmVhdGluZyBhc3NvaWNhdGlvbiByZXF1ZXN0CisJCQkvLyBBbHNvIGZpbHRlciBvdXQgbm90IHN1cHBvcnRlZCByYXRlCisJCQlwQWQtPk1sbWVBdXguU3VwUmF0ZUxlbiA9IFN1cFJhdGVMZW47CisJCQlOZGlzTW92ZU1lbW9yeShwQWQtPk1sbWVBdXguU3VwUmF0ZSwgU3VwUmF0ZSwgU3VwUmF0ZUxlbik7CisJCQlSVE1QQ2hlY2tSYXRlcyhwQWQsIHBBZC0+TWxtZUF1eC5TdXBSYXRlLCAmcEFkLT5NbG1lQXV4LlN1cFJhdGVMZW4pOworCQkJcEFkLT5NbG1lQXV4LkV4dFJhdGVMZW4gPSBFeHRSYXRlTGVuOworCQkJTmRpc01vdmVNZW1vcnkocEFkLT5NbG1lQXV4LkV4dFJhdGUsIEV4dFJhdGUsIEV4dFJhdGVMZW4pOworCQkJUlRNUENoZWNrUmF0ZXMocEFkLCBwQWQtPk1sbWVBdXguRXh0UmF0ZSwgJnBBZC0+TWxtZUF1eC5FeHRSYXRlTGVuKTsKKworICAgICAgICAgICAgTmRpc1plcm9NZW1vcnkocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5NQ1NTZXQsIDE2KTsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCXBBZC0+TWxtZUF1eC5OZXdFeHRDaGFubmVsT2Zmc2V0ID0gTmV3RXh0Q2hhbm5lbE9mZnNldDsKKwkJCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHlMZW4gPSBIdENhcGFiaWxpdHlMZW47CisKKwkJCS8vIGZpbHRlciBvdXQgdW4tc3VwcG9ydGVkIGh0IHJhdGVzCisJCQlpZiAoKChIdENhcGFiaWxpdHlMZW4gPiAwKSB8fCAoUHJlTkh0Q2FwYWJpbGl0eUxlbiA+IDApKSAmJiAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEKSkKKwkJCXsKKwkJCQlSVE1QWmVyb01lbW9yeSgmcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eSwgU0laRV9IVF9DQVBfSUUpOworICAgCQkJCVJUTVBNb3ZlTWVtb3J5KCZwQWQtPk1sbWVBdXguQWRkSHRJbmZvLCAmQWRkSHRJbmZvLCBTSVpFX0FERF9IVF9JTkZPX0lFKTsKKworCQkJCS8vIFN0YUFjdGl2ZS5TdXBwb3J0ZWRIdFBoeS5NQ1NTZXQgc3RvcmVzIFBlZXIgQVAncyAxMW4gUnggY2FwYWJpbGl0eQorCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uTUNTU2V0LCBIdENhcGFiaWxpdHkuTUNTU2V0LCAxNik7CisJCQkJcEFkLT5NbG1lQXV4Lk5ld0V4dENoYW5uZWxPZmZzZXQgPSBOZXdFeHRDaGFubmVsT2Zmc2V0OworCQkJCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHlMZW4gPSBTSVpFX0hUX0NBUF9JRTsKKwkJCQlwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLmJIdEVuYWJsZSA9IFRSVUU7CisJCQkJaWYgKFByZU5IdENhcGFiaWxpdHlMZW4gPiAwKQorCQkJCQlwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLmJQcmVOSHQgPSBUUlVFOworCQkJCVJUTVBDaGVja0h0KHBBZCwgQlNTSURfV0NJRCwgJkh0Q2FwYWJpbGl0eSwgJkFkZEh0SW5mbyk7CisJCQkJLy8gQ29weSBBUCBQYXJhbWV0ZXIgdG8gU3RhQWN0aXZlLiAgVGhpcyBpcyBhbHNvIGluIExpbmtVcC4KKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyQmVhY29uQXRKb2luQWN0aW9uISAoTXBkdURlbnNpdHk9JWQsIE1heFJBbXBkdUZhY3Rvcj0lZCwgQlc9JWQpXG4iLAorCQkJCQlwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRIdFBoeS5NcGR1RGVuc2l0eSwgcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkSHRQaHkuTWF4UkFtcGR1RmFjdG9yLCBIdENhcGFiaWxpdHkuSHRDYXBJbmZvLkNoYW5uZWxXaWR0aCkpOworCisJCQkJaWYgKEFkZEh0SW5mb0xlbiA+IDApCisJCQkJeworCQkJCQlDZW50cmFsQ2hhbm5lbCA9IEFkZEh0SW5mby5Db250cm9sQ2hhbjsKKwkJIAkJCS8vIENoZWNrIGFnYWluIHRoZSBCYW5kd2lkdGggY2FwYWJpbGl0eSBvZiB0aGlzIEFQLgorCQkgCQkJaWYgKChBZGRIdEluZm8uQ29udHJvbENoYW4gPiAyKSYmIChBZGRIdEluZm8uQWRkSHRJbmZvLkV4dENoYW5PZmZzZXQgPT0gRVhUQ0hBX0JFTE9XKSAmJiAoSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5DaGFubmVsV2lkdGggPT0gQldfNDApKQorCQkgCQkJeworCQkgCQkJCUNlbnRyYWxDaGFubmVsID0gQWRkSHRJbmZvLkNvbnRyb2xDaGFuIC0gMjsKKwkJIAkJCX0KKwkJIAkJCWVsc2UgaWYgKChBZGRIdEluZm8uQWRkSHRJbmZvLkV4dENoYW5PZmZzZXQgPT0gRVhUQ0hBX0FCT1ZFKSAmJiAoSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5DaGFubmVsV2lkdGggPT0gQldfNDApKQorCQkgCQkJeworCQkgCQkJCUNlbnRyYWxDaGFubmVsID0gQWRkSHRJbmZvLkNvbnRyb2xDaGFuICsgMjsKKwkJIAkJCX0KKworCQkJCQkvLyBDaGVjayBFcnJvciAuCisJCQkJCWlmIChwQWQtPk1sbWVBdXguQ2VudHJhbENoYW5uZWwgIT0gQ2VudHJhbENoYW5uZWwpCisJCSAJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiUGVlckJlYWNvbkF0Sm9pbkFjdGlvbiBIVD09PT5CZWFjb24gQ2VudHJhbCBDaGFubmVsID0gJWQsIENvbnRyb2wgQ2hhbm5lbCA9ICVkLiBNbG1lYXV4IENlbnRyYWxDaGFubmVsID0gJWRcbiIsIENlbnRyYWxDaGFubmVsLCBBZGRIdEluZm8uQ29udHJvbENoYW4sIHBBZC0+TWxtZUF1eC5DZW50cmFsQ2hhbm5lbCkpOworCisJCSAJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyQmVhY29uQXRKb2luQWN0aW9uIEhUPT09PkNlbnRyYWwgQ2hhbm5lbCA9ICVkLCBDb250cm9sIENoYW5uZWwgPSAlZCwgIC5cbiIsIENlbnRyYWxDaGFubmVsLCBBZGRIdEluZm8uQ29udHJvbENoYW4pKTsKKworCQkJCX0KKworCQkJfQorCQkJZWxzZQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQkJeworICAgCQkJCS8vIFRvIHByZXZlbnQgZXJyb3IsIGxldCBsZWdhY3kgQVAgbXVzdCBoYXZlIHNhbWUgQ2VudHJhbENoYW5uZWwgYW5kIENoYW5uZWwuCisJCQkJaWYgKChIdENhcGFiaWxpdHlMZW4gPT0gMCkgJiYgKFByZU5IdENhcGFiaWxpdHlMZW4gPT0gMCkpCisJCQkJCXBBZC0+TWxtZUF1eC5DZW50cmFsQ2hhbm5lbCA9IHBBZC0+TWxtZUF1eC5DaGFubmVsOworCisJCQkJcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5iSHRFbmFibGUgPSBGQUxTRTsKKwkJCQlSVE1QWmVyb01lbW9yeSgmcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eSwgU0laRV9IVF9DQVBfSUUpOworCQkJCVJUTVBaZXJvTWVtb3J5KCZwQWQtPk1sbWVBdXguQWRkSHRJbmZvLCBTSVpFX0FERF9IVF9JTkZPX0lFKTsKKwkJCX0KKworCQkJUlRNUFVwZGF0ZU1sbWVSYXRlKHBBZCk7CisKKwkJCS8vIGNvcHkgUU9TIHJlbGF0ZWQgaW5mb3JtYXRpb24KKwkJCWlmICgocEFkLT5Db21tb25DZmcuYldtbUNhcGFibGUpCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQkJIHx8IChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID49IFBIWV8xMUFCR05fTUlYRUQpCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCQkJKQorCQkJeworCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPk1sbWVBdXguQVBFZGNhUGFybSwgJkVkY2FQYXJtLCBzaXplb2YoRURDQV9QQVJNKSk7CisJCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+TWxtZUF1eC5BUFFic3NMb2FkLCAmUWJzc0xvYWQsIHNpemVvZihRQlNTX0xPQURfUEFSTSkpOworCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPk1sbWVBdXguQVBRb3NDYXBhYmlsaXR5LCAmUW9zQ2FwYWJpbGl0eSwgc2l6ZW9mKFFPU19DQVBBQklMSVRZX1BBUk0pKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlOZGlzWmVyb01lbW9yeSgmcEFkLT5NbG1lQXV4LkFQRWRjYVBhcm0sIHNpemVvZihFRENBX1BBUk0pKTsKKwkJCQlOZGlzWmVyb01lbW9yeSgmcEFkLT5NbG1lQXV4LkFQUWJzc0xvYWQsIHNpemVvZihRQlNTX0xPQURfUEFSTSkpOworCQkJCU5kaXNaZXJvTWVtb3J5KCZwQWQtPk1sbWVBdXguQVBRb3NDYXBhYmlsaXR5LCBzaXplb2YoUU9TX0NBUEFCSUxJVFlfUEFSTSkpOworCQkJfQorCisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTWU5DIC0gYWZ0ZXIgSk9JTiwgU3VwUmF0ZUxlbj0lZCwgRXh0UmF0ZUxlbj0lZFxuIiwKKwkJCQkJCQkJCQlwQWQtPk1sbWVBdXguU3VwUmF0ZUxlbiwgcEFkLT5NbG1lQXV4LkV4dFJhdGVMZW4pKTsKKworI2lmZGVmIExFQVBfU1VQUE9SVAorCQkJLy8gVXBkYXRlIENraXBGbGFnCisJCQlwQWQtPlN0YUNmZy5Da2lwRmxhZyA9IENraXBGbGFnOworCisJCQkvLyBLZWVwIFRpbWVTdGFtcCBmb3IgUmUtQXNzb2NpYXRpb24gdXNlZC4KKwkJCWlmIChMRUFQX0NDS01fT04ocEFkKSAmJiAocEFkLT5TdGFDZmcuQ0NLTUxpbmtVcEZsYWcgPT0gVFJVRSkpCisJCQkJcEFkLT5TdGFDZmcuQ0NLTUJlYWNvbkF0Sm9pblRpbWVTdGFtcCA9IFRpbWVTdGFtcDsKKyNlbmRpZiAvLyBMRUFQX1NVUFBPUlQgLy8KKworCQkJaWYgKEFpcm9uZXRDZWxsUG93ZXJMaW1pdCAhPSAweEZGKQorCQkJeworCQkJCS8vV2UgbmVlZCB0byBjaGFuZ2Ugb3VyIFR4UG93ZXIgZm9yIENDWCAyLjAgQVAgQ29udHJvbCBvZiBDbGllbnQgVHJhbnNtaXQgUG93ZXIKKwkJCQlDaGFuZ2VUb0NlbGxQb3dlckxpbWl0KHBBZCwgQWlyb25ldENlbGxQb3dlckxpbWl0KTsKKwkJCX0KKwkJCWVsc2UgIC8vVXNlZCB0aGUgZGVmYXVsdCBUWCBQb3dlciBQZXJjZW50YWdlLgorCQkJCXBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID0gcEFkLT5Db21tb25DZmcuVHhQb3dlckRlZmF1bHQ7CisKKwkJCXBBZC0+TWxtZS5TeW5jTWFjaGluZS5DdXJyU3RhdGUgPSBTWU5DX0lETEU7CisJCQlTdGF0dXMgPSBNTE1FX1NVQ0NFU1M7CisJCQlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfSk9JTl9DT05GLCAyLCAmU3RhdHVzKTsKKwkJfQorCQkvLyBub3QgdG8gbWUgQkVBQ09OLCBpZ25vcmVkCisJfQorCS8vIHNhbml0eSBjaGVjayBmYWlsLCBpZ25vcmUgdGhpcyBmcmFtZQorfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCXJlY2VpdmUgQkVBQ09OIGZyb20gcGVlcgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIFBlZXJCZWFjb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCVVDSEFSICAgICAgICAgQnNzaWRbTUFDX0FERFJfTEVOXSwgQWRkcjJbTUFDX0FERFJfTEVOXTsKKwlDSEFSICAgICAgICAgIFNzaWRbTUFYX0xFTl9PRl9TU0lEXTsKKwlDRl9QQVJNICAgICAgIENmUGFybTsKKwlVQ0hBUiAgICAgICAgIFNzaWRMZW4sIE1lc3NhZ2VUb01lPTAsIEJzc1R5cGUsIENoYW5uZWwsIE5ld0NoYW5uZWwsIGluZGV4PTA7CisJVUNIQVIgICAgICAgICBEdGltQ291bnQ9MCwgRHRpbVBlcmlvZD0wLCBCY2FzdEZsYWc9MDsKKwlVU0hPUlQgICAgICAgIENhcGFiaWxpdHlJbmZvLCBBdGltV2luLCBCZWFjb25QZXJpb2Q7CisJTEFSR0VfSU5URUdFUiBUaW1lU3RhbXA7CisJVVNIT1JUICAgICAgICBUYnR0TnVtVG9OZXh0V2FrZVVwOworCVVDSEFSICAgICAgICAgRXJwOworCVVDSEFSICAgICAgICAgU3VwUmF0ZVtNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFU10sIEV4dFJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdOworCVVDSEFSCQkgIFN1cFJhdGVMZW4sIEV4dFJhdGVMZW47CisJVUNIQVIJCSAgQ2tpcEZsYWc7CisJVVNIT1JUICAgICAgICBMZW5WSUU7CisJVUNIQVIJCSAgQWlyb25ldENlbGxQb3dlckxpbWl0OworCUVEQ0FfUEFSTSAgICAgICBFZGNhUGFybTsKKwlRQlNTX0xPQURfUEFSTSAgUWJzc0xvYWQ7CisJUU9TX0NBUEFCSUxJVFlfUEFSTSBRb3NDYXBhYmlsaXR5OworCVVMT05HICAgICAgICAgICBSYWxpbmtJZTsKKwkvLyBOZXcgZm9yIFdQQSBzZWN1cml0eSBzdWl0ZXMKKwlVQ0hBUgkJCQkJCVZhcklFW01BWF9WSUVfTEVOXTsJCS8vIFRvdGFsIFZJRSBsZW5ndGggPSBNQVhfVklFX0xFTiAtIC01CisJTkRJU184MDJfMTFfVkFSSUFCTEVfSUVzCSpwVklFID0gTlVMTDsKKwlIVF9DQVBBQklMSVRZX0lFCQlIdENhcGFiaWxpdHk7CisJQUREX0hUX0lORk9fSUUJCUFkZEh0SW5mbzsJLy8gQVAgbWlnaHQgdXNlIHRoaXMgYWRkaXRpb25hbCBodCBpbmZvIElFCisJVUNIQVIJCQlIdENhcGFiaWxpdHlMZW4sIFByZU5IdENhcGFiaWxpdHlMZW47CisJVUNIQVIJCQlBZGRIdEluZm9MZW47CisJVUNIQVIJCQlOZXdFeHRDaGFubmVsT2Zmc2V0ID0gMHhmZjsKKworCisjaWZkZWYgUkFMSU5LX0FURQorICAgIGlmIChBVEVfT04ocEFkKSkKKyAgICB7CisJCXJldHVybjsKKyAgICB9CisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCisJaWYgKCEoSU5GUkFfT04ocEFkKSB8fCBBREhPQ19PTihwQWQpCisJCSkpCisJCXJldHVybjsKKworCS8vIEluaXQgVmFyaWFibGUgSUUgc3RydWN0dXJlCisJcFZJRSA9IChQTkRJU184MDJfMTFfVkFSSUFCTEVfSUVzKSBWYXJJRTsKKwlwVklFLT5MZW5ndGggPSAwOworICAgIFJUTVBaZXJvTWVtb3J5KCZIdENhcGFiaWxpdHksIHNpemVvZihIdENhcGFiaWxpdHkpKTsKKwlSVE1QWmVyb01lbW9yeSgmQWRkSHRJbmZvLCBzaXplb2YoQUREX0hUX0lORk9fSUUpKTsKKworCWlmIChQZWVyQmVhY29uQW5kUHJvYmVSc3BTYW5pdHkocEFkLAorCQkJCQkJCQlFbGVtLT5Nc2csCisJCQkJCQkJCUVsZW0tPk1zZ0xlbiwKKwkJCQkJCQkJRWxlbS0+Q2hhbm5lbCwKKwkJCQkJCQkJQWRkcjIsCisJCQkJCQkJCUJzc2lkLAorCQkJCQkJCQlTc2lkLAorCQkJCQkJCQkmU3NpZExlbiwKKwkJCQkJCQkJJkJzc1R5cGUsCisJCQkJCQkJCSZCZWFjb25QZXJpb2QsCisJCQkJCQkJCSZDaGFubmVsLAorCQkJCQkJCQkmTmV3Q2hhbm5lbCwKKwkJCQkJCQkJJlRpbWVTdGFtcCwKKwkJCQkJCQkJJkNmUGFybSwKKwkJCQkJCQkJJkF0aW1XaW4sCisJCQkJCQkJCSZDYXBhYmlsaXR5SW5mbywKKwkJCQkJCQkJJkVycCwKKwkJCQkJCQkJJkR0aW1Db3VudCwKKwkJCQkJCQkJJkR0aW1QZXJpb2QsCisJCQkJCQkJCSZCY2FzdEZsYWcsCisJCQkJCQkJCSZNZXNzYWdlVG9NZSwKKwkJCQkJCQkJU3VwUmF0ZSwKKwkJCQkJCQkJJlN1cFJhdGVMZW4sCisJCQkJCQkJCUV4dFJhdGUsCisJCQkJCQkJCSZFeHRSYXRlTGVuLAorCQkJCQkJCQkmQ2tpcEZsYWcsCisJCQkJCQkJCSZBaXJvbmV0Q2VsbFBvd2VyTGltaXQsCisJCQkJCQkJCSZFZGNhUGFybSwKKwkJCQkJCQkJJlFic3NMb2FkLAorCQkJCQkJCQkmUW9zQ2FwYWJpbGl0eSwKKwkJCQkJCQkJJlJhbGlua0llLAorCQkJCQkJCQkmSHRDYXBhYmlsaXR5TGVuLAorCQkJCQkJCQkmUHJlTkh0Q2FwYWJpbGl0eUxlbiwKKwkJCQkJCQkJJkh0Q2FwYWJpbGl0eSwKKwkJCQkJCQkJJkFkZEh0SW5mb0xlbiwKKwkJCQkJCQkJJkFkZEh0SW5mbywKKwkJCQkJCQkJJk5ld0V4dENoYW5uZWxPZmZzZXQsCisJCQkJCQkJCSZMZW5WSUUsCisJCQkJCQkJCXBWSUUpKQorCXsKKwkJQk9PTEVBTiBpc19teV9ic3NpZCwgaXNfbXlfc3NpZDsKKwkJVUxPTkcgICBCc3NpZHgsIE5vdzsKKwkJQlNTX0VOVFJZICpwQnNzOworCQlDSEFSCQlSZWFsUnNzaSA9IFJUTVBNYXhSc3NpKHBBZCwgQ29udmVydFRvUnNzaShwQWQsIEVsZW0tPlJzc2kwLCBSU1NJXzApLCBDb252ZXJ0VG9Sc3NpKHBBZCwgRWxlbS0+UnNzaTEsIFJTU0lfMSksIENvbnZlcnRUb1Jzc2kocEFkLCBFbGVtLT5Sc3NpMiwgUlNTSV8yKSk7CisKKwkJaXNfbXlfYnNzaWQgPSBNQUNfQUREUl9FUVVBTChCc3NpZCwgcEFkLT5Db21tb25DZmcuQnNzaWQpPyBUUlVFIDogRkFMU0U7CisJCWlzX215X3NzaWQgPSBTU0lEX0VRVUFMKFNzaWQsIFNzaWRMZW4sIHBBZC0+Q29tbW9uQ2ZnLlNzaWQsIHBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW4pPyBUUlVFOkZBTFNFOworCisKKwkJLy8gaWdub3JlIEJFQUNPTiBub3QgZm9yIG15IFNTSUQKKwkJaWYgKCghIGlzX215X3NzaWQpICYmICghIGlzX215X2Jzc2lkKSkKKwkJCXJldHVybjsKKworCQkvLyBJdCBtZWFucyBTVEEgd2FpdHMgZGlzYXNzb2MgY29tcGxldGVseSBmcm9tIHRoaXMgQVAsIGlnbm9yZXMgdGhpcyBiZWFjb24uCisJCWlmIChwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID09IENOVExfV0FJVF9ESVNBU1NPQykKKwkJCXJldHVybjsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkvLyBDb3B5IENvbnRyb2wgY2hhbm5lbCBmb3IgdGhpcyBCU1NJRC4KKwkJaWYgKEFkZEh0SW5mb0xlbiAhPSAwKQorCQkJQ2hhbm5lbCA9IEFkZEh0SW5mby5Db250cm9sQ2hhbjsKKworCQlpZiAoKEh0Q2FwYWJpbGl0eUxlbiA+IDApIHx8IChQcmVOSHRDYXBhYmlsaXR5TGVuID4gMCkpCisJCQlIdENhcGFiaWxpdHlMZW4gPSBTSVpFX0hUX0NBUF9JRTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCQkvLworCQkvLyBIb3VzZWtlZXBpbmcgIlNzaWRCc3NUYWIiIHRhYmxlIGZvciBsYXRlci1vbiBST0FNaW5nIHVzYWdlLgorCQkvLworCQlCc3NpZHggPSBCc3NUYWJsZVNlYXJjaCgmcEFkLT5TY2FuVGFiLCBCc3NpZCwgQ2hhbm5lbCk7CisJCWlmIChCc3NpZHggPT0gQlNTX05PVF9GT1VORCkKKwkJeworCQkJLy8gZGlzY292ZXIgbmV3IEFQIG9mIHRoaXMgbmV0d29yaywgY3JlYXRlIEJTUyBlbnRyeQorCQkJQnNzaWR4ID0gQnNzVGFibGVTZXRFbnRyeShwQWQsICZwQWQtPlNjYW5UYWIsIEJzc2lkLCBTc2lkLCBTc2lkTGVuLCBCc3NUeXBlLCBCZWFjb25QZXJpb2QsCisJCQkJCQkgJkNmUGFybSwgQXRpbVdpbiwgQ2FwYWJpbGl0eUluZm8sIFN1cFJhdGUsIFN1cFJhdGVMZW4sIEV4dFJhdGUsIEV4dFJhdGVMZW4sCisJCQkJCQkmSHRDYXBhYmlsaXR5LCAmQWRkSHRJbmZvLEh0Q2FwYWJpbGl0eUxlbixBZGRIdEluZm9MZW4sTmV3RXh0Q2hhbm5lbE9mZnNldCwgQ2hhbm5lbCwKKwkJCQkJCVJlYWxSc3NpLCBUaW1lU3RhbXAsIENraXBGbGFnLCAmRWRjYVBhcm0sICZRb3NDYXBhYmlsaXR5LAorCQkJCQkJJlFic3NMb2FkLCBMZW5WSUUsIHBWSUUpOworCQkJaWYgKEJzc2lkeCA9PSBCU1NfTk9UX0ZPVU5EKSAvLyByZXR1cm4gaWYgQlNTIHRhYmxlIGZ1bGwKKwkJCQlyZXR1cm47CisKKwkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NpZHhdLlBUU0YsICZFbGVtLT5Nc2dbMjRdLCA0KTsKKwkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzaWR4XS5UVFNGWzBdLCAmRWxlbS0+VGltZVN0YW1wLnUuTG93UGFydCwgNCk7CisJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc2lkeF0uVFRTRls0XSwgJkVsZW0tPlRpbWVTdGFtcC51Lkxvd1BhcnQsIDQpOworCisKKworCQl9CisKKwkJaWYgKChwQWQtPkNvbW1vbkNmZy5iSUVFRTgwMjExSCA9PSAxKSAmJiAoTmV3Q2hhbm5lbCAhPSAwKSAmJiAoQ2hhbm5lbCAhPSBOZXdDaGFubmVsKSkKKwkJeworCQkJLy8gU3dpdGNoaW5nIHRvIGNoYW5uZWwgMSBjYW4gcHJldmVudCBmcm9tIHJlc2Nhbm5pbmcgdGhlIGN1cnJlbnQgY2hhbm5lbCBpbW1lZGlhdGVseSAoYnkgYXV0byByZWNvbm5lY3Rpb24pLgorCQkJLy8gSW4gYWRkaXRpb24sIGNsZWFyIHRoZSBNTE1FIHF1ZXVlIGFuZCB0aGUgc2NhbiB0YWJsZSB0byBkaXNjYXJkIHRoZSBSWCBwYWNrZXRzIGFuZCBwcmV2aW91cyBzY2FubmluZyByZXN1bHRzLgorCQkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCAxLCBGQUxTRSk7CisJCQlBc2ljTG9ja0NoYW5uZWwocEFkLCAxKTsKKwkJICAgIExpbmtEb3duKHBBZCwgRkFMU0UpOworCQkJTWxtZVF1ZXVlSW5pdCgmcEFkLT5NbG1lLlF1ZXVlKTsKKwkJCUJzc1RhYmxlSW5pdCgmcEFkLT5TY2FuVGFiKTsKKwkJICAgIFJUTVB1c2VjRGVsYXkoMTAwMDAwMCk7CQkvLyB1c2UgZGVsYXkgdG8gcHJldmVudCBTVEEgZG8gcmVhc3NvYworCisJCQkvLyBjaGFubmVsIHNhbml0eSBjaGVjaworCQkJZm9yIChpbmRleCA9IDAgOyBpbmRleCA8IHBBZC0+Q2hhbm5lbExpc3ROdW07IGluZGV4KyspCisJCQl7CisJCQkJaWYgKHBBZC0+Q2hhbm5lbExpc3RbaW5kZXhdLkNoYW5uZWwgPT0gTmV3Q2hhbm5lbCkKKwkJCQl7CisJCQkJCXBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NpZHhdLkNoYW5uZWwgPSBOZXdDaGFubmVsOworCQkJCQlwQWQtPkNvbW1vbkNmZy5DaGFubmVsID0gTmV3Q2hhbm5lbDsKKwkJCQkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsLCBGQUxTRSk7CisJCQkJCUFzaWNMb2NrQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpOworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyQmVhY29uIC0gU1RBIHJlY2VpdmUgY2hhbm5lbCBzd2l0Y2ggYW5ub3VuY2VtZW50IElFIChOZXcgQ2hhbm5lbCA9JWQpXG4iLCBOZXdDaGFubmVsKSk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKworCQkJaWYgKGluZGV4ID49IHBBZC0+Q2hhbm5lbExpc3ROdW0pCisJCQl7CisJCQkJREJHUFJJTlRfRVJSKCgiUGVlckJlYWNvbihjYW4gbm90IGZpbmQgTmV3IENoYW5uZWw9JWQgaW4gQ2hhbm5lbExpc3RbJWRdXG4iLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsLCBwQWQtPkNoYW5uZWxMaXN0TnVtKSk7CisJCQl9CisJCX0KKworCQkvLyBpZiB0aGUgc3NpZCBtYXRjaGVkICYgYnNzaWQgdW5tYXRjaGVkLCB3ZSBzaG91bGQgc2VsZWN0IHRoZSBic3NpZCB3aXRoIGxhcmdlIHZhbHVlLgorCQkvLyBUaGlzIG1pZ2h0IGhhcHBlbmVkIHdoZW4gdHdvIFNUQSBzdGFydCBhdCB0aGUgc2FtZSB0aW1lCisJCWlmICgoISBpc19teV9ic3NpZCkgJiYgQURIT0NfT04ocEFkKSkKKwkJeworCQkJSU5UCWk7CisKKwkJCS8vIEFkZCB0aGUgc2FmZWd1YXJkIGFnYWluc3QgdGhlIG1pc21hdGNoIG9mIGFkaG9jIHdlcCBzdGF0dXMKKwkJCWlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgIT0gcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc2lkeF0uV2VwU3RhdHVzKQorCQkJeworCQkJCXJldHVybjsKKwkJCX0KKworCQkJLy8gY29sbGFwc2UgaW50byB0aGUgQURIT0MgbmV0d29yayB3aGljaCBoYXMgYmlnZ2VyIEJTU0lEIHZhbHVlLgorCQkJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJCXsKKwkJCQlpZiAoQnNzaWRbaV0gPiBwQWQtPkNvbW1vbkNmZy5Cc3NpZFtpXSkKKwkJCQl7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNZTkMgLSBtZXJnZSB0byB0aGUgSUJTUyB3aXRoIGJpZ2dlciBCU1NJRD0lMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKwkJCQkJCUJzc2lkWzBdLCBCc3NpZFsxXSwgQnNzaWRbMl0sIEJzc2lkWzNdLCBCc3NpZFs0XSwgQnNzaWRbNV0pKTsKKwkJCQkJQXNpY0Rpc2FibGVTeW5jKHBBZCk7CisJCQkJCUNPUFlfTUFDX0FERFIocEFkLT5Db21tb25DZmcuQnNzaWQsIEJzc2lkKTsKKwkJCQkJQXNpY1NldEJzc2lkKHBBZCwgcEFkLT5Db21tb25DZmcuQnNzaWQpOworCQkJCQlNYWtlSWJzc0JlYWNvbihwQWQpOyAgICAgICAgLy8gcmUtYnVpbGQgQkVBQ09OIGZyYW1lCisJCQkJCUFzaWNFbmFibGVJYnNzU3luYyhwQWQpOyAgICAvLyBjb3B5IEJFQUNPTiBmcmFtZSB0byBvbi1jaGlwIG1lbW9yeQorCQkJCQlpc19teV9ic3NpZCA9IFRSVUU7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQllbHNlIGlmIChCc3NpZFtpXSA8IHBBZC0+Q29tbW9uQ2ZnLkJzc2lkW2ldKQorCQkJCQlicmVhazsKKwkJCX0KKwkJfQorCisKKwkJTmRpc0dldFN5c3RlbVVwVGltZSgmTm93KTsKKwkJcEJzcyA9ICZwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzaWR4XTsKKwkJcEJzcy0+UnNzaSA9IFJlYWxSc3NpOyAgICAgICAvLyBsYXN0ZXN0IFJTU0kKKwkJcEJzcy0+TGFzdEJlYWNvblJ4VGltZSA9IE5vdzsgICAvLyBsYXN0IFJYIHRpbWVzdGFtcAorCisJCS8vCisJCS8vIEJFQUNPTiBmcm9tIG15IEJTU0lEIC0gZWl0aGVyIElCU1Mgb3IgSU5GUkEgbmV0d29yaworCQkvLworCQlpZiAoaXNfbXlfYnNzaWQpCisJCXsKKwkJCVJYV0lfU1RSVUMJUnhXSTsKKworCQkJcEFkLT5TdGFDZmcuRHRpbUNvdW50ID0gRHRpbUNvdW50OworCQkJcEFkLT5TdGFDZmcuRHRpbVBlcmlvZCA9IER0aW1QZXJpb2Q7CisJCQlwQWQtPlN0YUNmZy5MYXN0QmVhY29uUnhUaW1lID0gTm93OworCisKKwkJCVJ4V0kuUlNTSTAgPSBFbGVtLT5Sc3NpMDsKKwkJCVJ4V0kuUlNTSTEgPSBFbGVtLT5Sc3NpMTsKKwkJCVJ4V0kuUlNTSTIgPSBFbGVtLT5Sc3NpMjsKKworCQkJVXBkYXRlX1Jzc2lfU2FtcGxlKHBBZCwgJnBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUsICZSeFdJKTsKKwkJCWlmIChBaXJvbmV0Q2VsbFBvd2VyTGltaXQgIT0gMHhGRikKKwkJCXsKKwkJCQkvLworCQkJCS8vIFdlIGdldCB0aGUgQ2lzY28gKGNjeCkgIlR4UG93ZXIgTGltaXQiIHJlcXVpcmVkCisJCQkJLy8gQ2hhbmdlZCB0byBhcHByb3ByaWF0ZSBUeFBvd2VyIExpbWl0IGZvciBDaXNvIENvbXBhdGlibGUgRXh0ZW5zaW9ucworCQkJCS8vCisJCQkJQ2hhbmdlVG9DZWxsUG93ZXJMaW1pdChwQWQsIEFpcm9uZXRDZWxsUG93ZXJMaW1pdCk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJLy8KKwkJCQkvLyBBaXJvbmV0Q2VsbFBvd2VyTGltaXQgZXF1YWwgdG8gMHhGRiBtZWFucyB0aGUgQ2lzY28gKGNjeCkgIlR4UG93ZXIgTGltaXQiIG5vdCBleGlzdC4KKwkJCQkvLyBVc2VkIHRoZSBkZWZhdWx0IFRYIFBvd2VyIFBlcmNlbnRhZ2UsIHRoYXQgc2V0IGZyb20gVUkuCisJCQkJLy8KKwkJCQlwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA9IHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJEZWZhdWx0OworCQkJfQorCisJCQlpZiAoQURIT0NfT04ocEFkKSAmJiAoQ0FQX0lTX0lCU1NfT04oQ2FwYWJpbGl0eUluZm8pKSkKKwkJCXsKKwkJCQlVQ0hBUgkJCU1heFN1cHBvcnRlZFJhdGVJbjUwMEticHMgPSAwOworCQkJCVVDSEFSCQkJaWR4OworCQkJCU1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5OworCisJCQkJLy8gc3VwcG9ydGVkIHJhdGVzIGFycmF5IG1heSBub3QgYmUgc29ydGVkLiBzb3J0IGl0IGFuZCBmaW5kIHRoZSBtYXhpbXVtIHJhdGUKKwkJCSAgICBmb3IgKGlkeD0wOyBpZHg8U3VwUmF0ZUxlbjsgaWR4KyspCisJCQkgICAgeworCQkJICAgICAgICBpZiAoTWF4U3VwcG9ydGVkUmF0ZUluNTAwS2JwcyA8IChTdXBSYXRlW2lkeF0gJiAweDdmKSkKKwkJCSAgICAgICAgICAgIE1heFN1cHBvcnRlZFJhdGVJbjUwMEticHMgPSBTdXBSYXRlW2lkeF0gJiAweDdmOworCQkJICAgIH0KKworCQkJCWZvciAoaWR4PTA7IGlkeDxFeHRSYXRlTGVuOyBpZHgrKykKKwkJCSAgICB7CisJCQkgICAgICAgIGlmIChNYXhTdXBwb3J0ZWRSYXRlSW41MDBLYnBzIDwgKEV4dFJhdGVbaWR4XSAmIDB4N2YpKQorCQkJICAgICAgICAgICAgTWF4U3VwcG9ydGVkUmF0ZUluNTAwS2JwcyA9IEV4dFJhdGVbaWR4XSAmIDB4N2Y7CisJCQkgICAgfQorCisJCQkJLy8gbG9vayB1cCB0aGUgZXhpc3RpbmcgdGFibGUKKwkJCQlwRW50cnkgPSBNYWNUYWJsZUxvb2t1cChwQWQsIEFkZHIyKTsKKworCQkJCS8vIEFkLWhvYyBtb2RlIGlzIHVzaW5nIE1BQyBhZGRyZXNzIGFzIEJBIHNlc3Npb24uIFNvIHdlIG5lZWQgdG8gY29udGludW91c2x5IGZpbmQgbmV3bHkgam9pbmVkIGFkaG9jIHN0YXRpb24gYnkgcmVjZWl2aW5nIGJlYWNvbi4KKwkJCQkvLyBUbyBwcmV2ZW50IGFsd2F5cyBjaGVjayB0aGlzLCB3ZSB1c2Ugd2NpZCA9PSBSRVNFUlZFRF9XQ0lEIHRvIHJlY29nbml6ZSBpdCBhcyBuZXdseSBqb2luZWQgYWRob2Mgc3RhdGlvbi4KKwkJCQlpZiAoKEFESE9DX09OKHBBZCkgJiYgKEVsZW0tPldjaWQgPT0gUkVTRVJWRURfV0NJRCkpIHx8CisJCQkJCShwRW50cnkgJiYgKChwRW50cnktPkxhc3RCZWFjb25SeFRpbWUgKyBBREhPQ19FTlRSWV9CRUFDT05fTE9TVF9USU1FKSA8IE5vdykpKQorCQkJCXsKKwkJCQkJaWYgKHBFbnRyeSA9PSBOVUxMKQorCQkJCQkJLy8gQW5vdGhlciBhZGhvYyBqb2luaW5nLCBhZGQgdG8gb3VyIE1BQyB0YWJsZS4KKwkJCQkJCXBFbnRyeSA9IE1hY1RhYmxlSW5zZXJ0RW50cnkocEFkLCBBZGRyMiwgQlNTMCwgRkFMU0UpOworCisJCQkJCWlmIChTdGFBZGRNYWNUYWJsZUVudHJ5KHBBZCwgcEVudHJ5LCBNYXhTdXBwb3J0ZWRSYXRlSW41MDBLYnBzLCAmSHRDYXBhYmlsaXR5LCBIdENhcGFiaWxpdHlMZW4sIENhcGFiaWxpdHlJbmZvKSA9PSBGQUxTRSkKKwkJCQkJeworCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQURIT0MgLSBBZGQgRW50cnkgZmFpbGVkLlxuIikpOworCQkJCQkJcmV0dXJuOworCQkJCQl9CisKKwkJCQkJaWYgKHBFbnRyeSAmJgorCQkJCQkJKEVsZW0tPldjaWQgPT0gUkVTRVJWRURfV0NJRCkpCisJCQkJCXsKKwkJCQkJCWlkeCA9IHBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZDsKKwkJCQkJCVJUMjhYWF9TVEFfU0VDVVJJVFlfSU5GT19BREQocEFkLCBCU1MwLCBpZHgsIHBFbnRyeSk7CisJCQkJCX0KKwkJCQl9CisKKwkJCQlpZiAocEVudHJ5ICYmIHBFbnRyeS0+VmFsaWRBc0NMSSkKKwkJCQkJcEVudHJ5LT5MYXN0QmVhY29uUnhUaW1lID0gTm93OworCisJCQkJLy8gQXQgbGVhc3QgYW5vdGhlciBwZWVyIGluIHRoaXMgSUJTUywgZGVjbGFyZSBNZWRpYVN0YXRlIGFzIENPTk5FQ1RFRAorCQkJCWlmICghT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpKQorCQkJCXsKKwkJCQkJT1BTVEFUVVNfU0VUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCk7CisKKwkJCQkJcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZUNvbm5lY3RlZDsKKwkJCQkJUlRNUF9JbmRpY2F0ZU1lZGlhU3RhdGUocEFkKTsKKwkgICAgICAgICAgICAgICAgcEFkLT5FeHRyYUluZm8gPSBHRU5FUkFMX0xJTktfVVA7CisJCQkJCUFzaWNTZXRCc3NpZChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKworCQkJCQkvLyAyMDAzLzAzLzEyIC0gam9obgorCQkJCQkvLyBNYWtlIHN1cmUgdGhpcyBlbnRyeSBpbiAiU2NhblRhYiIgdGFibGUsIHRodXMgY29tcGxpZXMgdG8gTWljcm9zb2Z0J3MgcG9saWN5IHRoYXQKKwkJCQkJLy8gInNpdGUgc3VydmV5IiByZXN1bHQgc2hvdWxkIGFsd2F5cyBpbmNsdWRlIHRoZSBjdXJyZW50IGNvbm5lY3RlZCBuZXR3b3JrLgorCQkJCQkvLworCQkJCQlCc3NpZHggPSBCc3NUYWJsZVNlYXJjaCgmcEFkLT5TY2FuVGFiLCBCc3NpZCwgQ2hhbm5lbCk7CisJCQkJCWlmIChCc3NpZHggPT0gQlNTX05PVF9GT1VORCkKKwkJCQkJeworCQkJCQkJQnNzaWR4ID0gQnNzVGFibGVTZXRFbnRyeShwQWQsICZwQWQtPlNjYW5UYWIsIEJzc2lkLCBTc2lkLCBTc2lkTGVuLCBCc3NUeXBlLCBCZWFjb25QZXJpb2QsCisJCQkJCQkJCQkmQ2ZQYXJtLCBBdGltV2luLCBDYXBhYmlsaXR5SW5mbywgU3VwUmF0ZSwgU3VwUmF0ZUxlbiwgRXh0UmF0ZSwgRXh0UmF0ZUxlbiwgJkh0Q2FwYWJpbGl0eSwKKwkJCQkJCQkJCSZBZGRIdEluZm8sIEh0Q2FwYWJpbGl0eUxlbiwgQWRkSHRJbmZvTGVuLCBOZXdFeHRDaGFubmVsT2Zmc2V0LCBDaGFubmVsLCBSZWFsUnNzaSwgVGltZVN0YW1wLCAwLAorCQkJCQkJCQkJJkVkY2FQYXJtLCAmUW9zQ2FwYWJpbGl0eSwgJlFic3NMb2FkLCBMZW5WSUUsIHBWSUUpOworCQkJCQl9CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFESE9DICBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRC5cbiIpKTsKKwkJCQl9CisJCQl9CisKKwkJCWlmIChJTkZSQV9PTihwQWQpKQorCQkJeworCQkJCUJPT0xFQU4gYlVzZVNob3J0U2xvdCwgYlVzZUJHUHJvdGVjdGlvbjsKKworCQkJCS8vIGRlY2lkZSB0byB1c2UvY2hhbmdlIHRvIC0KKwkJCQkvLyAgICAgIDEuIGxvbmcgc2xvdCAoMjAgdXMpIG9yIHNob3J0IHNsb3QgKDkgdXMpIHRpbWUKKwkJCQkvLyAgICAgIDIuIHR1cm4gb24vb2ZmIFJUUy9DVFMgYW5kL29yIENUUy10by1zZWxmIHByb3RlY3Rpb24KKwkJCQkvLyAgICAgIDMuIHNob3J0IHByZWFtYmxlCisKKwkJCQkvL2JVc2VTaG9ydFNsb3QgPSBwQWQtPkNvbW1vbkNmZy5iVXNlU2hvcnRTbG90VGltZSAmJiBDQVBfSVNfU0hPUlRfU0xPVChDYXBhYmlsaXR5SW5mbyk7CisJCQkJYlVzZVNob3J0U2xvdCA9IENBUF9JU19TSE9SVF9TTE9UKENhcGFiaWxpdHlJbmZvKTsKKwkJCQlpZiAoYlVzZVNob3J0U2xvdCAhPSBPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1NIT1JUX1NMT1RfSU5VU0VEKSkKKwkJCQkJQXNpY1NldFNsb3RUaW1lKHBBZCwgYlVzZVNob3J0U2xvdCk7CisKKwkJCQliVXNlQkdQcm90ZWN0aW9uID0gKHBBZC0+Q29tbW9uQ2ZnLlVzZUJHUHJvdGVjdGlvbiA9PSAxKSB8fCAgICAvLyBhbHdheXMgdXNlCisJCQkJCQkJCSAgICgocEFkLT5Db21tb25DZmcuVXNlQkdQcm90ZWN0aW9uID09IDApICYmIEVSUF9JU19VU0VfUFJPVEVDVElPTihFcnApKTsKKworCQkJCWlmIChwQWQtPkNvbW1vbkNmZy5DaGFubmVsID4gMTQpIC8vIGFsd2F5cyBubyBCRyBwcm90ZWN0aW9uIGluIEEtYmFuZC4gZmFsc2VseSBoYXBwZW5lZCB3aGVuIHN3aXRjaGluZyBBL0cgYmFuZCB0byBhIGR1YWwtYmFuZCBBUAorCQkJCQliVXNlQkdQcm90ZWN0aW9uID0gRkFMU0U7CisKKwkJCQlpZiAoYlVzZUJHUHJvdGVjdGlvbiAhPSBPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0JHX1BST1RFQ1RJT05fSU5VU0VEKSkKKwkJCQl7CisJCQkJCWlmIChiVXNlQkdQcm90ZWN0aW9uKQorCQkJCQl7CisJCQkJCQlPUFNUQVRVU19TRVRfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQkdfUFJPVEVDVElPTl9JTlVTRUQpOworCQkJCQkJQXNpY1VwZGF0ZVByb3RlY3QocEFkLCBwQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzIuT3BlcmFpb25Nb2RlLCAoT0ZETVNFVFBST1RFQ1R8Q0NLU0VUUFJPVEVDVHxBTExOX1NFVFBST1RFQ1QpLEZBTFNFLChwQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzIuTm9uR2ZQcmVzZW50ID09IDEpKTsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0JHX1BST1RFQ1RJT05fSU5VU0VEKTsKKwkJCQkJCUFzaWNVcGRhdGVQcm90ZWN0KHBBZCwgcEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLk9wZXJhaW9uTW9kZSwgKE9GRE1TRVRQUk9URUNUfENDS1NFVFBST1RFQ1R8QUxMTl9TRVRQUk9URUNUKSxUUlVFLChwQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzIuTm9uR2ZQcmVzZW50ID09IDEpKTsKKwkJCQkJfQorCisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1dBUk4sICgiU1lOQyAtIEFQIGNoYW5nZWQgQi9HIHByb3RlY3Rpb24gdG8gJWRcbiIsIGJVc2VCR1Byb3RlY3Rpb24pKTsKKwkJCQl9CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCQkvLyBjaGVjayBIdCBwcm90ZWN0aW9uIG1vZGUuIGFuZCBhZGhlcmUgdG8gdGhlIE5vbi1HRiBkZXZpY2UgaW5kaWNhdGlvbiBieSBBUC4KKwkJCQlpZiAoKEFkZEh0SW5mb0xlbiAhPSAwKSAmJgorCQkJCQkoKEFkZEh0SW5mby5BZGRIdEluZm8yLk9wZXJhaW9uTW9kZSAhPSBwQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzIuT3BlcmFpb25Nb2RlKSB8fAorCQkJCQkoQWRkSHRJbmZvLkFkZEh0SW5mbzIuTm9uR2ZQcmVzZW50ICE9IHBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi5Ob25HZlByZXNlbnQpKSkKKwkJCQl7CisJCQkJCXBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi5Ob25HZlByZXNlbnQgPSBBZGRIdEluZm8uQWRkSHRJbmZvMi5Ob25HZlByZXNlbnQ7CisJCQkJCXBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi5PcGVyYWlvbk1vZGUgPSBBZGRIdEluZm8uQWRkSHRJbmZvMi5PcGVyYWlvbk1vZGU7CisJCQkJCWlmIChwQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzIuTm9uR2ZQcmVzZW50ID09IDEpCisJCQkJeworCQkJCQkJQXNpY1VwZGF0ZVByb3RlY3QocEFkLCBwQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzIuT3BlcmFpb25Nb2RlLCBBTExOX1NFVFBST1RFQ1QsIEZBTFNFLCBUUlVFKTsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCQlBc2ljVXBkYXRlUHJvdGVjdChwQWQsIHBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi5PcGVyYWlvbk1vZGUsIEFMTE5fU0VUUFJPVEVDVCwgRkFMU0UsIEZBTFNFKTsKKworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTWU5DIC0gQVAgY2hhbmdlZCBOIE9wZXJhaW9uTW9kZSB0byAlZFxuIiwgcEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLk9wZXJhaW9uTW9kZSkpOworCQkJCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCQkJCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1NIT1JUX1BSRUFNQkxFX0lOVVNFRCkgJiYKKwkJCQkJRVJQX0lTX1VTRV9CQVJLRVJfUFJFQU1CTEUoRXJwKSkKKwkJCQl7CisJCQkJCU1sbWVTZXRUeFByZWFtYmxlKHBBZCwgUnQ4MDJfMTFQcmVhbWJsZUxvbmcpOworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTWU5DIC0gQVAgZm9yY2VkIHRvIHVzZSBMT05HIHByZWFtYmxlXG4iKSk7CisJCQkJfQorCisJCQkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfV01NX0lOVVNFRCkgICAgJiYKKwkJCQkJKEVkY2FQYXJtLmJWYWxpZCA9PSBUUlVFKSAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKKwkJCQkJKEVkY2FQYXJtLkVkY2FVcGRhdGVDb3VudCAhPSBwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLkVkY2FVcGRhdGVDb3VudCkpCisJCQkJeworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTWU5DIC0gQVAgY2hhbmdlIEVEQ0EgcGFyYW1ldGVycyhmcm9tICVkIHRvICVkKVxuIiwKKwkJCQkJCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uRWRjYVVwZGF0ZUNvdW50LAorCQkJCQkJRWRjYVBhcm0uRWRjYVVwZGF0ZUNvdW50KSk7CisJCQkJCUFzaWNTZXRFZGNhUGFybShwQWQsICZFZGNhUGFybSk7CisJCQkJfQorCisJCQkJLy8gY29weSBRT1MgcmVsYXRlZCBpbmZvcm1hdGlvbgorCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPkNvbW1vbkNmZy5BUFFic3NMb2FkLCAmUWJzc0xvYWQsIHNpemVvZihRQlNTX0xPQURfUEFSTSkpOworCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPkNvbW1vbkNmZy5BUFFvc0NhcGFiaWxpdHksICZRb3NDYXBhYmlsaXR5LCBzaXplb2YoUU9TX0NBUEFCSUxJVFlfUEFSTSkpOworCQkJfQorCisJCQkvLyBvbmx5IElORlJBU1RSVUNUVVJFIG1vZGUgc3VwcG9ydCBwb3dlci1zYXZpbmcgZmVhdHVyZQorCQkJaWYgKChJTkZSQV9PTihwQWQpICYmIChwQWQtPlN0YUNmZy5Qc20gPT0gUFdSX1NBVkUpKSB8fCAocEFkLT5Db21tb25DZmcuYkFQU0RGb3JjZVBvd2VyU2F2ZSkpCisJCQl7CisJCQkJVUNIQVIgRnJlZU51bWJlcjsKKwkJCQkvLyAgMS4gQVAgaGFzIGJhY2tsb2dnZWQgdW5pY2FzdC10by1tZSBmcmFtZSwgc3RheSBBV0FLRSwgc2VuZCBQU1BPTEwKKwkJCQkvLyAgMi4gQVAgaGFzIGJhY2tsb2dnZWQgYnJvYWRjYXN0L211bHRpY2FzdCBmcmFtZSBhbmQgd2Ugd2FudCB0aG9zZSBmcmFtZXMsIHN0YXkgQVdBS0UKKwkJCQkvLyAgMy4gd2UgaGF2ZSBvdXRnb2luZyBmcmFtZXMgaW4gVHhSaW5nIG9yIE1nbXRSaW5nLCBiZXR0ZXIgc3RheSBBV0FLRQorCQkJCS8vICA0LiBQc20gY2hhbmdlIHRvIFBXUl9TQVZFLCBidXQgQVAgbm90IGJlZW4gaW5mb3JtZWQgeWV0LCB3ZSBiZXR0ZXIgc3RheSBBV0FLRQorCQkJCS8vICA1LiBvdGhlcndpc2UsIHB1dCBQSFkgYmFjayB0byBzbGVlcCB0byBzYXZlIGJhdHRlcnkuCisJCQkJaWYgKE1lc3NhZ2VUb01lKQorCQkJCXsKKwkJCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJBUFNEQ2FwYWJsZSAmJiBwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLmJBUFNEQ2FwYWJsZSAmJgorCQkJCQkJcEFkLT5Db21tb25DZmcuYkFQU0RBQ19CRSAmJiBwQWQtPkNvbW1vbkNmZy5iQVBTREFDX0JLICYmIHBBZC0+Q29tbW9uQ2ZnLmJBUFNEQUNfVkkgJiYgcEFkLT5Db21tb25DZmcuYkFQU0RBQ19WTykKKwkJCQkJeworCQkJCQkJcEFkLT5Db21tb25DZmcuYk5lZWRTZW5kVHJpZ2dlckZyYW1lID0gVFJVRTsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCQlSVDI4WFhfUFNfUE9MTF9FTlFVRVVFKHBBZCk7CisJCQkJfQorCQkJCWVsc2UgaWYgKEJjYXN0RmxhZyAmJiAoRHRpbUNvdW50ID09IDApICYmIE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfUkVDRUlWRV9EVElNKSkKKwkJCQl7CisJCQkJfQorCQkJCWVsc2UgaWYgKChwQWQtPlR4U3dRdWV1ZVtRSURfQUNfQktdLk51bWJlciAhPSAwKQkJCQkJCQkJCQkJCQl8fAorCQkJCQkJKHBBZC0+VHhTd1F1ZXVlW1FJRF9BQ19CRV0uTnVtYmVyICE9IDApCQkJCQkJCQkJCQkJCQl8fAorCQkJCQkJKHBBZC0+VHhTd1F1ZXVlW1FJRF9BQ19WSV0uTnVtYmVyICE9IDApCQkJCQkJCQkJCQkJCQl8fAorCQkJCQkJKHBBZC0+VHhTd1F1ZXVlW1FJRF9BQ19WT10uTnVtYmVyICE9IDApCQkJCQkJCQkJCQkJCQl8fAorCQkJCQkJKFJUTVBGcmVlVFhEUmVxdWVzdChwQWQsIFFJRF9BQ19CSywgVFhfUklOR19TSVpFIC0gMSwgJkZyZWVOdW1iZXIpICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCXx8CisJCQkJCQkoUlRNUEZyZWVUWERSZXF1ZXN0KHBBZCwgUUlEX0FDX0JFLCBUWF9SSU5HX1NJWkUgLSAxLCAmRnJlZU51bWJlcikgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykJfHwKKwkJCQkJCShSVE1QRnJlZVRYRFJlcXVlc3QocEFkLCBRSURfQUNfVkksIFRYX1JJTkdfU0laRSAtIDEsICZGcmVlTnVtYmVyKSAhPSBORElTX1NUQVRVU19TVUNDRVNTKQl8fAorCQkJCQkJKFJUTVBGcmVlVFhEUmVxdWVzdChwQWQsIFFJRF9BQ19WTywgVFhfUklOR19TSVpFIC0gMSwgJkZyZWVOdW1iZXIpICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCXx8CisJCQkJCQkoUlRNUEZyZWVUWERSZXF1ZXN0KHBBZCwgUUlEX01HTVQsIE1HTVRfUklOR19TSVpFIC0gMSwgJkZyZWVOdW1iZXIpICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpKQorCQkJCXsKKwkJCQkJLy8gVE9ETzogY29uc2lkZXIgc2NoZWR1bGVkIEhDQ0EuIG1pZ2h0IG5vdCBiZSBwcm9wZXIgdG8gdXNlIHRyYWRpdGlvbmFsIERUSU0tYmFzZWQgcG93ZXItc2F2aW5nIHNjaGVtZQorCQkJCQkvLyBjYW4gd2UgY2hlYXQgaGVyZSAoaS5lLiBqdXN0IGNoZWNrIE1HTVQgJiBBQ19CRSkgZm9yIGJldHRlciBwZXJmb3JtYW5jZT8KKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJVVNIT1JUIE5leHREdGltID0gRHRpbUNvdW50OworCisJCQkJCWlmIChOZXh0RHRpbSA9PSAwKQorCQkJCQkJTmV4dER0aW0gPSBEdGltUGVyaW9kOworCisJCQkJCVRidHROdW1Ub05leHRXYWtlVXAgPSBwQWQtPlN0YUNmZy5EZWZhdWx0TGlzdGVuQ291bnQ7CisJCQkJCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1JFQ0VJVkVfRFRJTSkgJiYgKFRidHROdW1Ub05leHRXYWtlVXAgPiBOZXh0RHRpbSkpCisJCQkJCQlUYnR0TnVtVG9OZXh0V2FrZVVwID0gTmV4dER0aW07CisKKwkJCQkJaWYgKCFPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0RPWkUpKQorCQkJCQl7CisJCQkJCQlBc2ljU2xlZXBUaGVuQXV0b1dha2V1cChwQWQsIFRidHROdW1Ub05leHRXYWtlVXApOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCS8vIG5vdCBteSBCU1NJRCwgaWdub3JlIGl0CisJfQorCS8vIHNhbml0eSBjaGVjayBmYWlsLCBpZ25vcmUgdGhpcyBmcmFtZQorfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVJlY2VpdmUgUFJPQkUgUkVRIGZyb20gcmVtb3RlIHBlZXIgd2hlbiBvcGVyYXRpbmcgaW4gSUJTUyBtb2RlCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBQZWVyUHJvYmVSZXFBY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCVVDSEFSICAgICAgICAgQWRkcjJbTUFDX0FERFJfTEVOXTsKKwlDSEFSICAgICAgICAgIFNzaWRbTUFYX0xFTl9PRl9TU0lEXTsKKwlVQ0hBUiAgICAgICAgIFNzaWRMZW47CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJVUNIQVIJCSAgSHRMZW4sIEFkZEh0TGVuLCBOZXdFeHRMZW47CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJSEVBREVSXzgwMl8xMSBQcm9iZVJzcEhkcjsKKwlORElTX1NUQVRVUyAgIE5TdGF0dXM7CisJUFVDSEFSICAgICAgICBwT3V0QnVmZmVyID0gTlVMTDsKKwlVTE9ORyAgICAgICAgIEZyYW1lTGVuID0gMDsKKwlMQVJHRV9JTlRFR0VSIEZha2VUaW1lc3RhbXA7CisJVUNIQVIgICAgICAgICBEc0xlbiA9IDEsIElic3NMZW4gPSAyOworCVVDSEFSICAgICAgICAgTG9jYWxFcnBJZVszXSA9IHtJRV9FUlAsIDEsIDB9OworCUJPT0xFQU4gICAgICAgUHJpdmFjeTsKKwlVU0hPUlQgICAgICAgIENhcGFiaWxpdHlJbmZvOworCVVDSEFSCQkgIFJTTkllID0gSUVfV1BBOworCisJaWYgKCEgQURIT0NfT04ocEFkKSkKKwkJcmV0dXJuOworCisJaWYgKFBlZXJQcm9iZVJlcVNhbml0eShwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuLCBBZGRyMiwgU3NpZCwgJlNzaWRMZW4pKQorCXsKKwkJaWYgKChTc2lkTGVuID09IDApIHx8IFNTSURfRVFVQUwoU3NpZCwgU3NpZExlbiwgcEFkLT5Db21tb25DZmcuU3NpZCwgcEFkLT5Db21tb25DZmcuU3NpZExlbikpCisJCXsKKwkJCS8vIGFsbG9jYXRlIGFuZCBzZW5kIG91dCBQcm9iZVJzcCBmcmFtZQorCQkJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKKwkJCWlmIChOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJCQkJcmV0dXJuOworCisJCQkvL3BBZC0+U3RhQ2ZnLkF0aW1XaW4gPSAwOyAgLy8gPz8/Pz8/CisKKwkJCVByaXZhY3kgPSAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMUVuYWJsZWQpIHx8CisJCQkJCSAgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKSB8fAorCQkJCQkgIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCk7CisJCQlDYXBhYmlsaXR5SW5mbyA9IENBUF9HRU5FUkFURSgwLCAxLCBQcml2YWN5LCAocEFkLT5Db21tb25DZmcuVHhQcmVhbWJsZSA9PSBSdDgwMl8xMVByZWFtYmxlU2hvcnQpLCAwLCAwKTsKKworCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICAgICAgICAgICAgJkZyYW1lTGVuLAorCQkJCQkJCSAgc2l6ZW9mKEhFQURFUl84MDJfMTEpLCAgICAgICAgJlByb2JlUnNwSGRyLAorCQkJCQkJCSAgVElNRVNUQU1QX0xFTiwgICAgICAgICAgICAgICAgJkZha2VUaW1lc3RhbXAsCisJCQkJCQkJICAyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEFkLT5Db21tb25DZmcuQmVhY29uUGVyaW9kLAorCQkJCQkJCSAgMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkNhcGFiaWxpdHlJbmZvLAorCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlNzaWRJZSwKKwkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQWQtPkNvbW1vbkNmZy5Tc2lkTGVuLAorCQkJCQkJCSAgcEFkLT5Db21tb25DZmcuU3NpZExlbiwgICAgICAgcEFkLT5Db21tb25DZmcuU3NpZCwKKwkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdXBSYXRlSWUsCisJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEFkLT5TdGFBY3RpdmUuU3VwUmF0ZUxlbiwKKwkJCQkJCQkgIHBBZC0+U3RhQWN0aXZlLlN1cFJhdGVMZW4sICAgIHBBZC0+U3RhQWN0aXZlLlN1cFJhdGUsCisJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAmRHNJZSwKKwkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICZEc0xlbiwKKwkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQWQtPkNvbW1vbkNmZy5DaGFubmVsLAorCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgJklic3NJZSwKKwkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICZJYnNzTGVuLAorCQkJCQkJCSAgMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBBZC0+U3RhQWN0aXZlLkF0aW1XaW4sCisJCQkJCQkJICBFTkRfT0ZfQVJHUyk7CisKKwkJCWlmIChwQWQtPlN0YUFjdGl2ZS5FeHRSYXRlTGVuKQorCQkJeworCQkJCVVMT05HIHRtcDsKKwkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sICAgICAgICAmdG1wLAorCQkJCQkJCQkgIDMsICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvY2FsRXJwSWUsCisJCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkV4dFJhdGVJZSwKKwkJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEFkLT5TdGFBY3RpdmUuRXh0UmF0ZUxlbiwKKwkJCQkJCQkJICBwQWQtPlN0YUFjdGl2ZS5FeHRSYXRlTGVuLCAgICAmcEFkLT5TdGFBY3RpdmUuRXh0UmF0ZSwKKwkJCQkJCQkJICBFTkRfT0ZfQVJHUyk7CisJCQkJRnJhbWVMZW4gKz0gdG1wOworCQkJfQorCisJCQkvLyBJZiBhZGhvYyBzZWNydWl0eSBpcyBzZXQgZm9yIFdQQS1Ob25lLCBhcHBlbmQgdGhlIGNpcGhlciBzdWl0ZSBJRQorCQkJaWYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmUpCisJCQl7CisJCQkJVUxPTkcgdG1wOworCQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwgICAgICAgIAkmdG1wLAorCQkJCQkJICAJCQkxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZSU05JZSwKKwkJCQkJCSAgCQkJMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSZwQWQtPlN0YUNmZy5SU05JRV9MZW4sCisJCQkJCQkgIAkJCXBBZC0+U3RhQ2ZnLlJTTklFX0xlbiwgICAgICAJcEFkLT5TdGFDZmcuUlNOX0lFLAorCQkJCQkJICAJCQlFTkRfT0ZfQVJHUyk7CisJCQkJRnJhbWVMZW4gKz0gdG1wOworCQkJfQorI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCkKKwkJCXsKKwkJCQlVTE9ORyBUbXBMZW47CisJCQkJVUNIQVIJQlJPQURDT01bNF0gPSB7MHgwLCAweDkwLCAweDRjLCAweDMzfTsKKwkJCQlIdExlbiA9IHNpemVvZihwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkpOworCQkJCUFkZEh0TGVuID0gc2l6ZW9mKHBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mbyk7CisJCQkJTmV3RXh0TGVuID0gMTsKKwkJCQkvL05ldyBleHRlbnNpb24gY2hhbm5lbCBvZmZzZXQgSUUgaXMgaW5jbHVkZWQgaW4gQmVhY29uLCBQcm9iZSBSc3Agb3IgY2hhbm5lbCBTd2l0Y2ggQW5ub3VuY2VtZW50IEZyYW1lCisJCQkJaWYgKHBBZC0+YkJyb2FkQ29tSFQgPT0gVFJVRSkKKwkJCQl7CisJCQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwgICAgICAgICAgICAmVG1wTGVuLAorCQkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmV3BhSWUsCisJCQkJCQkJCSAgNCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZCUk9BRENPTVswXSwKKwkJCQkJCQkJIHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHlMZW4sICAgICAgICAgICZwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5LAorCQkJCQkJCQkgIEVORF9PRl9BUkdTKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sICAgICAgICAgICAgJlRtcExlbiwKKwkJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkh0Q2FwSWUsCisJCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZIdExlbiwKKwkJCQkJCQkJIHNpemVvZihIVF9DQVBBQklMSVRZX0lFKSwgICAgICAgICAgJnBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eSwKKwkJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkFkZEh0SW5mb0llLAorCQkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQWRkSHRMZW4sCisJCQkJCQkJCSBzaXplb2YoQUREX0hUX0lORk9fSUUpLCAgICAgICAgICAmcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLAorCQkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmTmV3RXh0Q2hhbkllLAorCQkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmTmV3RXh0TGVuLAorCQkJCQkJCQkgc2l6ZW9mKE5FV19FWFRfQ0hBTl9JRSksICAgICAgICAgICZwQWQtPkNvbW1vbkNmZy5OZXdFeHRDaGFuT2Zmc2V0LAorCQkJCQkJCQkgIEVORF9PRl9BUkdTKTsKKwkJCQl9CisJCQkJRnJhbWVMZW4gKz0gVG1wTGVuOworCQkJfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQkJTWluaXBvcnRNTVJlcXVlc3QocEFkLCAwLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7CisJCQlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOworCQl9CisJfQorfQorCitWT0lEIEJlYWNvblRpbWVvdXRBdEpvaW5BY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCVVTSE9SVCBTdGF0dXM7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU1lOQyAtIEJlYWNvblRpbWVvdXRBdEpvaW5BY3Rpb25cbiIpKTsKKwlwQWQtPk1sbWUuU3luY01hY2hpbmUuQ3VyclN0YXRlID0gU1lOQ19JRExFOworCVN0YXR1cyA9IE1MTUVfUkVKX1RJTUVPVVQ7CisJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX0pPSU5fQ09ORiwgMiwgJlN0YXR1cyk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJU2NhbiB0aW1lb3V0IHByb2NlZHVyZS4gYmFzaWNhbGx5IGFkZCBjaGFubmVsIGluZGV4IGJ5IDEgYW5kIHJlc2NhbgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgU2NhblRpbWVvdXRBY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCXBBZC0+TWxtZUF1eC5DaGFubmVsID0gTmV4dENoYW5uZWwocEFkLCBwQWQtPk1sbWVBdXguQ2hhbm5lbCk7CisKKwkvLyBPbmx5IG9uZSBjaGFubmVsIHNjYW5uZWQgZm9yIENJU0NPIGJlYWNvbiByZXF1ZXN0CisJaWYgKChwQWQtPk1sbWVBdXguU2NhblR5cGUgPT0gU0NBTl9DSVNDT19BQ1RJVkUpIHx8CisJCShwQWQtPk1sbWVBdXguU2NhblR5cGUgPT0gU0NBTl9DSVNDT19QQVNTSVZFKSB8fAorCQkocEFkLT5NbG1lQXV4LlNjYW5UeXBlID09IFNDQU5fQ0lTQ09fTk9JU0UpIHx8CisJCShwQWQtPk1sbWVBdXguU2NhblR5cGUgPT0gU0NBTl9DSVNDT19DSEFOTkVMX0xPQUQpKQorCQlwQWQtPk1sbWVBdXguQ2hhbm5lbCA9IDA7CisKKwkvLyB0aGlzIHJvdXRpbmUgd2lsbCBzdG9wIGlmIHBBZC0+TWxtZUF1eC5DaGFubmVsID09IDAKKwlTY2FuTmV4dENoYW5uZWwocEFkKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgSW52YWxpZFN0YXRlV2hlblNjYW4oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCVVTSE9SVCBTdGF0dXM7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVlOQyAtIEludmFsaWRTdGF0ZVdoZW5TY2FuKHN0YXRlPSVsZCkuIFJlc2V0IFNZTkMgbWFjaGluZVxuIiwgcEFkLT5NbG1lLlN5bmNNYWNoaW5lLkN1cnJTdGF0ZSkpOworCXBBZC0+TWxtZS5TeW5jTWFjaGluZS5DdXJyU3RhdGUgPSBTWU5DX0lETEU7CisJU3RhdHVzID0gTUxNRV9TVEFURV9NQUNISU5FX1JFSkVDVDsKKwlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfU0NBTl9DT05GLCAyLCAmU3RhdHVzKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgSW52YWxpZFN0YXRlV2hlbkpvaW4oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCVVTSE9SVCBTdGF0dXM7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSW52YWxpZFN0YXRlV2hlbkpvaW4oc3RhdGU9JWxkKS4gUmVzZXQgU1lOQyBtYWNoaW5lXG4iLCBwQWQtPk1sbWUuU3luY01hY2hpbmUuQ3VyclN0YXRlKSk7CisJcEFkLT5NbG1lLlN5bmNNYWNoaW5lLkN1cnJTdGF0ZSA9IFNZTkNfSURMRTsKKwlTdGF0dXMgPSBNTE1FX1NUQVRFX01BQ0hJTkVfUkVKRUNUOworCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9KT0lOX0NPTkYsIDIsICZTdGF0dXMpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBJbnZhbGlkU3RhdGVXaGVuU3RhcnQoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCVVTSE9SVCBTdGF0dXM7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSW52YWxpZFN0YXRlV2hlblN0YXJ0KHN0YXRlPSVsZCkuIFJlc2V0IFNZTkMgbWFjaGluZVxuIiwgcEFkLT5NbG1lLlN5bmNNYWNoaW5lLkN1cnJTdGF0ZSkpOworCXBBZC0+TWxtZS5TeW5jTWFjaGluZS5DdXJyU3RhdGUgPSBTWU5DX0lETEU7CisJU3RhdHVzID0gTUxNRV9TVEFURV9NQUNISU5FX1JFSkVDVDsKKwlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfU1RBUlRfQ09ORiwgMiwgJlN0YXR1cyk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBFbnF1ZXVlUHNQb2xsKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworI2lmZGVmIFJBTElOS19BVEUKKyAgICBpZiAoQVRFX09OKHBBZCkpCisgICAgeworCQlyZXR1cm47CisgICAgfQorI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKworCisJaWYgKHBBZC0+U3RhQ2ZnLldpbmRvd3NQb3dlck1vZGUgPT0gTmRpczgwMl8xMVBvd2VyTW9kZUxlZ2FjeV9QU1ApCisgICAgCXBBZC0+UHNQb2xsRnJhbWUuRkMuUHdyTWdtdCA9IFBXUl9TQVZFOworCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgMCwgKFBVQ0hBUikmcEFkLT5Qc1BvbGxGcmFtZSwgc2l6ZW9mKFBTUE9MTF9GUkFNRSkpOworfQorCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIEVucXVldWVQcm9iZVJlcXVlc3QoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJTkRJU19TVEFUVVMgICAgIE5TdGF0ZTsKKwlQVUNIQVIgICAgICAgICAgcE91dEJ1ZmZlcjsKKwlVTE9ORyAgICAgICAgICAgRnJhbWVMZW4gPSAwOworCUhFQURFUl84MDJfMTEgICBIZHI4MDIxMTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoImZvcmNlIG91dCBhIFByb2JlUmVxdWVzdCAuLi5cbiIpKTsKKworCU5TdGF0ZSA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKKwlpZiAoTlN0YXRlID09IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJeworCQlNZ3RNYWNIZWFkZXJJbml0KHBBZCwgJkhkcjgwMjExLCBTVUJUWVBFX1BST0JFX1JFUSwgMCwgQlJPQURDQVNUX0FERFIsIEJST0FEQ0FTVF9BRERSKTsKKworCQkvLyB0aGlzIFByb2JlUmVxdWVzdCBleHBsaWNpdGx5IHNwZWNpZnkgU1NJRCB0byByZWR1Y2UgdW53YW50ZWQgUHJvYmVSZXNwb25zZQorCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAgICAgICAgICAgICAgICAgICAgICZGcmFtZUxlbiwKKwkJCQkJCSAgc2l6ZW9mKEhFQURFUl84MDJfMTEpLCAgICAgICAgICAmSGRyODAyMTEsCisJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlNzaWRJZSwKKwkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEFkLT5Db21tb25DZmcuU3NpZExlbiwKKwkJCQkJCSAgcEFkLT5Db21tb25DZmcuU3NpZExlbiwJCSAgcEFkLT5Db21tb25DZmcuU3NpZCwKKwkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3VwUmF0ZUllLAorCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQWQtPlN0YUFjdGl2ZS5TdXBSYXRlTGVuLAorCQkJCQkJICBwQWQtPlN0YUFjdGl2ZS5TdXBSYXRlTGVuLCAgICAgIHBBZC0+U3RhQWN0aXZlLlN1cFJhdGUsCisJCQkJCQkgIEVORF9PRl9BUkdTKTsKKwkJTWluaXBvcnRNTVJlcXVlc3QocEFkLCAwLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7CisJCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7CisJfQorCit9CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKyNpZmRlZiBET1QxMU5fRFJBRlQzCitWT0lEIEJ1aWxkRWZmZWN0ZWRDaGFubmVsTGlzdCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlVQ0hBUgkJRUNoYW5uZWxbMTFdOworCVVDSEFSCQlpLCBqLCBrOworCVVDSEFSCQlVcHBlckNoYW5uZWwgPSAwLCBMb3dlckNoYW5uZWwgPSAwOworCisJUlRNUFplcm9NZW1vcnkoRUNoYW5uZWwsIDExKTsKKwlpID0gMDsKKwkvLyBGaW5kIHVwcGVyIGNoYW5uZWwgYW5kIGxvd2VyIGNoYW5uZWwuCisJaWYgKHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsIDwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkKKwl7CisJCVVwcGVyQ2hhbm5lbCA9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWw7CisJCUxvd2VyQ2hhbm5lbCA9IHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsOworCX0KKwllbHNlIGlmIChwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA+IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpCisJeworCQlVcHBlckNoYW5uZWwgPSBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbDsKKwkJTG93ZXJDaGFubmVsID0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbDsKKwl9CisJZWxzZQorCXsKKwkJcmV0dXJuOworCX0KKworCS8vIFJlY29yZCBjaGFubmVscyB0aGF0IGlzIGJlbG93IGxvd2VyIGNoYW5uZWwuLgorCWlmIChMb3dlckNoYW5uZWwgPiAxKQorCXsKKwkJRUNoYW5uZWxbMF0gPSBMb3dlckNoYW5uZWwgLSAxOworCQlpID0gMTsKKwkJaWYgKExvd2VyQ2hhbm5lbCA+IDIpCisJCXsKKwkJCUVDaGFubmVsWzFdID0gTG93ZXJDaGFubmVsIC0gMjsKKwkJCWkgPSAyOworCQkJaWYgKExvd2VyQ2hhbm5lbCA+IDMpCisJCQl7CisJCQkJRUNoYW5uZWxbMl0gPSBMb3dlckNoYW5uZWwgLSAzOworCQkJCWkgPSAzOworCQkJfQorCQl9CisJfQorCS8vIFJlY29yZCBjaGFubmVscyB0aGF0IGlzIGJldHdlZW4gIGxvd2VyIGNoYW5uZWwgYW5kIHVwcGVyIGNoYW5uZWwuCisJZm9yIChrID0gTG93ZXJDaGFubmVsO2sgPCBVcHBlckNoYW5uZWw7aysrKQorCXsKKwkJRUNoYW5uZWxbaV0gPSBrOworCQlpKys7CisJfQorCS8vIFJlY29yZCBjaGFubmVscyB0aGF0IGlzIGFib3ZlIHVwcGVyIGNoYW5uZWwuLgorCWlmIChMb3dlckNoYW5uZWwgPCAxMSkKKwl7CisJCUVDaGFubmVsW2ldID0gVXBwZXJDaGFubmVsICsgMTsKKwkJaSsrOworCQlpZiAoTG93ZXJDaGFubmVsIDwgMTApCisJCXsKKwkJCUVDaGFubmVsW2ldID0gTG93ZXJDaGFubmVsICsgMjsKKwkJCWkrKzsKKwkJCWlmIChMb3dlckNoYW5uZWwgPCA5KQorCQkJeworCQkJCUVDaGFubmVsW2ldID0gTG93ZXJDaGFubmVsICsgMzsKKwkJCQlpKys7CisJCQl9CisJCX0KKwl9CisJLy8KKwlmb3IgKGogPSAwO2ogPCBpO2orKykKKwl7CisJCWZvciAoayA9IDA7ayA8IHBBZC0+Q2hhbm5lbExpc3ROdW07aysrKQorCQl7CisJCQlpZiAocEFkLT5DaGFubmVsTGlzdFtrXS5DaGFubmVsID09IEVDaGFubmVsW2pdKQorCQkJeworCQkJCXBBZC0+Q2hhbm5lbExpc3Rba10uYkVmZmVjdGVkQ2hhbm5lbCA9IFRSVUU7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCIgRWZmZWN0ZWRDaGFubmVsKCA9JWQpXG4iLCBFQ2hhbm5lbFtqXSkpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorfQorI2VuZGlmIC8vIERPVDExTl9EUkFGVDMgLy8KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworQk9PTEVBTiBTY2FuUnVubmluZygKKwkJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJcmV0dXJuIChwQWQtPk1sbWUuU3luY01hY2hpbmUuQ3VyclN0YXRlID09IFNDQU5fTElTVEVOKSA/IFRSVUUgOiBGQUxTRTsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9zdGEvd3BhLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3N0YS93cGEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjI2ZGNkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9zdGEvd3BhLmMKQEAgLTAsMCArMSwyMTA3IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCU1vZHVsZSBOYW1lOgorCXdwYS5jCisKKwlBYnN0cmFjdDoKKworCVJldmlzaW9uIEhpc3Rvcnk6CisJV2hvCQkJV2hlbgkJCVdoYXQKKwktLS0tLS0tLQktLS0tLS0tLS0tCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJSmFuCUxlZQkJMDMtMDctMjIJCUluaXRpYWwKKwlQYXVsIExpbgkwMy0xMS0yOAkJTW9kaWZ5IGZvciBzdXBwbGljYW50CisqLworI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgorCisjZGVmaW5lCQlXUEFSU05JRQkweGRkCisjZGVmaW5lCQlXUEEyUlNOSUUJMHgzMAorCisvL2V4dGVybiBVQ0hBUiBCSVQ4W107CitVQ0hBUglDaXBoZXJXcGFQc2tUa2lwW10gPSB7CisJCTB4REQsIDB4MTYsCQkJCS8vIFJTTiBJRQorCQkweDAwLCAweDUwLCAweGYyLCAweDAxLAkvLyBvdWkKKwkJMHgwMSwgMHgwMCwJCQkJLy8gVmVyc2lvbgorCQkweDAwLCAweDUwLCAweGYyLCAweDAyLAkvLyBNdWx0aWNhc3QKKwkJMHgwMSwgMHgwMCwJCQkJLy8gTnVtYmVyIG9mIHVuaWNhc3QKKwkJMHgwMCwgMHg1MCwgMHhmMiwgMHgwMiwJLy8gdW5pY2FzdAorCQkweDAxLCAweDAwLAkJCQkvLyBudW1iZXIgb2YgYXV0aGVudGljYXRpb24gbWV0aG9kCisJCTB4MDAsIDB4NTAsIDB4ZjIsIDB4MDIJLy8gYXV0aGVudGljYXRpb24KKwkJfTsKK1VDSEFSCUNpcGhlcldwYVBza1RraXBMZW4gPSAoc2l6ZW9mKENpcGhlcldwYVBza1RraXApIC8gc2l6ZW9mKFVDSEFSKSk7CisKK1VDSEFSCUNpcGhlcldwYVBza0Flc1tdID0geworCQkweERELCAweDE2LCAJCQkvLyBSU04gSUUKKwkJMHgwMCwgMHg1MCwgMHhmMiwgMHgwMSwJLy8gb3VpCisJCTB4MDEsIDB4MDAsCQkJCS8vIFZlcnNpb24KKwkJMHgwMCwgMHg1MCwgMHhmMiwgMHgwNCwJLy8gTXVsdGljYXN0CisJCTB4MDEsIDB4MDAsCQkJCS8vIE51bWJlciBvZiB1bmljYXN0CisJCTB4MDAsIDB4NTAsIDB4ZjIsIDB4MDQsCS8vIHVuaWNhc3QKKwkJMHgwMSwgMHgwMCwJCQkJLy8gbnVtYmVyIG9mIGF1dGhlbnRpY2F0aW9uIG1ldGhvZAorCQkweDAwLCAweDUwLCAweGYyLCAweDAyCS8vIGF1dGhlbnRpY2F0aW9uCisJCX07CitVQ0hBUglDaXBoZXJXcGFQc2tBZXNMZW4gPSAoc2l6ZW9mKENpcGhlcldwYVBza0FlcykgLyBzaXplb2YoVUNIQVIpKTsKKworVUNIQVIJQ2lwaGVyU3VpdGVDaXNjb0NDS01bXSA9IHsKKwkJMHhERCwgMHgxNiwJCQkJLy8gUlNOIElFCisJCTB4MDAsIDB4NTAsIDB4ZjIsIDB4MDEsIC8vIG91aQorCQkweDAxLCAweDAwLAkJCQkvLyBWZXJzaW9uCisJCTB4MDAsIDB4NDAsIDB4OTYsIDB4MDEsIC8vIE11bHRpY2FzdAorCQkweDAxLCAweDAwLAkJCQkvLyBOdW1iZXIgb2YgdWljYXN0CisJCTB4MDAsIDB4NDAsIDB4OTYsIDB4MDEsIC8vIHVuaWNhc3QKKwkJMHgwMSwgMHgwMCwJCQkJLy8gbnVtYmVyIG9mIGF1dGhlbnRpY2F0aW9uIG1ldGhvZAorCQkweDAwLCAweDQwLCAweDk2LCAweDAwICAvLyBBdXRoZW50aWNhdGlvbgorCQl9OworVUNIQVIJQ2lwaGVyU3VpdGVDaXNjb0NDS01MZW4gPSAoc2l6ZW9mKENpcGhlclN1aXRlQ2lzY29DQ0tNKSAvIHNpemVvZihVQ0hBUikpOworCitVQ0hBUglDaXBoZXJTdWl0ZUNpc2NvQ0NLTTI0W10gPSB7CisJCTB4REQsIDB4MTgsCQkJCS8vIFJTTiBJRQorCQkweDAwLCAweDUwLCAweGYyLCAweDAxLCAvLyBvdWkKKwkJMHgwMSwgMHgwMCwJCQkJLy8gVmVyc2lvbgorCQkweDAwLCAweDQwLCAweDk2LCAweDAxLCAvLyBNdWx0aWNhc3QKKwkJMHgwMSwgMHgwMCwJCQkJLy8gTnVtYmVyIG9mIHVpY2FzdAorCQkweDAwLCAweDQwLCAweDk2LCAweDAxLCAvLyB1bmljYXN0CisJCTB4MDEsIDB4MDAsCQkJCS8vIG51bWJlciBvZiBhdXRoZW50aWNhdGlvbiBtZXRob2QKKwkJMHgwMCwgMHg0MCwgMHg5NiwgMHgwMCwKKwkJMHgyOCwgMHgwMC8vIEF1dGhlbnRpY2F0aW9uCisJCX07CisKK1VDSEFSCUNpcGhlclN1aXRlQ2lzY29DQ0tNMjRMZW4gPSAoc2l6ZW9mKENpcGhlclN1aXRlQ2lzY29DQ0tNMjQpIC8gc2l6ZW9mKFVDSEFSKSk7CisKK1VDSEFSCUNpcGhlclN1aXRlQ0NYVGtpcFtdID0geworCQkweERELCAweDE2LAkJCQkvLyBSU04gSUUKKwkJMHgwMCwgMHg1MCwgMHhmMiwgMHgwMSwJLy8gb3VpCisJCTB4MDEsIDB4MDAsCQkJCS8vIFZlcnNpb24KKwkJMHgwMCwgMHg1MCwgMHhmMiwgMHgwMiwJLy8gTXVsdGljYXN0CisJCTB4MDEsIDB4MDAsCQkJCS8vIE51bWJlciBvZiB1bmljYXN0CisJCTB4MDAsIDB4NTAsIDB4ZjIsIDB4MDIsCS8vIHVuaWNhc3QKKwkJMHgwMSwgMHgwMCwJCQkJLy8gbnVtYmVyIG9mIGF1dGhlbnRpY2F0aW9uIG1ldGhvZAorCQkweDAwLCAweDUwLCAweGYyLCAweDAxCS8vIGF1dGhlbnRpY2F0aW9uCisJCX07CitVQ0hBUglDaXBoZXJTdWl0ZUNDWFRraXBMZW4gPSAoc2l6ZW9mKENpcGhlclN1aXRlQ0NYVGtpcCkgLyBzaXplb2YoVUNIQVIpKTsKKworVUNIQVIJQ0NYX0xMQ19IRFJbXSA9IHsweEFBLCAweEFBLCAweDAzLCAweDAwLCAweDQwLCAweDk2LCAweDAwLCAweDAyfTsKK1VDSEFSCUxMQ19OT1JNQUxbXSA9IHsweEFBLCAweEFBLCAweDAzLCAweDAwLCAweDAwLCAweDAwfTsKKworVUNIQVIJRUFQT0xfRlJBTUVbXSA9IHsweDg4LCAweDhFfTsKKworQk9PTEVBTiBDaGVja1JTTklFKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBQVUNIQVIgICAgICAgICAgcERhdGEsCisJSU4gIFVDSEFSICAgICAgICAgICBEYXRhTGVuLAorCU9VVAlVQ0hBUgkJCSpPZmZzZXQpOworCit2b2lkIGluY19ieXRlX2FycmF5KFVDSEFSICpjb3VudGVyLCBpbnQgbGVuKTsKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCUNsYXNzaWZ5IFdQQSBFQVAgbWVzc2FnZSB0eXBlCisKKwlBcmd1bWVudHM6CisJCUVBUFR5cGUJCVZhbHVlIG9mIEVBUCBtZXNzYWdlIHR5cGUKKwkJTXNnVHlwZQkJSW50ZXJuYWwgTWVzc2FnZSBkZWZpbml0aW9uIGZvciBNTE1FIHN0YXRlIG1hY2hpbmUKKworCVJldHVybiBWYWx1ZToKKwkJVFJVRQkJRm91bmQgYXBwcm9wcmlhdGUgbWVzc2FnZSB0eXBlCisJCUZBTFNFCQlObyBhcHByb3ByaWF0ZSBtZXNzYWdlIHR5cGUKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJTm90ZToKKwkJQWxsIHRoZXNlIGNvbnN0YW50cyBhcmUgZGVmaW5lZCBpbiB3cGEuaAorCQlGb3Igc3VwcGxpY2FudCwgdGhlcmUgaXMgb25seSBFQVBPTCBLZXkgbWVzc2FnZSBhdmFsaWFibGUKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0JPT0xFQU4JV3BhTXNnVHlwZVN1YnN0KAorCUlOCVVDSEFSCUVBUFR5cGUsCisJT1VUCUlOVAkJKk1zZ1R5cGUpCit7CisJc3dpdGNoIChFQVBUeXBlKQorCXsKKwkJY2FzZSBFQVBQYWNrZXQ6CisJCQkqTXNnVHlwZSA9IE1UMl9FQVBQYWNrZXQ7CisJCQlicmVhazsKKwkJY2FzZSBFQVBPTFN0YXJ0OgorCQkJKk1zZ1R5cGUgPSBNVDJfRUFQT0xTdGFydDsKKwkJCWJyZWFrOworCQljYXNlIEVBUE9MTG9nb2ZmOgorCQkJKk1zZ1R5cGUgPSBNVDJfRUFQT0xMb2dvZmY7CisJCQlicmVhazsKKwkJY2FzZSBFQVBPTEtleToKKwkJCSpNc2dUeXBlID0gTVQyX0VBUE9MS2V5OworCQkJYnJlYWs7CisJCWNhc2UgRUFQT0xBU0ZBbGVydDoKKwkJCSpNc2dUeXBlID0gTVQyX0VBUE9MQVNGQWxlcnQ7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiBGQUxTRTsKKwl9CisJcmV0dXJuIFRSVUU7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJYXNzb2NpYXRpb24Jc3RhdGUgbWFjaGluZSBpbml0LAlpbmNsdWRpbmcgc3RhdGUJdHJhbnNpdGlvbiBhbmQgdGltZXIgaW5pdAorCVBhcmFtZXRlcnM6CisJCVMgLQlwb2ludGVyCXRvIHRoZSBhc3NvY2lhdGlvbiBzdGF0ZSBtYWNoaW5lCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBXcGFQc2tTdGF0ZU1hY2hpbmVJbml0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVNUQVRFX01BQ0hJTkUgKlMsCisJT1VUCVNUQVRFX01BQ0hJTkVfRlVOQyBUcmFuc1tdKQoreworCVN0YXRlTWFjaGluZUluaXQoUywJVHJhbnMsIE1BWF9XUEFfUFNLX1NUQVRFLCBNQVhfV1BBX1BTS19NU0csIChTVEFURV9NQUNISU5FX0ZVTkMpRHJvcCwgV1BBX1BTS19JRExFLCBXUEFfTUFDSElORV9CQVNFKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgV1BBX1BTS19JRExFLCBNVDJfRUFQT0xLZXksIChTVEFURV9NQUNISU5FX0ZVTkMpV3BhRUFQT0xLZXlBY3Rpb24pOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVRoaXMgaXMJc3RhdGUgbWFjaGluZSBmdW5jdGlvbi4KKwkJV2hlbiByZWNlaXZpbmcgRUFQT0wgcGFja2V0cyB3aGljaCBpcyAgZm9yIDgwMi4xeCBrZXkgbWFuYWdlbWVudC4KKwkJVXNlCWJvdGggaW4JV1BBLCBhbmQgV1BBUFNLCWNhc2UuCisJCUluIHRoaXMJZnVuY3Rpb24sIGZ1cnRoZXIgZGlzcGF0Y2ggdG8gZGlmZmVyZW50CWZ1bmN0aW9ucyBhY2NvcmRpbmcJdG8gdGhlIHJlY2VpdmVkCXBhY2tldC4JIDMgY2F0ZWdvcmllcyBhcmUgOgorCQkgIDEuICBub3JtYWwgNC13YXkgcGFpcndpc2VrZXkgYW5kIDItd2F5IGdyb3Vwa2V5IGhhbmRzaGFrZQorCQkgIDIuICBNSUMgZXJyb3IJKENvdW50ZXJtZWFzdXJlcyBhdHRhY2spICByZXBvcnQgcGFja2V0CWZyb20gU1RBLgorCQkgIDMuICBSZXF1ZXN0IGZvciBwYWlyd2lzZS9ncm91cCBrZXkgdXBkYXRlCWZyb20gU1RBCisJUmV0dXJuOgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBXcGFFQVBPTEtleUFjdGlvbigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglNTE1FX1FVRVVFX0VMRU0JKkVsZW0pCisKK3sKKwlJTlQgICAgICAgICAgICAgTXNnVHlwZSA9IEVBUE9MX01TR19JTlZBTElEOworCVBLRVlfREVTQ1JJUFRFUiBwS2V5RGVzYzsKKwlQSEVBREVSXzgwMl8xMSAgcEhlYWRlcjsgLy9yZWQKKwlVQ0hBUiAgICAgICAgICAgWmVyb1JlcGxheVtMRU5fS0VZX0RFU0NfUkVQTEFZXTsKKwlVQ0hBUiBFYXBvbFZyOworCUtFWV9JTkZPCQlwZWVyS2V5SW5mbzsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tLS0tPiBXcGFFQVBPTEtleUFjdGlvblxuIikpOworCisJLy8gR2V0IDgwMi4xMSBoZWFkZXIgZmlyc3QKKwlwSGVhZGVyID0gKFBIRUFERVJfODAyXzExKSBFbGVtLT5Nc2c7CisKKwkvLyBHZXQgRUFQb0wtS2V5IERlc2NyaXB0b3IKKwlwS2V5RGVzYyA9IChQS0VZX0RFU0NSSVBURVIpICZFbGVtLT5Nc2dbKExFTkdUSF84MDJfMTEgKyBMRU5HVEhfODAyXzFfSCArIExFTkdUSF9FQVBPTF9IKV07CisKKwlOZGlzWmVyb01lbW9yeSgoUFVDSEFSKSZwZWVyS2V5SW5mbywgc2l6ZW9mKHBlZXJLZXlJbmZvKSk7CisJTmRpc01vdmVNZW1vcnkoKFBVQ0hBUikmcGVlcktleUluZm8sIChQVUNIQVIpJnBLZXlEZXNjLT5LZXlJbmZvLCBzaXplb2YoS0VZX0lORk8pKTsKKworCSooKFVTSE9SVCAqKSZwZWVyS2V5SW5mbykgPSBjcHUybGUxNigqKChVU0hPUlQgKikmcGVlcktleUluZm8pKTsKKworCisJLy8gMS4gQ2hlY2sgRUFQT0wgZnJhbWUgdmVyc2lvbiBhbmQgdHlwZQorCUVhcG9sVnIJPSAoVUNIQVIpIEVsZW0tPk1zZ1tMRU5HVEhfODAyXzExK0xFTkdUSF84MDJfMV9IXTsKKworICAgIGlmICgoKEVhcG9sVnIgIT0gRUFQT0xfVkVSKSAmJiAoRWFwb2xWciAhPSBFQVBPTF9WRVIyKSkgfHwgKChwS2V5RGVzYy0+VHlwZSAhPSBXUEExX0tFWV9ERVNDKSAmJiAocEtleURlc2MtPlR5cGUgIT0gV1BBMl9LRVlfREVTQykpKQorCXsKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiS2V5IGRlc2NyaXB0ZXIgZG9lcyBub3QgbWF0Y2ggd2l0aCBXUEEgcnVsZVxuIikpOworCQkJcmV0dXJuOworCX0KKworCS8vIEZpcnN0IHZhbGlkYXRlIHJlcGxheSBjb3VudGVyLCBvbmx5IGFjY2VwdCBtZXNzYWdlIHdpdGggbGFyZ2VyIHJlcGxheSBjb3VudGVyCisJLy8gTGV0IGVxdWFsIHBhc3MsIHNvbWUgQVAgc3RhcnQgd2l0aCBhbGwgemVybyByZXBsYXkgY291bnRlcgorCU5kaXNaZXJvTWVtb3J5KFplcm9SZXBsYXksIExFTl9LRVlfREVTQ19SRVBMQVkpOworCisJaWYoKFJUTVBDb21wYXJlTWVtb3J5KHBLZXlEZXNjLT5SZXBsYXlDb3VudGVyLCBwQWQtPlN0YUNmZy5SZXBsYXlDb3VudGVyLCBMRU5fS0VZX0RFU0NfUkVQTEFZKSAhPSAxKSAmJgorCQkoUlRNUENvbXBhcmVNZW1vcnkocEtleURlc2MtPlJlcGxheUNvdW50ZXIsIFplcm9SZXBsYXksIExFTl9LRVlfREVTQ19SRVBMQVkpICE9IDApKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiICAgUmVwbGF5Q291bnRlciBub3QgbWF0Y2ggICBcbiIpKTsKKwkJcmV0dXJuOworCX0KKworCS8vIFByb2Nlc3MgV1BBMlBTSyBmcmFtZQorCWlmKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spCisJeworCQlpZigocGVlcktleUluZm8uS2V5VHlwZSA9PSBQQUlSV0lTRUtFWSkgJiYKKwkJCShwZWVyS2V5SW5mby5FS0RfREwgPT0gMCkgJiYKKwkJCShwZWVyS2V5SW5mby5LZXlBY2sgPT0gMSkgJiYKKwkJCShwZWVyS2V5SW5mby5LZXlNaWMgPT0gMCkgJiYKKwkJCShwZWVyS2V5SW5mby5TZWN1cmUgPT0gMCkgJiYKKwkJCShwZWVyS2V5SW5mby5FcnJvciA9PSAwKSAmJgorCQkJKHBlZXJLZXlJbmZvLlJlcXVlc3QgPT0gMCkpCisJCXsKKwkJCU1zZ1R5cGUgPSBFQVBPTF9QQUlSX01TR18xOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmVjZWl2ZSBFQVBPTCBLZXkgUGFpcndpc2UgTWVzc2FnZSAxXG4iKSk7CisJCX0gZWxzZSBpZigocGVlcktleUluZm8uS2V5VHlwZSA9PSBQQUlSV0lTRUtFWSkgJiYKKwkJCShwZWVyS2V5SW5mby5FS0RfREwgID09IDEpICYmCisJCQkocGVlcktleUluZm8uS2V5QWNrID09IDEpICYmCisJCQkocGVlcktleUluZm8uS2V5TWljID09IDEpICYmCisJCQkocGVlcktleUluZm8uU2VjdXJlID09IDEpICYmCisJCQkocGVlcktleUluZm8uRXJyb3IgPT0gMCkgJiYKKwkJCShwZWVyS2V5SW5mby5SZXF1ZXN0ID09IDApKQorCQl7CisJCQlNc2dUeXBlID0gRUFQT0xfUEFJUl9NU0dfMzsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJlY2VpdmUgRUFQT0wgS2V5IFBhaXJ3aXNlIE1lc3NhZ2UgM1xuIikpOworCQl9IGVsc2UgaWYoKHBlZXJLZXlJbmZvLktleVR5cGUgPT0gR1JPVVBLRVkpICYmCisJCQkocGVlcktleUluZm8uRUtEX0RMID09IDEpICYmCisJCQkocGVlcktleUluZm8uS2V5QWNrID09IDEpICYmCisJCQkocGVlcktleUluZm8uS2V5TWljID09IDEpICYmCisJCQkocGVlcktleUluZm8uU2VjdXJlID09IDEpICYmCisJCQkocGVlcktleUluZm8uRXJyb3IgPT0gMCkgJiYKKwkJCShwZWVyS2V5SW5mby5SZXF1ZXN0ID09IDApKQorCQl7CisJCQlNc2dUeXBlID0gRUFQT0xfR1JPVVBfTVNHXzE7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSZWNlaXZlIEVBUE9MIEtleSBHcm91cCBNZXNzYWdlIDFcbiIpKTsKKwkJfQorCisJCS8vIFdlIHdpbGwgYXNzdW1lIGxpbmsgaXMgdXAgKGFzc29jIHN1Y2Vlc3MgYW5kIHBvcnQgbm90IHNlY3VyZWQpLgorCQkvLyBBbGwgc3RhdGUgaGFzIHRvIGJlIGFibGUgdG8gcHJvY2VzcyBtZXNzYWdlIGZyb20gcHJldmlvdXMgc3RhdGUKKwkJc3dpdGNoKHBBZC0+U3RhQ2ZnLldwYVN0YXRlKQorCQl7CisJCWNhc2UgU1NfU1RBUlQ6CisJCQlpZihNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzEpCisJCQl7CisJCQkJV3BhMlBhaXJNc2cxQWN0aW9uKHBBZCwgRWxlbSk7CisJCQkJcEFkLT5TdGFDZmcuV3BhU3RhdGUgPSBTU19XQUlUX01TR18zOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBTU19XQUlUX01TR18zOgorCQkJaWYoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18xKQorCQkJeworCQkJCVdwYTJQYWlyTXNnMUFjdGlvbihwQWQsIEVsZW0pOworCQkJCXBBZC0+U3RhQ2ZnLldwYVN0YXRlID0gU1NfV0FJVF9NU0dfMzsKKwkJCX0KKwkJCWVsc2UgaWYoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18zKQorCQkJeworCQkJCVdwYTJQYWlyTXNnM0FjdGlvbihwQWQsIEVsZW0pOworCQkJCXBBZC0+U3RhQ2ZnLldwYVN0YXRlID0gU1NfV0FJVF9HUk9VUDsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgU1NfV0FJVF9HUk9VUDoJCS8vIFdoZW4gZG9pbmcgZ3JvdXAga2V5IGV4Y2hhbmdlCisJCWNhc2UgU1NfRklOSVNIOgkJCS8vIFRoaXMgaGFwcGVuZWQgd2hlbiB1cGRhdGUgZ3JvdXAga2V5CisJCQlpZihNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzEpCisJCQl7CisJCQkgICAgLy8gUmVzZXQgcG9ydCBzZWN1cmVkIHZhcmlhYmxlCisJCQkJcEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQ7CisJCQkJV3BhMlBhaXJNc2cxQWN0aW9uKHBBZCwgRWxlbSk7CisJCQkJcEFkLT5TdGFDZmcuV3BhU3RhdGUgPSBTU19XQUlUX01TR18zOworCQkJfQorCQkJZWxzZSBpZihNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzMpCisJCQl7CisJCQkgICAgLy8gUmVzZXQgcG9ydCBzZWN1cmVkIHZhcmlhYmxlCisJCQkJcEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQ7CisJCQkJV3BhMlBhaXJNc2czQWN0aW9uKHBBZCwgRWxlbSk7CisJCQkJcEFkLT5TdGFDZmcuV3BhU3RhdGUgPSBTU19XQUlUX0dST1VQOworCQkJfQorCQkJZWxzZSBpZihNc2dUeXBlID09IEVBUE9MX0dST1VQX01TR18xKQorCQkJeworCQkJCVdwYUdyb3VwTXNnMUFjdGlvbihwQWQsIEVsZW0pOworCQkJCXBBZC0+U3RhQ2ZnLldwYVN0YXRlID0gU1NfRklOSVNIOworCQkJfQorCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJfQorCS8vIFByb2Nlc3MgV1BBUFNLIEZyYW1lCisJLy8gQ2xhc3NpZnkgbWVzc2FnZSBUeXBlLCBlaXRoZXIgcGFpcndpc2UgbWVzc2FnZSAxLCAzLCBvciBncm91cCBtZXNzYWdlIDEgZm9yIHN1cHBsaWNhbnQKKwllbHNlIGlmKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykKKwl7CisJCWlmKChwZWVyS2V5SW5mby5LZXlUeXBlID09IFBBSVJXSVNFS0VZKSAmJgorCQkJKHBlZXJLZXlJbmZvLktleUluZGV4ID09IDApICYmCisJCQkocGVlcktleUluZm8uS2V5QWNrID09IDEpICYmCisJCQkocGVlcktleUluZm8uS2V5TWljID09IDApICYmCisJCQkocGVlcktleUluZm8uU2VjdXJlID09IDApICYmCisJCQkocGVlcktleUluZm8uRXJyb3IgPT0gMCkgJiYKKwkJCShwZWVyS2V5SW5mby5SZXF1ZXN0ID09IDApKQorCQl7CisJCQlNc2dUeXBlID0gRUFQT0xfUEFJUl9NU0dfMTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJlY2VpdmUgRUFQT0wgS2V5IFBhaXJ3aXNlIE1lc3NhZ2UgMVxuIikpOworCQl9CisJCWVsc2UgaWYoKHBlZXJLZXlJbmZvLktleVR5cGUgPT0gUEFJUldJU0VLRVkpICYmCisJCQkocGVlcktleUluZm8uS2V5SW5kZXggPT0gMCkgJiYKKwkJCShwZWVyS2V5SW5mby5LZXlBY2sgPT0gMSkgJiYKKwkJCShwZWVyS2V5SW5mby5LZXlNaWMgPT0gMSkgJiYKKwkJCShwZWVyS2V5SW5mby5TZWN1cmUgPT0gMCkgJiYKKwkJCShwZWVyS2V5SW5mby5FcnJvciA9PSAwKSAmJgorCQkJKHBlZXJLZXlJbmZvLlJlcXVlc3QgPT0gMCkpCisJCXsKKwkJCU1zZ1R5cGUgPSBFQVBPTF9QQUlSX01TR18zOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmVjZWl2ZSBFQVBPTCBLZXkgUGFpcndpc2UgTWVzc2FnZSAzXG4iKSk7CisJCX0KKwkJZWxzZSBpZigocGVlcktleUluZm8uS2V5VHlwZSA9PSBHUk9VUEtFWSkgJiYKKwkJCShwZWVyS2V5SW5mby5LZXlJbmRleCAhPSAwKSAmJgorCQkJKHBlZXJLZXlJbmZvLktleUFjayA9PSAxKSAmJgorCQkJKHBlZXJLZXlJbmZvLktleU1pYyA9PSAxKSAmJgorCQkJKHBlZXJLZXlJbmZvLlNlY3VyZSA9PSAxKSAmJgorCQkJKHBlZXJLZXlJbmZvLkVycm9yID09IDApICYmCisJCQkocGVlcktleUluZm8uUmVxdWVzdCA9PSAwKSkKKwkJeworCQkJTXNnVHlwZSA9IEVBUE9MX0dST1VQX01TR18xOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmVjZWl2ZSBFQVBPTCBLZXkgR3JvdXAgTWVzc2FnZSAxXG4iKSk7CisJCX0KKworCQkvLyBXZSB3aWxsIGFzc3VtZSBsaW5rIGlzIHVwIChhc3NvYyBzdWNlZXNzIGFuZCBwb3J0IG5vdCBzZWN1cmVkKS4KKwkJLy8gQWxsIHN0YXRlIGhhcyB0byBiZSBhYmxlIHRvIHByb2Nlc3MgbWVzc2FnZSBmcm9tIHByZXZpb3VzIHN0YXRlCisJCXN3aXRjaChwQWQtPlN0YUNmZy5XcGFTdGF0ZSkKKwkJeworCQljYXNlIFNTX1NUQVJUOgorCQkJaWYoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18xKQorCQkJeworCQkJCVdwYVBhaXJNc2cxQWN0aW9uKHBBZCwgRWxlbSk7CisJCQkJcEFkLT5TdGFDZmcuV3BhU3RhdGUgPSBTU19XQUlUX01TR18zOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBTU19XQUlUX01TR18zOgorCQkJaWYoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18xKQorCQkJeworCQkJCVdwYVBhaXJNc2cxQWN0aW9uKHBBZCwgRWxlbSk7CisJCQkJcEFkLT5TdGFDZmcuV3BhU3RhdGUgPSBTU19XQUlUX01TR18zOworCQkJfQorCQkJZWxzZSBpZihNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzMpCisJCQl7CisJCQkJV3BhUGFpck1zZzNBY3Rpb24ocEFkLCBFbGVtKTsKKwkJCQlwQWQtPlN0YUNmZy5XcGFTdGF0ZSA9IFNTX1dBSVRfR1JPVVA7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFNTX1dBSVRfR1JPVVA6CQkvLyBXaGVuIGRvaW5nIGdyb3VwIGtleSBleGNoYW5nZQorCQljYXNlIFNTX0ZJTklTSDoJCQkvLyBUaGlzIGhhcHBlbmVkIHdoZW4gdXBkYXRlIGdyb3VwIGtleQorCQkJaWYoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18xKQorCQkJeworCQkJCVdwYVBhaXJNc2cxQWN0aW9uKHBBZCwgRWxlbSk7CisJCQkJcEFkLT5TdGFDZmcuV3BhU3RhdGUgPSBTU19XQUlUX01TR18zOworCQkJCS8vIFJlc2V0IHBvcnQgc2VjdXJlZCB2YXJpYWJsZQorCQkJCXBBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX05PVF9TRUNVUkVEOworCQkJfQorCQkJZWxzZSBpZihNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzMpCisJCQl7CisJCQkJV3BhUGFpck1zZzNBY3Rpb24ocEFkLCBFbGVtKTsKKwkJCQlwQWQtPlN0YUNmZy5XcGFTdGF0ZSA9IFNTX1dBSVRfR1JPVVA7CisJCQkJLy8gUmVzZXQgcG9ydCBzZWN1cmVkIHZhcmlhYmxlCisJCQkJcEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQ7CisJCQl9CisJCQllbHNlIGlmKE1zZ1R5cGUgPT0gRUFQT0xfR1JPVVBfTVNHXzEpCisJCQl7CisJCQkJV3BhR3JvdXBNc2cxQWN0aW9uKHBBZCwgRWxlbSk7CisJCQkJcEFkLT5TdGFDZmcuV3BhU3RhdGUgPSBTU19GSU5JU0g7CisJCQl9CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwl9CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8LS0tLS0gV3BhRUFQT0xLZXlBY3Rpb25cbiIpKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVByb2Nlc3MgUGFpcndpc2Uga2V5IDQtd2F5IGhhbmRzaGFraW5nCisKKwlBcmd1bWVudHM6CisJCXBBZAlQb2ludGVyCXRvIG91ciBhZGFwdGVyCisJCUVsZW0JCU1lc3NhZ2UgYm9keQorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlXcGFQYWlyTXNnMUFjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCVBIRUFERVJfODAyXzExICAgICAgcEhlYWRlcjsKKwlVQ0hBUgkJCQkqbXBvb2wsICpQVEssICpkaWdlc3Q7CisJUFVDSEFSICAgICAgICAgICAgICBwT3V0QnVmZmVyID0gTlVMTDsKKwlVQ0hBUiAgICAgICAgICAgICAgIEhlYWRlcjgwMl8zWzE0XTsKKwlVTE9ORyAgICAgICAgICAgICAgIEZyYW1lTGVuID0gMDsKKwlQRUFQT0xfUEFDS0VUICAgICAgIHBNc2cxOworCUVBUE9MX1BBQ0tFVCAgICAgICAgUGFja2V0OworCVVDSEFSICAgICAgICAgICAgICAgTWljWzE2XTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIldwYVBhaXJNc2cxQWN0aW9uIC0tLS0tPlxuIikpOworCisJLy8gYWxsb2NhdGUgbWVtb3J5IHBvb2wKKwlvc19hbGxvY19tZW0ocEFkLCAoUFVDSEFSICopJm1wb29sLCAyNTYpOworCisJaWYgKG1wb29sID09IE5VTEwpCisJCXJldHVybjsKKworCS8vIFBUSyBMZW4gPSA4MC4KKwlQVEsgPSAoVUNIQVIgKikgUk9VTkRfVVAobXBvb2wsIDQpOworCS8vIGRpZ2VzdCBMZW4gPSA4MC4KKwlkaWdlc3QgPSAoVUNIQVIgKikgUk9VTkRfVVAoUFRLICsgODAsIDQpOworCisJcEhlYWRlciA9IChQSEVBREVSXzgwMl8xMSkgRWxlbS0+TXNnOworCisJLy8gUHJvY2VzcyBtZXNzYWdlIDEgZnJvbSBhdXRoZW50aWNhdG9yCisJcE1zZzEgPSAoUEVBUE9MX1BBQ0tFVCkgJkVsZW0tPk1zZ1tMRU5HVEhfODAyXzExICsgTEVOR1RIXzgwMl8xX0hdOworCisJLy8gMS4gU2F2ZSBSZXBsYXkgY291bnRlciwgaXQgd2lsbCB1c2UgdG8gdmVyaWZ5IG1lc3NhZ2UgMyBhbmQgY29uc3RydWN0IG1lc3NhZ2UgMgorCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXIsIHBNc2cxLT5LZXlEZXNjLlJlcGxheUNvdW50ZXIsIExFTl9LRVlfREVTQ19SRVBMQVkpOworCisJLy8gMi4gU2F2ZSBBTm9uY2UKKwlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5BTm9uY2UsIHBNc2cxLT5LZXlEZXNjLktleU5vbmNlLCBMRU5fS0VZX0RFU0NfTk9OQ0UpOworCisJLy8gR2VuZXJhdGUgcmFuZG9tIFNOb25jZQorCUdlblJhbmRvbShwQWQsIHBBZC0+Q3VycmVudEFkZHJlc3MsIHBBZC0+U3RhQ2ZnLlNOb25jZSk7CisKKwkvLyBDYWxjIFBUSyhBTm9uY2UsIFNOb25jZSkKKwlXcGFDb3VudFBUSyhwQWQsCisJCXBBZC0+U3RhQ2ZnLlBNSywKKwkJcEFkLT5TdGFDZmcuQU5vbmNlLAorCQlwQWQtPkNvbW1vbkNmZy5Cc3NpZCwKKwkJcEFkLT5TdGFDZmcuU05vbmNlLAorCQlwQWQtPkN1cnJlbnRBZGRyZXNzLAorCQlQVEssCisJCUxFTl9QVEspOworCisJLy8gU2F2ZSBrZXkgdG8gUFRLIGVudHJ5CisJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuUFRLLCBQVEssIExFTl9QVEspOworCisJLy8gaW5pdCA4MDIuMyBoZWFkZXIgYW5kIEZpbGwgUGFja2V0CisJTUFLRV84MDJfM19IRUFERVIoSGVhZGVyODAyXzMsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBFQVBPTCk7CisKKwkvLyBaZXJvIE1lc3NhZ2UgMiBib2R5CisJTmRpc1plcm9NZW1vcnkoJlBhY2tldCwgc2l6ZW9mKFBhY2tldCkpOworCVBhY2tldC5Qcm9WZXIJPSBFQVBPTF9WRVI7CisJUGFja2V0LlByb1R5cGUJPSBFQVBPTEtleTsKKwkvLworCS8vIE1lc3NhZ2UgMiBhcyAgRUFQT0wtS2V5KDAsMSwwLDAsMCxQLDAsU05vbmNlLE1JQyxSU04gSUUpCisJLy8KKwlQYWNrZXQuS2V5RGVzYy5UeXBlID0gV1BBMV9LRVlfREVTQzsKKwkvLyAxLiBLZXkgZGVzY3JpcHRvciB2ZXJzaW9uIGFuZCBhcHByb3ByaWF0ZSBSU04gSUUKKwlpZihwQWQtPlN0YUNmZy5XZXBTdGF0dXMgID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCisJeworCQlQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLktleURlc2NWZXIgPSAyOworCX0KKwllbHNlCSAgLy8gVEtJUAorCXsKKwkJUGFja2V0LktleURlc2MuS2V5SW5mby5LZXlEZXNjVmVyID0gMTsKKwl9CisKKwkvLyBmaWxsIGluIERhdGEgTWF0ZXJpYWwgYW5kIGl0cyBsZW5ndGgKKwlQYWNrZXQuS2V5RGVzYy5LZXlEYXRhWzBdID0gSUVfV1BBOworCVBhY2tldC5LZXlEZXNjLktleURhdGFbMV0gPSBwQWQtPlN0YUNmZy5SU05JRV9MZW47CisJUGFja2V0LktleURlc2MuS2V5RGF0YUxlblsxXSA9IHBBZC0+U3RhQ2ZnLlJTTklFX0xlbiArIDI7CisJTmRpc01vdmVNZW1vcnkoJlBhY2tldC5LZXlEZXNjLktleURhdGFbMl0sIHBBZC0+U3RhQ2ZnLlJTTl9JRSwgcEFkLT5TdGFDZmcuUlNOSUVfTGVuKTsKKworCS8vIFVwZGF0ZSBwYWNrZXQgbGVuZ3RoIGFmdGVyIGRlY2lkZSBLZXkgZGF0YSBwYXlsb2FkCisJUGFja2V0LkJvZHlfTGVuWzFdICA9IHNpemVvZihLRVlfREVTQ1JJUFRFUikgLSBNQVhfTEVOX09GX1JTTklFICsgUGFja2V0LktleURlc2MuS2V5RGF0YUxlblsxXTsKKworCS8vIFVwZGF0ZSBLZXkgbGVuZ3RoCisJUGFja2V0LktleURlc2MuS2V5TGVuZ3RoWzBdID0gcE1zZzEtPktleURlc2MuS2V5TGVuZ3RoWzBdOworCVBhY2tldC5LZXlEZXNjLktleUxlbmd0aFsxXSA9IHBNc2cxLT5LZXlEZXNjLktleUxlbmd0aFsxXTsKKwkvLyAyLiBLZXkgVHlwZSBQZWVyS2V5CisJUGFja2V0LktleURlc2MuS2V5SW5mby5LZXlUeXBlID0gUEFJUldJU0VLRVk7CisKKwkvLyAzLiBLZXlNaWMgZmllbGQgcHJlc2VudGVkCisJUGFja2V0LktleURlc2MuS2V5SW5mby5LZXlNaWMgID0gMTsKKworCS8vQ29udmVydCB0byBsaXR0bGUtZW5kaWFuIGZvcm1hdC4KKwkqKChVU0hPUlQgKikmUGFja2V0LktleURlc2MuS2V5SW5mbykgPSBjcHUybGUxNigqKChVU0hPUlQgKikmUGFja2V0LktleURlc2MuS2V5SW5mbykpOworCisKKwkvLyA0LiBGaWxsIFNOb25jZQorCU5kaXNNb3ZlTWVtb3J5KFBhY2tldC5LZXlEZXNjLktleU5vbmNlLCBwQWQtPlN0YUNmZy5TTm9uY2UsIExFTl9LRVlfREVTQ19OT05DRSk7CisKKwkvLyA1LiBLZXkgUmVwbGF5IENvdW50CisJTmRpc01vdmVNZW1vcnkoUGFja2V0LktleURlc2MuUmVwbGF5Q291bnRlciwgcEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlciwgTEVOX0tFWV9ERVNDX1JFUExBWSk7CisKKwkvLyBTZW5kIEVBUE9MKDAsIDEsIDAsIDAsIDAsIFAsIDAsIFNOb25jZSwgTUlDLCBSU05fSUUpCisJLy8gT3V0IGJ1ZmZlciBmb3IgdHJhbnNtaXR0aW5nIG1lc3NhZ2UgMgorCU1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsIChQVUNIQVIgKikmcE91dEJ1ZmZlcik7ICAvLyBhbGxvY2F0ZSBtZW1vcnkKKwlpZihwT3V0QnVmZmVyID09IE5VTEwpCisJeworCQlvc19mcmVlX21lbShwQWQsIG1wb29sKTsKKwkJcmV0dXJuOworCX0KKwkvLyBQcmVwYXJlIEVBUE9MIGZyYW1lIGZvciBNSUMgY2FsY3VsYXRpb24KKwkvLyBCZSBjYXJlZnVsLCBvbmx5IEVBUE9MIGZyYW1lIGlzIGNvdW50ZWQgZm9yIE1JQyBjYWxjdWxhdGlvbgorCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAgICAmRnJhbWVMZW4sCisJCVBhY2tldC5Cb2R5X0xlblsxXSArIDQsICAgICZQYWNrZXQsCisJCUVORF9PRl9BUkdTKTsKKworCS8vIDYuIFByZXBhcmUgYW5kIEZpbGwgTUlDIHZhbHVlCisJTmRpc1plcm9NZW1vcnkoTWljLCBzaXplb2YoTWljKSk7CisJaWYocEFkLT5TdGFDZmcuV2VwU3RhdHVzICA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQorCXsJLy8gQUVTCisKKwkJSE1BQ19TSEExKHBPdXRCdWZmZXIsIEZyYW1lTGVuLCBQVEssIExFTl9FQVBfTUlDSywgZGlnZXN0KTsKKwkJTmRpc01vdmVNZW1vcnkoTWljLCBkaWdlc3QsIExFTl9LRVlfREVTQ19NSUMpOworCX0KKwllbHNlCisJewkvLyBUS0lQCisJCWhtYWNfbWQ1KFBUSywgIExFTl9FQVBfTUlDSywgcE91dEJ1ZmZlciwgRnJhbWVMZW4sIE1pYyk7CisJfQorCU5kaXNNb3ZlTWVtb3J5KFBhY2tldC5LZXlEZXNjLktleU1pYywgTWljLCBMRU5fS0VZX0RFU0NfTUlDKTsKKworCS8vaGV4X2R1bXAoIk1JQyIsIE1pYywgTEVOX0tFWV9ERVNDX01JQyk7CisKKwkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICAgIAkmRnJhbWVMZW4sCisJCQkgIAkJCUxFTkdUSF84MDJfMywgICAgIAkJCSZIZWFkZXI4MDJfMywKKwkJCQkJCVBhY2tldC5Cb2R5X0xlblsxXSArIDQsICAgICZQYWNrZXQsCisJCQkJCQlFTkRfT0ZfQVJHUyk7CisKKworCS8vIDUuIENvcHkgZnJhbWUgdG8gVHggcmluZyBhbmQgc2VuZCBNc2cgMiB0byBhdXRoZW50aWNhdG9yCisJUlRNUFRvV2lyZWxlc3NTdGEocEFkLCBIZWFkZXI4MDJfMywgTEVOR1RIXzgwMl8zLCAoUFVDSEFSKSZQYWNrZXQsIFBhY2tldC5Cb2R5X0xlblsxXSArIDQsIFRSVUUpOworCisJTWxtZUZyZWVNZW1vcnkocEFkLCAoUFVDSEFSKXBPdXRCdWZmZXIpOworCW9zX2ZyZWVfbWVtKHBBZCwgKFBVQ0hBUiltcG9vbCk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJXcGFQYWlyTXNnMUFjdGlvbiA8LS0tLS1cbiIpKTsKK30KKworVk9JRCBXcGEyUGFpck1zZzFBY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlQSEVBREVSXzgwMl8xMSAgICAgIHBIZWFkZXI7CisJVUNIQVIJCQkJKm1wb29sLCAqUFRLLCAqZGlnZXN0OworCVBVQ0hBUiAgICAgICAgICAgICAgcE91dEJ1ZmZlciA9IE5VTEw7CisJVUNIQVIgICAgICAgICAgICAgICBIZWFkZXI4MDJfM1sxNF07CisJVUxPTkcgICAgICAgICAgICAgICBGcmFtZUxlbiA9IDA7CisJUEVBUE9MX1BBQ0tFVCAgICAgICBwTXNnMTsKKwlFQVBPTF9QQUNLRVQgICAgICAgIFBhY2tldDsKKwlVQ0hBUiAgICAgICAgICAgICAgIE1pY1sxNl07CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJXcGEyUGFpck1zZzFBY3Rpb24gLS0tLS0+XG4iKSk7CisKKwkvLyBhbGxvY2F0ZSBtZW1vcnkgcG9vbAorCW9zX2FsbG9jX21lbShwQWQsIChQVUNIQVIgKikmbXBvb2wsIDI1Nik7CisKKwlpZiAobXBvb2wgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJLy8gUFRLIExlbiA9IDgwLgorCVBUSyA9IChVQ0hBUiAqKSBST1VORF9VUChtcG9vbCwgNCk7CisJLy8gZGlnZXN0IExlbiA9IDgwLgorCWRpZ2VzdCA9IChVQ0hBUiAqKSBST1VORF9VUChQVEsgKyA4MCwgNCk7CisKKwlwSGVhZGVyID0gKFBIRUFERVJfODAyXzExKSBFbGVtLT5Nc2c7CisKKwkvLyBQcm9jZXNzIG1lc3NhZ2UgMSBmcm9tIGF1dGhlbnRpY2F0b3IKKwkJcE1zZzEgPSAoUEVBUE9MX1BBQ0tFVCkJJkVsZW0tPk1zZ1tMRU5HVEhfODAyXzExICsgTEVOR1RIXzgwMl8xX0hdOworCisJLy8gMS4gU2F2ZSBSZXBsYXkgY291bnRlciwgaXQgd2lsbCB1c2UgdG8gdmVyaWZ5IG1lc3NhZ2UgMyBhbmQgY29uc3RydWN0IG1lc3NhZ2UgMgorCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXIsIHBNc2cxLT5LZXlEZXNjLlJlcGxheUNvdW50ZXIsIExFTl9LRVlfREVTQ19SRVBMQVkpOworCisJLy8gMi4gU2F2ZSBBTm9uY2UKKwlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5BTm9uY2UsIHBNc2cxLT5LZXlEZXNjLktleU5vbmNlLCBMRU5fS0VZX0RFU0NfTk9OQ0UpOworCisJLy8gR2VuZXJhdGUgcmFuZG9tIFNOb25jZQorCUdlblJhbmRvbShwQWQsIHBBZC0+Q3VycmVudEFkZHJlc3MsIHBBZC0+U3RhQ2ZnLlNOb25jZSk7CisKKwlpZihwTXNnMS0+S2V5RGVzYy5LZXlEYXRhTGVuWzFdID4gMCApCisJeworCQkvLyBjYWNoZWQgUE1LSUQKKwl9CisKKwkvLyBDYWxjIFBUSyhBTm9uY2UsIFNOb25jZSkKKwlXcGFDb3VudFBUSyhwQWQsCisJCXBBZC0+U3RhQ2ZnLlBNSywKKwkJcEFkLT5TdGFDZmcuQU5vbmNlLAorCQlwQWQtPkNvbW1vbkNmZy5Cc3NpZCwKKwkJcEFkLT5TdGFDZmcuU05vbmNlLAorCQlwQWQtPkN1cnJlbnRBZGRyZXNzLAorCQlQVEssCisJCUxFTl9QVEspOworCisJLy8gU2F2ZSBrZXkgdG8gUFRLIGVudHJ5CisJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuUFRLLCBQVEssIExFTl9QVEspOworCisJLy8gaW5pdCA4MDIuMyBoZWFkZXIgYW5kIEZpbGwgUGFja2V0CisJTUFLRV84MDJfM19IRUFERVIoSGVhZGVyODAyXzMsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBFQVBPTCk7CisKKwkvLyBaZXJvIG1lc3NhZ2UgMiBib2R5CisJTmRpc1plcm9NZW1vcnkoJlBhY2tldCwgc2l6ZW9mKFBhY2tldCkpOworCVBhY2tldC5Qcm9WZXIJPSBFQVBPTF9WRVI7CisJUGFja2V0LlByb1R5cGUJPSBFQVBPTEtleTsKKwkvLworCS8vIE1lc3NhZ2UgMiBhcyAgRUFQT0wtS2V5KDAsMSwwLDAsMCxQLDAsU05vbmNlLE1JQyxSU04gSUUpCisJLy8KKwlQYWNrZXQuS2V5RGVzYy5UeXBlID0gV1BBMl9LRVlfREVTQzsKKworCS8vIDEuIEtleSBkZXNjcmlwdG9yIHZlcnNpb24gYW5kIGFwcHJvcHJpYXRlIFJTTiBJRQorCWlmKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQorCXsKKwkJUGFja2V0LktleURlc2MuS2V5SW5mby5LZXlEZXNjVmVyID0gMjsKKwl9CisJZWxzZQkgIC8vIFRLSVAKKwl7CisJCVBhY2tldC5LZXlEZXNjLktleUluZm8uS2V5RGVzY1ZlciA9IDE7CisJfQorCisJLy8gZmlsbCBpbiBEYXRhIE1hdGVyaWFsIGFuZCBpdHMgbGVuZ3RoCisJUGFja2V0LktleURlc2MuS2V5RGF0YVswXSA9IElFX1dQQTI7CisJUGFja2V0LktleURlc2MuS2V5RGF0YVsxXSA9IHBBZC0+U3RhQ2ZnLlJTTklFX0xlbjsKKwlQYWNrZXQuS2V5RGVzYy5LZXlEYXRhTGVuWzFdID0gcEFkLT5TdGFDZmcuUlNOSUVfTGVuICsgMjsKKwlOZGlzTW92ZU1lbW9yeSgmUGFja2V0LktleURlc2MuS2V5RGF0YVsyXSwgcEFkLT5TdGFDZmcuUlNOX0lFLCBwQWQtPlN0YUNmZy5SU05JRV9MZW4pOworCisJLy8gVXBkYXRlIHBhY2tldCBsZW5ndGggYWZ0ZXIgZGVjaWRlIEtleSBkYXRhIHBheWxvYWQKKwlQYWNrZXQuQm9keV9MZW5bMV0gID0gc2l6ZW9mKEtFWV9ERVNDUklQVEVSKSAtIE1BWF9MRU5fT0ZfUlNOSUUgKyBQYWNrZXQuS2V5RGVzYy5LZXlEYXRhTGVuWzFdOworCisJLy8gMi4gS2V5IFR5cGUgUGVlcktleQorCVBhY2tldC5LZXlEZXNjLktleUluZm8uS2V5VHlwZSA9IFBBSVJXSVNFS0VZOworCisJLy8gMy4gS2V5TWljIGZpZWxkIHByZXNlbnRlZAorCVBhY2tldC5LZXlEZXNjLktleUluZm8uS2V5TWljICA9IDE7CisKKwkvLyBVcGRhdGUgS2V5IExlbmd0aAorCVBhY2tldC5LZXlEZXNjLktleUxlbmd0aFswXSA9IDA7CisJUGFja2V0LktleURlc2MuS2V5TGVuZ3RoWzFdID0gcE1zZzEtPktleURlc2MuS2V5TGVuZ3RoWzFdOworCisJLy8gNC4gRmlsbCBTTm9uY2UKKwlOZGlzTW92ZU1lbW9yeShQYWNrZXQuS2V5RGVzYy5LZXlOb25jZSwgcEFkLT5TdGFDZmcuU05vbmNlLCBMRU5fS0VZX0RFU0NfTk9OQ0UpOworCisJLy8gNS4gS2V5IFJlcGxheSBDb3VudAorCU5kaXNNb3ZlTWVtb3J5KFBhY2tldC5LZXlEZXNjLlJlcGxheUNvdW50ZXIsIHBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXIsIExFTl9LRVlfREVTQ19SRVBMQVkpOworCisJLy8gQ29udmVydCB0byBsaXR0bGUtZW5kaWFuIGZvcm1hdC4KKwkqKChVU0hPUlQgKikmUGFja2V0LktleURlc2MuS2V5SW5mbykgPSBjcHUybGUxNigqKChVU0hPUlQgKikmUGFja2V0LktleURlc2MuS2V5SW5mbykpOworCisJLy8gU2VuZCBFQVBPTC1LZXkoMCwxLDAsMCwwLFAsMCxTTm9uY2UsTUlDLFJTTiBJRSkKKwkvLyBPdXQgYnVmZmVyIGZvciB0cmFuc21pdHRpbmcgbWVzc2FnZSAyCisJTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgIChQVUNIQVIgKikmcE91dEJ1ZmZlcik7ICAvLyBhbGxvY2F0ZSBtZW1vcnkKKwlpZihwT3V0QnVmZmVyID09IE5VTEwpCisJeworCQlvc19mcmVlX21lbShwQWQsIG1wb29sKTsKKwkJcmV0dXJuOworCX0KKworCS8vIFByZXBhcmUgRUFQT0wgZnJhbWUgZm9yIE1JQyBjYWxjdWxhdGlvbgorCS8vIEJlIGNhcmVmdWwsIG9ubHkgRUFQT0wgZnJhbWUgaXMgY291bnRlZCBmb3IgTUlDIGNhbGN1bGF0aW9uCisJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICZGcmFtZUxlbiwKKwkJUGFja2V0LkJvZHlfTGVuWzFdICsgNCwgJlBhY2tldCwKKwkJRU5EX09GX0FSR1MpOworCisJLy8gNi4gUHJlcGFyZSBhbmQgRmlsbCBNSUMgdmFsdWUKKwlOZGlzWmVyb01lbW9yeShNaWMsIHNpemVvZihNaWMpKTsKKwlpZihwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKKwl7CisJCS8vIEFFUworCQlITUFDX1NIQTEocE91dEJ1ZmZlciwgRnJhbWVMZW4sIFBUSywgTEVOX0VBUF9NSUNLLCBkaWdlc3QpOworCQlOZGlzTW92ZU1lbW9yeShNaWMsIGRpZ2VzdCwgTEVOX0tFWV9ERVNDX01JQyk7CisJfQorCWVsc2UKKwl7CisJCWhtYWNfbWQ1KFBUSywgIExFTl9FQVBfTUlDSywgcE91dEJ1ZmZlciwgRnJhbWVMZW4sIE1pYyk7CisJfQorCU5kaXNNb3ZlTWVtb3J5KFBhY2tldC5LZXlEZXNjLktleU1pYywgTWljLCBMRU5fS0VZX0RFU0NfTUlDKTsKKworCisJLy8gTWFrZSAgVHJhbnNtaXR0aW5nIGZyYW1lCisJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICAgIAkmRnJhbWVMZW4sCisJCQkgIAkJCUxFTkdUSF84MDJfMywgICAgIAkJJkhlYWRlcjgwMl8zLAorCQkJCQkJUGFja2V0LkJvZHlfTGVuWzFdICsgNCwgJlBhY2tldCwKKwkJCQkJCUVORF9PRl9BUkdTKTsKKworCisJLy8gNS4gQ29weSBmcmFtZSB0byBUeCByaW5nCisJUlRNUFRvV2lyZWxlc3NTdGEocEFkLCBIZWFkZXI4MDJfMywgTEVOR1RIXzgwMl8zLCAoUFVDSEFSKSZQYWNrZXQsIFBhY2tldC5Cb2R5X0xlblsxXSArIDQsIFRSVUUpOworCisJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKKwlvc19mcmVlX21lbShwQWQsIG1wb29sKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIldwYTJQYWlyTXNnMUFjdGlvbiA8LS0tLS1cbiIpKTsKKworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJUHJvY2VzcyBQYWlyd2lzZSBrZXkgNC13YXkgaGFuZHNoYWtpbmcKKworCUFyZ3VtZW50czoKKwkJcEFkCVBvaW50ZXIJdG8gb3VyIGFkYXB0ZXIKKwkJRWxlbQkJTWVzc2FnZSBib2R5CisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECVdwYVBhaXJNc2czQWN0aW9uKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCU1MTUVfUVVFVUVfRUxFTQkqRWxlbSkKKworeworCVBIRUFERVJfODAyXzExICAgICAgcEhlYWRlcjsKKwlQVUNIQVIgICAgICAgICAgCXBPdXRCdWZmZXIgPSBOVUxMOworCVVDSEFSICAgICAgICAgICAgICAgSGVhZGVyODAyXzNbMTRdOworCVVMT05HICAgICAgICAgICAJRnJhbWVMZW4gPSAwOworCUVBUE9MX1BBQ0tFVCAgICAgICAgUGFja2V0OworCVBFQVBPTF9QQUNLRVQgICAgICAgcE1zZzM7CisJVUNIQVIgICAgICAgICAgIAlNaWNbMTZdLCBPbGRNaWNbMTZdOworCU1BQ19UQUJMRV9FTlRSWSAJKnBFbnRyeSA9IE5VTEw7CisJVUNIQVIJCQkJc2tpcF9vZmZzZXQ7CisJS0VZX0lORk8JCQlwZWVyS2V5SW5mbzsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIldwYVBhaXJNc2czQWN0aW9uIC0tLS0tPlxuIikpOworCisJLy8gUmVjb3JkIDgwMi4xMSBoZWFkZXIgJiB0aGUgcmVjZWl2ZWQgRUFQT0wgcGFja2V0IE1zZzMKKwlwSGVhZGVyID0gKFBIRUFERVJfODAyXzExKSBFbGVtLT5Nc2c7CisJcE1zZzMgPSAoUEVBUE9MX1BBQ0tFVCkJJkVsZW0tPk1zZ1tMRU5HVEhfODAyXzExICsgTEVOR1RIXzgwMl8xX0hdOworCisJTmRpc1plcm9NZW1vcnkoKFBVQ0hBUikmcGVlcktleUluZm8sIHNpemVvZihwZWVyS2V5SW5mbykpOworCU5kaXNNb3ZlTWVtb3J5KChQVUNIQVIpJnBlZXJLZXlJbmZvLCAoUFVDSEFSKSZwTXNnMy0+S2V5RGVzYy5LZXlJbmZvLCBzaXplb2YoS0VZX0lORk8pKTsKKworCSooKFVTSE9SVCopJnBlZXJLZXlJbmZvKSA9IGNwdTJsZTE2KCooKFVTSE9SVCopJnBlZXJLZXlJbmZvKSk7CisKKworCS8vIDEuIFZlcmlmeSBjaXBoZXIgdHlwZSBtYXRjaAorCWlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQgJiYgKHBlZXJLZXlJbmZvLktleURlc2NWZXIgIT0gMikpCisJeworCQlyZXR1cm47CisJfQorCWVsc2UgaWYocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQgJiYgKHBlZXJLZXlJbmZvLktleURlc2NWZXIgIT0gMSkpCisJeworCQlyZXR1cm47CisJfQorCisJLy8gVmVyaWZ5IFJTTiBJRQorCS8vaWYgKCFSVE1QRXF1YWxNZW1vcnkocE1zZzMtPktleURlc2MuS2V5RGF0YSwgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5SU05fSUUsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUlNOSUVfTGVuKSkKKwlpZiAoIUNoZWNrUlNOSUUocEFkLCBwTXNnMy0+S2V5RGVzYy5LZXlEYXRhLCBwTXNnMy0+S2V5RGVzYy5LZXlEYXRhTGVuWzFdLCAmc2tpcF9vZmZzZXQpKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiUlNOX0lFIERpZmZlcmVudCBpbiBNc2cgMyBvZiBXUEExIDQtd2F5IGhhbmRzaGFrZSEhIFxuIikpOworCQloZXhfZHVtcCgiVGhlIG9yaWdpbmFsIFJTTl9JRSIsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUlNOX0lFLCBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlJTTklFX0xlbik7CisJCWhleF9kdW1wKCJUaGUgcmVjZWl2ZWQgUlNOX0lFIiwgcE1zZzMtPktleURlc2MuS2V5RGF0YSwgcE1zZzMtPktleURlc2MuS2V5RGF0YUxlblsxXSk7CisJCXJldHVybjsKKwl9CisJZWxzZQorCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSU05fSUUgVkFMSUQgaW4gTXNnIDMgb2YgV1BBMSA0LXdheSBoYW5kc2hha2UhISBcbiIpKTsKKworCisJLy8gMi4gQ2hlY2sgTUlDIHZhbHVlCisJLy8gU2F2ZSB0aGUgTUlDIGFuZCByZXBsYWNlIHdpdGggemVybworCU5kaXNNb3ZlTWVtb3J5KE9sZE1pYywgcE1zZzMtPktleURlc2MuS2V5TWljLCBMRU5fS0VZX0RFU0NfTUlDKTsKKwlOZGlzWmVyb01lbW9yeShwTXNnMy0+S2V5RGVzYy5LZXlNaWMsIExFTl9LRVlfREVTQ19NSUMpOworCWlmKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKKwl7CisJCS8vIEFFUworCQlVQ0hBUiBkaWdlc3RbODBdOworCisJCUhNQUNfU0hBMSgoUFVDSEFSKSBwTXNnMywgcE1zZzMtPkJvZHlfTGVuWzFdICsgNCwgcEFkLT5TdGFDZmcuUFRLLCBMRU5fRUFQX01JQ0ssIGRpZ2VzdCk7CisJCU5kaXNNb3ZlTWVtb3J5KE1pYywgZGlnZXN0LCBMRU5fS0VZX0RFU0NfTUlDKTsKKwl9CisJZWxzZQkvLyBUS0lQCisJeworCQlobWFjX21kNShwQWQtPlN0YUNmZy5QVEssIExFTl9FQVBfTUlDSywgKFBVQ0hBUikgcE1zZzMsIHBNc2czLT5Cb2R5X0xlblsxXSArIDQsIE1pYyk7CisJfQorCisJaWYoIU5kaXNFcXVhbE1lbW9yeShPbGRNaWMsIE1pYywgTEVOX0tFWV9ERVNDX01JQykpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIgTUlDIERpZmZlcmVudCBpbiBtc2cgMyBvZiA0LXdheSBoYW5kc2hha2UhISEhISEhISEhIFxuIikpOworCQlyZXR1cm47CisJfQorCWVsc2UKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiIE1JQyBWQUxJRCBpbiBtc2cgMyBvZiA0LXdheSBoYW5kc2hha2UhISEhISEhISEhIFxuIikpOworCisJLy8gMy4gQ2hlY2sgUmVwbGF5IENvdW50ZXIsIGl0IGhhcyB0byBiZSBsYXJnZXIgdGhhbiBsYXN0IG9uZS4gTm8gbmVlZCB0byBiZSBleGFjdCBvbmUgbGFyZ2VyCisJaWYoUlRNUENvbXBhcmVNZW1vcnkocE1zZzMtPktleURlc2MuUmVwbGF5Q291bnRlciwgcEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlciwgTEVOX0tFWV9ERVNDX1JFUExBWSkgIT0gMSkKKwkJcmV0dXJuOworCisJLy8gVXBkYXRlIG5ldyByZXBsYXkgY291bnRlcgorCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXIsIHBNc2czLT5LZXlEZXNjLlJlcGxheUNvdW50ZXIsIExFTl9LRVlfREVTQ19SRVBMQVkpOworCisJLy8gNC4gRG91YmxlIGNoZWNrIEFOb25jZQorCWlmKCFOZGlzRXF1YWxNZW1vcnkocEFkLT5TdGFDZmcuQU5vbmNlLCBwTXNnMy0+S2V5RGVzYy5LZXlOb25jZSwgTEVOX0tFWV9ERVNDX05PTkNFKSkKKwkJcmV0dXJuOworCisJLy8gaW5pdCA4MDIuMyBoZWFkZXIgYW5kIEZpbGwgUGFja2V0CisJTUFLRV84MDJfM19IRUFERVIoSGVhZGVyODAyXzMsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBFQVBPTCk7CisKKwkvLyBaZXJvIE1lc3NhZ2UgNCBib2R5CisJTmRpc1plcm9NZW1vcnkoJlBhY2tldCwgc2l6ZW9mKFBhY2tldCkpOworCVBhY2tldC5Qcm9WZXIJPSBFQVBPTF9WRVI7CisJUGFja2V0LlByb1R5cGUJPSBFQVBPTEtleTsKKwlQYWNrZXQuQm9keV9MZW5bMV0gID0gc2l6ZW9mKEtFWV9ERVNDUklQVEVSKSAtIE1BWF9MRU5fT0ZfUlNOSUU7CQkvLyBObyBkYXRhIGZpZWxkCisKKwkvLworCS8vIE1lc3NhZ2UgNCBhcyAgRUFQT0wtS2V5KDAsMSwwLDAsMCxQLDAsMCxNSUMsMCkKKwkvLworCVBhY2tldC5LZXlEZXNjLlR5cGUgPSBXUEExX0tFWV9ERVNDOworCisJLy8gS2V5IGRlc2NyaXB0b3IgdmVyc2lvbiBhbmQgYXBwcm9wcmlhdGUgUlNOIElFCisJUGFja2V0LktleURlc2MuS2V5SW5mby5LZXlEZXNjVmVyID0gcGVlcktleUluZm8uS2V5RGVzY1ZlcjsKKworCS8vIFVwZGF0ZSBLZXkgTGVuZ3RoCisJUGFja2V0LktleURlc2MuS2V5TGVuZ3RoWzBdID0gcE1zZzMtPktleURlc2MuS2V5TGVuZ3RoWzBdOworCVBhY2tldC5LZXlEZXNjLktleUxlbmd0aFsxXSA9IHBNc2czLT5LZXlEZXNjLktleUxlbmd0aFsxXTsKKworCS8vIEtleSBUeXBlIFBlZXJLZXkKKwlQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLktleVR5cGUgPSBQQUlSV0lTRUtFWTsKKworCS8vIEtleU1pYyBmaWVsZCBwcmVzZW50ZWQKKwlQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLktleU1pYyAgPSAxOworCisJLy8gSW4gTXNnMywgIEtleUluZm8uc2VjdXJlID0wIGlmIEdyb3VwIEtleSBIUyB0byBjb21lLiAxIGlmIG5vIGdyb3VwIGtleSBIUworCS8vIFN0YXRpb24gc2VuZHMgTXNnNCAgS2V5SW5mby5zZWN1cmUgc2hvdWxkIGJlIHRoZSBzYW1lIGFzIHRoYXQgaW4gTXNnLjMKKwlQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLlNlY3VyZT0gcGVlcktleUluZm8uU2VjdXJlOworCisJLy8gQ29udmVydCB0byBsaXR0bGUtZW5kaWFuIGZvcm1hdC4KKwkqKChVU0hPUlQgKikmUGFja2V0LktleURlc2MuS2V5SW5mbykgPSBjcHUybGUxNigqKChVU0hPUlQgKikmUGFja2V0LktleURlc2MuS2V5SW5mbykpOworCisJLy8gS2V5IFJlcGxheSBjb3VudAorCU5kaXNNb3ZlTWVtb3J5KFBhY2tldC5LZXlEZXNjLlJlcGxheUNvdW50ZXIsIHBNc2czLT5LZXlEZXNjLlJlcGxheUNvdW50ZXIsIExFTl9LRVlfREVTQ19SRVBMQVkpOworCisJLy8gT3V0IGJ1ZmZlciBmb3IgdHJhbnNtaXR0aW5nIG1lc3NhZ2UgNAorCU1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsIChQVUNIQVIgKikmcE91dEJ1ZmZlcik7ICAvLyBhbGxvY2F0ZSBtZW1vcnkKKwlpZihwT3V0QnVmZmVyID09IE5VTEwpCisJCXJldHVybjsKKworCS8vIFByZXBhcmUgRUFQT0wgZnJhbWUgZm9yIE1JQyBjYWxjdWxhdGlvbgorCS8vIEJlIGNhcmVmdWwsIG9ubHkgRUFQT0wgZnJhbWUgaXMgY291bnRlZCBmb3IgTUlDIGNhbGN1bGF0aW9uCisJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICAgICZGcmFtZUxlbiwKKwkJUGFja2V0LkJvZHlfTGVuWzFdICsgNCwgICAgJlBhY2tldCwKKwkJRU5EX09GX0FSR1MpOworCisJLy8gUHJlcGFyZSBhbmQgRmlsbCBNSUMgdmFsdWUKKwlOZGlzWmVyb01lbW9yeShNaWMsIHNpemVvZihNaWMpKTsKKwlpZihwQWQtPlN0YUNmZy5XZXBTdGF0dXMgID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCisJeworCQkvLyBBRVMKKwkJVUNIQVIgZGlnZXN0WzgwXTsKKworCQlITUFDX1NIQTEocE91dEJ1ZmZlciwgRnJhbWVMZW4sIHBBZC0+U3RhQ2ZnLlBUSywgTEVOX0VBUF9NSUNLLCBkaWdlc3QpOworCQlOZGlzTW92ZU1lbW9yeShNaWMsIGRpZ2VzdCwgTEVOX0tFWV9ERVNDX01JQyk7CisJfQorCWVsc2UKKwl7CisJCWhtYWNfbWQ1KHBBZC0+U3RhQ2ZnLlBUSywgTEVOX0VBUF9NSUNLLCBwT3V0QnVmZmVyLCBGcmFtZUxlbiwgTWljKTsKKwl9CisJTmRpc01vdmVNZW1vcnkoUGFja2V0LktleURlc2MuS2V5TWljLCBNaWMsIExFTl9LRVlfREVTQ19NSUMpOworCisJLy8gVXBkYXRlIFBUSworCS8vIFByZXBhcmUgcGFpci13aXNlIGtleSBpbmZvcm1hdGlvbiBpbnRvIHNoYXJlZCBrZXkgdGFibGUKKwlOZGlzWmVyb01lbW9yeSgmcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0sIHNpemVvZihDSVBIRVJfS0VZKSk7CisJcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5TGVuID0gTEVOX1RLSVBfRUs7CisgICAgTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5LCAmcEFkLT5TdGFDZmcuUFRLWzMyXSwgTEVOX1RLSVBfRUspOworCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLlJ4TWljLCAmcEFkLT5TdGFDZmcuUFRLWzQ4XSwgTEVOX1RLSVBfUlhNSUNLKTsKKwlOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5UeE1pYywgJnBBZC0+U3RhQ2ZnLlBUS1s0OCtMRU5fVEtJUF9SWE1JQ0tdLCBMRU5fVEtJUF9UWE1JQ0spOworCisJLy8gRGVjaWRlIGl0cyBDaGlwZXJBbGcKKwlpZiAocEFkLT5TdGFDZmcuUGFpckNpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKQorCQlwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcgPSBDSVBIRVJfVEtJUDsKKwllbHNlIGlmIChwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCisJCXBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZyA9IENJUEhFUl9BRVM7CisJZWxzZQorCQlwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcgPSBDSVBIRVJfTk9ORTsKKworCS8vIFVwZGF0ZSB0aGVzZSByZWxhdGVkIGluZm9ybWF0aW9uIHRvIE1BQ19UQUJMRV9FTlRSWQorCXBFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdOworCU5kaXNNb3ZlTWVtb3J5KHBFbnRyeS0+UGFpcndpc2VLZXkuS2V5LCAmcEFkLT5TdGFDZmcuUFRLWzMyXSwgTEVOX1RLSVBfRUspOworCU5kaXNNb3ZlTWVtb3J5KHBFbnRyeS0+UGFpcndpc2VLZXkuUnhNaWMsICZwQWQtPlN0YUNmZy5QVEtbNDhdLCBMRU5fVEtJUF9SWE1JQ0spOworCU5kaXNNb3ZlTWVtb3J5KHBFbnRyeS0+UGFpcndpc2VLZXkuVHhNaWMsICZwQWQtPlN0YUNmZy5QVEtbNDgrTEVOX1RLSVBfUlhNSUNLXSwgTEVOX1RLSVBfVFhNSUNLKTsKKwlwRW50cnktPlBhaXJ3aXNlS2V5LkNpcGhlckFsZyA9IHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZzsKKworCS8vIFVwZGF0ZSBwYWlyd2lzZSBrZXkgaW5mb3JtYXRpb24gdG8gQVNJQyBTaGFyZWQgS2V5IFRhYmxlCisJQXNpY0FkZFNoYXJlZEtleUVudHJ5KHBBZCwKKwkJCQkJCSAgQlNTMCwKKwkJCQkJCSAgMCwKKwkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnLAorCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5LZXksCisJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLlR4TWljLAorCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5SeE1pYyk7CisKKwkvLyBVcGRhdGUgQVNJQyBXQ0lEIGF0dHJpYnV0ZSB0YWJsZSBhbmQgSVZFSVYgdGFibGUKKwlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZCwKKwkJCQkJCQkgIEJTUzAsCisJCQkJCQkJICAwLAorCQkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnLAorCQkJCQkJCSAgcEVudHJ5KTsKKworCS8vIE1ha2UgdHJhbnNtaXR0aW5nIGZyYW1lCisJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICAgIAkmRnJhbWVMZW4sCisJCQkgIAkJCUxFTkdUSF84MDJfMywgICAgIAkJJkhlYWRlcjgwMl8zLAorCQkJCQkJUGFja2V0LkJvZHlfTGVuWzFdICsgNCwgJlBhY2tldCwKKwkJCQkJCUVORF9PRl9BUkdTKTsKKworCisJLy8gQ29weSBmcmFtZSB0byBUeCByaW5nIGFuZCBTZW5kIE1lc3NhZ2UgNCB0byBhdXRoZW50aWNhdG9yCisJUlRNUFRvV2lyZWxlc3NTdGEocEFkLCBIZWFkZXI4MDJfMywgTEVOR1RIXzgwMl8zLCAoUFVDSEFSKSZQYWNrZXQsIFBhY2tldC5Cb2R5X0xlblsxXSArIDQsIFRSVUUpOworCisJTWxtZUZyZWVNZW1vcnkocEFkLCAoUFVDSEFSKXBPdXRCdWZmZXIpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiV3BhUGFpck1zZzNBY3Rpb24gPC0tLS0tXG4iKSk7Cit9CisKK1ZPSUQgICAgV3BhMlBhaXJNc2czQWN0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCisKK3sKKwlQSEVBREVSXzgwMl8xMSAgICAgIHBIZWFkZXI7CisJUFVDSEFSICAgICAgICAgICAgICBwT3V0QnVmZmVyID0gTlVMTDsKKwlVQ0hBUiAgICAgICAgICAgICAgIEhlYWRlcjgwMl8zWzE0XTsKKwlVTE9ORyAgICAgICAgICAgICAgIEZyYW1lTGVuID0gMDsKKwlFQVBPTF9QQUNLRVQgICAgICAgIFBhY2tldDsKKwlQRUFQT0xfUEFDS0VUICAgICAgIHBNc2czOworCVVDSEFSICAgICAgICAgICAgICAgTWljWzE2XSwgT2xkTWljWzE2XTsKKwlVQ0hBUiAgICAgICAgICAgICAgICptcG9vbCwgKktFWURBVEEsICpkaWdlc3Q7CisJVUNIQVIgICAgICAgICAgICAgICBLZXlbMzJdOworCU1BQ19UQUJMRV9FTlRSWSAJKnBFbnRyeSA9IE5VTEw7CisJS0VZX0lORk8JCQlwZWVyS2V5SW5mbzsKKworCS8vIGFsbG9jYXRlIG1lbW9yeQorCW9zX2FsbG9jX21lbShwQWQsIChQVUNIQVIgKikmbXBvb2wsIDEwMjQpOworCisJaWYobXBvb2wgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJLy8gS0VZREFUQSBMZW4gPSA1MTIuCisJS0VZREFUQSA9IChVQ0hBUiAqKSBST1VORF9VUChtcG9vbCwgNCk7CisJLy8gZGlnZXN0IExlbiA9IDgwLgorCWRpZ2VzdCA9IChVQ0hBUiAqKSBST1VORF9VUChLRVlEQVRBICsgNTEyLCA0KTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIldwYTJQYWlyTXNnM0FjdGlvbiAtLS0tLT5cbiIpKTsKKworCXBIZWFkZXIgPSAoUEhFQURFUl84MDJfMTEpIEVsZW0tPk1zZzsKKworCS8vIFByb2Nlc3MgbWVzc2FnZSAzIGZyYW1lLgorCXBNc2czID0gKFBFQVBPTF9QQUNLRVQpCSZFbGVtLT5Nc2dbTEVOR1RIXzgwMl8xMSArIExFTkdUSF84MDJfMV9IXTsKKworCU5kaXNaZXJvTWVtb3J5KChQVUNIQVIpJnBlZXJLZXlJbmZvLCBzaXplb2YocGVlcktleUluZm8pKTsKKwlOZGlzTW92ZU1lbW9yeSgoUFVDSEFSKSZwZWVyS2V5SW5mbywgKFBVQ0hBUikmcE1zZzMtPktleURlc2MuS2V5SW5mbywgc2l6ZW9mKEtFWV9JTkZPKSk7CisKKwkqKChVU0hPUlQqKSZwZWVyS2V5SW5mbykgPSBjcHUybGUxNigqKChVU0hPUlQqKSZwZWVyS2V5SW5mbykpOworCisJLy8gMS4gVmVyaWZ5IGNpcGhlciB0eXBlIG1hdGNoCisJaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkICYmIChwZWVyS2V5SW5mby5LZXlEZXNjVmVyIT0gMikpCisJeworCQlvc19mcmVlX21lbShwQWQsIChQVUNIQVIpbXBvb2wpOworCQlyZXR1cm47CisJfQorCWVsc2UgaWYocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQgJiYgKHBlZXJLZXlJbmZvLktleURlc2NWZXIgIT0gMSkpCisJeworCQlvc19mcmVlX21lbShwQWQsIChQVUNIQVIpbXBvb2wpOworCQlyZXR1cm47CisJfQorCisJLy8gMi4gQ2hlY2sgTUlDIHZhbHVlCisJLy8gU2F2ZSB0aGUgTUlDIGFuZCByZXBsYWNlIHdpdGggemVybworCU5kaXNNb3ZlTWVtb3J5KE9sZE1pYywgcE1zZzMtPktleURlc2MuS2V5TWljLCBMRU5fS0VZX0RFU0NfTUlDKTsKKwlOZGlzWmVyb01lbW9yeShwTXNnMy0+S2V5RGVzYy5LZXlNaWMsIExFTl9LRVlfREVTQ19NSUMpOworCWlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKKwl7CisJCS8vIEFFUworCQlITUFDX1NIQTEoKFBVQ0hBUikgcE1zZzMsIHBNc2czLT5Cb2R5X0xlblsxXSArIDQsIHBBZC0+U3RhQ2ZnLlBUSywgTEVOX0VBUF9NSUNLLCBkaWdlc3QpOworCQlOZGlzTW92ZU1lbW9yeShNaWMsIGRpZ2VzdCwgTEVOX0tFWV9ERVNDX01JQyk7CisJfQorCWVsc2UKKwl7CisJCWhtYWNfbWQ1KHBBZC0+U3RhQ2ZnLlBUSywgTEVOX0VBUF9NSUNLLCAoUFVDSEFSKSBwTXNnMywgcE1zZzMtPkJvZHlfTGVuWzFdICsgNCwgTWljKTsKKwl9CisKKwlpZighTmRpc0VxdWFsTWVtb3J5KE9sZE1pYywgTWljLCBMRU5fS0VZX0RFU0NfTUlDKSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiBNSUMgRGlmZmVyZW50IGluIG1zZyAzIG9mIDQtd2F5IGhhbmRzaGFrZSEhISEhISEhISEgXG4iKSk7CisJCW9zX2ZyZWVfbWVtKHBBZCwgKFBVQ0hBUiltcG9vbCk7CisJCXJldHVybjsKKwl9CisJZWxzZQorCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIgTUlDIFZBTElEIGluIG1zZyAzIG9mIDQtd2F5IGhhbmRzaGFrZSEhISEhISEhISEgXG4iKSk7CisKKwkvLyAzLiBDaGVjayBSZXBsYXkgQ291bnRlciwgaXQgaGFzIHRvIGJlIGxhcmdlciB0aGFuIGxhc3Qgb25lLiBObyBuZWVkIHRvIGJlIGV4YWN0IG9uZSBsYXJnZXIKKwlpZihSVE1QQ29tcGFyZU1lbW9yeShwTXNnMy0+S2V5RGVzYy5SZXBsYXlDb3VudGVyLCBwQWQtPlN0YUNmZy5SZXBsYXlDb3VudGVyLCBMRU5fS0VZX0RFU0NfUkVQTEFZKSAhPSAxKQorCXsKKwkJb3NfZnJlZV9tZW0ocEFkLCAoUFVDSEFSKW1wb29sKTsKKwkJcmV0dXJuOworCX0KKworCS8vIFVwZGF0ZSBuZXcgcmVwbGF5IGNvdW50ZXIKKwlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5SZXBsYXlDb3VudGVyLCBwTXNnMy0+S2V5RGVzYy5SZXBsYXlDb3VudGVyLCBMRU5fS0VZX0RFU0NfUkVQTEFZKTsKKworCS8vIDQuIERvdWJsZSBjaGVjayBBTm9uY2UKKwlpZighTmRpc0VxdWFsTWVtb3J5KHBBZC0+U3RhQ2ZnLkFOb25jZSwgcE1zZzMtPktleURlc2MuS2V5Tm9uY2UsIExFTl9LRVlfREVTQ19OT05DRSkpCisJeworCQlvc19mcmVlX21lbShwQWQsIChQVUNIQVIpbXBvb2wpOworCQlyZXR1cm47CisJfQorCisJLy8gT2J0YWluIEdUSworCS8vIDUuIERlY3J5cHQgR1RLIGZyb20gS2V5IERhdGEKKwlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiRUtEID0gJWRcbiIsIHBlZXJLZXlJbmZvLkVLRF9ETCkpOworCWlmKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQorCXsKKwkJLy8gRGVjcnlwdCBBRVMgR1RLCisJCUFFU19HVEtfS0VZX1VOV1JBUCgmcEFkLT5TdGFDZmcuUFRLWzE2XSwgS0VZREFUQSwgcE1zZzMtPktleURlc2MuS2V5RGF0YUxlblsxXSxwTXNnMy0+S2V5RGVzYy5LZXlEYXRhKTsKKwl9CisJZWxzZQkgIC8vIFRLSVAKKwl7CisJCUlOVCBpOworCQkvLyBEZWNyeXB0IFRLSVAgR1RLCisJCS8vIENvbnN0cnVjdCAzMiBieXRlcyBSQzQgS2V5CisJCU5kaXNNb3ZlTWVtb3J5KEtleSwgcE1zZzMtPktleURlc2MuS2V5SXYsIDE2KTsKKwkJTmRpc01vdmVNZW1vcnkoJktleVsxNl0sICZwQWQtPlN0YUNmZy5QVEtbMTZdLCAxNik7CisJCUFSQ0ZPVVJfSU5JVCgmcEFkLT5Qcml2YXRlSW5mby5XRVBDT05URVhULCBLZXksIDMyKTsKKwkJLy9kaXNjYXJkIGZpcnN0IDI1NiBieXRlcworCQlmb3IoaSA9IDA7IGkgPCAyNTY7IGkrKykKKwkJCUFSQ0ZPVVJfQllURSgmcEFkLT5Qcml2YXRlSW5mby5XRVBDT05URVhUKTsKKwkJLy8gRGVjcnlwdCBHVEsuIEJlY2FyZWZ1bCwgdGhlcmUgaXMgbm8gSUNWIHRvIGNoZWNrIHRoZSByZXN1bHQgaXMgY29ycmVjdCBvciBub3QKKwkJQVJDRk9VUl9ERUNSWVBUKCZwQWQtPlByaXZhdGVJbmZvLldFUENPTlRFWFQsIEtFWURBVEEsIHBNc2czLT5LZXlEZXNjLktleURhdGEsIHBNc2czLT5LZXlEZXNjLktleURhdGFMZW5bMV0pOworCX0KKworCWlmICghUGFyc2VLZXlEYXRhKHBBZCwgS0VZREFUQSwgcE1zZzMtPktleURlc2MuS2V5RGF0YUxlblsxXSwgMSkpCisJeworCQlvc19mcmVlX21lbShwQWQsIChQVUNIQVIpbXBvb2wpOworCQlyZXR1cm47CisJfQorCisJLy8gVXBkYXRlIEdUSyB0byBBU0lDCisJLy8gVXBkYXRlIGdyb3VwIGtleSBpbmZvcm1hdGlvbiB0byBBU0lDIFNoYXJlZCBLZXkgVGFibGUKKwlBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkLAorCQkJCQkJICBCU1MwLAorCQkJCQkJICBwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQsCisJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uQ2lwaGVyQWxnLAorCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLktleSwKKwkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5UeE1pYywKKwkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5SeE1pYyk7CisKKwkvLyBVcGRhdGUgQVNJQyBXQ0lEIGF0dHJpYnV0ZSB0YWJsZSBhbmQgSVZFSVYgdGFibGUKKwlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZCwKKwkJCQkJCQkgIEJTUzAsCisJCQkJCQkJICBwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQsCisJCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLkNpcGhlckFsZywKKwkJCQkJCQkgIE5VTEwpOworCisJLy8gaW5pdCA4MDIuMyBoZWFkZXIgYW5kIEZpbGwgUGFja2V0CisJTUFLRV84MDJfM19IRUFERVIoSGVhZGVyODAyXzMsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBFQVBPTCk7CisKKwkvLyBaZXJvIG1lc3NhZ2UgNCBib2R5CisJTmRpc1plcm9NZW1vcnkoJlBhY2tldCwgc2l6ZW9mKFBhY2tldCkpOworCVBhY2tldC5Qcm9WZXIJPSBFQVBPTF9WRVI7CisJUGFja2V0LlByb1R5cGUJPSBFQVBPTEtleTsKKwlQYWNrZXQuQm9keV9MZW5bMV0gIAk9IHNpemVvZihLRVlfREVTQ1JJUFRFUikgLSBNQVhfTEVOX09GX1JTTklFOwkJLy8gTm8gZGF0YSBmaWVsZAorCisJLy8KKwkvLyBNZXNzYWdlIDQgYXMgIEVBUE9MLUtleSgwLDEsMCwwLDAsUCwwLDAsTUlDLDApCisJLy8KKwlQYWNrZXQuS2V5RGVzYy5UeXBlID0gV1BBMl9LRVlfREVTQzsKKworCS8vIEtleSBkZXNjcmlwdG9yIHZlcnNpb24gYW5kIGFwcHJvcHJpYXRlIFJTTiBJRQorCVBhY2tldC5LZXlEZXNjLktleUluZm8uS2V5RGVzY1ZlciA9IHBlZXJLZXlJbmZvLktleURlc2NWZXI7CisKKwkvLyBVcGRhdGUgS2V5IExlbmd0aAorCVBhY2tldC5LZXlEZXNjLktleUxlbmd0aFswXSA9IHBNc2czLT5LZXlEZXNjLktleUxlbmd0aFswXTsKKwlQYWNrZXQuS2V5RGVzYy5LZXlMZW5ndGhbMV0gPSBwTXNnMy0+S2V5RGVzYy5LZXlMZW5ndGhbMV07CisKKwkvLyBLZXkgVHlwZSBQZWVyS2V5CisJUGFja2V0LktleURlc2MuS2V5SW5mby5LZXlUeXBlID0gUEFJUldJU0VLRVk7CisKKwkvLyBLZXlNaWMgZmllbGQgcHJlc2VudGVkCisJUGFja2V0LktleURlc2MuS2V5SW5mby5LZXlNaWMgID0gMTsKKwlQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLlNlY3VyZSA9IDE7CisKKwkvLyBDb252ZXJ0IHRvIGxpdHRsZS1lbmRpYW4gZm9ybWF0LgorCSooKFVTSE9SVCAqKSZQYWNrZXQuS2V5RGVzYy5LZXlJbmZvKSA9IGNwdTJsZTE2KCooKFVTSE9SVCAqKSZQYWNrZXQuS2V5RGVzYy5LZXlJbmZvKSk7CisKKwkvLyBLZXkgUmVwbGF5IGNvdW50CisJTmRpc01vdmVNZW1vcnkoUGFja2V0LktleURlc2MuUmVwbGF5Q291bnRlciwgcE1zZzMtPktleURlc2MuUmVwbGF5Q291bnRlciwgTEVOX0tFWV9ERVNDX1JFUExBWSk7CisKKwkvLyBPdXQgYnVmZmVyIGZvciB0cmFuc21pdHRpbmcgbWVzc2FnZSA0CisJTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgKFBVQ0hBUiAqKSZwT3V0QnVmZmVyKTsgIC8vIGFsbG9jYXRlIG1lbW9yeQorCWlmKHBPdXRCdWZmZXIgPT0gTlVMTCkKKwl7CisJCW9zX2ZyZWVfbWVtKHBBZCwgKFBVQ0hBUiltcG9vbCk7CisJCXJldHVybjsKKwl9CisKKwkvLyBQcmVwYXJlIEVBUE9MIGZyYW1lIGZvciBNSUMgY2FsY3VsYXRpb24KKwkvLyBCZSBjYXJlZnVsLCBvbmx5IEVBUE9MIGZyYW1lIGlzIGNvdW50ZWQgZm9yIE1JQyBjYWxjdWxhdGlvbgorCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAgICAmRnJhbWVMZW4sCisJCVBhY2tldC5Cb2R5X0xlblsxXSArIDQsICAgICZQYWNrZXQsCisJCUVORF9PRl9BUkdTKTsKKworCS8vIFByZXBhcmUgYW5kIEZpbGwgTUlDIHZhbHVlCisJTmRpc1plcm9NZW1vcnkoTWljLCBzaXplb2YoTWljKSk7CisJaWYocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCisJeworCQkvLyBBRVMKKwkJSE1BQ19TSEExKHBPdXRCdWZmZXIsIEZyYW1lTGVuLCBwQWQtPlN0YUNmZy5QVEssIExFTl9FQVBfTUlDSywgZGlnZXN0KTsKKwkJTmRpc01vdmVNZW1vcnkoTWljLCBkaWdlc3QsIExFTl9LRVlfREVTQ19NSUMpOworCX0KKwllbHNlCisJeworCQlobWFjX21kNShwQWQtPlN0YUNmZy5QVEssIExFTl9FQVBfTUlDSywgcE91dEJ1ZmZlciwgRnJhbWVMZW4sIE1pYyk7CisJfQorCU5kaXNNb3ZlTWVtb3J5KFBhY2tldC5LZXlEZXNjLktleU1pYywgTWljLCBMRU5fS0VZX0RFU0NfTUlDKTsKKworCS8vIFVwZGF0ZSBQVEsKKwkvLyBQcmVwYXJlIHBhaXItd2lzZSBrZXkgaW5mb3JtYXRpb24gaW50byBzaGFyZWQga2V5IHRhYmxlCisJTmRpc1plcm9NZW1vcnkoJnBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLCBzaXplb2YoQ0lQSEVSX0tFWSkpOworCXBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLktleUxlbiA9IExFTl9US0lQX0VLOworICAgIE5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLktleSwgJnBBZC0+U3RhQ2ZnLlBUS1szMl0sIExFTl9US0lQX0VLKTsKKwlOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5SeE1pYywgJnBBZC0+U3RhQ2ZnLlBUS1s0OF0sIExFTl9US0lQX1JYTUlDSyk7CisJTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uVHhNaWMsICZwQWQtPlN0YUNmZy5QVEtbNDgrTEVOX1RLSVBfUlhNSUNLXSwgTEVOX1RLSVBfVFhNSUNLKTsKKworCS8vIERlY2lkZSBpdHMgQ2hpcGVyQWxnCisJaWYgKHBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkKKwkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnID0gQ0lQSEVSX1RLSVA7CisJZWxzZSBpZiAocEFkLT5TdGFDZmcuUGFpckNpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQorCQlwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcgPSBDSVBIRVJfQUVTOworCWVsc2UKKwkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnID0gQ0lQSEVSX05PTkU7CisKKwkvLyBVcGRhdGUgdGhlc2UgcmVsYXRlZCBpbmZvcm1hdGlvbiB0byBNQUNfVEFCTEVfRU5UUlkKKwlwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXTsKKwlOZGlzTW92ZU1lbW9yeSgmcEVudHJ5LT5QYWlyd2lzZUtleS5LZXksICZwQWQtPlN0YUNmZy5QVEtbMzJdLCBMRU5fVEtJUF9FSyk7CisJTmRpc01vdmVNZW1vcnkoJnBFbnRyeS0+UGFpcndpc2VLZXkuUnhNaWMsICZwQWQtPlN0YUNmZy5QVEtbNDhdLCBMRU5fVEtJUF9SWE1JQ0spOworCU5kaXNNb3ZlTWVtb3J5KCZwRW50cnktPlBhaXJ3aXNlS2V5LlR4TWljLCAmcEFkLT5TdGFDZmcuUFRLWzQ4K0xFTl9US0lQX1JYTUlDS10sIExFTl9US0lQX1RYTUlDSyk7CisJcEVudHJ5LT5QYWlyd2lzZUtleS5DaXBoZXJBbGcgPSBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGc7CisKKwkvLyBVcGRhdGUgcGFpcndpc2Uga2V5IGluZm9ybWF0aW9uIHRvIEFTSUMgU2hhcmVkIEtleSBUYWJsZQorCUFzaWNBZGRTaGFyZWRLZXlFbnRyeShwQWQsCisJCQkJCQkgIEJTUzAsCisJCQkJCQkgIDAsCisJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZywKKwkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5LAorCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5UeE1pYywKKwkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uUnhNaWMpOworCisJLy8gVXBkYXRlIEFTSUMgV0NJRCBhdHRyaWJ1dGUgdGFibGUgYW5kIElWRUlWIHRhYmxlCisJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWQsCisJCQkJCQkJICBCU1MwLAorCQkJCQkJCSAgMCwKKwkJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZywKKwkJCQkJCQkgIHBFbnRyeSk7CisKKwkvLyBNYWtlICBUcmFuc21pdHRpbmcgZnJhbWUKKwlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAgICAgICAgICAgCSZGcmFtZUxlbiwKKwkJCSAgCQkJTEVOR1RIXzgwMl8zLCAgICAgCQkmSGVhZGVyODAyXzMsCisJCQkJCQlQYWNrZXQuQm9keV9MZW5bMV0gKyA0LCAmUGFja2V0LAorCQkJCQkJRU5EX09GX0FSR1MpOworCisKKwkvLyBDb3B5IGZyYW1lIHRvIFR4IHJpbmcgYW5kIFNlbmQgTWVzc2FnZSA0IHRvIGF1dGhlbnRpY2F0b3IKKwlSVE1QVG9XaXJlbGVzc1N0YShwQWQsIEhlYWRlcjgwMl8zLCBMRU5HVEhfODAyXzMsIChQVUNIQVIpJlBhY2tldCwgUGFja2V0LkJvZHlfTGVuWzFdICsgNCwgVFJVRSk7CisKKwkvLyBzZXQgODAyLjF4IHBvcnQgY29udHJvbAorCS8vcEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRDsKKwlTVEFfUE9SVF9TRUNVUkVEKHBBZCk7CisKKyAgICAvLyBJbmRpY2F0ZSBDb25uZWN0ZWQgZm9yIEdVSQorICAgIHBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID0gTmRpc01lZGlhU3RhdGVDb25uZWN0ZWQ7CisKKwlNbG1lRnJlZU1lbW9yeShwQWQsIChQVUNIQVIpcE91dEJ1ZmZlcik7CisJb3NfZnJlZV9tZW0ocEFkLCAoUFVDSEFSKW1wb29sKTsKKworCisJLy8gc2VuZCB3aXJlbGVzcyBldmVudCAtIGZvciBzZXQga2V5IGRvbmUgV1BBMgorCWlmIChwQWQtPkNvbW1vbkNmZy5iV2lyZWxlc3NFdmVudCkKKwkJUlRNUFNlbmRXaXJlbGVzc0V2ZW50KHBBZCwgSVdfU0VUX0tFWV9ET05FX1dQQTJfRVZFTlRfRkxBRywgcEVudHJ5LT5BZGRyLCBCU1MwLCAwKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIldwYTJQYWlyTXNnM0FjdGlvbiA8LS0tLS1cbiIpKTsKKworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJUHJvY2VzcyBHcm91cCBrZXkgMi13YXkgaGFuZHNoYWtpbmcKKworCUFyZ3VtZW50czoKKwkJcEFkCVBvaW50ZXIJdG8gb3VyIGFkYXB0ZXIKKwkJRWxlbQkJTWVzc2FnZSBib2R5CisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECVdwYUdyb3VwTXNnMUFjdGlvbigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglNTE1FX1FVRVVFX0VMRU0JKkVsZW0pCisKK3sKKwlQVUNIQVIgICAgICAgICAgICAgIHBPdXRCdWZmZXIgPSBOVUxMOworCVVDSEFSICAgICAgICAgICAgICAgSGVhZGVyODAyXzNbMTRdOworCVVMT05HICAgICAgICAgICAgICAgRnJhbWVMZW4gPSAwOworCUVBUE9MX1BBQ0tFVCAgICAgICAgUGFja2V0OworCVBFQVBPTF9QQUNLRVQgICAgICAgcEdyb3VwOworCVVDSEFSICAgICAgICAgICAgICAgKm1wb29sLCAqZGlnZXN0LCAqS0VZREFUQTsKKwlVQ0hBUiAgICAgICAgICAgICAgIE1pY1sxNl0sIE9sZE1pY1sxNl07CisJVUNIQVIgICAgICAgICAgICAgICBHVEtbMzJdLCBLZXlbMzJdOworCUtFWV9JTkZPCQkJcGVlcktleUluZm87CisKKwkvLyBhbGxvY2F0ZSBtZW1vcnkKKwlvc19hbGxvY19tZW0ocEFkLCAoUFVDSEFSICopJm1wb29sLCAxMDI0KTsKKworCWlmKG1wb29sID09IE5VTEwpCisJCXJldHVybjsKKworCS8vIGRpZ2VzdCBMZW4gPSA4MC4KKwlkaWdlc3QgPSAoVUNIQVIgKikgUk9VTkRfVVAobXBvb2wsIDQpOworCS8vIEtFWURBVEEgTGVuID0gNTEyLgorCUtFWURBVEEgPSAoVUNIQVIgKikgUk9VTkRfVVAoZGlnZXN0ICsgODAsIDQpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiV3BhR3JvdXBNc2cxQWN0aW9uIC0tLS0tPlxuIikpOworCisJLy8gUHJvY2VzcyBHcm91cCBNZXNzYWdlIDEgZnJhbWUuIHNraXAgODAyLjExIGhlYWRlcigyNCkgJiBMTENfU05BUCBoZWFkZXIoOCkKKwlwR3JvdXAgPSAoUEVBUE9MX1BBQ0tFVCkgJkVsZW0tPk1zZ1tMRU5HVEhfODAyXzExICsgTEVOR1RIXzgwMl8xX0hdOworCisJTmRpc1plcm9NZW1vcnkoKFBVQ0hBUikmcGVlcktleUluZm8sIHNpemVvZihwZWVyS2V5SW5mbykpOworCU5kaXNNb3ZlTWVtb3J5KChQVUNIQVIpJnBlZXJLZXlJbmZvLCAoUFVDSEFSKSZwR3JvdXAtPktleURlc2MuS2V5SW5mbywgc2l6ZW9mKEtFWV9JTkZPKSk7CisKKwkqKChVU0hPUlQqKSZwZWVyS2V5SW5mbykgPSBjcHUybGUxNigqKChVU0hPUlQqKSZwZWVyS2V5SW5mbykpOworCisJLy8gMC4gQ2hlY2sgY2lwaGVyIHR5cGUgbWF0Y2gKKwlpZiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQgJiYgKHBlZXJLZXlJbmZvLktleURlc2NWZXIgIT0gMikpCisJeworCQlvc19mcmVlX21lbShwQWQsIChQVUNIQVIpbXBvb2wpOworCQlyZXR1cm47CisJfQorCWVsc2UgaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkICYmIChwZWVyS2V5SW5mby5LZXlEZXNjVmVyICE9IDEpKQorCXsKKwkJb3NfZnJlZV9tZW0ocEFkLCAoUFVDSEFSKW1wb29sKTsKKwkJcmV0dXJuOworCX0KKworCS8vIDEuIFZlcmlmeSBSZXBsYXkgY291bnRlcgorCS8vICAgIENoZWNrIFJlcGxheSBDb3VudGVyLCBpdCBoYXMgdG8gYmUgbGFyZ2VyIHRoYW4gbGFzdCBvbmUuIE5vIG5lZWQgdG8gYmUgZXhhY3Qgb25lIGxhcmdlcgorCWlmKFJUTVBDb21wYXJlTWVtb3J5KHBHcm91cC0+S2V5RGVzYy5SZXBsYXlDb3VudGVyLCBwQWQtPlN0YUNmZy5SZXBsYXlDb3VudGVyLCBMRU5fS0VZX0RFU0NfUkVQTEFZKSAhPSAxKQorCXsKKwkJb3NfZnJlZV9tZW0ocEFkLCAoUFVDSEFSKW1wb29sKTsKKwkJcmV0dXJuOworCX0KKworCS8vIFVwZGF0ZSBuZXcgcmVwbGF5IGNvdW50ZXIKKwlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5SZXBsYXlDb3VudGVyLCBwR3JvdXAtPktleURlc2MuUmVwbGF5Q291bnRlciwgTEVOX0tFWV9ERVNDX1JFUExBWSk7CisKKwkvLyAyLiBWZXJpZnkgTUlDIGlzIHZhbGlkCisJLy8gU2F2ZSB0aGUgTUlDIGFuZCByZXBsYWNlIHdpdGggemVybworCU5kaXNNb3ZlTWVtb3J5KE9sZE1pYywgcEdyb3VwLT5LZXlEZXNjLktleU1pYywgTEVOX0tFWV9ERVNDX01JQyk7CisJTmRpc1plcm9NZW1vcnkocEdyb3VwLT5LZXlEZXNjLktleU1pYywgTEVOX0tFWV9ERVNDX01JQyk7CisKKwlpZihwQWQtPlN0YUNmZy5XZXBTdGF0dXMgID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCisJewkvLyBBRVMKKwkJSE1BQ19TSEExKChQVUNIQVIpIHBHcm91cCwgcEdyb3VwLT5Cb2R5X0xlblsxXSArIDQsIHBBZC0+U3RhQ2ZnLlBUSywgTEVOX0VBUF9NSUNLLCBkaWdlc3QpOworCQlOZGlzTW92ZU1lbW9yeShNaWMsIGRpZ2VzdCwgTEVOX0tFWV9ERVNDX01JQyk7CisJfQorCWVsc2UKKwl7CS8vIFRLSVAKKwkJaG1hY19tZDUocEFkLT5TdGFDZmcuUFRLLCBMRU5fRUFQX01JQ0ssIChQVUNIQVIpIHBHcm91cCwgcEdyb3VwLT5Cb2R5X0xlblsxXSArIDQsIE1pYyk7CisJfQorCisJaWYoIU5kaXNFcXVhbE1lbW9yeShPbGRNaWMsIE1pYywgTEVOX0tFWV9ERVNDX01JQykpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIgTUlDIERpZmZlcmVudCBpbiBncm91cCBtc2cgMSBvZiAyLXdheSBoYW5kc2hha2UhISEhISEhISEhIFxuIikpOworCQlNbG1lRnJlZU1lbW9yeShwQWQsIChQVUNIQVIpbXBvb2wpOworCQlyZXR1cm47CisJfQorCWVsc2UKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiIE1JQyBWQUxJRCBpbiBncm91cCBtc2cgMSBvZiAyLXdheSBoYW5kc2hha2UhISEhISEhISEhIFxuIikpOworCisKKwkvLyAzLiBEZWNyeXB0IEdUSyBmcm9tIEtleSBEYXRhCisJaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQorCXsKKwkJLy8gRGVjcnlwdCBBRVMgR1RLCisJCUFFU19HVEtfS0VZX1VOV1JBUCgmcEFkLT5TdGFDZmcuUFRLWzE2XSwgS0VZREFUQSwgIHBHcm91cC0+S2V5RGVzYy5LZXlEYXRhTGVuWzFdLCBwR3JvdXAtPktleURlc2MuS2V5RGF0YSk7CisJfQorCWVsc2UJLy8gVEtJUAorCXsKKwkJSU5UIGk7CisKKwkJLy8gRGVjcnlwdCBUS0lQIEdUSworCQkvLyBDb25zdHJ1Y3QgMzIgYnl0ZXMgUkM0IEtleQorCQlOZGlzTW92ZU1lbW9yeShLZXksIHBHcm91cC0+S2V5RGVzYy5LZXlJdiwgMTYpOworCQlOZGlzTW92ZU1lbW9yeSgmS2V5WzE2XSwgJnBBZC0+U3RhQ2ZnLlBUS1sxNl0sIDE2KTsKKwkJQVJDRk9VUl9JTklUKCZwQWQtPlByaXZhdGVJbmZvLldFUENPTlRFWFQsIEtleSwgMzIpOworCQkvL2Rpc2NhcmQgZmlyc3QgMjU2IGJ5dGVzCisJCWZvcihpID0gMDsgaSA8IDI1NjsgaSsrKQorCQkJQVJDRk9VUl9CWVRFKCZwQWQtPlByaXZhdGVJbmZvLldFUENPTlRFWFQpOworCQkvLyBEZWNyeXB0IEdUSy4gQmVjYXJlZnVsLCB0aGVyZSBpcyBubyBJQ1YgdG8gY2hlY2sgdGhlIHJlc3VsdCBpcyBjb3JyZWN0IG9yIG5vdAorCQlBUkNGT1VSX0RFQ1JZUFQoJnBBZC0+UHJpdmF0ZUluZm8uV0VQQ09OVEVYVCwgS0VZREFUQSwgcEdyb3VwLT5LZXlEZXNjLktleURhdGEsIHBHcm91cC0+S2V5RGVzYy5LZXlEYXRhTGVuWzFdKTsKKwl9CisKKwkvLyBQcm9jZXNzIGRlY3J5cHRlZCBrZXkgZGF0YSBtYXRlcmlhbAorCS8vIFBhcnNlIGtleURhdGEgdG8gaGFuZGxlIEtERSBmb3JtYXQgZm9yIFdQQTJQU0sKKwlpZiAocGVlcktleUluZm8uRUtEX0RMKQorCXsKKwkJaWYgKCFQYXJzZUtleURhdGEocEFkLCBLRVlEQVRBLCBwR3JvdXAtPktleURlc2MuS2V5RGF0YUxlblsxXSwgMCkpCisJCXsKKwkJCW9zX2ZyZWVfbWVtKHBBZCwgKFBVQ0hBUiltcG9vbCk7CisJCQlyZXR1cm47CisJCX0KKwl9CisJZWxzZQkvLyBXUEFQU0sKKwl7CisJCS8vIHNldCBrZXkgbWF0ZXJpYWwsIFR4TWljIGFuZCBSeE1pYyBmb3IgV1BBUFNLCisJCU5kaXNNb3ZlTWVtb3J5KEdUSywgS0VZREFUQSwgMzIpOworCQlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5HVEssIEdUSywgMzIpOworCQlwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQgPSBwZWVyS2V5SW5mby5LZXlJbmRleDsKKworCQkvLyBQcmVwYXJlIHBhaXItd2lzZSBrZXkgaW5mb3JtYXRpb24gaW50byBzaGFyZWQga2V5IHRhYmxlCisJCU5kaXNaZXJvTWVtb3J5KCZwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLCBzaXplb2YoQ0lQSEVSX0tFWSkpOworCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLktleUxlbiA9IExFTl9US0lQX0VLOworCQlOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLktleSwgR1RLLCBMRU5fVEtJUF9FSyk7CisJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uUnhNaWMsICZHVEtbMTZdLCBMRU5fVEtJUF9SWE1JQ0spOworCQlOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLlR4TWljLCAmR1RLWzI0XSwgTEVOX1RLSVBfVFhNSUNLKTsKKworCQkvLyBVcGRhdGUgU2hhcmVkIEtleSBDaXBoZXJBbGcKKwkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5DaXBoZXJBbGcgPSBDSVBIRVJfTk9ORTsKKwkJaWYgKHBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpCisJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLkNpcGhlckFsZyA9IENJUEhFUl9US0lQOworCQllbHNlIGlmIChwQWQtPlN0YUNmZy5Hcm91cENpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQorCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5DaXBoZXJBbGcgPSBDSVBIRVJfQUVTOworCQllbHNlIGlmIChwQWQtPlN0YUNmZy5Hcm91cENpcGhlciA9PSBOZGlzODAyXzExR3JvdXBXRVA0MEVuYWJsZWQpCisJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLkNpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKKwkJZWxzZSBpZiAocEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgPT0gTmRpczgwMl8xMUdyb3VwV0VQMTA0RW5hYmxlZCkKKwkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDEyODsKKworICAgIAkvL2hleF9kdW1wKCJHcm91cCBLZXkgOiIsIHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uS2V5LCBMRU5fVEtJUF9FSyk7CisJfQorCisJLy8gVXBkYXRlIGdyb3VwIGtleSBpbmZvcm1hdGlvbiB0byBBU0lDIFNoYXJlZCBLZXkgVGFibGUKKwlBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkLAorCQkJCQkJICBCU1MwLAorCQkJCQkJICBwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQsCisJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uQ2lwaGVyQWxnLAorCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLktleSwKKwkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5UeE1pYywKKwkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5SeE1pYyk7CisKKwkvLyBVcGRhdGUgQVNJQyBXQ0lEIGF0dHJpYnV0ZSB0YWJsZSBhbmQgSVZFSVYgdGFibGUKKwlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZCwKKwkJCQkJCQkgIEJTUzAsCisJCQkJCQkJICBwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQsCisJCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLkNpcGhlckFsZywKKwkJCQkJCQkgIE5VTEwpOworCisJLy8gc2V0IDgwMi4xeCBwb3J0IGNvbnRyb2wKKwkvL3BBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQ7CisJU1RBX1BPUlRfU0VDVVJFRChwQWQpOworCisgICAgLy8gSW5kaWNhdGUgQ29ubmVjdGVkIGZvciBHVUkKKyAgICBwQWQtPkluZGljYXRlTWVkaWFTdGF0ZSA9IE5kaXNNZWRpYVN0YXRlQ29ubmVjdGVkOworCisJLy8gaW5pdCBoZWFkZXIgYW5kIEZpbGwgUGFja2V0CisJTUFLRV84MDJfM19IRUFERVIoSGVhZGVyODAyXzMsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBFQVBPTCk7CisKKwkvLyBaZXJvIEdyb3VwIG1lc3NhZ2UgMSBib2R5CisJTmRpc1plcm9NZW1vcnkoJlBhY2tldCwgc2l6ZW9mKFBhY2tldCkpOworCVBhY2tldC5Qcm9WZXIJPSBFQVBPTF9WRVI7CisJUGFja2V0LlByb1R5cGUJPSBFQVBPTEtleTsKKwlQYWNrZXQuQm9keV9MZW5bMV0gID0gc2l6ZW9mKEtFWV9ERVNDUklQVEVSKSAtIE1BWF9MRU5fT0ZfUlNOSUU7CQkvLyBObyBkYXRhIGZpZWxkCisKKwkvLworCS8vIEdyb3VwIE1lc3NhZ2UgMiBhcyAgRUFQT0wtS2V5KDEsMCwwLDAsRywwLDAsTUlDLDApCisJLy8KKwlpZiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykKKwl7CisJCVBhY2tldC5LZXlEZXNjLlR5cGUgPSBXUEEyX0tFWV9ERVNDOworCX0KKwllbHNlCisJeworCQlQYWNrZXQuS2V5RGVzYy5UeXBlID0gV1BBMV9LRVlfREVTQzsKKwl9CisKKwkvLyBLZXkgZGVzY3JpcHRvciB2ZXJzaW9uIGFuZCBhcHByb3ByaWF0ZSBSU04gSUUKKwlQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLktleURlc2NWZXIgPSBwZWVyS2V5SW5mby5LZXlEZXNjVmVyOworCisJLy8gVXBkYXRlIEtleSBMZW5ndGgKKwlQYWNrZXQuS2V5RGVzYy5LZXlMZW5ndGhbMF0gPSBwR3JvdXAtPktleURlc2MuS2V5TGVuZ3RoWzBdOworCVBhY2tldC5LZXlEZXNjLktleUxlbmd0aFsxXSA9IHBHcm91cC0+S2V5RGVzYy5LZXlMZW5ndGhbMV07CisKKwkvLyBLZXkgSW5kZXggYXMgRy1Nc2cgMQorCWlmKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykKKwkJUGFja2V0LktleURlc2MuS2V5SW5mby5LZXlJbmRleCA9IHBlZXJLZXlJbmZvLktleUluZGV4OworCisJLy8gS2V5IFR5cGUgR3JvdXAga2V5CisJUGFja2V0LktleURlc2MuS2V5SW5mby5LZXlUeXBlID0gR1JPVVBLRVk7CisKKwkvLyBLZXlNaWMgZmllbGQgcHJlc2VudGVkCisJUGFja2V0LktleURlc2MuS2V5SW5mby5LZXlNaWMgID0gMTsKKworCS8vIFNlY3VyZSBiaXQKKwlQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLlNlY3VyZSAgPSAxOworCisJLy8gQ29udmVydCB0byBsaXR0bGUtZW5kaWFuIGZvcm1hdC4KKwkqKChVU0hPUlQgKikmUGFja2V0LktleURlc2MuS2V5SW5mbykgPSBjcHUybGUxNigqKChVU0hPUlQgKikmUGFja2V0LktleURlc2MuS2V5SW5mbykpOworCisJLy8gS2V5IFJlcGxheSBjb3VudAorCU5kaXNNb3ZlTWVtb3J5KFBhY2tldC5LZXlEZXNjLlJlcGxheUNvdW50ZXIsIHBHcm91cC0+S2V5RGVzYy5SZXBsYXlDb3VudGVyLCBMRU5fS0VZX0RFU0NfUkVQTEFZKTsKKworCS8vIE91dCBidWZmZXIgZm9yIHRyYW5zbWl0dGluZyBncm91cCBtZXNzYWdlIDIKKwlNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAoUFVDSEFSICopJnBPdXRCdWZmZXIpOyAgLy8gYWxsb2NhdGUgbWVtb3J5CisJaWYocE91dEJ1ZmZlciA9PSBOVUxMKQorCXsKKwkJTWxtZUZyZWVNZW1vcnkocEFkLCAoUFVDSEFSKW1wb29sKTsKKwkJcmV0dXJuOworCX0KKworCS8vIFByZXBhcmUgRUFQT0wgZnJhbWUgZm9yIE1JQyBjYWxjdWxhdGlvbgorCS8vIEJlIGNhcmVmdWwsIG9ubHkgRUFQT0wgZnJhbWUgaXMgY291bnRlZCBmb3IgTUlDIGNhbGN1bGF0aW9uCisJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICAgICZGcmFtZUxlbiwKKwkJUGFja2V0LkJvZHlfTGVuWzFdICsgNCwgICAgJlBhY2tldCwKKwkJRU5EX09GX0FSR1MpOworCisJLy8gUHJlcGFyZSBhbmQgRmlsbCBNSUMgdmFsdWUKKwlOZGlzWmVyb01lbW9yeShNaWMsIHNpemVvZihNaWMpKTsKKwlpZihwQWQtPlN0YUNmZy5XZXBTdGF0dXMgID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCisJeworCQkvLyBBRVMKKwkJSE1BQ19TSEExKHBPdXRCdWZmZXIsIEZyYW1lTGVuLCBwQWQtPlN0YUNmZy5QVEssIExFTl9FQVBfTUlDSywgZGlnZXN0KTsKKwkJTmRpc01vdmVNZW1vcnkoTWljLCBkaWdlc3QsIExFTl9LRVlfREVTQ19NSUMpOworCX0KKwllbHNlCisJeworCQlobWFjX21kNShwQWQtPlN0YUNmZy5QVEssIExFTl9FQVBfTUlDSywgcE91dEJ1ZmZlciwgRnJhbWVMZW4sIE1pYyk7CisJfQorCU5kaXNNb3ZlTWVtb3J5KFBhY2tldC5LZXlEZXNjLktleU1pYywgTWljLCBMRU5fS0VZX0RFU0NfTUlDKTsKKworCisJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgCQkmRnJhbWVMZW4sCisJCQkJCQlMRU5HVEhfODAyXzMsICAgICAJCSZIZWFkZXI4MDJfMywKKwkJCQkJCVBhY2tldC5Cb2R5X0xlblsxXSArIDQsICZQYWNrZXQsCisJCQkJCQlFTkRfT0ZfQVJHUyk7CisKKworCS8vIDUuIENvcHkgZnJhbWUgdG8gVHggcmluZyBhbmQgcHJlcGFyZSBmb3IgZW5jcnlwdGlvbgorCVJUTVBUb1dpcmVsZXNzU3RhKHBBZCwgSGVhZGVyODAyXzMsIExFTkdUSF84MDJfMywgKFBVQ0hBUikmUGFja2V0LCBQYWNrZXQuQm9keV9MZW5bMV0gKyA0LCBGQUxTRSk7CisKKwkvLyA2IEZyZWUgYWxsb2NhdGVkIG1lbW9yeQorCU1sbWVGcmVlTWVtb3J5KHBBZCwgKFBVQ0hBUilwT3V0QnVmZmVyKTsKKwlvc19mcmVlX21lbShwQWQsIChQVUNIQVIpbXBvb2wpOworCisJLy8gc2VuZCB3aXJlbGVzcyBldmVudCAtIGZvciBzZXQga2V5IGRvbmUgV1BBMgorCWlmIChwQWQtPkNvbW1vbkNmZy5iV2lyZWxlc3NFdmVudCkKKwkJUlRNUFNlbmRXaXJlbGVzc0V2ZW50KHBBZCwgSVdfU0VUX0tFWV9ET05FX1dQQTJfRVZFTlRfRkxBRywgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5BZGRyLCBCU1MwLCAwKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIldwYUdyb3VwTXNnMUFjdGlvbiA8LS0tLS1cbiIpKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCUluaXQgV1BBIE1BQyBoZWFkZXIKKworCUFyZ3VtZW50czoKKwkJcEFkCVBvaW50ZXIJdG8gb3VyIGFkYXB0ZXIKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJV3BhTWFjSGVhZGVySW5pdCgKKwlJTgkJUFJUTVBfQURBUFRFUglwQWQsCisJSU4gT1VUCVBIRUFERVJfODAyXzExCXBIZHI4MDIxMSwKKwlJTgkJVUNIQVIJCQl3ZXAsCisJSU4JCVBVQ0hBUgkJICAgIHBBZGRyMSkKK3sKKwlOZGlzWmVyb01lbW9yeShwSGRyODAyMTEsIHNpemVvZihIRUFERVJfODAyXzExKSk7CisJcEhkcjgwMjExLT5GQy5UeXBlCT0gQlRZUEVfREFUQTsKKwlwSGRyODAyMTEtPkZDLlRvRHMJPSAxOworCWlmICh3ZXAJPT0gMSkKKwkJcEhkcjgwMjExLT5GQy5XZXAgPSAxOworCisJIC8vCUFkZHIxOiBCU1NJRCwgQWRkcjI6IFNBLCBBZGRyMzoJREEKKwlDT1BZX01BQ19BRERSKHBIZHI4MDIxMS0+QWRkcjEsIHBBZGRyMSk7CisJQ09QWV9NQUNfQUREUihwSGRyODAyMTEtPkFkZHIyLCBwQWQtPkN1cnJlbnRBZGRyZXNzKTsKKwlDT1BZX01BQ19BRERSKHBIZHI4MDIxMS0+QWRkcjMsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKwlwSGRyODAyMTEtPlNlcXVlbmNlID0JcEFkLT5TZXF1ZW5jZTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUJRGVzY3JpcHRpb246CisJCUNvcHkgZnJhbWUgZnJvbSB3YWl0aW5nIHF1ZXVlIGludG8gcmVsYXRpdmUgcmluZyBidWZmZXIgYW5kIHNldAorCWFwcHJvcHJpYXRlIEFTSUMgcmVnaXN0ZXIgdG8ga2ljayBoYXJkd2FyZSBlbmNyeXB0aW9uIGJlZm9yZSByZWFsbHkKKwlzZW50IG91dCB0byBhaXIuCisKKwlBcmd1bWVudHM6CisJCXBBZAkJUG9pbnRlcgl0byBvdXIgYWRhcHRlcgorCQlQTkRJU19QQUNLRVQJUG9pbnRlciB0byBvdXRnb2luZyBOZGlzIGZyYW1lCisJCU51bWJlck9mRnJhZwlOdW1iZXIgb2YgZnJhZ21lbnQgcmVxdWlyZWQKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgICAgUlRNUFRvV2lyZWxlc3NTdGEoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4gIFBVQ0hBUiAgICAgICAgICBwSGVhZGVyODAyXzMsCisgICAgSU4gIFVJTlQgICAgICAgICAgICBIZHJMZW4sCisJSU4gIFBVQ0hBUiAgICAgICAgICBwRGF0YSwKKyAgICBJTiAgVUlOVCAgICAgICAgICAgIERhdGFMZW4sCisgICAgSU4JQk9PTEVBTgkJCWlzNHdheUZyYW1lKQorCit7CisJTkRJU19TVEFUVVMgICAgIFN0YXR1czsKKwlQTkRJU19QQUNLRVQgICAgcFBhY2tldDsKKwlVQ0hBUiAgIEluZGV4OworCisJZG8KKwl7CisJCS8vIDEuIGJ1aWxkIGEgTkRJUyBwYWNrZXQgYW5kIGNhbGwgUlRNUFNlbmRQYWNrZXQoKTsKKwkJLy8gICAgYmUgY2FyZWZ1bCBhYm91dCBob3cvd2hlbiB0byByZWxlYXNlIHRoaXMgaW50ZXJuYWwgYWxsb2NhdGVkIE5ESVMgUEFDS0VUIGJ1ZmZlcgorCQlTdGF0dXMgPSBSVE1QQWxsb2NhdGVOZGlzUGFja2V0KHBBZCwgJnBQYWNrZXQsIHBIZWFkZXI4MDJfMywgSGRyTGVuLCBwRGF0YSwgRGF0YUxlbik7CisJCWlmIChTdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJCWJyZWFrOworCisJCWlmIChpczR3YXlGcmFtZSkKKwkJCVJUTVBfU0VUX1BBQ0tFVF9DTEVBUl9FQVBfRlJBTUUocFBhY2tldCwgMSk7CisJCWVsc2UKKwkJCVJUTVBfU0VUX1BBQ0tFVF9DTEVBUl9FQVBfRlJBTUUocFBhY2tldCwgMCk7CisKKwkJLy8gMi4gc2VuZCBvdXQgdGhlIHBhY2tldAorCQlTdGF0dXMgPSBTVEFTZW5kUGFja2V0KHBBZCwgcFBhY2tldCk7CisJCWlmKFN0YXR1cyA9PSBORElTX1NUQVRVU19TVUNDRVNTKQorCQl7CisJCQkvLyBEZXF1ZXVlIG9uZSBmcmFtZSBmcm9tIFR4U3dRdWV1ZTAuLjMgcXVldWUgYW5kIHByb2Nlc3MgaXQKKwkJCS8vIFRoZXJlIGFyZSB0aHJlZSBwbGFjZSBjYWxsaW5nIGRlcXVldWUgZm9yIFRYIHJpbmcuCisJCQkvLyAxLiBIZXJlLCByaWdodCBhZnRlciBxdWV1ZWluZyB0aGUgZnJhbWUuCisJCQkvLyAyLiBBdCB0aGUgZW5kIG9mIFR4UmluZ1R4RG9uZSBzZXJ2aWNlIHJvdXRpbmUuCisJCQkvLyAzLiBVcG9uIE5ESVMgY2FsbCBSVE1QU2VuZFBhY2tldHMKKwkJCWlmKCghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKSkgJiYKKwkJCQkoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUykpKQorCQkJeworCQkJCWZvcihJbmRleCA9IDA7IEluZGV4IDwgNTsgSW5kZXggKyspCisJCQkJCWlmKHBBZC0+VHhTd1F1ZXVlW0luZGV4XS5OdW1iZXIgPiAwKQorCQkJCQkJUlRNUERlUXVldWVQYWNrZXQocEFkLCBGQUxTRSwgSW5kZXgsIE1BWF9UWF9QUk9DRVNTKTsKKwkJCX0KKwkJfQorCX0gd2hpbGUoRkFMU0UpOworCit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICBSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgIENoZWNrIFNhbml0eSBSU04gSUUgZm9ybSBBUAorCisgICAgQXJndW1lbnRzOgorCisgICAgUmV0dXJuIFZhbHVlOgorCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitCT09MRUFOIENoZWNrUlNOSUUoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFBVQ0hBUiAgICAgICAgICBwRGF0YSwKKwlJTiAgVUNIQVIgICAgICAgICAgIERhdGFMZW4sCisJT1VUCVVDSEFSCQkJKk9mZnNldCkKK3sKKwlQVUNIQVIgICAgICAgICAgICAgIHBWSUU7CisJVUNIQVIgICAgICAgICAgICAgICBsZW47CisJUEVJRF9TVFJVQ1QgICAgICAgICBwRWlkOworCUJPT0xFQU4JCQkJcmVzdWx0ID0gRkFMU0U7CisKKwlwVklFID0gcERhdGE7CisJbGVuCSA9IERhdGFMZW47CisJKk9mZnNldCA9IDA7CisKKwl3aGlsZSAobGVuID4gc2l6ZW9mKFJTTklFMikpCisJeworCQlwRWlkID0gKFBFSURfU1RSVUNUKSBwVklFOworCQkvLyBXUEEgUlNOIElFCisJCWlmICgocEVpZC0+RWlkID09IElFX1dQQSkgJiYgKE5kaXNFcXVhbE1lbW9yeShwRWlkLT5PY3RldCwgV1BBX09VSSwgNCkpKQorCQl7CisJCQlpZiAoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSB8fCBwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spICYmCisJCQkJKE5kaXNFcXVhbE1lbW9yeShwVklFLCBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlJTTl9JRSwgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5SU05JRV9MZW4pKSAmJgorCQkJCShwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlJTTklFX0xlbiA9PSAocEVpZC0+TGVuICsgMikpKQorCQkJeworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDaGVja1JTTklFID09PiBXUEEvV1BBUFNLIFJTTiBJRSBtYXRjaGVkIGluIE1zZyAzLCBMZW5ndGgoJWQpIFxuIiwgKHBFaWQtPkxlbiArIDIpKSk7CisJCQkJCXJlc3VsdCA9IFRSVUU7CisJCQl9CisKKwkJCSpPZmZzZXQgKz0gKHBFaWQtPkxlbiArIDIpOworCQl9CisJCS8vIFdQQTIgUlNOIElFCisJCWVsc2UgaWYgKChwRWlkLT5FaWQgPT0gSUVfUlNOKSAmJiAoTmRpc0VxdWFsTWVtb3J5KHBFaWQtPk9jdGV0ICsgMiwgUlNOX09VSSwgMykpKQorCQl7CisJCQlpZiAoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIgfHwgcEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykgJiYKKwkJCQkoTmRpc0VxdWFsTWVtb3J5KHBWSUUsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUlNOX0lFLCBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlJTTklFX0xlbikpICYmCisJCQkJKHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUlNOSUVfTGVuID09IChwRWlkLT5MZW4gKyAyKSkpCisJCQl7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNoZWNrUlNOSUUgPT0+IFdQQTIvV1BBMlBTSyBSU04gSUUgbWF0Y2hlZCBpbiBNc2cgMywgTGVuZ3RoKCVkKSBcbiIsIChwRWlkLT5MZW4gKyAyKSkpOworCQkJCQlyZXN1bHQgPSBUUlVFOworCQkJfQorCisJCQkqT2Zmc2V0ICs9IChwRWlkLT5MZW4gKyAyKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCWJyZWFrOworCQl9CisKKwkJcFZJRSArPSAocEVpZC0+TGVuICsgMik7CisJCWxlbiAgLT0gKHBFaWQtPkxlbiArIDIpOworCX0KKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNoZWNrUlNOSUUgPT0+IHNraXBfb2Zmc2V0KCVkKSBcbiIsICpPZmZzZXQpKTsKKworCXJldHVybiByZXN1bHQ7CisKK30KKworCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICBQYXJzZSBLRVlEQVRBIGZpZWxkLiAgS0VZREFUQVtdIE1heSBjb250YWluIDIgUlNOIElFIGFuZCBvcHRpb25hbGx5IEdUSy4KKyAgICBHVEsgIGlzIGVuY2FwdHVsYXRlZCBpbiBLREUgZm9ybWF0IGF0ICBwLjgzIDgwMi4xMWkgRDEwCisKKyAgICBBcmd1bWVudHM6CisKKyAgICBSZXR1cm4gVmFsdWU6CisKKyAgICBOb3RlOgorICAgICAgICA4MDIuMTFpIEQxMAorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworQk9PTEVBTiBQYXJzZUtleURhdGEoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFBVQ0hBUiAgICAgICAgICBwS2V5RGF0YSwKKwlJTiAgVUNIQVIgICAgICAgICAgIEtleURhdGFMZW4sCisJSU4JVUNIQVIJCQliUGFpcmV3aXNlKQoreworICAgIFBLREVfRU5DQVAgICAgICAgICAgcEtERSA9IE5VTEw7CisgICAgUFVDSEFSICAgICAgICAgICAgICBwTXlLZXlEYXRhID0gcEtleURhdGE7CisgICAgVUNIQVIgICAgICAgICAgICAgICBLZXlEYXRhTGVuZ3RoID0gS2V5RGF0YUxlbjsKKyAgICBVQ0hBUiAgICAgICAgICAgICAgIEdUS0xFTjsKKwlVQ0hBUgkJCQlza2lwX29mZnNldDsKKworCS8vIFZlcmlmeSBUaGUgUlNOIElFIGNvbnRhaW5lZCBpbiBQYWlyZXdpc2UtTXNnIDMgYW5kIHNraXAgaXQKKwlpZiAoYlBhaXJld2lzZSkKKyAgICB7CisJCS8vIENoZWNrIFJTTiBJRSB3aGV0aGVyIGl0IGlzIFdQQTIvV1BBMlBTSworCQlpZiAoIUNoZWNrUlNOSUUocEFkLCBwS2V5RGF0YSwgS2V5RGF0YUxlbiwgJnNraXBfb2Zmc2V0KSkKKwkJeworCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiUGFyc2VLZXlEYXRhID09PiBXUEEyL1dQQTJQU0sgUlNOIElFIG1pc21hdGNoZWQgXG4iKSk7CisJCQloZXhfZHVtcCgiR2V0IEtFWURBVEEgOiIsIHBLZXlEYXRhLCBLZXlEYXRhTGVuKTsKKwkJCXJldHVybiBGQUxTRTsKKyAgICAJfQorICAgIAllbHNlCisJCXsKKwkJCS8vIHNraXAgUlNOIElFCisJCQlwTXlLZXlEYXRhICs9IHNraXBfb2Zmc2V0OworCQkJS2V5RGF0YUxlbmd0aCAtPSBza2lwX29mZnNldDsKKworCQkJLy9EQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQYXJzZUtleURhdGEgPT0+IFdQQTIvV1BBMlBTSyBSU04gSUUgbWF0Y2hlZCBpbiBNc2cgMywgTGVuZ3RoKCVkKSBcbiIsIHNraXBfb2Zmc2V0KSk7CisJCX0KKwl9CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlBhcnNlS2V5RGF0YSA9PT4gS2V5RGF0YUxlbmd0aCAlZCB3aXRob3V0IFJTTl9JRSBcbiIsIEtleURhdGFMZW5ndGgpKTsKKworCS8vIFBhcnNlIEVLRCBmb3JtYXQKKwlpZiAoS2V5RGF0YUxlbmd0aCA+PSA4KQorICAgIHsKKyAgICAgICAgcEtERSA9IChQS0RFX0VOQ0FQKSBwTXlLZXlEYXRhOworICAgIH0KKwllbHNlCisgICAgeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJFUlJPUjogS2V5RGF0YUxlbmd0aCBpcyB0b28gc2hvcnQgXG4iKSk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKworCS8vIFNhbml0eSBjaGVjayAtIHNoYXJlZCBrZXkgaW5kZXggc2hvdWxkIG5vdCBiZSAwCisJaWYgKHBLREUtPkdUS0VuY2FwLktpZCA9PSAwKQorICAgIHsKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiRVJST1I6IEdUSyBLZXkgaW5kZXggemVybyBcbiIpKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworCS8vIFNhbml0eSBjaGVjayAtIEtFRCBsZW5ndGgKKwlpZiAoS2V5RGF0YUxlbmd0aCA8IChwS0RFLT5MZW4gKyAyKSkKKyAgICB7CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkVSUk9SOiBUaGUgbGVuIGZyb20gS0RFIGlzIHRvbyBzaG9ydCBcbiIpKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworCS8vIEdldCBHVEsgbGVuZ3RoIC0gcmVmZXIgdG8gSUVFRSA4MDIuMTFpLTIwMDQgcC44MgorCUdUS0xFTiA9IHBLREUtPkxlbiAtNjsKKworCWlmIChHVEtMRU4gPCBNSU5fTEVOX09GX0dUSykKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkVSUk9SOiBHVEsgS2V5IGxlbmd0aCBpcyB0b28gc2hvcnQgKCVkKSBcbiIsIEdUS0xFTikpOworICAgICAgICByZXR1cm4gRkFMU0U7CisJfQorCWVsc2UKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiR1RLIEtleSB3aXRoIEtERSBmb3JtZXQgZ290IGluZGV4PSVkLCBsZW49JWQgXG4iLCBwS0RFLT5HVEtFbmNhcC5LaWQsIEdUS0xFTikpOworCisJLy8gVXBkYXRlIEdUSworCS8vIHNldCBrZXkgbWF0ZXJpYWwsIFR4TWljIGFuZCBSeE1pYyBmb3IgV1BBUFNLCisJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuR1RLLCBwS0RFLT5HVEtFbmNhcC5HVEssIDMyKTsKKwlwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQgPSBwS0RFLT5HVEtFbmNhcC5LaWQ7CisKKwkvLyBVcGRhdGUgc2hhcmVkIGtleSB0YWJsZQorCU5kaXNaZXJvTWVtb3J5KCZwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLCBzaXplb2YoQ0lQSEVSX0tFWSkpOworCXBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uS2V5TGVuID0gTEVOX1RLSVBfRUs7CisJTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5LZXksIHBLREUtPkdUS0VuY2FwLkdUSywgTEVOX1RLSVBfRUspOworCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uUnhNaWMsICZwS0RFLT5HVEtFbmNhcC5HVEtbMTZdLCBMRU5fVEtJUF9SWE1JQ0spOworCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uVHhNaWMsICZwS0RFLT5HVEtFbmNhcC5HVEtbMjRdLCBMRU5fVEtJUF9UWE1JQ0spOworCisJLy8gVXBkYXRlIFNoYXJlZCBLZXkgQ2lwaGVyQWxnCisJcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5DaXBoZXJBbGcgPSBDSVBIRVJfTk9ORTsKKwlpZiAocEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkKKwkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5DaXBoZXJBbGcgPSBDSVBIRVJfVEtJUDsKKwllbHNlIGlmIChwQWQtPlN0YUNmZy5Hcm91cENpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQorCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLkNpcGhlckFsZyA9IENJUEhFUl9BRVM7CisJZWxzZSBpZiAocEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgPT0gTmRpczgwMl8xMUdyb3VwV0VQNDBFbmFibGVkKQorCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLkNpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKKwllbHNlIGlmIChwQWQtPlN0YUNmZy5Hcm91cENpcGhlciA9PSBOZGlzODAyXzExR3JvdXBXRVAxMDRFbmFibGVkKQorCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLkNpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7CisKKwlyZXR1cm4gVFJVRTsKKworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJQ2lzY28gQ0NLTSBQUkYgZnVuY3Rpb24KKworCUFyZ3VtZW50czoKKwkJa2V5CQkJCUNpc2NvIEJhc2UgVHJhbnNpZW50IEtleSAoQlRLKQorCQlrZXlfbGVuCQkJVGhlIGtleSBsZW5ndGggb2YgdGhlIEJUSworCQlkYXRhCQkJUnVxdWVzdCBOdW1iZXIoUk4pICsgQlNTSUQKKwkJZGF0YV9sZW4JCVRoZSBsZW5ndGggb2YgdGhlIGRhdGEKKwkJb3V0cHV0CQkJU3RvcmUgZm9yIFBUSyhQYWlyd2lzZSB0cmFuc2llbnQga2V5cykKKwkJbGVuCQkJCVRoZSBsZW5ndGggb2YgdGhlIG91dHB1dAorCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJTm90ZToKKwkJODAyLjFpCUFubmV4IEYuOQorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBDQ0tNUFJGKAorCUlOCVVDSEFSCSprZXksCisJSU4JSU5UCQlrZXlfbGVuLAorCUlOCVVDSEFSCSpkYXRhLAorCUlOCUlOVAkJZGF0YV9sZW4sCisJT1VUCVVDSEFSCSpvdXRwdXQsCisJSU4JSU5UCQlsZW4pCit7CisJSU5UCQlpOworCVVDSEFSCWlucHV0WzEwMjRdOworCUlOVAkJY3VycmVudGluZGV4ID0gMDsKKwlJTlQJCXRvdGFsX2xlbjsKKworCU5kaXNNb3ZlTWVtb3J5KGlucHV0LCBkYXRhLCBkYXRhX2xlbik7CisJdG90YWxfbGVuID0gZGF0YV9sZW47CisJaW5wdXRbdG90YWxfbGVuXSA9IDA7CisJdG90YWxfbGVuKys7CisJZm9yCShpID0gMDsJaSA8CShsZW4gKyAxOSkgLyAyMDsgaSsrKQorCXsKKwkJSE1BQ19TSEExKGlucHV0LCB0b3RhbF9sZW4sCWtleSwga2V5X2xlbiwgJm91dHB1dFtjdXJyZW50aW5kZXhdKTsKKwkJY3VycmVudGluZGV4ICs9CTIwOworCQlpbnB1dFt0b3RhbF9sZW4gLSAxXSsrOworCX0KK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVByb2Nlc3MgTUlDIGVycm9yIGluZGljYXRpb24gYW5kIHJlY29yZCBNSUMgZXJyb3IgdGltZXIuCisKKwlBcmd1bWVudHM6CisJCXBBZCAJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCQlwV3BhS2V5IAkJUG9pbnRlciB0byB0aGUgV1BBIGtleSBzdHJ1Y3R1cmUKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlSVE1QUmVwb3J0TWljRXJyb3IoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUENJUEhFUl9LRVkgCXBXcGFLZXkpCit7CisJVUxPTkcJTm93OworICAgIFVDSEFSICAgdW5pY2FzdEtleSA9IChwV3BhS2V5LT5UeXBlID09IFBBSVJXSVNFX0tFWSA/IDE6MCk7CisKKwkvLyBSZWNvcmQgTGFzdCBNSUMgZXJyb3IgdGltZSBhbmQgY291bnQKKwlOb3cgPSBqaWZmaWVzOworCWlmIChwQWQtPlN0YUNmZy5NaWNFcnJDbnQgPT0gMCkKKwl7CisJCXBBZC0+U3RhQ2ZnLk1pY0VyckNudCsrOworCQlwQWQtPlN0YUNmZy5MYXN0TWljRXJyb3JUaW1lID0gTm93OworICAgICAgICBOZGlzWmVyb01lbW9yeShwQWQtPlN0YUNmZy5SZXBsYXlDb3VudGVyLCA4KTsKKwl9CisJZWxzZSBpZiAocEFkLT5TdGFDZmcuTWljRXJyQ250ID09IDEpCisJeworCQlpZiAoKHBBZC0+U3RhQ2ZnLkxhc3RNaWNFcnJvclRpbWUgKyAoNjAgKiBPU19IWikpIDwgTm93KQorCQl7CisJCQkvLyBVcGRhdGUgTGFzdCBNSUMgZXJyb3IgdGltZSwgdGhpcyBkaWQgbm90IHZpb2xhdGUgdHdvIE1JQyBlcnJvcnMgd2l0aGluIDYwIHNlY29uZHMKKwkJCXBBZC0+U3RhQ2ZnLkxhc3RNaWNFcnJvclRpbWUgPSBOb3c7CisJCX0KKwkJZWxzZQorCQl7CisKKwkJCWlmIChwQWQtPkNvbW1vbkNmZy5iV2lyZWxlc3NFdmVudCkKKwkJCQlSVE1QU2VuZFdpcmVsZXNzRXZlbnQocEFkLCBJV19DT1VOVEVSX01FQVNVUkVTX0VWRU5UX0ZMQUcsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQWRkciwgQlNTMCwgMCk7CisKKwkJCXBBZC0+U3RhQ2ZnLkxhc3RNaWNFcnJvclRpbWUgPSBOb3c7CisJCQkvLyBWaW9sYXRlIE1JQyBlcnJvciBjb3VudHMsIE1JQyBjb3VudGVybWVhc3VyZXMga2lja3MgaW4KKwkJCXBBZC0+U3RhQ2ZnLk1pY0VyckNudCsrOworCQkJLy8gV2Ugc2hhbGwgYmxvY2sgYWxsIHJlY2VwdGlvbgorCQkJLy8gV2Ugc2hhbGwgY2xlYW4gYWxsIFR4IHJpbmcgYW5kIGRpc2Fzc29pY2F0ZSBmcm9tIEFQIGFmdGVyIG5leHQgRUFQT0wgZnJhbWUKKwkJCS8vCisJCQkvLyBObyBuZWNlc3NhcnkgdG8gY2xlYW4gYWxsIFR4IHJpbmcsIG9uIFJUTVBIYXJkVHJhbnNtaXQgd2lsbCBzdG9wIHNlbmRpbmcgbm9uLTgwMi4xWCBFQVBPTCBwYWNrZXRzCisJCQkvLyBpZiBwQWQtPlN0YUNmZy5NaWNFcnJDbnQgZ3JlYXRlciB0aGFuIDIuCisJCQkvLworCQkJLy8gUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX0FDX0JLKTsKKwkJCS8vIFJUTVBSaW5nQ2xlYW5VcChwQWQsIFFJRF9BQ19CRSk7CisJCQkvLyBSVE1QUmluZ0NsZWFuVXAocEFkLCBRSURfQUNfVkkpOworCQkJLy8gUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX0FDX1ZPKTsKKwkJCS8vIFJUTVBSaW5nQ2xlYW5VcChwQWQsIFFJRF9IQ0NBKTsKKwkJfQorCX0KKwllbHNlCisJeworCQkvLyBNSUMgZXJyb3IgY291bnQgPj0gMgorCQkvLyBUaGlzIHNob3VsZCBub3QgaGFwcGVuCisJCTsKKwl9CisgICAgTWxtZUVucXVldWUocEFkLAorCQkJCU1MTUVfQ05UTF9TVEFURV9NQUNISU5FLAorCQkJCU9JRF84MDJfMTFfTUlDX0ZBSUxVUkVfUkVQT1JUX0ZSQU1FLAorCQkJCTEsCisJCQkJJnVuaWNhc3RLZXkpOworCisgICAgaWYgKHBBZC0+U3RhQ2ZnLk1pY0VyckNudCA9PSAyKQorICAgIHsKKyAgICAgICAgUlRNUFNldFRpbWVyKCZwQWQtPlN0YUNmZy5XcGFEaXNhc3NvY0FuZEJsb2NrQXNzb2NUaW1lciwgMTAwKTsKKyAgICB9Cit9CisKKworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyNkZWZpbmUJTEVOR1RIX0VBUF9IICAgIDQKKy8vIElmIHRoZSByZWNlaXZlZCBmcmFtZSBpcyBFQVAtUGFja2V0ICxmaW5kIG91dCBpdHMgRUFQLUNvZGUgKFJlcXVlc3QoMHgwMSksIFJlc3BvbnNlKDB4MDIpLCBTdWNjZXNzKDB4MDMpLCBGYWlsdXJlKDB4MDQpKS4KK0lOVAkgICAgV3BhQ2hlY2tFYXBDb2RlKAorCUlOICBQUlRNUF9BREFQVEVSICAgCQlwQWQsCisJSU4gIFBVQ0hBUgkJCQlwRnJhbWUsCisJSU4gIFVTSE9SVAkJCQlGcmFtZUxlbiwKKwlJTiAgVVNIT1JUCQkJCU9mZlNldCkKK3sKKworCVBVQ0hBUglwRGF0YTsKKwlJTlQJcmVzdWx0ID0gMDsKKworCWlmKCBGcmFtZUxlbiA8IE9mZlNldCArIExFTkdUSF9FQVBPTF9IICsgTEVOR1RIX0VBUF9IICkKKwkJcmV0dXJuIHJlc3VsdDsKKworCXBEYXRhID0gcEZyYW1lICsgT2ZmU2V0OyAvLyBza2lwIG9mZnNldCBieXRlcworCisJaWYoKihwRGF0YSsxKSA9PSBFQVBQYWNrZXQpIAkvLyA4MDIuMXggaGVhZGVyIC0gUGFja2V0IFR5cGUKKwl7CisJCSByZXN1bHQgPSAqKHBEYXRhKzQpOwkJLy8gRUFQIGhlYWRlciAtIENvZGUKKwl9CisKKwlyZXR1cm4gcmVzdWx0OworfQorCitWT0lEICAgIFdwYVNlbmRNaWNGYWlsdXJlVG9XcGFTdXBwbGljYW50KAorICAgIElOICBQUlRNUF9BREFQVEVSICAgIHBBZCwKKyAgICBJTiAgQk9PTEVBTiAgICAgICAgICBiVW5pY2FzdCkKK3sKKyAgICB1bmlvbiBpd3JlcV9kYXRhICAgIHdycXU7CisgICAgY2hhciBjdXN0b21bSVdfQ1VTVE9NX01BWF0gPSB7MH07CisKKyAgICBzcHJpbnRmKGN1c3RvbSwgIk1MTUUtTUlDSEFFTE1JQ0ZBSUxVUkUuaW5kaWNhdGlvbiIpOworICAgIGlmIChiVW5pY2FzdCkKKyAgICAgICAgc3ByaW50ZihjdXN0b20sICIlcyB1bmljYXN0IiwgY3VzdG9tKTsKKyAgICB3cnF1LmRhdGEubGVuZ3RoID0gc3RybGVuKGN1c3RvbSk7CisgICAgd2lyZWxlc3Nfc2VuZF9ldmVudChwQWQtPm5ldF9kZXYsIElXRVZDVVNUT00sICZ3cnF1LCBjdXN0b20pOworCisgICAgcmV0dXJuOworfQorI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKworVk9JRAlXcGFNaWNGYWlsdXJlUmVwb3J0RnJhbWUoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCVBVQ0hBUiAgICAgICAgICAgICAgcE91dEJ1ZmZlciA9IE5VTEw7CisJVUNIQVIgICAgICAgICAgICAgICBIZWFkZXI4MDJfM1sxNF07CisJVUxPTkcgICAgICAgICAgICAgICBGcmFtZUxlbiA9IDA7CisJRUFQT0xfUEFDS0VUICAgICAgICBQYWNrZXQ7CisJVUNIQVIgICAgICAgICAgICAgICBNaWNbMTZdOworICAgIEJPT0xFQU4gICAgICAgICAgICAgYlVuaWNhc3Q7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJXcGFNaWNGYWlsdXJlUmVwb3J0RnJhbWUgLS0tLS0+XG4iKSk7CisKKyAgICBiVW5pY2FzdCA9IChFbGVtLT5Nc2dbMF0gPT0gMSA/IFRSVUU6RkFMU0UpOworCXBBZC0+U2VxdWVuY2UgPSAoKHBBZC0+U2VxdWVuY2UpICsgMSkgJiAoTUFYX1NFUV9OVU1CRVIpOworCisJLy8gaW5pdCA4MDIuMyBoZWFkZXIgYW5kIEZpbGwgUGFja2V0CisJTUFLRV84MDJfM19IRUFERVIoSGVhZGVyODAyXzMsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBFQVBPTCk7CisKKwlOZGlzWmVyb01lbW9yeSgmUGFja2V0LCBzaXplb2YoUGFja2V0KSk7CisJUGFja2V0LlByb1Zlcgk9IEVBUE9MX1ZFUjsKKwlQYWNrZXQuUHJvVHlwZQk9IEVBUE9MS2V5OworCisJUGFja2V0LktleURlc2MuVHlwZSA9IFdQQTFfS0VZX0RFU0M7CisKKyAgICAvLyBSZXF1ZXN0IGZpZWxkIHByZXNlbnRlZAorICAgIFBhY2tldC5LZXlEZXNjLktleUluZm8uUmVxdWVzdCA9IDE7CisKKwlpZihwQWQtPlN0YUNmZy5XZXBTdGF0dXMgID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCisJeworCQlQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLktleURlc2NWZXIgPSAyOworCX0KKwllbHNlCSAgLy8gVEtJUAorCXsKKwkJUGFja2V0LktleURlc2MuS2V5SW5mby5LZXlEZXNjVmVyID0gMTsKKwl9CisKKyAgICBQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLktleVR5cGUgPSAoYlVuaWNhc3QgPyBQQUlSV0lTRUtFWSA6IEdST1VQS0VZKTsKKworCS8vIEtleU1pYyBmaWVsZCBwcmVzZW50ZWQKKwlQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLktleU1pYyAgPSAxOworCisgICAgLy8gRXJyb3IgZmllbGQgcHJlc2VudGVkCisJUGFja2V0LktleURlc2MuS2V5SW5mby5FcnJvciAgPSAxOworCisJLy8gVXBkYXRlIHBhY2tldCBsZW5ndGggYWZ0ZXIgZGVjaWRlIEtleSBkYXRhIHBheWxvYWQKKwlQYWNrZXQuQm9keV9MZW5bMV0gID0gc2l6ZW9mKEtFWV9ERVNDUklQVEVSKSAtIE1BWF9MRU5fT0ZfUlNOSUU7CisKKwkvLyBLZXkgUmVwbGF5IENvdW50CisJTmRpc01vdmVNZW1vcnkoUGFja2V0LktleURlc2MuUmVwbGF5Q291bnRlciwgcEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlciwgTEVOX0tFWV9ERVNDX1JFUExBWSk7CisgICAgaW5jX2J5dGVfYXJyYXkocEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlciwgOCk7CisKKwkvLyBDb252ZXJ0IHRvIGxpdHRsZS1lbmRpYW4gZm9ybWF0LgorCSooKFVTSE9SVCAqKSZQYWNrZXQuS2V5RGVzYy5LZXlJbmZvKSA9IGNwdTJsZTE2KCooKFVTSE9SVCAqKSZQYWNrZXQuS2V5RGVzYy5LZXlJbmZvKSk7CisKKworCU1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsIChQVUNIQVIgKikmcE91dEJ1ZmZlcik7ICAvLyBhbGxvY2F0ZSBtZW1vcnkKKwlpZihwT3V0QnVmZmVyID09IE5VTEwpCisJeworCQlyZXR1cm47CisJfQorCisJLy8gUHJlcGFyZSBFQVBPTCBmcmFtZSBmb3IgTUlDIGNhbGN1bGF0aW9uCisJLy8gQmUgY2FyZWZ1bCwgb25seSBFQVBPTCBmcmFtZSBpcyBjb3VudGVkIGZvciBNSUMgY2FsY3VsYXRpb24KKwlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAgICAgICAgICAgICAgICZGcmFtZUxlbiwKKwkJICAgICAgICAgICAgICBQYWNrZXQuQm9keV9MZW5bMV0gKyA0LCAgICZQYWNrZXQsCisJCSAgICAgICAgICAgICAgRU5EX09GX0FSR1MpOworCisJLy8gUHJlcGFyZSBhbmQgRmlsbCBNSUMgdmFsdWUKKwlOZGlzWmVyb01lbW9yeShNaWMsIHNpemVvZihNaWMpKTsKKwlpZihwQWQtPlN0YUNmZy5XZXBTdGF0dXMgID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCisJewkvLyBBRVMKKyAgICAgICAgVUNIQVIgZGlnZXN0WzIwXSA9IHswfTsKKwkJSE1BQ19TSEExKHBPdXRCdWZmZXIsIEZyYW1lTGVuLCBwQWQtPlN0YUNmZy5QVEssIExFTl9FQVBfTUlDSywgZGlnZXN0KTsKKwkJTmRpc01vdmVNZW1vcnkoTWljLCBkaWdlc3QsIExFTl9LRVlfREVTQ19NSUMpOworCX0KKwllbHNlCisJewkvLyBUS0lQCisJCWhtYWNfbWQ1KHBBZC0+U3RhQ2ZnLlBUSywgIExFTl9FQVBfTUlDSywgcE91dEJ1ZmZlciwgRnJhbWVMZW4sIE1pYyk7CisJfQorCU5kaXNNb3ZlTWVtb3J5KFBhY2tldC5LZXlEZXNjLktleU1pYywgTWljLCBMRU5fS0VZX0RFU0NfTUlDKTsKKworICAgIE1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAgICAJJkZyYW1lTGVuLAorICAgIAkgIAkJCUxFTkdUSF84MDJfMywgICAgIAkJCSZIZWFkZXI4MDJfMywKKyAgICAJCQkJUGFja2V0LkJvZHlfTGVuWzFdICsgNCwgICAgICZQYWNrZXQsCisgICAgCQkJCUVORF9PRl9BUkdTKTsKKworCS8vIG9weSBmcmFtZSB0byBUeCByaW5nIGFuZCBzZW5kIE1JQyBmYWlsdXJlIHJlcG9ydCBmcmFtZSB0byBhdXRoZW50aWNhdG9yCisJUlRNUFRvV2lyZWxlc3NTdGEocEFkLCBIZWFkZXI4MDJfMywgTEVOR1RIXzgwMl8zLCAoUFVDSEFSKSZQYWNrZXQsIFBhY2tldC5Cb2R5X0xlblsxXSArIDQsIEZBTFNFKTsKKworCU1sbWVGcmVlTWVtb3J5KHBBZCwgKFBVQ0hBUilwT3V0QnVmZmVyKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIldwYU1pY0ZhaWx1cmVSZXBvcnRGcmFtZSA8LS0tLS1cbiIpKTsKK30KKworLyoqIGZyb20gd3BhX3N1cHBsaWNhbnQKKyAqIGluY19ieXRlX2FycmF5IC0gSW5jcmVtZW50IGFyYml0cmFyeSBsZW5ndGggYnl0ZSBhcnJheSBieSBvbmUKKyAqIEBjb3VudGVyOiBQb2ludGVyIHRvIGJ5dGUgYXJyYXkKKyAqIEBsZW46IExlbmd0aCBvZiB0aGUgY291bnRlciBpbiBieXRlcworICoKKyAqIFRoaXMgZnVuY3Rpb24gaW5jcmVtZW50cyB0aGUgbGFzdCBieXRlIG9mIHRoZSBjb3VudGVyIGJ5IG9uZSBhbmQgY29udGludWVzCisgKiByb2xsaW5nIG92ZXIgdG8gbW9yZSBzaWduaWZpY2FudCBieXRlcyBpZiB0aGUgYnl0ZSB3YXMgaW5jcmVtZW50ZWQgZnJvbQorICogMHhmZiB0byAweDAwLgorICovCit2b2lkIGluY19ieXRlX2FycmF5KFVDSEFSICpjb3VudGVyLCBpbnQgbGVuKQoreworCWludCBwb3MgPSBsZW4gLSAxOworCXdoaWxlIChwb3MgPj0gMCkgeworCQljb3VudGVyW3Bvc10rKzsKKwkJaWYgKGNvdW50ZXJbcG9zXSAhPSAwKQorCQkJYnJlYWs7CisJCXBvcy0tOworCX0KK30KKworVk9JRCBXcGFEaXNhc3NvY0FwQW5kQmxvY2tBc3NvYygKKyAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCisgICAgSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAorICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKKyAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpCit7CisgICAgUlRNUF9BREFQVEVSICAgICAgICAgICAgICAgICpwQWQgPSAoUFJUTVBfQURBUFRFUilGdW5jdGlvbkNvbnRleHQ7CisgICAgTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNUICAgIERpc2Fzc29jUmVxOworCisJLy8gZGlzYXNzb2MgZnJvbSBjdXJyZW50IEFQIGZpcnN0CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlRNUFJlcG9ydE1pY0Vycm9yIC0gZGlzYXNzb2NpYXRlIHdpdGggY3VycmVudCBBUCBhZnRlciBzZW5kaW5nIHNlY29uZCBjb250aW51b3VzIEVBUE9MIGZyYW1lXG4iKSk7CisJRGlzYXNzb2NQYXJtRmlsbChwQWQsICZEaXNhc3NvY1JlcSwgcEFkLT5Db21tb25DZmcuQnNzaWQsIFJFQVNPTl9NSUNfRkFJTFVSRSk7CisJTWxtZUVucXVldWUocEFkLCBBU1NPQ19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9ESVNBU1NPQ19SRVEsIHNpemVvZihNTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1QpLCAmRGlzYXNzb2NSZXEpOworCisJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9ESVNBU1NPQzsKKwlwQWQtPlN0YUNmZy5iQmxvY2tBc3NvYyA9IFRSVUU7Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvc3RhX2lvY3RsLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3N0YV9pb2N0bC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxZjBmYWIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3N0YV9pb2N0bC5jCkBAIC0wLDAgKzEsNzA2OCBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICBNb2R1bGUgTmFtZToKKyAgICBzdGFfaW9jdGwuYworCisgICAgQWJzdHJhY3Q6CisgICAgSU9DVEwgcmVsYXRlZCBzdWJyb3V0aW5lcworCisgICAgUmV2aXNpb24gSGlzdG9yeToKKyAgICBXaG8gICAgICAgICBXaGVuICAgICAgICAgIFdoYXQKKyAgICAtLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBSb3J5IENoZW4gICAwMS0wMy0yMDAzICAgIGNyZWF0ZWQKKwlSb3J5IENoZW4gICAwMi0xNC0yMDA1ICAgIG1vZGlmeSB0byBzdXBwb3J0IFJUNjEKKyovCisKKyNpbmNsdWRlCSJydF9jb25maWcuaCIKKworI2lmZGVmIERCRworZXh0ZXJuIFVMT05HICAgIFJURGVidWdMZXZlbDsKKyNlbmRpZgorCisjZGVmaW5lIE5SX1dFUF9LRVlTIAkJCQk0CisjZGVmaW5lIFdFUF9TTUFMTF9LRVlfTEVOIAkJCSg0MC84KQorI2RlZmluZSBXRVBfTEFSR0VfS0VZX0xFTiAJCQkoMTA0LzgpCisKKyNkZWZpbmUgR1JPVVBfS0VZX05PICAgICAgICAgICAgICAgIDQKKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMjcpCisjZGVmaW5lIElXRV9TVFJFQU1fQUREX0VWRU5UKF9BLCBfQiwgX0MsIF9ELCBfRSkJCWl3ZV9zdHJlYW1fYWRkX2V2ZW50KF9BLCBfQiwgX0MsIF9ELCBfRSkKKyNkZWZpbmUgSVdFX1NUUkVBTV9BRERfUE9JTlQoX0EsIF9CLCBfQywgX0QsIF9FKQkJaXdlX3N0cmVhbV9hZGRfcG9pbnQoX0EsIF9CLCBfQywgX0QsIF9FKQorI2RlZmluZSBJV0VfU1RSRUFNX0FERF9WQUxVRShfQSwgX0IsIF9DLCBfRCwgX0UsIF9GKQlpd2Vfc3RyZWFtX2FkZF92YWx1ZShfQSwgX0IsIF9DLCBfRCwgX0UsIF9GKQorI2Vsc2UKKyNkZWZpbmUgSVdFX1NUUkVBTV9BRERfRVZFTlQoX0EsIF9CLCBfQywgX0QsIF9FKQkJaXdlX3N0cmVhbV9hZGRfZXZlbnQoX0IsIF9DLCBfRCwgX0UpCisjZGVmaW5lIElXRV9TVFJFQU1fQUREX1BPSU5UKF9BLCBfQiwgX0MsIF9ELCBfRSkJCWl3ZV9zdHJlYW1fYWRkX3BvaW50KF9CLCBfQywgX0QsIF9FKQorI2RlZmluZSBJV0VfU1RSRUFNX0FERF9WQUxVRShfQSwgX0IsIF9DLCBfRCwgX0UsIF9GKQlpd2Vfc3RyZWFtX2FkZF92YWx1ZShfQiwgX0MsIF9ELCBfRSwgX0YpCisjZW5kaWYKKworZXh0ZXJuIFVDSEFSICAgIENpcGhlcldwYTJUZW1wbGF0ZVtdOworZXh0ZXJuIFVDSEFSICAgIENpcGhlcldwYVBza1RraXBbXTsKK2V4dGVybiBVQ0hBUiAgICBDaXBoZXJXcGFQc2tUa2lwTGVuOworCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX1JUX1ZFUlNJT05fSU5GT3sKKyAgICBVQ0hBUiAgICAgICBEcml2ZXJWZXJzaW9uVzsKKyAgICBVQ0hBUiAgICAgICBEcml2ZXJWZXJzaW9uWDsKKyAgICBVQ0hBUiAgICAgICBEcml2ZXJWZXJzaW9uWTsKKyAgICBVQ0hBUiAgICAgICBEcml2ZXJWZXJzaW9uWjsKKyAgICBVSU5UICAgICAgICBEcml2ZXJCdWlsZFllYXI7CisgICAgVUlOVCAgICAgICAgRHJpdmVyQnVpbGRNb250aDsKKyAgICBVSU5UICAgICAgICBEcml2ZXJCdWlsZERheTsKK30gUlRfVkVSU0lPTl9JTkZPLCAqUFJUX1ZFUlNJT05fSU5GTzsKKworc3RydWN0IGl3X3ByaXZfYXJncyBwcml2dGFiW10gPSB7Cit7IFJUUFJJVl9JT0NUTF9TRVQsCisgIElXX1BSSVZfVFlQRV9DSEFSIHwgMTAyNCwgMCwKKyAgInNldCJ9LAorCit7IFJUUFJJVl9JT0NUTF9TSE9XLCAwLCBJV19QUklWX1RZUEVfQ0hBUiB8IElXX1BSSVZfU0laRV9NQVNLLAorICAiIn0sCit7IFJUUFJJVl9JT0NUTF9TSE9XLCBJV19QUklWX1RZUEVfQ0hBUiB8IDEwMjQsIElXX1BSSVZfVFlQRV9DSEFSIHwgSVdfUFJJVl9TSVpFX01BU0ssCisgICIifSwKKy8qIC0tLSBzdWItaW9jdGxzIGRlZmluaXRpb25zIC0tLSAqLworICAgIHsgU0hPV19DT05OX1NUQVRVUywKKwkgIDAsIElXX1BSSVZfVFlQRV9DSEFSIHwgSVdfUFJJVl9TSVpFX01BU0ssICJjb25uU3RhdHVzIiB9LAorCXsgU0hPV19EUlZJRVJfVkVSSU9OLAorCSAgMCwgSVdfUFJJVl9UWVBFX0NIQVIgfCBJV19QUklWX1NJWkVfTUFTSywgImRyaXZlclZlciIgfSwKKyAgICB7IFNIT1dfQkFfSU5GTywKKwkgIDAsIElXX1BSSVZfVFlQRV9DSEFSIHwgSVdfUFJJVl9TSVpFX01BU0ssICJiYWluZm8iIH0sCisJeyBTSE9XX0RFU0NfSU5GTywKKwkgIDAsIElXX1BSSVZfVFlQRV9DSEFSIHwgSVdfUFJJVl9TSVpFX01BU0ssICJkZXNjaW5mbyIgfSwKKyAgICB7IFJBSU9fT0ZGLAorCSAgMCwgSVdfUFJJVl9UWVBFX0NIQVIgfCBJV19QUklWX1NJWkVfTUFTSywgInJhZGlvX29mZiIgfSwKKwl7IFJBSU9fT04sCisJICAwLCBJV19QUklWX1RZUEVfQ0hBUiB8IElXX1BSSVZfU0laRV9NQVNLLCAicmFkaW9fb24iIH0sCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJeyBTSE9XX0RMU19FTlRSWV9JTkZPLAorCSAgMCwgSVdfUFJJVl9UWVBFX0NIQVIgfCBJV19QUklWX1NJWkVfTUFTSywgImRsc2VudHJ5aW5mbyIgfSwKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKwl7IFNIT1dfQ0ZHX1ZBTFVFLAorCSAgSVdfUFJJVl9UWVBFX0NIQVIgfCAxMDI0LCBJV19QUklWX1RZUEVfQ0hBUiB8IElXX1BSSVZfU0laRV9NQVNLLCAic2hvdyIgfSwKKwl7IFNIT1dfQURIT0NfRU5UUllfSU5GTywKKwkgIDAsIElXX1BSSVZfVFlQRV9DSEFSIHwgSVdfUFJJVl9TSVpFX01BU0ssICJhZGhvY0VudHJ5IiB9LAorCisvKiAtLS0gc3ViLWlvY3RscyByZWxhdGlvbnMgLS0tICovCisKKyNpZmRlZiBEQkcKK3sgUlRQUklWX0lPQ1RMX0JCUCwKKyAgSVdfUFJJVl9UWVBFX0NIQVIgfCBJV19QUklWX1NJWkVfTUFTSywgSVdfUFJJVl9UWVBFX0NIQVIgfCBJV19QUklWX1NJWkVfTUFTSywKKyAgImJicCJ9LAoreyBSVFBSSVZfSU9DVExfTUFDLAorICBJV19QUklWX1RZUEVfQ0hBUiB8IDEwMjQsIElXX1BSSVZfVFlQRV9DSEFSIHwgMTAyNCwKKyAgIm1hYyJ9LAoreyBSVFBSSVZfSU9DVExfRTJQLAorICBJV19QUklWX1RZUEVfQ0hBUiB8IDEwMjQsIElXX1BSSVZfVFlQRV9DSEFSIHwgMTAyNCwKKyAgImUycCJ9LAorI2VuZGlmICAvKiBEQkcgKi8KKworeyBSVFBSSVZfSU9DVExfU1RBVElTVElDUywKKyAgMCwgSVdfUFJJVl9UWVBFX0NIQVIgfCBJV19QUklWX1NJWkVfTUFTSywKKyAgInN0YXQifSwKK3sgUlRQUklWX0lPQ1RMX0dTSVRFU1VSVkVZLAorICAwLCBJV19QUklWX1RZUEVfQ0hBUiB8IDEwMjQsCisgICJnZXRfc2l0ZV9zdXJ2ZXkifSwKK307CisKK0lOVCBTZXRfU1NJRF9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpOworCisjaWZkZWYgV01NX1NVUFBPUlQKK0lOVAlTZXRfV21tQ2FwYWJsZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisjZW5kaWYKKworSU5UIFNldF9OZXR3b3JrVHlwZV9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpOworCitJTlQgU2V0X0F1dGhNb2RlX1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZyk7CisKK0lOVCBTZXRfRW5jcnlwVHlwZV9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpOworCitJTlQgU2V0X0RlZmF1bHRLZXlJRF9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpOworCitJTlQgU2V0X0tleTFfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKTsKKworSU5UIFNldF9LZXkyX1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZyk7CisKK0lOVCBTZXRfS2V5M19Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpOworCitJTlQgU2V0X0tleTRfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKTsKKworSU5UIFNldF9XUEFQU0tfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKTsKKworCitJTlQgU2V0X1BTTW9kZV9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpOworCisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorSU5UIFNldF9XcGFfU3VwcG9ydCgKKyAgICBJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKworI2lmZGVmIERCRworVk9JRCBSVE1QSW9jdGxCQlAoCisJSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKKwlJTglzdHJ1Y3QgaXdyZXEJKndycSk7CisKK1ZPSUQgUlRNUElvY3RsTUFDKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCisJSU4Jc3RydWN0IGl3cmVxCSp3cnEpOworCitWT0lEIFJUTVBJb2N0bEUyUFJPTSgKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBzdHJ1Y3QgaXdyZXEgICAgKndycSk7CisjZW5kaWYgLy8gREJHIC8vCisKKworTkRJU19TVEFUVVMgUlRNUFdQQU5vbmVBZGRLZXlQcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorICAgIElOCVBWT0lECQkJcEJ1Zik7CisKK0lOVCBTZXRfRnJhZ1Rlc3RfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKTsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorSU5UIFNldF9UR25XaWZpVGVzdF9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworSU5UIFNldF9Mb25nUmV0cnlMaW1pdF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UIFNldF9TaG9ydFJldHJ5TGltaXRfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKKyNpZmRlZiBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUCitJTlQgU2V0X0llZWU4MDIxMWRDbGllbnRNb2RlX1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZyk7CisjZW5kaWYgLy8gRVhUX0JVSUxEX0NIQU5ORUxfTElTVCAvLworCisjaWZkZWYgQ0FSUklFUl9ERVRFQ1RJT05fU1VQUE9SVAorSU5UIFNldF9DYXJyaWVyRGV0ZWN0X1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpOworI2VuZGlmIC8vIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQgLy8KKworSU5UCVNob3dfQWRob2NfTWFjVGFibGVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQQ0hBUgkJCWV4dHJhKTsKKworc3RhdGljIHN0cnVjdCB7CisJQ0hBUiAqbmFtZTsKKwlJTlQgKCpzZXRfcHJvYykoUFJUTVBfQURBUFRFUiBwQWRhcHRlciwgUFVDSEFSIGFyZyk7Cit9ICpQUlRNUF9QUklWQVRFX1NFVF9QUk9DLCBSVE1QX1BSSVZBVEVfU1VQUE9SVF9QUk9DW10gPSB7CisJeyJEcml2ZXJWZXJzaW9uIiwJCQkJU2V0X0RyaXZlclZlcnNpb25fUHJvY30sCisJeyJDb3VudHJ5UmVnaW9uIiwJCQkJU2V0X0NvdW50cnlSZWdpb25fUHJvY30sCisJeyJDb3VudHJ5UmVnaW9uQUJhbmQiLAkJCVNldF9Db3VudHJ5UmVnaW9uQUJhbmRfUHJvY30sCisJeyJTU0lEIiwJCQkJCQlTZXRfU1NJRF9Qcm9jfSwKKwl7IldpcmVsZXNzTW9kZSIsCQkJCVNldF9XaXJlbGVzc01vZGVfUHJvY30sCisJeyJUeEJ1cnN0IiwJCQkJCVNldF9UeEJ1cnN0X1Byb2N9LAorCXsiVHhQcmVhbWJsZSIsCQkJCVNldF9UeFByZWFtYmxlX1Byb2N9LAorCXsiVHhQb3dlciIsCQkJCQlTZXRfVHhQb3dlcl9Qcm9jfSwKKwl7IkNoYW5uZWwiLAkJCQkJU2V0X0NoYW5uZWxfUHJvY30sCisJeyJCR1Byb3RlY3Rpb24iLAkJCQlTZXRfQkdQcm90ZWN0aW9uX1Byb2N9LAorCXsiUlRTVGhyZXNob2xkIiwJCQkJU2V0X1JUU1RocmVzaG9sZF9Qcm9jfSwKKwl7IkZyYWdUaHJlc2hvbGQiLAkJCQlTZXRfRnJhZ1RocmVzaG9sZF9Qcm9jfSwKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwl7Ikh0QnciLAkJICAgICAgICAgICAgICAgIFNldF9IdEJ3X1Byb2N9LAorCXsiSHRNY3MiLAkJICAgICAgICAgICAgICAgIFNldF9IdE1jc19Qcm9jfSwKKwl7Ikh0R2kiLAkJICAgICAgICAgICAgICAgIFNldF9IdEdpX1Byb2N9LAorCXsiSHRPcE1vZGUiLAkJICAgICAgICAgICAgU2V0X0h0T3BNb2RlX1Byb2N9LAorCXsiSHRFeHRjaGEiLAkJICAgICAgICAgICAgU2V0X0h0RXh0Y2hhX1Byb2N9LAorCXsiSHRNcGR1RGVuc2l0eSIsCQkgICAgICAgIFNldF9IdE1wZHVEZW5zaXR5X1Byb2N9LAorCXsiSHRCYVdpblNpemUiLAkJICAgICAgICAJU2V0X0h0QmFXaW5TaXplX1Byb2N9LAorCXsiSHRSZGciLAkJICAgICAgICAJCVNldF9IdFJkZ19Qcm9jfSwKKwl7Ikh0QW1zZHUiLAkJICAgICAgICAJCVNldF9IdEFtc2R1X1Byb2N9LAorCXsiSHRBdXRvQmEiLAkJICAgICAgICAJU2V0X0h0QXV0b0JhX1Byb2N9LAorCXsiSHRCYURlY2xpbmUiLAkJCQkJU2V0X0JBRGVjbGluZV9Qcm9jfSwKKwl7Ikh0UHJvdGVjdCIsCQkgICAgICAgIAlTZXRfSHRQcm90ZWN0X1Byb2N9LAorCXsiSHRNaW1vUHMiLAkJICAgICAgICAJU2V0X0h0TWltb1BzX1Byb2N9LAorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisjaWZkZWYgQUdHUkVHQVRJT05fU1VQUE9SVAorCXsiUGt0QWdncmVnYXRlIiwJCQkJU2V0X1BrdEFnZ3JlZ2F0ZV9Qcm9jfSwKKyNlbmRpZgorCisjaWZkZWYgV01NX1NVUFBPUlQKKwl7IldtbUNhcGFibGUiLAkJCQkJU2V0X1dtbUNhcGFibGVfUHJvY30sCisjZW5kaWYKKwl7IklFRUU4MDIxMUgiLAkJCQkJU2V0X0lFRUU4MDIxMUhfUHJvY30sCisgICAgeyJOZXR3b3JrVHlwZSIsICAgICAgICAgICAgICAgICBTZXRfTmV0d29ya1R5cGVfUHJvY30sCisJeyJBdXRoTW9kZSIsCQkJCQlTZXRfQXV0aE1vZGVfUHJvY30sCisJeyJFbmNyeXBUeXBlIiwJCQkJCVNldF9FbmNyeXBUeXBlX1Byb2N9LAorCXsiRGVmYXVsdEtleUlEIiwJCQkJU2V0X0RlZmF1bHRLZXlJRF9Qcm9jfSwKKwl7IktleTEiLAkJCQkJCVNldF9LZXkxX1Byb2N9LAorCXsiS2V5MiIsCQkJCQkJU2V0X0tleTJfUHJvY30sCisJeyJLZXkzIiwJCQkJCQlTZXRfS2V5M19Qcm9jfSwKKwl7IktleTQiLAkJCQkJCVNldF9LZXk0X1Byb2N9LAorCXsiV1BBUFNLIiwJCQkJCQlTZXRfV1BBUFNLX1Byb2N9LAorCXsiUmVzZXRDb3VudGVyIiwJCQkJU2V0X1Jlc2V0U3RhdENvdW50ZXJfUHJvY30sCisJeyJQU01vZGUiLCAgICAgICAgICAgICAgICAgICAgICBTZXRfUFNNb2RlX1Byb2N9LAorI2lmZGVmIERCRworCXsiRGVidWciLAkJCQkJCVNldF9EZWJ1Z19Qcm9jfSwKKyNlbmRpZgorCisjaWZkZWYgUkFMSU5LX0FURQorCXsiQVRFIiwJCQkJCQkJU2V0X0FURV9Qcm9jfSwKKwl7IkFURURBIiwJCQkJCQlTZXRfQVRFX0RBX1Byb2N9LAorCXsiQVRFU0EiLAkJCQkJCVNldF9BVEVfU0FfUHJvY30sCisJeyJBVEVCU1NJRCIsCQkJCQlTZXRfQVRFX0JTU0lEX1Byb2N9LAorCXsiQVRFQ0hBTk5FTCIsCQkJCQlTZXRfQVRFX0NIQU5ORUxfUHJvY30sCisJeyJBVEVUWFBPVzAiLAkJCQkJU2V0X0FURV9UWF9QT1dFUjBfUHJvY30sCisJeyJBVEVUWFBPVzEiLAkJCQkJU2V0X0FURV9UWF9QT1dFUjFfUHJvY30sCisJeyJBVEVUWEFOVCIsCQkJCQlTZXRfQVRFX1RYX0FudGVubmFfUHJvY30sCisJeyJBVEVSWEFOVCIsCQkJCQlTZXRfQVRFX1JYX0FudGVubmFfUHJvY30sCisJeyJBVEVUWEZSRVFPRkZTRVQiLAkJCQlTZXRfQVRFX1RYX0ZSRVFPRkZTRVRfUHJvY30sCisJeyJBVEVUWEJXIiwJCQkJCQlTZXRfQVRFX1RYX0JXX1Byb2N9LAorCXsiQVRFVFhMRU4iLAkJCQkJU2V0X0FURV9UWF9MRU5HVEhfUHJvY30sCisJeyJBVEVUWENOVCIsCQkJCQlTZXRfQVRFX1RYX0NPVU5UX1Byb2N9LAorCXsiQVRFVFhNQ1MiLAkJCQkJU2V0X0FURV9UWF9NQ1NfUHJvY30sCisJeyJBVEVUWE1PREUiLAkJCQkJU2V0X0FURV9UWF9NT0RFX1Byb2N9LAorCXsiQVRFVFhHSSIsCQkJCQkJU2V0X0FURV9UWF9HSV9Qcm9jfSwKKwl7IkFURVJYRkVSIiwJCQkJCVNldF9BVEVfUlhfRkVSX1Byb2N9LAorCXsiQVRFUlJGIiwJCQkJCQlTZXRfQVRFX1JlYWRfUkZfUHJvY30sCisJeyJBVEVXUkYxIiwJCQkJCQlTZXRfQVRFX1dyaXRlX1JGMV9Qcm9jfSwKKwl7IkFURVdSRjIiLAkJCQkJCVNldF9BVEVfV3JpdGVfUkYyX1Byb2N9LAorCXsiQVRFV1JGMyIsCQkJCQkJU2V0X0FURV9Xcml0ZV9SRjNfUHJvY30sCisJeyJBVEVXUkY0IiwJCQkJCQlTZXRfQVRFX1dyaXRlX1JGNF9Qcm9jfSwKKwl7IkFURUxERTJQIiwJCQkJICAgIFNldF9BVEVfTG9hZF9FMlBfUHJvY30sCisJeyJBVEVSRTJQIiwJCQkJCQlTZXRfQVRFX1JlYWRfRTJQX1Byb2N9LAorCXsiQVRFU0hPVyIsCQkJCQkJU2V0X0FURV9TaG93X1Byb2N9LAorCXsiQVRFSEVMUCIsCQkJCQkJU2V0X0FURV9IZWxwX1Byb2N9LAorCisjaWZkZWYgUkFMSU5LXzI4eHhfUUEKKwl7IlR4U3RvcCIsCQkJCQkJU2V0X1R4U3RvcF9Qcm9jfSwKKwl7IlJ4U3RvcCIsCQkJCQkJU2V0X1J4U3RvcF9Qcm9jfSwKKyNlbmRpZiAvLyBSQUxJTktfMjh4eF9RQSAvLworI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyAgICB7IldwYVN1cHBvcnQiLCAgICAgICAgICAgICAgICAgIFNldF9XcGFfU3VwcG9ydH0sCisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCisKKworCXsiRml4ZWRUeE1vZGUiLCAgICAgICAgICAgICAgICAgU2V0X0ZpeGVkVHhNb2RlX1Byb2N9LAorI2lmZGVmIENPTkZJR19BUFNUQV9NSVhFRF9TVVBQT1JUCisJeyJPcE1vZGUiLAkJCQkJCVNldF9PcE1vZGVfUHJvY30sCisjZW5kaWYgLy8gQ09ORklHX0FQU1RBX01JWEVEX1NVUFBPUlQgLy8KKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKyAgICB7IlRHbldpZmlUZXN0IiwgICAgICAgICAgICAgICAgIFNldF9UR25XaWZpVGVzdF9Qcm9jfSwKKyAgICB7IkZvcmNlR0YiLAkJICAgICAgICAJCVNldF9Gb3JjZUdGX1Byb2N9LAorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCXsiRGxzQWRkRW50cnkiLAkJCQkJU2V0X0Rsc0FkZEVudHJ5X1Byb2N9LAorCXsiRGxzVGVhckRvd25FbnRyeSIsCQkJU2V0X0Rsc1RlYXJEb3duRW50cnlfUHJvY30sCisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisJeyJMb25nUmV0cnkiLAkgICAgICAgIAkJU2V0X0xvbmdSZXRyeUxpbWl0X1Byb2N9LAorCXsiU2hvcnRSZXRyeSIsCSAgICAgICAgCQlTZXRfU2hvcnRSZXRyeUxpbWl0X1Byb2N9LAorI2lmZGVmIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QKKwl7IjExZENsaWVudE1vZGUiLAkJCQlTZXRfSWVlZTgwMjExZENsaWVudE1vZGVfUHJvY30sCisjZW5kaWYgLy8gRVhUX0JVSUxEX0NIQU5ORUxfTElTVCAvLworI2lmZGVmIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQKKwl7IkNhcnJpZXJEZXRlY3QiLAkJCQlTZXRfQ2FycmllckRldGVjdF9Qcm9jfSwKKyNlbmRpZiAvLyBDQVJSSUVSX0RFVEVDVElPTl9TVVBQT1JUIC8vCisKKwl7TlVMTCx9Cit9OworCisKK1ZPSUQgUlRNUEFkZEtleSgKKwlJTglQUlRNUF9BREFQVEVSCSAgICBwQWQsCisJSU4JUE5ESVNfODAyXzExX0tFWSAgICBwS2V5KQoreworCVVMT05HCQkJCUtleUlkeDsKKwlNQUNfVEFCTEVfRU5UUlkgIAkqcEVudHJ5OworCisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlRNUEFkZEtleSAtLS0tLS0+XG4iKSk7CisKKwlpZiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKQorCXsKKwkJaWYgKHBLZXktPktleUluZGV4ICYgMHg4MDAwMDAwMCkKKwkJeworCQkgICAgaWYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTmRpc1plcm9NZW1vcnkocEFkLT5TdGFDZmcuUE1LLCAzMik7CisgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuUE1LLCBwS2V5LT5LZXlNYXRlcmlhbCwgcEtleS0+S2V5TGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgICAgIH0KKwkJICAgIC8vIFVwZGF0ZSBQVEsKKwkJICAgIE5kaXNaZXJvTWVtb3J5KCZwQWQtPlNoYXJlZEtleVtCU1MwXVswXSwgc2l6ZW9mKENJUEhFUl9LRVkpKTsKKyAgICAgICAgICAgIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLktleUxlbiA9IExFTl9US0lQX0VLOworICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5LCBwS2V5LT5LZXlNYXRlcmlhbCwgTEVOX1RLSVBfRUspOworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyAgICAgICAgICAgIGlmIChwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uUnhNaWMsIHBLZXktPktleU1hdGVyaWFsICsgTEVOX1RLSVBfRUssIExFTl9US0lQX1RYTUlDSyk7CisgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uVHhNaWMsIHBLZXktPktleU1hdGVyaWFsICsgTEVOX1RLSVBfRUsgKyBMRU5fVEtJUF9UWE1JQ0ssIExFTl9US0lQX1JYTUlDSyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworICAgICAgICAgICAgeworICAgICAgICAgICAgCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLlR4TWljLCBwS2V5LT5LZXlNYXRlcmlhbCArIExFTl9US0lQX0VLLCBMRU5fVEtJUF9UWE1JQ0spOworICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLlJ4TWljLCBwS2V5LT5LZXlNYXRlcmlhbCArIExFTl9US0lQX0VLICsgTEVOX1RLSVBfVFhNSUNLLCBMRU5fVEtJUF9SWE1JQ0spOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBEZWNpZGUgaXRzIENoaXBlckFsZworICAgICAgICAJaWYgKHBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkKKyAgICAgICAgCQlwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcgPSBDSVBIRVJfVEtJUDsKKyAgICAgICAgCWVsc2UgaWYgKHBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKKyAgICAgICAgCQlwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcgPSBDSVBIRVJfQUVTOworICAgICAgICAJZWxzZQorICAgICAgICAJCXBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZyA9IENJUEhFUl9OT05FOworCisgICAgICAgICAgICAvLyBVcGRhdGUgdGhlc2UgcmVsYXRlZCBpbmZvcm1hdGlvbiB0byBNQUNfVEFCTEVfRU5UUlkKKyAgICAgICAgCXBFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdOworICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEVudHJ5LT5QYWlyd2lzZUtleS5LZXksIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLktleSwgTEVOX1RLSVBfRUspOworICAgICAgICAJTmRpc01vdmVNZW1vcnkocEVudHJ5LT5QYWlyd2lzZUtleS5SeE1pYywgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uUnhNaWMsIExFTl9US0lQX1JYTUlDSyk7CisgICAgICAgIAlOZGlzTW92ZU1lbW9yeShwRW50cnktPlBhaXJ3aXNlS2V5LlR4TWljLCBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5UeE1pYywgTEVOX1RLSVBfVFhNSUNLKTsKKyAgICAgICAgCXBFbnRyeS0+UGFpcndpc2VLZXkuQ2lwaGVyQWxnID0gcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnOworCisgICAgICAgIAkvLyBVcGRhdGUgcGFpcndpc2Uga2V5IGluZm9ybWF0aW9uIHRvIEFTSUMgU2hhcmVkIEtleSBUYWJsZQorICAgICAgICAJQXNpY0FkZFNoYXJlZEtleUVudHJ5KHBBZCwKKyAgICAgICAgCQkJCQkJICBCU1MwLAorICAgICAgICAJCQkJCQkgIDAsCisgICAgICAgIAkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnLAorICAgICAgICAJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLktleSwKKyAgICAgICAgCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5UeE1pYywKKyAgICAgICAgCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5SeE1pYyk7CisKKyAgICAgICAgCS8vIFVwZGF0ZSBBU0lDIFdDSUQgYXR0cmlidXRlIHRhYmxlIGFuZCBJVkVJViB0YWJsZQorICAgICAgICAJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWQsCisgICAgICAgIAkJCQkJCQkgIEJTUzAsCisgICAgICAgIAkJCQkJCQkgIDAsCisgICAgICAgIAkJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZywKKyAgICAgICAgCQkJCQkJCSAgcEVudHJ5KTsKKworICAgICAgICAgICAgaWYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gc2V0IDgwMi4xeCBwb3J0IGNvbnRyb2wKKwkgICAgICAgICAgICAvL3BBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQ7CisJCQkJU1RBX1BPUlRfU0VDVVJFRChwQWQpOworCisgICAgICAgICAgICAgICAgLy8gSW5kaWNhdGUgQ29ubmVjdGVkIGZvciBHVUkKKyAgICAgICAgICAgICAgICBwQWQtPkluZGljYXRlTWVkaWFTdGF0ZSA9IE5kaXNNZWRpYVN0YXRlQ29ubmVjdGVkOworICAgICAgICAgICAgfQorCQl9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLy8gVXBkYXRlIEdUSworICAgICAgICAgICAgcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkID0gKHBLZXktPktleUluZGV4ICYgMHhGRik7CisgICAgICAgICAgICBOZGlzWmVyb01lbW9yeSgmcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXSwgc2l6ZW9mKENJUEhFUl9LRVkpKTsKKyAgICAgICAgICAgIHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uS2V5TGVuID0gTEVOX1RLSVBfRUs7CisgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLktleSwgcEtleS0+S2V5TWF0ZXJpYWwsIExFTl9US0lQX0VLKTsKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgICAgICAgICBpZiAocEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLlJ4TWljLCBwS2V5LT5LZXlNYXRlcmlhbCArIExFTl9US0lQX0VLLCBMRU5fVEtJUF9UWE1JQ0spOworICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uVHhNaWMsIHBLZXktPktleU1hdGVyaWFsICsgTEVOX1RLSVBfRUsgKyBMRU5fVEtJUF9UWE1JQ0ssIExFTl9US0lQX1JYTUlDSyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworICAgICAgICAgICAgeworICAgICAgICAgICAgCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uVHhNaWMsIHBLZXktPktleU1hdGVyaWFsICsgTEVOX1RLSVBfRUssIExFTl9US0lQX1RYTUlDSyk7CisgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5SeE1pYywgcEtleS0+S2V5TWF0ZXJpYWwgKyBMRU5fVEtJUF9FSyArIExFTl9US0lQX1RYTUlDSywgTEVOX1RLSVBfUlhNSUNLKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gVXBkYXRlIFNoYXJlZCBLZXkgQ2lwaGVyQWxnCisgICAgCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLkNpcGhlckFsZyA9IENJUEhFUl9OT05FOworICAgIAkJaWYgKHBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpCisgICAgCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5DaXBoZXJBbGcgPSBDSVBIRVJfVEtJUDsKKyAgICAJCWVsc2UgaWYgKHBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCisgICAgCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5DaXBoZXJBbGcgPSBDSVBIRVJfQUVTOworCisgICAgICAgICAgICAvLyBVcGRhdGUgZ3JvdXAga2V5IGluZm9ybWF0aW9uIHRvIEFTSUMgU2hhcmVkIEtleSBUYWJsZQorICAgICAgICAJQXNpY0FkZFNoYXJlZEtleUVudHJ5KHBBZCwKKyAgICAgICAgCQkJCQkJICBCU1MwLAorICAgICAgICAJCQkJCQkgIHBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCwKKyAgICAgICAgCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLkNpcGhlckFsZywKKyAgICAgICAgCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLktleSwKKyAgICAgICAgCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLlR4TWljLAorICAgICAgICAJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uUnhNaWMpOworCisgICAgICAgIAkvLyBVcGRhdGUgQVNJQyBXQ0lEIGF0dHJpYnV0ZSB0YWJsZSBhbmQgSVZFSVYgdGFibGUKKyAgICAgICAgCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkocEFkLAorICAgICAgICAJCQkJCQkJICBCU1MwLAorICAgICAgICAJCQkJCQkJICBwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQsCisgICAgICAgIAkJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uQ2lwaGVyQWxnLAorICAgICAgICAJCQkJCQkJICBOVUxMKTsKKworICAgICAgICAgICAgLy8gc2V0IDgwMi4xeCBwb3J0IGNvbnRyb2wKKwkgICAgICAgIC8vcEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRDsKKwkJCVNUQV9QT1JUX1NFQ1VSRUQocEFkKTsKKworICAgICAgICAgICAgLy8gSW5kaWNhdGUgQ29ubmVjdGVkIGZvciBHVUkKKyAgICAgICAgICAgIHBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID0gTmRpc01lZGlhU3RhdGVDb25uZWN0ZWQ7CisgICAgICAgIH0KKwl9CisJZWxzZQkvLyBkeW5hbWljIFdFUCBmcm9tIHdwYV9zdXBwbGljYW50CisJeworCQlVQ0hBUglDaXBoZXJBbGc7CisgICAgCVBVQ0hBUglLZXk7CisKKwkJaWYocEtleS0+S2V5TGVuZ3RoID09IDMyKQorCQkJZ290byBlbmQ7CisKKwkJS2V5SWR4ID0gcEtleS0+S2V5SW5kZXggJiAweDBmZmZmZmZmOworCisJCWlmIChLZXlJZHggPCA0KQorCQl7CisJCQkvLyBpdCBpcyBhIGRlZmF1bHQgc2hhcmVkIGtleSwgZm9yIFBhaXJ3aXNlIGtleSBzZXR0aW5nCisJCQlpZiAocEtleS0+S2V5SW5kZXggJiAweDgwMDAwMDAwKQorCQkJeworCQkJCXBFbnRyeSA9IE1hY1RhYmxlTG9va3VwKHBBZCwgcEtleS0+QlNTSUQpOworCisJCQkJaWYgKHBFbnRyeSkKKwkJCQl7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJUTVBBZGRLZXk6IFNldCBQYWlyLXdpc2UgS2V5XG4iKSk7CisKKwkJCQkJLy8gc2V0IGtleSBtYXRlcmlhbCBhbmQga2V5IGxlbmd0aAorIAkJCQkJcEVudHJ5LT5QYWlyd2lzZUtleS5LZXlMZW4gPSAoVUNIQVIpcEtleS0+S2V5TGVuZ3RoOworCQkJCQlOZGlzTW92ZU1lbW9yeShwRW50cnktPlBhaXJ3aXNlS2V5LktleSwgJnBLZXktPktleU1hdGVyaWFsLCBwS2V5LT5LZXlMZW5ndGgpOworCisJCQkJCS8vIHNldCBDaXBoZXIgdHlwZQorCQkJCQlpZiAocEtleS0+S2V5TGVuZ3RoID09IDUpCisJCQkJCQlwRW50cnktPlBhaXJ3aXNlS2V5LkNpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKKwkJCQkJZWxzZQorCQkJCQkJcEVudHJ5LT5QYWlyd2lzZUtleS5DaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OworCisJCQkJCS8vIEFkZCBQYWlyLXdpc2Uga2V5IHRvIEFzaWMKKwkJCQkJQXNpY0FkZFBhaXJ3aXNlS2V5RW50cnkoCisJCQkJCQlwQWQsCisJCQkJCQlwRW50cnktPkFkZHIsCisJCQkJCQkoVUNIQVIpcEVudHJ5LT5BaWQsCisgICAgICAgICAgICAgICAgCQkmcEVudHJ5LT5QYWlyd2lzZUtleSk7CisKKwkJCQkJLy8gdXBkYXRlIFdDSUQgYXR0cmlidXRlIHRhYmxlIGFuZCBJVkVJViB0YWJsZSBmb3IgdGhpcyBlbnRyeQorCQkJCQlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KAorCQkJCQkJcEFkLAorCQkJCQkJQlNTMCwKKwkJCQkJCUtleUlkeCwgLy8gVGhlIHZhbHVlIG1heSBiZSBub3QgemVybworCQkJCQkJcEVudHJ5LT5QYWlyd2lzZUtleS5DaXBoZXJBbGcsCisJCQkJCQlwRW50cnkpOworCisJCQkJfQorCQkJfQorCQkJZWxzZQorICAgICAgICAgICAgeworCQkJCS8vIERlZmF1bHQga2V5IGZvciB0eCAoc2hhcmVkIGtleSkKKwkJCQlwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQgPSAoVUNIQVIpIEtleUlkeDsKKworCQkJCS8vIHNldCBrZXkgbWF0ZXJpYWwgYW5kIGtleSBsZW5ndGgKKwkJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLktleUxlbiA9IChVQ0hBUikgcEtleS0+S2V5TGVuZ3RoOworCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uS2V5LCAmcEtleS0+S2V5TWF0ZXJpYWwsIHBLZXktPktleUxlbmd0aCk7CisKKwkJCQkvLyBTZXQgQ2lwZXIgdHlwZQorCQkJCWlmIChwS2V5LT5LZXlMZW5ndGggPT0gNSkKKwkJCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5DaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7CisJCQkJZWxzZQorCQkJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLkNpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7CisKKyAgICAJCQlDaXBoZXJBbGcgPSBwQWQtPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLkNpcGhlckFsZzsKKyAgICAJCQlLZXkgPSBwQWQtPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLktleTsKKworCQkJCS8vIFNldCBHcm91cCBrZXkgbWF0ZXJpYWwgdG8gQXNpYworICAgIAkJCUFzaWNBZGRTaGFyZWRLZXlFbnRyeShwQWQsIEJTUzAsIEtleUlkeCwgQ2lwaGVyQWxnLCBLZXksIE5VTEwsIE5VTEwpOworCisJCQkJLy8gVXBkYXRlIFdDSUQgYXR0cmlidXRlIHRhYmxlIGFuZCBJVkVJViB0YWJsZSBmb3IgdGhpcyBncm91cCBrZXkgdGFibGUKKwkJCQlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZCwgQlNTMCwgS2V5SWR4LCBDaXBoZXJBbGcsIE5VTEwpOworCisJCQl9CisJCX0KKwl9CitlbmQ6CisJcmV0dXJuOworfQorCitjaGFyICogcnRzdHJjaHIoY29uc3QgY2hhciAqIHMsIGludCBjKQoreworICAgIGZvcig7ICpzICE9IChjaGFyKSBjOyArK3MpCisgICAgICAgIGlmICgqcyA9PSAnXDAnKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIChjaGFyICopIHM7Cit9CisKKy8qCitUaGlzIGlzIHJlcXVpcmVkIGZvciBMaW5FWDIwMDQva2VybmVsMi42LjcgdG8gcHJvdmlkZSBpd2xpc3Qgc2Nhbm5pbmcgZnVuY3Rpb24KKyovCisKK2ludAorcnRfaW9jdGxfZ2l3bmFtZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgICBjaGFyICpuYW1lLCBjaGFyICpleHRyYSkKK3sKKy8vCVBSVE1QX0FEQVBURVIgcEFkYXB0ZXIgPSBkZXYtPm1sX3ByaXY7CisKKyNpZmRlZiBSVDI4NzAKKwlzdHJuY3B5KG5hbWUsICJSVDI4NzAgV2lyZWxlc3MiLCBJRk5BTVNJWik7CisjZW5kaWYgLy8gUlQyODcwIC8vCisJcmV0dXJuIDA7Cit9CisKK2ludCBydF9pb2N0bF9zaXdmcmVxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJc3RydWN0IGl3X2ZyZXEgKmZyZXEsIGNoYXIgKmV4dHJhKQoreworCVBSVE1QX0FEQVBURVIgcEFkYXB0ZXIgPSBkZXYtPm1sX3ByaXY7CisJaW50IAljaGFuID0gLTE7CisKKyAgICAvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgorICAgIGlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKKyAgICB7CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKyAgICAgICAgcmV0dXJuIC1FTkVURE9XTjsKKyAgICB9CisKKworCWlmIChmcmVxLT5lID4gMSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZigoZnJlcS0+ZSA9PSAwKSAmJiAoZnJlcS0+bSA8PSAxMDAwKSkKKwkJY2hhbiA9IGZyZXEtPm07CS8vIFNldHRpbmcgYnkgY2hhbm5lbCBudW1iZXIKKwllbHNlCisJCU1BUF9LSFpfVE9fQ0hBTk5FTF9JRCggKGZyZXEtPm0gLzEwMCkgLCBjaGFuKTsgLy8gU2V0dGluZyBieSBmcmVxdWVuY3kgLSBzZWFyY2ggdGhlIHRhYmxlICwgbGlrZSAyLjQxMkcsIDIuNDIyRywKKworICAgIGlmIChDaGFubmVsU2FuaXR5KHBBZGFwdGVyLCBjaGFuKSA9PSBUUlVFKQorICAgIHsKKwlwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWwgPSBjaGFuOworCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIj09PnJ0X2lvY3RsX3Npd2ZyZXE6OlNJT0NTSVdGUkVRW2NtZD0weCV4XSAoQ2hhbm5lbD0lZClcbiIsIFNJT0NTSVdGUkVRLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWwpKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICByZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiAwOworfQoraW50IHJ0X2lvY3RsX2dpd2ZyZXEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJICAgc3RydWN0IGl3X2ZyZXEgKmZyZXEsIGNoYXIgKmV4dHJhKQoreworICAgIFZJUlRVQUxfQURBUFRFUiAqcFZpcnR1YWxBZCA9IE5VTEw7CisJUFJUTVBfQURBUFRFUiBwQWRhcHRlciA9IE5VTEw7CisJVUNIQVIgY2g7CisJVUxPTkcJbTsKKworCWlmIChkZXYtPnByaXZfZmxhZ3MgPT0gSU5UX01BSU4pCisJeworCQlwQWRhcHRlciA9IGRldi0+bWxfcHJpdjsKKwl9CisJZWxzZQorCXsKKwkJcFZpcnR1YWxBZCA9IGRldi0+bWxfcHJpdjsKKwkJaWYgKHBWaXJ0dWFsQWQgJiYgcFZpcnR1YWxBZC0+UnRtcERldikKKwkJCXBBZGFwdGVyID0gcFZpcnR1YWxBZC0+UnRtcERldi0+bWxfcHJpdjsKKwl9CisKKwlpZiAocEFkYXB0ZXIgPT0gTlVMTCkKKwl7CisJCS8qIGlmIDFzdCBvcGVuIGZhaWwsIHBBZCB3aWxsIGJlIGZyZWU7CisJCSAgIFNvIHRoZSBuZXRfZGV2LT5tbF9wcml2IHdpbGwgYmUgTlVMTCBpbiAycmQgb3BlbiAqLworCQlyZXR1cm4gLUVORVRET1dOOworCX0KKworCQljaCA9IHBBZGFwdGVyLT5Db21tb25DZmcuQ2hhbm5lbDsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiPT0+cnRfaW9jdGxfZ2l3ZnJlcSAgJWRcbiIsIGNoKSk7CisKKyAgICBNQVBfQ0hBTk5FTF9JRF9UT19LSFooY2gsIG0pOworCWZyZXEtPm0gPSBtICogMTAwOworCWZyZXEtPmUgPSAxOworCXJldHVybiAwOworfQorCitpbnQgcnRfaW9jdGxfc2l3bW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgICBfX3UzMiAqbW9kZSwgY2hhciAqZXh0cmEpCit7CisJUFJUTVBfQURBUFRFUiBwQWRhcHRlciA9IGRldi0+bWxfcHJpdjsKKworCS8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCisgICAgaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQorICAgIHsKKyAgICAJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOworICAgICAgIAlyZXR1cm4gLUVORVRET1dOOworICAgIH0KKworCXN3aXRjaCAoKm1vZGUpCisJeworCQljYXNlIElXX01PREVfQURIT0M6CisJCQlTZXRfTmV0d29ya1R5cGVfUHJvYyhwQWRhcHRlciwgIkFkaG9jIik7CisJCQlicmVhazsKKwkJY2FzZSBJV19NT0RFX0lORlJBOgorCQkJU2V0X05ldHdvcmtUeXBlX1Byb2MocEFkYXB0ZXIsICJJbmZyYSIpOworCQkJYnJlYWs7CisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNCwyMCkpCisgICAgICAgIGNhc2UgSVdfTU9ERV9NT05JVE9SOgorCQkJU2V0X05ldHdvcmtUeXBlX1Byb2MocEFkYXB0ZXIsICJNb25pdG9yIik7CisJCQlicmVhazsKKyNlbmRpZgorCQlkZWZhdWx0OgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PnJ0X2lvY3RsX3Npd21vZGU6OlNJT0NTSVdNT0RFICh1bmtub3duICVkKVxuIiwgKm1vZGUpKTsKKwkJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8vIFJlc2V0IFJhbGluayBzdXBwbGljYW50IHRvIG5vdCB1c2UsIGl0IHdpbGwgYmUgc2V0IHRvIHN0YXJ0IHdoZW4gVUkgc2V0IFBNSyBrZXkKKwlwQWRhcHRlci0+U3RhQ2ZnLldwYVN0YXRlID0gU1NfTk9UVVNFOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBydF9pb2N0bF9naXdtb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCSAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSAgIF9fdTMyICptb2RlLCBjaGFyICpleHRyYSkKK3sKKwlQUlRNUF9BREFQVEVSIAlwQWRhcHRlciA9IE5VTEw7CisJVklSVFVBTF9BREFQVEVSICpwVmlydHVhbEFkID0gTlVMTDsKKworCWlmIChkZXYtPnByaXZfZmxhZ3MgPT0gSU5UX01BSU4pCisJeworCQlwQWRhcHRlciA9IGRldi0+bWxfcHJpdjsKKwl9CisJZWxzZQorCXsKKwkJcFZpcnR1YWxBZCA9IGRldi0+bWxfcHJpdjsKKwkJaWYgKHBWaXJ0dWFsQWQgJiYgcFZpcnR1YWxBZC0+UnRtcERldikKKwkJCXBBZGFwdGVyID0gcFZpcnR1YWxBZC0+UnRtcERldi0+bWxfcHJpdjsKKwl9CisKKwlpZiAocEFkYXB0ZXIgPT0gTlVMTCkKKwl7CisJCS8qIGlmIDFzdCBvcGVuIGZhaWwsIHBBZCB3aWxsIGJlIGZyZWU7CisJCSAgIFNvIHRoZSBuZXRfZGV2LT5tbF9wcml2IHdpbGwgYmUgTlVMTCBpbiAycmQgb3BlbiAqLworCQlyZXR1cm4gLUVORVRET1dOOworCX0KKworCWlmIChBREhPQ19PTihwQWRhcHRlcikpCisJCSptb2RlID0gSVdfTU9ERV9BREhPQzsKKyAgICBlbHNlIGlmIChJTkZSQV9PTihwQWRhcHRlcikpCisJCSptb2RlID0gSVdfTU9ERV9JTkZSQTsKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw0LDIwKSkKKyAgICBlbHNlIGlmIChNT05JVE9SX09OKHBBZGFwdGVyKSkKKyAgICB7CisgICAgICAgICptb2RlID0gSVdfTU9ERV9NT05JVE9SOworICAgIH0KKyNlbmRpZgorICAgIGVsc2UKKyAgICAgICAgKm1vZGUgPSBJV19NT0RFX0FVVE87CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT5ydF9pb2N0bF9naXdtb2RlKG1vZGU9JWQpXG4iLCAqbW9kZSkpOworCXJldHVybiAwOworfQorCitpbnQgcnRfaW9jdGxfc2l3c2VucyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgICBjaGFyICpuYW1lLCBjaGFyICpleHRyYSkKK3sKKwlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gZGV2LT5tbF9wcml2OworCisJLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KKyAgICAJaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQorICAgIAl7CisgICAgICAgIAlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisgICAgICAgIAlyZXR1cm4gLUVORVRET1dOOworICAgIAl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IHJ0X2lvY3RsX2dpd3NlbnMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJICAgY2hhciAqbmFtZSwgY2hhciAqZXh0cmEpCit7CisJcmV0dXJuIDA7Cit9CisKK2ludCBydF9pb2N0bF9naXdyYW5nZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgICBzdHJ1Y3QgaXdfcG9pbnQgKmRhdGEsIGNoYXIgKmV4dHJhKQoreworCVBSVE1QX0FEQVBURVIgCXBBZGFwdGVyID0gTlVMTDsKKwlWSVJUVUFMX0FEQVBURVIgKnBWaXJ0dWFsQWQgPSBOVUxMOworCXN0cnVjdCBpd19yYW5nZSAqcmFuZ2UgPSAoc3RydWN0IGl3X3JhbmdlICopIGV4dHJhOworCXUxNiB2YWw7CisJaW50IGk7CisKKwlpZiAoZGV2LT5wcml2X2ZsYWdzID09IElOVF9NQUlOKQorCXsKKwkJcEFkYXB0ZXIgPSBkZXYtPm1sX3ByaXY7CisJfQorCWVsc2UKKwl7CisJCXBWaXJ0dWFsQWQgPSBkZXYtPm1sX3ByaXY7CisJCWlmIChwVmlydHVhbEFkICYmIHBWaXJ0dWFsQWQtPlJ0bXBEZXYpCisJCQlwQWRhcHRlciA9IHBWaXJ0dWFsQWQtPlJ0bXBEZXYtPm1sX3ByaXY7CisJfQorCisJaWYgKHBBZGFwdGVyID09IE5VTEwpCisJeworCQkvKiBpZiAxc3Qgb3BlbiBmYWlsLCBwQWQgd2lsbCBiZSBmcmVlOworCQkgICBTbyB0aGUgbmV0X2Rldi0+bWxfcHJpdiB3aWxsIGJlIE5VTEwgaW4gMnJkIG9wZW4gKi8KKwkJcmV0dXJuIC1FTkVURE9XTjsKKwl9CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSAsKCI9PT0+cnRfaW9jdGxfZ2l3cmFuZ2VcbiIpKTsKKwlkYXRhLT5sZW5ndGggPSBzaXplb2Yoc3RydWN0IGl3X3JhbmdlKTsKKwltZW1zZXQocmFuZ2UsIDAsIHNpemVvZihzdHJ1Y3QgaXdfcmFuZ2UpKTsKKworCXJhbmdlLT50eHBvd2VyX2NhcGEgPSBJV19UWFBPV19EQk07CisKKwlpZiAoSU5GUkFfT04ocEFkYXB0ZXIpfHxBREhPQ19PTihwQWRhcHRlcikpCisJeworCQlyYW5nZS0+bWluX3BtcCA9IDEgKiAxMDI0OworCQlyYW5nZS0+bWF4X3BtcCA9IDY1NTM1ICogMTAyNDsKKwkJcmFuZ2UtPm1pbl9wbXQgPSAxICogMTAyNDsKKwkJcmFuZ2UtPm1heF9wbXQgPSAxMDAwICogMTAyNDsKKwkJcmFuZ2UtPnBtcF9mbGFncyA9IElXX1BPV0VSX1BFUklPRDsKKwkJcmFuZ2UtPnBtdF9mbGFncyA9IElXX1BPV0VSX1RJTUVPVVQ7CisJCXJhbmdlLT5wbV9jYXBhID0gSVdfUE9XRVJfUEVSSU9EIHwgSVdfUE9XRVJfVElNRU9VVCB8CisJCQlJV19QT1dFUl9VTklDQVNUX1IgfCBJV19QT1dFUl9BTExfUjsKKwl9CisKKwlyYW5nZS0+d2VfdmVyc2lvbl9jb21waWxlZCA9IFdJUkVMRVNTX0VYVDsKKwlyYW5nZS0+d2VfdmVyc2lvbl9zb3VyY2UgPSAxNDsKKworCXJhbmdlLT5yZXRyeV9jYXBhID0gSVdfUkVUUllfTElNSVQ7CisJcmFuZ2UtPnJldHJ5X2ZsYWdzID0gSVdfUkVUUllfTElNSVQ7CisJcmFuZ2UtPm1pbl9yZXRyeSA9IDA7CisJcmFuZ2UtPm1heF9yZXRyeSA9IDI1NTsKKworCXJhbmdlLT5udW1fY2hhbm5lbHMgPSAgcEFkYXB0ZXItPkNoYW5uZWxMaXN0TnVtOworCisJdmFsID0gMDsKKwlmb3IgKGkgPSAxOyBpIDw9IHJhbmdlLT5udW1fY2hhbm5lbHM7IGkrKykKKwl7CisJCXUzMiBtOworCQlyYW5nZS0+ZnJlcVt2YWxdLmkgPSBwQWRhcHRlci0+Q2hhbm5lbExpc3RbaS0xXS5DaGFubmVsOworCQlNQVBfQ0hBTk5FTF9JRF9UT19LSFoocEFkYXB0ZXItPkNoYW5uZWxMaXN0W2ktMV0uQ2hhbm5lbCwgbSk7CisJCXJhbmdlLT5mcmVxW3ZhbF0ubSA9IG0gKiAxMDA7IC8qIEhaICovCisKKwkJcmFuZ2UtPmZyZXFbdmFsXS5lID0gMTsKKwkJdmFsKys7CisJCWlmICh2YWwgPT0gSVdfTUFYX0ZSRVFVRU5DSUVTKQorCQkJYnJlYWs7CisJfQorCXJhbmdlLT5udW1fZnJlcXVlbmN5ID0gdmFsOworCisJcmFuZ2UtPm1heF9xdWFsLnF1YWwgPSAxMDA7IC8qIHdoYXQgaXMgY29ycmVjdCBtYXg/IFRoaXMgd2FzIG5vdAorCQkJCQkqIGRvY3VtZW50ZWQgZXhhY3RseS4gQXQgbGVhc3QKKwkJCQkJKiA2OSBoYXMgYmVlbiBvYnNlcnZlZC4gKi8KKwlyYW5nZS0+bWF4X3F1YWwubGV2ZWwgPSAwOyAvKiBkQiAqLworCXJhbmdlLT5tYXhfcXVhbC5ub2lzZSA9IDA7IC8qIGRCICovCisKKwkvKiBXaGF0IHdvdWxkIGJlIHN1aXRhYmxlIHZhbHVlcyBmb3IgImF2ZXJhZ2UvdHlwaWNhbCIgcXVhbD8gKi8KKwlyYW5nZS0+YXZnX3F1YWwucXVhbCA9IDIwOworCXJhbmdlLT5hdmdfcXVhbC5sZXZlbCA9IC02MDsKKwlyYW5nZS0+YXZnX3F1YWwubm9pc2UgPSAtOTU7CisJcmFuZ2UtPnNlbnNpdGl2aXR5ID0gMzsKKworCXJhbmdlLT5tYXhfZW5jb2RpbmdfdG9rZW5zID0gTlJfV0VQX0tFWVM7CisJcmFuZ2UtPm51bV9lbmNvZGluZ19zaXplcyA9IDI7CisJcmFuZ2UtPmVuY29kaW5nX3NpemVbMF0gPSA1OworCXJhbmdlLT5lbmNvZGluZ19zaXplWzFdID0gMTM7CisKKwlyYW5nZS0+bWluX3J0cyA9IDA7CisJcmFuZ2UtPm1heF9ydHMgPSAyMzQ3OworCXJhbmdlLT5taW5fZnJhZyA9IDI1NjsKKwlyYW5nZS0+bWF4X2ZyYWcgPSAyMzQ2OworCisjaWYgV0lSRUxFU1NfRVhUID4gMTcKKwkvKiBJV19FTkNfQ0FQQV8qIGJpdCBmaWVsZCAqLworCXJhbmdlLT5lbmNfY2FwYSA9IElXX0VOQ19DQVBBX1dQQSB8IElXX0VOQ19DQVBBX1dQQTIgfAorCQkJCQlJV19FTkNfQ0FQQV9DSVBIRVJfVEtJUCB8IElXX0VOQ19DQVBBX0NJUEhFUl9DQ01QOworI2VuZGlmCisKKwlyZXR1cm4gMDsKK30KKworaW50IHJ0X2lvY3RsX3Npd2FwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCSAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSAgICAgIHN0cnVjdCBzb2NrYWRkciAqYXBfYWRkciwgY2hhciAqZXh0cmEpCit7CisJUFJUTVBfQURBUFRFUiBwQWRhcHRlciA9IGRldi0+bWxfcHJpdjsKKyAgICBORElTXzgwMl8xMV9NQUNfQUREUkVTUyBCc3NpZDsKKworCS8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCisJaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQorCXsKKyAgICAgICAJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOworICAgICAgIAlyZXR1cm4gLUVORVRET1dOOworICAgIH0KKworCWlmIChwQWRhcHRlci0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgIT0gQ05UTF9JRExFKQorICAgIHsKKyAgICAgICAgUlQyOFhYX01MTUVfUkVTRVRfU1RBVEVfTUFDSElORShwQWRhcHRlcik7CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISBNTE1FIGJ1c3ksIHJlc2V0IE1MTUUgc3RhdGUgbWFjaGluZSAhISFcbiIpKTsKKyAgICB9CisKKyAgICAvLyB0ZWxsIENOVEwgc3RhdGUgbWFjaGluZSB0byBjYWxsIE5kaXNNU2V0SW5mb3JtYXRpb25Db21wbGV0ZSgpIGFmdGVyIGNvbXBsZXRpbmcKKyAgICAvLyB0aGlzIHJlcXVlc3QsIGJlY2F1c2UgdGhpcyByZXF1ZXN0IGlzIGluaXRpYXRlZCBieSBORElTLgorICAgIHBBZGFwdGVyLT5NbG1lQXV4LkN1cnJSZXFJc0Zyb21OZGlzID0gRkFMU0U7CisJLy8gUHJldmVudCB0byBjb25uZWN0IEFQIGFnYWluIGluIFNUQU1sbWVQZXJpb2RpY0V4ZWMKKwlwQWRhcHRlci0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbj0gMzI7CisKKyAgICBtZW1zZXQoQnNzaWQsIDAsIE1BQ19BRERSX0xFTik7CisgICAgbWVtY3B5KEJzc2lkLCBhcF9hZGRyLT5zYV9kYXRhLCBNQUNfQUREUl9MRU4pOworICAgIE1sbWVFbnF1ZXVlKHBBZGFwdGVyLAorICAgICAgICAgICAgICAgIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLAorICAgICAgICAgICAgICAgIE9JRF84MDJfMTFfQlNTSUQsCisgICAgICAgICAgICAgICAgc2l6ZW9mKE5ESVNfODAyXzExX01BQ19BRERSRVNTKSwKKyAgICAgICAgICAgICAgICAoVk9JRCAqKSZCc3NpZCk7CisKKyAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJT0NUTDo6U0lPQ1NJV0FQICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorICAgICAgICBCc3NpZFswXSwgQnNzaWRbMV0sIEJzc2lkWzJdLCBCc3NpZFszXSwgQnNzaWRbNF0sIEJzc2lkWzVdKSk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IHJ0X2lvY3RsX2dpd2FwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCSAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSAgICAgIHN0cnVjdCBzb2NrYWRkciAqYXBfYWRkciwgY2hhciAqZXh0cmEpCit7CisJUFJUTVBfQURBUFRFUiAJcEFkYXB0ZXIgPSBOVUxMOworCVZJUlRVQUxfQURBUFRFUiAqcFZpcnR1YWxBZCA9IE5VTEw7CisKKwlpZiAoZGV2LT5wcml2X2ZsYWdzID09IElOVF9NQUlOKQorCXsKKwkJcEFkYXB0ZXIgPSBkZXYtPm1sX3ByaXY7CisJfQorCWVsc2UKKwl7CisJCXBWaXJ0dWFsQWQgPSBkZXYtPm1sX3ByaXY7CisJCWlmIChwVmlydHVhbEFkICYmIHBWaXJ0dWFsQWQtPlJ0bXBEZXYpCisJCQlwQWRhcHRlciA9IHBWaXJ0dWFsQWQtPlJ0bXBEZXYtPm1sX3ByaXY7CisJfQorCisJaWYgKHBBZGFwdGVyID09IE5VTEwpCisJeworCQkvKiBpZiAxc3Qgb3BlbiBmYWlsLCBwQWQgd2lsbCBiZSBmcmVlOworCQkgICBTbyB0aGUgbmV0X2Rldi0+bWxfcHJpdiB3aWxsIGJlIE5VTEwgaW4gMnJkIG9wZW4gKi8KKwkJcmV0dXJuIC1FTkVURE9XTjsKKwl9CisKKwlpZiAoSU5GUkFfT04ocEFkYXB0ZXIpIHx8IEFESE9DX09OKHBBZGFwdGVyKSkKKwl7CisJCWFwX2FkZHItPnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKKwkJbWVtY3B5KGFwX2FkZHItPnNhX2RhdGEsICZwQWRhcHRlci0+Q29tbW9uQ2ZnLkJzc2lkLCBFVEhfQUxFTik7CisJfQorI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyAgICAvLyBBZGQgZm9yIFJUMjg3MAorICAgIGVsc2UgaWYgKHBBZGFwdGVyLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQICE9IFdQQV9TVVBQTElDQU5UX0RJU0FCTEUpCisgICAgeworICAgICAgICBhcF9hZGRyLT5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7CisgICAgICAgIG1lbWNweShhcF9hZGRyLT5zYV9kYXRhLCAmcEFkYXB0ZXItPk1sbWVBdXguQnNzaWQsIEVUSF9BTEVOKTsKKyAgICB9CisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCWVsc2UKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklPQ1RMOjpTSU9DR0lXQVAoPUVNUFRZKVxuIikpOworCQlyZXR1cm4gLUVOT1RDT05OOworCX0KKworCXJldHVybiAwOworfQorCisvKgorICogVW5pdHMgYXJlIGluIGRiIGFib3ZlIHRoZSBub2lzZSBmbG9vci4gVGhhdCBtZWFucyB0aGUKKyAqIHJzc2kgdmFsdWVzIHJlcG9ydGVkIGluIHRoZSB0eC9yeCBkZXNjcmlwdG9ycyBpbiB0aGUKKyAqIGRyaXZlciBhcmUgdGhlIFNOUiBleHByZXNzZWQgaW4gZGIuCisgKgorICogSWYgeW91IGFzc3VtZSB0aGF0IHRoZSBub2lzZSBmbG9vciBpcyAtOTUsIHdoaWNoIGlzIGFuCisgKiBleGNlbGxlbnQgYXNzdW1wdGlvbiA5OS41ICUgb2YgdGhlIHRpbWUsIHRoZW4geW91IGNhbgorICogZGVyaXZlIHRoZSBhYnNvbHV0ZSBzaWduYWwgbGV2ZWwgKGkuZS4gLTk1ICsgcnNzaSkuCisgKiBUaGVyZSBhcmUgc29tZSBvdGhlciBzbGlnaHQgZmFjdG9ycyB0byB0YWtlIGludG8gYWNjb3VudAorICogZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIHJzc2kgbWVhc3VyZW1lbnQgaXMgZnJvbSAxMWIsCisgKiAxMWcsIG9yIDExYS4gICBUaGVzZSBkaWZmZXJlbmNlcyBhcmUgYXQgbW9zdCAyZGIgYW5kCisgKiBjYW4gYmUgZG9jdW1lbnRlZC4KKyAqCisgKiBOQjogdmFyaW91cyBjYWxjdWxhdGlvbnMgYXJlIGJhc2VkIG9uIHRoZSBvcmlub2NvL3dhdmVsYW4KKyAqICAgICBkcml2ZXJzIGZvciBjb21wYXRpYmlsaXR5CisgKi8KK3N0YXRpYyB2b2lkIHNldF9xdWFsaXR5KFBSVE1QX0FEQVBURVIgcEFkYXB0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaXdfcXVhbGl0eSAqaXEsCisgICAgICAgICAgICAgICAgICAgICAgICBzaWduZWQgY2hhciByc3NpKQoreworCV9fdTggQ2hhbm5lbFF1YWxpdHk7CisKKwkvLyBOb3JtYWxpemUgUnNzaQorCWlmIChyc3NpID49IC01MCkKKwkJQ2hhbm5lbFF1YWxpdHkgPSAxMDA7CisJZWxzZSBpZiAocnNzaSA+PSAtODApIC8vIGJldHdlZW4gLTUwIH4gLTgwZGJtCisJCUNoYW5uZWxRdWFsaXR5ID0gKF9fdTgpKDI0ICsgKChyc3NpICsgODApICogMjYpLzEwKTsKKwllbHNlIGlmIChyc3NpID49IC05MCkgICAvLyBiZXR3ZWVuIC04MCB+IC05MGRibQorICAgICAgICBDaGFubmVsUXVhbGl0eSA9IChfX3U4KSgocnNzaSArIDkwKSAqIDI2KS8xMDsKKwllbHNlCisJCUNoYW5uZWxRdWFsaXR5ID0gMDsKKworICAgIGlxLT5xdWFsID0gKF9fdTgpQ2hhbm5lbFF1YWxpdHk7CisKKyAgICBpcS0+bGV2ZWwgPSAoX191OCkocnNzaSk7CisgICAgaXEtPm5vaXNlID0gKHBBZGFwdGVyLT5CYnBXcml0ZUxhdGNoWzY2XSA+IHBBZGFwdGVyLT5CYnBUdW5pbmcuRmFsc2VDY2FVcHBlclRocmVzaG9sZCkgPyAoKF9fdTgpcEFkYXB0ZXItPkJicFR1bmluZy5GYWxzZUNjYVVwcGVyVGhyZXNob2xkKSA6ICgoX191OCkgcEFkYXB0ZXItPkJicFdyaXRlTGF0Y2hbNjZdKTsgCS8vIG5vaXNlIGxldmVsIChkQm0pCisgICAgaXEtPm5vaXNlICs9IDI1NiAtIDE0MzsKKyAgICBpcS0+dXBkYXRlZCA9IHBBZGFwdGVyLT5pd19zdGF0cy5xdWFsLnVwZGF0ZWQ7Cit9CisKK2ludCBydF9pb2N0bF9pd2FwbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCXN0cnVjdCBpd19wb2ludCAqZGF0YSwgY2hhciAqZXh0cmEpCit7CisgCVBSVE1QX0FEQVBURVIgcEFkYXB0ZXIgPSBkZXYtPm1sX3ByaXY7CisKKwlzdHJ1Y3Qgc29ja2FkZHIgYWRkcltJV19NQVhfQVBdOworCXN0cnVjdCBpd19xdWFsaXR5IHF1YWxbSVdfTUFYX0FQXTsKKwlpbnQgaTsKKworICAgCS8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCisgICAgaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQorICAgIHsKKyAgICAgICAJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOworCQlkYXRhLT5sZW5ndGggPSAwOworCQlyZXR1cm4gMDsKKyAgICAgICAgLy9yZXR1cm4gLUVORVRET1dOOworCX0KKworCWZvciAoaSA9IDA7IGkgPElXX01BWF9BUCA7IGkrKykKKwl7CisJCWlmIChpID49ICBwQWRhcHRlci0+U2NhblRhYi5Cc3NOcikKKwkJCWJyZWFrOworCQlhZGRyW2ldLnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKKwkJCW1lbWNweShhZGRyW2ldLnNhX2RhdGEsICZwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Cc3NpZCwgTUFDX0FERFJfTEVOKTsKKwkJc2V0X3F1YWxpdHkocEFkYXB0ZXIsICZxdWFsW2ldLCBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Sc3NpKTsKKwl9CisJZGF0YS0+bGVuZ3RoID0gaTsKKwltZW1jcHkoZXh0cmEsICZhZGRyLCBpKnNpemVvZihhZGRyWzBdKSk7CisJZGF0YS0+ZmxhZ3MgPSAxOwkJLyogc2lnbmFsIHF1YWxpdHkgcHJlc2VudCAoc29ydCBvZikgKi8KKwltZW1jcHkoZXh0cmEgKyBpKnNpemVvZihhZGRyWzBdKSwgJnF1YWwsIGkqc2l6ZW9mKHF1YWxbaV0pKTsKKworCXJldHVybiAwOworfQorCisjaWZkZWYgU0lPQ0dJV1NDQU4KK2ludCBydF9pb2N0bF9zaXdzY2FuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJc3RydWN0IGl3X3BvaW50ICpkYXRhLCBjaGFyICpleHRyYSkKK3sKKwlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gZGV2LT5tbF9wcml2OworCisJVUxPTkcJCQkJCQkJCU5vdzsKKwlpbnQgU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKworCS8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCisJaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOworCQlyZXR1cm4gLUVORVRET1dOOworCX0KKworCWlmIChNT05JVE9SX09OKHBBZGFwdGVyKSkKKyAgICB7CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISBEcml2ZXIgaXMgaW4gTW9uaXRvciBNb2RlIG5vdyAhISFcbiIpKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisJaWYgKHBBZGFwdGVyLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQID09IFdQQV9TVVBQTElDQU5UX0VOQUJMRSkKKwl7CisJCXBBZGFwdGVyLT5TdGFDZmcuV3BhU3VwcGxpY2FudFNjYW5Db3VudCsrOworCX0KKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisKKyAgICBwQWRhcHRlci0+U3RhQ2ZnLmJTY2FuUmVxSXNGcm9tV2ViVUkgPSBUUlVFOworCWlmIChSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUykpCisJCXJldHVybiAwOworCWRveworCQlOb3cgPSBqaWZmaWVzOworCisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorCQlpZiAoKHBBZGFwdGVyLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQID09IFdQQV9TVVBQTElDQU5UX0VOQUJMRSkgJiYKKwkJCShwQWRhcHRlci0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRTY2FuQ291bnQgPiAzKSkKKwkJeworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIFdwYVN1cHBsaWNhbnRTY2FuQ291bnQgPiAzXG4iKSk7CisJCQlTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworCQkJYnJlYWs7CisJCX0KKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisKKwkJaWYgKChPUFNUQVRVU19URVNUX0ZMQUcocEFkYXB0ZXIsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSkgJiYKKwkJCSgocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpIHx8CisJCQkocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spKSAmJgorCQkJKHBBZGFwdGVyLT5TdGFDZmcuUG9ydFNlY3VyZWQgPT0gV1BBXzgwMl8xWF9QT1JUX05PVF9TRUNVUkVEKSkKKwkJeworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIExpbmsgVVAsIFBvcnQgTm90IFNlY3VyZWQhIGlnbm9yZSB0aGlzIHNldDo6T0lEXzgwMl8xMV9CU1NJRF9MSVNUX1NDQU5cbiIpKTsKKwkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChwQWRhcHRlci0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgIT0gQ05UTF9JRExFKQorCQl7CisJCQlSVDI4WFhfTUxNRV9SRVNFVF9TVEFURV9NQUNISU5FKHBBZGFwdGVyKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISBNTE1FIGJ1c3ksIHJlc2V0IE1MTUUgc3RhdGUgbWFjaGluZSAhISFcbiIpKTsKKwkJfQorCisJCS8vIHRlbGwgQ05UTCBzdGF0ZSBtYWNoaW5lIHRvIGNhbGwgTmRpc01TZXRJbmZvcm1hdGlvbkNvbXBsZXRlKCkgYWZ0ZXIgY29tcGxldGluZworCQkvLyB0aGlzIHJlcXVlc3QsIGJlY2F1c2UgdGhpcyByZXF1ZXN0IGlzIGluaXRpYXRlZCBieSBORElTLgorCQlwQWRhcHRlci0+TWxtZUF1eC5DdXJyUmVxSXNGcm9tTmRpcyA9IEZBTFNFOworCQkvLyBSZXNldCBhbGxvd2VkIHNjYW4gcmV0cmllcworCQlwQWRhcHRlci0+U3RhQ2ZnLlNjYW5DbnQgPSAwOworCQlwQWRhcHRlci0+U3RhQ2ZnLkxhc3RTY2FuVGltZSA9IE5vdzsKKworCQlNbG1lRW5xdWV1ZShwQWRhcHRlciwKKwkJCU1MTUVfQ05UTF9TVEFURV9NQUNISU5FLAorCQkJT0lEXzgwMl8xMV9CU1NJRF9MSVNUX1NDQU4sCisJCQkwLAorCQkJTlVMTCk7CisKKwkJU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKwkJUlQyOFhYX01MTUVfSEFORExFUihwQWRhcHRlcik7CisJfXdoaWxlKDApOworCXJldHVybiAwOworfQorCitpbnQgcnRfaW9jdGxfZ2l3c2NhbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCXN0cnVjdCBpd19wb2ludCAqZGF0YSwgY2hhciAqZXh0cmEpCit7CisKKwlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gZGV2LT5tbF9wcml2OworCWludCBpPTA7CisJY2hhciAqY3VycmVudF9ldiA9IGV4dHJhLCAqcHJldmlvdXNfZXYgPSBleHRyYTsKKwljaGFyICplbmRfYnVmOworCWNoYXIgKmN1cnJlbnRfdmFsLCBjdXN0b21bTUFYX0NVU1RPTV9MRU5dID0gezB9OworI2lmbmRlZiBJV0VWR0VOSUUKKwljaGFyIGlkeDsKKyNlbmRpZiAvLyBJV0VWR0VOSUUgLy8KKwlzdHJ1Y3QgaXdfZXZlbnQgaXdlOworCisJaWYgKFJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKSkKKyAgICB7CisJCS8qCisJCSAqIFN0aWxsIHNjYW5uaW5nLCBpbmRpY2F0ZSB0aGUgY2FsbGVyIHNob3VsZCB0cnkgYWdhaW4uCisJCSAqLworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisKKworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKwlpZiAocEFkYXB0ZXItPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgPT0gV1BBX1NVUFBMSUNBTlRfRU5BQkxFKQorCXsKKwkJcEFkYXB0ZXItPlN0YUNmZy5XcGFTdXBwbGljYW50U2NhbkNvdW50ID0gMDsKKwl9CisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCisJaWYgKHBBZGFwdGVyLT5TY2FuVGFiLkJzc05yID09IDApCisJeworCQlkYXRhLT5sZW5ndGggPSAwOworCQlyZXR1cm4gMDsKKwl9CisKKyNpZiBXSVJFTEVTU19FWFQgPj0gMTcKKyAgICBpZiAoZGF0YS0+bGVuZ3RoID4gMCkKKyAgICAgICAgZW5kX2J1ZiA9IGV4dHJhICsgZGF0YS0+bGVuZ3RoOworICAgIGVsc2UKKyAgICAgICAgZW5kX2J1ZiA9IGV4dHJhICsgSVdfU0NBTl9NQVhfREFUQTsKKyNlbHNlCisgICAgZW5kX2J1ZiA9IGV4dHJhICsgSVdfU0NBTl9NQVhfREFUQTsKKyNlbmRpZgorCisJZm9yIChpID0gMDsgaSA8IHBBZGFwdGVyLT5TY2FuVGFiLkJzc05yOyBpKyspCisJeworCQlpZiAoY3VycmVudF9ldiA+PSBlbmRfYnVmKQorICAgICAgICB7CisjaWYgV0lSRUxFU1NfRVhUID49IDE3CisgICAgICAgICAgICByZXR1cm4gLUUyQklHOworI2Vsc2UKKwkJCWJyZWFrOworI2VuZGlmCisgICAgICAgIH0KKworCQkvL01BQyBhZGRyZXNzCisJCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkJbWVtc2V0KCZpd2UsIDAsIHNpemVvZihpd2UpKTsKKwkJaXdlLmNtZCA9IFNJT0NHSVdBUDsKKwkJaXdlLnUuYXBfYWRkci5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7CisJCQkJbWVtY3B5KGl3ZS51LmFwX2FkZHIuc2FfZGF0YSwgJnBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkJzc2lkLCBFVEhfQUxFTik7CisKKyAgICAgICAgcHJldmlvdXNfZXYgPSBjdXJyZW50X2V2OworCQljdXJyZW50X2V2ID0gSVdFX1NUUkVBTV9BRERfRVZFTlQoaW5mbywgY3VycmVudF9ldixlbmRfYnVmLCAmaXdlLCBJV19FVl9BRERSX0xFTik7CisgICAgICAgIGlmIChjdXJyZW50X2V2ID09IHByZXZpb3VzX2V2KQorI2lmIFdJUkVMRVNTX0VYVCA+PSAxNworICAgICAgICAgICAgcmV0dXJuIC1FMkJJRzsKKyNlbHNlCisJCQlicmVhazsKKyNlbmRpZgorCisJCS8vRVNTSUQKKwkJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCQltZW1zZXQoJml3ZSwgMCwgc2l6ZW9mKGl3ZSkpOworCQlpd2UuY21kID0gU0lPQ0dJV0VTU0lEOworCQlpd2UudS5kYXRhLmxlbmd0aCA9IHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlNzaWRMZW47CisJCWl3ZS51LmRhdGEuZmxhZ3MgPSAxOworCisgICAgICAgIHByZXZpb3VzX2V2ID0gY3VycmVudF9ldjsKKwkJY3VycmVudF9ldiA9IElXRV9TVFJFQU1fQUREX1BPSU5UKGluZm8sIGN1cnJlbnRfZXYsZW5kX2J1ZiwgJml3ZSwgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uU3NpZCk7CisgICAgICAgIGlmIChjdXJyZW50X2V2ID09IHByZXZpb3VzX2V2KQorI2lmIFdJUkVMRVNTX0VYVCA+PSAxNworICAgICAgICAgICAgcmV0dXJuIC1FMkJJRzsKKyNlbHNlCisJCQlicmVhazsKKyNlbmRpZgorCisJCS8vTmV0d29yayBUeXBlCisJCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkJbWVtc2V0KCZpd2UsIDAsIHNpemVvZihpd2UpKTsKKwkJaXdlLmNtZCA9IFNJT0NHSVdNT0RFOworCQlpZiAocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uQnNzVHlwZSA9PSBOZGlzODAyXzExSUJTUykKKwkJeworCQkJaXdlLnUubW9kZSA9IElXX01PREVfQURIT0M7CisJCX0KKwkJZWxzZSBpZiAocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uQnNzVHlwZSA9PSBOZGlzODAyXzExSW5mcmFzdHJ1Y3R1cmUpCisJCXsKKwkJCWl3ZS51Lm1vZGUgPSBJV19NT0RFX0lORlJBOworCQl9CisJCWVsc2UKKwkJeworCQkJaXdlLnUubW9kZSA9IElXX01PREVfQVVUTzsKKwkJfQorCQlpd2UubGVuID0gSVdfRVZfVUlOVF9MRU47CisKKyAgICAgICAgcHJldmlvdXNfZXYgPSBjdXJyZW50X2V2OworCQljdXJyZW50X2V2ID0gSVdFX1NUUkVBTV9BRERfRVZFTlQoaW5mbywgY3VycmVudF9ldiwgZW5kX2J1ZiwgJml3ZSwgIElXX0VWX1VJTlRfTEVOKTsKKyAgICAgICAgaWYgKGN1cnJlbnRfZXYgPT0gcHJldmlvdXNfZXYpCisjaWYgV0lSRUxFU1NfRVhUID49IDE3CisgICAgICAgICAgICByZXR1cm4gLUUyQklHOworI2Vsc2UKKwkJCWJyZWFrOworI2VuZGlmCisKKwkJLy9DaGFubmVsIGFuZCBGcmVxdWVuY3kKKwkJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCQltZW1zZXQoJml3ZSwgMCwgc2l6ZW9mKGl3ZSkpOworCQlpd2UuY21kID0gU0lPQ0dJV0ZSRVE7CisJCWlmIChJTkZSQV9PTihwQWRhcHRlcikgfHwgQURIT0NfT04ocEFkYXB0ZXIpKQorCQkJaXdlLnUuZnJlcS5tID0gcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uQ2hhbm5lbDsKKwkJZWxzZQorCQkJaXdlLnUuZnJlcS5tID0gcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uQ2hhbm5lbDsKKwkJaXdlLnUuZnJlcS5lID0gMDsKKwkJaXdlLnUuZnJlcS5pID0gMDsKKworCQlwcmV2aW91c19ldiA9IGN1cnJlbnRfZXY7CisJCWN1cnJlbnRfZXYgPSBJV0VfU1RSRUFNX0FERF9FVkVOVChpbmZvLCBjdXJyZW50X2V2LGVuZF9idWYsICZpd2UsIElXX0VWX0ZSRVFfTEVOKTsKKyAgICAgICAgaWYgKGN1cnJlbnRfZXYgPT0gcHJldmlvdXNfZXYpCisjaWYgV0lSRUxFU1NfRVhUID49IDE3CisgICAgICAgICAgICByZXR1cm4gLUUyQklHOworI2Vsc2UKKwkJCWJyZWFrOworI2VuZGlmCisKKyAgICAgICAgLy9BZGQgcXVhbGl0eSBzdGF0aXN0aWNzCisgICAgICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgbWVtc2V0KCZpd2UsIDAsIHNpemVvZihpd2UpKTsKKyAgICAJaXdlLmNtZCA9IElXRVZRVUFMOworICAgIAlpd2UudS5xdWFsLmxldmVsID0gMDsKKyAgICAJaXdlLnUucXVhbC5ub2lzZSA9IDA7CisgICAgICAgIHNldF9xdWFsaXR5KHBBZGFwdGVyLCAmaXdlLnUucXVhbCwgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uUnNzaSk7CisgICAgCWN1cnJlbnRfZXYgPSBJV0VfU1RSRUFNX0FERF9FVkVOVChpbmZvLCBjdXJyZW50X2V2LCBlbmRfYnVmLCAmaXdlLCBJV19FVl9RVUFMX0xFTik7CisgICAgICAgIGlmIChjdXJyZW50X2V2ID09IHByZXZpb3VzX2V2KQorI2lmIFdJUkVMRVNTX0VYVCA+PSAxNworICAgICAgICAgICAgcmV0dXJuIC1FMkJJRzsKKyNlbHNlCisJCQlicmVhazsKKyNlbmRpZgorCisJCS8vRW5jeXB0aW9uIGtleQorCQkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJCW1lbXNldCgmaXdlLCAwLCBzaXplb2YoaXdlKSk7CisJCWl3ZS5jbWQgPSBTSU9DR0lXRU5DT0RFOworCQlpZiAoQ0FQX0lTX1BSSVZBQ1lfT04gKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkNhcGFiaWxpdHlJbmZvICkpCisJCQlpd2UudS5kYXRhLmZsYWdzID1JV19FTkNPREVfRU5BQkxFRCB8IElXX0VOQ09ERV9OT0tFWTsKKwkJZWxzZQorCQkJaXdlLnUuZGF0YS5mbGFncyA9IElXX0VOQ09ERV9ESVNBQkxFRDsKKworICAgICAgICBwcmV2aW91c19ldiA9IGN1cnJlbnRfZXY7CisgICAgICAgIGN1cnJlbnRfZXYgPSBJV0VfU1RSRUFNX0FERF9QT0lOVChpbmZvLCBjdXJyZW50X2V2LCBlbmRfYnVmLCZpd2UsIChjaGFyICopcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsoaXdlLnUuZGF0YS5mbGFncyAmIElXX0VOQ09ERV9JTkRFWCktMV0uS2V5KTsKKyAgICAgICAgaWYgKGN1cnJlbnRfZXYgPT0gcHJldmlvdXNfZXYpCisjaWYgV0lSRUxFU1NfRVhUID49IDE3CisgICAgICAgICAgICByZXR1cm4gLUUyQklHOworI2Vsc2UKKwkJCWJyZWFrOworI2VuZGlmCisKKwkJLy9CaXQgUmF0ZQorCQkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJCWlmIChwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5TdXBSYXRlTGVuKQorICAgICAgICB7CisgICAgICAgICAgICBVQ0hBUiB0bXBSYXRlID0gcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uU3VwUmF0ZVtwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5TdXBSYXRlTGVuLTFdOworCQkJbWVtc2V0KCZpd2UsIDAsIHNpemVvZihpd2UpKTsKKwkJCWl3ZS5jbWQgPSBTSU9DR0lXUkFURTsKKyAgICAJCWN1cnJlbnRfdmFsID0gY3VycmVudF9ldiArIElXX0VWX0xDUF9MRU47CisgICAgICAgICAgICBpZiAodG1wUmF0ZSA9PSAweDgyKQorICAgICAgICAgICAgICAgIGl3ZS51LmJpdHJhdGUudmFsdWUgPSAgMSAqIDEwMDAwMDA7CisgICAgICAgICAgICBlbHNlIGlmICh0bXBSYXRlID09IDB4ODQpCisgICAgICAgICAgICAgICAgaXdlLnUuYml0cmF0ZS52YWx1ZSA9ICAyICogMTAwMDAwMDsKKyAgICAgICAgICAgIGVsc2UgaWYgKHRtcFJhdGUgPT0gMHg4QikKKyAgICAgICAgICAgICAgICBpd2UudS5iaXRyYXRlLnZhbHVlID0gIDUuNSAqIDEwMDAwMDA7CisgICAgICAgICAgICBlbHNlIGlmICh0bXBSYXRlID09IDB4OTYpCisgICAgICAgICAgICAgICAgaXdlLnUuYml0cmF0ZS52YWx1ZSA9ICAxMSAqIDEwMDAwMDA7CisgICAgICAgICAgICBlbHNlCisgICAgCQkgICAgaXdlLnUuYml0cmF0ZS52YWx1ZSA9ICAodG1wUmF0ZS8yKSAqIDEwMDAwMDA7CisKKwkJCWl3ZS51LmJpdHJhdGUuZGlzYWJsZWQgPSAwOworCQkJY3VycmVudF92YWwgPSBJV0VfU1RSRUFNX0FERF9WQUxVRShpbmZvLCBjdXJyZW50X2V2LAorCQkJCWN1cnJlbnRfdmFsLCBlbmRfYnVmLCAmaXdlLAorICAgIAkJCUlXX0VWX1BBUkFNX0xFTik7CisKKyAgICAgICAgCWlmKChjdXJyZW50X3ZhbC1jdXJyZW50X2V2KT5JV19FVl9MQ1BfTEVOKQorICAgICAgICAgICAgCWN1cnJlbnRfZXYgPSBjdXJyZW50X3ZhbDsKKyAgICAgICAgCWVsc2UKKyNpZiBXSVJFTEVTU19FWFQgPj0gMTcKKyAgICAgICAgICAgICAgICByZXR1cm4gLUUyQklHOworI2Vsc2UKKwkJCSAgICBicmVhazsKKyNlbmRpZgorICAgICAgICB9CisKKyNpZmRlZiBJV0VWR0VOSUUKKwkJLy9XUEEgSUUKKwkJaWYgKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLldwYUlFLklFTGVuID4gMCkKKwkJeworCQkJbWVtc2V0KCZpd2UsIDAsIHNpemVvZihpd2UpKTsKKwkJCW1lbXNldCgmY3VzdG9tWzBdLCAwLCBNQVhfQ1VTVE9NX0xFTik7CisJCQltZW1jcHkoY3VzdG9tLCAmKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLldwYUlFLklFWzBdKSwKKwkJCQkJCSAgIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLldwYUlFLklFTGVuKTsKKwkJCWl3ZS5jbWQgPSBJV0VWR0VOSUU7CisJCQlpd2UudS5kYXRhLmxlbmd0aCA9IHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLldwYUlFLklFTGVuOworCQkJY3VycmVudF9ldiA9IElXRV9TVFJFQU1fQUREX1BPSU5UKGluZm8sIGN1cnJlbnRfZXYsIGVuZF9idWYsICZpd2UsIGN1c3RvbSk7CisJCQlpZiAoY3VycmVudF9ldiA9PSBwcmV2aW91c19ldikKKyNpZiBXSVJFTEVTU19FWFQgPj0gMTcKKyAgICAgICAgICAgICAgICByZXR1cm4gLUUyQklHOworI2Vsc2UKKwkJCSAgICBicmVhazsKKyNlbmRpZgorCQl9CisKKwkJLy9XUEEyIElFCisgICAgICAgIGlmIChwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Sc25JRS5JRUxlbiA+IDApCisgICAgICAgIHsKKyAgICAgICAgCW1lbXNldCgmaXdlLCAwLCBzaXplb2YoaXdlKSk7CisJCQltZW1zZXQoJmN1c3RvbVswXSwgMCwgTUFYX0NVU1RPTV9MRU4pOworCQkJbWVtY3B5KGN1c3RvbSwgJihwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Sc25JRS5JRVswXSksCisJCQkJCQkgICBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Sc25JRS5JRUxlbik7CisJCQlpd2UuY21kID0gSVdFVkdFTklFOworCQkJaXdlLnUuZGF0YS5sZW5ndGggPSBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Sc25JRS5JRUxlbjsKKwkJCWN1cnJlbnRfZXYgPSBJV0VfU1RSRUFNX0FERF9QT0lOVChpbmZvLCBjdXJyZW50X2V2LCBlbmRfYnVmLCAmaXdlLCBjdXN0b20pOworCQkJaWYgKGN1cnJlbnRfZXYgPT0gcHJldmlvdXNfZXYpCisjaWYgV0lSRUxFU1NfRVhUID49IDE3CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FMkJJRzsKKyNlbHNlCisJCQkgICAgYnJlYWs7CisjZW5kaWYKKyAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgLy9XUEEgSUUKKwkJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICBpZiAocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uV3BhSUUuSUVMZW4gPiAwKQorICAgICAgICB7CisgICAgCQlOZGlzWmVyb01lbW9yeSgmaXdlLCBzaXplb2YoaXdlKSk7CisJCQltZW1zZXQoJmN1c3RvbVswXSwgMCwgTUFYX0NVU1RPTV9MRU4pOworICAgIAkJaXdlLmNtZCA9IElXRVZDVVNUT007CisgICAgICAgICAgICBpd2UudS5kYXRhLmxlbmd0aCA9IChwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5XcGFJRS5JRUxlbiAqIDIpICsgNzsKKyAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KGN1c3RvbSwgIndwYV9pZT0iLCA3KTsKKyAgICAgICAgICAgIGZvciAoaWR4ID0gMDsgaWR4IDwgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uV3BhSUUuSUVMZW47IGlkeCsrKQorICAgICAgICAgICAgICAgIHNwcmludGYoY3VzdG9tLCAiJXMlMDJ4IiwgY3VzdG9tLCBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5XcGFJRS5JRVtpZHhdKTsKKyAgICAgICAgICAgIHByZXZpb3VzX2V2ID0gY3VycmVudF9ldjsKKyAgICAJCWN1cnJlbnRfZXYgPSBJV0VfU1RSRUFNX0FERF9QT0lOVChpbmZvLCBjdXJyZW50X2V2LCBlbmRfYnVmLCAmaXdlLCAgY3VzdG9tKTsKKyAgICAgICAgICAgIGlmIChjdXJyZW50X2V2ID09IHByZXZpb3VzX2V2KQorI2lmIFdJUkVMRVNTX0VYVCA+PSAxNworICAgICAgICAgICAgICAgIHJldHVybiAtRTJCSUc7CisjZWxzZQorCQkJICAgIGJyZWFrOworI2VuZGlmCisgICAgICAgIH0KKworICAgICAgICAvL1dQQTIgSUUKKyAgICAgICAgaWYgKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlJzbklFLklFTGVuID4gMCkKKyAgICAgICAgeworICAgIAkJTmRpc1plcm9NZW1vcnkoJml3ZSwgc2l6ZW9mKGl3ZSkpOworCQkJbWVtc2V0KCZjdXN0b21bMF0sIDAsIE1BWF9DVVNUT01fTEVOKTsKKyAgICAJCWl3ZS5jbWQgPSBJV0VWQ1VTVE9NOworICAgICAgICAgICAgaXdlLnUuZGF0YS5sZW5ndGggPSAocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uUnNuSUUuSUVMZW4gKiAyKSArIDc7CisgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShjdXN0b20sICJyc25faWU9IiwgNyk7CisJCQlmb3IgKGlkeCA9IDA7IGlkeCA8IHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlJzbklFLklFTGVuOyBpZHgrKykKKyAgICAgICAgICAgICAgICBzcHJpbnRmKGN1c3RvbSwgIiVzJTAyeCIsIGN1c3RvbSwgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uUnNuSUUuSUVbaWR4XSk7CisgICAgICAgICAgICBwcmV2aW91c19ldiA9IGN1cnJlbnRfZXY7CisgICAgCQljdXJyZW50X2V2ID0gSVdFX1NUUkVBTV9BRERfUE9JTlQoaW5mbywgY3VycmVudF9ldiwgZW5kX2J1ZiwgJml3ZSwgIGN1c3RvbSk7CisgICAgICAgICAgICBpZiAoY3VycmVudF9ldiA9PSBwcmV2aW91c19ldikKKyNpZiBXSVJFTEVTU19FWFQgPj0gMTcKKyAgICAgICAgICAgICAgICByZXR1cm4gLUUyQklHOworI2Vsc2UKKwkJCSAgICBicmVhazsKKyNlbmRpZgorICAgICAgICB9CisjZW5kaWYgLy8gSVdFVkdFTklFIC8vCisJfQorCisJZGF0YS0+bGVuZ3RoID0gY3VycmVudF9ldiAtIGV4dHJhOworICAgIHBBZGFwdGVyLT5TdGFDZmcuYlNjYW5SZXFJc0Zyb21XZWJVSSA9IEZBTFNFOworCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SICwoIj09PT5ydF9pb2N0bF9naXdzY2FuLiAlZCglZCkgQlNTIHJldHVybmVkLCBkYXRhLT5sZW5ndGggPSAlZFxuIixpICwgcEFkYXB0ZXItPlNjYW5UYWIuQnNzTnIsIGRhdGEtPmxlbmd0aCkpOworCXJldHVybiAwOworfQorI2VuZGlmCisKK2ludCBydF9pb2N0bF9zaXdlc3NpZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgc3RydWN0IGl3X3BvaW50ICpkYXRhLCBjaGFyICplc3NpZCkKK3sKKwlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gZGV2LT5tbF9wcml2OworCisJLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KKyAgICBpZighUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCisgICAgeworICAgICAgIAlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisgICAgICAgCXJldHVybiAtRU5FVERPV047CisgICAgfQorCisJaWYgKGRhdGEtPmZsYWdzKQorCXsKKwkJUENIQVIJcFNzaWRTdHJpbmcgPSBOVUxMOworCisJCS8vIEluY2x1ZGVzIG51bGwgY2hhcmFjdGVyLgorCQlpZiAoZGF0YS0+bGVuZ3RoID4gKElXX0VTU0lEX01BWF9TSVpFICsgMSkpCisJCQlyZXR1cm4gLUUyQklHOworCisJCXBTc2lkU3RyaW5nID0gKENIQVIgKikga21hbGxvYyhNQVhfTEVOX09GX1NTSUQrMSwgTUVNX0FMTE9DX0ZMQUcpOworCQlpZiAocFNzaWRTdHJpbmcpCisJCXsKKwkJCU5kaXNaZXJvTWVtb3J5KHBTc2lkU3RyaW5nLCBNQVhfTEVOX09GX1NTSUQrMSk7CisJCQlOZGlzTW92ZU1lbW9yeShwU3NpZFN0cmluZywgZXNzaWQsIGRhdGEtPmxlbmd0aCk7CisJCQlpZiAoU2V0X1NTSURfUHJvYyhwQWRhcHRlciwgcFNzaWRTdHJpbmcpID09IEZBTFNFKQorCQkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWVsc2UKKwkJCXJldHVybiAtRU5PTUVNOworCX0KKwllbHNlCisJeworCQkvLyBBTlkgc3NpZAorCQlpZiAoU2V0X1NTSURfUHJvYyhwQWRhcHRlciwgIiIpID09IEZBTFNFKQorCQkJcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCXJldHVybiAwOworfQorCitpbnQgcnRfaW9jdGxfZ2l3ZXNzaWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJIHN0cnVjdCBpd19wb2ludCAqZGF0YSwgY2hhciAqZXNzaWQpCit7CisJUFJUTVBfQURBUFRFUiAJcEFkYXB0ZXIgPSBOVUxMOworCVZJUlRVQUxfQURBUFRFUiAqcFZpcnR1YWxBZCA9IE5VTEw7CisKKwlpZiAoZGV2LT5wcml2X2ZsYWdzID09IElOVF9NQUlOKQorCXsKKwkJcEFkYXB0ZXIgPSBkZXYtPm1sX3ByaXY7CisJfQorCWVsc2UKKwl7CisJCXBWaXJ0dWFsQWQgPSBkZXYtPm1sX3ByaXY7CisJCWlmIChwVmlydHVhbEFkICYmIHBWaXJ0dWFsQWQtPlJ0bXBEZXYpCisJCQlwQWRhcHRlciA9IHBWaXJ0dWFsQWQtPlJ0bXBEZXYtPm1sX3ByaXY7CisJfQorCisJaWYgKHBBZGFwdGVyID09IE5VTEwpCisJeworCQkvKiBpZiAxc3Qgb3BlbiBmYWlsLCBwQWQgd2lsbCBiZSBmcmVlOworCQkgICBTbyB0aGUgbmV0X2Rldi0+bWxfcHJpdiB3aWxsIGJlIE5VTEwgaW4gMnJkIG9wZW4gKi8KKwkJcmV0dXJuIC1FTkVURE9XTjsKKwl9CisKKwlkYXRhLT5mbGFncyA9IDE7CisgICAgaWYgKE1PTklUT1JfT04ocEFkYXB0ZXIpKQorICAgIHsKKyAgICAgICAgZGF0YS0+bGVuZ3RoICA9IDA7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkYXB0ZXIsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoIk1lZGlhU3RhdGUgaXMgY29ubmVjdGVkXG4iKSk7CisJCWRhdGEtPmxlbmd0aCA9IHBBZGFwdGVyLT5Db21tb25DZmcuU3NpZExlbjsKKwkJbWVtY3B5KGVzc2lkLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLlNzaWQsIHBBZGFwdGVyLT5Db21tb25DZmcuU3NpZExlbik7CisJfQorI2lmZGVmIFJUMjg3MAorI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyAgICAvLyBBZGQgZm9yIFJUMjg3MAorICAgIGVsc2UgaWYgKHBBZGFwdGVyLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQICE9IFdQQV9TVVBQTElDQU5UX0RJU0FCTEUpCisgICAgeworICAgICAgICBkYXRhLT5sZW5ndGggPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLlNzaWRMZW47CisJCW1lbWNweShlc3NpZCwgcEFkYXB0ZXItPkNvbW1vbkNmZy5Tc2lkLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLlNzaWRMZW4pOworCX0KKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisjZW5kaWYgLy8gUlQyODcwIC8vCisJZWxzZQorCXsvL3RoZSBBTlkgc3NpZCB3YXMgc3BlY2lmaWVkCisJCWRhdGEtPmxlbmd0aCAgPSAwOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSAsKCJNZWRpYVN0YXRlIGlzIG5vdCBjb25uZWN0ZWQsIGVzc1xuIikpOworCX0KKworCXJldHVybiAwOworCit9CisKK2ludCBydF9pb2N0bF9zaXduaWNrbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgc3RydWN0IGl3X3BvaW50ICpkYXRhLCBjaGFyICpuaWNrbmFtZSkKK3sKKwlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gZGV2LT5tbF9wcml2OworCisgICAgLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KKyAgICBpZighUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCisgICAgeworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSAsKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisgICAgICAgIHJldHVybiAtRU5FVERPV047CisgICAgfQorCisJaWYgKGRhdGEtPmxlbmd0aCA+IElXX0VTU0lEX01BWF9TSVpFKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW1lbXNldChwQWRhcHRlci0+bmlja25hbWUsIDAsIElXX0VTU0lEX01BWF9TSVpFICsgMSk7CisJbWVtY3B5KHBBZGFwdGVyLT5uaWNrbmFtZSwgbmlja25hbWUsIGRhdGEtPmxlbmd0aCk7CisKKworCXJldHVybiAwOworfQorCitpbnQgcnRfaW9jdGxfZ2l3bmlja24oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJIHN0cnVjdCBpd19wb2ludCAqZGF0YSwgY2hhciAqbmlja25hbWUpCit7CisJUFJUTVBfQURBUFRFUiAJcEFkYXB0ZXIgPSBOVUxMOworCVZJUlRVQUxfQURBUFRFUiAqcFZpcnR1YWxBZCA9IE5VTEw7CisKKwlpZiAoZGV2LT5wcml2X2ZsYWdzID09IElOVF9NQUlOKQorCXsKKwkJcEFkYXB0ZXIgPSBkZXYtPm1sX3ByaXY7CisJfQorCWVsc2UKKwl7CisJCXBWaXJ0dWFsQWQgPSBkZXYtPm1sX3ByaXY7CisJCWlmIChwVmlydHVhbEFkICYmIHBWaXJ0dWFsQWQtPlJ0bXBEZXYpCisJCQlwQWRhcHRlciA9IHBWaXJ0dWFsQWQtPlJ0bXBEZXYtPm1sX3ByaXY7CisJfQorCisJaWYgKHBBZGFwdGVyID09IE5VTEwpCisJeworCQkvKiBpZiAxc3Qgb3BlbiBmYWlsLCBwQWQgd2lsbCBiZSBmcmVlOworCQkgICBTbyB0aGUgbmV0X2Rldi0+bWxfcHJpdiB3aWxsIGJlIE5VTEwgaW4gMnJkIG9wZW4gKi8KKwkJcmV0dXJuIC1FTkVURE9XTjsKKwl9CisKKwlpZiAoZGF0YS0+bGVuZ3RoID4gc3RybGVuKHBBZGFwdGVyLT5uaWNrbmFtZSkgKyAxKQorCQlkYXRhLT5sZW5ndGggPSBzdHJsZW4ocEFkYXB0ZXItPm5pY2tuYW1lKSArIDE7CisJaWYgKGRhdGEtPmxlbmd0aCA+IDApIHsKKwkJbWVtY3B5KG5pY2tuYW1lLCBwQWRhcHRlci0+bmlja25hbWUsIGRhdGEtPmxlbmd0aC0xKTsKKwkJbmlja25hbWVbZGF0YS0+bGVuZ3RoLTFdID0gJ1wwJzsKKwl9CisJcmV0dXJuIDA7Cit9CisKK2ludCBydF9pb2N0bF9zaXdydHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSAgICAgICBzdHJ1Y3QgaXdfcGFyYW0gKnJ0cywgY2hhciAqZXh0cmEpCit7CisJUFJUTVBfQURBUFRFUiBwQWRhcHRlciA9IGRldi0+bWxfcHJpdjsKKwl1MTYgdmFsOworCisgICAgLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KKyAgICBpZighUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCisgICAgeworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisgICAgICAgIHJldHVybiAtRU5FVERPV047CisgICAgfQorCisJaWYgKHJ0cy0+ZGlzYWJsZWQpCisJCXZhbCA9IE1BWF9SVFNfVEhSRVNIT0xEOworCWVsc2UgaWYgKHJ0cy0+dmFsdWUgPCAwIHx8IHJ0cy0+dmFsdWUgPiBNQVhfUlRTX1RIUkVTSE9MRCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJZWxzZSBpZiAocnRzLT52YWx1ZSA9PSAwKQorCSAgICB2YWwgPSBNQVhfUlRTX1RIUkVTSE9MRDsKKwllbHNlCisJCXZhbCA9IHJ0cy0+dmFsdWU7CisKKwlpZiAodmFsICE9IHBBZGFwdGVyLT5Db21tb25DZmcuUnRzVGhyZXNob2xkKQorCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLlJ0c1RocmVzaG9sZCA9IHZhbDsKKworCXJldHVybiAwOworfQorCitpbnQgcnRfaW9jdGxfZ2l3cnRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCSAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgICAgICAgc3RydWN0IGl3X3BhcmFtICpydHMsIGNoYXIgKmV4dHJhKQoreworCVBSVE1QX0FEQVBURVIgCXBBZGFwdGVyID0gTlVMTDsKKwlWSVJUVUFMX0FEQVBURVIgKnBWaXJ0dWFsQWQgPSBOVUxMOworCisJaWYgKGRldi0+cHJpdl9mbGFncyA9PSBJTlRfTUFJTikKKwl7CisJCXBBZGFwdGVyID0gZGV2LT5tbF9wcml2OworCX0KKwllbHNlCisJeworCQlwVmlydHVhbEFkID0gZGV2LT5tbF9wcml2OworCQlpZiAocFZpcnR1YWxBZCAmJiBwVmlydHVhbEFkLT5SdG1wRGV2KQorCQkJcEFkYXB0ZXIgPSBwVmlydHVhbEFkLT5SdG1wRGV2LT5tbF9wcml2OworCX0KKworCWlmIChwQWRhcHRlciA9PSBOVUxMKQorCXsKKwkJLyogaWYgMXN0IG9wZW4gZmFpbCwgcEFkIHdpbGwgYmUgZnJlZTsKKwkJICAgU28gdGhlIG5ldF9kZXYtPm1sX3ByaXYgd2lsbCBiZSBOVUxMIGluIDJyZCBvcGVuICovCisJCXJldHVybiAtRU5FVERPV047CisJfQorCisJLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KKwlpZighUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCisJeworICAJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKyAgICAJcmV0dXJuIC1FTkVURE9XTjsKKwl9CisKKwlydHMtPnZhbHVlID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5SdHNUaHJlc2hvbGQ7CisJcnRzLT5kaXNhYmxlZCA9IChydHMtPnZhbHVlID09IE1BWF9SVFNfVEhSRVNIT0xEKTsKKwlydHMtPmZpeGVkID0gMTsKKworCXJldHVybiAwOworfQorCitpbnQgcnRfaW9jdGxfc2l3ZnJhZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCXN0cnVjdCBpd19wYXJhbSAqZnJhZywgY2hhciAqZXh0cmEpCit7CisJUFJUTVBfQURBUFRFUiBwQWRhcHRlciA9IGRldi0+bWxfcHJpdjsKKwl1MTYgdmFsOworCisJLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KKyAgICAJaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQorICAgIAl7CisgICAgICAJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKyAgICAgICAgCXJldHVybiAtRU5FVERPV047CisgICAgCX0KKworCWlmIChmcmFnLT5kaXNhYmxlZCkKKwkJdmFsID0gTUFYX0ZSQUdfVEhSRVNIT0xEOworCWVsc2UgaWYgKGZyYWctPnZhbHVlID49IE1JTl9GUkFHX1RIUkVTSE9MRCB8fCBmcmFnLT52YWx1ZSA8PSBNQVhfRlJBR19USFJFU0hPTEQpCisgICAgICAgIHZhbCA9IF9fY3B1X3RvX2xlMTYoZnJhZy0+dmFsdWUgJiB+MHgxKTsgLyogZXZlbiBudW1iZXJzIG9ubHkgKi8KKwllbHNlIGlmIChmcmFnLT52YWx1ZSA9PSAwKQorCSAgICB2YWwgPSBNQVhfRlJBR19USFJFU0hPTEQ7CisJZWxzZQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXBBZGFwdGVyLT5Db21tb25DZmcuRnJhZ21lbnRUaHJlc2hvbGQgPSB2YWw7CisJcmV0dXJuIDA7Cit9CisKK2ludCBydF9pb2N0bF9naXdmcmFnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJc3RydWN0IGl3X3BhcmFtICpmcmFnLCBjaGFyICpleHRyYSkKK3sKKwlQUlRNUF9BREFQVEVSIAlwQWRhcHRlciA9IE5VTEw7CisJVklSVFVBTF9BREFQVEVSICpwVmlydHVhbEFkID0gTlVMTDsKKworCWlmIChkZXYtPnByaXZfZmxhZ3MgPT0gSU5UX01BSU4pCisJeworCQlwQWRhcHRlciA9IGRldi0+bWxfcHJpdjsKKwl9CisJZWxzZQorCXsKKwkJcFZpcnR1YWxBZCA9IGRldi0+bWxfcHJpdjsKKwkJaWYgKHBWaXJ0dWFsQWQgJiYgcFZpcnR1YWxBZC0+UnRtcERldikKKwkJCXBBZGFwdGVyID0gcFZpcnR1YWxBZC0+UnRtcERldi0+bWxfcHJpdjsKKwl9CisKKwlpZiAocEFkYXB0ZXIgPT0gTlVMTCkKKwl7CisJCS8qIGlmIDFzdCBvcGVuIGZhaWwsIHBBZCB3aWxsIGJlIGZyZWU7CisJCSAgIFNvIHRoZSBuZXRfZGV2LT5tbF9wcml2IHdpbGwgYmUgTlVMTCBpbiAycmQgb3BlbiAqLworCQlyZXR1cm4gLUVORVRET1dOOworCX0KKworCS8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCisJaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQorCXsKKyAgCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisgICAgCXJldHVybiAtRU5FVERPV047CisJfQorCisJZnJhZy0+dmFsdWUgPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLkZyYWdtZW50VGhyZXNob2xkOworCWZyYWctPmRpc2FibGVkID0gKGZyYWctPnZhbHVlID09IE1BWF9GUkFHX1RIUkVTSE9MRCk7CisJZnJhZy0+Zml4ZWQgPSAxOworCisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgTUFYX1dFUF9LRVlfU0laRSAxMworI2RlZmluZSBNSU5fV0VQX0tFWV9TSVpFIDUKK2ludCBydF9pb2N0bF9zaXdlbmNvZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgc3RydWN0IGl3X3BvaW50ICplcnEsIGNoYXIgKmV4dHJhKQoreworCVBSVE1QX0FEQVBURVIgcEFkYXB0ZXIgPSBkZXYtPm1sX3ByaXY7CisKKwkvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgorICAgIAlpZighUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCisgICAgCXsKKyAgICAgIAkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOworICAgICAgICAJcmV0dXJuIC1FTkVURE9XTjsKKyAgICAJfQorCisJaWYgKChlcnEtPmxlbmd0aCA9PSAwKSAmJgorICAgICAgICAoZXJxLT5mbGFncyAmIElXX0VOQ09ERV9ESVNBQkxFRCkpCisJeworCQlwQWRhcHRlci0+U3RhQ2ZnLlBhaXJDaXBoZXIgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CisJCXBBZGFwdGVyLT5TdGFDZmcuR3JvdXBDaXBoZXIgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CisJCXBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzID0gTmRpczgwMl8xMVdFUERpc2FibGVkOworICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLk9yaWdXZXBTdGF0dXMgPSBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1czsKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZU9wZW47CisgICAgICAgIGdvdG8gZG9uZTsKKwl9CisJZWxzZSBpZiAoKGVycS0+bGVuZ3RoID09IDApICYmCisgICAgICAgICAgICAgKGVycS0+ZmxhZ3MgJiBJV19FTkNPREVfUkVTVFJJQ1RFRCB8fCBlcnEtPmZsYWdzICYgSVdfRU5DT0RFX09QRU4pKQorCXsKKwkgICAgLy9wQWRhcHRlci0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQ7CisJCVNUQV9QT1JUX1NFQ1VSRUQocEFkYXB0ZXIpOworCQlwQWRhcHRlci0+U3RhQ2ZnLlBhaXJDaXBoZXIgPSBOZGlzODAyXzExV0VQRW5hYmxlZDsKKwkJcEFkYXB0ZXItPlN0YUNmZy5Hcm91cENpcGhlciA9IE5kaXM4MDJfMTFXRVBFbmFibGVkOworCQlwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cyA9IE5kaXM4MDJfMTFXRVBFbmFibGVkOworICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLk9yaWdXZXBTdGF0dXMgPSBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1czsKKwkJaWYgKGVycS0+ZmxhZ3MgJiBJV19FTkNPREVfUkVTVFJJQ1RFRCkKKwkJCXBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVTaGFyZWQ7CisgICAgCWVsc2UKKwkJCXBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVPcGVuOworICAgICAgICBnb3RvIGRvbmU7CisJfQorCisgICAgaWYgKGVycS0+bGVuZ3RoID4gMCkKKwl7CisJCWludCBrZXlJZHggPSAoZXJxLT5mbGFncyAmIElXX0VOQ09ERV9JTkRFWCkgLSAxOworCQkvKiBDaGVjayB0aGUgc2l6ZSBvZiB0aGUga2V5ICovCisJCWlmIChlcnEtPmxlbmd0aCA+IE1BWF9XRVBfS0VZX1NJWkUpIHsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCS8qIENoZWNrIGtleSBpbmRleCAqLworCQlpZiAoKGtleUlkeCA8IDApIHx8IChrZXlJZHggPj0gTlJfV0VQX0tFWVMpKQorICAgICAgICB7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSAsKCI9PT5ydF9pb2N0bF9zaXdlbmNvZGU6Oldyb25nIGtleUlkeD0lZCEgVXNpbmcgZGVmYXVsdCBrZXkgaW5zdGVhZCAoJWQpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleUlkeCwgcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWQpKTsKKworICAgICAgICAgICAgLy9Vc2luZyBkZWZhdWx0IGtleQorCQkJa2V5SWR4ID0gcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWQ7CisgICAgICAgIH0KKworICAgICAgICBOZGlzWmVyb01lbW9yeShwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uS2V5LCAgMTYpOworCisJCWlmIChlcnEtPmxlbmd0aCA9PSBNQVhfV0VQX0tFWV9TSVpFKQorICAgICAgICB7CisJCQlwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uS2V5TGVuID0gTUFYX1dFUF9LRVlfU0laRTsKKyAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5DaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OworCQl9CisJCWVsc2UgaWYgKGVycS0+bGVuZ3RoID09IE1JTl9XRVBfS0VZX1NJWkUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5LZXlMZW4gPSBNSU5fV0VQX0tFWV9TSVpFOworICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLkNpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKKwkJfQorCQllbHNlCisJCQkvKiBEaXNhYmxlIHRoZSBrZXkgKi8KKwkJCXBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5LZXlMZW4gPSAwOworCisJCS8qIENoZWNrIGlmIHRoZSBrZXkgaXMgbm90IG1hcmtlZCBhcyBpbnZhbGlkICovCisJCWlmKCEoZXJxLT5mbGFncyAmIElXX0VOQ09ERV9OT0tFWSkpIHsKKwkJCS8qIENvcHkgdGhlIGtleSBpbiB0aGUgZHJpdmVyICovCisJCQlOZGlzTW92ZU1lbW9yeShwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uS2V5LCBleHRyYSwgZXJxLT5sZW5ndGgpOworICAgICAgICB9CisJfQorICAgIGVsc2UKKwkJCXsKKwkJLyogRG8gd2Ugd2FudCB0byBqdXN0IHNldCB0aGUgdHJhbnNtaXQga2V5IGluZGV4ID8gKi8KKwkJaW50IGluZGV4ID0gKGVycS0+ZmxhZ3MgJiBJV19FTkNPREVfSU5ERVgpIC0gMTsKKwkJaWYgKChpbmRleCA+PSAwKSAmJiAoaW5kZXggPCA0KSkKKyAgICAgICAgeworCQkJcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWQgPSBpbmRleDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgZWxzZQorCQkJLyogRG9uJ3QgY29tcGxhaW4gaWYgb25seSBjaGFuZ2UgdGhlIG1vZGUgKi8KKwkJCWlmKCFlcnEtPmZsYWdzICYgSVdfRU5DT0RFX01PREUpIHsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0KKworZG9uZToKKyAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSAsKCI9PT5ydF9pb2N0bF9zaXdlbmNvZGU6OmVycS0+ZmxhZ3M9JXhcbiIsZXJxLT5mbGFncykpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoIj09PnJ0X2lvY3RsX3Npd2VuY29kZTo6QXV0aE1vZGU9JXhcbiIscEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSkpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoIj09PnJ0X2lvY3RsX3Npd2VuY29kZTo6RGVmYXVsdEtleUlkPSV4LCBLZXlMZW4gPSAlZFxuIixwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCAsIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWRdLktleUxlbikpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoIj09PnJ0X2lvY3RsX3Npd2VuY29kZTo6V2VwU3RhdHVzPSV4XG4iLHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzKSk7CisJcmV0dXJuIDA7Cit9CisKK2ludAorcnRfaW9jdGxfZ2l3ZW5jb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgIHN0cnVjdCBpd19wb2ludCAqZXJxLCBjaGFyICprZXkpCit7CisJaW50IGtpZDsKKwlQUlRNUF9BREFQVEVSIAlwQWRhcHRlciA9IE5VTEw7CisJVklSVFVBTF9BREFQVEVSICpwVmlydHVhbEFkID0gTlVMTDsKKworCWlmIChkZXYtPnByaXZfZmxhZ3MgPT0gSU5UX01BSU4pCisJeworCQlwQWRhcHRlciA9IGRldi0+bWxfcHJpdjsKKwl9CisJZWxzZQorCXsKKwkJcFZpcnR1YWxBZCA9IGRldi0+bWxfcHJpdjsKKwkJaWYgKHBWaXJ0dWFsQWQgJiYgcFZpcnR1YWxBZC0+UnRtcERldikKKwkJCXBBZGFwdGVyID0gcFZpcnR1YWxBZC0+UnRtcERldi0+bWxfcHJpdjsKKwl9CisKKwlpZiAocEFkYXB0ZXIgPT0gTlVMTCkKKwl7CisJCS8qIGlmIDFzdCBvcGVuIGZhaWwsIHBBZCB3aWxsIGJlIGZyZWU7CisJCSAgIFNvIHRoZSBuZXRfZGV2LT5tbF9wcml2IHdpbGwgYmUgTlVMTCBpbiAycmQgb3BlbiAqLworCQlyZXR1cm4gLUVORVRET1dOOworCX0KKworCS8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCisJaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQorCXsKKyAgCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisgICAgCXJldHVybiAtRU5FVERPV047CisJfQorCisJa2lkID0gZXJxLT5mbGFncyAmIElXX0VOQ09ERV9JTkRFWDsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT0+cnRfaW9jdGxfZ2l3ZW5jb2RlICVkXG4iLCBlcnEtPmZsYWdzICYgSVdfRU5DT0RFX0lOREVYKSk7CisKKwlpZiAocEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMVdFUERpc2FibGVkKQorCXsKKwkJZXJxLT5sZW5ndGggPSAwOworCQllcnEtPmZsYWdzID0gSVdfRU5DT0RFX0RJU0FCTEVEOworCX0KKwllbHNlIGlmICgoa2lkID4gMCkgJiYgKGtpZCA8PTQpKQorCXsKKwkJLy8gY29weSB3ZXAga2V5CisJCWVycS0+ZmxhZ3MgPSBraWQgOwkJCS8qIE5COiBiYXNlIDEgKi8KKwkJaWYgKGVycS0+bGVuZ3RoID4gcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtraWQtMV0uS2V5TGVuKQorCQkJZXJxLT5sZW5ndGggPSBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tpZC0xXS5LZXlMZW47CisJCW1lbWNweShrZXksIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2lkLTFdLktleSwgZXJxLT5sZW5ndGgpOworCQkvL2lmICgoa2lkID09IHBBZGFwdGVyLT5Qb3J0Q2ZnLkRlZmF1bHRLZXlJZCkpCisJCS8vZXJxLT5mbGFncyB8PSBJV19FTkNPREVfRU5BQkxFRDsJLyogWFhYICovCisJCWlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVNoYXJlZCkKKwkJCWVycS0+ZmxhZ3MgfD0gSVdfRU5DT0RFX1JFU1RSSUNURUQ7CQkvKiBYWFggKi8KKwkJZWxzZQorCQkJZXJxLT5mbGFncyB8PSBJV19FTkNPREVfT1BFTjsJCS8qIFhYWCAqLworCisJfQorCWVsc2UgaWYgKGtpZCA9PSAwKQorCXsKKwkJaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlU2hhcmVkKQorCQkJZXJxLT5mbGFncyB8PSBJV19FTkNPREVfUkVTVFJJQ1RFRDsJCS8qIFhYWCAqLworCQllbHNlCisJCQllcnEtPmZsYWdzIHw9IElXX0VOQ09ERV9PUEVOOwkJLyogWFhYICovCisJCWVycS0+bGVuZ3RoID0gcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uS2V5TGVuOworCQltZW1jcHkoa2V5LCBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW3BBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5LZXksIGVycS0+bGVuZ3RoKTsKKwkJLy8gY29weSBkZWZhdWx0IGtleSBJRAorCQlpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVTaGFyZWQpCisJCQllcnEtPmZsYWdzIHw9IElXX0VOQ09ERV9SRVNUUklDVEVEOwkJLyogWFhYICovCisJCWVsc2UKKwkJCWVycS0+ZmxhZ3MgfD0gSVdfRU5DT0RFX09QRU47CQkvKiBYWFggKi8KKwkJZXJxLT5mbGFncyA9IHBBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkICsgMTsJCQkvKiBOQjogYmFzZSAxICovCisJCWVycS0+ZmxhZ3MgfD0gSVdfRU5DT0RFX0VOQUJMRUQ7CS8qIFhYWCAqLworCX0KKworCXJldHVybiAwOworCit9CisKK3N0YXRpYyBpbnQKK3J0X2lvY3RsX3NldHBhcmFtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgdm9pZCAqdywgY2hhciAqZXh0cmEpCit7CisgICAgVklSVFVBTF9BREFQVEVSCSpwVmlydHVhbEFkID0gTlVMTDsKKwlQUlRNUF9BREFQVEVSIHBBZGFwdGVyOworCVBPU19DT09LSUUgcE9iajsKKwljaGFyICp0aGlzX2NoYXIgPSBleHRyYTsKKwljaGFyICp2YWx1ZTsKKwlpbnQgIFN0YXR1cz0wOworCisJaWYgKGRldi0+cHJpdl9mbGFncyA9PSBJTlRfTUFJTikKKwl7CisJCXBBZGFwdGVyID0gZGV2LT5tbF9wcml2OworCX0KKwllbHNlCisJeworCQlwVmlydHVhbEFkID0gZGV2LT5tbF9wcml2OworCQlwQWRhcHRlciA9IHBWaXJ0dWFsQWQtPlJ0bXBEZXYtPm1sX3ByaXY7CisJfQorCXBPYmogPSAoUE9TX0NPT0tJRSkgcEFkYXB0ZXItPk9TX0Nvb2tpZTsKKworCWlmIChwQWRhcHRlciA9PSBOVUxMKQorCXsKKwkJLyogaWYgMXN0IG9wZW4gZmFpbCwgcEFkIHdpbGwgYmUgZnJlZTsKKwkJICAgU28gdGhlIG5ldF9kZXYtPm1sX3ByaXYgd2lsbCBiZSBOVUxMIGluIDJyZCBvcGVuICovCisJCXJldHVybiAtRU5FVERPV047CisJfQorCisJeworCQlwT2JqLT5pb2N0bF9pZl90eXBlID0gSU5UX01BSU47CisgICAgICAgIHBPYmotPmlvY3RsX2lmID0gTUFJTl9NQlNTSUQ7CisJfQorCisJLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KKyAgICAJaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQorICAgIAl7CisgICAgICAJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKwkJCXJldHVybiAtRU5FVERPV047CisgICAgCX0KKworCWlmICghKnRoaXNfY2hhcikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoKHZhbHVlID0gcnRzdHJjaHIodGhpc19jaGFyLCAnPScpKSAhPSBOVUxMKQorCSAgICAqdmFsdWUrKyA9IDA7CisKKwlpZiAoIXZhbHVlKQorCSAgICByZXR1cm4gLUVJTlZBTDsKKworCS8vIHJlamVjdCBzZXR0aW5nIG5vdGhpbmcgYmVzaWRlcyBBTlkgc3NpZChzc2lkTGVuPTApCisgICAgaWYgKCEqdmFsdWUgJiYgKHN0cmNtcCh0aGlzX2NoYXIsICJTU0lEIikgIT0gMCkpCisgICAgICAgIHJldHVybiAtRUlOVkFMOworCisJZm9yIChQUlRNUF9QUklWQVRFX1NFVF9QUk9DID0gUlRNUF9QUklWQVRFX1NVUFBPUlRfUFJPQzsgUFJUTVBfUFJJVkFURV9TRVRfUFJPQy0+bmFtZTsgUFJUTVBfUFJJVkFURV9TRVRfUFJPQysrKQorCXsKKwkgICAgaWYgKHN0cmNtcCh0aGlzX2NoYXIsIFBSVE1QX1BSSVZBVEVfU0VUX1BST0MtPm5hbWUpID09IDApCisJICAgIHsKKwkgICAgICAgIGlmKCFQUlRNUF9QUklWQVRFX1NFVF9QUk9DLT5zZXRfcHJvYyhwQWRhcHRlciwgdmFsdWUpKQorCSAgICAgICAgewkvL0ZBTFNFOlNldCBwcml2YXRlIGZhaWxlZCB0aGVuIHJldHVybiBJbnZhbGlkIGFyZ3VtZW50CisJCQkgICAgU3RhdHVzID0gLUVJTlZBTDsKKwkgICAgICAgIH0KKwkJICAgIGJyZWFrOwkvL0V4aXQgZm9yIGxvb3AuCisJICAgIH0KKwl9CisKKwlpZihQUlRNUF9QUklWQVRFX1NFVF9QUk9DLT5uYW1lID09IE5VTEwpCisJeyAgLy9Ob3QgZm91bmQgYXJndW1lbnQKKwkgICAgU3RhdHVzID0gLUVJTlZBTDsKKwkgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PnJ0X2lvY3RsX3NldHBhcmFtOjogKGl3cHJpdikgTm90IFN1cHBvcnQgU2V0IENvbW1hbmQgWyVzPSVzXVxuIiwgdGhpc19jaGFyLCB2YWx1ZSkpOworCX0KKworICAgIHJldHVybiBTdGF0dXM7Cit9CisKKworc3RhdGljIGludAorcnRfcHJpdmF0ZV9nZXRfc3RhdGlzdGljcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQlzdHJ1Y3QgaXdfcG9pbnQgKndycSwgY2hhciAqZXh0cmEpCit7CisJSU5UCQkJCVN0YXR1cyA9IDA7CisgICAgUFJUTVBfQURBUFRFUiAgIHBBZCA9IGRldi0+bWxfcHJpdjsKKworICAgIGlmIChleHRyYSA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgd3JxLT5sZW5ndGggPSAwOworICAgICAgICByZXR1cm4gLUVJTzsKKyAgICB9CisKKyAgICBtZW1zZXQoZXh0cmEsIDB4MDAsIElXX1BSSVZfU0laRV9NQVNLKTsKKyAgICBzcHJpbnRmKGV4dHJhLCAiXG5cbiIpOworCisjaWZkZWYgUkFMSU5LX0FURQorCWlmIChBVEVfT04ocEFkKSkKKwl7CisJICAgIHNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlR4IHN1Y2Nlc3MgICAgICAgICAgICAgICAgICAgICAgPSAlbGRcbiIsIChVTE9ORylwQWQtPmF0ZS5UeERvbmVDb3VudCk7CisJICAgIC8vc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiVHggc3VjY2VzcyB3aXRob3V0IHJldHJ5ICAgICAgICA9ICVsZFxuIiwgKFVMT05HKXBBZC0+YXRlLlR4RG9uZUNvdW50KTsKKwl9CisJZWxzZQorI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKwl7CisgICAgc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiVHggc3VjY2VzcyAgICAgICAgICAgICAgICAgICAgICA9ICVsZFxuIiwgKFVMT05HKXBBZC0+V2xhbkNvdW50ZXJzLlRyYW5zbWl0dGVkRnJhZ21lbnRDb3VudC5RdWFkUGFydCk7CisgICAgc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiVHggc3VjY2VzcyB3aXRob3V0IHJldHJ5ICAgICAgICA9ICVsZFxuIiwgKFVMT05HKXBBZC0+V2xhbkNvdW50ZXJzLlRyYW5zbWl0dGVkRnJhZ21lbnRDb3VudC5RdWFkUGFydCAtIChVTE9ORylwQWQtPldsYW5Db3VudGVycy5SZXRyeUNvdW50LlF1YWRQYXJ0KTsKKwl9CisgICAgc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiVHggc3VjY2VzcyBhZnRlciByZXRyeSAgICAgICAgICA9ICVsZFxuIiwgKFVMT05HKXBBZC0+V2xhbkNvdW50ZXJzLlJldHJ5Q291bnQuUXVhZFBhcnQpOworICAgIHNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlR4IGZhaWwgdG8gUmN2IEFDSyBhZnRlciByZXRyeSAgPSAlbGRcbiIsIChVTE9ORylwQWQtPldsYW5Db3VudGVycy5GYWlsZWRDb3VudC5RdWFkUGFydCk7CisgICAgc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiUlRTIFN1Y2Nlc3MgUmN2IENUUyAgICAgICAgICAgICA9ICVsZFxuIiwgKFVMT05HKXBBZC0+V2xhbkNvdW50ZXJzLlJUU1N1Y2Nlc3NDb3VudC5RdWFkUGFydCk7CisgICAgc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiUlRTIEZhaWwgUmN2IENUUyAgICAgICAgICAgICAgICA9ICVsZFxuIiwgKFVMT05HKXBBZC0+V2xhbkNvdW50ZXJzLlJUU0ZhaWx1cmVDb3VudC5RdWFkUGFydCk7CisKKyAgICBzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJSeCBzdWNjZXNzICAgICAgICAgICAgICAgICAgICAgID0gJWxkXG4iLCAoVUxPTkcpcEFkLT5XbGFuQ291bnRlcnMuUmVjZWl2ZWRGcmFnbWVudENvdW50LlF1YWRQYXJ0KTsKKyAgICBzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJSeCB3aXRoIENSQyAgICAgICAgICAgICAgICAgICAgID0gJWxkXG4iLCAoVUxPTkcpcEFkLT5XbGFuQ291bnRlcnMuRkNTRXJyb3JDb3VudC5RdWFkUGFydCk7CisgICAgc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiUnggZHJvcCBkdWUgdG8gb3V0IG9mIHJlc291cmNlICA9ICVsZFxuIiwgKFVMT05HKXBBZC0+Q291bnRlcnM4MDIzLlJ4Tm9CdWZmZXIpOworICAgIHNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlJ4IGR1cGxpY2F0ZSBmcmFtZSAgICAgICAgICAgICAgPSAlbGRcbiIsIChVTE9ORylwQWQtPldsYW5Db3VudGVycy5GcmFtZUR1cGxpY2F0ZUNvdW50LlF1YWRQYXJ0KTsKKworICAgIHNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIkZhbHNlIENDQSAob25lIHNlY29uZCkgICAgICAgICAgPSAlbGRcbiIsIChVTE9ORylwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY0ZhbHNlQ0NBQ250KTsKKyNpZmRlZiBSQUxJTktfQVRFCisJaWYgKEFURV9PTihwQWQpKQorCXsKKwkJaWYgKHBBZC0+YXRlLlJ4QW50ZW5uYVNlbCA9PSAwKQorCQl7CisgICAgCQlzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJSU1NJLUEgICAgICAgICAgICAgICAgICAgICAgICAgID0gJWxkXG4iLCAoTE9ORykocEFkLT5hdGUuTGFzdFJzc2kwIC0gcEFkLT5CYnBSc3NpVG9EYm1EZWx0YSkpOworCQkJc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiUlNTSS1CIChpZiBhdmFpbGFibGUpICAgICAgICAgICA9ICVsZFxuIiwgKExPTkcpKHBBZC0+YXRlLkxhc3RSc3NpMSAtIHBBZC0+QmJwUnNzaVRvRGJtRGVsdGEpKTsKKwkJCXNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlJTU0ktQyAoaWYgYXZhaWxhYmxlKSAgICAgICAgICAgPSAlbGRcblxuIiwgKExPTkcpKHBBZC0+YXRlLkxhc3RSc3NpMiAtIHBBZC0+QmJwUnNzaVRvRGJtRGVsdGEpKTsKKwkJfQorCQllbHNlCisJCXsKKyAgICAJCXNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlJTU0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAlbGRcbiIsIChMT05HKShwQWQtPmF0ZS5MYXN0UnNzaTAgLSBwQWQtPkJicFJzc2lUb0RibURlbHRhKSk7CisJCX0KKwl9CisJZWxzZQorI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKwl7CisgICAgCXNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlJTU0ktQSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAlbGRcbiIsIChMT05HKShwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMCAtIHBBZC0+QmJwUnNzaVRvRGJtRGVsdGEpKTsKKyAgICAgICAgc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiUlNTSS1CIChpZiBhdmFpbGFibGUpICAgICAgICAgICA9ICVsZFxuIiwgKExPTkcpKHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kxIC0gcEFkLT5CYnBSc3NpVG9EYm1EZWx0YSkpOworICAgICAgICBzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJSU1NJLUMgKGlmIGF2YWlsYWJsZSkgICAgICAgICAgID0gJWxkXG5cbiIsIChMT05HKShwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMiAtIHBBZC0+QmJwUnNzaVRvRGJtRGVsdGEpKTsKKwl9CisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgIHNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIldwYVN1cHBsaWNhbnRVUCAgICAgICAgICAgICAgICAgPSAlZFxuXG4iLCBwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVApOworI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKworCisgICAgd3JxLT5sZW5ndGggPSBzdHJsZW4oZXh0cmEpICsgMTsgLy8gMTogc2l6ZSBvZiAnXDAnCisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPD09IHJ0X3ByaXZhdGVfZ2V0X3N0YXRpc3RpY3MsIHdycS0+bGVuZ3RoID0gJWRcbiIsIHdycS0+bGVuZ3RoKSk7CisKKyAgICByZXR1cm4gU3RhdHVzOworfQorCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCit2b2lkCWdldEJhSW5mbygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlwT3V0QnVmKQoreworCUlOVCBpLCBqOworCUJBX09SSV9FTlRSWSAqcE9yaUJBRW50cnk7CisJQkFfUkVDX0VOVFJZICpwUmVjQkFFbnRyeTsKKworCWZvciAoaT0wOyBpPE1BWF9MRU5fT0ZfTUFDX1RBQkxFOyBpKyspCisJeworCQlQTUFDX1RBQkxFX0VOVFJZIHBFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W2ldOworCQlpZiAoKChwRW50cnktPlZhbGlkQXNDTEkgfHwgcEVudHJ5LT5WYWxpZEFzQXBDbGkpICYmIChwRW50cnktPlNzdCA9PSBTU1RfQVNTT0MpKQorCQkJfHwgKHBFbnRyeS0+VmFsaWRBc1dEUykgfHwgKHBFbnRyeS0+VmFsaWRBc01lc2gpKQorCQl7CisJCQlzcHJpbnRmKHBPdXRCdWYsICIlc1xuJTAyWDolMDJYOiUwMlg6JTAyWDolMDJYOiUwMlggKEFpZCA9ICVkKSAoQVApIC1cbiIsCisgICAgICAgICAgICAgICAgcE91dEJ1ZiwKKwkJCQlwRW50cnktPkFkZHJbMF0sIHBFbnRyeS0+QWRkclsxXSwgcEVudHJ5LT5BZGRyWzJdLAorCQkJCXBFbnRyeS0+QWRkclszXSwgcEVudHJ5LT5BZGRyWzRdLCBwRW50cnktPkFkZHJbNV0sIHBFbnRyeS0+QWlkKTsKKworCQkJc3ByaW50ZihwT3V0QnVmLCAiJXNbUmVjaXBpZW50XVxuIiwgcE91dEJ1Zik7CisJCQlmb3IgKGo9MDsgaiA8IE5VTV9PRl9USUQ7IGorKykKKwkJCXsKKwkJCQlpZiAocEVudHJ5LT5CQVJlY1djaWRBcnJheVtqXSAhPSAwKQorCQkJCXsKKwkJCQkJcFJlY0JBRW50cnkgPSZwQWQtPkJBVGFibGUuQkFSZWNFbnRyeVtwRW50cnktPkJBUmVjV2NpZEFycmF5W2pdXTsKKwkJCQkJc3ByaW50ZihwT3V0QnVmLCAiJXNUSUQ9JWQsIEJBV2luU2l6ZT0lZCwgTGFzdEluZFNlcT0lZCwgUmVvcmRlcmluZ1BrdHM9JWRcbiIsIHBPdXRCdWYsIGosIHBSZWNCQUVudHJ5LT5CQVdpblNpemUsIHBSZWNCQUVudHJ5LT5MYXN0SW5kU2VxLCBwUmVjQkFFbnRyeS0+bGlzdC5xbGVuKTsKKwkJCQl9CisJCQl9CisJCQlzcHJpbnRmKHBPdXRCdWYsICIlc1xuIiwgcE91dEJ1Zik7CisKKwkJCXNwcmludGYocE91dEJ1ZiwgIiVzW09yaWdpbmF0b3JdXG4iLCBwT3V0QnVmKTsKKwkJCWZvciAoaj0wOyBqIDwgTlVNX09GX1RJRDsgaisrKQorCQkJeworCQkJCWlmIChwRW50cnktPkJBT3JpV2NpZEFycmF5W2pdICE9IDApCisJCQkJeworCQkJCQlwT3JpQkFFbnRyeSA9JnBBZC0+QkFUYWJsZS5CQU9yaUVudHJ5W3BFbnRyeS0+QkFPcmlXY2lkQXJyYXlbal1dOworCQkJCQlzcHJpbnRmKHBPdXRCdWYsICIlc1RJRD0lZCwgQkFXaW5TaXplPSVkLCBTdGFydFNlcT0lZCwgQ3VyVHhTZXE9JWRcbiIsIHBPdXRCdWYsIGosIHBPcmlCQUVudHJ5LT5CQVdpblNpemUsIHBPcmlCQUVudHJ5LT5TZXF1ZW5jZSwgcEVudHJ5LT5UeFNlcVtqXSk7CisJCQkJfQorCQkJfQorCQkJc3ByaW50ZihwT3V0QnVmLCAiJXNcblxuIiwgcE91dEJ1Zik7CisJCX0KKyAgICAgICAgaWYgKHN0cmxlbihwT3V0QnVmKSA+IChJV19QUklWX1NJWkVfTUFTSyAtIDMwKSkKKyAgICAgICAgICAgICAgICBicmVhazsKKwl9CisKKwlyZXR1cm47Cit9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKK3N0YXRpYyBpbnQKK3J0X3ByaXZhdGVfc2hvdyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQlzdHJ1Y3QgaXdfcG9pbnQgKndycSwgY2hhciAqZXh0cmEpCit7CisgICAgSU5UCQkJCVN0YXR1cyA9IDA7CisgICAgVklSVFVBTF9BREFQVEVSCSpwVmlydHVhbEFkID0gTlVMTDsKKyAgICBQUlRNUF9BREFQVEVSICAgcEFkOworCVBPU19DT09LSUUJCXBPYmo7CisgICAgdTMyICAgICAgICAgICAgIHN1YmNtZCA9IHdycS0+ZmxhZ3M7CisKKwlpZiAoZGV2LT5wcml2X2ZsYWdzID09IElOVF9NQUlOKQorCQlwQWQgPSBkZXYtPm1sX3ByaXY7CisJZWxzZQorCXsKKwkJcFZpcnR1YWxBZCA9IGRldi0+bWxfcHJpdjsKKwkJcEFkID0gcFZpcnR1YWxBZC0+UnRtcERldi0+bWxfcHJpdjsKKwl9CisJcE9iaiA9IChQT1NfQ09PS0lFKSBwQWQtPk9TX0Nvb2tpZTsKKworCWlmIChwQWQgPT0gTlVMTCkKKwl7CisJCS8qIGlmIDFzdCBvcGVuIGZhaWwsIHBBZCB3aWxsIGJlIGZyZWU7CisJCSAgIFNvIHRoZSBuZXRfZGV2LT5tbF9wcml2IHdpbGwgYmUgTlVMTCBpbiAycmQgb3BlbiAqLworCQlyZXR1cm4gLUVORVRET1dOOworCX0KKworICAgIGlmIChleHRyYSA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgd3JxLT5sZW5ndGggPSAwOworICAgICAgICByZXR1cm4gLUVJTzsKKyAgICB9CisgICAgbWVtc2V0KGV4dHJhLCAweDAwLCBJV19QUklWX1NJWkVfTUFTSyk7CisKKwl7CisJCXBPYmotPmlvY3RsX2lmX3R5cGUgPSBJTlRfTUFJTjsKKyAgICAgICAgcE9iai0+aW9jdGxfaWYgPSBNQUlOX01CU1NJRDsKKwl9CisKKyAgICBzd2l0Y2goc3ViY21kKQorICAgIHsKKworICAgICAgICBjYXNlIFNIT1dfQ09OTl9TVEFUVVM6CisgICAgICAgICAgICBpZiAoTU9OSVRPUl9PTihwQWQpKQorICAgICAgICAgICAgeworI2lmZGVmIERPVDExX05fU1VQUE9SVAorICAgICAgICAgICAgICAgIGlmIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID49IFBIWV8xMUFCR05fTUlYRUQgJiYKKyAgICAgICAgICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXKQorICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKGV4dHJhLCAiTW9uaXRvciBNb2RlKENlbnRyYWxDaGFubmVsICVkKVxuIiwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwpOworICAgICAgICAgICAgICAgIGVsc2UKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKyAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihleHRyYSwgIk1vbml0b3IgTW9kZShDaGFubmVsICVkKVxuIiwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID09IE5kaXNNZWRpYVN0YXRlQ29ubmVjdGVkKQorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkgICAgaWYgKElORlJBX09OKHBBZCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihleHRyYSwgIkNvbm5lY3RlZChBUDogJXNbJTAyWDolMDJYOiUwMlg6JTAyWDolMDJYOiUwMlhdKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLlNzaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5Cc3NpZFswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuQnNzaWRbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5Cc3NpZFszXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkWzRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuQnNzaWRbNV0pOworICAgICAgICAgICAgCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSAsKCJTc2lkPSVzICxTc2lkbGVuID0gJWRcbiIscEFkLT5Db21tb25DZmcuU3NpZCwgcEFkLT5Db21tb25DZmcuU3NpZExlbikpOworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoQURIT0NfT04ocEFkKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYoZXh0cmEsICJDb25uZWN0ZWRcbiIpOworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgIAllbHNlCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCSAgICBzcHJpbnRmKGV4dHJhLCAiRGlzY29ubmVjdGVkXG4iKTsKKyAgICAgICAgICAgIAkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UgLCgiQ29ublN0YXR1cyBpcyBub3QgY29ubmVjdGVkXG4iKSk7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgd3JxLT5sZW5ndGggPSBzdHJsZW4oZXh0cmEpICsgMTsgLy8gMTogc2l6ZSBvZiAnXDAnCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTSE9XX0RSVklFUl9WRVJJT046CisgICAgICAgICAgICBzcHJpbnRmKGV4dHJhLCAiRHJpdmVyIHZlcnNpb24tJXMsICVzICVzXG4iLCBTVEFfRFJJVkVSX1ZFUlNJT04sIF9fREFURV9fLCBfX1RJTUVfXyApOworICAgICAgICAgICAgd3JxLT5sZW5ndGggPSBzdHJsZW4oZXh0cmEpICsgMTsgLy8gMTogc2l6ZSBvZiAnXDAnCisgICAgICAgICAgICBicmVhazsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKyAgICAgICAgY2FzZSBTSE9XX0JBX0lORk86CisgICAgICAgICAgICBnZXRCYUluZm8ocEFkLCBleHRyYSk7CisgICAgICAgICAgICB3cnEtPmxlbmd0aCA9IHN0cmxlbihleHRyYSkgKyAxOyAvLyAxOiBzaXplIG9mICdcMCcKKyAgICAgICAgICAgIGJyZWFrOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQljYXNlIFNIT1dfREVTQ19JTkZPOgorCQkJeworCQkJCVNob3dfRGVzY0luZm9fUHJvYyhwQWQsIE5VTEwpOworCQkJCXdycS0+bGVuZ3RoID0gMDsgLy8gMTogc2l6ZSBvZiAnXDAnCisJCQl9CisJCQlicmVhazsKKyAgICAgICAgY2FzZSBSQUlPX09GRjoKKyAgICAgICAgICAgIGlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNwcmludGYoZXh0cmEsICJTY2FubmluZ1xuIik7CisgICAgICAgICAgICAgICAgd3JxLT5sZW5ndGggPSBzdHJsZW4oZXh0cmEpICsgMTsgLy8gMTogc2l6ZSBvZiAnXDAnCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwQWQtPlN0YUNmZy5iU3dSYWRpbyA9IEZBTFNFOworICAgICAgICAgICAgaWYgKHBBZC0+U3RhQ2ZnLmJSYWRpbyAhPSAocEFkLT5TdGFDZmcuYkh3UmFkaW8gJiYgcEFkLT5TdGFDZmcuYlN3UmFkaW8pKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBBZC0+U3RhQ2ZnLmJSYWRpbyA9IChwQWQtPlN0YUNmZy5iSHdSYWRpbyAmJiBwQWQtPlN0YUNmZy5iU3dSYWRpbyk7CisgICAgICAgICAgICAgICAgaWYgKHBBZC0+U3RhQ2ZnLmJSYWRpbyA9PSBGQUxTRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIE1sbWVSYWRpb09mZihwQWQpOworICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgZXh0cmEgaW5mb3JtYXRpb24KKwkJCQkJcEFkLT5FeHRyYUluZm8gPSBTV19SQURJT19PRkY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgc3ByaW50ZihleHRyYSwgIlJhZGlvIE9mZlxuIik7CisgICAgICAgICAgICB3cnEtPmxlbmd0aCA9IHN0cmxlbihleHRyYSkgKyAxOyAvLyAxOiBzaXplIG9mICdcMCcKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJBSU9fT046CisgICAgICAgICAgICBpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzcHJpbnRmKGV4dHJhLCAiU2Nhbm5pbmdcbiIpOworICAgICAgICAgICAgICAgIHdycS0+bGVuZ3RoID0gc3RybGVuKGV4dHJhKSArIDE7IC8vIDE6IHNpemUgb2YgJ1wwJworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcEFkLT5TdGFDZmcuYlN3UmFkaW8gPSBUUlVFOworICAgICAgICAgICAgLy9pZiAocEFkLT5TdGFDZmcuYlJhZGlvICE9IChwQWQtPlN0YUNmZy5iSHdSYWRpbyAmJiBwQWQtPlN0YUNmZy5iU3dSYWRpbykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcEFkLT5TdGFDZmcuYlJhZGlvID0gKHBBZC0+U3RhQ2ZnLmJId1JhZGlvICYmIHBBZC0+U3RhQ2ZnLmJTd1JhZGlvKTsKKyAgICAgICAgICAgICAgICBpZiAocEFkLT5TdGFDZmcuYlJhZGlvID09IFRSVUUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBNbG1lUmFkaW9PbihwQWQpOworICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgZXh0cmEgaW5mb3JtYXRpb24KKwkJCQkJcEFkLT5FeHRyYUluZm8gPSBFWFRSQV9JTkZPX0NMRUFSOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNwcmludGYoZXh0cmEsICJSYWRpbyBPblxuIik7CisgICAgICAgICAgICB3cnEtPmxlbmd0aCA9IHN0cmxlbihleHRyYSkgKyAxOyAvLyAxOiBzaXplIG9mICdcMCcKKyAgICAgICAgICAgIGJyZWFrOworCisKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwkJY2FzZSBTSE9XX0RMU19FTlRSWV9JTkZPOgorCQkJeworCQkJCVNldF9EbHNFbnRyeUluZm9fRGlzcGxheV9Qcm9jKHBBZCwgTlVMTCk7CisJCQkJd3JxLT5sZW5ndGggPSAwOyAvLyAxOiBzaXplIG9mICdcMCcKKwkJCX0KKwkJCWJyZWFrOworI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCisJCWNhc2UgU0hPV19DRkdfVkFMVUU6CisJCQl7CisJCQkJU3RhdHVzID0gUlRNUFNob3dDZmdWYWx1ZShwQWQsIHdycS0+cG9pbnRlciwgZXh0cmEpOworCQkJCWlmIChTdGF0dXMgPT0gMCkKKwkJCQkJd3JxLT5sZW5ndGggPSBzdHJsZW4oZXh0cmEpICsgMTsgLy8gMTogc2l6ZSBvZiAnXDAnCisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBTSE9XX0FESE9DX0VOVFJZX0lORk86CisJCQlTaG93X0FkaG9jX01hY1RhYmxlX1Byb2MocEFkLCBleHRyYSk7CisJCQl3cnEtPmxlbmd0aCA9IHN0cmxlbihleHRyYSkgKyAxOyAvLyAxOiBzaXplIG9mICdcMCcKKwkJCWJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXMgLSB1bmtub3cgc3ViY21kID0gJWRcbiIsIF9fZnVuY19fLCBzdWJjbWQpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBTdGF0dXM7Cit9CisKKyNpZmRlZiBTSU9DU0lXTUxNRQoraW50IHJ0X2lvY3RsX3Npd21sbWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LAorCQkJICAgY2hhciAqZXh0cmEpCit7CisJUFJUTVBfQURBUFRFUiAgIHBBZCA9IGRldi0+bWxfcHJpdjsKKwlzdHJ1Y3QgaXdfbWxtZSAqcE1sbWUgPSAoc3RydWN0IGl3X21sbWUgKil3cnF1LT5kYXRhLnBvaW50ZXI7CisJTUxNRV9RVUVVRV9FTEVNCQkJCU1zZ0VsZW07CisJTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNUCURpc0Fzc29jUmVxOworCU1MTUVfREVBVVRIX1JFUV9TVFJVQ1QgICAgICBEZUF1dGhSZXE7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT09PiAlc1xuIiwgX19mdW5jX18pKTsKKworCWlmIChwTWxtZSA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXN3aXRjaChwTWxtZS0+Y21kKQorCXsKKyNpZmRlZiBJV19NTE1FX0RFQVVUSAorCQljYXNlIElXX01MTUVfREVBVVRIOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PT4gJXMgLSBJV19NTE1FX0RFQVVUSFxuIiwgX19mdW5jX18pKTsKKwkJCUNPUFlfTUFDX0FERFIoRGVBdXRoUmVxLkFkZHIsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKwkJCURlQXV0aFJlcS5SZWFzb24gPSBwTWxtZS0+cmVhc29uX2NvZGU7CisJCQlNc2dFbGVtLk1zZ0xlbiA9IHNpemVvZihNTE1FX0RFQVVUSF9SRVFfU1RSVUNUKTsKKwkJCU5kaXNNb3ZlTWVtb3J5KE1zZ0VsZW0uTXNnLCAmRGVBdXRoUmVxLCBzaXplb2YoTUxNRV9ERUFVVEhfUkVRX1NUUlVDVCkpOworCQkJTWxtZURlYXV0aFJlcUFjdGlvbihwQWQsICZNc2dFbGVtKTsKKwkJCWlmIChJTkZSQV9PTihwQWQpKQorCQkJeworCQkJICAgIExpbmtEb3duKHBBZCwgRkFMU0UpOworCQkJICAgIHBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlID0gQVNTT0NfSURMRTsKKwkJCX0KKwkJCWJyZWFrOworI2VuZGlmIC8vIElXX01MTUVfREVBVVRIIC8vCisjaWZkZWYgSVdfTUxNRV9ESVNBU1NPQworCQljYXNlIElXX01MTUVfRElTQVNTT0M6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT09PiAlcyAtIElXX01MTUVfRElTQVNTT0NcbiIsIF9fZnVuY19fKSk7CisJCQlDT1BZX01BQ19BRERSKERpc0Fzc29jUmVxLkFkZHIsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKwkJCURpc0Fzc29jUmVxLlJlYXNvbiA9ICBwTWxtZS0+cmVhc29uX2NvZGU7CisKKwkJCU1zZ0VsZW0uTWFjaGluZSA9IEFTU09DX1NUQVRFX01BQ0hJTkU7CisJCQlNc2dFbGVtLk1zZ1R5cGUgPSBNVDJfTUxNRV9ESVNBU1NPQ19SRVE7CisJCQlNc2dFbGVtLk1zZ0xlbiA9IHNpemVvZihNTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1QpOworCQkJTmRpc01vdmVNZW1vcnkoTXNnRWxlbS5Nc2csICZEaXNBc3NvY1JlcSwgc2l6ZW9mKE1MTUVfRElTQVNTT0NfUkVRX1NUUlVDVCkpOworCisJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX09JRF9ESVNBU1NPQzsKKwkJCU1sbWVEaXNhc3NvY1JlcUFjdGlvbihwQWQsICZNc2dFbGVtKTsKKwkJCWJyZWFrOworI2VuZGlmIC8vIElXX01MTUVfRElTQVNTT0MgLy8KKwkJZGVmYXVsdDoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT0+ICVzIC0gVW5rbm93IENvbW1hbmRcbiIsIF9fZnVuY19fKSk7CisJCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvLyBTSU9DU0lXTUxNRSAvLworCisjaWYgV0lSRUxFU1NfRVhUID4gMTcKK2ludCBydF9pb2N0bF9zaXdhdXRoKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCVBSVE1QX0FEQVBURVIgICBwQWRhcHRlciA9IGRldi0+bWxfcHJpdjsKKwlzdHJ1Y3QgaXdfcGFyYW0gKnBhcmFtID0gJndycXUtPnBhcmFtOworCisgICAgLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KKwlpZighUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCisJeworICAJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKyAgICAJcmV0dXJuIC1FTkVURE9XTjsKKwl9CisJc3dpdGNoIChwYXJhbS0+ZmxhZ3MgJiBJV19BVVRIX0lOREVYKSB7CisgICAgCWNhc2UgSVdfQVVUSF9XUEFfVkVSU0lPTjoKKyAgICAgICAgICAgIGlmIChwYXJhbS0+dmFsdWUgPT0gSVdfQVVUSF9XUEFfVkVSU0lPTl9XUEEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSzsKKwkJCQlpZiAocEFkYXB0ZXItPlN0YUNmZy5Cc3NUeXBlID09IEJTU19BREhPQykKKwkJCQkJcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChwYXJhbS0+dmFsdWUgPT0gSVdfQVVUSF9XUEFfVkVSU0lPTl9XUEEyKQorICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLOworCisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6SVdfQVVUSF9XUEFfVkVSU0lPTiAtIHBhcmFtLT52YWx1ZSA9ICVkIVxuIiwgX19mdW5jX18sIHBhcmFtLT52YWx1ZSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgCWNhc2UgSVdfQVVUSF9DSVBIRVJfUEFJUldJU0U6CisgICAgICAgICAgICBpZiAocGFyYW0tPnZhbHVlID09IElXX0FVVEhfQ0lQSEVSX05PTkUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXMgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5PcmlnV2VwU3RhdHVzID0gcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXM7CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5QYWlyQ2lwaGVyID0gTmRpczgwMl8xMVdFUERpc2FibGVkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAocGFyYW0tPnZhbHVlID09IElXX0FVVEhfQ0lQSEVSX1dFUDQwIHx8CisgICAgICAgICAgICAgICAgICAgICBwYXJhbS0+dmFsdWUgPT0gSVdfQVVUSF9DSVBIRVJfV0VQMTA0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzID0gTmRpczgwMl8xMVdFUEVuYWJsZWQ7CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5PcmlnV2VwU3RhdHVzID0gcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXM7CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5QYWlyQ2lwaGVyID0gTmRpczgwMl8xMVdFUEVuYWJsZWQ7CisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuSUVFRTgwMjFYID0gRkFMU0U7CisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAocGFyYW0tPnZhbHVlID09IElXX0FVVEhfQ0lQSEVSX1RLSVApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXMgPSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkOworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuT3JpZ1dlcFN0YXR1cyA9IHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzOworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuUGFpckNpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChwYXJhbS0+dmFsdWUgPT0gSVdfQVVUSF9DSVBIRVJfQ0NNUCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cyA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQ7CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5PcmlnV2VwU3RhdHVzID0gcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXM7CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5QYWlyQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpJV19BVVRIX0NJUEhFUl9QQUlSV0lTRSAtIHBhcmFtLT52YWx1ZSA9ICVkIVxuIiwgX19mdW5jX18sIHBhcmFtLT52YWx1ZSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgCWNhc2UgSVdfQVVUSF9DSVBIRVJfR1JPVVA6CisgICAgICAgICAgICBpZiAocGFyYW0tPnZhbHVlID09IElXX0FVVEhfQ0lQSEVSX05PTkUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5Hcm91cENpcGhlciA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHBhcmFtLT52YWx1ZSA9PSBJV19BVVRIX0NJUEhFUl9XRVA0MCB8fAorICAgICAgICAgICAgICAgICAgICAgcGFyYW0tPnZhbHVlID09IElXX0FVVEhfQ0lQSEVSX1dFUDEwNCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID0gTmRpczgwMl8xMVdFUEVuYWJsZWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChwYXJhbS0+dmFsdWUgPT0gSVdfQVVUSF9DSVBIRVJfVEtJUCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHBhcmFtLT52YWx1ZSA9PSBJV19BVVRIX0NJUEhFUl9DQ01QKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuR3JvdXBDaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0FVVEhfQ0lQSEVSX0dST1VQIC0gcGFyYW0tPnZhbHVlID0gJWQhXG4iLCBfX2Z1bmNfXywgcGFyYW0tPnZhbHVlKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAJY2FzZSBJV19BVVRIX0tFWV9NR01UOgorICAgICAgICAgICAgaWYgKHBhcmFtLT52YWx1ZSA9PSBJV19BVVRIX0tFWV9NR01UXzgwMl8xWCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBOworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5JRUVFODAyMVggPSBGQUxTRTsKKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVXUEEyOworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5JRUVFODAyMVggPSBGQUxTRTsKKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisgICAgICAgICAgICAgICAgfQorI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIC8vIFdFUCAxeAorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLklFRUU4MDIxWCA9IFRSVUU7CisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAocGFyYW0tPnZhbHVlID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy9wQWRhcHRlci0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQ7CisJCQkJU1RBX1BPUlRfU0VDVVJFRChwQWRhcHRlcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6SVdfQVVUSF9LRVlfTUdNVCAtIHBhcmFtLT52YWx1ZSA9ICVkIVxuIiwgX19mdW5jX18sIHBhcmFtLT52YWx1ZSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgCWNhc2UgSVdfQVVUSF9SWF9VTkVOQ1JZUFRFRF9FQVBPTDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIAljYXNlIElXX0FVVEhfUFJJVkFDWV9JTlZPS0VEOgorICAgICAgICAgICAgLyppZiAocGFyYW0tPnZhbHVlID09IDApCisJCQl7CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZU9wZW47CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXMgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5PcmlnV2VwU3RhdHVzID0gcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXM7CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5QYWlyQ2lwaGVyID0gTmRpczgwMl8xMVdFUERpc2FibGVkOworICAgICAgICAJICAgIHBBZGFwdGVyLT5TdGFDZmcuR3JvdXBDaXBoZXIgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CisgICAgICAgICAgICB9Ki8KKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpJV19BVVRIX1BSSVZBQ1lfSU5WT0tFRCAtIHBhcmFtLT52YWx1ZSA9ICVkIVxuIiwgX19mdW5jX18sIHBhcmFtLT52YWx1ZSkpOworICAgIAkJYnJlYWs7CisgICAgCWNhc2UgSVdfQVVUSF9EUk9QX1VORU5DUllQVEVEOgorICAgICAgICAgICAgaWYgKHBhcmFtLT52YWx1ZSAhPSAwKQorICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQ7CisJCQllbHNlCisJCQl7CisgICAgICAgICAgICAgICAgLy9wQWRhcHRlci0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQ7CisJCQkJU1RBX1BPUlRfU0VDVVJFRChwQWRhcHRlcik7CisJCQl9CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6SVdfQVVUSF9XUEFfVkVSU0lPTiAtIHBhcmFtLT52YWx1ZSA9ICVkIVxuIiwgX19mdW5jX18sIHBhcmFtLT52YWx1ZSkpOworICAgIAkJYnJlYWs7CisgICAgCWNhc2UgSVdfQVVUSF84MDIxMV9BVVRIX0FMRzoKKwkJCWlmIChwYXJhbS0+dmFsdWUgJiBJV19BVVRIX0FMR19TSEFSRURfS0VZKQorICAgICAgICAgICAgeworCQkJCXBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVTaGFyZWQ7CisJCQl9CisgICAgICAgICAgICBlbHNlIGlmIChwYXJhbS0+dmFsdWUgJiBJV19BVVRIX0FMR19PUEVOX1NZU1RFTSkKKyAgICAgICAgICAgIHsKKwkJCQlwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlT3BlbjsKKwkJCX0KKyAgICAgICAgICAgIGVsc2UKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpJV19BVVRIXzgwMjExX0FVVEhfQUxHIC0gcGFyYW0tPnZhbHVlID0gJWQhXG4iLCBfX2Z1bmNfXywgcGFyYW0tPnZhbHVlKSk7CisJCQlicmVhazsKKyAgICAJY2FzZSBJV19BVVRIX1dQQV9FTkFCTEVEOgorICAgIAkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0FVVEhfV1BBX0VOQUJMRUQgLSBEcml2ZXIgc3VwcG9ydHMgV1BBIShwYXJhbS0+dmFsdWUgPSAlZClcbiIsIF9fZnVuY19fLCBwYXJhbS0+dmFsdWUpKTsKKyAgICAJCWJyZWFrOworICAgIAlkZWZhdWx0OgorICAgIAkJcmV0dXJuIC1FT1BOT1RTVVBQOworfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCBydF9pb2N0bF9naXdhdXRoKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIgPSBkZXYtPm1sX3ByaXY7CisJc3RydWN0IGl3X3BhcmFtICpwYXJhbSA9ICZ3cnF1LT5wYXJhbTsKKworICAgIC8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCisJaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQorICAgIHsKKyAgCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisgICAgCXJldHVybiAtRU5FVERPV047CisgICAgfQorCisJc3dpdGNoIChwYXJhbS0+ZmxhZ3MgJiBJV19BVVRIX0lOREVYKSB7CisJY2FzZSBJV19BVVRIX0RST1BfVU5FTkNSWVBURUQ6CisgICAgICAgIHBhcmFtLT52YWx1ZSA9IChwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExV0VQRGlzYWJsZWQpID8gMCA6IDE7CisJCWJyZWFrOworCisJY2FzZSBJV19BVVRIXzgwMjExX0FVVEhfQUxHOgorICAgICAgICBwYXJhbS0+dmFsdWUgPSAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVTaGFyZWQpID8gSVdfQVVUSF9BTEdfU0hBUkVEX0tFWSA6IElXX0FVVEhfQUxHX09QRU5fU1lTVEVNOworCQlicmVhazsKKworCWNhc2UgSVdfQVVUSF9XUEFfRU5BQkxFRDoKKwkJcGFyYW0tPnZhbHVlID0gKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKSA/IDEgOiAwOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwl9CisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgicnRfaW9jdGxfZ2l3YXV0aDo6cGFyYW0tPnZhbHVlID0gJWQhXG4iLCBwYXJhbS0+dmFsdWUpKTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBmblNldENpcGhlcktleSgKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBJTlQgICAgICAgICAgICAga2V5SWR4LAorICAgIElOICBVQ0hBUiAgICAgICAgICAgQ2lwaGVyQWxnLAorICAgIElOICBCT09MRUFOICAgICAgICAgYkdUSywKKyAgICBJTiAgc3RydWN0IGl3X2VuY29kZV9leHQgKmV4dCkKK3sKKyAgICBOZGlzWmVyb01lbW9yeSgmcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLCBzaXplb2YoQ0lQSEVSX0tFWSkpOworICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5LZXlMZW4gPSBMRU5fVEtJUF9FSzsKKyAgICBOZGlzTW92ZU1lbW9yeShwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uS2V5LCBleHQtPmtleSwgTEVOX1RLSVBfRUspOworICAgIE5kaXNNb3ZlTWVtb3J5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5UeE1pYywgZXh0LT5rZXkgKyBMRU5fVEtJUF9FSywgTEVOX1RLSVBfVFhNSUNLKTsKKyAgICBOZGlzTW92ZU1lbW9yeShwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uUnhNaWMsIGV4dC0+a2V5ICsgTEVOX1RLSVBfRUsgKyBMRU5fVEtJUF9UWE1JQ0ssIExFTl9US0lQX1JYTUlDSyk7CisgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLkNpcGhlckFsZyA9IENpcGhlckFsZzsKKworICAgIC8vIFVwZGF0ZSBncm91cCBrZXkgaW5mb3JtYXRpb24gdG8gQVNJQyBTaGFyZWQgS2V5IFRhYmxlCisJQXNpY0FkZFNoYXJlZEtleUVudHJ5KHBBZGFwdGVyLAorCQkJCQkJICBCU1MwLAorCQkJCQkJICBrZXlJZHgsCisJCQkJCQkgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5DaXBoZXJBbGcsCisJCQkJCQkgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5LZXksCisJCQkJCQkgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5UeE1pYywKKwkJCQkJCSAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLlJ4TWljKTsKKworICAgIGlmIChiR1RLKQorICAgICAgICAvLyBVcGRhdGUgQVNJQyBXQ0lEIGF0dHJpYnV0ZSB0YWJsZSBhbmQgSVZFSVYgdGFibGUKKyAgICAJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWRhcHRlciwKKyAgICAJCQkJCQkJICBCU1MwLAorICAgIAkJCQkJCQkgIGtleUlkeCwKKyAgICAJCQkJCQkJICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uQ2lwaGVyQWxnLAorICAgIAkJCQkJCQkgIE5VTEwpOworICAgIGVsc2UKKyAgICAgICAgLy8gVXBkYXRlIEFTSUMgV0NJRCBhdHRyaWJ1dGUgdGFibGUgYW5kIElWRUlWIHRhYmxlCisgICAgCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkocEFkYXB0ZXIsCisgICAgCQkJCQkJCSAgQlNTMCwKKyAgICAJCQkJCQkJICBrZXlJZHgsCisgICAgCQkJCQkJCSAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLkNpcGhlckFsZywKKyAgICAJCQkJCQkJICAmcEFkYXB0ZXItPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdKTsKK30KKworaW50IHJ0X2lvY3RsX3Npd2VuY29kZWV4dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsCisJCQkgICBjaGFyICpleHRyYSkKKwkJCXsKKyAgICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIgPSBkZXYtPm1sX3ByaXY7CisJc3RydWN0IGl3X3BvaW50ICplbmNvZGluZyA9ICZ3cnF1LT5lbmNvZGluZzsKKwlzdHJ1Y3QgaXdfZW5jb2RlX2V4dCAqZXh0ID0gKHN0cnVjdCBpd19lbmNvZGVfZXh0ICopZXh0cmE7CisgICAgaW50IGtleUlkeCwgYWxnID0gZXh0LT5hbGc7CisKKyAgICAvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgorCWlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKKwl7CisgIAkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOworICAgIAlyZXR1cm4gLUVORVRET1dOOworCX0KKworICAgIGlmIChlbmNvZGluZy0+ZmxhZ3MgJiBJV19FTkNPREVfRElTQUJMRUQpCisJeworICAgICAgICBrZXlJZHggPSAoZW5jb2RpbmctPmZsYWdzICYgSVdfRU5DT0RFX0lOREVYKSAtIDE7CisgICAgICAgIC8vIHNldCBCU1NJRCB3Y2lkIGVudHJ5IG9mIHRoZSBQYWlyLXdpc2UgS2V5IHRhYmxlIGFzIG5vLXNlY3VyaXR5IG1vZGUKKwkgICAgQXNpY1JlbW92ZVBhaXJ3aXNlS2V5RW50cnkocEFkYXB0ZXIsIEJTUzAsIEJTU0lEX1dDSUQpOworICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uS2V5TGVuID0gMDsKKwkJcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLkNpcGhlckFsZyA9IENJUEhFUl9OT05FOworCQlBc2ljUmVtb3ZlU2hhcmVkS2V5RW50cnkocEFkYXB0ZXIsIDAsIChVQ0hBUilrZXlJZHgpOworICAgICAgICBOZGlzWmVyb01lbW9yeSgmcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLCBzaXplb2YoQ0lQSEVSX0tFWSkpOworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6UmVtb3ZlIGFsbCBrZXlzIShlbmNvZGluZy0+ZmxhZ3MgPSAleClcbiIsIF9fZnVuY19fLCBlbmNvZGluZy0+ZmxhZ3MpKTsKKyAgICB9CisJCQkJCWVsc2UKKyAgICB7CisgICAgICAgIC8vIEdldCBLZXkgSW5kZXggYW5kIGNvbnZldCB0byBvdXIgb3duIGRlZmluZWQga2V5IGluZGV4CisgICAgCWtleUlkeCA9IChlbmNvZGluZy0+ZmxhZ3MgJiBJV19FTkNPREVfSU5ERVgpIC0gMTsKKyAgICAJaWYoKGtleUlkeCA8IDApIHx8IChrZXlJZHggPj0gTlJfV0VQX0tFWVMpKQorICAgIAkJcmV0dXJuIC1FSU5WQUw7CisKKyAgICAgICAgaWYgKGV4dC0+ZXh0X2ZsYWdzICYgSVdfRU5DT0RFX0VYVF9TRVRfVFhfS0VZKQorICAgICAgICB7CisgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCA9IGtleUlkeDsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpEZWZhdWx0S2V5SWQgPSAlZFxuIiwgX19mdW5jX18sIHBBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkKSk7CisgICAgICAgIH0KKworICAgICAgICBzd2l0Y2ggKGFsZykgeworICAgIAkJY2FzZSBJV19FTkNPREVfQUxHX05PTkU6CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0VOQ09ERV9BTEdfTk9ORVxuIiwgX19mdW5jX18pKTsKKyAgICAJCQlicmVhazsKKyAgICAJCWNhc2UgSVdfRU5DT0RFX0FMR19XRVA6CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0VOQ09ERV9BTEdfV0VQIC0gZXh0LT5rZXlfbGVuID0gJWQsIGtleUlkeCA9ICVkXG4iLCBfX2Z1bmNfXywgZXh0LT5rZXlfbGVuLCBrZXlJZHgpKTsKKyAgICAJCQlpZiAoZXh0LT5rZXlfbGVuID09IE1BWF9XRVBfS0VZX1NJWkUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAJCQlwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uS2V5TGVuID0gTUFYX1dFUF9LRVlfU0laRTsKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLkNpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7CisJCQkJfQorICAgICAgICAJCWVsc2UgaWYgKGV4dC0+a2V5X2xlbiA9PSBNSU5fV0VQX0tFWV9TSVpFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLktleUxlbiA9IE1JTl9XRVBfS0VZX1NJWkU7CisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5DaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7CisJCQkJfQorICAgICAgICAJCWVsc2UKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisKKyAgICAgICAgICAgICAgICBOZGlzWmVyb01lbW9yeShwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uS2V5LCAgMTYpOworCQkJICAgIE5kaXNNb3ZlTWVtb3J5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5LZXksIGV4dC0+a2V5LCBleHQtPmtleV9sZW4pOworCisJCQkJaWYgKHBBZGFwdGVyLT5TdGFDZmcuR3JvdXBDaXBoZXIgPT0gTmRpczgwMl8xMUdyb3VwV0VQNDBFbmFibGVkIHx8CisJCQkJCXBBZGFwdGVyLT5TdGFDZmcuR3JvdXBDaXBoZXIgPT0gTmRpczgwMl8xMUdyb3VwV0VQMTA0RW5hYmxlZCkKKwkJCQl7CisJCQkJCS8vIFNldCBHcm91cCBrZXkgbWF0ZXJpYWwgdG8gQXNpYworCQkJCQlBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkYXB0ZXIsIEJTUzAsIGtleUlkeCwgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLkNpcGhlckFsZywgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLktleSwgTlVMTCwgTlVMTCk7CisKKwkJCQkJLy8gVXBkYXRlIFdDSUQgYXR0cmlidXRlIHRhYmxlIGFuZCBJVkVJViB0YWJsZSBmb3IgdGhpcyBncm91cCBrZXkgdGFibGUKKwkJCQkJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWRhcHRlciwgQlNTMCwga2V5SWR4LCBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uQ2lwaGVyQWxnLCBOVUxMKTsKKworCQkJCQlTVEFfUE9SVF9TRUNVUkVEKHBBZGFwdGVyKTsKKworICAgIAkJCQkvLyBJbmRpY2F0ZSBDb25uZWN0ZWQgZm9yIEdVSQorICAgIAkJCQlwQWRhcHRlci0+SW5kaWNhdGVNZWRpYVN0YXRlID0gTmRpc01lZGlhU3RhdGVDb25uZWN0ZWQ7CisJCQkJfQorICAgIAkJCWJyZWFrOworICAgICAgICAgICAgY2FzZSBJV19FTkNPREVfQUxHX1RLSVA6CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0VOQ09ERV9BTEdfVEtJUCAtIGtleUlkeCA9ICVkLCBleHQtPmtleV9sZW4gPSAlZFxuIiwgX19mdW5jX18sIGtleUlkeCwgZXh0LT5rZXlfbGVuKSk7CisgICAgICAgICAgICAgICAgaWYgKGV4dC0+a2V5X2xlbiA9PSAzMikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHQtPmV4dF9mbGFncyAmIElXX0VOQ09ERV9FWFRfU0VUX1RYX0tFWSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZm5TZXRDaXBoZXJLZXkocEFkYXB0ZXIsIGtleUlkeCwgQ0lQSEVSX1RLSVAsIEZBTFNFLCBleHQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3BBZGFwdGVyLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVEFfUE9SVF9TRUNVUkVEKHBBZGFwdGVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKwkJfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChleHQtPmV4dF9mbGFncyAmIElXX0VOQ09ERV9FWFRfR1JPVVBfS0VZKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBmblNldENpcGhlcktleShwQWRhcHRlciwga2V5SWR4LCBDSVBIRVJfVEtJUCwgVFJVRSwgZXh0KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0IDgwMi4xeCBwb3J0IGNvbnRyb2wKKyAgICAgICAgICAgIAkgICAgICAgIC8vcEFkYXB0ZXItPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEOworICAgICAgICAgICAgCSAgICAgICAgU1RBX1BPUlRfU0VDVVJFRChwQWRhcHRlcik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSVdfRU5DT0RFX0FMR19DQ01QOgorICAgICAgICAgICAgICAgIGlmIChleHQtPmV4dF9mbGFncyAmIElXX0VOQ09ERV9FWFRfU0VUX1RYX0tFWSkKKwkJeworICAgICAgICAgICAgICAgICAgICBmblNldENpcGhlcktleShwQWRhcHRlciwga2V5SWR4LCBDSVBIRVJfQUVTLCBGQUxTRSwgZXh0KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikKKyAgICAgICAgICAgICAgICAgICAgCS8vcEFkYXB0ZXItPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEOworICAgICAgICAgICAgICAgICAgICAJU1RBX1BPUlRfU0VDVVJFRChwQWRhcHRlcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKGV4dC0+ZXh0X2ZsYWdzICYgSVdfRU5DT0RFX0VYVF9HUk9VUF9LRVkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmblNldENpcGhlcktleShwQWRhcHRlciwga2V5SWR4LCBDSVBIRVJfQUVTLCBUUlVFLCBleHQpOworCisgICAgICAgICAgICAgICAgICAgIC8vIHNldCA4MDIuMXggcG9ydCBjb250cm9sCisgICAgICAgIAkgICAgICAgIC8vcEFkYXB0ZXItPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEOworICAgICAgICAJICAgICAgICBTVEFfUE9SVF9TRUNVUkVEKHBBZGFwdGVyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgCQlkZWZhdWx0OgorICAgIAkJCXJldHVybiAtRUlOVkFMOworCQl9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK2ludAorcnRfaW9jdGxfZ2l3ZW5jb2RlZXh0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCVBSVE1QX0FEQVBURVIgcEFkID0gZGV2LT5tbF9wcml2OworCVBDSEFSIHBLZXkgPSBOVUxMOworCXN0cnVjdCBpd19wb2ludCAqZW5jb2RpbmcgPSAmd3JxdS0+ZW5jb2Rpbmc7CisJc3RydWN0IGl3X2VuY29kZV9leHQgKmV4dCA9IChzdHJ1Y3QgaXdfZW5jb2RlX2V4dCAqKWV4dHJhOworCWludCBpZHgsIG1heF9rZXlfbGVuOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UgLCgiPT09PiBydF9pb2N0bF9naXdlbmNvZGVleHRcbiIpKTsKKworCW1heF9rZXlfbGVuID0gZW5jb2RpbmctPmxlbmd0aCAtIHNpemVvZigqZXh0KTsKKwlpZiAobWF4X2tleV9sZW4gPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlkeCA9IGVuY29kaW5nLT5mbGFncyAmIElXX0VOQ09ERV9JTkRFWDsKKwlpZiAoaWR4KQorCXsKKwkJaWYgKGlkeCA8IDEgfHwgaWR4ID4gNCkKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZHgtLTsKKworCQlpZiAoKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKSB8fAorCQkJKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKSkKKwkJeworCQkJaWYgKGlkeCAhPSBwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQpCisJCQl7CisJCQkJZXh0LT5rZXlfbGVuID0gMDsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfQorCX0KKwllbHNlCisJCWlkeCA9IHBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZDsKKworCWVuY29kaW5nLT5mbGFncyA9IGlkeCArIDE7CisJbWVtc2V0KGV4dCwgMCwgc2l6ZW9mKCpleHQpKTsKKworCWV4dC0+a2V5X2xlbiA9IDA7CisJc3dpdGNoKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cykgeworCQljYXNlIE5kaXM4MDJfMTFXRVBEaXNhYmxlZDoKKwkJCWV4dC0+YWxnID0gSVdfRU5DT0RFX0FMR19OT05FOworCQkJZW5jb2RpbmctPmZsYWdzIHw9IElXX0VOQ09ERV9ESVNBQkxFRDsKKwkJCWJyZWFrOworCQljYXNlIE5kaXM4MDJfMTFXRVBFbmFibGVkOgorCQkJZXh0LT5hbGcgPSBJV19FTkNPREVfQUxHX1dFUDsKKwkJCWlmIChwQWQtPlNoYXJlZEtleVtCU1MwXVtpZHhdLktleUxlbiA+IG1heF9rZXlfbGVuKQorCQkJCXJldHVybiAtRTJCSUc7CisJCQllbHNlCisJCQl7CisJCQkJZXh0LT5rZXlfbGVuID0gcEFkLT5TaGFyZWRLZXlbQlNTMF1baWR4XS5LZXlMZW47CisJCQkJcEtleSA9ICYocEFkLT5TaGFyZWRLZXlbQlNTMF1baWR4XS5LZXlbMF0pOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZDoKKwkJY2FzZSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkOgorCQkJaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKQorCQkJCWV4dC0+YWxnID0gSVdfRU5DT0RFX0FMR19US0lQOworCQkJZWxzZQorCQkJCWV4dC0+YWxnID0gSVdfRU5DT0RFX0FMR19DQ01QOworCisJCQlpZiAobWF4X2tleV9sZW4gPCAzMikKKwkJCQlyZXR1cm4gLUUyQklHOworCQkJZWxzZQorCQkJeworCQkJCWV4dC0+a2V5X2xlbiA9IDMyOworCQkJCXBLZXkgPSAmcEFkLT5TdGFDZmcuUE1LWzBdOworCQkJfQorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoZXh0LT5rZXlfbGVuICYmIHBLZXkpCisJeworCQllbmNvZGluZy0+ZmxhZ3MgfD0gSVdfRU5DT0RFX0VOQUJMRUQ7CisJCW1lbWNweShleHQtPmtleSwgcEtleSwgZXh0LT5rZXlfbGVuKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIFNJT0NTSVdHRU5JRQoraW50IHJ0X2lvY3RsX3Npd2dlbmllKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCVBSVE1QX0FEQVBURVIgICBwQWQgPSBkZXYtPm1sX3ByaXY7CisKKwlpZiAod3JxdS0+ZGF0YS5sZW5ndGggPiBNQVhfTEVOX09GX1JTTklFIHx8CisJICAgICh3cnF1LT5kYXRhLmxlbmd0aCAmJiBleHRyYSA9PSBOVUxMKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAod3JxdS0+ZGF0YS5sZW5ndGgpCisJeworCQlwQWQtPlN0YUNmZy5SU05JRV9MZW4gPSB3cnF1LT5kYXRhLmxlbmd0aDsKKwkJTmRpc01vdmVNZW1vcnkoJnBBZC0+U3RhQ2ZnLlJTTl9JRVswXSwgZXh0cmEsIHBBZC0+U3RhQ2ZnLlJTTklFX0xlbik7CisJfQorCWVsc2UKKwl7CisJCXBBZC0+U3RhQ2ZnLlJTTklFX0xlbiA9IDA7CisJCU5kaXNaZXJvTWVtb3J5KCZwQWQtPlN0YUNmZy5SU05fSUVbMF0sIE1BWF9MRU5fT0ZfUlNOSUUpOworCX0KKworCXJldHVybiAwOworfQorI2VuZGlmIC8vIFNJT0NTSVdHRU5JRSAvLworCitpbnQgcnRfaW9jdGxfZ2l3Z2VuaWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCVBSVE1QX0FEQVBURVIgICBwQWQgPSBkZXYtPm1sX3ByaXY7CisKKwlpZiAoKHBBZC0+U3RhQ2ZnLlJTTklFX0xlbiA9PSAwKSB8fAorCQkocEFkLT5TdGFDZmcuQXV0aE1vZGUgPCBOZGlzODAyXzExQXV0aE1vZGVXUEEpKQorCXsKKwkJd3JxdS0+ZGF0YS5sZW5ndGggPSAwOworCQlyZXR1cm4gMDsKKwl9CisKKyNpZmRlZiBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorI2lmZGVmIFNJT0NTSVdHRU5JRQorCWlmIChwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgPT0gV1BBX1NVUFBMSUNBTlRfRU5BQkxFKQorCXsKKwlpZiAod3JxdS0+ZGF0YS5sZW5ndGggPCBwQWQtPlN0YUNmZy5SU05JRV9MZW4pCisJCXJldHVybiAtRTJCSUc7CisKKwl3cnF1LT5kYXRhLmxlbmd0aCA9IHBBZC0+U3RhQ2ZnLlJTTklFX0xlbjsKKwltZW1jcHkoZXh0cmEsICZwQWQtPlN0YUNmZy5SU05fSUVbMF0sIHBBZC0+U3RhQ2ZnLlJTTklFX0xlbik7CisJfQorCWVsc2UKKyNlbmRpZiAvLyBTSU9DU0lXR0VOSUUgLy8KKyNlbmRpZiAvLyBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCXsKKwkJVUNIQVIgUlNOSWUgPSBJRV9XUEE7CisKKwkJaWYgKHdycXUtPmRhdGEubGVuZ3RoIDwgKHBBZC0+U3RhQ2ZnLlJTTklFX0xlbiArIDIpKSAvLyBJRCwgTGVuCisJCQlyZXR1cm4gLUUyQklHOworCQl3cnF1LT5kYXRhLmxlbmd0aCA9IHBBZC0+U3RhQ2ZnLlJTTklFX0xlbiArIDI7CisKKwkJaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKSB8fAorICAgICAgICAgICAgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIpKQorCQkJUlNOSWUgPSBJRV9SU047CisKKwkJZXh0cmFbMF0gPSAoY2hhcilSU05JZTsKKwkJZXh0cmFbMV0gPSBwQWQtPlN0YUNmZy5SU05JRV9MZW47CisJCW1lbWNweShleHRyYSsyLCAmcEFkLT5TdGFDZmcuUlNOX0lFWzBdLCBwQWQtPlN0YUNmZy5SU05JRV9MZW4pOworCX0KKworCXJldHVybiAwOworfQorCitpbnQgcnRfaW9jdGxfc2l3cG1rc2Eoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LAorCQkJICAgY2hhciAqZXh0cmEpCit7CisJUFJUTVBfQURBUFRFUiAgIHBBZCA9IGRldi0+bWxfcHJpdjsKKwlzdHJ1Y3QgaXdfcG1rc2EgKnBQbWtzYSA9IChzdHJ1Y3QgaXdfcG1rc2EgKil3cnF1LT5kYXRhLnBvaW50ZXI7CisJSU5UCUNhY2hlZElkeCA9IDAsIGlkeCA9IDA7CisKKwlpZiAocFBta3NhID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UgLCgiPT09PiBydF9pb2N0bF9zaXdwbWtzYVxuIikpOworCXN3aXRjaChwUG1rc2EtPmNtZCkKKwl7CisJCWNhc2UgSVdfUE1LU0FfRkxVU0g6CisJCQlOZGlzWmVyb01lbW9yeShwQWQtPlN0YUNmZy5TYXZlZFBNSywgc2l6ZW9mKEJTU0lEX0lORk8pKlBNS0lEX05PKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoInJ0X2lvY3RsX3Npd3Bta3NhIC0gSVdfUE1LU0FfRkxVU0hcbiIpKTsKKwkJCWJyZWFrOworCQljYXNlIElXX1BNS1NBX1JFTU9WRToKKwkJCWZvciAoQ2FjaGVkSWR4ID0gMDsgQ2FjaGVkSWR4IDwgcEFkLT5TdGFDZmcuU2F2ZWRQTUtOdW07IENhY2hlZElkeCsrKQorCQkJeworCQkgICAgICAgIC8vIGNvbXBhcmUgdGhlIEJTU0lECisJCSAgICAgICAgaWYgKE5kaXNFcXVhbE1lbW9yeShwUG1rc2EtPmJzc2lkLnNhX2RhdGEsIHBBZC0+U3RhQ2ZnLlNhdmVkUE1LW0NhY2hlZElkeF0uQlNTSUQsIE1BQ19BRERSX0xFTikpCisJCSAgICAgICAgeworCQkgICAgICAgIAlOZGlzWmVyb01lbW9yeShwQWQtPlN0YUNmZy5TYXZlZFBNS1tDYWNoZWRJZHhdLkJTU0lELCBNQUNfQUREUl9MRU4pOworCQkJCQlOZGlzWmVyb01lbW9yeShwQWQtPlN0YUNmZy5TYXZlZFBNS1tDYWNoZWRJZHhdLlBNS0lELCAxNik7CisJCQkJCWZvciAoaWR4ID0gQ2FjaGVkSWR4OyBpZHggPCAocEFkLT5TdGFDZmcuU2F2ZWRQTUtOdW0gLSAxKTsgaWR4KyspCisJCQkJCXsKKwkJCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPlN0YUNmZy5TYXZlZFBNS1tpZHhdLkJTU0lEWzBdLCAmcEFkLT5TdGFDZmcuU2F2ZWRQTUtbaWR4KzFdLkJTU0lEWzBdLCBNQUNfQUREUl9MRU4pOworCQkJCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+U3RhQ2ZnLlNhdmVkUE1LW2lkeF0uUE1LSURbMF0sICZwQWQtPlN0YUNmZy5TYXZlZFBNS1tpZHgrMV0uUE1LSURbMF0sIDE2KTsKKwkJCQkJfQorCQkJCQlwQWQtPlN0YUNmZy5TYXZlZFBNS051bS0tOworCQkJICAgICAgICBicmVhazsKKwkJICAgICAgICB9CisJICAgICAgICB9CisKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoInJ0X2lvY3RsX3Npd3Bta3NhIC0gSVdfUE1LU0FfUkVNT1ZFXG4iKSk7CisJCQlicmVhazsKKwkJY2FzZSBJV19QTUtTQV9BREQ6CisJCQlmb3IgKENhY2hlZElkeCA9IDA7IENhY2hlZElkeCA8IHBBZC0+U3RhQ2ZnLlNhdmVkUE1LTnVtOyBDYWNoZWRJZHgrKykKKwkJCXsKKwkJICAgICAgICAvLyBjb21wYXJlIHRoZSBCU1NJRAorCQkgICAgICAgIGlmIChOZGlzRXF1YWxNZW1vcnkocFBta3NhLT5ic3NpZC5zYV9kYXRhLCBwQWQtPlN0YUNmZy5TYXZlZFBNS1tDYWNoZWRJZHhdLkJTU0lELCBNQUNfQUREUl9MRU4pKQorCQkJICAgICAgICBicmVhazsKKwkgICAgICAgIH0KKworCSAgICAgICAgLy8gRm91bmQsIHJlcGxhY2UgaXQKKwkgICAgICAgIGlmIChDYWNoZWRJZHggPCBQTUtJRF9OTykKKwkgICAgICAgIHsKKwkJICAgICAgICBEQkdQUklOVChSVF9ERUJVR19PRkYsICgiVXBkYXRlIFBNS0lELCBpZHggPSAlZFxuIiwgQ2FjaGVkSWR4KSk7CisJCSAgICAgICAgTmRpc01vdmVNZW1vcnkoJnBBZC0+U3RhQ2ZnLlNhdmVkUE1LW0NhY2hlZElkeF0uQlNTSURbMF0sIHBQbWtzYS0+YnNzaWQuc2FfZGF0YSwgTUFDX0FERFJfTEVOKTsKKwkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5TdGFDZmcuU2F2ZWRQTUtbQ2FjaGVkSWR4XS5QTUtJRFswXSwgcFBta3NhLT5wbWtpZCwgMTYpOworCQkgICAgICAgIHBBZC0+U3RhQ2ZnLlNhdmVkUE1LTnVtKys7CisJICAgICAgICB9CisJICAgICAgICAvLyBOb3QgZm91bmQsIHJlcGxhY2UgdGhlIGxhc3Qgb25lCisJICAgICAgICBlbHNlCisJICAgICAgICB7CisJCSAgICAgICAgLy8gUmFuZG9tbHkgcmVwbGFjZSBvbmUKKwkJICAgICAgICBDYWNoZWRJZHggPSAocFBta3NhLT5ic3NpZC5zYV9kYXRhWzVdICUgUE1LSURfTk8pOworCQkgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX09GRiwgKCJVcGRhdGUgUE1LSUQsIGlkeCA9ICVkXG4iLCBDYWNoZWRJZHgpKTsKKwkJICAgICAgICBOZGlzTW92ZU1lbW9yeSgmcEFkLT5TdGFDZmcuU2F2ZWRQTUtbQ2FjaGVkSWR4XS5CU1NJRFswXSwgcFBta3NhLT5ic3NpZC5zYV9kYXRhLCBNQUNfQUREUl9MRU4pOworCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPlN0YUNmZy5TYXZlZFBNS1tDYWNoZWRJZHhdLlBNS0lEWzBdLCBwUG1rc2EtPnBta2lkLCAxNik7CisJICAgICAgICB9CisKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoInJ0X2lvY3RsX3Npd3Bta3NhIC0gSVdfUE1LU0FfQUREXG4iKSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoInJ0X2lvY3RsX3Npd3Bta3NhIC0gVW5rbm93IENvbW1hbmQhIVxuIikpOworCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisjZW5kaWYgLy8gI2lmIFdJUkVMRVNTX0VYVCA+IDE3CisKKyNpZmRlZiBEQkcKK3N0YXRpYyBpbnQKK3J0X3ByaXZhdGVfaW9jdGxfYmJwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCXN0cnVjdCBpd19wb2ludCAqd3JxLCBjaGFyICpleHRyYSkKKwkJCXsKKwlDSEFSCQkJCSp0aGlzX2NoYXI7CisJQ0hBUgkJCQkqdmFsdWUgPSBOVUxMOworCVVDSEFSCQkJCXJlZ0JCUCA9IDA7CisvLwlDSEFSCQkJCWFyZ1syNTVdPXswfTsKKwlVSU5UMzIJCQkJYmJwSWQ7CisJVUlOVDMyCQkJCWJicFZhbHVlOworCUJPT0xFQU4JCQkJYklzUHJpbnRBbGxCQlAgPSBGQUxTRTsKKwlJTlQJCQkJCVN0YXR1cyA9IDA7CisgICAgUFJUTVBfQURBUFRFUiAgICAgICBwQWRhcHRlciA9IGRldi0+bWxfcHJpdjsKKworCisJbWVtc2V0KGV4dHJhLCAweDAwLCBJV19QUklWX1NJWkVfTUFTSyk7CisKKwlpZiAod3JxLT5sZW5ndGggPiAxKSAvL05vIHBhcmFtZXRlcnMuCisJCQkJeworCQlzcHJpbnRmKGV4dHJhLCAiXG4iKTsKKworCQkvL1BhcnNpbmcgUmVhZCBvciBXcml0ZQorCQl0aGlzX2NoYXIgPSB3cnEtPnBvaW50ZXI7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoInRoaXNfY2hhcj0lc1xuIiwgdGhpc19jaGFyKSk7CisJCWlmICghKnRoaXNfY2hhcikKKwkJCWdvdG8gbmV4dDsKKworCQlpZiAoKHZhbHVlID0gcnRzdHJjaHIodGhpc19jaGFyLCAnPScpKSAhPSBOVUxMKQorCQkJKnZhbHVlKysgPSAwOworCisJCWlmICghdmFsdWUgfHwgISp2YWx1ZSkKKwkJeyAvL1JlYWQKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoInRoaXNfY2hhcj0lcywgdmFsdWU9JXNcbiIsIHRoaXNfY2hhciwgdmFsdWUpKTsKKwkJCWlmIChzc2NhbmYodGhpc19jaGFyLCAiJWQiLCAmKGJicElkKSkgPT0gMSkKKwkJCXsKKwkJCQlpZiAoYmJwSWQgPD0gMTM2KQorCQkJCXsKKyNpZmRlZiBSQUxJTktfQVRFCisJCQkJCWlmIChBVEVfT04ocEFkYXB0ZXIpKQorCQkJCQl7CisJCQkJCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWRhcHRlciwgYmJwSWQsICZyZWdCQlApOworCQkJCQl9CisJCQkJCWVsc2UKKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisJCQkJCXsKKwkJCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZGFwdGVyLCBiYnBJZCwgJnJlZ0JCUCk7CisJCQkJCX0KKwkJCQkJc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiUiUwMmRbMHglMDJYXTolMDJYXG4iLCBiYnBJZCwgYmJwSWQqMiwgcmVnQkJQKTsKKyAgICAgICAgICAgICAgICAgICAgd3JxLT5sZW5ndGggPSBzdHJsZW4oZXh0cmEpICsgMTsgLy8gMTogc2l6ZSBvZiAnXDAnCisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIm1zZz0lc1xuIiwgZXh0cmEpKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsvL0ludmFsaWQgcGFyYW1ldGVzLCBzbyBkZWZhdWx0IHByaW50ayBhbGwgYmJwCisJCQkJCWJJc1ByaW50QWxsQkJQID0gVFJVRTsKKwkJCQkJZ290byBuZXh0OworCQkJCX0KKwkJCX0KKwkJCWVsc2UKKwkJCXsgLy9JbnZhbGlkIHBhcmFtZXRlcywgc28gZGVmYXVsdCBwcmludGsgYWxsIGJicAorCQkJCWJJc1ByaW50QWxsQkJQID0gVFJVRTsKKwkJCQlnb3RvIG5leHQ7CisJCQl9CisJCX0KKwkJZWxzZQorCQl7IC8vV3JpdGUKKwkJCWlmICgoc3NjYW5mKHRoaXNfY2hhciwgIiVkIiwgJihiYnBJZCkpID09IDEpICYmIChzc2NhbmYodmFsdWUsICIleCIsICYoYmJwVmFsdWUpKSA9PSAxKSkKKwkJCXsKKwkJCQlpZiAoYmJwSWQgPD0gMTM2KQorCQkJCXsKKyNpZmRlZiBSQUxJTktfQVRFCisJCQkJCWlmIChBVEVfT04ocEFkYXB0ZXIpKQorCQkJCQl7CisJCQkJCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkYXB0ZXIsIGJicElkLCBiYnBWYWx1ZSk7CisJCQkJCQkvL1JlYWQgaXQgYmFjayBmb3Igc2hvd2luZworCQkJCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkYXB0ZXIsIGJicElkLCAmcmVnQkJQKTsKKwkJCQkJfQorCQkJCQllbHNlCisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCQkJCQl7CisJCQkJCSAgICBSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZGFwdGVyLCBiYnBJZCwgYmJwVmFsdWUpOworICAgIAkJCQkJLy9SZWFkIGl0IGJhY2sgZm9yIHNob3dpbmcKKyAgICAJCQkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWRhcHRlciwgYmJwSWQsICZyZWdCQlApOworCQkJfQorCQkJCQlzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJSJTAyZFsweCUwMlhdOiUwMlhcbiIsIGJicElkLCBiYnBJZCoyLCByZWdCQlApOworICAgICAgICAgICAgICAgICAgICB3cnEtPmxlbmd0aCA9IHN0cmxlbihleHRyYSkgKyAxOyAvLyAxOiBzaXplIG9mICdcMCcKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgibXNnPSVzXG4iLCBleHRyYSkpOworCQkJCX0KKwkJCQllbHNlCisJCQkJey8vSW52YWxpZCBwYXJhbWV0ZXMsIHNvIGRlZmF1bHQgcHJpbnRrIGFsbCBiYnAKKwkJCQkJYklzUHJpbnRBbGxCQlAgPSBUUlVFOworCQkJCQlnb3RvIG5leHQ7CisJCQkJfQorCQkJfQorCQkJZWxzZQorCQkJeyAvL0ludmFsaWQgcGFyYW1ldGVzLCBzbyBkZWZhdWx0IHByaW50ayBhbGwgYmJwCisJCQkJYklzUHJpbnRBbGxCQlAgPSBUUlVFOworCQkJCWdvdG8gbmV4dDsKKwkJCX0KKwkJfQorCQl9CisJZWxzZQorCQliSXNQcmludEFsbEJCUCA9IFRSVUU7CisKK25leHQ6CisJaWYgKGJJc1ByaW50QWxsQkJQKQorCXsKKwkJbWVtc2V0KGV4dHJhLCAweDAwLCBJV19QUklWX1NJWkVfTUFTSyk7CisJCXNwcmludGYoZXh0cmEsICJcbiIpOworCQlmb3IgKGJicElkID0gMDsgYmJwSWQgPD0gMTM2OyBiYnBJZCsrKQorCQl7CisJCSAgICBpZiAoc3RybGVuKGV4dHJhKSA+PSAoSVdfUFJJVl9TSVpFX01BU0sgLSAxMCkpCisgICAgICAgICAgICAgICAgYnJlYWs7CisjaWZkZWYgUkFMSU5LX0FURQorCQkJaWYgKEFURV9PTihwQWRhcHRlcikpCisJCQl7CisJCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkYXB0ZXIsIGJicElkLCAmcmVnQkJQKTsKKwkJCX0KKwkJCWVsc2UKKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisJCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkYXB0ZXIsIGJicElkLCAmcmVnQkJQKTsKKwkJCXNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlIlMDJkWzB4JTAyWF06JTAyWCAgICAiLCBiYnBJZCwgYmJwSWQqMiwgcmVnQkJQKTsKKwkJCWlmIChiYnBJZCU1ID09IDQpCisJCQkJc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiXG4iKTsKKwkJfQorCisgICAgICAgIHdycS0+bGVuZ3RoID0gc3RybGVuKGV4dHJhKSArIDE7IC8vIDE6IHNpemUgb2YgJ1wwJworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJ3cnEtPmxlbmd0aCA9ICVkXG4iLCB3cnEtPmxlbmd0aCkpOworCX0KKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PXJ0X3ByaXZhdGVfaW9jdGxfYmJwXG5cbiIpKTsKKworICAgIHJldHVybiBTdGF0dXM7Cit9CisjZW5kaWYgLy8gREJHIC8vCisKK2ludCBydF9pb2N0bF9zaXdyYXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisgICAgUFJUTVBfQURBUFRFUiAgIHBBZCA9IGRldi0+bWxfcHJpdjsKKyAgICBVSU5UMzIgICAgICAgICAgcmF0ZSA9IHdycXUtPmJpdHJhdGUudmFsdWUsIGZpeGVkID0gd3JxdS0+Yml0cmF0ZS5maXhlZDsKKworICAgIC8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCisJaWYoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKKwl7CisgIAkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgicnRfaW9jdGxfc2l3cmF0ZTo6TmV0d29yayBpcyBkb3duIVxuIikpOworICAgIAlyZXR1cm4gLUVORVRET1dOOworCX0KKworICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoInJ0X2lvY3RsX3Npd3JhdGU6OihyYXRlID0gJWQsIGZpeGVkID0gJWQpXG4iLCByYXRlLCBmaXhlZCkpOworICAgIC8qIHJhdGUgPSAtMSA9PiBhdXRvIHJhdGUKKyAgICAgICByYXRlID0gWCwgZml4ZWQgPSAxID0+IChmaXhlZCByYXRlIFgpCisgICAgKi8KKyAgICBpZiAocmF0ZSA9PSAtMSkKKyAgICB7CisJCS8vQXV0byBSYXRlCisJCXBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTX0FVVE87CisJCXBBZC0+U3RhQ2ZnLmJBdXRvVHhSYXRlU3dpdGNoID0gVFJVRTsKKwkJaWYgKChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlIDw9IFBIWV8xMUcpIHx8CisJCSAgICAocEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5IVFBoeU1vZGUuZmllbGQuTU9ERSA8PSBNT0RFX09GRE0pKQorCQkJUlRNUFNldERlc2lyZWRSYXRlcyhwQWQsIC0xKTsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQlTZXRDb21tb25IVChwQWQpOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpZiAoZml4ZWQpCisgICAgICAgIHsKKyAgICAgICAgCXBBZC0+U3RhQ2ZnLmJBdXRvVHhSYXRlU3dpdGNoID0gRkFMU0U7CisgICAgICAgICAgICBpZiAoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPD0gUEhZXzExRykgfHwKKyAgICAgICAgICAgICAgICAocEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5IVFBoeU1vZGUuZmllbGQuTU9ERSA8PSBNT0RFX09GRE0pKQorICAgICAgICAgICAgICAgIFJUTVBTZXREZXNpcmVkUmF0ZXMocEFkLCByYXRlKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU19BVVRPOworI2lmZGVmIERPVDExX05fU1VQUE9SVAorICAgICAgICAgICAgICAgIFNldENvbW1vbkhUKHBBZCk7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisgICAgICAgICAgICB9CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJydF9pb2N0bF9zaXdyYXRlOjooSHRNY3M9JWQpXG4iLHBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvLyBUT0RPOiByYXRlID0gWCwgZml4ZWQgPSAwID0+IChyYXRlcyA8PSBYKQorICAgICAgICAgICAgcmV0dXJuIC1FT1BOT1RTVVBQOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBydF9pb2N0bF9naXdyYXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKyAgICBQUlRNUF9BREFQVEVSICAgcEFkID0gZGV2LT5tbF9wcml2OworICAgIGludCByYXRlX2luZGV4ID0gMCwgcmF0ZV9jb3VudCA9IDA7CisgICAgSFRUUkFOU01JVF9TRVRUSU5HIGh0X3NldHRpbmc7CisgICAgX19zMzIgcmFsaW5rcmF0ZVtdID0KKwl7MiwgIDQsICAgMTEsICAyMiwgLy8gQ0NLCisJMTIsIDE4LCAgIDI0LCAgMzYsIDQ4LCA3MiwgOTYsIDEwOCwgLy8gT0ZETQorCTEzLCAyNiwgICAzOSwgIDUyLCAgNzgsIDEwNCwgMTE3LCAxMzAsIDI2LCAgNTIsICA3OCwgMTA0LCAxNTYsIDIwOCwgMjM0LCAyNjAsIC8vIDIwTUh6LCA4MDBucyBHSSwgTUNTOiAwIH4gMTUKKwkzOSwgNzgsICAxMTcsIDE1NiwgMjM0LCAzMTIsIDM1MSwgMzkwLAkJCQkJCQkJCQkgIC8vIDIwTUh6LCA4MDBucyBHSSwgTUNTOiAxNiB+IDIzCisJMjcsIDU0LCAgIDgxLCAxMDgsIDE2MiwgMjE2LCAyNDMsIDI3MCwgNTQsIDEwOCwgMTYyLCAyMTYsIDMyNCwgNDMyLCA0ODYsIDU0MCwgLy8gNDBNSHosIDgwMG5zIEdJLCBNQ1M6IDAgfiAxNQorCTgxLCAxNjIsIDI0MywgMzI0LCA0ODYsIDY0OCwgNzI5LCA4MTAsCQkJCQkJCQkJCSAgLy8gNDBNSHosIDgwMG5zIEdJLCBNQ1M6IDE2IH4gMjMKKwkxNCwgMjksICAgNDMsICA1NywgIDg3LCAxMTUsIDEzMCwgMTQ0LCAyOSwgNTksICAgODcsIDExNSwgMTczLCAyMzAsIDI2MCwgMjg4LCAvLyAyME1IeiwgNDAwbnMgR0ksIE1DUzogMCB+IDE1CisJNDMsIDg3LCAgMTMwLCAxNzMsIDI2MCwgMzE3LCAzOTAsIDQzMywJCQkJCQkJCQkJICAvLyAyME1IeiwgNDAwbnMgR0ksIE1DUzogMTYgfiAyMworCTMwLCA2MCwgICA5MCwgMTIwLCAxODAsIDI0MCwgMjcwLCAzMDAsIDYwLCAxMjAsIDE4MCwgMjQwLCAzNjAsIDQ4MCwgNTQwLCA2MDAsIC8vIDQwTUh6LCA0MDBucyBHSSwgTUNTOiAwIH4gMTUKKwk5MCwgMTgwLCAyNzAsIDM2MCwgNTQwLCA3MjAsIDgxMCwgOTAwfTsJCQkJCQkJCQkJICAvLyA0ME1IeiwgNDAwbnMgR0ksIE1DUzogMTYgfiAyMworCisgICAgcmF0ZV9jb3VudCA9IHNpemVvZihyYWxpbmtyYXRlKS9zaXplb2YoX19zMzIpOworICAgIC8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCisJaWYoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKKwl7CisgIAkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOworICAgIAlyZXR1cm4gLUVORVRET1dOOworCX0KKworICAgIGlmICgocEFkLT5TdGFDZmcuYkF1dG9UeFJhdGVTd2l0Y2ggPT0gRkFMU0UpICYmCisgICAgICAgIChJTkZSQV9PTihwQWQpKSAmJgorICAgICAgICAoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPD0gUEhZXzExRykgfHwgKHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLk1PREUgPD0gTU9ERV9PRkRNKSkpCisgICAgICAgIGh0X3NldHRpbmcud29yZCA9IHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS53b3JkOworICAgIGVsc2UKKyAgICAgICAgaHRfc2V0dGluZy53b3JkID0gcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5IVFBoeU1vZGUud29yZDsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorICAgIGlmIChodF9zZXR0aW5nLmZpZWxkLk1PREUgPj0gTU9ERV9IVE1JWCkKKyAgICB7CisvLyAgICAJcmF0ZV9pbmRleCA9IDEyICsgKChVQ0hBUilodF9zZXR0aW5nLmZpZWxkLkJXICoxNikgKyAoKFVDSEFSKWh0X3NldHRpbmcuZmllbGQuU2hvcnRHSSAqMzIpICsgKChVQ0hBUilodF9zZXR0aW5nLmZpZWxkLk1DUyk7CisgICAgCXJhdGVfaW5kZXggPSAxMiArICgoVUNIQVIpaHRfc2V0dGluZy5maWVsZC5CVyAqMjQpICsgKChVQ0hBUilodF9zZXR0aW5nLmZpZWxkLlNob3J0R0kgKjQ4KSArICgoVUNIQVIpaHRfc2V0dGluZy5maWVsZC5NQ1MpOworICAgIH0KKyAgICBlbHNlCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisgICAgaWYgKGh0X3NldHRpbmcuZmllbGQuTU9ERSA9PSBNT0RFX09GRE0pCisgICAgCXJhdGVfaW5kZXggPSAoVUNIQVIpKGh0X3NldHRpbmcuZmllbGQuTUNTKSArIDQ7CisgICAgZWxzZSBpZiAoaHRfc2V0dGluZy5maWVsZC5NT0RFID09IE1PREVfQ0NLKQorICAgIAlyYXRlX2luZGV4ID0gKFVDSEFSKShodF9zZXR0aW5nLmZpZWxkLk1DUyk7CisKKyAgICBpZiAocmF0ZV9pbmRleCA8IDApCisgICAgICAgIHJhdGVfaW5kZXggPSAwOworCisgICAgaWYgKHJhdGVfaW5kZXggPiByYXRlX2NvdW50KQorICAgICAgICByYXRlX2luZGV4ID0gcmF0ZV9jb3VudDsKKworICAgIHdycXUtPmJpdHJhdGUudmFsdWUgPSByYWxpbmtyYXRlW3JhdGVfaW5kZXhdICogNTAwMDAwOworICAgIHdycXUtPmJpdHJhdGUuZGlzYWJsZWQgPSAwOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBpd19oYW5kbGVyIHJ0X2hhbmRsZXJbXSA9Cit7CisJKGl3X2hhbmRsZXIpIE5VTEwsCQkJICAgICAgICAgICAgLyogU0lPQ1NJV0NPTU1JVCAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9naXduYW1lLAkJCS8qIFNJT0NHSVdOQU1FICAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCQkgICAgICAgICAgICAvKiBTSU9DU0lXTldJRCAgICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkJICAgICAgICAgICAgLyogU0lPQ0dJV05XSUQgICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9zaXdmcmVxLAkJICAgIC8qIFNJT0NTSVdGUkVRICAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3ZnJlcSwJCSAgICAvKiBTSU9DR0lXRlJFUSAgICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3Npd21vZGUsCQkgICAgLyogU0lPQ1NJV01PREUgICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9naXdtb2RlLAkJICAgIC8qIFNJT0NHSVdNT0RFICAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCSAgICAgICAgICAgICAgICAvKiBTSU9DU0lXU0VOUyAgICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkgICAgICAgICAgICAgICAgLyogU0lPQ0dJV1NFTlMgICAqLworCShpd19oYW5kbGVyKSBOVUxMIC8qIG5vdCB1c2VkICovLAkJLyogU0lPQ1NJV1JBTkdFICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9naXdyYW5nZSwJCSAgICAvKiBTSU9DR0lXUkFOR0UgICovCisJKGl3X2hhbmRsZXIpIE5VTEwgLyogbm90IHVzZWQgKi8sCQkvKiBTSU9DU0lXUFJJViAgICovCisJKGl3X2hhbmRsZXIpIE5VTEwgLyoga2VybmVsIGNvZGUgKi8sICAgIC8qIFNJT0NHSVdQUklWICAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCAvKiBub3QgdXNlZCAqLywJCS8qIFNJT0NTSVdTVEFUUyAgKi8KKwkoaXdfaGFuZGxlcikgcnQyOHh4X2dldF93aXJlbGVzc19zdGF0cyAvKiBrZXJuZWwgY29kZSAqLywgICAgLyogU0lPQ0dJV1NUQVRTICAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJICAgICAgICAgICAgICAgIC8qIFNJT0NTSVdTUFkgICAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCSAgICAgICAgICAgICAgICAvKiBTSU9DR0lXU1BZICAgICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkJCSAgICAgICAgLyogU0lPQ1NJV1RIUlNQWSAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJCQkgICAgICAgIC8qIFNJT0NHSVdUSFJTUFkgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfc2l3YXAsICAgICAgICAgICAgLyogU0lPQ1NJV0FQICAgICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9naXdhcCwJCSAgICAvKiBTSU9DR0lXQVAgICAgICovCisjaWZkZWYgU0lPQ1NJV01MTUUKKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfc2l3bWxtZSwJICAgICAgICAvKiBTSU9DU0lXTUxNRSAgICovCisjZWxzZQorCShpd19oYW5kbGVyKSBOVUxMLAkJCQkgICAgICAgIC8qIFNJT0NTSVdNTE1FICovCisjZW5kaWYgLy8gU0lPQ1NJV01MTUUgLy8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfaXdhcGxpc3QsCQkgICAgLyogU0lPQ0dJV0FQTElTVCAqLworI2lmZGVmIFNJT0NHSVdTQ0FOCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3Npd3NjYW4sCQkgICAgLyogU0lPQ1NJV1NDQU4gICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9naXdzY2FuLAkJICAgIC8qIFNJT0NHSVdTQ0FOICAgKi8KKyNlbHNlCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkJCSAgICAgICAgLyogU0lPQ1NJV1NDQU4gICAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJCQkgICAgICAgIC8qIFNJT0NHSVdTQ0FOICAgKi8KKyNlbmRpZiAvKiBTSU9DR0lXU0NBTiAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9zaXdlc3NpZCwJCSAgICAvKiBTSU9DU0lXRVNTSUQgICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX2dpd2Vzc2lkLAkJICAgIC8qIFNJT0NHSVdFU1NJRCAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfc2l3bmlja24sCQkgICAgLyogU0lPQ1NJV05JQ0tOICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9naXduaWNrbiwJCSAgICAvKiBTSU9DR0lXTklDS04gICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkJCSAgICAgICAgLyogLS0gaG9sZSAtLSAgICAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJCQkgICAgICAgIC8qIC0tIGhvbGUgLS0gICAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfc2l3cmF0ZSwgICAgICAgICAgLyogU0lPQ1NJV1JBVEUgICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9naXdyYXRlLCAgICAgICAgICAvKiBTSU9DR0lXUkFURSAgICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3Npd3J0cywJCSAgICAvKiBTSU9DU0lXUlRTICAgICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX2dpd3J0cywJCSAgICAvKiBTSU9DR0lXUlRTICAgICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3Npd2ZyYWcsCQkgICAgLyogU0lPQ1NJV0ZSQUcgICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9naXdmcmFnLAkJICAgIC8qIFNJT0NHSVdGUkFHICAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCSAgICAgICAgICAgICAgICAvKiBTSU9DU0lXVFhQT1cgICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkgICAgICAgICAgICAgICAgLyogU0lPQ0dJV1RYUE9XICAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJICAgICAgICAgICAgICAgIC8qIFNJT0NTSVdSRVRSWSAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCSAgICAgICAgICAgICAgICAvKiBTSU9DR0lXUkVUUlkgICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3Npd2VuY29kZSwJCS8qIFNJT0NTSVdFTkNPREUgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3ZW5jb2RlLAkJLyogU0lPQ0dJV0VOQ09ERSAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJICAgICAgICAgICAgICAgIC8qIFNJT0NTSVdQT1dFUiAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCSAgICAgICAgICAgICAgICAvKiBTSU9DR0lXUE9XRVIgICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkJCQkJLyogLS0gaG9sZSAtLSAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJCQkJCS8qIC0tIGhvbGUgLS0gKi8KKyNpZiBXSVJFTEVTU19FWFQgPiAxNworICAgIChpd19oYW5kbGVyKSBydF9pb2N0bF9zaXdnZW5pZSwgICAgICAgICAvKiBTSU9DU0lXR0VOSUUgICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX2dpd2dlbmllLCAgICAgICAgIC8qIFNJT0NHSVdHRU5JRSAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfc2l3YXV0aCwJCSAgICAvKiBTSU9DU0lXQVVUSCAgICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX2dpd2F1dGgsCQkgICAgLyogU0lPQ0dJV0FVVEggICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9zaXdlbmNvZGVleHQsCSAgICAvKiBTSU9DU0lXRU5DT0RFRVhUICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX2dpd2VuY29kZWV4dCwJCS8qIFNJT0NHSVdFTkNPREVFWFQgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfc2l3cG1rc2EsICAgICAgICAgLyogU0lPQ1NJV1BNS1NBICAqLworI2VuZGlmCit9OworCitzdGF0aWMgY29uc3QgaXdfaGFuZGxlciBydF9wcml2X2hhbmRsZXJzW10gPSB7CisJKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgwMCAqLworCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MDEgKi8KKyNpZm5kZWYgQ09ORklHX0FQX1NVUFBPUlQKKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfc2V0cGFyYW0sIC8qICsgMHgwMiAqLworI2Vsc2UKKwkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDAyICovCisjZW5kaWYgLy8gQ09ORklHX0FQX1NVUFBPUlQgLy8KKyNpZmRlZiBEQkcKKwkoaXdfaGFuZGxlcikgcnRfcHJpdmF0ZV9pb2N0bF9iYnAsIC8qICsgMHgwMyAqLworI2Vsc2UKKwkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDAzICovCisjZW5kaWYKKwkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDA0ICovCisJKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgwNSAqLworCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MDYgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDA3ICovCisJKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgwOCAqLworCShpd19oYW5kbGVyKSBydF9wcml2YXRlX2dldF9zdGF0aXN0aWNzLCAvKiArIDB4MDkgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDBBICovCisJKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgwQiAqLworCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MEMgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDBEICovCisJKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgwRSAqLworCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MEYgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDEwICovCisJKGl3X2hhbmRsZXIpIHJ0X3ByaXZhdGVfc2hvdywgLyogKyAweDExICovCisgICAgKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgxMiAqLworCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MTMgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDE1ICovCisJKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgxNyAqLworCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MTggKi8KK307CisKK2NvbnN0IHN0cnVjdCBpd19oYW5kbGVyX2RlZiBydDI4eHhfaXdfaGFuZGxlcl9kZWYgPQoreworI2RlZmluZQlOKGEpCShzaXplb2YgKGEpIC8gc2l6ZW9mIChhWzBdKSkKKwkuc3RhbmRhcmQJPSAoaXdfaGFuZGxlciAqKSBydF9oYW5kbGVyLAorCS5udW1fc3RhbmRhcmQJPSBzaXplb2YocnRfaGFuZGxlcikgLyBzaXplb2YoaXdfaGFuZGxlciksCisJLnByaXZhdGUJPSAoaXdfaGFuZGxlciAqKSBydF9wcml2X2hhbmRsZXJzLAorCS5udW1fcHJpdmF0ZQkJPSBOKHJ0X3ByaXZfaGFuZGxlcnMpLAorCS5wcml2YXRlX2FyZ3MJPSAoc3RydWN0IGl3X3ByaXZfYXJncyAqKSBwcml2dGFiLAorCS5udW1fcHJpdmF0ZV9hcmdzCT0gTihwcml2dGFiKSwKKyNpZiBJV19IQU5ETEVSX1ZFUlNJT04gPj0gNworICAgIC5nZXRfd2lyZWxlc3Nfc3RhdHMgPSBydDI4eHhfZ2V0X3dpcmVsZXNzX3N0YXRzLAorI2VuZGlmCit9OworCitJTlQgUlRNUFNldEluZm9ybWF0aW9uKAorICAgIElOICBQUlRNUF9BREFQVEVSIHBBZGFwdGVyLAorICAgIElOICBPVVQgc3RydWN0IGlmcmVxICAgICpycSwKKyAgICBJTiAgSU5UICAgICAgICAgICAgICAgICBjbWQpCit7CisgICAgc3RydWN0IGl3cmVxICAgICAgICAgICAgICAgICAgICAgICAgKndycSA9IChzdHJ1Y3QgaXdyZXEgKikgcnE7CisgICAgTkRJU184MDJfMTFfU1NJRCAgICAgICAgICAgICAgICAgICAgU3NpZDsKKyAgICBORElTXzgwMl8xMV9NQUNfQUREUkVTUyAgICAgICAgICAgICBCc3NpZDsKKyAgICBSVF84MDJfMTFfUEhZX01PREUgICAgICAgICAgICAgICAgICBQaHlNb2RlOworICAgIFJUXzgwMl8xMV9TVEFfQ09ORklHICAgICAgICAgICAgICAgIFN0YUNvbmZpZzsKKyAgICBORElTXzgwMl8xMV9SQVRFUyAgICAgICAgICAgICAgICAgICBhcnlSYXRlczsKKyAgICBSVF84MDJfMTFfUFJFQU1CTEUgICAgICAgICAgICAgICAgICBQcmVhbWJsZTsKKyAgICBORElTXzgwMl8xMV9XRVBfU1RBVFVTICAgICAgICAgICAgICBXZXBTdGF0dXM7CisgICAgTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fTU9ERSAgICAgQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVNYXg7CisgICAgTkRJU184MDJfMTFfTkVUV09SS19JTkZSQVNUUlVDVFVSRSAgQnNzVHlwZTsKKyAgICBORElTXzgwMl8xMV9SVFNfVEhSRVNIT0xEICAgICAgICAgICBSdHNUaHJlc2g7CisgICAgTkRJU184MDJfMTFfRlJBR01FTlRBVElPTl9USFJFU0hPTEQgRnJhZ1RocmVzaDsKKyAgICBORElTXzgwMl8xMV9QT1dFUl9NT0RFICAgICAgICAgICAgICBQb3dlck1vZGU7CisgICAgUE5ESVNfODAyXzExX0tFWSAgICAgICAgICAgICAgICAgICAgcEtleSA9IE5VTEw7CisgICAgUE5ESVNfODAyXzExX1dFUAkJCSAgICAgICAgcFdlcEtleSA9TlVMTDsKKyAgICBQTkRJU184MDJfMTFfUkVNT1ZFX0tFWSAgICAgICAgICAgICBwUmVtb3ZlS2V5ID0gTlVMTDsKKyAgICBORElTXzgwMl8xMV9DT05GSUdVUkFUSU9OICAgICAgICAgICBDb25maWcsICpwQ29uZmlnID0gTlVMTDsKKyAgICBORElTXzgwMl8xMV9ORVRXT1JLX1RZUEUgICAgICAgICAgICBOZXRUeXBlOworICAgIFVMT05HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdzsKKyAgICBVSU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXlJZHggPSAwOworICAgIElOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1MsIE1heFBoeU1vZGUgPSBQSFlfMTFHOworICAgIFVMT05HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvd2VyVGVtcDsKKyAgICBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSYWRpb1N0YXRlOworICAgIEJPT0xFQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXRlTWFjaGluZVRvdWNoZWQgPSBGQUxTRTsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwlPSURfU0VUX0hUX1BIWU1PREUJCQkJCUhUX1BoeU1vZGU7CS8vMTFuICxrYXRoeQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyAgICBQTkRJU184MDJfMTFfUE1LSUQgICAgICAgICAgICAgICAgICBwUG1rSWQgPSBOVUxMOworICAgIEJPT0xFQU4JCQkJICAgICAgICAgICAgICAgIElFRUU4MDIxeFN0YXRlID0gRkFMU0U7CisgICAgQk9PTEVBTgkJCQkgICAgICAgICAgICAgICAgSUVFRTgwMjF4X3JlcXVpcmVkX2tleXMgPSBGQUxTRTsKKyAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cGFfc3VwcGxpY2FudF9lbmFibGUgPSAwOworI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKworI2lmZGVmIFNOTVBfU1VQUE9SVAorCVRYX1JUWV9DRkdfU1RSVUMJCQl0eF9ydHlfY2ZnOworCVVMT05HCQkJCQkJU2hvcnRSZXRyeUxpbWl0LCBMb25nUmV0cnlMaW1pdDsKKwlVQ0hBUgkJCQkJCWN0bXA7CisjZW5kaWYgLy8gU05NUF9TVVBQT1JUIC8vCisKKworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJTWF4UGh5TW9kZSA9IFBIWV8xMU5fNUc7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPlJUTVBTZXRJbmZvcm1hdGlvbigpLAkweCUwOHhcbiIsIGNtZCYweDdGRkYpKTsKKyAgICBzd2l0Y2goY21kICYgMHg3RkZGKSB7CisgICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9DT1VOVFJZX1JFR0lPTjoKKyAgICAgICAgICAgIGlmICh3cnEtPnUuZGF0YS5sZW5ndGggPCBzaXplb2YoVUNIQVIpKQorICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FSU5WQUw7CisJCQkvLyBPbmx5IGF2YWxpYWJsZSB3aGVuIEVFUFJPTSBub3QgcHJvZ3JhbW1pbmcKKyAgICAgICAgICAgIGVsc2UgaWYgKCEocEFkYXB0ZXItPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uICYgMHg4MCkgJiYgIShwQWRhcHRlci0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb25Gb3JBQmFuZCAmIDB4ODApKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFVMT05HICAgQ291bnRyeTsKKyAgICAgICAgICAgICAgICBVQ0hBUglUbXBQaHk7CisKKwkJCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmQ291bnRyeSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb24gPSAoVUNIQVIpKENvdW50cnkgJiAweDAwMDAwMEZGKTsKKwkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb25Gb3JBQmFuZCA9IChVQ0hBUikoKENvdW50cnkgPj4gOCkgJiAweDAwMDAwMEZGKTsKKyAgICAgICAgICAgICAgICBUbXBQaHkgPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLlBoeU1vZGU7CisJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5QaHlNb2RlID0gMHhmZjsKKwkJCQkvLyBCdWlsZCBhbGwgY29ycmVzcG9uZGluZyBjaGFubmVsIGluZm9ybWF0aW9uCisJCQkJUlRNUFNldFBoeU1vZGUocEFkYXB0ZXIsIFRtcFBoeSk7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQkJU2V0Q29tbW9uSFQocEFkYXB0ZXIpOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6UlRfT0lEXzgwMl8xMV9DT1VOVFJZX1JFR0lPTiAoQTolZCAgQi9HOiVkKVxuIiwgcEFkYXB0ZXItPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uRm9yQUJhbmQsCisJCQkJICAgIHBBZGFwdGVyLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9CU1NJRF9MSVNUX1NDQU46CisgI2lmZGVmIFJBTElOS19BVEUKKwkJCWlmIChBVEVfT04ocEFkYXB0ZXIpKQorCQkJeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlRoZSBkcml2ZXIgaXMgaW4gQVRFIG1vZGUgbm93XG4iKSk7CisJCQkJYnJlYWs7CisJCQl9CisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworICAgICAgICAgICAgTm93ID0gamlmZmllczsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9CU1NJRF9MSVNUX1NDQU4sIFR4Q250ID0gJWQgXG4iLCBwQWRhcHRlci0+UmFsaW5rQ291bnRlcnMuTGFzdE9uZVNlY1RvdGFsVHhDb3VudCkpOworCisgICAgICAgICAgICBpZiAoTU9OSVRPUl9PTihwQWRhcHRlcikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIERyaXZlciBpcyBpbiBNb25pdG9yIE1vZGUgbm93ICEhIVxuIikpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisJCQkvL0JlbnNvbiBhZGQgMjAwODA1MjcsIHdoZW4gcmFkaW8gb2ZmLCBzdGEgZG9uJ3QgbmVlZCB0byBzY2FuCisJCQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfUkFESU9fT0ZGKSkKKwkJCQlicmVhazsKKworCQkJaWYgKFJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKSkKKwkJCXsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgRHJpdmVyIGlzIHNjYW5uaW5nIG5vdyAhISFcbiIpKTsKKwkJCQlwQWRhcHRlci0+U3RhQ2ZnLmJTY2FuUmVxSXNGcm9tV2ViVUkgPSBUUlVFOworCQkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKwkJCWlmIChwQWRhcHRlci0+UmFsaW5rQ291bnRlcnMuTGFzdE9uZVNlY1RvdGFsVHhDb3VudCA+IDEwMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgTGluayBVUCwgaWdub3JlIHRoaXMgc2V0OjpPSURfODAyXzExX0JTU0lEX0xJU1RfU0NBTlxuIikpOworCQkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisJCQkJcEFkYXB0ZXItPlN0YUNmZy5TY2FuQ250ID0gOTk7CQkvLyBQcmV2ZW50IGF1dG8gc2NhbiB0cmlnZ2VyZWQgYnkgdGhpcyBPSUQKKwkJCQlicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKChPUFNUQVRVU19URVNUX0ZMQUcocEFkYXB0ZXIsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSkgJiYKKwkJCQkoKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKSB8fAorCQkJCShwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykgfHwKKwkJCQkocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyKSB8fAorCQkJCShwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spKSAmJgorICAgICAgICAgICAgICAgIChwQWRhcHRlci0+U3RhQ2ZnLlBvcnRTZWN1cmVkID09IFdQQV84MDJfMVhfUE9SVF9OT1RfU0VDVVJFRCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIExpbmsgVVAsIFBvcnQgTm90IFNlY3VyZWQhIGlnbm9yZSB0aGlzIHNldDo6T0lEXzgwMl8xMV9CU1NJRF9MSVNUX1NDQU5cbiIpKTsKKwkJCQlTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworCQkJCXBBZGFwdGVyLT5TdGFDZmcuU2NhbkNudCA9IDk5OwkJLy8gUHJldmVudCBhdXRvIHNjYW4gdHJpZ2dlcmVkIGJ5IHRoaXMgT0lECisJCQkJYnJlYWs7CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSAhPSBDTlRMX0lETEUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUlQyOFhYX01MTUVfUkVTRVRfU1RBVEVfTUFDSElORShwQWRhcHRlcik7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIE1MTUUgYnVzeSwgcmVzZXQgTUxNRSBzdGF0ZSBtYWNoaW5lICEhIVxuIikpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyB0ZWxsIENOVEwgc3RhdGUgbWFjaGluZSB0byBjYWxsIE5kaXNNU2V0SW5mb3JtYXRpb25Db21wbGV0ZSgpIGFmdGVyIGNvbXBsZXRpbmcKKyAgICAgICAgICAgIC8vIHRoaXMgcmVxdWVzdCwgYmVjYXVzZSB0aGlzIHJlcXVlc3QgaXMgaW5pdGlhdGVkIGJ5IE5ESVMuCisgICAgICAgICAgICBwQWRhcHRlci0+TWxtZUF1eC5DdXJyUmVxSXNGcm9tTmRpcyA9IEZBTFNFOworICAgICAgICAgICAgLy8gUmVzZXQgYWxsb3dlZCBzY2FuIHJldHJpZXMKKyAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuU2NhbkNudCA9IDA7CisgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkxhc3RTY2FuVGltZSA9IE5vdzsKKworCQkJcEFkYXB0ZXItPlN0YUNmZy5iU2NhblJlcUlzRnJvbVdlYlVJID0gVFJVRTsKKyAgICAgICAgICAgIFJUTVBfU0VUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpOworICAgICAgICAgICAgTWxtZUVucXVldWUocEFkYXB0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE9JRF84MDJfMTFfQlNTSURfTElTVF9TQ0FOLAorICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworCisgICAgICAgICAgICBTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworICAgICAgICAgICAgU3RhdGVNYWNoaW5lVG91Y2hlZCA9IFRSVUU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX1NTSUQ6CisgICAgICAgICAgICBpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihORElTXzgwMl8xMV9TU0lEKSkKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgCVBDSEFSIHBTc2lkU3RyaW5nID0gTlVMTDsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmU3NpZCwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9TU0lEIChMZW49JWQsU3NpZD0lcylcbiIsIFNzaWQuU3NpZExlbmd0aCwgU3NpZC5Tc2lkKSk7CisgICAgICAgICAgICAgICAgaWYgKFNzaWQuU3NpZExlbmd0aCA+IE1BWF9MRU5fT0ZfU1NJRCkKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIAlpZiAoU3NpZC5Tc2lkTGVuZ3RoID09IDApCisgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAJCVNldF9TU0lEX1Byb2MocEFkYXB0ZXIsICIiKTsKKyAgICAgICAgICAgICAgICAJfQorCQkJCQllbHNlCisgICAgICAgICAgICAgICAgCXsKKwkgICAgICAgICAgICAgICAgCXBTc2lkU3RyaW5nID0gKENIQVIgKikga21hbGxvYyhNQVhfTEVOX09GX1NTSUQrMSwgTUVNX0FMTE9DX0ZMQUcpOworCQkJCQkJaWYgKHBTc2lkU3RyaW5nKQorCQkJCQkJeworCQkJCQkJCU5kaXNaZXJvTWVtb3J5KHBTc2lkU3RyaW5nLCBNQVhfTEVOX09GX1NTSUQrMSk7CisJCQkJCQkJTmRpc01vdmVNZW1vcnkocFNzaWRTdHJpbmcsIFNzaWQuU3NpZCwgU3NpZC5Tc2lkTGVuZ3RoKTsKKwkgICAgICAgICAgICAgICAgCQlTZXRfU1NJRF9Qcm9jKHBBZGFwdGVyLCBwU3NpZFN0cmluZyk7CisJCQkJCQkJa2ZyZWUocFNzaWRTdHJpbmcpOworCQkJCQkJfQorCQkJCQkJZWxzZQorCQkJCQkJCVN0YXR1cyA9IC1FTk9NRU07CisgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX0JTU0lEOgorI2lmZGVmIFJBTElOS19BVEUKKwkJCWlmIChBVEVfT04ocEFkYXB0ZXIpKQorCQkJeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlRoZSBkcml2ZXIgaXMgaW4gQVRFIG1vZGUgbm93XG4iKSk7CisJCQkJYnJlYWs7CisJCQl9CisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoTkRJU184MDJfMTFfTUFDX0FERFJFU1MpKQorICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZCc3NpZCwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKworICAgICAgICAgICAgICAgIC8vIHRlbGwgQ05UTCBzdGF0ZSBtYWNoaW5lIHRvIGNhbGwgTmRpc01TZXRJbmZvcm1hdGlvbkNvbXBsZXRlKCkgYWZ0ZXIgY29tcGxldGluZworICAgICAgICAgICAgICAgIC8vIHRoaXMgcmVxdWVzdCwgYmVjYXVzZSB0aGlzIHJlcXVlc3QgaXMgaW5pdGlhdGVkIGJ5IE5ESVMuCisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPk1sbWVBdXguQ3VyclJlcUlzRnJvbU5kaXMgPSBGQUxTRTsKKworCQkJCS8vIFByZXZlbnQgdG8gY29ubmVjdCBBUCBhZ2FpbiBpbiBTVEFNbG1lUGVyaW9kaWNFeGVjCisJCQkJcEFkYXB0ZXItPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWRMZW49IDMyOworCisgICAgICAgICAgICAgICAgLy8gUmVzZXQgYWxsb3dlZCBzY2FuIHJldHJpZXMKKwkJCQlwQWRhcHRlci0+U3RhQ2ZnLlNjYW5DbnQgPSAwOworCisgICAgICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSAhPSBDTlRMX0lETEUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBSVDI4WFhfTUxNRV9SRVNFVF9TVEFURV9NQUNISU5FKHBBZGFwdGVyKTsKKyAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIE1MTUUgYnVzeSwgcmVzZXQgTUxNRSBzdGF0ZSBtYWNoaW5lICEhIVxuIikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBNbG1lRW5xdWV1ZShwQWRhcHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPSURfODAyXzExX0JTU0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihORElTXzgwMl8xMV9NQUNfQUREUkVTUyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFZPSUQgKikmQnNzaWQpOworICAgICAgICAgICAgICAgIFN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisgICAgICAgICAgICAgICAgU3RhdGVNYWNoaW5lVG91Y2hlZCA9IFRSVUU7CisKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfQlNTSUQgJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnNzaWRbMF0sIEJzc2lkWzFdLCBCc3NpZFsyXSwgQnNzaWRbM10sIEJzc2lkWzRdLCBCc3NpZFs1XSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9SQURJTzoKKyAgICAgICAgICAgIGlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKEJPT0xFQU4pKQorICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZSYWRpb1N0YXRlLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6UlRfT0lEXzgwMl8xMV9SQURJTyAoPSVkKVxuIiwgUmFkaW9TdGF0ZSkpOworICAgICAgICAgICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLmJTd1JhZGlvICE9IFJhZGlvU3RhdGUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLmJTd1JhZGlvID0gUmFkaW9TdGF0ZTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuYlJhZGlvICE9IChwQWRhcHRlci0+U3RhQ2ZnLmJId1JhZGlvICYmIHBBZGFwdGVyLT5TdGFDZmcuYlN3UmFkaW8pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLmJSYWRpbyA9IChwQWRhcHRlci0+U3RhQ2ZnLmJId1JhZGlvICYmIHBBZGFwdGVyLT5TdGFDZmcuYlN3UmFkaW8pOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuYlJhZGlvID09IFRSVUUpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWxtZVJhZGlvT24ocEFkYXB0ZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBleHRyYSBpbmZvcm1hdGlvbgorCQkJCQkJCXBBZGFwdGVyLT5FeHRyYUluZm8gPSBFWFRSQV9JTkZPX0NMRUFSOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1sbWVSYWRpb09mZihwQWRhcHRlcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVXBkYXRlIGV4dHJhIGluZm9ybWF0aW9uCisJCQkJCQkJcEFkYXB0ZXItPkV4dHJhSW5mbyA9IFNXX1JBRElPX09GRjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfUEhZX01PREU6CisgICAgICAgICAgICBpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihSVF84MDJfMTFfUEhZX01PREUpKQorICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZQaHlNb2RlLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJCWlmIChQaHlNb2RlIDw9IE1heFBoeU1vZGUpCisJCQkJeworICAgICAgICAgICAgICAgIAlSVE1QU2V0UGh5TW9kZShwQWRhcHRlciwgUGh5TW9kZSk7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQkJCVNldENvbW1vbkhUKHBBZGFwdGVyKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJCQl9CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpSVF9PSURfODAyXzExX1BIWV9NT0RFICg9JWQpXG4iLCBQaHlNb2RlKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX1NUQV9DT05GSUc6CisgICAgICAgICAgICBpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihSVF84MDJfMTFfU1RBX0NPTkZJRykpCisgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJlN0YUNvbmZpZywgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLmJFbmFibGVUeEJ1cnN0ID0gU3RhQ29uZmlnLkVuYWJsZVR4QnVyc3Q7CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5Vc2VCR1Byb3RlY3Rpb24gPSBTdGFDb25maWcuVXNlQkdQcm90ZWN0aW9uOworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuYlVzZVNob3J0U2xvdFRpbWUgPSAxOyAvLyAyMDAzLTEwLTMwIGFsd2F5cyBTSE9SVCBTTE9UIGNhcGFibGUKKyAgICAgICAgICAgICAgICBpZiAoKHBBZGFwdGVyLT5Db21tb25DZmcuUGh5TW9kZSAhPSBTdGFDb25maWcuQWRob2NNb2RlKSAmJgorCQkJCQkoU3RhQ29uZmlnLkFkaG9jTW9kZSA8PSBNYXhQaHlNb2RlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIGFsbG93IGR5bmFtaWMgY2hhbmdlIG9mICJVU0UgT0ZETSByYXRlIG9yIG5vdCIgaW4gQURIT0MgbW9kZQorICAgICAgICAgICAgICAgICAgICAvLyBpZiBzZXR0aW5nIGNoYW5nZWQsIG5lZWQgdG8gcmVzZXQgY3VycmVudCBUWCByYXRlIGFzIHdlbGwgYXMgQkVBQ09OIGZyYW1lIGZvcm1hdAorICAgICAgICAgICAgICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5Cc3NUeXBlID09IEJTU19BREhPQykKKyAgICAgICAgICAgICAgICAgICAgeworCQkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5QaHlNb2RlID0gU3RhQ29uZmlnLkFkaG9jTW9kZTsKKyAgICAgICAgICAgICAgICAgICAgCVJUTVBTZXRQaHlNb2RlKHBBZGFwdGVyLCBQaHlNb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIE1sbWVVcGRhdGVUeFJhdGVzKHBBZGFwdGVyLCBGQUxTRSwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBNYWtlSWJzc0JlYWNvbihwQWRhcHRlcik7ICAgICAgICAgICAvLyByZS1idWlsZCBCRUFDT04gZnJhbWUKKyAgICAgICAgICAgICAgICAgICAgICAgIEFzaWNFbmFibGVJYnNzU3luYyhwQWRhcHRlcik7ICAgLy8gY29weSB0byBvbi1jaGlwIG1lbW9yeQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6UlRfT0lEXzgwMl8xMV9TRVRfU1RBX0NPTkZJRyAoQnVyc3Q9JWQsIFByb3RlY3Rpb249JWxkLFNob3J0U2xvdD0lZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLmJFbmFibGVUeEJ1cnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuVXNlQkdQcm90ZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuYlVzZVNob3J0U2xvdFRpbWUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfREVTSVJFRF9SQVRFUzoKKyAgICAgICAgICAgIGlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKE5ESVNfODAyXzExX1JBVEVTKSkKKyAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmYXJ5UmF0ZXMsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgTmRpc1plcm9NZW1vcnkocEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVSYXRlLCBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUyk7CisgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVSYXRlLCAmYXJ5UmF0ZXMsIHNpemVvZihORElTXzgwMl8xMV9SQVRFUykpOworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9ERVNJUkVEX1JBVEVTICglMDJ4LCUwMngsJTAyeCwlMDJ4LCUwMngsJTAyeCwlMDJ4LCUwMngpXG4iLAorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbMF0scEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzFdLAorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbMl0scEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzNdLAorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbNF0scEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzVdLAorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbNl0scEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzddICkpOworICAgICAgICAgICAgICAgIC8vIENoYW5naW5nIERlc2lyZWRSYXRlIG1heSBhZmZlY3QgdGhlIE1BWCBUWCByYXRlIHdlIHVzZWQgdG8gVFggZnJhbWVzIG91dAorICAgICAgICAgICAgICAgIE1sbWVVcGRhdGVUeFJhdGVzKHBBZGFwdGVyLCBGQUxTRSwgMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX1BSRUFNQkxFOgorICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoUlRfODAyXzExX1BSRUFNQkxFKSkKKyAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmUHJlYW1ibGUsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgaWYgKFByZWFtYmxlID09IFJ0ODAyXzExUHJlYW1ibGVTaG9ydCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuVHhQcmVhbWJsZSA9IFByZWFtYmxlOworICAgICAgICAgICAgICAgICAgICBNbG1lU2V0VHhQcmVhbWJsZShwQWRhcHRlciwgUnQ4MDJfMTFQcmVhbWJsZVNob3J0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoKFByZWFtYmxlID09IFJ0ODAyXzExUHJlYW1ibGVMb25nKSB8fCAoUHJlYW1ibGUgPT0gUnQ4MDJfMTFQcmVhbWJsZUF1dG8pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gaWYgdXNlciB3YW50cyBBVVRPLCBpbml0aWFsaXplIHRvIExPTkcgaGVyZSwgdGhlbiBjaGFuZ2UgYWNjb3JkaW5nIHRvIEFQJ3MKKyAgICAgICAgICAgICAgICAgICAgLy8gY2FwYWJpbGl0eSB1cG9uIGFzc29jaWF0aW9uLgorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLlR4UHJlYW1ibGUgPSBQcmVhbWJsZTsKKyAgICAgICAgICAgICAgICAgICAgTWxtZVNldFR4UHJlYW1ibGUocEFkYXB0ZXIsIFJ0ODAyXzExUHJlYW1ibGVMb25nKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6UlRfT0lEXzgwMl8xMV9QUkVBTUJMRSAoPSVkKVxuIiwgUHJlYW1ibGUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfV0VQX1NUQVRVUzoKKyAgICAgICAgICAgIGlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKE5ESVNfODAyXzExX1dFUF9TVEFUVVMpKQorICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZXZXBTdGF0dXMsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgLy8gU2luY2UgVEtJUCwgQUVTLCBXRVAgYXJlIGFsbCBzdXBwb3J0ZWQuIEl0IHNob3VsZCBub3QgaGF2ZSBhbnkgaW52YWxpZCBzZXR0aW5nCisgICAgICAgICAgICAgICAgaWYgKFdlcFN0YXR1cyA8PSBOZGlzODAyXzExRW5jcnlwdGlvbjNLZXlBYnNlbnQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXMgIT0gV2VwU3RhdHVzKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBDb25maWcgaGFzIGNoYW5nZWQKKyAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5iQ29uZmlnQ2hhbmdlZCA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXMgICAgID0gV2VwU3RhdHVzOworICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLk9yaWdXZXBTdGF0dXMgPSBXZXBTdGF0dXM7CisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuUGFpckNpcGhlciAgICA9IFdlcFN0YXR1czsKKyAgICAgICAgICAgICAgICAJcEFkYXB0ZXItPlN0YUNmZy5Hcm91cENpcGhlciAgID0gV2VwU3RhdHVzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9XRVBfU1RBVFVTICg9JWQpXG4iLFdlcFN0YXR1cykpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9BVVRIRU5USUNBVElPTl9NT0RFOgorICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fTU9ERSkpCisgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJkF1dGhNb2RlLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgICAgIGlmIChBdXRoTW9kZSA+IE5kaXM4MDJfMTFBdXRoTW9kZU1heCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgIT0gQXV0aE1vZGUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvbmZpZyBoYXMgY2hhbmdlZAorICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPmJDb25maWdDaGFuZ2VkID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gQXV0aE1vZGU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQ7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREUgKD0lZCkgXG4iLHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfSU5GUkFTVFJVQ1RVUkVfTU9ERToKKyAgICAgICAgICAgIGlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKE5ESVNfODAyXzExX05FVFdPUktfSU5GUkFTVFJVQ1RVUkUpKQorICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZCc3NUeXBlLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCisJCQkJaWYgKEJzc1R5cGUgPT0gTmRpczgwMl8xMUlCU1MpCisJCQkJCVNldF9OZXR3b3JrVHlwZV9Qcm9jKHBBZGFwdGVyLCAiQWRob2MiKTsKKwkJCQllbHNlIGlmIChCc3NUeXBlID09IE5kaXM4MDJfMTFJbmZyYXN0cnVjdHVyZSkKKwkJCQkJU2V0X05ldHdvcmtUeXBlX1Byb2MocEFkYXB0ZXIsICJJbmZyYSIpOworCQkJCWVsc2UgaWYgKEJzc1R5cGUgPT0gTmRpczgwMl8xMU1vbml0b3IpCisJCQkJCVNldF9OZXR3b3JrVHlwZV9Qcm9jKHBBZGFwdGVyLCAiTW9uaXRvciIpOworCQkJCWVsc2UKKwkJCQl7CisJCQkJCVN0YXR1cyAgPSAtRUlOVkFMOworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfSU5GUkFTVFJVQ1RVUkVfTU9ERSAodW5rbm93bilcbiIpKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkgY2FzZSBPSURfODAyXzExX1JFTU9WRV9XRVA6CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfUkVNT1ZFX1dFUFxuIikpOworICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoTkRJU184MDJfMTFfS0VZX0lOREVYKSkKKyAgICAgICAgICAgIHsKKwkJCQlTdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworCQkJCUtleUlkeCA9ICooTkRJU184MDJfMTFfS0VZX0lOREVYICopIHdycS0+dS5kYXRhLnBvaW50ZXI7CisKKwkJCQlpZiAoS2V5SWR4ICYgMHg4MDAwMDAwMCkKKwkJCQl7CisJCQkJCS8vIFNob3VsZCBuZXZlciBzZXQgZGVmYXVsdCBiaXQgd2hlbiByZW1vdmUga2V5CisJCQkJCVN0YXR1cyA9IC1FSU5WQUw7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCUtleUlkeCA9IEtleUlkeCAmIDB4MGZmZmZmZmY7CisJCQkJCWlmIChLZXlJZHggPj0gNCl7CisJCQkJCQlTdGF0dXMgPSAtRUlOVkFMOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLktleUxlbiA9IDA7CisJCQkJCQlwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uQ2lwaGVyQWxnID0gQ0lQSEVSX05PTkU7CisJCQkJCQlBc2ljUmVtb3ZlU2hhcmVkS2V5RW50cnkocEFkYXB0ZXIsIDAsIChVQ0hBUilLZXlJZHgpOworCQkJCQl9CisJCQkJfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9SRVNFVF9DT1VOVEVSUzoKKyAgICAgICAgICAgIE5kaXNaZXJvTWVtb3J5KCZwQWRhcHRlci0+V2xhbkNvdW50ZXJzLCBzaXplb2YoQ09VTlRFUl84MDJfMTEpKTsKKyAgICAgICAgICAgIE5kaXNaZXJvTWVtb3J5KCZwQWRhcHRlci0+Q291bnRlcnM4MDIzLCBzaXplb2YoQ09VTlRFUl84MDJfMykpOworICAgICAgICAgICAgTmRpc1plcm9NZW1vcnkoJnBBZGFwdGVyLT5SYWxpbmtDb3VudGVycywgc2l6ZW9mKENPVU5URVJfUkFMSU5LKSk7CisgICAgICAgICAgICBwQWRhcHRlci0+Q291bnRlcnM4MDIzLlJ4Tm9CdWZmZXIgICA9IDA7CisJCQlwQWRhcHRlci0+Q291bnRlcnM4MDIzLkdvb2RSZWNlaXZlcyA9IDA7CisJCQlwQWRhcHRlci0+Q291bnRlcnM4MDIzLlJ4Tm9CdWZmZXIgICA9IDA7CisjaWZkZWYgUlQyODcwCisJCQlwQWRhcHRlci0+QnVsa091dENvbXBsZXRlCT0gMDsKKwkJCXBBZGFwdGVyLT5CdWxrT3V0Q29tcGxldGVPdGhlcj0gMDsKKwkJCXBBZGFwdGVyLT5CdWxrT3V0Q29tcGxldGVDYW5jZWwgPSAwOworCQkJcEFkYXB0ZXItPkJ1bGtPdXRSZXEgPSAwOworCQkJcEFkYXB0ZXItPkJ1bGtJblJlcT0gMDsKKwkJCXBBZGFwdGVyLT5CdWxrSW5Db21wbGV0ZSA9IDA7CisJCQlwQWRhcHRlci0+QnVsa0luQ29tcGxldGVGYWlsID0gMDsKKyNlbmRpZiAvLyBSVDI4NzAgLy8KKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6UlRfT0lEXzgwMl8xMV9SRVNFVF9DT1VOVEVSUyBcbiIpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfUlRTX1RIUkVTSE9MRDoKKyAgICAgICAgICAgIGlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKE5ESVNfODAyXzExX1JUU19USFJFU0hPTEQpKQorICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZSdHNUaHJlc2gsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgaWYgKFJ0c1RocmVzaCA+IE1BWF9SVFNfVEhSRVNIT0xEKQorICAgICAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuUnRzVGhyZXNob2xkID0gKFVTSE9SVClSdHNUaHJlc2g7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfUlRTX1RIUkVTSE9MRCAoPSVsZClcbiIsUnRzVGhyZXNoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX0ZSQUdNRU5UQVRJT05fVEhSRVNIT0xEOgorICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoTkRJU184MDJfMTFfRlJBR01FTlRBVElPTl9USFJFU0hPTEQpKQorICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZGcmFnVGhyZXNoLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuYlVzZVplcm9Ub0Rpc2FibGVGcmFnbWVudCA9IEZBTFNFOworICAgICAgICAgICAgICAgIGlmIChGcmFnVGhyZXNoID4gTUFYX0ZSQUdfVEhSRVNIT0xEIHx8IEZyYWdUaHJlc2ggPCBNSU5fRlJBR19USFJFU0hPTEQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoRnJhZ1RocmVzaCA9PSAwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkZyYWdtZW50VGhyZXNob2xkID0gTUFYX0ZSQUdfVEhSRVNIT0xEOworICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5iVXNlWmVyb1RvRGlzYWJsZUZyYWdtZW50ID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkZyYWdtZW50VGhyZXNob2xkID0gKFVTSE9SVClGcmFnVGhyZXNoOworICAgICAgICAgICAgfQorICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX0ZSQUdNRU5UQVRJT05fVEhSRVNIT0xEICg9JWxkKSBcbiIsRnJhZ1RocmVzaCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9QT1dFUl9NT0RFOgorICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoTkRJU184MDJfMTFfUE9XRVJfTU9ERSkpCisgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmUG93ZXJNb2RlLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgICAgIGlmIChQb3dlck1vZGUgPT0gTmRpczgwMl8xMVBvd2VyTW9kZUNBTSkKKyAgICAgICAgICAgICAgICAJU2V0X1BTTW9kZV9Qcm9jKHBBZGFwdGVyLCAiQ0FNIik7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoUG93ZXJNb2RlID09IE5kaXM4MDJfMTFQb3dlck1vZGVNQVhfUFNQKQorICAgICAgICAgICAgICAgIAlTZXRfUFNNb2RlX1Byb2MocEFkYXB0ZXIsICJNYXhfUFNQIik7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoUG93ZXJNb2RlID09IE5kaXM4MDJfMTFQb3dlck1vZGVGYXN0X1BTUCkKKwkJCQkJU2V0X1BTTW9kZV9Qcm9jKHBBZGFwdGVyLCAiRmFzdF9QU1AiKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChQb3dlck1vZGUgPT0gTmRpczgwMl8xMVBvd2VyTW9kZUxlZ2FjeV9QU1ApCisJCQkJCVNldF9QU01vZGVfUHJvYyhwQWRhcHRlciwgIkxlZ2FjeV9QU1AiKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfUE9XRVJfTU9ERSAoPSVkKVxuIixQb3dlck1vZGUpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX1RYX1BPV0VSX0xFVkVMXzE6CisJCQlpZiAod3JxLT51LmRhdGEubGVuZ3RoICA8IHNpemVvZihVTE9ORykpCisJCQkJU3RhdHVzID0gLUVJTlZBTDsKKwkJCWVsc2UKKwkJCXsKKwkJCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmUG93ZXJUZW1wLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJCWlmIChQb3dlclRlbXAgPiAxMDApCisJCQkJCVBvd2VyVGVtcCA9IDB4ZmZmZmZmZmY7ICAvLyBBVVRPCisJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5UeFBvd2VyRGVmYXVsdCA9IFBvd2VyVGVtcDsgLy9rZWVwIGN1cnJlbnQgc2V0dGluZy4KKwkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA9IHBBZGFwdGVyLT5Db21tb25DZmcuVHhQb3dlckRlZmF1bHQ7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpSVF9PSURfODAyXzExX1RYX1BPV0VSX0xFVkVMXzEgKD0lbGQpXG4iLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlKSk7CisJCQl9CisJICAgICAgICBicmVhazsKKwkJY2FzZSBPSURfODAyXzExX05FVFdPUktfVFlQRV9JTl9VU0U6CisJCQlpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihORElTXzgwMl8xMV9ORVRXT1JLX1RZUEUpKQorCQkJCVN0YXR1cyA9IC1FSU5WQUw7CisJCQllbHNlCisJCQl7CisJCQkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJk5ldFR5cGUsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisKKwkJCQlpZiAoTmV0VHlwZSA9PSBOZGlzODAyXzExRFMpCisJCQkJCVJUTVBTZXRQaHlNb2RlKHBBZGFwdGVyLCBQSFlfMTFCKTsKKwkJCQllbHNlIGlmIChOZXRUeXBlID09IE5kaXM4MDJfMTFPRkRNMjQpCisJCQkJCVJUTVBTZXRQaHlNb2RlKHBBZGFwdGVyLCBQSFlfMTFCR19NSVhFRCk7CisJCQkJZWxzZSBpZiAoTmV0VHlwZSA9PSBOZGlzODAyXzExT0ZETTUpCisJCQkJCVJUTVBTZXRQaHlNb2RlKHBBZGFwdGVyLCBQSFlfMTFBKTsKKwkJCQllbHNlCisJCQkJCVN0YXR1cyA9IC1FSU5WQUw7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQkJaWYgKFN0YXR1cyA9PSBORElTX1NUQVRVU19TVUNDRVNTKQorCQkJCQlTZXRDb21tb25IVChwQWRhcHRlcik7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX05FVFdPUktfVFlQRV9JTl9VU0UgKD0lZClcbiIsTmV0VHlwZSkpOworCQkgICAgfQorCQkJYnJlYWs7CisgICAgICAgIC8vIEZvciBXUEEgUFNLIFBNSyBrZXkKKyAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX0FERF9XUEE6CisgICAgICAgICAgICBwS2V5ID0ga21hbGxvYyh3cnEtPnUuZGF0YS5sZW5ndGgsIE1FTV9BTExPQ19GTEFHKTsKKyAgICAgICAgICAgIGlmKHBLZXkgPT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRU5PTUVNOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcihwS2V5LCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgaWYgKHBLZXktPkxlbmd0aCAhPSB3cnEtPnUuZGF0YS5sZW5ndGgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpSVF9PSURfODAyXzExX0FERF9XUEEsIEZhaWxlZCEhXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlICE9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykgJiYKKwkJCQkgICAgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgIT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykgJiYKKwkJCQkgICAgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgIT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZSkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVPUE5PVFNVUFA7CisgICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6UlRfT0lEXzgwMl8xMV9BRERfV1BBLCBGYWlsZWQhISBbQXV0aE1vZGUgIT0gV1BBUFNLL1dQQTJQU0svV1BBTk9ORV1cbiIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKSB8fAorCQkJCQkJIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spIHx8CisJCQkJCQkgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZSkgKSAgICAgLy8gT25seSBmb3IgV1BBIFBTSyBtb2RlCisJCQkJeworICAgICAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQWRhcHRlci0+U3RhQ2ZnLlBNSywgJnBLZXktPktleU1hdGVyaWFsLCBwS2V5LT5LZXlMZW5ndGgpOworICAgICAgICAgICAgICAgICAgICAvLyBVc2UgUmFDb25maWcgYXMgUFNLIGFnZW50LgorICAgICAgICAgICAgICAgICAgICAvLyBTdGFydCBTVEEgc3VwcGxpY2FudCBzdGF0ZSBtYWNoaW5lCisgICAgICAgICAgICAgICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlICE9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmUpCisgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldwYVN0YXRlID0gU1NfU1RBUlQ7CisKKyAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpSVF9PSURfODAyXzExX0FERF9XUEEgKGlkPTB4JXgsIExlbj0lZC1ieXRlKVxuIiwgcEtleS0+S2V5SW5kZXgsIHBLZXktPktleUxlbmd0aCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldwYVN0YXRlID0gU1NfTk9UVVNFOworICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OlJUX09JRF84MDJfMTFfQUREX1dQQSAoaWQ9MHgleCwgTGVuPSVkLWJ5dGUpXG4iLCBwS2V5LT5LZXlJbmRleCwgcEtleS0+S2V5TGVuZ3RoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAga2ZyZWUocEtleSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX1JFTU9WRV9LRVk6CisgICAgICAgICAgICBwUmVtb3ZlS2V5ID0ga21hbGxvYyh3cnEtPnUuZGF0YS5sZW5ndGgsIE1FTV9BTExPQ19GTEFHKTsKKyAgICAgICAgICAgIGlmKHBSZW1vdmVLZXkgPT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRU5PTUVNOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcihwUmVtb3ZlS2V5LCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgaWYgKHBSZW1vdmVLZXktPkxlbmd0aCAhPSB3cnEtPnUuZGF0YS5sZW5ndGgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX1JFTU9WRV9LRVksIEZhaWxlZCEhXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgUlRNUFdQQVJlbW92ZUtleVByb2MocEFkYXB0ZXIsIHBSZW1vdmVLZXkpOworICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfUkVNT1ZFX0tFWSwgUmVtb3ZlIFdQQSBLZXkhIVxuIikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBLZXlJZHggPSBwUmVtb3ZlS2V5LT5LZXlJbmRleDsKKworICAgICAgICAgICAgICAgICAgICBpZiAoS2V5SWR4ICYgMHg4MDAwMDAwMCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2hvdWxkIG5ldmVyIHNldCBkZWZhdWx0IGJpdCB3aGVuIHJlbW92ZSBrZXkKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX1JFTU9WRV9LRVksIEZhaWxlZCEhKFNob3VsZCBuZXZlciBzZXQgZGVmYXVsdCBiaXQgd2hlbiByZW1vdmUga2V5KVxuIikpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgS2V5SWR4ID0gS2V5SWR4ICYgMHgwZmZmZmZmZjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChLZXlJZHggPiAzKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9SRU1PVkVfS0VZLCBGYWlsZWQhIShLZXlJZFslZF0gb3V0IG9mIHJhbmdlKVxuIiwgS2V5SWR4KSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLktleUxlbiA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLkNpcGhlckFsZyA9IENJUEhFUl9OT05FOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFzaWNSZW1vdmVTaGFyZWRLZXlFbnRyeShwQWRhcHRlciwgMCwgKFVDSEFSKUtleUlkeCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX1JFTU9WRV9LRVkgKGlkPTB4JXgsIExlbj0lZC1ieXRlKVxuIiwgcFJlbW92ZUtleS0+S2V5SW5kZXgsIHBSZW1vdmVLZXktPkxlbmd0aCkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAga2ZyZWUocFJlbW92ZUtleSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgLy8gTmV3IGZvciBXUEEKKyAgICAgICAgY2FzZSBPSURfODAyXzExX0FERF9LRVk6CisgICAgICAgICAgICBwS2V5ID0ga21hbGxvYyh3cnEtPnUuZGF0YS5sZW5ndGgsIE1FTV9BTExPQ19GTEFHKTsKKyAgICAgICAgICAgIGlmKHBLZXkgPT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRU5PTUVNOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIocEtleSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgIGlmIChwS2V5LT5MZW5ndGggIT0gd3JxLT51LmRhdGEubGVuZ3RoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9BRERfS0VZLCBGYWlsZWQhIVxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFJUTVBBZGRLZXkocEFkYXB0ZXIsIHBLZXkpOworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9BRERfS0VZIChpZD0weCV4LCBMZW49JWQtYnl0ZSlcbiIsIHBLZXktPktleUluZGV4LCBwS2V5LT5LZXlMZW5ndGgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGtmcmVlKHBLZXkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9DT05GSUdVUkFUSU9OOgorICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoTkRJU184MDJfMTFfQ09ORklHVVJBVElPTikpCisgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJkNvbmZpZywgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBwQ29uZmlnID0gJkNvbmZpZzsKKworICAgICAgICAgICAgICAgIGlmICgocENvbmZpZy0+QmVhY29uUGVyaW9kID49IDIwKSAmJiAocENvbmZpZy0+QmVhY29uUGVyaW9kIDw9NDAwKSkKKyAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuQmVhY29uUGVyaW9kID0gKFVTSE9SVCkgcENvbmZpZy0+QmVhY29uUGVyaW9kOworCisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUFjdGl2ZS5BdGltV2luID0gKFVTSE9SVCkgcENvbmZpZy0+QVRJTVdpbmRvdzsKKyAgICAgICAgICAgICAgICBNQVBfS0haX1RPX0NIQU5ORUxfSUQocENvbmZpZy0+RFNDb25maWcsIHBBZGFwdGVyLT5Db21tb25DZmcuQ2hhbm5lbCk7CisgICAgICAgICAgICAgICAgLy8KKwkJCQkvLyBTYXZlIHRoZSBjaGFubmVsIG9uIE1sbWVBdXggZm9yIENudGxPaWRSVEJzc2lkUHJvYyB1c2VkLgorCQkJCS8vCisJCQkJcEFkYXB0ZXItPk1sbWVBdXguQ2hhbm5lbCA9IHBBZGFwdGVyLT5Db21tb25DZmcuQ2hhbm5lbDsKKworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9DT05GSUdVUkFUSU9OIChCZWFjblBlcmlvZD0lbGQsQXRpbVc9JWxkLENoPSVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgcENvbmZpZy0+QmVhY29uUGVyaW9kLCBwQ29uZmlnLT5BVElNV2luZG93LCBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWwpKTsKKyAgICAgICAgICAgICAgICAvLyBDb25maWcgaGFzIGNoYW5nZWQKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+YkNvbmZpZ0NoYW5nZWQgPSBUUlVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCWNhc2UgUlRfT0lEXzgwMl8xMV9TRVRfSFRfUEhZTU9ERToKKwkJCWlmICh3cnEtPnUuZGF0YS5sZW5ndGgJIT0gc2l6ZW9mKE9JRF9TRVRfSFRfUEhZTU9ERSkpCisJCQkJU3RhdHVzID0gLUVJTlZBTDsKKwkJCWVsc2UKKwkJCXsKKwkJCSAgICBQT0lEX1NFVF9IVF9QSFlNT0RFCXBIVFBoeU1vZGUgPSAmSFRfUGh5TW9kZTsKKworCQkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZIVF9QaHlNb2RlLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6cEhUUGh5TW9kZQkoUGh5TW9kZSA9ICVkLFRyYW5zbWl0Tm8gPSAlZCwgSHRNb2RlID0JJWQsCUV4dE9mZnNldCA9CSVkICwgTUNTID0gJWQsIEJXID0JJWQsCVNUQkMgPSAlZCwgU0hPUlRHSSA9ICVkKSBcbiIsCisJCQkJcEhUUGh5TW9kZS0+UGh5TW9kZSwgcEhUUGh5TW9kZS0+VHJhbnNtaXRObyxwSFRQaHlNb2RlLT5IdE1vZGUscEhUUGh5TW9kZS0+RXh0T2Zmc2V0LAorCQkJCXBIVFBoeU1vZGUtPk1DUywgcEhUUGh5TW9kZS0+QlcsIHBIVFBoeU1vZGUtPlNUQkMsCXBIVFBoeU1vZGUtPlNIT1JUR0kpKTsKKwkJCQlpZiAocEFkYXB0ZXItPkNvbW1vbkNmZy5QaHlNb2RlCT49IFBIWV8xMUFCR05fTUlYRUQpCisJCQkJCVJUTVBTZXRIVChwQWRhcHRlciwJcEhUUGh5TW9kZSk7CisJCQl9CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OlJUX09JRF84MDJfMTFfU0VUX0hUX1BIWU1PREUoTUNTPSVkLEJXPSVkLFNHST0lZCxTVEJDPSVkKVxuIiwKKwkJCQlwQWRhcHRlci0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NQ1MsIHBBZGFwdGVyLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLkJXLCBwQWRhcHRlci0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5TaG9ydEdJLAorCQkJCXBBZGFwdGVyLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLlNUQkMpKTsKKwkJCWJyZWFrOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQljYXNlIFJUX09JRF84MDJfMTFfU0VUX0FQU0RfU0VUVElORzoKKwkJCWlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKFVMT05HKSkKKwkJCQlTdGF0dXMgPSAtRUlOVkFMOworCQkJZWxzZQorCQkJeworCQkJCVVMT05HIGFwc2QgOworCQkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZhcHNkLCB3cnEtPnUuZGF0YS5wb2ludGVyLAl3cnEtPnUuZGF0YS5sZW5ndGgpOworCisJCQkJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCQkJfEIzMX5CNwl8CUI2fkI1CSB8CSBCNAkgfAkgQjMJIHwJQjIJIHwJQjEJIHwJICAgQjAJCXwKKwkJCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJCQl8IFJzdmQJfCBNYXggU1AgTGVuIHwgQUNfVk8gfCBBQ19WSSB8IEFDX0JLIHwgQUNfQkUgfCBBUFNECUNhcGFibGUJfAorCQkJCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTRENhcGFibGUgPSAoYXBzZCAmIDB4MDAwMDAwMDEpID8gVFJVRSA6CUZBTFNFOworCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RBQ19CRSA9ICgoYXBzZAkmIDB4MDAwMDAwMDIpID4+IDEpCT8gVFJVRSA6IEZBTFNFOworCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RBQ19CSyA9ICgoYXBzZAkmIDB4MDAwMDAwMDQpID4+IDIpCT8gVFJVRSA6IEZBTFNFOworCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RBQ19WSSA9ICgoYXBzZAkmIDB4MDAwMDAwMDgpID4+IDMpCT8gVFJVRSA6IEZBTFNFOworCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RBQ19WTyA9ICgoYXBzZAkmIDB4MDAwMDAwMTApID4+IDQpCT8gVFJVRSA6IEZBTFNFOworCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuTWF4U1BMZW5ndGgJPSAoVUNIQVIpKChhcHNkCSYgMHgwMDAwMDA2MCkgPj4gNSk7CisKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OlJUX09JRF84MDJfMTFfU0VUX0FQU0RfU0VUVElORyAoYXBzZD0weCVseCwgQVBTRENhcD0lZCwgW0JFLEJLLFZJLFZPXT1bJWQvJWQvJWQvJWRdLAlNYXhTUExlbj0lZClcbiIsIGFwc2QsIHBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RDYXBhYmxlLAorCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNEQUNfQkUsCXBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RBQ19CSywJcEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTREFDX1ZJLAlwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNEQUNfVk8sCXBBZGFwdGVyLT5Db21tb25DZmcuTWF4U1BMZW5ndGgpKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUlRfT0lEXzgwMl8xMV9TRVRfQVBTRF9QU006CisJCQlpZiAod3JxLT51LmRhdGEubGVuZ3RoCSE9IHNpemVvZihVTE9ORykpCisJCQkJU3RhdHVzID0gLUVJTlZBTDsKKwkJCWVsc2UKKwkJCXsKKwkJCQkvLyBEcml2ZXIgbmVlZHMJdG8gbm90aWZ5IEFQIHdoZW4gUFNNIGNoYW5nZXMKKwkJCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmcEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTREZvcmNlUG93ZXJTYXZlLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJCWlmIChwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNERm9yY2VQb3dlclNhdmUJIT0gcEFkYXB0ZXItPlN0YUNmZy5Qc20pCisJCQkJeworCQkJCQlNbG1lU2V0UHNtQml0KHBBZGFwdGVyLAlwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNERm9yY2VQb3dlclNhdmUpOworCQkJCQlSVE1QU2VuZE51bGxGcmFtZShwQWRhcHRlciwJcEFkYXB0ZXItPkNvbW1vbkNmZy5UeFJhdGUsCVRSVUUpOworCQkJCX0KKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OlJUX09JRF84MDJfMTFfU0VUX0FQU0RfUFNNIChiQVBTREZvcmNlUG93ZXJTYXZlOiVkKVxuIiwJcEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTREZvcmNlUG93ZXJTYXZlKSk7CisJCQl9CisJCQlicmVhazsKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwkJY2FzZSBSVF9PSURfODAyXzExX1NFVF9ETFM6CisJCQlpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihVTE9ORykpCisJCQkJU3RhdHVzID0gLUVJTlZBTDsKKwkJCWVsc2UKKwkJCXsKKwkJCQlCT09MRUFOCW9sZHZhbHVlID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5iRExTQ2FwYWJsZTsKKwkJCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmcEFkYXB0ZXItPkNvbW1vbkNmZy5iRExTQ2FwYWJsZSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCQlpZiAob2xkdmFsdWUgJiYJIXBBZGFwdGVyLT5Db21tb25DZmcuYkRMU0NhcGFibGUpCisJCQkJeworCQkJCQlpbnQJaTsKKwkJCQkJLy8gdGVhcglkb3duIGxvY2FsIGRscyB0YWJsZSBlbnRyeQorCQkJCQlmb3IJKGk9MDsgaTxNQVhfTlVNX09GX0lOSVRfRExTX0VOVFJZOyBpKyspCisJCQkJCXsKKwkJCQkJCWlmIChwQWRhcHRlci0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkICYmIChwQWRhcHRlci0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9PSBETFNfRklOSVNIKSkKKwkJCQkJCXsKKwkJCQkJCQlwQWRhcHRlci0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cwk9IERMU19OT05FOworCQkJCQkJCXBBZGFwdGVyLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQJPSBGQUxTRTsKKwkJCQkJCQlSVE1QU2VuZERMU1RlYXJEb3duRnJhbWUocEFkYXB0ZXIsIHBBZGFwdGVyLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcik7CisJCQkJCQl9CisJCQkJCX0KKworCQkJCQkvLyB0ZWFyCWRvd24gcGVlciBkbHMgdGFibGUJZW50cnkKKwkJCQkJZm9yCShpPU1BWF9OVU1fT0ZfSU5JVF9ETFNfRU5UUlk7IGk8TUFYX05VTV9PRl9ETFNfRU5UUlk7IGkrKykKKwkJCQkJeworCQkJCQkJaWYgKHBBZGFwdGVyLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQgJiYgKHBBZGFwdGVyLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID09IERMU19GSU5JU0gpKQorCQkJCQkJeworCQkJCQkJCXBBZGFwdGVyLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzCT0gRExTX05PTkU7CisJCQkJCQkJcEFkYXB0ZXItPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZAk9IEZBTFNFOworCQkJCQkJCVJUTVBTZW5kRExTVGVhckRvd25GcmFtZShwQWRhcHRlciwgcEFkYXB0ZXItPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiU2V0OjpSVF9PSURfODAyXzExX1NFVF9ETFMgKD0lZClcbiIsIHBBZGFwdGVyLT5Db21tb25DZmcuYkRMU0NhcGFibGUpKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUlRfT0lEXzgwMl8xMV9TRVRfRExTX1BBUkFNOgorCQkJaWYgKHdycS0+dS5kYXRhLmxlbmd0aAkhPSBzaXplb2YoUlRfODAyXzExX0RMU19VSSkpCisJCQkJU3RhdHVzID0gLUVJTlZBTDsKKwkJCWVsc2UKKwkJCXsKKwkJCQlSVF84MDJfMTFfRExTCURsczsKKworCQkJCU5kaXNaZXJvTWVtb3J5KCZEbHMsIHNpemVvZihSVF84MDJfMTFfRExTKSk7CisJCQkJUlRNUE1vdmVNZW1vcnkoJkRscywgd3JxLT51LmRhdGEucG9pbnRlciwgc2l6ZW9mKFJUXzgwMl8xMV9ETFNfVUkpKTsKKwkJCQlNbG1lRW5xdWV1ZShwQWRhcHRlciwKKwkJCQkJCQlNTE1FX0NOVExfU1RBVEVfTUFDSElORSwKKwkJCQkJCQlSVF9PSURfODAyXzExX1NFVF9ETFNfUEFSQU0sCisJCQkJCQkJc2l6ZW9mKFJUXzgwMl8xMV9ETFMpLAorCQkJCQkJCSZEbHMpOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiU2V0OjpSVF9PSURfODAyXzExX1NFVF9ETFNfUEFSQU0gXG4iKSk7CisJCQl9CisJCQlicmVhazsKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKwkJY2FzZSBSVF9PSURfODAyXzExX1NFVF9XTU06CisJCQlpZiAod3JxLT51LmRhdGEubGVuZ3RoCSE9IHNpemVvZihCT09MRUFOKSkKKwkJCQlTdGF0dXMgPSAtRUlOVkFMOworCQkJZWxzZQorCQkJeworCQkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZwQWRhcHRlci0+Q29tbW9uQ2ZnLmJXbW1DYXBhYmxlLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6UlRfT0lEXzgwMl8xMV9TRVRfV01NICg9JWQpCVxuIiwgcEFkYXB0ZXItPkNvbW1vbkNmZy5iV21tQ2FwYWJsZSkpOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfODAyXzExX0RJU0FTU09DSUFURToKKyNpZmRlZiBSQUxJTktfQVRFCisJCQlpZiAoQVRFX09OKHBBZGFwdGVyKSkKKwkJCXsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJUaGUgZHJpdmVyIGlzIGluIEFURSBtb2RlIG5vd1xuIikpOworCQkJCWJyZWFrOworCQkJfQorI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKwkJCS8vCisJCQkvLyBTZXQgTmRpc1JhZGlvU3RhdGVPZmYgdG8JVFJVRSwgaW5zdGVhZCBvZiBjYWxsZWQJTWxtZVJhZGlvT2ZmLgorCQkJLy8gTGF0ZXIgb24sIE5ESVNfODAyXzExX0JTU0lEX0xJU1RfRVgtPk51bWJlck9mSXRlbXMgc2hvdWxkIGJlCTAKKwkJCS8vIHdoZW4JcXVlcnkgT0lEXzgwMl8xMV9CU1NJRF9MSVNULgorCQkJLy8KKwkJCS8vIFRSVUU6ICBOdW1iZXJPZkl0ZW1zCXdpbGwgc2V0IHRvCTAuCisJCQkvLyBGQUxTRTogTnVtYmVyT2ZJdGVtcwlubyBjaGFuZ2UuCisJCQkvLworCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5OZGlzUmFkaW9TdGF0ZU9mZiA9CVRSVUU7CisJCQkvLyBTZXQgdG8gaW1tZWRpYXRlbHkgc2VuZCB0aGUgbWVkaWEgZGlzY29ubmVjdAlldmVudAorCQkJcEFkYXB0ZXItPk1sbWVBdXguQ3VyclJlcUlzRnJvbU5kaXMJPSBUUlVFOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX0RJU0FTU09DSUFURQlcbiIpKTsKKworCQkJaWYgKElORlJBX09OKHBBZGFwdGVyKSkKKwkJCXsKKwkJCQlpZiAocEFkYXB0ZXItPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlICE9CUNOVExfSURMRSkKKwkJCQl7CisJCQkJCVJUMjhYWF9NTE1FX1JFU0VUX1NUQVRFX01BQ0hJTkUocEFkYXB0ZXIpOworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgTUxNRQlidXN5LCByZXNldAlNTE1FIHN0YXRlIG1hY2hpbmUgISEhXG4iKSk7CisJCQkJfQorCisJCQkJTWxtZUVucXVldWUocEFkYXB0ZXIsCisJCQkJCU1MTUVfQ05UTF9TVEFURV9NQUNISU5FLAorCQkJCQlPSURfODAyXzExX0RJU0FTU09DSUFURSwKKwkJCQkJMCwKKwkJCQkJTlVMTCk7CisKKwkJCQlTdGF0ZU1hY2hpbmVUb3VjaGVkCT0gVFJVRTsKKwkJCX0KKwkJCWJyZWFrOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCWNhc2UgUlRfT0lEXzgwMl8xMV9TRVRfSU1NRV9CQV9DQVA6CisJCQkJaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoT0lEX0JBQ0FQX1NUUlVDKSkKKwkJCQkJU3RhdHVzID0gLUVJTlZBTDsKKwkJCQllbHNlCisJCQkJeworCQkJCQlPSURfQkFDQVBfU1RSVUMgT3JkZSA7CisJCQkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZPcmRlLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJCQlpZiAoT3JkZS5Qb2xpY3kgPiBCQV9OT1RVU0UpCisJCQkJCXsKKwkJCQkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX0lOVkFMSURfREFUQTsKKwkJCQkJfQorCQkJCQllbHNlIGlmIChPcmRlLlBvbGljeSA9PSBCQV9OT1RVU0UpCisJCQkJCXsKKwkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlBvbGljeSA9IEJBX05PVFVTRTsKKwkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1wZHVEZW5zaXR5ID0gT3JkZS5NcGR1RGVuc2l0eTsKKwkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5Lk1wZHVEZW5zaXR5ID0gT3JkZS5NcGR1RGVuc2l0eTsKKwkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkFtc2R1RW5hYmxlID0gT3JkZS5BbXNkdUVuYWJsZTsKKwkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkFtc2R1U2l6ZT0gT3JkZS5BbXNkdVNpemU7CisJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5NaW1vUHM9IE9yZGUuTU1QU21vZGU7CisJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5NTVBTbW9kZSA9IE9yZGUuTU1QU21vZGU7CisJCQkJCQkvLyBVUGRhdGEgdG8gSFQgSUUKKwkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5NaW1vUHMgPSBPcmRlLk1NUFNtb2RlOworCQkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkFNc2R1U2l6ZSA9IE9yZGUuQW1zZHVTaXplOworCQkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBQYXJtLk1wZHVEZW5zaXR5ID0gT3JkZS5NcGR1RGVuc2l0eTsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkF1dG9CQSA9IE9yZGUuQXV0b0JBOworCQkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuUG9saWN5ID0gSU1NRURfQkE7IC8vIHdlIG9ubHkgc3VwcG9ydCBpbW1lZGlhdGUgQkEuCisJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5NcGR1RGVuc2l0eSA9IE9yZGUuTXBkdURlbnNpdHk7CisJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5NcGR1RGVuc2l0eSA9IE9yZGUuTXBkdURlbnNpdHk7CisJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5BbXNkdUVuYWJsZSA9IE9yZGUuQW1zZHVFbmFibGU7CisJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5BbXNkdVNpemU9IE9yZGUuQW1zZHVTaXplOworCQkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuTWltb1BzID0gT3JkZS5NTVBTbW9kZTsKKwkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1NUFNtb2RlID0gT3JkZS5NTVBTbW9kZTsKKworCQkJCQkJLy8gVVBkYXRhIHRvIEhUIElFCisJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uTWltb1BzID0gT3JkZS5NTVBTbW9kZTsKKwkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5BTXNkdVNpemUgPSBPcmRlLkFtc2R1U2l6ZTsKKwkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwUGFybS5NcGR1RGVuc2l0eSA9IE9yZGUuTXBkdURlbnNpdHk7CisKKwkJCQkJCWlmIChwQWRhcHRlci0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5SeEJBV2luTGltaXQgPiBNQVhfUlhfUkVPUkRFUkJVRikKKwkJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5SeEJBV2luTGltaXQgPSBNQVhfUlhfUkVPUkRFUkJVRjsKKworCQkJCQl9CisKKwkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5SRUdCQUNhcGFiaWxpdHkud29yZCA9IHBBZGFwdGVyLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LndvcmQ7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6KE9yZGUuQXV0b0JBID0gJWQpIChQb2xpY3k9JWQpKFJlQkFXaW5MaW1pdD0lZCkoVHhCQVdpbkxpbWl0PSVkKShBdXRvTW9kZT0lZClcbiIsT3JkZS5BdXRvQkEsIHBBZGFwdGVyLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlBvbGljeSwKKwkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlJ4QkFXaW5MaW1pdCxwQWRhcHRlci0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5UeEJBV2luTGltaXQsIHBBZGFwdGVyLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkF1dG9CQSkpOworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OihNaW1vUHMgPSAlZCkoQW1zZHVFbmFibGUgPSAlZCkgKEFtc2R1U2l6ZT0lZCkoTXBkdURlbnNpdHk9JWQpXG4iLHBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5Lk1pbW9QcywgcEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQW1zZHVFbmFibGUsCisJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5BbXNkdVNpemUsIHBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5Lk1wZHVEZW5zaXR5KSk7CisJCQkJfQorCisJCQkJYnJlYWs7CisJCWNhc2UgUlRfT0lEXzgwMl8xMV9BRERfSU1NRV9CQToKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiBTZXQgOjogUlRfT0lEXzgwMl8xMV9BRERfSU1NRV9CQSBcbiIpKTsKKwkJCWlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKE9JRF9BRERfQkFfRU5UUlkpKQorCQkJCQlTdGF0dXMgPSAtRUlOVkFMOworCQkJZWxzZQorCQkJeworCQkJCVVDSEFSCQkgICAgICAgIGluZGV4OworCQkJCU9JRF9BRERfQkFfRU5UUlkgICAgQkE7CisJCQkJTUFDX1RBQkxFX0VOVFJZICAgICAqcEVudHJ5OworCisJCQkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJkJBLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJCWlmIChCQS5USUQgPiAxNSkKKwkJCQl7CisJCQkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX0lOVkFMSURfREFUQTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCS8vQkFUYWJsZUluc2VydEVudHJ5CisJCQkJCS8vQXMgYWQtaG9jIG1vZGUsIEJBIHBhaXIgaXMgbm90IGxpbWl0ZWQgdG8gb25seSBCU1NJRC4gc28gYWRkIHZpYSBPSUQuCisJCQkJCWluZGV4ID0gQkEuVElEOworCQkJCQkvLyBpbiBhZCBob2MgbW9kZSwgd2hlbiBhZGRpbmcgQkEgcGFpciwgd2Ugc2hvdWxkIGluc2VydCB0aGlzIGVudHJ5IGludG8gTUFDRW50cnkgdG9vCisJCQkJCXBFbnRyeSA9IE1hY1RhYmxlTG9va3VwKHBBZGFwdGVyLCBCQS5NQUNBZGRyKTsKKwkJCQkJaWYgKCFwRW50cnkpCisJCQkJCXsKKwkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJUX09JRF84MDJfMTFfQUREX0lNTUVfQkEuIGJyZWFrIG9uIG5vIGNvbm5lY3Rpb24uLS0tLToleDoleFxuIiwgQkEuTUFDQWRkcls0XSwgQkEuTUFDQWRkcls1XSkpOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJaWYgKEJBLklzUmVjaXBpZW50ID09IEZBTFNFKQorCQkJCQl7CisJCQkJCSAgICBpZiAocEVudHJ5LT5iSUFtQmFkQXRoZXJvcyA9PSBUUlVFKQorCQkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlJ4QkFXaW5MaW1pdCA9IDB4MTA7CisKKwkJCQkJCUJBT3JpU2Vzc2lvblNldFVwKHBBZGFwdGVyLCBwRW50cnksIGluZGV4LCAwLCAxMDAsIFRSVUUpOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJLy9CQVRhYmxlSW5zZXJ0RW50cnkocEFkYXB0ZXIsIHBFbnRyeS0+QWlkLCBCQS5NQUNBZGRyLCAwLCAweGZmZmYsIEJBLlRJRCwgQkEubk1TRFUsIEJBLklzUmVjaXBpZW50KTsKKwkJCQkJfQorCisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6UlRfT0lEXzgwMl8xMV9BRERfSU1NRV9CQS4gUmVjID0gJWQuIE1hYyA9ICV4OiV4OiV4OiV4OiV4OiV4IC4gXG4iLAorCQkJCQkJQkEuSXNSZWNpcGllbnQsIEJBLk1BQ0FkZHJbMF0sIEJBLk1BQ0FkZHJbMV0sIEJBLk1BQ0FkZHJbMl0sIEJBLk1BQ0FkZHJbMl0KKwkJCQkJCSwgQkEuTUFDQWRkcls0XSwgQkEuTUFDQWRkcls1XSkpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUlRfT0lEXzgwMl8xMV9URUFSX0lNTUVfQkE6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQgOjogUlRfT0lEXzgwMl8xMV9URUFSX0lNTUVfQkEgXG4iKSk7CisJCQlpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihPSURfQUREX0JBX0VOVFJZKSkKKwkJCQkJU3RhdHVzID0gLUVJTlZBTDsKKwkJCWVsc2UKKwkJCXsKKwkJCQlQT0lEX0FERF9CQV9FTlRSWQlwQkE7CisJCQkJTUFDX1RBQkxFX0VOVFJZICpwRW50cnk7CisKKwkJCQlwQkEgPSBrbWFsbG9jKHdycS0+dS5kYXRhLmxlbmd0aCwgTUVNX0FMTE9DX0ZMQUcpOworCisJCQkJaWYgKHBCQSA9PSBOVUxMKQorCQkJCXsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0IDo6IFJUX09JRF84MDJfMTFfVEVBUl9JTU1FX0JBIGttYWxsb2MoKSBjYW4ndCBhbGxvY2F0ZSBlbm91Z2ggbWVtb3J5XG4iKSk7CisJCQkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX0ZBSUxVUkU7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKHBCQSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0IDo6IFJUX09JRF84MDJfMTFfVEVBUl9JTU1FX0JBKFRJRD0lZCwgYkFsbFRpZD0lZClcbiIsIHBCQS0+VElELCBwQkEtPmJBbGxUaWQpKTsKKworCQkJCQlpZiAoIXBCQS0+YkFsbFRpZCAmJiAocEJBLT5USUQgPiBOVU1fT0ZfVElEKSkKKwkJCQkJeworCQkJCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfSU5WQUxJRF9EQVRBOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKworCQkJCQlpZiAocEJBLT5Jc1JlY2lwaWVudCA9PSBGQUxTRSkKKwkJCQkJeworCQkJCQkJcEVudHJ5ID0gTWFjVGFibGVMb29rdXAocEFkYXB0ZXIsIHBCQS0+TUFDQWRkcik7CisJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIgcEJBLT5Jc1JlY2lwaWVudCA9PSBGQUxTRVxuIikpOworCQkJCQkJaWYgKHBFbnRyeSkKKwkJCQkJCXsKKwkJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIgcEJBLT5wRW50cnlcbiIpKTsKKwkJCQkJCQlCQU9yaVNlc3Npb25UZWFyRG93bihwQWRhcHRlciwgcEVudHJ5LT5BaWQsIHBCQS0+VElELCBGQUxTRSwgVFJVRSk7CisJCQkJCQl9CisJCQkJCQllbHNlCisJCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0IDo6IE5vdCBmb3VuZCBwRW50cnkgXG4iKSk7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlwRW50cnkgPSBNYWNUYWJsZUxvb2t1cChwQWRhcHRlciwgcEJBLT5NQUNBZGRyKTsKKwkJCQkJCWlmIChwRW50cnkpCisJCQkJCQl7CisJCQkJCQkJQkFSZWNTZXNzaW9uVGVhckRvd24oIHBBZGFwdGVyLCAoVUNIQVIpcEVudHJ5LT5BaWQsIHBCQS0+VElELCBUUlVFKTsKKwkJCQkJCX0KKwkJCQkJCWVsc2UKKwkJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQgOjogTm90IGZvdW5kIHBFbnRyeSBcbiIpKTsKKwkJCQkJfQorCQkJCQlrZnJlZShwQkEpOworCQkJCX0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisgICAgICAgIC8vIEZvciBXUEFfU1VQUExJQ0FOVCB0byBzZXQgc3RhdGljIHdlcCBrZXkKKyAgICAJY2FzZSBPSURfODAyXzExX0FERF9XRVA6CisgICAgCSAgICBwV2VwS2V5ID0ga21hbGxvYyh3cnEtPnUuZGF0YS5sZW5ndGgsIE1FTV9BTExPQ19GTEFHKTsKKworICAgIAkgICAgaWYocFdlcEtleSA9PSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FTk9NRU07CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX0FERF9XRVAsIEZhaWxlZCEhXG4iKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcihwV2VwS2V5LCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgaWYgKFN0YXR1cykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfQUREX1dFUCwgRmFpbGVkIChsZW5ndGggbWlzbWF0Y2gpISFcbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKwkJICAgICAgICBLZXlJZHggPSBwV2VwS2V5LT5LZXlJbmRleCAmIDB4MGZmZmZmZmY7CisgICAgICAgICAgICAgICAgLy8gS2V5SWR4IG11c3QgYmUgMCB+IDMKKyAgICAgICAgICAgICAgICBpZiAoS2V5SWR4ID4gNCkKKyAgICAJCQl7CisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfQUREX1dFUCwgRmFpbGVkIChLZXlJZHggbXVzdCBiZSBzbWFsbGVyIHRoYW4gNCkhIVxuIikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBVQ0hBUiBDaXBoZXJBbGcgPSAwOworICAgICAgICAgICAgICAgICAgICBQVUNIQVIgS2V5OworCisgICAgICAgICAgICAgICAgICAgIC8vIHNldCBrZXkgbWF0ZXJpYWwgYW5kIGtleSBsZW5ndGgKKyAgICAgICAgICAgICAgICAgICAgTmRpc1plcm9NZW1vcnkocEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLktleSwgMTYpOworICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uS2V5TGVuID0gKFVDSEFSKSBwV2VwS2V5LT5LZXlMZW5ndGg7CisgICAgICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5LZXksICZwV2VwS2V5LT5LZXlNYXRlcmlhbCwgcFdlcEtleS0+S2V5TGVuZ3RoKTsKKworICAgICAgICAgICAgICAgICAgICBzd2l0Y2gocFdlcEtleS0+S2V5TGVuZ3RoKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfQUREX1dFUCwgb25seSBzdXBwb3J0IENJUEhFUl9XRVA2NChsZW46NSkgJiBDSVBIRVJfV0VQMTI4KGxlbjoxMykhIVxuIikpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLkNpcGhlckFsZyA9IENpcGhlckFsZzsKKworICAgICAgICAgICAgICAgICAgICAvLyBEZWZhdWx0IGtleSBmb3IgdHggKHNoYXJlZCBrZXkpCisgICAgICAgICAgICAgICAgICAgIGlmIChwV2VwS2V5LT5LZXlJbmRleCAmIDB4ODAwMDAwMDApCisgICAgICAgICAgICAgICAgICAgIHsKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXQga2V5IG1hdGVyaWFsIGFuZCBrZXkgbGVuZ3RoCisgICAgICAgICAgICAgICAgICAgICAgICBOZGlzWmVyb01lbW9yeShwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZVNoYXJlZEtleVtLZXlJZHhdLktleSwgMTYpOworICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVTaGFyZWRLZXlbS2V5SWR4XS5LZXlMZW4gPSAoVUNIQVIpIHBXZXBLZXktPktleUxlbmd0aDsKKyAgICAgICAgICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlU2hhcmVkS2V5W0tleUlkeF0uS2V5LCAmcFdlcEtleS0+S2V5TWF0ZXJpYWwsIHBXZXBLZXktPktleUxlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZVNoYXJlZEtleUlkID0gS2V5SWR4OworICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVTaGFyZWRLZXlbS2V5SWR4XS5DaXBoZXJBbGcgPSBDaXBoZXJBbGc7CisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWQgPSAoVUNIQVIpIEtleUlkeDsKKyAgICAgICAgICAgICAgICAgICAgfQorCisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorCQkJCQlpZiAoKHBBZGFwdGVyLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQICE9IFdQQV9TVVBQTElDQU5UX0RJU0FCTEUpICYmCisJCQkJCQkocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpKQorCQkJCQl7CisJCQkJCQlLZXkgPSBwV2VwS2V5LT5LZXlNYXRlcmlhbDsKKworCQkJCQkJLy8gU2V0IEdyb3VwIGtleSBtYXRlcmlhbCB0byBBc2ljCisgICAgCQkJCQlBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkYXB0ZXIsIEJTUzAsIEtleUlkeCwgQ2lwaGVyQWxnLCBLZXksIE5VTEwsIE5VTEwpOworCisJCQkJCQkvLyBVcGRhdGUgV0NJRCBhdHRyaWJ1dGUgdGFibGUgYW5kIElWRUlWIHRhYmxlIGZvciB0aGlzIGdyb3VwIGtleSB0YWJsZQorCQkJCQkJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWRhcHRlciwgQlNTMCwgS2V5SWR4LCBDaXBoZXJBbGcsIE5VTEwpOworCisJCQkJCQlTVEFfUE9SVF9TRUNVUkVEKHBBZGFwdGVyKTsKKworICAgICAgICAJCQkJLy8gSW5kaWNhdGUgQ29ubmVjdGVkIGZvciBHVUkKKyAgICAgICAgCQkJCXBBZGFwdGVyLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZUNvbm5lY3RlZDsKKwkJCQkJfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChwQWRhcHRlci0+U3RhQ2ZnLlBvcnRTZWN1cmVkID09IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEKQorI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgS2V5ID0gcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLktleTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2V0IGtleSBtYXRlcmlhbCBhbmQgY2lwaGVyQWxnIHRvIEFzaWMKKyAgICAgICAgCQkJCUFzaWNBZGRTaGFyZWRLZXlFbnRyeShwQWRhcHRlciwgQlNTMCwgS2V5SWR4LCBDaXBoZXJBbGcsIEtleSwgTlVMTCwgTlVMTCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwV2VwS2V5LT5LZXlJbmRleCAmIDB4ODAwMDAwMDApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE1BQ19UQUJMRV9FTlRSWSBwRW50cnkgPSAmcEFkYXB0ZXItPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFzc2lnbiBncm91cCBrZXkgaW5mbworICAgIAkJCQkJCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkocEFkYXB0ZXIsIEJTUzAsIEtleUlkeCwgQ2lwaGVyQWxnLCBOVUxMKTsKKyAgICAJCQkJCQkvLyBBc3NpZ24gcGFpcndpc2Uga2V5IGluZm8KKyAgICAJCQkJCQlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZGFwdGVyLCBCU1MwLCBLZXlJZHgsIENpcGhlckFsZywgcEVudHJ5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfQUREX1dFUCAoaWQ9MHgleCwgTGVuPSVkLWJ5dGUpLCAlc1xuIiwgcFdlcEtleS0+S2V5SW5kZXgsIHBXZXBLZXktPktleUxlbmd0aCwgKHBBZGFwdGVyLT5TdGFDZmcuUG9ydFNlY3VyZWQgPT0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQpID8gIlBvcnQgU2VjdXJlZCI6IlBvcnQgTk9UIFNlY3VyZWQiKSk7CisJCQkJfQorICAgICAgICAgICAgfQorICAgICAgICAgICAga2ZyZWUocFdlcEtleSk7CisgICAgICAgICAgICBicmVhazsKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisJICAgIGNhc2UgT0lEX1NFVF9DT1VOVEVSTUVBU1VSRVM6CisgICAgICAgICAgICBpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihpbnQpKQorICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBlbmFibGVkID0gMDsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmZW5hYmxlZCwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBpZiAoZW5hYmxlZCA9PSAxKQorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLmJCbG9ja0Fzc29jID0gVFJVRTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIC8vIFdQQSBNSUMgZXJyb3Igc2hvdWxkIGJsb2NrIGFzc29jaWF0aW9uIGF0dGVtcHQgZm9yIDYwIHNlY29uZHMKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5iQmxvY2tBc3NvYyA9IEZBTFNFOworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEX1NFVF9DT1VOVEVSTUVBU1VSRVMgYkJsb2NrQXNzb2M9JXNcbiIsIHBBZGFwdGVyLT5TdGFDZmcuYkJsb2NrQXNzb2MgPyAiVFJVRSI6IkZBTFNFIikpOworICAgICAgICAgICAgfQorCSAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlRfT0lEX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQ6CisJCQlpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihVQ0hBUikpCisgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJndwYV9zdXBwbGljYW50X2VuYWJsZSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAJCQlwQWRhcHRlci0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCA9IHdwYV9zdXBwbGljYW50X2VuYWJsZTsKKyAgICAJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OlJUX09JRF9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUICg9JWQpXG4iLCBwQWRhcHRlci0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCkpOworCQkJfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9ERUFVVEhFTlRJQ0FUSU9OOgorICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoTUxNRV9ERUFVVEhfUkVRX1NUUlVDVCkpCisgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTUxNRV9ERUFVVEhfUkVRX1NUUlVDVCAgICAgICpwSW5mbzsKKwkJCQlNTE1FX1FVRVVFX0VMRU0gKk1zZ0VsZW0gPSAoTUxNRV9RVUVVRV9FTEVNICopIGttYWxsb2Moc2l6ZW9mKE1MTUVfUVVFVUVfRUxFTSksIE1FTV9BTExPQ19GTEFHKTsKKworICAgICAgICAgICAgICAgIHBJbmZvID0gKE1MTUVfREVBVVRIX1JFUV9TVFJVQ1QgKikgTXNnRWxlbS0+TXNnOworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKHBJbmZvLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgICAgIE1sbWVEZWF1dGhSZXFBY3Rpb24ocEFkYXB0ZXIsIE1zZ0VsZW0pOworCQkJCWtmcmVlKE1zZ0VsZW0pOworCisgICAgICAgICAgICAgICAgaWYgKElORlJBX09OKHBBZGFwdGVyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIExpbmtEb3duKHBBZGFwdGVyLCBGQUxTRSk7CisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUgPSBBU1NPQ19JRExFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfREVBVVRIRU5USUNBVElPTiAoUmVhc29uPSVkKVxuIiwgcEluZm8tPlJlYXNvbikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9EUk9QX1VORU5DUllQVEVEOgorICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoaW50KSkKKyAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgZW5hYmxlZCA9IDA7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJmVuYWJsZWQsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgaWYgKGVuYWJsZWQgPT0gMSkKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9OT1RfU0VDVVJFRDsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRDsKKwkJCQlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWRhcHRlci0+TWFjVGFiTG9jayk7CisJCQkJcEFkYXB0ZXItPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlBvcnRTZWN1cmVkID0gcEFkYXB0ZXItPlN0YUNmZy5Qb3J0U2VjdXJlZDsKKwkJCQlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWRhcHRlci0+TWFjVGFiTG9jayk7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX0RST1BfVU5FTkNSWVBURUQgKD0lZClcbiIsIGVuYWJsZWQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfU0VUX0lFRUU4MDIxWDoKKyAgICAgICAgICAgIGlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKEJPT0xFQU4pKQorICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZJRUVFODAyMXhTdGF0ZSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLklFRUU4MDIxWCA9IElFRUU4MDIxeFN0YXRlOworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9TRVRfSUVFRTgwMjFYICg9JWQpXG4iLCBJRUVFODAyMXhTdGF0ZSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9TRVRfSUVFRTgwMjFYX1JFUVVJUkVfS0VZOgorCQkJaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoQk9PTEVBTikpCisJCQkJIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZJRUVFODAyMXhfcmVxdWlyZWRfa2V5cywgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCQlwQWRhcHRlci0+U3RhQ2ZnLklFRUU4MDIxeF9yZXF1aXJlZF9rZXlzID0gSUVFRTgwMjF4X3JlcXVpcmVkX2tleXM7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX1NFVF9JRUVFODAyMVhfUkVRVUlSRV9LRVkgKCVkKVxuIiwgSUVFRTgwMjF4X3JlcXVpcmVkX2tleXMpKTsKKwkJCX0KKwkJCWJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfUE1LSUQ6CisJICAgICAgICBwUG1rSWQgPSBrbWFsbG9jKHdycS0+dS5kYXRhLmxlbmd0aCwgTUVNX0FMTE9DX0ZMQUcpOworCisJICAgICAgICBpZihwUG1rSWQgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FTk9NRU07CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcihwUG1rSWQsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisKKwkgICAgICAgIC8vIGNoZWNrIHRoZSBQTUtJRCBpbmZvcm1hdGlvbgorCSAgICAgICAgaWYgKHBQbWtJZC0+QlNTSURJbmZvQ291bnQgPT0gMCkKKyAgICAgICAgICAgICAgICBOZGlzWmVyb01lbW9yeShwQWRhcHRlci0+U3RhQ2ZnLlNhdmVkUE1LLCBzaXplb2YoQlNTSURfSU5GTykqUE1LSURfTk8pOworCSAgICAgICAgZWxzZQorCSAgICAgICAgeworCQkgICAgICAgIFBCU1NJRF9JTkZPCXBCc3NJZEluZm87CisJCSAgICAgICAgVUlOVAkJQnNzSWR4OworCQkgICAgICAgIFVJTlQJCUNhY2hlZElkeDsKKworCQkgICAgICAgIGZvciAoQnNzSWR4ID0gMDsgQnNzSWR4IDwgcFBta0lkLT5CU1NJREluZm9Db3VudDsgQnNzSWR4KyspCisJCSAgICAgICAgeworCQkJICAgICAgICAvLyBwb2ludCB0byB0aGUgaW5kZXhlZCBCU1NJRF9JTkZPIHN0cnVjdHVyZQorCQkJICAgICAgICBwQnNzSWRJbmZvID0gKFBCU1NJRF9JTkZPKSAoKFBVQ0hBUikgcFBta0lkICsgMiAqIHNpemVvZihVSU5UKSArIEJzc0lkeCAqIHNpemVvZihCU1NJRF9JTkZPKSk7CisJCQkgICAgICAgIC8vIEZpbmQgdGhlIGVudHJ5IGluIHRoZSBzYXZlZCBkYXRhIGJhc2UuCisJCQkgICAgICAgIGZvciAoQ2FjaGVkSWR4ID0gMDsgQ2FjaGVkSWR4IDwgcEFkYXB0ZXItPlN0YUNmZy5TYXZlZFBNS051bTsgQ2FjaGVkSWR4KyspCisJCQkgICAgICAgIHsKKwkJCQkgICAgICAgIC8vIGNvbXBhcmUgdGhlIEJTU0lECisJCQkJICAgICAgICBpZiAoTmRpc0VxdWFsTWVtb3J5KHBCc3NJZEluZm8tPkJTU0lELCBwQWRhcHRlci0+U3RhQ2ZnLlNhdmVkUE1LW0NhY2hlZElkeF0uQlNTSUQsIHNpemVvZihORElTXzgwMl8xMV9NQUNfQUREUkVTUykpKQorCQkJCQkgICAgICAgIGJyZWFrOworCQkJICAgICAgICB9CisKKwkJCSAgICAgICAgLy8gRm91bmQsIHJlcGxhY2UgaXQKKwkJCSAgICAgICAgaWYgKENhY2hlZElkeCA8IFBNS0lEX05PKQorCQkJICAgICAgICB7CisJCQkJICAgICAgICBEQkdQUklOVChSVF9ERUJVR19PRkYsICgiVXBkYXRlIE9JRF84MDJfMTFfUE1LSUQsIGlkeCA9ICVkXG4iLCBDYWNoZWRJZHgpKTsKKwkJCQkgICAgICAgIE5kaXNNb3ZlTWVtb3J5KCZwQWRhcHRlci0+U3RhQ2ZnLlNhdmVkUE1LW0NhY2hlZElkeF0sIHBCc3NJZEluZm8sIHNpemVvZihCU1NJRF9JTkZPKSk7CisJCQkJICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLlNhdmVkUE1LTnVtKys7CisJCQkgICAgICAgIH0KKwkJCSAgICAgICAgLy8gTm90IGZvdW5kLCByZXBsYWNlIHRoZSBsYXN0IG9uZQorCQkJICAgICAgICBlbHNlCisJCQkgICAgICAgIHsKKwkJCQkgICAgICAgIC8vIFJhbmRvbWx5IHJlcGxhY2Ugb25lCisJCQkJICAgICAgICBDYWNoZWRJZHggPSAocEJzc0lkSW5mby0+QlNTSURbNV0gJSBQTUtJRF9OTyk7CisJCQkJICAgICAgICBEQkdQUklOVChSVF9ERUJVR19PRkYsICgiVXBkYXRlIE9JRF84MDJfMTFfUE1LSUQsIGlkeCA9ICVkXG4iLCBDYWNoZWRJZHgpKTsKKwkJCQkgICAgICAgIE5kaXNNb3ZlTWVtb3J5KCZwQWRhcHRlci0+U3RhQ2ZnLlNhdmVkUE1LW0NhY2hlZElkeF0sIHBCc3NJZEluZm8sIHNpemVvZihCU1NJRF9JTkZPKSk7CisJCQkgICAgICAgIH0KKwkJICAgICAgICB9CisJCQl9CisJCQlpZihwUG1rSWQpCisJCQkJa2ZyZWUocFBta0lkKTsKKwkgICAgICAgIGJyZWFrOworI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKworCisKKyNpZmRlZiBTTk1QX1NVUFBPUlQKKwkJY2FzZSBPSURfODAyXzExX1NIT1JUUkVUUllMSU1JVDoKKwkJCWlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKFVMT05HKSkKKwkJCQlTdGF0dXMgPSAtRUlOVkFMOworCQkJZWxzZQorCQkJeworCQkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZTaG9ydFJldHJ5TGltaXQsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQkJUlRNUF9JT19SRUFEMzIocEFkYXB0ZXIsIFRYX1JUWV9DRkcsICZ0eF9ydHlfY2ZnLndvcmQpOworCQkJCXR4X3J0eV9jZmcuZmllbGQuU2hvcnRSdHlMaW1pdCA9IFNob3J0UmV0cnlMaW1pdDsKKwkJCQlSVE1QX0lPX1dSSVRFMzIocEFkYXB0ZXIsIFRYX1JUWV9DRkcsIHR4X3J0eV9jZmcud29yZCk7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX1NIT1JUUkVUUllMSU1JVCAodHhfcnR5X2NmZy5maWVsZC5TaG9ydFJldHJ5TGltaXQ9JWQsIFNob3J0UmV0cnlMaW1pdD0lbGQpXG4iLCB0eF9ydHlfY2ZnLmZpZWxkLlNob3J0UnR5TGltaXQsIFNob3J0UmV0cnlMaW1pdCkpOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfODAyXzExX0xPTkdSRVRSWUxJTUlUOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX0xPTkdSRVRSWUxJTUlUIFxuIikpOworCQkJaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoVUxPTkcpKQorCQkJCVN0YXR1cyA9IC1FSU5WQUw7CisJCQllbHNlCisJCQl7CisJCQkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJkxvbmdSZXRyeUxpbWl0LCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJCVJUTVBfSU9fUkVBRDMyKHBBZGFwdGVyLCBUWF9SVFlfQ0ZHLCAmdHhfcnR5X2NmZy53b3JkKTsKKwkJCQl0eF9ydHlfY2ZnLmZpZWxkLkxvbmdSdHlMaW1pdCA9IExvbmdSZXRyeUxpbWl0OworCQkJCVJUTVBfSU9fV1JJVEUzMihwQWRhcHRlciwgVFhfUlRZX0NGRywgdHhfcnR5X2NmZy53b3JkKTsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfTE9OR1JFVFJZTElNSVQgKHR4X3J0eV9jZmcuZmllbGQuTG9uZ1JldHJ5TGltaXQ9ICVkLExvbmdSZXRyeUxpbWl0PSVsZClcbiIsIHR4X3J0eV9jZmcuZmllbGQuTG9uZ1J0eUxpbWl0LCBMb25nUmV0cnlMaW1pdCkpOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfODAyXzExX1dFUERFRkFVTFRLRVlWQUxVRToKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9XRVBERUZBVUxUS0VZVkFMVUVcbiIpKTsKKwkJCXBLZXkgPSBrbWFsbG9jKHdycS0+dS5kYXRhLmxlbmd0aCwgR0ZQX0tFUk5FTCk7CisJCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcihwS2V5LCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJLy9wS2V5ID0gJldlcEtleTsKKworCQkJaWYgKCBwS2V5LT5MZW5ndGggIT0gd3JxLT51LmRhdGEubGVuZ3RoKQorCQkJeworCQkJCVN0YXR1cyA9IC1FSU5WQUw7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX1dFUERFRkFVTFRLRVlWQUxVRSwgRmFpbGVkISFcbiIpKTsKKwkJCX0KKwkJCUtleUlkeCA9IHBLZXktPktleUluZGV4ICYgMHgwZmZmZmZmZjsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgicEtleS0+S2V5SW5kZXggPSVkLCBwS2V5LT5LZXlMZW5ndGg9JWRcbiIsIHBLZXktPktleUluZGV4LCBwS2V5LT5LZXlMZW5ndGgpKTsKKworCQkJLy8gaXQgaXMgYSBzaGFyZWQga2V5CisJCQlpZiAoS2V5SWR4ID4gNCkKKwkJCQlTdGF0dXMgPSAtRUlOVkFMOworCQkJZWxzZQorCQkJeworCQkJCXBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWRdLktleUxlbiA9IChVQ0hBUikgcEtleS0+S2V5TGVuZ3RoOworCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW3BBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5LZXksICZwS2V5LT5LZXlNYXRlcmlhbCwgcEtleS0+S2V5TGVuZ3RoKTsKKwkJCQlpZiAocEtleS0+S2V5SW5kZXggJiAweDgwMDAwMDAwKQorCQkJCXsKKwkJCQkJLy8gRGVmYXVsdCBrZXkgZm9yIHR4IChzaGFyZWQga2V5KQorCQkJCQlwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCA9IChVQ0hBUikgS2V5SWR4OworCQkJCX0KKwkJCQkvL1Jlc3RhcnRBUElzUmVxdWlyZWQgPSBUUlVFOworCQkJfQorCQkJYnJlYWs7CisKKworCQljYXNlIE9JRF84MDJfMTFfV0VQREVGQVVMVEtFWUlEOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX1dFUERFRkFVTFRLRVlJRCBcbiIpKTsKKworCQkJaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoVUNIQVIpKQorCQkJCVN0YXR1cyA9IC1FSU5WQUw7CisJCQllbHNlCisJCQkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJnBBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCisJCQlicmVhazsKKworCisJCWNhc2UgT0lEXzgwMl8xMV9DVVJSRU5UQ0hBTk5FTDoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9DVVJSRU5UQ0hBTk5FTCBcbiIpKTsKKwkJCWlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKFVDSEFSKSkKKwkJCQlTdGF0dXMgPSAtRUlOVkFMOworCQkJZWxzZQorCQkJeworCQkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZjdG1wLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJCXNwcmludGYoJmN0bXAsIiVkIiwgY3RtcCk7CisJCQkJU2V0X0NoYW5uZWxfUHJvYyhwQWRhcHRlciwgJmN0bXApOworCQkJfQorCQkJYnJlYWs7CisjZW5kaWYKKworCisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6dW5rbm93biBJT0NUTCdzIHN1YmNtZCA9IDB4JTA4eFxuIiwgY21kKSk7CisgICAgICAgICAgICBTdGF0dXMgPSAtRU9QTk9UU1VQUDsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworCisgICAgcmV0dXJuIFN0YXR1czsKK30KKworSU5UIFJUTVBRdWVyeUluZm9ybWF0aW9uKAorICAgIElOICBQUlRNUF9BREFQVEVSIHBBZGFwdGVyLAorICAgIElOICBPVVQgc3RydWN0IGlmcmVxICAgICpycSwKKyAgICBJTiAgSU5UICAgICAgICAgICAgICAgICBjbWQpCit7CisgICAgc3RydWN0IGl3cmVxICAgICAgICAgICAgICAgICAgICAgICAgKndycSA9IChzdHJ1Y3QgaXdyZXEgKikgcnE7CisgICAgTkRJU184MDJfMTFfQlNTSURfTElTVF9FWCAgICAgICAgICAgKnBCc3NpZExpc3QgPSBOVUxMOworICAgIFBORElTX1dMQU5fQlNTSURfRVggICAgICAgICAgICAgICAgIHBCc3M7CisgICAgTkRJU184MDJfMTFfU1NJRCAgICAgICAgICAgICAgICAgICAgU3NpZDsKKyAgICBORElTXzgwMl8xMV9DT05GSUdVUkFUSU9OICAgICAgICAgICAqcENvbmZpZ3VyYXRpb24gPSBOVUxMOworICAgIFJUXzgwMl8xMV9MSU5LX1NUQVRVUyAgICAgICAgICAgICAgICpwTGlua1N0YXR1cyA9IE5VTEw7CisgICAgUlRfODAyXzExX1NUQV9DT05GSUcgICAgICAgICAgICAgICAgKnBTdGFDb25maWcgPSBOVUxMOworICAgIE5ESVNfODAyXzExX1NUQVRJU1RJQ1MgICAgICAgICAgICAgICpwU3RhdGlzdGljcyA9IE5VTEw7CisgICAgTkRJU184MDJfMTFfUlRTX1RIUkVTSE9MRCAgICAgICAgICAgUnRzVGhyZXNoOworICAgIE5ESVNfODAyXzExX0ZSQUdNRU5UQVRJT05fVEhSRVNIT0xEIEZyYWdUaHJlc2g7CisgICAgTkRJU184MDJfMTFfUE9XRVJfTU9ERSAgICAgICAgICAgICAgUG93ZXJNb2RlOworICAgIE5ESVNfODAyXzExX05FVFdPUktfSU5GUkFTVFJVQ1RVUkUgIEJzc1R5cGU7CisgICAgUlRfODAyXzExX1BSRUFNQkxFICAgICAgICAgICAgICAgICAgUHJlYW1UeXBlOworICAgIE5ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREUgICAgIEF1dGhNb2RlOworICAgIE5ESVNfODAyXzExX1dFUF9TVEFUVVMgICAgICAgICAgICAgIFdlcFN0YXR1czsKKyAgICBORElTX01FRElBX1NUQVRFICAgICAgICAgICAgICAgICAgICBNZWRpYVN0YXRlOworICAgIFVMT05HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJzc0J1ZlNpemUsIHVsSW5mbz0wLCBOZXR3b3JrVHlwZUxpc3RbNF0sIGFwc2QgPSAwOworICAgIFVTSE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJzc0xlbiA9IDA7CisgICAgUFVDSEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJ1ZiA9IE5VTEwsIHBQdHI7CisgICAgSU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKyAgICBVSU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZV92ZXJzaW9uX2NvbXBpbGVkOworICAgIFVDSEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksIFBhZGRpbmcgPSAwOworICAgIEJPT0xFQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJhZGlvU3RhdGU7CisJVUNIQVIJZHJpdmVyVmVyc2lvbls4XTsKKyAgICBPSURfU0VUX0hUX1BIWU1PREUJCQkgICAgICAgICpwSFRQaHlNb2RlID0gTlVMTDsKKworCisjaWZkZWYgU05NUF9TVVBQT1JUCisJLy9mb3Igc25tcCwga2F0aHkKKwlEZWZhdWx0S2V5SWR4VmFsdWUJCQkqcEtleUlkeFZhbHVlOworCUlOVAkJCQkJCQl2YWx1ZUxlbjsKKwlUWF9SVFlfQ0ZHX1NUUlVDCQkJdHhfcnR5X2NmZzsKKwlVTE9ORwkJCQkJCVNob3J0UmV0cnlMaW1pdCwgTG9uZ1JldHJ5TGltaXQ7CisJVUNIQVIJCQkJCQl0bXBbNjRdOworI2VuZGlmIC8vU05NUAorCisgICAgc3dpdGNoKGNtZCkKKyAgICB7CisgICAgICAgIGNhc2UgUlRfT0lEX0RFVklDRV9OQU1FOgorICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFNUQV9OSUNfREVWSUNFX05BTUUpOworICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIFNUQV9OSUNfREVWSUNFX05BTUUsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSVF9PSURfVkVSU0lPTl9JTkZPOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF9WRVJTSU9OX0lORk8gXG4iKSk7CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSA4KnNpemVvZihVQ0hBUik7CisJCQlzcHJpbnRmKCZkcml2ZXJWZXJzaW9uWzBdLCAiJXMiLCBTVEFfRFJJVkVSX1ZFUlNJT04pOworCQkJZHJpdmVyVmVyc2lvbls3XSA9ICdcMCc7CisJCQlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZkcml2ZXJWZXJzaW9uLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgeworCQkJCVN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyNpZmRlZiBSQUxJTktfQVRFCisJCWNhc2UgUlRfUVVFUllfQVRFX1RYRE9ORV9DT1VOVDoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9RVUVSWV9BVEVfVFhET05FX0NPVU5UIFxuIikpOworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFVJTlQzMik7CisJCQlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZwQWRhcHRlci0+YXRlLlR4RG9uZUNvdW50LCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorCQkJeworCQkJCVN0YXR1cyA9IC1FRkFVTFQ7CisJCQl9CisJCQlicmVhazsKKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9CU1NJRF9MSVNUOgorICAgICAgICAgICAgaWYgKFJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkvKgorICAgICAgICAgICAgCSAqIFN0aWxsIHNjYW5uaW5nLCBpbmRpY2F0ZSB0aGUgY2FsbGVyIHNob3VsZCB0cnkgYWdhaW4uCisgICAgICAgICAgICAJICovCisgICAgICAgICAgICAJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfQlNTSURfTElTVCAoU3RpbGwgc2Nhbm5pbmcpXG4iKSk7CisJCQkJcmV0dXJuIC1FQUdBSU47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9CU1NJRF9MSVNUICglZCBCU1MgcmV0dXJuZWQpXG4iLHBBZGFwdGVyLT5TY2FuVGFiLkJzc05yKSk7CisJCQlwQWRhcHRlci0+U3RhQ2ZnLmJTY2FuUmVxSXNGcm9tV2ViVUkgPSBGQUxTRTsKKyAgICAgICAgICAgIC8vIENsYWN1bGF0ZSB0b3RhbCBidWZmZXIgc2l6ZSByZXF1aXJlZAorICAgICAgICAgICAgQnNzQnVmU2l6ZSA9IHNpemVvZihVTE9ORyk7CisKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwQWRhcHRlci0+U2NhblRhYi5Cc3NOcjsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIEFsaWduIHBvaW50ZXIgdG8gNCBieXRlcyBib3VuZGFyeS4KKyAgICAgICAgICAgICAgICAvL1BhZGRpbmcgPSA0IC0gKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlZhcklFTGVuICYgMHgwMDAzKTsKKyAgICAgICAgICAgICAgICAvL2lmIChQYWRkaW5nID09IDQpCisgICAgICAgICAgICAgICAgLy8gICAgUGFkZGluZyA9IDA7CisgICAgICAgICAgICAgICAgQnNzQnVmU2l6ZSArPSAoc2l6ZW9mKE5ESVNfV0xBTl9CU1NJRF9FWCkgLSAxICsgc2l6ZW9mKE5ESVNfODAyXzExX0ZJWEVEX0lFcykgKyBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5WYXJJRUxlbiArIFBhZGRpbmcpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBGb3Igc2FmZXR5IGlzc3VlLCB3ZSBhZGQgMjU2IGJ5dGVzIGp1c3QgaW4gY2FzZQorICAgICAgICAgICAgQnNzQnVmU2l6ZSArPSAyNTY7CisgICAgICAgICAgICAvLyBBbGxvY2F0ZSB0aGUgc2FtZSBzaXplIGFzIHBhc3NlZCBmcm9tIGhpZ2hlciBsYXllcgorICAgICAgICAgICAgcEJ1ZiA9IGttYWxsb2MoQnNzQnVmU2l6ZSwgTUVNX0FMTE9DX0ZMQUcpOworICAgICAgICAgICAgaWYocEJ1ZiA9PSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FTk9NRU07CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBJbml0IDgwMl8xMV9CU1NJRF9MSVNUX0VYIHN0cnVjdHVyZQorICAgICAgICAgICAgTmRpc1plcm9NZW1vcnkocEJ1ZiwgQnNzQnVmU2l6ZSk7CisgICAgICAgICAgICBwQnNzaWRMaXN0ID0gKFBORElTXzgwMl8xMV9CU1NJRF9MSVNUX0VYKSBwQnVmOworICAgICAgICAgICAgcEJzc2lkTGlzdC0+TnVtYmVyT2ZJdGVtcyA9IHBBZGFwdGVyLT5TY2FuVGFiLkJzc05yOworCisgICAgICAgICAgICAvLyBDYWxjdWxhdGUgdG90YWwgYnVmZmVyIGxlbmd0aAorICAgICAgICAgICAgQnNzTGVuID0gNDsgLy8gQ29uc2lzdCBvZiBOdW1iZXJPZkl0ZW1zCisgICAgICAgICAgICAvLyBQb2ludCB0byBzdGFydCBvZiBORElTX1dMQU5fQlNTSURfRVgKKyAgICAgICAgICAgIC8vIHBQdHIgPSBwQnVmICsgc2l6ZW9mKFVMT05HKTsKKyAgICAgICAgICAgIHBQdHIgPSAoUFVDSEFSKSAmcEJzc2lkTGlzdC0+QnNzaWRbMF07CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcEFkYXB0ZXItPlNjYW5UYWIuQnNzTnI7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwQnNzID0gKFBORElTX1dMQU5fQlNTSURfRVgpIHBQdHI7CisgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkoJnBCc3MtPk1hY0FkZHJlc3MsICZwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Cc3NpZCwgTUFDX0FERFJfTEVOKTsKKyAgICAgICAgICAgICAgICBpZiAoKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkhpZGRlbiA9PSAxKSAmJiAocEFkYXB0ZXItPlN0YUNmZy5iU2hvd0hpZGRlblNTSUQgPT0gRkFMU0UpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8KKwkJCQkJLy8gV2UgbXVzdCByZXR1cm4gdGhpcyBTU0lEIGR1cmluZyA0d2F5IGhhbmRzaGFraW5nLCBvdGhlcndpc2UgQWVnaXMgd2lsbCBmYWlsZWQgdG8gcGFyc2UgV1BBIGluZm9tYXRpb24KKwkJCQkJLy8gYW5kIHRoZW4gZmFpbGVkIHRvIHNlbmQgRUFQT2wgZmFyYW1lLgorCQkJCQkvLworCQkJCQlpZiAoKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKSAmJiAocEFkYXB0ZXItPlN0YUNmZy5Qb3J0U2VjdXJlZCAhPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRCkpCisJCQkJCXsKKwkJCQkJCXBCc3MtPlNzaWQuU3NpZExlbmd0aCA9IHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlNzaWRMZW47CisJCQkJCQlOZGlzTW92ZU1lbW9yeShwQnNzLT5Tc2lkLlNzaWQsIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlNzaWQsIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlNzaWRMZW4pOworCQkJCQl9CisJCQkJCWVsc2UKKyAgICAgICAgICAgICAgICAgICAgCXBCc3MtPlNzaWQuU3NpZExlbmd0aCA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBCc3MtPlNzaWQuU3NpZExlbmd0aCA9IHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlNzaWRMZW47CisgICAgICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBCc3MtPlNzaWQuU3NpZCwgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uU3NpZCwgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uU3NpZExlbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBCc3MtPlByaXZhY3kgPSBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Qcml2YWN5OworICAgICAgICAgICAgICAgIHBCc3MtPlJzc2kgPSBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Sc3NpIC0gcEFkYXB0ZXItPkJicFJzc2lUb0RibURlbHRhOworICAgICAgICAgICAgICAgIHBCc3MtPk5ldHdvcmtUeXBlSW5Vc2UgPSBOZXR3b3JrVHlwZUluVXNlU2FuaXR5KCZwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXSk7CisgICAgICAgICAgICAgICAgcEJzcy0+Q29uZmlndXJhdGlvbi5MZW5ndGggPSBzaXplb2YoTkRJU184MDJfMTFfQ09ORklHVVJBVElPTik7CisgICAgICAgICAgICAgICAgcEJzcy0+Q29uZmlndXJhdGlvbi5CZWFjb25QZXJpb2QgPSBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5CZWFjb25QZXJpb2Q7CisgICAgICAgICAgICAgICAgcEJzcy0+Q29uZmlndXJhdGlvbi5BVElNV2luZG93ID0gcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uQXRpbVdpbjsKKworICAgICAgICAgICAgICAgIE1BUF9DSEFOTkVMX0lEX1RPX0tIWihwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5DaGFubmVsLCBwQnNzLT5Db25maWd1cmF0aW9uLkRTQ29uZmlnKTsKKworICAgICAgICAgICAgICAgIGlmIChwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Cc3NUeXBlID09IEJTU19JTkZSQSkKKyAgICAgICAgICAgICAgICAgICAgcEJzcy0+SW5mcmFzdHJ1Y3R1cmVNb2RlID0gTmRpczgwMl8xMUluZnJhc3RydWN0dXJlOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcEJzcy0+SW5mcmFzdHJ1Y3R1cmVNb2RlID0gTmRpczgwMl8xMUlCU1M7CisKKyAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQnNzLT5TdXBwb3J0ZWRSYXRlcywgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uU3VwUmF0ZSwgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uU3VwUmF0ZUxlbik7CisgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEJzcy0+U3VwcG9ydGVkUmF0ZXMgKyBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5TdXBSYXRlTGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkV4dFJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uRXh0UmF0ZUxlbik7CisKKyAgICAgICAgICAgICAgICBpZiAocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uVmFySUVMZW4gPT0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBCc3MtPklFTGVuZ3RoID0gc2l6ZW9mKE5ESVNfODAyXzExX0ZJWEVEX0lFcyk7CisgICAgICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBCc3MtPklFcywgJnBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkZpeElFcywgc2l6ZW9mKE5ESVNfODAyXzExX0ZJWEVEX0lFcykpOworICAgICAgICAgICAgICAgICAgICBwUHRyID0gcFB0ciArIHNpemVvZihORElTX1dMQU5fQlNTSURfRVgpIC0gMSArIHNpemVvZihORElTXzgwMl8xMV9GSVhFRF9JRXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwQnNzLT5JRUxlbmd0aCA9IChVTE9ORykoc2l6ZW9mKE5ESVNfODAyXzExX0ZJWEVEX0lFcykgKyBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5WYXJJRUxlbik7CisgICAgICAgICAgICAgICAgICAgIHBQdHIgPSBwUHRyICsgc2l6ZW9mKE5ESVNfV0xBTl9CU1NJRF9FWCkgLSAxICsgc2l6ZW9mKE5ESVNfODAyXzExX0ZJWEVEX0lFcyk7CisgICAgICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBCc3MtPklFcywgJnBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkZpeElFcywgc2l6ZW9mKE5ESVNfODAyXzExX0ZJWEVEX0lFcykpOworICAgICAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQnNzLT5JRXMgKyBzaXplb2YoTkRJU184MDJfMTFfRklYRURfSUVzKSwgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uVmFySUVzLCBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5WYXJJRUxlbik7CisgICAgICAgICAgICAgICAgICAgIHBQdHIgKz0gcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uVmFySUVMZW47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBCc3MtPkxlbmd0aCA9IChVTE9ORykoc2l6ZW9mKE5ESVNfV0xBTl9CU1NJRF9FWCkgLSAxICsgc2l6ZW9mKE5ESVNfODAyXzExX0ZJWEVEX0lFcykgKyBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5WYXJJRUxlbiArIFBhZGRpbmcpOworCisjaWYgV0lSRUxFU1NfRVhUIDwgMTcKKyAgICAgICAgICAgICAgICBpZiAoKEJzc0xlbiArIHBCc3MtPkxlbmd0aCkgPCB3cnEtPnUuZGF0YS5sZW5ndGgpCisgICAgICAgICAgICAgICAgQnNzTGVuICs9IHBCc3MtPkxlbmd0aDsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwQnNzaWRMaXN0LT5OdW1iZXJPZkl0ZW1zID0gaTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgICAgICAgICBCc3NMZW4gKz0gcEJzcy0+TGVuZ3RoOworI2VuZGlmCisgICAgICAgICAgICB9CisKKyNpZiBXSVJFTEVTU19FWFQgPCAxNworICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gQnNzTGVuOworI2Vsc2UKKyAgICAgICAgICAgIGlmIChCc3NMZW4gPiB3cnEtPnUuZGF0YS5sZW5ndGgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAga2ZyZWUocEJzc2lkTGlzdCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FMkJJRzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBCc3NMZW47CisjZW5kaWYKKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwQnNzaWRMaXN0LCBCc3NMZW4pOworICAgICAgICAgICAga2ZyZWUocEJzc2lkTGlzdCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzNfQ1VSUkVOVF9BRERSRVNTOgorICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gTUFDX0FERFJfTEVOOworICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZwQWRhcHRlci0+Q3VycmVudEFkZHJlc3MsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfR0VOX01FRElBX0NPTk5FQ1RfU1RBVFVTOgorICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPT0gTmRpc01lZGlhU3RhdGVDb25uZWN0ZWQpCisgICAgICAgICAgICAgICAgTWVkaWFTdGF0ZSA9IE5kaXNNZWRpYVN0YXRlQ29ubmVjdGVkOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIE1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZURpc2Nvbm5lY3RlZDsKKworICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKE5ESVNfTUVESUFfU1RBVEUpOworICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZNZWRpYVN0YXRlLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9CU1NJRDoKKyNpZmRlZiBSQUxJTktfQVRFCisJCQlpZiAoQVRFX09OKHBBZGFwdGVyKSkKKwkJCXsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJUaGUgZHJpdmVyIGlzIGluIEFURSBtb2RlIG5vd1xuIikpOworCQkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1JFU09VUkNFUzsKKwkJCQlicmVhazsKKwkJCX0KKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisgICAgICAgICAgICBpZiAoSU5GUkFfT04ocEFkYXB0ZXIpIHx8IEFESE9DX09OKHBBZGFwdGVyKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnBBZGFwdGVyLT5Db21tb25DZmcuQnNzaWQsIHNpemVvZihORElTXzgwMl8xMV9NQUNfQUREUkVTUykpOworCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfQlNTSUQoPUVNUFRZKVxuIikpOworICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FTk9UQ09OTjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfU1NJRDoKKwkJCU5kaXNaZXJvTWVtb3J5KCZTc2lkLCBzaXplb2YoTkRJU184MDJfMTFfU1NJRCkpOworCQkJTmRpc1plcm9NZW1vcnkoU3NpZC5Tc2lkLCBNQVhfTEVOX09GX1NTSUQpOworICAgICAgICAgICAgU3NpZC5Tc2lkTGVuZ3RoID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5Tc2lkTGVuOworCQkJbWVtY3B5KFNzaWQuU3NpZCwgcEFkYXB0ZXItPkNvbW1vbkNmZy5Tc2lkLAlTc2lkLlNzaWRMZW5ndGgpOworICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKE5ESVNfODAyXzExX1NTSUQpOworICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZTc2lkLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfU1NJRCAoTGVuPSVkLCBzc2lkPSVzKVxuIiwgU3NpZC5Tc2lkTGVuZ3RoLFNzaWQuU3NpZCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9RVUVSWV9MSU5LX1NUQVRVUzoKKyAgICAgICAgICAgIHBMaW5rU3RhdHVzID0gKFJUXzgwMl8xMV9MSU5LX1NUQVRVUyAqKSBrbWFsbG9jKHNpemVvZihSVF84MDJfMTFfTElOS19TVEFUVVMpLCBNRU1fQUxMT0NfRkxBRyk7CisgICAgICAgICAgICBpZiAocExpbmtTdGF0dXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcExpbmtTdGF0dXMtPkN1cnJUeFJhdGUgPSBSYXRlSWRUbzUwMEticHNbcEFkYXB0ZXItPkNvbW1vbkNmZy5UeFJhdGVdOyAgIC8vIHVuaXQgOiA1MDAga2JwcworICAgICAgICAgICAgICAgIHBMaW5rU3RhdHVzLT5DaGFubmVsUXVhbGl0eSA9IHBBZGFwdGVyLT5NbG1lLkNoYW5uZWxRdWFsaXR5OworICAgICAgICAgICAgICAgIHBMaW5rU3RhdHVzLT5SeEJ5dGVDb3VudCA9IHBBZGFwdGVyLT5SYWxpbmtDb3VudGVycy5SZWNlaXZlZEJ5dGVDb3VudDsKKyAgICAgICAgICAgICAgICBwTGlua1N0YXR1cy0+VHhCeXRlQ291bnQgPSBwQWRhcHRlci0+UmFsaW5rQ291bnRlcnMuVHJhbnNtaXR0ZWRCeXRlQ291bnQ7CisgICAgICAgIAkJcExpbmtTdGF0dXMtPkNlbnRyYWxDaGFubmVsID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbDsKKyAgICAgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoUlRfODAyXzExX0xJTktfU1RBVFVTKTsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcExpbmtTdGF0dXMsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICAgICAga2ZyZWUocExpbmtTdGF0dXMpOworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1FVRVJZX0xJTktfU1RBVFVTXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfUVVFUllfTElOS19TVEFUVVMoa21hbGxvYyBmYWlsZWQpXG4iKSk7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfQ09ORklHVVJBVElPTjoKKyAgICAgICAgICAgIHBDb25maWd1cmF0aW9uID0gKE5ESVNfODAyXzExX0NPTkZJR1VSQVRJT04gKikga21hbGxvYyhzaXplb2YoTkRJU184MDJfMTFfQ09ORklHVVJBVElPTiksIE1FTV9BTExPQ19GTEFHKTsKKyAgICAgICAgICAgIGlmIChwQ29uZmlndXJhdGlvbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwQ29uZmlndXJhdGlvbi0+TGVuZ3RoID0gc2l6ZW9mKE5ESVNfODAyXzExX0NPTkZJR1VSQVRJT04pOworICAgICAgICAgICAgICAgIHBDb25maWd1cmF0aW9uLT5CZWFjb25QZXJpb2QgPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLkJlYWNvblBlcmlvZDsKKyAgICAgICAgICAgICAgICBwQ29uZmlndXJhdGlvbi0+QVRJTVdpbmRvdyA9IHBBZGFwdGVyLT5TdGFBY3RpdmUuQXRpbVdpbjsKKyAgICAgICAgICAgICAgICBNQVBfQ0hBTk5FTF9JRF9UT19LSFoocEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsLCBwQ29uZmlndXJhdGlvbi0+RFNDb25maWcpOworICAgICAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihORElTXzgwMl8xMV9DT05GSUdVUkFUSU9OKTsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcENvbmZpZ3VyYXRpb24sIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfQ09ORklHVVJBVElPTihCZWFjb25QZXJpb2Q9JWxkLEF0aW1XPSVsZCxDaGFubmVsPSVkKSBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvbmZpZ3VyYXRpb24tPkJlYWNvblBlcmlvZCwgcENvbmZpZ3VyYXRpb24tPkFUSU1XaW5kb3csIHBBZGFwdGVyLT5Db21tb25DZmcuQ2hhbm5lbCkpOworCQkJCWtmcmVlKHBDb25maWd1cmF0aW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9DT05GSUdVUkFUSU9OKGttYWxsb2MgZmFpbGVkKVxuIikpOworICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKwkJY2FzZSBSVF9PSURfODAyXzExX1NOUl8wOgorCQkJaWYgKChwQWRhcHRlci0+U3RhQ2ZnLkxhc3RTTlIwID4gMCkpCisJCQl7CisJCQkJdWxJbmZvID0gKCgweGViCS0gcEFkYXB0ZXItPlN0YUNmZy5MYXN0U05SMCkgKiAzKSAvCTE2IDsKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YodWxJbmZvKTsKKwkJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnVsSW5mbywJd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9TTlJfMCgweD0lbHgpXG4iLCB1bEluZm8pKTsKKwkJCX0KKyAgICAgICAgICAgIGVsc2UKKwkJCSAgICBTdGF0dXMgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCWNhc2UgUlRfT0lEXzgwMl8xMV9TTlJfMToKKwkJCWlmICgocEFkYXB0ZXItPkFudGVubmEuZmllbGQuUnhQYXRoCT4gMSkgJiYKKyAgICAgICAgICAgICAgICAocEFkYXB0ZXItPlN0YUNmZy5MYXN0U05SMSA+IDApKQorCQkJeworCQkJCXVsSW5mbyA9ICgoMHhlYgktIHBBZGFwdGVyLT5TdGFDZmcuTGFzdFNOUjEpICogMykgLwkxNiA7CisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHVsSW5mbyk7CisJCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZ1bEluZm8sCXdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9TTlJfMSgweD0lbHgpXG4iLHVsSW5mbykpOworCQkJfQorCQkJZWxzZQorCQkJCVN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1NOUl8xKHBBZGFwdGVyLT5TdGFDZmcuTGFzdFNOUjE9JWQpXG4iLHBBZGFwdGVyLT5TdGFDZmcuTGFzdFNOUjEpKTsKKwkJCWJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfUlNTSV9UUklHR0VSOgorICAgICAgICAgICAgdWxJbmZvID0gcEFkYXB0ZXItPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMCAtIHBBZGFwdGVyLT5CYnBSc3NpVG9EYm1EZWx0YTsKKyAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZih1bEluZm8pOworICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZ1bEluZm8sIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9SU1NJX1RSSUdHRVIoPSVsZClcbiIsIHVsSW5mbykpOworICAgICAgICAgICAgYnJlYWs7CisJCWNhc2UgT0lEXzgwMl8xMV9SU1NJOgorICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfUlNTSToKKwkJCXVsSW5mbyA9IHBBZGFwdGVyLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTA7CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YodWxJbmZvKTsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmdWxJbmZvLAl3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJYnJlYWs7CisJCWNhc2UgUlRfT0lEXzgwMl8xMV9SU1NJXzE6CisgICAgICAgICAgICB1bEluZm8gPSBwQWRhcHRlci0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kxOworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHVsSW5mbyk7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnVsSW5mbywJd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCWJyZWFrOworICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfUlNTSV8yOgorICAgICAgICAgICAgdWxJbmZvID0gcEFkYXB0ZXItPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMjsKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZih1bEluZm8pOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZ1bEluZm8sCXdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX1NUQVRJU1RJQ1M6CisgICAgICAgICAgICBwU3RhdGlzdGljcyA9IChORElTXzgwMl8xMV9TVEFUSVNUSUNTICopIGttYWxsb2Moc2l6ZW9mKE5ESVNfODAyXzExX1NUQVRJU1RJQ1MpLCBNRU1fQUxMT0NfRkxBRyk7CisgICAgICAgICAgICBpZiAocFN0YXRpc3RpY3MpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfU1RBVElTVElDUyBcbiIpKTsKKyAgICAgICAgICAgICAgICAvLyBhZGQgdGhlIG1vc3QgdXAtdG8tZGF0ZSBoL3cgcmF3IGNvdW50ZXJzIGludG8gc29mdHdhcmUgY291bnRlcnMKKwkJCSAgICBOSUNVcGRhdGVSYXdDb3VudGVycyhwQWRhcHRlcik7CisKKyAgICAgICAgICAgICAgICAvLyBTYW5pdHkgY2hlY2sgZm9yIGNhbGN1bGF0aW9uIG9mIHN1Y2Vzc2Z1bCBjb3VudAorICAgICAgICAgICAgICAgIGlmIChwQWRhcHRlci0+V2xhbkNvdW50ZXJzLlRyYW5zbWl0dGVkRnJhZ21lbnRDb3VudC5RdWFkUGFydCA8IHBBZGFwdGVyLT5XbGFuQ291bnRlcnMuUmV0cnlDb3VudC5RdWFkUGFydCkKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPldsYW5Db3VudGVycy5UcmFuc21pdHRlZEZyYWdtZW50Q291bnQuUXVhZFBhcnQgPSBwQWRhcHRlci0+V2xhbkNvdW50ZXJzLlJldHJ5Q291bnQuUXVhZFBhcnQ7CisKKyAgICAgICAgICAgICAgICBwU3RhdGlzdGljcy0+VHJhbnNtaXR0ZWRGcmFnbWVudENvdW50LlF1YWRQYXJ0ID0gcEFkYXB0ZXItPldsYW5Db3VudGVycy5UcmFuc21pdHRlZEZyYWdtZW50Q291bnQuUXVhZFBhcnQ7CisgICAgICAgICAgICAgICAgcFN0YXRpc3RpY3MtPk11bHRpY2FzdFRyYW5zbWl0dGVkRnJhbWVDb3VudC5RdWFkUGFydCA9IHBBZGFwdGVyLT5XbGFuQ291bnRlcnMuTXVsdGljYXN0VHJhbnNtaXR0ZWRGcmFtZUNvdW50LlF1YWRQYXJ0OworICAgICAgICAgICAgICAgIHBTdGF0aXN0aWNzLT5GYWlsZWRDb3VudC5RdWFkUGFydCA9IHBBZGFwdGVyLT5XbGFuQ291bnRlcnMuRmFpbGVkQ291bnQuUXVhZFBhcnQ7CisgICAgICAgICAgICAgICAgcFN0YXRpc3RpY3MtPlJldHJ5Q291bnQuUXVhZFBhcnQgPSBwQWRhcHRlci0+V2xhbkNvdW50ZXJzLlJldHJ5Q291bnQuUXVhZFBhcnQ7CisgICAgICAgICAgICAgICAgcFN0YXRpc3RpY3MtPk11bHRpcGxlUmV0cnlDb3VudC5RdWFkUGFydCA9IHBBZGFwdGVyLT5XbGFuQ291bnRlcnMuTXVsdGlwbGVSZXRyeUNvdW50LlF1YWRQYXJ0OworICAgICAgICAgICAgICAgIHBTdGF0aXN0aWNzLT5SVFNTdWNjZXNzQ291bnQuUXVhZFBhcnQgPSBwQWRhcHRlci0+V2xhbkNvdW50ZXJzLlJUU1N1Y2Nlc3NDb3VudC5RdWFkUGFydDsKKyAgICAgICAgICAgICAgICBwU3RhdGlzdGljcy0+UlRTRmFpbHVyZUNvdW50LlF1YWRQYXJ0ID0gcEFkYXB0ZXItPldsYW5Db3VudGVycy5SVFNGYWlsdXJlQ291bnQuUXVhZFBhcnQ7CisgICAgICAgICAgICAgICAgcFN0YXRpc3RpY3MtPkFDS0ZhaWx1cmVDb3VudC5RdWFkUGFydCA9IHBBZGFwdGVyLT5XbGFuQ291bnRlcnMuQUNLRmFpbHVyZUNvdW50LlF1YWRQYXJ0OworICAgICAgICAgICAgICAgIHBTdGF0aXN0aWNzLT5GcmFtZUR1cGxpY2F0ZUNvdW50LlF1YWRQYXJ0ID0gcEFkYXB0ZXItPldsYW5Db3VudGVycy5GcmFtZUR1cGxpY2F0ZUNvdW50LlF1YWRQYXJ0OworICAgICAgICAgICAgICAgIHBTdGF0aXN0aWNzLT5SZWNlaXZlZEZyYWdtZW50Q291bnQuUXVhZFBhcnQgPSBwQWRhcHRlci0+V2xhbkNvdW50ZXJzLlJlY2VpdmVkRnJhZ21lbnRDb3VudC5RdWFkUGFydDsKKyAgICAgICAgICAgICAgICBwU3RhdGlzdGljcy0+TXVsdGljYXN0UmVjZWl2ZWRGcmFtZUNvdW50LlF1YWRQYXJ0ID0gcEFkYXB0ZXItPldsYW5Db3VudGVycy5NdWx0aWNhc3RSZWNlaXZlZEZyYW1lQ291bnQuUXVhZFBhcnQ7CisjaWZkZWYgREJHCisgICAgICAgICAgICAgICAgcFN0YXRpc3RpY3MtPkZDU0Vycm9yQ291bnQgPSBwQWRhcHRlci0+UmFsaW5rQ291bnRlcnMuUmVhbEZjc0VyckNvdW50OworI2Vsc2UKKyAgICAgICAgICAgICAgICBwU3RhdGlzdGljcy0+RkNTRXJyb3JDb3VudC5RdWFkUGFydCA9IHBBZGFwdGVyLT5XbGFuQ291bnRlcnMuRkNTRXJyb3JDb3VudC5RdWFkUGFydDsKKyAgICAgICAgICAgICAgICBwU3RhdGlzdGljcy0+RnJhbWVEdXBsaWNhdGVDb3VudC51Lkxvd1BhcnQgPSBwQWRhcHRlci0+V2xhbkNvdW50ZXJzLkZyYW1lRHVwbGljYXRlQ291bnQudS5Mb3dQYXJ0IC8gMTAwOworI2VuZGlmCisgICAgICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKE5ESVNfODAyXzExX1NUQVRJU1RJQ1MpOworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwU3RhdGlzdGljcywgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBrZnJlZShwU3RhdGlzdGljcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfU1RBVElTVElDUyhrbWFsbG9jIGZhaWxlZClcbiIpKTsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEX0dFTl9SQ1ZfT0s6CisgICAgICAgICAgICB1bEluZm8gPSBwQWRhcHRlci0+Q291bnRlcnM4MDIzLkdvb2RSZWNlaXZlczsKKyAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZih1bEluZm8pOworICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZ1bEluZm8sIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfR0VOX1JDVl9OT19CVUZGRVI6CisgICAgICAgICAgICB1bEluZm8gPSBwQWRhcHRlci0+Q291bnRlcnM4MDIzLlJ4Tm9CdWZmZXI7CisgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YodWxJbmZvKTsKKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmdWxJbmZvLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9QSFlfTU9ERToKKyAgICAgICAgICAgIHVsSW5mbyA9IChVTE9ORylwQWRhcHRlci0+Q29tbW9uQ2ZnLlBoeU1vZGU7CisgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YodWxJbmZvKTsKKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmdWxJbmZvLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfUEhZX01PREUgKD0lbGQpXG4iLCB1bEluZm8pKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfU1RBX0NPTkZJRzoKKyAgICAgICAgICAgIHBTdGFDb25maWcgPSAoUlRfODAyXzExX1NUQV9DT05GSUcgKikga21hbGxvYyhzaXplb2YoUlRfODAyXzExX1NUQV9DT05GSUcpLCBNRU1fQUxMT0NfRkxBRyk7CisgICAgICAgICAgICBpZiAocFN0YUNvbmZpZykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9TVEFfQ09ORklHXG4iKSk7CisgICAgICAgICAgICAgICAgcFN0YUNvbmZpZy0+RW5hYmxlVHhCdXJzdCA9IHBBZGFwdGVyLT5Db21tb25DZmcuYkVuYWJsZVR4QnVyc3Q7CisgICAgICAgICAgICAgICAgcFN0YUNvbmZpZy0+RW5hYmxlVHVyYm9SYXRlID0gMDsKKyAgICAgICAgICAgICAgICBwU3RhQ29uZmlnLT5Vc2VCR1Byb3RlY3Rpb24gPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLlVzZUJHUHJvdGVjdGlvbjsKKyAgICAgICAgICAgICAgICBwU3RhQ29uZmlnLT5Vc2VTaG9ydFNsb3RUaW1lID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5iVXNlU2hvcnRTbG90VGltZTsKKyAgICAgICAgICAgICAgICAvL3BTdGFDb25maWctPkFkaG9jTW9kZSA9IHBBZGFwdGVyLT5TdGFDZmcuQWRob2NNb2RlOworICAgICAgICAgICAgICAgIHBTdGFDb25maWctPkh3UmFkaW9TdGF0dXMgPSAocEFkYXB0ZXItPlN0YUNmZy5iSHdSYWRpbyA9PSBUUlVFKSA/IDEgOiAwOworICAgICAgICAgICAgICAgIHBTdGFDb25maWctPlJzdjEgPSAwOworICAgICAgICAgICAgICAgIHBTdGFDb25maWctPlN5c3RlbUVycm9yQml0bWFwID0gcEFkYXB0ZXItPlN5c3RlbUVycm9yQml0bWFwOworICAgICAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihSVF84MDJfMTFfU1RBX0NPTkZJRyk7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBTdGFDb25maWcsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICAgICAga2ZyZWUocFN0YUNvbmZpZyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfU1RBX0NPTkZJRyhrbWFsbG9jIGZhaWxlZClcbiIpKTsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9SVFNfVEhSRVNIT0xEOgorICAgICAgICAgICAgUnRzVGhyZXNoID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5SdHNUaHJlc2hvbGQ7CisgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoUnRzVGhyZXNoKTsKKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmUnRzVGhyZXNoLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfUlRTX1RIUkVTSE9MRCg9JWxkKVxuIiwgUnRzVGhyZXNoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX0ZSQUdNRU5UQVRJT05fVEhSRVNIT0xEOgorICAgICAgICAgICAgRnJhZ1RocmVzaCA9IHBBZGFwdGVyLT5Db21tb25DZmcuRnJhZ21lbnRUaHJlc2hvbGQ7CisgICAgICAgICAgICBpZiAocEFkYXB0ZXItPkNvbW1vbkNmZy5iVXNlWmVyb1RvRGlzYWJsZUZyYWdtZW50ID09IFRSVUUpCisgICAgICAgICAgICAgICAgRnJhZ1RocmVzaCA9IDA7CisgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoRnJhZ1RocmVzaCk7CisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJkZyYWdUaHJlc2gsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9GUkFHTUVOVEFUSU9OX1RIUkVTSE9MRCg9JWxkKVxuIiwgRnJhZ1RocmVzaCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9QT1dFUl9NT0RFOgorICAgICAgICAgICAgUG93ZXJNb2RlID0gcEFkYXB0ZXItPlN0YUNmZy5XaW5kb3dzUG93ZXJNb2RlOworICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFBvd2VyTW9kZSk7CisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJlBvd2VyTW9kZSwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX1BPV0VSX01PREUoPSVkKVxuIiwgUG93ZXJNb2RlKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX1JBRElPOgorICAgICAgICAgICAgUmFkaW9TdGF0ZSA9IChCT09MRUFOKSBwQWRhcHRlci0+U3RhQ2ZnLmJTd1JhZGlvOworICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFJhZGlvU3RhdGUpOworICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZSYWRpb1N0YXRlLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfUVVFUllfUkFESU8gKD0lZClcbiIsIFJhZGlvU3RhdGUpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfSU5GUkFTVFJVQ1RVUkVfTU9ERToKKyAgICAgICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkJzc1R5cGUgPT0gQlNTX0FESE9DKQorICAgICAgICAgICAgICAgIEJzc1R5cGUgPSBOZGlzODAyXzExSUJTUzsKKyAgICAgICAgICAgIGVsc2UgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQnNzVHlwZSA9PSBCU1NfSU5GUkEpCisgICAgICAgICAgICAgICAgQnNzVHlwZSA9IE5kaXM4MDJfMTFJbmZyYXN0cnVjdHVyZTsKKyAgICAgICAgICAgIGVsc2UgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQnNzVHlwZSA9PSBCU1NfTU9OSVRPUikKKyAgICAgICAgICAgICAgICBCc3NUeXBlID0gTmRpczgwMl8xMU1vbml0b3I7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgQnNzVHlwZSA9IE5kaXM4MDJfMTFBdXRvVW5rbm93bjsKKworICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKEJzc1R5cGUpOworICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZCc3NUeXBlLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfSU5GUkFTVFJVQ1RVUkVfTU9ERSg9JWQpXG4iLCBCc3NUeXBlKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX1BSRUFNQkxFOgorICAgICAgICAgICAgUHJlYW1UeXBlID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5UeFByZWFtYmxlOworICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFByZWFtVHlwZSk7CisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJlByZWFtVHlwZSwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1BSRUFNQkxFKD0lZClcbiIsIFByZWFtVHlwZSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9BVVRIRU5USUNBVElPTl9NT0RFOgorICAgICAgICAgICAgQXV0aE1vZGUgPSBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlOworICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKEF1dGhNb2RlKTsKKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmQXV0aE1vZGUsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9BVVRIRU5USUNBVElPTl9NT0RFKD0lZClcbiIsIEF1dGhNb2RlKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX1dFUF9TVEFUVVM6CisgICAgICAgICAgICBXZXBTdGF0dXMgPSBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1czsKKyAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihXZXBTdGF0dXMpOworICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZXZXBTdGF0dXMsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9XRVBfU1RBVFVTKD0lZClcbiIsIFdlcFN0YXR1cykpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9UWF9QT1dFUl9MRVZFTDoKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihVTE9ORyk7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnBBZGFwdGVyLT5Db21tb25DZmcuVHhQb3dlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX1RYX1BPV0VSX0xFVkVMICV4XG4iLHBBZGFwdGVyLT5Db21tb25DZmcuVHhQb3dlcikpOworCQkJYnJlYWs7CisgICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9UWF9QT1dFUl9MRVZFTF8xOgorICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFVMT05HKTsKKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmcEFkYXB0ZXItPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1RYX1BPV0VSX0xFVkVMXzEgKD0lbGQpXG4iLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlKSk7CisJCQlicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX05FVFdPUktfVFlQRVNfU1VQUE9SVEVEOgorCQkJaWYgKChwQWRhcHRlci0+UmZJY1R5cGUJPT0gUkZJQ18yODUwKSB8fCAocEFkYXB0ZXItPlJmSWNUeXBlID09CVJGSUNfMjc1MCkpCisJCQl7CisJCQkJTmV0d29ya1R5cGVMaXN0WzBdID0gMzsgICAgICAgICAgICAgICAgIC8vIE51bWJlck9mSXRlbXMgPSAzCisJCQkJTmV0d29ya1R5cGVMaXN0WzFdID0gTmRpczgwMl8xMURTOyAgICAgIC8vIE5ldHdvcmtUeXBlWzFdID0gMTFiCisJCQkJTmV0d29ya1R5cGVMaXN0WzJdID0gTmRpczgwMl8xMU9GRE0yNDsgIC8vIE5ldHdvcmtUeXBlWzJdID0gMTFnCisJCQkJTmV0d29ya1R5cGVMaXN0WzNdID0gTmRpczgwMl8xMU9GRE01OyAgIC8vIE5ldHdvcmtUeXBlWzNdID0gMTFhCisgICAgICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gMTY7CisJCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZOZXR3b3JrVHlwZUxpc3RbMF0sIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJTmV0d29ya1R5cGVMaXN0WzBdID0gMjsgICAgICAgICAgICAgICAgIC8vIE51bWJlck9mSXRlbXMgPSAyCisJCQkJTmV0d29ya1R5cGVMaXN0WzFdID0gTmRpczgwMl8xMURTOyAgICAgIC8vIE5ldHdvcmtUeXBlWzFdID0gMTFiCisJCQkJTmV0d29ya1R5cGVMaXN0WzJdID0gTmRpczgwMl8xMU9GRE0yNDsgIC8vIE5ldHdvcmtUeXBlWzJdID0gMTFnCisJCQkgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gMTI7CisJCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZOZXR3b3JrVHlwZUxpc3RbMF0sIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQl9CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9ORVRXT1JLX1RZUEVTX1NVUFBPUlRFRFxuIikpOworCQkJCWJyZWFrOworCSAgICBjYXNlIE9JRF84MDJfMTFfTkVUV09SS19UWVBFX0lOX1VTRToKKyAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihVTE9ORyk7CisJCQlpZiAocEFkYXB0ZXItPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUEpCisJCQkJdWxJbmZvID0gTmRpczgwMl8xMU9GRE01OworCQkJZWxzZSBpZiAoKHBBZGFwdGVyLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFCR19NSVhFRCkgfHwgKHBBZGFwdGVyLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFHKSkKKwkJCQl1bEluZm8gPSBOZGlzODAyXzExT0ZETTI0OworCQkJZWxzZQorCQkJCXVsSW5mbyA9IE5kaXM4MDJfMTFEUzsKKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmdWxJbmZvLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJYnJlYWs7CisgICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9RVUVSWV9MQVNUX1JYX1JBVEU6CisgICAgICAgICAgICB1bEluZm8gPSAoVUxPTkcpcEFkYXB0ZXItPkxhc3RSeFJhdGU7CisgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YodWxJbmZvKTsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmdWxJbmZvLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfUVVFUllfTEFTVF9SWF9SQVRFICg9JWxkKVxuIiwgdWxJbmZvKSk7CisJCQlicmVhazsKKwkJY2FzZSBSVF9PSURfODAyXzExX1FVRVJZX0xBU1RfVFhfUkFURToKKwkJCS8vdWxJbmZvID0gKFVMT05HKXBBZGFwdGVyLT5MYXN0VHhSYXRlOworCQkJdWxJbmZvID0gKFVMT05HKXBBZGFwdGVyLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5IVFBoeU1vZGUud29yZDsKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZih1bEluZm8pOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZ1bEluZm8sCXdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9RVUVSWV9MQVNUX1RYX1JBVEUgKD0lbHgpXG4iLCB1bEluZm8pKTsKKwkJCWJyZWFrOworICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfUVVFUllfRUVQUk9NX1ZFUlNJT046CisgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoVUxPTkcpOworICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZwQWRhcHRlci0+RWVwcm9tVmVyc2lvbiwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfUVVFUllfRklSTVdBUkVfVkVSU0lPTjoKKyAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihVTE9ORyk7CisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnBBZGFwdGVyLT5GaXJtd2FyZVZlcnNpb24sIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlicmVhazsKKwkgICAgY2FzZSBSVF9PSURfODAyXzExX1FVRVJZX05PSVNFX0xFVkVMOgorCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFVDSEFSKTsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmcEFkYXB0ZXItPkJicFdyaXRlTGF0Y2hbNjZdLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfUVVFUllfTk9JU0VfTEVWRUwgKD0lZClcbiIsIHBBZGFwdGVyLT5CYnBXcml0ZUxhdGNoWzY2XSkpOworCQkJYnJlYWs7CisJICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9FWFRSQV9JTkZPOgorCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFVMT05HKTsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmcEFkYXB0ZXItPkV4dHJhSW5mbywgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX0VYVFJBX0lORk8gKD0lbGQpXG4iLCBwQWRhcHRlci0+RXh0cmFJbmZvKSk7CisJICAgICAgICBicmVhazsKKwkgICAgY2FzZSBSVF9PSURfV0VfVkVSU0lPTl9DT01QSUxFRDoKKwkgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihVSU5UKTsKKwkgICAgICAgIHdlX3ZlcnNpb25fY29tcGlsZWQgPSBXSVJFTEVTU19FWFQ7CisJICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJndlX3ZlcnNpb25fY29tcGlsZWQsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJICAgICAgICBicmVhazsKKwkJY2FzZSBSVF9PSURfODAyXzExX1FVRVJZX0FQU0RfU0VUVElORzoKKwkJCWFwc2QgPSAocEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTRENhcGFibGUgfCAocEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTREFDX0JFIDw8IDEpIHwgKHBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RBQ19CSyA8PCAyKQorCQkJCXwgKHBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RBQ19WSSA8PCAzKQl8IChwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNEQUNfVk8gPDwgNCkJfCAocEFkYXB0ZXItPkNvbW1vbkNmZy5NYXhTUExlbmd0aCA8PCA1KSk7CisKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihVTE9ORyk7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJmFwc2QsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9RVUVSWV9BUFNEX1NFVFRJTkcgKD0weCVseCxBUFNEQ2FwPSVkLEFDX0JFPSVkLEFDX0JLPSVkLEFDX1ZJPSVkLEFDX1ZPPSVkLE1BWFNQTGVuPSVkKVxuIiwKKwkJCQlhcHNkLHBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RDYXBhYmxlLHBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RBQ19CRSxwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNEQUNfQksscEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTREFDX1ZJLHBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RBQ19WTyxwQWRhcHRlci0+Q29tbW9uQ2ZnLk1heFNQTGVuZ3RoKSk7CisJCQlicmVhazsKKwkJY2FzZSBSVF9PSURfODAyXzExX1FVRVJZX0FQU0RfUFNNOgorCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFVMT05HKTsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmcEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTREZvcmNlUG93ZXJTYXZlLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfUVVFUllfQVBTRF9QU00gKD0lZClcbiIsIHBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RGb3JjZVBvd2VyU2F2ZSkpOworCQkJYnJlYWs7CisJCWNhc2UgUlRfT0lEXzgwMl8xMV9RVUVSWV9XTU06CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoQk9PTEVBTik7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnBBZGFwdGVyLT5Db21tb25DZmcuYldtbUNhcGFibGUsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9RVUVSWV9XTU0gKD0lZClcbiIsCXBBZGFwdGVyLT5Db21tb25DZmcuYldtbUNhcGFibGUpKTsKKwkJCWJyZWFrOworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyAgICAgICAgY2FzZSBSVF9PSURfTkVXX0RSSVZFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBVQ0hBUiBlbmFibGVkID0gMTsKKyAgICAJICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoVUNIQVIpOworICAgIAkgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmZW5hYmxlZCwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEX05FV19EUklWRVIgKD0lZClcbiIsIGVuYWJsZWQpKTsKKyAgICAgICAgICAgIH0KKwkgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJUX09JRF9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUOgorCSAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFVDSEFSKTsKKwkgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmcEFkYXB0ZXItPlN0YUNmZy5XcGFTdXBwbGljYW50VVAsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQgKD0lZClcbiIsIHBBZGFwdGVyLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQKSk7CisJICAgICAgICBicmVhazsKKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisKKyAgICAgICAgY2FzZSBSVF9PSURfRFJJVkVSX0RFVklDRV9OQU1FOgorICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF9EUklWRVJfREVWSUNFX05BTUUgXG4iKSk7CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSAxNjsKKwkJCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcEFkYXB0ZXItPlN0YUNmZy5kZXZfbmFtZSwgd3JxLT51LmRhdGEubGVuZ3RoKSkKKwkJCXsKKwkJCQlTdGF0dXMgPSAtRUZBVUxUOworCQkJfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9RVUVSWV9IVF9QSFlNT0RFOgorICAgICAgICAgICAgcEhUUGh5TW9kZSA9IChPSURfU0VUX0hUX1BIWU1PREUgKikga21hbGxvYyhzaXplb2YoT0lEX1NFVF9IVF9QSFlNT0RFKSwgTUVNX0FMTE9DX0ZMQUcpOworICAgICAgICAgICAgaWYgKHBIVFBoeU1vZGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcEhUUGh5TW9kZS0+UGh5TW9kZSA9IHBBZGFwdGVyLT5Db21tb25DZmcuUGh5TW9kZTsKKyAgICAJCQlwSFRQaHlNb2RlLT5IdE1vZGUgPSAoVUNIQVIpcEFkYXB0ZXItPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkhUUGh5TW9kZS5maWVsZC5NT0RFOworICAgIAkJCXBIVFBoeU1vZGUtPkJXID0gKFVDSEFSKXBBZGFwdGVyLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5IVFBoeU1vZGUuZmllbGQuQlc7CisgICAgCQkJcEhUUGh5TW9kZS0+TUNTPSAoVUNIQVIpcEFkYXB0ZXItPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkhUUGh5TW9kZS5maWVsZC5NQ1M7CisgICAgCQkJcEhUUGh5TW9kZS0+U0hPUlRHST0gKFVDSEFSKXBBZGFwdGVyLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5IVFBoeU1vZGUuZmllbGQuU2hvcnRHSTsKKyAgICAJCQlwSFRQaHlNb2RlLT5TVEJDPSAoVUNIQVIpcEFkYXB0ZXItPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkhUUGh5TW9kZS5maWVsZC5TVEJDOworCisgICAgCQkJcEhUUGh5TW9kZS0+RXh0T2Zmc2V0ID0gKChwQWRhcHRlci0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsIDwgcEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsKSA/IChFWFRDSEFfQkVMT1cpIDogKEVYVENIQV9BQk9WRSkpOworICAgICAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihPSURfU0VUX0hUX1BIWU1PREUpOworICAgICAgICAgICAgICAgIGlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcEhUUGh5TW9kZSwgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAJCQl7CisgICAgCQkJCVN0YXR1cyA9IC1FRkFVTFQ7CisgICAgCQkJfQorICAgIAkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1FVRVJZX0hUX1BIWU1PREUgKFBoeU1vZGUgPSAlZCwgTUNTID0lZCwgQlcgPSAlZCwgU1RCQyA9ICVkLCBFeHRPZmZzZXQ9JWQpXG4iLAorICAgIAkJCQlwSFRQaHlNb2RlLT5IdE1vZGUsIHBIVFBoeU1vZGUtPk1DUywgcEhUUGh5TW9kZS0+QlcsIHBIVFBoeU1vZGUtPlNUQkMsIHBIVFBoeU1vZGUtPkV4dE9mZnNldCkpOworICAgIAkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiBNbG1lVXBkYXRlVHhSYXRlcyAoLndvcmQgPSAleCApXG4iLCBwQWRhcHRlci0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLndvcmQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9TVEFfQ09ORklHKGttYWxsb2MgZmFpbGVkKVxuIikpOworICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX0NPVU5UUllfUkVHSU9OOgorICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfQ09VTlRSWV9SRUdJT04gXG4iKSk7CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YodWxJbmZvKTsKKyAgICAgICAgICAgIHVsSW5mbyA9IHBBZGFwdGVyLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbkZvckFCYW5kOworICAgICAgICAgICAgdWxJbmZvID0gKHVsSW5mbyA8PCA4KXwocEFkYXB0ZXItPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uKTsKKwkJCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnVsSW5mbywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIHsKKwkJCQlTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9RVUVSWV9EQVRfSFRfUEhZTU9ERToKKyAgICAgICAgICAgIHBIVFBoeU1vZGUgPSAoT0lEX1NFVF9IVF9QSFlNT0RFICopIGttYWxsb2Moc2l6ZW9mKE9JRF9TRVRfSFRfUEhZTU9ERSksIE1FTV9BTExPQ19GTEFHKTsKKyAgICAgICAgICAgIGlmIChwSFRQaHlNb2RlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBIVFBoeU1vZGUtPlBoeU1vZGUgPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLlBoeU1vZGU7CisgICAgCQkJcEhUUGh5TW9kZS0+SHRNb2RlID0gKFVDSEFSKXBBZGFwdGVyLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkhUTU9ERTsKKyAgICAJCQlwSFRQaHlNb2RlLT5CVyA9IChVQ0hBUilwQWRhcHRlci0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5CVzsKKyAgICAJCQlwSFRQaHlNb2RlLT5NQ1M9IChVQ0hBUilwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTOworICAgIAkJCXBIVFBoeU1vZGUtPlNIT1JUR0k9IChVQ0hBUilwQWRhcHRlci0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5TaG9ydEdJOworICAgIAkJCXBIVFBoeU1vZGUtPlNUQkM9IChVQ0hBUilwQWRhcHRlci0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5TVEJDOworCisgICAgICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKE9JRF9TRVRfSFRfUEhZTU9ERSk7CisgICAgICAgICAgICAgICAgaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwSFRQaHlNb2RlLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgIAkJCXsKKyAgICAJCQkJU3RhdHVzID0gLUVGQVVMVDsKKyAgICAJCQl9CisgICAgCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfUVVFUllfSFRfUEhZTU9ERSAoUGh5TW9kZSA9ICVkLCBNQ1MgPSVkLCBCVyA9ICVkLCBTVEJDID0gJWQsIEV4dE9mZnNldD0lZClcbiIsCisgICAgCQkJCXBIVFBoeU1vZGUtPkh0TW9kZSwgcEhUUGh5TW9kZS0+TUNTLCBwSFRQaHlNb2RlLT5CVywgcEhUUGh5TW9kZS0+U1RCQywgcEhUUGh5TW9kZS0+RXh0T2Zmc2V0KSk7CisgICAgCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiIE1sbWVVcGRhdGVUeFJhdGVzICgud29yZCA9ICV4IClcbiIsIHBBZGFwdGVyLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5IVFBoeU1vZGUud29yZCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1NUQV9DT05GSUcoa21hbGxvYyBmYWlsZWQpXG4iKSk7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJUX09JRF9RVUVSWV9NVUxUSVBMRV9DQVJEX1NVUFBPUlQ6CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoVUNIQVIpOworICAgICAgICAgICAgaSA9IDA7CisjaWZkZWYgTVVMVElQTEVfQ0FSRF9TVVBQT1JUCisgICAgICAgICAgICBpID0gMTsKKyNlbmRpZiAvLyBNVUxUSVBMRV9DQVJEX1NVUFBPUlQgLy8KKwkJCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJmksIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICB7CisJCQkJU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfUVVFUllfTVVMVElQTEVfQ0FSRF9TVVBQT1JUKD0lZCkgXG4iLCBpKSk7CisgICAgICAgICAgICBicmVhazsKKyNpZmRlZiBTTk1QX1NVUFBPUlQKKwkJY2FzZSBSVF9PSURfODAyXzExX01BQ19BRERSRVNTOgorICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gTUFDX0FERFJfTEVOOworICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZwQWRhcHRlci0+Q3VycmVudEFkZHJlc3MsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlicmVhazsKKworCQljYXNlIFJUX09JRF84MDJfMTFfTUFOVUZBQ1RVUkVST1VJOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfTUFOVUZBQ1RVUkVST1VJIFxuIikpOworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gTWFudWZhY3R1cmVyT1VJX0xFTjsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmcEFkYXB0ZXItPkN1cnJlbnRBZGRyZXNzLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJYnJlYWs7CisKKwkJY2FzZSBSVF9PSURfODAyXzExX01BTlVGQUNUVVJFUk5BTUU6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9NQU5VRkFDVFVSRVJOQU1FIFxuIikpOworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc3RybGVuKE1hbnVmYWN0dXJlck5BTUUpOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIE1hbnVmYWN0dXJlck5BTUUsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlicmVhazsKKworCQljYXNlIFJUX09JRF84MDJfMTFfUkVTT1VSQ0VUWVBFSUROQU1FOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfUkVTT1VSQ0VUWVBFSUROQU1FIFxuIikpOworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc3RybGVuKFJlc291cmNlVHlwZUlkTmFtZSk7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgUmVzb3VyY2VUeXBlSWROYW1lLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJYnJlYWs7CisKKwkJY2FzZSBSVF9PSURfODAyXzExX1BSSVZBQ1lPUFRJT05JTVBMRU1FTlRFRDoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1BSSVZBQ1lPUFRJT05JTVBMRU1FTlRFRCBcbiIpKTsKKwkJCXVsSW5mbyA9IDE7IC8vIDEgaXMgc3VwcG9ydCB3ZXAgZWxzZSAyIGlzIG5vdCBzdXBwb3J0LgorCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHVsSW5mbyk7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnVsSW5mbywgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCWJyZWFrOworCisJCWNhc2UgUlRfT0lEXzgwMl8xMV9QT1dFUk1BTkFHRU1FTlRNT0RFOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfUE9XRVJNQU5BR0VNRU5UTU9ERSBcbiIpKTsKKwkJCWlmIChwQWRhcHRlci0+U3RhQ2ZnLlBzbSA9PSBQU01QX0FDVElPTikKKwkJCQl1bEluZm8gPSAxOyAvLyAxIGlzIHBvd2VyIGFjdGl2ZSBlbHNlIDIgaXMgcG93ZXIgc2F2ZS4KKwkJCWVsc2UKKwkJCQl1bEluZm8gPSAyOworCisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YodWxJbmZvKTsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmdWxJbmZvLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfODAyXzExX1dFUERFRkFVTFRLRVlWQUxVRToKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX1dFUERFRkFVTFRLRVlWQUxVRSBcbiIpKTsKKwkJCS8vS2V5SWR4VmFsdWUuS2V5SWR4ID0gcEFkLT5Qb3J0Q2ZnLk1CU1NJRFtwQWQtPklvY3RsSUZdLkRlZmF1bHRLZXlJZDsKKwkJCXBLZXlJZHhWYWx1ZSA9IHdycS0+dS5kYXRhLnBvaW50ZXI7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIktleUlkeFZhbHVlLktleUlkeCA9ICVkLCBcbiIscEtleUlkeFZhbHVlLT5LZXlJZHgpKTsKKwkJCXZhbHVlTGVuID0gcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uS2V5TGVuOworCQkJTmRpc01vdmVNZW1vcnkocEtleUlkeFZhbHVlLT5WYWx1ZSwKKwkJCQkJCSAgICZwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW3BBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5LZXksCisJCQkJCQkgICB2YWx1ZUxlbik7CisJCQlwS2V5SWR4VmFsdWUtPlZhbHVlW3ZhbHVlTGVuXT0nXDAnOworCisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoRGVmYXVsdEtleUlkeFZhbHVlKTsKKworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBLZXlJZHhWYWx1ZSwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiRGVmYXVsdEtleUlkID0gJWQsIHRvdGFsIGxlbiA9ICVkLCBzdHIgbGVuPSVkLCBLZXlWYWx1ZT0gJTAyeCAlMDJ4ICUwMnggJTAyeCBcbiIsIHBBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkLCB3cnEtPnUuZGF0YS5sZW5ndGgsIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWRdLktleUxlbiwKKwkJCXBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5WzBdLAorCQkJcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsxXS5LZXlbMF0sCisJCQlwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzJdLktleVswXSwKKwkJCXBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bM10uS2V5WzBdKSk7CisJCQlicmVhazsKKworCQljYXNlIE9JRF84MDJfMTFfV0VQREVGQVVMVEtFWUlEOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfV0VQREVGQVVMVEtFWUlEIFxuIikpOworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFVDSEFSKTsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWQsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJEZWZhdWx0S2V5SWQgPSVkIFxuIiwgcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWQpKTsKKwkJCWJyZWFrOworCisJCWNhc2UgUlRfT0lEXzgwMl8xMV9XRVBLRVlNQVBQSU5HTEVOR1RIOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfV0VQS0VZTUFQUElOR0xFTkdUSCBcbiIpKTsKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihVQ0hBUik7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwKKwkJCQkJCQkJCSZwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW3BBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5LZXlMZW4sCisJCQkJCQkJCQl3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfODAyXzExX1NIT1JUUkVUUllMSU1JVDoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX1NIT1JUUkVUUllMSU1JVCBcbiIpKTsKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihVTE9ORyk7CisJCQlSVE1QX0lPX1JFQUQzMihwQWRhcHRlciwgVFhfUlRZX0NGRywgJnR4X3J0eV9jZmcud29yZCk7CisJCQlTaG9ydFJldHJ5TGltaXQgPSB0eF9ydHlfY2ZnLmZpZWxkLlNob3J0UnR5TGltaXQ7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTaG9ydFJldHJ5TGltaXQgPSVsZCwgIHR4X3J0eV9jZmcuZmllbGQuU2hvcnRSZXRyeUxpbWl0PSVkXG4iLCBTaG9ydFJldHJ5TGltaXQsIHR4X3J0eV9jZmcuZmllbGQuU2hvcnRSdHlMaW1pdCkpOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZTaG9ydFJldHJ5TGltaXQsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlicmVhazsKKworCQljYXNlIE9JRF84MDJfMTFfTE9OR1JFVFJZTElNSVQ6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9MT05HUkVUUllMSU1JVCBcbiIpKTsKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihVTE9ORyk7CisJCQlSVE1QX0lPX1JFQUQzMihwQWRhcHRlciwgVFhfUlRZX0NGRywgJnR4X3J0eV9jZmcud29yZCk7CisJCQlMb25nUmV0cnlMaW1pdCA9IHR4X3J0eV9jZmcuZmllbGQuTG9uZ1J0eUxpbWl0OworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTG9uZ1JldHJ5TGltaXQgPSVsZCwgIHR4X3J0eV9jZmcuZmllbGQuTG9uZ1J0eUxpbWl0PSVkXG4iLCBMb25nUmV0cnlMaW1pdCwgdHhfcnR5X2NmZy5maWVsZC5Mb25nUnR5TGltaXQpKTsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmTG9uZ1JldHJ5TGltaXQsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlicmVhazsKKworCQljYXNlIFJUX09JRF84MDJfMTFfUFJPRFVDVElEOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfUFJPRFVDVElEIFxuIikpOworCisjaWZkZWYgUlQyODcwCisJCQlzcHJpbnRmKHRtcCwgIiUwNHggJTA0eFxuIiwgKChQT1NfQ09PS0lFKXBBZGFwdGVyLT5PU19Db29raWUpLT5wVXNiX0Rldi0+ZGVzY3JpcHRvci5pZFZlbmRvciAsKChQT1NfQ09PS0lFKXBBZGFwdGVyLT5PU19Db29raWUpLT5wVXNiX0Rldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QpOworCisjZW5kaWYgLy8gUlQyODcwIC8vCisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzdHJsZW4odG1wKTsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCB0bXAsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlicmVhazsKKworCQljYXNlIFJUX09JRF84MDJfMTFfTUFOVUZBQ1RVUkVJRDoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX01BTlVGQUNUVVJFSUQgXG4iKSk7CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzdHJsZW4oTWFudWZhY3R1cmVyTkFNRSk7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgTWFudWZhY3R1cmVyTkFNRSwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCWJyZWFrOworCisJCWNhc2UgT0lEXzgwMl8xMV9DVVJSRU5UQ0hBTk5FTDoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX0NVUlJFTlRDSEFOTkVMIFxuIikpOworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFVDSEFSKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoInNpemVvZiBVQ0hBUj0lZCwgY2hhbm5lbD0lZCBcbiIsIHNpemVvZihVQ0hBUiksIHBBZGFwdGVyLT5Db21tb25DZmcuQ2hhbm5lbCkpOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWwsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTdGF0dXM9JWRcbiIsIFN0YXR1cykpOworCQkJYnJlYWs7CisjZW5kaWYgLy9TTk1QX1NVUFBPUlQKKworCQljYXNlIE9JRF84MDJfMTFfQlVJTERfQ0hBTk5FTF9FWDoKKwkJCXsKKwkJCQlVQ0hBUiB2YWx1ZTsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9CVUlMRF9DSEFOTkVMX0VYIFxuIikpOworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihVQ0hBUik7CisjaWZkZWYgRVhUX0JVSUxEX0NIQU5ORUxfTElTVAorCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlN1cHBvcnQgRVhUX0JVSUxEX0NIQU5ORUxfTElTVC5cbiIpKTsKKwkJCQl2YWx1ZSA9IDE7CisjZWxzZQorCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkRvZXNuJ3Qgc3VwcG9ydCBFWFRfQlVJTERfQ0hBTk5FTF9MSVNULlxuIikpOworCQkJCXZhbHVlID0gMDsKKyNlbmRpZiAvLyBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUIC8vCisJCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZ2YWx1ZSwgMSk7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU3RhdHVzPSVkXG4iLCBTdGF0dXMpKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgT0lEXzgwMl8xMV9HRVRfQ0hfTElTVDoKKwkJCXsKKwkJCQlQUlRfQ0hBTk5FTF9MSVNUX0lORk8gcENoTGlzdEJ1ZjsKKworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX0dFVF9DSF9MSVNUIFxuIikpOworCQkJCWlmIChwQWRhcHRlci0+Q2hhbm5lbExpc3ROdW0gPT0gMCkKKwkJCQl7CisJCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IDA7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCXBDaExpc3RCdWYgPSAoUlRfQ0hBTk5FTF9MSVNUX0lORk8gKikga21hbGxvYyhzaXplb2YoUlRfQ0hBTk5FTF9MSVNUX0lORk8pLCBNRU1fQUxMT0NfRkxBRyk7CisJCQkJaWYgKHBDaExpc3RCdWYgPT0gTlVMTCkKKwkJCQl7CisJCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IDA7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCXBDaExpc3RCdWYtPkNoYW5uZWxMaXN0TnVtID0gcEFkYXB0ZXItPkNoYW5uZWxMaXN0TnVtOworCQkJCWZvciAoaSA9IDA7IGkgPCBwQ2hMaXN0QnVmLT5DaGFubmVsTGlzdE51bTsgaSsrKQorCQkJCQlwQ2hMaXN0QnVmLT5DaGFubmVsTGlzdFtpXSA9IHBBZGFwdGVyLT5DaGFubmVsTGlzdFtpXS5DaGFubmVsOworCisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFJUX0NIQU5ORUxfTElTVF9JTkZPKTsKKwkJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcENoTGlzdEJ1Ziwgc2l6ZW9mKFJUX0NIQU5ORUxfTElTVF9JTkZPKSk7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU3RhdHVzPSVkXG4iLCBTdGF0dXMpKTsKKworCQkJCWlmIChwQ2hMaXN0QnVmKQorCQkJCQlrZnJlZShwQ2hMaXN0QnVmKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgT0lEXzgwMl8xMV9HRVRfQ09VTlRSWV9DT0RFOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfR0VUX0NPVU5UUllfQ09ERSBcbiIpKTsKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IDI7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnBBZGFwdGVyLT5Db21tb25DZmcuQ291bnRyeUNvZGUsIDIpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU3RhdHVzPSVkXG4iLCBTdGF0dXMpKTsKKwkJCWJyZWFrOworCisJCWNhc2UgT0lEXzgwMl8xMV9HRVRfQ0hBTk5FTF9HRU9HUkFQSFk6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9HRVRfQ0hBTk5FTF9HRU9HUkFQSFkgXG4iKSk7CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSAxOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZwQWRhcHRlci0+Q29tbW9uQ2ZnLkdlb2dyYXBoeSwgMSk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTdGF0dXM9JWRcbiIsIFN0YXR1cykpOworCQkJYnJlYWs7CisKKworI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCQljYXNlIFJUX09JRF84MDJfMTFfUVVFUllfRExTOgorCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKEJPT0xFQU4pOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZwQWRhcHRlci0+Q29tbW9uQ2ZnLmJETFNDYXBhYmxlLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfUVVFUllfRExTKD0lZClcbiIsIHBBZGFwdGVyLT5Db21tb25DZmcuYkRMU0NhcGFibGUpKTsKKwkJCWJyZWFrOworCisJCWNhc2UgUlRfT0lEXzgwMl8xMV9RVUVSWV9ETFNfUEFSQU06CisJCQl7CisJCQkJUFJUXzgwMl8xMV9ETFNfSU5GTwlwRGxzSW5mbyA9IGttYWxsb2Moc2l6ZW9mKFJUXzgwMl8xMV9ETFNfSU5GTyksIEdGUF9BVE9NSUMpOworCQkJCWlmIChwRGxzSW5mbyA9PSBOVUxMKQorCQkJCQlicmVhazsKKworCQkJCWZvciAoaT0wOyBpPE1BWF9OVU1fT0ZfRExTX0VOVFJZOyBpKyspCisJCQkJeworCQkJCQlSVE1QTW92ZU1lbW9yeSgmcERsc0luZm8tPkVudHJ5W2ldLCAmcEFkYXB0ZXItPlN0YUNmZy5ETFNFbnRyeVtpXSwgc2l6ZW9mKFJUXzgwMl8xMV9ETFNfVUkpKTsKKwkJCQl9CisKKwkJCQlwRGxzSW5mby0+bnVtID0gTUFYX05VTV9PRl9ETFNfRU5UUlk7CisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFJUXzgwMl8xMV9ETFNfSU5GTyk7CisJCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBEbHNJbmZvLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1FVRVJZX0RMU19QQVJBTVxuIikpOworCisJCQkJaWYgKHBEbHNJbmZvKQorCQkJCQlrZnJlZShwRGxzSW5mbyk7CisJCQl9CisJCQlicmVhazsKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5Ojp1bmtub3duIElPQ1RMJ3Mgc3ViY21kID0gMHglMDh4XG4iLCBjbWQpKTsKKyAgICAgICAgICAgIFN0YXR1cyA9IC1FT1BOT1RTVVBQOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBTdGF0dXM7Cit9CisKK0lOVCBydDI4eHhfc3RhX2lvY3RsKAorCUlOCXN0cnVjdCBuZXRfZGV2aWNlCSpuZXRfZGV2LAorCUlOCU9VVAlzdHJ1Y3QgaWZyZXEJKnJxLAorCUlOCUlOVAkJCQkJY21kKQoreworCVBPU19DT09LSUUJCQlwT2JqOworCVZJUlRVQUxfQURBUFRFUgkJKnBWaXJ0dWFsQWQgPSBOVUxMOworCVJUTVBfQURBUFRFUiAgICAgICAgKnBBZCA9IE5VTEw7CisJc3RydWN0IGl3cmVxICAgICAgICAqd3JxID0gKHN0cnVjdCBpd3JlcSAqKSBycTsKKwlCT09MRUFOCQkJCVN0YXRlTWFjaGluZVRvdWNoZWQgPSBGQUxTRTsKKwlJTlQJCQkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisJVVNIT1JUCQkJCXN1YmNtZDsKKworCWlmIChuZXRfZGV2LT5wcml2X2ZsYWdzID09IElOVF9NQUlOKQorCXsKKwkJcEFkID0gbmV0X2Rldi0+bWxfcHJpdjsKKwl9CisJZWxzZQorCXsKKwkJcFZpcnR1YWxBZCA9IG5ldF9kZXYtPm1sX3ByaXY7CisJCXBBZCA9IHBWaXJ0dWFsQWQtPlJ0bXBEZXYtPm1sX3ByaXY7CisJfQorCXBPYmogPSAoUE9TX0NPT0tJRSkgcEFkLT5PU19Db29raWU7CisKKwlpZiAocEFkID09IE5VTEwpCisJeworCQkvKiBpZiAxc3Qgb3BlbiBmYWlsLCBwQWQgd2lsbCBiZSBmcmVlOworCQkgICBTbyB0aGUgbmV0X2Rldi0+bWxfcHJpdiB3aWxsIGJlIE5VTEwgaW4gMnJkIG9wZW4gKi8KKwkJcmV0dXJuIC1FTkVURE9XTjsKKwl9CisKKyAgICAvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgorICAgIGlmKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCisgICAgeworI2lmZGVmIENPTkZJR19BUFNUQV9NSVhFRF9TVVBQT1JUCisJICAgIGlmICh3cnEtPnUuZGF0YS5wb2ludGVyID09IE5VTEwpCisJICAgIHsKKwkJICAgIHJldHVybiBTdGF0dXM7CisJICAgIH0KKworCSAgICBpZiAoc3Ryc3RyKHdycS0+dS5kYXRhLnBvaW50ZXIsICJPcE1vZGUiKSA9PSBOVUxMKQorI2VuZGlmIC8vIENPTkZJR19BUFNUQV9NSVhFRF9TVVBQT1JUIC8vCisgICAgICAgIHsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKwkJICAgIHJldHVybiAtRU5FVERPV047CisgICAgICAgIH0KKyAgICB9CisKKwl7CS8vIGRldGVybWluZSB0aGlzIGlvY3RsIGNvbW1hbmQgaXMgY29tbWluZyBmcm9tIHdoaWNoIGludGVyZmFjZS4KKwkJcE9iai0+aW9jdGxfaWZfdHlwZSA9IElOVF9NQUlOOworCQlwT2JqLT5pb2N0bF9pZiA9IE1BSU5fTUJTU0lEOworCX0KKworCXN3aXRjaChjbWQpCisJeworI2lmZGVmIFJBTElOS19BVEUKKyNpZmRlZiBSQUxJTktfMjh4eF9RQQorCQljYXNlIFJUUFJJVl9JT0NUTF9BVEU6CisJCQl7CisJCQkJUnRtcERvQXRlKHBBZCwgd3JxKTsKKwkJCX0KKwkJCWJyZWFrOworI2VuZGlmIC8vIFJBTElOS18yOHh4X1FBIC8vCisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworICAgICAgICBjYXNlIFNJT0NHSUZIV0FERFI6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJT0NUTDo6U0lPQ0dJRkhXQUREUlxuIikpOworCQkJbWVtY3B5KHdycS0+dS5uYW1lLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBFVEhfQUxFTik7CisJCQlicmVhazsKKwkJY2FzZSBTSU9DR0lXTkFNRToKKyAgICAgICAgeworICAgICAgICAJY2hhciAqbmFtZT0md3JxLT51Lm5hbWVbMF07CisgICAgICAgIAlydF9pb2N0bF9naXduYW1lKG5ldF9kZXYsIE5VTEwsIG5hbWUsIE5VTEwpOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBTSU9DR0lXRVNTSUQ6ICAvL0dldCBFU1NJRAorICAgICAgICB7CisgICAgICAgIAlzdHJ1Y3QgaXdfcG9pbnQgKmVzc2lkPSZ3cnEtPnUuZXNzaWQ7CisgICAgICAgIAlydF9pb2N0bF9naXdlc3NpZChuZXRfZGV2LCBOVUxMLCBlc3NpZCwgZXNzaWQtPnBvaW50ZXIpOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBTSU9DU0lXRVNTSUQ6ICAvL1NldCBFU1NJRAorICAgICAgICB7CisgICAgICAgIAlzdHJ1Y3QgaXdfcG9pbnQJKmVzc2lkPSZ3cnEtPnUuZXNzaWQ7CisgICAgICAgIAlydF9pb2N0bF9zaXdlc3NpZChuZXRfZGV2LCBOVUxMLCBlc3NpZCwgZXNzaWQtPnBvaW50ZXIpOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBTSU9DU0lXTldJRDogICAvLyBzZXQgbmV0d29yayBpZCAodGhlIGNlbGwpCisJCWNhc2UgU0lPQ0dJV05XSUQ6ICAgLy8gZ2V0IG5ldHdvcmsgaWQKKwkJCVN0YXR1cyA9IC1FT1BOT1RTVVBQOworCQkJYnJlYWs7CisJCWNhc2UgU0lPQ1NJV0ZSRVE6ICAgLy9zZXQgY2hhbm5lbC9mcmVxdWVuY3kgKEh6KQorICAgICAgICB7CisgICAgICAgIAlzdHJ1Y3QgaXdfZnJlcSAqZnJlcT0md3JxLT51LmZyZXE7CisgICAgICAgIAlydF9pb2N0bF9zaXdmcmVxKG5ldF9kZXYsIE5VTEwsIGZyZXEsIE5VTEwpOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBTSU9DR0lXRlJFUTogICAvLyBnZXQgY2hhbm5lbC9mcmVxdWVuY3kgKEh6KQorICAgICAgICB7CisgICAgICAgIAlzdHJ1Y3QgaXdfZnJlcSAqZnJlcT0md3JxLT51LmZyZXE7CisgICAgICAgIAlydF9pb2N0bF9naXdmcmVxKG5ldF9kZXYsIE5VTEwsIGZyZXEsIE5VTEwpOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBTSU9DU0lXTklDS046IC8vc2V0IG5vZGUgbmFtZS9uaWNrbmFtZQorICAgICAgICB7CisgICAgICAgIAlzdHJ1Y3QgaXdfcG9pbnQgKmRhdGE9JndycS0+dS5kYXRhOworICAgICAgICAJcnRfaW9jdGxfc2l3bmlja24obmV0X2RldiwgTlVMTCwgZGF0YSwgTlVMTCk7CisJCQlicmVhazsKKwkJfQorCQljYXNlIFNJT0NHSVdOSUNLTjogLy9nZXQgbm9kZSBuYW1lL25pY2tuYW1lCisgICAgICAgIHsKKyAgICAgICAgCXN0cnVjdCBpd19wb2ludCAqZGF0YT0md3JxLT51LmRhdGE7CisgICAgICAgIAlydF9pb2N0bF9naXduaWNrbihuZXRfZGV2LCBOVUxMLCBkYXRhLCBOVUxMKTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgU0lPQ0dJV1JBVEU6ICAgLy9nZXQgZGVmYXVsdCBiaXQgcmF0ZSAoYnBzKQorCQkgICAgcnRfaW9jdGxfZ2l3cmF0ZShuZXRfZGV2LCBOVUxMLCAmd3JxLT51LCBOVUxMKTsKKyAgICAgICAgICAgIGJyZWFrOworCSAgICBjYXNlIFNJT0NTSVdSQVRFOiAgLy9zZXQgZGVmYXVsdCBiaXQgcmF0ZSAoYnBzKQorCSAgICAgICAgcnRfaW9jdGxfc2l3cmF0ZShuZXRfZGV2LCBOVUxMLCAmd3JxLT51LCBOVUxMKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNJT0NHSVdSVFM6ICAvLyBnZXQgUlRTL0NUUyB0aHJlc2hvbGQgKGJ5dGVzKQorICAgICAgICB7CisgICAgICAgIAlzdHJ1Y3QgaXdfcGFyYW0gKnJ0cz0md3JxLT51LnJ0czsKKyAgICAgICAgCXJ0X2lvY3RsX2dpd3J0cyhuZXRfZGV2LCBOVUxMLCBydHMsIE5VTEwpOworCQkJYnJlYWs7CisJCX0KKyAgICAgICAgY2FzZSBTSU9DU0lXUlRTOiAgLy9zZXQgUlRTL0NUUyB0aHJlc2hvbGQgKGJ5dGVzKQorICAgICAgICB7CisgICAgICAgIAlzdHJ1Y3QgaXdfcGFyYW0gKnJ0cz0md3JxLT51LnJ0czsKKyAgICAgICAgCXJ0X2lvY3RsX3Npd3J0cyhuZXRfZGV2LCBOVUxMLCBydHMsIE5VTEwpOworCQkJYnJlYWs7CisJCX0KKyAgICAgICAgY2FzZSBTSU9DR0lXRlJBRzogIC8vZ2V0IGZyYWdtZW50YXRpb24gdGhyIChieXRlcykKKyAgICAgICAgeworICAgICAgICAJc3RydWN0IGl3X3BhcmFtICpmcmFnPSZ3cnEtPnUuZnJhZzsKKyAgICAgICAgCXJ0X2lvY3RsX2dpd2ZyYWcobmV0X2RldiwgTlVMTCwgZnJhZywgTlVMTCk7CisJCQlicmVhazsKKwkJfQorICAgICAgICBjYXNlIFNJT0NTSVdGUkFHOiAgLy9zZXQgZnJhZ21lbnRhdGlvbiB0aHIgKGJ5dGVzKQorICAgICAgICB7CisgICAgICAgIAlzdHJ1Y3QgaXdfcGFyYW0gKmZyYWc9JndycS0+dS5mcmFnOworICAgICAgICAJcnRfaW9jdGxfc2l3ZnJhZyhuZXRfZGV2LCBOVUxMLCBmcmFnLCBOVUxMKTsKKwkJCWJyZWFrOworCQl9CisgICAgICAgIGNhc2UgU0lPQ0dJV0VOQ09ERTogIC8vZ2V0IGVuY29kaW5nIHRva2VuICYgbW9kZQorICAgICAgICB7CisgICAgICAgIAlzdHJ1Y3QgaXdfcG9pbnQgKmVycT0md3JxLT51LmVuY29kaW5nOworICAgICAgICAJaWYoZXJxLT5wb2ludGVyKQorICAgICAgICAJCXJ0X2lvY3RsX2dpd2VuY29kZShuZXRfZGV2LCBOVUxMLCBlcnEsIGVycS0+cG9pbnRlcik7CisJCQlicmVhazsKKwkJfQorICAgICAgICBjYXNlIFNJT0NTSVdFTkNPREU6ICAvL3NldCBlbmNvZGluZyB0b2tlbiAmIG1vZGUKKyAgICAgICAgeworICAgICAgICAJc3RydWN0IGl3X3BvaW50ICplcnE9JndycS0+dS5lbmNvZGluZzsKKyAgICAgICAgCWlmKGVycS0+cG9pbnRlcikKKyAgICAgICAgCQlydF9pb2N0bF9zaXdlbmNvZGUobmV0X2RldiwgTlVMTCwgZXJxLCBlcnEtPnBvaW50ZXIpOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBTSU9DR0lXQVA6ICAgICAvL2dldCBhY2Nlc3MgcG9pbnQgTUFDIGFkZHJlc3NlcworICAgICAgICB7CisgICAgICAgIAlzdHJ1Y3Qgc29ja2FkZHIgKmFwX2FkZHI9JndycS0+dS5hcF9hZGRyOworICAgICAgICAJcnRfaW9jdGxfZ2l3YXAobmV0X2RldiwgTlVMTCwgYXBfYWRkciwgYXBfYWRkci0+c2FfZGF0YSk7CisJCQlicmVhazsKKwkJfQorCSAgICBjYXNlIFNJT0NTSVdBUDogIC8vc2V0IGFjY2VzcyBwb2ludCBNQUMgYWRkcmVzc2VzCisgICAgICAgIHsKKyAgICAgICAgCXN0cnVjdCBzb2NrYWRkciAqYXBfYWRkcj0md3JxLT51LmFwX2FkZHI7CisgICAgICAgIAlydF9pb2N0bF9zaXdhcChuZXRfZGV2LCBOVUxMLCBhcF9hZGRyLCBhcF9hZGRyLT5zYV9kYXRhKTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgU0lPQ0dJV01PREU6ICAgLy9nZXQgb3BlcmF0aW9uIG1vZGUKKyAgICAgICAgeworICAgICAgICAJX191MzIgKm1vZGU9JndycS0+dS5tb2RlOworICAgICAgICAJcnRfaW9jdGxfZ2l3bW9kZShuZXRfZGV2LCBOVUxMLCBtb2RlLCBOVUxMKTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgU0lPQ1NJV01PREU6ICAgLy9zZXQgb3BlcmF0aW9uIG1vZGUKKyAgICAgICAgeworICAgICAgICAJX191MzIgKm1vZGU9JndycS0+dS5tb2RlOworICAgICAgICAJcnRfaW9jdGxfc2l3bW9kZShuZXRfZGV2LCBOVUxMLCBtb2RlLCBOVUxMKTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgU0lPQ0dJV1NFTlM6ICAgLy9nZXQgc2Vuc2l0aXZpdHkgKGRCbSkKKwkJY2FzZSBTSU9DU0lXU0VOUzoJLy9zZXQgc2Vuc2l0aXZpdHkgKGRCbSkKKwkJY2FzZSBTSU9DR0lXUE9XRVI6ICAvL2dldCBQb3dlciBNYW5hZ2VtZW50IHNldHRpbmdzCisJCWNhc2UgU0lPQ1NJV1BPV0VSOiAgLy9zZXQgUG93ZXIgTWFuYWdlbWVudCBzZXR0aW5ncworCQljYXNlIFNJT0NHSVdUWFBPVzogIC8vZ2V0IHRyYW5zbWl0IHBvd2VyIChkQm0pCisJCWNhc2UgU0lPQ1NJV1RYUE9XOiAgLy9zZXQgdHJhbnNtaXQgcG93ZXIgKGRCbSkKKwkJY2FzZSBTSU9DR0lXUkFOR0U6CS8vR2V0IHJhbmdlIG9mIHBhcmFtZXRlcnMKKwkJY2FzZSBTSU9DR0lXUkVUUlk6CS8vZ2V0IHJldHJ5IGxpbWl0cyBhbmQgbGlmZXRpbWUKKwkJY2FzZSBTSU9DU0lXUkVUUlk6CS8vc2V0IHJldHJ5IGxpbWl0cyBhbmQgbGlmZXRpbWUKKwkJCVN0YXR1cyA9IC1FT1BOT1RTVVBQOworCQkJYnJlYWs7CisJCWNhc2UgUlRfUFJJVl9JT0NUTDoKKwkJCXN1YmNtZCA9IHdycS0+dS5kYXRhLmZsYWdzOworCQkJaWYoIHN1YmNtZCAmIE9JRF9HRVRfU0VUX1RPR0dMRSkKKwkJCQlTdGF0dXMgPSBSVE1QU2V0SW5mb3JtYXRpb24ocEFkLCBycSwgc3ViY21kKTsKKwkJCWVsc2UKKwkJCQlTdGF0dXMgPSBSVE1QUXVlcnlJbmZvcm1hdGlvbihwQWQsIHJxLCBzdWJjbWQpOworCQkJYnJlYWs7CisJCWNhc2UgU0lPQ0dJV1BSSVY6CisJCQlpZiAod3JxLT51LmRhdGEucG9pbnRlcikKKwkJCXsKKwkJCQlpZiAoIGFjY2Vzc19vayhWRVJJRllfV1JJVEUsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHNpemVvZihwcml2dGFiKSkgIT0gVFJVRSkKKwkJCQkJYnJlYWs7CisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHByaXZ0YWIpIC8gc2l6ZW9mKHByaXZ0YWJbMF0pOworCQkJCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcHJpdnRhYiwgc2l6ZW9mKHByaXZ0YWIpKSkKKwkJCQkJU3RhdHVzID0gLUVGQVVMVDsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFJUUFJJVl9JT0NUTF9TRVQ6CisJCQlpZihhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCkgIT0gVFJVRSkKKwkJCQlicmVhazsKKwkJCXJ0X2lvY3RsX3NldHBhcmFtKG5ldF9kZXYsIE5VTEwsIE5VTEwsIHdycS0+dS5kYXRhLnBvaW50ZXIpOworCQkJYnJlYWs7CisJCWNhc2UgUlRQUklWX0lPQ1RMX0dTSVRFU1VSVkVZOgorCQkJUlRNUElvY3RsR2V0U2l0ZVN1cnZleShwQWQsIHdycSk7CisJCSAgICBicmVhazsKKyNpZmRlZiBEQkcKKwkJY2FzZSBSVFBSSVZfSU9DVExfTUFDOgorCQkJUlRNUElvY3RsTUFDKHBBZCwgd3JxKTsKKwkJCWJyZWFrOworCQljYXNlIFJUUFJJVl9JT0NUTF9FMlA6CisJCQlSVE1QSW9jdGxFMlBST00ocEFkLCB3cnEpOworCQkJYnJlYWs7CisjZW5kaWYgLy8gREJHIC8vCisgICAgICAgIGNhc2UgU0lPQ0VUSFRPT0w6CisgICAgICAgICAgICAgICAgYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJJT0NUTDo6dW5rbm93biBJT0NUTCdzIGNtZCA9IDB4JTA4eFxuIiwgY21kKSk7CisJCQlTdGF0dXMgPSAtRU9QTk9UU1VQUDsKKwkJCWJyZWFrOworCX0KKworICAgIGlmKFN0YXRlTWFjaGluZVRvdWNoZWQpIC8vIFVwcGVyIGxheWVyIHNlbnQgYSBNTE1FLXJlbGF0ZWQgb3BlcmF0aW9ucworICAgIAlSVDI4WFhfTUxNRV9IQU5ETEVSKHBBZCk7CisKKwlyZXR1cm4gU3RhdHVzOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBTU0lECisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQgU2V0X1NTSURfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKQoreworICAgIE5ESVNfODAyXzExX1NTSUQgICAgICAgICAgICAgICAgICAgIFNzaWQsICpwU3NpZD1OVUxMOworICAgIEJPT0xFQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXRlTWFjaGluZVRvdWNoZWQgPSBGQUxTRTsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzID0gVFJVRTsKKworICAgIGlmKCBzdHJsZW4oYXJnKSA8PSBNQVhfTEVOX09GX1NTSUQpCisgICAgeworICAgICAgICBOZGlzWmVyb01lbW9yeSgmU3NpZCwgc2l6ZW9mKE5ESVNfODAyXzExX1NTSUQpKTsKKyAgICAgICAgaWYgKHN0cmxlbihhcmcpICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KFNzaWQuU3NpZCwgYXJnLCBzdHJsZW4oYXJnKSk7CisgICAgICAgICAgICBTc2lkLlNzaWRMZW5ndGggPSBzdHJsZW4oYXJnKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlICAgLy9BTlkgc3NpZAorICAgICAgICB7CisgICAgICAgICAgICBTc2lkLlNzaWRMZW5ndGggPSAwOworCQkgICAgbWVtY3B5KFNzaWQuU3NpZCwgIiIsIDApOworCQkJcEFkYXB0ZXItPlN0YUNmZy5Cc3NUeXBlID0gQlNTX0lORlJBOworCQkJcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZU9wZW47CisJICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cyAgPSBOZGlzODAyXzExRW5jcnlwdGlvbkRpc2FibGVkOworCQl9CisgICAgICAgIHBTc2lkID0gJlNzaWQ7CisKKyAgICAgICAgaWYgKHBBZGFwdGVyLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSAhPSBDTlRMX0lETEUpCisgICAgICAgIHsKKyAgICAgICAgICAgIFJUMjhYWF9NTE1FX1JFU0VUX1NUQVRFX01BQ0hJTkUocEFkYXB0ZXIpOworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIE1MTUUgYnVzeSwgcmVzZXQgTUxNRSBzdGF0ZSBtYWNoaW5lICEhIVxuIikpOworICAgICAgICB9CisKKyAgICAgICAgcEFkYXB0ZXItPk1sbWVBdXguQ3VyclJlcUlzRnJvbU5kaXMgPSBUUlVFOworICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLmJTY2FuUmVxSXNGcm9tV2ViVUkgPSBGQUxTRTsKKwkJcEFkYXB0ZXItPmJDb25maWdDaGFuZ2VkID0gVFJVRTsKKworICAgICAgICBNbG1lRW5xdWV1ZShwQWRhcHRlciwKKyAgICAgICAgICAgICAgICAgICAgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsCisgICAgICAgICAgICAgICAgICAgIE9JRF84MDJfMTFfU1NJRCwKKyAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKE5ESVNfODAyXzExX1NTSUQpLAorICAgICAgICAgICAgICAgICAgICAoVk9JRCAqKXBTc2lkKTsKKworICAgICAgICBTdGF0ZU1hY2hpbmVUb3VjaGVkID0gVFJVRTsKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X1NTSURfUHJvYzo6KExlbj0lZCxTc2lkPSVzKVxuIiwgU3NpZC5Tc2lkTGVuZ3RoLCBTc2lkLlNzaWQpKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBzdWNjZXNzID0gRkFMU0U7CisKKyAgICBpZiAoU3RhdGVNYWNoaW5lVG91Y2hlZCkgLy8gVXBwZXIgbGF5ZXIgc2VudCBhIE1MTUUtcmVsYXRlZCBvcGVyYXRpb25zCisgICAgCVJUMjhYWF9NTE1FX0hBTkRMRVIocEFkYXB0ZXIpOworCisgICAgcmV0dXJuIHN1Y2Nlc3M7Cit9CisKKyNpZmRlZiBXTU1fU1VQUE9SVAorLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgV21tQ2FwYWJsZSBFbmFibGUgb3IgRGlzYWJsZQorICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UCVNldF9XbW1DYXBhYmxlX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCUJPT0xFQU4JYldtbUNhcGFibGU7CisKKwliV21tQ2FwYWJsZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisKKwlpZiAoKGJXbW1DYXBhYmxlID09IDEpCisjaWZkZWYgUlQyODcwCisJCSYmIChwQWQtPk51bWJlck9mUGlwZXMgPj0gNSkKKyNlbmRpZiAvLyBSVDI4NzAgLy8KKwkJKQorCQlwQWQtPkNvbW1vbkNmZy5iV21tQ2FwYWJsZSA9IFRSVUU7CisJZWxzZSBpZiAoYldtbUNhcGFibGUgPT0gMCkKKwkJcEFkLT5Db21tb25DZmcuYldtbUNhcGFibGUgPSBGQUxTRTsKKwllbHNlCisJCXJldHVybiBGQUxTRTsgIC8vSW52YWxpZCBhcmd1bWVudAorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X1dtbUNhcGFibGVfUHJvYzo6KGJXbW1DYXBhYmxlPSVkKVxuIiwKKwkJcEFkLT5Db21tb25DZmcuYldtbUNhcGFibGUpKTsKKworCXJldHVybiBUUlVFOworfQorI2VuZGlmIC8vIFdNTV9TVVBQT1JUIC8vCisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IE5ldHdvcmsgVHlwZShJbmZyYXN0cnVjdHVyZS9BZGhvYyBtb2RlKQorICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UIFNldF9OZXR3b3JrVHlwZV9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpCit7CisgICAgVUlOVDMyCVZhbHVlID0gMDsKKworICAgIGlmIChzdHJjbXAoYXJnLCAiQWRob2MiKSA9PSAwKQorCXsKKwkJaWYgKHBBZGFwdGVyLT5TdGFDZmcuQnNzVHlwZSAhPSBCU1NfQURIT0MpCisJCXsKKwkJCS8vIENvbmZpZyBoYXMgY2hhbmdlZAorCQkJcEFkYXB0ZXItPmJDb25maWdDaGFuZ2VkID0gVFJVRTsKKyAgICAgICAgICAgIGlmIChNT05JVE9SX09OKHBBZGFwdGVyKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBSVE1QX0lPX1dSSVRFMzIocEFkYXB0ZXIsIFJYX0ZJTFRSX0NGRywgU1RBTk9STUFMKTsKKyAgICAgICAgICAgICAgICBSVE1QX0lPX1JFQUQzMihwQWRhcHRlciwgTUFDX1NZU19DVFJMLCAmVmFsdWUpOworCQkJCVZhbHVlICY9ICh+MHg4MCk7CisJCQkJUlRNUF9JT19XUklURTMyKHBBZGFwdGVyLCBNQUNfU1lTX0NUUkwsIFZhbHVlKTsKKyAgICAgICAgICAgICAgICBPUFNUQVRVU19DTEVBUl9GTEFHKHBBZGFwdGVyLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCk7CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5iQXV0b1JlY29ubmVjdCA9IFRSVUU7CisgICAgICAgICAgICAgICAgTGlua0Rvd24ocEFkYXB0ZXIsIEZBTFNFKTsKKyAgICAgICAgICAgIH0KKwkJCWlmIChJTkZSQV9PTihwQWRhcHRlcikpCisJCQl7CisJCQkJLy9CT09MRUFOIENhbmNlbGxlZDsKKwkJCQkvLyBTZXQgdGhlIEF1dG9SZWNvbm5lY3RTc2lkIHRvIHByZXZlbnQgaXQgcmVjb25uZWN0IHRvIG9sZCBTU0lECisJCQkJLy8gU2luY2UgY2FsbGluZyB0aGlzIGluZGljYXRlIHVzZXIgZG9uJ3Qgd2FudCB0byBjb25uZWN0IHRvIHRoYXQgU1NJRCBhbnltb3JlLgorCQkJCXBBZGFwdGVyLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuPSAzMjsKKwkJCQlOZGlzWmVyb01lbW9yeShwQWRhcHRlci0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZCwgcEFkYXB0ZXItPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWRMZW4pOworCisJCQkJTGlua0Rvd24ocEFkYXB0ZXIsIEZBTFNFKTsKKworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk5ESVNfU1RBVFVTX01FRElBX0RJU0NPTk5FQ1QgRXZlbnQgQkIhXG4iKSk7CisJCQl9CisJCX0KKwkJcEFkYXB0ZXItPlN0YUNmZy5Cc3NUeXBlID0gQlNTX0FESE9DOworICAgICAgICBwQWRhcHRlci0+bmV0X2Rldi0+dHlwZSA9IHBBZGFwdGVyLT5TdGFDZmcuT3JpRGV2VHlwZTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PlNldF9OZXR3b3JrVHlwZV9Qcm9jOjooQUQtSE9DKVxuIikpOworCX0KKyAgICBlbHNlIGlmIChzdHJjbXAoYXJnLCAiSW5mcmEiKSA9PSAwKQorCXsKKwkJaWYgKHBBZGFwdGVyLT5TdGFDZmcuQnNzVHlwZSAhPSBCU1NfSU5GUkEpCisJCXsKKwkJCS8vIENvbmZpZyBoYXMgY2hhbmdlZAorCQkJcEFkYXB0ZXItPmJDb25maWdDaGFuZ2VkID0gVFJVRTsKKyAgICAgICAgICAgIGlmIChNT05JVE9SX09OKHBBZGFwdGVyKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBSVE1QX0lPX1dSSVRFMzIocEFkYXB0ZXIsIFJYX0ZJTFRSX0NGRywgU1RBTk9STUFMKTsKKyAgICAgICAgICAgICAgICBSVE1QX0lPX1JFQUQzMihwQWRhcHRlciwgTUFDX1NZU19DVFJMLCAmVmFsdWUpOworCQkJCVZhbHVlICY9ICh+MHg4MCk7CisJCQkJUlRNUF9JT19XUklURTMyKHBBZGFwdGVyLCBNQUNfU1lTX0NUUkwsIFZhbHVlKTsKKyAgICAgICAgICAgICAgICBPUFNUQVRVU19DTEVBUl9GTEFHKHBBZGFwdGVyLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCk7CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5iQXV0b1JlY29ubmVjdCA9IFRSVUU7CisgICAgICAgICAgICAgICAgTGlua0Rvd24ocEFkYXB0ZXIsIEZBTFNFKTsKKyAgICAgICAgICAgIH0KKwkJCWlmIChBREhPQ19PTihwQWRhcHRlcikpCisJCQl7CisJCQkJLy8gU2V0IHRoZSBBdXRvUmVjb25uZWN0U3NpZCB0byBwcmV2ZW50IGl0IHJlY29ubmVjdCB0byBvbGQgU1NJRAorCQkJCS8vIFNpbmNlIGNhbGxpbmcgdGhpcyBpbmRpY2F0ZSB1c2VyIGRvbid0IHdhbnQgdG8gY29ubmVjdCB0byB0aGF0IFNTSUQgYW55bW9yZS4KKwkJCQlwQWRhcHRlci0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbj0gMzI7CisJCQkJTmRpc1plcm9NZW1vcnkocEFkYXB0ZXItPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWQsIHBBZGFwdGVyLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuKTsKKworCQkJCUxpbmtEb3duKHBBZGFwdGVyLCBGQUxTRSk7CisJCQl9CisJCX0KKwkJcEFkYXB0ZXItPlN0YUNmZy5Cc3NUeXBlID0gQlNTX0lORlJBOworICAgICAgICBwQWRhcHRlci0+bmV0X2Rldi0+dHlwZSA9IHBBZGFwdGVyLT5TdGFDZmcuT3JpRGV2VHlwZTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PlNldF9OZXR3b3JrVHlwZV9Qcm9jOjooSU5GUkEpXG4iKSk7CisKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5Cc3NUeXBlID0gQlNTX0lORlJBOworCX0KKyAgICBlbHNlIGlmIChzdHJjbXAoYXJnLCAiTW9uaXRvciIpID09IDApCisgICAgeworCQlVQ0hBUgliYnBWYWx1ZSA9IDA7CisJCUJDTl9USU1FX0NGR19TVFJVQyBjc3I7CisJCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkYXB0ZXIsIGZPUF9TVEFUVVNfSU5GUkFfT04pOworICAgICAgICBPUFNUQVRVU19DTEVBUl9GTEFHKHBBZGFwdGVyLCBmT1BfU1RBVFVTX0FESE9DX09OKTsKKwkJT1BTVEFUVVNfU0VUX0ZMQUcocEFkYXB0ZXIsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKTsKKwkJLy8gZGlzYWJsZSBhbGwgcGVyaW9kaWMgc3RhdGUgbWFjaGluZQorCQlwQWRhcHRlci0+U3RhQ2ZnLmJBdXRvUmVjb25uZWN0ID0gRkFMU0U7CisJCS8vIHJlc2V0IGFsbCBtbG1lIHN0YXRlIG1hY2hpbmUKKwkJUlQyOFhYX01MTUVfUkVTRVRfU1RBVEVfTUFDSElORShwQWRhcHRlcik7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoImZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEIFxuIikpOworICAgICAgICBpZiAocEFkYXB0ZXItPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA9PSAwKQorICAgICAgICB7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisgICAgICAgICAgICBpZiAocEFkYXB0ZXItPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUFOX01JWEVEKQorICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPSAzNjsKKyAgICAgICAgICAgIGVsc2UKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsID0gNjsKKyAgICAgICAgfQorI2lmZGVmIERPVDExX05fU1VQUE9SVAorICAgICAgICBlbHNlCisgICAgICAgICAgICBOX0NoYW5uZWxDaGVjayhwQWRhcHRlcik7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwlpZiAocEFkYXB0ZXItPkNvbW1vbkNmZy5QaHlNb2RlID49IFBIWV8xMUFCR05fTUlYRUQgJiYKKyAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXID09IEJXXzQwICYmCisgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5FWFRDSEEgPT0gRVhUQ0hBX0FCT1ZFKQorCQl7CisJCQkvLyA0ME1IeiAsY29udHJvbCBjaGFubmVsIGF0IGxvd2VyCisJCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkYXB0ZXIsIEJCUF9SNCwgJmJicFZhbHVlKTsKKwkJCWJicFZhbHVlICY9ICh+MHgxOCk7CisJCQliYnBWYWx1ZSB8PSAweDEwOworCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWRhcHRlciwgQkJQX1I0LCBiYnBWYWx1ZSk7CisJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkJCUEN1cnJlbnRCVyA9IEJXXzQwOworCQkJLy8gIFJYIDogY29udHJvbCBjaGFubmVsIGF0IGxvd2VyCisJCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkYXB0ZXIsIEJCUF9SMywgJmJicFZhbHVlKTsKKwkJCWJicFZhbHVlICY9ICh+MHgyMCk7CisJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZGFwdGVyLCBCQlBfUjMsIGJicFZhbHVlKTsKKworCQkJUlRNUF9JT19SRUFEMzIocEFkYXB0ZXIsIFRYX0JBTkRfQ0ZHLCAmVmFsdWUpOworCQkJVmFsdWUgJj0gMHhmZmZmZmZmZTsKKwkJCVJUTVBfSU9fV1JJVEUzMihwQWRhcHRlciwgVFhfQkFORF9DRkcsIFZhbHVlKTsKKwkJCXBBZGFwdGVyLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWwgKyAyOworICAgICAgICAgICAgQXNpY1N3aXRjaENoYW5uZWwocEFkYXB0ZXIsIHBBZGFwdGVyLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwsIEZBTFNFKTsKKwkJICAgIEFzaWNMb2NrQ2hhbm5lbChwQWRhcHRlciwgcEFkYXB0ZXItPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCk7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJCV180MCAsY29udHJvbF9jaGFubmVsKCVkKSwgQ2VudHJhbENoYW5uZWwoJWQpIFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuQ2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwpKTsKKwkJfQorCQllbHNlIGlmIChwQWRhcHRlci0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCAmJgorICAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5CVyA9PSBCV180MCAmJgorICAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5FWFRDSEEgPT0gRVhUQ0hBX0JFTE9XKQorCQl7CisJCQkvLyA0ME1IeiAsY29udHJvbCBjaGFubmVsIGF0IHVwcGVyCisJCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkYXB0ZXIsIEJCUF9SNCwgJmJicFZhbHVlKTsKKwkJCWJicFZhbHVlICY9ICh+MHgxOCk7CisJCQliYnBWYWx1ZSB8PSAweDEwOworCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWRhcHRlciwgQkJQX1I0LCBiYnBWYWx1ZSk7CisJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkJCUEN1cnJlbnRCVyA9IEJXXzQwOworCQkJUlRNUF9JT19SRUFEMzIocEFkYXB0ZXIsIFRYX0JBTkRfQ0ZHLCAmVmFsdWUpOworCQkJVmFsdWUgfD0gMHgxOworCQkJUlRNUF9JT19XUklURTMyKHBBZGFwdGVyLCBUWF9CQU5EX0NGRywgVmFsdWUpOworCisJCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkYXB0ZXIsIEJCUF9SMywgJmJicFZhbHVlKTsKKwkJCWJicFZhbHVlIHw9ICgweDIwKTsKKwkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkYXB0ZXIsIEJCUF9SMywgYmJwVmFsdWUpOworCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA9IHBBZGFwdGVyLT5Db21tb25DZmcuQ2hhbm5lbCAtIDI7CisgICAgICAgICAgICBBc2ljU3dpdGNoQ2hhbm5lbChwQWRhcHRlciwgcEFkYXB0ZXItPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCwgRkFMU0UpOworCQkgICAgQXNpY0xvY2tDaGFubmVsKHBBZGFwdGVyLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsKTsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkJXXzQwICxjb250cm9sX2NoYW5uZWwoJWQpLCBDZW50cmFsQ2hhbm5lbCglZCkgXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCkpOworCQl9CisJCWVsc2UKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJeworCQkJLy8gMjBNSHoKKwkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWRhcHRlciwgQkJQX1I0LCAmYmJwVmFsdWUpOworCQkJYmJwVmFsdWUgJj0gKH4weDE4KTsKKwkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkYXB0ZXIsIEJCUF9SNCwgYmJwVmFsdWUpOworCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5CQlBDdXJyZW50QlcgPSBCV18yMDsKKwkJCUFzaWNTd2l0Y2hDaGFubmVsKHBBZGFwdGVyLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWwsIEZBTFNFKTsKKwkJCUFzaWNMb2NrQ2hhbm5lbChwQWRhcHRlciwgcEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkJXXzIwLCBDaGFubmVsKCVkKVxuIiwgcEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsKSk7CisJCX0KKwkJLy8gRW5hYmxlIFJ4IHdpdGggcHJvbWlzY3VvdXMgcmVjZXB0aW9uCisJCVJUTVBfSU9fV1JJVEUzMihwQWRhcHRlciwgUlhfRklMVFJfQ0ZHLCAweDMpOworCQkvLyBBU0lDIHN1cHBvcnN0cyBzbmlmZmVyIGZ1bmN0aW9uIHdpdGggcmVwbGFjaW5nIFJTU0kgd2l0aCB0aW1lc3RhbXAuCisJCS8vUlRNUF9JT19SRUFEMzIocEFkYXB0ZXIsIE1BQ19TWVNfQ1RSTCwgJlZhbHVlKTsKKwkJLy9WYWx1ZSB8PSAoMHg4MCk7CisJCS8vUlRNUF9JT19XUklURTMyKHBBZGFwdGVyLCBNQUNfU1lTX0NUUkwsIFZhbHVlKTsKKwkJLy8gZGlzYWJsZSBzeW5jCisJCVJUTVBfSU9fUkVBRDMyKHBBZGFwdGVyLCBCQ05fVElNRV9DRkcsICZjc3Iud29yZCk7CisJCWNzci5maWVsZC5iQmVhY29uR2VuID0gMDsKKwkJY3NyLmZpZWxkLmJUQlRURW5hYmxlID0gMDsKKwkJY3NyLmZpZWxkLlRzZlN5bmNNb2RlID0gMDsKKwkJUlRNUF9JT19XUklURTMyKHBBZGFwdGVyLCBCQ05fVElNRV9DRkcsIGNzci53b3JkKTsKKworCQlwQWRhcHRlci0+U3RhQ2ZnLkJzc1R5cGUgPSBCU1NfTU9OSVRPUjsKKyAgICAgICAgcEFkYXB0ZXItPm5ldF9kZXYtPnR5cGUgPSBBUlBIUkRfSUVFRTgwMjExX1BSSVNNOyAvL0FSUEhSRF9JRUVFODAyMTE7IC8vIElFRUU4MDIxMQorCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT0+U2V0X05ldHdvcmtUeXBlX1Byb2M6OihNT05JVE9SKVxuIikpOworICAgIH0KKworICAgIC8vIFJlc2V0IFJhbGluayBzdXBwbGljYW50IHRvIG5vdCB1c2UsIGl0IHdpbGwgYmUgc2V0IHRvIHN0YXJ0IHdoZW4gVUkgc2V0IFBNSyBrZXkKKyAgICBwQWRhcHRlci0+U3RhQ2ZnLldwYVN0YXRlID0gU1NfTk9UVVNFOworCisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X05ldHdvcmtUeXBlX1Byb2M6OihOZXR3b3JrVHlwZT0lZClcbiIsIHBBZGFwdGVyLT5TdGFDZmcuQnNzVHlwZSkpOworCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IEF1dGhlbnRpY2F0aW9uIG1vZGUKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVCBTZXRfQXV0aE1vZGVfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKQoreworICAgIGlmICgoc3RyY21wKGFyZywgIldFUEFVVE8iKSA9PSAwKSB8fCAoc3RyY21wKGFyZywgIndlcGF1dG8iKSA9PSAwKSkKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZUF1dG9Td2l0Y2g7CisgICAgZWxzZSBpZiAoKHN0cmNtcChhcmcsICJPUEVOIikgPT0gMCkgfHwgKHN0cmNtcChhcmcsICJvcGVuIikgPT0gMCkpCisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVPcGVuOworICAgIGVsc2UgaWYgKChzdHJjbXAoYXJnLCAiU0hBUkVEIikgPT0gMCkgfHwgKHN0cmNtcChhcmcsICJzaGFyZWQiKSA9PSAwKSkKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVNoYXJlZDsKKyAgICBlbHNlIGlmICgoc3RyY21wKGFyZywgIldQQVBTSyIpID09IDApIHx8IChzdHJjbXAoYXJnLCAid3BhcHNrIikgPT0gMCkpCisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0s7CisgICAgZWxzZSBpZiAoKHN0cmNtcChhcmcsICJXUEFOT05FIikgPT0gMCkgfHwgKHN0cmNtcChhcmcsICJ3cGFub25lIikgPT0gMCkpCisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lOworICAgIGVsc2UgaWYgKChzdHJjbXAoYXJnLCAiV1BBMlBTSyIpID09IDApIHx8IChzdHJjbXAoYXJnLCAid3BhMnBzayIpID09IDApKQorICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSzsKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgZWxzZSBpZiAoKHN0cmNtcChhcmcsICJXUEEiKSA9PSAwKSB8fCAoc3RyY21wKGFyZywgIndwYSIpID09IDApKQorICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBOworICAgIGVsc2UgaWYgKChzdHJjbXAoYXJnLCAiV1BBMiIpID09IDApIHx8IChzdHJjbXAoYXJnLCAid3BhMiIpID09IDApKQorICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMjsKKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisgICAgZWxzZQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICBwQWRhcHRlci0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX05PVF9TRUNVUkVEOworCisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0F1dGhNb2RlX1Byb2M6OihBdXRoTW9kZT0lZClcbiIsIHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUpKTsKKworICAgIHJldHVybiBUUlVFOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBFbmNyeXB0aW9uIFR5cGUKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVCBTZXRfRW5jcnlwVHlwZV9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpCit7CisgICAgaWYgKChzdHJjbXAoYXJnLCAiTk9ORSIpID09IDApIHx8IChzdHJjbXAoYXJnLCAibm9uZSIpID09IDApKQorICAgIHsKKyAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKQorICAgICAgICAgICAgcmV0dXJuIFRSVUU7ICAgIC8vIGRvIG5vdGhpbmcKKworICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cyAgICAgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuUGFpckNpcGhlciAgICA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKKwkgICAgcEFkYXB0ZXItPlN0YUNmZy5Hcm91cENpcGhlciAgID0gTmRpczgwMl8xMVdFUERpc2FibGVkOworICAgIH0KKyAgICBlbHNlIGlmICgoc3RyY21wKGFyZywgIldFUCIpID09IDApIHx8IChzdHJjbXAoYXJnLCAid2VwIikgPT0gMCkpCisgICAgeworICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpCisgICAgICAgICAgICByZXR1cm4gVFJVRTsgICAgLy8gZG8gbm90aGluZworCisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzICAgICA9IE5kaXM4MDJfMTFXRVBFbmFibGVkOworICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLlBhaXJDaXBoZXIgICAgPSBOZGlzODAyXzExV0VQRW5hYmxlZDsKKwkgICAgcEFkYXB0ZXItPlN0YUNmZy5Hcm91cENpcGhlciAgID0gTmRpczgwMl8xMVdFUEVuYWJsZWQ7CisgICAgfQorICAgIGVsc2UgaWYgKChzdHJjbXAoYXJnLCAiVEtJUCIpID09IDApIHx8IChzdHJjbXAoYXJnLCAidGtpcCIpID09IDApKQorICAgIHsKKyAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPCBOZGlzODAyXzExQXV0aE1vZGVXUEEpCisgICAgICAgICAgICByZXR1cm4gVFJVRTsgICAgLy8gZG8gbm90aGluZworCisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzICAgICA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ7CisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuUGFpckNpcGhlciAgICA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ7CisJICAgIHBBZGFwdGVyLT5TdGFDZmcuR3JvdXBDaXBoZXIgICA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ7CisgICAgfQorICAgIGVsc2UgaWYgKChzdHJjbXAoYXJnLCAiQUVTIikgPT0gMCkgfHwgKHN0cmNtcChhcmcsICJhZXMiKSA9PSAwKSkKKyAgICB7CisgICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlIDwgTmRpczgwMl8xMUF1dGhNb2RlV1BBKQorICAgICAgICAgICAgcmV0dXJuIFRSVUU7ICAgIC8vIGRvIG5vdGhpbmcKKworICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cyAgICAgPSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkOworICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLlBhaXJDaXBoZXIgICAgPSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkOworCSAgICBwQWRhcHRlci0+U3RhQ2ZnLkdyb3VwQ2lwaGVyICAgPSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgIHBBZGFwdGVyLT5TdGFDZmcuT3JpZ1dlcFN0YXR1cyA9IHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzOworCisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0VuY3J5cFR5cGVfUHJvYzo6KEVuY3J5cFR5cGU9JWQpXG4iLCBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cykpOworCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IERlZmF1bHQgS2V5IElECisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQgU2V0X0RlZmF1bHRLZXlJRF9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpCit7CisgICAgVUxPTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5SWR4OworCisgICAgS2V5SWR4ID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKyAgICBpZigoS2V5SWR4ID49IDEgKSAmJiAoS2V5SWR4IDw9IDQpKQorICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCA9IChVQ0hBUikgKEtleUlkeCAtIDEgKTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBGQUxTRTsgIC8vSW52YWxpZCBhcmd1bWVudAorCisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0RlZmF1bHRLZXlJRF9Qcm9jOjooRGVmYXVsdEtleUlEPSVkKVxuIiwgcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWQpKTsKKworICAgIHJldHVybiBUUlVFOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBXRVAgS0VZMQorICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UIFNldF9LZXkxX1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZykKK3sKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXlMZW47CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTsKKyAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaXBoZXJBbGc9Q0lQSEVSX1dFUDY0OworCisgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKQorICAgICAgICByZXR1cm4gVFJVRTsgICAgLy8gZG8gbm90aGluZworCisgICAgS2V5TGVuID0gc3RybGVuKGFyZyk7CisKKyAgICBzd2l0Y2ggKEtleUxlbikKKyAgICB7CisgICAgICAgIGNhc2UgNTogLy93ZXAgNDAgQXNjaWkgdHlwZQorICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVswXS5LZXlMZW4gPSBLZXlMZW47CisgICAgICAgICAgICBtZW1jcHkocEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVswXS5LZXksIGFyZywgS2V5TGVuKTsKKyAgICAgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXkxX1Byb2M6OihLZXkxPSVzIGFuZCB0eXBlPSVzKVxuIiwgYXJnLCAiQXNjaWkiKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxMDogLy93ZXAgNDAgSGV4IHR5cGUKKyAgICAgICAgICAgIGZvcihpPTA7IGkgPCBLZXlMZW47IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiggIWlzeGRpZ2l0KCooYXJnK2kpKSApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsgIC8vTm90IEhleCB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5TGVuID0gS2V5TGVuIC8gMiA7CisgICAgICAgICAgICBBdG9IKGFyZywgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVswXS5LZXksIEtleUxlbiAvIDIpOworICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTFfUHJvYzo6KEtleTE9JXMgYW5kIHR5cGU9JXMpXG4iLCBhcmcsICJIZXgiKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxMzogLy93ZXAgMTA0IEFzY2lpIHR5cGUKKyAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5TGVuID0gS2V5TGVuOworICAgICAgICAgICAgbWVtY3B5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5LCBhcmcsIEtleUxlbik7CisgICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTFfUHJvYzo6KEtleTE9JXMgYW5kIHR5cGU9JXMpXG4iLCBhcmcsICJBc2NpaSIpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI2OiAvL3dlcCAxMDQgSGV4IHR5cGUKKyAgICAgICAgICAgIGZvcihpPTA7IGkgPCBLZXlMZW47IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiggIWlzeGRpZ2l0KCooYXJnK2kpKSApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsgIC8vTm90IEhleCB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5TGVuID0gS2V5TGVuIC8gMiA7CisgICAgICAgICAgICBBdG9IKGFyZywgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVswXS5LZXksIEtleUxlbiAvIDIpOworICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDEyODsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXkxX1Byb2M6OihLZXkxPSVzIGFuZCB0eXBlPSVzKVxuIiwgYXJnLCAiSGV4IikpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6IC8vSW52YWxpZCBhcmd1bWVudAorICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTFfUHJvYzo6SW52YWxpZCBhcmd1bWVudCAoPSVzKVxuIiwgYXJnKSk7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcgPSBDaXBoZXJBbGc7CisKKyAgICAvLyBTZXQga2V5cyAoaW50byBBU0lDKQorICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKKyAgICAgICAgOyAgIC8vIG5vdCBzdXBwb3J0CisgICAgZWxzZSAgICAvLyBPbGQgV0VQIHN0dWZmCisgICAgeworICAgICAgICBBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkYXB0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVswXS5LZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgfQorCisgICAgcmV0dXJuIFRSVUU7Cit9CisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IFdFUCBLRVkyCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQgU2V0X0tleTJfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKQoreworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleUxlbjsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpOworICAgIFVDSEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENpcGhlckFsZz1DSVBIRVJfV0VQNjQ7CisKKyAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpCisgICAgICAgIHJldHVybiBUUlVFOyAgICAvLyBkbyBub3RoaW5nCisKKyAgICBLZXlMZW4gPSBzdHJsZW4oYXJnKTsKKworICAgIHN3aXRjaCAoS2V5TGVuKQorICAgIHsKKyAgICAgICAgY2FzZSA1OiAvL3dlcCA0MCBBc2NpaSB0eXBlCisgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzFdLktleUxlbiA9IEtleUxlbjsKKyAgICAgICAgICAgIG1lbWNweShwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzFdLktleSwgYXJnLCBLZXlMZW4pOworICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTJfUHJvYzo6KEtleTI9JXMgYW5kIHR5cGU9JXMpXG4iLCBhcmcsICJBc2NpaSIpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDEwOiAvL3dlcCA0MCBIZXggdHlwZQorICAgICAgICAgICAgZm9yKGk9MDsgaSA8IEtleUxlbjsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCAhaXN4ZGlnaXQoKihhcmcraSkpICkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOyAgLy9Ob3QgSGV4IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsxXS5LZXlMZW4gPSBLZXlMZW4gLyAyIDsKKyAgICAgICAgICAgIEF0b0goYXJnLCBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzFdLktleSwgS2V5TGVuIC8gMik7CisgICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5Ml9Qcm9jOjooS2V5Mj0lcyBhbmQgdHlwZT0lcylcbiIsIGFyZywgIkhleCIpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDEzOiAvL3dlcCAxMDQgQXNjaWkgdHlwZQorICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsxXS5LZXlMZW4gPSBLZXlMZW47CisgICAgICAgICAgICBtZW1jcHkocEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsxXS5LZXksIGFyZywgS2V5TGVuKTsKKyAgICAgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5Ml9Qcm9jOjooS2V5Mj0lcyBhbmQgdHlwZT0lcylcbiIsIGFyZywgIkFzY2lpIikpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjY6IC8vd2VwIDEwNCBIZXggdHlwZQorICAgICAgICAgICAgZm9yKGk9MDsgaSA8IEtleUxlbjsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCAhaXN4ZGlnaXQoKihhcmcraSkpICkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOyAgLy9Ob3QgSGV4IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsxXS5LZXlMZW4gPSBLZXlMZW4gLyAyIDsKKyAgICAgICAgICAgIEF0b0goYXJnLCBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzFdLktleSwgS2V5TGVuIC8gMik7CisgICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTJfUHJvYzo6KEtleTI9JXMgYW5kIHR5cGU9JXMpXG4iLCBhcmcsICJIZXgiKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDogLy9JbnZhbGlkIGFyZ3VtZW50CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5Ml9Qcm9jOjpJbnZhbGlkIGFyZ3VtZW50ICg9JXMpXG4iLCBhcmcpKTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsxXS5DaXBoZXJBbGcgPSBDaXBoZXJBbGc7CisKKyAgICAvLyBTZXQga2V5cyAoaW50byBBU0lDKQorICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKKyAgICAgICAgOyAgIC8vIG5vdCBzdXBwb3J0CisgICAgZWxzZSAgICAvLyBPbGQgV0VQIHN0dWZmCisgICAgeworICAgICAgICBBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkYXB0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMV0uQ2lwaGVyQWxnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsxXS5LZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgfQorCisgICAgcmV0dXJuIFRSVUU7Cit9CisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBXRVAgS0VZMworICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UIFNldF9LZXkzX1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZykKK3sKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXlMZW47CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTsKKyAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaXBoZXJBbGc9Q0lQSEVSX1dFUDY0OworCisgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKQorICAgICAgICByZXR1cm4gVFJVRTsgICAgLy8gZG8gbm90aGluZworCisgICAgS2V5TGVuID0gc3RybGVuKGFyZyk7CisKKyAgICBzd2l0Y2ggKEtleUxlbikKKyAgICB7CisgICAgICAgIGNhc2UgNTogLy93ZXAgNDAgQXNjaWkgdHlwZQorICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsyXS5LZXlMZW4gPSBLZXlMZW47CisgICAgICAgICAgICBtZW1jcHkocEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsyXS5LZXksIGFyZywgS2V5TGVuKTsKKyAgICAgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXkzX1Byb2M6OihLZXkzPSVzIGFuZCB0eXBlPUFzY2lpKVxuIiwgYXJnKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxMDogLy93ZXAgNDAgSGV4IHR5cGUKKyAgICAgICAgICAgIGZvcihpPTA7IGkgPCBLZXlMZW47IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiggIWlzeGRpZ2l0KCooYXJnK2kpKSApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsgIC8vTm90IEhleCB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMl0uS2V5TGVuID0gS2V5TGVuIC8gMiA7CisgICAgICAgICAgICBBdG9IKGFyZywgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsyXS5LZXksIEtleUxlbiAvIDIpOworICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTNfUHJvYzo6KEtleTM9JXMgYW5kIHR5cGU9SGV4KVxuIiwgYXJnKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxMzogLy93ZXAgMTA0IEFzY2lpIHR5cGUKKyAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMl0uS2V5TGVuID0gS2V5TGVuOworICAgICAgICAgICAgbWVtY3B5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMl0uS2V5LCBhcmcsIEtleUxlbik7CisgICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTNfUHJvYzo6KEtleTM9JXMgYW5kIHR5cGU9QXNjaWkpXG4iLCBhcmcpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI2OiAvL3dlcCAxMDQgSGV4IHR5cGUKKyAgICAgICAgICAgIGZvcihpPTA7IGkgPCBLZXlMZW47IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiggIWlzeGRpZ2l0KCooYXJnK2kpKSApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsgIC8vTm90IEhleCB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMl0uS2V5TGVuID0gS2V5TGVuIC8gMiA7CisgICAgICAgICAgICBBdG9IKGFyZywgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsyXS5LZXksIEtleUxlbiAvIDIpOworICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDEyODsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXkzX1Byb2M6OihLZXkzPSVzIGFuZCB0eXBlPUhleClcbiIsIGFyZykpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6IC8vSW52YWxpZCBhcmd1bWVudAorICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTNfUHJvYzo6SW52YWxpZCBhcmd1bWVudCAoPSVzKVxuIiwgYXJnKSk7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMl0uQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOworCisgICAgLy8gU2V0IGtleXMgKGludG8gQVNJQykKKyAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpCisgICAgICAgIDsgICAvLyBub3Qgc3VwcG9ydAorICAgIGVsc2UgICAgLy8gT2xkIFdFUCBzdHVmZgorICAgIHsKKyAgICAgICAgQXNpY0FkZFNoYXJlZEtleUVudHJ5KHBBZGFwdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzJdLkNpcGhlckFsZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMl0uS2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgIH0KKworICAgIHJldHVybiBUUlVFOworfQorLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgV0VQIEtFWTQKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVCBTZXRfS2V5NF9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpCit7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5TGVuOworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGk7CisgICAgVUNIQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2lwaGVyQWxnPUNJUEhFUl9XRVA2NDsKKworICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKKyAgICAgICAgcmV0dXJuIFRSVUU7ICAgIC8vIGRvIG5vdGhpbmcKKworICAgIEtleUxlbiA9IHN0cmxlbihhcmcpOworCisgICAgc3dpdGNoIChLZXlMZW4pCisgICAgeworICAgICAgICBjYXNlIDU6IC8vd2VwIDQwIEFzY2lpIHR5cGUKKyAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bM10uS2V5TGVuID0gS2V5TGVuOworICAgICAgICAgICAgbWVtY3B5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bM10uS2V5LCBhcmcsIEtleUxlbik7CisgICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5NF9Qcm9jOjooS2V5ND0lcyBhbmQgdHlwZT0lcylcbiIsIGFyZywgIkFzY2lpIikpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTA6IC8vd2VwIDQwIEhleCB0eXBlCisgICAgICAgICAgICBmb3IoaT0wOyBpIDwgS2V5TGVuOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoICFpc3hkaWdpdCgqKGFyZytpKSkgKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7ICAvL05vdCBIZXggdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzNdLktleUxlbiA9IEtleUxlbiAvIDIgOworICAgICAgICAgICAgQXRvSChhcmcsIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bM10uS2V5LCBLZXlMZW4gLyAyKTsKKyAgICAgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXk0X1Byb2M6OihLZXk0PSVzIGFuZCB0eXBlPSVzKVxuIiwgYXJnLCAiSGV4IikpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTM6IC8vd2VwIDEwNCBBc2NpaSB0eXBlCisgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzNdLktleUxlbiA9IEtleUxlbjsKKyAgICAgICAgICAgIG1lbWNweShwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzNdLktleSwgYXJnLCBLZXlMZW4pOworICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDEyODsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXk0X1Byb2M6OihLZXk0PSVzIGFuZCB0eXBlPSVzKVxuIiwgYXJnLCAiQXNjaWkiKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyNjogLy93ZXAgMTA0IEhleCB0eXBlCisgICAgICAgICAgICBmb3IoaT0wOyBpIDwgS2V5TGVuOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoICFpc3hkaWdpdCgqKGFyZytpKSkgKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7ICAvL05vdCBIZXggdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzNdLktleUxlbiA9IEtleUxlbiAvIDIgOworICAgICAgICAgICAgQXRvSChhcmcsIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bM10uS2V5LCBLZXlMZW4gLyAyKTsKKyAgICAgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5NF9Qcm9jOjooS2V5ND0lcyBhbmQgdHlwZT0lcylcbiIsIGFyZywgIkhleCIpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OiAvL0ludmFsaWQgYXJndW1lbnQKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXk0X1Byb2M6OkludmFsaWQgYXJndW1lbnQgKD0lcylcbiIsIGFyZykpOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzNdLkNpcGhlckFsZyA9IENpcGhlckFsZzsKKworICAgIC8vIFNldCBrZXlzIChpbnRvIEFTSUMpCisgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKQorICAgICAgICA7ICAgLy8gbm90IHN1cHBvcnQKKyAgICBlbHNlICAgIC8vIE9sZCBXRVAgc3R1ZmYKKyAgICB7CisgICAgICAgIEFzaWNBZGRTaGFyZWRLZXlFbnRyeShwQWRhcHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVszXS5DaXBoZXJBbGcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzNdLktleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICB9CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgV1BBIFBTSyBrZXkKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVCBTZXRfV1BBUFNLX1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZykKK3sKKyAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICBrZXlNYXRlcmlhbFs0MF07CisKKyAgICBpZiAoKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgIT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKSAmJgorICAgICAgICAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSAhPSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKSAmJgorCSAgICAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSAhPSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lKQorCQkpCisgICAgICAgIHJldHVybiBUUlVFOyAgICAvLyBkbyBub3RoaW5nCisKKyAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfV1BBUFNLX1Byb2M6OihXUEFQU0s9JXMpXG4iLCBhcmcpKTsKKworICAgIE5kaXNaZXJvTWVtb3J5KGtleU1hdGVyaWFsLCA0MCk7CisKKyAgICBpZiAoKHN0cmxlbihhcmcpIDwgOCkgfHwgKHN0cmxlbihhcmcpID4gNjQpKQorICAgIHsKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0IGZhaWxlZCEhKFdQQVBTSz0lcyksIFdQQVBTSyBrZXktc3RyaW5nIHJlcXVpcmVkIDggfiA2NCBjaGFyYWN0ZXJzIFxuIiwgYXJnKSk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICBpZiAoc3RybGVuKGFyZykgPT0gNjQpCisgICAgeworICAgICAgICBBdG9IKGFyZywga2V5TWF0ZXJpYWwsIDMyKTsKKyAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkYXB0ZXItPlN0YUNmZy5QTUssIGtleU1hdGVyaWFsLCAzMik7CisKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgUGFzc3dvcmRIYXNoKChjaGFyICopYXJnLCBwQWRhcHRlci0+TWxtZUF1eC5Tc2lkLCBwQWRhcHRlci0+TWxtZUF1eC5Tc2lkTGVuLCBrZXlNYXRlcmlhbCk7CisgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZGFwdGVyLT5TdGFDZmcuUE1LLCBrZXlNYXRlcmlhbCwgMzIpOworICAgIH0KKworCisKKyAgICBpZihwQWRhcHRlci0+U3RhQ2ZnLkJzc1R5cGUgPT0gQlNTX0FESE9DICYmCisgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lKQorICAgIHsKKyAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV3BhU3RhdGUgPSBTU19OT1RVU0U7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8vIFN0YXJ0IFNUQSBzdXBwbGljYW50IHN0YXRlIG1hY2hpbmUKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XcGFTdGF0ZSA9IFNTX1NUQVJUOworICAgIH0KKworICAgIHJldHVybiBUUlVFOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBQb3dlciBTYXZpbmcgbW9kZQorICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UIFNldF9QU01vZGVfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKQoreworICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkJzc1R5cGUgPT0gQlNTX0lORlJBKQorICAgIHsKKyAgICAgICAgaWYgKChzdHJjbXAoYXJnLCAiTWF4X1BTUCIpID09IDApIHx8CisJCQkoc3RyY21wKGFyZywgIm1heF9wc3AiKSA9PSAwKSB8fAorCQkJKHN0cmNtcChhcmcsICJNQVhfUFNQIikgPT0gMCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGRvIE5PVCB0dXJuIG9uIFBTTSBiaXQgaGVyZSwgd2FpdCB1bnRpbCBNbG1lQ2hlY2tGb3JQc21DaGFuZ2UoKQorICAgICAgICAgICAgLy8gdG8gZXhjbHVkZSBjZXJ0YWluIHNpdHVhdGlvbnMuCisgICAgICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5iV2luZG93c0FDQ0FNRW5hYmxlID09IEZBTFNFKQorICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2luZG93c1Bvd2VyTW9kZSA9IE5kaXM4MDJfMTFQb3dlck1vZGVNQVhfUFNQOworICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XaW5kb3dzQmF0dGVyeVBvd2VyTW9kZSA9IE5kaXM4MDJfMTFQb3dlck1vZGVNQVhfUFNQOworICAgICAgICAgICAgT1BTVEFUVVNfU0VUX0ZMQUcocEFkYXB0ZXIsIGZPUF9TVEFUVVNfUkVDRUlWRV9EVElNKTsKKyAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdExpc3RlbkNvdW50ID0gNTsKKworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKChzdHJjbXAoYXJnLCAiRmFzdF9QU1AiKSA9PSAwKSB8fAorCQkJCSAoc3RyY21wKGFyZywgImZhc3RfcHNwIikgPT0gMCkgfHwKKyAgICAgICAgICAgICAgICAgKHN0cmNtcChhcmcsICJGQVNUX1BTUCIpID09IDApKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBkbyBOT1QgdHVybiBvbiBQU00gYml0IGhlcmUsIHdhaXQgdW50aWwgTWxtZUNoZWNrRm9yUHNtQ2hhbmdlKCkKKyAgICAgICAgICAgIC8vIHRvIGV4Y2x1ZGUgY2VydGFpbiBzaXR1YXRpb25zLgorICAgICAgICAgICAgT1BTVEFUVVNfU0VUX0ZMQUcocEFkYXB0ZXIsIGZPUF9TVEFUVVNfUkVDRUlWRV9EVElNKTsKKyAgICAgICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLmJXaW5kb3dzQUNDQU1FbmFibGUgPT0gRkFMU0UpCisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XaW5kb3dzUG93ZXJNb2RlID0gTmRpczgwMl8xMVBvd2VyTW9kZUZhc3RfUFNQOworICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XaW5kb3dzQmF0dGVyeVBvd2VyTW9kZSA9IE5kaXM4MDJfMTFQb3dlck1vZGVGYXN0X1BTUDsKKyAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdExpc3RlbkNvdW50ID0gMzsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICgoc3RyY21wKGFyZywgIkxlZ2FjeV9QU1AiKSA9PSAwKSB8fAorICAgICAgICAgICAgICAgICAoc3RyY21wKGFyZywgImxlZ2FjeV9wc3AiKSA9PSAwKSB8fAorICAgICAgICAgICAgICAgICAoc3RyY21wKGFyZywgIkxFR0FDWV9QU1AiKSA9PSAwKSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gZG8gTk9UIHR1cm4gb24gUFNNIGJpdCBoZXJlLCB3YWl0IHVudGlsIE1sbWVDaGVja0ZvclBzbUNoYW5nZSgpCisgICAgICAgICAgICAvLyB0byBleGNsdWRlIGNlcnRhaW4gc2l0dWF0aW9ucy4KKyAgICAgICAgICAgIE9QU1RBVFVTX1NFVF9GTEFHKHBBZGFwdGVyLCBmT1BfU1RBVFVTX1JFQ0VJVkVfRFRJTSk7CisgICAgICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5iV2luZG93c0FDQ0FNRW5hYmxlID09IEZBTFNFKQorICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2luZG93c1Bvd2VyTW9kZSA9IE5kaXM4MDJfMTFQb3dlck1vZGVMZWdhY3lfUFNQOworICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XaW5kb3dzQmF0dGVyeVBvd2VyTW9kZSA9IE5kaXM4MDJfMTFQb3dlck1vZGVMZWdhY3lfUFNQOworICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0TGlzdGVuQ291bnQgPSAzOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLy9EZWZhdWx0IE5kaXM4MDJfMTFQb3dlck1vZGVDQU0KKyAgICAgICAgICAgIC8vIGNsZWFyIFBTTSBiaXQgaW1tZWRpYXRlbHkKKyAgICAgICAgICAgIE1sbWVTZXRQc21CaXQocEFkYXB0ZXIsIFBXUl9BQ1RJVkUpOworICAgICAgICAgICAgT1BTVEFUVVNfU0VUX0ZMQUcocEFkYXB0ZXIsIGZPUF9TVEFUVVNfUkVDRUlWRV9EVElNKTsKKyAgICAgICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLmJXaW5kb3dzQUNDQU1FbmFibGUgPT0gRkFMU0UpCisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XaW5kb3dzUG93ZXJNb2RlID0gTmRpczgwMl8xMVBvd2VyTW9kZUNBTTsKKyAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2luZG93c0JhdHRlcnlQb3dlck1vZGUgPSBOZGlzODAyXzExUG93ZXJNb2RlQ0FNOworICAgICAgICB9CisKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X1BTTW9kZV9Qcm9jOjooUFNNb2RlPSVsZClcbiIsIHBBZGFwdGVyLT5TdGFDZmcuV2luZG93c1Bvd2VyTW9kZSkpOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHJldHVybiBGQUxTRTsKKworCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBXcGFTdXBwb3J0IGZsYWcuCisgICAgVmFsdWU6CisgICAgICAgIDA6IERyaXZlciBpZ25vcmUgd3BhX3N1cHBsaWNhbnQuCisgICAgICAgIDE6IHdwYV9zdXBwbGljYW50IGluaXRpYXRlcyBzY2FubmluZyBhbmQgQVAgc2VsZWN0aW9uLgorICAgICAgICAyOiBkcml2ZXIgdGFrZXMgY2FyZSBvZiBzY2FubmluZywgQVAgc2VsZWN0aW9uLCBhbmQgSUVFRSA4MDIuMTEgYXNzb2NpYXRpb24gcGFyYW1ldGVycy4KKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVCBTZXRfV3BhX1N1cHBvcnQoCisgICAgSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCisgICAgaWYgKCBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApID09IDApCisgICAgICAgIHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCA9IFdQQV9TVVBQTElDQU5UX0RJU0FCTEU7CisgICAgZWxzZSBpZiAoIHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCkgPT0gMSkKKyAgICAgICAgcEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQID0gV1BBX1NVUFBMSUNBTlRfRU5BQkxFOworICAgIGVsc2UgaWYgKCBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApID09IDIpCisgICAgICAgIHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCA9IFdQQV9TVVBQTElDQU5UX0VOQUJMRV9XSVRIX1dFQl9VSTsKKyAgICBlbHNlCisgICAgICAgIHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCA9IFdQQV9TVVBQTElDQU5UX0RJU0FCTEU7CisKKyAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfV3BhX1N1cHBvcnQ6OihXcGFTdXBwbGljYW50VVA9JWQpXG4iLCBwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVApKTsKKworICAgIHJldHVybiBUUlVFOworfQorI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKworI2lmZGVmIERCRworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBSZWFkIC8gV3JpdGUgTUFDCisgICAgQXJndW1lbnRzOgorICAgICAgICBwQWRhcHRlciAgICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byBvdXIgYWRhcHRlcgorICAgICAgICB3cnEgICAgICAgICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW9jdGwgYXJndW1lbnQKKworICAgIFJldHVybiBWYWx1ZToKKyAgICAgICAgTm9uZQorCisgICAgTm90ZToKKyAgICAgICAgVXNhZ2U6CisgICAgICAgICAgICAgICAxLikgaXdwcml2IHJhMCBtYWMgMCAgICAgICAgPT0+IHJlYWQgTUFDIHdoZXJlIEFkZHI9MHgwCisgICAgICAgICAgICAgICAyLikgaXdwcml2IHJhMCBtYWMgMD0xMiAgICAgPT0+IHdyaXRlIE1BQyB3aGVyZSBBZGRyPTB4MCwgdmFsdWU9MTIKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgUlRNUElvY3RsTUFDKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCisJSU4Jc3RydWN0IGl3cmVxCSp3cnEpCit7CisJQ0hBUgkJCQkqdGhpc19jaGFyOworCUNIQVIJCQkJKnZhbHVlOworCUlOVAkJCQkJaiA9IDAsIGsgPSAwOworCUNIQVIJCQkJbXNnWzEwMjRdOworCUNIQVIJCQkJYXJnWzI1NV07CisJVUxPTkcJCQkJbWFjQWRkciA9IDA7CisJVUNIQVIJCQkJdGVtcFsxNl0sIHRlbXAyWzE2XTsKKwlVSU5UMzIJCQkJbWFjVmFsdWUgPSAwOworCUlOVAkJCQkJU3RhdHVzOworCisKKwltZW1zZXQobXNnLCAweDAwLCAxMDI0KTsKKwlpZiAod3JxLT51LmRhdGEubGVuZ3RoID4gMSkgLy9ObyBwYXJhbWV0ZXJzLgorCXsKKwkgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIoYXJnLCB3cnEtPnUuZGF0YS5wb2ludGVyLCAod3JxLT51LmRhdGEubGVuZ3RoID4gMjU1KSA/IDI1NSA6IHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCXNwcmludGYobXNnLCAiXG4iKTsKKworCQkvL1BhcnNpbmcgUmVhZCBvciBXcml0ZQorCSAgICB0aGlzX2NoYXIgPSBhcmc7CisJCWlmICghKnRoaXNfY2hhcikKKwkJCWdvdG8gbmV4dDsKKworCQlpZiAoKHZhbHVlID0gcnRzdHJjaHIodGhpc19jaGFyLCAnPScpKSAhPSBOVUxMKQorCQkJKnZhbHVlKysgPSAwOworCisJCWlmICghdmFsdWUgfHwgISp2YWx1ZSkKKwkJeyAvL1JlYWQKKwkJCS8vIFNhbml0eSBjaGVjaworCQkJaWYoc3RybGVuKHRoaXNfY2hhcikgPiA0KQorCQkJCWdvdG8gbmV4dDsKKworCQkJaiA9IHN0cmxlbih0aGlzX2NoYXIpOworCQkJd2hpbGUoai0tID4gMCkKKwkJCXsKKwkJCQlpZih0aGlzX2NoYXJbal0gPiAnZicgfHwgdGhpc19jaGFyW2pdIDwgJzAnKQorCQkJCQlyZXR1cm47CisJCQl9CisKKwkJCS8vIE1hYyBBZGRyCisJCQlrID0gaiA9IHN0cmxlbih0aGlzX2NoYXIpOworCQkJd2hpbGUoai0tID4gMCkKKwkJCXsKKwkJCQl0aGlzX2NoYXJbNC1rK2pdID0gdGhpc19jaGFyW2pdOworCQkJfQorCisJCQl3aGlsZShrIDwgNCkKKwkJCQl0aGlzX2NoYXJbMy1rKytdPScwJzsKKwkJCXRoaXNfY2hhcls0XT0nXDAnOworCisJCQlpZihzdHJsZW4odGhpc19jaGFyKSA9PSA0KQorCQkJeworCQkJCUF0b0godGhpc19jaGFyLCB0ZW1wLCAyKTsKKwkJCQltYWNBZGRyID0gKnRlbXAqMjU2ICsgdGVtcFsxXTsKKwkJCQlpZiAobWFjQWRkciA8IDB4RkZGRikKKwkJCQl7CisJCQkJCVJUTVBfSU9fUkVBRDMyKHBBZGFwdGVyLCBtYWNBZGRyLCAmbWFjVmFsdWUpOworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNYWNBZGRyPSVseCwgTWFjVmFsdWU9JXhcbiIsIG1hY0FkZHIsIG1hY1ZhbHVlKSk7CisJCQkJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCAiWzB4JTA4bFhdOiUwOFggICIsIG1hY0FkZHIgLCBtYWNWYWx1ZSk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7Ly9JbnZhbGlkIHBhcmFtZXRlcywgc28gZGVmYXVsdCBwcmludGsgYWxsIGJicAorCQkJCQlnb3RvIG5leHQ7CisJCQkJfQorCQkJfQorCQl9CisJCWVsc2UKKwkJeyAvL1dyaXRlCisJCQltZW1jcHkoJnRlbXAyLCB2YWx1ZSwgc3RybGVuKHZhbHVlKSk7CisJCQl0ZW1wMltzdHJsZW4odmFsdWUpXSA9ICdcMCc7CisKKwkJCS8vIFNhbml0eSBjaGVjaworCQkJaWYoKHN0cmxlbih0aGlzX2NoYXIpID4gNCkgfHwgc3RybGVuKHRlbXAyKSA+IDgpCisJCQkJZ290byBuZXh0OworCisJCQlqID0gc3RybGVuKHRoaXNfY2hhcik7CisJCQl3aGlsZShqLS0gPiAwKQorCQkJeworCQkJCWlmKHRoaXNfY2hhcltqXSA+ICdmJyB8fCB0aGlzX2NoYXJbal0gPCAnMCcpCisJCQkJCXJldHVybjsKKwkJCX0KKworCQkJaiA9IHN0cmxlbih0ZW1wMik7CisJCQl3aGlsZShqLS0gPiAwKQorCQkJeworCQkJCWlmKHRlbXAyW2pdID4gJ2YnIHx8IHRlbXAyW2pdIDwgJzAnKQorCQkJCQlyZXR1cm47CisJCQl9CisKKwkJCS8vTUFDIEFkZHIKKwkJCWsgPSBqID0gc3RybGVuKHRoaXNfY2hhcik7CisJCQl3aGlsZShqLS0gPiAwKQorCQkJeworCQkJCXRoaXNfY2hhcls0LWsral0gPSB0aGlzX2NoYXJbal07CisJCQl9CisKKwkJCXdoaWxlKGsgPCA0KQorCQkJCXRoaXNfY2hhclszLWsrK109JzAnOworCQkJdGhpc19jaGFyWzRdPSdcMCc7CisKKwkJCS8vTUFDIHZhbHVlCisJCQlrID0gaiA9IHN0cmxlbih0ZW1wMik7CisJCQl3aGlsZShqLS0gPiAwKQorCQkJeworCQkJCXRlbXAyWzgtaytqXSA9IHRlbXAyW2pdOworCQkJfQorCisJCQl3aGlsZShrIDwgOCkKKwkJCQl0ZW1wMls3LWsrK109JzAnOworCQkJdGVtcDJbOF09J1wwJzsKKworCQkJeworCQkJCUF0b0godGhpc19jaGFyLCB0ZW1wLCAyKTsKKwkJCQltYWNBZGRyID0gKnRlbXAqMjU2ICsgdGVtcFsxXTsKKworCQkJCUF0b0godGVtcDIsIHRlbXAsIDQpOworCQkJCW1hY1ZhbHVlID0gKnRlbXAqMjU2KjI1NioyNTYgKyB0ZW1wWzFdKjI1NioyNTYgKyB0ZW1wWzJdKjI1NiArIHRlbXBbM107CisKKwkJCQkvLyBkZWJ1ZyBtb2RlCisJCQkJaWYgKG1hY0FkZHIgPT0gKEhXX0RFQlVHX1NFVFRJTkdfQkFTRSArIDQpKQorCQkJCXsKKwkJCQkJLy8gMHgyYmY0OiBieXRlMCBub24temVybzogZW5hYmxlIFIxNyB0dW5pbmcsIDA6IGRpc2FibGUgUjE3IHR1bmluZworICAgICAgICAgICAgICAgICAgICBpZiAobWFjVmFsdWUgJiAweDAwMDAwMGZmKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+QmJwVHVuaW5nLmJFbmFibGUgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJ0dXJuIG9uIFIxNyB0dW5pbmdcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSIFI2NjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5CYnBUdW5pbmcuYkVuYWJsZSA9IEZBTFNFOworICAgICAgICAgICAgICAgICAgICAgICAgUjY2ID0gMHgyNiArIEdFVF9MTkFfR0FJTihwQWRhcHRlcik7CisjaWZkZWYgUkFMSU5LX0FURQorCQkJCQkJaWYgKEFURV9PTihwQWRhcHRlcikpCisJCQkJCQl7CisJCQkJCQkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZGFwdGVyLCBCQlBfUjY2LCAoMHgyNiArIEdFVF9MTkFfR0FJTihwQWRhcHRlcikpKTsKKwkJCQkJCX0KKwkJCQkJCWVsc2UKKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisJCQkJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZGFwdGVyLCBCQlBfUjY2LCAoMHgyNiArIEdFVF9MTkFfR0FJTihwQWRhcHRlcikpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgidHVybiBvZmYgUjE3IHR1bmluZywgcmVzdG9yZSB0byAweCUwMnhcbiIsIFI2NikpOworICAgICAgICAgICAgICAgICAgICB9CisJCQkJCXJldHVybjsKKwkJCQl9CisKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNYWNBZGRyPSUwMmx4LCBNYWNWYWx1ZT0weCV4XG4iLCBtYWNBZGRyLCBtYWNWYWx1ZSkpOworCisJCQkJUlRNUF9JT19XUklURTMyKHBBZGFwdGVyLCBtYWNBZGRyLCBtYWNWYWx1ZSk7CisJCQkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksICJbMHglMDhsWF06JTA4WCAgIiwgbWFjQWRkciwgbWFjVmFsdWUpOworCQkJfQorCQl9CisJfQorbmV4dDoKKwlpZihzdHJsZW4obXNnKSA9PSAxKQorCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwgIj09PT5FcnJvciBjb21tYW5kIGZvcm1hdCEiKTsKKworCS8vIENvcHkgdGhlIGluZm9ybWF0aW9uIGludG8gdGhlIHVzZXIgYnVmZmVyCisJd3JxLT51LmRhdGEubGVuZ3RoID0gc3RybGVuKG1zZyk7CisJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIG1zZywgd3JxLT51LmRhdGEubGVuZ3RoKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PVJUTVBJb2N0bE1BQ1xuXG4iKSk7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgUmVhZCAvIFdyaXRlIEUyUFJPTQorICAgIEFyZ3VtZW50czoKKyAgICAgICAgcEFkYXB0ZXIgICAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKyAgICAgICAgd3JxICAgICAgICAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGlvY3RsIGFyZ3VtZW50CisKKyAgICBSZXR1cm4gVmFsdWU6CisgICAgICAgIE5vbmUKKworICAgIE5vdGU6CisgICAgICAgIFVzYWdlOgorICAgICAgICAgICAgICAgMS4pIGl3cHJpdiByYTAgZTJwIDAgICAgIAk9PT4gcmVhZCBFMlBST00gd2hlcmUgQWRkcj0weDAKKyAgICAgICAgICAgICAgIDIuKSBpd3ByaXYgcmEwIGUycCAwPTEyMzQgICAgPT0+IHdyaXRlIEUyUFJPTSB3aGVyZSBBZGRyPTB4MCwgdmFsdWU9MTIzNAorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBSVE1QSW9jdGxFMlBST00oCisJSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKKwlJTglzdHJ1Y3QgaXdyZXEJKndycSkKK3sKKwlDSEFSCQkJCSp0aGlzX2NoYXI7CisJQ0hBUgkJCQkqdmFsdWU7CisJSU5UCQkJCQlqID0gMCwgayA9IDA7CisJQ0hBUgkJCQltc2dbMTAyNF07CisJQ0hBUgkJCQlhcmdbMjU1XTsKKwlVU0hPUlQJCQkJZWVwQWRkciA9IDA7CisJVUNIQVIJCQkJdGVtcFsxNl0sIHRlbXAyWzE2XTsKKwlVU0hPUlQJCQkJZWVwVmFsdWU7CisJaW50CQkJCQlTdGF0dXM7CisKKworCW1lbXNldChtc2csIDB4MDAsIDEwMjQpOworCWlmICh3cnEtPnUuZGF0YS5sZW5ndGggPiAxKSAvL05vIHBhcmFtZXRlcnMuCisJeworCSAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcihhcmcsIHdycS0+dS5kYXRhLnBvaW50ZXIsICh3cnEtPnUuZGF0YS5sZW5ndGggPiAyNTUpID8gMjU1IDogd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJc3ByaW50Zihtc2csICJcbiIpOworCisJICAgIC8vUGFyc2luZyBSZWFkIG9yIFdyaXRlCisJCXRoaXNfY2hhciA9IGFyZzsKKworCisJCWlmICghKnRoaXNfY2hhcikKKwkJCWdvdG8gbmV4dDsKKworCQlpZiAoKHZhbHVlID0gcnRzdHJjaHIodGhpc19jaGFyLCAnPScpKSAhPSBOVUxMKQorCQkJKnZhbHVlKysgPSAwOworCisJCWlmICghdmFsdWUgfHwgISp2YWx1ZSkKKwkJeyAvL1JlYWQKKworCQkJLy8gU2FuaXR5IGNoZWNrCisJCQlpZihzdHJsZW4odGhpc19jaGFyKSA+IDQpCisJCQkJZ290byBuZXh0OworCisJCQlqID0gc3RybGVuKHRoaXNfY2hhcik7CisJCQl3aGlsZShqLS0gPiAwKQorCQkJeworCQkJCWlmKHRoaXNfY2hhcltqXSA+ICdmJyB8fCB0aGlzX2NoYXJbal0gPCAnMCcpCisJCQkJCXJldHVybjsKKwkJCX0KKworCQkJLy8gRTJQUk9NIGFkZHIKKwkJCWsgPSBqID0gc3RybGVuKHRoaXNfY2hhcik7CisJCQl3aGlsZShqLS0gPiAwKQorCQkJeworCQkJCXRoaXNfY2hhcls0LWsral0gPSB0aGlzX2NoYXJbal07CisJCQl9CisKKwkJCXdoaWxlKGsgPCA0KQorCQkJCXRoaXNfY2hhclszLWsrK109JzAnOworCQkJdGhpc19jaGFyWzRdPSdcMCc7CisKKwkJCWlmKHN0cmxlbih0aGlzX2NoYXIpID09IDQpCisJCQl7CisJCQkJQXRvSCh0aGlzX2NoYXIsIHRlbXAsIDIpOworCQkJCWVlcEFkZHIgPSAqdGVtcCoyNTYgKyB0ZW1wWzFdOworCQkJCWlmIChlZXBBZGRyIDwgMHhGRkZGKQorCQkJCXsKKwkJCQkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkYXB0ZXIsIGVlcEFkZHIsIGVlcFZhbHVlKTsKKwkJCQkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksICJbMHglMDRYXToweCUwNFggICIsIGVlcEFkZHIgLCBlZXBWYWx1ZSk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7Ly9JbnZhbGlkIHBhcmFtZXRlcywgc28gZGVmYXVsdCBwcmludGsgYWxsIGJicAorCQkJCQlnb3RvIG5leHQ7CisJCQkJfQorCQkJfQorCQl9CisJCWVsc2UKKwkJeyAvL1dyaXRlCisJCQltZW1jcHkoJnRlbXAyLCB2YWx1ZSwgc3RybGVuKHZhbHVlKSk7CisJCQl0ZW1wMltzdHJsZW4odmFsdWUpXSA9ICdcMCc7CisKKwkJCS8vIFNhbml0eSBjaGVjaworCQkJaWYoKHN0cmxlbih0aGlzX2NoYXIpID4gNCkgfHwgc3RybGVuKHRlbXAyKSA+IDgpCisJCQkJZ290byBuZXh0OworCisJCQlqID0gc3RybGVuKHRoaXNfY2hhcik7CisJCQl3aGlsZShqLS0gPiAwKQorCQkJeworCQkJCWlmKHRoaXNfY2hhcltqXSA+ICdmJyB8fCB0aGlzX2NoYXJbal0gPCAnMCcpCisJCQkJCXJldHVybjsKKwkJCX0KKwkJCWogPSBzdHJsZW4odGVtcDIpOworCQkJd2hpbGUoai0tID4gMCkKKwkJCXsKKwkJCQlpZih0ZW1wMltqXSA+ICdmJyB8fCB0ZW1wMltqXSA8ICcwJykKKwkJCQkJcmV0dXJuOworCQkJfQorCisJCQkvL01BQyBBZGRyCisJCQlrID0gaiA9IHN0cmxlbih0aGlzX2NoYXIpOworCQkJd2hpbGUoai0tID4gMCkKKwkJCXsKKwkJCQl0aGlzX2NoYXJbNC1rK2pdID0gdGhpc19jaGFyW2pdOworCQkJfQorCisJCQl3aGlsZShrIDwgNCkKKwkJCQl0aGlzX2NoYXJbMy1rKytdPScwJzsKKwkJCXRoaXNfY2hhcls0XT0nXDAnOworCisJCQkvL01BQyB2YWx1ZQorCQkJayA9IGogPSBzdHJsZW4odGVtcDIpOworCQkJd2hpbGUoai0tID4gMCkKKwkJCXsKKwkJCQl0ZW1wMls0LWsral0gPSB0ZW1wMltqXTsKKwkJCX0KKworCQkJd2hpbGUoayA8IDQpCisJCQkJdGVtcDJbMy1rKytdPScwJzsKKwkJCXRlbXAyWzRdPSdcMCc7CisKKwkJCUF0b0godGhpc19jaGFyLCB0ZW1wLCAyKTsKKwkJCWVlcEFkZHIgPSAqdGVtcCoyNTYgKyB0ZW1wWzFdOworCisJCQlBdG9IKHRlbXAyLCB0ZW1wLCAyKTsKKwkJCWVlcFZhbHVlID0gKnRlbXAqMjU2ICsgdGVtcFsxXTsKKworCQkJUlQyOHh4X0VFUFJPTV9XUklURTE2KHBBZGFwdGVyLCBlZXBBZGRyLCBlZXBWYWx1ZSk7CisJCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwgIlsweCUwMlhdOiUwMlggICIsIGVlcEFkZHIsIGVlcFZhbHVlKTsKKwkJfQorCX0KK25leHQ6CisJaWYoc3RybGVuKG1zZykgPT0gMSkKKwkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksICI9PT0+RXJyb3IgY29tbWFuZCBmb3JtYXQhIik7CisKKworCS8vIENvcHkgdGhlIGluZm9ybWF0aW9uIGludG8gdGhlIHVzZXIgYnVmZmVyCisJd3JxLT51LmRhdGEubGVuZ3RoID0gc3RybGVuKG1zZyk7CisJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIG1zZywgd3JxLT51LmRhdGEubGVuZ3RoKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PVJUTVBJb2N0bEUyUFJPTVxuIikpOworfQorI2VuZGlmIC8vIERCRyAvLworCisKKworCitJTlQgU2V0X1RHbldpZmlUZXN0X1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpCit7CisgICAgaWYgKHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCkgPT0gMCkKKyAgICAgICAgcEFkLT5TdGFDZmcuYlRHbldpZmlUZXN0ID0gRkFMU0U7CisgICAgZWxzZQorICAgICAgICBwQWQtPlN0YUNmZy5iVEduV2lmaVRlc3QgPSBUUlVFOworCisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSUYgU2V0X1RHbldpZmlUZXN0X1Byb2M6OihiVEduV2lmaVRlc3Q9JWQpXG4iLCBwQWQtPlN0YUNmZy5iVEduV2lmaVRlc3QpKTsKKwlyZXR1cm4gVFJVRTsKK30KKworSU5UIFNldF9Mb25nUmV0cnlMaW1pdF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCVRYX1JUWV9DRkdfU1RSVUMJdHhfcnR5X2NmZzsKKwlVQ0hBUgkJCQlMb25nUmV0cnlMaW1pdCA9IChVQ0hBUilzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCisJUlRNUF9JT19SRUFEMzIocEFkYXB0ZXIsIFRYX1JUWV9DRkcsICZ0eF9ydHlfY2ZnLndvcmQpOworCXR4X3J0eV9jZmcuZmllbGQuTG9uZ1J0eUxpbWl0ID0gTG9uZ1JldHJ5TGltaXQ7CisJUlRNUF9JT19XUklURTMyKHBBZGFwdGVyLCBUWF9SVFlfQ0ZHLCB0eF9ydHlfY2ZnLndvcmQpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklGIFNldF9Mb25nUmV0cnlMaW1pdF9Qcm9jOjoodHhfcnR5X2NmZz0weCV4KVxuIiwgdHhfcnR5X2NmZy53b3JkKSk7CisJcmV0dXJuIFRSVUU7Cit9CisKK0lOVCBTZXRfU2hvcnRSZXRyeUxpbWl0X1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJVFhfUlRZX0NGR19TVFJVQwl0eF9ydHlfY2ZnOworCVVDSEFSCQkJCVNob3J0UmV0cnlMaW1pdCA9IChVQ0hBUilzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCisJUlRNUF9JT19SRUFEMzIocEFkYXB0ZXIsIFRYX1JUWV9DRkcsICZ0eF9ydHlfY2ZnLndvcmQpOworCXR4X3J0eV9jZmcuZmllbGQuU2hvcnRSdHlMaW1pdCA9IFNob3J0UmV0cnlMaW1pdDsKKwlSVE1QX0lPX1dSSVRFMzIocEFkYXB0ZXIsIFRYX1JUWV9DRkcsIHR4X3J0eV9jZmcud29yZCk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSUYgU2V0X1Nob3J0UmV0cnlMaW1pdF9Qcm9jOjoodHhfcnR5X2NmZz0weCV4KVxuIiwgdHhfcnR5X2NmZy53b3JkKSk7CisJcmV0dXJuIFRSVUU7Cit9CisKKyNpZmRlZiBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUCitJTlQgU2V0X0llZWU4MDIxMWRDbGllbnRNb2RlX1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZykKK3sKKyAgICBpZiAoc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKSA9PSAwKQorICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLklFRUU4MDIxMWRDbGllbnRNb2RlID0gUnQ4MDJfMTFfRF9Ob25lOworICAgIGVsc2UgaWYgKHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCkgPT0gMSkKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5JRUVFODAyMTFkQ2xpZW50TW9kZSA9IFJ0ODAyXzExX0RfRmxleGlibGU7CisgICAgZWxzZSBpZiAoc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKSA9PSAyKQorICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLklFRUU4MDIxMWRDbGllbnRNb2RlID0gUnQ4MDJfMTFfRF9TdHJpY3Q7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfSWVlZTgwMmRNb2RlX1Byb2M6OihJRUVFRTAyMTFkTW9kZT0lZClcbiIsIHBBZGFwdGVyLT5TdGFDZmcuSUVFRTgwMjExZENsaWVudE1vZGUpKTsKKyAgICByZXR1cm4gVFJVRTsKK30KKyNlbmRpZiAvLyBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUIC8vCisKKyNpZmRlZiBDQVJSSUVSX0RFVEVDVElPTl9TVVBQT1JUCitJTlQgU2V0X0NhcnJpZXJEZXRlY3RfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZykKK3sKKyAgICBpZiAoc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKSA9PSAwKQorICAgICAgICBwQWQtPkNvbW1vbkNmZy5DYXJyaWVyRGV0ZWN0LkVuYWJsZSA9IEZBTFNFOworICAgIGVsc2UKKyAgICAgICAgcEFkLT5Db21tb25DZmcuQ2FycmllckRldGVjdC5FbmFibGUgPSBUUlVFOworCisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSUYgU2V0X0NhcnJpZXJEZXRlY3RfUHJvYzo6KENhcnJpZXJEZXRlY3QuRW5hYmxlPSVkKVxuIiwgcEFkLT5Db21tb25DZmcuQ2FycmllckRldGVjdC5FbmFibGUpKTsKKwlyZXR1cm4gVFJVRTsKK30KKyNlbmRpZiAvLyBDQVJSSUVSX0RFVEVDVElPTl9TVVBQT1JUIC8vCisKKworSU5UCVNob3dfQWRob2NfTWFjVGFibGVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQQ0hBUgkJCWV4dHJhKQoreworCUlOVCBpOworCisJc3ByaW50ZihleHRyYSwgIlxuIik7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwlzcHJpbnRmKGV4dHJhLCAiJXNIVCBPcGVyYXRpbmcgTW9kZSA6ICVkXG4iLCBleHRyYSwgcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLkFkZEh0SW5mbzIuT3BlcmFpb25Nb2RlKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCXNwcmludGYoZXh0cmEsICIlc1xuJS0xOXMlLTRzJS00cyUtN3MlLTdzJS03cyUtMTBzJS02cyUtNnMlLTZzJS02c1xuIiwgZXh0cmEsCisJCQkiTUFDIiwgIkFJRCIsICJCU1MiLCAiUlNTSTAiLCAiUlNTSTEiLCAiUlNTSTIiLCAiUGhNZCIsICJCVyIsICJNQ1MiLCAiU0dJIiwgIlNUQkMiKTsKKworCWZvciAoaT0xOyBpPE1BWF9MRU5fT0ZfTUFDX1RBQkxFOyBpKyspCisJeworCQlQTUFDX1RBQkxFX0VOVFJZIHBFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W2ldOworCisJCWlmIChzdHJsZW4oZXh0cmEpID4gKElXX1BSSVZfU0laRV9NQVNLIC0gMzApKQorCQkgICAgYnJlYWs7CisJCWlmICgocEVudHJ5LT5WYWxpZEFzQ0xJIHx8IHBFbnRyeS0+VmFsaWRBc0FwQ2xpKSAmJiAocEVudHJ5LT5Tc3QgPT0gU1NUX0FTU09DKSkKKwkJeworCQkJc3ByaW50ZihleHRyYSwgIiVzJTAyWDolMDJYOiUwMlg6JTAyWDolMDJYOiUwMlggICIsIGV4dHJhLAorCQkJCXBFbnRyeS0+QWRkclswXSwgcEVudHJ5LT5BZGRyWzFdLCBwRW50cnktPkFkZHJbMl0sCisJCQkJcEVudHJ5LT5BZGRyWzNdLCBwRW50cnktPkFkZHJbNF0sIHBFbnRyeS0+QWRkcls1XSk7CisJCQlzcHJpbnRmKGV4dHJhLCAiJXMlLTRkIiwgZXh0cmEsIChpbnQpcEVudHJ5LT5BaWQpOworCQkJc3ByaW50ZihleHRyYSwgIiVzJS00ZCIsIGV4dHJhLCAoaW50KXBFbnRyeS0+YXBpZHgpOworCQkJc3ByaW50ZihleHRyYSwgIiVzJS03ZCIsIGV4dHJhLCBwRW50cnktPlJzc2lTYW1wbGUuQXZnUnNzaTApOworCQkJc3ByaW50ZihleHRyYSwgIiVzJS03ZCIsIGV4dHJhLCBwRW50cnktPlJzc2lTYW1wbGUuQXZnUnNzaTEpOworCQkJc3ByaW50ZihleHRyYSwgIiVzJS03ZCIsIGV4dHJhLCBwRW50cnktPlJzc2lTYW1wbGUuQXZnUnNzaTIpOworCQkJc3ByaW50ZihleHRyYSwgIiVzJS0xMHMiLCBleHRyYSwgR2V0UGh5TW9kZShwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NT0RFKSk7CisJCQlzcHJpbnRmKGV4dHJhLCAiJXMlLTZzIiwgZXh0cmEsIEdldEJXKHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLkJXKSk7CisJCQlzcHJpbnRmKGV4dHJhLCAiJXMlLTZkIiwgZXh0cmEsIHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1DUyk7CisJCQlzcHJpbnRmKGV4dHJhLCAiJXMlLTZkIiwgZXh0cmEsIHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLlNob3J0R0kpOworCQkJc3ByaW50ZihleHRyYSwgIiVzJS02ZCIsIGV4dHJhLCBwRW50cnktPkhUUGh5TW9kZS5maWVsZC5TVEJDKTsKKwkJCXNwcmludGYoZXh0cmEsICIlcyUtMTBkLCAlZCwgJWQlJVxuIiwgZXh0cmEsIHBFbnRyeS0+RGVidWdGSUZPQ291bnQsIHBFbnRyeS0+RGVidWdUeENvdW50LAorCQkJCQkJKHBFbnRyeS0+RGVidWdUeENvdW50KSA/ICgocEVudHJ5LT5EZWJ1Z1R4Q291bnQtcEVudHJ5LT5EZWJ1Z0ZJRk9Db3VudCkqMTAwL3BFbnRyeS0+RGVidWdUeENvdW50KSA6IDApOworCQkJc3ByaW50ZihleHRyYSwgIiVzXG4iLCBleHRyYSk7CisJCX0KKwl9CisKKwlyZXR1cm4gVFJVRTsKK30KKworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3N0YV9pb2N0bC5jLnBhdGNoIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9zdGFfaW9jdGwuYy5wYXRjaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjcyYjE0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9zdGFfaW9jdGwuYy5wYXRjaApAQCAtMCwwICsxLDE4IEBACistLS0gc3RhX2lvY3RsLmMJMjAwOC0wOS0xOSAxNDozNzo1Mi4wMDAwMDAwMDAgKzA4MDAKKysrKyBzdGFfaW9jdGwuYy5mYzkJMjAwOC0wOS0xOSAxNDozODoyMC4wMDAwMDAwMDAgKzA4MDAKK0BAIC00OSwxNSArNDksOSBAQAorCisgI2RlZmluZSBHUk9VUF9LRVlfTk8gICAgICAgICAgICAgICAgNAorCistI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMjcpCisgI2RlZmluZSBJV0VfU1RSRUFNX0FERF9FVkVOVChfQSwgX0IsIF9DLCBfRCwgX0UpCQlpd2Vfc3RyZWFtX2FkZF9ldmVudChfQSwgX0IsIF9DLCBfRCwgX0UpCisgI2RlZmluZSBJV0VfU1RSRUFNX0FERF9QT0lOVChfQSwgX0IsIF9DLCBfRCwgX0UpCQlpd2Vfc3RyZWFtX2FkZF9wb2ludChfQSwgX0IsIF9DLCBfRCwgX0UpCisgI2RlZmluZSBJV0VfU1RSRUFNX0FERF9WQUxVRShfQSwgX0IsIF9DLCBfRCwgX0UsIF9GKQlpd2Vfc3RyZWFtX2FkZF92YWx1ZShfQSwgX0IsIF9DLCBfRCwgX0UsIF9GKQorLSNlbHNlCistI2RlZmluZSBJV0VfU1RSRUFNX0FERF9FVkVOVChfQSwgX0IsIF9DLCBfRCwgX0UpCQlpd2Vfc3RyZWFtX2FkZF9ldmVudChfQiwgX0MsIF9ELCBfRSkKKy0jZGVmaW5lIElXRV9TVFJFQU1fQUREX1BPSU5UKF9BLCBfQiwgX0MsIF9ELCBfRSkJCWl3ZV9zdHJlYW1fYWRkX3BvaW50KF9CLCBfQywgX0QsIF9FKQorLSNkZWZpbmUgSVdFX1NUUkVBTV9BRERfVkFMVUUoX0EsIF9CLCBfQywgX0QsIF9FLCBfRikJaXdlX3N0cmVhbV9hZGRfdmFsdWUoX0IsIF9DLCBfRCwgX0UsIF9GKQorLSNlbmRpZgorCisgZXh0ZXJuIFVDSEFSICAgIENpcGhlcldwYTJUZW1wbGF0ZVtdOworIGV4dGVybiBVQ0hBUiAgICBDaXBoZXJXcGFQc2tUa2lwW107CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3RtcDYwIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC90bXA2MApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzVlNDQ0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC90bXA2MApAQCAtMCwwICsxLDcwMzcgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgTW9kdWxlIE5hbWU6CisgICAgc3RhX2lvY3RsLmMKKworICAgIEFic3RyYWN0OgorICAgIElPQ1RMIHJlbGF0ZWQgc3Vicm91dGluZXMKKworICAgIFJldmlzaW9uIEhpc3Rvcnk6CisgICAgV2hvICAgICAgICAgV2hlbiAgICAgICAgICBXaGF0CisgICAgLS0tLS0tLS0gICAgLS0tLS0tLS0tLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgUm9yeSBDaGVuICAgMDEtMDMtMjAwMyAgICBjcmVhdGVkCisJUm9yeSBDaGVuICAgMDItMTQtMjAwNSAgICBtb2RpZnkgdG8gc3VwcG9ydCBSVDYxCisqLworCisjaW5jbHVkZQkicnRfY29uZmlnLmgiCisKKyNpZmRlZiBEQkcKK2V4dGVybiBVTE9ORyAgICBSVERlYnVnTGV2ZWw7CisjZW5kaWYKKworI2RlZmluZSBOUl9XRVBfS0VZUyAJCQkJNAorI2RlZmluZSBXRVBfU01BTExfS0VZX0xFTiAJCQkoNDAvOCkKKyNkZWZpbmUgV0VQX0xBUkdFX0tFWV9MRU4gCQkJKDEwNC84KQorCisjZGVmaW5lIEdST1VQX0tFWV9OTyAgICAgICAgICAgICAgICA0CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDI3KQorI2RlZmluZSBJV0VfU1RSRUFNX0FERF9FVkVOVChfQSwgX0IsIF9DLCBfRCwgX0UpCQlpd2Vfc3RyZWFtX2FkZF9ldmVudChfQSwgX0IsIF9DLCBfRCwgX0UpCisjZGVmaW5lIElXRV9TVFJFQU1fQUREX1BPSU5UKF9BLCBfQiwgX0MsIF9ELCBfRSkJCWl3ZV9zdHJlYW1fYWRkX3BvaW50KF9BLCBfQiwgX0MsIF9ELCBfRSkKKyNkZWZpbmUgSVdFX1NUUkVBTV9BRERfVkFMVUUoX0EsIF9CLCBfQywgX0QsIF9FLCBfRikJaXdlX3N0cmVhbV9hZGRfdmFsdWUoX0EsIF9CLCBfQywgX0QsIF9FLCBfRikKKyNlbHNlCisjZGVmaW5lIElXRV9TVFJFQU1fQUREX0VWRU5UKF9BLCBfQiwgX0MsIF9ELCBfRSkJCWl3ZV9zdHJlYW1fYWRkX2V2ZW50KF9CLCBfQywgX0QsIF9FKQorI2RlZmluZSBJV0VfU1RSRUFNX0FERF9QT0lOVChfQSwgX0IsIF9DLCBfRCwgX0UpCQlpd2Vfc3RyZWFtX2FkZF9wb2ludChfQiwgX0MsIF9ELCBfRSkKKyNkZWZpbmUgSVdFX1NUUkVBTV9BRERfVkFMVUUoX0EsIF9CLCBfQywgX0QsIF9FLCBfRikJaXdlX3N0cmVhbV9hZGRfdmFsdWUoX0IsIF9DLCBfRCwgX0UsIF9GKQorI2VuZGlmCisKK2V4dGVybiBVQ0hBUiAgICBDaXBoZXJXcGEyVGVtcGxhdGVbXTsKK2V4dGVybiBVQ0hBUiAgICBDaXBoZXJXcGFQc2tUa2lwW107CitleHRlcm4gVUNIQVIgICAgQ2lwaGVyV3BhUHNrVGtpcExlbjsKKwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9SVF9WRVJTSU9OX0lORk97CisgICAgVUNIQVIgICAgICAgRHJpdmVyVmVyc2lvblc7CisgICAgVUNIQVIgICAgICAgRHJpdmVyVmVyc2lvblg7CisgICAgVUNIQVIgICAgICAgRHJpdmVyVmVyc2lvblk7CisgICAgVUNIQVIgICAgICAgRHJpdmVyVmVyc2lvblo7CisgICAgVUlOVCAgICAgICAgRHJpdmVyQnVpbGRZZWFyOworICAgIFVJTlQgICAgICAgIERyaXZlckJ1aWxkTW9udGg7CisgICAgVUlOVCAgICAgICAgRHJpdmVyQnVpbGREYXk7Cit9IFJUX1ZFUlNJT05fSU5GTywgKlBSVF9WRVJTSU9OX0lORk87CisKK3N0cnVjdCBpd19wcml2X2FyZ3MgcHJpdnRhYltdID0geworeyBSVFBSSVZfSU9DVExfU0VULAorICBJV19QUklWX1RZUEVfQ0hBUiB8IDEwMjQsIDAsCisgICJzZXQifSwKKworeyBSVFBSSVZfSU9DVExfU0hPVywgMCwgSVdfUFJJVl9UWVBFX0NIQVIgfCBJV19QUklWX1NJWkVfTUFTSywKKyAgIiJ9LAoreyBSVFBSSVZfSU9DVExfU0hPVywgSVdfUFJJVl9UWVBFX0NIQVIgfCAxMDI0LCBJV19QUklWX1RZUEVfQ0hBUiB8IElXX1BSSVZfU0laRV9NQVNLLAorICAiIn0sCisvKiAtLS0gc3ViLWlvY3RscyBkZWZpbml0aW9ucyAtLS0gKi8KKyAgICB7IFNIT1dfQ09OTl9TVEFUVVMsCisJICAwLCBJV19QUklWX1RZUEVfQ0hBUiB8IElXX1BSSVZfU0laRV9NQVNLLCAiY29ublN0YXR1cyIgfSwKKwl7IFNIT1dfRFJWSUVSX1ZFUklPTiwKKwkgIDAsIElXX1BSSVZfVFlQRV9DSEFSIHwgSVdfUFJJVl9TSVpFX01BU0ssICJkcml2ZXJWZXIiIH0sCisgICAgeyBTSE9XX0JBX0lORk8sCisJICAwLCBJV19QUklWX1RZUEVfQ0hBUiB8IElXX1BSSVZfU0laRV9NQVNLLCAiYmFpbmZvIiB9LAorCXsgU0hPV19ERVNDX0lORk8sCisJICAwLCBJV19QUklWX1RZUEVfQ0hBUiB8IElXX1BSSVZfU0laRV9NQVNLLCAiZGVzY2luZm8iIH0sCisgICAgeyBSQUlPX09GRiwKKwkgIDAsIElXX1BSSVZfVFlQRV9DSEFSIHwgSVdfUFJJVl9TSVpFX01BU0ssICJyYWRpb19vZmYiIH0sCisJeyBSQUlPX09OLAorCSAgMCwgSVdfUFJJVl9UWVBFX0NIQVIgfCBJV19QUklWX1NJWkVfTUFTSywgInJhZGlvX29uIiB9LAorI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCXsgU0hPV19ETFNfRU5UUllfSU5GTywKKwkgIDAsIElXX1BSSVZfVFlQRV9DSEFSIHwgSVdfUFJJVl9TSVpFX01BU0ssICJkbHNlbnRyeWluZm8iIH0sCisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisJeyBTSE9XX0NGR19WQUxVRSwKKwkgIElXX1BSSVZfVFlQRV9DSEFSIHwgMTAyNCwgSVdfUFJJVl9UWVBFX0NIQVIgfCBJV19QUklWX1NJWkVfTUFTSywgInNob3ciIH0sCisJeyBTSE9XX0FESE9DX0VOVFJZX0lORk8sCisJICAwLCBJV19QUklWX1RZUEVfQ0hBUiB8IElXX1BSSVZfU0laRV9NQVNLLCAiYWRob2NFbnRyeSIgfSwKKworLyogLS0tIHN1Yi1pb2N0bHMgcmVsYXRpb25zIC0tLSAqLworCisjaWZkZWYgREJHCit7IFJUUFJJVl9JT0NUTF9CQlAsCisgIElXX1BSSVZfVFlQRV9DSEFSIHwgSVdfUFJJVl9TSVpFX01BU0ssIElXX1BSSVZfVFlQRV9DSEFSIHwgSVdfUFJJVl9TSVpFX01BU0ssCisgICJiYnAifSwKK3sgUlRQUklWX0lPQ1RMX01BQywKKyAgSVdfUFJJVl9UWVBFX0NIQVIgfCAxMDI0LCBJV19QUklWX1RZUEVfQ0hBUiB8IDEwMjQsCisgICJtYWMifSwKK3sgUlRQUklWX0lPQ1RMX0UyUCwKKyAgSVdfUFJJVl9UWVBFX0NIQVIgfCAxMDI0LCBJV19QUklWX1RZUEVfQ0hBUiB8IDEwMjQsCisgICJlMnAifSwKKyNlbmRpZiAgLyogREJHICovCisKK3sgUlRQUklWX0lPQ1RMX1NUQVRJU1RJQ1MsCisgIDAsIElXX1BSSVZfVFlQRV9DSEFSIHwgSVdfUFJJVl9TSVpFX01BU0ssCisgICJzdGF0In0sCit7IFJUUFJJVl9JT0NUTF9HU0lURVNVUlZFWSwKKyAgMCwgSVdfUFJJVl9UWVBFX0NIQVIgfCAxMDI0LAorICAiZ2V0X3NpdGVfc3VydmV5In0sCit9OworCitJTlQgU2V0X1NTSURfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKTsKKworI2lmZGVmIFdNTV9TVVBQT1JUCitJTlQJU2V0X1dtbUNhcGFibGVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworI2VuZGlmCisKK0lOVCBTZXRfTmV0d29ya1R5cGVfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKTsKKworSU5UIFNldF9BdXRoTW9kZV9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpOworCitJTlQgU2V0X0VuY3J5cFR5cGVfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKTsKKworSU5UIFNldF9EZWZhdWx0S2V5SURfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKTsKKworSU5UIFNldF9LZXkxX1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZyk7CisKK0lOVCBTZXRfS2V5Ml9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpOworCitJTlQgU2V0X0tleTNfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKTsKKworSU5UIFNldF9LZXk0X1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZyk7CisKK0lOVCBTZXRfV1BBUFNLX1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZyk7CisKKworSU5UIFNldF9QU01vZGVfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKTsKKworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKK0lOVCBTZXRfV3BhX1N1cHBvcnQoCisgICAgSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisKKyNpZmRlZiBEQkcKK1ZPSUQgUlRNUElvY3RsQkJQKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCisJSU4Jc3RydWN0IGl3cmVxCSp3cnEpOworCitWT0lEIFJUTVBJb2N0bE1BQygKKwlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAorCUlOCXN0cnVjdCBpd3JlcQkqd3JxKTsKKworVk9JRCBSVE1QSW9jdGxFMlBST00oCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgc3RydWN0IGl3cmVxICAgICp3cnEpOworI2VuZGlmIC8vIERCRyAvLworCisKK05ESVNfU1RBVFVTIFJUTVBXUEFOb25lQWRkS2V5UHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKyAgICBJTglQVk9JRAkJCXBCdWYpOworCitJTlQgU2V0X0ZyYWdUZXN0X1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZyk7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKK0lOVCBTZXRfVEduV2lmaVRlc3RfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZyk7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKK0lOVCBTZXRfTG9uZ1JldHJ5TGltaXRfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVCBTZXRfU2hvcnRSZXRyeUxpbWl0X1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKKwlJTglQVUNIQVIJCQlhcmcpOworCisjaWZkZWYgRVhUX0JVSUxEX0NIQU5ORUxfTElTVAorSU5UIFNldF9JZWVlODAyMTFkQ2xpZW50TW9kZV9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpOworI2VuZGlmIC8vIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QgLy8KKworI2lmZGVmIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQKK0lOVCBTZXRfQ2FycmllckRldGVjdF9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKTsKKyNlbmRpZiAvLyBDQVJSSUVSX0RFVEVDVElPTl9TVVBQT1JUIC8vCisKK0lOVAlTaG93X0FkaG9jX01hY1RhYmxlX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUENIQVIJCQlleHRyYSk7CisKK3N0YXRpYyBzdHJ1Y3QgeworCUNIQVIgKm5hbWU7CisJSU5UICgqc2V0X3Byb2MpKFBSVE1QX0FEQVBURVIgcEFkYXB0ZXIsIFBVQ0hBUiBhcmcpOworfSAqUFJUTVBfUFJJVkFURV9TRVRfUFJPQywgUlRNUF9QUklWQVRFX1NVUFBPUlRfUFJPQ1tdID0geworCXsiRHJpdmVyVmVyc2lvbiIsCQkJCVNldF9Ecml2ZXJWZXJzaW9uX1Byb2N9LAorCXsiQ291bnRyeVJlZ2lvbiIsCQkJCVNldF9Db3VudHJ5UmVnaW9uX1Byb2N9LAorCXsiQ291bnRyeVJlZ2lvbkFCYW5kIiwJCQlTZXRfQ291bnRyeVJlZ2lvbkFCYW5kX1Byb2N9LAorCXsiU1NJRCIsCQkJCQkJU2V0X1NTSURfUHJvY30sCisJeyJXaXJlbGVzc01vZGUiLAkJCQlTZXRfV2lyZWxlc3NNb2RlX1Byb2N9LAorCXsiVHhCdXJzdCIsCQkJCQlTZXRfVHhCdXJzdF9Qcm9jfSwKKwl7IlR4UHJlYW1ibGUiLAkJCQlTZXRfVHhQcmVhbWJsZV9Qcm9jfSwKKwl7IlR4UG93ZXIiLAkJCQkJU2V0X1R4UG93ZXJfUHJvY30sCisJeyJDaGFubmVsIiwJCQkJCVNldF9DaGFubmVsX1Byb2N9LAorCXsiQkdQcm90ZWN0aW9uIiwJCQkJU2V0X0JHUHJvdGVjdGlvbl9Qcm9jfSwKKwl7IlJUU1RocmVzaG9sZCIsCQkJCVNldF9SVFNUaHJlc2hvbGRfUHJvY30sCisJeyJGcmFnVGhyZXNob2xkIiwJCQkJU2V0X0ZyYWdUaHJlc2hvbGRfUHJvY30sCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJeyJIdEJ3IiwJCSAgICAgICAgICAgICAgICBTZXRfSHRCd19Qcm9jfSwKKwl7Ikh0TWNzIiwJCSAgICAgICAgICAgICAgICBTZXRfSHRNY3NfUHJvY30sCisJeyJIdEdpIiwJCSAgICAgICAgICAgICAgICBTZXRfSHRHaV9Qcm9jfSwKKwl7Ikh0T3BNb2RlIiwJCSAgICAgICAgICAgIFNldF9IdE9wTW9kZV9Qcm9jfSwKKwl7Ikh0RXh0Y2hhIiwJCSAgICAgICAgICAgIFNldF9IdEV4dGNoYV9Qcm9jfSwKKwl7Ikh0TXBkdURlbnNpdHkiLAkJICAgICAgICBTZXRfSHRNcGR1RGVuc2l0eV9Qcm9jfSwKKwl7Ikh0QmFXaW5TaXplIiwJCSAgICAgICAgCVNldF9IdEJhV2luU2l6ZV9Qcm9jfSwKKwl7Ikh0UmRnIiwJCSAgICAgICAgCQlTZXRfSHRSZGdfUHJvY30sCisJeyJIdEFtc2R1IiwJCSAgICAgICAgCQlTZXRfSHRBbXNkdV9Qcm9jfSwKKwl7Ikh0QXV0b0JhIiwJCSAgICAgICAgCVNldF9IdEF1dG9CYV9Qcm9jfSwKKwl7Ikh0QmFEZWNsaW5lIiwJCQkJCVNldF9CQURlY2xpbmVfUHJvY30sCisJeyJIdFByb3RlY3QiLAkJICAgICAgICAJU2V0X0h0UHJvdGVjdF9Qcm9jfSwKKwl7Ikh0TWltb1BzIiwJCSAgICAgICAgCVNldF9IdE1pbW9Qc19Qcm9jfSwKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworI2lmZGVmIEFHR1JFR0FUSU9OX1NVUFBPUlQKKwl7IlBrdEFnZ3JlZ2F0ZSIsCQkJCVNldF9Qa3RBZ2dyZWdhdGVfUHJvY30sCisjZW5kaWYKKworI2lmZGVmIFdNTV9TVVBQT1JUCisJeyJXbW1DYXBhYmxlIiwJCQkJCVNldF9XbW1DYXBhYmxlX1Byb2N9LAorI2VuZGlmCisJeyJJRUVFODAyMTFIIiwJCQkJCVNldF9JRUVFODAyMTFIX1Byb2N9LAorICAgIHsiTmV0d29ya1R5cGUiLCAgICAgICAgICAgICAgICAgU2V0X05ldHdvcmtUeXBlX1Byb2N9LAorCXsiQXV0aE1vZGUiLAkJCQkJU2V0X0F1dGhNb2RlX1Byb2N9LAorCXsiRW5jcnlwVHlwZSIsCQkJCQlTZXRfRW5jcnlwVHlwZV9Qcm9jfSwKKwl7IkRlZmF1bHRLZXlJRCIsCQkJCVNldF9EZWZhdWx0S2V5SURfUHJvY30sCisJeyJLZXkxIiwJCQkJCQlTZXRfS2V5MV9Qcm9jfSwKKwl7IktleTIiLAkJCQkJCVNldF9LZXkyX1Byb2N9LAorCXsiS2V5MyIsCQkJCQkJU2V0X0tleTNfUHJvY30sCisJeyJLZXk0IiwJCQkJCQlTZXRfS2V5NF9Qcm9jfSwKKwl7IldQQVBTSyIsCQkJCQkJU2V0X1dQQVBTS19Qcm9jfSwKKwl7IlJlc2V0Q291bnRlciIsCQkJCVNldF9SZXNldFN0YXRDb3VudGVyX1Byb2N9LAorCXsiUFNNb2RlIiwgICAgICAgICAgICAgICAgICAgICAgU2V0X1BTTW9kZV9Qcm9jfSwKKyNpZmRlZiBEQkcKKwl7IkRlYnVnIiwJCQkJCQlTZXRfRGVidWdfUHJvY30sCisjZW5kaWYKKworI2lmZGVmIFJBTElOS19BVEUKKwl7IkFURSIsCQkJCQkJCVNldF9BVEVfUHJvY30sCisJeyJBVEVEQSIsCQkJCQkJU2V0X0FURV9EQV9Qcm9jfSwKKwl7IkFURVNBIiwJCQkJCQlTZXRfQVRFX1NBX1Byb2N9LAorCXsiQVRFQlNTSUQiLAkJCQkJU2V0X0FURV9CU1NJRF9Qcm9jfSwKKwl7IkFURUNIQU5ORUwiLAkJCQkJU2V0X0FURV9DSEFOTkVMX1Byb2N9LAorCXsiQVRFVFhQT1cwIiwJCQkJCVNldF9BVEVfVFhfUE9XRVIwX1Byb2N9LAorCXsiQVRFVFhQT1cxIiwJCQkJCVNldF9BVEVfVFhfUE9XRVIxX1Byb2N9LAorCXsiQVRFVFhBTlQiLAkJCQkJU2V0X0FURV9UWF9BbnRlbm5hX1Byb2N9LAorCXsiQVRFUlhBTlQiLAkJCQkJU2V0X0FURV9SWF9BbnRlbm5hX1Byb2N9LAorCXsiQVRFVFhGUkVRT0ZGU0VUIiwJCQkJU2V0X0FURV9UWF9GUkVRT0ZGU0VUX1Byb2N9LAorCXsiQVRFVFhCVyIsCQkJCQkJU2V0X0FURV9UWF9CV19Qcm9jfSwKKwl7IkFURVRYTEVOIiwJCQkJCVNldF9BVEVfVFhfTEVOR1RIX1Byb2N9LAorCXsiQVRFVFhDTlQiLAkJCQkJU2V0X0FURV9UWF9DT1VOVF9Qcm9jfSwKKwl7IkFURVRYTUNTIiwJCQkJCVNldF9BVEVfVFhfTUNTX1Byb2N9LAorCXsiQVRFVFhNT0RFIiwJCQkJCVNldF9BVEVfVFhfTU9ERV9Qcm9jfSwKKwl7IkFURVRYR0kiLAkJCQkJCVNldF9BVEVfVFhfR0lfUHJvY30sCisJeyJBVEVSWEZFUiIsCQkJCQlTZXRfQVRFX1JYX0ZFUl9Qcm9jfSwKKwl7IkFURVJSRiIsCQkJCQkJU2V0X0FURV9SZWFkX1JGX1Byb2N9LAorCXsiQVRFV1JGMSIsCQkJCQkJU2V0X0FURV9Xcml0ZV9SRjFfUHJvY30sCisJeyJBVEVXUkYyIiwJCQkJCQlTZXRfQVRFX1dyaXRlX1JGMl9Qcm9jfSwKKwl7IkFURVdSRjMiLAkJCQkJCVNldF9BVEVfV3JpdGVfUkYzX1Byb2N9LAorCXsiQVRFV1JGNCIsCQkJCQkJU2V0X0FURV9Xcml0ZV9SRjRfUHJvY30sCisJeyJBVEVMREUyUCIsCQkJCSAgICBTZXRfQVRFX0xvYWRfRTJQX1Byb2N9LAorCXsiQVRFUkUyUCIsCQkJCQkJU2V0X0FURV9SZWFkX0UyUF9Qcm9jfSwKKwl7IkFURVNIT1ciLAkJCQkJCVNldF9BVEVfU2hvd19Qcm9jfSwKKwl7IkFURUhFTFAiLAkJCQkJCVNldF9BVEVfSGVscF9Qcm9jfSwKKworI2lmZGVmIFJBTElOS18yOHh4X1FBCisJeyJUeFN0b3AiLAkJCQkJCVNldF9UeFN0b3BfUHJvY30sCisJeyJSeFN0b3AiLAkJCQkJCVNldF9SeFN0b3BfUHJvY30sCisjZW5kaWYgLy8gUkFMSU5LXzI4eHhfUUEgLy8KKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgeyJXcGFTdXBwb3J0IiwgICAgICAgICAgICAgICAgICBTZXRfV3BhX1N1cHBvcnR9LAorI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKworCisKKwl7IkZpeGVkVHhNb2RlIiwgICAgICAgICAgICAgICAgIFNldF9GaXhlZFR4TW9kZV9Qcm9jfSwKKyNpZmRlZiBDT05GSUdfQVBTVEFfTUlYRURfU1VQUE9SVAorCXsiT3BNb2RlIiwJCQkJCQlTZXRfT3BNb2RlX1Byb2N9LAorI2VuZGlmIC8vIENPTkZJR19BUFNUQV9NSVhFRF9TVVBQT1JUIC8vCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisgICAgeyJUR25XaWZpVGVzdCIsICAgICAgICAgICAgICAgICBTZXRfVEduV2lmaVRlc3RfUHJvY30sCisgICAgeyJGb3JjZUdGIiwJCSAgICAgICAgCQlTZXRfRm9yY2VHRl9Qcm9jfSwKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwl7IkRsc0FkZEVudHJ5IiwJCQkJCVNldF9EbHNBZGRFbnRyeV9Qcm9jfSwKKwl7IkRsc1RlYXJEb3duRW50cnkiLAkJCVNldF9EbHNUZWFyRG93bkVudHJ5X1Byb2N9LAorI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCXsiTG9uZ1JldHJ5IiwJICAgICAgICAJCVNldF9Mb25nUmV0cnlMaW1pdF9Qcm9jfSwKKwl7IlNob3J0UmV0cnkiLAkgICAgICAgIAkJU2V0X1Nob3J0UmV0cnlMaW1pdF9Qcm9jfSwKKyNpZmRlZiBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUCisJeyIxMWRDbGllbnRNb2RlIiwJCQkJU2V0X0llZWU4MDIxMWRDbGllbnRNb2RlX1Byb2N9LAorI2VuZGlmIC8vIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QgLy8KKyNpZmRlZiBDQVJSSUVSX0RFVEVDVElPTl9TVVBQT1JUCisJeyJDYXJyaWVyRGV0ZWN0IiwJCQkJU2V0X0NhcnJpZXJEZXRlY3RfUHJvY30sCisjZW5kaWYgLy8gQ0FSUklFUl9ERVRFQ1RJT05fU1VQUE9SVCAvLworCisJe05VTEwsfQorfTsKKworCitWT0lEIFJUTVBBZGRLZXkoCisJSU4JUFJUTVBfQURBUFRFUgkgICAgcEFkLAorCUlOCVBORElTXzgwMl8xMV9LRVkgICAgcEtleSkKK3sKKwlVTE9ORwkJCQlLZXlJZHg7CisJTUFDX1RBQkxFX0VOVFJZICAJKnBFbnRyeTsKKworICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJUTVBBZGRLZXkgLS0tLS0tPlxuIikpOworCisJaWYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKKwl7CisJCWlmIChwS2V5LT5LZXlJbmRleCAmIDB4ODAwMDAwMDApCisJCXsKKwkJICAgIGlmIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE5kaXNaZXJvTWVtb3J5KHBBZC0+U3RhQ2ZnLlBNSywgMzIpOworICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLlBNSywgcEtleS0+S2V5TWF0ZXJpYWwsIHBLZXktPktleUxlbmd0aCk7CisgICAgICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgICAgICB9CisJCSAgICAvLyBVcGRhdGUgUFRLCisJCSAgICBOZGlzWmVyb01lbW9yeSgmcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0sIHNpemVvZihDSVBIRVJfS0VZKSk7CisgICAgICAgICAgICBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5LZXlMZW4gPSBMRU5fVEtJUF9FSzsKKyAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLktleSwgcEtleS0+S2V5TWF0ZXJpYWwsIExFTl9US0lQX0VLKTsKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgICAgICAgICBpZiAocEFkLT5TdGFDZmcuUGFpckNpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLlJ4TWljLCBwS2V5LT5LZXlNYXRlcmlhbCArIExFTl9US0lQX0VLLCBMRU5fVEtJUF9UWE1JQ0spOworICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLlR4TWljLCBwS2V5LT5LZXlNYXRlcmlhbCArIExFTl9US0lQX0VLICsgTEVOX1RLSVBfVFhNSUNLLCBMRU5fVEtJUF9SWE1JQ0spOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAlOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5UeE1pYywgcEtleS0+S2V5TWF0ZXJpYWwgKyBMRU5fVEtJUF9FSywgTEVOX1RLSVBfVFhNSUNLKTsKKyAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5SeE1pYywgcEtleS0+S2V5TWF0ZXJpYWwgKyBMRU5fVEtJUF9FSyArIExFTl9US0lQX1RYTUlDSywgTEVOX1RLSVBfUlhNSUNLKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gRGVjaWRlIGl0cyBDaGlwZXJBbGcKKyAgICAgICAgCWlmIChwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpCisgICAgICAgIAkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnID0gQ0lQSEVSX1RLSVA7CisgICAgICAgIAllbHNlIGlmIChwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCisgICAgICAgIAkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnID0gQ0lQSEVSX0FFUzsKKyAgICAgICAgCWVsc2UKKyAgICAgICAgCQlwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcgPSBDSVBIRVJfTk9ORTsKKworICAgICAgICAgICAgLy8gVXBkYXRlIHRoZXNlIHJlbGF0ZWQgaW5mb3JtYXRpb24gdG8gTUFDX1RBQkxFX0VOVFJZCisgICAgICAgIAlwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXTsKKyAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBFbnRyeS0+UGFpcndpc2VLZXkuS2V5LCBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5LZXksIExFTl9US0lQX0VLKTsKKyAgICAgICAgCU5kaXNNb3ZlTWVtb3J5KHBFbnRyeS0+UGFpcndpc2VLZXkuUnhNaWMsIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLlJ4TWljLCBMRU5fVEtJUF9SWE1JQ0spOworICAgICAgICAJTmRpc01vdmVNZW1vcnkocEVudHJ5LT5QYWlyd2lzZUtleS5UeE1pYywgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uVHhNaWMsIExFTl9US0lQX1RYTUlDSyk7CisgICAgICAgIAlwRW50cnktPlBhaXJ3aXNlS2V5LkNpcGhlckFsZyA9IHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZzsKKworICAgICAgICAJLy8gVXBkYXRlIHBhaXJ3aXNlIGtleSBpbmZvcm1hdGlvbiB0byBBU0lDIFNoYXJlZCBLZXkgVGFibGUKKyAgICAgICAgCUFzaWNBZGRTaGFyZWRLZXlFbnRyeShwQWQsCisgICAgICAgIAkJCQkJCSAgQlNTMCwKKyAgICAgICAgCQkJCQkJICAwLAorICAgICAgICAJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZywKKyAgICAgICAgCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5LZXksCisgICAgICAgIAkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uVHhNaWMsCisgICAgICAgIAkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uUnhNaWMpOworCisgICAgICAgIAkvLyBVcGRhdGUgQVNJQyBXQ0lEIGF0dHJpYnV0ZSB0YWJsZSBhbmQgSVZFSVYgdGFibGUKKyAgICAgICAgCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkocEFkLAorICAgICAgICAJCQkJCQkJICBCU1MwLAorICAgICAgICAJCQkJCQkJICAwLAorICAgICAgICAJCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcsCisgICAgICAgIAkJCQkJCQkgIHBFbnRyeSk7CisKKyAgICAgICAgICAgIGlmIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIHNldCA4MDIuMXggcG9ydCBjb250cm9sCisJICAgICAgICAgICAgLy9wQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEOworCQkJCVNUQV9QT1JUX1NFQ1VSRUQocEFkKTsKKworICAgICAgICAgICAgICAgIC8vIEluZGljYXRlIENvbm5lY3RlZCBmb3IgR1VJCisgICAgICAgICAgICAgICAgcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZUNvbm5lY3RlZDsKKyAgICAgICAgICAgIH0KKwkJfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFVwZGF0ZSBHVEsKKyAgICAgICAgICAgIHBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCA9IChwS2V5LT5LZXlJbmRleCAmIDB4RkYpOworICAgICAgICAgICAgTmRpc1plcm9NZW1vcnkoJnBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0sIHNpemVvZihDSVBIRVJfS0VZKSk7CisgICAgICAgICAgICBwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLktleUxlbiA9IExFTl9US0lQX0VLOworICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5LZXksIHBLZXktPktleU1hdGVyaWFsLCBMRU5fVEtJUF9FSyk7CisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgICAgICAgICAgaWYgKHBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5SeE1pYywgcEtleS0+S2V5TWF0ZXJpYWwgKyBMRU5fVEtJUF9FSywgTEVOX1RLSVBfVFhNSUNLKTsKKyAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLlR4TWljLCBwS2V5LT5LZXlNYXRlcmlhbCArIExFTl9US0lQX0VLICsgTEVOX1RLSVBfVFhNSUNLLCBMRU5fVEtJUF9SWE1JQ0spOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAlOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLlR4TWljLCBwS2V5LT5LZXlNYXRlcmlhbCArIExFTl9US0lQX0VLLCBMRU5fVEtJUF9UWE1JQ0spOworICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uUnhNaWMsIHBLZXktPktleU1hdGVyaWFsICsgTEVOX1RLSVBfRUsgKyBMRU5fVEtJUF9UWE1JQ0ssIExFTl9US0lQX1JYTUlDSyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFVwZGF0ZSBTaGFyZWQgS2V5IENpcGhlckFsZworICAgIAkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5DaXBoZXJBbGcgPSBDSVBIRVJfTk9ORTsKKyAgICAJCWlmIChwQWQtPlN0YUNmZy5Hcm91cENpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKQorICAgIAkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uQ2lwaGVyQWxnID0gQ0lQSEVSX1RLSVA7CisgICAgCQllbHNlIGlmIChwQWQtPlN0YUNmZy5Hcm91cENpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQorICAgIAkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uQ2lwaGVyQWxnID0gQ0lQSEVSX0FFUzsKKworICAgICAgICAgICAgLy8gVXBkYXRlIGdyb3VwIGtleSBpbmZvcm1hdGlvbiB0byBBU0lDIFNoYXJlZCBLZXkgVGFibGUKKyAgICAgICAgCUFzaWNBZGRTaGFyZWRLZXlFbnRyeShwQWQsCisgICAgICAgIAkJCQkJCSAgQlNTMCwKKyAgICAgICAgCQkJCQkJICBwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQsCisgICAgICAgIAkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5DaXBoZXJBbGcsCisgICAgICAgIAkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5LZXksCisgICAgICAgIAkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5UeE1pYywKKyAgICAgICAgCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLlJ4TWljKTsKKworICAgICAgICAJLy8gVXBkYXRlIEFTSUMgV0NJRCBhdHRyaWJ1dGUgdGFibGUgYW5kIElWRUlWIHRhYmxlCisgICAgICAgIAlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZCwKKyAgICAgICAgCQkJCQkJCSAgQlNTMCwKKyAgICAgICAgCQkJCQkJCSAgcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkLAorICAgICAgICAJCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLkNpcGhlckFsZywKKyAgICAgICAgCQkJCQkJCSAgTlVMTCk7CisKKyAgICAgICAgICAgIC8vIHNldCA4MDIuMXggcG9ydCBjb250cm9sCisJICAgICAgICAvL3BBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQ7CisJCQlTVEFfUE9SVF9TRUNVUkVEKHBBZCk7CisKKyAgICAgICAgICAgIC8vIEluZGljYXRlIENvbm5lY3RlZCBmb3IgR1VJCisgICAgICAgICAgICBwQWQtPkluZGljYXRlTWVkaWFTdGF0ZSA9IE5kaXNNZWRpYVN0YXRlQ29ubmVjdGVkOworICAgICAgICB9CisJfQorCWVsc2UJLy8gZHluYW1pYyBXRVAgZnJvbSB3cGFfc3VwcGxpY2FudAorCXsKKwkJVUNIQVIJQ2lwaGVyQWxnOworICAgIAlQVUNIQVIJS2V5OworCisJCWlmKHBLZXktPktleUxlbmd0aCA9PSAzMikKKwkJCWdvdG8gZW5kOworCisJCUtleUlkeCA9IHBLZXktPktleUluZGV4ICYgMHgwZmZmZmZmZjsKKworCQlpZiAoS2V5SWR4IDwgNCkKKwkJeworCQkJLy8gaXQgaXMgYSBkZWZhdWx0IHNoYXJlZCBrZXksIGZvciBQYWlyd2lzZSBrZXkgc2V0dGluZworCQkJaWYgKHBLZXktPktleUluZGV4ICYgMHg4MDAwMDAwMCkKKwkJCXsKKwkJCQlwRW50cnkgPSBNYWNUYWJsZUxvb2t1cChwQWQsIHBLZXktPkJTU0lEKTsKKworCQkJCWlmIChwRW50cnkpCisJCQkJeworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVE1QQWRkS2V5OiBTZXQgUGFpci13aXNlIEtleVxuIikpOworCisJCQkJCS8vIHNldCBrZXkgbWF0ZXJpYWwgYW5kIGtleSBsZW5ndGgKKyAJCQkJCXBFbnRyeS0+UGFpcndpc2VLZXkuS2V5TGVuID0gKFVDSEFSKXBLZXktPktleUxlbmd0aDsKKwkJCQkJTmRpc01vdmVNZW1vcnkocEVudHJ5LT5QYWlyd2lzZUtleS5LZXksICZwS2V5LT5LZXlNYXRlcmlhbCwgcEtleS0+S2V5TGVuZ3RoKTsKKworCQkJCQkvLyBzZXQgQ2lwaGVyIHR5cGUKKwkJCQkJaWYgKHBLZXktPktleUxlbmd0aCA9PSA1KQorCQkJCQkJcEVudHJ5LT5QYWlyd2lzZUtleS5DaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7CisJCQkJCWVsc2UKKwkJCQkJCXBFbnRyeS0+UGFpcndpc2VLZXkuQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDEyODsKKworCQkJCQkvLyBBZGQgUGFpci13aXNlIGtleSB0byBBc2ljCisJCQkJCUFzaWNBZGRQYWlyd2lzZUtleUVudHJ5KAorCQkJCQkJcEFkLAorCQkJCQkJcEVudHJ5LT5BZGRyLAorCQkJCQkJKFVDSEFSKXBFbnRyeS0+QWlkLAorICAgICAgICAgICAgICAgIAkJJnBFbnRyeS0+UGFpcndpc2VLZXkpOworCisJCQkJCS8vIHVwZGF0ZSBXQ0lEIGF0dHJpYnV0ZSB0YWJsZSBhbmQgSVZFSVYgdGFibGUgZm9yIHRoaXMgZW50cnkKKwkJCQkJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeSgKKwkJCQkJCXBBZCwKKwkJCQkJCUJTUzAsCisJCQkJCQlLZXlJZHgsIC8vIFRoZSB2YWx1ZSBtYXkgYmUgbm90IHplcm8KKwkJCQkJCXBFbnRyeS0+UGFpcndpc2VLZXkuQ2lwaGVyQWxnLAorCQkJCQkJcEVudHJ5KTsKKworCQkJCX0KKwkJCX0KKwkJCWVsc2UKKyAgICAgICAgICAgIHsKKwkJCQkvLyBEZWZhdWx0IGtleSBmb3IgdHggKHNoYXJlZCBrZXkpCisJCQkJcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkID0gKFVDSEFSKSBLZXlJZHg7CisKKwkJCQkvLyBzZXQga2V5IG1hdGVyaWFsIGFuZCBrZXkgbGVuZ3RoCisJCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5LZXlMZW4gPSAoVUNIQVIpIHBLZXktPktleUxlbmd0aDsKKwkJCQlOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLktleSwgJnBLZXktPktleU1hdGVyaWFsLCBwS2V5LT5LZXlMZW5ndGgpOworCisJCQkJLy8gU2V0IENpcGVyIHR5cGUKKwkJCQlpZiAocEtleS0+S2V5TGVuZ3RoID09IDUpCisJCQkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OworCQkJCWVsc2UKKwkJCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5DaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OworCisgICAgCQkJQ2lwaGVyQWxnID0gcEFkLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5DaXBoZXJBbGc7CisgICAgCQkJS2V5ID0gcEFkLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5LZXk7CisKKwkJCQkvLyBTZXQgR3JvdXAga2V5IG1hdGVyaWFsIHRvIEFzaWMKKyAgICAJCQlBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkLCBCU1MwLCBLZXlJZHgsIENpcGhlckFsZywgS2V5LCBOVUxMLCBOVUxMKTsKKworCQkJCS8vIFVwZGF0ZSBXQ0lEIGF0dHJpYnV0ZSB0YWJsZSBhbmQgSVZFSVYgdGFibGUgZm9yIHRoaXMgZ3JvdXAga2V5IHRhYmxlCisJCQkJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWQsIEJTUzAsIEtleUlkeCwgQ2lwaGVyQWxnLCBOVUxMKTsKKworCQkJfQorCQl9CisJfQorZW5kOgorCXJldHVybjsKK30KKworY2hhciAqIHJ0c3RyY2hyKGNvbnN0IGNoYXIgKiBzLCBpbnQgYykKK3sKKyAgICBmb3IoOyAqcyAhPSAoY2hhcikgYzsgKytzKQorICAgICAgICBpZiAoKnMgPT0gJ1wwJykKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiAoY2hhciAqKSBzOworfQorCisvKgorVGhpcyBpcyByZXF1aXJlZCBmb3IgTGluRVgyMDA0L2tlcm5lbDIuNi43IHRvIHByb3ZpZGUgaXdsaXN0IHNjYW5uaW5nIGZ1bmN0aW9uCisqLworCitpbnQKK3J0X2lvY3RsX2dpd25hbWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJICAgY2hhciAqbmFtZSwgY2hhciAqZXh0cmEpCit7CisvLwlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gKFBSVE1QX0FEQVBURVIpIGRldi0+cHJpdjsKKworI2lmZGVmIFJUMjg3MAorCXN0cm5jcHkobmFtZSwgIlJUMjg3MCBXaXJlbGVzcyIsIElGTkFNU0laKTsKKyNlbmRpZiAvLyBSVDI4NzAgLy8KKwlyZXR1cm4gMDsKK30KKworaW50IHJ0X2lvY3RsX3Npd2ZyZXEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQlzdHJ1Y3QgaXdfZnJlcSAqZnJlcSwgY2hhciAqZXh0cmEpCit7CisJUFJUTVBfQURBUFRFUiBwQWRhcHRlciA9IChQUlRNUF9BREFQVEVSKSBkZXYtPnByaXY7CisJaW50IAljaGFuID0gLTE7CisKKyAgICAvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgorICAgIGlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKKyAgICB7CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKyAgICAgICAgcmV0dXJuIC1FTkVURE9XTjsKKyAgICB9CisKKworCWlmIChmcmVxLT5lID4gMSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZigoZnJlcS0+ZSA9PSAwKSAmJiAoZnJlcS0+bSA8PSAxMDAwKSkKKwkJY2hhbiA9IGZyZXEtPm07CS8vIFNldHRpbmcgYnkgY2hhbm5lbCBudW1iZXIKKwllbHNlCisJCU1BUF9LSFpfVE9fQ0hBTk5FTF9JRCggKGZyZXEtPm0gLzEwMCkgLCBjaGFuKTsgLy8gU2V0dGluZyBieSBmcmVxdWVuY3kgLSBzZWFyY2ggdGhlIHRhYmxlICwgbGlrZSAyLjQxMkcsIDIuNDIyRywKKworICAgIGlmIChDaGFubmVsU2FuaXR5KHBBZGFwdGVyLCBjaGFuKSA9PSBUUlVFKQorICAgIHsKKwlwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWwgPSBjaGFuOworCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIj09PnJ0X2lvY3RsX3Npd2ZyZXE6OlNJT0NTSVdGUkVRW2NtZD0weCV4XSAoQ2hhbm5lbD0lZClcbiIsIFNJT0NTSVdGUkVRLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWwpKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICByZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiAwOworfQoraW50IHJ0X2lvY3RsX2dpd2ZyZXEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJICAgc3RydWN0IGl3X2ZyZXEgKmZyZXEsIGNoYXIgKmV4dHJhKQoreworICAgIFZJUlRVQUxfQURBUFRFUiAqcFZpcnR1YWxBZCA9IE5VTEw7CisJUFJUTVBfQURBUFRFUiBwQWRhcHRlciA9IE5VTEw7CisJVUNIQVIgY2g7CisJVUxPTkcJbTsKKworCWlmIChkZXYtPnByaXZfZmxhZ3MgPT0gSU5UX01BSU4pCisJeworCQlwQWRhcHRlciA9IGRldi0+cHJpdjsKKwl9CisJZWxzZQorCXsKKwkJcFZpcnR1YWxBZCA9IGRldi0+cHJpdjsKKwkJaWYgKHBWaXJ0dWFsQWQgJiYgcFZpcnR1YWxBZC0+UnRtcERldikKKwkJCXBBZGFwdGVyID0gcFZpcnR1YWxBZC0+UnRtcERldi0+cHJpdjsKKwl9CisKKwlpZiAocEFkYXB0ZXIgPT0gTlVMTCkKKwl7CisJCS8qIGlmIDFzdCBvcGVuIGZhaWwsIHBBZCB3aWxsIGJlIGZyZWU7CisJCSAgIFNvIHRoZSBuZXRfZGV2LT5wcml2IHdpbGwgYmUgTlVMTCBpbiAycmQgb3BlbiAqLworCQlyZXR1cm4gLUVORVRET1dOOworCX0KKworCQljaCA9IHBBZGFwdGVyLT5Db21tb25DZmcuQ2hhbm5lbDsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiPT0+cnRfaW9jdGxfZ2l3ZnJlcSAgJWRcbiIsIGNoKSk7CisKKyAgICBNQVBfQ0hBTk5FTF9JRF9UT19LSFooY2gsIG0pOworCWZyZXEtPm0gPSBtICogMTAwOworCWZyZXEtPmUgPSAxOworCXJldHVybiAwOworfQorCitpbnQgcnRfaW9jdGxfc2l3bW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgICBfX3UzMiAqbW9kZSwgY2hhciAqZXh0cmEpCit7CisJUFJUTVBfQURBUFRFUiBwQWRhcHRlciA9IChQUlRNUF9BREFQVEVSKSBkZXYtPnByaXY7CisKKwkvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgorICAgIGlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKKyAgICB7CisgICAgCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKyAgICAgICAJcmV0dXJuIC1FTkVURE9XTjsKKyAgICB9CisKKwlzd2l0Y2ggKCptb2RlKQorCXsKKwkJY2FzZSBJV19NT0RFX0FESE9DOgorCQkJU2V0X05ldHdvcmtUeXBlX1Byb2MocEFkYXB0ZXIsICJBZGhvYyIpOworCQkJYnJlYWs7CisJCWNhc2UgSVdfTU9ERV9JTkZSQToKKwkJCVNldF9OZXR3b3JrVHlwZV9Qcm9jKHBBZGFwdGVyLCAiSW5mcmEiKTsKKwkJCWJyZWFrOworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDQsMjApKQorICAgICAgICBjYXNlIElXX01PREVfTU9OSVRPUjoKKwkJCVNldF9OZXR3b3JrVHlwZV9Qcm9jKHBBZGFwdGVyLCAiTW9uaXRvciIpOworCQkJYnJlYWs7CisjZW5kaWYKKwkJZGVmYXVsdDoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT5ydF9pb2N0bF9zaXdtb2RlOjpTSU9DU0lXTU9ERSAodW5rbm93biAlZClcbiIsICptb2RlKSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvLyBSZXNldCBSYWxpbmsgc3VwcGxpY2FudCB0byBub3QgdXNlLCBpdCB3aWxsIGJlIHNldCB0byBzdGFydCB3aGVuIFVJIHNldCBQTUsga2V5CisJcEFkYXB0ZXItPlN0YUNmZy5XcGFTdGF0ZSA9IFNTX05PVFVTRTsKKworCXJldHVybiAwOworfQorCitpbnQgcnRfaW9jdGxfZ2l3bW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgICBfX3UzMiAqbW9kZSwgY2hhciAqZXh0cmEpCit7CisJUFJUTVBfQURBUFRFUiAJcEFkYXB0ZXIgPSBOVUxMOworCVZJUlRVQUxfQURBUFRFUiAqcFZpcnR1YWxBZCA9IE5VTEw7CisKKwlpZiAoZGV2LT5wcml2X2ZsYWdzID09IElOVF9NQUlOKQorCXsKKwkJcEFkYXB0ZXIgPSBkZXYtPnByaXY7CisJfQorCWVsc2UKKwl7CisJCXBWaXJ0dWFsQWQgPSBkZXYtPnByaXY7CisJCWlmIChwVmlydHVhbEFkICYmIHBWaXJ0dWFsQWQtPlJ0bXBEZXYpCisJCQlwQWRhcHRlciA9IHBWaXJ0dWFsQWQtPlJ0bXBEZXYtPnByaXY7CisJfQorCisJaWYgKHBBZGFwdGVyID09IE5VTEwpCisJeworCQkvKiBpZiAxc3Qgb3BlbiBmYWlsLCBwQWQgd2lsbCBiZSBmcmVlOworCQkgICBTbyB0aGUgbmV0X2Rldi0+cHJpdiB3aWxsIGJlIE5VTEwgaW4gMnJkIG9wZW4gKi8KKwkJcmV0dXJuIC1FTkVURE9XTjsKKwl9CisKKwlpZiAoQURIT0NfT04ocEFkYXB0ZXIpKQorCQkqbW9kZSA9IElXX01PREVfQURIT0M7CisgICAgZWxzZSBpZiAoSU5GUkFfT04ocEFkYXB0ZXIpKQorCQkqbW9kZSA9IElXX01PREVfSU5GUkE7CisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNCwyMCkpCisgICAgZWxzZSBpZiAoTU9OSVRPUl9PTihwQWRhcHRlcikpCisgICAgeworICAgICAgICAqbW9kZSA9IElXX01PREVfTU9OSVRPUjsKKyAgICB9CisjZW5kaWYKKyAgICBlbHNlCisgICAgICAgICptb2RlID0gSVdfTU9ERV9BVVRPOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT0+cnRfaW9jdGxfZ2l3bW9kZShtb2RlPSVkKVxuIiwgKm1vZGUpKTsKKwlyZXR1cm4gMDsKK30KKworaW50IHJ0X2lvY3RsX3Npd3NlbnMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJICAgY2hhciAqbmFtZSwgY2hhciAqZXh0cmEpCit7CisJUFJUTVBfQURBUFRFUiBwQWRhcHRlciA9IChQUlRNUF9BREFQVEVSKSBkZXYtPnByaXY7CisKKwkvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgorICAgIAlpZighUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCisgICAgCXsKKyAgICAgICAgCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKyAgICAgICAgCXJldHVybiAtRU5FVERPV047CisgICAgCX0KKworCXJldHVybiAwOworfQorCitpbnQgcnRfaW9jdGxfZ2l3c2VucyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgICBjaGFyICpuYW1lLCBjaGFyICpleHRyYSkKK3sKKwlyZXR1cm4gMDsKK30KKworaW50IHJ0X2lvY3RsX2dpd3JhbmdlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCSAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSAgIHN0cnVjdCBpd19wb2ludCAqZGF0YSwgY2hhciAqZXh0cmEpCit7CisJUFJUTVBfQURBUFRFUiAJcEFkYXB0ZXIgPSBOVUxMOworCVZJUlRVQUxfQURBUFRFUiAqcFZpcnR1YWxBZCA9IE5VTEw7CisJc3RydWN0IGl3X3JhbmdlICpyYW5nZSA9IChzdHJ1Y3QgaXdfcmFuZ2UgKikgZXh0cmE7CisJdTE2IHZhbDsKKwlpbnQgaTsKKworCWlmIChkZXYtPnByaXZfZmxhZ3MgPT0gSU5UX01BSU4pCisJeworCQlwQWRhcHRlciA9IGRldi0+cHJpdjsKKwl9CisJZWxzZQorCXsKKwkJcFZpcnR1YWxBZCA9IGRldi0+cHJpdjsKKwkJaWYgKHBWaXJ0dWFsQWQgJiYgcFZpcnR1YWxBZC0+UnRtcERldikKKwkJCXBBZGFwdGVyID0gcFZpcnR1YWxBZC0+UnRtcERldi0+cHJpdjsKKwl9CisKKwlpZiAocEFkYXB0ZXIgPT0gTlVMTCkKKwl7CisJCS8qIGlmIDFzdCBvcGVuIGZhaWwsIHBBZCB3aWxsIGJlIGZyZWU7CisJCSAgIFNvIHRoZSBuZXRfZGV2LT5wcml2IHdpbGwgYmUgTlVMTCBpbiAycmQgb3BlbiAqLworCQlyZXR1cm4gLUVORVRET1dOOworCX0KKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoIj09PT5ydF9pb2N0bF9naXdyYW5nZVxuIikpOworCWRhdGEtPmxlbmd0aCA9IHNpemVvZihzdHJ1Y3QgaXdfcmFuZ2UpOworCW1lbXNldChyYW5nZSwgMCwgc2l6ZW9mKHN0cnVjdCBpd19yYW5nZSkpOworCisJcmFuZ2UtPnR4cG93ZXJfY2FwYSA9IElXX1RYUE9XX0RCTTsKKworCWlmIChJTkZSQV9PTihwQWRhcHRlcil8fEFESE9DX09OKHBBZGFwdGVyKSkKKwl7CisJCXJhbmdlLT5taW5fcG1wID0gMSAqIDEwMjQ7CisJCXJhbmdlLT5tYXhfcG1wID0gNjU1MzUgKiAxMDI0OworCQlyYW5nZS0+bWluX3BtdCA9IDEgKiAxMDI0OworCQlyYW5nZS0+bWF4X3BtdCA9IDEwMDAgKiAxMDI0OworCQlyYW5nZS0+cG1wX2ZsYWdzID0gSVdfUE9XRVJfUEVSSU9EOworCQlyYW5nZS0+cG10X2ZsYWdzID0gSVdfUE9XRVJfVElNRU9VVDsKKwkJcmFuZ2UtPnBtX2NhcGEgPSBJV19QT1dFUl9QRVJJT0QgfCBJV19QT1dFUl9USU1FT1VUIHwKKwkJCUlXX1BPV0VSX1VOSUNBU1RfUiB8IElXX1BPV0VSX0FMTF9SOworCX0KKworCXJhbmdlLT53ZV92ZXJzaW9uX2NvbXBpbGVkID0gV0lSRUxFU1NfRVhUOworCXJhbmdlLT53ZV92ZXJzaW9uX3NvdXJjZSA9IDE0OworCisJcmFuZ2UtPnJldHJ5X2NhcGEgPSBJV19SRVRSWV9MSU1JVDsKKwlyYW5nZS0+cmV0cnlfZmxhZ3MgPSBJV19SRVRSWV9MSU1JVDsKKwlyYW5nZS0+bWluX3JldHJ5ID0gMDsKKwlyYW5nZS0+bWF4X3JldHJ5ID0gMjU1OworCisJcmFuZ2UtPm51bV9jaGFubmVscyA9ICBwQWRhcHRlci0+Q2hhbm5lbExpc3ROdW07CisKKwl2YWwgPSAwOworCWZvciAoaSA9IDE7IGkgPD0gcmFuZ2UtPm51bV9jaGFubmVsczsgaSsrKQorCXsKKwkJdTMyIG07CisJCXJhbmdlLT5mcmVxW3ZhbF0uaSA9IHBBZGFwdGVyLT5DaGFubmVsTGlzdFtpLTFdLkNoYW5uZWw7CisJCU1BUF9DSEFOTkVMX0lEX1RPX0tIWihwQWRhcHRlci0+Q2hhbm5lbExpc3RbaS0xXS5DaGFubmVsLCBtKTsKKwkJcmFuZ2UtPmZyZXFbdmFsXS5tID0gbSAqIDEwMDsgLyogSFogKi8KKworCQlyYW5nZS0+ZnJlcVt2YWxdLmUgPSAxOworCQl2YWwrKzsKKwkJaWYgKHZhbCA9PSBJV19NQVhfRlJFUVVFTkNJRVMpCisJCQlicmVhazsKKwl9CisJcmFuZ2UtPm51bV9mcmVxdWVuY3kgPSB2YWw7CisKKwlyYW5nZS0+bWF4X3F1YWwucXVhbCA9IDEwMDsgLyogd2hhdCBpcyBjb3JyZWN0IG1heD8gVGhpcyB3YXMgbm90CisJCQkJCSogZG9jdW1lbnRlZCBleGFjdGx5LiBBdCBsZWFzdAorCQkJCQkqIDY5IGhhcyBiZWVuIG9ic2VydmVkLiAqLworCXJhbmdlLT5tYXhfcXVhbC5sZXZlbCA9IDA7IC8qIGRCICovCisJcmFuZ2UtPm1heF9xdWFsLm5vaXNlID0gMDsgLyogZEIgKi8KKworCS8qIFdoYXQgd291bGQgYmUgc3VpdGFibGUgdmFsdWVzIGZvciAiYXZlcmFnZS90eXBpY2FsIiBxdWFsPyAqLworCXJhbmdlLT5hdmdfcXVhbC5xdWFsID0gMjA7CisJcmFuZ2UtPmF2Z19xdWFsLmxldmVsID0gLTYwOworCXJhbmdlLT5hdmdfcXVhbC5ub2lzZSA9IC05NTsKKwlyYW5nZS0+c2Vuc2l0aXZpdHkgPSAzOworCisJcmFuZ2UtPm1heF9lbmNvZGluZ190b2tlbnMgPSBOUl9XRVBfS0VZUzsKKwlyYW5nZS0+bnVtX2VuY29kaW5nX3NpemVzID0gMjsKKwlyYW5nZS0+ZW5jb2Rpbmdfc2l6ZVswXSA9IDU7CisJcmFuZ2UtPmVuY29kaW5nX3NpemVbMV0gPSAxMzsKKworCXJhbmdlLT5taW5fcnRzID0gMDsKKwlyYW5nZS0+bWF4X3J0cyA9IDIzNDc7CisJcmFuZ2UtPm1pbl9mcmFnID0gMjU2OworCXJhbmdlLT5tYXhfZnJhZyA9IDIzNDY7CisKKyNpZiBXSVJFTEVTU19FWFQgPiAxNworCS8qIElXX0VOQ19DQVBBXyogYml0IGZpZWxkICovCisJcmFuZ2UtPmVuY19jYXBhID0gSVdfRU5DX0NBUEFfV1BBIHwgSVdfRU5DX0NBUEFfV1BBMiB8CisJCQkJCUlXX0VOQ19DQVBBX0NJUEhFUl9US0lQIHwgSVdfRU5DX0NBUEFfQ0lQSEVSX0NDTVA7CisjZW5kaWYKKworCXJldHVybiAwOworfQorCitpbnQgcnRfaW9jdGxfc2l3YXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJICAgICAgc3RydWN0IHNvY2thZGRyICphcF9hZGRyLCBjaGFyICpleHRyYSkKK3sKKwlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gKFBSVE1QX0FEQVBURVIpIGRldi0+cHJpdjsKKyAgICBORElTXzgwMl8xMV9NQUNfQUREUkVTUyBCc3NpZDsKKworCS8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCisJaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQorCXsKKyAgICAgICAJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOworICAgICAgIAlyZXR1cm4gLUVORVRET1dOOworICAgIH0KKworCWlmIChwQWRhcHRlci0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgIT0gQ05UTF9JRExFKQorICAgIHsKKyAgICAgICAgUlQyOFhYX01MTUVfUkVTRVRfU1RBVEVfTUFDSElORShwQWRhcHRlcik7CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISBNTE1FIGJ1c3ksIHJlc2V0IE1MTUUgc3RhdGUgbWFjaGluZSAhISFcbiIpKTsKKyAgICB9CisKKyAgICAvLyB0ZWxsIENOVEwgc3RhdGUgbWFjaGluZSB0byBjYWxsIE5kaXNNU2V0SW5mb3JtYXRpb25Db21wbGV0ZSgpIGFmdGVyIGNvbXBsZXRpbmcKKyAgICAvLyB0aGlzIHJlcXVlc3QsIGJlY2F1c2UgdGhpcyByZXF1ZXN0IGlzIGluaXRpYXRlZCBieSBORElTLgorICAgIHBBZGFwdGVyLT5NbG1lQXV4LkN1cnJSZXFJc0Zyb21OZGlzID0gRkFMU0U7CisJLy8gUHJldmVudCB0byBjb25uZWN0IEFQIGFnYWluIGluIFNUQU1sbWVQZXJpb2RpY0V4ZWMKKwlwQWRhcHRlci0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbj0gMzI7CisKKyAgICBtZW1zZXQoQnNzaWQsIDAsIE1BQ19BRERSX0xFTik7CisgICAgbWVtY3B5KEJzc2lkLCBhcF9hZGRyLT5zYV9kYXRhLCBNQUNfQUREUl9MRU4pOworICAgIE1sbWVFbnF1ZXVlKHBBZGFwdGVyLAorICAgICAgICAgICAgICAgIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLAorICAgICAgICAgICAgICAgIE9JRF84MDJfMTFfQlNTSUQsCisgICAgICAgICAgICAgICAgc2l6ZW9mKE5ESVNfODAyXzExX01BQ19BRERSRVNTKSwKKyAgICAgICAgICAgICAgICAoVk9JRCAqKSZCc3NpZCk7CisKKyAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJT0NUTDo6U0lPQ1NJV0FQICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorICAgICAgICBCc3NpZFswXSwgQnNzaWRbMV0sIEJzc2lkWzJdLCBCc3NpZFszXSwgQnNzaWRbNF0sIEJzc2lkWzVdKSk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IHJ0X2lvY3RsX2dpd2FwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCSAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSAgICAgIHN0cnVjdCBzb2NrYWRkciAqYXBfYWRkciwgY2hhciAqZXh0cmEpCit7CisJUFJUTVBfQURBUFRFUiAJcEFkYXB0ZXIgPSBOVUxMOworCVZJUlRVQUxfQURBUFRFUiAqcFZpcnR1YWxBZCA9IE5VTEw7CisKKwlpZiAoZGV2LT5wcml2X2ZsYWdzID09IElOVF9NQUlOKQorCXsKKwkJcEFkYXB0ZXIgPSBkZXYtPnByaXY7CisJfQorCWVsc2UKKwl7CisJCXBWaXJ0dWFsQWQgPSBkZXYtPnByaXY7CisJCWlmIChwVmlydHVhbEFkICYmIHBWaXJ0dWFsQWQtPlJ0bXBEZXYpCisJCQlwQWRhcHRlciA9IHBWaXJ0dWFsQWQtPlJ0bXBEZXYtPnByaXY7CisJfQorCisJaWYgKHBBZGFwdGVyID09IE5VTEwpCisJeworCQkvKiBpZiAxc3Qgb3BlbiBmYWlsLCBwQWQgd2lsbCBiZSBmcmVlOworCQkgICBTbyB0aGUgbmV0X2Rldi0+cHJpdiB3aWxsIGJlIE5VTEwgaW4gMnJkIG9wZW4gKi8KKwkJcmV0dXJuIC1FTkVURE9XTjsKKwl9CisKKwlpZiAoSU5GUkFfT04ocEFkYXB0ZXIpIHx8IEFESE9DX09OKHBBZGFwdGVyKSkKKwl7CisJCWFwX2FkZHItPnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKKwkJbWVtY3B5KGFwX2FkZHItPnNhX2RhdGEsICZwQWRhcHRlci0+Q29tbW9uQ2ZnLkJzc2lkLCBFVEhfQUxFTik7CisJfQorI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyAgICAvLyBBZGQgZm9yIFJUMjg3MAorICAgIGVsc2UgaWYgKHBBZGFwdGVyLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQICE9IFdQQV9TVVBQTElDQU5UX0RJU0FCTEUpCisgICAgeworICAgICAgICBhcF9hZGRyLT5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7CisgICAgICAgIG1lbWNweShhcF9hZGRyLT5zYV9kYXRhLCAmcEFkYXB0ZXItPk1sbWVBdXguQnNzaWQsIEVUSF9BTEVOKTsKKyAgICB9CisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCWVsc2UKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklPQ1RMOjpTSU9DR0lXQVAoPUVNUFRZKVxuIikpOworCQlyZXR1cm4gLUVOT1RDT05OOworCX0KKworCXJldHVybiAwOworfQorCisvKgorICogVW5pdHMgYXJlIGluIGRiIGFib3ZlIHRoZSBub2lzZSBmbG9vci4gVGhhdCBtZWFucyB0aGUKKyAqIHJzc2kgdmFsdWVzIHJlcG9ydGVkIGluIHRoZSB0eC9yeCBkZXNjcmlwdG9ycyBpbiB0aGUKKyAqIGRyaXZlciBhcmUgdGhlIFNOUiBleHByZXNzZWQgaW4gZGIuCisgKgorICogSWYgeW91IGFzc3VtZSB0aGF0IHRoZSBub2lzZSBmbG9vciBpcyAtOTUsIHdoaWNoIGlzIGFuCisgKiBleGNlbGxlbnQgYXNzdW1wdGlvbiA5OS41ICUgb2YgdGhlIHRpbWUsIHRoZW4geW91IGNhbgorICogZGVyaXZlIHRoZSBhYnNvbHV0ZSBzaWduYWwgbGV2ZWwgKGkuZS4gLTk1ICsgcnNzaSkuCisgKiBUaGVyZSBhcmUgc29tZSBvdGhlciBzbGlnaHQgZmFjdG9ycyB0byB0YWtlIGludG8gYWNjb3VudAorICogZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIHJzc2kgbWVhc3VyZW1lbnQgaXMgZnJvbSAxMWIsCisgKiAxMWcsIG9yIDExYS4gICBUaGVzZSBkaWZmZXJlbmNlcyBhcmUgYXQgbW9zdCAyZGIgYW5kCisgKiBjYW4gYmUgZG9jdW1lbnRlZC4KKyAqCisgKiBOQjogdmFyaW91cyBjYWxjdWxhdGlvbnMgYXJlIGJhc2VkIG9uIHRoZSBvcmlub2NvL3dhdmVsYW4KKyAqICAgICBkcml2ZXJzIGZvciBjb21wYXRpYmlsaXR5CisgKi8KK3N0YXRpYyB2b2lkIHNldF9xdWFsaXR5KFBSVE1QX0FEQVBURVIgcEFkYXB0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaXdfcXVhbGl0eSAqaXEsCisgICAgICAgICAgICAgICAgICAgICAgICBzaWduZWQgY2hhciByc3NpKQoreworCV9fdTggQ2hhbm5lbFF1YWxpdHk7CisKKwkvLyBOb3JtYWxpemUgUnNzaQorCWlmIChyc3NpID49IC01MCkKKwkJQ2hhbm5lbFF1YWxpdHkgPSAxMDA7CisJZWxzZSBpZiAocnNzaSA+PSAtODApIC8vIGJldHdlZW4gLTUwIH4gLTgwZGJtCisJCUNoYW5uZWxRdWFsaXR5ID0gKF9fdTgpKDI0ICsgKChyc3NpICsgODApICogMjYpLzEwKTsKKwllbHNlIGlmIChyc3NpID49IC05MCkgICAvLyBiZXR3ZWVuIC04MCB+IC05MGRibQorICAgICAgICBDaGFubmVsUXVhbGl0eSA9IChfX3U4KSgocnNzaSArIDkwKSAqIDI2KS8xMDsKKwllbHNlCisJCUNoYW5uZWxRdWFsaXR5ID0gMDsKKworICAgIGlxLT5xdWFsID0gKF9fdTgpQ2hhbm5lbFF1YWxpdHk7CisKKyAgICBpcS0+bGV2ZWwgPSAoX191OCkocnNzaSk7CisgICAgaXEtPm5vaXNlID0gKHBBZGFwdGVyLT5CYnBXcml0ZUxhdGNoWzY2XSA+IHBBZGFwdGVyLT5CYnBUdW5pbmcuRmFsc2VDY2FVcHBlclRocmVzaG9sZCkgPyAoKF9fdTgpcEFkYXB0ZXItPkJicFR1bmluZy5GYWxzZUNjYVVwcGVyVGhyZXNob2xkKSA6ICgoX191OCkgcEFkYXB0ZXItPkJicFdyaXRlTGF0Y2hbNjZdKTsgCS8vIG5vaXNlIGxldmVsIChkQm0pCisgICAgaXEtPm5vaXNlICs9IDI1NiAtIDE0MzsKKyAgICBpcS0+dXBkYXRlZCA9IHBBZGFwdGVyLT5pd19zdGF0cy5xdWFsLnVwZGF0ZWQ7Cit9CisKK2ludCBydF9pb2N0bF9pd2FwbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCXN0cnVjdCBpd19wb2ludCAqZGF0YSwgY2hhciAqZXh0cmEpCit7CisgCVBSVE1QX0FEQVBURVIgcEFkYXB0ZXIgPSAoUFJUTVBfQURBUFRFUikgZGV2LT5wcml2OworCisJc3RydWN0IHNvY2thZGRyIGFkZHJbSVdfTUFYX0FQXTsKKwlzdHJ1Y3QgaXdfcXVhbGl0eSBxdWFsW0lXX01BWF9BUF07CisJaW50IGk7CisKKyAgIAkvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgorICAgIGlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKKyAgICB7CisgICAgICAgCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKwkJZGF0YS0+bGVuZ3RoID0gMDsKKwkJcmV0dXJuIDA7CisgICAgICAgIC8vcmV0dXJuIC1FTkVURE9XTjsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDxJV19NQVhfQVAgOyBpKyspCisJeworCQlpZiAoaSA+PSAgcEFkYXB0ZXItPlNjYW5UYWIuQnNzTnIpCisJCQlicmVhazsKKwkJYWRkcltpXS5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7CisJCQltZW1jcHkoYWRkcltpXS5zYV9kYXRhLCAmcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uQnNzaWQsIE1BQ19BRERSX0xFTik7CisJCXNldF9xdWFsaXR5KHBBZGFwdGVyLCAmcXVhbFtpXSwgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uUnNzaSk7CisJfQorCWRhdGEtPmxlbmd0aCA9IGk7CisJbWVtY3B5KGV4dHJhLCAmYWRkciwgaSpzaXplb2YoYWRkclswXSkpOworCWRhdGEtPmZsYWdzID0gMTsJCS8qIHNpZ25hbCBxdWFsaXR5IHByZXNlbnQgKHNvcnQgb2YpICovCisJbWVtY3B5KGV4dHJhICsgaSpzaXplb2YoYWRkclswXSksICZxdWFsLCBpKnNpemVvZihxdWFsW2ldKSk7CisKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIFNJT0NHSVdTQ0FOCitpbnQgcnRfaW9jdGxfc2l3c2NhbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCXN0cnVjdCBpd19wb2ludCAqZGF0YSwgY2hhciAqZXh0cmEpCit7CisJUFJUTVBfQURBUFRFUiBwQWRhcHRlciA9IChQUlRNUF9BREFQVEVSKSBkZXYtPnByaXY7CisKKwlVTE9ORwkJCQkJCQkJTm93OworCWludCBTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworCisJLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KKwlpZighUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisJCXJldHVybiAtRU5FVERPV047CisJfQorCisJaWYgKE1PTklUT1JfT04ocEFkYXB0ZXIpKQorICAgIHsKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIERyaXZlciBpcyBpbiBNb25pdG9yIE1vZGUgbm93ICEhIVxuIikpOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKwlpZiAocEFkYXB0ZXItPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgPT0gV1BBX1NVUFBMSUNBTlRfRU5BQkxFKQorCXsKKwkJcEFkYXB0ZXItPlN0YUNmZy5XcGFTdXBwbGljYW50U2NhbkNvdW50Kys7CisJfQorI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKworICAgIHBBZGFwdGVyLT5TdGFDZmcuYlNjYW5SZXFJc0Zyb21XZWJVSSA9IFRSVUU7CisJaWYgKFJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKSkKKwkJcmV0dXJuIDA7CisJZG97CisJCU5vdyA9IGppZmZpZXM7CisKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisJCWlmICgocEFkYXB0ZXItPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgPT0gV1BBX1NVUFBMSUNBTlRfRU5BQkxFKSAmJgorCQkJKHBBZGFwdGVyLT5TdGFDZmcuV3BhU3VwcGxpY2FudFNjYW5Db3VudCA+IDMpKQorCQl7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgV3BhU3VwcGxpY2FudFNjYW5Db3VudCA+IDNcbiIpKTsKKwkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisJCQlicmVhazsKKwkJfQorI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKworCQlpZiAoKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWRhcHRlciwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpKSAmJgorCQkJKChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkgfHwKKwkJCShwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykpICYmCisJCQkocEFkYXB0ZXItPlN0YUNmZy5Qb3J0U2VjdXJlZCA9PSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQpKQorCQl7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgTGluayBVUCwgUG9ydCBOb3QgU2VjdXJlZCEgaWdub3JlIHRoaXMgc2V0OjpPSURfODAyXzExX0JTU0lEX0xJU1RfU0NBTlxuIikpOworCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKHBBZGFwdGVyLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSAhPSBDTlRMX0lETEUpCisJCXsKKwkJCVJUMjhYWF9NTE1FX1JFU0VUX1NUQVRFX01BQ0hJTkUocEFkYXB0ZXIpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIE1MTUUgYnVzeSwgcmVzZXQgTUxNRSBzdGF0ZSBtYWNoaW5lICEhIVxuIikpOworCQl9CisKKwkJLy8gdGVsbCBDTlRMIHN0YXRlIG1hY2hpbmUgdG8gY2FsbCBOZGlzTVNldEluZm9ybWF0aW9uQ29tcGxldGUoKSBhZnRlciBjb21wbGV0aW5nCisJCS8vIHRoaXMgcmVxdWVzdCwgYmVjYXVzZSB0aGlzIHJlcXVlc3QgaXMgaW5pdGlhdGVkIGJ5IE5ESVMuCisJCXBBZGFwdGVyLT5NbG1lQXV4LkN1cnJSZXFJc0Zyb21OZGlzID0gRkFMU0U7CisJCS8vIFJlc2V0IGFsbG93ZWQgc2NhbiByZXRyaWVzCisJCXBBZGFwdGVyLT5TdGFDZmcuU2NhbkNudCA9IDA7CisJCXBBZGFwdGVyLT5TdGFDZmcuTGFzdFNjYW5UaW1lID0gTm93OworCisJCU1sbWVFbnF1ZXVlKHBBZGFwdGVyLAorCQkJTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsCisJCQlPSURfODAyXzExX0JTU0lEX0xJU1RfU0NBTiwKKwkJCTAsCisJCQlOVUxMKTsKKworCQlTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworCQlSVDI4WFhfTUxNRV9IQU5ETEVSKHBBZGFwdGVyKTsKKwl9d2hpbGUoMCk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBydF9pb2N0bF9naXdzY2FuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJc3RydWN0IGl3X3BvaW50ICpkYXRhLCBjaGFyICpleHRyYSkKK3sKKworCVBSVE1QX0FEQVBURVIgcEFkYXB0ZXIgPSAoUFJUTVBfQURBUFRFUikgZGV2LT5wcml2OworCWludCBpPTA7CisJY2hhciAqY3VycmVudF9ldiA9IGV4dHJhLCAqcHJldmlvdXNfZXYgPSBleHRyYTsKKwljaGFyICplbmRfYnVmOworCWNoYXIgKmN1cnJlbnRfdmFsLCBjdXN0b21bTUFYX0NVU1RPTV9MRU5dID0gezB9OworI2lmbmRlZiBJV0VWR0VOSUUKKwljaGFyIGlkeDsKKyNlbmRpZiAvLyBJV0VWR0VOSUUgLy8KKwlzdHJ1Y3QgaXdfZXZlbnQgaXdlOworCisJaWYgKFJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKSkKKyAgICB7CisJCS8qCisJCSAqIFN0aWxsIHNjYW5uaW5nLCBpbmRpY2F0ZSB0aGUgY2FsbGVyIHNob3VsZCB0cnkgYWdhaW4uCisJCSAqLworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisKKworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKwlpZiAocEFkYXB0ZXItPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgPT0gV1BBX1NVUFBMSUNBTlRfRU5BQkxFKQorCXsKKwkJcEFkYXB0ZXItPlN0YUNmZy5XcGFTdXBwbGljYW50U2NhbkNvdW50ID0gMDsKKwl9CisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCisJaWYgKHBBZGFwdGVyLT5TY2FuVGFiLkJzc05yID09IDApCisJeworCQlkYXRhLT5sZW5ndGggPSAwOworCQlyZXR1cm4gMDsKKwl9CisKKyNpZiBXSVJFTEVTU19FWFQgPj0gMTcKKyAgICBpZiAoZGF0YS0+bGVuZ3RoID4gMCkKKyAgICAgICAgZW5kX2J1ZiA9IGV4dHJhICsgZGF0YS0+bGVuZ3RoOworICAgIGVsc2UKKyAgICAgICAgZW5kX2J1ZiA9IGV4dHJhICsgSVdfU0NBTl9NQVhfREFUQTsKKyNlbHNlCisgICAgZW5kX2J1ZiA9IGV4dHJhICsgSVdfU0NBTl9NQVhfREFUQTsKKyNlbmRpZgorCisJZm9yIChpID0gMDsgaSA8IHBBZGFwdGVyLT5TY2FuVGFiLkJzc05yOyBpKyspCisJeworCQlpZiAoY3VycmVudF9ldiA+PSBlbmRfYnVmKQorICAgICAgICB7CisjaWYgV0lSRUxFU1NfRVhUID49IDE3CisgICAgICAgICAgICByZXR1cm4gLUUyQklHOworI2Vsc2UKKwkJCWJyZWFrOworI2VuZGlmCisgICAgICAgIH0KKworCQkvL01BQyBhZGRyZXNzCisJCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkJbWVtc2V0KCZpd2UsIDAsIHNpemVvZihpd2UpKTsKKwkJaXdlLmNtZCA9IFNJT0NHSVdBUDsKKwkJaXdlLnUuYXBfYWRkci5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7CisJCQkJbWVtY3B5KGl3ZS51LmFwX2FkZHIuc2FfZGF0YSwgJnBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkJzc2lkLCBFVEhfQUxFTik7CisKKyAgICAgICAgcHJldmlvdXNfZXYgPSBjdXJyZW50X2V2OworCQljdXJyZW50X2V2ID0gSVdFX1NUUkVBTV9BRERfRVZFTlQoaW5mbywgY3VycmVudF9ldixlbmRfYnVmLCAmaXdlLCBJV19FVl9BRERSX0xFTik7CisgICAgICAgIGlmIChjdXJyZW50X2V2ID09IHByZXZpb3VzX2V2KQorI2lmIFdJUkVMRVNTX0VYVCA+PSAxNworICAgICAgICAgICAgcmV0dXJuIC1FMkJJRzsKKyNlbHNlCisJCQlicmVhazsKKyNlbmRpZgorCisJCS8vRVNTSUQKKwkJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCQltZW1zZXQoJml3ZSwgMCwgc2l6ZW9mKGl3ZSkpOworCQlpd2UuY21kID0gU0lPQ0dJV0VTU0lEOworCQlpd2UudS5kYXRhLmxlbmd0aCA9IHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlNzaWRMZW47CisJCWl3ZS51LmRhdGEuZmxhZ3MgPSAxOworCisgICAgICAgIHByZXZpb3VzX2V2ID0gY3VycmVudF9ldjsKKwkJY3VycmVudF9ldiA9IElXRV9TVFJFQU1fQUREX1BPSU5UKGluZm8sIGN1cnJlbnRfZXYsZW5kX2J1ZiwgJml3ZSwgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uU3NpZCk7CisgICAgICAgIGlmIChjdXJyZW50X2V2ID09IHByZXZpb3VzX2V2KQorI2lmIFdJUkVMRVNTX0VYVCA+PSAxNworICAgICAgICAgICAgcmV0dXJuIC1FMkJJRzsKKyNlbHNlCisJCQlicmVhazsKKyNlbmRpZgorCisJCS8vTmV0d29yayBUeXBlCisJCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkJbWVtc2V0KCZpd2UsIDAsIHNpemVvZihpd2UpKTsKKwkJaXdlLmNtZCA9IFNJT0NHSVdNT0RFOworCQlpZiAocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uQnNzVHlwZSA9PSBOZGlzODAyXzExSUJTUykKKwkJeworCQkJaXdlLnUubW9kZSA9IElXX01PREVfQURIT0M7CisJCX0KKwkJZWxzZSBpZiAocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uQnNzVHlwZSA9PSBOZGlzODAyXzExSW5mcmFzdHJ1Y3R1cmUpCisJCXsKKwkJCWl3ZS51Lm1vZGUgPSBJV19NT0RFX0lORlJBOworCQl9CisJCWVsc2UKKwkJeworCQkJaXdlLnUubW9kZSA9IElXX01PREVfQVVUTzsKKwkJfQorCQlpd2UubGVuID0gSVdfRVZfVUlOVF9MRU47CisKKyAgICAgICAgcHJldmlvdXNfZXYgPSBjdXJyZW50X2V2OworCQljdXJyZW50X2V2ID0gSVdFX1NUUkVBTV9BRERfRVZFTlQoaW5mbywgY3VycmVudF9ldiwgZW5kX2J1ZiwgJml3ZSwgIElXX0VWX1VJTlRfTEVOKTsKKyAgICAgICAgaWYgKGN1cnJlbnRfZXYgPT0gcHJldmlvdXNfZXYpCisjaWYgV0lSRUxFU1NfRVhUID49IDE3CisgICAgICAgICAgICByZXR1cm4gLUUyQklHOworI2Vsc2UKKwkJCWJyZWFrOworI2VuZGlmCisKKwkJLy9DaGFubmVsIGFuZCBGcmVxdWVuY3kKKwkJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCQltZW1zZXQoJml3ZSwgMCwgc2l6ZW9mKGl3ZSkpOworCQlpd2UuY21kID0gU0lPQ0dJV0ZSRVE7CisJCWlmIChJTkZSQV9PTihwQWRhcHRlcikgfHwgQURIT0NfT04ocEFkYXB0ZXIpKQorCQkJaXdlLnUuZnJlcS5tID0gcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uQ2hhbm5lbDsKKwkJZWxzZQorCQkJaXdlLnUuZnJlcS5tID0gcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uQ2hhbm5lbDsKKwkJaXdlLnUuZnJlcS5lID0gMDsKKwkJaXdlLnUuZnJlcS5pID0gMDsKKworCQlwcmV2aW91c19ldiA9IGN1cnJlbnRfZXY7CisJCWN1cnJlbnRfZXYgPSBJV0VfU1RSRUFNX0FERF9FVkVOVChpbmZvLCBjdXJyZW50X2V2LGVuZF9idWYsICZpd2UsIElXX0VWX0ZSRVFfTEVOKTsKKyAgICAgICAgaWYgKGN1cnJlbnRfZXYgPT0gcHJldmlvdXNfZXYpCisjaWYgV0lSRUxFU1NfRVhUID49IDE3CisgICAgICAgICAgICByZXR1cm4gLUUyQklHOworI2Vsc2UKKwkJCWJyZWFrOworI2VuZGlmCisKKyAgICAgICAgLy9BZGQgcXVhbGl0eSBzdGF0aXN0aWNzCisgICAgICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgbWVtc2V0KCZpd2UsIDAsIHNpemVvZihpd2UpKTsKKyAgICAJaXdlLmNtZCA9IElXRVZRVUFMOworICAgIAlpd2UudS5xdWFsLmxldmVsID0gMDsKKyAgICAJaXdlLnUucXVhbC5ub2lzZSA9IDA7CisgICAgICAgIHNldF9xdWFsaXR5KHBBZGFwdGVyLCAmaXdlLnUucXVhbCwgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uUnNzaSk7CisgICAgCWN1cnJlbnRfZXYgPSBJV0VfU1RSRUFNX0FERF9FVkVOVChpbmZvLCBjdXJyZW50X2V2LCBlbmRfYnVmLCAmaXdlLCBJV19FVl9RVUFMX0xFTik7CisgICAgICAgIGlmIChjdXJyZW50X2V2ID09IHByZXZpb3VzX2V2KQorI2lmIFdJUkVMRVNTX0VYVCA+PSAxNworICAgICAgICAgICAgcmV0dXJuIC1FMkJJRzsKKyNlbHNlCisJCQlicmVhazsKKyNlbmRpZgorCisJCS8vRW5jeXB0aW9uIGtleQorCQkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJCW1lbXNldCgmaXdlLCAwLCBzaXplb2YoaXdlKSk7CisJCWl3ZS5jbWQgPSBTSU9DR0lXRU5DT0RFOworCQlpZiAoQ0FQX0lTX1BSSVZBQ1lfT04gKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkNhcGFiaWxpdHlJbmZvICkpCisJCQlpd2UudS5kYXRhLmZsYWdzID1JV19FTkNPREVfRU5BQkxFRCB8IElXX0VOQ09ERV9OT0tFWTsKKwkJZWxzZQorCQkJaXdlLnUuZGF0YS5mbGFncyA9IElXX0VOQ09ERV9ESVNBQkxFRDsKKworICAgICAgICBwcmV2aW91c19ldiA9IGN1cnJlbnRfZXY7CisgICAgICAgIGN1cnJlbnRfZXYgPSBJV0VfU1RSRUFNX0FERF9QT0lOVChpbmZvLCBjdXJyZW50X2V2LCBlbmRfYnVmLCZpd2UsIChjaGFyICopcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsoaXdlLnUuZGF0YS5mbGFncyAmIElXX0VOQ09ERV9JTkRFWCktMV0uS2V5KTsKKyAgICAgICAgaWYgKGN1cnJlbnRfZXYgPT0gcHJldmlvdXNfZXYpCisjaWYgV0lSRUxFU1NfRVhUID49IDE3CisgICAgICAgICAgICByZXR1cm4gLUUyQklHOworI2Vsc2UKKwkJCWJyZWFrOworI2VuZGlmCisKKwkJLy9CaXQgUmF0ZQorCQkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJCWlmIChwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5TdXBSYXRlTGVuKQorICAgICAgICB7CisgICAgICAgICAgICBVQ0hBUiB0bXBSYXRlID0gcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uU3VwUmF0ZVtwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5TdXBSYXRlTGVuLTFdOworCQkJbWVtc2V0KCZpd2UsIDAsIHNpemVvZihpd2UpKTsKKwkJCWl3ZS5jbWQgPSBTSU9DR0lXUkFURTsKKyAgICAJCWN1cnJlbnRfdmFsID0gY3VycmVudF9ldiArIElXX0VWX0xDUF9MRU47CisgICAgICAgICAgICBpZiAodG1wUmF0ZSA9PSAweDgyKQorICAgICAgICAgICAgICAgIGl3ZS51LmJpdHJhdGUudmFsdWUgPSAgMSAqIDEwMDAwMDA7CisgICAgICAgICAgICBlbHNlIGlmICh0bXBSYXRlID09IDB4ODQpCisgICAgICAgICAgICAgICAgaXdlLnUuYml0cmF0ZS52YWx1ZSA9ICAyICogMTAwMDAwMDsKKyAgICAgICAgICAgIGVsc2UgaWYgKHRtcFJhdGUgPT0gMHg4QikKKyAgICAgICAgICAgICAgICBpd2UudS5iaXRyYXRlLnZhbHVlID0gIDUuNSAqIDEwMDAwMDA7CisgICAgICAgICAgICBlbHNlIGlmICh0bXBSYXRlID09IDB4OTYpCisgICAgICAgICAgICAgICAgaXdlLnUuYml0cmF0ZS52YWx1ZSA9ICAxMSAqIDEwMDAwMDA7CisgICAgICAgICAgICBlbHNlCisgICAgCQkgICAgaXdlLnUuYml0cmF0ZS52YWx1ZSA9ICAodG1wUmF0ZS8yKSAqIDEwMDAwMDA7CisKKwkJCWl3ZS51LmJpdHJhdGUuZGlzYWJsZWQgPSAwOworCQkJY3VycmVudF92YWwgPSBJV0VfU1RSRUFNX0FERF9WQUxVRShpbmZvLCBjdXJyZW50X2V2LAorCQkJCWN1cnJlbnRfdmFsLCBlbmRfYnVmLCAmaXdlLAorICAgIAkJCUlXX0VWX1BBUkFNX0xFTik7CisKKyAgICAgICAgCWlmKChjdXJyZW50X3ZhbC1jdXJyZW50X2V2KT5JV19FVl9MQ1BfTEVOKQorICAgICAgICAgICAgCWN1cnJlbnRfZXYgPSBjdXJyZW50X3ZhbDsKKyAgICAgICAgCWVsc2UKKyNpZiBXSVJFTEVTU19FWFQgPj0gMTcKKyAgICAgICAgICAgICAgICByZXR1cm4gLUUyQklHOworI2Vsc2UKKwkJCSAgICBicmVhazsKKyNlbmRpZgorICAgICAgICB9CisKKyNpZmRlZiBJV0VWR0VOSUUKKwkJLy9XUEEgSUUKKwkJaWYgKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLldwYUlFLklFTGVuID4gMCkKKwkJeworCQkJbWVtc2V0KCZpd2UsIDAsIHNpemVvZihpd2UpKTsKKwkJCW1lbXNldCgmY3VzdG9tWzBdLCAwLCBNQVhfQ1VTVE9NX0xFTik7CisJCQltZW1jcHkoY3VzdG9tLCAmKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLldwYUlFLklFWzBdKSwKKwkJCQkJCSAgIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLldwYUlFLklFTGVuKTsKKwkJCWl3ZS5jbWQgPSBJV0VWR0VOSUU7CisJCQlpd2UudS5kYXRhLmxlbmd0aCA9IHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLldwYUlFLklFTGVuOworCQkJY3VycmVudF9ldiA9IElXRV9TVFJFQU1fQUREX1BPSU5UKGluZm8sIGN1cnJlbnRfZXYsIGVuZF9idWYsICZpd2UsIGN1c3RvbSk7CisJCQlpZiAoY3VycmVudF9ldiA9PSBwcmV2aW91c19ldikKKyNpZiBXSVJFTEVTU19FWFQgPj0gMTcKKyAgICAgICAgICAgICAgICByZXR1cm4gLUUyQklHOworI2Vsc2UKKwkJCSAgICBicmVhazsKKyNlbmRpZgorCQl9CisKKwkJLy9XUEEyIElFCisgICAgICAgIGlmIChwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Sc25JRS5JRUxlbiA+IDApCisgICAgICAgIHsKKyAgICAgICAgCW1lbXNldCgmaXdlLCAwLCBzaXplb2YoaXdlKSk7CisJCQltZW1zZXQoJmN1c3RvbVswXSwgMCwgTUFYX0NVU1RPTV9MRU4pOworCQkJbWVtY3B5KGN1c3RvbSwgJihwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Sc25JRS5JRVswXSksCisJCQkJCQkgICBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Sc25JRS5JRUxlbik7CisJCQlpd2UuY21kID0gSVdFVkdFTklFOworCQkJaXdlLnUuZGF0YS5sZW5ndGggPSBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Sc25JRS5JRUxlbjsKKwkJCWN1cnJlbnRfZXYgPSBJV0VfU1RSRUFNX0FERF9QT0lOVChpbmZvLCBjdXJyZW50X2V2LCBlbmRfYnVmLCAmaXdlLCBjdXN0b20pOworCQkJaWYgKGN1cnJlbnRfZXYgPT0gcHJldmlvdXNfZXYpCisjaWYgV0lSRUxFU1NfRVhUID49IDE3CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FMkJJRzsKKyNlbHNlCisJCQkgICAgYnJlYWs7CisjZW5kaWYKKyAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgLy9XUEEgSUUKKwkJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICBpZiAocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uV3BhSUUuSUVMZW4gPiAwKQorICAgICAgICB7CisgICAgCQlOZGlzWmVyb01lbW9yeSgmaXdlLCBzaXplb2YoaXdlKSk7CisJCQltZW1zZXQoJmN1c3RvbVswXSwgMCwgTUFYX0NVU1RPTV9MRU4pOworICAgIAkJaXdlLmNtZCA9IElXRVZDVVNUT007CisgICAgICAgICAgICBpd2UudS5kYXRhLmxlbmd0aCA9IChwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5XcGFJRS5JRUxlbiAqIDIpICsgNzsKKyAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KGN1c3RvbSwgIndwYV9pZT0iLCA3KTsKKyAgICAgICAgICAgIGZvciAoaWR4ID0gMDsgaWR4IDwgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uV3BhSUUuSUVMZW47IGlkeCsrKQorICAgICAgICAgICAgICAgIHNwcmludGYoY3VzdG9tLCAiJXMlMDJ4IiwgY3VzdG9tLCBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5XcGFJRS5JRVtpZHhdKTsKKyAgICAgICAgICAgIHByZXZpb3VzX2V2ID0gY3VycmVudF9ldjsKKyAgICAJCWN1cnJlbnRfZXYgPSBJV0VfU1RSRUFNX0FERF9QT0lOVChpbmZvLCBjdXJyZW50X2V2LCBlbmRfYnVmLCAmaXdlLCAgY3VzdG9tKTsKKyAgICAgICAgICAgIGlmIChjdXJyZW50X2V2ID09IHByZXZpb3VzX2V2KQorI2lmIFdJUkVMRVNTX0VYVCA+PSAxNworICAgICAgICAgICAgICAgIHJldHVybiAtRTJCSUc7CisjZWxzZQorCQkJICAgIGJyZWFrOworI2VuZGlmCisgICAgICAgIH0KKworICAgICAgICAvL1dQQTIgSUUKKyAgICAgICAgaWYgKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlJzbklFLklFTGVuID4gMCkKKyAgICAgICAgeworICAgIAkJTmRpc1plcm9NZW1vcnkoJml3ZSwgc2l6ZW9mKGl3ZSkpOworCQkJbWVtc2V0KCZjdXN0b21bMF0sIDAsIE1BWF9DVVNUT01fTEVOKTsKKyAgICAJCWl3ZS5jbWQgPSBJV0VWQ1VTVE9NOworICAgICAgICAgICAgaXdlLnUuZGF0YS5sZW5ndGggPSAocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uUnNuSUUuSUVMZW4gKiAyKSArIDc7CisgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShjdXN0b20sICJyc25faWU9IiwgNyk7CisJCQlmb3IgKGlkeCA9IDA7IGlkeCA8IHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlJzbklFLklFTGVuOyBpZHgrKykKKyAgICAgICAgICAgICAgICBzcHJpbnRmKGN1c3RvbSwgIiVzJTAyeCIsIGN1c3RvbSwgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uUnNuSUUuSUVbaWR4XSk7CisgICAgICAgICAgICBwcmV2aW91c19ldiA9IGN1cnJlbnRfZXY7CisgICAgCQljdXJyZW50X2V2ID0gSVdFX1NUUkVBTV9BRERfUE9JTlQoaW5mbywgY3VycmVudF9ldiwgZW5kX2J1ZiwgJml3ZSwgIGN1c3RvbSk7CisgICAgICAgICAgICBpZiAoY3VycmVudF9ldiA9PSBwcmV2aW91c19ldikKKyNpZiBXSVJFTEVTU19FWFQgPj0gMTcKKyAgICAgICAgICAgICAgICByZXR1cm4gLUUyQklHOworI2Vsc2UKKwkJCSAgICBicmVhazsKKyNlbmRpZgorICAgICAgICB9CisjZW5kaWYgLy8gSVdFVkdFTklFIC8vCisJfQorCisJZGF0YS0+bGVuZ3RoID0gY3VycmVudF9ldiAtIGV4dHJhOworICAgIHBBZGFwdGVyLT5TdGFDZmcuYlNjYW5SZXFJc0Zyb21XZWJVSSA9IEZBTFNFOworCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SICwoIj09PT5ydF9pb2N0bF9naXdzY2FuLiAlZCglZCkgQlNTIHJldHVybmVkLCBkYXRhLT5sZW5ndGggPSAlZFxuIixpICwgcEFkYXB0ZXItPlNjYW5UYWIuQnNzTnIsIGRhdGEtPmxlbmd0aCkpOworCXJldHVybiAwOworfQorI2VuZGlmCisKK2ludCBydF9pb2N0bF9zaXdlc3NpZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgc3RydWN0IGl3X3BvaW50ICpkYXRhLCBjaGFyICplc3NpZCkKK3sKKwlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gKFBSVE1QX0FEQVBURVIpIGRldi0+cHJpdjsKKworCS8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCisgICAgaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQorICAgIHsKKyAgICAgICAJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOworICAgICAgIAlyZXR1cm4gLUVORVRET1dOOworICAgIH0KKworCWlmIChkYXRhLT5mbGFncykKKwl7CisJCVBDSEFSCXBTc2lkU3RyaW5nID0gTlVMTDsKKworCQkvLyBJbmNsdWRlcyBudWxsIGNoYXJhY3Rlci4KKwkJaWYgKGRhdGEtPmxlbmd0aCA+IChJV19FU1NJRF9NQVhfU0laRSArIDEpKQorCQkJcmV0dXJuIC1FMkJJRzsKKworCQlwU3NpZFN0cmluZyA9IChDSEFSICopIGttYWxsb2MoTUFYX0xFTl9PRl9TU0lEKzEsIE1FTV9BTExPQ19GTEFHKTsKKwkJaWYgKHBTc2lkU3RyaW5nKQorCQl7CisJCQlOZGlzWmVyb01lbW9yeShwU3NpZFN0cmluZywgTUFYX0xFTl9PRl9TU0lEKzEpOworCQkJTmRpc01vdmVNZW1vcnkocFNzaWRTdHJpbmcsIGVzc2lkLCBkYXRhLT5sZW5ndGgpOworCQkJaWYgKFNldF9TU0lEX1Byb2MocEFkYXB0ZXIsIHBTc2lkU3RyaW5nKSA9PSBGQUxTRSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQllbHNlCisJCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJZWxzZQorCXsKKwkJLy8gQU5ZIHNzaWQKKwkJaWYgKFNldF9TU0lEX1Byb2MocEFkYXB0ZXIsICIiKSA9PSBGQUxTRSkKKwkJCXJldHVybiAtRUlOVkFMOworICAgIH0KKwlyZXR1cm4gMDsKK30KKworaW50IHJ0X2lvY3RsX2dpd2Vzc2lkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSBzdHJ1Y3QgaXdfcG9pbnQgKmRhdGEsIGNoYXIgKmVzc2lkKQoreworCVBSVE1QX0FEQVBURVIgCXBBZGFwdGVyID0gTlVMTDsKKwlWSVJUVUFMX0FEQVBURVIgKnBWaXJ0dWFsQWQgPSBOVUxMOworCisJaWYgKGRldi0+cHJpdl9mbGFncyA9PSBJTlRfTUFJTikKKwl7CisJCXBBZGFwdGVyID0gZGV2LT5wcml2OworCX0KKwllbHNlCisJeworCQlwVmlydHVhbEFkID0gZGV2LT5wcml2OworCQlpZiAocFZpcnR1YWxBZCAmJiBwVmlydHVhbEFkLT5SdG1wRGV2KQorCQkJcEFkYXB0ZXIgPSBwVmlydHVhbEFkLT5SdG1wRGV2LT5wcml2OworCX0KKworCWlmIChwQWRhcHRlciA9PSBOVUxMKQorCXsKKwkJLyogaWYgMXN0IG9wZW4gZmFpbCwgcEFkIHdpbGwgYmUgZnJlZTsKKwkJICAgU28gdGhlIG5ldF9kZXYtPnByaXYgd2lsbCBiZSBOVUxMIGluIDJyZCBvcGVuICovCisJCXJldHVybiAtRU5FVERPV047CisJfQorCisJZGF0YS0+ZmxhZ3MgPSAxOworICAgIGlmIChNT05JVE9SX09OKHBBZGFwdGVyKSkKKyAgICB7CisgICAgICAgIGRhdGEtPmxlbmd0aCAgPSAwOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKwlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZGFwdGVyLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCkpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSAsKCJNZWRpYVN0YXRlIGlzIGNvbm5lY3RlZFxuIikpOworCQlkYXRhLT5sZW5ndGggPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLlNzaWRMZW47CisJCW1lbWNweShlc3NpZCwgcEFkYXB0ZXItPkNvbW1vbkNmZy5Tc2lkLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLlNzaWRMZW4pOworCX0KKyNpZmRlZiBSVDI4NzAKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgLy8gQWRkIGZvciBSVDI4NzAKKyAgICBlbHNlIGlmIChwQWRhcHRlci0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCAhPSBXUEFfU1VQUExJQ0FOVF9ESVNBQkxFKQorICAgIHsKKyAgICAgICAgZGF0YS0+bGVuZ3RoID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5Tc2lkTGVuOworCQltZW1jcHkoZXNzaWQsIHBBZGFwdGVyLT5Db21tb25DZmcuU3NpZCwgcEFkYXB0ZXItPkNvbW1vbkNmZy5Tc2lkTGVuKTsKKwl9CisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworI2VuZGlmIC8vIFJUMjg3MCAvLworCWVsc2UKKwl7Ly90aGUgQU5ZIHNzaWQgd2FzIHNwZWNpZmllZAorCQlkYXRhLT5sZW5ndGggID0gMDsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UgLCgiTWVkaWFTdGF0ZSBpcyBub3QgY29ubmVjdGVkLCBlc3NcbiIpKTsKKwl9CisKKwlyZXR1cm4gMDsKKworfQorCitpbnQgcnRfaW9jdGxfc2l3bmlja24oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJIHN0cnVjdCBpd19wb2ludCAqZGF0YSwgY2hhciAqbmlja25hbWUpCit7CisJUFJUTVBfQURBUFRFUiBwQWRhcHRlciA9IChQUlRNUF9BREFQVEVSKSBkZXYtPnByaXY7CisKKyAgICAvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgorICAgIGlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKKyAgICB7CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKyAgICAgICAgcmV0dXJuIC1FTkVURE9XTjsKKyAgICB9CisKKwlpZiAoZGF0YS0+bGVuZ3RoID4gSVdfRVNTSURfTUFYX1NJWkUpCisJCXJldHVybiAtRUlOVkFMOworCisJbWVtc2V0KHBBZGFwdGVyLT5uaWNrbmFtZSwgMCwgSVdfRVNTSURfTUFYX1NJWkUgKyAxKTsKKwltZW1jcHkocEFkYXB0ZXItPm5pY2tuYW1lLCBuaWNrbmFtZSwgZGF0YS0+bGVuZ3RoKTsKKworCisJcmV0dXJuIDA7Cit9CisKK2ludCBydF9pb2N0bF9naXduaWNrbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgc3RydWN0IGl3X3BvaW50ICpkYXRhLCBjaGFyICpuaWNrbmFtZSkKK3sKKwlQUlRNUF9BREFQVEVSIAlwQWRhcHRlciA9IE5VTEw7CisJVklSVFVBTF9BREFQVEVSICpwVmlydHVhbEFkID0gTlVMTDsKKworCWlmIChkZXYtPnByaXZfZmxhZ3MgPT0gSU5UX01BSU4pCisJeworCQlwQWRhcHRlciA9IGRldi0+cHJpdjsKKwl9CisJZWxzZQorCXsKKwkJcFZpcnR1YWxBZCA9IGRldi0+cHJpdjsKKwkJaWYgKHBWaXJ0dWFsQWQgJiYgcFZpcnR1YWxBZC0+UnRtcERldikKKwkJCXBBZGFwdGVyID0gcFZpcnR1YWxBZC0+UnRtcERldi0+cHJpdjsKKwl9CisKKwlpZiAocEFkYXB0ZXIgPT0gTlVMTCkKKwl7CisJCS8qIGlmIDFzdCBvcGVuIGZhaWwsIHBBZCB3aWxsIGJlIGZyZWU7CisJCSAgIFNvIHRoZSBuZXRfZGV2LT5wcml2IHdpbGwgYmUgTlVMTCBpbiAycmQgb3BlbiAqLworCQlyZXR1cm4gLUVORVRET1dOOworCX0KKworCWlmIChkYXRhLT5sZW5ndGggPiBzdHJsZW4ocEFkYXB0ZXItPm5pY2tuYW1lKSArIDEpCisJCWRhdGEtPmxlbmd0aCA9IHN0cmxlbihwQWRhcHRlci0+bmlja25hbWUpICsgMTsKKwlpZiAoZGF0YS0+bGVuZ3RoID4gMCkgeworCQltZW1jcHkobmlja25hbWUsIHBBZGFwdGVyLT5uaWNrbmFtZSwgZGF0YS0+bGVuZ3RoLTEpOworCQluaWNrbmFtZVtkYXRhLT5sZW5ndGgtMV0gPSAnXDAnOworCX0KKwlyZXR1cm4gMDsKK30KKworaW50IHJ0X2lvY3RsX3Npd3J0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJICAgICAgIHN0cnVjdCBpd19wYXJhbSAqcnRzLCBjaGFyICpleHRyYSkKK3sKKwlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gKFBSVE1QX0FEQVBURVIpIGRldi0+cHJpdjsKKwl1MTYgdmFsOworCisgICAgLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KKyAgICBpZighUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCisgICAgeworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisgICAgICAgIHJldHVybiAtRU5FVERPV047CisgICAgfQorCisJaWYgKHJ0cy0+ZGlzYWJsZWQpCisJCXZhbCA9IE1BWF9SVFNfVEhSRVNIT0xEOworCWVsc2UgaWYgKHJ0cy0+dmFsdWUgPCAwIHx8IHJ0cy0+dmFsdWUgPiBNQVhfUlRTX1RIUkVTSE9MRCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJZWxzZSBpZiAocnRzLT52YWx1ZSA9PSAwKQorCSAgICB2YWwgPSBNQVhfUlRTX1RIUkVTSE9MRDsKKwllbHNlCisJCXZhbCA9IHJ0cy0+dmFsdWU7CisKKwlpZiAodmFsICE9IHBBZGFwdGVyLT5Db21tb25DZmcuUnRzVGhyZXNob2xkKQorCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLlJ0c1RocmVzaG9sZCA9IHZhbDsKKworCXJldHVybiAwOworfQorCitpbnQgcnRfaW9jdGxfZ2l3cnRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCSAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgICAgICAgc3RydWN0IGl3X3BhcmFtICpydHMsIGNoYXIgKmV4dHJhKQoreworCVBSVE1QX0FEQVBURVIgCXBBZGFwdGVyID0gTlVMTDsKKwlWSVJUVUFMX0FEQVBURVIgKnBWaXJ0dWFsQWQgPSBOVUxMOworCisJaWYgKGRldi0+cHJpdl9mbGFncyA9PSBJTlRfTUFJTikKKwl7CisJCXBBZGFwdGVyID0gZGV2LT5wcml2OworCX0KKwllbHNlCisJeworCQlwVmlydHVhbEFkID0gZGV2LT5wcml2OworCQlpZiAocFZpcnR1YWxBZCAmJiBwVmlydHVhbEFkLT5SdG1wRGV2KQorCQkJcEFkYXB0ZXIgPSBwVmlydHVhbEFkLT5SdG1wRGV2LT5wcml2OworCX0KKworCWlmIChwQWRhcHRlciA9PSBOVUxMKQorCXsKKwkJLyogaWYgMXN0IG9wZW4gZmFpbCwgcEFkIHdpbGwgYmUgZnJlZTsKKwkJICAgU28gdGhlIG5ldF9kZXYtPnByaXYgd2lsbCBiZSBOVUxMIGluIDJyZCBvcGVuICovCisJCXJldHVybiAtRU5FVERPV047CisJfQorCisJLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KKwlpZighUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCisJeworICAJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKyAgICAJcmV0dXJuIC1FTkVURE9XTjsKKwl9CisKKwlydHMtPnZhbHVlID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5SdHNUaHJlc2hvbGQ7CisJcnRzLT5kaXNhYmxlZCA9IChydHMtPnZhbHVlID09IE1BWF9SVFNfVEhSRVNIT0xEKTsKKwlydHMtPmZpeGVkID0gMTsKKworCXJldHVybiAwOworfQorCitpbnQgcnRfaW9jdGxfc2l3ZnJhZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCXN0cnVjdCBpd19wYXJhbSAqZnJhZywgY2hhciAqZXh0cmEpCit7CisJUFJUTVBfQURBUFRFUiBwQWRhcHRlciA9IChQUlRNUF9BREFQVEVSKSBkZXYtPnByaXY7CisJdTE2IHZhbDsKKworCS8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCisgICAgCWlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKKyAgICAJeworICAgICAgCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisgICAgICAgIAlyZXR1cm4gLUVORVRET1dOOworICAgIAl9CisKKwlpZiAoZnJhZy0+ZGlzYWJsZWQpCisJCXZhbCA9IE1BWF9GUkFHX1RIUkVTSE9MRDsKKwllbHNlIGlmIChmcmFnLT52YWx1ZSA+PSBNSU5fRlJBR19USFJFU0hPTEQgfHwgZnJhZy0+dmFsdWUgPD0gTUFYX0ZSQUdfVEhSRVNIT0xEKQorICAgICAgICB2YWwgPSBfX2NwdV90b19sZTE2KGZyYWctPnZhbHVlICYgfjB4MSk7IC8qIGV2ZW4gbnVtYmVycyBvbmx5ICovCisJZWxzZSBpZiAoZnJhZy0+dmFsdWUgPT0gMCkKKwkgICAgdmFsID0gTUFYX0ZSQUdfVEhSRVNIT0xEOworCWVsc2UKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlwQWRhcHRlci0+Q29tbW9uQ2ZnLkZyYWdtZW50VGhyZXNob2xkID0gdmFsOworCXJldHVybiAwOworfQorCitpbnQgcnRfaW9jdGxfZ2l3ZnJhZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCXN0cnVjdCBpd19wYXJhbSAqZnJhZywgY2hhciAqZXh0cmEpCit7CisJUFJUTVBfQURBUFRFUiAJcEFkYXB0ZXIgPSBOVUxMOworCVZJUlRVQUxfQURBUFRFUiAqcFZpcnR1YWxBZCA9IE5VTEw7CisKKwlpZiAoZGV2LT5wcml2X2ZsYWdzID09IElOVF9NQUlOKQorCXsKKwkJcEFkYXB0ZXIgPSBkZXYtPnByaXY7CisJfQorCWVsc2UKKwl7CisJCXBWaXJ0dWFsQWQgPSBkZXYtPnByaXY7CisJCWlmIChwVmlydHVhbEFkICYmIHBWaXJ0dWFsQWQtPlJ0bXBEZXYpCisJCQlwQWRhcHRlciA9IHBWaXJ0dWFsQWQtPlJ0bXBEZXYtPnByaXY7CisJfQorCisJaWYgKHBBZGFwdGVyID09IE5VTEwpCisJeworCQkvKiBpZiAxc3Qgb3BlbiBmYWlsLCBwQWQgd2lsbCBiZSBmcmVlOworCQkgICBTbyB0aGUgbmV0X2Rldi0+cHJpdiB3aWxsIGJlIE5VTEwgaW4gMnJkIG9wZW4gKi8KKwkJcmV0dXJuIC1FTkVURE9XTjsKKwl9CisKKwkvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgorCWlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKKwl7CisgIAkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOworICAgIAlyZXR1cm4gLUVORVRET1dOOworCX0KKworCWZyYWctPnZhbHVlID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5GcmFnbWVudFRocmVzaG9sZDsKKwlmcmFnLT5kaXNhYmxlZCA9IChmcmFnLT52YWx1ZSA9PSBNQVhfRlJBR19USFJFU0hPTEQpOworCWZyYWctPmZpeGVkID0gMTsKKworCXJldHVybiAwOworfQorCisjZGVmaW5lIE1BWF9XRVBfS0VZX1NJWkUgMTMKKyNkZWZpbmUgTUlOX1dFUF9LRVlfU0laRSA1CitpbnQgcnRfaW9jdGxfc2l3ZW5jb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgIHN0cnVjdCBpd19wb2ludCAqZXJxLCBjaGFyICpleHRyYSkKK3sKKwlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gKFBSVE1QX0FEQVBURVIpIGRldi0+cHJpdjsKKworCS8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCisgICAgCWlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKKyAgICAJeworICAgICAgCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisgICAgICAgIAlyZXR1cm4gLUVORVRET1dOOworICAgIAl9CisKKwlpZiAoKGVycS0+bGVuZ3RoID09IDApICYmCisgICAgICAgIChlcnEtPmZsYWdzICYgSVdfRU5DT0RFX0RJU0FCTEVEKSkKKwl7CisJCXBBZGFwdGVyLT5TdGFDZmcuUGFpckNpcGhlciA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKKwkJcEFkYXB0ZXItPlN0YUNmZy5Hcm91cENpcGhlciA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKKwkJcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXMgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuT3JpZ1dlcFN0YXR1cyA9IHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzOworICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlT3BlbjsKKyAgICAgICAgZ290byBkb25lOworCX0KKwllbHNlIGlmICgoZXJxLT5sZW5ndGggPT0gMCkgJiYKKyAgICAgICAgICAgICAoZXJxLT5mbGFncyAmIElXX0VOQ09ERV9SRVNUUklDVEVEIHx8IGVycS0+ZmxhZ3MgJiBJV19FTkNPREVfT1BFTikpCisJeworCSAgICAvL3BBZGFwdGVyLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRDsKKwkJU1RBX1BPUlRfU0VDVVJFRChwQWRhcHRlcik7CisJCXBBZGFwdGVyLT5TdGFDZmcuUGFpckNpcGhlciA9IE5kaXM4MDJfMTFXRVBFbmFibGVkOworCQlwQWRhcHRlci0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID0gTmRpczgwMl8xMVdFUEVuYWJsZWQ7CisJCXBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzID0gTmRpczgwMl8xMVdFUEVuYWJsZWQ7CisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuT3JpZ1dlcFN0YXR1cyA9IHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzOworCQlpZiAoZXJxLT5mbGFncyAmIElXX0VOQ09ERV9SRVNUUklDVEVEKQorCQkJcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVNoYXJlZDsKKyAgICAJZWxzZQorCQkJcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZU9wZW47CisgICAgICAgIGdvdG8gZG9uZTsKKwl9CisKKyAgICBpZiAoZXJxLT5sZW5ndGggPiAwKQorCXsKKwkJaW50IGtleUlkeCA9IChlcnEtPmZsYWdzICYgSVdfRU5DT0RFX0lOREVYKSAtIDE7CisJCS8qIENoZWNrIHRoZSBzaXplIG9mIHRoZSBrZXkgKi8KKwkJaWYgKGVycS0+bGVuZ3RoID4gTUFYX1dFUF9LRVlfU0laRSkgeworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJLyogQ2hlY2sga2V5IGluZGV4ICovCisJCWlmICgoa2V5SWR4IDwgMCkgfHwgKGtleUlkeCA+PSBOUl9XRVBfS0VZUykpCisgICAgICAgIHsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoIj09PnJ0X2lvY3RsX3Npd2VuY29kZTo6V3Jvbmcga2V5SWR4PSVkISBVc2luZyBkZWZhdWx0IGtleSBpbnN0ZWFkICglZClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5SWR4LCBwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCkpOworCisgICAgICAgICAgICAvL1VzaW5nIGRlZmF1bHQga2V5CisJCQlrZXlJZHggPSBwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZDsKKyAgICAgICAgfQorCisgICAgICAgIE5kaXNaZXJvTWVtb3J5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5LZXksICAxNik7CisKKwkJaWYgKGVycS0+bGVuZ3RoID09IE1BWF9XRVBfS0VZX1NJWkUpCisgICAgICAgIHsKKwkJCXBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5LZXlMZW4gPSBNQVhfV0VQX0tFWV9TSVpFOworICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLkNpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7CisJCX0KKwkJZWxzZSBpZiAoZXJxLT5sZW5ndGggPT0gTUlOX1dFUF9LRVlfU0laRSkKKyAgICAgICAgeworICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLktleUxlbiA9IE1JTl9XRVBfS0VZX1NJWkU7CisgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OworCQl9CisJCWVsc2UKKwkJCS8qIERpc2FibGUgdGhlIGtleSAqLworCQkJcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLktleUxlbiA9IDA7CisKKwkJLyogQ2hlY2sgaWYgdGhlIGtleSBpcyBub3QgbWFya2VkIGFzIGludmFsaWQgKi8KKwkJaWYoIShlcnEtPmZsYWdzICYgSVdfRU5DT0RFX05PS0VZKSkgeworCQkJLyogQ29weSB0aGUga2V5IGluIHRoZSBkcml2ZXIgKi8KKwkJCU5kaXNNb3ZlTWVtb3J5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5LZXksIGV4dHJhLCBlcnEtPmxlbmd0aCk7CisgICAgICAgIH0KKwl9CisgICAgZWxzZQorCQkJeworCQkvKiBEbyB3ZSB3YW50IHRvIGp1c3Qgc2V0IHRoZSB0cmFuc21pdCBrZXkgaW5kZXggPyAqLworCQlpbnQgaW5kZXggPSAoZXJxLT5mbGFncyAmIElXX0VOQ09ERV9JTkRFWCkgLSAxOworCQlpZiAoKGluZGV4ID49IDApICYmIChpbmRleCA8IDQpKQorICAgICAgICB7CisJCQlwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCA9IGluZGV4OworICAgICAgICAgICAgfQorICAgICAgICBlbHNlCisJCQkvKiBEb24ndCBjb21wbGFpbiBpZiBvbmx5IGNoYW5nZSB0aGUgbW9kZSAqLworCQkJaWYoIWVycS0+ZmxhZ3MgJiBJV19FTkNPREVfTU9ERSkgeworCQkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorCitkb25lOgorICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoIj09PnJ0X2lvY3RsX3Npd2VuY29kZTo6ZXJxLT5mbGFncz0leFxuIixlcnEtPmZsYWdzKSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UgLCgiPT0+cnRfaW9jdGxfc2l3ZW5jb2RlOjpBdXRoTW9kZT0leFxuIixwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlKSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UgLCgiPT0+cnRfaW9jdGxfc2l3ZW5jb2RlOjpEZWZhdWx0S2V5SWQ9JXgsIEtleUxlbiA9ICVkXG4iLHBBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkICwgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uS2V5TGVuKSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UgLCgiPT0+cnRfaW9jdGxfc2l3ZW5jb2RlOjpXZXBTdGF0dXM9JXhcbiIscEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXMpKTsKKwlyZXR1cm4gMDsKK30KKworaW50CitydF9pb2N0bF9naXdlbmNvZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgc3RydWN0IGl3X3BvaW50ICplcnEsIGNoYXIgKmtleSkKK3sKKwlpbnQga2lkOworCVBSVE1QX0FEQVBURVIgCXBBZGFwdGVyID0gTlVMTDsKKwlWSVJUVUFMX0FEQVBURVIgKnBWaXJ0dWFsQWQgPSBOVUxMOworCisJaWYgKGRldi0+cHJpdl9mbGFncyA9PSBJTlRfTUFJTikKKwl7CisJCXBBZGFwdGVyID0gZGV2LT5wcml2OworCX0KKwllbHNlCisJeworCQlwVmlydHVhbEFkID0gZGV2LT5wcml2OworCQlpZiAocFZpcnR1YWxBZCAmJiBwVmlydHVhbEFkLT5SdG1wRGV2KQorCQkJcEFkYXB0ZXIgPSBwVmlydHVhbEFkLT5SdG1wRGV2LT5wcml2OworCX0KKworCWlmIChwQWRhcHRlciA9PSBOVUxMKQorCXsKKwkJLyogaWYgMXN0IG9wZW4gZmFpbCwgcEFkIHdpbGwgYmUgZnJlZTsKKwkJICAgU28gdGhlIG5ldF9kZXYtPnByaXYgd2lsbCBiZSBOVUxMIGluIDJyZCBvcGVuICovCisJCXJldHVybiAtRU5FVERPV047CisJfQorCisJLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KKwlpZighUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCisJeworICAJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKyAgICAJcmV0dXJuIC1FTkVURE9XTjsKKwl9CisKKwlraWQgPSBlcnEtPmZsYWdzICYgSVdfRU5DT0RFX0lOREVYOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT5ydF9pb2N0bF9naXdlbmNvZGUgJWRcbiIsIGVycS0+ZmxhZ3MgJiBJV19FTkNPREVfSU5ERVgpKTsKKworCWlmIChwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExV0VQRGlzYWJsZWQpCisJeworCQllcnEtPmxlbmd0aCA9IDA7CisJCWVycS0+ZmxhZ3MgPSBJV19FTkNPREVfRElTQUJMRUQ7CisJfQorCWVsc2UgaWYgKChraWQgPiAwKSAmJiAoa2lkIDw9NCkpCisJeworCQkvLyBjb3B5IHdlcCBrZXkKKwkJZXJxLT5mbGFncyA9IGtpZCA7CQkJLyogTkI6IGJhc2UgMSAqLworCQlpZiAoZXJxLT5sZW5ndGggPiBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tpZC0xXS5LZXlMZW4pCisJCQllcnEtPmxlbmd0aCA9IHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2lkLTFdLktleUxlbjsKKwkJbWVtY3B5KGtleSwgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtraWQtMV0uS2V5LCBlcnEtPmxlbmd0aCk7CisJCS8vaWYgKChraWQgPT0gcEFkYXB0ZXItPlBvcnRDZmcuRGVmYXVsdEtleUlkKSkKKwkJLy9lcnEtPmZsYWdzIHw9IElXX0VOQ09ERV9FTkFCTEVEOwkvKiBYWFggKi8KKwkJaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlU2hhcmVkKQorCQkJZXJxLT5mbGFncyB8PSBJV19FTkNPREVfUkVTVFJJQ1RFRDsJCS8qIFhYWCAqLworCQllbHNlCisJCQllcnEtPmZsYWdzIHw9IElXX0VOQ09ERV9PUEVOOwkJLyogWFhYICovCisKKwl9CisJZWxzZSBpZiAoa2lkID09IDApCisJeworCQlpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVTaGFyZWQpCisJCQllcnEtPmZsYWdzIHw9IElXX0VOQ09ERV9SRVNUUklDVEVEOwkJLyogWFhYICovCisJCWVsc2UKKwkJCWVycS0+ZmxhZ3MgfD0gSVdfRU5DT0RFX09QRU47CQkvKiBYWFggKi8KKwkJZXJxLT5sZW5ndGggPSBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW3BBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5LZXlMZW47CisJCW1lbWNweShrZXksIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWRdLktleSwgZXJxLT5sZW5ndGgpOworCQkvLyBjb3B5IGRlZmF1bHQga2V5IElECisJCWlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVNoYXJlZCkKKwkJCWVycS0+ZmxhZ3MgfD0gSVdfRU5DT0RFX1JFU1RSSUNURUQ7CQkvKiBYWFggKi8KKwkJZWxzZQorCQkJZXJxLT5mbGFncyB8PSBJV19FTkNPREVfT1BFTjsJCS8qIFhYWCAqLworCQllcnEtPmZsYWdzID0gcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWQgKyAxOwkJCS8qIE5COiBiYXNlIDEgKi8KKwkJZXJxLT5mbGFncyB8PSBJV19FTkNPREVfRU5BQkxFRDsJLyogWFhYICovCisJfQorCisJcmV0dXJuIDA7CisKK30KKworc3RhdGljIGludAorcnRfaW9jdGxfc2V0cGFyYW0oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSB2b2lkICp3LCBjaGFyICpleHRyYSkKK3sKKyAgICBWSVJUVUFMX0FEQVBURVIJKnBWaXJ0dWFsQWQgPSBOVUxMOworCVBSVE1QX0FEQVBURVIgcEFkYXB0ZXI7CisJUE9TX0NPT0tJRSBwT2JqOworCWNoYXIgKnRoaXNfY2hhciA9IGV4dHJhOworCWNoYXIgKnZhbHVlOworCWludCAgU3RhdHVzPTA7CisKKwlpZiAoZGV2LT5wcml2X2ZsYWdzID09IElOVF9NQUlOKQorCXsKKwkJcEFkYXB0ZXIgPSBkZXYtPnByaXY7CisJfQorCWVsc2UKKwl7CisJCXBWaXJ0dWFsQWQgPSBkZXYtPnByaXY7CisJCXBBZGFwdGVyID0gcFZpcnR1YWxBZC0+UnRtcERldi0+cHJpdjsKKwl9CisJcE9iaiA9IChQT1NfQ09PS0lFKSBwQWRhcHRlci0+T1NfQ29va2llOworCisJaWYgKHBBZGFwdGVyID09IE5VTEwpCisJeworCQkvKiBpZiAxc3Qgb3BlbiBmYWlsLCBwQWQgd2lsbCBiZSBmcmVlOworCQkgICBTbyB0aGUgbmV0X2Rldi0+cHJpdiB3aWxsIGJlIE5VTEwgaW4gMnJkIG9wZW4gKi8KKwkJcmV0dXJuIC1FTkVURE9XTjsKKwl9CisKKwl7CisJCXBPYmotPmlvY3RsX2lmX3R5cGUgPSBJTlRfTUFJTjsKKyAgICAgICAgcE9iai0+aW9jdGxfaWYgPSBNQUlOX01CU1NJRDsKKwl9CisKKwkvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgorICAgIAlpZighUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCisgICAgCXsKKyAgICAgIAkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOworCQkJcmV0dXJuIC1FTkVURE9XTjsKKyAgICAJfQorCisJaWYgKCEqdGhpc19jaGFyKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICgodmFsdWUgPSBydHN0cmNocih0aGlzX2NoYXIsICc9JykpICE9IE5VTEwpCisJICAgICp2YWx1ZSsrID0gMDsKKworCWlmICghdmFsdWUpCisJICAgIHJldHVybiAtRUlOVkFMOworCisJLy8gcmVqZWN0IHNldHRpbmcgbm90aGluZyBiZXNpZGVzIEFOWSBzc2lkKHNzaWRMZW49MCkKKyAgICBpZiAoISp2YWx1ZSAmJiAoc3RyY21wKHRoaXNfY2hhciwgIlNTSUQiKSAhPSAwKSkKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisKKwlmb3IgKFBSVE1QX1BSSVZBVEVfU0VUX1BST0MgPSBSVE1QX1BSSVZBVEVfU1VQUE9SVF9QUk9DOyBQUlRNUF9QUklWQVRFX1NFVF9QUk9DLT5uYW1lOyBQUlRNUF9QUklWQVRFX1NFVF9QUk9DKyspCisJeworCSAgICBpZiAoc3RyY21wKHRoaXNfY2hhciwgUFJUTVBfUFJJVkFURV9TRVRfUFJPQy0+bmFtZSkgPT0gMCkKKwkgICAgeworCSAgICAgICAgaWYoIVBSVE1QX1BSSVZBVEVfU0VUX1BST0MtPnNldF9wcm9jKHBBZGFwdGVyLCB2YWx1ZSkpCisJICAgICAgICB7CS8vRkFMU0U6U2V0IHByaXZhdGUgZmFpbGVkIHRoZW4gcmV0dXJuIEludmFsaWQgYXJndW1lbnQKKwkJCSAgICBTdGF0dXMgPSAtRUlOVkFMOworCSAgICAgICAgfQorCQkgICAgYnJlYWs7CS8vRXhpdCBmb3IgbG9vcC4KKwkgICAgfQorCX0KKworCWlmKFBSVE1QX1BSSVZBVEVfU0VUX1BST0MtPm5hbWUgPT0gTlVMTCkKKwl7ICAvL05vdCBmb3VuZCBhcmd1bWVudAorCSAgICBTdGF0dXMgPSAtRUlOVkFMOworCSAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT0+cnRfaW9jdGxfc2V0cGFyYW06OiAoaXdwcml2KSBOb3QgU3VwcG9ydCBTZXQgQ29tbWFuZCBbJXM9JXNdXG4iLCB0aGlzX2NoYXIsIHZhbHVlKSk7CisJfQorCisgICAgcmV0dXJuIFN0YXR1czsKK30KKworCitzdGF0aWMgaW50CitydF9wcml2YXRlX2dldF9zdGF0aXN0aWNzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCXN0cnVjdCBpd19wb2ludCAqd3JxLCBjaGFyICpleHRyYSkKK3sKKwlJTlQJCQkJU3RhdHVzID0gMDsKKyAgICBQUlRNUF9BREFQVEVSICAgcEFkID0gKFBSVE1QX0FEQVBURVIpIGRldi0+cHJpdjsKKworICAgIGlmIChleHRyYSA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgd3JxLT5sZW5ndGggPSAwOworICAgICAgICByZXR1cm4gLUVJTzsKKyAgICB9CisKKyAgICBtZW1zZXQoZXh0cmEsIDB4MDAsIElXX1BSSVZfU0laRV9NQVNLKTsKKyAgICBzcHJpbnRmKGV4dHJhLCAiXG5cbiIpOworCisjaWZkZWYgUkFMSU5LX0FURQorCWlmIChBVEVfT04ocEFkKSkKKwl7CisJICAgIHNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlR4IHN1Y2Nlc3MgICAgICAgICAgICAgICAgICAgICAgPSAlbGRcbiIsIChVTE9ORylwQWQtPmF0ZS5UeERvbmVDb3VudCk7CisJICAgIC8vc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiVHggc3VjY2VzcyB3aXRob3V0IHJldHJ5ICAgICAgICA9ICVsZFxuIiwgKFVMT05HKXBBZC0+YXRlLlR4RG9uZUNvdW50KTsKKwl9CisJZWxzZQorI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKwl7CisgICAgc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiVHggc3VjY2VzcyAgICAgICAgICAgICAgICAgICAgICA9ICVsZFxuIiwgKFVMT05HKXBBZC0+V2xhbkNvdW50ZXJzLlRyYW5zbWl0dGVkRnJhZ21lbnRDb3VudC5RdWFkUGFydCk7CisgICAgc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiVHggc3VjY2VzcyB3aXRob3V0IHJldHJ5ICAgICAgICA9ICVsZFxuIiwgKFVMT05HKXBBZC0+V2xhbkNvdW50ZXJzLlRyYW5zbWl0dGVkRnJhZ21lbnRDb3VudC5RdWFkUGFydCAtIChVTE9ORylwQWQtPldsYW5Db3VudGVycy5SZXRyeUNvdW50LlF1YWRQYXJ0KTsKKwl9CisgICAgc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiVHggc3VjY2VzcyBhZnRlciByZXRyeSAgICAgICAgICA9ICVsZFxuIiwgKFVMT05HKXBBZC0+V2xhbkNvdW50ZXJzLlJldHJ5Q291bnQuUXVhZFBhcnQpOworICAgIHNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlR4IGZhaWwgdG8gUmN2IEFDSyBhZnRlciByZXRyeSAgPSAlbGRcbiIsIChVTE9ORylwQWQtPldsYW5Db3VudGVycy5GYWlsZWRDb3VudC5RdWFkUGFydCk7CisgICAgc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiUlRTIFN1Y2Nlc3MgUmN2IENUUyAgICAgICAgICAgICA9ICVsZFxuIiwgKFVMT05HKXBBZC0+V2xhbkNvdW50ZXJzLlJUU1N1Y2Nlc3NDb3VudC5RdWFkUGFydCk7CisgICAgc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiUlRTIEZhaWwgUmN2IENUUyAgICAgICAgICAgICAgICA9ICVsZFxuIiwgKFVMT05HKXBBZC0+V2xhbkNvdW50ZXJzLlJUU0ZhaWx1cmVDb3VudC5RdWFkUGFydCk7CisKKyAgICBzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJSeCBzdWNjZXNzICAgICAgICAgICAgICAgICAgICAgID0gJWxkXG4iLCAoVUxPTkcpcEFkLT5XbGFuQ291bnRlcnMuUmVjZWl2ZWRGcmFnbWVudENvdW50LlF1YWRQYXJ0KTsKKyAgICBzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJSeCB3aXRoIENSQyAgICAgICAgICAgICAgICAgICAgID0gJWxkXG4iLCAoVUxPTkcpcEFkLT5XbGFuQ291bnRlcnMuRkNTRXJyb3JDb3VudC5RdWFkUGFydCk7CisgICAgc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiUnggZHJvcCBkdWUgdG8gb3V0IG9mIHJlc291cmNlICA9ICVsZFxuIiwgKFVMT05HKXBBZC0+Q291bnRlcnM4MDIzLlJ4Tm9CdWZmZXIpOworICAgIHNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlJ4IGR1cGxpY2F0ZSBmcmFtZSAgICAgICAgICAgICAgPSAlbGRcbiIsIChVTE9ORylwQWQtPldsYW5Db3VudGVycy5GcmFtZUR1cGxpY2F0ZUNvdW50LlF1YWRQYXJ0KTsKKworICAgIHNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIkZhbHNlIENDQSAob25lIHNlY29uZCkgICAgICAgICAgPSAlbGRcbiIsIChVTE9ORylwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY0ZhbHNlQ0NBQ250KTsKKyNpZmRlZiBSQUxJTktfQVRFCisJaWYgKEFURV9PTihwQWQpKQorCXsKKwkJaWYgKHBBZC0+YXRlLlJ4QW50ZW5uYVNlbCA9PSAwKQorCQl7CisgICAgCQlzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJSU1NJLUEgICAgICAgICAgICAgICAgICAgICAgICAgID0gJWxkXG4iLCAoTE9ORykocEFkLT5hdGUuTGFzdFJzc2kwIC0gcEFkLT5CYnBSc3NpVG9EYm1EZWx0YSkpOworCQkJc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiUlNTSS1CIChpZiBhdmFpbGFibGUpICAgICAgICAgICA9ICVsZFxuIiwgKExPTkcpKHBBZC0+YXRlLkxhc3RSc3NpMSAtIHBBZC0+QmJwUnNzaVRvRGJtRGVsdGEpKTsKKwkJCXNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlJTU0ktQyAoaWYgYXZhaWxhYmxlKSAgICAgICAgICAgPSAlbGRcblxuIiwgKExPTkcpKHBBZC0+YXRlLkxhc3RSc3NpMiAtIHBBZC0+QmJwUnNzaVRvRGJtRGVsdGEpKTsKKwkJfQorCQllbHNlCisJCXsKKyAgICAJCXNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlJTU0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAlbGRcbiIsIChMT05HKShwQWQtPmF0ZS5MYXN0UnNzaTAgLSBwQWQtPkJicFJzc2lUb0RibURlbHRhKSk7CisJCX0KKwl9CisJZWxzZQorI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKwl7CisgICAgCXNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlJTU0ktQSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAlbGRcbiIsIChMT05HKShwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMCAtIHBBZC0+QmJwUnNzaVRvRGJtRGVsdGEpKTsKKyAgICAgICAgc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiUlNTSS1CIChpZiBhdmFpbGFibGUpICAgICAgICAgICA9ICVsZFxuIiwgKExPTkcpKHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kxIC0gcEFkLT5CYnBSc3NpVG9EYm1EZWx0YSkpOworICAgICAgICBzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJSU1NJLUMgKGlmIGF2YWlsYWJsZSkgICAgICAgICAgID0gJWxkXG5cbiIsIChMT05HKShwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMiAtIHBBZC0+QmJwUnNzaVRvRGJtRGVsdGEpKTsKKwl9CisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgIHNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIldwYVN1cHBsaWNhbnRVUCAgICAgICAgICAgICAgICAgPSAlZFxuXG4iLCBwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVApOworI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKworCisgICAgd3JxLT5sZW5ndGggPSBzdHJsZW4oZXh0cmEpICsgMTsgLy8gMTogc2l6ZSBvZiAnXDAnCisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPD09IHJ0X3ByaXZhdGVfZ2V0X3N0YXRpc3RpY3MsIHdycS0+bGVuZ3RoID0gJWRcbiIsIHdycS0+bGVuZ3RoKSk7CisKKyAgICByZXR1cm4gU3RhdHVzOworfQorCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCit2b2lkCWdldEJhSW5mbygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlwT3V0QnVmKQoreworCUlOVCBpLCBqOworCUJBX09SSV9FTlRSWSAqcE9yaUJBRW50cnk7CisJQkFfUkVDX0VOVFJZICpwUmVjQkFFbnRyeTsKKworCWZvciAoaT0wOyBpPE1BWF9MRU5fT0ZfTUFDX1RBQkxFOyBpKyspCisJeworCQlQTUFDX1RBQkxFX0VOVFJZIHBFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W2ldOworCQlpZiAoKChwRW50cnktPlZhbGlkQXNDTEkgfHwgcEVudHJ5LT5WYWxpZEFzQXBDbGkpICYmIChwRW50cnktPlNzdCA9PSBTU1RfQVNTT0MpKQorCQkJfHwgKHBFbnRyeS0+VmFsaWRBc1dEUykgfHwgKHBFbnRyeS0+VmFsaWRBc01lc2gpKQorCQl7CisJCQlzcHJpbnRmKHBPdXRCdWYsICIlc1xuJTAyWDolMDJYOiUwMlg6JTAyWDolMDJYOiUwMlggKEFpZCA9ICVkKSAoQVApIC1cbiIsCisgICAgICAgICAgICAgICAgcE91dEJ1ZiwKKwkJCQlwRW50cnktPkFkZHJbMF0sIHBFbnRyeS0+QWRkclsxXSwgcEVudHJ5LT5BZGRyWzJdLAorCQkJCXBFbnRyeS0+QWRkclszXSwgcEVudHJ5LT5BZGRyWzRdLCBwRW50cnktPkFkZHJbNV0sIHBFbnRyeS0+QWlkKTsKKworCQkJc3ByaW50ZihwT3V0QnVmLCAiJXNbUmVjaXBpZW50XVxuIiwgcE91dEJ1Zik7CisJCQlmb3IgKGo9MDsgaiA8IE5VTV9PRl9USUQ7IGorKykKKwkJCXsKKwkJCQlpZiAocEVudHJ5LT5CQVJlY1djaWRBcnJheVtqXSAhPSAwKQorCQkJCXsKKwkJCQkJcFJlY0JBRW50cnkgPSZwQWQtPkJBVGFibGUuQkFSZWNFbnRyeVtwRW50cnktPkJBUmVjV2NpZEFycmF5W2pdXTsKKwkJCQkJc3ByaW50ZihwT3V0QnVmLCAiJXNUSUQ9JWQsIEJBV2luU2l6ZT0lZCwgTGFzdEluZFNlcT0lZCwgUmVvcmRlcmluZ1BrdHM9JWRcbiIsIHBPdXRCdWYsIGosIHBSZWNCQUVudHJ5LT5CQVdpblNpemUsIHBSZWNCQUVudHJ5LT5MYXN0SW5kU2VxLCBwUmVjQkFFbnRyeS0+bGlzdC5xbGVuKTsKKwkJCQl9CisJCQl9CisJCQlzcHJpbnRmKHBPdXRCdWYsICIlc1xuIiwgcE91dEJ1Zik7CisKKwkJCXNwcmludGYocE91dEJ1ZiwgIiVzW09yaWdpbmF0b3JdXG4iLCBwT3V0QnVmKTsKKwkJCWZvciAoaj0wOyBqIDwgTlVNX09GX1RJRDsgaisrKQorCQkJeworCQkJCWlmIChwRW50cnktPkJBT3JpV2NpZEFycmF5W2pdICE9IDApCisJCQkJeworCQkJCQlwT3JpQkFFbnRyeSA9JnBBZC0+QkFUYWJsZS5CQU9yaUVudHJ5W3BFbnRyeS0+QkFPcmlXY2lkQXJyYXlbal1dOworCQkJCQlzcHJpbnRmKHBPdXRCdWYsICIlc1RJRD0lZCwgQkFXaW5TaXplPSVkLCBTdGFydFNlcT0lZCwgQ3VyVHhTZXE9JWRcbiIsIHBPdXRCdWYsIGosIHBPcmlCQUVudHJ5LT5CQVdpblNpemUsIHBPcmlCQUVudHJ5LT5TZXF1ZW5jZSwgcEVudHJ5LT5UeFNlcVtqXSk7CisJCQkJfQorCQkJfQorCQkJc3ByaW50ZihwT3V0QnVmLCAiJXNcblxuIiwgcE91dEJ1Zik7CisJCX0KKyAgICAgICAgaWYgKHN0cmxlbihwT3V0QnVmKSA+IChJV19QUklWX1NJWkVfTUFTSyAtIDMwKSkKKyAgICAgICAgICAgICAgICBicmVhazsKKwl9CisKKwlyZXR1cm47Cit9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKK3N0YXRpYyBpbnQKK3J0X3ByaXZhdGVfc2hvdyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQlzdHJ1Y3QgaXdfcG9pbnQgKndycSwgY2hhciAqZXh0cmEpCit7CisgICAgSU5UCQkJCVN0YXR1cyA9IDA7CisgICAgVklSVFVBTF9BREFQVEVSCSpwVmlydHVhbEFkID0gTlVMTDsKKyAgICBQUlRNUF9BREFQVEVSICAgcEFkOworCVBPU19DT09LSUUJCXBPYmo7CisgICAgdTMyICAgICAgICAgICAgIHN1YmNtZCA9IHdycS0+ZmxhZ3M7CisKKwlpZiAoZGV2LT5wcml2X2ZsYWdzID09IElOVF9NQUlOKQorCQlwQWQgPSBkZXYtPnByaXY7CisJZWxzZQorCXsKKwkJcFZpcnR1YWxBZCA9IGRldi0+cHJpdjsKKwkJcEFkID0gcFZpcnR1YWxBZC0+UnRtcERldi0+cHJpdjsKKwl9CisJcE9iaiA9IChQT1NfQ09PS0lFKSBwQWQtPk9TX0Nvb2tpZTsKKworCWlmIChwQWQgPT0gTlVMTCkKKwl7CisJCS8qIGlmIDFzdCBvcGVuIGZhaWwsIHBBZCB3aWxsIGJlIGZyZWU7CisJCSAgIFNvIHRoZSBuZXRfZGV2LT5wcml2IHdpbGwgYmUgTlVMTCBpbiAycmQgb3BlbiAqLworCQlyZXR1cm4gLUVORVRET1dOOworCX0KKworICAgIGlmIChleHRyYSA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgd3JxLT5sZW5ndGggPSAwOworICAgICAgICByZXR1cm4gLUVJTzsKKyAgICB9CisgICAgbWVtc2V0KGV4dHJhLCAweDAwLCBJV19QUklWX1NJWkVfTUFTSyk7CisKKwl7CisJCXBPYmotPmlvY3RsX2lmX3R5cGUgPSBJTlRfTUFJTjsKKyAgICAgICAgcE9iai0+aW9jdGxfaWYgPSBNQUlOX01CU1NJRDsKKwl9CisKKyAgICBzd2l0Y2goc3ViY21kKQorICAgIHsKKworICAgICAgICBjYXNlIFNIT1dfQ09OTl9TVEFUVVM6CisgICAgICAgICAgICBpZiAoTU9OSVRPUl9PTihwQWQpKQorICAgICAgICAgICAgeworI2lmZGVmIERPVDExX05fU1VQUE9SVAorICAgICAgICAgICAgICAgIGlmIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID49IFBIWV8xMUFCR05fTUlYRUQgJiYKKyAgICAgICAgICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXKQorICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKGV4dHJhLCAiTW9uaXRvciBNb2RlKENlbnRyYWxDaGFubmVsICVkKVxuIiwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwpOworICAgICAgICAgICAgICAgIGVsc2UKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKyAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihleHRyYSwgIk1vbml0b3IgTW9kZShDaGFubmVsICVkKVxuIiwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID09IE5kaXNNZWRpYVN0YXRlQ29ubmVjdGVkKQorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkgICAgaWYgKElORlJBX09OKHBBZCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihleHRyYSwgIkNvbm5lY3RlZChBUDogJXNbJTAyWDolMDJYOiUwMlg6JTAyWDolMDJYOiUwMlhdKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLlNzaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5Cc3NpZFswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuQnNzaWRbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5Cc3NpZFszXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkWzRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuQnNzaWRbNV0pOworICAgICAgICAgICAgCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSAsKCJTc2lkPSVzICxTc2lkbGVuID0gJWRcbiIscEFkLT5Db21tb25DZmcuU3NpZCwgcEFkLT5Db21tb25DZmcuU3NpZExlbikpOworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoQURIT0NfT04ocEFkKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYoZXh0cmEsICJDb25uZWN0ZWRcbiIpOworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgIAllbHNlCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCSAgICBzcHJpbnRmKGV4dHJhLCAiRGlzY29ubmVjdGVkXG4iKTsKKyAgICAgICAgICAgIAkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UgLCgiQ29ublN0YXR1cyBpcyBub3QgY29ubmVjdGVkXG4iKSk7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgd3JxLT5sZW5ndGggPSBzdHJsZW4oZXh0cmEpICsgMTsgLy8gMTogc2l6ZSBvZiAnXDAnCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTSE9XX0RSVklFUl9WRVJJT046CisgICAgICAgICAgICBzcHJpbnRmKGV4dHJhLCAiRHJpdmVyIHZlcnNpb24tJXMsICVzICVzXG4iLCBTVEFfRFJJVkVSX1ZFUlNJT04sIF9fREFURV9fLCBfX1RJTUVfXyApOworICAgICAgICAgICAgd3JxLT5sZW5ndGggPSBzdHJsZW4oZXh0cmEpICsgMTsgLy8gMTogc2l6ZSBvZiAnXDAnCisgICAgICAgICAgICBicmVhazsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKyAgICAgICAgY2FzZSBTSE9XX0JBX0lORk86CisgICAgICAgICAgICBnZXRCYUluZm8ocEFkLCBleHRyYSk7CisgICAgICAgICAgICB3cnEtPmxlbmd0aCA9IHN0cmxlbihleHRyYSkgKyAxOyAvLyAxOiBzaXplIG9mICdcMCcKKyAgICAgICAgICAgIGJyZWFrOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQljYXNlIFNIT1dfREVTQ19JTkZPOgorCQkJeworCQkJCVNob3dfRGVzY0luZm9fUHJvYyhwQWQsIE5VTEwpOworCQkJCXdycS0+bGVuZ3RoID0gMDsgLy8gMTogc2l6ZSBvZiAnXDAnCisJCQl9CisJCQlicmVhazsKKyAgICAgICAgY2FzZSBSQUlPX09GRjoKKyAgICAgICAgICAgIGlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNwcmludGYoZXh0cmEsICJTY2FubmluZ1xuIik7CisgICAgICAgICAgICAgICAgd3JxLT5sZW5ndGggPSBzdHJsZW4oZXh0cmEpICsgMTsgLy8gMTogc2l6ZSBvZiAnXDAnCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwQWQtPlN0YUNmZy5iU3dSYWRpbyA9IEZBTFNFOworICAgICAgICAgICAgaWYgKHBBZC0+U3RhQ2ZnLmJSYWRpbyAhPSAocEFkLT5TdGFDZmcuYkh3UmFkaW8gJiYgcEFkLT5TdGFDZmcuYlN3UmFkaW8pKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBBZC0+U3RhQ2ZnLmJSYWRpbyA9IChwQWQtPlN0YUNmZy5iSHdSYWRpbyAmJiBwQWQtPlN0YUNmZy5iU3dSYWRpbyk7CisgICAgICAgICAgICAgICAgaWYgKHBBZC0+U3RhQ2ZnLmJSYWRpbyA9PSBGQUxTRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIE1sbWVSYWRpb09mZihwQWQpOworICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgZXh0cmEgaW5mb3JtYXRpb24KKwkJCQkJcEFkLT5FeHRyYUluZm8gPSBTV19SQURJT19PRkY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgc3ByaW50ZihleHRyYSwgIlJhZGlvIE9mZlxuIik7CisgICAgICAgICAgICB3cnEtPmxlbmd0aCA9IHN0cmxlbihleHRyYSkgKyAxOyAvLyAxOiBzaXplIG9mICdcMCcKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJBSU9fT046CisgICAgICAgICAgICBpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzcHJpbnRmKGV4dHJhLCAiU2Nhbm5pbmdcbiIpOworICAgICAgICAgICAgICAgIHdycS0+bGVuZ3RoID0gc3RybGVuKGV4dHJhKSArIDE7IC8vIDE6IHNpemUgb2YgJ1wwJworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcEFkLT5TdGFDZmcuYlN3UmFkaW8gPSBUUlVFOworICAgICAgICAgICAgLy9pZiAocEFkLT5TdGFDZmcuYlJhZGlvICE9IChwQWQtPlN0YUNmZy5iSHdSYWRpbyAmJiBwQWQtPlN0YUNmZy5iU3dSYWRpbykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcEFkLT5TdGFDZmcuYlJhZGlvID0gKHBBZC0+U3RhQ2ZnLmJId1JhZGlvICYmIHBBZC0+U3RhQ2ZnLmJTd1JhZGlvKTsKKyAgICAgICAgICAgICAgICBpZiAocEFkLT5TdGFDZmcuYlJhZGlvID09IFRSVUUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBNbG1lUmFkaW9PbihwQWQpOworICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgZXh0cmEgaW5mb3JtYXRpb24KKwkJCQkJcEFkLT5FeHRyYUluZm8gPSBFWFRSQV9JTkZPX0NMRUFSOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNwcmludGYoZXh0cmEsICJSYWRpbyBPblxuIik7CisgICAgICAgICAgICB3cnEtPmxlbmd0aCA9IHN0cmxlbihleHRyYSkgKyAxOyAvLyAxOiBzaXplIG9mICdcMCcKKyAgICAgICAgICAgIGJyZWFrOworCisKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwkJY2FzZSBTSE9XX0RMU19FTlRSWV9JTkZPOgorCQkJeworCQkJCVNldF9EbHNFbnRyeUluZm9fRGlzcGxheV9Qcm9jKHBBZCwgTlVMTCk7CisJCQkJd3JxLT5sZW5ndGggPSAwOyAvLyAxOiBzaXplIG9mICdcMCcKKwkJCX0KKwkJCWJyZWFrOworI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCisJCWNhc2UgU0hPV19DRkdfVkFMVUU6CisJCQl7CisJCQkJU3RhdHVzID0gUlRNUFNob3dDZmdWYWx1ZShwQWQsIHdycS0+cG9pbnRlciwgZXh0cmEpOworCQkJCWlmIChTdGF0dXMgPT0gMCkKKwkJCQkJd3JxLT5sZW5ndGggPSBzdHJsZW4oZXh0cmEpICsgMTsgLy8gMTogc2l6ZSBvZiAnXDAnCisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBTSE9XX0FESE9DX0VOVFJZX0lORk86CisJCQlTaG93X0FkaG9jX01hY1RhYmxlX1Byb2MocEFkLCBleHRyYSk7CisJCQl3cnEtPmxlbmd0aCA9IHN0cmxlbihleHRyYSkgKyAxOyAvLyAxOiBzaXplIG9mICdcMCcKKwkJCWJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXMgLSB1bmtub3cgc3ViY21kID0gJWRcbiIsIF9fZnVuY19fLCBzdWJjbWQpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBTdGF0dXM7Cit9CisKKyNpZmRlZiBTSU9DU0lXTUxNRQoraW50IHJ0X2lvY3RsX3Npd21sbWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LAorCQkJICAgY2hhciAqZXh0cmEpCit7CisJUFJUTVBfQURBUFRFUiAgIHBBZCA9IChQUlRNUF9BREFQVEVSKSBkZXYtPnByaXY7CisJc3RydWN0IGl3X21sbWUgKnBNbG1lID0gKHN0cnVjdCBpd19tbG1lICopd3JxdS0+ZGF0YS5wb2ludGVyOworCU1MTUVfUVVFVUVfRUxFTQkJCQlNc2dFbGVtOworCU1MTUVfRElTQVNTT0NfUkVRX1NUUlVDVAlEaXNBc3NvY1JlcTsKKwlNTE1FX0RFQVVUSF9SRVFfU1RSVUNUICAgICAgRGVBdXRoUmVxOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PT4gJXNcbiIsIF9fZnVuY19fKSk7CisKKwlpZiAocE1sbWUgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzd2l0Y2gocE1sbWUtPmNtZCkKKwl7CisjaWZkZWYgSVdfTUxNRV9ERUFVVEgKKwkJY2FzZSBJV19NTE1FX0RFQVVUSDoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT0+ICVzIC0gSVdfTUxNRV9ERUFVVEhcbiIsIF9fZnVuY19fKSk7CisJCQlDT1BZX01BQ19BRERSKERlQXV0aFJlcS5BZGRyLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisJCQlEZUF1dGhSZXEuUmVhc29uID0gcE1sbWUtPnJlYXNvbl9jb2RlOworCQkJTXNnRWxlbS5Nc2dMZW4gPSBzaXplb2YoTUxNRV9ERUFVVEhfUkVRX1NUUlVDVCk7CisJCQlOZGlzTW92ZU1lbW9yeShNc2dFbGVtLk1zZywgJkRlQXV0aFJlcSwgc2l6ZW9mKE1MTUVfREVBVVRIX1JFUV9TVFJVQ1QpKTsKKwkJCU1sbWVEZWF1dGhSZXFBY3Rpb24ocEFkLCAmTXNnRWxlbSk7CisJCQlpZiAoSU5GUkFfT04ocEFkKSkKKwkJCXsKKwkJCSAgICBMaW5rRG93bihwQWQsIEZBTFNFKTsKKwkJCSAgICBwQWQtPk1sbWUuQXNzb2NNYWNoaW5lLkN1cnJTdGF0ZSA9IEFTU09DX0lETEU7CisJCQl9CisJCQlicmVhazsKKyNlbmRpZiAvLyBJV19NTE1FX0RFQVVUSCAvLworI2lmZGVmIElXX01MTUVfRElTQVNTT0MKKwkJY2FzZSBJV19NTE1FX0RJU0FTU09DOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PT4gJXMgLSBJV19NTE1FX0RJU0FTU09DXG4iLCBfX2Z1bmNfXykpOworCQkJQ09QWV9NQUNfQUREUihEaXNBc3NvY1JlcS5BZGRyLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisJCQlEaXNBc3NvY1JlcS5SZWFzb24gPSAgcE1sbWUtPnJlYXNvbl9jb2RlOworCisJCQlNc2dFbGVtLk1hY2hpbmUgPSBBU1NPQ19TVEFURV9NQUNISU5FOworCQkJTXNnRWxlbS5Nc2dUeXBlID0gTVQyX01MTUVfRElTQVNTT0NfUkVROworCQkJTXNnRWxlbS5Nc2dMZW4gPSBzaXplb2YoTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNUKTsKKwkJCU5kaXNNb3ZlTWVtb3J5KE1zZ0VsZW0uTXNnLCAmRGlzQXNzb2NSZXEsIHNpemVvZihNTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1QpKTsKKworCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9PSURfRElTQVNTT0M7CisJCQlNbG1lRGlzYXNzb2NSZXFBY3Rpb24ocEFkLCAmTXNnRWxlbSk7CisJCQlicmVhazsKKyNlbmRpZiAvLyBJV19NTE1FX0RJU0FTU09DIC8vCisJCWRlZmF1bHQ6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT09PiAlcyAtIFVua25vdyBDb21tYW5kXG4iLCBfX2Z1bmNfXykpOworCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisjZW5kaWYgLy8gU0lPQ1NJV01MTUUgLy8KKworI2lmIFdJUkVMRVNTX0VYVCA+IDE3CitpbnQgcnRfaW9jdGxfc2l3YXV0aChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIgPSAoUFJUTVBfQURBUFRFUikgZGV2LT5wcml2OworCXN0cnVjdCBpd19wYXJhbSAqcGFyYW0gPSAmd3JxdS0+cGFyYW07CisKKyAgICAvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgorCWlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKKwl7CisgIAkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOworICAgIAlyZXR1cm4gLUVORVRET1dOOworCX0KKwlzd2l0Y2ggKHBhcmFtLT5mbGFncyAmIElXX0FVVEhfSU5ERVgpIHsKKyAgICAJY2FzZSBJV19BVVRIX1dQQV9WRVJTSU9OOgorICAgICAgICAgICAgaWYgKHBhcmFtLT52YWx1ZSA9PSBJV19BVVRIX1dQQV9WRVJTSU9OX1dQQSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLOworCQkJCWlmIChwQWRhcHRlci0+U3RhQ2ZnLkJzc1R5cGUgPT0gQlNTX0FESE9DKQorCQkJCQlwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHBhcmFtLT52YWx1ZSA9PSBJV19BVVRIX1dQQV9WRVJTSU9OX1dQQTIpCisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0s7CisKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpJV19BVVRIX1dQQV9WRVJTSU9OIC0gcGFyYW0tPnZhbHVlID0gJWQhXG4iLCBfX2Z1bmNfXywgcGFyYW0tPnZhbHVlKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAJY2FzZSBJV19BVVRIX0NJUEhFUl9QQUlSV0lTRToKKyAgICAgICAgICAgIGlmIChwYXJhbS0+dmFsdWUgPT0gSVdfQVVUSF9DSVBIRVJfTk9ORSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cyA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLk9yaWdXZXBTdGF0dXMgPSBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1czsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLlBhaXJDaXBoZXIgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChwYXJhbS0+dmFsdWUgPT0gSVdfQVVUSF9DSVBIRVJfV0VQNDAgfHwKKyAgICAgICAgICAgICAgICAgICAgIHBhcmFtLT52YWx1ZSA9PSBJV19BVVRIX0NJUEhFUl9XRVAxMDQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXMgPSBOZGlzODAyXzExV0VQRW5hYmxlZDsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLk9yaWdXZXBTdGF0dXMgPSBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1czsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLlBhaXJDaXBoZXIgPSBOZGlzODAyXzExV0VQRW5hYmxlZDsKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5JRUVFODAyMVggPSBGQUxTRTsKKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChwYXJhbS0+dmFsdWUgPT0gSVdfQVVUSF9DSVBIRVJfVEtJUCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cyA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ7CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5PcmlnV2VwU3RhdHVzID0gcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXM7CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5QYWlyQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHBhcmFtLT52YWx1ZSA9PSBJV19BVVRIX0NJUEhFUl9DQ01QKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzID0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZDsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLk9yaWdXZXBTdGF0dXMgPSBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1czsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLlBhaXJDaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0FVVEhfQ0lQSEVSX1BBSVJXSVNFIC0gcGFyYW0tPnZhbHVlID0gJWQhXG4iLCBfX2Z1bmNfXywgcGFyYW0tPnZhbHVlKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAJY2FzZSBJV19BVVRIX0NJUEhFUl9HUk9VUDoKKyAgICAgICAgICAgIGlmIChwYXJhbS0+dmFsdWUgPT0gSVdfQVVUSF9DSVBIRVJfTk9ORSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID0gTmRpczgwMl8xMVdFUERpc2FibGVkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAocGFyYW0tPnZhbHVlID09IElXX0FVVEhfQ0lQSEVSX1dFUDQwIHx8CisgICAgICAgICAgICAgICAgICAgICBwYXJhbS0+dmFsdWUgPT0gSVdfQVVUSF9DSVBIRVJfV0VQMTA0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuR3JvdXBDaXBoZXIgPSBOZGlzODAyXzExV0VQRW5hYmxlZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHBhcmFtLT52YWx1ZSA9PSBJV19BVVRIX0NJUEhFUl9US0lQKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuR3JvdXBDaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAocGFyYW0tPnZhbHVlID09IElXX0FVVEhfQ0lQSEVSX0NDTVApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5Hcm91cENpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6SVdfQVVUSF9DSVBIRVJfR1JPVVAgLSBwYXJhbS0+dmFsdWUgPSAlZCFcbiIsIF9fZnVuY19fLCBwYXJhbS0+dmFsdWUpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIAljYXNlIElXX0FVVEhfS0VZX01HTVQ6CisgICAgICAgICAgICBpZiAocGFyYW0tPnZhbHVlID09IElXX0FVVEhfS0VZX01HTVRfODAyXzFYKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVXUEE7CisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLklFRUU4MDIxWCA9IEZBTFNFOworI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTI7CisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLklFRUU4MDIxWCA9IEZBTFNFOworI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKyAgICAgICAgICAgICAgICB9CisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgLy8gV0VQIDF4CisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuSUVFRTgwMjFYID0gVFJVRTsKKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChwYXJhbS0+dmFsdWUgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvL3BBZGFwdGVyLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRDsKKwkJCQlTVEFfUE9SVF9TRUNVUkVEKHBBZGFwdGVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpJV19BVVRIX0tFWV9NR01UIC0gcGFyYW0tPnZhbHVlID0gJWQhXG4iLCBfX2Z1bmNfXywgcGFyYW0tPnZhbHVlKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAJY2FzZSBJV19BVVRIX1JYX1VORU5DUllQVEVEX0VBUE9MOgorICAgICAgICAgICAgYnJlYWs7CisgICAgCWNhc2UgSVdfQVVUSF9QUklWQUNZX0lOVk9LRUQ6CisgICAgICAgICAgICAvKmlmIChwYXJhbS0+dmFsdWUgPT0gMCkKKwkJCXsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlT3BlbjsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cyA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLk9yaWdXZXBTdGF0dXMgPSBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1czsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLlBhaXJDaXBoZXIgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CisgICAgICAgIAkgICAgcEFkYXB0ZXItPlN0YUNmZy5Hcm91cENpcGhlciA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKKyAgICAgICAgICAgIH0qLworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0FVVEhfUFJJVkFDWV9JTlZPS0VEIC0gcGFyYW0tPnZhbHVlID0gJWQhXG4iLCBfX2Z1bmNfXywgcGFyYW0tPnZhbHVlKSk7CisgICAgCQlicmVhazsKKyAgICAJY2FzZSBJV19BVVRIX0RST1BfVU5FTkNSWVBURUQ6CisgICAgICAgICAgICBpZiAocGFyYW0tPnZhbHVlICE9IDApCisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9OT1RfU0VDVVJFRDsKKwkJCWVsc2UKKwkJCXsKKyAgICAgICAgICAgICAgICAvL3BBZGFwdGVyLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRDsKKwkJCQlTVEFfUE9SVF9TRUNVUkVEKHBBZGFwdGVyKTsKKwkJCX0KKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpJV19BVVRIX1dQQV9WRVJTSU9OIC0gcGFyYW0tPnZhbHVlID0gJWQhXG4iLCBfX2Z1bmNfXywgcGFyYW0tPnZhbHVlKSk7CisgICAgCQlicmVhazsKKyAgICAJY2FzZSBJV19BVVRIXzgwMjExX0FVVEhfQUxHOgorCQkJaWYgKHBhcmFtLT52YWx1ZSAmIElXX0FVVEhfQUxHX1NIQVJFRF9LRVkpCisgICAgICAgICAgICB7CisJCQkJcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVNoYXJlZDsKKwkJCX0KKyAgICAgICAgICAgIGVsc2UgaWYgKHBhcmFtLT52YWx1ZSAmIElXX0FVVEhfQUxHX09QRU5fU1lTVEVNKQorICAgICAgICAgICAgeworCQkJCXBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVPcGVuOworCQkJfQorICAgICAgICAgICAgZWxzZQorCQkJCXJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0FVVEhfODAyMTFfQVVUSF9BTEcgLSBwYXJhbS0+dmFsdWUgPSAlZCFcbiIsIF9fZnVuY19fLCBwYXJhbS0+dmFsdWUpKTsKKwkJCWJyZWFrOworICAgIAljYXNlIElXX0FVVEhfV1BBX0VOQUJMRUQ6CisgICAgCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6SVdfQVVUSF9XUEFfRU5BQkxFRCAtIERyaXZlciBzdXBwb3J0cyBXUEEhKHBhcmFtLT52YWx1ZSA9ICVkKVxuIiwgX19mdW5jX18sIHBhcmFtLT52YWx1ZSkpOworICAgIAkJYnJlYWs7CisgICAgCWRlZmF1bHQ6CisgICAgCQlyZXR1cm4gLUVPUE5PVFNVUFA7Cit9CisKKwlyZXR1cm4gMDsKK30KKworaW50IHJ0X2lvY3RsX2dpd2F1dGgoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCVBSVE1QX0FEQVBURVIgICBwQWRhcHRlciA9IChQUlRNUF9BREFQVEVSKSBkZXYtPnByaXY7CisJc3RydWN0IGl3X3BhcmFtICpwYXJhbSA9ICZ3cnF1LT5wYXJhbTsKKworICAgIC8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCisJaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQorICAgIHsKKyAgCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisgICAgCXJldHVybiAtRU5FVERPV047CisgICAgfQorCisJc3dpdGNoIChwYXJhbS0+ZmxhZ3MgJiBJV19BVVRIX0lOREVYKSB7CisJY2FzZSBJV19BVVRIX0RST1BfVU5FTkNSWVBURUQ6CisgICAgICAgIHBhcmFtLT52YWx1ZSA9IChwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExV0VQRGlzYWJsZWQpID8gMCA6IDE7CisJCWJyZWFrOworCisJY2FzZSBJV19BVVRIXzgwMjExX0FVVEhfQUxHOgorICAgICAgICBwYXJhbS0+dmFsdWUgPSAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVTaGFyZWQpID8gSVdfQVVUSF9BTEdfU0hBUkVEX0tFWSA6IElXX0FVVEhfQUxHX09QRU5fU1lTVEVNOworCQlicmVhazsKKworCWNhc2UgSVdfQVVUSF9XUEFfRU5BQkxFRDoKKwkJcGFyYW0tPnZhbHVlID0gKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKSA/IDEgOiAwOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwl9CisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgicnRfaW9jdGxfZ2l3YXV0aDo6cGFyYW0tPnZhbHVlID0gJWQhXG4iLCBwYXJhbS0+dmFsdWUpKTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBmblNldENpcGhlcktleSgKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBJTlQgICAgICAgICAgICAga2V5SWR4LAorICAgIElOICBVQ0hBUiAgICAgICAgICAgQ2lwaGVyQWxnLAorICAgIElOICBCT09MRUFOICAgICAgICAgYkdUSywKKyAgICBJTiAgc3RydWN0IGl3X2VuY29kZV9leHQgKmV4dCkKK3sKKyAgICBOZGlzWmVyb01lbW9yeSgmcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLCBzaXplb2YoQ0lQSEVSX0tFWSkpOworICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5LZXlMZW4gPSBMRU5fVEtJUF9FSzsKKyAgICBOZGlzTW92ZU1lbW9yeShwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uS2V5LCBleHQtPmtleSwgTEVOX1RLSVBfRUspOworICAgIE5kaXNNb3ZlTWVtb3J5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5UeE1pYywgZXh0LT5rZXkgKyBMRU5fVEtJUF9FSywgTEVOX1RLSVBfVFhNSUNLKTsKKyAgICBOZGlzTW92ZU1lbW9yeShwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uUnhNaWMsIGV4dC0+a2V5ICsgTEVOX1RLSVBfRUsgKyBMRU5fVEtJUF9UWE1JQ0ssIExFTl9US0lQX1JYTUlDSyk7CisgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLkNpcGhlckFsZyA9IENpcGhlckFsZzsKKworICAgIC8vIFVwZGF0ZSBncm91cCBrZXkgaW5mb3JtYXRpb24gdG8gQVNJQyBTaGFyZWQgS2V5IFRhYmxlCisJQXNpY0FkZFNoYXJlZEtleUVudHJ5KHBBZGFwdGVyLAorCQkJCQkJICBCU1MwLAorCQkJCQkJICBrZXlJZHgsCisJCQkJCQkgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5DaXBoZXJBbGcsCisJCQkJCQkgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5LZXksCisJCQkJCQkgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5UeE1pYywKKwkJCQkJCSAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLlJ4TWljKTsKKworICAgIGlmIChiR1RLKQorICAgICAgICAvLyBVcGRhdGUgQVNJQyBXQ0lEIGF0dHJpYnV0ZSB0YWJsZSBhbmQgSVZFSVYgdGFibGUKKyAgICAJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWRhcHRlciwKKyAgICAJCQkJCQkJICBCU1MwLAorICAgIAkJCQkJCQkgIGtleUlkeCwKKyAgICAJCQkJCQkJICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uQ2lwaGVyQWxnLAorICAgIAkJCQkJCQkgIE5VTEwpOworICAgIGVsc2UKKyAgICAgICAgLy8gVXBkYXRlIEFTSUMgV0NJRCBhdHRyaWJ1dGUgdGFibGUgYW5kIElWRUlWIHRhYmxlCisgICAgCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkocEFkYXB0ZXIsCisgICAgCQkJCQkJCSAgQlNTMCwKKyAgICAJCQkJCQkJICBrZXlJZHgsCisgICAgCQkJCQkJCSAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLkNpcGhlckFsZywKKyAgICAJCQkJCQkJICAmcEFkYXB0ZXItPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdKTsKK30KKworaW50IHJ0X2lvY3RsX3Npd2VuY29kZWV4dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsCisJCQkgICBjaGFyICpleHRyYSkKKwkJCXsKKyAgICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIgPSAoUFJUTVBfQURBUFRFUikgZGV2LT5wcml2OworCXN0cnVjdCBpd19wb2ludCAqZW5jb2RpbmcgPSAmd3JxdS0+ZW5jb2Rpbmc7CisJc3RydWN0IGl3X2VuY29kZV9leHQgKmV4dCA9IChzdHJ1Y3QgaXdfZW5jb2RlX2V4dCAqKWV4dHJhOworICAgIGludCBrZXlJZHgsIGFsZyA9IGV4dC0+YWxnOworCisgICAgLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KKwlpZighUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCisJeworICAJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKyAgICAJcmV0dXJuIC1FTkVURE9XTjsKKwl9CisKKyAgICBpZiAoZW5jb2RpbmctPmZsYWdzICYgSVdfRU5DT0RFX0RJU0FCTEVEKQorCXsKKyAgICAgICAga2V5SWR4ID0gKGVuY29kaW5nLT5mbGFncyAmIElXX0VOQ09ERV9JTkRFWCkgLSAxOworICAgICAgICAvLyBzZXQgQlNTSUQgd2NpZCBlbnRyeSBvZiB0aGUgUGFpci13aXNlIEtleSB0YWJsZSBhcyBuby1zZWN1cml0eSBtb2RlCisJICAgIEFzaWNSZW1vdmVQYWlyd2lzZUtleUVudHJ5KHBBZGFwdGVyLCBCU1MwLCBCU1NJRF9XQ0lEKTsKKyAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLktleUxlbiA9IDA7CisJCXBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5DaXBoZXJBbGcgPSBDSVBIRVJfTk9ORTsKKwkJQXNpY1JlbW92ZVNoYXJlZEtleUVudHJ5KHBBZGFwdGVyLCAwLCAoVUNIQVIpa2V5SWR4KTsKKyAgICAgICAgTmRpc1plcm9NZW1vcnkoJnBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XSwgc2l6ZW9mKENJUEhFUl9LRVkpKTsKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OlJlbW92ZSBhbGwga2V5cyEoZW5jb2RpbmctPmZsYWdzID0gJXgpXG4iLCBfX2Z1bmNfXywgZW5jb2RpbmctPmZsYWdzKSk7CisgICAgfQorCQkJCQllbHNlCisgICAgeworICAgICAgICAvLyBHZXQgS2V5IEluZGV4IGFuZCBjb252ZXQgdG8gb3VyIG93biBkZWZpbmVkIGtleSBpbmRleAorICAgIAlrZXlJZHggPSAoZW5jb2RpbmctPmZsYWdzICYgSVdfRU5DT0RFX0lOREVYKSAtIDE7CisgICAgCWlmKChrZXlJZHggPCAwKSB8fCAoa2V5SWR4ID49IE5SX1dFUF9LRVlTKSkKKyAgICAJCXJldHVybiAtRUlOVkFMOworCisgICAgICAgIGlmIChleHQtPmV4dF9mbGFncyAmIElXX0VOQ09ERV9FWFRfU0VUX1RYX0tFWSkKKyAgICAgICAgeworICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWQgPSBrZXlJZHg7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6RGVmYXVsdEtleUlkID0gJWRcbiIsIF9fZnVuY19fLCBwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCkpOworICAgICAgICB9CisKKyAgICAgICAgc3dpdGNoIChhbGcpIHsKKyAgICAJCWNhc2UgSVdfRU5DT0RFX0FMR19OT05FOgorICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpJV19FTkNPREVfQUxHX05PTkVcbiIsIF9fZnVuY19fKSk7CisgICAgCQkJYnJlYWs7CisgICAgCQljYXNlIElXX0VOQ09ERV9BTEdfV0VQOgorICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpJV19FTkNPREVfQUxHX1dFUCAtIGV4dC0+a2V5X2xlbiA9ICVkLCBrZXlJZHggPSAlZFxuIiwgX19mdW5jX18sIGV4dC0+a2V5X2xlbiwga2V5SWR4KSk7CisgICAgCQkJaWYgKGV4dC0+a2V5X2xlbiA9PSBNQVhfV0VQX0tFWV9TSVpFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgCQkJcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLktleUxlbiA9IE1BWF9XRVBfS0VZX1NJWkU7CisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5DaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OworCQkJCX0KKyAgICAgICAgCQllbHNlIGlmIChleHQtPmtleV9sZW4gPT0gTUlOX1dFUF9LRVlfU0laRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5LZXlMZW4gPSBNSU5fV0VQX0tFWV9TSVpFOworICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OworCQkJfQorICAgICAgICAJCWVsc2UKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisKKyAgICAgICAgICAgICAgICBOZGlzWmVyb01lbW9yeShwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uS2V5LCAgMTYpOworCQkJICAgIE5kaXNNb3ZlTWVtb3J5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5LZXksIGV4dC0+a2V5LCBleHQtPmtleV9sZW4pOworICAgIAkJCWJyZWFrOworICAgICAgICAgICAgY2FzZSBJV19FTkNPREVfQUxHX1RLSVA6CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0VOQ09ERV9BTEdfVEtJUCAtIGtleUlkeCA9ICVkLCBleHQtPmtleV9sZW4gPSAlZFxuIiwgX19mdW5jX18sIGtleUlkeCwgZXh0LT5rZXlfbGVuKSk7CisgICAgICAgICAgICAgICAgaWYgKGV4dC0+a2V5X2xlbiA9PSAzMikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHQtPmV4dF9mbGFncyAmIElXX0VOQ09ERV9FWFRfU0VUX1RYX0tFWSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZm5TZXRDaXBoZXJLZXkocEFkYXB0ZXIsIGtleUlkeCwgQ0lQSEVSX1RLSVAsIEZBTFNFLCBleHQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3BBZGFwdGVyLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVEFfUE9SVF9TRUNVUkVEKHBBZGFwdGVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKwkJfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChleHQtPmV4dF9mbGFncyAmIElXX0VOQ09ERV9FWFRfR1JPVVBfS0VZKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBmblNldENpcGhlcktleShwQWRhcHRlciwga2V5SWR4LCBDSVBIRVJfVEtJUCwgVFJVRSwgZXh0KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0IDgwMi4xeCBwb3J0IGNvbnRyb2wKKyAgICAgICAgICAgIAkgICAgICAgIC8vcEFkYXB0ZXItPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEOworICAgICAgICAgICAgCSAgICAgICAgU1RBX1BPUlRfU0VDVVJFRChwQWRhcHRlcik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSVdfRU5DT0RFX0FMR19DQ01QOgorICAgICAgICAgICAgICAgIGlmIChleHQtPmV4dF9mbGFncyAmIElXX0VOQ09ERV9FWFRfU0VUX1RYX0tFWSkKKwkJeworICAgICAgICAgICAgICAgICAgICBmblNldENpcGhlcktleShwQWRhcHRlciwga2V5SWR4LCBDSVBIRVJfQUVTLCBGQUxTRSwgZXh0KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikKKyAgICAgICAgICAgICAgICAgICAgCS8vcEFkYXB0ZXItPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEOworICAgICAgICAgICAgICAgICAgICAJU1RBX1BPUlRfU0VDVVJFRChwQWRhcHRlcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKGV4dC0+ZXh0X2ZsYWdzICYgSVdfRU5DT0RFX0VYVF9HUk9VUF9LRVkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmblNldENpcGhlcktleShwQWRhcHRlciwga2V5SWR4LCBDSVBIRVJfQUVTLCBUUlVFLCBleHQpOworCisgICAgICAgICAgICAgICAgICAgIC8vIHNldCA4MDIuMXggcG9ydCBjb250cm9sCisgICAgICAgIAkgICAgICAgIC8vcEFkYXB0ZXItPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEOworICAgICAgICAJICAgICAgICBTVEFfUE9SVF9TRUNVUkVEKHBBZGFwdGVyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgCQlkZWZhdWx0OgorICAgIAkJCXJldHVybiAtRUlOVkFMOworCQl9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK2ludAorcnRfaW9jdGxfZ2l3ZW5jb2RlZXh0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCVBSVE1QX0FEQVBURVIgcEFkID0gKFBSVE1QX0FEQVBURVIpIGRldi0+cHJpdjsKKwlQQ0hBUiBwS2V5ID0gTlVMTDsKKwlzdHJ1Y3QgaXdfcG9pbnQgKmVuY29kaW5nID0gJndycXUtPmVuY29kaW5nOworCXN0cnVjdCBpd19lbmNvZGVfZXh0ICpleHQgPSAoc3RydWN0IGl3X2VuY29kZV9leHQgKilleHRyYTsKKwlpbnQgaWR4LCBtYXhfa2V5X2xlbjsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoIj09PT4gcnRfaW9jdGxfZ2l3ZW5jb2RlZXh0XG4iKSk7CisKKwltYXhfa2V5X2xlbiA9IGVuY29kaW5nLT5sZW5ndGggLSBzaXplb2YoKmV4dCk7CisJaWYgKG1heF9rZXlfbGVuIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZHggPSBlbmNvZGluZy0+ZmxhZ3MgJiBJV19FTkNPREVfSU5ERVg7CisJaWYgKGlkeCkKKwl7CisJCWlmIChpZHggPCAxIHx8IGlkeCA+IDQpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWR4LS07CisKKwkJaWYgKChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkgfHwKKwkJCShwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkpCisJCXsKKwkJCWlmIChpZHggIT0gcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkKQorCQkJeworCQkJCWV4dC0+a2V5X2xlbiA9IDA7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0KKwl9CisJZWxzZQorCQlpZHggPSBwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQ7CisKKwllbmNvZGluZy0+ZmxhZ3MgPSBpZHggKyAxOworCW1lbXNldChleHQsIDAsIHNpemVvZigqZXh0KSk7CisKKwlleHQtPmtleV9sZW4gPSAwOworCXN3aXRjaChwQWQtPlN0YUNmZy5XZXBTdGF0dXMpIHsKKwkJY2FzZSBOZGlzODAyXzExV0VQRGlzYWJsZWQ6CisJCQlleHQtPmFsZyA9IElXX0VOQ09ERV9BTEdfTk9ORTsKKwkJCWVuY29kaW5nLT5mbGFncyB8PSBJV19FTkNPREVfRElTQUJMRUQ7CisJCQlicmVhazsKKwkJY2FzZSBOZGlzODAyXzExV0VQRW5hYmxlZDoKKwkJCWV4dC0+YWxnID0gSVdfRU5DT0RFX0FMR19XRVA7CisJCQlpZiAocEFkLT5TaGFyZWRLZXlbQlNTMF1baWR4XS5LZXlMZW4gPiBtYXhfa2V5X2xlbikKKwkJCQlyZXR1cm4gLUUyQklHOworCQkJZWxzZQorCQkJeworCQkJCWV4dC0+a2V5X2xlbiA9IHBBZC0+U2hhcmVkS2V5W0JTUzBdW2lkeF0uS2V5TGVuOworCQkJCXBLZXkgPSAmKHBBZC0+U2hhcmVkS2V5W0JTUzBdW2lkeF0uS2V5WzBdKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ6CisJCWNhc2UgTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZDoKKwkJCWlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkKKwkJCQlleHQtPmFsZyA9IElXX0VOQ09ERV9BTEdfVEtJUDsKKwkJCWVsc2UKKwkJCQlleHQtPmFsZyA9IElXX0VOQ09ERV9BTEdfQ0NNUDsKKworCQkJaWYgKG1heF9rZXlfbGVuIDwgMzIpCisJCQkJcmV0dXJuIC1FMkJJRzsKKwkJCWVsc2UKKwkJCXsKKwkJCQlleHQtPmtleV9sZW4gPSAzMjsKKwkJCQlwS2V5ID0gJnBBZC0+U3RhQ2ZnLlBNS1swXTsKKwkJCX0KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGV4dC0+a2V5X2xlbiAmJiBwS2V5KQorCXsKKwkJZW5jb2RpbmctPmZsYWdzIHw9IElXX0VOQ09ERV9FTkFCTEVEOworCQltZW1jcHkoZXh0LT5rZXksIHBLZXksIGV4dC0+a2V5X2xlbik7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBTSU9DU0lXR0VOSUUKK2ludCBydF9pb2N0bF9zaXdnZW5pZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlQUlRNUF9BREFQVEVSICAgcEFkID0gKFBSVE1QX0FEQVBURVIpIGRldi0+cHJpdjsKKworCWlmICh3cnF1LT5kYXRhLmxlbmd0aCA+IE1BWF9MRU5fT0ZfUlNOSUUgfHwKKwkgICAgKHdycXUtPmRhdGEubGVuZ3RoICYmIGV4dHJhID09IE5VTEwpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICh3cnF1LT5kYXRhLmxlbmd0aCkKKwl7CisJCXBBZC0+U3RhQ2ZnLlJTTklFX0xlbiA9IHdycXUtPmRhdGEubGVuZ3RoOworCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5TdGFDZmcuUlNOX0lFWzBdLCBleHRyYSwgcEFkLT5TdGFDZmcuUlNOSUVfTGVuKTsKKwl9CisJZWxzZQorCXsKKwkJcEFkLT5TdGFDZmcuUlNOSUVfTGVuID0gMDsKKwkJTmRpc1plcm9NZW1vcnkoJnBBZC0+U3RhQ2ZnLlJTTl9JRVswXSwgTUFYX0xFTl9PRl9SU05JRSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisjZW5kaWYgLy8gU0lPQ1NJV0dFTklFIC8vCisKK2ludCBydF9pb2N0bF9naXdnZW5pZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJUFJUTVBfQURBUFRFUiAgIHBBZCA9IChQUlRNUF9BREFQVEVSKSBkZXYtPnByaXY7CisKKwlpZiAoKHBBZC0+U3RhQ2ZnLlJTTklFX0xlbiA9PSAwKSB8fAorCQkocEFkLT5TdGFDZmcuQXV0aE1vZGUgPCBOZGlzODAyXzExQXV0aE1vZGVXUEEpKQorCXsKKwkJd3JxdS0+ZGF0YS5sZW5ndGggPSAwOworCQlyZXR1cm4gMDsKKwl9CisKKyNpZmRlZiBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorI2lmZGVmIFNJT0NTSVdHRU5JRQorCWlmIChwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgPT0gV1BBX1NVUFBMSUNBTlRfRU5BQkxFKQorCXsKKwlpZiAod3JxdS0+ZGF0YS5sZW5ndGggPCBwQWQtPlN0YUNmZy5SU05JRV9MZW4pCisJCXJldHVybiAtRTJCSUc7CisKKwl3cnF1LT5kYXRhLmxlbmd0aCA9IHBBZC0+U3RhQ2ZnLlJTTklFX0xlbjsKKwltZW1jcHkoZXh0cmEsICZwQWQtPlN0YUNmZy5SU05fSUVbMF0sIHBBZC0+U3RhQ2ZnLlJTTklFX0xlbik7CisJfQorCWVsc2UKKyNlbmRpZiAvLyBTSU9DU0lXR0VOSUUgLy8KKyNlbmRpZiAvLyBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCXsKKwkJVUNIQVIgUlNOSWUgPSBJRV9XUEE7CisKKwkJaWYgKHdycXUtPmRhdGEubGVuZ3RoIDwgKHBBZC0+U3RhQ2ZnLlJTTklFX0xlbiArIDIpKSAvLyBJRCwgTGVuCisJCQlyZXR1cm4gLUUyQklHOworCQl3cnF1LT5kYXRhLmxlbmd0aCA9IHBBZC0+U3RhQ2ZnLlJTTklFX0xlbiArIDI7CisKKwkJaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKSB8fAorICAgICAgICAgICAgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIpKQorCQkJUlNOSWUgPSBJRV9SU047CisKKwkJZXh0cmFbMF0gPSAoY2hhcilSU05JZTsKKwkJZXh0cmFbMV0gPSBwQWQtPlN0YUNmZy5SU05JRV9MZW47CisJCW1lbWNweShleHRyYSsyLCAmcEFkLT5TdGFDZmcuUlNOX0lFWzBdLCBwQWQtPlN0YUNmZy5SU05JRV9MZW4pOworCX0KKworCXJldHVybiAwOworfQorCitpbnQgcnRfaW9jdGxfc2l3cG1rc2Eoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LAorCQkJICAgY2hhciAqZXh0cmEpCit7CisJUFJUTVBfQURBUFRFUiAgIHBBZCA9IChQUlRNUF9BREFQVEVSKSBkZXYtPnByaXY7CisJc3RydWN0IGl3X3Bta3NhICpwUG1rc2EgPSAoc3RydWN0IGl3X3Bta3NhICopd3JxdS0+ZGF0YS5wb2ludGVyOworCUlOVAlDYWNoZWRJZHggPSAwLCBpZHggPSAwOworCisJaWYgKHBQbWtzYSA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoIj09PT4gcnRfaW9jdGxfc2l3cG1rc2FcbiIpKTsKKwlzd2l0Y2gocFBta3NhLT5jbWQpCisJeworCQljYXNlIElXX1BNS1NBX0ZMVVNIOgorCQkJTmRpc1plcm9NZW1vcnkocEFkLT5TdGFDZmcuU2F2ZWRQTUssIHNpemVvZihCU1NJRF9JTkZPKSpQTUtJRF9OTyk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSAsKCJydF9pb2N0bF9zaXdwbWtzYSAtIElXX1BNS1NBX0ZMVVNIXG4iKSk7CisJCQlicmVhazsKKwkJY2FzZSBJV19QTUtTQV9SRU1PVkU6CisJCQlmb3IgKENhY2hlZElkeCA9IDA7IENhY2hlZElkeCA8IHBBZC0+U3RhQ2ZnLlNhdmVkUE1LTnVtOyBDYWNoZWRJZHgrKykKKwkJCXsKKwkJICAgICAgICAvLyBjb21wYXJlIHRoZSBCU1NJRAorCQkgICAgICAgIGlmIChOZGlzRXF1YWxNZW1vcnkocFBta3NhLT5ic3NpZC5zYV9kYXRhLCBwQWQtPlN0YUNmZy5TYXZlZFBNS1tDYWNoZWRJZHhdLkJTU0lELCBNQUNfQUREUl9MRU4pKQorCQkgICAgICAgIHsKKwkJICAgICAgICAJTmRpc1plcm9NZW1vcnkocEFkLT5TdGFDZmcuU2F2ZWRQTUtbQ2FjaGVkSWR4XS5CU1NJRCwgTUFDX0FERFJfTEVOKTsKKwkJCQkJTmRpc1plcm9NZW1vcnkocEFkLT5TdGFDZmcuU2F2ZWRQTUtbQ2FjaGVkSWR4XS5QTUtJRCwgMTYpOworCQkJCQlmb3IgKGlkeCA9IENhY2hlZElkeDsgaWR4IDwgKHBBZC0+U3RhQ2ZnLlNhdmVkUE1LTnVtIC0gMSk7IGlkeCsrKQorCQkJCQl7CisJCQkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5TdGFDZmcuU2F2ZWRQTUtbaWR4XS5CU1NJRFswXSwgJnBBZC0+U3RhQ2ZnLlNhdmVkUE1LW2lkeCsxXS5CU1NJRFswXSwgTUFDX0FERFJfTEVOKTsKKwkJCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPlN0YUNmZy5TYXZlZFBNS1tpZHhdLlBNS0lEWzBdLCAmcEFkLT5TdGFDZmcuU2F2ZWRQTUtbaWR4KzFdLlBNS0lEWzBdLCAxNik7CisJCQkJCX0KKwkJCQkJcEFkLT5TdGFDZmcuU2F2ZWRQTUtOdW0tLTsKKwkJCSAgICAgICAgYnJlYWs7CisJCSAgICAgICAgfQorCSAgICAgICAgfQorCisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSAsKCJydF9pb2N0bF9zaXdwbWtzYSAtIElXX1BNS1NBX1JFTU9WRVxuIikpOworCQkJYnJlYWs7CisJCWNhc2UgSVdfUE1LU0FfQUREOgorCQkJZm9yIChDYWNoZWRJZHggPSAwOyBDYWNoZWRJZHggPCBwQWQtPlN0YUNmZy5TYXZlZFBNS051bTsgQ2FjaGVkSWR4KyspCisJCQl7CisJCSAgICAgICAgLy8gY29tcGFyZSB0aGUgQlNTSUQKKwkJICAgICAgICBpZiAoTmRpc0VxdWFsTWVtb3J5KHBQbWtzYS0+YnNzaWQuc2FfZGF0YSwgcEFkLT5TdGFDZmcuU2F2ZWRQTUtbQ2FjaGVkSWR4XS5CU1NJRCwgTUFDX0FERFJfTEVOKSkKKwkJCSAgICAgICAgYnJlYWs7CisJICAgICAgICB9CisKKwkgICAgICAgIC8vIEZvdW5kLCByZXBsYWNlIGl0CisJICAgICAgICBpZiAoQ2FjaGVkSWR4IDwgUE1LSURfTk8pCisJICAgICAgICB7CisJCSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfT0ZGLCAoIlVwZGF0ZSBQTUtJRCwgaWR4ID0gJWRcbiIsIENhY2hlZElkeCkpOworCQkgICAgICAgIE5kaXNNb3ZlTWVtb3J5KCZwQWQtPlN0YUNmZy5TYXZlZFBNS1tDYWNoZWRJZHhdLkJTU0lEWzBdLCBwUG1rc2EtPmJzc2lkLnNhX2RhdGEsIE1BQ19BRERSX0xFTik7CisJCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+U3RhQ2ZnLlNhdmVkUE1LW0NhY2hlZElkeF0uUE1LSURbMF0sIHBQbWtzYS0+cG1raWQsIDE2KTsKKwkJICAgICAgICBwQWQtPlN0YUNmZy5TYXZlZFBNS051bSsrOworCSAgICAgICAgfQorCSAgICAgICAgLy8gTm90IGZvdW5kLCByZXBsYWNlIHRoZSBsYXN0IG9uZQorCSAgICAgICAgZWxzZQorCSAgICAgICAgeworCQkgICAgICAgIC8vIFJhbmRvbWx5IHJlcGxhY2Ugb25lCisJCSAgICAgICAgQ2FjaGVkSWR4ID0gKHBQbWtzYS0+YnNzaWQuc2FfZGF0YVs1XSAlIFBNS0lEX05PKTsKKwkJICAgICAgICBEQkdQUklOVChSVF9ERUJVR19PRkYsICgiVXBkYXRlIFBNS0lELCBpZHggPSAlZFxuIiwgQ2FjaGVkSWR4KSk7CisJCSAgICAgICAgTmRpc01vdmVNZW1vcnkoJnBBZC0+U3RhQ2ZnLlNhdmVkUE1LW0NhY2hlZElkeF0uQlNTSURbMF0sIHBQbWtzYS0+YnNzaWQuc2FfZGF0YSwgTUFDX0FERFJfTEVOKTsKKwkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5TdGFDZmcuU2F2ZWRQTUtbQ2FjaGVkSWR4XS5QTUtJRFswXSwgcFBta3NhLT5wbWtpZCwgMTYpOworCSAgICAgICAgfQorCisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSAsKCJydF9pb2N0bF9zaXdwbWtzYSAtIElXX1BNS1NBX0FERFxuIikpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSAsKCJydF9pb2N0bF9zaXdwbWtzYSAtIFVua25vdyBDb21tYW5kISFcbiIpKTsKKwkJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorI2VuZGlmIC8vICNpZiBXSVJFTEVTU19FWFQgPiAxNworCisjaWZkZWYgREJHCitzdGF0aWMgaW50CitydF9wcml2YXRlX2lvY3RsX2JicChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQlzdHJ1Y3QgaXdfcG9pbnQgKndycSwgY2hhciAqZXh0cmEpCisJCQl7CisJQ0hBUgkJCQkqdGhpc19jaGFyOworCUNIQVIJCQkJKnZhbHVlID0gTlVMTDsKKwlVQ0hBUgkJCQlyZWdCQlAgPSAwOworLy8JQ0hBUgkJCQlhcmdbMjU1XT17MH07CisJVUlOVDMyCQkJCWJicElkOworCVVJTlQzMgkJCQliYnBWYWx1ZTsKKwlCT09MRUFOCQkJCWJJc1ByaW50QWxsQkJQID0gRkFMU0U7CisJSU5UCQkJCQlTdGF0dXMgPSAwOworICAgIFBSVE1QX0FEQVBURVIgICAgICAgcEFkYXB0ZXIgPSAoUFJUTVBfQURBUFRFUikgZGV2LT5wcml2OworCisKKwltZW1zZXQoZXh0cmEsIDB4MDAsIElXX1BSSVZfU0laRV9NQVNLKTsKKworCWlmICh3cnEtPmxlbmd0aCA+IDEpIC8vTm8gcGFyYW1ldGVycy4KKwkJCQl7CisJCXNwcmludGYoZXh0cmEsICJcbiIpOworCisJCS8vUGFyc2luZyBSZWFkIG9yIFdyaXRlCisJCXRoaXNfY2hhciA9IHdycS0+cG9pbnRlcjsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgidGhpc19jaGFyPSVzXG4iLCB0aGlzX2NoYXIpKTsKKwkJaWYgKCEqdGhpc19jaGFyKQorCQkJZ290byBuZXh0OworCisJCWlmICgodmFsdWUgPSBydHN0cmNocih0aGlzX2NoYXIsICc9JykpICE9IE5VTEwpCisJCQkqdmFsdWUrKyA9IDA7CisKKwkJaWYgKCF2YWx1ZSB8fCAhKnZhbHVlKQorCQl7IC8vUmVhZAorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgidGhpc19jaGFyPSVzLCB2YWx1ZT0lc1xuIiwgdGhpc19jaGFyLCB2YWx1ZSkpOworCQkJaWYgKHNzY2FuZih0aGlzX2NoYXIsICIlZCIsICYoYmJwSWQpKSA9PSAxKQorCQkJeworCQkJCWlmIChiYnBJZCA8PSAxMzYpCisJCQkJeworI2lmZGVmIFJBTElOS19BVEUKKwkJCQkJaWYgKEFURV9PTihwQWRhcHRlcikpCisJCQkJCXsKKwkJCQkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZGFwdGVyLCBiYnBJZCwgJnJlZ0JCUCk7CisJCQkJCX0KKwkJCQkJZWxzZQorI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKwkJCQkJeworCQkJCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkYXB0ZXIsIGJicElkLCAmcmVnQkJQKTsKKwkJCQkJfQorCQkJCQlzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJSJTAyZFsweCUwMlhdOiUwMlhcbiIsIGJicElkLCBiYnBJZCoyLCByZWdCQlApOworICAgICAgICAgICAgICAgICAgICB3cnEtPmxlbmd0aCA9IHN0cmxlbihleHRyYSkgKyAxOyAvLyAxOiBzaXplIG9mICdcMCcKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgibXNnPSVzXG4iLCBleHRyYSkpOworCQkJCX0KKwkJCQllbHNlCisJCQkJey8vSW52YWxpZCBwYXJhbWV0ZXMsIHNvIGRlZmF1bHQgcHJpbnRrIGFsbCBiYnAKKwkJCQkJYklzUHJpbnRBbGxCQlAgPSBUUlVFOworCQkJCQlnb3RvIG5leHQ7CisJCQkJfQorCQkJfQorCQkJZWxzZQorCQkJeyAvL0ludmFsaWQgcGFyYW1ldGVzLCBzbyBkZWZhdWx0IHByaW50ayBhbGwgYmJwCisJCQkJYklzUHJpbnRBbGxCQlAgPSBUUlVFOworCQkJCWdvdG8gbmV4dDsKKwkJCX0KKwkJfQorCQllbHNlCisJCXsgLy9Xcml0ZQorCQkJaWYgKChzc2NhbmYodGhpc19jaGFyLCAiJWQiLCAmKGJicElkKSkgPT0gMSkgJiYgKHNzY2FuZih2YWx1ZSwgIiV4IiwgJihiYnBWYWx1ZSkpID09IDEpKQorCQkJeworCQkJCWlmIChiYnBJZCA8PSAxMzYpCisJCQkJeworI2lmZGVmIFJBTElOS19BVEUKKwkJCQkJaWYgKEFURV9PTihwQWRhcHRlcikpCisJCQkJCXsKKwkJCQkJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWRhcHRlciwgYmJwSWQsIGJicFZhbHVlKTsKKwkJCQkJCS8vUmVhZCBpdCBiYWNrIGZvciBzaG93aW5nCisJCQkJCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWRhcHRlciwgYmJwSWQsICZyZWdCQlApOworCQkJCQl9CisJCQkJCWVsc2UKKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisJCQkJCXsKKwkJCQkJICAgIFJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkYXB0ZXIsIGJicElkLCBiYnBWYWx1ZSk7CisgICAgCQkJCQkvL1JlYWQgaXQgYmFjayBmb3Igc2hvd2luZworICAgIAkJCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZGFwdGVyLCBiYnBJZCwgJnJlZ0JCUCk7CisJCQl9CisJCQkJCXNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlIlMDJkWzB4JTAyWF06JTAyWFxuIiwgYmJwSWQsIGJicElkKjIsIHJlZ0JCUCk7CisgICAgICAgICAgICAgICAgICAgIHdycS0+bGVuZ3RoID0gc3RybGVuKGV4dHJhKSArIDE7IC8vIDE6IHNpemUgb2YgJ1wwJworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJtc2c9JXNcbiIsIGV4dHJhKSk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7Ly9JbnZhbGlkIHBhcmFtZXRlcywgc28gZGVmYXVsdCBwcmludGsgYWxsIGJicAorCQkJCQliSXNQcmludEFsbEJCUCA9IFRSVUU7CisJCQkJCWdvdG8gbmV4dDsKKwkJCQl9CisJCQl9CisJCQllbHNlCisJCQl7IC8vSW52YWxpZCBwYXJhbWV0ZXMsIHNvIGRlZmF1bHQgcHJpbnRrIGFsbCBiYnAKKwkJCQliSXNQcmludEFsbEJCUCA9IFRSVUU7CisJCQkJZ290byBuZXh0OworCQkJfQorCQl9CisJCX0KKwllbHNlCisJCWJJc1ByaW50QWxsQkJQID0gVFJVRTsKKworbmV4dDoKKwlpZiAoYklzUHJpbnRBbGxCQlApCisJeworCQltZW1zZXQoZXh0cmEsIDB4MDAsIElXX1BSSVZfU0laRV9NQVNLKTsKKwkJc3ByaW50ZihleHRyYSwgIlxuIik7CisJCWZvciAoYmJwSWQgPSAwOyBiYnBJZCA8PSAxMzY7IGJicElkKyspCisJCXsKKwkJICAgIGlmIChzdHJsZW4oZXh0cmEpID49IChJV19QUklWX1NJWkVfTUFTSyAtIDEwKSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyNpZmRlZiBSQUxJTktfQVRFCisJCQlpZiAoQVRFX09OKHBBZGFwdGVyKSkKKwkJCXsKKwkJCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWRhcHRlciwgYmJwSWQsICZyZWdCQlApOworCQkJfQorCQkJZWxzZQorI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKwkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWRhcHRlciwgYmJwSWQsICZyZWdCQlApOworCQkJc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiUiUwMmRbMHglMDJYXTolMDJYICAgICIsIGJicElkLCBiYnBJZCoyLCByZWdCQlApOworCQkJaWYgKGJicElkJTUgPT0gNCkKKwkJCQlzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJcbiIpOworCQl9CisKKyAgICAgICAgd3JxLT5sZW5ndGggPSBzdHJsZW4oZXh0cmEpICsgMTsgLy8gMTogc2l6ZSBvZiAnXDAnCisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIndycS0+bGVuZ3RoID0gJWRcbiIsIHdycS0+bGVuZ3RoKSk7CisJfQorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPD09cnRfcHJpdmF0ZV9pb2N0bF9iYnBcblxuIikpOworCisgICAgcmV0dXJuIFN0YXR1czsKK30KKyNlbmRpZiAvLyBEQkcgLy8KKworaW50IHJ0X2lvY3RsX3Npd3JhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQl1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKyAgICBQUlRNUF9BREFQVEVSICAgcEFkID0gKFBSVE1QX0FEQVBURVIpIGRldi0+cHJpdjsKKyAgICBVSU5UMzIgICAgICAgICAgcmF0ZSA9IHdycXUtPmJpdHJhdGUudmFsdWUsIGZpeGVkID0gd3JxdS0+Yml0cmF0ZS5maXhlZDsKKworICAgIC8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCisJaWYoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKKwl7CisgIAkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgicnRfaW9jdGxfc2l3cmF0ZTo6TmV0d29yayBpcyBkb3duIVxuIikpOworICAgIAlyZXR1cm4gLUVORVRET1dOOworCX0KKworICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoInJ0X2lvY3RsX3Npd3JhdGU6OihyYXRlID0gJWQsIGZpeGVkID0gJWQpXG4iLCByYXRlLCBmaXhlZCkpOworICAgIC8qIHJhdGUgPSAtMSA9PiBhdXRvIHJhdGUKKyAgICAgICByYXRlID0gWCwgZml4ZWQgPSAxID0+IChmaXhlZCByYXRlIFgpCisgICAgKi8KKyAgICBpZiAocmF0ZSA9PSAtMSkKKyAgICB7CisJCS8vQXV0byBSYXRlCisJCXBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTX0FVVE87CisJCXBBZC0+U3RhQ2ZnLmJBdXRvVHhSYXRlU3dpdGNoID0gVFJVRTsKKwkJaWYgKChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlIDw9IFBIWV8xMUcpIHx8CisJCSAgICAocEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5IVFBoeU1vZGUuZmllbGQuTU9ERSA8PSBNT0RFX09GRE0pKQorCQkJUlRNUFNldERlc2lyZWRSYXRlcyhwQWQsIC0xKTsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQlTZXRDb21tb25IVChwQWQpOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpZiAoZml4ZWQpCisgICAgICAgIHsKKyAgICAgICAgCXBBZC0+U3RhQ2ZnLmJBdXRvVHhSYXRlU3dpdGNoID0gRkFMU0U7CisgICAgICAgICAgICBpZiAoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPD0gUEhZXzExRykgfHwKKyAgICAgICAgICAgICAgICAocEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5IVFBoeU1vZGUuZmllbGQuTU9ERSA8PSBNT0RFX09GRE0pKQorICAgICAgICAgICAgICAgIFJUTVBTZXREZXNpcmVkUmF0ZXMocEFkLCByYXRlKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU19BVVRPOworI2lmZGVmIERPVDExX05fU1VQUE9SVAorICAgICAgICAgICAgICAgIFNldENvbW1vbkhUKHBBZCk7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisgICAgICAgICAgICB9CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJydF9pb2N0bF9zaXdyYXRlOjooSHRNY3M9JWQpXG4iLHBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvLyBUT0RPOiByYXRlID0gWCwgZml4ZWQgPSAwID0+IChyYXRlcyA8PSBYKQorICAgICAgICAgICAgcmV0dXJuIC1FT1BOT1RTVVBQOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBydF9pb2N0bF9naXdyYXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKyAgICBQUlRNUF9BREFQVEVSICAgcEFkID0gKFBSVE1QX0FEQVBURVIpIGRldi0+cHJpdjsKKyAgICBpbnQgcmF0ZV9pbmRleCA9IDAsIHJhdGVfY291bnQgPSAwOworICAgIEhUVFJBTlNNSVRfU0VUVElORyBodF9zZXR0aW5nOworICAgIF9fczMyIHJhbGlua3JhdGVbXSA9CisJezIsICA0LCAgIDExLCAgMjIsIC8vIENDSworCTEyLCAxOCwgICAyNCwgIDM2LCA0OCwgNzIsIDk2LCAxMDgsIC8vIE9GRE0KKwkxMywgMjYsICAgMzksICA1MiwgIDc4LCAxMDQsIDExNywgMTMwLCAyNiwgIDUyLCAgNzgsIDEwNCwgMTU2LCAyMDgsIDIzNCwgMjYwLCAvLyAyME1IeiwgODAwbnMgR0ksIE1DUzogMCB+IDE1CisJMzksIDc4LCAgMTE3LCAxNTYsIDIzNCwgMzEyLCAzNTEsIDM5MCwJCQkJCQkJCQkJICAvLyAyME1IeiwgODAwbnMgR0ksIE1DUzogMTYgfiAyMworCTI3LCA1NCwgICA4MSwgMTA4LCAxNjIsIDIxNiwgMjQzLCAyNzAsIDU0LCAxMDgsIDE2MiwgMjE2LCAzMjQsIDQzMiwgNDg2LCA1NDAsIC8vIDQwTUh6LCA4MDBucyBHSSwgTUNTOiAwIH4gMTUKKwk4MSwgMTYyLCAyNDMsIDMyNCwgNDg2LCA2NDgsIDcyOSwgODEwLAkJCQkJCQkJCQkgIC8vIDQwTUh6LCA4MDBucyBHSSwgTUNTOiAxNiB+IDIzCisJMTQsIDI5LCAgIDQzLCAgNTcsICA4NywgMTE1LCAxMzAsIDE0NCwgMjksIDU5LCAgIDg3LCAxMTUsIDE3MywgMjMwLCAyNjAsIDI4OCwgLy8gMjBNSHosIDQwMG5zIEdJLCBNQ1M6IDAgfiAxNQorCTQzLCA4NywgIDEzMCwgMTczLCAyNjAsIDMxNywgMzkwLCA0MzMsCQkJCQkJCQkJCSAgLy8gMjBNSHosIDQwMG5zIEdJLCBNQ1M6IDE2IH4gMjMKKwkzMCwgNjAsICAgOTAsIDEyMCwgMTgwLCAyNDAsIDI3MCwgMzAwLCA2MCwgMTIwLCAxODAsIDI0MCwgMzYwLCA0ODAsIDU0MCwgNjAwLCAvLyA0ME1IeiwgNDAwbnMgR0ksIE1DUzogMCB+IDE1CisJOTAsIDE4MCwgMjcwLCAzNjAsIDU0MCwgNzIwLCA4MTAsIDkwMH07CQkJCQkJCQkJCSAgLy8gNDBNSHosIDQwMG5zIEdJLCBNQ1M6IDE2IH4gMjMKKworICAgIHJhdGVfY291bnQgPSBzaXplb2YocmFsaW5rcmF0ZSkvc2l6ZW9mKF9fczMyKTsKKyAgICAvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgorCWlmKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCisJeworICAJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKyAgICAJcmV0dXJuIC1FTkVURE9XTjsKKwl9CisKKyAgICBpZiAoKHBBZC0+U3RhQ2ZnLmJBdXRvVHhSYXRlU3dpdGNoID09IEZBTFNFKSAmJgorICAgICAgICAoSU5GUkFfT04ocEFkKSkgJiYKKyAgICAgICAgKChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlIDw9IFBIWV8xMUcpIHx8IChwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkhUUGh5TW9kZS5maWVsZC5NT0RFIDw9IE1PREVfT0ZETSkpKQorICAgICAgICBodF9zZXR0aW5nLndvcmQgPSBwQWQtPlN0YUNmZy5IVFBoeU1vZGUud29yZDsKKyAgICBlbHNlCisgICAgICAgIGh0X3NldHRpbmcud29yZCA9IHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLndvcmQ7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKyAgICBpZiAoaHRfc2V0dGluZy5maWVsZC5NT0RFID49IE1PREVfSFRNSVgpCisgICAgeworLy8gICAgCXJhdGVfaW5kZXggPSAxMiArICgoVUNIQVIpaHRfc2V0dGluZy5maWVsZC5CVyAqMTYpICsgKChVQ0hBUilodF9zZXR0aW5nLmZpZWxkLlNob3J0R0kgKjMyKSArICgoVUNIQVIpaHRfc2V0dGluZy5maWVsZC5NQ1MpOworICAgIAlyYXRlX2luZGV4ID0gMTIgKyAoKFVDSEFSKWh0X3NldHRpbmcuZmllbGQuQlcgKjI0KSArICgoVUNIQVIpaHRfc2V0dGluZy5maWVsZC5TaG9ydEdJICo0OCkgKyAoKFVDSEFSKWh0X3NldHRpbmcuZmllbGQuTUNTKTsKKyAgICB9CisgICAgZWxzZQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworICAgIGlmIChodF9zZXR0aW5nLmZpZWxkLk1PREUgPT0gTU9ERV9PRkRNKQorICAgIAlyYXRlX2luZGV4ID0gKFVDSEFSKShodF9zZXR0aW5nLmZpZWxkLk1DUykgKyA0OworICAgIGVsc2UgaWYgKGh0X3NldHRpbmcuZmllbGQuTU9ERSA9PSBNT0RFX0NDSykKKyAgICAJcmF0ZV9pbmRleCA9IChVQ0hBUikoaHRfc2V0dGluZy5maWVsZC5NQ1MpOworCisgICAgaWYgKHJhdGVfaW5kZXggPCAwKQorICAgICAgICByYXRlX2luZGV4ID0gMDsKKworICAgIGlmIChyYXRlX2luZGV4ID4gcmF0ZV9jb3VudCkKKyAgICAgICAgcmF0ZV9pbmRleCA9IHJhdGVfY291bnQ7CisKKyAgICB3cnF1LT5iaXRyYXRlLnZhbHVlID0gcmFsaW5rcmF0ZVtyYXRlX2luZGV4XSAqIDUwMDAwMDsKKyAgICB3cnF1LT5iaXRyYXRlLmRpc2FibGVkID0gMDsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgY29uc3QgaXdfaGFuZGxlciBydF9oYW5kbGVyW10gPQoreworCShpd19oYW5kbGVyKSBOVUxMLAkJCSAgICAgICAgICAgIC8qIFNJT0NTSVdDT01NSVQgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3bmFtZSwJCQkvKiBTSU9DR0lXTkFNRSAgICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkJICAgICAgICAgICAgLyogU0lPQ1NJV05XSUQgICAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJCSAgICAgICAgICAgIC8qIFNJT0NHSVdOV0lEICAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfc2l3ZnJlcSwJCSAgICAvKiBTSU9DU0lXRlJFUSAgICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX2dpd2ZyZXEsCQkgICAgLyogU0lPQ0dJV0ZSRVEgICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9zaXdtb2RlLAkJICAgIC8qIFNJT0NTSVdNT0RFICAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3bW9kZSwJCSAgICAvKiBTSU9DR0lXTU9ERSAgICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkgICAgICAgICAgICAgICAgLyogU0lPQ1NJV1NFTlMgICAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJICAgICAgICAgICAgICAgIC8qIFNJT0NHSVdTRU5TICAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCAvKiBub3QgdXNlZCAqLywJCS8qIFNJT0NTSVdSQU5HRSAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3cmFuZ2UsCQkgICAgLyogU0lPQ0dJV1JBTkdFICAqLworCShpd19oYW5kbGVyKSBOVUxMIC8qIG5vdCB1c2VkICovLAkJLyogU0lPQ1NJV1BSSVYgICAqLworCShpd19oYW5kbGVyKSBOVUxMIC8qIGtlcm5lbCBjb2RlICovLCAgICAvKiBTSU9DR0lXUFJJViAgICovCisJKGl3X2hhbmRsZXIpIE5VTEwgLyogbm90IHVzZWQgKi8sCQkvKiBTSU9DU0lXU1RBVFMgICovCisJKGl3X2hhbmRsZXIpIHJ0Mjh4eF9nZXRfd2lyZWxlc3Nfc3RhdHMgLyoga2VybmVsIGNvZGUgKi8sICAgIC8qIFNJT0NHSVdTVEFUUyAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCSAgICAgICAgICAgICAgICAvKiBTSU9DU0lXU1BZICAgICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkgICAgICAgICAgICAgICAgLyogU0lPQ0dJV1NQWSAgICAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJCQkgICAgICAgIC8qIFNJT0NTSVdUSFJTUFkgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCQkJICAgICAgICAvKiBTSU9DR0lXVEhSU1BZICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3Npd2FwLCAgICAgICAgICAgIC8qIFNJT0NTSVdBUCAgICAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3YXAsCQkgICAgLyogU0lPQ0dJV0FQICAgICAqLworI2lmZGVmIFNJT0NTSVdNTE1FCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3Npd21sbWUsCSAgICAgICAgLyogU0lPQ1NJV01MTUUgICAqLworI2Vsc2UKKwkoaXdfaGFuZGxlcikgTlVMTCwJCQkJICAgICAgICAvKiBTSU9DU0lXTUxNRSAqLworI2VuZGlmIC8vIFNJT0NTSVdNTE1FIC8vCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX2l3YXBsaXN0LAkJICAgIC8qIFNJT0NHSVdBUExJU1QgKi8KKyNpZmRlZiBTSU9DR0lXU0NBTgorCShpd19oYW5kbGVyKSBydF9pb2N0bF9zaXdzY2FuLAkJICAgIC8qIFNJT0NTSVdTQ0FOICAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3c2NhbiwJCSAgICAvKiBTSU9DR0lXU0NBTiAgICovCisjZWxzZQorCShpd19oYW5kbGVyKSBOVUxMLAkJCQkgICAgICAgIC8qIFNJT0NTSVdTQ0FOICAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCQkJICAgICAgICAvKiBTSU9DR0lXU0NBTiAgICovCisjZW5kaWYgLyogU0lPQ0dJV1NDQU4gKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfc2l3ZXNzaWQsCQkgICAgLyogU0lPQ1NJV0VTU0lEICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9naXdlc3NpZCwJCSAgICAvKiBTSU9DR0lXRVNTSUQgICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3Npd25pY2tuLAkJICAgIC8qIFNJT0NTSVdOSUNLTiAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3bmlja24sCQkgICAgLyogU0lPQ0dJV05JQ0tOICAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJCQkgICAgICAgIC8qIC0tIGhvbGUgLS0gICAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCQkJICAgICAgICAvKiAtLSBob2xlIC0tICAgICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3Npd3JhdGUsICAgICAgICAgIC8qIFNJT0NTSVdSQVRFICAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3cmF0ZSwgICAgICAgICAgLyogU0lPQ0dJV1JBVEUgICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9zaXdydHMsCQkgICAgLyogU0lPQ1NJV1JUUyAgICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9naXdydHMsCQkgICAgLyogU0lPQ0dJV1JUUyAgICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9zaXdmcmFnLAkJICAgIC8qIFNJT0NTSVdGUkFHICAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3ZnJhZywJCSAgICAvKiBTSU9DR0lXRlJBRyAgICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkgICAgICAgICAgICAgICAgLyogU0lPQ1NJV1RYUE9XICAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJICAgICAgICAgICAgICAgIC8qIFNJT0NHSVdUWFBPVyAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCSAgICAgICAgICAgICAgICAvKiBTSU9DU0lXUkVUUlkgICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkgICAgICAgICAgICAgICAgLyogU0lPQ0dJV1JFVFJZICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9zaXdlbmNvZGUsCQkvKiBTSU9DU0lXRU5DT0RFICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX2dpd2VuY29kZSwJCS8qIFNJT0NHSVdFTkNPREUgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCSAgICAgICAgICAgICAgICAvKiBTSU9DU0lXUE9XRVIgICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkgICAgICAgICAgICAgICAgLyogU0lPQ0dJV1BPV0VSICAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJCQkJCS8qIC0tIGhvbGUgLS0gKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCQkJCQkvKiAtLSBob2xlIC0tICovCisjaWYgV0lSRUxFU1NfRVhUID4gMTcKKyAgICAoaXdfaGFuZGxlcikgcnRfaW9jdGxfc2l3Z2VuaWUsICAgICAgICAgLyogU0lPQ1NJV0dFTklFICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9naXdnZW5pZSwgICAgICAgICAvKiBTSU9DR0lXR0VOSUUgICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3Npd2F1dGgsCQkgICAgLyogU0lPQ1NJV0FVVEggICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9naXdhdXRoLAkJICAgIC8qIFNJT0NHSVdBVVRIICAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfc2l3ZW5jb2RlZXh0LAkgICAgLyogU0lPQ1NJV0VOQ09ERUVYVCAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9naXdlbmNvZGVleHQsCQkvKiBTSU9DR0lXRU5DT0RFRVhUICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3Npd3Bta3NhLCAgICAgICAgIC8qIFNJT0NTSVdQTUtTQSAgKi8KKyNlbmRpZgorfTsKKworc3RhdGljIGNvbnN0IGl3X2hhbmRsZXIgcnRfcHJpdl9oYW5kbGVyc1tdID0geworCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MDAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDAxICovCisjaWZuZGVmIENPTkZJR19BUF9TVVBQT1JUCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3NldHBhcmFtLCAvKiArIDB4MDIgKi8KKyNlbHNlCisJKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgwMiAqLworI2VuZGlmIC8vIENPTkZJR19BUF9TVVBQT1JUIC8vCisjaWZkZWYgREJHCisJKGl3X2hhbmRsZXIpIHJ0X3ByaXZhdGVfaW9jdGxfYmJwLCAvKiArIDB4MDMgKi8KKyNlbHNlCisJKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgwMyAqLworI2VuZGlmCisJKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgwNCAqLworCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MDUgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDA2ICovCisJKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgwNyAqLworCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MDggKi8KKwkoaXdfaGFuZGxlcikgcnRfcHJpdmF0ZV9nZXRfc3RhdGlzdGljcywgLyogKyAweDA5ICovCisJKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgwQSAqLworCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MEIgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDBDICovCisJKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgwRCAqLworCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MEUgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDBGICovCisJKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgxMCAqLworCShpd19oYW5kbGVyKSBydF9wcml2YXRlX3Nob3csIC8qICsgMHgxMSAqLworICAgIChpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MTIgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDEzICovCisJKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgxNSAqLworCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MTcgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDE4ICovCit9OworCitjb25zdCBzdHJ1Y3QgaXdfaGFuZGxlcl9kZWYgcnQyOHh4X2l3X2hhbmRsZXJfZGVmID0KK3sKKyNkZWZpbmUJTihhKQkoc2l6ZW9mIChhKSAvIHNpemVvZiAoYVswXSkpCisJLnN0YW5kYXJkCT0gKGl3X2hhbmRsZXIgKikgcnRfaGFuZGxlciwKKwkubnVtX3N0YW5kYXJkCT0gc2l6ZW9mKHJ0X2hhbmRsZXIpIC8gc2l6ZW9mKGl3X2hhbmRsZXIpLAorCS5wcml2YXRlCT0gKGl3X2hhbmRsZXIgKikgcnRfcHJpdl9oYW5kbGVycywKKwkubnVtX3ByaXZhdGUJCT0gTihydF9wcml2X2hhbmRsZXJzKSwKKwkucHJpdmF0ZV9hcmdzCT0gKHN0cnVjdCBpd19wcml2X2FyZ3MgKikgcHJpdnRhYiwKKwkubnVtX3ByaXZhdGVfYXJncwk9IE4ocHJpdnRhYiksCisjaWYgSVdfSEFORExFUl9WRVJTSU9OID49IDcKKyAgICAuZ2V0X3dpcmVsZXNzX3N0YXRzID0gcnQyOHh4X2dldF93aXJlbGVzc19zdGF0cywKKyNlbmRpZgorfTsKKworSU5UIFJUTVBTZXRJbmZvcm1hdGlvbigKKyAgICBJTiAgUFJUTVBfQURBUFRFUiBwQWRhcHRlciwKKyAgICBJTiAgT1VUIHN0cnVjdCBpZnJlcSAgICAqcnEsCisgICAgSU4gIElOVCAgICAgICAgICAgICAgICAgY21kKQoreworICAgIHN0cnVjdCBpd3JlcSAgICAgICAgICAgICAgICAgICAgICAgICp3cnEgPSAoc3RydWN0IGl3cmVxICopIHJxOworICAgIE5ESVNfODAyXzExX1NTSUQgICAgICAgICAgICAgICAgICAgIFNzaWQ7CisgICAgTkRJU184MDJfMTFfTUFDX0FERFJFU1MgICAgICAgICAgICAgQnNzaWQ7CisgICAgUlRfODAyXzExX1BIWV9NT0RFICAgICAgICAgICAgICAgICAgUGh5TW9kZTsKKyAgICBSVF84MDJfMTFfU1RBX0NPTkZJRyAgICAgICAgICAgICAgICBTdGFDb25maWc7CisgICAgTkRJU184MDJfMTFfUkFURVMgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXM7CisgICAgUlRfODAyXzExX1BSRUFNQkxFICAgICAgICAgICAgICAgICAgUHJlYW1ibGU7CisgICAgTkRJU184MDJfMTFfV0VQX1NUQVRVUyAgICAgICAgICAgICAgV2VwU3RhdHVzOworICAgIE5ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREUgICAgIEF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlTWF4OworICAgIE5ESVNfODAyXzExX05FVFdPUktfSU5GUkFTVFJVQ1RVUkUgIEJzc1R5cGU7CisgICAgTkRJU184MDJfMTFfUlRTX1RIUkVTSE9MRCAgICAgICAgICAgUnRzVGhyZXNoOworICAgIE5ESVNfODAyXzExX0ZSQUdNRU5UQVRJT05fVEhSRVNIT0xEIEZyYWdUaHJlc2g7CisgICAgTkRJU184MDJfMTFfUE9XRVJfTU9ERSAgICAgICAgICAgICAgUG93ZXJNb2RlOworICAgIFBORElTXzgwMl8xMV9LRVkgICAgICAgICAgICAgICAgICAgIHBLZXkgPSBOVUxMOworICAgIFBORElTXzgwMl8xMV9XRVAJCQkgICAgICAgIHBXZXBLZXkgPU5VTEw7CisgICAgUE5ESVNfODAyXzExX1JFTU9WRV9LRVkgICAgICAgICAgICAgcFJlbW92ZUtleSA9IE5VTEw7CisgICAgTkRJU184MDJfMTFfQ09ORklHVVJBVElPTiAgICAgICAgICAgQ29uZmlnLCAqcENvbmZpZyA9IE5VTEw7CisgICAgTkRJU184MDJfMTFfTkVUV09SS19UWVBFICAgICAgICAgICAgTmV0VHlwZTsKKyAgICBVTE9ORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3c7CisgICAgVUlOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5SWR4ID0gMDsKKyAgICBJTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTLCBNYXhQaHlNb2RlID0gUEhZXzExRzsKKyAgICBVTE9ORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb3dlclRlbXA7CisgICAgQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmFkaW9TdGF0ZTsKKyAgICBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0ZU1hY2hpbmVUb3VjaGVkID0gRkFMU0U7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJT0lEX1NFVF9IVF9QSFlNT0RFCQkJCQlIVF9QaHlNb2RlOwkvLzExbiAsa2F0aHkKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgUE5ESVNfODAyXzExX1BNS0lEICAgICAgICAgICAgICAgICAgcFBta0lkID0gTlVMTDsKKyAgICBCT09MRUFOCQkJCSAgICAgICAgICAgICAgICBJRUVFODAyMXhTdGF0ZSA9IEZBTFNFOworICAgIEJPT0xFQU4JCQkJICAgICAgICAgICAgICAgIElFRUU4MDIxeF9yZXF1aXJlZF9rZXlzID0gRkFMU0U7CisgICAgVUNIQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3BhX3N1cHBsaWNhbnRfZW5hYmxlID0gMDsKKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisKKyNpZmRlZiBTTk1QX1NVUFBPUlQKKwlUWF9SVFlfQ0ZHX1NUUlVDCQkJdHhfcnR5X2NmZzsKKwlVTE9ORwkJCQkJCVNob3J0UmV0cnlMaW1pdCwgTG9uZ1JldHJ5TGltaXQ7CisJVUNIQVIJCQkJCQljdG1wOworI2VuZGlmIC8vIFNOTVBfU1VQUE9SVCAvLworCisKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCU1heFBoeU1vZGUgPSBQSFlfMTFOXzVHOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLT5SVE1QU2V0SW5mb3JtYXRpb24oKSwJMHglMDh4XG4iLCBjbWQmMHg3RkZGKSk7CisgICAgc3dpdGNoKGNtZCAmIDB4N0ZGRikgeworICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfQ09VTlRSWV9SRUdJT046CisgICAgICAgICAgICBpZiAod3JxLT51LmRhdGEubGVuZ3RoIDwgc2l6ZW9mKFVDSEFSKSkKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUlOVkFMOworCQkJLy8gT25seSBhdmFsaWFibGUgd2hlbiBFRVBST00gbm90IHByb2dyYW1taW5nCisgICAgICAgICAgICBlbHNlIGlmICghKHBBZGFwdGVyLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbiAmIDB4ODApICYmICEocEFkYXB0ZXItPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uRm9yQUJhbmQgJiAweDgwKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBVTE9ORyAgIENvdW50cnk7CisgICAgICAgICAgICAgICAgVUNIQVIJVG1wUGh5OworCisJCQkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJkNvdW50cnksIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uID0gKFVDSEFSKShDb3VudHJ5ICYgMHgwMDAwMDBGRik7CisJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uRm9yQUJhbmQgPSAoVUNIQVIpKChDb3VudHJ5ID4+IDgpICYgMHgwMDAwMDBGRik7CisgICAgICAgICAgICAgICAgVG1wUGh5ID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5QaHlNb2RlOworCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuUGh5TW9kZSA9IDB4ZmY7CisJCQkJLy8gQnVpbGQgYWxsIGNvcnJlc3BvbmRpbmcgY2hhbm5lbCBpbmZvcm1hdGlvbgorCQkJCVJUTVBTZXRQaHlNb2RlKHBBZGFwdGVyLCBUbXBQaHkpOworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJCVNldENvbW1vbkhUKHBBZGFwdGVyKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OlJUX09JRF84MDJfMTFfQ09VTlRSWV9SRUdJT04gKEE6JWQgIEIvRzolZClcbiIsIHBBZGFwdGVyLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbkZvckFCYW5kLAorCQkJCSAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb24pKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfQlNTSURfTElTVF9TQ0FOOgorICNpZmRlZiBSQUxJTktfQVRFCisJCQlpZiAoQVRFX09OKHBBZGFwdGVyKSkKKwkJCXsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJUaGUgZHJpdmVyIGlzIGluIEFURSBtb2RlIG5vd1xuIikpOworCQkJCWJyZWFrOworCQkJfQorI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKyAgICAgICAgICAgIE5vdyA9IGppZmZpZXM7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfQlNTSURfTElTVF9TQ0FOLCBUeENudCA9ICVkIFxuIiwgcEFkYXB0ZXItPlJhbGlua0NvdW50ZXJzLkxhc3RPbmVTZWNUb3RhbFR4Q291bnQpKTsKKworICAgICAgICAgICAgaWYgKE1PTklUT1JfT04ocEFkYXB0ZXIpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISBEcml2ZXIgaXMgaW4gTW9uaXRvciBNb2RlIG5vdyAhISFcbiIpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworCQkJLy9CZW5zb24gYWRkIDIwMDgwNTI3LCB3aGVuIHJhZGlvIG9mZiwgc3RhIGRvbid0IG5lZWQgdG8gc2NhbgorCQkJaWYgKFJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX1JBRElPX09GRikpCisJCQkJYnJlYWs7CisKKwkJCWlmIChSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUykpCisJCQl7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIERyaXZlciBpcyBzY2FubmluZyBub3cgISEhXG4iKSk7CisJCQkJcEFkYXB0ZXItPlN0YUNmZy5iU2NhblJlcUlzRnJvbVdlYlVJID0gVFJVRTsKKwkJCQlTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisJCQlpZiAocEFkYXB0ZXItPlJhbGlua0NvdW50ZXJzLkxhc3RPbmVTZWNUb3RhbFR4Q291bnQgPiAxMDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIExpbmsgVVAsIGlnbm9yZSB0aGlzIHNldDo6T0lEXzgwMl8xMV9CU1NJRF9MSVNUX1NDQU5cbiIpKTsKKwkJCQlTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworCQkJCXBBZGFwdGVyLT5TdGFDZmcuU2NhbkNudCA9IDk5OwkJLy8gUHJldmVudCBhdXRvIHNjYW4gdHJpZ2dlcmVkIGJ5IHRoaXMgT0lECisJCQkJYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICgoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZGFwdGVyLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCkpICYmCisJCQkJKChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkgfHwKKwkJCQkocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spIHx8CisJCQkJKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikgfHwKKwkJCQkocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKSkgJiYKKyAgICAgICAgICAgICAgICAocEFkYXB0ZXItPlN0YUNmZy5Qb3J0U2VjdXJlZCA9PSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISBMaW5rIFVQLCBQb3J0IE5vdCBTZWN1cmVkISBpZ25vcmUgdGhpcyBzZXQ6Ok9JRF84MDJfMTFfQlNTSURfTElTVF9TQ0FOXG4iKSk7CisJCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKwkJCQlwQWRhcHRlci0+U3RhQ2ZnLlNjYW5DbnQgPSA5OTsJCS8vIFByZXZlbnQgYXV0byBzY2FuIHRyaWdnZXJlZCBieSB0aGlzIE9JRAorCQkJCWJyZWFrOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIGlmIChwQWRhcHRlci0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgIT0gQ05UTF9JRExFKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFJUMjhYWF9NTE1FX1JFU0VUX1NUQVRFX01BQ0hJTkUocEFkYXB0ZXIpOworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISBNTE1FIGJ1c3ksIHJlc2V0IE1MTUUgc3RhdGUgbWFjaGluZSAhISFcbiIpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gdGVsbCBDTlRMIHN0YXRlIG1hY2hpbmUgdG8gY2FsbCBOZGlzTVNldEluZm9ybWF0aW9uQ29tcGxldGUoKSBhZnRlciBjb21wbGV0aW5nCisgICAgICAgICAgICAvLyB0aGlzIHJlcXVlc3QsIGJlY2F1c2UgdGhpcyByZXF1ZXN0IGlzIGluaXRpYXRlZCBieSBORElTLgorICAgICAgICAgICAgcEFkYXB0ZXItPk1sbWVBdXguQ3VyclJlcUlzRnJvbU5kaXMgPSBGQUxTRTsKKyAgICAgICAgICAgIC8vIFJlc2V0IGFsbG93ZWQgc2NhbiByZXRyaWVzCisgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLlNjYW5DbnQgPSAwOworICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5MYXN0U2NhblRpbWUgPSBOb3c7CisKKwkJCXBBZGFwdGVyLT5TdGFDZmcuYlNjYW5SZXFJc0Zyb21XZWJVSSA9IFRSVUU7CisgICAgICAgICAgICBSVE1QX1NFVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKTsKKyAgICAgICAgICAgIE1sbWVFbnF1ZXVlKHBBZGFwdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsCisgICAgICAgICAgICAgICAgICAgICAgICBPSURfODAyXzExX0JTU0lEX0xJU1RfU0NBTiwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKworICAgICAgICAgICAgU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKyAgICAgICAgICAgIFN0YXRlTWFjaGluZVRvdWNoZWQgPSBUUlVFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9TU0lEOgorICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoTkRJU184MDJfMTFfU1NJRCkpCisgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAlQQ0hBUiBwU3NpZFN0cmluZyA9IE5VTEw7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJlNzaWQsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfU1NJRCAoTGVuPSVkLFNzaWQ9JXMpXG4iLCBTc2lkLlNzaWRMZW5ndGgsIFNzaWQuU3NpZCkpOworICAgICAgICAgICAgICAgIGlmIChTc2lkLlNzaWRMZW5ndGggPiBNQVhfTEVOX09GX1NTSUQpCisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAJaWYgKFNzaWQuU3NpZExlbmd0aCA9PSAwKQorICAgICAgICAgICAgICAgIAl7CisgICAgICAgICAgICAgICAgCQlTZXRfU1NJRF9Qcm9jKHBBZGFwdGVyLCAiIik7CisgICAgICAgICAgICAgICAgCX0KKwkJCQkJZWxzZQorICAgICAgICAgICAgICAgIAl7CisJICAgICAgICAgICAgICAgIAlwU3NpZFN0cmluZyA9IChDSEFSICopIGttYWxsb2MoTUFYX0xFTl9PRl9TU0lEKzEsIE1FTV9BTExPQ19GTEFHKTsKKwkJCQkJCWlmIChwU3NpZFN0cmluZykKKwkJCQkJCXsKKwkJCQkJCQlOZGlzWmVyb01lbW9yeShwU3NpZFN0cmluZywgTUFYX0xFTl9PRl9TU0lEKzEpOworCQkJCQkJCU5kaXNNb3ZlTWVtb3J5KHBTc2lkU3RyaW5nLCBTc2lkLlNzaWQsIFNzaWQuU3NpZExlbmd0aCk7CisJICAgICAgICAgICAgICAgIAkJU2V0X1NTSURfUHJvYyhwQWRhcHRlciwgcFNzaWRTdHJpbmcpOworCQkJCQkJCWtmcmVlKHBTc2lkU3RyaW5nKTsKKwkJCQkJCX0KKwkJCQkJCWVsc2UKKwkJCQkJCQlTdGF0dXMgPSAtRU5PTUVNOworICAgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9CU1NJRDoKKyNpZmRlZiBSQUxJTktfQVRFCisJCQlpZiAoQVRFX09OKHBBZGFwdGVyKSkKKwkJCXsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJUaGUgZHJpdmVyIGlzIGluIEFURSBtb2RlIG5vd1xuIikpOworCQkJCWJyZWFrOworCQkJfQorI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKyAgICAgICAgICAgIGlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKE5ESVNfODAyXzExX01BQ19BRERSRVNTKSkKKyAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmQnNzaWQsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisKKyAgICAgICAgICAgICAgICAvLyB0ZWxsIENOVEwgc3RhdGUgbWFjaGluZSB0byBjYWxsIE5kaXNNU2V0SW5mb3JtYXRpb25Db21wbGV0ZSgpIGFmdGVyIGNvbXBsZXRpbmcKKyAgICAgICAgICAgICAgICAvLyB0aGlzIHJlcXVlc3QsIGJlY2F1c2UgdGhpcyByZXF1ZXN0IGlzIGluaXRpYXRlZCBieSBORElTLgorICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5NbG1lQXV4LkN1cnJSZXFJc0Zyb21OZGlzID0gRkFMU0U7CisKKwkJCQkvLyBQcmV2ZW50IHRvIGNvbm5lY3QgQVAgYWdhaW4gaW4gU1RBTWxtZVBlcmlvZGljRXhlYworCQkJCXBBZGFwdGVyLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuPSAzMjsKKworICAgICAgICAgICAgICAgIC8vIFJlc2V0IGFsbG93ZWQgc2NhbiByZXRyaWVzCisJCQkJcEFkYXB0ZXItPlN0YUNmZy5TY2FuQ250ID0gMDsKKworICAgICAgICAgICAgICAgIGlmIChwQWRhcHRlci0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgIT0gQ05UTF9JRExFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgUlQyOFhYX01MTUVfUkVTRVRfU1RBVEVfTUFDSElORShwQWRhcHRlcik7CisgICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISBNTE1FIGJ1c3ksIHJlc2V0IE1MTUUgc3RhdGUgbWFjaGluZSAhISFcbiIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgTWxtZUVucXVldWUocEFkYXB0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0lEXzgwMl8xMV9CU1NJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoTkRJU184MDJfMTFfTUFDX0FERFJFU1MpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChWT0lEICopJkJzc2lkKTsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworICAgICAgICAgICAgICAgIFN0YXRlTWFjaGluZVRvdWNoZWQgPSBUUlVFOworCisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX0JTU0lEICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJzc2lkWzBdLCBCc3NpZFsxXSwgQnNzaWRbMl0sIEJzc2lkWzNdLCBCc3NpZFs0XSwgQnNzaWRbNV0pKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfUkFESU86CisgICAgICAgICAgICBpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihCT09MRUFOKSkKKyAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmUmFkaW9TdGF0ZSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OlJUX09JRF84MDJfMTFfUkFESU8gKD0lZClcbiIsIFJhZGlvU3RhdGUpKTsKKyAgICAgICAgICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5iU3dSYWRpbyAhPSBSYWRpb1N0YXRlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5iU3dSYWRpbyA9IFJhZGlvU3RhdGU7CisgICAgICAgICAgICAgICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLmJSYWRpbyAhPSAocEFkYXB0ZXItPlN0YUNmZy5iSHdSYWRpbyAmJiBwQWRhcHRlci0+U3RhQ2ZnLmJTd1JhZGlvKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5iUmFkaW8gPSAocEFkYXB0ZXItPlN0YUNmZy5iSHdSYWRpbyAmJiBwQWRhcHRlci0+U3RhQ2ZnLmJTd1JhZGlvKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLmJSYWRpbyA9PSBUUlVFKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1sbWVSYWRpb09uKHBBZGFwdGVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgZXh0cmEgaW5mb3JtYXRpb24KKwkJCQkJCQlwQWRhcHRlci0+RXh0cmFJbmZvID0gRVhUUkFfSU5GT19DTEVBUjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNbG1lUmFkaW9PZmYocEFkYXB0ZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBleHRyYSBpbmZvcm1hdGlvbgorCQkJCQkJCXBBZGFwdGVyLT5FeHRyYUluZm8gPSBTV19SQURJT19PRkY7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX1BIWV9NT0RFOgorICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoUlRfODAyXzExX1BIWV9NT0RFKSkKKyAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmUGh5TW9kZSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCQlpZiAoUGh5TW9kZSA8PSBNYXhQaHlNb2RlKQorCQkJCXsKKyAgICAgICAgICAgICAgICAJUlRNUFNldFBoeU1vZGUocEFkYXB0ZXIsIFBoeU1vZGUpOworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJCQlTZXRDb21tb25IVChwQWRhcHRlcik7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCQkJfQorICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6UlRfT0lEXzgwMl8xMV9QSFlfTU9ERSAoPSVkKVxuIiwgUGh5TW9kZSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9TVEFfQ09ORklHOgorICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoUlRfODAyXzExX1NUQV9DT05GSUcpKQorICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZTdGFDb25maWcsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5iRW5hYmxlVHhCdXJzdCA9IFN0YUNvbmZpZy5FbmFibGVUeEJ1cnN0OworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuVXNlQkdQcm90ZWN0aW9uID0gU3RhQ29uZmlnLlVzZUJHUHJvdGVjdGlvbjsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLmJVc2VTaG9ydFNsb3RUaW1lID0gMTsgLy8gMjAwMy0xMC0zMCBhbHdheXMgU0hPUlQgU0xPVCBjYXBhYmxlCisgICAgICAgICAgICAgICAgaWYgKChwQWRhcHRlci0+Q29tbW9uQ2ZnLlBoeU1vZGUgIT0gU3RhQ29uZmlnLkFkaG9jTW9kZSkgJiYKKwkJCQkJKFN0YUNvbmZpZy5BZGhvY01vZGUgPD0gTWF4UGh5TW9kZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBhbGxvdyBkeW5hbWljIGNoYW5nZSBvZiAiVVNFIE9GRE0gcmF0ZSBvciBub3QiIGluIEFESE9DIG1vZGUKKyAgICAgICAgICAgICAgICAgICAgLy8gaWYgc2V0dGluZyBjaGFuZ2VkLCBuZWVkIHRvIHJlc2V0IGN1cnJlbnQgVFggcmF0ZSBhcyB3ZWxsIGFzIEJFQUNPTiBmcmFtZSBmb3JtYXQKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQnNzVHlwZSA9PSBCU1NfQURIT0MpCisgICAgICAgICAgICAgICAgICAgIHsKKwkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuUGh5TW9kZSA9IFN0YUNvbmZpZy5BZGhvY01vZGU7CisgICAgICAgICAgICAgICAgICAgIAlSVE1QU2V0UGh5TW9kZShwQWRhcHRlciwgUGh5TW9kZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBNbG1lVXBkYXRlVHhSYXRlcyhwQWRhcHRlciwgRkFMU0UsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgTWFrZUlic3NCZWFjb24ocEFkYXB0ZXIpOyAgICAgICAgICAgLy8gcmUtYnVpbGQgQkVBQ09OIGZyYW1lCisgICAgICAgICAgICAgICAgICAgICAgICBBc2ljRW5hYmxlSWJzc1N5bmMocEFkYXB0ZXIpOyAgIC8vIGNvcHkgdG8gb24tY2hpcCBtZW1vcnkKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OlJUX09JRF84MDJfMTFfU0VUX1NUQV9DT05GSUcgKEJ1cnN0PSVkLCBQcm90ZWN0aW9uPSVsZCxTaG9ydFNsb3Q9JWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5iRW5hYmxlVHhCdXJzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLlVzZUJHUHJvdGVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLmJVc2VTaG9ydFNsb3RUaW1lKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX0RFU0lSRURfUkFURVM6CisgICAgICAgICAgICBpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihORElTXzgwMl8xMV9SQVRFUykpCisgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJmFyeVJhdGVzLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgICAgIE5kaXNaZXJvTWVtb3J5KHBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlUmF0ZSwgTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVMpOworICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlUmF0ZSwgJmFyeVJhdGVzLCBzaXplb2YoTkRJU184MDJfMTFfUkFURVMpKTsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfREVTSVJFRF9SQVRFUyAoJTAyeCwlMDJ4LCUwMngsJTAyeCwlMDJ4LCUwMngsJTAyeCwlMDJ4KVxuIiwKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzBdLHBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlUmF0ZVsxXSwKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzJdLHBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlUmF0ZVszXSwKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzRdLHBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlUmF0ZVs1XSwKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzZdLHBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlUmF0ZVs3XSApKTsKKyAgICAgICAgICAgICAgICAvLyBDaGFuZ2luZyBEZXNpcmVkUmF0ZSBtYXkgYWZmZWN0IHRoZSBNQVggVFggcmF0ZSB3ZSB1c2VkIHRvIFRYIGZyYW1lcyBvdXQKKyAgICAgICAgICAgICAgICBNbG1lVXBkYXRlVHhSYXRlcyhwQWRhcHRlciwgRkFMU0UsIDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9QUkVBTUJMRToKKyAgICAgICAgICAgIGlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKFJUXzgwMl8xMV9QUkVBTUJMRSkpCisgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJlByZWFtYmxlLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgICAgIGlmIChQcmVhbWJsZSA9PSBSdDgwMl8xMVByZWFtYmxlU2hvcnQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLlR4UHJlYW1ibGUgPSBQcmVhbWJsZTsKKyAgICAgICAgICAgICAgICAgICAgTWxtZVNldFR4UHJlYW1ibGUocEFkYXB0ZXIsIFJ0ODAyXzExUHJlYW1ibGVTaG9ydCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKChQcmVhbWJsZSA9PSBSdDgwMl8xMVByZWFtYmxlTG9uZykgfHwgKFByZWFtYmxlID09IFJ0ODAyXzExUHJlYW1ibGVBdXRvKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIGlmIHVzZXIgd2FudHMgQVVUTywgaW5pdGlhbGl6ZSB0byBMT05HIGhlcmUsIHRoZW4gY2hhbmdlIGFjY29yZGluZyB0byBBUCdzCisgICAgICAgICAgICAgICAgICAgIC8vIGNhcGFiaWxpdHkgdXBvbiBhc3NvY2lhdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5UeFByZWFtYmxlID0gUHJlYW1ibGU7CisgICAgICAgICAgICAgICAgICAgIE1sbWVTZXRUeFByZWFtYmxlKHBBZGFwdGVyLCBSdDgwMl8xMVByZWFtYmxlTG9uZyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OlJUX09JRF84MDJfMTFfUFJFQU1CTEUgKD0lZClcbiIsIFByZWFtYmxlKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX1dFUF9TVEFUVVM6CisgICAgICAgICAgICBpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihORElTXzgwMl8xMV9XRVBfU1RBVFVTKSkKKyAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmV2VwU3RhdHVzLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgICAgIC8vIFNpbmNlIFRLSVAsIEFFUywgV0VQIGFyZSBhbGwgc3VwcG9ydGVkLiBJdCBzaG91bGQgbm90IGhhdmUgYW55IGludmFsaWQgc2V0dGluZworICAgICAgICAgICAgICAgIGlmIChXZXBTdGF0dXMgPD0gTmRpczgwMl8xMUVuY3J5cHRpb24zS2V5QWJzZW50KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzICE9IFdlcFN0YXR1cykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29uZmlnIGhhcyBjaGFuZ2VkCisgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+YkNvbmZpZ0NoYW5nZWQgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzICAgICA9IFdlcFN0YXR1czsKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5PcmlnV2VwU3RhdHVzID0gV2VwU3RhdHVzOworICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLlBhaXJDaXBoZXIgICAgPSBXZXBTdGF0dXM7CisgICAgICAgICAgICAgICAgCXBBZGFwdGVyLT5TdGFDZmcuR3JvdXBDaXBoZXIgICA9IFdlcFN0YXR1czsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfV0VQX1NUQVRVUyAoPSVkKVxuIixXZXBTdGF0dXMpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfQVVUSEVOVElDQVRJT05fTU9ERToKKyAgICAgICAgICAgIGlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKE5ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREUpKQorICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZBdXRoTW9kZSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBpZiAoQXV0aE1vZGUgPiBOZGlzODAyXzExQXV0aE1vZGVNYXgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlICE9IEF1dGhNb2RlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBDb25maWcgaGFzIGNoYW5nZWQKKyAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5iQ29uZmlnQ2hhbmdlZCA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IEF1dGhNb2RlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX05PVF9TRUNVUkVEOworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9BVVRIRU5USUNBVElPTl9NT0RFICg9JWQpIFxuIixwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX0lORlJBU1RSVUNUVVJFX01PREU6CisgICAgICAgICAgICBpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihORElTXzgwMl8xMV9ORVRXT1JLX0lORlJBU1RSVUNUVVJFKSkKKyAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmQnNzVHlwZSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKworCQkJCWlmIChCc3NUeXBlID09IE5kaXM4MDJfMTFJQlNTKQorCQkJCQlTZXRfTmV0d29ya1R5cGVfUHJvYyhwQWRhcHRlciwgIkFkaG9jIik7CisJCQkJZWxzZSBpZiAoQnNzVHlwZSA9PSBOZGlzODAyXzExSW5mcmFzdHJ1Y3R1cmUpCisJCQkJCVNldF9OZXR3b3JrVHlwZV9Qcm9jKHBBZGFwdGVyLCAiSW5mcmEiKTsKKwkJCQllbHNlIGlmIChCc3NUeXBlID09IE5kaXM4MDJfMTFNb25pdG9yKQorCQkJCQlTZXRfTmV0d29ya1R5cGVfUHJvYyhwQWRhcHRlciwgIk1vbml0b3IiKTsKKwkJCQllbHNlCisJCQkJeworCQkJCQlTdGF0dXMgID0gLUVJTlZBTDsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX0lORlJBU1RSVUNUVVJFX01PREUgKHVua25vd24pXG4iKSk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJIGNhc2UgT0lEXzgwMl8xMV9SRU1PVkVfV0VQOgorICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX1JFTU9WRV9XRVBcbiIpKTsKKyAgICAgICAgICAgIGlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKE5ESVNfODAyXzExX0tFWV9JTkRFWCkpCisgICAgICAgICAgICB7CisJCQkJU3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKwkJCQlLZXlJZHggPSAqKE5ESVNfODAyXzExX0tFWV9JTkRFWCAqKSB3cnEtPnUuZGF0YS5wb2ludGVyOworCisJCQkJaWYgKEtleUlkeCAmIDB4ODAwMDAwMDApCisJCQkJeworCQkJCQkvLyBTaG91bGQgbmV2ZXIgc2V0IGRlZmF1bHQgYml0IHdoZW4gcmVtb3ZlIGtleQorCQkJCQlTdGF0dXMgPSAtRUlOVkFMOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlLZXlJZHggPSBLZXlJZHggJiAweDBmZmZmZmZmOworCQkJCQlpZiAoS2V5SWR4ID49IDQpeworCQkJCQkJU3RhdHVzID0gLUVJTlZBTDsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCXBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5LZXlMZW4gPSAwOworCQkJCQkJcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLkNpcGhlckFsZyA9IENJUEhFUl9OT05FOworCQkJCQkJQXNpY1JlbW92ZVNoYXJlZEtleUVudHJ5KHBBZGFwdGVyLCAwLCAoVUNIQVIpS2V5SWR4KTsKKwkJCQkJfQorCQkJCX0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfUkVTRVRfQ09VTlRFUlM6CisgICAgICAgICAgICBOZGlzWmVyb01lbW9yeSgmcEFkYXB0ZXItPldsYW5Db3VudGVycywgc2l6ZW9mKENPVU5URVJfODAyXzExKSk7CisgICAgICAgICAgICBOZGlzWmVyb01lbW9yeSgmcEFkYXB0ZXItPkNvdW50ZXJzODAyMywgc2l6ZW9mKENPVU5URVJfODAyXzMpKTsKKyAgICAgICAgICAgIE5kaXNaZXJvTWVtb3J5KCZwQWRhcHRlci0+UmFsaW5rQ291bnRlcnMsIHNpemVvZihDT1VOVEVSX1JBTElOSykpOworICAgICAgICAgICAgcEFkYXB0ZXItPkNvdW50ZXJzODAyMy5SeE5vQnVmZmVyICAgPSAwOworCQkJcEFkYXB0ZXItPkNvdW50ZXJzODAyMy5Hb29kUmVjZWl2ZXMgPSAwOworCQkJcEFkYXB0ZXItPkNvdW50ZXJzODAyMy5SeE5vQnVmZmVyICAgPSAwOworI2lmZGVmIFJUMjg3MAorCQkJcEFkYXB0ZXItPkJ1bGtPdXRDb21wbGV0ZQk9IDA7CisJCQlwQWRhcHRlci0+QnVsa091dENvbXBsZXRlT3RoZXI9IDA7CisJCQlwQWRhcHRlci0+QnVsa091dENvbXBsZXRlQ2FuY2VsID0gMDsKKwkJCXBBZGFwdGVyLT5CdWxrT3V0UmVxID0gMDsKKwkJCXBBZGFwdGVyLT5CdWxrSW5SZXE9IDA7CisJCQlwQWRhcHRlci0+QnVsa0luQ29tcGxldGUgPSAwOworCQkJcEFkYXB0ZXItPkJ1bGtJbkNvbXBsZXRlRmFpbCA9IDA7CisjZW5kaWYgLy8gUlQyODcwIC8vCisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OlJUX09JRF84MDJfMTFfUkVTRVRfQ09VTlRFUlMgXG4iKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX1JUU19USFJFU0hPTEQ6CisgICAgICAgICAgICBpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihORElTXzgwMl8xMV9SVFNfVEhSRVNIT0xEKSkKKyAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmUnRzVGhyZXNoLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgICAgIGlmIChSdHNUaHJlc2ggPiBNQVhfUlRTX1RIUkVTSE9MRCkKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLlJ0c1RocmVzaG9sZCA9IChVU0hPUlQpUnRzVGhyZXNoOworICAgICAgICAgICAgfQorICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX1JUU19USFJFU0hPTEQgKD0lbGQpXG4iLFJ0c1RocmVzaCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9GUkFHTUVOVEFUSU9OX1RIUkVTSE9MRDoKKyAgICAgICAgICAgIGlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKE5ESVNfODAyXzExX0ZSQUdNRU5UQVRJT05fVEhSRVNIT0xEKSkKKyAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmRnJhZ1RocmVzaCwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLmJVc2VaZXJvVG9EaXNhYmxlRnJhZ21lbnQgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICBpZiAoRnJhZ1RocmVzaCA+IE1BWF9GUkFHX1RIUkVTSE9MRCB8fCBGcmFnVGhyZXNoIDwgTUlOX0ZSQUdfVEhSRVNIT0xEKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKEZyYWdUaHJlc2ggPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5GcmFnbWVudFRocmVzaG9sZCA9IE1BWF9GUkFHX1RIUkVTSE9MRDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuYlVzZVplcm9Ub0Rpc2FibGVGcmFnbWVudCA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5GcmFnbWVudFRocmVzaG9sZCA9IChVU0hPUlQpRnJhZ1RocmVzaDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9GUkFHTUVOVEFUSU9OX1RIUkVTSE9MRCAoPSVsZCkgXG4iLEZyYWdUaHJlc2gpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfUE9XRVJfTU9ERToKKyAgICAgICAgICAgIGlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKE5ESVNfODAyXzExX1BPV0VSX01PREUpKQorICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJlBvd2VyTW9kZSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBpZiAoUG93ZXJNb2RlID09IE5kaXM4MDJfMTFQb3dlck1vZGVDQU0pCisgICAgICAgICAgICAgICAgCVNldF9QU01vZGVfUHJvYyhwQWRhcHRlciwgIkNBTSIpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKFBvd2VyTW9kZSA9PSBOZGlzODAyXzExUG93ZXJNb2RlTUFYX1BTUCkKKyAgICAgICAgICAgICAgICAJU2V0X1BTTW9kZV9Qcm9jKHBBZGFwdGVyLCAiTWF4X1BTUCIpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKFBvd2VyTW9kZSA9PSBOZGlzODAyXzExUG93ZXJNb2RlRmFzdF9QU1ApCisJCQkJCVNldF9QU01vZGVfUHJvYyhwQWRhcHRlciwgIkZhc3RfUFNQIik7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoUG93ZXJNb2RlID09IE5kaXM4MDJfMTFQb3dlck1vZGVMZWdhY3lfUFNQKQorCQkJCQlTZXRfUFNNb2RlX1Byb2MocEFkYXB0ZXIsICJMZWdhY3lfUFNQIik7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX1BPV0VSX01PREUgKD0lZClcbiIsUG93ZXJNb2RlKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9UWF9QT1dFUl9MRVZFTF8xOgorCQkJaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAgPCBzaXplb2YoVUxPTkcpKQorCQkJCVN0YXR1cyA9IC1FSU5WQUw7CisJCQllbHNlCisJCQl7CisJCQkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJlBvd2VyVGVtcCwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCQlpZiAoUG93ZXJUZW1wID4gMTAwKQorCQkJCQlQb3dlclRlbXAgPSAweGZmZmZmZmZmOyAgLy8gQVVUTworCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuVHhQb3dlckRlZmF1bHQgPSBQb3dlclRlbXA7IC8va2VlcCBjdXJyZW50IHNldHRpbmcuCisJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UgPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLlR4UG93ZXJEZWZhdWx0OworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6UlRfT0lEXzgwMl8xMV9UWF9QT1dFUl9MRVZFTF8xICg9JWxkKVxuIiwgcEFkYXB0ZXItPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSkpOworCQkJfQorCSAgICAgICAgYnJlYWs7CisJCWNhc2UgT0lEXzgwMl8xMV9ORVRXT1JLX1RZUEVfSU5fVVNFOgorCQkJaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoTkRJU184MDJfMTFfTkVUV09SS19UWVBFKSkKKwkJCQlTdGF0dXMgPSAtRUlOVkFMOworCQkJZWxzZQorCQkJeworCQkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZOZXRUeXBlLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCisJCQkJaWYgKE5ldFR5cGUgPT0gTmRpczgwMl8xMURTKQorCQkJCQlSVE1QU2V0UGh5TW9kZShwQWRhcHRlciwgUEhZXzExQik7CisJCQkJZWxzZSBpZiAoTmV0VHlwZSA9PSBOZGlzODAyXzExT0ZETTI0KQorCQkJCQlSVE1QU2V0UGh5TW9kZShwQWRhcHRlciwgUEhZXzExQkdfTUlYRUQpOworCQkJCWVsc2UgaWYgKE5ldFR5cGUgPT0gTmRpczgwMl8xMU9GRE01KQorCQkJCQlSVE1QU2V0UGh5TW9kZShwQWRhcHRlciwgUEhZXzExQSk7CisJCQkJZWxzZQorCQkJCQlTdGF0dXMgPSAtRUlOVkFMOworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJCWlmIChTdGF0dXMgPT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJCQkJU2V0Q29tbW9uSFQocEFkYXB0ZXIpOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9ORVRXT1JLX1RZUEVfSU5fVVNFICg9JWQpXG4iLE5ldFR5cGUpKTsKKwkJICAgIH0KKwkJCWJyZWFrOworICAgICAgICAvLyBGb3IgV1BBIFBTSyBQTUsga2V5CisgICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9BRERfV1BBOgorICAgICAgICAgICAgcEtleSA9IGttYWxsb2Mod3JxLT51LmRhdGEubGVuZ3RoLCBNRU1fQUxMT0NfRkxBRyk7CisgICAgICAgICAgICBpZihwS2V5ID09IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVOT01FTTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIocEtleSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgIGlmIChwS2V5LT5MZW5ndGggIT0gd3JxLT51LmRhdGEubGVuZ3RoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6UlRfT0lEXzgwMl8xMV9BRERfV1BBLCBGYWlsZWQhIVxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSAhPSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spICYmCisJCQkJICAgIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlICE9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spICYmCisJCQkJICAgIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlICE9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmUpICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FT1BOT1RTVVBQOworICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OlJUX09JRF84MDJfMTFfQUREX1dQQSwgRmFpbGVkISEgW0F1dGhNb2RlICE9IFdQQVBTSy9XUEEyUFNLL1dQQU5PTkVdXG4iKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykgfHwKKwkJCQkJCSAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKSB8fAorCQkJCQkJIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmUpICkgICAgIC8vIE9ubHkgZm9yIFdQQSBQU0sgbW9kZQorCQkJCXsKKyAgICAgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkYXB0ZXItPlN0YUNmZy5QTUssICZwS2V5LT5LZXlNYXRlcmlhbCwgcEtleS0+S2V5TGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gVXNlIFJhQ29uZmlnIGFzIFBTSyBhZ2VudC4KKyAgICAgICAgICAgICAgICAgICAgLy8gU3RhcnQgU1RBIHN1cHBsaWNhbnQgc3RhdGUgbWFjaGluZQorICAgICAgICAgICAgICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSAhPSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lKQorICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XcGFTdGF0ZSA9IFNTX1NUQVJUOworCisgICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6UlRfT0lEXzgwMl8xMV9BRERfV1BBIChpZD0weCV4LCBMZW49JWQtYnl0ZSlcbiIsIHBLZXktPktleUluZGV4LCBwS2V5LT5LZXlMZW5ndGgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XcGFTdGF0ZSA9IFNTX05PVFVTRTsKKyAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpSVF9PSURfODAyXzExX0FERF9XUEEgKGlkPTB4JXgsIExlbj0lZC1ieXRlKVxuIiwgcEtleS0+S2V5SW5kZXgsIHBLZXktPktleUxlbmd0aCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGtmcmVlKHBLZXkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9SRU1PVkVfS0VZOgorICAgICAgICAgICAgcFJlbW92ZUtleSA9IGttYWxsb2Mod3JxLT51LmRhdGEubGVuZ3RoLCBNRU1fQUxMT0NfRkxBRyk7CisgICAgICAgICAgICBpZihwUmVtb3ZlS2V5ID09IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVOT01FTTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIocFJlbW92ZUtleSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgIGlmIChwUmVtb3ZlS2V5LT5MZW5ndGggIT0gd3JxLT51LmRhdGEubGVuZ3RoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9SRU1PVkVfS0VZLCBGYWlsZWQhIVxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFJUTVBXUEFSZW1vdmVLZXlQcm9jKHBBZGFwdGVyLCBwUmVtb3ZlS2V5KTsKKyAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX1JFTU9WRV9LRVksIFJlbW92ZSBXUEEgS2V5ISFcbiIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgS2V5SWR4ID0gcFJlbW92ZUtleS0+S2V5SW5kZXg7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKEtleUlkeCAmIDB4ODAwMDAwMDApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNob3VsZCBuZXZlciBzZXQgZGVmYXVsdCBiaXQgd2hlbiByZW1vdmUga2V5CisgICAgICAgICAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9SRU1PVkVfS0VZLCBGYWlsZWQhIShTaG91bGQgbmV2ZXIgc2V0IGRlZmF1bHQgYml0IHdoZW4gcmVtb3ZlIGtleSlcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEtleUlkeCA9IEtleUlkeCAmIDB4MGZmZmZmZmY7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoS2V5SWR4ID4gMykKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfUkVNT1ZFX0tFWSwgRmFpbGVkISEoS2V5SWRbJWRdIG91dCBvZiByYW5nZSlcbiIsIEtleUlkeCkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5LZXlMZW4gPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5DaXBoZXJBbGcgPSBDSVBIRVJfTk9ORTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBc2ljUmVtb3ZlU2hhcmVkS2V5RW50cnkocEFkYXB0ZXIsIDAsIChVQ0hBUilLZXlJZHgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9SRU1PVkVfS0VZIChpZD0weCV4LCBMZW49JWQtYnl0ZSlcbiIsIHBSZW1vdmVLZXktPktleUluZGV4LCBwUmVtb3ZlS2V5LT5MZW5ndGgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGtmcmVlKHBSZW1vdmVLZXkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIC8vIE5ldyBmb3IgV1BBCisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9BRERfS0VZOgorICAgICAgICAgICAgcEtleSA9IGttYWxsb2Mod3JxLT51LmRhdGEubGVuZ3RoLCBNRU1fQUxMT0NfRkxBRyk7CisgICAgICAgICAgICBpZihwS2V5ID09IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVOT01FTTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKHBLZXksIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICBpZiAocEtleS0+TGVuZ3RoICE9IHdycS0+dS5kYXRhLmxlbmd0aCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfQUREX0tFWSwgRmFpbGVkISFcbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBSVE1QQWRkS2V5KHBBZGFwdGVyLCBwS2V5KTsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfQUREX0tFWSAoaWQ9MHgleCwgTGVuPSVkLWJ5dGUpXG4iLCBwS2V5LT5LZXlJbmRleCwgcEtleS0+S2V5TGVuZ3RoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBrZnJlZShwS2V5KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfQ09ORklHVVJBVElPTjoKKyAgICAgICAgICAgIGlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKE5ESVNfODAyXzExX0NPTkZJR1VSQVRJT04pKQorICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZDb25maWcsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgcENvbmZpZyA9ICZDb25maWc7CisKKyAgICAgICAgICAgICAgICBpZiAoKHBDb25maWctPkJlYWNvblBlcmlvZCA+PSAyMCkgJiYgKHBDb25maWctPkJlYWNvblBlcmlvZCA8PTQwMCkpCisgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkJlYWNvblBlcmlvZCA9IChVU0hPUlQpIHBDb25maWctPkJlYWNvblBlcmlvZDsKKworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFBY3RpdmUuQXRpbVdpbiA9IChVU0hPUlQpIHBDb25maWctPkFUSU1XaW5kb3c7CisgICAgICAgICAgICAgICAgTUFQX0tIWl9UT19DSEFOTkVMX0lEKHBDb25maWctPkRTQ29uZmlnLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWwpOworICAgICAgICAgICAgICAgIC8vCisJCQkJLy8gU2F2ZSB0aGUgY2hhbm5lbCBvbiBNbG1lQXV4IGZvciBDbnRsT2lkUlRCc3NpZFByb2MgdXNlZC4KKwkJCQkvLworCQkJCXBBZGFwdGVyLT5NbG1lQXV4LkNoYW5uZWwgPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWw7CisKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfQ09ORklHVVJBVElPTiAoQmVhY25QZXJpb2Q9JWxkLEF0aW1XPSVsZCxDaD0lZClcbiIsCisgICAgICAgICAgICAgICAgICAgIHBDb25maWctPkJlYWNvblBlcmlvZCwgcENvbmZpZy0+QVRJTVdpbmRvdywgcEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsKSk7CisgICAgICAgICAgICAgICAgLy8gQ29uZmlnIGhhcyBjaGFuZ2VkCisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPmJDb25maWdDaGFuZ2VkID0gVFJVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQljYXNlIFJUX09JRF84MDJfMTFfU0VUX0hUX1BIWU1PREU6CisJCQlpZiAod3JxLT51LmRhdGEubGVuZ3RoCSE9IHNpemVvZihPSURfU0VUX0hUX1BIWU1PREUpKQorCQkJCVN0YXR1cyA9IC1FSU5WQUw7CisJCQllbHNlCisJCQl7CisJCQkgICAgUE9JRF9TRVRfSFRfUEhZTU9ERQlwSFRQaHlNb2RlID0gJkhUX1BoeU1vZGU7CisKKwkJCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmSFRfUGh5TW9kZSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OnBIVFBoeU1vZGUJKFBoeU1vZGUgPSAlZCxUcmFuc21pdE5vID0gJWQsIEh0TW9kZSA9CSVkLAlFeHRPZmZzZXQgPQklZCAsIE1DUyA9ICVkLCBCVyA9CSVkLAlTVEJDID0gJWQsIFNIT1JUR0kgPSAlZCkgXG4iLAorCQkJCXBIVFBoeU1vZGUtPlBoeU1vZGUsIHBIVFBoeU1vZGUtPlRyYW5zbWl0Tm8scEhUUGh5TW9kZS0+SHRNb2RlLHBIVFBoeU1vZGUtPkV4dE9mZnNldCwKKwkJCQlwSFRQaHlNb2RlLT5NQ1MsIHBIVFBoeU1vZGUtPkJXLCBwSFRQaHlNb2RlLT5TVEJDLAlwSFRQaHlNb2RlLT5TSE9SVEdJKSk7CisJCQkJaWYgKHBBZGFwdGVyLT5Db21tb25DZmcuUGh5TW9kZQk+PSBQSFlfMTFBQkdOX01JWEVEKQorCQkJCQlSVE1QU2V0SFQocEFkYXB0ZXIsCXBIVFBoeU1vZGUpOworCQkJfQorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpSVF9PSURfODAyXzExX1NFVF9IVF9QSFlNT0RFKE1DUz0lZCxCVz0lZCxTR0k9JWQsU1RCQz0lZClcbiIsCisJCQkJcEFkYXB0ZXItPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTUNTLCBwQWRhcHRlci0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5CVywgcEFkYXB0ZXItPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuU2hvcnRHSSwKKwkJCQlwQWRhcHRlci0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5TVEJDKSk7CisJCQlicmVhazsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJY2FzZSBSVF9PSURfODAyXzExX1NFVF9BUFNEX1NFVFRJTkc6CisJCQlpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihVTE9ORykpCisJCQkJU3RhdHVzID0gLUVJTlZBTDsKKwkJCWVsc2UKKwkJCXsKKwkJCQlVTE9ORyBhcHNkIDsKKwkJCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmYXBzZCwgd3JxLT51LmRhdGEucG9pbnRlciwJd3JxLT51LmRhdGEubGVuZ3RoKTsKKworCQkJCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkJCXxCMzF+QjcJfAlCNn5CNQkgfAkgQjQJIHwJIEIzCSB8CUIyCSB8CUIxCSB8CSAgIEIwCQl8CisJCQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCQkJfCBSc3ZkCXwgTWF4IFNQIExlbiB8IEFDX1ZPIHwgQUNfVkkgfCBBQ19CSyB8IEFDX0JFIHwgQVBTRAlDYXBhYmxlCXwKKwkJCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RDYXBhYmxlID0gKGFwc2QgJiAweDAwMDAwMDAxKSA/IFRSVUUgOglGQUxTRTsKKwkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNEQUNfQkUgPSAoKGFwc2QJJiAweDAwMDAwMDAyKSA+PiAxKQk/IFRSVUUgOiBGQUxTRTsKKwkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNEQUNfQksgPSAoKGFwc2QJJiAweDAwMDAwMDA0KSA+PiAyKQk/IFRSVUUgOiBGQUxTRTsKKwkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNEQUNfVkkgPSAoKGFwc2QJJiAweDAwMDAwMDA4KSA+PiAzKQk/IFRSVUUgOiBGQUxTRTsKKwkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNEQUNfVk8gPSAoKGFwc2QJJiAweDAwMDAwMDEwKSA+PiA0KQk/IFRSVUUgOiBGQUxTRTsKKwkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLk1heFNQTGVuZ3RoCT0gKFVDSEFSKSgoYXBzZAkmIDB4MDAwMDAwNjApID4+IDUpOworCisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpSVF9PSURfODAyXzExX1NFVF9BUFNEX1NFVFRJTkcgKGFwc2Q9MHglbHgsIEFQU0RDYXA9JWQsIFtCRSxCSyxWSSxWT109WyVkLyVkLyVkLyVkXSwJTWF4U1BMZW49JWQpXG4iLCBhcHNkLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNEQ2FwYWJsZSwKKwkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTREFDX0JFLAlwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNEQUNfQkssCXBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RBQ19WSSwJcEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTREFDX1ZPLAlwQWRhcHRlci0+Q29tbW9uQ2ZnLk1heFNQTGVuZ3RoKSk7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFJUX09JRF84MDJfMTFfU0VUX0FQU0RfUFNNOgorCQkJaWYgKHdycS0+dS5kYXRhLmxlbmd0aAkhPSBzaXplb2YoVUxPTkcpKQorCQkJCVN0YXR1cyA9IC1FSU5WQUw7CisJCQllbHNlCisJCQl7CisJCQkJLy8gRHJpdmVyIG5lZWRzCXRvIG5vdGlmeSBBUCB3aGVuIFBTTSBjaGFuZ2VzCisJCQkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJnBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RGb3JjZVBvd2VyU2F2ZSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCQlpZiAocEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTREZvcmNlUG93ZXJTYXZlCSE9IHBBZGFwdGVyLT5TdGFDZmcuUHNtKQorCQkJCXsKKwkJCQkJTWxtZVNldFBzbUJpdChwQWRhcHRlciwJcEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTREZvcmNlUG93ZXJTYXZlKTsKKwkJCQkJUlRNUFNlbmROdWxsRnJhbWUocEFkYXB0ZXIsCXBBZGFwdGVyLT5Db21tb25DZmcuVHhSYXRlLAlUUlVFKTsKKwkJCQl9CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpSVF9PSURfODAyXzExX1NFVF9BUFNEX1BTTSAoYkFQU0RGb3JjZVBvd2VyU2F2ZTolZClcbiIsCXBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RGb3JjZVBvd2VyU2F2ZSkpOworCQkJfQorCQkJYnJlYWs7CisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJCWNhc2UgUlRfT0lEXzgwMl8xMV9TRVRfRExTOgorCQkJaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoVUxPTkcpKQorCQkJCVN0YXR1cyA9IC1FSU5WQUw7CisJCQllbHNlCisJCQl7CisJCQkJQk9PTEVBTglvbGR2YWx1ZSA9IHBBZGFwdGVyLT5Db21tb25DZmcuYkRMU0NhcGFibGU7CisJCQkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJnBBZGFwdGVyLT5Db21tb25DZmcuYkRMU0NhcGFibGUsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQkJaWYgKG9sZHZhbHVlICYmCSFwQWRhcHRlci0+Q29tbW9uQ2ZnLmJETFNDYXBhYmxlKQorCQkJCXsKKwkJCQkJaW50CWk7CisJCQkJCS8vIHRlYXIJZG93biBsb2NhbCBkbHMgdGFibGUgZW50cnkKKwkJCQkJZm9yCShpPTA7IGk8TUFYX05VTV9PRl9JTklUX0RMU19FTlRSWTsgaSsrKQorCQkJCQl7CisJCQkJCQlpZiAocEFkYXB0ZXItPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZCAmJiAocEFkYXB0ZXItPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPT0gRExTX0ZJTklTSCkpCisJCQkJCQl7CisJCQkJCQkJcEFkYXB0ZXItPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMJPSBETFNfTk9ORTsKKwkJCQkJCQlwQWRhcHRlci0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkCT0gRkFMU0U7CisJCQkJCQkJUlRNUFNlbmRETFNUZWFyRG93bkZyYW1lKHBBZGFwdGVyLCBwQWRhcHRlci0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpOworCQkJCQkJfQorCQkJCQl9CisKKwkJCQkJLy8gdGVhcglkb3duIHBlZXIgZGxzIHRhYmxlCWVudHJ5CisJCQkJCWZvcgkoaT1NQVhfTlVNX09GX0lOSVRfRExTX0VOVFJZOyBpPE1BWF9OVU1fT0ZfRExTX0VOVFJZOyBpKyspCisJCQkJCXsKKwkJCQkJCWlmIChwQWRhcHRlci0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkICYmIChwQWRhcHRlci0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9PSBETFNfRklOSVNIKSkKKwkJCQkJCXsKKwkJCQkJCQlwQWRhcHRlci0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cwk9IERMU19OT05FOworCQkJCQkJCXBBZGFwdGVyLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQJPSBGQUxTRTsKKwkJCQkJCQlSVE1QU2VuZERMU1RlYXJEb3duRnJhbWUocEFkYXB0ZXIsIHBBZGFwdGVyLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcik7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlNldDo6UlRfT0lEXzgwMl8xMV9TRVRfRExTICg9JWQpXG4iLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLmJETFNDYXBhYmxlKSk7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFJUX09JRF84MDJfMTFfU0VUX0RMU19QQVJBTToKKwkJCWlmICh3cnEtPnUuZGF0YS5sZW5ndGgJIT0gc2l6ZW9mKFJUXzgwMl8xMV9ETFNfVUkpKQorCQkJCVN0YXR1cyA9IC1FSU5WQUw7CisJCQllbHNlCisJCQl7CisJCQkJUlRfODAyXzExX0RMUwlEbHM7CisKKwkJCQlOZGlzWmVyb01lbW9yeSgmRGxzLCBzaXplb2YoUlRfODAyXzExX0RMUykpOworCQkJCVJUTVBNb3ZlTWVtb3J5KCZEbHMsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHNpemVvZihSVF84MDJfMTFfRExTX1VJKSk7CisJCQkJTWxtZUVucXVldWUocEFkYXB0ZXIsCisJCQkJCQkJTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsCisJCQkJCQkJUlRfT0lEXzgwMl8xMV9TRVRfRExTX1BBUkFNLAorCQkJCQkJCXNpemVvZihSVF84MDJfMTFfRExTKSwKKwkJCQkJCQkmRGxzKTsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlNldDo6UlRfT0lEXzgwMl8xMV9TRVRfRExTX1BBUkFNIFxuIikpOworCQkJfQorCQkJYnJlYWs7CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisJCWNhc2UgUlRfT0lEXzgwMl8xMV9TRVRfV01NOgorCQkJaWYgKHdycS0+dS5kYXRhLmxlbmd0aAkhPSBzaXplb2YoQk9PTEVBTikpCisJCQkJU3RhdHVzID0gLUVJTlZBTDsKKwkJCWVsc2UKKwkJCXsKKwkJCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmcEFkYXB0ZXItPkNvbW1vbkNmZy5iV21tQ2FwYWJsZSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OlJUX09JRF84MDJfMTFfU0VUX1dNTSAoPSVkKQlcbiIsIHBBZGFwdGVyLT5Db21tb25DZmcuYldtbUNhcGFibGUpKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgT0lEXzgwMl8xMV9ESVNBU1NPQ0lBVEU6CisjaWZkZWYgUkFMSU5LX0FURQorCQkJaWYgKEFURV9PTihwQWRhcHRlcikpCisJCQl7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiVGhlIGRyaXZlciBpcyBpbiBBVEUgbW9kZSBub3dcbiIpKTsKKwkJCQlicmVhazsKKwkJCX0KKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisJCQkvLworCQkJLy8gU2V0IE5kaXNSYWRpb1N0YXRlT2ZmIHRvCVRSVUUsIGluc3RlYWQgb2YgY2FsbGVkCU1sbWVSYWRpb09mZi4KKwkJCS8vIExhdGVyIG9uLCBORElTXzgwMl8xMV9CU1NJRF9MSVNUX0VYLT5OdW1iZXJPZkl0ZW1zIHNob3VsZCBiZQkwCisJCQkvLyB3aGVuCXF1ZXJ5IE9JRF84MDJfMTFfQlNTSURfTElTVC4KKwkJCS8vCisJCQkvLyBUUlVFOiAgTnVtYmVyT2ZJdGVtcwl3aWxsIHNldCB0bwkwLgorCQkJLy8gRkFMU0U6IE51bWJlck9mSXRlbXMJbm8gY2hhbmdlLgorCQkJLy8KKwkJCXBBZGFwdGVyLT5Db21tb25DZmcuTmRpc1JhZGlvU3RhdGVPZmYgPQlUUlVFOworCQkJLy8gU2V0IHRvIGltbWVkaWF0ZWx5IHNlbmQgdGhlIG1lZGlhIGRpc2Nvbm5lY3QJZXZlbnQKKwkJCXBBZGFwdGVyLT5NbG1lQXV4LkN1cnJSZXFJc0Zyb21OZGlzCT0gVFJVRTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9ESVNBU1NPQ0lBVEUJXG4iKSk7CisKKwkJCWlmIChJTkZSQV9PTihwQWRhcHRlcikpCisJCQl7CisJCQkJaWYgKHBBZGFwdGVyLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSAhPQlDTlRMX0lETEUpCisJCQkJeworCQkJCQlSVDI4WFhfTUxNRV9SRVNFVF9TVEFURV9NQUNISU5FKHBBZGFwdGVyKTsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIE1MTUUJYnVzeSwgcmVzZXQJTUxNRSBzdGF0ZSBtYWNoaW5lICEhIVxuIikpOworCQkJCX0KKworCQkJCU1sbWVFbnF1ZXVlKHBBZGFwdGVyLAorCQkJCQlNTE1FX0NOVExfU1RBVEVfTUFDSElORSwKKwkJCQkJT0lEXzgwMl8xMV9ESVNBU1NPQ0lBVEUsCisJCQkJCTAsCisJCQkJCU5VTEwpOworCisJCQkJU3RhdGVNYWNoaW5lVG91Y2hlZAk9IFRSVUU7CisJCQl9CisJCQlicmVhazsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQljYXNlIFJUX09JRF84MDJfMTFfU0VUX0lNTUVfQkFfQ0FQOgorCQkJCWlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKE9JRF9CQUNBUF9TVFJVQykpCisJCQkJCVN0YXR1cyA9IC1FSU5WQUw7CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJT0lEX0JBQ0FQX1NUUlVDIE9yZGUgOworCQkJCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmT3JkZSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCQkJaWYgKE9yZGUuUG9saWN5ID4gQkFfTk9UVVNFKQorCQkJCQl7CisJCQkJCQlTdGF0dXMgPSBORElTX1NUQVRVU19JTlZBTElEX0RBVEE7CisJCQkJCX0KKwkJCQkJZWxzZSBpZiAoT3JkZS5Qb2xpY3kgPT0gQkFfTk9UVVNFKQorCQkJCQl7CisJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5Qb2xpY3kgPSBCQV9OT1RVU0U7CisJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5NcGR1RGVuc2l0eSA9IE9yZGUuTXBkdURlbnNpdHk7CisJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5NcGR1RGVuc2l0eSA9IE9yZGUuTXBkdURlbnNpdHk7CisJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5BbXNkdUVuYWJsZSA9IE9yZGUuQW1zZHVFbmFibGU7CisJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5BbXNkdVNpemU9IE9yZGUuQW1zZHVTaXplOworCQkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuTWltb1BzPSBPcmRlLk1NUFNtb2RlOworCQkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTU1QU21vZGUgPSBPcmRlLk1NUFNtb2RlOworCQkJCQkJLy8gVVBkYXRhIHRvIEhUIElFCisJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uTWltb1BzID0gT3JkZS5NTVBTbW9kZTsKKwkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5BTXNkdVNpemUgPSBPcmRlLkFtc2R1U2l6ZTsKKwkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwUGFybS5NcGR1RGVuc2l0eSA9IE9yZGUuTXBkdURlbnNpdHk7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BdXRvQkEgPSBPcmRlLkF1dG9CQTsKKwkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlBvbGljeSA9IElNTUVEX0JBOyAvLyB3ZSBvbmx5IHN1cHBvcnQgaW1tZWRpYXRlIEJBLgorCQkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTXBkdURlbnNpdHkgPSBPcmRlLk1wZHVEZW5zaXR5OworCQkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuTXBkdURlbnNpdHkgPSBPcmRlLk1wZHVEZW5zaXR5OworCQkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQW1zZHVFbmFibGUgPSBPcmRlLkFtc2R1RW5hYmxlOworCQkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQW1zZHVTaXplPSBPcmRlLkFtc2R1U2l6ZTsKKwkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5Lk1pbW9QcyA9IE9yZGUuTU1QU21vZGU7CisJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5NTVBTbW9kZSA9IE9yZGUuTU1QU21vZGU7CisKKwkJCQkJCS8vIFVQZGF0YSB0byBIVCBJRQorCQkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLk1pbW9QcyA9IE9yZGUuTU1QU21vZGU7CisJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQU1zZHVTaXplID0gT3JkZS5BbXNkdVNpemU7CisJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcFBhcm0uTXBkdURlbnNpdHkgPSBPcmRlLk1wZHVEZW5zaXR5OworCisJCQkJCQlpZiAocEFkYXB0ZXItPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuUnhCQVdpbkxpbWl0ID4gTUFYX1JYX1JFT1JERVJCVUYpCisJCQkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuUnhCQVdpbkxpbWl0ID0gTUFYX1JYX1JFT1JERVJCVUY7CisKKwkJCQkJfQorCisJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuUkVHQkFDYXBhYmlsaXR5LndvcmQgPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS53b3JkOworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OihPcmRlLkF1dG9CQSA9ICVkKSAoUG9saWN5PSVkKShSZUJBV2luTGltaXQ9JWQpKFR4QkFXaW5MaW1pdD0lZCkoQXV0b01vZGU9JWQpXG4iLE9yZGUuQXV0b0JBLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5Qb2xpY3ksCisJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5SeEJBV2luTGltaXQscEFkYXB0ZXItPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuVHhCQVdpbkxpbWl0LCBwQWRhcHRlci0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BdXRvQkEpKTsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjooTWltb1BzID0gJWQpKEFtc2R1RW5hYmxlID0gJWQpIChBbXNkdVNpemU9JWQpKE1wZHVEZW5zaXR5PSVkKVxuIixwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5NaW1vUHMsIHBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkFtc2R1RW5hYmxlLAorCQkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQW1zZHVTaXplLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5NcGR1RGVuc2l0eSkpOworCQkJCX0KKworCQkJCWJyZWFrOworCQljYXNlIFJUX09JRF84MDJfMTFfQUREX0lNTUVfQkE6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIgU2V0IDo6IFJUX09JRF84MDJfMTFfQUREX0lNTUVfQkEgXG4iKSk7CisJCQlpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihPSURfQUREX0JBX0VOVFJZKSkKKwkJCQkJU3RhdHVzID0gLUVJTlZBTDsKKwkJCWVsc2UKKwkJCXsKKwkJCQlVQ0hBUgkJICAgICAgICBpbmRleDsKKwkJCQlPSURfQUREX0JBX0VOVFJZICAgIEJBOworCQkJCU1BQ19UQUJMRV9FTlRSWSAgICAgKnBFbnRyeTsKKworCQkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZCQSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCQlpZiAoQkEuVElEID4gMTUpCisJCQkJeworCQkJCQlTdGF0dXMgPSBORElTX1NUQVRVU19JTlZBTElEX0RBVEE7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQkvL0JBVGFibGVJbnNlcnRFbnRyeQorCQkJCQkvL0FzIGFkLWhvYyBtb2RlLCBCQSBwYWlyIGlzIG5vdCBsaW1pdGVkIHRvIG9ubHkgQlNTSUQuIHNvIGFkZCB2aWEgT0lELgorCQkJCQlpbmRleCA9IEJBLlRJRDsKKwkJCQkJLy8gaW4gYWQgaG9jIG1vZGUsIHdoZW4gYWRkaW5nIEJBIHBhaXIsIHdlIHNob3VsZCBpbnNlcnQgdGhpcyBlbnRyeSBpbnRvIE1BQ0VudHJ5IHRvbworCQkJCQlwRW50cnkgPSBNYWNUYWJsZUxvb2t1cChwQWRhcHRlciwgQkEuTUFDQWRkcik7CisJCQkJCWlmICghcEVudHJ5KQorCQkJCQl7CisJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVF9PSURfODAyXzExX0FERF9JTU1FX0JBLiBicmVhayBvbiBubyBjb25uZWN0aW9uLi0tLS06JXg6JXhcbiIsIEJBLk1BQ0FkZHJbNF0sIEJBLk1BQ0FkZHJbNV0pKTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJCWlmIChCQS5Jc1JlY2lwaWVudCA9PSBGQUxTRSkKKwkJCQkJeworCQkJCQkgICAgaWYgKHBFbnRyeS0+YklBbUJhZEF0aGVyb3MgPT0gVFJVRSkKKwkJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5SeEJBV2luTGltaXQgPSAweDEwOworCisJCQkJCQlCQU9yaVNlc3Npb25TZXRVcChwQWRhcHRlciwgcEVudHJ5LCBpbmRleCwgMCwgMTAwLCBUUlVFKTsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCS8vQkFUYWJsZUluc2VydEVudHJ5KHBBZGFwdGVyLCBwRW50cnktPkFpZCwgQkEuTUFDQWRkciwgMCwgMHhmZmZmLCBCQS5USUQsIEJBLm5NU0RVLCBCQS5Jc1JlY2lwaWVudCk7CisJCQkJCX0KKworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OlJUX09JRF84MDJfMTFfQUREX0lNTUVfQkEuIFJlYyA9ICVkLiBNYWMgPSAleDoleDoleDoleDoleDoleCAuIFxuIiwKKwkJCQkJCUJBLklzUmVjaXBpZW50LCBCQS5NQUNBZGRyWzBdLCBCQS5NQUNBZGRyWzFdLCBCQS5NQUNBZGRyWzJdLCBCQS5NQUNBZGRyWzJdCisJCQkJCQksIEJBLk1BQ0FkZHJbNF0sIEJBLk1BQ0FkZHJbNV0pKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFJUX09JRF84MDJfMTFfVEVBUl9JTU1FX0JBOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0IDo6IFJUX09JRF84MDJfMTFfVEVBUl9JTU1FX0JBIFxuIikpOworCQkJaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoT0lEX0FERF9CQV9FTlRSWSkpCisJCQkJCVN0YXR1cyA9IC1FSU5WQUw7CisJCQllbHNlCisJCQl7CisJCQkJUE9JRF9BRERfQkFfRU5UUlkJcEJBOworCQkJCU1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5OworCisJCQkJcEJBID0ga21hbGxvYyh3cnEtPnUuZGF0YS5sZW5ndGgsIE1FTV9BTExPQ19GTEFHKTsKKworCQkJCWlmIChwQkEgPT0gTlVMTCkKKwkJCQl7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldCA6OiBSVF9PSURfODAyXzExX1RFQVJfSU1NRV9CQSBrbWFsbG9jKCkgY2FuJ3QgYWxsb2NhdGUgZW5vdWdoIG1lbW9yeVxuIikpOworCQkJCQlTdGF0dXMgPSBORElTX1NUQVRVU19GQUlMVVJFOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcihwQkEsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldCA6OiBSVF9PSURfODAyXzExX1RFQVJfSU1NRV9CQShUSUQ9JWQsIGJBbGxUaWQ9JWQpXG4iLCBwQkEtPlRJRCwgcEJBLT5iQWxsVGlkKSk7CisKKwkJCQkJaWYgKCFwQkEtPmJBbGxUaWQgJiYgKHBCQS0+VElEID4gTlVNX09GX1RJRCkpCisJCQkJCXsKKwkJCQkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX0lOVkFMSURfREFUQTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisKKwkJCQkJaWYgKHBCQS0+SXNSZWNpcGllbnQgPT0gRkFMU0UpCisJCQkJCXsKKwkJCQkJCXBFbnRyeSA9IE1hY1RhYmxlTG9va3VwKHBBZGFwdGVyLCBwQkEtPk1BQ0FkZHIpOworCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiIHBCQS0+SXNSZWNpcGllbnQgPT0gRkFMU0VcbiIpKTsKKwkJCQkJCWlmIChwRW50cnkpCisJCQkJCQl7CisJCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiIHBCQS0+cEVudHJ5XG4iKSk7CisJCQkJCQkJQkFPcmlTZXNzaW9uVGVhckRvd24ocEFkYXB0ZXIsIHBFbnRyeS0+QWlkLCBwQkEtPlRJRCwgRkFMU0UsIFRSVUUpOworCQkJCQkJfQorCQkJCQkJZWxzZQorCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldCA6OiBOb3QgZm91bmQgcEVudHJ5IFxuIikpOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJcEVudHJ5ID0gTWFjVGFibGVMb29rdXAocEFkYXB0ZXIsIHBCQS0+TUFDQWRkcik7CisJCQkJCQlpZiAocEVudHJ5KQorCQkJCQkJeworCQkJCQkJCUJBUmVjU2Vzc2lvblRlYXJEb3duKCBwQWRhcHRlciwgKFVDSEFSKXBFbnRyeS0+QWlkLCBwQkEtPlRJRCwgVFJVRSk7CisJCQkJCQl9CisJCQkJCQllbHNlCisJCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0IDo6IE5vdCBmb3VuZCBwRW50cnkgXG4iKSk7CisJCQkJCX0KKwkJCQkJa2ZyZWUocEJBKTsKKwkJCQl9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworICAgICAgICAvLyBGb3IgV1BBX1NVUFBMSUNBTlQgdG8gc2V0IHN0YXRpYyB3ZXAga2V5CisgICAgCWNhc2UgT0lEXzgwMl8xMV9BRERfV0VQOgorICAgIAkgICAgcFdlcEtleSA9IGttYWxsb2Mod3JxLT51LmRhdGEubGVuZ3RoLCBNRU1fQUxMT0NfRkxBRyk7CisKKyAgICAJICAgIGlmKHBXZXBLZXkgPT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRU5PTUVNOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9BRERfV0VQLCBGYWlsZWQhIVxuIikpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIocFdlcEtleSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgIGlmIChTdGF0dXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX0FERF9XRVAsIEZhaWxlZCAobGVuZ3RoIG1pc21hdGNoKSEhXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisJCSAgICAgICAgS2V5SWR4ID0gcFdlcEtleS0+S2V5SW5kZXggJiAweDBmZmZmZmZmOworICAgICAgICAgICAgICAgIC8vIEtleUlkeCBtdXN0IGJlIDAgfiAzCisgICAgICAgICAgICAgICAgaWYgKEtleUlkeCA+IDQpCisgICAgCQkJeworICAgICAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX0FERF9XRVAsIEZhaWxlZCAoS2V5SWR4IG11c3QgYmUgc21hbGxlciB0aGFuIDQpISFcbiIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgVUNIQVIgQ2lwaGVyQWxnID0gMDsKKyAgICAgICAgICAgICAgICAgICAgUFVDSEFSIEtleTsKKworICAgICAgICAgICAgICAgICAgICAvLyBzZXQga2V5IG1hdGVyaWFsIGFuZCBrZXkgbGVuZ3RoCisgICAgICAgICAgICAgICAgICAgIE5kaXNaZXJvTWVtb3J5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5LZXksIDE2KTsKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLktleUxlbiA9IChVQ0hBUikgcFdlcEtleS0+S2V5TGVuZ3RoOworICAgICAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uS2V5LCAmcFdlcEtleS0+S2V5TWF0ZXJpYWwsIHBXZXBLZXktPktleUxlbmd0aCk7CisKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoKHBXZXBLZXktPktleUxlbmd0aCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDEyODsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX0FERF9XRVAsIG9ubHkgc3VwcG9ydCBDSVBIRVJfV0VQNjQobGVuOjUpICYgQ0lQSEVSX1dFUDEyOChsZW46MTMpISFcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5DaXBoZXJBbGcgPSBDaXBoZXJBbGc7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gRGVmYXVsdCBrZXkgZm9yIHR4IChzaGFyZWQga2V5KQorICAgICAgICAgICAgICAgICAgICBpZiAocFdlcEtleS0+S2V5SW5kZXggJiAweDgwMDAwMDAwKQorICAgICAgICAgICAgICAgICAgICB7CisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0IGtleSBtYXRlcmlhbCBhbmQga2V5IGxlbmd0aAorICAgICAgICAgICAgICAgICAgICAgICAgTmRpc1plcm9NZW1vcnkocEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVTaGFyZWRLZXlbS2V5SWR4XS5LZXksIDE2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlU2hhcmVkS2V5W0tleUlkeF0uS2V5TGVuID0gKFVDSEFSKSBwV2VwS2V5LT5LZXlMZW5ndGg7CisgICAgICAgICAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZVNoYXJlZEtleVtLZXlJZHhdLktleSwgJnBXZXBLZXktPktleU1hdGVyaWFsLCBwV2VwS2V5LT5LZXlMZW5ndGgpOworICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVTaGFyZWRLZXlJZCA9IEtleUlkeDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlU2hhcmVkS2V5W0tleUlkeF0uQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOworI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKyAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkID0gKFVDSEFSKSBLZXlJZHg7CisgICAgICAgICAgICAgICAgICAgIH0KKworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuUG9ydFNlY3VyZWQgPT0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQpCisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBLZXkgPSBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uS2V5OworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBTZXQga2V5IG1hdGVyaWFsIGFuZCBjaXBoZXJBbGcgdG8gQXNpYworICAgICAgICAJCQkJQXNpY0FkZFNoYXJlZEtleUVudHJ5KHBBZGFwdGVyLCBCU1MwLCBLZXlJZHgsIENpcGhlckFsZywgS2V5LCBOVUxMLCBOVUxMKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBXZXBLZXktPktleUluZGV4ICYgMHg4MDAwMDAwMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQTUFDX1RBQkxFX0VOVFJZIHBFbnRyeSA9ICZwQWRhcHRlci0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXNzaWduIGdyb3VwIGtleSBpbmZvCisgICAgCQkJCQkJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWRhcHRlciwgQlNTMCwgS2V5SWR4LCBDaXBoZXJBbGcsIE5VTEwpOworICAgIAkJCQkJCS8vIEFzc2lnbiBwYWlyd2lzZSBrZXkgaW5mbworICAgIAkJCQkJCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkocEFkYXB0ZXIsIEJTUzAsIEtleUlkeCwgQ2lwaGVyQWxnLCBwRW50cnkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9BRERfV0VQIChpZD0weCV4LCBMZW49JWQtYnl0ZSksICVzXG4iLCBwV2VwS2V5LT5LZXlJbmRleCwgcFdlcEtleS0+S2V5TGVuZ3RoLCAocEFkYXB0ZXItPlN0YUNmZy5Qb3J0U2VjdXJlZCA9PSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRCkgPyAiUG9ydCBTZWN1cmVkIjoiUG9ydCBOT1QgU2VjdXJlZCIpKTsKKwkJCQl9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBrZnJlZShwV2VwS2V5KTsKKyAgICAgICAgICAgIGJyZWFrOworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKwkgICAgY2FzZSBPSURfU0VUX0NPVU5URVJNRUFTVVJFUzoKKyAgICAgICAgICAgIGlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKGludCkpCisgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGVuYWJsZWQgPSAwOworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZlbmFibGVkLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgICAgIGlmIChlbmFibGVkID09IDEpCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuYkJsb2NrQXNzb2MgPSBUUlVFOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgLy8gV1BBIE1JQyBlcnJvciBzaG91bGQgYmxvY2sgYXNzb2NpYXRpb24gYXR0ZW1wdCBmb3IgNjAgc2Vjb25kcworICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLmJCbG9ja0Fzc29jID0gRkFMU0U7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfU0VUX0NPVU5URVJNRUFTVVJFUyBiQmxvY2tBc3NvYz0lc1xuIiwgcEFkYXB0ZXItPlN0YUNmZy5iQmxvY2tBc3NvYyA/ICJUUlVFIjoiRkFMU0UiKSk7CisgICAgICAgICAgICB9CisJICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSVF9PSURfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVDoKKwkJCWlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKFVDSEFSKSkKKyAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmd3BhX3N1cHBsaWNhbnRfZW5hYmxlLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgIAkJCXBBZGFwdGVyLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQID0gd3BhX3N1cHBsaWNhbnRfZW5hYmxlOworICAgIAkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6UlRfT0lEX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQgKD0lZClcbiIsIHBBZGFwdGVyLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQKSk7CisJCQl9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX0RFQVVUSEVOVElDQVRJT046CisgICAgICAgICAgICBpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihNTE1FX0RFQVVUSF9SRVFfU1RSVUNUKSkKKyAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBNTE1FX0RFQVVUSF9SRVFfU1RSVUNUICAgICAgKnBJbmZvOworCQkJCU1MTUVfUVVFVUVfRUxFTSAqTXNnRWxlbSA9IChNTE1FX1FVRVVFX0VMRU0gKikga21hbGxvYyhzaXplb2YoTUxNRV9RVUVVRV9FTEVNKSwgTUVNX0FMTE9DX0ZMQUcpOworCisgICAgICAgICAgICAgICAgcEluZm8gPSAoTUxNRV9ERUFVVEhfUkVRX1NUUlVDVCAqKSBNc2dFbGVtLT5Nc2c7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIocEluZm8sIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgTWxtZURlYXV0aFJlcUFjdGlvbihwQWRhcHRlciwgTXNnRWxlbSk7CisJCQkJa2ZyZWUoTXNnRWxlbSk7CisKKyAgICAgICAgICAgICAgICBpZiAoSU5GUkFfT04ocEFkYXB0ZXIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgTGlua0Rvd24ocEFkYXB0ZXIsIEZBTFNFKTsKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPk1sbWUuQXNzb2NNYWNoaW5lLkN1cnJTdGF0ZSA9IEFTU09DX0lETEU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9ERUFVVEhFTlRJQ0FUSU9OIChSZWFzb249JWQpXG4iLCBwSW5mby0+UmVhc29uKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX0RST1BfVU5FTkNSWVBURUQ6CisgICAgICAgICAgICBpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihpbnQpKQorICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBlbmFibGVkID0gMDsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmZW5hYmxlZCwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBpZiAoZW5hYmxlZCA9PSAxKQorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX05PVF9TRUNVUkVEOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEOworCQkJCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZGFwdGVyLT5NYWNUYWJMb2NrKTsKKwkJCQlwQWRhcHRlci0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUG9ydFNlY3VyZWQgPSBwQWRhcHRlci0+U3RhQ2ZnLlBvcnRTZWN1cmVkOworCQkJCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZGFwdGVyLT5NYWNUYWJMb2NrKTsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfRFJPUF9VTkVOQ1JZUFRFRCAoPSVkKVxuIiwgZW5hYmxlZCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9TRVRfSUVFRTgwMjFYOgorICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoQk9PTEVBTikpCisgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJklFRUU4MDIxeFN0YXRlLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuSUVFRTgwMjFYID0gSUVFRTgwMjF4U3RhdGU7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX1NFVF9JRUVFODAyMVggKD0lZClcbiIsIElFRUU4MDIxeFN0YXRlKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX1NFVF9JRUVFODAyMVhfUkVRVUlSRV9LRVk6CisJCQlpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihCT09MRUFOKSkKKwkJCQkgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJklFRUU4MDIxeF9yZXF1aXJlZF9rZXlzLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJCXBBZGFwdGVyLT5TdGFDZmcuSUVFRTgwMjF4X3JlcXVpcmVkX2tleXMgPSBJRUVFODAyMXhfcmVxdWlyZWRfa2V5czsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfU0VUX0lFRUU4MDIxWF9SRVFVSVJFX0tFWSAoJWQpXG4iLCBJRUVFODAyMXhfcmVxdWlyZWRfa2V5cykpOworCQkJfQorCQkJYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9QTUtJRDoKKwkgICAgICAgIHBQbWtJZCA9IGttYWxsb2Mod3JxLT51LmRhdGEubGVuZ3RoLCBNRU1fQUxMT0NfRkxBRyk7CisKKwkgICAgICAgIGlmKHBQbWtJZCA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVOT01FTTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKHBQbWtJZCwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKworCSAgICAgICAgLy8gY2hlY2sgdGhlIFBNS0lEIGluZm9ybWF0aW9uCisJICAgICAgICBpZiAocFBta0lkLT5CU1NJREluZm9Db3VudCA9PSAwKQorICAgICAgICAgICAgICAgIE5kaXNaZXJvTWVtb3J5KHBBZGFwdGVyLT5TdGFDZmcuU2F2ZWRQTUssIHNpemVvZihCU1NJRF9JTkZPKSpQTUtJRF9OTyk7CisJICAgICAgICBlbHNlCisJICAgICAgICB7CisJCSAgICAgICAgUEJTU0lEX0lORk8JcEJzc0lkSW5mbzsKKwkJICAgICAgICBVSU5UCQlCc3NJZHg7CisJCSAgICAgICAgVUlOVAkJQ2FjaGVkSWR4OworCisJCSAgICAgICAgZm9yIChCc3NJZHggPSAwOyBCc3NJZHggPCBwUG1rSWQtPkJTU0lESW5mb0NvdW50OyBCc3NJZHgrKykKKwkJICAgICAgICB7CisJCQkgICAgICAgIC8vIHBvaW50IHRvIHRoZSBpbmRleGVkIEJTU0lEX0lORk8gc3RydWN0dXJlCisJCQkgICAgICAgIHBCc3NJZEluZm8gPSAoUEJTU0lEX0lORk8pICgoUFVDSEFSKSBwUG1rSWQgKyAyICogc2l6ZW9mKFVJTlQpICsgQnNzSWR4ICogc2l6ZW9mKEJTU0lEX0lORk8pKTsKKwkJCSAgICAgICAgLy8gRmluZCB0aGUgZW50cnkgaW4gdGhlIHNhdmVkIGRhdGEgYmFzZS4KKwkJCSAgICAgICAgZm9yIChDYWNoZWRJZHggPSAwOyBDYWNoZWRJZHggPCBwQWRhcHRlci0+U3RhQ2ZnLlNhdmVkUE1LTnVtOyBDYWNoZWRJZHgrKykKKwkJCSAgICAgICAgeworCQkJCSAgICAgICAgLy8gY29tcGFyZSB0aGUgQlNTSUQKKwkJCQkgICAgICAgIGlmIChOZGlzRXF1YWxNZW1vcnkocEJzc0lkSW5mby0+QlNTSUQsIHBBZGFwdGVyLT5TdGFDZmcuU2F2ZWRQTUtbQ2FjaGVkSWR4XS5CU1NJRCwgc2l6ZW9mKE5ESVNfODAyXzExX01BQ19BRERSRVNTKSkpCisJCQkJCSAgICAgICAgYnJlYWs7CisJCQkgICAgICAgIH0KKworCQkJICAgICAgICAvLyBGb3VuZCwgcmVwbGFjZSBpdAorCQkJICAgICAgICBpZiAoQ2FjaGVkSWR4IDwgUE1LSURfTk8pCisJCQkgICAgICAgIHsKKwkJCQkgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX09GRiwgKCJVcGRhdGUgT0lEXzgwMl8xMV9QTUtJRCwgaWR4ID0gJWRcbiIsIENhY2hlZElkeCkpOworCQkJCSAgICAgICAgTmRpc01vdmVNZW1vcnkoJnBBZGFwdGVyLT5TdGFDZmcuU2F2ZWRQTUtbQ2FjaGVkSWR4XSwgcEJzc0lkSW5mbywgc2l6ZW9mKEJTU0lEX0lORk8pKTsKKwkJCQkgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuU2F2ZWRQTUtOdW0rKzsKKwkJCSAgICAgICAgfQorCQkJICAgICAgICAvLyBOb3QgZm91bmQsIHJlcGxhY2UgdGhlIGxhc3Qgb25lCisJCQkgICAgICAgIGVsc2UKKwkJCSAgICAgICAgeworCQkJCSAgICAgICAgLy8gUmFuZG9tbHkgcmVwbGFjZSBvbmUKKwkJCQkgICAgICAgIENhY2hlZElkeCA9IChwQnNzSWRJbmZvLT5CU1NJRFs1XSAlIFBNS0lEX05PKTsKKwkJCQkgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX09GRiwgKCJVcGRhdGUgT0lEXzgwMl8xMV9QTUtJRCwgaWR4ID0gJWRcbiIsIENhY2hlZElkeCkpOworCQkJCSAgICAgICAgTmRpc01vdmVNZW1vcnkoJnBBZGFwdGVyLT5TdGFDZmcuU2F2ZWRQTUtbQ2FjaGVkSWR4XSwgcEJzc0lkSW5mbywgc2l6ZW9mKEJTU0lEX0lORk8pKTsKKwkJCSAgICAgICAgfQorCQkgICAgICAgIH0KKwkJCX0KKwkJCWlmKHBQbWtJZCkKKwkJCQlrZnJlZShwUG1rSWQpOworCSAgICAgICAgYnJlYWs7CisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCisKKworI2lmZGVmIFNOTVBfU1VQUE9SVAorCQljYXNlIE9JRF84MDJfMTFfU0hPUlRSRVRSWUxJTUlUOgorCQkJaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoVUxPTkcpKQorCQkJCVN0YXR1cyA9IC1FSU5WQUw7CisJCQllbHNlCisJCQl7CisJCQkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJlNob3J0UmV0cnlMaW1pdCwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCQlSVE1QX0lPX1JFQUQzMihwQWRhcHRlciwgVFhfUlRZX0NGRywgJnR4X3J0eV9jZmcud29yZCk7CisJCQkJdHhfcnR5X2NmZy5maWVsZC5TaG9ydFJ0eUxpbWl0ID0gU2hvcnRSZXRyeUxpbWl0OworCQkJCVJUTVBfSU9fV1JJVEUzMihwQWRhcHRlciwgVFhfUlRZX0NGRywgdHhfcnR5X2NmZy53b3JkKTsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfU0hPUlRSRVRSWUxJTUlUICh0eF9ydHlfY2ZnLmZpZWxkLlNob3J0UmV0cnlMaW1pdD0lZCwgU2hvcnRSZXRyeUxpbWl0PSVsZClcbiIsIHR4X3J0eV9jZmcuZmllbGQuU2hvcnRSdHlMaW1pdCwgU2hvcnRSZXRyeUxpbWl0KSk7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIE9JRF84MDJfMTFfTE9OR1JFVFJZTElNSVQ6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfTE9OR1JFVFJZTElNSVQgXG4iKSk7CisJCQlpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihVTE9ORykpCisJCQkJU3RhdHVzID0gLUVJTlZBTDsKKwkJCWVsc2UKKwkJCXsKKwkJCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmTG9uZ1JldHJ5TGltaXQsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQkJUlRNUF9JT19SRUFEMzIocEFkYXB0ZXIsIFRYX1JUWV9DRkcsICZ0eF9ydHlfY2ZnLndvcmQpOworCQkJCXR4X3J0eV9jZmcuZmllbGQuTG9uZ1J0eUxpbWl0ID0gTG9uZ1JldHJ5TGltaXQ7CisJCQkJUlRNUF9JT19XUklURTMyKHBBZGFwdGVyLCBUWF9SVFlfQ0ZHLCB0eF9ydHlfY2ZnLndvcmQpOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9MT05HUkVUUllMSU1JVCAodHhfcnR5X2NmZy5maWVsZC5Mb25nUmV0cnlMaW1pdD0gJWQsTG9uZ1JldHJ5TGltaXQ9JWxkKVxuIiwgdHhfcnR5X2NmZy5maWVsZC5Mb25nUnR5TGltaXQsIExvbmdSZXRyeUxpbWl0KSk7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIE9JRF84MDJfMTFfV0VQREVGQVVMVEtFWVZBTFVFOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX1dFUERFRkFVTFRLRVlWQUxVRVxuIikpOworCQkJcEtleSA9IGttYWxsb2Mod3JxLT51LmRhdGEubGVuZ3RoLCBHRlBfS0VSTkVMKTsKKwkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKHBLZXksIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQkvL3BLZXkgPSAmV2VwS2V5OworCisJCQlpZiAoIHBLZXktPkxlbmd0aCAhPSB3cnEtPnUuZGF0YS5sZW5ndGgpCisJCQl7CisJCQkJU3RhdHVzID0gLUVJTlZBTDsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfV0VQREVGQVVMVEtFWVZBTFVFLCBGYWlsZWQhIVxuIikpOworCQkJfQorCQkJS2V5SWR4ID0gcEtleS0+S2V5SW5kZXggJiAweDBmZmZmZmZmOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJwS2V5LT5LZXlJbmRleCA9JWQsIHBLZXktPktleUxlbmd0aD0lZFxuIiwgcEtleS0+S2V5SW5kZXgsIHBLZXktPktleUxlbmd0aCkpOworCisJCQkvLyBpdCBpcyBhIHNoYXJlZCBrZXkKKwkJCWlmIChLZXlJZHggPiA0KQorCQkJCVN0YXR1cyA9IC1FSU5WQUw7CisJCQllbHNlCisJCQl7CisJCQkJcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uS2V5TGVuID0gKFVDSEFSKSBwS2V5LT5LZXlMZW5ndGg7CisJCQkJTmRpc01vdmVNZW1vcnkoJnBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWRdLktleSwgJnBLZXktPktleU1hdGVyaWFsLCBwS2V5LT5LZXlMZW5ndGgpOworCQkJCWlmIChwS2V5LT5LZXlJbmRleCAmIDB4ODAwMDAwMDApCisJCQkJeworCQkJCQkvLyBEZWZhdWx0IGtleSBmb3IgdHggKHNoYXJlZCBrZXkpCisJCQkJCXBBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkID0gKFVDSEFSKSBLZXlJZHg7CisJCQkJfQorCQkJCS8vUmVzdGFydEFQSXNSZXF1aXJlZCA9IFRSVUU7CisJCQl9CisJCQlicmVhazsKKworCisJCWNhc2UgT0lEXzgwMl8xMV9XRVBERUZBVUxUS0VZSUQ6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfV0VQREVGQVVMVEtFWUlEIFxuIikpOworCisJCQlpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihVQ0hBUikpCisJCQkJU3RhdHVzID0gLUVJTlZBTDsKKwkJCWVsc2UKKwkJCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWQsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisKKwkJCWJyZWFrOworCisKKwkJY2FzZSBPSURfODAyXzExX0NVUlJFTlRDSEFOTkVMOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX0NVUlJFTlRDSEFOTkVMIFxuIikpOworCQkJaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoVUNIQVIpKQorCQkJCVN0YXR1cyA9IC1FSU5WQUw7CisJCQllbHNlCisJCQl7CisJCQkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJmN0bXAsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQkJc3ByaW50ZigmY3RtcCwiJWQiLCBjdG1wKTsKKwkJCQlTZXRfQ2hhbm5lbF9Qcm9jKHBBZGFwdGVyLCAmY3RtcCk7CisJCQl9CisJCQlicmVhazsKKyNlbmRpZgorCisKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0Ojp1bmtub3duIElPQ1RMJ3Mgc3ViY21kID0gMHglMDh4XG4iLCBjbWQpKTsKKyAgICAgICAgICAgIFN0YXR1cyA9IC1FT1BOT1RTVVBQOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisKKyAgICByZXR1cm4gU3RhdHVzOworfQorCitJTlQgUlRNUFF1ZXJ5SW5mb3JtYXRpb24oCisgICAgSU4gIFBSVE1QX0FEQVBURVIgcEFkYXB0ZXIsCisgICAgSU4gIE9VVCBzdHJ1Y3QgaWZyZXEgICAgKnJxLAorICAgIElOICBJTlQgICAgICAgICAgICAgICAgIGNtZCkKK3sKKyAgICBzdHJ1Y3QgaXdyZXEgICAgICAgICAgICAgICAgICAgICAgICAqd3JxID0gKHN0cnVjdCBpd3JlcSAqKSBycTsKKyAgICBORElTXzgwMl8xMV9CU1NJRF9MSVNUX0VYICAgICAgICAgICAqcEJzc2lkTGlzdCA9IE5VTEw7CisgICAgUE5ESVNfV0xBTl9CU1NJRF9FWCAgICAgICAgICAgICAgICAgcEJzczsKKyAgICBORElTXzgwMl8xMV9TU0lEICAgICAgICAgICAgICAgICAgICBTc2lkOworICAgIE5ESVNfODAyXzExX0NPTkZJR1VSQVRJT04gICAgICAgICAgICpwQ29uZmlndXJhdGlvbiA9IE5VTEw7CisgICAgUlRfODAyXzExX0xJTktfU1RBVFVTICAgICAgICAgICAgICAgKnBMaW5rU3RhdHVzID0gTlVMTDsKKyAgICBSVF84MDJfMTFfU1RBX0NPTkZJRyAgICAgICAgICAgICAgICAqcFN0YUNvbmZpZyA9IE5VTEw7CisgICAgTkRJU184MDJfMTFfU1RBVElTVElDUyAgICAgICAgICAgICAgKnBTdGF0aXN0aWNzID0gTlVMTDsKKyAgICBORElTXzgwMl8xMV9SVFNfVEhSRVNIT0xEICAgICAgICAgICBSdHNUaHJlc2g7CisgICAgTkRJU184MDJfMTFfRlJBR01FTlRBVElPTl9USFJFU0hPTEQgRnJhZ1RocmVzaDsKKyAgICBORElTXzgwMl8xMV9QT1dFUl9NT0RFICAgICAgICAgICAgICBQb3dlck1vZGU7CisgICAgTkRJU184MDJfMTFfTkVUV09SS19JTkZSQVNUUlVDVFVSRSAgQnNzVHlwZTsKKyAgICBSVF84MDJfMTFfUFJFQU1CTEUgICAgICAgICAgICAgICAgICBQcmVhbVR5cGU7CisgICAgTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fTU9ERSAgICAgQXV0aE1vZGU7CisgICAgTkRJU184MDJfMTFfV0VQX1NUQVRVUyAgICAgICAgICAgICAgV2VwU3RhdHVzOworICAgIE5ESVNfTUVESUFfU1RBVEUgICAgICAgICAgICAgICAgICAgIE1lZGlhU3RhdGU7CisgICAgVUxPTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnNzQnVmU2l6ZSwgdWxJbmZvPTAsIE5ldHdvcmtUeXBlTGlzdFs0XSwgYXBzZCA9IDA7CisgICAgVVNIT1JUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnNzTGVuID0gMDsKKyAgICBQVUNIQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQnVmID0gTlVMTCwgcFB0cjsKKyAgICBJTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworICAgIFVJTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlX3ZlcnNpb25fY29tcGlsZWQ7CisgICAgVUNIQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwgUGFkZGluZyA9IDA7CisgICAgQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmFkaW9TdGF0ZTsKKwlVQ0hBUglkcml2ZXJWZXJzaW9uWzhdOworICAgIE9JRF9TRVRfSFRfUEhZTU9ERQkJCSAgICAgICAgKnBIVFBoeU1vZGUgPSBOVUxMOworCisKKyNpZmRlZiBTTk1QX1NVUFBPUlQKKwkvL2ZvciBzbm1wLCBrYXRoeQorCURlZmF1bHRLZXlJZHhWYWx1ZQkJCSpwS2V5SWR4VmFsdWU7CisJSU5UCQkJCQkJCXZhbHVlTGVuOworCVRYX1JUWV9DRkdfU1RSVUMJCQl0eF9ydHlfY2ZnOworCVVMT05HCQkJCQkJU2hvcnRSZXRyeUxpbWl0LCBMb25nUmV0cnlMaW1pdDsKKwlVQ0hBUgkJCQkJCXRtcFs2NF07CisjZW5kaWYgLy9TTk1QCisKKyAgICBzd2l0Y2goY21kKQorICAgIHsKKyAgICAgICAgY2FzZSBSVF9PSURfREVWSUNFX05BTUU6CisgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoU1RBX05JQ19ERVZJQ0VfTkFNRSk7CisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgU1RBX05JQ19ERVZJQ0VfTkFNRSwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJUX09JRF9WRVJTSU9OX0lORk86CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEX1ZFUlNJT05fSU5GTyBcbiIpKTsKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IDgqc2l6ZW9mKFVDSEFSKTsKKwkJCXNwcmludGYoJmRyaXZlclZlcnNpb25bMF0sICIlcyIsIFNUQV9EUklWRVJfVkVSU0lPTik7CisJCQlkcml2ZXJWZXJzaW9uWzddID0gJ1wwJzsKKwkJCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJmRyaXZlclZlcnNpb24sIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICB7CisJCQkJU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworI2lmZGVmIFJBTElOS19BVEUKKwkJY2FzZSBSVF9RVUVSWV9BVEVfVFhET05FX0NPVU5UOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX1FVRVJZX0FURV9UWERPTkVfQ09VTlQgXG4iKSk7CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoVUlOVDMyKTsKKwkJCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnBBZGFwdGVyLT5hdGUuVHhEb25lQ291bnQsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisJCQl7CisJCQkJU3RhdHVzID0gLUVGQVVMVDsKKwkJCX0KKwkJCWJyZWFrOworI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKyAgICAgICAgY2FzZSBPSURfODAyXzExX0JTU0lEX0xJU1Q6CisgICAgICAgICAgICBpZiAoUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgCS8qCisgICAgICAgICAgICAJICogU3RpbGwgc2Nhbm5pbmcsIGluZGljYXRlIHRoZSBjYWxsZXIgc2hvdWxkIHRyeSBhZ2Fpbi4KKyAgICAgICAgICAgIAkgKi8KKyAgICAgICAgICAgIAlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9CU1NJRF9MSVNUIChTdGlsbCBzY2FubmluZylcbiIpKTsKKwkJCQlyZXR1cm4gLUVBR0FJTjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX0JTU0lEX0xJU1QgKCVkIEJTUyByZXR1cm5lZClcbiIscEFkYXB0ZXItPlNjYW5UYWIuQnNzTnIpKTsKKwkJCXBBZGFwdGVyLT5TdGFDZmcuYlNjYW5SZXFJc0Zyb21XZWJVSSA9IEZBTFNFOworICAgICAgICAgICAgLy8gQ2xhY3VsYXRlIHRvdGFsIGJ1ZmZlciBzaXplIHJlcXVpcmVkCisgICAgICAgICAgICBCc3NCdWZTaXplID0gc2l6ZW9mKFVMT05HKTsKKworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHBBZGFwdGVyLT5TY2FuVGFiLkJzc05yOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gQWxpZ24gcG9pbnRlciB0byA0IGJ5dGVzIGJvdW5kYXJ5LgorICAgICAgICAgICAgICAgIC8vUGFkZGluZyA9IDQgLSAocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uVmFySUVMZW4gJiAweDAwMDMpOworICAgICAgICAgICAgICAgIC8vaWYgKFBhZGRpbmcgPT0gNCkKKyAgICAgICAgICAgICAgICAvLyAgICBQYWRkaW5nID0gMDsKKyAgICAgICAgICAgICAgICBCc3NCdWZTaXplICs9IChzaXplb2YoTkRJU19XTEFOX0JTU0lEX0VYKSAtIDEgKyBzaXplb2YoTkRJU184MDJfMTFfRklYRURfSUVzKSArIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlZhcklFTGVuICsgUGFkZGluZyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEZvciBzYWZldHkgaXNzdWUsIHdlIGFkZCAyNTYgYnl0ZXMganVzdCBpbiBjYXNlCisgICAgICAgICAgICBCc3NCdWZTaXplICs9IDI1NjsKKyAgICAgICAgICAgIC8vIEFsbG9jYXRlIHRoZSBzYW1lIHNpemUgYXMgcGFzc2VkIGZyb20gaGlnaGVyIGxheWVyCisgICAgICAgICAgICBwQnVmID0ga21hbGxvYyhCc3NCdWZTaXplLCBNRU1fQUxMT0NfRkxBRyk7CisgICAgICAgICAgICBpZihwQnVmID09IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVOT01FTTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIEluaXQgODAyXzExX0JTU0lEX0xJU1RfRVggc3RydWN0dXJlCisgICAgICAgICAgICBOZGlzWmVyb01lbW9yeShwQnVmLCBCc3NCdWZTaXplKTsKKyAgICAgICAgICAgIHBCc3NpZExpc3QgPSAoUE5ESVNfODAyXzExX0JTU0lEX0xJU1RfRVgpIHBCdWY7CisgICAgICAgICAgICBwQnNzaWRMaXN0LT5OdW1iZXJPZkl0ZW1zID0gcEFkYXB0ZXItPlNjYW5UYWIuQnNzTnI7CisKKyAgICAgICAgICAgIC8vIENhbGN1bGF0ZSB0b3RhbCBidWZmZXIgbGVuZ3RoCisgICAgICAgICAgICBCc3NMZW4gPSA0OyAvLyBDb25zaXN0IG9mIE51bWJlck9mSXRlbXMKKyAgICAgICAgICAgIC8vIFBvaW50IHRvIHN0YXJ0IG9mIE5ESVNfV0xBTl9CU1NJRF9FWAorICAgICAgICAgICAgLy8gcFB0ciA9IHBCdWYgKyBzaXplb2YoVUxPTkcpOworICAgICAgICAgICAgcFB0ciA9IChQVUNIQVIpICZwQnNzaWRMaXN0LT5Cc3NpZFswXTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwQWRhcHRlci0+U2NhblRhYi5Cc3NOcjsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBCc3MgPSAoUE5ESVNfV0xBTl9CU1NJRF9FWCkgcFB0cjsKKyAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeSgmcEJzcy0+TWFjQWRkcmVzcywgJnBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkJzc2lkLCBNQUNfQUREUl9MRU4pOworICAgICAgICAgICAgICAgIGlmICgocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uSGlkZGVuID09IDEpICYmIChwQWRhcHRlci0+U3RhQ2ZnLmJTaG93SGlkZGVuU1NJRCA9PSBGQUxTRSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLworCQkJCQkvLyBXZSBtdXN0IHJldHVybiB0aGlzIFNTSUQgZHVyaW5nIDR3YXkgaGFuZHNoYWtpbmcsIG90aGVyd2lzZSBBZWdpcyB3aWxsIGZhaWxlZCB0byBwYXJzZSBXUEEgaW5mb21hdGlvbgorCQkJCQkvLyBhbmQgdGhlbiBmYWlsZWQgdG8gc2VuZCBFQVBPbCBmYXJhbWUuCisJCQkJCS8vCisJCQkJCWlmICgocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpICYmIChwQWRhcHRlci0+U3RhQ2ZnLlBvcnRTZWN1cmVkICE9IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEKSkKKwkJCQkJeworCQkJCQkJcEJzcy0+U3NpZC5Tc2lkTGVuZ3RoID0gcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uU3NpZExlbjsKKwkJCQkJCU5kaXNNb3ZlTWVtb3J5KHBCc3MtPlNzaWQuU3NpZCwgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uU3NpZCwgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uU3NpZExlbik7CisJCQkJCX0KKwkJCQkJZWxzZQorICAgICAgICAgICAgICAgICAgICAJcEJzcy0+U3NpZC5Tc2lkTGVuZ3RoID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcEJzcy0+U3NpZC5Tc2lkTGVuZ3RoID0gcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uU3NpZExlbjsKKyAgICAgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEJzcy0+U3NpZC5Tc2lkLCBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Tc2lkLCBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Tc2lkTGVuKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcEJzcy0+UHJpdmFjeSA9IHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlByaXZhY3k7CisgICAgICAgICAgICAgICAgcEJzcy0+UnNzaSA9IHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlJzc2kgLSBwQWRhcHRlci0+QmJwUnNzaVRvRGJtRGVsdGE7CisgICAgICAgICAgICAgICAgcEJzcy0+TmV0d29ya1R5cGVJblVzZSA9IE5ldHdvcmtUeXBlSW5Vc2VTYW5pdHkoJnBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldKTsKKyAgICAgICAgICAgICAgICBwQnNzLT5Db25maWd1cmF0aW9uLkxlbmd0aCA9IHNpemVvZihORElTXzgwMl8xMV9DT05GSUdVUkFUSU9OKTsKKyAgICAgICAgICAgICAgICBwQnNzLT5Db25maWd1cmF0aW9uLkJlYWNvblBlcmlvZCA9IHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkJlYWNvblBlcmlvZDsKKyAgICAgICAgICAgICAgICBwQnNzLT5Db25maWd1cmF0aW9uLkFUSU1XaW5kb3cgPSBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5BdGltV2luOworCisgICAgICAgICAgICAgICAgTUFQX0NIQU5ORUxfSURfVE9fS0haKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkNoYW5uZWwsIHBCc3MtPkNvbmZpZ3VyYXRpb24uRFNDb25maWcpOworCisgICAgICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkJzc1R5cGUgPT0gQlNTX0lORlJBKQorICAgICAgICAgICAgICAgICAgICBwQnNzLT5JbmZyYXN0cnVjdHVyZU1vZGUgPSBOZGlzODAyXzExSW5mcmFzdHJ1Y3R1cmU7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBwQnNzLT5JbmZyYXN0cnVjdHVyZU1vZGUgPSBOZGlzODAyXzExSUJTUzsKKworICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBCc3MtPlN1cHBvcnRlZFJhdGVzLCBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5TdXBSYXRlLCBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5TdXBSYXRlTGVuKTsKKyAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQnNzLT5TdXBwb3J0ZWRSYXRlcyArIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlN1cFJhdGVMZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uRXh0UmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5FeHRSYXRlTGVuKTsKKworICAgICAgICAgICAgICAgIGlmIChwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5WYXJJRUxlbiA9PSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcEJzcy0+SUVMZW5ndGggPSBzaXplb2YoTkRJU184MDJfMTFfRklYRURfSUVzKTsKKyAgICAgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEJzcy0+SUVzLCAmcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uRml4SUVzLCBzaXplb2YoTkRJU184MDJfMTFfRklYRURfSUVzKSk7CisgICAgICAgICAgICAgICAgICAgIHBQdHIgPSBwUHRyICsgc2l6ZW9mKE5ESVNfV0xBTl9CU1NJRF9FWCkgLSAxICsgc2l6ZW9mKE5ESVNfODAyXzExX0ZJWEVEX0lFcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBCc3MtPklFTGVuZ3RoID0gKFVMT05HKShzaXplb2YoTkRJU184MDJfMTFfRklYRURfSUVzKSArIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlZhcklFTGVuKTsKKyAgICAgICAgICAgICAgICAgICAgcFB0ciA9IHBQdHIgKyBzaXplb2YoTkRJU19XTEFOX0JTU0lEX0VYKSAtIDEgKyBzaXplb2YoTkRJU184MDJfMTFfRklYRURfSUVzKTsKKyAgICAgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEJzcy0+SUVzLCAmcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uRml4SUVzLCBzaXplb2YoTkRJU184MDJfMTFfRklYRURfSUVzKSk7CisgICAgICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBCc3MtPklFcyArIHNpemVvZihORElTXzgwMl8xMV9GSVhFRF9JRXMpLCBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5WYXJJRXMsIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlZhcklFTGVuKTsKKyAgICAgICAgICAgICAgICAgICAgcFB0ciArPSBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5WYXJJRUxlbjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcEJzcy0+TGVuZ3RoID0gKFVMT05HKShzaXplb2YoTkRJU19XTEFOX0JTU0lEX0VYKSAtIDEgKyBzaXplb2YoTkRJU184MDJfMTFfRklYRURfSUVzKSArIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlZhcklFTGVuICsgUGFkZGluZyk7CisKKyNpZiBXSVJFTEVTU19FWFQgPCAxNworICAgICAgICAgICAgICAgIGlmICgoQnNzTGVuICsgcEJzcy0+TGVuZ3RoKSA8IHdycS0+dS5kYXRhLmxlbmd0aCkKKyAgICAgICAgICAgICAgICBCc3NMZW4gKz0gcEJzcy0+TGVuZ3RoOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBCc3NpZExpc3QtPk51bWJlck9mSXRlbXMgPSBpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisjZWxzZQorICAgICAgICAgICAgICAgIEJzc0xlbiArPSBwQnNzLT5MZW5ndGg7CisjZW5kaWYKKyAgICAgICAgICAgIH0KKworI2lmIFdJUkVMRVNTX0VYVCA8IDE3CisgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBCc3NMZW47CisjZWxzZQorICAgICAgICAgICAgaWYgKEJzc0xlbiA+IHdycS0+dS5kYXRhLmxlbmd0aCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBrZnJlZShwQnNzaWRMaXN0KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUUyQklHOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IEJzc0xlbjsKKyNlbmRpZgorICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBCc3NpZExpc3QsIEJzc0xlbik7CisgICAgICAgICAgICBrZnJlZShwQnNzaWRMaXN0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfM19DVVJSRU5UX0FERFJFU1M6CisgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBNQUNfQUREUl9MRU47CisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnBBZGFwdGVyLT5DdXJyZW50QWRkcmVzcywgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF9HRU5fTUVESUFfQ09OTkVDVF9TVEFUVVM6CisgICAgICAgICAgICBpZiAocEFkYXB0ZXItPkluZGljYXRlTWVkaWFTdGF0ZSA9PSBOZGlzTWVkaWFTdGF0ZUNvbm5lY3RlZCkKKyAgICAgICAgICAgICAgICBNZWRpYVN0YXRlID0gTmRpc01lZGlhU3RhdGVDb25uZWN0ZWQ7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgTWVkaWFTdGF0ZSA9IE5kaXNNZWRpYVN0YXRlRGlzY29ubmVjdGVkOworCisgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoTkRJU19NRURJQV9TVEFURSk7CisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJk1lZGlhU3RhdGUsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX0JTU0lEOgorI2lmZGVmIFJBTElOS19BVEUKKwkJCWlmIChBVEVfT04ocEFkYXB0ZXIpKQorCQkJeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlRoZSBkcml2ZXIgaXMgaW4gQVRFIG1vZGUgbm93XG4iKSk7CisJCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfUkVTT1VSQ0VTOworCQkJCWJyZWFrOworCQkJfQorI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKyAgICAgICAgICAgIGlmIChJTkZSQV9PTihwQWRhcHRlcikgfHwgQURIT0NfT04ocEFkYXB0ZXIpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmcEFkYXB0ZXItPkNvbW1vbkNmZy5Cc3NpZCwgc2l6ZW9mKE5ESVNfODAyXzExX01BQ19BRERSRVNTKSk7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9CU1NJRCg9RU1QVFkpXG4iKSk7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVOT1RDT05OOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9TU0lEOgorCQkJTmRpc1plcm9NZW1vcnkoJlNzaWQsIHNpemVvZihORElTXzgwMl8xMV9TU0lEKSk7CisJCQlOZGlzWmVyb01lbW9yeShTc2lkLlNzaWQsIE1BWF9MRU5fT0ZfU1NJRCk7CisgICAgICAgICAgICBTc2lkLlNzaWRMZW5ndGggPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLlNzaWRMZW47CisJCQltZW1jcHkoU3NpZC5Tc2lkLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLlNzaWQsCVNzaWQuU3NpZExlbmd0aCk7CisgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoTkRJU184MDJfMTFfU1NJRCk7CisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJlNzaWQsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9TU0lEIChMZW49JWQsIHNzaWQ9JXMpXG4iLCBTc2lkLlNzaWRMZW5ndGgsU3NpZC5Tc2lkKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX1FVRVJZX0xJTktfU1RBVFVTOgorICAgICAgICAgICAgcExpbmtTdGF0dXMgPSAoUlRfODAyXzExX0xJTktfU1RBVFVTICopIGttYWxsb2Moc2l6ZW9mKFJUXzgwMl8xMV9MSU5LX1NUQVRVUyksIE1FTV9BTExPQ19GTEFHKTsKKyAgICAgICAgICAgIGlmIChwTGlua1N0YXR1cykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwTGlua1N0YXR1cy0+Q3VyclR4UmF0ZSA9IFJhdGVJZFRvNTAwS2Jwc1twQWRhcHRlci0+Q29tbW9uQ2ZnLlR4UmF0ZV07ICAgLy8gdW5pdCA6IDUwMCBrYnBzCisgICAgICAgICAgICAgICAgcExpbmtTdGF0dXMtPkNoYW5uZWxRdWFsaXR5ID0gcEFkYXB0ZXItPk1sbWUuQ2hhbm5lbFF1YWxpdHk7CisgICAgICAgICAgICAgICAgcExpbmtTdGF0dXMtPlJ4Qnl0ZUNvdW50ID0gcEFkYXB0ZXItPlJhbGlua0NvdW50ZXJzLlJlY2VpdmVkQnl0ZUNvdW50OworICAgICAgICAgICAgICAgIHBMaW5rU3RhdHVzLT5UeEJ5dGVDb3VudCA9IHBBZGFwdGVyLT5SYWxpbmtDb3VudGVycy5UcmFuc21pdHRlZEJ5dGVDb3VudDsKKyAgICAgICAgCQlwTGlua1N0YXR1cy0+Q2VudHJhbENoYW5uZWwgPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsOworICAgICAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihSVF84MDJfMTFfTElOS19TVEFUVVMpOworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwTGlua1N0YXR1cywgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBrZnJlZShwTGlua1N0YXR1cyk7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfUVVFUllfTElOS19TVEFUVVNcbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9RVUVSWV9MSU5LX1NUQVRVUyhrbWFsbG9jIGZhaWxlZClcbiIpKTsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9DT05GSUdVUkFUSU9OOgorICAgICAgICAgICAgcENvbmZpZ3VyYXRpb24gPSAoTkRJU184MDJfMTFfQ09ORklHVVJBVElPTiAqKSBrbWFsbG9jKHNpemVvZihORElTXzgwMl8xMV9DT05GSUdVUkFUSU9OKSwgTUVNX0FMTE9DX0ZMQUcpOworICAgICAgICAgICAgaWYgKHBDb25maWd1cmF0aW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBDb25maWd1cmF0aW9uLT5MZW5ndGggPSBzaXplb2YoTkRJU184MDJfMTFfQ09ORklHVVJBVElPTik7CisgICAgICAgICAgICAgICAgcENvbmZpZ3VyYXRpb24tPkJlYWNvblBlcmlvZCA9IHBBZGFwdGVyLT5Db21tb25DZmcuQmVhY29uUGVyaW9kOworICAgICAgICAgICAgICAgIHBDb25maWd1cmF0aW9uLT5BVElNV2luZG93ID0gcEFkYXB0ZXItPlN0YUFjdGl2ZS5BdGltV2luOworICAgICAgICAgICAgICAgIE1BUF9DSEFOTkVMX0lEX1RPX0tIWihwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWwsIHBDb25maWd1cmF0aW9uLT5EU0NvbmZpZyk7CisgICAgICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKE5ESVNfODAyXzExX0NPTkZJR1VSQVRJT04pOworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwQ29uZmlndXJhdGlvbiwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9DT05GSUdVUkFUSU9OKEJlYWNvblBlcmlvZD0lbGQsQXRpbVc9JWxkLENoYW5uZWw9JWQpIFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29uZmlndXJhdGlvbi0+QmVhY29uUGVyaW9kLCBwQ29uZmlndXJhdGlvbi0+QVRJTVdpbmRvdywgcEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsKSk7CisJCQkJa2ZyZWUocENvbmZpZ3VyYXRpb24pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX0NPTkZJR1VSQVRJT04oa21hbGxvYyBmYWlsZWQpXG4iKSk7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCQljYXNlIFJUX09JRF84MDJfMTFfU05SXzA6CisJCQlpZiAoKHBBZGFwdGVyLT5TdGFDZmcuTGFzdFNOUjAgPiAwKSkKKwkJCXsKKwkJCQl1bEluZm8gPSAoKDB4ZWIJLSBwQWRhcHRlci0+U3RhQ2ZnLkxhc3RTTlIwKSAqIDMpIC8JMTYgOworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZih1bEluZm8pOworCQkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmdWxJbmZvLAl3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1NOUl8wKDB4PSVseClcbiIsIHVsSW5mbykpOworCQkJfQorICAgICAgICAgICAgZWxzZQorCQkJICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisJCQlicmVhazsKKwkJY2FzZSBSVF9PSURfODAyXzExX1NOUl8xOgorCQkJaWYgKChwQWRhcHRlci0+QW50ZW5uYS5maWVsZC5SeFBhdGgJPiAxKSAmJgorICAgICAgICAgICAgICAgIChwQWRhcHRlci0+U3RhQ2ZnLkxhc3RTTlIxID4gMCkpCisJCQl7CisJCQkJdWxJbmZvID0gKCgweGViCS0gcEFkYXB0ZXItPlN0YUNmZy5MYXN0U05SMSkgKiAzKSAvCTE2IDsKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YodWxJbmZvKTsKKwkJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnVsSW5mbywJd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1NOUl8xKDB4PSVseClcbiIsdWxJbmZvKSk7CisJCQl9CisJCQllbHNlCisJCQkJU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUXVlcnk6OlJUX09JRF84MDJfMTFfU05SXzEocEFkYXB0ZXItPlN0YUNmZy5MYXN0U05SMT0lZClcbiIscEFkYXB0ZXItPlN0YUNmZy5MYXN0U05SMSkpOworCQkJYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9SU1NJX1RSSUdHRVI6CisgICAgICAgICAgICB1bEluZm8gPSBwQWRhcHRlci0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kwIC0gcEFkYXB0ZXItPkJicFJzc2lUb0RibURlbHRhOworICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHVsSW5mbyk7CisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnVsSW5mbywgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX1JTU0lfVFJJR0dFUig9JWxkKVxuIiwgdWxJbmZvKSk7CisgICAgICAgICAgICBicmVhazsKKwkJY2FzZSBPSURfODAyXzExX1JTU0k6CisgICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9SU1NJOgorCQkJdWxJbmZvID0gcEFkYXB0ZXItPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMDsKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZih1bEluZm8pOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZ1bEluZm8sCXdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlicmVhazsKKwkJY2FzZSBSVF9PSURfODAyXzExX1JTU0lfMToKKyAgICAgICAgICAgIHVsSW5mbyA9IHBBZGFwdGVyLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTE7CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YodWxJbmZvKTsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmdWxJbmZvLAl3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJYnJlYWs7CisgICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9SU1NJXzI6CisgICAgICAgICAgICB1bEluZm8gPSBwQWRhcHRlci0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kyOworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHVsSW5mbyk7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnVsSW5mbywJd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCWJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfU1RBVElTVElDUzoKKyAgICAgICAgICAgIHBTdGF0aXN0aWNzID0gKE5ESVNfODAyXzExX1NUQVRJU1RJQ1MgKikga21hbGxvYyhzaXplb2YoTkRJU184MDJfMTFfU1RBVElTVElDUyksIE1FTV9BTExPQ19GTEFHKTsKKyAgICAgICAgICAgIGlmIChwU3RhdGlzdGljcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9TVEFUSVNUSUNTIFxuIikpOworICAgICAgICAgICAgICAgIC8vIGFkZCB0aGUgbW9zdCB1cC10by1kYXRlIGgvdyByYXcgY291bnRlcnMgaW50byBzb2Z0d2FyZSBjb3VudGVycworCQkJICAgIE5JQ1VwZGF0ZVJhd0NvdW50ZXJzKHBBZGFwdGVyKTsKKworICAgICAgICAgICAgICAgIC8vIFNhbml0eSBjaGVjayBmb3IgY2FsY3VsYXRpb24gb2Ygc3VjZXNzZnVsIGNvdW50CisgICAgICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5XbGFuQ291bnRlcnMuVHJhbnNtaXR0ZWRGcmFnbWVudENvdW50LlF1YWRQYXJ0IDwgcEFkYXB0ZXItPldsYW5Db3VudGVycy5SZXRyeUNvdW50LlF1YWRQYXJ0KQorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+V2xhbkNvdW50ZXJzLlRyYW5zbWl0dGVkRnJhZ21lbnRDb3VudC5RdWFkUGFydCA9IHBBZGFwdGVyLT5XbGFuQ291bnRlcnMuUmV0cnlDb3VudC5RdWFkUGFydDsKKworICAgICAgICAgICAgICAgIHBTdGF0aXN0aWNzLT5UcmFuc21pdHRlZEZyYWdtZW50Q291bnQuUXVhZFBhcnQgPSBwQWRhcHRlci0+V2xhbkNvdW50ZXJzLlRyYW5zbWl0dGVkRnJhZ21lbnRDb3VudC5RdWFkUGFydDsKKyAgICAgICAgICAgICAgICBwU3RhdGlzdGljcy0+TXVsdGljYXN0VHJhbnNtaXR0ZWRGcmFtZUNvdW50LlF1YWRQYXJ0ID0gcEFkYXB0ZXItPldsYW5Db3VudGVycy5NdWx0aWNhc3RUcmFuc21pdHRlZEZyYW1lQ291bnQuUXVhZFBhcnQ7CisgICAgICAgICAgICAgICAgcFN0YXRpc3RpY3MtPkZhaWxlZENvdW50LlF1YWRQYXJ0ID0gcEFkYXB0ZXItPldsYW5Db3VudGVycy5GYWlsZWRDb3VudC5RdWFkUGFydDsKKyAgICAgICAgICAgICAgICBwU3RhdGlzdGljcy0+UmV0cnlDb3VudC5RdWFkUGFydCA9IHBBZGFwdGVyLT5XbGFuQ291bnRlcnMuUmV0cnlDb3VudC5RdWFkUGFydDsKKyAgICAgICAgICAgICAgICBwU3RhdGlzdGljcy0+TXVsdGlwbGVSZXRyeUNvdW50LlF1YWRQYXJ0ID0gcEFkYXB0ZXItPldsYW5Db3VudGVycy5NdWx0aXBsZVJldHJ5Q291bnQuUXVhZFBhcnQ7CisgICAgICAgICAgICAgICAgcFN0YXRpc3RpY3MtPlJUU1N1Y2Nlc3NDb3VudC5RdWFkUGFydCA9IHBBZGFwdGVyLT5XbGFuQ291bnRlcnMuUlRTU3VjY2Vzc0NvdW50LlF1YWRQYXJ0OworICAgICAgICAgICAgICAgIHBTdGF0aXN0aWNzLT5SVFNGYWlsdXJlQ291bnQuUXVhZFBhcnQgPSBwQWRhcHRlci0+V2xhbkNvdW50ZXJzLlJUU0ZhaWx1cmVDb3VudC5RdWFkUGFydDsKKyAgICAgICAgICAgICAgICBwU3RhdGlzdGljcy0+QUNLRmFpbHVyZUNvdW50LlF1YWRQYXJ0ID0gcEFkYXB0ZXItPldsYW5Db3VudGVycy5BQ0tGYWlsdXJlQ291bnQuUXVhZFBhcnQ7CisgICAgICAgICAgICAgICAgcFN0YXRpc3RpY3MtPkZyYW1lRHVwbGljYXRlQ291bnQuUXVhZFBhcnQgPSBwQWRhcHRlci0+V2xhbkNvdW50ZXJzLkZyYW1lRHVwbGljYXRlQ291bnQuUXVhZFBhcnQ7CisgICAgICAgICAgICAgICAgcFN0YXRpc3RpY3MtPlJlY2VpdmVkRnJhZ21lbnRDb3VudC5RdWFkUGFydCA9IHBBZGFwdGVyLT5XbGFuQ291bnRlcnMuUmVjZWl2ZWRGcmFnbWVudENvdW50LlF1YWRQYXJ0OworICAgICAgICAgICAgICAgIHBTdGF0aXN0aWNzLT5NdWx0aWNhc3RSZWNlaXZlZEZyYW1lQ291bnQuUXVhZFBhcnQgPSBwQWRhcHRlci0+V2xhbkNvdW50ZXJzLk11bHRpY2FzdFJlY2VpdmVkRnJhbWVDb3VudC5RdWFkUGFydDsKKyNpZmRlZiBEQkcKKyAgICAgICAgICAgICAgICBwU3RhdGlzdGljcy0+RkNTRXJyb3JDb3VudCA9IHBBZGFwdGVyLT5SYWxpbmtDb3VudGVycy5SZWFsRmNzRXJyQ291bnQ7CisjZWxzZQorICAgICAgICAgICAgICAgIHBTdGF0aXN0aWNzLT5GQ1NFcnJvckNvdW50LlF1YWRQYXJ0ID0gcEFkYXB0ZXItPldsYW5Db3VudGVycy5GQ1NFcnJvckNvdW50LlF1YWRQYXJ0OworICAgICAgICAgICAgICAgIHBTdGF0aXN0aWNzLT5GcmFtZUR1cGxpY2F0ZUNvdW50LnUuTG93UGFydCA9IHBBZGFwdGVyLT5XbGFuQ291bnRlcnMuRnJhbWVEdXBsaWNhdGVDb3VudC51Lkxvd1BhcnQgLyAxMDA7CisjZW5kaWYKKyAgICAgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoTkRJU184MDJfMTFfU1RBVElTVElDUyk7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBTdGF0aXN0aWNzLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgICAgIGtmcmVlKHBTdGF0aXN0aWNzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9TVEFUSVNUSUNTKGttYWxsb2MgZmFpbGVkKVxuIikpOworICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfR0VOX1JDVl9PSzoKKyAgICAgICAgICAgIHVsSW5mbyA9IHBBZGFwdGVyLT5Db3VudGVyczgwMjMuR29vZFJlY2VpdmVzOworICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHVsSW5mbyk7CisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnVsSW5mbywgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF9HRU5fUkNWX05PX0JVRkZFUjoKKyAgICAgICAgICAgIHVsSW5mbyA9IHBBZGFwdGVyLT5Db3VudGVyczgwMjMuUnhOb0J1ZmZlcjsKKyAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZih1bEluZm8pOworICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZ1bEluZm8sIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX1BIWV9NT0RFOgorICAgICAgICAgICAgdWxJbmZvID0gKFVMT05HKXBBZGFwdGVyLT5Db21tb25DZmcuUGh5TW9kZTsKKyAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZih1bEluZm8pOworICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZ1bEluZm8sIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9QSFlfTU9ERSAoPSVsZClcbiIsIHVsSW5mbykpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9TVEFfQ09ORklHOgorICAgICAgICAgICAgcFN0YUNvbmZpZyA9IChSVF84MDJfMTFfU1RBX0NPTkZJRyAqKSBrbWFsbG9jKHNpemVvZihSVF84MDJfMTFfU1RBX0NPTkZJRyksIE1FTV9BTExPQ19GTEFHKTsKKyAgICAgICAgICAgIGlmIChwU3RhQ29uZmlnKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1NUQV9DT05GSUdcbiIpKTsKKyAgICAgICAgICAgICAgICBwU3RhQ29uZmlnLT5FbmFibGVUeEJ1cnN0ID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5iRW5hYmxlVHhCdXJzdDsKKyAgICAgICAgICAgICAgICBwU3RhQ29uZmlnLT5FbmFibGVUdXJib1JhdGUgPSAwOworICAgICAgICAgICAgICAgIHBTdGFDb25maWctPlVzZUJHUHJvdGVjdGlvbiA9IHBBZGFwdGVyLT5Db21tb25DZmcuVXNlQkdQcm90ZWN0aW9uOworICAgICAgICAgICAgICAgIHBTdGFDb25maWctPlVzZVNob3J0U2xvdFRpbWUgPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLmJVc2VTaG9ydFNsb3RUaW1lOworICAgICAgICAgICAgICAgIC8vcFN0YUNvbmZpZy0+QWRob2NNb2RlID0gcEFkYXB0ZXItPlN0YUNmZy5BZGhvY01vZGU7CisgICAgICAgICAgICAgICAgcFN0YUNvbmZpZy0+SHdSYWRpb1N0YXR1cyA9IChwQWRhcHRlci0+U3RhQ2ZnLmJId1JhZGlvID09IFRSVUUpID8gMSA6IDA7CisgICAgICAgICAgICAgICAgcFN0YUNvbmZpZy0+UnN2MSA9IDA7CisgICAgICAgICAgICAgICAgcFN0YUNvbmZpZy0+U3lzdGVtRXJyb3JCaXRtYXAgPSBwQWRhcHRlci0+U3lzdGVtRXJyb3JCaXRtYXA7CisgICAgICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFJUXzgwMl8xMV9TVEFfQ09ORklHKTsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFN0YUNvbmZpZywgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBrZnJlZShwU3RhQ29uZmlnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9TVEFfQ09ORklHKGttYWxsb2MgZmFpbGVkKVxuIikpOworICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX1JUU19USFJFU0hPTEQ6CisgICAgICAgICAgICBSdHNUaHJlc2ggPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLlJ0c1RocmVzaG9sZDsKKyAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihSdHNUaHJlc2gpOworICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZSdHNUaHJlc2gsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9SVFNfVEhSRVNIT0xEKD0lbGQpXG4iLCBSdHNUaHJlc2gpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfRlJBR01FTlRBVElPTl9USFJFU0hPTEQ6CisgICAgICAgICAgICBGcmFnVGhyZXNoID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5GcmFnbWVudFRocmVzaG9sZDsKKyAgICAgICAgICAgIGlmIChwQWRhcHRlci0+Q29tbW9uQ2ZnLmJVc2VaZXJvVG9EaXNhYmxlRnJhZ21lbnQgPT0gVFJVRSkKKyAgICAgICAgICAgICAgICBGcmFnVGhyZXNoID0gMDsKKyAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihGcmFnVGhyZXNoKTsKKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmRnJhZ1RocmVzaCwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX0ZSQUdNRU5UQVRJT05fVEhSRVNIT0xEKD0lbGQpXG4iLCBGcmFnVGhyZXNoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX1BPV0VSX01PREU6CisgICAgICAgICAgICBQb3dlck1vZGUgPSBwQWRhcHRlci0+U3RhQ2ZnLldpbmRvd3NQb3dlck1vZGU7CisgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoUG93ZXJNb2RlKTsKKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmUG93ZXJNb2RlLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfUE9XRVJfTU9ERSg9JWQpXG4iLCBQb3dlck1vZGUpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfUkFESU86CisgICAgICAgICAgICBSYWRpb1N0YXRlID0gKEJPT0xFQU4pIHBBZGFwdGVyLT5TdGFDZmcuYlN3UmFkaW87CisgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoUmFkaW9TdGF0ZSk7CisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJlJhZGlvU3RhdGUsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9RVUVSWV9SQURJTyAoPSVkKVxuIiwgUmFkaW9TdGF0ZSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9JTkZSQVNUUlVDVFVSRV9NT0RFOgorICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQnNzVHlwZSA9PSBCU1NfQURIT0MpCisgICAgICAgICAgICAgICAgQnNzVHlwZSA9IE5kaXM4MDJfMTFJQlNTOworICAgICAgICAgICAgZWxzZSBpZiAocEFkYXB0ZXItPlN0YUNmZy5Cc3NUeXBlID09IEJTU19JTkZSQSkKKyAgICAgICAgICAgICAgICBCc3NUeXBlID0gTmRpczgwMl8xMUluZnJhc3RydWN0dXJlOworICAgICAgICAgICAgZWxzZSBpZiAocEFkYXB0ZXItPlN0YUNmZy5Cc3NUeXBlID09IEJTU19NT05JVE9SKQorICAgICAgICAgICAgICAgIEJzc1R5cGUgPSBOZGlzODAyXzExTW9uaXRvcjsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBCc3NUeXBlID0gTmRpczgwMl8xMUF1dG9Vbmtub3duOworCisgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoQnNzVHlwZSk7CisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJkJzc1R5cGUsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9JTkZSQVNUUlVDVFVSRV9NT0RFKD0lZClcbiIsIEJzc1R5cGUpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfUFJFQU1CTEU6CisgICAgICAgICAgICBQcmVhbVR5cGUgPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLlR4UHJlYW1ibGU7CisgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoUHJlYW1UeXBlKTsKKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmUHJlYW1UeXBlLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfUFJFQU1CTEUoPSVkKVxuIiwgUHJlYW1UeXBlKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREU6CisgICAgICAgICAgICBBdXRoTW9kZSA9IHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGU7CisgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoQXV0aE1vZGUpOworICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZBdXRoTW9kZSwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREUoPSVkKVxuIiwgQXV0aE1vZGUpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfV0VQX1NUQVRVUzoKKyAgICAgICAgICAgIFdlcFN0YXR1cyA9IHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzOworICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFdlcFN0YXR1cyk7CisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJldlcFN0YXR1cywgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX1dFUF9TVEFUVVMoPSVkKVxuIiwgV2VwU3RhdHVzKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX1RYX1BPV0VSX0xFVkVMOgorCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFVMT05HKTsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmcEFkYXB0ZXItPkNvbW1vbkNmZy5UeFBvd2VyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfVFhfUE9XRVJfTEVWRUwgJXhcbiIscEFkYXB0ZXItPkNvbW1vbkNmZy5UeFBvd2VyKSk7CisJCQlicmVhazsKKyAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX1RYX1BPV0VSX0xFVkVMXzE6CisgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoVUxPTkcpOworICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZwQWRhcHRlci0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfVFhfUE9XRVJfTEVWRUxfMSAoPSVsZClcbiIsIHBBZGFwdGVyLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UpKTsKKwkJCWJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfTkVUV09SS19UWVBFU19TVVBQT1JURUQ6CisJCQlpZiAoKHBBZGFwdGVyLT5SZkljVHlwZQk9PSBSRklDXzI4NTApIHx8IChwQWRhcHRlci0+UmZJY1R5cGUgPT0JUkZJQ18yNzUwKSkKKwkJCXsKKwkJCQlOZXR3b3JrVHlwZUxpc3RbMF0gPSAzOyAgICAgICAgICAgICAgICAgLy8gTnVtYmVyT2ZJdGVtcyA9IDMKKwkJCQlOZXR3b3JrVHlwZUxpc3RbMV0gPSBOZGlzODAyXzExRFM7ICAgICAgLy8gTmV0d29ya1R5cGVbMV0gPSAxMWIKKwkJCQlOZXR3b3JrVHlwZUxpc3RbMl0gPSBOZGlzODAyXzExT0ZETTI0OyAgLy8gTmV0d29ya1R5cGVbMl0gPSAxMWcKKwkJCQlOZXR3b3JrVHlwZUxpc3RbM10gPSBOZGlzODAyXzExT0ZETTU7ICAgLy8gTmV0d29ya1R5cGVbM10gPSAxMWEKKyAgICAgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSAxNjsKKwkJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJk5ldHdvcmtUeXBlTGlzdFswXSwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlOZXR3b3JrVHlwZUxpc3RbMF0gPSAyOyAgICAgICAgICAgICAgICAgLy8gTnVtYmVyT2ZJdGVtcyA9IDIKKwkJCQlOZXR3b3JrVHlwZUxpc3RbMV0gPSBOZGlzODAyXzExRFM7ICAgICAgLy8gTmV0d29ya1R5cGVbMV0gPSAxMWIKKwkJCQlOZXR3b3JrVHlwZUxpc3RbMl0gPSBOZGlzODAyXzExT0ZETTI0OyAgLy8gTmV0d29ya1R5cGVbMl0gPSAxMWcKKwkJCSAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSAxMjsKKwkJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJk5ldHdvcmtUeXBlTGlzdFswXSwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCX0KKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX05FVFdPUktfVFlQRVNfU1VQUE9SVEVEXG4iKSk7CisJCQkJYnJlYWs7CisJICAgIGNhc2UgT0lEXzgwMl8xMV9ORVRXT1JLX1RZUEVfSU5fVVNFOgorICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFVMT05HKTsKKwkJCWlmIChwQWRhcHRlci0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQSkKKwkJCQl1bEluZm8gPSBOZGlzODAyXzExT0ZETTU7CisJCQllbHNlIGlmICgocEFkYXB0ZXItPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUJHX01JWEVEKSB8fCAocEFkYXB0ZXItPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUcpKQorCQkJCXVsSW5mbyA9IE5kaXM4MDJfMTFPRkRNMjQ7CisJCQllbHNlCisJCQkJdWxJbmZvID0gTmRpczgwMl8xMURTOworICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZ1bEluZm8sIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlicmVhazsKKyAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX1FVRVJZX0xBU1RfUlhfUkFURToKKyAgICAgICAgICAgIHVsSW5mbyA9IChVTE9ORylwQWRhcHRlci0+TGFzdFJ4UmF0ZTsKKyAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZih1bEluZm8pOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZ1bEluZm8sIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9RVUVSWV9MQVNUX1JYX1JBVEUgKD0lbGQpXG4iLCB1bEluZm8pKTsKKwkJCWJyZWFrOworCQljYXNlIFJUX09JRF84MDJfMTFfUVVFUllfTEFTVF9UWF9SQVRFOgorCQkJLy91bEluZm8gPSAoVUxPTkcpcEFkYXB0ZXItPkxhc3RUeFJhdGU7CisJCQl1bEluZm8gPSAoVUxPTkcpcEFkYXB0ZXItPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkhUUGh5TW9kZS53b3JkOworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHVsSW5mbyk7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnVsSW5mbywJd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1FVRVJZX0xBU1RfVFhfUkFURSAoPSVseClcbiIsIHVsSW5mbykpOworCQkJYnJlYWs7CisgICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9RVUVSWV9FRVBST01fVkVSU0lPTjoKKyAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihVTE9ORyk7CisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnBBZGFwdGVyLT5FZXByb21WZXJzaW9uLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9RVUVSWV9GSVJNV0FSRV9WRVJTSU9OOgorICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFVMT05HKTsKKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmcEFkYXB0ZXItPkZpcm13YXJlVmVyc2lvbiwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCWJyZWFrOworCSAgICBjYXNlIFJUX09JRF84MDJfMTFfUVVFUllfTk9JU0VfTEVWRUw6CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoVUNIQVIpOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZwQWRhcHRlci0+QmJwV3JpdGVMYXRjaFs2Nl0sIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9RVUVSWV9OT0lTRV9MRVZFTCAoPSVkKVxuIiwgcEFkYXB0ZXItPkJicFdyaXRlTGF0Y2hbNjZdKSk7CisJCQlicmVhazsKKwkgICAgY2FzZSBSVF9PSURfODAyXzExX0VYVFJBX0lORk86CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoVUxPTkcpOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZwQWRhcHRlci0+RXh0cmFJbmZvLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfRVhUUkFfSU5GTyAoPSVsZClcbiIsIHBBZGFwdGVyLT5FeHRyYUluZm8pKTsKKwkgICAgICAgIGJyZWFrOworCSAgICBjYXNlIFJUX09JRF9XRV9WRVJTSU9OX0NPTVBJTEVEOgorCSAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFVJTlQpOworCSAgICAgICAgd2VfdmVyc2lvbl9jb21waWxlZCA9IFdJUkVMRVNTX0VYVDsKKwkgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmd2VfdmVyc2lvbl9jb21waWxlZCwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkgICAgICAgIGJyZWFrOworCQljYXNlIFJUX09JRF84MDJfMTFfUVVFUllfQVBTRF9TRVRUSU5HOgorCQkJYXBzZCA9IChwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNEQ2FwYWJsZSB8IChwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNEQUNfQkUgPDwgMSkgfCAocEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTREFDX0JLIDw8IDIpCisJCQkJfCAocEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTREFDX1ZJIDw8IDMpCXwgKHBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RBQ19WTyA8PCA0KQl8IChwQWRhcHRlci0+Q29tbW9uQ2ZnLk1heFNQTGVuZ3RoIDw8IDUpKTsKKworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFVMT05HKTsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmYXBzZCwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1FVRVJZX0FQU0RfU0VUVElORyAoPTB4JWx4LEFQU0RDYXA9JWQsQUNfQkU9JWQsQUNfQks9JWQsQUNfVkk9JWQsQUNfVk89JWQsTUFYU1BMZW49JWQpXG4iLAorCQkJCWFwc2QscEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTRENhcGFibGUscEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTREFDX0JFLHBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RBQ19CSyxwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNEQUNfVkkscEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTREFDX1ZPLHBBZGFwdGVyLT5Db21tb25DZmcuTWF4U1BMZW5ndGgpKTsKKwkJCWJyZWFrOworCQljYXNlIFJUX09JRF84MDJfMTFfUVVFUllfQVBTRF9QU006CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoVUxPTkcpOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNERm9yY2VQb3dlclNhdmUsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9RVUVSWV9BUFNEX1BTTSAoPSVkKVxuIiwgcEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTREZvcmNlUG93ZXJTYXZlKSk7CisJCQlicmVhazsKKwkJY2FzZSBSVF9PSURfODAyXzExX1FVRVJZX1dNTToKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihCT09MRUFOKTsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmcEFkYXB0ZXItPkNvbW1vbkNmZy5iV21tQ2FwYWJsZSwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1FVRVJZX1dNTSAoPSVkKVxuIiwJcEFkYXB0ZXItPkNvbW1vbkNmZy5iV21tQ2FwYWJsZSkpOworCQkJYnJlYWs7CisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgICAgICBjYXNlIFJUX09JRF9ORVdfRFJJVkVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFVDSEFSIGVuYWJsZWQgPSAxOworICAgIAkgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihVQ0hBUik7CisgICAgCSAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZlbmFibGVkLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfTkVXX0RSSVZFUiAoPSVkKVxuIiwgZW5hYmxlZCkpOworICAgICAgICAgICAgfQorCSAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlRfT0lEX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQ6CisJICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoVUNIQVIpOworCSAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZwQWRhcHRlci0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAoPSVkKVxuIiwgcEFkYXB0ZXItPlN0YUNmZy5XcGFTdXBwbGljYW50VVApKTsKKwkgICAgICAgIGJyZWFrOworI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKworICAgICAgICBjYXNlIFJUX09JRF9EUklWRVJfREVWSUNFX05BTUU6CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEX0RSSVZFUl9ERVZJQ0VfTkFNRSBcbiIpKTsKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IDE2OworCQkJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwQWRhcHRlci0+U3RhQ2ZnLmRldl9uYW1lLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorCQkJeworCQkJCVN0YXR1cyA9IC1FRkFVTFQ7CisJCQl9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX1FVRVJZX0hUX1BIWU1PREU6CisgICAgICAgICAgICBwSFRQaHlNb2RlID0gKE9JRF9TRVRfSFRfUEhZTU9ERSAqKSBrbWFsbG9jKHNpemVvZihPSURfU0VUX0hUX1BIWU1PREUpLCBNRU1fQUxMT0NfRkxBRyk7CisgICAgICAgICAgICBpZiAocEhUUGh5TW9kZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwSFRQaHlNb2RlLT5QaHlNb2RlID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5QaHlNb2RlOworICAgIAkJCXBIVFBoeU1vZGUtPkh0TW9kZSA9IChVQ0hBUilwQWRhcHRlci0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLk1PREU7CisgICAgCQkJcEhUUGh5TW9kZS0+QlcgPSAoVUNIQVIpcEFkYXB0ZXItPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkhUUGh5TW9kZS5maWVsZC5CVzsKKyAgICAJCQlwSFRQaHlNb2RlLT5NQ1M9IChVQ0hBUilwQWRhcHRlci0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLk1DUzsKKyAgICAJCQlwSFRQaHlNb2RlLT5TSE9SVEdJPSAoVUNIQVIpcEFkYXB0ZXItPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkhUUGh5TW9kZS5maWVsZC5TaG9ydEdJOworICAgIAkJCXBIVFBoeU1vZGUtPlNUQkM9IChVQ0hBUilwQWRhcHRlci0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLlNUQkM7CisKKyAgICAJCQlwSFRQaHlNb2RlLT5FeHRPZmZzZXQgPSAoKHBBZGFwdGVyLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPCBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWwpID8gKEVYVENIQV9CRUxPVykgOiAoRVhUQ0hBX0FCT1ZFKSk7CisgICAgICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKE9JRF9TRVRfSFRfUEhZTU9ERSk7CisgICAgICAgICAgICAgICAgaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwSFRQaHlNb2RlLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgIAkJCXsKKyAgICAJCQkJU3RhdHVzID0gLUVGQVVMVDsKKyAgICAJCQl9CisgICAgCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfUVVFUllfSFRfUEhZTU9ERSAoUGh5TW9kZSA9ICVkLCBNQ1MgPSVkLCBCVyA9ICVkLCBTVEJDID0gJWQsIEV4dE9mZnNldD0lZClcbiIsCisgICAgCQkJCXBIVFBoeU1vZGUtPkh0TW9kZSwgcEhUUGh5TW9kZS0+TUNTLCBwSFRQaHlNb2RlLT5CVywgcEhUUGh5TW9kZS0+U1RCQywgcEhUUGh5TW9kZS0+RXh0T2Zmc2V0KSk7CisgICAgCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiIE1sbWVVcGRhdGVUeFJhdGVzICgud29yZCA9ICV4IClcbiIsIHBBZGFwdGVyLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5IVFBoeU1vZGUud29yZCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1NUQV9DT05GSUcoa21hbGxvYyBmYWlsZWQpXG4iKSk7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfQ09VTlRSWV9SRUdJT046CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9DT1VOVFJZX1JFR0lPTiBcbiIpKTsKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZih1bEluZm8pOworICAgICAgICAgICAgdWxJbmZvID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uRm9yQUJhbmQ7CisgICAgICAgICAgICB1bEluZm8gPSAodWxJbmZvIDw8IDgpfChwQWRhcHRlci0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb24pOworCQkJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmdWxJbmZvLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgeworCQkJCVN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX1FVRVJZX0RBVF9IVF9QSFlNT0RFOgorICAgICAgICAgICAgcEhUUGh5TW9kZSA9IChPSURfU0VUX0hUX1BIWU1PREUgKikga21hbGxvYyhzaXplb2YoT0lEX1NFVF9IVF9QSFlNT0RFKSwgTUVNX0FMTE9DX0ZMQUcpOworICAgICAgICAgICAgaWYgKHBIVFBoeU1vZGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcEhUUGh5TW9kZS0+UGh5TW9kZSA9IHBBZGFwdGVyLT5Db21tb25DZmcuUGh5TW9kZTsKKyAgICAJCQlwSFRQaHlNb2RlLT5IdE1vZGUgPSAoVUNIQVIpcEFkYXB0ZXItPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuSFRNT0RFOworICAgIAkJCXBIVFBoeU1vZGUtPkJXID0gKFVDSEFSKXBBZGFwdGVyLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXOworICAgIAkJCXBIVFBoeU1vZGUtPk1DUz0gKFVDSEFSKXBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1M7CisgICAgCQkJcEhUUGh5TW9kZS0+U0hPUlRHST0gKFVDSEFSKXBBZGFwdGVyLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLlNob3J0R0k7CisgICAgCQkJcEhUUGh5TW9kZS0+U1RCQz0gKFVDSEFSKXBBZGFwdGVyLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLlNUQkM7CisKKyAgICAgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoT0lEX1NFVF9IVF9QSFlNT0RFKTsKKyAgICAgICAgICAgICAgICBpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBIVFBoeU1vZGUsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgCQkJeworICAgIAkJCQlTdGF0dXMgPSAtRUZBVUxUOworICAgIAkJCX0KKyAgICAJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9RVUVSWV9IVF9QSFlNT0RFIChQaHlNb2RlID0gJWQsIE1DUyA9JWQsIEJXID0gJWQsIFNUQkMgPSAlZCwgRXh0T2Zmc2V0PSVkKVxuIiwKKyAgICAJCQkJcEhUUGh5TW9kZS0+SHRNb2RlLCBwSFRQaHlNb2RlLT5NQ1MsIHBIVFBoeU1vZGUtPkJXLCBwSFRQaHlNb2RlLT5TVEJDLCBwSFRQaHlNb2RlLT5FeHRPZmZzZXQpKTsKKyAgICAJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIgTWxtZVVwZGF0ZVR4UmF0ZXMgKC53b3JkID0gJXggKVxuIiwgcEFkYXB0ZXItPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkhUUGh5TW9kZS53b3JkKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfU1RBX0NPTkZJRyhrbWFsbG9jIGZhaWxlZClcbiIpKTsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlRfT0lEX1FVRVJZX01VTFRJUExFX0NBUkRfU1VQUE9SVDoKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihVQ0hBUik7CisgICAgICAgICAgICBpID0gMDsKKyNpZmRlZiBNVUxUSVBMRV9DQVJEX1NVUFBPUlQKKyAgICAgICAgICAgIGkgPSAxOworI2VuZGlmIC8vIE1VTFRJUExFX0NBUkRfU1VQUE9SVCAvLworCQkJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmaSwgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIHsKKwkJCQlTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgfQorICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF9RVUVSWV9NVUxUSVBMRV9DQVJEX1NVUFBPUlQoPSVkKSBcbiIsIGkpKTsKKyAgICAgICAgICAgIGJyZWFrOworI2lmZGVmIFNOTVBfU1VQUE9SVAorCQljYXNlIFJUX09JRF84MDJfMTFfTUFDX0FERFJFU1M6CisgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBNQUNfQUREUl9MRU47CisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnBBZGFwdGVyLT5DdXJyZW50QWRkcmVzcywgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCWJyZWFrOworCisJCWNhc2UgUlRfT0lEXzgwMl8xMV9NQU5VRkFDVFVSRVJPVUk6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9NQU5VRkFDVFVSRVJPVUkgXG4iKSk7CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBNYW51ZmFjdHVyZXJPVUlfTEVOOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZwQWRhcHRlci0+Q3VycmVudEFkZHJlc3MsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlicmVhazsKKworCQljYXNlIFJUX09JRF84MDJfMTFfTUFOVUZBQ1RVUkVSTkFNRToKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX01BTlVGQUNUVVJFUk5BTUUgXG4iKSk7CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzdHJsZW4oTWFudWZhY3R1cmVyTkFNRSk7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgTWFudWZhY3R1cmVyTkFNRSwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCWJyZWFrOworCisJCWNhc2UgUlRfT0lEXzgwMl8xMV9SRVNPVVJDRVRZUEVJRE5BTUU6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9SRVNPVVJDRVRZUEVJRE5BTUUgXG4iKSk7CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzdHJsZW4oUmVzb3VyY2VUeXBlSWROYW1lKTsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBSZXNvdXJjZVR5cGVJZE5hbWUsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlicmVhazsKKworCQljYXNlIFJUX09JRF84MDJfMTFfUFJJVkFDWU9QVElPTklNUExFTUVOVEVEOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfUFJJVkFDWU9QVElPTklNUExFTUVOVEVEIFxuIikpOworCQkJdWxJbmZvID0gMTsgLy8gMSBpcyBzdXBwb3J0IHdlcCBlbHNlIDIgaXMgbm90IHN1cHBvcnQuCisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YodWxJbmZvKTsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmdWxJbmZvLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJYnJlYWs7CisKKwkJY2FzZSBSVF9PSURfODAyXzExX1BPV0VSTUFOQUdFTUVOVE1PREU6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9QT1dFUk1BTkFHRU1FTlRNT0RFIFxuIikpOworCQkJaWYgKHBBZGFwdGVyLT5TdGFDZmcuUHNtID09IFBTTVBfQUNUSU9OKQorCQkJCXVsSW5mbyA9IDE7IC8vIDEgaXMgcG93ZXIgYWN0aXZlIGVsc2UgMiBpcyBwb3dlciBzYXZlLgorCQkJZWxzZQorCQkJCXVsSW5mbyA9IDI7CisKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZih1bEluZm8pOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZ1bEluZm8sIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlicmVhazsKKworCQljYXNlIE9JRF84MDJfMTFfV0VQREVGQVVMVEtFWVZBTFVFOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfV0VQREVGQVVMVEtFWVZBTFVFIFxuIikpOworCQkJLy9LZXlJZHhWYWx1ZS5LZXlJZHggPSBwQWQtPlBvcnRDZmcuTUJTU0lEW3BBZC0+SW9jdGxJRl0uRGVmYXVsdEtleUlkOworCQkJcEtleUlkeFZhbHVlID0gd3JxLT51LmRhdGEucG9pbnRlcjsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiS2V5SWR4VmFsdWUuS2V5SWR4ID0gJWQsIFxuIixwS2V5SWR4VmFsdWUtPktleUlkeCkpOworCQkJdmFsdWVMZW4gPSBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW3BBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5LZXlMZW47CisJCQlOZGlzTW92ZU1lbW9yeShwS2V5SWR4VmFsdWUtPlZhbHVlLAorCQkJCQkJICAgJnBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWRdLktleSwKKwkJCQkJCSAgIHZhbHVlTGVuKTsKKwkJCXBLZXlJZHhWYWx1ZS0+VmFsdWVbdmFsdWVMZW5dPSdcMCc7CisKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihEZWZhdWx0S2V5SWR4VmFsdWUpOworCisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcEtleUlkeFZhbHVlLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJEZWZhdWx0S2V5SWQgPSAlZCwgdG90YWwgbGVuID0gJWQsIHN0ciBsZW49JWQsIEtleVZhbHVlPSAlMDJ4ICUwMnggJTAyeCAlMDJ4IFxuIiwgcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWQsIHdycS0+dS5kYXRhLmxlbmd0aCwgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uS2V5TGVuLAorCQkJcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVswXS5LZXlbMF0sCisJCQlwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzFdLktleVswXSwKKwkJCXBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMl0uS2V5WzBdLAorCQkJcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVszXS5LZXlbMF0pKTsKKwkJCWJyZWFrOworCisJCWNhc2UgT0lEXzgwMl8xMV9XRVBERUZBVUxUS0VZSUQ6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9XRVBERUZBVUxUS0VZSUQgXG4iKSk7CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoVUNIQVIpOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkRlZmF1bHRLZXlJZCA9JWQgXG4iLCBwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCkpOworCQkJYnJlYWs7CisKKwkJY2FzZSBSVF9PSURfODAyXzExX1dFUEtFWU1BUFBJTkdMRU5HVEg6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9XRVBLRVlNQVBQSU5HTEVOR1RIIFxuIikpOworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFVDSEFSKTsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLAorCQkJCQkJCQkJJnBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWRdLktleUxlbiwKKwkJCQkJCQkJCXdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlicmVhazsKKworCQljYXNlIE9JRF84MDJfMTFfU0hPUlRSRVRSWUxJTUlUOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfU0hPUlRSRVRSWUxJTUlUIFxuIikpOworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFVMT05HKTsKKwkJCVJUTVBfSU9fUkVBRDMyKHBBZGFwdGVyLCBUWF9SVFlfQ0ZHLCAmdHhfcnR5X2NmZy53b3JkKTsKKwkJCVNob3J0UmV0cnlMaW1pdCA9IHR4X3J0eV9jZmcuZmllbGQuU2hvcnRSdHlMaW1pdDsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNob3J0UmV0cnlMaW1pdCA9JWxkLCAgdHhfcnR5X2NmZy5maWVsZC5TaG9ydFJldHJ5TGltaXQ9JWRcbiIsIFNob3J0UmV0cnlMaW1pdCwgdHhfcnR5X2NmZy5maWVsZC5TaG9ydFJ0eUxpbWl0KSk7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJlNob3J0UmV0cnlMaW1pdCwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCWJyZWFrOworCisJCWNhc2UgT0lEXzgwMl8xMV9MT05HUkVUUllMSU1JVDoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX0xPTkdSRVRSWUxJTUlUIFxuIikpOworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFVMT05HKTsKKwkJCVJUTVBfSU9fUkVBRDMyKHBBZGFwdGVyLCBUWF9SVFlfQ0ZHLCAmdHhfcnR5X2NmZy53b3JkKTsKKwkJCUxvbmdSZXRyeUxpbWl0ID0gdHhfcnR5X2NmZy5maWVsZC5Mb25nUnR5TGltaXQ7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJMb25nUmV0cnlMaW1pdCA9JWxkLCAgdHhfcnR5X2NmZy5maWVsZC5Mb25nUnR5TGltaXQ9JWRcbiIsIExvbmdSZXRyeUxpbWl0LCB0eF9ydHlfY2ZnLmZpZWxkLkxvbmdSdHlMaW1pdCkpOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZMb25nUmV0cnlMaW1pdCwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCWJyZWFrOworCisJCWNhc2UgUlRfT0lEXzgwMl8xMV9QUk9EVUNUSUQ6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9QUk9EVUNUSUQgXG4iKSk7CisKKyNpZmRlZiBSVDI4NzAKKwkJCXNwcmludGYodG1wLCAiJTA0eCAlMDR4XG4iLCAoKFBPU19DT09LSUUpcEFkYXB0ZXItPk9TX0Nvb2tpZSktPnBVc2JfRGV2LT5kZXNjcmlwdG9yLmlkVmVuZG9yICwoKFBPU19DT09LSUUpcEFkYXB0ZXItPk9TX0Nvb2tpZSktPnBVc2JfRGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCk7CisKKyNlbmRpZiAvLyBSVDI4NzAgLy8KKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHN0cmxlbih0bXApOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHRtcCwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCWJyZWFrOworCisJCWNhc2UgUlRfT0lEXzgwMl8xMV9NQU5VRkFDVFVSRUlEOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfTUFOVUZBQ1RVUkVJRCBcbiIpKTsKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHN0cmxlbihNYW51ZmFjdHVyZXJOQU1FKTsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBNYW51ZmFjdHVyZXJOQU1FLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfODAyXzExX0NVUlJFTlRDSEFOTkVMOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfQ1VSUkVOVENIQU5ORUwgXG4iKSk7CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoVUNIQVIpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgic2l6ZW9mIFVDSEFSPSVkLCBjaGFubmVsPSVkIFxuIiwgc2l6ZW9mKFVDSEFSKSwgcEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsKSk7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnBBZGFwdGVyLT5Db21tb25DZmcuQ2hhbm5lbCwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlN0YXR1cz0lZFxuIiwgU3RhdHVzKSk7CisJCQlicmVhazsKKyNlbmRpZiAvL1NOTVBfU1VQUE9SVAorCisJCWNhc2UgT0lEXzgwMl8xMV9CVUlMRF9DSEFOTkVMX0VYOgorCQkJeworCQkJCVVDSEFSIHZhbHVlOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX0JVSUxEX0NIQU5ORUxfRVggXG4iKSk7CisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFVDSEFSKTsKKyNpZmRlZiBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUCisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU3VwcG9ydCBFWFRfQlVJTERfQ0hBTk5FTF9MSVNULlxuIikpOworCQkJCXZhbHVlID0gMTsKKyNlbHNlCisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiRG9lc24ndCBzdXBwb3J0IEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QuXG4iKSk7CisJCQkJdmFsdWUgPSAwOworI2VuZGlmIC8vIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QgLy8KKwkJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnZhbHVlLCAxKTsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTdGF0dXM9JWRcbiIsIFN0YXR1cykpOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfODAyXzExX0dFVF9DSF9MSVNUOgorCQkJeworCQkJCVBSVF9DSEFOTkVMX0xJU1RfSU5GTyBwQ2hMaXN0QnVmOworCisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfR0VUX0NIX0xJU1QgXG4iKSk7CisJCQkJaWYgKHBBZGFwdGVyLT5DaGFubmVsTGlzdE51bSA9PSAwKQorCQkJCXsKKwkJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gMDsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJcENoTGlzdEJ1ZiA9IChSVF9DSEFOTkVMX0xJU1RfSU5GTyAqKSBrbWFsbG9jKHNpemVvZihSVF9DSEFOTkVMX0xJU1RfSU5GTyksIE1FTV9BTExPQ19GTEFHKTsKKwkJCQlpZiAocENoTGlzdEJ1ZiA9PSBOVUxMKQorCQkJCXsKKwkJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gMDsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJcENoTGlzdEJ1Zi0+Q2hhbm5lbExpc3ROdW0gPSBwQWRhcHRlci0+Q2hhbm5lbExpc3ROdW07CisJCQkJZm9yIChpID0gMDsgaSA8IHBDaExpc3RCdWYtPkNoYW5uZWxMaXN0TnVtOyBpKyspCisJCQkJCXBDaExpc3RCdWYtPkNoYW5uZWxMaXN0W2ldID0gcEFkYXB0ZXItPkNoYW5uZWxMaXN0W2ldLkNoYW5uZWw7CisKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoUlRfQ0hBTk5FTF9MSVNUX0lORk8pOworCQkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwQ2hMaXN0QnVmLCBzaXplb2YoUlRfQ0hBTk5FTF9MSVNUX0lORk8pKTsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTdGF0dXM9JWRcbiIsIFN0YXR1cykpOworCisJCQkJaWYgKHBDaExpc3RCdWYpCisJCQkJCWtmcmVlKHBDaExpc3RCdWYpOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfODAyXzExX0dFVF9DT1VOVFJZX0NPREU6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9HRVRfQ09VTlRSWV9DT0RFIFxuIikpOworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gMjsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmcEFkYXB0ZXItPkNvbW1vbkNmZy5Db3VudHJ5Q29kZSwgMik7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTdGF0dXM9JWRcbiIsIFN0YXR1cykpOworCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfODAyXzExX0dFVF9DSEFOTkVMX0dFT0dSQVBIWToKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX0dFVF9DSEFOTkVMX0dFT0dSQVBIWSBcbiIpKTsKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IDE7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnBBZGFwdGVyLT5Db21tb25DZmcuR2VvZ3JhcGh5LCAxKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlN0YXR1cz0lZFxuIiwgU3RhdHVzKSk7CisJCQlicmVhazsKKworCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJCWNhc2UgUlRfT0lEXzgwMl8xMV9RVUVSWV9ETFM6CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoQk9PTEVBTik7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnBBZGFwdGVyLT5Db21tb25DZmcuYkRMU0NhcGFibGUsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9RVUVSWV9ETFMoPSVkKVxuIiwgcEFkYXB0ZXItPkNvbW1vbkNmZy5iRExTQ2FwYWJsZSkpOworCQkJYnJlYWs7CisKKwkJY2FzZSBSVF9PSURfODAyXzExX1FVRVJZX0RMU19QQVJBTToKKwkJCXsKKwkJCQlQUlRfODAyXzExX0RMU19JTkZPCXBEbHNJbmZvID0ga21hbGxvYyhzaXplb2YoUlRfODAyXzExX0RMU19JTkZPKSwgR0ZQX0FUT01JQyk7CisJCQkJaWYgKHBEbHNJbmZvID09IE5VTEwpCisJCQkJCWJyZWFrOworCisJCQkJZm9yIChpPTA7IGk8TUFYX05VTV9PRl9ETFNfRU5UUlk7IGkrKykKKwkJCQl7CisJCQkJCVJUTVBNb3ZlTWVtb3J5KCZwRGxzSW5mby0+RW50cnlbaV0sICZwQWRhcHRlci0+U3RhQ2ZnLkRMU0VudHJ5W2ldLCBzaXplb2YoUlRfODAyXzExX0RMU19VSSkpOworCQkJCX0KKworCQkJCXBEbHNJbmZvLT5udW0gPSBNQVhfTlVNX09GX0RMU19FTlRSWTsKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoUlRfODAyXzExX0RMU19JTkZPKTsKKwkJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcERsc0luZm8sIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfUVVFUllfRExTX1BBUkFNXG4iKSk7CisKKwkJCQlpZiAocERsc0luZm8pCisJCQkJCWtmcmVlKHBEbHNJbmZvKTsKKwkJCX0KKwkJCWJyZWFrOworI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OnVua25vd24gSU9DVEwncyBzdWJjbWQgPSAweCUwOHhcbiIsIGNtZCkpOworICAgICAgICAgICAgU3RhdHVzID0gLUVPUE5PVFNVUFA7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIFN0YXR1czsKK30KKworSU5UIHJ0Mjh4eF9zdGFfaW9jdGwoCisJSU4Jc3RydWN0IG5ldF9kZXZpY2UJKm5ldF9kZXYsCisJSU4JT1VUCXN0cnVjdCBpZnJlcQkqcnEsCisJSU4JSU5UCQkJCQljbWQpCit7CisJUE9TX0NPT0tJRQkJCXBPYmo7CisJVklSVFVBTF9BREFQVEVSCQkqcFZpcnR1YWxBZCA9IE5VTEw7CisJUlRNUF9BREFQVEVSICAgICAgICAqcEFkID0gTlVMTDsKKwlzdHJ1Y3QgaXdyZXEgICAgICAgICp3cnEgPSAoc3RydWN0IGl3cmVxICopIHJxOworCUJPT0xFQU4JCQkJU3RhdGVNYWNoaW5lVG91Y2hlZCA9IEZBTFNFOworCUlOVAkJCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKwlVU0hPUlQJCQkJc3ViY21kOworCisJaWYgKG5ldF9kZXYtPnByaXZfZmxhZ3MgPT0gSU5UX01BSU4pCisJeworCQlwQWQgPSBuZXRfZGV2LT5wcml2OworCX0KKwllbHNlCisJeworCQlwVmlydHVhbEFkID0gbmV0X2Rldi0+cHJpdjsKKwkJcEFkID0gcFZpcnR1YWxBZC0+UnRtcERldi0+cHJpdjsKKwl9CisJcE9iaiA9IChQT1NfQ09PS0lFKSBwQWQtPk9TX0Nvb2tpZTsKKworCWlmIChwQWQgPT0gTlVMTCkKKwl7CisJCS8qIGlmIDFzdCBvcGVuIGZhaWwsIHBBZCB3aWxsIGJlIGZyZWU7CisJCSAgIFNvIHRoZSBuZXRfZGV2LT5wcml2IHdpbGwgYmUgTlVMTCBpbiAycmQgb3BlbiAqLworCQlyZXR1cm4gLUVORVRET1dOOworCX0KKworICAgIC8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCisgICAgaWYoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKKyAgICB7CisjaWZkZWYgQ09ORklHX0FQU1RBX01JWEVEX1NVUFBPUlQKKwkgICAgaWYgKHdycS0+dS5kYXRhLnBvaW50ZXIgPT0gTlVMTCkKKwkgICAgeworCQkgICAgcmV0dXJuIFN0YXR1czsKKwkgICAgfQorCisJICAgIGlmIChzdHJzdHIod3JxLT51LmRhdGEucG9pbnRlciwgIk9wTW9kZSIpID09IE5VTEwpCisjZW5kaWYgLy8gQ09ORklHX0FQU1RBX01JWEVEX1NVUFBPUlQgLy8KKyAgICAgICAgeworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOworCQkgICAgcmV0dXJuIC1FTkVURE9XTjsKKyAgICAgICAgfQorICAgIH0KKworCXsJLy8gZGV0ZXJtaW5lIHRoaXMgaW9jdGwgY29tbWFuZCBpcyBjb21taW5nIGZyb20gd2hpY2ggaW50ZXJmYWNlLgorCQlwT2JqLT5pb2N0bF9pZl90eXBlID0gSU5UX01BSU47CisJCXBPYmotPmlvY3RsX2lmID0gTUFJTl9NQlNTSUQ7CisJfQorCisJc3dpdGNoKGNtZCkKKwl7CisjaWZkZWYgUkFMSU5LX0FURQorI2lmZGVmIFJBTElOS18yOHh4X1FBCisJCWNhc2UgUlRQUklWX0lPQ1RMX0FURToKKwkJCXsKKwkJCQlSdG1wRG9BdGUocEFkLCB3cnEpOworCQkJfQorCQkJYnJlYWs7CisjZW5kaWYgLy8gUkFMSU5LXzI4eHhfUUEgLy8KKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisgICAgICAgIGNhc2UgU0lPQ0dJRkhXQUREUjoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklPQ1RMOjpTSU9DR0lGSFdBRERSXG4iKSk7CisJCQltZW1jcHkod3JxLT51Lm5hbWUsIHBBZC0+Q3VycmVudEFkZHJlc3MsIEVUSF9BTEVOKTsKKwkJCWJyZWFrOworCQljYXNlIFNJT0NHSVdOQU1FOgorICAgICAgICB7CisgICAgICAgIAljaGFyICpuYW1lPSZ3cnEtPnUubmFtZVswXTsKKyAgICAgICAgCXJ0X2lvY3RsX2dpd25hbWUobmV0X2RldiwgTlVMTCwgbmFtZSwgTlVMTCk7CisJCQlicmVhazsKKwkJfQorCQljYXNlIFNJT0NHSVdFU1NJRDogIC8vR2V0IEVTU0lECisgICAgICAgIHsKKyAgICAgICAgCXN0cnVjdCBpd19wb2ludCAqZXNzaWQ9JndycS0+dS5lc3NpZDsKKyAgICAgICAgCXJ0X2lvY3RsX2dpd2Vzc2lkKG5ldF9kZXYsIE5VTEwsIGVzc2lkLCBlc3NpZC0+cG9pbnRlcik7CisJCQlicmVhazsKKwkJfQorCQljYXNlIFNJT0NTSVdFU1NJRDogIC8vU2V0IEVTU0lECisgICAgICAgIHsKKyAgICAgICAgCXN0cnVjdCBpd19wb2ludAkqZXNzaWQ9JndycS0+dS5lc3NpZDsKKyAgICAgICAgCXJ0X2lvY3RsX3Npd2Vzc2lkKG5ldF9kZXYsIE5VTEwsIGVzc2lkLCBlc3NpZC0+cG9pbnRlcik7CisJCQlicmVhazsKKwkJfQorCQljYXNlIFNJT0NTSVdOV0lEOiAgIC8vIHNldCBuZXR3b3JrIGlkICh0aGUgY2VsbCkKKwkJY2FzZSBTSU9DR0lXTldJRDogICAvLyBnZXQgbmV0d29yayBpZAorCQkJU3RhdHVzID0gLUVPUE5PVFNVUFA7CisJCQlicmVhazsKKwkJY2FzZSBTSU9DU0lXRlJFUTogICAvL3NldCBjaGFubmVsL2ZyZXF1ZW5jeSAoSHopCisgICAgICAgIHsKKyAgICAgICAgCXN0cnVjdCBpd19mcmVxICpmcmVxPSZ3cnEtPnUuZnJlcTsKKyAgICAgICAgCXJ0X2lvY3RsX3Npd2ZyZXEobmV0X2RldiwgTlVMTCwgZnJlcSwgTlVMTCk7CisJCQlicmVhazsKKwkJfQorCQljYXNlIFNJT0NHSVdGUkVROiAgIC8vIGdldCBjaGFubmVsL2ZyZXF1ZW5jeSAoSHopCisgICAgICAgIHsKKyAgICAgICAgCXN0cnVjdCBpd19mcmVxICpmcmVxPSZ3cnEtPnUuZnJlcTsKKyAgICAgICAgCXJ0X2lvY3RsX2dpd2ZyZXEobmV0X2RldiwgTlVMTCwgZnJlcSwgTlVMTCk7CisJCQlicmVhazsKKwkJfQorCQljYXNlIFNJT0NTSVdOSUNLTjogLy9zZXQgbm9kZSBuYW1lL25pY2tuYW1lCisgICAgICAgIHsKKyAgICAgICAgCXN0cnVjdCBpd19wb2ludCAqZGF0YT0md3JxLT51LmRhdGE7CisgICAgICAgIAlydF9pb2N0bF9zaXduaWNrbihuZXRfZGV2LCBOVUxMLCBkYXRhLCBOVUxMKTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgU0lPQ0dJV05JQ0tOOiAvL2dldCBub2RlIG5hbWUvbmlja25hbWUKKyAgICAgICAgeworICAgICAgICAJc3RydWN0IGl3X3BvaW50ICpkYXRhPSZ3cnEtPnUuZGF0YTsKKyAgICAgICAgCXJ0X2lvY3RsX2dpd25pY2tuKG5ldF9kZXYsIE5VTEwsIGRhdGEsIE5VTEwpOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBTSU9DR0lXUkFURTogICAvL2dldCBkZWZhdWx0IGJpdCByYXRlIChicHMpCisJCSAgICBydF9pb2N0bF9naXdyYXRlKG5ldF9kZXYsIE5VTEwsICZ3cnEtPnUsIE5VTEwpOworICAgICAgICAgICAgYnJlYWs7CisJICAgIGNhc2UgU0lPQ1NJV1JBVEU6ICAvL3NldCBkZWZhdWx0IGJpdCByYXRlIChicHMpCisJICAgICAgICBydF9pb2N0bF9zaXdyYXRlKG5ldF9kZXYsIE5VTEwsICZ3cnEtPnUsIE5VTEwpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU0lPQ0dJV1JUUzogIC8vIGdldCBSVFMvQ1RTIHRocmVzaG9sZCAoYnl0ZXMpCisgICAgICAgIHsKKyAgICAgICAgCXN0cnVjdCBpd19wYXJhbSAqcnRzPSZ3cnEtPnUucnRzOworICAgICAgICAJcnRfaW9jdGxfZ2l3cnRzKG5ldF9kZXYsIE5VTEwsIHJ0cywgTlVMTCk7CisJCQlicmVhazsKKwkJfQorICAgICAgICBjYXNlIFNJT0NTSVdSVFM6ICAvL3NldCBSVFMvQ1RTIHRocmVzaG9sZCAoYnl0ZXMpCisgICAgICAgIHsKKyAgICAgICAgCXN0cnVjdCBpd19wYXJhbSAqcnRzPSZ3cnEtPnUucnRzOworICAgICAgICAJcnRfaW9jdGxfc2l3cnRzKG5ldF9kZXYsIE5VTEwsIHJ0cywgTlVMTCk7CisJCQlicmVhazsKKwkJfQorICAgICAgICBjYXNlIFNJT0NHSVdGUkFHOiAgLy9nZXQgZnJhZ21lbnRhdGlvbiB0aHIgKGJ5dGVzKQorICAgICAgICB7CisgICAgICAgIAlzdHJ1Y3QgaXdfcGFyYW0gKmZyYWc9JndycS0+dS5mcmFnOworICAgICAgICAJcnRfaW9jdGxfZ2l3ZnJhZyhuZXRfZGV2LCBOVUxMLCBmcmFnLCBOVUxMKTsKKwkJCWJyZWFrOworCQl9CisgICAgICAgIGNhc2UgU0lPQ1NJV0ZSQUc6ICAvL3NldCBmcmFnbWVudGF0aW9uIHRociAoYnl0ZXMpCisgICAgICAgIHsKKyAgICAgICAgCXN0cnVjdCBpd19wYXJhbSAqZnJhZz0md3JxLT51LmZyYWc7CisgICAgICAgIAlydF9pb2N0bF9zaXdmcmFnKG5ldF9kZXYsIE5VTEwsIGZyYWcsIE5VTEwpOworCQkJYnJlYWs7CisJCX0KKyAgICAgICAgY2FzZSBTSU9DR0lXRU5DT0RFOiAgLy9nZXQgZW5jb2RpbmcgdG9rZW4gJiBtb2RlCisgICAgICAgIHsKKyAgICAgICAgCXN0cnVjdCBpd19wb2ludCAqZXJxPSZ3cnEtPnUuZW5jb2Rpbmc7CisgICAgICAgIAlpZihlcnEtPnBvaW50ZXIpCisgICAgICAgIAkJcnRfaW9jdGxfZ2l3ZW5jb2RlKG5ldF9kZXYsIE5VTEwsIGVycSwgZXJxLT5wb2ludGVyKTsKKwkJCWJyZWFrOworCQl9CisgICAgICAgIGNhc2UgU0lPQ1NJV0VOQ09ERTogIC8vc2V0IGVuY29kaW5nIHRva2VuICYgbW9kZQorICAgICAgICB7CisgICAgICAgIAlzdHJ1Y3QgaXdfcG9pbnQgKmVycT0md3JxLT51LmVuY29kaW5nOworICAgICAgICAJaWYoZXJxLT5wb2ludGVyKQorICAgICAgICAJCXJ0X2lvY3RsX3Npd2VuY29kZShuZXRfZGV2LCBOVUxMLCBlcnEsIGVycS0+cG9pbnRlcik7CisJCQlicmVhazsKKwkJfQorCQljYXNlIFNJT0NHSVdBUDogICAgIC8vZ2V0IGFjY2VzcyBwb2ludCBNQUMgYWRkcmVzc2VzCisgICAgICAgIHsKKyAgICAgICAgCXN0cnVjdCBzb2NrYWRkciAqYXBfYWRkcj0md3JxLT51LmFwX2FkZHI7CisgICAgICAgIAlydF9pb2N0bF9naXdhcChuZXRfZGV2LCBOVUxMLCBhcF9hZGRyLCBhcF9hZGRyLT5zYV9kYXRhKTsKKwkJCWJyZWFrOworCQl9CisJICAgIGNhc2UgU0lPQ1NJV0FQOiAgLy9zZXQgYWNjZXNzIHBvaW50IE1BQyBhZGRyZXNzZXMKKyAgICAgICAgeworICAgICAgICAJc3RydWN0IHNvY2thZGRyICphcF9hZGRyPSZ3cnEtPnUuYXBfYWRkcjsKKyAgICAgICAgCXJ0X2lvY3RsX3Npd2FwKG5ldF9kZXYsIE5VTEwsIGFwX2FkZHIsIGFwX2FkZHItPnNhX2RhdGEpOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBTSU9DR0lXTU9ERTogICAvL2dldCBvcGVyYXRpb24gbW9kZQorICAgICAgICB7CisgICAgICAgIAlfX3UzMiAqbW9kZT0md3JxLT51Lm1vZGU7CisgICAgICAgIAlydF9pb2N0bF9naXdtb2RlKG5ldF9kZXYsIE5VTEwsIG1vZGUsIE5VTEwpOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBTSU9DU0lXTU9ERTogICAvL3NldCBvcGVyYXRpb24gbW9kZQorICAgICAgICB7CisgICAgICAgIAlfX3UzMiAqbW9kZT0md3JxLT51Lm1vZGU7CisgICAgICAgIAlydF9pb2N0bF9zaXdtb2RlKG5ldF9kZXYsIE5VTEwsIG1vZGUsIE5VTEwpOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBTSU9DR0lXU0VOUzogICAvL2dldCBzZW5zaXRpdml0eSAoZEJtKQorCQljYXNlIFNJT0NTSVdTRU5TOgkvL3NldCBzZW5zaXRpdml0eSAoZEJtKQorCQljYXNlIFNJT0NHSVdQT1dFUjogIC8vZ2V0IFBvd2VyIE1hbmFnZW1lbnQgc2V0dGluZ3MKKwkJY2FzZSBTSU9DU0lXUE9XRVI6ICAvL3NldCBQb3dlciBNYW5hZ2VtZW50IHNldHRpbmdzCisJCWNhc2UgU0lPQ0dJV1RYUE9XOiAgLy9nZXQgdHJhbnNtaXQgcG93ZXIgKGRCbSkKKwkJY2FzZSBTSU9DU0lXVFhQT1c6ICAvL3NldCB0cmFuc21pdCBwb3dlciAoZEJtKQorCQljYXNlIFNJT0NHSVdSQU5HRToJLy9HZXQgcmFuZ2Ugb2YgcGFyYW1ldGVycworCQljYXNlIFNJT0NHSVdSRVRSWToJLy9nZXQgcmV0cnkgbGltaXRzIGFuZCBsaWZldGltZQorCQljYXNlIFNJT0NTSVdSRVRSWToJLy9zZXQgcmV0cnkgbGltaXRzIGFuZCBsaWZldGltZQorCQkJU3RhdHVzID0gLUVPUE5PVFNVUFA7CisJCQlicmVhazsKKwkJY2FzZSBSVF9QUklWX0lPQ1RMOgorCQkJc3ViY21kID0gd3JxLT51LmRhdGEuZmxhZ3M7CisJCQlpZiggc3ViY21kICYgT0lEX0dFVF9TRVRfVE9HR0xFKQorCQkJCVN0YXR1cyA9IFJUTVBTZXRJbmZvcm1hdGlvbihwQWQsIHJxLCBzdWJjbWQpOworCQkJZWxzZQorCQkJCVN0YXR1cyA9IFJUTVBRdWVyeUluZm9ybWF0aW9uKHBBZCwgcnEsIHN1YmNtZCk7CisJCQlicmVhazsKKwkJY2FzZSBTSU9DR0lXUFJJVjoKKwkJCWlmICh3cnEtPnUuZGF0YS5wb2ludGVyKQorCQkJeworCQkJCWlmICggYWNjZXNzX29rKFZFUklGWV9XUklURSwgd3JxLT51LmRhdGEucG9pbnRlciwgc2l6ZW9mKHByaXZ0YWIpKSAhPSBUUlVFKQorCQkJCQlicmVhazsKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocHJpdnRhYikgLyBzaXplb2YocHJpdnRhYlswXSk7CisJCQkJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwcml2dGFiLCBzaXplb2YocHJpdnRhYikpKQorCQkJCQlTdGF0dXMgPSAtRUZBVUxUOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgUlRQUklWX0lPQ1RMX1NFVDoKKwkJCWlmKGFjY2Vzc19vayhWRVJJRllfUkVBRCwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKSAhPSBUUlVFKQorCQkJCWJyZWFrOworCQkJcnRfaW9jdGxfc2V0cGFyYW0obmV0X2RldiwgTlVMTCwgTlVMTCwgd3JxLT51LmRhdGEucG9pbnRlcik7CisJCQlicmVhazsKKwkJY2FzZSBSVFBSSVZfSU9DVExfR1NJVEVTVVJWRVk6CisJCQlSVE1QSW9jdGxHZXRTaXRlU3VydmV5KHBBZCwgd3JxKTsKKwkJICAgIGJyZWFrOworI2lmZGVmIERCRworCQljYXNlIFJUUFJJVl9JT0NUTF9NQUM6CisJCQlSVE1QSW9jdGxNQUMocEFkLCB3cnEpOworCQkJYnJlYWs7CisJCWNhc2UgUlRQUklWX0lPQ1RMX0UyUDoKKwkJCVJUTVBJb2N0bEUyUFJPTShwQWQsIHdycSk7CisJCQlicmVhazsKKyNlbmRpZiAvLyBEQkcgLy8KKyAgICAgICAgY2FzZSBTSU9DRVRIVE9PTDoKKyAgICAgICAgICAgICAgICBicmVhazsKKwkJZGVmYXVsdDoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIklPQ1RMOjp1bmtub3duIElPQ1RMJ3MgY21kID0gMHglMDh4XG4iLCBjbWQpKTsKKwkJCVN0YXR1cyA9IC1FT1BOT1RTVVBQOworCQkJYnJlYWs7CisJfQorCisgICAgaWYoU3RhdGVNYWNoaW5lVG91Y2hlZCkgLy8gVXBwZXIgbGF5ZXIgc2VudCBhIE1MTUUtcmVsYXRlZCBvcGVyYXRpb25zCisgICAgCVJUMjhYWF9NTE1FX0hBTkRMRVIocEFkKTsKKworCXJldHVybiBTdGF0dXM7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IFNTSUQKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVCBTZXRfU1NJRF9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpCit7CisgICAgTkRJU184MDJfMTFfU1NJRCAgICAgICAgICAgICAgICAgICAgU3NpZCwgKnBTc2lkPU5VTEw7CisgICAgQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhdGVNYWNoaW5lVG91Y2hlZCA9IEZBTFNFOworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSBUUlVFOworCisgICAgaWYoIHN0cmxlbihhcmcpIDw9IE1BWF9MRU5fT0ZfU1NJRCkKKyAgICB7CisgICAgICAgIE5kaXNaZXJvTWVtb3J5KCZTc2lkLCBzaXplb2YoTkRJU184MDJfMTFfU1NJRCkpOworICAgICAgICBpZiAoc3RybGVuKGFyZykgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkoU3NpZC5Tc2lkLCBhcmcsIHN0cmxlbihhcmcpKTsKKyAgICAgICAgICAgIFNzaWQuU3NpZExlbmd0aCA9IHN0cmxlbihhcmcpOworICAgICAgICB9CisgICAgICAgIGVsc2UgICAvL0FOWSBzc2lkCisgICAgICAgIHsKKyAgICAgICAgICAgIFNzaWQuU3NpZExlbmd0aCA9IDA7CisJCSAgICBtZW1jcHkoU3NpZC5Tc2lkLCAiIiwgMCk7CisJCQlwQWRhcHRlci0+U3RhQ2ZnLkJzc1R5cGUgPSBCU1NfSU5GUkE7CisJCQlwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlT3BlbjsKKwkgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzICA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uRGlzYWJsZWQ7CisJCX0KKyAgICAgICAgcFNzaWQgPSAmU3NpZDsKKworICAgICAgICBpZiAocEFkYXB0ZXItPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlICE9IENOVExfSURMRSkKKyAgICAgICAgeworICAgICAgICAgICAgUlQyOFhYX01MTUVfUkVTRVRfU1RBVEVfTUFDSElORShwQWRhcHRlcik7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgTUxNRSBidXN5LCByZXNldCBNTE1FIHN0YXRlIG1hY2hpbmUgISEhXG4iKSk7CisgICAgICAgIH0KKworICAgICAgICBwQWRhcHRlci0+TWxtZUF1eC5DdXJyUmVxSXNGcm9tTmRpcyA9IFRSVUU7CisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuYlNjYW5SZXFJc0Zyb21XZWJVSSA9IEZBTFNFOworCQlwQWRhcHRlci0+YkNvbmZpZ0NoYW5nZWQgPSBUUlVFOworCisgICAgICAgIE1sbWVFbnF1ZXVlKHBBZGFwdGVyLAorICAgICAgICAgICAgICAgICAgICBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwKKyAgICAgICAgICAgICAgICAgICAgT0lEXzgwMl8xMV9TU0lELAorICAgICAgICAgICAgICAgICAgICBzaXplb2YoTkRJU184MDJfMTFfU1NJRCksCisgICAgICAgICAgICAgICAgICAgIChWT0lEICopcFNzaWQpOworCisgICAgICAgIFN0YXRlTWFjaGluZVRvdWNoZWQgPSBUUlVFOworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfU1NJRF9Qcm9jOjooTGVuPSVkLFNzaWQ9JXMpXG4iLCBTc2lkLlNzaWRMZW5ndGgsIFNzaWQuU3NpZCkpOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHN1Y2Nlc3MgPSBGQUxTRTsKKworICAgIGlmIChTdGF0ZU1hY2hpbmVUb3VjaGVkKSAvLyBVcHBlciBsYXllciBzZW50IGEgTUxNRS1yZWxhdGVkIG9wZXJhdGlvbnMKKyAgICAJUlQyOFhYX01MTUVfSEFORExFUihwQWRhcHRlcik7CisKKyAgICByZXR1cm4gc3VjY2VzczsKK30KKworI2lmZGVmIFdNTV9TVVBQT1JUCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBXbW1DYXBhYmxlIEVuYWJsZSBvciBEaXNhYmxlCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQJU2V0X1dtbUNhcGFibGVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJQk9PTEVBTgliV21tQ2FwYWJsZTsKKworCWJXbW1DYXBhYmxlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKworCWlmICgoYldtbUNhcGFibGUgPT0gMSkKKyNpZmRlZiBSVDI4NzAKKwkJJiYgKHBBZC0+TnVtYmVyT2ZQaXBlcyA+PSA1KQorI2VuZGlmIC8vIFJUMjg3MCAvLworCQkpCisJCXBBZC0+Q29tbW9uQ2ZnLmJXbW1DYXBhYmxlID0gVFJVRTsKKwllbHNlIGlmIChiV21tQ2FwYWJsZSA9PSAwKQorCQlwQWQtPkNvbW1vbkNmZy5iV21tQ2FwYWJsZSA9IEZBTFNFOworCWVsc2UKKwkJcmV0dXJuIEZBTFNFOyAgLy9JbnZhbGlkIGFyZ3VtZW50CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfV21tQ2FwYWJsZV9Qcm9jOjooYldtbUNhcGFibGU9JWQpXG4iLAorCQlwQWQtPkNvbW1vbkNmZy5iV21tQ2FwYWJsZSkpOworCisJcmV0dXJuIFRSVUU7Cit9CisjZW5kaWYgLy8gV01NX1NVUFBPUlQgLy8KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgTmV0d29yayBUeXBlKEluZnJhc3RydWN0dXJlL0FkaG9jIG1vZGUpCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQgU2V0X05ldHdvcmtUeXBlX1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZykKK3sKKyAgICBVSU5UMzIJVmFsdWUgPSAwOworCisgICAgaWYgKHN0cmNtcChhcmcsICJBZGhvYyIpID09IDApCisJeworCQlpZiAocEFkYXB0ZXItPlN0YUNmZy5Cc3NUeXBlICE9IEJTU19BREhPQykKKwkJeworCQkJLy8gQ29uZmlnIGhhcyBjaGFuZ2VkCisJCQlwQWRhcHRlci0+YkNvbmZpZ0NoYW5nZWQgPSBUUlVFOworICAgICAgICAgICAgaWYgKE1PTklUT1JfT04ocEFkYXB0ZXIpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFJUTVBfSU9fV1JJVEUzMihwQWRhcHRlciwgUlhfRklMVFJfQ0ZHLCBTVEFOT1JNQUwpOworICAgICAgICAgICAgICAgIFJUTVBfSU9fUkVBRDMyKHBBZGFwdGVyLCBNQUNfU1lTX0NUUkwsICZWYWx1ZSk7CisJCQkJVmFsdWUgJj0gKH4weDgwKTsKKwkJCQlSVE1QX0lPX1dSSVRFMzIocEFkYXB0ZXIsIE1BQ19TWVNfQ1RSTCwgVmFsdWUpOworICAgICAgICAgICAgICAgIE9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkYXB0ZXIsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKTsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLmJBdXRvUmVjb25uZWN0ID0gVFJVRTsKKyAgICAgICAgICAgICAgICBMaW5rRG93bihwQWRhcHRlciwgRkFMU0UpOworICAgICAgICAgICAgfQorCQkJaWYgKElORlJBX09OKHBBZGFwdGVyKSkKKwkJCXsKKwkJCQkvL0JPT0xFQU4gQ2FuY2VsbGVkOworCQkJCS8vIFNldCB0aGUgQXV0b1JlY29ubmVjdFNzaWQgdG8gcHJldmVudCBpdCByZWNvbm5lY3QgdG8gb2xkIFNTSUQKKwkJCQkvLyBTaW5jZSBjYWxsaW5nIHRoaXMgaW5kaWNhdGUgdXNlciBkb24ndCB3YW50IHRvIGNvbm5lY3QgdG8gdGhhdCBTU0lEIGFueW1vcmUuCisJCQkJcEFkYXB0ZXItPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWRMZW49IDMyOworCQkJCU5kaXNaZXJvTWVtb3J5KHBBZGFwdGVyLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkLCBwQWRhcHRlci0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbik7CisKKwkJCQlMaW5rRG93bihwQWRhcHRlciwgRkFMU0UpOworCisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTkRJU19TVEFUVVNfTUVESUFfRElTQ09OTkVDVCBFdmVudCBCQiFcbiIpKTsKKwkJCX0KKwkJfQorCQlwQWRhcHRlci0+U3RhQ2ZnLkJzc1R5cGUgPSBCU1NfQURIT0M7CisgICAgICAgIHBBZGFwdGVyLT5uZXRfZGV2LT50eXBlID0gcEFkYXB0ZXItPlN0YUNmZy5PcmlEZXZUeXBlOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT0+U2V0X05ldHdvcmtUeXBlX1Byb2M6OihBRC1IT0MpXG4iKSk7CisJfQorICAgIGVsc2UgaWYgKHN0cmNtcChhcmcsICJJbmZyYSIpID09IDApCisJeworCQlpZiAocEFkYXB0ZXItPlN0YUNmZy5Cc3NUeXBlICE9IEJTU19JTkZSQSkKKwkJeworCQkJLy8gQ29uZmlnIGhhcyBjaGFuZ2VkCisJCQlwQWRhcHRlci0+YkNvbmZpZ0NoYW5nZWQgPSBUUlVFOworICAgICAgICAgICAgaWYgKE1PTklUT1JfT04ocEFkYXB0ZXIpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFJUTVBfSU9fV1JJVEUzMihwQWRhcHRlciwgUlhfRklMVFJfQ0ZHLCBTVEFOT1JNQUwpOworICAgICAgICAgICAgICAgIFJUTVBfSU9fUkVBRDMyKHBBZGFwdGVyLCBNQUNfU1lTX0NUUkwsICZWYWx1ZSk7CisJCQkJVmFsdWUgJj0gKH4weDgwKTsKKwkJCQlSVE1QX0lPX1dSSVRFMzIocEFkYXB0ZXIsIE1BQ19TWVNfQ1RSTCwgVmFsdWUpOworICAgICAgICAgICAgICAgIE9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkYXB0ZXIsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKTsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLmJBdXRvUmVjb25uZWN0ID0gVFJVRTsKKyAgICAgICAgICAgICAgICBMaW5rRG93bihwQWRhcHRlciwgRkFMU0UpOworICAgICAgICAgICAgfQorCQkJaWYgKEFESE9DX09OKHBBZGFwdGVyKSkKKwkJCXsKKwkJCQkvLyBTZXQgdGhlIEF1dG9SZWNvbm5lY3RTc2lkIHRvIHByZXZlbnQgaXQgcmVjb25uZWN0IHRvIG9sZCBTU0lECisJCQkJLy8gU2luY2UgY2FsbGluZyB0aGlzIGluZGljYXRlIHVzZXIgZG9uJ3Qgd2FudCB0byBjb25uZWN0IHRvIHRoYXQgU1NJRCBhbnltb3JlLgorCQkJCXBBZGFwdGVyLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuPSAzMjsKKwkJCQlOZGlzWmVyb01lbW9yeShwQWRhcHRlci0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZCwgcEFkYXB0ZXItPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWRMZW4pOworCisJCQkJTGlua0Rvd24ocEFkYXB0ZXIsIEZBTFNFKTsKKwkJCX0KKwkJfQorCQlwQWRhcHRlci0+U3RhQ2ZnLkJzc1R5cGUgPSBCU1NfSU5GUkE7CisgICAgICAgIHBBZGFwdGVyLT5uZXRfZGV2LT50eXBlID0gcEFkYXB0ZXItPlN0YUNmZy5PcmlEZXZUeXBlOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT0+U2V0X05ldHdvcmtUeXBlX1Byb2M6OihJTkZSQSlcbiIpKTsKKworICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkJzc1R5cGUgPSBCU1NfSU5GUkE7CisJfQorICAgIGVsc2UgaWYgKHN0cmNtcChhcmcsICJNb25pdG9yIikgPT0gMCkKKyAgICB7CisJCVVDSEFSCWJicFZhbHVlID0gMDsKKwkJQkNOX1RJTUVfQ0ZHX1NUUlVDIGNzcjsKKwkJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWRhcHRlciwgZk9QX1NUQVRVU19JTkZSQV9PTik7CisgICAgICAgIE9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkYXB0ZXIsIGZPUF9TVEFUVVNfQURIT0NfT04pOworCQlPUFNUQVRVU19TRVRfRkxBRyhwQWRhcHRlciwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpOworCQkvLyBkaXNhYmxlIGFsbCBwZXJpb2RpYyBzdGF0ZSBtYWNoaW5lCisJCXBBZGFwdGVyLT5TdGFDZmcuYkF1dG9SZWNvbm5lY3QgPSBGQUxTRTsKKwkJLy8gcmVzZXQgYWxsIG1sbWUgc3RhdGUgbWFjaGluZQorCQlSVDI4WFhfTUxNRV9SRVNFVF9TVEFURV9NQUNISU5FKHBBZGFwdGVyKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQgXG4iKSk7CisgICAgICAgIGlmIChwQWRhcHRlci0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsID09IDApCisgICAgICAgIHsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKyAgICAgICAgICAgIGlmIChwQWRhcHRlci0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQU5fTUlYRUQpCisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA9IDM2OworICAgICAgICAgICAgZWxzZQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPSA2OworICAgICAgICB9CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIE5fQ2hhbm5lbENoZWNrKHBBZGFwdGVyKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCWlmIChwQWRhcHRlci0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCAmJgorICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlcgPT0gQldfNDAgJiYKKyAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkVYVENIQSA9PSBFWFRDSEFfQUJPVkUpCisJCXsKKwkJCS8vIDQwTUh6ICxjb250cm9sIGNoYW5uZWwgYXQgbG93ZXIKKwkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWRhcHRlciwgQkJQX1I0LCAmYmJwVmFsdWUpOworCQkJYmJwVmFsdWUgJj0gKH4weDE4KTsKKwkJCWJicFZhbHVlIHw9IDB4MTA7CisJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZGFwdGVyLCBCQlBfUjQsIGJicFZhbHVlKTsKKwkJCXBBZGFwdGVyLT5Db21tb25DZmcuQkJQQ3VycmVudEJXID0gQldfNDA7CisJCQkvLyAgUlggOiBjb250cm9sIGNoYW5uZWwgYXQgbG93ZXIKKwkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWRhcHRlciwgQkJQX1IzLCAmYmJwVmFsdWUpOworCQkJYmJwVmFsdWUgJj0gKH4weDIwKTsKKwkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkYXB0ZXIsIEJCUF9SMywgYmJwVmFsdWUpOworCisJCQlSVE1QX0lPX1JFQUQzMihwQWRhcHRlciwgVFhfQkFORF9DRkcsICZWYWx1ZSk7CisJCQlWYWx1ZSAmPSAweGZmZmZmZmZlOworCQkJUlRNUF9JT19XUklURTMyKHBBZGFwdGVyLCBUWF9CQU5EX0NGRywgVmFsdWUpOworCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA9IHBBZGFwdGVyLT5Db21tb25DZmcuQ2hhbm5lbCArIDI7CisgICAgICAgICAgICBBc2ljU3dpdGNoQ2hhbm5lbChwQWRhcHRlciwgcEFkYXB0ZXItPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCwgRkFMU0UpOworCQkgICAgQXNpY0xvY2tDaGFubmVsKHBBZGFwdGVyLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsKTsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkJXXzQwICxjb250cm9sX2NoYW5uZWwoJWQpLCBDZW50cmFsQ2hhbm5lbCglZCkgXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCkpOworCQl9CisJCWVsc2UgaWYgKHBBZGFwdGVyLT5Db21tb25DZmcuUGh5TW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEICYmCisgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXID09IEJXXzQwICYmCisgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkVYVENIQSA9PSBFWFRDSEFfQkVMT1cpCisJCXsKKwkJCS8vIDQwTUh6ICxjb250cm9sIGNoYW5uZWwgYXQgdXBwZXIKKwkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWRhcHRlciwgQkJQX1I0LCAmYmJwVmFsdWUpOworCQkJYmJwVmFsdWUgJj0gKH4weDE4KTsKKwkJCWJicFZhbHVlIHw9IDB4MTA7CisJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZGFwdGVyLCBCQlBfUjQsIGJicFZhbHVlKTsKKwkJCXBBZGFwdGVyLT5Db21tb25DZmcuQkJQQ3VycmVudEJXID0gQldfNDA7CisJCQlSVE1QX0lPX1JFQUQzMihwQWRhcHRlciwgVFhfQkFORF9DRkcsICZWYWx1ZSk7CisJCQlWYWx1ZSB8PSAweDE7CisJCQlSVE1QX0lPX1dSSVRFMzIocEFkYXB0ZXIsIFRYX0JBTkRfQ0ZHLCBWYWx1ZSk7CisKKwkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWRhcHRlciwgQkJQX1IzLCAmYmJwVmFsdWUpOworCQkJYmJwVmFsdWUgfD0gKDB4MjApOworCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWRhcHRlciwgQkJQX1IzLCBiYnBWYWx1ZSk7CisJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsIC0gMjsKKyAgICAgICAgICAgIEFzaWNTd2l0Y2hDaGFubmVsKHBBZGFwdGVyLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsLCBGQUxTRSk7CisJCSAgICBBc2ljTG9ja0NoYW5uZWwocEFkYXB0ZXIsIHBBZGFwdGVyLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwpOworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQldfNDAgLGNvbnRyb2xfY2hhbm5lbCglZCksIENlbnRyYWxDaGFubmVsKCVkKSBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsKSk7CisJCX0KKwkJZWxzZQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQl7CisJCQkvLyAyME1IegorCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZGFwdGVyLCBCQlBfUjQsICZiYnBWYWx1ZSk7CisJCQliYnBWYWx1ZSAmPSAofjB4MTgpOworCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWRhcHRlciwgQkJQX1I0LCBiYnBWYWx1ZSk7CisJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkJCUEN1cnJlbnRCVyA9IEJXXzIwOworCQkJQXNpY1N3aXRjaENoYW5uZWwocEFkYXB0ZXIsIHBBZGFwdGVyLT5Db21tb25DZmcuQ2hhbm5lbCwgRkFMU0UpOworCQkJQXNpY0xvY2tDaGFubmVsKHBBZGFwdGVyLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWwpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQldfMjAsIENoYW5uZWwoJWQpXG4iLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWwpKTsKKwkJfQorCQkvLyBFbmFibGUgUnggd2l0aCBwcm9taXNjdW91cyByZWNlcHRpb24KKwkJUlRNUF9JT19XUklURTMyKHBBZGFwdGVyLCBSWF9GSUxUUl9DRkcsIDB4Myk7CisJCS8vIEFTSUMgc3VwcG9yc3RzIHNuaWZmZXIgZnVuY3Rpb24gd2l0aCByZXBsYWNpbmcgUlNTSSB3aXRoIHRpbWVzdGFtcC4KKwkJLy9SVE1QX0lPX1JFQUQzMihwQWRhcHRlciwgTUFDX1NZU19DVFJMLCAmVmFsdWUpOworCQkvL1ZhbHVlIHw9ICgweDgwKTsKKwkJLy9SVE1QX0lPX1dSSVRFMzIocEFkYXB0ZXIsIE1BQ19TWVNfQ1RSTCwgVmFsdWUpOworCQkvLyBkaXNhYmxlIHN5bmMKKwkJUlRNUF9JT19SRUFEMzIocEFkYXB0ZXIsIEJDTl9USU1FX0NGRywgJmNzci53b3JkKTsKKwkJY3NyLmZpZWxkLmJCZWFjb25HZW4gPSAwOworCQljc3IuZmllbGQuYlRCVFRFbmFibGUgPSAwOworCQljc3IuZmllbGQuVHNmU3luY01vZGUgPSAwOworCQlSVE1QX0lPX1dSSVRFMzIocEFkYXB0ZXIsIEJDTl9USU1FX0NGRywgY3NyLndvcmQpOworCisJCXBBZGFwdGVyLT5TdGFDZmcuQnNzVHlwZSA9IEJTU19NT05JVE9SOworICAgICAgICBwQWRhcHRlci0+bmV0X2Rldi0+dHlwZSA9IEFSUEhSRF9JRUVFODAyMTFfUFJJU007IC8vQVJQSFJEX0lFRUU4MDIxMTsgLy8gSUVFRTgwMjExCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT5TZXRfTmV0d29ya1R5cGVfUHJvYzo6KE1PTklUT1IpXG4iKSk7CisgICAgfQorCisgICAgLy8gUmVzZXQgUmFsaW5rIHN1cHBsaWNhbnQgdG8gbm90IHVzZSwgaXQgd2lsbCBiZSBzZXQgdG8gc3RhcnQgd2hlbiBVSSBzZXQgUE1LIGtleQorICAgIHBBZGFwdGVyLT5TdGFDZmcuV3BhU3RhdGUgPSBTU19OT1RVU0U7CisKKyAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfTmV0d29ya1R5cGVfUHJvYzo6KE5ldHdvcmtUeXBlPSVkKVxuIiwgcEFkYXB0ZXItPlN0YUNmZy5Cc3NUeXBlKSk7CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgQXV0aGVudGljYXRpb24gbW9kZQorICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UIFNldF9BdXRoTW9kZV9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpCit7CisgICAgaWYgKChzdHJjbXAoYXJnLCAiV0VQQVVUTyIpID09IDApIHx8IChzdHJjbXAoYXJnLCAid2VwYXV0byIpID09IDApKQorICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlQXV0b1N3aXRjaDsKKyAgICBlbHNlIGlmICgoc3RyY21wKGFyZywgIk9QRU4iKSA9PSAwKSB8fCAoc3RyY21wKGFyZywgIm9wZW4iKSA9PSAwKSkKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZU9wZW47CisgICAgZWxzZSBpZiAoKHN0cmNtcChhcmcsICJTSEFSRUQiKSA9PSAwKSB8fCAoc3RyY21wKGFyZywgInNoYXJlZCIpID09IDApKQorICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlU2hhcmVkOworICAgIGVsc2UgaWYgKChzdHJjbXAoYXJnLCAiV1BBUFNLIikgPT0gMCkgfHwgKHN0cmNtcChhcmcsICJ3cGFwc2siKSA9PSAwKSkKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSzsKKyAgICBlbHNlIGlmICgoc3RyY21wKGFyZywgIldQQU5PTkUiKSA9PSAwKSB8fCAoc3RyY21wKGFyZywgIndwYW5vbmUiKSA9PSAwKSkKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmU7CisgICAgZWxzZSBpZiAoKHN0cmNtcChhcmcsICJXUEEyUFNLIikgPT0gMCkgfHwgKHN0cmNtcChhcmcsICJ3cGEycHNrIikgPT0gMCkpCisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLOworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyAgICBlbHNlIGlmICgoc3RyY21wKGFyZywgIldQQSIpID09IDApIHx8IChzdHJjbXAoYXJnLCAid3BhIikgPT0gMCkpCisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVXUEE7CisgICAgZWxzZSBpZiAoKHN0cmNtcChhcmcsICJXUEEyIikgPT0gMCkgfHwgKHN0cmNtcChhcmcsICJ3cGEyIikgPT0gMCkpCisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVXUEEyOworI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKyAgICBlbHNlCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgIHBBZGFwdGVyLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQ7CisKKyAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfQXV0aE1vZGVfUHJvYzo6KEF1dGhNb2RlPSVkKVxuIiwgcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSkpOworCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IEVuY3J5cHRpb24gVHlwZQorICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UIFNldF9FbmNyeXBUeXBlX1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZykKK3sKKyAgICBpZiAoKHN0cmNtcChhcmcsICJOT05FIikgPT0gMCkgfHwgKHN0cmNtcChhcmcsICJub25lIikgPT0gMCkpCisgICAgeworICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpCisgICAgICAgICAgICByZXR1cm4gVFJVRTsgICAgLy8gZG8gbm90aGluZworCisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzICAgICA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5QYWlyQ2lwaGVyICAgID0gTmRpczgwMl8xMVdFUERpc2FibGVkOworCSAgICBwQWRhcHRlci0+U3RhQ2ZnLkdyb3VwQ2lwaGVyICAgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CisgICAgfQorICAgIGVsc2UgaWYgKChzdHJjbXAoYXJnLCAiV0VQIikgPT0gMCkgfHwgKHN0cmNtcChhcmcsICJ3ZXAiKSA9PSAwKSkKKyAgICB7CisgICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKKyAgICAgICAgICAgIHJldHVybiBUUlVFOyAgICAvLyBkbyBub3RoaW5nCisKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXMgICAgID0gTmRpczgwMl8xMVdFUEVuYWJsZWQ7CisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuUGFpckNpcGhlciAgICA9IE5kaXM4MDJfMTFXRVBFbmFibGVkOworCSAgICBwQWRhcHRlci0+U3RhQ2ZnLkdyb3VwQ2lwaGVyICAgPSBOZGlzODAyXzExV0VQRW5hYmxlZDsKKyAgICB9CisgICAgZWxzZSBpZiAoKHN0cmNtcChhcmcsICJUS0lQIikgPT0gMCkgfHwgKHN0cmNtcChhcmcsICJ0a2lwIikgPT0gMCkpCisgICAgeworICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA8IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKKyAgICAgICAgICAgIHJldHVybiBUUlVFOyAgICAvLyBkbyBub3RoaW5nCisKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXMgICAgID0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZDsKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5QYWlyQ2lwaGVyICAgID0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZDsKKwkgICAgcEFkYXB0ZXItPlN0YUNmZy5Hcm91cENpcGhlciAgID0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZDsKKyAgICB9CisgICAgZWxzZSBpZiAoKHN0cmNtcChhcmcsICJBRVMiKSA9PSAwKSB8fCAoc3RyY21wKGFyZywgImFlcyIpID09IDApKQorICAgIHsKKyAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPCBOZGlzODAyXzExQXV0aE1vZGVXUEEpCisgICAgICAgICAgICByZXR1cm4gVFJVRTsgICAgLy8gZG8gbm90aGluZworCisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzICAgICA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQ7CisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuUGFpckNpcGhlciAgICA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQ7CisJICAgIHBBZGFwdGVyLT5TdGFDZmcuR3JvdXBDaXBoZXIgICA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQ7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgcEFkYXB0ZXItPlN0YUNmZy5PcmlnV2VwU3RhdHVzID0gcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXM7CisKKyAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfRW5jcnlwVHlwZV9Qcm9jOjooRW5jcnlwVHlwZT0lZClcbiIsIHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzKSk7CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgRGVmYXVsdCBLZXkgSUQKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVCBTZXRfRGVmYXVsdEtleUlEX1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZykKK3sKKyAgICBVTE9ORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXlJZHg7CisKKyAgICBLZXlJZHggPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworICAgIGlmKChLZXlJZHggPj0gMSApICYmIChLZXlJZHggPD0gNCkpCisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkID0gKFVDSEFSKSAoS2V5SWR4IC0gMSApOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIEZBTFNFOyAgLy9JbnZhbGlkIGFyZ3VtZW50CisKKyAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfRGVmYXVsdEtleUlEX1Byb2M6OihEZWZhdWx0S2V5SUQ9JWQpXG4iLCBwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCkpOworCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IFdFUCBLRVkxCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQgU2V0X0tleTFfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKQoreworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleUxlbjsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpOworICAgIFVDSEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENpcGhlckFsZz1DSVBIRVJfV0VQNjQ7CisKKyAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpCisgICAgICAgIHJldHVybiBUUlVFOyAgICAvLyBkbyBub3RoaW5nCisKKyAgICBLZXlMZW4gPSBzdHJsZW4oYXJnKTsKKworICAgIHN3aXRjaCAoS2V5TGVuKQorICAgIHsKKyAgICAgICAgY2FzZSA1OiAvL3dlcCA0MCBBc2NpaSB0eXBlCisgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzBdLktleUxlbiA9IEtleUxlbjsKKyAgICAgICAgICAgIG1lbWNweShwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzBdLktleSwgYXJnLCBLZXlMZW4pOworICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTFfUHJvYzo6KEtleTE9JXMgYW5kIHR5cGU9JXMpXG4iLCBhcmcsICJBc2NpaSIpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDEwOiAvL3dlcCA0MCBIZXggdHlwZQorICAgICAgICAgICAgZm9yKGk9MDsgaSA8IEtleUxlbjsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCAhaXN4ZGlnaXQoKihhcmcraSkpICkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOyAgLy9Ob3QgSGV4IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVswXS5LZXlMZW4gPSBLZXlMZW4gLyAyIDsKKyAgICAgICAgICAgIEF0b0goYXJnLCBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzBdLktleSwgS2V5TGVuIC8gMik7CisgICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5MV9Qcm9jOjooS2V5MT0lcyBhbmQgdHlwZT0lcylcbiIsIGFyZywgIkhleCIpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDEzOiAvL3dlcCAxMDQgQXNjaWkgdHlwZQorICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVswXS5LZXlMZW4gPSBLZXlMZW47CisgICAgICAgICAgICBtZW1jcHkocEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVswXS5LZXksIGFyZywgS2V5TGVuKTsKKyAgICAgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5MV9Qcm9jOjooS2V5MT0lcyBhbmQgdHlwZT0lcylcbiIsIGFyZywgIkFzY2lpIikpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjY6IC8vd2VwIDEwNCBIZXggdHlwZQorICAgICAgICAgICAgZm9yKGk9MDsgaSA8IEtleUxlbjsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCAhaXN4ZGlnaXQoKihhcmcraSkpICkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOyAgLy9Ob3QgSGV4IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVswXS5LZXlMZW4gPSBLZXlMZW4gLyAyIDsKKyAgICAgICAgICAgIEF0b0goYXJnLCBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzBdLktleSwgS2V5TGVuIC8gMik7CisgICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTFfUHJvYzo6KEtleTE9JXMgYW5kIHR5cGU9JXMpXG4iLCBhcmcsICJIZXgiKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDogLy9JbnZhbGlkIGFyZ3VtZW50CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5MV9Qcm9jOjpJbnZhbGlkIGFyZ3VtZW50ICg9JXMpXG4iLCBhcmcpKTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZyA9IENpcGhlckFsZzsKKworICAgIC8vIFNldCBrZXlzIChpbnRvIEFTSUMpCisgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKQorICAgICAgICA7ICAgLy8gbm90IHN1cHBvcnQKKyAgICBlbHNlICAgIC8vIE9sZCBXRVAgc3R1ZmYKKyAgICB7CisgICAgICAgIEFzaWNBZGRTaGFyZWRLZXlFbnRyeShwQWRhcHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzBdLktleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICB9CisKKyAgICByZXR1cm4gVFJVRTsKK30KKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgV0VQIEtFWTIKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVCBTZXRfS2V5Ml9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpCit7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5TGVuOworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGk7CisgICAgVUNIQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2lwaGVyQWxnPUNJUEhFUl9XRVA2NDsKKworICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKKyAgICAgICAgcmV0dXJuIFRSVUU7ICAgIC8vIGRvIG5vdGhpbmcKKworICAgIEtleUxlbiA9IHN0cmxlbihhcmcpOworCisgICAgc3dpdGNoIChLZXlMZW4pCisgICAgeworICAgICAgICBjYXNlIDU6IC8vd2VwIDQwIEFzY2lpIHR5cGUKKyAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMV0uS2V5TGVuID0gS2V5TGVuOworICAgICAgICAgICAgbWVtY3B5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMV0uS2V5LCBhcmcsIEtleUxlbik7CisgICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5Ml9Qcm9jOjooS2V5Mj0lcyBhbmQgdHlwZT0lcylcbiIsIGFyZywgIkFzY2lpIikpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTA6IC8vd2VwIDQwIEhleCB0eXBlCisgICAgICAgICAgICBmb3IoaT0wOyBpIDwgS2V5TGVuOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoICFpc3hkaWdpdCgqKGFyZytpKSkgKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7ICAvL05vdCBIZXggdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzFdLktleUxlbiA9IEtleUxlbiAvIDIgOworICAgICAgICAgICAgQXRvSChhcmcsIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMV0uS2V5LCBLZXlMZW4gLyAyKTsKKyAgICAgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXkyX1Byb2M6OihLZXkyPSVzIGFuZCB0eXBlPSVzKVxuIiwgYXJnLCAiSGV4IikpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTM6IC8vd2VwIDEwNCBBc2NpaSB0eXBlCisgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzFdLktleUxlbiA9IEtleUxlbjsKKyAgICAgICAgICAgIG1lbWNweShwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzFdLktleSwgYXJnLCBLZXlMZW4pOworICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDEyODsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXkyX1Byb2M6OihLZXkyPSVzIGFuZCB0eXBlPSVzKVxuIiwgYXJnLCAiQXNjaWkiKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyNjogLy93ZXAgMTA0IEhleCB0eXBlCisgICAgICAgICAgICBmb3IoaT0wOyBpIDwgS2V5TGVuOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoICFpc3hkaWdpdCgqKGFyZytpKSkgKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7ICAvL05vdCBIZXggdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzFdLktleUxlbiA9IEtleUxlbiAvIDIgOworICAgICAgICAgICAgQXRvSChhcmcsIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMV0uS2V5LCBLZXlMZW4gLyAyKTsKKyAgICAgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5Ml9Qcm9jOjooS2V5Mj0lcyBhbmQgdHlwZT0lcylcbiIsIGFyZywgIkhleCIpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OiAvL0ludmFsaWQgYXJndW1lbnQKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXkyX1Byb2M6OkludmFsaWQgYXJndW1lbnQgKD0lcylcbiIsIGFyZykpOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzFdLkNpcGhlckFsZyA9IENpcGhlckFsZzsKKworICAgIC8vIFNldCBrZXlzIChpbnRvIEFTSUMpCisgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKQorICAgICAgICA7ICAgLy8gbm90IHN1cHBvcnQKKyAgICBlbHNlICAgIC8vIE9sZCBXRVAgc3R1ZmYKKyAgICB7CisgICAgICAgIEFzaWNBZGRTaGFyZWRLZXlFbnRyeShwQWRhcHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsxXS5DaXBoZXJBbGcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzFdLktleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICB9CisKKyAgICByZXR1cm4gVFJVRTsKK30KKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IFdFUCBLRVkzCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQgU2V0X0tleTNfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKQoreworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleUxlbjsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpOworICAgIFVDSEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENpcGhlckFsZz1DSVBIRVJfV0VQNjQ7CisKKyAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpCisgICAgICAgIHJldHVybiBUUlVFOyAgICAvLyBkbyBub3RoaW5nCisKKyAgICBLZXlMZW4gPSBzdHJsZW4oYXJnKTsKKworICAgIHN3aXRjaCAoS2V5TGVuKQorICAgIHsKKyAgICAgICAgY2FzZSA1OiAvL3dlcCA0MCBBc2NpaSB0eXBlCisgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzJdLktleUxlbiA9IEtleUxlbjsKKyAgICAgICAgICAgIG1lbWNweShwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzJdLktleSwgYXJnLCBLZXlMZW4pOworICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTNfUHJvYzo6KEtleTM9JXMgYW5kIHR5cGU9QXNjaWkpXG4iLCBhcmcpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDEwOiAvL3dlcCA0MCBIZXggdHlwZQorICAgICAgICAgICAgZm9yKGk9MDsgaSA8IEtleUxlbjsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCAhaXN4ZGlnaXQoKihhcmcraSkpICkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOyAgLy9Ob3QgSGV4IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsyXS5LZXlMZW4gPSBLZXlMZW4gLyAyIDsKKyAgICAgICAgICAgIEF0b0goYXJnLCBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzJdLktleSwgS2V5TGVuIC8gMik7CisgICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5M19Qcm9jOjooS2V5Mz0lcyBhbmQgdHlwZT1IZXgpXG4iLCBhcmcpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDEzOiAvL3dlcCAxMDQgQXNjaWkgdHlwZQorICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsyXS5LZXlMZW4gPSBLZXlMZW47CisgICAgICAgICAgICBtZW1jcHkocEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsyXS5LZXksIGFyZywgS2V5TGVuKTsKKyAgICAgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5M19Qcm9jOjooS2V5Mz0lcyBhbmQgdHlwZT1Bc2NpaSlcbiIsIGFyZykpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjY6IC8vd2VwIDEwNCBIZXggdHlwZQorICAgICAgICAgICAgZm9yKGk9MDsgaSA8IEtleUxlbjsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCAhaXN4ZGlnaXQoKihhcmcraSkpICkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOyAgLy9Ob3QgSGV4IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsyXS5LZXlMZW4gPSBLZXlMZW4gLyAyIDsKKyAgICAgICAgICAgIEF0b0goYXJnLCBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzJdLktleSwgS2V5TGVuIC8gMik7CisgICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTNfUHJvYzo6KEtleTM9JXMgYW5kIHR5cGU9SGV4KVxuIiwgYXJnKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDogLy9JbnZhbGlkIGFyZ3VtZW50CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5M19Qcm9jOjpJbnZhbGlkIGFyZ3VtZW50ICg9JXMpXG4iLCBhcmcpKTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsyXS5DaXBoZXJBbGcgPSBDaXBoZXJBbGc7CisKKyAgICAvLyBTZXQga2V5cyAoaW50byBBU0lDKQorICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKKyAgICAgICAgOyAgIC8vIG5vdCBzdXBwb3J0CisgICAgZWxzZSAgICAvLyBPbGQgV0VQIHN0dWZmCisgICAgeworICAgICAgICBBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkYXB0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMl0uQ2lwaGVyQWxnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsyXS5LZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgfQorCisgICAgcmV0dXJuIFRSVUU7Cit9CisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBXRVAgS0VZNAorICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UIFNldF9LZXk0X1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZykKK3sKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXlMZW47CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTsKKyAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaXBoZXJBbGc9Q0lQSEVSX1dFUDY0OworCisgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKQorICAgICAgICByZXR1cm4gVFJVRTsgICAgLy8gZG8gbm90aGluZworCisgICAgS2V5TGVuID0gc3RybGVuKGFyZyk7CisKKyAgICBzd2l0Y2ggKEtleUxlbikKKyAgICB7CisgICAgICAgIGNhc2UgNTogLy93ZXAgNDAgQXNjaWkgdHlwZQorICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVszXS5LZXlMZW4gPSBLZXlMZW47CisgICAgICAgICAgICBtZW1jcHkocEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVszXS5LZXksIGFyZywgS2V5TGVuKTsKKyAgICAgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXk0X1Byb2M6OihLZXk0PSVzIGFuZCB0eXBlPSVzKVxuIiwgYXJnLCAiQXNjaWkiKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxMDogLy93ZXAgNDAgSGV4IHR5cGUKKyAgICAgICAgICAgIGZvcihpPTA7IGkgPCBLZXlMZW47IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiggIWlzeGRpZ2l0KCooYXJnK2kpKSApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsgIC8vTm90IEhleCB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bM10uS2V5TGVuID0gS2V5TGVuIC8gMiA7CisgICAgICAgICAgICBBdG9IKGFyZywgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVszXS5LZXksIEtleUxlbiAvIDIpOworICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTRfUHJvYzo6KEtleTQ9JXMgYW5kIHR5cGU9JXMpXG4iLCBhcmcsICJIZXgiKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxMzogLy93ZXAgMTA0IEFzY2lpIHR5cGUKKyAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bM10uS2V5TGVuID0gS2V5TGVuOworICAgICAgICAgICAgbWVtY3B5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bM10uS2V5LCBhcmcsIEtleUxlbik7CisgICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTRfUHJvYzo6KEtleTQ9JXMgYW5kIHR5cGU9JXMpXG4iLCBhcmcsICJBc2NpaSIpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI2OiAvL3dlcCAxMDQgSGV4IHR5cGUKKyAgICAgICAgICAgIGZvcihpPTA7IGkgPCBLZXlMZW47IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiggIWlzeGRpZ2l0KCooYXJnK2kpKSApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsgIC8vTm90IEhleCB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bM10uS2V5TGVuID0gS2V5TGVuIC8gMiA7CisgICAgICAgICAgICBBdG9IKGFyZywgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVszXS5LZXksIEtleUxlbiAvIDIpOworICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDEyODsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXk0X1Byb2M6OihLZXk0PSVzIGFuZCB0eXBlPSVzKVxuIiwgYXJnLCAiSGV4IikpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6IC8vSW52YWxpZCBhcmd1bWVudAorICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTRfUHJvYzo6SW52YWxpZCBhcmd1bWVudCAoPSVzKVxuIiwgYXJnKSk7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bM10uQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOworCisgICAgLy8gU2V0IGtleXMgKGludG8gQVNJQykKKyAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpCisgICAgICAgIDsgICAvLyBub3Qgc3VwcG9ydAorICAgIGVsc2UgICAgLy8gT2xkIFdFUCBzdHVmZgorICAgIHsKKyAgICAgICAgQXNpY0FkZFNoYXJlZEtleUVudHJ5KHBBZGFwdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzNdLkNpcGhlckFsZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bM10uS2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgIH0KKworICAgIHJldHVybiBUUlVFOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBXUEEgUFNLIGtleQorICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UIFNldF9XUEFQU0tfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKQoreworICAgIFVDSEFSICAgICAgICAgICAgICAgICAgIGtleU1hdGVyaWFsWzQwXTsKKworICAgIGlmICgocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSAhPSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spICYmCisgICAgICAgIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlICE9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spICYmCisJICAgIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlICE9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmUpCisJCSkKKyAgICAgICAgcmV0dXJuIFRSVUU7ICAgIC8vIGRvIG5vdGhpbmcKKworICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9XUEFQU0tfUHJvYzo6KFdQQVBTSz0lcylcbiIsIGFyZykpOworCisgICAgTmRpc1plcm9NZW1vcnkoa2V5TWF0ZXJpYWwsIDQwKTsKKworICAgIGlmICgoc3RybGVuKGFyZykgPCA4KSB8fCAoc3RybGVuKGFyZykgPiA2NCkpCisgICAgeworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQgZmFpbGVkISEoV1BBUFNLPSVzKSwgV1BBUFNLIGtleS1zdHJpbmcgcmVxdWlyZWQgOCB+IDY0IGNoYXJhY3RlcnMgXG4iLCBhcmcpKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIGlmIChzdHJsZW4oYXJnKSA9PSA2NCkKKyAgICB7CisgICAgICAgIEF0b0goYXJnLCBrZXlNYXRlcmlhbCwgMzIpOworICAgICAgICBOZGlzTW92ZU1lbW9yeShwQWRhcHRlci0+U3RhQ2ZnLlBNSywga2V5TWF0ZXJpYWwsIDMyKTsKKworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBQYXNzd29yZEhhc2goKGNoYXIgKilhcmcsIHBBZGFwdGVyLT5NbG1lQXV4LlNzaWQsIHBBZGFwdGVyLT5NbG1lQXV4LlNzaWRMZW4sIGtleU1hdGVyaWFsKTsKKyAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkYXB0ZXItPlN0YUNmZy5QTUssIGtleU1hdGVyaWFsLCAzMik7CisgICAgfQorCisKKworICAgIGlmKHBBZGFwdGVyLT5TdGFDZmcuQnNzVHlwZSA9PSBCU1NfQURIT0MgJiYKKyAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmUpCisgICAgeworICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XcGFTdGF0ZSA9IFNTX05PVFVTRTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLy8gU3RhcnQgU1RBIHN1cHBsaWNhbnQgc3RhdGUgbWFjaGluZQorICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldwYVN0YXRlID0gU1NfU1RBUlQ7CisgICAgfQorCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IFBvd2VyIFNhdmluZyBtb2RlCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQgU2V0X1BTTW9kZV9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpCit7CisgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQnNzVHlwZSA9PSBCU1NfSU5GUkEpCisgICAgeworICAgICAgICBpZiAoKHN0cmNtcChhcmcsICJNYXhfUFNQIikgPT0gMCkgfHwKKwkJCShzdHJjbXAoYXJnLCAibWF4X3BzcCIpID09IDApIHx8CisJCQkoc3RyY21wKGFyZywgIk1BWF9QU1AiKSA9PSAwKSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gZG8gTk9UIHR1cm4gb24gUFNNIGJpdCBoZXJlLCB3YWl0IHVudGlsIE1sbWVDaGVja0ZvclBzbUNoYW5nZSgpCisgICAgICAgICAgICAvLyB0byBleGNsdWRlIGNlcnRhaW4gc2l0dWF0aW9ucy4KKyAgICAgICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLmJXaW5kb3dzQUNDQU1FbmFibGUgPT0gRkFMU0UpCisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XaW5kb3dzUG93ZXJNb2RlID0gTmRpczgwMl8xMVBvd2VyTW9kZU1BWF9QU1A7CisgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldpbmRvd3NCYXR0ZXJ5UG93ZXJNb2RlID0gTmRpczgwMl8xMVBvd2VyTW9kZU1BWF9QU1A7CisgICAgICAgICAgICBPUFNUQVRVU19TRVRfRkxBRyhwQWRhcHRlciwgZk9QX1NUQVRVU19SRUNFSVZFX0RUSU0pOworICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0TGlzdGVuQ291bnQgPSA1OworCisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoKHN0cmNtcChhcmcsICJGYXN0X1BTUCIpID09IDApIHx8CisJCQkJIChzdHJjbXAoYXJnLCAiZmFzdF9wc3AiKSA9PSAwKSB8fAorICAgICAgICAgICAgICAgICAoc3RyY21wKGFyZywgIkZBU1RfUFNQIikgPT0gMCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGRvIE5PVCB0dXJuIG9uIFBTTSBiaXQgaGVyZSwgd2FpdCB1bnRpbCBNbG1lQ2hlY2tGb3JQc21DaGFuZ2UoKQorICAgICAgICAgICAgLy8gdG8gZXhjbHVkZSBjZXJ0YWluIHNpdHVhdGlvbnMuCisgICAgICAgICAgICBPUFNUQVRVU19TRVRfRkxBRyhwQWRhcHRlciwgZk9QX1NUQVRVU19SRUNFSVZFX0RUSU0pOworICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuYldpbmRvd3NBQ0NBTUVuYWJsZSA9PSBGQUxTRSkKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldpbmRvd3NQb3dlck1vZGUgPSBOZGlzODAyXzExUG93ZXJNb2RlRmFzdF9QU1A7CisgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldpbmRvd3NCYXR0ZXJ5UG93ZXJNb2RlID0gTmRpczgwMl8xMVBvd2VyTW9kZUZhc3RfUFNQOworICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0TGlzdGVuQ291bnQgPSAzOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKChzdHJjbXAoYXJnLCAiTGVnYWN5X1BTUCIpID09IDApIHx8CisgICAgICAgICAgICAgICAgIChzdHJjbXAoYXJnLCAibGVnYWN5X3BzcCIpID09IDApIHx8CisgICAgICAgICAgICAgICAgIChzdHJjbXAoYXJnLCAiTEVHQUNZX1BTUCIpID09IDApKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBkbyBOT1QgdHVybiBvbiBQU00gYml0IGhlcmUsIHdhaXQgdW50aWwgTWxtZUNoZWNrRm9yUHNtQ2hhbmdlKCkKKyAgICAgICAgICAgIC8vIHRvIGV4Y2x1ZGUgY2VydGFpbiBzaXR1YXRpb25zLgorICAgICAgICAgICAgT1BTVEFUVVNfU0VUX0ZMQUcocEFkYXB0ZXIsIGZPUF9TVEFUVVNfUkVDRUlWRV9EVElNKTsKKyAgICAgICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLmJXaW5kb3dzQUNDQU1FbmFibGUgPT0gRkFMU0UpCisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XaW5kb3dzUG93ZXJNb2RlID0gTmRpczgwMl8xMVBvd2VyTW9kZUxlZ2FjeV9QU1A7CisgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldpbmRvd3NCYXR0ZXJ5UG93ZXJNb2RlID0gTmRpczgwMl8xMVBvd2VyTW9kZUxlZ2FjeV9QU1A7CisgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRMaXN0ZW5Db3VudCA9IDM7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvL0RlZmF1bHQgTmRpczgwMl8xMVBvd2VyTW9kZUNBTQorICAgICAgICAgICAgLy8gY2xlYXIgUFNNIGJpdCBpbW1lZGlhdGVseQorICAgICAgICAgICAgTWxtZVNldFBzbUJpdChwQWRhcHRlciwgUFdSX0FDVElWRSk7CisgICAgICAgICAgICBPUFNUQVRVU19TRVRfRkxBRyhwQWRhcHRlciwgZk9QX1NUQVRVU19SRUNFSVZFX0RUSU0pOworICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuYldpbmRvd3NBQ0NBTUVuYWJsZSA9PSBGQUxTRSkKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldpbmRvd3NQb3dlck1vZGUgPSBOZGlzODAyXzExUG93ZXJNb2RlQ0FNOworICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XaW5kb3dzQmF0dGVyeVBvd2VyTW9kZSA9IE5kaXM4MDJfMTFQb3dlck1vZGVDQU07CisgICAgICAgIH0KKworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfUFNNb2RlX1Byb2M6OihQU01vZGU9JWxkKVxuIiwgcEFkYXB0ZXItPlN0YUNmZy5XaW5kb3dzUG93ZXJNb2RlKSk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisKKyAgICByZXR1cm4gVFJVRTsKK30KKworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IFdwYVN1cHBvcnQgZmxhZy4KKyAgICBWYWx1ZToKKyAgICAgICAgMDogRHJpdmVyIGlnbm9yZSB3cGFfc3VwcGxpY2FudC4KKyAgICAgICAgMTogd3BhX3N1cHBsaWNhbnQgaW5pdGlhdGVzIHNjYW5uaW5nIGFuZCBBUCBzZWxlY3Rpb24uCisgICAgICAgIDI6IGRyaXZlciB0YWtlcyBjYXJlIG9mIHNjYW5uaW5nLCBBUCBzZWxlY3Rpb24sIGFuZCBJRUVFIDgwMi4xMSBhc3NvY2lhdGlvbiBwYXJhbWV0ZXJzLgorICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UIFNldF9XcGFfU3VwcG9ydCgKKyAgICBJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisKKyAgICBpZiAoIHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCkgPT0gMCkKKyAgICAgICAgcEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQID0gV1BBX1NVUFBMSUNBTlRfRElTQUJMRTsKKyAgICBlbHNlIGlmICggc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKSA9PSAxKQorICAgICAgICBwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgPSBXUEFfU1VQUExJQ0FOVF9FTkFCTEU7CisgICAgZWxzZSBpZiAoIHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCkgPT0gMikKKyAgICAgICAgcEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQID0gV1BBX1NVUFBMSUNBTlRfRU5BQkxFX1dJVEhfV0VCX1VJOworICAgIGVsc2UKKyAgICAgICAgcEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQID0gV1BBX1NVUFBMSUNBTlRfRElTQUJMRTsKKworICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9XcGFfU3VwcG9ydDo6KFdwYVN1cHBsaWNhbnRVUD0lZClcbiIsIHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCkpOworCisgICAgcmV0dXJuIFRSVUU7Cit9CisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCisjaWZkZWYgREJHCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFJlYWQgLyBXcml0ZSBNQUMKKyAgICBBcmd1bWVudHM6CisgICAgICAgIHBBZGFwdGVyICAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIG91ciBhZGFwdGVyCisgICAgICAgIHdycSAgICAgICAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpb2N0bCBhcmd1bWVudAorCisgICAgUmV0dXJuIFZhbHVlOgorICAgICAgICBOb25lCisKKyAgICBOb3RlOgorICAgICAgICBVc2FnZToKKyAgICAgICAgICAgICAgIDEuKSBpd3ByaXYgcmEwIG1hYyAwICAgICAgICA9PT4gcmVhZCBNQUMgd2hlcmUgQWRkcj0weDAKKyAgICAgICAgICAgICAgIDIuKSBpd3ByaXYgcmEwIG1hYyAwPTEyICAgICA9PT4gd3JpdGUgTUFDIHdoZXJlIEFkZHI9MHgwLCB2YWx1ZT0xMgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBSVE1QSW9jdGxNQUMoCisJSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKKwlJTglzdHJ1Y3QgaXdyZXEJKndycSkKK3sKKwlDSEFSCQkJCSp0aGlzX2NoYXI7CisJQ0hBUgkJCQkqdmFsdWU7CisJSU5UCQkJCQlqID0gMCwgayA9IDA7CisJQ0hBUgkJCQltc2dbMTAyNF07CisJQ0hBUgkJCQlhcmdbMjU1XTsKKwlVTE9ORwkJCQltYWNBZGRyID0gMDsKKwlVQ0hBUgkJCQl0ZW1wWzE2XSwgdGVtcDJbMTZdOworCVVJTlQzMgkJCQltYWNWYWx1ZSA9IDA7CisJSU5UCQkJCQlTdGF0dXM7CisKKworCW1lbXNldChtc2csIDB4MDAsIDEwMjQpOworCWlmICh3cnEtPnUuZGF0YS5sZW5ndGggPiAxKSAvL05vIHBhcmFtZXRlcnMuCisJeworCSAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcihhcmcsIHdycS0+dS5kYXRhLnBvaW50ZXIsICh3cnEtPnUuZGF0YS5sZW5ndGggPiAyNTUpID8gMjU1IDogd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJc3ByaW50Zihtc2csICJcbiIpOworCisJCS8vUGFyc2luZyBSZWFkIG9yIFdyaXRlCisJICAgIHRoaXNfY2hhciA9IGFyZzsKKwkJaWYgKCEqdGhpc19jaGFyKQorCQkJZ290byBuZXh0OworCisJCWlmICgodmFsdWUgPSBydHN0cmNocih0aGlzX2NoYXIsICc9JykpICE9IE5VTEwpCisJCQkqdmFsdWUrKyA9IDA7CisKKwkJaWYgKCF2YWx1ZSB8fCAhKnZhbHVlKQorCQl7IC8vUmVhZAorCQkJLy8gU2FuaXR5IGNoZWNrCisJCQlpZihzdHJsZW4odGhpc19jaGFyKSA+IDQpCisJCQkJZ290byBuZXh0OworCisJCQlqID0gc3RybGVuKHRoaXNfY2hhcik7CisJCQl3aGlsZShqLS0gPiAwKQorCQkJeworCQkJCWlmKHRoaXNfY2hhcltqXSA+ICdmJyB8fCB0aGlzX2NoYXJbal0gPCAnMCcpCisJCQkJCXJldHVybjsKKwkJCX0KKworCQkJLy8gTWFjIEFkZHIKKwkJCWsgPSBqID0gc3RybGVuKHRoaXNfY2hhcik7CisJCQl3aGlsZShqLS0gPiAwKQorCQkJeworCQkJCXRoaXNfY2hhcls0LWsral0gPSB0aGlzX2NoYXJbal07CisJCQl9CisKKwkJCXdoaWxlKGsgPCA0KQorCQkJCXRoaXNfY2hhclszLWsrK109JzAnOworCQkJdGhpc19jaGFyWzRdPSdcMCc7CisKKwkJCWlmKHN0cmxlbih0aGlzX2NoYXIpID09IDQpCisJCQl7CisJCQkJQXRvSCh0aGlzX2NoYXIsIHRlbXAsIDIpOworCQkJCW1hY0FkZHIgPSAqdGVtcCoyNTYgKyB0ZW1wWzFdOworCQkJCWlmIChtYWNBZGRyIDwgMHhGRkZGKQorCQkJCXsKKwkJCQkJUlRNUF9JT19SRUFEMzIocEFkYXB0ZXIsIG1hY0FkZHIsICZtYWNWYWx1ZSk7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1hY0FkZHI9JWx4LCBNYWNWYWx1ZT0leFxuIiwgbWFjQWRkciwgbWFjVmFsdWUpKTsKKwkJCQkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksICJbMHglMDhsWF06JTA4WCAgIiwgbWFjQWRkciAsIG1hY1ZhbHVlKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsvL0ludmFsaWQgcGFyYW1ldGVzLCBzbyBkZWZhdWx0IHByaW50ayBhbGwgYmJwCisJCQkJCWdvdG8gbmV4dDsKKwkJCQl9CisJCQl9CisJCX0KKwkJZWxzZQorCQl7IC8vV3JpdGUKKwkJCW1lbWNweSgmdGVtcDIsIHZhbHVlLCBzdHJsZW4odmFsdWUpKTsKKwkJCXRlbXAyW3N0cmxlbih2YWx1ZSldID0gJ1wwJzsKKworCQkJLy8gU2FuaXR5IGNoZWNrCisJCQlpZigoc3RybGVuKHRoaXNfY2hhcikgPiA0KSB8fCBzdHJsZW4odGVtcDIpID4gOCkKKwkJCQlnb3RvIG5leHQ7CisKKwkJCWogPSBzdHJsZW4odGhpc19jaGFyKTsKKwkJCXdoaWxlKGotLSA+IDApCisJCQl7CisJCQkJaWYodGhpc19jaGFyW2pdID4gJ2YnIHx8IHRoaXNfY2hhcltqXSA8ICcwJykKKwkJCQkJcmV0dXJuOworCQkJfQorCisJCQlqID0gc3RybGVuKHRlbXAyKTsKKwkJCXdoaWxlKGotLSA+IDApCisJCQl7CisJCQkJaWYodGVtcDJbal0gPiAnZicgfHwgdGVtcDJbal0gPCAnMCcpCisJCQkJCXJldHVybjsKKwkJCX0KKworCQkJLy9NQUMgQWRkcgorCQkJayA9IGogPSBzdHJsZW4odGhpc19jaGFyKTsKKwkJCXdoaWxlKGotLSA+IDApCisJCQl7CisJCQkJdGhpc19jaGFyWzQtaytqXSA9IHRoaXNfY2hhcltqXTsKKwkJCX0KKworCQkJd2hpbGUoayA8IDQpCisJCQkJdGhpc19jaGFyWzMtaysrXT0nMCc7CisJCQl0aGlzX2NoYXJbNF09J1wwJzsKKworCQkJLy9NQUMgdmFsdWUKKwkJCWsgPSBqID0gc3RybGVuKHRlbXAyKTsKKwkJCXdoaWxlKGotLSA+IDApCisJCQl7CisJCQkJdGVtcDJbOC1rK2pdID0gdGVtcDJbal07CisJCQl9CisKKwkJCXdoaWxlKGsgPCA4KQorCQkJCXRlbXAyWzctaysrXT0nMCc7CisJCQl0ZW1wMls4XT0nXDAnOworCisJCQl7CisJCQkJQXRvSCh0aGlzX2NoYXIsIHRlbXAsIDIpOworCQkJCW1hY0FkZHIgPSAqdGVtcCoyNTYgKyB0ZW1wWzFdOworCisJCQkJQXRvSCh0ZW1wMiwgdGVtcCwgNCk7CisJCQkJbWFjVmFsdWUgPSAqdGVtcCoyNTYqMjU2KjI1NiArIHRlbXBbMV0qMjU2KjI1NiArIHRlbXBbMl0qMjU2ICsgdGVtcFszXTsKKworCQkJCS8vIGRlYnVnIG1vZGUKKwkJCQlpZiAobWFjQWRkciA9PSAoSFdfREVCVUdfU0VUVElOR19CQVNFICsgNCkpCisJCQkJeworCQkJCQkvLyAweDJiZjQ6IGJ5dGUwIG5vbi16ZXJvOiBlbmFibGUgUjE3IHR1bmluZywgMDogZGlzYWJsZSBSMTcgdHVuaW5nCisgICAgICAgICAgICAgICAgICAgIGlmIChtYWNWYWx1ZSAmIDB4MDAwMDAwZmYpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5CYnBUdW5pbmcuYkVuYWJsZSA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoInR1cm4gb24gUjE3IHR1bmluZ1xuIikpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgUjY2OworICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkJicFR1bmluZy5iRW5hYmxlID0gRkFMU0U7CisgICAgICAgICAgICAgICAgICAgICAgICBSNjYgPSAweDI2ICsgR0VUX0xOQV9HQUlOKHBBZGFwdGVyKTsKKyNpZmRlZiBSQUxJTktfQVRFCisJCQkJCQlpZiAoQVRFX09OKHBBZGFwdGVyKSkKKwkJCQkJCXsKKwkJCQkJCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkYXB0ZXIsIEJCUF9SNjYsICgweDI2ICsgR0VUX0xOQV9HQUlOKHBBZGFwdGVyKSkpOworCQkJCQkJfQorCQkJCQkJZWxzZQorI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKwkJCQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkYXB0ZXIsIEJCUF9SNjYsICgweDI2ICsgR0VUX0xOQV9HQUlOKHBBZGFwdGVyKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJ0dXJuIG9mZiBSMTcgdHVuaW5nLCByZXN0b3JlIHRvIDB4JTAyeFxuIiwgUjY2KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKwkJCQkJcmV0dXJuOworCQkJCX0KKworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1hY0FkZHI9JTAybHgsIE1hY1ZhbHVlPTB4JXhcbiIsIG1hY0FkZHIsIG1hY1ZhbHVlKSk7CisKKwkJCQlSVE1QX0lPX1dSSVRFMzIocEFkYXB0ZXIsIG1hY0FkZHIsIG1hY1ZhbHVlKTsKKwkJCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwgIlsweCUwOGxYXTolMDhYICAiLCBtYWNBZGRyLCBtYWNWYWx1ZSk7CisJCQl9CisJCX0KKwl9CituZXh0OgorCWlmKHN0cmxlbihtc2cpID09IDEpCisJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCAiPT09PkVycm9yIGNvbW1hbmQgZm9ybWF0ISIpOworCisJLy8gQ29weSB0aGUgaW5mb3JtYXRpb24gaW50byB0aGUgdXNlciBidWZmZXIKKwl3cnEtPnUuZGF0YS5sZW5ndGggPSBzdHJsZW4obXNnKTsKKwlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgbXNnLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPD09UlRNUElvY3RsTUFDXG5cbiIpKTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBSZWFkIC8gV3JpdGUgRTJQUk9NCisgICAgQXJndW1lbnRzOgorICAgICAgICBwQWRhcHRlciAgICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byBvdXIgYWRhcHRlcgorICAgICAgICB3cnEgICAgICAgICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW9jdGwgYXJndW1lbnQKKworICAgIFJldHVybiBWYWx1ZToKKyAgICAgICAgTm9uZQorCisgICAgTm90ZToKKyAgICAgICAgVXNhZ2U6CisgICAgICAgICAgICAgICAxLikgaXdwcml2IHJhMCBlMnAgMCAgICAgCT09PiByZWFkIEUyUFJPTSB3aGVyZSBBZGRyPTB4MAorICAgICAgICAgICAgICAgMi4pIGl3cHJpdiByYTAgZTJwIDA9MTIzNCAgICA9PT4gd3JpdGUgRTJQUk9NIHdoZXJlIEFkZHI9MHgwLCB2YWx1ZT0xMjM0CisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIFJUTVBJb2N0bEUyUFJPTSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAorCUlOCXN0cnVjdCBpd3JlcQkqd3JxKQoreworCUNIQVIJCQkJKnRoaXNfY2hhcjsKKwlDSEFSCQkJCSp2YWx1ZTsKKwlJTlQJCQkJCWogPSAwLCBrID0gMDsKKwlDSEFSCQkJCW1zZ1sxMDI0XTsKKwlDSEFSCQkJCWFyZ1syNTVdOworCVVTSE9SVAkJCQllZXBBZGRyID0gMDsKKwlVQ0hBUgkJCQl0ZW1wWzE2XSwgdGVtcDJbMTZdOworCVVTSE9SVAkJCQllZXBWYWx1ZTsKKwlpbnQJCQkJCVN0YXR1czsKKworCisJbWVtc2V0KG1zZywgMHgwMCwgMTAyNCk7CisJaWYgKHdycS0+dS5kYXRhLmxlbmd0aCA+IDEpIC8vTm8gcGFyYW1ldGVycy4KKwl7CisJICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKGFyZywgd3JxLT51LmRhdGEucG9pbnRlciwgKHdycS0+dS5kYXRhLmxlbmd0aCA+IDI1NSkgPyAyNTUgOiB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQlzcHJpbnRmKG1zZywgIlxuIik7CisKKwkgICAgLy9QYXJzaW5nIFJlYWQgb3IgV3JpdGUKKwkJdGhpc19jaGFyID0gYXJnOworCisKKwkJaWYgKCEqdGhpc19jaGFyKQorCQkJZ290byBuZXh0OworCisJCWlmICgodmFsdWUgPSBydHN0cmNocih0aGlzX2NoYXIsICc9JykpICE9IE5VTEwpCisJCQkqdmFsdWUrKyA9IDA7CisKKwkJaWYgKCF2YWx1ZSB8fCAhKnZhbHVlKQorCQl7IC8vUmVhZAorCisJCQkvLyBTYW5pdHkgY2hlY2sKKwkJCWlmKHN0cmxlbih0aGlzX2NoYXIpID4gNCkKKwkJCQlnb3RvIG5leHQ7CisKKwkJCWogPSBzdHJsZW4odGhpc19jaGFyKTsKKwkJCXdoaWxlKGotLSA+IDApCisJCQl7CisJCQkJaWYodGhpc19jaGFyW2pdID4gJ2YnIHx8IHRoaXNfY2hhcltqXSA8ICcwJykKKwkJCQkJcmV0dXJuOworCQkJfQorCisJCQkvLyBFMlBST00gYWRkcgorCQkJayA9IGogPSBzdHJsZW4odGhpc19jaGFyKTsKKwkJCXdoaWxlKGotLSA+IDApCisJCQl7CisJCQkJdGhpc19jaGFyWzQtaytqXSA9IHRoaXNfY2hhcltqXTsKKwkJCX0KKworCQkJd2hpbGUoayA8IDQpCisJCQkJdGhpc19jaGFyWzMtaysrXT0nMCc7CisJCQl0aGlzX2NoYXJbNF09J1wwJzsKKworCQkJaWYoc3RybGVuKHRoaXNfY2hhcikgPT0gNCkKKwkJCXsKKwkJCQlBdG9IKHRoaXNfY2hhciwgdGVtcCwgMik7CisJCQkJZWVwQWRkciA9ICp0ZW1wKjI1NiArIHRlbXBbMV07CisJCQkJaWYgKGVlcEFkZHIgPCAweEZGRkYpCisJCQkJeworCQkJCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWRhcHRlciwgZWVwQWRkciwgZWVwVmFsdWUpOworCQkJCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwgIlsweCUwNFhdOjB4JTA0WCAgIiwgZWVwQWRkciAsIGVlcFZhbHVlKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsvL0ludmFsaWQgcGFyYW1ldGVzLCBzbyBkZWZhdWx0IHByaW50ayBhbGwgYmJwCisJCQkJCWdvdG8gbmV4dDsKKwkJCQl9CisJCQl9CisJCX0KKwkJZWxzZQorCQl7IC8vV3JpdGUKKwkJCW1lbWNweSgmdGVtcDIsIHZhbHVlLCBzdHJsZW4odmFsdWUpKTsKKwkJCXRlbXAyW3N0cmxlbih2YWx1ZSldID0gJ1wwJzsKKworCQkJLy8gU2FuaXR5IGNoZWNrCisJCQlpZigoc3RybGVuKHRoaXNfY2hhcikgPiA0KSB8fCBzdHJsZW4odGVtcDIpID4gOCkKKwkJCQlnb3RvIG5leHQ7CisKKwkJCWogPSBzdHJsZW4odGhpc19jaGFyKTsKKwkJCXdoaWxlKGotLSA+IDApCisJCQl7CisJCQkJaWYodGhpc19jaGFyW2pdID4gJ2YnIHx8IHRoaXNfY2hhcltqXSA8ICcwJykKKwkJCQkJcmV0dXJuOworCQkJfQorCQkJaiA9IHN0cmxlbih0ZW1wMik7CisJCQl3aGlsZShqLS0gPiAwKQorCQkJeworCQkJCWlmKHRlbXAyW2pdID4gJ2YnIHx8IHRlbXAyW2pdIDwgJzAnKQorCQkJCQlyZXR1cm47CisJCQl9CisKKwkJCS8vTUFDIEFkZHIKKwkJCWsgPSBqID0gc3RybGVuKHRoaXNfY2hhcik7CisJCQl3aGlsZShqLS0gPiAwKQorCQkJeworCQkJCXRoaXNfY2hhcls0LWsral0gPSB0aGlzX2NoYXJbal07CisJCQl9CisKKwkJCXdoaWxlKGsgPCA0KQorCQkJCXRoaXNfY2hhclszLWsrK109JzAnOworCQkJdGhpc19jaGFyWzRdPSdcMCc7CisKKwkJCS8vTUFDIHZhbHVlCisJCQlrID0gaiA9IHN0cmxlbih0ZW1wMik7CisJCQl3aGlsZShqLS0gPiAwKQorCQkJeworCQkJCXRlbXAyWzQtaytqXSA9IHRlbXAyW2pdOworCQkJfQorCisJCQl3aGlsZShrIDwgNCkKKwkJCQl0ZW1wMlszLWsrK109JzAnOworCQkJdGVtcDJbNF09J1wwJzsKKworCQkJQXRvSCh0aGlzX2NoYXIsIHRlbXAsIDIpOworCQkJZWVwQWRkciA9ICp0ZW1wKjI1NiArIHRlbXBbMV07CisKKwkJCUF0b0godGVtcDIsIHRlbXAsIDIpOworCQkJZWVwVmFsdWUgPSAqdGVtcCoyNTYgKyB0ZW1wWzFdOworCisJCQlSVDI4eHhfRUVQUk9NX1dSSVRFMTYocEFkYXB0ZXIsIGVlcEFkZHIsIGVlcFZhbHVlKTsKKwkJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCAiWzB4JTAyWF06JTAyWCAgIiwgZWVwQWRkciwgZWVwVmFsdWUpOworCQl9CisJfQorbmV4dDoKKwlpZihzdHJsZW4obXNnKSA9PSAxKQorCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwgIj09PT5FcnJvciBjb21tYW5kIGZvcm1hdCEiKTsKKworCisJLy8gQ29weSB0aGUgaW5mb3JtYXRpb24gaW50byB0aGUgdXNlciBidWZmZXIKKwl3cnEtPnUuZGF0YS5sZW5ndGggPSBzdHJsZW4obXNnKTsKKwlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgbXNnLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPD09UlRNUElvY3RsRTJQUk9NXG4iKSk7Cit9CisjZW5kaWYgLy8gREJHIC8vCisKKworCisKK0lOVCBTZXRfVEduV2lmaVRlc3RfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZykKK3sKKyAgICBpZiAoc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKSA9PSAwKQorICAgICAgICBwQWQtPlN0YUNmZy5iVEduV2lmaVRlc3QgPSBGQUxTRTsKKyAgICBlbHNlCisgICAgICAgIHBBZC0+U3RhQ2ZnLmJUR25XaWZpVGVzdCA9IFRSVUU7CisKKyAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJRiBTZXRfVEduV2lmaVRlc3RfUHJvYzo6KGJUR25XaWZpVGVzdD0lZClcbiIsIHBBZC0+U3RhQ2ZnLmJUR25XaWZpVGVzdCkpOworCXJldHVybiBUUlVFOworfQorCitJTlQgU2V0X0xvbmdSZXRyeUxpbWl0X1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJVFhfUlRZX0NGR19TVFJVQwl0eF9ydHlfY2ZnOworCVVDSEFSCQkJCUxvbmdSZXRyeUxpbWl0ID0gKFVDSEFSKXNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisKKwlSVE1QX0lPX1JFQUQzMihwQWRhcHRlciwgVFhfUlRZX0NGRywgJnR4X3J0eV9jZmcud29yZCk7CisJdHhfcnR5X2NmZy5maWVsZC5Mb25nUnR5TGltaXQgPSBMb25nUmV0cnlMaW1pdDsKKwlSVE1QX0lPX1dSSVRFMzIocEFkYXB0ZXIsIFRYX1JUWV9DRkcsIHR4X3J0eV9jZmcud29yZCk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSUYgU2V0X0xvbmdSZXRyeUxpbWl0X1Byb2M6Oih0eF9ydHlfY2ZnPTB4JXgpXG4iLCB0eF9ydHlfY2ZnLndvcmQpKTsKKwlyZXR1cm4gVFJVRTsKK30KKworSU5UIFNldF9TaG9ydFJldHJ5TGltaXRfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlUWF9SVFlfQ0ZHX1NUUlVDCXR4X3J0eV9jZmc7CisJVUNIQVIJCQkJU2hvcnRSZXRyeUxpbWl0ID0gKFVDSEFSKXNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisKKwlSVE1QX0lPX1JFQUQzMihwQWRhcHRlciwgVFhfUlRZX0NGRywgJnR4X3J0eV9jZmcud29yZCk7CisJdHhfcnR5X2NmZy5maWVsZC5TaG9ydFJ0eUxpbWl0ID0gU2hvcnRSZXRyeUxpbWl0OworCVJUTVBfSU9fV1JJVEUzMihwQWRhcHRlciwgVFhfUlRZX0NGRywgdHhfcnR5X2NmZy53b3JkKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJRiBTZXRfU2hvcnRSZXRyeUxpbWl0X1Byb2M6Oih0eF9ydHlfY2ZnPTB4JXgpXG4iLCB0eF9ydHlfY2ZnLndvcmQpKTsKKwlyZXR1cm4gVFJVRTsKK30KKworI2lmZGVmIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QKK0lOVCBTZXRfSWVlZTgwMjExZENsaWVudE1vZGVfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKQoreworICAgIGlmIChzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApID09IDApCisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuSUVFRTgwMjExZENsaWVudE1vZGUgPSBSdDgwMl8xMV9EX05vbmU7CisgICAgZWxzZSBpZiAoc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKSA9PSAxKQorICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLklFRUU4MDIxMWRDbGllbnRNb2RlID0gUnQ4MDJfMTFfRF9GbGV4aWJsZTsKKyAgICBlbHNlIGlmIChzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApID09IDIpCisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuSUVFRTgwMjExZENsaWVudE1vZGUgPSBSdDgwMl8xMV9EX1N0cmljdDsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9JZWVlODAyZE1vZGVfUHJvYzo6KElFRUVFMDIxMWRNb2RlPSVkKVxuIiwgcEFkYXB0ZXItPlN0YUNmZy5JRUVFODAyMTFkQ2xpZW50TW9kZSkpOworICAgIHJldHVybiBUUlVFOworfQorI2VuZGlmIC8vIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QgLy8KKworI2lmZGVmIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQKK0lOVCBTZXRfQ2FycmllckRldGVjdF9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKQoreworICAgIGlmIChzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApID09IDApCisgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLkNhcnJpZXJEZXRlY3QuRW5hYmxlID0gRkFMU0U7CisgICAgZWxzZQorICAgICAgICBwQWQtPkNvbW1vbkNmZy5DYXJyaWVyRGV0ZWN0LkVuYWJsZSA9IFRSVUU7CisKKyAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJRiBTZXRfQ2FycmllckRldGVjdF9Qcm9jOjooQ2FycmllckRldGVjdC5FbmFibGU9JWQpXG4iLCBwQWQtPkNvbW1vbkNmZy5DYXJyaWVyRGV0ZWN0LkVuYWJsZSkpOworCXJldHVybiBUUlVFOworfQorI2VuZGlmIC8vIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQgLy8KKworCitJTlQJU2hvd19BZGhvY19NYWNUYWJsZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBDSEFSCQkJZXh0cmEpCit7CisJSU5UIGk7CisKKwlzcHJpbnRmKGV4dHJhLCAiXG4iKTsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCXNwcmludGYoZXh0cmEsICIlc0hUIE9wZXJhdGluZyBNb2RlIDogJWRcbiIsIGV4dHJhLCBwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8uQWRkSHRJbmZvMi5PcGVyYWlvbk1vZGUpOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJc3ByaW50ZihleHRyYSwgIiVzXG4lLTE5cyUtNHMlLTRzJS03cyUtN3MlLTdzJS0xMHMlLTZzJS02cyUtNnMlLTZzXG4iLCBleHRyYSwKKwkJCSJNQUMiLCAiQUlEIiwgIkJTUyIsICJSU1NJMCIsICJSU1NJMSIsICJSU1NJMiIsICJQaE1kIiwgIkJXIiwgIk1DUyIsICJTR0kiLCAiU1RCQyIpOworCisJZm9yIChpPTE7IGk8TUFYX0xFTl9PRl9NQUNfVEFCTEU7IGkrKykKKwl7CisJCVBNQUNfVEFCTEVfRU5UUlkgcEVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbaV07CisKKwkJaWYgKHN0cmxlbihleHRyYSkgPiAoSVdfUFJJVl9TSVpFX01BU0sgLSAzMCkpCisJCSAgICBicmVhazsKKwkJaWYgKChwRW50cnktPlZhbGlkQXNDTEkgfHwgcEVudHJ5LT5WYWxpZEFzQXBDbGkpICYmIChwRW50cnktPlNzdCA9PSBTU1RfQVNTT0MpKQorCQl7CisJCQlzcHJpbnRmKGV4dHJhLCAiJXMlMDJYOiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWCAgIiwgZXh0cmEsCisJCQkJcEVudHJ5LT5BZGRyWzBdLCBwRW50cnktPkFkZHJbMV0sIHBFbnRyeS0+QWRkclsyXSwKKwkJCQlwRW50cnktPkFkZHJbM10sIHBFbnRyeS0+QWRkcls0XSwgcEVudHJ5LT5BZGRyWzVdKTsKKwkJCXNwcmludGYoZXh0cmEsICIlcyUtNGQiLCBleHRyYSwgKGludClwRW50cnktPkFpZCk7CisJCQlzcHJpbnRmKGV4dHJhLCAiJXMlLTRkIiwgZXh0cmEsIChpbnQpcEVudHJ5LT5hcGlkeCk7CisJCQlzcHJpbnRmKGV4dHJhLCAiJXMlLTdkIiwgZXh0cmEsIHBFbnRyeS0+UnNzaVNhbXBsZS5BdmdSc3NpMCk7CisJCQlzcHJpbnRmKGV4dHJhLCAiJXMlLTdkIiwgZXh0cmEsIHBFbnRyeS0+UnNzaVNhbXBsZS5BdmdSc3NpMSk7CisJCQlzcHJpbnRmKGV4dHJhLCAiJXMlLTdkIiwgZXh0cmEsIHBFbnRyeS0+UnNzaVNhbXBsZS5BdmdSc3NpMik7CisJCQlzcHJpbnRmKGV4dHJhLCAiJXMlLTEwcyIsIGV4dHJhLCBHZXRQaHlNb2RlKHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1PREUpKTsKKwkJCXNwcmludGYoZXh0cmEsICIlcyUtNnMiLCBleHRyYSwgR2V0QlcocEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuQlcpKTsKKwkJCXNwcmludGYoZXh0cmEsICIlcyUtNmQiLCBleHRyYSwgcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTKTsKKwkJCXNwcmludGYoZXh0cmEsICIlcyUtNmQiLCBleHRyYSwgcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuU2hvcnRHSSk7CisJCQlzcHJpbnRmKGV4dHJhLCAiJXMlLTZkIiwgZXh0cmEsIHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLlNUQkMpOworCQkJc3ByaW50ZihleHRyYSwgIiVzJS0xMGQsICVkLCAlZCUlXG4iLCBleHRyYSwgcEVudHJ5LT5EZWJ1Z0ZJRk9Db3VudCwgcEVudHJ5LT5EZWJ1Z1R4Q291bnQsCisJCQkJCQkocEVudHJ5LT5EZWJ1Z1R4Q291bnQpID8gKChwRW50cnktPkRlYnVnVHhDb3VudC1wRW50cnktPkRlYnVnRklGT0NvdW50KSoxMDAvcEVudHJ5LT5EZWJ1Z1R4Q291bnQpIDogMCk7CisJCQlzcHJpbnRmKGV4dHJhLCAiJXNcbiIsIGV4dHJhKTsKKwkJfQorCX0KKworCXJldHVybiBUUlVFOworfQorCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvdG1wNjEgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3RtcDYxCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3NWU0NDQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3RtcDYxCkBAIC0wLDAgKzEsNzAzNyBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICBNb2R1bGUgTmFtZToKKyAgICBzdGFfaW9jdGwuYworCisgICAgQWJzdHJhY3Q6CisgICAgSU9DVEwgcmVsYXRlZCBzdWJyb3V0aW5lcworCisgICAgUmV2aXNpb24gSGlzdG9yeToKKyAgICBXaG8gICAgICAgICBXaGVuICAgICAgICAgIFdoYXQKKyAgICAtLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBSb3J5IENoZW4gICAwMS0wMy0yMDAzICAgIGNyZWF0ZWQKKwlSb3J5IENoZW4gICAwMi0xNC0yMDA1ICAgIG1vZGlmeSB0byBzdXBwb3J0IFJUNjEKKyovCisKKyNpbmNsdWRlCSJydF9jb25maWcuaCIKKworI2lmZGVmIERCRworZXh0ZXJuIFVMT05HICAgIFJURGVidWdMZXZlbDsKKyNlbmRpZgorCisjZGVmaW5lIE5SX1dFUF9LRVlTIAkJCQk0CisjZGVmaW5lIFdFUF9TTUFMTF9LRVlfTEVOIAkJCSg0MC84KQorI2RlZmluZSBXRVBfTEFSR0VfS0VZX0xFTiAJCQkoMTA0LzgpCisKKyNkZWZpbmUgR1JPVVBfS0VZX05PICAgICAgICAgICAgICAgIDQKKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMjcpCisjZGVmaW5lIElXRV9TVFJFQU1fQUREX0VWRU5UKF9BLCBfQiwgX0MsIF9ELCBfRSkJCWl3ZV9zdHJlYW1fYWRkX2V2ZW50KF9BLCBfQiwgX0MsIF9ELCBfRSkKKyNkZWZpbmUgSVdFX1NUUkVBTV9BRERfUE9JTlQoX0EsIF9CLCBfQywgX0QsIF9FKQkJaXdlX3N0cmVhbV9hZGRfcG9pbnQoX0EsIF9CLCBfQywgX0QsIF9FKQorI2RlZmluZSBJV0VfU1RSRUFNX0FERF9WQUxVRShfQSwgX0IsIF9DLCBfRCwgX0UsIF9GKQlpd2Vfc3RyZWFtX2FkZF92YWx1ZShfQSwgX0IsIF9DLCBfRCwgX0UsIF9GKQorI2Vsc2UKKyNkZWZpbmUgSVdFX1NUUkVBTV9BRERfRVZFTlQoX0EsIF9CLCBfQywgX0QsIF9FKQkJaXdlX3N0cmVhbV9hZGRfZXZlbnQoX0IsIF9DLCBfRCwgX0UpCisjZGVmaW5lIElXRV9TVFJFQU1fQUREX1BPSU5UKF9BLCBfQiwgX0MsIF9ELCBfRSkJCWl3ZV9zdHJlYW1fYWRkX3BvaW50KF9CLCBfQywgX0QsIF9FKQorI2RlZmluZSBJV0VfU1RSRUFNX0FERF9WQUxVRShfQSwgX0IsIF9DLCBfRCwgX0UsIF9GKQlpd2Vfc3RyZWFtX2FkZF92YWx1ZShfQiwgX0MsIF9ELCBfRSwgX0YpCisjZW5kaWYKKworZXh0ZXJuIFVDSEFSICAgIENpcGhlcldwYTJUZW1wbGF0ZVtdOworZXh0ZXJuIFVDSEFSICAgIENpcGhlcldwYVBza1RraXBbXTsKK2V4dGVybiBVQ0hBUiAgICBDaXBoZXJXcGFQc2tUa2lwTGVuOworCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX1JUX1ZFUlNJT05fSU5GT3sKKyAgICBVQ0hBUiAgICAgICBEcml2ZXJWZXJzaW9uVzsKKyAgICBVQ0hBUiAgICAgICBEcml2ZXJWZXJzaW9uWDsKKyAgICBVQ0hBUiAgICAgICBEcml2ZXJWZXJzaW9uWTsKKyAgICBVQ0hBUiAgICAgICBEcml2ZXJWZXJzaW9uWjsKKyAgICBVSU5UICAgICAgICBEcml2ZXJCdWlsZFllYXI7CisgICAgVUlOVCAgICAgICAgRHJpdmVyQnVpbGRNb250aDsKKyAgICBVSU5UICAgICAgICBEcml2ZXJCdWlsZERheTsKK30gUlRfVkVSU0lPTl9JTkZPLCAqUFJUX1ZFUlNJT05fSU5GTzsKKworc3RydWN0IGl3X3ByaXZfYXJncyBwcml2dGFiW10gPSB7Cit7IFJUUFJJVl9JT0NUTF9TRVQsCisgIElXX1BSSVZfVFlQRV9DSEFSIHwgMTAyNCwgMCwKKyAgInNldCJ9LAorCit7IFJUUFJJVl9JT0NUTF9TSE9XLCAwLCBJV19QUklWX1RZUEVfQ0hBUiB8IElXX1BSSVZfU0laRV9NQVNLLAorICAiIn0sCit7IFJUUFJJVl9JT0NUTF9TSE9XLCBJV19QUklWX1RZUEVfQ0hBUiB8IDEwMjQsIElXX1BSSVZfVFlQRV9DSEFSIHwgSVdfUFJJVl9TSVpFX01BU0ssCisgICIifSwKKy8qIC0tLSBzdWItaW9jdGxzIGRlZmluaXRpb25zIC0tLSAqLworICAgIHsgU0hPV19DT05OX1NUQVRVUywKKwkgIDAsIElXX1BSSVZfVFlQRV9DSEFSIHwgSVdfUFJJVl9TSVpFX01BU0ssICJjb25uU3RhdHVzIiB9LAorCXsgU0hPV19EUlZJRVJfVkVSSU9OLAorCSAgMCwgSVdfUFJJVl9UWVBFX0NIQVIgfCBJV19QUklWX1NJWkVfTUFTSywgImRyaXZlclZlciIgfSwKKyAgICB7IFNIT1dfQkFfSU5GTywKKwkgIDAsIElXX1BSSVZfVFlQRV9DSEFSIHwgSVdfUFJJVl9TSVpFX01BU0ssICJiYWluZm8iIH0sCisJeyBTSE9XX0RFU0NfSU5GTywKKwkgIDAsIElXX1BSSVZfVFlQRV9DSEFSIHwgSVdfUFJJVl9TSVpFX01BU0ssICJkZXNjaW5mbyIgfSwKKyAgICB7IFJBSU9fT0ZGLAorCSAgMCwgSVdfUFJJVl9UWVBFX0NIQVIgfCBJV19QUklWX1NJWkVfTUFTSywgInJhZGlvX29mZiIgfSwKKwl7IFJBSU9fT04sCisJICAwLCBJV19QUklWX1RZUEVfQ0hBUiB8IElXX1BSSVZfU0laRV9NQVNLLCAicmFkaW9fb24iIH0sCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJeyBTSE9XX0RMU19FTlRSWV9JTkZPLAorCSAgMCwgSVdfUFJJVl9UWVBFX0NIQVIgfCBJV19QUklWX1NJWkVfTUFTSywgImRsc2VudHJ5aW5mbyIgfSwKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKwl7IFNIT1dfQ0ZHX1ZBTFVFLAorCSAgSVdfUFJJVl9UWVBFX0NIQVIgfCAxMDI0LCBJV19QUklWX1RZUEVfQ0hBUiB8IElXX1BSSVZfU0laRV9NQVNLLCAic2hvdyIgfSwKKwl7IFNIT1dfQURIT0NfRU5UUllfSU5GTywKKwkgIDAsIElXX1BSSVZfVFlQRV9DSEFSIHwgSVdfUFJJVl9TSVpFX01BU0ssICJhZGhvY0VudHJ5IiB9LAorCisvKiAtLS0gc3ViLWlvY3RscyByZWxhdGlvbnMgLS0tICovCisKKyNpZmRlZiBEQkcKK3sgUlRQUklWX0lPQ1RMX0JCUCwKKyAgSVdfUFJJVl9UWVBFX0NIQVIgfCBJV19QUklWX1NJWkVfTUFTSywgSVdfUFJJVl9UWVBFX0NIQVIgfCBJV19QUklWX1NJWkVfTUFTSywKKyAgImJicCJ9LAoreyBSVFBSSVZfSU9DVExfTUFDLAorICBJV19QUklWX1RZUEVfQ0hBUiB8IDEwMjQsIElXX1BSSVZfVFlQRV9DSEFSIHwgMTAyNCwKKyAgIm1hYyJ9LAoreyBSVFBSSVZfSU9DVExfRTJQLAorICBJV19QUklWX1RZUEVfQ0hBUiB8IDEwMjQsIElXX1BSSVZfVFlQRV9DSEFSIHwgMTAyNCwKKyAgImUycCJ9LAorI2VuZGlmICAvKiBEQkcgKi8KKworeyBSVFBSSVZfSU9DVExfU1RBVElTVElDUywKKyAgMCwgSVdfUFJJVl9UWVBFX0NIQVIgfCBJV19QUklWX1NJWkVfTUFTSywKKyAgInN0YXQifSwKK3sgUlRQUklWX0lPQ1RMX0dTSVRFU1VSVkVZLAorICAwLCBJV19QUklWX1RZUEVfQ0hBUiB8IDEwMjQsCisgICJnZXRfc2l0ZV9zdXJ2ZXkifSwKK307CisKK0lOVCBTZXRfU1NJRF9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpOworCisjaWZkZWYgV01NX1NVUFBPUlQKK0lOVAlTZXRfV21tQ2FwYWJsZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisjZW5kaWYKKworSU5UIFNldF9OZXR3b3JrVHlwZV9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpOworCitJTlQgU2V0X0F1dGhNb2RlX1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZyk7CisKK0lOVCBTZXRfRW5jcnlwVHlwZV9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpOworCitJTlQgU2V0X0RlZmF1bHRLZXlJRF9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpOworCitJTlQgU2V0X0tleTFfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKTsKKworSU5UIFNldF9LZXkyX1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZyk7CisKK0lOVCBTZXRfS2V5M19Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpOworCitJTlQgU2V0X0tleTRfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKTsKKworSU5UIFNldF9XUEFQU0tfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKTsKKworCitJTlQgU2V0X1BTTW9kZV9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpOworCisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorSU5UIFNldF9XcGFfU3VwcG9ydCgKKyAgICBJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKworI2lmZGVmIERCRworVk9JRCBSVE1QSW9jdGxCQlAoCisJSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKKwlJTglzdHJ1Y3QgaXdyZXEJKndycSk7CisKK1ZPSUQgUlRNUElvY3RsTUFDKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCisJSU4Jc3RydWN0IGl3cmVxCSp3cnEpOworCitWT0lEIFJUTVBJb2N0bEUyUFJPTSgKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBzdHJ1Y3QgaXdyZXEgICAgKndycSk7CisjZW5kaWYgLy8gREJHIC8vCisKKworTkRJU19TVEFUVVMgUlRNUFdQQU5vbmVBZGRLZXlQcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorICAgIElOCVBWT0lECQkJcEJ1Zik7CisKK0lOVCBTZXRfRnJhZ1Rlc3RfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKTsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorSU5UIFNldF9UR25XaWZpVGVzdF9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworSU5UIFNldF9Mb25nUmV0cnlMaW1pdF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UIFNldF9TaG9ydFJldHJ5TGltaXRfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKKyNpZmRlZiBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUCitJTlQgU2V0X0llZWU4MDIxMWRDbGllbnRNb2RlX1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZyk7CisjZW5kaWYgLy8gRVhUX0JVSUxEX0NIQU5ORUxfTElTVCAvLworCisjaWZkZWYgQ0FSUklFUl9ERVRFQ1RJT05fU1VQUE9SVAorSU5UIFNldF9DYXJyaWVyRGV0ZWN0X1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpOworI2VuZGlmIC8vIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQgLy8KKworSU5UCVNob3dfQWRob2NfTWFjVGFibGVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQQ0hBUgkJCWV4dHJhKTsKKworc3RhdGljIHN0cnVjdCB7CisJQ0hBUiAqbmFtZTsKKwlJTlQgKCpzZXRfcHJvYykoUFJUTVBfQURBUFRFUiBwQWRhcHRlciwgUFVDSEFSIGFyZyk7Cit9ICpQUlRNUF9QUklWQVRFX1NFVF9QUk9DLCBSVE1QX1BSSVZBVEVfU1VQUE9SVF9QUk9DW10gPSB7CisJeyJEcml2ZXJWZXJzaW9uIiwJCQkJU2V0X0RyaXZlclZlcnNpb25fUHJvY30sCisJeyJDb3VudHJ5UmVnaW9uIiwJCQkJU2V0X0NvdW50cnlSZWdpb25fUHJvY30sCisJeyJDb3VudHJ5UmVnaW9uQUJhbmQiLAkJCVNldF9Db3VudHJ5UmVnaW9uQUJhbmRfUHJvY30sCisJeyJTU0lEIiwJCQkJCQlTZXRfU1NJRF9Qcm9jfSwKKwl7IldpcmVsZXNzTW9kZSIsCQkJCVNldF9XaXJlbGVzc01vZGVfUHJvY30sCisJeyJUeEJ1cnN0IiwJCQkJCVNldF9UeEJ1cnN0X1Byb2N9LAorCXsiVHhQcmVhbWJsZSIsCQkJCVNldF9UeFByZWFtYmxlX1Byb2N9LAorCXsiVHhQb3dlciIsCQkJCQlTZXRfVHhQb3dlcl9Qcm9jfSwKKwl7IkNoYW5uZWwiLAkJCQkJU2V0X0NoYW5uZWxfUHJvY30sCisJeyJCR1Byb3RlY3Rpb24iLAkJCQlTZXRfQkdQcm90ZWN0aW9uX1Byb2N9LAorCXsiUlRTVGhyZXNob2xkIiwJCQkJU2V0X1JUU1RocmVzaG9sZF9Qcm9jfSwKKwl7IkZyYWdUaHJlc2hvbGQiLAkJCQlTZXRfRnJhZ1RocmVzaG9sZF9Qcm9jfSwKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwl7Ikh0QnciLAkJICAgICAgICAgICAgICAgIFNldF9IdEJ3X1Byb2N9LAorCXsiSHRNY3MiLAkJICAgICAgICAgICAgICAgIFNldF9IdE1jc19Qcm9jfSwKKwl7Ikh0R2kiLAkJICAgICAgICAgICAgICAgIFNldF9IdEdpX1Byb2N9LAorCXsiSHRPcE1vZGUiLAkJICAgICAgICAgICAgU2V0X0h0T3BNb2RlX1Byb2N9LAorCXsiSHRFeHRjaGEiLAkJICAgICAgICAgICAgU2V0X0h0RXh0Y2hhX1Byb2N9LAorCXsiSHRNcGR1RGVuc2l0eSIsCQkgICAgICAgIFNldF9IdE1wZHVEZW5zaXR5X1Byb2N9LAorCXsiSHRCYVdpblNpemUiLAkJICAgICAgICAJU2V0X0h0QmFXaW5TaXplX1Byb2N9LAorCXsiSHRSZGciLAkJICAgICAgICAJCVNldF9IdFJkZ19Qcm9jfSwKKwl7Ikh0QW1zZHUiLAkJICAgICAgICAJCVNldF9IdEFtc2R1X1Byb2N9LAorCXsiSHRBdXRvQmEiLAkJICAgICAgICAJU2V0X0h0QXV0b0JhX1Byb2N9LAorCXsiSHRCYURlY2xpbmUiLAkJCQkJU2V0X0JBRGVjbGluZV9Qcm9jfSwKKwl7Ikh0UHJvdGVjdCIsCQkgICAgICAgIAlTZXRfSHRQcm90ZWN0X1Byb2N9LAorCXsiSHRNaW1vUHMiLAkJICAgICAgICAJU2V0X0h0TWltb1BzX1Byb2N9LAorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisjaWZkZWYgQUdHUkVHQVRJT05fU1VQUE9SVAorCXsiUGt0QWdncmVnYXRlIiwJCQkJU2V0X1BrdEFnZ3JlZ2F0ZV9Qcm9jfSwKKyNlbmRpZgorCisjaWZkZWYgV01NX1NVUFBPUlQKKwl7IldtbUNhcGFibGUiLAkJCQkJU2V0X1dtbUNhcGFibGVfUHJvY30sCisjZW5kaWYKKwl7IklFRUU4MDIxMUgiLAkJCQkJU2V0X0lFRUU4MDIxMUhfUHJvY30sCisgICAgeyJOZXR3b3JrVHlwZSIsICAgICAgICAgICAgICAgICBTZXRfTmV0d29ya1R5cGVfUHJvY30sCisJeyJBdXRoTW9kZSIsCQkJCQlTZXRfQXV0aE1vZGVfUHJvY30sCisJeyJFbmNyeXBUeXBlIiwJCQkJCVNldF9FbmNyeXBUeXBlX1Byb2N9LAorCXsiRGVmYXVsdEtleUlEIiwJCQkJU2V0X0RlZmF1bHRLZXlJRF9Qcm9jfSwKKwl7IktleTEiLAkJCQkJCVNldF9LZXkxX1Byb2N9LAorCXsiS2V5MiIsCQkJCQkJU2V0X0tleTJfUHJvY30sCisJeyJLZXkzIiwJCQkJCQlTZXRfS2V5M19Qcm9jfSwKKwl7IktleTQiLAkJCQkJCVNldF9LZXk0X1Byb2N9LAorCXsiV1BBUFNLIiwJCQkJCQlTZXRfV1BBUFNLX1Byb2N9LAorCXsiUmVzZXRDb3VudGVyIiwJCQkJU2V0X1Jlc2V0U3RhdENvdW50ZXJfUHJvY30sCisJeyJQU01vZGUiLCAgICAgICAgICAgICAgICAgICAgICBTZXRfUFNNb2RlX1Byb2N9LAorI2lmZGVmIERCRworCXsiRGVidWciLAkJCQkJCVNldF9EZWJ1Z19Qcm9jfSwKKyNlbmRpZgorCisjaWZkZWYgUkFMSU5LX0FURQorCXsiQVRFIiwJCQkJCQkJU2V0X0FURV9Qcm9jfSwKKwl7IkFURURBIiwJCQkJCQlTZXRfQVRFX0RBX1Byb2N9LAorCXsiQVRFU0EiLAkJCQkJCVNldF9BVEVfU0FfUHJvY30sCisJeyJBVEVCU1NJRCIsCQkJCQlTZXRfQVRFX0JTU0lEX1Byb2N9LAorCXsiQVRFQ0hBTk5FTCIsCQkJCQlTZXRfQVRFX0NIQU5ORUxfUHJvY30sCisJeyJBVEVUWFBPVzAiLAkJCQkJU2V0X0FURV9UWF9QT1dFUjBfUHJvY30sCisJeyJBVEVUWFBPVzEiLAkJCQkJU2V0X0FURV9UWF9QT1dFUjFfUHJvY30sCisJeyJBVEVUWEFOVCIsCQkJCQlTZXRfQVRFX1RYX0FudGVubmFfUHJvY30sCisJeyJBVEVSWEFOVCIsCQkJCQlTZXRfQVRFX1JYX0FudGVubmFfUHJvY30sCisJeyJBVEVUWEZSRVFPRkZTRVQiLAkJCQlTZXRfQVRFX1RYX0ZSRVFPRkZTRVRfUHJvY30sCisJeyJBVEVUWEJXIiwJCQkJCQlTZXRfQVRFX1RYX0JXX1Byb2N9LAorCXsiQVRFVFhMRU4iLAkJCQkJU2V0X0FURV9UWF9MRU5HVEhfUHJvY30sCisJeyJBVEVUWENOVCIsCQkJCQlTZXRfQVRFX1RYX0NPVU5UX1Byb2N9LAorCXsiQVRFVFhNQ1MiLAkJCQkJU2V0X0FURV9UWF9NQ1NfUHJvY30sCisJeyJBVEVUWE1PREUiLAkJCQkJU2V0X0FURV9UWF9NT0RFX1Byb2N9LAorCXsiQVRFVFhHSSIsCQkJCQkJU2V0X0FURV9UWF9HSV9Qcm9jfSwKKwl7IkFURVJYRkVSIiwJCQkJCVNldF9BVEVfUlhfRkVSX1Byb2N9LAorCXsiQVRFUlJGIiwJCQkJCQlTZXRfQVRFX1JlYWRfUkZfUHJvY30sCisJeyJBVEVXUkYxIiwJCQkJCQlTZXRfQVRFX1dyaXRlX1JGMV9Qcm9jfSwKKwl7IkFURVdSRjIiLAkJCQkJCVNldF9BVEVfV3JpdGVfUkYyX1Byb2N9LAorCXsiQVRFV1JGMyIsCQkJCQkJU2V0X0FURV9Xcml0ZV9SRjNfUHJvY30sCisJeyJBVEVXUkY0IiwJCQkJCQlTZXRfQVRFX1dyaXRlX1JGNF9Qcm9jfSwKKwl7IkFURUxERTJQIiwJCQkJICAgIFNldF9BVEVfTG9hZF9FMlBfUHJvY30sCisJeyJBVEVSRTJQIiwJCQkJCQlTZXRfQVRFX1JlYWRfRTJQX1Byb2N9LAorCXsiQVRFU0hPVyIsCQkJCQkJU2V0X0FURV9TaG93X1Byb2N9LAorCXsiQVRFSEVMUCIsCQkJCQkJU2V0X0FURV9IZWxwX1Byb2N9LAorCisjaWZkZWYgUkFMSU5LXzI4eHhfUUEKKwl7IlR4U3RvcCIsCQkJCQkJU2V0X1R4U3RvcF9Qcm9jfSwKKwl7IlJ4U3RvcCIsCQkJCQkJU2V0X1J4U3RvcF9Qcm9jfSwKKyNlbmRpZiAvLyBSQUxJTktfMjh4eF9RQSAvLworI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyAgICB7IldwYVN1cHBvcnQiLCAgICAgICAgICAgICAgICAgIFNldF9XcGFfU3VwcG9ydH0sCisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCisKKworCXsiRml4ZWRUeE1vZGUiLCAgICAgICAgICAgICAgICAgU2V0X0ZpeGVkVHhNb2RlX1Byb2N9LAorI2lmZGVmIENPTkZJR19BUFNUQV9NSVhFRF9TVVBQT1JUCisJeyJPcE1vZGUiLAkJCQkJCVNldF9PcE1vZGVfUHJvY30sCisjZW5kaWYgLy8gQ09ORklHX0FQU1RBX01JWEVEX1NVUFBPUlQgLy8KKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKyAgICB7IlRHbldpZmlUZXN0IiwgICAgICAgICAgICAgICAgIFNldF9UR25XaWZpVGVzdF9Qcm9jfSwKKyAgICB7IkZvcmNlR0YiLAkJICAgICAgICAJCVNldF9Gb3JjZUdGX1Byb2N9LAorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCXsiRGxzQWRkRW50cnkiLAkJCQkJU2V0X0Rsc0FkZEVudHJ5X1Byb2N9LAorCXsiRGxzVGVhckRvd25FbnRyeSIsCQkJU2V0X0Rsc1RlYXJEb3duRW50cnlfUHJvY30sCisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisJeyJMb25nUmV0cnkiLAkgICAgICAgIAkJU2V0X0xvbmdSZXRyeUxpbWl0X1Byb2N9LAorCXsiU2hvcnRSZXRyeSIsCSAgICAgICAgCQlTZXRfU2hvcnRSZXRyeUxpbWl0X1Byb2N9LAorI2lmZGVmIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QKKwl7IjExZENsaWVudE1vZGUiLAkJCQlTZXRfSWVlZTgwMjExZENsaWVudE1vZGVfUHJvY30sCisjZW5kaWYgLy8gRVhUX0JVSUxEX0NIQU5ORUxfTElTVCAvLworI2lmZGVmIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQKKwl7IkNhcnJpZXJEZXRlY3QiLAkJCQlTZXRfQ2FycmllckRldGVjdF9Qcm9jfSwKKyNlbmRpZiAvLyBDQVJSSUVSX0RFVEVDVElPTl9TVVBQT1JUIC8vCisKKwl7TlVMTCx9Cit9OworCisKK1ZPSUQgUlRNUEFkZEtleSgKKwlJTglQUlRNUF9BREFQVEVSCSAgICBwQWQsCisJSU4JUE5ESVNfODAyXzExX0tFWSAgICBwS2V5KQoreworCVVMT05HCQkJCUtleUlkeDsKKwlNQUNfVEFCTEVfRU5UUlkgIAkqcEVudHJ5OworCisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlRNUEFkZEtleSAtLS0tLS0+XG4iKSk7CisKKwlpZiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKQorCXsKKwkJaWYgKHBLZXktPktleUluZGV4ICYgMHg4MDAwMDAwMCkKKwkJeworCQkgICAgaWYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTmRpc1plcm9NZW1vcnkocEFkLT5TdGFDZmcuUE1LLCAzMik7CisgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuUE1LLCBwS2V5LT5LZXlNYXRlcmlhbCwgcEtleS0+S2V5TGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgICAgIH0KKwkJICAgIC8vIFVwZGF0ZSBQVEsKKwkJICAgIE5kaXNaZXJvTWVtb3J5KCZwQWQtPlNoYXJlZEtleVtCU1MwXVswXSwgc2l6ZW9mKENJUEhFUl9LRVkpKTsKKyAgICAgICAgICAgIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLktleUxlbiA9IExFTl9US0lQX0VLOworICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5LCBwS2V5LT5LZXlNYXRlcmlhbCwgTEVOX1RLSVBfRUspOworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyAgICAgICAgICAgIGlmIChwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uUnhNaWMsIHBLZXktPktleU1hdGVyaWFsICsgTEVOX1RLSVBfRUssIExFTl9US0lQX1RYTUlDSyk7CisgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uVHhNaWMsIHBLZXktPktleU1hdGVyaWFsICsgTEVOX1RLSVBfRUsgKyBMRU5fVEtJUF9UWE1JQ0ssIExFTl9US0lQX1JYTUlDSyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworICAgICAgICAgICAgeworICAgICAgICAgICAgCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLlR4TWljLCBwS2V5LT5LZXlNYXRlcmlhbCArIExFTl9US0lQX0VLLCBMRU5fVEtJUF9UWE1JQ0spOworICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLlJ4TWljLCBwS2V5LT5LZXlNYXRlcmlhbCArIExFTl9US0lQX0VLICsgTEVOX1RLSVBfVFhNSUNLLCBMRU5fVEtJUF9SWE1JQ0spOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBEZWNpZGUgaXRzIENoaXBlckFsZworICAgICAgICAJaWYgKHBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkKKyAgICAgICAgCQlwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcgPSBDSVBIRVJfVEtJUDsKKyAgICAgICAgCWVsc2UgaWYgKHBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKKyAgICAgICAgCQlwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcgPSBDSVBIRVJfQUVTOworICAgICAgICAJZWxzZQorICAgICAgICAJCXBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZyA9IENJUEhFUl9OT05FOworCisgICAgICAgICAgICAvLyBVcGRhdGUgdGhlc2UgcmVsYXRlZCBpbmZvcm1hdGlvbiB0byBNQUNfVEFCTEVfRU5UUlkKKyAgICAgICAgCXBFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdOworICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEVudHJ5LT5QYWlyd2lzZUtleS5LZXksIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLktleSwgTEVOX1RLSVBfRUspOworICAgICAgICAJTmRpc01vdmVNZW1vcnkocEVudHJ5LT5QYWlyd2lzZUtleS5SeE1pYywgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uUnhNaWMsIExFTl9US0lQX1JYTUlDSyk7CisgICAgICAgIAlOZGlzTW92ZU1lbW9yeShwRW50cnktPlBhaXJ3aXNlS2V5LlR4TWljLCBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5UeE1pYywgTEVOX1RLSVBfVFhNSUNLKTsKKyAgICAgICAgCXBFbnRyeS0+UGFpcndpc2VLZXkuQ2lwaGVyQWxnID0gcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnOworCisgICAgICAgIAkvLyBVcGRhdGUgcGFpcndpc2Uga2V5IGluZm9ybWF0aW9uIHRvIEFTSUMgU2hhcmVkIEtleSBUYWJsZQorICAgICAgICAJQXNpY0FkZFNoYXJlZEtleUVudHJ5KHBBZCwKKyAgICAgICAgCQkJCQkJICBCU1MwLAorICAgICAgICAJCQkJCQkgIDAsCisgICAgICAgIAkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnLAorICAgICAgICAJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLktleSwKKyAgICAgICAgCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5UeE1pYywKKyAgICAgICAgCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5SeE1pYyk7CisKKyAgICAgICAgCS8vIFVwZGF0ZSBBU0lDIFdDSUQgYXR0cmlidXRlIHRhYmxlIGFuZCBJVkVJViB0YWJsZQorICAgICAgICAJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWQsCisgICAgICAgIAkJCQkJCQkgIEJTUzAsCisgICAgICAgIAkJCQkJCQkgIDAsCisgICAgICAgIAkJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZywKKyAgICAgICAgCQkJCQkJCSAgcEVudHJ5KTsKKworICAgICAgICAgICAgaWYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gc2V0IDgwMi4xeCBwb3J0IGNvbnRyb2wKKwkgICAgICAgICAgICAvL3BBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQ7CisJCQkJU1RBX1BPUlRfU0VDVVJFRChwQWQpOworCisgICAgICAgICAgICAgICAgLy8gSW5kaWNhdGUgQ29ubmVjdGVkIGZvciBHVUkKKyAgICAgICAgICAgICAgICBwQWQtPkluZGljYXRlTWVkaWFTdGF0ZSA9IE5kaXNNZWRpYVN0YXRlQ29ubmVjdGVkOworICAgICAgICAgICAgfQorCQl9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLy8gVXBkYXRlIEdUSworICAgICAgICAgICAgcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkID0gKHBLZXktPktleUluZGV4ICYgMHhGRik7CisgICAgICAgICAgICBOZGlzWmVyb01lbW9yeSgmcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXSwgc2l6ZW9mKENJUEhFUl9LRVkpKTsKKyAgICAgICAgICAgIHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uS2V5TGVuID0gTEVOX1RLSVBfRUs7CisgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLktleSwgcEtleS0+S2V5TWF0ZXJpYWwsIExFTl9US0lQX0VLKTsKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgICAgICAgICBpZiAocEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLlJ4TWljLCBwS2V5LT5LZXlNYXRlcmlhbCArIExFTl9US0lQX0VLLCBMRU5fVEtJUF9UWE1JQ0spOworICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uVHhNaWMsIHBLZXktPktleU1hdGVyaWFsICsgTEVOX1RLSVBfRUsgKyBMRU5fVEtJUF9UWE1JQ0ssIExFTl9US0lQX1JYTUlDSyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworICAgICAgICAgICAgeworICAgICAgICAgICAgCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uVHhNaWMsIHBLZXktPktleU1hdGVyaWFsICsgTEVOX1RLSVBfRUssIExFTl9US0lQX1RYTUlDSyk7CisgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5SeE1pYywgcEtleS0+S2V5TWF0ZXJpYWwgKyBMRU5fVEtJUF9FSyArIExFTl9US0lQX1RYTUlDSywgTEVOX1RLSVBfUlhNSUNLKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gVXBkYXRlIFNoYXJlZCBLZXkgQ2lwaGVyQWxnCisgICAgCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLkNpcGhlckFsZyA9IENJUEhFUl9OT05FOworICAgIAkJaWYgKHBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpCisgICAgCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5DaXBoZXJBbGcgPSBDSVBIRVJfVEtJUDsKKyAgICAJCWVsc2UgaWYgKHBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCisgICAgCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5DaXBoZXJBbGcgPSBDSVBIRVJfQUVTOworCisgICAgICAgICAgICAvLyBVcGRhdGUgZ3JvdXAga2V5IGluZm9ybWF0aW9uIHRvIEFTSUMgU2hhcmVkIEtleSBUYWJsZQorICAgICAgICAJQXNpY0FkZFNoYXJlZEtleUVudHJ5KHBBZCwKKyAgICAgICAgCQkJCQkJICBCU1MwLAorICAgICAgICAJCQkJCQkgIHBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCwKKyAgICAgICAgCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLkNpcGhlckFsZywKKyAgICAgICAgCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLktleSwKKyAgICAgICAgCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLlR4TWljLAorICAgICAgICAJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uUnhNaWMpOworCisgICAgICAgIAkvLyBVcGRhdGUgQVNJQyBXQ0lEIGF0dHJpYnV0ZSB0YWJsZSBhbmQgSVZFSVYgdGFibGUKKyAgICAgICAgCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkocEFkLAorICAgICAgICAJCQkJCQkJICBCU1MwLAorICAgICAgICAJCQkJCQkJICBwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQsCisgICAgICAgIAkJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uQ2lwaGVyQWxnLAorICAgICAgICAJCQkJCQkJICBOVUxMKTsKKworICAgICAgICAgICAgLy8gc2V0IDgwMi4xeCBwb3J0IGNvbnRyb2wKKwkgICAgICAgIC8vcEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRDsKKwkJCVNUQV9QT1JUX1NFQ1VSRUQocEFkKTsKKworICAgICAgICAgICAgLy8gSW5kaWNhdGUgQ29ubmVjdGVkIGZvciBHVUkKKyAgICAgICAgICAgIHBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID0gTmRpc01lZGlhU3RhdGVDb25uZWN0ZWQ7CisgICAgICAgIH0KKwl9CisJZWxzZQkvLyBkeW5hbWljIFdFUCBmcm9tIHdwYV9zdXBwbGljYW50CisJeworCQlVQ0hBUglDaXBoZXJBbGc7CisgICAgCVBVQ0hBUglLZXk7CisKKwkJaWYocEtleS0+S2V5TGVuZ3RoID09IDMyKQorCQkJZ290byBlbmQ7CisKKwkJS2V5SWR4ID0gcEtleS0+S2V5SW5kZXggJiAweDBmZmZmZmZmOworCisJCWlmIChLZXlJZHggPCA0KQorCQl7CisJCQkvLyBpdCBpcyBhIGRlZmF1bHQgc2hhcmVkIGtleSwgZm9yIFBhaXJ3aXNlIGtleSBzZXR0aW5nCisJCQlpZiAocEtleS0+S2V5SW5kZXggJiAweDgwMDAwMDAwKQorCQkJeworCQkJCXBFbnRyeSA9IE1hY1RhYmxlTG9va3VwKHBBZCwgcEtleS0+QlNTSUQpOworCisJCQkJaWYgKHBFbnRyeSkKKwkJCQl7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJUTVBBZGRLZXk6IFNldCBQYWlyLXdpc2UgS2V5XG4iKSk7CisKKwkJCQkJLy8gc2V0IGtleSBtYXRlcmlhbCBhbmQga2V5IGxlbmd0aAorIAkJCQkJcEVudHJ5LT5QYWlyd2lzZUtleS5LZXlMZW4gPSAoVUNIQVIpcEtleS0+S2V5TGVuZ3RoOworCQkJCQlOZGlzTW92ZU1lbW9yeShwRW50cnktPlBhaXJ3aXNlS2V5LktleSwgJnBLZXktPktleU1hdGVyaWFsLCBwS2V5LT5LZXlMZW5ndGgpOworCisJCQkJCS8vIHNldCBDaXBoZXIgdHlwZQorCQkJCQlpZiAocEtleS0+S2V5TGVuZ3RoID09IDUpCisJCQkJCQlwRW50cnktPlBhaXJ3aXNlS2V5LkNpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKKwkJCQkJZWxzZQorCQkJCQkJcEVudHJ5LT5QYWlyd2lzZUtleS5DaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OworCisJCQkJCS8vIEFkZCBQYWlyLXdpc2Uga2V5IHRvIEFzaWMKKwkJCQkJQXNpY0FkZFBhaXJ3aXNlS2V5RW50cnkoCisJCQkJCQlwQWQsCisJCQkJCQlwRW50cnktPkFkZHIsCisJCQkJCQkoVUNIQVIpcEVudHJ5LT5BaWQsCisgICAgICAgICAgICAgICAgCQkmcEVudHJ5LT5QYWlyd2lzZUtleSk7CisKKwkJCQkJLy8gdXBkYXRlIFdDSUQgYXR0cmlidXRlIHRhYmxlIGFuZCBJVkVJViB0YWJsZSBmb3IgdGhpcyBlbnRyeQorCQkJCQlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KAorCQkJCQkJcEFkLAorCQkJCQkJQlNTMCwKKwkJCQkJCUtleUlkeCwgLy8gVGhlIHZhbHVlIG1heSBiZSBub3QgemVybworCQkJCQkJcEVudHJ5LT5QYWlyd2lzZUtleS5DaXBoZXJBbGcsCisJCQkJCQlwRW50cnkpOworCisJCQkJfQorCQkJfQorCQkJZWxzZQorICAgICAgICAgICAgeworCQkJCS8vIERlZmF1bHQga2V5IGZvciB0eCAoc2hhcmVkIGtleSkKKwkJCQlwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQgPSAoVUNIQVIpIEtleUlkeDsKKworCQkJCS8vIHNldCBrZXkgbWF0ZXJpYWwgYW5kIGtleSBsZW5ndGgKKwkJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLktleUxlbiA9IChVQ0hBUikgcEtleS0+S2V5TGVuZ3RoOworCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uS2V5LCAmcEtleS0+S2V5TWF0ZXJpYWwsIHBLZXktPktleUxlbmd0aCk7CisKKwkJCQkvLyBTZXQgQ2lwZXIgdHlwZQorCQkJCWlmIChwS2V5LT5LZXlMZW5ndGggPT0gNSkKKwkJCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5DaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7CisJCQkJZWxzZQorCQkJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLkNpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7CisKKyAgICAJCQlDaXBoZXJBbGcgPSBwQWQtPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLkNpcGhlckFsZzsKKyAgICAJCQlLZXkgPSBwQWQtPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLktleTsKKworCQkJCS8vIFNldCBHcm91cCBrZXkgbWF0ZXJpYWwgdG8gQXNpYworICAgIAkJCUFzaWNBZGRTaGFyZWRLZXlFbnRyeShwQWQsIEJTUzAsIEtleUlkeCwgQ2lwaGVyQWxnLCBLZXksIE5VTEwsIE5VTEwpOworCisJCQkJLy8gVXBkYXRlIFdDSUQgYXR0cmlidXRlIHRhYmxlIGFuZCBJVkVJViB0YWJsZSBmb3IgdGhpcyBncm91cCBrZXkgdGFibGUKKwkJCQlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZCwgQlNTMCwgS2V5SWR4LCBDaXBoZXJBbGcsIE5VTEwpOworCisJCQl9CisJCX0KKwl9CitlbmQ6CisJcmV0dXJuOworfQorCitjaGFyICogcnRzdHJjaHIoY29uc3QgY2hhciAqIHMsIGludCBjKQoreworICAgIGZvcig7ICpzICE9IChjaGFyKSBjOyArK3MpCisgICAgICAgIGlmICgqcyA9PSAnXDAnKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIChjaGFyICopIHM7Cit9CisKKy8qCitUaGlzIGlzIHJlcXVpcmVkIGZvciBMaW5FWDIwMDQva2VybmVsMi42LjcgdG8gcHJvdmlkZSBpd2xpc3Qgc2Nhbm5pbmcgZnVuY3Rpb24KKyovCisKK2ludAorcnRfaW9jdGxfZ2l3bmFtZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgICBjaGFyICpuYW1lLCBjaGFyICpleHRyYSkKK3sKKy8vCVBSVE1QX0FEQVBURVIgcEFkYXB0ZXIgPSAoUFJUTVBfQURBUFRFUikgZGV2LT5wcml2OworCisjaWZkZWYgUlQyODcwCisJc3RybmNweShuYW1lLCAiUlQyODcwIFdpcmVsZXNzIiwgSUZOQU1TSVopOworI2VuZGlmIC8vIFJUMjg3MCAvLworCXJldHVybiAwOworfQorCitpbnQgcnRfaW9jdGxfc2l3ZnJlcShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCXN0cnVjdCBpd19mcmVxICpmcmVxLCBjaGFyICpleHRyYSkKK3sKKwlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gKFBSVE1QX0FEQVBURVIpIGRldi0+cHJpdjsKKwlpbnQgCWNoYW4gPSAtMTsKKworICAgIC8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCisgICAgaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQorICAgIHsKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOworICAgICAgICByZXR1cm4gLUVORVRET1dOOworICAgIH0KKworCisJaWYgKGZyZXEtPmUgPiAxKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmKChmcmVxLT5lID09IDApICYmIChmcmVxLT5tIDw9IDEwMDApKQorCQljaGFuID0gZnJlcS0+bTsJLy8gU2V0dGluZyBieSBjaGFubmVsIG51bWJlcgorCWVsc2UKKwkJTUFQX0tIWl9UT19DSEFOTkVMX0lEKCAoZnJlcS0+bSAvMTAwKSAsIGNoYW4pOyAvLyBTZXR0aW5nIGJ5IGZyZXF1ZW5jeSAtIHNlYXJjaCB0aGUgdGFibGUgLCBsaWtlIDIuNDEyRywgMi40MjJHLAorCisgICAgaWYgKENoYW5uZWxTYW5pdHkocEFkYXB0ZXIsIGNoYW4pID09IFRSVUUpCisgICAgeworCXBBZGFwdGVyLT5Db21tb25DZmcuQ2hhbm5lbCA9IGNoYW47CisJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiPT0+cnRfaW9jdGxfc2l3ZnJlcTo6U0lPQ1NJV0ZSRVFbY21kPTB4JXhdIChDaGFubmVsPSVkKVxuIiwgU0lPQ1NJV0ZSRVEsIHBBZGFwdGVyLT5Db21tb25DZmcuQ2hhbm5lbCkpOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIDA7Cit9CitpbnQgcnRfaW9jdGxfZ2l3ZnJlcShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgICBzdHJ1Y3QgaXdfZnJlcSAqZnJlcSwgY2hhciAqZXh0cmEpCit7CisgICAgVklSVFVBTF9BREFQVEVSICpwVmlydHVhbEFkID0gTlVMTDsKKwlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gTlVMTDsKKwlVQ0hBUiBjaDsKKwlVTE9ORwltOworCisJaWYgKGRldi0+cHJpdl9mbGFncyA9PSBJTlRfTUFJTikKKwl7CisJCXBBZGFwdGVyID0gZGV2LT5wcml2OworCX0KKwllbHNlCisJeworCQlwVmlydHVhbEFkID0gZGV2LT5wcml2OworCQlpZiAocFZpcnR1YWxBZCAmJiBwVmlydHVhbEFkLT5SdG1wRGV2KQorCQkJcEFkYXB0ZXIgPSBwVmlydHVhbEFkLT5SdG1wRGV2LT5wcml2OworCX0KKworCWlmIChwQWRhcHRlciA9PSBOVUxMKQorCXsKKwkJLyogaWYgMXN0IG9wZW4gZmFpbCwgcEFkIHdpbGwgYmUgZnJlZTsKKwkJICAgU28gdGhlIG5ldF9kZXYtPnByaXYgd2lsbCBiZSBOVUxMIGluIDJyZCBvcGVuICovCisJCXJldHVybiAtRU5FVERPV047CisJfQorCisJCWNoID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCI9PT5ydF9pb2N0bF9naXdmcmVxICAlZFxuIiwgY2gpKTsKKworICAgIE1BUF9DSEFOTkVMX0lEX1RPX0tIWihjaCwgbSk7CisJZnJlcS0+bSA9IG0gKiAxMDA7CisJZnJlcS0+ZSA9IDE7CisJcmV0dXJuIDA7Cit9CisKK2ludCBydF9pb2N0bF9zaXdtb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCSAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSAgIF9fdTMyICptb2RlLCBjaGFyICpleHRyYSkKK3sKKwlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gKFBSVE1QX0FEQVBURVIpIGRldi0+cHJpdjsKKworCS8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCisgICAgaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQorICAgIHsKKyAgICAJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOworICAgICAgIAlyZXR1cm4gLUVORVRET1dOOworICAgIH0KKworCXN3aXRjaCAoKm1vZGUpCisJeworCQljYXNlIElXX01PREVfQURIT0M6CisJCQlTZXRfTmV0d29ya1R5cGVfUHJvYyhwQWRhcHRlciwgIkFkaG9jIik7CisJCQlicmVhazsKKwkJY2FzZSBJV19NT0RFX0lORlJBOgorCQkJU2V0X05ldHdvcmtUeXBlX1Byb2MocEFkYXB0ZXIsICJJbmZyYSIpOworCQkJYnJlYWs7CisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNCwyMCkpCisgICAgICAgIGNhc2UgSVdfTU9ERV9NT05JVE9SOgorCQkJU2V0X05ldHdvcmtUeXBlX1Byb2MocEFkYXB0ZXIsICJNb25pdG9yIik7CisJCQlicmVhazsKKyNlbmRpZgorCQlkZWZhdWx0OgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PnJ0X2lvY3RsX3Npd21vZGU6OlNJT0NTSVdNT0RFICh1bmtub3duICVkKVxuIiwgKm1vZGUpKTsKKwkJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8vIFJlc2V0IFJhbGluayBzdXBwbGljYW50IHRvIG5vdCB1c2UsIGl0IHdpbGwgYmUgc2V0IHRvIHN0YXJ0IHdoZW4gVUkgc2V0IFBNSyBrZXkKKwlwQWRhcHRlci0+U3RhQ2ZnLldwYVN0YXRlID0gU1NfTk9UVVNFOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBydF9pb2N0bF9naXdtb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCSAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSAgIF9fdTMyICptb2RlLCBjaGFyICpleHRyYSkKK3sKKwlQUlRNUF9BREFQVEVSIAlwQWRhcHRlciA9IE5VTEw7CisJVklSVFVBTF9BREFQVEVSICpwVmlydHVhbEFkID0gTlVMTDsKKworCWlmIChkZXYtPnByaXZfZmxhZ3MgPT0gSU5UX01BSU4pCisJeworCQlwQWRhcHRlciA9IGRldi0+cHJpdjsKKwl9CisJZWxzZQorCXsKKwkJcFZpcnR1YWxBZCA9IGRldi0+cHJpdjsKKwkJaWYgKHBWaXJ0dWFsQWQgJiYgcFZpcnR1YWxBZC0+UnRtcERldikKKwkJCXBBZGFwdGVyID0gcFZpcnR1YWxBZC0+UnRtcERldi0+cHJpdjsKKwl9CisKKwlpZiAocEFkYXB0ZXIgPT0gTlVMTCkKKwl7CisJCS8qIGlmIDFzdCBvcGVuIGZhaWwsIHBBZCB3aWxsIGJlIGZyZWU7CisJCSAgIFNvIHRoZSBuZXRfZGV2LT5wcml2IHdpbGwgYmUgTlVMTCBpbiAycmQgb3BlbiAqLworCQlyZXR1cm4gLUVORVRET1dOOworCX0KKworCWlmIChBREhPQ19PTihwQWRhcHRlcikpCisJCSptb2RlID0gSVdfTU9ERV9BREhPQzsKKyAgICBlbHNlIGlmIChJTkZSQV9PTihwQWRhcHRlcikpCisJCSptb2RlID0gSVdfTU9ERV9JTkZSQTsKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw0LDIwKSkKKyAgICBlbHNlIGlmIChNT05JVE9SX09OKHBBZGFwdGVyKSkKKyAgICB7CisgICAgICAgICptb2RlID0gSVdfTU9ERV9NT05JVE9SOworICAgIH0KKyNlbmRpZgorICAgIGVsc2UKKyAgICAgICAgKm1vZGUgPSBJV19NT0RFX0FVVE87CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT5ydF9pb2N0bF9naXdtb2RlKG1vZGU9JWQpXG4iLCAqbW9kZSkpOworCXJldHVybiAwOworfQorCitpbnQgcnRfaW9jdGxfc2l3c2VucyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgICBjaGFyICpuYW1lLCBjaGFyICpleHRyYSkKK3sKKwlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gKFBSVE1QX0FEQVBURVIpIGRldi0+cHJpdjsKKworCS8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCisgICAgCWlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKKyAgICAJeworICAgICAgICAJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOworICAgICAgICAJcmV0dXJuIC1FTkVURE9XTjsKKyAgICAJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCBydF9pb2N0bF9naXdzZW5zKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCSAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSAgIGNoYXIgKm5hbWUsIGNoYXIgKmV4dHJhKQoreworCXJldHVybiAwOworfQorCitpbnQgcnRfaW9jdGxfZ2l3cmFuZ2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJICAgc3RydWN0IGl3X3BvaW50ICpkYXRhLCBjaGFyICpleHRyYSkKK3sKKwlQUlRNUF9BREFQVEVSIAlwQWRhcHRlciA9IE5VTEw7CisJVklSVFVBTF9BREFQVEVSICpwVmlydHVhbEFkID0gTlVMTDsKKwlzdHJ1Y3QgaXdfcmFuZ2UgKnJhbmdlID0gKHN0cnVjdCBpd19yYW5nZSAqKSBleHRyYTsKKwl1MTYgdmFsOworCWludCBpOworCisJaWYgKGRldi0+cHJpdl9mbGFncyA9PSBJTlRfTUFJTikKKwl7CisJCXBBZGFwdGVyID0gZGV2LT5wcml2OworCX0KKwllbHNlCisJeworCQlwVmlydHVhbEFkID0gZGV2LT5wcml2OworCQlpZiAocFZpcnR1YWxBZCAmJiBwVmlydHVhbEFkLT5SdG1wRGV2KQorCQkJcEFkYXB0ZXIgPSBwVmlydHVhbEFkLT5SdG1wRGV2LT5wcml2OworCX0KKworCWlmIChwQWRhcHRlciA9PSBOVUxMKQorCXsKKwkJLyogaWYgMXN0IG9wZW4gZmFpbCwgcEFkIHdpbGwgYmUgZnJlZTsKKwkJICAgU28gdGhlIG5ldF9kZXYtPnByaXYgd2lsbCBiZSBOVUxMIGluIDJyZCBvcGVuICovCisJCXJldHVybiAtRU5FVERPV047CisJfQorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UgLCgiPT09PnJ0X2lvY3RsX2dpd3JhbmdlXG4iKSk7CisJZGF0YS0+bGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCBpd19yYW5nZSk7CisJbWVtc2V0KHJhbmdlLCAwLCBzaXplb2Yoc3RydWN0IGl3X3JhbmdlKSk7CisKKwlyYW5nZS0+dHhwb3dlcl9jYXBhID0gSVdfVFhQT1dfREJNOworCisJaWYgKElORlJBX09OKHBBZGFwdGVyKXx8QURIT0NfT04ocEFkYXB0ZXIpKQorCXsKKwkJcmFuZ2UtPm1pbl9wbXAgPSAxICogMTAyNDsKKwkJcmFuZ2UtPm1heF9wbXAgPSA2NTUzNSAqIDEwMjQ7CisJCXJhbmdlLT5taW5fcG10ID0gMSAqIDEwMjQ7CisJCXJhbmdlLT5tYXhfcG10ID0gMTAwMCAqIDEwMjQ7CisJCXJhbmdlLT5wbXBfZmxhZ3MgPSBJV19QT1dFUl9QRVJJT0Q7CisJCXJhbmdlLT5wbXRfZmxhZ3MgPSBJV19QT1dFUl9USU1FT1VUOworCQlyYW5nZS0+cG1fY2FwYSA9IElXX1BPV0VSX1BFUklPRCB8IElXX1BPV0VSX1RJTUVPVVQgfAorCQkJSVdfUE9XRVJfVU5JQ0FTVF9SIHwgSVdfUE9XRVJfQUxMX1I7CisJfQorCisJcmFuZ2UtPndlX3ZlcnNpb25fY29tcGlsZWQgPSBXSVJFTEVTU19FWFQ7CisJcmFuZ2UtPndlX3ZlcnNpb25fc291cmNlID0gMTQ7CisKKwlyYW5nZS0+cmV0cnlfY2FwYSA9IElXX1JFVFJZX0xJTUlUOworCXJhbmdlLT5yZXRyeV9mbGFncyA9IElXX1JFVFJZX0xJTUlUOworCXJhbmdlLT5taW5fcmV0cnkgPSAwOworCXJhbmdlLT5tYXhfcmV0cnkgPSAyNTU7CisKKwlyYW5nZS0+bnVtX2NoYW5uZWxzID0gIHBBZGFwdGVyLT5DaGFubmVsTGlzdE51bTsKKworCXZhbCA9IDA7CisJZm9yIChpID0gMTsgaSA8PSByYW5nZS0+bnVtX2NoYW5uZWxzOyBpKyspCisJeworCQl1MzIgbTsKKwkJcmFuZ2UtPmZyZXFbdmFsXS5pID0gcEFkYXB0ZXItPkNoYW5uZWxMaXN0W2ktMV0uQ2hhbm5lbDsKKwkJTUFQX0NIQU5ORUxfSURfVE9fS0haKHBBZGFwdGVyLT5DaGFubmVsTGlzdFtpLTFdLkNoYW5uZWwsIG0pOworCQlyYW5nZS0+ZnJlcVt2YWxdLm0gPSBtICogMTAwOyAvKiBIWiAqLworCisJCXJhbmdlLT5mcmVxW3ZhbF0uZSA9IDE7CisJCXZhbCsrOworCQlpZiAodmFsID09IElXX01BWF9GUkVRVUVOQ0lFUykKKwkJCWJyZWFrOworCX0KKwlyYW5nZS0+bnVtX2ZyZXF1ZW5jeSA9IHZhbDsKKworCXJhbmdlLT5tYXhfcXVhbC5xdWFsID0gMTAwOyAvKiB3aGF0IGlzIGNvcnJlY3QgbWF4PyBUaGlzIHdhcyBub3QKKwkJCQkJKiBkb2N1bWVudGVkIGV4YWN0bHkuIEF0IGxlYXN0CisJCQkJCSogNjkgaGFzIGJlZW4gb2JzZXJ2ZWQuICovCisJcmFuZ2UtPm1heF9xdWFsLmxldmVsID0gMDsgLyogZEIgKi8KKwlyYW5nZS0+bWF4X3F1YWwubm9pc2UgPSAwOyAvKiBkQiAqLworCisJLyogV2hhdCB3b3VsZCBiZSBzdWl0YWJsZSB2YWx1ZXMgZm9yICJhdmVyYWdlL3R5cGljYWwiIHF1YWw/ICovCisJcmFuZ2UtPmF2Z19xdWFsLnF1YWwgPSAyMDsKKwlyYW5nZS0+YXZnX3F1YWwubGV2ZWwgPSAtNjA7CisJcmFuZ2UtPmF2Z19xdWFsLm5vaXNlID0gLTk1OworCXJhbmdlLT5zZW5zaXRpdml0eSA9IDM7CisKKwlyYW5nZS0+bWF4X2VuY29kaW5nX3Rva2VucyA9IE5SX1dFUF9LRVlTOworCXJhbmdlLT5udW1fZW5jb2Rpbmdfc2l6ZXMgPSAyOworCXJhbmdlLT5lbmNvZGluZ19zaXplWzBdID0gNTsKKwlyYW5nZS0+ZW5jb2Rpbmdfc2l6ZVsxXSA9IDEzOworCisJcmFuZ2UtPm1pbl9ydHMgPSAwOworCXJhbmdlLT5tYXhfcnRzID0gMjM0NzsKKwlyYW5nZS0+bWluX2ZyYWcgPSAyNTY7CisJcmFuZ2UtPm1heF9mcmFnID0gMjM0NjsKKworI2lmIFdJUkVMRVNTX0VYVCA+IDE3CisJLyogSVdfRU5DX0NBUEFfKiBiaXQgZmllbGQgKi8KKwlyYW5nZS0+ZW5jX2NhcGEgPSBJV19FTkNfQ0FQQV9XUEEgfCBJV19FTkNfQ0FQQV9XUEEyIHwKKwkJCQkJSVdfRU5DX0NBUEFfQ0lQSEVSX1RLSVAgfCBJV19FTkNfQ0FQQV9DSVBIRVJfQ0NNUDsKKyNlbmRpZgorCisJcmV0dXJuIDA7Cit9CisKK2ludCBydF9pb2N0bF9zaXdhcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgICAgICBzdHJ1Y3Qgc29ja2FkZHIgKmFwX2FkZHIsIGNoYXIgKmV4dHJhKQoreworCVBSVE1QX0FEQVBURVIgcEFkYXB0ZXIgPSAoUFJUTVBfQURBUFRFUikgZGV2LT5wcml2OworICAgIE5ESVNfODAyXzExX01BQ19BRERSRVNTIEJzc2lkOworCisJLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KKwlpZighUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCisJeworICAgICAgIAlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisgICAgICAgCXJldHVybiAtRU5FVERPV047CisgICAgfQorCisJaWYgKHBBZGFwdGVyLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSAhPSBDTlRMX0lETEUpCisgICAgeworICAgICAgICBSVDI4WFhfTUxNRV9SRVNFVF9TVEFURV9NQUNISU5FKHBBZGFwdGVyKTsKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIE1MTUUgYnVzeSwgcmVzZXQgTUxNRSBzdGF0ZSBtYWNoaW5lICEhIVxuIikpOworICAgIH0KKworICAgIC8vIHRlbGwgQ05UTCBzdGF0ZSBtYWNoaW5lIHRvIGNhbGwgTmRpc01TZXRJbmZvcm1hdGlvbkNvbXBsZXRlKCkgYWZ0ZXIgY29tcGxldGluZworICAgIC8vIHRoaXMgcmVxdWVzdCwgYmVjYXVzZSB0aGlzIHJlcXVlc3QgaXMgaW5pdGlhdGVkIGJ5IE5ESVMuCisgICAgcEFkYXB0ZXItPk1sbWVBdXguQ3VyclJlcUlzRnJvbU5kaXMgPSBGQUxTRTsKKwkvLyBQcmV2ZW50IHRvIGNvbm5lY3QgQVAgYWdhaW4gaW4gU1RBTWxtZVBlcmlvZGljRXhlYworCXBBZGFwdGVyLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuPSAzMjsKKworICAgIG1lbXNldChCc3NpZCwgMCwgTUFDX0FERFJfTEVOKTsKKyAgICBtZW1jcHkoQnNzaWQsIGFwX2FkZHItPnNhX2RhdGEsIE1BQ19BRERSX0xFTik7CisgICAgTWxtZUVucXVldWUocEFkYXB0ZXIsCisgICAgICAgICAgICAgICAgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsCisgICAgICAgICAgICAgICAgT0lEXzgwMl8xMV9CU1NJRCwKKyAgICAgICAgICAgICAgICBzaXplb2YoTkRJU184MDJfMTFfTUFDX0FERFJFU1MpLAorICAgICAgICAgICAgICAgIChWT0lEICopJkJzc2lkKTsKKworICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklPQ1RMOjpTSU9DU0lXQVAgJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisgICAgICAgIEJzc2lkWzBdLCBCc3NpZFsxXSwgQnNzaWRbMl0sIEJzc2lkWzNdLCBCc3NpZFs0XSwgQnNzaWRbNV0pKTsKKworCXJldHVybiAwOworfQorCitpbnQgcnRfaW9jdGxfZ2l3YXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJICAgICAgc3RydWN0IHNvY2thZGRyICphcF9hZGRyLCBjaGFyICpleHRyYSkKK3sKKwlQUlRNUF9BREFQVEVSIAlwQWRhcHRlciA9IE5VTEw7CisJVklSVFVBTF9BREFQVEVSICpwVmlydHVhbEFkID0gTlVMTDsKKworCWlmIChkZXYtPnByaXZfZmxhZ3MgPT0gSU5UX01BSU4pCisJeworCQlwQWRhcHRlciA9IGRldi0+cHJpdjsKKwl9CisJZWxzZQorCXsKKwkJcFZpcnR1YWxBZCA9IGRldi0+cHJpdjsKKwkJaWYgKHBWaXJ0dWFsQWQgJiYgcFZpcnR1YWxBZC0+UnRtcERldikKKwkJCXBBZGFwdGVyID0gcFZpcnR1YWxBZC0+UnRtcERldi0+cHJpdjsKKwl9CisKKwlpZiAocEFkYXB0ZXIgPT0gTlVMTCkKKwl7CisJCS8qIGlmIDFzdCBvcGVuIGZhaWwsIHBBZCB3aWxsIGJlIGZyZWU7CisJCSAgIFNvIHRoZSBuZXRfZGV2LT5wcml2IHdpbGwgYmUgTlVMTCBpbiAycmQgb3BlbiAqLworCQlyZXR1cm4gLUVORVRET1dOOworCX0KKworCWlmIChJTkZSQV9PTihwQWRhcHRlcikgfHwgQURIT0NfT04ocEFkYXB0ZXIpKQorCXsKKwkJYXBfYWRkci0+c2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOworCQltZW1jcHkoYXBfYWRkci0+c2FfZGF0YSwgJnBBZGFwdGVyLT5Db21tb25DZmcuQnNzaWQsIEVUSF9BTEVOKTsKKwl9CisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgIC8vIEFkZCBmb3IgUlQyODcwCisgICAgZWxzZSBpZiAocEFkYXB0ZXItPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgIT0gV1BBX1NVUFBMSUNBTlRfRElTQUJMRSkKKyAgICB7CisgICAgICAgIGFwX2FkZHItPnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKKyAgICAgICAgbWVtY3B5KGFwX2FkZHItPnNhX2RhdGEsICZwQWRhcHRlci0+TWxtZUF1eC5Cc3NpZCwgRVRIX0FMRU4pOworICAgIH0KKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisJZWxzZQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU9DVEw6OlNJT0NHSVdBUCg9RU1QVFkpXG4iKSk7CisJCXJldHVybiAtRU5PVENPTk47CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBVbml0cyBhcmUgaW4gZGIgYWJvdmUgdGhlIG5vaXNlIGZsb29yLiBUaGF0IG1lYW5zIHRoZQorICogcnNzaSB2YWx1ZXMgcmVwb3J0ZWQgaW4gdGhlIHR4L3J4IGRlc2NyaXB0b3JzIGluIHRoZQorICogZHJpdmVyIGFyZSB0aGUgU05SIGV4cHJlc3NlZCBpbiBkYi4KKyAqCisgKiBJZiB5b3UgYXNzdW1lIHRoYXQgdGhlIG5vaXNlIGZsb29yIGlzIC05NSwgd2hpY2ggaXMgYW4KKyAqIGV4Y2VsbGVudCBhc3N1bXB0aW9uIDk5LjUgJSBvZiB0aGUgdGltZSwgdGhlbiB5b3UgY2FuCisgKiBkZXJpdmUgdGhlIGFic29sdXRlIHNpZ25hbCBsZXZlbCAoaS5lLiAtOTUgKyByc3NpKS4KKyAqIFRoZXJlIGFyZSBzb21lIG90aGVyIHNsaWdodCBmYWN0b3JzIHRvIHRha2UgaW50byBhY2NvdW50CisgKiBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgcnNzaSBtZWFzdXJlbWVudCBpcyBmcm9tIDExYiwKKyAqIDExZywgb3IgMTFhLiAgIFRoZXNlIGRpZmZlcmVuY2VzIGFyZSBhdCBtb3N0IDJkYiBhbmQKKyAqIGNhbiBiZSBkb2N1bWVudGVkLgorICoKKyAqIE5COiB2YXJpb3VzIGNhbGN1bGF0aW9ucyBhcmUgYmFzZWQgb24gdGhlIG9yaW5vY28vd2F2ZWxhbgorICogICAgIGRyaXZlcnMgZm9yIGNvbXBhdGliaWxpdHkKKyAqLworc3RhdGljIHZvaWQgc2V0X3F1YWxpdHkoUFJUTVBfQURBUFRFUiBwQWRhcHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpd19xdWFsaXR5ICppcSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25lZCBjaGFyIHJzc2kpCit7CisJX191OCBDaGFubmVsUXVhbGl0eTsKKworCS8vIE5vcm1hbGl6ZSBSc3NpCisJaWYgKHJzc2kgPj0gLTUwKQorCQlDaGFubmVsUXVhbGl0eSA9IDEwMDsKKwllbHNlIGlmIChyc3NpID49IC04MCkgLy8gYmV0d2VlbiAtNTAgfiAtODBkYm0KKwkJQ2hhbm5lbFF1YWxpdHkgPSAoX191OCkoMjQgKyAoKHJzc2kgKyA4MCkgKiAyNikvMTApOworCWVsc2UgaWYgKHJzc2kgPj0gLTkwKSAgIC8vIGJldHdlZW4gLTgwIH4gLTkwZGJtCisgICAgICAgIENoYW5uZWxRdWFsaXR5ID0gKF9fdTgpKChyc3NpICsgOTApICogMjYpLzEwOworCWVsc2UKKwkJQ2hhbm5lbFF1YWxpdHkgPSAwOworCisgICAgaXEtPnF1YWwgPSAoX191OClDaGFubmVsUXVhbGl0eTsKKworICAgIGlxLT5sZXZlbCA9IChfX3U4KShyc3NpKTsKKyAgICBpcS0+bm9pc2UgPSAocEFkYXB0ZXItPkJicFdyaXRlTGF0Y2hbNjZdID4gcEFkYXB0ZXItPkJicFR1bmluZy5GYWxzZUNjYVVwcGVyVGhyZXNob2xkKSA/ICgoX191OClwQWRhcHRlci0+QmJwVHVuaW5nLkZhbHNlQ2NhVXBwZXJUaHJlc2hvbGQpIDogKChfX3U4KSBwQWRhcHRlci0+QmJwV3JpdGVMYXRjaFs2Nl0pOyAJLy8gbm9pc2UgbGV2ZWwgKGRCbSkKKyAgICBpcS0+bm9pc2UgKz0gMjU2IC0gMTQzOworICAgIGlxLT51cGRhdGVkID0gcEFkYXB0ZXItPml3X3N0YXRzLnF1YWwudXBkYXRlZDsKK30KKworaW50IHJ0X2lvY3RsX2l3YXBsaXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJc3RydWN0IGl3X3BvaW50ICpkYXRhLCBjaGFyICpleHRyYSkKK3sKKyAJUFJUTVBfQURBUFRFUiBwQWRhcHRlciA9IChQUlRNUF9BREFQVEVSKSBkZXYtPnByaXY7CisKKwlzdHJ1Y3Qgc29ja2FkZHIgYWRkcltJV19NQVhfQVBdOworCXN0cnVjdCBpd19xdWFsaXR5IHF1YWxbSVdfTUFYX0FQXTsKKwlpbnQgaTsKKworICAgCS8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCisgICAgaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQorICAgIHsKKyAgICAgICAJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOworCQlkYXRhLT5sZW5ndGggPSAwOworCQlyZXR1cm4gMDsKKyAgICAgICAgLy9yZXR1cm4gLUVORVRET1dOOworCX0KKworCWZvciAoaSA9IDA7IGkgPElXX01BWF9BUCA7IGkrKykKKwl7CisJCWlmIChpID49ICBwQWRhcHRlci0+U2NhblRhYi5Cc3NOcikKKwkJCWJyZWFrOworCQlhZGRyW2ldLnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKKwkJCW1lbWNweShhZGRyW2ldLnNhX2RhdGEsICZwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Cc3NpZCwgTUFDX0FERFJfTEVOKTsKKwkJc2V0X3F1YWxpdHkocEFkYXB0ZXIsICZxdWFsW2ldLCBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Sc3NpKTsKKwl9CisJZGF0YS0+bGVuZ3RoID0gaTsKKwltZW1jcHkoZXh0cmEsICZhZGRyLCBpKnNpemVvZihhZGRyWzBdKSk7CisJZGF0YS0+ZmxhZ3MgPSAxOwkJLyogc2lnbmFsIHF1YWxpdHkgcHJlc2VudCAoc29ydCBvZikgKi8KKwltZW1jcHkoZXh0cmEgKyBpKnNpemVvZihhZGRyWzBdKSwgJnF1YWwsIGkqc2l6ZW9mKHF1YWxbaV0pKTsKKworCXJldHVybiAwOworfQorCisjaWZkZWYgU0lPQ0dJV1NDQU4KK2ludCBydF9pb2N0bF9zaXdzY2FuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJc3RydWN0IGl3X3BvaW50ICpkYXRhLCBjaGFyICpleHRyYSkKK3sKKwlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gKFBSVE1QX0FEQVBURVIpIGRldi0+cHJpdjsKKworCVVMT05HCQkJCQkJCQlOb3c7CisJaW50IFN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisKKwkvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgorCWlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKwkJcmV0dXJuIC1FTkVURE9XTjsKKwl9CisKKwlpZiAoTU9OSVRPUl9PTihwQWRhcHRlcikpCisgICAgeworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgRHJpdmVyIGlzIGluIE1vbml0b3IgTW9kZSBub3cgISEhXG4iKSk7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworCisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorCWlmIChwQWRhcHRlci0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCA9PSBXUEFfU1VQUExJQ0FOVF9FTkFCTEUpCisJeworCQlwQWRhcHRlci0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRTY2FuQ291bnQrKzsKKwl9CisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCisgICAgcEFkYXB0ZXItPlN0YUNmZy5iU2NhblJlcUlzRnJvbVdlYlVJID0gVFJVRTsKKwlpZiAoUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpKQorCQlyZXR1cm4gMDsKKwlkb3sKKwkJTm93ID0gamlmZmllczsKKworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKwkJaWYgKChwQWRhcHRlci0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCA9PSBXUEFfU1VQUExJQ0FOVF9FTkFCTEUpICYmCisJCQkocEFkYXB0ZXItPlN0YUNmZy5XcGFTdXBwbGljYW50U2NhbkNvdW50ID4gMykpCisJCXsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISBXcGFTdXBwbGljYW50U2NhbkNvdW50ID4gM1xuIikpOworCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKwkJCWJyZWFrOworCQl9CisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCisJCWlmICgoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZGFwdGVyLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCkpICYmCisJCQkoKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKSB8fAorCQkJKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKSkgJiYKKwkJCShwQWRhcHRlci0+U3RhQ2ZnLlBvcnRTZWN1cmVkID09IFdQQV84MDJfMVhfUE9SVF9OT1RfU0VDVVJFRCkpCisJCXsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISBMaW5rIFVQLCBQb3J0IE5vdCBTZWN1cmVkISBpZ25vcmUgdGhpcyBzZXQ6Ok9JRF84MDJfMTFfQlNTSURfTElTVF9TQ0FOXG4iKSk7CisJCQlTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAocEFkYXB0ZXItPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlICE9IENOVExfSURMRSkKKwkJeworCQkJUlQyOFhYX01MTUVfUkVTRVRfU1RBVEVfTUFDSElORShwQWRhcHRlcik7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgTUxNRSBidXN5LCByZXNldCBNTE1FIHN0YXRlIG1hY2hpbmUgISEhXG4iKSk7CisJCX0KKworCQkvLyB0ZWxsIENOVEwgc3RhdGUgbWFjaGluZSB0byBjYWxsIE5kaXNNU2V0SW5mb3JtYXRpb25Db21wbGV0ZSgpIGFmdGVyIGNvbXBsZXRpbmcKKwkJLy8gdGhpcyByZXF1ZXN0LCBiZWNhdXNlIHRoaXMgcmVxdWVzdCBpcyBpbml0aWF0ZWQgYnkgTkRJUy4KKwkJcEFkYXB0ZXItPk1sbWVBdXguQ3VyclJlcUlzRnJvbU5kaXMgPSBGQUxTRTsKKwkJLy8gUmVzZXQgYWxsb3dlZCBzY2FuIHJldHJpZXMKKwkJcEFkYXB0ZXItPlN0YUNmZy5TY2FuQ250ID0gMDsKKwkJcEFkYXB0ZXItPlN0YUNmZy5MYXN0U2NhblRpbWUgPSBOb3c7CisKKwkJTWxtZUVucXVldWUocEFkYXB0ZXIsCisJCQlNTE1FX0NOVExfU1RBVEVfTUFDSElORSwKKwkJCU9JRF84MDJfMTFfQlNTSURfTElTVF9TQ0FOLAorCQkJMCwKKwkJCU5VTEwpOworCisJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisJCVJUMjhYWF9NTE1FX0hBTkRMRVIocEFkYXB0ZXIpOworCX13aGlsZSgwKTsKKwlyZXR1cm4gMDsKK30KKworaW50IHJ0X2lvY3RsX2dpd3NjYW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQlzdHJ1Y3QgaXdfcG9pbnQgKmRhdGEsIGNoYXIgKmV4dHJhKQoreworCisJUFJUTVBfQURBUFRFUiBwQWRhcHRlciA9IChQUlRNUF9BREFQVEVSKSBkZXYtPnByaXY7CisJaW50IGk9MDsKKwljaGFyICpjdXJyZW50X2V2ID0gZXh0cmEsICpwcmV2aW91c19ldiA9IGV4dHJhOworCWNoYXIgKmVuZF9idWY7CisJY2hhciAqY3VycmVudF92YWwsIGN1c3RvbVtNQVhfQ1VTVE9NX0xFTl0gPSB7MH07CisjaWZuZGVmIElXRVZHRU5JRQorCWNoYXIgaWR4OworI2VuZGlmIC8vIElXRVZHRU5JRSAvLworCXN0cnVjdCBpd19ldmVudCBpd2U7CisKKwlpZiAoUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpKQorICAgIHsKKwkJLyoKKwkJICogU3RpbGwgc2Nhbm5pbmcsIGluZGljYXRlIHRoZSBjYWxsZXIgc2hvdWxkIHRyeSBhZ2Fpbi4KKwkJICovCisJCXJldHVybiAtRUFHQUlOOworCX0KKworCisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorCWlmIChwQWRhcHRlci0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCA9PSBXUEFfU1VQUExJQ0FOVF9FTkFCTEUpCisJeworCQlwQWRhcHRlci0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRTY2FuQ291bnQgPSAwOworCX0KKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisKKwlpZiAocEFkYXB0ZXItPlNjYW5UYWIuQnNzTnIgPT0gMCkKKwl7CisJCWRhdGEtPmxlbmd0aCA9IDA7CisJCXJldHVybiAwOworCX0KKworI2lmIFdJUkVMRVNTX0VYVCA+PSAxNworICAgIGlmIChkYXRhLT5sZW5ndGggPiAwKQorICAgICAgICBlbmRfYnVmID0gZXh0cmEgKyBkYXRhLT5sZW5ndGg7CisgICAgZWxzZQorICAgICAgICBlbmRfYnVmID0gZXh0cmEgKyBJV19TQ0FOX01BWF9EQVRBOworI2Vsc2UKKyAgICBlbmRfYnVmID0gZXh0cmEgKyBJV19TQ0FOX01BWF9EQVRBOworI2VuZGlmCisKKwlmb3IgKGkgPSAwOyBpIDwgcEFkYXB0ZXItPlNjYW5UYWIuQnNzTnI7IGkrKykKKwl7CisJCWlmIChjdXJyZW50X2V2ID49IGVuZF9idWYpCisgICAgICAgIHsKKyNpZiBXSVJFTEVTU19FWFQgPj0gMTcKKyAgICAgICAgICAgIHJldHVybiAtRTJCSUc7CisjZWxzZQorCQkJYnJlYWs7CisjZW5kaWYKKyAgICAgICAgfQorCisJCS8vTUFDIGFkZHJlc3MKKwkJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCQltZW1zZXQoJml3ZSwgMCwgc2l6ZW9mKGl3ZSkpOworCQlpd2UuY21kID0gU0lPQ0dJV0FQOworCQlpd2UudS5hcF9hZGRyLnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKKwkJCQltZW1jcHkoaXdlLnUuYXBfYWRkci5zYV9kYXRhLCAmcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uQnNzaWQsIEVUSF9BTEVOKTsKKworICAgICAgICBwcmV2aW91c19ldiA9IGN1cnJlbnRfZXY7CisJCWN1cnJlbnRfZXYgPSBJV0VfU1RSRUFNX0FERF9FVkVOVChpbmZvLCBjdXJyZW50X2V2LGVuZF9idWYsICZpd2UsIElXX0VWX0FERFJfTEVOKTsKKyAgICAgICAgaWYgKGN1cnJlbnRfZXYgPT0gcHJldmlvdXNfZXYpCisjaWYgV0lSRUxFU1NfRVhUID49IDE3CisgICAgICAgICAgICByZXR1cm4gLUUyQklHOworI2Vsc2UKKwkJCWJyZWFrOworI2VuZGlmCisKKwkJLy9FU1NJRAorCQkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJCW1lbXNldCgmaXdlLCAwLCBzaXplb2YoaXdlKSk7CisJCWl3ZS5jbWQgPSBTSU9DR0lXRVNTSUQ7CisJCWl3ZS51LmRhdGEubGVuZ3RoID0gcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uU3NpZExlbjsKKwkJaXdlLnUuZGF0YS5mbGFncyA9IDE7CisKKyAgICAgICAgcHJldmlvdXNfZXYgPSBjdXJyZW50X2V2OworCQljdXJyZW50X2V2ID0gSVdFX1NUUkVBTV9BRERfUE9JTlQoaW5mbywgY3VycmVudF9ldixlbmRfYnVmLCAmaXdlLCBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Tc2lkKTsKKyAgICAgICAgaWYgKGN1cnJlbnRfZXYgPT0gcHJldmlvdXNfZXYpCisjaWYgV0lSRUxFU1NfRVhUID49IDE3CisgICAgICAgICAgICByZXR1cm4gLUUyQklHOworI2Vsc2UKKwkJCWJyZWFrOworI2VuZGlmCisKKwkJLy9OZXR3b3JrIFR5cGUKKwkJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCQltZW1zZXQoJml3ZSwgMCwgc2l6ZW9mKGl3ZSkpOworCQlpd2UuY21kID0gU0lPQ0dJV01PREU7CisJCWlmIChwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Cc3NUeXBlID09IE5kaXM4MDJfMTFJQlNTKQorCQl7CisJCQlpd2UudS5tb2RlID0gSVdfTU9ERV9BREhPQzsKKwkJfQorCQllbHNlIGlmIChwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Cc3NUeXBlID09IE5kaXM4MDJfMTFJbmZyYXN0cnVjdHVyZSkKKwkJeworCQkJaXdlLnUubW9kZSA9IElXX01PREVfSU5GUkE7CisJCX0KKwkJZWxzZQorCQl7CisJCQlpd2UudS5tb2RlID0gSVdfTU9ERV9BVVRPOworCQl9CisJCWl3ZS5sZW4gPSBJV19FVl9VSU5UX0xFTjsKKworICAgICAgICBwcmV2aW91c19ldiA9IGN1cnJlbnRfZXY7CisJCWN1cnJlbnRfZXYgPSBJV0VfU1RSRUFNX0FERF9FVkVOVChpbmZvLCBjdXJyZW50X2V2LCBlbmRfYnVmLCAmaXdlLCAgSVdfRVZfVUlOVF9MRU4pOworICAgICAgICBpZiAoY3VycmVudF9ldiA9PSBwcmV2aW91c19ldikKKyNpZiBXSVJFTEVTU19FWFQgPj0gMTcKKyAgICAgICAgICAgIHJldHVybiAtRTJCSUc7CisjZWxzZQorCQkJYnJlYWs7CisjZW5kaWYKKworCQkvL0NoYW5uZWwgYW5kIEZyZXF1ZW5jeQorCQkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJCW1lbXNldCgmaXdlLCAwLCBzaXplb2YoaXdlKSk7CisJCWl3ZS5jbWQgPSBTSU9DR0lXRlJFUTsKKwkJaWYgKElORlJBX09OKHBBZGFwdGVyKSB8fCBBREhPQ19PTihwQWRhcHRlcikpCisJCQlpd2UudS5mcmVxLm0gPSBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5DaGFubmVsOworCQllbHNlCisJCQlpd2UudS5mcmVxLm0gPSBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5DaGFubmVsOworCQlpd2UudS5mcmVxLmUgPSAwOworCQlpd2UudS5mcmVxLmkgPSAwOworCisJCXByZXZpb3VzX2V2ID0gY3VycmVudF9ldjsKKwkJY3VycmVudF9ldiA9IElXRV9TVFJFQU1fQUREX0VWRU5UKGluZm8sIGN1cnJlbnRfZXYsZW5kX2J1ZiwgJml3ZSwgSVdfRVZfRlJFUV9MRU4pOworICAgICAgICBpZiAoY3VycmVudF9ldiA9PSBwcmV2aW91c19ldikKKyNpZiBXSVJFTEVTU19FWFQgPj0gMTcKKyAgICAgICAgICAgIHJldHVybiAtRTJCSUc7CisjZWxzZQorCQkJYnJlYWs7CisjZW5kaWYKKworICAgICAgICAvL0FkZCBxdWFsaXR5IHN0YXRpc3RpY3MKKyAgICAgICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICBtZW1zZXQoJml3ZSwgMCwgc2l6ZW9mKGl3ZSkpOworICAgIAlpd2UuY21kID0gSVdFVlFVQUw7CisgICAgCWl3ZS51LnF1YWwubGV2ZWwgPSAwOworICAgIAlpd2UudS5xdWFsLm5vaXNlID0gMDsKKyAgICAgICAgc2V0X3F1YWxpdHkocEFkYXB0ZXIsICZpd2UudS5xdWFsLCBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Sc3NpKTsKKyAgICAJY3VycmVudF9ldiA9IElXRV9TVFJFQU1fQUREX0VWRU5UKGluZm8sIGN1cnJlbnRfZXYsIGVuZF9idWYsICZpd2UsIElXX0VWX1FVQUxfTEVOKTsKKyAgICAgICAgaWYgKGN1cnJlbnRfZXYgPT0gcHJldmlvdXNfZXYpCisjaWYgV0lSRUxFU1NfRVhUID49IDE3CisgICAgICAgICAgICByZXR1cm4gLUUyQklHOworI2Vsc2UKKwkJCWJyZWFrOworI2VuZGlmCisKKwkJLy9FbmN5cHRpb24ga2V5CisJCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkJbWVtc2V0KCZpd2UsIDAsIHNpemVvZihpd2UpKTsKKwkJaXdlLmNtZCA9IFNJT0NHSVdFTkNPREU7CisJCWlmIChDQVBfSVNfUFJJVkFDWV9PTiAocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uQ2FwYWJpbGl0eUluZm8gKSkKKwkJCWl3ZS51LmRhdGEuZmxhZ3MgPUlXX0VOQ09ERV9FTkFCTEVEIHwgSVdfRU5DT0RFX05PS0VZOworCQllbHNlCisJCQlpd2UudS5kYXRhLmZsYWdzID0gSVdfRU5DT0RFX0RJU0FCTEVEOworCisgICAgICAgIHByZXZpb3VzX2V2ID0gY3VycmVudF9ldjsKKyAgICAgICAgY3VycmVudF9ldiA9IElXRV9TVFJFQU1fQUREX1BPSU5UKGluZm8sIGN1cnJlbnRfZXYsIGVuZF9idWYsJml3ZSwgKGNoYXIgKilwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWyhpd2UudS5kYXRhLmZsYWdzICYgSVdfRU5DT0RFX0lOREVYKS0xXS5LZXkpOworICAgICAgICBpZiAoY3VycmVudF9ldiA9PSBwcmV2aW91c19ldikKKyNpZiBXSVJFTEVTU19FWFQgPj0gMTcKKyAgICAgICAgICAgIHJldHVybiAtRTJCSUc7CisjZWxzZQorCQkJYnJlYWs7CisjZW5kaWYKKworCQkvL0JpdCBSYXRlCisJCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkJaWYgKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlN1cFJhdGVMZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIFVDSEFSIHRtcFJhdGUgPSBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5TdXBSYXRlW3BBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlN1cFJhdGVMZW4tMV07CisJCQltZW1zZXQoJml3ZSwgMCwgc2l6ZW9mKGl3ZSkpOworCQkJaXdlLmNtZCA9IFNJT0NHSVdSQVRFOworICAgIAkJY3VycmVudF92YWwgPSBjdXJyZW50X2V2ICsgSVdfRVZfTENQX0xFTjsKKyAgICAgICAgICAgIGlmICh0bXBSYXRlID09IDB4ODIpCisgICAgICAgICAgICAgICAgaXdlLnUuYml0cmF0ZS52YWx1ZSA9ICAxICogMTAwMDAwMDsKKyAgICAgICAgICAgIGVsc2UgaWYgKHRtcFJhdGUgPT0gMHg4NCkKKyAgICAgICAgICAgICAgICBpd2UudS5iaXRyYXRlLnZhbHVlID0gIDIgKiAxMDAwMDAwOworICAgICAgICAgICAgZWxzZSBpZiAodG1wUmF0ZSA9PSAweDhCKQorICAgICAgICAgICAgICAgIGl3ZS51LmJpdHJhdGUudmFsdWUgPSAgNS41ICogMTAwMDAwMDsKKyAgICAgICAgICAgIGVsc2UgaWYgKHRtcFJhdGUgPT0gMHg5NikKKyAgICAgICAgICAgICAgICBpd2UudS5iaXRyYXRlLnZhbHVlID0gIDExICogMTAwMDAwMDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAJCSAgICBpd2UudS5iaXRyYXRlLnZhbHVlID0gICh0bXBSYXRlLzIpICogMTAwMDAwMDsKKworCQkJaXdlLnUuYml0cmF0ZS5kaXNhYmxlZCA9IDA7CisJCQljdXJyZW50X3ZhbCA9IElXRV9TVFJFQU1fQUREX1ZBTFVFKGluZm8sIGN1cnJlbnRfZXYsCisJCQkJY3VycmVudF92YWwsIGVuZF9idWYsICZpd2UsCisgICAgCQkJSVdfRVZfUEFSQU1fTEVOKTsKKworICAgICAgICAJaWYoKGN1cnJlbnRfdmFsLWN1cnJlbnRfZXYpPklXX0VWX0xDUF9MRU4pCisgICAgICAgICAgICAJY3VycmVudF9ldiA9IGN1cnJlbnRfdmFsOworICAgICAgICAJZWxzZQorI2lmIFdJUkVMRVNTX0VYVCA+PSAxNworICAgICAgICAgICAgICAgIHJldHVybiAtRTJCSUc7CisjZWxzZQorCQkJICAgIGJyZWFrOworI2VuZGlmCisgICAgICAgIH0KKworI2lmZGVmIElXRVZHRU5JRQorCQkvL1dQQSBJRQorCQlpZiAocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uV3BhSUUuSUVMZW4gPiAwKQorCQl7CisJCQltZW1zZXQoJml3ZSwgMCwgc2l6ZW9mKGl3ZSkpOworCQkJbWVtc2V0KCZjdXN0b21bMF0sIDAsIE1BWF9DVVNUT01fTEVOKTsKKwkJCW1lbWNweShjdXN0b20sICYocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uV3BhSUUuSUVbMF0pLAorCQkJCQkJICAgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uV3BhSUUuSUVMZW4pOworCQkJaXdlLmNtZCA9IElXRVZHRU5JRTsKKwkJCWl3ZS51LmRhdGEubGVuZ3RoID0gcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uV3BhSUUuSUVMZW47CisJCQljdXJyZW50X2V2ID0gSVdFX1NUUkVBTV9BRERfUE9JTlQoaW5mbywgY3VycmVudF9ldiwgZW5kX2J1ZiwgJml3ZSwgY3VzdG9tKTsKKwkJCWlmIChjdXJyZW50X2V2ID09IHByZXZpb3VzX2V2KQorI2lmIFdJUkVMRVNTX0VYVCA+PSAxNworICAgICAgICAgICAgICAgIHJldHVybiAtRTJCSUc7CisjZWxzZQorCQkJICAgIGJyZWFrOworI2VuZGlmCisJCX0KKworCQkvL1dQQTIgSUUKKyAgICAgICAgaWYgKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlJzbklFLklFTGVuID4gMCkKKyAgICAgICAgeworICAgICAgICAJbWVtc2V0KCZpd2UsIDAsIHNpemVvZihpd2UpKTsKKwkJCW1lbXNldCgmY3VzdG9tWzBdLCAwLCBNQVhfQ1VTVE9NX0xFTik7CisJCQltZW1jcHkoY3VzdG9tLCAmKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlJzbklFLklFWzBdKSwKKwkJCQkJCSAgIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlJzbklFLklFTGVuKTsKKwkJCWl3ZS5jbWQgPSBJV0VWR0VOSUU7CisJCQlpd2UudS5kYXRhLmxlbmd0aCA9IHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlJzbklFLklFTGVuOworCQkJY3VycmVudF9ldiA9IElXRV9TVFJFQU1fQUREX1BPSU5UKGluZm8sIGN1cnJlbnRfZXYsIGVuZF9idWYsICZpd2UsIGN1c3RvbSk7CisJCQlpZiAoY3VycmVudF9ldiA9PSBwcmV2aW91c19ldikKKyNpZiBXSVJFTEVTU19FWFQgPj0gMTcKKyAgICAgICAgICAgICAgICByZXR1cm4gLUUyQklHOworI2Vsc2UKKwkJCSAgICBicmVhazsKKyNlbmRpZgorICAgICAgICB9CisjZWxzZQorICAgICAgICAvL1dQQSBJRQorCQkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgIGlmIChwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5XcGFJRS5JRUxlbiA+IDApCisgICAgICAgIHsKKyAgICAJCU5kaXNaZXJvTWVtb3J5KCZpd2UsIHNpemVvZihpd2UpKTsKKwkJCW1lbXNldCgmY3VzdG9tWzBdLCAwLCBNQVhfQ1VTVE9NX0xFTik7CisgICAgCQlpd2UuY21kID0gSVdFVkNVU1RPTTsKKyAgICAgICAgICAgIGl3ZS51LmRhdGEubGVuZ3RoID0gKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLldwYUlFLklFTGVuICogMikgKyA3OworICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkoY3VzdG9tLCAid3BhX2llPSIsIDcpOworICAgICAgICAgICAgZm9yIChpZHggPSAwOyBpZHggPCBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5XcGFJRS5JRUxlbjsgaWR4KyspCisgICAgICAgICAgICAgICAgc3ByaW50ZihjdXN0b20sICIlcyUwMngiLCBjdXN0b20sIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLldwYUlFLklFW2lkeF0pOworICAgICAgICAgICAgcHJldmlvdXNfZXYgPSBjdXJyZW50X2V2OworICAgIAkJY3VycmVudF9ldiA9IElXRV9TVFJFQU1fQUREX1BPSU5UKGluZm8sIGN1cnJlbnRfZXYsIGVuZF9idWYsICZpd2UsICBjdXN0b20pOworICAgICAgICAgICAgaWYgKGN1cnJlbnRfZXYgPT0gcHJldmlvdXNfZXYpCisjaWYgV0lSRUxFU1NfRVhUID49IDE3CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FMkJJRzsKKyNlbHNlCisJCQkgICAgYnJlYWs7CisjZW5kaWYKKyAgICAgICAgfQorCisgICAgICAgIC8vV1BBMiBJRQorICAgICAgICBpZiAocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uUnNuSUUuSUVMZW4gPiAwKQorICAgICAgICB7CisgICAgCQlOZGlzWmVyb01lbW9yeSgmaXdlLCBzaXplb2YoaXdlKSk7CisJCQltZW1zZXQoJmN1c3RvbVswXSwgMCwgTUFYX0NVU1RPTV9MRU4pOworICAgIAkJaXdlLmNtZCA9IElXRVZDVVNUT007CisgICAgICAgICAgICBpd2UudS5kYXRhLmxlbmd0aCA9IChwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Sc25JRS5JRUxlbiAqIDIpICsgNzsKKyAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KGN1c3RvbSwgInJzbl9pZT0iLCA3KTsKKwkJCWZvciAoaWR4ID0gMDsgaWR4IDwgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uUnNuSUUuSUVMZW47IGlkeCsrKQorICAgICAgICAgICAgICAgIHNwcmludGYoY3VzdG9tLCAiJXMlMDJ4IiwgY3VzdG9tLCBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Sc25JRS5JRVtpZHhdKTsKKyAgICAgICAgICAgIHByZXZpb3VzX2V2ID0gY3VycmVudF9ldjsKKyAgICAJCWN1cnJlbnRfZXYgPSBJV0VfU1RSRUFNX0FERF9QT0lOVChpbmZvLCBjdXJyZW50X2V2LCBlbmRfYnVmLCAmaXdlLCAgY3VzdG9tKTsKKyAgICAgICAgICAgIGlmIChjdXJyZW50X2V2ID09IHByZXZpb3VzX2V2KQorI2lmIFdJUkVMRVNTX0VYVCA+PSAxNworICAgICAgICAgICAgICAgIHJldHVybiAtRTJCSUc7CisjZWxzZQorCQkJICAgIGJyZWFrOworI2VuZGlmCisgICAgICAgIH0KKyNlbmRpZiAvLyBJV0VWR0VOSUUgLy8KKwl9CisKKwlkYXRhLT5sZW5ndGggPSBjdXJyZW50X2V2IC0gZXh0cmE7CisgICAgcEFkYXB0ZXItPlN0YUNmZy5iU2NhblJlcUlzRnJvbVdlYlVJID0gRkFMU0U7CisJREJHUFJJTlQoUlRfREVCVUdfRVJST1IgLCgiPT09PnJ0X2lvY3RsX2dpd3NjYW4uICVkKCVkKSBCU1MgcmV0dXJuZWQsIGRhdGEtPmxlbmd0aCA9ICVkXG4iLGkgLCBwQWRhcHRlci0+U2NhblRhYi5Cc3NOciwgZGF0YS0+bGVuZ3RoKSk7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworaW50IHJ0X2lvY3RsX3Npd2Vzc2lkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSBzdHJ1Y3QgaXdfcG9pbnQgKmRhdGEsIGNoYXIgKmVzc2lkKQoreworCVBSVE1QX0FEQVBURVIgcEFkYXB0ZXIgPSAoUFJUTVBfQURBUFRFUikgZGV2LT5wcml2OworCisJLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KKyAgICBpZighUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCisgICAgeworICAgICAgIAlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisgICAgICAgCXJldHVybiAtRU5FVERPV047CisgICAgfQorCisJaWYgKGRhdGEtPmZsYWdzKQorCXsKKwkJUENIQVIJcFNzaWRTdHJpbmcgPSBOVUxMOworCisJCS8vIEluY2x1ZGVzIG51bGwgY2hhcmFjdGVyLgorCQlpZiAoZGF0YS0+bGVuZ3RoID4gKElXX0VTU0lEX01BWF9TSVpFICsgMSkpCisJCQlyZXR1cm4gLUUyQklHOworCisJCXBTc2lkU3RyaW5nID0gKENIQVIgKikga21hbGxvYyhNQVhfTEVOX09GX1NTSUQrMSwgTUVNX0FMTE9DX0ZMQUcpOworCQlpZiAocFNzaWRTdHJpbmcpCisJCXsKKwkJCU5kaXNaZXJvTWVtb3J5KHBTc2lkU3RyaW5nLCBNQVhfTEVOX09GX1NTSUQrMSk7CisJCQlOZGlzTW92ZU1lbW9yeShwU3NpZFN0cmluZywgZXNzaWQsIGRhdGEtPmxlbmd0aCk7CisJCQlpZiAoU2V0X1NTSURfUHJvYyhwQWRhcHRlciwgcFNzaWRTdHJpbmcpID09IEZBTFNFKQorCQkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWVsc2UKKwkJCXJldHVybiAtRU5PTUVNOworCX0KKwllbHNlCisJeworCQkvLyBBTlkgc3NpZAorCQlpZiAoU2V0X1NTSURfUHJvYyhwQWRhcHRlciwgIiIpID09IEZBTFNFKQorCQkJcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCXJldHVybiAwOworfQorCitpbnQgcnRfaW9jdGxfZ2l3ZXNzaWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJIHN0cnVjdCBpd19wb2ludCAqZGF0YSwgY2hhciAqZXNzaWQpCit7CisJUFJUTVBfQURBUFRFUiAJcEFkYXB0ZXIgPSBOVUxMOworCVZJUlRVQUxfQURBUFRFUiAqcFZpcnR1YWxBZCA9IE5VTEw7CisKKwlpZiAoZGV2LT5wcml2X2ZsYWdzID09IElOVF9NQUlOKQorCXsKKwkJcEFkYXB0ZXIgPSBkZXYtPnByaXY7CisJfQorCWVsc2UKKwl7CisJCXBWaXJ0dWFsQWQgPSBkZXYtPnByaXY7CisJCWlmIChwVmlydHVhbEFkICYmIHBWaXJ0dWFsQWQtPlJ0bXBEZXYpCisJCQlwQWRhcHRlciA9IHBWaXJ0dWFsQWQtPlJ0bXBEZXYtPnByaXY7CisJfQorCisJaWYgKHBBZGFwdGVyID09IE5VTEwpCisJeworCQkvKiBpZiAxc3Qgb3BlbiBmYWlsLCBwQWQgd2lsbCBiZSBmcmVlOworCQkgICBTbyB0aGUgbmV0X2Rldi0+cHJpdiB3aWxsIGJlIE5VTEwgaW4gMnJkIG9wZW4gKi8KKwkJcmV0dXJuIC1FTkVURE9XTjsKKwl9CisKKwlkYXRhLT5mbGFncyA9IDE7CisgICAgaWYgKE1PTklUT1JfT04ocEFkYXB0ZXIpKQorICAgIHsKKyAgICAgICAgZGF0YS0+bGVuZ3RoICA9IDA7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkYXB0ZXIsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoIk1lZGlhU3RhdGUgaXMgY29ubmVjdGVkXG4iKSk7CisJCWRhdGEtPmxlbmd0aCA9IHBBZGFwdGVyLT5Db21tb25DZmcuU3NpZExlbjsKKwkJbWVtY3B5KGVzc2lkLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLlNzaWQsIHBBZGFwdGVyLT5Db21tb25DZmcuU3NpZExlbik7CisJfQorI2lmZGVmIFJUMjg3MAorI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyAgICAvLyBBZGQgZm9yIFJUMjg3MAorICAgIGVsc2UgaWYgKHBBZGFwdGVyLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQICE9IFdQQV9TVVBQTElDQU5UX0RJU0FCTEUpCisgICAgeworICAgICAgICBkYXRhLT5sZW5ndGggPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLlNzaWRMZW47CisJCW1lbWNweShlc3NpZCwgcEFkYXB0ZXItPkNvbW1vbkNmZy5Tc2lkLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLlNzaWRMZW4pOworCX0KKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisjZW5kaWYgLy8gUlQyODcwIC8vCisJZWxzZQorCXsvL3RoZSBBTlkgc3NpZCB3YXMgc3BlY2lmaWVkCisJCWRhdGEtPmxlbmd0aCAgPSAwOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSAsKCJNZWRpYVN0YXRlIGlzIG5vdCBjb25uZWN0ZWQsIGVzc1xuIikpOworCX0KKworCXJldHVybiAwOworCit9CisKK2ludCBydF9pb2N0bF9zaXduaWNrbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgc3RydWN0IGl3X3BvaW50ICpkYXRhLCBjaGFyICpuaWNrbmFtZSkKK3sKKwlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gKFBSVE1QX0FEQVBURVIpIGRldi0+cHJpdjsKKworICAgIC8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCisgICAgaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQorICAgIHsKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UgLCgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOworICAgICAgICByZXR1cm4gLUVORVRET1dOOworICAgIH0KKworCWlmIChkYXRhLT5sZW5ndGggPiBJV19FU1NJRF9NQVhfU0laRSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltZW1zZXQocEFkYXB0ZXItPm5pY2tuYW1lLCAwLCBJV19FU1NJRF9NQVhfU0laRSArIDEpOworCW1lbWNweShwQWRhcHRlci0+bmlja25hbWUsIG5pY2tuYW1lLCBkYXRhLT5sZW5ndGgpOworCisKKwlyZXR1cm4gMDsKK30KKworaW50IHJ0X2lvY3RsX2dpd25pY2tuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSBzdHJ1Y3QgaXdfcG9pbnQgKmRhdGEsIGNoYXIgKm5pY2tuYW1lKQoreworCVBSVE1QX0FEQVBURVIgCXBBZGFwdGVyID0gTlVMTDsKKwlWSVJUVUFMX0FEQVBURVIgKnBWaXJ0dWFsQWQgPSBOVUxMOworCisJaWYgKGRldi0+cHJpdl9mbGFncyA9PSBJTlRfTUFJTikKKwl7CisJCXBBZGFwdGVyID0gZGV2LT5wcml2OworCX0KKwllbHNlCisJeworCQlwVmlydHVhbEFkID0gZGV2LT5wcml2OworCQlpZiAocFZpcnR1YWxBZCAmJiBwVmlydHVhbEFkLT5SdG1wRGV2KQorCQkJcEFkYXB0ZXIgPSBwVmlydHVhbEFkLT5SdG1wRGV2LT5wcml2OworCX0KKworCWlmIChwQWRhcHRlciA9PSBOVUxMKQorCXsKKwkJLyogaWYgMXN0IG9wZW4gZmFpbCwgcEFkIHdpbGwgYmUgZnJlZTsKKwkJICAgU28gdGhlIG5ldF9kZXYtPnByaXYgd2lsbCBiZSBOVUxMIGluIDJyZCBvcGVuICovCisJCXJldHVybiAtRU5FVERPV047CisJfQorCisJaWYgKGRhdGEtPmxlbmd0aCA+IHN0cmxlbihwQWRhcHRlci0+bmlja25hbWUpICsgMSkKKwkJZGF0YS0+bGVuZ3RoID0gc3RybGVuKHBBZGFwdGVyLT5uaWNrbmFtZSkgKyAxOworCWlmIChkYXRhLT5sZW5ndGggPiAwKSB7CisJCW1lbWNweShuaWNrbmFtZSwgcEFkYXB0ZXItPm5pY2tuYW1lLCBkYXRhLT5sZW5ndGgtMSk7CisJCW5pY2tuYW1lW2RhdGEtPmxlbmd0aC0xXSA9ICdcMCc7CisJfQorCXJldHVybiAwOworfQorCitpbnQgcnRfaW9jdGxfc2l3cnRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCSAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgICAgICAgc3RydWN0IGl3X3BhcmFtICpydHMsIGNoYXIgKmV4dHJhKQoreworCVBSVE1QX0FEQVBURVIgcEFkYXB0ZXIgPSAoUFJUTVBfQURBUFRFUikgZGV2LT5wcml2OworCXUxNiB2YWw7CisKKyAgICAvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgorICAgIGlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKKyAgICB7CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKyAgICAgICAgcmV0dXJuIC1FTkVURE9XTjsKKyAgICB9CisKKwlpZiAocnRzLT5kaXNhYmxlZCkKKwkJdmFsID0gTUFYX1JUU19USFJFU0hPTEQ7CisJZWxzZSBpZiAocnRzLT52YWx1ZSA8IDAgfHwgcnRzLT52YWx1ZSA+IE1BWF9SVFNfVEhSRVNIT0xEKQorCQlyZXR1cm4gLUVJTlZBTDsKKwllbHNlIGlmIChydHMtPnZhbHVlID09IDApCisJICAgIHZhbCA9IE1BWF9SVFNfVEhSRVNIT0xEOworCWVsc2UKKwkJdmFsID0gcnRzLT52YWx1ZTsKKworCWlmICh2YWwgIT0gcEFkYXB0ZXItPkNvbW1vbkNmZy5SdHNUaHJlc2hvbGQpCisJCXBBZGFwdGVyLT5Db21tb25DZmcuUnRzVGhyZXNob2xkID0gdmFsOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBydF9pb2N0bF9naXdydHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSAgICAgICBzdHJ1Y3QgaXdfcGFyYW0gKnJ0cywgY2hhciAqZXh0cmEpCit7CisJUFJUTVBfQURBUFRFUiAJcEFkYXB0ZXIgPSBOVUxMOworCVZJUlRVQUxfQURBUFRFUiAqcFZpcnR1YWxBZCA9IE5VTEw7CisKKwlpZiAoZGV2LT5wcml2X2ZsYWdzID09IElOVF9NQUlOKQorCXsKKwkJcEFkYXB0ZXIgPSBkZXYtPnByaXY7CisJfQorCWVsc2UKKwl7CisJCXBWaXJ0dWFsQWQgPSBkZXYtPnByaXY7CisJCWlmIChwVmlydHVhbEFkICYmIHBWaXJ0dWFsQWQtPlJ0bXBEZXYpCisJCQlwQWRhcHRlciA9IHBWaXJ0dWFsQWQtPlJ0bXBEZXYtPnByaXY7CisJfQorCisJaWYgKHBBZGFwdGVyID09IE5VTEwpCisJeworCQkvKiBpZiAxc3Qgb3BlbiBmYWlsLCBwQWQgd2lsbCBiZSBmcmVlOworCQkgICBTbyB0aGUgbmV0X2Rldi0+cHJpdiB3aWxsIGJlIE5VTEwgaW4gMnJkIG9wZW4gKi8KKwkJcmV0dXJuIC1FTkVURE9XTjsKKwl9CisKKwkvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgorCWlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKKwl7CisgIAkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOworICAgIAlyZXR1cm4gLUVORVRET1dOOworCX0KKworCXJ0cy0+dmFsdWUgPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLlJ0c1RocmVzaG9sZDsKKwlydHMtPmRpc2FibGVkID0gKHJ0cy0+dmFsdWUgPT0gTUFYX1JUU19USFJFU0hPTEQpOworCXJ0cy0+Zml4ZWQgPSAxOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBydF9pb2N0bF9zaXdmcmFnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJc3RydWN0IGl3X3BhcmFtICpmcmFnLCBjaGFyICpleHRyYSkKK3sKKwlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gKFBSVE1QX0FEQVBURVIpIGRldi0+cHJpdjsKKwl1MTYgdmFsOworCisJLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KKyAgICAJaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQorICAgIAl7CisgICAgICAJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKyAgICAgICAgCXJldHVybiAtRU5FVERPV047CisgICAgCX0KKworCWlmIChmcmFnLT5kaXNhYmxlZCkKKwkJdmFsID0gTUFYX0ZSQUdfVEhSRVNIT0xEOworCWVsc2UgaWYgKGZyYWctPnZhbHVlID49IE1JTl9GUkFHX1RIUkVTSE9MRCB8fCBmcmFnLT52YWx1ZSA8PSBNQVhfRlJBR19USFJFU0hPTEQpCisgICAgICAgIHZhbCA9IF9fY3B1X3RvX2xlMTYoZnJhZy0+dmFsdWUgJiB+MHgxKTsgLyogZXZlbiBudW1iZXJzIG9ubHkgKi8KKwllbHNlIGlmIChmcmFnLT52YWx1ZSA9PSAwKQorCSAgICB2YWwgPSBNQVhfRlJBR19USFJFU0hPTEQ7CisJZWxzZQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXBBZGFwdGVyLT5Db21tb25DZmcuRnJhZ21lbnRUaHJlc2hvbGQgPSB2YWw7CisJcmV0dXJuIDA7Cit9CisKK2ludCBydF9pb2N0bF9naXdmcmFnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJc3RydWN0IGl3X3BhcmFtICpmcmFnLCBjaGFyICpleHRyYSkKK3sKKwlQUlRNUF9BREFQVEVSIAlwQWRhcHRlciA9IE5VTEw7CisJVklSVFVBTF9BREFQVEVSICpwVmlydHVhbEFkID0gTlVMTDsKKworCWlmIChkZXYtPnByaXZfZmxhZ3MgPT0gSU5UX01BSU4pCisJeworCQlwQWRhcHRlciA9IGRldi0+cHJpdjsKKwl9CisJZWxzZQorCXsKKwkJcFZpcnR1YWxBZCA9IGRldi0+cHJpdjsKKwkJaWYgKHBWaXJ0dWFsQWQgJiYgcFZpcnR1YWxBZC0+UnRtcERldikKKwkJCXBBZGFwdGVyID0gcFZpcnR1YWxBZC0+UnRtcERldi0+cHJpdjsKKwl9CisKKwlpZiAocEFkYXB0ZXIgPT0gTlVMTCkKKwl7CisJCS8qIGlmIDFzdCBvcGVuIGZhaWwsIHBBZCB3aWxsIGJlIGZyZWU7CisJCSAgIFNvIHRoZSBuZXRfZGV2LT5wcml2IHdpbGwgYmUgTlVMTCBpbiAycmQgb3BlbiAqLworCQlyZXR1cm4gLUVORVRET1dOOworCX0KKworCS8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCisJaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQorCXsKKyAgCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisgICAgCXJldHVybiAtRU5FVERPV047CisJfQorCisJZnJhZy0+dmFsdWUgPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLkZyYWdtZW50VGhyZXNob2xkOworCWZyYWctPmRpc2FibGVkID0gKGZyYWctPnZhbHVlID09IE1BWF9GUkFHX1RIUkVTSE9MRCk7CisJZnJhZy0+Zml4ZWQgPSAxOworCisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgTUFYX1dFUF9LRVlfU0laRSAxMworI2RlZmluZSBNSU5fV0VQX0tFWV9TSVpFIDUKK2ludCBydF9pb2N0bF9zaXdlbmNvZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgc3RydWN0IGl3X3BvaW50ICplcnEsIGNoYXIgKmV4dHJhKQoreworCVBSVE1QX0FEQVBURVIgcEFkYXB0ZXIgPSAoUFJUTVBfQURBUFRFUikgZGV2LT5wcml2OworCisJLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KKyAgICAJaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQorICAgIAl7CisgICAgICAJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKyAgICAgICAgCXJldHVybiAtRU5FVERPV047CisgICAgCX0KKworCWlmICgoZXJxLT5sZW5ndGggPT0gMCkgJiYKKyAgICAgICAgKGVycS0+ZmxhZ3MgJiBJV19FTkNPREVfRElTQUJMRUQpKQorCXsKKwkJcEFkYXB0ZXItPlN0YUNmZy5QYWlyQ2lwaGVyID0gTmRpczgwMl8xMVdFUERpc2FibGVkOworCQlwQWRhcHRlci0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID0gTmRpczgwMl8xMVdFUERpc2FibGVkOworCQlwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cyA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5PcmlnV2VwU3RhdHVzID0gcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXM7CisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVPcGVuOworICAgICAgICBnb3RvIGRvbmU7CisJfQorCWVsc2UgaWYgKChlcnEtPmxlbmd0aCA9PSAwKSAmJgorICAgICAgICAgICAgIChlcnEtPmZsYWdzICYgSVdfRU5DT0RFX1JFU1RSSUNURUQgfHwgZXJxLT5mbGFncyAmIElXX0VOQ09ERV9PUEVOKSkKKwl7CisJICAgIC8vcEFkYXB0ZXItPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEOworCQlTVEFfUE9SVF9TRUNVUkVEKHBBZGFwdGVyKTsKKwkJcEFkYXB0ZXItPlN0YUNmZy5QYWlyQ2lwaGVyID0gTmRpczgwMl8xMVdFUEVuYWJsZWQ7CisJCXBBZGFwdGVyLT5TdGFDZmcuR3JvdXBDaXBoZXIgPSBOZGlzODAyXzExV0VQRW5hYmxlZDsKKwkJcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXMgPSBOZGlzODAyXzExV0VQRW5hYmxlZDsKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5PcmlnV2VwU3RhdHVzID0gcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXM7CisJCWlmIChlcnEtPmZsYWdzICYgSVdfRU5DT0RFX1JFU1RSSUNURUQpCisJCQlwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlU2hhcmVkOworICAgIAllbHNlCisJCQlwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlT3BlbjsKKyAgICAgICAgZ290byBkb25lOworCX0KKworICAgIGlmIChlcnEtPmxlbmd0aCA+IDApCisJeworCQlpbnQga2V5SWR4ID0gKGVycS0+ZmxhZ3MgJiBJV19FTkNPREVfSU5ERVgpIC0gMTsKKwkJLyogQ2hlY2sgdGhlIHNpemUgb2YgdGhlIGtleSAqLworCQlpZiAoZXJxLT5sZW5ndGggPiBNQVhfV0VQX0tFWV9TSVpFKSB7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQkvKiBDaGVjayBrZXkgaW5kZXggKi8KKwkJaWYgKChrZXlJZHggPCAwKSB8fCAoa2V5SWR4ID49IE5SX1dFUF9LRVlTKSkKKyAgICAgICAgeworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UgLCgiPT0+cnRfaW9jdGxfc2l3ZW5jb2RlOjpXcm9uZyBrZXlJZHg9JWQhIFVzaW5nIGRlZmF1bHQga2V5IGluc3RlYWQgKCVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlJZHgsIHBBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkKSk7CisKKyAgICAgICAgICAgIC8vVXNpbmcgZGVmYXVsdCBrZXkKKwkJCWtleUlkeCA9IHBBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkOworICAgICAgICB9CisKKyAgICAgICAgTmRpc1plcm9NZW1vcnkocEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLktleSwgIDE2KTsKKworCQlpZiAoZXJxLT5sZW5ndGggPT0gTUFYX1dFUF9LRVlfU0laRSkKKyAgICAgICAgeworCQkJcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLktleUxlbiA9IE1BWF9XRVBfS0VZX1NJWkU7CisgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDEyODsKKwkJfQorCQllbHNlIGlmIChlcnEtPmxlbmd0aCA9PSBNSU5fV0VQX0tFWV9TSVpFKQorICAgICAgICB7CisgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uS2V5TGVuID0gTUlOX1dFUF9LRVlfU0laRTsKKyAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5DaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7CisJCX0KKwkJZWxzZQorCQkJLyogRGlzYWJsZSB0aGUga2V5ICovCisJCQlwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uS2V5TGVuID0gMDsKKworCQkvKiBDaGVjayBpZiB0aGUga2V5IGlzIG5vdCBtYXJrZWQgYXMgaW52YWxpZCAqLworCQlpZighKGVycS0+ZmxhZ3MgJiBJV19FTkNPREVfTk9LRVkpKSB7CisJCQkvKiBDb3B5IHRoZSBrZXkgaW4gdGhlIGRyaXZlciAqLworCQkJTmRpc01vdmVNZW1vcnkocEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLktleSwgZXh0cmEsIGVycS0+bGVuZ3RoKTsKKyAgICAgICAgfQorCX0KKyAgICBlbHNlCisJCQl7CisJCS8qIERvIHdlIHdhbnQgdG8ganVzdCBzZXQgdGhlIHRyYW5zbWl0IGtleSBpbmRleCA/ICovCisJCWludCBpbmRleCA9IChlcnEtPmZsYWdzICYgSVdfRU5DT0RFX0lOREVYKSAtIDE7CisJCWlmICgoaW5kZXggPj0gMCkgJiYgKGluZGV4IDwgNCkpCisgICAgICAgIHsKKwkJCXBBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkID0gaW5kZXg7CisgICAgICAgICAgICB9CisgICAgICAgIGVsc2UKKwkJCS8qIERvbid0IGNvbXBsYWluIGlmIG9ubHkgY2hhbmdlIHRoZSBtb2RlICovCisJCQlpZighZXJxLT5mbGFncyAmIElXX0VOQ09ERV9NT0RFKSB7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisKK2RvbmU6CisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UgLCgiPT0+cnRfaW9jdGxfc2l3ZW5jb2RlOjplcnEtPmZsYWdzPSV4XG4iLGVycS0+ZmxhZ3MpKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSAsKCI9PT5ydF9pb2N0bF9zaXdlbmNvZGU6OkF1dGhNb2RlPSV4XG4iLHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUpKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSAsKCI9PT5ydF9pb2N0bF9zaXdlbmNvZGU6OkRlZmF1bHRLZXlJZD0leCwgS2V5TGVuID0gJWRcbiIscEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWQgLCBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW3BBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5LZXlMZW4pKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSAsKCI9PT5ydF9pb2N0bF9zaXdlbmNvZGU6OldlcFN0YXR1cz0leFxuIixwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cykpOworCXJldHVybiAwOworfQorCitpbnQKK3J0X2lvY3RsX2dpd2VuY29kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICBzdHJ1Y3QgaXdfcG9pbnQgKmVycSwgY2hhciAqa2V5KQoreworCWludCBraWQ7CisJUFJUTVBfQURBUFRFUiAJcEFkYXB0ZXIgPSBOVUxMOworCVZJUlRVQUxfQURBUFRFUiAqcFZpcnR1YWxBZCA9IE5VTEw7CisKKwlpZiAoZGV2LT5wcml2X2ZsYWdzID09IElOVF9NQUlOKQorCXsKKwkJcEFkYXB0ZXIgPSBkZXYtPnByaXY7CisJfQorCWVsc2UKKwl7CisJCXBWaXJ0dWFsQWQgPSBkZXYtPnByaXY7CisJCWlmIChwVmlydHVhbEFkICYmIHBWaXJ0dWFsQWQtPlJ0bXBEZXYpCisJCQlwQWRhcHRlciA9IHBWaXJ0dWFsQWQtPlJ0bXBEZXYtPnByaXY7CisJfQorCisJaWYgKHBBZGFwdGVyID09IE5VTEwpCisJeworCQkvKiBpZiAxc3Qgb3BlbiBmYWlsLCBwQWQgd2lsbCBiZSBmcmVlOworCQkgICBTbyB0aGUgbmV0X2Rldi0+cHJpdiB3aWxsIGJlIE5VTEwgaW4gMnJkIG9wZW4gKi8KKwkJcmV0dXJuIC1FTkVURE9XTjsKKwl9CisKKwkvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgorCWlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKKwl7CisgIAkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOworICAgIAlyZXR1cm4gLUVORVRET1dOOworCX0KKworCWtpZCA9IGVycS0+ZmxhZ3MgJiBJV19FTkNPREVfSU5ERVg7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PnJ0X2lvY3RsX2dpd2VuY29kZSAlZFxuIiwgZXJxLT5mbGFncyAmIElXX0VOQ09ERV9JTkRFWCkpOworCisJaWYgKHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFXRVBEaXNhYmxlZCkKKwl7CisJCWVycS0+bGVuZ3RoID0gMDsKKwkJZXJxLT5mbGFncyA9IElXX0VOQ09ERV9ESVNBQkxFRDsKKwl9CisJZWxzZSBpZiAoKGtpZCA+IDApICYmIChraWQgPD00KSkKKwl7CisJCS8vIGNvcHkgd2VwIGtleQorCQllcnEtPmZsYWdzID0ga2lkIDsJCQkvKiBOQjogYmFzZSAxICovCisJCWlmIChlcnEtPmxlbmd0aCA+IHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2lkLTFdLktleUxlbikKKwkJCWVycS0+bGVuZ3RoID0gcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtraWQtMV0uS2V5TGVuOworCQltZW1jcHkoa2V5LCBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tpZC0xXS5LZXksIGVycS0+bGVuZ3RoKTsKKwkJLy9pZiAoKGtpZCA9PSBwQWRhcHRlci0+UG9ydENmZy5EZWZhdWx0S2V5SWQpKQorCQkvL2VycS0+ZmxhZ3MgfD0gSVdfRU5DT0RFX0VOQUJMRUQ7CS8qIFhYWCAqLworCQlpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVTaGFyZWQpCisJCQllcnEtPmZsYWdzIHw9IElXX0VOQ09ERV9SRVNUUklDVEVEOwkJLyogWFhYICovCisJCWVsc2UKKwkJCWVycS0+ZmxhZ3MgfD0gSVdfRU5DT0RFX09QRU47CQkvKiBYWFggKi8KKworCX0KKwllbHNlIGlmIChraWQgPT0gMCkKKwl7CisJCWlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVNoYXJlZCkKKwkJCWVycS0+ZmxhZ3MgfD0gSVdfRU5DT0RFX1JFU1RSSUNURUQ7CQkvKiBYWFggKi8KKwkJZWxzZQorCQkJZXJxLT5mbGFncyB8PSBJV19FTkNPREVfT1BFTjsJCS8qIFhYWCAqLworCQllcnEtPmxlbmd0aCA9IHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWRdLktleUxlbjsKKwkJbWVtY3B5KGtleSwgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uS2V5LCBlcnEtPmxlbmd0aCk7CisJCS8vIGNvcHkgZGVmYXVsdCBrZXkgSUQKKwkJaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlU2hhcmVkKQorCQkJZXJxLT5mbGFncyB8PSBJV19FTkNPREVfUkVTVFJJQ1RFRDsJCS8qIFhYWCAqLworCQllbHNlCisJCQllcnEtPmZsYWdzIHw9IElXX0VOQ09ERV9PUEVOOwkJLyogWFhYICovCisJCWVycS0+ZmxhZ3MgPSBwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCArIDE7CQkJLyogTkI6IGJhc2UgMSAqLworCQllcnEtPmZsYWdzIHw9IElXX0VOQ09ERV9FTkFCTEVEOwkvKiBYWFggKi8KKwl9CisKKwlyZXR1cm4gMDsKKworfQorCitzdGF0aWMgaW50CitydF9pb2N0bF9zZXRwYXJhbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJIHZvaWQgKncsIGNoYXIgKmV4dHJhKQoreworICAgIFZJUlRVQUxfQURBUFRFUgkqcFZpcnR1YWxBZCA9IE5VTEw7CisJUFJUTVBfQURBUFRFUiBwQWRhcHRlcjsKKwlQT1NfQ09PS0lFIHBPYmo7CisJY2hhciAqdGhpc19jaGFyID0gZXh0cmE7CisJY2hhciAqdmFsdWU7CisJaW50ICBTdGF0dXM9MDsKKworCWlmIChkZXYtPnByaXZfZmxhZ3MgPT0gSU5UX01BSU4pCisJeworCQlwQWRhcHRlciA9IGRldi0+cHJpdjsKKwl9CisJZWxzZQorCXsKKwkJcFZpcnR1YWxBZCA9IGRldi0+cHJpdjsKKwkJcEFkYXB0ZXIgPSBwVmlydHVhbEFkLT5SdG1wRGV2LT5wcml2OworCX0KKwlwT2JqID0gKFBPU19DT09LSUUpIHBBZGFwdGVyLT5PU19Db29raWU7CisKKwlpZiAocEFkYXB0ZXIgPT0gTlVMTCkKKwl7CisJCS8qIGlmIDFzdCBvcGVuIGZhaWwsIHBBZCB3aWxsIGJlIGZyZWU7CisJCSAgIFNvIHRoZSBuZXRfZGV2LT5wcml2IHdpbGwgYmUgTlVMTCBpbiAycmQgb3BlbiAqLworCQlyZXR1cm4gLUVORVRET1dOOworCX0KKworCXsKKwkJcE9iai0+aW9jdGxfaWZfdHlwZSA9IElOVF9NQUlOOworICAgICAgICBwT2JqLT5pb2N0bF9pZiA9IE1BSU5fTUJTU0lEOworCX0KKworCS8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCisgICAgCWlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKKyAgICAJeworICAgICAgCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisJCQlyZXR1cm4gLUVORVRET1dOOworICAgIAl9CisKKwlpZiAoISp0aGlzX2NoYXIpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCh2YWx1ZSA9IHJ0c3RyY2hyKHRoaXNfY2hhciwgJz0nKSkgIT0gTlVMTCkKKwkgICAgKnZhbHVlKysgPSAwOworCisJaWYgKCF2YWx1ZSkKKwkgICAgcmV0dXJuIC1FSU5WQUw7CisKKwkvLyByZWplY3Qgc2V0dGluZyBub3RoaW5nIGJlc2lkZXMgQU5ZIHNzaWQoc3NpZExlbj0wKQorICAgIGlmICghKnZhbHVlICYmIChzdHJjbXAodGhpc19jaGFyLCAiU1NJRCIpICE9IDApKQorICAgICAgICByZXR1cm4gLUVJTlZBTDsKKworCWZvciAoUFJUTVBfUFJJVkFURV9TRVRfUFJPQyA9IFJUTVBfUFJJVkFURV9TVVBQT1JUX1BST0M7IFBSVE1QX1BSSVZBVEVfU0VUX1BST0MtPm5hbWU7IFBSVE1QX1BSSVZBVEVfU0VUX1BST0MrKykKKwl7CisJICAgIGlmIChzdHJjbXAodGhpc19jaGFyLCBQUlRNUF9QUklWQVRFX1NFVF9QUk9DLT5uYW1lKSA9PSAwKQorCSAgICB7CisJICAgICAgICBpZighUFJUTVBfUFJJVkFURV9TRVRfUFJPQy0+c2V0X3Byb2MocEFkYXB0ZXIsIHZhbHVlKSkKKwkgICAgICAgIHsJLy9GQUxTRTpTZXQgcHJpdmF0ZSBmYWlsZWQgdGhlbiByZXR1cm4gSW52YWxpZCBhcmd1bWVudAorCQkJICAgIFN0YXR1cyA9IC1FSU5WQUw7CisJICAgICAgICB9CisJCSAgICBicmVhazsJLy9FeGl0IGZvciBsb29wLgorCSAgICB9CisJfQorCisJaWYoUFJUTVBfUFJJVkFURV9TRVRfUFJPQy0+bmFtZSA9PSBOVUxMKQorCXsgIC8vTm90IGZvdW5kIGFyZ3VtZW50CisJICAgIFN0YXR1cyA9IC1FSU5WQUw7CisJICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT5ydF9pb2N0bF9zZXRwYXJhbTo6IChpd3ByaXYpIE5vdCBTdXBwb3J0IFNldCBDb21tYW5kIFslcz0lc11cbiIsIHRoaXNfY2hhciwgdmFsdWUpKTsKKwl9CisKKyAgICByZXR1cm4gU3RhdHVzOworfQorCisKK3N0YXRpYyBpbnQKK3J0X3ByaXZhdGVfZ2V0X3N0YXRpc3RpY3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJc3RydWN0IGl3X3BvaW50ICp3cnEsIGNoYXIgKmV4dHJhKQoreworCUlOVAkJCQlTdGF0dXMgPSAwOworICAgIFBSVE1QX0FEQVBURVIgICBwQWQgPSAoUFJUTVBfQURBUFRFUikgZGV2LT5wcml2OworCisgICAgaWYgKGV4dHJhID09IE5VTEwpCisgICAgeworICAgICAgICB3cnEtPmxlbmd0aCA9IDA7CisgICAgICAgIHJldHVybiAtRUlPOworICAgIH0KKworICAgIG1lbXNldChleHRyYSwgMHgwMCwgSVdfUFJJVl9TSVpFX01BU0spOworICAgIHNwcmludGYoZXh0cmEsICJcblxuIik7CisKKyNpZmRlZiBSQUxJTktfQVRFCisJaWYgKEFURV9PTihwQWQpKQorCXsKKwkgICAgc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiVHggc3VjY2VzcyAgICAgICAgICAgICAgICAgICAgICA9ICVsZFxuIiwgKFVMT05HKXBBZC0+YXRlLlR4RG9uZUNvdW50KTsKKwkgICAgLy9zcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJUeCBzdWNjZXNzIHdpdGhvdXQgcmV0cnkgICAgICAgID0gJWxkXG4iLCAoVUxPTkcpcEFkLT5hdGUuVHhEb25lQ291bnQpOworCX0KKwllbHNlCisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCXsKKyAgICBzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJUeCBzdWNjZXNzICAgICAgICAgICAgICAgICAgICAgID0gJWxkXG4iLCAoVUxPTkcpcEFkLT5XbGFuQ291bnRlcnMuVHJhbnNtaXR0ZWRGcmFnbWVudENvdW50LlF1YWRQYXJ0KTsKKyAgICBzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJUeCBzdWNjZXNzIHdpdGhvdXQgcmV0cnkgICAgICAgID0gJWxkXG4iLCAoVUxPTkcpcEFkLT5XbGFuQ291bnRlcnMuVHJhbnNtaXR0ZWRGcmFnbWVudENvdW50LlF1YWRQYXJ0IC0gKFVMT05HKXBBZC0+V2xhbkNvdW50ZXJzLlJldHJ5Q291bnQuUXVhZFBhcnQpOworCX0KKyAgICBzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJUeCBzdWNjZXNzIGFmdGVyIHJldHJ5ICAgICAgICAgID0gJWxkXG4iLCAoVUxPTkcpcEFkLT5XbGFuQ291bnRlcnMuUmV0cnlDb3VudC5RdWFkUGFydCk7CisgICAgc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiVHggZmFpbCB0byBSY3YgQUNLIGFmdGVyIHJldHJ5ICA9ICVsZFxuIiwgKFVMT05HKXBBZC0+V2xhbkNvdW50ZXJzLkZhaWxlZENvdW50LlF1YWRQYXJ0KTsKKyAgICBzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJSVFMgU3VjY2VzcyBSY3YgQ1RTICAgICAgICAgICAgID0gJWxkXG4iLCAoVUxPTkcpcEFkLT5XbGFuQ291bnRlcnMuUlRTU3VjY2Vzc0NvdW50LlF1YWRQYXJ0KTsKKyAgICBzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJSVFMgRmFpbCBSY3YgQ1RTICAgICAgICAgICAgICAgID0gJWxkXG4iLCAoVUxPTkcpcEFkLT5XbGFuQ291bnRlcnMuUlRTRmFpbHVyZUNvdW50LlF1YWRQYXJ0KTsKKworICAgIHNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlJ4IHN1Y2Nlc3MgICAgICAgICAgICAgICAgICAgICAgPSAlbGRcbiIsIChVTE9ORylwQWQtPldsYW5Db3VudGVycy5SZWNlaXZlZEZyYWdtZW50Q291bnQuUXVhZFBhcnQpOworICAgIHNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlJ4IHdpdGggQ1JDICAgICAgICAgICAgICAgICAgICAgPSAlbGRcbiIsIChVTE9ORylwQWQtPldsYW5Db3VudGVycy5GQ1NFcnJvckNvdW50LlF1YWRQYXJ0KTsKKyAgICBzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJSeCBkcm9wIGR1ZSB0byBvdXQgb2YgcmVzb3VyY2UgID0gJWxkXG4iLCAoVUxPTkcpcEFkLT5Db3VudGVyczgwMjMuUnhOb0J1ZmZlcik7CisgICAgc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiUnggZHVwbGljYXRlIGZyYW1lICAgICAgICAgICAgICA9ICVsZFxuIiwgKFVMT05HKXBBZC0+V2xhbkNvdW50ZXJzLkZyYW1lRHVwbGljYXRlQ291bnQuUXVhZFBhcnQpOworCisgICAgc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiRmFsc2UgQ0NBIChvbmUgc2Vjb25kKSAgICAgICAgICA9ICVsZFxuIiwgKFVMT05HKXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjRmFsc2VDQ0FDbnQpOworI2lmZGVmIFJBTElOS19BVEUKKwlpZiAoQVRFX09OKHBBZCkpCisJeworCQlpZiAocEFkLT5hdGUuUnhBbnRlbm5hU2VsID09IDApCisJCXsKKyAgICAJCXNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlJTU0ktQSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAlbGRcbiIsIChMT05HKShwQWQtPmF0ZS5MYXN0UnNzaTAgLSBwQWQtPkJicFJzc2lUb0RibURlbHRhKSk7CisJCQlzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJSU1NJLUIgKGlmIGF2YWlsYWJsZSkgICAgICAgICAgID0gJWxkXG4iLCAoTE9ORykocEFkLT5hdGUuTGFzdFJzc2kxIC0gcEFkLT5CYnBSc3NpVG9EYm1EZWx0YSkpOworCQkJc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiUlNTSS1DIChpZiBhdmFpbGFibGUpICAgICAgICAgICA9ICVsZFxuXG4iLCAoTE9ORykocEFkLT5hdGUuTGFzdFJzc2kyIC0gcEFkLT5CYnBSc3NpVG9EYm1EZWx0YSkpOworCQl9CisJCWVsc2UKKwkJeworICAgIAkJc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiUlNTSSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICVsZFxuIiwgKExPTkcpKHBBZC0+YXRlLkxhc3RSc3NpMCAtIHBBZC0+QmJwUnNzaVRvRGJtRGVsdGEpKTsKKwkJfQorCX0KKwllbHNlCisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCXsKKyAgICAJc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiUlNTSS1BICAgICAgICAgICAgICAgICAgICAgICAgICA9ICVsZFxuIiwgKExPTkcpKHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kwIC0gcEFkLT5CYnBSc3NpVG9EYm1EZWx0YSkpOworICAgICAgICBzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJSU1NJLUIgKGlmIGF2YWlsYWJsZSkgICAgICAgICAgID0gJWxkXG4iLCAoTE9ORykocEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTEgLSBwQWQtPkJicFJzc2lUb0RibURlbHRhKSk7CisgICAgICAgIHNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlJTU0ktQyAoaWYgYXZhaWxhYmxlKSAgICAgICAgICAgPSAlbGRcblxuIiwgKExPTkcpKHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kyIC0gcEFkLT5CYnBSc3NpVG9EYm1EZWx0YSkpOworCX0KKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiV3BhU3VwcGxpY2FudFVQICAgICAgICAgICAgICAgICA9ICVkXG5cbiIsIHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCk7CisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCisKKyAgICB3cnEtPmxlbmd0aCA9IHN0cmxlbihleHRyYSkgKyAxOyAvLyAxOiBzaXplIG9mICdcMCcKKyAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT0gcnRfcHJpdmF0ZV9nZXRfc3RhdGlzdGljcywgd3JxLT5sZW5ndGggPSAlZFxuIiwgd3JxLT5sZW5ndGgpKTsKKworICAgIHJldHVybiBTdGF0dXM7Cit9CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKK3ZvaWQJZ2V0QmFJbmZvKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCXBPdXRCdWYpCit7CisJSU5UIGksIGo7CisJQkFfT1JJX0VOVFJZICpwT3JpQkFFbnRyeTsKKwlCQV9SRUNfRU5UUlkgKnBSZWNCQUVudHJ5OworCisJZm9yIChpPTA7IGk8TUFYX0xFTl9PRl9NQUNfVEFCTEU7IGkrKykKKwl7CisJCVBNQUNfVEFCTEVfRU5UUlkgcEVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbaV07CisJCWlmICgoKHBFbnRyeS0+VmFsaWRBc0NMSSB8fCBwRW50cnktPlZhbGlkQXNBcENsaSkgJiYgKHBFbnRyeS0+U3N0ID09IFNTVF9BU1NPQykpCisJCQl8fCAocEVudHJ5LT5WYWxpZEFzV0RTKSB8fCAocEVudHJ5LT5WYWxpZEFzTWVzaCkpCisJCXsKKwkJCXNwcmludGYocE91dEJ1ZiwgIiVzXG4lMDJYOiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWCAoQWlkID0gJWQpIChBUCkgLVxuIiwKKyAgICAgICAgICAgICAgICBwT3V0QnVmLAorCQkJCXBFbnRyeS0+QWRkclswXSwgcEVudHJ5LT5BZGRyWzFdLCBwRW50cnktPkFkZHJbMl0sCisJCQkJcEVudHJ5LT5BZGRyWzNdLCBwRW50cnktPkFkZHJbNF0sIHBFbnRyeS0+QWRkcls1XSwgcEVudHJ5LT5BaWQpOworCisJCQlzcHJpbnRmKHBPdXRCdWYsICIlc1tSZWNpcGllbnRdXG4iLCBwT3V0QnVmKTsKKwkJCWZvciAoaj0wOyBqIDwgTlVNX09GX1RJRDsgaisrKQorCQkJeworCQkJCWlmIChwRW50cnktPkJBUmVjV2NpZEFycmF5W2pdICE9IDApCisJCQkJeworCQkJCQlwUmVjQkFFbnRyeSA9JnBBZC0+QkFUYWJsZS5CQVJlY0VudHJ5W3BFbnRyeS0+QkFSZWNXY2lkQXJyYXlbal1dOworCQkJCQlzcHJpbnRmKHBPdXRCdWYsICIlc1RJRD0lZCwgQkFXaW5TaXplPSVkLCBMYXN0SW5kU2VxPSVkLCBSZW9yZGVyaW5nUGt0cz0lZFxuIiwgcE91dEJ1ZiwgaiwgcFJlY0JBRW50cnktPkJBV2luU2l6ZSwgcFJlY0JBRW50cnktPkxhc3RJbmRTZXEsIHBSZWNCQUVudHJ5LT5saXN0LnFsZW4pOworCQkJCX0KKwkJCX0KKwkJCXNwcmludGYocE91dEJ1ZiwgIiVzXG4iLCBwT3V0QnVmKTsKKworCQkJc3ByaW50ZihwT3V0QnVmLCAiJXNbT3JpZ2luYXRvcl1cbiIsIHBPdXRCdWYpOworCQkJZm9yIChqPTA7IGogPCBOVU1fT0ZfVElEOyBqKyspCisJCQl7CisJCQkJaWYgKHBFbnRyeS0+QkFPcmlXY2lkQXJyYXlbal0gIT0gMCkKKwkJCQl7CisJCQkJCXBPcmlCQUVudHJ5ID0mcEFkLT5CQVRhYmxlLkJBT3JpRW50cnlbcEVudHJ5LT5CQU9yaVdjaWRBcnJheVtqXV07CisJCQkJCXNwcmludGYocE91dEJ1ZiwgIiVzVElEPSVkLCBCQVdpblNpemU9JWQsIFN0YXJ0U2VxPSVkLCBDdXJUeFNlcT0lZFxuIiwgcE91dEJ1ZiwgaiwgcE9yaUJBRW50cnktPkJBV2luU2l6ZSwgcE9yaUJBRW50cnktPlNlcXVlbmNlLCBwRW50cnktPlR4U2VxW2pdKTsKKwkJCQl9CisJCQl9CisJCQlzcHJpbnRmKHBPdXRCdWYsICIlc1xuXG4iLCBwT3V0QnVmKTsKKwkJfQorICAgICAgICBpZiAoc3RybGVuKHBPdXRCdWYpID4gKElXX1BSSVZfU0laRV9NQVNLIC0gMzApKQorICAgICAgICAgICAgICAgIGJyZWFrOworCX0KKworCXJldHVybjsKK30KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworc3RhdGljIGludAorcnRfcHJpdmF0ZV9zaG93KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCXN0cnVjdCBpd19wb2ludCAqd3JxLCBjaGFyICpleHRyYSkKK3sKKyAgICBJTlQJCQkJU3RhdHVzID0gMDsKKyAgICBWSVJUVUFMX0FEQVBURVIJKnBWaXJ0dWFsQWQgPSBOVUxMOworICAgIFBSVE1QX0FEQVBURVIgICBwQWQ7CisJUE9TX0NPT0tJRQkJcE9iajsKKyAgICB1MzIgICAgICAgICAgICAgc3ViY21kID0gd3JxLT5mbGFnczsKKworCWlmIChkZXYtPnByaXZfZmxhZ3MgPT0gSU5UX01BSU4pCisJCXBBZCA9IGRldi0+cHJpdjsKKwllbHNlCisJeworCQlwVmlydHVhbEFkID0gZGV2LT5wcml2OworCQlwQWQgPSBwVmlydHVhbEFkLT5SdG1wRGV2LT5wcml2OworCX0KKwlwT2JqID0gKFBPU19DT09LSUUpIHBBZC0+T1NfQ29va2llOworCisJaWYgKHBBZCA9PSBOVUxMKQorCXsKKwkJLyogaWYgMXN0IG9wZW4gZmFpbCwgcEFkIHdpbGwgYmUgZnJlZTsKKwkJICAgU28gdGhlIG5ldF9kZXYtPnByaXYgd2lsbCBiZSBOVUxMIGluIDJyZCBvcGVuICovCisJCXJldHVybiAtRU5FVERPV047CisJfQorCisgICAgaWYgKGV4dHJhID09IE5VTEwpCisgICAgeworICAgICAgICB3cnEtPmxlbmd0aCA9IDA7CisgICAgICAgIHJldHVybiAtRUlPOworICAgIH0KKyAgICBtZW1zZXQoZXh0cmEsIDB4MDAsIElXX1BSSVZfU0laRV9NQVNLKTsKKworCXsKKwkJcE9iai0+aW9jdGxfaWZfdHlwZSA9IElOVF9NQUlOOworICAgICAgICBwT2JqLT5pb2N0bF9pZiA9IE1BSU5fTUJTU0lEOworCX0KKworICAgIHN3aXRjaChzdWJjbWQpCisgICAgeworCisgICAgICAgIGNhc2UgU0hPV19DT05OX1NUQVRVUzoKKyAgICAgICAgICAgIGlmIChNT05JVE9SX09OKHBBZCkpCisgICAgICAgICAgICB7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisgICAgICAgICAgICAgICAgaWYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCAmJgorICAgICAgICAgICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlcpCisgICAgICAgICAgICAgICAgICAgIHNwcmludGYoZXh0cmEsICJNb25pdG9yIE1vZGUoQ2VudHJhbENoYW5uZWwgJWQpXG4iLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCk7CisgICAgICAgICAgICAgICAgZWxzZQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKGV4dHJhLCAiTW9uaXRvciBNb2RlKENoYW5uZWwgJWQpXG4iLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAocEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPT0gTmRpc01lZGlhU3RhdGVDb25uZWN0ZWQpCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCSAgICBpZiAoSU5GUkFfT04ocEFkKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKGV4dHJhLCAiQ29ubmVjdGVkKEFQOiAlc1slMDJYOiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWF0pXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuU3NpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuQnNzaWRbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5Cc3NpZFsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkWzNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuQnNzaWRbNF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5Cc3NpZFs1XSk7CisgICAgICAgICAgICAJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoIlNzaWQ9JXMgLFNzaWRsZW4gPSAlZFxuIixwQWQtPkNvbW1vbkNmZy5Tc2lkLCBwQWQtPkNvbW1vbkNmZy5Tc2lkTGVuKSk7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChBREhPQ19PTihwQWQpKQorICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihleHRyYSwgIkNvbm5lY3RlZFxuIik7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgCWVsc2UKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJICAgIHNwcmludGYoZXh0cmEsICJEaXNjb25uZWN0ZWRcbiIpOworICAgICAgICAgICAgCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSAsKCJDb25uU3RhdHVzIGlzIG5vdCBjb25uZWN0ZWRcbiIpKTsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3cnEtPmxlbmd0aCA9IHN0cmxlbihleHRyYSkgKyAxOyAvLyAxOiBzaXplIG9mICdcMCcKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNIT1dfRFJWSUVSX1ZFUklPTjoKKyAgICAgICAgICAgIHNwcmludGYoZXh0cmEsICJEcml2ZXIgdmVyc2lvbi0lcywgJXMgJXNcbiIsIFNUQV9EUklWRVJfVkVSU0lPTiwgX19EQVRFX18sIF9fVElNRV9fICk7CisgICAgICAgICAgICB3cnEtPmxlbmd0aCA9IHN0cmxlbihleHRyYSkgKyAxOyAvLyAxOiBzaXplIG9mICdcMCcKKyAgICAgICAgICAgIGJyZWFrOworI2lmZGVmIERPVDExX05fU1VQUE9SVAorICAgICAgICBjYXNlIFNIT1dfQkFfSU5GTzoKKyAgICAgICAgICAgIGdldEJhSW5mbyhwQWQsIGV4dHJhKTsKKyAgICAgICAgICAgIHdycS0+bGVuZ3RoID0gc3RybGVuKGV4dHJhKSArIDE7IC8vIDE6IHNpemUgb2YgJ1wwJworICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCWNhc2UgU0hPV19ERVNDX0lORk86CisJCQl7CisJCQkJU2hvd19EZXNjSW5mb19Qcm9jKHBBZCwgTlVMTCk7CisJCQkJd3JxLT5sZW5ndGggPSAwOyAvLyAxOiBzaXplIG9mICdcMCcKKwkJCX0KKwkJCWJyZWFrOworICAgICAgICBjYXNlIFJBSU9fT0ZGOgorICAgICAgICAgICAgaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3ByaW50ZihleHRyYSwgIlNjYW5uaW5nXG4iKTsKKyAgICAgICAgICAgICAgICB3cnEtPmxlbmd0aCA9IHN0cmxlbihleHRyYSkgKyAxOyAvLyAxOiBzaXplIG9mICdcMCcKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBBZC0+U3RhQ2ZnLmJTd1JhZGlvID0gRkFMU0U7CisgICAgICAgICAgICBpZiAocEFkLT5TdGFDZmcuYlJhZGlvICE9IChwQWQtPlN0YUNmZy5iSHdSYWRpbyAmJiBwQWQtPlN0YUNmZy5iU3dSYWRpbykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcEFkLT5TdGFDZmcuYlJhZGlvID0gKHBBZC0+U3RhQ2ZnLmJId1JhZGlvICYmIHBBZC0+U3RhQ2ZnLmJTd1JhZGlvKTsKKyAgICAgICAgICAgICAgICBpZiAocEFkLT5TdGFDZmcuYlJhZGlvID09IEZBTFNFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgTWxtZVJhZGlvT2ZmKHBBZCk7CisgICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBleHRyYSBpbmZvcm1hdGlvbgorCQkJCQlwQWQtPkV4dHJhSW5mbyA9IFNXX1JBRElPX09GRjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzcHJpbnRmKGV4dHJhLCAiUmFkaW8gT2ZmXG4iKTsKKyAgICAgICAgICAgIHdycS0+bGVuZ3RoID0gc3RybGVuKGV4dHJhKSArIDE7IC8vIDE6IHNpemUgb2YgJ1wwJworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUkFJT19PTjoKKyAgICAgICAgICAgIGlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNwcmludGYoZXh0cmEsICJTY2FubmluZ1xuIik7CisgICAgICAgICAgICAgICAgd3JxLT5sZW5ndGggPSBzdHJsZW4oZXh0cmEpICsgMTsgLy8gMTogc2l6ZSBvZiAnXDAnCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwQWQtPlN0YUNmZy5iU3dSYWRpbyA9IFRSVUU7CisgICAgICAgICAgICAvL2lmIChwQWQtPlN0YUNmZy5iUmFkaW8gIT0gKHBBZC0+U3RhQ2ZnLmJId1JhZGlvICYmIHBBZC0+U3RhQ2ZnLmJTd1JhZGlvKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwQWQtPlN0YUNmZy5iUmFkaW8gPSAocEFkLT5TdGFDZmcuYkh3UmFkaW8gJiYgcEFkLT5TdGFDZmcuYlN3UmFkaW8pOworICAgICAgICAgICAgICAgIGlmIChwQWQtPlN0YUNmZy5iUmFkaW8gPT0gVFJVRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIE1sbWVSYWRpb09uKHBBZCk7CisgICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBleHRyYSBpbmZvcm1hdGlvbgorCQkJCQlwQWQtPkV4dHJhSW5mbyA9IEVYVFJBX0lORk9fQ0xFQVI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgc3ByaW50ZihleHRyYSwgIlJhZGlvIE9uXG4iKTsKKyAgICAgICAgICAgIHdycS0+bGVuZ3RoID0gc3RybGVuKGV4dHJhKSArIDE7IC8vIDE6IHNpemUgb2YgJ1wwJworICAgICAgICAgICAgYnJlYWs7CisKKworI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCQljYXNlIFNIT1dfRExTX0VOVFJZX0lORk86CisJCQl7CisJCQkJU2V0X0Rsc0VudHJ5SW5mb19EaXNwbGF5X1Byb2MocEFkLCBOVUxMKTsKKwkJCQl3cnEtPmxlbmd0aCA9IDA7IC8vIDE6IHNpemUgb2YgJ1wwJworCQkJfQorCQkJYnJlYWs7CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisKKwkJY2FzZSBTSE9XX0NGR19WQUxVRToKKwkJCXsKKwkJCQlTdGF0dXMgPSBSVE1QU2hvd0NmZ1ZhbHVlKHBBZCwgd3JxLT5wb2ludGVyLCBleHRyYSk7CisJCQkJaWYgKFN0YXR1cyA9PSAwKQorCQkJCQl3cnEtPmxlbmd0aCA9IHN0cmxlbihleHRyYSkgKyAxOyAvLyAxOiBzaXplIG9mICdcMCcKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFNIT1dfQURIT0NfRU5UUllfSU5GTzoKKwkJCVNob3dfQWRob2NfTWFjVGFibGVfUHJvYyhwQWQsIGV4dHJhKTsKKwkJCXdycS0+bGVuZ3RoID0gc3RybGVuKGV4dHJhKSArIDE7IC8vIDE6IHNpemUgb2YgJ1wwJworCQkJYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcyAtIHVua25vdyBzdWJjbWQgPSAlZFxuIiwgX19mdW5jX18sIHN1YmNtZCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIFN0YXR1czsKK30KKworI2lmZGVmIFNJT0NTSVdNTE1FCitpbnQgcnRfaW9jdGxfc2l3bWxtZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsCisJCQkgICBjaGFyICpleHRyYSkKK3sKKwlQUlRNUF9BREFQVEVSICAgcEFkID0gKFBSVE1QX0FEQVBURVIpIGRldi0+cHJpdjsKKwlzdHJ1Y3QgaXdfbWxtZSAqcE1sbWUgPSAoc3RydWN0IGl3X21sbWUgKil3cnF1LT5kYXRhLnBvaW50ZXI7CisJTUxNRV9RVUVVRV9FTEVNCQkJCU1zZ0VsZW07CisJTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNUCURpc0Fzc29jUmVxOworCU1MTUVfREVBVVRIX1JFUV9TVFJVQ1QgICAgICBEZUF1dGhSZXE7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT09PiAlc1xuIiwgX19mdW5jX18pKTsKKworCWlmIChwTWxtZSA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXN3aXRjaChwTWxtZS0+Y21kKQorCXsKKyNpZmRlZiBJV19NTE1FX0RFQVVUSAorCQljYXNlIElXX01MTUVfREVBVVRIOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PT4gJXMgLSBJV19NTE1FX0RFQVVUSFxuIiwgX19mdW5jX18pKTsKKwkJCUNPUFlfTUFDX0FERFIoRGVBdXRoUmVxLkFkZHIsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKwkJCURlQXV0aFJlcS5SZWFzb24gPSBwTWxtZS0+cmVhc29uX2NvZGU7CisJCQlNc2dFbGVtLk1zZ0xlbiA9IHNpemVvZihNTE1FX0RFQVVUSF9SRVFfU1RSVUNUKTsKKwkJCU5kaXNNb3ZlTWVtb3J5KE1zZ0VsZW0uTXNnLCAmRGVBdXRoUmVxLCBzaXplb2YoTUxNRV9ERUFVVEhfUkVRX1NUUlVDVCkpOworCQkJTWxtZURlYXV0aFJlcUFjdGlvbihwQWQsICZNc2dFbGVtKTsKKwkJCWlmIChJTkZSQV9PTihwQWQpKQorCQkJeworCQkJICAgIExpbmtEb3duKHBBZCwgRkFMU0UpOworCQkJICAgIHBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlID0gQVNTT0NfSURMRTsKKwkJCX0KKwkJCWJyZWFrOworI2VuZGlmIC8vIElXX01MTUVfREVBVVRIIC8vCisjaWZkZWYgSVdfTUxNRV9ESVNBU1NPQworCQljYXNlIElXX01MTUVfRElTQVNTT0M6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT09PiAlcyAtIElXX01MTUVfRElTQVNTT0NcbiIsIF9fZnVuY19fKSk7CisJCQlDT1BZX01BQ19BRERSKERpc0Fzc29jUmVxLkFkZHIsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKwkJCURpc0Fzc29jUmVxLlJlYXNvbiA9ICBwTWxtZS0+cmVhc29uX2NvZGU7CisKKwkJCU1zZ0VsZW0uTWFjaGluZSA9IEFTU09DX1NUQVRFX01BQ0hJTkU7CisJCQlNc2dFbGVtLk1zZ1R5cGUgPSBNVDJfTUxNRV9ESVNBU1NPQ19SRVE7CisJCQlNc2dFbGVtLk1zZ0xlbiA9IHNpemVvZihNTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1QpOworCQkJTmRpc01vdmVNZW1vcnkoTXNnRWxlbS5Nc2csICZEaXNBc3NvY1JlcSwgc2l6ZW9mKE1MTUVfRElTQVNTT0NfUkVRX1NUUlVDVCkpOworCisJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX09JRF9ESVNBU1NPQzsKKwkJCU1sbWVEaXNhc3NvY1JlcUFjdGlvbihwQWQsICZNc2dFbGVtKTsKKwkJCWJyZWFrOworI2VuZGlmIC8vIElXX01MTUVfRElTQVNTT0MgLy8KKwkJZGVmYXVsdDoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT0+ICVzIC0gVW5rbm93IENvbW1hbmRcbiIsIF9fZnVuY19fKSk7CisJCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvLyBTSU9DU0lXTUxNRSAvLworCisjaWYgV0lSRUxFU1NfRVhUID4gMTcKK2ludCBydF9pb2N0bF9zaXdhdXRoKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCVBSVE1QX0FEQVBURVIgICBwQWRhcHRlciA9IChQUlRNUF9BREFQVEVSKSBkZXYtPnByaXY7CisJc3RydWN0IGl3X3BhcmFtICpwYXJhbSA9ICZ3cnF1LT5wYXJhbTsKKworICAgIC8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCisJaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQorCXsKKyAgCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisgICAgCXJldHVybiAtRU5FVERPV047CisJfQorCXN3aXRjaCAocGFyYW0tPmZsYWdzICYgSVdfQVVUSF9JTkRFWCkgeworICAgIAljYXNlIElXX0FVVEhfV1BBX1ZFUlNJT046CisgICAgICAgICAgICBpZiAocGFyYW0tPnZhbHVlID09IElXX0FVVEhfV1BBX1ZFUlNJT05fV1BBKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0s7CisJCQkJaWYgKHBBZGFwdGVyLT5TdGFDZmcuQnNzVHlwZSA9PSBCU1NfQURIT0MpCisJCQkJCXBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAocGFyYW0tPnZhbHVlID09IElXX0FVVEhfV1BBX1ZFUlNJT05fV1BBMikKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSzsKKworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0FVVEhfV1BBX1ZFUlNJT04gLSBwYXJhbS0+dmFsdWUgPSAlZCFcbiIsIF9fZnVuY19fLCBwYXJhbS0+dmFsdWUpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIAljYXNlIElXX0FVVEhfQ0lQSEVSX1BBSVJXSVNFOgorICAgICAgICAgICAgaWYgKHBhcmFtLT52YWx1ZSA9PSBJV19BVVRIX0NJUEhFUl9OT05FKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzID0gTmRpczgwMl8xMVdFUERpc2FibGVkOworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuT3JpZ1dlcFN0YXR1cyA9IHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzOworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuUGFpckNpcGhlciA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHBhcmFtLT52YWx1ZSA9PSBJV19BVVRIX0NJUEhFUl9XRVA0MCB8fAorICAgICAgICAgICAgICAgICAgICAgcGFyYW0tPnZhbHVlID09IElXX0FVVEhfQ0lQSEVSX1dFUDEwNCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cyA9IE5kaXM4MDJfMTFXRVBFbmFibGVkOworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuT3JpZ1dlcFN0YXR1cyA9IHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzOworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuUGFpckNpcGhlciA9IE5kaXM4MDJfMTFXRVBFbmFibGVkOworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLklFRUU4MDIxWCA9IEZBTFNFOworI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHBhcmFtLT52YWx1ZSA9PSBJV19BVVRIX0NJUEhFUl9US0lQKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzID0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZDsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLk9yaWdXZXBTdGF0dXMgPSBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1czsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLlBhaXJDaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAocGFyYW0tPnZhbHVlID09IElXX0FVVEhfQ0lQSEVSX0NDTVApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXMgPSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkOworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuT3JpZ1dlcFN0YXR1cyA9IHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzOworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuUGFpckNpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6SVdfQVVUSF9DSVBIRVJfUEFJUldJU0UgLSBwYXJhbS0+dmFsdWUgPSAlZCFcbiIsIF9fZnVuY19fLCBwYXJhbS0+dmFsdWUpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIAljYXNlIElXX0FVVEhfQ0lQSEVSX0dST1VQOgorICAgICAgICAgICAgaWYgKHBhcmFtLT52YWx1ZSA9PSBJV19BVVRIX0NJUEhFUl9OT05FKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuR3JvdXBDaXBoZXIgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChwYXJhbS0+dmFsdWUgPT0gSVdfQVVUSF9DSVBIRVJfV0VQNDAgfHwKKyAgICAgICAgICAgICAgICAgICAgIHBhcmFtLT52YWx1ZSA9PSBJV19BVVRIX0NJUEhFUl9XRVAxMDQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5Hcm91cENpcGhlciA9IE5kaXM4MDJfMTFXRVBFbmFibGVkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAocGFyYW0tPnZhbHVlID09IElXX0FVVEhfQ0lQSEVSX1RLSVApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5Hcm91cENpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChwYXJhbS0+dmFsdWUgPT0gSVdfQVVUSF9DSVBIRVJfQ0NNUCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpJV19BVVRIX0NJUEhFUl9HUk9VUCAtIHBhcmFtLT52YWx1ZSA9ICVkIVxuIiwgX19mdW5jX18sIHBhcmFtLT52YWx1ZSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgCWNhc2UgSVdfQVVUSF9LRVlfTUdNVDoKKyAgICAgICAgICAgIGlmIChwYXJhbS0+dmFsdWUgPT0gSVdfQVVUSF9LRVlfTUdNVF84MDJfMVgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTsKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuSUVFRTgwMjFYID0gRkFMU0U7CisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMjsKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuSUVFRTgwMjFYID0gRkFMU0U7CisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworICAgICAgICAgICAgICAgIH0KKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAvLyBXRVAgMXgKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5JRUVFODAyMVggPSBUUlVFOworI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHBhcmFtLT52YWx1ZSA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vcEFkYXB0ZXItPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEOworCQkJCVNUQV9QT1JUX1NFQ1VSRUQocEFkYXB0ZXIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0FVVEhfS0VZX01HTVQgLSBwYXJhbS0+dmFsdWUgPSAlZCFcbiIsIF9fZnVuY19fLCBwYXJhbS0+dmFsdWUpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIAljYXNlIElXX0FVVEhfUlhfVU5FTkNSWVBURURfRUFQT0w6CisgICAgICAgICAgICBicmVhazsKKyAgICAJY2FzZSBJV19BVVRIX1BSSVZBQ1lfSU5WT0tFRDoKKyAgICAgICAgICAgIC8qaWYgKHBhcmFtLT52YWx1ZSA9PSAwKQorCQkJeworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVPcGVuOworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzID0gTmRpczgwMl8xMVdFUERpc2FibGVkOworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuT3JpZ1dlcFN0YXR1cyA9IHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzOworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuUGFpckNpcGhlciA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKKyAgICAgICAgCSAgICBwQWRhcHRlci0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID0gTmRpczgwMl8xMVdFUERpc2FibGVkOworICAgICAgICAgICAgfSovCisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6SVdfQVVUSF9QUklWQUNZX0lOVk9LRUQgLSBwYXJhbS0+dmFsdWUgPSAlZCFcbiIsIF9fZnVuY19fLCBwYXJhbS0+dmFsdWUpKTsKKyAgICAJCWJyZWFrOworICAgIAljYXNlIElXX0FVVEhfRFJPUF9VTkVOQ1JZUFRFRDoKKyAgICAgICAgICAgIGlmIChwYXJhbS0+dmFsdWUgIT0gMCkKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX05PVF9TRUNVUkVEOworCQkJZWxzZQorCQkJeworICAgICAgICAgICAgICAgIC8vcEFkYXB0ZXItPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEOworCQkJCVNUQV9QT1JUX1NFQ1VSRUQocEFkYXB0ZXIpOworCQkJfQorICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0FVVEhfV1BBX1ZFUlNJT04gLSBwYXJhbS0+dmFsdWUgPSAlZCFcbiIsIF9fZnVuY19fLCBwYXJhbS0+dmFsdWUpKTsKKyAgICAJCWJyZWFrOworICAgIAljYXNlIElXX0FVVEhfODAyMTFfQVVUSF9BTEc6CisJCQlpZiAocGFyYW0tPnZhbHVlICYgSVdfQVVUSF9BTEdfU0hBUkVEX0tFWSkKKyAgICAgICAgICAgIHsKKwkJCQlwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlU2hhcmVkOworCQkJfQorICAgICAgICAgICAgZWxzZSBpZiAocGFyYW0tPnZhbHVlICYgSVdfQVVUSF9BTEdfT1BFTl9TWVNURU0pCisgICAgICAgICAgICB7CisJCQkJcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZU9wZW47CisJCQl9CisgICAgICAgICAgICBlbHNlCisJCQkJcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6SVdfQVVUSF84MDIxMV9BVVRIX0FMRyAtIHBhcmFtLT52YWx1ZSA9ICVkIVxuIiwgX19mdW5jX18sIHBhcmFtLT52YWx1ZSkpOworCQkJYnJlYWs7CisgICAgCWNhc2UgSVdfQVVUSF9XUEFfRU5BQkxFRDoKKyAgICAJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpJV19BVVRIX1dQQV9FTkFCTEVEIC0gRHJpdmVyIHN1cHBvcnRzIFdQQSEocGFyYW0tPnZhbHVlID0gJWQpXG4iLCBfX2Z1bmNfXywgcGFyYW0tPnZhbHVlKSk7CisgICAgCQlicmVhazsKKyAgICAJZGVmYXVsdDoKKyAgICAJCXJldHVybiAtRU9QTk9UU1VQUDsKK30KKworCXJldHVybiAwOworfQorCitpbnQgcnRfaW9jdGxfZ2l3YXV0aChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyID0gKFBSVE1QX0FEQVBURVIpIGRldi0+cHJpdjsKKwlzdHJ1Y3QgaXdfcGFyYW0gKnBhcmFtID0gJndycXUtPnBhcmFtOworCisgICAgLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KKwlpZighUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCisgICAgeworICAJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKyAgICAJcmV0dXJuIC1FTkVURE9XTjsKKyAgICB9CisKKwlzd2l0Y2ggKHBhcmFtLT5mbGFncyAmIElXX0FVVEhfSU5ERVgpIHsKKwljYXNlIElXX0FVVEhfRFJPUF9VTkVOQ1JZUFRFRDoKKyAgICAgICAgcGFyYW0tPnZhbHVlID0gKHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFXRVBEaXNhYmxlZCkgPyAwIDogMTsKKwkJYnJlYWs7CisKKwljYXNlIElXX0FVVEhfODAyMTFfQVVUSF9BTEc6CisgICAgICAgIHBhcmFtLT52YWx1ZSA9IChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVNoYXJlZCkgPyBJV19BVVRIX0FMR19TSEFSRURfS0VZIDogSVdfQVVUSF9BTEdfT1BFTl9TWVNURU07CisJCWJyZWFrOworCisJY2FzZSBJV19BVVRIX1dQQV9FTkFCTEVEOgorCQlwYXJhbS0+dmFsdWUgPSAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpID8gMSA6IDA7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KKyAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJydF9pb2N0bF9naXdhdXRoOjpwYXJhbS0+dmFsdWUgPSAlZCFcbiIsIHBhcmFtLT52YWx1ZSkpOworCXJldHVybiAwOworfQorCit2b2lkIGZuU2V0Q2lwaGVyS2V5KAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIElOVCAgICAgICAgICAgICBrZXlJZHgsCisgICAgSU4gIFVDSEFSICAgICAgICAgICBDaXBoZXJBbGcsCisgICAgSU4gIEJPT0xFQU4gICAgICAgICBiR1RLLAorICAgIElOICBzdHJ1Y3QgaXdfZW5jb2RlX2V4dCAqZXh0KQoreworICAgIE5kaXNaZXJvTWVtb3J5KCZwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0sIHNpemVvZihDSVBIRVJfS0VZKSk7CisgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLktleUxlbiA9IExFTl9US0lQX0VLOworICAgIE5kaXNNb3ZlTWVtb3J5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5LZXksIGV4dC0+a2V5LCBMRU5fVEtJUF9FSyk7CisgICAgTmRpc01vdmVNZW1vcnkocEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLlR4TWljLCBleHQtPmtleSArIExFTl9US0lQX0VLLCBMRU5fVEtJUF9UWE1JQ0spOworICAgIE5kaXNNb3ZlTWVtb3J5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5SeE1pYywgZXh0LT5rZXkgKyBMRU5fVEtJUF9FSyArIExFTl9US0lQX1RYTUlDSywgTEVOX1RLSVBfUlhNSUNLKTsKKyAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOworCisgICAgLy8gVXBkYXRlIGdyb3VwIGtleSBpbmZvcm1hdGlvbiB0byBBU0lDIFNoYXJlZCBLZXkgVGFibGUKKwlBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkYXB0ZXIsCisJCQkJCQkgIEJTUzAsCisJCQkJCQkgIGtleUlkeCwKKwkJCQkJCSAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLkNpcGhlckFsZywKKwkJCQkJCSAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLktleSwKKwkJCQkJCSAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLlR4TWljLAorCQkJCQkJICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uUnhNaWMpOworCisgICAgaWYgKGJHVEspCisgICAgICAgIC8vIFVwZGF0ZSBBU0lDIFdDSUQgYXR0cmlidXRlIHRhYmxlIGFuZCBJVkVJViB0YWJsZQorICAgIAlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZGFwdGVyLAorICAgIAkJCQkJCQkgIEJTUzAsCisgICAgCQkJCQkJCSAga2V5SWR4LAorICAgIAkJCQkJCQkgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5DaXBoZXJBbGcsCisgICAgCQkJCQkJCSAgTlVMTCk7CisgICAgZWxzZQorICAgICAgICAvLyBVcGRhdGUgQVNJQyBXQ0lEIGF0dHJpYnV0ZSB0YWJsZSBhbmQgSVZFSVYgdGFibGUKKyAgICAJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWRhcHRlciwKKyAgICAJCQkJCQkJICBCU1MwLAorICAgIAkJCQkJCQkgIGtleUlkeCwKKyAgICAJCQkJCQkJICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uQ2lwaGVyQWxnLAorICAgIAkJCQkJCQkgICZwQWRhcHRlci0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0pOworfQorCitpbnQgcnRfaW9jdGxfc2l3ZW5jb2RlZXh0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwKKwkJCSAgIGNoYXIgKmV4dHJhKQorCQkJeworICAgIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciA9IChQUlRNUF9BREFQVEVSKSBkZXYtPnByaXY7CisJc3RydWN0IGl3X3BvaW50ICplbmNvZGluZyA9ICZ3cnF1LT5lbmNvZGluZzsKKwlzdHJ1Y3QgaXdfZW5jb2RlX2V4dCAqZXh0ID0gKHN0cnVjdCBpd19lbmNvZGVfZXh0ICopZXh0cmE7CisgICAgaW50IGtleUlkeCwgYWxnID0gZXh0LT5hbGc7CisKKyAgICAvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgorCWlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKKwl7CisgIAkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOworICAgIAlyZXR1cm4gLUVORVRET1dOOworCX0KKworICAgIGlmIChlbmNvZGluZy0+ZmxhZ3MgJiBJV19FTkNPREVfRElTQUJMRUQpCisJeworICAgICAgICBrZXlJZHggPSAoZW5jb2RpbmctPmZsYWdzICYgSVdfRU5DT0RFX0lOREVYKSAtIDE7CisgICAgICAgIC8vIHNldCBCU1NJRCB3Y2lkIGVudHJ5IG9mIHRoZSBQYWlyLXdpc2UgS2V5IHRhYmxlIGFzIG5vLXNlY3VyaXR5IG1vZGUKKwkgICAgQXNpY1JlbW92ZVBhaXJ3aXNlS2V5RW50cnkocEFkYXB0ZXIsIEJTUzAsIEJTU0lEX1dDSUQpOworICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uS2V5TGVuID0gMDsKKwkJcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLkNpcGhlckFsZyA9IENJUEhFUl9OT05FOworCQlBc2ljUmVtb3ZlU2hhcmVkS2V5RW50cnkocEFkYXB0ZXIsIDAsIChVQ0hBUilrZXlJZHgpOworICAgICAgICBOZGlzWmVyb01lbW9yeSgmcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLCBzaXplb2YoQ0lQSEVSX0tFWSkpOworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6UmVtb3ZlIGFsbCBrZXlzIShlbmNvZGluZy0+ZmxhZ3MgPSAleClcbiIsIF9fZnVuY19fLCBlbmNvZGluZy0+ZmxhZ3MpKTsKKyAgICB9CisJCQkJCWVsc2UKKyAgICB7CisgICAgICAgIC8vIEdldCBLZXkgSW5kZXggYW5kIGNvbnZldCB0byBvdXIgb3duIGRlZmluZWQga2V5IGluZGV4CisgICAgCWtleUlkeCA9IChlbmNvZGluZy0+ZmxhZ3MgJiBJV19FTkNPREVfSU5ERVgpIC0gMTsKKyAgICAJaWYoKGtleUlkeCA8IDApIHx8IChrZXlJZHggPj0gTlJfV0VQX0tFWVMpKQorICAgIAkJcmV0dXJuIC1FSU5WQUw7CisKKyAgICAgICAgaWYgKGV4dC0+ZXh0X2ZsYWdzICYgSVdfRU5DT0RFX0VYVF9TRVRfVFhfS0VZKQorICAgICAgICB7CisgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCA9IGtleUlkeDsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpEZWZhdWx0S2V5SWQgPSAlZFxuIiwgX19mdW5jX18sIHBBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkKSk7CisgICAgICAgIH0KKworICAgICAgICBzd2l0Y2ggKGFsZykgeworICAgIAkJY2FzZSBJV19FTkNPREVfQUxHX05PTkU6CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0VOQ09ERV9BTEdfTk9ORVxuIiwgX19mdW5jX18pKTsKKyAgICAJCQlicmVhazsKKyAgICAJCWNhc2UgSVdfRU5DT0RFX0FMR19XRVA6CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0VOQ09ERV9BTEdfV0VQIC0gZXh0LT5rZXlfbGVuID0gJWQsIGtleUlkeCA9ICVkXG4iLCBfX2Z1bmNfXywgZXh0LT5rZXlfbGVuLCBrZXlJZHgpKTsKKyAgICAJCQlpZiAoZXh0LT5rZXlfbGVuID09IE1BWF9XRVBfS0VZX1NJWkUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAJCQlwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uS2V5TGVuID0gTUFYX1dFUF9LRVlfU0laRTsKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLkNpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7CisJCQkJfQorICAgICAgICAJCWVsc2UgaWYgKGV4dC0+a2V5X2xlbiA9PSBNSU5fV0VQX0tFWV9TSVpFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLktleUxlbiA9IE1JTl9XRVBfS0VZX1NJWkU7CisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5DaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7CisJCQl9CisgICAgICAgIAkJZWxzZQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKworICAgICAgICAgICAgICAgIE5kaXNaZXJvTWVtb3J5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5LZXksICAxNik7CisJCQkgICAgTmRpc01vdmVNZW1vcnkocEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLktleSwgZXh0LT5rZXksIGV4dC0+a2V5X2xlbik7CisgICAgCQkJYnJlYWs7CisgICAgICAgICAgICBjYXNlIElXX0VOQ09ERV9BTEdfVEtJUDoKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6SVdfRU5DT0RFX0FMR19US0lQIC0ga2V5SWR4ID0gJWQsIGV4dC0+a2V5X2xlbiA9ICVkXG4iLCBfX2Z1bmNfXywga2V5SWR4LCBleHQtPmtleV9sZW4pKTsKKyAgICAgICAgICAgICAgICBpZiAoZXh0LT5rZXlfbGVuID09IDMyKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dC0+ZXh0X2ZsYWdzICYgSVdfRU5DT0RFX0VYVF9TRVRfVFhfS0VZKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBmblNldENpcGhlcktleShwQWRhcHRlciwga2V5SWR4LCBDSVBIRVJfVEtJUCwgRkFMU0UsIGV4dCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vcEFkYXB0ZXItPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNUQV9QT1JUX1NFQ1VSRUQocEFkYXB0ZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCQl9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGV4dC0+ZXh0X2ZsYWdzICYgSVdfRU5DT0RFX0VYVF9HUk9VUF9LRVkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZuU2V0Q2lwaGVyS2V5KHBBZGFwdGVyLCBrZXlJZHgsIENJUEhFUl9US0lQLCBUUlVFLCBleHQpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXQgODAyLjF4IHBvcnQgY29udHJvbAorICAgICAgICAgICAgCSAgICAgICAgLy9wQWRhcHRlci0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQ7CisgICAgICAgICAgICAJICAgICAgICBTVEFfUE9SVF9TRUNVUkVEKHBBZGFwdGVyKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBJV19FTkNPREVfQUxHX0NDTVA6CisgICAgICAgICAgICAgICAgaWYgKGV4dC0+ZXh0X2ZsYWdzICYgSVdfRU5DT0RFX0VYVF9TRVRfVFhfS0VZKQorCQl7CisgICAgICAgICAgICAgICAgICAgIGZuU2V0Q2lwaGVyS2V5KHBBZGFwdGVyLCBrZXlJZHgsIENJUEhFUl9BRVMsIEZBTFNFLCBleHQpOworICAgICAgICAgICAgICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyKQorICAgICAgICAgICAgICAgICAgICAJLy9wQWRhcHRlci0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQ7CisgICAgICAgICAgICAgICAgICAgIAlTVEFfUE9SVF9TRUNVUkVEKHBBZGFwdGVyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoZXh0LT5leHRfZmxhZ3MgJiBJV19FTkNPREVfRVhUX0dST1VQX0tFWSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZuU2V0Q2lwaGVyS2V5KHBBZGFwdGVyLCBrZXlJZHgsIENJUEhFUl9BRVMsIFRSVUUsIGV4dCk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gc2V0IDgwMi4xeCBwb3J0IGNvbnRyb2wKKyAgICAgICAgCSAgICAgICAgLy9wQWRhcHRlci0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQ7CisgICAgICAgIAkgICAgICAgIFNUQV9QT1JUX1NFQ1VSRUQocEFkYXB0ZXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAJCWRlZmF1bHQ6CisgICAgCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworaW50CitydF9pb2N0bF9naXdlbmNvZGVleHQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJUFJUTVBfQURBUFRFUiBwQWQgPSAoUFJUTVBfQURBUFRFUikgZGV2LT5wcml2OworCVBDSEFSIHBLZXkgPSBOVUxMOworCXN0cnVjdCBpd19wb2ludCAqZW5jb2RpbmcgPSAmd3JxdS0+ZW5jb2Rpbmc7CisJc3RydWN0IGl3X2VuY29kZV9leHQgKmV4dCA9IChzdHJ1Y3QgaXdfZW5jb2RlX2V4dCAqKWV4dHJhOworCWludCBpZHgsIG1heF9rZXlfbGVuOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UgLCgiPT09PiBydF9pb2N0bF9naXdlbmNvZGVleHRcbiIpKTsKKworCW1heF9rZXlfbGVuID0gZW5jb2RpbmctPmxlbmd0aCAtIHNpemVvZigqZXh0KTsKKwlpZiAobWF4X2tleV9sZW4gPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlkeCA9IGVuY29kaW5nLT5mbGFncyAmIElXX0VOQ09ERV9JTkRFWDsKKwlpZiAoaWR4KQorCXsKKwkJaWYgKGlkeCA8IDEgfHwgaWR4ID4gNCkKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZHgtLTsKKworCQlpZiAoKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKSB8fAorCQkJKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKSkKKwkJeworCQkJaWYgKGlkeCAhPSBwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQpCisJCQl7CisJCQkJZXh0LT5rZXlfbGVuID0gMDsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfQorCX0KKwllbHNlCisJCWlkeCA9IHBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZDsKKworCWVuY29kaW5nLT5mbGFncyA9IGlkeCArIDE7CisJbWVtc2V0KGV4dCwgMCwgc2l6ZW9mKCpleHQpKTsKKworCWV4dC0+a2V5X2xlbiA9IDA7CisJc3dpdGNoKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cykgeworCQljYXNlIE5kaXM4MDJfMTFXRVBEaXNhYmxlZDoKKwkJCWV4dC0+YWxnID0gSVdfRU5DT0RFX0FMR19OT05FOworCQkJZW5jb2RpbmctPmZsYWdzIHw9IElXX0VOQ09ERV9ESVNBQkxFRDsKKwkJCWJyZWFrOworCQljYXNlIE5kaXM4MDJfMTFXRVBFbmFibGVkOgorCQkJZXh0LT5hbGcgPSBJV19FTkNPREVfQUxHX1dFUDsKKwkJCWlmIChwQWQtPlNoYXJlZEtleVtCU1MwXVtpZHhdLktleUxlbiA+IG1heF9rZXlfbGVuKQorCQkJCXJldHVybiAtRTJCSUc7CisJCQllbHNlCisJCQl7CisJCQkJZXh0LT5rZXlfbGVuID0gcEFkLT5TaGFyZWRLZXlbQlNTMF1baWR4XS5LZXlMZW47CisJCQkJcEtleSA9ICYocEFkLT5TaGFyZWRLZXlbQlNTMF1baWR4XS5LZXlbMF0pOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZDoKKwkJY2FzZSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkOgorCQkJaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKQorCQkJCWV4dC0+YWxnID0gSVdfRU5DT0RFX0FMR19US0lQOworCQkJZWxzZQorCQkJCWV4dC0+YWxnID0gSVdfRU5DT0RFX0FMR19DQ01QOworCisJCQlpZiAobWF4X2tleV9sZW4gPCAzMikKKwkJCQlyZXR1cm4gLUUyQklHOworCQkJZWxzZQorCQkJeworCQkJCWV4dC0+a2V5X2xlbiA9IDMyOworCQkJCXBLZXkgPSAmcEFkLT5TdGFDZmcuUE1LWzBdOworCQkJfQorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoZXh0LT5rZXlfbGVuICYmIHBLZXkpCisJeworCQllbmNvZGluZy0+ZmxhZ3MgfD0gSVdfRU5DT0RFX0VOQUJMRUQ7CisJCW1lbWNweShleHQtPmtleSwgcEtleSwgZXh0LT5rZXlfbGVuKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIFNJT0NTSVdHRU5JRQoraW50IHJ0X2lvY3RsX3Npd2dlbmllKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCVBSVE1QX0FEQVBURVIgICBwQWQgPSAoUFJUTVBfQURBUFRFUikgZGV2LT5wcml2OworCisJaWYgKHdycXUtPmRhdGEubGVuZ3RoID4gTUFYX0xFTl9PRl9SU05JRSB8fAorCSAgICAod3JxdS0+ZGF0YS5sZW5ndGggJiYgZXh0cmEgPT0gTlVMTCkpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHdycXUtPmRhdGEubGVuZ3RoKQorCXsKKwkJcEFkLT5TdGFDZmcuUlNOSUVfTGVuID0gd3JxdS0+ZGF0YS5sZW5ndGg7CisJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPlN0YUNmZy5SU05fSUVbMF0sIGV4dHJhLCBwQWQtPlN0YUNmZy5SU05JRV9MZW4pOworCX0KKwllbHNlCisJeworCQlwQWQtPlN0YUNmZy5SU05JRV9MZW4gPSAwOworCQlOZGlzWmVyb01lbW9yeSgmcEFkLT5TdGFDZmcuUlNOX0lFWzBdLCBNQVhfTEVOX09GX1JTTklFKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvLyBTSU9DU0lXR0VOSUUgLy8KKworaW50IHJ0X2lvY3RsX2dpd2dlbmllKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlQUlRNUF9BREFQVEVSICAgcEFkID0gKFBSVE1QX0FEQVBURVIpIGRldi0+cHJpdjsKKworCWlmICgocEFkLT5TdGFDZmcuUlNOSUVfTGVuID09IDApIHx8CisJCShwQWQtPlN0YUNmZy5BdXRoTW9kZSA8IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkpCisJeworCQl3cnF1LT5kYXRhLmxlbmd0aCA9IDA7CisJCXJldHVybiAwOworCX0KKworI2lmZGVmIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisjaWZkZWYgU0lPQ1NJV0dFTklFCisJaWYgKHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCA9PSBXUEFfU1VQUExJQ0FOVF9FTkFCTEUpCisJeworCWlmICh3cnF1LT5kYXRhLmxlbmd0aCA8IHBBZC0+U3RhQ2ZnLlJTTklFX0xlbikKKwkJcmV0dXJuIC1FMkJJRzsKKworCXdycXUtPmRhdGEubGVuZ3RoID0gcEFkLT5TdGFDZmcuUlNOSUVfTGVuOworCW1lbWNweShleHRyYSwgJnBBZC0+U3RhQ2ZnLlJTTl9JRVswXSwgcEFkLT5TdGFDZmcuUlNOSUVfTGVuKTsKKwl9CisJZWxzZQorI2VuZGlmIC8vIFNJT0NTSVdHRU5JRSAvLworI2VuZGlmIC8vIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisJeworCQlVQ0hBUiBSU05JZSA9IElFX1dQQTsKKworCQlpZiAod3JxdS0+ZGF0YS5sZW5ndGggPCAocEFkLT5TdGFDZmcuUlNOSUVfTGVuICsgMikpIC8vIElELCBMZW4KKwkJCXJldHVybiAtRTJCSUc7CisJCXdycXUtPmRhdGEubGVuZ3RoID0gcEFkLT5TdGFDZmcuUlNOSUVfTGVuICsgMjsKKworCQlpZiAoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spIHx8CisgICAgICAgICAgICAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikpCisJCQlSU05JZSA9IElFX1JTTjsKKworCQlleHRyYVswXSA9IChjaGFyKVJTTkllOworCQlleHRyYVsxXSA9IHBBZC0+U3RhQ2ZnLlJTTklFX0xlbjsKKwkJbWVtY3B5KGV4dHJhKzIsICZwQWQtPlN0YUNmZy5SU05fSUVbMF0sIHBBZC0+U3RhQ2ZnLlJTTklFX0xlbik7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCBydF9pb2N0bF9zaXdwbWtzYShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsCisJCQkgICBjaGFyICpleHRyYSkKK3sKKwlQUlRNUF9BREFQVEVSICAgcEFkID0gKFBSVE1QX0FEQVBURVIpIGRldi0+cHJpdjsKKwlzdHJ1Y3QgaXdfcG1rc2EgKnBQbWtzYSA9IChzdHJ1Y3QgaXdfcG1rc2EgKil3cnF1LT5kYXRhLnBvaW50ZXI7CisJSU5UCUNhY2hlZElkeCA9IDAsIGlkeCA9IDA7CisKKwlpZiAocFBta3NhID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UgLCgiPT09PiBydF9pb2N0bF9zaXdwbWtzYVxuIikpOworCXN3aXRjaChwUG1rc2EtPmNtZCkKKwl7CisJCWNhc2UgSVdfUE1LU0FfRkxVU0g6CisJCQlOZGlzWmVyb01lbW9yeShwQWQtPlN0YUNmZy5TYXZlZFBNSywgc2l6ZW9mKEJTU0lEX0lORk8pKlBNS0lEX05PKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoInJ0X2lvY3RsX3Npd3Bta3NhIC0gSVdfUE1LU0FfRkxVU0hcbiIpKTsKKwkJCWJyZWFrOworCQljYXNlIElXX1BNS1NBX1JFTU9WRToKKwkJCWZvciAoQ2FjaGVkSWR4ID0gMDsgQ2FjaGVkSWR4IDwgcEFkLT5TdGFDZmcuU2F2ZWRQTUtOdW07IENhY2hlZElkeCsrKQorCQkJeworCQkgICAgICAgIC8vIGNvbXBhcmUgdGhlIEJTU0lECisJCSAgICAgICAgaWYgKE5kaXNFcXVhbE1lbW9yeShwUG1rc2EtPmJzc2lkLnNhX2RhdGEsIHBBZC0+U3RhQ2ZnLlNhdmVkUE1LW0NhY2hlZElkeF0uQlNTSUQsIE1BQ19BRERSX0xFTikpCisJCSAgICAgICAgeworCQkgICAgICAgIAlOZGlzWmVyb01lbW9yeShwQWQtPlN0YUNmZy5TYXZlZFBNS1tDYWNoZWRJZHhdLkJTU0lELCBNQUNfQUREUl9MRU4pOworCQkJCQlOZGlzWmVyb01lbW9yeShwQWQtPlN0YUNmZy5TYXZlZFBNS1tDYWNoZWRJZHhdLlBNS0lELCAxNik7CisJCQkJCWZvciAoaWR4ID0gQ2FjaGVkSWR4OyBpZHggPCAocEFkLT5TdGFDZmcuU2F2ZWRQTUtOdW0gLSAxKTsgaWR4KyspCisJCQkJCXsKKwkJCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPlN0YUNmZy5TYXZlZFBNS1tpZHhdLkJTU0lEWzBdLCAmcEFkLT5TdGFDZmcuU2F2ZWRQTUtbaWR4KzFdLkJTU0lEWzBdLCBNQUNfQUREUl9MRU4pOworCQkJCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+U3RhQ2ZnLlNhdmVkUE1LW2lkeF0uUE1LSURbMF0sICZwQWQtPlN0YUNmZy5TYXZlZFBNS1tpZHgrMV0uUE1LSURbMF0sIDE2KTsKKwkJCQkJfQorCQkJCQlwQWQtPlN0YUNmZy5TYXZlZFBNS051bS0tOworCQkJICAgICAgICBicmVhazsKKwkJICAgICAgICB9CisJICAgICAgICB9CisKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoInJ0X2lvY3RsX3Npd3Bta3NhIC0gSVdfUE1LU0FfUkVNT1ZFXG4iKSk7CisJCQlicmVhazsKKwkJY2FzZSBJV19QTUtTQV9BREQ6CisJCQlmb3IgKENhY2hlZElkeCA9IDA7IENhY2hlZElkeCA8IHBBZC0+U3RhQ2ZnLlNhdmVkUE1LTnVtOyBDYWNoZWRJZHgrKykKKwkJCXsKKwkJICAgICAgICAvLyBjb21wYXJlIHRoZSBCU1NJRAorCQkgICAgICAgIGlmIChOZGlzRXF1YWxNZW1vcnkocFBta3NhLT5ic3NpZC5zYV9kYXRhLCBwQWQtPlN0YUNmZy5TYXZlZFBNS1tDYWNoZWRJZHhdLkJTU0lELCBNQUNfQUREUl9MRU4pKQorCQkJICAgICAgICBicmVhazsKKwkgICAgICAgIH0KKworCSAgICAgICAgLy8gRm91bmQsIHJlcGxhY2UgaXQKKwkgICAgICAgIGlmIChDYWNoZWRJZHggPCBQTUtJRF9OTykKKwkgICAgICAgIHsKKwkJICAgICAgICBEQkdQUklOVChSVF9ERUJVR19PRkYsICgiVXBkYXRlIFBNS0lELCBpZHggPSAlZFxuIiwgQ2FjaGVkSWR4KSk7CisJCSAgICAgICAgTmRpc01vdmVNZW1vcnkoJnBBZC0+U3RhQ2ZnLlNhdmVkUE1LW0NhY2hlZElkeF0uQlNTSURbMF0sIHBQbWtzYS0+YnNzaWQuc2FfZGF0YSwgTUFDX0FERFJfTEVOKTsKKwkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5TdGFDZmcuU2F2ZWRQTUtbQ2FjaGVkSWR4XS5QTUtJRFswXSwgcFBta3NhLT5wbWtpZCwgMTYpOworCQkgICAgICAgIHBBZC0+U3RhQ2ZnLlNhdmVkUE1LTnVtKys7CisJICAgICAgICB9CisJICAgICAgICAvLyBOb3QgZm91bmQsIHJlcGxhY2UgdGhlIGxhc3Qgb25lCisJICAgICAgICBlbHNlCisJICAgICAgICB7CisJCSAgICAgICAgLy8gUmFuZG9tbHkgcmVwbGFjZSBvbmUKKwkJICAgICAgICBDYWNoZWRJZHggPSAocFBta3NhLT5ic3NpZC5zYV9kYXRhWzVdICUgUE1LSURfTk8pOworCQkgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX09GRiwgKCJVcGRhdGUgUE1LSUQsIGlkeCA9ICVkXG4iLCBDYWNoZWRJZHgpKTsKKwkJICAgICAgICBOZGlzTW92ZU1lbW9yeSgmcEFkLT5TdGFDZmcuU2F2ZWRQTUtbQ2FjaGVkSWR4XS5CU1NJRFswXSwgcFBta3NhLT5ic3NpZC5zYV9kYXRhLCBNQUNfQUREUl9MRU4pOworCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPlN0YUNmZy5TYXZlZFBNS1tDYWNoZWRJZHhdLlBNS0lEWzBdLCBwUG1rc2EtPnBta2lkLCAxNik7CisJICAgICAgICB9CisKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoInJ0X2lvY3RsX3Npd3Bta3NhIC0gSVdfUE1LU0FfQUREXG4iKSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoInJ0X2lvY3RsX3Npd3Bta3NhIC0gVW5rbm93IENvbW1hbmQhIVxuIikpOworCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisjZW5kaWYgLy8gI2lmIFdJUkVMRVNTX0VYVCA+IDE3CisKKyNpZmRlZiBEQkcKK3N0YXRpYyBpbnQKK3J0X3ByaXZhdGVfaW9jdGxfYmJwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCXN0cnVjdCBpd19wb2ludCAqd3JxLCBjaGFyICpleHRyYSkKKwkJCXsKKwlDSEFSCQkJCSp0aGlzX2NoYXI7CisJQ0hBUgkJCQkqdmFsdWUgPSBOVUxMOworCVVDSEFSCQkJCXJlZ0JCUCA9IDA7CisvLwlDSEFSCQkJCWFyZ1syNTVdPXswfTsKKwlVSU5UMzIJCQkJYmJwSWQ7CisJVUlOVDMyCQkJCWJicFZhbHVlOworCUJPT0xFQU4JCQkJYklzUHJpbnRBbGxCQlAgPSBGQUxTRTsKKwlJTlQJCQkJCVN0YXR1cyA9IDA7CisgICAgUFJUTVBfQURBUFRFUiAgICAgICBwQWRhcHRlciA9IChQUlRNUF9BREFQVEVSKSBkZXYtPnByaXY7CisKKworCW1lbXNldChleHRyYSwgMHgwMCwgSVdfUFJJVl9TSVpFX01BU0spOworCisJaWYgKHdycS0+bGVuZ3RoID4gMSkgLy9ObyBwYXJhbWV0ZXJzLgorCQkJCXsKKwkJc3ByaW50ZihleHRyYSwgIlxuIik7CisKKwkJLy9QYXJzaW5nIFJlYWQgb3IgV3JpdGUKKwkJdGhpc19jaGFyID0gd3JxLT5wb2ludGVyOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJ0aGlzX2NoYXI9JXNcbiIsIHRoaXNfY2hhcikpOworCQlpZiAoISp0aGlzX2NoYXIpCisJCQlnb3RvIG5leHQ7CisKKwkJaWYgKCh2YWx1ZSA9IHJ0c3RyY2hyKHRoaXNfY2hhciwgJz0nKSkgIT0gTlVMTCkKKwkJCSp2YWx1ZSsrID0gMDsKKworCQlpZiAoIXZhbHVlIHx8ICEqdmFsdWUpCisJCXsgLy9SZWFkCisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJ0aGlzX2NoYXI9JXMsIHZhbHVlPSVzXG4iLCB0aGlzX2NoYXIsIHZhbHVlKSk7CisJCQlpZiAoc3NjYW5mKHRoaXNfY2hhciwgIiVkIiwgJihiYnBJZCkpID09IDEpCisJCQl7CisJCQkJaWYgKGJicElkIDw9IDEzNikKKwkJCQl7CisjaWZkZWYgUkFMSU5LX0FURQorCQkJCQlpZiAoQVRFX09OKHBBZGFwdGVyKSkKKwkJCQkJeworCQkJCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkYXB0ZXIsIGJicElkLCAmcmVnQkJQKTsKKwkJCQkJfQorCQkJCQllbHNlCisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCQkJCQl7CisJCQkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWRhcHRlciwgYmJwSWQsICZyZWdCQlApOworCQkJCQl9CisJCQkJCXNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlIlMDJkWzB4JTAyWF06JTAyWFxuIiwgYmJwSWQsIGJicElkKjIsIHJlZ0JCUCk7CisgICAgICAgICAgICAgICAgICAgIHdycS0+bGVuZ3RoID0gc3RybGVuKGV4dHJhKSArIDE7IC8vIDE6IHNpemUgb2YgJ1wwJworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJtc2c9JXNcbiIsIGV4dHJhKSk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7Ly9JbnZhbGlkIHBhcmFtZXRlcywgc28gZGVmYXVsdCBwcmludGsgYWxsIGJicAorCQkJCQliSXNQcmludEFsbEJCUCA9IFRSVUU7CisJCQkJCWdvdG8gbmV4dDsKKwkJCQl9CisJCQl9CisJCQllbHNlCisJCQl7IC8vSW52YWxpZCBwYXJhbWV0ZXMsIHNvIGRlZmF1bHQgcHJpbnRrIGFsbCBiYnAKKwkJCQliSXNQcmludEFsbEJCUCA9IFRSVUU7CisJCQkJZ290byBuZXh0OworCQkJfQorCQl9CisJCWVsc2UKKwkJeyAvL1dyaXRlCisJCQlpZiAoKHNzY2FuZih0aGlzX2NoYXIsICIlZCIsICYoYmJwSWQpKSA9PSAxKSAmJiAoc3NjYW5mKHZhbHVlLCAiJXgiLCAmKGJicFZhbHVlKSkgPT0gMSkpCisJCQl7CisJCQkJaWYgKGJicElkIDw9IDEzNikKKwkJCQl7CisjaWZkZWYgUkFMSU5LX0FURQorCQkJCQlpZiAoQVRFX09OKHBBZGFwdGVyKSkKKwkJCQkJeworCQkJCQkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZGFwdGVyLCBiYnBJZCwgYmJwVmFsdWUpOworCQkJCQkJLy9SZWFkIGl0IGJhY2sgZm9yIHNob3dpbmcKKwkJCQkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZGFwdGVyLCBiYnBJZCwgJnJlZ0JCUCk7CisJCQkJCX0KKwkJCQkJZWxzZQorI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKwkJCQkJeworCQkJCQkgICAgUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWRhcHRlciwgYmJwSWQsIGJicFZhbHVlKTsKKyAgICAJCQkJCS8vUmVhZCBpdCBiYWNrIGZvciBzaG93aW5nCisgICAgCQkJCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkYXB0ZXIsIGJicElkLCAmcmVnQkJQKTsKKwkJCX0KKwkJCQkJc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiUiUwMmRbMHglMDJYXTolMDJYXG4iLCBiYnBJZCwgYmJwSWQqMiwgcmVnQkJQKTsKKyAgICAgICAgICAgICAgICAgICAgd3JxLT5sZW5ndGggPSBzdHJsZW4oZXh0cmEpICsgMTsgLy8gMTogc2l6ZSBvZiAnXDAnCisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIm1zZz0lc1xuIiwgZXh0cmEpKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsvL0ludmFsaWQgcGFyYW1ldGVzLCBzbyBkZWZhdWx0IHByaW50ayBhbGwgYmJwCisJCQkJCWJJc1ByaW50QWxsQkJQID0gVFJVRTsKKwkJCQkJZ290byBuZXh0OworCQkJCX0KKwkJCX0KKwkJCWVsc2UKKwkJCXsgLy9JbnZhbGlkIHBhcmFtZXRlcywgc28gZGVmYXVsdCBwcmludGsgYWxsIGJicAorCQkJCWJJc1ByaW50QWxsQkJQID0gVFJVRTsKKwkJCQlnb3RvIG5leHQ7CisJCQl9CisJCX0KKwkJfQorCWVsc2UKKwkJYklzUHJpbnRBbGxCQlAgPSBUUlVFOworCituZXh0OgorCWlmIChiSXNQcmludEFsbEJCUCkKKwl7CisJCW1lbXNldChleHRyYSwgMHgwMCwgSVdfUFJJVl9TSVpFX01BU0spOworCQlzcHJpbnRmKGV4dHJhLCAiXG4iKTsKKwkJZm9yIChiYnBJZCA9IDA7IGJicElkIDw9IDEzNjsgYmJwSWQrKykKKwkJeworCQkgICAgaWYgKHN0cmxlbihleHRyYSkgPj0gKElXX1BSSVZfU0laRV9NQVNLIC0gMTApKQorICAgICAgICAgICAgICAgIGJyZWFrOworI2lmZGVmIFJBTElOS19BVEUKKwkJCWlmIChBVEVfT04ocEFkYXB0ZXIpKQorCQkJeworCQkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZGFwdGVyLCBiYnBJZCwgJnJlZ0JCUCk7CisJCQl9CisJCQllbHNlCisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZGFwdGVyLCBiYnBJZCwgJnJlZ0JCUCk7CisJCQlzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJSJTAyZFsweCUwMlhdOiUwMlggICAgIiwgYmJwSWQsIGJicElkKjIsIHJlZ0JCUCk7CisJCQlpZiAoYmJwSWQlNSA9PSA0KQorCQkJCXNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlxuIik7CisJCX0KKworICAgICAgICB3cnEtPmxlbmd0aCA9IHN0cmxlbihleHRyYSkgKyAxOyAvLyAxOiBzaXplIG9mICdcMCcKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgid3JxLT5sZW5ndGggPSAlZFxuIiwgd3JxLT5sZW5ndGgpKTsKKwl9CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT1ydF9wcml2YXRlX2lvY3RsX2JicFxuXG4iKSk7CisKKyAgICByZXR1cm4gU3RhdHVzOworfQorI2VuZGlmIC8vIERCRyAvLworCitpbnQgcnRfaW9jdGxfc2l3cmF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCXVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworICAgIFBSVE1QX0FEQVBURVIgICBwQWQgPSAoUFJUTVBfQURBUFRFUikgZGV2LT5wcml2OworICAgIFVJTlQzMiAgICAgICAgICByYXRlID0gd3JxdS0+Yml0cmF0ZS52YWx1ZSwgZml4ZWQgPSB3cnF1LT5iaXRyYXRlLmZpeGVkOworCisgICAgLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KKwlpZighUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQorCXsKKyAgCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJydF9pb2N0bF9zaXdyYXRlOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisgICAgCXJldHVybiAtRU5FVERPV047CisJfQorCisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgicnRfaW9jdGxfc2l3cmF0ZTo6KHJhdGUgPSAlZCwgZml4ZWQgPSAlZClcbiIsIHJhdGUsIGZpeGVkKSk7CisgICAgLyogcmF0ZSA9IC0xID0+IGF1dG8gcmF0ZQorICAgICAgIHJhdGUgPSBYLCBmaXhlZCA9IDEgPT4gKGZpeGVkIHJhdGUgWCkKKyAgICAqLworICAgIGlmIChyYXRlID09IC0xKQorICAgIHsKKwkJLy9BdXRvIFJhdGUKKwkJcEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfQVVUTzsKKwkJcEFkLT5TdGFDZmcuYkF1dG9UeFJhdGVTd2l0Y2ggPSBUUlVFOworCQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPD0gUEhZXzExRykgfHwKKwkJICAgIChwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkhUUGh5TW9kZS5maWVsZC5NT0RFIDw9IE1PREVfT0ZETSkpCisJCQlSVE1QU2V0RGVzaXJlZFJhdGVzKHBBZCwgLTEpOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCVNldENvbW1vbkhUKHBBZCk7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmIChmaXhlZCkKKyAgICAgICAgeworICAgICAgICAJcEFkLT5TdGFDZmcuYkF1dG9UeFJhdGVTd2l0Y2ggPSBGQUxTRTsKKyAgICAgICAgICAgIGlmICgocEFkLT5Db21tb25DZmcuUGh5TW9kZSA8PSBQSFlfMTFHKSB8fAorICAgICAgICAgICAgICAgIChwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkhUUGh5TW9kZS5maWVsZC5NT0RFIDw9IE1PREVfT0ZETSkpCisgICAgICAgICAgICAgICAgUlRNUFNldERlc2lyZWRSYXRlcyhwQWQsIHJhdGUpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTX0FVVE87CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisgICAgICAgICAgICAgICAgU2V0Q29tbW9uSFQocEFkKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoInJ0X2lvY3RsX3Npd3JhdGU6OihIdE1jcz0lZClcbiIscEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFRPRE86IHJhdGUgPSBYLCBmaXhlZCA9IDAgPT4gKHJhdGVzIDw9IFgpCisgICAgICAgICAgICByZXR1cm4gLUVPUE5PVFNVUFA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworaW50IHJ0X2lvY3RsX2dpd3JhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworICAgIFBSVE1QX0FEQVBURVIgICBwQWQgPSAoUFJUTVBfQURBUFRFUikgZGV2LT5wcml2OworICAgIGludCByYXRlX2luZGV4ID0gMCwgcmF0ZV9jb3VudCA9IDA7CisgICAgSFRUUkFOU01JVF9TRVRUSU5HIGh0X3NldHRpbmc7CisgICAgX19zMzIgcmFsaW5rcmF0ZVtdID0KKwl7MiwgIDQsICAgMTEsICAyMiwgLy8gQ0NLCisJMTIsIDE4LCAgIDI0LCAgMzYsIDQ4LCA3MiwgOTYsIDEwOCwgLy8gT0ZETQorCTEzLCAyNiwgICAzOSwgIDUyLCAgNzgsIDEwNCwgMTE3LCAxMzAsIDI2LCAgNTIsICA3OCwgMTA0LCAxNTYsIDIwOCwgMjM0LCAyNjAsIC8vIDIwTUh6LCA4MDBucyBHSSwgTUNTOiAwIH4gMTUKKwkzOSwgNzgsICAxMTcsIDE1NiwgMjM0LCAzMTIsIDM1MSwgMzkwLAkJCQkJCQkJCQkgIC8vIDIwTUh6LCA4MDBucyBHSSwgTUNTOiAxNiB+IDIzCisJMjcsIDU0LCAgIDgxLCAxMDgsIDE2MiwgMjE2LCAyNDMsIDI3MCwgNTQsIDEwOCwgMTYyLCAyMTYsIDMyNCwgNDMyLCA0ODYsIDU0MCwgLy8gNDBNSHosIDgwMG5zIEdJLCBNQ1M6IDAgfiAxNQorCTgxLCAxNjIsIDI0MywgMzI0LCA0ODYsIDY0OCwgNzI5LCA4MTAsCQkJCQkJCQkJCSAgLy8gNDBNSHosIDgwMG5zIEdJLCBNQ1M6IDE2IH4gMjMKKwkxNCwgMjksICAgNDMsICA1NywgIDg3LCAxMTUsIDEzMCwgMTQ0LCAyOSwgNTksICAgODcsIDExNSwgMTczLCAyMzAsIDI2MCwgMjg4LCAvLyAyME1IeiwgNDAwbnMgR0ksIE1DUzogMCB+IDE1CisJNDMsIDg3LCAgMTMwLCAxNzMsIDI2MCwgMzE3LCAzOTAsIDQzMywJCQkJCQkJCQkJICAvLyAyME1IeiwgNDAwbnMgR0ksIE1DUzogMTYgfiAyMworCTMwLCA2MCwgICA5MCwgMTIwLCAxODAsIDI0MCwgMjcwLCAzMDAsIDYwLCAxMjAsIDE4MCwgMjQwLCAzNjAsIDQ4MCwgNTQwLCA2MDAsIC8vIDQwTUh6LCA0MDBucyBHSSwgTUNTOiAwIH4gMTUKKwk5MCwgMTgwLCAyNzAsIDM2MCwgNTQwLCA3MjAsIDgxMCwgOTAwfTsJCQkJCQkJCQkJICAvLyA0ME1IeiwgNDAwbnMgR0ksIE1DUzogMTYgfiAyMworCisgICAgcmF0ZV9jb3VudCA9IHNpemVvZihyYWxpbmtyYXRlKS9zaXplb2YoX19zMzIpOworICAgIC8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCisJaWYoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKKwl7CisgIAkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOworICAgIAlyZXR1cm4gLUVORVRET1dOOworCX0KKworICAgIGlmICgocEFkLT5TdGFDZmcuYkF1dG9UeFJhdGVTd2l0Y2ggPT0gRkFMU0UpICYmCisgICAgICAgIChJTkZSQV9PTihwQWQpKSAmJgorICAgICAgICAoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPD0gUEhZXzExRykgfHwgKHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLk1PREUgPD0gTU9ERV9PRkRNKSkpCisgICAgICAgIGh0X3NldHRpbmcud29yZCA9IHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS53b3JkOworICAgIGVsc2UKKyAgICAgICAgaHRfc2V0dGluZy53b3JkID0gcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5IVFBoeU1vZGUud29yZDsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorICAgIGlmIChodF9zZXR0aW5nLmZpZWxkLk1PREUgPj0gTU9ERV9IVE1JWCkKKyAgICB7CisvLyAgICAJcmF0ZV9pbmRleCA9IDEyICsgKChVQ0hBUilodF9zZXR0aW5nLmZpZWxkLkJXICoxNikgKyAoKFVDSEFSKWh0X3NldHRpbmcuZmllbGQuU2hvcnRHSSAqMzIpICsgKChVQ0hBUilodF9zZXR0aW5nLmZpZWxkLk1DUyk7CisgICAgCXJhdGVfaW5kZXggPSAxMiArICgoVUNIQVIpaHRfc2V0dGluZy5maWVsZC5CVyAqMjQpICsgKChVQ0hBUilodF9zZXR0aW5nLmZpZWxkLlNob3J0R0kgKjQ4KSArICgoVUNIQVIpaHRfc2V0dGluZy5maWVsZC5NQ1MpOworICAgIH0KKyAgICBlbHNlCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisgICAgaWYgKGh0X3NldHRpbmcuZmllbGQuTU9ERSA9PSBNT0RFX09GRE0pCisgICAgCXJhdGVfaW5kZXggPSAoVUNIQVIpKGh0X3NldHRpbmcuZmllbGQuTUNTKSArIDQ7CisgICAgZWxzZSBpZiAoaHRfc2V0dGluZy5maWVsZC5NT0RFID09IE1PREVfQ0NLKQorICAgIAlyYXRlX2luZGV4ID0gKFVDSEFSKShodF9zZXR0aW5nLmZpZWxkLk1DUyk7CisKKyAgICBpZiAocmF0ZV9pbmRleCA8IDApCisgICAgICAgIHJhdGVfaW5kZXggPSAwOworCisgICAgaWYgKHJhdGVfaW5kZXggPiByYXRlX2NvdW50KQorICAgICAgICByYXRlX2luZGV4ID0gcmF0ZV9jb3VudDsKKworICAgIHdycXUtPmJpdHJhdGUudmFsdWUgPSByYWxpbmtyYXRlW3JhdGVfaW5kZXhdICogNTAwMDAwOworICAgIHdycXUtPmJpdHJhdGUuZGlzYWJsZWQgPSAwOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBpd19oYW5kbGVyIHJ0X2hhbmRsZXJbXSA9Cit7CisJKGl3X2hhbmRsZXIpIE5VTEwsCQkJICAgICAgICAgICAgLyogU0lPQ1NJV0NPTU1JVCAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9naXduYW1lLAkJCS8qIFNJT0NHSVdOQU1FICAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCQkgICAgICAgICAgICAvKiBTSU9DU0lXTldJRCAgICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkJICAgICAgICAgICAgLyogU0lPQ0dJV05XSUQgICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9zaXdmcmVxLAkJICAgIC8qIFNJT0NTSVdGUkVRICAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3ZnJlcSwJCSAgICAvKiBTSU9DR0lXRlJFUSAgICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3Npd21vZGUsCQkgICAgLyogU0lPQ1NJV01PREUgICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9naXdtb2RlLAkJICAgIC8qIFNJT0NHSVdNT0RFICAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCSAgICAgICAgICAgICAgICAvKiBTSU9DU0lXU0VOUyAgICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkgICAgICAgICAgICAgICAgLyogU0lPQ0dJV1NFTlMgICAqLworCShpd19oYW5kbGVyKSBOVUxMIC8qIG5vdCB1c2VkICovLAkJLyogU0lPQ1NJV1JBTkdFICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9naXdyYW5nZSwJCSAgICAvKiBTSU9DR0lXUkFOR0UgICovCisJKGl3X2hhbmRsZXIpIE5VTEwgLyogbm90IHVzZWQgKi8sCQkvKiBTSU9DU0lXUFJJViAgICovCisJKGl3X2hhbmRsZXIpIE5VTEwgLyoga2VybmVsIGNvZGUgKi8sICAgIC8qIFNJT0NHSVdQUklWICAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCAvKiBub3QgdXNlZCAqLywJCS8qIFNJT0NTSVdTVEFUUyAgKi8KKwkoaXdfaGFuZGxlcikgcnQyOHh4X2dldF93aXJlbGVzc19zdGF0cyAvKiBrZXJuZWwgY29kZSAqLywgICAgLyogU0lPQ0dJV1NUQVRTICAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJICAgICAgICAgICAgICAgIC8qIFNJT0NTSVdTUFkgICAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCSAgICAgICAgICAgICAgICAvKiBTSU9DR0lXU1BZICAgICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkJCSAgICAgICAgLyogU0lPQ1NJV1RIUlNQWSAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJCQkgICAgICAgIC8qIFNJT0NHSVdUSFJTUFkgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfc2l3YXAsICAgICAgICAgICAgLyogU0lPQ1NJV0FQICAgICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9naXdhcCwJCSAgICAvKiBTSU9DR0lXQVAgICAgICovCisjaWZkZWYgU0lPQ1NJV01MTUUKKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfc2l3bWxtZSwJICAgICAgICAvKiBTSU9DU0lXTUxNRSAgICovCisjZWxzZQorCShpd19oYW5kbGVyKSBOVUxMLAkJCQkgICAgICAgIC8qIFNJT0NTSVdNTE1FICovCisjZW5kaWYgLy8gU0lPQ1NJV01MTUUgLy8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfaXdhcGxpc3QsCQkgICAgLyogU0lPQ0dJV0FQTElTVCAqLworI2lmZGVmIFNJT0NHSVdTQ0FOCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3Npd3NjYW4sCQkgICAgLyogU0lPQ1NJV1NDQU4gICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9naXdzY2FuLAkJICAgIC8qIFNJT0NHSVdTQ0FOICAgKi8KKyNlbHNlCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkJCSAgICAgICAgLyogU0lPQ1NJV1NDQU4gICAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJCQkgICAgICAgIC8qIFNJT0NHSVdTQ0FOICAgKi8KKyNlbmRpZiAvKiBTSU9DR0lXU0NBTiAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9zaXdlc3NpZCwJCSAgICAvKiBTSU9DU0lXRVNTSUQgICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX2dpd2Vzc2lkLAkJICAgIC8qIFNJT0NHSVdFU1NJRCAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfc2l3bmlja24sCQkgICAgLyogU0lPQ1NJV05JQ0tOICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9naXduaWNrbiwJCSAgICAvKiBTSU9DR0lXTklDS04gICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkJCSAgICAgICAgLyogLS0gaG9sZSAtLSAgICAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJCQkgICAgICAgIC8qIC0tIGhvbGUgLS0gICAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfc2l3cmF0ZSwgICAgICAgICAgLyogU0lPQ1NJV1JBVEUgICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9naXdyYXRlLCAgICAgICAgICAvKiBTSU9DR0lXUkFURSAgICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3Npd3J0cywJCSAgICAvKiBTSU9DU0lXUlRTICAgICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX2dpd3J0cywJCSAgICAvKiBTSU9DR0lXUlRTICAgICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3Npd2ZyYWcsCQkgICAgLyogU0lPQ1NJV0ZSQUcgICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9naXdmcmFnLAkJICAgIC8qIFNJT0NHSVdGUkFHICAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCSAgICAgICAgICAgICAgICAvKiBTSU9DU0lXVFhQT1cgICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkgICAgICAgICAgICAgICAgLyogU0lPQ0dJV1RYUE9XICAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJICAgICAgICAgICAgICAgIC8qIFNJT0NTSVdSRVRSWSAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCSAgICAgICAgICAgICAgICAvKiBTSU9DR0lXUkVUUlkgICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3Npd2VuY29kZSwJCS8qIFNJT0NTSVdFTkNPREUgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3ZW5jb2RlLAkJLyogU0lPQ0dJV0VOQ09ERSAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJICAgICAgICAgICAgICAgIC8qIFNJT0NTSVdQT1dFUiAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCSAgICAgICAgICAgICAgICAvKiBTSU9DR0lXUE9XRVIgICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkJCQkJLyogLS0gaG9sZSAtLSAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJCQkJCS8qIC0tIGhvbGUgLS0gKi8KKyNpZiBXSVJFTEVTU19FWFQgPiAxNworICAgIChpd19oYW5kbGVyKSBydF9pb2N0bF9zaXdnZW5pZSwgICAgICAgICAvKiBTSU9DU0lXR0VOSUUgICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX2dpd2dlbmllLCAgICAgICAgIC8qIFNJT0NHSVdHRU5JRSAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfc2l3YXV0aCwJCSAgICAvKiBTSU9DU0lXQVVUSCAgICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX2dpd2F1dGgsCQkgICAgLyogU0lPQ0dJV0FVVEggICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9zaXdlbmNvZGVleHQsCSAgICAvKiBTSU9DU0lXRU5DT0RFRVhUICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX2dpd2VuY29kZWV4dCwJCS8qIFNJT0NHSVdFTkNPREVFWFQgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfc2l3cG1rc2EsICAgICAgICAgLyogU0lPQ1NJV1BNS1NBICAqLworI2VuZGlmCit9OworCitzdGF0aWMgY29uc3QgaXdfaGFuZGxlciBydF9wcml2X2hhbmRsZXJzW10gPSB7CisJKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgwMCAqLworCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MDEgKi8KKyNpZm5kZWYgQ09ORklHX0FQX1NVUFBPUlQKKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfc2V0cGFyYW0sIC8qICsgMHgwMiAqLworI2Vsc2UKKwkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDAyICovCisjZW5kaWYgLy8gQ09ORklHX0FQX1NVUFBPUlQgLy8KKyNpZmRlZiBEQkcKKwkoaXdfaGFuZGxlcikgcnRfcHJpdmF0ZV9pb2N0bF9iYnAsIC8qICsgMHgwMyAqLworI2Vsc2UKKwkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDAzICovCisjZW5kaWYKKwkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDA0ICovCisJKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgwNSAqLworCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MDYgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDA3ICovCisJKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgwOCAqLworCShpd19oYW5kbGVyKSBydF9wcml2YXRlX2dldF9zdGF0aXN0aWNzLCAvKiArIDB4MDkgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDBBICovCisJKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgwQiAqLworCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MEMgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDBEICovCisJKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgwRSAqLworCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MEYgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDEwICovCisJKGl3X2hhbmRsZXIpIHJ0X3ByaXZhdGVfc2hvdywgLyogKyAweDExICovCisgICAgKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgxMiAqLworCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MTMgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDE1ICovCisJKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgxNyAqLworCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MTggKi8KK307CisKK2NvbnN0IHN0cnVjdCBpd19oYW5kbGVyX2RlZiBydDI4eHhfaXdfaGFuZGxlcl9kZWYgPQoreworI2RlZmluZQlOKGEpCShzaXplb2YgKGEpIC8gc2l6ZW9mIChhWzBdKSkKKwkuc3RhbmRhcmQJPSAoaXdfaGFuZGxlciAqKSBydF9oYW5kbGVyLAorCS5udW1fc3RhbmRhcmQJPSBzaXplb2YocnRfaGFuZGxlcikgLyBzaXplb2YoaXdfaGFuZGxlciksCisJLnByaXZhdGUJPSAoaXdfaGFuZGxlciAqKSBydF9wcml2X2hhbmRsZXJzLAorCS5udW1fcHJpdmF0ZQkJPSBOKHJ0X3ByaXZfaGFuZGxlcnMpLAorCS5wcml2YXRlX2FyZ3MJPSAoc3RydWN0IGl3X3ByaXZfYXJncyAqKSBwcml2dGFiLAorCS5udW1fcHJpdmF0ZV9hcmdzCT0gTihwcml2dGFiKSwKKyNpZiBJV19IQU5ETEVSX1ZFUlNJT04gPj0gNworICAgIC5nZXRfd2lyZWxlc3Nfc3RhdHMgPSBydDI4eHhfZ2V0X3dpcmVsZXNzX3N0YXRzLAorI2VuZGlmCit9OworCitJTlQgUlRNUFNldEluZm9ybWF0aW9uKAorICAgIElOICBQUlRNUF9BREFQVEVSIHBBZGFwdGVyLAorICAgIElOICBPVVQgc3RydWN0IGlmcmVxICAgICpycSwKKyAgICBJTiAgSU5UICAgICAgICAgICAgICAgICBjbWQpCit7CisgICAgc3RydWN0IGl3cmVxICAgICAgICAgICAgICAgICAgICAgICAgKndycSA9IChzdHJ1Y3QgaXdyZXEgKikgcnE7CisgICAgTkRJU184MDJfMTFfU1NJRCAgICAgICAgICAgICAgICAgICAgU3NpZDsKKyAgICBORElTXzgwMl8xMV9NQUNfQUREUkVTUyAgICAgICAgICAgICBCc3NpZDsKKyAgICBSVF84MDJfMTFfUEhZX01PREUgICAgICAgICAgICAgICAgICBQaHlNb2RlOworICAgIFJUXzgwMl8xMV9TVEFfQ09ORklHICAgICAgICAgICAgICAgIFN0YUNvbmZpZzsKKyAgICBORElTXzgwMl8xMV9SQVRFUyAgICAgICAgICAgICAgICAgICBhcnlSYXRlczsKKyAgICBSVF84MDJfMTFfUFJFQU1CTEUgICAgICAgICAgICAgICAgICBQcmVhbWJsZTsKKyAgICBORElTXzgwMl8xMV9XRVBfU1RBVFVTICAgICAgICAgICAgICBXZXBTdGF0dXM7CisgICAgTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fTU9ERSAgICAgQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVNYXg7CisgICAgTkRJU184MDJfMTFfTkVUV09SS19JTkZSQVNUUlVDVFVSRSAgQnNzVHlwZTsKKyAgICBORElTXzgwMl8xMV9SVFNfVEhSRVNIT0xEICAgICAgICAgICBSdHNUaHJlc2g7CisgICAgTkRJU184MDJfMTFfRlJBR01FTlRBVElPTl9USFJFU0hPTEQgRnJhZ1RocmVzaDsKKyAgICBORElTXzgwMl8xMV9QT1dFUl9NT0RFICAgICAgICAgICAgICBQb3dlck1vZGU7CisgICAgUE5ESVNfODAyXzExX0tFWSAgICAgICAgICAgICAgICAgICAgcEtleSA9IE5VTEw7CisgICAgUE5ESVNfODAyXzExX1dFUAkJCSAgICAgICAgcFdlcEtleSA9TlVMTDsKKyAgICBQTkRJU184MDJfMTFfUkVNT1ZFX0tFWSAgICAgICAgICAgICBwUmVtb3ZlS2V5ID0gTlVMTDsKKyAgICBORElTXzgwMl8xMV9DT05GSUdVUkFUSU9OICAgICAgICAgICBDb25maWcsICpwQ29uZmlnID0gTlVMTDsKKyAgICBORElTXzgwMl8xMV9ORVRXT1JLX1RZUEUgICAgICAgICAgICBOZXRUeXBlOworICAgIFVMT05HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdzsKKyAgICBVSU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXlJZHggPSAwOworICAgIElOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1MsIE1heFBoeU1vZGUgPSBQSFlfMTFHOworICAgIFVMT05HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvd2VyVGVtcDsKKyAgICBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSYWRpb1N0YXRlOworICAgIEJPT0xFQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXRlTWFjaGluZVRvdWNoZWQgPSBGQUxTRTsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwlPSURfU0VUX0hUX1BIWU1PREUJCQkJCUhUX1BoeU1vZGU7CS8vMTFuICxrYXRoeQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyAgICBQTkRJU184MDJfMTFfUE1LSUQgICAgICAgICAgICAgICAgICBwUG1rSWQgPSBOVUxMOworICAgIEJPT0xFQU4JCQkJICAgICAgICAgICAgICAgIElFRUU4MDIxeFN0YXRlID0gRkFMU0U7CisgICAgQk9PTEVBTgkJCQkgICAgICAgICAgICAgICAgSUVFRTgwMjF4X3JlcXVpcmVkX2tleXMgPSBGQUxTRTsKKyAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cGFfc3VwcGxpY2FudF9lbmFibGUgPSAwOworI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKworI2lmZGVmIFNOTVBfU1VQUE9SVAorCVRYX1JUWV9DRkdfU1RSVUMJCQl0eF9ydHlfY2ZnOworCVVMT05HCQkJCQkJU2hvcnRSZXRyeUxpbWl0LCBMb25nUmV0cnlMaW1pdDsKKwlVQ0hBUgkJCQkJCWN0bXA7CisjZW5kaWYgLy8gU05NUF9TVVBQT1JUIC8vCisKKworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJTWF4UGh5TW9kZSA9IFBIWV8xMU5fNUc7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPlJUTVBTZXRJbmZvcm1hdGlvbigpLAkweCUwOHhcbiIsIGNtZCYweDdGRkYpKTsKKyAgICBzd2l0Y2goY21kICYgMHg3RkZGKSB7CisgICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9DT1VOVFJZX1JFR0lPTjoKKyAgICAgICAgICAgIGlmICh3cnEtPnUuZGF0YS5sZW5ndGggPCBzaXplb2YoVUNIQVIpKQorICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FSU5WQUw7CisJCQkvLyBPbmx5IGF2YWxpYWJsZSB3aGVuIEVFUFJPTSBub3QgcHJvZ3JhbW1pbmcKKyAgICAgICAgICAgIGVsc2UgaWYgKCEocEFkYXB0ZXItPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uICYgMHg4MCkgJiYgIShwQWRhcHRlci0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb25Gb3JBQmFuZCAmIDB4ODApKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFVMT05HICAgQ291bnRyeTsKKyAgICAgICAgICAgICAgICBVQ0hBUglUbXBQaHk7CisKKwkJCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmQ291bnRyeSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb24gPSAoVUNIQVIpKENvdW50cnkgJiAweDAwMDAwMEZGKTsKKwkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb25Gb3JBQmFuZCA9IChVQ0hBUikoKENvdW50cnkgPj4gOCkgJiAweDAwMDAwMEZGKTsKKyAgICAgICAgICAgICAgICBUbXBQaHkgPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLlBoeU1vZGU7CisJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5QaHlNb2RlID0gMHhmZjsKKwkJCQkvLyBCdWlsZCBhbGwgY29ycmVzcG9uZGluZyBjaGFubmVsIGluZm9ybWF0aW9uCisJCQkJUlRNUFNldFBoeU1vZGUocEFkYXB0ZXIsIFRtcFBoeSk7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQkJU2V0Q29tbW9uSFQocEFkYXB0ZXIpOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6UlRfT0lEXzgwMl8xMV9DT1VOVFJZX1JFR0lPTiAoQTolZCAgQi9HOiVkKVxuIiwgcEFkYXB0ZXItPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uRm9yQUJhbmQsCisJCQkJICAgIHBBZGFwdGVyLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9CU1NJRF9MSVNUX1NDQU46CisgI2lmZGVmIFJBTElOS19BVEUKKwkJCWlmIChBVEVfT04ocEFkYXB0ZXIpKQorCQkJeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlRoZSBkcml2ZXIgaXMgaW4gQVRFIG1vZGUgbm93XG4iKSk7CisJCQkJYnJlYWs7CisJCQl9CisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworICAgICAgICAgICAgTm93ID0gamlmZmllczsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9CU1NJRF9MSVNUX1NDQU4sIFR4Q250ID0gJWQgXG4iLCBwQWRhcHRlci0+UmFsaW5rQ291bnRlcnMuTGFzdE9uZVNlY1RvdGFsVHhDb3VudCkpOworCisgICAgICAgICAgICBpZiAoTU9OSVRPUl9PTihwQWRhcHRlcikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIERyaXZlciBpcyBpbiBNb25pdG9yIE1vZGUgbm93ICEhIVxuIikpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisJCQkvL0JlbnNvbiBhZGQgMjAwODA1MjcsIHdoZW4gcmFkaW8gb2ZmLCBzdGEgZG9uJ3QgbmVlZCB0byBzY2FuCisJCQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfUkFESU9fT0ZGKSkKKwkJCQlicmVhazsKKworCQkJaWYgKFJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKSkKKwkJCXsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgRHJpdmVyIGlzIHNjYW5uaW5nIG5vdyAhISFcbiIpKTsKKwkJCQlwQWRhcHRlci0+U3RhQ2ZnLmJTY2FuUmVxSXNGcm9tV2ViVUkgPSBUUlVFOworCQkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKwkJCWlmIChwQWRhcHRlci0+UmFsaW5rQ291bnRlcnMuTGFzdE9uZVNlY1RvdGFsVHhDb3VudCA+IDEwMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgTGluayBVUCwgaWdub3JlIHRoaXMgc2V0OjpPSURfODAyXzExX0JTU0lEX0xJU1RfU0NBTlxuIikpOworCQkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisJCQkJcEFkYXB0ZXItPlN0YUNmZy5TY2FuQ250ID0gOTk7CQkvLyBQcmV2ZW50IGF1dG8gc2NhbiB0cmlnZ2VyZWQgYnkgdGhpcyBPSUQKKwkJCQlicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKChPUFNUQVRVU19URVNUX0ZMQUcocEFkYXB0ZXIsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSkgJiYKKwkJCQkoKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKSB8fAorCQkJCShwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykgfHwKKwkJCQkocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyKSB8fAorCQkJCShwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spKSAmJgorICAgICAgICAgICAgICAgIChwQWRhcHRlci0+U3RhQ2ZnLlBvcnRTZWN1cmVkID09IFdQQV84MDJfMVhfUE9SVF9OT1RfU0VDVVJFRCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIExpbmsgVVAsIFBvcnQgTm90IFNlY3VyZWQhIGlnbm9yZSB0aGlzIHNldDo6T0lEXzgwMl8xMV9CU1NJRF9MSVNUX1NDQU5cbiIpKTsKKwkJCQlTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworCQkJCXBBZGFwdGVyLT5TdGFDZmcuU2NhbkNudCA9IDk5OwkJLy8gUHJldmVudCBhdXRvIHNjYW4gdHJpZ2dlcmVkIGJ5IHRoaXMgT0lECisJCQkJYnJlYWs7CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSAhPSBDTlRMX0lETEUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUlQyOFhYX01MTUVfUkVTRVRfU1RBVEVfTUFDSElORShwQWRhcHRlcik7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIE1MTUUgYnVzeSwgcmVzZXQgTUxNRSBzdGF0ZSBtYWNoaW5lICEhIVxuIikpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyB0ZWxsIENOVEwgc3RhdGUgbWFjaGluZSB0byBjYWxsIE5kaXNNU2V0SW5mb3JtYXRpb25Db21wbGV0ZSgpIGFmdGVyIGNvbXBsZXRpbmcKKyAgICAgICAgICAgIC8vIHRoaXMgcmVxdWVzdCwgYmVjYXVzZSB0aGlzIHJlcXVlc3QgaXMgaW5pdGlhdGVkIGJ5IE5ESVMuCisgICAgICAgICAgICBwQWRhcHRlci0+TWxtZUF1eC5DdXJyUmVxSXNGcm9tTmRpcyA9IEZBTFNFOworICAgICAgICAgICAgLy8gUmVzZXQgYWxsb3dlZCBzY2FuIHJldHJpZXMKKyAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuU2NhbkNudCA9IDA7CisgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkxhc3RTY2FuVGltZSA9IE5vdzsKKworCQkJcEFkYXB0ZXItPlN0YUNmZy5iU2NhblJlcUlzRnJvbVdlYlVJID0gVFJVRTsKKyAgICAgICAgICAgIFJUTVBfU0VUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpOworICAgICAgICAgICAgTWxtZUVucXVldWUocEFkYXB0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE9JRF84MDJfMTFfQlNTSURfTElTVF9TQ0FOLAorICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworCisgICAgICAgICAgICBTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworICAgICAgICAgICAgU3RhdGVNYWNoaW5lVG91Y2hlZCA9IFRSVUU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX1NTSUQ6CisgICAgICAgICAgICBpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihORElTXzgwMl8xMV9TU0lEKSkKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgCVBDSEFSIHBTc2lkU3RyaW5nID0gTlVMTDsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmU3NpZCwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9TU0lEIChMZW49JWQsU3NpZD0lcylcbiIsIFNzaWQuU3NpZExlbmd0aCwgU3NpZC5Tc2lkKSk7CisgICAgICAgICAgICAgICAgaWYgKFNzaWQuU3NpZExlbmd0aCA+IE1BWF9MRU5fT0ZfU1NJRCkKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIAlpZiAoU3NpZC5Tc2lkTGVuZ3RoID09IDApCisgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAJCVNldF9TU0lEX1Byb2MocEFkYXB0ZXIsICIiKTsKKyAgICAgICAgICAgICAgICAJfQorCQkJCQllbHNlCisgICAgICAgICAgICAgICAgCXsKKwkgICAgICAgICAgICAgICAgCXBTc2lkU3RyaW5nID0gKENIQVIgKikga21hbGxvYyhNQVhfTEVOX09GX1NTSUQrMSwgTUVNX0FMTE9DX0ZMQUcpOworCQkJCQkJaWYgKHBTc2lkU3RyaW5nKQorCQkJCQkJeworCQkJCQkJCU5kaXNaZXJvTWVtb3J5KHBTc2lkU3RyaW5nLCBNQVhfTEVOX09GX1NTSUQrMSk7CisJCQkJCQkJTmRpc01vdmVNZW1vcnkocFNzaWRTdHJpbmcsIFNzaWQuU3NpZCwgU3NpZC5Tc2lkTGVuZ3RoKTsKKwkgICAgICAgICAgICAgICAgCQlTZXRfU1NJRF9Qcm9jKHBBZGFwdGVyLCBwU3NpZFN0cmluZyk7CisJCQkJCQkJa2ZyZWUocFNzaWRTdHJpbmcpOworCQkJCQkJfQorCQkJCQkJZWxzZQorCQkJCQkJCVN0YXR1cyA9IC1FTk9NRU07CisgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX0JTU0lEOgorI2lmZGVmIFJBTElOS19BVEUKKwkJCWlmIChBVEVfT04ocEFkYXB0ZXIpKQorCQkJeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlRoZSBkcml2ZXIgaXMgaW4gQVRFIG1vZGUgbm93XG4iKSk7CisJCQkJYnJlYWs7CisJCQl9CisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoTkRJU184MDJfMTFfTUFDX0FERFJFU1MpKQorICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZCc3NpZCwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKworICAgICAgICAgICAgICAgIC8vIHRlbGwgQ05UTCBzdGF0ZSBtYWNoaW5lIHRvIGNhbGwgTmRpc01TZXRJbmZvcm1hdGlvbkNvbXBsZXRlKCkgYWZ0ZXIgY29tcGxldGluZworICAgICAgICAgICAgICAgIC8vIHRoaXMgcmVxdWVzdCwgYmVjYXVzZSB0aGlzIHJlcXVlc3QgaXMgaW5pdGlhdGVkIGJ5IE5ESVMuCisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPk1sbWVBdXguQ3VyclJlcUlzRnJvbU5kaXMgPSBGQUxTRTsKKworCQkJCS8vIFByZXZlbnQgdG8gY29ubmVjdCBBUCBhZ2FpbiBpbiBTVEFNbG1lUGVyaW9kaWNFeGVjCisJCQkJcEFkYXB0ZXItPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWRMZW49IDMyOworCisgICAgICAgICAgICAgICAgLy8gUmVzZXQgYWxsb3dlZCBzY2FuIHJldHJpZXMKKwkJCQlwQWRhcHRlci0+U3RhQ2ZnLlNjYW5DbnQgPSAwOworCisgICAgICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSAhPSBDTlRMX0lETEUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBSVDI4WFhfTUxNRV9SRVNFVF9TVEFURV9NQUNISU5FKHBBZGFwdGVyKTsKKyAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIE1MTUUgYnVzeSwgcmVzZXQgTUxNRSBzdGF0ZSBtYWNoaW5lICEhIVxuIikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBNbG1lRW5xdWV1ZShwQWRhcHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPSURfODAyXzExX0JTU0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihORElTXzgwMl8xMV9NQUNfQUREUkVTUyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFZPSUQgKikmQnNzaWQpOworICAgICAgICAgICAgICAgIFN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisgICAgICAgICAgICAgICAgU3RhdGVNYWNoaW5lVG91Y2hlZCA9IFRSVUU7CisKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfQlNTSUQgJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnNzaWRbMF0sIEJzc2lkWzFdLCBCc3NpZFsyXSwgQnNzaWRbM10sIEJzc2lkWzRdLCBCc3NpZFs1XSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9SQURJTzoKKyAgICAgICAgICAgIGlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKEJPT0xFQU4pKQorICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZSYWRpb1N0YXRlLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6UlRfT0lEXzgwMl8xMV9SQURJTyAoPSVkKVxuIiwgUmFkaW9TdGF0ZSkpOworICAgICAgICAgICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLmJTd1JhZGlvICE9IFJhZGlvU3RhdGUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLmJTd1JhZGlvID0gUmFkaW9TdGF0ZTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuYlJhZGlvICE9IChwQWRhcHRlci0+U3RhQ2ZnLmJId1JhZGlvICYmIHBBZGFwdGVyLT5TdGFDZmcuYlN3UmFkaW8pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLmJSYWRpbyA9IChwQWRhcHRlci0+U3RhQ2ZnLmJId1JhZGlvICYmIHBBZGFwdGVyLT5TdGFDZmcuYlN3UmFkaW8pOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuYlJhZGlvID09IFRSVUUpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWxtZVJhZGlvT24ocEFkYXB0ZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBleHRyYSBpbmZvcm1hdGlvbgorCQkJCQkJCXBBZGFwdGVyLT5FeHRyYUluZm8gPSBFWFRSQV9JTkZPX0NMRUFSOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1sbWVSYWRpb09mZihwQWRhcHRlcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVXBkYXRlIGV4dHJhIGluZm9ybWF0aW9uCisJCQkJCQkJcEFkYXB0ZXItPkV4dHJhSW5mbyA9IFNXX1JBRElPX09GRjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfUEhZX01PREU6CisgICAgICAgICAgICBpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihSVF84MDJfMTFfUEhZX01PREUpKQorICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZQaHlNb2RlLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJCWlmIChQaHlNb2RlIDw9IE1heFBoeU1vZGUpCisJCQkJeworICAgICAgICAgICAgICAgIAlSVE1QU2V0UGh5TW9kZShwQWRhcHRlciwgUGh5TW9kZSk7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQkJCVNldENvbW1vbkhUKHBBZGFwdGVyKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJCQl9CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpSVF9PSURfODAyXzExX1BIWV9NT0RFICg9JWQpXG4iLCBQaHlNb2RlKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX1NUQV9DT05GSUc6CisgICAgICAgICAgICBpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihSVF84MDJfMTFfU1RBX0NPTkZJRykpCisgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJlN0YUNvbmZpZywgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLmJFbmFibGVUeEJ1cnN0ID0gU3RhQ29uZmlnLkVuYWJsZVR4QnVyc3Q7CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5Vc2VCR1Byb3RlY3Rpb24gPSBTdGFDb25maWcuVXNlQkdQcm90ZWN0aW9uOworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuYlVzZVNob3J0U2xvdFRpbWUgPSAxOyAvLyAyMDAzLTEwLTMwIGFsd2F5cyBTSE9SVCBTTE9UIGNhcGFibGUKKyAgICAgICAgICAgICAgICBpZiAoKHBBZGFwdGVyLT5Db21tb25DZmcuUGh5TW9kZSAhPSBTdGFDb25maWcuQWRob2NNb2RlKSAmJgorCQkJCQkoU3RhQ29uZmlnLkFkaG9jTW9kZSA8PSBNYXhQaHlNb2RlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIGFsbG93IGR5bmFtaWMgY2hhbmdlIG9mICJVU0UgT0ZETSByYXRlIG9yIG5vdCIgaW4gQURIT0MgbW9kZQorICAgICAgICAgICAgICAgICAgICAvLyBpZiBzZXR0aW5nIGNoYW5nZWQsIG5lZWQgdG8gcmVzZXQgY3VycmVudCBUWCByYXRlIGFzIHdlbGwgYXMgQkVBQ09OIGZyYW1lIGZvcm1hdAorICAgICAgICAgICAgICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5Cc3NUeXBlID09IEJTU19BREhPQykKKyAgICAgICAgICAgICAgICAgICAgeworCQkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5QaHlNb2RlID0gU3RhQ29uZmlnLkFkaG9jTW9kZTsKKyAgICAgICAgICAgICAgICAgICAgCVJUTVBTZXRQaHlNb2RlKHBBZGFwdGVyLCBQaHlNb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIE1sbWVVcGRhdGVUeFJhdGVzKHBBZGFwdGVyLCBGQUxTRSwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBNYWtlSWJzc0JlYWNvbihwQWRhcHRlcik7ICAgICAgICAgICAvLyByZS1idWlsZCBCRUFDT04gZnJhbWUKKyAgICAgICAgICAgICAgICAgICAgICAgIEFzaWNFbmFibGVJYnNzU3luYyhwQWRhcHRlcik7ICAgLy8gY29weSB0byBvbi1jaGlwIG1lbW9yeQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6UlRfT0lEXzgwMl8xMV9TRVRfU1RBX0NPTkZJRyAoQnVyc3Q9JWQsIFByb3RlY3Rpb249JWxkLFNob3J0U2xvdD0lZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLmJFbmFibGVUeEJ1cnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuVXNlQkdQcm90ZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuYlVzZVNob3J0U2xvdFRpbWUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfREVTSVJFRF9SQVRFUzoKKyAgICAgICAgICAgIGlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKE5ESVNfODAyXzExX1JBVEVTKSkKKyAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmYXJ5UmF0ZXMsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgTmRpc1plcm9NZW1vcnkocEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVSYXRlLCBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUyk7CisgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVSYXRlLCAmYXJ5UmF0ZXMsIHNpemVvZihORElTXzgwMl8xMV9SQVRFUykpOworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9ERVNJUkVEX1JBVEVTICglMDJ4LCUwMngsJTAyeCwlMDJ4LCUwMngsJTAyeCwlMDJ4LCUwMngpXG4iLAorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbMF0scEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzFdLAorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbMl0scEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzNdLAorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbNF0scEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzVdLAorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbNl0scEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzddICkpOworICAgICAgICAgICAgICAgIC8vIENoYW5naW5nIERlc2lyZWRSYXRlIG1heSBhZmZlY3QgdGhlIE1BWCBUWCByYXRlIHdlIHVzZWQgdG8gVFggZnJhbWVzIG91dAorICAgICAgICAgICAgICAgIE1sbWVVcGRhdGVUeFJhdGVzKHBBZGFwdGVyLCBGQUxTRSwgMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX1BSRUFNQkxFOgorICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoUlRfODAyXzExX1BSRUFNQkxFKSkKKyAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmUHJlYW1ibGUsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgaWYgKFByZWFtYmxlID09IFJ0ODAyXzExUHJlYW1ibGVTaG9ydCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuVHhQcmVhbWJsZSA9IFByZWFtYmxlOworICAgICAgICAgICAgICAgICAgICBNbG1lU2V0VHhQcmVhbWJsZShwQWRhcHRlciwgUnQ4MDJfMTFQcmVhbWJsZVNob3J0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoKFByZWFtYmxlID09IFJ0ODAyXzExUHJlYW1ibGVMb25nKSB8fCAoUHJlYW1ibGUgPT0gUnQ4MDJfMTFQcmVhbWJsZUF1dG8pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gaWYgdXNlciB3YW50cyBBVVRPLCBpbml0aWFsaXplIHRvIExPTkcgaGVyZSwgdGhlbiBjaGFuZ2UgYWNjb3JkaW5nIHRvIEFQJ3MKKyAgICAgICAgICAgICAgICAgICAgLy8gY2FwYWJpbGl0eSB1cG9uIGFzc29jaWF0aW9uLgorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLlR4UHJlYW1ibGUgPSBQcmVhbWJsZTsKKyAgICAgICAgICAgICAgICAgICAgTWxtZVNldFR4UHJlYW1ibGUocEFkYXB0ZXIsIFJ0ODAyXzExUHJlYW1ibGVMb25nKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6UlRfT0lEXzgwMl8xMV9QUkVBTUJMRSAoPSVkKVxuIiwgUHJlYW1ibGUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfV0VQX1NUQVRVUzoKKyAgICAgICAgICAgIGlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKE5ESVNfODAyXzExX1dFUF9TVEFUVVMpKQorICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZXZXBTdGF0dXMsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgLy8gU2luY2UgVEtJUCwgQUVTLCBXRVAgYXJlIGFsbCBzdXBwb3J0ZWQuIEl0IHNob3VsZCBub3QgaGF2ZSBhbnkgaW52YWxpZCBzZXR0aW5nCisgICAgICAgICAgICAgICAgaWYgKFdlcFN0YXR1cyA8PSBOZGlzODAyXzExRW5jcnlwdGlvbjNLZXlBYnNlbnQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXMgIT0gV2VwU3RhdHVzKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBDb25maWcgaGFzIGNoYW5nZWQKKyAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5iQ29uZmlnQ2hhbmdlZCA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXMgICAgID0gV2VwU3RhdHVzOworICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLk9yaWdXZXBTdGF0dXMgPSBXZXBTdGF0dXM7CisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuUGFpckNpcGhlciAgICA9IFdlcFN0YXR1czsKKyAgICAgICAgICAgICAgICAJcEFkYXB0ZXItPlN0YUNmZy5Hcm91cENpcGhlciAgID0gV2VwU3RhdHVzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9XRVBfU1RBVFVTICg9JWQpXG4iLFdlcFN0YXR1cykpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9BVVRIRU5USUNBVElPTl9NT0RFOgorICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fTU9ERSkpCisgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJkF1dGhNb2RlLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgICAgIGlmIChBdXRoTW9kZSA+IE5kaXM4MDJfMTFBdXRoTW9kZU1heCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgIT0gQXV0aE1vZGUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvbmZpZyBoYXMgY2hhbmdlZAorICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPmJDb25maWdDaGFuZ2VkID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gQXV0aE1vZGU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQ7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREUgKD0lZCkgXG4iLHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfSU5GUkFTVFJVQ1RVUkVfTU9ERToKKyAgICAgICAgICAgIGlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKE5ESVNfODAyXzExX05FVFdPUktfSU5GUkFTVFJVQ1RVUkUpKQorICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZCc3NUeXBlLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCisJCQkJaWYgKEJzc1R5cGUgPT0gTmRpczgwMl8xMUlCU1MpCisJCQkJCVNldF9OZXR3b3JrVHlwZV9Qcm9jKHBBZGFwdGVyLCAiQWRob2MiKTsKKwkJCQllbHNlIGlmIChCc3NUeXBlID09IE5kaXM4MDJfMTFJbmZyYXN0cnVjdHVyZSkKKwkJCQkJU2V0X05ldHdvcmtUeXBlX1Byb2MocEFkYXB0ZXIsICJJbmZyYSIpOworCQkJCWVsc2UgaWYgKEJzc1R5cGUgPT0gTmRpczgwMl8xMU1vbml0b3IpCisJCQkJCVNldF9OZXR3b3JrVHlwZV9Qcm9jKHBBZGFwdGVyLCAiTW9uaXRvciIpOworCQkJCWVsc2UKKwkJCQl7CisJCQkJCVN0YXR1cyAgPSAtRUlOVkFMOworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfSU5GUkFTVFJVQ1RVUkVfTU9ERSAodW5rbm93bilcbiIpKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkgY2FzZSBPSURfODAyXzExX1JFTU9WRV9XRVA6CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfUkVNT1ZFX1dFUFxuIikpOworICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoTkRJU184MDJfMTFfS0VZX0lOREVYKSkKKyAgICAgICAgICAgIHsKKwkJCQlTdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworCQkJCUtleUlkeCA9ICooTkRJU184MDJfMTFfS0VZX0lOREVYICopIHdycS0+dS5kYXRhLnBvaW50ZXI7CisKKwkJCQlpZiAoS2V5SWR4ICYgMHg4MDAwMDAwMCkKKwkJCQl7CisJCQkJCS8vIFNob3VsZCBuZXZlciBzZXQgZGVmYXVsdCBiaXQgd2hlbiByZW1vdmUga2V5CisJCQkJCVN0YXR1cyA9IC1FSU5WQUw7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCUtleUlkeCA9IEtleUlkeCAmIDB4MGZmZmZmZmY7CisJCQkJCWlmIChLZXlJZHggPj0gNCl7CisJCQkJCQlTdGF0dXMgPSAtRUlOVkFMOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLktleUxlbiA9IDA7CisJCQkJCQlwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uQ2lwaGVyQWxnID0gQ0lQSEVSX05PTkU7CisJCQkJCQlBc2ljUmVtb3ZlU2hhcmVkS2V5RW50cnkocEFkYXB0ZXIsIDAsIChVQ0hBUilLZXlJZHgpOworCQkJCQl9CisJCQkJfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9SRVNFVF9DT1VOVEVSUzoKKyAgICAgICAgICAgIE5kaXNaZXJvTWVtb3J5KCZwQWRhcHRlci0+V2xhbkNvdW50ZXJzLCBzaXplb2YoQ09VTlRFUl84MDJfMTEpKTsKKyAgICAgICAgICAgIE5kaXNaZXJvTWVtb3J5KCZwQWRhcHRlci0+Q291bnRlcnM4MDIzLCBzaXplb2YoQ09VTlRFUl84MDJfMykpOworICAgICAgICAgICAgTmRpc1plcm9NZW1vcnkoJnBBZGFwdGVyLT5SYWxpbmtDb3VudGVycywgc2l6ZW9mKENPVU5URVJfUkFMSU5LKSk7CisgICAgICAgICAgICBwQWRhcHRlci0+Q291bnRlcnM4MDIzLlJ4Tm9CdWZmZXIgICA9IDA7CisJCQlwQWRhcHRlci0+Q291bnRlcnM4MDIzLkdvb2RSZWNlaXZlcyA9IDA7CisJCQlwQWRhcHRlci0+Q291bnRlcnM4MDIzLlJ4Tm9CdWZmZXIgICA9IDA7CisjaWZkZWYgUlQyODcwCisJCQlwQWRhcHRlci0+QnVsa091dENvbXBsZXRlCT0gMDsKKwkJCXBBZGFwdGVyLT5CdWxrT3V0Q29tcGxldGVPdGhlcj0gMDsKKwkJCXBBZGFwdGVyLT5CdWxrT3V0Q29tcGxldGVDYW5jZWwgPSAwOworCQkJcEFkYXB0ZXItPkJ1bGtPdXRSZXEgPSAwOworCQkJcEFkYXB0ZXItPkJ1bGtJblJlcT0gMDsKKwkJCXBBZGFwdGVyLT5CdWxrSW5Db21wbGV0ZSA9IDA7CisJCQlwQWRhcHRlci0+QnVsa0luQ29tcGxldGVGYWlsID0gMDsKKyNlbmRpZiAvLyBSVDI4NzAgLy8KKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6UlRfT0lEXzgwMl8xMV9SRVNFVF9DT1VOVEVSUyBcbiIpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfUlRTX1RIUkVTSE9MRDoKKyAgICAgICAgICAgIGlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKE5ESVNfODAyXzExX1JUU19USFJFU0hPTEQpKQorICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZSdHNUaHJlc2gsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgaWYgKFJ0c1RocmVzaCA+IE1BWF9SVFNfVEhSRVNIT0xEKQorICAgICAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuUnRzVGhyZXNob2xkID0gKFVTSE9SVClSdHNUaHJlc2g7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfUlRTX1RIUkVTSE9MRCAoPSVsZClcbiIsUnRzVGhyZXNoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX0ZSQUdNRU5UQVRJT05fVEhSRVNIT0xEOgorICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoTkRJU184MDJfMTFfRlJBR01FTlRBVElPTl9USFJFU0hPTEQpKQorICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZGcmFnVGhyZXNoLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuYlVzZVplcm9Ub0Rpc2FibGVGcmFnbWVudCA9IEZBTFNFOworICAgICAgICAgICAgICAgIGlmIChGcmFnVGhyZXNoID4gTUFYX0ZSQUdfVEhSRVNIT0xEIHx8IEZyYWdUaHJlc2ggPCBNSU5fRlJBR19USFJFU0hPTEQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoRnJhZ1RocmVzaCA9PSAwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkZyYWdtZW50VGhyZXNob2xkID0gTUFYX0ZSQUdfVEhSRVNIT0xEOworICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5iVXNlWmVyb1RvRGlzYWJsZUZyYWdtZW50ID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkZyYWdtZW50VGhyZXNob2xkID0gKFVTSE9SVClGcmFnVGhyZXNoOworICAgICAgICAgICAgfQorICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX0ZSQUdNRU5UQVRJT05fVEhSRVNIT0xEICg9JWxkKSBcbiIsRnJhZ1RocmVzaCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9QT1dFUl9NT0RFOgorICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoTkRJU184MDJfMTFfUE9XRVJfTU9ERSkpCisgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmUG93ZXJNb2RlLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgICAgIGlmIChQb3dlck1vZGUgPT0gTmRpczgwMl8xMVBvd2VyTW9kZUNBTSkKKyAgICAgICAgICAgICAgICAJU2V0X1BTTW9kZV9Qcm9jKHBBZGFwdGVyLCAiQ0FNIik7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoUG93ZXJNb2RlID09IE5kaXM4MDJfMTFQb3dlck1vZGVNQVhfUFNQKQorICAgICAgICAgICAgICAgIAlTZXRfUFNNb2RlX1Byb2MocEFkYXB0ZXIsICJNYXhfUFNQIik7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoUG93ZXJNb2RlID09IE5kaXM4MDJfMTFQb3dlck1vZGVGYXN0X1BTUCkKKwkJCQkJU2V0X1BTTW9kZV9Qcm9jKHBBZGFwdGVyLCAiRmFzdF9QU1AiKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChQb3dlck1vZGUgPT0gTmRpczgwMl8xMVBvd2VyTW9kZUxlZ2FjeV9QU1ApCisJCQkJCVNldF9QU01vZGVfUHJvYyhwQWRhcHRlciwgIkxlZ2FjeV9QU1AiKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfUE9XRVJfTU9ERSAoPSVkKVxuIixQb3dlck1vZGUpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX1RYX1BPV0VSX0xFVkVMXzE6CisJCQlpZiAod3JxLT51LmRhdGEubGVuZ3RoICA8IHNpemVvZihVTE9ORykpCisJCQkJU3RhdHVzID0gLUVJTlZBTDsKKwkJCWVsc2UKKwkJCXsKKwkJCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmUG93ZXJUZW1wLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJCWlmIChQb3dlclRlbXAgPiAxMDApCisJCQkJCVBvd2VyVGVtcCA9IDB4ZmZmZmZmZmY7ICAvLyBBVVRPCisJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5UeFBvd2VyRGVmYXVsdCA9IFBvd2VyVGVtcDsgLy9rZWVwIGN1cnJlbnQgc2V0dGluZy4KKwkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA9IHBBZGFwdGVyLT5Db21tb25DZmcuVHhQb3dlckRlZmF1bHQ7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpSVF9PSURfODAyXzExX1RYX1BPV0VSX0xFVkVMXzEgKD0lbGQpXG4iLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlKSk7CisJCQl9CisJICAgICAgICBicmVhazsKKwkJY2FzZSBPSURfODAyXzExX05FVFdPUktfVFlQRV9JTl9VU0U6CisJCQlpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihORElTXzgwMl8xMV9ORVRXT1JLX1RZUEUpKQorCQkJCVN0YXR1cyA9IC1FSU5WQUw7CisJCQllbHNlCisJCQl7CisJCQkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJk5ldFR5cGUsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisKKwkJCQlpZiAoTmV0VHlwZSA9PSBOZGlzODAyXzExRFMpCisJCQkJCVJUTVBTZXRQaHlNb2RlKHBBZGFwdGVyLCBQSFlfMTFCKTsKKwkJCQllbHNlIGlmIChOZXRUeXBlID09IE5kaXM4MDJfMTFPRkRNMjQpCisJCQkJCVJUTVBTZXRQaHlNb2RlKHBBZGFwdGVyLCBQSFlfMTFCR19NSVhFRCk7CisJCQkJZWxzZSBpZiAoTmV0VHlwZSA9PSBOZGlzODAyXzExT0ZETTUpCisJCQkJCVJUTVBTZXRQaHlNb2RlKHBBZGFwdGVyLCBQSFlfMTFBKTsKKwkJCQllbHNlCisJCQkJCVN0YXR1cyA9IC1FSU5WQUw7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQkJaWYgKFN0YXR1cyA9PSBORElTX1NUQVRVU19TVUNDRVNTKQorCQkJCQlTZXRDb21tb25IVChwQWRhcHRlcik7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX05FVFdPUktfVFlQRV9JTl9VU0UgKD0lZClcbiIsTmV0VHlwZSkpOworCQkgICAgfQorCQkJYnJlYWs7CisgICAgICAgIC8vIEZvciBXUEEgUFNLIFBNSyBrZXkKKyAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX0FERF9XUEE6CisgICAgICAgICAgICBwS2V5ID0ga21hbGxvYyh3cnEtPnUuZGF0YS5sZW5ndGgsIE1FTV9BTExPQ19GTEFHKTsKKyAgICAgICAgICAgIGlmKHBLZXkgPT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRU5PTUVNOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcihwS2V5LCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgaWYgKHBLZXktPkxlbmd0aCAhPSB3cnEtPnUuZGF0YS5sZW5ndGgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpSVF9PSURfODAyXzExX0FERF9XUEEsIEZhaWxlZCEhXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlICE9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykgJiYKKwkJCQkgICAgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgIT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykgJiYKKwkJCQkgICAgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgIT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZSkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVPUE5PVFNVUFA7CisgICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6UlRfT0lEXzgwMl8xMV9BRERfV1BBLCBGYWlsZWQhISBbQXV0aE1vZGUgIT0gV1BBUFNLL1dQQTJQU0svV1BBTk9ORV1cbiIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKSB8fAorCQkJCQkJIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spIHx8CisJCQkJCQkgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZSkgKSAgICAgLy8gT25seSBmb3IgV1BBIFBTSyBtb2RlCisJCQkJeworICAgICAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQWRhcHRlci0+U3RhQ2ZnLlBNSywgJnBLZXktPktleU1hdGVyaWFsLCBwS2V5LT5LZXlMZW5ndGgpOworICAgICAgICAgICAgICAgICAgICAvLyBVc2UgUmFDb25maWcgYXMgUFNLIGFnZW50LgorICAgICAgICAgICAgICAgICAgICAvLyBTdGFydCBTVEEgc3VwcGxpY2FudCBzdGF0ZSBtYWNoaW5lCisgICAgICAgICAgICAgICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlICE9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmUpCisgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldwYVN0YXRlID0gU1NfU1RBUlQ7CisKKyAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpSVF9PSURfODAyXzExX0FERF9XUEEgKGlkPTB4JXgsIExlbj0lZC1ieXRlKVxuIiwgcEtleS0+S2V5SW5kZXgsIHBLZXktPktleUxlbmd0aCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldwYVN0YXRlID0gU1NfTk9UVVNFOworICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OlJUX09JRF84MDJfMTFfQUREX1dQQSAoaWQ9MHgleCwgTGVuPSVkLWJ5dGUpXG4iLCBwS2V5LT5LZXlJbmRleCwgcEtleS0+S2V5TGVuZ3RoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAga2ZyZWUocEtleSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX1JFTU9WRV9LRVk6CisgICAgICAgICAgICBwUmVtb3ZlS2V5ID0ga21hbGxvYyh3cnEtPnUuZGF0YS5sZW5ndGgsIE1FTV9BTExPQ19GTEFHKTsKKyAgICAgICAgICAgIGlmKHBSZW1vdmVLZXkgPT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRU5PTUVNOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcihwUmVtb3ZlS2V5LCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgaWYgKHBSZW1vdmVLZXktPkxlbmd0aCAhPSB3cnEtPnUuZGF0YS5sZW5ndGgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX1JFTU9WRV9LRVksIEZhaWxlZCEhXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgUlRNUFdQQVJlbW92ZUtleVByb2MocEFkYXB0ZXIsIHBSZW1vdmVLZXkpOworICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfUkVNT1ZFX0tFWSwgUmVtb3ZlIFdQQSBLZXkhIVxuIikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBLZXlJZHggPSBwUmVtb3ZlS2V5LT5LZXlJbmRleDsKKworICAgICAgICAgICAgICAgICAgICBpZiAoS2V5SWR4ICYgMHg4MDAwMDAwMCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2hvdWxkIG5ldmVyIHNldCBkZWZhdWx0IGJpdCB3aGVuIHJlbW92ZSBrZXkKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX1JFTU9WRV9LRVksIEZhaWxlZCEhKFNob3VsZCBuZXZlciBzZXQgZGVmYXVsdCBiaXQgd2hlbiByZW1vdmUga2V5KVxuIikpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgS2V5SWR4ID0gS2V5SWR4ICYgMHgwZmZmZmZmZjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChLZXlJZHggPiAzKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9SRU1PVkVfS0VZLCBGYWlsZWQhIShLZXlJZFslZF0gb3V0IG9mIHJhbmdlKVxuIiwgS2V5SWR4KSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLktleUxlbiA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLkNpcGhlckFsZyA9IENJUEhFUl9OT05FOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFzaWNSZW1vdmVTaGFyZWRLZXlFbnRyeShwQWRhcHRlciwgMCwgKFVDSEFSKUtleUlkeCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX1JFTU9WRV9LRVkgKGlkPTB4JXgsIExlbj0lZC1ieXRlKVxuIiwgcFJlbW92ZUtleS0+S2V5SW5kZXgsIHBSZW1vdmVLZXktPkxlbmd0aCkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAga2ZyZWUocFJlbW92ZUtleSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgLy8gTmV3IGZvciBXUEEKKyAgICAgICAgY2FzZSBPSURfODAyXzExX0FERF9LRVk6CisgICAgICAgICAgICBwS2V5ID0ga21hbGxvYyh3cnEtPnUuZGF0YS5sZW5ndGgsIE1FTV9BTExPQ19GTEFHKTsKKyAgICAgICAgICAgIGlmKHBLZXkgPT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRU5PTUVNOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIocEtleSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgIGlmIChwS2V5LT5MZW5ndGggIT0gd3JxLT51LmRhdGEubGVuZ3RoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9BRERfS0VZLCBGYWlsZWQhIVxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFJUTVBBZGRLZXkocEFkYXB0ZXIsIHBLZXkpOworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9BRERfS0VZIChpZD0weCV4LCBMZW49JWQtYnl0ZSlcbiIsIHBLZXktPktleUluZGV4LCBwS2V5LT5LZXlMZW5ndGgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGtmcmVlKHBLZXkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9DT05GSUdVUkFUSU9OOgorICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoTkRJU184MDJfMTFfQ09ORklHVVJBVElPTikpCisgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJkNvbmZpZywgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBwQ29uZmlnID0gJkNvbmZpZzsKKworICAgICAgICAgICAgICAgIGlmICgocENvbmZpZy0+QmVhY29uUGVyaW9kID49IDIwKSAmJiAocENvbmZpZy0+QmVhY29uUGVyaW9kIDw9NDAwKSkKKyAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuQmVhY29uUGVyaW9kID0gKFVTSE9SVCkgcENvbmZpZy0+QmVhY29uUGVyaW9kOworCisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUFjdGl2ZS5BdGltV2luID0gKFVTSE9SVCkgcENvbmZpZy0+QVRJTVdpbmRvdzsKKyAgICAgICAgICAgICAgICBNQVBfS0haX1RPX0NIQU5ORUxfSUQocENvbmZpZy0+RFNDb25maWcsIHBBZGFwdGVyLT5Db21tb25DZmcuQ2hhbm5lbCk7CisgICAgICAgICAgICAgICAgLy8KKwkJCQkvLyBTYXZlIHRoZSBjaGFubmVsIG9uIE1sbWVBdXggZm9yIENudGxPaWRSVEJzc2lkUHJvYyB1c2VkLgorCQkJCS8vCisJCQkJcEFkYXB0ZXItPk1sbWVBdXguQ2hhbm5lbCA9IHBBZGFwdGVyLT5Db21tb25DZmcuQ2hhbm5lbDsKKworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9DT05GSUdVUkFUSU9OIChCZWFjblBlcmlvZD0lbGQsQXRpbVc9JWxkLENoPSVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgcENvbmZpZy0+QmVhY29uUGVyaW9kLCBwQ29uZmlnLT5BVElNV2luZG93LCBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWwpKTsKKyAgICAgICAgICAgICAgICAvLyBDb25maWcgaGFzIGNoYW5nZWQKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+YkNvbmZpZ0NoYW5nZWQgPSBUUlVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCWNhc2UgUlRfT0lEXzgwMl8xMV9TRVRfSFRfUEhZTU9ERToKKwkJCWlmICh3cnEtPnUuZGF0YS5sZW5ndGgJIT0gc2l6ZW9mKE9JRF9TRVRfSFRfUEhZTU9ERSkpCisJCQkJU3RhdHVzID0gLUVJTlZBTDsKKwkJCWVsc2UKKwkJCXsKKwkJCSAgICBQT0lEX1NFVF9IVF9QSFlNT0RFCXBIVFBoeU1vZGUgPSAmSFRfUGh5TW9kZTsKKworCQkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZIVF9QaHlNb2RlLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6cEhUUGh5TW9kZQkoUGh5TW9kZSA9ICVkLFRyYW5zbWl0Tm8gPSAlZCwgSHRNb2RlID0JJWQsCUV4dE9mZnNldCA9CSVkICwgTUNTID0gJWQsIEJXID0JJWQsCVNUQkMgPSAlZCwgU0hPUlRHSSA9ICVkKSBcbiIsCisJCQkJcEhUUGh5TW9kZS0+UGh5TW9kZSwgcEhUUGh5TW9kZS0+VHJhbnNtaXRObyxwSFRQaHlNb2RlLT5IdE1vZGUscEhUUGh5TW9kZS0+RXh0T2Zmc2V0LAorCQkJCXBIVFBoeU1vZGUtPk1DUywgcEhUUGh5TW9kZS0+QlcsIHBIVFBoeU1vZGUtPlNUQkMsCXBIVFBoeU1vZGUtPlNIT1JUR0kpKTsKKwkJCQlpZiAocEFkYXB0ZXItPkNvbW1vbkNmZy5QaHlNb2RlCT49IFBIWV8xMUFCR05fTUlYRUQpCisJCQkJCVJUTVBTZXRIVChwQWRhcHRlciwJcEhUUGh5TW9kZSk7CisJCQl9CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OlJUX09JRF84MDJfMTFfU0VUX0hUX1BIWU1PREUoTUNTPSVkLEJXPSVkLFNHST0lZCxTVEJDPSVkKVxuIiwKKwkJCQlwQWRhcHRlci0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NQ1MsIHBBZGFwdGVyLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLkJXLCBwQWRhcHRlci0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5TaG9ydEdJLAorCQkJCXBBZGFwdGVyLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLlNUQkMpKTsKKwkJCWJyZWFrOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQljYXNlIFJUX09JRF84MDJfMTFfU0VUX0FQU0RfU0VUVElORzoKKwkJCWlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKFVMT05HKSkKKwkJCQlTdGF0dXMgPSAtRUlOVkFMOworCQkJZWxzZQorCQkJeworCQkJCVVMT05HIGFwc2QgOworCQkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZhcHNkLCB3cnEtPnUuZGF0YS5wb2ludGVyLAl3cnEtPnUuZGF0YS5sZW5ndGgpOworCisJCQkJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCQkJfEIzMX5CNwl8CUI2fkI1CSB8CSBCNAkgfAkgQjMJIHwJQjIJIHwJQjEJIHwJICAgQjAJCXwKKwkJCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJCQl8IFJzdmQJfCBNYXggU1AgTGVuIHwgQUNfVk8gfCBBQ19WSSB8IEFDX0JLIHwgQUNfQkUgfCBBUFNECUNhcGFibGUJfAorCQkJCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTRENhcGFibGUgPSAoYXBzZCAmIDB4MDAwMDAwMDEpID8gVFJVRSA6CUZBTFNFOworCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RBQ19CRSA9ICgoYXBzZAkmIDB4MDAwMDAwMDIpID4+IDEpCT8gVFJVRSA6IEZBTFNFOworCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RBQ19CSyA9ICgoYXBzZAkmIDB4MDAwMDAwMDQpID4+IDIpCT8gVFJVRSA6IEZBTFNFOworCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RBQ19WSSA9ICgoYXBzZAkmIDB4MDAwMDAwMDgpID4+IDMpCT8gVFJVRSA6IEZBTFNFOworCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RBQ19WTyA9ICgoYXBzZAkmIDB4MDAwMDAwMTApID4+IDQpCT8gVFJVRSA6IEZBTFNFOworCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuTWF4U1BMZW5ndGgJPSAoVUNIQVIpKChhcHNkCSYgMHgwMDAwMDA2MCkgPj4gNSk7CisKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OlJUX09JRF84MDJfMTFfU0VUX0FQU0RfU0VUVElORyAoYXBzZD0weCVseCwgQVBTRENhcD0lZCwgW0JFLEJLLFZJLFZPXT1bJWQvJWQvJWQvJWRdLAlNYXhTUExlbj0lZClcbiIsIGFwc2QsIHBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RDYXBhYmxlLAorCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNEQUNfQkUsCXBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RBQ19CSywJcEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTREFDX1ZJLAlwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNEQUNfVk8sCXBBZGFwdGVyLT5Db21tb25DZmcuTWF4U1BMZW5ndGgpKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUlRfT0lEXzgwMl8xMV9TRVRfQVBTRF9QU006CisJCQlpZiAod3JxLT51LmRhdGEubGVuZ3RoCSE9IHNpemVvZihVTE9ORykpCisJCQkJU3RhdHVzID0gLUVJTlZBTDsKKwkJCWVsc2UKKwkJCXsKKwkJCQkvLyBEcml2ZXIgbmVlZHMJdG8gbm90aWZ5IEFQIHdoZW4gUFNNIGNoYW5nZXMKKwkJCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmcEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTREZvcmNlUG93ZXJTYXZlLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJCWlmIChwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNERm9yY2VQb3dlclNhdmUJIT0gcEFkYXB0ZXItPlN0YUNmZy5Qc20pCisJCQkJeworCQkJCQlNbG1lU2V0UHNtQml0KHBBZGFwdGVyLAlwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNERm9yY2VQb3dlclNhdmUpOworCQkJCQlSVE1QU2VuZE51bGxGcmFtZShwQWRhcHRlciwJcEFkYXB0ZXItPkNvbW1vbkNmZy5UeFJhdGUsCVRSVUUpOworCQkJCX0KKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OlJUX09JRF84MDJfMTFfU0VUX0FQU0RfUFNNIChiQVBTREZvcmNlUG93ZXJTYXZlOiVkKVxuIiwJcEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTREZvcmNlUG93ZXJTYXZlKSk7CisJCQl9CisJCQlicmVhazsKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwkJY2FzZSBSVF9PSURfODAyXzExX1NFVF9ETFM6CisJCQlpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihVTE9ORykpCisJCQkJU3RhdHVzID0gLUVJTlZBTDsKKwkJCWVsc2UKKwkJCXsKKwkJCQlCT09MRUFOCW9sZHZhbHVlID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5iRExTQ2FwYWJsZTsKKwkJCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmcEFkYXB0ZXItPkNvbW1vbkNmZy5iRExTQ2FwYWJsZSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCQlpZiAob2xkdmFsdWUgJiYJIXBBZGFwdGVyLT5Db21tb25DZmcuYkRMU0NhcGFibGUpCisJCQkJeworCQkJCQlpbnQJaTsKKwkJCQkJLy8gdGVhcglkb3duIGxvY2FsIGRscyB0YWJsZSBlbnRyeQorCQkJCQlmb3IJKGk9MDsgaTxNQVhfTlVNX09GX0lOSVRfRExTX0VOVFJZOyBpKyspCisJCQkJCXsKKwkJCQkJCWlmIChwQWRhcHRlci0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkICYmIChwQWRhcHRlci0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9PSBETFNfRklOSVNIKSkKKwkJCQkJCXsKKwkJCQkJCQlwQWRhcHRlci0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cwk9IERMU19OT05FOworCQkJCQkJCXBBZGFwdGVyLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQJPSBGQUxTRTsKKwkJCQkJCQlSVE1QU2VuZERMU1RlYXJEb3duRnJhbWUocEFkYXB0ZXIsIHBBZGFwdGVyLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcik7CisJCQkJCQl9CisJCQkJCX0KKworCQkJCQkvLyB0ZWFyCWRvd24gcGVlciBkbHMgdGFibGUJZW50cnkKKwkJCQkJZm9yCShpPU1BWF9OVU1fT0ZfSU5JVF9ETFNfRU5UUlk7IGk8TUFYX05VTV9PRl9ETFNfRU5UUlk7IGkrKykKKwkJCQkJeworCQkJCQkJaWYgKHBBZGFwdGVyLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQgJiYgKHBBZGFwdGVyLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID09IERMU19GSU5JU0gpKQorCQkJCQkJeworCQkJCQkJCXBBZGFwdGVyLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzCT0gRExTX05PTkU7CisJCQkJCQkJcEFkYXB0ZXItPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZAk9IEZBTFNFOworCQkJCQkJCVJUTVBTZW5kRExTVGVhckRvd25GcmFtZShwQWRhcHRlciwgcEFkYXB0ZXItPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiU2V0OjpSVF9PSURfODAyXzExX1NFVF9ETFMgKD0lZClcbiIsIHBBZGFwdGVyLT5Db21tb25DZmcuYkRMU0NhcGFibGUpKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUlRfT0lEXzgwMl8xMV9TRVRfRExTX1BBUkFNOgorCQkJaWYgKHdycS0+dS5kYXRhLmxlbmd0aAkhPSBzaXplb2YoUlRfODAyXzExX0RMU19VSSkpCisJCQkJU3RhdHVzID0gLUVJTlZBTDsKKwkJCWVsc2UKKwkJCXsKKwkJCQlSVF84MDJfMTFfRExTCURsczsKKworCQkJCU5kaXNaZXJvTWVtb3J5KCZEbHMsIHNpemVvZihSVF84MDJfMTFfRExTKSk7CisJCQkJUlRNUE1vdmVNZW1vcnkoJkRscywgd3JxLT51LmRhdGEucG9pbnRlciwgc2l6ZW9mKFJUXzgwMl8xMV9ETFNfVUkpKTsKKwkJCQlNbG1lRW5xdWV1ZShwQWRhcHRlciwKKwkJCQkJCQlNTE1FX0NOVExfU1RBVEVfTUFDSElORSwKKwkJCQkJCQlSVF9PSURfODAyXzExX1NFVF9ETFNfUEFSQU0sCisJCQkJCQkJc2l6ZW9mKFJUXzgwMl8xMV9ETFMpLAorCQkJCQkJCSZEbHMpOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiU2V0OjpSVF9PSURfODAyXzExX1NFVF9ETFNfUEFSQU0gXG4iKSk7CisJCQl9CisJCQlicmVhazsKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKwkJY2FzZSBSVF9PSURfODAyXzExX1NFVF9XTU06CisJCQlpZiAod3JxLT51LmRhdGEubGVuZ3RoCSE9IHNpemVvZihCT09MRUFOKSkKKwkJCQlTdGF0dXMgPSAtRUlOVkFMOworCQkJZWxzZQorCQkJeworCQkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZwQWRhcHRlci0+Q29tbW9uQ2ZnLmJXbW1DYXBhYmxlLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6UlRfT0lEXzgwMl8xMV9TRVRfV01NICg9JWQpCVxuIiwgcEFkYXB0ZXItPkNvbW1vbkNmZy5iV21tQ2FwYWJsZSkpOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfODAyXzExX0RJU0FTU09DSUFURToKKyNpZmRlZiBSQUxJTktfQVRFCisJCQlpZiAoQVRFX09OKHBBZGFwdGVyKSkKKwkJCXsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJUaGUgZHJpdmVyIGlzIGluIEFURSBtb2RlIG5vd1xuIikpOworCQkJCWJyZWFrOworCQkJfQorI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKwkJCS8vCisJCQkvLyBTZXQgTmRpc1JhZGlvU3RhdGVPZmYgdG8JVFJVRSwgaW5zdGVhZCBvZiBjYWxsZWQJTWxtZVJhZGlvT2ZmLgorCQkJLy8gTGF0ZXIgb24sIE5ESVNfODAyXzExX0JTU0lEX0xJU1RfRVgtPk51bWJlck9mSXRlbXMgc2hvdWxkIGJlCTAKKwkJCS8vIHdoZW4JcXVlcnkgT0lEXzgwMl8xMV9CU1NJRF9MSVNULgorCQkJLy8KKwkJCS8vIFRSVUU6ICBOdW1iZXJPZkl0ZW1zCXdpbGwgc2V0IHRvCTAuCisJCQkvLyBGQUxTRTogTnVtYmVyT2ZJdGVtcwlubyBjaGFuZ2UuCisJCQkvLworCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5OZGlzUmFkaW9TdGF0ZU9mZiA9CVRSVUU7CisJCQkvLyBTZXQgdG8gaW1tZWRpYXRlbHkgc2VuZCB0aGUgbWVkaWEgZGlzY29ubmVjdAlldmVudAorCQkJcEFkYXB0ZXItPk1sbWVBdXguQ3VyclJlcUlzRnJvbU5kaXMJPSBUUlVFOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX0RJU0FTU09DSUFURQlcbiIpKTsKKworCQkJaWYgKElORlJBX09OKHBBZGFwdGVyKSkKKwkJCXsKKwkJCQlpZiAocEFkYXB0ZXItPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlICE9CUNOVExfSURMRSkKKwkJCQl7CisJCQkJCVJUMjhYWF9NTE1FX1JFU0VUX1NUQVRFX01BQ0hJTkUocEFkYXB0ZXIpOworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgTUxNRQlidXN5LCByZXNldAlNTE1FIHN0YXRlIG1hY2hpbmUgISEhXG4iKSk7CisJCQkJfQorCisJCQkJTWxtZUVucXVldWUocEFkYXB0ZXIsCisJCQkJCU1MTUVfQ05UTF9TVEFURV9NQUNISU5FLAorCQkJCQlPSURfODAyXzExX0RJU0FTU09DSUFURSwKKwkJCQkJMCwKKwkJCQkJTlVMTCk7CisKKwkJCQlTdGF0ZU1hY2hpbmVUb3VjaGVkCT0gVFJVRTsKKwkJCX0KKwkJCWJyZWFrOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCWNhc2UgUlRfT0lEXzgwMl8xMV9TRVRfSU1NRV9CQV9DQVA6CisJCQkJaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoT0lEX0JBQ0FQX1NUUlVDKSkKKwkJCQkJU3RhdHVzID0gLUVJTlZBTDsKKwkJCQllbHNlCisJCQkJeworCQkJCQlPSURfQkFDQVBfU1RSVUMgT3JkZSA7CisJCQkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZPcmRlLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJCQlpZiAoT3JkZS5Qb2xpY3kgPiBCQV9OT1RVU0UpCisJCQkJCXsKKwkJCQkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX0lOVkFMSURfREFUQTsKKwkJCQkJfQorCQkJCQllbHNlIGlmIChPcmRlLlBvbGljeSA9PSBCQV9OT1RVU0UpCisJCQkJCXsKKwkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlBvbGljeSA9IEJBX05PVFVTRTsKKwkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1wZHVEZW5zaXR5ID0gT3JkZS5NcGR1RGVuc2l0eTsKKwkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5Lk1wZHVEZW5zaXR5ID0gT3JkZS5NcGR1RGVuc2l0eTsKKwkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkFtc2R1RW5hYmxlID0gT3JkZS5BbXNkdUVuYWJsZTsKKwkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkFtc2R1U2l6ZT0gT3JkZS5BbXNkdVNpemU7CisJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5NaW1vUHM9IE9yZGUuTU1QU21vZGU7CisJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5NTVBTbW9kZSA9IE9yZGUuTU1QU21vZGU7CisJCQkJCQkvLyBVUGRhdGEgdG8gSFQgSUUKKwkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5NaW1vUHMgPSBPcmRlLk1NUFNtb2RlOworCQkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkFNc2R1U2l6ZSA9IE9yZGUuQW1zZHVTaXplOworCQkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBQYXJtLk1wZHVEZW5zaXR5ID0gT3JkZS5NcGR1RGVuc2l0eTsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkF1dG9CQSA9IE9yZGUuQXV0b0JBOworCQkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuUG9saWN5ID0gSU1NRURfQkE7IC8vIHdlIG9ubHkgc3VwcG9ydCBpbW1lZGlhdGUgQkEuCisJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5NcGR1RGVuc2l0eSA9IE9yZGUuTXBkdURlbnNpdHk7CisJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5NcGR1RGVuc2l0eSA9IE9yZGUuTXBkdURlbnNpdHk7CisJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5BbXNkdUVuYWJsZSA9IE9yZGUuQW1zZHVFbmFibGU7CisJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5BbXNkdVNpemU9IE9yZGUuQW1zZHVTaXplOworCQkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuTWltb1BzID0gT3JkZS5NTVBTbW9kZTsKKwkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1NUFNtb2RlID0gT3JkZS5NTVBTbW9kZTsKKworCQkJCQkJLy8gVVBkYXRhIHRvIEhUIElFCisJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uTWltb1BzID0gT3JkZS5NTVBTbW9kZTsKKwkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5BTXNkdVNpemUgPSBPcmRlLkFtc2R1U2l6ZTsKKwkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwUGFybS5NcGR1RGVuc2l0eSA9IE9yZGUuTXBkdURlbnNpdHk7CisKKwkJCQkJCWlmIChwQWRhcHRlci0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5SeEJBV2luTGltaXQgPiBNQVhfUlhfUkVPUkRFUkJVRikKKwkJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5SeEJBV2luTGltaXQgPSBNQVhfUlhfUkVPUkRFUkJVRjsKKworCQkJCQl9CisKKwkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5SRUdCQUNhcGFiaWxpdHkud29yZCA9IHBBZGFwdGVyLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LndvcmQ7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6KE9yZGUuQXV0b0JBID0gJWQpIChQb2xpY3k9JWQpKFJlQkFXaW5MaW1pdD0lZCkoVHhCQVdpbkxpbWl0PSVkKShBdXRvTW9kZT0lZClcbiIsT3JkZS5BdXRvQkEsIHBBZGFwdGVyLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlBvbGljeSwKKwkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlJ4QkFXaW5MaW1pdCxwQWRhcHRlci0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5UeEJBV2luTGltaXQsIHBBZGFwdGVyLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkF1dG9CQSkpOworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OihNaW1vUHMgPSAlZCkoQW1zZHVFbmFibGUgPSAlZCkgKEFtc2R1U2l6ZT0lZCkoTXBkdURlbnNpdHk9JWQpXG4iLHBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5Lk1pbW9QcywgcEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQW1zZHVFbmFibGUsCisJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5BbXNkdVNpemUsIHBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5Lk1wZHVEZW5zaXR5KSk7CisJCQkJfQorCisJCQkJYnJlYWs7CisJCWNhc2UgUlRfT0lEXzgwMl8xMV9BRERfSU1NRV9CQToKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiBTZXQgOjogUlRfT0lEXzgwMl8xMV9BRERfSU1NRV9CQSBcbiIpKTsKKwkJCWlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKE9JRF9BRERfQkFfRU5UUlkpKQorCQkJCQlTdGF0dXMgPSAtRUlOVkFMOworCQkJZWxzZQorCQkJeworCQkJCVVDSEFSCQkgICAgICAgIGluZGV4OworCQkJCU9JRF9BRERfQkFfRU5UUlkgICAgQkE7CisJCQkJTUFDX1RBQkxFX0VOVFJZICAgICAqcEVudHJ5OworCisJCQkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJkJBLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJCWlmIChCQS5USUQgPiAxNSkKKwkJCQl7CisJCQkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX0lOVkFMSURfREFUQTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCS8vQkFUYWJsZUluc2VydEVudHJ5CisJCQkJCS8vQXMgYWQtaG9jIG1vZGUsIEJBIHBhaXIgaXMgbm90IGxpbWl0ZWQgdG8gb25seSBCU1NJRC4gc28gYWRkIHZpYSBPSUQuCisJCQkJCWluZGV4ID0gQkEuVElEOworCQkJCQkvLyBpbiBhZCBob2MgbW9kZSwgd2hlbiBhZGRpbmcgQkEgcGFpciwgd2Ugc2hvdWxkIGluc2VydCB0aGlzIGVudHJ5IGludG8gTUFDRW50cnkgdG9vCisJCQkJCXBFbnRyeSA9IE1hY1RhYmxlTG9va3VwKHBBZGFwdGVyLCBCQS5NQUNBZGRyKTsKKwkJCQkJaWYgKCFwRW50cnkpCisJCQkJCXsKKwkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJUX09JRF84MDJfMTFfQUREX0lNTUVfQkEuIGJyZWFrIG9uIG5vIGNvbm5lY3Rpb24uLS0tLToleDoleFxuIiwgQkEuTUFDQWRkcls0XSwgQkEuTUFDQWRkcls1XSkpOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJaWYgKEJBLklzUmVjaXBpZW50ID09IEZBTFNFKQorCQkJCQl7CisJCQkJCSAgICBpZiAocEVudHJ5LT5iSUFtQmFkQXRoZXJvcyA9PSBUUlVFKQorCQkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlJ4QkFXaW5MaW1pdCA9IDB4MTA7CisKKwkJCQkJCUJBT3JpU2Vzc2lvblNldFVwKHBBZGFwdGVyLCBwRW50cnksIGluZGV4LCAwLCAxMDAsIFRSVUUpOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJLy9CQVRhYmxlSW5zZXJ0RW50cnkocEFkYXB0ZXIsIHBFbnRyeS0+QWlkLCBCQS5NQUNBZGRyLCAwLCAweGZmZmYsIEJBLlRJRCwgQkEubk1TRFUsIEJBLklzUmVjaXBpZW50KTsKKwkJCQkJfQorCisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6UlRfT0lEXzgwMl8xMV9BRERfSU1NRV9CQS4gUmVjID0gJWQuIE1hYyA9ICV4OiV4OiV4OiV4OiV4OiV4IC4gXG4iLAorCQkJCQkJQkEuSXNSZWNpcGllbnQsIEJBLk1BQ0FkZHJbMF0sIEJBLk1BQ0FkZHJbMV0sIEJBLk1BQ0FkZHJbMl0sIEJBLk1BQ0FkZHJbMl0KKwkJCQkJCSwgQkEuTUFDQWRkcls0XSwgQkEuTUFDQWRkcls1XSkpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUlRfT0lEXzgwMl8xMV9URUFSX0lNTUVfQkE6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQgOjogUlRfT0lEXzgwMl8xMV9URUFSX0lNTUVfQkEgXG4iKSk7CisJCQlpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihPSURfQUREX0JBX0VOVFJZKSkKKwkJCQkJU3RhdHVzID0gLUVJTlZBTDsKKwkJCWVsc2UKKwkJCXsKKwkJCQlQT0lEX0FERF9CQV9FTlRSWQlwQkE7CisJCQkJTUFDX1RBQkxFX0VOVFJZICpwRW50cnk7CisKKwkJCQlwQkEgPSBrbWFsbG9jKHdycS0+dS5kYXRhLmxlbmd0aCwgTUVNX0FMTE9DX0ZMQUcpOworCisJCQkJaWYgKHBCQSA9PSBOVUxMKQorCQkJCXsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0IDo6IFJUX09JRF84MDJfMTFfVEVBUl9JTU1FX0JBIGttYWxsb2MoKSBjYW4ndCBhbGxvY2F0ZSBlbm91Z2ggbWVtb3J5XG4iKSk7CisJCQkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX0ZBSUxVUkU7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKHBCQSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0IDo6IFJUX09JRF84MDJfMTFfVEVBUl9JTU1FX0JBKFRJRD0lZCwgYkFsbFRpZD0lZClcbiIsIHBCQS0+VElELCBwQkEtPmJBbGxUaWQpKTsKKworCQkJCQlpZiAoIXBCQS0+YkFsbFRpZCAmJiAocEJBLT5USUQgPiBOVU1fT0ZfVElEKSkKKwkJCQkJeworCQkJCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfSU5WQUxJRF9EQVRBOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKworCQkJCQlpZiAocEJBLT5Jc1JlY2lwaWVudCA9PSBGQUxTRSkKKwkJCQkJeworCQkJCQkJcEVudHJ5ID0gTWFjVGFibGVMb29rdXAocEFkYXB0ZXIsIHBCQS0+TUFDQWRkcik7CisJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIgcEJBLT5Jc1JlY2lwaWVudCA9PSBGQUxTRVxuIikpOworCQkJCQkJaWYgKHBFbnRyeSkKKwkJCQkJCXsKKwkJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIgcEJBLT5wRW50cnlcbiIpKTsKKwkJCQkJCQlCQU9yaVNlc3Npb25UZWFyRG93bihwQWRhcHRlciwgcEVudHJ5LT5BaWQsIHBCQS0+VElELCBGQUxTRSwgVFJVRSk7CisJCQkJCQl9CisJCQkJCQllbHNlCisJCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0IDo6IE5vdCBmb3VuZCBwRW50cnkgXG4iKSk7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlwRW50cnkgPSBNYWNUYWJsZUxvb2t1cChwQWRhcHRlciwgcEJBLT5NQUNBZGRyKTsKKwkJCQkJCWlmIChwRW50cnkpCisJCQkJCQl7CisJCQkJCQkJQkFSZWNTZXNzaW9uVGVhckRvd24oIHBBZGFwdGVyLCAoVUNIQVIpcEVudHJ5LT5BaWQsIHBCQS0+VElELCBUUlVFKTsKKwkJCQkJCX0KKwkJCQkJCWVsc2UKKwkJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQgOjogTm90IGZvdW5kIHBFbnRyeSBcbiIpKTsKKwkJCQkJfQorCQkJCQlrZnJlZShwQkEpOworCQkJCX0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisgICAgICAgIC8vIEZvciBXUEFfU1VQUExJQ0FOVCB0byBzZXQgc3RhdGljIHdlcCBrZXkKKyAgICAJY2FzZSBPSURfODAyXzExX0FERF9XRVA6CisgICAgCSAgICBwV2VwS2V5ID0ga21hbGxvYyh3cnEtPnUuZGF0YS5sZW5ndGgsIE1FTV9BTExPQ19GTEFHKTsKKworICAgIAkgICAgaWYocFdlcEtleSA9PSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FTk9NRU07CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX0FERF9XRVAsIEZhaWxlZCEhXG4iKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcihwV2VwS2V5LCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgaWYgKFN0YXR1cykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfQUREX1dFUCwgRmFpbGVkIChsZW5ndGggbWlzbWF0Y2gpISFcbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKwkJICAgICAgICBLZXlJZHggPSBwV2VwS2V5LT5LZXlJbmRleCAmIDB4MGZmZmZmZmY7CisgICAgICAgICAgICAgICAgLy8gS2V5SWR4IG11c3QgYmUgMCB+IDMKKyAgICAgICAgICAgICAgICBpZiAoS2V5SWR4ID4gNCkKKyAgICAJCQl7CisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfQUREX1dFUCwgRmFpbGVkIChLZXlJZHggbXVzdCBiZSBzbWFsbGVyIHRoYW4gNCkhIVxuIikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBVQ0hBUiBDaXBoZXJBbGcgPSAwOworICAgICAgICAgICAgICAgICAgICBQVUNIQVIgS2V5OworCisgICAgICAgICAgICAgICAgICAgIC8vIHNldCBrZXkgbWF0ZXJpYWwgYW5kIGtleSBsZW5ndGgKKyAgICAgICAgICAgICAgICAgICAgTmRpc1plcm9NZW1vcnkocEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLktleSwgMTYpOworICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uS2V5TGVuID0gKFVDSEFSKSBwV2VwS2V5LT5LZXlMZW5ndGg7CisgICAgICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5LZXksICZwV2VwS2V5LT5LZXlNYXRlcmlhbCwgcFdlcEtleS0+S2V5TGVuZ3RoKTsKKworICAgICAgICAgICAgICAgICAgICBzd2l0Y2gocFdlcEtleS0+S2V5TGVuZ3RoKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfQUREX1dFUCwgb25seSBzdXBwb3J0IENJUEhFUl9XRVA2NChsZW46NSkgJiBDSVBIRVJfV0VQMTI4KGxlbjoxMykhIVxuIikpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLkNpcGhlckFsZyA9IENpcGhlckFsZzsKKworICAgICAgICAgICAgICAgICAgICAvLyBEZWZhdWx0IGtleSBmb3IgdHggKHNoYXJlZCBrZXkpCisgICAgICAgICAgICAgICAgICAgIGlmIChwV2VwS2V5LT5LZXlJbmRleCAmIDB4ODAwMDAwMDApCisgICAgICAgICAgICAgICAgICAgIHsKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXQga2V5IG1hdGVyaWFsIGFuZCBrZXkgbGVuZ3RoCisgICAgICAgICAgICAgICAgICAgICAgICBOZGlzWmVyb01lbW9yeShwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZVNoYXJlZEtleVtLZXlJZHhdLktleSwgMTYpOworICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVTaGFyZWRLZXlbS2V5SWR4XS5LZXlMZW4gPSAoVUNIQVIpIHBXZXBLZXktPktleUxlbmd0aDsKKyAgICAgICAgICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlU2hhcmVkS2V5W0tleUlkeF0uS2V5LCAmcFdlcEtleS0+S2V5TWF0ZXJpYWwsIHBXZXBLZXktPktleUxlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZVNoYXJlZEtleUlkID0gS2V5SWR4OworICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVTaGFyZWRLZXlbS2V5SWR4XS5DaXBoZXJBbGcgPSBDaXBoZXJBbGc7CisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWQgPSAoVUNIQVIpIEtleUlkeDsKKyAgICAgICAgICAgICAgICAgICAgfQorCisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgICAgICAgICAgICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5Qb3J0U2VjdXJlZCA9PSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRCkKKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEtleSA9IHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5LZXk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNldCBrZXkgbWF0ZXJpYWwgYW5kIGNpcGhlckFsZyB0byBBc2ljCisgICAgICAgIAkJCQlBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkYXB0ZXIsIEJTUzAsIEtleUlkeCwgQ2lwaGVyQWxnLCBLZXksIE5VTEwsIE5VTEwpOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocFdlcEtleS0+S2V5SW5kZXggJiAweDgwMDAwMDAwKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBNQUNfVEFCTEVfRU5UUlkgcEVudHJ5ID0gJnBBZGFwdGVyLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBc3NpZ24gZ3JvdXAga2V5IGluZm8KKyAgICAJCQkJCQlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZGFwdGVyLCBCU1MwLCBLZXlJZHgsIENpcGhlckFsZywgTlVMTCk7CisgICAgCQkJCQkJLy8gQXNzaWduIHBhaXJ3aXNlIGtleSBpbmZvCisgICAgCQkJCQkJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWRhcHRlciwgQlNTMCwgS2V5SWR4LCBDaXBoZXJBbGcsIHBFbnRyeSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX0FERF9XRVAgKGlkPTB4JXgsIExlbj0lZC1ieXRlKSwgJXNcbiIsIHBXZXBLZXktPktleUluZGV4LCBwV2VwS2V5LT5LZXlMZW5ndGgsIChwQWRhcHRlci0+U3RhQ2ZnLlBvcnRTZWN1cmVkID09IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEKSA/ICJQb3J0IFNlY3VyZWQiOiJQb3J0IE5PVCBTZWN1cmVkIikpOworCQkJCX0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGtmcmVlKHBXZXBLZXkpOworICAgICAgICAgICAgYnJlYWs7CisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorCSAgICBjYXNlIE9JRF9TRVRfQ09VTlRFUk1FQVNVUkVTOgorICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoaW50KSkKKyAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgZW5hYmxlZCA9IDA7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJmVuYWJsZWQsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgaWYgKGVuYWJsZWQgPT0gMSkKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5iQmxvY2tBc3NvYyA9IFRSVUU7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAvLyBXUEEgTUlDIGVycm9yIHNob3VsZCBibG9jayBhc3NvY2lhdGlvbiBhdHRlbXB0IGZvciA2MCBzZWNvbmRzCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuYkJsb2NrQXNzb2MgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF9TRVRfQ09VTlRFUk1FQVNVUkVTIGJCbG9ja0Fzc29jPSVzXG4iLCBwQWRhcHRlci0+U3RhQ2ZnLmJCbG9ja0Fzc29jID8gIlRSVUUiOiJGQUxTRSIpKTsKKyAgICAgICAgICAgIH0KKwkgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJUX09JRF9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUOgorCQkJaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoVUNIQVIpKQorICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZ3cGFfc3VwcGxpY2FudF9lbmFibGUsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgCQkJcEFkYXB0ZXItPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgPSB3cGFfc3VwcGxpY2FudF9lbmFibGU7CisgICAgCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpSVF9PSURfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAoPSVkKVxuIiwgcEFkYXB0ZXItPlN0YUNmZy5XcGFTdXBwbGljYW50VVApKTsKKwkJCX0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfREVBVVRIRU5USUNBVElPTjoKKyAgICAgICAgICAgIGlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKE1MTUVfREVBVVRIX1JFUV9TVFJVQ1QpKQorICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE1MTUVfREVBVVRIX1JFUV9TVFJVQ1QgICAgICAqcEluZm87CisJCQkJTUxNRV9RVUVVRV9FTEVNICpNc2dFbGVtID0gKE1MTUVfUVVFVUVfRUxFTSAqKSBrbWFsbG9jKHNpemVvZihNTE1FX1FVRVVFX0VMRU0pLCBNRU1fQUxMT0NfRkxBRyk7CisKKyAgICAgICAgICAgICAgICBwSW5mbyA9IChNTE1FX0RFQVVUSF9SRVFfU1RSVUNUICopIE1zZ0VsZW0tPk1zZzsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcihwSW5mbywgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBNbG1lRGVhdXRoUmVxQWN0aW9uKHBBZGFwdGVyLCBNc2dFbGVtKTsKKwkJCQlrZnJlZShNc2dFbGVtKTsKKworICAgICAgICAgICAgICAgIGlmIChJTkZSQV9PTihwQWRhcHRlcikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBMaW5rRG93bihwQWRhcHRlciwgRkFMU0UpOworICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlID0gQVNTT0NfSURMRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX0RFQVVUSEVOVElDQVRJT04gKFJlYXNvbj0lZClcbiIsIHBJbmZvLT5SZWFzb24pKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfRFJPUF9VTkVOQ1JZUFRFRDoKKyAgICAgICAgICAgIGlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKGludCkpCisgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGVuYWJsZWQgPSAwOworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZlbmFibGVkLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgICAgIGlmIChlbmFibGVkID09IDEpCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQ7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQ7CisJCQkJTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkYXB0ZXItPk1hY1RhYkxvY2spOworCQkJCXBBZGFwdGVyLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5Qb3J0U2VjdXJlZCA9IHBBZGFwdGVyLT5TdGFDZmcuUG9ydFNlY3VyZWQ7CisJCQkJTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkYXB0ZXItPk1hY1RhYkxvY2spOworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9EUk9QX1VORU5DUllQVEVEICg9JWQpXG4iLCBlbmFibGVkKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX1NFVF9JRUVFODAyMVg6CisgICAgICAgICAgICBpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihCT09MRUFOKSkKKyAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmSUVFRTgwMjF4U3RhdGUsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCSAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5JRUVFODAyMVggPSBJRUVFODAyMXhTdGF0ZTsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfU0VUX0lFRUU4MDIxWCAoPSVkKVxuIiwgSUVFRTgwMjF4U3RhdGUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfU0VUX0lFRUU4MDIxWF9SRVFVSVJFX0tFWToKKwkJCWlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKEJPT0xFQU4pKQorCQkJCSBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmSUVFRTgwMjF4X3JlcXVpcmVkX2tleXMsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQkJcEFkYXB0ZXItPlN0YUNmZy5JRUVFODAyMXhfcmVxdWlyZWRfa2V5cyA9IElFRUU4MDIxeF9yZXF1aXJlZF9rZXlzOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9TRVRfSUVFRTgwMjFYX1JFUVVJUkVfS0VZICglZClcbiIsIElFRUU4MDIxeF9yZXF1aXJlZF9rZXlzKSk7CisJCQl9CisJCQlicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX1BNS0lEOgorCSAgICAgICAgcFBta0lkID0ga21hbGxvYyh3cnEtPnUuZGF0YS5sZW5ndGgsIE1FTV9BTExPQ19GTEFHKTsKKworCSAgICAgICAgaWYocFBta0lkID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRU5PTUVNOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIocFBta0lkLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCisJICAgICAgICAvLyBjaGVjayB0aGUgUE1LSUQgaW5mb3JtYXRpb24KKwkgICAgICAgIGlmIChwUG1rSWQtPkJTU0lESW5mb0NvdW50ID09IDApCisgICAgICAgICAgICAgICAgTmRpc1plcm9NZW1vcnkocEFkYXB0ZXItPlN0YUNmZy5TYXZlZFBNSywgc2l6ZW9mKEJTU0lEX0lORk8pKlBNS0lEX05PKTsKKwkgICAgICAgIGVsc2UKKwkgICAgICAgIHsKKwkJICAgICAgICBQQlNTSURfSU5GTwlwQnNzSWRJbmZvOworCQkgICAgICAgIFVJTlQJCUJzc0lkeDsKKwkJICAgICAgICBVSU5UCQlDYWNoZWRJZHg7CisKKwkJICAgICAgICBmb3IgKEJzc0lkeCA9IDA7IEJzc0lkeCA8IHBQbWtJZC0+QlNTSURJbmZvQ291bnQ7IEJzc0lkeCsrKQorCQkgICAgICAgIHsKKwkJCSAgICAgICAgLy8gcG9pbnQgdG8gdGhlIGluZGV4ZWQgQlNTSURfSU5GTyBzdHJ1Y3R1cmUKKwkJCSAgICAgICAgcEJzc0lkSW5mbyA9IChQQlNTSURfSU5GTykgKChQVUNIQVIpIHBQbWtJZCArIDIgKiBzaXplb2YoVUlOVCkgKyBCc3NJZHggKiBzaXplb2YoQlNTSURfSU5GTykpOworCQkJICAgICAgICAvLyBGaW5kIHRoZSBlbnRyeSBpbiB0aGUgc2F2ZWQgZGF0YSBiYXNlLgorCQkJICAgICAgICBmb3IgKENhY2hlZElkeCA9IDA7IENhY2hlZElkeCA8IHBBZGFwdGVyLT5TdGFDZmcuU2F2ZWRQTUtOdW07IENhY2hlZElkeCsrKQorCQkJICAgICAgICB7CisJCQkJICAgICAgICAvLyBjb21wYXJlIHRoZSBCU1NJRAorCQkJCSAgICAgICAgaWYgKE5kaXNFcXVhbE1lbW9yeShwQnNzSWRJbmZvLT5CU1NJRCwgcEFkYXB0ZXItPlN0YUNmZy5TYXZlZFBNS1tDYWNoZWRJZHhdLkJTU0lELCBzaXplb2YoTkRJU184MDJfMTFfTUFDX0FERFJFU1MpKSkKKwkJCQkJICAgICAgICBicmVhazsKKwkJCSAgICAgICAgfQorCisJCQkgICAgICAgIC8vIEZvdW5kLCByZXBsYWNlIGl0CisJCQkgICAgICAgIGlmIChDYWNoZWRJZHggPCBQTUtJRF9OTykKKwkJCSAgICAgICAgeworCQkJCSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfT0ZGLCAoIlVwZGF0ZSBPSURfODAyXzExX1BNS0lELCBpZHggPSAlZFxuIiwgQ2FjaGVkSWR4KSk7CisJCQkJICAgICAgICBOZGlzTW92ZU1lbW9yeSgmcEFkYXB0ZXItPlN0YUNmZy5TYXZlZFBNS1tDYWNoZWRJZHhdLCBwQnNzSWRJbmZvLCBzaXplb2YoQlNTSURfSU5GTykpOworCQkJCSAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5TYXZlZFBNS051bSsrOworCQkJICAgICAgICB9CisJCQkgICAgICAgIC8vIE5vdCBmb3VuZCwgcmVwbGFjZSB0aGUgbGFzdCBvbmUKKwkJCSAgICAgICAgZWxzZQorCQkJICAgICAgICB7CisJCQkJICAgICAgICAvLyBSYW5kb21seSByZXBsYWNlIG9uZQorCQkJCSAgICAgICAgQ2FjaGVkSWR4ID0gKHBCc3NJZEluZm8tPkJTU0lEWzVdICUgUE1LSURfTk8pOworCQkJCSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfT0ZGLCAoIlVwZGF0ZSBPSURfODAyXzExX1BNS0lELCBpZHggPSAlZFxuIiwgQ2FjaGVkSWR4KSk7CisJCQkJICAgICAgICBOZGlzTW92ZU1lbW9yeSgmcEFkYXB0ZXItPlN0YUNmZy5TYXZlZFBNS1tDYWNoZWRJZHhdLCBwQnNzSWRJbmZvLCBzaXplb2YoQlNTSURfSU5GTykpOworCQkJICAgICAgICB9CisJCSAgICAgICAgfQorCQkJfQorCQkJaWYocFBta0lkKQorCQkJCWtmcmVlKHBQbWtJZCk7CisJICAgICAgICBicmVhazsKKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisKKworCisjaWZkZWYgU05NUF9TVVBQT1JUCisJCWNhc2UgT0lEXzgwMl8xMV9TSE9SVFJFVFJZTElNSVQ6CisJCQlpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihVTE9ORykpCisJCQkJU3RhdHVzID0gLUVJTlZBTDsKKwkJCWVsc2UKKwkJCXsKKwkJCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmU2hvcnRSZXRyeUxpbWl0LCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJCVJUTVBfSU9fUkVBRDMyKHBBZGFwdGVyLCBUWF9SVFlfQ0ZHLCAmdHhfcnR5X2NmZy53b3JkKTsKKwkJCQl0eF9ydHlfY2ZnLmZpZWxkLlNob3J0UnR5TGltaXQgPSBTaG9ydFJldHJ5TGltaXQ7CisJCQkJUlRNUF9JT19XUklURTMyKHBBZGFwdGVyLCBUWF9SVFlfQ0ZHLCB0eF9ydHlfY2ZnLndvcmQpOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9TSE9SVFJFVFJZTElNSVQgKHR4X3J0eV9jZmcuZmllbGQuU2hvcnRSZXRyeUxpbWl0PSVkLCBTaG9ydFJldHJ5TGltaXQ9JWxkKVxuIiwgdHhfcnR5X2NmZy5maWVsZC5TaG9ydFJ0eUxpbWl0LCBTaG9ydFJldHJ5TGltaXQpKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgT0lEXzgwMl8xMV9MT05HUkVUUllMSU1JVDoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9MT05HUkVUUllMSU1JVCBcbiIpKTsKKwkJCWlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKFVMT05HKSkKKwkJCQlTdGF0dXMgPSAtRUlOVkFMOworCQkJZWxzZQorCQkJeworCQkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZMb25nUmV0cnlMaW1pdCwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCQlSVE1QX0lPX1JFQUQzMihwQWRhcHRlciwgVFhfUlRZX0NGRywgJnR4X3J0eV9jZmcud29yZCk7CisJCQkJdHhfcnR5X2NmZy5maWVsZC5Mb25nUnR5TGltaXQgPSBMb25nUmV0cnlMaW1pdDsKKwkJCQlSVE1QX0lPX1dSSVRFMzIocEFkYXB0ZXIsIFRYX1JUWV9DRkcsIHR4X3J0eV9jZmcud29yZCk7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX0xPTkdSRVRSWUxJTUlUICh0eF9ydHlfY2ZnLmZpZWxkLkxvbmdSZXRyeUxpbWl0PSAlZCxMb25nUmV0cnlMaW1pdD0lbGQpXG4iLCB0eF9ydHlfY2ZnLmZpZWxkLkxvbmdSdHlMaW1pdCwgTG9uZ1JldHJ5TGltaXQpKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgT0lEXzgwMl8xMV9XRVBERUZBVUxUS0VZVkFMVUU6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfV0VQREVGQVVMVEtFWVZBTFVFXG4iKSk7CisJCQlwS2V5ID0ga21hbGxvYyh3cnEtPnUuZGF0YS5sZW5ndGgsIEdGUF9LRVJORUwpOworCQkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIocEtleSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCS8vcEtleSA9ICZXZXBLZXk7CisKKwkJCWlmICggcEtleS0+TGVuZ3RoICE9IHdycS0+dS5kYXRhLmxlbmd0aCkKKwkJCXsKKwkJCQlTdGF0dXMgPSAtRUlOVkFMOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9XRVBERUZBVUxUS0VZVkFMVUUsIEZhaWxlZCEhXG4iKSk7CisJCQl9CisJCQlLZXlJZHggPSBwS2V5LT5LZXlJbmRleCAmIDB4MGZmZmZmZmY7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoInBLZXktPktleUluZGV4ID0lZCwgcEtleS0+S2V5TGVuZ3RoPSVkXG4iLCBwS2V5LT5LZXlJbmRleCwgcEtleS0+S2V5TGVuZ3RoKSk7CisKKwkJCS8vIGl0IGlzIGEgc2hhcmVkIGtleQorCQkJaWYgKEtleUlkeCA+IDQpCisJCQkJU3RhdHVzID0gLUVJTlZBTDsKKwkJCWVsc2UKKwkJCXsKKwkJCQlwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW3BBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5LZXlMZW4gPSAoVUNIQVIpIHBLZXktPktleUxlbmd0aDsKKwkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uS2V5LCAmcEtleS0+S2V5TWF0ZXJpYWwsIHBLZXktPktleUxlbmd0aCk7CisJCQkJaWYgKHBLZXktPktleUluZGV4ICYgMHg4MDAwMDAwMCkKKwkJCQl7CisJCQkJCS8vIERlZmF1bHQga2V5IGZvciB0eCAoc2hhcmVkIGtleSkKKwkJCQkJcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWQgPSAoVUNIQVIpIEtleUlkeDsKKwkJCQl9CisJCQkJLy9SZXN0YXJ0QVBJc1JlcXVpcmVkID0gVFJVRTsKKwkJCX0KKwkJCWJyZWFrOworCisKKwkJY2FzZSBPSURfODAyXzExX1dFUERFRkFVTFRLRVlJRDoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9XRVBERUZBVUxUS0VZSUQgXG4iKSk7CisKKwkJCWlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKFVDSEFSKSkKKwkJCQlTdGF0dXMgPSAtRUlOVkFMOworCQkJZWxzZQorCQkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKworCQkJYnJlYWs7CisKKworCQljYXNlIE9JRF84MDJfMTFfQ1VSUkVOVENIQU5ORUw6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfQ1VSUkVOVENIQU5ORUwgXG4iKSk7CisJCQlpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihVQ0hBUikpCisJCQkJU3RhdHVzID0gLUVJTlZBTDsKKwkJCWVsc2UKKwkJCXsKKwkJCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmY3RtcCwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCQlzcHJpbnRmKCZjdG1wLCIlZCIsIGN0bXApOworCQkJCVNldF9DaGFubmVsX1Byb2MocEFkYXB0ZXIsICZjdG1wKTsKKwkJCX0KKwkJCWJyZWFrOworI2VuZGlmCisKKworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OnVua25vd24gSU9DVEwncyBzdWJjbWQgPSAweCUwOHhcbiIsIGNtZCkpOworICAgICAgICAgICAgU3RhdHVzID0gLUVPUE5PVFNVUFA7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKworICAgIHJldHVybiBTdGF0dXM7Cit9CisKK0lOVCBSVE1QUXVlcnlJbmZvcm1hdGlvbigKKyAgICBJTiAgUFJUTVBfQURBUFRFUiBwQWRhcHRlciwKKyAgICBJTiAgT1VUIHN0cnVjdCBpZnJlcSAgICAqcnEsCisgICAgSU4gIElOVCAgICAgICAgICAgICAgICAgY21kKQoreworICAgIHN0cnVjdCBpd3JlcSAgICAgICAgICAgICAgICAgICAgICAgICp3cnEgPSAoc3RydWN0IGl3cmVxICopIHJxOworICAgIE5ESVNfODAyXzExX0JTU0lEX0xJU1RfRVggICAgICAgICAgICpwQnNzaWRMaXN0ID0gTlVMTDsKKyAgICBQTkRJU19XTEFOX0JTU0lEX0VYICAgICAgICAgICAgICAgICBwQnNzOworICAgIE5ESVNfODAyXzExX1NTSUQgICAgICAgICAgICAgICAgICAgIFNzaWQ7CisgICAgTkRJU184MDJfMTFfQ09ORklHVVJBVElPTiAgICAgICAgICAgKnBDb25maWd1cmF0aW9uID0gTlVMTDsKKyAgICBSVF84MDJfMTFfTElOS19TVEFUVVMgICAgICAgICAgICAgICAqcExpbmtTdGF0dXMgPSBOVUxMOworICAgIFJUXzgwMl8xMV9TVEFfQ09ORklHICAgICAgICAgICAgICAgICpwU3RhQ29uZmlnID0gTlVMTDsKKyAgICBORElTXzgwMl8xMV9TVEFUSVNUSUNTICAgICAgICAgICAgICAqcFN0YXRpc3RpY3MgPSBOVUxMOworICAgIE5ESVNfODAyXzExX1JUU19USFJFU0hPTEQgICAgICAgICAgIFJ0c1RocmVzaDsKKyAgICBORElTXzgwMl8xMV9GUkFHTUVOVEFUSU9OX1RIUkVTSE9MRCBGcmFnVGhyZXNoOworICAgIE5ESVNfODAyXzExX1BPV0VSX01PREUgICAgICAgICAgICAgIFBvd2VyTW9kZTsKKyAgICBORElTXzgwMl8xMV9ORVRXT1JLX0lORlJBU1RSVUNUVVJFICBCc3NUeXBlOworICAgIFJUXzgwMl8xMV9QUkVBTUJMRSAgICAgICAgICAgICAgICAgIFByZWFtVHlwZTsKKyAgICBORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9NT0RFICAgICBBdXRoTW9kZTsKKyAgICBORElTXzgwMl8xMV9XRVBfU1RBVFVTICAgICAgICAgICAgICBXZXBTdGF0dXM7CisgICAgTkRJU19NRURJQV9TVEFURSAgICAgICAgICAgICAgICAgICAgTWVkaWFTdGF0ZTsKKyAgICBVTE9ORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCc3NCdWZTaXplLCB1bEluZm89MCwgTmV0d29ya1R5cGVMaXN0WzRdLCBhcHNkID0gMDsKKyAgICBVU0hPUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCc3NMZW4gPSAwOworICAgIFBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCdWYgPSBOVUxMLCBwUHRyOworICAgIElOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisgICAgVUlOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2VfdmVyc2lvbl9jb21waWxlZDsKKyAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLCBQYWRkaW5nID0gMDsKKyAgICBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSYWRpb1N0YXRlOworCVVDSEFSCWRyaXZlclZlcnNpb25bOF07CisgICAgT0lEX1NFVF9IVF9QSFlNT0RFCQkJICAgICAgICAqcEhUUGh5TW9kZSA9IE5VTEw7CisKKworI2lmZGVmIFNOTVBfU1VQUE9SVAorCS8vZm9yIHNubXAsIGthdGh5CisJRGVmYXVsdEtleUlkeFZhbHVlCQkJKnBLZXlJZHhWYWx1ZTsKKwlJTlQJCQkJCQkJdmFsdWVMZW47CisJVFhfUlRZX0NGR19TVFJVQwkJCXR4X3J0eV9jZmc7CisJVUxPTkcJCQkJCQlTaG9ydFJldHJ5TGltaXQsIExvbmdSZXRyeUxpbWl0OworCVVDSEFSCQkJCQkJdG1wWzY0XTsKKyNlbmRpZiAvL1NOTVAKKworICAgIHN3aXRjaChjbWQpCisgICAgeworICAgICAgICBjYXNlIFJUX09JRF9ERVZJQ0VfTkFNRToKKyAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihTVEFfTklDX0RFVklDRV9OQU1FKTsKKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBTVEFfTklDX0RFVklDRV9OQU1FLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlRfT0lEX1ZFUlNJT05fSU5GTzoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfVkVSU0lPTl9JTkZPIFxuIikpOworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gOCpzaXplb2YoVUNIQVIpOworCQkJc3ByaW50ZigmZHJpdmVyVmVyc2lvblswXSwgIiVzIiwgU1RBX0RSSVZFUl9WRVJTSU9OKTsKKwkJCWRyaXZlclZlcnNpb25bN10gPSAnXDAnOworCQkJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmZHJpdmVyVmVyc2lvbiwgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIHsKKwkJCQlTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisjaWZkZWYgUkFMSU5LX0FURQorCQljYXNlIFJUX1FVRVJZX0FURV9UWERPTkVfQ09VTlQ6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfUVVFUllfQVRFX1RYRE9ORV9DT1VOVCBcbiIpKTsKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihVSU5UMzIpOworCQkJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmcEFkYXB0ZXItPmF0ZS5UeERvbmVDb3VudCwgd3JxLT51LmRhdGEubGVuZ3RoKSkKKwkJCXsKKwkJCQlTdGF0dXMgPSAtRUZBVUxUOworCQkJfQorCQkJYnJlYWs7CisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworICAgICAgICBjYXNlIE9JRF84MDJfMTFfQlNTSURfTElTVDoKKyAgICAgICAgICAgIGlmIChSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAJLyoKKyAgICAgICAgICAgIAkgKiBTdGlsbCBzY2FubmluZywgaW5kaWNhdGUgdGhlIGNhbGxlciBzaG91bGQgdHJ5IGFnYWluLgorICAgICAgICAgICAgCSAqLworICAgICAgICAgICAgCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX0JTU0lEX0xJU1QgKFN0aWxsIHNjYW5uaW5nKVxuIikpOworCQkJCXJldHVybiAtRUFHQUlOOworICAgICAgICAgICAgfQorICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfQlNTSURfTElTVCAoJWQgQlNTIHJldHVybmVkKVxuIixwQWRhcHRlci0+U2NhblRhYi5Cc3NOcikpOworCQkJcEFkYXB0ZXItPlN0YUNmZy5iU2NhblJlcUlzRnJvbVdlYlVJID0gRkFMU0U7CisgICAgICAgICAgICAvLyBDbGFjdWxhdGUgdG90YWwgYnVmZmVyIHNpemUgcmVxdWlyZWQKKyAgICAgICAgICAgIEJzc0J1ZlNpemUgPSBzaXplb2YoVUxPTkcpOworCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcEFkYXB0ZXItPlNjYW5UYWIuQnNzTnI7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBBbGlnbiBwb2ludGVyIHRvIDQgYnl0ZXMgYm91bmRhcnkuCisgICAgICAgICAgICAgICAgLy9QYWRkaW5nID0gNCAtIChwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5WYXJJRUxlbiAmIDB4MDAwMyk7CisgICAgICAgICAgICAgICAgLy9pZiAoUGFkZGluZyA9PSA0KQorICAgICAgICAgICAgICAgIC8vICAgIFBhZGRpbmcgPSAwOworICAgICAgICAgICAgICAgIEJzc0J1ZlNpemUgKz0gKHNpemVvZihORElTX1dMQU5fQlNTSURfRVgpIC0gMSArIHNpemVvZihORElTXzgwMl8xMV9GSVhFRF9JRXMpICsgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uVmFySUVMZW4gKyBQYWRkaW5nKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gRm9yIHNhZmV0eSBpc3N1ZSwgd2UgYWRkIDI1NiBieXRlcyBqdXN0IGluIGNhc2UKKyAgICAgICAgICAgIEJzc0J1ZlNpemUgKz0gMjU2OworICAgICAgICAgICAgLy8gQWxsb2NhdGUgdGhlIHNhbWUgc2l6ZSBhcyBwYXNzZWQgZnJvbSBoaWdoZXIgbGF5ZXIKKyAgICAgICAgICAgIHBCdWYgPSBrbWFsbG9jKEJzc0J1ZlNpemUsIE1FTV9BTExPQ19GTEFHKTsKKyAgICAgICAgICAgIGlmKHBCdWYgPT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRU5PTUVNOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gSW5pdCA4MDJfMTFfQlNTSURfTElTVF9FWCBzdHJ1Y3R1cmUKKyAgICAgICAgICAgIE5kaXNaZXJvTWVtb3J5KHBCdWYsIEJzc0J1ZlNpemUpOworICAgICAgICAgICAgcEJzc2lkTGlzdCA9IChQTkRJU184MDJfMTFfQlNTSURfTElTVF9FWCkgcEJ1ZjsKKyAgICAgICAgICAgIHBCc3NpZExpc3QtPk51bWJlck9mSXRlbXMgPSBwQWRhcHRlci0+U2NhblRhYi5Cc3NOcjsKKworICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIHRvdGFsIGJ1ZmZlciBsZW5ndGgKKyAgICAgICAgICAgIEJzc0xlbiA9IDQ7IC8vIENvbnNpc3Qgb2YgTnVtYmVyT2ZJdGVtcworICAgICAgICAgICAgLy8gUG9pbnQgdG8gc3RhcnQgb2YgTkRJU19XTEFOX0JTU0lEX0VYCisgICAgICAgICAgICAvLyBwUHRyID0gcEJ1ZiArIHNpemVvZihVTE9ORyk7CisgICAgICAgICAgICBwUHRyID0gKFBVQ0hBUikgJnBCc3NpZExpc3QtPkJzc2lkWzBdOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHBBZGFwdGVyLT5TY2FuVGFiLkJzc05yOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcEJzcyA9IChQTkRJU19XTEFOX0JTU0lEX0VYKSBwUHRyOworICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KCZwQnNzLT5NYWNBZGRyZXNzLCAmcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uQnNzaWQsIE1BQ19BRERSX0xFTik7CisgICAgICAgICAgICAgICAgaWYgKChwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5IaWRkZW4gPT0gMSkgJiYgKHBBZGFwdGVyLT5TdGFDZmcuYlNob3dIaWRkZW5TU0lEID09IEZBTFNFKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vCisJCQkJCS8vIFdlIG11c3QgcmV0dXJuIHRoaXMgU1NJRCBkdXJpbmcgNHdheSBoYW5kc2hha2luZywgb3RoZXJ3aXNlIEFlZ2lzIHdpbGwgZmFpbGVkIHRvIHBhcnNlIFdQQSBpbmZvbWF0aW9uCisJCQkJCS8vIGFuZCB0aGVuIGZhaWxlZCB0byBzZW5kIEVBUE9sIGZhcmFtZS4KKwkJCQkJLy8KKwkJCQkJaWYgKChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkgJiYgKHBBZGFwdGVyLT5TdGFDZmcuUG9ydFNlY3VyZWQgIT0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQpKQorCQkJCQl7CisJCQkJCQlwQnNzLT5Tc2lkLlNzaWRMZW5ndGggPSBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Tc2lkTGVuOworCQkJCQkJTmRpc01vdmVNZW1vcnkocEJzcy0+U3NpZC5Tc2lkLCBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Tc2lkLCBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Tc2lkTGVuKTsKKwkJCQkJfQorCQkJCQllbHNlCisgICAgICAgICAgICAgICAgICAgIAlwQnNzLT5Tc2lkLlNzaWRMZW5ndGggPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwQnNzLT5Tc2lkLlNzaWRMZW5ndGggPSBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Tc2lkTGVuOworICAgICAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQnNzLT5Tc2lkLlNzaWQsIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlNzaWQsIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlNzaWRMZW4pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwQnNzLT5Qcml2YWN5ID0gcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uUHJpdmFjeTsKKyAgICAgICAgICAgICAgICBwQnNzLT5Sc3NpID0gcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uUnNzaSAtIHBBZGFwdGVyLT5CYnBSc3NpVG9EYm1EZWx0YTsKKyAgICAgICAgICAgICAgICBwQnNzLT5OZXR3b3JrVHlwZUluVXNlID0gTmV0d29ya1R5cGVJblVzZVNhbml0eSgmcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0pOworICAgICAgICAgICAgICAgIHBCc3MtPkNvbmZpZ3VyYXRpb24uTGVuZ3RoID0gc2l6ZW9mKE5ESVNfODAyXzExX0NPTkZJR1VSQVRJT04pOworICAgICAgICAgICAgICAgIHBCc3MtPkNvbmZpZ3VyYXRpb24uQmVhY29uUGVyaW9kID0gcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uQmVhY29uUGVyaW9kOworICAgICAgICAgICAgICAgIHBCc3MtPkNvbmZpZ3VyYXRpb24uQVRJTVdpbmRvdyA9IHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkF0aW1XaW47CisKKyAgICAgICAgICAgICAgICBNQVBfQ0hBTk5FTF9JRF9UT19LSFoocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uQ2hhbm5lbCwgcEJzcy0+Q29uZmlndXJhdGlvbi5EU0NvbmZpZyk7CisKKyAgICAgICAgICAgICAgICBpZiAocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uQnNzVHlwZSA9PSBCU1NfSU5GUkEpCisgICAgICAgICAgICAgICAgICAgIHBCc3MtPkluZnJhc3RydWN0dXJlTW9kZSA9IE5kaXM4MDJfMTFJbmZyYXN0cnVjdHVyZTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHBCc3MtPkluZnJhc3RydWN0dXJlTW9kZSA9IE5kaXM4MDJfMTFJQlNTOworCisgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEJzcy0+U3VwcG9ydGVkUmF0ZXMsIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlN1cFJhdGUsIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlN1cFJhdGVMZW4pOworICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBCc3MtPlN1cHBvcnRlZFJhdGVzICsgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uU3VwUmF0ZUxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5FeHRSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkV4dFJhdGVMZW4pOworCisgICAgICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlZhcklFTGVuID09IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwQnNzLT5JRUxlbmd0aCA9IHNpemVvZihORElTXzgwMl8xMV9GSVhFRF9JRXMpOworICAgICAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQnNzLT5JRXMsICZwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5GaXhJRXMsIHNpemVvZihORElTXzgwMl8xMV9GSVhFRF9JRXMpKTsKKyAgICAgICAgICAgICAgICAgICAgcFB0ciA9IHBQdHIgKyBzaXplb2YoTkRJU19XTEFOX0JTU0lEX0VYKSAtIDEgKyBzaXplb2YoTkRJU184MDJfMTFfRklYRURfSUVzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcEJzcy0+SUVMZW5ndGggPSAoVUxPTkcpKHNpemVvZihORElTXzgwMl8xMV9GSVhFRF9JRXMpICsgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uVmFySUVMZW4pOworICAgICAgICAgICAgICAgICAgICBwUHRyID0gcFB0ciArIHNpemVvZihORElTX1dMQU5fQlNTSURfRVgpIC0gMSArIHNpemVvZihORElTXzgwMl8xMV9GSVhFRF9JRXMpOworICAgICAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQnNzLT5JRXMsICZwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5GaXhJRXMsIHNpemVvZihORElTXzgwMl8xMV9GSVhFRF9JRXMpKTsKKyAgICAgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEJzcy0+SUVzICsgc2l6ZW9mKE5ESVNfODAyXzExX0ZJWEVEX0lFcyksIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlZhcklFcywgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uVmFySUVMZW4pOworICAgICAgICAgICAgICAgICAgICBwUHRyICs9IHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlZhcklFTGVuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwQnNzLT5MZW5ndGggPSAoVUxPTkcpKHNpemVvZihORElTX1dMQU5fQlNTSURfRVgpIC0gMSArIHNpemVvZihORElTXzgwMl8xMV9GSVhFRF9JRXMpICsgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uVmFySUVMZW4gKyBQYWRkaW5nKTsKKworI2lmIFdJUkVMRVNTX0VYVCA8IDE3CisgICAgICAgICAgICAgICAgaWYgKChCc3NMZW4gKyBwQnNzLT5MZW5ndGgpIDwgd3JxLT51LmRhdGEubGVuZ3RoKQorICAgICAgICAgICAgICAgIEJzc0xlbiArPSBwQnNzLT5MZW5ndGg7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcEJzc2lkTGlzdC0+TnVtYmVyT2ZJdGVtcyA9IGk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyNlbHNlCisgICAgICAgICAgICAgICAgQnNzTGVuICs9IHBCc3MtPkxlbmd0aDsKKyNlbmRpZgorICAgICAgICAgICAgfQorCisjaWYgV0lSRUxFU1NfRVhUIDwgMTcKKyAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IEJzc0xlbjsKKyNlbHNlCisgICAgICAgICAgICBpZiAoQnNzTGVuID4gd3JxLT51LmRhdGEubGVuZ3RoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGtmcmVlKHBCc3NpZExpc3QpOworICAgICAgICAgICAgICAgIHJldHVybiAtRTJCSUc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gQnNzTGVuOworI2VuZGlmCisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcEJzc2lkTGlzdCwgQnNzTGVuKTsKKyAgICAgICAgICAgIGtmcmVlKHBCc3NpZExpc3QpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8zX0NVUlJFTlRfQUREUkVTUzoKKyAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IE1BQ19BRERSX0xFTjsKKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmcEFkYXB0ZXItPkN1cnJlbnRBZGRyZXNzLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEX0dFTl9NRURJQV9DT05ORUNUX1NUQVRVUzoKKyAgICAgICAgICAgIGlmIChwQWRhcHRlci0+SW5kaWNhdGVNZWRpYVN0YXRlID09IE5kaXNNZWRpYVN0YXRlQ29ubmVjdGVkKQorICAgICAgICAgICAgICAgIE1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZUNvbm5lY3RlZDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBNZWRpYVN0YXRlID0gTmRpc01lZGlhU3RhdGVEaXNjb25uZWN0ZWQ7CisKKyAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihORElTX01FRElBX1NUQVRFKTsKKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmTWVkaWFTdGF0ZSwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfQlNTSUQ6CisjaWZkZWYgUkFMSU5LX0FURQorCQkJaWYgKEFURV9PTihwQWRhcHRlcikpCisJCQl7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiVGhlIGRyaXZlciBpcyBpbiBBVEUgbW9kZSBub3dcbiIpKTsKKwkJCQlTdGF0dXMgPSBORElTX1NUQVRVU19SRVNPVVJDRVM7CisJCQkJYnJlYWs7CisJCQl9CisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworICAgICAgICAgICAgaWYgKElORlJBX09OKHBBZGFwdGVyKSB8fCBBREhPQ19PTihwQWRhcHRlcikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZwQWRhcHRlci0+Q29tbW9uQ2ZnLkJzc2lkLCBzaXplb2YoTkRJU184MDJfMTFfTUFDX0FERFJFU1MpKTsKKworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX0JTU0lEKD1FTVBUWSlcbiIpKTsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRU5PVENPTk47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX1NTSUQ6CisJCQlOZGlzWmVyb01lbW9yeSgmU3NpZCwgc2l6ZW9mKE5ESVNfODAyXzExX1NTSUQpKTsKKwkJCU5kaXNaZXJvTWVtb3J5KFNzaWQuU3NpZCwgTUFYX0xFTl9PRl9TU0lEKTsKKyAgICAgICAgICAgIFNzaWQuU3NpZExlbmd0aCA9IHBBZGFwdGVyLT5Db21tb25DZmcuU3NpZExlbjsKKwkJCW1lbWNweShTc2lkLlNzaWQsIHBBZGFwdGVyLT5Db21tb25DZmcuU3NpZCwJU3NpZC5Tc2lkTGVuZ3RoKTsKKyAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihORElTXzgwMl8xMV9TU0lEKTsKKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmU3NpZCwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX1NTSUQgKExlbj0lZCwgc3NpZD0lcylcbiIsIFNzaWQuU3NpZExlbmd0aCxTc2lkLlNzaWQpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfUVVFUllfTElOS19TVEFUVVM6CisgICAgICAgICAgICBwTGlua1N0YXR1cyA9IChSVF84MDJfMTFfTElOS19TVEFUVVMgKikga21hbGxvYyhzaXplb2YoUlRfODAyXzExX0xJTktfU1RBVFVTKSwgTUVNX0FMTE9DX0ZMQUcpOworICAgICAgICAgICAgaWYgKHBMaW5rU3RhdHVzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBMaW5rU3RhdHVzLT5DdXJyVHhSYXRlID0gUmF0ZUlkVG81MDBLYnBzW3BBZGFwdGVyLT5Db21tb25DZmcuVHhSYXRlXTsgICAvLyB1bml0IDogNTAwIGticHMKKyAgICAgICAgICAgICAgICBwTGlua1N0YXR1cy0+Q2hhbm5lbFF1YWxpdHkgPSBwQWRhcHRlci0+TWxtZS5DaGFubmVsUXVhbGl0eTsKKyAgICAgICAgICAgICAgICBwTGlua1N0YXR1cy0+UnhCeXRlQ291bnQgPSBwQWRhcHRlci0+UmFsaW5rQ291bnRlcnMuUmVjZWl2ZWRCeXRlQ291bnQ7CisgICAgICAgICAgICAgICAgcExpbmtTdGF0dXMtPlR4Qnl0ZUNvdW50ID0gcEFkYXB0ZXItPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkQnl0ZUNvdW50OworICAgICAgICAJCXBMaW5rU3RhdHVzLT5DZW50cmFsQ2hhbm5lbCA9IHBBZGFwdGVyLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWw7CisgICAgICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFJUXzgwMl8xMV9MSU5LX1NUQVRVUyk7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBMaW5rU3RhdHVzLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgICAgIGtmcmVlKHBMaW5rU3RhdHVzKTsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9RVUVSWV9MSU5LX1NUQVRVU1xuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1FVRVJZX0xJTktfU1RBVFVTKGttYWxsb2MgZmFpbGVkKVxuIikpOworICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX0NPTkZJR1VSQVRJT046CisgICAgICAgICAgICBwQ29uZmlndXJhdGlvbiA9IChORElTXzgwMl8xMV9DT05GSUdVUkFUSU9OICopIGttYWxsb2Moc2l6ZW9mKE5ESVNfODAyXzExX0NPTkZJR1VSQVRJT04pLCBNRU1fQUxMT0NfRkxBRyk7CisgICAgICAgICAgICBpZiAocENvbmZpZ3VyYXRpb24pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcENvbmZpZ3VyYXRpb24tPkxlbmd0aCA9IHNpemVvZihORElTXzgwMl8xMV9DT05GSUdVUkFUSU9OKTsKKyAgICAgICAgICAgICAgICBwQ29uZmlndXJhdGlvbi0+QmVhY29uUGVyaW9kID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5CZWFjb25QZXJpb2Q7CisgICAgICAgICAgICAgICAgcENvbmZpZ3VyYXRpb24tPkFUSU1XaW5kb3cgPSBwQWRhcHRlci0+U3RhQWN0aXZlLkF0aW1XaW47CisgICAgICAgICAgICAgICAgTUFQX0NIQU5ORUxfSURfVE9fS0haKHBBZGFwdGVyLT5Db21tb25DZmcuQ2hhbm5lbCwgcENvbmZpZ3VyYXRpb24tPkRTQ29uZmlnKTsKKyAgICAgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoTkRJU184MDJfMTFfQ09ORklHVVJBVElPTik7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBDb25maWd1cmF0aW9uLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX0NPTkZJR1VSQVRJT04oQmVhY29uUGVyaW9kPSVsZCxBdGltVz0lbGQsQ2hhbm5lbD0lZCkgXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb25maWd1cmF0aW9uLT5CZWFjb25QZXJpb2QsIHBDb25maWd1cmF0aW9uLT5BVElNV2luZG93LCBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWwpKTsKKwkJCQlrZnJlZShwQ29uZmlndXJhdGlvbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfQ09ORklHVVJBVElPTihrbWFsbG9jIGZhaWxlZClcbiIpKTsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisJCWNhc2UgUlRfT0lEXzgwMl8xMV9TTlJfMDoKKwkJCWlmICgocEFkYXB0ZXItPlN0YUNmZy5MYXN0U05SMCA+IDApKQorCQkJeworCQkJCXVsSW5mbyA9ICgoMHhlYgktIHBBZGFwdGVyLT5TdGFDZmcuTGFzdFNOUjApICogMykgLwkxNiA7CisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHVsSW5mbyk7CisJCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZ1bEluZm8sCXdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfU05SXzAoMHg9JWx4KVxuIiwgdWxJbmZvKSk7CisJCQl9CisgICAgICAgICAgICBlbHNlCisJCQkgICAgU3RhdHVzID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQljYXNlIFJUX09JRF84MDJfMTFfU05SXzE6CisJCQlpZiAoKHBBZGFwdGVyLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aAk+IDEpICYmCisgICAgICAgICAgICAgICAgKHBBZGFwdGVyLT5TdGFDZmcuTGFzdFNOUjEgPiAwKSkKKwkJCXsKKwkJCQl1bEluZm8gPSAoKDB4ZWIJLSBwQWRhcHRlci0+U3RhQ2ZnLkxhc3RTTlIxKSAqIDMpIC8JMTYgOworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZih1bEluZm8pOworCQkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmdWxJbmZvLAl3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUXVlcnk6OlJUX09JRF84MDJfMTFfU05SXzEoMHg9JWx4KVxuIix1bEluZm8pKTsKKwkJCX0KKwkJCWVsc2UKKwkJCQlTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9TTlJfMShwQWRhcHRlci0+U3RhQ2ZnLkxhc3RTTlIxPSVkKVxuIixwQWRhcHRlci0+U3RhQ2ZnLkxhc3RTTlIxKSk7CisJCQlicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX1JTU0lfVFJJR0dFUjoKKyAgICAgICAgICAgIHVsSW5mbyA9IHBBZGFwdGVyLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTAgLSBwQWRhcHRlci0+QmJwUnNzaVRvRGJtRGVsdGE7CisgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YodWxJbmZvKTsKKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmdWxJbmZvLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfUlNTSV9UUklHR0VSKD0lbGQpXG4iLCB1bEluZm8pKTsKKyAgICAgICAgICAgIGJyZWFrOworCQljYXNlIE9JRF84MDJfMTFfUlNTSToKKyAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX1JTU0k6CisJCQl1bEluZm8gPSBwQWRhcHRlci0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kwOworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHVsSW5mbyk7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnVsSW5mbywJd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCWJyZWFrOworCQljYXNlIFJUX09JRF84MDJfMTFfUlNTSV8xOgorICAgICAgICAgICAgdWxJbmZvID0gcEFkYXB0ZXItPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMTsKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZih1bEluZm8pOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZ1bEluZm8sCXdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlicmVhazsKKyAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX1JTU0lfMjoKKyAgICAgICAgICAgIHVsSW5mbyA9IHBBZGFwdGVyLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTI7CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YodWxJbmZvKTsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmdWxJbmZvLAl3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9TVEFUSVNUSUNTOgorICAgICAgICAgICAgcFN0YXRpc3RpY3MgPSAoTkRJU184MDJfMTFfU1RBVElTVElDUyAqKSBrbWFsbG9jKHNpemVvZihORElTXzgwMl8xMV9TVEFUSVNUSUNTKSwgTUVNX0FMTE9DX0ZMQUcpOworICAgICAgICAgICAgaWYgKHBTdGF0aXN0aWNzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX1NUQVRJU1RJQ1MgXG4iKSk7CisgICAgICAgICAgICAgICAgLy8gYWRkIHRoZSBtb3N0IHVwLXRvLWRhdGUgaC93IHJhdyBjb3VudGVycyBpbnRvIHNvZnR3YXJlIGNvdW50ZXJzCisJCQkgICAgTklDVXBkYXRlUmF3Q291bnRlcnMocEFkYXB0ZXIpOworCisgICAgICAgICAgICAgICAgLy8gU2FuaXR5IGNoZWNrIGZvciBjYWxjdWxhdGlvbiBvZiBzdWNlc3NmdWwgY291bnQKKyAgICAgICAgICAgICAgICBpZiAocEFkYXB0ZXItPldsYW5Db3VudGVycy5UcmFuc21pdHRlZEZyYWdtZW50Q291bnQuUXVhZFBhcnQgPCBwQWRhcHRlci0+V2xhbkNvdW50ZXJzLlJldHJ5Q291bnQuUXVhZFBhcnQpCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5XbGFuQ291bnRlcnMuVHJhbnNtaXR0ZWRGcmFnbWVudENvdW50LlF1YWRQYXJ0ID0gcEFkYXB0ZXItPldsYW5Db3VudGVycy5SZXRyeUNvdW50LlF1YWRQYXJ0OworCisgICAgICAgICAgICAgICAgcFN0YXRpc3RpY3MtPlRyYW5zbWl0dGVkRnJhZ21lbnRDb3VudC5RdWFkUGFydCA9IHBBZGFwdGVyLT5XbGFuQ291bnRlcnMuVHJhbnNtaXR0ZWRGcmFnbWVudENvdW50LlF1YWRQYXJ0OworICAgICAgICAgICAgICAgIHBTdGF0aXN0aWNzLT5NdWx0aWNhc3RUcmFuc21pdHRlZEZyYW1lQ291bnQuUXVhZFBhcnQgPSBwQWRhcHRlci0+V2xhbkNvdW50ZXJzLk11bHRpY2FzdFRyYW5zbWl0dGVkRnJhbWVDb3VudC5RdWFkUGFydDsKKyAgICAgICAgICAgICAgICBwU3RhdGlzdGljcy0+RmFpbGVkQ291bnQuUXVhZFBhcnQgPSBwQWRhcHRlci0+V2xhbkNvdW50ZXJzLkZhaWxlZENvdW50LlF1YWRQYXJ0OworICAgICAgICAgICAgICAgIHBTdGF0aXN0aWNzLT5SZXRyeUNvdW50LlF1YWRQYXJ0ID0gcEFkYXB0ZXItPldsYW5Db3VudGVycy5SZXRyeUNvdW50LlF1YWRQYXJ0OworICAgICAgICAgICAgICAgIHBTdGF0aXN0aWNzLT5NdWx0aXBsZVJldHJ5Q291bnQuUXVhZFBhcnQgPSBwQWRhcHRlci0+V2xhbkNvdW50ZXJzLk11bHRpcGxlUmV0cnlDb3VudC5RdWFkUGFydDsKKyAgICAgICAgICAgICAgICBwU3RhdGlzdGljcy0+UlRTU3VjY2Vzc0NvdW50LlF1YWRQYXJ0ID0gcEFkYXB0ZXItPldsYW5Db3VudGVycy5SVFNTdWNjZXNzQ291bnQuUXVhZFBhcnQ7CisgICAgICAgICAgICAgICAgcFN0YXRpc3RpY3MtPlJUU0ZhaWx1cmVDb3VudC5RdWFkUGFydCA9IHBBZGFwdGVyLT5XbGFuQ291bnRlcnMuUlRTRmFpbHVyZUNvdW50LlF1YWRQYXJ0OworICAgICAgICAgICAgICAgIHBTdGF0aXN0aWNzLT5BQ0tGYWlsdXJlQ291bnQuUXVhZFBhcnQgPSBwQWRhcHRlci0+V2xhbkNvdW50ZXJzLkFDS0ZhaWx1cmVDb3VudC5RdWFkUGFydDsKKyAgICAgICAgICAgICAgICBwU3RhdGlzdGljcy0+RnJhbWVEdXBsaWNhdGVDb3VudC5RdWFkUGFydCA9IHBBZGFwdGVyLT5XbGFuQ291bnRlcnMuRnJhbWVEdXBsaWNhdGVDb3VudC5RdWFkUGFydDsKKyAgICAgICAgICAgICAgICBwU3RhdGlzdGljcy0+UmVjZWl2ZWRGcmFnbWVudENvdW50LlF1YWRQYXJ0ID0gcEFkYXB0ZXItPldsYW5Db3VudGVycy5SZWNlaXZlZEZyYWdtZW50Q291bnQuUXVhZFBhcnQ7CisgICAgICAgICAgICAgICAgcFN0YXRpc3RpY3MtPk11bHRpY2FzdFJlY2VpdmVkRnJhbWVDb3VudC5RdWFkUGFydCA9IHBBZGFwdGVyLT5XbGFuQ291bnRlcnMuTXVsdGljYXN0UmVjZWl2ZWRGcmFtZUNvdW50LlF1YWRQYXJ0OworI2lmZGVmIERCRworICAgICAgICAgICAgICAgIHBTdGF0aXN0aWNzLT5GQ1NFcnJvckNvdW50ID0gcEFkYXB0ZXItPlJhbGlua0NvdW50ZXJzLlJlYWxGY3NFcnJDb3VudDsKKyNlbHNlCisgICAgICAgICAgICAgICAgcFN0YXRpc3RpY3MtPkZDU0Vycm9yQ291bnQuUXVhZFBhcnQgPSBwQWRhcHRlci0+V2xhbkNvdW50ZXJzLkZDU0Vycm9yQ291bnQuUXVhZFBhcnQ7CisgICAgICAgICAgICAgICAgcFN0YXRpc3RpY3MtPkZyYW1lRHVwbGljYXRlQ291bnQudS5Mb3dQYXJ0ID0gcEFkYXB0ZXItPldsYW5Db3VudGVycy5GcmFtZUR1cGxpY2F0ZUNvdW50LnUuTG93UGFydCAvIDEwMDsKKyNlbmRpZgorICAgICAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihORElTXzgwMl8xMV9TVEFUSVNUSUNTKTsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFN0YXRpc3RpY3MsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICAgICAga2ZyZWUocFN0YXRpc3RpY3MpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX1NUQVRJU1RJQ1Moa21hbGxvYyBmYWlsZWQpXG4iKSk7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF9HRU5fUkNWX09LOgorICAgICAgICAgICAgdWxJbmZvID0gcEFkYXB0ZXItPkNvdW50ZXJzODAyMy5Hb29kUmVjZWl2ZXM7CisgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YodWxJbmZvKTsKKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmdWxJbmZvLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEX0dFTl9SQ1ZfTk9fQlVGRkVSOgorICAgICAgICAgICAgdWxJbmZvID0gcEFkYXB0ZXItPkNvdW50ZXJzODAyMy5SeE5vQnVmZmVyOworICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHVsSW5mbyk7CisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnVsSW5mbywgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfUEhZX01PREU6CisgICAgICAgICAgICB1bEluZm8gPSAoVUxPTkcpcEFkYXB0ZXItPkNvbW1vbkNmZy5QaHlNb2RlOworICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHVsSW5mbyk7CisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnVsSW5mbywgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1BIWV9NT0RFICg9JWxkKVxuIiwgdWxJbmZvKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX1NUQV9DT05GSUc6CisgICAgICAgICAgICBwU3RhQ29uZmlnID0gKFJUXzgwMl8xMV9TVEFfQ09ORklHICopIGttYWxsb2Moc2l6ZW9mKFJUXzgwMl8xMV9TVEFfQ09ORklHKSwgTUVNX0FMTE9DX0ZMQUcpOworICAgICAgICAgICAgaWYgKHBTdGFDb25maWcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfU1RBX0NPTkZJR1xuIikpOworICAgICAgICAgICAgICAgIHBTdGFDb25maWctPkVuYWJsZVR4QnVyc3QgPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLmJFbmFibGVUeEJ1cnN0OworICAgICAgICAgICAgICAgIHBTdGFDb25maWctPkVuYWJsZVR1cmJvUmF0ZSA9IDA7CisgICAgICAgICAgICAgICAgcFN0YUNvbmZpZy0+VXNlQkdQcm90ZWN0aW9uID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5Vc2VCR1Byb3RlY3Rpb247CisgICAgICAgICAgICAgICAgcFN0YUNvbmZpZy0+VXNlU2hvcnRTbG90VGltZSA9IHBBZGFwdGVyLT5Db21tb25DZmcuYlVzZVNob3J0U2xvdFRpbWU7CisgICAgICAgICAgICAgICAgLy9wU3RhQ29uZmlnLT5BZGhvY01vZGUgPSBwQWRhcHRlci0+U3RhQ2ZnLkFkaG9jTW9kZTsKKyAgICAgICAgICAgICAgICBwU3RhQ29uZmlnLT5Id1JhZGlvU3RhdHVzID0gKHBBZGFwdGVyLT5TdGFDZmcuYkh3UmFkaW8gPT0gVFJVRSkgPyAxIDogMDsKKyAgICAgICAgICAgICAgICBwU3RhQ29uZmlnLT5Sc3YxID0gMDsKKyAgICAgICAgICAgICAgICBwU3RhQ29uZmlnLT5TeXN0ZW1FcnJvckJpdG1hcCA9IHBBZGFwdGVyLT5TeXN0ZW1FcnJvckJpdG1hcDsKKyAgICAgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoUlRfODAyXzExX1NUQV9DT05GSUcpOworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwU3RhQ29uZmlnLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgICAgIGtmcmVlKHBTdGFDb25maWcpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1NUQV9DT05GSUcoa21hbGxvYyBmYWlsZWQpXG4iKSk7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfUlRTX1RIUkVTSE9MRDoKKyAgICAgICAgICAgIFJ0c1RocmVzaCA9IHBBZGFwdGVyLT5Db21tb25DZmcuUnRzVGhyZXNob2xkOworICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFJ0c1RocmVzaCk7CisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJlJ0c1RocmVzaCwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX1JUU19USFJFU0hPTEQoPSVsZClcbiIsIFJ0c1RocmVzaCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9GUkFHTUVOVEFUSU9OX1RIUkVTSE9MRDoKKyAgICAgICAgICAgIEZyYWdUaHJlc2ggPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLkZyYWdtZW50VGhyZXNob2xkOworICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5Db21tb25DZmcuYlVzZVplcm9Ub0Rpc2FibGVGcmFnbWVudCA9PSBUUlVFKQorICAgICAgICAgICAgICAgIEZyYWdUaHJlc2ggPSAwOworICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKEZyYWdUaHJlc2gpOworICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZGcmFnVGhyZXNoLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfRlJBR01FTlRBVElPTl9USFJFU0hPTEQoPSVsZClcbiIsIEZyYWdUaHJlc2gpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfUE9XRVJfTU9ERToKKyAgICAgICAgICAgIFBvd2VyTW9kZSA9IHBBZGFwdGVyLT5TdGFDZmcuV2luZG93c1Bvd2VyTW9kZTsKKyAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihQb3dlck1vZGUpOworICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZQb3dlck1vZGUsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9QT1dFUl9NT0RFKD0lZClcbiIsIFBvd2VyTW9kZSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9SQURJTzoKKyAgICAgICAgICAgIFJhZGlvU3RhdGUgPSAoQk9PTEVBTikgcEFkYXB0ZXItPlN0YUNmZy5iU3dSYWRpbzsKKyAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihSYWRpb1N0YXRlKTsKKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmUmFkaW9TdGF0ZSwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1FVRVJZX1JBRElPICg9JWQpXG4iLCBSYWRpb1N0YXRlKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX0lORlJBU1RSVUNUVVJFX01PREU6CisgICAgICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5Cc3NUeXBlID09IEJTU19BREhPQykKKyAgICAgICAgICAgICAgICBCc3NUeXBlID0gTmRpczgwMl8xMUlCU1M7CisgICAgICAgICAgICBlbHNlIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkJzc1R5cGUgPT0gQlNTX0lORlJBKQorICAgICAgICAgICAgICAgIEJzc1R5cGUgPSBOZGlzODAyXzExSW5mcmFzdHJ1Y3R1cmU7CisgICAgICAgICAgICBlbHNlIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkJzc1R5cGUgPT0gQlNTX01PTklUT1IpCisgICAgICAgICAgICAgICAgQnNzVHlwZSA9IE5kaXM4MDJfMTFNb25pdG9yOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIEJzc1R5cGUgPSBOZGlzODAyXzExQXV0b1Vua25vd247CisKKyAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihCc3NUeXBlKTsKKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmQnNzVHlwZSwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX0lORlJBU1RSVUNUVVJFX01PREUoPSVkKVxuIiwgQnNzVHlwZSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9QUkVBTUJMRToKKyAgICAgICAgICAgIFByZWFtVHlwZSA9IHBBZGFwdGVyLT5Db21tb25DZmcuVHhQcmVhbWJsZTsKKyAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihQcmVhbVR5cGUpOworICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZQcmVhbVR5cGUsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9QUkVBTUJMRSg9JWQpXG4iLCBQcmVhbVR5cGUpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfQVVUSEVOVElDQVRJT05fTU9ERToKKyAgICAgICAgICAgIEF1dGhNb2RlID0gcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZTsKKyAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihBdXRoTW9kZSk7CisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJkF1dGhNb2RlLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfQVVUSEVOVElDQVRJT05fTU9ERSg9JWQpXG4iLCBBdXRoTW9kZSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9XRVBfU1RBVFVTOgorICAgICAgICAgICAgV2VwU3RhdHVzID0gcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXM7CisgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoV2VwU3RhdHVzKTsKKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmV2VwU3RhdHVzLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfV0VQX1NUQVRVUyg9JWQpXG4iLCBXZXBTdGF0dXMpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfVFhfUE9XRVJfTEVWRUw6CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoVUxPTkcpOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZwQWRhcHRlci0+Q29tbW9uQ2ZnLlR4UG93ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9UWF9QT1dFUl9MRVZFTCAleFxuIixwQWRhcHRlci0+Q29tbW9uQ2ZnLlR4UG93ZXIpKTsKKwkJCWJyZWFrOworICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfVFhfUE9XRVJfTEVWRUxfMToKKyAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihVTE9ORyk7CisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnBBZGFwdGVyLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9UWF9QT1dFUl9MRVZFTF8xICg9JWxkKVxuIiwgcEFkYXB0ZXItPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSkpOworCQkJYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9ORVRXT1JLX1RZUEVTX1NVUFBPUlRFRDoKKwkJCWlmICgocEFkYXB0ZXItPlJmSWNUeXBlCT09IFJGSUNfMjg1MCkgfHwgKHBBZGFwdGVyLT5SZkljVHlwZSA9PQlSRklDXzI3NTApKQorCQkJeworCQkJCU5ldHdvcmtUeXBlTGlzdFswXSA9IDM7ICAgICAgICAgICAgICAgICAvLyBOdW1iZXJPZkl0ZW1zID0gMworCQkJCU5ldHdvcmtUeXBlTGlzdFsxXSA9IE5kaXM4MDJfMTFEUzsgICAgICAvLyBOZXR3b3JrVHlwZVsxXSA9IDExYgorCQkJCU5ldHdvcmtUeXBlTGlzdFsyXSA9IE5kaXM4MDJfMTFPRkRNMjQ7ICAvLyBOZXR3b3JrVHlwZVsyXSA9IDExZworCQkJCU5ldHdvcmtUeXBlTGlzdFszXSA9IE5kaXM4MDJfMTFPRkRNNTsgICAvLyBOZXR3b3JrVHlwZVszXSA9IDExYQorICAgICAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IDE2OworCQkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmTmV0d29ya1R5cGVMaXN0WzBdLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCU5ldHdvcmtUeXBlTGlzdFswXSA9IDI7ICAgICAgICAgICAgICAgICAvLyBOdW1iZXJPZkl0ZW1zID0gMgorCQkJCU5ldHdvcmtUeXBlTGlzdFsxXSA9IE5kaXM4MDJfMTFEUzsgICAgICAvLyBOZXR3b3JrVHlwZVsxXSA9IDExYgorCQkJCU5ldHdvcmtUeXBlTGlzdFsyXSA9IE5kaXM4MDJfMTFPRkRNMjQ7ICAvLyBOZXR3b3JrVHlwZVsyXSA9IDExZworCQkJICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IDEyOworCQkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmTmV0d29ya1R5cGVMaXN0WzBdLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJfQorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfTkVUV09SS19UWVBFU19TVVBQT1JURURcbiIpKTsKKwkJCQlicmVhazsKKwkgICAgY2FzZSBPSURfODAyXzExX05FVFdPUktfVFlQRV9JTl9VU0U6CisgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoVUxPTkcpOworCQkJaWYgKHBBZGFwdGVyLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFBKQorCQkJCXVsSW5mbyA9IE5kaXM4MDJfMTFPRkRNNTsKKwkJCWVsc2UgaWYgKChwQWRhcHRlci0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQkdfTUlYRUQpIHx8IChwQWRhcHRlci0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExRykpCisJCQkJdWxJbmZvID0gTmRpczgwMl8xMU9GRE0yNDsKKwkJCWVsc2UKKwkJCQl1bEluZm8gPSBOZGlzODAyXzExRFM7CisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnVsSW5mbywgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCWJyZWFrOworICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfUVVFUllfTEFTVF9SWF9SQVRFOgorICAgICAgICAgICAgdWxJbmZvID0gKFVMT05HKXBBZGFwdGVyLT5MYXN0UnhSYXRlOworICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHVsSW5mbyk7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnVsSW5mbywgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1FVRVJZX0xBU1RfUlhfUkFURSAoPSVsZClcbiIsIHVsSW5mbykpOworCQkJYnJlYWs7CisJCWNhc2UgUlRfT0lEXzgwMl8xMV9RVUVSWV9MQVNUX1RYX1JBVEU6CisJCQkvL3VsSW5mbyA9IChVTE9ORylwQWRhcHRlci0+TGFzdFR4UmF0ZTsKKwkJCXVsSW5mbyA9IChVTE9ORylwQWRhcHRlci0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLndvcmQ7CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YodWxJbmZvKTsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmdWxJbmZvLAl3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfUVVFUllfTEFTVF9UWF9SQVRFICg9JWx4KVxuIiwgdWxJbmZvKSk7CisJCQlicmVhazsKKyAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX1FVRVJZX0VFUFJPTV9WRVJTSU9OOgorICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFVMT05HKTsKKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmcEFkYXB0ZXItPkVlcHJvbVZlcnNpb24sIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX1FVRVJZX0ZJUk1XQVJFX1ZFUlNJT046CisgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoVUxPTkcpOworICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZwQWRhcHRlci0+RmlybXdhcmVWZXJzaW9uLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJYnJlYWs7CisJICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9RVUVSWV9OT0lTRV9MRVZFTDoKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihVQ0hBUik7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnBBZGFwdGVyLT5CYnBXcml0ZUxhdGNoWzY2XSwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1FVRVJZX05PSVNFX0xFVkVMICg9JWQpXG4iLCBwQWRhcHRlci0+QmJwV3JpdGVMYXRjaFs2Nl0pKTsKKwkJCWJyZWFrOworCSAgICBjYXNlIFJUX09JRF84MDJfMTFfRVhUUkFfSU5GTzoKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihVTE9ORyk7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnBBZGFwdGVyLT5FeHRyYUluZm8sIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9FWFRSQV9JTkZPICg9JWxkKVxuIiwgcEFkYXB0ZXItPkV4dHJhSW5mbykpOworCSAgICAgICAgYnJlYWs7CisJICAgIGNhc2UgUlRfT0lEX1dFX1ZFUlNJT05fQ09NUElMRUQ6CisJICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoVUlOVCk7CisJICAgICAgICB3ZV92ZXJzaW9uX2NvbXBpbGVkID0gV0lSRUxFU1NfRVhUOworCSAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZ3ZV92ZXJzaW9uX2NvbXBpbGVkLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCSAgICAgICAgYnJlYWs7CisJCWNhc2UgUlRfT0lEXzgwMl8xMV9RVUVSWV9BUFNEX1NFVFRJTkc6CisJCQlhcHNkID0gKHBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RDYXBhYmxlIHwgKHBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RBQ19CRSA8PCAxKSB8IChwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNEQUNfQksgPDwgMikKKwkJCQl8IChwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNEQUNfVkkgPDwgMykJfCAocEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTREFDX1ZPIDw8IDQpCXwgKHBBZGFwdGVyLT5Db21tb25DZmcuTWF4U1BMZW5ndGggPDwgNSkpOworCisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoVUxPTkcpOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZhcHNkLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfUVVFUllfQVBTRF9TRVRUSU5HICg9MHglbHgsQVBTRENhcD0lZCxBQ19CRT0lZCxBQ19CSz0lZCxBQ19WST0lZCxBQ19WTz0lZCxNQVhTUExlbj0lZClcbiIsCisJCQkJYXBzZCxwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNEQ2FwYWJsZSxwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNEQUNfQkUscEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTREFDX0JLLHBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RBQ19WSSxwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNEQUNfVk8scEFkYXB0ZXItPkNvbW1vbkNmZy5NYXhTUExlbmd0aCkpOworCQkJYnJlYWs7CisJCWNhc2UgUlRfT0lEXzgwMl8xMV9RVUVSWV9BUFNEX1BTTToKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihVTE9ORyk7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RGb3JjZVBvd2VyU2F2ZSwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1FVRVJZX0FQU0RfUFNNICg9JWQpXG4iLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNERm9yY2VQb3dlclNhdmUpKTsKKwkJCWJyZWFrOworCQljYXNlIFJUX09JRF84MDJfMTFfUVVFUllfV01NOgorCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKEJPT0xFQU4pOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZwQWRhcHRlci0+Q29tbW9uQ2ZnLmJXbW1DYXBhYmxlLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfUVVFUllfV01NICg9JWQpXG4iLAlwQWRhcHRlci0+Q29tbW9uQ2ZnLmJXbW1DYXBhYmxlKSk7CisJCQlicmVhazsKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgICAgIGNhc2UgUlRfT0lEX05FV19EUklWRVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVUNIQVIgZW5hYmxlZCA9IDE7CisgICAgCSAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFVDSEFSKTsKKyAgICAJICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJmVuYWJsZWQsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF9ORVdfRFJJVkVSICg9JWQpXG4iLCBlbmFibGVkKSk7CisgICAgICAgICAgICB9CisJICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSVF9PSURfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVDoKKwkgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihVQ0hBUik7CisJICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnBBZGFwdGVyLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUICg9JWQpXG4iLCBwQWRhcHRlci0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCkpOworCSAgICAgICAgYnJlYWs7CisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCisgICAgICAgIGNhc2UgUlRfT0lEX0RSSVZFUl9ERVZJQ0VfTkFNRToKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfRFJJVkVSX0RFVklDRV9OQU1FIFxuIikpOworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gMTY7CisJCQlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBBZGFwdGVyLT5TdGFDZmcuZGV2X25hbWUsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisJCQl7CisJCQkJU3RhdHVzID0gLUVGQVVMVDsKKwkJCX0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfUVVFUllfSFRfUEhZTU9ERToKKyAgICAgICAgICAgIHBIVFBoeU1vZGUgPSAoT0lEX1NFVF9IVF9QSFlNT0RFICopIGttYWxsb2Moc2l6ZW9mKE9JRF9TRVRfSFRfUEhZTU9ERSksIE1FTV9BTExPQ19GTEFHKTsKKyAgICAgICAgICAgIGlmIChwSFRQaHlNb2RlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBIVFBoeU1vZGUtPlBoeU1vZGUgPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLlBoeU1vZGU7CisgICAgCQkJcEhUUGh5TW9kZS0+SHRNb2RlID0gKFVDSEFSKXBBZGFwdGVyLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5IVFBoeU1vZGUuZmllbGQuTU9ERTsKKyAgICAJCQlwSFRQaHlNb2RlLT5CVyA9IChVQ0hBUilwQWRhcHRlci0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLkJXOworICAgIAkJCXBIVFBoeU1vZGUtPk1DUz0gKFVDSEFSKXBBZGFwdGVyLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5IVFBoeU1vZGUuZmllbGQuTUNTOworICAgIAkJCXBIVFBoeU1vZGUtPlNIT1JUR0k9IChVQ0hBUilwQWRhcHRlci0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLlNob3J0R0k7CisgICAgCQkJcEhUUGh5TW9kZS0+U1RCQz0gKFVDSEFSKXBBZGFwdGVyLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5IVFBoeU1vZGUuZmllbGQuU1RCQzsKKworICAgIAkJCXBIVFBoeU1vZGUtPkV4dE9mZnNldCA9ICgocEFkYXB0ZXItPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA8IHBBZGFwdGVyLT5Db21tb25DZmcuQ2hhbm5lbCkgPyAoRVhUQ0hBX0JFTE9XKSA6IChFWFRDSEFfQUJPVkUpKTsKKyAgICAgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoT0lEX1NFVF9IVF9QSFlNT0RFKTsKKyAgICAgICAgICAgICAgICBpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBIVFBoeU1vZGUsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgCQkJeworICAgIAkJCQlTdGF0dXMgPSAtRUZBVUxUOworICAgIAkJCX0KKyAgICAJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9RVUVSWV9IVF9QSFlNT0RFIChQaHlNb2RlID0gJWQsIE1DUyA9JWQsIEJXID0gJWQsIFNUQkMgPSAlZCwgRXh0T2Zmc2V0PSVkKVxuIiwKKyAgICAJCQkJcEhUUGh5TW9kZS0+SHRNb2RlLCBwSFRQaHlNb2RlLT5NQ1MsIHBIVFBoeU1vZGUtPkJXLCBwSFRQaHlNb2RlLT5TVEJDLCBwSFRQaHlNb2RlLT5FeHRPZmZzZXQpKTsKKyAgICAJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIgTWxtZVVwZGF0ZVR4UmF0ZXMgKC53b3JkID0gJXggKVxuIiwgcEFkYXB0ZXItPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkhUUGh5TW9kZS53b3JkKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfU1RBX0NPTkZJRyhrbWFsbG9jIGZhaWxlZClcbiIpKTsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9DT1VOVFJZX1JFR0lPTjoKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX0NPVU5UUllfUkVHSU9OIFxuIikpOworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHVsSW5mbyk7CisgICAgICAgICAgICB1bEluZm8gPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb25Gb3JBQmFuZDsKKyAgICAgICAgICAgIHVsSW5mbyA9ICh1bEluZm8gPDwgOCl8KHBBZGFwdGVyLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbik7CisJCQlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZ1bEluZm8sIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICB7CisJCQkJU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfUVVFUllfREFUX0hUX1BIWU1PREU6CisgICAgICAgICAgICBwSFRQaHlNb2RlID0gKE9JRF9TRVRfSFRfUEhZTU9ERSAqKSBrbWFsbG9jKHNpemVvZihPSURfU0VUX0hUX1BIWU1PREUpLCBNRU1fQUxMT0NfRkxBRyk7CisgICAgICAgICAgICBpZiAocEhUUGh5TW9kZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwSFRQaHlNb2RlLT5QaHlNb2RlID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5QaHlNb2RlOworICAgIAkJCXBIVFBoeU1vZGUtPkh0TW9kZSA9IChVQ0hBUilwQWRhcHRlci0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5IVE1PREU7CisgICAgCQkJcEhUUGh5TW9kZS0+QlcgPSAoVUNIQVIpcEFkYXB0ZXItPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlc7CisgICAgCQkJcEhUUGh5TW9kZS0+TUNTPSAoVUNIQVIpcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUzsKKyAgICAJCQlwSFRQaHlNb2RlLT5TSE9SVEdJPSAoVUNIQVIpcEFkYXB0ZXItPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuU2hvcnRHSTsKKyAgICAJCQlwSFRQaHlNb2RlLT5TVEJDPSAoVUNIQVIpcEFkYXB0ZXItPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuU1RCQzsKKworICAgICAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihPSURfU0VUX0hUX1BIWU1PREUpOworICAgICAgICAgICAgICAgIGlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcEhUUGh5TW9kZSwgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAJCQl7CisgICAgCQkJCVN0YXR1cyA9IC1FRkFVTFQ7CisgICAgCQkJfQorICAgIAkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1FVRVJZX0hUX1BIWU1PREUgKFBoeU1vZGUgPSAlZCwgTUNTID0lZCwgQlcgPSAlZCwgU1RCQyA9ICVkLCBFeHRPZmZzZXQ9JWQpXG4iLAorICAgIAkJCQlwSFRQaHlNb2RlLT5IdE1vZGUsIHBIVFBoeU1vZGUtPk1DUywgcEhUUGh5TW9kZS0+QlcsIHBIVFBoeU1vZGUtPlNUQkMsIHBIVFBoeU1vZGUtPkV4dE9mZnNldCkpOworICAgIAkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiBNbG1lVXBkYXRlVHhSYXRlcyAoLndvcmQgPSAleCApXG4iLCBwQWRhcHRlci0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLndvcmQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9TVEFfQ09ORklHKGttYWxsb2MgZmFpbGVkKVxuIikpOworICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSVF9PSURfUVVFUllfTVVMVElQTEVfQ0FSRF9TVVBQT1JUOgorCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFVDSEFSKTsKKyAgICAgICAgICAgIGkgPSAwOworI2lmZGVmIE1VTFRJUExFX0NBUkRfU1VQUE9SVAorICAgICAgICAgICAgaSA9IDE7CisjZW5kaWYgLy8gTVVMVElQTEVfQ0FSRF9TVVBQT1JUIC8vCisJCQlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZpLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgeworCQkJCVN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEX1FVRVJZX01VTFRJUExFX0NBUkRfU1VQUE9SVCg9JWQpIFxuIiwgaSkpOworICAgICAgICAgICAgYnJlYWs7CisjaWZkZWYgU05NUF9TVVBQT1JUCisJCWNhc2UgUlRfT0lEXzgwMl8xMV9NQUNfQUREUkVTUzoKKyAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IE1BQ19BRERSX0xFTjsKKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmcEFkYXB0ZXItPkN1cnJlbnRBZGRyZXNzLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJYnJlYWs7CisKKwkJY2FzZSBSVF9PSURfODAyXzExX01BTlVGQUNUVVJFUk9VSToKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX01BTlVGQUNUVVJFUk9VSSBcbiIpKTsKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IE1hbnVmYWN0dXJlck9VSV9MRU47CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnBBZGFwdGVyLT5DdXJyZW50QWRkcmVzcywgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCWJyZWFrOworCisJCWNhc2UgUlRfT0lEXzgwMl8xMV9NQU5VRkFDVFVSRVJOQU1FOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfTUFOVUZBQ1RVUkVSTkFNRSBcbiIpKTsKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHN0cmxlbihNYW51ZmFjdHVyZXJOQU1FKTsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBNYW51ZmFjdHVyZXJOQU1FLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJYnJlYWs7CisKKwkJY2FzZSBSVF9PSURfODAyXzExX1JFU09VUkNFVFlQRUlETkFNRToKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1JFU09VUkNFVFlQRUlETkFNRSBcbiIpKTsKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHN0cmxlbihSZXNvdXJjZVR5cGVJZE5hbWUpOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIFJlc291cmNlVHlwZUlkTmFtZSwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCWJyZWFrOworCisJCWNhc2UgUlRfT0lEXzgwMl8xMV9QUklWQUNZT1BUSU9OSU1QTEVNRU5URUQ6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9QUklWQUNZT1BUSU9OSU1QTEVNRU5URUQgXG4iKSk7CisJCQl1bEluZm8gPSAxOyAvLyAxIGlzIHN1cHBvcnQgd2VwIGVsc2UgMiBpcyBub3Qgc3VwcG9ydC4KKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZih1bEluZm8pOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZ1bEluZm8sIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlicmVhazsKKworCQljYXNlIFJUX09JRF84MDJfMTFfUE9XRVJNQU5BR0VNRU5UTU9ERToKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1BPV0VSTUFOQUdFTUVOVE1PREUgXG4iKSk7CisJCQlpZiAocEFkYXB0ZXItPlN0YUNmZy5Qc20gPT0gUFNNUF9BQ1RJT04pCisJCQkJdWxJbmZvID0gMTsgLy8gMSBpcyBwb3dlciBhY3RpdmUgZWxzZSAyIGlzIHBvd2VyIHNhdmUuCisJCQllbHNlCisJCQkJdWxJbmZvID0gMjsKKworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHVsSW5mbyk7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnVsSW5mbywgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCWJyZWFrOworCisJCWNhc2UgT0lEXzgwMl8xMV9XRVBERUZBVUxUS0VZVkFMVUU6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9XRVBERUZBVUxUS0VZVkFMVUUgXG4iKSk7CisJCQkvL0tleUlkeFZhbHVlLktleUlkeCA9IHBBZC0+UG9ydENmZy5NQlNTSURbcEFkLT5Jb2N0bElGXS5EZWZhdWx0S2V5SWQ7CisJCQlwS2V5SWR4VmFsdWUgPSB3cnEtPnUuZGF0YS5wb2ludGVyOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJLZXlJZHhWYWx1ZS5LZXlJZHggPSAlZCwgXG4iLHBLZXlJZHhWYWx1ZS0+S2V5SWR4KSk7CisJCQl2YWx1ZUxlbiA9IHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWRdLktleUxlbjsKKwkJCU5kaXNNb3ZlTWVtb3J5KHBLZXlJZHhWYWx1ZS0+VmFsdWUsCisJCQkJCQkgICAmcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uS2V5LAorCQkJCQkJICAgdmFsdWVMZW4pOworCQkJcEtleUlkeFZhbHVlLT5WYWx1ZVt2YWx1ZUxlbl09J1wwJzsKKworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKERlZmF1bHRLZXlJZHhWYWx1ZSk7CisKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwS2V5SWR4VmFsdWUsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkRlZmF1bHRLZXlJZCA9ICVkLCB0b3RhbCBsZW4gPSAlZCwgc3RyIGxlbj0lZCwgS2V5VmFsdWU9ICUwMnggJTAyeCAlMDJ4ICUwMnggXG4iLCBwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCwgd3JxLT51LmRhdGEubGVuZ3RoLCBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW3BBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5LZXlMZW4sCisJCQlwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzBdLktleVswXSwKKwkJCXBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMV0uS2V5WzBdLAorCQkJcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsyXS5LZXlbMF0sCisJCQlwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzNdLktleVswXSkpOworCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfODAyXzExX1dFUERFRkFVTFRLRVlJRDoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1dFUERFRkFVTFRLRVlJRCBcbiIpKTsKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihVQ0hBUik7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnBBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiRGVmYXVsdEtleUlkID0lZCBcbiIsIHBBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkKSk7CisJCQlicmVhazsKKworCQljYXNlIFJUX09JRF84MDJfMTFfV0VQS0VZTUFQUElOR0xFTkdUSDoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1dFUEtFWU1BUFBJTkdMRU5HVEggXG4iKSk7CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoVUNIQVIpOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsCisJCQkJCQkJCQkmcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uS2V5TGVuLAorCQkJCQkJCQkJd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCWJyZWFrOworCisJCWNhc2UgT0lEXzgwMl8xMV9TSE9SVFJFVFJZTElNSVQ6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9TSE9SVFJFVFJZTElNSVQgXG4iKSk7CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoVUxPTkcpOworCQkJUlRNUF9JT19SRUFEMzIocEFkYXB0ZXIsIFRYX1JUWV9DRkcsICZ0eF9ydHlfY2ZnLndvcmQpOworCQkJU2hvcnRSZXRyeUxpbWl0ID0gdHhfcnR5X2NmZy5maWVsZC5TaG9ydFJ0eUxpbWl0OworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2hvcnRSZXRyeUxpbWl0ID0lbGQsICB0eF9ydHlfY2ZnLmZpZWxkLlNob3J0UmV0cnlMaW1pdD0lZFxuIiwgU2hvcnRSZXRyeUxpbWl0LCB0eF9ydHlfY2ZnLmZpZWxkLlNob3J0UnR5TGltaXQpKTsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmU2hvcnRSZXRyeUxpbWl0LCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfODAyXzExX0xPTkdSRVRSWUxJTUlUOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfTE9OR1JFVFJZTElNSVQgXG4iKSk7CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoVUxPTkcpOworCQkJUlRNUF9JT19SRUFEMzIocEFkYXB0ZXIsIFRYX1JUWV9DRkcsICZ0eF9ydHlfY2ZnLndvcmQpOworCQkJTG9uZ1JldHJ5TGltaXQgPSB0eF9ydHlfY2ZnLmZpZWxkLkxvbmdSdHlMaW1pdDsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkxvbmdSZXRyeUxpbWl0ID0lbGQsICB0eF9ydHlfY2ZnLmZpZWxkLkxvbmdSdHlMaW1pdD0lZFxuIiwgTG9uZ1JldHJ5TGltaXQsIHR4X3J0eV9jZmcuZmllbGQuTG9uZ1J0eUxpbWl0KSk7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJkxvbmdSZXRyeUxpbWl0LCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJYnJlYWs7CisKKwkJY2FzZSBSVF9PSURfODAyXzExX1BST0RVQ1RJRDoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1BST0RVQ1RJRCBcbiIpKTsKKworI2lmZGVmIFJUMjg3MAorCQkJc3ByaW50Zih0bXAsICIlMDR4ICUwNHhcbiIsICgoUE9TX0NPT0tJRSlwQWRhcHRlci0+T1NfQ29va2llKS0+cFVzYl9EZXYtPmRlc2NyaXB0b3IuaWRWZW5kb3IgLCgoUE9TX0NPT0tJRSlwQWRhcHRlci0+T1NfQ29va2llKS0+cFVzYl9EZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0KTsKKworI2VuZGlmIC8vIFJUMjg3MCAvLworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc3RybGVuKHRtcCk7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgdG1wLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJYnJlYWs7CisKKwkJY2FzZSBSVF9PSURfODAyXzExX01BTlVGQUNUVVJFSUQ6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9NQU5VRkFDVFVSRUlEIFxuIikpOworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc3RybGVuKE1hbnVmYWN0dXJlck5BTUUpOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIE1hbnVmYWN0dXJlck5BTUUsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlicmVhazsKKworCQljYXNlIE9JRF84MDJfMTFfQ1VSUkVOVENIQU5ORUw6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9DVVJSRU5UQ0hBTk5FTCBcbiIpKTsKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihVQ0hBUik7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJzaXplb2YgVUNIQVI9JWQsIGNoYW5uZWw9JWQgXG4iLCBzaXplb2YoVUNIQVIpLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWwpKTsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmcEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU3RhdHVzPSVkXG4iLCBTdGF0dXMpKTsKKwkJCWJyZWFrOworI2VuZGlmIC8vU05NUF9TVVBQT1JUCisKKwkJY2FzZSBPSURfODAyXzExX0JVSUxEX0NIQU5ORUxfRVg6CisJCQl7CisJCQkJVUNIQVIgdmFsdWU7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfQlVJTERfQ0hBTk5FTF9FWCBcbiIpKTsKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoVUNIQVIpOworI2lmZGVmIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTdXBwb3J0IEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QuXG4iKSk7CisJCQkJdmFsdWUgPSAxOworI2Vsc2UKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJEb2Vzbid0IHN1cHBvcnQgRVhUX0JVSUxEX0NIQU5ORUxfTElTVC5cbiIpKTsKKwkJCQl2YWx1ZSA9IDA7CisjZW5kaWYgLy8gRVhUX0JVSUxEX0NIQU5ORUxfTElTVCAvLworCQkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmdmFsdWUsIDEpOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlN0YXR1cz0lZFxuIiwgU3RhdHVzKSk7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIE9JRF84MDJfMTFfR0VUX0NIX0xJU1Q6CisJCQl7CisJCQkJUFJUX0NIQU5ORUxfTElTVF9JTkZPIHBDaExpc3RCdWY7CisKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9HRVRfQ0hfTElTVCBcbiIpKTsKKwkJCQlpZiAocEFkYXB0ZXItPkNoYW5uZWxMaXN0TnVtID09IDApCisJCQkJeworCQkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSAwOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQlwQ2hMaXN0QnVmID0gKFJUX0NIQU5ORUxfTElTVF9JTkZPICopIGttYWxsb2Moc2l6ZW9mKFJUX0NIQU5ORUxfTElTVF9JTkZPKSwgTUVNX0FMTE9DX0ZMQUcpOworCQkJCWlmIChwQ2hMaXN0QnVmID09IE5VTEwpCisJCQkJeworCQkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSAwOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQlwQ2hMaXN0QnVmLT5DaGFubmVsTGlzdE51bSA9IHBBZGFwdGVyLT5DaGFubmVsTGlzdE51bTsKKwkJCQlmb3IgKGkgPSAwOyBpIDwgcENoTGlzdEJ1Zi0+Q2hhbm5lbExpc3ROdW07IGkrKykKKwkJCQkJcENoTGlzdEJ1Zi0+Q2hhbm5lbExpc3RbaV0gPSBwQWRhcHRlci0+Q2hhbm5lbExpc3RbaV0uQ2hhbm5lbDsKKworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihSVF9DSEFOTkVMX0xJU1RfSU5GTyk7CisJCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBDaExpc3RCdWYsIHNpemVvZihSVF9DSEFOTkVMX0xJU1RfSU5GTykpOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlN0YXR1cz0lZFxuIiwgU3RhdHVzKSk7CisKKwkJCQlpZiAocENoTGlzdEJ1ZikKKwkJCQkJa2ZyZWUocENoTGlzdEJ1Zik7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIE9JRF84MDJfMTFfR0VUX0NPVU5UUllfQ09ERToKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX0dFVF9DT1VOVFJZX0NPREUgXG4iKSk7CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSAyOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZwQWRhcHRlci0+Q29tbW9uQ2ZnLkNvdW50cnlDb2RlLCAyKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlN0YXR1cz0lZFxuIiwgU3RhdHVzKSk7CisJCQlicmVhazsKKworCQljYXNlIE9JRF84MDJfMTFfR0VUX0NIQU5ORUxfR0VPR1JBUEhZOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfR0VUX0NIQU5ORUxfR0VPR1JBUEhZIFxuIikpOworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gMTsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmcEFkYXB0ZXItPkNvbW1vbkNmZy5HZW9ncmFwaHksIDEpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU3RhdHVzPSVkXG4iLCBTdGF0dXMpKTsKKwkJCWJyZWFrOworCisKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwkJY2FzZSBSVF9PSURfODAyXzExX1FVRVJZX0RMUzoKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihCT09MRUFOKTsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmcEFkYXB0ZXItPkNvbW1vbkNmZy5iRExTQ2FwYWJsZSwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1FVRVJZX0RMUyg9JWQpXG4iLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLmJETFNDYXBhYmxlKSk7CisJCQlicmVhazsKKworCQljYXNlIFJUX09JRF84MDJfMTFfUVVFUllfRExTX1BBUkFNOgorCQkJeworCQkJCVBSVF84MDJfMTFfRExTX0lORk8JcERsc0luZm8gPSBrbWFsbG9jKHNpemVvZihSVF84MDJfMTFfRExTX0lORk8pLCBHRlBfQVRPTUlDKTsKKwkJCQlpZiAocERsc0luZm8gPT0gTlVMTCkKKwkJCQkJYnJlYWs7CisKKwkJCQlmb3IgKGk9MDsgaTxNQVhfTlVNX09GX0RMU19FTlRSWTsgaSsrKQorCQkJCXsKKwkJCQkJUlRNUE1vdmVNZW1vcnkoJnBEbHNJbmZvLT5FbnRyeVtpXSwgJnBBZGFwdGVyLT5TdGFDZmcuRExTRW50cnlbaV0sIHNpemVvZihSVF84MDJfMTFfRExTX1VJKSk7CisJCQkJfQorCisJCQkJcERsc0luZm8tPm51bSA9IE1BWF9OVU1fT0ZfRExTX0VOVFJZOworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihSVF84MDJfMTFfRExTX0lORk8pOworCQkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwRGxzSW5mbywgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9RVUVSWV9ETFNfUEFSQU1cbiIpKTsKKworCQkJCWlmIChwRGxzSW5mbykKKwkJCQkJa2ZyZWUocERsc0luZm8pOworCQkJfQorCQkJYnJlYWs7CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6dW5rbm93biBJT0NUTCdzIHN1YmNtZCA9IDB4JTA4eFxuIiwgY21kKSk7CisgICAgICAgICAgICBTdGF0dXMgPSAtRU9QTk9UU1VQUDsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gU3RhdHVzOworfQorCitJTlQgcnQyOHh4X3N0YV9pb2N0bCgKKwlJTglzdHJ1Y3QgbmV0X2RldmljZQkqbmV0X2RldiwKKwlJTglPVVQJc3RydWN0IGlmcmVxCSpycSwKKwlJTglJTlQJCQkJCWNtZCkKK3sKKwlQT1NfQ09PS0lFCQkJcE9iajsKKwlWSVJUVUFMX0FEQVBURVIJCSpwVmlydHVhbEFkID0gTlVMTDsKKwlSVE1QX0FEQVBURVIgICAgICAgICpwQWQgPSBOVUxMOworCXN0cnVjdCBpd3JlcSAgICAgICAgKndycSA9IChzdHJ1Y3QgaXdyZXEgKikgcnE7CisJQk9PTEVBTgkJCQlTdGF0ZU1hY2hpbmVUb3VjaGVkID0gRkFMU0U7CisJSU5UCQkJCQlTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworCVVTSE9SVAkJCQlzdWJjbWQ7CisKKwlpZiAobmV0X2Rldi0+cHJpdl9mbGFncyA9PSBJTlRfTUFJTikKKwl7CisJCXBBZCA9IG5ldF9kZXYtPnByaXY7CisJfQorCWVsc2UKKwl7CisJCXBWaXJ0dWFsQWQgPSBuZXRfZGV2LT5wcml2OworCQlwQWQgPSBwVmlydHVhbEFkLT5SdG1wRGV2LT5wcml2OworCX0KKwlwT2JqID0gKFBPU19DT09LSUUpIHBBZC0+T1NfQ29va2llOworCisJaWYgKHBBZCA9PSBOVUxMKQorCXsKKwkJLyogaWYgMXN0IG9wZW4gZmFpbCwgcEFkIHdpbGwgYmUgZnJlZTsKKwkJICAgU28gdGhlIG5ldF9kZXYtPnByaXYgd2lsbCBiZSBOVUxMIGluIDJyZCBvcGVuICovCisJCXJldHVybiAtRU5FVERPV047CisJfQorCisgICAgLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KKyAgICBpZighUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQorICAgIHsKKyNpZmRlZiBDT05GSUdfQVBTVEFfTUlYRURfU1VQUE9SVAorCSAgICBpZiAod3JxLT51LmRhdGEucG9pbnRlciA9PSBOVUxMKQorCSAgICB7CisJCSAgICByZXR1cm4gU3RhdHVzOworCSAgICB9CisKKwkgICAgaWYgKHN0cnN0cih3cnEtPnUuZGF0YS5wb2ludGVyLCAiT3BNb2RlIikgPT0gTlVMTCkKKyNlbmRpZiAvLyBDT05GSUdfQVBTVEFfTUlYRURfU1VQUE9SVCAvLworICAgICAgICB7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisJCSAgICByZXR1cm4gLUVORVRET1dOOworICAgICAgICB9CisgICAgfQorCisJewkvLyBkZXRlcm1pbmUgdGhpcyBpb2N0bCBjb21tYW5kIGlzIGNvbW1pbmcgZnJvbSB3aGljaCBpbnRlcmZhY2UuCisJCXBPYmotPmlvY3RsX2lmX3R5cGUgPSBJTlRfTUFJTjsKKwkJcE9iai0+aW9jdGxfaWYgPSBNQUlOX01CU1NJRDsKKwl9CisKKwlzd2l0Y2goY21kKQorCXsKKyNpZmRlZiBSQUxJTktfQVRFCisjaWZkZWYgUkFMSU5LXzI4eHhfUUEKKwkJY2FzZSBSVFBSSVZfSU9DVExfQVRFOgorCQkJeworCQkJCVJ0bXBEb0F0ZShwQWQsIHdycSk7CisJCQl9CisJCQlicmVhazsKKyNlbmRpZiAvLyBSQUxJTktfMjh4eF9RQSAvLworI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKyAgICAgICAgY2FzZSBTSU9DR0lGSFdBRERSOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU9DVEw6OlNJT0NHSUZIV0FERFJcbiIpKTsKKwkJCW1lbWNweSh3cnEtPnUubmFtZSwgcEFkLT5DdXJyZW50QWRkcmVzcywgRVRIX0FMRU4pOworCQkJYnJlYWs7CisJCWNhc2UgU0lPQ0dJV05BTUU6CisgICAgICAgIHsKKyAgICAgICAgCWNoYXIgKm5hbWU9JndycS0+dS5uYW1lWzBdOworICAgICAgICAJcnRfaW9jdGxfZ2l3bmFtZShuZXRfZGV2LCBOVUxMLCBuYW1lLCBOVUxMKTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgU0lPQ0dJV0VTU0lEOiAgLy9HZXQgRVNTSUQKKyAgICAgICAgeworICAgICAgICAJc3RydWN0IGl3X3BvaW50ICplc3NpZD0md3JxLT51LmVzc2lkOworICAgICAgICAJcnRfaW9jdGxfZ2l3ZXNzaWQobmV0X2RldiwgTlVMTCwgZXNzaWQsIGVzc2lkLT5wb2ludGVyKTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgU0lPQ1NJV0VTU0lEOiAgLy9TZXQgRVNTSUQKKyAgICAgICAgeworICAgICAgICAJc3RydWN0IGl3X3BvaW50CSplc3NpZD0md3JxLT51LmVzc2lkOworICAgICAgICAJcnRfaW9jdGxfc2l3ZXNzaWQobmV0X2RldiwgTlVMTCwgZXNzaWQsIGVzc2lkLT5wb2ludGVyKTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgU0lPQ1NJV05XSUQ6ICAgLy8gc2V0IG5ldHdvcmsgaWQgKHRoZSBjZWxsKQorCQljYXNlIFNJT0NHSVdOV0lEOiAgIC8vIGdldCBuZXR3b3JrIGlkCisJCQlTdGF0dXMgPSAtRU9QTk9UU1VQUDsKKwkJCWJyZWFrOworCQljYXNlIFNJT0NTSVdGUkVROiAgIC8vc2V0IGNoYW5uZWwvZnJlcXVlbmN5IChIeikKKyAgICAgICAgeworICAgICAgICAJc3RydWN0IGl3X2ZyZXEgKmZyZXE9JndycS0+dS5mcmVxOworICAgICAgICAJcnRfaW9jdGxfc2l3ZnJlcShuZXRfZGV2LCBOVUxMLCBmcmVxLCBOVUxMKTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgU0lPQ0dJV0ZSRVE6ICAgLy8gZ2V0IGNoYW5uZWwvZnJlcXVlbmN5IChIeikKKyAgICAgICAgeworICAgICAgICAJc3RydWN0IGl3X2ZyZXEgKmZyZXE9JndycS0+dS5mcmVxOworICAgICAgICAJcnRfaW9jdGxfZ2l3ZnJlcShuZXRfZGV2LCBOVUxMLCBmcmVxLCBOVUxMKTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgU0lPQ1NJV05JQ0tOOiAvL3NldCBub2RlIG5hbWUvbmlja25hbWUKKyAgICAgICAgeworICAgICAgICAJc3RydWN0IGl3X3BvaW50ICpkYXRhPSZ3cnEtPnUuZGF0YTsKKyAgICAgICAgCXJ0X2lvY3RsX3Npd25pY2tuKG5ldF9kZXYsIE5VTEwsIGRhdGEsIE5VTEwpOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBTSU9DR0lXTklDS046IC8vZ2V0IG5vZGUgbmFtZS9uaWNrbmFtZQorICAgICAgICB7CisgICAgICAgIAlzdHJ1Y3QgaXdfcG9pbnQgKmRhdGE9JndycS0+dS5kYXRhOworICAgICAgICAJcnRfaW9jdGxfZ2l3bmlja24obmV0X2RldiwgTlVMTCwgZGF0YSwgTlVMTCk7CisJCQlicmVhazsKKwkJfQorCQljYXNlIFNJT0NHSVdSQVRFOiAgIC8vZ2V0IGRlZmF1bHQgYml0IHJhdGUgKGJwcykKKwkJICAgIHJ0X2lvY3RsX2dpd3JhdGUobmV0X2RldiwgTlVMTCwgJndycS0+dSwgTlVMTCk7CisgICAgICAgICAgICBicmVhazsKKwkgICAgY2FzZSBTSU9DU0lXUkFURTogIC8vc2V0IGRlZmF1bHQgYml0IHJhdGUgKGJwcykKKwkgICAgICAgIHJ0X2lvY3RsX3Npd3JhdGUobmV0X2RldiwgTlVMTCwgJndycS0+dSwgTlVMTCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTSU9DR0lXUlRTOiAgLy8gZ2V0IFJUUy9DVFMgdGhyZXNob2xkIChieXRlcykKKyAgICAgICAgeworICAgICAgICAJc3RydWN0IGl3X3BhcmFtICpydHM9JndycS0+dS5ydHM7CisgICAgICAgIAlydF9pb2N0bF9naXdydHMobmV0X2RldiwgTlVMTCwgcnRzLCBOVUxMKTsKKwkJCWJyZWFrOworCQl9CisgICAgICAgIGNhc2UgU0lPQ1NJV1JUUzogIC8vc2V0IFJUUy9DVFMgdGhyZXNob2xkIChieXRlcykKKyAgICAgICAgeworICAgICAgICAJc3RydWN0IGl3X3BhcmFtICpydHM9JndycS0+dS5ydHM7CisgICAgICAgIAlydF9pb2N0bF9zaXdydHMobmV0X2RldiwgTlVMTCwgcnRzLCBOVUxMKTsKKwkJCWJyZWFrOworCQl9CisgICAgICAgIGNhc2UgU0lPQ0dJV0ZSQUc6ICAvL2dldCBmcmFnbWVudGF0aW9uIHRociAoYnl0ZXMpCisgICAgICAgIHsKKyAgICAgICAgCXN0cnVjdCBpd19wYXJhbSAqZnJhZz0md3JxLT51LmZyYWc7CisgICAgICAgIAlydF9pb2N0bF9naXdmcmFnKG5ldF9kZXYsIE5VTEwsIGZyYWcsIE5VTEwpOworCQkJYnJlYWs7CisJCX0KKyAgICAgICAgY2FzZSBTSU9DU0lXRlJBRzogIC8vc2V0IGZyYWdtZW50YXRpb24gdGhyIChieXRlcykKKyAgICAgICAgeworICAgICAgICAJc3RydWN0IGl3X3BhcmFtICpmcmFnPSZ3cnEtPnUuZnJhZzsKKyAgICAgICAgCXJ0X2lvY3RsX3Npd2ZyYWcobmV0X2RldiwgTlVMTCwgZnJhZywgTlVMTCk7CisJCQlicmVhazsKKwkJfQorICAgICAgICBjYXNlIFNJT0NHSVdFTkNPREU6ICAvL2dldCBlbmNvZGluZyB0b2tlbiAmIG1vZGUKKyAgICAgICAgeworICAgICAgICAJc3RydWN0IGl3X3BvaW50ICplcnE9JndycS0+dS5lbmNvZGluZzsKKyAgICAgICAgCWlmKGVycS0+cG9pbnRlcikKKyAgICAgICAgCQlydF9pb2N0bF9naXdlbmNvZGUobmV0X2RldiwgTlVMTCwgZXJxLCBlcnEtPnBvaW50ZXIpOworCQkJYnJlYWs7CisJCX0KKyAgICAgICAgY2FzZSBTSU9DU0lXRU5DT0RFOiAgLy9zZXQgZW5jb2RpbmcgdG9rZW4gJiBtb2RlCisgICAgICAgIHsKKyAgICAgICAgCXN0cnVjdCBpd19wb2ludCAqZXJxPSZ3cnEtPnUuZW5jb2Rpbmc7CisgICAgICAgIAlpZihlcnEtPnBvaW50ZXIpCisgICAgICAgIAkJcnRfaW9jdGxfc2l3ZW5jb2RlKG5ldF9kZXYsIE5VTEwsIGVycSwgZXJxLT5wb2ludGVyKTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgU0lPQ0dJV0FQOiAgICAgLy9nZXQgYWNjZXNzIHBvaW50IE1BQyBhZGRyZXNzZXMKKyAgICAgICAgeworICAgICAgICAJc3RydWN0IHNvY2thZGRyICphcF9hZGRyPSZ3cnEtPnUuYXBfYWRkcjsKKyAgICAgICAgCXJ0X2lvY3RsX2dpd2FwKG5ldF9kZXYsIE5VTEwsIGFwX2FkZHIsIGFwX2FkZHItPnNhX2RhdGEpOworCQkJYnJlYWs7CisJCX0KKwkgICAgY2FzZSBTSU9DU0lXQVA6ICAvL3NldCBhY2Nlc3MgcG9pbnQgTUFDIGFkZHJlc3NlcworICAgICAgICB7CisgICAgICAgIAlzdHJ1Y3Qgc29ja2FkZHIgKmFwX2FkZHI9JndycS0+dS5hcF9hZGRyOworICAgICAgICAJcnRfaW9jdGxfc2l3YXAobmV0X2RldiwgTlVMTCwgYXBfYWRkciwgYXBfYWRkci0+c2FfZGF0YSk7CisJCQlicmVhazsKKwkJfQorCQljYXNlIFNJT0NHSVdNT0RFOiAgIC8vZ2V0IG9wZXJhdGlvbiBtb2RlCisgICAgICAgIHsKKyAgICAgICAgCV9fdTMyICptb2RlPSZ3cnEtPnUubW9kZTsKKyAgICAgICAgCXJ0X2lvY3RsX2dpd21vZGUobmV0X2RldiwgTlVMTCwgbW9kZSwgTlVMTCk7CisJCQlicmVhazsKKwkJfQorCQljYXNlIFNJT0NTSVdNT0RFOiAgIC8vc2V0IG9wZXJhdGlvbiBtb2RlCisgICAgICAgIHsKKyAgICAgICAgCV9fdTMyICptb2RlPSZ3cnEtPnUubW9kZTsKKyAgICAgICAgCXJ0X2lvY3RsX3Npd21vZGUobmV0X2RldiwgTlVMTCwgbW9kZSwgTlVMTCk7CisJCQlicmVhazsKKwkJfQorCQljYXNlIFNJT0NHSVdTRU5TOiAgIC8vZ2V0IHNlbnNpdGl2aXR5IChkQm0pCisJCWNhc2UgU0lPQ1NJV1NFTlM6CS8vc2V0IHNlbnNpdGl2aXR5IChkQm0pCisJCWNhc2UgU0lPQ0dJV1BPV0VSOiAgLy9nZXQgUG93ZXIgTWFuYWdlbWVudCBzZXR0aW5ncworCQljYXNlIFNJT0NTSVdQT1dFUjogIC8vc2V0IFBvd2VyIE1hbmFnZW1lbnQgc2V0dGluZ3MKKwkJY2FzZSBTSU9DR0lXVFhQT1c6ICAvL2dldCB0cmFuc21pdCBwb3dlciAoZEJtKQorCQljYXNlIFNJT0NTSVdUWFBPVzogIC8vc2V0IHRyYW5zbWl0IHBvd2VyIChkQm0pCisJCWNhc2UgU0lPQ0dJV1JBTkdFOgkvL0dldCByYW5nZSBvZiBwYXJhbWV0ZXJzCisJCWNhc2UgU0lPQ0dJV1JFVFJZOgkvL2dldCByZXRyeSBsaW1pdHMgYW5kIGxpZmV0aW1lCisJCWNhc2UgU0lPQ1NJV1JFVFJZOgkvL3NldCByZXRyeSBsaW1pdHMgYW5kIGxpZmV0aW1lCisJCQlTdGF0dXMgPSAtRU9QTk9UU1VQUDsKKwkJCWJyZWFrOworCQljYXNlIFJUX1BSSVZfSU9DVEw6CisJCQlzdWJjbWQgPSB3cnEtPnUuZGF0YS5mbGFnczsKKwkJCWlmKCBzdWJjbWQgJiBPSURfR0VUX1NFVF9UT0dHTEUpCisJCQkJU3RhdHVzID0gUlRNUFNldEluZm9ybWF0aW9uKHBBZCwgcnEsIHN1YmNtZCk7CisJCQllbHNlCisJCQkJU3RhdHVzID0gUlRNUFF1ZXJ5SW5mb3JtYXRpb24ocEFkLCBycSwgc3ViY21kKTsKKwkJCWJyZWFrOworCQljYXNlIFNJT0NHSVdQUklWOgorCQkJaWYgKHdycS0+dS5kYXRhLnBvaW50ZXIpCisJCQl7CisJCQkJaWYgKCBhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCB3cnEtPnUuZGF0YS5wb2ludGVyLCBzaXplb2YocHJpdnRhYikpICE9IFRSVUUpCisJCQkJCWJyZWFrOworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihwcml2dGFiKSAvIHNpemVvZihwcml2dGFiWzBdKTsKKwkJCQlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHByaXZ0YWIsIHNpemVvZihwcml2dGFiKSkpCisJCQkJCVN0YXR1cyA9IC1FRkFVTFQ7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBSVFBSSVZfSU9DVExfU0VUOgorCQkJaWYoYWNjZXNzX29rKFZFUklGWV9SRUFELCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpICE9IFRSVUUpCisJCQkJYnJlYWs7CisJCQlydF9pb2N0bF9zZXRwYXJhbShuZXRfZGV2LCBOVUxMLCBOVUxMLCB3cnEtPnUuZGF0YS5wb2ludGVyKTsKKwkJCWJyZWFrOworCQljYXNlIFJUUFJJVl9JT0NUTF9HU0lURVNVUlZFWToKKwkJCVJUTVBJb2N0bEdldFNpdGVTdXJ2ZXkocEFkLCB3cnEpOworCQkgICAgYnJlYWs7CisjaWZkZWYgREJHCisJCWNhc2UgUlRQUklWX0lPQ1RMX01BQzoKKwkJCVJUTVBJb2N0bE1BQyhwQWQsIHdycSk7CisJCQlicmVhazsKKwkJY2FzZSBSVFBSSVZfSU9DVExfRTJQOgorCQkJUlRNUElvY3RsRTJQUk9NKHBBZCwgd3JxKTsKKwkJCWJyZWFrOworI2VuZGlmIC8vIERCRyAvLworICAgICAgICBjYXNlIFNJT0NFVEhUT09MOgorICAgICAgICAgICAgICAgIGJyZWFrOworCQlkZWZhdWx0OgorCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiSU9DVEw6OnVua25vd24gSU9DVEwncyBjbWQgPSAweCUwOHhcbiIsIGNtZCkpOworCQkJU3RhdHVzID0gLUVPUE5PVFNVUFA7CisJCQlicmVhazsKKwl9CisKKyAgICBpZihTdGF0ZU1hY2hpbmVUb3VjaGVkKSAvLyBVcHBlciBsYXllciBzZW50IGEgTUxNRS1yZWxhdGVkIG9wZXJhdGlvbnMKKyAgICAJUlQyOFhYX01MTUVfSEFORExFUihwQWQpOworCisJcmV0dXJuIFN0YXR1czsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgU1NJRAorICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UIFNldF9TU0lEX1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZykKK3sKKyAgICBORElTXzgwMl8xMV9TU0lEICAgICAgICAgICAgICAgICAgICBTc2lkLCAqcFNzaWQ9TlVMTDsKKyAgICBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0ZU1hY2hpbmVUb3VjaGVkID0gRkFMU0U7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2VzcyA9IFRSVUU7CisKKyAgICBpZiggc3RybGVuKGFyZykgPD0gTUFYX0xFTl9PRl9TU0lEKQorICAgIHsKKyAgICAgICAgTmRpc1plcm9NZW1vcnkoJlNzaWQsIHNpemVvZihORElTXzgwMl8xMV9TU0lEKSk7CisgICAgICAgIGlmIChzdHJsZW4oYXJnKSAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShTc2lkLlNzaWQsIGFyZywgc3RybGVuKGFyZykpOworICAgICAgICAgICAgU3NpZC5Tc2lkTGVuZ3RoID0gc3RybGVuKGFyZyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSAgIC8vQU5ZIHNzaWQKKyAgICAgICAgeworICAgICAgICAgICAgU3NpZC5Tc2lkTGVuZ3RoID0gMDsKKwkJICAgIG1lbWNweShTc2lkLlNzaWQsICIiLCAwKTsKKwkJCXBBZGFwdGVyLT5TdGFDZmcuQnNzVHlwZSA9IEJTU19JTkZSQTsKKwkJCXBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVPcGVuOworCSAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXMgID0gTmRpczgwMl8xMUVuY3J5cHRpb25EaXNhYmxlZDsKKwkJfQorICAgICAgICBwU3NpZCA9ICZTc2lkOworCisgICAgICAgIGlmIChwQWRhcHRlci0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgIT0gQ05UTF9JRExFKQorICAgICAgICB7CisgICAgICAgICAgICBSVDI4WFhfTUxNRV9SRVNFVF9TVEFURV9NQUNISU5FKHBBZGFwdGVyKTsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISBNTE1FIGJ1c3ksIHJlc2V0IE1MTUUgc3RhdGUgbWFjaGluZSAhISFcbiIpKTsKKyAgICAgICAgfQorCisgICAgICAgIHBBZGFwdGVyLT5NbG1lQXV4LkN1cnJSZXFJc0Zyb21OZGlzID0gVFJVRTsKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5iU2NhblJlcUlzRnJvbVdlYlVJID0gRkFMU0U7CisJCXBBZGFwdGVyLT5iQ29uZmlnQ2hhbmdlZCA9IFRSVUU7CisKKyAgICAgICAgTWxtZUVucXVldWUocEFkYXB0ZXIsCisgICAgICAgICAgICAgICAgICAgIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLAorICAgICAgICAgICAgICAgICAgICBPSURfODAyXzExX1NTSUQsCisgICAgICAgICAgICAgICAgICAgIHNpemVvZihORElTXzgwMl8xMV9TU0lEKSwKKyAgICAgICAgICAgICAgICAgICAgKFZPSUQgKilwU3NpZCk7CisKKyAgICAgICAgU3RhdGVNYWNoaW5lVG91Y2hlZCA9IFRSVUU7CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9TU0lEX1Byb2M6OihMZW49JWQsU3NpZD0lcylcbiIsIFNzaWQuU3NpZExlbmd0aCwgU3NpZC5Tc2lkKSk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgc3VjY2VzcyA9IEZBTFNFOworCisgICAgaWYgKFN0YXRlTWFjaGluZVRvdWNoZWQpIC8vIFVwcGVyIGxheWVyIHNlbnQgYSBNTE1FLXJlbGF0ZWQgb3BlcmF0aW9ucworICAgIAlSVDI4WFhfTUxNRV9IQU5ETEVSKHBBZGFwdGVyKTsKKworICAgIHJldHVybiBzdWNjZXNzOworfQorCisjaWZkZWYgV01NX1NVUFBPUlQKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IFdtbUNhcGFibGUgRW5hYmxlIG9yIERpc2FibGUKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVAlTZXRfV21tQ2FwYWJsZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlCT09MRUFOCWJXbW1DYXBhYmxlOworCisJYldtbUNhcGFibGUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCisJaWYgKChiV21tQ2FwYWJsZSA9PSAxKQorI2lmZGVmIFJUMjg3MAorCQkmJiAocEFkLT5OdW1iZXJPZlBpcGVzID49IDUpCisjZW5kaWYgLy8gUlQyODcwIC8vCisJCSkKKwkJcEFkLT5Db21tb25DZmcuYldtbUNhcGFibGUgPSBUUlVFOworCWVsc2UgaWYgKGJXbW1DYXBhYmxlID09IDApCisJCXBBZC0+Q29tbW9uQ2ZnLmJXbW1DYXBhYmxlID0gRkFMU0U7CisJZWxzZQorCQlyZXR1cm4gRkFMU0U7ICAvL0ludmFsaWQgYXJndW1lbnQKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9XbW1DYXBhYmxlX1Byb2M6OihiV21tQ2FwYWJsZT0lZClcbiIsCisJCXBBZC0+Q29tbW9uQ2ZnLmJXbW1DYXBhYmxlKSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKyNlbmRpZiAvLyBXTU1fU1VQUE9SVCAvLworCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBOZXR3b3JrIFR5cGUoSW5mcmFzdHJ1Y3R1cmUvQWRob2MgbW9kZSkKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVCBTZXRfTmV0d29ya1R5cGVfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKQoreworICAgIFVJTlQzMglWYWx1ZSA9IDA7CisKKyAgICBpZiAoc3RyY21wKGFyZywgIkFkaG9jIikgPT0gMCkKKwl7CisJCWlmIChwQWRhcHRlci0+U3RhQ2ZnLkJzc1R5cGUgIT0gQlNTX0FESE9DKQorCQl7CisJCQkvLyBDb25maWcgaGFzIGNoYW5nZWQKKwkJCXBBZGFwdGVyLT5iQ29uZmlnQ2hhbmdlZCA9IFRSVUU7CisgICAgICAgICAgICBpZiAoTU9OSVRPUl9PTihwQWRhcHRlcikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUlRNUF9JT19XUklURTMyKHBBZGFwdGVyLCBSWF9GSUxUUl9DRkcsIFNUQU5PUk1BTCk7CisgICAgICAgICAgICAgICAgUlRNUF9JT19SRUFEMzIocEFkYXB0ZXIsIE1BQ19TWVNfQ1RSTCwgJlZhbHVlKTsKKwkJCQlWYWx1ZSAmPSAofjB4ODApOworCQkJCVJUTVBfSU9fV1JJVEUzMihwQWRhcHRlciwgTUFDX1NZU19DVFJMLCBWYWx1ZSk7CisgICAgICAgICAgICAgICAgT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWRhcHRlciwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpOworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuYkF1dG9SZWNvbm5lY3QgPSBUUlVFOworICAgICAgICAgICAgICAgIExpbmtEb3duKHBBZGFwdGVyLCBGQUxTRSk7CisgICAgICAgICAgICB9CisJCQlpZiAoSU5GUkFfT04ocEFkYXB0ZXIpKQorCQkJeworCQkJCS8vQk9PTEVBTiBDYW5jZWxsZWQ7CisJCQkJLy8gU2V0IHRoZSBBdXRvUmVjb25uZWN0U3NpZCB0byBwcmV2ZW50IGl0IHJlY29ubmVjdCB0byBvbGQgU1NJRAorCQkJCS8vIFNpbmNlIGNhbGxpbmcgdGhpcyBpbmRpY2F0ZSB1c2VyIGRvbid0IHdhbnQgdG8gY29ubmVjdCB0byB0aGF0IFNTSUQgYW55bW9yZS4KKwkJCQlwQWRhcHRlci0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbj0gMzI7CisJCQkJTmRpc1plcm9NZW1vcnkocEFkYXB0ZXItPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWQsIHBBZGFwdGVyLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuKTsKKworCQkJCUxpbmtEb3duKHBBZGFwdGVyLCBGQUxTRSk7CisKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJORElTX1NUQVRVU19NRURJQV9ESVNDT05ORUNUIEV2ZW50IEJCIVxuIikpOworCQkJfQorCQl9CisJCXBBZGFwdGVyLT5TdGFDZmcuQnNzVHlwZSA9IEJTU19BREhPQzsKKyAgICAgICAgcEFkYXB0ZXItPm5ldF9kZXYtPnR5cGUgPSBwQWRhcHRlci0+U3RhQ2ZnLk9yaURldlR5cGU7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT5TZXRfTmV0d29ya1R5cGVfUHJvYzo6KEFELUhPQylcbiIpKTsKKwl9CisgICAgZWxzZSBpZiAoc3RyY21wKGFyZywgIkluZnJhIikgPT0gMCkKKwl7CisJCWlmIChwQWRhcHRlci0+U3RhQ2ZnLkJzc1R5cGUgIT0gQlNTX0lORlJBKQorCQl7CisJCQkvLyBDb25maWcgaGFzIGNoYW5nZWQKKwkJCXBBZGFwdGVyLT5iQ29uZmlnQ2hhbmdlZCA9IFRSVUU7CisgICAgICAgICAgICBpZiAoTU9OSVRPUl9PTihwQWRhcHRlcikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUlRNUF9JT19XUklURTMyKHBBZGFwdGVyLCBSWF9GSUxUUl9DRkcsIFNUQU5PUk1BTCk7CisgICAgICAgICAgICAgICAgUlRNUF9JT19SRUFEMzIocEFkYXB0ZXIsIE1BQ19TWVNfQ1RSTCwgJlZhbHVlKTsKKwkJCQlWYWx1ZSAmPSAofjB4ODApOworCQkJCVJUTVBfSU9fV1JJVEUzMihwQWRhcHRlciwgTUFDX1NZU19DVFJMLCBWYWx1ZSk7CisgICAgICAgICAgICAgICAgT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWRhcHRlciwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpOworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuYkF1dG9SZWNvbm5lY3QgPSBUUlVFOworICAgICAgICAgICAgICAgIExpbmtEb3duKHBBZGFwdGVyLCBGQUxTRSk7CisgICAgICAgICAgICB9CisJCQlpZiAoQURIT0NfT04ocEFkYXB0ZXIpKQorCQkJeworCQkJCS8vIFNldCB0aGUgQXV0b1JlY29ubmVjdFNzaWQgdG8gcHJldmVudCBpdCByZWNvbm5lY3QgdG8gb2xkIFNTSUQKKwkJCQkvLyBTaW5jZSBjYWxsaW5nIHRoaXMgaW5kaWNhdGUgdXNlciBkb24ndCB3YW50IHRvIGNvbm5lY3QgdG8gdGhhdCBTU0lEIGFueW1vcmUuCisJCQkJcEFkYXB0ZXItPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWRMZW49IDMyOworCQkJCU5kaXNaZXJvTWVtb3J5KHBBZGFwdGVyLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkLCBwQWRhcHRlci0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbik7CisKKwkJCQlMaW5rRG93bihwQWRhcHRlciwgRkFMU0UpOworCQkJfQorCQl9CisJCXBBZGFwdGVyLT5TdGFDZmcuQnNzVHlwZSA9IEJTU19JTkZSQTsKKyAgICAgICAgcEFkYXB0ZXItPm5ldF9kZXYtPnR5cGUgPSBwQWRhcHRlci0+U3RhQ2ZnLk9yaURldlR5cGU7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT5TZXRfTmV0d29ya1R5cGVfUHJvYzo6KElORlJBKVxuIikpOworCisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuQnNzVHlwZSA9IEJTU19JTkZSQTsKKwl9CisgICAgZWxzZSBpZiAoc3RyY21wKGFyZywgIk1vbml0b3IiKSA9PSAwKQorICAgIHsKKwkJVUNIQVIJYmJwVmFsdWUgPSAwOworCQlCQ05fVElNRV9DRkdfU1RSVUMgY3NyOworCQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZGFwdGVyLCBmT1BfU1RBVFVTX0lORlJBX09OKTsKKyAgICAgICAgT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWRhcHRlciwgZk9QX1NUQVRVU19BREhPQ19PTik7CisJCU9QU1RBVFVTX1NFVF9GTEFHKHBBZGFwdGVyLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCk7CisJCS8vIGRpc2FibGUgYWxsIHBlcmlvZGljIHN0YXRlIG1hY2hpbmUKKwkJcEFkYXB0ZXItPlN0YUNmZy5iQXV0b1JlY29ubmVjdCA9IEZBTFNFOworCQkvLyByZXNldCBhbGwgbWxtZSBzdGF0ZSBtYWNoaW5lCisJCVJUMjhYWF9NTE1FX1JFU0VUX1NUQVRFX01BQ0hJTkUocEFkYXB0ZXIpOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCBcbiIpKTsKKyAgICAgICAgaWYgKHBBZGFwdGVyLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPT0gMCkKKyAgICAgICAgeworI2lmZGVmIERPVDExX05fU1VQUE9SVAorICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFBTl9NSVhFRCkKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsID0gMzY7CisgICAgICAgICAgICBlbHNlCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA9IDY7CisgICAgICAgIH0KKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgTl9DaGFubmVsQ2hlY2socEFkYXB0ZXIpOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJaWYgKHBBZGFwdGVyLT5Db21tb25DZmcuUGh5TW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEICYmCisgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5CVyA9PSBCV180MCAmJgorICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuRVhUQ0hBID09IEVYVENIQV9BQk9WRSkKKwkJeworCQkJLy8gNDBNSHogLGNvbnRyb2wgY2hhbm5lbCBhdCBsb3dlcgorCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZGFwdGVyLCBCQlBfUjQsICZiYnBWYWx1ZSk7CisJCQliYnBWYWx1ZSAmPSAofjB4MTgpOworCQkJYmJwVmFsdWUgfD0gMHgxMDsKKwkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkYXB0ZXIsIEJCUF9SNCwgYmJwVmFsdWUpOworCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5CQlBDdXJyZW50QlcgPSBCV180MDsKKwkJCS8vICBSWCA6IGNvbnRyb2wgY2hhbm5lbCBhdCBsb3dlcgorCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZGFwdGVyLCBCQlBfUjMsICZiYnBWYWx1ZSk7CisJCQliYnBWYWx1ZSAmPSAofjB4MjApOworCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWRhcHRlciwgQkJQX1IzLCBiYnBWYWx1ZSk7CisKKwkJCVJUTVBfSU9fUkVBRDMyKHBBZGFwdGVyLCBUWF9CQU5EX0NGRywgJlZhbHVlKTsKKwkJCVZhbHVlICY9IDB4ZmZmZmZmZmU7CisJCQlSVE1QX0lPX1dSSVRFMzIocEFkYXB0ZXIsIFRYX0JBTkRfQ0ZHLCBWYWx1ZSk7CisJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsICsgMjsKKyAgICAgICAgICAgIEFzaWNTd2l0Y2hDaGFubmVsKHBBZGFwdGVyLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsLCBGQUxTRSk7CisJCSAgICBBc2ljTG9ja0NoYW5uZWwocEFkYXB0ZXIsIHBBZGFwdGVyLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwpOworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQldfNDAgLGNvbnRyb2xfY2hhbm5lbCglZCksIENlbnRyYWxDaGFubmVsKCVkKSBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsKSk7CisJCX0KKwkJZWxzZSBpZiAocEFkYXB0ZXItPkNvbW1vbkNmZy5QaHlNb2RlID49IFBIWV8xMUFCR05fTUlYRUQgJiYKKyAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlcgPT0gQldfNDAgJiYKKyAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuRVhUQ0hBID09IEVYVENIQV9CRUxPVykKKwkJeworCQkJLy8gNDBNSHogLGNvbnRyb2wgY2hhbm5lbCBhdCB1cHBlcgorCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZGFwdGVyLCBCQlBfUjQsICZiYnBWYWx1ZSk7CisJCQliYnBWYWx1ZSAmPSAofjB4MTgpOworCQkJYmJwVmFsdWUgfD0gMHgxMDsKKwkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkYXB0ZXIsIEJCUF9SNCwgYmJwVmFsdWUpOworCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5CQlBDdXJyZW50QlcgPSBCV180MDsKKwkJCVJUTVBfSU9fUkVBRDMyKHBBZGFwdGVyLCBUWF9CQU5EX0NGRywgJlZhbHVlKTsKKwkJCVZhbHVlIHw9IDB4MTsKKwkJCVJUTVBfSU9fV1JJVEUzMihwQWRhcHRlciwgVFhfQkFORF9DRkcsIFZhbHVlKTsKKworCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZGFwdGVyLCBCQlBfUjMsICZiYnBWYWx1ZSk7CisJCQliYnBWYWx1ZSB8PSAoMHgyMCk7CisJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZGFwdGVyLCBCQlBfUjMsIGJicFZhbHVlKTsKKwkJCXBBZGFwdGVyLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWwgLSAyOworICAgICAgICAgICAgQXNpY1N3aXRjaENoYW5uZWwocEFkYXB0ZXIsIHBBZGFwdGVyLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwsIEZBTFNFKTsKKwkJICAgIEFzaWNMb2NrQ2hhbm5lbChwQWRhcHRlciwgcEFkYXB0ZXItPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCk7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJCV180MCAsY29udHJvbF9jaGFubmVsKCVkKSwgQ2VudHJhbENoYW5uZWwoJWQpIFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuQ2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwpKTsKKwkJfQorCQllbHNlCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCXsKKwkJCS8vIDIwTUh6CisJCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkYXB0ZXIsIEJCUF9SNCwgJmJicFZhbHVlKTsKKwkJCWJicFZhbHVlICY9ICh+MHgxOCk7CisJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZGFwdGVyLCBCQlBfUjQsIGJicFZhbHVlKTsKKwkJCXBBZGFwdGVyLT5Db21tb25DZmcuQkJQQ3VycmVudEJXID0gQldfMjA7CisJCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWRhcHRlciwgcEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsLCBGQUxTRSk7CisJCQlBc2ljTG9ja0NoYW5uZWwocEFkYXB0ZXIsIHBBZGFwdGVyLT5Db21tb25DZmcuQ2hhbm5lbCk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJCV18yMCwgQ2hhbm5lbCglZClcbiIsIHBBZGFwdGVyLT5Db21tb25DZmcuQ2hhbm5lbCkpOworCQl9CisJCS8vIEVuYWJsZSBSeCB3aXRoIHByb21pc2N1b3VzIHJlY2VwdGlvbgorCQlSVE1QX0lPX1dSSVRFMzIocEFkYXB0ZXIsIFJYX0ZJTFRSX0NGRywgMHgzKTsKKwkJLy8gQVNJQyBzdXBwb3JzdHMgc25pZmZlciBmdW5jdGlvbiB3aXRoIHJlcGxhY2luZyBSU1NJIHdpdGggdGltZXN0YW1wLgorCQkvL1JUTVBfSU9fUkVBRDMyKHBBZGFwdGVyLCBNQUNfU1lTX0NUUkwsICZWYWx1ZSk7CisJCS8vVmFsdWUgfD0gKDB4ODApOworCQkvL1JUTVBfSU9fV1JJVEUzMihwQWRhcHRlciwgTUFDX1NZU19DVFJMLCBWYWx1ZSk7CisJCS8vIGRpc2FibGUgc3luYworCQlSVE1QX0lPX1JFQUQzMihwQWRhcHRlciwgQkNOX1RJTUVfQ0ZHLCAmY3NyLndvcmQpOworCQljc3IuZmllbGQuYkJlYWNvbkdlbiA9IDA7CisJCWNzci5maWVsZC5iVEJUVEVuYWJsZSA9IDA7CisJCWNzci5maWVsZC5Uc2ZTeW5jTW9kZSA9IDA7CisJCVJUTVBfSU9fV1JJVEUzMihwQWRhcHRlciwgQkNOX1RJTUVfQ0ZHLCBjc3Iud29yZCk7CisKKwkJcEFkYXB0ZXItPlN0YUNmZy5Cc3NUeXBlID0gQlNTX01PTklUT1I7CisgICAgICAgIHBBZGFwdGVyLT5uZXRfZGV2LT50eXBlID0gQVJQSFJEX0lFRUU4MDIxMV9QUklTTTsgLy9BUlBIUkRfSUVFRTgwMjExOyAvLyBJRUVFODAyMTEKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PlNldF9OZXR3b3JrVHlwZV9Qcm9jOjooTU9OSVRPUilcbiIpKTsKKyAgICB9CisKKyAgICAvLyBSZXNldCBSYWxpbmsgc3VwcGxpY2FudCB0byBub3QgdXNlLCBpdCB3aWxsIGJlIHNldCB0byBzdGFydCB3aGVuIFVJIHNldCBQTUsga2V5CisgICAgcEFkYXB0ZXItPlN0YUNmZy5XcGFTdGF0ZSA9IFNTX05PVFVTRTsKKworICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9OZXR3b3JrVHlwZV9Qcm9jOjooTmV0d29ya1R5cGU9JWQpXG4iLCBwQWRhcHRlci0+U3RhQ2ZnLkJzc1R5cGUpKTsKKworICAgIHJldHVybiBUUlVFOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBBdXRoZW50aWNhdGlvbiBtb2RlCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQgU2V0X0F1dGhNb2RlX1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZykKK3sKKyAgICBpZiAoKHN0cmNtcChhcmcsICJXRVBBVVRPIikgPT0gMCkgfHwgKHN0cmNtcChhcmcsICJ3ZXBhdXRvIikgPT0gMCkpCisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVBdXRvU3dpdGNoOworICAgIGVsc2UgaWYgKChzdHJjbXAoYXJnLCAiT1BFTiIpID09IDApIHx8IChzdHJjbXAoYXJnLCAib3BlbiIpID09IDApKQorICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlT3BlbjsKKyAgICBlbHNlIGlmICgoc3RyY21wKGFyZywgIlNIQVJFRCIpID09IDApIHx8IChzdHJjbXAoYXJnLCAic2hhcmVkIikgPT0gMCkpCisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVTaGFyZWQ7CisgICAgZWxzZSBpZiAoKHN0cmNtcChhcmcsICJXUEFQU0siKSA9PSAwKSB8fCAoc3RyY21wKGFyZywgIndwYXBzayIpID09IDApKQorICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLOworICAgIGVsc2UgaWYgKChzdHJjbXAoYXJnLCAiV1BBTk9ORSIpID09IDApIHx8IChzdHJjbXAoYXJnLCAid3Bhbm9uZSIpID09IDApKQorICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZTsKKyAgICBlbHNlIGlmICgoc3RyY21wKGFyZywgIldQQTJQU0siKSA9PSAwKSB8fCAoc3RyY21wKGFyZywgIndwYTJwc2siKSA9PSAwKSkKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0s7CisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgIGVsc2UgaWYgKChzdHJjbXAoYXJnLCAiV1BBIikgPT0gMCkgfHwgKHN0cmNtcChhcmcsICJ3cGEiKSA9PSAwKSkKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTsKKyAgICBlbHNlIGlmICgoc3RyY21wKGFyZywgIldQQTIiKSA9PSAwKSB8fCAoc3RyY21wKGFyZywgIndwYTIiKSA9PSAwKSkKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTI7CisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgcEFkYXB0ZXItPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9OT1RfU0VDVVJFRDsKKworICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9BdXRoTW9kZV9Qcm9jOjooQXV0aE1vZGU9JWQpXG4iLCBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlKSk7CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgRW5jcnlwdGlvbiBUeXBlCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQgU2V0X0VuY3J5cFR5cGVfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKQoreworICAgIGlmICgoc3RyY21wKGFyZywgIk5PTkUiKSA9PSAwKSB8fCAoc3RyY21wKGFyZywgIm5vbmUiKSA9PSAwKSkKKyAgICB7CisgICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKKyAgICAgICAgICAgIHJldHVybiBUUlVFOyAgICAvLyBkbyBub3RoaW5nCisKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXMgICAgID0gTmRpczgwMl8xMVdFUERpc2FibGVkOworICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLlBhaXJDaXBoZXIgICAgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CisJICAgIHBBZGFwdGVyLT5TdGFDZmcuR3JvdXBDaXBoZXIgICA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKKyAgICB9CisgICAgZWxzZSBpZiAoKHN0cmNtcChhcmcsICJXRVAiKSA9PSAwKSB8fCAoc3RyY21wKGFyZywgIndlcCIpID09IDApKQorICAgIHsKKyAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKQorICAgICAgICAgICAgcmV0dXJuIFRSVUU7ICAgIC8vIGRvIG5vdGhpbmcKKworICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cyAgICAgPSBOZGlzODAyXzExV0VQRW5hYmxlZDsKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5QYWlyQ2lwaGVyICAgID0gTmRpczgwMl8xMVdFUEVuYWJsZWQ7CisJICAgIHBBZGFwdGVyLT5TdGFDZmcuR3JvdXBDaXBoZXIgICA9IE5kaXM4MDJfMTFXRVBFbmFibGVkOworICAgIH0KKyAgICBlbHNlIGlmICgoc3RyY21wKGFyZywgIlRLSVAiKSA9PSAwKSB8fCAoc3RyY21wKGFyZywgInRraXAiKSA9PSAwKSkKKyAgICB7CisgICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlIDwgTmRpczgwMl8xMUF1dGhNb2RlV1BBKQorICAgICAgICAgICAgcmV0dXJuIFRSVUU7ICAgIC8vIGRvIG5vdGhpbmcKKworICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cyAgICAgPSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkOworICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLlBhaXJDaXBoZXIgICAgPSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkOworCSAgICBwQWRhcHRlci0+U3RhQ2ZnLkdyb3VwQ2lwaGVyICAgPSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkOworICAgIH0KKyAgICBlbHNlIGlmICgoc3RyY21wKGFyZywgIkFFUyIpID09IDApIHx8IChzdHJjbXAoYXJnLCAiYWVzIikgPT0gMCkpCisgICAgeworICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA8IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKKyAgICAgICAgICAgIHJldHVybiBUUlVFOyAgICAvLyBkbyBub3RoaW5nCisKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXMgICAgID0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZDsKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5QYWlyQ2lwaGVyICAgID0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZDsKKwkgICAgcEFkYXB0ZXItPlN0YUNmZy5Hcm91cENpcGhlciAgID0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZDsKKyAgICB9CisgICAgZWxzZQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICBwQWRhcHRlci0+U3RhQ2ZnLk9yaWdXZXBTdGF0dXMgPSBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1czsKKworICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9FbmNyeXBUeXBlX1Byb2M6OihFbmNyeXBUeXBlPSVkKVxuIiwgcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXMpKTsKKworICAgIHJldHVybiBUUlVFOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBEZWZhdWx0IEtleSBJRAorICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UIFNldF9EZWZhdWx0S2V5SURfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKQoreworICAgIFVMT05HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleUlkeDsKKworICAgIEtleUlkeCA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisgICAgaWYoKEtleUlkeCA+PSAxICkgJiYgKEtleUlkeCA8PSA0KSkKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWQgPSAoVUNIQVIpIChLZXlJZHggLSAxICk7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gRkFMU0U7ICAvL0ludmFsaWQgYXJndW1lbnQKKworICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9EZWZhdWx0S2V5SURfUHJvYzo6KERlZmF1bHRLZXlJRD0lZClcbiIsIHBBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkKSk7CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgV0VQIEtFWTEKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVCBTZXRfS2V5MV9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpCit7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5TGVuOworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGk7CisgICAgVUNIQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2lwaGVyQWxnPUNJUEhFUl9XRVA2NDsKKworICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKKyAgICAgICAgcmV0dXJuIFRSVUU7ICAgIC8vIGRvIG5vdGhpbmcKKworICAgIEtleUxlbiA9IHN0cmxlbihhcmcpOworCisgICAgc3dpdGNoIChLZXlMZW4pCisgICAgeworICAgICAgICBjYXNlIDU6IC8vd2VwIDQwIEFzY2lpIHR5cGUKKyAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5TGVuID0gS2V5TGVuOworICAgICAgICAgICAgbWVtY3B5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5LCBhcmcsIEtleUxlbik7CisgICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5MV9Qcm9jOjooS2V5MT0lcyBhbmQgdHlwZT0lcylcbiIsIGFyZywgIkFzY2lpIikpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTA6IC8vd2VwIDQwIEhleCB0eXBlCisgICAgICAgICAgICBmb3IoaT0wOyBpIDwgS2V5TGVuOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoICFpc3hkaWdpdCgqKGFyZytpKSkgKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7ICAvL05vdCBIZXggdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzBdLktleUxlbiA9IEtleUxlbiAvIDIgOworICAgICAgICAgICAgQXRvSChhcmcsIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5LCBLZXlMZW4gLyAyKTsKKyAgICAgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXkxX1Byb2M6OihLZXkxPSVzIGFuZCB0eXBlPSVzKVxuIiwgYXJnLCAiSGV4IikpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTM6IC8vd2VwIDEwNCBBc2NpaSB0eXBlCisgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzBdLktleUxlbiA9IEtleUxlbjsKKyAgICAgICAgICAgIG1lbWNweShwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzBdLktleSwgYXJnLCBLZXlMZW4pOworICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDEyODsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXkxX1Byb2M6OihLZXkxPSVzIGFuZCB0eXBlPSVzKVxuIiwgYXJnLCAiQXNjaWkiKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyNjogLy93ZXAgMTA0IEhleCB0eXBlCisgICAgICAgICAgICBmb3IoaT0wOyBpIDwgS2V5TGVuOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoICFpc3hkaWdpdCgqKGFyZytpKSkgKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7ICAvL05vdCBIZXggdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzBdLktleUxlbiA9IEtleUxlbiAvIDIgOworICAgICAgICAgICAgQXRvSChhcmcsIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5LCBLZXlMZW4gLyAyKTsKKyAgICAgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5MV9Qcm9jOjooS2V5MT0lcyBhbmQgdHlwZT0lcylcbiIsIGFyZywgIkhleCIpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OiAvL0ludmFsaWQgYXJndW1lbnQKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXkxX1Byb2M6OkludmFsaWQgYXJndW1lbnQgKD0lcylcbiIsIGFyZykpOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOworCisgICAgLy8gU2V0IGtleXMgKGludG8gQVNJQykKKyAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpCisgICAgICAgIDsgICAvLyBub3Qgc3VwcG9ydAorICAgIGVsc2UgICAgLy8gT2xkIFdFUCBzdHVmZgorICAgIHsKKyAgICAgICAgQXNpY0FkZFNoYXJlZEtleUVudHJ5KHBBZGFwdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgIH0KKworICAgIHJldHVybiBUUlVFOworfQorLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBXRVAgS0VZMgorICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UIFNldF9LZXkyX1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZykKK3sKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXlMZW47CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTsKKyAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaXBoZXJBbGc9Q0lQSEVSX1dFUDY0OworCisgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKQorICAgICAgICByZXR1cm4gVFJVRTsgICAgLy8gZG8gbm90aGluZworCisgICAgS2V5TGVuID0gc3RybGVuKGFyZyk7CisKKyAgICBzd2l0Y2ggKEtleUxlbikKKyAgICB7CisgICAgICAgIGNhc2UgNTogLy93ZXAgNDAgQXNjaWkgdHlwZQorICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsxXS5LZXlMZW4gPSBLZXlMZW47CisgICAgICAgICAgICBtZW1jcHkocEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsxXS5LZXksIGFyZywgS2V5TGVuKTsKKyAgICAgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXkyX1Byb2M6OihLZXkyPSVzIGFuZCB0eXBlPSVzKVxuIiwgYXJnLCAiQXNjaWkiKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxMDogLy93ZXAgNDAgSGV4IHR5cGUKKyAgICAgICAgICAgIGZvcihpPTA7IGkgPCBLZXlMZW47IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiggIWlzeGRpZ2l0KCooYXJnK2kpKSApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsgIC8vTm90IEhleCB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMV0uS2V5TGVuID0gS2V5TGVuIC8gMiA7CisgICAgICAgICAgICBBdG9IKGFyZywgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsxXS5LZXksIEtleUxlbiAvIDIpOworICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTJfUHJvYzo6KEtleTI9JXMgYW5kIHR5cGU9JXMpXG4iLCBhcmcsICJIZXgiKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxMzogLy93ZXAgMTA0IEFzY2lpIHR5cGUKKyAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMV0uS2V5TGVuID0gS2V5TGVuOworICAgICAgICAgICAgbWVtY3B5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMV0uS2V5LCBhcmcsIEtleUxlbik7CisgICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTJfUHJvYzo6KEtleTI9JXMgYW5kIHR5cGU9JXMpXG4iLCBhcmcsICJBc2NpaSIpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI2OiAvL3dlcCAxMDQgSGV4IHR5cGUKKyAgICAgICAgICAgIGZvcihpPTA7IGkgPCBLZXlMZW47IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiggIWlzeGRpZ2l0KCooYXJnK2kpKSApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsgIC8vTm90IEhleCB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMV0uS2V5TGVuID0gS2V5TGVuIC8gMiA7CisgICAgICAgICAgICBBdG9IKGFyZywgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsxXS5LZXksIEtleUxlbiAvIDIpOworICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDEyODsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXkyX1Byb2M6OihLZXkyPSVzIGFuZCB0eXBlPSVzKVxuIiwgYXJnLCAiSGV4IikpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6IC8vSW52YWxpZCBhcmd1bWVudAorICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTJfUHJvYzo6SW52YWxpZCBhcmd1bWVudCAoPSVzKVxuIiwgYXJnKSk7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMV0uQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOworCisgICAgLy8gU2V0IGtleXMgKGludG8gQVNJQykKKyAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpCisgICAgICAgIDsgICAvLyBub3Qgc3VwcG9ydAorICAgIGVsc2UgICAgLy8gT2xkIFdFUCBzdHVmZgorICAgIHsKKyAgICAgICAgQXNpY0FkZFNoYXJlZEtleUVudHJ5KHBBZGFwdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzFdLkNpcGhlckFsZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMV0uS2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgIH0KKworICAgIHJldHVybiBUUlVFOworfQorLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgV0VQIEtFWTMKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVCBTZXRfS2V5M19Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpCit7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5TGVuOworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGk7CisgICAgVUNIQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2lwaGVyQWxnPUNJUEhFUl9XRVA2NDsKKworICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKKyAgICAgICAgcmV0dXJuIFRSVUU7ICAgIC8vIGRvIG5vdGhpbmcKKworICAgIEtleUxlbiA9IHN0cmxlbihhcmcpOworCisgICAgc3dpdGNoIChLZXlMZW4pCisgICAgeworICAgICAgICBjYXNlIDU6IC8vd2VwIDQwIEFzY2lpIHR5cGUKKyAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMl0uS2V5TGVuID0gS2V5TGVuOworICAgICAgICAgICAgbWVtY3B5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMl0uS2V5LCBhcmcsIEtleUxlbik7CisgICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5M19Qcm9jOjooS2V5Mz0lcyBhbmQgdHlwZT1Bc2NpaSlcbiIsIGFyZykpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTA6IC8vd2VwIDQwIEhleCB0eXBlCisgICAgICAgICAgICBmb3IoaT0wOyBpIDwgS2V5TGVuOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoICFpc3hkaWdpdCgqKGFyZytpKSkgKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7ICAvL05vdCBIZXggdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzJdLktleUxlbiA9IEtleUxlbiAvIDIgOworICAgICAgICAgICAgQXRvSChhcmcsIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMl0uS2V5LCBLZXlMZW4gLyAyKTsKKyAgICAgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXkzX1Byb2M6OihLZXkzPSVzIGFuZCB0eXBlPUhleClcbiIsIGFyZykpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTM6IC8vd2VwIDEwNCBBc2NpaSB0eXBlCisgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzJdLktleUxlbiA9IEtleUxlbjsKKyAgICAgICAgICAgIG1lbWNweShwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzJdLktleSwgYXJnLCBLZXlMZW4pOworICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDEyODsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXkzX1Byb2M6OihLZXkzPSVzIGFuZCB0eXBlPUFzY2lpKVxuIiwgYXJnKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyNjogLy93ZXAgMTA0IEhleCB0eXBlCisgICAgICAgICAgICBmb3IoaT0wOyBpIDwgS2V5TGVuOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoICFpc3hkaWdpdCgqKGFyZytpKSkgKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7ICAvL05vdCBIZXggdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzJdLktleUxlbiA9IEtleUxlbiAvIDIgOworICAgICAgICAgICAgQXRvSChhcmcsIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMl0uS2V5LCBLZXlMZW4gLyAyKTsKKyAgICAgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5M19Qcm9jOjooS2V5Mz0lcyBhbmQgdHlwZT1IZXgpXG4iLCBhcmcpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OiAvL0ludmFsaWQgYXJndW1lbnQKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXkzX1Byb2M6OkludmFsaWQgYXJndW1lbnQgKD0lcylcbiIsIGFyZykpOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzJdLkNpcGhlckFsZyA9IENpcGhlckFsZzsKKworICAgIC8vIFNldCBrZXlzIChpbnRvIEFTSUMpCisgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKQorICAgICAgICA7ICAgLy8gbm90IHN1cHBvcnQKKyAgICBlbHNlICAgIC8vIE9sZCBXRVAgc3R1ZmYKKyAgICB7CisgICAgICAgIEFzaWNBZGRTaGFyZWRLZXlFbnRyeShwQWRhcHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsyXS5DaXBoZXJBbGcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzJdLktleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICB9CisKKyAgICByZXR1cm4gVFJVRTsKK30KKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IFdFUCBLRVk0CisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQgU2V0X0tleTRfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKQoreworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleUxlbjsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpOworICAgIFVDSEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENpcGhlckFsZz1DSVBIRVJfV0VQNjQ7CisKKyAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpCisgICAgICAgIHJldHVybiBUUlVFOyAgICAvLyBkbyBub3RoaW5nCisKKyAgICBLZXlMZW4gPSBzdHJsZW4oYXJnKTsKKworICAgIHN3aXRjaCAoS2V5TGVuKQorICAgIHsKKyAgICAgICAgY2FzZSA1OiAvL3dlcCA0MCBBc2NpaSB0eXBlCisgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzNdLktleUxlbiA9IEtleUxlbjsKKyAgICAgICAgICAgIG1lbWNweShwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzNdLktleSwgYXJnLCBLZXlMZW4pOworICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTRfUHJvYzo6KEtleTQ9JXMgYW5kIHR5cGU9JXMpXG4iLCBhcmcsICJBc2NpaSIpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDEwOiAvL3dlcCA0MCBIZXggdHlwZQorICAgICAgICAgICAgZm9yKGk9MDsgaSA8IEtleUxlbjsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCAhaXN4ZGlnaXQoKihhcmcraSkpICkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOyAgLy9Ob3QgSGV4IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVszXS5LZXlMZW4gPSBLZXlMZW4gLyAyIDsKKyAgICAgICAgICAgIEF0b0goYXJnLCBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzNdLktleSwgS2V5TGVuIC8gMik7CisgICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5NF9Qcm9jOjooS2V5ND0lcyBhbmQgdHlwZT0lcylcbiIsIGFyZywgIkhleCIpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDEzOiAvL3dlcCAxMDQgQXNjaWkgdHlwZQorICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVszXS5LZXlMZW4gPSBLZXlMZW47CisgICAgICAgICAgICBtZW1jcHkocEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVszXS5LZXksIGFyZywgS2V5TGVuKTsKKyAgICAgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5NF9Qcm9jOjooS2V5ND0lcyBhbmQgdHlwZT0lcylcbiIsIGFyZywgIkFzY2lpIikpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjY6IC8vd2VwIDEwNCBIZXggdHlwZQorICAgICAgICAgICAgZm9yKGk9MDsgaSA8IEtleUxlbjsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCAhaXN4ZGlnaXQoKihhcmcraSkpICkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOyAgLy9Ob3QgSGV4IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVszXS5LZXlMZW4gPSBLZXlMZW4gLyAyIDsKKyAgICAgICAgICAgIEF0b0goYXJnLCBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzNdLktleSwgS2V5TGVuIC8gMik7CisgICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTRfUHJvYzo6KEtleTQ9JXMgYW5kIHR5cGU9JXMpXG4iLCBhcmcsICJIZXgiKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDogLy9JbnZhbGlkIGFyZ3VtZW50CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5NF9Qcm9jOjpJbnZhbGlkIGFyZ3VtZW50ICg9JXMpXG4iLCBhcmcpKTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVszXS5DaXBoZXJBbGcgPSBDaXBoZXJBbGc7CisKKyAgICAvLyBTZXQga2V5cyAoaW50byBBU0lDKQorICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKKyAgICAgICAgOyAgIC8vIG5vdCBzdXBwb3J0CisgICAgZWxzZSAgICAvLyBPbGQgV0VQIHN0dWZmCisgICAgeworICAgICAgICBBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkYXB0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bM10uQ2lwaGVyQWxnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVszXS5LZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgfQorCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IFdQQSBQU0sga2V5CisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQgU2V0X1dQQVBTS19Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpCit7CisgICAgVUNIQVIgICAgICAgICAgICAgICAgICAga2V5TWF0ZXJpYWxbNDBdOworCisgICAgaWYgKChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlICE9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykgJiYKKyAgICAgICAgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgIT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykgJiYKKwkgICAgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgIT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZSkKKwkJKQorICAgICAgICByZXR1cm4gVFJVRTsgICAgLy8gZG8gbm90aGluZworCisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X1dQQVBTS19Qcm9jOjooV1BBUFNLPSVzKVxuIiwgYXJnKSk7CisKKyAgICBOZGlzWmVyb01lbW9yeShrZXlNYXRlcmlhbCwgNDApOworCisgICAgaWYgKChzdHJsZW4oYXJnKSA8IDgpIHx8IChzdHJsZW4oYXJnKSA+IDY0KSkKKyAgICB7CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldCBmYWlsZWQhIShXUEFQU0s9JXMpLCBXUEFQU0sga2V5LXN0cmluZyByZXF1aXJlZCA4IH4gNjQgY2hhcmFjdGVycyBcbiIsIGFyZykpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgaWYgKHN0cmxlbihhcmcpID09IDY0KQorICAgIHsKKyAgICAgICAgQXRvSChhcmcsIGtleU1hdGVyaWFsLCAzMik7CisgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZGFwdGVyLT5TdGFDZmcuUE1LLCBrZXlNYXRlcmlhbCwgMzIpOworCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIFBhc3N3b3JkSGFzaCgoY2hhciAqKWFyZywgcEFkYXB0ZXItPk1sbWVBdXguU3NpZCwgcEFkYXB0ZXItPk1sbWVBdXguU3NpZExlbiwga2V5TWF0ZXJpYWwpOworICAgICAgICBOZGlzTW92ZU1lbW9yeShwQWRhcHRlci0+U3RhQ2ZnLlBNSywga2V5TWF0ZXJpYWwsIDMyKTsKKyAgICB9CisKKworCisgICAgaWYocEFkYXB0ZXItPlN0YUNmZy5Cc3NUeXBlID09IEJTU19BREhPQyAmJgorICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZSkKKyAgICB7CisgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldwYVN0YXRlID0gU1NfTk9UVVNFOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvLyBTdGFydCBTVEEgc3VwcGxpY2FudCBzdGF0ZSBtYWNoaW5lCisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV3BhU3RhdGUgPSBTU19TVEFSVDsKKyAgICB9CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgUG93ZXIgU2F2aW5nIG1vZGUKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVCBTZXRfUFNNb2RlX1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZykKK3sKKyAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5Cc3NUeXBlID09IEJTU19JTkZSQSkKKyAgICB7CisgICAgICAgIGlmICgoc3RyY21wKGFyZywgIk1heF9QU1AiKSA9PSAwKSB8fAorCQkJKHN0cmNtcChhcmcsICJtYXhfcHNwIikgPT0gMCkgfHwKKwkJCShzdHJjbXAoYXJnLCAiTUFYX1BTUCIpID09IDApKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBkbyBOT1QgdHVybiBvbiBQU00gYml0IGhlcmUsIHdhaXQgdW50aWwgTWxtZUNoZWNrRm9yUHNtQ2hhbmdlKCkKKyAgICAgICAgICAgIC8vIHRvIGV4Y2x1ZGUgY2VydGFpbiBzaXR1YXRpb25zLgorICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuYldpbmRvd3NBQ0NBTUVuYWJsZSA9PSBGQUxTRSkKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldpbmRvd3NQb3dlck1vZGUgPSBOZGlzODAyXzExUG93ZXJNb2RlTUFYX1BTUDsKKyAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2luZG93c0JhdHRlcnlQb3dlck1vZGUgPSBOZGlzODAyXzExUG93ZXJNb2RlTUFYX1BTUDsKKyAgICAgICAgICAgIE9QU1RBVFVTX1NFVF9GTEFHKHBBZGFwdGVyLCBmT1BfU1RBVFVTX1JFQ0VJVkVfRFRJTSk7CisgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRMaXN0ZW5Db3VudCA9IDU7CisKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICgoc3RyY21wKGFyZywgIkZhc3RfUFNQIikgPT0gMCkgfHwKKwkJCQkgKHN0cmNtcChhcmcsICJmYXN0X3BzcCIpID09IDApIHx8CisgICAgICAgICAgICAgICAgIChzdHJjbXAoYXJnLCAiRkFTVF9QU1AiKSA9PSAwKSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gZG8gTk9UIHR1cm4gb24gUFNNIGJpdCBoZXJlLCB3YWl0IHVudGlsIE1sbWVDaGVja0ZvclBzbUNoYW5nZSgpCisgICAgICAgICAgICAvLyB0byBleGNsdWRlIGNlcnRhaW4gc2l0dWF0aW9ucy4KKyAgICAgICAgICAgIE9QU1RBVFVTX1NFVF9GTEFHKHBBZGFwdGVyLCBmT1BfU1RBVFVTX1JFQ0VJVkVfRFRJTSk7CisgICAgICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5iV2luZG93c0FDQ0FNRW5hYmxlID09IEZBTFNFKQorICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2luZG93c1Bvd2VyTW9kZSA9IE5kaXM4MDJfMTFQb3dlck1vZGVGYXN0X1BTUDsKKyAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2luZG93c0JhdHRlcnlQb3dlck1vZGUgPSBOZGlzODAyXzExUG93ZXJNb2RlRmFzdF9QU1A7CisgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRMaXN0ZW5Db3VudCA9IDM7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoKHN0cmNtcChhcmcsICJMZWdhY3lfUFNQIikgPT0gMCkgfHwKKyAgICAgICAgICAgICAgICAgKHN0cmNtcChhcmcsICJsZWdhY3lfcHNwIikgPT0gMCkgfHwKKyAgICAgICAgICAgICAgICAgKHN0cmNtcChhcmcsICJMRUdBQ1lfUFNQIikgPT0gMCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGRvIE5PVCB0dXJuIG9uIFBTTSBiaXQgaGVyZSwgd2FpdCB1bnRpbCBNbG1lQ2hlY2tGb3JQc21DaGFuZ2UoKQorICAgICAgICAgICAgLy8gdG8gZXhjbHVkZSBjZXJ0YWluIHNpdHVhdGlvbnMuCisgICAgICAgICAgICBPUFNUQVRVU19TRVRfRkxBRyhwQWRhcHRlciwgZk9QX1NUQVRVU19SRUNFSVZFX0RUSU0pOworICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuYldpbmRvd3NBQ0NBTUVuYWJsZSA9PSBGQUxTRSkKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldpbmRvd3NQb3dlck1vZGUgPSBOZGlzODAyXzExUG93ZXJNb2RlTGVnYWN5X1BTUDsKKyAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2luZG93c0JhdHRlcnlQb3dlck1vZGUgPSBOZGlzODAyXzExUG93ZXJNb2RlTGVnYWN5X1BTUDsKKyAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdExpc3RlbkNvdW50ID0gMzsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vRGVmYXVsdCBOZGlzODAyXzExUG93ZXJNb2RlQ0FNCisgICAgICAgICAgICAvLyBjbGVhciBQU00gYml0IGltbWVkaWF0ZWx5CisgICAgICAgICAgICBNbG1lU2V0UHNtQml0KHBBZGFwdGVyLCBQV1JfQUNUSVZFKTsKKyAgICAgICAgICAgIE9QU1RBVFVTX1NFVF9GTEFHKHBBZGFwdGVyLCBmT1BfU1RBVFVTX1JFQ0VJVkVfRFRJTSk7CisgICAgICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5iV2luZG93c0FDQ0FNRW5hYmxlID09IEZBTFNFKQorICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2luZG93c1Bvd2VyTW9kZSA9IE5kaXM4MDJfMTFQb3dlck1vZGVDQU07CisgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldpbmRvd3NCYXR0ZXJ5UG93ZXJNb2RlID0gTmRpczgwMl8xMVBvd2VyTW9kZUNBTTsKKyAgICAgICAgfQorCisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9QU01vZGVfUHJvYzo6KFBTTW9kZT0lbGQpXG4iLCBwQWRhcHRlci0+U3RhQ2ZnLldpbmRvd3NQb3dlck1vZGUpKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKworICAgIHJldHVybiBUUlVFOworfQorCisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgV3BhU3VwcG9ydCBmbGFnLgorICAgIFZhbHVlOgorICAgICAgICAwOiBEcml2ZXIgaWdub3JlIHdwYV9zdXBwbGljYW50LgorICAgICAgICAxOiB3cGFfc3VwcGxpY2FudCBpbml0aWF0ZXMgc2Nhbm5pbmcgYW5kIEFQIHNlbGVjdGlvbi4KKyAgICAgICAgMjogZHJpdmVyIHRha2VzIGNhcmUgb2Ygc2Nhbm5pbmcsIEFQIHNlbGVjdGlvbiwgYW5kIElFRUUgODAyLjExIGFzc29jaWF0aW9uIHBhcmFtZXRlcnMuCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQgU2V0X1dwYV9TdXBwb3J0KAorICAgIElOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKworICAgIGlmICggc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKSA9PSAwKQorICAgICAgICBwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgPSBXUEFfU1VQUExJQ0FOVF9ESVNBQkxFOworICAgIGVsc2UgaWYgKCBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApID09IDEpCisgICAgICAgIHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCA9IFdQQV9TVVBQTElDQU5UX0VOQUJMRTsKKyAgICBlbHNlIGlmICggc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKSA9PSAyKQorICAgICAgICBwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgPSBXUEFfU1VQUExJQ0FOVF9FTkFCTEVfV0lUSF9XRUJfVUk7CisgICAgZWxzZQorICAgICAgICBwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgPSBXUEFfU1VQUExJQ0FOVF9ESVNBQkxFOworCisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X1dwYV9TdXBwb3J0OjooV3BhU3VwcGxpY2FudFVQPSVkKVxuIiwgcEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQKSk7CisKKyAgICByZXR1cm4gVFJVRTsKK30KKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisKKyNpZmRlZiBEQkcKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgUmVhZCAvIFdyaXRlIE1BQworICAgIEFyZ3VtZW50czoKKyAgICAgICAgcEFkYXB0ZXIgICAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKyAgICAgICAgd3JxICAgICAgICAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGlvY3RsIGFyZ3VtZW50CisKKyAgICBSZXR1cm4gVmFsdWU6CisgICAgICAgIE5vbmUKKworICAgIE5vdGU6CisgICAgICAgIFVzYWdlOgorICAgICAgICAgICAgICAgMS4pIGl3cHJpdiByYTAgbWFjIDAgICAgICAgID09PiByZWFkIE1BQyB3aGVyZSBBZGRyPTB4MAorICAgICAgICAgICAgICAgMi4pIGl3cHJpdiByYTAgbWFjIDA9MTIgICAgID09PiB3cml0ZSBNQUMgd2hlcmUgQWRkcj0weDAsIHZhbHVlPTEyCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIFJUTVBJb2N0bE1BQygKKwlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAorCUlOCXN0cnVjdCBpd3JlcQkqd3JxKQoreworCUNIQVIJCQkJKnRoaXNfY2hhcjsKKwlDSEFSCQkJCSp2YWx1ZTsKKwlJTlQJCQkJCWogPSAwLCBrID0gMDsKKwlDSEFSCQkJCW1zZ1sxMDI0XTsKKwlDSEFSCQkJCWFyZ1syNTVdOworCVVMT05HCQkJCW1hY0FkZHIgPSAwOworCVVDSEFSCQkJCXRlbXBbMTZdLCB0ZW1wMlsxNl07CisJVUlOVDMyCQkJCW1hY1ZhbHVlID0gMDsKKwlJTlQJCQkJCVN0YXR1czsKKworCisJbWVtc2V0KG1zZywgMHgwMCwgMTAyNCk7CisJaWYgKHdycS0+dS5kYXRhLmxlbmd0aCA+IDEpIC8vTm8gcGFyYW1ldGVycy4KKwl7CisJICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKGFyZywgd3JxLT51LmRhdGEucG9pbnRlciwgKHdycS0+dS5kYXRhLmxlbmd0aCA+IDI1NSkgPyAyNTUgOiB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQlzcHJpbnRmKG1zZywgIlxuIik7CisKKwkJLy9QYXJzaW5nIFJlYWQgb3IgV3JpdGUKKwkgICAgdGhpc19jaGFyID0gYXJnOworCQlpZiAoISp0aGlzX2NoYXIpCisJCQlnb3RvIG5leHQ7CisKKwkJaWYgKCh2YWx1ZSA9IHJ0c3RyY2hyKHRoaXNfY2hhciwgJz0nKSkgIT0gTlVMTCkKKwkJCSp2YWx1ZSsrID0gMDsKKworCQlpZiAoIXZhbHVlIHx8ICEqdmFsdWUpCisJCXsgLy9SZWFkCisJCQkvLyBTYW5pdHkgY2hlY2sKKwkJCWlmKHN0cmxlbih0aGlzX2NoYXIpID4gNCkKKwkJCQlnb3RvIG5leHQ7CisKKwkJCWogPSBzdHJsZW4odGhpc19jaGFyKTsKKwkJCXdoaWxlKGotLSA+IDApCisJCQl7CisJCQkJaWYodGhpc19jaGFyW2pdID4gJ2YnIHx8IHRoaXNfY2hhcltqXSA8ICcwJykKKwkJCQkJcmV0dXJuOworCQkJfQorCisJCQkvLyBNYWMgQWRkcgorCQkJayA9IGogPSBzdHJsZW4odGhpc19jaGFyKTsKKwkJCXdoaWxlKGotLSA+IDApCisJCQl7CisJCQkJdGhpc19jaGFyWzQtaytqXSA9IHRoaXNfY2hhcltqXTsKKwkJCX0KKworCQkJd2hpbGUoayA8IDQpCisJCQkJdGhpc19jaGFyWzMtaysrXT0nMCc7CisJCQl0aGlzX2NoYXJbNF09J1wwJzsKKworCQkJaWYoc3RybGVuKHRoaXNfY2hhcikgPT0gNCkKKwkJCXsKKwkJCQlBdG9IKHRoaXNfY2hhciwgdGVtcCwgMik7CisJCQkJbWFjQWRkciA9ICp0ZW1wKjI1NiArIHRlbXBbMV07CisJCQkJaWYgKG1hY0FkZHIgPCAweEZGRkYpCisJCQkJeworCQkJCQlSVE1QX0lPX1JFQUQzMihwQWRhcHRlciwgbWFjQWRkciwgJm1hY1ZhbHVlKTsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTWFjQWRkcj0lbHgsIE1hY1ZhbHVlPSV4XG4iLCBtYWNBZGRyLCBtYWNWYWx1ZSkpOworCQkJCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwgIlsweCUwOGxYXTolMDhYICAiLCBtYWNBZGRyICwgbWFjVmFsdWUpOworCQkJCX0KKwkJCQllbHNlCisJCQkJey8vSW52YWxpZCBwYXJhbWV0ZXMsIHNvIGRlZmF1bHQgcHJpbnRrIGFsbCBiYnAKKwkJCQkJZ290byBuZXh0OworCQkJCX0KKwkJCX0KKwkJfQorCQllbHNlCisJCXsgLy9Xcml0ZQorCQkJbWVtY3B5KCZ0ZW1wMiwgdmFsdWUsIHN0cmxlbih2YWx1ZSkpOworCQkJdGVtcDJbc3RybGVuKHZhbHVlKV0gPSAnXDAnOworCisJCQkvLyBTYW5pdHkgY2hlY2sKKwkJCWlmKChzdHJsZW4odGhpc19jaGFyKSA+IDQpIHx8IHN0cmxlbih0ZW1wMikgPiA4KQorCQkJCWdvdG8gbmV4dDsKKworCQkJaiA9IHN0cmxlbih0aGlzX2NoYXIpOworCQkJd2hpbGUoai0tID4gMCkKKwkJCXsKKwkJCQlpZih0aGlzX2NoYXJbal0gPiAnZicgfHwgdGhpc19jaGFyW2pdIDwgJzAnKQorCQkJCQlyZXR1cm47CisJCQl9CisKKwkJCWogPSBzdHJsZW4odGVtcDIpOworCQkJd2hpbGUoai0tID4gMCkKKwkJCXsKKwkJCQlpZih0ZW1wMltqXSA+ICdmJyB8fCB0ZW1wMltqXSA8ICcwJykKKwkJCQkJcmV0dXJuOworCQkJfQorCisJCQkvL01BQyBBZGRyCisJCQlrID0gaiA9IHN0cmxlbih0aGlzX2NoYXIpOworCQkJd2hpbGUoai0tID4gMCkKKwkJCXsKKwkJCQl0aGlzX2NoYXJbNC1rK2pdID0gdGhpc19jaGFyW2pdOworCQkJfQorCisJCQl3aGlsZShrIDwgNCkKKwkJCQl0aGlzX2NoYXJbMy1rKytdPScwJzsKKwkJCXRoaXNfY2hhcls0XT0nXDAnOworCisJCQkvL01BQyB2YWx1ZQorCQkJayA9IGogPSBzdHJsZW4odGVtcDIpOworCQkJd2hpbGUoai0tID4gMCkKKwkJCXsKKwkJCQl0ZW1wMls4LWsral0gPSB0ZW1wMltqXTsKKwkJCX0KKworCQkJd2hpbGUoayA8IDgpCisJCQkJdGVtcDJbNy1rKytdPScwJzsKKwkJCXRlbXAyWzhdPSdcMCc7CisKKwkJCXsKKwkJCQlBdG9IKHRoaXNfY2hhciwgdGVtcCwgMik7CisJCQkJbWFjQWRkciA9ICp0ZW1wKjI1NiArIHRlbXBbMV07CisKKwkJCQlBdG9IKHRlbXAyLCB0ZW1wLCA0KTsKKwkJCQltYWNWYWx1ZSA9ICp0ZW1wKjI1NioyNTYqMjU2ICsgdGVtcFsxXSoyNTYqMjU2ICsgdGVtcFsyXSoyNTYgKyB0ZW1wWzNdOworCisJCQkJLy8gZGVidWcgbW9kZQorCQkJCWlmIChtYWNBZGRyID09IChIV19ERUJVR19TRVRUSU5HX0JBU0UgKyA0KSkKKwkJCQl7CisJCQkJCS8vIDB4MmJmNDogYnl0ZTAgbm9uLXplcm86IGVuYWJsZSBSMTcgdHVuaW5nLCAwOiBkaXNhYmxlIFIxNyB0dW5pbmcKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1hY1ZhbHVlICYgMHgwMDAwMDBmZikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkJicFR1bmluZy5iRW5hYmxlID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgidHVybiBvbiBSMTcgdHVuaW5nXG4iKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiBSNjY7CisgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+QmJwVHVuaW5nLmJFbmFibGUgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFI2NiA9IDB4MjYgKyBHRVRfTE5BX0dBSU4ocEFkYXB0ZXIpOworI2lmZGVmIFJBTElOS19BVEUKKwkJCQkJCWlmIChBVEVfT04ocEFkYXB0ZXIpKQorCQkJCQkJeworCQkJCQkJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWRhcHRlciwgQkJQX1I2NiwgKDB4MjYgKyBHRVRfTE5BX0dBSU4ocEFkYXB0ZXIpKSk7CisJCQkJCQl9CisJCQkJCQllbHNlCisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCQkJCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWRhcHRlciwgQkJQX1I2NiwgKDB4MjYgKyBHRVRfTE5BX0dBSU4ocEFkYXB0ZXIpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoInR1cm4gb2ZmIFIxNyB0dW5pbmcsIHJlc3RvcmUgdG8gMHglMDJ4XG4iLCBSNjYpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCQkJCQlyZXR1cm47CisJCQkJfQorCisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTWFjQWRkcj0lMDJseCwgTWFjVmFsdWU9MHgleFxuIiwgbWFjQWRkciwgbWFjVmFsdWUpKTsKKworCQkJCVJUTVBfSU9fV1JJVEUzMihwQWRhcHRlciwgbWFjQWRkciwgbWFjVmFsdWUpOworCQkJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCAiWzB4JTA4bFhdOiUwOFggICIsIG1hY0FkZHIsIG1hY1ZhbHVlKTsKKwkJCX0KKwkJfQorCX0KK25leHQ6CisJaWYoc3RybGVuKG1zZykgPT0gMSkKKwkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksICI9PT0+RXJyb3IgY29tbWFuZCBmb3JtYXQhIik7CisKKwkvLyBDb3B5IHRoZSBpbmZvcm1hdGlvbiBpbnRvIHRoZSB1c2VyIGJ1ZmZlcgorCXdycS0+dS5kYXRhLmxlbmd0aCA9IHN0cmxlbihtc2cpOworCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBtc2csIHdycS0+dS5kYXRhLmxlbmd0aCk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT1SVE1QSW9jdGxNQUNcblxuIikpOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFJlYWQgLyBXcml0ZSBFMlBST00KKyAgICBBcmd1bWVudHM6CisgICAgICAgIHBBZGFwdGVyICAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIG91ciBhZGFwdGVyCisgICAgICAgIHdycSAgICAgICAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpb2N0bCBhcmd1bWVudAorCisgICAgUmV0dXJuIFZhbHVlOgorICAgICAgICBOb25lCisKKyAgICBOb3RlOgorICAgICAgICBVc2FnZToKKyAgICAgICAgICAgICAgIDEuKSBpd3ByaXYgcmEwIGUycCAwICAgICAJPT0+IHJlYWQgRTJQUk9NIHdoZXJlIEFkZHI9MHgwCisgICAgICAgICAgICAgICAyLikgaXdwcml2IHJhMCBlMnAgMD0xMjM0ICAgID09PiB3cml0ZSBFMlBST00gd2hlcmUgQWRkcj0weDAsIHZhbHVlPTEyMzQKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgUlRNUElvY3RsRTJQUk9NKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCisJSU4Jc3RydWN0IGl3cmVxCSp3cnEpCit7CisJQ0hBUgkJCQkqdGhpc19jaGFyOworCUNIQVIJCQkJKnZhbHVlOworCUlOVAkJCQkJaiA9IDAsIGsgPSAwOworCUNIQVIJCQkJbXNnWzEwMjRdOworCUNIQVIJCQkJYXJnWzI1NV07CisJVVNIT1JUCQkJCWVlcEFkZHIgPSAwOworCVVDSEFSCQkJCXRlbXBbMTZdLCB0ZW1wMlsxNl07CisJVVNIT1JUCQkJCWVlcFZhbHVlOworCWludAkJCQkJU3RhdHVzOworCisKKwltZW1zZXQobXNnLCAweDAwLCAxMDI0KTsKKwlpZiAod3JxLT51LmRhdGEubGVuZ3RoID4gMSkgLy9ObyBwYXJhbWV0ZXJzLgorCXsKKwkgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIoYXJnLCB3cnEtPnUuZGF0YS5wb2ludGVyLCAod3JxLT51LmRhdGEubGVuZ3RoID4gMjU1KSA/IDI1NSA6IHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCXNwcmludGYobXNnLCAiXG4iKTsKKworCSAgICAvL1BhcnNpbmcgUmVhZCBvciBXcml0ZQorCQl0aGlzX2NoYXIgPSBhcmc7CisKKworCQlpZiAoISp0aGlzX2NoYXIpCisJCQlnb3RvIG5leHQ7CisKKwkJaWYgKCh2YWx1ZSA9IHJ0c3RyY2hyKHRoaXNfY2hhciwgJz0nKSkgIT0gTlVMTCkKKwkJCSp2YWx1ZSsrID0gMDsKKworCQlpZiAoIXZhbHVlIHx8ICEqdmFsdWUpCisJCXsgLy9SZWFkCisKKwkJCS8vIFNhbml0eSBjaGVjaworCQkJaWYoc3RybGVuKHRoaXNfY2hhcikgPiA0KQorCQkJCWdvdG8gbmV4dDsKKworCQkJaiA9IHN0cmxlbih0aGlzX2NoYXIpOworCQkJd2hpbGUoai0tID4gMCkKKwkJCXsKKwkJCQlpZih0aGlzX2NoYXJbal0gPiAnZicgfHwgdGhpc19jaGFyW2pdIDwgJzAnKQorCQkJCQlyZXR1cm47CisJCQl9CisKKwkJCS8vIEUyUFJPTSBhZGRyCisJCQlrID0gaiA9IHN0cmxlbih0aGlzX2NoYXIpOworCQkJd2hpbGUoai0tID4gMCkKKwkJCXsKKwkJCQl0aGlzX2NoYXJbNC1rK2pdID0gdGhpc19jaGFyW2pdOworCQkJfQorCisJCQl3aGlsZShrIDwgNCkKKwkJCQl0aGlzX2NoYXJbMy1rKytdPScwJzsKKwkJCXRoaXNfY2hhcls0XT0nXDAnOworCisJCQlpZihzdHJsZW4odGhpc19jaGFyKSA9PSA0KQorCQkJeworCQkJCUF0b0godGhpc19jaGFyLCB0ZW1wLCAyKTsKKwkJCQllZXBBZGRyID0gKnRlbXAqMjU2ICsgdGVtcFsxXTsKKwkJCQlpZiAoZWVwQWRkciA8IDB4RkZGRikKKwkJCQl7CisJCQkJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZGFwdGVyLCBlZXBBZGRyLCBlZXBWYWx1ZSk7CisJCQkJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCAiWzB4JTA0WF06MHglMDRYICAiLCBlZXBBZGRyICwgZWVwVmFsdWUpOworCQkJCX0KKwkJCQllbHNlCisJCQkJey8vSW52YWxpZCBwYXJhbWV0ZXMsIHNvIGRlZmF1bHQgcHJpbnRrIGFsbCBiYnAKKwkJCQkJZ290byBuZXh0OworCQkJCX0KKwkJCX0KKwkJfQorCQllbHNlCisJCXsgLy9Xcml0ZQorCQkJbWVtY3B5KCZ0ZW1wMiwgdmFsdWUsIHN0cmxlbih2YWx1ZSkpOworCQkJdGVtcDJbc3RybGVuKHZhbHVlKV0gPSAnXDAnOworCisJCQkvLyBTYW5pdHkgY2hlY2sKKwkJCWlmKChzdHJsZW4odGhpc19jaGFyKSA+IDQpIHx8IHN0cmxlbih0ZW1wMikgPiA4KQorCQkJCWdvdG8gbmV4dDsKKworCQkJaiA9IHN0cmxlbih0aGlzX2NoYXIpOworCQkJd2hpbGUoai0tID4gMCkKKwkJCXsKKwkJCQlpZih0aGlzX2NoYXJbal0gPiAnZicgfHwgdGhpc19jaGFyW2pdIDwgJzAnKQorCQkJCQlyZXR1cm47CisJCQl9CisJCQlqID0gc3RybGVuKHRlbXAyKTsKKwkJCXdoaWxlKGotLSA+IDApCisJCQl7CisJCQkJaWYodGVtcDJbal0gPiAnZicgfHwgdGVtcDJbal0gPCAnMCcpCisJCQkJCXJldHVybjsKKwkJCX0KKworCQkJLy9NQUMgQWRkcgorCQkJayA9IGogPSBzdHJsZW4odGhpc19jaGFyKTsKKwkJCXdoaWxlKGotLSA+IDApCisJCQl7CisJCQkJdGhpc19jaGFyWzQtaytqXSA9IHRoaXNfY2hhcltqXTsKKwkJCX0KKworCQkJd2hpbGUoayA8IDQpCisJCQkJdGhpc19jaGFyWzMtaysrXT0nMCc7CisJCQl0aGlzX2NoYXJbNF09J1wwJzsKKworCQkJLy9NQUMgdmFsdWUKKwkJCWsgPSBqID0gc3RybGVuKHRlbXAyKTsKKwkJCXdoaWxlKGotLSA+IDApCisJCQl7CisJCQkJdGVtcDJbNC1rK2pdID0gdGVtcDJbal07CisJCQl9CisKKwkJCXdoaWxlKGsgPCA0KQorCQkJCXRlbXAyWzMtaysrXT0nMCc7CisJCQl0ZW1wMls0XT0nXDAnOworCisJCQlBdG9IKHRoaXNfY2hhciwgdGVtcCwgMik7CisJCQllZXBBZGRyID0gKnRlbXAqMjU2ICsgdGVtcFsxXTsKKworCQkJQXRvSCh0ZW1wMiwgdGVtcCwgMik7CisJCQllZXBWYWx1ZSA9ICp0ZW1wKjI1NiArIHRlbXBbMV07CisKKwkJCVJUMjh4eF9FRVBST01fV1JJVEUxNihwQWRhcHRlciwgZWVwQWRkciwgZWVwVmFsdWUpOworCQkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksICJbMHglMDJYXTolMDJYICAiLCBlZXBBZGRyLCBlZXBWYWx1ZSk7CisJCX0KKwl9CituZXh0OgorCWlmKHN0cmxlbihtc2cpID09IDEpCisJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCAiPT09PkVycm9yIGNvbW1hbmQgZm9ybWF0ISIpOworCisKKwkvLyBDb3B5IHRoZSBpbmZvcm1hdGlvbiBpbnRvIHRoZSB1c2VyIGJ1ZmZlcgorCXdycS0+dS5kYXRhLmxlbmd0aCA9IHN0cmxlbihtc2cpOworCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBtc2csIHdycS0+dS5kYXRhLmxlbmd0aCk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT1SVE1QSW9jdGxFMlBST01cbiIpKTsKK30KKyNlbmRpZiAvLyBEQkcgLy8KKworCisKKworSU5UIFNldF9UR25XaWZpVGVzdF9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKQoreworICAgIGlmIChzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApID09IDApCisgICAgICAgIHBBZC0+U3RhQ2ZnLmJUR25XaWZpVGVzdCA9IEZBTFNFOworICAgIGVsc2UKKyAgICAgICAgcEFkLT5TdGFDZmcuYlRHbldpZmlUZXN0ID0gVFJVRTsKKworICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklGIFNldF9UR25XaWZpVGVzdF9Qcm9jOjooYlRHbldpZmlUZXN0PSVkKVxuIiwgcEFkLT5TdGFDZmcuYlRHbldpZmlUZXN0KSk7CisJcmV0dXJuIFRSVUU7Cit9CisKK0lOVCBTZXRfTG9uZ1JldHJ5TGltaXRfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlUWF9SVFlfQ0ZHX1NUUlVDCXR4X3J0eV9jZmc7CisJVUNIQVIJCQkJTG9uZ1JldHJ5TGltaXQgPSAoVUNIQVIpc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKworCVJUTVBfSU9fUkVBRDMyKHBBZGFwdGVyLCBUWF9SVFlfQ0ZHLCAmdHhfcnR5X2NmZy53b3JkKTsKKwl0eF9ydHlfY2ZnLmZpZWxkLkxvbmdSdHlMaW1pdCA9IExvbmdSZXRyeUxpbWl0OworCVJUTVBfSU9fV1JJVEUzMihwQWRhcHRlciwgVFhfUlRZX0NGRywgdHhfcnR5X2NmZy53b3JkKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJRiBTZXRfTG9uZ1JldHJ5TGltaXRfUHJvYzo6KHR4X3J0eV9jZmc9MHgleClcbiIsIHR4X3J0eV9jZmcud29yZCkpOworCXJldHVybiBUUlVFOworfQorCitJTlQgU2V0X1Nob3J0UmV0cnlMaW1pdF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCVRYX1JUWV9DRkdfU1RSVUMJdHhfcnR5X2NmZzsKKwlVQ0hBUgkJCQlTaG9ydFJldHJ5TGltaXQgPSAoVUNIQVIpc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKworCVJUTVBfSU9fUkVBRDMyKHBBZGFwdGVyLCBUWF9SVFlfQ0ZHLCAmdHhfcnR5X2NmZy53b3JkKTsKKwl0eF9ydHlfY2ZnLmZpZWxkLlNob3J0UnR5TGltaXQgPSBTaG9ydFJldHJ5TGltaXQ7CisJUlRNUF9JT19XUklURTMyKHBBZGFwdGVyLCBUWF9SVFlfQ0ZHLCB0eF9ydHlfY2ZnLndvcmQpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklGIFNldF9TaG9ydFJldHJ5TGltaXRfUHJvYzo6KHR4X3J0eV9jZmc9MHgleClcbiIsIHR4X3J0eV9jZmcud29yZCkpOworCXJldHVybiBUUlVFOworfQorCisjaWZkZWYgRVhUX0JVSUxEX0NIQU5ORUxfTElTVAorSU5UIFNldF9JZWVlODAyMTFkQ2xpZW50TW9kZV9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpCit7CisgICAgaWYgKHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCkgPT0gMCkKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5JRUVFODAyMTFkQ2xpZW50TW9kZSA9IFJ0ODAyXzExX0RfTm9uZTsKKyAgICBlbHNlIGlmIChzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApID09IDEpCisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuSUVFRTgwMjExZENsaWVudE1vZGUgPSBSdDgwMl8xMV9EX0ZsZXhpYmxlOworICAgIGVsc2UgaWYgKHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCkgPT0gMikKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5JRUVFODAyMTFkQ2xpZW50TW9kZSA9IFJ0ODAyXzExX0RfU3RyaWN0OworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0llZWU4MDJkTW9kZV9Qcm9jOjooSUVFRUUwMjExZE1vZGU9JWQpXG4iLCBwQWRhcHRlci0+U3RhQ2ZnLklFRUU4MDIxMWRDbGllbnRNb2RlKSk7CisgICAgcmV0dXJuIFRSVUU7Cit9CisjZW5kaWYgLy8gRVhUX0JVSUxEX0NIQU5ORUxfTElTVCAvLworCisjaWZkZWYgQ0FSUklFUl9ERVRFQ1RJT05fU1VQUE9SVAorSU5UIFNldF9DYXJyaWVyRGV0ZWN0X1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpCit7CisgICAgaWYgKHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCkgPT0gMCkKKyAgICAgICAgcEFkLT5Db21tb25DZmcuQ2FycmllckRldGVjdC5FbmFibGUgPSBGQUxTRTsKKyAgICBlbHNlCisgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLkNhcnJpZXJEZXRlY3QuRW5hYmxlID0gVFJVRTsKKworICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklGIFNldF9DYXJyaWVyRGV0ZWN0X1Byb2M6OihDYXJyaWVyRGV0ZWN0LkVuYWJsZT0lZClcbiIsIHBBZC0+Q29tbW9uQ2ZnLkNhcnJpZXJEZXRlY3QuRW5hYmxlKSk7CisJcmV0dXJuIFRSVUU7Cit9CisjZW5kaWYgLy8gQ0FSUklFUl9ERVRFQ1RJT05fU1VQUE9SVCAvLworCisKK0lOVAlTaG93X0FkaG9jX01hY1RhYmxlX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUENIQVIJCQlleHRyYSkKK3sKKwlJTlQgaTsKKworCXNwcmludGYoZXh0cmEsICJcbiIpOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJc3ByaW50ZihleHRyYSwgIiVzSFQgT3BlcmF0aW5nIE1vZGUgOiAlZFxuIiwgZXh0cmEsIHBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mby5BZGRIdEluZm8yLk9wZXJhaW9uTW9kZSk7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwlzcHJpbnRmKGV4dHJhLCAiJXNcbiUtMTlzJS00cyUtNHMlLTdzJS03cyUtN3MlLTEwcyUtNnMlLTZzJS02cyUtNnNcbiIsIGV4dHJhLAorCQkJIk1BQyIsICJBSUQiLCAiQlNTIiwgIlJTU0kwIiwgIlJTU0kxIiwgIlJTU0kyIiwgIlBoTWQiLCAiQlciLCAiTUNTIiwgIlNHSSIsICJTVEJDIik7CisKKwlmb3IgKGk9MTsgaTxNQVhfTEVOX09GX01BQ19UQUJMRTsgaSsrKQorCXsKKwkJUE1BQ19UQUJMRV9FTlRSWSBwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtpXTsKKworCQlpZiAoc3RybGVuKGV4dHJhKSA+IChJV19QUklWX1NJWkVfTUFTSyAtIDMwKSkKKwkJICAgIGJyZWFrOworCQlpZiAoKHBFbnRyeS0+VmFsaWRBc0NMSSB8fCBwRW50cnktPlZhbGlkQXNBcENsaSkgJiYgKHBFbnRyeS0+U3N0ID09IFNTVF9BU1NPQykpCisJCXsKKwkJCXNwcmludGYoZXh0cmEsICIlcyUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYICAiLCBleHRyYSwKKwkJCQlwRW50cnktPkFkZHJbMF0sIHBFbnRyeS0+QWRkclsxXSwgcEVudHJ5LT5BZGRyWzJdLAorCQkJCXBFbnRyeS0+QWRkclszXSwgcEVudHJ5LT5BZGRyWzRdLCBwRW50cnktPkFkZHJbNV0pOworCQkJc3ByaW50ZihleHRyYSwgIiVzJS00ZCIsIGV4dHJhLCAoaW50KXBFbnRyeS0+QWlkKTsKKwkJCXNwcmludGYoZXh0cmEsICIlcyUtNGQiLCBleHRyYSwgKGludClwRW50cnktPmFwaWR4KTsKKwkJCXNwcmludGYoZXh0cmEsICIlcyUtN2QiLCBleHRyYSwgcEVudHJ5LT5Sc3NpU2FtcGxlLkF2Z1Jzc2kwKTsKKwkJCXNwcmludGYoZXh0cmEsICIlcyUtN2QiLCBleHRyYSwgcEVudHJ5LT5Sc3NpU2FtcGxlLkF2Z1Jzc2kxKTsKKwkJCXNwcmludGYoZXh0cmEsICIlcyUtN2QiLCBleHRyYSwgcEVudHJ5LT5Sc3NpU2FtcGxlLkF2Z1Jzc2kyKTsKKwkJCXNwcmludGYoZXh0cmEsICIlcyUtMTBzIiwgZXh0cmEsIEdldFBoeU1vZGUocEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTU9ERSkpOworCQkJc3ByaW50ZihleHRyYSwgIiVzJS02cyIsIGV4dHJhLCBHZXRCVyhwRW50cnktPkhUUGh5TW9kZS5maWVsZC5CVykpOworCQkJc3ByaW50ZihleHRyYSwgIiVzJS02ZCIsIGV4dHJhLCBwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NQ1MpOworCQkJc3ByaW50ZihleHRyYSwgIiVzJS02ZCIsIGV4dHJhLCBwRW50cnktPkhUUGh5TW9kZS5maWVsZC5TaG9ydEdJKTsKKwkJCXNwcmludGYoZXh0cmEsICIlcyUtNmQiLCBleHRyYSwgcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuU1RCQyk7CisJCQlzcHJpbnRmKGV4dHJhLCAiJXMlLTEwZCwgJWQsICVkJSVcbiIsIGV4dHJhLCBwRW50cnktPkRlYnVnRklGT0NvdW50LCBwRW50cnktPkRlYnVnVHhDb3VudCwKKwkJCQkJCShwRW50cnktPkRlYnVnVHhDb3VudCkgPyAoKHBFbnRyeS0+RGVidWdUeENvdW50LXBFbnRyeS0+RGVidWdGSUZPQ291bnQpKjEwMC9wRW50cnktPkRlYnVnVHhDb3VudCkgOiAwKTsKKwkJCXNwcmludGYoZXh0cmEsICIlc1xuIiwgZXh0cmEpOworCQl9CisJfQorCisJcmV0dXJuIFRSVUU7Cit9CisKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC93cGEuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvd3BhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDEzNGFlNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvd3BhLmgKQEAgLTAsMCArMSwzNTcgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJTW9kdWxlIE5hbWU6CisJd3BhLmgKKworCUFic3RyYWN0OgorCisJUmV2aXNpb24gSGlzdG9yeToKKwlXaG8JCQlXaGVuCQkJV2hhdAorCS0tLS0tLS0tCS0tLS0tLS0tLS0JCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlOYW1lCQlEYXRlCQkJTW9kaWZpY2F0aW9uIGxvZ3MKKyovCisKKyNpZm5kZWYJX19XUEFfSF9fCisjZGVmaW5lCV9fV1BBX0hfXworCisvLyBFQVBPTCBLZXkgZGVzY3JpcHRlciBmcmFtZSBmb3JtYXQgcmVsYXRlZCBsZW5ndGgKKyNkZWZpbmUgTEVOX0tFWV9ERVNDX05PTkNFCQkJMzIKKyNkZWZpbmUgTEVOX0tFWV9ERVNDX0lWCQkJCTE2CisjZGVmaW5lIExFTl9LRVlfREVTQ19SU0MJCQk4CisjZGVmaW5lIExFTl9LRVlfREVTQ19JRAkJCQk4CisjZGVmaW5lIExFTl9LRVlfREVTQ19SRVBMQVkJCQk4CisjZGVmaW5lIExFTl9LRVlfREVTQ19NSUMJCQkxNgorCisvLyBUaGUgbGVuZ3RoIGlzIHRoZSBFQVBvTC1LZXkgZnJhbWUgZXhjZXB0IGtleSBkYXRhIGZpZWxkLgorLy8gUGxlYXNlIHJlZmVyIHRvIDgwMi4xMWktMjAwNCAsRmlndXJlIDQzdSBpbiBwLjc4CisjZGVmaW5lIExFTl9FQVBPTF9LRVlfTVNHCQkJKHNpemVvZihLRVlfREVTQ1JJUFRFUikgLSBNQVhfTEVOX09GX1JTTklFKQorCisvLyBFQVAgQ29kZSBUeXBlLgorI2RlZmluZSBFQVBfQ09ERV9SRVFVRVNUCTEKKyNkZWZpbmUgRUFQX0NPREVfUkVTUE9OU0UJMgorI2RlZmluZSBFQVBfQ09ERV9TVUNDRVNTICAgIDMKKyNkZWZpbmUgRUFQX0NPREVfRkFJTFVSRSAgICA0CisKKy8vIEVBUE9MIGZyYW1lIFByb3RvY29sIFZlcnNpb24KKyNkZWZpbmUJRUFQT0xfVkVSCQkJCQkxCisjZGVmaW5lCUVBUE9MX1ZFUjIJCQkJCTIKKworLy8gRUFQT0wtS0VZIERlc2NyaXB0b3IgVHlwZQorI2RlZmluZQlXUEExX0tFWV9ERVNDCQkJCTB4ZmUKKyNkZWZpbmUgV1BBMl9LRVlfREVTQyAgICAgICAgICAgICAgIDB4MDIKKworLy8gS2V5IERlc2NyaXB0b3IgVmVyc2lvbiBvZiBLZXkgSW5mb3JtYXRpb24KKyNkZWZpbmUJREVTQ19UWVBFX1RLSVAJCQkJMQorI2RlZmluZQlERVNDX1RZUEVfQUVTCQkJCTIKKyNkZWZpbmUgREVTQ19UWVBFX01FU0gJCQkJMworCisjZGVmaW5lIExFTl9NU0cxXzJXQVkgICAgICAgICAgICAgICAweDdmCisjZGVmaW5lIE1BWF9MRU5fT0ZfRUFQX0hTICAgICAgICAgICAyNTYKKworI2RlZmluZSBMRU5fTUFTVEVSX0tFWQkJCQkzMgorCisvLyBFQVBPTCBFSywgTUsKKyNkZWZpbmUgTEVOX0VBUF9FSwkJCQkJMTYKKyNkZWZpbmUgTEVOX0VBUF9NSUNLCQkJCTE2CisjZGVmaW5lIExFTl9FQVBfS0VZCQkJCQkoKExFTl9FQVBfRUspKyhMRU5fRUFQX01JQ0spKQorLy8gVEtJUCBrZXkgcmVsYXRlZAorI2RlZmluZSBMRU5fUE1LSUQJCQkJCTE2CisjZGVmaW5lIExFTl9US0lQX0VLCQkJCQkxNgorI2RlZmluZSBMRU5fVEtJUF9SWE1JQ0sJCQkJOAorI2RlZmluZSBMRU5fVEtJUF9UWE1JQ0sJCQkJOAorI2RlZmluZSBMRU5fQUVTX0VLCQkJCQkxNgorI2RlZmluZSBMRU5fQUVTX0tFWQkJCQkJTEVOX0FFU19FSworI2RlZmluZSBMRU5fVEtJUF9LRVkJCQkJKChMRU5fVEtJUF9FSykrKExFTl9US0lQX1JYTUlDSykrKExFTl9US0lQX1RYTUlDSykpCisjZGVmaW5lIFRLSVBfQVBfVFhNSUNLX09GRlNFVAkJKChMRU5fRUFQX0tFWSkrKExFTl9US0lQX0VLKSkKKyNkZWZpbmUgVEtJUF9BUF9SWE1JQ0tfT0ZGU0VUCQkoVEtJUF9BUF9UWE1JQ0tfT0ZGU0VUK0xFTl9US0lQX1RYTUlDSykKKyNkZWZpbmUgVEtJUF9HVEtfTEVOR1RICQkJCSgoTEVOX1RLSVBfRUspKyhMRU5fVEtJUF9SWE1JQ0spKyhMRU5fVEtJUF9UWE1JQ0spKQorI2RlZmluZSBMRU5fUFRLCQkJCQkJKChMRU5fRUFQX0tFWSkrKExFTl9US0lQX0tFWSkpCisjZGVmaW5lIE1JTl9MRU5fT0ZfR1RLCQkJCTUKKworLy8gUlNOIElFIExlbmd0aCBkZWZpbml0aW9uCisjZGVmaW5lIE1BWF9MRU5fT0ZfUlNOSUUgICAgICAgICAJOTAKKyNkZWZpbmUgTUlOX0xFTl9PRl9SU05JRSAgICAgICAgIAk4CisKKy8vRUFQIFBhY2tldCBUeXBlCisjZGVmaW5lCUVBUFBhY2tldAkJMAorI2RlZmluZQlFQVBPTFN0YXJ0CQkxCisjZGVmaW5lCUVBUE9MTG9nb2ZmCQkyCisjZGVmaW5lCUVBUE9MS2V5CQkzCisjZGVmaW5lCUVBUE9MQVNGQWxlcnQJNAorI2RlZmluZQlFQVBUdHlwZU1heAkJNQorCisjZGVmaW5lCUVBUE9MX01TR19JTlZBTElECTAKKyNkZWZpbmUJRUFQT0xfUEFJUl9NU0dfMQkxCisjZGVmaW5lCUVBUE9MX1BBSVJfTVNHXzIJMgorI2RlZmluZQlFQVBPTF9QQUlSX01TR18zCTMKKyNkZWZpbmUJRUFQT0xfUEFJUl9NU0dfNAk0CisjZGVmaW5lCUVBUE9MX0dST1VQX01TR18xCTUKKyNkZWZpbmUJRUFQT0xfR1JPVVBfTVNHXzIJNgorCisjZGVmaW5lIFBBSVJXSVNFS0VZCQkJCQkxCisjZGVmaW5lIEdST1VQS0VZCQkJCQkwCisKKy8vIFJldHJ5IHRpbWVyIGNvdW50ZXIgaW5pdGlhbCB2YWx1ZQorI2RlZmluZSBQRUVSX01TRzFfUkVUUllfVElNRVJfQ1RSICAgICAgICAgICAwCisjZGVmaW5lIFBFRVJfTVNHM19SRVRSWV9USU1FUl9DVFIgICAgICAgICAgIDEwCisjZGVmaW5lIEdST1VQX01TRzFfUkVUUllfVElNRVJfQ1RSICAgICAgICAgIDIwCisKKworI2RlZmluZSBFQVBPTF9TVEFSVF9ESVNBQkxFCQkJCQkwCisjZGVmaW5lIEVBUE9MX1NUQVJUX1BTSwkJCQkJCTEKKyNkZWZpbmUgRUFQT0xfU1RBUlRfMVgJCQkJCQkyCisKKyNkZWZpbmUgTUlYX0NJUEhFUl9XUEFfVEtJUF9PTih4KSAgICAgICAoKCh4KSAmIDB4MDgpICE9IDApCisjZGVmaW5lIE1JWF9DSVBIRVJfV1BBX0FFU19PTih4KSAgICAgICAgKCgoeCkgJiAweDA0KSAhPSAwKQorI2RlZmluZSBNSVhfQ0lQSEVSX1dQQTJfVEtJUF9PTih4KSAgICAgICgoKHgpICYgMHgwMikgIT0gMCkKKyNkZWZpbmUgTUlYX0NJUEhFUl9XUEEyX0FFU19PTih4KSAgICAgICAoKCh4KSAmIDB4MDEpICE9IDApCisKKyNkZWZpbmUgUk9VTkRfVVAoX194LCBfX3kpIFwKKwkoKChVTE9ORykoKF9feCkrKChfX3kpLTEpKSkgJiAoKFVMT05HKX4oKF9feSktMSkpKQorCisjZGVmaW5lCUFERF9PTkVfVG9fNjRCSVRfVkFSKF9WKQkJXAorewkJCQkJCQkJCQlcCisJVUNIQVIJY250ID0gTEVOX0tFWV9ERVNDX1JFUExBWTsJXAorCWRvCQkJCQkJCQkJXAorCXsJCQkJCQkJCQlcCisJCWNudC0tOwkJCQkJCQlcCisJCV9WW2NudF0rKzsJCQkJCQlcCisJCWlmIChjbnQgPT0gMCkJCQkJCVwKKwkJCWJyZWFrOwkJCQkJCVwKKwl9d2hpbGUgKF9WW2NudF0gPT0gMCk7CQkJCVwKK30KKworI2RlZmluZSBJU19XUEFfQ0FQQUJJTElUWShhKSAgICAgICAoKChhKSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpICYmICgoYSkgPD0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMVBTS1dQQTJQU0spKQorCisvLyBFQVBPTCBLZXkgSW5mb3JtYXRpb24gZGVmaW5pdGlvbiB3aXRoaW4gS2V5IGRlc2NyaXB0b3IgZm9ybWF0Cit0eXBlZGVmCXN0cnVjdCBQQUNLRUQgX0tFWV9JTkZPCit7CisjaWZkZWYgUlRfQklHX0VORElBTgorCVVDSEFSCUtleUFjazoxOworICAgIFVDSEFSCUluc3RhbGw6MTsKKyAgICBVQ0hBUglLZXlJbmRleDoyOworICAgIFVDSEFSCUtleVR5cGU6MTsKKyAgICBVQ0hBUglLZXlEZXNjVmVyOjM7CisgICAgVUNIQVIJUnN2ZDozOworICAgIFVDSEFSCUVLRF9ETDoxOwkJLy8gRUtEIGZvciBBUDsgREwgZm9yIFNUQQorICAgIFVDSEFSCVJlcXVlc3Q6MTsKKyAgICBVQ0hBUglFcnJvcjoxOworICAgIFVDSEFSCVNlY3VyZToxOworICAgIFVDSEFSCUtleU1pYzoxOworI2Vsc2UKKwlVQ0hBUglLZXlNaWM6MTsKKwlVQ0hBUglTZWN1cmU6MTsKKwlVQ0hBUglFcnJvcjoxOworCVVDSEFSCVJlcXVlc3Q6MTsKKwlVQ0hBUglFS0RfREw6MTsgICAgICAgLy8gRUtEIGZvciBBUDsgREwgZm9yIFNUQQorCVVDSEFSCVJzdmQ6MzsKKwlVQ0hBUglLZXlEZXNjVmVyOjM7CisJVUNIQVIJS2V5VHlwZToxOworCVVDSEFSCUtleUluZGV4OjI7CisJVUNIQVIJSW5zdGFsbDoxOworCVVDSEFSCUtleUFjazoxOworI2VuZGlmCit9CUtFWV9JTkZPLCAqUEtFWV9JTkZPOworCisvLyBFQVBPTCBLZXkgZGVzY3JpcHRvciBmb3JtYXQKK3R5cGVkZWYJc3RydWN0IFBBQ0tFRCBfS0VZX0RFU0NSSVBURVIKK3sKKwlVQ0hBUgkJVHlwZTsKKwlLRVlfSU5GTwlLZXlJbmZvOworCVVDSEFSCQlLZXlMZW5ndGhbMl07CisJVUNIQVIJCVJlcGxheUNvdW50ZXJbTEVOX0tFWV9ERVNDX1JFUExBWV07CisJVUNIQVIJCUtleU5vbmNlW0xFTl9LRVlfREVTQ19OT05DRV07CisJVUNIQVIJCUtleUl2W0xFTl9LRVlfREVTQ19JVl07CisJVUNIQVIJCUtleVJzY1tMRU5fS0VZX0RFU0NfUlNDXTsKKwlVQ0hBUgkJS2V5SWRbTEVOX0tFWV9ERVNDX0lEXTsKKwlVQ0hBUgkJS2V5TWljW0xFTl9LRVlfREVTQ19NSUNdOworCVVDSEFSCQlLZXlEYXRhTGVuWzJdOworCVVDSEFSCQlLZXlEYXRhW01BWF9MRU5fT0ZfUlNOSUVdOworfQlLRVlfREVTQ1JJUFRFUiwgKlBLRVlfREVTQ1JJUFRFUjsKKwordHlwZWRlZglzdHJ1Y3QgUEFDS0VEIF9FQVBPTF9QQUNLRVQKK3sKKwlVQ0hBUgkgCQkJUHJvVmVyOworCVVDSEFSCSAJCQlQcm9UeXBlOworCVVDSEFSCSAJCQlCb2R5X0xlblsyXTsKKwlLRVlfREVTQ1JJUFRFUgkJS2V5RGVzYzsKK30JRUFQT0xfUEFDS0VULCAqUEVBUE9MX1BBQ0tFVDsKKworLy84MDIuMTFpIEQxMCBwYWdlIDgzCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX0dUS19FTkNBUAoreworI2lmbmRlZiBSVF9CSUdfRU5ESUFOCisgICAgVUNIQVIgICAgICAgICAgICAgICBLaWQ6MjsKKyAgICBVQ0hBUiAgICAgICAgICAgICAgIHR4OjE7CisgICAgVUNIQVIgICAgICAgICAgICAgICByc3Y6NTsKKyAgICBVQ0hBUiAgICAgICAgICAgICAgIHJzdjE7CisjZWxzZQorICAgIFVDSEFSICAgICAgICAgICAgICAgcnN2OjU7CisgICAgVUNIQVIgICAgICAgICAgICAgICB0eDoxOworICAgIFVDSEFSICAgICAgICAgICAgICAgS2lkOjI7CisgICAgVUNIQVIgICAgICAgICAgICAgICByc3YxOworI2VuZGlmCisgICAgVUNIQVIgICAgICAgICAgICAgICBHVEtbVEtJUF9HVEtfTEVOR1RIXTsKK30gICBHVEtfRU5DQVAsICpQR1RLX0VOQ0FQOworCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX0tERV9FTkNBUAoreworICAgIFVDSEFSICAgICAgICAgICAgICAgVHlwZTsKKyAgICBVQ0hBUiAgICAgICAgICAgICAgIExlbjsKKyAgICBVQ0hBUiAgICAgICAgICAgICAgIE9VSVszXTsKKyAgICBVQ0hBUiAgICAgICAgICAgICAgIERhdGFUeXBlOworICAgIEdUS19FTkNBUCAgICAgIEdUS0VuY2FwOworfSAgIEtERV9FTkNBUCwgKlBLREVfRU5DQVA7CisKKy8vIEZvciBXUEExCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX1JTTklFIHsKKyAgICBVQ0hBUiAgIG91aVs0XTsKKyAgICBVU0hPUlQgIHZlcnNpb247CisgICAgVUNIQVIgICBtY2FzdFs0XTsKKyAgICBVU0hPUlQgIHVjb3VudDsKKyAgICBzdHJ1Y3QgUEFDS0VEIHsKKyAgICAgICAgVUNIQVIgb3VpWzRdOworICAgIH11Y2FzdFsxXTsKK30gUlNOSUUsICpQUlNOSUU7CisKKy8vIEZvciBXUEEyCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX1JTTklFMiB7CisgICAgVVNIT1JUICB2ZXJzaW9uOworICAgIFVDSEFSICAgbWNhc3RbNF07CisgICAgVVNIT1JUICB1Y291bnQ7CisgICAgc3RydWN0IFBBQ0tFRCB7CisgICAgICAgIFVDSEFSIG91aVs0XTsKKyAgICB9dWNhc3RbMV07Cit9IFJTTklFMiwgKlBSU05JRTI7CisKKy8vIEFLTSBTdWl0ZQordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9SU05JRV9BVVRIIHsKKyAgICBVU0hPUlQgYWNvdW50OworICAgIHN0cnVjdCBQQUNLRUQgeworICAgICAgICBVQ0hBUiBvdWlbNF07CisgICAgfWF1dGhbMV07Cit9IFJTTklFX0FVVEgsKlBSU05JRV9BVVRIOworCit0eXBlZGVmCXVuaW9uIFBBQ0tFRCBfUlNOX0NBUEFCSUxJVElFUwl7CisJc3RydWN0CVBBQ0tFRCB7CisjaWZkZWYgUlRfQklHX0VORElBTgorICAgICAgICBVU0hPUlQJCVJzdmQ6MTA7CisgICAgICAgIFVTSE9SVAkJR1RLU0FfUl9Db3VudGVyOjI7CisgICAgICAgIFVTSE9SVAkJUFRLU0FfUl9Db3VudGVyOjI7CisgICAgICAgIFVTSE9SVAkJTm9fUGFpcndpc2U6MTsKKwkJVVNIT1JUCQlQcmVBdXRoOjE7CisjZWxzZQorICAgICAgICBVU0hPUlQJCVByZUF1dGg6MTsKKwkJVVNIT1JUCQlOb19QYWlyd2lzZToxOworCQlVU0hPUlQJCVBUS1NBX1JfQ291bnRlcjoyOworCQlVU0hPUlQJCUdUS1NBX1JfQ291bnRlcjoyOworCQlVU0hPUlQJCVJzdmQ6MTA7CisjZW5kaWYKKwl9CWZpZWxkOworCVVTSE9SVAkJCXdvcmQ7Cit9CVJTTl9DQVBBQklMSVRJRVMsICpQUlNOX0NBUEFCSUxJVElFUzsKKwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9FQVBfSERSIHsKKyAgICBVQ0hBUiAgIFByb1ZlcjsKKyAgICBVQ0hBUiAgIFByb1R5cGU7CisgICAgVUNIQVIgICBCb2R5X0xlblsyXTsKKyAgICBVQ0hBUiAgIGNvZGU7CisgICAgVUNIQVIgICBpZGVudGlmaWVyOworICAgIFVDSEFSICAgbGVuZ3RoWzJdOyAvLyBpbmNsdWRpbmcgY29kZSBhbmQgaWRlbnRpZmllciwgZm9sbG93ZWQgYnkgbGVuZ3RoLTIgb2N0ZXRzIG9mIGRhdGEKK30gRUFQX0hEUiwgKlBFQVBfSERSOworCisvLyBGb3Igc3VwcGxpY2FudCBzdGF0ZSBtYWNoaW5lIHN0YXRlcy4gODAyLjExaSBEcmFmdCA0LjEsIHAuIDk3CisvLyBXZSBzaW1wbGlmaWVkIGl0Cit0eXBlZGVmCWVudW0JX1dwYVN0YXRlCit7CisJU1NfTk9UVVNFLAkJCQkvLyAwCisJU1NfU1RBUlQsCQkJCS8vIDEKKwlTU19XQUlUX01TR18zLAkJCS8vIDIKKwlTU19XQUlUX0dST1VQLAkJCS8vIDMKKwlTU19GSU5JU0gsICAJCQkvLyA0CisJU1NfS0VZVVBEQVRFLAkJCS8vIDUKK30JV1BBX1NUQVRFOworCisvLworLy8JVGhlIGRlZmluaXRpb24gb2YgdGhlIGNpcGhlciBjb21iaW5hdGlvbgorLy8KKy8vIAkgYml0MwliaXQyICBiaXQxICAgYml0MAorLy8JKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rCisvLyAJfAkgIFdQQQkgfAkgICBXUEEyICAgfAorLy8JKy0tLS0tLSstLS0tLSstLS0tLS0rLS0tLS0rCisvLwl8IFRLSVAgfCBBRVMgfCBUS0lQIHwgQUVTIHwKKy8vCXwJMCAgfCAgMSAgfCAgIDEgIHwgIDAgIHwgLT4gMHgwNgorLy8JfAkwICB8ICAxICB8ICAgMSAgfCAgMSAgfCAtPiAweDA3CisvLwl8CTEgIHwgIDAgIHwgICAwICB8ICAxICB8IC0+IDB4MDkKKy8vCXwJMSAgfCAgMCAgfCAgIDEgIHwgIDEgIHwgLT4gMHgwQgorLy8JfAkxICB8ICAxICB8ICAgMCAgfCAgMSAgfCAtPiAweDBECisvLwl8CTEgIHwgIDEgIHwgICAxICB8ICAwICB8IC0+IDB4MEUKKy8vCXwJMSAgfCAgMSAgfCAgIDEgIHwgIDEgIHwJLT4gMHgwRgorLy8JKy0tLS0tLSstLS0tLSstLS0tLS0rLS0tLS0rCisvLwordHlwZWRlZgllbnVtCV9XcGFNaXhQYWlyQ2lwaGVyCit7CisJTUlYX0NJUEhFUl9OT1RVU0UgCQkJPSAweDAwLAorCVdQQV9OT05FX1dQQTJfVEtJUEFFUwkJPSAweDAzLAkJLy8gV1BBMi1US0lQQUVTCisJV1BBX0FFU19XUEEyX1RLSVAgCQkJPSAweDA2LAorCVdQQV9BRVNfV1BBMl9US0lQQUVTCQk9IDB4MDcsCisJV1BBX1RLSVBfV1BBMl9BRVMJCQk9IDB4MDksCisJV1BBX1RLSVBfV1BBMl9US0lQQUVTCQk9IDB4MEIsCisJV1BBX1RLSVBBRVNfV1BBMl9OT05FCQk9IDB4MEMsCQkvLyBXUEEtVEtJUEFFUworCVdQQV9US0lQQUVTX1dQQTJfQUVTCQk9IDB4MEQsCisJV1BBX1RLSVBBRVNfV1BBMl9US0lQCQk9IDB4MEUsCisJV1BBX1RLSVBBRVNfV1BBMl9US0lQQUVTCT0gMHgwRiwKK30JV1BBX01JWF9QQUlSX0NJUEhFUjsKKwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9SU05fSUVfSEVBREVSX1NUUlVDVAl7CisJVUNIQVIJCUVpZDsKKwlVQ0hBUgkJTGVuZ3RoOworCVVTSE9SVAkJVmVyc2lvbjsJLy8gTGl0dGxlIGVuZGlhbiBmb3JtYXQKK30JUlNOX0lFX0hFQURFUl9TVFJVQ1QsICpQUlNOX0lFX0hFQURFUl9TVFJVQ1Q7CisKKy8vIENpcGhlciBzdWl0ZSBzZWxlY3RvciB0eXBlcwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9DSVBIRVJfU1VJVEVfU1RSVUNUCXsKKwlVQ0hBUgkJT3VpWzNdOworCVVDSEFSCQlUeXBlOworfQlDSVBIRVJfU1VJVEVfU1RSVUNULCAqUENJUEhFUl9TVUlURV9TVFJVQ1Q7CisKKy8vIEF1dGhlbnRpY2F0aW9uIGFuZCBLZXkgTWFuYWdlbWVudCBzdWl0ZSBzZWxlY3RvcgordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9BS01fU1VJVEVfU1RSVUNUCXsKKwlVQ0hBUgkJT3VpWzNdOworCVVDSEFSCQlUeXBlOworfQlBS01fU1VJVEVfU1RSVUNULCAqUEFLTV9TVUlURV9TVFJVQ1Q7CisKKy8vIFJTTiBjYXBhYmlsaXR5Cit0eXBlZGVmIHN0cnVjdAlQQUNLRUQgX1JTTl9DQVBBQklMSVRZCXsKKwlVU0hPUlQJCVJzdjoxMDsKKwlVU0hPUlQJCUdUS1NBUmVwbGF5Q250OjI7CisJVVNIT1JUCQlQVEtTQVJlcGxheUNudDoyOworCVVTSE9SVAkJTm9QYWlyd2lzZToxOworCVVTSE9SVAkJUHJlQXV0aDoxOworfQlSU05fQ0FQQUJJTElUWSwgKlBSU05fQ0FQQUJJTElUWTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzljMjI1YQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvS2NvbmZpZwpAQCAtMCwwICsxLDUgQEAKK2NvbmZpZyBSVEw4MTg3U0UKKwl0cmlzdGF0ZSAiUmVhbFRlayBSVEw4MTg3U0UgV2lyZWxlc3MgTEFOIE5JQyBkcml2ZXIiCisJZGVwZW5kcyBvbiBQQ0kKKwlkZWZhdWx0IE4KKwktLS1oZWxwLS0tCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL01ha2VmaWxlIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YmM3ZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9NYWtlZmlsZQpAQCAtMCwwICsxLDU1IEBACisKKyNFWFRSQV9DRkxBR1MgKz0gLURDT05GSUdfSUVFRTgwMjExX05PV0VQPXkKKyNFWFRSQV9DRkxBR1MgKz0gLURDT05GSUdfUlRMODE4MF9JT01BUAorI0VYVFJBX0NGTEFHUyArPSAtc3RkPWdudTg5CisjRVhUUkFfQ0ZMQUdTICs9IC1PMgorI0NDICAgICAgICAgICAgPSBnY2MKK0VYVFJBX0NGTEFHUyArPSAtRFRIT01BU19UVVJCTworI0NGTEFHUyArPSAtRENPTkZJR19SVEw4MTg1QgorI0NGTEFHUyArPSAtRENPTkZJR19SVEw4MTh4X1MKKworI2FkZGVkIGZvciBFZWVQQyB0ZXN0aW5nCitFWFRSQV9DRkxBR1MgKz0gLURFTkFCTEVfSVBTCitFWFRSQV9DRkxBR1MgKz0gLURTV19BTlRFCitFWFRSQV9DRkxBR1MgKz0gLURUWF9UUkFDSworRVhUUkFfQ0ZMQUdTICs9IC1ESElHSF9QT1dFUgorRVhUUkFfQ0ZMQUdTICs9IC1EU1dfRElHCitFWFRSQV9DRkxBR1MgKz0gLURSQVRFX0FEQVBUCitFWFRSQV9DRkxBR1MgKz0gLURDT05GSUdfUlRMODE4MF9QTQorCisjK1lKLDA4MDYyNgorRVhUUkFfQ0ZMQUdTICs9IC1ERU5BQkxFX0RPVDExRAorCisjZW5hYmxlIGl0IGZvciBsZWdhY3kgcG93ZXIgc2F2ZSwgZGlzYWJsZSBpdCBmb3IgbGVpc3VyZSAgcG93ZXIgc2F2ZQorRVhUUkFfQ0ZMQUdTICs9IC1ERU5BQkxFX0xQUworCisKKyNFWFRSQV9DRkxBR1MgKz0gLW1oYXJkLWZsb2F0IC1EQ09ORklHX0ZPUkNFX0hBUkRfRkxPQVQ9eQorCitydGw4MTg3c2Utb2JqcyA6PQkJCVwKKwkJcjgxODBfY29yZS5vCQlcCisJCXI4MTgwX3NhMjQwMC5vCQlcCisJCXI4MTgwXzkzY3g2Lm8JCVwKKwkJcjgxODBfd3gubwkJXAorCQlyODE4MF9tYXgyODIwLm8JCVwKKwkJcjgxODBfZ2N0Lm8JCVwKKwkJcjgxODBfcnRsODIyNS5vCQlcCisJCXI4MTgwX3J0bDgyNTUubwkJXAorCQlyODE4MF9ydGw4MjI1ejIubwlcCisJCXI4MTg1Yl9pbml0Lm8JCVwKKwkJcjgxODBfZG0ubwkJXAorCQlyODE4MF9wbS5vCQlcCisJCWllZWU4MDIxMS9kb3QxMWQubwkJCVwKKwkJaWVlZTgwMjExL2llZWU4MDIxMV9zb2Z0bWFjLm8JCVwKKwkJaWVlZTgwMjExL2llZWU4MDIxMV9yeC5vCQlcCisJCWllZWU4MDIxMS9pZWVlODAyMTFfdHgubwkJXAorCQlpZWVlODAyMTEvaWVlZTgwMjExX3d4Lm8JCVwKKwkJaWVlZTgwMjExL2llZWU4MDIxMV9tb2R1bGUubwkJXAorCQlpZWVlODAyMTEvaWVlZTgwMjExX3NvZnRtYWNfd3gubwlcCisJCWllZWU4MDIxMS9pZWVlODAyMTFfY3J5cHQubwkJXAorCQlpZWVlODAyMTEvaWVlZTgwMjExX2NyeXB0X3RraXAubwlcCisJCWllZWU4MDIxMS9pZWVlODAyMTFfY3J5cHRfY2NtcC5vCVwKKwkJaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdF93ZXAubworCitvYmotJChDT05GSUdfUlRMODE4N1NFKQkrPSBydGw4MTg3c2UubworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2RvdDExZC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9kb3QxMWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OWY1M2ZlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9kb3QxMWQuaApAQCAtMCwwICsxLDEwMSBAQAorI2lmbmRlZiBfX0lOQ19ET1QxMURfSA0KKyNkZWZpbmUgX19JTkNfRE9UMTFEX0gNCisNCisjaW5jbHVkZSAiaWVlZTgwMjExLmgiDQorDQorLy8jZGVmaW5lIEVOQUJMRV9ET1QxMUQNCisNCisvLyNkZWZpbmUgRE9UMTFEX01BWF9DSE5MX05VTSA4Mw0KKw0KK3R5cGVkZWYgc3RydWN0IF9DSE5MX1RYUE9XRVJfVFJJUExFIHsNCisJdTggRmlyc3RDaG5sOw0KKwl1OCAgTnVtQ2hubHM7DQorCXU4ICBNYXhUeFBvd2VySW5EYm07DQorfUNITkxfVFhQT1dFUl9UUklQTEUsICpQQ0hOTF9UWFBPV0VSX1RSSVBMRTsNCisNCit0eXBlZGVmIGVudW0gX0RPVDExRF9TVEFURSB7DQorCURPVDExRF9TVEFURV9OT05FID0gMCwNCisJRE9UMTFEX1NUQVRFX0xFQVJORUQsDQorCURPVDExRF9TVEFURV9ET05FLA0KK31ET1QxMURfU1RBVEU7DQorDQordHlwZWRlZiBzdHJ1Y3QgX1JUX0RPVDExRF9JTkZPIHsNCisJLy9ERUNMQVJFX1JUX09CSkVDVChSVF9ET1QxMURfSU5GTyk7DQorDQorCWJvb2wgYkVuYWJsZWQ7IC8vIGRvdDExTXVsdGlEb21haW5DYXBhYmlsaXR5RW5hYmxlZA0KKw0KKwl1MTYgQ291bnRyeUllTGVuOyAvLyA+IDAgaWYgQ291bnRyeUllQnVmW10gY29udGFpbnMgdmFsaWQgY291bnRyeSBpbmZvcm1hdGlvbiBlbGVtZW50Lg0KKwl1OCAgQ291bnRyeUllQnVmW01BWF9JRV9MRU5dOw0KKwl1OCAgQ291bnRyeUllU3JjQWRkcls2XTsgLy8gU291cmNlIEFQIG9mIHRoZSBjb3VudHJ5IElFLg0KKwl1OCAgQ291bnRyeUllV2F0Y2hkb2c7IA0KKw0KKwl1OCAgY2hhbm5lbF9tYXBbTUFYX0NIQU5ORUxfTlVNQkVSKzFdOyAgLy8hISFWYWx1ZSAwOiBJbnZhbGlkLCAxOiBWYWxpZCAoYWN0aXZlIHNjYW4pLCAyOiBWYWxpZCAocGFzc2l2ZSBzY2FuKQ0KKwkvL3U4ICBDaG5sTGlzdExlbjsgLy8gI0J5dGVzIHZhbGlkIGluIENobmxMaXN0W10uDQorCS8vdTggIENobmxMaXN0W0RPVDExRF9NQVhfQ0hOTF9OVU1dOw0KKwl1OCAgTWF4VHhQd3JEYm1MaXN0W01BWF9DSEFOTkVMX05VTUJFUisxXTsNCisNCisJRE9UMTFEX1NUQVRFIFN0YXRlOw0KK31SVF9ET1QxMURfSU5GTywgKlBSVF9ET1QxMURfSU5GTzsNCisjZGVmaW5lIGVxTWFjQWRkcihhLGIpCQkoICgoYSlbMF09PShiKVswXSAmJiAoYSlbMV09PShiKVsxXSAmJiAoYSlbMl09PShiKVsyXSAmJiAoYSlbM109PShiKVszXSAmJiAoYSlbNF09PShiKVs0XSAmJiAoYSlbNV09PShiKVs1XSkgPyAxOjAgKQ0KKyNkZWZpbmUgY3BNYWNBZGRyKGRlcyxzcmMpCSAgICAgICgoZGVzKVswXT0oc3JjKVswXSwoZGVzKVsxXT0oc3JjKVsxXSwoZGVzKVsyXT0oc3JjKVsyXSwoZGVzKVszXT0oc3JjKVszXSwoZGVzKVs0XT0oc3JjKVs0XSwoZGVzKVs1XT0oc3JjKVs1XSkNCisjZGVmaW5lIEdFVF9ET1QxMURfSU5GTyhfX3BJZWVlRGV2KSAoKFBSVF9ET1QxMURfSU5GTykoKF9fcEllZWVEZXYpLT5wRG90MTFkSW5mbykpDQorDQorI2RlZmluZSBJU19ET1QxMURfRU5BQkxFKF9fcEllZWVEZXYpIEdFVF9ET1QxMURfSU5GTyhfX3BJZWVlRGV2KS0+YkVuYWJsZWQNCisjZGVmaW5lIElTX0NPVU5UUllfSUVfVkFMSUQoX19wSWVlZURldikgKEdFVF9ET1QxMURfSU5GTyhfX3BJZWVlRGV2KS0+Q291bnRyeUllTGVuID4gMCkNCisNCisjZGVmaW5lIElTX0VRVUFMX0NJRV9TUkMoX19wSWVlZURldiwgX19wVGEpIGVxTWFjQWRkcihHRVRfRE9UMTFEX0lORk8oX19wSWVlZURldiktPkNvdW50cnlJZVNyY0FkZHIsIF9fcFRhKSANCisjZGVmaW5lIFVQREFURV9DSUVfU1JDKF9fcEllZWVEZXYsIF9fcFRhKSBjcE1hY0FkZHIoR0VUX0RPVDExRF9JTkZPKF9fcEllZWVEZXYpLT5Db3VudHJ5SWVTcmNBZGRyLCBfX3BUYSkNCisNCisjZGVmaW5lIElTX0NPVU5UUllfSUVfQ0hBTkdFRChfX3BJZWVlRGV2LCBfX0llKSBcDQorCSgoKF9fSWUpLkxlbmd0aCA9PSAwIHx8IChfX0llKS5MZW5ndGggIT0gR0VUX0RPVDExRF9JTkZPKF9fcEllZWVEZXYpLT5Db3VudHJ5SWVMZW4pID8gXA0KKwlGQUxTRSA6IFwNCisJKCFtZW1jbXAoR0VUX0RPVDExRF9JTkZPKF9fcEllZWVEZXYpLT5Db3VudHJ5SWVCdWYsIChfX0llKS5PY3RldCwgKF9fSWUpLkxlbmd0aCkpKQ0KKw0KKyNkZWZpbmUgQ0lFX1dBVENIRE9HX1RIIDENCisjZGVmaW5lIEdFVF9DSUVfV0FUQ0hET0coX19wSWVlZURldikgR0VUX0RPVDExRF9JTkZPKF9fcEllZWVEZXYpLT5Db3VudHJ5SWVXYXRjaGRvZw0KKyNkZWZpbmUgUkVTRVRfQ0lFX1dBVENIRE9HKF9fcEllZWVEZXYpIEdFVF9DSUVfV0FUQ0hET0coX19wSWVlZURldikgPSAwIA0KKyNkZWZpbmUgVVBEQVRFX0NJRV9XQVRDSERPRyhfX3BJZWVlRGV2KSArK0dFVF9DSUVfV0FUQ0hET0coX19wSWVlZURldikNCisNCisjZGVmaW5lIElTX0RPVDExRF9TVEFURV9ET05FKF9fcEllZWVEZXYpIChHRVRfRE9UMTFEX0lORk8oX19wSWVlZURldiktPlN0YXRlID09IERPVDExRF9TVEFURV9ET05FKQ0KKw0KKw0KK3ZvaWQNCitEb3QxMWRfSW5pdCgNCisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmRldg0KKwkpOw0KKw0KK3ZvaWQNCitEb3QxMWRfUmVzZXQoDQorCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICpkZXYNCisJKTsNCisNCit2b2lkDQorRG90MTFkX1VwZGF0ZUNvdW50cnlJZSgNCisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmRldiwNCisJdTggKgkJcFRhZGRyLA0KKwl1MTYJQ291dHJ5SWVMZW4sDQorCXU4ICogcENvdXRyeUllCSANCisJKTsNCisNCit1OA0KK0RPVDExRF9HZXRNYXhUeFB3ckluRGJtKA0KKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqZGV2LA0KKwl1OCBDaGFubmVsDQorCSk7DQorDQordm9pZA0KK0RPVDExRF9TY2FuQ29tcGxldGUoDQorCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICogZGV2DQorCSk7DQorDQoraW50IElzTGVnYWxDaGFubmVsKA0KKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqIGRldiwNCisJdTggY2hhbm5lbA0KKyk7DQorDQoraW50IFRvTGVnYWxDaGFubmVsKA0KKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqIGRldiwNCisJdTggY2hhbm5lbA0KKyk7DQorDQorI2VuZGlmIC8vICNpZm5kZWYgX19JTkNfRE9UMTFEX0gNCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODMzNjA4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEuaApAQCAtMCwwICsxLDE3NTUgQEAKKy8qCisgKiBNZXJnZWQgd2l0aCBtYWlubGluZSBpZWVlODAyMTEuaCBpbiBBdWcgMjAwNC4gIE9yaWdpbmFsIGllZWU4MDJfMTEKKyAqIHJlbWFpbnMgY29weXJpZ2h0IGJ5IHRoZSBvcmlnaW5hbCBhdXRob3JzCisgKgorICogUG9ydGlvbnMgb2YgdGhlIG1lcmdlZCBjb2RlIGFyZSBiYXNlZCBvbiBIb3N0IEFQIChzb2Z0d2FyZSB3aXJlbGVzcworICogTEFOIGFjY2VzcyBwb2ludCkgZHJpdmVyIGZvciBJbnRlcnNpbCBQcmlzbTIvMi41LzMuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDIsIFNTSCBDb21tdW5pY2F0aW9ucyBTZWN1cml0eSBDb3JwIGFuZCBKb3VuaSBNYWxpbmVuCisgKiA8amttYWxpbmVAY2MuaHV0LmZpPgorICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDMsIEpvdW5pIE1hbGluZW4gPGprbWFsaW5lQGNjLmh1dC5maT4KKyAqCisgKiBBZGFwdGlvbiB0byBhIGdlbmVyaWMgSUVFRSA4MDIuMTEgc3RhY2sgYnkgSmFtZXMgS2V0cmVub3MKKyAqIDxqa2V0cmVub0BsaW51eC5pbnRlbC5jb20+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIEludGVsIENvcnBvcmF0aW9uCisgKgorICogTW9kaWZpZWQgZm9yIFJlYWx0ZWsncyB3aS1maSBjYXJkcyBieSBBbmRyZWEgTWVyZWxsbworICogPGFuZHJlYW1ybEB0aXNjYWxpLml0PgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uIFNlZSBSRUFETUUgYW5kIENPUFlJTkcgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKi8KKyNpZm5kZWYgSUVFRTgwMjExX0gKKyNkZWZpbmUgSUVFRTgwMjExX0gKKyNpbmNsdWRlIDxsaW51eC9pZl9ldGhlci5oPiAvKiBFVEhfQUxFTiAqLworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPiAgIC8qIEFSUkFZX1NJWkUgKi8KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDEzKSkKKyNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgorI2VuZGlmCisKKy8qCisjaWZuZGVmIGJvb2wKKyNkZWZpbmUgYm9vbCBpbnQKKyNlbmRpZgorCisjaWZuZGVmIHRydWUKKyNkZWZpbmUgdHJ1ZSAgIDEKKyNlbmRpZgorCisjaWZuZGVmIGZhbHNlCisjZGVmaW5lIGZhbHNlICAwCisjZW5kaWYKKyovCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwyMCkpCisjaWZuZGVmIGJvb2wKK3R5cGVkZWYgZW51bXtmYWxzZSA9IDAsIHRydWV9IGJvb2w7CisjZW5kaWYKKyNlbmRpZgorLy8jaWZkZWYgSk9ITl9IV1NFQworI2RlZmluZSBLRVlfVFlQRV9OQQkJMHgwCisjZGVmaW5lIEtFWV9UWVBFX1dFUDQwIAkJMHgxCisjZGVmaW5lIEtFWV9UWVBFX1RLSVAJCTB4MgorI2RlZmluZSBLRVlfVFlQRV9DQ01QCQkweDQKKyNkZWZpbmUgS0VZX1RZUEVfV0VQMTA0CQkweDUKKy8vI2VuZGlmCisKKworI2RlZmluZSBhU2lmc1RpbWUJCQkJCTEwCisKKyNkZWZpbmUgTUdNVF9RVUVVRV9OVU0gNQorCisKKyNkZWZpbmUgSUVFRV9DTURfU0VUX1dQQV9QQVJBTQkJCTEKKyNkZWZpbmUJSUVFRV9DTURfU0VUX1dQQV9JRQkJCTIKKyNkZWZpbmUgSUVFRV9DTURfU0VUX0VOQ1JZUFRJT04JCQkzCisjZGVmaW5lIElFRUVfQ01EX01MTUUJCQkJNAorCisjZGVmaW5lIElFRUVfUEFSQU1fV1BBX0VOQUJMRUQJCQkxCisjZGVmaW5lIElFRUVfUEFSQU1fVEtJUF9DT1VOVEVSTUVBU1VSRVMJCTIKKyNkZWZpbmUgSUVFRV9QQVJBTV9EUk9QX1VORU5DUllQVEVECQkzCisjZGVmaW5lIElFRUVfUEFSQU1fUFJJVkFDWV9JTlZPS0VECQk0CisjZGVmaW5lIElFRUVfUEFSQU1fQVVUSF9BTEdTCQkJNQorI2RlZmluZSBJRUVFX1BBUkFNX0lFRUVfODAyXzFYCQkJNgorLy9JdCBzaG91bGQgY29uc2lzdGVudCB3aXRoIHRoZSBkcml2ZXJfWFhYLmMKKy8vICAgRGF2aWQsIDIwMDYuOS4yNgorI2RlZmluZSBJRUVFX1BBUkFNX1dQQVhfU0VMRUNUCQkJNworLy9BZGRlZCBmb3Igbm90aWZ5IHRoZSBlbmNyeXB0aW9uIHR5cGUgc2VsZWN0aW9uCisvLyAgIERhdmlkLCAyMDA2LjkuMjYKKyNkZWZpbmUgSUVFRV9QUk9UT19XUEEJCQkJMQorI2RlZmluZSBJRUVFX1BST1RPX1JTTgkJCQkyCisvL0FkZGVkIGZvciBub3RpZnkgdGhlIGVuY3J5cHRpb24gdHlwZSBzZWxlY3Rpb24KKy8vICAgRGF2aWQsIDIwMDYuOS4yNgorI2RlZmluZSBJRUVFX1dQQVhfVVNFR1JPVVAJCQkwCisjZGVmaW5lIElFRUVfV1BBWF9XRVA0MAkJCQkxCisjZGVmaW5lIElFRUVfV1BBWF9US0lQCQkJCTIKKyNkZWZpbmUgSUVFRV9XUEFYX1dSQVAgICAJCQkzCisjZGVmaW5lIElFRUVfV1BBWF9DQ01QCQkJCTQKKyNkZWZpbmUgSUVFRV9XUEFYX1dFUDEwNAkJCTUKKworI2RlZmluZSBJRUVFX0tFWV9NR01UX0lFRUU4MDIxWAkJCTEKKyNkZWZpbmUgSUVFRV9LRVlfTUdNVF9QU0sJCQkyCisKKworCisjZGVmaW5lIElFRUVfTUxNRV9TVEFfREVBVVRICQkJMQorI2RlZmluZSBJRUVFX01MTUVfU1RBX0RJU0FTU09DCQkJMgorCisKKyNkZWZpbmUgSUVFRV9DUllQVF9FUlJfVU5LTk9XTl9BTEcJCTIKKyNkZWZpbmUgSUVFRV9DUllQVF9FUlJfVU5LTk9XTl9BRERSCQkzCisjZGVmaW5lIElFRUVfQ1JZUFRfRVJSX0NSWVBUX0lOSVRfRkFJTEVECQk0CisjZGVmaW5lIElFRUVfQ1JZUFRfRVJSX0tFWV9TRVRfRkFJTEVECQk1CisjZGVmaW5lIElFRUVfQ1JZUFRfRVJSX1RYX0tFWV9TRVRfRkFJTEVECQk2CisjZGVmaW5lIElFRUVfQ1JZUFRfRVJSX0NBUkRfQ09ORl9GQUlMRUQJCTcKKworCisjZGVmaW5lCUlFRUVfQ1JZUFRfQUxHX05BTUVfTEVOCQkJMTYKKworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDYsMTApKQorI2RlZmluZSBpZWVlODAyMTFfd3hfZ2V0X3NjYW4gaWVlZTgwMjExX3d4X2dldF9zY2FuX3J0bAorI2RlZmluZSBpZWVlODAyMTFfd3hfc2V0X2VuY29kZSBpZWVlODAyMTFfd3hfc2V0X2VuY29kZV9ydGwKKyNkZWZpbmUgaWVlZTgwMjExX3d4X2dldF9lbmNvZGUgaWVlZTgwMjExX3d4X2dldF9lbmNvZGVfcnRsCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gYWRkZWQgZm9yIGtlcm5lbCBjb25mbGljdCB1bmRlciBGQzUKKyNkZWZpbmUgaWVlZTgwMjExX3d4X2dldF9uYW1lICAgaWVlZTgwMjExX3d4X2dldF9uYW1lX3J0bAorI2RlZmluZSBmcmVlX2llZWU4MDIxMSAgICAgICAgICBmcmVlX2llZWU4MDIxMV9ydGwKKyNkZWZpbmUgYWxsb2NfaWVlZTgwMjExICAgICAgICBhbGxvY19pZWVlODAyMTFfcnRsCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisjZW5kaWYKKy8vZXJyb3IgaW4gdWJ1bnR1Mi42LjIyLHNvIGFkZCB0aGVzZQorI2RlZmluZSBpZWVlODAyMTFfd2FrZV9xdWV1ZSBpZWVlODAyMTFfd2FrZV9xdWV1ZV9ydGwKKyNkZWZpbmUgaWVlZTgwMjExX3N0b3BfcXVldWUgaWVlZTgwMjExX3N0b3BfcXVldWVfcnRsCisKKyNkZWZpbmUgaWVlZTgwMjExX3J4IGllZWU4MDIxMV9yeF9ydGwKKworI2RlZmluZSBpZWVlODAyMTFfcmVnaXN0ZXJfY3J5cHRvX29wcwlpZWVlODAyMTFfcmVnaXN0ZXJfY3J5cHRvX29wc19ydGwKKyNkZWZpbmUgaWVlZTgwMjExX3VucmVnaXN0ZXJfY3J5cHRvX29wcwlpZWVlODAyMTFfdW5yZWdpc3Rlcl9jcnlwdG9fb3BzX3J0bAorI2RlZmluZSBpZWVlODAyMTFfZ2V0X2NyeXB0b19vcHMJaWVlZTgwMjExX2dldF9jcnlwdG9fb3BzX3J0bAorI2RlZmluZSBpZWVlODAyMTFfY3J5cHRfZGVpbml0X2VudHJpZXMJaWVlZTgwMjExX2NyeXB0X2RlaW5pdF9lbnRyaWVzX3J0bAorI2RlZmluZSBpZWVlODAyMTFfY3J5cHRfZGVpbml0X2hhbmRsZXIJaWVlZTgwMjExX2NyeXB0X2RlaW5pdF9oYW5kbGVyX3J0bAorI2RlZmluZSBpZWVlODAyMTFfY3J5cHRfZGVsYXllZF9kZWluaXQJaWVlZTgwMjExX2NyeXB0X2RlbGF5ZWRfZGVpbml0X3J0bAorCisjZGVmaW5lIGllZWU4MDIxMV90eGJfZnJlZQlpZWVlODAyMTFfdHhiX2ZyZWVfcnRsCisjZGVmaW5lIGllZWU4MDIxMV93eF9nZXRfZXNzaWQJaWVlZTgwMjExX3d4X2dldF9lc3NpZF9ydGwKKyNkZWZpbmUgaWVlZTgwMjExX3d4X3NldF9lc3NpZAlpZWVlODAyMTFfd3hfc2V0X2Vzc2lkX3J0bAorI2RlZmluZSBpZWVlODAyMTFfd3hfc2V0X3JhdGUJaWVlZTgwMjExX3d4X3NldF9yYXRlX3J0bAorI2RlZmluZSBpZWVlODAyMTFfd3hfZ2V0X3JhdGUJaWVlZTgwMjExX3d4X2dldF9yYXRlX3J0bAorI2RlZmluZSBpZWVlODAyMTFfd3hfc2V0X3dhcAlpZWVlODAyMTFfd3hfc2V0X3dhcF9ydGwKKyNkZWZpbmUgaWVlZTgwMjExX3d4X2dldF93YXAJaWVlZTgwMjExX3d4X2dldF93YXBfcnRsCisjZGVmaW5lIGllZWU4MDIxMV93eF9zZXRfbW9kZQlpZWVlODAyMTFfd3hfc2V0X21vZGVfcnRsCisjZGVmaW5lIGllZWU4MDIxMV93eF9nZXRfbW9kZQlpZWVlODAyMTFfd3hfZ2V0X21vZGVfcnRsCisjZGVmaW5lIGllZWU4MDIxMV93eF9zZXRfc2NhbglpZWVlODAyMTFfd3hfc2V0X3NjYW5fcnRsCisjZGVmaW5lIGllZWU4MDIxMV93eF9nZXRfZnJlcQlpZWVlODAyMTFfd3hfZ2V0X2ZyZXFfcnRsCisjZGVmaW5lIGllZWU4MDIxMV93eF9zZXRfZnJlcQlpZWVlODAyMTFfd3hfc2V0X2ZyZXFfcnRsCisjZGVmaW5lIGllZWU4MDIxMV93eF9zZXRfcmF3dHgJaWVlZTgwMjExX3d4X3NldF9yYXd0eF9ydGwKKyNkZWZpbmUgaWVlZTgwMjExX3d4X3NldF9wb3dlcglpZWVlODAyMTFfd3hfc2V0X3Bvd2VyX3J0bAorI2RlZmluZSBpZWVlODAyMTFfd3hfZ2V0X3Bvd2VyCWllZWU4MDIxMV93eF9nZXRfcG93ZXJfcnRsCisjZGVmaW5lIGllZWU4MDIxMV93bGFuX2ZyZXF1ZW5jaWVzCWllZWU4MDIxMV93bGFuX2ZyZXF1ZW5jaWVzX3J0bAorI2RlZmluZSBpZWVlODAyMTFfc29mdG1hY19zdG9wX3Byb3RvY29sCWllZWU4MDIxMV9zb2Z0bWFjX3N0b3BfcHJvdG9jb2xfcnRsCisjZGVmaW5lIGllZWU4MDIxMV9zb2Z0bWFjX3N0YXJ0X3Byb3RvY29sIGllZWU4MDIxMV9zb2Z0bWFjX3N0YXJ0X3Byb3RvY29sX3J0bAorI2RlZmluZQlpZWVlODAyMTFfc3RhcnRfcHJvdG9jb2wJaWVlZTgwMjExX3N0YXJ0X3Byb3RvY29sX3J0bAorI2RlZmluZQlpZWVlODAyMTFfc3RvcF9wcm90b2NvbAkJaWVlZTgwMjExX3N0b3BfcHJvdG9jb2xfcnRsCisjZGVmaW5lCWllZWU4MDIxMV9yeF9tZ3QJCWllZWU4MDIxMV9yeF9tZ3RfcnRsCisKKyNkZWZpbmUgaWVlZTgwMjExX3d4X3NldF9hdXRoIGllZWU4MDIxMV93eF9zZXRfYXV0aF9ydGwKKy8vYnkgYW15IGZvciBwcworI2RlZmluZSBub3RpZnlfd3hfYXNzb2NfZXZlbnQgIG5vdGlmeV93eF9hc3NvY19ldmVudF9ydGwKKyNkZWZpbmUgaWVlZTgwMjExX3N0b3Bfc2VuZF9iZWFjb25zIGllZWU4MDIxMV9zdG9wX3NlbmRfYmVhY29uc19ydGwKKyNkZWZpbmUgaWVlZTgwMjExX2Rpc2Fzc29jaWF0ZSBpZWVlODAyMTFfZGlzYXNzb2NpYXRlX3J0bAorI2RlZmluZSBpZWVlODAyMTFfc3RhcnRfc2NhbiBpZWVlODAyMTFfc3RhcnRfc2Nhbl9ydGwKKy8vYnkgYW15IGZvciBwcwordHlwZWRlZiBzdHJ1Y3QgaWVlZV9wYXJhbSB7CisJdTMyIGNtZDsKKwl1OCBzdGFfYWRkcltFVEhfQUxFTl07CisgICAgICAgIHVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCXU4IG5hbWU7CisJCQl1MzIgdmFsdWU7CisJCX0gd3BhX3BhcmFtOworCQlzdHJ1Y3QgeworCQkJdTMyIGxlbjsKKwkJCXU4IHJlc2VydmVkWzMyXTsKKwkJCXU4IGRhdGFbMF07CisJCX0gd3BhX2llOworCSAgICAgICAgc3RydWN0eworCQkJaW50IGNvbW1hbmQ7CisgICAgCQkJaW50IHJlYXNvbl9jb2RlOworCQl9IG1sbWU7CisJCXN0cnVjdCB7CisJCQl1OCBhbGdbSUVFRV9DUllQVF9BTEdfTkFNRV9MRU5dOworCQkJdTggc2V0X3R4OworCQkJdTMyIGVycjsKKwkJCXU4IGlkeDsKKwkJCXU4IHNlcVs4XTsgLyogc2VxdWVuY2UgY291bnRlciAoc2V0OiBSWCwgZ2V0OiBUWCkgKi8KKwkJCXUxNiBrZXlfbGVuOworCQkJdTgga2V5WzBdOworCQl9IGNyeXB0OworCisJfSB1OworfWllZWVfcGFyYW07CisKKworI2lmIFdJUkVMRVNTX0VYVCA8IDE3CisjZGVmaW5lIElXX1FVQUxfUVVBTF9JTlZBTElEICAgMHgxMAorI2RlZmluZSBJV19RVUFMX0xFVkVMX0lOVkFMSUQgIDB4MjAKKyNkZWZpbmUgSVdfUVVBTF9OT0lTRV9JTlZBTElEICAweDQwCisjZGVmaW5lIElXX1FVQUxfUVVBTF9VUERBVEVEICAgMHgxCisjZGVmaW5lIElXX1FVQUxfTEVWRUxfVVBEQVRFRCAgMHgyCisjZGVmaW5lIElXX1FVQUxfTk9JU0VfVVBEQVRFRCAgMHg0CisjZW5kaWYKKworLy8gbGludXggdW5kZXIgMi42LjkgcmVsZWFzZSBtYXkgbm90IHN1cHBvcnQgaXQsIHNvIG1vZGlmeSBpdCBmb3IgY29tbW9uIHVzZQorI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsOSkpCisjZGVmaW5lIE1TRUNTKHQpCSgxMDAwICogKCh0KSAvIEhaKSArIDEwMDAgKiAoKHQpICUgSFopIC8gSFopCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgbXNsZWVwX2ludGVycnVwdGlibGVfcnRsKHVuc2lnbmVkIGludCBtc2VjcykKK3sKKyAgICAgICAgIHVuc2lnbmVkIGxvbmcgdGltZW91dCA9IE1TRUNTKG1zZWNzKSArIDE7CisKKyAgICAgICAgIHdoaWxlICh0aW1lb3V0KSB7CisgICAgICAgICAgICAgICAgIHNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKyAgICAgICAgICAgICAgICAgdGltZW91dCA9IHNjaGVkdWxlX3RpbWVvdXQodGltZW91dCk7CisgICAgICAgICB9CisgICAgICAgICByZXR1cm4gdGltZW91dDsKK30KKyNlbHNlCisjZGVmaW5lIE1TRUNTKHQpIG1zZWNzX3RvX2ppZmZpZXModCkKKyNkZWZpbmUgbXNsZWVwX2ludGVycnVwdGlibGVfcnRsICBtc2xlZXBfaW50ZXJydXB0aWJsZQorI2VuZGlmCisKKyNkZWZpbmUgSUVFRTgwMjExX0RBVEFfTEVOCQkyMzA0CisvKiBNYXhpbXVtIHNpemUgZm9yIHRoZSBNQS1VTklUREFUQSBwcmltaXRpdmUsIDgwMi4xMSBzdGFuZGFyZCBzZWN0aW9uCisgICA2LjIuMS4xLjIuCisKKyAgIFRoZSBmaWd1cmUgaW4gc2VjdGlvbiA3LjEuMiBzdWdnZXN0cyBhIGJvZHkgc2l6ZSBvZiB1cCB0byAyMzEyCisgICBieXRlcyBpcyBhbGxvd2VkLCB3aGljaCBpcyBhIGJpdCBjb25mdXNpbmcsIEkgc3VzcGVjdCB0aGlzCisgICByZXByZXNlbnRzIHRoZSAyMzA0IGJ5dGVzIG9mIHJlYWwgZGF0YSwgcGx1cyBhIHBvc3NpYmxlIDggYnl0ZXMgb2YKKyAgIFdFUCBJViBhbmQgSUNWLiAodGhpcyBpbnRlcnByZXRhdGlvbiBzdWdnZXN0ZWQgYnkgUmFtaXJvIEJhcnJlaXJvKSAqLworCisKKyNkZWZpbmUgSUVFRTgwMjExX0hMRU4JCQkzMAorI2RlZmluZSBJRUVFODAyMTFfRlJBTUVfTEVOCQkoSUVFRTgwMjExX0RBVEFfTEVOICsgSUVFRTgwMjExX0hMRU4pCisKKy8qIHRoaXMgaXMgc3RvbGVuIGFuZCBtb2RpZmllZCBmcm9tIHRoZSBtYWR3aWZpIGRyaXZlciovCisjZGVmaW5lIElFRUU4MDIxMV9GQzBfVFlQRV9NQVNLCQkweDBjCisjZGVmaW5lIElFRUU4MDIxMV9GQzBfVFlQRV9EQVRBCQkweDA4CisjZGVmaW5lIElFRUU4MDIxMV9GQzBfU1VCVFlQRV9NQVNLCTB4QjAKKyNkZWZpbmUgSUVFRTgwMjExX0ZDMF9TVUJUWVBFX1FPUwkweDgwCisKKyNkZWZpbmUgSUVFRTgwMjExX1FPU19IQVNfU0VRKGZjKSBcCisJKCgoZmMpICYgKElFRUU4MDIxMV9GQzBfVFlQRV9NQVNLIHwgSUVFRTgwMjExX0ZDMF9TVUJUWVBFX01BU0spKSA9PSBcCisJIChJRUVFODAyMTFfRkMwX1RZUEVfREFUQSB8IElFRUU4MDIxMV9GQzBfU1VCVFlQRV9RT1MpKQorCisvKiB0aGlzIGlzIHN0b2xlbiBmcm9tIGlwdzIyMDAgZHJpdmVyICovCisjZGVmaW5lIElFRUVfSUJTU19NQUNfSEFTSF9TSVpFIDMxCitzdHJ1Y3QgaWVlZV9pYnNzX3NlcSB7CisJdTggbWFjW0VUSF9BTEVOXTsKKwl1MTYgc2VxX251bVsxN107CisJdTE2IGZyYWdfbnVtWzE3XTsKKwl1bnNpZ25lZCBsb25nIHBhY2tldF90aW1lWzE3XTsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Cit9OworCitzdHJ1Y3QgaWVlZTgwMjExX2hkciB7CisJdTE2IGZyYW1lX2N0bDsKKwl1MTYgZHVyYXRpb25faWQ7CisJdTggYWRkcjFbRVRIX0FMRU5dOworCXU4IGFkZHIyW0VUSF9BTEVOXTsKKwl1OCBhZGRyM1tFVEhfQUxFTl07CisJdTE2IHNlcV9jdGw7CisJdTggYWRkcjRbRVRIX0FMRU5dOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBpZWVlODAyMTFfaGRyX1FPUyB7CisJdTE2IGZyYW1lX2N0bDsKKwl1MTYgZHVyYXRpb25faWQ7CisJdTggYWRkcjFbRVRIX0FMRU5dOworCXU4IGFkZHIyW0VUSF9BTEVOXTsKKwl1OCBhZGRyM1tFVEhfQUxFTl07CisJdTE2IHNlcV9jdGw7CisJdTggYWRkcjRbRVRIX0FMRU5dOworCXUxNiBRT1NfY3RsOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyIHsKKwl1MTYgZnJhbWVfY3RsOworCXUxNiBkdXJhdGlvbl9pZDsKKwl1OCBhZGRyMVtFVEhfQUxFTl07CisJdTggYWRkcjJbRVRIX0FMRU5dOworCXU4IGFkZHIzW0VUSF9BTEVOXTsKKwl1MTYgc2VxX2N0bDsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcl9RT1MgeworCXUxNiBmcmFtZV9jdGw7CisJdTE2IGR1cmF0aW9uX2lkOworCXU4IGFkZHIxW0VUSF9BTEVOXTsKKwl1OCBhZGRyMltFVEhfQUxFTl07CisJdTggYWRkcjNbRVRIX0FMRU5dOworCXUxNiBzZXFfY3RsOworCXUxNiBRT1NfY3RsOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK2VudW0gZWFwX3R5cGUgeworCUVBUF9QQUNLRVQgPSAwLAorCUVBUE9MX1NUQVJULAorCUVBUE9MX0xPR09GRiwKKwlFQVBPTF9LRVksCisJRUFQT0xfRU5DQVBfQVNGX0FMRVJUCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqZWFwX3R5cGVzW10gPSB7CisJW0VBUF9QQUNLRVRdCQk9ICJFQVAtUGFja2V0IiwKKwlbRUFQT0xfU1RBUlRdCQk9ICJFQVBPTC1TdGFydCIsCisJW0VBUE9MX0xPR09GRl0JCT0gIkVBUE9MLUxvZ29mZiIsCisJW0VBUE9MX0tFWV0JCT0gIkVBUE9MLUtleSIsCisJW0VBUE9MX0VOQ0FQX0FTRl9BTEVSVF0JPSAiRUFQT0wtRW5jYXAtQVNGLUFsZXJ0IgorfTsKKworc3RhdGljIGlubGluZSBjb25zdCBjaGFyICplYXBfZ2V0X3R5cGUoaW50IHR5cGUpCit7CisJcmV0dXJuICh0eXBlID49IEFSUkFZX1NJWkUoZWFwX3R5cGVzKSkgPyAiVW5rbm93biIgOiBlYXBfdHlwZXNbdHlwZV07Cit9CisKK3N0cnVjdCBlYXBvbCB7CisJdTggc25hcFs2XTsKKwl1MTYgZXRoZXJ0eXBlOworCXU4IHZlcnNpb247CisJdTggdHlwZTsKKwl1MTYgbGVuZ3RoOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKyNkZWZpbmUgSUVFRTgwMjExXzNBRERSX0xFTiAyNAorI2RlZmluZSBJRUVFODAyMTFfNEFERFJfTEVOIDMwCisjZGVmaW5lIElFRUU4MDIxMV9GQ1NfTEVOICAgIDQKKworI2RlZmluZSBNSU5fRlJBR19USFJFU0hPTEQgICAgIDI1NlUKKyNkZWZpbmUJTUFYX0ZSQUdfVEhSRVNIT0xEICAgICAyMzQ2VQorCisvKiBGcmFtZSBjb250cm9sIGZpZWxkIGNvbnN0YW50cyAqLworI2RlZmluZSBJRUVFODAyMTFfRkNUTF9WRVJTCQkweDAwMDIKKyNkZWZpbmUgSUVFRTgwMjExX0ZDVExfRlRZUEUJCTB4MDAwYworI2RlZmluZSBJRUVFODAyMTFfRkNUTF9TVFlQRQkJMHgwMGYwCisjZGVmaW5lIElFRUU4MDIxMV9GQ1RMX1RPRFMJCTB4MDEwMAorI2RlZmluZSBJRUVFODAyMTFfRkNUTF9GUk9NRFMJCTB4MDIwMAorI2RlZmluZSBJRUVFODAyMTFfRkNUTF9EU1RPRFMJCTB4MDMwMCAvL2FkZGVkIGJ5IGRhdmlkCisjZGVmaW5lIElFRUU4MDIxMV9GQ1RMX01PUkVGUkFHUwkweDA0MDAKKyNkZWZpbmUgSUVFRTgwMjExX0ZDVExfUkVUUlkJCTB4MDgwMAorI2RlZmluZSBJRUVFODAyMTFfRkNUTF9QTQkJMHgxMDAwCisjZGVmaW5lIElFRUU4MDIxMV9GQ1RMX01PUkVEQVRBCTB4MjAwMAorI2RlZmluZSBJRUVFODAyMTFfRkNUTF9XRVAJCTB4NDAwMAorI2RlZmluZSBJRUVFODAyMTFfRkNUTF9PUkRFUgkJMHg4MDAwCisKKyNkZWZpbmUgSUVFRTgwMjExX0ZUWVBFX01HTVQJCTB4MDAwMAorI2RlZmluZSBJRUVFODAyMTFfRlRZUEVfQ1RMCQkweDAwMDQKKyNkZWZpbmUgSUVFRTgwMjExX0ZUWVBFX0RBVEEJCTB4MDAwOAorCisvKiBtYW5hZ2VtZW50ICovCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9BU1NPQ19SRVEJMHgwMDAwCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9BU1NPQ19SRVNQIAkweDAwMTAKKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX1JFQVNTT0NfUkVRCTB4MDAyMAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfUkVBU1NPQ19SRVNQCTB4MDAzMAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfUFJPQkVfUkVRCTB4MDA0MAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfUFJPQkVfUkVTUAkweDAwNTAKKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX0JFQUNPTgkJMHgwMDgwCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9BVElNCQkweDAwOTAKKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX0RJU0FTU09DCTB4MDBBMAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfQVVUSAkJMHgwMEIwCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9ERUFVVEgJCTB4MDBDMAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfTUFOQUdFX0FDVAkweDAwRDAKKworLyogY29udHJvbCAqLworI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfUFNQT0xMCQkweDAwQTAKKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX1JUUwkJMHgwMEIwCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9DVFMJCTB4MDBDMAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfQUNLCQkweDAwRDAKKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX0NGRU5ECQkweDAwRTAKKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX0NGRU5EQUNLCTB4MDBGMAorCisvKiBkYXRhICovCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9EQVRBCQkweDAwMDAKKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX0RBVEFfQ0ZBQ0sJMHgwMDEwCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9EQVRBX0NGUE9MTAkweDAwMjAKKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX0RBVEFfQ0ZBQ0tQT0xMCTB4MDAzMAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfTlVMTEZVTkMJMHgwMDQwCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9DRkFDSwkJMHgwMDUwCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9DRlBPTEwJCTB4MDA2MAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfQ0ZBQ0tQT0xMCTB4MDA3MAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfUU9TX0RBVEEJMHgwMDgwIC8vYWRkZWQgZm9yIFdNTSAyMDA2LzgvMgorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfUU9TX05VTEwJMHgwMEMwCisKKworI2RlZmluZSBJRUVFODAyMTFfU0NUTF9GUkFHCQkweDAwMEYKKyNkZWZpbmUgSUVFRTgwMjExX1NDVExfU0VRCQkweEZGRjAKKworCisvKiBkZWJ1ZyBtYWNyb3MgKi8KKworI2lmZGVmIENPTkZJR19JRUVFODAyMTFfREVCVUcKK2V4dGVybiB1MzIgaWVlZTgwMjExX2RlYnVnX2xldmVsOworI2RlZmluZSBJRUVFODAyMTFfREVCVUcobGV2ZWwsIGZtdCwgYXJncy4uLikgXAorZG8geyBpZiAoaWVlZTgwMjExX2RlYnVnX2xldmVsICYgKGxldmVsKSkgXAorICBwcmludGsoS0VSTl9ERUJVRyAiaWVlZTgwMjExOiAlYyAlcyAiIGZtdCwgXAorICAgICAgICAgaW5faW50ZXJydXB0KCkgPyAnSScgOiAnVScsIF9fZnVuY19fICwgIyMgYXJncyk7IH0gd2hpbGUgKDApCisjZWxzZQorI2RlZmluZSBJRUVFODAyMTFfREVCVUcobGV2ZWwsIGZtdCwgYXJncy4uLikgZG8ge30gd2hpbGUgKDApCisjZW5kaWYJLyogQ09ORklHX0lFRUU4MDIxMV9ERUJVRyAqLworCisvKgorICogVG8gdXNlIHRoZSBkZWJ1ZyBzeXN0ZW07CisgKgorICogSWYgeW91IGFyZSBkZWZpbmluZyBhIG5ldyBkZWJ1ZyBjbGFzc2lmaWNhdGlvbiwgc2ltcGx5IGFkZCBpdCB0byB0aGUgI2RlZmluZQorICogbGlzdCBoZXJlIGluIHRoZSBmb3JtIG9mOgorICoKKyAqICNkZWZpbmUgSUVFRTgwMjExX0RMX3h4eHggVkFMVUUKKyAqCisgKiBzaGlmdGluZyB2YWx1ZSB0byB0aGUgbGVmdCBvbmUgYml0IGZyb20gdGhlIHByZXZpb3VzIGVudHJ5LiAgeHh4eCBzaG91bGQgYmUKKyAqIHRoZSBuYW1lIG9mIHRoZSBjbGFzc2lmaWNhdGlvbiAoZm9yIGV4YW1wbGUsIFdFUCkKKyAqCisgKiBZb3UgdGhlbiBuZWVkIHRvIGVpdGhlciBhZGQgYSBJRUVFODAyMTFfeHh4eF9ERUJVRygpIG1hY3JvIGRlZmluaXRpb24gZm9yIHlvdXIKKyAqIGNsYXNzaWZpY2F0aW9uLCBvciB1c2UgSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF94eHh4LCAuLi4pIHdoZW5ldmVyIHlvdSB3YW50CisgKiB0byBzZW5kIG91dHB1dCB0byB0aGF0IGNsYXNzaWZpY2F0aW9uLgorICoKKyAqIFRvIGFkZCB5b3VyIGRlYnVnIGxldmVsIHRvIHRoZSBsaXN0IG9mIGxldmVscyBzZWVuIHdoZW4geW91IHBlcmZvcm0KKyAqCisgKiAlIGNhdCAvcHJvYy9uZXQvaXB3L2RlYnVnX2xldmVsCisgKgorICogeW91IHNpbXBseSBuZWVkIHRvIGFkZCB5b3VyIGVudHJ5IHRvIHRoZSBpcHdfZGVidWdfbGV2ZWxzIGFycmF5LgorICoKKyAqIElmIHlvdSBkbyBub3Qgc2VlIGRlYnVnX2xldmVsIGluIC9wcm9jL25ldC9pcHcgdGhlbiB5b3UgZG8gbm90IGhhdmUKKyAqIENPTkZJR19JRUVFODAyMTFfREVCVUcgZGVmaW5lZCBpbiB5b3VyIGtlcm5lbCBjb25maWd1cmF0aW9uCisgKgorICovCisKKyNkZWZpbmUgSUVFRTgwMjExX0RMX0lORk8gICAgICAgICAgKDE8PDApCisjZGVmaW5lIElFRUU4MDIxMV9ETF9XWCAgICAgICAgICAgICgxPDwxKQorI2RlZmluZSBJRUVFODAyMTFfRExfU0NBTiAgICAgICAgICAoMTw8MikKKyNkZWZpbmUgSUVFRTgwMjExX0RMX1NUQVRFICAgICAgICAgKDE8PDMpCisjZGVmaW5lIElFRUU4MDIxMV9ETF9NR01UICAgICAgICAgICgxPDw0KQorI2RlZmluZSBJRUVFODAyMTFfRExfRlJBRyAgICAgICAgICAoMTw8NSkKKyNkZWZpbmUgSUVFRTgwMjExX0RMX0VBUCAgICAgICAgICAgKDE8PDYpCisjZGVmaW5lIElFRUU4MDIxMV9ETF9EUk9QICAgICAgICAgICgxPDw3KQorCisjZGVmaW5lIElFRUU4MDIxMV9ETF9UWCAgICAgICAgICAgICgxPDw4KQorI2RlZmluZSBJRUVFODAyMTFfRExfUlggICAgICAgICAgICAoMTw8OSkKKworI2RlZmluZSBJRUVFODAyMTFfRVJST1IoZiwgYS4uLikgcHJpbnRrKEtFUk5fRVJSICJpZWVlODAyMTE6ICIgZiwgIyMgYSkKKyNkZWZpbmUgSUVFRTgwMjExX1dBUk5JTkcoZiwgYS4uLikgcHJpbnRrKEtFUk5fV0FSTklORyAiaWVlZTgwMjExOiAiIGYsICMjIGEpCisjZGVmaW5lIElFRUU4MDIxMV9ERUJVR19JTkZPKGYsIGEuLi4pICAgSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9JTkZPLCBmLCAjIyBhKQorCisjZGVmaW5lIElFRUU4MDIxMV9ERUJVR19XWChmLCBhLi4uKSAgICAgSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9XWCwgZiwgIyMgYSkKKyNkZWZpbmUgSUVFRTgwMjExX0RFQlVHX1NDQU4oZiwgYS4uLikgICBJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX1NDQU4sIGYsICMjIGEpCisvLyNkZWZpbmUgSUVFRV9ERUJVR19TQ0FOICBJRUVFODAyMTFfV0FSTklORworI2RlZmluZSBJRUVFODAyMTFfREVCVUdfU1RBVEUoZiwgYS4uLikgIElFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfU1RBVEUsIGYsICMjIGEpCisjZGVmaW5lIElFRUU4MDIxMV9ERUJVR19NR01UKGYsIGEuLi4pICBJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX01HTVQsIGYsICMjIGEpCisjZGVmaW5lIElFRUU4MDIxMV9ERUJVR19GUkFHKGYsIGEuLi4pICBJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0ZSQUcsIGYsICMjIGEpCisjZGVmaW5lIElFRUU4MDIxMV9ERUJVR19FQVAoZiwgYS4uLikgIElFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfRUFQLCBmLCAjIyBhKQorI2RlZmluZSBJRUVFODAyMTFfREVCVUdfRFJPUChmLCBhLi4uKSAgSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9EUk9QLCBmLCAjIyBhKQorI2RlZmluZSBJRUVFODAyMTFfREVCVUdfVFgoZiwgYS4uLikgIElFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfVFgsIGYsICMjIGEpCisjZGVmaW5lIElFRUU4MDIxMV9ERUJVR19SWChmLCBhLi4uKSAgSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9SWCwgZiwgIyMgYSkKKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPiAvKiBBUlBIUkRfRVRIRVIgKi8KKworI2lmbmRlZiBXSVJFTEVTU19TUFkKKyNkZWZpbmUgV0lSRUxFU1NfU1BZCQkvLyBlbmFibGUgaXdzcHkgc3VwcG9ydAorI2VuZGlmCisjaW5jbHVkZSA8bmV0L2l3X2hhbmRsZXIuaD4JLy8gbmV3IGRyaXZlciBBUEkKKworI2lmbmRlZiBFVEhfUF9QQUUKKyNkZWZpbmUgRVRIX1BfUEFFIDB4ODg4RSAvKiBQb3J0IEFjY2VzcyBFbnRpdHkgKElFRUUgODAyLjFYKSAqLworI2VuZGlmIC8qIEVUSF9QX1BBRSAqLworCisjZGVmaW5lIEVUSF9QX1BSRUFVVEggMHg4OEM3IC8qIElFRUUgODAyLjExaSBwcmUtYXV0aGVudGljYXRpb24gKi8KKworI2lmbmRlZiBFVEhfUF84MDIxMV9SQVcKKyNkZWZpbmUgRVRIX1BfODAyMTFfUkFXIChFVEhfUF9FQ09ORVQgKyAxKQorI2VuZGlmCisKKy8qIElFRUUgODAyLjExIGRlZmluZXMgKi8KKworI2RlZmluZSBQODAyMTFfT1VJX0xFTiAzCisKK3N0cnVjdCBpZWVlODAyMTFfc25hcF9oZHIgeworCisgICAgICAgIHU4ICAgIGRzYXA7ICAgLyogYWx3YXlzIDB4QUEgKi8KKyAgICAgICAgdTggICAgc3NhcDsgICAvKiBhbHdheXMgMHhBQSAqLworICAgICAgICB1OCAgICBjdHJsOyAgIC8qIGFsd2F5cyAweDAzICovCisgICAgICAgIHU4ICAgIG91aVtQODAyMTFfT1VJX0xFTl07ICAgIC8qIG9yZ2FuaXphdGlvbmFsIHVuaXZlcnNhbCBpZCAqLworCit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworI2RlZmluZSBTTkFQX1NJWkUgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfc25hcF9oZHIpCisKKyNkZWZpbmUgV0xBTl9GQ19HRVRfVFlQRShmYykgKChmYykgJiBJRUVFODAyMTFfRkNUTF9GVFlQRSkKKyNkZWZpbmUgV0xBTl9GQ19HRVRfU1RZUEUoZmMpICgoZmMpICYgSUVFRTgwMjExX0ZDVExfU1RZUEUpCisKKyNkZWZpbmUgV0xBTl9HRVRfU0VRX0ZSQUcoc2VxKSAoKHNlcSkgJiBJRUVFODAyMTFfU0NUTF9GUkFHKQorI2RlZmluZSBXTEFOX0dFVF9TRVFfU0VRKHNlcSkgICgoc2VxKSAmIElFRUU4MDIxMV9TQ1RMX1NFUSkKKworLyogQXV0aGVudGljYXRpb24gYWxnb3JpdGhtcyAqLworI2RlZmluZSBXTEFOX0FVVEhfT1BFTiAwCisjZGVmaW5lIFdMQU5fQVVUSF9TSEFSRURfS0VZIDEKKworI2RlZmluZSBXTEFOX0FVVEhfQ0hBTExFTkdFX0xFTiAxMjgKKworI2RlZmluZSBXTEFOX0NBUEFCSUxJVFlfQlNTICgxPDwwKQorI2RlZmluZSBXTEFOX0NBUEFCSUxJVFlfSUJTUyAoMTw8MSkKKyNkZWZpbmUgV0xBTl9DQVBBQklMSVRZX0NGX1BPTExBQkxFICgxPDwyKQorI2RlZmluZSBXTEFOX0NBUEFCSUxJVFlfQ0ZfUE9MTF9SRVFVRVNUICgxPDwzKQorI2RlZmluZSBXTEFOX0NBUEFCSUxJVFlfUFJJVkFDWSAoMTw8NCkKKyNkZWZpbmUgV0xBTl9DQVBBQklMSVRZX1NIT1JUX1BSRUFNQkxFICgxPDw1KQorI2RlZmluZSBXTEFOX0NBUEFCSUxJVFlfUEJDQyAoMTw8NikKKyNkZWZpbmUgV0xBTl9DQVBBQklMSVRZX0NIQU5ORUxfQUdJTElUWSAoMTw8NykKKyNkZWZpbmUgV0xBTl9DQVBBQklMSVRZX1NIT1JUX1NMT1QgKDE8PDEwKQorCisvKiBTdGF0dXMgY29kZXMgKi8KKyNkZWZpbmUgV0xBTl9TVEFUVVNfU1VDQ0VTUyAwCisjZGVmaW5lIFdMQU5fU1RBVFVTX1VOU1BFQ0lGSUVEX0ZBSUxVUkUgMQorI2RlZmluZSBXTEFOX1NUQVRVU19DQVBTX1VOU1VQUE9SVEVEIDEwCisjZGVmaW5lIFdMQU5fU1RBVFVTX1JFQVNTT0NfTk9fQVNTT0MgMTEKKyNkZWZpbmUgV0xBTl9TVEFUVVNfQVNTT0NfREVOSUVEX1VOU1BFQyAxMgorI2RlZmluZSBXTEFOX1NUQVRVU19OT1RfU1VQUE9SVEVEX0FVVEhfQUxHIDEzCisjZGVmaW5lIFdMQU5fU1RBVFVTX1VOS05PV05fQVVUSF9UUkFOU0FDVElPTiAxNAorI2RlZmluZSBXTEFOX1NUQVRVU19DSEFMTEVOR0VfRkFJTCAxNQorI2RlZmluZSBXTEFOX1NUQVRVU19BVVRIX1RJTUVPVVQgMTYKKyNkZWZpbmUgV0xBTl9TVEFUVVNfQVBfVU5BQkxFX1RPX0hBTkRMRV9ORVdfU1RBIDE3CisjZGVmaW5lIFdMQU5fU1RBVFVTX0FTU09DX0RFTklFRF9SQVRFUyAxOAorLyogODAyLjExYiAqLworI2RlZmluZSBXTEFOX1NUQVRVU19BU1NPQ19ERU5JRURfTk9TSE9SVCAxOQorI2RlZmluZSBXTEFOX1NUQVRVU19BU1NPQ19ERU5JRURfTk9QQkNDIDIwCisjZGVmaW5lIFdMQU5fU1RBVFVTX0FTU09DX0RFTklFRF9OT0FHSUxJVFkgMjEKKworLyogUmVhc29uIGNvZGVzICovCisjZGVmaW5lIFdMQU5fUkVBU09OX1VOU1BFQ0lGSUVEIDEKKyNkZWZpbmUgV0xBTl9SRUFTT05fUFJFVl9BVVRIX05PVF9WQUxJRCAyCisjZGVmaW5lIFdMQU5fUkVBU09OX0RFQVVUSF9MRUFWSU5HIDMKKyNkZWZpbmUgV0xBTl9SRUFTT05fRElTQVNTT0NfRFVFX1RPX0lOQUNUSVZJVFkgNAorI2RlZmluZSBXTEFOX1JFQVNPTl9ESVNBU1NPQ19BUF9CVVNZIDUKKyNkZWZpbmUgV0xBTl9SRUFTT05fQ0xBU1MyX0ZSQU1FX0ZST01fTk9OQVVUSF9TVEEgNgorI2RlZmluZSBXTEFOX1JFQVNPTl9DTEFTUzNfRlJBTUVfRlJPTV9OT05BU1NPQ19TVEEgNworI2RlZmluZSBXTEFOX1JFQVNPTl9ESVNBU1NPQ19TVEFfSEFTX0xFRlQgOAorI2RlZmluZSBXTEFOX1JFQVNPTl9TVEFfUkVRX0FTU09DX1dJVEhPVVRfQVVUSCA5CisKKworLyogSW5mb3JtYXRpb24gRWxlbWVudCBJRHMgKi8KKyNkZWZpbmUgV0xBTl9FSURfU1NJRCAwCisjZGVmaW5lIFdMQU5fRUlEX1NVUFBfUkFURVMgMQorI2RlZmluZSBXTEFOX0VJRF9GSF9QQVJBTVMgMgorI2RlZmluZSBXTEFOX0VJRF9EU19QQVJBTVMgMworI2RlZmluZSBXTEFOX0VJRF9DRl9QQVJBTVMgNAorI2RlZmluZSBXTEFOX0VJRF9USU0gNQorI2RlZmluZSBXTEFOX0VJRF9JQlNTX1BBUkFNUyA2CisjZGVmaW5lIFdMQU5fRUlEX0NIQUxMRU5HRSAxNgorI2RlZmluZSBXTEFOX0VJRF9SU04gNDgKKyNkZWZpbmUgV0xBTl9FSURfR0VORVJJQyAyMjEKKworI2RlZmluZSBJRUVFODAyMTFfTUdNVF9IRFJfTEVOIDI0CisjZGVmaW5lIElFRUU4MDIxMV9EQVRBX0hEUjNfTEVOIDI0CisjZGVmaW5lIElFRUU4MDIxMV9EQVRBX0hEUjRfTEVOIDMwCisKKworI2RlZmluZSBJRUVFODAyMTFfU1RBVE1BU0tfU0lHTkFMICgxPDwwKQorI2RlZmluZSBJRUVFODAyMTFfU1RBVE1BU0tfUlNTSSAoMTw8MSkKKyNkZWZpbmUgSUVFRTgwMjExX1NUQVRNQVNLX05PSVNFICgxPDwyKQorI2RlZmluZSBJRUVFODAyMTFfU1RBVE1BU0tfUkFURSAoMTw8MykKKyNkZWZpbmUgSUVFRTgwMjExX1NUQVRNQVNLX1dFTUFTSyAweDcKKworCisjZGVmaW5lIElFRUU4MDIxMV9DQ0tfTU9EVUxBVElPTiAgICAoMTw8MCkKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fTU9EVUxBVElPTiAgICgxPDwxKQorCisjZGVmaW5lIElFRUU4MDIxMV8yNEdIWl9CQU5EICAgICAoMTw8MCkKKyNkZWZpbmUgSUVFRTgwMjExXzUyR0haX0JBTkQgICAgICgxPDwxKQorCisjZGVmaW5lIElFRUU4MDIxMV9DQ0tfUkFURV9MRU4gIAkJNAorI2RlZmluZSBJRUVFODAyMTFfQ0NLX1JBVEVfMU1CCQkgICAgICAgIDB4MDIKKyNkZWZpbmUgSUVFRTgwMjExX0NDS19SQVRFXzJNQgkJICAgICAgICAweDA0CisjZGVmaW5lIElFRUU4MDIxMV9DQ0tfUkFURV81TUIJCSAgICAgICAgMHgwQgorI2RlZmluZSBJRUVFODAyMTFfQ0NLX1JBVEVfMTFNQgkJICAgICAgICAweDE2CisjZGVmaW5lIElFRUU4MDIxMV9PRkRNX1JBVEVfTEVOIAkJOAorI2RlZmluZSBJRUVFODAyMTFfT0ZETV9SQVRFXzZNQgkJICAgICAgICAweDBDCisjZGVmaW5lIElFRUU4MDIxMV9PRkRNX1JBVEVfOU1CCQkgICAgICAgIDB4MTIKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURV8xMk1CCQkweDE4CisjZGVmaW5lIElFRUU4MDIxMV9PRkRNX1JBVEVfMThNQgkJMHgyNAorI2RlZmluZSBJRUVFODAyMTFfT0ZETV9SQVRFXzI0TUIJCTB4MzAKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURV8zNk1CCQkweDQ4CisjZGVmaW5lIElFRUU4MDIxMV9PRkRNX1JBVEVfNDhNQgkJMHg2MAorI2RlZmluZSBJRUVFODAyMTFfT0ZETV9SQVRFXzU0TUIJCTB4NkMKKyNkZWZpbmUgSUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSwkJMHg4MAorCisjZGVmaW5lIElFRUU4MDIxMV9DQ0tfUkFURV8xTUJfTUFTSwkJKDE8PDApCisjZGVmaW5lIElFRUU4MDIxMV9DQ0tfUkFURV8yTUJfTUFTSwkJKDE8PDEpCisjZGVmaW5lIElFRUU4MDIxMV9DQ0tfUkFURV81TUJfTUFTSwkJKDE8PDIpCisjZGVmaW5lIElFRUU4MDIxMV9DQ0tfUkFURV8xMU1CX01BU0sJCSgxPDwzKQorI2RlZmluZSBJRUVFODAyMTFfT0ZETV9SQVRFXzZNQl9NQVNLCQkoMTw8NCkKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURV85TUJfTUFTSwkJKDE8PDUpCisjZGVmaW5lIElFRUU4MDIxMV9PRkRNX1JBVEVfMTJNQl9NQVNLCQkoMTw8NikKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURV8xOE1CX01BU0sJCSgxPDw3KQorI2RlZmluZSBJRUVFODAyMTFfT0ZETV9SQVRFXzI0TUJfTUFTSwkJKDE8PDgpCisjZGVmaW5lIElFRUU4MDIxMV9PRkRNX1JBVEVfMzZNQl9NQVNLCQkoMTw8OSkKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURV80OE1CX01BU0sJCSgxPDwxMCkKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURV81NE1CX01BU0sJCSgxPDwxMSkKKworI2RlZmluZSBJRUVFODAyMTFfQ0NLX1JBVEVTX01BU0sJICAgICAgICAweDAwMDAwMDBGCisjZGVmaW5lIElFRUU4MDIxMV9DQ0tfQkFTSUNfUkFURVNfTUFTSwkoSUVFRTgwMjExX0NDS19SQVRFXzFNQl9NQVNLIHwgXAorCUlFRUU4MDIxMV9DQ0tfUkFURV8yTUJfTUFTSykKKyNkZWZpbmUgSUVFRTgwMjExX0NDS19ERUZBVUxUX1JBVEVTX01BU0sJKElFRUU4MDIxMV9DQ0tfQkFTSUNfUkFURVNfTUFTSyB8IFwKKyAgICAgICAgSUVFRTgwMjExX0NDS19SQVRFXzVNQl9NQVNLIHwgXAorICAgICAgICBJRUVFODAyMTFfQ0NLX1JBVEVfMTFNQl9NQVNLKQorCisjZGVmaW5lIElFRUU4MDIxMV9PRkRNX1JBVEVTX01BU0sJCTB4MDAwMDBGRjAKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fQkFTSUNfUkFURVNfTUFTSwkoSUVFRTgwMjExX09GRE1fUkFURV82TUJfTUFTSyB8IFwKKwlJRUVFODAyMTFfT0ZETV9SQVRFXzEyTUJfTUFTSyB8IFwKKwlJRUVFODAyMTFfT0ZETV9SQVRFXzI0TUJfTUFTSykKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fREVGQVVMVF9SQVRFU19NQVNLCShJRUVFODAyMTFfT0ZETV9CQVNJQ19SQVRFU19NQVNLIHwgXAorCUlFRUU4MDIxMV9PRkRNX1JBVEVfOU1CX01BU0sgIHwgXAorCUlFRUU4MDIxMV9PRkRNX1JBVEVfMThNQl9NQVNLIHwgXAorCUlFRUU4MDIxMV9PRkRNX1JBVEVfMzZNQl9NQVNLIHwgXAorCUlFRUU4MDIxMV9PRkRNX1JBVEVfNDhNQl9NQVNLIHwgXAorCUlFRUU4MDIxMV9PRkRNX1JBVEVfNTRNQl9NQVNLKQorI2RlZmluZSBJRUVFODAyMTFfREVGQVVMVF9SQVRFU19NQVNLIChJRUVFODAyMTFfT0ZETV9ERUZBVUxUX1JBVEVTX01BU0sgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElFRUU4MDIxMV9DQ0tfREVGQVVMVF9SQVRFU19NQVNLKQorCisjZGVmaW5lIElFRUU4MDIxMV9OVU1fT0ZETV9SQVRFUwkgICAgOAorI2RlZmluZSBJRUVFODAyMTFfTlVNX0NDS19SQVRFUwkgICAgICAgICAgICA0CisjZGVmaW5lIElFRUU4MDIxMV9PRkRNX1NISUZUX01BU0tfQSAgICAgICAgIDQKKworCisKKworLyogTk9URTogVGhpcyBkYXRhIGlzIGZvciBzdGF0aXN0aWNhbCBwdXJwb3Nlczsgbm90IGFsbCBoYXJkd2FyZSBwcm92aWRlcyB0aGlzCisgKiAgICAgICBpbmZvcm1hdGlvbiBmb3IgZnJhbWVzIHJlY2VpdmVkLiAgTm90IHNldHRpbmcgdGhlc2Ugd2lsbCBub3QgY2F1c2UKKyAqICAgICAgIGFueSBhZHZlcnNlIGFmZmVjdHMuICovCitzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzIHsKKwl1MzIgbWFjX3RpbWVbMl07CisJdTggc2lnbmFsc3RyZW5ndGg7CisJczggcnNzaTsKKwl1OCBzaWduYWw7CisJdTggbm9pc2U7CisJdTE2IHJhdGU7IC8qIGluIDEwMCBrYnBzICovCisJdTggcmVjZWl2ZWRfY2hhbm5lbDsKKwl1OCBjb250cm9sOworCXU4IG1hc2s7CisJdTggZnJlcTsKKwl1MTYgbGVuOworCXU4IG5pY190eXBlOworfTsKKworLyogSUVFRSA4MDIuMTEgcmVxdWlyZXMgdGhhdCBTVEEgc3VwcG9ydHMgY29uY3VycmVudCByZWNlcHRpb24gb2YgYXQgbGVhc3QKKyAqIHRocmVlIGZyYWdtZW50ZWQgZnJhbWVzLiBUaGlzIGRlZmluZSBjYW4gYmUgaW5jcmVhc2VkIHRvIHN1cHBvcnQgbW9yZQorICogY29uY3VycmVudCBmcmFtZXMsIGJ1dCBpdCBzaG91bGQgYmUgbm90ZWQgdGhhdCBlYWNoIGVudHJ5IGNhbiBjb25zdW1lIGFib3V0CisgKiAyIGtCIG9mIFJBTSBhbmQgaW5jcmVhc2luZyBjYWNoZSBzaXplIHdpbGwgc2xvdyBkb3duIGZyYW1lIHJlYXNzZW1ibHkuICovCisjZGVmaW5lIElFRUU4MDIxMV9GUkFHX0NBQ0hFX0xFTiA0CisKK3N0cnVjdCBpZWVlODAyMTFfZnJhZ19lbnRyeSB7CisJdW5zaWduZWQgbG9uZyBmaXJzdF9mcmFnX3RpbWU7CisJdW5zaWduZWQgaW50IHNlcTsKKwl1bnNpZ25lZCBpbnQgbGFzdF9mcmFnOworCXN0cnVjdCBza19idWZmICpza2I7CisJdTggc3JjX2FkZHJbRVRIX0FMRU5dOworCXU4IGRzdF9hZGRyW0VUSF9BTEVOXTsKK307CisKK3N0cnVjdCBpZWVlODAyMTFfc3RhdHMgeworCXVuc2lnbmVkIGludCB0eF91bmljYXN0X2ZyYW1lczsKKwl1bnNpZ25lZCBpbnQgdHhfbXVsdGljYXN0X2ZyYW1lczsKKwl1bnNpZ25lZCBpbnQgdHhfZnJhZ21lbnRzOworCXVuc2lnbmVkIGludCB0eF91bmljYXN0X29jdGV0czsKKwl1bnNpZ25lZCBpbnQgdHhfbXVsdGljYXN0X29jdGV0czsKKwl1bnNpZ25lZCBpbnQgdHhfZGVmZXJyZWRfdHJhbnNtaXNzaW9uczsKKwl1bnNpZ25lZCBpbnQgdHhfc2luZ2xlX3JldHJ5X2ZyYW1lczsKKwl1bnNpZ25lZCBpbnQgdHhfbXVsdGlwbGVfcmV0cnlfZnJhbWVzOworCXVuc2lnbmVkIGludCB0eF9yZXRyeV9saW1pdF9leGNlZWRlZDsKKwl1bnNpZ25lZCBpbnQgdHhfZGlzY2FyZHM7CisJdW5zaWduZWQgaW50IHJ4X3VuaWNhc3RfZnJhbWVzOworCXVuc2lnbmVkIGludCByeF9tdWx0aWNhc3RfZnJhbWVzOworCXVuc2lnbmVkIGludCByeF9mcmFnbWVudHM7CisJdW5zaWduZWQgaW50IHJ4X3VuaWNhc3Rfb2N0ZXRzOworCXVuc2lnbmVkIGludCByeF9tdWx0aWNhc3Rfb2N0ZXRzOworCXVuc2lnbmVkIGludCByeF9mY3NfZXJyb3JzOworCXVuc2lnbmVkIGludCByeF9kaXNjYXJkc19ub19idWZmZXI7CisJdW5zaWduZWQgaW50IHR4X2Rpc2NhcmRzX3dyb25nX3NhOworCXVuc2lnbmVkIGludCByeF9kaXNjYXJkc191bmRlY3J5cHRhYmxlOworCXVuc2lnbmVkIGludCByeF9tZXNzYWdlX2luX21zZ19mcmFnbWVudHM7CisJdW5zaWduZWQgaW50IHJ4X21lc3NhZ2VfaW5fYmFkX21zZ19mcmFnbWVudHM7Cit9OworCitzdHJ1Y3QgaWVlZTgwMjExX3NvZnRtYWNfc3RhdHN7CisJdW5zaWduZWQgaW50IHJ4X2Fzc19vazsKKwl1bnNpZ25lZCBpbnQgcnhfYXNzX2VycjsKKwl1bnNpZ25lZCBpbnQgcnhfcHJvYmVfcnE7CisJdW5zaWduZWQgaW50IHR4X3Byb2JlX3JzOworCXVuc2lnbmVkIGludCB0eF9iZWFjb25zOworCXVuc2lnbmVkIGludCByeF9hdXRoX3JxOworCXVuc2lnbmVkIGludCByeF9hdXRoX3JzX29rOworCXVuc2lnbmVkIGludCByeF9hdXRoX3JzX2VycjsKKwl1bnNpZ25lZCBpbnQgdHhfYXV0aF9ycTsKKwl1bnNpZ25lZCBpbnQgbm9fYXV0aF9yczsKKwl1bnNpZ25lZCBpbnQgbm9fYXNzX3JzOworCXVuc2lnbmVkIGludCB0eF9hc3NfcnE7CisJdW5zaWduZWQgaW50IHJ4X2Fzc19ycTsKKwl1bnNpZ25lZCBpbnQgdHhfcHJvYmVfcnE7CisJdW5zaWduZWQgaW50IHJlYXNzb2M7CisJdW5zaWduZWQgaW50IHN3dHhzdG9wOworCXVuc2lnbmVkIGludCBzd3R4YXdha2U7Cit9OworCitzdHJ1Y3QgaWVlZTgwMjExX2RldmljZTsKKworI2luY2x1ZGUgImllZWU4MDIxMV9jcnlwdC5oIgorCisjZGVmaW5lIFNFQ19LRVlfMSAgICAgICAgICgxPDwwKQorI2RlZmluZSBTRUNfS0VZXzIgICAgICAgICAoMTw8MSkKKyNkZWZpbmUgU0VDX0tFWV8zICAgICAgICAgKDE8PDIpCisjZGVmaW5lIFNFQ19LRVlfNCAgICAgICAgICgxPDwzKQorI2RlZmluZSBTRUNfQUNUSVZFX0tFWSAgICAoMTw8NCkKKyNkZWZpbmUgU0VDX0FVVEhfTU9ERSAgICAgKDE8PDUpCisjZGVmaW5lIFNFQ19VTklDQVNUX0dST1VQICgxPDw2KQorI2RlZmluZSBTRUNfTEVWRUwgICAgICAgICAoMTw8NykKKyNkZWZpbmUgU0VDX0VOQUJMRUQgICAgICAgKDE8PDgpCisKKyNkZWZpbmUgU0VDX0xFVkVMXzAgICAgICAwIC8qIE5vbmUgKi8KKyNkZWZpbmUgU0VDX0xFVkVMXzEgICAgICAxIC8qIFdFUCA0MCBhbmQgMTA0IGJpdCAqLworI2RlZmluZSBTRUNfTEVWRUxfMiAgICAgIDIgLyogTGV2ZWwgMSArIFRLSVAgKi8KKyNkZWZpbmUgU0VDX0xFVkVMXzJfQ0tJUCAzIC8qIExldmVsIDEgKyBDS0lQICovCisjZGVmaW5lIFNFQ19MRVZFTF8zICAgICAgNCAvKiBMZXZlbCAyICsgQ0NNUCAqLworCisjZGVmaW5lIFdFUF9LRVlTIDQKKyNkZWZpbmUgV0VQX0tFWV9MRU4gMTMKKworI2RlZmluZSBXRVBfS0VZX0xFTl9NT0RJRiAzMgorCitzdHJ1Y3QgaWVlZTgwMjExX3NlY3VyaXR5IHsKKwl1MTYgYWN0aXZlX2tleToyLAorICAgICAgICAgICAgZW5hYmxlZDoxLAorCSAgICBhdXRoX21vZGU6MiwKKyAgICAgICAgICAgIGF1dGhfYWxnbzo0LAorICAgICAgICAgICAgdW5pY2FzdF91c2VzX2dyb3VwOjE7CisJdTgga2V5X3NpemVzW1dFUF9LRVlTXTsKKwl1OCBrZXlzW1dFUF9LRVlTXVtXRVBfS0VZX0xFTl9NT0RJRl07CisJdTggbGV2ZWw7CisJdTE2IGZsYWdzOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKworLyoKKworIDgwMi4xMSBkYXRhIGZyYW1lIGZyb20gQVAKKworICAgICAgLC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCitCeXRlcyB8ICAyICAgfCAgMiAgIHwgICAgNiAgICB8ICAgIDYgICAgfCAgICA2ICAgIHwgIDIgICB8IDAuLjIzMTIgfCAgIDQgIHwKKyAgICAgIHwtLS0tLS18LS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLS18LS0tLS0tLS0tfC0tLS0tLXwtLS0tLS0tLS18LS0tLS0tfAorRGVzYy4gfCBjdHJsIHwgZHVyYSB8ICBEQS9SQSAgfCAgIFRBICAgIHwgICAgU0EgICB8IFNlcXUgfCAgZnJhbWUgIHwgIGZjcyB8CisgICAgICB8ICAgICAgfCB0aW9uIHwgKEJTU0lEKSB8ICAgICAgICAgfCAgICAgICAgIHwgZW5jZSB8ICBkYXRhICAgfCAgICAgIHwKKyAgICAgIGAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tJworCitUb3RhbDogMjgtMjM0MCBieXRlcworCisqLworCitzdHJ1Y3QgaWVlZTgwMjExX2hlYWRlcl9kYXRhIHsKKwl1MTYgZnJhbWVfY3RsOworCXUxNiBkdXJhdGlvbl9pZDsKKwl1OCBhZGRyMVs2XTsKKwl1OCBhZGRyMls2XTsKKwl1OCBhZGRyM1s2XTsKKwl1MTYgc2VxX2N0cmw7Cit9OworCisjZGVmaW5lIEJFQUNPTl9QUk9CRV9TU0lEX0lEX1BPU0lUSU9OIDEyCisKKy8qIE1hbmFnZW1lbnQgRnJhbWUgSW5mb3JtYXRpb24gRWxlbWVudCBUeXBlcyAqLworI2RlZmluZSBNRklFX1RZUEVfU1NJRCAgICAgICAwCisjZGVmaW5lIE1GSUVfVFlQRV9SQVRFUyAgICAgIDEKKyNkZWZpbmUgTUZJRV9UWVBFX0ZIX1NFVCAgICAgMgorI2RlZmluZSBNRklFX1RZUEVfRFNfU0VUICAgICAzCisjZGVmaW5lIE1GSUVfVFlQRV9DRl9TRVQgICAgIDQKKyNkZWZpbmUgTUZJRV9UWVBFX1RJTSAgICAgICAgNQorI2RlZmluZSBNRklFX1RZUEVfSUJTU19TRVQgICA2CisjZGVmaW5lIE1GSUVfVFlQRV9DT1VOVFJZICA3IC8vK1lKLDA4MDYyNQorI2RlZmluZSBNRklFX1RZUEVfQ0hBTExFTkdFICAxNgorI2RlZmluZSBNRklFX1RZUEVfRVJQICAgICAgICA0MgorI2RlZmluZSBNRklFX1RZUEVfUlNOCSAgICAgNDgKKyNkZWZpbmUgTUZJRV9UWVBFX1JBVEVTX0VYICAgNTAKKyNkZWZpbmUgTUZJRV9UWVBFX0dFTkVSSUMgICAgMjIxCisKKyNpZmRlZiBFTkFCTEVfRE9UMTFECit0eXBlZGVmIGVudW0KK3sKKwlDT1VOVFJZX0NPREVfRkNDID0gMCwKKwlDT1VOVFJZX0NPREVfSUMgPSAxLAorCUNPVU5UUllfQ09ERV9FVFNJID0gMiwKKwlDT1VOVFJZX0NPREVfU1BBSU4gPSAzLAorCUNPVU5UUllfQ09ERV9GUkFOQ0UgPSA0LAorCUNPVU5UUllfQ09ERV9NS0sgPSA1LAorCUNPVU5UUllfQ09ERV9NS0sxID0gNiwKKwlDT1VOVFJZX0NPREVfSVNSQUVMID0gNywKKwlDT1VOVFJZX0NPREVfVEVMRUMgPSA4LAorCUNPVU5UUllfQ09ERV9HTE9CQUxfRE9NQUlOID0gOSwKKwlDT1VOVFJZX0NPREVfV09STERfV0lERV8xM19JTkRFWCA9IDEwCit9Y291bnRyeV9jb2RlX3R5cGVfdDsKKyNlbmRpZgorCitzdHJ1Y3QgaWVlZTgwMjExX2luZm9fZWxlbWVudF9oZHIgeworCXU4IGlkOworCXU4IGxlbjsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgaWVlZTgwMjExX2luZm9fZWxlbWVudCB7CisJdTggaWQ7CisJdTggbGVuOworCXU4IGRhdGFbMF07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyoKKyAqIFRoZXNlIGFyZSB0aGUgZGF0YSB0eXBlcyB0aGF0IGNhbiBtYWtlIHVwIG1hbmFnZW1lbnQgcGFja2V0cworICoKKwl1MTYgYXV0aF9hbGdvcml0aG07CisJdTE2IGF1dGhfc2VxdWVuY2U7CisJdTE2IGJlYWNvbl9pbnRlcnZhbDsKKwl1MTYgY2FwYWJpbGl0eTsKKwl1OCBjdXJyZW50X2FwW0VUSF9BTEVOXTsKKwl1MTYgbGlzdGVuX2ludGVydmFsOworCXN0cnVjdCB7CisJCXUxNiBhc3NvY2lhdGlvbl9pZDoxNCwgcmVzZXJ2ZWQ6MjsKKwl9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKwl1MzIgdGltZV9zdGFtcFsyXTsKKwl1MTYgcmVhc29uOworCXUxNiBzdGF0dXM7CisqLworCisjZGVmaW5lIElFRUU4MDIxMV9ERUZBVUxUX1RYX0VTU0lEICJQZW5ndWluIgorI2RlZmluZSBJRUVFODAyMTFfREVGQVVMVF9CQVNJQ19SQVRFIDEwCisKK3N0cnVjdCBpZWVlODAyMTFfYXV0aGVudGljYXRpb24geworCXN0cnVjdCBpZWVlODAyMTFfaGVhZGVyX2RhdGEgaGVhZGVyOworCXUxNiBhbGdvcml0aG07CisJdTE2IHRyYW5zYWN0aW9uOworCXUxNiBzdGF0dXM7CisJLy9zdHJ1Y3QgaWVlZTgwMjExX2luZm9fZWxlbWVudF9oZHIgaW5mb19lbGVtZW50OworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKworc3RydWN0IGllZWU4MDIxMV9wcm9iZV9yZXNwb25zZSB7CisJc3RydWN0IGllZWU4MDIxMV9oZWFkZXJfZGF0YSBoZWFkZXI7CisJdTMyIHRpbWVfc3RhbXBbMl07CisJdTE2IGJlYWNvbl9pbnRlcnZhbDsKKwl1MTYgY2FwYWJpbGl0eTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2luZm9fZWxlbWVudCBpbmZvX2VsZW1lbnQ7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IGllZWU4MDIxMV9wcm9iZV9yZXF1ZXN0IHsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hlYWRlcl9kYXRhIGhlYWRlcjsKKwkvKnN0cnVjdCBpZWVlODAyMTFfaW5mb19lbGVtZW50IGluZm9fZWxlbWVudDsqLworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBpZWVlODAyMTFfYXNzb2NfcmVxdWVzdF9mcmFtZSB7CisJc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgaGVhZGVyOworCXUxNiBjYXBhYmlsaXR5OworCXUxNiBsaXN0ZW5faW50ZXJ2YWw7CisJLy91OCBjdXJyZW50X2FwW0VUSF9BTEVOXTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2luZm9fZWxlbWVudF9oZHIgaW5mb19lbGVtZW50OworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBpZWVlODAyMTFfYXNzb2NfcmVzcG9uc2VfZnJhbWUgeworCXN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyIGhlYWRlcjsKKwl1MTYgY2FwYWJpbGl0eTsKKwl1MTYgc3RhdHVzOworCXUxNiBhaWQ7CisJc3RydWN0IGllZWU4MDIxMV9pbmZvX2VsZW1lbnQgaW5mb19lbGVtZW50OyAvKiBzdXBwb3J0ZWQgcmF0ZXMgKi8KK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgaWVlZTgwMjExX2Rpc2Fzc29jX2ZyYW1leworICAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciBoZWFkZXI7CisgICAgICAgIHUxNiAgICByZWFzb25jb2RlOworfV9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IGllZWU4MDIxMV90eGIgeworCXU4IG5yX2ZyYWdzOworCXU4IGVuY3J5cHRlZDsKKwl1MTYgcmVzZXJ2ZWQ7CisJdTE2IGZyYWdfc2l6ZTsKKwl1MTYgcGF5bG9hZF9zaXplOworCXN0cnVjdCBza19idWZmICpmcmFnbWVudHNbMF07Cit9OworCitzdHJ1Y3QgaWVlZTgwMjExX3dtbV9hY19wYXJhbSB7CisJdTggYWNfYWNpX2FjbV9haWZzbjsKKwl1OCBhY19lY3dtaW5fZWN3bWF4OworCXUxNiBhY190eG9wX2xpbWl0OworfTsKKworc3RydWN0IGllZWU4MDIxMV93bW1fdHNfaW5mbyB7CisJdTggYWNfZGlyX3RpZDsKKwl1OCBhY191cF9wc2I7CisJdTggcmVzZXJ2ZWQ7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IGllZWU4MDIxMV93bW1fdHNwZWNfZWxlbSB7CisJc3RydWN0IGllZWU4MDIxMV93bW1fdHNfaW5mbyB0c19pbmZvOworCXUxNiBub3JtX21zZHVfc2l6ZTsKKwl1MTYgbWF4X21zZHVfc2l6ZTsKKwl1MzIgbWluX3NlcnZfaW50ZXI7CisJdTMyIG1heF9zZXJ2X2ludGVyOworCXUzMiBpbmFjdF9pbnRlcjsKKwl1MzIgc3VzcGVuX2ludGVyOworCXUzMiBzZXJ2X3N0YXJ0X3RpbWU7CisJdTMyIG1pbl9kYXRhX3JhdGU7CisJdTMyIG1lYW5fZGF0YV9yYXRlOworCXUzMiBwZWFrX2RhdGFfcmF0ZTsKKwl1MzIgbWF4X2J1cnN0X3NpemU7CisJdTMyIGRlbGF5X2JvdW5kOworCXUzMiBtaW5fcGh5X3JhdGU7CisJdTE2IHN1cnBfYmFuZF9hbGxvdzsKKwl1MTYgbWVkaXVtX3RpbWU7Cit9X19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK2VudW0ge1dNTV9hbGxfZnJhbWUsIFdNTV90d29fZnJhbWUsIFdNTV9mb3VyX2ZyYW1lLCBXTU1fc2l4X2ZyYW1lfTsKKyNkZWZpbmUgTUFYX1NQX0xlbiAgKFdNTV9hbGxfZnJhbWUgPDwgNCkKKyNkZWZpbmUgSUVFRTgwMjExX1FPU19USUQgMHgwZgorI2RlZmluZSBRT1NfQ1RMX05PVENPTlRBSU5fQUNLICgweDAxIDw8IDUpCisKKy8qIFNXRUVQIFRBQkxFIEVOVFJJRVMgTlVNQkVSKi8KKyNkZWZpbmUgTUFYX1NXRUVQX1RBQl9FTlRSSUVTCQkgIDQyCisjZGVmaW5lIE1BWF9TV0VFUF9UQUJfRU5UUklFU19QRVJfUEFDS0VUICA3CisvKiBNQVhfUkFURVNfTEVOR1RIIG5lZWRzIHRvIGJlIDEyLiAgVGhlIHNwZWMgc2F5cyA4LCBhbmQgbWFueSBBUHMKKyAqIG9ubHkgdXNlIDgsIGFuZCB0aGVuIHVzZSBleHRlbmRlZCByYXRlcyBmb3IgdGhlIHJlbWFpbmluZyBzdXBwb3J0ZWQKKyAqIHJhdGVzLiAgT3RoZXIgQVBzLCBob3dldmVyLCBzdGljayBhbGwgb2YgdGhlaXIgc3VwcG9ydGVkIHJhdGVzIG9uIHRoZQorICogbWFpbiByYXRlcyBpbmZvcm1hdGlvbiBlbGVtZW50Li4uICovCisjZGVmaW5lIE1BWF9SQVRFU19MRU5HVEggICAgICAgICAgICAgICAgICAoKHU4KTEyKQorI2RlZmluZSBNQVhfUkFURVNfRVhfTEVOR1RIICAgICAgICAgICAgICAgKCh1OCkxNikKKyNkZWZpbmUgTUFYX05FVFdPUktfQ09VTlQgICAgICAgICAgICAgICAgICAxMjgKKy8vI2RlZmluZSBNQVhfQ0hBTk5FTF9OVU1CRVIgICAgICAgICAgICAgICAgIDE2MQorI2RlZmluZSBNQVhfQ0hBTk5FTF9OVU1CRVIgICAgICAgICAgICAgICAgIDE2NSAvL1lKLG1vZGlmaWVkLDA4MDYyNQorI2RlZmluZSBNQVhfSUVfTEVOCQkJCQkJMHhGRiAvLytZSiwwODA2MjUKKwordHlwZWRlZiBzdHJ1Y3QgX0NIQU5ORUxfTElTVHsKKwl1OAlDaGFubmVsW01BWF9DSEFOTkVMX05VTUJFUiArIDFdOworCXU4CUxlbjsKK31DSEFOTkVMX0xJU1QsICpQQ0hBTk5FTF9MSVNUOworCisjZGVmaW5lIElFRUU4MDIxMV9TT0ZUTUFDX1NDQU5fVElNRQkgIDEwMC8vNDAwCisvLyhIWiAvIDIpCisvL2J5IGFteSBmb3IgcHMKKyNkZWZpbmUgSUVFRTgwMjExX1dBVENIX0RPR19USU1FICAgIDIwMDAKKy8vYnkgYW15IGZvciBwcworLy9ieSBhbXkgZm9yIGFudGVubmEKKyNkZWZpbmUgQU5URU5OQV9ESVZFUlNJVFlfVElNRVJfUEVSSU9ECQkxMDAwIC8vIDEwMDAgbQorLy9ieSBhbXkgZm9yIGFudGVubmEKKyNkZWZpbmUgSUVFRTgwMjExX1NPRlRNQUNfQVNTT0NfUkVUUllfVElNRSAoSFogKiAyKQorCisjZGVmaW5lIENSQ19MRU5HVEggICAgICAgICAgICAgICAgIDRVCisKKyNkZWZpbmUgTUFYX1dQQV9JRV9MRU4gNjQKKworI2RlZmluZSBORVRXT1JLX0VNUFRZX0VTU0lEICgxPDwwKQorI2RlZmluZSBORVRXT1JLX0hBU19PRkRNICAgICgxPDwxKQorI2RlZmluZSBORVRXT1JLX0hBU19DQ0sgICAgICgxPDwyKQorCisjZGVmaW5lIElFRUU4MDIxMV9EVElNX01CQ0FTVCA0CisjZGVmaW5lIElFRUU4MDIxMV9EVElNX1VDQVNUIDIKKyNkZWZpbmUgSUVFRTgwMjExX0RUSU1fVkFMSUQgMQorI2RlZmluZSBJRUVFODAyMTFfRFRJTV9JTlZBTElEIDAKKworI2RlZmluZSBJRUVFODAyMTFfUFNfRElTQUJMRUQgMAorI2RlZmluZSBJRUVFODAyMTFfUFNfVU5JQ0FTVCBJRUVFODAyMTFfRFRJTV9VQ0FTVAorI2RlZmluZSBJRUVFODAyMTFfUFNfTUJDQVNUIElFRUU4MDIxMV9EVElNX01CQ0FTVAorI2RlZmluZSBJRUVFODAyMTFfUFNfRU5BQkxFICAgSUVFRTgwMjExX0RUSU1fVkFMSUQKKy8vYWRkZWQgYnkgRGF2aWQgZm9yIFFvUyAyMDA2LzYvMzAKKy8vI2RlZmluZSBXTU1fSGFuZ184MTg3CisjaWZkZWYgV01NX0hhbmdfODE4NworI3VuZGVmIFdNTV9IYW5nXzgxODcKKyNlbmRpZgorCisjZGVmaW5lIFdNRV9BQ19CRSAgIDB4MDAKKyNkZWZpbmUgV01FX0FDX0JLICAgMHgwMQorI2RlZmluZSBXTUVfQUNfVkkgICAweDAyCisjZGVmaW5lIFdNRV9BQ19WTyAgIDB4MDMKKyNkZWZpbmUgV01FX0FDSV9NQVNLIDB4MDMKKyNkZWZpbmUgV01FX0FJRlNOX01BU0sgMHgwMworI2RlZmluZSBXTUVfQUNfUFJBTV9MRU4gMTYKKworLy9VUCBNYXBwaW5nIHRvIEFDLCB1c2luZyBpbiBNZ250UXVlcnlfU2VxdWVuY2VOdW1iZXIoKSBhbmQgbWF5YmUgZm9yIERTQ1AKKy8vI2RlZmluZSBVUDJBQyh1cCkJKCh1cDwzKSA/ICgodXA9PTApPzE6MCkgOiAodXA+PjEpKQorI2RlZmluZSBVUDJBQyh1cCkgKAkJICAgXAorCSgodXApIDwgMSkgPyBXTUVfQUNfQkUgOiBcCisJKCh1cCkgPCAzKSA/IFdNRV9BQ19CSyA6IFwKKwkoKHVwKSA8IDQpID8gV01FX0FDX0JFIDogXAorCSgodXApIDwgNikgPyBXTUVfQUNfVkkgOiBcCisJV01FX0FDX1ZPKQorLy9BQyBNYXBwaW5nIHRvIFVQLCB1c2luZyBpbiBUeCBwYXJ0IGZvciBzZWxlY3RpbmcgdGhlIGNvcnJlc3BvbmRpbmcgVFggcXVldWUKKyNkZWZpbmUgQUMyVVAoX2FjKQkoICAgICAgIFwKKwkoKF9hYykgPT0gV01FX0FDX1ZPKSA/IDYgOiBcCisJKChfYWMpID09IFdNRV9BQ19WSSkgPyA1IDogXAorCSgoX2FjKSA9PSBXTUVfQUNfQkspID8gMSA6IFwKKwkwKQorCisjZGVmaW5lCUVUSEVSX0FERFJfTEVOCQk2CS8qIGxlbmd0aCBvZiBhbiBFdGhlcm5ldCBhZGRyZXNzICovCitzdHJ1Y3QJZXRoZXJfaGVhZGVyIHsKKwl1OCBldGhlcl9kaG9zdFtFVEhFUl9BRERSX0xFTl07CisJdTggZXRoZXJfc2hvc3RbRVRIRVJfQUREUl9MRU5dOworCXUxNiBldGhlcl90eXBlOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworI2lmbmRlZiBFVEhFUlRZUEVfUEFFCisjZGVmaW5lCUVUSEVSVFlQRV9QQUUJMHg4ODhlCQkvKiBFQVBPTCBQQUUvODAyLjF4ICovCisjZW5kaWYKKyNpZm5kZWYgRVRIRVJUWVBFX0lQCisjZGVmaW5lCUVUSEVSVFlQRV9JUAkweDA4MDAJCS8qIElQIHByb3RvY29sICovCisjZW5kaWYKKworc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrIHsKKwkvKiBUaGVzZSBlbnRyaWVzIGFyZSB1c2VkIHRvIGlkZW50aWZ5IGEgdW5pcXVlIG5ldHdvcmsgKi8KKwl1OCBic3NpZFtFVEhfQUxFTl07CisJdTggY2hhbm5lbDsKKwkvKiBFbnN1cmUgbnVsbC10ZXJtaW5hdGVkIGZvciBhbnkgZGVidWcgbXNncyAqLworCXU4IHNzaWRbSVdfRVNTSURfTUFYX1NJWkUgKyAxXTsKKwl1OCBzc2lkX2xlbjsKKworCS8qIFRoZXNlIGFyZSBuZXR3b3JrIHN0YXRpc3RpY3MgKi8KKwlzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzIHN0YXRzOworCXUxNiBjYXBhYmlsaXR5OworCXU4IHJhdGVzW01BWF9SQVRFU19MRU5HVEhdOworCXU4IHJhdGVzX2xlbjsKKwl1OCByYXRlc19leFtNQVhfUkFURVNfRVhfTEVOR1RIXTsKKwl1OCByYXRlc19leF9sZW47CisJdW5zaWduZWQgbG9uZyBsYXN0X3NjYW5uZWQ7CisJdTggbW9kZTsKKwl1OCBmbGFnczsKKwl1MzIgbGFzdF9hc3NvY2lhdGU7CisJdTMyIHRpbWVfc3RhbXBbMl07CisJdTE2IGJlYWNvbl9pbnRlcnZhbDsKKwl1MTYgbGlzdGVuX2ludGVydmFsOworCXUxNiBhdGltX3dpbmRvdzsKKwl1OCB3cGFfaWVbTUFYX1dQQV9JRV9MRU5dOworCXNpemVfdCB3cGFfaWVfbGVuOworCXU4IHJzbl9pZVtNQVhfV1BBX0lFX0xFTl07CisJc2l6ZV90IHJzbl9pZV9sZW47CisJdTggZHRpbV9wZXJpb2Q7CisJdTggZHRpbV9kYXRhOworCXUzMiBsYXN0X2R0aW1fc3RhX3RpbWVbMl07CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCS8vYXBwZWRlZCBmb3IgUW9TCisJdTggd21tX2luZm87CisJc3RydWN0IGllZWU4MDIxMV93bW1fYWNfcGFyYW0gd21tX3BhcmFtWzRdOworCXU4IFFvU19FbmFibGU7CisJdTggU2lnbmFsU3RyZW5ndGg7CisvL2J5IGFteSAwODAzMTIKKwl1OCBIaWdoZXN0T3BlcmFSYXRlOworLy9ieSBhbXkgMDgwMzEyCisjaWZkZWYgVEhPTUFTX1RVUkJPCisJdTggVHVyYm9fRW5hYmxlOy8vZW5hYmxlIHR1cmJvIG1vZGUsIGFkZGVkIGJ5IHRob21hcworI2VuZGlmCisjaWZkZWYgRU5BQkxFX0RPVDExRAorCXUxNiBDb3VudHJ5SWVMZW47CisJdTggQ291bnRyeUllQnVmW01BWF9JRV9MRU5dOworI2VuZGlmCit9OworCitlbnVtIGllZWU4MDIxMV9zdGF0ZSB7CisKKwkvKiB0aGUgY2FyZCBpcyBub3QgbGlua2VkIGF0IGFsbCAqLworCUlFRUU4MDIxMV9OT0xJTksgPSAwLAorCisJLyogSUVFRTgwMjExX0FTU09DSUFUSU5HKiBhcmUgZm9yIEJTUyBjbGllbnQgbW9kZQorCSAqIHRoZSBkcml2ZXIgc2hhbGwgbm90IHBlcmZvcm0gUlggZmlsdGVyaW5nIHVubGVzcworCSAqIHRoZSBzdGF0ZSBpcyBMSU5LRUQuCisJICogVGhlIGRyaXZlciBzaGFsbCBqdXN0IGNoZWNrIGZvciB0aGUgc3RhdGUgTElOS0VEIGFuZAorCSAqIGRlZmF1bHRzIHRvIE5PTElOSyBmb3IgQUxMIHRoZSBvdGhlciBzdGF0ZXMgKGluY2x1ZGluZworCSAqIExJTktFRF9TQ0FOTklORykKKwkgKi8KKworCS8qIHRoZSBhc3NvY2lhdGlvbiBwcm9jZWR1cmUgd2lsbCBzdGFydCAod3Egc2NoZWR1bGluZykqLworCUlFRUU4MDIxMV9BU1NPQ0lBVElORywKKwlJRUVFODAyMTFfQVNTT0NJQVRJTkdfUkVUUlksCisKKwkvKiB0aGUgYXNzb2NpYXRpb24gcHJvY2VkdXJlIGlzIHNlbmRpbmcgQVVUSCByZXF1ZXN0Ki8KKwlJRUVFODAyMTFfQVNTT0NJQVRJTkdfQVVUSEVOVElDQVRJTkcsCisKKwkvKiB0aGUgYXNzb2NpYXRpb24gcHJvY2VkdXJlIGhhcyBzdWNjZXNzZnVsbHkgYXV0aGVudGNhdGVkCisJICogYW5kIGlzIHNlbmRpbmcgYXNzb2NpYXRpb24gcmVxdWVzdAorCSAqLworCUlFRUU4MDIxMV9BU1NPQ0lBVElOR19BVVRIRU5USUNBVEVELAorCisJLyogdGhlIGxpbmsgaXMgb2suIHRoZSBjYXJkIGFzc29jaWF0ZWQgdG8gYSBCU1Mgb3IgbGlua2VkCisJICogdG8gYSBpYnNzIGNlbGwgb3IgYWN0aW5nIGFzIGFuIEFQIGFuZCBjcmVhdGluZyB0aGUgYnNzCisJICovCisJSUVFRTgwMjExX0xJTktFRCwKKworCS8qIHNhbWUgYXMgTElOS0VELCBidXQgdGhlIGRyaXZlciBzaGFsbCBhcHBseSBSWCBmaWx0ZXIKKwkgKiBydWxlcyBhcyB3ZSBhcmUgaW4gTk9fTElOSyBtb2RlLiBBcyB0aGUgY2FyZCBpcyBzdGlsbAorCSAqIGxvZ2ljYWxseSBsaW5rZWQsIGJ1dCBpdCBpcyBkb2luZyBhIHN5bmNybyBzaXRlIHN1cnZleQorCSAqIHRoZW4gaXQgd2lsbCBiZSBiYWNrIHRvIExJTktFRCBzdGF0ZS4KKwkgKi8KKwlJRUVFODAyMTFfTElOS0VEX1NDQU5OSU5HLAorCit9OworCisjZGVmaW5lIERFRkFVTFRfTUFYX1NDQU5fQUdFICgxNSAqIEhaKQorI2RlZmluZSBERUZBVUxUX0ZUUyAyMzQ2CisjZGVmaW5lIE1BQ19GTVQgIiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IgorI2RlZmluZSBNQUNfQVJHKHgpICgodTgqKSh4KSlbMF0sKCh1OCopKHgpKVsxXSwoKHU4KikoeCkpWzJdLCgodTgqKSh4KSlbM10sKCh1OCopKHgpKVs0XSwoKHU4KikoeCkpWzVdCisKKworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPD0gS0VSTkVMX1ZFUlNJT04oMiw2LDExKSkKK2V4dGVybiBpbmxpbmUgaW50IGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKGNvbnN0IHU4ICphZGRyKQoreworICAgICAgICByZXR1cm4gKChhZGRyWzBdICE9IDB4ZmYpICYmICgweDAxICYgYWRkclswXSkpOworfQorI2VuZGlmCisKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDw9IEtFUk5FTF9WRVJTSU9OKDIsNiwxMykpCitleHRlcm4gaW5saW5lIGludCBpc19icm9hZGNhc3RfZXRoZXJfYWRkcihjb25zdCB1OCAqYWRkcikKK3sKKwlyZXR1cm4gKChhZGRyWzBdID09IDB4ZmYpICYmIChhZGRyWzFdID09IDB4ZmYpICYmIChhZGRyWzJdID09IDB4ZmYpICYmICAgXAorCQkoYWRkclszXSA9PSAweGZmKSAmJiAoYWRkcls0XSA9PSAweGZmKSAmJiAoYWRkcls1XSA9PSAweGZmKSk7Cit9CisjZW5kaWYKKworI2RlZmluZSBDRkdfSUVFRTgwMjExX1JFU0VSVkVfRkNTICgxPDwwKQorI2RlZmluZSBDRkdfSUVFRTgwMjExX0NPTVBVVEVfRkNTICgxPDwxKQorCit0eXBlZGVmIHN0cnVjdCB0eF9wZW5kaW5nX3R7CisJaW50IGZyYWc7CisJc3RydWN0IGllZWU4MDIxMV90eGIgKnR4YjsKK310eF9wZW5kaW5nX3Q7CisKKworc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgeworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisKKwkvKiBCb29ra2VlcGluZyBzdHJ1Y3R1cmVzICovCisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CisJc3RydWN0IGllZWU4MDIxMV9zdGF0cyBpZWVlX3N0YXRzOworCXN0cnVjdCBpZWVlODAyMTFfc29mdG1hY19zdGF0cyBzb2Z0bWFjX3N0YXRzOworCisJLyogUHJvYmUgLyBCZWFjb24gbWFuYWdlbWVudCAqLworCXN0cnVjdCBsaXN0X2hlYWQgbmV0d29ya19mcmVlX2xpc3Q7CisJc3RydWN0IGxpc3RfaGVhZCBuZXR3b3JrX2xpc3Q7CisJc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpuZXR3b3JrczsKKwlpbnQgc2NhbnM7CisJaW50IHNjYW5fYWdlOworCisJaW50IGl3X21vZGU7IC8qIG9wZXJhdGluZyBtb2RlIChJV19NT0RFXyopICovCisKKwlzcGlubG9ja190IGxvY2s7CisJc3BpbmxvY2tfdCB3cGF4X3N1aXRsaXN0X2xvY2s7CisKKwlpbnQgdHhfaGVhZHJvb207IC8qIFNldCB0byBzaXplIG9mIGFueSBhZGRpdGlvbmFsIHJvb20gbmVlZGVkIGF0IGZyb250CisJCQkgICogb2YgYWxsb2NhdGVkIFR4IFNLQnMgKi8KKwl1MzIgY29uZmlnOworCisJLyogV0VQIGFuZCBvdGhlciBlbmNyeXB0aW9uIHJlbGF0ZWQgc2V0dGluZ3MgYXQgdGhlIGRldmljZSBsZXZlbCAqLworCWludCBvcGVuX3dlcDsgLyogU2V0IHRvIDEgdG8gYWxsb3cgdW5lbmNyeXB0ZWQgZnJhbWVzICovCisKKwlpbnQgcmVzZXRfb25fa2V5Y2hhbmdlOyAvKiBTZXQgdG8gMSBpZiB0aGUgSFcgbmVlZHMgdG8gYmUgcmVzZXQgb24KKwkJCQkgKiBXRVAga2V5IGNoYW5nZXMgKi8KKworCS8qIElmIHRoZSBob3N0IHBlcmZvcm1zIHtlbixkZX1jcnlwdGlvbiwgdGhlbiBzZXQgdG8gMSAqLworCWludCBob3N0X2VuY3J5cHQ7CisJaW50IGhvc3RfZGVjcnlwdDsKKwlpbnQgaWVlZTgwMl8xeDsgLyogaXMgSUVFRSA4MDIuMVggdXNlZCAqLworCisJLyogV1BBIGRhdGEgKi8KKwlpbnQgd3BhX2VuYWJsZWQ7CisJaW50IGRyb3BfdW5lbmNyeXB0ZWQ7CisJaW50IHRraXBfY291bnRlcm1lYXN1cmVzOworCWludCBwcml2YWN5X2ludm9rZWQ7CisJc2l6ZV90IHdwYV9pZV9sZW47CisJdTggKndwYV9pZTsKKworCXU4IGFwX21hY19hZGRyWzZdOworCXUxNiBwYWlyd2lzZV9rZXlfdHlwZTsKKwl1MTYgYnJvYWRjYXN0X2tleV90eXBlOworCisJc3RydWN0IGxpc3RfaGVhZCBjcnlwdF9kZWluaXRfbGlzdDsKKwlzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEgKmNyeXB0W1dFUF9LRVlTXTsKKwlpbnQgdHhfa2V5aWR4OyAvKiBkZWZhdWx0IFRYIGtleSBpbmRleCAoY3J5cHRbdHhfa2V5aWR4XSkgKi8KKwlzdHJ1Y3QgdGltZXJfbGlzdCBjcnlwdF9kZWluaXRfdGltZXI7CisKKwlpbnQgYmNyeF9zdGFfa2V5OyAvKiB1c2UgaW5kaXZpZHVhbCBrZXlzIHRvIG92ZXJyaWRlIGRlZmF1bHQga2V5cyBldmVuCisJCQkgICAqIHdpdGggUlggb2YgYnJvYWQvbXVsdGljYXN0IGZyYW1lcyAqLworCisJLyogRnJhZ21lbnRhdGlvbiBzdHJ1Y3R1cmVzICovCisJLy8gZWFjaCBzdHJlYW1pbmcgY29udGFpbiBhIGVudHJ5CisJc3RydWN0IGllZWU4MDIxMV9mcmFnX2VudHJ5IGZyYWdfY2FjaGVbMTddW0lFRUU4MDIxMV9GUkFHX0NBQ0hFX0xFTl07CisJdW5zaWduZWQgaW50IGZyYWdfbmV4dF9pZHhbMTddOworCXUxNiBmdHM7IC8qIEZyYWdtZW50YXRpb24gVGhyZXNob2xkICovCisKKwkvKiBUaGlzIHN0b3JlcyBpbmZvcyBmb3IgdGhlIGN1cnJlbnQgbmV0d29yay4KKwkgKiBFaXRoZXIgdGhlIG5ldHdvcmsgd2UgYXJlIGFzc29jaWF0ZWQgaW4gSU5GUkFTVFJVQ1RVUkUKKwkgKiBvciB0aGUgbmV0d29yayB0aGF0IHdlIGFyZSBjcmVhdGluZyBpbiBNQVNURVIgbW9kZS4KKwkgKiBhZC1ob2MgaXMgYSBtaXh0dXJlIDstKS4KKwkgKiBOb3RlIHRoYXQgaW4gaW5mcmFzdHJ1Y3R1cmUgbW9kZSwgZXZlbiB3aGVuIG5vdCBhc3NvY2lhdGVkLAorCSAqIGZpZWxkcyBic3NpZCBhbmQgZXNzaWQgbWF5IGJlIHZhbGlkIChpZiB3cGFfc2V0IGFuZCBlc3NpZF9zZXQKKwkgKiBhcmUgdHJ1ZSkgYXMgdGh5IGNhcnJ5IHRoZSB2YWx1ZSBzZXQgYnkgdGhlIHVzZXIgdmlhIGl3Y29uZmlnCisJICovCisJc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrIGN1cnJlbnRfbmV0d29yazsKKworCisJZW51bSBpZWVlODAyMTFfc3RhdGUgc3RhdGU7CisKKwlpbnQgc2hvcnRfc2xvdDsKKwlpbnQgbW9kZTsgICAgICAgLyogQSwgQiwgRyAqLworCWludCBtb2R1bGF0aW9uOyAvKiBDQ0ssIE9GRE0gKi8KKwlpbnQgZnJlcV9iYW5kOyAgLyogMi40R2h6LCA1LjJHaHosIE1peGVkICovCisJaW50IGFiZ190cnVlOyAgIC8qIEFCRyBmbGFnICAgICAgICAgICAgICAqLworCisJLyogdXNlZCBmb3IgZm9yY2luZyB0aGUgaWJzcyB3b3JrcXVldWUgdG8gdGVybWluYXRlCisJICogd2l0aG91dCB3YWl0IGZvciB0aGUgc3luY3JvIHNjYW4gdG8gdGVybWluYXRlCisJICovCisJc2hvcnQgc3luY19zY2FuX2h1cnJ5dXA7CisKKyNpZmRlZiBFTkFCTEVfRE9UMTFECisJdm9pZCAqIHBEb3QxMWRJbmZvOworCWJvb2wgYkdsb2JhbERvbWFpbjsKKworCS8vIEZvciBMaXRlb24gQ2gxMn4xMyBwYXNzaXZlIHNjYW4KKwl1OAlNaW5QYXNzaXZlQ2hubE51bTsKKwl1OAlJYnNzU3RhcnRDaG5sOworI2Vsc2UKKwkvKiBtYXAgb2YgYWxsb3dlZCBjaGFubmVscy4gMCBpcyBkdW1teSAqLworCS8vIEZJWE1FOiByZW1lYmVyIHRvIGRlZmF1bHQgdG8gYSBiYXNpYyBjaGFubmVsIHBsYW4gZGVwZW5kaW5nIG9mIHRoZSBQSFkgdHlwZQorCWludCBjaGFubmVsX21hcFtNQVhfQ0hBTk5FTF9OVU1CRVIrMV07CisjZW5kaWYKKworCWludCByYXRlOyAgICAgICAvKiBjdXJyZW50IHJhdGUgKi8KKwlpbnQgYmFzaWNfcmF0ZTsKKwkvL0ZJWE1FOiBwbGVhY2UgY2FsbGJhY2ssIHNlZSBpZiByZWR1bmRhbnQgd2l0aCBzb2Z0bWFjX2ZlYXR1cmVzCisJc2hvcnQgYWN0aXZlX3NjYW47CisKKwkvKiB0aGlzIGNvbnRhaW5zIGZsYWdzIGZvciBzZWxlY3RpdmVseSBlbmFibGUgc29mdG1hYyBzdXBwb3J0ICovCisJdTE2IHNvZnRtYWNfZmVhdHVyZXM7CisKKwkvKiBpZiB0aGUgc2VxdWVuY2UgY29udHJvbCBmaWVsZCBpcyBub3QgZmlsbGVkIGJ5IEhXICovCisJdTE2IHNlcV9jdHJsWzVdOworCisJLyogYXNzb2NpYXRpb24gcHJvY2VkdXJlIHRyYW5zYWN0aW9uIHNlcXVlbmNlIG51bWJlciAqLworCXUxNiBhc3NvY2lhdGVfc2VxOworCisJLyogQUlEIGZvciBSVFhlZCBhc3NvY2lhdGlvbiByZXNwb25zZXMgKi8KKwl1MTYgYXNzb2NfaWQ7CisKKwkvKiBwb3dlciBzYXZlIG1vZGUgcmVsYXRlZCovCisJc2hvcnQgcHM7CisJc2hvcnQgc3RhX3NsZWVwOworCWludCBwc190aW1lb3V0OworCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCBwc190YXNrOworCXUzMiBwc190aDsKKwl1MzIgcHNfdGw7CisKKwlzaG9ydCByYXdfdHg7CisJLyogdXNlZCBpZiBJRUVFX1NPRlRNQUNfVFhfUVVFVUUgaXMgc2V0ICovCisJc2hvcnQgcXVldWVfc3RvcDsKKwlzaG9ydCBzY2FubmluZzsKKwlzaG9ydCBwcm90b19zdGFydGVkOworCisJc3RydWN0IHNlbWFwaG9yZSB3eF9zZW07CisJc3RydWN0IHNlbWFwaG9yZSBzY2FuX3NlbTsKKworCXNwaW5sb2NrX3QgbWdtdF90eF9sb2NrOworCXNwaW5sb2NrX3QgYmVhY29uX2xvY2s7CisKKwlzaG9ydCBiZWFjb25fdHhpbmc7CisKKwlzaG9ydCB3YXBfc2V0OworCXNob3J0IHNzaWRfc2V0OworCisJdTggIHdwYXhfdHlwZV9zZXQ7ICAgIC8ve2FkZGVkIGJ5IERhdmlkLCAyMDA2LjkuMjh9CisJdTMyIHdwYXhfdHlwZV9ub3RpZnk7IC8ve2FkZGVkIGJ5IERhdmlkLCAyMDA2LjkuMjZ9CisKKwkvKiBRb1MgcmVsYXRlZCBmbGFnICovCisJY2hhciBpbml0X3dtbXBhcmFtX2ZsYWc7CisKKwkvKiBmb3IgZGlzY2FyZGluZyBkdXBsaWNhdGVkIHBhY2tldHMgaW4gSUJTUyAqLworCXN0cnVjdCBsaXN0X2hlYWQgaWJzc19tYWNfaGFzaFtJRUVFX0lCU1NfTUFDX0hBU0hfU0laRV07CisKKwkvKiBmb3IgZGlzY2FyZGluZyBkdXBsaWNhdGVkIHBhY2tldHMgaW4gQlNTICovCisJdTE2IGxhc3RfcnhzZXFfbnVtWzE3XTsgLyogcnggc2VxIHByZXZpb3VzIHBlci10aWQgKi8KKwl1MTYgbGFzdF9yeGZyYWdfbnVtWzE3XTsvKiB0eCBmcmFnIHByZXZpb3VzIHBlci10aWQgKi8KKwl1bnNpZ25lZCBsb25nIGxhc3RfcGFja2V0X3RpbWVbMTddOworCisJLyogZm9yIFBTIG1vZGUgKi8KKwl1bnNpZ25lZCBsb25nIGxhc3RfcnhfcHNfdGltZTsKKworCS8qIHVzZWQgaWYgSUVFRV9TT0ZUTUFDX1NJTkdMRV9RVUVVRSBpcyBzZXQgKi8KKwlzdHJ1Y3Qgc2tfYnVmZiAqbWdtdF9xdWV1ZV9yaW5nW01HTVRfUVVFVUVfTlVNXTsKKwlpbnQgbWdtdF9xdWV1ZV9oZWFkOworCWludCBtZ210X3F1ZXVlX3RhaWw7CisKKworCS8qIHVzZWQgaWYgSUVFRV9TT0ZUTUFDX1RYX1FVRVVFIGlzIHNldCAqLworCXN0cnVjdCAgdHhfcGVuZGluZ190IHR4X3BlbmRpbmc7CisKKwkvKiB1c2VkIGlmIElFRUVfU09GVE1BQ19BU1NPQ0lBVEUgaXMgc2V0ICovCisJc3RydWN0IHRpbWVyX2xpc3QgYXNzb2NpYXRlX3RpbWVyOworCisJLyogdXNlZCBpZiBJRUVFX1NPRlRNQUNfQkVBQ09OUyBpcyBzZXQgKi8KKwlzdHJ1Y3QgdGltZXJfbGlzdCBiZWFjb25fdGltZXI7CisKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgYXNzb2NpYXRlX2NvbXBsZXRlX3dxOworLy8Jc3RydWN0IHdvcmtfc3RydWN0IGFzc29jaWF0ZV9yZXRyeV93cTsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgYXNzb2NpYXRlX3Byb2NlZHVyZV93cTsKKy8vCXN0cnVjdCB3b3JrX3N0cnVjdCBzb2Z0bWFjX3NjYW5fd3E7CisJc3RydWN0IHdvcmtfc3RydWN0IHd4X3N5bmNfc2Nhbl93cTsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd21tX3BhcmFtX3VwZGF0ZV93cTsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgcHNfcmVxdWVzdF90eF9hY2tfd3E7Ly9mb3IgcHMKKy8vCXN0cnVjdCB3b3JrX3N0cnVjdCBod193YWtldXBfd3E7CisvLwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgaHdfc2xlZXBfd3E7CisvLwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd2F0Y2hfZG9nX3dxOworCWJvb2wgYkluYWN0aXZlUHM7CisJYm9vbCBhY3RzY2FubmluZzsKKwlib29sIGJlaW5yZXRyeTsKKwl1MTYgTGlzdGVuSW50ZXJ2YWw7CisJdW5zaWduZWQgbG9uZyBOdW1SeERhdGFJblBlcmlvZDsgLy9ZSixhZGQsMDgwODI4CisJdW5zaWduZWQgbG9uZyBOdW1SeEJjbkluUGVyaW9kOyAgLy9ZSixhZGQsMDgwODI4CisJdW5zaWduZWQgbG9uZyBOdW1SeE9rVG90YWw7CisJdW5zaWduZWQgbG9uZyBOdW1SeFVuaWNhc3Q7Ly9ZSixhZGQsMDgwODI4LGZvciBrZWVwIGFsaXZlCisJYm9vbCBiSHdSYWRpb09mZjsKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDIwKQorICAgICAgICBzdHJ1Y3QgZGVsYXllZF93b3JrIHNvZnRtYWNfc2Nhbl93cTsKKyAgICAgICAgc3RydWN0IGRlbGF5ZWRfd29yayBhc3NvY2lhdGVfcmV0cnlfd3E7CisJc3RydWN0IGRlbGF5ZWRfd29yayBod193YWtldXBfd3E7CisJc3RydWN0IGRlbGF5ZWRfd29yayBod19zbGVlcF93cTsvLytieSBhbXkgMDgwMzI0CisJc3RydWN0IGRlbGF5ZWRfd29yayB3YXRjaF9kb2dfd3E7CisJc3RydWN0IGRlbGF5ZWRfd29yayBzd19hbnRlbm5hX3dxOworCXN0cnVjdCBkZWxheWVkX3dvcmsgIHN0YXJ0X2lic3Nfd3E7CisvL2J5IGFteSBmb3IgcmF0ZSBhZGFwdGl2ZSAwODAzMTIKKyAgICBzdHJ1Y3QgZGVsYXllZF93b3JrIHJhdGVfYWRhcHRlcl93cTsKKy8vYnkgYW15IGZvciByYXRlIGFkYXB0aXZlCisJc3RydWN0IGRlbGF5ZWRfd29yayBod19kaWdfd3E7CisJc3RydWN0IGRlbGF5ZWRfd29yayB0eF9wd193cTsKKworLy9BZGRlZCBmb3IgUkYgcG93ZXIgb24gcG93ZXIgb2ZmIGJ5IGxpemhhb21pbmcgMDgwNTEyCisJc3RydWN0IGRlbGF5ZWRfd29yayBHUElPQ2hhbmdlUkZXb3JrSXRlbTsKKyNlbHNlCisKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgc3RhcnRfaWJzc193cTsKKyAgICAgICAgc3RydWN0IHdvcmtfc3RydWN0IHNvZnRtYWNfc2Nhbl93cTsKKyAgICAgICAgc3RydWN0IHdvcmtfc3RydWN0IGFzc29jaWF0ZV9yZXRyeV93cTsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgaHdfd2FrZXVwX3dxOworCXN0cnVjdCB3b3JrX3N0cnVjdCBod19zbGVlcF93cTsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd2F0Y2hfZG9nX3dxOworCXN0cnVjdCB3b3JrX3N0cnVjdCBzd19hbnRlbm5hX3dxOworLy9ieSBhbXkgZm9yIHJhdGUgYWRhcHRpdmUgMDgwMzEyCisgICAgc3RydWN0IHdvcmtfc3RydWN0IHJhdGVfYWRhcHRlcl93cTsKKy8vYnkgYW15IGZvciByYXRlIGFkYXB0aXZlCisJc3RydWN0IHdvcmtfc3RydWN0IGh3X2RpZ193cTsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgdHhfcHdfd3E7CisKKy8vQWRkZWQgZm9yIFJGIHBvd2VyIG9uIHBvd2VyIG9mZiBieSBsaXpoYW9taW5nIDA4MDUxMgorCXN0cnVjdCB3b3JrX3N0cnVjdCBHUElPQ2hhbmdlUkZXb3JrSXRlbTsKKyNlbmRpZgorCXN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICp3cTsKKworCS8qIENhbGxiYWNrIGZ1bmN0aW9ucyAqLworCXZvaWQgKCpzZXRfc2VjdXJpdHkpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgIHN0cnVjdCBpZWVlODAyMTFfc2VjdXJpdHkgKnNlYyk7CisKKwkvKiBVc2VkIHRvIFRYIGRhdGEgZnJhbWUgYnkgdXNpbmcgdHhiIHN0cnVjdHMuCisJICogdGhpcyBpcyBub3QgdXNlZCBpZiBpbiB0aGUgc29mdG1hY19mZWF0dXJlcworCSAqIGlzIHNldCB0aGUgZmxhZyBJRUVFX1NPRlRNQUNfVFhfUVVFVUUKKwkgKi8KKwlpbnQgKCpoYXJkX3N0YXJ0X3htaXQpKHN0cnVjdCBpZWVlODAyMTFfdHhiICp0eGIsCisJCQkgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKwlpbnQgKCpyZXNldF9wb3J0KShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworCS8qIFNvZnRtYWMtZ2VuZXJhdGVkIGZyYW1lcyAobWFtYWdlbWVudCkgYXJlIFRYZWQgdmlhIHRoaXMKKwkgKiBjYWxsYmFjayBpZiB0aGUgZmxhZyBJRUVFX1NPRlRNQUNfU0lOR0xFX1FVRVVFIGlzCisJICogbm90IHNldC4gQXMgc29tZSBjYXJkcyBtYXkgaGF2ZSBkaWZmZXJlbnQgSFcgcXVldWVzIHRoYXQKKwkgKiBvbmUgbWlnaHQgd2FudCB0byB1c2UgZm9yIGRhdGEgYW5kIG1hbmFnZW1lbnQgZnJhbWVzCisJICogdGhlIG9wdGlvbiB0byBoYXZlIHR3byBjYWxsYmFja3MgbWlnaHQgYmUgdXNlZnVsLgorCSAqIFRoaXMgZnVjbnRpb24gY2FuJ3Qgc2xlZXAuCisJICovCisJaW50ICgqc29mdG1hY19oYXJkX3N0YXJ0X3htaXQpKHN0cnVjdCBza19idWZmICpza2IsCisJCQkgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKwkvKiB1c2VkIGluc3RlYWQgb2YgaGFyZF9zdGFydF94bWl0IChub3Qgc29mdG1hY19oYXJkX3N0YXJ0X3htaXQpCisJICogaWYgdGhlIElFRUVfU09GVE1BQ19UWF9RVUVVRSBmZWF0dXJlIGlzIHVzZWQgdG8gVFggZGF0YQorCSAqIGZyYW1lcy4gSSB0aGUgb3B0aW9uIElFRUVfU09GVE1BQ19TSU5HTEVfUVVFVUUgaXMgYWxzbyBzZXQKKwkgKiB0aGVuIGFsc28gbWFuYWdlbWVudCBmcmFtZXMgYXJlIHNlbnQgdmlhIHRoaXMgY2FsbGJhY2suCisJICogVGhpcyBmdW5jdGlvbiBjYW4ndCBzbGVlcC4KKwkgKi8KKwl2b2lkICgqc29mdG1hY19kYXRhX2hhcmRfc3RhcnRfeG1pdCkoc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LGludCByYXRlKTsKKworCS8qIHN0b3BzIHRoZSBIVyBxdWV1ZSBmb3IgREFUQSBmcmFtZXMuIFVzZWZ1bCB0byBhdm9pZAorCSAqIHdhc3RlIHRpbWUgdG8gVFggZGF0YSBmcmFtZSB3aGVuIHdlIGFyZSByZWFzc29jaWF0aW5nCisJICogVGhpcyBmdW5jdGlvbiBjYW4gc2xlZXAuCisJICovCisJdm9pZCAoKmRhdGFfaGFyZF9zdG9wKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworCS8qIE9LIHRoaXMgaXMgY29tcGxlbWVudGFyIHRvIGRhdGFfcG9sbF9oYXJkX3N0b3AgKi8KKwl2b2lkICgqZGF0YV9oYXJkX3Jlc3VtZSkoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKwkvKiBhc2sgdG8gdGhlIGRyaXZlciB0byByZXR1bmUgdGhlIHJhZGlvIC4KKwkgKiBUaGlzIGZ1bmN0aW9uIGNhbiBzbGVlcC4gdGhlIGRyaXZlciBzaG91bGQgZW5zdXJlCisJICogdGhlIHJhZGlvIGhhcyBiZWVuIHN3aXRoY2VkIGJlZm9yZSByZXR1cm4uCisJICovCisJdm9pZCAoKnNldF9jaGFuKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LHNob3J0IGNoKTsKKworCS8qIFRoZXNlIGFyZSBub3QgdXNlZCBpZiB0aGUgaWVlZSBzdGFjayB0YWtlcyBjYXJlIG9mCisJICogc2Nhbm5pbmcgKElFRUVfU09GVE1BQ19TQ0FOIGZlYXR1cmUgc2V0KS4KKwkgKiBJbiB0aGlzIGNhc2Ugb25seSB0aGUgc2V0X2NoYW4gaXMgdXNlZC4KKwkgKgorCSAqIFRoZSBzeW5jcm8gdmVyc2lvbiBpcyBzaW1pbGFyIHRvIHRoZSBzdGFydF9zY2FuIGJ1dAorCSAqIGRvZXMgbm90IHJldHVybiB1bnRpbCBhbGwgY2hhbm5lbHMgaGFzIGJlZW4gc2Nhbm5lZC4KKwkgKiB0aGlzIGlzIGNhbGxlZCBpbiB1c2VyIGNvbnRleHQgYW5kIHNob3VsZCBzbGVlcCwKKwkgKiBpdCBpcyBjYWxsZWQgaW4gYSB3b3JrX3F1ZXVlIHdoZW4gc3dpdGhjaW5nIHRvIGFkLWhvYyBtb2RlCisJICogb3IgaW4gYmVoYWxmIG9mIGl3bGlzdCBzY2FuIHdoZW4gdGhlIGNhcmQgaXMgYXNzb2NpYXRlZAorCSAqIGFuZCByb290IHVzZXIgYXNrIGZvciBhIHNjYW4uCisJICogdGhlIGZ1Y250aW9uIHN0b3Bfc2NhbiBzaG91bGQgc3RvcCBib3RoIHRoZSBzeW5jcm8gYW5kCisJICogYmFja2dyb3VuZCBzY2FubmluZyBhbmQgY2FuIHNsZWVwLgorCSAqIFRoZSBmdWNudGlvbiBzdGFydF9zY2FuIHNob3VsZCBpbml0aWF0ZSB0aGUgYmFja2dyb3VuZAorCSAqIHNjYW5uaW5nIGFuZCBjYW4ndCBzbGVlcC4KKwkgKi8KKwl2b2lkICgqc2Nhbl9zeW5jcm8pKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCXZvaWQgKCpzdGFydF9zY2FuKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKwl2b2lkICgqc3RvcF9zY2FuKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworCS8qIGluZGljYXRlIHRoZSBkcml2ZXIgdGhhdCB0aGUgbGluayBzdGF0ZSBpcyBjaGFuZ2VkCisJICogZm9yIGV4YW1wbGUgaXQgbWF5IGluZGljYXRlIHRoZSBjYXJkIGlzIGFzc29jaWF0ZWQgbm93LgorCSAqIERyaXZlciBtaWdodCBiZSBpbnRlcmVzdGVkIGluIHRoaXMgdG8gYXBwbHkgUlggZmlsdGVyCisJICogcnVsZXMgb3Igc2ltcGx5IGxpZ2h0IHRoZSBMSU5LIGxlZAorCSAqLworCXZvaWQgKCpsaW5rX2NoYW5nZSkoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKwkvKiB0aGVzZSB0d28gZnVuY3Rpb24gaW5kaWNhdGVzIHRvIHRoZSBIVyB3aGVuIHRvIHN0YXJ0CisJICogYW5kIHN0b3AgdG8gc2VuZCBiZWFjb25zLiBUaGlzIGlzIHVzZWQgd2hlbiB0aGUKKwkgKiBJRUVFX1NPRlRNQUNfQkVBQ09OUyBpcyBub3Qgc2V0LiBGb3Igbm93IHRoZQorCSAqIHN0b3Bfc2VuZF9iYWNvbnMgaXMgTk9UIGd1YXJhbnRlZWQgdG8gYmUgY2FsbGVkIG9ubHkKKwkgKiBhZnRlciBzdGFydF9zZW5kX2JlYWNvbnMuCisJICovCisJdm9pZCAoKnN0YXJ0X3NlbmRfYmVhY29ucykgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCXZvaWQgKCpzdG9wX3NlbmRfYmVhY29ucykgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisJLyogcG93ZXIgc2F2ZSBtb2RlIHJlbGF0ZWQgKi8KKwl2b2lkICgqc3RhX3dha2VfdXApIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKwl2b2lkICgqcHNfcmVxdWVzdF90eF9hY2spIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKwl2b2lkICgqZW50ZXJfc2xlZXBfc3RhdGUpIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgdGgsIHUzMiB0bCk7CisJc2hvcnQgKCpwc19pc19xdWV1ZV9lbXB0eSkgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisJLyogUW9TIHJlbGF0ZWQgKi8KKwkvL3ZvaWQgKCp3bW1fcGFyYW1fdXBkYXRlKSAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggKmFjX3BhcmFtKTsKKwkvL3ZvaWQgKCp3bW1fcGFyYW1fdXBkYXRlKSAoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworCisJLyogVGhpcyBtdXN0IGJlIHRoZSBsYXN0IGl0ZW0gc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGRhdGEKKwkgKiBhbGxvY2F0ZWQgYmV5b25kIHRoaXMgc3RydWN0dXJlIGJ5IGFsbG9jX2llZWU4MDIxMSAqLworCXU4IHByaXZbMF07Cit9OworCisjZGVmaW5lIElFRUVfQSAgICAgICAgICAgICgxPDwwKQorI2RlZmluZSBJRUVFX0IgICAgICAgICAgICAoMTw8MSkKKyNkZWZpbmUgSUVFRV9HICAgICAgICAgICAgKDE8PDIpCisjZGVmaW5lIElFRUVfTU9ERV9NQVNLICAgIChJRUVFX0F8SUVFRV9CfElFRUVfRykKKworLyogR2VuZXJhdGUgYSA4MDIuMTEgaGVhZGVyICovCisKKy8qIFVzZXMgdGhlIGNoYW5uZWwgY2hhbmdlIGNhbGxiYWNrIGRpcmVjdGx5CisgKiBpbnN0ZWFkIG9mIFtzdGFydC9zdG9wXSBzY2FuIGNhbGxiYWNrcworICovCisjZGVmaW5lIElFRUVfU09GVE1BQ19TQ0FOICgxPDwyKQorCisvKiBQZXJmb3JtIGF1dGhlbnRpY2F0aW9uIGFuZCBhc3NvY2lhdGlvbiBoYW5kc2hha2UgKi8KKyNkZWZpbmUgSUVFRV9TT0ZUTUFDX0FTU09DSUFURSAoMTw8MykKKworLyogR2VuZXJhdGUgcHJvYmUgcmVxdWVzdHMgKi8KKyNkZWZpbmUgSUVFRV9TT0ZUTUFDX1BST0JFUlEgKDE8PDQpCisKKy8qIEdlbmVyYXRlIHJlc3BvbmVzIHRvIHByb2JlIHJlcXVlc3RzICovCisjZGVmaW5lIElFRUVfU09GVE1BQ19QUk9CRVJTICgxPDw1KQorCisvKiBUaGUgaWVlZTgwMi4xMSBzdGFjayB3aWxsIG1hbmFnZXMgdGhlIG5ldGlmIHF1ZXVlCisgKiB3YWtlL3N0b3AgZm9yIHRoZSBkcml2ZXIsIHRha2luZyBjYXJlIG9mIDgwMi4xMQorICogZnJhZ21lbnRhdGlvbi4gU2VlIHNvZnRtYWMuYyBmb3IgZGV0YWlscy4gKi8KKyNkZWZpbmUgSUVFRV9TT0ZUTUFDX1RYX1FVRVVFICgxPDw3KQorCisvKiBVc2VzIG9ubHkgdGhlIHNvZnRtYWNfZGF0YV9oYXJkX3N0YXJ0X3htaXQKKyAqIGV2ZW4gZm9yIFRYIG1hbmFnZW1lbnQgZnJhbWVzLgorICovCisjZGVmaW5lIElFRUVfU09GVE1BQ19TSU5HTEVfUVVFVUUgKDE8PDgpCisKKy8qIEdlbmVyYXRlIGJlYWNvbnMuICBUaGUgc3RhY2sgd2lsbCBlbnF1ZXVlIGJlYWNvbnMKKyAqIHRvIHRoZSBjYXJkCisgKi8KKyNkZWZpbmUgSUVFRV9TT0ZUTUFDX0JFQUNPTlMgKDE8PDYpCisKKworCitzdGF0aWMgaW5saW5lIHZvaWQgKmllZWU4MDIxMV9wcml2KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcmV0dXJuICgoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKiluZXRkZXZfcHJpdihkZXYpKS0+cHJpdjsKK30KKworZXh0ZXJuIGlubGluZSBpbnQgaWVlZTgwMjExX2lzX2VtcHR5X2Vzc2lkKGNvbnN0IGNoYXIgKmVzc2lkLCBpbnQgZXNzaWRfbGVuKQoreworCS8qIFNpbmdsZSB3aGl0ZSBzcGFjZSBpcyBmb3IgTGlua3N5cyBBUHMgKi8KKwlpZiAoZXNzaWRfbGVuID09IDEgJiYgZXNzaWRbMF0gPT0gJyAnKQorCQlyZXR1cm4gMTsKKworCS8qIE90aGVyd2lzZSwgaWYgdGhlIGVudGlyZSBlc3NpZCBpcyAwLCB3ZSBhc3N1bWUgaXQgaXMgaGlkZGVuICovCisJd2hpbGUgKGVzc2lkX2xlbikgeworCQllc3NpZF9sZW4tLTsKKwkJaWYgKGVzc2lkW2Vzc2lkX2xlbl0gIT0gJ1wwJykKKwkJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOworfQorCitleHRlcm4gaW5saW5lIGludCBpZWVlODAyMTFfaXNfdmFsaWRfbW9kZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgaW50IG1vZGUpCit7CisJLyoKKwkgKiBJdCBpcyBwb3NzaWJsZSBmb3IgYm90aCBhY2Nlc3MgcG9pbnRzIGFuZCBvdXIgZGV2aWNlIHRvIHN1cHBvcnQKKwkgKiBjb21iaW5hdGlvbnMgb2YgbW9kZXMsIHNvIGFzIGxvbmcgYXMgdGhlcmUgaXMgb25lIHZhbGlkIGNvbWJpbmF0aW9uCisJICogb2YgYXAvZGV2aWNlIHN1cHBvcnRlZCBtb2RlcywgdGhlbiByZXR1cm4gc3VjY2VzcworCSAqCisJICovCisJaWYgKChtb2RlICYgSUVFRV9BKSAmJgorCSAgICAoaWVlZS0+bW9kdWxhdGlvbiAmIElFRUU4MDIxMV9PRkRNX01PRFVMQVRJT04pICYmCisJICAgIChpZWVlLT5mcmVxX2JhbmQgJiBJRUVFODAyMTFfNTJHSFpfQkFORCkpCisJCXJldHVybiAxOworCisJaWYgKChtb2RlICYgSUVFRV9HKSAmJgorCSAgICAoaWVlZS0+bW9kdWxhdGlvbiAmIElFRUU4MDIxMV9PRkRNX01PRFVMQVRJT04pICYmCisJICAgIChpZWVlLT5mcmVxX2JhbmQgJiBJRUVFODAyMTFfMjRHSFpfQkFORCkpCisJCXJldHVybiAxOworCisJaWYgKChtb2RlICYgSUVFRV9CKSAmJgorCSAgICAoaWVlZS0+bW9kdWxhdGlvbiAmIElFRUU4MDIxMV9DQ0tfTU9EVUxBVElPTikgJiYKKwkgICAgKGllZWUtPmZyZXFfYmFuZCAmIElFRUU4MDIxMV8yNEdIWl9CQU5EKSkKKwkJcmV0dXJuIDE7CisKKwlyZXR1cm4gMDsKK30KKworZXh0ZXJuIGlubGluZSBpbnQgaWVlZTgwMjExX2dldF9oZHJsZW4odTE2IGZjKQoreworCWludCBoZHJsZW4gPSAyNDsKKworCXN3aXRjaCAoV0xBTl9GQ19HRVRfVFlQRShmYykpIHsKKwljYXNlIElFRUU4MDIxMV9GVFlQRV9EQVRBOgorCQlpZiAoKGZjICYgSUVFRTgwMjExX0ZDVExfRlJPTURTKSAmJiAoZmMgJiBJRUVFODAyMTFfRkNUTF9UT0RTKSkKKwkJCWhkcmxlbiA9IDMwOyAvKiBBZGRyNCAqLworCQlpZihJRUVFODAyMTFfUU9TX0hBU19TRVEoZmMpKQorCQkJaGRybGVuICs9IDI7IC8qIFFPUyBjdHJsKi8KKwkJYnJlYWs7CisJY2FzZSBJRUVFODAyMTFfRlRZUEVfQ1RMOgorCQlzd2l0Y2ggKFdMQU5fRkNfR0VUX1NUWVBFKGZjKSkgeworCQljYXNlIElFRUU4MDIxMV9TVFlQRV9DVFM6CisJCWNhc2UgSUVFRTgwMjExX1NUWVBFX0FDSzoKKwkJCWhkcmxlbiA9IDEwOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQloZHJsZW4gPSAxNjsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCX0KKworCXJldHVybiBoZHJsZW47Cit9CisKKworCisvKiBpZWVlODAyMTEuYyAqLworZXh0ZXJuIHZvaWQgZnJlZV9pZWVlODAyMTEoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitleHRlcm4gc3RydWN0IG5ldF9kZXZpY2UgKmFsbG9jX2llZWU4MDIxMShpbnQgc2l6ZW9mX3ByaXYpOworCitleHRlcm4gaW50IGllZWU4MDIxMV9zZXRfZW5jcnlwdGlvbihzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CisKKy8qIGllZWU4MDIxMV90eC5jICovCisKK2V4dGVybiBpbnQgaWVlZTgwMjExX2VuY3J5cHRfZnJhZ21lbnQoCisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJc3RydWN0IHNrX2J1ZmYgKmZyYWcsCisJaW50IGhkcl9sZW4pOworCitleHRlcm4gaW50IGllZWU4MDIxMV94bWl0KHN0cnVjdCBza19idWZmICpza2IsCisJCQkgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3R4Yl9mcmVlKHN0cnVjdCBpZWVlODAyMTFfdHhiICopOworCisKKy8qIGllZWU4MDIxMV9yeC5jICovCitleHRlcm4gaW50IGllZWU4MDIxMV9yeChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCXN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHMgKnJ4X3N0YXRzKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9yeF9tZ3Qoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkgICAgIHN0cnVjdCBpZWVlODAyMTFfaGRyICpoZWFkZXIsCisJCQkgICAgIHN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHMgKnN0YXRzKTsKKworLyogaWVlZTgwMjExX3d4LmMgKi8KK2V4dGVybiBpbnQgaWVlZTgwMjExX3d4X2dldF9zY2FuKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJCSB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICprZXkpOworZXh0ZXJuIGludCBpZWVlODAyMTFfd3hfc2V0X2VuY29kZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJCSAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmtleSk7CitleHRlcm4gaW50IGllZWU4MDIxMV93eF9nZXRfZW5jb2RlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJCSAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkJICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqa2V5KTsKK2V4dGVybiBpbnQgaWVlZTgwMjExX3d4X3NldF9lbmNvZGVfZXh0KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pb24gaXdyZXFfZGF0YSogd3JxdSwgY2hhciAqZXh0cmEpOworaW50IGllZWU4MDIxMV93eF9zZXRfYXV0aChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpd19wYXJhbSAqZGF0YSwgY2hhciAqZXh0cmEpOworaW50IGllZWU4MDIxMV93eF9zZXRfbWxtZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKTsKKworaW50IGllZWU4MDIxMV93eF9zZXRfZ2VuX2llKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCB1OCAqaWUsIHNpemVfdCBsZW4pOworLyogaWVlZTgwMjExX3NvZnRtYWMuYyAqLworZXh0ZXJuIHNob3J0IGllZWU4MDIxMV9pc181NGcoc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrIG5ldCk7CitleHRlcm4gc2hvcnQgaWVlZTgwMjExX2lzX3Nob3J0c2xvdChzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgbmV0KTsKK2V4dGVybiBpbnQgaWVlZTgwMjExX3J4X2ZyYW1lX3NvZnRtYWMoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBza19idWZmICpza2IsCisJCQlzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzICpyeF9zdGF0cywgdTE2IHR5cGUsCisJCQl1MTYgc3R5cGUpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3NvZnRtYWNfbmV3X25ldChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpuZXQpOworCitleHRlcm4gdm9pZCBpZWVlODAyMTFfc29mdG1hY194bWl0KHN0cnVjdCBpZWVlODAyMTFfdHhiICp0eGIsIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9zb2Z0bWFjX2NoZWNrX2FsbF9uZXRzKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9zdGFydF9ic3Moc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3N0YXJ0X21hc3Rlcl9ic3Moc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3N0YXJ0X2lic3Moc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3NvZnRtYWNfaW5pdChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CitleHRlcm4gdm9pZCBpZWVlODAyMTFfc29mdG1hY19mcmVlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9hc3NvY2lhdGVfYWJvcnQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX2Rpc2Fzc29jaWF0ZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CitleHRlcm4gdm9pZCBpZWVlODAyMTFfc3RvcF9zY2FuKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9zdGFydF9zY2FuX3N5bmNybyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CitleHRlcm4gdm9pZCBpZWVlODAyMTFfY2hlY2tfYWxsX25ldHMoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3N0YXJ0X3Byb3RvY29sKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9zdG9wX3Byb3RvY29sKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9zb2Z0bWFjX3N0YXJ0X3Byb3RvY29sKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9zb2Z0bWFjX3N0b3BfcHJvdG9jb2woc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3Jlc2V0X3F1ZXVlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV93YWtlX3F1ZXVlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9zdG9wX3F1ZXVlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKK2V4dGVybiBzdHJ1Y3Qgc2tfYnVmZiAqaWVlZTgwMjExX2dldF9iZWFjb24oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3N0YXJ0X3NlbmRfYmVhY29ucyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CitleHRlcm4gdm9pZCBpZWVlODAyMTFfc3RvcF9zZW5kX2JlYWNvbnMoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIGludCBpZWVlODAyMTFfd3BhX3N1cHBsaWNhbnRfaW9jdGwoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBpd19wb2ludCAqcCk7CitleHRlcm4gdm9pZCBub3RpZnlfd3hfYXNzb2NfZXZlbnQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3BzX3R4X2FjayhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc2hvcnQgc3VjY2Vzcyk7CitleHRlcm4gdm9pZCBTZW5kRGlzYXNzb2NpYXRpb24oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsdTgqIGFzU3RhLHU4IGFzUnNuKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9zdGFydF9zY2FuKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKKworLy9BZGQgZm9yIFJGIHBvd2VyIG9uIHBvd2VyIG9mZiBieSBsaXpoYW9taW5nIDA4MDUxMgorZXh0ZXJuIHZvaWQgU2VuZERpc2Fzc29jaWF0aW9uKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorICAgICAgIAkJCSB1OCogICAgICAgICAgICAgICAgICAgICBhc1N0YSwKKyAgICAgICAgCQkgdTggICAgICAgICAgICAgICAgICAgICAgYXNSc24pOworCisvKiBpZWVlODAyMTFfY3J5cHRfY2NtcCZ0a2lwJndlcC5jICovCitleHRlcm4gdm9pZCBpZWVlODAyMTFfdGtpcF9udWxsKHZvaWQpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3dlcF9udWxsKHZvaWQpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX2NjbXBfbnVsbCh2b2lkKTsKKy8qIGllZWU4MDIxMV9zb2Z0bWFjX3d4LmMgKi8KKworZXh0ZXJuIGludCBpZWVlODAyMTFfd3hfZ2V0X3dhcChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dCk7CisKK2V4dGVybiBpbnQgaWVlZTgwMjExX3d4X3NldF93YXAoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSB1bmlvbiBpd3JlcV9kYXRhICphd3JxLAorCQkJIGNoYXIgKmV4dHJhKTsKKworZXh0ZXJuIGludCBpZWVlODAyMTFfd3hfZ2V0X2Vzc2lkKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICphLHVuaW9uIGl3cmVxX2RhdGEgKndycXUsY2hhciAqYik7CisKK2V4dGVybiBpbnQgaWVlZTgwMjExX3d4X3NldF9yYXRlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSk7CisKK2V4dGVybiBpbnQgaWVlZTgwMjExX3d4X2dldF9yYXRlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSk7CisKK2V4dGVybiBpbnQgaWVlZTgwMjExX3d4X3NldF9tb2RlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICphLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpiKTsKKworZXh0ZXJuIGludCBpZWVlODAyMTFfd3hfc2V0X3NjYW4oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmEsCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmIpOworCitleHRlcm4gaW50IGllZWU4MDIxMV93eF9zZXRfZXNzaWQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICphLAorCQkJICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpOworCitleHRlcm4gaW50IGllZWU4MDIxMV93eF9nZXRfbW9kZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqYSwKKwkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqYik7CisKK2V4dGVybiBpbnQgaWVlZTgwMjExX3d4X3NldF9mcmVxKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICphLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpiKTsKKworZXh0ZXJuIGludCBpZWVlODAyMTFfd3hfZ2V0X2ZyZXEoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmEsCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmIpOworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDIwKSkKK2V4dGVybiB2b2lkIGllZWU4MDIxMV93eF9zeW5jX3NjYW5fd3Eoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKKyNlbHNlCisgZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3d4X3N5bmNfc2Nhbl93cShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CisjZW5kaWYKKy8vZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3d4X3N5bmNfc2Nhbl93cShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CisKK2V4dGVybiBpbnQgaWVlZTgwMjExX3d4X3NldF9yYXd0eChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCSAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKTsKKworZXh0ZXJuIGludCBpZWVlODAyMTFfd3hfZ2V0X25hbWUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKTsKKworZXh0ZXJuIGludCBpZWVlODAyMTFfd3hfc2V0X3Bvd2VyKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJCSB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSk7CisKK2V4dGVybiBpbnQgaWVlZTgwMjExX3d4X2dldF9wb3dlcihzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCQkgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCQkgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpOworCitleHRlcm4gdm9pZCBpZWVlODAyMTFfc29mdG1hY19pcHNfc2Nhbl9zeW5jcm8oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworCitleHRlcm4gdm9pZCBpZWVlODAyMTFfc3RhX3BzX3NlbmRfbnVsbF9mcmFtZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc2hvcnQgcHdyKTsKKworZXh0ZXJuIGNvbnN0IGxvbmcgaWVlZTgwMjExX3dsYW5fZnJlcXVlbmNpZXNbXTsKKworZXh0ZXJuIGlubGluZSB2b2lkIGllZWU4MDIxMV9pbmNyZW1lbnRfc2NhbnMoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisJaWVlZS0+c2NhbnMrKzsKK30KKworZXh0ZXJuIGlubGluZSBpbnQgaWVlZTgwMjExX2dldF9zY2FucyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKwlyZXR1cm4gaWVlZS0+c2NhbnM7Cit9CisKK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciAqZXNjYXBlX2Vzc2lkKGNvbnN0IGNoYXIgKmVzc2lkLCB1OCBlc3NpZF9sZW4pIHsKKwlzdGF0aWMgY2hhciBlc2NhcGVkW0lXX0VTU0lEX01BWF9TSVpFICogMiArIDFdOworCWNvbnN0IGNoYXIgKnMgPSBlc3NpZDsKKwljaGFyICpkID0gZXNjYXBlZDsKKworCWlmIChpZWVlODAyMTFfaXNfZW1wdHlfZXNzaWQoZXNzaWQsIGVzc2lkX2xlbikpIHsKKwkJbWVtY3B5KGVzY2FwZWQsICI8aGlkZGVuPiIsIHNpemVvZigiPGhpZGRlbj4iKSk7CisJCXJldHVybiBlc2NhcGVkOworCX0KKworCWVzc2lkX2xlbiA9IG1pbihlc3NpZF9sZW4sICh1OClJV19FU1NJRF9NQVhfU0laRSk7CisJd2hpbGUgKGVzc2lkX2xlbi0tKSB7CisJCWlmICgqcyA9PSAnXDAnKSB7CisJCQkqZCsrID0gJ1xcJzsKKwkJCSpkKysgPSAnMCc7CisJCQlzKys7CisJCX0gZWxzZSB7CisJCQkqZCsrID0gKnMrKzsKKwkJfQorCX0KKwkqZCA9ICdcMCc7CisJcmV0dXJuIGVzY2FwZWQ7Cit9CisjZW5kaWYgLyogSUVFRTgwMjExX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2RvdDExZC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvZG90MTFkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQ4Yjc1MgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2RvdDExZC5jCkBAIC0wLDAgKzEsMjQ2IEBACisjaWZkZWYgRU5BQkxFX0RPVDExRA0KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisvLwlGaWxlOg0KKy8vCQlEb3QxMWQuYw0KKy8vDQorLy8JRGVzY3JpcHRpb246DQorLy8JCUltcGxlbWVudCA4MDIuMTFkLiANCisvLw0KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisNCisjaW5jbHVkZSAiZG90MTFkLmgiDQorDQordm9pZA0KK0RvdDExZF9Jbml0KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQ0KK3sNCisJUFJUX0RPVDExRF9JTkZPIHBEb3QxMWRJbmZvID0gR0VUX0RPVDExRF9JTkZPKGllZWUpOw0KKw0KKwlwRG90MTFkSW5mby0+YkVuYWJsZWQgPSAwOw0KKw0KKwlwRG90MTFkSW5mby0+U3RhdGUgPSBET1QxMURfU1RBVEVfTk9ORTsNCisJcERvdDExZEluZm8tPkNvdW50cnlJZUxlbiA9IDA7DQorCW1lbXNldChwRG90MTFkSW5mby0+Y2hhbm5lbF9tYXAsIDAsIE1BWF9DSEFOTkVMX05VTUJFUisxKTsgIA0KKwltZW1zZXQocERvdDExZEluZm8tPk1heFR4UHdyRGJtTGlzdCwgMHhGRiwgTUFYX0NIQU5ORUxfTlVNQkVSKzEpOw0KKwlSRVNFVF9DSUVfV0FUQ0hET0coaWVlZSk7DQorDQorCXByaW50aygiRG90MTFkX0luaXQoKVxuIik7DQorfQ0KKw0KKy8vDQorLy8JRGVzY3JpcHRpb246DQorLy8JCVJlc2V0IHRvIHRoZSBzdGF0ZSBhcyB3ZSBhcmUganVzdCBlbnRlcmluZyBhIHJlZ3VsYXRvcnkgZG9tYWluLg0KKy8vDQordm9pZA0KK0RvdDExZF9SZXNldChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkNCit7DQorCXUzMiBpOw0KKwlQUlRfRE9UMTFEX0lORk8gcERvdDExZEluZm8gPSBHRVRfRE9UMTFEX0lORk8oaWVlZSk7DQorDQorCS8vIENsZWFyIG9sZCBjaGFubmVsIG1hcA0KKwltZW1zZXQocERvdDExZEluZm8tPmNoYW5uZWxfbWFwLCAwLCBNQVhfQ0hBTk5FTF9OVU1CRVIrMSk7DQorCW1lbXNldChwRG90MTFkSW5mby0+TWF4VHhQd3JEYm1MaXN0LCAweEZGLCBNQVhfQ0hBTk5FTF9OVU1CRVIrMSk7DQorCS8vIFNldCBuZXcgY2hhbm5lbCBtYXANCisJZm9yIChpPTE7IGk8PTExOyBpKyspIHsNCisJCShwRG90MTFkSW5mby0+Y2hhbm5lbF9tYXApW2ldID0gMTsNCisJfQ0KKwlmb3IgKGk9MTI7IGk8PTE0OyBpKyspIHsNCisJCShwRG90MTFkSW5mby0+Y2hhbm5lbF9tYXApW2ldID0gMjsNCisJfQ0KKw0KKwlwRG90MTFkSW5mby0+U3RhdGUgPSBET1QxMURfU1RBVEVfTk9ORTsNCisJcERvdDExZEluZm8tPkNvdW50cnlJZUxlbiA9IDA7DQorCVJFU0VUX0NJRV9XQVRDSERPRyhpZWVlKTsNCisNCisJLy9wcmludGsoIkRvdDExZF9SZXNldCgpXG4iKTsNCit9DQorDQorLy8NCisvLwlEZXNjcmlwdGlvbjoNCisvLwkJVXBkYXRlIGNvdW50cnkgSUUgZnJvbSBCZWFjb24gb3IgUHJvYmUgUmVzb3Buc2UgDQorLy8JCWFuZCBjb25maWd1cmUgUEhZIGZvciBvcGVyYXRpb24gaW4gdGhlIHJlZ3VsYXRvcnkgZG9tYWluLg0KKy8vDQorLy8JVE9ETzogDQorLy8JCUNvbmZpZ3VyZSBUeCBwb3dlci4NCisvLw0KKy8vCUFzc3VtcHRpb246DQorLy8JCTEuIElTX0RPVDExRF9FTkFCTEUoKSBpcyBUUlVFLg0KKy8vCQkyLiBJbnB1dCBJRSBpcyBhbiB2YWxpZCBvbmUuDQorLy8NCit2b2lkDQorRG90MTFkX1VwZGF0ZUNvdW50cnlJZSgNCisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmRldiwNCisJdTggKgkJcFRhZGRyLA0KKwl1MTYJQ291dHJ5SWVMZW4sDQorCXU4ICogcENvdXRyeUllCSANCisJKQ0KK3sNCisJUFJUX0RPVDExRF9JTkZPIHBEb3QxMWRJbmZvID0gR0VUX0RPVDExRF9JTkZPKGRldik7DQorCXU4IGksIGosIE51bVRyaXBsZXMsIE1heENobmxOdW07DQorCVBDSE5MX1RYUE9XRVJfVFJJUExFIHBUcmlwbGU7DQorDQorCWlmKChDb3V0cnlJZUxlbiAtIDMpJTMgIT0gMCkNCisJew0KKwkJcHJpbnRrKCJEb3QxMWRfVXBkYXRlQ291bnRyeUllKCk6IEludmFsaWQgY291bnRyeSBJRSwgc2tpcCBpdC4uLi4uLi4uMVxuIik7DQorCQlEb3QxMWRfUmVzZXQoZGV2KTsNCisJCXJldHVybjsNCisJfQ0KKw0KKwltZW1zZXQocERvdDExZEluZm8tPmNoYW5uZWxfbWFwLCAwLCBNQVhfQ0hBTk5FTF9OVU1CRVIrMSk7DQorCW1lbXNldChwRG90MTFkSW5mby0+TWF4VHhQd3JEYm1MaXN0LCAweEZGLCBNQVhfQ0hBTk5FTF9OVU1CRVIrMSk7DQorCU1heENobmxOdW0gPSAwOw0KKwlOdW1UcmlwbGVzID0gKENvdXRyeUllTGVuIC0gMykgLyAzOyAvLyBza2lwIDMtYnl0ZSBjb3VudHJ5IHN0cmluZy4NCisJcFRyaXBsZSA9IChQQ0hOTF9UWFBPV0VSX1RSSVBMRSkocENvdXRyeUllICsgMyk7DQorCWZvcihpID0gMDsgaSA8IE51bVRyaXBsZXM7IGkrKykNCisJew0KKwkJaWYoTWF4Q2hubE51bSA+PSBwVHJpcGxlLT5GaXJzdENobmwpDQorCQl7IC8vIEl0IGlzIG5vdCBpbiBhIG1vbm90b25pY2FsbHkgaW5jcmVhc2luZyBvcmRlciwgc28gc3RvcCBwcm9jZXNzaW5nLg0KKwkJCXByaW50aygiRG90MTFkX1VwZGF0ZUNvdW50cnlJZSgpOiBJbnZhbGlkIGNvdW50cnkgSUUsIHNraXAgaXQuLi4uLi4uLjFcbiIpOw0KKwkJCURvdDExZF9SZXNldChkZXYpOw0KKwkJCXJldHVybjsgDQorCQl9DQorCQlpZihNQVhfQ0hBTk5FTF9OVU1CRVIgPCAocFRyaXBsZS0+Rmlyc3RDaG5sICsgcFRyaXBsZS0+TnVtQ2hubHMpKQ0KKwkJeyAvLyBJdCBpcyBub3QgYSB2YWxpZCBzZXQgb2YgY2hhbm5lbCBpZCwgc28gc3RvcCBwcm9jZXNzaW5nLg0KKwkJCXByaW50aygiRG90MTFkX1VwZGF0ZUNvdW50cnlJZSgpOiBJbnZhbGlkIGNvdW50cnkgSUUsIHNraXAgaXQuLi4uLi4uLjJcbiIpOw0KKwkJCURvdDExZF9SZXNldChkZXYpOw0KKwkJCXJldHVybjsgDQorCQl9DQorDQorCQlmb3IoaiA9IDAgOyBqIDwgcFRyaXBsZS0+TnVtQ2hubHM7IGorKykNCisJCXsNCisJCQlwRG90MTFkSW5mby0+Y2hhbm5lbF9tYXBbcFRyaXBsZS0+Rmlyc3RDaG5sICsgal0gPSAxOw0KKwkJCXBEb3QxMWRJbmZvLT5NYXhUeFB3ckRibUxpc3RbcFRyaXBsZS0+Rmlyc3RDaG5sICsgal0gPSBwVHJpcGxlLT5NYXhUeFBvd2VySW5EYm07DQorCQkJTWF4Q2hubE51bSA9IHBUcmlwbGUtPkZpcnN0Q2hubCArIGo7DQorCQl9CQ0KKw0KKwkJcFRyaXBsZSA9IChQQ0hOTF9UWFBPV0VSX1RSSVBMRSkoKHU4KilwVHJpcGxlICsgMyk7DQorCX0NCisjaWYgMQ0KKwkvL3ByaW50aygiRG90MTFkX1VwZGF0ZUNvdW50cnlJZSgpOiBDaGFubmVsIExpc3Q6XG4iKTsNCisJcHJpbnRrKCJDaGFubmVsIExpc3Q6Iik7DQorCWZvcihpPTE7IGk8PSBNQVhfQ0hBTk5FTF9OVU1CRVI7IGkrKykNCisJCWlmKHBEb3QxMWRJbmZvLT5jaGFubmVsX21hcFtpXSA+IDApDQorCQkJcHJpbnRrKCIgJWQiLCBpKTsNCisJcHJpbnRrKCJcbiIpOw0KKyNlbmRpZg0KKw0KKwlVUERBVEVfQ0lFX1NSQyhkZXYsIHBUYWRkcik7DQorDQorCXBEb3QxMWRJbmZvLT5Db3VudHJ5SWVMZW4gPSBDb3V0cnlJZUxlbjsNCisJbWVtY3B5KHBEb3QxMWRJbmZvLT5Db3VudHJ5SWVCdWYsIHBDb3V0cnlJZSxDb3V0cnlJZUxlbik7DQorCXBEb3QxMWRJbmZvLT5TdGF0ZSA9IERPVDExRF9TVEFURV9MRUFSTkVEOw0KK30NCisNCit2b2lkIGR1bXBfY2hubF9tYXAodTggKiBjaGFubmVsX21hcCkNCit7DQorCWludCBpOw0KKwlwcmludGsoIkNoYW5uZWwgTGlzdDoiKTsNCisJZm9yKGk9MTsgaTw9IE1BWF9DSEFOTkVMX05VTUJFUjsgaSsrKQ0KKwkJaWYoY2hhbm5lbF9tYXBbaV0gPiAwKQ0KKwkJCXByaW50aygiICVkKCVkKSIsIGksIGNoYW5uZWxfbWFwW2ldKTsNCisJcHJpbnRrKCJcbiIpOw0KK30NCisNCit1OA0KK0RPVDExRF9HZXRNYXhUeFB3ckluRGJtKA0KKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqZGV2LA0KKwl1OCBDaGFubmVsDQorCSkNCit7DQorCVBSVF9ET1QxMURfSU5GTyBwRG90MTFkSW5mbyA9IEdFVF9ET1QxMURfSU5GTyhkZXYpOw0KKwl1OCBNYXhUeFB3ckluRGJtID0gMjU1Ow0KKw0KKwlpZihNQVhfQ0hBTk5FTF9OVU1CRVIgPCBDaGFubmVsKQ0KKwl7IA0KKwkJcHJpbnRrKCJET1QxMURfR2V0TWF4VHhQd3JJbkRibSgpOiBJbnZhbGlkIENoYW5uZWxcbiIpOw0KKwkJcmV0dXJuIE1heFR4UHdySW5EYm07IA0KKwl9DQorCWlmKHBEb3QxMWRJbmZvLT5jaGFubmVsX21hcFtDaGFubmVsXSkNCisJew0KKwkJTWF4VHhQd3JJbkRibSA9IHBEb3QxMWRJbmZvLT5NYXhUeFB3ckRibUxpc3RbQ2hhbm5lbF07CQ0KKwl9DQorDQorCXJldHVybiBNYXhUeFB3ckluRGJtOw0KK30NCisNCisNCit2b2lkDQorRE9UMTFEX1NjYW5Db21wbGV0ZSgNCisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKiBkZXYNCisJKQ0KK3sNCisJUFJUX0RPVDExRF9JTkZPIHBEb3QxMWRJbmZvID0gR0VUX0RPVDExRF9JTkZPKGRldik7DQorDQorCXN3aXRjaChwRG90MTFkSW5mby0+U3RhdGUpDQorCXsNCisJY2FzZSBET1QxMURfU1RBVEVfTEVBUk5FRDoNCisJCXBEb3QxMWRJbmZvLT5TdGF0ZSA9IERPVDExRF9TVEFURV9ET05FOw0KKwkJYnJlYWs7DQorDQorCWNhc2UgRE9UMTFEX1NUQVRFX0RPTkU6DQorCQlpZiggR0VUX0NJRV9XQVRDSERPRyhkZXYpID09IDAgKQ0KKwkJeyAvLyBSZXNldCBjb3VudHJ5IElFIGlmIHByZXZpb3VzIG9uZSBpcyBnb25lLiANCisJCQlEb3QxMWRfUmVzZXQoZGV2KTsgDQorCQl9DQorCQlicmVhazsNCisJY2FzZSBET1QxMURfU1RBVEVfTk9ORToNCisJCWJyZWFrOw0KKwl9DQorfQ0KKw0KK2ludCBJc0xlZ2FsQ2hhbm5lbCgNCisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKiBkZXYsDQorCXU4IGNoYW5uZWwNCispDQorew0KKwlQUlRfRE9UMTFEX0lORk8gcERvdDExZEluZm8gPSBHRVRfRE9UMTFEX0lORk8oZGV2KTsNCisNCisJaWYoTUFYX0NIQU5ORUxfTlVNQkVSIDwgY2hhbm5lbCkNCisJeyANCisJCXByaW50aygiSXNMZWdhbENoYW5uZWwoKTogSW52YWxpZCBDaGFubmVsXG4iKTsNCisJCXJldHVybiAwOyANCisJfQ0KKwlpZihwRG90MTFkSW5mby0+Y2hhbm5lbF9tYXBbY2hhbm5lbF0gPiAwKQ0KKwkJcmV0dXJuIDE7DQorCXJldHVybiAwOw0KK30NCisNCitpbnQgVG9MZWdhbENoYW5uZWwoDQorCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICogZGV2LA0KKwl1OCBjaGFubmVsDQorKQ0KK3sNCisJUFJUX0RPVDExRF9JTkZPIHBEb3QxMWRJbmZvID0gR0VUX0RPVDExRF9JTkZPKGRldik7DQorCXU4IGRlZmF1bHRfY2huID0gMDsNCisJdTMyIGkgPSAwOw0KKw0KKwlmb3IgKGk9MTsgaTw9IE1BWF9DSEFOTkVMX05VTUJFUjsgaSsrKQ0KKwl7DQorCQlpZihwRG90MTFkSW5mby0+Y2hhbm5lbF9tYXBbaV0gPiAwKQ0KKwkJew0KKwkJCWRlZmF1bHRfY2huID0gaTsNCisJCQlicmVhazsNCisJCX0NCisJfQ0KKw0KKwlpZihNQVhfQ0hBTk5FTF9OVU1CRVIgPCBjaGFubmVsKQ0KKwl7IA0KKwkJcHJpbnRrKCJJc0xlZ2FsQ2hhbm5lbCgpOiBJbnZhbGlkIENoYW5uZWxcbiIpOw0KKwkJcmV0dXJuIGRlZmF1bHRfY2huOyANCisJfQ0KKwkNCisJaWYocERvdDExZEluZm8tPmNoYW5uZWxfbWFwW2NoYW5uZWxdID4gMCkNCisJCXJldHVybiBjaGFubmVsOw0KKwkNCisJcmV0dXJuIGRlZmF1bHRfY2huOw0KK30NCisNCisjaWYgMA0KK0VYUE9SVF9TWU1CT0woRG90MTFkX0luaXQpOw0KK0VYUE9SVF9TWU1CT0woRG90MTFkX1Jlc2V0KTsNCitFWFBPUlRfU1lNQk9MKERvdDExZF9VcGRhdGVDb3VudHJ5SWUpOw0KK0VYUE9SVF9TWU1CT0woRE9UMTFEX0dldE1heFR4UHdySW5EYm0pOw0KK0VYUE9SVF9TWU1CT0woRE9UMTFEX1NjYW5Db21wbGV0ZSk7DQorRVhQT1JUX1NZTUJPTChJc0xlZ2FsQ2hhbm5lbCk7DQorRVhQT1JUX1NZTUJPTChUb0xlZ2FsQ2hhbm5lbCk7DQorI2VuZGlmDQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvZG90MTFkLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS9kb3QxMWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NGJjZjE1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvZG90MTFkLmgKQEAgLTAsMCArMSwxMDIgQEAKKyNpZm5kZWYgX19JTkNfRE9UMTFEX0gNCisjZGVmaW5lIF9fSU5DX0RPVDExRF9IDQorDQorI2luY2x1ZGUgImllZWU4MDIxMS5oIg0KKw0KKy8vI2RlZmluZSBFTkFCTEVfRE9UMTFEDQorDQorLy8jZGVmaW5lIERPVDExRF9NQVhfQ0hOTF9OVU0gODMNCisNCit0eXBlZGVmIHN0cnVjdCBfQ0hOTF9UWFBPV0VSX1RSSVBMRSB7DQorCXU4IEZpcnN0Q2hubDsNCisJdTggIE51bUNobmxzOw0KKwl1OCAgTWF4VHhQb3dlckluRGJtOw0KK31DSE5MX1RYUE9XRVJfVFJJUExFLCAqUENITkxfVFhQT1dFUl9UUklQTEU7DQorDQordHlwZWRlZiBlbnVtIF9ET1QxMURfU1RBVEUgew0KKwlET1QxMURfU1RBVEVfTk9ORSA9IDAsDQorCURPVDExRF9TVEFURV9MRUFSTkVELA0KKwlET1QxMURfU1RBVEVfRE9ORSwNCit9RE9UMTFEX1NUQVRFOw0KKw0KK3R5cGVkZWYgc3RydWN0IF9SVF9ET1QxMURfSU5GTyB7DQorCS8vREVDTEFSRV9SVF9PQkpFQ1QoUlRfRE9UMTFEX0lORk8pOw0KKw0KKwlib29sIGJFbmFibGVkOyAvLyBkb3QxMU11bHRpRG9tYWluQ2FwYWJpbGl0eUVuYWJsZWQNCisNCisJdTE2IENvdW50cnlJZUxlbjsgLy8gPiAwIGlmIENvdW50cnlJZUJ1ZltdIGNvbnRhaW5zIHZhbGlkIGNvdW50cnkgaW5mb3JtYXRpb24gZWxlbWVudC4NCisJdTggIENvdW50cnlJZUJ1ZltNQVhfSUVfTEVOXTsNCisJdTggIENvdW50cnlJZVNyY0FkZHJbNl07IC8vIFNvdXJjZSBBUCBvZiB0aGUgY291bnRyeSBJRS4NCisJdTggIENvdW50cnlJZVdhdGNoZG9nOyANCisNCisJdTggIGNoYW5uZWxfbWFwW01BWF9DSEFOTkVMX05VTUJFUisxXTsgIC8vISEhVmFsdWUgMDogSW52YWxpZCwgMTogVmFsaWQgKGFjdGl2ZSBzY2FuKSwgMjogVmFsaWQgKHBhc3NpdmUgc2NhbikNCisJLy91OCAgQ2hubExpc3RMZW47IC8vICNCeXRlcyB2YWxpZCBpbiBDaG5sTGlzdFtdLg0KKwkvL3U4ICBDaG5sTGlzdFtET1QxMURfTUFYX0NITkxfTlVNXTsNCisJdTggIE1heFR4UHdyRGJtTGlzdFtNQVhfQ0hBTk5FTF9OVU1CRVIrMV07DQorDQorCURPVDExRF9TVEFURSBTdGF0ZTsNCit9UlRfRE9UMTFEX0lORk8sICpQUlRfRE9UMTFEX0lORk87DQorI2RlZmluZSBlcU1hY0FkZHIoYSxiKQkJKCAoKGEpWzBdPT0oYilbMF0gJiYgKGEpWzFdPT0oYilbMV0gJiYgKGEpWzJdPT0oYilbMl0gJiYgKGEpWzNdPT0oYilbM10gJiYgKGEpWzRdPT0oYilbNF0gJiYgKGEpWzVdPT0oYilbNV0pID8gMTowICkNCisjZGVmaW5lIGNwTWFjQWRkcihkZXMsc3JjKQkgICAgICAoKGRlcylbMF09KHNyYylbMF0sKGRlcylbMV09KHNyYylbMV0sKGRlcylbMl09KHNyYylbMl0sKGRlcylbM109KHNyYylbM10sKGRlcylbNF09KHNyYylbNF0sKGRlcylbNV09KHNyYylbNV0pDQorI2RlZmluZSBHRVRfRE9UMTFEX0lORk8oX19wSWVlZURldikgKChQUlRfRE9UMTFEX0lORk8pKChfX3BJZWVlRGV2KS0+cERvdDExZEluZm8pKQ0KKw0KKyNkZWZpbmUgSVNfRE9UMTFEX0VOQUJMRShfX3BJZWVlRGV2KSBHRVRfRE9UMTFEX0lORk8oX19wSWVlZURldiktPmJFbmFibGVkDQorI2RlZmluZSBJU19DT1VOVFJZX0lFX1ZBTElEKF9fcEllZWVEZXYpIChHRVRfRE9UMTFEX0lORk8oX19wSWVlZURldiktPkNvdW50cnlJZUxlbiA+IDApDQorDQorI2RlZmluZSBJU19FUVVBTF9DSUVfU1JDKF9fcEllZWVEZXYsIF9fcFRhKSBlcU1hY0FkZHIoR0VUX0RPVDExRF9JTkZPKF9fcEllZWVEZXYpLT5Db3VudHJ5SWVTcmNBZGRyLCBfX3BUYSkgDQorI2RlZmluZSBVUERBVEVfQ0lFX1NSQyhfX3BJZWVlRGV2LCBfX3BUYSkgY3BNYWNBZGRyKEdFVF9ET1QxMURfSU5GTyhfX3BJZWVlRGV2KS0+Q291bnRyeUllU3JjQWRkciwgX19wVGEpDQorDQorI2RlZmluZSBJU19DT1VOVFJZX0lFX0NIQU5HRUQoX19wSWVlZURldiwgX19JZSkgXA0KKwkoKChfX0llKS5MZW5ndGggPT0gMCB8fCAoX19JZSkuTGVuZ3RoICE9IEdFVF9ET1QxMURfSU5GTyhfX3BJZWVlRGV2KS0+Q291bnRyeUllTGVuKSA/IFwNCisJRkFMU0UgOiBcDQorCSghbWVtY21wKEdFVF9ET1QxMURfSU5GTyhfX3BJZWVlRGV2KS0+Q291bnRyeUllQnVmLCAoX19JZSkuT2N0ZXQsIChfX0llKS5MZW5ndGgpKSkNCisNCisjZGVmaW5lIENJRV9XQVRDSERPR19USCAxDQorI2RlZmluZSBHRVRfQ0lFX1dBVENIRE9HKF9fcEllZWVEZXYpIEdFVF9ET1QxMURfSU5GTyhfX3BJZWVlRGV2KS0+Q291bnRyeUllV2F0Y2hkb2cNCisjZGVmaW5lIFJFU0VUX0NJRV9XQVRDSERPRyhfX3BJZWVlRGV2KSBHRVRfQ0lFX1dBVENIRE9HKF9fcEllZWVEZXYpID0gMCANCisjZGVmaW5lIFVQREFURV9DSUVfV0FUQ0hET0coX19wSWVlZURldikgKytHRVRfQ0lFX1dBVENIRE9HKF9fcEllZWVEZXYpDQorDQorI2RlZmluZSBJU19ET1QxMURfU1RBVEVfRE9ORShfX3BJZWVlRGV2KSAoR0VUX0RPVDExRF9JTkZPKF9fcEllZWVEZXYpLT5TdGF0ZSA9PSBET1QxMURfU1RBVEVfRE9ORSkNCisNCisNCit2b2lkDQorRG90MTFkX0luaXQoDQorCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICpkZXYNCisJKTsNCisNCit2b2lkDQorRG90MTFkX1Jlc2V0KA0KKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqZGV2DQorCSk7DQorDQordm9pZA0KK0RvdDExZF9VcGRhdGVDb3VudHJ5SWUoDQorCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICpkZXYsDQorCXU4ICoJCXBUYWRkciwNCisJdTE2CUNvdXRyeUllTGVuLA0KKwl1OCAqIHBDb3V0cnlJZQkgDQorCSk7DQorDQordTgNCitET1QxMURfR2V0TWF4VHhQd3JJbkRibSgNCisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmRldiwNCisJdTggQ2hhbm5lbA0KKwkpOw0KKw0KK3ZvaWQNCitET1QxMURfU2NhbkNvbXBsZXRlKA0KKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqIGRldg0KKwkpOw0KKw0KK2ludCBJc0xlZ2FsQ2hhbm5lbCgNCisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKiBkZXYsDQorCXU4IGNoYW5uZWwNCispOw0KKw0KK2ludCBUb0xlZ2FsQ2hhbm5lbCgNCisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKiBkZXYsDQorCXU4IGNoYW5uZWwNCispOw0KKw0KK3ZvaWQgZHVtcF9jaG5sX21hcCh1OCAqIGNoYW5uZWxfbWFwKTsNCisjZW5kaWYgLy8gI2lmbmRlZiBfX0lOQ19ET1QxMURfSA0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2llZWU4MDIxMS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvaWVlZTgwMjExLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTgzMzYwOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2llZWU4MDIxMS5oCkBAIC0wLDAgKzEsMTc1NSBAQAorLyoKKyAqIE1lcmdlZCB3aXRoIG1haW5saW5lIGllZWU4MDIxMS5oIGluIEF1ZyAyMDA0LiAgT3JpZ2luYWwgaWVlZTgwMl8xMQorICogcmVtYWlucyBjb3B5cmlnaHQgYnkgdGhlIG9yaWdpbmFsIGF1dGhvcnMKKyAqCisgKiBQb3J0aW9ucyBvZiB0aGUgbWVyZ2VkIGNvZGUgYXJlIGJhc2VkIG9uIEhvc3QgQVAgKHNvZnR3YXJlIHdpcmVsZXNzCisgKiBMQU4gYWNjZXNzIHBvaW50KSBkcml2ZXIgZm9yIEludGVyc2lsIFByaXNtMi8yLjUvMy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwMiwgU1NIIENvbW11bmljYXRpb25zIFNlY3VyaXR5IENvcnAgYW5kIEpvdW5pIE1hbGluZW4KKyAqIDxqa21hbGluZUBjYy5odXQuZmk+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwMywgSm91bmkgTWFsaW5lbiA8amttYWxpbmVAY2MuaHV0LmZpPgorICoKKyAqIEFkYXB0aW9uIHRvIGEgZ2VuZXJpYyBJRUVFIDgwMi4xMSBzdGFjayBieSBKYW1lcyBLZXRyZW5vcworICogPGprZXRyZW5vQGxpbnV4LmludGVsLmNvbT4KKyAqIENvcHlyaWdodCAoYykgMjAwNCwgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBNb2RpZmllZCBmb3IgUmVhbHRlaydzIHdpLWZpIGNhcmRzIGJ5IEFuZHJlYSBNZXJlbGxvCisgKiA8YW5kcmVhbXJsQHRpc2NhbGkuaXQ+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gU2VlIFJFQURNRSBhbmQgQ09QWUlORyBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqLworI2lmbmRlZiBJRUVFODAyMTFfSAorI2RlZmluZSBJRUVFODAyMTFfSAorI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+IC8qIEVUSF9BTEVOICovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+ICAgLyogQVJSQVlfU0laRSAqLworI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMTMpKQorI2luY2x1ZGUgPGxpbnV4L3dpcmVsZXNzLmg+CisjZW5kaWYKKworLyoKKyNpZm5kZWYgYm9vbAorI2RlZmluZSBib29sIGludAorI2VuZGlmCisKKyNpZm5kZWYgdHJ1ZQorI2RlZmluZSB0cnVlICAgMQorI2VuZGlmCisKKyNpZm5kZWYgZmFsc2UKKyNkZWZpbmUgZmFsc2UgIDAKKyNlbmRpZgorKi8KKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDIwKSkKKyNpZm5kZWYgYm9vbAordHlwZWRlZiBlbnVte2ZhbHNlID0gMCwgdHJ1ZX0gYm9vbDsKKyNlbmRpZgorI2VuZGlmCisvLyNpZmRlZiBKT0hOX0hXU0VDCisjZGVmaW5lIEtFWV9UWVBFX05BCQkweDAKKyNkZWZpbmUgS0VZX1RZUEVfV0VQNDAgCQkweDEKKyNkZWZpbmUgS0VZX1RZUEVfVEtJUAkJMHgyCisjZGVmaW5lIEtFWV9UWVBFX0NDTVAJCTB4NAorI2RlZmluZSBLRVlfVFlQRV9XRVAxMDQJCTB4NQorLy8jZW5kaWYKKworCisjZGVmaW5lIGFTaWZzVGltZQkJCQkJMTAKKworI2RlZmluZSBNR01UX1FVRVVFX05VTSA1CisKKworI2RlZmluZSBJRUVFX0NNRF9TRVRfV1BBX1BBUkFNCQkJMQorI2RlZmluZQlJRUVFX0NNRF9TRVRfV1BBX0lFCQkJMgorI2RlZmluZSBJRUVFX0NNRF9TRVRfRU5DUllQVElPTgkJCTMKKyNkZWZpbmUgSUVFRV9DTURfTUxNRQkJCQk0CisKKyNkZWZpbmUgSUVFRV9QQVJBTV9XUEFfRU5BQkxFRAkJCTEKKyNkZWZpbmUgSUVFRV9QQVJBTV9US0lQX0NPVU5URVJNRUFTVVJFUwkJMgorI2RlZmluZSBJRUVFX1BBUkFNX0RST1BfVU5FTkNSWVBURUQJCTMKKyNkZWZpbmUgSUVFRV9QQVJBTV9QUklWQUNZX0lOVk9LRUQJCTQKKyNkZWZpbmUgSUVFRV9QQVJBTV9BVVRIX0FMR1MJCQk1CisjZGVmaW5lIElFRUVfUEFSQU1fSUVFRV84MDJfMVgJCQk2CisvL0l0IHNob3VsZCBjb25zaXN0ZW50IHdpdGggdGhlIGRyaXZlcl9YWFguYworLy8gICBEYXZpZCwgMjAwNi45LjI2CisjZGVmaW5lIElFRUVfUEFSQU1fV1BBWF9TRUxFQ1QJCQk3CisvL0FkZGVkIGZvciBub3RpZnkgdGhlIGVuY3J5cHRpb24gdHlwZSBzZWxlY3Rpb24KKy8vICAgRGF2aWQsIDIwMDYuOS4yNgorI2RlZmluZSBJRUVFX1BST1RPX1dQQQkJCQkxCisjZGVmaW5lIElFRUVfUFJPVE9fUlNOCQkJCTIKKy8vQWRkZWQgZm9yIG5vdGlmeSB0aGUgZW5jcnlwdGlvbiB0eXBlIHNlbGVjdGlvbgorLy8gICBEYXZpZCwgMjAwNi45LjI2CisjZGVmaW5lIElFRUVfV1BBWF9VU0VHUk9VUAkJCTAKKyNkZWZpbmUgSUVFRV9XUEFYX1dFUDQwCQkJCTEKKyNkZWZpbmUgSUVFRV9XUEFYX1RLSVAJCQkJMgorI2RlZmluZSBJRUVFX1dQQVhfV1JBUCAgIAkJCTMKKyNkZWZpbmUgSUVFRV9XUEFYX0NDTVAJCQkJNAorI2RlZmluZSBJRUVFX1dQQVhfV0VQMTA0CQkJNQorCisjZGVmaW5lIElFRUVfS0VZX01HTVRfSUVFRTgwMjFYCQkJMQorI2RlZmluZSBJRUVFX0tFWV9NR01UX1BTSwkJCTIKKworCisKKyNkZWZpbmUgSUVFRV9NTE1FX1NUQV9ERUFVVEgJCQkxCisjZGVmaW5lIElFRUVfTUxNRV9TVEFfRElTQVNTT0MJCQkyCisKKworI2RlZmluZSBJRUVFX0NSWVBUX0VSUl9VTktOT1dOX0FMRwkJMgorI2RlZmluZSBJRUVFX0NSWVBUX0VSUl9VTktOT1dOX0FERFIJCTMKKyNkZWZpbmUgSUVFRV9DUllQVF9FUlJfQ1JZUFRfSU5JVF9GQUlMRUQJCTQKKyNkZWZpbmUgSUVFRV9DUllQVF9FUlJfS0VZX1NFVF9GQUlMRUQJCTUKKyNkZWZpbmUgSUVFRV9DUllQVF9FUlJfVFhfS0VZX1NFVF9GQUlMRUQJCTYKKyNkZWZpbmUgSUVFRV9DUllQVF9FUlJfQ0FSRF9DT05GX0ZBSUxFRAkJNworCisKKyNkZWZpbmUJSUVFRV9DUllQVF9BTEdfTkFNRV9MRU4JCQkxNgorCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNiwxMCkpCisjZGVmaW5lIGllZWU4MDIxMV93eF9nZXRfc2NhbiBpZWVlODAyMTFfd3hfZ2V0X3NjYW5fcnRsCisjZGVmaW5lIGllZWU4MDIxMV93eF9zZXRfZW5jb2RlIGllZWU4MDIxMV93eF9zZXRfZW5jb2RlX3J0bAorI2RlZmluZSBpZWVlODAyMTFfd3hfZ2V0X2VuY29kZSBpZWVlODAyMTFfd3hfZ2V0X2VuY29kZV9ydGwKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBhZGRlZCBmb3Iga2VybmVsIGNvbmZsaWN0IHVuZGVyIEZDNQorI2RlZmluZSBpZWVlODAyMTFfd3hfZ2V0X25hbWUgICBpZWVlODAyMTFfd3hfZ2V0X25hbWVfcnRsCisjZGVmaW5lIGZyZWVfaWVlZTgwMjExICAgICAgICAgIGZyZWVfaWVlZTgwMjExX3J0bAorI2RlZmluZSBhbGxvY19pZWVlODAyMTEgICAgICAgIGFsbG9jX2llZWU4MDIxMV9ydGwKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyNlbmRpZgorLy9lcnJvciBpbiB1YnVudHUyLjYuMjIsc28gYWRkIHRoZXNlCisjZGVmaW5lIGllZWU4MDIxMV93YWtlX3F1ZXVlIGllZWU4MDIxMV93YWtlX3F1ZXVlX3J0bAorI2RlZmluZSBpZWVlODAyMTFfc3RvcF9xdWV1ZSBpZWVlODAyMTFfc3RvcF9xdWV1ZV9ydGwKKworI2RlZmluZSBpZWVlODAyMTFfcnggaWVlZTgwMjExX3J4X3J0bAorCisjZGVmaW5lIGllZWU4MDIxMV9yZWdpc3Rlcl9jcnlwdG9fb3BzCWllZWU4MDIxMV9yZWdpc3Rlcl9jcnlwdG9fb3BzX3J0bAorI2RlZmluZSBpZWVlODAyMTFfdW5yZWdpc3Rlcl9jcnlwdG9fb3BzCWllZWU4MDIxMV91bnJlZ2lzdGVyX2NyeXB0b19vcHNfcnRsCisjZGVmaW5lIGllZWU4MDIxMV9nZXRfY3J5cHRvX29wcwlpZWVlODAyMTFfZ2V0X2NyeXB0b19vcHNfcnRsCisjZGVmaW5lIGllZWU4MDIxMV9jcnlwdF9kZWluaXRfZW50cmllcwlpZWVlODAyMTFfY3J5cHRfZGVpbml0X2VudHJpZXNfcnRsCisjZGVmaW5lIGllZWU4MDIxMV9jcnlwdF9kZWluaXRfaGFuZGxlcglpZWVlODAyMTFfY3J5cHRfZGVpbml0X2hhbmRsZXJfcnRsCisjZGVmaW5lIGllZWU4MDIxMV9jcnlwdF9kZWxheWVkX2RlaW5pdAlpZWVlODAyMTFfY3J5cHRfZGVsYXllZF9kZWluaXRfcnRsCisKKyNkZWZpbmUgaWVlZTgwMjExX3R4Yl9mcmVlCWllZWU4MDIxMV90eGJfZnJlZV9ydGwKKyNkZWZpbmUgaWVlZTgwMjExX3d4X2dldF9lc3NpZAlpZWVlODAyMTFfd3hfZ2V0X2Vzc2lkX3J0bAorI2RlZmluZSBpZWVlODAyMTFfd3hfc2V0X2Vzc2lkCWllZWU4MDIxMV93eF9zZXRfZXNzaWRfcnRsCisjZGVmaW5lIGllZWU4MDIxMV93eF9zZXRfcmF0ZQlpZWVlODAyMTFfd3hfc2V0X3JhdGVfcnRsCisjZGVmaW5lIGllZWU4MDIxMV93eF9nZXRfcmF0ZQlpZWVlODAyMTFfd3hfZ2V0X3JhdGVfcnRsCisjZGVmaW5lIGllZWU4MDIxMV93eF9zZXRfd2FwCWllZWU4MDIxMV93eF9zZXRfd2FwX3J0bAorI2RlZmluZSBpZWVlODAyMTFfd3hfZ2V0X3dhcAlpZWVlODAyMTFfd3hfZ2V0X3dhcF9ydGwKKyNkZWZpbmUgaWVlZTgwMjExX3d4X3NldF9tb2RlCWllZWU4MDIxMV93eF9zZXRfbW9kZV9ydGwKKyNkZWZpbmUgaWVlZTgwMjExX3d4X2dldF9tb2RlCWllZWU4MDIxMV93eF9nZXRfbW9kZV9ydGwKKyNkZWZpbmUgaWVlZTgwMjExX3d4X3NldF9zY2FuCWllZWU4MDIxMV93eF9zZXRfc2Nhbl9ydGwKKyNkZWZpbmUgaWVlZTgwMjExX3d4X2dldF9mcmVxCWllZWU4MDIxMV93eF9nZXRfZnJlcV9ydGwKKyNkZWZpbmUgaWVlZTgwMjExX3d4X3NldF9mcmVxCWllZWU4MDIxMV93eF9zZXRfZnJlcV9ydGwKKyNkZWZpbmUgaWVlZTgwMjExX3d4X3NldF9yYXd0eAlpZWVlODAyMTFfd3hfc2V0X3Jhd3R4X3J0bAorI2RlZmluZSBpZWVlODAyMTFfd3hfc2V0X3Bvd2VyCWllZWU4MDIxMV93eF9zZXRfcG93ZXJfcnRsCisjZGVmaW5lIGllZWU4MDIxMV93eF9nZXRfcG93ZXIJaWVlZTgwMjExX3d4X2dldF9wb3dlcl9ydGwKKyNkZWZpbmUgaWVlZTgwMjExX3dsYW5fZnJlcXVlbmNpZXMJaWVlZTgwMjExX3dsYW5fZnJlcXVlbmNpZXNfcnRsCisjZGVmaW5lIGllZWU4MDIxMV9zb2Z0bWFjX3N0b3BfcHJvdG9jb2wJaWVlZTgwMjExX3NvZnRtYWNfc3RvcF9wcm90b2NvbF9ydGwKKyNkZWZpbmUgaWVlZTgwMjExX3NvZnRtYWNfc3RhcnRfcHJvdG9jb2wgaWVlZTgwMjExX3NvZnRtYWNfc3RhcnRfcHJvdG9jb2xfcnRsCisjZGVmaW5lCWllZWU4MDIxMV9zdGFydF9wcm90b2NvbAlpZWVlODAyMTFfc3RhcnRfcHJvdG9jb2xfcnRsCisjZGVmaW5lCWllZWU4MDIxMV9zdG9wX3Byb3RvY29sCQlpZWVlODAyMTFfc3RvcF9wcm90b2NvbF9ydGwKKyNkZWZpbmUJaWVlZTgwMjExX3J4X21ndAkJaWVlZTgwMjExX3J4X21ndF9ydGwKKworI2RlZmluZSBpZWVlODAyMTFfd3hfc2V0X2F1dGggaWVlZTgwMjExX3d4X3NldF9hdXRoX3J0bAorLy9ieSBhbXkgZm9yIHBzCisjZGVmaW5lIG5vdGlmeV93eF9hc3NvY19ldmVudCAgbm90aWZ5X3d4X2Fzc29jX2V2ZW50X3J0bAorI2RlZmluZSBpZWVlODAyMTFfc3RvcF9zZW5kX2JlYWNvbnMgaWVlZTgwMjExX3N0b3Bfc2VuZF9iZWFjb25zX3J0bAorI2RlZmluZSBpZWVlODAyMTFfZGlzYXNzb2NpYXRlIGllZWU4MDIxMV9kaXNhc3NvY2lhdGVfcnRsCisjZGVmaW5lIGllZWU4MDIxMV9zdGFydF9zY2FuIGllZWU4MDIxMV9zdGFydF9zY2FuX3J0bAorLy9ieSBhbXkgZm9yIHBzCit0eXBlZGVmIHN0cnVjdCBpZWVlX3BhcmFtIHsKKwl1MzIgY21kOworCXU4IHN0YV9hZGRyW0VUSF9BTEVOXTsKKyAgICAgICAgdW5pb24geworCQlzdHJ1Y3QgeworCQkJdTggbmFtZTsKKwkJCXUzMiB2YWx1ZTsKKwkJfSB3cGFfcGFyYW07CisJCXN0cnVjdCB7CisJCQl1MzIgbGVuOworCQkJdTggcmVzZXJ2ZWRbMzJdOworCQkJdTggZGF0YVswXTsKKwkJfSB3cGFfaWU7CisJICAgICAgICBzdHJ1Y3R7CisJCQlpbnQgY29tbWFuZDsKKyAgICAJCQlpbnQgcmVhc29uX2NvZGU7CisJCX0gbWxtZTsKKwkJc3RydWN0IHsKKwkJCXU4IGFsZ1tJRUVFX0NSWVBUX0FMR19OQU1FX0xFTl07CisJCQl1OCBzZXRfdHg7CisJCQl1MzIgZXJyOworCQkJdTggaWR4OworCQkJdTggc2VxWzhdOyAvKiBzZXF1ZW5jZSBjb3VudGVyIChzZXQ6IFJYLCBnZXQ6IFRYKSAqLworCQkJdTE2IGtleV9sZW47CisJCQl1OCBrZXlbMF07CisJCX0gY3J5cHQ7CisKKwl9IHU7Cit9aWVlZV9wYXJhbTsKKworCisjaWYgV0lSRUxFU1NfRVhUIDwgMTcKKyNkZWZpbmUgSVdfUVVBTF9RVUFMX0lOVkFMSUQgICAweDEwCisjZGVmaW5lIElXX1FVQUxfTEVWRUxfSU5WQUxJRCAgMHgyMAorI2RlZmluZSBJV19RVUFMX05PSVNFX0lOVkFMSUQgIDB4NDAKKyNkZWZpbmUgSVdfUVVBTF9RVUFMX1VQREFURUQgICAweDEKKyNkZWZpbmUgSVdfUVVBTF9MRVZFTF9VUERBVEVEICAweDIKKyNkZWZpbmUgSVdfUVVBTF9OT0lTRV9VUERBVEVEICAweDQKKyNlbmRpZgorCisvLyBsaW51eCB1bmRlciAyLjYuOSByZWxlYXNlIG1heSBub3Qgc3VwcG9ydCBpdCwgc28gbW9kaWZ5IGl0IGZvciBjb21tb24gdXNlCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiw5KSkKKyNkZWZpbmUgTVNFQ1ModCkJKDEwMDAgKiAoKHQpIC8gSFopICsgMTAwMCAqICgodCkgJSBIWikgLyBIWikKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBtc2xlZXBfaW50ZXJydXB0aWJsZV9ydGwodW5zaWduZWQgaW50IG1zZWNzKQoreworICAgICAgICAgdW5zaWduZWQgbG9uZyB0aW1lb3V0ID0gTVNFQ1MobXNlY3MpICsgMTsKKworICAgICAgICAgd2hpbGUgKHRpbWVvdXQpIHsKKyAgICAgICAgICAgICAgICAgc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworICAgICAgICAgICAgICAgICB0aW1lb3V0ID0gc2NoZWR1bGVfdGltZW91dCh0aW1lb3V0KTsKKyAgICAgICAgIH0KKyAgICAgICAgIHJldHVybiB0aW1lb3V0OworfQorI2Vsc2UKKyNkZWZpbmUgTVNFQ1ModCkgbXNlY3NfdG9famlmZmllcyh0KQorI2RlZmluZSBtc2xlZXBfaW50ZXJydXB0aWJsZV9ydGwgIG1zbGVlcF9pbnRlcnJ1cHRpYmxlCisjZW5kaWYKKworI2RlZmluZSBJRUVFODAyMTFfREFUQV9MRU4JCTIzMDQKKy8qIE1heGltdW0gc2l6ZSBmb3IgdGhlIE1BLVVOSVREQVRBIHByaW1pdGl2ZSwgODAyLjExIHN0YW5kYXJkIHNlY3Rpb24KKyAgIDYuMi4xLjEuMi4KKworICAgVGhlIGZpZ3VyZSBpbiBzZWN0aW9uIDcuMS4yIHN1Z2dlc3RzIGEgYm9keSBzaXplIG9mIHVwIHRvIDIzMTIKKyAgIGJ5dGVzIGlzIGFsbG93ZWQsIHdoaWNoIGlzIGEgYml0IGNvbmZ1c2luZywgSSBzdXNwZWN0IHRoaXMKKyAgIHJlcHJlc2VudHMgdGhlIDIzMDQgYnl0ZXMgb2YgcmVhbCBkYXRhLCBwbHVzIGEgcG9zc2libGUgOCBieXRlcyBvZgorICAgV0VQIElWIGFuZCBJQ1YuICh0aGlzIGludGVycHJldGF0aW9uIHN1Z2dlc3RlZCBieSBSYW1pcm8gQmFycmVpcm8pICovCisKKworI2RlZmluZSBJRUVFODAyMTFfSExFTgkJCTMwCisjZGVmaW5lIElFRUU4MDIxMV9GUkFNRV9MRU4JCShJRUVFODAyMTFfREFUQV9MRU4gKyBJRUVFODAyMTFfSExFTikKKworLyogdGhpcyBpcyBzdG9sZW4gYW5kIG1vZGlmaWVkIGZyb20gdGhlIG1hZHdpZmkgZHJpdmVyKi8KKyNkZWZpbmUgSUVFRTgwMjExX0ZDMF9UWVBFX01BU0sJCTB4MGMKKyNkZWZpbmUgSUVFRTgwMjExX0ZDMF9UWVBFX0RBVEEJCTB4MDgKKyNkZWZpbmUgSUVFRTgwMjExX0ZDMF9TVUJUWVBFX01BU0sJMHhCMAorI2RlZmluZSBJRUVFODAyMTFfRkMwX1NVQlRZUEVfUU9TCTB4ODAKKworI2RlZmluZSBJRUVFODAyMTFfUU9TX0hBU19TRVEoZmMpIFwKKwkoKChmYykgJiAoSUVFRTgwMjExX0ZDMF9UWVBFX01BU0sgfCBJRUVFODAyMTFfRkMwX1NVQlRZUEVfTUFTSykpID09IFwKKwkgKElFRUU4MDIxMV9GQzBfVFlQRV9EQVRBIHwgSUVFRTgwMjExX0ZDMF9TVUJUWVBFX1FPUykpCisKKy8qIHRoaXMgaXMgc3RvbGVuIGZyb20gaXB3MjIwMCBkcml2ZXIgKi8KKyNkZWZpbmUgSUVFRV9JQlNTX01BQ19IQVNIX1NJWkUgMzEKK3N0cnVjdCBpZWVlX2lic3Nfc2VxIHsKKwl1OCBtYWNbRVRIX0FMRU5dOworCXUxNiBzZXFfbnVtWzE3XTsKKwl1MTYgZnJhZ19udW1bMTddOworCXVuc2lnbmVkIGxvbmcgcGFja2V0X3RpbWVbMTddOworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKK307CisKK3N0cnVjdCBpZWVlODAyMTFfaGRyIHsKKwl1MTYgZnJhbWVfY3RsOworCXUxNiBkdXJhdGlvbl9pZDsKKwl1OCBhZGRyMVtFVEhfQUxFTl07CisJdTggYWRkcjJbRVRIX0FMRU5dOworCXU4IGFkZHIzW0VUSF9BTEVOXTsKKwl1MTYgc2VxX2N0bDsKKwl1OCBhZGRyNFtFVEhfQUxFTl07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IGllZWU4MDIxMV9oZHJfUU9TIHsKKwl1MTYgZnJhbWVfY3RsOworCXUxNiBkdXJhdGlvbl9pZDsKKwl1OCBhZGRyMVtFVEhfQUxFTl07CisJdTggYWRkcjJbRVRIX0FMRU5dOworCXU4IGFkZHIzW0VUSF9BTEVOXTsKKwl1MTYgc2VxX2N0bDsKKwl1OCBhZGRyNFtFVEhfQUxFTl07CisJdTE2IFFPU19jdGw7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgeworCXUxNiBmcmFtZV9jdGw7CisJdTE2IGR1cmF0aW9uX2lkOworCXU4IGFkZHIxW0VUSF9BTEVOXTsKKwl1OCBhZGRyMltFVEhfQUxFTl07CisJdTggYWRkcjNbRVRIX0FMRU5dOworCXUxNiBzZXFfY3RsOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyX1FPUyB7CisJdTE2IGZyYW1lX2N0bDsKKwl1MTYgZHVyYXRpb25faWQ7CisJdTggYWRkcjFbRVRIX0FMRU5dOworCXU4IGFkZHIyW0VUSF9BTEVOXTsKKwl1OCBhZGRyM1tFVEhfQUxFTl07CisJdTE2IHNlcV9jdGw7CisJdTE2IFFPU19jdGw7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworZW51bSBlYXBfdHlwZSB7CisJRUFQX1BBQ0tFVCA9IDAsCisJRUFQT0xfU1RBUlQsCisJRUFQT0xfTE9HT0ZGLAorCUVBUE9MX0tFWSwKKwlFQVBPTF9FTkNBUF9BU0ZfQUxFUlQKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICplYXBfdHlwZXNbXSA9IHsKKwlbRUFQX1BBQ0tFVF0JCT0gIkVBUC1QYWNrZXQiLAorCVtFQVBPTF9TVEFSVF0JCT0gIkVBUE9MLVN0YXJ0IiwKKwlbRUFQT0xfTE9HT0ZGXQkJPSAiRUFQT0wtTG9nb2ZmIiwKKwlbRUFQT0xfS0VZXQkJPSAiRUFQT0wtS2V5IiwKKwlbRUFQT0xfRU5DQVBfQVNGX0FMRVJUXQk9ICJFQVBPTC1FbmNhcC1BU0YtQWxlcnQiCit9OworCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKmVhcF9nZXRfdHlwZShpbnQgdHlwZSkKK3sKKwlyZXR1cm4gKHR5cGUgPj0gQVJSQVlfU0laRShlYXBfdHlwZXMpKSA/ICJVbmtub3duIiA6IGVhcF90eXBlc1t0eXBlXTsKK30KKworc3RydWN0IGVhcG9sIHsKKwl1OCBzbmFwWzZdOworCXUxNiBldGhlcnR5cGU7CisJdTggdmVyc2lvbjsKKwl1OCB0eXBlOworCXUxNiBsZW5ndGg7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworI2RlZmluZSBJRUVFODAyMTFfM0FERFJfTEVOIDI0CisjZGVmaW5lIElFRUU4MDIxMV80QUREUl9MRU4gMzAKKyNkZWZpbmUgSUVFRTgwMjExX0ZDU19MRU4gICAgNAorCisjZGVmaW5lIE1JTl9GUkFHX1RIUkVTSE9MRCAgICAgMjU2VQorI2RlZmluZQlNQVhfRlJBR19USFJFU0hPTEQgICAgIDIzNDZVCisKKy8qIEZyYW1lIGNvbnRyb2wgZmllbGQgY29uc3RhbnRzICovCisjZGVmaW5lIElFRUU4MDIxMV9GQ1RMX1ZFUlMJCTB4MDAwMgorI2RlZmluZSBJRUVFODAyMTFfRkNUTF9GVFlQRQkJMHgwMDBjCisjZGVmaW5lIElFRUU4MDIxMV9GQ1RMX1NUWVBFCQkweDAwZjAKKyNkZWZpbmUgSUVFRTgwMjExX0ZDVExfVE9EUwkJMHgwMTAwCisjZGVmaW5lIElFRUU4MDIxMV9GQ1RMX0ZST01EUwkJMHgwMjAwCisjZGVmaW5lIElFRUU4MDIxMV9GQ1RMX0RTVE9EUwkJMHgwMzAwIC8vYWRkZWQgYnkgZGF2aWQKKyNkZWZpbmUgSUVFRTgwMjExX0ZDVExfTU9SRUZSQUdTCTB4MDQwMAorI2RlZmluZSBJRUVFODAyMTFfRkNUTF9SRVRSWQkJMHgwODAwCisjZGVmaW5lIElFRUU4MDIxMV9GQ1RMX1BNCQkweDEwMDAKKyNkZWZpbmUgSUVFRTgwMjExX0ZDVExfTU9SRURBVEEJMHgyMDAwCisjZGVmaW5lIElFRUU4MDIxMV9GQ1RMX1dFUAkJMHg0MDAwCisjZGVmaW5lIElFRUU4MDIxMV9GQ1RMX09SREVSCQkweDgwMDAKKworI2RlZmluZSBJRUVFODAyMTFfRlRZUEVfTUdNVAkJMHgwMDAwCisjZGVmaW5lIElFRUU4MDIxMV9GVFlQRV9DVEwJCTB4MDAwNAorI2RlZmluZSBJRUVFODAyMTFfRlRZUEVfREFUQQkJMHgwMDA4CisKKy8qIG1hbmFnZW1lbnQgKi8KKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX0FTU09DX1JFUQkweDAwMDAKKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX0FTU09DX1JFU1AgCTB4MDAxMAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfUkVBU1NPQ19SRVEJMHgwMDIwCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9SRUFTU09DX1JFU1AJMHgwMDMwCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9QUk9CRV9SRVEJMHgwMDQwCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9QUk9CRV9SRVNQCTB4MDA1MAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfQkVBQ09OCQkweDAwODAKKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX0FUSU0JCTB4MDA5MAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfRElTQVNTT0MJMHgwMEEwCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9BVVRICQkweDAwQjAKKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX0RFQVVUSAkJMHgwMEMwCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9NQU5BR0VfQUNUCTB4MDBEMAorCisvKiBjb250cm9sICovCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9QU1BPTEwJCTB4MDBBMAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfUlRTCQkweDAwQjAKKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX0NUUwkJMHgwMEMwCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9BQ0sJCTB4MDBEMAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfQ0ZFTkQJCTB4MDBFMAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfQ0ZFTkRBQ0sJMHgwMEYwCisKKy8qIGRhdGEgKi8KKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX0RBVEEJCTB4MDAwMAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfREFUQV9DRkFDSwkweDAwMTAKKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX0RBVEFfQ0ZQT0xMCTB4MDAyMAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfREFUQV9DRkFDS1BPTEwJMHgwMDMwCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9OVUxMRlVOQwkweDAwNDAKKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX0NGQUNLCQkweDAwNTAKKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX0NGUE9MTAkJMHgwMDYwCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9DRkFDS1BPTEwJMHgwMDcwCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9RT1NfREFUQQkweDAwODAgLy9hZGRlZCBmb3IgV01NIDIwMDYvOC8yCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9RT1NfTlVMTAkweDAwQzAKKworCisjZGVmaW5lIElFRUU4MDIxMV9TQ1RMX0ZSQUcJCTB4MDAwRgorI2RlZmluZSBJRUVFODAyMTFfU0NUTF9TRVEJCTB4RkZGMAorCisKKy8qIGRlYnVnIG1hY3JvcyAqLworCisjaWZkZWYgQ09ORklHX0lFRUU4MDIxMV9ERUJVRworZXh0ZXJuIHUzMiBpZWVlODAyMTFfZGVidWdfbGV2ZWw7CisjZGVmaW5lIElFRUU4MDIxMV9ERUJVRyhsZXZlbCwgZm10LCBhcmdzLi4uKSBcCitkbyB7IGlmIChpZWVlODAyMTFfZGVidWdfbGV2ZWwgJiAobGV2ZWwpKSBcCisgIHByaW50ayhLRVJOX0RFQlVHICJpZWVlODAyMTE6ICVjICVzICIgZm10LCBcCisgICAgICAgICBpbl9pbnRlcnJ1cHQoKSA/ICdJJyA6ICdVJywgX19mdW5jX18gLCAjIyBhcmdzKTsgfSB3aGlsZSAoMCkKKyNlbHNlCisjZGVmaW5lIElFRUU4MDIxMV9ERUJVRyhsZXZlbCwgZm10LCBhcmdzLi4uKSBkbyB7fSB3aGlsZSAoMCkKKyNlbmRpZgkvKiBDT05GSUdfSUVFRTgwMjExX0RFQlVHICovCisKKy8qCisgKiBUbyB1c2UgdGhlIGRlYnVnIHN5c3RlbTsKKyAqCisgKiBJZiB5b3UgYXJlIGRlZmluaW5nIGEgbmV3IGRlYnVnIGNsYXNzaWZpY2F0aW9uLCBzaW1wbHkgYWRkIGl0IHRvIHRoZSAjZGVmaW5lCisgKiBsaXN0IGhlcmUgaW4gdGhlIGZvcm0gb2Y6CisgKgorICogI2RlZmluZSBJRUVFODAyMTFfRExfeHh4eCBWQUxVRQorICoKKyAqIHNoaWZ0aW5nIHZhbHVlIHRvIHRoZSBsZWZ0IG9uZSBiaXQgZnJvbSB0aGUgcHJldmlvdXMgZW50cnkuICB4eHh4IHNob3VsZCBiZQorICogdGhlIG5hbWUgb2YgdGhlIGNsYXNzaWZpY2F0aW9uIChmb3IgZXhhbXBsZSwgV0VQKQorICoKKyAqIFlvdSB0aGVuIG5lZWQgdG8gZWl0aGVyIGFkZCBhIElFRUU4MDIxMV94eHh4X0RFQlVHKCkgbWFjcm8gZGVmaW5pdGlvbiBmb3IgeW91cgorICogY2xhc3NpZmljYXRpb24sIG9yIHVzZSBJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX3h4eHgsIC4uLikgd2hlbmV2ZXIgeW91IHdhbnQKKyAqIHRvIHNlbmQgb3V0cHV0IHRvIHRoYXQgY2xhc3NpZmljYXRpb24uCisgKgorICogVG8gYWRkIHlvdXIgZGVidWcgbGV2ZWwgdG8gdGhlIGxpc3Qgb2YgbGV2ZWxzIHNlZW4gd2hlbiB5b3UgcGVyZm9ybQorICoKKyAqICUgY2F0IC9wcm9jL25ldC9pcHcvZGVidWdfbGV2ZWwKKyAqCisgKiB5b3Ugc2ltcGx5IG5lZWQgdG8gYWRkIHlvdXIgZW50cnkgdG8gdGhlIGlwd19kZWJ1Z19sZXZlbHMgYXJyYXkuCisgKgorICogSWYgeW91IGRvIG5vdCBzZWUgZGVidWdfbGV2ZWwgaW4gL3Byb2MvbmV0L2lwdyB0aGVuIHlvdSBkbyBub3QgaGF2ZQorICogQ09ORklHX0lFRUU4MDIxMV9ERUJVRyBkZWZpbmVkIGluIHlvdXIga2VybmVsIGNvbmZpZ3VyYXRpb24KKyAqCisgKi8KKworI2RlZmluZSBJRUVFODAyMTFfRExfSU5GTyAgICAgICAgICAoMTw8MCkKKyNkZWZpbmUgSUVFRTgwMjExX0RMX1dYICAgICAgICAgICAgKDE8PDEpCisjZGVmaW5lIElFRUU4MDIxMV9ETF9TQ0FOICAgICAgICAgICgxPDwyKQorI2RlZmluZSBJRUVFODAyMTFfRExfU1RBVEUgICAgICAgICAoMTw8MykKKyNkZWZpbmUgSUVFRTgwMjExX0RMX01HTVQgICAgICAgICAgKDE8PDQpCisjZGVmaW5lIElFRUU4MDIxMV9ETF9GUkFHICAgICAgICAgICgxPDw1KQorI2RlZmluZSBJRUVFODAyMTFfRExfRUFQICAgICAgICAgICAoMTw8NikKKyNkZWZpbmUgSUVFRTgwMjExX0RMX0RST1AgICAgICAgICAgKDE8PDcpCisKKyNkZWZpbmUgSUVFRTgwMjExX0RMX1RYICAgICAgICAgICAgKDE8PDgpCisjZGVmaW5lIElFRUU4MDIxMV9ETF9SWCAgICAgICAgICAgICgxPDw5KQorCisjZGVmaW5lIElFRUU4MDIxMV9FUlJPUihmLCBhLi4uKSBwcmludGsoS0VSTl9FUlIgImllZWU4MDIxMTogIiBmLCAjIyBhKQorI2RlZmluZSBJRUVFODAyMTFfV0FSTklORyhmLCBhLi4uKSBwcmludGsoS0VSTl9XQVJOSU5HICJpZWVlODAyMTE6ICIgZiwgIyMgYSkKKyNkZWZpbmUgSUVFRTgwMjExX0RFQlVHX0lORk8oZiwgYS4uLikgICBJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0lORk8sIGYsICMjIGEpCisKKyNkZWZpbmUgSUVFRTgwMjExX0RFQlVHX1dYKGYsIGEuLi4pICAgICBJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX1dYLCBmLCAjIyBhKQorI2RlZmluZSBJRUVFODAyMTFfREVCVUdfU0NBTihmLCBhLi4uKSAgIElFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfU0NBTiwgZiwgIyMgYSkKKy8vI2RlZmluZSBJRUVFX0RFQlVHX1NDQU4gIElFRUU4MDIxMV9XQVJOSU5HCisjZGVmaW5lIElFRUU4MDIxMV9ERUJVR19TVEFURShmLCBhLi4uKSAgSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9TVEFURSwgZiwgIyMgYSkKKyNkZWZpbmUgSUVFRTgwMjExX0RFQlVHX01HTVQoZiwgYS4uLikgIElFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfTUdNVCwgZiwgIyMgYSkKKyNkZWZpbmUgSUVFRTgwMjExX0RFQlVHX0ZSQUcoZiwgYS4uLikgIElFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfRlJBRywgZiwgIyMgYSkKKyNkZWZpbmUgSUVFRTgwMjExX0RFQlVHX0VBUChmLCBhLi4uKSAgSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9FQVAsIGYsICMjIGEpCisjZGVmaW5lIElFRUU4MDIxMV9ERUJVR19EUk9QKGYsIGEuLi4pICBJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0RST1AsIGYsICMjIGEpCisjZGVmaW5lIElFRUU4MDIxMV9ERUJVR19UWChmLCBhLi4uKSAgSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9UWCwgZiwgIyMgYSkKKyNkZWZpbmUgSUVFRTgwMjExX0RFQlVHX1JYKGYsIGEuLi4pICBJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX1JYLCBmLCAjIyBhKQorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3dpcmVsZXNzLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+IC8qIEFSUEhSRF9FVEhFUiAqLworCisjaWZuZGVmIFdJUkVMRVNTX1NQWQorI2RlZmluZSBXSVJFTEVTU19TUFkJCS8vIGVuYWJsZSBpd3NweSBzdXBwb3J0CisjZW5kaWYKKyNpbmNsdWRlIDxuZXQvaXdfaGFuZGxlci5oPgkvLyBuZXcgZHJpdmVyIEFQSQorCisjaWZuZGVmIEVUSF9QX1BBRQorI2RlZmluZSBFVEhfUF9QQUUgMHg4ODhFIC8qIFBvcnQgQWNjZXNzIEVudGl0eSAoSUVFRSA4MDIuMVgpICovCisjZW5kaWYgLyogRVRIX1BfUEFFICovCisKKyNkZWZpbmUgRVRIX1BfUFJFQVVUSCAweDg4QzcgLyogSUVFRSA4MDIuMTFpIHByZS1hdXRoZW50aWNhdGlvbiAqLworCisjaWZuZGVmIEVUSF9QXzgwMjExX1JBVworI2RlZmluZSBFVEhfUF84MDIxMV9SQVcgKEVUSF9QX0VDT05FVCArIDEpCisjZW5kaWYKKworLyogSUVFRSA4MDIuMTEgZGVmaW5lcyAqLworCisjZGVmaW5lIFA4MDIxMV9PVUlfTEVOIDMKKworc3RydWN0IGllZWU4MDIxMV9zbmFwX2hkciB7CisKKyAgICAgICAgdTggICAgZHNhcDsgICAvKiBhbHdheXMgMHhBQSAqLworICAgICAgICB1OCAgICBzc2FwOyAgIC8qIGFsd2F5cyAweEFBICovCisgICAgICAgIHU4ICAgIGN0cmw7ICAgLyogYWx3YXlzIDB4MDMgKi8KKyAgICAgICAgdTggICAgb3VpW1A4MDIxMV9PVUlfTEVOXTsgICAgLyogb3JnYW5pemF0aW9uYWwgdW5pdmVyc2FsIGlkICovCisKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisjZGVmaW5lIFNOQVBfU0laRSBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9zbmFwX2hkcikKKworI2RlZmluZSBXTEFOX0ZDX0dFVF9UWVBFKGZjKSAoKGZjKSAmIElFRUU4MDIxMV9GQ1RMX0ZUWVBFKQorI2RlZmluZSBXTEFOX0ZDX0dFVF9TVFlQRShmYykgKChmYykgJiBJRUVFODAyMTFfRkNUTF9TVFlQRSkKKworI2RlZmluZSBXTEFOX0dFVF9TRVFfRlJBRyhzZXEpICgoc2VxKSAmIElFRUU4MDIxMV9TQ1RMX0ZSQUcpCisjZGVmaW5lIFdMQU5fR0VUX1NFUV9TRVEoc2VxKSAgKChzZXEpICYgSUVFRTgwMjExX1NDVExfU0VRKQorCisvKiBBdXRoZW50aWNhdGlvbiBhbGdvcml0aG1zICovCisjZGVmaW5lIFdMQU5fQVVUSF9PUEVOIDAKKyNkZWZpbmUgV0xBTl9BVVRIX1NIQVJFRF9LRVkgMQorCisjZGVmaW5lIFdMQU5fQVVUSF9DSEFMTEVOR0VfTEVOIDEyOAorCisjZGVmaW5lIFdMQU5fQ0FQQUJJTElUWV9CU1MgKDE8PDApCisjZGVmaW5lIFdMQU5fQ0FQQUJJTElUWV9JQlNTICgxPDwxKQorI2RlZmluZSBXTEFOX0NBUEFCSUxJVFlfQ0ZfUE9MTEFCTEUgKDE8PDIpCisjZGVmaW5lIFdMQU5fQ0FQQUJJTElUWV9DRl9QT0xMX1JFUVVFU1QgKDE8PDMpCisjZGVmaW5lIFdMQU5fQ0FQQUJJTElUWV9QUklWQUNZICgxPDw0KQorI2RlZmluZSBXTEFOX0NBUEFCSUxJVFlfU0hPUlRfUFJFQU1CTEUgKDE8PDUpCisjZGVmaW5lIFdMQU5fQ0FQQUJJTElUWV9QQkNDICgxPDw2KQorI2RlZmluZSBXTEFOX0NBUEFCSUxJVFlfQ0hBTk5FTF9BR0lMSVRZICgxPDw3KQorI2RlZmluZSBXTEFOX0NBUEFCSUxJVFlfU0hPUlRfU0xPVCAoMTw8MTApCisKKy8qIFN0YXR1cyBjb2RlcyAqLworI2RlZmluZSBXTEFOX1NUQVRVU19TVUNDRVNTIDAKKyNkZWZpbmUgV0xBTl9TVEFUVVNfVU5TUEVDSUZJRURfRkFJTFVSRSAxCisjZGVmaW5lIFdMQU5fU1RBVFVTX0NBUFNfVU5TVVBQT1JURUQgMTAKKyNkZWZpbmUgV0xBTl9TVEFUVVNfUkVBU1NPQ19OT19BU1NPQyAxMQorI2RlZmluZSBXTEFOX1NUQVRVU19BU1NPQ19ERU5JRURfVU5TUEVDIDEyCisjZGVmaW5lIFdMQU5fU1RBVFVTX05PVF9TVVBQT1JURURfQVVUSF9BTEcgMTMKKyNkZWZpbmUgV0xBTl9TVEFUVVNfVU5LTk9XTl9BVVRIX1RSQU5TQUNUSU9OIDE0CisjZGVmaW5lIFdMQU5fU1RBVFVTX0NIQUxMRU5HRV9GQUlMIDE1CisjZGVmaW5lIFdMQU5fU1RBVFVTX0FVVEhfVElNRU9VVCAxNgorI2RlZmluZSBXTEFOX1NUQVRVU19BUF9VTkFCTEVfVE9fSEFORExFX05FV19TVEEgMTcKKyNkZWZpbmUgV0xBTl9TVEFUVVNfQVNTT0NfREVOSUVEX1JBVEVTIDE4CisvKiA4MDIuMTFiICovCisjZGVmaW5lIFdMQU5fU1RBVFVTX0FTU09DX0RFTklFRF9OT1NIT1JUIDE5CisjZGVmaW5lIFdMQU5fU1RBVFVTX0FTU09DX0RFTklFRF9OT1BCQ0MgMjAKKyNkZWZpbmUgV0xBTl9TVEFUVVNfQVNTT0NfREVOSUVEX05PQUdJTElUWSAyMQorCisvKiBSZWFzb24gY29kZXMgKi8KKyNkZWZpbmUgV0xBTl9SRUFTT05fVU5TUEVDSUZJRUQgMQorI2RlZmluZSBXTEFOX1JFQVNPTl9QUkVWX0FVVEhfTk9UX1ZBTElEIDIKKyNkZWZpbmUgV0xBTl9SRUFTT05fREVBVVRIX0xFQVZJTkcgMworI2RlZmluZSBXTEFOX1JFQVNPTl9ESVNBU1NPQ19EVUVfVE9fSU5BQ1RJVklUWSA0CisjZGVmaW5lIFdMQU5fUkVBU09OX0RJU0FTU09DX0FQX0JVU1kgNQorI2RlZmluZSBXTEFOX1JFQVNPTl9DTEFTUzJfRlJBTUVfRlJPTV9OT05BVVRIX1NUQSA2CisjZGVmaW5lIFdMQU5fUkVBU09OX0NMQVNTM19GUkFNRV9GUk9NX05PTkFTU09DX1NUQSA3CisjZGVmaW5lIFdMQU5fUkVBU09OX0RJU0FTU09DX1NUQV9IQVNfTEVGVCA4CisjZGVmaW5lIFdMQU5fUkVBU09OX1NUQV9SRVFfQVNTT0NfV0lUSE9VVF9BVVRIIDkKKworCisvKiBJbmZvcm1hdGlvbiBFbGVtZW50IElEcyAqLworI2RlZmluZSBXTEFOX0VJRF9TU0lEIDAKKyNkZWZpbmUgV0xBTl9FSURfU1VQUF9SQVRFUyAxCisjZGVmaW5lIFdMQU5fRUlEX0ZIX1BBUkFNUyAyCisjZGVmaW5lIFdMQU5fRUlEX0RTX1BBUkFNUyAzCisjZGVmaW5lIFdMQU5fRUlEX0NGX1BBUkFNUyA0CisjZGVmaW5lIFdMQU5fRUlEX1RJTSA1CisjZGVmaW5lIFdMQU5fRUlEX0lCU1NfUEFSQU1TIDYKKyNkZWZpbmUgV0xBTl9FSURfQ0hBTExFTkdFIDE2CisjZGVmaW5lIFdMQU5fRUlEX1JTTiA0OAorI2RlZmluZSBXTEFOX0VJRF9HRU5FUklDIDIyMQorCisjZGVmaW5lIElFRUU4MDIxMV9NR01UX0hEUl9MRU4gMjQKKyNkZWZpbmUgSUVFRTgwMjExX0RBVEFfSERSM19MRU4gMjQKKyNkZWZpbmUgSUVFRTgwMjExX0RBVEFfSERSNF9MRU4gMzAKKworCisjZGVmaW5lIElFRUU4MDIxMV9TVEFUTUFTS19TSUdOQUwgKDE8PDApCisjZGVmaW5lIElFRUU4MDIxMV9TVEFUTUFTS19SU1NJICgxPDwxKQorI2RlZmluZSBJRUVFODAyMTFfU1RBVE1BU0tfTk9JU0UgKDE8PDIpCisjZGVmaW5lIElFRUU4MDIxMV9TVEFUTUFTS19SQVRFICgxPDwzKQorI2RlZmluZSBJRUVFODAyMTFfU1RBVE1BU0tfV0VNQVNLIDB4NworCisKKyNkZWZpbmUgSUVFRTgwMjExX0NDS19NT0RVTEFUSU9OICAgICgxPDwwKQorI2RlZmluZSBJRUVFODAyMTFfT0ZETV9NT0RVTEFUSU9OICAgKDE8PDEpCisKKyNkZWZpbmUgSUVFRTgwMjExXzI0R0haX0JBTkQgICAgICgxPDwwKQorI2RlZmluZSBJRUVFODAyMTFfNTJHSFpfQkFORCAgICAgKDE8PDEpCisKKyNkZWZpbmUgSUVFRTgwMjExX0NDS19SQVRFX0xFTiAgCQk0CisjZGVmaW5lIElFRUU4MDIxMV9DQ0tfUkFURV8xTUIJCSAgICAgICAgMHgwMgorI2RlZmluZSBJRUVFODAyMTFfQ0NLX1JBVEVfMk1CCQkgICAgICAgIDB4MDQKKyNkZWZpbmUgSUVFRTgwMjExX0NDS19SQVRFXzVNQgkJICAgICAgICAweDBCCisjZGVmaW5lIElFRUU4MDIxMV9DQ0tfUkFURV8xMU1CCQkgICAgICAgIDB4MTYKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURV9MRU4gCQk4CisjZGVmaW5lIElFRUU4MDIxMV9PRkRNX1JBVEVfNk1CCQkgICAgICAgIDB4MEMKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURV85TUIJCSAgICAgICAgMHgxMgorI2RlZmluZSBJRUVFODAyMTFfT0ZETV9SQVRFXzEyTUIJCTB4MTgKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURV8xOE1CCQkweDI0CisjZGVmaW5lIElFRUU4MDIxMV9PRkRNX1JBVEVfMjRNQgkJMHgzMAorI2RlZmluZSBJRUVFODAyMTFfT0ZETV9SQVRFXzM2TUIJCTB4NDgKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURV80OE1CCQkweDYwCisjZGVmaW5lIElFRUU4MDIxMV9PRkRNX1JBVEVfNTRNQgkJMHg2QworI2RlZmluZSBJRUVFODAyMTFfQkFTSUNfUkFURV9NQVNLCQkweDgwCisKKyNkZWZpbmUgSUVFRTgwMjExX0NDS19SQVRFXzFNQl9NQVNLCQkoMTw8MCkKKyNkZWZpbmUgSUVFRTgwMjExX0NDS19SQVRFXzJNQl9NQVNLCQkoMTw8MSkKKyNkZWZpbmUgSUVFRTgwMjExX0NDS19SQVRFXzVNQl9NQVNLCQkoMTw8MikKKyNkZWZpbmUgSUVFRTgwMjExX0NDS19SQVRFXzExTUJfTUFTSwkJKDE8PDMpCisjZGVmaW5lIElFRUU4MDIxMV9PRkRNX1JBVEVfNk1CX01BU0sJCSgxPDw0KQorI2RlZmluZSBJRUVFODAyMTFfT0ZETV9SQVRFXzlNQl9NQVNLCQkoMTw8NSkKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURV8xMk1CX01BU0sJCSgxPDw2KQorI2RlZmluZSBJRUVFODAyMTFfT0ZETV9SQVRFXzE4TUJfTUFTSwkJKDE8PDcpCisjZGVmaW5lIElFRUU4MDIxMV9PRkRNX1JBVEVfMjRNQl9NQVNLCQkoMTw8OCkKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURV8zNk1CX01BU0sJCSgxPDw5KQorI2RlZmluZSBJRUVFODAyMTFfT0ZETV9SQVRFXzQ4TUJfTUFTSwkJKDE8PDEwKQorI2RlZmluZSBJRUVFODAyMTFfT0ZETV9SQVRFXzU0TUJfTUFTSwkJKDE8PDExKQorCisjZGVmaW5lIElFRUU4MDIxMV9DQ0tfUkFURVNfTUFTSwkgICAgICAgIDB4MDAwMDAwMEYKKyNkZWZpbmUgSUVFRTgwMjExX0NDS19CQVNJQ19SQVRFU19NQVNLCShJRUVFODAyMTFfQ0NLX1JBVEVfMU1CX01BU0sgfCBcCisJSUVFRTgwMjExX0NDS19SQVRFXzJNQl9NQVNLKQorI2RlZmluZSBJRUVFODAyMTFfQ0NLX0RFRkFVTFRfUkFURVNfTUFTSwkoSUVFRTgwMjExX0NDS19CQVNJQ19SQVRFU19NQVNLIHwgXAorICAgICAgICBJRUVFODAyMTFfQ0NLX1JBVEVfNU1CX01BU0sgfCBcCisgICAgICAgIElFRUU4MDIxMV9DQ0tfUkFURV8xMU1CX01BU0spCisKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURVNfTUFTSwkJMHgwMDAwMEZGMAorI2RlZmluZSBJRUVFODAyMTFfT0ZETV9CQVNJQ19SQVRFU19NQVNLCShJRUVFODAyMTFfT0ZETV9SQVRFXzZNQl9NQVNLIHwgXAorCUlFRUU4MDIxMV9PRkRNX1JBVEVfMTJNQl9NQVNLIHwgXAorCUlFRUU4MDIxMV9PRkRNX1JBVEVfMjRNQl9NQVNLKQorI2RlZmluZSBJRUVFODAyMTFfT0ZETV9ERUZBVUxUX1JBVEVTX01BU0sJKElFRUU4MDIxMV9PRkRNX0JBU0lDX1JBVEVTX01BU0sgfCBcCisJSUVFRTgwMjExX09GRE1fUkFURV85TUJfTUFTSyAgfCBcCisJSUVFRTgwMjExX09GRE1fUkFURV8xOE1CX01BU0sgfCBcCisJSUVFRTgwMjExX09GRE1fUkFURV8zNk1CX01BU0sgfCBcCisJSUVFRTgwMjExX09GRE1fUkFURV80OE1CX01BU0sgfCBcCisJSUVFRTgwMjExX09GRE1fUkFURV81NE1CX01BU0spCisjZGVmaW5lIElFRUU4MDIxMV9ERUZBVUxUX1JBVEVTX01BU0sgKElFRUU4MDIxMV9PRkRNX0RFRkFVTFRfUkFURVNfTUFTSyB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUVFRTgwMjExX0NDS19ERUZBVUxUX1JBVEVTX01BU0spCisKKyNkZWZpbmUgSUVFRTgwMjExX05VTV9PRkRNX1JBVEVTCSAgICA4CisjZGVmaW5lIElFRUU4MDIxMV9OVU1fQ0NLX1JBVEVTCSAgICAgICAgICAgIDQKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fU0hJRlRfTUFTS19BICAgICAgICAgNAorCisKKworCisvKiBOT1RFOiBUaGlzIGRhdGEgaXMgZm9yIHN0YXRpc3RpY2FsIHB1cnBvc2VzOyBub3QgYWxsIGhhcmR3YXJlIHByb3ZpZGVzIHRoaXMKKyAqICAgICAgIGluZm9ybWF0aW9uIGZvciBmcmFtZXMgcmVjZWl2ZWQuICBOb3Qgc2V0dGluZyB0aGVzZSB3aWxsIG5vdCBjYXVzZQorICogICAgICAgYW55IGFkdmVyc2UgYWZmZWN0cy4gKi8KK3N0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHMgeworCXUzMiBtYWNfdGltZVsyXTsKKwl1OCBzaWduYWxzdHJlbmd0aDsKKwlzOCByc3NpOworCXU4IHNpZ25hbDsKKwl1OCBub2lzZTsKKwl1MTYgcmF0ZTsgLyogaW4gMTAwIGticHMgKi8KKwl1OCByZWNlaXZlZF9jaGFubmVsOworCXU4IGNvbnRyb2w7CisJdTggbWFzazsKKwl1OCBmcmVxOworCXUxNiBsZW47CisJdTggbmljX3R5cGU7Cit9OworCisvKiBJRUVFIDgwMi4xMSByZXF1aXJlcyB0aGF0IFNUQSBzdXBwb3J0cyBjb25jdXJyZW50IHJlY2VwdGlvbiBvZiBhdCBsZWFzdAorICogdGhyZWUgZnJhZ21lbnRlZCBmcmFtZXMuIFRoaXMgZGVmaW5lIGNhbiBiZSBpbmNyZWFzZWQgdG8gc3VwcG9ydCBtb3JlCisgKiBjb25jdXJyZW50IGZyYW1lcywgYnV0IGl0IHNob3VsZCBiZSBub3RlZCB0aGF0IGVhY2ggZW50cnkgY2FuIGNvbnN1bWUgYWJvdXQKKyAqIDIga0Igb2YgUkFNIGFuZCBpbmNyZWFzaW5nIGNhY2hlIHNpemUgd2lsbCBzbG93IGRvd24gZnJhbWUgcmVhc3NlbWJseS4gKi8KKyNkZWZpbmUgSUVFRTgwMjExX0ZSQUdfQ0FDSEVfTEVOIDQKKworc3RydWN0IGllZWU4MDIxMV9mcmFnX2VudHJ5IHsKKwl1bnNpZ25lZCBsb25nIGZpcnN0X2ZyYWdfdGltZTsKKwl1bnNpZ25lZCBpbnQgc2VxOworCXVuc2lnbmVkIGludCBsYXN0X2ZyYWc7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwl1OCBzcmNfYWRkcltFVEhfQUxFTl07CisJdTggZHN0X2FkZHJbRVRIX0FMRU5dOworfTsKKworc3RydWN0IGllZWU4MDIxMV9zdGF0cyB7CisJdW5zaWduZWQgaW50IHR4X3VuaWNhc3RfZnJhbWVzOworCXVuc2lnbmVkIGludCB0eF9tdWx0aWNhc3RfZnJhbWVzOworCXVuc2lnbmVkIGludCB0eF9mcmFnbWVudHM7CisJdW5zaWduZWQgaW50IHR4X3VuaWNhc3Rfb2N0ZXRzOworCXVuc2lnbmVkIGludCB0eF9tdWx0aWNhc3Rfb2N0ZXRzOworCXVuc2lnbmVkIGludCB0eF9kZWZlcnJlZF90cmFuc21pc3Npb25zOworCXVuc2lnbmVkIGludCB0eF9zaW5nbGVfcmV0cnlfZnJhbWVzOworCXVuc2lnbmVkIGludCB0eF9tdWx0aXBsZV9yZXRyeV9mcmFtZXM7CisJdW5zaWduZWQgaW50IHR4X3JldHJ5X2xpbWl0X2V4Y2VlZGVkOworCXVuc2lnbmVkIGludCB0eF9kaXNjYXJkczsKKwl1bnNpZ25lZCBpbnQgcnhfdW5pY2FzdF9mcmFtZXM7CisJdW5zaWduZWQgaW50IHJ4X211bHRpY2FzdF9mcmFtZXM7CisJdW5zaWduZWQgaW50IHJ4X2ZyYWdtZW50czsKKwl1bnNpZ25lZCBpbnQgcnhfdW5pY2FzdF9vY3RldHM7CisJdW5zaWduZWQgaW50IHJ4X211bHRpY2FzdF9vY3RldHM7CisJdW5zaWduZWQgaW50IHJ4X2Zjc19lcnJvcnM7CisJdW5zaWduZWQgaW50IHJ4X2Rpc2NhcmRzX25vX2J1ZmZlcjsKKwl1bnNpZ25lZCBpbnQgdHhfZGlzY2FyZHNfd3Jvbmdfc2E7CisJdW5zaWduZWQgaW50IHJ4X2Rpc2NhcmRzX3VuZGVjcnlwdGFibGU7CisJdW5zaWduZWQgaW50IHJ4X21lc3NhZ2VfaW5fbXNnX2ZyYWdtZW50czsKKwl1bnNpZ25lZCBpbnQgcnhfbWVzc2FnZV9pbl9iYWRfbXNnX2ZyYWdtZW50czsKK307CisKK3N0cnVjdCBpZWVlODAyMTFfc29mdG1hY19zdGF0c3sKKwl1bnNpZ25lZCBpbnQgcnhfYXNzX29rOworCXVuc2lnbmVkIGludCByeF9hc3NfZXJyOworCXVuc2lnbmVkIGludCByeF9wcm9iZV9ycTsKKwl1bnNpZ25lZCBpbnQgdHhfcHJvYmVfcnM7CisJdW5zaWduZWQgaW50IHR4X2JlYWNvbnM7CisJdW5zaWduZWQgaW50IHJ4X2F1dGhfcnE7CisJdW5zaWduZWQgaW50IHJ4X2F1dGhfcnNfb2s7CisJdW5zaWduZWQgaW50IHJ4X2F1dGhfcnNfZXJyOworCXVuc2lnbmVkIGludCB0eF9hdXRoX3JxOworCXVuc2lnbmVkIGludCBub19hdXRoX3JzOworCXVuc2lnbmVkIGludCBub19hc3NfcnM7CisJdW5zaWduZWQgaW50IHR4X2Fzc19ycTsKKwl1bnNpZ25lZCBpbnQgcnhfYXNzX3JxOworCXVuc2lnbmVkIGludCB0eF9wcm9iZV9ycTsKKwl1bnNpZ25lZCBpbnQgcmVhc3NvYzsKKwl1bnNpZ25lZCBpbnQgc3d0eHN0b3A7CisJdW5zaWduZWQgaW50IHN3dHhhd2FrZTsKK307CisKK3N0cnVjdCBpZWVlODAyMTFfZGV2aWNlOworCisjaW5jbHVkZSAiaWVlZTgwMjExX2NyeXB0LmgiCisKKyNkZWZpbmUgU0VDX0tFWV8xICAgICAgICAgKDE8PDApCisjZGVmaW5lIFNFQ19LRVlfMiAgICAgICAgICgxPDwxKQorI2RlZmluZSBTRUNfS0VZXzMgICAgICAgICAoMTw8MikKKyNkZWZpbmUgU0VDX0tFWV80ICAgICAgICAgKDE8PDMpCisjZGVmaW5lIFNFQ19BQ1RJVkVfS0VZICAgICgxPDw0KQorI2RlZmluZSBTRUNfQVVUSF9NT0RFICAgICAoMTw8NSkKKyNkZWZpbmUgU0VDX1VOSUNBU1RfR1JPVVAgKDE8PDYpCisjZGVmaW5lIFNFQ19MRVZFTCAgICAgICAgICgxPDw3KQorI2RlZmluZSBTRUNfRU5BQkxFRCAgICAgICAoMTw8OCkKKworI2RlZmluZSBTRUNfTEVWRUxfMCAgICAgIDAgLyogTm9uZSAqLworI2RlZmluZSBTRUNfTEVWRUxfMSAgICAgIDEgLyogV0VQIDQwIGFuZCAxMDQgYml0ICovCisjZGVmaW5lIFNFQ19MRVZFTF8yICAgICAgMiAvKiBMZXZlbCAxICsgVEtJUCAqLworI2RlZmluZSBTRUNfTEVWRUxfMl9DS0lQIDMgLyogTGV2ZWwgMSArIENLSVAgKi8KKyNkZWZpbmUgU0VDX0xFVkVMXzMgICAgICA0IC8qIExldmVsIDIgKyBDQ01QICovCisKKyNkZWZpbmUgV0VQX0tFWVMgNAorI2RlZmluZSBXRVBfS0VZX0xFTiAxMworCisjZGVmaW5lIFdFUF9LRVlfTEVOX01PRElGIDMyCisKK3N0cnVjdCBpZWVlODAyMTFfc2VjdXJpdHkgeworCXUxNiBhY3RpdmVfa2V5OjIsCisgICAgICAgICAgICBlbmFibGVkOjEsCisJICAgIGF1dGhfbW9kZToyLAorICAgICAgICAgICAgYXV0aF9hbGdvOjQsCisgICAgICAgICAgICB1bmljYXN0X3VzZXNfZ3JvdXA6MTsKKwl1OCBrZXlfc2l6ZXNbV0VQX0tFWVNdOworCXU4IGtleXNbV0VQX0tFWVNdW1dFUF9LRVlfTEVOX01PRElGXTsKKwl1OCBsZXZlbDsKKwl1MTYgZmxhZ3M7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworCisvKgorCisgODAyLjExIGRhdGEgZnJhbWUgZnJvbSBBUAorCisgICAgICAsLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KK0J5dGVzIHwgIDIgICB8ICAyICAgfCAgICA2ICAgIHwgICAgNiAgICB8ICAgIDYgICAgfCAgMiAgIHwgMC4uMjMxMiB8ICAgNCAgfAorICAgICAgfC0tLS0tLXwtLS0tLS18LS0tLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLS18LS0tLS0tfC0tLS0tLS0tLXwtLS0tLS18CitEZXNjLiB8IGN0cmwgfCBkdXJhIHwgIERBL1JBICB8ICAgVEEgICAgfCAgICBTQSAgIHwgU2VxdSB8ICBmcmFtZSAgfCAgZmNzIHwKKyAgICAgIHwgICAgICB8IHRpb24gfCAoQlNTSUQpIHwgICAgICAgICB8ICAgICAgICAgfCBlbmNlIHwgIGRhdGEgICB8ICAgICAgfAorICAgICAgYC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nCisKK1RvdGFsOiAyOC0yMzQwIGJ5dGVzCisKKyovCisKK3N0cnVjdCBpZWVlODAyMTFfaGVhZGVyX2RhdGEgeworCXUxNiBmcmFtZV9jdGw7CisJdTE2IGR1cmF0aW9uX2lkOworCXU4IGFkZHIxWzZdOworCXU4IGFkZHIyWzZdOworCXU4IGFkZHIzWzZdOworCXUxNiBzZXFfY3RybDsKK307CisKKyNkZWZpbmUgQkVBQ09OX1BST0JFX1NTSURfSURfUE9TSVRJT04gMTIKKworLyogTWFuYWdlbWVudCBGcmFtZSBJbmZvcm1hdGlvbiBFbGVtZW50IFR5cGVzICovCisjZGVmaW5lIE1GSUVfVFlQRV9TU0lEICAgICAgIDAKKyNkZWZpbmUgTUZJRV9UWVBFX1JBVEVTICAgICAgMQorI2RlZmluZSBNRklFX1RZUEVfRkhfU0VUICAgICAyCisjZGVmaW5lIE1GSUVfVFlQRV9EU19TRVQgICAgIDMKKyNkZWZpbmUgTUZJRV9UWVBFX0NGX1NFVCAgICAgNAorI2RlZmluZSBNRklFX1RZUEVfVElNICAgICAgICA1CisjZGVmaW5lIE1GSUVfVFlQRV9JQlNTX1NFVCAgIDYKKyNkZWZpbmUgTUZJRV9UWVBFX0NPVU5UUlkgIDcgLy8rWUosMDgwNjI1CisjZGVmaW5lIE1GSUVfVFlQRV9DSEFMTEVOR0UgIDE2CisjZGVmaW5lIE1GSUVfVFlQRV9FUlAgICAgICAgIDQyCisjZGVmaW5lIE1GSUVfVFlQRV9SU04JICAgICA0OAorI2RlZmluZSBNRklFX1RZUEVfUkFURVNfRVggICA1MAorI2RlZmluZSBNRklFX1RZUEVfR0VORVJJQyAgICAyMjEKKworI2lmZGVmIEVOQUJMRV9ET1QxMUQKK3R5cGVkZWYgZW51bQoreworCUNPVU5UUllfQ09ERV9GQ0MgPSAwLAorCUNPVU5UUllfQ09ERV9JQyA9IDEsCisJQ09VTlRSWV9DT0RFX0VUU0kgPSAyLAorCUNPVU5UUllfQ09ERV9TUEFJTiA9IDMsCisJQ09VTlRSWV9DT0RFX0ZSQU5DRSA9IDQsCisJQ09VTlRSWV9DT0RFX01LSyA9IDUsCisJQ09VTlRSWV9DT0RFX01LSzEgPSA2LAorCUNPVU5UUllfQ09ERV9JU1JBRUwgPSA3LAorCUNPVU5UUllfQ09ERV9URUxFQyA9IDgsCisJQ09VTlRSWV9DT0RFX0dMT0JBTF9ET01BSU4gPSA5LAorCUNPVU5UUllfQ09ERV9XT1JMRF9XSURFXzEzX0lOREVYID0gMTAKK31jb3VudHJ5X2NvZGVfdHlwZV90OworI2VuZGlmCisKK3N0cnVjdCBpZWVlODAyMTFfaW5mb19lbGVtZW50X2hkciB7CisJdTggaWQ7CisJdTggbGVuOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBpZWVlODAyMTFfaW5mb19lbGVtZW50IHsKKwl1OCBpZDsKKwl1OCBsZW47CisJdTggZGF0YVswXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKgorICogVGhlc2UgYXJlIHRoZSBkYXRhIHR5cGVzIHRoYXQgY2FuIG1ha2UgdXAgbWFuYWdlbWVudCBwYWNrZXRzCisgKgorCXUxNiBhdXRoX2FsZ29yaXRobTsKKwl1MTYgYXV0aF9zZXF1ZW5jZTsKKwl1MTYgYmVhY29uX2ludGVydmFsOworCXUxNiBjYXBhYmlsaXR5OworCXU4IGN1cnJlbnRfYXBbRVRIX0FMRU5dOworCXUxNiBsaXN0ZW5faW50ZXJ2YWw7CisJc3RydWN0IHsKKwkJdTE2IGFzc29jaWF0aW9uX2lkOjE0LCByZXNlcnZlZDoyOworCX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCXUzMiB0aW1lX3N0YW1wWzJdOworCXUxNiByZWFzb247CisJdTE2IHN0YXR1czsKKyovCisKKyNkZWZpbmUgSUVFRTgwMjExX0RFRkFVTFRfVFhfRVNTSUQgIlBlbmd1aW4iCisjZGVmaW5lIElFRUU4MDIxMV9ERUZBVUxUX0JBU0lDX1JBVEUgMTAKKworc3RydWN0IGllZWU4MDIxMV9hdXRoZW50aWNhdGlvbiB7CisJc3RydWN0IGllZWU4MDIxMV9oZWFkZXJfZGF0YSBoZWFkZXI7CisJdTE2IGFsZ29yaXRobTsKKwl1MTYgdHJhbnNhY3Rpb247CisJdTE2IHN0YXR1czsKKwkvL3N0cnVjdCBpZWVlODAyMTFfaW5mb19lbGVtZW50X2hkciBpbmZvX2VsZW1lbnQ7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworCitzdHJ1Y3QgaWVlZTgwMjExX3Byb2JlX3Jlc3BvbnNlIHsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hlYWRlcl9kYXRhIGhlYWRlcjsKKwl1MzIgdGltZV9zdGFtcFsyXTsKKwl1MTYgYmVhY29uX2ludGVydmFsOworCXUxNiBjYXBhYmlsaXR5OworCXN0cnVjdCBpZWVlODAyMTFfaW5mb19lbGVtZW50IGluZm9fZWxlbWVudDsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgaWVlZTgwMjExX3Byb2JlX3JlcXVlc3QgeworCXN0cnVjdCBpZWVlODAyMTFfaGVhZGVyX2RhdGEgaGVhZGVyOworCS8qc3RydWN0IGllZWU4MDIxMV9pbmZvX2VsZW1lbnQgaW5mb19lbGVtZW50OyovCit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IGllZWU4MDIxMV9hc3NvY19yZXF1ZXN0X2ZyYW1lIHsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciBoZWFkZXI7CisJdTE2IGNhcGFiaWxpdHk7CisJdTE2IGxpc3Rlbl9pbnRlcnZhbDsKKwkvL3U4IGN1cnJlbnRfYXBbRVRIX0FMRU5dOworCXN0cnVjdCBpZWVlODAyMTFfaW5mb19lbGVtZW50X2hkciBpbmZvX2VsZW1lbnQ7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IGllZWU4MDIxMV9hc3NvY19yZXNwb25zZV9mcmFtZSB7CisJc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgaGVhZGVyOworCXUxNiBjYXBhYmlsaXR5OworCXUxNiBzdGF0dXM7CisJdTE2IGFpZDsKKwlzdHJ1Y3QgaWVlZTgwMjExX2luZm9fZWxlbWVudCBpbmZvX2VsZW1lbnQ7IC8qIHN1cHBvcnRlZCByYXRlcyAqLworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBpZWVlODAyMTFfZGlzYXNzb2NfZnJhbWV7CisgICAgICAgIHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyIGhlYWRlcjsKKyAgICAgICAgdTE2ICAgIHJlYXNvbmNvZGU7Cit9X19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgaWVlZTgwMjExX3R4YiB7CisJdTggbnJfZnJhZ3M7CisJdTggZW5jcnlwdGVkOworCXUxNiByZXNlcnZlZDsKKwl1MTYgZnJhZ19zaXplOworCXUxNiBwYXlsb2FkX3NpemU7CisJc3RydWN0IHNrX2J1ZmYgKmZyYWdtZW50c1swXTsKK307CisKK3N0cnVjdCBpZWVlODAyMTFfd21tX2FjX3BhcmFtIHsKKwl1OCBhY19hY2lfYWNtX2FpZnNuOworCXU4IGFjX2Vjd21pbl9lY3dtYXg7CisJdTE2IGFjX3R4b3BfbGltaXQ7Cit9OworCitzdHJ1Y3QgaWVlZTgwMjExX3dtbV90c19pbmZvIHsKKwl1OCBhY19kaXJfdGlkOworCXU4IGFjX3VwX3BzYjsKKwl1OCByZXNlcnZlZDsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgaWVlZTgwMjExX3dtbV90c3BlY19lbGVtIHsKKwlzdHJ1Y3QgaWVlZTgwMjExX3dtbV90c19pbmZvIHRzX2luZm87CisJdTE2IG5vcm1fbXNkdV9zaXplOworCXUxNiBtYXhfbXNkdV9zaXplOworCXUzMiBtaW5fc2Vydl9pbnRlcjsKKwl1MzIgbWF4X3NlcnZfaW50ZXI7CisJdTMyIGluYWN0X2ludGVyOworCXUzMiBzdXNwZW5faW50ZXI7CisJdTMyIHNlcnZfc3RhcnRfdGltZTsKKwl1MzIgbWluX2RhdGFfcmF0ZTsKKwl1MzIgbWVhbl9kYXRhX3JhdGU7CisJdTMyIHBlYWtfZGF0YV9yYXRlOworCXUzMiBtYXhfYnVyc3Rfc2l6ZTsKKwl1MzIgZGVsYXlfYm91bmQ7CisJdTMyIG1pbl9waHlfcmF0ZTsKKwl1MTYgc3VycF9iYW5kX2FsbG93OworCXUxNiBtZWRpdW1fdGltZTsKK31fX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworZW51bSB7V01NX2FsbF9mcmFtZSwgV01NX3R3b19mcmFtZSwgV01NX2ZvdXJfZnJhbWUsIFdNTV9zaXhfZnJhbWV9OworI2RlZmluZSBNQVhfU1BfTGVuICAoV01NX2FsbF9mcmFtZSA8PCA0KQorI2RlZmluZSBJRUVFODAyMTFfUU9TX1RJRCAweDBmCisjZGVmaW5lIFFPU19DVExfTk9UQ09OVEFJTl9BQ0sgKDB4MDEgPDwgNSkKKworLyogU1dFRVAgVEFCTEUgRU5UUklFUyBOVU1CRVIqLworI2RlZmluZSBNQVhfU1dFRVBfVEFCX0VOVFJJRVMJCSAgNDIKKyNkZWZpbmUgTUFYX1NXRUVQX1RBQl9FTlRSSUVTX1BFUl9QQUNLRVQgIDcKKy8qIE1BWF9SQVRFU19MRU5HVEggbmVlZHMgdG8gYmUgMTIuICBUaGUgc3BlYyBzYXlzIDgsIGFuZCBtYW55IEFQcworICogb25seSB1c2UgOCwgYW5kIHRoZW4gdXNlIGV4dGVuZGVkIHJhdGVzIGZvciB0aGUgcmVtYWluaW5nIHN1cHBvcnRlZAorICogcmF0ZXMuICBPdGhlciBBUHMsIGhvd2V2ZXIsIHN0aWNrIGFsbCBvZiB0aGVpciBzdXBwb3J0ZWQgcmF0ZXMgb24gdGhlCisgKiBtYWluIHJhdGVzIGluZm9ybWF0aW9uIGVsZW1lbnQuLi4gKi8KKyNkZWZpbmUgTUFYX1JBVEVTX0xFTkdUSCAgICAgICAgICAgICAgICAgICgodTgpMTIpCisjZGVmaW5lIE1BWF9SQVRFU19FWF9MRU5HVEggICAgICAgICAgICAgICAoKHU4KTE2KQorI2RlZmluZSBNQVhfTkVUV09SS19DT1VOVCAgICAgICAgICAgICAgICAgIDEyOAorLy8jZGVmaW5lIE1BWF9DSEFOTkVMX05VTUJFUiAgICAgICAgICAgICAgICAgMTYxCisjZGVmaW5lIE1BWF9DSEFOTkVMX05VTUJFUiAgICAgICAgICAgICAgICAgMTY1IC8vWUosbW9kaWZpZWQsMDgwNjI1CisjZGVmaW5lIE1BWF9JRV9MRU4JCQkJCQkweEZGIC8vK1lKLDA4MDYyNQorCit0eXBlZGVmIHN0cnVjdCBfQ0hBTk5FTF9MSVNUeworCXU4CUNoYW5uZWxbTUFYX0NIQU5ORUxfTlVNQkVSICsgMV07CisJdTgJTGVuOworfUNIQU5ORUxfTElTVCwgKlBDSEFOTkVMX0xJU1Q7CisKKyNkZWZpbmUgSUVFRTgwMjExX1NPRlRNQUNfU0NBTl9USU1FCSAgMTAwLy80MDAKKy8vKEhaIC8gMikKKy8vYnkgYW15IGZvciBwcworI2RlZmluZSBJRUVFODAyMTFfV0FUQ0hfRE9HX1RJTUUgICAgMjAwMAorLy9ieSBhbXkgZm9yIHBzCisvL2J5IGFteSBmb3IgYW50ZW5uYQorI2RlZmluZSBBTlRFTk5BX0RJVkVSU0lUWV9USU1FUl9QRVJJT0QJCTEwMDAgLy8gMTAwMCBtCisvL2J5IGFteSBmb3IgYW50ZW5uYQorI2RlZmluZSBJRUVFODAyMTFfU09GVE1BQ19BU1NPQ19SRVRSWV9USU1FIChIWiAqIDIpCisKKyNkZWZpbmUgQ1JDX0xFTkdUSCAgICAgICAgICAgICAgICAgNFUKKworI2RlZmluZSBNQVhfV1BBX0lFX0xFTiA2NAorCisjZGVmaW5lIE5FVFdPUktfRU1QVFlfRVNTSUQgKDE8PDApCisjZGVmaW5lIE5FVFdPUktfSEFTX09GRE0gICAgKDE8PDEpCisjZGVmaW5lIE5FVFdPUktfSEFTX0NDSyAgICAgKDE8PDIpCisKKyNkZWZpbmUgSUVFRTgwMjExX0RUSU1fTUJDQVNUIDQKKyNkZWZpbmUgSUVFRTgwMjExX0RUSU1fVUNBU1QgMgorI2RlZmluZSBJRUVFODAyMTFfRFRJTV9WQUxJRCAxCisjZGVmaW5lIElFRUU4MDIxMV9EVElNX0lOVkFMSUQgMAorCisjZGVmaW5lIElFRUU4MDIxMV9QU19ESVNBQkxFRCAwCisjZGVmaW5lIElFRUU4MDIxMV9QU19VTklDQVNUIElFRUU4MDIxMV9EVElNX1VDQVNUCisjZGVmaW5lIElFRUU4MDIxMV9QU19NQkNBU1QgSUVFRTgwMjExX0RUSU1fTUJDQVNUCisjZGVmaW5lIElFRUU4MDIxMV9QU19FTkFCTEUgICBJRUVFODAyMTFfRFRJTV9WQUxJRAorLy9hZGRlZCBieSBEYXZpZCBmb3IgUW9TIDIwMDYvNi8zMAorLy8jZGVmaW5lIFdNTV9IYW5nXzgxODcKKyNpZmRlZiBXTU1fSGFuZ184MTg3CisjdW5kZWYgV01NX0hhbmdfODE4NworI2VuZGlmCisKKyNkZWZpbmUgV01FX0FDX0JFICAgMHgwMAorI2RlZmluZSBXTUVfQUNfQksgICAweDAxCisjZGVmaW5lIFdNRV9BQ19WSSAgIDB4MDIKKyNkZWZpbmUgV01FX0FDX1ZPICAgMHgwMworI2RlZmluZSBXTUVfQUNJX01BU0sgMHgwMworI2RlZmluZSBXTUVfQUlGU05fTUFTSyAweDAzCisjZGVmaW5lIFdNRV9BQ19QUkFNX0xFTiAxNgorCisvL1VQIE1hcHBpbmcgdG8gQUMsIHVzaW5nIGluIE1nbnRRdWVyeV9TZXF1ZW5jZU51bWJlcigpIGFuZCBtYXliZSBmb3IgRFNDUAorLy8jZGVmaW5lIFVQMkFDKHVwKQkoKHVwPDMpID8gKCh1cD09MCk/MTowKSA6ICh1cD4+MSkpCisjZGVmaW5lIFVQMkFDKHVwKSAoCQkgICBcCisJKCh1cCkgPCAxKSA/IFdNRV9BQ19CRSA6IFwKKwkoKHVwKSA8IDMpID8gV01FX0FDX0JLIDogXAorCSgodXApIDwgNCkgPyBXTUVfQUNfQkUgOiBcCisJKCh1cCkgPCA2KSA/IFdNRV9BQ19WSSA6IFwKKwlXTUVfQUNfVk8pCisvL0FDIE1hcHBpbmcgdG8gVVAsIHVzaW5nIGluIFR4IHBhcnQgZm9yIHNlbGVjdGluZyB0aGUgY29ycmVzcG9uZGluZyBUWCBxdWV1ZQorI2RlZmluZSBBQzJVUChfYWMpCSggICAgICAgXAorCSgoX2FjKSA9PSBXTUVfQUNfVk8pID8gNiA6IFwKKwkoKF9hYykgPT0gV01FX0FDX1ZJKSA/IDUgOiBcCisJKChfYWMpID09IFdNRV9BQ19CSykgPyAxIDogXAorCTApCisKKyNkZWZpbmUJRVRIRVJfQUREUl9MRU4JCTYJLyogbGVuZ3RoIG9mIGFuIEV0aGVybmV0IGFkZHJlc3MgKi8KK3N0cnVjdAlldGhlcl9oZWFkZXIgeworCXU4IGV0aGVyX2Rob3N0W0VUSEVSX0FERFJfTEVOXTsKKwl1OCBldGhlcl9zaG9zdFtFVEhFUl9BRERSX0xFTl07CisJdTE2IGV0aGVyX3R5cGU7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisjaWZuZGVmIEVUSEVSVFlQRV9QQUUKKyNkZWZpbmUJRVRIRVJUWVBFX1BBRQkweDg4OGUJCS8qIEVBUE9MIFBBRS84MDIuMXggKi8KKyNlbmRpZgorI2lmbmRlZiBFVEhFUlRZUEVfSVAKKyNkZWZpbmUJRVRIRVJUWVBFX0lQCTB4MDgwMAkJLyogSVAgcHJvdG9jb2wgKi8KKyNlbmRpZgorCitzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgeworCS8qIFRoZXNlIGVudHJpZXMgYXJlIHVzZWQgdG8gaWRlbnRpZnkgYSB1bmlxdWUgbmV0d29yayAqLworCXU4IGJzc2lkW0VUSF9BTEVOXTsKKwl1OCBjaGFubmVsOworCS8qIEVuc3VyZSBudWxsLXRlcm1pbmF0ZWQgZm9yIGFueSBkZWJ1ZyBtc2dzICovCisJdTggc3NpZFtJV19FU1NJRF9NQVhfU0laRSArIDFdOworCXU4IHNzaWRfbGVuOworCisJLyogVGhlc2UgYXJlIG5ldHdvcmsgc3RhdGlzdGljcyAqLworCXN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHMgc3RhdHM7CisJdTE2IGNhcGFiaWxpdHk7CisJdTggcmF0ZXNbTUFYX1JBVEVTX0xFTkdUSF07CisJdTggcmF0ZXNfbGVuOworCXU4IHJhdGVzX2V4W01BWF9SQVRFU19FWF9MRU5HVEhdOworCXU4IHJhdGVzX2V4X2xlbjsKKwl1bnNpZ25lZCBsb25nIGxhc3Rfc2Nhbm5lZDsKKwl1OCBtb2RlOworCXU4IGZsYWdzOworCXUzMiBsYXN0X2Fzc29jaWF0ZTsKKwl1MzIgdGltZV9zdGFtcFsyXTsKKwl1MTYgYmVhY29uX2ludGVydmFsOworCXUxNiBsaXN0ZW5faW50ZXJ2YWw7CisJdTE2IGF0aW1fd2luZG93OworCXU4IHdwYV9pZVtNQVhfV1BBX0lFX0xFTl07CisJc2l6ZV90IHdwYV9pZV9sZW47CisJdTggcnNuX2llW01BWF9XUEFfSUVfTEVOXTsKKwlzaXplX3QgcnNuX2llX2xlbjsKKwl1OCBkdGltX3BlcmlvZDsKKwl1OCBkdGltX2RhdGE7CisJdTMyIGxhc3RfZHRpbV9zdGFfdGltZVsyXTsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJLy9hcHBlZGVkIGZvciBRb1MKKwl1OCB3bW1faW5mbzsKKwlzdHJ1Y3QgaWVlZTgwMjExX3dtbV9hY19wYXJhbSB3bW1fcGFyYW1bNF07CisJdTggUW9TX0VuYWJsZTsKKwl1OCBTaWduYWxTdHJlbmd0aDsKKy8vYnkgYW15IDA4MDMxMgorCXU4IEhpZ2hlc3RPcGVyYVJhdGU7CisvL2J5IGFteSAwODAzMTIKKyNpZmRlZiBUSE9NQVNfVFVSQk8KKwl1OCBUdXJib19FbmFibGU7Ly9lbmFibGUgdHVyYm8gbW9kZSwgYWRkZWQgYnkgdGhvbWFzCisjZW5kaWYKKyNpZmRlZiBFTkFCTEVfRE9UMTFECisJdTE2IENvdW50cnlJZUxlbjsKKwl1OCBDb3VudHJ5SWVCdWZbTUFYX0lFX0xFTl07CisjZW5kaWYKK307CisKK2VudW0gaWVlZTgwMjExX3N0YXRlIHsKKworCS8qIHRoZSBjYXJkIGlzIG5vdCBsaW5rZWQgYXQgYWxsICovCisJSUVFRTgwMjExX05PTElOSyA9IDAsCisKKwkvKiBJRUVFODAyMTFfQVNTT0NJQVRJTkcqIGFyZSBmb3IgQlNTIGNsaWVudCBtb2RlCisJICogdGhlIGRyaXZlciBzaGFsbCBub3QgcGVyZm9ybSBSWCBmaWx0ZXJpbmcgdW5sZXNzCisJICogdGhlIHN0YXRlIGlzIExJTktFRC4KKwkgKiBUaGUgZHJpdmVyIHNoYWxsIGp1c3QgY2hlY2sgZm9yIHRoZSBzdGF0ZSBMSU5LRUQgYW5kCisJICogZGVmYXVsdHMgdG8gTk9MSU5LIGZvciBBTEwgdGhlIG90aGVyIHN0YXRlcyAoaW5jbHVkaW5nCisJICogTElOS0VEX1NDQU5OSU5HKQorCSAqLworCisJLyogdGhlIGFzc29jaWF0aW9uIHByb2NlZHVyZSB3aWxsIHN0YXJ0ICh3cSBzY2hlZHVsaW5nKSovCisJSUVFRTgwMjExX0FTU09DSUFUSU5HLAorCUlFRUU4MDIxMV9BU1NPQ0lBVElOR19SRVRSWSwKKworCS8qIHRoZSBhc3NvY2lhdGlvbiBwcm9jZWR1cmUgaXMgc2VuZGluZyBBVVRIIHJlcXVlc3QqLworCUlFRUU4MDIxMV9BU1NPQ0lBVElOR19BVVRIRU5USUNBVElORywKKworCS8qIHRoZSBhc3NvY2lhdGlvbiBwcm9jZWR1cmUgaGFzIHN1Y2Nlc3NmdWxseSBhdXRoZW50Y2F0ZWQKKwkgKiBhbmQgaXMgc2VuZGluZyBhc3NvY2lhdGlvbiByZXF1ZXN0CisJICovCisJSUVFRTgwMjExX0FTU09DSUFUSU5HX0FVVEhFTlRJQ0FURUQsCisKKwkvKiB0aGUgbGluayBpcyBvay4gdGhlIGNhcmQgYXNzb2NpYXRlZCB0byBhIEJTUyBvciBsaW5rZWQKKwkgKiB0byBhIGlic3MgY2VsbCBvciBhY3RpbmcgYXMgYW4gQVAgYW5kIGNyZWF0aW5nIHRoZSBic3MKKwkgKi8KKwlJRUVFODAyMTFfTElOS0VELAorCisJLyogc2FtZSBhcyBMSU5LRUQsIGJ1dCB0aGUgZHJpdmVyIHNoYWxsIGFwcGx5IFJYIGZpbHRlcgorCSAqIHJ1bGVzIGFzIHdlIGFyZSBpbiBOT19MSU5LIG1vZGUuIEFzIHRoZSBjYXJkIGlzIHN0aWxsCisJICogbG9naWNhbGx5IGxpbmtlZCwgYnV0IGl0IGlzIGRvaW5nIGEgc3luY3JvIHNpdGUgc3VydmV5CisJICogdGhlbiBpdCB3aWxsIGJlIGJhY2sgdG8gTElOS0VEIHN0YXRlLgorCSAqLworCUlFRUU4MDIxMV9MSU5LRURfU0NBTk5JTkcsCisKK307CisKKyNkZWZpbmUgREVGQVVMVF9NQVhfU0NBTl9BR0UgKDE1ICogSFopCisjZGVmaW5lIERFRkFVTFRfRlRTIDIzNDYKKyNkZWZpbmUgTUFDX0ZNVCAiJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMngiCisjZGVmaW5lIE1BQ19BUkcoeCkgKCh1OCopKHgpKVswXSwoKHU4KikoeCkpWzFdLCgodTgqKSh4KSlbMl0sKCh1OCopKHgpKVszXSwoKHU4KikoeCkpWzRdLCgodTgqKSh4KSlbNV0KKworCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8PSBLRVJORUxfVkVSU0lPTigyLDYsMTEpKQorZXh0ZXJuIGlubGluZSBpbnQgaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIoY29uc3QgdTggKmFkZHIpCit7CisgICAgICAgIHJldHVybiAoKGFkZHJbMF0gIT0gMHhmZikgJiYgKDB4MDEgJiBhZGRyWzBdKSk7Cit9CisjZW5kaWYKKworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPD0gS0VSTkVMX1ZFUlNJT04oMiw2LDEzKSkKK2V4dGVybiBpbmxpbmUgaW50IGlzX2Jyb2FkY2FzdF9ldGhlcl9hZGRyKGNvbnN0IHU4ICphZGRyKQoreworCXJldHVybiAoKGFkZHJbMF0gPT0gMHhmZikgJiYgKGFkZHJbMV0gPT0gMHhmZikgJiYgKGFkZHJbMl0gPT0gMHhmZikgJiYgICBcCisJCShhZGRyWzNdID09IDB4ZmYpICYmIChhZGRyWzRdID09IDB4ZmYpICYmIChhZGRyWzVdID09IDB4ZmYpKTsKK30KKyNlbmRpZgorCisjZGVmaW5lIENGR19JRUVFODAyMTFfUkVTRVJWRV9GQ1MgKDE8PDApCisjZGVmaW5lIENGR19JRUVFODAyMTFfQ09NUFVURV9GQ1MgKDE8PDEpCisKK3R5cGVkZWYgc3RydWN0IHR4X3BlbmRpbmdfdHsKKwlpbnQgZnJhZzsKKwlzdHJ1Y3QgaWVlZTgwMjExX3R4YiAqdHhiOworfXR4X3BlbmRpbmdfdDsKKworCitzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSB7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKworCS8qIEJvb2trZWVwaW5nIHN0cnVjdHVyZXMgKi8KKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKKwlzdHJ1Y3QgaWVlZTgwMjExX3N0YXRzIGllZWVfc3RhdHM7CisJc3RydWN0IGllZWU4MDIxMV9zb2Z0bWFjX3N0YXRzIHNvZnRtYWNfc3RhdHM7CisKKwkvKiBQcm9iZSAvIEJlYWNvbiBtYW5hZ2VtZW50ICovCisJc3RydWN0IGxpc3RfaGVhZCBuZXR3b3JrX2ZyZWVfbGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIG5ldHdvcmtfbGlzdDsKKwlzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKm5ldHdvcmtzOworCWludCBzY2FuczsKKwlpbnQgc2Nhbl9hZ2U7CisKKwlpbnQgaXdfbW9kZTsgLyogb3BlcmF0aW5nIG1vZGUgKElXX01PREVfKikgKi8KKworCXNwaW5sb2NrX3QgbG9jazsKKwlzcGlubG9ja190IHdwYXhfc3VpdGxpc3RfbG9jazsKKworCWludCB0eF9oZWFkcm9vbTsgLyogU2V0IHRvIHNpemUgb2YgYW55IGFkZGl0aW9uYWwgcm9vbSBuZWVkZWQgYXQgZnJvbnQKKwkJCSAgKiBvZiBhbGxvY2F0ZWQgVHggU0tCcyAqLworCXUzMiBjb25maWc7CisKKwkvKiBXRVAgYW5kIG90aGVyIGVuY3J5cHRpb24gcmVsYXRlZCBzZXR0aW5ncyBhdCB0aGUgZGV2aWNlIGxldmVsICovCisJaW50IG9wZW5fd2VwOyAvKiBTZXQgdG8gMSB0byBhbGxvdyB1bmVuY3J5cHRlZCBmcmFtZXMgKi8KKworCWludCByZXNldF9vbl9rZXljaGFuZ2U7IC8qIFNldCB0byAxIGlmIHRoZSBIVyBuZWVkcyB0byBiZSByZXNldCBvbgorCQkJCSAqIFdFUCBrZXkgY2hhbmdlcyAqLworCisJLyogSWYgdGhlIGhvc3QgcGVyZm9ybXMge2VuLGRlfWNyeXB0aW9uLCB0aGVuIHNldCB0byAxICovCisJaW50IGhvc3RfZW5jcnlwdDsKKwlpbnQgaG9zdF9kZWNyeXB0OworCWludCBpZWVlODAyXzF4OyAvKiBpcyBJRUVFIDgwMi4xWCB1c2VkICovCisKKwkvKiBXUEEgZGF0YSAqLworCWludCB3cGFfZW5hYmxlZDsKKwlpbnQgZHJvcF91bmVuY3J5cHRlZDsKKwlpbnQgdGtpcF9jb3VudGVybWVhc3VyZXM7CisJaW50IHByaXZhY3lfaW52b2tlZDsKKwlzaXplX3Qgd3BhX2llX2xlbjsKKwl1OCAqd3BhX2llOworCisJdTggYXBfbWFjX2FkZHJbNl07CisJdTE2IHBhaXJ3aXNlX2tleV90eXBlOworCXUxNiBicm9hZGNhc3Rfa2V5X3R5cGU7CisKKwlzdHJ1Y3QgbGlzdF9oZWFkIGNyeXB0X2RlaW5pdF9saXN0OworCXN0cnVjdCBpZWVlODAyMTFfY3J5cHRfZGF0YSAqY3J5cHRbV0VQX0tFWVNdOworCWludCB0eF9rZXlpZHg7IC8qIGRlZmF1bHQgVFgga2V5IGluZGV4IChjcnlwdFt0eF9rZXlpZHhdKSAqLworCXN0cnVjdCB0aW1lcl9saXN0IGNyeXB0X2RlaW5pdF90aW1lcjsKKworCWludCBiY3J4X3N0YV9rZXk7IC8qIHVzZSBpbmRpdmlkdWFsIGtleXMgdG8gb3ZlcnJpZGUgZGVmYXVsdCBrZXlzIGV2ZW4KKwkJCSAgICogd2l0aCBSWCBvZiBicm9hZC9tdWx0aWNhc3QgZnJhbWVzICovCisKKwkvKiBGcmFnbWVudGF0aW9uIHN0cnVjdHVyZXMgKi8KKwkvLyBlYWNoIHN0cmVhbWluZyBjb250YWluIGEgZW50cnkKKwlzdHJ1Y3QgaWVlZTgwMjExX2ZyYWdfZW50cnkgZnJhZ19jYWNoZVsxN11bSUVFRTgwMjExX0ZSQUdfQ0FDSEVfTEVOXTsKKwl1bnNpZ25lZCBpbnQgZnJhZ19uZXh0X2lkeFsxN107CisJdTE2IGZ0czsgLyogRnJhZ21lbnRhdGlvbiBUaHJlc2hvbGQgKi8KKworCS8qIFRoaXMgc3RvcmVzIGluZm9zIGZvciB0aGUgY3VycmVudCBuZXR3b3JrLgorCSAqIEVpdGhlciB0aGUgbmV0d29yayB3ZSBhcmUgYXNzb2NpYXRlZCBpbiBJTkZSQVNUUlVDVFVSRQorCSAqIG9yIHRoZSBuZXR3b3JrIHRoYXQgd2UgYXJlIGNyZWF0aW5nIGluIE1BU1RFUiBtb2RlLgorCSAqIGFkLWhvYyBpcyBhIG1peHR1cmUgOy0pLgorCSAqIE5vdGUgdGhhdCBpbiBpbmZyYXN0cnVjdHVyZSBtb2RlLCBldmVuIHdoZW4gbm90IGFzc29jaWF0ZWQsCisJICogZmllbGRzIGJzc2lkIGFuZCBlc3NpZCBtYXkgYmUgdmFsaWQgKGlmIHdwYV9zZXQgYW5kIGVzc2lkX3NldAorCSAqIGFyZSB0cnVlKSBhcyB0aHkgY2FycnkgdGhlIHZhbHVlIHNldCBieSB0aGUgdXNlciB2aWEgaXdjb25maWcKKwkgKi8KKwlzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgY3VycmVudF9uZXR3b3JrOworCisKKwllbnVtIGllZWU4MDIxMV9zdGF0ZSBzdGF0ZTsKKworCWludCBzaG9ydF9zbG90OworCWludCBtb2RlOyAgICAgICAvKiBBLCBCLCBHICovCisJaW50IG1vZHVsYXRpb247IC8qIENDSywgT0ZETSAqLworCWludCBmcmVxX2JhbmQ7ICAvKiAyLjRHaHosIDUuMkdoeiwgTWl4ZWQgKi8KKwlpbnQgYWJnX3RydWU7ICAgLyogQUJHIGZsYWcgICAgICAgICAgICAgICovCisKKwkvKiB1c2VkIGZvciBmb3JjaW5nIHRoZSBpYnNzIHdvcmtxdWV1ZSB0byB0ZXJtaW5hdGUKKwkgKiB3aXRob3V0IHdhaXQgZm9yIHRoZSBzeW5jcm8gc2NhbiB0byB0ZXJtaW5hdGUKKwkgKi8KKwlzaG9ydCBzeW5jX3NjYW5faHVycnl1cDsKKworI2lmZGVmIEVOQUJMRV9ET1QxMUQKKwl2b2lkICogcERvdDExZEluZm87CisJYm9vbCBiR2xvYmFsRG9tYWluOworCisJLy8gRm9yIExpdGVvbiBDaDEyfjEzIHBhc3NpdmUgc2NhbgorCXU4CU1pblBhc3NpdmVDaG5sTnVtOworCXU4CUlic3NTdGFydENobmw7CisjZWxzZQorCS8qIG1hcCBvZiBhbGxvd2VkIGNoYW5uZWxzLiAwIGlzIGR1bW15ICovCisJLy8gRklYTUU6IHJlbWViZXIgdG8gZGVmYXVsdCB0byBhIGJhc2ljIGNoYW5uZWwgcGxhbiBkZXBlbmRpbmcgb2YgdGhlIFBIWSB0eXBlCisJaW50IGNoYW5uZWxfbWFwW01BWF9DSEFOTkVMX05VTUJFUisxXTsKKyNlbmRpZgorCisJaW50IHJhdGU7ICAgICAgIC8qIGN1cnJlbnQgcmF0ZSAqLworCWludCBiYXNpY19yYXRlOworCS8vRklYTUU6IHBsZWFjZSBjYWxsYmFjaywgc2VlIGlmIHJlZHVuZGFudCB3aXRoIHNvZnRtYWNfZmVhdHVyZXMKKwlzaG9ydCBhY3RpdmVfc2NhbjsKKworCS8qIHRoaXMgY29udGFpbnMgZmxhZ3MgZm9yIHNlbGVjdGl2ZWx5IGVuYWJsZSBzb2Z0bWFjIHN1cHBvcnQgKi8KKwl1MTYgc29mdG1hY19mZWF0dXJlczsKKworCS8qIGlmIHRoZSBzZXF1ZW5jZSBjb250cm9sIGZpZWxkIGlzIG5vdCBmaWxsZWQgYnkgSFcgKi8KKwl1MTYgc2VxX2N0cmxbNV07CisKKwkvKiBhc3NvY2lhdGlvbiBwcm9jZWR1cmUgdHJhbnNhY3Rpb24gc2VxdWVuY2UgbnVtYmVyICovCisJdTE2IGFzc29jaWF0ZV9zZXE7CisKKwkvKiBBSUQgZm9yIFJUWGVkIGFzc29jaWF0aW9uIHJlc3BvbnNlcyAqLworCXUxNiBhc3NvY19pZDsKKworCS8qIHBvd2VyIHNhdmUgbW9kZSByZWxhdGVkKi8KKwlzaG9ydCBwczsKKwlzaG9ydCBzdGFfc2xlZXA7CisJaW50IHBzX3RpbWVvdXQ7CisJc3RydWN0IHRhc2tsZXRfc3RydWN0IHBzX3Rhc2s7CisJdTMyIHBzX3RoOworCXUzMiBwc190bDsKKworCXNob3J0IHJhd190eDsKKwkvKiB1c2VkIGlmIElFRUVfU09GVE1BQ19UWF9RVUVVRSBpcyBzZXQgKi8KKwlzaG9ydCBxdWV1ZV9zdG9wOworCXNob3J0IHNjYW5uaW5nOworCXNob3J0IHByb3RvX3N0YXJ0ZWQ7CisKKwlzdHJ1Y3Qgc2VtYXBob3JlIHd4X3NlbTsKKwlzdHJ1Y3Qgc2VtYXBob3JlIHNjYW5fc2VtOworCisJc3BpbmxvY2tfdCBtZ210X3R4X2xvY2s7CisJc3BpbmxvY2tfdCBiZWFjb25fbG9jazsKKworCXNob3J0IGJlYWNvbl90eGluZzsKKworCXNob3J0IHdhcF9zZXQ7CisJc2hvcnQgc3NpZF9zZXQ7CisKKwl1OCAgd3BheF90eXBlX3NldDsgICAgLy97YWRkZWQgYnkgRGF2aWQsIDIwMDYuOS4yOH0KKwl1MzIgd3BheF90eXBlX25vdGlmeTsgLy97YWRkZWQgYnkgRGF2aWQsIDIwMDYuOS4yNn0KKworCS8qIFFvUyByZWxhdGVkIGZsYWcgKi8KKwljaGFyIGluaXRfd21tcGFyYW1fZmxhZzsKKworCS8qIGZvciBkaXNjYXJkaW5nIGR1cGxpY2F0ZWQgcGFja2V0cyBpbiBJQlNTICovCisJc3RydWN0IGxpc3RfaGVhZCBpYnNzX21hY19oYXNoW0lFRUVfSUJTU19NQUNfSEFTSF9TSVpFXTsKKworCS8qIGZvciBkaXNjYXJkaW5nIGR1cGxpY2F0ZWQgcGFja2V0cyBpbiBCU1MgKi8KKwl1MTYgbGFzdF9yeHNlcV9udW1bMTddOyAvKiByeCBzZXEgcHJldmlvdXMgcGVyLXRpZCAqLworCXUxNiBsYXN0X3J4ZnJhZ19udW1bMTddOy8qIHR4IGZyYWcgcHJldmlvdXMgcGVyLXRpZCAqLworCXVuc2lnbmVkIGxvbmcgbGFzdF9wYWNrZXRfdGltZVsxN107CisKKwkvKiBmb3IgUFMgbW9kZSAqLworCXVuc2lnbmVkIGxvbmcgbGFzdF9yeF9wc190aW1lOworCisJLyogdXNlZCBpZiBJRUVFX1NPRlRNQUNfU0lOR0xFX1FVRVVFIGlzIHNldCAqLworCXN0cnVjdCBza19idWZmICptZ210X3F1ZXVlX3JpbmdbTUdNVF9RVUVVRV9OVU1dOworCWludCBtZ210X3F1ZXVlX2hlYWQ7CisJaW50IG1nbXRfcXVldWVfdGFpbDsKKworCisJLyogdXNlZCBpZiBJRUVFX1NPRlRNQUNfVFhfUVVFVUUgaXMgc2V0ICovCisJc3RydWN0ICB0eF9wZW5kaW5nX3QgdHhfcGVuZGluZzsKKworCS8qIHVzZWQgaWYgSUVFRV9TT0ZUTUFDX0FTU09DSUFURSBpcyBzZXQgKi8KKwlzdHJ1Y3QgdGltZXJfbGlzdCBhc3NvY2lhdGVfdGltZXI7CisKKwkvKiB1c2VkIGlmIElFRUVfU09GVE1BQ19CRUFDT05TIGlzIHNldCAqLworCXN0cnVjdCB0aW1lcl9saXN0IGJlYWNvbl90aW1lcjsKKworCXN0cnVjdCB3b3JrX3N0cnVjdCBhc3NvY2lhdGVfY29tcGxldGVfd3E7CisvLwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgYXNzb2NpYXRlX3JldHJ5X3dxOworCXN0cnVjdCB3b3JrX3N0cnVjdCBhc3NvY2lhdGVfcHJvY2VkdXJlX3dxOworLy8Jc3RydWN0IHdvcmtfc3RydWN0IHNvZnRtYWNfc2Nhbl93cTsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd3hfc3luY19zY2FuX3dxOworCXN0cnVjdCB3b3JrX3N0cnVjdCB3bW1fcGFyYW1fdXBkYXRlX3dxOworCXN0cnVjdCB3b3JrX3N0cnVjdCBwc19yZXF1ZXN0X3R4X2Fja193cTsvL2ZvciBwcworLy8Jc3RydWN0IHdvcmtfc3RydWN0IGh3X3dha2V1cF93cTsKKy8vCXN0cnVjdCB3b3JrX3N0cnVjdCBod19zbGVlcF93cTsKKy8vCXN0cnVjdCB3b3JrX3N0cnVjdCB3YXRjaF9kb2dfd3E7CisJYm9vbCBiSW5hY3RpdmVQczsKKwlib29sIGFjdHNjYW5uaW5nOworCWJvb2wgYmVpbnJldHJ5OworCXUxNiBMaXN0ZW5JbnRlcnZhbDsKKwl1bnNpZ25lZCBsb25nIE51bVJ4RGF0YUluUGVyaW9kOyAvL1lKLGFkZCwwODA4MjgKKwl1bnNpZ25lZCBsb25nIE51bVJ4QmNuSW5QZXJpb2Q7ICAvL1lKLGFkZCwwODA4MjgKKwl1bnNpZ25lZCBsb25nIE51bVJ4T2tUb3RhbDsKKwl1bnNpZ25lZCBsb25nIE51bVJ4VW5pY2FzdDsvL1lKLGFkZCwwODA4MjgsZm9yIGtlZXAgYWxpdmUKKwlib29sIGJId1JhZGlvT2ZmOworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMjApCisgICAgICAgIHN0cnVjdCBkZWxheWVkX3dvcmsgc29mdG1hY19zY2FuX3dxOworICAgICAgICBzdHJ1Y3QgZGVsYXllZF93b3JrIGFzc29jaWF0ZV9yZXRyeV93cTsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrIGh3X3dha2V1cF93cTsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrIGh3X3NsZWVwX3dxOy8vK2J5IGFteSAwODAzMjQKKwlzdHJ1Y3QgZGVsYXllZF93b3JrIHdhdGNoX2RvZ193cTsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrIHN3X2FudGVubmFfd3E7CisJc3RydWN0IGRlbGF5ZWRfd29yayAgc3RhcnRfaWJzc193cTsKKy8vYnkgYW15IGZvciByYXRlIGFkYXB0aXZlIDA4MDMxMgorICAgIHN0cnVjdCBkZWxheWVkX3dvcmsgcmF0ZV9hZGFwdGVyX3dxOworLy9ieSBhbXkgZm9yIHJhdGUgYWRhcHRpdmUKKwlzdHJ1Y3QgZGVsYXllZF93b3JrIGh3X2RpZ193cTsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrIHR4X3B3X3dxOworCisvL0FkZGVkIGZvciBSRiBwb3dlciBvbiBwb3dlciBvZmYgYnkgbGl6aGFvbWluZyAwODA1MTIKKwlzdHJ1Y3QgZGVsYXllZF93b3JrIEdQSU9DaGFuZ2VSRldvcmtJdGVtOworI2Vsc2UKKworCXN0cnVjdCB3b3JrX3N0cnVjdCBzdGFydF9pYnNzX3dxOworICAgICAgICBzdHJ1Y3Qgd29ya19zdHJ1Y3Qgc29mdG1hY19zY2FuX3dxOworICAgICAgICBzdHJ1Y3Qgd29ya19zdHJ1Y3QgYXNzb2NpYXRlX3JldHJ5X3dxOworCXN0cnVjdCB3b3JrX3N0cnVjdCBod193YWtldXBfd3E7CisJc3RydWN0IHdvcmtfc3RydWN0IGh3X3NsZWVwX3dxOworCXN0cnVjdCB3b3JrX3N0cnVjdCB3YXRjaF9kb2dfd3E7CisJc3RydWN0IHdvcmtfc3RydWN0IHN3X2FudGVubmFfd3E7CisvL2J5IGFteSBmb3IgcmF0ZSBhZGFwdGl2ZSAwODAzMTIKKyAgICBzdHJ1Y3Qgd29ya19zdHJ1Y3QgcmF0ZV9hZGFwdGVyX3dxOworLy9ieSBhbXkgZm9yIHJhdGUgYWRhcHRpdmUKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgaHdfZGlnX3dxOworCXN0cnVjdCB3b3JrX3N0cnVjdCB0eF9wd193cTsKKworLy9BZGRlZCBmb3IgUkYgcG93ZXIgb24gcG93ZXIgb2ZmIGJ5IGxpemhhb21pbmcgMDgwNTEyCisJc3RydWN0IHdvcmtfc3RydWN0IEdQSU9DaGFuZ2VSRldvcmtJdGVtOworI2VuZGlmCisJc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKndxOworCisJLyogQ2FsbGJhY2sgZnVuY3Rpb25zICovCisJdm9pZCAoKnNldF9zZWN1cml0eSkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgc3RydWN0IGllZWU4MDIxMV9zZWN1cml0eSAqc2VjKTsKKworCS8qIFVzZWQgdG8gVFggZGF0YSBmcmFtZSBieSB1c2luZyB0eGIgc3RydWN0cy4KKwkgKiB0aGlzIGlzIG5vdCB1c2VkIGlmIGluIHRoZSBzb2Z0bWFjX2ZlYXR1cmVzCisJICogaXMgc2V0IHRoZSBmbGFnIElFRUVfU09GVE1BQ19UWF9RVUVVRQorCSAqLworCWludCAoKmhhcmRfc3RhcnRfeG1pdCkoc3RydWN0IGllZWU4MDIxMV90eGIgKnR4YiwKKwkJCSAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworCWludCAoKnJlc2V0X3BvcnQpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisJLyogU29mdG1hYy1nZW5lcmF0ZWQgZnJhbWVzIChtYW1hZ2VtZW50KSBhcmUgVFhlZCB2aWEgdGhpcworCSAqIGNhbGxiYWNrIGlmIHRoZSBmbGFnIElFRUVfU09GVE1BQ19TSU5HTEVfUVVFVUUgaXMKKwkgKiBub3Qgc2V0LiBBcyBzb21lIGNhcmRzIG1heSBoYXZlIGRpZmZlcmVudCBIVyBxdWV1ZXMgdGhhdAorCSAqIG9uZSBtaWdodCB3YW50IHRvIHVzZSBmb3IgZGF0YSBhbmQgbWFuYWdlbWVudCBmcmFtZXMKKwkgKiB0aGUgb3B0aW9uIHRvIGhhdmUgdHdvIGNhbGxiYWNrcyBtaWdodCBiZSB1c2VmdWwuCisJICogVGhpcyBmdWNudGlvbiBjYW4ndCBzbGVlcC4KKwkgKi8KKwlpbnQgKCpzb2Z0bWFjX2hhcmRfc3RhcnRfeG1pdCkoc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworCS8qIHVzZWQgaW5zdGVhZCBvZiBoYXJkX3N0YXJ0X3htaXQgKG5vdCBzb2Z0bWFjX2hhcmRfc3RhcnRfeG1pdCkKKwkgKiBpZiB0aGUgSUVFRV9TT0ZUTUFDX1RYX1FVRVVFIGZlYXR1cmUgaXMgdXNlZCB0byBUWCBkYXRhCisJICogZnJhbWVzLiBJIHRoZSBvcHRpb24gSUVFRV9TT0ZUTUFDX1NJTkdMRV9RVUVVRSBpcyBhbHNvIHNldAorCSAqIHRoZW4gYWxzbyBtYW5hZ2VtZW50IGZyYW1lcyBhcmUgc2VudCB2aWEgdGhpcyBjYWxsYmFjay4KKwkgKiBUaGlzIGZ1bmN0aW9uIGNhbid0IHNsZWVwLgorCSAqLworCXZvaWQgKCpzb2Z0bWFjX2RhdGFfaGFyZF9zdGFydF94bWl0KShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsaW50IHJhdGUpOworCisJLyogc3RvcHMgdGhlIEhXIHF1ZXVlIGZvciBEQVRBIGZyYW1lcy4gVXNlZnVsIHRvIGF2b2lkCisJICogd2FzdGUgdGltZSB0byBUWCBkYXRhIGZyYW1lIHdoZW4gd2UgYXJlIHJlYXNzb2NpYXRpbmcKKwkgKiBUaGlzIGZ1bmN0aW9uIGNhbiBzbGVlcC4KKwkgKi8KKwl2b2lkICgqZGF0YV9oYXJkX3N0b3ApKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisJLyogT0sgdGhpcyBpcyBjb21wbGVtZW50YXIgdG8gZGF0YV9wb2xsX2hhcmRfc3RvcCAqLworCXZvaWQgKCpkYXRhX2hhcmRfcmVzdW1lKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworCS8qIGFzayB0byB0aGUgZHJpdmVyIHRvIHJldHVuZSB0aGUgcmFkaW8gLgorCSAqIFRoaXMgZnVuY3Rpb24gY2FuIHNsZWVwLiB0aGUgZHJpdmVyIHNob3VsZCBlbnN1cmUKKwkgKiB0aGUgcmFkaW8gaGFzIGJlZW4gc3dpdGhjZWQgYmVmb3JlIHJldHVybi4KKwkgKi8KKwl2b2lkICgqc2V0X2NoYW4pKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsc2hvcnQgY2gpOworCisJLyogVGhlc2UgYXJlIG5vdCB1c2VkIGlmIHRoZSBpZWVlIHN0YWNrIHRha2VzIGNhcmUgb2YKKwkgKiBzY2FubmluZyAoSUVFRV9TT0ZUTUFDX1NDQU4gZmVhdHVyZSBzZXQpLgorCSAqIEluIHRoaXMgY2FzZSBvbmx5IHRoZSBzZXRfY2hhbiBpcyB1c2VkLgorCSAqCisJICogVGhlIHN5bmNybyB2ZXJzaW9uIGlzIHNpbWlsYXIgdG8gdGhlIHN0YXJ0X3NjYW4gYnV0CisJICogZG9lcyBub3QgcmV0dXJuIHVudGlsIGFsbCBjaGFubmVscyBoYXMgYmVlbiBzY2FubmVkLgorCSAqIHRoaXMgaXMgY2FsbGVkIGluIHVzZXIgY29udGV4dCBhbmQgc2hvdWxkIHNsZWVwLAorCSAqIGl0IGlzIGNhbGxlZCBpbiBhIHdvcmtfcXVldWUgd2hlbiBzd2l0aGNpbmcgdG8gYWQtaG9jIG1vZGUKKwkgKiBvciBpbiBiZWhhbGYgb2YgaXdsaXN0IHNjYW4gd2hlbiB0aGUgY2FyZCBpcyBhc3NvY2lhdGVkCisJICogYW5kIHJvb3QgdXNlciBhc2sgZm9yIGEgc2Nhbi4KKwkgKiB0aGUgZnVjbnRpb24gc3RvcF9zY2FuIHNob3VsZCBzdG9wIGJvdGggdGhlIHN5bmNybyBhbmQKKwkgKiBiYWNrZ3JvdW5kIHNjYW5uaW5nIGFuZCBjYW4gc2xlZXAuCisJICogVGhlIGZ1Y250aW9uIHN0YXJ0X3NjYW4gc2hvdWxkIGluaXRpYXRlIHRoZSBiYWNrZ3JvdW5kCisJICogc2Nhbm5pbmcgYW5kIGNhbid0IHNsZWVwLgorCSAqLworCXZvaWQgKCpzY2FuX3N5bmNybykoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisJdm9pZCAoKnN0YXJ0X3NjYW4pKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCXZvaWQgKCpzdG9wX3NjYW4pKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisJLyogaW5kaWNhdGUgdGhlIGRyaXZlciB0aGF0IHRoZSBsaW5rIHN0YXRlIGlzIGNoYW5nZWQKKwkgKiBmb3IgZXhhbXBsZSBpdCBtYXkgaW5kaWNhdGUgdGhlIGNhcmQgaXMgYXNzb2NpYXRlZCBub3cuCisJICogRHJpdmVyIG1pZ2h0IGJlIGludGVyZXN0ZWQgaW4gdGhpcyB0byBhcHBseSBSWCBmaWx0ZXIKKwkgKiBydWxlcyBvciBzaW1wbHkgbGlnaHQgdGhlIExJTksgbGVkCisJICovCisJdm9pZCAoKmxpbmtfY2hhbmdlKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworCS8qIHRoZXNlIHR3byBmdW5jdGlvbiBpbmRpY2F0ZXMgdG8gdGhlIEhXIHdoZW4gdG8gc3RhcnQKKwkgKiBhbmQgc3RvcCB0byBzZW5kIGJlYWNvbnMuIFRoaXMgaXMgdXNlZCB3aGVuIHRoZQorCSAqIElFRUVfU09GVE1BQ19CRUFDT05TIGlzIG5vdCBzZXQuIEZvciBub3cgdGhlCisJICogc3RvcF9zZW5kX2JhY29ucyBpcyBOT1QgZ3VhcmFudGVlZCB0byBiZSBjYWxsZWQgb25seQorCSAqIGFmdGVyIHN0YXJ0X3NlbmRfYmVhY29ucy4KKwkgKi8KKwl2b2lkICgqc3RhcnRfc2VuZF9iZWFjb25zKSAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisJdm9pZCAoKnN0b3Bfc2VuZF9iZWFjb25zKSAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKwkvKiBwb3dlciBzYXZlIG1vZGUgcmVsYXRlZCAqLworCXZvaWQgKCpzdGFfd2FrZV91cCkgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCXZvaWQgKCpwc19yZXF1ZXN0X3R4X2FjaykgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCXZvaWQgKCplbnRlcl9zbGVlcF9zdGF0ZSkgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiB0aCwgdTMyIHRsKTsKKwlzaG9ydCAoKnBzX2lzX3F1ZXVlX2VtcHR5KSAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKwkvKiBRb1MgcmVsYXRlZCAqLworCS8vdm9pZCAoKndtbV9wYXJhbV91cGRhdGUpIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCAqYWNfcGFyYW0pOworCS8vdm9pZCAoKndtbV9wYXJhbV91cGRhdGUpIChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CisKKwkvKiBUaGlzIG11c3QgYmUgdGhlIGxhc3QgaXRlbSBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgZGF0YQorCSAqIGFsbG9jYXRlZCBiZXlvbmQgdGhpcyBzdHJ1Y3R1cmUgYnkgYWxsb2NfaWVlZTgwMjExICovCisJdTggcHJpdlswXTsKK307CisKKyNkZWZpbmUgSUVFRV9BICAgICAgICAgICAgKDE8PDApCisjZGVmaW5lIElFRUVfQiAgICAgICAgICAgICgxPDwxKQorI2RlZmluZSBJRUVFX0cgICAgICAgICAgICAoMTw8MikKKyNkZWZpbmUgSUVFRV9NT0RFX01BU0sgICAgKElFRUVfQXxJRUVFX0J8SUVFRV9HKQorCisvKiBHZW5lcmF0ZSBhIDgwMi4xMSBoZWFkZXIgKi8KKworLyogVXNlcyB0aGUgY2hhbm5lbCBjaGFuZ2UgY2FsbGJhY2sgZGlyZWN0bHkKKyAqIGluc3RlYWQgb2YgW3N0YXJ0L3N0b3BdIHNjYW4gY2FsbGJhY2tzCisgKi8KKyNkZWZpbmUgSUVFRV9TT0ZUTUFDX1NDQU4gKDE8PDIpCisKKy8qIFBlcmZvcm0gYXV0aGVudGljYXRpb24gYW5kIGFzc29jaWF0aW9uIGhhbmRzaGFrZSAqLworI2RlZmluZSBJRUVFX1NPRlRNQUNfQVNTT0NJQVRFICgxPDwzKQorCisvKiBHZW5lcmF0ZSBwcm9iZSByZXF1ZXN0cyAqLworI2RlZmluZSBJRUVFX1NPRlRNQUNfUFJPQkVSUSAoMTw8NCkKKworLyogR2VuZXJhdGUgcmVzcG9uZXMgdG8gcHJvYmUgcmVxdWVzdHMgKi8KKyNkZWZpbmUgSUVFRV9TT0ZUTUFDX1BST0JFUlMgKDE8PDUpCisKKy8qIFRoZSBpZWVlODAyLjExIHN0YWNrIHdpbGwgbWFuYWdlcyB0aGUgbmV0aWYgcXVldWUKKyAqIHdha2Uvc3RvcCBmb3IgdGhlIGRyaXZlciwgdGFraW5nIGNhcmUgb2YgODAyLjExCisgKiBmcmFnbWVudGF0aW9uLiBTZWUgc29mdG1hYy5jIGZvciBkZXRhaWxzLiAqLworI2RlZmluZSBJRUVFX1NPRlRNQUNfVFhfUVVFVUUgKDE8PDcpCisKKy8qIFVzZXMgb25seSB0aGUgc29mdG1hY19kYXRhX2hhcmRfc3RhcnRfeG1pdAorICogZXZlbiBmb3IgVFggbWFuYWdlbWVudCBmcmFtZXMuCisgKi8KKyNkZWZpbmUgSUVFRV9TT0ZUTUFDX1NJTkdMRV9RVUVVRSAoMTw8OCkKKworLyogR2VuZXJhdGUgYmVhY29ucy4gIFRoZSBzdGFjayB3aWxsIGVucXVldWUgYmVhY29ucworICogdG8gdGhlIGNhcmQKKyAqLworI2RlZmluZSBJRUVFX1NPRlRNQUNfQkVBQ09OUyAoMTw8NikKKworCisKK3N0YXRpYyBpbmxpbmUgdm9pZCAqaWVlZTgwMjExX3ByaXYoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gKChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqKW5ldGRldl9wcml2KGRldikpLT5wcml2OworfQorCitleHRlcm4gaW5saW5lIGludCBpZWVlODAyMTFfaXNfZW1wdHlfZXNzaWQoY29uc3QgY2hhciAqZXNzaWQsIGludCBlc3NpZF9sZW4pCit7CisJLyogU2luZ2xlIHdoaXRlIHNwYWNlIGlzIGZvciBMaW5rc3lzIEFQcyAqLworCWlmIChlc3NpZF9sZW4gPT0gMSAmJiBlc3NpZFswXSA9PSAnICcpCisJCXJldHVybiAxOworCisJLyogT3RoZXJ3aXNlLCBpZiB0aGUgZW50aXJlIGVzc2lkIGlzIDAsIHdlIGFzc3VtZSBpdCBpcyBoaWRkZW4gKi8KKwl3aGlsZSAoZXNzaWRfbGVuKSB7CisJCWVzc2lkX2xlbi0tOworCQlpZiAoZXNzaWRbZXNzaWRfbGVuXSAhPSAnXDAnKQorCQkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK2V4dGVybiBpbmxpbmUgaW50IGllZWU4MDIxMV9pc192YWxpZF9tb2RlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBpbnQgbW9kZSkKK3sKKwkvKgorCSAqIEl0IGlzIHBvc3NpYmxlIGZvciBib3RoIGFjY2VzcyBwb2ludHMgYW5kIG91ciBkZXZpY2UgdG8gc3VwcG9ydAorCSAqIGNvbWJpbmF0aW9ucyBvZiBtb2Rlcywgc28gYXMgbG9uZyBhcyB0aGVyZSBpcyBvbmUgdmFsaWQgY29tYmluYXRpb24KKwkgKiBvZiBhcC9kZXZpY2Ugc3VwcG9ydGVkIG1vZGVzLCB0aGVuIHJldHVybiBzdWNjZXNzCisJICoKKwkgKi8KKwlpZiAoKG1vZGUgJiBJRUVFX0EpICYmCisJICAgIChpZWVlLT5tb2R1bGF0aW9uICYgSUVFRTgwMjExX09GRE1fTU9EVUxBVElPTikgJiYKKwkgICAgKGllZWUtPmZyZXFfYmFuZCAmIElFRUU4MDIxMV81MkdIWl9CQU5EKSkKKwkJcmV0dXJuIDE7CisKKwlpZiAoKG1vZGUgJiBJRUVFX0cpICYmCisJICAgIChpZWVlLT5tb2R1bGF0aW9uICYgSUVFRTgwMjExX09GRE1fTU9EVUxBVElPTikgJiYKKwkgICAgKGllZWUtPmZyZXFfYmFuZCAmIElFRUU4MDIxMV8yNEdIWl9CQU5EKSkKKwkJcmV0dXJuIDE7CisKKwlpZiAoKG1vZGUgJiBJRUVFX0IpICYmCisJICAgIChpZWVlLT5tb2R1bGF0aW9uICYgSUVFRTgwMjExX0NDS19NT0RVTEFUSU9OKSAmJgorCSAgICAoaWVlZS0+ZnJlcV9iYW5kICYgSUVFRTgwMjExXzI0R0haX0JBTkQpKQorCQlyZXR1cm4gMTsKKworCXJldHVybiAwOworfQorCitleHRlcm4gaW5saW5lIGludCBpZWVlODAyMTFfZ2V0X2hkcmxlbih1MTYgZmMpCit7CisJaW50IGhkcmxlbiA9IDI0OworCisJc3dpdGNoIChXTEFOX0ZDX0dFVF9UWVBFKGZjKSkgeworCWNhc2UgSUVFRTgwMjExX0ZUWVBFX0RBVEE6CisJCWlmICgoZmMgJiBJRUVFODAyMTFfRkNUTF9GUk9NRFMpICYmIChmYyAmIElFRUU4MDIxMV9GQ1RMX1RPRFMpKQorCQkJaGRybGVuID0gMzA7IC8qIEFkZHI0ICovCisJCWlmKElFRUU4MDIxMV9RT1NfSEFTX1NFUShmYykpCisJCQloZHJsZW4gKz0gMjsgLyogUU9TIGN0cmwqLworCQlicmVhazsKKwljYXNlIElFRUU4MDIxMV9GVFlQRV9DVEw6CisJCXN3aXRjaCAoV0xBTl9GQ19HRVRfU1RZUEUoZmMpKSB7CisJCWNhc2UgSUVFRTgwMjExX1NUWVBFX0NUUzoKKwkJY2FzZSBJRUVFODAyMTFfU1RZUEVfQUNLOgorCQkJaGRybGVuID0gMTA7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWhkcmxlbiA9IDE2OworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIGhkcmxlbjsKK30KKworCisKKy8qIGllZWU4MDIxMS5jICovCitleHRlcm4gdm9pZCBmcmVlX2llZWU4MDIxMShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK2V4dGVybiBzdHJ1Y3QgbmV0X2RldmljZSAqYWxsb2NfaWVlZTgwMjExKGludCBzaXplb2ZfcHJpdik7CisKK2V4dGVybiBpbnQgaWVlZTgwMjExX3NldF9lbmNyeXB0aW9uKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKKworLyogaWVlZTgwMjExX3R4LmMgKi8KKworZXh0ZXJuIGludCBpZWVlODAyMTFfZW5jcnlwdF9mcmFnbWVudCgKKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwlzdHJ1Y3Qgc2tfYnVmZiAqZnJhZywKKwlpbnQgaGRyX2xlbik7CisKK2V4dGVybiBpbnQgaWVlZTgwMjExX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSAgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitleHRlcm4gdm9pZCBpZWVlODAyMTFfdHhiX2ZyZWUoc3RydWN0IGllZWU4MDIxMV90eGIgKik7CisKKworLyogaWVlZTgwMjExX3J4LmMgKi8KK2V4dGVybiBpbnQgaWVlZTgwMjExX3J4KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0cyAqcnhfc3RhdHMpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3J4X21ndChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCSAgICAgc3RydWN0IGllZWU4MDIxMV9oZHIgKmhlYWRlciwKKwkJCSAgICAgc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0cyAqc3RhdHMpOworCisvKiBpZWVlODAyMTFfd3guYyAqLworZXh0ZXJuIGludCBpZWVlODAyMTFfd3hfZ2V0X3NjYW4oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkJIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkJIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmtleSk7CitleHRlcm4gaW50IGllZWU4MDIxMV93eF9zZXRfZW5jb2RlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJCSAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkJICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqa2V5KTsKK2V4dGVybiBpbnQgaWVlZTgwMjExX3d4X2dldF9lbmNvZGUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCQkgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICprZXkpOworZXh0ZXJuIGludCBpZWVlODAyMTFfd3hfc2V0X2VuY29kZV9leHQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmlvbiBpd3JlcV9kYXRhKiB3cnF1LCBjaGFyICpleHRyYSk7CitpbnQgaWVlZTgwMjExX3d4X3NldF9hdXRoKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGl3X3BhcmFtICpkYXRhLCBjaGFyICpleHRyYSk7CitpbnQgaWVlZTgwMjExX3d4X3NldF9tbG1lKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpOworCitpbnQgaWVlZTgwMjExX3d4X3NldF9nZW5faWUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHU4ICppZSwgc2l6ZV90IGxlbik7CisvKiBpZWVlODAyMTFfc29mdG1hYy5jICovCitleHRlcm4gc2hvcnQgaWVlZTgwMjExX2lzXzU0ZyhzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgbmV0KTsKK2V4dGVybiBzaG9ydCBpZWVlODAyMTFfaXNfc2hvcnRzbG90KHN0cnVjdCBpZWVlODAyMTFfbmV0d29yayBuZXQpOworZXh0ZXJuIGludCBpZWVlODAyMTFfcnhfZnJhbWVfc29mdG1hYyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCXN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHMgKnJ4X3N0YXRzLCB1MTYgdHlwZSwKKwkJCXUxNiBzdHlwZSk7CitleHRlcm4gdm9pZCBpZWVlODAyMTFfc29mdG1hY19uZXdfbmV0KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKm5ldCk7CisKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9zb2Z0bWFjX3htaXQoc3RydWN0IGllZWU4MDIxMV90eGIgKnR4Yiwgc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3NvZnRtYWNfY2hlY2tfYWxsX25ldHMoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3N0YXJ0X2JzcyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CitleHRlcm4gdm9pZCBpZWVlODAyMTFfc3RhcnRfbWFzdGVyX2JzcyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CitleHRlcm4gdm9pZCBpZWVlODAyMTFfc3RhcnRfaWJzcyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CitleHRlcm4gdm9pZCBpZWVlODAyMTFfc29mdG1hY19pbml0KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9zb2Z0bWFjX2ZyZWUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX2Fzc29jaWF0ZV9hYm9ydChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CitleHRlcm4gdm9pZCBpZWVlODAyMTFfZGlzYXNzb2NpYXRlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9zdG9wX3NjYW4oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3N0YXJ0X3NjYW5fc3luY3JvKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9jaGVja19hbGxfbmV0cyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CitleHRlcm4gdm9pZCBpZWVlODAyMTFfc3RhcnRfcHJvdG9jb2woc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3N0b3BfcHJvdG9jb2woc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3NvZnRtYWNfc3RhcnRfcHJvdG9jb2woc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3NvZnRtYWNfc3RvcF9wcm90b2NvbChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CitleHRlcm4gdm9pZCBpZWVlODAyMTFfcmVzZXRfcXVldWUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3dha2VfcXVldWUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3N0b3BfcXVldWUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHN0cnVjdCBza19idWZmICppZWVlODAyMTFfZ2V0X2JlYWNvbihzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CitleHRlcm4gdm9pZCBpZWVlODAyMTFfc3RhcnRfc2VuZF9iZWFjb25zKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9zdG9wX3NlbmRfYmVhY29ucyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CitleHRlcm4gaW50IGllZWU4MDIxMV93cGFfc3VwcGxpY2FudF9pb2N0bChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc3RydWN0IGl3X3BvaW50ICpwKTsKK2V4dGVybiB2b2lkIG5vdGlmeV93eF9hc3NvY19ldmVudChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CitleHRlcm4gdm9pZCBpZWVlODAyMTFfcHNfdHhfYWNrKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzaG9ydCBzdWNjZXNzKTsKK2V4dGVybiB2b2lkIFNlbmREaXNhc3NvY2lhdGlvbihzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSx1OCogYXNTdGEsdTggYXNSc24pOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3N0YXJ0X3NjYW4oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworCisvL0FkZCBmb3IgUkYgcG93ZXIgb24gcG93ZXIgb2ZmIGJ5IGxpemhhb21pbmcgMDgwNTEyCitleHRlcm4gdm9pZCBTZW5kRGlzYXNzb2NpYXRpb24oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisgICAgICAgCQkJIHU4KiAgICAgICAgICAgICAgICAgICAgIGFzU3RhLAorICAgICAgICAJCSB1OCAgICAgICAgICAgICAgICAgICAgICBhc1Jzbik7CisKKy8qIGllZWU4MDIxMV9jcnlwdF9jY21wJnRraXAmd2VwLmMgKi8KK2V4dGVybiB2b2lkIGllZWU4MDIxMV90a2lwX251bGwodm9pZCk7CitleHRlcm4gdm9pZCBpZWVlODAyMTFfd2VwX251bGwodm9pZCk7CitleHRlcm4gdm9pZCBpZWVlODAyMTFfY2NtcF9udWxsKHZvaWQpOworLyogaWVlZTgwMjExX3NvZnRtYWNfd3guYyAqLworCitleHRlcm4gaW50IGllZWU4MDIxMV93eF9nZXRfd2FwKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0KTsKKworZXh0ZXJuIGludCBpZWVlODAyMTFfd3hfc2V0X3dhcChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJIHVuaW9uIGl3cmVxX2RhdGEgKmF3cnEsCisJCQkgY2hhciAqZXh0cmEpOworCitleHRlcm4gaW50IGllZWU4MDIxMV93eF9nZXRfZXNzaWQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmEsdW5pb24gaXdyZXFfZGF0YSAqd3JxdSxjaGFyICpiKTsKKworZXh0ZXJuIGludCBpZWVlODAyMTFfd3hfc2V0X3JhdGUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKTsKKworZXh0ZXJuIGludCBpZWVlODAyMTFfd3hfZ2V0X3JhdGUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKTsKKworZXh0ZXJuIGludCBpZWVlODAyMTFfd3hfc2V0X21vZGUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmEsCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmIpOworCitleHRlcm4gaW50IGllZWU4MDIxMV93eF9zZXRfc2NhbihzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqYSwKKwkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqYik7CisKK2V4dGVybiBpbnQgaWVlZTgwMjExX3d4X3NldF9lc3NpZChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCSAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmEsCisJCQkgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSk7CisKK2V4dGVybiBpbnQgaWVlZTgwMjExX3d4X2dldF9tb2RlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICphLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpiKTsKKworZXh0ZXJuIGludCBpZWVlODAyMTFfd3hfc2V0X2ZyZXEoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmEsCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmIpOworCitleHRlcm4gaW50IGllZWU4MDIxMV93eF9nZXRfZnJlcShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqYSwKKwkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqYik7CisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMjApKQorZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3d4X3N5bmNfc2Nhbl93cShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOworI2Vsc2UKKyBleHRlcm4gdm9pZCBpZWVlODAyMTFfd3hfc3luY19zY2FuX3dxKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKKyNlbmRpZgorLy9leHRlcm4gdm9pZCBpZWVlODAyMTFfd3hfc3luY19zY2FuX3dxKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKKworZXh0ZXJuIGludCBpZWVlODAyMTFfd3hfc2V0X3Jhd3R4KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpOworCitleHRlcm4gaW50IGllZWU4MDIxMV93eF9nZXRfbmFtZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCSAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpOworCitleHRlcm4gaW50IGllZWU4MDIxMV93eF9zZXRfcG93ZXIoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkJIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkJIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKTsKKworZXh0ZXJuIGludCBpZWVlODAyMTFfd3hfZ2V0X3Bvd2VyKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJCSB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSk7CisKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9zb2Z0bWFjX2lwc19zY2FuX3N5bmNybyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CisKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9zdGFfcHNfc2VuZF9udWxsX2ZyYW1lKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzaG9ydCBwd3IpOworCitleHRlcm4gY29uc3QgbG9uZyBpZWVlODAyMTFfd2xhbl9mcmVxdWVuY2llc1tdOworCitleHRlcm4gaW5saW5lIHZvaWQgaWVlZTgwMjExX2luY3JlbWVudF9zY2FucyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKwlpZWVlLT5zY2FucysrOworfQorCitleHRlcm4gaW5saW5lIGludCBpZWVlODAyMTFfZ2V0X3NjYW5zKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCXJldHVybiBpZWVlLT5zY2FuczsKK30KKworc3RhdGljIGlubGluZSBjb25zdCBjaGFyICplc2NhcGVfZXNzaWQoY29uc3QgY2hhciAqZXNzaWQsIHU4IGVzc2lkX2xlbikgeworCXN0YXRpYyBjaGFyIGVzY2FwZWRbSVdfRVNTSURfTUFYX1NJWkUgKiAyICsgMV07CisJY29uc3QgY2hhciAqcyA9IGVzc2lkOworCWNoYXIgKmQgPSBlc2NhcGVkOworCisJaWYgKGllZWU4MDIxMV9pc19lbXB0eV9lc3NpZChlc3NpZCwgZXNzaWRfbGVuKSkgeworCQltZW1jcHkoZXNjYXBlZCwgIjxoaWRkZW4+Iiwgc2l6ZW9mKCI8aGlkZGVuPiIpKTsKKwkJcmV0dXJuIGVzY2FwZWQ7CisJfQorCisJZXNzaWRfbGVuID0gbWluKGVzc2lkX2xlbiwgKHU4KUlXX0VTU0lEX01BWF9TSVpFKTsKKwl3aGlsZSAoZXNzaWRfbGVuLS0pIHsKKwkJaWYgKCpzID09ICdcMCcpIHsKKwkJCSpkKysgPSAnXFwnOworCQkJKmQrKyA9ICcwJzsKKwkJCXMrKzsKKwkJfSBlbHNlIHsKKwkJCSpkKysgPSAqcysrOworCQl9CisJfQorCSpkID0gJ1wwJzsKKwlyZXR1cm4gZXNjYXBlZDsKK30KKyNlbmRpZiAvKiBJRUVFODAyMTFfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvaWVlZTgwMjExX2NyeXB0LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS9pZWVlODAyMTFfY3J5cHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjY0Y2ZiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvaWVlZTgwMjExX2NyeXB0LmMKQEAgLTAsMCArMSwyNjUgQEAKKy8qCisgKiBIb3N0IEFQIGNyeXB0byByb3V0aW5lcworICoKKyAqIENvcHlyaWdodCAoYykgMjAwMi0yMDAzLCBKb3VuaSBNYWxpbmVuIDxqa21hbGluZUBjYy5odXQuZmk+CisgKiBQb3J0aW9ucyBDb3B5cmlnaHQgKEMpIDIwMDQsIEludGVsIENvcnBvcmF0aW9uIDxqa2V0cmVub0BsaW51eC5pbnRlbC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gU2VlIFJFQURNRSBhbmQgQ09QWUlORyBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKworLy8jaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8YXNtL3N0cmluZy5oPgorI2luY2x1ZGUgPGFzbS9lcnJuby5oPgorCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERTxLRVJORUxfVkVSU0lPTigyLDYsMTgpKQorI2luY2x1ZGU8bGludXgvY29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgImllZWU4MDIxMS5oIgorCitNT0RVTEVfQVVUSE9SKCJKb3VuaSBNYWxpbmVuIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkhvc3RBUCBjcnlwdG8iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworc3RydWN0IGllZWU4MDIxMV9jcnlwdG9fYWxnIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJc3RydWN0IGllZWU4MDIxMV9jcnlwdG9fb3BzICpvcHM7Cit9OworCisKK3N0cnVjdCBpZWVlODAyMTFfY3J5cHRvIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGFsZ3M7CisJc3BpbmxvY2tfdCBsb2NrOworfTsKKworc3RhdGljIHN0cnVjdCBpZWVlODAyMTFfY3J5cHRvICpoY3J5cHQ7CisKK3ZvaWQgaWVlZTgwMjExX2NyeXB0X2RlaW5pdF9lbnRyaWVzKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJCQkgICBpbnQgZm9yY2UpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqcHRyLCAqbjsKKwlzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEgKmVudHJ5OworCisJZm9yIChwdHIgPSBpZWVlLT5jcnlwdF9kZWluaXRfbGlzdC5uZXh0LCBuID0gcHRyLT5uZXh0OworCSAgICAgcHRyICE9ICZpZWVlLT5jcnlwdF9kZWluaXRfbGlzdDsgcHRyID0gbiwgbiA9IHB0ci0+bmV4dCkgeworCQllbnRyeSA9IGxpc3RfZW50cnkocHRyLCBzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEsIGxpc3QpOworCisJCWlmIChhdG9taWNfcmVhZCgmZW50cnktPnJlZmNudCkgIT0gMCAmJiAhZm9yY2UpCisJCQljb250aW51ZTsKKworCQlsaXN0X2RlbChwdHIpOworCisJCWlmIChlbnRyeS0+b3BzKSB7CisJCQllbnRyeS0+b3BzLT5kZWluaXQoZW50cnktPnByaXYpOworCQkJbW9kdWxlX3B1dChlbnRyeS0+b3BzLT5vd25lcik7CisJCX0KKwkJa2ZyZWUoZW50cnkpOworCX0KK30KKwordm9pZCBpZWVlODAyMTFfY3J5cHRfZGVpbml0X2hhbmRsZXIodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlID0gKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICopZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKKwlpZWVlODAyMTFfY3J5cHRfZGVpbml0X2VudHJpZXMoaWVlZSwgMCk7CisJaWYgKCFsaXN0X2VtcHR5KCZpZWVlLT5jcnlwdF9kZWluaXRfbGlzdCkpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBlbnRyaWVzIHJlbWFpbmluZyBpbiBkZWxheWVkIGNyeXB0ICIKKwkJICAgICAgICJkZWxldGlvbiBsaXN0XG4iLCBpZWVlLT5kZXYtPm5hbWUpOworCQlpZWVlLT5jcnlwdF9kZWluaXRfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBIWjsKKwkJYWRkX3RpbWVyKCZpZWVlLT5jcnlwdF9kZWluaXRfdGltZXIpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5sb2NrLCBmbGFncyk7CisKK30KKwordm9pZCBpZWVlODAyMTFfY3J5cHRfZGVsYXllZF9kZWluaXQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkJICAgIHN0cnVjdCBpZWVlODAyMTFfY3J5cHRfZGF0YSAqKmNyeXB0KQoreworCXN0cnVjdCBpZWVlODAyMTFfY3J5cHRfZGF0YSAqdG1wOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoKmNyeXB0ID09IE5VTEwpCisJCXJldHVybjsKKworCXRtcCA9ICpjcnlwdDsKKwkqY3J5cHQgPSBOVUxMOworCisJLyogbXVzdCBub3QgcnVuIG9wcy0+ZGVpbml0KCkgd2hpbGUgdGhlcmUgbWF5IGJlIHBlbmRpbmcgZW5jcnlwdCBvcgorCSAqIGRlY3J5cHQgb3BlcmF0aW9ucy4gVXNlIGEgbGlzdCBvZiBkZWxheWVkIGRlaW5pdHMgdG8gYXZvaWQgbmVlZGluZworCSAqIGxvY2tpbmcuICovCisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWVlZS0+bG9jaywgZmxhZ3MpOworCWxpc3RfYWRkKCZ0bXAtPmxpc3QsICZpZWVlLT5jcnlwdF9kZWluaXRfbGlzdCk7CisJaWYgKCF0aW1lcl9wZW5kaW5nKCZpZWVlLT5jcnlwdF9kZWluaXRfdGltZXIpKSB7CisJCWllZWUtPmNyeXB0X2RlaW5pdF90aW1lci5leHBpcmVzID0gamlmZmllcyArIEhaOworCQlhZGRfdGltZXIoJmllZWUtPmNyeXB0X2RlaW5pdF90aW1lcik7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKK30KKworaW50IGllZWU4MDIxMV9yZWdpc3Rlcl9jcnlwdG9fb3BzKHN0cnVjdCBpZWVlODAyMTFfY3J5cHRvX29wcyAqb3BzKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGllZWU4MDIxMV9jcnlwdG9fYWxnICphbGc7CisKKwlpZiAoaGNyeXB0ID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCWFsZyA9IGttYWxsb2Moc2l6ZW9mKCphbGcpLCBHRlBfS0VSTkVMKTsKKwlpZiAoYWxnID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJbWVtc2V0KGFsZywgMCwgc2l6ZW9mKCphbGcpKTsKKwlhbGctPm9wcyA9IG9wczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZoY3J5cHQtPmxvY2ssIGZsYWdzKTsKKwlsaXN0X2FkZCgmYWxnLT5saXN0LCAmaGNyeXB0LT5hbGdzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoY3J5cHQtPmxvY2ssIGZsYWdzKTsKKworCXByaW50ayhLRVJOX0RFQlVHICJpZWVlODAyMTFfY3J5cHQ6IHJlZ2lzdGVyZWQgYWxnb3JpdGhtICclcydcbiIsCisJICAgICAgIG9wcy0+bmFtZSk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGllZWU4MDIxMV91bnJlZ2lzdGVyX2NyeXB0b19vcHMoc3RydWN0IGllZWU4MDIxMV9jcnlwdG9fb3BzICpvcHMpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwdHI7CisJc3RydWN0IGllZWU4MDIxMV9jcnlwdG9fYWxnICpkZWxfYWxnID0gTlVMTDsKKworCWlmIChoY3J5cHQgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmhjcnlwdC0+bG9jaywgZmxhZ3MpOworCWZvciAocHRyID0gaGNyeXB0LT5hbGdzLm5leHQ7IHB0ciAhPSAmaGNyeXB0LT5hbGdzOyBwdHIgPSBwdHItPm5leHQpIHsKKwkJc3RydWN0IGllZWU4MDIxMV9jcnlwdG9fYWxnICphbGcgPQorCQkJKHN0cnVjdCBpZWVlODAyMTFfY3J5cHRvX2FsZyAqKSBwdHI7CisJCWlmIChhbGctPm9wcyA9PSBvcHMpIHsKKwkJCWxpc3RfZGVsKCZhbGctPmxpc3QpOworCQkJZGVsX2FsZyA9IGFsZzsKKwkJCWJyZWFrOworCQl9CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhjcnlwdC0+bG9jaywgZmxhZ3MpOworCisJaWYgKGRlbF9hbGcpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgImllZWU4MDIxMV9jcnlwdDogdW5yZWdpc3RlcmVkIGFsZ29yaXRobSAiCisJCSAgICAgICAiJyVzJ1xuIiwgb3BzLT5uYW1lKTsKKwkJa2ZyZWUoZGVsX2FsZyk7CisJfQorCisJcmV0dXJuIGRlbF9hbGcgPyAwIDogLTE7Cit9CisKKworc3RydWN0IGllZWU4MDIxMV9jcnlwdG9fb3BzICogaWVlZTgwMjExX2dldF9jcnlwdG9fb3BzKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwdHI7CisJc3RydWN0IGllZWU4MDIxMV9jcnlwdG9fYWxnICpmb3VuZF9hbGcgPSBOVUxMOworCisJaWYgKGhjcnlwdCA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZoY3J5cHQtPmxvY2ssIGZsYWdzKTsKKwlmb3IgKHB0ciA9IGhjcnlwdC0+YWxncy5uZXh0OyBwdHIgIT0gJmhjcnlwdC0+YWxnczsgcHRyID0gcHRyLT5uZXh0KSB7CisJCXN0cnVjdCBpZWVlODAyMTFfY3J5cHRvX2FsZyAqYWxnID0KKwkJCShzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0b19hbGcgKikgcHRyOworCQlpZiAoc3RyY21wKGFsZy0+b3BzLT5uYW1lLCBuYW1lKSA9PSAwKSB7CisJCQlmb3VuZF9hbGcgPSBhbGc7CisJCQlicmVhazsKKwkJfQorCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoY3J5cHQtPmxvY2ssIGZsYWdzKTsKKworCWlmIChmb3VuZF9hbGcpCisJCXJldHVybiBmb3VuZF9hbGctPm9wczsKKwllbHNlCisJCXJldHVybiBOVUxMOworfQorCisKK3N0YXRpYyB2b2lkICogaWVlZTgwMjExX2NyeXB0X251bGxfaW5pdChpbnQga2V5aWR4KSB7IHJldHVybiAodm9pZCAqKSAxOyB9CitzdGF0aWMgdm9pZCBpZWVlODAyMTFfY3J5cHRfbnVsbF9kZWluaXQodm9pZCAqcHJpdikge30KKworc3RhdGljIHN0cnVjdCBpZWVlODAyMTFfY3J5cHRvX29wcyBpZWVlODAyMTFfY3J5cHRfbnVsbCA9IHsKKwkubmFtZQkJCT0gIk5VTEwiLAorCS5pbml0CQkJPSBpZWVlODAyMTFfY3J5cHRfbnVsbF9pbml0LAorCS5kZWluaXQJCQk9IGllZWU4MDIxMV9jcnlwdF9udWxsX2RlaW5pdCwKKwkuZW5jcnlwdF9tcGR1CQk9IE5VTEwsCisJLmRlY3J5cHRfbXBkdQkJPSBOVUxMLAorCS5lbmNyeXB0X21zZHUJCT0gTlVMTCwKKwkuZGVjcnlwdF9tc2R1CQk9IE5VTEwsCisJLnNldF9rZXkJCT0gTlVMTCwKKwkuZ2V0X2tleQkJPSBOVUxMLAorCS5leHRyYV9wcmVmaXhfbGVuCT0gMCwKKwkuZXh0cmFfcG9zdGZpeF9sZW4JPSAwLAorCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCit9OworCisKK2ludCBpZWVlODAyMTFfY3J5cHRvX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0ID0gLUVOT01FTTsKKworCWhjcnlwdCA9IGttYWxsb2Moc2l6ZW9mKCpoY3J5cHQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWhjcnlwdCkKKwkJZ290byBvdXQ7CisKKwltZW1zZXQoaGNyeXB0LCAwLCBzaXplb2YoKmhjcnlwdCkpOworCUlOSVRfTElTVF9IRUFEKCZoY3J5cHQtPmFsZ3MpOworCXNwaW5fbG9ja19pbml0KCZoY3J5cHQtPmxvY2spOworCisJcmV0ID0gaWVlZTgwMjExX3JlZ2lzdGVyX2NyeXB0b19vcHMoJmllZWU4MDIxMV9jcnlwdF9udWxsKTsKKwlpZiAocmV0IDwgMCkgeworCQlrZnJlZShoY3J5cHQpOworCQloY3J5cHQgPSBOVUxMOworCX0KK291dDoKKwlyZXR1cm4gcmV0OworfQorCisKK3ZvaWQgaWVlZTgwMjExX2NyeXB0b19kZWluaXQodm9pZCkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwdHIsICpuOworCisJaWYgKGhjcnlwdCA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlmb3IgKHB0ciA9IGhjcnlwdC0+YWxncy5uZXh0LCBuID0gcHRyLT5uZXh0OyBwdHIgIT0gJmhjcnlwdC0+YWxnczsKKwkgICAgIHB0ciA9IG4sIG4gPSBwdHItPm5leHQpIHsKKwkJc3RydWN0IGllZWU4MDIxMV9jcnlwdG9fYWxnICphbGcgPQorCQkJKHN0cnVjdCBpZWVlODAyMTFfY3J5cHRvX2FsZyAqKSBwdHI7CisJCWxpc3RfZGVsKHB0cik7CisJCXByaW50ayhLRVJOX0RFQlVHICJpZWVlODAyMTFfY3J5cHQ6IHVucmVnaXN0ZXJlZCBhbGdvcml0aG0gIgorCQkgICAgICAgIiclcycgKGRlaW5pdClcbiIsIGFsZy0+b3BzLT5uYW1lKTsKKwkJa2ZyZWUoYWxnKTsKKwl9CisKKwlrZnJlZShoY3J5cHQpOworfQorCisjaWYgMAorRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfY3J5cHRfZGVpbml0X2VudHJpZXMpOworRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfY3J5cHRfZGVpbml0X2hhbmRsZXIpOworRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfY3J5cHRfZGVsYXllZF9kZWluaXQpOworCitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV9yZWdpc3Rlcl9jcnlwdG9fb3BzKTsKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX3VucmVnaXN0ZXJfY3J5cHRvX29wcyk7CitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV9nZXRfY3J5cHRvX29wcyk7CisjZW5kaWYKKworLy9tb2R1bGVfaW5pdChpZWVlODAyMTFfY3J5cHRvX2luaXQpOworLy9tb2R1bGVfZXhpdChpZWVlODAyMTFfY3J5cHRvX2RlaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS9pZWVlODAyMTFfY3J5cHQuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1OGEzYmMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS9pZWVlODAyMTFfY3J5cHQuaApAQCAtMCwwICsxLDg2IEBACisvKgorICogT3JpZ2luYWwgY29kZSBiYXNlZCBvbiBIb3N0IEFQIChzb2Z0d2FyZSB3aXJlbGVzcyBMQU4gYWNjZXNzIHBvaW50KSBkcml2ZXIKKyAqIGZvciBJbnRlcnNpbCBQcmlzbTIvMi41LzMuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDIsIFNTSCBDb21tdW5pY2F0aW9ucyBTZWN1cml0eSBDb3JwIGFuZCBKb3VuaSBNYWxpbmVuCisgKiA8amttYWxpbmVAY2MuaHV0LmZpPgorICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDMsIEpvdW5pIE1hbGluZW4gPGprbWFsaW5lQGNjLmh1dC5maT4KKyAqCisgKiBBZGFwdGlvbiB0byBhIGdlbmVyaWMgSUVFRSA4MDIuMTEgc3RhY2sgYnkgSmFtZXMgS2V0cmVub3MKKyAqIDxqa2V0cmVub0BsaW51eC5pbnRlbC5jb20+CisgKgorICogQ29weXJpZ2h0IChjKSAyMDA0LCBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uIFNlZSBSRUFETUUgYW5kIENPUFlJTkcgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBpbnRlcmZhY2UgdG8gdGhlIGllZWU4MDIxMSBjcnlwdG8gbW9kdWxlLgorICovCisjaWZuZGVmIElFRUU4MDIxMV9DUllQVF9ICisjZGVmaW5lIElFRUU4MDIxMV9DUllQVF9ICisKKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKworc3RydWN0IGllZWU4MDIxMV9jcnlwdG9fb3BzIHsKKwljb25zdCBjaGFyICpuYW1lOworCisJLyogaW5pdCBuZXcgY3J5cHRvIGNvbnRleHQgKGUuZy4sIGFsbG9jYXRlIHByaXZhdGUgZGF0YSBzcGFjZSwKKwkgKiBzZWxlY3QgSVYsIGV0Yy4pOyByZXR1cm5zIE5VTEwgb24gZmFpbHVyZSBvciBwb2ludGVyIHRvIGFsbG9jYXRlZAorCSAqIHByaXZhdGUgZGF0YSBvbiBzdWNjZXNzICovCisJdm9pZCAqICgqaW5pdCkoaW50IGtleWlkeCk7CisKKwkvKiBkZWluaXRpYWxpemUgY3J5cHRvIGNvbnRleHQgYW5kIGZyZWUgYWxsb2NhdGVkIHByaXZhdGUgZGF0YSAqLworCXZvaWQgKCpkZWluaXQpKHZvaWQgKnByaXYpOworCisJLyogZW5jcnlwdC9kZWNyeXB0IHJldHVybiA8IDAgb24gZXJyb3Igb3IgPj0gMCBvbiBzdWNjZXNzLiBUaGUgcmV0dXJuCisJICogdmFsdWUgZnJvbSBkZWNyeXB0X21wZHUgaXMgcGFzc2VkIGFzIHRoZSBrZXlpZHggdmFsdWUgZm9yCisJICogZGVjcnlwdF9tc2R1LiBza2IgbXVzdCBoYXZlIGVub3VnaCBoZWFkIGFuZCB0YWlsIHJvb20gZm9yIHRoZQorCSAqIGVuY3J5cHRpb247IGlmIG5vdCwgZXJyb3Igd2lsbCBiZSByZXR1cm5lZDsgdGhlc2UgZnVuY3Rpb25zIGFyZQorCSAqIGNhbGxlZCBmb3IgYWxsIE1QRFVzIChpLmUuLCBmcmFnbWVudHMpLgorCSAqLworCWludCAoKmVuY3J5cHRfbXBkdSkoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGhkcl9sZW4sIHZvaWQgKnByaXYpOworCWludCAoKmRlY3J5cHRfbXBkdSkoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGhkcl9sZW4sIHZvaWQgKnByaXYpOworCisJLyogVGhlc2UgZnVuY3Rpb25zIGFyZSBjYWxsZWQgZm9yIGZ1bGwgTVNEVXMsIGkuZS4gZnVsbCBmcmFtZXMuCisJICogVGhlc2UgY2FuIGJlIE5VTEwgaWYgZnVsbCBNU0RVIG9wZXJhdGlvbnMgYXJlIG5vdCBuZWVkZWQuICovCisJaW50ICgqZW5jcnlwdF9tc2R1KShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgaGRyX2xlbiwgdm9pZCAqcHJpdik7CisJaW50ICgqZGVjcnlwdF9tc2R1KShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQga2V5aWR4LCBpbnQgaGRyX2xlbiwKKwkJCSAgICB2b2lkICpwcml2KTsKKworCWludCAoKnNldF9rZXkpKHZvaWQgKmtleSwgaW50IGxlbiwgdTggKnNlcSwgdm9pZCAqcHJpdik7CisJaW50ICgqZ2V0X2tleSkodm9pZCAqa2V5LCBpbnQgbGVuLCB1OCAqc2VxLCB2b2lkICpwcml2KTsKKworCS8qIHByb2NmcyBoYW5kbGVyIGZvciBwcmludGluZyBvdXQga2V5IGluZm9ybWF0aW9uIGFuZCBwb3NzaWJsZQorCSAqIHN0YXRpc3RpY3MgKi8KKwljaGFyICogKCpwcmludF9zdGF0cykoY2hhciAqcCwgdm9pZCAqcHJpdik7CisKKwkvKiBtYXhpbXVtIG51bWJlciBvZiBieXRlcyBhZGRlZCBieSBlbmNyeXB0aW9uOyBlbmNyeXB0IGJ1ZiBpcworCSAqIGFsbG9jYXRlZCB3aXRoIGV4dHJhX3ByZWZpeF9sZW4gYnl0ZXMsIGNvcHkgb2YgaW5fYnVmLCBhbmQKKwkgKiBleHRyYV9wb3N0Zml4X2xlbjsgZW5jcnlwdCBuZWVkIG5vdCB1c2UgYWxsIHRoaXMgc3BhY2UsIGJ1dAorCSAqIHRoZSByZXN1bHQgbXVzdCBzdGFydCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBidWZmZXIgYW5kIGNvcnJlY3QKKwkgKiBsZW5ndGggbXVzdCBiZSByZXR1cm5lZCAqLworCWludCBleHRyYV9wcmVmaXhfbGVuLCBleHRyYV9wb3N0Zml4X2xlbjsKKworCXN0cnVjdCBtb2R1bGUgKm93bmVyOworfTsKKworc3RydWN0IGllZWU4MDIxMV9jcnlwdF9kYXRhIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7IC8qIGRlbGF5ZWQgZGVsZXRpb24gbGlzdCAqLworCXN0cnVjdCBpZWVlODAyMTFfY3J5cHRvX29wcyAqb3BzOworCXZvaWQgKnByaXY7CisJYXRvbWljX3QgcmVmY250OworfTsKKworaW50IGllZWU4MDIxMV9yZWdpc3Rlcl9jcnlwdG9fb3BzKHN0cnVjdCBpZWVlODAyMTFfY3J5cHRvX29wcyAqb3BzKTsKK2ludCBpZWVlODAyMTFfdW5yZWdpc3Rlcl9jcnlwdG9fb3BzKHN0cnVjdCBpZWVlODAyMTFfY3J5cHRvX29wcyAqb3BzKTsKK3N0cnVjdCBpZWVlODAyMTFfY3J5cHRvX29wcyAqIGllZWU4MDIxMV9nZXRfY3J5cHRvX29wcyhjb25zdCBjaGFyICpuYW1lKTsKK3ZvaWQgaWVlZTgwMjExX2NyeXB0X2RlaW5pdF9lbnRyaWVzKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICosIGludCk7Cit2b2lkIGllZWU4MDIxMV9jcnlwdF9kZWluaXRfaGFuZGxlcih1bnNpZ25lZCBsb25nKTsKK3ZvaWQgaWVlZTgwMjExX2NyeXB0X2RlbGF5ZWRfZGVpbml0KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJCSAgICBzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEgKipjcnlwdCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvaWVlZTgwMjExX2NyeXB0X2NjbXAuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdF9jY21wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDhhZGQzOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdF9jY21wLmMKQEAgLTAsMCArMSw1MzMgQEAKKy8qCisgKiBIb3N0IEFQIGNyeXB0OiBob3N0LWJhc2VkIENDTVAgZW5jcnlwdGlvbiBpbXBsZW1lbnRhdGlvbiBmb3IgSG9zdCBBUCBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNCwgSm91bmkgTWFsaW5lbiA8amttYWxpbmVAY2MuaHV0LmZpPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uIFNlZSBSRUFETUUgYW5kIENPUFlJTkcgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKi8KKworLy8jaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaWZfZXRoZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxhc20vc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KKworI2luY2x1ZGUgImllZWU4MDIxMS5oIgorCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNSwwKSkKKyNpbmNsdWRlICJydGxfY3J5cHRvLmgiCisjZWxzZQorI2luY2x1ZGUgPGxpbnV4L2NyeXB0by5oPgorI2VuZGlmCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDIwKQorICAgICNpbmNsdWRlIDxhc20vc2NhdHRlcmxpc3QuaD4KKyNlbHNlCisgICAgI2luY2x1ZGUgPGxpbnV4L3NjYXR0ZXJsaXN0Lmg+CisjZW5kaWYKKworLy8jaW5jbHVkZSA8YXNtL3NjYXR0ZXJsaXN0Lmg+CisKK01PRFVMRV9BVVRIT1IoIkpvdW5pIE1hbGluZW4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiSG9zdCBBUCBjcnlwdDogQ0NNUCIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisjaWZkZWYgT1BFTlNVU0VfU0xFRAorI2lmbmRlZiBJTl9PUEVOU1VTRV9TTEVECisjZGVmaW5lIElOX09QRU5TVVNFX1NMRUQgMQorI2VuZGlmCisjZW5kaWYKKworI2RlZmluZSBBRVNfQkxPQ0tfTEVOIDE2CisjZGVmaW5lIENDTVBfSERSX0xFTiA4CisjZGVmaW5lIENDTVBfTUlDX0xFTiA4CisjZGVmaW5lIENDTVBfVEtfTEVOIDE2CisjZGVmaW5lIENDTVBfUE5fTEVOIDYKKworc3RydWN0IGllZWU4MDIxMV9jY21wX2RhdGEgeworCXU4IGtleVtDQ01QX1RLX0xFTl07CisJaW50IGtleV9zZXQ7CisKKwl1OCB0eF9wbltDQ01QX1BOX0xFTl07CisJdTggcnhfcG5bQ0NNUF9QTl9MRU5dOworCisJdTMyIGRvdDExUlNOQVN0YXRzQ0NNUEZvcm1hdEVycm9yczsKKwl1MzIgZG90MTFSU05BU3RhdHNDQ01QUmVwbGF5czsKKwl1MzIgZG90MTFSU05BU3RhdHNDQ01QRGVjcnlwdEVycm9yczsKKworCWludCBrZXlfaWR4OworCisJc3RydWN0IGNyeXB0b190Zm0gKnRmbTsKKworCS8qIHNjcmF0Y2ggYnVmZmVycyBmb3IgdmlydF90b19wYWdlKCkgKGNyeXB0byBBUEkpICovCisJdTggdHhfYjBbQUVTX0JMT0NLX0xFTl0sIHR4X2JbQUVTX0JMT0NLX0xFTl0sCisJCXR4X2VbQUVTX0JMT0NLX0xFTl0sIHR4X3MwW0FFU19CTE9DS19MRU5dOworCXU4IHJ4X2IwW0FFU19CTE9DS19MRU5dLCByeF9iW0FFU19CTE9DS19MRU5dLCByeF9hW0FFU19CTE9DS19MRU5dOworfTsKKwordm9pZCBpZWVlODAyMTFfY2NtcF9hZXNfZW5jcnlwdChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAorCQkJICAgICBjb25zdCB1OCBwdFsxNl0sIHU4IGN0WzE2XSkKK3sKKyAgICAgIAkjaWYoKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMjEpKXx8KElOX09QRU5TVVNFX1NMRUQpKQorCWNyeXB0b19jaXBoZXJfZW5jcnlwdF9vbmUoKHZvaWQgKil0Zm0sIGN0LCBwdCk7CisJI2Vsc2UKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3Qgc3JjLCBkc3Q7CisKKwlzcmMucGFnZSA9IHZpcnRfdG9fcGFnZShwdCk7CisJc3JjLm9mZnNldCA9IG9mZnNldF9pbl9wYWdlKHB0KTsKKwlzcmMubGVuZ3RoID0gQUVTX0JMT0NLX0xFTjsKKworCWRzdC5wYWdlID0gdmlydF90b19wYWdlKGN0KTsKKwlkc3Qub2Zmc2V0ID0gb2Zmc2V0X2luX3BhZ2UoY3QpOworCWRzdC5sZW5ndGggPSBBRVNfQkxPQ0tfTEVOOworCisJY3J5cHRvX2NpcGhlcl9lbmNyeXB0KHRmbSwgJmRzdCwgJnNyYywgQUVTX0JMT0NLX0xFTik7CisJI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkICogaWVlZTgwMjExX2NjbXBfaW5pdChpbnQga2V5X2lkeCkKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2NjbXBfZGF0YSAqcHJpdjsKKworCXByaXYgPSBrbWFsbG9jKHNpemVvZigqcHJpdiksIEdGUF9BVE9NSUMpOworCWlmIChwcml2ID09IE5VTEwpCisJCWdvdG8gZmFpbDsKKwltZW1zZXQocHJpdiwgMCwgc2l6ZW9mKCpwcml2KSk7CisJcHJpdi0+a2V5X2lkeCA9IGtleV9pZHg7CisKKyAgICAgICAjaWYoKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwyMSkpICYmICghSU5fT1BFTlNVU0VfU0xFRCkpCisJcHJpdi0+dGZtID0gY3J5cHRvX2FsbG9jX3RmbSgiYWVzIiwgMCk7CisJaWYgKHByaXYtPnRmbSA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICJpZWVlODAyMTFfY3J5cHRfY2NtcDogY291bGQgbm90IGFsbG9jYXRlICIKKwkJICAgICAgICJjcnlwdG8gQVBJIGFlc1xuIik7CisJCWdvdG8gZmFpbDsKKwl9CisgICAgICAgI2Vsc2UKKyAgICAgICBwcml2LT50Zm0gPSAodm9pZCAqKWNyeXB0b19hbGxvY19jaXBoZXIoImFlcyIsIDAsIENSWVBUT19BTEdfQVNZTkMpOworCWlmIChJU19FUlIocHJpdi0+dGZtKSkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiaWVlZTgwMjExX2NyeXB0X2NjbXA6IGNvdWxkIG5vdCBhbGxvY2F0ZSAiCisJCSAgICAgICAiY3J5cHRvIEFQSSBhZXNcbiIpOworCQlwcml2LT50Zm0gPSBOVUxMOworCQlnb3RvIGZhaWw7CisJfQorCSNlbmRpZgorCXJldHVybiBwcml2OworCitmYWlsOgorCWlmIChwcml2KSB7CisJCWlmIChwcml2LT50Zm0pCisJCQkvLyNpZihMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMjEpKQorICAgICAgIAkJCSNpZigoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDIxKSkgJiYgKCFJTl9PUEVOU1VTRV9TTEVEKSkKKwkJCWNyeXB0b19mcmVlX3RmbShwcml2LT50Zm0pOworICAgICAgICAgICAgICAgICAgICAjZWxzZQorCQkJY3J5cHRvX2ZyZWVfY2lwaGVyKCh2b2lkICopcHJpdi0+dGZtKTsKKwkJICAgICAgI2VuZGlmCisJCWtmcmVlKHByaXYpOworCX0KKworCXJldHVybiBOVUxMOworfQorCisKK3N0YXRpYyB2b2lkIGllZWU4MDIxMV9jY21wX2RlaW5pdCh2b2lkICpwcml2KQoreworCXN0cnVjdCBpZWVlODAyMTFfY2NtcF9kYXRhICpfcHJpdiA9IHByaXY7CisJaWYgKF9wcml2ICYmIF9wcml2LT50Zm0pCisJCS8vI2lmKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwyMSkpCisgICAgICAgCQkjaWYoKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwyMSkpICYmICghSU5fT1BFTlNVU0VfU0xFRCkpCisJCWNyeXB0b19mcmVlX3RmbShfcHJpdi0+dGZtKTsKKyAgICAgICAgICAgICAjZWxzZQorCQljcnlwdG9fZnJlZV9jaXBoZXIoKHZvaWQgKilfcHJpdi0+dGZtKTsKKwkJI2VuZGlmCisJa2ZyZWUocHJpdik7Cit9CisKKworc3RhdGljIGlubGluZSB2b2lkIHhvcl9ibG9jayh1OCAqYiwgdTggKmEsIHNpemVfdCBsZW4pCit7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQorCQliW2ldIF49IGFbaV07Cit9CisKKyNpZm5kZWYgSk9ITl9DQ01QCitzdGF0aWMgdm9pZCBjY21wX2luaXRfYmxvY2tzKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCisJCQkgICAgIHN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIsCisJCQkgICAgIHU4ICpwbiwgc2l6ZV90IGRsZW4sIHU4ICpiMCwgdTggKmF1dGgsCisJCQkgICAgIHU4ICpzMCkKK3sKKwl1OCAqcG9zLCBxYyA9IDA7CisJc2l6ZV90IGFhZF9sZW47CisJdTE2IGZjOworCWludCBhNF9pbmNsdWRlZCwgcWNfaW5jbHVkZWQ7CisJdTggYWFkWzIgKiBBRVNfQkxPQ0tfTEVOXTsKKworCWZjID0gbGUxNl90b19jcHUoaGRyLT5mcmFtZV9jdGwpOworCWE0X2luY2x1ZGVkID0gKChmYyAmIChJRUVFODAyMTFfRkNUTF9UT0RTIHwgSUVFRTgwMjExX0ZDVExfRlJPTURTKSkgPT0KKwkJICAgICAgIChJRUVFODAyMTFfRkNUTF9UT0RTIHwgSUVFRTgwMjExX0ZDVExfRlJPTURTKSk7CisJLyoKKwlxY19pbmNsdWRlZCA9ICgoV0xBTl9GQ19HRVRfVFlQRShmYykgPT0gSUVFRTgwMjExX0ZUWVBFX0RBVEEpICYmCisJCSAgICAgICAoV0xBTl9GQ19HRVRfU1RZUEUoZmMpICYgMHgwOCkpOworICAgICAgICAqLworCS8vIGZpeGVkIGJ5IERhdmlkIDoyMDA2LjkuNgorCXFjX2luY2x1ZGVkID0gKChXTEFOX0ZDX0dFVF9UWVBFKGZjKSA9PSBJRUVFODAyMTFfRlRZUEVfREFUQSkgJiYKKwkJICAgICAgIChXTEFOX0ZDX0dFVF9TVFlQRShmYykgJiAweDgwKSk7CisJYWFkX2xlbiA9IDIyOworCWlmIChhNF9pbmNsdWRlZCkKKwkJYWFkX2xlbiArPSA2OworCWlmIChxY19pbmNsdWRlZCkgeworCQlwb3MgPSAodTggKikgJmhkci0+YWRkcjQ7CisJCWlmIChhNF9pbmNsdWRlZCkKKwkJCXBvcyArPSA2OworCQlxYyA9ICpwb3MgJiAweDBmOworCQlhYWRfbGVuICs9IDI7CisJfQorCS8qIENDTSBJbml0aWFsIEJsb2NrOgorCSAqIEZsYWcgKEluY2x1ZGUgYXV0aGVudGljYXRpb24gaGVhZGVyLCBNPTMgKDgtb2N0ZXQgTUlDKSwKKwkgKiAgICAgICBMPTEgKDItb2N0ZXQgRGxlbikpCisJICogTm9uY2U6IDB4MDAgfCBBMiB8IFBOCisJICogRGxlbiAqLworCWIwWzBdID0gMHg1OTsKKwliMFsxXSA9IHFjOworCW1lbWNweShiMCArIDIsIGhkci0+YWRkcjIsIEVUSF9BTEVOKTsKKwltZW1jcHkoYjAgKyA4LCBwbiwgQ0NNUF9QTl9MRU4pOworCWIwWzE0XSA9IChkbGVuID4+IDgpICYgMHhmZjsKKwliMFsxNV0gPSBkbGVuICYgMHhmZjsKKworCS8qIEFBRDoKKwkgKiBGQyB3aXRoIGJpdHMgNC4uNiBhbmQgMTEuLjEzIG1hc2tlZCB0byB6ZXJvOyAxNCBpcyBhbHdheXMgb25lCisJICogQTEgfCBBMiB8IEEzCisJICogU0Mgd2l0aCBiaXRzIDQuLjE1IChzZXEjKSBtYXNrZWQgdG8gemVybworCSAqIEE0IChpZiBwcmVzZW50KQorCSAqIFFDIChpZiBwcmVzZW50KQorCSAqLworCXBvcyA9ICh1OCAqKSBoZHI7CisJYWFkWzBdID0gMDsgLyogYWFkX2xlbiA+PiA4ICovCisJYWFkWzFdID0gYWFkX2xlbiAmIDB4ZmY7CisJYWFkWzJdID0gcG9zWzBdICYgMHg4ZjsKKwlhYWRbM10gPSBwb3NbMV0gJiAweGM3OworCW1lbWNweShhYWQgKyA0LCBoZHItPmFkZHIxLCAzICogRVRIX0FMRU4pOworCXBvcyA9ICh1OCAqKSAmaGRyLT5zZXFfY3RsOworCWFhZFsyMl0gPSBwb3NbMF0gJiAweDBmOworCWFhZFsyM10gPSAwOyAvKiBhbGwgYml0cyBtYXNrZWQgKi8KKwltZW1zZXQoYWFkICsgMjQsIDAsIDgpOworCWlmIChhNF9pbmNsdWRlZCkKKwkJbWVtY3B5KGFhZCArIDI0LCBoZHItPmFkZHI0LCBFVEhfQUxFTik7CisJaWYgKHFjX2luY2x1ZGVkKSB7CisJCWFhZFthNF9pbmNsdWRlZCA/IDMwIDogMjRdID0gcWM7CisJCS8qIHJlc3Qgb2YgUUMgbWFza2VkICovCisJfQorCisJLyogU3RhcnQgd2l0aCB0aGUgZmlyc3QgYmxvY2sgYW5kIEFBRCAqLworCWllZWU4MDIxMV9jY21wX2Flc19lbmNyeXB0KHRmbSwgYjAsIGF1dGgpOworCXhvcl9ibG9jayhhdXRoLCBhYWQsIEFFU19CTE9DS19MRU4pOworCWllZWU4MDIxMV9jY21wX2Flc19lbmNyeXB0KHRmbSwgYXV0aCwgYXV0aCk7CisJeG9yX2Jsb2NrKGF1dGgsICZhYWRbQUVTX0JMT0NLX0xFTl0sIEFFU19CTE9DS19MRU4pOworCWllZWU4MDIxMV9jY21wX2Flc19lbmNyeXB0KHRmbSwgYXV0aCwgYXV0aCk7CisJYjBbMF0gJj0gMHgwNzsKKwliMFsxNF0gPSBiMFsxNV0gPSAwOworCWllZWU4MDIxMV9jY21wX2Flc19lbmNyeXB0KHRmbSwgYjAsIHMwKTsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IGllZWU4MDIxMV9jY21wX2VuY3J5cHQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGhkcl9sZW4sIHZvaWQgKnByaXYpCit7CisJc3RydWN0IGllZWU4MDIxMV9jY21wX2RhdGEgKmtleSA9IHByaXY7CisJaW50IGRhdGFfbGVuLCBpOworCXU4ICpwb3M7CisJc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkcjsKKyNpZm5kZWYgSk9ITl9DQ01QCisJaW50IGJsb2NrcywgbGFzdCwgbGVuOworCXU4ICptaWM7CisJdTggKmIwID0ga2V5LT50eF9iMDsKKwl1OCAqYiA9IGtleS0+dHhfYjsKKwl1OCAqZSA9IGtleS0+dHhfZTsKKwl1OCAqczAgPSBrZXktPnR4X3MwOworI2VuZGlmCisJaWYgKHNrYl9oZWFkcm9vbShza2IpIDwgQ0NNUF9IRFJfTEVOIHx8CisJICAgIHNrYl90YWlscm9vbShza2IpIDwgQ0NNUF9NSUNfTEVOIHx8CisJICAgIHNrYi0+bGVuIDwgaGRyX2xlbikKKwkJcmV0dXJuIC0xOworCisJZGF0YV9sZW4gPSBza2ItPmxlbiAtIGhkcl9sZW47CisJcG9zID0gc2tiX3B1c2goc2tiLCBDQ01QX0hEUl9MRU4pOworCW1lbW1vdmUocG9zLCBwb3MgKyBDQ01QX0hEUl9MRU4sIGhkcl9sZW4pOworCXBvcyArPSBoZHJfbGVuOworLy8JbWljID0gc2tiX3B1dChza2IsIENDTVBfTUlDX0xFTik7CisKKwlpID0gQ0NNUF9QTl9MRU4gLSAxOworCXdoaWxlIChpID49IDApIHsKKwkJa2V5LT50eF9wbltpXSsrOworCQlpZiAoa2V5LT50eF9wbltpXSAhPSAwKQorCQkJYnJlYWs7CisJCWktLTsKKwl9CisKKwkqcG9zKysgPSBrZXktPnR4X3BuWzVdOworCSpwb3MrKyA9IGtleS0+dHhfcG5bNF07CisJKnBvcysrID0gMDsKKwkqcG9zKysgPSAoa2V5LT5rZXlfaWR4IDw8IDYpIHwgKDEgPDwgNSkgLyogRXh0IElWIGluY2x1ZGVkICovOworCSpwb3MrKyA9IGtleS0+dHhfcG5bM107CisJKnBvcysrID0ga2V5LT50eF9wblsyXTsKKwkqcG9zKysgPSBrZXktPnR4X3BuWzFdOworCSpwb3MrKyA9IGtleS0+dHhfcG5bMF07CisKKwloZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKikgc2tiLT5kYXRhOworI2lmbmRlZiBKT0hOX0NDTVAKKwkvL21pYyBpcyBtb3ZlZCB0byBoZXJlIGJ5IGpvaG4KKwltaWMgPSBza2JfcHV0KHNrYiwgQ0NNUF9NSUNfTEVOKTsKKworCWNjbXBfaW5pdF9ibG9ja3Moa2V5LT50Zm0sIGhkciwga2V5LT50eF9wbiwgZGF0YV9sZW4sIGIwLCBiLCBzMCk7CisKKwlibG9ja3MgPSAoZGF0YV9sZW4gKyBBRVNfQkxPQ0tfTEVOIC0gMSkgLyBBRVNfQkxPQ0tfTEVOOworCWxhc3QgPSBkYXRhX2xlbiAlIEFFU19CTE9DS19MRU47CisKKwlmb3IgKGkgPSAxOyBpIDw9IGJsb2NrczsgaSsrKSB7CisJCWxlbiA9IChpID09IGJsb2NrcyAmJiBsYXN0KSA/IGxhc3QgOiBBRVNfQkxPQ0tfTEVOOworCQkvKiBBdXRoZW50aWNhdGlvbiAqLworCQl4b3JfYmxvY2soYiwgcG9zLCBsZW4pOworCQlpZWVlODAyMTFfY2NtcF9hZXNfZW5jcnlwdChrZXktPnRmbSwgYiwgYik7CisJCS8qIEVuY3J5cHRpb24sIHdpdGggY291bnRlciAqLworCQliMFsxNF0gPSAoaSA+PiA4KSAmIDB4ZmY7CisJCWIwWzE1XSA9IGkgJiAweGZmOworCQlpZWVlODAyMTFfY2NtcF9hZXNfZW5jcnlwdChrZXktPnRmbSwgYjAsIGUpOworCQl4b3JfYmxvY2socG9zLCBlLCBsZW4pOworCQlwb3MgKz0gbGVuOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBDQ01QX01JQ19MRU47IGkrKykKKwkJbWljW2ldID0gYltpXSBeIHMwW2ldOworI2VuZGlmCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBpZWVlODAyMTFfY2NtcF9kZWNyeXB0KHN0cnVjdCBza19idWZmICpza2IsIGludCBoZHJfbGVuLCB2b2lkICpwcml2KQoreworCXN0cnVjdCBpZWVlODAyMTFfY2NtcF9kYXRhICprZXkgPSBwcml2OworCXU4IGtleWlkeCwgKnBvczsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyOworCXU4IHBuWzZdOworI2lmbmRlZiBKT0hOX0NDTVAKKwlzaXplX3QgZGF0YV9sZW4gPSBza2ItPmxlbiAtIGhkcl9sZW4gLSBDQ01QX0hEUl9MRU4gLSBDQ01QX01JQ19MRU47CisJdTggKm1pYyA9IHNrYi0+ZGF0YSArIHNrYi0+bGVuIC0gQ0NNUF9NSUNfTEVOOworCXU4ICpiMCA9IGtleS0+cnhfYjA7CisJdTggKmIgPSBrZXktPnJ4X2I7CisJdTggKmEgPSBrZXktPnJ4X2E7CisJaW50IGksIGJsb2NrcywgbGFzdCwgbGVuOworI2VuZGlmCisJaWYgKHNrYi0+bGVuIDwgaGRyX2xlbiArIENDTVBfSERSX0xFTiArIENDTVBfTUlDX0xFTikgeworCQlrZXktPmRvdDExUlNOQVN0YXRzQ0NNUEZvcm1hdEVycm9ycysrOworCQlyZXR1cm4gLTE7CisJfQorCisJaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopIHNrYi0+ZGF0YTsKKwlwb3MgPSBza2ItPmRhdGEgKyBoZHJfbGVuOworCWtleWlkeCA9IHBvc1szXTsKKwlpZiAoIShrZXlpZHggJiAoMSA8PCA1KSkpIHsKKwkJaWYgKG5ldF9yYXRlbGltaXQoKSkgeworCQkJcHJpbnRrKEtFUk5fREVCVUcgIkNDTVA6IHJlY2VpdmVkIHBhY2tldCB3aXRob3V0IEV4dElWIgorCQkJICAgICAgICIgZmxhZyBmcm9tICIgTUFDX0ZNVCAiXG4iLCBNQUNfQVJHKGhkci0+YWRkcjIpKTsKKwkJfQorCQlrZXktPmRvdDExUlNOQVN0YXRzQ0NNUEZvcm1hdEVycm9ycysrOworCQlyZXR1cm4gLTI7CisJfQorCWtleWlkeCA+Pj0gNjsKKwlpZiAoa2V5LT5rZXlfaWR4ICE9IGtleWlkeCkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiQ0NNUDogUlggdGtleS0+a2V5X2lkeD0lZCBmcmFtZSAiCisJCSAgICAgICAia2V5aWR4PSVkIHByaXY9JXBcbiIsIGtleS0+a2V5X2lkeCwga2V5aWR4LCBwcml2KTsKKwkJcmV0dXJuIC02OworCX0KKwlpZiAoIWtleS0+a2V5X3NldCkgeworCQlpZiAobmV0X3JhdGVsaW1pdCgpKSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiQ0NNUDogcmVjZWl2ZWQgcGFja2V0IGZyb20gIiBNQUNfRk1UCisJCQkgICAgICAgIiB3aXRoIGtleWlkPSVkIHRoYXQgZG9lcyBub3QgaGF2ZSBhIGNvbmZpZ3VyZWQiCisJCQkgICAgICAgIiBrZXlcbiIsIE1BQ19BUkcoaGRyLT5hZGRyMiksIGtleWlkeCk7CisJCX0KKwkJcmV0dXJuIC0zOworCX0KKworCXBuWzBdID0gcG9zWzddOworCXBuWzFdID0gcG9zWzZdOworCXBuWzJdID0gcG9zWzVdOworCXBuWzNdID0gcG9zWzRdOworCXBuWzRdID0gcG9zWzFdOworCXBuWzVdID0gcG9zWzBdOworCXBvcyArPSA4OworCisJaWYgKG1lbWNtcChwbiwga2V5LT5yeF9wbiwgQ0NNUF9QTl9MRU4pIDw9IDApIHsKKwkJaWYgKG5ldF9yYXRlbGltaXQoKSkgeworCQkJcHJpbnRrKEtFUk5fREVCVUcgIkNDTVA6IHJlcGxheSBkZXRlY3RlZDogU1RBPSIgTUFDX0ZNVAorCQkJICAgICAgICIgcHJldmlvdXMgUE4gJTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4ICIKKwkJCSAgICAgICAicmVjZWl2ZWQgUE4gJTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4XG4iLAorCQkJICAgICAgIE1BQ19BUkcoaGRyLT5hZGRyMiksIE1BQ19BUkcoa2V5LT5yeF9wbiksCisJCQkgICAgICAgTUFDX0FSRyhwbikpOworCQl9CisJCWtleS0+ZG90MTFSU05BU3RhdHNDQ01QUmVwbGF5cysrOworCQlyZXR1cm4gLTQ7CisJfQorCisjaWZuZGVmIEpPSE5fQ0NNUAorCWNjbXBfaW5pdF9ibG9ja3Moa2V5LT50Zm0sIGhkciwgcG4sIGRhdGFfbGVuLCBiMCwgYSwgYik7CisJeG9yX2Jsb2NrKG1pYywgYiwgQ0NNUF9NSUNfTEVOKTsKKworCWJsb2NrcyA9IChkYXRhX2xlbiArIEFFU19CTE9DS19MRU4gLSAxKSAvIEFFU19CTE9DS19MRU47CisJbGFzdCA9IGRhdGFfbGVuICUgQUVTX0JMT0NLX0xFTjsKKworCWZvciAoaSA9IDE7IGkgPD0gYmxvY2tzOyBpKyspIHsKKwkJbGVuID0gKGkgPT0gYmxvY2tzICYmIGxhc3QpID8gbGFzdCA6IEFFU19CTE9DS19MRU47CisJCS8qIERlY3J5cHQsIHdpdGggY291bnRlciAqLworCQliMFsxNF0gPSAoaSA+PiA4KSAmIDB4ZmY7CisJCWIwWzE1XSA9IGkgJiAweGZmOworCQlpZWVlODAyMTFfY2NtcF9hZXNfZW5jcnlwdChrZXktPnRmbSwgYjAsIGIpOworCQl4b3JfYmxvY2socG9zLCBiLCBsZW4pOworCQkvKiBBdXRoZW50aWNhdGlvbiAqLworCQl4b3JfYmxvY2soYSwgcG9zLCBsZW4pOworCQlpZWVlODAyMTFfY2NtcF9hZXNfZW5jcnlwdChrZXktPnRmbSwgYSwgYSk7CisJCXBvcyArPSBsZW47CisJfQorCisJaWYgKG1lbWNtcChtaWMsIGEsIENDTVBfTUlDX0xFTikgIT0gMCkgeworCQlpZiAobmV0X3JhdGVsaW1pdCgpKSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiQ0NNUDogZGVjcnlwdCBmYWlsZWQ6IFNUQT0iCisJCQkgICAgICAgTUFDX0ZNVCAiXG4iLCBNQUNfQVJHKGhkci0+YWRkcjIpKTsKKwkJfQorCQlrZXktPmRvdDExUlNOQVN0YXRzQ0NNUERlY3J5cHRFcnJvcnMrKzsKKwkJcmV0dXJuIC01OworCX0KKworCW1lbWNweShrZXktPnJ4X3BuLCBwbiwgQ0NNUF9QTl9MRU4pOworCisjZW5kaWYKKwkvKiBSZW1vdmUgaGRyIGFuZCBNSUMgKi8KKwltZW1tb3ZlKHNrYi0+ZGF0YSArIENDTVBfSERSX0xFTiwgc2tiLT5kYXRhLCBoZHJfbGVuKTsKKwlza2JfcHVsbChza2IsIENDTVBfSERSX0xFTik7CisJc2tiX3RyaW0oc2tiLCBza2ItPmxlbiAtIENDTVBfTUlDX0xFTik7CisKKwlyZXR1cm4ga2V5aWR4OworfQorCisKK3N0YXRpYyBpbnQgaWVlZTgwMjExX2NjbXBfc2V0X2tleSh2b2lkICprZXksIGludCBsZW4sIHU4ICpzZXEsIHZvaWQgKnByaXYpCit7CisJc3RydWN0IGllZWU4MDIxMV9jY21wX2RhdGEgKmRhdGEgPSBwcml2OworCWludCBrZXlpZHg7CisJc3RydWN0IGNyeXB0b190Zm0gKnRmbSA9IGRhdGEtPnRmbTsKKworCWtleWlkeCA9IGRhdGEtPmtleV9pZHg7CisJbWVtc2V0KGRhdGEsIDAsIHNpemVvZigqZGF0YSkpOworCWRhdGEtPmtleV9pZHggPSBrZXlpZHg7CisJZGF0YS0+dGZtID0gdGZtOworCWlmIChsZW4gPT0gQ0NNUF9US19MRU4pIHsKKwkJbWVtY3B5KGRhdGEtPmtleSwga2V5LCBDQ01QX1RLX0xFTik7CisJCWRhdGEtPmtleV9zZXQgPSAxOworCQlpZiAoc2VxKSB7CisJCQlkYXRhLT5yeF9wblswXSA9IHNlcVs1XTsKKwkJCWRhdGEtPnJ4X3BuWzFdID0gc2VxWzRdOworCQkJZGF0YS0+cnhfcG5bMl0gPSBzZXFbM107CisJCQlkYXRhLT5yeF9wblszXSA9IHNlcVsyXTsKKwkJCWRhdGEtPnJ4X3BuWzRdID0gc2VxWzFdOworCQkJZGF0YS0+cnhfcG5bNV0gPSBzZXFbMF07CisJCX0KKwkJY3J5cHRvX2NpcGhlcl9zZXRrZXkoKHZvaWQgKilkYXRhLT50Zm0sIGRhdGEtPmtleSwgQ0NNUF9US19MRU4pOworCX0gZWxzZSBpZiAobGVuID09IDApCisJCWRhdGEtPmtleV9zZXQgPSAwOworCWVsc2UKKwkJcmV0dXJuIC0xOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBpZWVlODAyMTFfY2NtcF9nZXRfa2V5KHZvaWQgKmtleSwgaW50IGxlbiwgdTggKnNlcSwgdm9pZCAqcHJpdikKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2NjbXBfZGF0YSAqZGF0YSA9IHByaXY7CisKKwlpZiAobGVuIDwgQ0NNUF9US19MRU4pCisJCXJldHVybiAtMTsKKworCWlmICghZGF0YS0+a2V5X3NldCkKKwkJcmV0dXJuIDA7CisJbWVtY3B5KGtleSwgZGF0YS0+a2V5LCBDQ01QX1RLX0xFTik7CisKKwlpZiAoc2VxKSB7CisJCXNlcVswXSA9IGRhdGEtPnR4X3BuWzVdOworCQlzZXFbMV0gPSBkYXRhLT50eF9wbls0XTsKKwkJc2VxWzJdID0gZGF0YS0+dHhfcG5bM107CisJCXNlcVszXSA9IGRhdGEtPnR4X3BuWzJdOworCQlzZXFbNF0gPSBkYXRhLT50eF9wblsxXTsKKwkJc2VxWzVdID0gZGF0YS0+dHhfcG5bMF07CisJfQorCisJcmV0dXJuIENDTVBfVEtfTEVOOworfQorCisKK3N0YXRpYyBjaGFyICogaWVlZTgwMjExX2NjbXBfcHJpbnRfc3RhdHMoY2hhciAqcCwgdm9pZCAqcHJpdikKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2NjbXBfZGF0YSAqY2NtcCA9IHByaXY7CisJcCArPSBzcHJpbnRmKHAsICJrZXlbJWRdIGFsZz1DQ01QIGtleV9zZXQ9JWQgIgorCQkgICAgICJ0eF9wbj0lMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnggIgorCQkgICAgICJyeF9wbj0lMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnggIgorCQkgICAgICJmb3JtYXRfZXJyb3JzPSVkIHJlcGxheXM9JWQgZGVjcnlwdF9lcnJvcnM9JWRcbiIsCisJCSAgICAgY2NtcC0+a2V5X2lkeCwgY2NtcC0+a2V5X3NldCwKKwkJICAgICBNQUNfQVJHKGNjbXAtPnR4X3BuKSwgTUFDX0FSRyhjY21wLT5yeF9wbiksCisJCSAgICAgY2NtcC0+ZG90MTFSU05BU3RhdHNDQ01QRm9ybWF0RXJyb3JzLAorCQkgICAgIGNjbXAtPmRvdDExUlNOQVN0YXRzQ0NNUFJlcGxheXMsCisJCSAgICAgY2NtcC0+ZG90MTFSU05BU3RhdHNDQ01QRGVjcnlwdEVycm9ycyk7CisKKwlyZXR1cm4gcDsKK30KKwordm9pZCBpZWVlODAyMTFfY2NtcF9udWxsKHZvaWQpCit7CisvLyAgICBwcmludGsoIj09PT09PT09PT09PT4lcygpXG4iLCBfX2Z1bmNfXyk7CisJcmV0dXJuOworfQorc3RhdGljIHN0cnVjdCBpZWVlODAyMTFfY3J5cHRvX29wcyBpZWVlODAyMTFfY3J5cHRfY2NtcCA9IHsKKwkubmFtZQkJCT0gIkNDTVAiLAorCS5pbml0CQkJPSBpZWVlODAyMTFfY2NtcF9pbml0LAorCS5kZWluaXQJCQk9IGllZWU4MDIxMV9jY21wX2RlaW5pdCwKKwkuZW5jcnlwdF9tcGR1CQk9IGllZWU4MDIxMV9jY21wX2VuY3J5cHQsCisJLmRlY3J5cHRfbXBkdQkJPSBpZWVlODAyMTFfY2NtcF9kZWNyeXB0LAorCS5lbmNyeXB0X21zZHUJCT0gTlVMTCwKKwkuZGVjcnlwdF9tc2R1CQk9IE5VTEwsCisJLnNldF9rZXkJCT0gaWVlZTgwMjExX2NjbXBfc2V0X2tleSwKKwkuZ2V0X2tleQkJPSBpZWVlODAyMTFfY2NtcF9nZXRfa2V5LAorCS5wcmludF9zdGF0cwkJPSBpZWVlODAyMTFfY2NtcF9wcmludF9zdGF0cywKKwkuZXh0cmFfcHJlZml4X2xlbgk9IENDTVBfSERSX0xFTiwKKwkuZXh0cmFfcG9zdGZpeF9sZW4JPSBDQ01QX01JQ19MRU4sCisJLm93bmVyCQkJPSBUSElTX01PRFVMRSwKK307CisKKworaW50IGllZWU4MDIxMV9jcnlwdG9fY2NtcF9pbml0KHZvaWQpCit7CisJcmV0dXJuIGllZWU4MDIxMV9yZWdpc3Rlcl9jcnlwdG9fb3BzKCZpZWVlODAyMTFfY3J5cHRfY2NtcCk7Cit9CisKKwordm9pZCBpZWVlODAyMTFfY3J5cHRvX2NjbXBfZXhpdCh2b2lkKQoreworCWllZWU4MDIxMV91bnJlZ2lzdGVyX2NyeXB0b19vcHMoJmllZWU4MDIxMV9jcnlwdF9jY21wKTsKK30KKworI2lmIDAKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw1LDApKQorRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfY2NtcF9udWxsKTsKKyNlbHNlCitFWFBPUlRfU1lNQk9MX05PVkVSUyhpZWVlODAyMTFfY2NtcF9udWxsKTsKKyNlbmRpZgorI2VuZGlmCisKKy8vbW9kdWxlX2luaXQoaWVlZTgwMjExX2NyeXB0b19jY21wX2luaXQpOworLy9tb2R1bGVfZXhpdChpZWVlODAyMTFfY3J5cHRvX2NjbXBfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS9pZWVlODAyMTFfY3J5cHRfdGtpcC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvaWVlZTgwMjExX2NyeXB0X3RraXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTk3YmJlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvaWVlZTgwMjExX2NyeXB0X3RraXAuYwpAQCAtMCwwICsxLDEwMDEgQEAKKy8qCisgKiBIb3N0IEFQIGNyeXB0OiBob3N0LWJhc2VkIFRLSVAgZW5jcnlwdGlvbiBpbXBsZW1lbnRhdGlvbiBmb3IgSG9zdCBBUCBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNCwgSm91bmkgTWFsaW5lbiA8amttYWxpbmVAY2MuaHV0LmZpPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uIFNlZSBSRUFETUUgYW5kIENPUFlJTkcgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKi8KKworLy8jaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaWZfZXRoZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxhc20vc3RyaW5nLmg+CisKKyNpbmNsdWRlICJpZWVlODAyMTEuaCIKKworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkpCisjaW5jbHVkZSAicnRsX2NyeXB0by5oIgorI2Vsc2UKKyNpbmNsdWRlIDxsaW51eC9jcnlwdG8uaD4KKyNlbmRpZgorLy8jaW5jbHVkZSA8YXNtL3NjYXR0ZXJsaXN0Lmg+CisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwyMCkpCisgICAgI2luY2x1ZGUgPGFzbS9zY2F0dGVybGlzdC5oPgorI2Vsc2UKKyAgICAjaW5jbHVkZSA8bGludXgvc2NhdHRlcmxpc3QuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KKworTU9EVUxFX0FVVEhPUigiSm91bmkgTWFsaW5lbiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJIb3N0IEFQIGNyeXB0OiBUS0lQIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKyNpZmRlZiBPUEVOU1VTRV9TTEVECisjaWZuZGVmIElOX09QRU5TVVNFX1NMRUQKKyNkZWZpbmUgSU5fT1BFTlNVU0VfU0xFRCAxCisjZW5kaWYKKyNlbmRpZgorCitzdHJ1Y3QgaWVlZTgwMjExX3RraXBfZGF0YSB7CisjZGVmaW5lIFRLSVBfS0VZX0xFTiAzMgorCXU4IGtleVtUS0lQX0tFWV9MRU5dOworCWludCBrZXlfc2V0OworCisJdTMyIHR4X2l2MzI7CisJdTE2IHR4X2l2MTY7CisJdTE2IHR4X3R0YWtbNV07CisJaW50IHR4X3BoYXNlMV9kb25lOworCisJdTMyIHJ4X2l2MzI7CisJdTE2IHJ4X2l2MTY7CisJdTE2IHJ4X3R0YWtbNV07CisJaW50IHJ4X3BoYXNlMV9kb25lOworCXUzMiByeF9pdjMyX25ldzsKKwl1MTYgcnhfaXYxNl9uZXc7CisKKwl1MzIgZG90MTFSU05BU3RhdHNUS0lQUmVwbGF5czsKKwl1MzIgZG90MTFSU05BU3RhdHNUS0lQSUNWRXJyb3JzOworCXUzMiBkb3QxMVJTTkFTdGF0c1RLSVBMb2NhbE1JQ0ZhaWx1cmVzOworCisJaW50IGtleV9pZHg7CisKKyAgICAgICAjaWYoKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMjEpKXx8KElOX09QRU5TVVNFX1NMRUQpKQorCSAgIAlzdHJ1Y3QgY3J5cHRvX2Jsa2NpcGhlciAqcnhfdGZtX2FyYzQ7CisJICAgICAgIHN0cnVjdCBjcnlwdG9faGFzaCAqcnhfdGZtX21pY2hhZWw7CisJICAgICAgIHN0cnVjdCBjcnlwdG9fYmxrY2lwaGVyICp0eF90Zm1fYXJjNDsKKwkgICAgICAgc3RydWN0IGNyeXB0b19oYXNoICp0eF90Zm1fbWljaGFlbDsKKyAgICAgICAjZW5kaWYKKworCXN0cnVjdCBjcnlwdG9fdGZtICp0Zm1fYXJjNDsKKwlzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtX21pY2hhZWw7CisKKwkvKiBzY3JhdGNoIGJ1ZmZlcnMgZm9yIHZpcnRfdG9fcGFnZSgpIChjcnlwdG8gQVBJKSAqLworCXU4IHJ4X2hkclsxNl0sIHR4X2hkclsxNl07Cit9OworCitzdGF0aWMgdm9pZCAqIGllZWU4MDIxMV90a2lwX2luaXQoaW50IGtleV9pZHgpCit7CisJc3RydWN0IGllZWU4MDIxMV90a2lwX2RhdGEgKnByaXY7CisKKwlwcml2ID0ga21hbGxvYyhzaXplb2YoKnByaXYpLCBHRlBfQVRPTUlDKTsKKwlpZiAocHJpdiA9PSBOVUxMKQorCQlnb3RvIGZhaWw7CisJbWVtc2V0KHByaXYsIDAsIHNpemVvZigqcHJpdikpOworCXByaXYtPmtleV9pZHggPSBrZXlfaWR4OworCisgICAgICAjaWYoKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwyMSkpJiYoIUlOX09QRU5TVVNFX1NMRUQpKQorCXByaXYtPnRmbV9hcmM0ID0gY3J5cHRvX2FsbG9jX3RmbSgiYXJjNCIsIDApOworCWlmIChwcml2LT50Zm1fYXJjNCA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICJpZWVlODAyMTFfY3J5cHRfdGtpcDogY291bGQgbm90IGFsbG9jYXRlICIKKwkJICAgICAgICJjcnlwdG8gQVBJIGFyYzRcbiIpOworCQlnb3RvIGZhaWw7CisJfQorCisJcHJpdi0+dGZtX21pY2hhZWwgPSBjcnlwdG9fYWxsb2NfdGZtKCJtaWNoYWVsX21pYyIsIDApOworCWlmIChwcml2LT50Zm1fbWljaGFlbCA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICJpZWVlODAyMTFfY3J5cHRfdGtpcDogY291bGQgbm90IGFsbG9jYXRlICIKKwkJICAgICAgICJjcnlwdG8gQVBJIG1pY2hhZWxfbWljXG4iKTsKKwkJZ290byBmYWlsOworCX0KKworCSNlbHNlCisJcHJpdi0+dHhfdGZtX2FyYzQgPSBjcnlwdG9fYWxsb2NfYmxrY2lwaGVyKCJlY2IoYXJjNCkiLCAwLAorCQkJCQkJQ1JZUFRPX0FMR19BU1lOQyk7CisJaWYgKElTX0VSUihwcml2LT50eF90Zm1fYXJjNCkpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgImllZWU4MDIxMV9jcnlwdF90a2lwOiBjb3VsZCBub3QgYWxsb2NhdGUgIgorCQkgICAgICAgImNyeXB0byBBUEkgYXJjNFxuIik7CisJCXByaXYtPnR4X3RmbV9hcmM0ID0gTlVMTDsKKwkJZ290byBmYWlsOworCX0KKworCXByaXYtPnR4X3RmbV9taWNoYWVsID0gY3J5cHRvX2FsbG9jX2hhc2goIm1pY2hhZWxfbWljIiwgMCwKKwkJCQkJCSBDUllQVE9fQUxHX0FTWU5DKTsKKwlpZiAoSVNfRVJSKHByaXYtPnR4X3RmbV9taWNoYWVsKSkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiaWVlZTgwMjExX2NyeXB0X3RraXA6IGNvdWxkIG5vdCBhbGxvY2F0ZSAiCisJCSAgICAgICAiY3J5cHRvIEFQSSBtaWNoYWVsX21pY1xuIik7CisJCXByaXYtPnR4X3RmbV9taWNoYWVsID0gTlVMTDsKKwkJZ290byBmYWlsOworCX0KKworCXByaXYtPnJ4X3RmbV9hcmM0ID0gY3J5cHRvX2FsbG9jX2Jsa2NpcGhlcigiZWNiKGFyYzQpIiwgMCwKKwkJCQkJCUNSWVBUT19BTEdfQVNZTkMpOworCWlmIChJU19FUlIocHJpdi0+cnhfdGZtX2FyYzQpKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICJpZWVlODAyMTFfY3J5cHRfdGtpcDogY291bGQgbm90IGFsbG9jYXRlICIKKwkJICAgICAgICJjcnlwdG8gQVBJIGFyYzRcbiIpOworCQlwcml2LT5yeF90Zm1fYXJjNCA9IE5VTEw7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlwcml2LT5yeF90Zm1fbWljaGFlbCA9IGNyeXB0b19hbGxvY19oYXNoKCJtaWNoYWVsX21pYyIsIDAsCisJCQkJCQkgQ1JZUFRPX0FMR19BU1lOQyk7CisJaWYgKElTX0VSUihwcml2LT5yeF90Zm1fbWljaGFlbCkpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgImllZWU4MDIxMV9jcnlwdF90a2lwOiBjb3VsZCBub3QgYWxsb2NhdGUgIgorCQkgICAgICAgImNyeXB0byBBUEkgbWljaGFlbF9taWNcbiIpOworCQlwcml2LT5yeF90Zm1fbWljaGFlbCA9IE5VTEw7CisJCWdvdG8gZmFpbDsKKwl9CisgICAgICAgI2VuZGlmCisJcmV0dXJuIHByaXY7CisKK2ZhaWw6CisJaWYgKHByaXYpIHsKKwkJI2lmKChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMjEpKSYmKCFJTl9PUEVOU1VTRV9TTEVEKSkKKwkJaWYgKHByaXYtPnRmbV9taWNoYWVsKQorCQkJY3J5cHRvX2ZyZWVfdGZtKHByaXYtPnRmbV9taWNoYWVsKTsKKwkJaWYgKHByaXYtPnRmbV9hcmM0KQorCQkJY3J5cHRvX2ZyZWVfdGZtKHByaXYtPnRmbV9hcmM0KTsKKyAgICAgICAgICAgICAjZWxzZQorCQlpZiAocHJpdi0+dHhfdGZtX21pY2hhZWwpCisJCQljcnlwdG9fZnJlZV9oYXNoKHByaXYtPnR4X3RmbV9taWNoYWVsKTsKKwkJaWYgKHByaXYtPnR4X3RmbV9hcmM0KQorCQkJY3J5cHRvX2ZyZWVfYmxrY2lwaGVyKHByaXYtPnR4X3RmbV9hcmM0KTsKKwkJaWYgKHByaXYtPnJ4X3RmbV9taWNoYWVsKQorCQkJY3J5cHRvX2ZyZWVfaGFzaChwcml2LT5yeF90Zm1fbWljaGFlbCk7CisJCWlmIChwcml2LT5yeF90Zm1fYXJjNCkKKwkJCWNyeXB0b19mcmVlX2Jsa2NpcGhlcihwcml2LT5yeF90Zm1fYXJjNCk7CisJCSNlbmRpZgorCQlrZnJlZShwcml2KTsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworCitzdGF0aWMgdm9pZCBpZWVlODAyMTFfdGtpcF9kZWluaXQodm9pZCAqcHJpdikKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX3RraXBfZGF0YSAqX3ByaXYgPSBwcml2OworCSNpZigoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDIxKSkmJighSU5fT1BFTlNVU0VfU0xFRCkpCisJaWYgKF9wcml2ICYmIF9wcml2LT50Zm1fbWljaGFlbCkKKwkJY3J5cHRvX2ZyZWVfdGZtKF9wcml2LT50Zm1fbWljaGFlbCk7CisJaWYgKF9wcml2ICYmIF9wcml2LT50Zm1fYXJjNCkKKwkJY3J5cHRvX2ZyZWVfdGZtKF9wcml2LT50Zm1fYXJjNCk7CisJI2Vsc2UKKwlpZiAoX3ByaXYpIHsKKwkJaWYgKF9wcml2LT50eF90Zm1fbWljaGFlbCkKKwkJCWNyeXB0b19mcmVlX2hhc2goX3ByaXYtPnR4X3RmbV9taWNoYWVsKTsKKwkJaWYgKF9wcml2LT50eF90Zm1fYXJjNCkKKwkJCWNyeXB0b19mcmVlX2Jsa2NpcGhlcihfcHJpdi0+dHhfdGZtX2FyYzQpOworCQlpZiAoX3ByaXYtPnJ4X3RmbV9taWNoYWVsKQorCQkJY3J5cHRvX2ZyZWVfaGFzaChfcHJpdi0+cnhfdGZtX21pY2hhZWwpOworCQlpZiAoX3ByaXYtPnJ4X3RmbV9hcmM0KQorCQkJY3J5cHRvX2ZyZWVfYmxrY2lwaGVyKF9wcml2LT5yeF90Zm1fYXJjNCk7CisJfQorCSNlbmRpZgorCWtmcmVlKHByaXYpOworfQorCisKK3N0YXRpYyBpbmxpbmUgdTE2IFJvdFIxKHUxNiB2YWwpCit7CisJcmV0dXJuICh2YWwgPj4gMSkgfCAodmFsIDw8IDE1KTsKK30KKworCitzdGF0aWMgaW5saW5lIHU4IExvOCh1MTYgdmFsKQoreworCXJldHVybiB2YWwgJiAweGZmOworfQorCisKK3N0YXRpYyBpbmxpbmUgdTggSGk4KHUxNiB2YWwpCit7CisJcmV0dXJuIHZhbCA+PiA4OworfQorCisKK3N0YXRpYyBpbmxpbmUgdTE2IExvMTYodTMyIHZhbCkKK3sKKwlyZXR1cm4gdmFsICYgMHhmZmZmOworfQorCisKK3N0YXRpYyBpbmxpbmUgdTE2IEhpMTYodTMyIHZhbCkKK3sKKwlyZXR1cm4gdmFsID4+IDE2OworfQorCisKK3N0YXRpYyBpbmxpbmUgdTE2IE1rMTYodTggaGksIHU4IGxvKQoreworCXJldHVybiBsbyB8ICgoKHUxNikgaGkpIDw8IDgpOworfQorCisKK3N0YXRpYyBpbmxpbmUgdTE2IE1rMTZfbGUodTE2ICp2KQoreworCXJldHVybiBsZTE2X3RvX2NwdSgqdik7Cit9CisKKworc3RhdGljIGNvbnN0IHUxNiBTYm94WzI1Nl0gPQoreworCTB4QzZBNSwgMHhGODg0LCAweEVFOTksIDB4RjY4RCwgMHhGRjBELCAweEQ2QkQsIDB4REVCMSwgMHg5MTU0LAorCTB4NjA1MCwgMHgwMjAzLCAweENFQTksIDB4NTY3RCwgMHhFNzE5LCAweEI1NjIsIDB4NERFNiwgMHhFQzlBLAorCTB4OEY0NSwgMHgxRjlELCAweDg5NDAsIDB4RkE4NywgMHhFRjE1LCAweEIyRUIsIDB4OEVDOSwgMHhGQjBCLAorCTB4NDFFQywgMHhCMzY3LCAweDVGRkQsIDB4NDVFQSwgMHgyM0JGLCAweDUzRjcsIDB4RTQ5NiwgMHg5QjVCLAorCTB4NzVDMiwgMHhFMTFDLCAweDNEQUUsIDB4NEM2QSwgMHg2QzVBLCAweDdFNDEsIDB4RjUwMiwgMHg4MzRGLAorCTB4Njg1QywgMHg1MUY0LCAweEQxMzQsIDB4RjkwOCwgMHhFMjkzLCAweEFCNzMsIDB4NjI1MywgMHgyQTNGLAorCTB4MDgwQywgMHg5NTUyLCAweDQ2NjUsIDB4OUQ1RSwgMHgzMDI4LCAweDM3QTEsIDB4MEEwRiwgMHgyRkI1LAorCTB4MEUwOSwgMHgyNDM2LCAweDFCOUIsIDB4REYzRCwgMHhDRDI2LCAweDRFNjksIDB4N0ZDRCwgMHhFQTlGLAorCTB4MTIxQiwgMHgxRDlFLCAweDU4NzQsIDB4MzQyRSwgMHgzNjJELCAweERDQjIsIDB4QjRFRSwgMHg1QkZCLAorCTB4QTRGNiwgMHg3NjRELCAweEI3NjEsIDB4N0RDRSwgMHg1MjdCLCAweEREM0UsIDB4NUU3MSwgMHgxMzk3LAorCTB4QTZGNSwgMHhCOTY4LCAweDAwMDAsIDB4QzEyQywgMHg0MDYwLCAweEUzMUYsIDB4NzlDOCwgMHhCNkVELAorCTB4RDRCRSwgMHg4RDQ2LCAweDY3RDksIDB4NzI0QiwgMHg5NERFLCAweDk4RDQsIDB4QjBFOCwgMHg4NTRBLAorCTB4QkI2QiwgMHhDNTJBLCAweDRGRTUsIDB4RUQxNiwgMHg4NkM1LCAweDlBRDcsIDB4NjY1NSwgMHgxMTk0LAorCTB4OEFDRiwgMHhFOTEwLCAweDA0MDYsIDB4RkU4MSwgMHhBMEYwLCAweDc4NDQsIDB4MjVCQSwgMHg0QkUzLAorCTB4QTJGMywgMHg1REZFLCAweDgwQzAsIDB4MDU4QSwgMHgzRkFELCAweDIxQkMsIDB4NzA0OCwgMHhGMTA0LAorCTB4NjNERiwgMHg3N0MxLCAweEFGNzUsIDB4NDI2MywgMHgyMDMwLCAweEU1MUEsIDB4RkQwRSwgMHhCRjZELAorCTB4ODE0QywgMHgxODE0LCAweDI2MzUsIDB4QzMyRiwgMHhCRUUxLCAweDM1QTIsIDB4ODhDQywgMHgyRTM5LAorCTB4OTM1NywgMHg1NUYyLCAweEZDODIsIDB4N0E0NywgMHhDOEFDLCAweEJBRTcsIDB4MzIyQiwgMHhFNjk1LAorCTB4QzBBMCwgMHgxOTk4LCAweDlFRDEsIDB4QTM3RiwgMHg0NDY2LCAweDU0N0UsIDB4M0JBQiwgMHgwQjgzLAorCTB4OENDQSwgMHhDNzI5LCAweDZCRDMsIDB4MjgzQywgMHhBNzc5LCAweEJDRTIsIDB4MTYxRCwgMHhBRDc2LAorCTB4REIzQiwgMHg2NDU2LCAweDc0NEUsIDB4MTQxRSwgMHg5MkRCLCAweDBDMEEsIDB4NDg2QywgMHhCOEU0LAorCTB4OUY1RCwgMHhCRDZFLCAweDQzRUYsIDB4QzRBNiwgMHgzOUE4LCAweDMxQTQsIDB4RDMzNywgMHhGMjhCLAorCTB4RDUzMiwgMHg4QjQzLCAweDZFNTksIDB4REFCNywgMHgwMThDLCAweEIxNjQsIDB4OUNEMiwgMHg0OUUwLAorCTB4RDhCNCwgMHhBQ0ZBLCAweEYzMDcsIDB4Q0YyNSwgMHhDQUFGLCAweEY0OEUsIDB4NDdFOSwgMHgxMDE4LAorCTB4NkZENSwgMHhGMDg4LCAweDRBNkYsIDB4NUM3MiwgMHgzODI0LCAweDU3RjEsIDB4NzNDNywgMHg5NzUxLAorCTB4Q0IyMywgMHhBMTdDLCAweEU4OUMsIDB4M0UyMSwgMHg5NkRELCAweDYxREMsIDB4MEQ4NiwgMHgwRjg1LAorCTB4RTA5MCwgMHg3QzQyLCAweDcxQzQsIDB4Q0NBQSwgMHg5MEQ4LCAweDA2MDUsIDB4RjcwMSwgMHgxQzEyLAorCTB4QzJBMywgMHg2QTVGLCAweEFFRjksIDB4NjlEMCwgMHgxNzkxLCAweDk5NTgsIDB4M0EyNywgMHgyN0I5LAorCTB4RDkzOCwgMHhFQjEzLCAweDJCQjMsIDB4MjIzMywgMHhEMkJCLCAweEE5NzAsIDB4MDc4OSwgMHgzM0E3LAorCTB4MkRCNiwgMHgzQzIyLCAweDE1OTIsIDB4QzkyMCwgMHg4NzQ5LCAweEFBRkYsIDB4NTA3OCwgMHhBNTdBLAorCTB4MDM4RiwgMHg1OUY4LCAweDA5ODAsIDB4MUExNywgMHg2NURBLCAweEQ3MzEsIDB4ODRDNiwgMHhEMEI4LAorCTB4ODJDMywgMHgyOUIwLCAweDVBNzcsIDB4MUUxMSwgMHg3QkNCLCAweEE4RkMsIDB4NkRENiwgMHgyQzNBLAorfTsKKworCitzdGF0aWMgaW5saW5lIHUxNiBfU18odTE2IHYpCit7CisJdTE2IHQgPSBTYm94W0hpOCh2KV07CisJcmV0dXJuIFNib3hbTG84KHYpXSBeICgodCA8PCA4KSB8ICh0ID4+IDgpKTsKK30KKworI2lmbmRlZiBKT0hOX1RLSVAKKyNkZWZpbmUgUEhBU0UxX0xPT1BfQ09VTlQgOAorCitzdGF0aWMgdm9pZCB0a2lwX21peGluZ19waGFzZTEodTE2ICpUVEFLLCBjb25zdCB1OCAqVEssIGNvbnN0IHU4ICpUQSwgdTMyIElWMzIpCit7CisJaW50IGksIGo7CisKKwkvKiBJbml0aWFsaXplIHRoZSA4MC1iaXQgVFRBSyBmcm9tIFRTQyAoSVYzMikgYW5kIFRBWzAuLjVdICovCisJVFRBS1swXSA9IExvMTYoSVYzMik7CisJVFRBS1sxXSA9IEhpMTYoSVYzMik7CisJVFRBS1syXSA9IE1rMTYoVEFbMV0sIFRBWzBdKTsKKwlUVEFLWzNdID0gTWsxNihUQVszXSwgVEFbMl0pOworCVRUQUtbNF0gPSBNazE2KFRBWzVdLCBUQVs0XSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgUEhBU0UxX0xPT1BfQ09VTlQ7IGkrKykgeworCQlqID0gMiAqIChpICYgMSk7CisJCVRUQUtbMF0gKz0gX1NfKFRUQUtbNF0gXiBNazE2KFRLWzEgKyBqXSwgVEtbMCArIGpdKSk7CisJCVRUQUtbMV0gKz0gX1NfKFRUQUtbMF0gXiBNazE2KFRLWzUgKyBqXSwgVEtbNCArIGpdKSk7CisJCVRUQUtbMl0gKz0gX1NfKFRUQUtbMV0gXiBNazE2KFRLWzkgKyBqXSwgVEtbOCArIGpdKSk7CisJCVRUQUtbM10gKz0gX1NfKFRUQUtbMl0gXiBNazE2KFRLWzEzICsgal0sIFRLWzEyICsgal0pKTsKKwkJVFRBS1s0XSArPSBfU18oVFRBS1szXSBeIE1rMTYoVEtbMSArIGpdLCBUS1swICsgal0pKSArIGk7CisJfQorfQorCisKK3N0YXRpYyB2b2lkIHRraXBfbWl4aW5nX3BoYXNlMih1OCAqV0VQU2VlZCwgY29uc3QgdTggKlRLLCBjb25zdCB1MTYgKlRUQUssCisJCQkgICAgICAgdTE2IElWMTYpCit7CisJLyogTWFrZSB0ZW1wb3JhcnkgYXJlYSBvdmVybGFwIFdFUCBzZWVkIHNvIHRoYXQgdGhlIGZpbmFsIGNvcHkgY2FuIGJlCisJICogYXZvaWRlZCBvbiBsaXR0bGUgZW5kaWFuIGhvc3RzLiAqLworCXUxNiAqUFBLID0gKHUxNiAqKSAmV0VQU2VlZFs0XTsKKworCS8qIFN0ZXAgMSAtIG1ha2UgY29weSBvZiBUVEFLIGFuZCBicmluZyBpbiBUU0MgKi8KKwlQUEtbMF0gPSBUVEFLWzBdOworCVBQS1sxXSA9IFRUQUtbMV07CisJUFBLWzJdID0gVFRBS1syXTsKKwlQUEtbM10gPSBUVEFLWzNdOworCVBQS1s0XSA9IFRUQUtbNF07CisJUFBLWzVdID0gVFRBS1s0XSArIElWMTY7CisKKwkvKiBTdGVwIDIgLSA5Ni1iaXQgYmlqZWN0aXZlIG1peGluZyB1c2luZyBTLWJveCAqLworCVBQS1swXSArPSBfU18oUFBLWzVdIF4gTWsxNl9sZSgodTE2ICopICZUS1swXSkpOworCVBQS1sxXSArPSBfU18oUFBLWzBdIF4gTWsxNl9sZSgodTE2ICopICZUS1syXSkpOworCVBQS1syXSArPSBfU18oUFBLWzFdIF4gTWsxNl9sZSgodTE2ICopICZUS1s0XSkpOworCVBQS1szXSArPSBfU18oUFBLWzJdIF4gTWsxNl9sZSgodTE2ICopICZUS1s2XSkpOworCVBQS1s0XSArPSBfU18oUFBLWzNdIF4gTWsxNl9sZSgodTE2ICopICZUS1s4XSkpOworCVBQS1s1XSArPSBfU18oUFBLWzRdIF4gTWsxNl9sZSgodTE2ICopICZUS1sxMF0pKTsKKworCVBQS1swXSArPSBSb3RSMShQUEtbNV0gXiBNazE2X2xlKCh1MTYgKikgJlRLWzEyXSkpOworCVBQS1sxXSArPSBSb3RSMShQUEtbMF0gXiBNazE2X2xlKCh1MTYgKikgJlRLWzE0XSkpOworCVBQS1syXSArPSBSb3RSMShQUEtbMV0pOworCVBQS1szXSArPSBSb3RSMShQUEtbMl0pOworCVBQS1s0XSArPSBSb3RSMShQUEtbM10pOworCVBQS1s1XSArPSBSb3RSMShQUEtbNF0pOworCisJLyogU3RlcCAzIC0gYnJpbmcgaW4gbGFzdCBvZiBUSyBiaXRzLCBhc3NpZ24gMjQtYml0IFdFUCBJViB2YWx1ZQorCSAqIFdFUFNlZWRbMC4uMl0gaXMgdHJhbnNtaXR0ZWQgYXMgV0VQIElWICovCisJV0VQU2VlZFswXSA9IEhpOChJVjE2KTsKKwlXRVBTZWVkWzFdID0gKEhpOChJVjE2KSB8IDB4MjApICYgMHg3RjsKKwlXRVBTZWVkWzJdID0gTG84KElWMTYpOworCVdFUFNlZWRbM10gPSBMbzgoKFBQS1s1XSBeIE1rMTZfbGUoKHUxNiAqKSAmVEtbMF0pKSA+PiAxKTsKKworI2lmZGVmIF9fQklHX0VORElBTgorCXsKKwkJaW50IGk7CisJCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCQlQUEtbaV0gPSAoUFBLW2ldIDw8IDgpIHwgKFBQS1tpXSA+PiA4KTsKKwl9CisjZW5kaWYKK30KKyNlbmRpZgorc3RhdGljIGludCBpZWVlODAyMTFfdGtpcF9lbmNyeXB0KHN0cnVjdCBza19idWZmICpza2IsIGludCBoZHJfbGVuLCB2b2lkICpwcml2KQoreworICAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3RraXBfZGF0YSAqdGtleSA9IHByaXY7CisgICAgICAgICNpZigoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwyMSkpfHwoSU5fT1BFTlNVU0VfU0xFRCkpCisgICAgICAgIHN0cnVjdCBibGtjaXBoZXJfZGVzYyBkZXNjID0gey50Zm0gPSB0a2V5LT50eF90Zm1fYXJjNH07CisgICAgICAgICNlbmRpZgorCWludCBsZW47CisJdTggICpwb3M7CisJc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkcjsKKyNpZm5kZWYgSk9ITl9US0lQCisJdTggcmM0a2V5WzE2XSwqaWN2OworCXUzMiBjcmM7CisJc3RydWN0IHNjYXR0ZXJsaXN0IHNnOworI2VuZGlmCisJaW50IHJldDsKKworCXJldCA9IDA7CisJaWYgKHNrYl9oZWFkcm9vbShza2IpIDwgOCB8fCBza2JfdGFpbHJvb20oc2tiKSA8IDQgfHwKKwkgICAgc2tiLT5sZW4gPCBoZHJfbGVuKQorCQlyZXR1cm4gLTE7CisKKwloZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKikgc2tiLT5kYXRhOworI2lmIDAKK3ByaW50aygiQEAgdGtleVxuIik7CitwcmludGsoIiV4fCIsICgodTMyKil0a2V5LT5rZXkpWzBdKTsKK3ByaW50aygiJXh8IiwgKCh1MzIqKXRrZXktPmtleSlbMV0pOworcHJpbnRrKCIleHwiLCAoKHUzMiopdGtleS0+a2V5KVsyXSk7CitwcmludGsoIiV4fCIsICgodTMyKil0a2V5LT5rZXkpWzNdKTsKK3ByaW50aygiJXh8IiwgKCh1MzIqKXRrZXktPmtleSlbNF0pOworcHJpbnRrKCIleHwiLCAoKHUzMiopdGtleS0+a2V5KVs1XSk7CitwcmludGsoIiV4fCIsICgodTMyKil0a2V5LT5rZXkpWzZdKTsKK3ByaW50aygiJXhcbiIsICgodTMyKil0a2V5LT5rZXkpWzddKTsKKyNlbmRpZgorCisjaWZuZGVmIEpPSE5fVEtJUAorCWlmICghdGtleS0+dHhfcGhhc2UxX2RvbmUpIHsKKwkJdGtpcF9taXhpbmdfcGhhc2UxKHRrZXktPnR4X3R0YWssIHRrZXktPmtleSwgaGRyLT5hZGRyMiwKKwkJCQkgICB0a2V5LT50eF9pdjMyKTsKKwkJdGtleS0+dHhfcGhhc2UxX2RvbmUgPSAxOworCX0KKwl0a2lwX21peGluZ19waGFzZTIocmM0a2V5LCB0a2V5LT5rZXksIHRrZXktPnR4X3R0YWssIHRrZXktPnR4X2l2MTYpOworCisjZWxzZQorCXRrZXktPnR4X3BoYXNlMV9kb25lID0gMTsKKyNlbmRpZiAgLypKT0hOX1RLSVAqLworCisJbGVuID0gc2tiLT5sZW4gLSBoZHJfbGVuOworCXBvcyA9IHNrYl9wdXNoKHNrYiwgOCk7CisJbWVtbW92ZShwb3MsIHBvcyArIDgsIGhkcl9sZW4pOworCXBvcyArPSBoZHJfbGVuOworCisjaWZkZWYgSk9ITl9US0lQCisJKnBvcysrID0gSGk4KHRrZXktPnR4X2l2MTYpOworCSpwb3MrKyA9IChIaTgodGtleS0+dHhfaXYxNikgfCAweDIwKSAmIDB4N0Y7CisJKnBvcysrID0gTG84KHRrZXktPnR4X2l2MTYpOworI2Vsc2UKKwkqcG9zKysgPSByYzRrZXlbMF07CisJKnBvcysrID0gcmM0a2V5WzFdOworCSpwb3MrKyA9IHJjNGtleVsyXTsKKyNlbmRpZgorCSpwb3MrKyA9ICh0a2V5LT5rZXlfaWR4IDw8IDYpIHwgKDEgPDwgNSkgLyogRXh0IElWIGluY2x1ZGVkICovOworCSpwb3MrKyA9IHRrZXktPnR4X2l2MzIgJiAweGZmOworCSpwb3MrKyA9ICh0a2V5LT50eF9pdjMyID4+IDgpICYgMHhmZjsKKwkqcG9zKysgPSAodGtleS0+dHhfaXYzMiA+PiAxNikgJiAweGZmOworCSpwb3MrKyA9ICh0a2V5LT50eF9pdjMyID4+IDI0KSAmIDB4ZmY7CisjaWZuZGVmIEpPSE5fVEtJUAorCWljdiA9IHNrYl9wdXQoc2tiLCA0KTsKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw1LDApKQorCWNyYyA9IH5jcmMzMl9sZSh+MCwgcG9zLCBsZW4pOworI2Vsc2UKKwljcmMgPSB+ZXRoZXJfY3JjX2xlKGxlbiwgcG9zKTsKKyNlbmRpZgorCWljdlswXSA9IGNyYzsKKwlpY3ZbMV0gPSBjcmMgPj4gODsKKwlpY3ZbMl0gPSBjcmMgPj4gMTY7CisJaWN2WzNdID0gY3JjID4+IDI0OworICAgICAgI2lmKChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMjEpKSYmKCFJTl9PUEVOU1VTRV9TTEVEKSkKKwljcnlwdG9fY2lwaGVyX3NldGtleSh0a2V5LT50Zm1fYXJjNCwgcmM0a2V5LCAxNik7CisJc2cucGFnZSA9IHZpcnRfdG9fcGFnZShwb3MpOworCXNnLm9mZnNldCA9IG9mZnNldF9pbl9wYWdlKHBvcyk7CisJc2cubGVuZ3RoID0gbGVuICsgNDsKKwljcnlwdG9fY2lwaGVyX2VuY3J5cHQodGtleS0+dGZtX2FyYzQsICZzZywgJnNnLCBsZW4gKyA0KTsKKyAgICAgICNlbHNlCisJY3J5cHRvX2Jsa2NpcGhlcl9zZXRrZXkodGtleS0+dHhfdGZtX2FyYzQsIHJjNGtleSwgMTYpOworICAgICAgICAjaWYoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDI0KSkKKyAgICAgICAgICBzZy5wYWdlID0gdmlydF90b19wYWdlKHBvcyk7CisgICAgICAgICAgc2cub2Zmc2V0ID0gb2Zmc2V0X2luX3BhZ2UocG9zKTsKKyAgICAgICAgICBzZy5sZW5ndGggPSBsZW4gKyA0OworICAgICAgICAjZWxzZQorICAgICAgICAgIHNnX2luaXRfb25lKCZzZywgcG9zLCBsZW4rNCk7CisgICAgICAgICNlbmRpZgorCXJldD0gY3J5cHRvX2Jsa2NpcGhlcl9lbmNyeXB0KCZkZXNjLCAmc2csICZzZywgbGVuICsgNCk7CisgICAgICAjZW5kaWYKKyNlbmRpZgorCXRrZXktPnR4X2l2MTYrKzsKKwlpZiAodGtleS0+dHhfaXYxNiA9PSAwKSB7CisJCXRrZXktPnR4X3BoYXNlMV9kb25lID0gMDsKKwkJdGtleS0+dHhfaXYzMisrOworCX0KKyNpZm5kZWYgSk9ITl9US0lQCisgICAgICAjaWYoKExJTlVYX1ZFUlNJT05fQ09ERSA8S0VSTkVMX1ZFUlNJT04oMiw2LDIxKSkmJighSU5fT1BFTlNVU0VfU0xFRCkpCisJICAgcmV0dXJuIDA7CisgICAgICAjZWxzZQorCSAgIHJldHVybiByZXQ7CisgICAgICAjZW5kaWYKKyNlbHNlCisJcmV0dXJuIDA7CisjZW5kaWYKK30KKworc3RhdGljIGludCBpZWVlODAyMTFfdGtpcF9kZWNyeXB0KHN0cnVjdCBza19idWZmICpza2IsIGludCBoZHJfbGVuLCB2b2lkICpwcml2KQoreworICAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3RraXBfZGF0YSAqdGtleSA9IHByaXY7CisgICAgICAgICNpZigoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwyMSkpIHx8KElOX09QRU5TVVNFX1NMRUQpKQorICAgICAgICBzdHJ1Y3QgYmxrY2lwaGVyX2Rlc2MgZGVzYyA9IHsudGZtID0gdGtleS0+cnhfdGZtX2FyYzR9OworICAgICAgICAjZW5kaWYKKwl1OCBrZXlpZHgsICpwb3M7CisJdTMyIGl2MzI7CisJdTE2IGl2MTY7CisJc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkcjsKKyNpZm5kZWYgSk9ITl9US0lQCisJdTggaWN2WzRdOworCXUzMiBjcmM7CisJc3RydWN0IHNjYXR0ZXJsaXN0IHNnOworCXU4IHJjNGtleVsxNl07CisJaW50IHBsZW47CisjZW5kaWYKKwlpZiAoc2tiLT5sZW4gPCBoZHJfbGVuICsgOCArIDQpCisJCXJldHVybiAtMTsKKworCWhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKSBza2ItPmRhdGE7CisJcG9zID0gc2tiLT5kYXRhICsgaGRyX2xlbjsKKwlrZXlpZHggPSBwb3NbM107CisJaWYgKCEoa2V5aWR4ICYgKDEgPDwgNSkpKSB7CisJCWlmIChuZXRfcmF0ZWxpbWl0KCkpIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHICJUS0lQOiByZWNlaXZlZCBwYWNrZXQgd2l0aG91dCBFeHRJViIKKwkJCSAgICAgICAiIGZsYWcgZnJvbSAiIE1BQ19GTVQgIlxuIiwgTUFDX0FSRyhoZHItPmFkZHIyKSk7CisJCX0KKwkJcmV0dXJuIC0yOworCX0KKwlrZXlpZHggPj49IDY7CisJaWYgKHRrZXktPmtleV9pZHggIT0ga2V5aWR4KSB7CisJCXByaW50ayhLRVJOX0RFQlVHICJUS0lQOiBSWCB0a2V5LT5rZXlfaWR4PSVkIGZyYW1lICIKKwkJICAgICAgICJrZXlpZHg9JWQgcHJpdj0lcFxuIiwgdGtleS0+a2V5X2lkeCwga2V5aWR4LCBwcml2KTsKKwkJcmV0dXJuIC02OworCX0KKwlpZiAoIXRrZXktPmtleV9zZXQpIHsKKwkJaWYgKG5ldF9yYXRlbGltaXQoKSkgeworCQkJcHJpbnRrKEtFUk5fREVCVUcgIlRLSVA6IHJlY2VpdmVkIHBhY2tldCBmcm9tICIgTUFDX0ZNVAorCQkJICAgICAgICIgd2l0aCBrZXlpZD0lZCB0aGF0IGRvZXMgbm90IGhhdmUgYSBjb25maWd1cmVkIgorCQkJICAgICAgICIga2V5XG4iLCBNQUNfQVJHKGhkci0+YWRkcjIpLCBrZXlpZHgpOworCQl9CisJCXJldHVybiAtMzsKKwl9CisJaXYxNiA9IChwb3NbMF0gPDwgOCkgfCBwb3NbMl07CisJaXYzMiA9IHBvc1s0XSB8IChwb3NbNV0gPDwgOCkgfCAocG9zWzZdIDw8IDE2KSB8IChwb3NbN10gPDwgMjQpOworCXBvcyArPSA4OworI2lmbmRlZiBKT0hOX1RLSVAKKworCWlmIChpdjMyIDwgdGtleS0+cnhfaXYzMiB8fAorCSAgICAoaXYzMiA9PSB0a2V5LT5yeF9pdjMyICYmIGl2MTYgPD0gdGtleS0+cnhfaXYxNikpIHsKKwkJaWYgKG5ldF9yYXRlbGltaXQoKSkgeworCQkJcHJpbnRrKEtFUk5fREVCVUcgIlRLSVA6IHJlcGxheSBkZXRlY3RlZDogU1RBPSIgTUFDX0ZNVAorCQkJICAgICAgICIgcHJldmlvdXMgVFNDICUwOHglMDR4IHJlY2VpdmVkIFRTQyAiCisJCQkgICAgICAgIiUwOHglMDR4XG4iLCBNQUNfQVJHKGhkci0+YWRkcjIpLAorCQkJICAgICAgIHRrZXktPnJ4X2l2MzIsIHRrZXktPnJ4X2l2MTYsIGl2MzIsIGl2MTYpOworCQl9CisJCXRrZXktPmRvdDExUlNOQVN0YXRzVEtJUFJlcGxheXMrKzsKKwkJcmV0dXJuIC00OworCX0KKworCWlmIChpdjMyICE9IHRrZXktPnJ4X2l2MzIgfHwgIXRrZXktPnJ4X3BoYXNlMV9kb25lKSB7CisJCXRraXBfbWl4aW5nX3BoYXNlMSh0a2V5LT5yeF90dGFrLCB0a2V5LT5rZXksIGhkci0+YWRkcjIsIGl2MzIpOworCQl0a2V5LT5yeF9waGFzZTFfZG9uZSA9IDE7CisJfQorCXRraXBfbWl4aW5nX3BoYXNlMihyYzRrZXksIHRrZXktPmtleSwgdGtleS0+cnhfdHRhaywgaXYxNik7CisKKwlwbGVuID0gc2tiLT5sZW4gLSBoZHJfbGVuIC0gMTI7CisgICAgICAgI2lmKChMSU5VWF9WRVJTSU9OX0NPREUgPEtFUk5FTF9WRVJTSU9OKDIsNiwyMSkpJiYoIUlOX09QRU5TVVNFX1NMRUQpKQorCWNyeXB0b19jaXBoZXJfc2V0a2V5KHRrZXktPnRmbV9hcmM0LCByYzRrZXksIDE2KTsKKwlzZy5wYWdlID0gdmlydF90b19wYWdlKHBvcyk7CisJc2cub2Zmc2V0ID0gb2Zmc2V0X2luX3BhZ2UocG9zKTsKKwlzZy5sZW5ndGggPSBwbGVuICsgNDsKKwljcnlwdG9fY2lwaGVyX2RlY3J5cHQodGtleS0+dGZtX2FyYzQsICZzZywgJnNnLCBwbGVuICsgNCk7CisJI2Vsc2UKKwljcnlwdG9fYmxrY2lwaGVyX3NldGtleSh0a2V5LT5yeF90Zm1fYXJjNCwgcmM0a2V5LCAxNik7CisgICAgICAgICNpZihMSU5VWF9WRVJTSU9OX0NPREUgPEtFUk5FTF9WRVJTSU9OKDIsNiwyNCkpCisgICAgICAgICAgc2cucGFnZSA9IHZpcnRfdG9fcGFnZShwb3MpOworICAgICAgICAgIHNnLm9mZnNldCA9IG9mZnNldF9pbl9wYWdlKHBvcyk7CisgICAgICAgICAgc2cubGVuZ3RoID0gcGxlbiArIDQ7CisgICAgICAgICNlbHNlCisgICAgICAgICAgc2dfaW5pdF9vbmUoJnNnLCBwb3MsIHBsZW4rNCk7CisgICAgICAgICNlbmRpZgorCWlmIChjcnlwdG9fYmxrY2lwaGVyX2RlY3J5cHQoJmRlc2MsICZzZywgJnNnLCBwbGVuICsgNCkpIHsKKwkJaWYgKG5ldF9yYXRlbGltaXQoKSkgeworCQkJcHJpbnRrKEtFUk5fREVCVUcgIjogVEtJUDogZmFpbGVkIHRvIGRlY3J5cHQgIgorCQkJICAgICAgICJyZWNlaXZlZCBwYWNrZXQgZnJvbSAiIE1BQ19GTVQgIlxuIiwKKwkJCSAgICAgICBNQUNfQVJHKGhkci0+YWRkcjIpKTsKKwkJfQorCQlyZXR1cm4gLTc7CisJfQorCSNlbmRpZgorCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNSwwKSkKKwljcmMgPSB+Y3JjMzJfbGUofjAsIHBvcywgcGxlbik7CisjZWxzZQorCWNyYyA9IH5ldGhlcl9jcmNfbGUocGxlbiwgcG9zKTsKKyNlbmRpZgorCWljdlswXSA9IGNyYzsKKwlpY3ZbMV0gPSBjcmMgPj4gODsKKwlpY3ZbMl0gPSBjcmMgPj4gMTY7CisJaWN2WzNdID0gY3JjID4+IDI0OworCWlmIChtZW1jbXAoaWN2LCBwb3MgKyBwbGVuLCA0KSAhPSAwKSB7CisJCWlmIChpdjMyICE9IHRrZXktPnJ4X2l2MzIpIHsKKwkJCS8qIFByZXZpb3VzbHkgY2FjaGVkIFBoYXNlMSByZXN1bHQgd2FzIGFscmVhZHkgbG9zdCwgc28KKwkJCSAqIGl0IG5lZWRzIHRvIGJlIHJlY2FsY3VsYXRlZCBmb3IgdGhlIG5leHQgcGFja2V0LiAqLworCQkJdGtleS0+cnhfcGhhc2UxX2RvbmUgPSAwOworCQl9CisJCWlmIChuZXRfcmF0ZWxpbWl0KCkpIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHICJUS0lQOiBJQ1YgZXJyb3IgZGV0ZWN0ZWQ6IFNUQT0iCisJCQkgICAgICAgTUFDX0ZNVCAiXG4iLCBNQUNfQVJHKGhkci0+YWRkcjIpKTsKKwkJfQorCQl0a2V5LT5kb3QxMVJTTkFTdGF0c1RLSVBJQ1ZFcnJvcnMrKzsKKwkJcmV0dXJuIC01OworCX0KKworI2VuZGlmIAkvKiBKT0hOX1RLSVAgKi8KKworCS8qIFVwZGF0ZSByZWFsIGNvdW50ZXJzIG9ubHkgYWZ0ZXIgTWljaGFlbCBNSUMgdmVyaWZpY2F0aW9uIGhhcworCSAqIGNvbXBsZXRlZCAqLworCXRrZXktPnJ4X2l2MzJfbmV3ID0gaXYzMjsKKwl0a2V5LT5yeF9pdjE2X25ldyA9IGl2MTY7CisKKwkvKiBSZW1vdmUgSVYgYW5kIElDViAqLworCW1lbW1vdmUoc2tiLT5kYXRhICsgOCwgc2tiLT5kYXRhLCBoZHJfbGVuKTsKKwlza2JfcHVsbChza2IsIDgpOworCXNrYl90cmltKHNrYiwgc2tiLT5sZW4gLSA0KTsKKworLy9qb2huJ3MgdGVzdAorI2lmZGVmIEpPSE5fRFVNUAoraWYoICgodTE2Kilza2ItPmRhdGEpWzBdICYgMHg0MDAwKXsKKyAgICAgICAgcHJpbnRrKCJAQCByeCBkZWNyeXB0ZWQgc2tiLT5kYXRhIik7CisgICAgICAgIGludCBpOworICAgICAgICBmb3IoaT0wO2k8c2tiLT5sZW47aSsrKXsKKyAgICAgICAgICAgICAgICBpZiggKGklMjQpPT0wICkgcHJpbnRrKCJcbiIpOworICAgICAgICAgICAgICAgIHByaW50aygiJTJ4ICIsICgodTgqKXNrYi0+ZGF0YSlbaV0pOworICAgICAgICB9CisgICAgICAgIHByaW50aygiXG4iKTsKK30KKyNlbmRpZiAvKkpPSE5fRFVNUCovCisJcmV0dXJuIGtleWlkeDsKK30KKworI2lmKChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMjEpKSAmJiAoIUlOX09QRU5TVVNFX1NMRUQpKQorc3RhdGljIGludCBtaWNoYWVsX21pYyhzdHJ1Y3QgaWVlZTgwMjExX3RraXBfZGF0YSAqdGtleSwgdTggKmtleSwgdTggKmhkciwKKwkJICAgICAgIHU4ICpkYXRhLCBzaXplX3QgZGF0YV9sZW4sIHU4ICptaWMpCit7CisJc3RydWN0IHNjYXR0ZXJsaXN0IHNnWzJdOworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMjApCisJc3RydWN0IGhhc2hfZGVzYyBkZXNjOworCWludCByZXQ9MDsKKyNlbmRpZgorCWlmICh0a2V5LT50Zm1fbWljaGFlbCA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIm1pY2hhZWxfbWljOiB0Zm1fbWljaGFlbCA9PSBOVUxMXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKwlzZ1swXS5wYWdlID0gdmlydF90b19wYWdlKGhkcik7CisJc2dbMF0ub2Zmc2V0ID0gb2Zmc2V0X2luX3BhZ2UoaGRyKTsKKwlzZ1swXS5sZW5ndGggPSAxNjsKKworCXNnWzFdLnBhZ2UgPSB2aXJ0X3RvX3BhZ2UoZGF0YSk7CisJc2dbMV0ub2Zmc2V0ID0gb2Zmc2V0X2luX3BhZ2UoZGF0YSk7CisJc2dbMV0ubGVuZ3RoID0gZGF0YV9sZW47CisKKwkvL2NyeXB0b19kaWdlc3RfaW5pdCh0a2V5LT50Zm1fbWljaGFlbCk7CisJLy9jcnlwdG9fZGlnZXN0X3NldGtleSh0a2V5LT50Zm1fbWljaGFlbCwga2V5LCA4KTsKKwkvL2NyeXB0b19kaWdlc3RfdXBkYXRlKHRrZXktPnRmbV9taWNoYWVsLCBzZywgMik7CisJLy9jcnlwdG9fZGlnZXN0X2ZpbmFsKHRrZXktPnRmbV9taWNoYWVsLCBtaWMpOworCisJLy9yZXR1cm4gMDsKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMjApCisJY3J5cHRvX2RpZ2VzdF9pbml0KHRrZXktPnRmbV9taWNoYWVsKTsKKwljcnlwdG9fZGlnZXN0X3NldGtleSh0a2V5LT50Zm1fbWljaGFlbCwga2V5LCA4KTsKKwljcnlwdG9fZGlnZXN0X3VwZGF0ZSh0a2V5LT50Zm1fbWljaGFlbCwgc2csIDIpOworCWNyeXB0b19kaWdlc3RfZmluYWwodGtleS0+dGZtX21pY2hhZWwsIG1pYyk7CisKKwlyZXR1cm4gMDsKKyNlbHNlCitpZiAoY3J5cHRvX2hhc2hfc2V0a2V5KHRrZXktPnRmbV9taWNoYWVsLCBrZXksIDgpKQorCQlyZXR1cm4gLTE7CisKKy8vCXJldHVybiAwOworCWRlc2MudGZtID0gdGtleS0+dGZtX21pY2hhZWw7CisJZGVzYy5mbGFncyA9IDA7CisJcmV0ID0gY3J5cHRvX2hhc2hfZGlnZXN0KCZkZXNjLCBzZywgZGF0YV9sZW4gKyAxNiwgbWljKTsKKwlyZXR1cm4gcmV0OworI2VuZGlmCit9CisjZWxzZQorc3RhdGljIGludCBtaWNoYWVsX21pYyhzdHJ1Y3QgY3J5cHRvX2hhc2ggKnRmbV9taWNoYWVsLCB1OCAqIGtleSwgdTggKiBoZHIsCisgICAgICAgICAgICAgICAgICAgICAgIHU4ICogZGF0YSwgc2l6ZV90IGRhdGFfbGVuLCB1OCAqIG1pYykKK3sKKyAgICAgICAgc3RydWN0IGhhc2hfZGVzYyBkZXNjOworICAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3Qgc2dbMl07CisKKyAgICAgICAgaWYgKHRmbV9taWNoYWVsID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9XQVJOSU5HICJtaWNoYWVsX21pYzogdGZtX21pY2hhZWwgPT0gTlVMTFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgICNpZihMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMjQpKQorICAgICAgICAgIHNnWzBdLnBhZ2UgPSB2aXJ0X3RvX3BhZ2UoaGRyKTsKKyAgICAgICAgICBzZ1swXS5vZmZzZXQgPSBvZmZzZXRfaW5fcGFnZShoZHIpOworICAgICAgICAgIHNnWzBdLmxlbmd0aCA9IDE2OworICAgICAgICAgIHNnWzFdLnBhZ2UgPSB2aXJ0X3RvX3BhZ2UoZGF0YSk7CisgICAgICAgICAgc2dbMV0ub2Zmc2V0ID0gb2Zmc2V0X2luX3BhZ2UoZGF0YSk7CisgICAgICAgICAgc2dbMV0ubGVuZ3RoID0gZGF0YV9sZW47CisgICAgICAgICNlbHNlCisgICAgICAgICAgc2dfaW5pdF90YWJsZShzZywgMik7CisgICAgICAgICAgc2dfc2V0X2J1Zigmc2dbMF0sIGhkciwgMTYpOworICAgICAgICAgIHNnX3NldF9idWYoJnNnWzFdLCBkYXRhLCBkYXRhX2xlbik7CisgICAgICAgICNlbmRpZgorCisgICAgICAgIGlmIChjcnlwdG9faGFzaF9zZXRrZXkodGZtX21pY2hhZWwsIGtleSwgOCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworCisgICAgICAgIGRlc2MudGZtID0gdGZtX21pY2hhZWw7CisgICAgICAgIGRlc2MuZmxhZ3MgPSAwOworICAgICAgICByZXR1cm4gY3J5cHRvX2hhc2hfZGlnZXN0KCZkZXNjLCBzZywgZGF0YV9sZW4gKyAxNiwgbWljKTsKK30KKyNlbmRpZgorCisKKworc3RhdGljIHZvaWQgbWljaGFlbF9taWNfaGRyKHN0cnVjdCBza19idWZmICpza2IsIHU4ICpoZHIpCit7CisJc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkcjExOworCisJaGRyMTEgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKikgc2tiLT5kYXRhOworCXN3aXRjaCAobGUxNl90b19jcHUoaGRyMTEtPmZyYW1lX2N0bCkgJgorCQkoSUVFRTgwMjExX0ZDVExfRlJPTURTIHwgSUVFRTgwMjExX0ZDVExfVE9EUykpIHsKKwljYXNlIElFRUU4MDIxMV9GQ1RMX1RPRFM6CisJCW1lbWNweShoZHIsIGhkcjExLT5hZGRyMywgRVRIX0FMRU4pOyAvKiBEQSAqLworCQltZW1jcHkoaGRyICsgRVRIX0FMRU4sIGhkcjExLT5hZGRyMiwgRVRIX0FMRU4pOyAvKiBTQSAqLworCQlicmVhazsKKwljYXNlIElFRUU4MDIxMV9GQ1RMX0ZST01EUzoKKwkJbWVtY3B5KGhkciwgaGRyMTEtPmFkZHIxLCBFVEhfQUxFTik7IC8qIERBICovCisJCW1lbWNweShoZHIgKyBFVEhfQUxFTiwgaGRyMTEtPmFkZHIzLCBFVEhfQUxFTik7IC8qIFNBICovCisJCWJyZWFrOworCWNhc2UgSUVFRTgwMjExX0ZDVExfRlJPTURTIHwgSUVFRTgwMjExX0ZDVExfVE9EUzoKKwkJbWVtY3B5KGhkciwgaGRyMTEtPmFkZHIzLCBFVEhfQUxFTik7IC8qIERBICovCisJCW1lbWNweShoZHIgKyBFVEhfQUxFTiwgaGRyMTEtPmFkZHI0LCBFVEhfQUxFTik7IC8qIFNBICovCisJCWJyZWFrOworCWNhc2UgMDoKKwkJbWVtY3B5KGhkciwgaGRyMTEtPmFkZHIxLCBFVEhfQUxFTik7IC8qIERBICovCisJCW1lbWNweShoZHIgKyBFVEhfQUxFTiwgaGRyMTEtPmFkZHIyLCBFVEhfQUxFTik7IC8qIFNBICovCisJCWJyZWFrOworCX0KKworCWhkclsxMl0gPSAwOyAvKiBwcmlvcml0eSAqLworCisJaGRyWzEzXSA9IGhkclsxNF0gPSBoZHJbMTVdID0gMDsgLyogcmVzZXJ2ZWQgKi8KK30KKworCitzdGF0aWMgaW50IGllZWU4MDIxMV9taWNoYWVsX21pY19hZGQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGhkcl9sZW4sIHZvaWQgKnByaXYpCit7CisJc3RydWN0IGllZWU4MDIxMV90a2lwX2RhdGEgKnRrZXkgPSBwcml2OworCXU4ICpwb3M7CisJc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkcjsKKworCWhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKSBza2ItPmRhdGE7CisKKwlpZiAoc2tiX3RhaWxyb29tKHNrYikgPCA4IHx8IHNrYi0+bGVuIDwgaGRyX2xlbikgeworCQlwcmludGsoS0VSTl9ERUJVRyAiSW52YWxpZCBwYWNrZXQgZm9yIE1pY2hhZWwgTUlDIGFkZCAiCisJCSAgICAgICAiKHRhaWxyb29tPSVkIGhkcl9sZW49JWQgc2tiLT5sZW49JWQpXG4iLAorCQkgICAgICAgc2tiX3RhaWxyb29tKHNrYiksIGhkcl9sZW4sIHNrYi0+bGVuKTsKKwkJcmV0dXJuIC0xOworCX0KKworCW1pY2hhZWxfbWljX2hkcihza2IsIHRrZXktPnR4X2hkcik7CisKKwkvLyB7IGRhdmlkLCAyMDA2LjkuMQorCS8vIGZpeCB0aGUgd3BhIHByb2Nlc3Mgd2l0aCB3bW0gZW5hYmxlZC4KKwlpZihJRUVFODAyMTFfUU9TX0hBU19TRVEobGUxNl90b19jcHUoaGRyLT5mcmFtZV9jdGwpKSkgeworCQl0a2V5LT50eF9oZHJbMTJdID0gKihza2ItPmRhdGEgKyBoZHJfbGVuIC0gMikgJiAweDA3OworCX0KKwkvLyB9CisJcG9zID0gc2tiX3B1dChza2IsIDgpOworICAgICAgICAjaWYoKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwyMSkpJiYoIUlOX09QRU5TVVNFX1NMRUQpKQorCWlmIChtaWNoYWVsX21pYyh0a2V5LCAmdGtleS0+a2V5WzE2XSwgdGtleS0+dHhfaGRyLAorCQkJc2tiLT5kYXRhICsgaGRyX2xlbiwgc2tiLT5sZW4gLSA4IC0gaGRyX2xlbiwgcG9zKSkKKyAgICAgICAgI2Vsc2UKKyAgICAgICAgaWYgKG1pY2hhZWxfbWljKHRrZXktPnR4X3RmbV9taWNoYWVsLCAmdGtleS0+a2V5WzE2XSwgdGtleS0+dHhfaGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgc2tiLT5kYXRhICsgaGRyX2xlbiwgc2tiLT5sZW4gLSA4IC0gaGRyX2xlbiwgcG9zKSkKKyAgICAgICAgI2VuZGlmCisJCXJldHVybiAtMTsKKworCXJldHVybiAwOworfQorCisKKyNpZiBXSVJFTEVTU19FWFQgPj0gMTgKK3N0YXRpYyB2b2lkIGllZWU4MDIxMV9taWNoYWVsX21pY19mYWlsdXJlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIsCisJCQkJICAgICAgIGludCBrZXlpZHgpCit7CisJdW5pb24gaXdyZXFfZGF0YSB3cnF1OworCXN0cnVjdCBpd19taWNoYWVsbWljZmFpbHVyZSBldjsKKworCS8qIFRPRE86IG5lZWRlZCBwYXJhbWV0ZXJzOiBjb3VudCwga2V5aWQsIGtleSB0eXBlLCBUU0MgKi8KKwltZW1zZXQoJmV2LCAwLCBzaXplb2YoZXYpKTsKKwlldi5mbGFncyA9IGtleWlkeCAmIElXX01JQ0ZBSUxVUkVfS0VZX0lEOworCWlmIChoZHItPmFkZHIxWzBdICYgMHgwMSkKKwkJZXYuZmxhZ3MgfD0gSVdfTUlDRkFJTFVSRV9HUk9VUDsKKwllbHNlCisJCWV2LmZsYWdzIHw9IElXX01JQ0ZBSUxVUkVfUEFJUldJU0U7CisJZXYuc3JjX2FkZHIuc2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOworCW1lbWNweShldi5zcmNfYWRkci5zYV9kYXRhLCBoZHItPmFkZHIyLCBFVEhfQUxFTik7CisJbWVtc2V0KCZ3cnF1LCAwLCBzaXplb2Yod3JxdSkpOworCXdycXUuZGF0YS5sZW5ndGggPSBzaXplb2YoZXYpOworCXdpcmVsZXNzX3NlbmRfZXZlbnQoZGV2LCBJV0VWTUlDSEFFTE1JQ0ZBSUxVUkUsICZ3cnF1LCAoY2hhciAqKSAmZXYpOworfQorI2VsaWYgV0lSRUxFU1NfRVhUID49IDE1CitzdGF0aWMgdm9pZCBpZWVlODAyMTFfbWljaGFlbF9taWNfZmFpbHVyZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyLAorCQkJCSAgICAgICBpbnQga2V5aWR4KQoreworCXVuaW9uIGl3cmVxX2RhdGEgd3JxdTsKKwljaGFyIGJ1ZlsxMjhdOworCisJLyogVE9ETzogbmVlZGVkIHBhcmFtZXRlcnM6IGNvdW50LCBrZXlpZCwga2V5IHR5cGUsIFRTQyAqLworCXNwcmludGYoYnVmLCAiTUxNRS1NSUNIQUVMTUlDRkFJTFVSRS5pbmRpY2F0aW9uKGtleWlkPSVkICVzY2FzdCBhZGRyPSIKKwkJTUFDX0ZNVCAiKSIsIGtleWlkeCwgaGRyLT5hZGRyMVswXSAmIDB4MDEgPyAiYnJvYWQiIDogInVuaSIsCisJCU1BQ19BUkcoaGRyLT5hZGRyMikpOworCW1lbXNldCgmd3JxdSwgMCwgc2l6ZW9mKHdycXUpKTsKKwl3cnF1LmRhdGEubGVuZ3RoID0gc3RybGVuKGJ1Zik7CisJd2lyZWxlc3Nfc2VuZF9ldmVudChkZXYsIElXRVZDVVNUT00sICZ3cnF1LCBidWYpOworfQorI2Vsc2UgLyogV0lSRUxFU1NfRVhUID49IDE1ICovCitzdGF0aWMgaW5saW5lIHZvaWQgaWVlZTgwMjExX21pY2hhZWxfbWljX2ZhaWx1cmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkJICAgICAgc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkciwKKwkJCQkJICAgICAgaW50IGtleWlkeCkKK3sKK30KKyNlbmRpZiAvKiBXSVJFTEVTU19FWFQgPj0gMTUgKi8KKworCitzdGF0aWMgaW50IGllZWU4MDIxMV9taWNoYWVsX21pY192ZXJpZnkoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGtleWlkeCwKKwkJCQkgICAgIGludCBoZHJfbGVuLCB2b2lkICpwcml2KQoreworCXN0cnVjdCBpZWVlODAyMTFfdGtpcF9kYXRhICp0a2V5ID0gcHJpdjsKKwl1OCBtaWNbOF07CisJc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkcjsKKworCWhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKSBza2ItPmRhdGE7CisKKwlpZiAoIXRrZXktPmtleV9zZXQpCisJCXJldHVybiAtMTsKKworCW1pY2hhZWxfbWljX2hkcihza2IsIHRrZXktPnJ4X2hkcik7CisJLy8geyBkYXZpZCwgMjAwNi45LjEKKwkvLyBmaXggdGhlIHdwYSBwcm9jZXNzIHdpdGggd21tIGVuYWJsZWQuCisJaWYoSUVFRTgwMjExX1FPU19IQVNfU0VRKGxlMTZfdG9fY3B1KGhkci0+ZnJhbWVfY3RsKSkpIHsKKwkJdGtleS0+cnhfaGRyWzEyXSA9ICooc2tiLT5kYXRhICsgaGRyX2xlbiAtIDIpICYgMHgwNzsKKwl9CisJLy8gfQorICAgICAgICAjaWYoKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwyMSkpJiYoIUlOX09QRU5TVVNFX1NMRUQpKQorCWlmIChtaWNoYWVsX21pYyh0a2V5LCAmdGtleS0+a2V5WzI0XSwgdGtleS0+cnhfaGRyLAorCQkJc2tiLT5kYXRhICsgaGRyX2xlbiwgc2tiLT5sZW4gLSA4IC0gaGRyX2xlbiwgbWljKSkKKyAgICAgICAgI2Vsc2UKKwlpZiAobWljaGFlbF9taWModGtleS0+cnhfdGZtX21pY2hhZWwsICZ0a2V5LT5rZXlbMjRdLCB0a2V5LT5yeF9oZHIsCisgICAgICAgICAgICAgICAgICAgICAgICBza2ItPmRhdGEgKyBoZHJfbGVuLCBza2ItPmxlbiAtIDggLSBoZHJfbGVuLCBtaWMpKQorICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgIAlyZXR1cm4gLTE7CisJaWYgKG1lbWNtcChtaWMsIHNrYi0+ZGF0YSArIHNrYi0+bGVuIC0gOCwgOCkgIT0gMCkgeworCQlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyOworCQloZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKikgc2tiLT5kYXRhOworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IE1pY2hhZWwgTUlDIHZlcmlmaWNhdGlvbiBmYWlsZWQgZm9yICIKKwkJICAgICAgICJNU0RVIGZyb20gIiBNQUNfRk1UICIga2V5aWR4PSVkXG4iLAorCQkgICAgICAgc2tiLT5kZXYgPyBza2ItPmRldi0+bmFtZSA6ICJOL0EiLCBNQUNfQVJHKGhkci0+YWRkcjIpLAorCQkgICAgICAga2V5aWR4KTsKKwkJaWYgKHNrYi0+ZGV2KQorCQkJaWVlZTgwMjExX21pY2hhZWxfbWljX2ZhaWx1cmUoc2tiLT5kZXYsIGhkciwga2V5aWR4KTsKKwkJdGtleS0+ZG90MTFSU05BU3RhdHNUS0lQTG9jYWxNSUNGYWlsdXJlcysrOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogVXBkYXRlIFRTQyBjb3VudGVycyBmb3IgUlggbm93IHRoYXQgdGhlIHBhY2tldCB2ZXJpZmljYXRpb24gaGFzCisJICogY29tcGxldGVkLiAqLworCXRrZXktPnJ4X2l2MzIgPSB0a2V5LT5yeF9pdjMyX25ldzsKKwl0a2V5LT5yeF9pdjE2ID0gdGtleS0+cnhfaXYxNl9uZXc7CisKKwlza2JfdHJpbShza2IsIHNrYi0+bGVuIC0gOCk7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IGllZWU4MDIxMV90a2lwX3NldF9rZXkodm9pZCAqa2V5LCBpbnQgbGVuLCB1OCAqc2VxLCB2b2lkICpwcml2KQoreworCXN0cnVjdCBpZWVlODAyMTFfdGtpcF9kYXRhICp0a2V5ID0gcHJpdjsKKwlpbnQga2V5aWR4OworCSNpZiAoKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwyMSkpJiYoIUlOX09QRU5TVVNFX1NMRUQpKQorCXN0cnVjdCBjcnlwdG9fdGZtICp0Zm0gPSB0a2V5LT50Zm1fbWljaGFlbDsKKwlzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtMiA9IHRrZXktPnRmbV9hcmM0OworCSNlbHNlCisJc3RydWN0IGNyeXB0b19oYXNoICp0Zm0gPSB0a2V5LT50eF90Zm1fbWljaGFlbDsKKwlzdHJ1Y3QgY3J5cHRvX2Jsa2NpcGhlciAqdGZtMiA9IHRrZXktPnR4X3RmbV9hcmM0OworCXN0cnVjdCBjcnlwdG9faGFzaCAqdGZtMyA9IHRrZXktPnJ4X3RmbV9taWNoYWVsOworCXN0cnVjdCBjcnlwdG9fYmxrY2lwaGVyICp0Zm00ID0gdGtleS0+cnhfdGZtX2FyYzQ7CisJI2VuZGlmCisKKwlrZXlpZHggPSB0a2V5LT5rZXlfaWR4OworCW1lbXNldCh0a2V5LCAwLCBzaXplb2YoKnRrZXkpKTsKKwl0a2V5LT5rZXlfaWR4ID0ga2V5aWR4OworCisJI2lmKChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMjEpKSYmKCFJTl9PUEVOU1VTRV9TTEVEKSkKKwl0a2V5LT50Zm1fbWljaGFlbCA9IHRmbTsKKwl0a2V5LT50Zm1fYXJjNCA9IHRmbTI7CisgICAgICAgI2Vsc2UKKwl0a2V5LT50eF90Zm1fbWljaGFlbCA9IHRmbTsKKwl0a2V5LT50eF90Zm1fYXJjNCA9IHRmbTI7CisJdGtleS0+cnhfdGZtX21pY2hhZWwgPSB0Zm0zOworCXRrZXktPnJ4X3RmbV9hcmM0ID0gdGZtNDsKKwkjZW5kaWYKKworCWlmIChsZW4gPT0gVEtJUF9LRVlfTEVOKSB7CisJCW1lbWNweSh0a2V5LT5rZXksIGtleSwgVEtJUF9LRVlfTEVOKTsKKwkJdGtleS0+a2V5X3NldCA9IDE7CisJCXRrZXktPnR4X2l2MTYgPSAxOyAvKiBUU0MgaXMgaW5pdGlhbGl6ZWQgdG8gMSAqLworCQlpZiAoc2VxKSB7CisJCQl0a2V5LT5yeF9pdjMyID0gKHNlcVs1XSA8PCAyNCkgfCAoc2VxWzRdIDw8IDE2KSB8CisJCQkJKHNlcVszXSA8PCA4KSB8IHNlcVsyXTsKKwkJCXRrZXktPnJ4X2l2MTYgPSAoc2VxWzFdIDw8IDgpIHwgc2VxWzBdOworCQl9CisJfSBlbHNlIGlmIChsZW4gPT0gMCkKKwkJdGtleS0+a2V5X3NldCA9IDA7CisJZWxzZQorCQlyZXR1cm4gLTE7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IGllZWU4MDIxMV90a2lwX2dldF9rZXkodm9pZCAqa2V5LCBpbnQgbGVuLCB1OCAqc2VxLCB2b2lkICpwcml2KQoreworCXN0cnVjdCBpZWVlODAyMTFfdGtpcF9kYXRhICp0a2V5ID0gcHJpdjsKKworCWlmIChsZW4gPCBUS0lQX0tFWV9MRU4pCisJCXJldHVybiAtMTsKKworCWlmICghdGtleS0+a2V5X3NldCkKKwkJcmV0dXJuIDA7CisJbWVtY3B5KGtleSwgdGtleS0+a2V5LCBUS0lQX0tFWV9MRU4pOworCisJaWYgKHNlcSkgeworCQkvKiBSZXR1cm4gdGhlIHNlcXVlbmNlIG51bWJlciBvZiB0aGUgbGFzdCB0cmFuc21pdHRlZCBmcmFtZS4gKi8KKwkJdTE2IGl2MTYgPSB0a2V5LT50eF9pdjE2OworCQl1MzIgaXYzMiA9IHRrZXktPnR4X2l2MzI7CisJCWlmIChpdjE2ID09IDApCisJCQlpdjMyLS07CisJCWl2MTYtLTsKKwkJc2VxWzBdID0gdGtleS0+dHhfaXYxNjsKKwkJc2VxWzFdID0gdGtleS0+dHhfaXYxNiA+PiA4OworCQlzZXFbMl0gPSB0a2V5LT50eF9pdjMyOworCQlzZXFbM10gPSB0a2V5LT50eF9pdjMyID4+IDg7CisJCXNlcVs0XSA9IHRrZXktPnR4X2l2MzIgPj4gMTY7CisJCXNlcVs1XSA9IHRrZXktPnR4X2l2MzIgPj4gMjQ7CisJfQorCisJcmV0dXJuIFRLSVBfS0VZX0xFTjsKK30KKworCitzdGF0aWMgY2hhciAqIGllZWU4MDIxMV90a2lwX3ByaW50X3N0YXRzKGNoYXIgKnAsIHZvaWQgKnByaXYpCit7CisJc3RydWN0IGllZWU4MDIxMV90a2lwX2RhdGEgKnRraXAgPSBwcml2OworCXAgKz0gc3ByaW50ZihwLCAia2V5WyVkXSBhbGc9VEtJUCBrZXlfc2V0PSVkICIKKwkJICAgICAidHhfcG49JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4ICIKKwkJICAgICAicnhfcG49JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4ICIKKwkJICAgICAicmVwbGF5cz0lZCBpY3ZfZXJyb3JzPSVkIGxvY2FsX21pY19mYWlsdXJlcz0lZFxuIiwKKwkJICAgICB0a2lwLT5rZXlfaWR4LCB0a2lwLT5rZXlfc2V0LAorCQkgICAgICh0a2lwLT50eF9pdjMyID4+IDI0KSAmIDB4ZmYsCisJCSAgICAgKHRraXAtPnR4X2l2MzIgPj4gMTYpICYgMHhmZiwKKwkJICAgICAodGtpcC0+dHhfaXYzMiA+PiA4KSAmIDB4ZmYsCisJCSAgICAgdGtpcC0+dHhfaXYzMiAmIDB4ZmYsCisJCSAgICAgKHRraXAtPnR4X2l2MTYgPj4gOCkgJiAweGZmLAorCQkgICAgIHRraXAtPnR4X2l2MTYgJiAweGZmLAorCQkgICAgICh0a2lwLT5yeF9pdjMyID4+IDI0KSAmIDB4ZmYsCisJCSAgICAgKHRraXAtPnJ4X2l2MzIgPj4gMTYpICYgMHhmZiwKKwkJICAgICAodGtpcC0+cnhfaXYzMiA+PiA4KSAmIDB4ZmYsCisJCSAgICAgdGtpcC0+cnhfaXYzMiAmIDB4ZmYsCisJCSAgICAgKHRraXAtPnJ4X2l2MTYgPj4gOCkgJiAweGZmLAorCQkgICAgIHRraXAtPnJ4X2l2MTYgJiAweGZmLAorCQkgICAgIHRraXAtPmRvdDExUlNOQVN0YXRzVEtJUFJlcGxheXMsCisJCSAgICAgdGtpcC0+ZG90MTFSU05BU3RhdHNUS0lQSUNWRXJyb3JzLAorCQkgICAgIHRraXAtPmRvdDExUlNOQVN0YXRzVEtJUExvY2FsTUlDRmFpbHVyZXMpOworCXJldHVybiBwOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0b19vcHMgaWVlZTgwMjExX2NyeXB0X3RraXAgPSB7CisJLm5hbWUJCQk9ICJUS0lQIiwKKwkuaW5pdAkJCT0gaWVlZTgwMjExX3RraXBfaW5pdCwKKwkuZGVpbml0CQkJPSBpZWVlODAyMTFfdGtpcF9kZWluaXQsCisJLmVuY3J5cHRfbXBkdQkJPSBpZWVlODAyMTFfdGtpcF9lbmNyeXB0LAorCS5kZWNyeXB0X21wZHUJCT0gaWVlZTgwMjExX3RraXBfZGVjcnlwdCwKKwkuZW5jcnlwdF9tc2R1CQk9IGllZWU4MDIxMV9taWNoYWVsX21pY19hZGQsCisJLmRlY3J5cHRfbXNkdQkJPSBpZWVlODAyMTFfbWljaGFlbF9taWNfdmVyaWZ5LAorCS5zZXRfa2V5CQk9IGllZWU4MDIxMV90a2lwX3NldF9rZXksCisJLmdldF9rZXkJCT0gaWVlZTgwMjExX3RraXBfZ2V0X2tleSwKKwkucHJpbnRfc3RhdHMJCT0gaWVlZTgwMjExX3RraXBfcHJpbnRfc3RhdHMsCisJLmV4dHJhX3ByZWZpeF9sZW4JPSA0ICsgNCwgLyogSVYgKyBFeHRJViAqLworCS5leHRyYV9wb3N0Zml4X2xlbgk9IDggKyA0LCAvKiBNSUMgKyBJQ1YgKi8KKwkub3duZXIJCSAgICAgICAgPSBUSElTX01PRFVMRSwKK307CisKKworaW50IGllZWU4MDIxMV9jcnlwdG9fdGtpcF9pbml0KHZvaWQpCit7CisJcmV0dXJuIGllZWU4MDIxMV9yZWdpc3Rlcl9jcnlwdG9fb3BzKCZpZWVlODAyMTFfY3J5cHRfdGtpcCk7Cit9CisKKwordm9pZCBpZWVlODAyMTFfY3J5cHRvX3RraXBfZXhpdCh2b2lkKQoreworCWllZWU4MDIxMV91bnJlZ2lzdGVyX2NyeXB0b19vcHMoJmllZWU4MDIxMV9jcnlwdF90a2lwKTsKK30KKworCit2b2lkIGllZWU4MDIxMV90a2lwX251bGwodm9pZCkKK3sKKy8vICAgIHByaW50aygiPT09PT09PT09PT09PiVzKClcbiIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuOworfQorCisjaWYgMAorI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDUsMCkpCitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV90a2lwX251bGwpOworI2Vsc2UKK0VYUE9SVF9TWU1CT0xfTk9WRVJTKGllZWU4MDIxMV90a2lwX251bGwpOworI2VuZGlmCisjZW5kaWYKKworCisvL21vZHVsZV9pbml0KGllZWU4MDIxMV9jcnlwdG9fdGtpcF9pbml0KTsKKy8vbW9kdWxlX2V4aXQoaWVlZTgwMjExX2NyeXB0b190a2lwX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvaWVlZTgwMjExX2NyeXB0X3dlcC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvaWVlZTgwMjExX2NyeXB0X3dlcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4YTIyYjMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS9pZWVlODAyMTFfY3J5cHRfd2VwLmMKQEAgLTAsMCArMSwzOTQgQEAKKy8qCisgKiBIb3N0IEFQIGNyeXB0OiBob3N0LWJhc2VkIFdFUCBlbmNyeXB0aW9uIGltcGxlbWVudGF0aW9uIGZvciBIb3N0IEFQIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA0LCBKb3VuaSBNYWxpbmVuIDxqa21hbGluZUBjYy5odXQuZmk+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gU2VlIFJFQURNRSBhbmQgQ09QWUlORyBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqLworCisvLyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxhc20vc3RyaW5nLmg+CisKKyNpbmNsdWRlICJpZWVlODAyMTEuaCIKKworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkpCisjaW5jbHVkZSAicnRsX2NyeXB0by5oIgorI2Vsc2UKKyNpbmNsdWRlIDxsaW51eC9jcnlwdG8uaD4KKyNlbmRpZgorCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDIwKQorICAgICNpbmNsdWRlIDxhc20vc2NhdHRlcmxpc3QuaD4KKyNlbHNlCisgICAgI2luY2x1ZGUgPGxpbnV4L3NjYXR0ZXJsaXN0Lmg+CisjZW5kaWYKKy8vI2luY2x1ZGUgPGFzbS9zY2F0dGVybGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L2NyYzMyLmg+CisKK01PRFVMRV9BVVRIT1IoIkpvdW5pIE1hbGluZW4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiSG9zdCBBUCBjcnlwdDogV0VQIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKyNpZmRlZiBPUEVOU1VTRV9TTEVECisjaWZuZGVmIElOX09QRU5TVVNFX1NMRUQKKyNkZWZpbmUgSU5fT1BFTlNVU0VfU0xFRCAxCisjZW5kaWYKKyNlbmRpZgorCisKK3N0cnVjdCBwcmlzbTJfd2VwX2RhdGEgeworCXUzMiBpdjsKKyNkZWZpbmUgV0VQX0tFWV9MRU4gMTMKKwl1OCBrZXlbV0VQX0tFWV9MRU4gKyAxXTsKKwl1OCBrZXlfbGVuOworCXU4IGtleV9pZHg7CisJI2lmKChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMjEpKSYmKCFJTl9PUEVOU1VTRV9TTEVEKSkKKwlzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtOworCSNlbHNlCisJc3RydWN0IGNyeXB0b19ibGtjaXBoZXIgKnR4X3RmbTsKKwlzdHJ1Y3QgY3J5cHRvX2Jsa2NpcGhlciAqcnhfdGZtOworCSNlbmRpZgorfTsKKworCitzdGF0aWMgdm9pZCAqIHByaXNtMl93ZXBfaW5pdChpbnQga2V5aWR4KQoreworCXN0cnVjdCBwcmlzbTJfd2VwX2RhdGEgKnByaXY7CisKKwlwcml2ID0ga21hbGxvYyhzaXplb2YoKnByaXYpLCBHRlBfQVRPTUlDKTsKKwlpZiAocHJpdiA9PSBOVUxMKQorCQlnb3RvIGZhaWw7CisJbWVtc2V0KHByaXYsIDAsIHNpemVvZigqcHJpdikpOworCXByaXYtPmtleV9pZHggPSBrZXlpZHg7CisJI2lmKChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMjEpKSYmKCFJTl9PUEVOU1VTRV9TTEVEKSkKKwlwcml2LT50Zm0gPSBjcnlwdG9fYWxsb2NfdGZtKCJhcmM0IiwgMCk7CisgICAgIAlpZiAocHJpdi0+dGZtID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgImllZWU4MDIxMV9jcnlwdF93ZXA6IGNvdWxkIG5vdCBhbGxvY2F0ZSAiCisJCSAgICAgICAiY3J5cHRvIEFQSSBhcmM0XG4iKTsKKwkJZ290byBmYWlsOworCX0KKwkjZWxzZQorCXByaXYtPnR4X3RmbSA9IGNyeXB0b19hbGxvY19ibGtjaXBoZXIoImVjYihhcmM0KSIsIDAsIENSWVBUT19BTEdfQVNZTkMpOworCWlmIChJU19FUlIocHJpdi0+dHhfdGZtKSkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiaWVlZTgwMjExX2NyeXB0X3dlcDogY291bGQgbm90IGFsbG9jYXRlICIKKwkJICAgICAgICJjcnlwdG8gQVBJIGFyYzRcbiIpOworCQlwcml2LT50eF90Zm0gPSBOVUxMOworCQlnb3RvIGZhaWw7CisJfQorCXByaXYtPnJ4X3RmbSA9IGNyeXB0b19hbGxvY19ibGtjaXBoZXIoImVjYihhcmM0KSIsIDAsIENSWVBUT19BTEdfQVNZTkMpOworCWlmIChJU19FUlIocHJpdi0+cnhfdGZtKSkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiaWVlZTgwMjExX2NyeXB0X3dlcDogY291bGQgbm90IGFsbG9jYXRlICIKKwkJICAgICAgICJjcnlwdG8gQVBJIGFyYzRcbiIpOworCQlwcml2LT5yeF90Zm0gPSBOVUxMOworCQlnb3RvIGZhaWw7CisJfQorCSNlbmRpZgorCisJLyogc3RhcnQgV0VQIElWIGZyb20gYSByYW5kb20gdmFsdWUgKi8KKwlnZXRfcmFuZG9tX2J5dGVzKCZwcml2LT5pdiwgNCk7CisKKwlyZXR1cm4gcHJpdjsKKworZmFpbDoKKwkvLyNpZihMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMjEpKQorCSNpZigoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDIxKSkmJighSU5fT1BFTlNVU0VfU0xFRCkpCisJaWYgKHByaXYpIHsKKwkJaWYgKHByaXYtPnRmbSkKKwkJCWNyeXB0b19mcmVlX3RmbShwcml2LT50Zm0pOworCQlrZnJlZShwcml2KTsKKwl9CisgICAgICAgI2Vsc2UKKwlpZiAocHJpdikgeworCQlpZiAocHJpdi0+dHhfdGZtKQorCQkJY3J5cHRvX2ZyZWVfYmxrY2lwaGVyKHByaXYtPnR4X3RmbSk7CisJCWlmIChwcml2LT5yeF90Zm0pCisJCQljcnlwdG9fZnJlZV9ibGtjaXBoZXIocHJpdi0+cnhfdGZtKTsKKwkJa2ZyZWUocHJpdik7CisJfQorCSNlbmRpZgorCXJldHVybiBOVUxMOworfQorCisKK3N0YXRpYyB2b2lkIHByaXNtMl93ZXBfZGVpbml0KHZvaWQgKnByaXYpCit7CisJc3RydWN0IHByaXNtMl93ZXBfZGF0YSAqX3ByaXYgPSBwcml2OworCS8vI2lmKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwyMSkpCisJI2lmKChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMjEpKSYmKCFJTl9PUEVOU1VTRV9TTEVEKSkKKwlpZiAoX3ByaXYgJiYgX3ByaXYtPnRmbSkKKwkJY3J5cHRvX2ZyZWVfdGZtKF9wcml2LT50Zm0pOworCSNlbHNlCisJaWYgKF9wcml2KSB7CisJCWlmIChfcHJpdi0+dHhfdGZtKQorCQkJY3J5cHRvX2ZyZWVfYmxrY2lwaGVyKF9wcml2LT50eF90Zm0pOworCQlpZiAoX3ByaXYtPnJ4X3RmbSkKKwkJCWNyeXB0b19mcmVlX2Jsa2NpcGhlcihfcHJpdi0+cnhfdGZtKTsKKwl9CisgICAgICAgICNlbmRpZgorCWtmcmVlKHByaXYpOworfQorCisKKy8qIFBlcmZvcm0gV0VQIGVuY3J5cHRpb24gb24gZ2l2ZW4gc2tiIHRoYXQgaGFzIGF0IGxlYXN0IDQgYnl0ZXMgb2YgaGVhZHJvb20KKyAqIGZvciBJViBhbmQgNCBieXRlcyBvZiB0YWlscm9vbSBmb3IgSUNWLiBCb3RoIElWIGFuZCBJQ1Ygd2lsbCBiZSB0cmFuc21pdHRlZCwKKyAqIHNvIHRoZSBwYXlsb2FkIGxlbmd0aCBpbmNyZWFzZXMgd2l0aCA4IGJ5dGVzLgorICoKKyAqIFdFUCBmcmFtZSBwYXlsb2FkOiBJViArIFRYIGtleSBpZHgsIFJDNChkYXRhKSwgSUNWID0gUkM0KENSQzMyKGRhdGEpKQorICovCitzdGF0aWMgaW50IHByaXNtMl93ZXBfZW5jcnlwdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgaGRyX2xlbiwgdm9pZCAqcHJpdikKK3sKKwlzdHJ1Y3QgcHJpc20yX3dlcF9kYXRhICp3ZXAgPSBwcml2OworLy8jaWYoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwyMSkpCisjaWYoKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMjEpKXx8KElOX09QRU5TVVNFX1NMRUQpKQorICAgICAgICBzdHJ1Y3QgYmxrY2lwaGVyX2Rlc2MgZGVzYyA9IHsudGZtID0gd2VwLT50eF90Zm19OworI2VuZGlmCisJdTMyIGtsZW4sIGxlbjsKKwl1OCBrZXlbV0VQX0tFWV9MRU4gKyAzXTsKKwl1OCAqcG9zOworI2lmbmRlZiBKT0hOX0hXU0VDCisJdTMyIGNyYzsKKwl1OCAqaWN2OworCXN0cnVjdCBzY2F0dGVybGlzdCBzZzsKKyNlbmRpZgorCWlmIChza2JfaGVhZHJvb20oc2tiKSA8IDQgfHwgc2tiX3RhaWxyb29tKHNrYikgPCA0IHx8CisJICAgIHNrYi0+bGVuIDwgaGRyX2xlbikKKwkJcmV0dXJuIC0xOworCisJbGVuID0gc2tiLT5sZW4gLSBoZHJfbGVuOworCXBvcyA9IHNrYl9wdXNoKHNrYiwgNCk7CisJbWVtbW92ZShwb3MsIHBvcyArIDQsIGhkcl9sZW4pOworCXBvcyArPSBoZHJfbGVuOworCisJa2xlbiA9IDMgKyB3ZXAtPmtleV9sZW47CisKKwl3ZXAtPml2Kys7CisKKwkvKiBGbHVocmVyLCBNYW50aW4sIGFuZCBTaGFtaXIgaGF2ZSByZXBvcnRlZCB3ZWFrbmVzc2VzIGluIHRoZSBrZXkKKwkgKiBzY2hlZHVsaW5nIGFsZ29yaXRobSBvZiBSQzQuIEF0IGxlYXN0IElWcyAoS2V5Qnl0ZSArIDMsIDB4ZmYsIE4pCisJICogY2FuIGJlIHVzZWQgdG8gc3BlZWR1cCBhdHRhY2tzLCBzbyBhdm9pZCB1c2luZyB0aGVtLiAqLworCWlmICgod2VwLT5pdiAmIDB4ZmYwMCkgPT0gMHhmZjAwKSB7CisJCXU4IEIgPSAod2VwLT5pdiA+PiAxNikgJiAweGZmOworCQlpZiAoQiA+PSAzICYmIEIgPCBrbGVuKQorCQkJd2VwLT5pdiArPSAweDAxMDA7CisJfQorCisJLyogUHJlcGVuZCAyNC1iaXQgSVYgdG8gUkM0IGtleSBhbmQgVFggZnJhbWUgKi8KKwkqcG9zKysgPSBrZXlbMF0gPSAod2VwLT5pdiA+PiAxNikgJiAweGZmOworCSpwb3MrKyA9IGtleVsxXSA9ICh3ZXAtPml2ID4+IDgpICYgMHhmZjsKKwkqcG9zKysgPSBrZXlbMl0gPSB3ZXAtPml2ICYgMHhmZjsKKwkqcG9zKysgPSB3ZXAtPmtleV9pZHggPDwgNjsKKworCS8qIENvcHkgcmVzdCBvZiB0aGUgV0VQIGtleSAodGhlIHNlY3JldCBwYXJ0KSAqLworCW1lbWNweShrZXkgKyAzLCB3ZXAtPmtleSwgd2VwLT5rZXlfbGVuKTsKKworI2lmbmRlZiBKT0hOX0hXU0VDCisJLyogQXBwZW5kIGxpdHRsZS1lbmRpYW4gQ1JDMzIgYW5kIGVuY3J5cHQgaXQgdG8gcHJvZHVjZSBJQ1YgKi8KKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw1LDApKQorCWNyYyA9IH5jcmMzMl9sZSh+MCwgcG9zLCBsZW4pOworI2Vsc2UKKwljcmMgPSB+ZXRoZXJfY3JjX2xlKGxlbiwgcG9zKTsKKyNlbmRpZgorCWljdiA9IHNrYl9wdXQoc2tiLCA0KTsKKwlpY3ZbMF0gPSBjcmM7CisJaWN2WzFdID0gY3JjID4+IDg7CisJaWN2WzJdID0gY3JjID4+IDE2OworCWljdlszXSA9IGNyYyA+PiAyNDsKKworICAgICAgICAvLyNpZihMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMjEpKQorCSNpZigoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDIxKSkmJighSU5fT1BFTlNVU0VfU0xFRCkpCisJY3J5cHRvX2NpcGhlcl9zZXRrZXkod2VwLT50Zm0sIGtleSwga2xlbik7CisJc2cucGFnZSA9IHZpcnRfdG9fcGFnZShwb3MpOworCXNnLm9mZnNldCA9IG9mZnNldF9pbl9wYWdlKHBvcyk7CisJc2cubGVuZ3RoID0gbGVuICsgNDsKKwljcnlwdG9fY2lwaGVyX2VuY3J5cHQod2VwLT50Zm0sICZzZywgJnNnLCBsZW4gKyA0KTsKKworCXJldHVybiAwOworCSNlbHNlCisJY3J5cHRvX2Jsa2NpcGhlcl9zZXRrZXkod2VwLT50eF90Zm0sIGtleSwga2xlbik7CisgICAgICAgICNpZihMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMjQpKQorICAgICAgICAgIHNnLnBhZ2UgPSB2aXJ0X3RvX3BhZ2UocG9zKTsKKyAgICAgICAgICBzZy5vZmZzZXQgPSBvZmZzZXRfaW5fcGFnZShwb3MpOworICAgICAgICAgIHNnLmxlbmd0aCA9IGxlbiArIDQ7CisgICAgICAgICNlbHNlCisgICAgICAgICAgc2dfaW5pdF9vbmUoJnNnLCBwb3MsIGxlbis0KTsKKyAgICAgICAgI2VuZGlmCisJcmV0dXJuIGNyeXB0b19ibGtjaXBoZXJfZW5jcnlwdCgmZGVzYywgJnNnLCAmc2csIGxlbiArIDQpOworCSNlbmRpZgorI2VuZGlmIC8qIEpPSE5fSFdTRUMgKi8KKwlyZXR1cm4gMDsKK30KKworCisvKiBQZXJmb3JtIFdFUCBkZWNyeXB0aW9uIG9uIGdpdmVuIGJ1ZmZlci4gQnVmZmVyIGluY2x1ZGVzIHdob2xlIFdFUCBwYXJ0IG9mCisgKiB0aGUgZnJhbWU6IElWICg0IGJ5dGVzKSwgZW5jcnlwdGVkIHBheWxvYWQgKGluY2x1ZGluZyBTTkFQIGhlYWRlciksCisgKiBJQ1YgKDQgYnl0ZXMpLiBsZW4gaW5jbHVkZXMgYm90aCBJViBhbmQgSUNWLgorICoKKyAqIFJldHVybnMgMCBpZiBmcmFtZSB3YXMgZGVjcnlwdGVkIHN1Y2Nlc3NmdWxseSBhbmQgSUNWIHdhcyBjb3JyZWN0IGFuZCAtMSBvbgorICogZmFpbHVyZS4gSWYgZnJhbWUgaXMgT0ssIElWIGFuZCBJQ1Ygd2lsbCBiZSByZW1vdmVkLgorICovCitzdGF0aWMgaW50IHByaXNtMl93ZXBfZGVjcnlwdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgaGRyX2xlbiwgdm9pZCAqcHJpdikKK3sKKwlzdHJ1Y3QgcHJpc20yX3dlcF9kYXRhICp3ZXAgPSBwcml2OworICAgICAgICAvLyNpZihMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDIxKSkKKwkjaWYoKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMjEpKXx8KElOX09QRU5TVVNFX1NMRUQpKQorICAgICAgICBzdHJ1Y3QgYmxrY2lwaGVyX2Rlc2MgZGVzYyA9IHsudGZtID0gd2VwLT5yeF90Zm19OworICAgICAgICAjZW5kaWYKKwl1MzIga2xlbiwgcGxlbjsKKwl1OCBrZXlbV0VQX0tFWV9MRU4gKyAzXTsKKwl1OCBrZXlpZHgsICpwb3M7CisjaWZuZGVmIEpPSE5fSFdTRUMKKwl1MzIgY3JjOworCXU4IGljdls0XTsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3Qgc2c7CisjZW5kaWYKKwlpZiAoc2tiLT5sZW4gPCBoZHJfbGVuICsgOCkKKwkJcmV0dXJuIC0xOworCisJcG9zID0gc2tiLT5kYXRhICsgaGRyX2xlbjsKKwlrZXlbMF0gPSAqcG9zKys7CisJa2V5WzFdID0gKnBvcysrOworCWtleVsyXSA9ICpwb3MrKzsKKwlrZXlpZHggPSAqcG9zKysgPj4gNjsKKwlpZiAoa2V5aWR4ICE9IHdlcC0+a2V5X2lkeCkKKwkJcmV0dXJuIC0xOworCisJa2xlbiA9IDMgKyB3ZXAtPmtleV9sZW47CisKKwkvKiBDb3B5IHJlc3Qgb2YgdGhlIFdFUCBrZXkgKHRoZSBzZWNyZXQgcGFydCkgKi8KKwltZW1jcHkoa2V5ICsgMywgd2VwLT5rZXksIHdlcC0+a2V5X2xlbik7CisKKwkvKiBBcHBseSBSQzQgdG8gZGF0YSBhbmQgY29tcHV0ZSBDUkMzMiBvdmVyIGRlY3J5cHRlZCBkYXRhICovCisJcGxlbiA9IHNrYi0+bGVuIC0gaGRyX2xlbiAtIDg7CisjaWZuZGVmIEpPSE5fSFdTRUMKKy8vI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMjEpKQorI2lmKChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMjEpKSYmKCFJTl9PUEVOU1VTRV9TTEVEKSkKKwljcnlwdG9fY2lwaGVyX3NldGtleSh3ZXAtPnRmbSwga2V5LCBrbGVuKTsKKwlzZy5wYWdlID0gdmlydF90b19wYWdlKHBvcyk7CisJc2cub2Zmc2V0ID0gb2Zmc2V0X2luX3BhZ2UocG9zKTsKKwlzZy5sZW5ndGggPSBwbGVuICsgNDsKKwljcnlwdG9fY2lwaGVyX2RlY3J5cHQod2VwLT50Zm0sICZzZywgJnNnLCBwbGVuICsgNCk7CisjZWxzZQorCWNyeXB0b19ibGtjaXBoZXJfc2V0a2V5KHdlcC0+cnhfdGZtLCBrZXksIGtsZW4pOworICAgICAgICAjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwyNCkpCisgICAgICAgICAgc2cucGFnZSA9IHZpcnRfdG9fcGFnZShwb3MpOworICAgICAgICAgIHNnLm9mZnNldCA9IG9mZnNldF9pbl9wYWdlKHBvcyk7CisgICAgICAgICAgc2cubGVuZ3RoID0gcGxlbiArIDQ7CisgICAgICAgICNlbHNlCisgICAgICAgICAgc2dfaW5pdF9vbmUoJnNnLCBwb3MsIHBsZW4rNCk7CisgICAgICAgICNlbmRpZgorCWlmIChjcnlwdG9fYmxrY2lwaGVyX2RlY3J5cHQoJmRlc2MsICZzZywgJnNnLCBwbGVuICsgNCkpCisJCXJldHVybiAtNzsKKyNlbmRpZgorCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNSwwKSkKKwljcmMgPSB+Y3JjMzJfbGUofjAsIHBvcywgcGxlbik7CisjZWxzZQorCWNyYyA9IH5ldGhlcl9jcmNfbGUocGxlbiwgcG9zKTsKKyNlbmRpZgorCWljdlswXSA9IGNyYzsKKwlpY3ZbMV0gPSBjcmMgPj4gODsKKwlpY3ZbMl0gPSBjcmMgPj4gMTY7CisJaWN2WzNdID0gY3JjID4+IDI0OworCisJaWYgKG1lbWNtcChpY3YsIHBvcyArIHBsZW4sIDQpICE9IDApIHsKKwkJLyogSUNWIG1pc21hdGNoIC0gZHJvcCBmcmFtZSAqLworCQlyZXR1cm4gLTI7CisJfQorI2VuZGlmIAkvKiBKT0hOX0hXU0VDICovCisKKwkvKiBSZW1vdmUgSVYgYW5kIElDViAqLworCW1lbW1vdmUoc2tiLT5kYXRhICsgNCwgc2tiLT5kYXRhLCBoZHJfbGVuKTsKKwlza2JfcHVsbChza2IsIDQpOworCXNrYl90cmltKHNrYiwgc2tiLT5sZW4gLSA0KTsKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBwcmlzbTJfd2VwX3NldF9rZXkodm9pZCAqa2V5LCBpbnQgbGVuLCB1OCAqc2VxLCB2b2lkICpwcml2KQoreworCXN0cnVjdCBwcmlzbTJfd2VwX2RhdGEgKndlcCA9IHByaXY7CisKKwlpZiAobGVuIDwgMCB8fCBsZW4gPiBXRVBfS0VZX0xFTikKKwkJcmV0dXJuIC0xOworCisJbWVtY3B5KHdlcC0+a2V5LCBrZXksIGxlbik7CisJd2VwLT5rZXlfbGVuID0gbGVuOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBwcmlzbTJfd2VwX2dldF9rZXkodm9pZCAqa2V5LCBpbnQgbGVuLCB1OCAqc2VxLCB2b2lkICpwcml2KQoreworCXN0cnVjdCBwcmlzbTJfd2VwX2RhdGEgKndlcCA9IHByaXY7CisKKwlpZiAobGVuIDwgd2VwLT5rZXlfbGVuKQorCQlyZXR1cm4gLTE7CisKKwltZW1jcHkoa2V5LCB3ZXAtPmtleSwgd2VwLT5rZXlfbGVuKTsKKworCXJldHVybiB3ZXAtPmtleV9sZW47Cit9CisKKworc3RhdGljIGNoYXIgKiBwcmlzbTJfd2VwX3ByaW50X3N0YXRzKGNoYXIgKnAsIHZvaWQgKnByaXYpCit7CisJc3RydWN0IHByaXNtMl93ZXBfZGF0YSAqd2VwID0gcHJpdjsKKwlwICs9IHNwcmludGYocCwgImtleVslZF0gYWxnPVdFUCBsZW49JWRcbiIsCisJCSAgICAgd2VwLT5rZXlfaWR4LCB3ZXAtPmtleV9sZW4pOworCXJldHVybiBwOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0b19vcHMgaWVlZTgwMjExX2NyeXB0X3dlcCA9IHsKKwkubmFtZQkJCT0gIldFUCIsCisJLmluaXQJCQk9IHByaXNtMl93ZXBfaW5pdCwKKwkuZGVpbml0CQkJPSBwcmlzbTJfd2VwX2RlaW5pdCwKKwkuZW5jcnlwdF9tcGR1CQk9IHByaXNtMl93ZXBfZW5jcnlwdCwKKwkuZGVjcnlwdF9tcGR1CQk9IHByaXNtMl93ZXBfZGVjcnlwdCwKKwkuZW5jcnlwdF9tc2R1CQk9IE5VTEwsCisJLmRlY3J5cHRfbXNkdQkJPSBOVUxMLAorCS5zZXRfa2V5CQk9IHByaXNtMl93ZXBfc2V0X2tleSwKKwkuZ2V0X2tleQkJPSBwcmlzbTJfd2VwX2dldF9rZXksCisJLnByaW50X3N0YXRzCQk9IHByaXNtMl93ZXBfcHJpbnRfc3RhdHMsCisJLmV4dHJhX3ByZWZpeF9sZW4JPSA0LCAvKiBJViAqLworCS5leHRyYV9wb3N0Zml4X2xlbgk9IDQsIC8qIElDViAqLworCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCit9OworCisKK2ludCBpZWVlODAyMTFfY3J5cHRvX3dlcF9pbml0KHZvaWQpCit7CisJcmV0dXJuIGllZWU4MDIxMV9yZWdpc3Rlcl9jcnlwdG9fb3BzKCZpZWVlODAyMTFfY3J5cHRfd2VwKTsKK30KKworCit2b2lkIGllZWU4MDIxMV9jcnlwdG9fd2VwX2V4aXQodm9pZCkKK3sKKwlpZWVlODAyMTFfdW5yZWdpc3Rlcl9jcnlwdG9fb3BzKCZpZWVlODAyMTFfY3J5cHRfd2VwKTsKK30KKworCit2b2lkIGllZWU4MDIxMV93ZXBfbnVsbCh2b2lkKQoreworLy8JcHJpbnRrKCI9PT09PT09PT09PT0+JXMoKVxuIiwgX19mdW5jX18pOworICAgICAgICByZXR1cm47Cit9CisjaWYgMAorI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDUsMCkpCitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV93ZXBfbnVsbCk7CisjZWxzZQorRVhQT1JUX1NZTUJPTF9OT1ZFUlMoaWVlZTgwMjExX3dlcF9udWxsKTsKKyNlbmRpZgorI2VuZGlmCisvL21vZHVsZV9pbml0KGllZWU4MDIxMV9jcnlwdG9fd2VwX2luaXQpOworLy9tb2R1bGVfZXhpdChpZWVlODAyMTFfY3J5cHRvX3dlcF9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2llZWU4MDIxMV9tb2R1bGUuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2llZWU4MDIxMV9tb2R1bGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzlmZWYwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvaWVlZTgwMjExX21vZHVsZS5jCkBAIC0wLDAgKzEsMzAxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIENvcHlyaWdodChjKSAyMDA0IEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgIFBvcnRpb25zIG9mIHRoaXMgZmlsZSBhcmUgYmFzZWQgb24gdGhlIFdFUCBlbmFibGVtZW50IGNvZGUgcHJvdmlkZWQgYnkgdGhlCisgIEhvc3QgQVAgcHJvamVjdCBob3N0YXAtZHJpdmVycyB2MC4xLjMKKyAgQ29weXJpZ2h0IChjKSAyMDAxLTIwMDIsIFNTSCBDb21tdW5pY2F0aW9ucyBTZWN1cml0eSBDb3JwIGFuZCBKb3VuaSBNYWxpbmVuCisgIDxqa21hbGluZUBjYy5odXQuZmk+CisgIENvcHlyaWdodCAoYykgMjAwMi0yMDAzLCBKb3VuaSBNYWxpbmVuIDxqa21hbGluZUBjYy5odXQuZmk+CisKKyAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKyAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgIG1vcmUgZGV0YWlscy4KKworICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKworICBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUKKyAgZmlsZSBjYWxsZWQgTElDRU5TRS4KKworICBDb250YWN0IEluZm9ybWF0aW9uOgorICBKYW1lcyBQLiBLZXRyZW5vcyA8aXB3MjEwMC1hZG1pbkBsaW51eC5pbnRlbC5jb20+CisgIEludGVsIENvcnBvcmF0aW9uLCA1MjAwIE4uRS4gRWxhbSBZb3VuZyBQYXJrd2F5LCBIaWxsc2Jvcm8sIE9SIDk3MTI0LTY0OTcKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CisvLyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPGxpbnV4L2luNi5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvaXAuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3RjcC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L3dpcmVsZXNzLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPG5ldC9hcnAuaD4KKyNpbmNsdWRlIDxuZXQvbmV0X25hbWVzcGFjZS5oPgorCisjaW5jbHVkZSAiaWVlZTgwMjExLmgiCisKK01PRFVMRV9ERVNDUklQVElPTigiODAyLjExIGRhdGEvbWFuYWdlbWVudC9jb250cm9sIHN0YWNrIik7CitNT0RVTEVfQVVUSE9SKCJDb3B5cmlnaHQgKEMpIDIwMDQgSW50ZWwgQ29ycG9yYXRpb24gPGprZXRyZW5vQGxpbnV4LmludGVsLmNvbT4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworI2RlZmluZSBEUlZfTkFNRSAiaWVlZTgwMjExIgorCitzdGF0aWMgaW5saW5lIGludCBpZWVlODAyMTFfbmV0d29ya3NfYWxsb2NhdGUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisJaWYgKGllZWUtPm5ldHdvcmtzKQorCQlyZXR1cm4gMDsKKworCWllZWUtPm5ldHdvcmtzID0ga21hbGxvYygKKwkJTUFYX05FVFdPUktfQ09VTlQgKiBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrKSwKKwkJR0ZQX0tFUk5FTCk7CisJaWYgKCFpZWVlLT5uZXR3b3JrcykgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogT3V0IG9mIG1lbW9yeSBhbGxvY2F0aW5nIGJlYWNvbnNcbiIsCisJCSAgICAgICBpZWVlLT5kZXYtPm5hbWUpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwltZW1zZXQoaWVlZS0+bmV0d29ya3MsIDAsCisJICAgICAgIE1BWF9ORVRXT1JLX0NPVU5UICogc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfbmV0d29yaykpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpZWVlODAyMTFfbmV0d29ya3NfZnJlZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKwlpZiAoIWllZWUtPm5ldHdvcmtzKQorCQlyZXR1cm47CisJa2ZyZWUoaWVlZS0+bmV0d29ya3MpOworCWllZWUtPm5ldHdvcmtzID0gTlVMTDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGllZWU4MDIxMV9uZXR3b3Jrc19pbml0aWFsaXplKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCWludCBpOworCisJSU5JVF9MSVNUX0hFQUQoJmllZWUtPm5ldHdvcmtfZnJlZV9saXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmaWVlZS0+bmV0d29ya19saXN0KTsKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX05FVFdPUktfQ09VTlQ7IGkrKykKKwkJbGlzdF9hZGRfdGFpbCgmaWVlZS0+bmV0d29ya3NbaV0ubGlzdCwgJmllZWUtPm5ldHdvcmtfZnJlZV9saXN0KTsKK30KKworCitzdHJ1Y3QgbmV0X2RldmljZSAqYWxsb2NfaWVlZTgwMjExKGludCBzaXplb2ZfcHJpdikKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCWludCBpLGVycjsKKworCUlFRUU4MDIxMV9ERUJVR19JTkZPKCJJbml0aWFsaXppbmcuLi5cbiIpOworCisJZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKSArIHNpemVvZl9wcml2KTsKKwlpZiAoIWRldikgeworCQlJRUVFODAyMTFfRVJST1IoIlVuYWJsZSB0byBuZXR3b3JrIGRldmljZS5cbiIpOworCQlnb3RvIGZhaWxlZDsKKwl9CisJaWVlZSA9IG5ldGRldl9wcml2KGRldik7CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBpZWVlODAyMTFfeG1pdDsKKworCWllZWUtPmRldiA9IGRldjsKKworCWVyciA9IGllZWU4MDIxMV9uZXR3b3Jrc19hbGxvY2F0ZShpZWVlKTsKKwlpZiAoZXJyKSB7CisJCUlFRUU4MDIxMV9FUlJPUigiVW5hYmxlIHRvIGFsbG9jYXRlIGJlYWNvbiBzdG9yYWdlOiAlZFxuIiwKKwkJCQllcnIpOworCQlnb3RvIGZhaWxlZDsKKwl9CisJaWVlZTgwMjExX25ldHdvcmtzX2luaXRpYWxpemUoaWVlZSk7CisKKwkvKiBEZWZhdWx0IGZyYWdtZW50YXRpb24gdGhyZXNob2xkIGlzIG1heGltdW0gcGF5bG9hZCBzaXplICovCisJaWVlZS0+ZnRzID0gREVGQVVMVF9GVFM7CisJaWVlZS0+c2Nhbl9hZ2UgPSBERUZBVUxUX01BWF9TQ0FOX0FHRTsKKwlpZWVlLT5vcGVuX3dlcCA9IDE7CisKKwkvKiBEZWZhdWx0IHRvIGVuYWJsaW5nIGZ1bGwgb3BlbiBXRVAgd2l0aCBob3N0IGJhc2VkIGVuY3J5cHQvZGVjcnlwdCAqLworCWllZWUtPmhvc3RfZW5jcnlwdCA9IDE7CisJaWVlZS0+aG9zdF9kZWNyeXB0ID0gMTsKKwlpZWVlLT5pZWVlODAyXzF4ID0gMTsgLyogRGVmYXVsdCB0byBzdXBwb3J0aW5nIDgwMi4xeCAqLworCisJSU5JVF9MSVNUX0hFQUQoJmllZWUtPmNyeXB0X2RlaW5pdF9saXN0KTsKKwlpbml0X3RpbWVyKCZpZWVlLT5jcnlwdF9kZWluaXRfdGltZXIpOworCWllZWUtPmNyeXB0X2RlaW5pdF90aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpaWVlZTsKKwlpZWVlLT5jcnlwdF9kZWluaXRfdGltZXIuZnVuY3Rpb24gPSBpZWVlODAyMTFfY3J5cHRfZGVpbml0X2hhbmRsZXI7CisKKwlzcGluX2xvY2tfaW5pdCgmaWVlZS0+bG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJmllZWUtPndwYXhfc3VpdGxpc3RfbG9jayk7CisKKwlpZWVlLT53cGF4X3R5cGVfc2V0ID0gMDsKKyAJaWVlZS0+d3BhX2VuYWJsZWQgPSAwOworIAlpZWVlLT50a2lwX2NvdW50ZXJtZWFzdXJlcyA9IDA7CisgCWllZWUtPmRyb3BfdW5lbmNyeXB0ZWQgPSAwOworIAlpZWVlLT5wcml2YWN5X2ludm9rZWQgPSAwOworIAlpZWVlLT5pZWVlODAyXzF4ID0gMTsKKwlpZWVlLT5yYXdfdHggPSAwOworCisJaWVlZTgwMjExX3NvZnRtYWNfaW5pdChpZWVlKTsKKworCWZvciAoaSA9IDA7IGkgPCBJRUVFX0lCU1NfTUFDX0hBU0hfU0laRTsgaSsrKQorCQlJTklUX0xJU1RfSEVBRCgmaWVlZS0+aWJzc19tYWNfaGFzaFtpXSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMTc7IGkrKykgeworCSAgaWVlZS0+bGFzdF9yeHNlcV9udW1baV0gPSAtMTsKKwkgIGllZWUtPmxhc3RfcnhmcmFnX251bVtpXSA9IC0xOworCSAgaWVlZS0+bGFzdF9wYWNrZXRfdGltZVtpXSA9IDA7CisJfQorLy9UaGVzZSBmdW5jdGlvbiB3ZXJlIGFkZGVkIHRvIGxvYWQgY3J5cHRlIG1vZHVsZSBhdXRvbHkKKwlpZWVlODAyMTFfdGtpcF9udWxsKCk7CisJaWVlZTgwMjExX3dlcF9udWxsKCk7CisJaWVlZTgwMjExX2NjbXBfbnVsbCgpOworCXJldHVybiBkZXY7CisKKyBmYWlsZWQ6CisJaWYgKGRldikKKwkJZnJlZV9uZXRkZXYoZGV2KTsKKwlyZXR1cm4gTlVMTDsKK30KKworCit2b2lkIGZyZWVfaWVlZTgwMjExKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUgPSBuZXRkZXZfcHJpdihkZXYpOworCisJaW50IGk7CisJc3RydWN0IGxpc3RfaGVhZCAqcCwgKnE7CisKKworCWllZWU4MDIxMV9zb2Z0bWFjX2ZyZWUoaWVlZSk7CisJZGVsX3RpbWVyX3N5bmMoJmllZWUtPmNyeXB0X2RlaW5pdF90aW1lcik7CisJaWVlZTgwMjExX2NyeXB0X2RlaW5pdF9lbnRyaWVzKGllZWUsIDEpOworCisJZm9yIChpID0gMDsgaSA8IFdFUF9LRVlTOyBpKyspIHsKKwkJc3RydWN0IGllZWU4MDIxMV9jcnlwdF9kYXRhICpjcnlwdCA9IGllZWUtPmNyeXB0W2ldOworCQlpZiAoY3J5cHQpIHsKKwkJCWlmIChjcnlwdC0+b3BzKSB7CisJCQkJY3J5cHQtPm9wcy0+ZGVpbml0KGNyeXB0LT5wcml2KTsKKwkJCQltb2R1bGVfcHV0KGNyeXB0LT5vcHMtPm93bmVyKTsKKwkJCX0KKwkJCWtmcmVlKGNyeXB0KTsKKwkJCWllZWUtPmNyeXB0W2ldID0gTlVMTDsKKwkJfQorCX0KKworCWllZWU4MDIxMV9uZXR3b3Jrc19mcmVlKGllZWUpOworCisJZm9yIChpID0gMDsgaSA8IElFRUVfSUJTU19NQUNfSEFTSF9TSVpFOyBpKyspIHsKKwkJbGlzdF9mb3JfZWFjaF9zYWZlKHAsIHEsICZpZWVlLT5pYnNzX21hY19oYXNoW2ldKSB7CisJCQlrZnJlZShsaXN0X2VudHJ5KHAsIHN0cnVjdCBpZWVlX2lic3Nfc2VxLCBsaXN0KSk7CisJCQlsaXN0X2RlbChwKTsKKwkJfQorCX0KKworCisJZnJlZV9uZXRkZXYoZGV2KTsKK30KKworLy8jaWZkZWYgQ09ORklHX0lFRUU4MDIxMV9ERUJVRworI2lmIDAKKworc3RhdGljIGludCBkZWJ1ZyA9IDA7Cit1MzIgaWVlZTgwMjExX2RlYnVnX2xldmVsID0gMDsKK3N0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqaWVlZTgwMjExX3Byb2MgPSBOVUxMOworCitzdGF0aWMgaW50IHNob3dfZGVidWdfbGV2ZWwoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsCisJCQkgICAgaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKwlyZXR1cm4gc25wcmludGYocGFnZSwgY291bnQsICIweCUwOFhcbiIsIGllZWU4MDIxMV9kZWJ1Z19sZXZlbCk7Cit9CisKK3N0YXRpYyBpbnQgc3RvcmVfZGVidWdfbGV2ZWwoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgKmJ1ZmZlciwKKwkJCSAgICAgdW5zaWduZWQgbG9uZyBjb3VudCwgdm9pZCAqZGF0YSkKK3sKKwljaGFyIGJ1ZltdID0gIjB4MDAwMDAwMDAiOworCXVuc2lnbmVkIGxvbmcgbGVuID0gbWluKHNpemVvZihidWYpIC0gMSwgKHUzMiljb3VudCk7CisJY2hhciAqcCA9IChjaGFyICopYnVmOworCXVuc2lnbmVkIGxvbmcgdmFsOworCisJaWYgKGNvcHlfZnJvbV91c2VyKGJ1ZiwgYnVmZmVyLCBsZW4pKQorCQlyZXR1cm4gY291bnQ7CisJYnVmW2xlbl0gPSAwOworCWlmIChwWzFdID09ICd4JyB8fCBwWzFdID09ICdYJyB8fCBwWzBdID09ICd4JyB8fCBwWzBdID09ICdYJykgeworCQlwKys7CisJCWlmIChwWzBdID09ICd4JyB8fCBwWzBdID09ICdYJykKKwkJCXArKzsKKwkJdmFsID0gc2ltcGxlX3N0cnRvdWwocCwgJnAsIDE2KTsKKwl9IGVsc2UKKwkJdmFsID0gc2ltcGxlX3N0cnRvdWwocCwgJnAsIDEwKTsKKwlpZiAocCA9PSBidWYpCisJCXByaW50ayhLRVJOX0lORk8gRFJWX05BTUUKKwkJICAgICAgICI6ICVzIGlzIG5vdCBpbiBoZXggb3IgZGVjaW1hbCBmb3JtLlxuIiwgYnVmKTsKKwllbHNlCisJCWllZWU4MDIxMV9kZWJ1Z19sZXZlbCA9IHZhbDsKKworCXJldHVybiBzdHJubGVuKGJ1ZiwgY291bnQpOworfQorCitzdGF0aWMgaW50IF9faW5pdCBpZWVlODAyMTFfaW5pdCh2b2lkKQoreworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZTsKKworCWllZWU4MDIxMV9kZWJ1Z19sZXZlbCA9IGRlYnVnOworCWllZWU4MDIxMV9wcm9jID0gY3JlYXRlX3Byb2NfZW50cnkoRFJWX05BTUUsIFNfSUZESVIsIHByb2NfbmV0KTsKKwlpZiAoaWVlZTgwMjExX3Byb2MgPT0gTlVMTCkgeworCQlJRUVFODAyMTFfRVJST1IoIlVuYWJsZSB0byBjcmVhdGUgIiBEUlZfTkFNRQorCQkJCSIgcHJvYyBkaXJlY3RvcnlcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJZSA9IGNyZWF0ZV9wcm9jX2VudHJ5KCJkZWJ1Z19sZXZlbCIsIFNfSUZSRUcgfCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJCSAgICAgIGllZWU4MDIxMV9wcm9jKTsKKwlpZiAoIWUpIHsKKwkJcmVtb3ZlX3Byb2NfZW50cnkoRFJWX05BTUUsIHByb2NfbmV0KTsKKwkJaWVlZTgwMjExX3Byb2MgPSBOVUxMOworCQlyZXR1cm4gLUVJTzsKKwl9CisJZS0+cmVhZF9wcm9jID0gc2hvd19kZWJ1Z19sZXZlbDsKKwllLT53cml0ZV9wcm9jID0gc3RvcmVfZGVidWdfbGV2ZWw7CisJZS0+ZGF0YSA9IE5VTEw7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGllZWU4MDIxMV9leGl0KHZvaWQpCit7CisJaWYgKGllZWU4MDIxMV9wcm9jKSB7CisJCXJlbW92ZV9wcm9jX2VudHJ5KCJkZWJ1Z19sZXZlbCIsIGllZWU4MDIxMV9wcm9jKTsKKwkJcmVtb3ZlX3Byb2NfZW50cnkoRFJWX05BTUUsIHByb2NfbmV0KTsKKwkJaWVlZTgwMjExX3Byb2MgPSBOVUxMOworCX0KK30KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+Cittb2R1bGVfcGFyYW0oZGVidWcsIGludCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiZGVidWcgb3V0cHV0IG1hc2siKTsKKworCittb2R1bGVfZXhpdChpZWVlODAyMTFfZXhpdCk7Cittb2R1bGVfaW5pdChpZWVlODAyMTFfaW5pdCk7CisjZW5kaWYKKworI2lmIDAKK0VYUE9SVF9TWU1CT0woYWxsb2NfaWVlZTgwMjExKTsKK0VYUE9SVF9TWU1CT0woZnJlZV9pZWVlODAyMTEpOworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS9pZWVlODAyMTFfcnguYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2llZWU4MDIxMV9yeC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzNTE5YjMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS9pZWVlODAyMTFfcnguYwpAQCAtMCwwICsxLDE5NzEgQEAKKy8qCisgKiBPcmlnaW5hbCBjb2RlIGJhc2VkIEhvc3QgQVAgKHNvZnR3YXJlIHdpcmVsZXNzIExBTiBhY2Nlc3MgcG9pbnQpIGRyaXZlcgorICogZm9yIEludGVyc2lsIFByaXNtMi8yLjUvMyAtIGhvc3RhcC5vIG1vZHVsZSwgY29tbW9uIHJvdXRpbmVzCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDIsIFNTSCBDb21tdW5pY2F0aW9ucyBTZWN1cml0eSBDb3JwIGFuZCBKb3VuaSBNYWxpbmVuCisgKiA8amttYWxpbmVAY2MuaHV0LmZpPgorICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDMsIEpvdW5pIE1hbGluZW4gPGprbWFsaW5lQGNjLmh1dC5maT4KKyAqIENvcHlyaWdodCAoYykgMjAwNCwgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiBTZWUgUkVBRE1FIGFuZCBDT1BZSU5HIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIEZldyBtb2RpZmljYXRpb25zIGZvciBSZWFsdGVrJ3MgV2ktRmkgZHJpdmVycyBieQorICBBbmRyZWEgTWVyZWxsbyA8YW5kcmVhbXJsQHRpc2NhbGkuaXQ+CisKKyAgQSBzcGVjaWFsIHRoYW5rcyBnb2VzIHRvIFJlYWx0ZWsgZm9yIHRoZWlyIHN1cHBvcnQgIQorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CisvLyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPGxpbnV4L2luNi5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvaXAuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3RjcC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L3dpcmVsZXNzLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CisKKyNpbmNsdWRlICJpZWVlODAyMTEuaCIKKyNpZmRlZiBFTkFCTEVfRE9UMTFECisjaW5jbHVkZSAiZG90MTFkLmgiCisjZW5kaWYKK3N0YXRpYyBpbmxpbmUgdm9pZCBpZWVlODAyMTFfbW9uaXRvcl9yeChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCQkJc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkJc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0cyAqcnhfc3RhdHMpCit7CisJc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKXNrYi0+ZGF0YTsKKwl1MTYgZmMgPSBsZTE2X3RvX2NwdShoZHItPmZyYW1lX2N0bCk7CisKKwlza2ItPmRldiA9IGllZWUtPmRldjsKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDIyKQorICAgICAgICBza2JfcmVzZXRfbWFjX2hlYWRlcihza2IpOworI2Vsc2UKKyAgICAgICAgc2tiLT5tYWMucmF3ID0gc2tiLT5kYXRhOworI2VuZGlmCisJc2tiX3B1bGwoc2tiLCBpZWVlODAyMTFfZ2V0X2hkcmxlbihmYykpOworCXNrYi0+cGt0X3R5cGUgPSBQQUNLRVRfT1RIRVJIT1NUOworCXNrYi0+cHJvdG9jb2wgPSBfX2NvbnN0YW50X2h0b25zKEVUSF9QXzgwMjExX1JBVyk7CisJbWVtc2V0KHNrYi0+Y2IsIDAsIHNpemVvZihza2ItPmNiKSk7CisJbmV0aWZfcngoc2tiKTsKK30KKworCisvKiBDYWxsZWQgb25seSBhcyBhIHRhc2tsZXQgKHNvZnR3YXJlIElSUSkgKi8KK3N0YXRpYyBzdHJ1Y3QgaWVlZTgwMjExX2ZyYWdfZW50cnkgKgoraWVlZTgwMjExX2ZyYWdfY2FjaGVfZmluZChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgdW5zaWduZWQgaW50IHNlcSwKKwkJCSAgdW5zaWduZWQgaW50IGZyYWcsIHU4IHRpZCx1OCAqc3JjLCB1OCAqZHN0KQoreworCXN0cnVjdCBpZWVlODAyMTFfZnJhZ19lbnRyeSAqZW50cnk7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgSUVFRTgwMjExX0ZSQUdfQ0FDSEVfTEVOOyBpKyspIHsKKwkJZW50cnkgPSAmaWVlZS0+ZnJhZ19jYWNoZVt0aWRdW2ldOworCQlpZiAoZW50cnktPnNrYiAhPSBOVUxMICYmCisJCSAgICB0aW1lX2FmdGVyKGppZmZpZXMsIGVudHJ5LT5maXJzdF9mcmFnX3RpbWUgKyAyICogSFopKSB7CisJCQlJRUVFODAyMTFfREVCVUdfRlJBRygKKwkJCQkiZXhwaXJpbmcgZnJhZ21lbnQgY2FjaGUgZW50cnkgIgorCQkJCSJzZXE9JXUgbGFzdF9mcmFnPSV1XG4iLAorCQkJCWVudHJ5LT5zZXEsIGVudHJ5LT5sYXN0X2ZyYWcpOworCQkJZGV2X2tmcmVlX3NrYl9hbnkoZW50cnktPnNrYik7CisJCQllbnRyeS0+c2tiID0gTlVMTDsKKwkJfQorCisJCWlmIChlbnRyeS0+c2tiICE9IE5VTEwgJiYgZW50cnktPnNlcSA9PSBzZXEgJiYKKwkJICAgIChlbnRyeS0+bGFzdF9mcmFnICsgMSA9PSBmcmFnIHx8IGZyYWcgPT0gLTEpICYmCisJCSAgICBtZW1jbXAoZW50cnktPnNyY19hZGRyLCBzcmMsIEVUSF9BTEVOKSA9PSAwICYmCisJCSAgICBtZW1jbXAoZW50cnktPmRzdF9hZGRyLCBkc3QsIEVUSF9BTEVOKSA9PSAwKQorCQkJcmV0dXJuIGVudHJ5OworCX0KKworCXJldHVybiBOVUxMOworfQorCisvKiBDYWxsZWQgb25seSBhcyBhIHRhc2tsZXQgKHNvZnR3YXJlIElSUSkgKi8KK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqCitpZWVlODAyMTFfZnJhZ19jYWNoZV9nZXQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkgc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkcikKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gTlVMTDsKKwl1MTYgZmMgPSBsZTE2X3RvX2NwdShoZHItPmZyYW1lX2N0bCk7CisJdTE2IHNjID0gbGUxNl90b19jcHUoaGRyLT5zZXFfY3RsKTsKKwl1bnNpZ25lZCBpbnQgZnJhZyA9IFdMQU5fR0VUX1NFUV9GUkFHKHNjKTsKKwl1bnNpZ25lZCBpbnQgc2VxID0gV0xBTl9HRVRfU0VRX1NFUShzYyk7CisJc3RydWN0IGllZWU4MDIxMV9mcmFnX2VudHJ5ICplbnRyeTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcl9RT1MgKmhkcl8zYWRkcl9Rb1M7CisJc3RydWN0IGllZWU4MDIxMV9oZHJfUU9TICpoZHJfNGFkZHJfUW9TOworCXU4IHRpZDsKKworI2lmZGVmIF9SVEw4MTg3X0VYVF9QQVRDSF8KKwlpZihpZWVlLT5pd19tb2RlID09IGllZWUtPml3X2V4dF9tb2RlKQorCXsKKwkJdGlkID0gKGhkci0+YWRkcjJbRVRIX0FMRU4tMl0gXiBoZHItPmFkZHIyW0VUSF9BTEVOLTFdKSAmIElFRUU4MDIxMV9RT1NfVElEOworCX0KKwllbHNlCisjZW5kaWYKKwlpZiAoKChmYyAmIElFRUU4MDIxMV9GQ1RMX0RTVE9EUykgPT0gSUVFRTgwMjExX0ZDVExfRFNUT0RTKSYmSUVFRTgwMjExX1FPU19IQVNfU0VRKGZjKSkgeworCSAgaGRyXzRhZGRyX1FvUyA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkcl9RT1MgKiloZHI7CisJICB0aWQgPSBsZTE2X3RvX2NwdShoZHJfNGFkZHJfUW9TLT5RT1NfY3RsKSAmIElFRUU4MDIxMV9RT1NfVElEOworCSAgdGlkID0gVVAyQUModGlkKTsKKwkgIHRpZCArKzsKKwl9IGVsc2UgaWYgKElFRUU4MDIxMV9RT1NfSEFTX1NFUShmYykpIHsKKwkgIGhkcl8zYWRkcl9Rb1MgPSAoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHJfUU9TICopaGRyOworCSAgdGlkID0gbGUxNl90b19jcHUoaGRyXzNhZGRyX1FvUy0+UU9TX2N0bCkgJiBJRUVFODAyMTFfUU9TX1RJRDsKKwkgIHRpZCA9IFVQMkFDKHRpZCk7CisJICB0aWQgKys7CisJfSBlbHNlIHsKKwkgIHRpZCA9IDA7CisJfQorCisJaWYgKGZyYWcgPT0gMCkgeworCQkvKiBSZXNlcnZlIGVub3VnaCBzcGFjZSB0byBmaXQgbWF4aW11bSBmcmFtZSBsZW5ndGggKi8KKwkJc2tiID0gZGV2X2FsbG9jX3NrYihpZWVlLT5kZXYtPm10dSArCisJCQkJICAgIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2hkcikgKworCQkJCSAgICA4IC8qIExMQyAqLyArCisJCQkJICAgIDIgLyogYWxpZ25tZW50ICovICsKKwkJCQkgICAgOCAvKiBXRVAgKi8gKworCQkJCSAgICBFVEhfQUxFTiAvKiBXRFMgKi8gKworCQkJCSAgICAoSUVFRTgwMjExX1FPU19IQVNfU0VRKGZjKT8yOjApIC8qIFFPUyBDb250cm9sICovKTsKKwkJaWYgKHNrYiA9PSBOVUxMKQorCQkJcmV0dXJuIE5VTEw7CisKKwkJZW50cnkgPSAmaWVlZS0+ZnJhZ19jYWNoZVt0aWRdW2llZWUtPmZyYWdfbmV4dF9pZHhbdGlkXV07CisJCWllZWUtPmZyYWdfbmV4dF9pZHhbdGlkXSsrOworCQlpZiAoaWVlZS0+ZnJhZ19uZXh0X2lkeFt0aWRdID49IElFRUU4MDIxMV9GUkFHX0NBQ0hFX0xFTikKKwkJCWllZWUtPmZyYWdfbmV4dF9pZHhbdGlkXSA9IDA7CisKKwkJaWYgKGVudHJ5LT5za2IgIT0gTlVMTCkKKwkJCWRldl9rZnJlZV9za2JfYW55KGVudHJ5LT5za2IpOworCisJCWVudHJ5LT5maXJzdF9mcmFnX3RpbWUgPSBqaWZmaWVzOworCQllbnRyeS0+c2VxID0gc2VxOworCQllbnRyeS0+bGFzdF9mcmFnID0gZnJhZzsKKwkJZW50cnktPnNrYiA9IHNrYjsKKwkJbWVtY3B5KGVudHJ5LT5zcmNfYWRkciwgaGRyLT5hZGRyMiwgRVRIX0FMRU4pOworCQltZW1jcHkoZW50cnktPmRzdF9hZGRyLCBoZHItPmFkZHIxLCBFVEhfQUxFTik7CisJfSBlbHNlIHsKKwkJLyogcmVjZWl2ZWQgYSBmcmFnbWVudCBvZiBhIGZyYW1lIGZvciB3aGljaCB0aGUgaGVhZCBmcmFnbWVudAorCQkgKiBzaG91bGQgaGF2ZSBhbHJlYWR5IGJlZW4gcmVjZWl2ZWQgKi8KKwkJZW50cnkgPSBpZWVlODAyMTFfZnJhZ19jYWNoZV9maW5kKGllZWUsIHNlcSwgZnJhZywgdGlkLGhkci0+YWRkcjIsCisJCQkJCQkgIGhkci0+YWRkcjEpOworCQlpZiAoZW50cnkgIT0gTlVMTCkgeworCQkJZW50cnktPmxhc3RfZnJhZyA9IGZyYWc7CisJCQlza2IgPSBlbnRyeS0+c2tiOworCQl9CisJfQorCisJcmV0dXJuIHNrYjsKK30KKworCisvKiBDYWxsZWQgb25seSBhcyBhIHRhc2tsZXQgKHNvZnR3YXJlIElSUSkgKi8KK3N0YXRpYyBpbnQgaWVlZTgwMjExX2ZyYWdfY2FjaGVfaW52YWxpZGF0ZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCQkJICAgc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkcikKK3sKKwl1MTYgZmMgPSBsZTE2X3RvX2NwdShoZHItPmZyYW1lX2N0bCk7CisJdTE2IHNjID0gbGUxNl90b19jcHUoaGRyLT5zZXFfY3RsKTsKKwl1bnNpZ25lZCBpbnQgc2VxID0gV0xBTl9HRVRfU0VRX1NFUShzYyk7CisJc3RydWN0IGllZWU4MDIxMV9mcmFnX2VudHJ5ICplbnRyeTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcl9RT1MgKmhkcl8zYWRkcl9Rb1M7CisJc3RydWN0IGllZWU4MDIxMV9oZHJfUU9TICpoZHJfNGFkZHJfUW9TOworCXU4IHRpZDsKKworI2lmZGVmIF9SVEw4MTg3X0VYVF9QQVRDSF8KKwlpZihpZWVlLT5pd19tb2RlID09IGllZWUtPml3X2V4dF9tb2RlKQorCXsKKwkJdGlkID0gKGhkci0+YWRkcjJbRVRIX0FMRU4tMl0gXiBoZHItPmFkZHIyW0VUSF9BTEVOLTFdKSAmIElFRUU4MDIxMV9RT1NfVElEOworCX0KKwllbHNlCisjZW5kaWYKKwlpZigoKGZjICYgSUVFRTgwMjExX0ZDVExfRFNUT0RTKSA9PSBJRUVFODAyMTFfRkNUTF9EU1RPRFMpJiZJRUVFODAyMTFfUU9TX0hBU19TRVEoZmMpKSB7CisJICBoZHJfNGFkZHJfUW9TID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyX1FPUyAqKWhkcjsKKwkgIHRpZCA9IGxlMTZfdG9fY3B1KGhkcl80YWRkcl9Rb1MtPlFPU19jdGwpICYgSUVFRTgwMjExX1FPU19USUQ7CisJICB0aWQgPSBVUDJBQyh0aWQpOworCSAgdGlkICsrOworCX0gZWxzZSBpZiAoSUVFRTgwMjExX1FPU19IQVNfU0VRKGZjKSkgeworCSAgaGRyXzNhZGRyX1FvUyA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcl9RT1MgKiloZHI7CisJICB0aWQgPSBsZTE2X3RvX2NwdShoZHJfM2FkZHJfUW9TLT5RT1NfY3RsKSAmIElFRUU4MDIxMV9RT1NfVElEOworCSAgdGlkID0gVVAyQUModGlkKTsKKwkgIHRpZCArKzsKKwl9IGVsc2UgeworCSAgdGlkID0gMDsKKwl9CisKKwllbnRyeSA9IGllZWU4MDIxMV9mcmFnX2NhY2hlX2ZpbmQoaWVlZSwgc2VxLCAtMSwgdGlkLGhkci0+YWRkcjIsCisJCQkJCSAgaGRyLT5hZGRyMSk7CisKKwlpZiAoZW50cnkgPT0gTlVMTCkgeworCQlJRUVFODAyMTFfREVCVUdfRlJBRygKKwkJCSJjb3VsZCBub3QgaW52YWxpZGF0ZSBmcmFnbWVudCBjYWNoZSAiCisJCQkiZW50cnkgKHNlcT0ldSlcbiIsIHNlcSk7CisJCXJldHVybiAtMTsKKwl9CisKKwllbnRyeS0+c2tiID0gTlVMTDsKKwlyZXR1cm4gMDsKK30KKworCisKKy8qIGllZWU4MDIxMV9yeF9mcmFtZV9tZ3RtdAorICoKKyAqIFJlc3BvbnNpYmxlIGZvciBoYW5kbGluZyBtYW5hZ2VtZW50IGNvbnRyb2wgZnJhbWVzCisgKgorICogQ2FsbGVkIGJ5IGllZWU4MDIxMV9yeCAqLworc3RhdGljIGlubGluZSBpbnQKK2llZWU4MDIxMV9yeF9mcmFtZV9tZ210KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0cyAqcnhfc3RhdHMsIHUxNiB0eXBlLAorCQkJdTE2IHN0eXBlKQoreworCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHI7CisKKwkvLyBjaGVhdCB0aGUgdGhlIGhkciB0eXBlCisJaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopc2tiLT5kYXRhOworCisJLyogT24gdGhlIHN0cnVjdCBzdGF0cyBkZWZpbml0aW9uIHRoZXJlIGlzIHdyaXR0ZW4gdGhhdAorCSAqIHRoaXMgaXMgbm90IG1hbmRhdG9yeS4uLi4gYnV0IHNlZW1zIHRoYXQgdGhlIHByb2JlCisJICogcmVzcG9uc2UgcGFyc2VyIHVzZXMgaXQKKwkgKi8KKwlyeF9zdGF0cy0+bGVuID0gc2tiLT5sZW47CisJaWVlZTgwMjExX3J4X21ndChpZWVlLChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKXNrYi0+ZGF0YSxyeF9zdGF0cyk7CisKKwlpZigoaWVlZS0+c3RhdGUgPT0gSUVFRTgwMjExX0xJTktFRCkmJihtZW1jbXAoaGRyLT5hZGRyMyxpZWVlLT5jdXJyZW50X25ldHdvcmsuYnNzaWQsRVRIX0FMRU4pKSkgeworCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZWVlODAyMTFfcnhfZnJhbWVfc29mdG1hYyhpZWVlLCBza2IsIHJ4X3N0YXRzLCB0eXBlLCBzdHlwZSk7CisKKwlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCisJcmV0dXJuIDA7CisKKwkjaWZkZWYgTk9UX1lFVAorCWlmIChpZWVlLT5pd19tb2RlID09IElXX01PREVfTUFTVEVSKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogTWFzdGVyIG1vZGUgbm90IHlldCBzdXBwcG9ydGVkLlxuIiwKKwkJICAgICAgIGllZWUtPmRldi0+bmFtZSk7CisJCXJldHVybiAwOworLyoKKyAgaG9zdGFwX3VwZGF0ZV9zdGFfcHMoaWVlZSwgKHN0cnVjdCBob3N0YXBfaWVlZTgwMjExX2hkciAqKQorICBza2ItPmRhdGEpOyovCisJfQorCisJaWYgKGllZWUtPmhvc3RhcGQgJiYgdHlwZSA9PSBJRUVFODAyMTFfVFlQRV9NR01UKSB7CisJCWlmIChzdHlwZSA9PSBXTEFOX0ZDX1NUWVBFX0JFQUNPTiAmJgorCQkgICAgaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX01BU1RFUikgeworCQkJc3RydWN0IHNrX2J1ZmYgKnNrYjI7CisJCQkvKiBQcm9jZXNzIGJlYWNvbiBmcmFtZXMgYWxzbyBpbiBrZXJuZWwgZHJpdmVyIHRvCisJCQkgKiB1cGRhdGUgU1RBKEFQKSB0YWJsZSBzdGF0aXN0aWNzICovCisJCQlza2IyID0gc2tiX2Nsb25lKHNrYiwgR0ZQX0FUT01JQyk7CisJCQlpZiAoc2tiMikKKwkJCQlob3N0YXBfcngoc2tiMi0+ZGV2LCBza2IyLCByeF9zdGF0cyk7CisJCX0KKworCQkvKiBzZW5kIG1hbmFnZW1lbnQgZnJhbWVzIHRvIHRoZSB1c2VyIHNwYWNlIGRhZW1vbiBmb3IKKwkJICogcHJvY2Vzc2luZyAqLworCQlpZWVlLT5hcGRldnN0YXRzLnJ4X3BhY2tldHMrKzsKKwkJaWVlZS0+YXBkZXZzdGF0cy5yeF9ieXRlcyArPSBza2ItPmxlbjsKKwkJcHJpc20yX3J4XzgwMjExKGllZWUtPmFwZGV2LCBza2IsIHJ4X3N0YXRzLCBQUklTTTJfUlhfTUdNVCk7CisJCXJldHVybiAwOworCX0KKworCSAgICBpZiAoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX01BU1RFUikgeworCQlpZiAodHlwZSAhPSBXTEFOX0ZDX1RZUEVfTUdNVCAmJiB0eXBlICE9IFdMQU5fRkNfVFlQRV9DVFJMKSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHVua25vd24gbWFuYWdlbWVudCBmcmFtZSAiCisJCQkgICAgICAgIih0eXBlPTB4JTAyeCwgc3R5cGU9MHglMDJ4KSBkcm9wcGVkXG4iLAorCQkJICAgICAgIHNrYi0+ZGV2LT5uYW1lLCB0eXBlLCBzdHlwZSk7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQlob3N0YXBfcngoc2tiLT5kZXYsIHNrYiwgcnhfc3RhdHMpOworCQlyZXR1cm4gMDsKKwl9CisKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGhvc3RhcF9yeF9mcmFtZV9tZ210OiBtYW5hZ2VtZW50IGZyYW1lICIKKwkgICAgICAgInJlY2VpdmVkIGluIG5vbi1Ib3N0IEFQIG1vZGVcbiIsIHNrYi0+ZGV2LT5uYW1lKTsKKwlyZXR1cm4gLTE7CisJI2VuZGlmCit9CisKKworCisvKiBTZWUgSUVFRSA4MDIuMUggZm9yIExMQy9TTkFQIGVuY2Fwc3VsYXRpb24vZGVjYXBzdWxhdGlvbiAqLworLyogRXRoZXJuZXQtSUkgc25hcCBoZWFkZXIgKFJGQzEwNDIgZm9yIG1vc3QgRXRoZXJUeXBlcykgKi8KK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHJmYzEwNDJfaGVhZGVyW10gPQoreyAweGFhLCAweGFhLCAweDAzLCAweDAwLCAweDAwLCAweDAwIH07CisvKiBCcmlkZ2UtVHVubmVsIGhlYWRlciAoZm9yIEV0aGVyVHlwZXMgRVRIX1BfQUFSUCBhbmQgRVRIX1BfSVBYKSAqLworc3RhdGljIHVuc2lnbmVkIGNoYXIgYnJpZGdlX3R1bm5lbF9oZWFkZXJbXSA9Cit7IDB4YWEsIDB4YWEsIDB4MDMsIDB4MDAsIDB4MDAsIDB4ZjggfTsKKy8qIE5vIGVuY2Fwc3VsYXRpb24gaGVhZGVyIGlmIEV0aGVyVHlwZSA8IDB4NjAwICg9bGVuZ3RoKSAqLworCisvKiBDYWxsZWQgYnkgaWVlZTgwMjExX3J4X2ZyYW1lX2RlY3J5cHQgKi8KK3N0YXRpYyBpbnQgaWVlZTgwMjExX2lzX2VhcG9sX2ZyYW1lKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzaXplX3QgaGRybGVuKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBpZWVlLT5kZXY7CisJdTE2IGZjLCBldGhlcnR5cGU7CisJc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkcjsKKwl1OCAqcG9zOworCisJaWYgKHNrYi0+bGVuIDwgMjQpCisJCXJldHVybiAwOworCisJaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopIHNrYi0+ZGF0YTsKKwlmYyA9IGxlMTZfdG9fY3B1KGhkci0+ZnJhbWVfY3RsKTsKKworCS8qIGNoZWNrIHRoYXQgdGhlIGZyYW1lIGlzIHVuaWNhc3QgZnJhbWUgdG8gdXMgKi8KKwlpZiAoKGZjICYgKElFRUU4MDIxMV9GQ1RMX1RPRFMgfCBJRUVFODAyMTFfRkNUTF9GUk9NRFMpKSA9PQorCSAgICBJRUVFODAyMTFfRkNUTF9UT0RTICYmCisJICAgIG1lbWNtcChoZHItPmFkZHIxLCBkZXYtPmRldl9hZGRyLCBFVEhfQUxFTikgPT0gMCAmJgorCSAgICBtZW1jbXAoaGRyLT5hZGRyMywgZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pID09IDApIHsKKwkJLyogVG9EUyBmcmFtZSB3aXRoIG93biBhZGRyIEJTU0lEIGFuZCBEQSAqLworCX0gZWxzZSBpZiAoKGZjICYgKElFRUU4MDIxMV9GQ1RMX1RPRFMgfCBJRUVFODAyMTFfRkNUTF9GUk9NRFMpKSA9PQorCQkgICBJRUVFODAyMTFfRkNUTF9GUk9NRFMgJiYKKwkJICAgbWVtY21wKGhkci0+YWRkcjEsIGRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKSA9PSAwKSB7CisJCS8qIEZyb21EUyBmcmFtZSB3aXRoIG93biBhZGRyIGFzIERBICovCisJfSBlbHNlCisJCXJldHVybiAwOworCisJaWYgKHNrYi0+bGVuIDwgMjQgKyA4KQorCQlyZXR1cm4gMDsKKworCS8qIGNoZWNrIGZvciBwb3J0IGFjY2VzcyBlbnRpdHkgRXRoZXJuZXQgdHlwZSAqLworLy8JcG9zID0gc2tiLT5kYXRhICsgMjQ7CisJcG9zID0gc2tiLT5kYXRhICsgaGRybGVuOworCWV0aGVydHlwZSA9IChwb3NbNl0gPDwgOCkgfCBwb3NbN107CisJaWYgKGV0aGVydHlwZSA9PSBFVEhfUF9QQUUpCisJCXJldHVybiAxOworCisJcmV0dXJuIDA7Cit9CisKKy8qIENhbGxlZCBvbmx5IGFzIGEgdGFza2xldCAoc29mdHdhcmUgSVJRKSwgYnkgaWVlZTgwMjExX3J4ICovCitzdGF0aWMgaW5saW5lIGludAoraWVlZTgwMjExX3J4X2ZyYW1lX2RlY3J5cHQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUsIHN0cnVjdCBza19idWZmICpza2IsCisJCQkgICBzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEgKmNyeXB0KQoreworCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHI7CisJaW50IHJlcywgaGRybGVuOworCisJaWYgKGNyeXB0ID09IE5VTEwgfHwgY3J5cHQtPm9wcy0+ZGVjcnlwdF9tcGR1ID09IE5VTEwpCisJCXJldHVybiAwOworCisJaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopIHNrYi0+ZGF0YTsKKyNpZmRlZiBfUlRMODE4N19FWFRfUEFUQ0hfCisJaWYoKGllZWUtPml3X21vZGUgPT0gaWVlZS0+aXdfZXh0X21vZGUpICYmIChpZWVlLT5leHRfcGF0Y2hfaWVlZTgwMjExX3J4X2ZyYW1lX2dldF9oZHJsZW4pKQorCXsKKwkJaGRybGVuID0gaWVlZS0+ZXh0X3BhdGNoX2llZWU4MDIxMV9yeF9mcmFtZV9nZXRfaGRybGVuKGllZWUsIHNrYik7CisJfQorCWVsc2UKKyNlbmRpZgorCWhkcmxlbiA9IGllZWU4MDIxMV9nZXRfaGRybGVuKGxlMTZfdG9fY3B1KGhkci0+ZnJhbWVfY3RsKSk7CisKKyNpZmRlZiBDT05GSUdfSUVFRTgwMjExX0NSWVBUX1RLSVAKKwlpZiAoaWVlZS0+dGtpcF9jb3VudGVybWVhc3VyZXMgJiYKKwkgICAgc3RyY21wKGNyeXB0LT5vcHMtPm5hbWUsICJUS0lQIikgPT0gMCkgeworCQlpZiAobmV0X3JhdGVsaW1pdCgpKSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFRLSVAgY291bnRlcm1lYXN1cmVzOiBkcm9wcGVkICIKKwkJCSAgICAgICAicmVjZWl2ZWQgcGFja2V0IGZyb20gIiBNQUNfRk1UICJcbiIsCisJCQkgICAgICAgaWVlZS0+ZGV2LT5uYW1lLCBNQUNfQVJHKGhkci0+YWRkcjIpKTsKKwkJfQorCQlyZXR1cm4gLTE7CisJfQorI2VuZGlmCisKKwlhdG9taWNfaW5jKCZjcnlwdC0+cmVmY250KTsKKwlyZXMgPSBjcnlwdC0+b3BzLT5kZWNyeXB0X21wZHUoc2tiLCBoZHJsZW4sIGNyeXB0LT5wcml2KTsKKwlhdG9taWNfZGVjKCZjcnlwdC0+cmVmY250KTsKKwlpZiAocmVzIDwgMCkgeworCQlJRUVFODAyMTFfREVCVUdfRFJPUCgKKwkJCSJkZWNyeXB0aW9uIGZhaWxlZCAoU0E9IiBNQUNfRk1UCisJCQkiKSByZXM9JWRcbiIsIE1BQ19BUkcoaGRyLT5hZGRyMiksIHJlcyk7CisJCWlmIChyZXMgPT0gLTIpCisJCQlJRUVFODAyMTFfREVCVUdfRFJPUCgiRGVjcnlwdGlvbiBmYWlsZWQgSUNWICIKKwkJCQkJICAgICAibWlzbWF0Y2ggKGtleSAlZClcbiIsCisJCQkJCSAgICAgc2tiLT5kYXRhW2hkcmxlbiArIDNdID4+IDYpOworCQlpZWVlLT5pZWVlX3N0YXRzLnJ4X2Rpc2NhcmRzX3VuZGVjcnlwdGFibGUrKzsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiByZXM7Cit9CisKKworLyogQ2FsbGVkIG9ubHkgYXMgYSB0YXNrbGV0IChzb2Z0d2FyZSBJUlEpLCBieSBpZWVlODAyMTFfcnggKi8KK3N0YXRpYyBpbmxpbmUgaW50CitpZWVlODAyMTFfcnhfZnJhbWVfZGVjcnlwdF9tc2R1KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICAgICBpbnQga2V5aWR4LCBzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEgKmNyeXB0KQoreworCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHI7CisJaW50IHJlcywgaGRybGVuOworCisJaWYgKGNyeXB0ID09IE5VTEwgfHwgY3J5cHQtPm9wcy0+ZGVjcnlwdF9tc2R1ID09IE5VTEwpCisJCXJldHVybiAwOworCisJaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopIHNrYi0+ZGF0YTsKKyNpZmRlZiBfUlRMODE4N19FWFRfUEFUQ0hfCisJaWYoKGllZWUtPml3X21vZGUgPT0gaWVlZS0+aXdfZXh0X21vZGUpICYmIChpZWVlLT5leHRfcGF0Y2hfaWVlZTgwMjExX3J4X2ZyYW1lX2dldF9oZHJsZW4pKQorCXsKKwkJaGRybGVuID0gaWVlZS0+ZXh0X3BhdGNoX2llZWU4MDIxMV9yeF9mcmFtZV9nZXRfaGRybGVuKGllZWUsIHNrYik7CisJfQorCWVsc2UKKyNlbmRpZgorCWhkcmxlbiA9IGllZWU4MDIxMV9nZXRfaGRybGVuKGxlMTZfdG9fY3B1KGhkci0+ZnJhbWVfY3RsKSk7CisKKwlhdG9taWNfaW5jKCZjcnlwdC0+cmVmY250KTsKKwlyZXMgPSBjcnlwdC0+b3BzLT5kZWNyeXB0X21zZHUoc2tiLCBrZXlpZHgsIGhkcmxlbiwgY3J5cHQtPnByaXYpOworCWF0b21pY19kZWMoJmNyeXB0LT5yZWZjbnQpOworCWlmIChyZXMgPCAwKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogTVNEVSBkZWNyeXB0aW9uL01JQyB2ZXJpZmljYXRpb24gZmFpbGVkIgorCQkgICAgICAgIiAoU0E9IiBNQUNfRk1UICIga2V5aWR4PSVkKVxuIiwKKwkJICAgICAgIGllZWUtPmRldi0+bmFtZSwgTUFDX0FSRyhoZHItPmFkZHIyKSwga2V5aWR4KTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorCisKKy8qIHRoaXMgZnVuY3Rpb24gaXMgc3RvbGVuIGZyb20gaXB3MjIwMCBkcml2ZXIqLworI2RlZmluZSBJRUVFX1BBQ0tFVF9SRVRSWV9USU1FICg1KkhaKQorc3RhdGljIGludCBpc19kdXBsaWNhdGVfcGFja2V0KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJCSAgICAgIHN0cnVjdCBpZWVlODAyMTFfaGRyICpoZWFkZXIpCit7CisJdTE2IGZjID0gbGUxNl90b19jcHUoaGVhZGVyLT5mcmFtZV9jdGwpOworCXUxNiBzYyA9IGxlMTZfdG9fY3B1KGhlYWRlci0+c2VxX2N0bCk7CisJdTE2IHNlcSA9IFdMQU5fR0VUX1NFUV9TRVEoc2MpOworCXUxNiBmcmFnID0gV0xBTl9HRVRfU0VRX0ZSQUcoc2MpOworCXUxNiAqbGFzdF9zZXEsICpsYXN0X2ZyYWc7CisJdW5zaWduZWQgbG9uZyAqbGFzdF90aW1lOworCXN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyX1FPUyAqaGRyXzNhZGRyX1FvUzsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkcl9RT1MgKmhkcl80YWRkcl9Rb1M7CisJdTggdGlkOworCisjaWZkZWYgX1JUTDgxODdfRVhUX1BBVENIXworCWlmKGllZWUtPml3X21vZGUgPT0gaWVlZS0+aXdfZXh0X21vZGUpCisJeworCQl0aWQgPSAoaGVhZGVyLT5hZGRyMltFVEhfQUxFTi0yXSBeIGhlYWRlci0+YWRkcjJbRVRIX0FMRU4tMV0pICYgSUVFRTgwMjExX1FPU19USUQ7CisJfQorCWVsc2UKKyNlbmRpZgorCS8vVE8yRFMgYW5kIFFvUworCWlmKCgoZmMgJiBJRUVFODAyMTFfRkNUTF9EU1RPRFMpID09IElFRUU4MDIxMV9GQ1RMX0RTVE9EUykmJklFRUU4MDIxMV9RT1NfSEFTX1NFUShmYykpIHsKKwkgIGhkcl80YWRkcl9Rb1MgPSAoc3RydWN0IGllZWU4MDIxMV9oZHJfUU9TICopaGVhZGVyOworCSAgdGlkID0gbGUxNl90b19jcHUoaGRyXzRhZGRyX1FvUy0+UU9TX2N0bCkgJiBJRUVFODAyMTFfUU9TX1RJRDsKKwkgIHRpZCA9IFVQMkFDKHRpZCk7CisJICB0aWQgKys7CisJfSBlbHNlIGlmKElFRUU4MDIxMV9RT1NfSEFTX1NFUShmYykpIHsgLy9Rb1MKKwkgIGhkcl8zYWRkcl9Rb1MgPSAoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHJfUU9TKiloZWFkZXI7CisJICB0aWQgPSBsZTE2X3RvX2NwdShoZHJfM2FkZHJfUW9TLT5RT1NfY3RsKSAmIElFRUU4MDIxMV9RT1NfVElEOworCSAgdGlkID0gVVAyQUModGlkKTsKKwkgIHRpZCArKzsKKwl9IGVsc2UgeyAvLyBubyBRb1MKKwkgIHRpZCA9IDA7CisJfQorCXN3aXRjaCAoaWVlZS0+aXdfbW9kZSkgeworCWNhc2UgSVdfTU9ERV9BREhPQzoKKwl7CisJCXN0cnVjdCBsaXN0X2hlYWQgKnA7CisJCXN0cnVjdCBpZWVlX2lic3Nfc2VxICplbnRyeSA9IE5VTEw7CisJCXU4ICptYWMgPSBoZWFkZXItPmFkZHIyOworCQlpbnQgaW5kZXggPSBtYWNbNV0gJSBJRUVFX0lCU1NfTUFDX0hBU0hfU0laRTsKKwkJLy9mb3IgKHBvcyA9IChoZWFkKS0+bmV4dDsgcG9zICE9IChoZWFkKTsgcG9zID0gcG9zLT5uZXh0KQorCQlfX2xpc3RfZm9yX2VhY2gocCwgJmllZWUtPmlic3NfbWFjX2hhc2hbaW5kZXhdKSB7CisJCQllbnRyeSA9IGxpc3RfZW50cnkocCwgc3RydWN0IGllZWVfaWJzc19zZXEsIGxpc3QpOworCQkJaWYgKCFtZW1jbXAoZW50cnktPm1hYywgbWFjLCBFVEhfQUxFTikpCisJCQkJYnJlYWs7CisJCX0KKwkvLwlpZiAobWVtY21wKGVudHJ5LT5tYWMsIG1hYywgRVRIX0FMRU4pKXsKKwkJaWYgKHAgPT0gJmllZWUtPmlic3NfbWFjX2hhc2hbaW5kZXhdKSB7CisJCQllbnRyeSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpZWVlX2lic3Nfc2VxKSwgR0ZQX0FUT01JQyk7CisJCQlpZiAoIWVudHJ5KSB7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiQ2Fubm90IG1hbGxvYyBuZXcgbWFjIGVudHJ5XG4iKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCW1lbWNweShlbnRyeS0+bWFjLCBtYWMsIEVUSF9BTEVOKTsKKwkJCWVudHJ5LT5zZXFfbnVtW3RpZF0gPSBzZXE7CisJCQllbnRyeS0+ZnJhZ19udW1bdGlkXSA9IGZyYWc7CisJCQllbnRyeS0+cGFja2V0X3RpbWVbdGlkXSA9IGppZmZpZXM7CisJCQlsaXN0X2FkZCgmZW50cnktPmxpc3QsICZpZWVlLT5pYnNzX21hY19oYXNoW2luZGV4XSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlsYXN0X3NlcSA9ICZlbnRyeS0+c2VxX251bVt0aWRdOworCQlsYXN0X2ZyYWcgPSAmZW50cnktPmZyYWdfbnVtW3RpZF07CisJCWxhc3RfdGltZSA9ICZlbnRyeS0+cGFja2V0X3RpbWVbdGlkXTsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBJV19NT0RFX0lORlJBOgorCQlsYXN0X3NlcSA9ICZpZWVlLT5sYXN0X3J4c2VxX251bVt0aWRdOworCQlsYXN0X2ZyYWcgPSAmaWVlZS0+bGFzdF9yeGZyYWdfbnVtW3RpZF07CisJCWxhc3RfdGltZSA9ICZpZWVlLT5sYXN0X3BhY2tldF90aW1lW3RpZF07CisKKwkJYnJlYWs7CisJZGVmYXVsdDoKKyNpZmRlZiBfUlRMODE4N19FWFRfUEFUQ0hfCisJCWlmKGllZWUtPml3X21vZGUgPT0gaWVlZS0+aXdfZXh0X21vZGUpCisJCXsKKwkJCWxhc3Rfc2VxID0gJmllZWUtPmxhc3RfcnhzZXFfbnVtW3RpZF07CisJCQlsYXN0X2ZyYWcgPSAmaWVlZS0+bGFzdF9yeGZyYWdfbnVtW3RpZF07CisJCQlsYXN0X3RpbWUgPSAmaWVlZS0+bGFzdF9wYWNrZXRfdGltZVt0aWRdOworCQkJYnJlYWs7CisJCX0KKwkJZWxzZQorI2VuZGlmCisJCXJldHVybiAwOworCX0KKworLy8JaWYodGlkICE9IDApIHsKKy8vCQlwcmludGsoS0VSTl9XQVJOSU5HICI6KSkpKSkpKSkpKSkleCAleCAleCwgZmMoJXgpXG4iLCB0aWQsICpsYXN0X3NlcSwgc2VxLCBoZWFkZXItPmZyYW1lX2N0bCk7CisvLwl9CisJaWYgKCgqbGFzdF9zZXEgPT0gc2VxKSAmJgorCSAgICB0aW1lX2FmdGVyKCpsYXN0X3RpbWUgKyBJRUVFX1BBQ0tFVF9SRVRSWV9USU1FLCBqaWZmaWVzKSkgeworCQlpZiAoKmxhc3RfZnJhZyA9PSBmcmFnKXsKKwkJCS8vcHJpbnRrKEtFUk5fV0FSTklORyAiWzFdIGdvIGRyb3AhXG4iKTsKKwkJCWdvdG8gZHJvcDsKKworCQl9CisJCWlmICgqbGFzdF9mcmFnICsgMSAhPSBmcmFnKQorCQkJLyogb3V0LW9mLW9yZGVyIGZyYWdtZW50ICovCisJCQkvL3ByaW50ayhLRVJOX1dBUk5JTkcgIlsyXSBnbyBkcm9wIVxuIik7CisJCQlnb3RvIGRyb3A7CisJfSBlbHNlCisJCSpsYXN0X3NlcSA9IHNlcTsKKworCSpsYXN0X2ZyYWcgPSBmcmFnOworCSpsYXN0X3RpbWUgPSBqaWZmaWVzOworCXJldHVybiAwOworCitkcm9wOgorLy8JQlVHX09OKCEoZmMgJiBJRUVFODAyMTFfRkNUTF9SRVRSWSkpOworLy8JcHJpbnRrKCJEVVBcbiIpOworCisJcmV0dXJuIDE7Cit9CisKKworLyogQWxsIHJlY2VpdmVkIGZyYW1lcyBhcmUgc2VudCB0byB0aGlzIGZ1bmN0aW9uLiBAc2tiIGNvbnRhaW5zIHRoZSBmcmFtZSBpbgorICogSUVFRSA4MDIuMTEgZm9ybWF0LCBpLmUuLCBpbiB0aGUgZm9ybWF0IGl0IHdhcyBzZW50IG92ZXIgYWlyLgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgb25seSBhcyBhIHRhc2tsZXQgKHNvZnR3YXJlIElSUSkuICovCitpbnQgaWVlZTgwMjExX3J4KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkgc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0cyAqcnhfc3RhdHMpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGllZWUtPmRldjsKKwkvL3N0cnVjdCByODE4MF9wcml2ICpwcml2ID0gKHN0cnVjdCByODE4MF9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyOworCS8vc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHJfUU9TICpoZHI7CisKKwlzaXplX3QgaGRybGVuOworCXUxNiBmYywgdHlwZSwgc3R5cGUsIHNjOworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0czsKKwl1bnNpZ25lZCBpbnQgZnJhZzsKKwl1OCAqcGF5bG9hZDsKKwl1MTYgZXRoZXJ0eXBlOworI2lmZGVmIE5PVF9ZRVQKKwlzdHJ1Y3QgbmV0X2RldmljZSAqd2RzID0gTlVMTDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiMiA9IE5VTEw7CisJc3RydWN0IG5ldF9kZXZpY2UgKndkcyA9IE5VTEw7CisJaW50IGZyYW1lX2F1dGhvcml6ZWQgPSAwOworCWludCBmcm9tX2Fzc29jX2FwID0gMDsKKwl2b2lkICpzdGEgPSBOVUxMOworI2VuZGlmCisvLwl1MTYgUU9TX2N0bCA9IDA7CisJdTggZHN0W0VUSF9BTEVOXTsKKwl1OCBzcmNbRVRIX0FMRU5dOworCXU4IGJzc2lkW0VUSF9BTEVOXTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEgKmNyeXB0ID0gTlVMTDsKKwlpbnQga2V5aWR4ID0gMDsKKworCS8vQWRkZWQgZm9yIG1lc2ggYnkgTGF3cmVuY2UuCisjaWZkZWYgX1JUTDgxODdfRVhUX1BBVENIXworCXU4IHN0YXR1czsKKwl1MzIgZmxhZ3M7CisjZW5kaWYKKwkvLyBjaGVhdCB0aGUgdGhlIGhkciB0eXBlCisJaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopc2tiLT5kYXRhOworCXN0YXRzID0gJmllZWUtPnN0YXRzOworCisJaWYgKHNrYi0+bGVuIDwgMTApIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFNLQiBsZW5ndGggPCAxMFxuIiwKKwkJICAgICAgIGRldi0+bmFtZSk7CisJCWdvdG8gcnhfZHJvcHBlZDsKKwl9CisKKwlmYyA9IGxlMTZfdG9fY3B1KGhkci0+ZnJhbWVfY3RsKTsKKwl0eXBlID0gV0xBTl9GQ19HRVRfVFlQRShmYyk7CisJc3R5cGUgPSBXTEFOX0ZDX0dFVF9TVFlQRShmYyk7CisJc2MgPSBsZTE2X3RvX2NwdShoZHItPnNlcV9jdGwpOworCisJZnJhZyA9IFdMQU5fR0VUX1NFUV9GUkFHKHNjKTsKKworLy9ZSixhZGQsMDgwODI4LGZvciBrZWVwIGFsaXZlCisJaWYoKGZjICYgSUVFRTgwMjExX0ZDVExfVE9EUykgIT0gSUVFRTgwMjExX0ZDVExfVE9EUykKKwl7CisJCWlmKCFtZW1jbXAoaGRyLT5hZGRyMSxkZXYtPmRldl9hZGRyLCBFVEhfQUxFTikpCisJCXsKKwkJCWllZWUtPk51bVJ4VW5pY2FzdCsrOworCQl9CisJfQorCWVsc2UKKwl7CisJCWlmKCFtZW1jbXAoaGRyLT5hZGRyMywgZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pKQorCQl7CisJCQlpZWVlLT5OdW1SeFVuaWNhc3QrKzsKKwkJfQorCX0KKy8vWUosYWRkLDA4MDgyOCxmb3Iga2VlcCBhbGl2ZSxlbmQKKworI2lmZGVmIF9SVEw4MTg3X0VYVF9QQVRDSF8KKwlpZigoaWVlZS0+aXdfbW9kZSA9PSBpZWVlLT5pd19leHRfbW9kZSkgJiYgKGllZWUtPmV4dF9wYXRjaF9pZWVlODAyMTFfcnhfZnJhbWVfZ2V0X2hkcmxlbikpCisJeworCQloZHJsZW4gPSBpZWVlLT5leHRfcGF0Y2hfaWVlZTgwMjExX3J4X2ZyYW1lX2dldF9oZHJsZW4oaWVlZSwgc2tiKTsKKwkJaWYoc2tiLT5sZW4gPCBoZHJsZW4pCisJCQlnb3RvIHJ4X2Ryb3BwZWQ7CisJfQorCWVsc2UKKyNlbmRpZgorCWhkcmxlbiA9IGllZWU4MDIxMV9nZXRfaGRybGVuKGZjKTsKKworI2lmZGVmIE5PVF9ZRVQKKyNpZiBXSVJFTEVTU19FWFQgPiAxNQorCS8qIFB1dCB0aGlzIGNvZGUgaGVyZSBzbyB0aGF0IHdlIGF2b2lkIGR1cGxpY2F0aW5nIGl0IGluIGFsbAorCSAqIFJ4IHBhdGhzLiAtIEplYW4gSUkgKi8KKyNpZmRlZiBJV19XSVJFTEVTU19TUFkJCS8qIGRlZmluZWQgaW4gaXdfaGFuZGxlci5oICovCisJLyogSWYgc3B5IG1vbml0b3Jpbmcgb24gKi8KKwlpZiAoaWZhY2UtPnNweV9kYXRhLnNweV9udW1iZXIgPiAwKSB7CisJCXN0cnVjdCBpd19xdWFsaXR5IHdzdGF0czsKKwkJd3N0YXRzLmxldmVsID0gcnhfc3RhdHMtPnNpZ25hbDsKKwkJd3N0YXRzLm5vaXNlID0gcnhfc3RhdHMtPm5vaXNlOworCQl3c3RhdHMudXBkYXRlZCA9IDY7CS8qIE5vIHF1YWwgdmFsdWUgKi8KKwkJLyogVXBkYXRlIHNweSByZWNvcmRzICovCisJCXdpcmVsZXNzX3NweV91cGRhdGUoZGV2LCBoZHItPmFkZHIyLCAmd3N0YXRzKTsKKwl9CisjZW5kaWYgLyogSVdfV0lSRUxFU1NfU1BZICovCisjZW5kaWYgLyogV0lSRUxFU1NfRVhUID4gMTUgKi8KKwlob3N0YXBfdXBkYXRlX3J4X3N0YXRzKGxvY2FsLT5hcCwgaGRyLCByeF9zdGF0cyk7CisjZW5kaWYKKworI2lmIFdJUkVMRVNTX0VYVCA+IDE1CisJaWYgKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9NT05JVE9SKSB7CisJCWllZWU4MDIxMV9tb25pdG9yX3J4KGllZWUsIHNrYiwgcnhfc3RhdHMpOworCQlzdGF0cy0+cnhfcGFja2V0cysrOworCQlzdGF0cy0+cnhfYnl0ZXMgKz0gc2tiLT5sZW47CisJCXJldHVybiAxOworCX0KKyNlbmRpZgorCWlmIChpZWVlLT5ob3N0X2RlY3J5cHQpIHsKKwkJaW50IGlkeCA9IDA7CisJCWlmIChza2ItPmxlbiA+PSBoZHJsZW4gKyAzKQorCQkJaWR4ID0gc2tiLT5kYXRhW2hkcmxlbiArIDNdID4+IDY7CisJCWNyeXB0ID0gaWVlZS0+Y3J5cHRbaWR4XTsKKyNpZmRlZiBOT1RfWUVUCisJCXN0YSA9IE5VTEw7CisKKwkJLyogVXNlIHN0YXRpb24gc3BlY2lmaWMga2V5IHRvIG92ZXJyaWRlIGRlZmF1bHQga2V5cyBpZiB0aGUKKwkJICogcmVjZWl2ZXIgYWRkcmVzcyBpcyBhIHVuaWNhc3QgYWRkcmVzcyAoImluZGl2aWR1YWwgUkEiKS4gSWYKKwkJICogYmNyeF9zdGFfa2V5IHBhcmFtZXRlciBpcyBzZXQsIHN0YXRpb24gc3BlY2lmaWMga2V5IGlzIHVzZWQKKwkJICogZXZlbiB3aXRoIGJyb2FkL211bHRpY2FzdCB0YXJnZXRzICh0aGlzIGlzIGFnYWluc3QgSUVFRQorCQkgKiA4MDIuMTEsIGJ1dCBtYWtlcyBpdCBlYXNpZXIgdG8gdXNlIGRpZmZlcmVudCBrZXlzIHdpdGgKKwkJICogc3RhdGlvbnMgdGhhdCBkbyBub3Qgc3VwcG9ydCBXRVAga2V5IG1hcHBpbmcpLiAqLworCisJCWlmICghKGhkci0+YWRkcjFbMF0gJiAweDAxKSB8fCBsb2NhbC0+YmNyeF9zdGFfa2V5KQorCQkJKHZvaWQpIGhvc3RhcF9oYW5kbGVfc3RhX2NyeXB0byhsb2NhbCwgaGRyLCAmY3J5cHQsCisJCQkJCQkJJnN0YSk7CisjZW5kaWYKKworCQkvKiBhbGxvdyBOVUxMIGRlY3J5cHQgdG8gaW5kaWNhdGUgYW4gc3RhdGlvbiBzcGVjaWZpYyBvdmVycmlkZQorCQkgKiBmb3IgZGVmYXVsdCBlbmNyeXB0aW9uICovCisJCWlmIChjcnlwdCAmJiAoY3J5cHQtPm9wcyA9PSBOVUxMIHx8CisJCQkgICAgICBjcnlwdC0+b3BzLT5kZWNyeXB0X21wZHUgPT0gTlVMTCkpCisJCQljcnlwdCA9IE5VTEw7CisKKwkJaWYgKCFjcnlwdCAmJiAoZmMgJiBJRUVFODAyMTFfRkNUTF9XRVApKSB7CisJCQkvKiBUaGlzIHNlZW1zIHRvIGJlIHRyaWdnZXJlZCBieSBzb21lIChtdWx0aWNhc3Q/KQorCQkJICogZnJhbWVzIGZyb20gb3RoZXIgdGhhbiBjdXJyZW50IEJTUywgc28ganVzdCBkcm9wIHRoZQorCQkJICogZnJhbWVzIHNpbGVudGx5IGluc3RlYWQgb2YgZmlsbGluZyBzeXN0ZW0gbG9nIHdpdGgKKwkJCSAqIHRoZXNlIHJlcG9ydHMuICovCisJCQlJRUVFODAyMTFfREVCVUdfRFJPUCgiRGVjcnlwdGlvbiBmYWlsZWQgKG5vdCBzZXQpIgorCQkJCQkgICAgICIgKFNBPSIgTUFDX0ZNVCAiKVxuIiwKKwkJCQkJICAgICBNQUNfQVJHKGhkci0+YWRkcjIpKTsKKwkJCWllZWUtPmllZWVfc3RhdHMucnhfZGlzY2FyZHNfdW5kZWNyeXB0YWJsZSsrOworCQkJZ290byByeF9kcm9wcGVkOworCQl9CisJfQorCisJaWYgKHNrYi0+bGVuIDwgSUVFRTgwMjExX0RBVEFfSERSM19MRU4pCisJCWdvdG8gcnhfZHJvcHBlZDsKKworI2lmZGVmIF9SVEw4MTg3X0VYVF9QQVRDSF8KKwlpZiggaWVlZS0+aXdfbW9kZSA9PSBpZWVlLT5pd19leHRfbW9kZSAmJiBpZWVlLT5leHRfcGF0Y2hfaWVlZTgwMjExX3J4X21ndF91cGRhdGVfZXhwaXJlICkKKwkJaWVlZS0+ZXh0X3BhdGNoX2llZWU4MDIxMV9yeF9tZ3RfdXBkYXRlX2V4cGlyZSggaWVlZSwgc2tiICk7CisjZW5kaWYKKworCS8vIGlmIFFvUyBlbmFibGVkLCBzaG91bGQgY2hlY2sgdGhlIHNlcXVlbmNlIGZvciBlYWNoIG9mIHRoZSBBQworCWlmIChpc19kdXBsaWNhdGVfcGFja2V0KGllZWUsIGhkcikpCisJCWdvdG8gcnhfZHJvcHBlZDsKKworCisJaWYgKHR5cGUgPT0gSUVFRTgwMjExX0ZUWVBFX01HTVQpIHsKKworCSNpZiAwCisJCWlmICggc3R5cGUgPT0gSUVFRTgwMjExX1NUWVBFX0FVVEggJiYKKwkJICAgIGZjICYgSUVFRTgwMjExX0ZDVExfV0VQICYmIGllZWUtPmhvc3RfZGVjcnlwdCAmJgorCQkgICAgKGtleWlkeCA9IGhvc3RhcF9yeF9mcmFtZV9kZWNyeXB0KGllZWUsIHNrYiwgY3J5cHQpKSA8IDApCisJCXsKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogZmFpbGVkIHRvIGRlY3J5cHQgbWdtdDo6YXV0aCAiCisJCQkgICAgICAgImZyb20gIiBNQUNfRk1UICJcbiIsIGRldi0+bmFtZSwKKwkJCSAgICAgICBNQUNfQVJHKGhkci0+YWRkcjIpKTsKKwkJCS8qIFRPRE86IGNvdWxkIGluZm9ybSBob3N0YXBkIGFib3V0IHRoaXMgc28gdGhhdCBpdAorCQkJICogY291bGQgc2VuZCBhdXRoIGZhaWx1cmUgcmVwb3J0ICovCisJCQlnb3RvIHJ4X2Ryb3BwZWQ7CisJCX0KKwkjZW5kaWYKKworCisJCWlmIChpZWVlODAyMTFfcnhfZnJhbWVfbWdtdChpZWVlLCBza2IsIHJ4X3N0YXRzLCB0eXBlLCBzdHlwZSkpCisJCQlnb3RvIHJ4X2Ryb3BwZWQ7CisJCWVsc2UKKwkJCWdvdG8gcnhfZXhpdDsKKwl9CisjaWZkZWYgX1JUTDgxODdfRVhUX1BBVENIXworCWlmKChpZWVlLT5pd19tb2RlID09IGllZWUtPml3X2V4dF9tb2RlKSAmJiBpZWVlLT5leHRfcGF0Y2hfaWVlZTgwMjExX3J4X29uX3J4KQorCXsKKwkJaWYoaWVlZS0+ZXh0X3BhdGNoX2llZWU4MDIxMV9yeF9vbl9yeChpZWVlLCBza2IsIHJ4X3N0YXRzLCB0eXBlLCBzdHlwZSk9PTApCisJCXsKKwkJCWdvdG8gcnhfZXhpdDsKKwkJfQorCX0KKyNlbmRpZgorCisJLyogRGF0YSBmcmFtZSAtIGV4dHJhY3Qgc3JjL2RzdCBhZGRyZXNzZXMgKi8KKwlzd2l0Y2ggKGZjICYgKElFRUU4MDIxMV9GQ1RMX0ZST01EUyB8IElFRUU4MDIxMV9GQ1RMX1RPRFMpKSB7CisJY2FzZSBJRUVFODAyMTFfRkNUTF9GUk9NRFM6CisJCW1lbWNweShkc3QsIGhkci0+YWRkcjEsIEVUSF9BTEVOKTsKKwkJbWVtY3B5KHNyYywgaGRyLT5hZGRyMywgRVRIX0FMRU4pOworCQltZW1jcHkoYnNzaWQsaGRyLT5hZGRyMixFVEhfQUxFTik7CisJCWJyZWFrOworCWNhc2UgSUVFRTgwMjExX0ZDVExfVE9EUzoKKwkJbWVtY3B5KGRzdCwgaGRyLT5hZGRyMywgRVRIX0FMRU4pOworCQltZW1jcHkoc3JjLCBoZHItPmFkZHIyLCBFVEhfQUxFTik7CisJCW1lbWNweShic3NpZCxoZHItPmFkZHIxLEVUSF9BTEVOKTsKKwkJYnJlYWs7CisJY2FzZSBJRUVFODAyMTFfRkNUTF9GUk9NRFMgfCBJRUVFODAyMTFfRkNUTF9UT0RTOgorCQlpZiAoc2tiLT5sZW4gPCBJRUVFODAyMTFfREFUQV9IRFI0X0xFTikKKwkJCWdvdG8gcnhfZHJvcHBlZDsKKwkJbWVtY3B5KGRzdCwgaGRyLT5hZGRyMywgRVRIX0FMRU4pOworCQltZW1jcHkoc3JjLCBoZHItPmFkZHI0LCBFVEhfQUxFTik7CisJCW1lbWNweShic3NpZCwgaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJzc2lkLCBFVEhfQUxFTik7CisJCWJyZWFrOworCWNhc2UgMDoKKwkJbWVtY3B5KGRzdCwgaGRyLT5hZGRyMSwgRVRIX0FMRU4pOworCQltZW1jcHkoc3JjLCBoZHItPmFkZHIyLCBFVEhfQUxFTik7CisJCW1lbWNweShic3NpZCxoZHItPmFkZHIzLEVUSF9BTEVOKTsKKwkJYnJlYWs7CisJfQorCisjaWZkZWYgTk9UX1lFVAorCWlmIChob3N0YXBfcnhfZnJhbWVfd2RzKGllZWUsIGhkciwgZmMsICZ3ZHMpKQorCQlnb3RvIHJ4X2Ryb3BwZWQ7CisJaWYgKHdkcykgeworCQlza2ItPmRldiA9IGRldiA9IHdkczsKKwkJc3RhdHMgPSBob3N0YXBfZ2V0X3N0YXRzKGRldik7CisJfQorCisJaWYgKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9NQVNURVIgJiYgIXdkcyAmJgorCSAgICAoZmMgJiAoSUVFRTgwMjExX0ZDVExfVE9EUyB8IElFRUU4MDIxMV9GQ1RMX0ZST01EUykpID09IElFRUU4MDIxMV9GQ1RMX0ZST01EUyAmJgorCSAgICBpZWVlLT5zdGFkZXYgJiYKKwkgICAgbWVtY21wKGhkci0+YWRkcjIsIGllZWUtPmFzc29jX2FwX2FkZHIsIEVUSF9BTEVOKSA9PSAwKSB7CisJCS8qIEZyYW1lIGZyb20gQlNTSUQgb2YgdGhlIEFQIGZvciB3aGljaCB3ZSBhcmUgYSBjbGllbnQgKi8KKwkJc2tiLT5kZXYgPSBkZXYgPSBpZWVlLT5zdGFkZXY7CisJCXN0YXRzID0gaG9zdGFwX2dldF9zdGF0cyhkZXYpOworCQlmcm9tX2Fzc29jX2FwID0gMTsKKwl9CisjZW5kaWYKKworCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisKKyNpZmRlZiBOT1RfWUVUCisJaWYgKChpZWVlLT5pd19tb2RlID09IElXX01PREVfTUFTVEVSIHx8CisJICAgICBpZWVlLT5pd19tb2RlID09IElXX01PREVfUkVQRUFUKSAmJgorCSAgICAhZnJvbV9hc3NvY19hcCkgeworCQlzd2l0Y2ggKGhvc3RhcF9oYW5kbGVfc3RhX3J4KGllZWUsIGRldiwgc2tiLCByeF9zdGF0cywKKwkJCQkJICAgICB3ZHMgIT0gTlVMTCkpIHsKKwkJY2FzZSBBUF9SWF9DT05USU5VRV9OT1RfQVVUSE9SSVpFRDoKKwkJCWZyYW1lX2F1dGhvcml6ZWQgPSAwOworCQkJYnJlYWs7CisJCWNhc2UgQVBfUlhfQ09OVElOVUU6CisJCQlmcmFtZV9hdXRob3JpemVkID0gMTsKKwkJCWJyZWFrOworCQljYXNlIEFQX1JYX0RST1A6CisJCQlnb3RvIHJ4X2Ryb3BwZWQ7CisJCWNhc2UgQVBfUlhfRVhJVDoKKwkJCWdvdG8gcnhfZXhpdDsKKwkJfQorCX0KKyNlbmRpZgorCisjaWZkZWYgX1JUTDgxODdfRVhUX1BBVENIXworCWlmKChpZWVlLT5pd19tb2RlID09IGllZWUtPml3X2V4dF9tb2RlKSAmJiBpZWVlLT5leHRfcGF0Y2hfaWVlZTgwMjExX3J4X2lzX3ZhbGlkX2ZyYW1lY3RsKQorCXsKKwkJaWYoaWVlZS0+ZXh0X3BhdGNoX2llZWU4MDIxMV9yeF9pc192YWxpZF9mcmFtZWN0bChpZWVlLCBmYywgdHlwZSwgc3R5cGUpPT0wKQorCQkJZ290byByeF9kcm9wcGVkOworCX0KKwllbHNlCisjZW5kaWYKKwkvKiBOdWxsZnVuYyBmcmFtZXMgbWF5IGhhdmUgUFMtYml0IHNldCwgc28gdGhleSBtdXN0IGJlIHBhc3NlZCB0bworCSAqIGhvc3RhcF9oYW5kbGVfc3RhX3J4KCkgYmVmb3JlIGJlaW5nIGRyb3BwZWQgaGVyZS4gKi8KKwlpZiAoc3R5cGUgIT0gSUVFRTgwMjExX1NUWVBFX0RBVEEgJiYKKwkgICAgc3R5cGUgIT0gSUVFRTgwMjExX1NUWVBFX0RBVEFfQ0ZBQ0sgJiYKKwkgICAgc3R5cGUgIT0gSUVFRTgwMjExX1NUWVBFX0RBVEFfQ0ZQT0xMICYmCisJICAgIHN0eXBlICE9IElFRUU4MDIxMV9TVFlQRV9EQVRBX0NGQUNLUE9MTCYmCisJICAgIHN0eXBlICE9IElFRUU4MDIxMV9TVFlQRV9RT1NfREFUQS8vYWRkIGJ5IERhdmlkLDIwMDYuOC40CisJICAgICkgeworCQlpZiAoc3R5cGUgIT0gSUVFRTgwMjExX1NUWVBFX05VTExGVU5DKQorCQkJSUVFRTgwMjExX0RFQlVHX0RST1AoCisJCQkJIlJYOiBkcm9wcGVkIGRhdGEgZnJhbWUgIgorCQkJCSJ3aXRoIG5vIGRhdGEgKHR5cGU9MHglMDJ4LCAiCisJCQkJInN1YnR5cGU9MHglMDJ4LCBsZW49JWQpXG4iLAorCQkJCXR5cGUsIHN0eXBlLCBza2ItPmxlbik7CisJCWdvdG8gcnhfZHJvcHBlZDsKKwl9CisJaWYobWVtY21wKGJzc2lkLGllZWUtPmN1cnJlbnRfbmV0d29yay5ic3NpZCxFVEhfQUxFTikpIHsKKwkJZ290byByeF9kcm9wcGVkOworCX0KKworCWllZWUtPk51bVJ4RGF0YUluUGVyaW9kKys7CisJaWVlZS0+TnVtUnhPa1RvdGFsKys7CisJLyogc2tiOiBoZHIgKyAocG9zc2libHkgZnJhZ21lbnRlZCwgcG9zc2libHkgZW5jcnlwdGVkKSBwYXlsb2FkICovCisKKwlpZiAoaWVlZS0+aG9zdF9kZWNyeXB0ICYmIChmYyAmIElFRUU4MDIxMV9GQ1RMX1dFUCkgJiYKKwkgICAgKGtleWlkeCA9IGllZWU4MDIxMV9yeF9mcmFtZV9kZWNyeXB0KGllZWUsIHNrYiwgY3J5cHQpKSA8IDApCisJCWdvdG8gcnhfZHJvcHBlZDsKKworCWhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKSBza2ItPmRhdGE7CisKKwkvKiBza2I6IGhkciArIChwb3NzaWJseSBmcmFnbWVudGVkKSBwbGFpbnRleHQgcGF5bG9hZCAqLworCS8vIFBSOiBGSVhNRTogaG9zdGFwIGhhcyBhZGRpdGlvbmFsIGNvbmRpdGlvbnMgaW4gdGhlICJpZiIgYmVsb3c6CisJLy8gaWVlZS0+aG9zdF9kZWNyeXB0ICYmIChmYyAmIElFRUU4MDIxMV9GQ1RMX1dFUCkgJiYKKwlpZiAoKGZyYWcgIT0gMCB8fCAoZmMgJiBJRUVFODAyMTFfRkNUTF9NT1JFRlJBR1MpKSkgeworCQlpbnQgZmxlbjsKKwkJc3RydWN0IHNrX2J1ZmYgKmZyYWdfc2tiID0gaWVlZTgwMjExX2ZyYWdfY2FjaGVfZ2V0KGllZWUsIGhkcik7CisJCUlFRUU4MDIxMV9ERUJVR19GUkFHKCJSeCBGcmFnbWVudCByZWNlaXZlZCAoJXUpXG4iLCBmcmFnKTsKKworCQlpZiAoIWZyYWdfc2tiKSB7CisJCQlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX1JYIHwgSUVFRTgwMjExX0RMX0ZSQUcsCisJCQkJCSJSeCBjYW5ub3QgZ2V0IHNrYiBmcm9tIGZyYWdtZW50ICIKKwkJCQkJImNhY2hlIChtb3JlZnJhZz0lZCBzZXE9JXUgZnJhZz0ldSlcbiIsCisJCQkJCShmYyAmIElFRUU4MDIxMV9GQ1RMX01PUkVGUkFHUykgIT0gMCwKKwkJCQkJV0xBTl9HRVRfU0VRX1NFUShzYyksIGZyYWcpOworCQkJZ290byByeF9kcm9wcGVkOworCQl9CisJCWZsZW4gPSBza2ItPmxlbjsKKwkJaWYgKGZyYWcgIT0gMCkKKwkJCWZsZW4gLT0gaGRybGVuOworCisJCWlmIChmcmFnX3NrYi0+dGFpbCArIGZsZW4gPiBmcmFnX3NrYi0+ZW5kKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogaG9zdCBkZWNyeXB0ZWQgYW5kICIKKwkJCSAgICAgICAicmVhc3NlbWJsZWQgZnJhbWUgZGlkIG5vdCBmaXQgc2tiXG4iLAorCQkJICAgICAgIGRldi0+bmFtZSk7CisJCQlpZWVlODAyMTFfZnJhZ19jYWNoZV9pbnZhbGlkYXRlKGllZWUsIGhkcik7CisJCQlnb3RvIHJ4X2Ryb3BwZWQ7CisJCX0KKworCQlpZiAoZnJhZyA9PSAwKSB7CisJCQkvKiBjb3B5IGZpcnN0IGZyYWdtZW50IChpbmNsdWRpbmcgZnVsbCBoZWFkZXJzKSBpbnRvCisJCQkgKiBiZWdpbm5pbmcgb2YgdGhlIGZyYWdtZW50IGNhY2hlIHNrYiAqLworCQkJbWVtY3B5KHNrYl9wdXQoZnJhZ19za2IsIGZsZW4pLCBza2ItPmRhdGEsIGZsZW4pOworCQl9IGVsc2UgeworCQkJLyogYXBwZW5kIGZyYW1lIHBheWxvYWQgdG8gdGhlIGVuZCBvZiB0aGUgZnJhZ21lbnQKKwkJCSAqIGNhY2hlIHNrYiAqLworCQkJbWVtY3B5KHNrYl9wdXQoZnJhZ19za2IsIGZsZW4pLCBza2ItPmRhdGEgKyBoZHJsZW4sCisJCQkgICAgICAgZmxlbik7CisJCX0KKwkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwkJc2tiID0gTlVMTDsKKworCQlpZiAoZmMgJiBJRUVFODAyMTFfRkNUTF9NT1JFRlJBR1MpIHsKKwkJCS8qIG1vcmUgZnJhZ21lbnRzIGV4cGVjdGVkIC0gbGVhdmUgdGhlIHNrYiBpbiBmcmFnbWVudAorCQkJICogY2FjaGUgZm9yIG5vdzsgaXQgd2lsbCBiZSBkZWxpdmVyZWQgdG8gdXBwZXIgbGF5ZXJzCisJCQkgKiBhZnRlciBhbGwgZnJhZ21lbnRzIGhhdmUgYmVlbiByZWNlaXZlZCAqLworCQkJZ290byByeF9leGl0OworCQl9CisKKwkJLyogdGhpcyB3YXMgdGhlIGxhc3QgZnJhZ21lbnQgYW5kIHRoZSBmcmFtZSB3aWxsIGJlCisJCSAqIGRlbGl2ZXJlZCwgc28gcmVtb3ZlIHNrYiBmcm9tIGZyYWdtZW50IGNhY2hlICovCisJCXNrYiA9IGZyYWdfc2tiOworCQloZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKikgc2tiLT5kYXRhOworCQlpZWVlODAyMTFfZnJhZ19jYWNoZV9pbnZhbGlkYXRlKGllZWUsIGhkcik7CisJfQorCisJLyogc2tiOiBoZHIgKyAocG9zc2libGUgcmVhc3NlbWJsZWQpIGZ1bGwgTVNEVSBwYXlsb2FkOyBwb3NzaWJseSBzdGlsbAorCSAqIGVuY3J5cHRlZC9hdXRoZW50aWNhdGVkICovCisJaWYgKGllZWUtPmhvc3RfZGVjcnlwdCAmJiAoZmMgJiBJRUVFODAyMTFfRkNUTF9XRVApICYmCisJICAgIGllZWU4MDIxMV9yeF9mcmFtZV9kZWNyeXB0X21zZHUoaWVlZSwgc2tiLCBrZXlpZHgsIGNyeXB0KSkKKwkJZ290byByeF9kcm9wcGVkOworCisJaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopIHNrYi0+ZGF0YTsKKwlpZiAoY3J5cHQgJiYgIShmYyAmIElFRUU4MDIxMV9GQ1RMX1dFUCkgJiYgIWllZWUtPm9wZW5fd2VwKSB7CisJCWlmICgvKmllZWUtPmllZWU4MDJfMXggJiYqLworCQkgICAgaWVlZTgwMjExX2lzX2VhcG9sX2ZyYW1lKGllZWUsIHNrYiwgaGRybGVuKSkgeworCisjaWZkZWYgQ09ORklHX0lFRUU4MDIxMV9ERUJVRworCQkJLyogcGFzcyB1bmVuY3J5cHRlZCBFQVBPTCBmcmFtZXMgZXZlbiBpZiBlbmNyeXB0aW9uIGlzCisJCQkgKiBjb25maWd1cmVkICovCisJCQlzdHJ1Y3QgZWFwb2wgKmVhcCA9IChzdHJ1Y3QgZWFwb2wgKikoc2tiLT5kYXRhICsKKwkJCQkyNCk7CisJCQlJRUVFODAyMTFfREVCVUdfRUFQKCJSWDogSUVFRSA4MDIuMVggRUFQT0wgZnJhbWU6ICVzXG4iLAorCQkJCQkJZWFwX2dldF90eXBlKGVhcC0+dHlwZSkpOworI2VuZGlmCisJCX0gZWxzZSB7CisJCQlJRUVFODAyMTFfREVCVUdfRFJPUCgKKwkJCQkiZW5jcnlwdGlvbiBjb25maWd1cmVkLCBidXQgUlggIgorCQkJCSJmcmFtZSBub3QgZW5jcnlwdGVkIChTQT0iIE1BQ19GTVQgIilcbiIsCisJCQkJTUFDX0FSRyhoZHItPmFkZHIyKSk7CisJCQlnb3RvIHJ4X2Ryb3BwZWQ7CisJCX0KKwl9CisKKyNpZmRlZiBDT05GSUdfSUVFRTgwMjExX0RFQlVHCisJaWYgKGNyeXB0ICYmICEoZmMgJiBJRUVFODAyMTFfRkNUTF9XRVApICYmCisJICAgIGllZWU4MDIxMV9pc19lYXBvbF9mcmFtZShpZWVlLCBza2IsIGhkcmxlbikpIHsKKwkJCXN0cnVjdCBlYXBvbCAqZWFwID0gKHN0cnVjdCBlYXBvbCAqKShza2ItPmRhdGEgKworCQkJCTI0KTsKKwkJCUlFRUU4MDIxMV9ERUJVR19FQVAoIlJYOiBJRUVFIDgwMi4xWCBFQVBPTCBmcmFtZTogJXNcbiIsCisJCQkJCQllYXBfZ2V0X3R5cGUoZWFwLT50eXBlKSk7CisJfQorI2VuZGlmCisKKwlpZiAoY3J5cHQgJiYgIShmYyAmIElFRUU4MDIxMV9GQ1RMX1dFUCkgJiYgIWllZWUtPm9wZW5fd2VwICYmCisJICAgICFpZWVlODAyMTFfaXNfZWFwb2xfZnJhbWUoaWVlZSwgc2tiLCBoZHJsZW4pKSB7CisJCUlFRUU4MDIxMV9ERUJVR19EUk9QKAorCQkJImRyb3BwZWQgdW5lbmNyeXB0ZWQgUlggZGF0YSAiCisJCQkiZnJhbWUgZnJvbSAiIE1BQ19GTVQKKwkJCSIgKGRyb3BfdW5lbmNyeXB0ZWQ9MSlcbiIsCisJCQlNQUNfQVJHKGhkci0+YWRkcjIpKTsKKwkJZ290byByeF9kcm9wcGVkOworCX0KKy8qCisJaWYoaWVlZTgwMjExX2lzX2VhcG9sX2ZyYW1lKGllZWUsIHNrYiwgaGRybGVuKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJSWDogSUVFRTgwMi4xWCBFUEFPTCBmcmFtZSFcbiIpOworCX0KKyovCisJLyogc2tiOiBoZHIgKyAocG9zc2libGUgcmVhc3NlbWJsZWQpIGZ1bGwgcGxhaW50ZXh0IHBheWxvYWQgKi8KKwlwYXlsb2FkID0gc2tiLT5kYXRhICsgaGRybGVuOworCWV0aGVydHlwZSA9IChwYXlsb2FkWzZdIDw8IDgpIHwgcGF5bG9hZFs3XTsKKworI2lmZGVmIE5PVF9ZRVQKKwkvKiBJZiBJRUVFIDgwMi4xWCBpcyB1c2VkLCBjaGVjayB3aGV0aGVyIHRoZSBwb3J0IGlzIGF1dGhvcml6ZWQgdG8gc2VuZAorCSAqIHRoZSByZWNlaXZlZCBmcmFtZS4gKi8KKwlpZiAoaWVlZS0+aWVlZTgwMl8xeCAmJiBpZWVlLT5pd19tb2RlID09IElXX01PREVfTUFTVEVSKSB7CisJCWlmIChldGhlcnR5cGUgPT0gRVRIX1BfUEFFKSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFJYOiBJRUVFIDgwMi4xWCBmcmFtZVxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUpOworCQkJaWYgKGllZWUtPmhvc3RhcGQgJiYgaWVlZS0+YXBkZXYpIHsKKwkJCQkvKiBTZW5kIElFRUUgODAyLjFYIGZyYW1lcyB0byB0aGUgdXNlcgorCQkJCSAqIHNwYWNlIGRhZW1vbiBmb3IgcHJvY2Vzc2luZyAqLworCQkJCXByaXNtMl9yeF84MDIxMShpZWVlLT5hcGRldiwgc2tiLCByeF9zdGF0cywKKwkJCQkJCVBSSVNNMl9SWF9NR01UKTsKKwkJCQlpZWVlLT5hcGRldnN0YXRzLnJ4X3BhY2tldHMrKzsKKwkJCQlpZWVlLT5hcGRldnN0YXRzLnJ4X2J5dGVzICs9IHNrYi0+bGVuOworCQkJCWdvdG8gcnhfZXhpdDsKKwkJCX0KKwkJfSBlbHNlIGlmICghZnJhbWVfYXV0aG9yaXplZCkgeworCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBkcm9wcGVkIGZyYW1lIGZyb20gIgorCQkJICAgICAgICJ1bmF1dGhvcml6ZWQgcG9ydCAoSUVFRSA4MDIuMVgpOiAiCisJCQkgICAgICAgImV0aGVydHlwZT0weCUwNHhcbiIsCisJCQkgICAgICAgZGV2LT5uYW1lLCBldGhlcnR5cGUpOworCQkJZ290byByeF9kcm9wcGVkOworCQl9CisJfQorI2VuZGlmCisKKyNpZmRlZiBfUlRMODE4N19FWFRfUEFUQ0hfCisJaWYoKGllZWUtPml3X21vZGUgPT0gaWVlZS0+aXdfZXh0X21vZGUpICYmIGllZWUtPmV4dF9wYXRjaF9pZWVlODAyMTFfcnhfcHJvY2Vzc19kYXRhZnJhbWUpCisJeworCS8vQWRkZWQgZm9yIG1lc2ggcnggaW50ZXJydXB0LgorCQkvL3NwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5sb2NrLGZsYWdzKTsKKwkJc3RhdHVzID0gaWVlZS0+ZXh0X3BhdGNoX2llZWU4MDIxMV9yeF9wcm9jZXNzX2RhdGFmcmFtZShpZWVlLCBza2IsIHJ4X3N0YXRzKTsKKwkJLy9zcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5sb2NrLGZsYWdzKTsKKworCQlpZihzdGF0dXMpCisvLwlpZihpZWVlLT5leHRfcGF0Y2hfaWVlZTgwMjExX3J4X3Byb2Nlc3NfZGF0YWZyYW1lKGllZWUsIHNrYiwgcnhfc3RhdHMpKQorCQkJZ290byByeF9leGl0OworCQllbHNlCisJCQlnb3RvIHJ4X2Ryb3BwZWQ7CisJfQorI2VuZGlmCisKKwkvKiBjb252ZXJ0IGhkciArIHBvc3NpYmxlIExMQyBoZWFkZXJzIGludG8gRXRoZXJuZXQgaGVhZGVyICovCisJaWYgKHNrYi0+bGVuIC0gaGRybGVuID49IDggJiYKKwkgICAgKChtZW1jbXAocGF5bG9hZCwgcmZjMTA0Ml9oZWFkZXIsIFNOQVBfU0laRSkgPT0gMCAmJgorCSAgICAgIGV0aGVydHlwZSAhPSBFVEhfUF9BQVJQICYmIGV0aGVydHlwZSAhPSBFVEhfUF9JUFgpIHx8CisJICAgICBtZW1jbXAocGF5bG9hZCwgYnJpZGdlX3R1bm5lbF9oZWFkZXIsIFNOQVBfU0laRSkgPT0gMCkpIHsKKwkJLyogcmVtb3ZlIFJGQzEwNDIgb3IgQnJpZGdlLVR1bm5lbCBlbmNhcHN1bGF0aW9uIGFuZAorCQkgKiByZXBsYWNlIEV0aGVyVHlwZSAqLworCQlza2JfcHVsbChza2IsIGhkcmxlbiArIFNOQVBfU0laRSk7CisJCW1lbWNweShza2JfcHVzaChza2IsIEVUSF9BTEVOKSwgc3JjLCBFVEhfQUxFTik7CisJCW1lbWNweShza2JfcHVzaChza2IsIEVUSF9BTEVOKSwgZHN0LCBFVEhfQUxFTik7CisJfSBlbHNlIHsKKwkJdTE2IGxlbjsKKwkJLyogTGVhdmUgRXRoZXJuZXQgaGVhZGVyIHBhcnQgb2YgaGRyIGFuZCBmdWxsIHBheWxvYWQgKi8KKwkJc2tiX3B1bGwoc2tiLCBoZHJsZW4pOworCQlsZW4gPSBodG9ucyhza2ItPmxlbik7CisJCW1lbWNweShza2JfcHVzaChza2IsIDIpLCAmbGVuLCAyKTsKKwkJbWVtY3B5KHNrYl9wdXNoKHNrYiwgRVRIX0FMRU4pLCBzcmMsIEVUSF9BTEVOKTsKKwkJbWVtY3B5KHNrYl9wdXNoKHNrYiwgRVRIX0FMRU4pLCBkc3QsIEVUSF9BTEVOKTsKKwl9CisKKyNpZmRlZiBOT1RfWUVUCisJaWYgKHdkcyAmJiAoKGZjICYgKElFRUU4MDIxMV9GQ1RMX1RPRFMgfCBJRUVFODAyMTFfRkNUTF9GUk9NRFMpKSA9PQorCQkgICAgSUVFRTgwMjExX0ZDVExfVE9EUykgJiYKKwkgICAgc2tiLT5sZW4gPj0gRVRIX0hMRU4gKyBFVEhfQUxFTikgeworCQkvKiBOb24tc3RhbmRhcmQgZnJhbWU6IGdldCBhZGRyNCBmcm9tIGl0cyBib2d1cyBsb2NhdGlvbiBhZnRlcgorCQkgKiB0aGUgcGF5bG9hZCAqLworCQltZW1jcHkoc2tiLT5kYXRhICsgRVRIX0FMRU4sCisJCSAgICAgICBza2ItPmRhdGEgKyBza2ItPmxlbiAtIEVUSF9BTEVOLCBFVEhfQUxFTik7CisJCXNrYl90cmltKHNrYiwgc2tiLT5sZW4gLSBFVEhfQUxFTik7CisJfQorI2VuZGlmCisKKwlzdGF0cy0+cnhfcGFja2V0cysrOworCXN0YXRzLT5yeF9ieXRlcyArPSBza2ItPmxlbjsKKworI2lmZGVmIE5PVF9ZRVQKKwlpZiAoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX01BU1RFUiAmJiAhd2RzICYmCisJICAgIGllZWUtPmFwLT5icmlkZ2VfcGFja2V0cykgeworCQlpZiAoZHN0WzBdICYgMHgwMSkgeworCQkJLyogY29weSBtdWx0aWNhc3QgZnJhbWUgYm90aCB0byB0aGUgaGlnaGVyIGxheWVycyBhbmQKKwkJCSAqIHRvIHRoZSB3aXJlbGVzcyBtZWRpYSAqLworCQkJaWVlZS0+YXAtPmJyaWRnZWRfbXVsdGljYXN0Kys7CisJCQlza2IyID0gc2tiX2Nsb25lKHNrYiwgR0ZQX0FUT01JQyk7CisJCQlpZiAoc2tiMiA9PSBOVUxMKQorCQkJCXByaW50ayhLRVJOX0RFQlVHICIlczogc2tiX2Nsb25lIGZhaWxlZCBmb3IgIgorCQkJCSAgICAgICAibXVsdGljYXN0IGZyYW1lXG4iLCBkZXYtPm5hbWUpOworCQl9IGVsc2UgaWYgKGhvc3RhcF9pc19zdGFfYXNzb2MoaWVlZS0+YXAsIGRzdCkpIHsKKwkJCS8qIHNlbmQgZnJhbWUgZGlyZWN0bHkgdG8gdGhlIGFzc29jaWF0ZWQgU1RBIHVzaW5nCisJCQkgKiB3aXJlbGVzcyBtZWRpYSBhbmQgbm90IHBhc3NpbmcgdG8gaGlnaGVyIGxheWVycyAqLworCQkJaWVlZS0+YXAtPmJyaWRnZWRfdW5pY2FzdCsrOworCQkJc2tiMiA9IHNrYjsKKwkJCXNrYiA9IE5VTEw7CisJCX0KKwl9CisKKwlpZiAoc2tiMiAhPSBOVUxMKSB7CisJCS8qIHNlbmQgdG8gd2lyZWxlc3MgbWVkaWEgKi8KKwkJc2tiMi0+cHJvdG9jb2wgPSBfX2NvbnN0YW50X2h0b25zKEVUSF9QXzgwMl8zKTsKKwkJc2tiMi0+bWFjLnJhdyA9IHNrYjItPm5oLnJhdyA9IHNrYjItPmRhdGE7CisJCS8qIHNrYjItPm5oLnJhdyA9IHNrYjItPmRhdGEgKyBFVEhfSExFTjsgKi8KKwkJc2tiMi0+ZGV2ID0gZGV2OworCQlkZXZfcXVldWVfeG1pdChza2IyKTsKKwl9CisKKyNlbmRpZgorCWlmIChza2IpIHsKKwkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKKwkJbWVtc2V0KHNrYi0+Y2IsIDAsIHNpemVvZihza2ItPmNiKSk7CisJCXNrYi0+ZGV2ID0gZGV2OworCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7IC8qIDgwMi4xMSBjcmMgbm90IHN1ZmZpY2llbnQgKi8KKwkJaWVlZS0+bGFzdF9yeF9wc190aW1lID0gamlmZmllczsKKwkJbmV0aWZfcngoc2tiKTsKKwl9CisKKyByeF9leGl0OgorI2lmZGVmIE5PVF9ZRVQKKwlpZiAoc3RhKQorCQlob3N0YXBfaGFuZGxlX3N0YV9yZWxlYXNlKHN0YSk7CisjZW5kaWYKKwlyZXR1cm4gMTsKKworIHJ4X2Ryb3BwZWQ6CisJc3RhdHMtPnJ4X2Ryb3BwZWQrKzsKKworCS8qIFJldHVybmluZyAwIGluZGljYXRlcyB0byBjYWxsZXIgdGhhdCB3ZSBoYXZlIG5vdCBoYW5kbGVkIHRoZSBTS0ItLQorCSAqIHNvIGl0IGlzIHN0aWxsIGFsbG9jYXRlZCBhbmQgY2FuIGJlIHVzZWQgYWdhaW4gYnkgdW5kZXJseWluZworCSAqIGhhcmR3YXJlIGFzIGEgRE1BIHRhcmdldCAqLworCXJldHVybiAwOworfQorCisjaWZkZWYgX1JUTDgxODdfRVhUX1BBVENIXworaW50IGllZWVfZXh0X3NrYl9wODAyMTFfdG9fZXRoZXIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGhkcmxlbiwgdTggKmRzdCwgdTggKnNyYykKK3sKKwl1OCAqcGF5bG9hZDsKKwl1MTYgZXRoZXJ0eXBlOworCisJLyogc2tiOiBoZHIgKyAocG9zc2libGUgcmVhc3NlbWJsZWQpIGZ1bGwgcGxhaW50ZXh0IHBheWxvYWQgKi8KKwlwYXlsb2FkID0gc2tiLT5kYXRhICsgaGRybGVuOworCWV0aGVydHlwZSA9IChwYXlsb2FkWzZdIDw8IDgpIHwgcGF5bG9hZFs3XTsKKworCS8qIGNvbnZlcnQgaGRyICsgcG9zc2libGUgTExDIGhlYWRlcnMgaW50byBFdGhlcm5ldCBoZWFkZXIgKi8KKwlpZiAoc2tiLT5sZW4gLSBoZHJsZW4gPj0gOCAmJgorCSAgICAoKG1lbWNtcChwYXlsb2FkLCByZmMxMDQyX2hlYWRlciwgU05BUF9TSVpFKSA9PSAwICYmCisJICAgICAgZXRoZXJ0eXBlICE9IEVUSF9QX0FBUlAgJiYgZXRoZXJ0eXBlICE9IEVUSF9QX0lQWCkgfHwKKwkgICAgIG1lbWNtcChwYXlsb2FkLCBicmlkZ2VfdHVubmVsX2hlYWRlciwgU05BUF9TSVpFKSA9PSAwKSkgeworCQkvKiByZW1vdmUgUkZDMTA0MiBvciBCcmlkZ2UtVHVubmVsIGVuY2Fwc3VsYXRpb24gYW5kCisJCSAqIHJlcGxhY2UgRXRoZXJUeXBlICovCisJCXNrYl9wdWxsKHNrYiwgaGRybGVuICsgU05BUF9TSVpFKTsKKwkJbWVtY3B5KHNrYl9wdXNoKHNrYiwgRVRIX0FMRU4pLCBzcmMsIEVUSF9BTEVOKTsKKwkJbWVtY3B5KHNrYl9wdXNoKHNrYiwgRVRIX0FMRU4pLCBkc3QsIEVUSF9BTEVOKTsKKwl9IGVsc2UgeworCQl1MTYgbGVuOworCQkvKiBMZWF2ZSBFdGhlcm5ldCBoZWFkZXIgcGFydCBvZiBoZHIgYW5kIGZ1bGwgcGF5bG9hZCAqLworCQlza2JfcHVsbChza2IsIGhkcmxlbik7CisJCWxlbiA9IGh0b25zKHNrYi0+bGVuKTsKKwkJbWVtY3B5KHNrYl9wdXNoKHNrYiwgMiksICZsZW4sIDIpOworCQltZW1jcHkoc2tiX3B1c2goc2tiLCBFVEhfQUxFTiksIHNyYywgRVRIX0FMRU4pOworCQltZW1jcHkoc2tiX3B1c2goc2tiLCBFVEhfQUxFTiksIGRzdCwgRVRIX0FMRU4pOworCX0KKworCXJldHVybiAxOworfQorI2VuZGlmIC8vIF9SVEw4MTg3X0VYVF9QQVRDSF8KKworCisjZGVmaW5lIE1HTVRfRlJBTUVfRklYRURfUEFSVF9MRU5HVEgJCTB4MjQKKworc3RhdGljIGlubGluZSBpbnQgaWVlZTgwMjExX2lzX29mZG1fcmF0ZSh1OCByYXRlKQoreworCXN3aXRjaCAocmF0ZSAmIH5JRUVFODAyMTFfQkFTSUNfUkFURV9NQVNLKSB7CisJY2FzZSBJRUVFODAyMTFfT0ZETV9SQVRFXzZNQjoKKwljYXNlIElFRUU4MDIxMV9PRkRNX1JBVEVfOU1COgorCWNhc2UgSUVFRTgwMjExX09GRE1fUkFURV8xMk1COgorCWNhc2UgSUVFRTgwMjExX09GRE1fUkFURV8xOE1COgorCWNhc2UgSUVFRTgwMjExX09GRE1fUkFURV8yNE1COgorCWNhc2UgSUVFRTgwMjExX09GRE1fUkFURV8zNk1COgorCWNhc2UgSUVFRTgwMjExX09GRE1fUkFURV80OE1COgorCWNhc2UgSUVFRTgwMjExX09GRE1fUkFURV81NE1COgorCQlyZXR1cm4gMTsKKwl9CisgICAgICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBpZWVlODAyMTFfU2lnbmFsU3RyZW5ndGhUcmFuc2xhdGUoCisJaW50ICBDdXJyU1MKKwkpCit7CisJaW50IFJldFNTOworCisJLy8gU3RlcCAxLiBTY2FsZSBtYXBwaW5nLgorCWlmKEN1cnJTUyA+PSA3MSAmJiBDdXJyU1MgPD0gMTAwKQorCXsKKwkJUmV0U1MgPSA5MCArICgoQ3VyclNTIC0gNzApIC8gMyk7CisJfQorCWVsc2UgaWYoQ3VyclNTID49IDQxICYmIEN1cnJTUyA8PSA3MCkKKwl7CisJCVJldFNTID0gNzggKyAoKEN1cnJTUyAtIDQwKSAvIDMpOworCX0KKwllbHNlIGlmKEN1cnJTUyA+PSAzMSAmJiBDdXJyU1MgPD0gNDApCisJeworCQlSZXRTUyA9IDY2ICsgKEN1cnJTUyAtIDMwKTsKKwl9CisJZWxzZSBpZihDdXJyU1MgPj0gMjEgJiYgQ3VyclNTIDw9IDMwKQorCXsKKwkJUmV0U1MgPSA1NCArIChDdXJyU1MgLSAyMCk7CisJfQorCWVsc2UgaWYoQ3VyclNTID49IDUgJiYgQ3VyclNTIDw9IDIwKQorCXsKKwkJUmV0U1MgPSA0MiArICgoKEN1cnJTUyAtIDUpICogMikgLyAzKTsKKwl9CisJZWxzZSBpZihDdXJyU1MgPT0gNCkKKwl7CisJCVJldFNTID0gMzY7CisJfQorCWVsc2UgaWYoQ3VyclNTID09IDMpCisJeworCQlSZXRTUyA9IDI3OworCX0KKwllbHNlIGlmKEN1cnJTUyA9PSAyKQorCXsKKwkJUmV0U1MgPSAxODsKKwl9CisJZWxzZSBpZihDdXJyU1MgPT0gMSkKKwl7CisJCVJldFNTID0gOTsKKwl9CisJZWxzZQorCXsKKwkJUmV0U1MgPSBDdXJyU1M7CisJfQorCS8vUlRfVFJBQ0UoQ09NUF9EQkcsIERCR19MT1VELCAoIiMjIyMjIEFmdGVyIE1hcHBpbmc6ICBMYXN0U1M6ICVkLCBDdXJyU1M6ICVkLCBSZXRTUzogJWRcbiIsIExhc3RTUywgQ3VyclNTLCBSZXRTUykpOworCisJLy8gU3RlcCAyLiBTbW9vdGhpbmcuCisKKwkvL1JUX1RSQUNFKENPTVBfREJHLCBEQkdfTE9VRCwgKCIkJCQkJCBBZnRlciBTbW9vdGhpbmc6ICBMYXN0U1M6ICVkLCBDdXJyU1M6ICVkLCBSZXRTUzogJWRcbiIsIExhc3RTUywgQ3VyclNTLCBSZXRTUykpOworCisJcmV0dXJuIFJldFNTOworfQorCisjaWZkZWYgRU5BQkxFX0RPVDExRAorc3RhdGljIGlubGluZSB2b2lkIGllZWU4MDIxMV9leHRyYWN0X2NvdW50cnlfaWUoCisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJc3RydWN0IGllZWU4MDIxMV9pbmZvX2VsZW1lbnQgKmluZm9fZWxlbWVudCwKKwlzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKm5ldHdvcmssCisJdTggKiBhZGRyMgorKQoreworI2lmIDAKKwl1MzIgaSA9IDA7CisJdTggKiBwID0gKHU4KilpbmZvX2VsZW1lbnQtPmRhdGE7CisJcHJpbnRrKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CisJcHJpbnRrKCIlcyBDb3VudHJ5IElFOiIsIG5ldHdvcmstPnNzaWQpOworCWZvcihpPTA7IGk8aW5mb19lbGVtZW50LT5sZW47IGkrKykKKwkJcHJpbnRrKCJcdCUyLjJ4IiwgKihwK2kpKTsKKwlwcmludGsoIlxuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworI2VuZGlmCisJaWYoSVNfRE9UMTFEX0VOQUJMRShpZWVlKSkKKwl7CisJCWlmKGluZm9fZWxlbWVudC0+bGVuIT0gMCkKKwkJeworCQkJbWVtY3B5KG5ldHdvcmstPkNvdW50cnlJZUJ1ZiwgaW5mb19lbGVtZW50LT5kYXRhLCBpbmZvX2VsZW1lbnQtPmxlbik7CisJCQluZXR3b3JrLT5Db3VudHJ5SWVMZW4gPSBpbmZvX2VsZW1lbnQtPmxlbjsKKworCQkJaWYoIUlTX0NPVU5UUllfSUVfVkFMSUQoaWVlZSkpCisJCQl7CisJCQkJRG90MTFkX1VwZGF0ZUNvdW50cnlJZShpZWVlLCBhZGRyMiwgaW5mb19lbGVtZW50LT5sZW4sIGluZm9fZWxlbWVudC0+ZGF0YSk7CisJCQl9CisJCX0KKworCQkvLworCQkvLyAwNzAzMDUsIHJjbmprbzogSSB1cGRhdGUgY291bnRyeSBJRSB3YXRjaCBkb2cgaGVyZSBiZWNhdXNlCisJCS8vIHNvbWUgQVAgKGUuZy4gQ2lzY28gMTI0MikgZG9uJ3QgaW5jbHVkZSBjb3VudHJ5IElFIGluIHRoZWlyCisJCS8vIHByb2JlIHJlc3BvbnNlIGZyYW1lLgorCQkvLworCQlpZihJU19FUVVBTF9DSUVfU1JDKGllZWUsIGFkZHIyKSApCisJCXsKKwkJCVVQREFURV9DSUVfV0FUQ0hET0coaWVlZSk7CisJCX0KKwl9CisKK30KKyNlbmRpZgorCitpbnQKK2llZWU4MDIxMV9UcmFuc2xhdGVUb0RibSgKKwl1bnNpZ25lZCBjaGFyIFNpZ25hbFN0cmVuZ3RoSW5kZXgJLy8gMC0xMDAgaW5kZXguCisJKQoreworCXVuc2lnbmVkIGNoYXIgU2lnbmFsUG93ZXI7IC8vIGluIGRCbS4KKworCS8vIFRyYW5zbGF0ZSB0byBkQm0gKHg9MC41eS05NSkuCisJU2lnbmFsUG93ZXIgPSAoaW50KVNpZ25hbFN0cmVuZ3RoSW5kZXggKiA3IC8gMTA7CisJU2lnbmFsUG93ZXIgLT0gOTU7CisKKwlyZXR1cm4gU2lnbmFsUG93ZXI7Cit9CitpbmxpbmUgaW50IGllZWU4MDIxMV9uZXR3b3JrX2luaXQoCisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJc3RydWN0IGllZWU4MDIxMV9wcm9iZV9yZXNwb25zZSAqYmVhY29uLAorCXN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqbmV0d29yaywKKwlzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzICpzdGF0cykKK3sKKyNpZmRlZiBDT05GSUdfSUVFRTgwMjExX0RFQlVHCisJY2hhciByYXRlc19zdHJbNjRdOworCWNoYXIgKnA7CisjZW5kaWYKKwlzdHJ1Y3QgaWVlZTgwMjExX2luZm9fZWxlbWVudCAqaW5mb19lbGVtZW50OworIAl1MTYgbGVmdDsKKwl1OCBpOworCXNob3J0IG9mZnNldDsKKwl1OCBjdXJSYXRlID0gMCxoT3BSYXRlID0gMCxjdXJSYXRlX2V4ID0gMDsKKworCS8qIFB1bGwgb3V0IGZpeGVkIGZpZWxkIGRhdGEgKi8KKwltZW1jcHkobmV0d29yay0+YnNzaWQsIGJlYWNvbi0+aGVhZGVyLmFkZHIzLCBFVEhfQUxFTik7CisJbmV0d29yay0+Y2FwYWJpbGl0eSA9IGJlYWNvbi0+Y2FwYWJpbGl0eTsKKwluZXR3b3JrLT5sYXN0X3NjYW5uZWQgPSBqaWZmaWVzOworCW5ldHdvcmstPnRpbWVfc3RhbXBbMF0gPSBiZWFjb24tPnRpbWVfc3RhbXBbMF07CisJbmV0d29yay0+dGltZV9zdGFtcFsxXSA9IGJlYWNvbi0+dGltZV9zdGFtcFsxXTsKKwluZXR3b3JrLT5iZWFjb25faW50ZXJ2YWwgPSBiZWFjb24tPmJlYWNvbl9pbnRlcnZhbDsKKwkvKiBXaGVyZSB0byBwdWxsIHRoaXM/IGJlYWNvbi0+bGlzdGVuX2ludGVydmFsOyovCisJbmV0d29yay0+bGlzdGVuX2ludGVydmFsID0gMHgwQTsKKwluZXR3b3JrLT5yYXRlc19sZW4gPSBuZXR3b3JrLT5yYXRlc19leF9sZW4gPSAwOworCW5ldHdvcmstPmxhc3RfYXNzb2NpYXRlID0gMDsKKwluZXR3b3JrLT5zc2lkX2xlbiA9IDA7CisJbmV0d29yay0+ZmxhZ3MgPSAwOworCW5ldHdvcmstPmF0aW1fd2luZG93ID0gMDsKKwluZXR3b3JrLT5Rb1NfRW5hYmxlID0gMDsKKy8vYnkgYW15IDA4MDMxMgorCW5ldHdvcmstPkhpZ2hlc3RPcGVyYVJhdGUgPSAwOworLy9ieSBhbXkgMDgwMzEyCisjaWZkZWYgVEhPTUFTX1RVUkJPCisJbmV0d29yay0+VHVyYm9fRW5hYmxlID0gMDsKKyNlbmRpZgorI2lmZGVmIEVOQUJMRV9ET1QxMUQKKwluZXR3b3JrLT5Db3VudHJ5SWVMZW4gPSAwOworCW1lbXNldChuZXR3b3JrLT5Db3VudHJ5SWVCdWYsIDAsIE1BWF9JRV9MRU4pOworI2VuZGlmCisKKwlpZiAoc3RhdHMtPmZyZXEgPT0gSUVFRTgwMjExXzUyR0haX0JBTkQpIHsKKwkJLyogZm9yIEEgYmFuZCAoTm8gRFMgaW5mbykgKi8KKwkJbmV0d29yay0+Y2hhbm5lbCA9IHN0YXRzLT5yZWNlaXZlZF9jaGFubmVsOworCX0gZWxzZQorCQluZXR3b3JrLT5mbGFncyB8PSBORVRXT1JLX0hBU19DQ0s7CisKKyAJbmV0d29yay0+d3BhX2llX2xlbiA9IDA7CisgCW5ldHdvcmstPnJzbl9pZV9sZW4gPSAwOworCisgCWluZm9fZWxlbWVudCA9ICZiZWFjb24tPmluZm9fZWxlbWVudDsKKwlsZWZ0ID0gc3RhdHMtPmxlbiAtICgodm9pZCAqKWluZm9fZWxlbWVudCAtICh2b2lkICopYmVhY29uKTsKKwl3aGlsZSAobGVmdCA+PSBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9pbmZvX2VsZW1lbnRfaGRyKSkgeworCQlpZiAoc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaW5mb19lbGVtZW50X2hkcikgKyBpbmZvX2VsZW1lbnQtPmxlbiA+IGxlZnQpIHsKKwkJCUlFRUU4MDIxMV9ERUJVR19TQ0FOKCJTQ0FOOiBwYXJzZSBmYWlsZWQ6IGluZm9fZWxlbWVudC0+bGVuICsgMiA+IGxlZnQgOiBpbmZvX2VsZW1lbnQtPmxlbisyPSVkIGxlZnQ9JWQuXG4iLAorCQkJCQkgICAgIGluZm9fZWxlbWVudC0+bGVuICsgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaW5mb19lbGVtZW50KSwKKwkJCQkJICAgICBsZWZ0KTsKKwkJCXJldHVybiAxOworICAgICAgICAgICAgICAgCX0KKworCQlzd2l0Y2ggKGluZm9fZWxlbWVudC0+aWQpIHsKKwkJY2FzZSBNRklFX1RZUEVfU1NJRDoKKwkJCWlmIChpZWVlODAyMTFfaXNfZW1wdHlfZXNzaWQoaW5mb19lbGVtZW50LT5kYXRhLAorCQkJCQkJICAgICBpbmZvX2VsZW1lbnQtPmxlbikpIHsKKwkJCQluZXR3b3JrLT5mbGFncyB8PSBORVRXT1JLX0VNUFRZX0VTU0lEOworCQkJCWJyZWFrOworCQkJfQorCisJCQluZXR3b3JrLT5zc2lkX2xlbiA9IG1pbihpbmZvX2VsZW1lbnQtPmxlbiwKKwkJCQkJCSh1OClJV19FU1NJRF9NQVhfU0laRSk7CisJCQltZW1jcHkobmV0d29yay0+c3NpZCwgaW5mb19lbGVtZW50LT5kYXRhLCBuZXR3b3JrLT5zc2lkX2xlbik7CisgICAgICAgIAkJaWYgKG5ldHdvcmstPnNzaWRfbGVuIDwgSVdfRVNTSURfTUFYX1NJWkUpCisgICAgICAgICAgICAgICAgCQltZW1zZXQobmV0d29yay0+c3NpZCArIG5ldHdvcmstPnNzaWRfbGVuLCAwLAorCQkJCSAgICAgICBJV19FU1NJRF9NQVhfU0laRSAtIG5ldHdvcmstPnNzaWRfbGVuKTsKKworCQkJSUVFRTgwMjExX0RFQlVHX1NDQU4oIk1GSUVfVFlQRV9TU0lEOiAnJXMnIGxlbj0lZC5cbiIsCisJCQkJCSAgICAgbmV0d29yay0+c3NpZCwgbmV0d29yay0+c3NpZF9sZW4pOworCQkJYnJlYWs7CisKKwkJY2FzZSBNRklFX1RZUEVfUkFURVM6CisjaWZkZWYgQ09ORklHX0lFRUU4MDIxMV9ERUJVRworCQkJcCA9IHJhdGVzX3N0cjsKKyNlbmRpZgorCQkJbmV0d29yay0+cmF0ZXNfbGVuID0gbWluKGluZm9fZWxlbWVudC0+bGVuLCBNQVhfUkFURVNfTEVOR1RIKTsKKwkJCWZvciAoaSA9IDA7IGkgPCBuZXR3b3JrLT5yYXRlc19sZW47IGkrKykgeworCQkJCW5ldHdvcmstPnJhdGVzW2ldID0gaW5mb19lbGVtZW50LT5kYXRhW2ldOworCQkJCWN1clJhdGUgPSBuZXR3b3JrLT5yYXRlc1tpXSAmIDB4N2Y7CisJCQkJaWYoIGhPcFJhdGUgPCBjdXJSYXRlICkKKwkJCQkJaE9wUmF0ZSA9IGN1clJhdGU7CisjaWZkZWYgQ09ORklHX0lFRUU4MDIxMV9ERUJVRworCQkJCXAgKz0gc25wcmludGYocCwgc2l6ZW9mKHJhdGVzX3N0cikgLSAocCAtIHJhdGVzX3N0ciksICIlMDJYICIsIG5ldHdvcmstPnJhdGVzW2ldKTsKKyNlbmRpZgorCQkJCWlmIChpZWVlODAyMTFfaXNfb2ZkbV9yYXRlKGluZm9fZWxlbWVudC0+ZGF0YVtpXSkpIHsKKwkJCQkJbmV0d29yay0+ZmxhZ3MgfD0gTkVUV09SS19IQVNfT0ZETTsKKwkJCQkJaWYgKGluZm9fZWxlbWVudC0+ZGF0YVtpXSAmCisJCQkJCSAgICBJRUVFODAyMTFfQkFTSUNfUkFURV9NQVNLKQorCQkJCQkJbmV0d29yay0+ZmxhZ3MgJj0KKwkJCQkJCQl+TkVUV09SS19IQVNfQ0NLOworCQkJCX0KKwkJCX0KKworCQkJSUVFRTgwMjExX0RFQlVHX1NDQU4oIk1GSUVfVFlQRV9SQVRFUzogJyVzJyAoJWQpXG4iLAorCQkJCQkgICAgIHJhdGVzX3N0ciwgbmV0d29yay0+cmF0ZXNfbGVuKTsKKwkJCWJyZWFrOworCisJCWNhc2UgTUZJRV9UWVBFX1JBVEVTX0VYOgorI2lmZGVmIENPTkZJR19JRUVFODAyMTFfREVCVUcKKwkJCXAgPSByYXRlc19zdHI7CisjZW5kaWYKKwkJCW5ldHdvcmstPnJhdGVzX2V4X2xlbiA9IG1pbihpbmZvX2VsZW1lbnQtPmxlbiwgTUFYX1JBVEVTX0VYX0xFTkdUSCk7CisJCQlmb3IgKGkgPSAwOyBpIDwgbmV0d29yay0+cmF0ZXNfZXhfbGVuOyBpKyspIHsKKwkJCQluZXR3b3JrLT5yYXRlc19leFtpXSA9IGluZm9fZWxlbWVudC0+ZGF0YVtpXTsKKwkJCQljdXJSYXRlX2V4ID0gbmV0d29yay0+cmF0ZXNfZXhbaV0gJiAweDdmOworCQkJCWlmKCBoT3BSYXRlIDwgY3VyUmF0ZV9leCApCisJCQkJCWhPcFJhdGUgPSBjdXJSYXRlX2V4OworI2lmZGVmIENPTkZJR19JRUVFODAyMTFfREVCVUcKKwkJCQlwICs9IHNucHJpbnRmKHAsIHNpemVvZihyYXRlc19zdHIpIC0gKHAgLSByYXRlc19zdHIpLCAiJTAyWCAiLCBuZXR3b3JrLT5yYXRlc1tpXSk7CisjZW5kaWYKKwkJCQlpZiAoaWVlZTgwMjExX2lzX29mZG1fcmF0ZShpbmZvX2VsZW1lbnQtPmRhdGFbaV0pKSB7CisJCQkJCW5ldHdvcmstPmZsYWdzIHw9IE5FVFdPUktfSEFTX09GRE07CisJCQkJCWlmIChpbmZvX2VsZW1lbnQtPmRhdGFbaV0gJgorCQkJCQkgICAgSUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSykKKwkJCQkJCW5ldHdvcmstPmZsYWdzICY9CisJCQkJCQkJfk5FVFdPUktfSEFTX0NDSzsKKwkJCQl9CisJCQl9CisKKwkJCUlFRUU4MDIxMV9ERUJVR19TQ0FOKCJNRklFX1RZUEVfUkFURVNfRVg6ICclcycgKCVkKVxuIiwKKwkJCQkJICAgICByYXRlc19zdHIsIG5ldHdvcmstPnJhdGVzX2V4X2xlbik7CisJCQlicmVhazsKKworCQljYXNlIE1GSUVfVFlQRV9EU19TRVQ6CisgIAkJCUlFRUU4MDIxMV9ERUJVR19TQ0FOKCJNRklFX1RZUEVfRFNfU0VUOiAlZFxuIiwKKwkJCQkJICAgICBpbmZvX2VsZW1lbnQtPmRhdGFbMF0pOworCQkJaWYgKHN0YXRzLT5mcmVxID09IElFRUU4MDIxMV8yNEdIWl9CQU5EKQorCQkJCW5ldHdvcmstPmNoYW5uZWwgPSBpbmZvX2VsZW1lbnQtPmRhdGFbMF07CisJCQlicmVhazsKKworCSAJY2FzZSBNRklFX1RZUEVfRkhfU0VUOgorICAJCQlJRUVFODAyMTFfREVCVUdfU0NBTigiTUZJRV9UWVBFX0ZIX1NFVDogaWdub3JlZFxuIik7CisJCQlicmVhazsKKworCQljYXNlIE1GSUVfVFlQRV9DRl9TRVQ6CisJCQlJRUVFODAyMTFfREVCVUdfU0NBTigiTUZJRV9UWVBFX0NGX1NFVDogaWdub3JlZFxuIik7CisJCQlicmVhazsKKworCQljYXNlIE1GSUVfVFlQRV9USU06CisKKwkJCWlmKGluZm9fZWxlbWVudC0+bGVuIDwgNCkKKwkJCQlicmVhazsKKworCQkJbmV0d29yay0+ZHRpbV9wZXJpb2QgPSBpbmZvX2VsZW1lbnQtPmRhdGFbMV07CisKKwkJCWlmKGllZWUtPnN0YXRlICE9IElFRUU4MDIxMV9MSU5LRUQpCisJCQkJYnJlYWs7CisjaWYgMAorCQkJbmV0d29yay0+bGFzdF9kdGltX3N0YV90aW1lWzBdID0gc3RhdHMtPm1hY190aW1lWzBdOworI2Vsc2UKKwkJCW5ldHdvcmstPmxhc3RfZHRpbV9zdGFfdGltZVswXSA9IGppZmZpZXM7CisjZW5kaWYKKwkJCW5ldHdvcmstPmxhc3RfZHRpbV9zdGFfdGltZVsxXSA9IHN0YXRzLT5tYWNfdGltZVsxXTsKKworCQkJbmV0d29yay0+ZHRpbV9kYXRhID0gSUVFRTgwMjExX0RUSU1fVkFMSUQ7CisKKwkJCWlmKGluZm9fZWxlbWVudC0+ZGF0YVswXSAhPSAwKQorCQkJCWJyZWFrOworCisJCQlpZihpbmZvX2VsZW1lbnQtPmRhdGFbMl0gJiAxKQorCQkJCW5ldHdvcmstPmR0aW1fZGF0YSB8PSBJRUVFODAyMTFfRFRJTV9NQkNBU1Q7CisKKwkJCW9mZnNldCA9IChpbmZvX2VsZW1lbnQtPmRhdGFbMl0gPj4gMSkqMjsKKworCQkJLy9wcmludGsoIm9mZnNldDE6JXggYWlkOiV4XG4iLG9mZnNldCwgaWVlZS0+YXNzb2NfaWQpOworCisJCQkvKiBhZGQgYW5kIG1vZGlmaWVkIGZvciBwcyAyMDA4LjEuMjIgKi8KKwkJCWlmKGllZWUtPmFzc29jX2lkIDwgOCpvZmZzZXQgfHwKKwkJCQlpZWVlLT5hc3NvY19pZCA+IDgqKG9mZnNldCArIGluZm9fZWxlbWVudC0+bGVuIC0zKSkgeworCQkJCWJyZWFrOworCQkJfQorCisJCQlvZmZzZXQgPSAoaWVlZS0+YXNzb2NfaWQvOCkgLSBvZmZzZXQ7Ly8gKyAoKGFpZCAlIDgpPyAwIDogMSkgOworCisJCS8vCXByaW50aygib2Zmc2V0OiV4IGRhdGE6JXgsIHVjYXN0OiVkXG4iLCBvZmZzZXQsCisJCQkvLwlpbmZvX2VsZW1lbnQtPmRhdGFbMytvZmZzZXRdICwKKwkJCS8vCWluZm9fZWxlbWVudC0+ZGF0YVszK29mZnNldF0gJiAoMTw8KGllZWUtPmFzc29jX2lkJTgpKSk7CisKKwkJCWlmKGluZm9fZWxlbWVudC0+ZGF0YVszK29mZnNldF0gJiAoMTw8KGllZWUtPmFzc29jX2lkJTgpKSkgeworCQkJCW5ldHdvcmstPmR0aW1fZGF0YSB8PSBJRUVFODAyMTFfRFRJTV9VQ0FTVDsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgTUZJRV9UWVBFX0lCU1NfU0VUOgorCQkJSUVFRTgwMjExX0RFQlVHX1NDQU4oIk1GSUVfVFlQRV9JQlNTX1NFVDogaWdub3JlZFxuIik7CisJCQlicmVhazsKKworCQljYXNlIE1GSUVfVFlQRV9DSEFMTEVOR0U6CisJCQlJRUVFODAyMTFfREVCVUdfU0NBTigiTUZJRV9UWVBFX0NIQUxMRU5HRTogaWdub3JlZFxuIik7CisJCQlicmVhazsKKworCQljYXNlIE1GSUVfVFlQRV9HRU5FUklDOgorCQkJLy9uaWMgaXMgODdCCisJCQlJRUVFODAyMTFfREVCVUdfU0NBTigiTUZJRV9UWVBFX0dFTkVSSUM6ICVkIGJ5dGVzXG4iLAorCQkJCQkgICAgIGluZm9fZWxlbWVudC0+bGVuKTsKKwkJCWlmIChpbmZvX2VsZW1lbnQtPmxlbiA+PSA0ICAmJgorCQkJICAgIGluZm9fZWxlbWVudC0+ZGF0YVswXSA9PSAweDAwICYmCisJCQkgICAgaW5mb19lbGVtZW50LT5kYXRhWzFdID09IDB4NTAgJiYKKwkJCSAgICBpbmZvX2VsZW1lbnQtPmRhdGFbMl0gPT0gMHhmMiAmJgorCQkJICAgIGluZm9fZWxlbWVudC0+ZGF0YVszXSA9PSAweDAxKSB7CisJCQkJbmV0d29yay0+d3BhX2llX2xlbiA9IG1pbihpbmZvX2VsZW1lbnQtPmxlbiArIDIsCisJCQkJCQkJIE1BWF9XUEFfSUVfTEVOKTsKKwkJCQltZW1jcHkobmV0d29yay0+d3BhX2llLCBpbmZvX2VsZW1lbnQsCisJCQkJICAgICAgIG5ldHdvcmstPndwYV9pZV9sZW4pOworCQkJfQorCisjaWZkZWYgVEhPTUFTX1RVUkJPCisJCQlpZiAoaW5mb19lbGVtZW50LT5sZW4gPT0gNyAmJgorCQkJICAgIGluZm9fZWxlbWVudC0+ZGF0YVswXSA9PSAweDAwICYmCisJCQkgICAgaW5mb19lbGVtZW50LT5kYXRhWzFdID09IDB4ZTAgJiYKKwkJCSAgICBpbmZvX2VsZW1lbnQtPmRhdGFbMl0gPT0gMHg0YyAmJgorCQkJICAgIGluZm9fZWxlbWVudC0+ZGF0YVszXSA9PSAweDAxICYmCisJCQkgICAgaW5mb19lbGVtZW50LT5kYXRhWzRdID09IDB4MDIpIHsKKwkJCQluZXR3b3JrLT5UdXJib19FbmFibGUgPSAxOworCQkJfQorI2VuZGlmCisJCQlpZiAoMSA9PSBzdGF0cy0+bmljX3R5cGUpIHsvL25pYyA4NworCQkJCWJyZWFrOworCQkJfQorCisJCQlpZiAoaW5mb19lbGVtZW50LT5sZW4gPj0gNSAgJiYKKwkJCSAgICBpbmZvX2VsZW1lbnQtPmRhdGFbMF0gPT0gMHgwMCAmJgorCQkJICAgIGluZm9fZWxlbWVudC0+ZGF0YVsxXSA9PSAweDUwICYmCisJCQkgICAgaW5mb19lbGVtZW50LT5kYXRhWzJdID09IDB4ZjIgJiYKKwkJCSAgICBpbmZvX2VsZW1lbnQtPmRhdGFbM10gPT0gMHgwMiAmJgorCQkJICAgIGluZm9fZWxlbWVudC0+ZGF0YVs0XSA9PSAweDAwKSB7CisJCQkJLy9wcmludGsoS0VSTl9XQVJOSU5HICJ3bW0gaW5mbyB1cGRhdGVkOiAleFxuIiwgaW5mb19lbGVtZW50LT5kYXRhWzZdKTsKKwkJCQkvL1dNTSBJbmZvcm1hdGlvbiBFbGVtZW50CisJCQkJbmV0d29yay0+d21tX2luZm8gPSBpbmZvX2VsZW1lbnQtPmRhdGFbNl07CisJCQkJbmV0d29yay0+UW9TX0VuYWJsZSA9IDE7CisJCQl9CisKKwkJCWlmIChpbmZvX2VsZW1lbnQtPmxlbiA+PSA4ICAmJgorCQkJICAgIGluZm9fZWxlbWVudC0+ZGF0YVswXSA9PSAweDAwICYmCisJCQkgICAgaW5mb19lbGVtZW50LT5kYXRhWzFdID09IDB4NTAgJiYKKwkJCSAgICBpbmZvX2VsZW1lbnQtPmRhdGFbMl0gPT0gMHhmMiAmJgorCQkJICAgIGluZm9fZWxlbWVudC0+ZGF0YVszXSA9PSAweDAyICYmCisJCQkgICAgaW5mb19lbGVtZW50LT5kYXRhWzRdID09IDB4MDEpIHsKKwkJCQkvLyBOb3QgY2FyZSBhYm91dCB2ZXJzaW9uIGF0IHByZXNlbnQuCisJCQkJLy9XTU0gSW5mb3JtYXRpb24gRWxlbWVudAorCQkJCS8vcHJpbnRrKEtFUk5fV0FSTklORyAid21tIGluZm8mcGFyYW0gdXBkYXRlZDogJXhcbiIsIGluZm9fZWxlbWVudC0+ZGF0YVs2XSk7CisJCQkJbmV0d29yay0+d21tX2luZm8gPSBpbmZvX2VsZW1lbnQtPmRhdGFbNl07CisJCQkJLy9XTU0gUGFyYW1ldGVyIEVsZW1lbnQKKwkJCQltZW1jcHkobmV0d29yay0+d21tX3BhcmFtLCAodTggKikoaW5mb19lbGVtZW50LT5kYXRhICsgOCksKGluZm9fZWxlbWVudC0+bGVuIC0gOCkpOworCQkJCW5ldHdvcmstPlFvU19FbmFibGUgPSAxOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBNRklFX1RZUEVfUlNOOgorCQkJSUVFRTgwMjExX0RFQlVHX1NDQU4oIk1GSUVfVFlQRV9SU046ICVkIGJ5dGVzXG4iLAorCQkJCQkgICAgIGluZm9fZWxlbWVudC0+bGVuKTsKKwkJCW5ldHdvcmstPnJzbl9pZV9sZW4gPSBtaW4oaW5mb19lbGVtZW50LT5sZW4gKyAyLAorCQkJCQkJIE1BWF9XUEFfSUVfTEVOKTsKKwkJCW1lbWNweShuZXR3b3JrLT5yc25faWUsIGluZm9fZWxlbWVudCwKKwkJCSAgICAgICBuZXR3b3JrLT5yc25faWVfbGVuKTsKKwkJCWJyZWFrOworI2lmZGVmIEVOQUJMRV9ET1QxMUQKKwkJY2FzZSBNRklFX1RZUEVfQ09VTlRSWToKKwkJCUlFRUU4MDIxMV9ERUJVR19TQ0FOKCJNRklFX1RZUEVfQ09VTlRSWTogJWQgYnl0ZXNcbiIsCisJCQkJCSAgICAgaW5mb19lbGVtZW50LT5sZW4pOworLy8JCQlwcmludGsoIj09PT09PlJlY2VpdmUgPCVzPiBDb3VudHJ5IElFXG4iLG5ldHdvcmstPnNzaWQpOworCQkJaWVlZTgwMjExX2V4dHJhY3RfY291bnRyeV9pZShpZWVlLCBpbmZvX2VsZW1lbnQsIG5ldHdvcmssIGJlYWNvbi0+aGVhZGVyLmFkZHIyKTsKKwkJCWJyZWFrOworI2VuZGlmCisJCWRlZmF1bHQ6CisJCQlJRUVFODAyMTFfREVCVUdfU0NBTigidW5zdXBwb3J0ZWQgSUUgJWRcbiIsCisJCQkJCSAgICAgaW5mb19lbGVtZW50LT5pZCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgCQl9CisKKwkJbGVmdCAtPSBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9pbmZvX2VsZW1lbnRfaGRyKSArCisJCQlpbmZvX2VsZW1lbnQtPmxlbjsKKwkJaW5mb19lbGVtZW50ID0gKHN0cnVjdCBpZWVlODAyMTFfaW5mb19lbGVtZW50ICopCisgICAgICAgICAgICAgICAgCSZpbmZvX2VsZW1lbnQtPmRhdGFbaW5mb19lbGVtZW50LT5sZW5dOworICAJfQorLy9ieSBhbXkgMDgwMzEyCisJbmV0d29yay0+SGlnaGVzdE9wZXJhUmF0ZSA9IGhPcFJhdGU7CisvL2J5IGFteSAwODAzMTIKKwluZXR3b3JrLT5tb2RlID0gMDsKKwlpZiAoc3RhdHMtPmZyZXEgPT0gSUVFRTgwMjExXzUyR0haX0JBTkQpCisJCW5ldHdvcmstPm1vZGUgPSBJRUVFX0E7CisJZWxzZSB7CisJCWlmIChuZXR3b3JrLT5mbGFncyAmIE5FVFdPUktfSEFTX09GRE0pCisJCQluZXR3b3JrLT5tb2RlIHw9IElFRUVfRzsKKwkJaWYgKG5ldHdvcmstPmZsYWdzICYgTkVUV09SS19IQVNfQ0NLKQorCQkJbmV0d29yay0+bW9kZSB8PSBJRUVFX0I7CisJfQorCisJaWYgKG5ldHdvcmstPm1vZGUgPT0gMCkgeworCQlJRUVFODAyMTFfREVCVUdfU0NBTigiRmlsdGVyZWQgb3V0ICclcyAoIiBNQUNfRk1UICIpJyAiCisJCQkJICAgICAibmV0d29yay5cbiIsCisJCQkJICAgICBlc2NhcGVfZXNzaWQobmV0d29yay0+c3NpZCwKKwkJCQkJCSAgbmV0d29yay0+c3NpZF9sZW4pLAorCQkJCSAgICAgTUFDX0FSRyhuZXR3b3JrLT5ic3NpZCkpOworCQlyZXR1cm4gMTsKKwl9CisKKwlpZiAoaWVlZTgwMjExX2lzX2VtcHR5X2Vzc2lkKG5ldHdvcmstPnNzaWQsIG5ldHdvcmstPnNzaWRfbGVuKSkKKwkJbmV0d29yay0+ZmxhZ3MgfD0gTkVUV09SS19FTVBUWV9FU1NJRDsKKyNpZiAwCisJc3RhdHMtPnNpZ25hbCA9IGllZWU4MDIxMV9TaWduYWxTdHJlbmd0aFRyYW5zbGF0ZShzdGF0cy0+c2lnbmFsKTsKKyNlbmRpZgorCXN0YXRzLT5zaWduYWwgPSBpZWVlODAyMTFfVHJhbnNsYXRlVG9EYm0oc3RhdHMtPnNpZ25hbHN0cmVuZ3RoKTsKKwkvL3N0YXRzLT5ub2lzZSA9IHN0YXRzLT5zaWduYWwgLSBzdGF0cy0+bm9pc2U7CisJc3RhdHMtPm5vaXNlID0gaWVlZTgwMjExX1RyYW5zbGF0ZVRvRGJtKDEwMCAtIHN0YXRzLT5zaWduYWxzdHJlbmd0aCkgLSAyNTsKKwltZW1jcHkoJm5ldHdvcmstPnN0YXRzLCBzdGF0cywgc2l6ZW9mKG5ldHdvcmstPnN0YXRzKSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgaXNfc2FtZV9uZXR3b3JrKHN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqc3JjLAorCQkJCSAgc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpkc3QsCisJCQkJICBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqIGllZWUpCit7CisJLyogQSBuZXR3b3JrIGlzIG9ubHkgYSBkdXBsaWNhdGUgaWYgdGhlIGNoYW5uZWwsIEJTU0lELCBFU1NJRAorCSAqIGFuZCB0aGUgY2FwYWJpbGl0eSBmaWVsZCAoaW4gcGFydGljdWxhciBJQlNTIGFuZCBCU1MpIGFsbCBtYXRjaC4KKwkgKiBXZSB0cmVhdCBhbGwgPGhpZGRlbj4gd2l0aCB0aGUgc2FtZSBCU1NJRCBhbmQgY2hhbm5lbAorCSAqIGFzIG9uZSBuZXR3b3JrICovCisJcmV0dXJuICgoKHNyYy0+c3NpZF9sZW4gPT0gZHN0LT5zc2lkX2xlbikgfHwgKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9JTkZSQSkpICYmICAvL1lKLG1vZCwwODA4MTksZm9yIGhpZGRlbiBhcAorCQkvLygoc3JjLT5zc2lkX2xlbiA9PSBkc3QtPnNzaWRfbGVuKSAmJgorCQkoc3JjLT5jaGFubmVsID09IGRzdC0+Y2hhbm5lbCkgJiYKKwkJIW1lbWNtcChzcmMtPmJzc2lkLCBkc3QtPmJzc2lkLCBFVEhfQUxFTikgJiYKKwkJKCFtZW1jbXAoc3JjLT5zc2lkLCBkc3QtPnNzaWQsIHNyYy0+c3NpZF9sZW4pIHx8IChpZWVlLT5pd19tb2RlID09IElXX01PREVfSU5GUkEpKSAmJiAvL1lKLG1vZCwwODA4MTksZm9yIGhpZGRlbiBhcAorCQkvLyFtZW1jbXAoc3JjLT5zc2lkLCBkc3QtPnNzaWQsIHNyYy0+c3NpZF9sZW4pICYmCisJCSgoc3JjLT5jYXBhYmlsaXR5ICYgV0xBTl9DQVBBQklMSVRZX0lCU1MpID09CisJCShkc3QtPmNhcGFiaWxpdHkgJiBXTEFOX0NBUEFCSUxJVFlfSUJTUykpICYmCisJCSgoc3JjLT5jYXBhYmlsaXR5ICYgV0xBTl9DQVBBQklMSVRZX0JTUykgPT0KKwkJKGRzdC0+Y2FwYWJpbGl0eSAmIFdMQU5fQ0FQQUJJTElUWV9CU1MpKSk7Cit9CisKK2lubGluZSB2b2lkIHVwZGF0ZV9uZXR3b3JrKHN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqZHN0LAorCQkJCSAgc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpzcmMpCit7CisJdW5zaWduZWQgY2hhciBxdWFsaXR5ID0gc3JjLT5zdGF0cy5zaWduYWxzdHJlbmd0aDsKKwl1bnNpZ25lZCBjaGFyIHNpZ25hbCA9IDA7CisJdW5zaWduZWQgY2hhciBub2lzZSA9IDA7CisgICAgICAgIGlmKGRzdC0+c3RhdHMuc2lnbmFsc3RyZW5ndGggPiAwKSB7CisgICAgICAgICAgICAgICAgcXVhbGl0eSA9IChkc3QtPnN0YXRzLnNpZ25hbHN0cmVuZ3RoICogNSArIHNyYy0+c3RhdHMuc2lnbmFsc3RyZW5ndGggKyA1KS82OworICAgICAgICB9CisJc2lnbmFsID0gaWVlZTgwMjExX1RyYW5zbGF0ZVRvRGJtKHF1YWxpdHkpOworCS8vbm9pc2UgPSBzaWduYWwgLSBzcmMtPnN0YXRzLm5vaXNlOworCWlmKGRzdC0+c3RhdHMubm9pc2UgPiAwKQorCQlub2lzZSA9IChkc3QtPnN0YXRzLm5vaXNlICogNSArIHNyYy0+c3RhdHMubm9pc2UpLzY7CisgICAgICAgIC8vaWYoc3RyY21wKGRzdC0+c3NpZCwgImxpbmtzeXNfbHptMDAwIikgPT0gMCkKKy8vCXByaW50aygic3NpZDolcywgcXVhbGl0eTolZCwgc2lnbmFsOiVkXG4iLCBkc3QtPnNzaWQsIHF1YWxpdHksIHNpZ25hbCk7CisJbWVtY3B5KCZkc3QtPnN0YXRzLCAmc3JjLT5zdGF0cywgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHMpKTsKKwlkc3QtPnN0YXRzLnNpZ25hbHN0cmVuZ3RoID0gcXVhbGl0eTsKKwlkc3QtPnN0YXRzLnNpZ25hbCA9IHNpZ25hbDsKKy8vCXByaW50aygiPT09PT09PT09PT09PT09PT09PnN0YXRzLnNpZ25hbCBpcyAlZFxuIixkc3QtPnN0YXRzLnNpZ25hbCk7CisJZHN0LT5zdGF0cy5ub2lzZSA9IG5vaXNlOworCisKKwlkc3QtPmNhcGFiaWxpdHkgPSBzcmMtPmNhcGFiaWxpdHk7CisJbWVtY3B5KGRzdC0+cmF0ZXMsIHNyYy0+cmF0ZXMsIHNyYy0+cmF0ZXNfbGVuKTsKKwlkc3QtPnJhdGVzX2xlbiA9IHNyYy0+cmF0ZXNfbGVuOworCW1lbWNweShkc3QtPnJhdGVzX2V4LCBzcmMtPnJhdGVzX2V4LCBzcmMtPnJhdGVzX2V4X2xlbik7CisJZHN0LT5yYXRlc19leF9sZW4gPSBzcmMtPnJhdGVzX2V4X2xlbjsKKwlkc3QtPkhpZ2hlc3RPcGVyYVJhdGU9IHNyYy0+SGlnaGVzdE9wZXJhUmF0ZTsKKwkvL3ByaW50aygiPT09PT09PT09PT5pbiAlczogc3JjLT5zc2lkIGlzICVzLGNoYW4gaXMgJWRcbiIsX19mdW5jX18sc3JjLT5zc2lkLHNyYy0+Y2hhbm5lbCk7CisKKwkvL1lKLGFkZCwwODA4MTksZm9yIGhpZGRlbiBhcAorCWlmKHNyYy0+c3NpZF9sZW4gPiAwKQorCXsKKwkJLy9pZihzcmMtPnNzaWRfbGVuID09IDEzKQorCQkvLwlwcmludGsoIj09PT09PT09PT09PT09PT09PT09PT4+Pj4+Pj4+IERzdCBzc2lkOiAlcyBTcmMgc3NpZDogJXNcbiIsIGRzdC0+c3NpZCwgc3JjLT5zc2lkKTsKKwkJbWVtc2V0KGRzdC0+c3NpZCwgMCwgZHN0LT5zc2lkX2xlbik7CisJCWRzdC0+c3NpZF9sZW4gPSBzcmMtPnNzaWRfbGVuOworCQltZW1jcHkoZHN0LT5zc2lkLCBzcmMtPnNzaWQsIHNyYy0+c3NpZF9sZW4pOworCX0KKwkvL1lKLGFkZCwwODA4MTksZm9yIGhpZGRlbiBhcCxlbmQKKworCWRzdC0+Y2hhbm5lbCA9IHNyYy0+Y2hhbm5lbDsKKwlkc3QtPm1vZGUgPSBzcmMtPm1vZGU7CisJZHN0LT5mbGFncyA9IHNyYy0+ZmxhZ3M7CisJZHN0LT50aW1lX3N0YW1wWzBdID0gc3JjLT50aW1lX3N0YW1wWzBdOworCWRzdC0+dGltZV9zdGFtcFsxXSA9IHNyYy0+dGltZV9zdGFtcFsxXTsKKworCWRzdC0+YmVhY29uX2ludGVydmFsID0gc3JjLT5iZWFjb25faW50ZXJ2YWw7CisJZHN0LT5saXN0ZW5faW50ZXJ2YWwgPSBzcmMtPmxpc3Rlbl9pbnRlcnZhbDsKKwlkc3QtPmF0aW1fd2luZG93ID0gc3JjLT5hdGltX3dpbmRvdzsKKwlkc3QtPmR0aW1fcGVyaW9kID0gc3JjLT5kdGltX3BlcmlvZDsKKwlkc3QtPmR0aW1fZGF0YSA9IHNyYy0+ZHRpbV9kYXRhOworCWRzdC0+bGFzdF9kdGltX3N0YV90aW1lWzBdID0gc3JjLT5sYXN0X2R0aW1fc3RhX3RpbWVbMF07CisJZHN0LT5sYXN0X2R0aW1fc3RhX3RpbWVbMV0gPSBzcmMtPmxhc3RfZHRpbV9zdGFfdGltZVsxXTsKKy8vCXByaW50aygidXBkYXRlOiVzLCBkdGltX3BlcmlvZDoleCwgZHRpbV9kYXRhOiV4XG4iLCBzcmMtPnNzaWQsIHNyYy0+ZHRpbV9wZXJpb2QsIHNyYy0+ZHRpbV9kYXRhKTsKKwltZW1jcHkoZHN0LT53cGFfaWUsIHNyYy0+d3BhX2llLCBzcmMtPndwYV9pZV9sZW4pOworCWRzdC0+d3BhX2llX2xlbiA9IHNyYy0+d3BhX2llX2xlbjsKKwltZW1jcHkoZHN0LT5yc25faWUsIHNyYy0+cnNuX2llLCBzcmMtPnJzbl9pZV9sZW4pOworCWRzdC0+cnNuX2llX2xlbiA9IHNyYy0+cnNuX2llX2xlbjsKKworCWRzdC0+bGFzdF9zY2FubmVkID0gamlmZmllczsKKwkvKiBkc3QtPmxhc3RfYXNzb2NpYXRlIGlzIG5vdCBvdmVyd3JpdHRlbiAqLworLy8gZGlzYWJsZSBRb1MgcHJvY2VzcyBub3csIGFkZGVkIGJ5IERhdmlkIDIwMDYvNy8yNQorI2lmIDEKKwlkc3QtPndtbV9pbmZvID0gc3JjLT53bW1faW5mbzsgLy9zdXJlIHRvIGV4aXN0IGluIGJlYWNvbiBvciBwcm9iZSByZXNwb25zZSBmcmFtZS4KKy8qCisJaWYoKGRzdC0+d21tX2luZm9ec3JjLT53bW1faW5mbykmMHgwZikgey8vUGFyYW0gU2V0IENvdW50IGNoYW5nZSwgdXBkYXRlIFBhcmFtZXRlcgorCSAgbWVtY3B5KGRzdC0+d21tX3BhcmFtLCBzcmMtPndtbV9wYXJhbSwgSUVFRTgwMjExX0FDX1BSQU1fTEVOKTsKKwl9CisqLworCWlmKHNyYy0+d21tX3BhcmFtWzBdLmFjX2FjaV9hY21fYWlmc258fCBcCisJICAgc3JjLT53bW1fcGFyYW1bMV0uYWNfYWNpX2FjbV9haWZzbnx8IFwKKwkgICBzcmMtPndtbV9wYXJhbVsyXS5hY19hY2lfYWNtX2FpZnNufHwgXAorCSAgIHNyYy0+d21tX3BhcmFtWzFdLmFjX2FjaV9hY21fYWlmc24pIHsKKwkgIG1lbWNweShkc3QtPndtbV9wYXJhbSwgc3JjLT53bW1fcGFyYW0sIFdNRV9BQ19QUkFNX0xFTik7CisJfQorCWRzdC0+UW9TX0VuYWJsZSA9IHNyYy0+UW9TX0VuYWJsZTsKKyNlbHNlCisJZHN0LT5Rb1NfRW5hYmxlID0gMTsvL2ZvciBSdGw4MTg3IHNpbXVsYXRpb24KKyNlbmRpZgorCWRzdC0+U2lnbmFsU3RyZW5ndGggPSBzcmMtPlNpZ25hbFN0cmVuZ3RoOworI2lmZGVmIFRIT01BU19UVVJCTworCWRzdC0+VHVyYm9fRW5hYmxlID0gc3JjLT5UdXJib19FbmFibGU7CisjZW5kaWYKKyNpZmRlZiBFTkFCTEVfRE9UMTFECisJZHN0LT5Db3VudHJ5SWVMZW4gPSBzcmMtPkNvdW50cnlJZUxlbjsKKwltZW1jcHkoZHN0LT5Db3VudHJ5SWVCdWYsIHNyYy0+Q291bnRyeUllQnVmLCBzcmMtPkNvdW50cnlJZUxlbik7CisjZW5kaWYKK30KKworCitpbmxpbmUgdm9pZCBpZWVlODAyMTFfcHJvY2Vzc19wcm9iZV9yZXNwb25zZSgKKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwlzdHJ1Y3QgaWVlZTgwMjExX3Byb2JlX3Jlc3BvbnNlICpiZWFjb24sCisJc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0cyAqc3RhdHMpCit7CisJc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrIG5ldHdvcms7CisJc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICp0YXJnZXQ7CisJc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpvbGRlc3QgPSBOVUxMOworI2lmZGVmIENPTkZJR19JRUVFODAyMTFfREVCVUcKKwlzdHJ1Y3QgaWVlZTgwMjExX2luZm9fZWxlbWVudCAqaW5mb19lbGVtZW50ID0gJmJlYWNvbi0+aW5mb19lbGVtZW50OworI2VuZGlmCisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzaG9ydCByZW5ldzsKKwl1OCB3bW1faW5mbzsKKwl1OCBpc19iZWFjb24gPSAoV0xBTl9GQ19HRVRfU1RZUEUoYmVhY29uLT5oZWFkZXIuZnJhbWVfY3RsKSA9PSBJRUVFODAyMTFfU1RZUEVfQkVBQ09OKT8gMTowOyAgLy9ZSixhZGQsMDgwODE5LGZvciBoaWRkZW4gYXAKKworCW1lbXNldCgmbmV0d29yaywgMCwgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfbmV0d29yaykpOworLy9yegorI2lmZGVmIF9SVEw4MTg3X0VYVF9QQVRDSF8KKwlpZigoaWVlZS0+aXdfbW9kZSA9PSBpZWVlLT5pd19leHRfbW9kZSkgJiYgaWVlZS0+ZXh0X3BhdGNoX2llZWU4MDIxMV9wcm9jZXNzX3Byb2JlX3Jlc3BvbnNlXzEpIHsKKwkJaWVlZS0+ZXh0X3BhdGNoX2llZWU4MDIxMV9wcm9jZXNzX3Byb2JlX3Jlc3BvbnNlXzEoaWVlZSwgYmVhY29uLCBzdGF0cyk7CisJCXJldHVybjsKKwl9CisjZW5kaWYKKworCUlFRUU4MDIxMV9ERUJVR19TQ0FOKAorCQkiJyVzJyAoIiBNQUNfRk1UICIpOiAlYyVjJWMlYyAlYyVjJWMlYy0lYyVjJWMlYyAlYyVjJWMlY1xuIiwKKwkJZXNjYXBlX2Vzc2lkKGluZm9fZWxlbWVudC0+ZGF0YSwgaW5mb19lbGVtZW50LT5sZW4pLAorCQlNQUNfQVJHKGJlYWNvbi0+aGVhZGVyLmFkZHIzKSwKKwkJKGJlYWNvbi0+Y2FwYWJpbGl0eSAmICgxPDwweGYpKSA/ICcxJyA6ICcwJywKKwkJKGJlYWNvbi0+Y2FwYWJpbGl0eSAmICgxPDwweGUpKSA/ICcxJyA6ICcwJywKKwkJKGJlYWNvbi0+Y2FwYWJpbGl0eSAmICgxPDwweGQpKSA/ICcxJyA6ICcwJywKKwkJKGJlYWNvbi0+Y2FwYWJpbGl0eSAmICgxPDwweGMpKSA/ICcxJyA6ICcwJywKKwkJKGJlYWNvbi0+Y2FwYWJpbGl0eSAmICgxPDwweGIpKSA/ICcxJyA6ICcwJywKKwkJKGJlYWNvbi0+Y2FwYWJpbGl0eSAmICgxPDwweGEpKSA/ICcxJyA6ICcwJywKKwkJKGJlYWNvbi0+Y2FwYWJpbGl0eSAmICgxPDwweDkpKSA/ICcxJyA6ICcwJywKKwkJKGJlYWNvbi0+Y2FwYWJpbGl0eSAmICgxPDwweDgpKSA/ICcxJyA6ICcwJywKKwkJKGJlYWNvbi0+Y2FwYWJpbGl0eSAmICgxPDwweDcpKSA/ICcxJyA6ICcwJywKKwkJKGJlYWNvbi0+Y2FwYWJpbGl0eSAmICgxPDwweDYpKSA/ICcxJyA6ICcwJywKKwkJKGJlYWNvbi0+Y2FwYWJpbGl0eSAmICgxPDwweDUpKSA/ICcxJyA6ICcwJywKKwkJKGJlYWNvbi0+Y2FwYWJpbGl0eSAmICgxPDwweDQpKSA/ICcxJyA6ICcwJywKKwkJKGJlYWNvbi0+Y2FwYWJpbGl0eSAmICgxPDwweDMpKSA/ICcxJyA6ICcwJywKKwkJKGJlYWNvbi0+Y2FwYWJpbGl0eSAmICgxPDwweDIpKSA/ICcxJyA6ICcwJywKKwkJKGJlYWNvbi0+Y2FwYWJpbGl0eSAmICgxPDwweDEpKSA/ICcxJyA6ICcwJywKKwkJKGJlYWNvbi0+Y2FwYWJpbGl0eSAmICgxPDwweDApKSA/ICcxJyA6ICcwJyk7CisjaWYgMAorCWlmKHN0cmNtcChlc2NhcGVfZXNzaWQoYmVhY29uLT5pbmZvX2VsZW1lbnQuZGF0YSwgYmVhY29uLT5pbmZvX2VsZW1lbnQubGVuKSwgInJ0bF9zb2Z0YXAiKSA9PSAwKQorCXsKKwkJaWYoV0xBTl9GQ19HRVRfU1RZUEUoYmVhY29uLT5oZWFkZXIuZnJhbWVfY3RsKSA9PSBJRUVFODAyMTFfU1RZUEVfQkVBQ09OKQorCQl7CisJCQl1MzIgaSA9IDAsIGxlbiA9IHN0YXRzLT5sZW47CisJCQl1OCAqIHAgPSAodTgqKWJlYWNvbjsKKwkJCXByaW50aygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworCQkJcHJpbnRrKCJydGxfc29mdGFwIEJlYWNvbjoiKTsKKwkJCWZvcihpPTA7IGk8bGVuOyBpKyspCisJCQkJcHJpbnRrKCJcdCUyLjJ4IiwgKihwK2kpKTsKKwkJCXByaW50aygiXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CisJCX0KKwl9CisjZW5kaWYKKwlpZiAoaWVlZTgwMjExX25ldHdvcmtfaW5pdChpZWVlLCBiZWFjb24sICZuZXR3b3JrLCBzdGF0cykpIHsKKwkJSUVFRTgwMjExX0RFQlVHX1NDQU4oIkRyb3BwZWQgJyVzJyAoIiBNQUNfRk1UICIpIHZpYSAlcy5cbiIsCisJCQkJICAgICBlc2NhcGVfZXNzaWQoaW5mb19lbGVtZW50LT5kYXRhLAorCQkJCQkJICBpbmZvX2VsZW1lbnQtPmxlbiksCisJCQkJICAgICBNQUNfQVJHKGJlYWNvbi0+aGVhZGVyLmFkZHIzKSwKKwkJCQkgICAgIFdMQU5fRkNfR0VUX1NUWVBFKGJlYWNvbi0+aGVhZGVyLmZyYW1lX2N0bCkgPT0KKwkJCQkgICAgIElFRUU4MDIxMV9TVFlQRV9QUk9CRV9SRVNQID8KKwkJCQkgICAgICJQUk9CRSBSRVNQT05TRSIgOiAiQkVBQ09OIik7CisJCXJldHVybjsKKwl9CisKKyNpZmRlZiBFTkFCTEVfRE9UMTFECisJLy8gRm9yIEFzdXMgRWVlUGMgcmVxdWVzdCwKKwkvLyAoMSkgaWYgd2lyZWxlc3MgYWRhcHRlciByZWNlaXZlIGdldCBhbnkgODAyLjExZCBjb3VudHJ5IGNvZGUgaW4gQVAgYmVhY29uLAorCS8vCSAgIHdpcmVsZXNzIGFkYXB0ZXIgc2hvdWxkIGZvbGxvdyB0aGUgY291bnRyeSBjb2RlLgorCS8vICgyKSAgSWYgdGhlcmUgaXMgbm8gYW55IGNvdW50cnkgY29kZSBpbiBiZWFjb24sCisJLy8gICAgICAgdGhlbiB3aXJlbGVzcyBhZGFwdGVyIHNob3VsZCBkbyBhY3RpdmUgc2NhbiBmcm9tIGNoMX4xMSBhbmQKKwkvLyAgICAgICBwYXNzaXZlIHNjYW4gZnJvbSBjaDEyfjE0CisJaWYoaWVlZS0+Ykdsb2JhbERvbWFpbikKKwl7CisJCWlmIChXTEFOX0ZDX0dFVF9TVFlQRShiZWFjb24tPmhlYWRlci5mcmFtZV9jdGwpID09IElFRUU4MDIxMV9TVFlQRV9QUk9CRV9SRVNQKQorCQl7CisJCQkvLyBDYXNlIDE6IENvdW50cnkgY29kZQorCQkJaWYoSVNfQ09VTlRSWV9JRV9WQUxJRChpZWVlKSApCisJCQl7CisJCQkJaWYoICFJc0xlZ2FsQ2hhbm5lbChpZWVlLCBuZXR3b3JrLmNoYW5uZWwpICkKKwkJCQl7CisJCQkJCXByaW50aygiR2V0U2NhbkluZm8oKTogRm9yIENvdW50cnkgY29kZSwgZmlsdGVyIHByb2JlIHJlc3BvbnNlIGF0IGNoYW5uZWwoJWQpLlxuIiwgbmV0d29yay5jaGFubmVsKTsKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCX0KKwkJCS8vIENhc2UgMjogTm8gYW55IGNvdW50cnkgY29kZS4KKwkJCWVsc2UKKwkJCXsKKwkJCQkvLyBGaWx0ZXIgb3ZlciBjaGFubmVsIGNoMTJ+MTQKKwkJCQlpZihuZXR3b3JrLmNoYW5uZWwgPiAxMSkKKwkJCQl7CisJCQkJCXByaW50aygiR2V0U2NhbkluZm8oKTogRm9yIEdsb2JhbCBEb21haW4sIGZpbHRlciBwcm9iZSByZXNwb25zZSBhdCBjaGFubmVsKCVkKS5cbiIsIG5ldHdvcmsuY2hhbm5lbCk7CisJCQkJCXJldHVybjsKKwkJCQl9CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQkvLyBDYXNlIDE6IENvdW50cnkgY29kZQorCQkJaWYoSVNfQ09VTlRSWV9JRV9WQUxJRChpZWVlKSApCisJCQl7CisJCQkJaWYoICFJc0xlZ2FsQ2hhbm5lbChpZWVlLCBuZXR3b3JrLmNoYW5uZWwpICkKKwkJCQl7CisJCQkJCXByaW50aygiR2V0U2NhbkluZm8oKTogRm9yIENvdW50cnkgY29kZSwgZmlsdGVyIGJlYWNvbiBhdCBjaGFubmVsKCVkKS5cbiIsbmV0d29yay5jaGFubmVsKTsKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCX0KKwkJCS8vIENhc2UgMjogTm8gYW55IGNvdW50cnkgY29kZS4KKwkJCWVsc2UKKwkJCXsKKwkJCQkvLyBGaWx0ZXIgb3ZlciBjaGFubmVsIGNoMTJ+MTQKKwkJCQlpZihuZXR3b3JrLmNoYW5uZWwgPiAxNCkKKwkJCQl7CisJCQkJCXByaW50aygiR2V0U2NhbkluZm8oKTogRm9yIEdsb2JhbCBEb21haW4sIGZpbHRlciBiZWFjb24gYXQgY2hhbm5lbCglZCkuXG4iLG5ldHdvcmsuY2hhbm5lbCk7CisJCQkJCXJldHVybjsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisjZW5kaWYKKwkvKiBUaGUgbmV0d29yayBwYXJzZWQgY29ycmVjdGx5IC0tIHNvIG5vdyB3ZSBzY2FuIG91ciBrbm93biBuZXR3b3JrcworCSAqIHRvIHNlZSBpZiB3ZSBjYW4gZmluZCBpdCBpbiBvdXIgbGlzdC4KKwkgKgorCSAqIE5PVEU6ICBUaGlzIHNlYXJjaCBpcyBkZWZpbml0ZWx5IG5vdCBvcHRpbWl6ZWQuICBPbmNlIGl0cyBkb2luZworCSAqICAgICAgICB0aGUgInJpZ2h0IHRoaW5nIiB3ZSdsbCBvcHRpbWl6ZSBpdCBmb3IgZWZmaWNpZW5jeSBpZgorCSAqICAgICAgICBuZWNlc3NhcnkgKi8KKworCS8qIFNlYXJjaCBmb3IgdGhpcyBlbnRyeSBpbiB0aGUgbGlzdCBhbmQgdXBkYXRlIGl0IGlmIGl0IGlzCisJICogYWxyZWFkeSB0aGVyZS4gKi8KKworCXNwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5sb2NrLCBmbGFncyk7CisKKwlpZihpc19zYW1lX25ldHdvcmsoJmllZWUtPmN1cnJlbnRfbmV0d29yaywgJm5ldHdvcmssIGllZWUpKSB7CisJCXdtbV9pbmZvID0gaWVlZS0+Y3VycmVudF9uZXR3b3JrLndtbV9pbmZvOworCQkvL1lKLGFkZCwwODA4MTksZm9yIGhpZGRlbiBhcAorCQlpZihpc19iZWFjb24gPT0gMCkKKwkJCW5ldHdvcmsuZmxhZ3MgPSAofk5FVFdPUktfRU1QVFlfRVNTSUQgJiBuZXR3b3JrLmZsYWdzKXwoTkVUV09SS19FTVBUWV9FU1NJRCAmIGllZWUtPmN1cnJlbnRfbmV0d29yay5mbGFncyk7CisJCWVsc2UgaWYoaWVlZS0+c3RhdGUgPT0gSUVFRTgwMjExX0xJTktFRCkKKwkJCWllZWUtPk51bVJ4QmNuSW5QZXJpb2QrKzsKKwkJLy9ZSixhZGQsMDgwODE5LGZvciBoaWRkZW4gYXAsZW5kCisJCS8vcHJpbnRrKCI9PT09Pm5ldHdvcmsuc3NpZD0lcyBjdXJfc3NpZD0lc1xuIiwgbmV0d29yay5zc2lkLCBpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZCk7CisJCXVwZGF0ZV9uZXR3b3JrKCZpZWVlLT5jdXJyZW50X25ldHdvcmssICZuZXR3b3JrKTsKKwl9CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRhcmdldCwgJmllZWUtPm5ldHdvcmtfbGlzdCwgbGlzdCkgeworCQlpZiAoaXNfc2FtZV9uZXR3b3JrKHRhcmdldCwgJm5ldHdvcmssIGllZWUpKQorCQkJYnJlYWs7CisJCWlmICgob2xkZXN0ID09IE5VTEwpIHx8CisJCSAgICAodGFyZ2V0LT5sYXN0X3NjYW5uZWQgPCBvbGRlc3QtPmxhc3Rfc2Nhbm5lZCkpCisJCQlvbGRlc3QgPSB0YXJnZXQ7CisJfQorCisJLyogSWYgd2UgZGlkbid0IGZpbmQgYSBtYXRjaCwgdGhlbiBnZXQgYSBuZXcgbmV0d29yayBzbG90IHRvIGluaXRpYWxpemUKKwkgKiB3aXRoIHRoaXMgYmVhY29uJ3MgaW5mb3JtYXRpb24gKi8KKwlpZiAoJnRhcmdldC0+bGlzdCA9PSAmaWVlZS0+bmV0d29ya19saXN0KSB7CisJCWlmIChsaXN0X2VtcHR5KCZpZWVlLT5uZXR3b3JrX2ZyZWVfbGlzdCkpIHsKKwkJCS8qIElmIHRoZXJlIGFyZSBubyBtb3JlIHNsb3RzLCBleHBpcmUgdGhlIG9sZGVzdCAqLworCQkJbGlzdF9kZWwoJm9sZGVzdC0+bGlzdCk7CisJCQl0YXJnZXQgPSBvbGRlc3Q7CisJCQlJRUVFODAyMTFfREVCVUdfU0NBTigiRXhwaXJlZCAnJXMnICgiIE1BQ19GTVQgIikgZnJvbSAiCisJCQkJCSAgICAgIm5ldHdvcmsgbGlzdC5cbiIsCisJCQkJCSAgICAgZXNjYXBlX2Vzc2lkKHRhcmdldC0+c3NpZCwKKwkJCQkJCQkgIHRhcmdldC0+c3NpZF9sZW4pLAorCQkJCQkgICAgIE1BQ19BUkcodGFyZ2V0LT5ic3NpZCkpOworCQl9IGVsc2UgeworCQkJLyogT3RoZXJ3aXNlIGp1c3QgcHVsbCBmcm9tIHRoZSBmcmVlIGxpc3QgKi8KKwkJCXRhcmdldCA9IGxpc3RfZW50cnkoaWVlZS0+bmV0d29ya19mcmVlX2xpc3QubmV4dCwKKwkJCQkJICAgIHN0cnVjdCBpZWVlODAyMTFfbmV0d29yaywgbGlzdCk7CisJCQlsaXN0X2RlbChpZWVlLT5uZXR3b3JrX2ZyZWVfbGlzdC5uZXh0KTsKKwkJfQorCisKKyNpZmRlZiBDT05GSUdfSUVFRTgwMjExX0RFQlVHCisJCUlFRUU4MDIxMV9ERUJVR19TQ0FOKCJBZGRpbmcgJyVzJyAoIiBNQUNfRk1UICIpIHZpYSAlcy5cbiIsCisJCQkJICAgICBlc2NhcGVfZXNzaWQobmV0d29yay5zc2lkLAorCQkJCQkJICBuZXR3b3JrLnNzaWRfbGVuKSwKKwkJCQkgICAgIE1BQ19BUkcobmV0d29yay5ic3NpZCksCisJCQkJICAgICBXTEFOX0ZDX0dFVF9TVFlQRShiZWFjb24tPmhlYWRlci5mcmFtZV9jdGwpID09CisJCQkJICAgICBJRUVFODAyMTFfU1RZUEVfUFJPQkVfUkVTUCA/CisJCQkJICAgICAiUFJPQkUgUkVTUE9OU0UiIDogIkJFQUNPTiIpOworI2VuZGlmCisKKyNpZmRlZiBfUlRMODE4N19FWFRfUEFUQ0hfCisJbmV0d29yay5leHRfZW50cnkgPSB0YXJnZXQtPmV4dF9lbnRyeTsKKyNlbmRpZgorCQltZW1jcHkodGFyZ2V0LCAmbmV0d29yaywgc2l6ZW9mKCp0YXJnZXQpKTsKKwkJbGlzdF9hZGRfdGFpbCgmdGFyZ2V0LT5saXN0LCAmaWVlZS0+bmV0d29ya19saXN0KTsKKwkJaWYoaWVlZS0+c29mdG1hY19mZWF0dXJlcyAmIElFRUVfU09GVE1BQ19BU1NPQ0lBVEUpCisJCQlpZWVlODAyMTFfc29mdG1hY19uZXdfbmV0KGllZWUsJm5ldHdvcmspOworCX0gZWxzZSB7CisJCUlFRUU4MDIxMV9ERUJVR19TQ0FOKCJVcGRhdGluZyAnJXMnICgiIE1BQ19GTVQgIikgdmlhICVzLlxuIiwKKwkJCQkgICAgIGVzY2FwZV9lc3NpZCh0YXJnZXQtPnNzaWQsCisJCQkJCQkgIHRhcmdldC0+c3NpZF9sZW4pLAorCQkJCSAgICAgTUFDX0FSRyh0YXJnZXQtPmJzc2lkKSwKKwkJCQkgICAgIFdMQU5fRkNfR0VUX1NUWVBFKGJlYWNvbi0+aGVhZGVyLmZyYW1lX2N0bCkgPT0KKwkJCQkgICAgIElFRUU4MDIxMV9TVFlQRV9QUk9CRV9SRVNQID8KKwkJCQkgICAgICJQUk9CRSBSRVNQT05TRSIgOiAiQkVBQ09OIik7CisKKwkJLyogd2UgaGF2ZSBhbiBlbnRyeSBhbmQgd2UgYXJlIGdvaW5nIHRvIHVwZGF0ZSBpdC4gQnV0IHRoaXMgZW50cnkgbWF5CisJCSAqIGJlIGFscmVhZHkgZXhwaXJlZC4gSW4gdGhpcyBjYXNlIHdlIGRvIHRoZSBzYW1lIGFzIHdlIGZvdW5kIGEgbmV3CisJCSAqIG5ldCBhbmQgY2FsbCB0aGUgbmV3X25ldCBoYW5kbGVyCisJCSAqLworCQlyZW5ldyA9ICF0aW1lX2FmdGVyKHRhcmdldC0+bGFzdF9zY2FubmVkICsgaWVlZS0+c2Nhbl9hZ2UsIGppZmZpZXMpOworCQkvL1lKLGFkZCwwODA4MTksZm9yIGhpZGRlbiBhcAorCQlpZihpc19iZWFjb24gPT0gMCkKKwkJCW5ldHdvcmsuZmxhZ3MgPSAofk5FVFdPUktfRU1QVFlfRVNTSUQgJiBuZXR3b3JrLmZsYWdzKXwoTkVUV09SS19FTVBUWV9FU1NJRCAmIHRhcmdldC0+ZmxhZ3MpOworCQkvL2lmKHN0cm5jbXAobmV0d29yay5zc2lkLCAibGlua3N5cy1jIiw5KSA9PSAwKQorCQkvLwlwcmludGsoIj09PT0+MiBuZXR3b3JrLnNzaWQ9JXMgRkxBRz0lZCB0YXJnZXQuc3NpZD0lcyBGTEFHPSVkXG4iLCBuZXR3b3JrLnNzaWQsIG5ldHdvcmsuZmxhZ3MsIHRhcmdldC0+c3NpZCwgdGFyZ2V0LT5mbGFncyk7CisJCWlmKCgobmV0d29yay5mbGFncyAmIE5FVFdPUktfRU1QVFlfRVNTSUQpID09IE5FVFdPUktfRU1QVFlfRVNTSUQpIFwKKwkJICAgICYmICgoKG5ldHdvcmsuc3NpZF9sZW4gPiAwKSAmJiAoc3RybmNtcCh0YXJnZXQtPnNzaWQsIG5ldHdvcmsuc3NpZCwgbmV0d29yay5zc2lkX2xlbikpKVwKKwkJICAgIHx8KChpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZF9sZW4gPT0gbmV0d29yay5zc2lkX2xlbikmJihzdHJuY21wKGllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkLCBuZXR3b3JrLnNzaWQsIG5ldHdvcmsuc3NpZF9sZW4pID09IDApJiYoaWVlZS0+c3RhdGUgPT0gSUVFRTgwMjExX05PTElOSykpKSkKKwkJCXJlbmV3ID0gMTsKKwkJLy9ZSixhZGQsMDgwODE5LGZvciBoaWRkZW4gYXAsZW5kCisJCXVwZGF0ZV9uZXR3b3JrKHRhcmdldCwgJm5ldHdvcmspOworCQlpZihyZW5ldyAmJiAoaWVlZS0+c29mdG1hY19mZWF0dXJlcyAmIElFRUVfU09GVE1BQ19BU1NPQ0lBVEUpKQorCQkJaWVlZTgwMjExX3NvZnRtYWNfbmV3X25ldChpZWVlLCZuZXR3b3JrKTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5sb2NrLCBmbGFncyk7Cit9CisKK3ZvaWQgaWVlZTgwMjExX3J4X21ndChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJICAgICAgc3RydWN0IGllZWU4MDIxMV9oZHIgKmhlYWRlciwKKwkJICAgICAgc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0cyAqc3RhdHMpCit7CisJc3dpdGNoIChXTEFOX0ZDX0dFVF9TVFlQRShoZWFkZXItPmZyYW1lX2N0bCkpIHsKKworCWNhc2UgSUVFRTgwMjExX1NUWVBFX0JFQUNPTjoKKwkJSUVFRTgwMjExX0RFQlVHX01HTVQoInJlY2VpdmVkIEJFQUNPTiAoJWQpXG4iLAorCQkJCSAgICAgV0xBTl9GQ19HRVRfU1RZUEUoaGVhZGVyLT5mcmFtZV9jdGwpKTsKKwkJSUVFRTgwMjExX0RFQlVHX1NDQU4oIkJlYWNvblxuIik7CisJCWllZWU4MDIxMV9wcm9jZXNzX3Byb2JlX3Jlc3BvbnNlKAorCQkJaWVlZSwgKHN0cnVjdCBpZWVlODAyMTFfcHJvYmVfcmVzcG9uc2UgKiloZWFkZXIsIHN0YXRzKTsKKwkJYnJlYWs7CisKKwljYXNlIElFRUU4MDIxMV9TVFlQRV9QUk9CRV9SRVNQOgorCQlJRUVFODAyMTFfREVCVUdfTUdNVCgicmVjZWl2ZWQgUFJPQkUgUkVTUE9OU0UgKCVkKVxuIiwKKwkJCQkgICAgIFdMQU5fRkNfR0VUX1NUWVBFKGhlYWRlci0+ZnJhbWVfY3RsKSk7CisJCUlFRUU4MDIxMV9ERUJVR19TQ0FOKCJQcm9iZSByZXNwb25zZVxuIik7CisJCWllZWU4MDIxMV9wcm9jZXNzX3Byb2JlX3Jlc3BvbnNlKAorCQkJaWVlZSwgKHN0cnVjdCBpZWVlODAyMTFfcHJvYmVfcmVzcG9uc2UgKiloZWFkZXIsIHN0YXRzKTsKKwkJYnJlYWs7CisvL3J6CisjaWZkZWYgX1JUTDgxODdfRVhUX1BBVENIXworCWNhc2UgSUVFRTgwMjExX1NUWVBFX1BST0JFX1JFUToKKwkJSUVFRTgwMjExX0RFQlVHX01HTVQoInJlY2VpdmVkIFBST0JFIFJFUVVFU1QgKCVkKVxuIiwKKwkJCQkgICAgIFdMQU5fRkNfR0VUX1NUWVBFKGhlYWRlci0+ZnJhbWVfY3RsKSk7CisJCUlFRUU4MDIxMV9ERUJVR19TQ0FOKCJQcm9iZSByZXF1ZXN0XG4iKTsKKwkJLy8vCisJCWlmKCBpZWVlLT5pd19tb2RlID09IGllZWUtPml3X2V4dF9tb2RlICYmIGllZWUtPmV4dF9wYXRjaF9pZWVlODAyMTFfcnhfbWd0X29uX3Byb2JlX3JlcSApCisJCQlpZWVlLT5leHRfcGF0Y2hfaWVlZTgwMjExX3J4X21ndF9vbl9wcm9iZV9yZXEoIGllZWUsIChzdHJ1Y3QgaWVlZTgwMjExX3Byb2JlX3JlcXVlc3QgKiloZWFkZXIsIHN0YXRzKTsKKwkJYnJlYWs7CisjZW5kaWYgLy8gX1JUTDgxODdfRVhUX1BBVENIXworCisJfQorfQorCisjaWYgMAorRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfcnhfbWd0KTsKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX3J4KTsKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX25ldHdvcmtfaW5pdCk7CisjaWZkZWYgX1JUTDgxODdfRVhUX1BBVENIXworRVhQT1JUX1NZTUJPTChpZWVlX2V4dF9za2JfcDgwMjExX3RvX2V0aGVyKTsKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS9pZWVlODAyMTFfc29mdG1hYy5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvaWVlZTgwMjExX3NvZnRtYWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTc1MmY2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvaWVlZTgwMjExX3NvZnRtYWMuYwpAQCAtMCwwICsxLDQwMjkgQEAKKy8qIElFRUUgODAyLjExIFNvZnRNQUMgbGF5ZXIKKyAqIENvcHlyaWdodCAoYykgMjAwNSBBbmRyZWEgTWVyZWxsbyA8YW5kcmVhbXJsQHRpc2NhbGkuaXQ+CisgKgorICogTW9zdGx5IGV4dHJhY3RlZCBmcm9tIHRoZSBydGw4MTgwLXNhMjQwMCBkcml2ZXIgZm9yIHRoZQorICogaW4ta2VybmVsIGdlbmVyaWMgaWVlZTgwMi4xMSBzdGFjay4KKyAqCisgKiBGZXcgbGluZXMgbWlnaHQgYmUgc3RvbGVuIGZyb20gb3RoZXIgcGFydCBvZiB0aGUgaWVlZTgwMjExCisgKiBzdGFjay4gQ29weXJpZ2h0IHdobyBvd24gaXQncyBjb3B5cmlnaHQKKyAqCisgKiBXUEEgY29kZSBzdG9sZW4gZnJvbSB0aGUgaXB3MjIwMCBkcml2ZXIuCisgKiBDb3B5cmlnaHQgd2hvIG93biBpdCdzIGNvcHlyaWdodC4KKyAqCisgKiByZWxlYXNlZCB1bmRlciB0aGUgR1BMCisgKi8KKworCisjaW5jbHVkZSAiaWVlZTgwMjExLmgiCisKKyNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaWZkZWYgRU5BQkxFX0RPVDExRAorI2luY2x1ZGUgImRvdDExZC5oIgorI2VuZGlmCit1OCByc25fYXV0aGVuX2NpcGhlcl9zdWl0ZVsxNl1bNF0gPSB7CisJezB4MDAsMHgwRiwweEFDLDB4MDB9LCAvL1VzZSBncm91cCBrZXksIC8vUmVzZXJ2ZWQKKwl7MHgwMCwweDBGLDB4QUMsMHgwMX0sIC8vV0VQLTQwICAgICAgICAgLy9SU05BIGRlZmF1bHQKKwl7MHgwMCwweDBGLDB4QUMsMHgwMn0sIC8vVEtJUCAgICAgICAgICAgLy9OT05FCQkvL3t1c2VkIGp1c3QgYXMgZGVmYXVsdH0KKwl7MHgwMCwweDBGLDB4QUMsMHgwM30sIC8vV1JBUC1oaXN0b3JpY2FsCisJezB4MDAsMHgwRiwweEFDLDB4MDR9LCAvL0NDTVAKKwl7MHgwMCwweDBGLDB4QUMsMHgwNX0sIC8vV0VQLTEwNAorfTsKKworc2hvcnQgaWVlZTgwMjExX2lzXzU0ZyhzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgbmV0KQoreworCXJldHVybiAoKG5ldC5yYXRlc19leF9sZW4gPiAwKSB8fCAobmV0LnJhdGVzX2xlbiA+IDQpKTsKK30KKworc2hvcnQgaWVlZTgwMjExX2lzX3Nob3J0c2xvdChzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgbmV0KQoreworCXJldHVybiAobmV0LmNhcGFiaWxpdHkgJiBXTEFOX0NBUEFCSUxJVFlfU0hPUlRfU0xPVCk7Cit9CisKKy8qIHJldHVybnMgdGhlIHRvdGFsIGxlbmd0aCBuZWVkZWQgZm9yIHBsZWFjaW5nIHRoZSBSQVRFIE1GSUUKKyAqIHRhZyBhbmQgdGhlIEVYVEVOREVEIFJBVEUgTUZJRSB0YWcgaWYgbmVlZGVkLgorICogSXQgZW5jbHVkZXMgdHdvIGJ5dGVzIHBlciB0YWcgZm9yIHRoZSB0YWcgaXRzZWxmIGFuZCBpdHMgbGVuCisgKi8KK3Vuc2lnbmVkIGludCBpZWVlODAyMTFfTUZJRV9yYXRlX2xlbihzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKwl1bnNpZ25lZCBpbnQgcmF0ZV9sZW4gPSAwOworCisJaWYgKGllZWUtPm1vZHVsYXRpb24gJiBJRUVFODAyMTFfQ0NLX01PRFVMQVRJT04pCisJCXJhdGVfbGVuID0gSUVFRTgwMjExX0NDS19SQVRFX0xFTiArIDI7CisKKwlpZiAoaWVlZS0+bW9kdWxhdGlvbiAmIElFRUU4MDIxMV9PRkRNX01PRFVMQVRJT04pCisKKwkJcmF0ZV9sZW4gKz0gSUVFRTgwMjExX09GRE1fUkFURV9MRU4gKyAyOworCisJcmV0dXJuIHJhdGVfbGVuOworfQorCisvKiBwbGVhY2UgdGhlIE1GSUUgcmF0ZSwgdGFnIHRvIHRoZSBtZW1vcnkgKGRvdWJsZSkgcG9pbmVkLgorICogVGhlbiBpdCB1cGRhdGVzIHRoZSBwb2ludGVyIHNvIHRoYXQKKyAqIGl0IHBvaW50cyBhZnRlciB0aGUgbmV3IE1GSUUgdGFnIGFkZGVkLgorICovCit2b2lkIGllZWU4MDIxMV9NRklFX0JyYXRlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCB1OCAqKnRhZ19wKQoreworCXU4ICp0YWcgPSAqdGFnX3A7CisKKwlpZiAoaWVlZS0+bW9kdWxhdGlvbiAmIElFRUU4MDIxMV9DQ0tfTU9EVUxBVElPTil7CisJCSp0YWcrKyA9IE1GSUVfVFlQRV9SQVRFUzsKKwkJKnRhZysrID0gNDsKKwkJKnRhZysrID0gSUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSyB8IElFRUU4MDIxMV9DQ0tfUkFURV8xTUI7CisJCSp0YWcrKyA9IElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0sgfCBJRUVFODAyMTFfQ0NLX1JBVEVfMk1COworCQkqdGFnKysgPSBJRUVFODAyMTFfQkFTSUNfUkFURV9NQVNLIHwgSUVFRTgwMjExX0NDS19SQVRFXzVNQjsKKwkJKnRhZysrID0gSUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSyB8IElFRUU4MDIxMV9DQ0tfUkFURV8xMU1COworCX0KKworCS8qIFdlIG1heSBhZGQgYW4gb3B0aW9uIGZvciBjdXN0b20gcmF0ZXMgdGhhdCBzcGVjaWZpYyBIVyBtaWdodCBzdXBwb3J0ICovCisJKnRhZ19wID0gdGFnOworfQorCit2b2lkIGllZWU4MDIxMV9NRklFX0dyYXRlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCB1OCAqKnRhZ19wKQoreworCXU4ICp0YWcgPSAqdGFnX3A7CisKKwkJaWYgKGllZWUtPm1vZHVsYXRpb24gJiBJRUVFODAyMTFfT0ZETV9NT0RVTEFUSU9OKXsKKworCQkqdGFnKysgPSBNRklFX1RZUEVfUkFURVNfRVg7CisJCSp0YWcrKyA9IDg7CisJCSp0YWcrKyA9IElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0sgfCBJRUVFODAyMTFfT0ZETV9SQVRFXzZNQjsKKwkJKnRhZysrID0gSUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSyB8IElFRUU4MDIxMV9PRkRNX1JBVEVfOU1COworCQkqdGFnKysgPSBJRUVFODAyMTFfQkFTSUNfUkFURV9NQVNLIHwgSUVFRTgwMjExX09GRE1fUkFURV8xMk1COworCQkqdGFnKysgPSBJRUVFODAyMTFfQkFTSUNfUkFURV9NQVNLIHwgSUVFRTgwMjExX09GRE1fUkFURV8xOE1COworCQkqdGFnKysgPSBJRUVFODAyMTFfQkFTSUNfUkFURV9NQVNLIHwgSUVFRTgwMjExX09GRE1fUkFURV8yNE1COworCQkqdGFnKysgPSBJRUVFODAyMTFfQkFTSUNfUkFURV9NQVNLIHwgSUVFRTgwMjExX09GRE1fUkFURV8zNk1COworCQkqdGFnKysgPSBJRUVFODAyMTFfQkFTSUNfUkFURV9NQVNLIHwgSUVFRTgwMjExX09GRE1fUkFURV80OE1COworCQkqdGFnKysgPSBJRUVFODAyMTFfQkFTSUNfUkFURV9NQVNLIHwgSUVFRTgwMjExX09GRE1fUkFURV81NE1COworCisJfQorCisJLyogV2UgbWF5IGFkZCBhbiBvcHRpb24gZm9yIGN1c3RvbSByYXRlcyB0aGF0IHNwZWNpZmljIEhXIG1pZ2h0IHN1cHBvcnQgKi8KKwkqdGFnX3AgPSB0YWc7Cit9CisKKwordm9pZCBpZWVlODAyMTFfV01NX0luZm8oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHU4ICoqdGFnX3ApIHsKKwl1OCAqdGFnID0gKnRhZ19wOworCisJKnRhZysrID0gTUZJRV9UWVBFX0dFTkVSSUM7IC8vMAorCSp0YWcrKyA9IDc7CisJKnRhZysrID0gMHgwMDsKKwkqdGFnKysgPSAweDUwOworCSp0YWcrKyA9IDB4ZjI7CisJKnRhZysrID0gMHgwMjsvLzUKKwkqdGFnKysgPSAweDAwOworCSp0YWcrKyA9IDB4MDE7CisjaWZkZWYgU1VQUE9SVF9VU1BECisJaWYoaWVlZS0+Y3VycmVudF9uZXR3b3JrLndtbV9pbmZvICYgMHg4MCkgeworCQkqdGFnKysgPSAweDBmfE1BWF9TUF9MZW47CisJfSBlbHNlIHsKKwkJKnRhZysrID0gTUFYX1NQX0xlbjsKKwl9CisjZWxzZQorCSp0YWcrKyA9IE1BWF9TUF9MZW47CisjZW5kaWYKKwkqdGFnX3AgPSB0YWc7Cit9CisKKyNpZmRlZiBUSE9NQVNfVFVSQk8KK3ZvaWQgaWVlZTgwMjExX1RVUkJPX0luZm8oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHU4ICoqdGFnX3ApIHsKKwl1OCAqdGFnID0gKnRhZ19wOworCisgICAgICAgICp0YWcrKyA9IE1GSUVfVFlQRV9HRU5FUklDOyAvLzAKKyAgICAgICAgKnRhZysrID0gNzsKKyAgICAgICAgKnRhZysrID0gMHgwMDsKKyAgICAgICAgKnRhZysrID0gMHhlMDsKKyAgICAgICAgKnRhZysrID0gMHg0YzsKKyAgICAgICAgKnRhZysrID0gMHgwMTsvLzUKKyAgICAgICAgKnRhZysrID0gMHgwMjsKKyAgICAgICAgKnRhZysrID0gMHgxMTsKKwkqdGFnKysgPSAweDAwOworCisJKnRhZ19wID0gdGFnOworCXByaW50ayhLRVJOX0FMRVJUICJUaGlzIGlzIGVuYWJsZSB0dXJibyBtb2RlIElFIHByb2Nlc3NcbiIpOworfQorI2VuZGlmCisKK3ZvaWQgZW5xdWV1ZV9tZ210KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCWludCBuaDsKKwluaCA9IChpZWVlLT5tZ210X3F1ZXVlX2hlYWQgKzEpICUgTUdNVF9RVUVVRV9OVU07CisKKy8qCisgKiBpZiB0aGUgcXVldWUgaXMgZnVsbCBidXQgd2UgaGF2ZSBuZXdlciBmcmFtZXMgdGhlbgorICoganVzdCBvdmVyd3JpdGVzIHRoZSBvbGRlc3QuCisgKgorICogaWYgKG5oID09IGllZWUtPm1nbXRfcXVldWVfdGFpbCkKKyAqCQlyZXR1cm4gLTE7CisgKi8KKwlpZWVlLT5tZ210X3F1ZXVlX2hlYWQgPSBuaDsKKwlpZWVlLT5tZ210X3F1ZXVlX3JpbmdbbmhdID0gc2tiOworCisJLy9yZXR1cm4gMDsKK30KKworc3RydWN0IHNrX2J1ZmYgKmRlcXVldWVfbWdtdChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqcmV0OworCisJaWYoaWVlZS0+bWdtdF9xdWV1ZV90YWlsID09IGllZWUtPm1nbXRfcXVldWVfaGVhZCkKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXQgPSBpZWVlLT5tZ210X3F1ZXVlX3JpbmdbaWVlZS0+bWdtdF9xdWV1ZV90YWlsXTsKKworCWllZWUtPm1nbXRfcXVldWVfdGFpbCA9CisJCShpZWVlLT5tZ210X3F1ZXVlX3RhaWwrMSkgJSBNR01UX1FVRVVFX05VTTsKKworCXJldHVybiByZXQ7Cit9CisKK3ZvaWQgaW5pdF9tZ210X3F1ZXVlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCWllZWUtPm1nbXRfcXVldWVfdGFpbCA9IGllZWUtPm1nbXRfcXVldWVfaGVhZCA9IDA7Cit9CisKKwordm9pZCBpZWVlODAyMTFfc3RhX3dha2V1cChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc2hvcnQgbmwpOworCitpbmxpbmUgdm9pZCBzb2Z0bWFjX21nbXRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXNob3J0IHNpbmdsZSA9IGllZWUtPnNvZnRtYWNfZmVhdHVyZXMgJiBJRUVFX1NPRlRNQUNfU0lOR0xFX1FVRVVFOworCXN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICAqaGVhZGVyPQorCQkoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgICopIHNrYi0+ZGF0YTsKKworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKKworCS8qIGNhbGxlZCB3aXRoIDJuZCBwYXJhbSAwLCBubyBtZ210IGxvY2sgcmVxdWlyZWQgKi8KKwlpZWVlODAyMTFfc3RhX3dha2V1cChpZWVlLDApOworCisJaWYoc2luZ2xlKXsKKwkJaWYoaWVlZS0+cXVldWVfc3RvcCl7CisKKwkJCWVucXVldWVfbWdtdChpZWVlLHNrYik7CisJCX1lbHNleworCQkJaGVhZGVyLT5zZXFfY3RsID0gY3B1X3RvX2xlMTYoaWVlZS0+c2VxX2N0cmxbMF08PDQpOworCisJCQlpZiAoaWVlZS0+c2VxX2N0cmxbMF0gPT0gMHhGRkYpCisJCQkJaWVlZS0+c2VxX2N0cmxbMF0gPSAwOworCQkJZWxzZQorCQkJCWllZWUtPnNlcV9jdHJsWzBdKys7CisKKwkJCS8qIGF2b2lkIHdhdGNoZG9nIHRyaWdnZXJzICovCisJCQlpZWVlLT5kZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwkJCWllZWUtPnNvZnRtYWNfZGF0YV9oYXJkX3N0YXJ0X3htaXQoc2tiLGllZWUtPmRldixpZWVlLT5iYXNpY19yYXRlKTsKKwkJfQorCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKKwl9ZWxzZXsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+bG9jaywgZmxhZ3MpOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaWVlZS0+bWdtdF90eF9sb2NrLCBmbGFncyk7CisKKwkJaGVhZGVyLT5zZXFfY3RsID0gY3B1X3RvX2xlMTYoaWVlZS0+c2VxX2N0cmxbMF0gPDwgNCk7CisKKwkJaWYgKGllZWUtPnNlcV9jdHJsWzBdID09IDB4RkZGKQorCQkJaWVlZS0+c2VxX2N0cmxbMF0gPSAwOworCQllbHNlCisJCQlpZWVlLT5zZXFfY3RybFswXSsrOworCisJCS8qIGF2b2lkIHdhdGNoZG9nIHRyaWdnZXJzICovCisJCWllZWUtPmRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCQlpZWVlLT5zb2Z0bWFjX2hhcmRfc3RhcnRfeG1pdChza2IsaWVlZS0+ZGV2KTsKKworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5tZ210X3R4X2xvY2ssIGZsYWdzKTsKKwl9Cit9CisKKworaW5saW5lIHZvaWQgc29mdG1hY19wc19tZ210X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisKKwlzaG9ydCBzaW5nbGUgPSBpZWVlLT5zb2Z0bWFjX2ZlYXR1cmVzICYgSUVFRV9TT0ZUTUFDX1NJTkdMRV9RVUVVRTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciAgKmhlYWRlciA9CisJCShzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciAgKikgc2tiLT5kYXRhOworCisKKwlpZihzaW5nbGUpeworCisJCWhlYWRlci0+c2VxX2N0bCA9IGNwdV90b19sZTE2KGllZWUtPnNlcV9jdHJsWzBdIDw8IDQpOworCisJCWlmIChpZWVlLT5zZXFfY3RybFswXSA9PSAweEZGRikKKwkJCWllZWUtPnNlcV9jdHJsWzBdID0gMDsKKwkJZWxzZQorCQkJaWVlZS0+c2VxX2N0cmxbMF0rKzsKKworCQkvKiBhdm9pZCB3YXRjaGRvZyB0cmlnZ2VycyAqLworCQlpZWVlLT5kZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwkJaWVlZS0+c29mdG1hY19kYXRhX2hhcmRfc3RhcnRfeG1pdChza2IsaWVlZS0+ZGV2LGllZWUtPmJhc2ljX3JhdGUpOworCisJfWVsc2V7CisKKwkJaGVhZGVyLT5zZXFfY3RsID0gY3B1X3RvX2xlMTYoaWVlZS0+c2VxX2N0cmxbMF0gPDwgNCk7CisKKwkJaWYgKGllZWUtPnNlcV9jdHJsWzBdID09IDB4RkZGKQorCQkJaWVlZS0+c2VxX2N0cmxbMF0gPSAwOworCQllbHNlCisJCQlpZWVlLT5zZXFfY3RybFswXSsrOworCisJCS8qIGF2b2lkIHdhdGNoZG9nIHRyaWdnZXJzICovCisJCWllZWUtPmRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCQlpZWVlLT5zb2Z0bWFjX2hhcmRfc3RhcnRfeG1pdChza2IsaWVlZS0+ZGV2KTsKKworCX0KKy8vCWRldl9rZnJlZV9za2JfYW55KHNrYik7Ly9lZGl0IGJ5IHRob21hcworfQorLy9ieSBhbXkgZm9yIHBvd2VyIHNhdmUKK2lubGluZSBzdHJ1Y3Qgc2tfYnVmZiAqaWVlZTgwMjExX2Rpc2Fzc29jaWF0ZV9za2IoCisJCQkJCQkJc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpiZWFjb24sCisJCQkJCQkJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkJCQkJdTgJYXNSc24pCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3QgaWVlZTgwMjExX2Rpc2Fzc29jX2ZyYW1lICpkaXNhc3M7CisKKwlza2IgPSBkZXZfYWxsb2Nfc2tiKHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2Rpc2Fzc29jX2ZyYW1lKSk7CisJaWYgKCFza2IpCisJCXJldHVybiBOVUxMOworCisJZGlzYXNzID0gKHN0cnVjdCBpZWVlODAyMTFfZGlzYXNzb2NfZnJhbWUgKikgc2tiX3B1dChza2Isc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfZGlzYXNzb2NfZnJhbWUpKTsKKwlkaXNhc3MtPmhlYWRlci5mcmFtZV9jdGwgPSBjcHVfdG9fbGUxNihJRUVFODAyMTFfU1RZUEVfRElTQVNTT0MpOworCWRpc2Fzcy0+aGVhZGVyLmR1cmF0aW9uX2lkID0gMDsKKworCW1lbWNweShkaXNhc3MtPmhlYWRlci5hZGRyMSwgYmVhY29uLT5ic3NpZCwgRVRIX0FMRU4pOworCW1lbWNweShkaXNhc3MtPmhlYWRlci5hZGRyMiwgaWVlZS0+ZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOworCW1lbWNweShkaXNhc3MtPmhlYWRlci5hZGRyMywgYmVhY29uLT5ic3NpZCwgRVRIX0FMRU4pOworCisJZGlzYXNzLT5yZWFzb25jb2RlID0gYXNSc247CisJcmV0dXJuIHNrYjsKK30KK3ZvaWQKK1NlbmREaXNhc3NvY2lhdGlvbigKKyAgICAgICAgc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisgICAgICAgIHU4KiAgICAgICAgICAgICAgICAgICAgIGFzU3RhLAorICAgICAgICB1OCAgICAgICAgICAgICAgICAgICAgICBhc1JzbgorKQoreworICAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKmJlYWNvbiA9ICZpZWVlLT5jdXJyZW50X25ldHdvcms7CisgICAgICAgIHN0cnVjdCBza19idWZmICpza2I7CisgICAgICAgIHNrYiA9IGllZWU4MDIxMV9kaXNhc3NvY2lhdGVfc2tiKGJlYWNvbixpZWVlLGFzUnNuKTsKKyAgICAgICAgaWYgKHNrYil7CisgICAgICAgICAgICAgICAgc29mdG1hY19tZ210X3htaXQoc2tiLCBpZWVlKTsKKyAgICAgICAgICAgICAgICAvL2Rldl9rZnJlZV9za2JfYW55KHNrYik7Ly9lZGl0IGJ5IHRob21hcworICAgICAgICB9Cit9CisKKy8vYnkgYW15IGZvciBwb3dlciBzYXZlCitpbmxpbmUgc3RydWN0IHNrX2J1ZmYgKmllZWU4MDIxMV9wcm9iZV9yZXEoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisJdW5zaWduZWQgaW50IGxlbixyYXRlX2xlbjsKKwl1OCAqdGFnOworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IGllZWU4MDIxMV9wcm9iZV9yZXF1ZXN0ICpyZXE7CisKKyNpZmRlZiBfUlRMODE4N19FWFRfUEFUQ0hfCisJc2hvcnQgZXh0TW9yZSA9IDA7CisJaWYoaWVlZS0+ZXh0X3BhdGNoX2llZWU4MDIxMV9wcm9iZV9yZXFfMSkKKwkJZXh0TW9yZSA9IGllZWUtPmV4dF9wYXRjaF9pZWVlODAyMTFfcHJvYmVfcmVxXzEoaWVlZSk7CisjZW5kaWYKKworCWxlbiA9IGllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkX2xlbjsKKworCXJhdGVfbGVuID0gaWVlZTgwMjExX01GSUVfcmF0ZV9sZW4oaWVlZSk7CisKKyNpZmRlZiBfUlRMODE4N19FWFRfUEFUQ0hfCisJaWYoIWV4dE1vcmUpCisjZW5kaWYKKwlza2IgPSBkZXZfYWxsb2Nfc2tiKHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX3Byb2JlX3JlcXVlc3QpICsKKwkJCSAgICAyICsgbGVuICsgcmF0ZV9sZW4pOworI2lmZGVmIF9SVEw4MTg3X0VYVF9QQVRDSF8KKwllbHNlCisJCXNrYiA9IGRldl9hbGxvY19za2Ioc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfcHJvYmVfcmVxdWVzdCkgKworCQkJICAgIDIgKyBsZW4gKyByYXRlX2xlbisxMjgpOyAvLyBNRVNISUQgKyBDQVAKKyNlbmRpZgorCisJaWYgKCFza2IpCisJCXJldHVybiBOVUxMOworCisJcmVxID0gKHN0cnVjdCBpZWVlODAyMTFfcHJvYmVfcmVxdWVzdCAqKSBza2JfcHV0KHNrYixzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9wcm9iZV9yZXF1ZXN0KSk7CisJcmVxLT5oZWFkZXIuZnJhbWVfY3RsID0gY3B1X3RvX2xlMTYoSUVFRTgwMjExX1NUWVBFX1BST0JFX1JFUSk7CisJcmVxLT5oZWFkZXIuZHVyYXRpb25faWQgPSAwOyAvL0ZJWE1FOiBpcyB0aGlzIE9LID8KKworCW1lbXNldChyZXEtPmhlYWRlci5hZGRyMSwgMHhmZiwgRVRIX0FMRU4pOworCW1lbWNweShyZXEtPmhlYWRlci5hZGRyMiwgaWVlZS0+ZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOworCW1lbXNldChyZXEtPmhlYWRlci5hZGRyMywgMHhmZiwgRVRIX0FMRU4pOworCisJdGFnID0gKHU4ICopIHNrYl9wdXQoc2tiLGxlbisyK3JhdGVfbGVuKTsKKworCSp0YWcrKyA9IE1GSUVfVFlQRV9TU0lEOworCSp0YWcrKyA9IGxlbjsKKwltZW1jcHkodGFnLCBpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZCwgbGVuKTsKKwl0YWcgKz0gbGVuOworCWllZWU4MDIxMV9NRklFX0JyYXRlKGllZWUsJnRhZyk7CisJaWVlZTgwMjExX01GSUVfR3JhdGUoaWVlZSwmdGFnKTsKKworI2lmZGVmIF9SVEw4MTg3X0VYVF9QQVRDSF8KKwlpZihleHRNb3JlKQorCQlpZWVlLT5leHRfcGF0Y2hfaWVlZTgwMjExX3Byb2JlX3JlcV8yKGllZWUsIHNrYiwgdGFnKTsKKyNlbmRpZgorCXJldHVybiBza2I7Cit9CisKK3N0cnVjdCBza19idWZmICppZWVlODAyMTFfZ2V0X2JlYWNvbl8oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworCisvLyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDIwKQorLy92b2lkIGV4dF9pZWVlODAyMTFfc2VuZF9iZWFjb25fd3Eoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQorLy97CisvLwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSwgZXh0X3NlbmRfYmVhY29uX3dxKTsKKy8vI2Vsc2UKK3ZvaWQgZXh0X2llZWU4MDIxMV9zZW5kX2JlYWNvbl93cShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKy8vI2VuZGlmCisKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJLy91bnNpZ25lZCBsb25nIGZsYWdzOworCisJc2tiID0gaWVlZTgwMjExX2dldF9iZWFjb25fKGllZWUpOworCisJaWYgKHNrYil7CisJCXNvZnRtYWNfbWdtdF94bWl0KHNrYiwgaWVlZSk7CisJCWllZWUtPnNvZnRtYWNfc3RhdHMudHhfYmVhY29ucysrOworCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOy8vZWRpdCBieSB0aG9tYXMKKwl9CisKKworCS8vcHJpbnRrKEtFUk5fV0FSTklORyAiWzFdIGJlYWNvbiBzZW5kaW5nIVxuIik7CisJaWVlZS0+YmVhY29uX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsKKwkJKE1TRUNTKCBpZWVlLT5jdXJyZW50X25ldHdvcmsuYmVhY29uX2ludGVydmFsIC01KSk7CisKKwkvL3NwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5iZWFjb25fbG9jayxmbGFncyk7CisJaWYoaWVlZS0+YmVhY29uX3R4aW5nKQorCQlhZGRfdGltZXIoJmllZWUtPmJlYWNvbl90aW1lcik7CisJLy9zcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5iZWFjb25fbG9jayxmbGFncyk7Cit9CisKK3ZvaWQgaWVlZTgwMjExX3NlbmRfYmVhY29uKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisKKwkvL3Vuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlza2IgPSBpZWVlODAyMTFfZ2V0X2JlYWNvbl8oaWVlZSk7CisKKwlpZiAoc2tiKXsKKwkJc29mdG1hY19tZ210X3htaXQoc2tiLCBpZWVlKTsKKwkJaWVlZS0+c29mdG1hY19zdGF0cy50eF9iZWFjb25zKys7CisJCWRldl9rZnJlZV9za2JfYW55KHNrYik7Ly9lZGl0IGJ5IHRob21hcworCX0KKworCS8vcHJpbnRrKEtFUk5fV0FSTklORyAiWzFdIGJlYWNvbiBzZW5kaW5nIVxuIik7CisJaWVlZS0+YmVhY29uX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsKKwkJKE1TRUNTKCBpZWVlLT5jdXJyZW50X25ldHdvcmsuYmVhY29uX2ludGVydmFsIC01KSk7CisKKwkvL3NwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5iZWFjb25fbG9jayxmbGFncyk7CisJaWYoaWVlZS0+YmVhY29uX3R4aW5nKQorCQlhZGRfdGltZXIoJmllZWUtPmJlYWNvbl90aW1lcik7CisJLy9zcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5iZWFjb25fbG9jayxmbGFncyk7Cit9CisKKwordm9pZCBpZWVlODAyMTFfc2VuZF9iZWFjb25fY2IodW5zaWduZWQgbG9uZyBfaWVlZSkKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSA9CisJCShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqKSBfaWVlZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPmJlYWNvbl9sb2NrLCBmbGFncyk7CisJaWVlZTgwMjExX3NlbmRfYmVhY29uKGllZWUpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmJlYWNvbl9sb2NrLCBmbGFncyk7Cit9CisKKyNpZmRlZiBfUlRMODE4N19FWFRfUEFUQ0hfCisKK2lubGluZSBzdHJ1Y3Qgc2tfYnVmZiAqaWVlZTgwMjExX3Byb2JlX3JlcV93aXRoX1NTSUQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIGNoYXIgKnNzaWQsIGludCBsZW5fc3NpZCkKK3sKKwl1bnNpZ25lZCBpbnQgbGVuLHJhdGVfbGVuOworCXU4ICp0YWc7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3QgaWVlZTgwMjExX3Byb2JlX3JlcXVlc3QgKnJlcTsKKworI2lmZGVmIF9SVEw4MTg3X0VYVF9QQVRDSF8KKwlzaG9ydCBleHRNb3JlID0gMDsKKwlpZihpZWVlLT5leHRfcGF0Y2hfaWVlZTgwMjExX3Byb2JlX3JlcV8xKQorCQlleHRNb3JlID0gaWVlZS0+ZXh0X3BhdGNoX2llZWU4MDIxMV9wcm9iZV9yZXFfMShpZWVlKTsKKyNlbmRpZgorCisJbGVuID0gbGVuX3NzaWQ7CisKKwlyYXRlX2xlbiA9IGllZWU4MDIxMV9NRklFX3JhdGVfbGVuKGllZWUpOworCisjaWZkZWYgX1JUTDgxODdfRVhUX1BBVENIXworCWlmKCFleHRNb3JlKQorI2VuZGlmCisJc2tiID0gZGV2X2FsbG9jX3NrYihzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9wcm9iZV9yZXF1ZXN0KSArCisJCQkgICAgMiArIGxlbiArIHJhdGVfbGVuKTsKKyNpZmRlZiBfUlRMODE4N19FWFRfUEFUQ0hfCisJZWxzZQorCQlza2IgPSBkZXZfYWxsb2Nfc2tiKHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX3Byb2JlX3JlcXVlc3QpICsKKwkJCSAgICAyICsgbGVuICsgcmF0ZV9sZW4rMTI4KTsgLy8gTUVTSElEICsgQ0FQCisjZW5kaWYKKworCWlmICghc2tiKQorCQlyZXR1cm4gTlVMTDsKKworCXJlcSA9IChzdHJ1Y3QgaWVlZTgwMjExX3Byb2JlX3JlcXVlc3QgKikgc2tiX3B1dChza2Isc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfcHJvYmVfcmVxdWVzdCkpOworCXJlcS0+aGVhZGVyLmZyYW1lX2N0bCA9IGNwdV90b19sZTE2KElFRUU4MDIxMV9TVFlQRV9QUk9CRV9SRVEpOworCXJlcS0+aGVhZGVyLmR1cmF0aW9uX2lkID0gMDsgLy9GSVhNRTogaXMgdGhpcyBPSyA/CisKKwltZW1zZXQocmVxLT5oZWFkZXIuYWRkcjEsIDB4ZmYsIEVUSF9BTEVOKTsKKwltZW1jcHkocmVxLT5oZWFkZXIuYWRkcjIsIGllZWUtPmRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKTsKKwltZW1zZXQocmVxLT5oZWFkZXIuYWRkcjMsIDB4ZmYsIEVUSF9BTEVOKTsKKworCXRhZyA9ICh1OCAqKSBza2JfcHV0KHNrYixsZW4rMityYXRlX2xlbik7CisKKwkqdGFnKysgPSBNRklFX1RZUEVfU1NJRDsKKwkqdGFnKysgPSBsZW47CisJaWYobGVuKQorCXsKKwkJbWVtY3B5KHRhZywgc3NpZCwgbGVuKTsKKwkJdGFnICs9IGxlbjsKKwl9CisKKwlpZWVlODAyMTFfTUZJRV9CcmF0ZShpZWVlLCZ0YWcpOworCWllZWU4MDIxMV9NRklFX0dyYXRlKGllZWUsJnRhZyk7CisKKyNpZmRlZiBfUlRMODE4N19FWFRfUEFUQ0hfCisJaWYoZXh0TW9yZSkKKwkJaWVlZS0+ZXh0X3BhdGNoX2llZWU4MDIxMV9wcm9iZV9yZXFfMihpZWVlLCBza2IsIHRhZyk7CisjZW5kaWYKKwlyZXR1cm4gc2tiOworfQorCisjZW5kaWYgLy8gX1JUTDgxODdfRVhUX1BBVENIXworCisKK3ZvaWQgaWVlZTgwMjExX3NlbmRfcHJvYmUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworI2lmZGVmIF9SVEw4MTg3X0VYVF9QQVRDSF8KKwlpZihpZWVlLT5pd19tb2RlID09IGllZWUtPml3X2V4dF9tb2RlKQorCQlza2IgPSBpZWVlODAyMTFfcHJvYmVfcmVxX3dpdGhfU1NJRChpZWVlLCBOVUxMLCAwKTsKKwllbHNlCisjZW5kaWYKKwlza2IgPSBpZWVlODAyMTFfcHJvYmVfcmVxKGllZWUpOworCWlmIChza2IpeworCQlzb2Z0bWFjX21nbXRfeG1pdChza2IsIGllZWUpOworCQlpZWVlLT5zb2Z0bWFjX3N0YXRzLnR4X3Byb2JlX3JxKys7CisJCS8vZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsvL2VkaXQgYnkgdGhvbWFzCisJfQorfQorCit2b2lkIGllZWU4MDIxMV9zZW5kX3Byb2JlX3JlcXVlc3RzKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCWlmIChpZWVlLT5hY3RpdmVfc2NhbiAmJiAoaWVlZS0+c29mdG1hY19mZWF0dXJlcyAmIElFRUVfU09GVE1BQ19QUk9CRVJRKSl7CisJCWllZWU4MDIxMV9zZW5kX3Byb2JlKGllZWUpOworCQlpZWVlODAyMTFfc2VuZF9wcm9iZShpZWVlKTsKKwl9Cit9CisKKy8qIHRoaXMgcGVyZm9ybXMgc3luY3JvIHNjYW4gYmxvY2tpbmcgdGhlIGNhbGxlciB1bnRpbCBhbGwgY2hhbm5lbHMKKyAqIGluIHRoZSBhbGxvd2VkIGNoYW5uZWwgbWFwIGhhcyBiZWVuIGNoZWNrZWQuCisgKi8KK3ZvaWQgaWVlZTgwMjExX3NvZnRtYWNfc2Nhbl9zeW5jcm8oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisJc2hvcnQgY2ggPSAwOworI2lmZGVmIEVOQUJMRV9ET1QxMUQKKwl1OCBjaGFubmVsX21hcFtNQVhfQ0hBTk5FTF9OVU1CRVIrMV07CisJbWVtY3B5KGNoYW5uZWxfbWFwLCBHRVRfRE9UMTFEX0lORk8oaWVlZSktPmNoYW5uZWxfbWFwLCBNQVhfQ0hBTk5FTF9OVU1CRVIrMSk7CisjZW5kaWYKKwlkb3duKCZpZWVlLT5zY2FuX3NlbSk7CisvLwlwcmludGsoIj09PT09PT09PT09PT09PT09PT4gU3luYyBzY2FuXG4iKTsKKy8vCWR1bXBfY2hubF9tYXAoY2hhbm5lbF9tYXApOworCisJd2hpbGUoMSkKKwl7CisKKwkJZG97CisJCQljaCsrOworCQkJaWYgKGNoID4gTUFYX0NIQU5ORUxfTlVNQkVSKQorCQkJCWdvdG8gb3V0OyAvKiBzY2FuIGNvbXBsZXRlZCAqLworCisjaWZkZWYgRU5BQkxFX0RPVDExRAorCQl9d2hpbGUoIWNoYW5uZWxfbWFwW2NoXSk7CisjZWxzZQorCQl9d2hpbGUoIWllZWUtPmNoYW5uZWxfbWFwW2NoXSk7CisjZW5kaWYKKwkJLyogdGhpcyBmdWN0aW9uIGNhbiBiZSBjYWxsZWQgaW4gdHdvIHNpdHVhdGlvbnMKKwkJICogMS0gV2UgaGF2ZSBzd2l0Y2hlZCB0byBhZC1ob2MgbW9kZSBhbmQgd2UgYXJlCisJCSAqICAgIHBlcmZvcm1pbmcgYSBjb21wbGV0ZSBzeW5jcm8gc2NhbiBiZWZvcmUgY29uY2x1ZGUKKwkJICogICAgdGhlcmUgYXJlIG5vIGludGVyZXN0aW5nIGNlbGwgYW5kIHRvIGNyZWF0ZSBhCisJCSAqICAgIG5ldyBvbmUuIEluIHRoaXMgY2FzZSB0aGUgbGluayBzdGF0ZSBpcworCQkgKiAgICBJRUVFODAyMTFfTk9MSU5LIHVudGlsIHdlIGZvdW5kIGFuIGludGVyZXN0aW5nIGNlbGwuCisJCSAqICAgIElmIHNvIHRoZSBpZWVlODAyMV9uZXdfbmV0LCBjYWxsZWQgYnkgdGhlIFJYIHBhdGgKKwkJICogICAgd2lsbCBzZXQgdGhlIHN0YXRlIHRvIElFRUU4MDIxMV9MSU5LRUQsIHNvIHdlIHN0b3AKKwkJICogICAgc2Nhbm5pbmcKKwkJICogMi0gV2UgYXJlIGxpbmtlZCBhbmQgdGhlIHJvb3QgdXNlcyBydW4gaXdsaXN0IHNjYW4uCisJCSAqICAgIFNvIHdlIHN3aXRjaCB0byBJRUVFODAyMTFfTElOS0VEX1NDQU5OSU5HIHRvIHJlbWVtYmVyCisJCSAqICAgIHRoYXQgd2UgYXJlIHN0aWxsIGxvZ2ljYWxseSBsaW5rZWQgKG5vdCBpbnRlcmVzdGVkIGluCisJCSAqICAgIG5ldyBuZXR3b3JrIGV2ZW50cywgZGVzcGl0ZSBmb3IgdXBkYXRpbmcgdGhlIG5ldCBsaXN0LAorCQkgKiAgICBidXQgd2UgYXJlIHRlbXBvcmFybHkgJ3VubGlua2VkJyBhcyB0aGUgZHJpdmVyIHNoYWxsCisJCSAqICAgIG5vdCBmaWx0ZXIgUlggZnJhbWVzIGFuZCB0aGUgY2hhbm5lbCBpcyBjaGFuZ2luZy4KKwkJICogU28gdGhlIG9ubHkgc2l0dWF0aW9uIGluIHdpdGNoIGFyZSBpbnRlcmVzdGVkIGlzIHRvIGNoZWNrCisJCSAqIGlmIHRoZSBzdGF0ZSBiZWNvbWUgTElOS0VEIGJlY2F1c2Ugb2YgdGhlICMxIHNpdHVhdGlvbgorCQkgKi8KKworCQlpZiAoaWVlZS0+c3RhdGUgPT0gSUVFRTgwMjExX0xJTktFRCkKKwkJCWdvdG8gb3V0OworCisJCWllZWUtPnNldF9jaGFuKGllZWUtPmRldiwgY2gpOworLy8JCXByaW50aygiPT09PT0+Y2hhbm5lbD0lZCAgICIsY2gpOworI2lmZGVmIEVOQUJMRV9ET1QxMUQKKwkJaWYoY2hhbm5lbF9tYXBbY2hdID09IDEpCisjZW5kaWYKKwkJeworLy8JCQlwcmludGsoIj09PT1zZW5kIHByb2JlIHJlcXVlc3RcbiIpOworCQkJaWVlZTgwMjExX3NlbmRfcHJvYmVfcmVxdWVzdHMoaWVlZSk7CisJCX0KKwkJLyogdGhpcyBwcmV2ZW50IGV4Y2Vzc2l2ZSB0aW1lIHdhaXQgd2hlbiB3ZQorCQkgKiBuZWVkIHRvIHdhaXQgZm9yIGEgc3luY3JvIHNjYW4gdG8gZW5kLi4KKwkJICovCisJCWlmIChpZWVlLT5zeW5jX3NjYW5faHVycnl1cCkKKwkJCWdvdG8gb3V0OworCisKKwkJbXNsZWVwX2ludGVycnVwdGlibGVfcnRsKElFRUU4MDIxMV9TT0ZUTUFDX1NDQU5fVElNRSk7CisKKwl9CitvdXQ6CisJaWVlZS0+c3luY19zY2FuX2h1cnJ5dXAgPSAwOworCXVwKCZpZWVlLT5zY2FuX3NlbSk7CisjaWZkZWYgRU5BQkxFX0RPVDExRAorCWlmKElTX0RPVDExRF9FTkFCTEUoaWVlZSkpCisJCURPVDExRF9TY2FuQ29tcGxldGUoaWVlZSk7CisjZW5kaWYKK30KKwordm9pZCBpZWVlODAyMTFfc29mdG1hY19pcHNfc2Nhbl9zeW5jcm8oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisJaW50IGNoOworICAgICAgICB1bnNpZ25lZCBpbnQgd2F0Y2hfZG9nID0gMDsKKyNpZmRlZiBFTkFCTEVfRE9UMTFECisJdTggY2hhbm5lbF9tYXBbTUFYX0NIQU5ORUxfTlVNQkVSKzFdOworCW1lbWNweShjaGFubmVsX21hcCwgR0VUX0RPVDExRF9JTkZPKGllZWUpLT5jaGFubmVsX21hcCwgTUFYX0NIQU5ORUxfTlVNQkVSKzEpOworI2VuZGlmCisgICAgICAgIGRvd24oJmllZWUtPnNjYW5fc2VtKTsKKwljaCA9IGllZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsOworLy8gICAgICAJaWYoaWVlZS0+c3luY19zY2FuX2h1cnJ5dXApCisvLwl7CisKKy8vCQlwcmludGsoInN0b3Agc2NhbiBzeW5jXG4iKTsKKy8vICAgCQlnb3RvIG91dDsKKy8vICAJfQorLy8JcHJpbnRrKCI9PT09PT09aGg9PT09PT09PT09PT09PT0+aXBzIHNjYW5cbiIpOworICAgICAJd2hpbGUoMSkKKyAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIHRoaXMgZnVjdGlvbiBjYW4gYmUgY2FsbGVkIGluIHR3byBzaXR1YXRpb25zCisgICAgICAgICAgICAgICAgICogMS0gV2UgaGF2ZSBzd2l0Y2hlZCB0byBhZC1ob2MgbW9kZSBhbmQgd2UgYXJlCisgICAgICAgICAgICAgICAgICogICAgcGVyZm9ybWluZyBhIGNvbXBsZXRlIHN5bmNybyBzY2FuIGJlZm9yZSBjb25jbHVkZQorICAgICAgICAgICAgICAgICAqICAgIHRoZXJlIGFyZSBubyBpbnRlcmVzdGluZyBjZWxsIGFuZCB0byBjcmVhdGUgYQorICAgICAgICAgICAgICAgICAqICAgIG5ldyBvbmUuIEluIHRoaXMgY2FzZSB0aGUgbGluayBzdGF0ZSBpcworICAgICAgICAgICAgICAgICAqICAgIElFRUU4MDIxMV9OT0xJTksgdW50aWwgd2UgZm91bmQgYW4gaW50ZXJlc3RpbmcgY2VsbC4KKyAgICAgICAgICAgICAgICAgKiAgICBJZiBzbyB0aGUgaWVlZTgwMjFfbmV3X25ldCwgY2FsbGVkIGJ5IHRoZSBSWCBwYXRoCisgICAgICAgICAgICAgICAgICogICAgd2lsbCBzZXQgdGhlIHN0YXRlIHRvIElFRUU4MDIxMV9MSU5LRUQsIHNvIHdlIHN0b3AKKyAgICAgICAgICAgICAgICAgKiAgICBzY2FubmluZworICAgICAgICAgICAgICAgICAqIDItIFdlIGFyZSBsaW5rZWQgYW5kIHRoZSByb290IHVzZXMgcnVuIGl3bGlzdCBzY2FuLgorICAgICAgICAgICAgICAgICAqICAgIFNvIHdlIHN3aXRjaCB0byBJRUVFODAyMTFfTElOS0VEX1NDQU5OSU5HIHRvIHJlbWVtYmVyCisgICAgICAgICAgICAgICAgICogICAgdGhhdCB3ZSBhcmUgc3RpbGwgbG9naWNhbGx5IGxpbmtlZCAobm90IGludGVyZXN0ZWQgaW4KKyAgICAgICAgICAgICAgICAgKiAgICBuZXcgbmV0d29yayBldmVudHMsIGRlc3BpdGUgZm9yIHVwZGF0aW5nIHRoZSBuZXQgbGlzdCwKKyAgICAgICAgICAgICAgICAgKiAgICBidXQgd2UgYXJlIHRlbXBvcmFybHkgJ3VubGlua2VkJyBhcyB0aGUgZHJpdmVyIHNoYWxsCisgICAgICAgICAgICAgICAgICogICAgbm90IGZpbHRlciBSWCBmcmFtZXMgYW5kIHRoZSBjaGFubmVsIGlzIGNoYW5naW5nLgorICAgICAgICAgICAgICAgICAqIFNvIHRoZSBvbmx5IHNpdHVhdGlvbiBpbiB3aXRjaCBhcmUgaW50ZXJlc3RlZCBpcyB0byBjaGVjaworICAgICAgICAgICAgICAgICAqIGlmIHRoZSBzdGF0ZSBiZWNvbWUgTElOS0VEIGJlY2F1c2Ugb2YgdGhlICMxIHNpdHVhdGlvbgorICAgICAgICAgICAgICAgICAqLworCQlpZiAoaWVlZS0+c3RhdGUgPT0gSUVFRTgwMjExX0xJTktFRCkKKwkJeworCQkJZ290byBvdXQ7CisJCX0KKyNpZmRlZiBFTkFCTEVfRE9UMTFECisJCWlmKGNoYW5uZWxfbWFwW2llZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsXSA+IDApCisjZW5kaWYKKwkJeworCQkJaWVlZS0+c2V0X2NoYW4oaWVlZS0+ZGV2LCBpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCk7CisvLwkJCXByaW50aygiPT09PT09PmNoYW5uZWw9JWQgICIsaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWwpOworCQl9CisjaWZkZWYgRU5BQkxFX0RPVDExRAorCQlpZihjaGFubmVsX21hcFtpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbF0gPT0gMSkKKyNlbmRpZgorCQl7CisvLwkJCXByaW50aygiPT09PXNlbmQgcHJvYmUgcmVxdWVzdFxuIik7CisJCQlpZWVlODAyMTFfc2VuZF9wcm9iZV9yZXF1ZXN0cyhpZWVlKTsKKyAgICAgICAgICAgICAgICB9CisJCS8qIHRoaXMgcHJldmVudCBleGNlc3NpdmUgdGltZSB3YWl0IHdoZW4gd2UKKyAgICAgICAgICAgICAgICAgKiBuZWVkIHRvIHdhaXQgZm9yIGEgc3luY3JvIHNjYW4gdG8gZW5kLi4KKyAgICAgICAgICAgICAgICAgKi8KKy8vICAgICAgICAgICAgICAgIGlmIChpZWVlLT5zeW5jX3NjYW5faHVycnl1cCkKKy8vICAgICAgICAgICAgICAgICAgICAgICAgZ290byBvdXQ7CisKKwkJbXNsZWVwX2ludGVycnVwdGlibGVfcnRsKElFRUU4MDIxMV9TT0ZUTUFDX1NDQU5fVElNRSk7CisKKwkJZG97CisJCQlpZiAod2F0Y2hfZG9nKysgPj0gTUFYX0NIQU5ORUxfTlVNQkVSKQorCQkvLwlpZiAoKyt3YXRjaF9kb2cgPj0gMTUpOy8vTUFYX0NIQU5ORUxfTlVNQkVSKSAgLy9ZSixtb2RpZmllZCwwODA2MzAKKwkJCQlnb3RvIG91dDsgLyogc2NhbiBjb21wbGV0ZWQgKi8KKworCQkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWwgPSAoaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWwgKyAxKSVNQVhfQ0hBTk5FTF9OVU1CRVI7CisjaWZkZWYgRU5BQkxFX0RPVDExRAorCQl9d2hpbGUoIWNoYW5uZWxfbWFwW2llZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsXSk7CisjZWxzZQorCQl9d2hpbGUoIWllZWUtPmNoYW5uZWxfbWFwW2llZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsXSk7CisjZW5kaWYKKyAgICAgICAgfQorb3V0OgorCS8vaWVlZS0+c3luY19zY2FuX2h1cnJ5dXAgPSAwOworICAgCS8vaWVlZS0+c2V0X2NoYW4oaWVlZS0+ZGV2LCBjaCk7CisgICAJLy9pZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCA9IGNoOworCWllZWUtPmFjdHNjYW5uaW5nID0gZmFsc2U7CisJdXAoJmllZWUtPnNjYW5fc2VtKTsKKyNpZmRlZiBFTkFCTEVfRE9UMTFECisJaWYoSVNfRE9UMTFEX0VOQUJMRShpZWVlKSkKKwkJRE9UMTFEX1NjYW5Db21wbGV0ZShpZWVlKTsKKyNlbmRpZgorfQorCisKKyNpZiAwCisvKiBjYWxsZWQgYm90aCBieSB3cSB3aXRoIGllZWUtPmxvY2sgaGVsZCAqLwordm9pZCBpZWVlODAyMTFfc29mdG1hY19zY2FuKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCXNob3J0IHdhdGNoZG9nID0gMDsKKworCWRveworCQlpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCA9CisJCQkoaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWwgKyAxKSAlIE1BWF9DSEFOTkVMX05VTUJFUjsKKwkJaWYgKHdhdGNoZG9nKysgPiBNQVhfQ0hBTk5FTF9OVU1CRVIpCisJCQkJcmV0dXJuOyAvKiBubyBnb29kIGNoYW5zICovCisKKwl9d2hpbGUoIWllZWUtPmNoYW5uZWxfbWFwW2llZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsXSk7CisKKworCXNjaGVkdWxlX3dvcmsoJmllZWUtPnNvZnRtYWNfc2Nhbl93cSk7Cit9CisjZW5kaWYKKyNpZmRlZiBFTkFCTEVfSVBTCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMjApKQordm9pZCBpZWVlODAyMTFfc29mdG1hY19zY2FuX3dxKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgZGVsYXllZF93b3JrICpkd29yayA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgZGVsYXllZF93b3JrLCB3b3JrKTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSA9IGNvbnRhaW5lcl9vZihkd29yaywgc3RydWN0IGllZWU4MDIxMV9kZXZpY2UsIHNvZnRtYWNfc2Nhbl93cSk7CisjZWxzZQordm9pZCBpZWVlODAyMTFfc29mdG1hY19zY2FuX3dxKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworI2VuZGlmCisJc3RhdGljIHNob3J0IHdhdGNoZG9nID0gMDsKKyNpZmRlZiBFTkFCTEVfRE9UMTFECisJdTggY2hhbm5lbF9tYXBbTUFYX0NIQU5ORUxfTlVNQkVSKzFdOworCW1lbWNweShjaGFubmVsX21hcCwgR0VUX0RPVDExRF9JTkZPKGllZWUpLT5jaGFubmVsX21hcCwgTUFYX0NIQU5ORUxfTlVNQkVSKzEpOworI2VuZGlmCisvLwlwcmludGsoImllZWU4MDIxMV9zb2Z0bWFjX3NjYW5fd3EgRU5BQkxFX0lQU1xuIik7CisvLwlwcmludGsoImluICVzXG4iLF9fZnVuY19fKTsKKwlkb3duKCZpZWVlLT5zY2FuX3NlbSk7CisKKwlkb3sKKwkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWwgPQorCQkJKGllZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsICsgMSkgJSBNQVhfQ0hBTk5FTF9OVU1CRVI7CisJCWlmICh3YXRjaGRvZysrID4gTUFYX0NIQU5ORUxfTlVNQkVSKQorCQkJCWdvdG8gb3V0OyAvKiBubyBnb29kIGNoYW5zICovCisKKyNpZmRlZiBFTkFCTEVfRE9UMTFECisgCX13aGlsZSghY2hhbm5lbF9tYXBbaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWxdKTsKKyNlbHNlCisgCX13aGlsZSghaWVlZS0+Y2hhbm5lbF9tYXBbaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWxdKTsKKyNlbmRpZgorCisJLy9wcmludGsoImN1cnJlbnRfbmV0d29yay5jaGFubmVsOiVkXG4iLCBpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCk7CisJaWYgKGllZWUtPnNjYW5uaW5nID09IDAgKQorCXsKKwkJcHJpbnRrKCJlcnJvciBvdXQsIHNjYW5uaW5nID0gMFxuIik7CisJCWdvdG8gb3V0OworCX0KKwlpZWVlLT5zZXRfY2hhbihpZWVlLT5kZXYsIGllZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsKTsKKyNpZmRlZiBFTkFCTEVfRE9UMTFECisJaWYoY2hhbm5lbF9tYXBbaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWxdID09IDEpCisjZW5kaWYKKwkJaWVlZTgwMjExX3NlbmRfcHJvYmVfcmVxdWVzdHMoaWVlZSk7CisKKwlxdWV1ZV9kZWxheWVkX3dvcmsoaWVlZS0+d3EsICZpZWVlLT5zb2Z0bWFjX3NjYW5fd3EsIElFRUU4MDIxMV9TT0ZUTUFDX1NDQU5fVElNRSk7CisJdXAoJmllZWUtPnNjYW5fc2VtKTsKKwlyZXR1cm47CitvdXQ6CisJaWVlZS0+YWN0c2Nhbm5pbmcgPSBmYWxzZTsKKwl3YXRjaGRvZyA9IDA7CisJaWVlZS0+c2Nhbm5pbmcgPSAwOworCXVwKCZpZWVlLT5zY2FuX3NlbSk7CisKKyNpZmRlZiBFTkFCTEVfRE9UMTFECisJaWYoSVNfRE9UMTFEX0VOQUJMRShpZWVlKSkKKwkJRE9UMTFEX1NjYW5Db21wbGV0ZShpZWVlKTsKKyNlbmRpZgorCXJldHVybjsKK30KKyNlbHNlCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMjApKQordm9pZCBpZWVlODAyMTFfc29mdG1hY19zY2FuX3dxKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKyAgICAgICAgc3RydWN0IGRlbGF5ZWRfd29yayAqZHdvcmsgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGRlbGF5ZWRfd29yaywgd29yayk7CisgICAgICAgIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlLCBzb2Z0bWFjX3NjYW5fd3EpOworI2Vsc2UKK3ZvaWQgaWVlZTgwMjExX3NvZnRtYWNfc2Nhbl93cShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKyNlbmRpZgorCisgICAgICAgIHNob3J0IHdhdGNoZG9nID0gMDsKKyNpZmRlZiBFTkFCTEVfRE9UMTFECisJdTggY2hhbm5lbF9tYXBbTUFYX0NIQU5ORUxfTlVNQkVSKzFdOworCW1lbWNweShjaGFubmVsX21hcCwgR0VUX0RPVDExRF9JTkZPKGllZWUpLT5jaGFubmVsX21hcCwgTUFYX0NIQU5ORUxfTlVNQkVSKzEpOworI2VuZGlmCisvLyAgICAgIHByaW50aygiZW50ZXIgc2NhbiB3cSx3YXRjaGRvZyBpcyAlZFxuIix3YXRjaGRvZyk7CisgICAgICAgIGRvd24oJmllZWUtPnNjYW5fc2VtKTsKKworICAgICAgICBkb3sKKyAgICAgICAgICAgICAgICBpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCA9CisgICAgICAgICAgICAgICAgICAgICAgICAoaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWwgKyAxKSAlIE1BWF9DSEFOTkVMX05VTUJFUjsKKyAgICAgICAgICAgICAgICBpZiAod2F0Y2hkb2crKyA+IE1BWF9DSEFOTkVMX05VTUJFUikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBvdXQ7IC8qIG5vIGdvb2QgY2hhbnMgKi8KKworI2lmZGVmIEVOQUJMRV9ET1QxMUQKKyAgICAgICAgfXdoaWxlKCFjaGFubmVsX21hcFtpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbF0pOworI2Vsc2UKKyAgICAgICAgfXdoaWxlKCFpZWVlLT5jaGFubmVsX21hcFtpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbF0pOworI2VuZGlmCisKKy8vICAgICAgcHJpbnRrKCJjdXJyZW50X25ldHdvcmsuY2hhbm5lbDolZFxuIiwgaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWwpOworICAgICAgICBpZiAoaWVlZS0+c2Nhbm5pbmcgPT0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwcmludGsoImVycm9yIG91dCwgc2Nhbm5pbmcgPSAwXG4iKTsKKyAgICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorICAgICAgICBpZWVlLT5zZXRfY2hhbihpZWVlLT5kZXYsIGllZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsKTsKKyNpZmRlZiBFTkFCTEVfRE9UMTFECisJaWYoY2hhbm5lbF9tYXBbaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWxdID09IDEpCisjZW5kaWYKKwkJaWVlZTgwMjExX3NlbmRfcHJvYmVfcmVxdWVzdHMoaWVlZSk7CisKKwlxdWV1ZV9kZWxheWVkX3dvcmsoaWVlZS0+d3EsICZpZWVlLT5zb2Z0bWFjX3NjYW5fd3EsIElFRUU4MDIxMV9TT0ZUTUFDX1NDQU5fVElNRSk7CitvdXQ6CisJdXAoJmllZWUtPnNjYW5fc2VtKTsKKyNpZmRlZiBFTkFCTEVfRE9UMTFECisJaWYoSVNfRE9UMTFEX0VOQUJMRShpZWVlKSkKKwkJRE9UMTFEX1NjYW5Db21wbGV0ZShpZWVlKTsKKyNlbmRpZgorfQorCisjZW5kaWYKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkKK3ZvaWQgaWVlZTgwMjExX3NvZnRtYWNfc2Nhbl9jYih1bnNpZ25lZCBsb25nIF9kZXYpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSA9IChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqKV9kZXY7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWVlZS0+bG9jaywgZmxhZ3MpOworCWllZWU4MDIxMV9zb2Z0bWFjX3NjYW4oaWVlZSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+bG9jaywgZmxhZ3MpOworfQorI2VuZGlmCisKKwordm9pZCBpZWVlODAyMTFfYmVhY29uc19zdGFydChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPmJlYWNvbl9sb2NrLGZsYWdzKTsKKworCWllZWUtPmJlYWNvbl90eGluZyA9IDE7CisJaWVlZTgwMjExX3NlbmRfYmVhY29uKGllZWUpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+YmVhY29uX2xvY2ssZmxhZ3MpOworfQorCit2b2lkIGllZWU4MDIxMV9iZWFjb25zX3N0b3Aoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5iZWFjb25fbG9jayxmbGFncyk7CisKKwlpZWVlLT5iZWFjb25fdHhpbmcgPSAwOworIAlkZWxfdGltZXJfc3luYygmaWVlZS0+YmVhY29uX3RpbWVyKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmJlYWNvbl9sb2NrLGZsYWdzKTsKKworfQorCisKK3ZvaWQgaWVlZTgwMjExX3N0b3Bfc2VuZF9iZWFjb25zKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCWlmKGllZWUtPnN0b3Bfc2VuZF9iZWFjb25zKQorCQlpZWVlLT5zdG9wX3NlbmRfYmVhY29ucyhpZWVlLT5kZXYpOworCWlmIChpZWVlLT5zb2Z0bWFjX2ZlYXR1cmVzICYgSUVFRV9TT0ZUTUFDX0JFQUNPTlMpCisJCWllZWU4MDIxMV9iZWFjb25zX3N0b3AoaWVlZSk7Cit9CisKKwordm9pZCBpZWVlODAyMTFfc3RhcnRfc2VuZF9iZWFjb25zKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCWlmKGllZWUtPnN0YXJ0X3NlbmRfYmVhY29ucykKKwkJaWVlZS0+c3RhcnRfc2VuZF9iZWFjb25zKGllZWUtPmRldik7CisJaWYoaWVlZS0+c29mdG1hY19mZWF0dXJlcyAmIElFRUVfU09GVE1BQ19CRUFDT05TKQorCQlpZWVlODAyMTFfYmVhY29uc19zdGFydChpZWVlKTsKK30KKworCit2b2lkIGllZWU4MDIxMV9zb2Z0bWFjX3N0b3Bfc2NhbihzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKy8vCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvL2llZWUtPnN5bmNfc2Nhbl9odXJyeXVwID0gMTsKKworCWRvd24oJmllZWUtPnNjYW5fc2VtKTsKKy8vCXNwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5sb2NrLCBmbGFncyk7CisKKwlpZiAoaWVlZS0+c2Nhbm5pbmcgPT0gMSl7CisJCWllZWUtPnNjYW5uaW5nID0gMDsKKwkJLy9kZWxfdGltZXJfc3luYygmaWVlZS0+c2Nhbl90aW1lcik7CisJCWNhbmNlbF9kZWxheWVkX3dvcmsoJmllZWUtPnNvZnRtYWNfc2Nhbl93cSk7CisJfQorCisvLwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5sb2NrLCBmbGFncyk7CisJdXAoJmllZWUtPnNjYW5fc2VtKTsKK30KKwordm9pZCBpZWVlODAyMTFfc3RvcF9zY2FuKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCWlmIChpZWVlLT5zb2Z0bWFjX2ZlYXR1cmVzICYgSUVFRV9TT0ZUTUFDX1NDQU4pCisJCWllZWU4MDIxMV9zb2Z0bWFjX3N0b3Bfc2NhbihpZWVlKTsKKwllbHNlCisJCWllZWUtPnN0b3Bfc2NhbihpZWVlLT5kZXYpOworfQorCisvKiBjYWxsZWQgd2l0aCBpZWVlLT5sb2NrIGhlbGQgKi8KK3ZvaWQgaWVlZTgwMjExX3N0YXJ0X3NjYW4oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisjaWZkZWYgRU5BQkxFX0RPVDExRAorCWlmKElTX0RPVDExRF9FTkFCTEUoaWVlZSkgKQorCXsKKwkJaWYoSVNfQ09VTlRSWV9JRV9WQUxJRChpZWVlKSkKKwkJeworCQkJUkVTRVRfQ0lFX1dBVENIRE9HKGllZWUpOworCQl9CisJfQorI2VuZGlmCisJaWYgKGllZWUtPnNvZnRtYWNfZmVhdHVyZXMgJiBJRUVFX1NPRlRNQUNfU0NBTil7CisJCWlmIChpZWVlLT5zY2FubmluZyA9PSAwKQorCQl7CisJCQlpZWVlLT5zY2FubmluZyA9IDE7CisJCQkvL2llZWU4MDIxMV9zb2Z0bWFjX3NjYW4oaWVlZSk7CisJCS8vCXF1ZXVlX3dvcmsoaWVlZS0+d3EsICZpZWVlLT5zb2Z0bWFjX3NjYW5fd3EpOworCQkvL2NhcmUgdGhpcywxMjAzLDIwMDcsYnkgbGF3cmVuY2UKKyNpZiAxCisJCQlxdWV1ZV9kZWxheWVkX3dvcmsoaWVlZS0+d3EsICZpZWVlLT5zb2Z0bWFjX3NjYW5fd3EsMCk7CisjZW5kaWYKKwkJfQorCX1lbHNlCisJCWllZWUtPnN0YXJ0X3NjYW4oaWVlZS0+ZGV2KTsKKworfQorCisvKiBjYWxsZWQgd2l0aCB3eF9zZW0gaGVsZCAqLwordm9pZCBpZWVlODAyMTFfc3RhcnRfc2Nhbl9zeW5jcm8oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisjaWZkZWYgRU5BQkxFX0RPVDExRAorCWlmKElTX0RPVDExRF9FTkFCTEUoaWVlZSkgKQorCXsKKwkJaWYoSVNfQ09VTlRSWV9JRV9WQUxJRChpZWVlKSkKKwkJeworCQkJUkVTRVRfQ0lFX1dBVENIRE9HKGllZWUpOworCQl9CisJfQorI2VuZGlmCisJaWVlZS0+c3luY19zY2FuX2h1cnJ5dXAgPSAwOworCisJaWYgKGllZWUtPnNvZnRtYWNfZmVhdHVyZXMgJiBJRUVFX1NPRlRNQUNfU0NBTikKKwkJaWVlZTgwMjExX3NvZnRtYWNfc2Nhbl9zeW5jcm8oaWVlZSk7CisJZWxzZQorCQlpZWVlLT5zY2FuX3N5bmNybyhpZWVlLT5kZXYpOworCit9CisKK2lubGluZSBzdHJ1Y3Qgc2tfYnVmZiAqaWVlZTgwMjExX2F1dGhlbnRpY2F0aW9uX3JlcShzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKmJlYWNvbiwKKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgaW50IGNoYWxsZW5nZWxlbikKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBpZWVlODAyMTFfYXV0aGVudGljYXRpb24gKmF1dGg7CisKKwlza2IgPSBkZXZfYWxsb2Nfc2tiKHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2F1dGhlbnRpY2F0aW9uKSArIGNoYWxsZW5nZWxlbik7CisKKwlpZiAoIXNrYikgcmV0dXJuIE5VTEw7CisKKwlhdXRoID0gKHN0cnVjdCBpZWVlODAyMTFfYXV0aGVudGljYXRpb24gKikKKwkJc2tiX3B1dChza2IsIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2F1dGhlbnRpY2F0aW9uKSk7CisKKwlhdXRoLT5oZWFkZXIuZnJhbWVfY3RsID0gSUVFRTgwMjExX1NUWVBFX0FVVEg7CisJaWYgKGNoYWxsZW5nZWxlbikgYXV0aC0+aGVhZGVyLmZyYW1lX2N0bCB8PSBJRUVFODAyMTFfRkNUTF9XRVA7CisKKwlhdXRoLT5oZWFkZXIuZHVyYXRpb25faWQgPSAweDAxM2E7IC8vRklYTUUKKworCW1lbWNweShhdXRoLT5oZWFkZXIuYWRkcjEsIGJlYWNvbi0+YnNzaWQsIEVUSF9BTEVOKTsKKwltZW1jcHkoYXV0aC0+aGVhZGVyLmFkZHIyLCBpZWVlLT5kZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7CisJbWVtY3B5KGF1dGgtPmhlYWRlci5hZGRyMywgYmVhY29uLT5ic3NpZCwgRVRIX0FMRU4pOworCisJYXV0aC0+YWxnb3JpdGhtID0gaWVlZS0+b3Blbl93ZXAgPyBXTEFOX0FVVEhfT1BFTiA6IFdMQU5fQVVUSF9TSEFSRURfS0VZOworCisJYXV0aC0+dHJhbnNhY3Rpb24gPSBjcHVfdG9fbGUxNihpZWVlLT5hc3NvY2lhdGVfc2VxKTsKKwlpZWVlLT5hc3NvY2lhdGVfc2VxKys7CisKKwlhdXRoLT5zdGF0dXMgPSBjcHVfdG9fbGUxNihXTEFOX1NUQVRVU19TVUNDRVNTKTsKKworCXJldHVybiBza2I7CisKK30KKworc3RhdGljIHN0cnVjdCBza19idWZmKiBpZWVlODAyMTFfcHJvYmVfcmVzcChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgdTggKmRlc3QpCit7CisJdTggKnRhZzsKKwlpbnQgYmVhY29uX3NpemU7CisJc3RydWN0IGllZWU4MDIxMV9wcm9iZV9yZXNwb25zZSAqYmVhY29uX2J1ZjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWludCBlbmNyeXB0OworCWludCBhdGltX2xlbixlcnBfbGVuOworCXN0cnVjdCBpZWVlODAyMTFfY3J5cHRfZGF0YSogY3J5cHQ7CisKKwljaGFyICpzc2lkID0gaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWQ7CisJaW50IHNzaWRfbGVuID0gaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWRfbGVuOworCWludCByYXRlX2xlbiA9IGllZWUtPmN1cnJlbnRfbmV0d29yay5yYXRlc19sZW4rMjsKKwlpbnQgcmF0ZV9leF9sZW4gPSBpZWVlLT5jdXJyZW50X25ldHdvcmsucmF0ZXNfZXhfbGVuOworCWludCB3cGFfaWVfbGVuID0gaWVlZS0+d3BhX2llX2xlbjsKKwlpZihyYXRlX2V4X2xlbiA+IDApIHJhdGVfZXhfbGVuKz0yOworCisJaWYoaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNhcGFiaWxpdHkgJiBXTEFOX0NBUEFCSUxJVFlfSUJTUykKKwkJYXRpbV9sZW4gPSA0OworCWVsc2UKKwkJYXRpbV9sZW4gPSAwOworCisJaWYoaWVlZTgwMjExX2lzXzU0ZyhpZWVlLT5jdXJyZW50X25ldHdvcmspKQorCQllcnBfbGVuID0gMzsKKwllbHNlCisJCWVycF9sZW4gPSAwOworCisJYmVhY29uX3NpemUgPSBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9wcm9iZV9yZXNwb25zZSkrCisJCXNzaWRfbGVuCisJCSszIC8vY2hhbm5lbAorCQkrcmF0ZV9sZW4KKwkJK3JhdGVfZXhfbGVuCisJCSthdGltX2xlbgorCQkrd3BhX2llX2xlbgorCQkrZXJwX2xlbjsKKworCXNrYiA9IGRldl9hbGxvY19za2IoYmVhY29uX3NpemUpOworCisJaWYgKCFza2IpCisJCXJldHVybiBOVUxMOworCisJYmVhY29uX2J1ZiA9IChzdHJ1Y3QgaWVlZTgwMjExX3Byb2JlX3Jlc3BvbnNlKikgc2tiX3B1dChza2IsIGJlYWNvbl9zaXplKTsKKworCW1lbWNweSAoYmVhY29uX2J1Zi0+aGVhZGVyLmFkZHIxLCBkZXN0LEVUSF9BTEVOKTsKKwltZW1jcHkgKGJlYWNvbl9idWYtPmhlYWRlci5hZGRyMiwgaWVlZS0+ZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOworCW1lbWNweSAoYmVhY29uX2J1Zi0+aGVhZGVyLmFkZHIzLCBpZWVlLT5jdXJyZW50X25ldHdvcmsuYnNzaWQsIEVUSF9BTEVOKTsKKworCWJlYWNvbl9idWYtPmhlYWRlci5kdXJhdGlvbl9pZCA9IDA7IC8vRklYTUUKKwliZWFjb25fYnVmLT5iZWFjb25faW50ZXJ2YWwgPQorCQljcHVfdG9fbGUxNihpZWVlLT5jdXJyZW50X25ldHdvcmsuYmVhY29uX2ludGVydmFsKTsKKwliZWFjb25fYnVmLT5jYXBhYmlsaXR5ID0KKwkJY3B1X3RvX2xlMTYoaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNhcGFiaWxpdHkgJiBXTEFOX0NBUEFCSUxJVFlfSUJTUyk7CisKKwlpZihpZWVlLT5zaG9ydF9zbG90ICYmIChpZWVlLT5jdXJyZW50X25ldHdvcmsuY2FwYWJpbGl0eSAmIFdMQU5fQ0FQQUJJTElUWV9TSE9SVF9TTE9UKSkKKwkJY3B1X3RvX2xlMTYoKGJlYWNvbl9idWYtPmNhcGFiaWxpdHkgfD0gV0xBTl9DQVBBQklMSVRZX1NIT1JUX1NMT1QpKTsKKworCWNyeXB0ID0gaWVlZS0+Y3J5cHRbaWVlZS0+dHhfa2V5aWR4XTsKKworCWVuY3J5cHQgPSBpZWVlLT5ob3N0X2VuY3J5cHQgJiYgY3J5cHQgJiYgY3J5cHQtPm9wcyAmJgorCQkoKDAgPT0gc3RyY21wKGNyeXB0LT5vcHMtPm5hbWUsICJXRVAiKSkgfHwgd3BhX2llX2xlbik7CisKKwlpZiAoZW5jcnlwdCkKKwkJYmVhY29uX2J1Zi0+Y2FwYWJpbGl0eSB8PSBjcHVfdG9fbGUxNihXTEFOX0NBUEFCSUxJVFlfUFJJVkFDWSk7CisKKworCWJlYWNvbl9idWYtPmhlYWRlci5mcmFtZV9jdGwgPSBjcHVfdG9fbGUxNihJRUVFODAyMTFfU1RZUEVfUFJPQkVfUkVTUCk7CisKKwliZWFjb25fYnVmLT5pbmZvX2VsZW1lbnQuaWQgPSBNRklFX1RZUEVfU1NJRDsKKwliZWFjb25fYnVmLT5pbmZvX2VsZW1lbnQubGVuID0gc3NpZF9sZW47CisKKwl0YWcgPSAodTgqKSBiZWFjb25fYnVmLT5pbmZvX2VsZW1lbnQuZGF0YTsKKworCW1lbWNweSh0YWcsIHNzaWQsIHNzaWRfbGVuKTsKKworCXRhZyArPSBzc2lkX2xlbjsKKworCSoodGFnKyspID0gTUZJRV9UWVBFX1JBVEVTOworCSoodGFnKyspID0gcmF0ZV9sZW4tMjsKKwltZW1jcHkodGFnLGllZWUtPmN1cnJlbnRfbmV0d29yay5yYXRlcyxyYXRlX2xlbi0yKTsKKwl0YWcrPXJhdGVfbGVuLTI7CisKKwkqKHRhZysrKSA9IE1GSUVfVFlQRV9EU19TRVQ7CisJKih0YWcrKykgPSAxOworCSoodGFnKyspID0gaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWw7CisKKwlpZihhdGltX2xlbil7CisJCSoodGFnKyspID0gTUZJRV9UWVBFX0lCU1NfU0VUOworCQkqKHRhZysrKSA9IDI7CisJCSooKHUxNiopKHRhZykpID0gY3B1X3RvX2xlMTYoaWVlZS0+Y3VycmVudF9uZXR3b3JrLmF0aW1fd2luZG93KTsKKwkJdGFnKz0yOworCX0KKworCWlmKGVycF9sZW4peworCQkqKHRhZysrKSA9IE1GSUVfVFlQRV9FUlA7CisJCSoodGFnKyspID0gMTsKKwkJKih0YWcrKykgPSAwOworCX0KKworCWlmKHJhdGVfZXhfbGVuKXsKKwkJKih0YWcrKykgPSBNRklFX1RZUEVfUkFURVNfRVg7CisJCSoodGFnKyspID0gcmF0ZV9leF9sZW4tMjsKKwkJbWVtY3B5KHRhZyxpZWVlLT5jdXJyZW50X25ldHdvcmsucmF0ZXNfZXgscmF0ZV9leF9sZW4tMik7CisJCXRhZys9cmF0ZV9leF9sZW4tMjsKKwl9CisKKwlpZiAod3BhX2llX2xlbikKKwl7CisJCWlmIChpZWVlLT5pd19tb2RlID09IElXX01PREVfQURIT0MpCisJCXsvL2FzIFdpbmRvd3Mgd2lsbCBzZXQgcGFpcndpc2Uga2V5IHNhbWUgYXMgdGhlIGdyb3VwIGtleSB3aGljaCBpcyBub3QgYWxsb3dlZCBpbiBMaW51eCwgc28gc2V0IHRoaXMgZm9yIElPVCBpc3N1ZS4gV0IgMjAwOC4wNy4wNworCQkJbWVtY3B5KCZpZWVlLT53cGFfaWVbMTRdLCAmaWVlZS0+d3BhX2llWzhdLCA0KTsKKwkJfQorCisJCW1lbWNweSh0YWcsIGllZWUtPndwYV9pZSwgaWVlZS0+d3BhX2llX2xlbik7CisJfQorCisJc2tiLT5kZXYgPSBpZWVlLT5kZXY7CisJcmV0dXJuIHNrYjsKK30KKyNpZmRlZiBfUlRMODE4N19FWFRfUEFUQ0hfCitzdHJ1Y3Qgc2tfYnVmZiogaWVlZTgwMjExX2V4dF9wcm9iZV9yZXNwX2J5X25ldChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgdTggKmRlc3QsIHN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqbmV0KQoreworCXU4ICp0YWc7CisJaW50IGJlYWNvbl9zaXplOworCXN0cnVjdCBpZWVlODAyMTFfcHJvYmVfcmVzcG9uc2UgKmJlYWNvbl9idWY7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlpbnQgZW5jcnlwdDsKKwlpbnQgYXRpbV9sZW4sZXJwX2xlbjsKKwlzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEqIGNyeXB0OworCXU4IGJyb2FkY2FzdF9hZGRyW10gPSB7MHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmZ9OworCWludCB3cGFfaWVfbGVuID0gaWVlZS0+d3BhX2llX2xlbjsKKwljaGFyICpzc2lkID0gbmV0LT5zc2lkOworCWludCBzc2lkX2xlbiA9IG5ldC0+c3NpZF9sZW47CisKKwlpbnQgcmF0ZV9sZW4gPSBpZWVlLT5jdXJyZW50X25ldHdvcmsucmF0ZXNfbGVuKzI7CisJaW50IHJhdGVfZXhfbGVuID0gaWVlZS0+Y3VycmVudF9uZXR3b3JrLnJhdGVzX2V4X2xlbjsKKwlpZihyYXRlX2V4X2xlbiA+IDApIHJhdGVfZXhfbGVuKz0yOworCisJaWYoIGllZWUtPm1lc2hTY2FuTW9kZSY0KQorCQlpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCA9IGllZWUtPmV4dF9wYXRjaF9pZWVlODAyMTFfZXh0X3N0b3Bfc2Nhbl93cV9zZXRfY2hhbm5lbChpZWVlKTsKKwlpZiggaWVlZS0+bWVzaFNjYW5Nb2RlJjYpCisJeworCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw1LDApCisJCXF1ZXVlX3dvcmsoaWVlZS0+d3EsICZpZWVlLT5leHRfc3RvcF9zY2FuX3dxKTsKKyNlbHNlCisJCXNjaGVkdWxlX3Rhc2soJmllZWUtPmV4dF9zdG9wX3NjYW5fd3EpOworI2VuZGlmCisJfQorCWlmKGllZWUtPmN1cnJlbnRfbmV0d29yay5jYXBhYmlsaXR5ICYgV0xBTl9DQVBBQklMSVRZX0lCU1MpIC8vIHVzZSBjdXJyZW50X25ldHdvcmsgaGVyZQorCQlhdGltX2xlbiA9IDQ7CisJZWxzZQorCQlhdGltX2xlbiA9IDA7CisKKwlpZihpZWVlODAyMTFfaXNfNTRnKCpuZXQpKQorCQllcnBfbGVuID0gMzsKKwllbHNlCisJCWVycF9sZW4gPSAwOworCisJYmVhY29uX3NpemUgPSBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9wcm9iZV9yZXNwb25zZSkrCisJCXNzaWRfbGVuCisJCSszIC8vY2hhbm5lbAorCQkrcmF0ZV9sZW4KKwkJK3JhdGVfZXhfbGVuCisJCSthdGltX2xlbgorCQkrZXJwX2xlbjsKKy8vYgorCXNrYiA9IGRldl9hbGxvY19za2IoYmVhY29uX3NpemUrMTk2KTsKKworCWlmICghc2tiKQorIAkJcmV0dXJuIE5VTEw7CisKKwliZWFjb25fYnVmID0gKHN0cnVjdCBpZWVlODAyMTFfcHJvYmVfcmVzcG9uc2UqKSBza2JfcHV0KHNrYiwgYmVhY29uX3NpemUpOworCisJbWVtY3B5IChiZWFjb25fYnVmLT5oZWFkZXIuYWRkcjEsIGRlc3QsRVRIX0FMRU4pOworCW1lbWNweSAoYmVhY29uX2J1Zi0+aGVhZGVyLmFkZHIyLCBpZWVlLT5kZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7CisJbWVtY3B5IChiZWFjb25fYnVmLT5oZWFkZXIuYWRkcjMsIGllZWUtPmN1cnJlbnRfbmV0d29yay5ic3NpZCwgRVRIX0FMRU4pOworCisJYmVhY29uX2J1Zi0+aGVhZGVyLmR1cmF0aW9uX2lkID0gMDsgLy9GSVhNRQorCisJYmVhY29uX2J1Zi0+YmVhY29uX2ludGVydmFsID0KKwkJY3B1X3RvX2xlMTYoaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJlYWNvbl9pbnRlcnZhbCk7ICAvLyB1c2UgY3VycmVudF9uZXR3b3JrIGhlcmUKKwliZWFjb25fYnVmLT5jYXBhYmlsaXR5ID0KKwkJY3B1X3RvX2xlMTYoaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNhcGFiaWxpdHkgJiBXTEFOX0NBUEFCSUxJVFlfSUJTUyk7CisKKwlpZihpZWVlLT5zaG9ydF9zbG90ICYmIChpZWVlLT5jdXJyZW50X25ldHdvcmsuY2FwYWJpbGl0eSAmIFdMQU5fQ0FQQUJJTElUWV9TSE9SVF9TTE9UKSkKKwkJY3B1X3RvX2xlMTYoKGJlYWNvbl9idWYtPmNhcGFiaWxpdHkgfD0gV0xBTl9DQVBBQklMSVRZX1NIT1JUX1NMT1QpKTsKKworCWNyeXB0ID0gaWVlZS0+Y3J5cHRbaWVlZS0+dHhfa2V5aWR4XTsKKworCWVuY3J5cHQgPSBpZWVlLT5ob3N0X2VuY3J5cHQgJiYgY3J5cHQgJiYgY3J5cHQtPm9wcyAmJgorCQkoKDAgPT0gc3RyY21wKGNyeXB0LT5vcHMtPm5hbWUsICJXRVAiKSl8fHdwYV9pZV9sZW4pOworCisJaWYgKGVuY3J5cHQpCisJCWJlYWNvbl9idWYtPmNhcGFiaWxpdHkgfD0gY3B1X3RvX2xlMTYoV0xBTl9DQVBBQklMSVRZX1BSSVZBQ1kpOworCisKKwliZWFjb25fYnVmLT5oZWFkZXIuZnJhbWVfY3RsID0gY3B1X3RvX2xlMTYoSUVFRTgwMjExX1NUWVBFX1BST0JFX1JFU1ApOworCisJYmVhY29uX2J1Zi0+aW5mb19lbGVtZW50LmlkID0gTUZJRV9UWVBFX1NTSUQ7CisJYmVhY29uX2J1Zi0+aW5mb19lbGVtZW50LmxlbiA9IHNzaWRfbGVuOworCisJdGFnID0gKHU4KikgYmVhY29uX2J1Zi0+aW5mb19lbGVtZW50LmRhdGE7CisKKwkvLyBicm9jYWQgY2FzdCAvIHByb2JlIHJzcAorCWlmKG1lbWNtcChkZXN0LCBicm9hZGNhc3RfYWRkciwgRVRIX0FMRU4gKSkKKwkJbWVtY3B5KHRhZywgc3NpZCwgc3NpZF9sZW4pOworCWVsc2UKKwkJc3NpZF9sZW49MDsKKworCXRhZyArPSBzc2lkX2xlbjsKKworLy9nZXRfYnNzcmF0ZV9zZXQocHJpdiwgX1NVUFBPUlRFRFJBVEVTX0lFXywgJnBic3NyYXRlLCAmYnNzcmF0ZV9sZW4pOworLy9wYnVmID0gc2V0X2llKHBidWYsIF9TVVBQT1JURURSQVRFU19JRV8sIGJzc3JhdGVfbGVuLCBwYnNzcmF0ZSwgJmZybGVuKTsKKworCSoodGFnKyspID0gTUZJRV9UWVBFX1JBVEVTOworCSoodGFnKyspID0gcmF0ZV9sZW4tMjsKKwltZW1jcHkodGFnLGllZWUtPmN1cnJlbnRfbmV0d29yay5yYXRlcyxyYXRlX2xlbi0yKTsKKwl0YWcrPXJhdGVfbGVuLTI7CisKKwkqKHRhZysrKSA9IE1GSUVfVFlQRV9EU19TRVQ7CisJKih0YWcrKykgPSAxOworCSoodGFnKyspID0gaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWw7ICAvLyB1c2UgY3VycmVudF9uZXR3b3JrIGhlcmUKKworCisJaWYoYXRpbV9sZW4peworCQkqKHRhZysrKSA9IE1GSUVfVFlQRV9JQlNTX1NFVDsKKwkJKih0YWcrKykgPSAyOworCQkqKCh1MTYqKSh0YWcpKSA9IGNwdV90b19sZTE2KGllZWUtPmN1cnJlbnRfbmV0d29yay5hdGltX3dpbmRvdyk7IC8vIHVzZSBjdXJyZW50X25ldHdvcmsgaGVyZQorCQl0YWcrPTI7CisJfQorCisJaWYoZXJwX2xlbil7CisJCSoodGFnKyspID0gTUZJRV9UWVBFX0VSUDsKKwkJKih0YWcrKykgPSAxOworCQkqKHRhZysrKSA9IDA7CisJfQorCisJaWYocmF0ZV9leF9sZW4peworCQkqKHRhZysrKSA9IE1GSUVfVFlQRV9SQVRFU19FWDsKKwkJKih0YWcrKykgPSByYXRlX2V4X2xlbi0yOworCQltZW1jcHkodGFnLGllZWUtPmN1cnJlbnRfbmV0d29yay5yYXRlc19leCxyYXRlX2V4X2xlbi0yKTsKKwkJdGFnKz1yYXRlX2V4X2xlbi0yOworCX0KKwlpZiAod3BhX2llX2xlbikKKwkJbWVtY3B5KHRhZywgaWVlZS0+d3BhX2llLCBpZWVlLT53cGFfaWVfbGVuKTsKKworCXNrYi0+ZGV2ID0gaWVlZS0+ZGV2OworCXJldHVybiBza2I7Cit9CisjZW5kaWYgLy8gX1JUTDgxODdfRVhUX1BBVENIXworCitzdHJ1Y3Qgc2tfYnVmZiogaWVlZTgwMjExX2Fzc29jX3Jlc3Aoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHU4ICpkZXN0KQoreworCXN0cnVjdCBza19idWZmICpza2I7CisJdTgqIHRhZzsKKworCXN0cnVjdCBpZWVlODAyMTFfY3J5cHRfZGF0YSogY3J5cHQ7CisJc3RydWN0IGllZWU4MDIxMV9hc3NvY19yZXNwb25zZV9mcmFtZSAqYXNzb2M7CisJc2hvcnQgZW5jcnlwdDsKKworCXVuc2lnbmVkIGludCByYXRlX2xlbiA9IGllZWU4MDIxMV9NRklFX3JhdGVfbGVuKGllZWUpOworCWludCBsZW4gPSBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9hc3NvY19yZXNwb25zZV9mcmFtZSkgKyByYXRlX2xlbjsKKworCXNrYiA9IGRldl9hbGxvY19za2IobGVuKTsKKworCWlmICghc2tiKQorCQlyZXR1cm4gTlVMTDsKKworCWFzc29jID0gKHN0cnVjdCBpZWVlODAyMTFfYXNzb2NfcmVzcG9uc2VfZnJhbWUgKikKKwkJc2tiX3B1dChza2Isc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfYXNzb2NfcmVzcG9uc2VfZnJhbWUpKTsKKworCWFzc29jLT5oZWFkZXIuZnJhbWVfY3RsID0gY3B1X3RvX2xlMTYoSUVFRTgwMjExX1NUWVBFX0FTU09DX1JFU1ApOworCW1lbWNweShhc3NvYy0+aGVhZGVyLmFkZHIxLCBkZXN0LEVUSF9BTEVOKTsKKwltZW1jcHkoYXNzb2MtPmhlYWRlci5hZGRyMywgaWVlZS0+ZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOworCW1lbWNweShhc3NvYy0+aGVhZGVyLmFkZHIyLCBpZWVlLT5kZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7CisJYXNzb2MtPmNhcGFiaWxpdHkgPSBjcHVfdG9fbGUxNihpZWVlLT5pd19tb2RlID09IElXX01PREVfTUFTVEVSID8KKwkJV0xBTl9DQVBBQklMSVRZX0JTUyA6IFdMQU5fQ0FQQUJJTElUWV9JQlNTKTsKKworCisJaWYoaWVlZS0+c2hvcnRfc2xvdCkKKwkJYXNzb2MtPmNhcGFiaWxpdHkgfD0gY3B1X3RvX2xlMTYoV0xBTl9DQVBBQklMSVRZX1NIT1JUX1NMT1QpOworCisJaWYgKGllZWUtPmhvc3RfZW5jcnlwdCkKKwkJY3J5cHQgPSBpZWVlLT5jcnlwdFtpZWVlLT50eF9rZXlpZHhdOworCWVsc2UgY3J5cHQgPSBOVUxMOworCisJZW5jcnlwdCA9ICggY3J5cHQgJiYgY3J5cHQtPm9wcyk7CisKKwlpZiAoZW5jcnlwdCkKKwkJYXNzb2MtPmNhcGFiaWxpdHkgfD0gY3B1X3RvX2xlMTYoV0xBTl9DQVBBQklMSVRZX1BSSVZBQ1kpOworCisJYXNzb2MtPnN0YXR1cyA9IDA7CisJYXNzb2MtPmFpZCA9IGNwdV90b19sZTE2KGllZWUtPmFzc29jX2lkKTsKKwlpZiAoaWVlZS0+YXNzb2NfaWQgPT0gMHgyMDA3KSBpZWVlLT5hc3NvY19pZD0wOworCWVsc2UgaWVlZS0+YXNzb2NfaWQrKzsKKworCXRhZyA9ICh1OCopIHNrYl9wdXQoc2tiLCByYXRlX2xlbik7CisKKwlpZWVlODAyMTFfTUZJRV9CcmF0ZShpZWVlLCAmdGFnKTsKKwlpZWVlODAyMTFfTUZJRV9HcmF0ZShpZWVlLCAmdGFnKTsKKworCXJldHVybiBza2I7Cit9CisKK3N0cnVjdCBza19idWZmKiBpZWVlODAyMTFfYXV0aF9yZXNwKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLGludCBzdGF0dXMsIHU4ICpkZXN0KQoreworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IGllZWU4MDIxMV9hdXRoZW50aWNhdGlvbiAqYXV0aDsKKworCXNrYiA9IGRldl9hbGxvY19za2Ioc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfYXV0aGVudGljYXRpb24pKzEpOworCisJaWYgKCFza2IpCisJCXJldHVybiBOVUxMOworCisJc2tiLT5sZW4gPSBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9hdXRoZW50aWNhdGlvbik7CisKKwlhdXRoID0gKHN0cnVjdCBpZWVlODAyMTFfYXV0aGVudGljYXRpb24gKilza2ItPmRhdGE7CisKKwlhdXRoLT5zdGF0dXMgPSBjcHVfdG9fbGUxNihzdGF0dXMpOworCWF1dGgtPnRyYW5zYWN0aW9uID0gY3B1X3RvX2xlMTYoMik7CisJYXV0aC0+YWxnb3JpdGhtID0gY3B1X3RvX2xlMTYoV0xBTl9BVVRIX09QRU4pOworCisjaWZkZWYgX1JUTDgxODdfRVhUX1BBVENIXworCWlmKGllZWUtPml3X21vZGUgPT0gaWVlZS0+aXdfZXh0X21vZGUpCisJCW1lbWNweShhdXRoLT5oZWFkZXIuYWRkcjMsIGRlc3QsIEVUSF9BTEVOKTsKKyNlbHNlCisJbWVtY3B5KGF1dGgtPmhlYWRlci5hZGRyMywgaWVlZS0+ZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOworI2VuZGlmCisJbWVtY3B5KGF1dGgtPmhlYWRlci5hZGRyMiwgaWVlZS0+ZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOworCW1lbWNweShhdXRoLT5oZWFkZXIuYWRkcjEsIGRlc3QsIEVUSF9BTEVOKTsKKwlhdXRoLT5oZWFkZXIuZnJhbWVfY3RsID0gY3B1X3RvX2xlMTYoSUVFRTgwMjExX1NUWVBFX0FVVEgpOworCXJldHVybiBza2I7CisKKworfQorCitzdHJ1Y3Qgc2tfYnVmZiogaWVlZTgwMjExX251bGxfZnVuYyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSxzaG9ydCBwd3IpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciogaGRyOworCisJc2tiID0gZGV2X2FsbG9jX3NrYihzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIpKTsKKworCWlmICghc2tiKQorCQlyZXR1cm4gTlVMTDsKKworCWhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciopc2tiX3B1dChza2Isc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKSk7CisKKwltZW1jcHkoaGRyLT5hZGRyMSwgaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJzc2lkLCBFVEhfQUxFTik7CisJbWVtY3B5KGhkci0+YWRkcjIsIGllZWUtPmRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKTsKKwltZW1jcHkoaGRyLT5hZGRyMywgaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJzc2lkLCBFVEhfQUxFTik7CisKKwloZHItPmZyYW1lX2N0bCA9IGNwdV90b19sZTE2KElFRUU4MDIxMV9GVFlQRV9EQVRBIHwKKwkJSUVFRTgwMjExX1NUWVBFX05VTExGVU5DIHwgSUVFRTgwMjExX0ZDVExfVE9EUyB8CisJCShwd3IgPyBJRUVFODAyMTFfRkNUTF9QTTowKSk7CisKKwlyZXR1cm4gc2tiOworCisKK30KKworCit2b2lkIGllZWU4MDIxMV9yZXNwX3RvX2Fzc29jX3JxKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCB1OCogZGVzdCkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqYnVmID0gaWVlZTgwMjExX2Fzc29jX3Jlc3AoaWVlZSwgZGVzdCk7CisKKwlpZiAoYnVmKXsKKwkJc29mdG1hY19tZ210X3htaXQoYnVmLCBpZWVlKTsKKwkJZGV2X2tmcmVlX3NrYl9hbnkoYnVmKTsvL2VkaXQgYnkgdGhvbWFzCisJfQorfQorCisKK3ZvaWQgaWVlZTgwMjExX3Jlc3BfdG9fYXV0aChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgaW50IHMsIHU4KiBkZXN0KQoreworCXN0cnVjdCBza19idWZmICpidWYgPSBpZWVlODAyMTFfYXV0aF9yZXNwKGllZWUsIHMsIGRlc3QpOworCisJaWYgKGJ1Zil7CisJCXNvZnRtYWNfbWdtdF94bWl0KGJ1ZiwgaWVlZSk7CisJCWRldl9rZnJlZV9za2JfYW55KGJ1Zik7Ly9lZGl0IGJ5IHRob21hcworCX0KK30KKworCit2b2lkIGllZWU4MDIxMV9yZXNwX3RvX3Byb2JlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCB1OCAqZGVzdCkKK3sKKworCXN0cnVjdCBza19idWZmICpidWYgPSBpZWVlODAyMTFfcHJvYmVfcmVzcChpZWVlLCBkZXN0KTsKKworCWlmIChidWYpIHsKKwkJc29mdG1hY19tZ210X3htaXQoYnVmLCBpZWVlKTsKKwkJZGV2X2tmcmVlX3NrYl9hbnkoYnVmKTsvL2VkaXQgYnkgdGhvbWFzCisJfQorfQorCisKK2lubGluZSBzdHJ1Y3Qgc2tfYnVmZiAqaWVlZTgwMjExX2Fzc29jaWF0aW9uX3JlcShzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKmJlYWNvbixzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCS8vdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXN0cnVjdCBpZWVlODAyMTFfYXNzb2NfcmVxdWVzdF9mcmFtZSAqaGRyOworCXU4ICp0YWc7CisJLy9zaG9ydCBpbmZvX2FkZHIgPSAwOworCS8vaW50IGk7CisJLy91MTYgc3VpdGVfY291bnQgPSAwOworCS8vdTggc3VpdF9zZWxlY3QgPSAwOworCXVuc2lnbmVkIGludCB3cGFfbGVuID0gYmVhY29uLT53cGFfaWVfbGVuOworCS8vc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGllZWUtPmRldjsKKwkvL3VuaW9uIGl3cmVxX2RhdGEgd3JxdTsKKwkvL3U4ICpidWZmOworCS8vdTggKnA7CisjaWYgMQorCS8vIGZvciB0ZXN0aW5nIHB1cnBvc2UKKwl1bnNpZ25lZCBpbnQgcnNuX2xlbiA9IGJlYWNvbi0+cnNuX2llX2xlbjsKKyNlbHNlCisJdW5zaWduZWQgaW50IHJzbl9sZW4gPSBiZWFjb24tPnJzbl9pZV9sZW4gLSA0OworI2VuZGlmCisJdW5zaWduZWQgaW50IHJhdGVfbGVuID0gaWVlZTgwMjExX01GSUVfcmF0ZV9sZW4oaWVlZSk7CisJdW5zaWduZWQgaW50IHdtbV9pbmZvX2xlbiA9IGJlYWNvbi0+UW9TX0VuYWJsZT85OjA7CisjaWZkZWYgVEhPTUFTX1RVUkJPCisJdW5zaWduZWQgaW50IHR1cmJvX2luZm9fbGVuID0gYmVhY29uLT5UdXJib19FbmFibGU/OTowOworI2VuZGlmCisKKwl1OCAgZW5jcnlfcHJvdG8gPSBpZWVlLT53cGF4X3R5cGVfbm90aWZ5ICYgMHhmZjsKKwkvL3U4ICBwYWlyd2lzZV90eXBlID0gKGllZWUtPndwYXhfdHlwZV9ub3RpZnkgPj4gOCkgJiAweGZmOworCS8vdTggIGF1dGhlbl90eXBlID0gKGllZWUtPndwYXhfdHlwZV9ub3RpZnkgPj4gMTYpICYgMHhmZjsKKworCWludCBsZW4gPSAwOworCisJLy9bMF0gTm90aWZ5IHR5cGUgb2YgZW5jcnlwdGlvbjogV1BBL1dQQTIKKwkvL1sxXSBwYWlyIHdpc2UgdHlwZQorCS8vWzJdIGF1dGhlbiB0eXBlCisJaWYoaWVlZS0+d3BheF90eXBlX3NldCkgeworCQlpZiAoSUVFRV9QUk9UT19XUEEgPT0gZW5jcnlfcHJvdG8pIHsKKwkJCXJzbl9sZW4gPSAwOworCQl9IGVsc2UgaWYgKElFRUVfUFJPVE9fUlNOID09IGVuY3J5X3Byb3RvKSB7CisJCQl3cGFfbGVuID0gMDsKKwkJfQorCX0KKyNpZmRlZiBUSE9NQVNfVFVSQk8KKwlsZW4gPSBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9hc3NvY19yZXF1ZXN0X2ZyYW1lKSsKKwkJKyBiZWFjb24tPnNzaWRfbGVuLy9lc3NpZCB0YWdnZWQgdmFsCisJCSsgcmF0ZV9sZW4vL3JhdGVzIHRhZ2dlZCB2YWwKKwkJKyB3cGFfbGVuCisJCSsgcnNuX2xlbgorCQkrIHdtbV9pbmZvX2xlbgorCQkrIHR1cmJvX2luZm9fbGVuOworI2Vsc2UKKwlsZW4gPSBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9hc3NvY19yZXF1ZXN0X2ZyYW1lKSsKKwkJKyBiZWFjb24tPnNzaWRfbGVuLy9lc3NpZCB0YWdnZWQgdmFsCisJCSsgcmF0ZV9sZW4vL3JhdGVzIHRhZ2dlZCB2YWwKKwkJKyB3cGFfbGVuCisJCSsgcnNuX2xlbgorCQkrIHdtbV9pbmZvX2xlbjsKKyNlbmRpZgorCisjaWZkZWYgX1JUTDgxODdfRVhUX1BBVENIXworCWlmKGllZWUtPml3X21vZGUgPT0gaWVlZS0+aXdfZXh0X21vZGUpCisJCXNrYiA9IGRldl9hbGxvY19za2IobGVuKzI1Nik7IC8vIHN0YW5sZXkKKwllbHNlCisjZW5kaWYKKwlza2IgPSBkZXZfYWxsb2Nfc2tiKGxlbik7CisKKwlpZiAoIXNrYikKKwkJcmV0dXJuIE5VTEw7CisKKwloZHIgPSAoc3RydWN0IGllZWU4MDIxMV9hc3NvY19yZXF1ZXN0X2ZyYW1lICopCisJCXNrYl9wdXQoc2tiLCBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9hc3NvY19yZXF1ZXN0X2ZyYW1lKSk7CisKKworCWhkci0+aGVhZGVyLmZyYW1lX2N0bCA9IElFRUU4MDIxMV9TVFlQRV9BU1NPQ19SRVE7CisJaGRyLT5oZWFkZXIuZHVyYXRpb25faWQ9IDM3OyAvL0ZJWE1FCisJbWVtY3B5KGhkci0+aGVhZGVyLmFkZHIxLCBiZWFjb24tPmJzc2lkLCBFVEhfQUxFTik7CisJbWVtY3B5KGhkci0+aGVhZGVyLmFkZHIyLCBpZWVlLT5kZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7CisJbWVtY3B5KGhkci0+aGVhZGVyLmFkZHIzLCBiZWFjb24tPmJzc2lkLCBFVEhfQUxFTik7CisJbWVtY3B5KGllZWUtPmFwX21hY19hZGRyLCBiZWFjb24tPmJzc2lkLCBFVEhfQUxFTik7Ly9mb3IgSFcgc2VjdXJpdHksIEpvaG4KKworCWhkci0+Y2FwYWJpbGl0eSA9IGNwdV90b19sZTE2KFdMQU5fQ0FQQUJJTElUWV9CU1MpOworCWlmIChiZWFjb24tPmNhcGFiaWxpdHkgJiBXTEFOX0NBUEFCSUxJVFlfUFJJVkFDWSApCisJCWhkci0+Y2FwYWJpbGl0eSB8PSBjcHVfdG9fbGUxNihXTEFOX0NBUEFCSUxJVFlfUFJJVkFDWSk7CisJaWYgKGJlYWNvbi0+Y2FwYWJpbGl0eSAmIFdMQU5fQ0FQQUJJTElUWV9TSE9SVF9QUkVBTUJMRSkKKwkJaGRyLT5jYXBhYmlsaXR5IHw9IGNwdV90b19sZTE2KFdMQU5fQ0FQQUJJTElUWV9TSE9SVF9QUkVBTUJMRSk7CisKKwlpZihpZWVlLT5zaG9ydF9zbG90KQorCQloZHItPmNhcGFiaWxpdHkgfD0gY3B1X3RvX2xlMTYoV0xBTl9DQVBBQklMSVRZX1NIT1JUX1NMT1QpOworCisjaWZkZWYgX1JUTDgxODdfRVhUX1BBVENIXworCWlmKChpZWVlLT5pd19tb2RlID09IGllZWUtPml3X2V4dF9tb2RlKSAmJiBpZWVlLT5leHRfcGF0Y2hfaWVlZTgwMjExX2Fzc29jaWF0aW9uX3JlcV8xKQorCQlpZWVlLT5leHRfcGF0Y2hfaWVlZTgwMjExX2Fzc29jaWF0aW9uX3JlcV8xKGhkcik7CisjZW5kaWYKKworCWhkci0+bGlzdGVuX2ludGVydmFsID0gMHhhOyAvL0ZJWE1FCisKKwloZHItPmluZm9fZWxlbWVudC5pZCA9IE1GSUVfVFlQRV9TU0lEOworCisJaGRyLT5pbmZvX2VsZW1lbnQubGVuID0gYmVhY29uLT5zc2lkX2xlbjsKKwl0YWcgPSBza2JfcHV0KHNrYiwgYmVhY29uLT5zc2lkX2xlbik7CisJbWVtY3B5KHRhZywgYmVhY29uLT5zc2lkLCBiZWFjb24tPnNzaWRfbGVuKTsKKworCXRhZyA9IHNrYl9wdXQoc2tiLCByYXRlX2xlbik7CisKKwlpZWVlODAyMTFfTUZJRV9CcmF0ZShpZWVlLCAmdGFnKTsKKwlpZWVlODAyMTFfTUZJRV9HcmF0ZShpZWVlLCAmdGFnKTsKKworCS8vYWRkIHJzbj09MCBjb25kaXRpb24gZm9yIGFwJ3MgbWl4IHNlY3VyaXR5IG1vZGUod3BhK3dwYTIpLCBqb2huMjAwNy44LjkKKwkvL2Nob29zZSBBRVMgZW5jcnlwdGlvbiBhcyBkZWZhdWx0IGFsZ29yaXRobSB3aGlsZSB1c2luZyBtaXhlZCBtb2RlCisjaWYgMAorCWlmKHJzbl9sZW4gPT0gMCl7CisKKwkJdGFnID0gc2tiX3B1dChza2Isd3BhX2xlbik7CisKKwkJaWYod3BhX2xlbikgeworCisKKwkJICAvL3thZGQgYnkgZGF2aWQuIDIwMDYuOC4zMQorCQkgIC8vZml4IGxpbmtzeXMgY29tcGF0aWJpbGl0eSBidWcKKwkJICAvL30KKwkJICBpZih3cGFfbGVuID4gMjQpIHsvLzIyKzIsIG1lYW4gaW5jbHVkZSB0aGUgY2FwYWJpbGl0eQorCQkJYmVhY29uLT53cGFfaWVbd3BhX2xlbiAtIDJdID0gMDsKKwkJICB9CisJCS8vbXVsdGljYXN0IGNpcGhlciBPVUkKKyAgICAgICAgICAgICAgICAgIGlmKCAgYmVhY29uLT53cGFfaWVbMTFdPT0weDIgICAgICApeyAvLzB4MDA1MGYyMDIgaXMgdGhlIG91aSBvZiB0a2lwCisgICAgICAgICAgICAgICAgICBpZWVlLT5icm9hZGNhc3Rfa2V5X3R5cGUgPSBLRVlfVFlQRV9US0lQOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIGVsc2UgaWYoICBiZWFjb24tPndwYV9pZVsxMV09PTB4NCAgICAgICl7Ly8weDAwNTBmMjA0IGlzIHRoZSBvdWkgb2YgY2NtcAorICAgICAgICAgICAgICAgICAgaWVlZS0+YnJvYWRjYXN0X2tleV90eXBlID0gS0VZX1RZUEVfQ0NNUDsKKyAgICAgICAgICAgICAgICB9CisgCQkvL3VuaWNhc3QgY2lwaGVyIE9VSQorCQkgIGlmKAliZWFjb24tPndwYV9pZVsxNF09PTAKKwkJCSYmIGJlYWNvbi0+d3BhX2llWzE1XT09MHg1MAorICAgICAgICAgICAgICAgICAgICAgICAgJiYgYmVhY29uLT53cGFfaWVbMTZdPT0weGYyCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBiZWFjb24tPndwYV9pZVsxN109PTB4MiAgCSl7IC8vMHgwMDUwZjIwMiBpcyB0aGUgb3VpIG9mIHRraXAKKyAgICAgICAgICAgICAgICAgIGllZWUtPnBhaXJ3aXNlX2tleV90eXBlID0gS0VZX1RZUEVfVEtJUDsKKwkJfQorCisgICAgICAgICAgICAgICAgICBlbHNlIGlmKCAgIGJlYWNvbi0+d3BhX2llWzE0XT09MAorICAgICAgICAgICAgICAgICAgICAgICAgJiYgYmVhY29uLT53cGFfaWVbMTVdPT0weDUwCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBiZWFjb24tPndwYV9pZVsxNl09PTB4ZjIKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIGJlYWNvbi0+d3BhX2llWzE3XT09MHg0ICAgICAgKXsvLzB4MDA1MGYyMDQgaXMgdGhlIG91aSBvZiBjY21wCisgICAgICAgICAgICAgICAgICBpZWVlLT5wYWlyd2lzZV9rZXlfdHlwZSA9IEtFWV9UWVBFX0NDTVA7CisJCX0KKwkJLy9pbmRpY2F0ZSB0aGUgd3BhX2llIGNvbnRlbnQgdG8gV1BBX1NVUFBMSUNBTlQKKwkJYnVmZiA9IGttYWxsb2MoSVdfQ1VTVE9NX01BWCwgR0ZQX0FUT01JQyk7CisJCW1lbXNldChidWZmLCAwLCBJV19DVVNUT01fTUFYKTsKKwkJcD1idWZmOworCQlwICs9IHNwcmludGYocCwgIkFTU09DSU5GTyhSZXFJRXM9Iik7CisJCWZvcihpPTA7aTx3cGFfbGVuO2krKyl7CisJCQlwICs9IHNwcmludGYocCwgIiUwMngiLCBiZWFjb24tPndwYV9pZVtpXSk7CisJCX0KKwkJcCArPSBzcHJpbnRmKHAsICIpIik7CisJCW1lbXNldCgmd3JxdSwgMCwgc2l6ZW9mKHdycXUpICk7CisJCXdycXUuZGF0YS5sZW5ndGggPSBwIC0gYnVmZjsKKworCQl3aXJlbGVzc19zZW5kX2V2ZW50KGRldiwgSVdFVkNVU1RPTSwgJndycXUsIGJ1ZmYpOworCQkgIG1lbWNweSh0YWcsYmVhY29uLT53cGFfaWUsd3BhX2xlbik7CisJCX0KKworCX0KKworCWlmKHJzbl9sZW4gPiAyMikgeworCisJICAJCQkJCWlmKCAgICAgYmVhY29uLT5yc25faWVbNF09PTB4MCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWFjb24tPnJzbl9pZVs1XT09MHhmICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlYWNvbi0+cnNuX2llWzZdPT0weGFjKXsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2goYmVhY29uLT5yc25faWVbN10peworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMHgxOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWVlZS0+YnJvYWRjYXN0X2tleV90eXBlID0gS0VZX1RZUEVfV0VQNDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDB4MjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGllZWUtPmJyb2FkY2FzdF9rZXlfdHlwZSA9IEtFWV9UWVBFX1RLSVA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDB4NDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGllZWUtPmJyb2FkY2FzdF9rZXlfdHlwZSA9IEtFWV9UWVBFX0NDTVA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDB4NToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGllZWUtPmJyb2FkY2FzdF9rZXlfdHlwZSA9IEtFWV9UWVBFX1dFUDEwNDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoImZhdWx0IHN1aXRlIHR5cGUgaW4gUlNOIGJyb2FkY2FzdCBrZXlcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgaWYoICAgICBiZWFjb24tPnJzbl9pZVsxMF09PTB4MCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWFjb24tPnJzbl9pZVsxMV09PTB4ZiAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWFjb24tPnJzbl9pZVsxMl09PTB4YWMpeworCQkJCWlmKGJlYWNvbi0+cnNuX2llWzhdPT0xKXsvL25vdCBtaXhlZCBtb2RlCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2goYmVhY29uLT5yc25faWVbMTNdKXsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAweDI6CisgICAgICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWVlZS0+cGFpcndpc2Vfa2V5X3R5cGUgPSBLRVlfVFlQRV9US0lQOworICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICBjYXNlIDB4NDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICBpZWVlLT5wYWlyd2lzZV9rZXlfdHlwZSA9IEtFWV9UWVBFX0NDTVA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJYnJlYWs7CisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCJmYXVsdCBzdWl0ZSB0eXBlIGluIFJTTiBwYWlyd2lzZSBrZXlcbiIpOworICAgICAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJfQorCQkJCX0KKwkJCQllbHNlIGlmKGJlYWNvbi0+cnNuX2llWzhdPT0yKXsvL21peGVkIG1vZGUKKwkJCQkJaWVlZS0+cGFpcndpc2Vfa2V5X3R5cGUgPSBLRVlfVFlQRV9DQ01QOworCQkJCX0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworCisKKwkJdGFnID0gc2tiX3B1dChza2IsMjIpOworCQltZW1jcHkodGFnLChiZWFjb24tPnJzbl9pZSArIGluZm9fYWRkciksOCk7CisJCXRhZ1sxXSA9ICAyMDsKKwkJdGFnICs9IDg7CisJCWluZm9fYWRkciArPSA4OworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT53cGF4X3N1aXRsaXN0X2xvY2ssZmxhZ3MpOworCQlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisJCQl0YWdbMF0gPSAxOworCQkJdGFnWzFdID0gMDsKKwkJCXRhZyArPSAyOworCQkJc3VpdGVfY291bnQgPSBiZWFjb24tPnJzbl9pZVtpbmZvX2FkZHJdICsgXAorCQkJCSAgICAgIChiZWFjb24tPnJzbl9pZVtpbmZvX2FkZHIgKyAxXSA8PCA4KTsKKwkJCWluZm9fYWRkciArPSAyOworCQkJaWYoMSA9PSBzdWl0ZV9jb3VudCkgeworCQkJCW1lbWNweSh0YWcsKGJlYWNvbi0+cnNuX2llICsgaW5mb19hZGRyKSw0KTsKKwkJCQlpbmZvX2FkZHIgKz0gNDsKKwkJCX0gZWxzZSB7CisJCQkJLy8gaWYgdGhlIHdwYXhfdHlwZV9ub3RpZnkgaGFzIGJlZW4gc2V0IGJ5IHRoZSBhcHBsaWNhdGlvbiwKKwkJCQkvLyBqdXN0IHVzZSBpdCwgb3RoZXJ3aXNlIGp1c3QgdXNlIHRoZSBkZWZhdWx0IG9uZS4KKwkJCQlpZihpZWVlLT53cGF4X3R5cGVfc2V0KSB7CisJCQkJCXN1aXRfc2VsZWN0ID0gKCgwID09IGkpID8gcGFpcndpc2VfdHlwZTphdXRoZW5fdHlwZSkmMHgwZiA7CisJCQkJCW1lbWNweSh0YWcscnNuX2F1dGhlbl9jaXBoZXJfc3VpdGVbc3VpdF9zZWxlY3RdLDQpOworCQkJCX0gZWxzZSB7CisJCQkJCS8vZGVmYXVsdCBzZXQgYXMgY2NtcCwgb3Igbm9uZSBhdXRoZW50aWNhdGlvbgorCQkJCQlpZihpID09IDApIHsKKwkJCQkJCW1lbWNweSh0YWcscnNuX2F1dGhlbl9jaXBoZXJfc3VpdGVbNF0sNCk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQltZW1jcHkodGFnLHJzbl9hdXRoZW5fY2lwaGVyX3N1aXRlWzJdLDQpOworCQkJCQl9CisKKwkJCQl9CisKKwkJCQlpbmZvX2FkZHIgKz0gKHN1aXRlX2NvdW50ICogNCk7CisJCQl9CisJCQl0YWcgKz0gNDsKKwkJfQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT53cGF4X3N1aXRsaXN0X2xvY2ssZmxhZ3MpOworCisJCXRhZ1swXSA9IDA7CisJCXRhZ1sxXSA9IGJlYWNvbi0+cnNuX2llW2luZm9fYWRkcisxXTsKKworCX0gZWxzZSB7CisJCXRhZyA9IHNrYl9wdXQoc2tiLHJzbl9sZW4pOworCQlpZihyc25fbGVuKSB7CisKKworCQkJaWYoIAliZWFjb24tPnJzbl9pZVs0XT09MHgwICYmCisJCQkJYmVhY29uLT5yc25faWVbNV09PTB4ZiAmJgorCQkJCWJlYWNvbi0+cnNuX2llWzZdPT0weGFjKXsKKwkJCQlzd2l0Y2goYmVhY29uLT5yc25faWVbN10peworCQkJCQljYXNlIDB4MToKKwkJCQkJCWllZWUtPmJyb2FkY2FzdF9rZXlfdHlwZSA9IEtFWV9UWVBFX1dFUDQwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisJCQkJCWNhc2UgMHgyOgorCQkJCQkJaWVlZS0+YnJvYWRjYXN0X2tleV90eXBlID0gS0VZX1RZUEVfVEtJUDsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIDB4NDoKKyAgIAkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWVlZS0+YnJvYWRjYXN0X2tleV90eXBlID0gS0VZX1RZUEVfQ0NNUDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMHg1OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWVlZS0+YnJvYWRjYXN0X2tleV90eXBlID0gS0VZX1RZUEVfV0VQMTA0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisJCQkJCWRlZmF1bHQ6CisJCQkJCQlwcmludGsoImZhdWx0IHN1aXRlIHR5cGUgaW4gUlNOIGJyb2FkY2FzdCBrZXlcbiIpOworCQkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYoICAgICBiZWFjb24tPnJzbl9pZVsxMF09PTB4MCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWFjb24tPnJzbl9pZVsxMV09PTB4ZiAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWFjb24tPnJzbl9pZVsxMl09PTB4YWMpeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihiZWFjb24tPnJzbl9pZVs4XT09MSl7Ly9ub3QgbWl4ZWQgbW9kZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaChiZWFjb24tPnJzbl9pZVsxM10peworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAweDI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGllZWUtPnBhaXJ3aXNlX2tleV90eXBlID0gS0VZX1RZUEVfVEtJUDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDB4NDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWVlZS0+cGFpcndpc2Vfa2V5X3R5cGUgPSBLRVlfVFlQRV9DQ01QOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50aygiZmF1bHQgc3VpdGUgdHlwZSBpbiBSU04gcGFpcndpc2Uga2V5XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAl9CisKKwkJCQl9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoYmVhY29uLT5yc25faWVbOF09PTIpey8vbWl4ZWQgbW9kZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGllZWUtPnBhaXJ3aXNlX2tleV90eXBlID0gS0VZX1RZUEVfQ0NNUDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorCisKKwkJCWJlYWNvbi0+cnNuX2llW3Jzbl9sZW4gLSAyXSA9IDA7CisJCQltZW1jcHkodGFnLGJlYWNvbi0+cnNuX2llLHJzbl9sZW4pOworCQl9CisJfQorI2Vsc2UKKwl0YWcgPSBza2JfcHV0KHNrYixpZWVlLT53cGFfaWVfbGVuKTsKKwltZW1jcHkodGFnLGllZWUtPndwYV9pZSxpZWVlLT53cGFfaWVfbGVuKTsKKyNlbmRpZgorCXRhZyA9IHNrYl9wdXQoc2tiLHdtbV9pbmZvX2xlbik7CisJaWYod21tX2luZm9fbGVuKSB7CisJICBpZWVlODAyMTFfV01NX0luZm8oaWVlZSwgJnRhZyk7CisJfQorI2lmZGVmIFRIT01BU19UVVJCTworCXRhZyA9IHNrYl9wdXQoc2tiLHR1cmJvX2luZm9fbGVuKTsKKyAgICAgICAgaWYodHVyYm9faW5mb19sZW4pIHsKKyAgICAgICAgICAgICAgICBpZWVlODAyMTFfVFVSQk9fSW5mbyhpZWVlLCAmdGFnKTsKKyAgICAgICAgfQorI2VuZGlmCisKKyNpZmRlZiBfUlRMODE4N19FWFRfUEFUQ0hfCisJaWYoKGllZWUtPml3X21vZGUgPT0gaWVlZS0+aXdfZXh0X21vZGUpICYmIGllZWUtPmV4dF9wYXRjaF9pZWVlODAyMTFfYXNzb2NpYXRpb25fcmVxXzIpCisJCWllZWUtPmV4dF9wYXRjaF9pZWVlODAyMTFfYXNzb2NpYXRpb25fcmVxXzIoaWVlZSwgYmVhY29uLCBza2IpOworI2VuZGlmCisKKwlyZXR1cm4gc2tiOworfQorCit2b2lkIGllZWU4MDIxMV9hc3NvY2lhdGVfYWJvcnQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXNwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5sb2NrLCBmbGFncyk7CisKKwlpZWVlLT5hc3NvY2lhdGVfc2VxKys7CisKKwkvKiBkb24ndCBzY2FuLCBhbmQgYXZvaWQgdG8gaGF2ZSB0aGUgUlggcGF0aCBwb3NzaWJpbHkKKwkgKiB0cnkgYWdhaW4gdG8gYXNzb2NpYXRlLiBFdmVuIGRvIG5vdCByZWFjdCB0byBBVVRIIG9yCisJICogQVNTT0MgcmVzcG9uc2UuIEp1c3Qgd2FpdCBmb3IgdGhlIHJldHJ5IHdxIHRvIGJlIHNjaGVkdWxlZC4KKwkgKiBIZXJlIHdlIHdpbGwgY2hlY2sgaWYgdGhlcmUgYXJlIGdvb2QgbmV0cyB0byBhc3NvY2lhdGUKKwkgKiB3aXRoLCBzbyB3ZSByZXRyeSBvciBqdXN0IGdldCBiYWNrIHRvIE5PX0xJTksgYW5kIHNjYW5uaW5nCisJICovCisJaWYgKGllZWUtPnN0YXRlID09IElFRUU4MDIxMV9BU1NPQ0lBVElOR19BVVRIRU5USUNBVElORyl7CisJCUlFRUU4MDIxMV9ERUJVR19NR01UKCJBdXRoZW50aWNhdGlvbiBmYWlsZWRcbiIpOworCQlpZWVlLT5zb2Z0bWFjX3N0YXRzLm5vX2F1dGhfcnMrKzsKKwl9ZWxzZXsKKwkJSUVFRTgwMjExX0RFQlVHX01HTVQoIkFzc29jaWF0aW9uIGZhaWxlZFxuIik7CisJCWllZWUtPnNvZnRtYWNfc3RhdHMubm9fYXNzX3JzKys7CisJfQorCisJaWVlZS0+c3RhdGUgPSBJRUVFODAyMTFfQVNTT0NJQVRJTkdfUkVUUlk7CisKKwlxdWV1ZV9kZWxheWVkX3dvcmsoaWVlZS0+d3EsICZpZWVlLT5hc3NvY2lhdGVfcmV0cnlfd3EsSUVFRTgwMjExX1NPRlRNQUNfQVNTT0NfUkVUUllfVElNRSk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5sb2NrLCBmbGFncyk7Cit9CisKK3ZvaWQgaWVlZTgwMjExX2Fzc29jaWF0ZV9hYm9ydF9jYih1bnNpZ25lZCBsb25nIGRldikKK3sKKwlpZWVlODAyMTFfYXNzb2NpYXRlX2Fib3J0KChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqKSBkZXYpOworfQorCisKK3ZvaWQgaWVlZTgwMjExX2Fzc29jaWF0ZV9zdGVwMShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKmJlYWNvbiA9ICZpZWVlLT5jdXJyZW50X25ldHdvcms7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCUlFRUU4MDIxMV9ERUJVR19NR01UKCJTdG9wcGluZyBzY2FuXG4iKTsKKwlpZWVlLT5zb2Z0bWFjX3N0YXRzLnR4X2F1dGhfcnErKzsKKwlza2I9aWVlZTgwMjExX2F1dGhlbnRpY2F0aW9uX3JlcShiZWFjb24sIGllZWUsIDApOworI2lmZGVmIF9SVEw4MTg3X0VYVF9QQVRDSF8KKwlpZihpZWVlLT5pd19tb2RlID09IGllZWUtPml3X2V4dF9tb2RlICkJeworCQlpZihza2IpCisJCQlzb2Z0bWFjX21nbXRfeG1pdChza2IsIGllZWUpOworCQlyZXR1cm47CisJfWVsc2UKKyNlbmRpZgorCWlmICghc2tiKXsKKworCQlpZWVlODAyMTFfYXNzb2NpYXRlX2Fib3J0KGllZWUpOworCX0KKwllbHNleworCQlpZWVlLT5zdGF0ZSA9IElFRUU4MDIxMV9BU1NPQ0lBVElOR19BVVRIRU5USUNBVElORyA7CisJCUlFRUU4MDIxMV9ERUJVR19NR01UKCJTZW5kaW5nIGF1dGhlbnRpY2F0aW9uIHJlcXVlc3RcbiIpOworCQkvL3ByaW50aygiLS0tU2VuZGluZyBhdXRoZW50aWNhdGlvbiByZXF1ZXN0XG4iKTsKKwkJc29mdG1hY19tZ210X3htaXQoc2tiLCBpZWVlKTsKKwkJLy9CVUdPTiB3aGVuIHlvdSB0cnkgdG8gYWRkX3RpbWVyIHR3aWNlLCB1c2luZyBtb2RfdGltZXIgbWF5IGJlIGJldHRlciwgam9objA3MDkKKwkJaWYoIXRpbWVyX3BlbmRpbmcoJmllZWUtPmFzc29jaWF0ZV90aW1lcikpeworCQkJaWVlZS0+YXNzb2NpYXRlX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgKEhaIC8gMik7CisJCQlhZGRfdGltZXIoJmllZWUtPmFzc29jaWF0ZV90aW1lcik7CisJCX0KKwkJLy9JZiBjYWxsIGRldl9rZnJlZV9za2JfYW55LGEgd2FybmluZyB3aWxsIG9jdXIuLi4uCisJCS8vS0VSTkVMOiBhc3NlcnRpb24gKCFhdG9taWNfcmVhZCgmc2tiLT51c2VycykpIGZhaWxlZCBhdCBuZXQvY29yZS9kZXYuYyAoMTcwOCkKKwkJLy9TbyAuLi4gMTIwNCBieSBsYXdyZW5jZS4KKwkJLy9wcmludGsoIlxuSW4gJXMsbGluZSAlZCBjYWxsIGtmcmVlIHNrYi4iLF9fZnVuY19fLF9fTElORV9fKTsKKwkJLy9kZXZfa2ZyZWVfc2tiX2FueShza2IpOy8vZWRpdCBieSB0aG9tYXMKKwl9Cit9CisKK3ZvaWQgaWVlZTgwMjExX2F1dGhfY2hhbGxlbmdlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCB1OCAqY2hhbGxlbmdlLCBpbnQgY2hsZW4pCit7CisJdTggKmM7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKmJlYWNvbiA9ICZpZWVlLT5jdXJyZW50X25ldHdvcms7CisvLwlpbnQgaGxlbiA9IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2F1dGhlbnRpY2F0aW9uKTsKKwlkZWxfdGltZXJfc3luYygmaWVlZS0+YXNzb2NpYXRlX3RpbWVyKTsKKwlpZWVlLT5hc3NvY2lhdGVfc2VxKys7CisJaWVlZS0+c29mdG1hY19zdGF0cy50eF9hdXRoX3JxKys7CisKKwlza2IgPSBpZWVlODAyMTFfYXV0aGVudGljYXRpb25fcmVxKGJlYWNvbiwgaWVlZSwgY2hsZW4rMik7CisJaWYgKCFza2IpCisJCWllZWU4MDIxMV9hc3NvY2lhdGVfYWJvcnQoaWVlZSk7CisJZWxzZXsKKwkJYyA9IHNrYl9wdXQoc2tiLCBjaGxlbisyKTsKKwkJKihjKyspID0gTUZJRV9UWVBFX0NIQUxMRU5HRTsKKwkJKihjKyspID0gY2hsZW47CisJCW1lbWNweShjLCBjaGFsbGVuZ2UsIGNobGVuKTsKKworCQlJRUVFODAyMTFfREVCVUdfTUdNVCgiU2VuZGluZyBhdXRoZW50aWNhdGlvbiBjaGFsbGVuZ2UgcmVzcG9uc2VcbiIpOworCisJCWllZWU4MDIxMV9lbmNyeXB0X2ZyYWdtZW50KGllZWUsIHNrYiwgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICApKTsKKworCQlzb2Z0bWFjX21nbXRfeG1pdChza2IsIGllZWUpOworCQlpZiAoIXRpbWVyX3BlbmRpbmcoJmllZWUtPmFzc29jaWF0ZV90aW1lcikpeworCQkvL3ByaW50aygiPT09PT09PT09PmFkZCB0aW1lciBhZ2FpbiwgdG8gY3Jhc2hcbiIpOworCQlpZWVlLT5hc3NvY2lhdGVfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyAoSFogLyAyKTsKKwkJYWRkX3RpbWVyKCZpZWVlLT5hc3NvY2lhdGVfdGltZXIpOworCQl9CisJCWRldl9rZnJlZV9za2JfYW55KHNrYik7Ly9lZGl0IGJ5IHRob21hcworCX0KKwlrZnJlZShjaGFsbGVuZ2UpOworfQorCisjaWZkZWYgX1JUTDgxODdfRVhUX1BBVENIXworCisvLyBiYXNlZCBvbiBpZWVlODAyMTFfYXNzb2NfcmVzcAorc3RydWN0IHNrX2J1ZmYqIGllZWU4MDIxMV9hc3NvY19yZXNwX2J5X25ldChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgdTggKmRlc3QsIHVuc2lnbmVkIHNob3J0IHN0YXR1cywgc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpwc3RhdCwgaW50IHBrdF90eXBlKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisJdTgqIHRhZzsKKworCXN0cnVjdCBpZWVlODAyMTFfY3J5cHRfZGF0YSogY3J5cHQ7CisJc3RydWN0IGllZWU4MDIxMV9hc3NvY19yZXNwb25zZV9mcmFtZSAqYXNzb2M7CisJc2hvcnQgZW5jcnlwdDsKKworCXVuc2lnbmVkIGludCByYXRlX2xlbiA9IGllZWU4MDIxMV9NRklFX3JhdGVfbGVuKGllZWUpOworCWludCBsZW4gPSBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9hc3NvY19yZXNwb25zZV9mcmFtZSkgKyByYXRlX2xlbjsKKworCWlmKGllZWUtPml3X21vZGUgPT0gaWVlZS0+aXdfZXh0X21vZGUpCisJCXNrYiA9IGRldl9hbGxvY19za2IobGVuKzI1Nik7IC8vIHN0YW5sZXkKKwllbHNlCisJCXNrYiA9IGRldl9hbGxvY19za2IobGVuKTsKKworCWlmICghc2tiKQorCQlyZXR1cm4gTlVMTDsKKworCWFzc29jID0gKHN0cnVjdCBpZWVlODAyMTFfYXNzb2NfcmVzcG9uc2VfZnJhbWUgKikKKwkJc2tiX3B1dChza2Isc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfYXNzb2NfcmVzcG9uc2VfZnJhbWUpKTsKKworCWFzc29jLT5oZWFkZXIuZnJhbWVfY3RsID0gY3B1X3RvX2xlMTYocGt0X3R5cGUpOworCisJbWVtY3B5KGFzc29jLT5oZWFkZXIuYWRkcjEsIGRlc3QsRVRIX0FMRU4pOworCW1lbWNweShhc3NvYy0+aGVhZGVyLmFkZHIzLCBpZWVlLT5kZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7CisJbWVtY3B5KGFzc29jLT5oZWFkZXIuYWRkcjIsIGllZWUtPmRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKTsKKwlhc3NvYy0+Y2FwYWJpbGl0eSA9IGNwdV90b19sZTE2KGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9NQVNURVIgPworCQlXTEFOX0NBUEFCSUxJVFlfQlNTIDogV0xBTl9DQVBBQklMSVRZX0lCU1MpOworCisJaWYoKGllZWUtPml3X21vZGUgPT0gaWVlZS0+aXdfZXh0X21vZGUpICYmIGllZWUtPmV4dF9wYXRjaF9pZWVlODAyMTFfYXNzb2NfcmVzcF9ieV9uZXRfMSkKKwkJaWVlZS0+ZXh0X3BhdGNoX2llZWU4MDIxMV9hc3NvY19yZXNwX2J5X25ldF8xKGFzc29jKTsKKworCWlmKGllZWUtPnNob3J0X3Nsb3QpCisJCWFzc29jLT5jYXBhYmlsaXR5IHw9IGNwdV90b19sZTE2KFdMQU5fQ0FQQUJJTElUWV9TSE9SVF9TTE9UKTsKKworCWlmIChpZWVlLT5ob3N0X2VuY3J5cHQpCisJCWNyeXB0ID0gaWVlZS0+Y3J5cHRbaWVlZS0+dHhfa2V5aWR4XTsKKwllbHNlIGNyeXB0ID0gTlVMTDsKKworCWVuY3J5cHQgPSAoIGNyeXB0ICYmIGNyeXB0LT5vcHMpOworCisJaWYgKGVuY3J5cHQpCisJCWFzc29jLT5jYXBhYmlsaXR5IHw9IGNwdV90b19sZTE2KFdMQU5fQ0FQQUJJTElUWV9QUklWQUNZKTsKKworCWFzc29jLT5zdGF0dXMgPSAwOworCWFzc29jLT5haWQgPSBjcHVfdG9fbGUxNihpZWVlLT5hc3NvY19pZCk7CisJaWYgKGllZWUtPmFzc29jX2lkID09IDB4MjAwNykgaWVlZS0+YXNzb2NfaWQ9MDsKKwllbHNlIGllZWUtPmFzc29jX2lkKys7CisKKwlhc3NvYy0+aW5mb19lbGVtZW50LmlkID0gMjMwOyAvLyBTdGFubGV5LCBhbiB1bnVzZWQgaWQgKGp1c3QgYSBob3QgZml4KQorCWFzc29jLT5pbmZvX2VsZW1lbnQubGVuID0gMDsKKworCXRhZyA9ICh1OCopIHNrYl9wdXQoc2tiLCByYXRlX2xlbik7CisKKwlpZWVlODAyMTFfTUZJRV9CcmF0ZShpZWVlLCAmdGFnKTsKKwlpZWVlODAyMTFfTUZJRV9HcmF0ZShpZWVlLCAmdGFnKTsKKworCWlmKChpZWVlLT5pd19tb2RlID09IGllZWUtPml3X2V4dF9tb2RlKSAmJiBpZWVlLT5leHRfcGF0Y2hfaWVlZTgwMjExX2Fzc29jX3Jlc3BfYnlfbmV0XzIpCisJCWllZWUtPmV4dF9wYXRjaF9pZWVlODAyMTFfYXNzb2NfcmVzcF9ieV9uZXRfMihpZWVlLCBwc3RhdCwgcGt0X3R5cGUsIHNrYik7CisKKwlyZXR1cm4gc2tiOworfQorCisvLyBiYXNlZCBvbiBpZWVlODAyMTFfcmVzcF90b19hc3NvY19ycQordm9pZCBpZWVlODAyMTFfZXh0X2lzc3VlX2Fzc29jX3JzcChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgdTggKmRlc3QsIHVuc2lnbmVkIHNob3J0IHN0YXR1cywgc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpwc3RhdCwgaW50IHBrdF90eXBlKQoreworCXN0cnVjdCBza19idWZmICpidWYgPSBpZWVlODAyMTFfYXNzb2NfcmVzcF9ieV9uZXQoaWVlZSwgZGVzdCwgc3RhdHVzLCBwc3RhdCwgcGt0X3R5cGUpOworCisJaWYgKGJ1ZikKKwkJc29mdG1hY19tZ210X3htaXQoYnVmLCBpZWVlKTsKK30KKworLy8gYmFzZWQgb24gaWVlZTgwMjExX2Fzc29jaWF0ZV9zdGVwMgordm9pZCBpZWVlODAyMTFfZXh0X2lzc3VlX2Fzc29jX3JlcShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpwc3RhdCkKK3sKKworCXN0cnVjdCBza19idWZmKiBza2I7CisKKwkvLyBwcmludGsoIkBAQEBAIGllZWU4MDIxMV9leHRfaXNzdWVfYXNzb2NfcmVxIG9uIGNoYW5uZWw6ICVkXG4iLCBpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCk7CisKKwlpZWVlLT5zb2Z0bWFjX3N0YXRzLnR4X2Fzc19ycSsrOworCXNrYj1pZWVlODAyMTFfYXNzb2NpYXRpb25fcmVxKHBzdGF0LCBpZWVlKTsKKwlpZiAoc2tiKQorCQlzb2Z0bWFjX21nbXRfeG1pdChza2IsIGllZWUpOworfQorCit2b2lkIGllZWU4MDIxMV9leHRfaXNzdWVfZGlzYXNzb2Moc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqcHN0YXQsIGludCByZWFzb24sIHVuc2lnbmVkIGNoYXIgZXh0UmVhc29uKQoreworCS8vIGRvIG5vdGhpbmcKKwkvLyBwcmludGsoIkBAQEBAIGllZWU4MDIxMV9leHRfaXNzdWVfZGlzYXNzb2NcbiIpOworCXJldHVybjsKK30KKyNlbmRpZiAvLyBfUlRMODE4N19FWFRfUEFUQ0hfCisKK3ZvaWQgaWVlZTgwMjExX2Fzc29jaWF0ZV9zdGVwMihzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiogc2tiOworCXN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqYmVhY29uID0gJmllZWUtPmN1cnJlbnRfbmV0d29yazsKKworCWRlbF90aW1lcl9zeW5jKCZpZWVlLT5hc3NvY2lhdGVfdGltZXIpOworCisJSUVFRTgwMjExX0RFQlVHX01HTVQoIlNlbmRpbmcgYXNzb2NpYXRpb24gcmVxdWVzdFxuIik7CisJaWVlZS0+c29mdG1hY19zdGF0cy50eF9hc3NfcnErKzsKKwlza2I9aWVlZTgwMjExX2Fzc29jaWF0aW9uX3JlcShiZWFjb24sIGllZWUpOworCWlmICghc2tiKQorCQlpZWVlODAyMTFfYXNzb2NpYXRlX2Fib3J0KGllZWUpOworCWVsc2V7CisJCXNvZnRtYWNfbWdtdF94bWl0KHNrYiwgaWVlZSk7CisJCWlmICghdGltZXJfcGVuZGluZygmaWVlZS0+YXNzb2NpYXRlX3RpbWVyKSl7CisJCWllZWUtPmFzc29jaWF0ZV90aW1lci5leHBpcmVzID0gamlmZmllcyArIChIWiAvIDIpOworCQlhZGRfdGltZXIoJmllZWUtPmFzc29jaWF0ZV90aW1lcik7CisJCX0KKwkJLy9kZXZfa2ZyZWVfc2tiX2FueShza2IpOy8vZWRpdCBieSB0aG9tYXMKKwl9Cit9CisKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwyMCkpCit2b2lkIGllZWU4MDIxMV9hc3NvY2lhdGVfY29tcGxldGVfd3Eoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlLCBhc3NvY2lhdGVfY29tcGxldGVfd3EpOworI2Vsc2UKK3ZvaWQgaWVlZTgwMjExX2Fzc29jaWF0ZV9jb21wbGV0ZV93cShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKyNlbmRpZgorCXByaW50ayhLRVJOX0lORk8gIkFzc29jaWF0ZWQgc3VjY2Vzc2Z1bGx5XG4iKTsKKwlpZihpZWVlODAyMTFfaXNfNTRnKGllZWUtPmN1cnJlbnRfbmV0d29yaykgJiYKKwkJKGllZWUtPm1vZHVsYXRpb24gJiBJRUVFODAyMTFfT0ZETV9NT0RVTEFUSU9OKSl7CisKKwkJaWVlZS0+cmF0ZSA9IDU0MDsKKwkJcHJpbnRrKEtFUk5fSU5GTyJVc2luZyBHIHJhdGVzXG4iKTsKKwl9ZWxzZXsKKwkJaWVlZS0+cmF0ZSA9IDExMDsKKwkJcHJpbnRrKEtFUk5fSU5GTyJVc2luZyBCIHJhdGVzXG4iKTsKKwl9CisJaWVlZS0+bGlua19jaGFuZ2UoaWVlZS0+ZGV2KTsKKwlub3RpZnlfd3hfYXNzb2NfZXZlbnQoaWVlZSk7CisJaWYgKGllZWUtPmRhdGFfaGFyZF9yZXN1bWUpCisJCWllZWUtPmRhdGFfaGFyZF9yZXN1bWUoaWVlZS0+ZGV2KTsKKwluZXRpZl9jYXJyaWVyX29uKGllZWUtPmRldik7Cit9CisKK3ZvaWQgaWVlZTgwMjExX2Fzc29jaWF0ZV9jb21wbGV0ZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKwlpbnQgaTsKKwlkZWxfdGltZXJfc3luYygmaWVlZS0+YXNzb2NpYXRlX3RpbWVyKTsKKworCWZvcihpID0gMDsgaSA8IDY7IGkrKykgeworCSAgLy9pZWVlLT5zZXFfY3RybFtpXSA9IDA7CisJfQorCWllZWUtPnN0YXRlID0gSUVFRTgwMjExX0xJTktFRDsKKwlJRUVFODAyMTFfREVCVUdfTUdNVCgiU3VjY2Vzc2Z1bGx5IGFzc29jaWF0ZWRcbiIpOworCisJcXVldWVfd29yayhpZWVlLT53cSwgJmllZWUtPmFzc29jaWF0ZV9jb21wbGV0ZV93cSk7Cit9CisKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwyMCkpCit2b2lkIGllZWU4MDIxMV9hc3NvY2lhdGVfcHJvY2VkdXJlX3dxKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSwgYXNzb2NpYXRlX3Byb2NlZHVyZV93cSk7CisjZWxzZQordm9pZCBpZWVlODAyMTFfYXNzb2NpYXRlX3Byb2NlZHVyZV93cShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKyNlbmRpZgorCWllZWUtPnN5bmNfc2Nhbl9odXJyeXVwID0gMTsKKwlkb3duKCZpZWVlLT53eF9zZW0pOworCisJaWYgKGllZWUtPmRhdGFfaGFyZF9zdG9wKQorCQlpZWVlLT5kYXRhX2hhcmRfc3RvcChpZWVlLT5kZXYpOworCisJaWVlZTgwMjExX3N0b3Bfc2NhbihpZWVlKTsKKwlpZWVlLT5zZXRfY2hhbihpZWVlLT5kZXYsIGllZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsKTsKKworCWllZWUtPmFzc29jaWF0ZV9zZXEgPSAxOworCWllZWU4MDIxMV9hc3NvY2lhdGVfc3RlcDEoaWVlZSk7CisKKwl1cCgmaWVlZS0+d3hfc2VtKTsKK30KKyNpZmRlZiBfUlRMODE4N19FWFRfUEFUQ0hfCisvLyBiYXNlZCBvbiBpZWVlODAyMTFfYXNzb2NpYXRlX3Byb2NlZHVyZV93cQorCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwyMCkKK3ZvaWQgaWVlZTgwMjExX2V4dF9zdG9wX3NjYW5fd3Eoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlLCBleHRfc3RvcF9zY2FuX3dxKTsKKyNlbHNlCit2b2lkIGllZWU4MDIxMV9leHRfc3RvcF9zY2FuX3dxKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworI2VuZGlmCisJICBpZiAoaWVlZS0+c2Nhbm5pbmcgPT0gMCkKKwl7CisJCWlmKChpZWVlLT5pd19tb2RlID09IGllZWUtPml3X2V4dF9tb2RlKSAmJiBpZWVlLT5leHRfcGF0Y2hfaWVlZTgwMjExX2V4dF9zdG9wX3NjYW5fd3Ffc2V0X2NoYW5uZWwKKwkJCQkmJiAoIGllZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsID09IGllZWUtPmV4dF9wYXRjaF9pZWVlODAyMTFfZXh0X3N0b3Bfc2Nhbl93cV9zZXRfY2hhbm5lbChpZWVlKSApICkKKwkJcmV0dXJuOworCX0KKworCWllZWUtPnN5bmNfc2Nhbl9odXJyeXVwID0gMTsKKworCWRvd24oJmllZWUtPnd4X3NlbSk7CisKKwkvLyBwcmludGsoIkBAQEBAQEBAQEAgaWVlZTgwMjExX2V4dF9zdG9wX3NjYW5fd3FcbiIpOworCWlmIChpZWVlLT5kYXRhX2hhcmRfc3RvcCkKKwkJaWVlZS0+ZGF0YV9oYXJkX3N0b3AoaWVlZS0+ZGV2KTsKKworCWllZWU4MDIxMV9zdG9wX3NjYW4oaWVlZSk7CisKKwkvLyBzZXQgY2hhbm5lbAorCWlmKChpZWVlLT5pd19tb2RlID09IGllZWUtPml3X2V4dF9tb2RlKSAmJiBpZWVlLT5leHRfcGF0Y2hfaWVlZTgwMjExX2V4dF9zdG9wX3NjYW5fd3Ffc2V0X2NoYW5uZWwpCisJCWllZWUtPnNldF9jaGFuKGllZWUtPmRldiwgaWVlZS0+ZXh0X3BhdGNoX2llZWU4MDIxMV9leHRfc3RvcF9zY2FuX3dxX3NldF9jaGFubmVsKGllZWUpKTsKKwllbHNlCisJCWllZWUtPnNldF9jaGFuKGllZWUtPmRldiwgaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWwpOworCS8vCisJdXAoJmllZWUtPnd4X3NlbSk7Cit9CisKKwordm9pZCBpZWVlODAyMTFfZXh0X3NlbmRfMTFzX2JlYWNvbihzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKwkjaWYgTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw1LDApCisJCXF1ZXVlX3dvcmsoaWVlZS0+d3EsICZpZWVlLT5leHRfc2VuZF9iZWFjb25fd3EpOworCSNlbHNlCisJCXNjaGVkdWxlX3Rhc2soJmllZWUtPmV4dF9zZW5kX2JlYWNvbl93cSk7CisJI2VuZGlmCisKK30KKworI2VuZGlmIC8vIF9SVEw4MTg3X0VYVF9QQVRDSF8KKworaW5saW5lIHZvaWQgaWVlZTgwMjExX3NvZnRtYWNfbmV3X25ldChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpuZXQpCit7CisJdTggdG1wX3NzaWRbSVdfRVNTSURfTUFYX1NJWkUrMV07CisJaW50IHRtcF9zc2lkX2xlbiA9IDA7CisKKwlzaG9ydCBhcHNldCxzc2lkc2V0LHNzaWRicm9hZCxhcG1hdGNoLHNzaWRtYXRjaDsKKworCS8qIHdlIGFyZSBpbnRlcmVzdGVkIGluIG5ldyBuZXcgb25seSBpZiB3ZSBhcmUgbm90IGFzc29jaWF0ZWQKKwkgKiBhbmQgd2UgYXJlIG5vdCBhc3NvY2lhdGluZyAvIGF1dGhlbnRpY2F0aW5nCisJICovCisJaWYgKGllZWUtPnN0YXRlICE9IElFRUU4MDIxMV9OT0xJTkspCisJCXJldHVybjsKKworCWlmICgoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX0lORlJBKSAmJiAhKG5ldC0+Y2FwYWJpbGl0eSAmIFdMQU5fQ0FQQUJJTElUWV9CU1MpKQorCQlyZXR1cm47CisKKwlpZiAoKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9BREhPQykgJiYgIShuZXQtPmNhcGFiaWxpdHkgJiBXTEFOX0NBUEFCSUxJVFlfSUJTUykpCisJCXJldHVybjsKKworCisJaWYgKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9JTkZSQSB8fCBpZWVlLT5pd19tb2RlID09IElXX01PREVfQURIT0MpeworCQkvKiBpZiB0aGUgdXNlciBzcGVjaWZpZWQgdGhlIEFQIE1BQywgd2UgbmVlZCBhbHNvIHRoZSBlc3NpZAorCQkgKiBUaGlzIGNvdWxkIGJlIG9idGFpbmVkIGJ5IGJlYWNvbnMgb3IsIGlmIHRoZSBuZXR3b3JrIGRvZXMgbm90CisJCSAqIGJyb2FkY2FzdCBpdCwgaXQgY2FuIGJlIHB1dCBtYW51YWxseS4KKwkJICovCisJCWFwc2V0ID0gaWVlZS0+d2FwX3NldDsvLyhtZW1jbXAoaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJzc2lkLCB6ZXJvLEVUSF9BTEVOKSE9MCApOworCQlzc2lkc2V0ID0gaWVlZS0+c3NpZF9zZXQ7Ly9pZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZFswXSAhPSAnXDAnOworCQlzc2lkYnJvYWQgPSAgIShuZXQtPnNzaWRfbGVuID09IDAgfHwgbmV0LT5zc2lkWzBdPT0gJ1wwJyk7CisJCWFwbWF0Y2ggPSAobWVtY21wKGllZWUtPmN1cnJlbnRfbmV0d29yay5ic3NpZCwgbmV0LT5ic3NpZCwgRVRIX0FMRU4pPT0wKTsKKworCQlpZihpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZF9sZW4gIT0gbmV0LT5zc2lkX2xlbikKKwkJCXNzaWRtYXRjaCA9IDA7CisJCWVsc2UKKwkJCXNzaWRtYXRjaCA9ICgwPT1zdHJuY21wKGllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkLCBuZXQtPnNzaWQsIG5ldC0+c3NpZF9sZW4pKTsKKworCQkvL3ByaW50aygiY3VyOiAlcywgJWQsIG5ldDolcywgJWRcbiIsIGllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkLCBpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZF9sZW4sIG5ldC0+c3NpZCwgbmV0LT5zc2lkX2xlbik7CisJCS8vcHJpbnRrKCJhcHNldD0lZCBhcG1hdGNoPSVkIHNzaWRzZXQ9JWQgc3NpZGJyb2FkPSVkIHNzaWRtYXRjaD0lZFxuIixhcHNldCxhcG1hdGNoLHNzaWRzZXQsc3NpZGJyb2FkLHNzaWRtYXRjaCk7CisKKwkJaWYgKAkvKiBpZiB0aGUgdXNlciBzZXQgdGhlIEFQIGNoZWNrIGlmIG1hdGNoLgorCQkJICogaWYgdGhlIG5ldHdvcmsgZG9lcyBub3QgYnJvYWRjYXN0IGVzc2lkIHdlIGNoZWNrIHRoZSB1c2VyIHN1cHBseWVkIEFOWSBlc3NpZAorCQkJICogaWYgdGhlIG5ldHdvcmsgZG9lcyBicm9hZGNhc3QgYW5kIHRoZSB1c2VyIGRvZXMgbm90IHNldCBlc3NpZCBpdCBpcyBPSworCQkJICogaWYgdGhlIG5ldHdvcmsgZG9lcyBicm9hZGNhc3QgYW5kIHRoZSB1c2VyIGRpZCBzZXQgZXNzaWQgY2hlY2ggaWYgZXNzaWQgbWF0Y2gKKwkJCSAqLworCQkJCSggYXBzZXQgJiYgYXBtYXRjaCAmJgorCQkJCSAgKChzc2lkc2V0ICYmIHNzaWRicm9hZCAmJiBzc2lkbWF0Y2gpIHx8IChzc2lkYnJvYWQgJiYgIXNzaWRzZXQpIHx8ICghc3NpZGJyb2FkICYmIHNzaWRzZXQpKSApIHx8CisJCQkJLyogaWYgdGhlIGFwIGlzIG5vdCBzZXQsIGNoZWNrIHRoYXQgdGhlIHVzZXIgc2V0IHRoZSBic3NpZAorCQkJCSAqIGFuZCB0aGUgbmV0d29yayBkb2VzIGJyYWRjYXN0IGFuZCB0aGF0IHRob3NlIHR3byBic3NpZCBtYXRjaGVzCisJCQkJICovCisJCQkJKCFhcHNldCAmJiBzc2lkc2V0ICYmIHNzaWRicm9hZCAmJiBzc2lkbWF0Y2gpCisJCSAgICl7CisKKworCQkJLyogaWYgdGhlIGVzc2lkIGlzIGhpZGRlbiByZXBsYWNlIGl0IHdpdGggdGhlCisJCQkgKiBlc3NpZCBwcm92aWRlZCBieSB0aGUgdXNlci4KKwkJCSAqLworCQkJaWYgKCFzc2lkYnJvYWQpeworCQkJCXN0cm5jcHkodG1wX3NzaWQsIGllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkLCBJV19FU1NJRF9NQVhfU0laRSk7CisJCQkJdG1wX3NzaWRfbGVuID0gaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWRfbGVuOworCQkJfQorCQkJbWVtY3B5KCZpZWVlLT5jdXJyZW50X25ldHdvcmssIG5ldCwgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfbmV0d29yaykpOworCisJCQlpZiAoIXNzaWRicm9hZCl7CisJCQkJc3RybmNweShpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZCwgdG1wX3NzaWQsIElXX0VTU0lEX01BWF9TSVpFKTsKKwkJCQlpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZF9sZW4gPSB0bXBfc3NpZF9sZW47CisJCQl9CisJCQlwcmludGsoS0VSTl9JTkZPIkxpbmtpbmcgd2l0aCAlczogY2hhbm5lbCBpcyAlZFxuIixpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZCxpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCk7CisKKwkJCWlmIChpZWVlLT5pd19tb2RlID09IElXX01PREVfSU5GUkEpeworCQkJCWllZWUtPnN0YXRlID0gSUVFRTgwMjExX0FTU09DSUFUSU5HOworCQkJCWllZWUtPmJlaW5yZXRyeSA9IGZhbHNlOworCQkJCXF1ZXVlX3dvcmsoaWVlZS0+d3EsICZpZWVlLT5hc3NvY2lhdGVfcHJvY2VkdXJlX3dxKTsKKwkJCX1lbHNleworCQkJCWlmKGllZWU4MDIxMV9pc181NGcoaWVlZS0+Y3VycmVudF9uZXR3b3JrKSAmJgorCQkJCQkJKGllZWUtPm1vZHVsYXRpb24gJiBJRUVFODAyMTFfT0ZETV9NT0RVTEFUSU9OKSl7CisJCQkJCWllZWUtPnJhdGUgPSA1NDA7CisJCQkJCXByaW50ayhLRVJOX0lORk8iVXNpbmcgRyByYXRlc1xuIik7CisJCQkJfWVsc2V7CisJCQkJCWllZWUtPnJhdGUgPSAxMTA7CisJCQkJCXByaW50ayhLRVJOX0lORk8iVXNpbmcgQiByYXRlc1xuIik7CisJCQkJfQorCQkJCWllZWUtPnN0YXRlID0gSUVFRTgwMjExX0xJTktFRDsKKwkJCQlpZWVlLT5iZWlucmV0cnkgPSBmYWxzZTsKKwkJCX0KKworCQl9CisJfQorCit9CisKK3ZvaWQgaWVlZTgwMjExX3NvZnRtYWNfY2hlY2tfYWxsX25ldHMoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKnRhcmdldDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5sb2NrLCBmbGFncyk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeSh0YXJnZXQsICZpZWVlLT5uZXR3b3JrX2xpc3QsIGxpc3QpIHsKKworCQkvKiBpZiB0aGUgc3RhdGUgYmVjb21lIGRpZmZlcmVudCB0aGF0IE5PTElOSyBtZWFucworCQkgKiB3ZSBoYWQgZm91bmQgd2hhdCB3ZSBhcmUgc2VhcmNoaW5nIGZvcgorCQkgKi8KKworCQlpZiAoaWVlZS0+c3RhdGUgIT0gSUVFRTgwMjExX05PTElOSykKKwkJCWJyZWFrOworCisJCWlmIChpZWVlLT5zY2FuX2FnZSA9PSAwIHx8IHRpbWVfYWZ0ZXIodGFyZ2V0LT5sYXN0X3NjYW5uZWQgKyBpZWVlLT5zY2FuX2FnZSwgamlmZmllcykpCisJCQlpZWVlODAyMTFfc29mdG1hY19uZXdfbmV0KGllZWUsIHRhcmdldCk7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+bG9jaywgZmxhZ3MpOworCit9CisKKworc3RhdGljIGlubGluZSB1MTYgYXV0aF9wYXJzZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1OCoqIGNoYWxsZW5nZSwgaW50ICpjaGxlbikKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2F1dGhlbnRpY2F0aW9uICphOworCXU4ICp0OworCWlmIChza2ItPmxlbiA8ICAoc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfYXV0aGVudGljYXRpb24pLXNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2luZm9fZWxlbWVudCkpKXsKKwkJSUVFRTgwMjExX0RFQlVHX01HTVQoImludmFsaWQgbGVuIGluIGF1dGggcmVzcDogJWRcbiIsc2tiLT5sZW4pOworCQlyZXR1cm4gMHhjYWZlOworCX0KKwkqY2hhbGxlbmdlID0gTlVMTDsKKwlhID0gKHN0cnVjdCBpZWVlODAyMTFfYXV0aGVudGljYXRpb24qKSBza2ItPmRhdGE7CisJaWYoc2tiLT5sZW4gPiAoc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfYXV0aGVudGljYXRpb24pICszKSl7CisJCXQgPSBza2ItPmRhdGEgKyBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9hdXRoZW50aWNhdGlvbik7CisKKwkJaWYoKih0KyspID09IE1GSUVfVFlQRV9DSEFMTEVOR0UpeworCQkJKmNobGVuID0gKih0KyspOworCQkJKmNoYWxsZW5nZSA9ICh1OCopa21hbGxvYygqY2hsZW4sIEdGUF9BVE9NSUMpOworCQkJbWVtY3B5KCpjaGFsbGVuZ2UsIHQsICpjaGxlbik7CisJCX0KKwl9CisKKwlyZXR1cm4gY3B1X3RvX2xlMTYoYS0+c3RhdHVzKTsKKworfQorCisKK2ludCBhdXRoX3JxX3BhcnNlKHN0cnVjdCBza19idWZmICpza2IsdTgqIGRlc3QpCit7CisJc3RydWN0IGllZWU4MDIxMV9hdXRoZW50aWNhdGlvbiAqYTsKKworCWlmIChza2ItPmxlbiA8ICAoc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfYXV0aGVudGljYXRpb24pLXNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2luZm9fZWxlbWVudCkpKXsKKwkJSUVFRTgwMjExX0RFQlVHX01HTVQoImludmFsaWQgbGVuIGluIGF1dGggcmVxdWVzdDogJWRcbiIsc2tiLT5sZW4pOworCQlyZXR1cm4gLTE7CisJfQorCWEgPSAoc3RydWN0IGllZWU4MDIxMV9hdXRoZW50aWNhdGlvbiopIHNrYi0+ZGF0YTsKKworCW1lbWNweShkZXN0LGEtPmhlYWRlci5hZGRyMiwgRVRIX0FMRU4pOworCisJaWYgKGxlMTZfdG9fY3B1KGEtPmFsZ29yaXRobSkgIT0gV0xBTl9BVVRIX09QRU4pCisJCXJldHVybiAgV0xBTl9TVEFUVVNfTk9UX1NVUFBPUlRFRF9BVVRIX0FMRzsKKworCXJldHVybiBXTEFOX1NUQVRVU19TVUNDRVNTOworfQorCitzdGF0aWMgc2hvcnQgcHJvYmVfcnFfcGFyc2Uoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBza19idWZmICpza2IsIHU4ICpzcmMpCit7CisJdTggKnRhZzsKKwl1OCAqc2tiZW5kOworCXU4ICpzc2lkPU5VTEw7CisJdTggc3NpZGxlbiA9IDA7CisKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciAgICpoZWFkZXIgPQorCQkoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgICAqKSBza2ItPmRhdGE7CisKKwlpZiAoc2tiLT5sZW4gPCBzaXplb2YgKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICApKQorCQlyZXR1cm4gLTE7IC8qIGNvcnJ1cHRlZCAqLworCisJbWVtY3B5KHNyYyxoZWFkZXItPmFkZHIyLCBFVEhfQUxFTik7CisKKwlza2JlbmQgPSAodTgqKXNrYi0+ZGF0YSArIHNrYi0+bGVuOworCisJdGFnID0gc2tiLT5kYXRhICsgc2l6ZW9mIChzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciAgKTsKKworCXdoaWxlICh0YWcrMSA8IHNrYmVuZCl7CisJCWlmICgqdGFnID09IDApeworCQkJc3NpZCA9IHRhZysyOworCQkJc3NpZGxlbiA9ICoodGFnKzEpOworCQkJYnJlYWs7CisJCX0KKwkJdGFnKys7IC8qIHBvaW50IHRvIHRoZSBsZW4gZmllbGQgKi8KKwkJdGFnID0gdGFnICsgKih0YWcpOyAvKiBwb2ludCB0byB0aGUgbGFzdCBkYXRhIGJ5dGUgb2YgdGhlIHRhZyAqLworCQl0YWcrKzsgLyogcG9pbnQgdG8gdGhlIG5leHQgdGFnICovCisJfQorCisJLy9JRUVFODAyMTFETUVTRygiQ2FyZCBNQUMgYWRkcmVzcyBpcyAiTUFDU1RSLCBNQUMyU1RSKHNyYykpOworCWlmIChzc2lkbGVuID09IDApIHJldHVybiAxOworCisJaWYgKCFzc2lkKSByZXR1cm4gMTsgLyogc3NpZCBub3QgZm91bmQgaW4gdGFnZ2VkIHBhcmFtICovCisJcmV0dXJuICghc3RybmNtcChzc2lkLCBpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZCwgc3NpZGxlbikpOworCit9CisKK2ludCBhc3NvY19ycV9wYXJzZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLHU4KiBkZXN0KQoreworCXN0cnVjdCBpZWVlODAyMTFfYXNzb2NfcmVxdWVzdF9mcmFtZSAqYTsKKworCWlmIChza2ItPmxlbiA8IChzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9hc3NvY19yZXF1ZXN0X2ZyYW1lKSAtCisJCXNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2luZm9fZWxlbWVudCkpKSB7CisKKwkJSUVFRTgwMjExX0RFQlVHX01HTVQoImludmFsaWQgbGVuIGluIGF1dGggcmVxdWVzdDolZCBcbiIsIHNrYi0+bGVuKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWEgPSAoc3RydWN0IGllZWU4MDIxMV9hc3NvY19yZXF1ZXN0X2ZyYW1lKikgc2tiLT5kYXRhOworCisJbWVtY3B5KGRlc3QsYS0+aGVhZGVyLmFkZHIyLEVUSF9BTEVOKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHUxNiBhc3NvY19wYXJzZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgKmFpZCkKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2Fzc29jX3Jlc3BvbnNlX2ZyYW1lICphOworCWlmIChza2ItPmxlbiA8ICBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9hc3NvY19yZXNwb25zZV9mcmFtZSkpeworCQlJRUVFODAyMTFfREVCVUdfTUdNVCgiaW52YWxpZCBsZW4gaW4gYXV0aCByZXNwOiAlZFxuIiwgc2tiLT5sZW4pOworCQlyZXR1cm4gMHhjYWZlOworCX0KKworCWEgPSAoc3RydWN0IGllZWU4MDIxMV9hc3NvY19yZXNwb25zZV9mcmFtZSopIHNrYi0+ZGF0YTsKKwkqYWlkID0gbGUxNl90b19jcHUoYS0+YWlkKSAmIDB4M2ZmZjsKKwlyZXR1cm4gbGUxNl90b19jcHUoYS0+c3RhdHVzKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitpZWVlODAyMTFfcnhfcHJvYmVfcnEoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJdTggZGVzdFtFVEhfQUxFTl07CisKKwkvL0lFRUU4MDIxMURNRVNHKCJSeCBwcm9iZSIpOworCWllZWUtPnNvZnRtYWNfc3RhdHMucnhfcHJvYmVfcnErKzsKKwkvL0RNRVNHKCJEZXN0IGlzICJNQUNTVFIsIE1BQzJTVFIoZGVzdCkpOworCWlmIChwcm9iZV9ycV9wYXJzZShpZWVlLCBza2IsIGRlc3QpKXsKKwkJLy9JRUVFODAyMTFETUVTRygiV2FzIGZvciBtZSEiKTsKKwkJaWVlZS0+c29mdG1hY19zdGF0cy50eF9wcm9iZV9ycysrOworCQlpZWVlODAyMTFfcmVzcF90b19wcm9iZShpZWVlLCBkZXN0KTsKKwl9Cit9CisKK2lubGluZSB2b2lkCitpZWVlODAyMTFfcnhfYXV0aF9ycShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwl1OCBkZXN0W0VUSF9BTEVOXTsKKwlpbnQgc3RhdHVzOworCS8vSUVFRTgwMjExRE1FU0coIlJ4IHByb2JlIik7CisJaWVlZS0+c29mdG1hY19zdGF0cy5yeF9hdXRoX3JxKys7CisKKwlpZiAoKHN0YXR1cyA9IGF1dGhfcnFfcGFyc2Uoc2tiLCBkZXN0KSkhPSAtMSl7CisJCWllZWU4MDIxMV9yZXNwX3RvX2F1dGgoaWVlZSwgc3RhdHVzLCBkZXN0KTsKKwl9CisJLy9ETUVTRygiRGVzdCBpcyAiTUFDU1RSLCBNQUMyU1RSKGRlc3QpKTsKKworfQorCisgaW5saW5lIHZvaWQKK2llZWU4MDIxMV9yeF9hc3NvY19ycShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKworCXU4IGRlc3RbRVRIX0FMRU5dOworCS8vdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWllZWUtPnNvZnRtYWNfc3RhdHMucnhfYXNzX3JxKys7CisJaWYgKGFzc29jX3JxX3BhcnNlKHNrYixkZXN0KSAhPSAtMSl7CisJCWllZWU4MDIxMV9yZXNwX3RvX2Fzc29jX3JxKGllZWUsIGRlc3QpOworCX0KKworCXByaW50ayhLRVJOX0lORk8iTmV3IGNsaWVudCBhc3NvY2lhdGVkOiAiTUFDX0ZNVCJcbiIsIE1BQ19BUkcoZGVzdCkpOworCS8vRklYTUUKKwkjaWYgMAorCXNwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5sb2NrLGZsYWdzKTsKKwlhZGRfYXNzb2NpYXRlKGllZWUsZGVzdCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+bG9jayxmbGFncyk7CisJI2VuZGlmCit9CisKKworCit2b2lkIGllZWU4MDIxMV9zdGFfcHNfc2VuZF9udWxsX2ZyYW1lKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzaG9ydCBwd3IpCit7CisKKwlzdHJ1Y3Qgc2tfYnVmZiAqYnVmID0gaWVlZTgwMjExX251bGxfZnVuYyhpZWVlLCBwd3IpOworCisJaWYgKGJ1ZikKKwkJc29mdG1hY19wc19tZ210X3htaXQoYnVmLCBpZWVlKTsKKworfQorCisKK3Nob3J0IGllZWU4MDIxMV9zdGFfcHNfc2xlZXAoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHUzMiAqdGltZV9oLCB1MzIgKnRpbWVfbCkKK3sKKyNpZiAwCisgICAgICAgIGludCB0aW1lb3V0ID0gaWVlZS0+cHNfdGltZW91dDsKKyNlbHNlCisgICAgICAgIGludCB0aW1lb3V0ID0gMDsKKyNlbmRpZgorCXU4IGR0aW07CisJLyppZihpZWVlLT5wcyA9PSBJRUVFODAyMTFfUFNfRElTQUJMRUQgfHwKKwkJaWVlZS0+aXdfbW9kZSAhPSBJV19NT0RFX0lORlJBIHx8CisJCWllZWUtPnN0YXRlICE9IElFRUU4MDIxMV9MSU5LRUQpCisKKwkJcmV0dXJuIDA7CisJKi8KKwlkdGltID0gaWVlZS0+Y3VycmVudF9uZXR3b3JrLmR0aW1fZGF0YTsKKwkvL3ByaW50aygiRFRJTVxuIik7CisKKwlpZighKGR0aW0gJiBJRUVFODAyMTFfRFRJTV9WQUxJRCkpCisJCXJldHVybiAwOworICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdGltZW91dCA9IGllZWUtPmN1cnJlbnRfbmV0d29yay5iZWFjb25faW50ZXJ2YWw7CisKKwkvL3ByaW50aygiVkFMSURcbiIpOworCWllZWUtPmN1cnJlbnRfbmV0d29yay5kdGltX2RhdGEgPSBJRUVFODAyMTFfRFRJTV9JTlZBTElEOworCisJaWYoZHRpbSAmICgoSUVFRTgwMjExX0RUSU1fVUNBU1QgfCBJRUVFODAyMTFfRFRJTV9NQkNBU1QpJiBpZWVlLT5wcykpCisJCXJldHVybiAyOworCisJaWYoIXRpbWVfYWZ0ZXIoamlmZmllcywgaWVlZS0+ZGV2LT50cmFuc19zdGFydCArIE1TRUNTKHRpbWVvdXQpKSkKKwkJcmV0dXJuIDA7CisKKwlpZighdGltZV9hZnRlcihqaWZmaWVzLCBpZWVlLT5sYXN0X3J4X3BzX3RpbWUgKyBNU0VDUyh0aW1lb3V0KSkpCisJCXJldHVybiAwOworCisJaWYoKGllZWUtPnNvZnRtYWNfZmVhdHVyZXMgJiBJRUVFX1NPRlRNQUNfU0lOR0xFX1FVRVVFICkgJiYKKwkJKGllZWUtPm1nbXRfcXVldWVfdGFpbCAhPSBpZWVlLT5tZ210X3F1ZXVlX2hlYWQpKQorCQlyZXR1cm4gMDsKKyNpZiAwCisJaWYodGltZV9sKXsKKwkJKnRpbWVfbCA9IGllZWUtPmN1cnJlbnRfbmV0d29yay5sYXN0X2R0aW1fc3RhX3RpbWVbMF0KKwkJCSsgKGllZWUtPmN1cnJlbnRfbmV0d29yay5iZWFjb25faW50ZXJ2YWwKKwkJCSogaWVlZS0+Y3VycmVudF9uZXR3b3JrLmR0aW1fcGVyaW9kKSAqIDEwMDA7CisJfQorI2Vsc2UKKwlpZih0aW1lX2wpeworCQkqdGltZV9sID0gaWVlZS0+Y3VycmVudF9uZXR3b3JrLmxhc3RfZHRpbV9zdGFfdGltZVswXQorCQkJKyBNU0VDUygoaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJlYWNvbl9pbnRlcnZhbCkpOworCQkJLy8qIGllZWUtPmN1cnJlbnRfbmV0d29yay5kdGltX3BlcmlvZCkpOworCQkJLy9wcmludGsoImJlYWNvbl9pbnRlcnZhbDoleCwgZHRpbV9wZXJpb2Q6JXgsIHRvdG9sIHRvIE1zZWNzOiV4LCBIWjoleFxuIiwgaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJlYWNvbl9pbnRlcnZhbCwgaWVlZS0+Y3VycmVudF9uZXR3b3JrLmR0aW1fcGVyaW9kLCBNU0VDUygoKGllZWUtPmN1cnJlbnRfbmV0d29yay5iZWFjb25faW50ZXJ2YWwgKiBpZWVlLT5jdXJyZW50X25ldHdvcmsuZHRpbV9wZXJpb2QpKSksIEhaKTsKKwl9CisKKyNlbmRpZgorCWlmKHRpbWVfaCl7CisJCSp0aW1lX2ggPSBpZWVlLT5jdXJyZW50X25ldHdvcmsubGFzdF9kdGltX3N0YV90aW1lWzFdOworCQlpZih0aW1lX2wgJiYgKnRpbWVfbCA8IGllZWUtPmN1cnJlbnRfbmV0d29yay5sYXN0X2R0aW1fc3RhX3RpbWVbMF0pCisJCQkqdGltZV9oICs9IDE7CisJfQorCisJcmV0dXJuIDE7CisKKworfQorCitpbmxpbmUgdm9pZCBpZWVlODAyMTFfc3RhX3BzKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCisJdTMyIHRoLHRsOworCXNob3J0IHNsZWVwOworCisJdW5zaWduZWQgbG9uZyBmbGFncyxmbGFnczI7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWVlZS0+bG9jaywgZmxhZ3MpOworCisJaWYoKGllZWUtPnBzID09IElFRUU4MDIxMV9QU19ESVNBQkxFRCB8fAorCisJCWllZWUtPml3X21vZGUgIT0gSVdfTU9ERV9JTkZSQSB8fAorCQlpZWVlLT5zdGF0ZSAhPSBJRUVFODAyMTFfTElOS0VEKSl7CisKKwkJLy8jd2FybmluZyBDSEVDS19MT0NLX0hFUkUKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPm1nbXRfdHhfbG9jaywgZmxhZ3MyKTsKKworCQlpZWVlODAyMTFfc3RhX3dha2V1cChpZWVlLCAxKTsKKworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5tZ210X3R4X2xvY2ssIGZsYWdzMik7CisJfQorCisJc2xlZXAgPSBpZWVlODAyMTFfc3RhX3BzX3NsZWVwKGllZWUsJnRoLCAmdGwpOworLy8JcHJpbnRrKCI9PT0+JXMsJWRbMiB3YWtlLCAxIHNsZWVwLCAwIGRvIG5vdGhpbmddLCBpZWVlLT5zdGFfc2xlZXAgPSAlZFxuIixfX2Z1bmNfXywgc2xlZXAsaWVlZS0+c3RhX3NsZWVwKTsKKwkvKiAyIHdha2UsIDEgc2xlZXAsIDAgZG8gbm90aGluZyAqLworCWlmKHNsZWVwID09IDApCisJCWdvdG8gb3V0OworCisJaWYoc2xlZXAgPT0gMSl7CisKKwkJaWYoaWVlZS0+c3RhX3NsZWVwID09IDEpCisJCQlpZWVlLT5lbnRlcl9zbGVlcF9zdGF0ZShpZWVlLT5kZXYsdGgsdGwpOworCisJCWVsc2UgaWYoaWVlZS0+c3RhX3NsZWVwID09IDApeworCS8vCQlwcmludGsoInNlbmQgbnVsbCAxXG4iKTsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5tZ210X3R4X2xvY2ssIGZsYWdzMik7CisKKwkJCWlmKGllZWUtPnBzX2lzX3F1ZXVlX2VtcHR5KGllZWUtPmRldikpeworCisKKwkJCQlpZWVlLT5zdGFfc2xlZXAgPSAyOworCisJCQkJaWVlZS0+cHNfcmVxdWVzdF90eF9hY2soaWVlZS0+ZGV2KTsKKworCQkJCWllZWU4MDIxMV9zdGFfcHNfc2VuZF9udWxsX2ZyYW1lKGllZWUsMSk7CisKKwkJCQlpZWVlLT5wc190aCA9IHRoOworCQkJCWllZWUtPnBzX3RsID0gdGw7CisJCQl9CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5tZ210X3R4X2xvY2ssIGZsYWdzMik7CisKKwkJfQorCisKKwl9ZWxzZSBpZihzbGVlcCA9PSAyKXsKKy8vI3dhcm5pbmcgQ0hFQ0tfTE9DS19IRVJFCisJCXNwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5tZ210X3R4X2xvY2ssIGZsYWdzMik7CisKKwkvLwlwcmludGsoInNlbmQgd2FrZXVwIHBhY2tldFxuIik7CisJCWllZWU4MDIxMV9zdGFfd2FrZXVwKGllZWUsMSk7CisKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+bWdtdF90eF9sb2NrLCBmbGFnczIpOworCX0KKworb3V0OgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKKworfQorCit2b2lkIGllZWU4MDIxMV9zdGFfd2FrZXVwKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzaG9ydCBubCkKK3sKKwlpZihpZWVlLT5zdGFfc2xlZXAgPT0gMCl7CisJCWlmKG5sKXsKKwkJLy8JcHJpbnRrKCJXYXJuaW5nOiBkcml2ZXIgaXMgcHJvYmFibHkgZmFpbGluZyB0byByZXBvcnQgVFggcHMgZXJyb3JcbiIpOworCQkJaWVlZS0+cHNfcmVxdWVzdF90eF9hY2soaWVlZS0+ZGV2KTsKKwkJCWllZWU4MDIxMV9zdGFfcHNfc2VuZF9udWxsX2ZyYW1lKGllZWUsIDApOworCQl9CisJCXJldHVybjsKKworCX0KKworCWlmKGllZWUtPnN0YV9zbGVlcCA9PSAxKQorCQlpZWVlLT5zdGFfd2FrZV91cChpZWVlLT5kZXYpOworCisJaWVlZS0+c3RhX3NsZWVwID0gMDsKKworCWlmKG5sKXsKKwkJaWVlZS0+cHNfcmVxdWVzdF90eF9hY2soaWVlZS0+ZGV2KTsKKwkJaWVlZTgwMjExX3N0YV9wc19zZW5kX251bGxfZnJhbWUoaWVlZSwgMCk7CisJfQorfQorCit2b2lkIGllZWU4MDIxMV9wc190eF9hY2soc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHNob3J0IHN1Y2Nlc3MpCit7CisJdW5zaWduZWQgbG9uZyBmbGFncyxmbGFnczI7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWVlZS0+bG9jaywgZmxhZ3MpOworCWlmKGllZWUtPnN0YV9zbGVlcCA9PSAyKXsKKwkJLyogTnVsbCBmcmFtZSB3aXRoIFBTIGJpdCBzZXQgKi8KKwkJaWYoc3VjY2Vzcyl7CisKKwkJLy8JcHJpbnRrKCI9PT09PT09PT09PT09PT09PT0+ICVzOjplbnRlciBzbGVlcCBzdGF0ZVxuIixfX2Z1bmNfXyk7CisJCQlpZWVlLT5zdGFfc2xlZXAgPSAxOworCQkJaWVlZS0+ZW50ZXJfc2xlZXBfc3RhdGUoaWVlZS0+ZGV2LGllZWUtPnBzX3RoLGllZWUtPnBzX3RsKTsKKwkJfQorCQkvKiBpZiB0aGUgY2FyZCByZXBvcnQgbm90IHN1Y2Nlc3Mgd2UgY2FuJ3QgYmUgc3VyZSB0aGUgQVAKKwkJICogaGFzIG5vdCBSWGVkIHNvIHdlIGNhbid0IGFzc3VtZSB0aGUgQVAgYmVsaWV2ZSB1cyBhd2FrZQorCQkgKi8KKwl9CisJLyogMjExMTIwMDUgLSB0eCBhZ2FpbiBudWxsIHdpdGhvdXQgUFMgYml0IGlmIGxvc3QgKi8KKwllbHNlIHsKKworCQlpZigoaWVlZS0+c3RhX3NsZWVwID09IDApICYmICFzdWNjZXNzKXsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5tZ210X3R4X2xvY2ssIGZsYWdzMik7CisJCQlpZWVlODAyMTFfc3RhX3BzX3NlbmRfbnVsbF9mcmFtZShpZWVlLCAwKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPm1nbXRfdHhfbG9jaywgZmxhZ3MyKTsKKwkJfQorCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5sb2NrLCBmbGFncyk7Cit9CisKK2lubGluZSBpbnQKK2llZWU4MDIxMV9yeF9mcmFtZV9zb2Z0bWFjKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0cyAqcnhfc3RhdHMsIHUxNiB0eXBlLAorCQkJdTE2IHN0eXBlKQoreworCXN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICpoZWFkZXIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgKikgc2tiLT5kYXRhOworCXUxNiBlcnJjb2RlOworCXU4KiBjaGFsbGVuZ2U9TlVMTDsKKwlpbnQgY2hsZW49MDsKKwlpbnQgYWlkPTA7CisJc3RydWN0IGllZWU4MDIxMV9hc3NvY19yZXNwb25zZV9mcmFtZSAqYXNzb2NfcmVzcDsKKwlzdHJ1Y3QgaWVlZTgwMjExX2luZm9fZWxlbWVudCAqaW5mb19lbGVtZW50OworCisJaWYoIWllZWUtPnByb3RvX3N0YXJ0ZWQpCisJCXJldHVybiAwOworCisJaWYoaWVlZS0+c3RhX3NsZWVwIHx8IChpZWVlLT5wcyAhPSBJRUVFODAyMTFfUFNfRElTQUJMRUQgJiYKKwkJaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX0lORlJBICYmCisJCWllZWUtPnN0YXRlID09IElFRUU4MDIxMV9MSU5LRUQpKQorCisJCXRhc2tsZXRfc2NoZWR1bGUoJmllZWUtPnBzX3Rhc2spOworCisJaWYoV0xBTl9GQ19HRVRfU1RZUEUoaGVhZGVyLT5mcmFtZV9jdGwpICE9IElFRUU4MDIxMV9TVFlQRV9QUk9CRV9SRVNQICYmCisJCVdMQU5fRkNfR0VUX1NUWVBFKGhlYWRlci0+ZnJhbWVfY3RsKSAhPSBJRUVFODAyMTFfU1RZUEVfQkVBQ09OKQorCQlpZWVlLT5sYXN0X3J4X3BzX3RpbWUgPSBqaWZmaWVzOworCisJc3dpdGNoIChXTEFOX0ZDX0dFVF9TVFlQRShoZWFkZXItPmZyYW1lX2N0bCkpIHsKKworCQljYXNlIElFRUU4MDIxMV9TVFlQRV9BU1NPQ19SRVNQOgorCQljYXNlIElFRUU4MDIxMV9TVFlQRV9SRUFTU09DX1JFU1A6CisKKwkJCUlFRUU4MDIxMV9ERUJVR19NR01UKCJyZWNlaXZlZCBbUkVdQVNTT0NJQVRJT04gUkVTUE9OU0UgKCVkKVxuIiwKKwkJCQkJV0xBTl9GQ19HRVRfU1RZUEUoaGVhZGVyLT5mcmFtZV9jdGwpKTsKKwkJCWlmICgoaWVlZS0+c29mdG1hY19mZWF0dXJlcyAmIElFRUVfU09GVE1BQ19BU1NPQ0lBVEUpICYmCisJCQkJaWVlZS0+c3RhdGUgPT0gSUVFRTgwMjExX0FTU09DSUFUSU5HX0FVVEhFTlRJQ0FURUQgJiYKKwkJCQlpZWVlLT5pd19tb2RlID09IElXX01PREVfSU5GUkEpeworCQkJCWlmICgwID09IChlcnJjb2RlPWFzc29jX3BhcnNlKHNrYiwgJmFpZCkpKXsKKwkJCQkJdTE2IGxlZnQ7CisKKwkJCQkJaWVlZS0+c3RhdGU9SUVFRTgwMjExX0xJTktFRDsKKwkJCQkJaWVlZS0+YXNzb2NfaWQgPSBhaWQ7CisJCQkJCWllZWUtPnNvZnRtYWNfc3RhdHMucnhfYXNzX29rKys7CisKKwkJCQkJLy9wcmludGsoS0VSTl9XQVJOSU5HICJuaWNfdHlwZSA9ICVzIiwgKHJ4X3N0YXRzLT5uaWNfdHlwZSA9PSAxKT8icnRsODE4NyI6InJ0bDgxODdCIik7CisJCQkJCWlmKDEgPT0gcnhfc3RhdHMtPm5pY190eXBlKSAvL2NhcmQgdHlwZSBpcyA4MTg3CisJCQkJCXsKKwkJCQkJCWdvdG8gYXNzb2NpYXRlX2NvbXBsZXRlOworCQkJCQl9CisJCQkJCWFzc29jX3Jlc3AgPSAoc3RydWN0IGllZWU4MDIxMV9hc3NvY19yZXNwb25zZV9mcmFtZSopc2tiLT5kYXRhOworCQkJCQlpbmZvX2VsZW1lbnQgPSAJJmFzc29jX3Jlc3AtPmluZm9fZWxlbWVudDsKKwkJCQkJbGVmdCA9IHNrYi0+bGVuIC0gKCh2b2lkKilpbmZvX2VsZW1lbnQgLSAodm9pZCopYXNzb2NfcmVzcCk7CisKKwkJCQkJd2hpbGUgKGxlZnQgPj0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaW5mb19lbGVtZW50X2hkcikpIHsKKwkJCQkJCWlmIChzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9pbmZvX2VsZW1lbnRfaGRyKSArIGluZm9fZWxlbWVudC0+bGVuID4gbGVmdCkgeworCQkJCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIltyZV1hc3NvY2lhdGUgcmVlcG9uc2UgZXJyb3IhIik7CisJCQkJCQkJcmV0dXJuIDE7CisJCQkJCQl9CisJCQkJCQlzd2l0Y2ggKGluZm9fZWxlbWVudC0+aWQpIHsKKwkJCQkJCSAgY2FzZSBNRklFX1RZUEVfR0VORVJJQzoKKwkJCQkJCSAgICAgICAgIElFRUU4MDIxMV9ERUJVR19TQ0FOKCJNRklFX1RZUEVfR0VORVJJQzogJWQgYnl0ZXNcbiIsIGluZm9fZWxlbWVudC0+bGVuKTsKKwkJCQkJCQlpZiAoaW5mb19lbGVtZW50LT5sZW4gPj0gOCAgJiYKKwkJCQkJCQkgICAgaW5mb19lbGVtZW50LT5kYXRhWzBdID09IDB4MDAgJiYKKwkJCQkJCQkgICAgaW5mb19lbGVtZW50LT5kYXRhWzFdID09IDB4NTAgJiYKKwkJCQkJCQkgICAgaW5mb19lbGVtZW50LT5kYXRhWzJdID09IDB4ZjIgJiYKKwkJCQkJCQkgICAgaW5mb19lbGVtZW50LT5kYXRhWzNdID09IDB4MDIgJiYKKwkJCQkJCQkgICAgaW5mb19lbGVtZW50LT5kYXRhWzRdID09IDB4MDEpIHsKKwkJCQkJCQkgICAgLy8gTm90IGNhcmUgYWJvdXQgdmVyc2lvbiBhdCBwcmVzZW50LgorCQkJCQkJCSAgICAvL1dNTSBQYXJhbWV0ZXIgRWxlbWVudAorCQkJCQkJCSAgICBtZW1jcHkoaWVlZS0+Y3VycmVudF9uZXR3b3JrLndtbV9wYXJhbSwodTgqKShpbmZvX2VsZW1lbnQtPmRhdGFcCisJCQkJCQkJCQkJICAgICsgOCksKGluZm9fZWxlbWVudC0+bGVuIC0gOCkpOworCisJCQkJCSAJICAgICAgICAgICAgaWYgKCgoaWVlZS0+Y3VycmVudF9uZXR3b3JrLndtbV9pbmZvXmluZm9fZWxlbWVudC0+ZGF0YVs2XSkmIFwKKwkJCQkJCQkJCQkgICAgMHgwZil8fCghaWVlZS0+aW5pdF93bW1wYXJhbV9mbGFnKSkgeworCQkJCQkJICAgCSAgICAgIC8vcmVmcmVzaCBwYXJhbWV0ZSBlbGVtZW50IGZvciBjdXJyZW50IG5ldHdvcmsKKwkJCQkJCQkgICAgICAvLyB1cGRhdGUgdGhlIHJlZ2lzdGVyIHBhcmFtZXRlciBmb3IgaGFyZHdhcmUKKwkJCQkJCQkgICAgICBpZWVlLT5pbml0X3dtbXBhcmFtX2ZsYWcgPSAxOworCQkJCQkJCSAgICAgIHF1ZXVlX3dvcmsoaWVlZS0+d3EsICZpZWVlLT53bW1fcGFyYW1fdXBkYXRlX3dxKTsKKworCQkJCQkJICAgICAgICAgICAgfQorCQkJCQkJICAgICAgICAgICAgLy91cGRhdGUgaW5mb19lbGVtZW50IGZvciBjdXJyZW50IG5ldHdvcmsKKwkJCQkJCSAgICAgICAgICAgIGllZWUtPmN1cnJlbnRfbmV0d29yay53bW1faW5mbyAgPSBpbmZvX2VsZW1lbnQtPmRhdGFbNl07CisJCQkJCQkJfQorCQkJCQkJCWJyZWFrOworCQkJCQkJICBkZWZhdWx0OgorCQkJCQkJCS8vbm90aGluZyB0byBkbyBhdCBwcmVzZW50ISEhCisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisKKwkJCQkJCWxlZnQgLT0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaW5mb19lbGVtZW50X2hkcikgKworCQkJCQkJCWluZm9fZWxlbWVudC0+bGVuOworCQkJCQkJaW5mb19lbGVtZW50ID0gKHN0cnVjdCBpZWVlODAyMTFfaW5mb19lbGVtZW50ICopCisJCQkJCQkJJmluZm9fZWxlbWVudC0+ZGF0YVtpbmZvX2VsZW1lbnQtPmxlbl07CisJCQkJCX0KKwkJCQkJaWYoIWllZWUtPmluaXRfd21tcGFyYW1fZmxhZykgLy9sZWdhY3kgQVAsIHJlc2V0IHRoZSBBQ194eF9wYXJhbSByZWdpc3RlcgorCQkJCQl7CisJCQkJCQlxdWV1ZV93b3JrKGllZWUtPndxLCZpZWVlLT53bW1fcGFyYW1fdXBkYXRlX3dxKTsKKwkJCQkJCWllZWUtPmluaXRfd21tcGFyYW1fZmxhZyA9IDE7Ly9pbmRpY2F0ZSBBQ194eF9wYXJhbSB1cGF0ZWQgc2luY2UgbGFzdCBhc3NvY2lhdGUKKwkJCQkJfQorYXNzb2NpYXRlX2NvbXBsZXRlOgorCQkJCQlpZWVlODAyMTFfYXNzb2NpYXRlX2NvbXBsZXRlKGllZWUpOworCQkJCX1lbHNleworCQkJCQlpZWVlLT5zb2Z0bWFjX3N0YXRzLnJ4X2Fzc19lcnIrKzsKKwkJCQkJSUVFRTgwMjExX0RFQlVHX01HTVQoCisJCQkJCQkiQXNzb2NpYXRpb24gcmVzcG9uc2Ugc3RhdHVzIGNvZGUgMHgleFxuIiwKKwkJCQkJCWVycmNvZGUpOworCQkJCQlpZWVlODAyMTFfYXNzb2NpYXRlX2Fib3J0KGllZWUpOworCQkJCX0KKwkJCX0KKyNpZmRlZiBfUlRMODE4N19FWFRfUEFUQ0hfCisJCQllbHNlIGlmICgoaWVlZS0+aXdfbW9kZSA9PSBpZWVlLT5pd19leHRfbW9kZSkgJiYgaWVlZS0+ZXh0X3BhdGNoX2llZWU4MDIxMV9yeF9mcmFtZV9zb2Z0bWFjX29uX2Fzc29jX3JzcCkKKwkJCXsKKwkJCQkJaWVlZS0+ZXh0X3BhdGNoX2llZWU4MDIxMV9yeF9mcmFtZV9zb2Z0bWFjX29uX2Fzc29jX3JzcChpZWVlLCBza2IpOworCQkJfQorI2VuZGlmCisJCQlicmVhazsKKworCQljYXNlIElFRUU4MDIxMV9TVFlQRV9BU1NPQ19SRVE6CisJCWNhc2UgSUVFRTgwMjExX1NUWVBFX1JFQVNTT0NfUkVROgorCisJCQlpZiAoKGllZWUtPnNvZnRtYWNfZmVhdHVyZXMgJiBJRUVFX1NPRlRNQUNfQVNTT0NJQVRFKSAmJgorCQkJCWllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9NQVNURVIpCisKKwkJCQlpZWVlODAyMTFfcnhfYXNzb2NfcnEoaWVlZSwgc2tiKTsKKyNpZmRlZiBfUlRMODE4N19FWFRfUEFUQ0hfCisJCQllbHNlIGlmICgoaWVlZS0+aXdfbW9kZSA9PSBpZWVlLT5pd19leHRfbW9kZSkgJiYgaWVlZS0+ZXh0X3BhdGNoX2llZWU4MDIxMV9yeF9mcmFtZV9zb2Z0bWFjX29uX2Fzc29jX3JlcSkKKwkJCXsKKwkJCQkJaWVlZS0+ZXh0X3BhdGNoX2llZWU4MDIxMV9yeF9mcmFtZV9zb2Z0bWFjX29uX2Fzc29jX3JlcShpZWVlLCBza2IpOworCQkJfQorI2VuZGlmCisJCQlicmVhazsKKworCQljYXNlIElFRUU4MDIxMV9TVFlQRV9BVVRIOgorCisjaWZkZWYgX1JUTDgxODdfRVhUX1BBVENIXworcHJpbnRrKCJJRUVFODAyMTFfU1RZUEVfQVVUSFxuIik7CisJCQlpZigoaWVlZS0+aXdfbW9kZSA9PSBpZWVlLT5pd19leHRfbW9kZSkgJiYgaWVlZS0+ZXh0X3BhdGNoX2llZWU4MDIxMV9yeF9mcmFtZV9zb2Z0bWFjX29uX2F1dGgpCisJCQlpZiggaWVlZS0+ZXh0X3BhdGNoX2llZWU4MDIxMV9yeF9mcmFtZV9zb2Z0bWFjX29uX2F1dGgoaWVlZSwgc2tiLCByeF9zdGF0cykgKTsKKyNlbmRpZgorCQkJaWYgKGllZWUtPnNvZnRtYWNfZmVhdHVyZXMgJiBJRUVFX1NPRlRNQUNfQVNTT0NJQVRFKXsKKwkJCQlpZiAoaWVlZS0+c3RhdGUgPT0gSUVFRTgwMjExX0FTU09DSUFUSU5HX0FVVEhFTlRJQ0FUSU5HICYmCisJCQkJaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX0lORlJBKXsKKworCQkJCQkJSUVFRTgwMjExX0RFQlVHX01HTVQoIlJlY2VpdmVkIGF1dGhlbnRpY2F0aW9uIHJlc3BvbnNlIik7CisKKwkJCQkJCWlmICgwID09IChlcnJjb2RlPWF1dGhfcGFyc2Uoc2tiLCAmY2hhbGxlbmdlLCAmY2hsZW4pKSl7CisJCQkJCQkJaWYoaWVlZS0+b3Blbl93ZXAgfHwgIWNoYWxsZW5nZSl7CisJCQkJCQkJCWllZWUtPnN0YXRlID0gSUVFRTgwMjExX0FTU09DSUFUSU5HX0FVVEhFTlRJQ0FURUQ7CisJCQkJCQkJCWllZWUtPnNvZnRtYWNfc3RhdHMucnhfYXV0aF9yc19vaysrOworCisJCQkJCQkJCWllZWU4MDIxMV9hc3NvY2lhdGVfc3RlcDIoaWVlZSk7CisJCQkJCQkJfWVsc2V7CisJCQkJCQkJCWllZWU4MDIxMV9hdXRoX2NoYWxsZW5nZShpZWVlLCBjaGFsbGVuZ2UsIGNobGVuKTsKKwkJCQkJCQl9CisJCQkJCQl9ZWxzZXsKKwkJCQkJCQlpZWVlLT5zb2Z0bWFjX3N0YXRzLnJ4X2F1dGhfcnNfZXJyKys7CisJCQkJCQkJSUVFRTgwMjExX0RFQlVHX01HTVQoIkF1dGhlbnRpY2F0aW9uIHJlc3Bvc2Ugc3RhdHVzIGNvZGUgMHgleCIsZXJyY29kZSk7CisJCQkJCQkJaWVlZTgwMjExX2Fzc29jaWF0ZV9hYm9ydChpZWVlKTsKKwkJCQkJCX0KKworCQkJCQl9ZWxzZSBpZiAoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX01BU1RFUil7CisJCQkJCQlpZWVlODAyMTFfcnhfYXV0aF9ycShpZWVlLCBza2IpOworCQkJCQl9CisJCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBJRUVFODAyMTFfU1RZUEVfUFJPQkVfUkVROgorCisJCQlpZiAoKGllZWUtPnNvZnRtYWNfZmVhdHVyZXMgJiBJRUVFX1NPRlRNQUNfUFJPQkVSUykgJiYKKwkJCQkoKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9BREhPQyB8fAorCQkJCWllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9NQVNURVIpICYmCisJCQkJaWVlZS0+c3RhdGUgPT0gSUVFRTgwMjExX0xJTktFRCkpCisKKwkJCQlpZWVlODAyMTFfcnhfcHJvYmVfcnEoaWVlZSwgc2tiKTsKKwkJCWJyZWFrOworCisJCWNhc2UgSUVFRTgwMjExX1NUWVBFX0RJU0FTU09DOgorCQljYXNlIElFRUU4MDIxMV9TVFlQRV9ERUFVVEg6CisjaWZkZWYgX1JUTDgxODdfRVhUX1BBVENIXworcHJpbnRrKCJJRUVFODAyMTFfU1RZUEVfREVBVVRIXG4iKTsKKwkJaWYoKGllZWUtPml3X21vZGUgPT0gaWVlZS0+aXdfZXh0X21vZGUpICYmIGllZWUtPmV4dF9wYXRjaF9pZWVlODAyMTFfcnhfZnJhbWVfc29mdG1hY19vbl9kZWF1dGgpCisJCWlmKCBpZWVlLT5leHRfcGF0Y2hfaWVlZTgwMjExX3J4X2ZyYW1lX3NvZnRtYWNfb25fZGVhdXRoKGllZWUsIHNrYiwgcnhfc3RhdHMpICkJOworI2VuZGlmCisJCQkvKiBGSVhNRSBmb3Igbm93IHJlcGVhdCBhbGwgdGhlIGFzc29jaWF0aW9uIHByb2NlZHVyZQorCQkJKiBib3RoIGZvciBkaXNhc3NvY2lhdGlvbiBhbmQgZGVhdXRoZW50aWNhdGlvbgorCQkJKi8KKwkJCWlmICgoaWVlZS0+c29mdG1hY19mZWF0dXJlcyAmIElFRUVfU09GVE1BQ19BU1NPQ0lBVEUpICYmCisJCQkJKGllZWUtPnN0YXRlID09IElFRUU4MDIxMV9MSU5LRUQpICYmCisJCQkJKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9JTkZSQSkgJiYKKwkJCQkoIW1lbWNtcChoZWFkZXItPmFkZHIyLGllZWUtPmN1cnJlbnRfbmV0d29yay5ic3NpZCxFVEhfQUxFTikpKXsKKwkJCQlpZWVlLT5zdGF0ZSA9IElFRUU4MDIxMV9BU1NPQ0lBVElORzsKKwkJCQlpZWVlLT5zb2Z0bWFjX3N0YXRzLnJlYXNzb2MrKzsKKworCQkJCS8vbm90aWZ5X3d4X2Fzc29jX2V2ZW50KGllZWUpOyAgLy9ZSixkZWwsMDgwODI4LCBkbyBub3Qgbm90aWZ5IG9zIGhlcmUKKwkJCQlxdWV1ZV93b3JrKGllZWUtPndxLCAmaWVlZS0+YXNzb2NpYXRlX3Byb2NlZHVyZV93cSk7CisJCQl9CisKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLTE7CisJCQlicmVhazsKKwl9CisKKwkvL2Rldl9rZnJlZV9za2JfYW55KHNrYik7CisJcmV0dXJuIDA7Cit9CisKKworCisvKiBmb2xsb3dpbmcgYXJlIGZvciBhIHNpbXBsaWVyIFRYIHF1ZXVlIG1hbmFnZW1lbnQuCisgKiBJbnN0ZWFkIG9mIHVzaW5nIG5ldGlmX1tzdG9wL3dha2VdX3F1ZXVlIHRoZSBkcml2ZXIKKyAqIHdpbGwgdXNlcyB0aGVzZSB0d28gZnVuY3Rpb24gKHBsdXMgYSByZXNldCBvbmUpLCB0aGF0CisgKiB3aWxsIGludGVybmFsbHkgdXNlcyB0aGUga2VybmVsIG5ldGlmXyogYW5kIHRha2VzCisgKiBjYXJlIG9mIHRoZSBpZWVlODAyLjExIGZyYWdtZW50YXRpb24uCisgKiBTbyB0aGUgZHJpdmVyIHJlY2VpdmVzIGEgZnJhZ21lbnQgcGVyIHRpbWUgYW5kIG1pZ2h0CisgKiBjYWxsIHRoZSBzdG9wIGZ1bmN0aW9uIHdoZW4gaXQgd2FudCB3aXRob3V0IHRha2UgY2FyZQorICogdG8gaGF2ZSBlbm91Z2h0IHJvb20gdG8gVFggYW4gZW50aXJlIHBhY2tldC4KKyAqIFRoaXMgbWlnaHQgYmUgdXNlZnVsIGlmIGVhY2ggZnJhZ21lbnQgbmVlZCBpdCdzIG93bgorICogZGVzY3JpcHRvciwgdGh1cyBqdXN0IGtlZXAgYSB0b3RhbCBmcmVlIG1lbW9yeSA+IHRoYW4KKyAqIHRoZSBtYXggZnJhZ21lbnRhdGlvbiB0cmVzaG9sZCBpcyBub3QgZW5vdWdodC4uIElmIHRoZQorICogaWVlZTgwMi4xMSBzdGFjayBwYXNzZWQgYSBUWEIgc3RydWN0IHRoZW4geW91IG5lZWRlZAorICogdG8ga2VlcCBOIGZyZWUgZGVzY3JpcHRvcnMgd2hlcmUKKyAqIE4gPSBNQVhfUEFDS0VUX1NJWkUgLyBNSU5fRlJBR19UUkVTSE9MRAorICogSW4gdGhpcyB3YXkgeW91IG5lZWQganVzdCBvbmUgYW5kIHRoZSA4MDIuMTEgc3RhY2sKKyAqIHdpbGwgdGFrZSBjYXJlIG9mIGJ1ZmZlcmluZyBmcmFnbWVudHMgYW5kIHBhc3MgdGhlbSB0bworICogdG8gdGhlIGRyaXZlciBsYXRlciwgd2hlbiBpdCB3YWtlcyB0aGUgcXVldWUuCisgKi8KKwordm9pZCBpZWVlODAyMTFfc29mdG1hY194bWl0KHN0cnVjdCBpZWVlODAyMTFfdHhiICp0eGIsIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCisKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCAgaTsKKyNpZmRlZiBfUlRMODE4N19FWFRfUEFUQ0hfCisJaW50IHJhdGUgPSBpZWVlLT5yYXRlOworI2VuZGlmCisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWVlZS0+bG9jayxmbGFncyk7CisJI2lmIDAKKwlpZihpZWVlLT5xdWV1ZV9zdG9wKXsKKwkJSUVFRTgwMjExRE1FU0coIkVFOiBJRUVFIGhhcmRfc3RhcnRfeG1pdCBpbnZva2VkIHdoZW4ga2VybmVsIHF1ZXVlIHNob3VsZCBiZSBzdG9wcGVkIik7CisJCW5ldGlmX3N0b3BfcXVldWUoaWVlZS0+ZGV2KTsKKwkJaWVlZS0+aWVlZV9zdGF0cy5zd3R4c3RvcCsrOworCQkvL2Rldl9rZnJlZV9za2JfYW55KHNrYik7CisJCWVyciA9IDE7CisJCWdvdG8gZXhpdDsKKwl9CisKKwlpZWVlLT5zdGF0cy50eF9ieXRlcys9c2tiLT5sZW47CisKKworCXR4Yj1pZWVlODAyMTFfc2tiX3RvX3R4YihpZWVlLHNrYik7CisKKworCWlmKHR4Yj09TlVMTCl7CisJCUlFRUU4MDIxMURNRVNHKCJXVzogSUVFRSBzdGFjayBmYWlsZWQgdG8gcHJvdmlkZSB0eGIiKTsKKwkJLy9kZXZfa2ZyZWVfc2tiX2FueShza2IpOworCQllcnIgPSAxOworCQlnb3RvIGV4aXQ7CisJfQorCSNlbmRpZgorCisjaWZkZWYgX1JUTDgxODdfRVhUX1BBVENIXworCWlmKChpZWVlLT5pd19tb2RlID09IGllZWUtPml3X2V4dF9tb2RlKSAmJiBpZWVlLT5leHRfcGF0Y2hfaWVlZTgwMjExX3NvZnRtYWNfeG1pdF9nZXRfcmF0ZSAmJiB0eGItPm5yX2ZyYWdzKQorCXsKKwkJcmF0ZSA9IGllZWUtPmV4dF9wYXRjaF9pZWVlODAyMTFfc29mdG1hY194bWl0X2dldF9yYXRlKGllZWUsIHR4Yi0+ZnJhZ21lbnRzWzBdKTsKKwl9CisjZW5kaWYKKwkvKiBjYWxsZWQgd2l0aCAybmQgcGFybSAwLCBubyB0eCBtZ210IGxvY2sgcmVxdWlyZWQgKi8KKwlpZWVlODAyMTFfc3RhX3dha2V1cChpZWVlLDApOworCisJZm9yKGkgPSAwOyBpIDwgdHhiLT5ucl9mcmFnczsgaSsrKSB7CisKKwkJaWYgKGllZWUtPnF1ZXVlX3N0b3ApeworCQkJaWVlZS0+dHhfcGVuZGluZy50eGIgPSB0eGI7CisJCQlpZWVlLT50eF9wZW5kaW5nLmZyYWcgPSBpOworCQkJZ290byBleGl0OworCQl9ZWxzZXsKKwkJCWllZWUtPnNvZnRtYWNfZGF0YV9oYXJkX3N0YXJ0X3htaXQoCisJCQkJdHhiLT5mcmFnbWVudHNbaV0sCisjaWZkZWYgX1JUTDgxODdfRVhUX1BBVENIXworCQkJCWllZWUtPmRldiwgcmF0ZSk7CisjZWxzZQorCQkJCWllZWUtPmRldixpZWVlLT5yYXRlKTsKKyNlbmRpZgorCQkJCS8vKGkrMSk8dHhiLT5ucl9mcmFncyk7CisJCQlpZWVlLT5zdGF0cy50eF9wYWNrZXRzKys7CisJCQlpZWVlLT5zdGF0cy50eF9ieXRlcyArPSB0eGItPmZyYWdtZW50c1tpXS0+bGVuOworCQkJaWVlZS0+ZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJCX0KKwl9CisKKwlpZWVlODAyMTFfdHhiX2ZyZWUodHhiKTsKKworCWV4aXQ6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+bG9jayxmbGFncyk7CisKK30KKworLyogY2FsbGVkIHdpdGggaWVlZS0+bG9jayBhY3F1aXJlZCAqLwordm9pZCBpZWVlODAyMTFfcmVzdW1lX3R4KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCWludCBpOworCWZvcihpID0gaWVlZS0+dHhfcGVuZGluZy5mcmFnOyBpIDwgaWVlZS0+dHhfcGVuZGluZy50eGItPm5yX2ZyYWdzOyBpKyspIHsKKworCQlpZiAoaWVlZS0+cXVldWVfc3RvcCl7CisJCQlpZWVlLT50eF9wZW5kaW5nLmZyYWcgPSBpOworCQkJcmV0dXJuOworCQl9ZWxzZXsKKworCQkJaWVlZS0+c29mdG1hY19kYXRhX2hhcmRfc3RhcnRfeG1pdCgKKwkJCQlpZWVlLT50eF9wZW5kaW5nLnR4Yi0+ZnJhZ21lbnRzW2ldLAorCQkJCWllZWUtPmRldixpZWVlLT5yYXRlKTsKKwkJCQkvLyhpKzEpPGllZWUtPnR4X3BlbmRpbmcudHhiLT5ucl9mcmFncyk7CisJCQlpZWVlLT5zdGF0cy50eF9wYWNrZXRzKys7CisJCQlpZWVlLT5kZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwkJfQorCX0KKworCisJaWVlZTgwMjExX3R4Yl9mcmVlKGllZWUtPnR4X3BlbmRpbmcudHhiKTsKKwlpZWVlLT50eF9wZW5kaW5nLnR4YiA9IE5VTEw7Cit9CisKKwordm9pZCBpZWVlODAyMTFfcmVzZXRfcXVldWUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5sb2NrLGZsYWdzKTsKKwlpbml0X21nbXRfcXVldWUoaWVlZSk7CisJaWYgKGllZWUtPnR4X3BlbmRpbmcudHhiKXsKKwkJaWVlZTgwMjExX3R4Yl9mcmVlKGllZWUtPnR4X3BlbmRpbmcudHhiKTsKKwkJaWVlZS0+dHhfcGVuZGluZy50eGIgPSBOVUxMOworCX0KKwlpZWVlLT5xdWV1ZV9zdG9wID0gMDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5sb2NrLGZsYWdzKTsKKworfQorCit2b2lkIGllZWU4MDIxMV93YWtlX3F1ZXVlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICAqaGVhZGVyOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPmxvY2ssZmxhZ3MpOworCWlmICghIGllZWUtPnF1ZXVlX3N0b3ApIGdvdG8gZXhpdDsKKworCWllZWUtPnF1ZXVlX3N0b3AgPSAwOworCisJaWYoaWVlZS0+c29mdG1hY19mZWF0dXJlcyAmIElFRUVfU09GVE1BQ19TSU5HTEVfUVVFVUUpeworCQl3aGlsZSAoIWllZWUtPnF1ZXVlX3N0b3AgJiYgKHNrYiA9IGRlcXVldWVfbWdtdChpZWVlKSkpeworCisJCQloZWFkZXIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgICopIHNrYi0+ZGF0YTsKKworCQkJaGVhZGVyLT5zZXFfY3RsID0gY3B1X3RvX2xlMTYoaWVlZS0+c2VxX2N0cmxbMF0gPDwgNCk7CisKKwkJCWlmIChpZWVlLT5zZXFfY3RybFswXSA9PSAweEZGRikKKwkJCQlpZWVlLT5zZXFfY3RybFswXSA9IDA7CisJCQllbHNlCisJCQkJaWVlZS0+c2VxX2N0cmxbMF0rKzsKKworCQkJLy9wcmludGsoS0VSTl9BTEVSVCAiaWVlZTgwMjExX3dha2VfcXVldWUgXG4iKTsKKwkJCWllZWUtPnNvZnRtYWNfZGF0YV9oYXJkX3N0YXJ0X3htaXQoc2tiLGllZWUtPmRldixpZWVlLT5iYXNpY19yYXRlKTsKKwkJCWRldl9rZnJlZV9za2JfYW55KHNrYik7Ly9lZGl0IGJ5IHRob21hcworCQl9CisJfQorCWlmICghaWVlZS0+cXVldWVfc3RvcCAmJiBpZWVlLT50eF9wZW5kaW5nLnR4YikKKwkJaWVlZTgwMjExX3Jlc3VtZV90eChpZWVlKTsKKworCWlmICghaWVlZS0+cXVldWVfc3RvcCAmJiBuZXRpZl9xdWV1ZV9zdG9wcGVkKGllZWUtPmRldikpeworCQlpZWVlLT5zb2Z0bWFjX3N0YXRzLnN3dHhhd2FrZSsrOworCQluZXRpZl93YWtlX3F1ZXVlKGllZWUtPmRldik7CisJfQorCitleGl0IDoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5sb2NrLGZsYWdzKTsKK30KKworCit2b2lkIGllZWU4MDIxMV9zdG9wX3F1ZXVlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCS8vdW5zaWduZWQgbG9uZyBmbGFnczsKKwkvL3NwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5sb2NrLGZsYWdzKTsKKworCWlmICghIG5ldGlmX3F1ZXVlX3N0b3BwZWQoaWVlZS0+ZGV2KSl7CisJCW5ldGlmX3N0b3BfcXVldWUoaWVlZS0+ZGV2KTsKKwkJaWVlZS0+c29mdG1hY19zdGF0cy5zd3R4c3RvcCsrOworCX0KKwlpZWVlLT5xdWV1ZV9zdG9wID0gMTsKKwkvL3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmxvY2ssZmxhZ3MpOworCit9CisKKworaW5saW5lIHZvaWQgaWVlZTgwMjExX3JhbmRvbWl6ZV9jZWxsKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCisJZ2V0X3JhbmRvbV9ieXRlcyhpZWVlLT5jdXJyZW50X25ldHdvcmsuYnNzaWQsIEVUSF9BTEVOKTsKKworCS8qIGFuIElCU1MgY2VsbCBhZGRyZXNzIG11c3QgaGF2ZSB0aGUgdHdvIGxlc3Mgc2lnbmlmaWNhbnQKKwkgKiBiaXRzIG9mIHRoZSBmaXJzdCBieXRlID0gMgorCSAqLworCWllZWUtPmN1cnJlbnRfbmV0d29yay5ic3NpZFswXSAmPSB+MHgwMTsKKwlpZWVlLT5jdXJyZW50X25ldHdvcmsuYnNzaWRbMF0gfD0gMHgwMjsKK30KKworLyogY2FsbGVkIGluIHVzZXIgY29udGV4dCBvbmx5ICovCit2b2lkIGllZWU4MDIxMV9zdGFydF9tYXN0ZXJfYnNzKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCWllZWUtPmFzc29jX2lkID0gMTsKKworCWlmIChpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZF9sZW4gPT0gMCl7CisJCXN0cm5jcHkoaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWQsCisJCQlJRUVFODAyMTFfREVGQVVMVF9UWF9FU1NJRCwKKwkJCUlXX0VTU0lEX01BWF9TSVpFKTsKKworCQlpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZF9sZW4gPSBzdHJsZW4oSUVFRTgwMjExX0RFRkFVTFRfVFhfRVNTSUQpOworCQlpZWVlLT5zc2lkX3NldCA9IDE7CisJfQorCisJbWVtY3B5KGllZWUtPmN1cnJlbnRfbmV0d29yay5ic3NpZCwgaWVlZS0+ZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOworCisJaWVlZS0+c2V0X2NoYW4oaWVlZS0+ZGV2LCBpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCk7CisJaWVlZS0+c3RhdGUgPSBJRUVFODAyMTFfTElOS0VEOworCWllZWUtPmxpbmtfY2hhbmdlKGllZWUtPmRldik7CisJbm90aWZ5X3d4X2Fzc29jX2V2ZW50KGllZWUpOworCisJaWYgKGllZWUtPmRhdGFfaGFyZF9yZXN1bWUpCisJCWllZWUtPmRhdGFfaGFyZF9yZXN1bWUoaWVlZS0+ZGV2KTsKKworCW5ldGlmX2NhcnJpZXJfb24oaWVlZS0+ZGV2KTsKK30KKwordm9pZCBpZWVlODAyMTFfc3RhcnRfbW9uaXRvcl9tb2RlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCWlmKGllZWUtPnJhd190eCl7CisKKwkJaWYgKGllZWUtPmRhdGFfaGFyZF9yZXN1bWUpCisJCQlpZWVlLT5kYXRhX2hhcmRfcmVzdW1lKGllZWUtPmRldik7CisKKwkJbmV0aWZfY2Fycmllcl9vbihpZWVlLT5kZXYpOworCX0KK30KKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwyMCkpCit2b2lkIGllZWU4MDIxMV9zdGFydF9pYnNzX3dxKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgZGVsYXllZF93b3JrICpkd29yayA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgZGVsYXllZF93b3JrLCB3b3JrKTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSA9IGNvbnRhaW5lcl9vZihkd29yaywgc3RydWN0IGllZWU4MDIxMV9kZXZpY2UsIHN0YXJ0X2lic3Nfd3EpOworI2Vsc2UKK3ZvaWQgaWVlZTgwMjExX3N0YXJ0X2lic3Nfd3Eoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisjZW5kaWYKKworCS8qIGl3Y29uZmlnIG1vZGUgYWQtaG9jIHdpbGwgc2NoZWR1bGUgdGhpcyBhbmQgcmV0dXJuCisJICogb24gdGhlIG90aGVyIGhhbmQgdGhpcyB3aWxsIGJsb2NrIGZ1cnRoZXIgaXdjb25maWcgU0VUCisJICogb3BlcmF0aW9ucyBiZWNhdXNlIG9mIHRoZSB3eF9zZW0gaG9sZC4KKwkgKiBBbnl3YXkgc29tZSBtb3N0IHNldCBvcGVyYXRpb25zIHNldCBhIGZsYWcgdG8gc3BlZWQtdXAKKwkgKiAoYWJvcnQpIHRoaXMgd3EgKHdoZW4gc3luY3JvIHNjYW5uaW5nKSBiZWZvcmUgc2xlZXBpbmcKKwkgKiBvbiB0aGUgc2VtYXBob3JlCisJICovCisKKwlkb3duKCZpZWVlLT53eF9zZW0pOworCisKKwlpZiAoaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWRfbGVuID09IDApeworCQlzdHJjcHkoaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWQsSUVFRTgwMjExX0RFRkFVTFRfVFhfRVNTSUQpOworCQlpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZF9sZW4gPSBzdHJsZW4oSUVFRTgwMjExX0RFRkFVTFRfVFhfRVNTSUQpOworCQlpZWVlLT5zc2lkX3NldCA9IDE7CisJfQorCisJLyogY2hlY2sgaWYgd2UgaGF2ZSB0aGlzIGNlbGwgaW4gb3VyIG5ldHdvcmsgbGlzdCAqLworCWllZWU4MDIxMV9zb2Z0bWFjX2NoZWNrX2FsbF9uZXRzKGllZWUpOworCisjaWZkZWYgRU5BQkxFX0RPVDExRAorCWlmKGllZWUtPnN0YXRlID09IElFRUU4MDIxMV9OT0xJTkspCisJCWllZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsID0gMTA7CisjZW5kaWYKKwkvKiBpZiBub3QgdGhlbiB0aGUgc3RhdGUgaXMgbm90IGxpbmtlZC4gTWF5YmUgdGhlIHVzZXIgc3dpdGhjZWQgdG8KKwkgKiBhZC1ob2MgbW9kZSBqdXN0IGFmdGVyIGJlaW5nIGluIG1vbml0b3IgbW9kZSwgb3IganVzdCBhZnRlcgorCSAqIGJlaW5nIHZlcnkgZmV3IHRpbWUgaW4gbWFuYWdlZCBtb2RlIChzbyB0aGUgY2FyZCBoYXZlIGhhZCBubworCSAqIHRpbWUgdG8gc2NhbiBhbGwgdGhlIGNoYW5zLi4pIG9yIHdlIGhhdmUganVzdCBydW4gdXAgdGhlIGlmYWNlCisJICogYWZ0ZXIgc2V0dGluZyBhZC1ob2MgbW9kZS4gU28gd2UgaGF2ZSB0byBnaXZlIGFub3RoZXIgdHJ5Li4KKwkgKiBIZXJlLCBpbiBpYnNzIG1vZGUsIHNob3VsZCBiZSBzYWZlIHRvIGRvIHRoaXMgd2l0aG91dCBleHRyYSBjYXJlCisJICogKGluIGJzcyBtb2RlIHdlIGhhZCB0byBtYWtlIHN1cmUgbm8tb25lIHRyeWVkIHRvIGFzc29jaWF0ZSB3aGVuCisJICogd2UgaGFkIGp1c3QgY2hlY2tlZCB0aGUgaWVlZS0+c3RhdGUgYW5kIHdlIHdhcyBnb2luZyB0byBzdGFydCB0aGUKKwkgKiBzY2FuKSBiZWFjYXVzZSBpbiBpYnNzIG1vZGUgdGhlIGllZWU4MDIxMV9uZXdfbmV0IGZ1bmN0aW9uLCB3aGVuCisJICogZmluZHMgYSBnb29kIG5ldCwganVzdCBzZXQgdGhlIGllZWUtPnN0YXRlIHRvIElFRUU4MDIxMV9MSU5LRUQsCisJICogc28sIGF0IHdvcnN0LCB3ZSB3YXN0ZSBhIGJpdCBvZiB0aW1lIHRvIGluaXRpYXRlIGFuIHVubmVlZGVkIHN5bmNybworCSAqIHNjYW4sIHRoYXQgd2lsbCBzdG9wIGF0IHRoZSBmaXJzdCByb3VuZCBiZWNhdXNlIGl0IHNlZXMgdGhlIHN0YXRlCisJICogYXNzb2NpYXRlZC4KKwkgKi8KKwlpZiAoaWVlZS0+c3RhdGUgPT0gSUVFRTgwMjExX05PTElOSykKKwkJaWVlZTgwMjExX3N0YXJ0X3NjYW5fc3luY3JvKGllZWUpOworCisJLyogdGhlIG5ldHdvcmsgZGVmaW5pdGl2ZWx5IGlzIG5vdCBoZXJlLi4gY3JlYXRlIGEgbmV3IGNlbGwgKi8KKwlpZiAoaWVlZS0+c3RhdGUgPT0gSUVFRTgwMjExX05PTElOSyl7CisJCXByaW50aygiY3JlYXRpbmcgbmV3IElCU1MgY2VsbFxuIik7CisJCWlmKCFpZWVlLT53YXBfc2V0KQorCQkJaWVlZTgwMjExX3JhbmRvbWl6ZV9jZWxsKGllZWUpOworCisJCWlmKGllZWUtPm1vZHVsYXRpb24gJiBJRUVFODAyMTFfQ0NLX01PRFVMQVRJT04peworCisJCQlpZWVlLT5jdXJyZW50X25ldHdvcmsucmF0ZXNfbGVuID0gNDsKKworCQkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLnJhdGVzWzBdID0gSUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSyB8IElFRUU4MDIxMV9DQ0tfUkFURV8xTUI7CisJCQlpZWVlLT5jdXJyZW50X25ldHdvcmsucmF0ZXNbMV0gPSBJRUVFODAyMTFfQkFTSUNfUkFURV9NQVNLIHwgSUVFRTgwMjExX0NDS19SQVRFXzJNQjsKKwkJCWllZWUtPmN1cnJlbnRfbmV0d29yay5yYXRlc1syXSA9IElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0sgfCBJRUVFODAyMTFfQ0NLX1JBVEVfNU1COworCQkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLnJhdGVzWzNdID0gSUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSyB8IElFRUU4MDIxMV9DQ0tfUkFURV8xMU1COworCisJCX1lbHNlCisJCQlpZWVlLT5jdXJyZW50X25ldHdvcmsucmF0ZXNfbGVuID0gMDsKKworCQlpZihpZWVlLT5tb2R1bGF0aW9uICYgSUVFRTgwMjExX09GRE1fTU9EVUxBVElPTil7CisJCQlpZWVlLT5jdXJyZW50X25ldHdvcmsucmF0ZXNfZXhfbGVuID0gODsKKworCQkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLnJhdGVzX2V4WzBdID0gSUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSyB8IElFRUU4MDIxMV9PRkRNX1JBVEVfNk1COworCQkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLnJhdGVzX2V4WzFdID0gSUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSyB8IElFRUU4MDIxMV9PRkRNX1JBVEVfOU1COworCQkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLnJhdGVzX2V4WzJdID0gSUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSyB8IElFRUU4MDIxMV9PRkRNX1JBVEVfMTJNQjsKKwkJCWllZWUtPmN1cnJlbnRfbmV0d29yay5yYXRlc19leFszXSA9IElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0sgfCBJRUVFODAyMTFfT0ZETV9SQVRFXzE4TUI7CisJCQlpZWVlLT5jdXJyZW50X25ldHdvcmsucmF0ZXNfZXhbNF0gPSBJRUVFODAyMTFfQkFTSUNfUkFURV9NQVNLIHwgSUVFRTgwMjExX09GRE1fUkFURV8yNE1COworCQkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLnJhdGVzX2V4WzVdID0gSUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSyB8IElFRUU4MDIxMV9PRkRNX1JBVEVfMzZNQjsKKwkJCWllZWUtPmN1cnJlbnRfbmV0d29yay5yYXRlc19leFs2XSA9IElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0sgfCBJRUVFODAyMTFfT0ZETV9SQVRFXzQ4TUI7CisJCQlpZWVlLT5jdXJyZW50X25ldHdvcmsucmF0ZXNfZXhbN10gPSBJRUVFODAyMTFfQkFTSUNfUkFURV9NQVNLIHwgSUVFRTgwMjExX09GRE1fUkFURV81NE1COworCisJCQlpZWVlLT5yYXRlID0gNTQwOworCQl9ZWxzZXsKKwkJCWllZWUtPmN1cnJlbnRfbmV0d29yay5yYXRlc19leF9sZW4gPSAwOworCQkJaWVlZS0+cmF0ZSA9IDExMDsKKwkJfQorCisJCS8vIEJ5IGRlZmF1bHQsIFdNTSBmdW5jdGlvbiB3aWxsIGJlIGRpc2FibGVkIGluIElCU1MgbW9kZQorCQlpZWVlLT5jdXJyZW50X25ldHdvcmsuUW9TX0VuYWJsZSA9IDA7CisKKwkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLmF0aW1fd2luZG93ID0gMDsKKwkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNhcGFiaWxpdHkgPSBXTEFOX0NBUEFCSUxJVFlfSUJTUzsKKwkJaWYoaWVlZS0+c2hvcnRfc2xvdCkKKwkJCWllZWUtPmN1cnJlbnRfbmV0d29yay5jYXBhYmlsaXR5IHw9IFdMQU5fQ0FQQUJJTElUWV9TSE9SVF9TTE9UOworCisJfQorCisJaWVlZS0+c3RhdGUgPSBJRUVFODAyMTFfTElOS0VEOworCWllZWUtPnNldF9jaGFuKGllZWUtPmRldiwgaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWwpOworCWllZWUtPmxpbmtfY2hhbmdlKGllZWUtPmRldik7CisKKwlub3RpZnlfd3hfYXNzb2NfZXZlbnQoaWVlZSk7CisKKwlpZWVlODAyMTFfc3RhcnRfc2VuZF9iZWFjb25zKGllZWUpOworCXByaW50ayhLRVJOX1dBUk5JTkcgImFmdGVyIHNlbmRpbmcgYmVhY29uIHBhY2tldCFcbiIpOworCisJaWYgKGllZWUtPmRhdGFfaGFyZF9yZXN1bWUpCisJCWllZWUtPmRhdGFfaGFyZF9yZXN1bWUoaWVlZS0+ZGV2KTsKKworCW5ldGlmX2NhcnJpZXJfb24oaWVlZS0+ZGV2KTsKKworCXVwKCZpZWVlLT53eF9zZW0pOworfQoraW5saW5lIHZvaWQgaWVlZTgwMjExX3N0YXJ0X2lic3Moc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisJcXVldWVfZGVsYXllZF93b3JrKGllZWUtPndxLCAmaWVlZS0+c3RhcnRfaWJzc193cSwgMTAwKTsKK30KKworLyogdGhpcyBpcyBjYWxsZWQgb25seSBpbiB1c2VyIGNvbnRleHQsIHdpdGggd3hfc2VtIGhlbGQgKi8KK3ZvaWQgaWVlZTgwMjExX3N0YXJ0X2JzcyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworI2lmZGVmIEVOQUJMRV9ET1QxMUQKKwkvLworCS8vIFJlZjogODAyLjExZCAxMS4xLjMuMworCS8vIFNUQSBzaGFsbCBub3Qgc3RhcnQgYSBCU1MgdW5sZXNzIHByb3Blcmx5IGZvcm1lZCBCZWFjb24gZnJhbWUgaW5jbHVkaW5nIGEgQ291bnRyeSBJRS4KKwkvLworCWlmKElTX0RPVDExRF9FTkFCTEUoaWVlZSkgJiYgIUlTX0NPVU5UUllfSUVfVkFMSUQoaWVlZSkpCisJeworCQlpZighIGllZWUtPmJHbG9iYWxEb21haW4pCisJCXsKKwkJCXJldHVybjsKKwkJfQorCX0KKyNlbmRpZgorCS8qIGNoZWNrIGlmIHdlIGhhdmUgYWxyZWFkeSBmb3VuZCB0aGUgbmV0IHdlCisJICogYXJlIGludGVyZXN0ZWQgaW4gKGlmIGFueSkuCisJICogaWYgbm90ICh3ZSBhcmUgZGlzYXNzb2NpYXRlZCBhbmQgd2UgYXJlIG5vdAorCSAqIGluIGFzc29jaWF0aW5nIC8gYXV0aGVudGljYXRpbmcgcGhhc2UpIHN0YXJ0IHRoZSBiYWNrZ3JvdW5kIHNjYW5uaW5nLgorCSAqLworCWllZWU4MDIxMV9zb2Z0bWFjX2NoZWNrX2FsbF9uZXRzKGllZWUpOworCisJLyogZW5zdXJlIG5vLW9uZSBzdGFydCBhbiBhc3NvY2lhdGluZyBwcm9jZXNzICh0aHVzIHNldHRpbmcKKwkgKiB0aGUgaWVlZS0+c3RhdGUgdG8gaWVlZTgwMjExX0FTU09DSUFUSU5HKSB3aGlsZSB3ZQorCSAqIGhhdmUganVzdCBjaGVrZWQgaXQgYW5kIHdlIGFyZSBnb2luZyB0byBlbmFibGUgc2Nhbi4KKwkgKiBUaGUgaWVlZTgwMjExX25ld19uZXQgZnVuY3Rpb24gaXMgYWx3YXlzIGNhbGxlZCB3aXRoCisJICogbG9jayBoZWxkIChmcm9tIGJvdGggaWVlZTgwMjExX3NvZnRtYWNfY2hlY2tfYWxsX25ldHMgYW5kCisJICogdGhlIHJ4IHBhdGgpLCBzbyB3ZSBjYW5ub3QgYmUgaW4gdGhlIG1pZGRsZSBvZiBzdWNoIGZ1bmN0aW9uCisJICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKKworLy8jaWZkZWYgRU5BQkxFX0lQUworLy8JcHJpbnRrKCJzdGFydCBic3MgRU5BQkxFX0lQU1xuIik7CisvLyNlbHNlCisJaWYgKGllZWUtPnN0YXRlID09IElFRUU4MDIxMV9OT0xJTkspeworCQlpZWVlLT5hY3RzY2FubmluZyA9IHRydWU7CisJCWllZWU4MDIxMV9zdGFydF9zY2FuKGllZWUpOworCX0KKy8vI2VuZGlmCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+bG9jaywgZmxhZ3MpOworfQorCisvKiBjYWxsZWQgb25seSBpbiB1c2Vyc3BhY2UgY29udGV4dCAqLwordm9pZCBpZWVlODAyMTFfZGlzYXNzb2NpYXRlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCW5ldGlmX2NhcnJpZXJfb2ZmKGllZWUtPmRldik7CisKKwlpZiAoaWVlZS0+c29mdG1hY19mZWF0dXJlcyAmIElFRUVfU09GVE1BQ19UWF9RVUVVRSkKKwkJCWllZWU4MDIxMV9yZXNldF9xdWV1ZShpZWVlKTsKKworCWlmIChpZWVlLT5kYXRhX2hhcmRfc3RvcCkKKwkJCWllZWUtPmRhdGFfaGFyZF9zdG9wKGllZWUtPmRldik7CisKKyNpZmRlZiBFTkFCTEVfRE9UMTFECisJaWYoSVNfRE9UMTFEX0VOQUJMRShpZWVlKSkKKwkJRG90MTFkX1Jlc2V0KGllZWUpOworI2VuZGlmCisJaWVlZS0+c3RhdGUgPSBJRUVFODAyMTFfTk9MSU5LOworCWllZWUtPmxpbmtfY2hhbmdlKGllZWUtPmRldik7CisJbm90aWZ5X3d4X2Fzc29jX2V2ZW50KGllZWUpOworCit9CisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMjApKQordm9pZCBpZWVlODAyMTFfYXNzb2NpYXRlX3JldHJ5X3dxKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgZGVsYXllZF93b3JrICpkd29yayA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgZGVsYXllZF93b3JrLCB3b3JrKTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSA9IGNvbnRhaW5lcl9vZihkd29yaywgc3RydWN0IGllZWU4MDIxMV9kZXZpY2UsIGFzc29jaWF0ZV9yZXRyeV93cSk7CisjZWxzZQordm9pZCBpZWVlODAyMTFfYXNzb2NpYXRlX3JldHJ5X3dxKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworI2VuZGlmCisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlkb3duKCZpZWVlLT53eF9zZW0pOworCWlmKCFpZWVlLT5wcm90b19zdGFydGVkKQorCQlnb3RvIGV4aXQ7CisJaWYoaWVlZS0+c3RhdGUgIT0gSUVFRTgwMjExX0FTU09DSUFUSU5HX1JFVFJZKQorCQlnb3RvIGV4aXQ7CisJLyogdW50aWwgd2UgZG8gbm90IHNldCB0aGUgc3RhdGUgdG8gSUVFRTgwMjExX05PTElOSworCSogdGhlcmUgYXJlIG5vIHBvc3NpYmlsaXR5IHRvIGhhdmUgc29tZW9uZSBlbHNlIHRyeWluZworCSogdG8gc3RhcnQgYW4gYXNzb2NpYXRpb24gcHJvY2R1cmUgKHdlIGdldCBoZXJlIHdpdGgKKwkqIGllZWUtPnN0YXRlID0gSUVFRTgwMjExX0FTU09DSUFUSU5HKS4KKwkqIFdoZW4gd2Ugc2V0IHRoZSBzdGF0ZSB0byBJRUVFODAyMTFfTk9MSU5LIGl0IGlzIHBvc3NpYmxlCisJKiB0aGF0IHRoZSBSWCBwYXRoIHJ1biBhbiBhdHRlbXB0IHRvIGFzc29jaWF0ZSwgYnV0CisJKiBib3RoIGllZWU4MDIxMV9zb2Z0bWFjX2NoZWNrX2FsbF9uZXRzIGFuZCB0aGUKKwkqIFJYIHBhdGggd29ya3Mgd2l0aCBpZWVlLT5sb2NrIGhlbGQgc28gdGhlcmUgYXJlIG5vCisJKiBwcm9ibGVtcy4gSWYgd2UgYXJlIHN0aWxsIGRpc2Fzc29jaWF0ZWQgdGhlbiBzdGFydCBhIHNjYW4uCisJKiB0aGUgbG9jayBoZXJlIGlzIG5lY2Vzc2FyeSB0byBlbnN1cmUgbm8gb25lIHRyeSB0byBzdGFydAorCSogYW4gYXNzb2NpYXRpb24gcHJvY2VkdXJlIHdoZW4gd2UgaGF2ZSBqdXN0IGNoZWNrZWQgdGhlCisJKiBzdGF0ZSBhbmQgd2UgYXJlIGdvaW5nIHRvIHN0YXJ0IHRoZSBzY2FuLgorCSovCisJaWVlZS0+c3RhdGUgPSBJRUVFODAyMTFfTk9MSU5LOworCWllZWUtPmJlaW5yZXRyeSA9IHRydWU7CisJaWVlZTgwMjExX3NvZnRtYWNfY2hlY2tfYWxsX25ldHMoaWVlZSk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWVlZS0+bG9jaywgZmxhZ3MpOworCisJaWYoaWVlZS0+c3RhdGUgPT0gSUVFRTgwMjExX05PTElOSyl7CisJCWllZWUtPmJlaW5yZXRyeSA9IGZhbHNlOworCQlpZWVlLT5hY3RzY2FubmluZyA9IHRydWU7CisJCWllZWU4MDIxMV9zdGFydF9zY2FuKGllZWUpOworCX0KKwkvL1lKLGFkZCwwODA4MjgsIG5vdGlmeSBvcyBoZXJlCisJaWYoaWVlZS0+c3RhdGUgPT0gSUVFRTgwMjExX05PTElOSykKKwl7CisJCW5vdGlmeV93eF9hc3NvY19ldmVudChpZWVlKTsKKwl9CisJLy9ZSixhZGQsMDgwODI4LGVuZAorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKKworZXhpdDoKKwl1cCgmaWVlZS0+d3hfc2VtKTsKK30KKworc3RydWN0IHNrX2J1ZmYgKmllZWU4MDIxMV9nZXRfYmVhY29uXyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKwl1OCBicm9hZGNhc3RfYWRkcltdID0gezB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmfTsKKworCXN0cnVjdCBza19idWZmICpza2IgPSBOVUxMOworCXN0cnVjdCBpZWVlODAyMTFfcHJvYmVfcmVzcG9uc2UgKmI7CisKKy8vcnoKKyNpZmRlZiBfUlRMODE4N19FWFRfUEFUQ0hfCisJaWYoKGllZWUtPml3X21vZGUgPT0gaWVlZS0+aXdfZXh0X21vZGUpICYmIGllZWUtPmV4dF9wYXRjaF9nZXRfYmVhY29uX2dldF9wcm9iZXJzcCApCisJCXNrYiA9IGllZWUtPmV4dF9wYXRjaF9nZXRfYmVhY29uX2dldF9wcm9iZXJzcChpZWVlLCBicm9hZGNhc3RfYWRkciwgJihpZWVlLT5jdXJyZW50X25ldHdvcmspKTsKKwllbHNlCisJCXNrYiA9IGllZWU4MDIxMV9wcm9iZV9yZXNwKGllZWUsIGJyb2FkY2FzdF9hZGRyKTsKKyNlbHNlCisJc2tiID0gaWVlZTgwMjExX3Byb2JlX3Jlc3AoaWVlZSwgYnJvYWRjYXN0X2FkZHIpOworI2VuZGlmCisvLworCWlmICghc2tiKQorCQlyZXR1cm4gTlVMTDsKKworCWIgPSAoc3RydWN0IGllZWU4MDIxMV9wcm9iZV9yZXNwb25zZSAqKSBza2ItPmRhdGE7CisJYi0+aGVhZGVyLmZyYW1lX2N0bCA9IGNwdV90b19sZTE2KElFRUU4MDIxMV9TVFlQRV9CRUFDT04pOworCisJcmV0dXJuIHNrYjsKKworfQorCitzdHJ1Y3Qgc2tfYnVmZiAqaWVlZTgwMjExX2dldF9iZWFjb24oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3QgaWVlZTgwMjExX3Byb2JlX3Jlc3BvbnNlICpiOworCisJc2tiID0gaWVlZTgwMjExX2dldF9iZWFjb25fKGllZWUpOworCWlmKCFza2IpCisJCXJldHVybiBOVUxMOworCisJYiA9IChzdHJ1Y3QgaWVlZTgwMjExX3Byb2JlX3Jlc3BvbnNlICopIHNrYi0+ZGF0YTsKKwliLT5oZWFkZXIuc2VxX2N0cmwgPSBjcHVfdG9fbGUxNihpZWVlLT5zZXFfY3RybFswXSA8PCA0KTsKKworCWlmIChpZWVlLT5zZXFfY3RybFswXSA9PSAweEZGRikKKwkJaWVlZS0+c2VxX2N0cmxbMF0gPSAwOworCWVsc2UKKwkJaWVlZS0+c2VxX2N0cmxbMF0rKzsKKworCXJldHVybiBza2I7Cit9CisKK3ZvaWQgaWVlZTgwMjExX3NvZnRtYWNfc3RvcF9wcm90b2NvbChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKwlpZWVlLT5zeW5jX3NjYW5faHVycnl1cCA9IDE7CisJZG93bigmaWVlZS0+d3hfc2VtKTsKKwlpZWVlODAyMTFfc3RvcF9wcm90b2NvbChpZWVlKTsKKwl1cCgmaWVlZS0+d3hfc2VtKTsKK30KKworCit2b2lkIGllZWU4MDIxMV9zdG9wX3Byb3RvY29sKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCWlmICghaWVlZS0+cHJvdG9fc3RhcnRlZCkKKwkJcmV0dXJuOworCisJaWVlZS0+cHJvdG9fc3RhcnRlZCA9IDA7CisKKyNpZmRlZiBfUlRMODE4N19FWFRfUEFUQ0hfCisJaWYoaWVlZS0+ZXh0X3BhdGNoX2llZWU4MDIxMV9zdG9wX3Byb3RvY29sKQorCQlpZWVlLT5leHRfcGF0Y2hfaWVlZTgwMjExX3N0b3BfcHJvdG9jb2woaWVlZSk7CisvL2lmIGNhbGwgcXVldWVfZGVsYXllZF93b3JrLGNhbiBjYWxsIHRoaXMsb3IgZG8gbm90aGluZy4uCisvL2VkaXQgYnkgbGF3cmVuY2UsMjAwNzExMTgKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDUsMCkKKy8vCWNhbmNlbF9kZWxheWVkX3dvcmsoJmllZWUtPmV4dF9zdG9wX3NjYW5fd3EpOworLy8JY2FuY2VsX2RlbGF5ZWRfd29yaygmaWVlZS0+ZXh0X3NlbmRfYmVhY29uX3dxKTsKKyNlbmRpZgorI2VuZGlmIC8vIF9SVEw4MTg3X0VYVF9QQVRDSF8KKworCWllZWU4MDIxMV9zdG9wX3NlbmRfYmVhY29ucyhpZWVlKTsKKwlpZigoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX0lORlJBKSYmKGllZWUtPnN0YXRlID09IElFRUU4MDIxMV9MSU5LRUQpKSB7CisJCVNlbmREaXNhc3NvY2lhdGlvbihpZWVlLE5VTEwsV0xBTl9SRUFTT05fRElTQVNTT0NfU1RBX0hBU19MRUZUKTsKKwl9CisJZGVsX3RpbWVyX3N5bmMoJmllZWUtPmFzc29jaWF0ZV90aW1lcik7CisJY2FuY2VsX2RlbGF5ZWRfd29yaygmaWVlZS0+YXNzb2NpYXRlX3JldHJ5X3dxKTsKKwljYW5jZWxfZGVsYXllZF93b3JrKCZpZWVlLT5zdGFydF9pYnNzX3dxKTsKKwlpZWVlODAyMTFfc3RvcF9zY2FuKGllZWUpOworCisJaWVlZTgwMjExX2Rpc2Fzc29jaWF0ZShpZWVlKTsKK30KKwordm9pZCBpZWVlODAyMTFfc29mdG1hY19zdGFydF9wcm90b2NvbChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKwlpZWVlLT5zeW5jX3NjYW5faHVycnl1cCA9IDA7CisJZG93bigmaWVlZS0+d3hfc2VtKTsKKwlpZWVlODAyMTFfc3RhcnRfcHJvdG9jb2woaWVlZSk7CisJdXAoJmllZWUtPnd4X3NlbSk7Cit9CisKK3ZvaWQgaWVlZTgwMjExX3N0YXJ0X3Byb3RvY29sKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCXNob3J0IGNoID0gMDsKKyAJaW50IGkgPSAwOworCisJaWYgKGllZWUtPnByb3RvX3N0YXJ0ZWQpCisJCXJldHVybjsKKworCWllZWUtPnByb3RvX3N0YXJ0ZWQgPSAxOworCisJaWYgKGllZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsID09IDApeworCQlkb3sKKwkJCWNoKys7CisJCQlpZiAoY2ggPiBNQVhfQ0hBTk5FTF9OVU1CRVIpCisJCQkJcmV0dXJuOyAvKiBubyBjaGFubmVsIGZvdW5kICovCisKKyNpZmRlZiBFTkFCTEVfRE9UMTFECisJCX13aGlsZSghR0VUX0RPVDExRF9JTkZPKGllZWUpLT5jaGFubmVsX21hcFtjaF0pOworI2Vsc2UKKwkJfXdoaWxlKCFpZWVlLT5jaGFubmVsX21hcFtjaF0pOworI2VuZGlmCisKKwkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWwgPSBjaDsKKwl9CisKKwlpZiAoaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJlYWNvbl9pbnRlcnZhbCA9PSAwKQorCQlpZWVlLT5jdXJyZW50X25ldHdvcmsuYmVhY29uX2ludGVydmFsID0gMTAwOworCWllZWUtPnNldF9jaGFuKGllZWUtPmRldixpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCk7CisKKyAgICAgICAJZm9yKGkgPSAwOyBpIDwgMTc7IGkrKykgeworCSAgaWVlZS0+bGFzdF9yeHNlcV9udW1baV0gPSAtMTsKKwkgIGllZWUtPmxhc3RfcnhmcmFnX251bVtpXSA9IC0xOworCSAgaWVlZS0+bGFzdF9wYWNrZXRfdGltZVtpXSA9IDA7CisJfQorCisJaWVlZS0+aW5pdF93bW1wYXJhbV9mbGFnID0gMDsvL3JlaW5pdGlhbGl6ZSBBQ194eF9QQVJBTSByZWdpc3RlcnMuCisKKworCS8qIGlmIHRoZSB1c2VyIHNldCB0aGUgTUFDIG9mIHRoZSBhZC1ob2MgY2VsbCBhbmQgdGhlbgorCSAqIHN3aXRjaCB0byBtYW5hZ2VkIG1vZGUsIHNoYWxsIHdlICBtYWtlIHN1cmUgdGhhdCBhc3NvY2lhdGlvbgorCSAqIGF0dGVtcHRzIGRvZXMgbm90IGZhaWwganVzdCBiZWNhdXNlIHRoZSB1c2VyIHByb3ZpZGUgdGhlIGVzc2lkCisJICogYW5kIHRoZSBuaWMgaXMgc3RpbGwgY2hlY2tpbmcgZm9yIHRoZSBBUCBNQUMgPz8KKwkgKi8KKwlzd2l0Y2ggKGllZWUtPml3X21vZGUpIHsKKwkJY2FzZSBJV19NT0RFX0FVVE86CisJCQlpZWVlLT5pd19tb2RlID0gSVdfTU9ERV9JTkZSQTsKKwkJCS8vbm90IHNldCBicmVhayBoZXJlIGludGVudGlvbmx5CisJCWNhc2UgSVdfTU9ERV9JTkZSQToKKwkJCWllZWU4MDIxMV9zdGFydF9ic3MoaWVlZSk7CisJCQlicmVhazsKKworCQljYXNlIElXX01PREVfQURIT0M6CisJCQlpZWVlODAyMTFfc3RhcnRfaWJzcyhpZWVlKTsKKwkJCWJyZWFrOworCisJCWNhc2UgSVdfTU9ERV9NQVNURVI6CisJCQlpZWVlODAyMTFfc3RhcnRfbWFzdGVyX2JzcyhpZWVlKTsKKwkJYnJlYWs7CisKKwkJY2FzZSBJV19NT0RFX01PTklUT1I6CisJCQlpZWVlODAyMTFfc3RhcnRfbW9uaXRvcl9tb2RlKGllZWUpOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKyNpZmRlZiBfUlRMODE4N19FWFRfUEFUQ0hfCisJCQlpZigoaWVlZS0+aXdfbW9kZSA9PSBpZWVlLT5pd19leHRfbW9kZSkgJiZcCisJCQkgICAgaWVlZS0+ZXh0X3BhdGNoX2llZWU4MDIxMV9zdGFydF9wcm90b2NvbCAmJlwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZWVlLT5leHRfcGF0Y2hfaWVlZTgwMjExX3N0YXJ0X3Byb3RvY29sKGllZWUpKSB7CisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw1LDApCisJCQkJcXVldWVfd29yayhpZWVlLT53cSwgJmllZWUtPmV4dF9zdG9wX3NjYW5fd3EpOworI2VuZGlmCisJCQkJLy8gQnkgZGVmYXVsdCwgV01NIGZ1bmN0aW9uIHdpbGwgYmUgZGlzYWJsZWQgaW4KKwkJCQkvLyBFWFRFTlNJT04gbW9kZQorCQkJCWllZWUtPmN1cnJlbnRfbmV0d29yay5Rb1NfRW5hYmxlID0gMDsKKworCQkJCWlmKGllZWUtPm1vZHVsYXRpb24gJiBJRUVFODAyMTFfQ0NLX01PRFVMQVRJT04peworCQkJCQlpZWVlLT5jdXJyZW50X25ldHdvcmsucmF0ZXNfbGVuID0gNDsKKwkJCQkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLnJhdGVzWzBdID0gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0sgfCBcCisJCQkJCSAgICAgIElFRUU4MDIxMV9DQ0tfUkFURV8xTUI7CisJCQkJCWllZWUtPmN1cnJlbnRfbmV0d29yay5yYXRlc1sxXSA9IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRUVFODAyMTFfQkFTSUNfUkFURV9NQVNLIHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUVFRTgwMjExX0NDS19SQVRFXzJNQjsKKwkJCQkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLnJhdGVzWzJdID0gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0sgfFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRUVFODAyMTFfQ0NLX1JBVEVfNU1COworCQkJCQlpZWVlLT5jdXJyZW50X25ldHdvcmsucmF0ZXNbM10gPSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSyB8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElFRUU4MDIxMV9DQ0tfUkFURV8xMU1COworCQkJCX1lbHNlCisJCQkJCWllZWUtPmN1cnJlbnRfbmV0d29yay5yYXRlc19sZW4gPSAwOworCisJCQkJaWYoaWVlZS0+bW9kdWxhdGlvbiAmIElFRUU4MDIxMV9PRkRNX01PRFVMQVRJT04peworCQkJCQlpZWVlLT5jdXJyZW50X25ldHdvcmsucmF0ZXNfZXhfbGVuID0gODsKKwkJCQkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLnJhdGVzX2V4WzBdID0gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0sgfFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRUVFODAyMTFfT0ZETV9SQVRFXzZNQjsKKwkJCQkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLnJhdGVzX2V4WzFdID0gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0sgfFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRUVFODAyMTFfT0ZETV9SQVRFXzlNQjsKKwkJCQkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLnJhdGVzX2V4WzJdID0gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0sgfFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRUVFODAyMTFfT0ZETV9SQVRFXzEyTUI7CisJCQkJCWllZWUtPmN1cnJlbnRfbmV0d29yay5yYXRlc19leFszXSA9IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRUVFODAyMTFfQkFTSUNfUkFURV9NQVNLIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElFRUU4MDIxMV9PRkRNX1JBVEVfMThNQjsKKwkJCQkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLnJhdGVzX2V4WzRdID1cCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSyB8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElFRUU4MDIxMV9PRkRNX1JBVEVfMjRNQjsKKwkJCQkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLnJhdGVzX2V4WzVdID1cCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSyB8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElFRUU4MDIxMV9PRkRNX1JBVEVfMzZNQjsKKwkJCQkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLnJhdGVzX2V4WzZdID0gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0sgfFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRUVFODAyMTFfT0ZETV9SQVRFXzQ4TUI7CisJCQkJCWllZWUtPmN1cnJlbnRfbmV0d29yay5yYXRlc19leFs3XSA9XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0sgfFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRUVFODAyMTFfT0ZETV9SQVRFXzU0TUI7CisJCQkJCWllZWUtPnJhdGUgPSA1NDA7CisJCQkJfWVsc2V7CisJCQkJCWllZWUtPmN1cnJlbnRfbmV0d29yay5yYXRlc19leF9sZW4gPSAwOworCQkJCQlpZWVlLT5yYXRlID0gMTEwOworCQkJCX0KKworCQkJCS8qCisJCQkJICAgc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKKwkJCQkgICBpZiAoaWVlZS0+c3RhdGUgPT0gSUVFRTgwMjExX05PTElOSykKKwkJCQkgICBpZWVlODAyMTFfc3RhcnRfc2NhbihpZWVlKTsKKwkJCQkvLyBpZWVlLT5zZXRfY2hhbihpZWVlLT5kZXYsIDgpOworCisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+bG9jaywgZmxhZ3MpOworCQkJCSovCisJCQkJbWVtY3B5KGllZWUtPmN1cnJlbnRfbmV0d29yay5ic3NpZCwgaWVlZS0+ZGV2LT5kZXZfYWRkcixcCisJCQkJICAgICAgCSBFVEhfQUxFTik7CisJCQkJaWVlZS0+bGlua19jaGFuZ2UoaWVlZS0+ZGV2KTsKKwkJCQlub3RpZnlfd3hfYXNzb2NfZXZlbnQoaWVlZSk7CisKKwkJCQlpZiAoaWVlZS0+ZGF0YV9oYXJkX3Jlc3VtZSkKKwkJCQkJaWVlZS0+ZGF0YV9oYXJkX3Jlc3VtZShpZWVlLT5kZXYpOworCisJCQkJbmV0aWZfY2Fycmllcl9vbihpZWVlLT5kZXYpOworCQkJfSBlbHNlIHsKKwkJCQlpZWVlLT5pd19tb2RlID0gSVdfTU9ERV9JTkZSQTsKKwkJCQlpZWVlODAyMTFfc3RhcnRfYnNzKGllZWUpOworCQkJfQorI2Vsc2UKKwkJCWllZWUtPml3X21vZGUgPSBJV19NT0RFX0lORlJBOworCQkJaWVlZTgwMjExX3N0YXJ0X2JzcyhpZWVlKTsKKworI2VuZGlmCisJCQlicmVhazsKKwl9Cit9CisKKworI2RlZmluZSBEUlZfTkFNRSAgIkllZWU4MDIxMSIKK3ZvaWQgaWVlZTgwMjExX3NvZnRtYWNfaW5pdChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKwlpbnQgaTsKKwltZW1zZXQoJmllZWUtPmN1cnJlbnRfbmV0d29yaywgMCwgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfbmV0d29yaykpOworCisJaWVlZS0+c3RhdGUgPSBJRUVFODAyMTFfTk9MSU5LOworCWllZWUtPnN5bmNfc2Nhbl9odXJyeXVwID0gMDsKKwlmb3IoaSA9IDA7IGkgPCA1OyBpKyspIHsKKwkgIGllZWUtPnNlcV9jdHJsW2ldID0gMDsKKwl9CisKKwlpZWVlLT5hc3NvY19pZCA9IDA7CisJaWVlZS0+cXVldWVfc3RvcCA9IDA7CisJaWVlZS0+c2Nhbm5pbmcgPSAwOworCWllZWUtPnNvZnRtYWNfZmVhdHVyZXMgPSAwOyAvL3NvIElFRUUyMTAwLWxpa2UgZHJpdmVyIGFyZSBoYXBweQorCWllZWUtPndhcF9zZXQgPSAwOworCWllZWUtPnNzaWRfc2V0ID0gMDsKKwlpZWVlLT5wcm90b19zdGFydGVkID0gMDsKKwlpZWVlLT5iYXNpY19yYXRlID0gSUVFRTgwMjExX0RFRkFVTFRfQkFTSUNfUkFURTsKKwlpZWVlLT5yYXRlID0gMzsKKy8vI2lmZGVmIEVOQUJMRV9MUFMKKwlpZWVlLT5wcyA9IElFRUU4MDIxMV9QU19NQkNBU1R8SUVFRTgwMjExX1BTX1VOSUNBU1Q7CisvLyNlbHNlCisvLwlpZWVlLT5wcyA9IElFRUU4MDIxMV9QU19ESVNBQkxFRDsKKy8vI2VuZGlmCisJaWVlZS0+c3RhX3NsZWVwID0gMDsKKy8vYnkgYW15CisJaWVlZS0+YkluYWN0aXZlUHMgPSBmYWxzZTsKKwlpZWVlLT5hY3RzY2FubmluZyA9IGZhbHNlOworCWllZWUtPkxpc3RlbkludGVydmFsID0gMjsKKwlpZWVlLT5OdW1SeERhdGFJblBlcmlvZCA9IDA7IC8vWUosYWRkLDA4MDgyOAorCWllZWUtPk51bVJ4QmNuSW5QZXJpb2QgPSAwOyAvL1lKLGFkZCwwODA4MjgKKwlpZWVlLT5OdW1SeE9rVG90YWwgPSAwOy8vK2J5IGFteSAwODAzMTIKKwlpZWVlLT5OdW1SeFVuaWNhc3QgPSAwOy8vWUosYWRkLDA4MDgyOCxmb3Iga2VlcCBhbGl2ZQorCWllZWUtPmJlaW5yZXRyeSA9IGZhbHNlOworCWllZWUtPmJId1JhZGlvT2ZmID0gZmFsc2U7CisvL2J5IGFteQorI2lmZGVmIF9SVEw4MTg3X0VYVF9QQVRDSF8KKwlpZWVlLT5pd19leHRfbW9kZSA9IDk5OTsKKyNlbmRpZgorCisJaW5pdF9tZ210X3F1ZXVlKGllZWUpOworI2lmIDAKKwlpbml0X3RpbWVyKCZpZWVlLT5zY2FuX3RpbWVyKTsKKwlpZWVlLT5zY2FuX3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZylpZWVlOworCWllZWUtPnNjYW5fdGltZXIuZnVuY3Rpb24gPSBpZWVlODAyMTFfc29mdG1hY19zY2FuX2NiOworI2VuZGlmCisJaWVlZS0+dHhfcGVuZGluZy50eGIgPSBOVUxMOworCisJaW5pdF90aW1lcigmaWVlZS0+YXNzb2NpYXRlX3RpbWVyKTsKKwlpZWVlLT5hc3NvY2lhdGVfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKWllZWU7CisJaWVlZS0+YXNzb2NpYXRlX3RpbWVyLmZ1bmN0aW9uID0gaWVlZTgwMjExX2Fzc29jaWF0ZV9hYm9ydF9jYjsKKworCWluaXRfdGltZXIoJmllZWUtPmJlYWNvbl90aW1lcik7CisJaWVlZS0+YmVhY29uX3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZykgaWVlZTsKKwlpZWVlLT5iZWFjb25fdGltZXIuZnVuY3Rpb24gPSBpZWVlODAyMTFfc2VuZF9iZWFjb25fY2I7CisKKyNpZmRlZiBQRl9TWU5DVEhSRUFECisJaWVlZS0+d3EgPSBjcmVhdGVfd29ya3F1ZXVlKERSVl9OQU1FLDApOworI2Vsc2UKKwlpZWVlLT53cSA9IGNyZWF0ZV93b3JrcXVldWUoRFJWX05BTUUpOworI2VuZGlmCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwyMCkvL2FkZGVkIGJ5IGxhd3JlbmNlLDA3MDcwMgorCUlOSVRfREVMQVlFRF9XT1JLKCZpZWVlLT5zdGFydF9pYnNzX3dxLCh2b2lkKikgaWVlZTgwMjExX3N0YXJ0X2lic3Nfd3EpOworCUlOSVRfV09SSygmaWVlZS0+YXNzb2NpYXRlX2NvbXBsZXRlX3dxLCh2b2lkKikgaWVlZTgwMjExX2Fzc29jaWF0ZV9jb21wbGV0ZV93cSk7CisJSU5JVF9XT1JLKCZpZWVlLT5hc3NvY2lhdGVfcHJvY2VkdXJlX3dxLCh2b2lkKikgaWVlZTgwMjExX2Fzc29jaWF0ZV9wcm9jZWR1cmVfd3EpOworCUlOSVRfREVMQVlFRF9XT1JLKCZpZWVlLT5zb2Z0bWFjX3NjYW5fd3EsKHZvaWQqKSBpZWVlODAyMTFfc29mdG1hY19zY2FuX3dxKTsKKwlJTklUX0RFTEFZRURfV09SSygmaWVlZS0+YXNzb2NpYXRlX3JldHJ5X3dxLCh2b2lkKikgaWVlZTgwMjExX2Fzc29jaWF0ZV9yZXRyeV93cSk7CisJSU5JVF9XT1JLKCZpZWVlLT53eF9zeW5jX3NjYW5fd3EsKHZvaWQqKSBpZWVlODAyMTFfd3hfc3luY19zY2FuX3dxKTsKKy8vCUlOSVRfV09SSygmaWVlZS0+d2F0Y2hfZG9nX3dxLCh2b2lkKikgaWVlZTgwMjExX3dhdGNoX2RvZ193cSk7CisvL2FkZGVkIGJ5IGxhd3JlbmNlLDIwMDcxMTE4CisjaWZkZWYgX1JUTDgxODdfRVhUX1BBVENIXworCUlOSVRfV09SSygmaWVlZS0+ZXh0X3N0b3Bfc2Nhbl93cSwodm9pZCopIGllZWU4MDIxMV9leHRfc3RvcF9zY2FuX3dxKTsKKwkvL0lOSVRfV09SSygmaWVlZS0+ZXh0X3NlbmRfYmVhY29uX3dxLCh2b2lkKikgaWVlZTgwMjExX2JlYWNvbnNfc3RhcnQsaWVlZSk7CisJSU5JVF9XT1JLKCZpZWVlLT5leHRfc2VuZF9iZWFjb25fd3EsKHZvaWQqKSBleHRfaWVlZTgwMjExX3NlbmRfYmVhY29uX3dxKTsKKyNlbmRpZiAvL19SVEw4MTg3X0VYVF9QQVRDSF8KKyNlbHNlCisJSU5JVF9XT1JLKCZpZWVlLT5zdGFydF9pYnNzX3dxLCh2b2lkKikgaWVlZTgwMjExX3N0YXJ0X2lic3Nfd3EsaWVlZSk7CisJSU5JVF9XT1JLKCZpZWVlLT5hc3NvY2lhdGVfcmV0cnlfd3EsKHZvaWQqKSBpZWVlODAyMTFfYXNzb2NpYXRlX3JldHJ5X3dxLGllZWUpOworCUlOSVRfV09SSygmaWVlZS0+YXNzb2NpYXRlX2NvbXBsZXRlX3dxLCh2b2lkKikgaWVlZTgwMjExX2Fzc29jaWF0ZV9jb21wbGV0ZV93cSxpZWVlKTsKKwlJTklUX1dPUksoJmllZWUtPmFzc29jaWF0ZV9wcm9jZWR1cmVfd3EsKHZvaWQqKSBpZWVlODAyMTFfYXNzb2NpYXRlX3Byb2NlZHVyZV93cSxpZWVlKTsKKwlJTklUX1dPUksoJmllZWUtPnNvZnRtYWNfc2Nhbl93cSwodm9pZCopIGllZWU4MDIxMV9zb2Z0bWFjX3NjYW5fd3EsaWVlZSk7CisJSU5JVF9XT1JLKCZpZWVlLT53eF9zeW5jX3NjYW5fd3EsKHZvaWQqKSBpZWVlODAyMTFfd3hfc3luY19zY2FuX3dxLGllZWUpOworLy8JSU5JVF9XT1JLKCZpZWVlLT53YXRjaF9kb2dfd3EsKHZvaWQqKSBpZWVlODAyMTFfd2F0Y2hfZG9nX3dxLGllZWUpOworI2lmZGVmIF9SVEw4MTg3X0VYVF9QQVRDSF8KKwlJTklUX1dPUksoJmllZWUtPmV4dF9zdG9wX3NjYW5fd3EsKHZvaWQqKSBpZWVlODAyMTFfZXh0X3N0b3Bfc2Nhbl93cSxpZWVlKTsKKwkvL0lOSVRfV09SSygmaWVlZS0+ZXh0X3NlbmRfYmVhY29uX3dxLCh2b2lkKikgaWVlZTgwMjExX2JlYWNvbnNfc3RhcnQsaWVlZSk7CisJSU5JVF9XT1JLKCZpZWVlLT5leHRfc2VuZF9iZWFjb25fd3EsKHZvaWQqKSBleHRfaWVlZTgwMjExX3NlbmRfYmVhY29uX3dxLGllZWUpOworI2VuZGlmCisjZW5kaWYKKwlzZW1hX2luaXQoJmllZWUtPnd4X3NlbSwgMSk7CisJc2VtYV9pbml0KCZpZWVlLT5zY2FuX3NlbSwgMSk7CisKKwlzcGluX2xvY2tfaW5pdCgmaWVlZS0+bWdtdF90eF9sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmaWVlZS0+YmVhY29uX2xvY2spOworCisJdGFza2xldF9pbml0KCZpZWVlLT5wc190YXNrLAorCSAgICAgKHZvaWQoKikodW5zaWduZWQgbG9uZykpIGllZWU4MDIxMV9zdGFfcHMsCisJICAgICAodW5zaWduZWQgbG9uZylpZWVlKTsKKyNpZmRlZiBFTkFCTEVfRE9UMTFECisJaWVlZS0+cERvdDExZEluZm8gPSBrbWFsbG9jKHNpemVvZihSVF9ET1QxMURfSU5GTyksIEdGUF9BVE9NSUMpOworI2VuZGlmCit9CisKK3ZvaWQgaWVlZTgwMjExX3NvZnRtYWNfZnJlZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKwlkb3duKCZpZWVlLT53eF9zZW0pOworCisJZGVsX3RpbWVyX3N5bmMoJmllZWUtPmFzc29jaWF0ZV90aW1lcik7CisJY2FuY2VsX2RlbGF5ZWRfd29yaygmaWVlZS0+YXNzb2NpYXRlX3JldHJ5X3dxKTsKKworCisJLy9hZGQgZm9yIFJGIHBvd2VyIG9uIHBvd2VyIG9mIGJ5IGxpemhhb21pbmcgMDgwNTEyCisJY2FuY2VsX2RlbGF5ZWRfd29yaygmaWVlZS0+R1BJT0NoYW5nZVJGV29ya0l0ZW0pOworCisjaWZkZWYgX1JUTDgxODdfRVhUX1BBVENIXworCWNhbmNlbF9kZWxheWVkX3dvcmsoJmllZWUtPmV4dF9zdG9wX3NjYW5fd3EpOworCWNhbmNlbF9kZWxheWVkX3dvcmsoJmllZWUtPmV4dF9zZW5kX2JlYWNvbl93cSk7CisjZW5kaWYKKwlkZXN0cm95X3dvcmtxdWV1ZShpZWVlLT53cSk7CisjaWZkZWYgRU5BQkxFX0RPVDExRAorCWlmKE5VTEwgIT0gaWVlZS0+cERvdDExZEluZm8pCisJCWtmcmVlKGllZWUtPnBEb3QxMWRJbmZvKTsKKyNlbmRpZgorCXVwKCZpZWVlLT53eF9zZW0pOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFN0YXJ0IG9mIFdQQSBjb2RlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogdGhpcyBpcyBzdG9sZW4gZnJvbSB0aGUgaXB3MjIwMCBkcml2ZXIgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworc3RhdGljIGludCBpZWVlODAyMTFfd3BhX2VuYWJsZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgaW50IHZhbHVlKQoreworCS8qIFRoaXMgaXMgY2FsbGVkIHdoZW4gd3BhX3N1cHBsaWNhbnQgbG9hZHMgYW5kIGNsb3NlcyB0aGUgZHJpdmVyCisJICogaW50ZXJmYWNlLiAqLworCXByaW50aygiJXMgV1BBXG4iLHZhbHVlID8gImVuYWJsaW5nIiA6ICJkaXNhYmxpbmciKTsKKwlpZWVlLT53cGFfZW5hYmxlZCA9IHZhbHVlOworCXJldHVybiAwOworfQorCisKK3ZvaWQgaWVlZTgwMjExX3dwYV9hc3NvY19mcmFtZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgY2hhciAqd3BhX2llLCBpbnQgd3BhX2llX2xlbikKK3sKKwkvKiBtYWtlIHN1cmUgV1BBIGlzIGVuYWJsZWQgKi8KKwlpZWVlODAyMTFfd3BhX2VuYWJsZShpZWVlLCAxKTsKKworCWllZWU4MDIxMV9kaXNhc3NvY2lhdGUoaWVlZSk7Cit9CisKKworc3RhdGljIGludCBpZWVlODAyMTFfd3BhX21sbWUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIGludCBjb21tYW5kLCBpbnQgcmVhc29uKQoreworCisJaW50IHJldCA9IDA7CisKKwlzd2l0Y2ggKGNvbW1hbmQpIHsKKwljYXNlIElFRUVfTUxNRV9TVEFfREVBVVRIOgorCQkvLyBzaWxlbnRseSBpZ25vcmUKKwkJYnJlYWs7CisKKwljYXNlIElFRUVfTUxNRV9TVEFfRElTQVNTT0M6CisJCWllZWU4MDIxMV9kaXNhc3NvY2lhdGUoaWVlZSk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcHJpbnRrKCJVbmtub3duIE1MTUUgcmVxdWVzdDogJWRcbiIsIGNvbW1hbmQpOworCQlyZXQgPSAtRU9QTk9UU1VQUDsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyBpbnQgaWVlZTgwMjExX3dwYV9zZXRfd3BhX2llKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJICAgICAgc3RydWN0IGllZWVfcGFyYW0gKnBhcmFtLCBpbnQgcGxlbikKK3sKKwl1OCAqYnVmOworCisJaWYgKHBhcmFtLT51LndwYV9pZS5sZW4gPiBNQVhfV1BBX0lFX0xFTiB8fAorCSAgICAocGFyYW0tPnUud3BhX2llLmxlbiAmJiBwYXJhbS0+dS53cGFfaWUuZGF0YSA9PSBOVUxMKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAocGFyYW0tPnUud3BhX2llLmxlbikgeworCQlidWYgPSBrbWFsbG9jKHBhcmFtLT51LndwYV9pZS5sZW4sIEdGUF9LRVJORUwpOworCQlpZiAoYnVmID09IE5VTEwpCisJCQlyZXR1cm4gLUVOT01FTTsKKworCQltZW1jcHkoYnVmLCBwYXJhbS0+dS53cGFfaWUuZGF0YSwgcGFyYW0tPnUud3BhX2llLmxlbik7CisJCWtmcmVlKGllZWUtPndwYV9pZSk7CisJCWllZWUtPndwYV9pZSA9IGJ1ZjsKKwkJaWVlZS0+d3BhX2llX2xlbiA9IHBhcmFtLT51LndwYV9pZS5sZW47CisJfSBlbHNlIHsKKwkJa2ZyZWUoaWVlZS0+d3BhX2llKTsKKwkJaWVlZS0+d3BhX2llID0gTlVMTDsKKwkJaWVlZS0+d3BhX2llX2xlbiA9IDA7CisJfQorCisJaWVlZTgwMjExX3dwYV9hc3NvY19mcmFtZShpZWVlLCBpZWVlLT53cGFfaWUsIGllZWUtPndwYV9pZV9sZW4pOworCXJldHVybiAwOworfQorCisjZGVmaW5lIEFVVEhfQUxHX09QRU5fU1lTVEVNCQkJMHgxCisjZGVmaW5lIEFVVEhfQUxHX1NIQVJFRF9LRVkJCQkweDIKKworc3RhdGljIGludCBpZWVlODAyMTFfd3BhX3NldF9hdXRoX2FsZ3Moc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIGludCB2YWx1ZSkKK3sKKworCXN0cnVjdCBpZWVlODAyMTFfc2VjdXJpdHkgc2VjID0geworCQkuZmxhZ3MgPSBTRUNfQVVUSF9NT0RFLAorCX07CisJaW50IHJldCA9IDA7CisKKwlpZiAodmFsdWUgJiBBVVRIX0FMR19TSEFSRURfS0VZKSB7CisJCXNlYy5hdXRoX21vZGUgPSBXTEFOX0FVVEhfU0hBUkVEX0tFWTsKKwkJaWVlZS0+b3Blbl93ZXAgPSAwOworCX0gZWxzZSB7CisJCXNlYy5hdXRoX21vZGUgPSBXTEFOX0FVVEhfT1BFTjsKKwkJaWVlZS0+b3Blbl93ZXAgPSAxOworCX0KKworCWlmIChpZWVlLT5zZXRfc2VjdXJpdHkpCisJCWllZWUtPnNldF9zZWN1cml0eShpZWVlLT5kZXYsICZzZWMpOworCWVsc2UKKwkJcmV0ID0gLUVPUE5PVFNVUFA7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGllZWU4MDIxMV93cGFfc2V0X3BhcmFtKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCB1OCBuYW1lLCB1MzIgdmFsdWUpCit7CisJaW50IHJldD0wOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzd2l0Y2ggKG5hbWUpIHsKKwljYXNlIElFRUVfUEFSQU1fV1BBX0VOQUJMRUQ6CisJCXJldCA9IGllZWU4MDIxMV93cGFfZW5hYmxlKGllZWUsIHZhbHVlKTsKKwkJYnJlYWs7CisKKwljYXNlIElFRUVfUEFSQU1fVEtJUF9DT1VOVEVSTUVBU1VSRVM6CisJCWllZWUtPnRraXBfY291bnRlcm1lYXN1cmVzPXZhbHVlOworCQlicmVhazsKKworCWNhc2UgSUVFRV9QQVJBTV9EUk9QX1VORU5DUllQVEVEOiB7CisJCS8qIEhBQ0s6CisJCSAqCisJCSAqIHdwYV9zdXBwbGljYW50IGNhbGxzIHNldF93cGFfZW5hYmxlZCB3aGVuIHRoZSBkcml2ZXIKKwkJICogaXMgbG9hZGVkIGFuZCB1bmxvYWRlZCwgcmVnYXJkbGVzcyBvZiBpZiBXUEEgaXMgYmVpbmcKKwkJICogdXNlZC4gIE5vIG90aGVyIGNhbGxzIGFyZSBtYWRlIHdoaWNoIGNhbiBiZSB1c2VkIHRvCisJCSAqIGRldGVybWluZSBpZiBlbmNyeXB0aW9uIHdpbGwgYmUgdXNlZCBvciBub3QgcHJpb3IgdG8KKwkJICogYXNzb2NpYXRpb24gYmVpbmcgZXhwZWN0ZWQuICBJZiBlbmNyeXB0aW9uIGlzIG5vdCBiZWluZworCQkgKiB1c2VkLCBkcm9wX3VuZW5jcnlwdGVkIGlzIHNldCB0byBmYWxzZSwgZWxzZSB0cnVlIC0tIHdlCisJCSAqIGNhbiB1c2UgdGhpcyB0byBkZXRlcm1pbmUgaWYgdGhlIENBUF9QUklWQUNZX09OIGJpdCBzaG91bGQKKwkJICogYmUgc2V0LgorCQkgKi8KKwkJc3RydWN0IGllZWU4MDIxMV9zZWN1cml0eSBzZWMgPSB7CisJCQkuZmxhZ3MgPSBTRUNfRU5BQkxFRCwKKwkJCS5lbmFibGVkID0gdmFsdWUsCisJCX07CisgCQlpZWVlLT5kcm9wX3VuZW5jcnlwdGVkID0gdmFsdWU7CisJCS8qIFdlIG9ubHkgY2hhbmdlIFNFQ19MRVZFTCBmb3Igb3BlbiBtb2RlLiBPdGhlcnMKKwkJICogYXJlIHNldCBieSBpcHdfd3BhX3NldF9lbmNyeXB0aW9uLgorCQkgKi8KKwkJaWYgKCF2YWx1ZSkgeworCQkJc2VjLmZsYWdzIHw9IFNFQ19MRVZFTDsKKwkJCXNlYy5sZXZlbCA9IFNFQ19MRVZFTF8wOworCQl9CisJCWVsc2UgeworCQkJc2VjLmZsYWdzIHw9IFNFQ19MRVZFTDsKKwkJCXNlYy5sZXZlbCA9IFNFQ19MRVZFTF8xOworCQl9CisJCWlmIChpZWVlLT5zZXRfc2VjdXJpdHkpCisJCQlpZWVlLT5zZXRfc2VjdXJpdHkoaWVlZS0+ZGV2LCAmc2VjKTsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBJRUVFX1BBUkFNX1BSSVZBQ1lfSU5WT0tFRDoKKwkJaWVlZS0+cHJpdmFjeV9pbnZva2VkPXZhbHVlOworCQlicmVhazsKKworCWNhc2UgSUVFRV9QQVJBTV9BVVRIX0FMR1M6CisJCXJldCA9IGllZWU4MDIxMV93cGFfc2V0X2F1dGhfYWxncyhpZWVlLCB2YWx1ZSk7CisJCWJyZWFrOworCisJY2FzZSBJRUVFX1BBUkFNX0lFRUVfODAyXzFYOgorCQlpZWVlLT5pZWVlODAyXzF4PXZhbHVlOworCQlicmVhazsKKwljYXNlIElFRUVfUEFSQU1fV1BBWF9TRUxFQ1Q6CisJCS8vIGFkZGVkIGZvciBXUEEyIG1peGVkIG1vZGUKKwkJLy9wcmludGsoS0VSTl9XQVJOSU5HICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+d3BheCB2YWx1ZSA9ICV4XG4iLCB2YWx1ZSk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT53cGF4X3N1aXRsaXN0X2xvY2ssZmxhZ3MpOworCQlpZWVlLT53cGF4X3R5cGVfc2V0ID0gMTsKKwkJaWVlZS0+d3BheF90eXBlX25vdGlmeSA9IHZhbHVlOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT53cGF4X3N1aXRsaXN0X2xvY2ssZmxhZ3MpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXByaW50aygiVW5rbm93biBXUEEgcGFyYW06ICVkXG4iLG5hbWUpOworCQlyZXQgPSAtRU9QTk9UU1VQUDsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisvKiBpbXBsZW1lbnRhdGlvbiBib3Jyb3dlZCBmcm9tIGhvc3RhcCBkcml2ZXIgKi8KKworc3RhdGljIGludCBpZWVlODAyMTFfd3BhX3NldF9lbmNyeXB0aW9uKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJCSAgc3RydWN0IGllZWVfcGFyYW0gKnBhcmFtLCBpbnQgcGFyYW1fbGVuKQoreworCWludCByZXQgPSAwOworCisJc3RydWN0IGllZWU4MDIxMV9jcnlwdG9fb3BzICpvcHM7CisJc3RydWN0IGllZWU4MDIxMV9jcnlwdF9kYXRhICoqY3J5cHQ7CisKKwlzdHJ1Y3QgaWVlZTgwMjExX3NlY3VyaXR5IHNlYyA9IHsKKwkJLmZsYWdzID0gMCwKKwl9OworCisJcGFyYW0tPnUuY3J5cHQuZXJyID0gMDsKKwlwYXJhbS0+dS5jcnlwdC5hbGdbSUVFRV9DUllQVF9BTEdfTkFNRV9MRU4gLSAxXSA9ICdcMCc7CisKKwlpZiAocGFyYW1fbGVuICE9CisJICAgIChpbnQpICgoY2hhciAqKSBwYXJhbS0+dS5jcnlwdC5rZXkgLSAoY2hhciAqKSBwYXJhbSkgKworCSAgICBwYXJhbS0+dS5jcnlwdC5rZXlfbGVuKSB7CisJCXByaW50aygiTGVuIG1pc21hdGNoICVkLCAlZFxuIiwgcGFyYW1fbGVuLAorCQkJICAgICAgIHBhcmFtLT51LmNyeXB0LmtleV9sZW4pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKHBhcmFtLT5zdGFfYWRkclswXSA9PSAweGZmICYmIHBhcmFtLT5zdGFfYWRkclsxXSA9PSAweGZmICYmCisJICAgIHBhcmFtLT5zdGFfYWRkclsyXSA9PSAweGZmICYmIHBhcmFtLT5zdGFfYWRkclszXSA9PSAweGZmICYmCisJICAgIHBhcmFtLT5zdGFfYWRkcls0XSA9PSAweGZmICYmIHBhcmFtLT5zdGFfYWRkcls1XSA9PSAweGZmKSB7CisJCWlmIChwYXJhbS0+dS5jcnlwdC5pZHggPj0gV0VQX0tFWVMpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJY3J5cHQgPSAmaWVlZS0+Y3J5cHRbcGFyYW0tPnUuY3J5cHQuaWR4XTsKKwl9IGVsc2UgeworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoc3RyY21wKHBhcmFtLT51LmNyeXB0LmFsZywgIm5vbmUiKSA9PSAwKSB7CisJCWlmIChjcnlwdCkgeworCQkJc2VjLmVuYWJsZWQgPSAwOworCQkJLy8gRklYTUUgRklYTUUKKwkJCS8vc2VjLmVuY3J5cHQgPSAwOworCQkJc2VjLmxldmVsID0gU0VDX0xFVkVMXzA7CisJCQlzZWMuZmxhZ3MgfD0gU0VDX0VOQUJMRUQgfCBTRUNfTEVWRUw7CisJCQlpZWVlODAyMTFfY3J5cHRfZGVsYXllZF9kZWluaXQoaWVlZSwgY3J5cHQpOworCQl9CisJCWdvdG8gZG9uZTsKKwl9CisJc2VjLmVuYWJsZWQgPSAxOworLy8gRklYTUUgRklYTUUKKy8vCXNlYy5lbmNyeXB0ID0gMTsKKwlzZWMuZmxhZ3MgfD0gU0VDX0VOQUJMRUQ7CisKKwkvKiBJUFcgSFcgY2Fubm90IGJ1aWxkIFRLSVAgTUlDLCBob3N0IGRlY3J5cHRpb24gc3RpbGwgbmVlZGVkLiAqLworCWlmICghKGllZWUtPmhvc3RfZW5jcnlwdCB8fCBpZWVlLT5ob3N0X2RlY3J5cHQpICYmCisJICAgIHN0cmNtcChwYXJhbS0+dS5jcnlwdC5hbGcsICJUS0lQIikpCisJCWdvdG8gc2tpcF9ob3N0X2NyeXB0OworCisJb3BzID0gaWVlZTgwMjExX2dldF9jcnlwdG9fb3BzKHBhcmFtLT51LmNyeXB0LmFsZyk7CisJaWYgKG9wcyA9PSBOVUxMICYmIHN0cmNtcChwYXJhbS0+dS5jcnlwdC5hbGcsICJXRVAiKSA9PSAwKSB7CisJCXJlcXVlc3RfbW9kdWxlKCJpZWVlODAyMTFfY3J5cHRfd2VwIik7CisJCW9wcyA9IGllZWU4MDIxMV9nZXRfY3J5cHRvX29wcyhwYXJhbS0+dS5jcnlwdC5hbGcpOworCX0gZWxzZSBpZiAob3BzID09IE5VTEwgJiYgc3RyY21wKHBhcmFtLT51LmNyeXB0LmFsZywgIlRLSVAiKSA9PSAwKSB7CisJCXJlcXVlc3RfbW9kdWxlKCJpZWVlODAyMTFfY3J5cHRfdGtpcCIpOworCQlvcHMgPSBpZWVlODAyMTFfZ2V0X2NyeXB0b19vcHMocGFyYW0tPnUuY3J5cHQuYWxnKTsKKwl9IGVsc2UgaWYgKG9wcyA9PSBOVUxMICYmIHN0cmNtcChwYXJhbS0+dS5jcnlwdC5hbGcsICJDQ01QIikgPT0gMCkgeworCQlyZXF1ZXN0X21vZHVsZSgiaWVlZTgwMjExX2NyeXB0X2NjbXAiKTsKKwkJb3BzID0gaWVlZTgwMjExX2dldF9jcnlwdG9fb3BzKHBhcmFtLT51LmNyeXB0LmFsZyk7CisJfQorCWlmIChvcHMgPT0gTlVMTCkgeworCQlwcmludGsoInVua25vd24gY3J5cHRvIGFsZyAnJXMnXG4iLCBwYXJhbS0+dS5jcnlwdC5hbGcpOworCQlwYXJhbS0+dS5jcnlwdC5lcnIgPSBJRUVFX0NSWVBUX0VSUl9VTktOT1dOX0FMRzsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKworCWlmICgqY3J5cHQgPT0gTlVMTCB8fCAoKmNyeXB0KS0+b3BzICE9IG9wcykgeworCQlzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEgKm5ld19jcnlwdDsKKworCQlpZWVlODAyMTFfY3J5cHRfZGVsYXllZF9kZWluaXQoaWVlZSwgY3J5cHQpOworCisJCW5ld19jcnlwdCA9IChzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEgKikKKwkJCWttYWxsb2Moc2l6ZW9mKCpuZXdfY3J5cHQpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKG5ld19jcnlwdCA9PSBOVUxMKSB7CisJCQlyZXQgPSAtRU5PTUVNOworCQkJZ290byBkb25lOworCQl9CisJCW1lbXNldChuZXdfY3J5cHQsIDAsIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEpKTsKKwkJbmV3X2NyeXB0LT5vcHMgPSBvcHM7CisJCWlmIChuZXdfY3J5cHQtPm9wcyAmJiB0cnlfbW9kdWxlX2dldChuZXdfY3J5cHQtPm9wcy0+b3duZXIpKQorCQkJbmV3X2NyeXB0LT5wcml2ID0KKwkJCQluZXdfY3J5cHQtPm9wcy0+aW5pdChwYXJhbS0+dS5jcnlwdC5pZHgpOworCisJCWlmIChuZXdfY3J5cHQtPnByaXYgPT0gTlVMTCkgeworCQkJa2ZyZWUobmV3X2NyeXB0KTsKKwkJCXBhcmFtLT51LmNyeXB0LmVyciA9IElFRUVfQ1JZUFRfRVJSX0NSWVBUX0lOSVRfRkFJTEVEOworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCisJCSpjcnlwdCA9IG5ld19jcnlwdDsKKwl9CisKKwlpZiAocGFyYW0tPnUuY3J5cHQua2V5X2xlbiA+IDAgJiYgKCpjcnlwdCktPm9wcy0+c2V0X2tleSAmJgorCSAgICAoKmNyeXB0KS0+b3BzLT5zZXRfa2V5KHBhcmFtLT51LmNyeXB0LmtleSwKKwkJCQkgICBwYXJhbS0+dS5jcnlwdC5rZXlfbGVuLCBwYXJhbS0+dS5jcnlwdC5zZXEsCisJCQkJICAgKCpjcnlwdCktPnByaXYpIDwgMCkgeworCQlwcmludGsoImtleSBzZXR0aW5nIGZhaWxlZFxuIik7CisJCXBhcmFtLT51LmNyeXB0LmVyciA9IElFRUVfQ1JZUFRfRVJSX0tFWV9TRVRfRkFJTEVEOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCisgc2tpcF9ob3N0X2NyeXB0OgorCWlmIChwYXJhbS0+dS5jcnlwdC5zZXRfdHgpIHsKKwkJaWVlZS0+dHhfa2V5aWR4ID0gcGFyYW0tPnUuY3J5cHQuaWR4OworCQlzZWMuYWN0aXZlX2tleSA9IHBhcmFtLT51LmNyeXB0LmlkeDsKKwkJc2VjLmZsYWdzIHw9IFNFQ19BQ1RJVkVfS0VZOworCX0gZWxzZQorCQlzZWMuZmxhZ3MgJj0gflNFQ19BQ1RJVkVfS0VZOworCisJaWYgKHBhcmFtLT51LmNyeXB0LmFsZyAhPSBOVUxMKSB7CisJCW1lbWNweShzZWMua2V5c1twYXJhbS0+dS5jcnlwdC5pZHhdLAorCQkgICAgICAgcGFyYW0tPnUuY3J5cHQua2V5LAorCQkgICAgICAgcGFyYW0tPnUuY3J5cHQua2V5X2xlbik7CisJCXNlYy5rZXlfc2l6ZXNbcGFyYW0tPnUuY3J5cHQuaWR4XSA9IHBhcmFtLT51LmNyeXB0LmtleV9sZW47CisJCXNlYy5mbGFncyB8PSAoMSA8PCBwYXJhbS0+dS5jcnlwdC5pZHgpOworCisJCWlmIChzdHJjbXAocGFyYW0tPnUuY3J5cHQuYWxnLCAiV0VQIikgPT0gMCkgeworCQkJc2VjLmZsYWdzIHw9IFNFQ19MRVZFTDsKKwkJCXNlYy5sZXZlbCA9IFNFQ19MRVZFTF8xOworCQl9IGVsc2UgaWYgKHN0cmNtcChwYXJhbS0+dS5jcnlwdC5hbGcsICJUS0lQIikgPT0gMCkgeworCQkJc2VjLmZsYWdzIHw9IFNFQ19MRVZFTDsKKwkJCXNlYy5sZXZlbCA9IFNFQ19MRVZFTF8yOworCQl9IGVsc2UgaWYgKHN0cmNtcChwYXJhbS0+dS5jcnlwdC5hbGcsICJDQ01QIikgPT0gMCkgeworCQkJc2VjLmZsYWdzIHw9IFNFQ19MRVZFTDsKKwkJCXNlYy5sZXZlbCA9IFNFQ19MRVZFTF8zOworCQl9CisJfQorIGRvbmU6CisJaWYgKGllZWUtPnNldF9zZWN1cml0eSkKKwkJaWVlZS0+c2V0X3NlY3VyaXR5KGllZWUtPmRldiwgJnNlYyk7CisKKwkvKiBEbyBub3QgcmVzZXQgcG9ydCBpZiBjYXJkIGlzIGluIE1hbmFnZWQgbW9kZSBzaW5jZSByZXNldHRpbmcgd2lsbAorCSAqIGdlbmVyYXRlIG5ldyBJRUVFIDgwMi4xMSBhdXRoZW50aWNhdGlvbiB3aGljaCBtYXkgZW5kIHVwIGluIGxvb3BpbmcKKwkgKiB3aXRoIElFRUUgODAyLjFYLiAgSWYgeW91ciBoYXJkd2FyZSByZXF1aXJlcyBhIHJlc2V0IGFmdGVyIFdFUAorCSAqIGNvbmZpZ3VyYXRpb24gKGZvciBleGFtcGxlLi4uIFByaXNtMiksIGltcGxlbWVudCB0aGUgcmVzZXRfcG9ydCBpbgorCSAqIHRoZSBjYWxsYmFja3Mgc3RydWN0dXJlcyB1c2VkIHRvIGluaXRpYWxpemUgdGhlIDgwMi4xMSBzdGFjay4gKi8KKwlpZiAoaWVlZS0+cmVzZXRfb25fa2V5Y2hhbmdlICYmCisJICAgIGllZWUtPml3X21vZGUgIT0gSVdfTU9ERV9JTkZSQSAmJgorCSAgICBpZWVlLT5yZXNldF9wb3J0ICYmCisJICAgIGllZWUtPnJlc2V0X3BvcnQoaWVlZS0+ZGV2KSkgeworCQlwcmludGsoInJlc2V0X3BvcnQgZmFpbGVkXG4iKTsKKwkJcGFyYW0tPnUuY3J5cHQuZXJyID0gSUVFRV9DUllQVF9FUlJfQ0FSRF9DT05GX0ZBSUxFRDsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworaW50IGllZWU4MDIxMV93cGFfc3VwcGxpY2FudF9pb2N0bChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc3RydWN0IGl3X3BvaW50ICpwKQoreworCXN0cnVjdCBpZWVlX3BhcmFtICpwYXJhbTsKKwlpbnQgcmV0PTA7CisKKwlkb3duKCZpZWVlLT53eF9zZW0pOworCS8vSUVFRV9ERUJVR19JTkZPKCJ3cGFfc3VwcGxpY2FudDogbGVuPSVkXG4iLCBwLT5sZW5ndGgpOworCisJaWYgKHAtPmxlbmd0aCA8IHNpemVvZihzdHJ1Y3QgaWVlZV9wYXJhbSkgfHwgIXAtPnBvaW50ZXIpeworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisKKwlwYXJhbSA9IChzdHJ1Y3QgaWVlZV9wYXJhbSAqKWttYWxsb2MocC0+bGVuZ3RoLCBHRlBfS0VSTkVMKTsKKwlpZiAocGFyYW0gPT0gTlVMTCl7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gb3V0OworCX0KKwlpZiAoY29weV9mcm9tX3VzZXIocGFyYW0sIHAtPnBvaW50ZXIsIHAtPmxlbmd0aCkpIHsKKwkJa2ZyZWUocGFyYW0pOworCQlyZXQgPSAtRUZBVUxUOworCQlnb3RvIG91dDsKKwl9CisKKwlzd2l0Y2ggKHBhcmFtLT5jbWQpIHsKKworCWNhc2UgSUVFRV9DTURfU0VUX1dQQV9QQVJBTToKKwkJcmV0ID0gaWVlZTgwMjExX3dwYV9zZXRfcGFyYW0oaWVlZSwgcGFyYW0tPnUud3BhX3BhcmFtLm5hbWUsCisJCQkJCXBhcmFtLT51LndwYV9wYXJhbS52YWx1ZSk7CisJCWJyZWFrOworCisJY2FzZSBJRUVFX0NNRF9TRVRfV1BBX0lFOgorCQlyZXQgPSBpZWVlODAyMTFfd3BhX3NldF93cGFfaWUoaWVlZSwgcGFyYW0sIHAtPmxlbmd0aCk7CisJCWJyZWFrOworCisJY2FzZSBJRUVFX0NNRF9TRVRfRU5DUllQVElPTjoKKwkJcmV0ID0gaWVlZTgwMjExX3dwYV9zZXRfZW5jcnlwdGlvbihpZWVlLCBwYXJhbSwgcC0+bGVuZ3RoKTsKKwkJYnJlYWs7CisKKwljYXNlIElFRUVfQ01EX01MTUU6CisJCXJldCA9IGllZWU4MDIxMV93cGFfbWxtZShpZWVlLCBwYXJhbS0+dS5tbG1lLmNvbW1hbmQsCisJCQkJICAgcGFyYW0tPnUubWxtZS5yZWFzb25fY29kZSk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcHJpbnRrKCJVbmtub3duIFdQQSBzdXBwbGljYW50IHJlcXVlc3Q6ICVkXG4iLHBhcmFtLT5jbWQpOworCQlyZXQgPSAtRU9QTk9UU1VQUDsKKwkJYnJlYWs7CisJfQorCisJaWYgKHJldCA9PSAwICYmIGNvcHlfdG9fdXNlcihwLT5wb2ludGVyLCBwYXJhbSwgcC0+bGVuZ3RoKSkKKwkJcmV0ID0gLUVGQVVMVDsKKworCWtmcmVlKHBhcmFtKTsKK291dDoKKwl1cCgmaWVlZS0+d3hfc2VtKTsKKworCXJldHVybiByZXQ7Cit9CisKK3ZvaWQgbm90aWZ5X3d4X2Fzc29jX2V2ZW50KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCXVuaW9uIGl3cmVxX2RhdGEgd3JxdTsKKwl3cnF1LmFwX2FkZHIuc2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOworCWlmIChpZWVlLT5zdGF0ZSA9PSBJRUVFODAyMTFfTElOS0VEKQorCQltZW1jcHkod3JxdS5hcF9hZGRyLnNhX2RhdGEsIGllZWUtPmN1cnJlbnRfbmV0d29yay5ic3NpZCwgRVRIX0FMRU4pOworCWVsc2UKKwkJbWVtc2V0KHdycXUuYXBfYWRkci5zYV9kYXRhLCAwLCBFVEhfQUxFTik7CisJd2lyZWxlc3Nfc2VuZF9ldmVudChpZWVlLT5kZXYsIFNJT0NHSVdBUCwgJndycXUsIE5VTEwpOworfQorCisKKyNpZiAwCitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV9nZXRfYmVhY29uKTsKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX3dha2VfcXVldWUpOworRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfc3RvcF9xdWV1ZSk7CitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV9yZXNldF9xdWV1ZSk7CitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV9zb2Z0bWFjX3N0b3BfcHJvdG9jb2wpOworRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfc29mdG1hY19zdGFydF9wcm90b2NvbCk7CitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV9pc19zaG9ydHNsb3QpOworRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfaXNfNTRnKTsKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX3dwYV9zdXBwbGljYW50X2lvY3RsKTsKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX3BzX3R4X2Fjayk7CitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV9zdGFydF9wcm90b2NvbCk7CitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV9zdG9wX3Byb3RvY29sKTsKK0VYUE9SVF9TWU1CT0wobm90aWZ5X3d4X2Fzc29jX2V2ZW50KTsKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX3N0b3Bfc2VuZF9iZWFjb25zKTsKK0VYUE9SVF9TWU1CT0woU2VuZERpc2Fzc29jaWF0aW9uKTsKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX2Rpc2Fzc29jaWF0ZSk7CitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV9zdGFydF9zY2FuKTsKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX3NvZnRtYWNfaXBzX3NjYW5fc3luY3JvKTsKKyNpZmRlZiBfUlRMODE4N19FWFRfUEFUQ0hfCitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV9leHRfaXNzdWVfYXNzb2NfcmVxKTsKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX2V4dF9pc3N1ZV9kaXNhc3NvYyk7CitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV9leHRfaXNzdWVfYXNzb2NfcnNwKTsKK0VYUE9SVF9TWU1CT0woc29mdG1hY19tZ210X3htaXQpOworRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfZXh0X3Byb2JlX3Jlc3BfYnlfbmV0KTsKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX3N0YXJ0X3NjYW4pOworRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfc3RvcF9zY2FuKTsKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX2V4dF9zZW5kXzExc19iZWFjb24pOworRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfcnhfYXV0aF9ycSk7CitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV9hc3NvY2lhdGVfc3RlcDEpOworI2VuZGlmIC8vIF9SVEw4MTg3X0VYVF9QQVRDSF8KK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX3N0YV9wc19zZW5kX251bGxfZnJhbWUpOworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS9pZWVlODAyMTFfc29mdG1hY193eC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvaWVlZTgwMjExX3NvZnRtYWNfd3guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45M2FmMzdlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvaWVlZTgwMjExX3NvZnRtYWNfd3guYwpAQCAtMCwwICsxLDYwMiBAQAorLyogSUVFRSA4MDIuMTEgU29mdE1BQyBsYXllcgorICogQ29weXJpZ2h0IChjKSAyMDA1IEFuZHJlYSBNZXJlbGxvIDxhbmRyZWFtcmxAdGlzY2FsaS5pdD4KKyAqCisgKiBNb3N0bHkgZXh0cmFjdGVkIGZyb20gdGhlIHJ0bDgxODAtc2EyNDAwIGRyaXZlciBmb3IgdGhlCisgKiBpbi1rZXJuZWwgZ2VuZXJpYyBpZWVlODAyLjExIHN0YWNrLgorICoKKyAqIFNvbWUgcGllY2VzIG9mIGNvZGUgbWlnaHQgYmUgc3RvbGVuIGZyb20gaXB3MjEwMCBkcml2ZXIKKyAqIGNvcHlyaWdodCBvZiB3aG8gb3duIGl0J3MgY29weXJpZ2h0IDstKQorICoKKyAqIFBTIHd4IGhhbmRsZXIgbW9zdGx5IHN0b2xlbiBmcm9tIGhvc3RhcCwgY29weXJpZ2h0IHdobworICogb3duIGl0J3MgY29weXJpZ2h0IDstKQorICoKKyAqIHJlbGVhc2VkIHVuZGVyIHRoZSBHUEwKKyAqLworCisKKyNpbmNsdWRlICJpZWVlODAyMTEuaCIKKworLyogRklYTUU6IGFkZCBBIGZyZXFzICovCisKK2NvbnN0IGxvbmcgaWVlZTgwMjExX3dsYW5fZnJlcXVlbmNpZXNbXSA9IHsKKwkyNDEyLCAyNDE3LCAyNDIyLCAyNDI3LAorCTI0MzIsIDI0MzcsIDI0NDIsIDI0NDcsCisJMjQ1MiwgMjQ1NywgMjQ2MiwgMjQ2NywKKwkyNDcyLCAyNDg0Cit9OworCisKK2ludCBpZWVlODAyMTFfd3hfc2V0X2ZyZXEoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmEsCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmIpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgaXdfZnJlcSAqZndycSA9ICYgd3JxdS0+ZnJlcTsKKy8vCXByaW50aygiaW4gJXNcbiIsX19mdW5jX18pOworCWRvd24oJmllZWUtPnd4X3NlbSk7CisKKwlpZihpZWVlLT5pd19tb2RlID09IElXX01PREVfSU5GUkEpeworCQlyZXQgPSAtRU9QTk9UU1VQUDsKKwkJZ290byBvdXQ7CisJfQorCisJLyogaWYgc2V0dGluZyBieSBmcmVxIGNvbnZlcnQgdG8gY2hhbm5lbCAqLworCWlmIChmd3JxLT5lID09IDEpIHsKKwkJaWYgKChmd3JxLT5tID49IChpbnQpIDIuNDEyZTggJiYKKwkJICAgICBmd3JxLT5tIDw9IChpbnQpIDIuNDg3ZTgpKSB7CisJCQlpbnQgZiA9IGZ3cnEtPm0gLyAxMDAwMDA7CisJCQlpbnQgYyA9IDA7CisKKwkJCXdoaWxlICgoYyA8IDE0KSAmJiAoZiAhPSBpZWVlODAyMTFfd2xhbl9mcmVxdWVuY2llc1tjXSkpCisJCQkJYysrOworCisJCQkvKiBoYWNrIHRvIGZhbGwgdGhyb3VnaCAqLworCQkJZndycS0+ZSA9IDA7CisJCQlmd3JxLT5tID0gYyArIDE7CisJCX0KKwl9CisKKwlpZiAoZndycS0+ZSA+IDAgfHwgZndycS0+bSA+IDE0IHx8IGZ3cnEtPm0gPCAxICl7CisJCXJldCA9IC1FT1BOT1RTVVBQOworCQlnb3RvIG91dDsKKworCX1lbHNlIHsgLyogU2V0IHRoZSBjaGFubmVsICovCisKKworCQlpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCA9IGZ3cnEtPm07CisJCWllZWUtPnNldF9jaGFuKGllZWUtPmRldiwgaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWwpOworCisJCWlmKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9BREhPQyB8fCBpZWVlLT5pd19tb2RlID09IElXX01PREVfTUFTVEVSKQorCQkJaWYoaWVlZS0+c3RhdGUgPT0gSUVFRTgwMjExX0xJTktFRCl7CisKKwkJCWllZWU4MDIxMV9zdG9wX3NlbmRfYmVhY29ucyhpZWVlKTsKKwkJCWllZWU4MDIxMV9zdGFydF9zZW5kX2JlYWNvbnMoaWVlZSk7CisJCQl9CisJfQorCisJcmV0ID0gMDsKK291dDoKKwl1cCgmaWVlZS0+d3hfc2VtKTsKKwlyZXR1cm4gcmV0OworfQorCisKK2ludCBpZWVlODAyMTFfd3hfZ2V0X2ZyZXEoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmEsCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmIpCit7CisJc3RydWN0IGl3X2ZyZXEgKmZ3cnEgPSAmIHdycXUtPmZyZXE7CisKKwlpZiAoaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWwgPT0gMCkKKwkJcmV0dXJuIC0xOworCisJZndycS0+bSA9IGllZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsOworCWZ3cnEtPmUgPSAwOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBpZWVlODAyMTFfd3hfZ2V0X3dhcChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwl3cnF1LT5hcF9hZGRyLnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKKworCWlmIChpZWVlLT5pd19tb2RlID09IElXX01PREVfTU9OSVRPUikKKwkJcmV0dXJuIC0xOworCisJLyogV2Ugd2FudCBhdm9pZCB0byBnaXZlIHRvIHRoZSB1c2VyIGluY29uc2lzdGVudCBpbmZvcyovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKKworCWlmIChpZWVlLT5zdGF0ZSAhPSBJRUVFODAyMTFfTElOS0VEICYmCisJCWllZWUtPnN0YXRlICE9IElFRUU4MDIxMV9MSU5LRURfU0NBTk5JTkcgJiYKKwkJaWVlZS0+d2FwX3NldCA9PSAwKQorCisJCW1lbXNldCh3cnF1LT5hcF9hZGRyLnNhX2RhdGEsIDAsIEVUSF9BTEVOKTsKKwllbHNlCisJCW1lbWNweSh3cnF1LT5hcF9hZGRyLnNhX2RhdGEsCisJCSAgICAgICBpZWVlLT5jdXJyZW50X25ldHdvcmsuYnNzaWQsIEVUSF9BTEVOKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCisKK2ludCBpZWVlODAyMTFfd3hfc2V0X3dhcChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJIHVuaW9uIGl3cmVxX2RhdGEgKmF3cnEsCisJCQkgY2hhciAqZXh0cmEpCit7CisKKwlpbnQgcmV0ID0gMDsKKwl1OCB6ZXJvW10gPSB7MCwwLDAsMCwwLDB9OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzaG9ydCBpZnVwID0gaWVlZS0+cHJvdG9fc3RhcnRlZDsvL2Rldi0+ZmxhZ3MgJiBJRkZfVVA7CisJc3RydWN0IHNvY2thZGRyICp0ZW1wID0gKHN0cnVjdCBzb2NrYWRkciAqKWF3cnE7CisKKwkvL3ByaW50aygiPT09PT09PVNldCBXQVA6Iik7CisJaWVlZS0+c3luY19zY2FuX2h1cnJ5dXAgPSAxOworCisJZG93bigmaWVlZS0+d3hfc2VtKTsKKwkvKiB1c2UgaWZjb25maWcgaHcgZXRoZXIgKi8KKwlpZiAoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX01BU1RFUil7CisJCXJldCA9IC0xOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAodGVtcC0+c2FfZmFtaWx5ICE9IEFSUEhSRF9FVEhFUil7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChpZnVwKQorCQlpZWVlODAyMTFfc3RvcF9wcm90b2NvbChpZWVlKTsKKworCS8qIGp1c3QgdG8gYXZvaWQgdG8gZ2l2ZSBpbmNvbnNpc3RlbnQgaW5mb3MgaW4gdGhlCisJICogZ2V0IHd4IG1ldGhvZC4gbm90IHJlYWxseSBuZWVkZWQgb3RoZXJ3aXNlCisJICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKKworCW1lbWNweShpZWVlLT5jdXJyZW50X25ldHdvcmsuYnNzaWQsIHRlbXAtPnNhX2RhdGEsIEVUSF9BTEVOKTsKKwlpZWVlLT53YXBfc2V0ID0gbWVtY21wKHRlbXAtPnNhX2RhdGEsIHplcm8sRVRIX0FMRU4pIT0wOworCS8vcHJpbnRrKCIgJXg6JXg6JXg6JXg6JXg6JXhcbiIsIGllZWUtPmN1cnJlbnRfbmV0d29yay5ic3NpZFswXSxpZWVlLT5jdXJyZW50X25ldHdvcmsuYnNzaWRbMV0saWVlZS0+Y3VycmVudF9uZXR3b3JrLmJzc2lkWzJdLGllZWUtPmN1cnJlbnRfbmV0d29yay5ic3NpZFszXSxpZWVlLT5jdXJyZW50X25ldHdvcmsuYnNzaWRbNF0saWVlZS0+Y3VycmVudF9uZXR3b3JrLmJzc2lkWzVdKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKKworCWlmIChpZnVwKQorCQlpZWVlODAyMTFfc3RhcnRfcHJvdG9jb2woaWVlZSk7CisKK291dDoKKwl1cCgmaWVlZS0+d3hfc2VtKTsKKwlyZXR1cm4gcmV0OworfQorCisgaW50IGllZWU4MDIxMV93eF9nZXRfZXNzaWQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmEsdW5pb24gaXdyZXFfZGF0YSAqd3JxdSxjaGFyICpiKQoreworCWludCBsZW4scmV0ID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9NT05JVE9SKQorCQlyZXR1cm4gLTE7CisKKwkvKiBXZSB3YW50IGF2b2lkIHRvIGdpdmUgdG8gdGhlIHVzZXIgaW5jb25zaXN0ZW50IGluZm9zKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWVlZS0+bG9jaywgZmxhZ3MpOworCisJaWYgKGllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkWzBdID09ICdcMCcgfHwKKwkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWRfbGVuID09IDApeworCQlyZXQgPSAtMTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKGllZWUtPnN0YXRlICE9IElFRUU4MDIxMV9MSU5LRUQgJiYKKwkJaWVlZS0+c3RhdGUgIT0gSUVFRTgwMjExX0xJTktFRF9TQ0FOTklORyAmJgorCQlpZWVlLT5zc2lkX3NldCA9PSAwKXsKKwkJcmV0ID0gLTE7CisJCWdvdG8gb3V0OworCX0KKwlsZW4gPSBpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZF9sZW47CisJd3JxdS0+ZXNzaWQubGVuZ3RoID0gbGVuOworCXN0cm5jcHkoYixpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZCxsZW4pOworCXdycXUtPmVzc2lkLmZsYWdzID0gMTsKKworb3V0OgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiByZXQ7CisKK30KKworaW50IGllZWU4MDIxMV93eF9zZXRfcmF0ZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCSAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisKKwl1MzIgdGFyZ2V0X3JhdGUgPSB3cnF1LT5iaXRyYXRlLnZhbHVlOworCisJLy9hZGRlZCBieSBsaXpoYW9taW5nIGZvciBhdXRvIG1vZGUKKwlpZih0YXJnZXRfcmF0ZSA9PSAtMSl7CisJaWVlZS0+cmF0ZSA9IDExMDsKKwl9IGVsc2UgeworCWllZWUtPnJhdGUgPSB0YXJnZXRfcmF0ZS8xMDAwMDA7CisJfQorCS8vRklYTUU6IHdlIG1pZ2h0IHdhbnQgdG8gbGltaXQgcmF0ZSBhbHNvIGluIG1hbmFnZW1lbnQgcHJvdG9jb2xzLgorCXJldHVybiAwOworfQorCisKKworaW50IGllZWU4MDIxMV93eF9nZXRfcmF0ZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCSAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisKKwl3cnF1LT5iaXRyYXRlLnZhbHVlID0gaWVlZS0+cmF0ZSAqIDEwMDAwMDsKKworCXJldHVybiAwOworfQorCitpbnQgaWVlZTgwMjExX3d4X3NldF9tb2RlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICphLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpiKQoreworCisJaWVlZS0+c3luY19zY2FuX2h1cnJ5dXAgPSAxOworCisJZG93bigmaWVlZS0+d3hfc2VtKTsKKworCWlmICh3cnF1LT5tb2RlID09IGllZWUtPml3X21vZGUpCisJCWdvdG8gb3V0OworCisJaWYgKHdycXUtPm1vZGUgPT0gSVdfTU9ERV9NT05JVE9SKXsKKworCQlpZWVlLT5kZXYtPnR5cGUgPSBBUlBIUkRfSUVFRTgwMjExOworCX1lbHNleworCQlpZWVlLT5kZXYtPnR5cGUgPSBBUlBIUkRfRVRIRVI7CisJfQorCisJaWYgKCFpZWVlLT5wcm90b19zdGFydGVkKXsKKwkJaWVlZS0+aXdfbW9kZSA9IHdycXUtPm1vZGU7CisJfWVsc2V7CisJCWllZWU4MDIxMV9zdG9wX3Byb3RvY29sKGllZWUpOworCQlpZWVlLT5pd19tb2RlID0gd3JxdS0+bW9kZTsKKwkJaWVlZTgwMjExX3N0YXJ0X3Byb3RvY29sKGllZWUpOworCX0KKworb3V0OgorCXVwKCZpZWVlLT53eF9zZW0pOworCXJldHVybiAwOworfQorCisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDIwKQordm9pZCBpZWVlODAyMTFfd3hfc3luY19zY2FuX3dxKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSwgd3hfc3luY19zY2FuX3dxKTsKKyNlbHNlCit2b2lkIGllZWU4MDIxMV93eF9zeW5jX3NjYW5fd3Eoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisjZW5kaWYKKy8vdm9pZCBpZWVlODAyMTFfd3hfc3luY19zY2FuX3dxKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQorLy97CisJc2hvcnQgY2hhbjsKKworCWNoYW4gPSBpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbDsKKworCW5ldGlmX2NhcnJpZXJfb2ZmKGllZWUtPmRldik7CisKKwlpZiAoaWVlZS0+ZGF0YV9oYXJkX3N0b3ApCisJCWllZWUtPmRhdGFfaGFyZF9zdG9wKGllZWUtPmRldik7CisKKwlpZWVlODAyMTFfc3RvcF9zZW5kX2JlYWNvbnMoaWVlZSk7CisKKwlpZWVlLT5zdGF0ZSA9IElFRUU4MDIxMV9MSU5LRURfU0NBTk5JTkc7CisJaWVlZS0+bGlua19jaGFuZ2UoaWVlZS0+ZGV2KTsKKworCWllZWU4MDIxMV9zdGFydF9zY2FuX3N5bmNybyhpZWVlKTsKKworCWllZWUtPnNldF9jaGFuKGllZWUtPmRldiwgY2hhbik7CisKKwlpZWVlLT5zdGF0ZSA9IElFRUU4MDIxMV9MSU5LRUQ7CisJaWVlZS0+bGlua19jaGFuZ2UoaWVlZS0+ZGV2KTsKKworCWlmIChpZWVlLT5kYXRhX2hhcmRfcmVzdW1lKQorCQlpZWVlLT5kYXRhX2hhcmRfcmVzdW1lKGllZWUtPmRldik7CisKKwlpZihpZWVlLT5pd19tb2RlID09IElXX01PREVfQURIT0MgfHwgaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX01BU1RFUikKKwkJaWVlZTgwMjExX3N0YXJ0X3NlbmRfYmVhY29ucyhpZWVlKTsKKworCW5ldGlmX2NhcnJpZXJfb24oaWVlZS0+ZGV2KTsKKworCS8vWUosYWRkLDA4MDgyOCwgSW4gcHJldmVudCBvZiBsb3NzaW5nIHBpbmcgcGFja2V0IGR1cmluZyBzY2FubmluZworCS8vaWVlZTgwMjExX3N0YV9wc19zZW5kX251bGxfZnJhbWUoaWVlZSwgZmFsc2UpOworCS8vWUosYWRkLDA4MDgyOCxlbmQKKworCXVwKCZpZWVlLT53eF9zZW0pOworCit9CisKK2ludCBpZWVlODAyMTFfd3hfc2V0X3NjYW4oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmEsCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmIpCit7CisJaW50IHJldCA9IDA7CisKKwlkb3duKCZpZWVlLT53eF9zZW0pOworCisJaWYgKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9NT05JVE9SIHx8ICEoaWVlZS0+cHJvdG9fc3RhcnRlZCkpeworCQlyZXQgPSAtMTsKKwkJZ290byBvdXQ7CisJfQorCS8vWUosYWRkLDA4MDgyOAorCS8vSW4gcHJldmVudCBvZiBsb3NzaW5nIHBpbmcgcGFja2V0IGR1cmluZyBzY2FubmluZworCS8vaWVlZTgwMjExX3N0YV9wc19zZW5kX251bGxfZnJhbWUoaWVlZSwgdHJ1ZSk7CisJLy9ZSixhZGQsMDgwODI4LGVuZAorCisJaWYgKCBpZWVlLT5zdGF0ZSA9PSBJRUVFODAyMTFfTElOS0VEKXsKKwkJcXVldWVfd29yayhpZWVlLT53cSwgJmllZWUtPnd4X3N5bmNfc2Nhbl93cSk7CisJCS8qIGludGVudGlvbmFsbHkgZm9yZ2V0IHRvIHVwIHNlbSAqLworCQlyZXR1cm4gMDsKKwl9CisKK291dDoKKwl1cCgmaWVlZS0+d3hfc2VtKTsKKwlyZXR1cm4gcmV0OworfQorCitpbnQgaWVlZTgwMjExX3d4X3NldF9lc3NpZChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCSAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmEsCisJCQkgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKworCWludCByZXQ9MCxsZW47CisJc2hvcnQgcHJvdG9fc3RhcnRlZDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWVlZS0+c3luY19zY2FuX2h1cnJ5dXAgPSAxOworCisJZG93bigmaWVlZS0+d3hfc2VtKTsKKworCXByb3RvX3N0YXJ0ZWQgPSBpZWVlLT5wcm90b19zdGFydGVkOworCisJaWYgKHdycXUtPmVzc2lkLmxlbmd0aCA+IElXX0VTU0lEX01BWF9TSVpFKXsKKwkJcmV0PSAtRTJCSUc7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChpZWVlLT5pd19tb2RlID09IElXX01PREVfTU9OSVRPUil7CisJCXJldD0gLTE7CisJCWdvdG8gb3V0OworCX0KKworCWlmKHByb3RvX3N0YXJ0ZWQpCisJCWllZWU4MDIxMV9zdG9wX3Byb3RvY29sKGllZWUpOworCisJLyogdGhpcyBpcyBqdXN0IHRvIGJlIHN1cmUgdGhhdCB0aGUgR0VUIHd4IGNhbGxiYWNrCisJICogaGFzIGNvbnNpc3RlbiBpbmZvcy4gbm90IG5lZWRlZCBvdGhlcndpc2UKKwkgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWVlZS0+bG9jaywgZmxhZ3MpOworCisJaWYgKHdycXUtPmVzc2lkLmZsYWdzICYmIHdycXUtPmVzc2lkLmxlbmd0aCkgeworLy9ZSixtb2RpZmllZCwwODA4MTkKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCAgS0VSTkVMX1ZFUlNJT04oMiw2LDIwKQorCQlsZW4gPSAoKHdycXUtPmVzc2lkLmxlbmd0aC0xKSA8IElXX0VTU0lEX01BWF9TSVpFKSA/ICh3cnF1LT5lc3NpZC5sZW5ndGgtMSkgOiBJV19FU1NJRF9NQVhfU0laRTsKKyNlbHNlCisJCWxlbiA9ICh3cnF1LT5lc3NpZC5sZW5ndGggPCBJV19FU1NJRF9NQVhfU0laRSkgPyAod3JxdS0+ZXNzaWQubGVuZ3RoKSA6IElXX0VTU0lEX01BWF9TSVpFOworI2VuZGlmCisJCW1lbXNldChpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZCwgMCwgaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWRfbGVuKTsgLy9ZSixhZGQsMDgwODE5CisJCXN0cm5jcHkoaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWQsIGV4dHJhLCBsZW4pOworCQlpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZF9sZW4gPSBsZW47CisJCWllZWUtPnNzaWRfc2V0ID0gMTsKKy8vWUosbW9kaWZpZWQsMDgwODE5LGVuZAorCisJCS8vWUosYWRkLDA4MDgxOSxmb3IgaGlkZGVuIGFwCisJCWlmKGxlbiA9PSAwKXsKKwkJCW1lbXNldChpZWVlLT5jdXJyZW50X25ldHdvcmsuYnNzaWQsIDAsIEVUSF9BTEVOKTsKKwkJCWllZWUtPmN1cnJlbnRfbmV0d29yay5jYXBhYmlsaXR5ID0gMDsKKwkJfQorCQkvL1lKLGFkZCwwODA4MTksZm9yIGhpZGRlbiBhcCxlbmQKKwl9CisJZWxzZXsKKwkJaWVlZS0+c3NpZF9zZXQgPSAwOworCQlpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZFswXSA9ICdcMCc7CisJCWllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkX2xlbiA9IDA7CisJfQorCS8vcHJpbnRrKCI9PT09PT09PT09c2V0IGVzc2lkICVzIVxuIixpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+bG9jaywgZmxhZ3MpOworCisJaWYgKHByb3RvX3N0YXJ0ZWQpCisJCWllZWU4MDIxMV9zdGFydF9wcm90b2NvbChpZWVlKTsKK291dDoKKwl1cCgmaWVlZS0+d3hfc2VtKTsKKwlyZXR1cm4gcmV0OworfQorCisgaW50IGllZWU4MDIxMV93eF9nZXRfbW9kZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqYSwKKwkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqYikKK3sKKworCXdycXUtPm1vZGUgPSBpZWVlLT5pd19tb2RlOworCXJldHVybiAwOworfQorCisgaW50IGllZWU4MDIxMV93eF9zZXRfcmF3dHgoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKworCWludCAqcGFybXMgPSAoaW50ICopZXh0cmE7CisJaW50IGVuYWJsZSA9IChwYXJtc1swXSA+IDApOworCXNob3J0IHByZXYgPSBpZWVlLT5yYXdfdHg7CisKKwlkb3duKCZpZWVlLT53eF9zZW0pOworCisJaWYoZW5hYmxlKQorCQlpZWVlLT5yYXdfdHggPSAxOworCWVsc2UKKwkJaWVlZS0+cmF3X3R4ID0gMDsKKworCXByaW50ayhLRVJOX0lORk8icmF3IFRYIGlzICVzXG4iLAorCSAgICAgIGllZWUtPnJhd190eCA/ICJlbmFibGVkIiA6ICJkaXNhYmxlZCIpOworCisJaWYoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX01PTklUT1IpCisJeworCQlpZihwcmV2ID09IDAgJiYgaWVlZS0+cmF3X3R4KXsKKwkJCWlmIChpZWVlLT5kYXRhX2hhcmRfcmVzdW1lKQorCQkJCWllZWUtPmRhdGFfaGFyZF9yZXN1bWUoaWVlZS0+ZGV2KTsKKworCQkJbmV0aWZfY2Fycmllcl9vbihpZWVlLT5kZXYpOworCQl9CisKKwkJaWYocHJldiAmJiBpZWVlLT5yYXdfdHggPT0gMSkKKwkJCW5ldGlmX2NhcnJpZXJfb2ZmKGllZWUtPmRldik7CisJfQorCisJdXAoJmllZWUtPnd4X3NlbSk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGllZWU4MDIxMV93eF9nZXRfbmFtZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCSAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RyY3B5KHdycXUtPm5hbWUsICI4MDIuMTEiKTsKKwlpZihpZWVlLT5tb2R1bGF0aW9uICYgSUVFRTgwMjExX0NDS19NT0RVTEFUSU9OKXsKKwkJc3RyY2F0KHdycXUtPm5hbWUsICJiIik7CisJCWlmKGllZWUtPm1vZHVsYXRpb24gJiBJRUVFODAyMTFfT0ZETV9NT0RVTEFUSU9OKQorCQkJc3RyY2F0KHdycXUtPm5hbWUsICIvZyIpOworCX1lbHNlIGlmKGllZWUtPm1vZHVsYXRpb24gJiBJRUVFODAyMTFfT0ZETV9NT0RVTEFUSU9OKQorCQlzdHJjYXQod3JxdS0+bmFtZSwgImciKTsKKworCWlmKChpZWVlLT5zdGF0ZSA9PSBJRUVFODAyMTFfTElOS0VEKSB8fAorCQkoaWVlZS0+c3RhdGUgPT0gSUVFRTgwMjExX0xJTktFRF9TQ0FOTklORykpCisJCXN0cmNhdCh3cnF1LT5uYW1lLCIgbGlua2VkIik7CisJZWxzZSBpZihpZWVlLT5zdGF0ZSAhPSBJRUVFODAyMTFfTk9MSU5LKQorCQlzdHJjYXQod3JxdS0+bmFtZSwiIGxpbmsuLiIpOworCisKKwlyZXR1cm4gMDsKK30KKworCisvKiB0aGlzIGlzIG1vc3RseSBzdG9sZW4gZnJvbSBob3N0YXAgKi8KK2ludCBpZWVlODAyMTFfd3hfc2V0X3Bvd2VyKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJCSB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlpbnQgcmV0ID0gMDsKKworCWlmKAorCQkoIWllZWUtPnN0YV93YWtlX3VwKSB8fAorCQkoIWllZWUtPnBzX3JlcXVlc3RfdHhfYWNrKSB8fAorCQkoIWllZWUtPmVudGVyX3NsZWVwX3N0YXRlKSB8fAorCQkoIWllZWUtPnBzX2lzX3F1ZXVlX2VtcHR5KSl7CisKKwkJcHJpbnRrKCJFUlJPUi4gUFMgbW9kZSBpcyB0cnlpZWQgdG8gYmUgdXNlIGJ1dFwKK2RyaXZlciBtaXNzZWQgYSBjYWxsYmFja1xuXG4iKTsKKworCQlyZXR1cm4gLTE7CisJfQorCisJZG93bigmaWVlZS0+d3hfc2VtKTsKKworCWlmICh3cnF1LT5wb3dlci5kaXNhYmxlZCl7CisJCWllZWUtPnBzID0gSUVFRTgwMjExX1BTX0RJU0FCTEVEOworCisJCWdvdG8gZXhpdDsKKwl9CisJc3dpdGNoICh3cnF1LT5wb3dlci5mbGFncyAmIElXX1BPV0VSX01PREUpIHsKKwljYXNlIElXX1BPV0VSX1VOSUNBU1RfUjoKKwkJaWVlZS0+cHMgPSBJRUVFODAyMTFfUFNfVU5JQ0FTVDsKKworCQlicmVhazsKKwljYXNlIElXX1BPV0VSX0FMTF9SOgorCQlpZWVlLT5wcyA9IElFRUU4MDIxMV9QU19VTklDQVNUIHwgSUVFRTgwMjExX1BTX01CQ0FTVDsKKwkJYnJlYWs7CisKKwljYXNlIElXX1BPV0VSX09OOgorCQlpZWVlLT5wcyA9IElFRUU4MDIxMV9QU19ESVNBQkxFRDsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGV4aXQ7CisJfQorCisJaWYgKHdycXUtPnBvd2VyLmZsYWdzICYgSVdfUE9XRVJfVElNRU9VVCkgeworCisJCWllZWUtPnBzX3RpbWVvdXQgPSB3cnF1LT5wb3dlci52YWx1ZSAvIDEwMDA7CisJCXByaW50aygiVGltZW91dCAlZFxuIixpZWVlLT5wc190aW1lb3V0KTsKKwl9CisKKwlpZiAod3JxdS0+cG93ZXIuZmxhZ3MgJiBJV19QT1dFUl9QRVJJT0QpIHsKKworCQlyZXQgPSAtRU9QTk9UU1VQUDsKKwkJZ290byBleGl0OworCQkvL3dycS0+dmFsdWUgLyAxMDI0OworCisJfQorZXhpdDoKKwl1cCgmaWVlZS0+d3hfc2VtKTsKKwlyZXR1cm4gcmV0OworCit9CisKKy8qIHRoaXMgaXMgc3RvbGVuIGZyb20gaG9zdGFwICovCitpbnQgaWVlZTgwMjExX3d4X2dldF9wb3dlcihzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCQkgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCQkgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJaW50IHJldCA9MDsKKworCWRvd24oJmllZWUtPnd4X3NlbSk7CisKKwlpZihpZWVlLT5wcyA9PSBJRUVFODAyMTFfUFNfRElTQUJMRUQpeworCQl3cnF1LT5wb3dlci5kaXNhYmxlZCA9IDE7CisJCWdvdG8gZXhpdDsKKwl9CisKKwl3cnF1LT5wb3dlci5kaXNhYmxlZCA9IDA7CisKKy8vCWlmICgod3JxdS0+cG93ZXIuZmxhZ3MgJiBJV19QT1dFUl9UWVBFKSA9PSBJV19QT1dFUl9USU1FT1VUKSB7CisJCXdycXUtPnBvd2VyLmZsYWdzID0gSVdfUE9XRVJfVElNRU9VVDsKKwkJd3JxdS0+cG93ZXIudmFsdWUgPSBpZWVlLT5wc190aW1lb3V0ICogMTAwMDsKKy8vCX0gZWxzZSB7CisvLwkJcmV0ID0gLUVPUE5PVFNVUFA7CisvLwkJZ290byBleGl0OworCQkvL3dycXUtPnBvd2VyLmZsYWdzID0gSVdfUE9XRVJfUEVSSU9EOworCQkvL3dycXUtPnBvd2VyLnZhbHVlID0gaWVlZS0+Y3VycmVudF9uZXR3b3JrLmR0aW1fcGVyaW9kICoKKwkJLy8JaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJlYWNvbl9pbnRlcnZhbCAqIDEwMjQ7CisvLwl9CisKKworCWlmIChpZWVlLT5wcyAmIElFRUU4MDIxMV9QU19NQkNBU1QpCisJCXdycXUtPnBvd2VyLmZsYWdzIHw9IElXX1BPV0VSX0FMTF9SOworCWVsc2UKKwkJd3JxdS0+cG93ZXIuZmxhZ3MgfD0gSVdfUE9XRVJfVU5JQ0FTVF9SOworCitleGl0OgorCXVwKCZpZWVlLT53eF9zZW0pOworCXJldHVybiByZXQ7CisKK30KKworI2lmIDAKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX3d4X2dldF9lc3NpZCk7CitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV93eF9zZXRfZXNzaWQpOworRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfd3hfc2V0X3JhdGUpOworRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfd3hfZ2V0X3JhdGUpOworRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfd3hfc2V0X3dhcCk7CitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV93eF9nZXRfd2FwKTsKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX3d4X3NldF9tb2RlKTsKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX3d4X2dldF9tb2RlKTsKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX3d4X3NldF9zY2FuKTsKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX3d4X2dldF9mcmVxKTsKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX3d4X3NldF9mcmVxKTsKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX3d4X3NldF9yYXd0eCk7CitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV93eF9nZXRfbmFtZSk7CitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV93eF9zZXRfcG93ZXIpOworRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfd3hfZ2V0X3Bvd2VyKTsKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX3dsYW5fZnJlcXVlbmNpZXMpOworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS9pZWVlODAyMTFfdHguYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2llZWU4MDIxMV90eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzYTA2ODcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS9pZWVlODAyMTFfdHguYwpAQCAtMCwwICsxLDgyOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIENvcHlyaWdodChjKSAyMDAzIC0gMjAwNCBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAgbW9yZSBkZXRhaWxzLgorCisgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAgdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorCisgIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQorICBmaWxlIGNhbGxlZCBMSUNFTlNFLgorCisgIENvbnRhY3QgSW5mb3JtYXRpb246CisgIEphbWVzIFAuIEtldHJlbm9zIDxpcHcyMTAwLWFkbWluQGxpbnV4LmludGVsLmNvbT4KKyAgSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICBGZXcgbW9kaWZpY2F0aW9ucyBmb3IgUmVhbHRlaydzIFdpLUZpIGRyaXZlcnMgYnkKKyAgQW5kcmVhIE1lcmVsbG8gPGFuZHJlYW1ybEB0aXNjYWxpLml0PgorCisgIEEgc3BlY2lhbCB0aGFua3MgZ29lcyB0byBSZWFsdGVrIGZvciB0aGVpciBzdXBwb3J0ICEKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KKy8vI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisjaW5jbHVkZSA8bGludXgvaW42Lmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9pcC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvdGNwLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvaWZfdmxhbi5oPgorCisjaW5jbHVkZSAiaWVlZTgwMjExLmgiCisKKworLyoKKworCis4MDIuMTEgRGF0YSBGcmFtZQorCisKKzgwMi4xMSBmcmFtZV9jb250b3JsIGZvciBkYXRhIGZyYW1lcyAtIDIgYnl0ZXMKKyAgICAgLC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLgorYml0cyB8IDAgIHwgIDEgIHwgIDIgIHwgIDMgIHwgIDQgIHwgIDUgIHwgIDYgIHwgIDcgIHwgIDggIHwgIDkgIHwgIGEgIHwgIGIgIHwgIGMgIHwgIGQgIHwgIGUgICB8CisgICAgIHwtLS0tfC0tLS0tfC0tLS0tfC0tLS0tfC0tLS0tfC0tLS0tfC0tLS0tfC0tLS0tfC0tLS0tfC0tLS0tfC0tLS0tfC0tLS0tfC0tLS0tfC0tLS0tfC0tLS0tLXwKK3ZhbCAgfCAwICB8ICAwICB8ICAwICB8ICAxICB8ICB4ICB8ICAwICB8ICAwICB8ICAwICB8ICAxICB8ICAwICB8ICB4ICB8ICB4ICB8ICB4ICB8ICB4ICB8ICB4ICAgfAorICAgICB8LS0tLXwtLS0tLXwtLS0tLXwtLS0tLXwtLS0tLXwtLS0tLXwtLS0tLXwtLS0tLXwtLS0tLXwtLS0tLXwtLS0tLXwtLS0tLXwtLS0tLXwtLS0tLXwtLS0tLS18CitkZXNjIHwgXi12ZXItXiAgfCAgXnR5cGUtXiAgfCAgXi0tLS0tc3VidHlwZS0tLS0tXiAgfCB0byAgfGZyb20gfG1vcmUgfHJldHJ5fCBwd3IgfG1vcmUgfHdlcCAgIHwKKyAgICAgfCAgICAgICAgICB8ICAgICAgICAgICB8IHg9MCBkYXRhLHg9MSBkYXRhK2FjayB8IERTICB8IERTICB8ZnJhZyB8ICAgICB8IG1nbSB8ZGF0YSB8ICAgICAgfAorICAgICAnLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC9cCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorODAyLjExIERhdGEgRnJhbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgLC0tLS0tLS0tLSAnY3RybCcgZXhwYW5kcyB0byA+LS0tLS0tLS0tLS0nCisgICAgICAgICAgfAorICAgICAgLC0tJy0tLSwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLgorQnl0ZXMgfCAgMiAgIHwgIDIgICB8ICAgIDYgICAgfCAgICA2ICAgIHwgICAgNiAgICB8ICAyICAgfCAwLi4yMzEyIHwgICA0ICB8CisgICAgICB8LS0tLS0tfC0tLS0tLXwtLS0tLS0tLS18LS0tLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS18LS0tLS0tLS0tfC0tLS0tLXwKK0Rlc2MuIHwgY3RybCB8IGR1cmEgfCAgREEvUkEgIHwgICBUQSAgICB8ICAgIFNBICAgfCBTZXF1IHwgIEZyYW1lICB8ICBmY3MgfAorICAgICAgfCAgICAgIHwgdGlvbiB8IChCU1NJRCkgfCAgICAgICAgIHwgICAgICAgICB8IGVuY2UgfCAgZGF0YSAgIHwgICAgICB8CisgICAgICBgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18ICAgICAgICAgfC0tLS0tLScKK1RvdGFsOiAyOCBub24tZGF0YSBieXRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAtLS0tLi0tLS0nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAuLSAnRnJhbWUgZGF0YScgZXhwYW5kcyB0byA8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tJworICAgICAgIHwKKyAgICAgICBWCisgICAgICAsLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLgorQnl0ZXMgfCAgMSAgIHwgIDEgICB8ICAgIDEgICAgfCAgICAzICAgICB8ICAyICAgfCAgMC0yMzA0IHwKKyAgICAgIHwtLS0tLS18LS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLS0tfC0tLS0tLXwtLS0tLS0tLS18CitEZXNjLiB8IFNOQVAgfCBTTkFQIHwgQ29udHJvbCB8RXRoIFR1bm5lbHwgVHlwZSB8IElQICAgICAgfAorICAgICAgfCBEU0FQIHwgU1NBUCB8ICAgICAgICAgfCAgICAgICAgICB8ICAgICAgfCBQYWNrZXQgIHwKKyAgICAgIHwgMHhBQSB8IDB4QUEgfDB4MDMgKFVJKXwweDAwLTAwLUY4fCAgICAgIHwgICAgICAgICB8CisgICAgICBgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18ICAgICAgICAgfAorVG90YWw6IDggbm9uLWRhdGEgYnl0ZXMgICAgICAgICAgICAgICAgICAgICAgICAgYC0tLS0uLS0tLScKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgIC4tICdJUCBQYWNrZXQnIGV4cGFuZHMsIGlmIFdFUCBlbmFibGVkLCB0byA8LS0nCisgICAgICAgfAorICAgICAgIFYKKyAgICAgICwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KK0J5dGVzIHwgIDQgIHwgICAwLTIyOTYgIHwgIDQgIHwKKyAgICAgIHwtLS0tLXwtLS0tLS0tLS0tLXwtLS0tLXwKK0Rlc2MuIHwgSVYgIHwgRW5jcnlwdGVkIHwgSUNWIHwKKyAgICAgIHwgICAgIHwgSVAgUGFja2V0IHwgICAgIHwKKyAgICAgIGAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLScKK1RvdGFsOiA4IG5vbi1kYXRhIGJ5dGVzCisKKworODAyLjMgRXRoZXJuZXQgRGF0YSBGcmFtZQorCisgICAgICAsLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCitCeXRlcyB8ICAgNiAgIHwgICA2ICAgfCAgMiAgIHwgIFZhcmlhYmxlIHwgICA0ICB8CisgICAgICB8LS0tLS0tLXwtLS0tLS0tfC0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS18CitEZXNjLiB8IERlc3QuIHwgU291cmNlfCBUeXBlIHwgSVAgUGFja2V0IHwgIGZjcyB8CisgICAgICB8ICBNQUMgIHwgIE1BQyAgfCAgICAgIHwgICAgICAgICAgIHwgICAgICB8CisgICAgICBgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nCitUb3RhbDogMTggbm9uLWRhdGEgYnl0ZXMKKworSW4gdGhlIGV2ZW50IHRoYXQgZnJhZ21lbnRhdGlvbiBpcyByZXF1aXJlZCwgdGhlIGluY29taW5nIHBheWxvYWQgaXMgc3BsaXQgaW50bworTiBwYXJ0cyBvZiBzaXplIGllZWUtPmZ0cy4gIFRoZSBmaXJzdCBmcmFnbWVudCBjb250YWlucyB0aGUgU05BUCBoZWFkZXIgYW5kIHRoZQorcmVtYWluaW5nIHBhY2tldHMgYXJlIGp1c3QgZGF0YS4KKworSWYgZW5jcnlwdGlvbiBpcyBlbmFibGVkLCBlYWNoIGZyYWdtZW50IHBheWxvYWQgc2l6ZSBpcyByZWR1Y2VkIGJ5IGVub3VnaCBzcGFjZQordG8gYWRkIHRoZSBwcmVmaXggYW5kIHBvc3RmaXggKElWIGFuZCBJQ1YgdG90YWxsaW5nIDggYnl0ZXMgaW4gdGhlIGNhc2Ugb2YgV0VQKQorU28gaWYgeW91IGhhdmUgMTUwMCBieXRlcyBvZiBwYXlsb2FkIHdpdGggaWVlZS0+ZnRzIHNldCB0byA1MDAgd2l0aG91dAorZW5jcnlwdGlvbiBpdCB3aWxsIHRha2UgMyBmcmFtZXMuICBXaXRoIFdFUCBpdCB3aWxsIHRha2UgNCBmcmFtZXMgYXMgdGhlCitwYXlsb2FkIG9mIGVhY2ggZnJhbWUgaXMgcmVkdWNlZCB0byA0OTIgYnl0ZXMuCisKKyogU0tCIHZpc3VhbGl6YXRpb24KKyoKKyogICwtIHNrYi0+ZGF0YQorKiB8CisqIHwgICAgRVRIRVJORVQgSEVBREVSICAgICAgICAsLTwtLSBQQVlMT0FECisqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAxNCBieXRlcyBmcm9tIHNrYi0+ZGF0YQorKiB8ICAyIGJ5dGVzIGZvciBUeXBlIC0tPiAsVC4gfCAgICAgKHNpemVvZiBldGhoZHIpCisqIHwgICAgICAgICAgICAgICAgICAgICAgIHwgfCB8CisqIHwsLURlc3QuLS0uICwtLVNyYy4tLS0uIHwgfCB8CisqIHwgIDYgYnl0ZXN8IHwgNiBieXRlcyB8IHwgfCB8CisqIHYgICAgICAgICB8IHwgICAgICAgICB8IHwgfCB8CisqIDAgICAgICAgICB8IHYgICAgICAgMSB8IHYgfCB2ICAgICAgICAgICAyCisqIDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNQorKiAgICAgXiAgICAgfCBeICAgICAgICAgfCBeIHwKKyogICAgIHwgICAgIHwgfCAgICAgICAgIHwgfCB8CisqICAgICB8ICAgICB8IHwgICAgICAgICB8IGBUJyA8LS0tLSAyIGJ5dGVzIGZvciBUeXBlCisqICAgICB8ICAgICB8IHwgICAgICAgICB8CisqICAgICB8ICAgICB8ICctLS1TTkFQLS0nIDwtLS0tLS0tLSA2IGJ5dGVzIGZvciBTTkFQCisqICAgICB8ICAgICB8CisqICAgICBgLUlWLS0nIDwtLS0tLS0tLS0tLS0tLS0tLS0tLSA0IGJ5dGVzIGZvciBJViAoV0VQKQorKgorKiAgICAgIFNOQVAgSEVBREVSCisqCisqLworCitzdGF0aWMgdTggUDgwMl8xSF9PVUlbUDgwMjExX09VSV9MRU5dID0geyAweDAwLCAweDAwLCAweGY4IH07CitzdGF0aWMgdTggUkZDMTA0Ml9PVUlbUDgwMjExX09VSV9MRU5dID0geyAweDAwLCAweDAwLCAweDAwIH07CisKK3N0YXRpYyBpbmxpbmUgaW50IGllZWU4MDIxMV9wdXRfc25hcCh1OCAqZGF0YSwgdTE2IGhfcHJvdG8pCit7CisJc3RydWN0IGllZWU4MDIxMV9zbmFwX2hkciAqc25hcDsKKwl1OCAqb3VpOworCisJc25hcCA9IChzdHJ1Y3QgaWVlZTgwMjExX3NuYXBfaGRyICopZGF0YTsKKwlzbmFwLT5kc2FwID0gMHhhYTsKKwlzbmFwLT5zc2FwID0gMHhhYTsKKwlzbmFwLT5jdHJsID0gMHgwMzsKKworCWlmIChoX3Byb3RvID09IDB4ODEzNyB8fCBoX3Byb3RvID09IDB4ODBmMykKKwkJb3VpID0gUDgwMl8xSF9PVUk7CisJZWxzZQorCQlvdWkgPSBSRkMxMDQyX09VSTsKKwlzbmFwLT5vdWlbMF0gPSBvdWlbMF07CisJc25hcC0+b3VpWzFdID0gb3VpWzFdOworCXNuYXAtPm91aVsyXSA9IG91aVsyXTsKKworCSoodTE2ICopKGRhdGEgKyBTTkFQX1NJWkUpID0gaHRvbnMoaF9wcm90byk7CisKKwlyZXR1cm4gU05BUF9TSVpFICsgc2l6ZW9mKHUxNik7Cit9CisKK2ludCBpZWVlODAyMTFfZW5jcnlwdF9mcmFnbWVudCgKKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwlzdHJ1Y3Qgc2tfYnVmZiAqZnJhZywKKwlpbnQgaGRyX2xlbikKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEqIGNyeXB0ID0gaWVlZS0+Y3J5cHRbaWVlZS0+dHhfa2V5aWR4XTsKKwlpbnQgcmVzOworCisgLyphZGRlZCB0byBjYXJlIGFib3V0IG51bGwgY3J5cHQgY29uZGl0aW9uLCB0byBzb2x2ZSB0aGF0IHN5c3RlbSBoYW5ncyB3aGVuIHNoYXJlZCBrZXlzIGVycm9yKi8KKyAgICAgICAgaWYgKCFjcnlwdCB8fCAhY3J5cHQtPm9wcykKKyAgICAgICAgcmV0dXJuIC0xOworCisjaWZkZWYgQ09ORklHX0lFRUU4MDIxMV9DUllQVF9US0lQCisJc3RydWN0IGllZWU4MDIxMV9oZHIgKmhlYWRlcjsKKworCWlmIChpZWVlLT50a2lwX2NvdW50ZXJtZWFzdXJlcyAmJgorCSAgICBjcnlwdCAmJiBjcnlwdC0+b3BzICYmIHN0cmNtcChjcnlwdC0+b3BzLT5uYW1lLCAiVEtJUCIpID09IDApIHsKKwkJaGVhZGVyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopIGZyYWctPmRhdGE7CisJCWlmIChuZXRfcmF0ZWxpbWl0KCkpIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogVEtJUCBjb3VudGVybWVhc3VyZXM6IGRyb3BwZWQgIgorCQkJICAgICAgICJUWCBwYWNrZXQgdG8gIiBNQUNfRk1UICJcbiIsCisJCQkgICAgICAgaWVlZS0+ZGV2LT5uYW1lLCBNQUNfQVJHKGhlYWRlci0+YWRkcjEpKTsKKwkJfQorCQlyZXR1cm4gLTE7CisJfQorI2VuZGlmCisJLyogVG8gZW5jcnlwdCwgZnJhbWUgZm9ybWF0IGlzOgorCSAqIElWICg0IGJ5dGVzKSwgY2xlYXIgcGF5bG9hZCAoaW5jbHVkaW5nIFNOQVApLCBJQ1YgKDQgYnl0ZXMpICovCisKKwkvLyBQUjogRklYTUU6IENvcGllZCBmcm9tIGhvc3RhcC4gQ2hlY2sgZnJhZ21lbnRhdGlvbi9NU0RVL01QRFUgZW5jcnlwdGlvbi4KKwkvKiBIb3N0LWJhc2VkIElFRUUgODAyLjExIGZyYWdtZW50YXRpb24gZm9yIFRYIGlzIG5vdCB5ZXQgc3VwcG9ydGVkLCBzbworCSAqIGNhbGwgYm90aCBNU0RVIGFuZCBNUERVIGVuY3J5cHRpb24gZnVuY3Rpb25zIGZyb20gaGVyZS4gKi8KKwlhdG9taWNfaW5jKCZjcnlwdC0+cmVmY250KTsKKwlyZXMgPSAwOworCWlmIChjcnlwdC0+b3BzLT5lbmNyeXB0X21zZHUpCisJCXJlcyA9IGNyeXB0LT5vcHMtPmVuY3J5cHRfbXNkdShmcmFnLCBoZHJfbGVuLCBjcnlwdC0+cHJpdik7CisJaWYgKHJlcyA9PSAwICYmIGNyeXB0LT5vcHMtPmVuY3J5cHRfbXBkdSkKKwkJcmVzID0gY3J5cHQtPm9wcy0+ZW5jcnlwdF9tcGR1KGZyYWcsIGhkcl9sZW4sIGNyeXB0LT5wcml2KTsKKworCWF0b21pY19kZWMoJmNyeXB0LT5yZWZjbnQpOworCWlmIChyZXMgPCAwKSB7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBFbmNyeXB0aW9uIGZhaWxlZDogbGVuPSVkLlxuIiwKKwkJICAgICAgIGllZWUtPmRldi0+bmFtZSwgZnJhZy0+bGVuKTsKKwkJaWVlZS0+aWVlZV9zdGF0cy50eF9kaXNjYXJkcysrOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKwordm9pZCBpZWVlODAyMTFfdHhiX2ZyZWUoc3RydWN0IGllZWU4MDIxMV90eGIgKnR4YikgeworCWludCBpOworCWlmICh1bmxpa2VseSghdHhiKSkKKwkJcmV0dXJuOworCWZvciAoaSA9IDA7IGkgPCB0eGItPm5yX2ZyYWdzOyBpKyspCisJCWlmICh0eGItPmZyYWdtZW50c1tpXSkKKwkJCWRldl9rZnJlZV9za2JfYW55KHR4Yi0+ZnJhZ21lbnRzW2ldKTsKKwlrZnJlZSh0eGIpOworfQorCitzdHJ1Y3QgaWVlZTgwMjExX3R4YiAqaWVlZTgwMjExX2FsbG9jX3R4YihpbnQgbnJfZnJhZ3MsIGludCB0eGJfc2l6ZSwKKwkJCQkJICBpbnQgZ2ZwX21hc2spCit7CisJc3RydWN0IGllZWU4MDIxMV90eGIgKnR4YjsKKwlpbnQgaTsKKwl0eGIgPSBrbWFsbG9jKAorCQlzaXplb2Yoc3RydWN0IGllZWU4MDIxMV90eGIpICsgKHNpemVvZih1OCopICogbnJfZnJhZ3MpLAorCQlnZnBfbWFzayk7CisJaWYgKCF0eGIpCisJCXJldHVybiBOVUxMOworCisJbWVtc2V0KHR4YiwgMCwgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfdHhiKSk7CisJdHhiLT5ucl9mcmFncyA9IG5yX2ZyYWdzOworCXR4Yi0+ZnJhZ19zaXplID0gdHhiX3NpemU7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnJfZnJhZ3M7IGkrKykgeworCQl0eGItPmZyYWdtZW50c1tpXSA9IGRldl9hbGxvY19za2IodHhiX3NpemUpOworCQlpZiAodW5saWtlbHkoIXR4Yi0+ZnJhZ21lbnRzW2ldKSkgeworCQkJaS0tOworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKHVubGlrZWx5KGkgIT0gbnJfZnJhZ3MpKSB7CisJCXdoaWxlIChpID49IDApCisJCQlkZXZfa2ZyZWVfc2tiX2FueSh0eGItPmZyYWdtZW50c1tpLS1dKTsKKwkJa2ZyZWUodHhiKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCXJldHVybiB0eGI7Cit9CisKKy8vIENsYXNzaWZ5IHRoZSB0by1iZSBzZW5kIGRhdGEgcGFja2V0CisvLyBOZWVkIHRvIGFjcXVpcmUgdGhlIHNlbnQgcXVldWUgaW5kZXguCitzdGF0aWMgaW50CitpZWVlODAyMTFfY2xhc3NpZnkoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpuZXR3b3JrKQoreworICBzdHJ1Y3QgZXRoZXJfaGVhZGVyICplaCA9IChzdHJ1Y3QgZXRoZXJfaGVhZGVyKilza2ItPmRhdGE7CisgIHVuc2lnbmVkIGludCB3bWVfVVAgPSAwOworCisgIGlmKCFuZXR3b3JrLT5Rb1NfRW5hYmxlKSB7CisgICAgIHNrYi0+cHJpb3JpdHkgPSAwOworICAgICByZXR1cm4od21lX1VQKTsKKyAgfQorCisgIGlmKGVoLT5ldGhlcl90eXBlID09IF9fY29uc3RhbnRfaHRvbnMoRVRIRVJUWVBFX0lQKSkgeworICAgIGNvbnN0IHN0cnVjdCBpcGhkciAqaWggPSAoc3RydWN0IGlwaGRyKikoc2tiLT5kYXRhICsgXAorCQkgICAgc2l6ZW9mKHN0cnVjdCBldGhlcl9oZWFkZXIpKTsKKyAgICB3bWVfVVAgPSAoaWgtPnRvcyA+PiA1KSYweDA3OworICB9IGVsc2UgaWYgKHZsYW5fdHhfdGFnX3ByZXNlbnQoc2tiKSkgey8vdnRhZyBwYWNrZXQKKyNpZm5kZWYgVkxBTl9QUklfU0hJRlQKKyNkZWZpbmUgVkxBTl9QUklfU0hJRlQgIDEzICAgICAgICAgICAgICAvKiBTaGlmdCB0byBmaW5kIFZMQU4gdXNlciBwcmlvcml0eSAqLworI2RlZmluZSBWTEFOX1BSSV9NQVNLICAgNyAgICAgICAgICAgICAgIC8qIE1hc2sgZm9yIHVzZXIgcHJpb3JpdHkgYml0cyBpbiBWTEFOICovCisjZW5kaWYKKwl1MzIgdGFnID0gdmxhbl90eF90YWdfZ2V0KHNrYik7CisJd21lX1VQID0gKHRhZyA+PiBWTEFOX1BSSV9TSElGVCkgJiBWTEFOX1BSSV9NQVNLOworICB9IGVsc2UgaWYoRVRIX1BfUEFFID09ICBudG9ocygoKHN0cnVjdCBldGhoZHIgKilza2ItPmRhdGEpLT5oX3Byb3RvKSkgeworICAgIC8vcHJpbnRrKEtFUk5fV0FSTklORyAidHlwZSA9IG5vcm1hbCBwYWNrZXRcbiIpOworICAgIHdtZV9VUCA9IDc7CisgIH0KKworICBza2ItPnByaW9yaXR5ID0gd21lX1VQOworICByZXR1cm4od21lX1VQKTsKK30KKworI2lmZGVmIF9SVEw4MTg3X0VYVF9QQVRDSF8KKy8vIGJhc2VkIG9uIHBhcnQgb2YgaWVlZTgwMjExX3htaXQuIE1haW5seSBhbGxvY2F0ZSB0eGIuIGllZWUtPmxvY2sgaXMgaGVsZAorc3RydWN0IGllZWU4MDIxMV90eGIgKmllZWU4MDIxMV9leHRfYWxsb2NfdHhiKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICpoZWFkZXIsIGludCBoZHJfbGVuLCB1OCBpc1FvUywgdTE2ICpwUU9TX2N0bCwgaW50IGlzRW5jcnlwdCwgc3RydWN0IGllZWU4MDIxMV9jcnlwdF9kYXRhKiBjcnlwdCkKK3sKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNSwwKSkKKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSA9IG5ldGRldl9wcml2KGRldik7CisjZWxzZQorCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlID0gKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICopZGV2LT5wcml2OworI2VuZGlmCisJc3RydWN0IGllZWU4MDIxMV90eGIgKnR4YiA9IE5VTEw7CisJc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgKmZyYWdfaGRyOworCWludCBpLCBieXRlc19wZXJfZnJhZywgbnJfZnJhZ3MsIGJ5dGVzX2xhc3RfZnJhZywgZnJhZ19zaXplOworCWludCBldGhlcl90eXBlOworCWludCBieXRlcywgUU9TX2N0bDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiX2ZyYWc7CisKKwlldGhlcl90eXBlID0gbnRvaHMoKChzdHJ1Y3QgZXRoaGRyICopc2tiLT5kYXRhKS0+aF9wcm90byk7CisKKwkvKiBBZHZhbmNlIHRoZSBTS0IgdG8gdGhlIHN0YXJ0IG9mIHRoZSBwYXlsb2FkICovCisJc2tiX3B1bGwoc2tiLCBzaXplb2Yoc3RydWN0IGV0aGhkcikpOworCisJLyogRGV0ZXJtaW5lIHRvdGFsIGFtb3VudCBvZiBzdG9yYWdlIHJlcXVpcmVkIGZvciBUWEIgcGFja2V0cyAqLworCWJ5dGVzID0gc2tiLT5sZW4gKyBTTkFQX1NJWkUgKyBzaXplb2YodTE2KTsKKworCS8qIERldGVybWluZSBmcmFnbWVudGF0aW9uIHNpemUgYmFzZWQgb24gZGVzdGluYXRpb24gKG11bHRpY2FzdAorCSAqIGFuZCBicm9hZGNhc3QgYXJlIG5vdCBmcmFnbWVudGVkKSAqLworCS8vIGlmIChpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihkZXN0KSB8fAorCS8vIGlzX2Jyb2FkY2FzdF9ldGhlcl9hZGRyKGRlc3QpKSB7CisJaWYgKGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKGhlYWRlci0+YWRkcjEpIHx8CisJCQlpc19icm9hZGNhc3RfZXRoZXJfYWRkcihoZWFkZXItPmFkZHIxKSkgeworCQlmcmFnX3NpemUgPSBNQVhfRlJBR19USFJFU0hPTEQ7CisJCVFPU19jdGwgPSBRT1NfQ1RMX05PVENPTlRBSU5fQUNLOworCX0KKwllbHNlIHsKKwkJLy9wcmludGsoS0VSTl9XQVJOSU5HICImJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiZmcmFnX3NpemUgPSAlZFxuIiwgZnJhZ19zaXplKTsKKwkJZnJhZ19zaXplID0gaWVlZS0+ZnRzOy8vZGVmYXVsdDozOTIKKwkJUU9TX2N0bCA9IDA7CisJfQorCisJaWYoaXNRb1MpIHsKKwkJUU9TX2N0bCB8PSBza2ItPnByaW9yaXR5OyAvL3NldCBpbiB0aGUgaWVlZTgwMjExX2NsYXNzaWZ5CisJCSpwUU9TX2N0bCA9IGNwdV90b19sZTE2KFFPU19jdGwpOworCX0KKwkvL3ByaW50ayhLRVJOX1dBUk5JTkcgImhlYWRlciBzaXplID0gJWQsIFFPU19jdGwgPSAleFxuIiwgaGRyX2xlbixRT1NfY3RsKTsKKwkvKiBEZXRlcm1pbmUgYW1vdW50IG9mIHBheWxvYWQgcGVyIGZyYWdtZW50LiAgUmVnYXJkbGVzcyBvZiBpZgorCSAqIHRoaXMgc3RhY2sgaXMgcHJvdmlkaW5nIHRoZSBmdWxsIDgwMi4xMSBoZWFkZXIsIG9uZSB3aWxsCisJICogZXZlbnR1YWxseSBiZSBhZmZpeGVkIHRvIHRoaXMgZnJhZ21lbnQgLS0gc28gd2UgbXVzdCBhY2NvdW50IGZvcgorCSAqIGl0IHdoZW4gZGV0ZXJtaW5pbmcgdGhlIGFtb3VudCBvZiBwYXlsb2FkIHNwYWNlLiAqLworCS8vYnl0ZXNfcGVyX2ZyYWcgPSBmcmFnX3NpemUgLSAoSUVFRTgwMjExXzNBRERSX0xFTiArIChpZWVlLT5jdXJyZW50X25ldHdvcmstPlFvU19FbmFibGUgPyAyOjApKTsKKwlieXRlc19wZXJfZnJhZyA9IGZyYWdfc2l6ZSAtIGhkcl9sZW47CisJaWYgKGllZWUtPmNvbmZpZyAmCisJCQkoQ0ZHX0lFRUU4MDIxMV9DT01QVVRFX0ZDUyB8IENGR19JRUVFODAyMTFfUkVTRVJWRV9GQ1MpKQorCQlieXRlc19wZXJfZnJhZyAtPSBJRUVFODAyMTFfRkNTX0xFTjsKKworCS8qIEVhY2ggZnJhZ21lbnQgbWF5IG5lZWQgdG8gaGF2ZSByb29tIGZvciBlbmNyeXB0aW9uZyBwcmUvcG9zdGZpeCAqLworCWlmIChpc0VuY3J5cHQpCisJCWJ5dGVzX3Blcl9mcmFnIC09IGNyeXB0LT5vcHMtPmV4dHJhX3ByZWZpeF9sZW4gKworCQkJY3J5cHQtPm9wcy0+ZXh0cmFfcG9zdGZpeF9sZW47CisKKwkvKiBOdW1iZXIgb2YgZnJhZ21lbnRzIGlzIHRoZSB0b3RhbCBieXRlc19wZXJfZnJhZyAvCisJICogcGF5bG9hZF9wZXJfZnJhZ21lbnQgKi8KKwlucl9mcmFncyA9IGJ5dGVzIC8gYnl0ZXNfcGVyX2ZyYWc7CisJYnl0ZXNfbGFzdF9mcmFnID0gYnl0ZXMgJSBieXRlc19wZXJfZnJhZzsKKwlpZiAoYnl0ZXNfbGFzdF9mcmFnKQorCQlucl9mcmFncysrOworCWVsc2UKKwkJYnl0ZXNfbGFzdF9mcmFnID0gYnl0ZXNfcGVyX2ZyYWc7CisKKwkvKiBXaGVuIHdlIGFsbG9jYXRlIHRoZSBUWEIgd2UgYWxsb2NhdGUgZW5vdWdoIHNwYWNlIGZvciB0aGUgcmVzZXJ2ZQorCSAqIGFuZCBmdWxsIGZyYWdtZW50IGJ5dGVzIChieXRlc19wZXJfZnJhZyBkb2Vzbid0IGluY2x1ZGUgcHJlZml4LAorCSAqIHBvc3RmaXgsIGhlYWRlciwgRkNTLCBldGMuKSAqLworCXR4YiA9IGllZWU4MDIxMV9hbGxvY190eGIobnJfZnJhZ3MsIGZyYWdfc2l6ZSwgR0ZQX0FUT01JQyk7CisJaWYgKHVubGlrZWx5KCF0eGIpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBDb3VsZCBub3QgYWxsb2NhdGUgVFhCXG4iLAorCQkJaWVlZS0+ZGV2LT5uYW1lKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCXR4Yi0+ZW5jcnlwdGVkID0gaXNFbmNyeXB0OworCXR4Yi0+cGF5bG9hZF9zaXplID0gYnl0ZXM7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnJfZnJhZ3M7IGkrKykgeworCQlza2JfZnJhZyA9IHR4Yi0+ZnJhZ21lbnRzW2ldOworCQlza2JfZnJhZy0+cHJpb3JpdHkgPSBVUDJBQyhza2ItPnByaW9yaXR5KTsKKwkJaWYgKGlzRW5jcnlwdCkKKwkJCXNrYl9yZXNlcnZlKHNrYl9mcmFnLCBjcnlwdC0+b3BzLT5leHRyYV9wcmVmaXhfbGVuKTsKKworCQlmcmFnX2hkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciAqKXNrYl9wdXQoc2tiX2ZyYWcsIGhkcl9sZW4pOworCQltZW1jcHkoZnJhZ19oZHIsICh2b2lkICopaGVhZGVyLCBoZHJfbGVuKTsKKworCQkvKiBJZiB0aGlzIGlzIG5vdCB0aGUgbGFzdCBmcmFnbWVudCwgdGhlbiBhZGQgdGhlIE1PUkVGUkFHUworCQkgKiBiaXQgdG8gdGhlIGZyYW1lIGNvbnRyb2wgKi8KKwkJaWYgKGkgIT0gbnJfZnJhZ3MgLSAxKSB7CisJCQlmcmFnX2hkci0+ZnJhbWVfY3RsID0gY3B1X3RvX2xlMTYoCisJCQkJCWhlYWRlci0+ZnJhbWVfY3RsIHwgSUVFRTgwMjExX0ZDVExfTU9SRUZSQUdTKTsKKwkJCWJ5dGVzID0gYnl0ZXNfcGVyX2ZyYWc7CisKKwkJfSBlbHNlIHsKKwkJCS8qIFRoZSBsYXN0IGZyYWdtZW50IHRha2VzIHRoZSByZW1haW5pbmcgbGVuZ3RoICovCisJCQlieXRlcyA9IGJ5dGVzX2xhc3RfZnJhZzsKKwkJfQorCisJCWZyYWdfaGRyLT5zZXFfY3RsID0gY3B1X3RvX2xlMTYoaWVlZS0+c2VxX2N0cmxbMF08PDQgfCBpKTsKKwkJLy9mcmFnX2hkci0+c2VxX2N0bCA9IGNwdV90b19sZTE2KGllZWUtPnNlcV9jdHJsPDw0IHwgaSk7CisJCS8vCisKKwkJLyogUHV0IGEgU05BUCBoZWFkZXIgb24gdGhlIGZpcnN0IGZyYWdtZW50ICovCisJCWlmIChpID09IDApIHsKKwkJCWllZWU4MDIxMV9wdXRfc25hcCgKKwkJCQlza2JfcHV0KHNrYl9mcmFnLCBTTkFQX1NJWkUgKyBzaXplb2YodTE2KSksIGV0aGVyX3R5cGUpOworCQkJYnl0ZXMgLT0gU05BUF9TSVpFICsgc2l6ZW9mKHUxNik7CisJCX0KKworCQltZW1jcHkoc2tiX3B1dChza2JfZnJhZywgYnl0ZXMpLCBza2ItPmRhdGEsIGJ5dGVzKTsKKworCQkvKiBBZHZhbmNlIHRoZSBTS0IuLi4gKi8KKwkJc2tiX3B1bGwoc2tiLCBieXRlcyk7CisKKwkJLyogRW5jcnlwdGlvbiByb3V0aW5lIHdpbGwgbW92ZSB0aGUgaGVhZGVyIGZvcndhcmQgaW4gb3JkZXIKKwkJICogdG8gaW5zZXJ0IHRoZSBJViBiZXR3ZWVuIHRoZSBoZWFkZXIgYW5kIHRoZSBwYXlsb2FkICovCisJCWlmIChpc0VuY3J5cHQpCisJCQlpZWVlODAyMTFfZW5jcnlwdF9mcmFnbWVudChpZWVlLCBza2JfZnJhZywgaGRyX2xlbik7CisJCWlmIChpZWVlLT5jb25maWcgJgorCQkJCShDRkdfSUVFRTgwMjExX0NPTVBVVEVfRkNTIHwgQ0ZHX0lFRUU4MDIxMV9SRVNFUlZFX0ZDUykpCisJCQlza2JfcHV0KHNrYl9mcmFnLCA0KTsKKwl9CisJLy8gQWR2YW5jZSBzZXF1ZW5jZSBudW1iZXIgaW4gZGF0YSBmcmFtZS4KKwkvL3ByaW50ayhLRVJOX1dBUk5JTkcgIlFvUyBFbmFsYmVkPyAlc1xuIiwgaWVlZS0+Y3VycmVudF9uZXR3b3JrLlFvU19FbmFibGU/IlkiOiJOIik7CisJaWYgKGllZWUtPnNlcV9jdHJsWzBdID09IDB4RkZGKQorCQlpZWVlLT5zZXFfY3RybFswXSA9IDA7CisJZWxzZQorCQlpZWVlLT5zZXFfY3RybFswXSsrOworCS8vIHN0YW5sZXksIGp1c3QgZm9yIGRlYnVnCisvKgoreworCWludCBqPTA7CisJZm9yKGo9MDtqPG5yX2ZyYWdzO2orKykKKwl7CisJCQlpbnQgaTsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHR4Yi0+ZnJhZ21lbnRzW2pdOworCQkJcHJpbnRrKCJzZW5kKCVkKTogIiwgaik7CisJCQlmb3IgKGk9MDtpPHNrYi0+bGVuO2krKykKKwkJCQlwcmludGsoIiUwMlggIiwgc2tiLT5kYXRhW2ldJjB4ZmYpOworCQkJcHJpbnRrKCJcbiIpOworCX0KK30KKyovCisKKwlyZXR1cm4gdHhiOworfQorCisKKy8vIGJhc2VkIG9uIHBhcnQgb2YgaWVlZTgwMjExX3htaXQuIE1haW5seSBhbGxvY2F0ZSB0eGIuIGllZWUtPmxvY2sgaXMgaGVsZAorLy8gQXNzdW1lIG5vIGVuY3J5cHRpb24sIG5vIEZDUyBjb21wdXRpbmcKK3N0cnVjdCBpZWVlODAyMTFfdHhiICppZWVlODAyMTFfZXh0X3JldXNlX3R4YihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciAqaGVhZGVyLCBpbnQgaGRyX2xlbiwgdTggaXNRb1MsIHUxNiAqcFFPU19jdGwsIGludCBpc0VuY3J5cHQsIHN0cnVjdCBpZWVlODAyMTFfY3J5cHRfZGF0YSogY3J5cHQpCit7CisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDUsMCkpCisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUgPSBuZXRkZXZfcHJpdihkZXYpOworI2Vsc2UKKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSA9IChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqKWRldi0+cHJpdjsKKyNlbmRpZgorCXN0cnVjdCBpZWVlODAyMTFfdHhiICp0eGIgPSBOVUxMOworCXN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICpmcmFnX2hkcjsKKwlpbnQgZXRoZXJfdHlwZTsKKwlpbnQgYnl0ZXMsIFFPU19jdGw7CisKKwlldGhlcl90eXBlID0gbnRvaHMoKChzdHJ1Y3QgZXRoaGRyICopc2tiLT5kYXRhKS0+aF9wcm90byk7CisKKwkvKiBBZHZhbmNlIHRoZSBTS0IgdG8gdGhlIHN0YXJ0IG9mIHRoZSBwYXlsb2FkICovCisJc2tiX3B1bGwoc2tiLCBzaXplb2Yoc3RydWN0IGV0aGhkcikpOworCisJLyogRGV0ZXJtaW5lIHRvdGFsIGFtb3VudCBvZiBzdG9yYWdlIHJlcXVpcmVkIGZvciBUWEIgcGFja2V0cyAqLworCWJ5dGVzID0gc2tiLT5sZW4gKyBTTkFQX1NJWkUgKyBzaXplb2YodTE2KTsKKworCWlmIChpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihoZWFkZXItPmFkZHIxKSB8fAorCQkJaXNfYnJvYWRjYXN0X2V0aGVyX2FkZHIoaGVhZGVyLT5hZGRyMSkpIHsKKwkJUU9TX2N0bCA9IFFPU19DVExfTk9UQ09OVEFJTl9BQ0s7CisJfQorCWVsc2UgeworCQlRT1NfY3RsID0gMDsKKwl9CisKKwlpZihpc1FvUykgeworCQlRT1NfY3RsIHw9IHNrYi0+cHJpb3JpdHk7IC8vc2V0IGluIHRoZSBpZWVlODAyMTFfY2xhc3NpZnkKKwkJKnBRT1NfY3RsID0gY3B1X3RvX2xlMTYoUU9TX2N0bCk7CisJfQorCisJdHhiID0ga21hbGxvYyggc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfdHhiKSArIHNpemVvZih1OCopLCBHRlBfQVRPTUlDICk7CisJaWYgKHVubGlrZWx5KCF0eGIpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBDb3VsZCBub3QgYWxsb2NhdGUgVFhCXG4iLAorCQkJaWVlZS0+ZGV2LT5uYW1lKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJdHhiLT5ucl9mcmFncyA9IDE7CisJdHhiLT5mcmFnX3NpemUgPSBieXRlczsKKwl0eGItPmVuY3J5cHRlZCA9IGlzRW5jcnlwdDsKKwl0eGItPnBheWxvYWRfc2l6ZSA9IGJ5dGVzOworCisJdHhiLT5mcmFnbWVudHNbMF0gPSBza2I7CisJaWVlZTgwMjExX3B1dF9zbmFwKAorCQkJc2tiX3B1c2goc2tiLCBTTkFQX1NJWkUgKyBzaXplb2YodTE2KSksIGV0aGVyX3R5cGUpOworCWZyYWdfaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICopc2tiX3B1c2goc2tiLCBoZHJfbGVuKTsKKwltZW1jcHkoZnJhZ19oZHIsICh2b2lkICopaGVhZGVyLCBoZHJfbGVuKTsKKwlmcmFnX2hkci0+c2VxX2N0bCA9IGNwdV90b19sZTE2KGllZWUtPnNlcV9jdHJsWzBdPDw0IHwgMCk7CisJc2tiLT5wcmlvcml0eSA9IFVQMkFDKHNrYi0+cHJpb3JpdHkpOworCisJLy8gQWR2YW5jZSBzZXF1ZW5jZSBudW1iZXIgaW4gZGF0YSBmcmFtZS4KKwkvL3ByaW50ayhLRVJOX1dBUk5JTkcgIlFvUyBFbmFsYmVkPyAlc1xuIiwgaWVlZS0+Y3VycmVudF9uZXR3b3JrLlFvU19FbmFibGU/IlkiOiJOIik7CisJaWYgKGllZWUtPnNlcV9jdHJsWzBdID09IDB4RkZGKQorCQlpZWVlLT5zZXFfY3RybFswXSA9IDA7CisJZWxzZQorCQlpZWVlLT5zZXFfY3RybFswXSsrOworCisJcmV0dXJuIHR4YjsKK30KKworI2VuZGlmIC8vIF9SVEw4MTg3X0VYVF9QQVRDSF8KKworLyogU0tCcyBhcmUgYWRkZWQgdG8gdGhlIGllZWUtPnR4X3F1ZXVlLiAqLworaW50IGllZWU4MDIxMV94bWl0KHN0cnVjdCBza19idWZmICpza2IsCisJCSAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBpZWVlODAyMTFfdHhiICp0eGIgPSBOVUxMOworCXN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyX1FPUyAqZnJhZ19oZHI7CisJaW50IGksIGJ5dGVzX3Blcl9mcmFnLCBucl9mcmFncywgYnl0ZXNfbGFzdF9mcmFnLCBmcmFnX3NpemU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSAmaWVlZS0+c3RhdHM7CisJaW50IGV0aGVyX3R5cGUsIGVuY3J5cHQ7CisJaW50IGJ5dGVzLCBmYywgUU9TX2N0bCwgaGRyX2xlbjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiX2ZyYWc7CisJLy9zdHJ1Y3QgaWVlZTgwMjExX2hkciBoZWFkZXIgPSB7IC8qIEVuc3VyZSB6ZXJvIGluaXRpYWxpemVkICovCisJLy8JLmR1cmF0aW9uX2lkID0gMCwKKwkvLwkuc2VxX2N0bCA9IDAKKwkvL307CisJc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHJfUU9TIGhlYWRlciA9IHsgLyogRW5zdXJlIHplcm8gaW5pdGlhbGl6ZWQgKi8KKwkJLmR1cmF0aW9uX2lkID0gMCwKKwkJLnNlcV9jdGwgPSAwLAorCQkuUU9TX2N0bCA9IDAKKwl9OworCXU4IGRlc3RbRVRIX0FMRU5dLCBzcmNbRVRIX0FMRU5dOworCisJc3RydWN0IGllZWU4MDIxMV9jcnlwdF9kYXRhKiBjcnlwdDsKKworCS8vcHJpbnRrKEtFUk5fV0FSTklORyAidXBwZXIgbGF5ZXIgcGFja2V0IVxuIik7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKKworCS8qIElmIHRoZXJlIGlzIG5vIGRyaXZlciBoYW5kbGVyIHRvIHRha2UgdGhlIFRYQiwgZG9udCcgYm90aGVyCisJICogY3JlYXRpbmcgaXQuLi4gKi8KKwlpZiAoKCFpZWVlLT5oYXJkX3N0YXJ0X3htaXQgJiYgIShpZWVlLT5zb2Z0bWFjX2ZlYXR1cmVzICYgSUVFRV9TT0ZUTUFDX1RYX1FVRVVFKSl8fAorCSAgICgoIWllZWUtPnNvZnRtYWNfZGF0YV9oYXJkX3N0YXJ0X3htaXQgJiYgKGllZWUtPnNvZnRtYWNfZmVhdHVyZXMgJiBJRUVFX1NPRlRNQUNfVFhfUVVFVUUpKSkpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IE5vIHhtaXQgaGFuZGxlci5cbiIsCisJCSAgICAgICBpZWVlLT5kZXYtPm5hbWUpOworCQlnb3RvIHN1Y2Nlc3M7CisJfQorCisJaWVlZTgwMjExX2NsYXNzaWZ5KHNrYiwmaWVlZS0+Y3VycmVudF9uZXR3b3JrKTsKKwlpZihsaWtlbHkoaWVlZS0+cmF3X3R4ID09IDApKXsKKworCQlpZiAodW5saWtlbHkoc2tiLT5sZW4gPCBTTkFQX1NJWkUgKyBzaXplb2YodTE2KSkpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBza2IgdG9vIHNtYWxsICglZCkuXG4iLAorCQkJaWVlZS0+ZGV2LT5uYW1lLCBza2ItPmxlbik7CisJCQlnb3RvIHN1Y2Nlc3M7CisJCX0KKworCisjaWZkZWYgX1JUTDgxODdfRVhUX1BBVENIXworCQkvLyBub3RlLCBza2ItPnByaW9yaXR5IHdoaWNoIHdhcyBzZXQgYnkgaWVlZTgwMjExX2NsYXNzaWZ5LCBhbmQgdXNlZCBieSBwaHlzaWNhbCB0eAorCQlpZigoaWVlZS0+aXdfbW9kZSA9PSBpZWVlLT5pd19leHRfbW9kZSkgJiYgKGllZWUtPmV4dF9wYXRjaF9pZWVlODAyMTFfeG1pdCkpCisJCXsKKwkJCXR4YiA9IGllZWUtPmV4dF9wYXRjaF9pZWVlODAyMTFfeG1pdChza2IsIGRldik7CisJCQlnb3RvIHN1Y2Nlc3M7CisJCX0KKyNlbmRpZgorCisJCWV0aGVyX3R5cGUgPSBudG9ocygoKHN0cnVjdCBldGhoZHIgKilza2ItPmRhdGEpLT5oX3Byb3RvKTsKKworCQljcnlwdCA9IGllZWUtPmNyeXB0W2llZWUtPnR4X2tleWlkeF07CisKKwkJZW5jcnlwdCA9ICEoZXRoZXJfdHlwZSA9PSBFVEhfUF9QQUUgJiYgaWVlZS0+aWVlZTgwMl8xeCkgJiYKKwkJCWllZWUtPmhvc3RfZW5jcnlwdCAmJiBjcnlwdCAmJiBjcnlwdC0+b3BzOworCisJCWlmICghZW5jcnlwdCAmJiBpZWVlLT5pZWVlODAyXzF4ICYmCisJCWllZWUtPmRyb3BfdW5lbmNyeXB0ZWQgJiYgZXRoZXJfdHlwZSAhPSBFVEhfUF9QQUUpIHsKKwkJCXN0YXRzLT50eF9kcm9wcGVkKys7CisJCQlnb3RvIHN1Y2Nlc3M7CisJCX0KKworCSNpZmRlZiBDT05GSUdfSUVFRTgwMjExX0RFQlVHCisJCWlmIChjcnlwdCAmJiAhZW5jcnlwdCAmJiBldGhlcl90eXBlID09IEVUSF9QX1BBRSkgeworCQkJc3RydWN0IGVhcG9sICplYXAgPSAoc3RydWN0IGVhcG9sICopKHNrYi0+ZGF0YSArCisJCQkJc2l6ZW9mKHN0cnVjdCBldGhoZHIpIC0gU05BUF9TSVpFIC0gc2l6ZW9mKHUxNikpOworCQkJSUVFRTgwMjExX0RFQlVHX0VBUCgiVFg6IElFRUUgODAyLjExIEVBUE9MIGZyYW1lOiAlc1xuIiwKKwkJCQllYXBfZ2V0X3R5cGUoZWFwLT50eXBlKSk7CisJCX0KKwkjZW5kaWYKKworCQkvKiBTYXZlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gYWRkcmVzc2VzICovCisJCW1lbWNweSgmZGVzdCwgc2tiLT5kYXRhLCBFVEhfQUxFTik7CisJCW1lbWNweSgmc3JjLCBza2ItPmRhdGErRVRIX0FMRU4sIEVUSF9BTEVOKTsKKworCQkvKiBBZHZhbmNlIHRoZSBTS0IgdG8gdGhlIHN0YXJ0IG9mIHRoZSBwYXlsb2FkICovCisJCXNrYl9wdWxsKHNrYiwgc2l6ZW9mKHN0cnVjdCBldGhoZHIpKTsKKworCQkvKiBEZXRlcm1pbmUgdG90YWwgYW1vdW50IG9mIHN0b3JhZ2UgcmVxdWlyZWQgZm9yIFRYQiBwYWNrZXRzICovCisJCWJ5dGVzID0gc2tiLT5sZW4gKyBTTkFQX1NJWkUgKyBzaXplb2YodTE2KTsKKworCQlpZihpZWVlLT5jdXJyZW50X25ldHdvcmsuUW9TX0VuYWJsZSkgeworCQkJaWYgKGVuY3J5cHQpCisJCQkJZmMgPSBJRUVFODAyMTFfRlRZUEVfREFUQSB8IElFRUU4MDIxMV9TVFlQRV9RT1NfREFUQSB8CisJCQkJCUlFRUU4MDIxMV9GQ1RMX1dFUDsKKwkJCWVsc2UKKwkJCQlmYyA9IElFRUU4MDIxMV9GVFlQRV9EQVRBIHwgSUVFRTgwMjExX1NUWVBFX1FPU19EQVRBOworCisJCX0gZWxzZSB7CisJCQlpZiAoZW5jcnlwdCkKKwkJCQlmYyA9IElFRUU4MDIxMV9GVFlQRV9EQVRBIHwgSUVFRTgwMjExX1NUWVBFX0RBVEEgfAorCQkJCQlJRUVFODAyMTFfRkNUTF9XRVA7CisJCQllbHNlCisJCQkJZmMgPSBJRUVFODAyMTFfRlRZUEVfREFUQSB8IElFRUU4MDIxMV9TVFlQRV9EQVRBOworCQl9CisKKwkJaWYgKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9JTkZSQSkgeworCQkJZmMgfD0gSUVFRTgwMjExX0ZDVExfVE9EUzsKKwkJCS8qIFRvIERTOiBBZGRyMSA9IEJTU0lELCBBZGRyMiA9IFNBLAorCQkJQWRkcjMgPSBEQSAqLworCQkJbWVtY3B5KCZoZWFkZXIuYWRkcjEsIGllZWUtPmN1cnJlbnRfbmV0d29yay5ic3NpZCwgRVRIX0FMRU4pOworCQkJbWVtY3B5KCZoZWFkZXIuYWRkcjIsICZzcmMsIEVUSF9BTEVOKTsKKwkJCW1lbWNweSgmaGVhZGVyLmFkZHIzLCAmZGVzdCwgRVRIX0FMRU4pOworCQl9IGVsc2UgaWYgKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9BREhPQykgeworCQkJLyogbm90IEZyb20vVG8gRFM6IEFkZHIxID0gREEsIEFkZHIyID0gU0EsCisJCQlBZGRyMyA9IEJTU0lEICovCisJCQltZW1jcHkoJmhlYWRlci5hZGRyMSwgZGVzdCwgRVRIX0FMRU4pOworCQkJbWVtY3B5KCZoZWFkZXIuYWRkcjIsIHNyYywgRVRIX0FMRU4pOworCQkJbWVtY3B5KCZoZWFkZXIuYWRkcjMsIGllZWUtPmN1cnJlbnRfbmV0d29yay5ic3NpZCwgRVRIX0FMRU4pOworCQl9CisJLy8JcHJpbnRrKEtFUk5fV0FSTklORyAiZXNzaWQgTUFDIGFkZHJlc3MgaXMgIk1BQ19GTVQsIE1BQ19BUkcoJmhlYWRlci5hZGRyMSkpOworCQloZWFkZXIuZnJhbWVfY3RsID0gY3B1X3RvX2xlMTYoZmMpOworCQkvL2hkcl9sZW4gPSBJRUVFODAyMTFfM0FERFJfTEVOOworCisJCS8qIERldGVybWluZSBmcmFnbWVudGF0aW9uIHNpemUgYmFzZWQgb24gZGVzdGluYXRpb24gKG11bHRpY2FzdAorCQkqIGFuZCBicm9hZGNhc3QgYXJlIG5vdCBmcmFnbWVudGVkKSAqLworLy8JCWlmIChpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihkZXN0KSB8fAorLy8JCWlzX2Jyb2FkY2FzdF9ldGhlcl9hZGRyKGRlc3QpKSB7CisJCWlmIChpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihoZWFkZXIuYWRkcjEpIHx8CisJCWlzX2Jyb2FkY2FzdF9ldGhlcl9hZGRyKGhlYWRlci5hZGRyMSkpIHsKKwkJCWZyYWdfc2l6ZSA9IE1BWF9GUkFHX1RIUkVTSE9MRDsKKwkJCVFPU19jdGwgPSBRT1NfQ1RMX05PVENPTlRBSU5fQUNLOworCQl9CisJCWVsc2UgeworCQkJLy9wcmludGsoS0VSTl9XQVJOSU5HICImJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiZmcmFnX3NpemUgPSAlZFxuIiwgZnJhZ19zaXplKTsKKwkJCWZyYWdfc2l6ZSA9IGllZWUtPmZ0czsvL2RlZmF1bHQ6MzkyCisJCQlRT1NfY3RsID0gMDsKKwkJfQorCisJCWlmIChpZWVlLT5jdXJyZW50X25ldHdvcmsuUW9TX0VuYWJsZSkJeworCQkJaGRyX2xlbiA9IElFRUU4MDIxMV8zQUREUl9MRU4gKyAyOworCQkJUU9TX2N0bCB8PSBza2ItPnByaW9yaXR5OyAvL3NldCBpbiB0aGUgaWVlZTgwMjExX2NsYXNzaWZ5CisJCQloZWFkZXIuUU9TX2N0bCA9IGNwdV90b19sZTE2KFFPU19jdGwpOworCQl9IGVsc2UgeworCQkJaGRyX2xlbiA9IElFRUU4MDIxMV8zQUREUl9MRU47CisJCX0KKwkJLy9wcmludGsoS0VSTl9XQVJOSU5HICJoZWFkZXIgc2l6ZSA9ICVkLCBRT1NfY3RsID0gJXhcbiIsIGhkcl9sZW4sUU9TX2N0bCk7CisJCS8qIERldGVybWluZSBhbW91bnQgb2YgcGF5bG9hZCBwZXIgZnJhZ21lbnQuICBSZWdhcmRsZXNzIG9mIGlmCisJCSogdGhpcyBzdGFjayBpcyBwcm92aWRpbmcgdGhlIGZ1bGwgODAyLjExIGhlYWRlciwgb25lIHdpbGwKKwkJKiBldmVudHVhbGx5IGJlIGFmZml4ZWQgdG8gdGhpcyBmcmFnbWVudCAtLSBzbyB3ZSBtdXN0IGFjY291bnQgZm9yCisJCSogaXQgd2hlbiBkZXRlcm1pbmluZyB0aGUgYW1vdW50IG9mIHBheWxvYWQgc3BhY2UuICovCisJCS8vYnl0ZXNfcGVyX2ZyYWcgPSBmcmFnX3NpemUgLSAoSUVFRTgwMjExXzNBRERSX0xFTiArIChpZWVlLT5jdXJyZW50X25ldHdvcmstPlFvU19FbmFibGUgPyAyOjApKTsKKwkJYnl0ZXNfcGVyX2ZyYWcgPSBmcmFnX3NpemUgLSBoZHJfbGVuOworCQlpZiAoaWVlZS0+Y29uZmlnICYKKwkJKENGR19JRUVFODAyMTFfQ09NUFVURV9GQ1MgfCBDRkdfSUVFRTgwMjExX1JFU0VSVkVfRkNTKSkKKwkJCWJ5dGVzX3Blcl9mcmFnIC09IElFRUU4MDIxMV9GQ1NfTEVOOworCisJCS8qIEVhY2ggZnJhZ21lbnQgbWF5IG5lZWQgdG8gaGF2ZSByb29tIGZvciBlbmNyeXB0aW9uZyBwcmUvcG9zdGZpeCAqLworCQlpZiAoZW5jcnlwdCkKKwkJCWJ5dGVzX3Blcl9mcmFnIC09IGNyeXB0LT5vcHMtPmV4dHJhX3ByZWZpeF9sZW4gKworCQkJCWNyeXB0LT5vcHMtPmV4dHJhX3Bvc3RmaXhfbGVuOworCisJCS8qIE51bWJlciBvZiBmcmFnbWVudHMgaXMgdGhlIHRvdGFsIGJ5dGVzX3Blcl9mcmFnIC8KKwkJKiBwYXlsb2FkX3Blcl9mcmFnbWVudCAqLworCQlucl9mcmFncyA9IGJ5dGVzIC8gYnl0ZXNfcGVyX2ZyYWc7CisJCWJ5dGVzX2xhc3RfZnJhZyA9IGJ5dGVzICUgYnl0ZXNfcGVyX2ZyYWc7CisJCWlmIChieXRlc19sYXN0X2ZyYWcpCisJCQlucl9mcmFncysrOworCQllbHNlCisJCQlieXRlc19sYXN0X2ZyYWcgPSBieXRlc19wZXJfZnJhZzsKKworCQkvKiBXaGVuIHdlIGFsbG9jYXRlIHRoZSBUWEIgd2UgYWxsb2NhdGUgZW5vdWdoIHNwYWNlIGZvciB0aGUgcmVzZXJ2ZQorCQkqIGFuZCBmdWxsIGZyYWdtZW50IGJ5dGVzIChieXRlc19wZXJfZnJhZyBkb2Vzbid0IGluY2x1ZGUgcHJlZml4LAorCQkqIHBvc3RmaXgsIGhlYWRlciwgRkNTLCBldGMuKSAqLworCQl0eGIgPSBpZWVlODAyMTFfYWxsb2NfdHhiKG5yX2ZyYWdzLCBmcmFnX3NpemUsIEdGUF9BVE9NSUMpOworCQlpZiAodW5saWtlbHkoIXR4YikpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBDb3VsZCBub3QgYWxsb2NhdGUgVFhCXG4iLAorCQkJaWVlZS0+ZGV2LT5uYW1lKTsKKwkJCWdvdG8gZmFpbGVkOworCQl9CisJCXR4Yi0+ZW5jcnlwdGVkID0gZW5jcnlwdDsKKwkJdHhiLT5wYXlsb2FkX3NpemUgPSBieXRlczsKKworCQlmb3IgKGkgPSAwOyBpIDwgbnJfZnJhZ3M7IGkrKykgeworCQkJc2tiX2ZyYWcgPSB0eGItPmZyYWdtZW50c1tpXTsKKwkJCXNrYl9mcmFnLT5wcmlvcml0eSA9IFVQMkFDKHNrYi0+cHJpb3JpdHkpOworCQkJaWYgKGVuY3J5cHQpCisJCQkJc2tiX3Jlc2VydmUoc2tiX2ZyYWcsIGNyeXB0LT5vcHMtPmV4dHJhX3ByZWZpeF9sZW4pOworCisJCQlmcmFnX2hkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcl9RT1MgKilza2JfcHV0KHNrYl9mcmFnLCBoZHJfbGVuKTsKKwkJCW1lbWNweShmcmFnX2hkciwgJmhlYWRlciwgaGRyX2xlbik7CisKKwkJCS8qIElmIHRoaXMgaXMgbm90IHRoZSBsYXN0IGZyYWdtZW50LCB0aGVuIGFkZCB0aGUgTU9SRUZSQUdTCisJCQkqIGJpdCB0byB0aGUgZnJhbWUgY29udHJvbCAqLworCQkJaWYgKGkgIT0gbnJfZnJhZ3MgLSAxKSB7CisJCQkJZnJhZ19oZHItPmZyYW1lX2N0bCA9IGNwdV90b19sZTE2KAorCQkJCQlmYyB8IElFRUU4MDIxMV9GQ1RMX01PUkVGUkFHUyk7CisJCQkJYnl0ZXMgPSBieXRlc19wZXJfZnJhZzsKKworCQkJfSBlbHNlIHsKKwkJCQkvKiBUaGUgbGFzdCBmcmFnbWVudCB0YWtlcyB0aGUgcmVtYWluaW5nIGxlbmd0aCAqLworCQkJCWJ5dGVzID0gYnl0ZXNfbGFzdF9mcmFnOworCQkJfQorCQkJaWYoaWVlZS0+Y3VycmVudF9uZXR3b3JrLlFvU19FbmFibGUpIHsKKwkJCSAgLy8gYWRkIDEgb25seSBpbmRpY2F0ZSB0byBjb3JyZXNwb25kaW5nIHNlcSBudW1iZXIgY29udHJvbCAyMDA2LzcvMTIKKwkJCSAgZnJhZ19oZHItPnNlcV9jdGwgPSBjcHVfdG9fbGUxNihpZWVlLT5zZXFfY3RybFtVUDJBQyhza2ItPnByaW9yaXR5KSsxXTw8NCB8IGkpOworCQkJICAvL3ByaW50ayhLRVJOX1dBUk5JTkcgInNrYi0+cHJpb3JpdHkgPSAlZCwiLCBza2ItPnByaW9yaXR5KTsKKwkJCSAgLy9wcmludGsoS0VSTl9XQVJOSU5HICJ0eXBlOiVkOiBzZXEgPSAlZFxuIixVUDJBQyhza2ItPnByaW9yaXR5KSxpZWVlLT5zZXFfY3RybFtVUDJBQyhza2ItPnByaW9yaXR5KSsxXSk7CisJCQl9IGVsc2UgeworCQkJICBmcmFnX2hkci0+c2VxX2N0bCA9IGNwdV90b19sZTE2KGllZWUtPnNlcV9jdHJsWzBdPDw0IHwgaSk7CisJCQl9CisJCQkvL2ZyYWdfaGRyLT5zZXFfY3RsID0gY3B1X3RvX2xlMTYoaWVlZS0+c2VxX2N0cmw8PDQgfCBpKTsKKwkJCS8vCisKKwkJCS8qIFB1dCBhIFNOQVAgaGVhZGVyIG9uIHRoZSBmaXJzdCBmcmFnbWVudCAqLworCQkJaWYgKGkgPT0gMCkgeworCQkJCWllZWU4MDIxMV9wdXRfc25hcCgKKwkJCQkJc2tiX3B1dChza2JfZnJhZywgU05BUF9TSVpFICsgc2l6ZW9mKHUxNikpLAorCQkJCQlldGhlcl90eXBlKTsKKwkJCQlieXRlcyAtPSBTTkFQX1NJWkUgKyBzaXplb2YodTE2KTsKKwkJCX0KKworCQkJbWVtY3B5KHNrYl9wdXQoc2tiX2ZyYWcsIGJ5dGVzKSwgc2tiLT5kYXRhLCBieXRlcyk7CisKKwkJCS8qIEFkdmFuY2UgdGhlIFNLQi4uLiAqLworCQkJc2tiX3B1bGwoc2tiLCBieXRlcyk7CisKKwkJCS8qIEVuY3J5cHRpb24gcm91dGluZSB3aWxsIG1vdmUgdGhlIGhlYWRlciBmb3J3YXJkIGluIG9yZGVyCisJCQkqIHRvIGluc2VydCB0aGUgSVYgYmV0d2VlbiB0aGUgaGVhZGVyIGFuZCB0aGUgcGF5bG9hZCAqLworCQkJaWYgKGVuY3J5cHQpCisJCQkJaWVlZTgwMjExX2VuY3J5cHRfZnJhZ21lbnQoaWVlZSwgc2tiX2ZyYWcsIGhkcl9sZW4pOworCQkJaWYgKGllZWUtPmNvbmZpZyAmCisJCQkoQ0ZHX0lFRUU4MDIxMV9DT01QVVRFX0ZDUyB8IENGR19JRUVFODAyMTFfUkVTRVJWRV9GQ1MpKQorCQkJCXNrYl9wdXQoc2tiX2ZyYWcsIDQpOworCQl9CisJCS8vIEFkdmFuY2Ugc2VxdWVuY2UgbnVtYmVyIGluIGRhdGEgZnJhbWUuCisJCS8vcHJpbnRrKEtFUk5fV0FSTklORyAiUW9TIEVuYWxiZWQ/ICVzXG4iLCBpZWVlLT5jdXJyZW50X25ldHdvcmsuUW9TX0VuYWJsZT8iWSI6Ik4iKTsKKwkJaWYgKGllZWUtPmN1cnJlbnRfbmV0d29yay5Rb1NfRW5hYmxlKSB7CisJCSAgaWYgKGllZWUtPnNlcV9jdHJsW1VQMkFDKHNrYi0+cHJpb3JpdHkpICsgMV0gPT0gMHhGRkYpCisJCQlpZWVlLT5zZXFfY3RybFtVUDJBQyhza2ItPnByaW9yaXR5KSArIDFdID0gMDsKKwkJICBlbHNlCisJCQlpZWVlLT5zZXFfY3RybFtVUDJBQyhza2ItPnByaW9yaXR5KSArIDFdKys7CisJCX0gZWxzZSB7CisgIAkJICBpZiAoaWVlZS0+c2VxX2N0cmxbMF0gPT0gMHhGRkYpCisJCQlpZWVlLT5zZXFfY3RybFswXSA9IDA7CisJCSAgZWxzZQorCQkJaWVlZS0+c2VxX2N0cmxbMF0rKzsKKwkJfQorCQkvLy0tLQorCX1lbHNleworCQlpZiAodW5saWtlbHkoc2tiLT5sZW4gPCBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIpKSkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHNrYiB0b28gc21hbGwgKCVkKS5cbiIsCisJCQlpZWVlLT5kZXYtPm5hbWUsIHNrYi0+bGVuKTsKKwkJCWdvdG8gc3VjY2VzczsKKwkJfQorCisJCXR4YiA9IGllZWU4MDIxMV9hbGxvY190eGIoMSwgc2tiLT5sZW4sIEdGUF9BVE9NSUMpOworCQlpZighdHhiKXsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBDb3VsZCBub3QgYWxsb2NhdGUgVFhCXG4iLAorCQkJaWVlZS0+ZGV2LT5uYW1lKTsKKwkJCWdvdG8gZmFpbGVkOworCQl9CisKKwkJdHhiLT5lbmNyeXB0ZWQgPSAwOworCQl0eGItPnBheWxvYWRfc2l6ZSA9IHNrYi0+bGVuOworCQltZW1jcHkoc2tiX3B1dCh0eGItPmZyYWdtZW50c1swXSxza2ItPmxlbiksIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOworCX0KKworIHN1Y2Nlc3M6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+bG9jaywgZmxhZ3MpOworI2lmZGVmIF9SVEw4MTg3X0VYVF9QQVRDSF8KKwkvLyBTb21ldGltZXMsIGV4dGVuc2lvbiBtb2RlIGNhbiByZXVzZSBza2IgKGJ5IHR4Yi0+ZnJhZ21lbnRzWzBdKQorCWlmKCAhICgoaWVlZS0+aXdfbW9kZSA9PSBpZWVlLT5pd19leHRfbW9kZSkgJiYgdHhiICYmICh0eGItPmZyYWdtZW50c1swXSA9PSBza2IpKSApCisjZW5kaWYKKwkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwlpZiAodHhiKSB7CisJCWlmIChpZWVlLT5zb2Z0bWFjX2ZlYXR1cmVzICYgSUVFRV9TT0ZUTUFDX1RYX1FVRVVFKXsKKwkJCWllZWU4MDIxMV9zb2Z0bWFjX3htaXQodHhiLCBpZWVlKTsKKwkJfWVsc2V7CisJCQlpZiAoKCppZWVlLT5oYXJkX3N0YXJ0X3htaXQpKHR4YiwgZGV2KSA9PSAwKSB7CisJCQkJc3RhdHMtPnR4X3BhY2tldHMrKzsKKwkJCQlzdGF0cy0+dHhfYnl0ZXMgKz0gdHhiLT5wYXlsb2FkX3NpemU7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQlpZWVlODAyMTFfdHhiX2ZyZWUodHhiKTsKKwkJfQorCX0KKworCXJldHVybiAwOworCisgZmFpbGVkOgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJc3RhdHMtPnR4X2Vycm9ycysrOworCXJldHVybiAxOworCit9CisKKyNpZiAwCitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV90eGJfZnJlZSk7CisjaWZkZWYgX1JUTDgxODdfRVhUX1BBVENIXworRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfYWxsb2NfdHhiKTsKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX2V4dF9hbGxvY190eGIpOworRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfZXh0X3JldXNlX3R4Yik7CisjZW5kaWYgLy8gX1JUTDgxODdfRVhUX1BBVENIXworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS9pZWVlODAyMTFfd3guYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2llZWU4MDIxMV93eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhYWQ2MWUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS9pZWVlODAyMTFfd3guYwpAQCAtMCwwICsxLDg4NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIENvcHlyaWdodChjKSAyMDA0IEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgIFBvcnRpb25zIG9mIHRoaXMgZmlsZSBhcmUgYmFzZWQgb24gdGhlIFdFUCBlbmFibGVtZW50IGNvZGUgcHJvdmlkZWQgYnkgdGhlCisgIEhvc3QgQVAgcHJvamVjdCBob3N0YXAtZHJpdmVycyB2MC4xLjMKKyAgQ29weXJpZ2h0IChjKSAyMDAxLTIwMDIsIFNTSCBDb21tdW5pY2F0aW9ucyBTZWN1cml0eSBDb3JwIGFuZCBKb3VuaSBNYWxpbmVuCisgIDxqa21hbGluZUBjYy5odXQuZmk+CisgIENvcHlyaWdodCAoYykgMjAwMi0yMDAzLCBKb3VuaSBNYWxpbmVuIDxqa21hbGluZUBjYy5odXQuZmk+CisKKyAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKyAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgIG1vcmUgZGV0YWlscy4KKworICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKworICBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUKKyAgZmlsZSBjYWxsZWQgTElDRU5TRS4KKworICBDb250YWN0IEluZm9ybWF0aW9uOgorICBKYW1lcyBQLiBLZXRyZW5vcyA8aXB3MjEwMC1hZG1pbkBsaW51eC5pbnRlbC5jb20+CisgIEludGVsIENvcnBvcmF0aW9uLCA1MjAwIE4uRS4gRWxhbSBZb3VuZyBQYXJrd2F5LCBIaWxsc2Jvcm8sIE9SIDk3MTI0LTY0OTcKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgPGxpbnV4L3dpcmVsZXNzLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L2ttb2QuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgImllZWU4MDIxMS5oIgorc3RhdGljIGNvbnN0IGNoYXIgKmllZWU4MDIxMV9tb2Rlc1tdID0geworCSI/IiwgImEiLCAiYiIsICJhYiIsICJnIiwgImFnIiwgImJnIiwgImFiZyIKK307CisKKyNpZmRlZiBGRURPUkFDT1JFXzkKKyNkZWZpbmUgSU5fRkVET1JBQ09SRV85IDEKKyNlbHNlCisjZGVmaW5lIElOX0ZFRE9SQUNPUkVfOSAwCisjZW5kaWYKKworI2RlZmluZSBNQVhfQ1VTVE9NX0xFTiA2NAorc3RhdGljIGlubGluZSBjaGFyICpydGw4MTh4X3RyYW5zbGF0ZV9zY2FuKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpzdGFydCwgY2hhciAqc3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKm5ldHdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbykKK3sKKwljaGFyIGN1c3RvbVtNQVhfQ1VTVE9NX0xFTl07CisJY2hhciAqcDsKKwlzdHJ1Y3QgaXdfZXZlbnQgaXdlOworCWludCBpLCBqOworCXU4IG1heF9yYXRlLCByYXRlOworCisJLyogRmlyc3QgZW50cnkgKk1VU1QqIGJlIHRoZSBBUCBNQUMgYWRkcmVzcyAqLworCWl3ZS5jbWQgPSBTSU9DR0lXQVA7CisJaXdlLnUuYXBfYWRkci5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7CisJbWVtY3B5KGl3ZS51LmFwX2FkZHIuc2FfZGF0YSwgbmV0d29yay0+YnNzaWQsIEVUSF9BTEVOKTsKKyNpZigoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwyNykpfHxJTl9GRURPUkFDT1JFXzkpCisJc3RhcnQgPSBpd2Vfc3RyZWFtX2FkZF9ldmVudChpbmZvLCBzdGFydCwgc3RvcCwgJml3ZSwgSVdfRVZfQUREUl9MRU4pOworI2Vsc2UKKwlzdGFydCA9IGl3ZV9zdHJlYW1fYWRkX2V2ZW50KHN0YXJ0LCBzdG9wLCAmaXdlLCBJV19FVl9BRERSX0xFTik7CisjZW5kaWYKKworCS8qIFJlbWFpbmluZyBlbnRyaWVzIHdpbGwgYmUgZGlzcGxheWVkIGluIHRoZSBvcmRlciB3ZSBwcm92aWRlIHRoZW0gKi8KKworCS8qIEFkZCB0aGUgRVNTSUQgKi8KKwlpd2UuY21kID0gU0lPQ0dJV0VTU0lEOworCWl3ZS51LmRhdGEuZmxhZ3MgPSAxOworCS8vWUosbW9kaWZpZWQsMDgwOTAzLGZvciBoaWRkZW4gYXAKKwkvL2lmIChuZXR3b3JrLT5mbGFncyAmIE5FVFdPUktfRU1QVFlfRVNTSUQpIHsKKwlpZiAobmV0d29yay0+c3NpZF9sZW4gPT0gMCkgeworCS8vWUosbW9kaWZpZWQsMDgwOTAzLGVuZAorCQlpd2UudS5kYXRhLmxlbmd0aCA9IHNpemVvZigiPGhpZGRlbj4iKTsKKyNpZigoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwyNykpfHxJTl9GRURPUkFDT1JFXzkpCisJCXN0YXJ0ID0gaXdlX3N0cmVhbV9hZGRfcG9pbnQoaW5mbywgc3RhcnQsIHN0b3AsICZpd2UsICI8aGlkZGVuPiIpOworI2Vsc2UKKwkJc3RhcnQgPSBpd2Vfc3RyZWFtX2FkZF9wb2ludChzdGFydCwgc3RvcCwgJml3ZSwgIjxoaWRkZW4+Iik7CisjZW5kaWYKKwl9IGVsc2UgeworCQlpd2UudS5kYXRhLmxlbmd0aCA9IG1pbihuZXR3b3JrLT5zc2lkX2xlbiwgKHU4KTMyKTsKKyNpZigoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwyNykpfHxJTl9GRURPUkFDT1JFXzkpCisJCXN0YXJ0ID0gaXdlX3N0cmVhbV9hZGRfcG9pbnQoaW5mbywgc3RhcnQsIHN0b3AsICZpd2UsIG5ldHdvcmstPnNzaWQpOworI2Vsc2UKKwkJc3RhcnQgPSBpd2Vfc3RyZWFtX2FkZF9wb2ludChzdGFydCwgc3RvcCwgJml3ZSwgbmV0d29yay0+c3NpZCk7CisjZW5kaWYKKwl9CisJLy9wcmludGsoIkVTU0lEOiAlc1xuIixuZXR3b3JrLT5zc2lkKTsKKwkvKiBBZGQgdGhlIHByb3RvY29sIG5hbWUgKi8KKwlpd2UuY21kID0gU0lPQ0dJV05BTUU7CisJc25wcmludGYoaXdlLnUubmFtZSwgSUZOQU1TSVosICJJRUVFIDgwMi4xMSVzIiwgaWVlZTgwMjExX21vZGVzW25ldHdvcmstPm1vZGVdKTsKKyNpZigoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwyNykpfHxJTl9GRURPUkFDT1JFXzkpCisJc3RhcnQgPSBpd2Vfc3RyZWFtX2FkZF9ldmVudChpbmZvLCBzdGFydCwgc3RvcCwgJml3ZSwgSVdfRVZfQ0hBUl9MRU4pOworI2Vsc2UKKwlzdGFydCA9IGl3ZV9zdHJlYW1fYWRkX2V2ZW50KHN0YXJ0LCBzdG9wLCAmaXdlLCBJV19FVl9DSEFSX0xFTik7CisjZW5kaWYKKworICAgICAgICAvKiBBZGQgbW9kZSAqLworICAgICAgICBpd2UuY21kID0gU0lPQ0dJV01PREU7CisgICAgICAgIGlmIChuZXR3b3JrLT5jYXBhYmlsaXR5ICYKKwkgICAgKFdMQU5fQ0FQQUJJTElUWV9CU1MgfCBXTEFOX0NBUEFCSUxJVFlfSUJTUykpIHsKKwkJaWYgKG5ldHdvcmstPmNhcGFiaWxpdHkgJiBXTEFOX0NBUEFCSUxJVFlfQlNTKQorCQkJaXdlLnUubW9kZSA9IElXX01PREVfTUFTVEVSOworCQllbHNlCisJCQlpd2UudS5tb2RlID0gSVdfTU9ERV9BREhPQzsKKworI2lmKChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDI3KSl8fElOX0ZFRE9SQUNPUkVfOSkKKwkJc3RhcnQgPSBpd2Vfc3RyZWFtX2FkZF9ldmVudChpbmZvLCBzdGFydCwgc3RvcCwgJml3ZSwgSVdfRVZfVUlOVF9MRU4pOworI2Vsc2UKKwkJc3RhcnQgPSBpd2Vfc3RyZWFtX2FkZF9ldmVudChzdGFydCwgc3RvcCwgJml3ZSwgSVdfRVZfVUlOVF9MRU4pOworI2VuZGlmCisJfQorCisgICAgICAgIC8qIEFkZCBmcmVxdWVuY3kvY2hhbm5lbCAqLworCWl3ZS5jbWQgPSBTSU9DR0lXRlJFUTsKKy8qCWl3ZS51LmZyZXEubSA9IGllZWU4MDIxMV9mcmVxdWVuY3kobmV0d29yay0+Y2hhbm5lbCwgbmV0d29yay0+bW9kZSk7CisJaXdlLnUuZnJlcS5lID0gMzsgKi8KKwlpd2UudS5mcmVxLm0gPSBuZXR3b3JrLT5jaGFubmVsOworCWl3ZS51LmZyZXEuZSA9IDA7CisJaXdlLnUuZnJlcS5pID0gMDsKKyNpZigoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwyNykpfHxJTl9GRURPUkFDT1JFXzkpCisJc3RhcnQgPSBpd2Vfc3RyZWFtX2FkZF9ldmVudChpbmZvLCBzdGFydCwgc3RvcCwgJml3ZSwgSVdfRVZfRlJFUV9MRU4pOworI2Vsc2UKKwlzdGFydCA9IGl3ZV9zdHJlYW1fYWRkX2V2ZW50KHN0YXJ0LCBzdG9wLCAmaXdlLCBJV19FVl9GUkVRX0xFTik7CisjZW5kaWYKKworCS8qIEFkZCBlbmNyeXB0aW9uIGNhcGFiaWxpdHkgKi8KKwlpd2UuY21kID0gU0lPQ0dJV0VOQ09ERTsKKwlpZiAobmV0d29yay0+Y2FwYWJpbGl0eSAmIFdMQU5fQ0FQQUJJTElUWV9QUklWQUNZKQorCQlpd2UudS5kYXRhLmZsYWdzID0gSVdfRU5DT0RFX0VOQUJMRUQgfCBJV19FTkNPREVfTk9LRVk7CisJZWxzZQorCQlpd2UudS5kYXRhLmZsYWdzID0gSVdfRU5DT0RFX0RJU0FCTEVEOworCWl3ZS51LmRhdGEubGVuZ3RoID0gMDsKKyNpZigoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwyNykpfHxJTl9GRURPUkFDT1JFXzkpCisJc3RhcnQgPSBpd2Vfc3RyZWFtX2FkZF9wb2ludChpbmZvLCBzdGFydCwgc3RvcCwgJml3ZSwgbmV0d29yay0+c3NpZCk7CisjZWxzZQorCXN0YXJ0ID0gaXdlX3N0cmVhbV9hZGRfcG9pbnQoc3RhcnQsIHN0b3AsICZpd2UsIG5ldHdvcmstPnNzaWQpOworI2VuZGlmCisKKwkvKiBBZGQgYmFzaWMgYW5kIGV4dGVuZGVkIHJhdGVzICovCisJbWF4X3JhdGUgPSAwOworCXAgPSBjdXN0b207CisJcCArPSBzbnByaW50ZihwLCBNQVhfQ1VTVE9NX0xFTiAtIChwIC0gY3VzdG9tKSwgIiBSYXRlcyAoTWIvcyk6ICIpOworCWZvciAoaSA9IDAsIGogPSAwOyBpIDwgbmV0d29yay0+cmF0ZXNfbGVuOyApIHsKKwkJaWYgKGogPCBuZXR3b3JrLT5yYXRlc19leF9sZW4gJiYKKwkJICAgICgobmV0d29yay0+cmF0ZXNfZXhbal0gJiAweDdGKSA8CisJCSAgICAgKG5ldHdvcmstPnJhdGVzW2ldICYgMHg3RikpKQorCQkJcmF0ZSA9IG5ldHdvcmstPnJhdGVzX2V4W2orK10gJiAweDdGOworCQllbHNlCisJCQlyYXRlID0gbmV0d29yay0+cmF0ZXNbaSsrXSAmIDB4N0Y7CisJCWlmIChyYXRlID4gbWF4X3JhdGUpCisJCQltYXhfcmF0ZSA9IHJhdGU7CisJCXAgKz0gc25wcmludGYocCwgTUFYX0NVU1RPTV9MRU4gLSAocCAtIGN1c3RvbSksCisJCQkgICAgICAiJWQlcyAiLCByYXRlID4+IDEsIChyYXRlICYgMSkgPyAiLjUiIDogIiIpOworCX0KKwlmb3IgKDsgaiA8IG5ldHdvcmstPnJhdGVzX2V4X2xlbjsgaisrKSB7CisJCXJhdGUgPSBuZXR3b3JrLT5yYXRlc19leFtqXSAmIDB4N0Y7CisJCXAgKz0gc25wcmludGYocCwgTUFYX0NVU1RPTV9MRU4gLSAocCAtIGN1c3RvbSksCisJCQkgICAgICAiJWQlcyAiLCByYXRlID4+IDEsIChyYXRlICYgMSkgPyAiLjUiIDogIiIpOworCQlpZiAocmF0ZSA+IG1heF9yYXRlKQorCQkJbWF4X3JhdGUgPSByYXRlOworCX0KKworCWl3ZS5jbWQgPSBTSU9DR0lXUkFURTsKKwlpd2UudS5iaXRyYXRlLmZpeGVkID0gaXdlLnUuYml0cmF0ZS5kaXNhYmxlZCA9IDA7CisJaXdlLnUuYml0cmF0ZS52YWx1ZSA9IG1heF9yYXRlICogNTAwMDAwOworI2lmKChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDI3KSl8fElOX0ZFRE9SQUNPUkVfOSkKKwlzdGFydCA9IGl3ZV9zdHJlYW1fYWRkX2V2ZW50KGluZm8sIHN0YXJ0LCBzdG9wLCAmaXdlLCBJV19FVl9QQVJBTV9MRU4pOworI2Vsc2UKKwlzdGFydCA9IGl3ZV9zdHJlYW1fYWRkX2V2ZW50KHN0YXJ0LCBzdG9wLCAmaXdlLCBJV19FVl9QQVJBTV9MRU4pOworI2VuZGlmCisKKwlpd2UuY21kID0gSVdFVkNVU1RPTTsKKwlpd2UudS5kYXRhLmxlbmd0aCA9IHAgLSBjdXN0b207CisJaWYgKGl3ZS51LmRhdGEubGVuZ3RoKQorI2lmKChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDI3KSl8fElOX0ZFRE9SQUNPUkVfOSkKKwkJc3RhcnQgPSBpd2Vfc3RyZWFtX2FkZF9wb2ludChpbmZvLCBzdGFydCwgc3RvcCwgJml3ZSwgY3VzdG9tKTsKKyNlbHNlCisJCXN0YXJ0ID0gaXdlX3N0cmVhbV9hZGRfcG9pbnQoc3RhcnQsIHN0b3AsICZpd2UsIGN1c3RvbSk7CisjZW5kaWYKKworCS8qIEFkZCBxdWFsaXR5IHN0YXRpc3RpY3MgKi8KKwkvKiBUT0RPOiBGaXggdGhlc2UgdmFsdWVzLi4uICovCisJaWYgKG5ldHdvcmstPnN0YXRzLnNpZ25hbCA9PSAwIHx8IG5ldHdvcmstPnN0YXRzLnJzc2kgPT0gMCkKKwlwcmludGsoIj09PT09PT09PnNpZ25hbDolZCwgcnNzaTolZFxuIiwgbmV0d29yay0+c3RhdHMuc2lnbmFsLCBuZXR3b3JrLT5zdGF0cy5yc3NpKTsKKwlpd2UuY21kID0gSVdFVlFVQUw7CisvLwlwcmludGsoIlNJR05BTDogJWQsUlNTSTogJWQsTk9JU0U6ICVkXG4iLG5ldHdvcmstPnN0YXRzLnNpZ25hbCxuZXR3b3JrLT5zdGF0cy5yc3NpLG5ldHdvcmstPnN0YXRzLm5vaXNlKTsKKwlpd2UudS5xdWFsLnF1YWwgPSBuZXR3b3JrLT5zdGF0cy5zaWduYWxzdHJlbmd0aDsKKwlpd2UudS5xdWFsLmxldmVsID0gbmV0d29yay0+c3RhdHMuc2lnbmFsOworCWl3ZS51LnF1YWwubm9pc2UgPSBuZXR3b3JrLT5zdGF0cy5ub2lzZTsKKwlpd2UudS5xdWFsLnVwZGF0ZWQgPSBuZXR3b3JrLT5zdGF0cy5tYXNrICYgSUVFRTgwMjExX1NUQVRNQVNLX1dFTUFTSzsKKwlpZiAoIShuZXR3b3JrLT5zdGF0cy5tYXNrICYgSUVFRTgwMjExX1NUQVRNQVNLX1JTU0kpKQorCQlpd2UudS5xdWFsLnVwZGF0ZWQgfD0gSVdfUVVBTF9MRVZFTF9JTlZBTElEOworCWlmICghKG5ldHdvcmstPnN0YXRzLm1hc2sgJiBJRUVFODAyMTFfU1RBVE1BU0tfTk9JU0UpKQorCQlpd2UudS5xdWFsLnVwZGF0ZWQgfD0gSVdfUVVBTF9OT0lTRV9JTlZBTElEOworCWlmICghKG5ldHdvcmstPnN0YXRzLm1hc2sgJiBJRUVFODAyMTFfU1RBVE1BU0tfU0lHTkFMKSkKKwkJaXdlLnUucXVhbC51cGRhdGVkIHw9IElXX1FVQUxfUVVBTF9JTlZBTElEOworCWl3ZS51LnF1YWwudXBkYXRlZCA9IDc7CisjaWYoKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMjcpKXx8SU5fRkVET1JBQ09SRV85KQorCXN0YXJ0ID0gaXdlX3N0cmVhbV9hZGRfZXZlbnQoaW5mbywgc3RhcnQsIHN0b3AsICZpd2UsIElXX0VWX1FVQUxfTEVOKTsKKyNlbHNlCisJc3RhcnQgPSBpd2Vfc3RyZWFtX2FkZF9ldmVudChzdGFydCwgc3RvcCwgJml3ZSwgSVdfRVZfUVVBTF9MRU4pOworI2VuZGlmCisKKwlpd2UuY21kID0gSVdFVkNVU1RPTTsKKwlwID0gY3VzdG9tOworCisJaXdlLnUuZGF0YS5sZW5ndGggPSBwIC0gY3VzdG9tOworCWlmIChpd2UudS5kYXRhLmxlbmd0aCkKKyNpZigoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwyNykpfHxJTl9GRURPUkFDT1JFXzkpCisJCXN0YXJ0ID0gaXdlX3N0cmVhbV9hZGRfcG9pbnQoaW5mbywgc3RhcnQsIHN0b3AsICZpd2UsIGN1c3RvbSk7CisjZWxzZQorCQlzdGFydCA9IGl3ZV9zdHJlYW1fYWRkX3BvaW50KHN0YXJ0LCBzdG9wLCAmaXdlLCBjdXN0b20pOworI2VuZGlmCisKKyNpZiAwCisJaWYgKGllZWUtPndwYV9lbmFibGVkICYmIG5ldHdvcmstPndwYV9pZV9sZW4peworCQljaGFyIGJ1ZltNQVhfV1BBX0lFX0xFTiAqIDIgKyAzMF07CisJLy8JcHJpbnRrKCJXUEEgSUVcbiIpOworCQl1OCAqcCA9IGJ1ZjsKKwkJcCArPSBzcHJpbnRmKHAsICJ3cGFfaWU9Iik7CisJCWZvciAoaSA9IDA7IGkgPCBuZXR3b3JrLT53cGFfaWVfbGVuOyBpKyspIHsKKwkJCXAgKz0gc3ByaW50ZihwLCAiJTAyeCIsIG5ldHdvcmstPndwYV9pZVtpXSk7CisJCX0KKworCQltZW1zZXQoJml3ZSwgMCwgc2l6ZW9mKGl3ZSkpOworCQlpd2UuY21kID0gSVdFVkNVU1RPTTsKKwkJaXdlLnUuZGF0YS5sZW5ndGggPSBzdHJsZW4oYnVmKTsKKyNpZigoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwyNykpfHxJTl9GRURPUkFDT1JFXzkpCisJCXN0YXJ0ID0gaXdlX3N0cmVhbV9hZGRfcG9pbnQoaW5mbywgc3RhcnQsIHN0b3AsICZpd2UsIGJ1Zik7CisjZWxzZQorCQlzdGFydCA9IGl3ZV9zdHJlYW1fYWRkX3BvaW50KHN0YXJ0LCBzdG9wLCAmaXdlLCBidWYpOworI2VuZGlmCisJfQorCisJaWYgKGllZWUtPndwYV9lbmFibGVkICYmIG5ldHdvcmstPnJzbl9pZV9sZW4peworCQljaGFyIGJ1ZltNQVhfV1BBX0lFX0xFTiAqIDIgKyAzMF07CisKKwkJdTggKnAgPSBidWY7CisJCXAgKz0gc3ByaW50ZihwLCAicnNuX2llPSIpOworCQlmb3IgKGkgPSAwOyBpIDwgbmV0d29yay0+cnNuX2llX2xlbjsgaSsrKSB7CisJCQlwICs9IHNwcmludGYocCwgIiUwMngiLCBuZXR3b3JrLT5yc25faWVbaV0pOworCQl9CisKKworI2Vsc2UKKwkJbWVtc2V0KCZpd2UsIDAsIHNpemVvZihpd2UpKTsKKyAgICAgICAgaWYgKG5ldHdvcmstPndwYV9pZV9sZW4pIHsKKwkvLwlwcmludGsoIndwYV9pZV9sZW46JWRcbiIsIG5ldHdvcmstPndwYV9pZV9sZW4pOworICAgICAgICAgICAgICAgIGNoYXIgYnVmW01BWF9XUEFfSUVfTEVOXTsKKyAgICAgICAgICAgICAgICBtZW1jcHkoYnVmLCBuZXR3b3JrLT53cGFfaWUsIG5ldHdvcmstPndwYV9pZV9sZW4pOworICAgICAgICAgICAgICAgIGl3ZS5jbWQgPSBJV0VWR0VOSUU7CisgICAgICAgICAgICAgICAgaXdlLnUuZGF0YS5sZW5ndGggPSBuZXR3b3JrLT53cGFfaWVfbGVuOworI2lmKChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDI3KSl8fElOX0ZFRE9SQUNPUkVfOSkKKyAgICAgICAgICAgICAgICBzdGFydCA9IGl3ZV9zdHJlYW1fYWRkX3BvaW50KGluZm8sIHN0YXJ0LCBzdG9wLCAmaXdlLCBidWYpOworI2Vsc2UKKyAgICAgICAgICAgICAgICBzdGFydCA9IGl3ZV9zdHJlYW1fYWRkX3BvaW50KHN0YXJ0LCBzdG9wLCAmaXdlLCBidWYpOworI2VuZGlmCisgICAgICAgIH0KKworICAgICAgICBtZW1zZXQoJml3ZSwgMCwgc2l6ZW9mKGl3ZSkpOworICAgICAgICBpZiAobmV0d29yay0+cnNuX2llX2xlbikgeworCS8vCXByaW50aygiPT09PT0+cnNuX2llX2xlbjpcbiIsIG5ldHdvcmstPnJzbl9pZV9sZW4pOworCQkjaWYgMAorCQl7CisJCQlpbnQgaTsKKwkJCWZvciAoaT0wOyBpPG5ldHdvcmstPnJzbl9pZV9sZW47IGkrKyk7CisJCQlwcmludGsoIiUyeCAiLCBuZXR3b3JrLT5yc25faWVbaV0pOworCQkJcHJpbnRrKCJcbiIpOworCQl9CisJCSNlbmRpZgorICAgICAgICAgICAgICAgIGNoYXIgYnVmW01BWF9XUEFfSUVfTEVOXTsKKyAgICAgICAgICAgICAgICBtZW1jcHkoYnVmLCBuZXR3b3JrLT5yc25faWUsIG5ldHdvcmstPnJzbl9pZV9sZW4pOworICAgICAgICAgICAgICAgIGl3ZS5jbWQgPSBJV0VWR0VOSUU7CisgICAgICAgICAgICAgICAgaXdlLnUuZGF0YS5sZW5ndGggPSBuZXR3b3JrLT5yc25faWVfbGVuOworI2lmKChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDI3KSl8fElOX0ZFRE9SQUNPUkVfOSkKKwkJc3RhcnQgPSBpd2Vfc3RyZWFtX2FkZF9wb2ludChpbmZvLCBzdGFydCwgc3RvcCwgJml3ZSwgYnVmKTsKKyNlbHNlCisJCXN0YXJ0ID0gaXdlX3N0cmVhbV9hZGRfcG9pbnQoc3RhcnQsIHN0b3AsICZpd2UsIGJ1Zik7CisjZW5kaWYKKwl9CisKKyNlbmRpZgorCisJLyogQWRkIEVYVFJBOiBBZ2UgdG8gZGlzcGxheSBzZWNvbmRzIHNpbmNlIGxhc3QgYmVhY29uL3Byb2JlIHJlc3BvbnNlCisJICogZm9yIGdpdmVuIG5ldHdvcmsuICovCisJaXdlLmNtZCA9IElXRVZDVVNUT007CisJcCA9IGN1c3RvbTsKKwlwICs9IHNucHJpbnRmKHAsIE1BWF9DVVNUT01fTEVOIC0gKHAgLSBjdXN0b20pLAorCQkgICAgICAiIExhc3QgYmVhY29uOiAlbHVtcyBhZ28iLCAoamlmZmllcyAtIG5ldHdvcmstPmxhc3Rfc2Nhbm5lZCkgLyAoSFogLyAxMDApKTsKKwlpd2UudS5kYXRhLmxlbmd0aCA9IHAgLSBjdXN0b207CisJaWYgKGl3ZS51LmRhdGEubGVuZ3RoKQorI2lmKChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDI3KSl8fElOX0ZFRE9SQUNPUkVfOSkKKwkJc3RhcnQgPSBpd2Vfc3RyZWFtX2FkZF9wb2ludChpbmZvLCBzdGFydCwgc3RvcCwgJml3ZSwgY3VzdG9tKTsKKyNlbHNlCisJCXN0YXJ0ID0gaXdlX3N0cmVhbV9hZGRfcG9pbnQoc3RhcnQsIHN0b3AsICZpd2UsIGN1c3RvbSk7CisjZW5kaWYKKworCXJldHVybiBzdGFydDsKK30KKworaW50IGllZWU4MDIxMV93eF9nZXRfc2NhbihzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCSAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpuZXR3b3JrOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGVyciA9IDA7CisJY2hhciAqZXYgPSBleHRyYTsKKwljaGFyICpzdG9wID0gZXYgKyB3cnF1LT5kYXRhLmxlbmd0aDsvL0lXX1NDQU5fTUFYX0RBVEE7CisJLy9jaGFyICpzdG9wID0gZXYgKyBJV19TQ0FOX01BWF9EQVRBOworCWludCBpID0gMDsKKworCUlFRUU4MDIxMV9ERUJVR19XWCgiR2V0dGluZyBzY2FuXG4iKTsKKwlkb3duKCZpZWVlLT53eF9zZW0pOworCXNwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5sb2NrLCBmbGFncyk7CisKKwlpZighaWVlZS0+Ykh3UmFkaW9PZmYpCisJeworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KG5ldHdvcmssICZpZWVlLT5uZXR3b3JrX2xpc3QsIGxpc3QpIHsKKwkJCWkrKzsKKworCQkJaWYoKHN0b3AtZXYpPDIwMCkKKwkJCXsKKwkJCQllcnIgPSAtRTJCSUc7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoaWVlZS0+c2Nhbl9hZ2UgPT0gMCB8fAorCQkJICAgIHRpbWVfYWZ0ZXIobmV0d29yay0+bGFzdF9zY2FubmVkICsgaWVlZS0+c2Nhbl9hZ2UsIGppZmZpZXMpKQorCQkJeworCQkJCWV2ID0gcnRsODE4eF90cmFuc2xhdGVfc2NhbihpZWVlLCBldiwgc3RvcCwgbmV0d29yaywgaW5mbyk7CisJCQl9CisJCQllbHNlCisJCQkJSUVFRTgwMjExX0RFQlVHX1NDQU4oCisJCQkJCSJOb3Qgc2hvd2luZyBuZXR3b3JrICclcyAoIgorCQkJCQlNQUNfRk1UICIpJyBkdWUgdG8gYWdlICglbHVtcykuXG4iLAorCQkJCQllc2NhcGVfZXNzaWQobmV0d29yay0+c3NpZCwKKwkJCQkJCSAgICAgbmV0d29yay0+c3NpZF9sZW4pLAorCQkJCQlNQUNfQVJHKG5ldHdvcmstPmJzc2lkKSwKKwkJCQkJKGppZmZpZXMgLSBuZXR3b3JrLT5sYXN0X3NjYW5uZWQpIC8gKEhaIC8gMTAwKSk7CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+bG9jaywgZmxhZ3MpOworCXVwKCZpZWVlLT53eF9zZW0pOworCXdycXUtPmRhdGEubGVuZ3RoID0gZXYgLSAgZXh0cmE7CisJd3JxdS0+ZGF0YS5mbGFncyA9IDA7CisJSUVFRTgwMjExX0RFQlVHX1dYKCJleGl0OiAlZCBuZXR3b3JrcyByZXR1cm5lZC5cbiIsIGkpOworCisJcmV0dXJuIGVycjsKK30KKworaW50IGllZWU4MDIxMV93eF9zZXRfZW5jb2RlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqa2V5YnVmKQoreworCXN0cnVjdCBpd19wb2ludCAqZXJxID0gJih3cnF1LT5lbmNvZGluZyk7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGllZWUtPmRldjsKKwlzdHJ1Y3QgaWVlZTgwMjExX3NlY3VyaXR5IHNlYyA9IHsKKwkJLmZsYWdzID0gMAorCX07CisJaW50IGksIGtleSwga2V5X3Byb3ZpZGVkLCBsZW47CisJc3RydWN0IGllZWU4MDIxMV9jcnlwdF9kYXRhICoqY3J5cHQ7CisKKwlJRUVFODAyMTFfREVCVUdfV1goIlNFVF9FTkNPREVcbiIpOworCisJa2V5ID0gZXJxLT5mbGFncyAmIElXX0VOQ09ERV9JTkRFWDsKKwlpZiAoa2V5KSB7CisJCWlmIChrZXkgPiBXRVBfS0VZUykKKwkJCXJldHVybiAtRUlOVkFMOworCQlrZXktLTsKKwkJa2V5X3Byb3ZpZGVkID0gMTsKKwl9IGVsc2UgeworCQlrZXlfcHJvdmlkZWQgPSAwOworCQlrZXkgPSBpZWVlLT50eF9rZXlpZHg7CisJfQorCisJSUVFRTgwMjExX0RFQlVHX1dYKCJLZXk6ICVkIFslc11cbiIsIGtleSwga2V5X3Byb3ZpZGVkID8KKwkJCSAgICJwcm92aWRlZCIgOiAiZGVmYXVsdCIpOworCisJY3J5cHQgPSAmaWVlZS0+Y3J5cHRba2V5XTsKKworCWlmIChlcnEtPmZsYWdzICYgSVdfRU5DT0RFX0RJU0FCTEVEKSB7CisJCWlmIChrZXlfcHJvdmlkZWQgJiYgKmNyeXB0KSB7CisJCQlJRUVFODAyMTFfREVCVUdfV1goIkRpc2FibGluZyBlbmNyeXB0aW9uIG9uIGtleSAlZC5cbiIsCisJCQkJCSAgIGtleSk7CisJCQlpZWVlODAyMTFfY3J5cHRfZGVsYXllZF9kZWluaXQoaWVlZSwgY3J5cHQpOworCQl9IGVsc2UKKwkJCUlFRUU4MDIxMV9ERUJVR19XWCgiRGlzYWJsaW5nIGVuY3J5cHRpb24uXG4iKTsKKworCQkvKiBDaGVjayBhbGwgdGhlIGtleXMgdG8gc2VlIGlmIGFueSBhcmUgc3RpbGwgY29uZmlndXJlZCwKKwkJICogYW5kIGlmIG5vIGtleSBpbmRleCB3YXMgcHJvdmlkZWQsIGRlLWluaXQgdGhlbSBhbGwgKi8KKwkJZm9yIChpID0gMDsgaSA8IFdFUF9LRVlTOyBpKyspIHsKKwkJCWlmIChpZWVlLT5jcnlwdFtpXSAhPSBOVUxMKSB7CisJCQkJaWYgKGtleV9wcm92aWRlZCkKKwkJCQkJYnJlYWs7CisJCQkJaWVlZTgwMjExX2NyeXB0X2RlbGF5ZWRfZGVpbml0KAorCQkJCQlpZWVlLCAmaWVlZS0+Y3J5cHRbaV0pOworCQkJfQorCQl9CisKKwkJaWYgKGkgPT0gV0VQX0tFWVMpIHsKKwkJCXNlYy5lbmFibGVkID0gMDsKKwkJCXNlYy5sZXZlbCA9IFNFQ19MRVZFTF8wOworCQkJc2VjLmZsYWdzIHw9IFNFQ19FTkFCTEVEIHwgU0VDX0xFVkVMOworCQl9CisKKwkJZ290byBkb25lOworCX0KKworCisKKwlzZWMuZW5hYmxlZCA9IDE7CisJc2VjLmZsYWdzIHw9IFNFQ19FTkFCTEVEOworCisJaWYgKCpjcnlwdCAhPSBOVUxMICYmICgqY3J5cHQpLT5vcHMgIT0gTlVMTCAmJgorCSAgICBzdHJjbXAoKCpjcnlwdCktPm9wcy0+bmFtZSwgIldFUCIpICE9IDApIHsKKwkJLyogY2hhbmdpbmcgdG8gdXNlIFdFUDsgZGVpbml0IHByZXZpb3VzbHkgdXNlZCBhbGdvcml0aG0KKwkJICogb24gdGhpcyBrZXkgKi8KKwkJaWVlZTgwMjExX2NyeXB0X2RlbGF5ZWRfZGVpbml0KGllZWUsIGNyeXB0KTsKKwl9CisKKwlpZiAoKmNyeXB0ID09IE5VTEwpIHsKKwkJc3RydWN0IGllZWU4MDIxMV9jcnlwdF9kYXRhICpuZXdfY3J5cHQ7CisKKwkJLyogdGFrZSBXRVAgaW50byB1c2UgKi8KKwkJbmV3X2NyeXB0ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9jcnlwdF9kYXRhKSwKKwkJCQkgICAgR0ZQX0tFUk5FTCk7CisJCWlmIChuZXdfY3J5cHQgPT0gTlVMTCkKKwkJCXJldHVybiAtRU5PTUVNOworCQltZW1zZXQobmV3X2NyeXB0LCAwLCBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9jcnlwdF9kYXRhKSk7CisJCW5ld19jcnlwdC0+b3BzID0gaWVlZTgwMjExX2dldF9jcnlwdG9fb3BzKCJXRVAiKTsKKwkJaWYgKCFuZXdfY3J5cHQtPm9wcykgeworCQkJcmVxdWVzdF9tb2R1bGUoImllZWU4MDIxMV9jcnlwdF93ZXAiKTsKKwkJCW5ld19jcnlwdC0+b3BzID0gaWVlZTgwMjExX2dldF9jcnlwdG9fb3BzKCJXRVAiKTsKKwkJfQorCisJCWlmIChuZXdfY3J5cHQtPm9wcyAmJiB0cnlfbW9kdWxlX2dldChuZXdfY3J5cHQtPm9wcy0+b3duZXIpKQorCQkJbmV3X2NyeXB0LT5wcml2ID0gbmV3X2NyeXB0LT5vcHMtPmluaXQoa2V5KTsKKworCQlpZiAoIW5ld19jcnlwdC0+b3BzIHx8ICFuZXdfY3J5cHQtPnByaXYpIHsKKwkJCWtmcmVlKG5ld19jcnlwdCk7CisJCQluZXdfY3J5cHQgPSBOVUxMOworCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogY291bGQgbm90IGluaXRpYWxpemUgV0VQOiAiCisJCQkgICAgICAgImxvYWQgbW9kdWxlIGllZWU4MDIxMV9jcnlwdF93ZXBcbiIsCisJCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJCXJldHVybiAtRU9QTk9UU1VQUDsKKwkJfQorCQkqY3J5cHQgPSBuZXdfY3J5cHQ7CisJfQorCisJLyogSWYgYSBuZXcga2V5IHdhcyBwcm92aWRlZCwgc2V0IGl0IHVwICovCisJaWYgKGVycS0+bGVuZ3RoID4gMCkgeworCQlsZW4gPSBlcnEtPmxlbmd0aCA8PSA1ID8gNSA6IDEzOworCQltZW1jcHkoc2VjLmtleXNba2V5XSwga2V5YnVmLCBlcnEtPmxlbmd0aCk7CisJCWlmIChsZW4gPiBlcnEtPmxlbmd0aCkKKwkJCW1lbXNldChzZWMua2V5c1trZXldICsgZXJxLT5sZW5ndGgsIDAsCisJCQkgICAgICAgbGVuIC0gZXJxLT5sZW5ndGgpOworCQlJRUVFODAyMTFfREVCVUdfV1goIlNldHRpbmcga2V5ICVkIHRvICclcycgKCVkOiVkIGJ5dGVzKVxuIiwKKwkJCQkgICBrZXksIGVzY2FwZV9lc3NpZChzZWMua2V5c1trZXldLCBsZW4pLAorCQkJCSAgIGVycS0+bGVuZ3RoLCBsZW4pOworCQlzZWMua2V5X3NpemVzW2tleV0gPSBsZW47CisgCQkoKmNyeXB0KS0+b3BzLT5zZXRfa2V5KHNlYy5rZXlzW2tleV0sIGxlbiwgTlVMTCwKKwkJCQkgICAgICAgKCpjcnlwdCktPnByaXYpOworCQlzZWMuZmxhZ3MgfD0gKDEgPDwga2V5KTsKKwkJLyogVGhpcyBlbnN1cmVzIGEga2V5IHdpbGwgYmUgYWN0aXZhdGVkIGlmIG5vIGtleSBpcworCQkgKiBleHBsaWNpdGVseSBzZXQgKi8KKwkJaWYgKGtleSA9PSBzZWMuYWN0aXZlX2tleSkKKwkJCXNlYy5mbGFncyB8PSBTRUNfQUNUSVZFX0tFWTsKKwkJaWVlZS0+dHhfa2V5aWR4ID0ga2V5Oy8vYnkgd2IgMDgwMzEyCisJfSBlbHNlIHsKKwkJbGVuID0gKCpjcnlwdCktPm9wcy0+Z2V0X2tleShzZWMua2V5c1trZXldLCBXRVBfS0VZX0xFTiwKKwkJCQkJICAgICBOVUxMLCAoKmNyeXB0KS0+cHJpdik7CisJCWlmIChsZW4gPT0gMCkgeworCQkJLyogU2V0IGEgZGVmYXVsdCBrZXkgb2YgYWxsIDAgKi8KKwkJCUlFRUU4MDIxMV9ERUJVR19XWCgiU2V0dGluZyBrZXkgJWQgdG8gYWxsIHplcm8uXG4iLAorCQkJCQkgICBrZXkpOworCQkJbWVtc2V0KHNlYy5rZXlzW2tleV0sIDAsIDEzKTsKKwkJCSgqY3J5cHQpLT5vcHMtPnNldF9rZXkoc2VjLmtleXNba2V5XSwgMTMsIE5VTEwsCisJCQkJCSAgICAgICAoKmNyeXB0KS0+cHJpdik7CisJCQlzZWMua2V5X3NpemVzW2tleV0gPSAxMzsKKwkJCXNlYy5mbGFncyB8PSAoMSA8PCBrZXkpOworCQl9CisKKwkJLyogTm8ga2V5IGRhdGEgLSBqdXN0IHNldCB0aGUgZGVmYXVsdCBUWCBrZXkgaW5kZXggKi8KKwkJaWYgKGtleV9wcm92aWRlZCkgeworCQkJSUVFRTgwMjExX0RFQlVHX1dYKAorCQkJCSJTZXR0aW5nIGtleSAlZCB0byBkZWZhdWx0IFR4IGtleS5cbiIsIGtleSk7CisJCQlpZWVlLT50eF9rZXlpZHggPSBrZXk7CisJCQlzZWMuYWN0aXZlX2tleSA9IGtleTsKKwkJCXNlYy5mbGFncyB8PSBTRUNfQUNUSVZFX0tFWTsKKwkJfQorCX0KKworIGRvbmU6CisJaWVlZS0+b3Blbl93ZXAgPSAhKGVycS0+ZmxhZ3MgJiBJV19FTkNPREVfUkVTVFJJQ1RFRCk7CisJc2VjLmF1dGhfbW9kZSA9IGllZWUtPm9wZW5fd2VwID8gV0xBTl9BVVRIX09QRU4gOiBXTEFOX0FVVEhfU0hBUkVEX0tFWTsKKwlzZWMuZmxhZ3MgfD0gU0VDX0FVVEhfTU9ERTsKKwlJRUVFODAyMTFfREVCVUdfV1goIkF1dGg6ICVzXG4iLCBzZWMuYXV0aF9tb2RlID09IFdMQU5fQVVUSF9PUEVOID8KKwkJCSAgICJPUEVOIiA6ICJTSEFSRUQgS0VZIik7CisKKwkvKiBGb3Igbm93IHdlIGp1c3Qgc3VwcG9ydCBXRVAsIHNvIG9ubHkgc2V0IHRoYXQgc2VjdXJpdHkgbGV2ZWwuLi4KKwkgKiBUT0RPOiBXaGVuIFdQQSBpcyBhZGRlZCB0aGlzIGlzIG9uZSBwbGFjZSB0aGF0IG5lZWRzIHRvIGNoYW5nZSAqLworCXNlYy5mbGFncyB8PSBTRUNfTEVWRUw7CisJc2VjLmxldmVsID0gU0VDX0xFVkVMXzE7IC8qIDQwIGFuZCAxMDQgYml0IFdFUCAqLworCisJaWYgKGllZWUtPnNldF9zZWN1cml0eSkKKwkJaWVlZS0+c2V0X3NlY3VyaXR5KGRldiwgJnNlYyk7CisKKwkvKiBEbyBub3QgcmVzZXQgcG9ydCBpZiBjYXJkIGlzIGluIE1hbmFnZWQgbW9kZSBzaW5jZSByZXNldHRpbmcgd2lsbAorCSAqIGdlbmVyYXRlIG5ldyBJRUVFIDgwMi4xMSBhdXRoZW50aWNhdGlvbiB3aGljaCBtYXkgZW5kIHVwIGluIGxvb3BpbmcKKwkgKiB3aXRoIElFRUUgODAyLjFYLiAgSWYgeW91ciBoYXJkd2FyZSByZXF1aXJlcyBhIHJlc2V0IGFmdGVyIFdFUAorCSAqIGNvbmZpZ3VyYXRpb24gKGZvciBleGFtcGxlLi4uIFByaXNtMiksIGltcGxlbWVudCB0aGUgcmVzZXRfcG9ydCBpbgorCSAqIHRoZSBjYWxsYmFja3Mgc3RydWN0dXJlcyB1c2VkIHRvIGluaXRpYWxpemUgdGhlIDgwMi4xMSBzdGFjay4gKi8KKwlpZiAoaWVlZS0+cmVzZXRfb25fa2V5Y2hhbmdlICYmCisJICAgIGllZWUtPml3X21vZGUgIT0gSVdfTU9ERV9JTkZSQSAmJgorCSAgICBpZWVlLT5yZXNldF9wb3J0ICYmIGllZWUtPnJlc2V0X3BvcnQoZGV2KSkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHJlc2V0X3BvcnQgZmFpbGVkXG4iLCBkZXYtPm5hbWUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK2ludCBpZWVlODAyMTFfd3hfZ2V0X2VuY29kZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmtleWJ1ZikKK3sKKwlzdHJ1Y3QgaXdfcG9pbnQgKmVycSA9ICYod3JxdS0+ZW5jb2RpbmcpOworCWludCBsZW4sIGtleTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEgKmNyeXB0OworCisJSUVFRTgwMjExX0RFQlVHX1dYKCJHRVRfRU5DT0RFXG4iKTsKKworCWlmKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9NT05JVE9SKQorCQlyZXR1cm4gLTE7CisKKwlrZXkgPSBlcnEtPmZsYWdzICYgSVdfRU5DT0RFX0lOREVYOworCWlmIChrZXkpIHsKKwkJaWYgKGtleSA+IFdFUF9LRVlTKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWtleS0tOworCX0gZWxzZQorCQlrZXkgPSBpZWVlLT50eF9rZXlpZHg7CisKKwljcnlwdCA9IGllZWUtPmNyeXB0W2tleV07CisJZXJxLT5mbGFncyA9IGtleSArIDE7CisKKwlpZiAoY3J5cHQgPT0gTlVMTCB8fCBjcnlwdC0+b3BzID09IE5VTEwpIHsKKwkJZXJxLT5sZW5ndGggPSAwOworCQllcnEtPmZsYWdzIHw9IElXX0VOQ09ERV9ESVNBQkxFRDsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKHN0cmNtcChjcnlwdC0+b3BzLT5uYW1lLCAiV0VQIikgIT0gMCkgeworCQkvKiBvbmx5IFdFUCBpcyBzdXBwb3J0ZWQgd2l0aCB3aXJlbGVzcyBleHRlbnNpb25zLCBzbyBqdXN0CisJCSAqIHJlcG9ydCB0aGF0IGVuY3J5cHRpb24gaXMgdXNlZCAqLworCQllcnEtPmxlbmd0aCA9IDA7CisJCWVycS0+ZmxhZ3MgfD0gSVdfRU5DT0RFX0VOQUJMRUQ7CisJCXJldHVybiAwOworCX0KKworCWxlbiA9IGNyeXB0LT5vcHMtPmdldF9rZXkoa2V5YnVmLCBXRVBfS0VZX0xFTiwgTlVMTCwgY3J5cHQtPnByaXYpOworCWVycS0+bGVuZ3RoID0gKGxlbiA+PSAwID8gbGVuIDogMCk7CisKKwllcnEtPmZsYWdzIHw9IElXX0VOQ09ERV9FTkFCTEVEOworCisJaWYgKGllZWUtPm9wZW5fd2VwKQorCQllcnEtPmZsYWdzIHw9IElXX0VOQ09ERV9PUEVOOworCWVsc2UKKwkJZXJxLT5mbGFncyB8PSBJV19FTkNPREVfUkVTVFJJQ1RFRDsKKworCXJldHVybiAwOworfQorCitpbnQgaWVlZTgwMjExX3d4X3NldF9lbmNvZGVfZXh0KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGllZWUtPmRldjsKKyAgICAgICAgc3RydWN0IGl3X3BvaW50ICplbmNvZGluZyA9ICZ3cnF1LT5lbmNvZGluZzsKKyAgICAgICAgc3RydWN0IGl3X2VuY29kZV9leHQgKmV4dCA9IChzdHJ1Y3QgaXdfZW5jb2RlX2V4dCAqKWV4dHJhOworICAgICAgICBpbnQgaSwgaWR4LCByZXQgPSAwOworICAgICAgICBpbnQgZ3JvdXBfa2V5ID0gMDsKKyAgICAgICAgY29uc3QgY2hhciAqYWxnLCAqbW9kdWxlOworICAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0b19vcHMgKm9wczsKKyAgICAgICAgc3RydWN0IGllZWU4MDIxMV9jcnlwdF9kYXRhICoqY3J5cHQ7CisKKyAgICAgICAgc3RydWN0IGllZWU4MDIxMV9zZWN1cml0eSBzZWMgPSB7CisgICAgICAgICAgICAgICAgLmZsYWdzID0gMCwKKyAgICAgICAgfTsKKwkvL3ByaW50aygiPT09PT09PmVuY29kaW5nIGZsYWc6JXgsZXh0IGZsYWc6JXgsIGV4dCBhbGc6JWRcbiIsIGVuY29kaW5nLT5mbGFncyxleHQtPmV4dF9mbGFncywgZXh0LT5hbGcpOworICAgICAgICBpZHggPSBlbmNvZGluZy0+ZmxhZ3MgJiBJV19FTkNPREVfSU5ERVg7CisgICAgICAgIGlmIChpZHgpIHsKKyAgICAgICAgICAgICAgICBpZiAoaWR4IDwgMSB8fCBpZHggPiBXRVBfS0VZUykKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgICAgIGlkeC0tOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICBpZHggPSBpZWVlLT50eF9rZXlpZHg7CisKKyAgICAgICAgaWYgKGV4dC0+ZXh0X2ZsYWdzICYgSVdfRU5DT0RFX0VYVF9HUk9VUF9LRVkpIHsKKyAgICAgICAgICAgICAgICBjcnlwdCA9ICZpZWVlLT5jcnlwdFtpZHhdOworICAgICAgICAgICAgICAgIGdyb3VwX2tleSA9IDE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLyogc29tZSBDaXNjbyBBUHMgdXNlIGlkeD4wIGZvciB1bmljYXN0IGluIGR5bmFtaWMgV0VQICovCisJCS8vcHJpbnRrKCJub3QgZ3JvdXAga2V5LCBmbGFnczoleCwgZXh0LT5hbGc6JWRcbiIsIGV4dC0+ZXh0X2ZsYWdzLCBleHQtPmFsZyk7CisgICAgICAgICAgICAgICAgaWYgKGlkeCAhPSAwICYmIGV4dC0+YWxnICE9IElXX0VOQ09ERV9BTEdfV0VQKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICAgICAgaWYgKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9JTkZSQSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNyeXB0ID0gJmllZWUtPmNyeXB0W2lkeF07CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIH0KKworICAgICAgICBzZWMuZmxhZ3MgfD0gU0VDX0VOQUJMRUQ7Ly8gfCBTRUNfRU5DUllQVDsKKyAgICAgICAgaWYgKChlbmNvZGluZy0+ZmxhZ3MgJiBJV19FTkNPREVfRElTQUJMRUQpIHx8CisgICAgICAgICAgICBleHQtPmFsZyA9PSBJV19FTkNPREVfQUxHX05PTkUpIHsKKyAgICAgICAgICAgICAgICBpZiAoKmNyeXB0KQorICAgICAgICAgICAgICAgICAgICAgICAgaWVlZTgwMjExX2NyeXB0X2RlbGF5ZWRfZGVpbml0KGllZWUsIGNyeXB0KTsKKworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBXRVBfS0VZUzsgaSsrKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGllZWUtPmNyeXB0W2ldICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgaWYgKGkgPT0gV0VQX0tFWVMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlYy5lbmFibGVkID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAvLyAgc2VjLmVuY3J5cHQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgc2VjLmxldmVsID0gU0VDX0xFVkVMXzA7CisgICAgICAgICAgICAgICAgICAgICAgICBzZWMuZmxhZ3MgfD0gU0VDX0xFVkVMOworICAgICAgICAgICAgICAgIH0KKwkJLy9wcmludGsoImRpc2FibGVkOiBmbGFnOiV4XG4iLCBlbmNvZGluZy0+ZmxhZ3MpOworICAgICAgICAgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgICAgfQorCisJc2VjLmVuYWJsZWQgPSAxOworICAgIC8vICAgIHNlYy5lbmNyeXB0ID0gMTsKKyNpZiAwCisgICAgICAgIGlmIChncm91cF9rZXkgPyAhaWVlZS0+aG9zdF9tY19kZWNyeXB0IDoKKyAgICAgICAgICAgICEoaWVlZS0+aG9zdF9lbmNyeXB0IHx8IGllZWUtPmhvc3RfZGVjcnlwdCB8fAorICAgICAgICAgICAgICBpZWVlLT5ob3N0X2VuY3J5cHRfbXNkdSkpCisgICAgICAgICAgICAgICAgZ290byBza2lwX2hvc3RfY3J5cHQ7CisjZW5kaWYKKyAgICAgICAgc3dpdGNoIChleHQtPmFsZykgeworICAgICAgICBjYXNlIElXX0VOQ09ERV9BTEdfV0VQOgorICAgICAgICAgICAgICAgIGFsZyA9ICJXRVAiOworICAgICAgICAgICAgICAgIG1vZHVsZSA9ICJpZWVlODAyMTFfY3J5cHRfd2VwIjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBJV19FTkNPREVfQUxHX1RLSVA6CisgICAgICAgICAgICAgICAgYWxnID0gIlRLSVAiOworICAgICAgICAgICAgICAgIG1vZHVsZSA9ICJpZWVlODAyMTFfY3J5cHRfdGtpcCI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgSVdfRU5DT0RFX0FMR19DQ01QOgorICAgICAgICAgICAgICAgIGFsZyA9ICJDQ01QIjsKKyAgICAgICAgICAgICAgICBtb2R1bGUgPSAiaWVlZTgwMjExX2NyeXB0X2NjbXAiOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIElFRUU4MDIxMV9ERUJVR19XWCgiJXM6IHVua25vd24gY3J5cHRvIGFsZyAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2LT5uYW1lLCBleHQtPmFsZyk7CisgICAgICAgICAgICAgICAgcmV0ID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICBnb3RvIGRvbmU7CisgICAgICAgIH0KKy8vCXByaW50aygiOC0wOS0wOC05PT09PT0+JXMsIGFsZyBuYW1lOiVzXG4iLF9fZnVuY19fLCBhbGcpOworCisJIG9wcyA9IGllZWU4MDIxMV9nZXRfY3J5cHRvX29wcyhhbGcpOworICAgICAgICBpZiAob3BzID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICByZXF1ZXN0X21vZHVsZShtb2R1bGUpOworICAgICAgICAgICAgICAgIG9wcyA9IGllZWU4MDIxMV9nZXRfY3J5cHRvX29wcyhhbGcpOworICAgICAgICB9CisgICAgICAgIGlmIChvcHMgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIElFRUU4MDIxMV9ERUJVR19XWCgiJXM6IHVua25vd24gY3J5cHRvIGFsZyAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2LT5uYW1lLCBleHQtPmFsZyk7CisJCXByaW50aygiPT09PT09PT0+dW5rbm93biBjcnlwdG8gYWxnICVkXG4iLCBleHQtPmFsZyk7CisgICAgICAgICAgICAgICAgcmV0ID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICBnb3RvIGRvbmU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKmNyeXB0ID09IE5VTEwgfHwgKCpjcnlwdCktPm9wcyAhPSBvcHMpIHsKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEgKm5ld19jcnlwdDsKKworICAgICAgICAgICAgICAgIGllZWU4MDIxMV9jcnlwdF9kZWxheWVkX2RlaW5pdChpZWVlLCBjcnlwdCk7CisKKyAgICAgICAgICAgICAgICBuZXdfY3J5cHQgPSBremFsbG9jKHNpemVvZigqbmV3X2NyeXB0KSwgR0ZQX0tFUk5FTCk7CisgICAgICAgICAgICAgICAgaWYgKG5ld19jcnlwdCA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSAtRU5PTUVNOworICAgICAgICAgICAgICAgICAgICAgICAgZ290byBkb25lOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBuZXdfY3J5cHQtPm9wcyA9IG9wczsKKyAgICAgICAgICAgICAgICBpZiAobmV3X2NyeXB0LT5vcHMgJiYgdHJ5X21vZHVsZV9nZXQobmV3X2NyeXB0LT5vcHMtPm93bmVyKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld19jcnlwdC0+cHJpdiA9IG5ld19jcnlwdC0+b3BzLT5pbml0KGlkeCk7CisgICAgICAgICAgICAgICAgaWYgKG5ld19jcnlwdC0+cHJpdiA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBrZnJlZShuZXdfY3J5cHQpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgKmNyeXB0ID0gbmV3X2NyeXB0OworCisgCX0KKworICAgICAgICBpZiAoZXh0LT5rZXlfbGVuID4gMCAmJiAoKmNyeXB0KS0+b3BzLT5zZXRfa2V5ICYmCisgICAgICAgICAgICAoKmNyeXB0KS0+b3BzLT5zZXRfa2V5KGV4dC0+a2V5LCBleHQtPmtleV9sZW4sIGV4dC0+cnhfc2VxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmNyeXB0KS0+cHJpdikgPCAwKSB7CisgICAgICAgICAgICAgICAgSUVFRTgwMjExX0RFQlVHX1dYKCIlczoga2V5IHNldHRpbmcgZmFpbGVkXG4iLCBkZXYtPm5hbWUpOworCQlwcmludGsoImtleSBzZXR0aW5nIGZhaWxlZFxuIik7CisgICAgICAgICAgICAgICAgcmV0ID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICBnb3RvIGRvbmU7CisgICAgICAgIH0KKyNpZiAxCisgLy9za2lwX2hvc3RfY3J5cHQ6CisJLy9wcmludGsoInNraXBfaG9zdF9jcnlwdDpleHRfZmxhZ3M6JXhcbiIsIGV4dC0+ZXh0X2ZsYWdzKTsKKyAgICAgICAgaWYgKGV4dC0+ZXh0X2ZsYWdzICYgSVdfRU5DT0RFX0VYVF9TRVRfVFhfS0VZKSB7CisgICAgICAgICAgICAgICAgaWVlZS0+dHhfa2V5aWR4ID0gaWR4OworICAgICAgICAgICAgICAgIHNlYy5hY3RpdmVfa2V5ID0gaWR4OworICAgICAgICAgICAgICAgIHNlYy5mbGFncyB8PSBTRUNfQUNUSVZFX0tFWTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChleHQtPmFsZyAhPSBJV19FTkNPREVfQUxHX05PTkUpIHsKKyAgICAgICAgICAgICAgICBtZW1jcHkoc2VjLmtleXNbaWR4XSwgZXh0LT5rZXksIGV4dC0+a2V5X2xlbik7CisgICAgICAgICAgICAgICAgc2VjLmtleV9zaXplc1tpZHhdID0gZXh0LT5rZXlfbGVuOworICAgICAgICAgICAgICAgIHNlYy5mbGFncyB8PSAoMSA8PCBpZHgpOworICAgICAgICAgICAgICAgIGlmIChleHQtPmFsZyA9PSBJV19FTkNPREVfQUxHX1dFUCkgeworICAgICAgICAgICAgICAgICAgICAgIC8vICBzZWMuZW5jb2RlX2FsZ1tpZHhdID0gU0VDX0FMR19XRVA7CisgICAgICAgICAgICAgICAgICAgICAgICBzZWMuZmxhZ3MgfD0gU0VDX0xFVkVMOworICAgICAgICAgICAgICAgICAgICAgICAgc2VjLmxldmVsID0gU0VDX0xFVkVMXzE7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChleHQtPmFsZyA9PSBJV19FTkNPREVfQUxHX1RLSVApIHsKKyAgICAgICAgICAgICAgICAgICAgICAvLyAgc2VjLmVuY29kZV9hbGdbaWR4XSA9IFNFQ19BTEdfVEtJUDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlYy5mbGFncyB8PSBTRUNfTEVWRUw7CisgICAgICAgICAgICAgICAgICAgICAgICBzZWMubGV2ZWwgPSBTRUNfTEVWRUxfMjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGV4dC0+YWxnID09IElXX0VOQ09ERV9BTEdfQ0NNUCkgeworICAgICAgICAgICAgICAgICAgICAgICAvLyBzZWMuZW5jb2RlX2FsZ1tpZHhdID0gU0VDX0FMR19DQ01QOworICAgICAgICAgICAgICAgICAgICAgICAgc2VjLmZsYWdzIHw9IFNFQ19MRVZFTDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlYy5sZXZlbCA9IFNFQ19MRVZFTF8zOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvKiBEb24ndCBzZXQgc2VjIGxldmVsIGZvciBncm91cCBrZXlzLiAqLworICAgICAgICAgICAgICAgIGlmIChncm91cF9rZXkpCisgICAgICAgICAgICAgICAgICAgICAgICBzZWMuZmxhZ3MgJj0gflNFQ19MRVZFTDsKKyAgICAgICAgfQorI2VuZGlmCitkb25lOgorICAgICAgICBpZiAoaWVlZS0+c2V0X3NlY3VyaXR5KQorICAgICAgICAgICAgICAgIGllZWUtPnNldF9zZWN1cml0eShpZWVlLT5kZXYsICZzZWMpOworCisJIGlmIChpZWVlLT5yZXNldF9vbl9rZXljaGFuZ2UgJiYKKyAgICAgICAgICAgIGllZWUtPml3X21vZGUgIT0gSVdfTU9ERV9JTkZSQSAmJgorICAgICAgICAgICAgaWVlZS0+cmVzZXRfcG9ydCAmJiBpZWVlLT5yZXNldF9wb3J0KGRldikpIHsKKyAgICAgICAgICAgICAgICBJRUVFODAyMTFfREVCVUdfV1goIiVzOiByZXNldF9wb3J0IGZhaWxlZFxuIiwgZGV2LT5uYW1lKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByZXQ7Cit9CitpbnQgaWVlZTgwMjExX3d4X3NldF9tbG1lKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IGl3X21sbWUgKm1sbWUgPSAoc3RydWN0IGl3X21sbWUgKikgZXh0cmE7CisvLwlwcmludGsoIlxuZGtnYWRmc2xrZGpnYWxza2RmPT09PT09PT09PT09PT09PiVzKCksIGNtZDoleFxuIiwgX19mdW5jX18sIG1sbWUtPmNtZCk7CisjaWYgMQorCXN3aXRjaCAobWxtZS0+Y21kKSB7CisgICAgICAgIGNhc2UgSVdfTUxNRV9ERUFVVEg6CisJY2FzZSBJV19NTE1FX0RJU0FTU09DOgorCS8vCXByaW50aygiZGlzYXNzb2Mgbm93XG4iKTsKKwkJaWVlZTgwMjExX2Rpc2Fzc29jaWF0ZShpZWVlKTsKKwkJYnJlYWs7CisJIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FT1BOT1RTVVBQOworICAgICAgICB9CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKworaW50IGllZWU4MDIxMV93eF9zZXRfYXV0aChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpd19wYXJhbSAqZGF0YSwgY2hhciAqZXh0cmEpCit7CisvKgorCSBzdHJ1Y3QgaWVlZTgwMjExX3NlY3VyaXR5IHNlYyA9IHsKKyAgICAgICAgICAgICAgICAuZmxhZ3MgPSBTRUNfQVVUSF9NT0RFLAorCX0KKyovCisJLy9wcmludGsoInNldCBhdXRoOmZsYWc6JXgsIGRhdGEgdmFsdWU6JXhcbiIsIGRhdGEtPmZsYWdzLCBkYXRhLT52YWx1ZSk7CisJc3dpdGNoIChkYXRhLT5mbGFncyAmIElXX0FVVEhfSU5ERVgpIHsKKyAgICAgICAgY2FzZSBJV19BVVRIX1dQQV9WRVJTSU9OOgorCSAgICAgLypuZWVkIHRvIHN1cHBvcnQgd3BhMiBoZXJlKi8KKwkJLy9wcmludGsoIndwYSB2ZXJzaW9uOiV4XG4iLCBkYXRhLT52YWx1ZSk7CisJCWJyZWFrOworICAgICAgICBjYXNlIElXX0FVVEhfQ0lQSEVSX1BBSVJXSVNFOgorICAgICAgICBjYXNlIElXX0FVVEhfQ0lQSEVSX0dST1VQOgorICAgICAgICBjYXNlIElXX0FVVEhfS0VZX01HTVQ6CisgICAgICAgICAgICAgICAgLyoKKyAqICAgICAgICAgICAgICAgICAgKiBIb3N0IEFQIGRyaXZlciBkb2VzIG5vdCB1c2UgdGhlc2UgcGFyYW1ldGVycyBhbmQgYWxsb3dzCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiB3cGFfc3VwcGxpY2FudCB0byBjb250cm9sIHRoZW0gaW50ZXJuYWxseS4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgSVdfQVVUSF9US0lQX0NPVU5URVJNRUFTVVJFUzoKKyAgICAgICAgICAgICAgICBpZWVlLT50a2lwX2NvdW50ZXJtZWFzdXJlcyA9IGRhdGEtPnZhbHVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIElXX0FVVEhfRFJPUF9VTkVOQ1JZUFRFRDoKKyAgICAgICAgICAgICAgICBpZWVlLT5kcm9wX3VuZW5jcnlwdGVkID0gZGF0YS0+dmFsdWU7CisJCWJyZWFrOworCisJY2FzZSBJV19BVVRIXzgwMjExX0FVVEhfQUxHOgorCQlpZWVlLT5vcGVuX3dlcCA9IChkYXRhLT52YWx1ZSZJV19BVVRIX0FMR19PUEVOX1NZU1RFTSk/MTowOworCQkvL3ByaW50aygib3Blbl93ZXA6JWRcbiIsIGllZWUtPm9wZW5fd2VwKTsKKwkJYnJlYWs7CisKKyNpZiAxCisJY2FzZSBJV19BVVRIX1dQQV9FTkFCTEVEOgorCQlpZWVlLT53cGFfZW5hYmxlZCA9IChkYXRhLT52YWx1ZSk/MTowOworCQkvL3ByaW50aygiZW5hbGJlIHdwYTolZFxuIiwgaWVlZS0+d3BhX2VuYWJsZWQpOworCQlicmVhazsKKworI2VuZGlmCisJY2FzZSBJV19BVVRIX1JYX1VORU5DUllQVEVEX0VBUE9MOgorICAgICAgICAgICAgICAgIGllZWUtPmllZWU4MDJfMXggPSBkYXRhLT52YWx1ZTsKKwkJYnJlYWs7CisJY2FzZSBJV19BVVRIX1BSSVZBQ1lfSU5WT0tFRDoKKwkJaWVlZS0+cHJpdmFjeV9pbnZva2VkID0gZGF0YS0+dmFsdWU7CisJCWJyZWFrOworCWRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KKwlyZXR1cm4gMDsKK30KKworI2lmIDEKK2ludCBpZWVlODAyMTFfd3hfc2V0X2dlbl9pZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgdTggKmllLCBzaXplX3QgbGVuKQoreworI2lmIDAKKwlwcmludGsoIj09PT0+JXMoKVxuIiwgX19mdW5jX18pOworCXsKKwkJaW50IGk7CisJCWZvciAoaT0wOyBpPGxlbjsgaSsrKQorCQlwcmludGsoIiUyeCAiLCBpZVtpXSYweGZmKTsKKwkJcHJpbnRrKCJcbiIpOworCX0KKyNlbmRpZgorCXU4ICpidWYgPSBOVUxMOworCisJaWYgKGxlbj5NQVhfV1BBX0lFX0xFTiB8fCAobGVuICYmIGllID09IE5VTEwpKQorCXsKKwkJcHJpbnRrKCJyZXR1cm4gZXJyb3Igb3V0LCBsZW46JWRcbiIsIGxlbik7CisJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGxlbikKKwl7CisJCWlmIChsZW4gIT0gaWVbMV0rMil7CisJCQlwcmludGsoImxlbjolZCwgaWU6JWRcbiIsIGxlbiwgaWVbMV0pOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJYnVmID0ga21hbGxvYyhsZW4sIEdGUF9LRVJORUwpOworCQlpZiAoYnVmID09IE5VTEwpCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJbWVtY3B5KGJ1ZiwgaWUsIGxlbik7CisJCWtmcmVlKGllZWUtPndwYV9pZSk7CisJCWllZWUtPndwYV9pZSA9IGJ1ZjsKKwkJaWVlZS0+d3BhX2llX2xlbiA9IGxlbjsKKwl9CisJZWxzZXsKKwkJaWYgKGllZWUtPndwYV9pZSkKKwkJa2ZyZWUoaWVlZS0+d3BhX2llKTsKKwkJaWVlZS0+d3BhX2llID0gTlVMTDsKKwkJaWVlZS0+d3BhX2llX2xlbiA9IDA7CisJfQorLy8JcHJpbnRrKCI8PT09PT1vdXQgJXMoKVxuIiwgX19mdW5jX18pOworCisJcmV0dXJuIDA7CisKK30KKyNlbmRpZgorCisjaWYgMAorRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfd3hfc2V0X2dlbl9pZSk7CitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV93eF9zZXRfbWxtZSk7CitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV93eF9zZXRfYXV0aCk7CitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV93eF9zZXRfZW5jb2RlX2V4dCk7CitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV93eF9nZXRfc2Nhbik7CitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV93eF9zZXRfZW5jb2RlKTsKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX3d4X2dldF9lbmNvZGUpOworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS9pbnRlcm5hbC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvaW50ZXJuYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZGMyMjM1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvaW50ZXJuYWwuaApAQCAtMCwwICsxLDExNSBAQAorLyoKKyAqIENyeXB0b2dyYXBoaWMgQVBJLgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMiBKYW1lcyBNb3JyaXMgPGptb3JyaXNAaW50ZXJjb2RlLmNvbS5hdT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqLworI2lmbmRlZiBfQ1JZUFRPX0lOVEVSTkFMX0gKKyNkZWZpbmUgX0NSWVBUT19JTlRFUk5BTF9ICisKKworLy8jaW5jbHVkZSA8bGludXgvY3J5cHRvLmg+CisjaW5jbHVkZSAicnRsX2NyeXB0by5oIgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxhc20vaGFyZGlycS5oPgorI2luY2x1ZGUgPGFzbS9zb2Z0aXJxLmg+CisjaW5jbHVkZSA8YXNtL2ttYXBfdHlwZXMuaD4KKworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDQsMjApKQorI2RlZmluZSBsaXN0X2Zvcl9lYWNoX2VudHJ5KHBvcywgaGVhZCwgbWVtYmVyKQkJCQlcCisJZm9yIChwb3MgPSBsaXN0X2VudHJ5KChoZWFkKS0+bmV4dCwgdHlwZW9mKCpwb3MpLCBtZW1iZXIpLAlcCisJCSAgICAgcHJlZmV0Y2gocG9zLT5tZW1iZXIubmV4dCk7CQkJXAorCSAgICAgJnBvcy0+bWVtYmVyICE9IChoZWFkKTsgCQkJCQlcCisJICAgICBwb3MgPSBsaXN0X2VudHJ5KHBvcy0+bWVtYmVyLm5leHQsIHR5cGVvZigqcG9zKSwgbWVtYmVyKSwJXAorCQkgICAgIHByZWZldGNoKHBvcy0+bWVtYmVyLm5leHQpKQorCitzdGF0aWMgaW5saW5lIHZvaWQgY29uZF9yZXNjaGVkKHZvaWQpCit7CisJaWYgKG5lZWRfcmVzY2hlZCgpKSB7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJCXNjaGVkdWxlKCk7CisJfQorfQorI2VuZGlmCisKK2V4dGVybiBlbnVtIGttX3R5cGUgY3J5cHRvX2ttX3R5cGVzW107CisKK3N0YXRpYyBpbmxpbmUgZW51bSBrbV90eXBlIGNyeXB0b19rbWFwX3R5cGUoaW50IG91dCkKK3sKKwlyZXR1cm4gY3J5cHRvX2ttX3R5cGVzWyhpbl9zb2Z0aXJxKCkgPyAyIDogMCkgKyBvdXRdOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgKmNyeXB0b19rbWFwKHN0cnVjdCBwYWdlICpwYWdlLCBpbnQgb3V0KQoreworCXJldHVybiBrbWFwX2F0b21pYyhwYWdlLCBjcnlwdG9fa21hcF90eXBlKG91dCkpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY3J5cHRvX2t1bm1hcCh2b2lkICp2YWRkciwgaW50IG91dCkKK3sKKwlrdW5tYXBfYXRvbWljKHZhZGRyLCBjcnlwdG9fa21hcF90eXBlKG91dCkpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY3J5cHRvX3lpZWxkKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCit7CisJaWYgKCFpbl9zb2Z0aXJxKCkpCisJCWNvbmRfcmVzY2hlZCgpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgKmNyeXB0b190Zm1fY3R4KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCit7CisJcmV0dXJuICh2b2lkICopJnRmbVsxXTsKK30KKworc3RydWN0IGNyeXB0b19hbGcgKmNyeXB0b19hbGdfbG9va3VwKGNvbnN0IGNoYXIgKm5hbWUpOworCisjaWZkZWYgQ09ORklHX0tNT0QKK3ZvaWQgY3J5cHRvX2FsZ19hdXRvbG9hZChjb25zdCBjaGFyICpuYW1lKTsKK3N0cnVjdCBjcnlwdG9fYWxnICpjcnlwdG9fYWxnX21vZF9sb29rdXAoY29uc3QgY2hhciAqbmFtZSk7CisjZWxzZQorc3RhdGljIGlubGluZSBzdHJ1Y3QgY3J5cHRvX2FsZyAqY3J5cHRvX2FsZ19tb2RfbG9va3VwKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJcmV0dXJuIGNyeXB0b19hbGdfbG9va3VwKG5hbWUpOworfQorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfQ1JZUFRPX0hNQUMKK2ludCBjcnlwdG9fYWxsb2NfaG1hY19ibG9jayhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKTsKK3ZvaWQgY3J5cHRvX2ZyZWVfaG1hY19ibG9jayhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIGludCBjcnlwdG9fYWxsb2NfaG1hY19ibG9jayhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY3J5cHRvX2ZyZWVfaG1hY19ibG9jayhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQoreyB9CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19QUk9DX0ZTCit2b2lkIF9faW5pdCBjcnlwdG9faW5pdF9wcm9jKHZvaWQpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBjcnlwdG9faW5pdF9wcm9jKHZvaWQpCit7IH0KKyNlbmRpZgorCitpbnQgY3J5cHRvX2luaXRfZGlnZXN0X2ZsYWdzKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHUzMiBmbGFncyk7CitpbnQgY3J5cHRvX2luaXRfY2lwaGVyX2ZsYWdzKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHUzMiBmbGFncyk7CitpbnQgY3J5cHRvX2luaXRfY29tcHJlc3NfZmxhZ3Moc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgdTMyIGZsYWdzKTsKKworaW50IGNyeXB0b19pbml0X2RpZ2VzdF9vcHMoc3RydWN0IGNyeXB0b190Zm0gKnRmbSk7CitpbnQgY3J5cHRvX2luaXRfY2lwaGVyX29wcyhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKTsKK2ludCBjcnlwdG9faW5pdF9jb21wcmVzc19vcHMoc3RydWN0IGNyeXB0b190Zm0gKnRmbSk7CisKK3ZvaWQgY3J5cHRvX2V4aXRfZGlnZXN0X29wcyhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKTsKK3ZvaWQgY3J5cHRvX2V4aXRfY2lwaGVyX29wcyhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKTsKK3ZvaWQgY3J5cHRvX2V4aXRfY29tcHJlc3Nfb3BzKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pOworCisjZW5kaWYJLyogX0NSWVBUT19JTlRFUk5BTF9IICovCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL3J0bF9jcnlwdG8uaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL3J0bF9jcnlwdG8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZWQwY2E0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvcnRsX2NyeXB0by5oCkBAIC0wLDAgKzEsMzk5IEBACisvKgorICogU2NhdHRlcmxpc3QgQ3J5cHRvZ3JhcGhpYyBBUEkuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAyIEphbWVzIE1vcnJpcyA8am1vcnJpc0BpbnRlcmNvZGUuY29tLmF1PgorICogQ29weXJpZ2h0IChjKSAyMDAyIERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AcmVkaGF0LmNvbSkKKyAqCisgKiBQb3J0aW9ucyBkZXJpdmVkIGZyb20gQ3J5cHRvYXBpLCBieSBBbGV4YW5kZXIgS2plbGRhYXMgPGFzdG9yQGZhc3Qubm8+CisgKiBhbmQgTmV0dGxlLCBieSBOaWVscyBN6bCIbGVyLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICovCisjaWZuZGVmIF9MSU5VWF9DUllQVE9fSAorI2RlZmluZSBfTElOVVhfQ1JZUFRPX0gKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisjaW5jbHVkZSA8YXNtL2Vycm5vLmg+CisKKyNkZWZpbmUgY3J5cHRvX3JlZ2lzdGVyX2FsZyBjcnlwdG9fcmVnaXN0ZXJfYWxnX3J0bAorI2RlZmluZSBjcnlwdG9fdW5yZWdpc3Rlcl9hbGcgY3J5cHRvX3VucmVnaXN0ZXJfYWxnX3J0bAorI2RlZmluZSBjcnlwdG9fYWxsb2NfdGZtIGNyeXB0b19hbGxvY190Zm1fcnRsCisjZGVmaW5lIGNyeXB0b19mcmVlX3RmbSBjcnlwdG9fZnJlZV90Zm1fcnRsCisjZGVmaW5lIGNyeXB0b19hbGdfYXZhaWxhYmxlIGNyeXB0b19hbGdfYXZhaWxhYmxlX3J0bAorCisvKgorICogQWxnb3JpdGhtIG1hc2tzIGFuZCB0eXBlcy4KKyAqLworI2RlZmluZSBDUllQVE9fQUxHX1RZUEVfTUFTSwkJMHgwMDAwMDBmZgorI2RlZmluZSBDUllQVE9fQUxHX1RZUEVfQ0lQSEVSCQkweDAwMDAwMDAxCisjZGVmaW5lIENSWVBUT19BTEdfVFlQRV9ESUdFU1QJCTB4MDAwMDAwMDIKKyNkZWZpbmUgQ1JZUFRPX0FMR19UWVBFX0NPTVBSRVNTCTB4MDAwMDAwMDQKKworLyoKKyAqIFRyYW5zZm9ybSBtYXNrcyBhbmQgdmFsdWVzIChmb3IgY3J0X2ZsYWdzKS4KKyAqLworI2RlZmluZSBDUllQVE9fVEZNX01PREVfTUFTSwkJMHgwMDAwMDBmZgorI2RlZmluZSBDUllQVE9fVEZNX1JFUV9NQVNLCQkweDAwMGZmZjAwCisjZGVmaW5lIENSWVBUT19URk1fUkVTX01BU0sJCTB4ZmZmMDAwMDAKKworI2RlZmluZSBDUllQVE9fVEZNX01PREVfRUNCCQkweDAwMDAwMDAxCisjZGVmaW5lIENSWVBUT19URk1fTU9ERV9DQkMJCTB4MDAwMDAwMDIKKyNkZWZpbmUgQ1JZUFRPX1RGTV9NT0RFX0NGQgkJMHgwMDAwMDAwNAorI2RlZmluZSBDUllQVE9fVEZNX01PREVfQ1RSCQkweDAwMDAwMDA4CisKKyNkZWZpbmUgQ1JZUFRPX1RGTV9SRVFfV0VBS19LRVkJCTB4MDAwMDAxMDAKKyNkZWZpbmUgQ1JZUFRPX1RGTV9SRVNfV0VBS19LRVkJCTB4MDAxMDAwMDAKKyNkZWZpbmUgQ1JZUFRPX1RGTV9SRVNfQkFEX0tFWV9MRU4gICAJMHgwMDIwMDAwMAorI2RlZmluZSBDUllQVE9fVEZNX1JFU19CQURfS0VZX1NDSEVEIAkweDAwNDAwMDAwCisjZGVmaW5lIENSWVBUT19URk1fUkVTX0JBRF9CTE9DS19MRU4gCTB4MDA4MDAwMDAKKyNkZWZpbmUgQ1JZUFRPX1RGTV9SRVNfQkFEX0ZMQUdTIAkweDAxMDAwMDAwCisKKy8qCisgKiBNaXNjZWxsYW5lb3VzIHN0dWZmLgorICovCisjZGVmaW5lIENSWVBUT19VTlNQRUMJCQkwCisjZGVmaW5lIENSWVBUT19NQVhfQUxHX05BTUUJCTY0CisKK3N0cnVjdCBzY2F0dGVybGlzdDsKKworLyoKKyAqIEFsZ29yaXRobXM6IG1vZHVsYXIgY3J5cHRvIGFsZ29yaXRobSBpbXBsZW1lbnRhdGlvbnMsIG1hbmFnZWQKKyAqIHZpYSBjcnlwdG9fcmVnaXN0ZXJfYWxnKCkgYW5kIGNyeXB0b191bnJlZ2lzdGVyX2FsZygpLgorICovCitzdHJ1Y3QgY2lwaGVyX2FsZyB7CisJdW5zaWduZWQgaW50IGNpYV9taW5fa2V5c2l6ZTsKKwl1bnNpZ25lZCBpbnQgY2lhX21heF9rZXlzaXplOworCWludCAoKmNpYV9zZXRrZXkpKHZvaWQgKmN0eCwgY29uc3QgdTggKmtleSwKKwkgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQga2V5bGVuLCB1MzIgKmZsYWdzKTsKKwl2b2lkICgqY2lhX2VuY3J5cHQpKHZvaWQgKmN0eCwgdTggKmRzdCwgY29uc3QgdTggKnNyYyk7CisJdm9pZCAoKmNpYV9kZWNyeXB0KSh2b2lkICpjdHgsIHU4ICpkc3QsIGNvbnN0IHU4ICpzcmMpOworfTsKKworc3RydWN0IGRpZ2VzdF9hbGcgeworCXVuc2lnbmVkIGludCBkaWFfZGlnZXN0c2l6ZTsKKwl2b2lkICgqZGlhX2luaXQpKHZvaWQgKmN0eCk7CisJdm9pZCAoKmRpYV91cGRhdGUpKHZvaWQgKmN0eCwgY29uc3QgdTggKmRhdGEsIHVuc2lnbmVkIGludCBsZW4pOworCXZvaWQgKCpkaWFfZmluYWwpKHZvaWQgKmN0eCwgdTggKm91dCk7CisJaW50ICgqZGlhX3NldGtleSkodm9pZCAqY3R4LCBjb25zdCB1OCAqa2V5LAorCSAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBrZXlsZW4sIHUzMiAqZmxhZ3MpOworfTsKKworc3RydWN0IGNvbXByZXNzX2FsZyB7CisJaW50ICgqY29hX2luaXQpKHZvaWQgKmN0eCk7CisJdm9pZCAoKmNvYV9leGl0KSh2b2lkICpjdHgpOworCWludCAoKmNvYV9jb21wcmVzcykodm9pZCAqY3R4LCBjb25zdCB1OCAqc3JjLCB1bnNpZ25lZCBpbnQgc2xlbiwKKwkgICAgICAgICAgICAgICAgICAgIHU4ICpkc3QsIHVuc2lnbmVkIGludCAqZGxlbik7CisJaW50ICgqY29hX2RlY29tcHJlc3MpKHZvaWQgKmN0eCwgY29uc3QgdTggKnNyYywgdW5zaWduZWQgaW50IHNsZW4sCisJICAgICAgICAgICAgICAgICAgICAgIHU4ICpkc3QsIHVuc2lnbmVkIGludCAqZGxlbik7Cit9OworCisjZGVmaW5lIGNyYV9jaXBoZXIJY3JhX3UuY2lwaGVyCisjZGVmaW5lIGNyYV9kaWdlc3QJY3JhX3UuZGlnZXN0CisjZGVmaW5lIGNyYV9jb21wcmVzcwljcmFfdS5jb21wcmVzcworCitzdHJ1Y3QgY3J5cHRvX2FsZyB7CisJc3RydWN0IGxpc3RfaGVhZCBjcmFfbGlzdDsKKwl1MzIgY3JhX2ZsYWdzOworCXVuc2lnbmVkIGludCBjcmFfYmxvY2tzaXplOworCXVuc2lnbmVkIGludCBjcmFfY3R4c2l6ZTsKKwljb25zdCBjaGFyIGNyYV9uYW1lW0NSWVBUT19NQVhfQUxHX05BTUVdOworCisJdW5pb24geworCQlzdHJ1Y3QgY2lwaGVyX2FsZyBjaXBoZXI7CisJCXN0cnVjdCBkaWdlc3RfYWxnIGRpZ2VzdDsKKwkJc3RydWN0IGNvbXByZXNzX2FsZyBjb21wcmVzczsKKwl9IGNyYV91OworCisJc3RydWN0IG1vZHVsZSAqY3JhX21vZHVsZTsKK307CisKKy8qCisgKiBBbGdvcml0aG0gcmVnaXN0cmF0aW9uIGludGVyZmFjZS4KKyAqLworaW50IGNyeXB0b19yZWdpc3Rlcl9hbGcoc3RydWN0IGNyeXB0b19hbGcgKmFsZyk7CitpbnQgY3J5cHRvX3VucmVnaXN0ZXJfYWxnKHN0cnVjdCBjcnlwdG9fYWxnICphbGcpOworCisvKgorICogQWxnb3JpdGhtIHF1ZXJ5IGludGVyZmFjZS4KKyAqLworaW50IGNyeXB0b19hbGdfYXZhaWxhYmxlKGNvbnN0IGNoYXIgKm5hbWUsIHUzMiBmbGFncyk7CisKKy8qCisgKiBUcmFuc2Zvcm1zOiB1c2VyLWluc3RhbnRpYXRlZCBvYmplY3RzIHdoaWNoIGVuY2Fwc3VsYXRlIGFsZ29yaXRobXMKKyAqIGFuZCBjb3JlIHByb2Nlc3NpbmcgbG9naWMuICBNYW5hZ2VkIHZpYSBjcnlwdG9fYWxsb2NfdGZtKCkgYW5kCisgKiBjcnlwdG9fZnJlZV90Zm0oKSwgYXMgd2VsbCBhcyB0aGUgdmFyaW91cyBoZWxwZXJzIGJlbG93LgorICovCitzdHJ1Y3QgY3J5cHRvX3RmbTsKKworc3RydWN0IGNpcGhlcl90Zm0geworCXZvaWQgKmNpdF9pdjsKKwl1bnNpZ25lZCBpbnQgY2l0X2l2c2l6ZTsKKwl1MzIgY2l0X21vZGU7CisJaW50ICgqY2l0X3NldGtleSkoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKKwkgICAgICAgICAgICAgICAgICBjb25zdCB1OCAqa2V5LCB1bnNpZ25lZCBpbnQga2V5bGVuKTsKKwlpbnQgKCpjaXRfZW5jcnlwdCkoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKKwkJCSAgIHN0cnVjdCBzY2F0dGVybGlzdCAqZHN0LAorCQkJICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzcmMsCisJCQkgICB1bnNpZ25lZCBpbnQgbmJ5dGVzKTsKKwlpbnQgKCpjaXRfZW5jcnlwdF9pdikoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKKwkgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpkc3QsCisJICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLAorCSAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbmJ5dGVzLCB1OCAqaXYpOworCWludCAoKmNpdF9kZWNyeXB0KShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAorCQkJICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpkc3QsCisJCQkgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNyYywKKwkJCSAgIHVuc2lnbmVkIGludCBuYnl0ZXMpOworCWludCAoKmNpdF9kZWNyeXB0X2l2KShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAorCQkJICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpkc3QsCisJCQkgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNyYywKKwkJCSAgIHVuc2lnbmVkIGludCBuYnl0ZXMsIHU4ICppdik7CisJdm9pZCAoKmNpdF94b3JfYmxvY2spKHU4ICpkc3QsIGNvbnN0IHU4ICpzcmMpOworfTsKKworc3RydWN0IGRpZ2VzdF90Zm0geworCXZvaWQgKCpkaXRfaW5pdCkoc3RydWN0IGNyeXB0b190Zm0gKnRmbSk7CisJdm9pZCAoKmRpdF91cGRhdGUpKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCisJICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csIHVuc2lnbmVkIGludCBuc2cpOworCXZvaWQgKCpkaXRfZmluYWwpKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHU4ICpvdXQpOworCXZvaWQgKCpkaXRfZGlnZXN0KShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLAorCSAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbnNnLCB1OCAqb3V0KTsKKwlpbnQgKCpkaXRfc2V0a2V5KShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAorCSAgICAgICAgICAgICAgICAgIGNvbnN0IHU4ICprZXksIHVuc2lnbmVkIGludCBrZXlsZW4pOworI2lmZGVmIENPTkZJR19DUllQVE9fSE1BQworCXZvaWQgKmRpdF9obWFjX2Jsb2NrOworI2VuZGlmCit9OworCitzdHJ1Y3QgY29tcHJlc3NfdGZtIHsKKwlpbnQgKCpjb3RfY29tcHJlc3MpKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCisJICAgICAgICAgICAgICAgICAgICBjb25zdCB1OCAqc3JjLCB1bnNpZ25lZCBpbnQgc2xlbiwKKwkgICAgICAgICAgICAgICAgICAgIHU4ICpkc3QsIHVuc2lnbmVkIGludCAqZGxlbik7CisJaW50ICgqY290X2RlY29tcHJlc3MpKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCisJICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHU4ICpzcmMsIHVuc2lnbmVkIGludCBzbGVuLAorCSAgICAgICAgICAgICAgICAgICAgICB1OCAqZHN0LCB1bnNpZ25lZCBpbnQgKmRsZW4pOworfTsKKworI2RlZmluZSBjcnRfY2lwaGVyCWNydF91LmNpcGhlcgorI2RlZmluZSBjcnRfZGlnZXN0CWNydF91LmRpZ2VzdAorI2RlZmluZSBjcnRfY29tcHJlc3MJY3J0X3UuY29tcHJlc3MKKworc3RydWN0IGNyeXB0b190Zm0geworCisJdTMyIGNydF9mbGFnczsKKworCXVuaW9uIHsKKwkJc3RydWN0IGNpcGhlcl90Zm0gY2lwaGVyOworCQlzdHJ1Y3QgZGlnZXN0X3RmbSBkaWdlc3Q7CisJCXN0cnVjdCBjb21wcmVzc190Zm0gY29tcHJlc3M7CisJfSBjcnRfdTsKKworCXN0cnVjdCBjcnlwdG9fYWxnICpfX2NydF9hbGc7Cit9OworCisvKgorICogVHJhbnNmb3JtIHVzZXIgaW50ZXJmYWNlLgorICovCisKKy8qCisgKiBjcnlwdG9fYWxsb2NfdGZtKCkgd2lsbCBmaXJzdCBhdHRlbXB0IHRvIGxvY2F0ZSBhbiBhbHJlYWR5IGxvYWRlZCBhbGdvcml0aG0uCisgKiBJZiB0aGF0IGZhaWxzIGFuZCB0aGUga2VybmVsIHN1cHBvcnRzIGR5bmFtaWNhbGx5IGxvYWRhYmxlIG1vZHVsZXMsIGl0CisgKiB3aWxsIHRoZW4gYXR0ZW1wdCB0byBsb2FkIGEgbW9kdWxlIG9mIHRoZSBzYW1lIG5hbWUgb3IgYWxpYXMuICBBIHJlZmNvdW50CisgKiBpcyBncmFiYmVkIG9uIHRoZSBhbGdvcml0aG0gd2hpY2ggaXMgdGhlbiBhc3NvY2lhdGVkIHdpdGggdGhlIG5ldyB0cmFuc2Zvcm0uCisgKgorICogY3J5cHRvX2ZyZWVfdGZtKCkgZnJlZXMgdXAgdGhlIHRyYW5zZm9ybSBhbmQgYW55IGFzc29jaWF0ZWQgcmVzb3VyY2VzLAorICogdGhlbiBkcm9wcyB0aGUgcmVmY291bnQgb24gdGhlIGFzc29jaWF0ZWQgYWxnb3JpdGhtLgorICovCitzdHJ1Y3QgY3J5cHRvX3RmbSAqY3J5cHRvX2FsbG9jX3RmbShjb25zdCBjaGFyICphbGdfbmFtZSwgdTMyIHRmbV9mbGFncyk7Cit2b2lkIGNyeXB0b19mcmVlX3RmbShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKTsKKworLyoKKyAqIFRyYW5zZm9ybSBoZWxwZXJzIHdoaWNoIHF1ZXJ5IHRoZSB1bmRlcmx5aW5nIGFsZ29yaXRobS4KKyAqLworc3RhdGljIGlubGluZSBjb25zdCBjaGFyICpjcnlwdG9fdGZtX2FsZ19uYW1lKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCit7CisJcmV0dXJuIHRmbS0+X19jcnRfYWxnLT5jcmFfbmFtZTsKK30KKworc3RhdGljIGlubGluZSBjb25zdCBjaGFyICpjcnlwdG9fdGZtX2FsZ19tb2RuYW1lKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCit7CisJc3RydWN0IGNyeXB0b19hbGcgKmFsZyA9IHRmbS0+X19jcnRfYWxnOworCisJaWYgKGFsZy0+Y3JhX21vZHVsZSkKKwkJcmV0dXJuIGFsZy0+Y3JhX21vZHVsZS0+bmFtZTsKKwllbHNlCisJCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBjcnlwdG9fdGZtX2FsZ190eXBlKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCit7CisJcmV0dXJuIHRmbS0+X19jcnRfYWxnLT5jcmFfZmxhZ3MgJiBDUllQVE9fQUxHX1RZUEVfTUFTSzsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgY3J5cHRvX3RmbV9hbGdfbWluX2tleXNpemUoc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKK3sKKwlCVUdfT04oY3J5cHRvX3RmbV9hbGdfdHlwZSh0Zm0pICE9IENSWVBUT19BTEdfVFlQRV9DSVBIRVIpOworCXJldHVybiB0Zm0tPl9fY3J0X2FsZy0+Y3JhX2NpcGhlci5jaWFfbWluX2tleXNpemU7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGNyeXB0b190Zm1fYWxnX21heF9rZXlzaXplKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCit7CisJQlVHX09OKGNyeXB0b190Zm1fYWxnX3R5cGUodGZtKSAhPSBDUllQVE9fQUxHX1RZUEVfQ0lQSEVSKTsKKwlyZXR1cm4gdGZtLT5fX2NydF9hbGctPmNyYV9jaXBoZXIuY2lhX21heF9rZXlzaXplOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBjcnlwdG9fdGZtX2FsZ19pdnNpemUoc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKK3sKKwlCVUdfT04oY3J5cHRvX3RmbV9hbGdfdHlwZSh0Zm0pICE9IENSWVBUT19BTEdfVFlQRV9DSVBIRVIpOworCXJldHVybiB0Zm0tPmNydF9jaXBoZXIuY2l0X2l2c2l6ZTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgY3J5cHRvX3RmbV9hbGdfYmxvY2tzaXplKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCit7CisJcmV0dXJuIHRmbS0+X19jcnRfYWxnLT5jcmFfYmxvY2tzaXplOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBjcnlwdG9fdGZtX2FsZ19kaWdlc3RzaXplKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCit7CisJQlVHX09OKGNyeXB0b190Zm1fYWxnX3R5cGUodGZtKSAhPSBDUllQVE9fQUxHX1RZUEVfRElHRVNUKTsKKwlyZXR1cm4gdGZtLT5fX2NydF9hbGctPmNyYV9kaWdlc3QuZGlhX2RpZ2VzdHNpemU7Cit9CisKKy8qCisgKiBBUEkgd3JhcHBlcnMuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBjcnlwdG9fZGlnZXN0X2luaXQoc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKK3sKKwlCVUdfT04oY3J5cHRvX3RmbV9hbGdfdHlwZSh0Zm0pICE9IENSWVBUT19BTEdfVFlQRV9ESUdFU1QpOworCXRmbS0+Y3J0X2RpZ2VzdC5kaXRfaW5pdCh0Zm0pOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY3J5cHRvX2RpZ2VzdF91cGRhdGUoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBuc2cpCit7CisJQlVHX09OKGNyeXB0b190Zm1fYWxnX3R5cGUodGZtKSAhPSBDUllQVE9fQUxHX1RZUEVfRElHRVNUKTsKKwl0Zm0tPmNydF9kaWdlc3QuZGl0X3VwZGF0ZSh0Zm0sIHNnLCBuc2cpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY3J5cHRvX2RpZ2VzdF9maW5hbChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCB1OCAqb3V0KQoreworCUJVR19PTihjcnlwdG9fdGZtX2FsZ190eXBlKHRmbSkgIT0gQ1JZUFRPX0FMR19UWVBFX0RJR0VTVCk7CisJdGZtLT5jcnRfZGlnZXN0LmRpdF9maW5hbCh0Zm0sIG91dCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjcnlwdG9fZGlnZXN0X2RpZ2VzdChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG5zZywgdTggKm91dCkKK3sKKwlCVUdfT04oY3J5cHRvX3RmbV9hbGdfdHlwZSh0Zm0pICE9IENSWVBUT19BTEdfVFlQRV9ESUdFU1QpOworCXRmbS0+Y3J0X2RpZ2VzdC5kaXRfZGlnZXN0KHRmbSwgc2csIG5zZywgb3V0KTsKK30KKworc3RhdGljIGlubGluZSBpbnQgY3J5cHRvX2RpZ2VzdF9zZXRrZXkoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHU4ICprZXksIHVuc2lnbmVkIGludCBrZXlsZW4pCit7CisJQlVHX09OKGNyeXB0b190Zm1fYWxnX3R5cGUodGZtKSAhPSBDUllQVE9fQUxHX1RZUEVfRElHRVNUKTsKKwlpZiAodGZtLT5jcnRfZGlnZXN0LmRpdF9zZXRrZXkgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9TWVM7CisJcmV0dXJuIHRmbS0+Y3J0X2RpZ2VzdC5kaXRfc2V0a2V5KHRmbSwga2V5LCBrZXlsZW4pOworfQorCitzdGF0aWMgaW5saW5lIGludCBjcnlwdG9fY2lwaGVyX3NldGtleShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdTggKmtleSwgdW5zaWduZWQgaW50IGtleWxlbikKK3sKKwlCVUdfT04oY3J5cHRvX3RmbV9hbGdfdHlwZSh0Zm0pICE9IENSWVBUT19BTEdfVFlQRV9DSVBIRVIpOworCXJldHVybiB0Zm0tPmNydF9jaXBoZXIuY2l0X3NldGtleSh0Zm0sIGtleSwga2V5bGVuKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgY3J5cHRvX2NpcGhlcl9lbmNyeXB0KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG5ieXRlcykKK3sKKwlCVUdfT04oY3J5cHRvX3RmbV9hbGdfdHlwZSh0Zm0pICE9IENSWVBUT19BTEdfVFlQRV9DSVBIRVIpOworCXJldHVybiB0Zm0tPmNydF9jaXBoZXIuY2l0X2VuY3J5cHQodGZtLCBkc3QsIHNyYywgbmJ5dGVzKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgY3J5cHRvX2NpcGhlcl9lbmNyeXB0X2l2KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG5ieXRlcywgdTggKml2KQoreworCUJVR19PTihjcnlwdG9fdGZtX2FsZ190eXBlKHRmbSkgIT0gQ1JZUFRPX0FMR19UWVBFX0NJUEhFUik7CisJQlVHX09OKHRmbS0+Y3J0X2NpcGhlci5jaXRfbW9kZSA9PSBDUllQVE9fVEZNX01PREVfRUNCKTsKKwlyZXR1cm4gdGZtLT5jcnRfY2lwaGVyLmNpdF9lbmNyeXB0X2l2KHRmbSwgZHN0LCBzcmMsIG5ieXRlcywgaXYpOworfQorCitzdGF0aWMgaW5saW5lIGludCBjcnlwdG9fY2lwaGVyX2RlY3J5cHQoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbmJ5dGVzKQoreworCUJVR19PTihjcnlwdG9fdGZtX2FsZ190eXBlKHRmbSkgIT0gQ1JZUFRPX0FMR19UWVBFX0NJUEhFUik7CisJcmV0dXJuIHRmbS0+Y3J0X2NpcGhlci5jaXRfZGVjcnlwdCh0Zm0sIGRzdCwgc3JjLCBuYnl0ZXMpOworfQorCitzdGF0aWMgaW5saW5lIGludCBjcnlwdG9fY2lwaGVyX2RlY3J5cHRfaXYoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbmJ5dGVzLCB1OCAqaXYpCit7CisJQlVHX09OKGNyeXB0b190Zm1fYWxnX3R5cGUodGZtKSAhPSBDUllQVE9fQUxHX1RZUEVfQ0lQSEVSKTsKKwlCVUdfT04odGZtLT5jcnRfY2lwaGVyLmNpdF9tb2RlID09IENSWVBUT19URk1fTU9ERV9FQ0IpOworCXJldHVybiB0Zm0tPmNydF9jaXBoZXIuY2l0X2RlY3J5cHRfaXYodGZtLCBkc3QsIHNyYywgbmJ5dGVzLCBpdik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjcnlwdG9fY2lwaGVyX3NldF9pdihzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHU4ICpzcmMsIHVuc2lnbmVkIGludCBsZW4pCit7CisJQlVHX09OKGNyeXB0b190Zm1fYWxnX3R5cGUodGZtKSAhPSBDUllQVE9fQUxHX1RZUEVfQ0lQSEVSKTsKKwltZW1jcHkodGZtLT5jcnRfY2lwaGVyLmNpdF9pdiwgc3JjLCBsZW4pOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY3J5cHRvX2NpcGhlcl9nZXRfaXYoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1OCAqZHN0LCB1bnNpZ25lZCBpbnQgbGVuKQoreworCUJVR19PTihjcnlwdG9fdGZtX2FsZ190eXBlKHRmbSkgIT0gQ1JZUFRPX0FMR19UWVBFX0NJUEhFUik7CisJbWVtY3B5KGRzdCwgdGZtLT5jcnRfY2lwaGVyLmNpdF9pdiwgbGVuKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgY3J5cHRvX2NvbXBfY29tcHJlc3Moc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHU4ICpzcmMsIHVuc2lnbmVkIGludCBzbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTggKmRzdCwgdW5zaWduZWQgaW50ICpkbGVuKQoreworCUJVR19PTihjcnlwdG9fdGZtX2FsZ190eXBlKHRmbSkgIT0gQ1JZUFRPX0FMR19UWVBFX0NPTVBSRVNTKTsKKwlyZXR1cm4gdGZtLT5jcnRfY29tcHJlc3MuY290X2NvbXByZXNzKHRmbSwgc3JjLCBzbGVuLCBkc3QsIGRsZW4pOworfQorCitzdGF0aWMgaW5saW5lIGludCBjcnlwdG9fY29tcF9kZWNvbXByZXNzKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHU4ICpzcmMsIHVuc2lnbmVkIGludCBzbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1OCAqZHN0LCB1bnNpZ25lZCBpbnQgKmRsZW4pCit7CisJQlVHX09OKGNyeXB0b190Zm1fYWxnX3R5cGUodGZtKSAhPSBDUllQVE9fQUxHX1RZUEVfQ09NUFJFU1MpOworCXJldHVybiB0Zm0tPmNydF9jb21wcmVzcy5jb3RfZGVjb21wcmVzcyh0Zm0sIHNyYywgc2xlbiwgZHN0LCBkbGVuKTsKK30KKworLyoKKyAqIEhNQUMgc3VwcG9ydC4KKyAqLworI2lmZGVmIENPTkZJR19DUllQVE9fSE1BQwordm9pZCBjcnlwdG9faG1hY19pbml0KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHU4ICprZXksIHVuc2lnbmVkIGludCAqa2V5bGVuKTsKK3ZvaWQgY3J5cHRvX2htYWNfdXBkYXRlKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLCB1bnNpZ25lZCBpbnQgbnNnKTsKK3ZvaWQgY3J5cHRvX2htYWNfZmluYWwoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgdTggKmtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICprZXlsZW4sIHU4ICpvdXQpOwordm9pZCBjcnlwdG9faG1hYyhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCB1OCAqa2V5LCB1bnNpZ25lZCBpbnQgKmtleWxlbiwKKyAgICAgICAgICAgICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywgdW5zaWduZWQgaW50IG5zZywgdTggKm91dCk7CisjZW5kaWYJLyogQ09ORklHX0NSWVBUT19ITUFDICovCisKKyNlbmRpZgkvKiBfTElOVVhfQ1JZUFRPX0ggKi8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTFfY3J5cHQuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExX2NyeXB0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjU4YTNiYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExX2NyeXB0LmgKQEAgLTAsMCArMSw4NiBAQAorLyoKKyAqIE9yaWdpbmFsIGNvZGUgYmFzZWQgb24gSG9zdCBBUCAoc29mdHdhcmUgd2lyZWxlc3MgTEFOIGFjY2VzcyBwb2ludCkgZHJpdmVyCisgKiBmb3IgSW50ZXJzaWwgUHJpc20yLzIuNS8zLgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMS0yMDAyLCBTU0ggQ29tbXVuaWNhdGlvbnMgU2VjdXJpdHkgQ29ycCBhbmQgSm91bmkgTWFsaW5lbgorICogPGprbWFsaW5lQGNjLmh1dC5maT4KKyAqIENvcHlyaWdodCAoYykgMjAwMi0yMDAzLCBKb3VuaSBNYWxpbmVuIDxqa21hbGluZUBjYy5odXQuZmk+CisgKgorICogQWRhcHRpb24gdG8gYSBnZW5lcmljIElFRUUgODAyLjExIHN0YWNrIGJ5IEphbWVzIEtldHJlbm9zCisgKiA8amtldHJlbm9AbGludXguaW50ZWwuY29tPgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwNCwgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiBTZWUgUkVBRE1FIGFuZCBDT1BZSU5HIGZvcgorICogbW9yZSBkZXRhaWxzLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgaW50ZXJmYWNlIHRvIHRoZSBpZWVlODAyMTEgY3J5cHRvIG1vZHVsZS4KKyAqLworI2lmbmRlZiBJRUVFODAyMTFfQ1JZUFRfSAorI2RlZmluZSBJRUVFODAyMTFfQ1JZUFRfSAorCisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisKK3N0cnVjdCBpZWVlODAyMTFfY3J5cHRvX29wcyB7CisJY29uc3QgY2hhciAqbmFtZTsKKworCS8qIGluaXQgbmV3IGNyeXB0byBjb250ZXh0IChlLmcuLCBhbGxvY2F0ZSBwcml2YXRlIGRhdGEgc3BhY2UsCisJICogc2VsZWN0IElWLCBldGMuKTsgcmV0dXJucyBOVUxMIG9uIGZhaWx1cmUgb3IgcG9pbnRlciB0byBhbGxvY2F0ZWQKKwkgKiBwcml2YXRlIGRhdGEgb24gc3VjY2VzcyAqLworCXZvaWQgKiAoKmluaXQpKGludCBrZXlpZHgpOworCisJLyogZGVpbml0aWFsaXplIGNyeXB0byBjb250ZXh0IGFuZCBmcmVlIGFsbG9jYXRlZCBwcml2YXRlIGRhdGEgKi8KKwl2b2lkICgqZGVpbml0KSh2b2lkICpwcml2KTsKKworCS8qIGVuY3J5cHQvZGVjcnlwdCByZXR1cm4gPCAwIG9uIGVycm9yIG9yID49IDAgb24gc3VjY2Vzcy4gVGhlIHJldHVybgorCSAqIHZhbHVlIGZyb20gZGVjcnlwdF9tcGR1IGlzIHBhc3NlZCBhcyB0aGUga2V5aWR4IHZhbHVlIGZvcgorCSAqIGRlY3J5cHRfbXNkdS4gc2tiIG11c3QgaGF2ZSBlbm91Z2ggaGVhZCBhbmQgdGFpbCByb29tIGZvciB0aGUKKwkgKiBlbmNyeXB0aW9uOyBpZiBub3QsIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQ7IHRoZXNlIGZ1bmN0aW9ucyBhcmUKKwkgKiBjYWxsZWQgZm9yIGFsbCBNUERVcyAoaS5lLiwgZnJhZ21lbnRzKS4KKwkgKi8KKwlpbnQgKCplbmNyeXB0X21wZHUpKHN0cnVjdCBza19idWZmICpza2IsIGludCBoZHJfbGVuLCB2b2lkICpwcml2KTsKKwlpbnQgKCpkZWNyeXB0X21wZHUpKHN0cnVjdCBza19idWZmICpza2IsIGludCBoZHJfbGVuLCB2b2lkICpwcml2KTsKKworCS8qIFRoZXNlIGZ1bmN0aW9ucyBhcmUgY2FsbGVkIGZvciBmdWxsIE1TRFVzLCBpLmUuIGZ1bGwgZnJhbWVzLgorCSAqIFRoZXNlIGNhbiBiZSBOVUxMIGlmIGZ1bGwgTVNEVSBvcGVyYXRpb25zIGFyZSBub3QgbmVlZGVkLiAqLworCWludCAoKmVuY3J5cHRfbXNkdSkoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGhkcl9sZW4sIHZvaWQgKnByaXYpOworCWludCAoKmRlY3J5cHRfbXNkdSkoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGtleWlkeCwgaW50IGhkcl9sZW4sCisJCQkgICAgdm9pZCAqcHJpdik7CisKKwlpbnQgKCpzZXRfa2V5KSh2b2lkICprZXksIGludCBsZW4sIHU4ICpzZXEsIHZvaWQgKnByaXYpOworCWludCAoKmdldF9rZXkpKHZvaWQgKmtleSwgaW50IGxlbiwgdTggKnNlcSwgdm9pZCAqcHJpdik7CisKKwkvKiBwcm9jZnMgaGFuZGxlciBmb3IgcHJpbnRpbmcgb3V0IGtleSBpbmZvcm1hdGlvbiBhbmQgcG9zc2libGUKKwkgKiBzdGF0aXN0aWNzICovCisJY2hhciAqICgqcHJpbnRfc3RhdHMpKGNoYXIgKnAsIHZvaWQgKnByaXYpOworCisJLyogbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgYWRkZWQgYnkgZW5jcnlwdGlvbjsgZW5jcnlwdCBidWYgaXMKKwkgKiBhbGxvY2F0ZWQgd2l0aCBleHRyYV9wcmVmaXhfbGVuIGJ5dGVzLCBjb3B5IG9mIGluX2J1ZiwgYW5kCisJICogZXh0cmFfcG9zdGZpeF9sZW47IGVuY3J5cHQgbmVlZCBub3QgdXNlIGFsbCB0aGlzIHNwYWNlLCBidXQKKwkgKiB0aGUgcmVzdWx0IG11c3Qgc3RhcnQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgYnVmZmVyIGFuZCBjb3JyZWN0CisJICogbGVuZ3RoIG11c3QgYmUgcmV0dXJuZWQgKi8KKwlpbnQgZXh0cmFfcHJlZml4X2xlbiwgZXh0cmFfcG9zdGZpeF9sZW47CisKKwlzdHJ1Y3QgbW9kdWxlICpvd25lcjsKK307CisKK3N0cnVjdCBpZWVlODAyMTFfY3J5cHRfZGF0YSB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OyAvKiBkZWxheWVkIGRlbGV0aW9uIGxpc3QgKi8KKwlzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0b19vcHMgKm9wczsKKwl2b2lkICpwcml2OworCWF0b21pY190IHJlZmNudDsKK307CisKK2ludCBpZWVlODAyMTFfcmVnaXN0ZXJfY3J5cHRvX29wcyhzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0b19vcHMgKm9wcyk7CitpbnQgaWVlZTgwMjExX3VucmVnaXN0ZXJfY3J5cHRvX29wcyhzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0b19vcHMgKm9wcyk7CitzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0b19vcHMgKiBpZWVlODAyMTFfZ2V0X2NyeXB0b19vcHMoY29uc3QgY2hhciAqbmFtZSk7Cit2b2lkIGllZWU4MDIxMV9jcnlwdF9kZWluaXRfZW50cmllcyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqLCBpbnQpOwordm9pZCBpZWVlODAyMTFfY3J5cHRfZGVpbml0X2hhbmRsZXIodW5zaWduZWQgbG9uZyk7Cit2b2lkIGllZWU4MDIxMV9jcnlwdF9kZWxheWVkX2RlaW5pdChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCQkgICAgc3RydWN0IGllZWU4MDIxMV9jcnlwdF9kYXRhICoqY3J5cHQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODAuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjIxNWZjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MC5oCkBAIC0wLDAgKzEsNzYxIEBACisvKgorICAgVGhpcyBpcyBwYXJ0IG9mIHJ0bDgxODAgT3BlblNvdXJjZSBkcml2ZXIuCisgICBDb3B5cmlnaHQgKEMpIEFuZHJlYSBNZXJlbGxvIDIwMDQtMjAwNSAgPGFuZHJlYW1ybEB0aXNjYWxpLml0PgorICAgUmVsZWFzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIEdQTCAoR2VuZXJhbCBQdWJsaWMgTGljZW5jZSkKKworICAgUGFydHMgb2YgdGhpcyBkcml2ZXIgYXJlIGJhc2VkIG9uIHRoZSBHUEwgcGFydCBvZiB0aGUKKyAgIG9mZmljaWFsIHJlYWx0ZWsgZHJpdmVyCisKKyAgIFBhcnRzIG9mIHRoaXMgZHJpdmVyIGFyZSBiYXNlZCBvbiB0aGUgcnRsODE4MCBkcml2ZXIgc2tlbGV0b24KKyAgIGZyb20gUGF0cmljIFNjaGVua2UgJiBBbmRyZXMgU2Fsb21vbgorCisgICBQYXJ0cyBvZiB0aGlzIGRyaXZlciBhcmUgYmFzZWQgb24gdGhlIEludGVsIFBybyBXaXJlbGVzcyAyMTAwIEdQTCBkcml2ZXIKKworICAgV2Ugd2FudCB0byB0YW5rcyB0aGUgQXV0aG9ycyBvZiB0aG9zZSBwcm9qZWN0cyBhbmQgdGhlIE5kaXN3cmFwcGVyCisgICBwcm9qZWN0IEF1dGhvcnMuCisqLworCisjaWZuZGVmIFI4MTgwSAorI2RlZmluZSBSODE4MEgKKworCisjZGVmaW5lIFJUTDgxODBfTU9EVUxFX05BTUUgInJ0bDgxODAiCisjZGVmaW5lIERNRVNHKHgsYS4uLikgcHJpbnRrKEtFUk5fSU5GTyBSVEw4MTgwX01PRFVMRV9OQU1FICI6ICIgeCAiXG4iLCAjIyBhKQorI2RlZmluZSBETUVTR1coeCxhLi4uKSBwcmludGsoS0VSTl9XQVJOSU5HIFJUTDgxODBfTU9EVUxFX05BTUUgIjogV1c6IiB4ICJcbiIsICMjIGEpCisjZGVmaW5lIERNRVNHRSh4LGEuLi4pIHByaW50ayhLRVJOX1dBUk5JTkcgUlRMODE4MF9NT0RVTEVfTkFNRSAiOiBFRToiIHggIlxuIiwgIyMgYSkKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorLy8jaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgkvL2ZvciBydG5sX2xvY2soKQorI2luY2x1ZGUgPGxpbnV4L3dpcmVsZXNzLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CS8vIE5lY2Vzc2FyeSBiZWNhdXNlIHdlIHVzZSB0aGUgcHJvYyBmcworI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgImllZWU4MDIxMS5oIgorI2luY2x1ZGUgPGFzbS9pby5oPgorLy8jaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgorCisjZGVmaW5lIEVQUk9NXzkzYzQ2IDAKKyNkZWZpbmUgRVBST01fOTNjNTYgMQorCisjZGVmaW5lIFJUTF9JT0NUTF9XUEFfU1VQUExJQ0FOVAkJU0lPQ0lXRklSU1RQUklWKzMwCisKKyNkZWZpbmUgREVGQVVMVF9GUkFHX1RIUkVTSE9MRCAyMzQyVQorI2RlZmluZSBNSU5fRlJBR19USFJFU0hPTEQgICAgIDI1NlUKKy8vI2RlZmluZQlNQVhfRlJBR19USFJFU0hPTEQgICAgIDIzNDJVCisjZGVmaW5lIERFRkFVTFRfUlRTX1RIUkVTSE9MRCAyMzQyVQorI2RlZmluZSBNSU5fUlRTX1RIUkVTSE9MRCAwVQorI2RlZmluZSBNQVhfUlRTX1RIUkVTSE9MRCAyMzQyVQorI2RlZmluZSBERUZBVUxUX0JFQUNPTklOVEVSVkFMIDB4NjRVCisjZGVmaW5lIERFRkFVTFRfQkVBQ09OX0VTU0lEICJSdGw4MTgwIgorCisjZGVmaW5lIERFRkFVTFRfU1NJRCAiIgorI2RlZmluZSBERUZBVUxUX1JFVFJZX1JUUyA3CisjZGVmaW5lIERFRkFVTFRfUkVUUllfREFUQSA3CisjZGVmaW5lIFBSSVNNX0hEUl9TSVpFIDY0CisKKyNpZmRlZiBDT05GSUdfUlRMODE4NUIKKworI2RlZmluZSBNR05UX1FVRVVFCQkJCQkJMAorI2RlZmluZSBCS19RVUVVRQkJCQkJCTEKKyNkZWZpbmUgQkVfUVVFVUUJCQkJCQkyCisjZGVmaW5lIFZJX1FVRVVFCQkJCQkJMworI2RlZmluZSBWT19RVUVVRQkJCQkJCTQKKyNkZWZpbmUgSElHSF9RVUVVRQkJCQkJCTUKKyNkZWZpbmUgQkVBQ09OX1FVRVVFCQkJCQk2CisKKyNkZWZpbmUgTE9XX1FVRVVFCQkJCQkJQkVfUVVFVUUKKyNkZWZpbmUgTk9STUFMX1FVRVVFCQkJCQlNR05UX1FVRVVFCisKKyNkZWZpbmUgYVNpZnNUaW1lIAkxMAorCisjZGVmaW5lIHNDcmNMbmcgICAgICAgICA0CisjZGVmaW5lIHNBY2tDdHNMbmcJMTEyCQkvLyBiaXRzIGluIEFDSyBhbmQgQ1RTIGZyYW1lcworLy8rYnkgYW15IDA4MDMxMgorI2RlZmluZSBSQVRFX0FEQVBUSVZFX1RJTUVSX1BFUklPRAkzMDAKKwordHlwZWRlZiBlbnVtIF9XSVJFTEVTU19NT0RFIHsKKwlXSVJFTEVTU19NT0RFX1VOS05PV04gPSAweDAwLAorCVdJUkVMRVNTX01PREVfQSA9IDB4MDEsCisJV0lSRUxFU1NfTU9ERV9CID0gMHgwMiwKKwlXSVJFTEVTU19NT0RFX0cgPSAweDA0LAorCVdJUkVMRVNTX01PREVfQVVUTyA9IDB4MDgsCit9IFdJUkVMRVNTX01PREU7CisKK3R5cGVkZWYgZW51bSBfVkVSU0lPTl84MTg1eworCS8vIFJUTDgxODUKKwlWRVJTSU9OXzgxODVfVU5LTk9XTiwKKwlWRVJTSU9OXzgxODVfQywgLy8gQy1jdXQKKwlWRVJTSU9OXzgxODVfRCwgLy8gRC1jdXQKKwkvLyBSVEw4MTg1QgorCVZFUlNJT05fODE4NUJfQiwgLy8gQi1jdXQKKwlWRVJTSU9OXzgxODVCX0QsIC8vIEQtY3V0CisJVkVSU0lPTl84MTg1Ql9FLCAvLyBFLWN1dAorCS8vUlRMODE4N1MtUENJRQorCVZFUlNJT05fODE4N1NfQiwgLy8gQi1jdXQKKwlWRVJTSU9OXzgxODdTX0MsIC8vIEMtY3V0CisJVkVSU0lPTl84MTg3U19ELCAvLyBELWN1dAorCit9VkVSU0lPTl84MTg1LCpQVkVSU0lPTl84MTg1OwordHlwZWRlZiBzdHJ1Y3QgCUNobmxBY2Nlc3NTZXR0aW5nIHsKKwl1MTYgU0lGU19UaW1lcjsKKwl1MTYgRElGU19UaW1lcjsKKwl1MTYgU2xvdFRpbWVUaW1lcjsKKwl1MTYgRUlGU19UaW1lcjsKKwl1MTYgQ1dtaW5JbmRleDsKKwl1MTYgQ1dtYXhJbmRleDsKK30qUENIQU5ORUxfQUNDRVNTX1NFVFRJTkcsQ0hBTk5FTF9BQ0NFU1NfU0VUVElORzsKKwordHlwZWRlZiBlbnVteworICAgICAgICBOSUNfODE4NSA9IDEsCisgICAgICAgIE5JQ184MTg1QgorICAgICAgICB9IG5pY190OworCit0eXBlZGVmIHUzMiBBQ19DT0RJTkc7CisjZGVmaW5lIEFDMF9CRQkwCQkvLyBBQ0k6IDB4MDAJLy8gQmVzdCBFZmZvcnQKKyNkZWZpbmUgQUMxX0JLCTEJCS8vIEFDSTogMHgwMQkvLyBCYWNrZ3JvdW5kCisjZGVmaW5lIEFDMl9WSQkyCQkvLyBBQ0k6IDB4MTAJLy8gVmlkZW8KKyNkZWZpbmUgQUMzX1ZPCTMJCS8vIEFDSTogMHgxMQkvLyBWb2ljZQorI2RlZmluZSBBQ19NQVgJNAkJLy8gTWF4OiBkZWZpbmUgdG90YWwgbnVtYmVyOyBTaG91bGQgbm90IHRvIGJlIHVzZWQgYXMgYSByZWFsIGVudW0uCisKKy8vCisvLyBFQ1dtaW4vRUNXbWF4IGZpZWxkLgorLy8gUmVmOiBXTU0gc3BlYyAyLjIuMjogV01FIFBhcmFtZXRlciBFbGVtZW50LCBwLjEzLgorLy8KK3R5cGVkZWYJdW5pb24gX0VDV3sKKwl1OAljaGFyRGF0YTsKKwlzdHJ1Y3QKKwl7CisJCXU4CUVDV21pbjo0OworCQl1OAlFQ1dtYXg6NDsKKwl9ZjsJLy8gRmllbGQKK31FQ1csICpQRUNXOworCisvLworLy8gQUNJL0FJRlNOIEZpZWxkLgorLy8gUmVmOiBXTU0gc3BlYyAyLjIuMjogV01FIFBhcmFtZXRlciBFbGVtZW50LCBwLjEyLgorLy8KK3R5cGVkZWYJdW5pb24gX0FDSV9BSUZTTnsKKwl1OAljaGFyRGF0YTsKKworCXN0cnVjdAorCXsKKwkJdTgJQUlGU046NDsKKwkJdTgJQUNNOjE7CisJCXU4CUFDSToyOworCQl1OAlSZXNlcnZlZDoxOworCX1mOwkvLyBGaWVsZAorfUFDSV9BSUZTTiwgKlBBQ0lfQUlGU047CisKKy8vCisvLyBBQyBQYXJhbWV0ZXJzIFJlY29yZCBGb3JtYXQuCisvLyBSZWY6IFdNTSBzcGVjIDIuMi4yOiBXTUUgUGFyYW1ldGVyIEVsZW1lbnQsIHAuMTIuCisvLwordHlwZWRlZgl1bmlvbiBfQUNfUEFSQU17CisJdTMyCWxvbmdEYXRhOworCXU4CWNoYXJEYXRhWzRdOworCisJc3RydWN0CisJeworCQlBQ0lfQUlGU04JQWNpQWlmc247CisJCUVDVwkJRWN3OworCQl1MTYJCVRYT1BMaW1pdDsKKwl9ZjsJLy8gRmllbGQKK31BQ19QQVJBTSwgKlBBQ19QQVJBTTsKKworLyogaXQgaXMgYSB3cm9uZyBkZWZpbml0aW9uLiAteGlvbmctMjAwNi0xMS0xNwordHlwZWRlZiBzdHJ1Y3QgVGhyZWVXaXJlUmVnIHsKKwl1MTYJbG9uZ0RhdGE7CisJc3RydWN0IHsKKwkJdTgJZW5hYmxlQjsKKwkJdTgJZGF0YTsKKwkJdTgJY2xrOworCQl1OAlyZWFkX3dyaXRlOworCX0gc3RydWM7Cit9IFRocmVlV2lyZVJlZzsKKyovCisKK3R5cGVkZWYJdW5pb24gX1RocmVlV2lyZXsKKwlzdHJ1Y3QgX1RocmVlV2lyZVN0cnVjeworCQl1MTYJCWRhdGE6MTsKKwkJdTE2CQljbGs6MTsKKwkJdTE2CQllbmFibGVCOjE7CisJCXUxNgkJcmVhZF93cml0ZToxOworCQl1MTYJCXJlc3YxOjEyOworLy8JCXUyQnl0ZQlyZXN2MjoxNDsKKy8vCQl1MkJ5dGUJVGhyZWVXaXJlRW5hYmxlOjE7CisvLwkJdTJCeXRlCXJlc3YzOjE7CisJfXN0cnVjOworCXUxNgkJCWxvbmdEYXRhOworfVRocmVlV2lyZVJlZzsKKworI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IGJ1ZmZlcgoreworCXN0cnVjdCBidWZmZXIgKm5leHQ7CisJdTMyICpidWY7CisJZG1hX2FkZHJfdCBkbWE7Cit9IGJ1ZmZlcjsKKworLy9ZSixtb2RpZmllZCwwODA4MjgKK3R5cGVkZWYgc3RydWN0IFN0YXRzCit7CisJdW5zaWduZWQgbG9uZyB0eHJkdTsKKwl1bnNpZ25lZCBsb25nIHJ4cmR1OworCXVuc2lnbmVkIGxvbmcgcnhub2xhc3Q7CisJdW5zaWduZWQgbG9uZyByeG5vZGF0YTsKKy8vCXVuc2lnbmVkIGxvbmcgcnhyZXNldDsKKy8vCXVuc2lnbmVkIGxvbmcgcnh3cmthcm91bmQ7CisJdW5zaWduZWQgbG9uZyByeG5vcG9pbnRlcjsKKwl1bnNpZ25lZCBsb25nIHR4bnBlcnI7CisJdW5zaWduZWQgbG9uZyB0eHJlc3VtZWQ7CisJdW5zaWduZWQgbG9uZyByeGVycjsKKwl1bnNpZ25lZCBsb25nIHJ4b3ZlcmZsb3c7CisJdW5zaWduZWQgbG9uZyByeGludDsKKwl1bnNpZ25lZCBsb25nIHR4Ymtwb2tpbnQ7CisJdW5zaWduZWQgbG9uZyB0eGJlcG9raW5nOworCXVuc2lnbmVkIGxvbmcgdHhia3BlcnI7CisJdW5zaWduZWQgbG9uZyB0eGJlcGVycjsKKwl1bnNpZ25lZCBsb25nIHR4bnBva2ludDsKKwl1bnNpZ25lZCBsb25nIHR4aHBva2ludDsKKwl1bnNpZ25lZCBsb25nIHR4aHBlcnI7CisJdW5zaWduZWQgbG9uZyBpbnRzOworCXVuc2lnbmVkIGxvbmcgc2hpbnRzOworCXVuc2lnbmVkIGxvbmcgdHhvdmVyZmxvdzsKKwl1bnNpZ25lZCBsb25nIHJ4ZG1hZmFpbDsKKwl1bnNpZ25lZCBsb25nIHR4YmVhY29uOworCXVuc2lnbmVkIGxvbmcgdHhiZWFjb25lcnI7CisJdW5zaWduZWQgbG9uZyB0eGxwb2tpbnQ7CisJdW5zaWduZWQgbG9uZyB0eGxwZXJyOworCXVuc2lnbmVkIGxvbmcgdHhyZXRyeTsvL3JldHJ5IG51bWJlciAgdG9ueSAyMDA2MDYwMQorCXVuc2lnbmVkIGxvbmcgcnhjcmNlcnJtaW47Ly9jcmMgZXJyb3IgKDAtNTAwKQorCXVuc2lnbmVkIGxvbmcgcnhjcmNlcnJtaWQ7Ly9jcmMgZXJyb3IgKDUwMC0xMDAwKQorCXVuc2lnbmVkIGxvbmcgcnhjcmNlcnJtYXg7Ly9jcmMgZXJyb3IgKD4xMDAwKQorCXVuc2lnbmVkIGxvbmcgcnhpY3ZlcnI7Ly9JQ1YgZXJyb3IKK30gU3RhdHM7CisKKyNkZWZpbmUgTUFYX0xEX1NMT1RfTlVNIDEwCisjZGVmaW5lIEtFRVBfQUxJVkVfSU5URVJWQUwgCQkJCTIwIC8vIGluIHNlY29uZHMuCisjZGVmaW5lIENIRUNLX0ZPUl9IQU5HX1BFUklPRAkJCTIgLy9iZSBlcXVhbCB0byB3YXRjaGRvZyBjaGVjayB0aW1lCisjZGVmaW5lIERFRkFVTFRfS0VFUF9BTElWRV9MRVZFTAkJCTEKKyNkZWZpbmUgREVGQVVMVF9TTE9UX05VTQkJCQkJMgorI2RlZmluZSBQT1dFUl9QUk9GSUxFX0FDCQkJCQkwCisjZGVmaW5lIFBPV0VSX1BST0ZJTEVfQkFUVEVSWQkJCTEKKwordHlwZWRlZiBzdHJ1Y3QgX2xpbmtfZGV0ZWN0X3QKK3sKKwl1MzIJCQkJUnhGcmFtZU51bVtNQVhfTERfU0xPVF9OVU1dOwkvLyBudW1iZXIgb2YgUnggRnJhbWUgLyBDaGVja0ZvckhhbmdfcGVyaW9kICB0byBkZXRlcm1pbmUgbGluayBzdGF0dXMKKwl1MTYJCQkJU2xvdE51bTsJLy8gbnVtYmVyIG9mIENoZWNrRm9ySGFuZyBwZXJpb2QgdG8gZGV0ZXJtaW5lIGxpbmsgc3RhdHVzLCBkZWZhdWx0IGlzIDIKKwl1MTYJCQkJU2xvdEluZGV4OworCisJdTMyCQkJCU51bVR4T2tJblBlcmlvZDsgIC8vbnVtYmVyIG9mIHBhY2tldCB0cmFuc21pdHRlZCBkdXJpbmcgQ2hlY2tGb3JIYW5nCisJdTMyCQkJCU51bVJ4T2tJblBlcmlvZDsgIC8vbnVtYmVyIG9mIHBhY2tldCByZWNlaXZlZCBkdXJpbmcgQ2hlY2tGb3JIYW5nCisKKwl1OAkJCQlJZGxlQ291bnQ7ICAgICAvLyAoS0VFUF9BTElWRV9JTlRFUlZBTCAvIENIRUNLX0ZPUl9IQU5HX1BFUklPRCkKKwl1MzIJCQkJTGFzdE51bVR4VW5pY2FzdDsKKwl1MzIJCQkJTGFzdE51bVJ4VW5pY2FzdDsKKworCWJvb2wJCQkJYkJ1c3lUcmFmZmljOyAgICAvL3doZW4gaXQgaXMgc2V0IHRvIDEsIFVJIGNhbm4ndCBzY2FuIGF0IHdpbGwuCit9bGlua19kZXRlY3RfdCwgKnBsaW5rX2RldGVjdF90OworCisvL1lKLG1vZGlmaWVkLDA4MDgyOCxlbmQKKworLy9ieSBhbXkgZm9yIGxlZAorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gTEVEIGN1c3RvbWl6YXRpb24uCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3R5cGVkZWYJZW51bSBfTEVEX1NUUkFURUdZXzgxODV7CisJU1dfTEVEX01PREUwLCAvLworCVNXX0xFRF9NT0RFMSwgLy8KKwlIV19MRUQsIC8vIEhXIGNvbnRyb2wgMiBMRURzLCBMRUQwIGFuZCBMRUQxICh0aGVyZSBhcmUgNCBkaWZmZXJlbnQgY29udHJvbCBtb2RlcykKK31MRURfU1RSQVRFR1lfODE4NSwgKlBMRURfU1RSQVRFR1lfODE4NTsKKy8vYnkgYW15IGZvciBsZWQKKy8vYnkgYW15IGZvciBwb3dlciBzYXZlCit0eXBlZGVmCWVudW0gX0xFRF9DVExfTU9ERXsKKwlMRURfQ1RMX1BPV0VSX09OID0gMSwKKwlMRURfQ1RMX0xJTksgPSAyLAorCUxFRF9DVExfTk9fTElOSyA9IDMsCisJTEVEX0NUTF9UWCA9IDQsCisJTEVEX0NUTF9SWCA9IDUsCisJTEVEX0NUTF9TSVRFX1NVUlZFWSA9IDYsCisJTEVEX0NUTF9QT1dFUl9PRkYgPSA3Cit9TEVEX0NUTF9NT0RFOworCit0eXBlZGVmCWVudW0gX1JUX1JGX1BPV0VSX1NUQVRFCit7CisJZVJmT24sCisJZVJmU2xlZXAsCisJZVJmT2ZmCit9UlRfUkZfUE9XRVJfU1RBVEU7CisKK2VudW0JX1JlYXNvbkNvZGV7CisJdW5zcGVjX3JlYXNvbgk9IDB4MSwKKwlhdXRoX25vdF92YWxpZAk9IDB4MiwKKwlkZWF1dGhfbHZfc3MJPSAweDMsCisJaW5hY3Rpdml0eQkJPSAweDQsCisJYXBfb3ZlcmxvYWQJCT0gMHg1LAorCWNsYXNzMl9lcnIJCT0gMHg2LAorCWNsYXNzM19lcnIJCT0gMHg3LAorCWRpc2FzX2x2X3NzCQk9IDB4OCwKKwlhc29jX25vdF9hdXRoCT0gMHg5LAorCisJLy8tLS0tTUlDX0NIRUNLCisJbWljX2ZhaWx1cmUJCT0gMHhlLAorCS8vLS0tLUVORCBNSUNfQ0hFQ0sKKworCS8vIFJlYXNvbiBjb2RlIGRlZmluZWQgaW4gODAyLjExaSBEMTAuMCBwLjI4LgorCWludmFsaWRfSUUJCT0gMHgwZCwKKwlmb3VyX3dheV90bW91dAk9IDB4MGYsCisJdHdvX3dheV90bW91dAk9IDB4MTAsCisJSUVfZGlzbWF0Y2gJCT0gMHgxMSwKKwlpbnZhbGlkX0djaXBoZXIJPSAweDEyLAorCWludmFsaWRfUGNpcGhlcgk9IDB4MTMsCisJaW52YWxpZF9BS01QCT0gMHgxNCwKKwl1bnN1cF9SU05JRXZlciA9IDB4MTUsCisJaW52YWxpZF9SU05JRQk9IDB4MTYsCisJYXV0aF84MDJfMXhfZmFpbD0gMHgxNywKKwljaXBlcl9yZWplY3QJCT0gMHgxOCwKKworCS8vIFJlYXNvbiBjb2RlIGRlZmluZWQgaW4gNy4zLjEuNywgODAyLjFlIEQxMy4wLCBwLjQyLiBBZGRlZCBieSBBbm5pZSwgMjAwNS0xMS0xNS4KKwlRb1NfdW5zcGVjCQk9IDB4MjAsCS8vIDMyCisJUUFQX2JhbmR3aWR0aAk9IDB4MjEsCS8vIDMzCisJcG9vcl9jb25kaXRpb24JPSAweDIyLAkvLyAzNAorCW5vX2ZhY2lsaXR5CQk9IDB4MjMsCS8vIDM1CisJCQkJCQkJLy8gV2hlcmUgaXMgMzY/Pz8KKwlyZXFfZGVjbGluZWQJPSAweDI1LAkvLyAzNworCWludmFsaWRfcGFyYW0JPSAweDI2LAkvLyAzOAorCXJlcV9ub3RfaG9ub3JlZD0gMHgyNywJLy8gMzkKKwlUU19ub3RfY3JlYXRlZAk9IDB4MkYsCS8vIDQ3CisJRExfbm90X2FsbG93ZWQJPSAweDMwLAkvLyA0OAorCWRlc3Rfbm90X2V4aXN0CT0gMHgzMSwJLy8gNDkKKwlkZXN0X25vdF9RU1RBCT0gMHgzMiwJLy8gNTAKK307Cit0eXBlZGVmCWVudW0gX1JUX1BTX01PREUKK3sKKwllQWN0aXZlLAkvLyBBY3RpdmUvQ29udGludW91cyBhY2Nlc3MuCisJZU1heFBzLAkJLy8gTWF4IHBvd2VyIHNhdmUgbW9kZS4KKwllRmFzdFBzCQkvLyBGYXN0IHBvd2VyIHNhdmUgbW9kZS4KK31SVF9QU19NT0RFOworLy9ieSBhbXkgZm9yIHBvd2VyIHNhdmUKK3R5cGVkZWYgc3RydWN0IHI4MTgwX3ByaXYKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKKworCXNob3J0IGVwcm9tdHlwZTsKKwlpbnQgaXJxOworCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlODAyMTE7CisKKyAgICAgICAgc2hvcnQgY2FyZF84MTg1OyAvKiBPOiBydGw4MTgwLCAxOnJ0bDgxODUgViBCL0MsIDI6cnRsODE4NSBWIEQsIDM6cnRsODE4NUIgKi8KKwlzaG9ydCBjYXJkXzgxODVfQnZlcnNpb247IC8qIGlmIFRDUiByZXBvcnRzIGNhcmQgViBCL0MgdGhpcyBkaXNjcmltaW5hdGVzICovCisJc2hvcnQgcGh5X3ZlcjsgLyogbWVhbmluZ2Z1bCBmb3IgcnRsODIyNSAxOkEgMjpCIDM6QyAqLworCXNob3J0IGVuYWJsZV9ncGlvMDsKKwllbnVtIGNhcmRfdHlwZSB7UENJLE1JTklQQ0ksQ0FSREJVUyxVU0IvKnJ0bDgxODcqL31jYXJkX3R5cGU7CisJc2hvcnQgaHdfcGxjcF9sZW47CisJc2hvcnQgcGxjcF9wcmVhbWJsZV9tb2RlOyAvLyAwOmF1dG8gMTpzaG9ydCAyOmxvbmcKKworCXNwaW5sb2NrX3QgaXJxX2xvY2s7CisJc3BpbmxvY2tfdCBpcnFfdGhfbG9jazsKKwlzcGlubG9ja190IHR4X2xvY2s7CisJc3BpbmxvY2tfdCBwc19sb2NrOworCXNwaW5sb2NrX3QgcmZfcHNfbG9jazsKKworCXUxNiBpcnFfbWFzazsKKwlzaG9ydCBpcnFfZW5hYmxlZDsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXNob3J0IGNoYW47CisJc2hvcnQgc2VuczsKKwlzaG9ydCBtYXhfc2VuczsKKwl1OCBjaHR4cHdyWzE1XTsgLy9jaGFubmVscyBmcm9tIDEgdG8gMTQsIDAgbm90IHVzZWQKKwl1OCBjaHR4cHdyX29mZG1bMTVdOyAvL2NoYW5uZWxzIGZyb20gMSB0byAxNCwgMCBub3QgdXNlZAorCS8vdTggY2hhbGxvd1sxNV07IC8vY2hhbm5lbHMgZnJvbSAxIHRvIDE0LCAwIG5vdCB1c2VkCisJdTggY2hhbm5lbF9wbGFuOyAgLy8gaXQncyB0aGUgY2hhbm5lbCBwbGFuIGluZGV4CisJc2hvcnQgdXA7CisJc2hvcnQgY3JjbW9uOyAvL2lmIDEgYWxsb3cgYmFkIGNyYyBmcmFtZSByZWNlcHRpb24gaW4gbW9uaXRvciBtb2RlCisJc2hvcnQgcHJpc21faGRyOworCisJc3RydWN0IHRpbWVyX2xpc3Qgc2Nhbl90aW1lcjsKKwkvKnNob3J0IHNjYW5wZW5kaW5nOworCXNob3J0IHN0b3BzY2FuOyovCisJc3BpbmxvY2tfdCBzY2FuX2xvY2s7CisJdTggYWN0aXZlX3Byb2JlOworCS8vdTggYWN0aXZlX3NjYW5fbnVtOworCXN0cnVjdCBzZW1hcGhvcmUgd3hfc2VtOworCXN0cnVjdCBzZW1hcGhvcmUgcmZfc3RhdGU7CisJc2hvcnQgaHdfd2VwOworCisJc2hvcnQgZGlncGh5OworCXNob3J0IGFudGI7CisJc2hvcnQgZGl2ZXJzaXR5OworCXU4IGNzX3RyZXNob2xkOworCXNob3J0IHJjcl9jc2Vuc2U7CisJc2hvcnQgcmZfY2hpcDsKKwl1MzIga2V5MFs0XTsKKwlzaG9ydCAoKnJmX3NldF9zZW5zKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LHNob3J0IHNlbnMpOworCXZvaWQgKCpyZl9zZXRfY2hhbikoc3RydWN0IG5ldF9kZXZpY2UgKmRldixzaG9ydCBjaCk7CisJdm9pZCAoKnJmX2Nsb3NlKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKwl2b2lkICgqcmZfaW5pdCkoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisJdm9pZCAoKnJmX3NsZWVwKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKwl2b2lkICgqcmZfd2FrZXVwKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKwkvL3Nob3J0IHJhdGU7CisJc2hvcnQgcHJvbWlzYzsKKwkvKnN0YXRzKi8KKwlzdHJ1Y3QgU3RhdHMgc3RhdHM7CisJc3RydWN0IF9saW5rX2RldGVjdF90IGxpbmtfZGV0ZWN0OyAgLy9ZSixhZGQsMDgwODI4CisJc3RydWN0IGl3X3N0YXRpc3RpY3Mgd3N0YXRzOworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZGlyX2RldjsKKworCS8qUlggc3R1ZmYqLworCXUzMiAqcnhyaW5nOworCXUzMiAqcnhyaW5ndGFpbDsKKwlkbWFfYWRkcl90IHJ4cmluZ2RtYTsKKwlzdHJ1Y3QgYnVmZmVyICpyeGJ1ZmZlcjsKKwlzdHJ1Y3QgYnVmZmVyICpyeGJ1ZmZlcmhlYWQ7CisJaW50IHJ4cmluZ2NvdW50OworCXUxNiByeGJ1ZmZlcnNpemU7CisKKwlzdHJ1Y3Qgc2tfYnVmZiAqcnhfc2tiOworCisJc2hvcnQgcnhfc2tiX2NvbXBsZXRlOworCisJdTMyIHJ4X3ByZXZsZW47CisKKwkvKlRYIHN0dWZmKi8KKy8qCisJdTMyICp0eGxwcmluZzsKKwl1MzIgKnR4aHByaW5nOworCXUzMiAqdHhucHJpbmc7CisJZG1hX2FkZHJfdCB0eGxwcmluZ2RtYTsKKwlkbWFfYWRkcl90IHR4aHByaW5nZG1hOworCWRtYV9hZGRyX3QgdHhucHJpbmdkbWE7CisJdTMyICp0eGxwcmluZ3RhaWw7CisJdTMyICp0eGhwcmluZ3RhaWw7CisJdTMyICp0eG5wcmluZ3RhaWw7CisJdTMyICp0eGxwcmluZ2hlYWQ7CisJdTMyICp0eGhwcmluZ2hlYWQ7CisJdTMyICp0eG5wcmluZ2hlYWQ7CisJc3RydWN0IGJ1ZmZlciAqdHhscGJ1ZnM7CisJc3RydWN0IGJ1ZmZlciAqdHhocGJ1ZnM7CisJc3RydWN0IGJ1ZmZlciAqdHhucGJ1ZnM7CisJc3RydWN0IGJ1ZmZlciAqdHhscGJ1ZnN0YWlsOworCXN0cnVjdCBidWZmZXIgKnR4aHBidWZzdGFpbDsKKwlzdHJ1Y3QgYnVmZmVyICp0eG5wYnVmc3RhaWw7CisqLworCXUzMiAqdHhtYXByaW5nOworCXUzMiAqdHhia3ByaW5nOworCXUzMiAqdHhiZXByaW5nOworCXUzMiAqdHh2aXByaW5nOworCXUzMiAqdHh2b3ByaW5nOworCXUzMiAqdHhocHJpbmc7CisJZG1hX2FkZHJfdCB0eG1hcHJpbmdkbWE7CisJZG1hX2FkZHJfdCB0eGJrcHJpbmdkbWE7CisJZG1hX2FkZHJfdCB0eGJlcHJpbmdkbWE7CisJZG1hX2FkZHJfdCB0eHZpcHJpbmdkbWE7CisJZG1hX2FkZHJfdCB0eHZvcHJpbmdkbWE7CisJZG1hX2FkZHJfdCB0eGhwcmluZ2RtYTsKKwl1MzIgKnR4bWFwcmluZ3RhaWw7CisJdTMyICp0eGJrcHJpbmd0YWlsOworCXUzMiAqdHhiZXByaW5ndGFpbDsKKwl1MzIgKnR4dmlwcmluZ3RhaWw7CisJdTMyICp0eHZvcHJpbmd0YWlsOworCXUzMiAqdHhocHJpbmd0YWlsOworCXUzMiAqdHhtYXByaW5naGVhZDsKKwl1MzIgKnR4YmtwcmluZ2hlYWQ7CisJdTMyICp0eGJlcHJpbmdoZWFkOworCXUzMiAqdHh2aXByaW5naGVhZDsKKwl1MzIgKnR4dm9wcmluZ2hlYWQ7CisJdTMyICp0eGhwcmluZ2hlYWQ7CisJc3RydWN0IGJ1ZmZlciAqdHhtYXBidWZzOworCXN0cnVjdCBidWZmZXIgKnR4YmtwYnVmczsKKwlzdHJ1Y3QgYnVmZmVyICp0eGJlcGJ1ZnM7CisJc3RydWN0IGJ1ZmZlciAqdHh2aXBidWZzOworCXN0cnVjdCBidWZmZXIgKnR4dm9wYnVmczsKKwlzdHJ1Y3QgYnVmZmVyICp0eGhwYnVmczsKKwlzdHJ1Y3QgYnVmZmVyICp0eG1hcGJ1ZnN0YWlsOworCXN0cnVjdCBidWZmZXIgKnR4YmtwYnVmc3RhaWw7CisJc3RydWN0IGJ1ZmZlciAqdHhiZXBidWZzdGFpbDsKKwlzdHJ1Y3QgYnVmZmVyICp0eHZpcGJ1ZnN0YWlsOworCXN0cnVjdCBidWZmZXIgKnR4dm9wYnVmc3RhaWw7CisJc3RydWN0IGJ1ZmZlciAqdHhocGJ1ZnN0YWlsOworCisJaW50IHR4cmluZ2NvdW50OworCWludCB0eGJ1ZmZzaXplOworCS8vc3RydWN0IHR4X3BlbmRpbmdidWYgdHhucF9wZW5kaW5nOworCS8vc3RydWN0IHRhc2tsZXRfc3RydWN0IGlycV90eF90YXNrbGV0OworCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCBpcnFfcnhfdGFza2xldDsKKwl1OCBkbWFfcG9sbF9tYXNrOworCS8vc2hvcnQgdHhfc3VzcGVuZDsKKworCS8qIGFkaG9jL21hc3RlciBtb2RlIHN0dWZmICovCisJdTMyICp0eGJlYWNvbnJpbmd0YWlsOworCWRtYV9hZGRyX3QgdHhiZWFjb25yaW5nZG1hOworCXUzMiAqdHhiZWFjb25yaW5nOworCWludCB0eGJlYWNvbmNvdW50OworCXN0cnVjdCBidWZmZXIgKnR4YmVhY29uYnVmczsKKwlzdHJ1Y3QgYnVmZmVyICp0eGJlYWNvbmJ1ZnN0YWlsOworCS8vY2hhciAqbWFzdGVyX2Vzc2lkOworCS8vdTE2IG1hc3Rlcl9iZWFjb25pbnRlcnZhbDsKKwkvL3UzMiBtYXN0ZXJfYmVhY29uc2l6ZTsKKwkvL3UxNiBiZWFjb25faW50ZXJ2YWw7CisKKwl1OCByZXRyeV9kYXRhOworCXU4IHJldHJ5X3J0czsKKwl1MTYgcnRzOworCisvL2FkZCBmb3IgUkYgcG93ZXIgb24gcG93ZXIgb2ZmIGJ5IGxpemhhb21pbmcgMDgwNTEyCisJdTgJIFJlZ1RocmVlV2lyZU1vZGU7IC8vIFNlZSAiVGhyZWUgd2lyZSBtb2RlIiBkZWZpbmVkIGFib3ZlLCAyMDA2LjA1LjMxLCBieSByY25qa28uCisKKy8vYnkgYW15IGZvciBsZWQKKwlMRURfU1RSQVRFR1lfODE4NSBMZWRTdHJhdGVneTsKKy8vYnkgYW15IGZvciBsZWQKKworLy9ieSBhbXkgZm9yIHBvd2VyIHNhdmUKKwlzdHJ1Y3QgdGltZXJfbGlzdCB3YXRjaF9kb2dfdGltZXI7CisJYm9vbCBiSW5hY3RpdmVQczsKKwlib29sIGJTd1JmUHJvY2Vzc2luZzsKKwlSVF9SRl9QT1dFUl9TVEFURQllSW5hY3RpdmVQb3dlclN0YXRlOworCVJUX1JGX1BPV0VSX1NUQVRFIGVSRlBvd2VyU3RhdGU7CisJdTMyIFJmT2ZmUmVhc29uOworCWJvb2wgUkZDaGFuZ2VJblByb2dyZXNzOworCWJvb2wgYkluSGN0VGVzdDsKKwlib29sIFNldFJGUG93ZXJTdGF0ZUluUHJvZ3Jlc3M7CisJdTggICBSRlByb2dUeXBlOworCWJvb2wgYkxlaXN1cmVQczsKKwlSVF9QU19NT0RFIGRvdDExUG93ZXJTYXZlTW9kZTsKKwkvL3UzMiBOdW1SeE9rSW5QZXJpb2Q7ICAgLy9ZSixkZWwsMDgwODI4CisJLy91MzIgTnVtVHhPa0luUGVyaW9kOyAgIC8vWUosZGVsLDA4MDgyOAorCXU4ICAgVHhQb2xsaW5nVGltZXM7CisKKwlib29sCWJBcEJ1Zk91ckZyYW1lOy8vIFRSVUUgaWYgQVAgYnVmZmVyIG91ciB1bmljYXN0IGRhdGEgLCB3ZSB3aWxsIGtlZXAgZUF3YWtlIHVudGlsbCByZWNlaXZlIGRhdGEgb3IgdGltZW91dC4KKwl1OAlXYWl0QnVmRGF0YUJjbkNvdW50OworCXU4CVdhaXRCdWZEYXRhVGltZU91dDsKKworLy9ieSBhbXkgZm9yIHBvd2VyIHNhdmUKKy8vYnkgYW15IGZvciBhbnRlbm5hCisJdTggRUVQUk9NU3dBbnRlbm5hRGl2ZXJzaXR5OworCWJvb2wgRUVQUk9NRGVmYXVsdEFudGVubmExOworCXU4IFJlZ1N3QW50ZW5uYURpdmVyc2l0eU1lY2hhbmlzbTsKKwlib29sIGJTd0FudGVubmFEaXZlcml0eTsKKwl1OCBSZWdEZWZhdWx0QW50ZW5uYTsKKwlib29sIGJEZWZhdWx0QW50ZW5uYTE7CisJdTggU2lnbmFsU3RyZW5ndGg7CisJbG9uZyBTdGF0c19TaWduYWxTdHJlbmd0aDsKKwlsb25nIExhc3RTaWduYWxTdHJlbmd0aEluUGVyY2VudDsgLy8gSW4gcGVyY2VudGFuZ2UsIHVzZWQgZm9yIHNtb290aGluZywgZS5nLiBNb3ZpbmcgQXZlcmFnZS4KKwl1OAkgU2lnbmFsUXVhbGl0eTsgLy8gaW4gMC0xMDAgaW5kZXguCisJbG9uZyBTdGF0c19TaWduYWxRdWFsaXR5OworCWxvbmcgUmVjdlNpZ25hbFBvd2VyOyAvLyBpbiBkQm0uCisJbG9uZyBTdGF0c19SZWN2U2lnbmFsUG93ZXI7CisJdTgJIExhc3RSeFBrdEFudGVubmE7CS8vICtieSBhbXkgMDgwMzEyIEFudGVubiB3aGljaCByZWNlaXZlZCB0aGUgbGFzdGVkIHBhY2tldC4gMDogQXV4LCAxOk1haW4uIEFkZGVkIGJ5IFJvZ2VyLCAyMDA4LjAxLjI1LgorCXUzMiBBZFJ4T2tDbnQ7CisJbG9uZyBBZFJ4U2lnbmFsU3RyZW5ndGg7CisJdTggQ3VyckFudGVubmFJbmRleDsJCQkvLyBJbmRleCB0byBjdXJyZW50IEFudGVubmEgKGJvdGggVHggYW5kIFJ4KS4KKwl1OCBBZFRpY2tDb3VudDsJCQkJLy8gVGltZXMgb2YgU3dBbnRlbm5hRGl2ZXJzaXR5VGltZXIgaGFwcGVuZWQuCisJdTggQWRDaGVja1BlcmlvZDsJCQkJLy8gIyBvZiBwZXJpb2QgU3dBbnRlbm5hRGl2ZXJzaXR5VGltZXIgdG8gY2hlY2sgUnggc2lnbmFsIHN0cmVuZ3RoIGZvciBTVyBBbnRlbm5hIERpdmVyc2l0eS4KKwl1OCBBZE1pbkNoZWNrUGVyaW9kOwkJCS8vIE1pbiB2YWx1ZSBvZiBBZENoZWNrUGVyaW9kLgorCXU4IEFkTWF4Q2hlY2tQZXJpb2Q7CQkJLy8gTWF4IHZhbHVlIG9mIEFkQ2hlY2tQZXJpb2QuCisJbG9uZyBBZFJ4U3NUaHJlc2hvbGQ7CQkJLy8gU2lnbmFsIHN0cmVuZ3RoIHRocmVzaG9sZCB0byBzd2l0Y2ggYW50ZW5uYS4KKwlsb25nIEFkTWF4UnhTc1RocmVzaG9sZDsJCQkvLyBNYXggdmFsdWUgb2YgQWRSeFNzVGhyZXNob2xkLgorCWJvb2wgYkFkU3dpdGNoZWRDaGVja2luZzsJCS8vIFRSVUUgaWYgd2Ugc2hhbGwgc2hhbGwgY2hlY2sgUnggc2lnbmFsIHN0cmVuZ3RoIGZvciBsYXN0IHRpbWUgc3dpdGNoaW5nIGFudGVubmEuCisJbG9uZyBBZFJ4U3NCZWZvcmVTd2l0Y2hlZDsJCS8vIFJ4IHNpZ25hbCBzdHJlbmd0aCBiZWZvcmUgd2Ugc3dpdGhlZCBhbnRlbm5hLgorCXN0cnVjdCB0aW1lcl9saXN0IFN3QW50ZW5uYURpdmVyc2l0eVRpbWVyOworLy9ieSBhbXkgZm9yIGFudGVubmEKKy8ve2J5IGFteSAwODAzMTIKKy8vCisJLy8gQ3J5c3RhbCBjYWxpYnJhdGlvbi4KKwkvLyBBZGRlZCBieSBSb2dlciwgMjAwNy4xMi4xMS4KKwkvLworCWJvb2wJCWJYdGFsQ2FsaWJyYXRpb247IC8vIENyeXN0YWwgY2FsaWJyYXRpb24uCisJdTgJCQlYdGFsQ2FsX1hpbjsgLy8gQ3J5c3RhbCBjYWxpYnJhdGlvbiBmb3IgWGluLiAwfjcuNXBGCisJdTgJCQlYdGFsQ2FsX1hvdXQ7IC8vIENyeXN0YWwgY2FsaWJyYXRpb24gZm9yIFhvdXQuIDB+Ny41cEYKKwkvLworCS8vIFR4IHBvd2VyIHRyYWNraW5nIHdpdGggdGhlcm1hbCBtZXRlciBpbmRpY2F0aW9uLgorCS8vIEFkZGVkIGJ5IFJvZ2VyLCAyMDA3LjEyLjExLgorCS8vCisJYm9vbAkJYlR4UG93ZXJUcmFjazsgLy8gVHggUG93ZXIgdHJhY2tpbmcuCisJdTgJCQlUaGVybWFsTWV0ZXI7IC8vIFRoZXJtYWwgbWV0ZXIgcmVmZXJlbmNlIGluZGljYXRpb24uCisJLy8KKwkvLyBEeW5hbWljIEluaXRpYWwgR2FpbiBBZGp1c3RtZW50IE1lY2hhbmlzbS4gQWRkZWQgYnkgQnJ1Y2UsIDIwMDctMDItMTQuCisJLy8KKwlib29sCQkJCWJEaWdNZWNoYW5pc207IC8vIFRSVUUgaWYgRElHIGlzIGVuYWJsZWQsIEZBTFNFIG93LgorCWJvb2wJCQkJYlJlZ0hpZ2hQb3dlck1lY2hhbmlzbTsgLy8gRm9yIEhpZ2ggUG93ZXIgTWVjaGFuaXNtLiAwNjEwMTAsIGJ5IHJjbmprby4KKwl1MzIJCQkJCUZhbHNlQWxhcm1SZWdWYWx1ZTsKKwl1OAkJCQkJUmVnRGlnT2ZkbUZhVXBUaDsgLy8gVXBwZXIgdGhyZWhvbGQgb2YgT0ZETSBmYWxzZSBhbGFybSwgd2hpY2ggaXMgdXNlZCBpbiBESUcuCisJdTgJCQkJCURJR19OdW1iZXJGYWxsYmFja1ZvdGU7CisJdTgJCQkJCURJR19OdW1iZXJVcGdyYWRlVm90ZTsKKwkvLyBGb3IgSFcgYW50ZW5uYSBkaXZlcnNpdHksIGFkZGVkIGJ5IFJvZ2VyLCAyMDA4LjAxLjMwLgorCXUzMgkJCUFkTWFpbkFudGVubmFSeE9rQ250OwkJLy8gTWFpbiBhbnRlbm5hIFJ4IE9LIGNvdW50LgorCXUzMgkJCUFkQXV4QW50ZW5uYVJ4T2tDbnQ7CQkvLyBBdXggYW50ZW5uYSBSeCBPSyBjb3VudC4KKwlib29sCQliSFdBZFN3aXRjaGVkOwkJCQkvLyBUUlVFIGlmIHdlIGhhcyBzd2l0Y2hlZCBkZWZhdWx0IGFudGVubmEgYnkgSFcgZXZhbHVhdGlvbi4KKwkvLyBSRiBIaWdoIFBvd2VyIHVwcGVyL2xvd2VyIHRocmVzaG9sZC4KKwl1OAkJCQkJUmVnSGlQd3JVcHBlclRoOworCXU4CQkJCQlSZWdIaVB3ckxvd2VyVGg7CisJLy8gUkYgUlNTSSBIaWdoIFBvd2VyIHVwcGVyL2xvd2VyIFRocmVzaG9sZC4KKwl1OAkJCQkJUmVnUlNTSUhpUHdyVXBwZXJUaDsKKwl1OAkJCQkJUmVnUlNTSUhpUHdyTG93ZXJUaDsKKwkvLyBDdXJyZW50IENDSyBSU1NJIHZhbHVlIHRvIGRldGVybWluZSBDQ0sgaGlnaCBwb3dlciwgYXNrZWQgYnkgU0QzIERaLCBieSBCcnVjZSwgMjAwNy0wNC0xMi4KKwl1OAkJCUN1ckNDS1JTU0k7CisJYm9vbCAgICAgICAgYkN1ckNDS1BrdDsKKwkvLworCS8vIEhpZ2ggUG93ZXIgTWVjaGFuaXNtLiBBZGRlZCBieSBhbXksIDA4MDMxMi4KKwkvLworCWJvb2wJCQkJCWJUb1VwZGF0ZVR4UHdyOworCWxvbmcJCQkJCVVuZGVjb3JhdGVkU21vb3RoZWRTUzsKKwlsb25nCQkJCQlVbmRlcmNvcmF0ZVNtb290aGVkUnhQb3dlcjsKKwl1OAkJCQkJCVJTU0k7CisJY2hhcgkJCQkJUnhQb3dlcjsKKwkgdTggSW5pdGlhbEdhaW47CisJIC8vRm9yIGFkanVzdCBEaWcgVGhyZXNoaG9sZCBkdXJpbmcgTGVnYWN5L0xlaXN1cmUgUG93ZXIgU2F2ZSBNb2RlCisJdTMyCQkJCURvemVQZXJpb2RJblBhc3QyU2VjOworCSAvLyBEb24ndCBhY2Nlc3MgQkIvUkYgdW5kZXIgZGlzYWJsZSBQTEwgc2l0dWF0aW9uLgorCXU4CQkJCQlJbml0aWFsR2FpbkJhY2tVcDsKKwkgdTggUmVnQk1vZGVHYWluU3RhZ2U7CisvL2J5IGFteSBmb3IgcmF0ZSBhZGFwdGl2ZQorICAgIHN0cnVjdCB0aW1lcl9saXN0IHJhdGVhZGFwdGVyX3RpbWVyOworCXUzMiAgICBSYXRlQWRhcHRpdmVQZXJpb2Q7CisJYm9vbCAgIGJFbmhhbmNlVHhQd3I7CisJYm9vbCAgIGJVcGRhdGVBUkZSOworCWludAkgICBGb3JjZWREYXRhUmF0ZTsgLy8gRm9yY2UgRGF0YSBSYXRlLiAwOiBBdXRvLCAweDAyOiAxTSB+IDB4NkM6IDU0TS4pCisJdTMyICAgICBOdW1UeFVuaWNhc3Q7IC8vWUosYWRkLDA4MDgyOCxmb3Iga2VlcCBhbGl2ZQorCXU4ICAgICAga2VlcEFsaXZlTGV2ZWw7IC8vWUosYWRkLDA4MDgyOCxmb3IgS2VlcEFsaXZlCisJdW5zaWduZWQgbG9uZyAJTnVtVHhPa1RvdGFsOworCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExhc3RSZXRyeUNudDsKKyAgICAgICAgdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExhc3RSZXRyeVJhdGU7CisgICAgICAgIHVuc2lnbmVkIGxvbmcgICAgICAgTGFzdFR4b2tDbnQ7CisgICAgICAgIHVuc2lnbmVkIGxvbmcgICAgICAgICAgIExhc3RSeG9rQ250OworICAgICAgICB1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3VyclJldHJ5Q250OworICAgICAgICB1bnNpZ25lZCBsb25nICAgICAgICAgICBMYXN0VHhPS0J5dGVzOworCXVuc2lnbmVkIGxvbmcgCQkgICAgTnVtVHhPa0J5dGVzVG90YWw7CisgICAgICAgIHU4ICAgICAgICAgICAgICAgICAgICAgICAgICBMYXN0RmFpbFR4UmF0ZTsKKyAgICAgICAgbG9uZyAgICAgICAgICAgICAgICAgICAgICAgIExhc3RGYWlsVHhSYXRlU1M7CisgICAgICAgIHU4ICAgICAgICAgICAgICAgICAgICAgICAgICBGYWlsVHhSYXRlQ291bnQ7CisgICAgICAgIHUzMiAgICAgICAgICAgICAgICAgICAgICAgICBMYXN0VHhUaHJvdWdocHV0OworICAgICAgICAvL2ZvciB1cCByYXRlCisgICAgICAgIHVuc2lnbmVkIHNob3J0ICAgICAgICAgIGJUcnl1cGluZzsKKyAgICAgICAgdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN1cnJUeFJhdGU7ICAgICAvL3RoZSByYXRlIGJlZm9yZSB1cAorICAgICAgICB1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3VyclJldHJ5UmF0ZTsKKyAgICAgICAgdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyeXVwaW5nQ291bnQ7CisgICAgICAgIHU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcnlEb3duQ291bnRMb3dEYXRhOworICAgICAgICB1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJ5dXBpbmdDb3VudE5vRGF0YTsKKworICAgICAgICB1OCAgICAgICAgICAgICAgICAgIEN1cnJlbnRPcGVyYVJhdGU7CisvL2J5IGFteSBmb3IgcmF0ZSBhZGFwdGl2ZQorLy9ieSBhbXkgMDgwMzEyfQorLy8Jc2hvcnQgd3FfaHVycnl1cDsKKy8vCXN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICp3b3JrcXVldWU7CisJc3RydWN0IHdvcmtfc3RydWN0IHJlc2V0X3dxOworCXN0cnVjdCB3b3JrX3N0cnVjdCB3YXRjaF9kb2dfd3E7CisJc3RydWN0IHdvcmtfc3RydWN0IHR4X2lycV93cTsKKwlzaG9ydCBhY2tfdHhfdG9faWVlZTsKKworCXU4IFBvd2VyUHJvZmlsZTsKKyNpZmRlZiBDT05GSUdfUlRMODE4NUIKKwl1MzIgQ1NNZXRob2Q7CisJdTggY2NrX3R4cHdyX2Jhc2U7CisJdTggb2ZkbV90eHB3cl9iYXNlOworCXU4IGRtYV9wb2xsX3N0b3BfbWFzazsKKworCS8vdTggUmVnVGhyZWVXaXJlTW9kZTsKKwl1OCBNV0lFbmFibGU7CisJdTE2IFNob3J0UmV0cnlMaW1pdDsKKwl1MTYgTG9uZ1JldHJ5TGltaXQ7CisJdTE2IEVhcmx5UnhUaHJlc2hvbGQ7CisJdTMyIFRyYW5zbWl0Q29uZmlnOworCXUzMiBSZWNlaXZlQ29uZmlnOworCXUzMiBJbnRyTWFzazsKKworCXN0cnVjdCAJQ2hubEFjY2Vzc1NldHRpbmcgIENoYW5uZWxBY2Nlc3NTZXR0aW5nOworI2VuZGlmCit9cjgxODBfcHJpdjsKKworI2RlZmluZSBNQU5BR0VfUFJJT1JJVFkgMAorI2RlZmluZSBCS19QUklPUklUWSAxCisjZGVmaW5lIEJFX1BSSU9SSVRZIDIKKyNkZWZpbmUgVklfUFJJT1JJVFkgMworI2RlZmluZSBWT19QUklPUklUWSA0CisjZGVmaW5lIEhJX1BSSU9SSVRZIDUKKyNkZWZpbmUgQkVBQ09OX1BSSU9SSVRZIDYKKworI2RlZmluZSBMT1dfUFJJT1JJVFkgVklfUFJJT1JJVFkKKyNkZWZpbmUgTk9STV9QUklPUklUWSBWT19QUklPUklUWQorLy9BQzJRdWV1ZSBtYXBwaW5nCisjZGVmaW5lIEFDMlEoX2FjKSAoKChfYWMpID09IFdNRV9BQ19WTykgPyBWT19QUklPUklUWSA6IFwKKwkJKChfYWMpID09IFdNRV9BQ19WSSkgPyBWSV9QUklPUklUWSA6IFwKKwkJKChfYWMpID09IFdNRV9BQ19CSykgPyBCS19QUklPUklUWSA6IFwKKwkJQkVfUFJJT1JJVFkpCisKK3Nob3J0IHJ0bDgxODBfdHgoc3RydWN0IG5ldF9kZXZpY2UgKmRldix1OCogc2tidWYsIGludCBsZW4saW50IHByaW9yaXR5LAorCXNob3J0IG1vcmVmcmFnLHNob3J0IGZyYWdkZXNjLGludCByYXRlKTsKKwordTggcmVhZF9uaWNfYnl0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgeCk7Cit1MzIgcmVhZF9uaWNfZHdvcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHgpOwordTE2IHJlYWRfbmljX3dvcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHgpIDsKK3ZvaWQgd3JpdGVfbmljX2J5dGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHgsdTggeSk7Cit2b2lkIHdyaXRlX25pY193b3JkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCB4LHUxNiB5KTsKK3ZvaWQgd3JpdGVfbmljX2R3b3JkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCB4LHUzMiB5KTsKK3ZvaWQgZm9yY2VfcGNpX3Bvc3Rpbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKK3ZvaWQgcnRsODE4MF9ydHhfZGlzYWJsZShzdHJ1Y3QgbmV0X2RldmljZSAqKTsKK3ZvaWQgcnRsODE4MF9yeF9lbmFibGUoc3RydWN0IG5ldF9kZXZpY2UgKik7Cit2b2lkIHJ0bDgxODBfdHhfZW5hYmxlKHN0cnVjdCBuZXRfZGV2aWNlICopOwordm9pZCBydGw4MTgwX3N0YXJ0X3NjYW5uaW5nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwordm9pZCBydGw4MTgwX3N0YXJ0X3NjYW5uaW5nX3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Cit2b2lkIHJ0bDgxODBfc3RvcF9zY2FubmluZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3ZvaWQgcnRsODE4MF9kaXNhc3NvY2lhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisvL3ZvaWQgZml4X3J4X2ZpZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Cit2b2lkIHJ0bDgxODBfc2V0X2FuYXBhcmFtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsdTMyIGEpOwordm9pZCBydGw4MTg1X3NldF9hbmFwYXJhbTIoc3RydWN0IG5ldF9kZXZpY2UgKmRldix1MzIgYSk7Cit2b2lkIHJ0bDgxODBfc2V0X2h3X3dlcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3ZvaWQgcnRsODE4MF9ub19od193ZXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Cit2b2lkIHJ0bDgxODBfdXBkYXRlX21zcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKy8vdm9pZCBydGw4MTgwX0JTU19jcmVhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Cit2b2lkIHJ0bDgxODBfYmVhY29uX3R4X2Rpc2FibGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Cit2b2lkIHJ0bDgxODBfYmVhY29uX3J4X2Rpc2FibGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Cit2b2lkIHJ0bDgxODBfY29udHR4X2VuYWJsZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3ZvaWQgcnRsODE4MF9jb250dHhfZGlzYWJsZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK2ludCBydGw4MTgwX2Rvd24oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitpbnQgcnRsODE4MF91cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3ZvaWQgcnRsODE4MF9jb21taXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Cit2b2lkIHJ0bDgxODBfc2V0X2NoYW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldixzaG9ydCBjaCk7Cit2b2lkIHJ0bDgxODBfc2V0X21hc3Rlcl9lc3NpZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LGNoYXIgKmVzc2lkKTsKK3ZvaWQgcnRsODE4MF91cGRhdGVfYmVhY29uX3NlY3VyaXR5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwordm9pZCB3cml0ZV9waHkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggYWRyLCB1OCBkYXRhKTsKK3ZvaWQgd3JpdGVfcGh5X2NjayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCBhZHIsIHUzMiBkYXRhKTsKK3ZvaWQgd3JpdGVfcGh5X29mZG0oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggYWRyLCB1MzIgZGF0YSk7Cit2b2lkIHJ0bDgxODVfdHhfYW50ZW5uYShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCBhbnQpOwordm9pZCBydGw4MTg1X3JmX3BpbnNfZW5hYmxlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwordm9pZCBJQlNTX3JhbmRvbWl6ZV9jZWxsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwordm9pZCBJUFNFbnRlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3ZvaWQgSVBTTGVhdmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitpbnQgZ2V0X2N1cnJfdHhfZnJlZV9kZXNjKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwcmlvcml0eSk7Cit2b2lkIFVwZGF0ZUluaXRpYWxHYWluKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworYm9vbCBTZXRBbnRlbm5hQ29uZmlnODdTRShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCAgRGVmYXVsdEFudCwgYm9vbCBiQW50RGl2ZXJzaXR5KTsKKworLy8jaWZkZWYgQ09ORklHX1JUTDgxODVCCit2b2lkIHJ0bDgxODViX2FkYXB0ZXJfc3RhcnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Cit2b2lkIHJ0bDgxODViX3J4X2VuYWJsZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3ZvaWQgcnRsODE4NWJfdHhfZW5hYmxlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwordm9pZCBydGw4MTgwX3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwordm9pZCBydGw4MTg1Yl9pcnFfZW5hYmxlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwordm9pZCBmaXhfcnhfZmlmbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3ZvaWQgZml4X3R4X2ZpZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Cit2b2lkIHJ0bDgyMjV6Ml9TZXRUWFBvd2VyTGV2ZWwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc2hvcnQgY2gpOworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PUtFUk5FTF9WRVJTSU9OKDIsNiwyMCkKK3ZvaWQgcnRsODE4MF9yYXRlX2FkYXB0ZXIoc3RydWN0IHdvcmtfc3RydWN0ICogd29yayk7CisjZWxzZQordm9pZCBydGw4MTgwX3JhdGVfYWRhcHRlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKyNlbmRpZgorLy8jZW5kaWYKK2Jvb2wgTWdudEFjdFNldF9SRl9TdGF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBSVF9SRl9QT1dFUl9TVEFURSBTdGF0ZVRvU2V0LCB1MzIgQ2hhbmdlU291cmNlKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwXzkzY3g2LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwXzkzY3g2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2U0NzExZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfOTNjeDYuYwpAQCAtMCwwICsxLDE0NiBAQAorLyoKKyAgIFRoaXMgZmlsZXMgY29udGFpbnMgY2FyZCBlZXByb20gKDkzYzQ2IG9yIDkzYzU2KSBwcm9ncmFtbWluZyByb3V0aW5lcywKKyAgIG1lbW9yeSBpcyBhZGRyZXNzZWQgYnkgMTYgYml0cyB3b3Jkcy4KKworICAgVGhpcyBpcyBwYXJ0IG9mIHJ0bDgxODAgT3BlblNvdXJjZSBkcml2ZXIuCisgICBDb3B5cmlnaHQgKEMpIEFuZHJlYSBNZXJlbGxvIDIwMDQgIDxhbmRyZWFtcmxAdGlzY2FsaS5pdD4KKyAgIFJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiBHUEwgKEdlbmVyYWwgUHVibGljIExpY2VuY2UpCisKKyAgIFBhcnRzIG9mIHRoaXMgZHJpdmVyIGFyZSBiYXNlZCBvbiB0aGUgR1BMIHBhcnQgb2YgdGhlCisgICBvZmZpY2lhbCByZWFsdGVrIGRyaXZlci4KKworICAgUGFydHMgb2YgdGhpcyBkcml2ZXIgYXJlIGJhc2VkIG9uIHRoZSBydGw4MTgwIGRyaXZlciBza2VsZXRvbgorICAgZnJvbSBQYXRyaWMgU2NoZW5rZSAmIEFuZHJlcyBTYWxvbW9uLgorCisgICBQYXJ0cyBvZiB0aGlzIGRyaXZlciBhcmUgYmFzZWQgb24gdGhlIEludGVsIFBybyBXaXJlbGVzcyAyMTAwIEdQTCBkcml2ZXIuCisKKyAgIFdlIHdhbnQgdG8gdGFua3MgdGhlIEF1dGhvcnMgb2YgdGhvc2UgcHJvamVjdHMgYW5kIHRoZSBOZGlzd3JhcHBlcgorICAgcHJvamVjdCBBdXRob3JzLgorKi8KKworI2luY2x1ZGUgInI4MTgwXzkzY3g2LmgiCisKK3ZvaWQgZXByb21fY3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc2hvcnQgYml0KQoreworCWlmKGJpdCkKKwkJd3JpdGVfbmljX2J5dGUoZGV2LCBFUFJPTV9DTUQsCisJCQkgICAgICAgKDE8PEVQUk9NX0NTX1NISUZUKSB8IFwKKwkJCSAgICAgICByZWFkX25pY19ieXRlKGRldiwgRVBST01fQ01EKSk7IC8vZW5hYmxlIEVQUk9NCisJZWxzZQorCQl3cml0ZV9uaWNfYnl0ZShkZXYsIEVQUk9NX0NNRCwgcmVhZF9uaWNfYnl0ZShkZXYsIEVQUk9NX0NNRClcCisJCQkgICAgICAgJn4oMTw8RVBST01fQ1NfU0hJRlQpKTsgLy9kaXNhYmxlIEVQUk9NCisKKwlmb3JjZV9wY2lfcG9zdGluZyhkZXYpOworCXVkZWxheShFUFJPTV9ERUxBWSk7Cit9CisKKwordm9pZCBlcHJvbV9ja19jeWNsZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXdyaXRlX25pY19ieXRlKGRldiwgRVBST01fQ01ELAorCQkgICAgICAgKDE8PEVQUk9NX0NLX1NISUZUKSB8IHJlYWRfbmljX2J5dGUoZGV2LEVQUk9NX0NNRCkpOworCWZvcmNlX3BjaV9wb3N0aW5nKGRldik7CisJdWRlbGF5KEVQUk9NX0RFTEFZKTsKKwl3cml0ZV9uaWNfYnl0ZShkZXYsIEVQUk9NX0NNRCwKKwkJICAgICAgIHJlYWRfbmljX2J5dGUoZGV2LCBFUFJPTV9DTUQpICZ+ICgxPDxFUFJPTV9DS19TSElGVCkpOworCWZvcmNlX3BjaV9wb3N0aW5nKGRldik7CisJdWRlbGF5KEVQUk9NX0RFTEFZKTsKK30KKworCit2b2lkIGVwcm9tX3coc3RydWN0IG5ldF9kZXZpY2UgKmRldixzaG9ydCBiaXQpCit7CisJaWYoYml0KQorCQl3cml0ZV9uaWNfYnl0ZShkZXYsIEVQUk9NX0NNRCwgKDE8PEVQUk9NX1dfU0hJRlQpIHwgXAorCQkJICAgICAgIHJlYWRfbmljX2J5dGUoZGV2LEVQUk9NX0NNRCkpOworCWVsc2UKKwkJd3JpdGVfbmljX2J5dGUoZGV2LCBFUFJPTV9DTUQsIHJlYWRfbmljX2J5dGUoZGV2LEVQUk9NX0NNRClcCisJCQkgICAgICAgJn4oMTw8RVBST01fV19TSElGVCkpOworCisJZm9yY2VfcGNpX3Bvc3RpbmcoZGV2KTsKKwl1ZGVsYXkoRVBST01fREVMQVkpOworfQorCisKK3Nob3J0IGVwcm9tX3Ioc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzaG9ydCBiaXQ7CisKKwliaXQ9KHJlYWRfbmljX2J5dGUoZGV2LCBFUFJPTV9DTUQpICYgKDE8PEVQUk9NX1JfU0hJRlQpICk7CisJdWRlbGF5KEVQUk9NX0RFTEFZKTsKKworCWlmKGJpdCkgcmV0dXJuIDE7CisJcmV0dXJuIDA7Cit9CisKKwordm9pZCBlcHJvbV9zZW5kX2JpdHNfc3RyaW5nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHNob3J0IGJbXSwgaW50IGxlbikKK3sKKwlpbnQgaTsKKworCWZvcihpPTA7IGk8bGVuOyBpKyspeworCQllcHJvbV93KGRldiwgYltpXSk7CisJCWVwcm9tX2NrX2N5Y2xlKGRldik7CisJfQorfQorCisKK3UzMiBlcHJvbV9yZWFkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBhZGRyKQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlzaG9ydCByZWFkX2NtZFtdPXsxLDEsMH07CisJc2hvcnQgYWRkcl9zdHJbOF07CisJaW50IGk7CisJaW50IGFkZHJfbGVuOworCXUzMiByZXQ7CisKKwlyZXQ9MDsKKyAgICAgICAgLy9lbmFibGUgRVBST00gcHJvZ3JhbW1pbmcKKwl3cml0ZV9uaWNfYnl0ZShkZXYsIEVQUk9NX0NNRCwKKwkJICAgICAgIChFUFJPTV9DTURfUFJPR1JBTTw8RVBST01fQ01EX09QRVJBVElOR19NT0RFX1NISUZUKSk7CisJZm9yY2VfcGNpX3Bvc3RpbmcoZGV2KTsKKwl1ZGVsYXkoRVBST01fREVMQVkpOworCisJaWYgKHByaXYtPmVwcm9tdHlwZT09RVBST01fOTNjNTYpeworCQlhZGRyX3N0cls3XT1hZGRyICYgMTsKKwkJYWRkcl9zdHJbNl09YWRkciAmICgxPDwxKTsKKwkJYWRkcl9zdHJbNV09YWRkciAmICgxPDwyKTsKKwkJYWRkcl9zdHJbNF09YWRkciAmICgxPDwzKTsKKwkJYWRkcl9zdHJbM109YWRkciAmICgxPDw0KTsKKwkJYWRkcl9zdHJbMl09YWRkciAmICgxPDw1KTsKKwkJYWRkcl9zdHJbMV09YWRkciAmICgxPDw2KTsKKwkJYWRkcl9zdHJbMF09YWRkciAmICgxPDw3KTsKKwkJYWRkcl9sZW49ODsKKwl9ZWxzZXsKKwkJYWRkcl9zdHJbNV09YWRkciAmIDE7CisJCWFkZHJfc3RyWzRdPWFkZHIgJiAoMTw8MSk7CisJCWFkZHJfc3RyWzNdPWFkZHIgJiAoMTw8Mik7CisJCWFkZHJfc3RyWzJdPWFkZHIgJiAoMTw8Myk7CisJCWFkZHJfc3RyWzFdPWFkZHIgJiAoMTw8NCk7CisJCWFkZHJfc3RyWzBdPWFkZHIgJiAoMTw8NSk7CisJCWFkZHJfbGVuPTY7CisJfQorCWVwcm9tX2NzKGRldiwgMSk7CisJZXByb21fY2tfY3ljbGUoZGV2KTsKKwllcHJvbV9zZW5kX2JpdHNfc3RyaW5nKGRldiwgcmVhZF9jbWQsIDMpOworCWVwcm9tX3NlbmRfYml0c19zdHJpbmcoZGV2LCBhZGRyX3N0ciwgYWRkcl9sZW4pOworCisJLy9rZWVwIGNoaXAgcGluIEQgdG8gbG93IHN0YXRlIHdoaWxlIHJlYWRpbmcuCisJLy9JJ20gdW5zdXJlIGlmIGl0IGlzIG5lY2Vzc2FyeSwgYnV0IGFueXdheSBzaG91bGRuJ3QgaHVydAorCWVwcm9tX3coZGV2LCAwKTsKKworCWZvcihpPTA7aTwxNjtpKyspeworCQkvL2VlcHJvbSBuZWVkcyBhIGNsayBjeWNsZSBiZXR3ZWVuIHdyaXRpbmcgb3Bjb2RlJmFkcgorCQkvL2FuZCByZWFkaW5nIGRhdGEuIChlZXByb20gb3V0cyBhIGR1bW15IDApCisJCWVwcm9tX2NrX2N5Y2xlKGRldik7CisJCXJldCB8PSAoZXByb21fcihkZXYpPDwoMTUtaSkpOworCX0KKworCWVwcm9tX2NzKGRldiwgMCk7CisJZXByb21fY2tfY3ljbGUoZGV2KTsKKworCS8vZGlzYWJsZSBFUFJPTSBwcm9ncmFtbWluZworCXdyaXRlX25pY19ieXRlKGRldiwgRVBST01fQ01ELAorCQkgICAgICAgKEVQUk9NX0NNRF9OT1JNQUw8PEVQUk9NX0NNRF9PUEVSQVRJTkdfTU9ERV9TSElGVCkpOworCXJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwXzkzY3g2LmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwXzkzY3g2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTAyOGE1MQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfOTNjeDYuaApAQCAtMCwwICsxLDU5IEBACisvKgorCVRoaXMgaXMgcGFydCBvZiBydGw4MTgwIE9wZW5Tb3VyY2UgZHJpdmVyCisJQ29weXJpZ2h0IChDKSBBbmRyZWEgTWVyZWxsbyAyMDA0LTIwMDUgIDxhbmRyZWFtcmxAdGlzY2FsaS5pdD4KKwlSZWxlYXNlZCB1bmRlciB0aGUgdGVybXMgb2YgR1BMIChHZW5lcmFsIFB1YmxpYyBMaWNlbmNlKQorCisJUGFydHMgb2YgdGhpcyBkcml2ZXIgYXJlIGJhc2VkIG9uIHRoZSBHUEwgcGFydCBvZiB0aGUgb2ZmaWNpYWwgcmVhbHRlayBkcml2ZXIKKwlQYXJ0cyBvZiB0aGlzIGRyaXZlciBhcmUgYmFzZWQgb24gdGhlIHJ0bDgxODAgZHJpdmVyIHNrZWxldG9uIGZyb20gUGF0cmljIFNjaGVua2UgJiBBbmRyZXMgU2Fsb21vbgorCVBhcnRzIG9mIHRoaXMgZHJpdmVyIGFyZSBiYXNlZCBvbiB0aGUgSW50ZWwgUHJvIFdpcmVsZXNzIDIxMDAgR1BMIGRyaXZlcgorCisJV2Ugd2FudCB0byB0YW5rcyB0aGUgQXV0aG9ycyBvZiBzdWNoIHByb2plY3RzIGFuZCB0aGUgTmRpc3dyYXBwZXIgcHJvamVjdCBBdXRob3JzLgorKi8KKworLypUaGlzIGZpbGVzIGNvbnRhaW5zIGNhcmQgZWVwcm9tICg5M2M0NiBvciA5M2M1NikgcHJvZ3JhbW1pbmcgcm91dGluZXMqLworLyptZW1vcnkgaXMgYWRkcmVzc2VkIGJ5IFdPUkRTKi8KKworI2luY2x1ZGUgInI4MTgwLmgiCisjaW5jbHVkZSAicjgxODBfaHcuaCIKKworI2RlZmluZSBFUFJPTV9ERUxBWSAxMAorCisjZGVmaW5lIEVQUk9NX0FOQVBBUkFNX0FERFJMV09SRCAweGQKKyNkZWZpbmUgRVBST01fQU5BUEFSQU1fQUREUkhXT1JEIDB4ZQorCisjZGVmaW5lIFJGQ0hJUElEIDB4NgorI2RlZmluZQlSRkNISVBJRF9JTlRFUlNJTCAxCisjZGVmaW5lCVJGQ0hJUElEX1JGTUQgMgorI2RlZmluZQlSRkNISVBJRF9QSElMSVBTIDMKKyNkZWZpbmUJUkZDSElQSURfTUFYSU0gNAorI2RlZmluZQlSRkNISVBJRF9HQ1QgNQorI2RlZmluZSBSRkNISVBJRF9SVEw4MjI1IDkKKyNpZmRlZiBDT05GSUdfUlRMODE4NUIKKyNkZWZpbmUgUkZfWkVCUkEyIDExCisjZGVmaW5lIEVQUk9NX1RYUFdfQkFTRSAweDA1CisjZGVmaW5lIFJGX1pFQlJBNCAxMgorI2VuZGlmCisjZGVmaW5lIFJGQ0hJUElEX1JUTDgyNTUgMHhhCisjZGVmaW5lIFJGX1BBUkFNIDB4MTkKKyNkZWZpbmUgUkZfUEFSQU1fRElHUEhZX1NISUZUIDAKKyNkZWZpbmUgUkZfUEFSQU1fQU5UQkRFRkFVTFRfU0hJRlQgMQorI2RlZmluZSBSRl9QQVJBTV9DQVJSSUVSU0VOU0VfU0hJRlQgMgorI2RlZmluZSBSRl9QQVJBTV9DQVJSSUVSU0VOU0VfTUFTSyAoMzw8MikKKyNkZWZpbmUgRU5FUkdZX1RSRVNIT0xEIDB4MTcKKyNkZWZpbmUgRVBST01fVkVSU0lPTiAweDFFCisjZGVmaW5lIE1BQ19BRFIgMHg3CisKKyNkZWZpbmUgQ0lTIDB4MTgKKworI2RlZmluZQlFUFJPTV9UWFBXX09GRE1fQ0gxXzIgMHgyMAorCisvLyNkZWZpbmUJRVBST01fVFhQV19DSDFfMiAweDEwCisjZGVmaW5lICBFUFJPTV9UWFBXX0NIMV8yIDB4MzAKKyNkZWZpbmUJRVBST01fVFhQV19DSDNfNCAweDExCisjZGVmaW5lCUVQUk9NX1RYUFdfQ0g1XzYgMHgxMgorI2RlZmluZQlFUFJPTV9UWFBXX0NIN184IDB4MTMKKyNkZWZpbmUJRVBST01fVFhQV19DSDlfMTAgMHgxNAorI2RlZmluZQlFUFJPTV9UWFBXX0NIMTFfMTIgMHgxNQorI2RlZmluZQlFUFJPTV9UWFBXX0NIMTNfMTQgMHgxNgorCit1MzIgZXByb21fcmVhZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LHUzMiBhZGRyKTsgLy9yZWFkcyBhIDE2IGJpdHMgd29yZApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MF9jb3JlLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwX2NvcmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDUzNDk1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MF9jb3JlLmMKQEAgLTAsMCArMSw2ODI4IEBACisvKgorICAgVGhpcyBpcyBwYXJ0IG9mIHJ0bDgxOHggcGNpIE9wZW5Tb3VyY2UgZHJpdmVyIC0gdiAwLjEKKyAgIENvcHlyaWdodCAoQykgQW5kcmVhIE1lcmVsbG8gMjAwNC0yMDA1ICA8YW5kcmVhbXJsQHRpc2NhbGkuaXQ+CisgICBSZWxlYXNlZCB1bmRlciB0aGUgdGVybXMgb2YgR1BMIChHZW5lcmFsIFB1YmxpYyBMaWNlbnNlKQorCisgICBQYXJ0cyBvZiB0aGlzIGRyaXZlciBhcmUgYmFzZWQgb24gdGhlIEdQTCBwYXJ0IG9mIHRoZSBvZmZpY2lhbAorICAgUmVhbHRlayBkcml2ZXIuCisKKyAgIFBhcnRzIG9mIHRoaXMgZHJpdmVyIGFyZSBiYXNlZCBvbiB0aGUgcnRsODE4MCBkcml2ZXIgc2tlbGV0b24KKyAgIGZyb20gUGF0cmljIFNjaGVua2UgJiBBbmRyZXMgU2Fsb21vbi4KKworICAgUGFydHMgb2YgdGhpcyBkcml2ZXIgYXJlIGJhc2VkIG9uIHRoZSBJbnRlbCBQcm8gV2lyZWxlc3MgMjEwMCBHUEwgZHJpdmVyLgorCisgICBQYXJ0cyBvZiBCQi9SRiBjb2RlIGFyZSBkZXJpdmVkIGZyb20gRGF2aWQgWW91bmcgcnRsODE4MCBuZXRic2QgZHJpdmVyLgorCisgICBSU1NJIGNhbGMgZnVuY3Rpb24gZnJvbSAnVGhlIERldWNlJworCisgICBTb21lIGlkZWFzIGJvcnJvd2VkIGZyb20gdGhlIDgxMzl0b28uYyBkcml2ZXIgaW5jbHVkZWQgaW4gbGludXgga2VybmVsLgorCisgICBXZSAoST8pIHdhbnQgdG8gdGhhbmtzIHRoZSBBdXRob3JzIG9mIHRob3NlIHByb2plY3MgYW5kIGFsc28gdGhlCisgICBOZGlzd3JhcHBlcidzIHByb2plY3QgQXV0aG9ycy4KKworICAgQSBiaWcgYmlnIHRoYW5rcyBnb2VzIGFsc28gdG8gUmVhbHRlayBjb3JwLiBmb3IgdGhlaXIgaGVscCBpbiBteSBhdHRlbXB0IHRvCisgICBhZGQgUlRMODE4NSBhbmQgUlRMODIyNSBzdXBwb3J0LCBhbmQgdG8gRGF2aWQgWW91bmcgYWxzby4KKyovCisKKyNpZiAwCitkb3VibGUgX19mbG9hdHNpZGYgKGludCBpKSB7IHJldHVybiBpOyB9Cit1bnNpZ25lZCBpbnQgX19maXh1bnNkZnNpIChkb3VibGUgZCkgeyByZXR1cm4gZDsgfQorZG91YmxlIF9fYWRkZGYzKGRvdWJsZSBhLCBkb3VibGUgYikgeyByZXR1cm4gYStiOyB9Citkb3VibGUgX19hZGRzZjMoZmxvYXQgYSwgZmxvYXQgYikgeyByZXR1cm4gYStiOyB9Citkb3VibGUgX19zdWJkZjMoZG91YmxlIGEsIGRvdWJsZSBiKSB7IHJldHVybiBhLWI7IH0KK2RvdWJsZSBfX2V4dGVuZHNmZGYyKGZsb2F0IGEpIHtyZXR1cm4gYTt9CisjZW5kaWYKKworCisjdW5kZWYgREVCVUdfVFhfREVTQzIKKyN1bmRlZiBSWF9ET05UX1BBU1NfVUwKKyN1bmRlZiBERUJVR19FUFJPTQorI3VuZGVmIERFQlVHX1JYX1ZFUkJPU0UKKyN1bmRlZiBEVU1NWV9SWAorI3VuZGVmIERFQlVHX1pFUk9fUlgKKyN1bmRlZiBERUJVR19SWF9TS0IKKyN1bmRlZiBERUJVR19UWF9GUkFHCisjdW5kZWYgREVCVUdfUlhfRlJBRworI3VuZGVmIERFQlVHX1RYX0ZJTExERVNDCisjdW5kZWYgREVCVUdfVFgKKyN1bmRlZiBERUJVR19JUlEKKyN1bmRlZiBERUJVR19SWAorI3VuZGVmIERFQlVHX1JYQUxMT0MKKyN1bmRlZiBERUJVR19SRUdJU1RFUlMKKyN1bmRlZiBERUJVR19SSU5HCisjdW5kZWYgREVCVUdfSVJRX1RBU0tMRVQKKyN1bmRlZiBERUJVR19UWF9BTExPQworI3VuZGVmIERFQlVHX1RYX0RFU0MKKworLy8jZGVmaW5lIERFQlVHX1RYCisvLyNkZWZpbmUgREVCVUdfVFhfREVTQzIKKy8vI2RlZmluZSBERUJVR19SWAorLy8jZGVmaW5lIERFQlVHX1JYX1NLQgorCisvLyNkZWZpbmUgQ09ORklHX1JUTDgxODBfSU9fTUFQCisjaW5jbHVkZSA8bGludXgvc3lzY2FsbHMuaD4KKy8vI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisvLyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgInI4MTgwX2h3LmgiCisjaW5jbHVkZSAicjgxODAuaCIKKyNpbmNsdWRlICJyODE4MF9zYTI0MDAuaCIgIC8qIFBISUxJUFMgUmFkaW8gZnJvbnRlbmQgKi8KKyNpbmNsdWRlICJyODE4MF9tYXgyODIwLmgiIC8qIE1BWElNIFJhZGlvIGZyb250ZW5kICovCisjaW5jbHVkZSAicjgxODBfZ2N0LmgiICAgICAvKiBHQ1QgUmFkaW8gZnJvbnRlbmQgKi8KKyNpbmNsdWRlICJyODE4MF9ydGw4MjI1LmgiIC8qIFJUTDgyMjUgUmFkaW8gZnJvbnRlbmQgKi8KKyNpbmNsdWRlICJyODE4MF9ydGw4MjU1LmgiIC8qIFJUTDgyNTUgUmFkaW8gZnJvbnRlbmQgKi8KKyNpbmNsdWRlICJyODE4MF85M2N4Ni5oIiAgIC8qIENhcmQgRUVQUk9NICovCisjaW5jbHVkZSAicjgxODBfd3guaCIKKyNpbmNsdWRlICJyODE4MF9kbS5oIgorCisjaWZkZWYgQ09ORklHX1JUTDgxODBfUE0KKyNpbmNsdWRlICJyODE4MF9wbS5oIgorI2VuZGlmCisKKyNpZmRlZiBFTkFCTEVfRE9UMTFECisjaW5jbHVkZSAiZG90MTFkLmgiCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19SVEw4MTg1QgorLy8jZGVmaW5lIENPTkZJR19SVEw4MTgwX0lPX01BUAorI2VuZGlmCisKKyNpZm5kZWYgUENJX1ZFTkRPUl9JRF9CRUxLSU4KKwkjZGVmaW5lIFBDSV9WRU5ET1JfSURfQkVMS0lOIDB4MTc5OQorI2VuZGlmCisjaWZuZGVmIFBDSV9WRU5ET1JfSURfRExJTksKKwkjZGVmaW5lIFBDSV9WRU5ET1JfSURfRExJTksgMHgxMTg2CisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHJ0bDgxODBfcGNpX2lkX3RibFtdIF9fZGV2aW5pdGRhdGEgPSB7CisgICAgICAgIHsKKyAgICAgICAgICAgICAgICAudmVuZG9yID0gUENJX1ZFTkRPUl9JRF9SRUFMVEVLLAorLy8gICAgICAgICAgICAgICAgLmRldmljZSA9IDB4ODE4MCwKKyAgICAgICAgICAgICAgICAuZGV2aWNlID0gMHg4MTk5LAorICAgICAgICAgICAgICAgIC5zdWJ2ZW5kb3IgPSBQQ0lfQU5ZX0lELAorICAgICAgICAgICAgICAgIC5zdWJkZXZpY2UgPSBQQ0lfQU5ZX0lELAorICAgICAgICAgICAgICAgIC5kcml2ZXJfZGF0YSA9IDAsCisgICAgICAgIH0sCisjaWYgMAorICAgICAgICB7CisgICAgICAgICAgICAgICAgLnZlbmRvciA9IFBDSV9WRU5ET1JfSURfQkVMS0lOLAorICAgICAgICAgICAgICAgIC5kZXZpY2UgPSAweDYwMDEsCisgICAgICAgICAgICAgICAgLnN1YnZlbmRvciA9IFBDSV9BTllfSUQsCisgICAgICAgICAgICAgICAgLnN1YmRldmljZSA9IFBDSV9BTllfSUQsCisgICAgICAgICAgICAgICAgLmRyaXZlcl9kYXRhID0gMSwKKyAgICAgICAgfSwKKyAgICAgICAgeyAgICAgICAvKiBCZWxraW4gRjVENjAyMCB2MyAqLworCSAgICAgICAgLnZlbmRvciA9IFBDSV9WRU5ET1JfSURfQkVMS0lOLAorICAgICAgICAgICAgICAgIC5kZXZpY2UgPSAweDYwMjAsCisgICAgICAgICAgICAgICAgLnN1YnZlbmRvciA9IFBDSV9BTllfSUQsCisgICAgICAgICAgICAgICAgLnN1YmRldmljZSA9IFBDSV9BTllfSUQsCisgICAgICAgICAgICAgICAgLmRyaXZlcl9kYXRhID0gMiwKKyAgICAgICAgfSwKKyAgICAgICAgeyAgICAgICAvKiBELUxpbmsgRFdMLTYxMCAqLworICAgICAgICAgICAgICAgIC52ZW5kb3IgPSBQQ0lfVkVORE9SX0lEX0RMSU5LLAorICAgICAgICAgICAgICAgIC5kZXZpY2UgPSAweDMzMDAsCisgICAgICAgICAgICAgICAgLnN1YnZlbmRvciA9IFBDSV9BTllfSUQsCisgICAgICAgICAgICAgICAgLnN1YmRldmljZSA9IFBDSV9BTllfSUQsCisgICAgICAgICAgICAgICAgLmRyaXZlcl9kYXRhID0gMywKKyAgICAgICAgfSwKKwl7CisJCS52ZW5kb3IgPSBQQ0lfVkVORE9SX0lEX1JFQUxURUssCisJCS5kZXZpY2UgPSAweDgxODUsCisJCS5zdWJ2ZW5kb3IgPSBQQ0lfQU5ZX0lELAorCQkuc3ViZGV2aWNlID0gUENJX0FOWV9JRCwKKwkJLmRyaXZlcl9kYXRhID0gNCwKKwl9LAorI2VuZGlmCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICAudmVuZG9yID0gMCwKKyAgICAgICAgICAgICAgICAuZGV2aWNlID0gMCwKKyAgICAgICAgICAgICAgICAuc3VidmVuZG9yID0gMCwKKyAgICAgICAgICAgICAgICAuc3ViZGV2aWNlID0gMCwKKyAgICAgICAgICAgICAgICAuZHJpdmVyX2RhdGEgPSAwLAorICAgICAgICB9Cit9OworCisKK3N0YXRpYyBjaGFyKiBpZm5hbWUgPSAid2xhbiVkIjsKK3N0YXRpYyBpbnQgaHdzZXFudW0gPSAwOworLy9zdGF0aWMgY2hhciogaWZuYW1lID0gImF0aCVkIjsKK3N0YXRpYyBpbnQgaHd3ZXAgPSAwOworc3RhdGljIGludCBjaGFubmVscyA9IDB4M2ZmZjsKKworI2RlZmluZSBlcU1hY0FkZHIoYSxiKQkJKCAoKGEpWzBdPT0oYilbMF0gJiYgKGEpWzFdPT0oYilbMV0gJiYgKGEpWzJdPT0oYilbMl0gJiYgKGEpWzNdPT0oYilbM10gJiYgKGEpWzRdPT0oYilbNF0gJiYgKGEpWzVdPT0oYilbNV0pID8gMTowICkKKyNkZWZpbmUgY3BNYWNBZGRyKGRlcyxzcmMpCSAgICAgICgoZGVzKVswXT0oc3JjKVswXSwoZGVzKVsxXT0oc3JjKVsxXSwoZGVzKVsyXT0oc3JjKVsyXSwoZGVzKVszXT0oc3JjKVszXSwoZGVzKVs0XT0oc3JjKVs0XSwoZGVzKVs1XT0oc3JjKVs1XSkKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBydGw4MTgwX3BjaV9pZF90YmwpOworTU9EVUxFX0FVVEhPUigiQW5kcmVhIE1lcmVsbG8gPGFuZHJlYW1ybEB0aXNjYWxpLml0PiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJMaW51eCBkcml2ZXIgZm9yIFJlYWx0ZWsgUlRMODE4MCAvIFJUTDgxODUgV2lGaSBjYXJkcyIpOworCisKKworLyoKK01PRFVMRV9QQVJNKGlmbmFtZSwgInMiKTsKK01PRFVMRV9QQVJNX0RFU0MoZGV2bmFtZSwiIE5ldCBpbnRlcmZhY2UgbmFtZSwgd2xhbiVkPWRlZmF1bHQiKTsKKworTU9EVUxFX1BBUk0oaHdzZXFudW0sImkiKTsKK01PRFVMRV9QQVJNX0RFU0MoaHdzZXFudW0sIiBUcnkgdG8gdXNlIGhhcmR3YXJlIDgwMi4xMSBoZWFkZXIgc2VxdWVuY2UgbnVtYmVycy4gWmVybz1kZWZhdWx0Iik7CisKK01PRFVMRV9QQVJNKGh3d2VwLCJpIik7CitNT0RVTEVfUEFSTV9ERVNDKGh3d2VwLCIgVHJ5IHRvIHVzZSBoYXJkd2FyZSBXRVAgc3VwcG9ydC4gU3RpbGwgYnJva2VuIGFuZCBub3QgYXZhaWxhYmxlIG9uIGFsbCBjYXJkcyIpOworCitNT0RVTEVfUEFSTShjaGFubmVscywiaSIpOworTU9EVUxFX1BBUk1fREVTQyhjaGFubmVscywiIENoYW5uZWwgYml0bWFzayBmb3Igc3BlY2lmaWMgbG9jYWxlcy4gTllJIik7CisqLworCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsIDYsIDkpCittb2R1bGVfcGFyYW0oaWZuYW1lLCBjaGFycCwgU19JUlVHT3xTX0lXVVNSICk7Cittb2R1bGVfcGFyYW0oaHdzZXFudW0saW50LCBTX0lSVUdPfFNfSVdVU1IpOworbW9kdWxlX3BhcmFtKGh3d2VwLGludCwgU19JUlVHT3xTX0lXVVNSKTsKK21vZHVsZV9wYXJhbShjaGFubmVscyxpbnQsIFNfSVJVR098U19JV1VTUik7CisjZWxzZQorTU9EVUxFX1BBUk0oaWZuYW1lLCAicyIpOworTU9EVUxFX1BBUk0oaHdzZXFudW0sImkiKTsKK01PRFVMRV9QQVJNKGh3d2VwLCJpIik7CitNT0RVTEVfUEFSTShjaGFubmVscywiaSIpOworI2VuZGlmCisKK01PRFVMRV9QQVJNX0RFU0MoZGV2bmFtZSwiIE5ldCBpbnRlcmZhY2UgbmFtZSwgd2xhbiVkPWRlZmF1bHQiKTsKKy8vTU9EVUxFX1BBUk1fREVTQyhkZXZuYW1lLCIgTmV0IGludGVyZmFjZSBuYW1lLCBhdGglZD1kZWZhdWx0Iik7CitNT0RVTEVfUEFSTV9ERVNDKGh3c2VxbnVtLCIgVHJ5IHRvIHVzZSBoYXJkd2FyZSA4MDIuMTEgaGVhZGVyIHNlcXVlbmNlIG51bWJlcnMuIFplcm89ZGVmYXVsdCIpOworTU9EVUxFX1BBUk1fREVTQyhod3dlcCwiIFRyeSB0byB1c2UgaGFyZHdhcmUgV0VQIHN1cHBvcnQuIFN0aWxsIGJyb2tlbiBhbmQgbm90IGF2YWlsYWJsZSBvbiBhbGwgY2FyZHMiKTsKK01PRFVMRV9QQVJNX0RFU0MoY2hhbm5lbHMsIiBDaGFubmVsIGJpdG1hc2sgZm9yIHNwZWNpZmljIGxvY2FsZXMuIE5ZSSIpOworCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHJ0bDgxODBfcGNpX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpOworCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgcnRsODE4MF9wY2lfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KTsKKworc3RhdGljIHZvaWQgcnRsODE4MF9zaHV0ZG93biAoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlkZXYtPnN0b3AoZGV2KTsKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBydGw4MTgwX3BjaV9kcml2ZXIgPSB7CisJLm5hbWUJCT0gUlRMODE4MF9NT0RVTEVfTkFNRSwJICAgICAgICAgIC8qIERyaXZlciBuYW1lICAgKi8KKwkuaWRfdGFibGUJPSBydGw4MTgwX3BjaV9pZF90YmwsCSAgICAgICAgICAvKiBQQ0lfSUQgdGFibGUgICovCisJLnByb2JlCQk9IHJ0bDgxODBfcGNpX3Byb2JlLAkgICAgICAgICAgLyogcHJvYmUgZm4gICAgICAqLworCS5yZW1vdmUJCT0gX19kZXZleGl0X3AocnRsODE4MF9wY2lfcmVtb3ZlKSwvKiByZW1vdmUgZm4gICAgICovCisjaWZkZWYgQ09ORklHX1JUTDgxODBfUE0KKwkuc3VzcGVuZAk9IHJ0bDgxODBfc3VzcGVuZCwJICAgICAgICAgIC8qIFBNIHN1c3BlbmQgZm4gKi8KKwkucmVzdW1lCQk9IHJ0bDgxODBfcmVzdW1lLCAgICAgICAgICAgICAgICAgLyogUE0gcmVzdW1lIGZuICAqLworI2Vsc2UKKwkuc3VzcGVuZAk9IE5VTEwsCQkJICAgICAgICAgIC8qIFBNIHN1c3BlbmQgZm4gKi8KKwkucmVzdW1lICAgICAgCT0gTlVMTCwJCQkgICAgICAgICAgLyogUE0gcmVzdW1lIGZuICAqLworI2VuZGlmCisJLnNodXRkb3duCT0gcnRsODE4MF9zaHV0ZG93biwKK307CisKKworCisjaWZkZWYgQ09ORklHX1JUTDgxODBfSU9fTUFQCisKK3U4IHJlYWRfbmljX2J5dGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHgpCit7CisgICAgICAgIHJldHVybiAweGZmJmluYihkZXYtPmJhc2VfYWRkciAreCk7Cit9CisKK3UzMiByZWFkX25pY19kd29yZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgeCkKK3sKKyAgICAgICAgcmV0dXJuIGlubChkZXYtPmJhc2VfYWRkciAreCk7Cit9CisKK3UxNiByZWFkX25pY193b3JkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCB4KQoreworICAgICAgICByZXR1cm4gaW53KGRldi0+YmFzZV9hZGRyICt4KTsKK30KKwordm9pZCB3cml0ZV9uaWNfYnl0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgeCx1OCB5KQoreworICAgICAgICBvdXRiKHkmMHhmZixkZXYtPmJhc2VfYWRkciAreCk7Cit9CisKK3ZvaWQgd3JpdGVfbmljX3dvcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHgsdTE2IHkpCit7CisgICAgICAgIG91dHcoeSxkZXYtPmJhc2VfYWRkciAreCk7Cit9CisKK3ZvaWQgd3JpdGVfbmljX2R3b3JkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCB4LHUzMiB5KQoreworICAgICAgICBvdXRsKHksZGV2LT5iYXNlX2FkZHIgK3gpOworfQorCisjZWxzZSAvKiBSVExfSU9fTUFQICovCisKK3U4IHJlYWRfbmljX2J5dGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHgpCit7CisgICAgICAgIHJldHVybiAweGZmJnJlYWRiKCh1OCopZGV2LT5tZW1fc3RhcnQgK3gpOworfQorCit1MzIgcmVhZF9uaWNfZHdvcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHgpCit7CisgICAgICAgIHJldHVybiByZWFkbCgodTgqKWRldi0+bWVtX3N0YXJ0ICt4KTsKK30KKwordTE2IHJlYWRfbmljX3dvcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHgpCit7CisgICAgICAgIHJldHVybiByZWFkdygodTgqKWRldi0+bWVtX3N0YXJ0ICt4KTsKK30KKwordm9pZCB3cml0ZV9uaWNfYnl0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgeCx1OCB5KQoreworICAgICAgICB3cml0ZWIoeSwodTgqKWRldi0+bWVtX3N0YXJ0ICt4KTsKKwl1ZGVsYXkoMjApOworfQorCit2b2lkIHdyaXRlX25pY19kd29yZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgeCx1MzIgeSkKK3sKKyAgICAgICAgd3JpdGVsKHksKHU4KilkZXYtPm1lbV9zdGFydCAreCk7CisJdWRlbGF5KDIwKTsKK30KKwordm9pZCB3cml0ZV9uaWNfd29yZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgeCx1MTYgeSkKK3sKKyAgICAgICAgd3JpdGV3KHksKHU4KilkZXYtPm1lbV9zdGFydCAreCk7CisJdWRlbGF5KDIwKTsKK30KKworI2VuZGlmIC8qIFJUTF9JT19NQVAgKi8KKworCisKKworCitpbmxpbmUgdm9pZCBmb3JjZV9wY2lfcG9zdGluZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXJlYWRfbmljX2J5dGUoZGV2LEVQUk9NX0NNRCk7CisjaWZuZGVmIENPTkZJR19SVEw4MTgwX0lPX01BUAorCW1iKCk7CisjZW5kaWYKK30KKworCitpcnFyZXR1cm5fdCBydGw4MTgwX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpuZXRkZXYsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK3ZvaWQgc2V0X25pY19yeHJpbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Cit2b2lkIHNldF9uaWNfdHhyaW5nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpydGw4MTgwX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwordm9pZCBydGw4MTgwX2NvbW1pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3ZvaWQgcnRsODE4MF9zdGFydF90eF9iZWFjb24oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVBST0NGUyBTVFVGRi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpydGw4MTgwX3Byb2MgPSBOVUxMOworCitzdGF0aWMgaW50IHByb2NfZ2V0X3JlZ2lzdGVycyhjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsCisJCQkgIG9mZl90IG9mZnNldCwgaW50IGNvdW50LAorCQkJICBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGF0YTsKKy8vCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gKHN0cnVjdCByODE4MF9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCWludCBsZW4gPSAwOworCWludCBpLG47CisKKwlpbnQgbWF4PTB4ZmY7CisKKwkvKiBUaGlzIGR1bXAgdGhlIGN1cnJlbnQgcmVnaXN0ZXIgcGFnZSAqLworCWZvcihuPTA7bjw9bWF4OykKKwl7CisJCS8vcHJpbnRrKCAiXG5EOiAlMng+ICIsIG4pOworCQlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sCisJCQkiXG5EOiAgJTJ4ID4gIixuKTsKKworCQlmb3IoaT0wO2k8MTYgJiYgbjw9bWF4O2krKyxuKyspCisJCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwKKwkJCSIlMnggIixyZWFkX25pY19ieXRlKGRldixuKSk7CisKKwkJLy8JcHJpbnRrKCIlMnggIixyZWFkX25pY19ieXRlKGRldixuKSk7CisJfQorCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwiXG4iKTsKKworCisKKwkqZW9mID0gMTsKKwlyZXR1cm4gbGVuOworCit9CisKK2ludCBnZXRfY3Vycl90eF9mcmVlX2Rlc2Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHByaW9yaXR5KTsKKworc3RhdGljIGludCBwcm9jX2dldF9zdGF0c19odyhjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsCisJCQkgIG9mZl90IG9mZnNldCwgaW50IGNvdW50LAorCQkJICBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKwkvL3N0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkYXRhOworCS8vc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTgwX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOworCisJaW50IGxlbiA9IDA7CisjaWZkZWYgCUNPTkZJR19SVEw4MTg1QgorCisjZWxzZQorCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwKKwkJIk5JQyBpbnQ6ICVsdVxuIgorCQkiVG90YWwgaW50OiAlbHVcbiIKKwkJIi0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iCisJCSJMUCBhdmFpbCBkZXNjICVkXG4iCisJCSJOUCBhdmFpbCBkZXNjICVkXG4iCisJCSItLS0tLS0tLS0tLS0tLS0tLS0tLVxuIgorCQkiTFAgcGh5cyBkbWEgYWRkciAleFxuIgorCQkiTFAgTklDIHB0ciAleFxuIgorCQkiTFAgdmlydCAzMmJhc2UgJXhcbiIKKwkJIkxQIHZpcnQgMzJ0YWlsICV4XG4iCisJCSItLS0tLS0tLS0tLS0tLS0tLS0tLVxuIgorCQkiTlAgcGh5cyBkbWEgYWRkciAleFxuIgorCQkiTlAgTklDIHB0ciAleFxuIgorCQkiTlAgdmlydCAzMmJhc2UgJXhcbiIKKwkJIk5QIHZpcnQgMzJ0YWlsICV4XG4iCisJCSItLS0tLS0tLS0tLS0tLS0tLS0tLVxuIgorCQkiQlAgcGh5cyBkbWEgYWRkciAleFxuIgorCQkiQlAgTklDIHB0ciAleFxuIgorCQkiQlAgdmlydCAzMmJhc2UgJXhcbiIKKwkJIkJQIHZpcnQgMzJ0YWlsICV4XG4iLAorCQlwcml2LT5zdGF0cy5pbnRzLAorCQlwcml2LT5zdGF0cy5zaGludHMsCisJCWdldF9jdXJyX3R4X2ZyZWVfZGVzYyhkZXYsTE9XX1BSSU9SSVRZKSwKKwkJZ2V0X2N1cnJfdHhfZnJlZV9kZXNjKGRldixOT1JNX1BSSU9SSVRZKSwKKwkJKHUzMilwcml2LT50eHZpcHJpbmdkbWEsCisJCXJlYWRfbmljX2R3b3JkKGRldixUTFBEQSksCisJCSh1MzIpcHJpdi0+dHh2aXByaW5nLAorCQkodTMyKXByaXYtPnR4dmlwcmluZ3RhaWwsCisJCSh1MzIpcHJpdi0+dHh2b3ByaW5nZG1hLAorCQlyZWFkX25pY19kd29yZChkZXYsVE5QREEpLAorCQkodTMyKXByaXYtPnR4dm9wcmluZywKKwkJKHUzMilwcml2LT50eHZvcHJpbmd0YWlsLAorCQkodTMyKXByaXYtPnR4YmVhY29ucmluZ2RtYSwKKwkJcmVhZF9uaWNfZHdvcmQoZGV2LFRCREEpLAorCQkodTMyKXByaXYtPnR4YmVhY29ucmluZywKKwkJKHUzMilwcml2LT50eGJlYWNvbnJpbmd0YWlsKTsKKyNlbmRpZgorCSplb2YgPSAxOworCXJldHVybiBsZW47Cit9CisKKworc3RhdGljIGludCBwcm9jX2dldF9zdGF0c19yeChjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsCisJCQkgIG9mZl90IG9mZnNldCwgaW50IGNvdW50LAorCQkJICBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGF0YTsKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxODBfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CisKKwlpbnQgbGVuID0gMDsKKworCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwKKwkvKgkiUlggZGVzY3JpcHRvciBub3QgYXZhaWxhYmxlOiAlbHVcbiIKKwkJIlJYIGluY29tcGxldGUgKG1pc3NpbmcgbGFzdCBkZXNjcmlwdG9yKTogJWx1XG4iCisJCSJSWCBub3QgZGF0YTogJWx1XG4iCisJCS8vIlJYIGRlc2NyaXB0b3IgcG9pbnRlciByZXNldDogJWx1XG4iCisJCSJSWCBkZXNjcmlwdG9yIHBvaW50ZXIgbG9zdDogJWx1XG4iCisJCS8vIlJYIHBvaW50ZXIgd29ya2Fyb3VuZDogJWx1XG4iCisJCSJSWCBlcnJvciBpbnQ6ICVsdVxuIgorCQkiUlggZmlmbyBvdmVyZmxvdzogJWx1XG4iCisJCSJSWCBpbnQ6ICVsdVxuIgorCQkiUlggcGFja2V0OiAlbHVcbiIKKwkJIlJYIGJ5dGVzOiAlbHVcbiIKKwkJIlJYIERNQSBmYWlsOiAlbHVcbiIsCisJCXByaXYtPnN0YXRzLnJ4cmR1LAorCQlwcml2LT5zdGF0cy5yeG5vbGFzdCwKKwkJcHJpdi0+c3RhdHMucnhub2RhdGEsCisJCS8vcHJpdi0+c3RhdHMucnhyZXNldCwKKwkJcHJpdi0+c3RhdHMucnhub3BvaW50ZXIsCisJCS8vcHJpdi0+c3RhdHMucnh3cmthcm91bmQsCisJCXByaXYtPnN0YXRzLnJ4ZXJyLAorCQlwcml2LT5zdGF0cy5yeG92ZXJmbG93LAorCQlwcml2LT5zdGF0cy5yeGludCwKKwkJcHJpdi0+aWVlZTgwMjExLT5zdGF0cy5yeF9wYWNrZXRzLAorCQlwcml2LT5pZWVlODAyMTEtPnN0YXRzLnJ4X2J5dGVzLAorCQlwcml2LT5zdGF0cy5yeGRtYWZhaWwgICovCisJCSJSWCBPSzogJWx1XG4iCisJCSJSWCBSZXRyeTogJWx1XG4iCisJCSJSWCBDUkMgRXJyb3IoMC01MDApOiAlbHVcbiIKKwkJIlJYIENSQyBFcnJvcig1MDAtMTAwMCk6ICVsdVxuIgorCQkiUlggQ1JDIEVycm9yKD4xMDAwKTogJWx1XG4iCisJCSJSWCBJQ1YgRXJyb3I6ICVsdVxuIiwKKwkJcHJpdi0+c3RhdHMucnhpbnQsCisJCXByaXYtPnN0YXRzLnJ4ZXJyLAorCQlwcml2LT5zdGF0cy5yeGNyY2Vycm1pbiwKKwkJcHJpdi0+c3RhdHMucnhjcmNlcnJtaWQsCisJCXByaXYtPnN0YXRzLnJ4Y3JjZXJybWF4LAorCQlwcml2LT5zdGF0cy5yeGljdmVycgorCQkpOworCisJKmVvZiA9IDE7CisJcmV0dXJuIGxlbjsKK30KKworI2lmIDAKK3N0YXRpYyBpbnQgcHJvY19nZXRfc3RhdHNfaWVlZShjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsCisJCQkgIG9mZl90IG9mZnNldCwgaW50IGNvdW50LAorCQkJICBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGF0YTsKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxODBfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CisKKwlpbnQgbGVuID0gMDsKKworCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwKKwkJIlRYZWQgYXNzb2NpYXRpb24gcmVxdWVzdHM6ICV1XG4iCisJCSJUWGVkIGF1dGhlbnRpY2F0aW9uIHJlcXVlc3RzOiAldVxuIgorCQkiUlhlZCBzdWNjZXNzZnVsIGFzc29jaWF0aW9uIHJlc3BvbnNlOiAldVxuIgorCQkiUlhlZCBmYWlsZWQgYXNzb2NpYXRpb24gcmVzcG9uc2U6ICV1XG4iCisJCSJSWGVkIHN1Y2Nlc3NmdWwgYXV0aGVudGljYXRpb24gcmVzcG9uc2U6ICV1XG4iCisJCSJSWGVkIGZhaWxlZCBhdXRoZW50aWNhdGlvbiByZXNwb25zZTogJXVcbiIKKwkJIkFzc29jaWF0aW9uIHJlcXVlc3RzIHdpdGhvdXQgcmVzcG9uc2U6ICV1XG4iCisJCSJBdXRoZW50aWNhdGlvbiByZXF1ZXN0cyB3aXRob3V0IHJlc3BvbnNlOiAldVxuIgorCQkiVFggcHJvYmUgcmVzcG9uc2U6ICV1XG4iCisJCSJSWCBwcm9iZSByZXF1ZXN0OiAldVxuIgorCQkiVFggcHJvYmUgcmVxdWVzdDogJWx1XG4iCisJCSJSWCBhdXRoZW50aWNhdGlvbiByZXF1ZXN0czogJWx1XG4iCisJCSJSWCBhc3NvY2lhdGlvbiByZXF1ZXN0czogJWx1XG4iCisJCSJSZWFzc29jaWF0aW9uczogJWx1XG4iLAorCQlwcml2LT5pZWVlODAyMTEtPmllZWVfc3RhdHMudHhfYXNzLAorCQlwcml2LT5pZWVlODAyMTEtPmllZWVfc3RhdHMudHhfYXV0LAorCQlwcml2LT5pZWVlODAyMTEtPmllZWVfc3RhdHMucnhfYXNzX29rLAorCQlwcml2LT5pZWVlODAyMTEtPmllZWVfc3RhdHMucnhfYXNzX2VyciwKKwkJcHJpdi0+aWVlZTgwMjExLT5pZWVlX3N0YXRzLnJ4X2F1dF9vaywKKwkJcHJpdi0+aWVlZTgwMjExLT5pZWVlX3N0YXRzLnJ4X2F1dF9lcnIsCisJCXByaXYtPmllZWU4MDIxMS0+aWVlZV9zdGF0cy5hc3Nfbm9yZXNwLAorCQlwcml2LT5pZWVlODAyMTEtPmllZWVfc3RhdHMuYXV0X25vcmVzcCwKKwkJcHJpdi0+aWVlZTgwMjExLT5pZWVlX3N0YXRzLnR4X3Byb2JlLAorCQlwcml2LT5pZWVlODAyMTEtPmllZWVfc3RhdHMucnhfcHJvYmUsCisJCXByaXYtPmllZWU4MDIxMS0+aWVlZV9zdGF0cy50eF9wcm9iZV9ycSwKKwkJcHJpdi0+aWVlZTgwMjExLT5pZWVlX3N0YXRzLnJ4X2F1dGhfcnEsCisJCXByaXYtPmllZWU4MDIxMS0+aWVlZV9zdGF0cy5yeF9hc3NvY19ycSwKKwkJcHJpdi0+aWVlZTgwMjExLT5pZWVlX3N0YXRzLnJlYXNzb2MpOworCisJKmVvZiA9IDE7CisJcmV0dXJuIGxlbjsKK30KKyNlbmRpZgorI2lmIDAKK3N0YXRpYyBpbnQgcHJvY19nZXRfc3RhdHNfYXAoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LAorCQkJICBvZmZfdCBvZmZzZXQsIGludCBjb3VudCwKKwkJCSAgaW50ICplb2YsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRhdGE7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTgwX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOworCXN0cnVjdCBtYWNfaHRhYmxlX3QgKmxpc3Q7CisJaW50IGk7CisJaW50IGxlbiA9IDA7CisKKwlpZihwcml2LT5pZWVlODAyMTEtPml3X21vZGUgIT0gSVdfTU9ERV9NQVNURVIpeworCQlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sCisJCSJDYXJkIGlzIG5vdCBhY3RpbmcgYXMgQVAuLi5cbiIKKwkJKTsKKwl9ZWxzZXsKKwkJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLAorCQkiTGlzdCBvZiBhc3NvY2lhdGVkIFNUQTpcbiIKKwkJKTsKKworCQlmb3IoaT0wO2k8TUFDX0hUQUJMRV9FTlRSWTtpKyspCisJCQlmb3IgKGxpc3QgPSBwcml2LT5pZWVlODAyMTEtPmFzc29jX2h0YWJsZVtpXTsgbGlzdCE9TlVMTDsgbGlzdCA9IGxpc3QtPm5leHQpeworCQkJCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwKKwkJCQkJTUFDU1RSIlxuIixNQUMyU1RSKGxpc3QtPmFkcikpOworCQkJfQorCisJfQorCSplb2YgPSAxOworCXJldHVybiBsZW47Cit9CisjZW5kaWYKKworc3RhdGljIGludCBwcm9jX2dldF9zdGF0c190eChjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsCisJCQkgIG9mZl90IG9mZnNldCwgaW50IGNvdW50LAorCQkJICBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGF0YTsKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxODBfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CisKKwlpbnQgbGVuID0gMDsKKwl1bnNpZ25lZCBsb25nIHRvdGFsT0s7CisKKwl0b3RhbE9LPXByaXYtPnN0YXRzLnR4bnBva2ludCtwcml2LT5zdGF0cy50eGhwb2tpbnQrcHJpdi0+c3RhdHMudHhscG9raW50OworCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwKKwkvKgkiVFggbm9ybWFsIHByaW9yaXR5IG9rIGludDogJWx1XG4iCisJCSJUWCBub3JtYWwgcHJpb3JpdHkgZXJyb3IgaW50OiAlbHVcbiIKKwkJIlRYIGhpZ2ggcHJpb3JpdHkgb2sgaW50OiAlbHVcbiIKKwkJIlRYIGhpZ2ggcHJpb3JpdHkgZmFpbGVkIGVycm9yIGludDogJWx1XG4iCisJCSJUWCBsb3cgcHJpb3JpdHkgb2sgaW50OiAlbHVcbiIKKwkJIlRYIGxvdyBwcmlvcml0eSBmYWlsZWQgZXJyb3IgaW50OiAlbHVcbiIKKwkJIlRYIGJ5dGVzOiAlbHVcbiIKKwkJIlRYIHBhY2tldHM6ICVsdVxuIgorCQkiVFggcXVldWUgcmVzdW1lOiAlbHVcbiIKKwkJIlRYIHF1ZXVlIHN0b3BwZWQ/OiAlZFxuIgorCQkiVFggZmlmbyBvdmVyZmxvdzogJWx1XG4iCisJCS8vIlNXIFRYIHN0b3A6ICVsdVxuIgorCQkvLyJTVyBUWCB3YWtlOiAlbHVcbiIKKwkJIlRYIGJlYWNvbjogJWx1XG4iCisJCSJUWCBiZWFjb24gYWJvcnRlZDogJWx1XG4iLAorCQlwcml2LT5zdGF0cy50eG5wb2tpbnQsCisJCXByaXYtPnN0YXRzLnR4bnBlcnIsCisJCXByaXYtPnN0YXRzLnR4aHBva2ludCwKKwkJcHJpdi0+c3RhdHMudHhocGVyciwKKwkJcHJpdi0+c3RhdHMudHhscG9raW50LAorCQlwcml2LT5zdGF0cy50eGxwZXJyLAorCQlwcml2LT5pZWVlODAyMTEtPnN0YXRzLnR4X2J5dGVzLAorCQlwcml2LT5pZWVlODAyMTEtPnN0YXRzLnR4X3BhY2tldHMsCisJCXByaXYtPnN0YXRzLnR4cmVzdW1lZCwKKwkJbmV0aWZfcXVldWVfc3RvcHBlZChkZXYpLAorCQlwcml2LT5zdGF0cy50eG92ZXJmbG93LAorCQkvL3ByaXYtPmllZWU4MDIxMS0+aWVlZV9zdGF0cy5zd3R4c3RvcCwKKwkJLy9wcml2LT5pZWVlODAyMTEtPmllZWVfc3RhdHMuc3d0eGF3YWtlLAorCQlwcml2LT5zdGF0cy50eGJlYWNvbiwKKwkJcHJpdi0+c3RhdHMudHhiZWFjb25lcnIgICovCisJCSJUWCBPSzogJWx1XG4iCisJCSJUWCBFcnJvcjogJWx1XG4iCisJCSJUWCBSZXRyeTogJWx1XG4iCisJCSJUWCBiZWFjb24gT0s6ICVsdVxuIgorCQkiVFggYmVhY29uIGVycm9yOiAlbHVcbiIsCisJCXRvdGFsT0ssCisJCXByaXYtPnN0YXRzLnR4bnBlcnIrcHJpdi0+c3RhdHMudHhocGVycitwcml2LT5zdGF0cy50eGxwZXJyLAorCQlwcml2LT5zdGF0cy50eHJldHJ5LAorCQlwcml2LT5zdGF0cy50eGJlYWNvbiwKKwkJcHJpdi0+c3RhdHMudHhiZWFjb25lcnIKKwkpOworCisJKmVvZiA9IDE7CisJcmV0dXJuIGxlbjsKK30KKworCisjaWYgV0lSRUxFU1NfRVhUIDwgMTcKK3N0YXRpYyBzdHJ1Y3QgaXdfc3RhdGlzdGljcyAqcjgxODBfZ2V0X3dpcmVsZXNzX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgICAgc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCisgICAgICAgcmV0dXJuICZwcml2LT53c3RhdHM7Cit9CisjZW5kaWYKK3ZvaWQgcnRsODE4MF9wcm9jX21vZHVsZV9pbml0KHZvaWQpCit7CisJRE1FU0coIkluaXRpYWxpemluZyBwcm9jIGZpbGVzeXN0ZW0iKTsKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMjQpCisgICAgICAgIHJ0bDgxODBfcHJvYz1jcmVhdGVfcHJvY19lbnRyeShSVEw4MTgwX01PRFVMRV9OQU1FLCBTX0lGRElSLCBwcm9jX25ldCk7CisjZWxzZQorICAgICAgICBydGw4MTgwX3Byb2M9Y3JlYXRlX3Byb2NfZW50cnkoUlRMODE4MF9NT0RVTEVfTkFNRSwgU19JRkRJUiwgaW5pdF9uZXQucHJvY19uZXQpOworI2VuZGlmCit9CisKKwordm9pZCBydGw4MTgwX3Byb2NfbW9kdWxlX3JlbW92ZSh2b2lkKQoreworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwyNCkKKyAgICAgICAgcmVtb3ZlX3Byb2NfZW50cnkoUlRMODE4MF9NT0RVTEVfTkFNRSwgcHJvY19uZXQpOworI2Vsc2UKKyAgICAgICAgcmVtb3ZlX3Byb2NfZW50cnkoUlRMODE4MF9NT0RVTEVfTkFNRSwgaW5pdF9uZXQucHJvY19uZXQpOworI2VuZGlmCit9CisKKwordm9pZCBydGw4MTgwX3Byb2NfcmVtb3ZlX29uZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gKHN0cnVjdCByODE4MF9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlpZiAocHJpdi0+ZGlyX2RldikgeworCQlyZW1vdmVfcHJvY19lbnRyeSgic3RhdHMtaHciLCBwcml2LT5kaXJfZGV2KTsKKwkJcmVtb3ZlX3Byb2NfZW50cnkoInN0YXRzLXR4IiwgcHJpdi0+ZGlyX2Rldik7CisJCXJlbW92ZV9wcm9jX2VudHJ5KCJzdGF0cy1yeCIsIHByaXYtPmRpcl9kZXYpOworLy8JCXJlbW92ZV9wcm9jX2VudHJ5KCJzdGF0cy1pZWVlIiwgcHJpdi0+ZGlyX2Rldik7CisvLwkJcmVtb3ZlX3Byb2NfZW50cnkoInN0YXRzLWFwIiwgcHJpdi0+ZGlyX2Rldik7CisJCXJlbW92ZV9wcm9jX2VudHJ5KCJyZWdpc3RlcnMiLCBwcml2LT5kaXJfZGV2KTsKKwkJcmVtb3ZlX3Byb2NfZW50cnkoZGV2LT5uYW1lLCBydGw4MTgwX3Byb2MpOworCQlwcml2LT5kaXJfZGV2ID0gTlVMTDsKKwl9Cit9CisKKwordm9pZCBydGw4MTgwX3Byb2NfaW5pdF9vbmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmU7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTgwX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOworCXByaXYtPmRpcl9kZXYgPSBjcmVhdGVfcHJvY19lbnRyeShkZXYtPm5hbWUsCisJCQkJCSAgU19JRkRJUiB8IFNfSVJVR08gfCBTX0lYVUdPLAorCQkJCQkgIHJ0bDgxODBfcHJvYyk7CisJaWYgKCFwcml2LT5kaXJfZGV2KSB7CisJCURNRVNHRSgiVW5hYmxlIHRvIGluaXRpYWxpemUgL3Byb2MvbmV0L3J0bDgxODAvJXNcbiIsCisJCSAgICAgIGRldi0+bmFtZSk7CisJCXJldHVybjsKKwl9CisKKwllID0gY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSgic3RhdHMtaHciLCBTX0lGUkVHIHwgU19JUlVHTywKKwkJCQkgICBwcml2LT5kaXJfZGV2LCBwcm9jX2dldF9zdGF0c19odywgZGV2KTsKKworCWlmICghZSkgeworCQlETUVTR0UoIlVuYWJsZSB0byBpbml0aWFsaXplICIKKwkJICAgICAgIi9wcm9jL25ldC9ydGw4MTgwLyVzL3N0YXRzLWh3XG4iLAorCQkgICAgICBkZXYtPm5hbWUpOworCX0KKworCWUgPSBjcmVhdGVfcHJvY19yZWFkX2VudHJ5KCJzdGF0cy1yeCIsIFNfSUZSRUcgfCBTX0lSVUdPLAorCQkJCSAgIHByaXYtPmRpcl9kZXYsIHByb2NfZ2V0X3N0YXRzX3J4LCBkZXYpOworCisJaWYgKCFlKSB7CisJCURNRVNHRSgiVW5hYmxlIHRvIGluaXRpYWxpemUgIgorCQkgICAgICAiL3Byb2MvbmV0L3J0bDgxODAvJXMvc3RhdHMtcnhcbiIsCisJCSAgICAgIGRldi0+bmFtZSk7CisJfQorCisKKwllID0gY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSgic3RhdHMtdHgiLCBTX0lGUkVHIHwgU19JUlVHTywKKwkJCQkgICBwcml2LT5kaXJfZGV2LCBwcm9jX2dldF9zdGF0c190eCwgZGV2KTsKKworCWlmICghZSkgeworCQlETUVTR0UoIlVuYWJsZSB0byBpbml0aWFsaXplICIKKwkJICAgICAgIi9wcm9jL25ldC9ydGw4MTgwLyVzL3N0YXRzLXR4XG4iLAorCQkgICAgICBkZXYtPm5hbWUpOworCX0KKwkjaWYgMAorCWUgPSBjcmVhdGVfcHJvY19yZWFkX2VudHJ5KCJzdGF0cy1pZWVlIiwgU19JRlJFRyB8IFNfSVJVR08sCisJCQkJICAgcHJpdi0+ZGlyX2RldiwgcHJvY19nZXRfc3RhdHNfaWVlZSwgZGV2KTsKKworCWlmICghZSkgeworCQlETUVTR0UoIlVuYWJsZSB0byBpbml0aWFsaXplICIKKwkJICAgICAgIi9wcm9jL25ldC9ydGw4MTgwLyVzL3N0YXRzLWllZWVcbiIsCisJCSAgICAgIGRldi0+bmFtZSk7CisJfQorCSNlbmRpZgorCSNpZiAwCisJZSA9IGNyZWF0ZV9wcm9jX3JlYWRfZW50cnkoInN0YXRzLWFwIiwgU19JRlJFRyB8IFNfSVJVR08sCisJCQkJICAgcHJpdi0+ZGlyX2RldiwgcHJvY19nZXRfc3RhdHNfYXAsIGRldik7CisKKwlpZiAoIWUpIHsKKwkJRE1FU0dFKCJVbmFibGUgdG8gaW5pdGlhbGl6ZSAiCisJCSAgICAgICIvcHJvYy9uZXQvcnRsODE4MC8lcy9zdGF0cy1hcFxuIiwKKwkJICAgICAgZGV2LT5uYW1lKTsKKwl9CisJI2VuZGlmCisKKwllID0gY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSgicmVnaXN0ZXJzIiwgU19JRlJFRyB8IFNfSVJVR08sCisJCQkJICAgcHJpdi0+ZGlyX2RldiwgcHJvY19nZXRfcmVnaXN0ZXJzLCBkZXYpOworCisJaWYgKCFlKSB7CisJCURNRVNHRSgiVW5hYmxlIHRvIGluaXRpYWxpemUgIgorCQkgICAgICAiL3Byb2MvbmV0L3J0bDgxODAvJXMvcmVnaXN0ZXJzXG4iLAorCQkgICAgICBkZXYtPm5hbWUpOworCX0KK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLU1JU0MgU1RVRkYtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgIEZJWE1FOiBjaGVjayBpZiB3ZSBjYW4gdXNlIHNvbWUgc3RhbmRhcmQgYWxyZWFkeS1leGlzdGVudAorICBkYXRhIHR5cGUrZnVuY3Rpb25zIGluIGtlcm5lbAorKi8KKworc2hvcnQgYnVmZmVyX2FkZChzdHJ1Y3QgYnVmZmVyICoqYnVmZmVyLCB1MzIgKmJ1ZiwgZG1hX2FkZHJfdCBkbWEsCisJCXN0cnVjdCBidWZmZXIgKipidWZmZXJoZWFkKQoreworI2lmZGVmIERFQlVHX1JJTkcKKwlETUVTRygiYWRkaW5nIGJ1ZmZlciB0byBUWC9SWCBzdHJ1Y3QiKTsKKyNlbmRpZgorCisgICAgICAgIHN0cnVjdCBidWZmZXIgKnRtcDsKKworCWlmKCEgKmJ1ZmZlcil7CisKKwkJKmJ1ZmZlciA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBidWZmZXIpLEdGUF9LRVJORUwpOworCisJCWlmICgqYnVmZmVyID09IE5VTEwpIHsKKwkJCURNRVNHRSgiRmFpbGVkIHRvIGttYWxsb2MgaGVhZCBvZiBUWC9SWCBzdHJ1Y3QiKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQkoKmJ1ZmZlciktPm5leHQ9KmJ1ZmZlcjsKKwkJKCpidWZmZXIpLT5idWY9YnVmOworCQkoKmJ1ZmZlciktPmRtYT1kbWE7CisJCWlmKGJ1ZmZlcmhlYWQgIT1OVUxMKQorCQkJKCpidWZmZXJoZWFkKSA9ICgqYnVmZmVyKTsKKwkJcmV0dXJuIDA7CisJfQorCXRtcD0qYnVmZmVyOworCisJd2hpbGUodG1wLT5uZXh0IT0oKmJ1ZmZlcikpIHRtcD10bXAtPm5leHQ7CisJaWYgKCh0bXAtPm5leHQ9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBidWZmZXIpLEdGUF9LRVJORUwpKSA9PSBOVUxMKXsKKwkJRE1FU0dFKCJGYWlsZWQgdG8ga21hbGxvYyBUWC9SWCBzdHJ1Y3QiKTsKKwkJcmV0dXJuIC0xOworCX0KKwl0bXAtPm5leHQtPmJ1Zj1idWY7CisJdG1wLT5uZXh0LT5kbWE9ZG1hOworCXRtcC0+bmV4dC0+bmV4dD0qYnVmZmVyOworCisJcmV0dXJuIDA7Cit9CisKKwordm9pZCBidWZmZXJfZnJlZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LHN0cnVjdCBidWZmZXIgKipidWZmZXIsaW50IGxlbixzaG9ydAorY29uc2lzdGVudCkKK3sKKworCXN0cnVjdCBidWZmZXIgKnRtcCwqbmV4dDsKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxODBfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CisJc3RydWN0IHBjaV9kZXYgKnBkZXY9cHJpdi0+cGRldjsKKwkvL2ludCBpOworCisJaWYoISAqYnVmZmVyKSByZXR1cm47CisKKwkvKmZvcih0bXA9KmJ1ZmZlcjsgdG1wLT5uZXh0ICE9ICpidWZmZXI7IHRtcD10bXAtPm5leHQpCisKKwkqLworCXRtcD0qYnVmZmVyOworCWRveworCQluZXh0PXRtcC0+bmV4dDsKKwkJaWYoY29uc2lzdGVudCl7CisJCQlwY2lfZnJlZV9jb25zaXN0ZW50KHBkZXYsbGVuLAorCQkJCSAgICB0bXAtPmJ1Zix0bXAtPmRtYSk7CisJCX1lbHNleworCQkJcGNpX3VubWFwX3NpbmdsZShwZGV2LCB0bXAtPmRtYSwKKwkJCWxlbixQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJa2ZyZWUodG1wLT5idWYpOworCQl9CisJCWtmcmVlKHRtcCk7CisJCXRtcCA9IG5leHQ7CisJfQorCXdoaWxlKG5leHQgIT0gKmJ1ZmZlcik7CisKKwkqYnVmZmVyPU5VTEw7Cit9CisKKwordm9pZCBwcmludF9idWZmZXIodTMyICpidWZmZXIsIGludCBsZW4pCit7CisJaW50IGk7CisJdTggKmJ1ZiA9KHU4KilidWZmZXI7CisKKwlwcmludGsoIkFTQ0lJIEJVRkZFUiBEVU1QIChsZW46ICV4KTpcbiIsbGVuKTsKKworCWZvcihpPTA7aTxsZW47aSsrKQorCQlwcmludGsoIiVjIixidWZbaV0pOworCisJcHJpbnRrKCJcbkJJTkFSWSBCVUZGRVIgRFVNUCAobGVuOiAleCk6XG4iLGxlbik7CisKKwlmb3IoaT0wO2k8bGVuO2krKykKKwkJcHJpbnRrKCIlMDJ4IixidWZbaV0pOworCisJcHJpbnRrKCJcbiIpOworfQorCisKK2ludCBnZXRfY3Vycl90eF9mcmVlX2Rlc2Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHByaW9yaXR5KQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwl1MzIqIHRhaWw7CisJdTMyKiBoZWFkOworCWludCByZXQ7CisKKwlzd2l0Y2ggKHByaW9yaXR5KXsKKwkJY2FzZSBNQU5BR0VfUFJJT1JJVFk6CisJCQloZWFkID0gcHJpdi0+dHhtYXByaW5naGVhZDsKKwkJCXRhaWwgPSBwcml2LT50eG1hcHJpbmd0YWlsOworCQkJYnJlYWs7CisJCWNhc2UgQktfUFJJT1JJVFk6CisJCQloZWFkID0gcHJpdi0+dHhia3ByaW5naGVhZDsKKwkJCXRhaWwgPSBwcml2LT50eGJrcHJpbmd0YWlsOworCQkJYnJlYWs7CisJCWNhc2UgQkVfUFJJT1JJVFk6CisJCQloZWFkID0gcHJpdi0+dHhiZXByaW5naGVhZDsKKwkJCXRhaWwgPSBwcml2LT50eGJlcHJpbmd0YWlsOworCQkJYnJlYWs7CisJCWNhc2UgVklfUFJJT1JJVFk6CisJCQloZWFkID0gcHJpdi0+dHh2aXByaW5naGVhZDsKKwkJCXRhaWwgPSBwcml2LT50eHZpcHJpbmd0YWlsOworCQkJYnJlYWs7CisJCWNhc2UgVk9fUFJJT1JJVFk6CisJCQloZWFkID0gcHJpdi0+dHh2b3ByaW5naGVhZDsKKwkJCXRhaWwgPSBwcml2LT50eHZvcHJpbmd0YWlsOworCQkJYnJlYWs7CisJCWNhc2UgSElfUFJJT1JJVFk6CisJCQloZWFkID0gcHJpdi0+dHhocHJpbmdoZWFkOworCQkJdGFpbCA9IHByaXYtPnR4aHByaW5ndGFpbDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC0xOworCX0KKworCS8vRE1FU0coIiV4ICV4IiwgaGVhZCwgdGFpbCk7CisKKwkvKiBGSVhNRSBGSVhNRSBGSVhNRSBGSVhNRSAqLworCisjaWYgMAorCWlmKCBoZWFkIDw9IHRhaWwgKSByZXR1cm4gcHJpdi0+dHhyaW5nY291bnQtMSAtICh0YWlsIC0gaGVhZCkvODsKKwlyZXR1cm4gKGhlYWQgLSB0YWlsKS84LzQ7CisjZWxzZQorCWlmKCBoZWFkIDw9IHRhaWwgKQorCQlyZXQgPSBwcml2LT50eHJpbmdjb3VudCAtICh0YWlsIC0gaGVhZCkvODsKKwllbHNlCisJCXJldCA9IChoZWFkIC0gdGFpbCkvODsKKworCWlmKHJldCA+IHByaXYtPnR4cmluZ2NvdW50ICkgRE1FU0coIkJVRyIpOworCXJldHVybiByZXQ7CisjZW5kaWYKK30KKworCitzaG9ydCBjaGVja19uaWNfZW5vdWdodF9kZXNjKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwcmlvcml0eSkKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUgPSBuZXRkZXZfcHJpdihkZXYpOworCisJaW50IHJlcXVpcmVkYnl0ZSwgcmVxdWlyZWQ7CisJcmVxdWlyZWRieXRlID0gcHJpdi0+aWVlZTgwMjExLT5mdHMgKyBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9oZWFkZXJfZGF0YSk7CisKKwlpZihpZWVlLT5jdXJyZW50X25ldHdvcmsuUW9TX0VuYWJsZSkgeworCQlyZXF1aXJlZGJ5dGUgKz0gMjsKKwl9OworCisJcmVxdWlyZWQgPSByZXF1aXJlZGJ5dGUgLyAocHJpdi0+dHhidWZmc2l6ZS00KTsKKwlpZiAocmVxdWlyZWRieXRlICUgcHJpdi0+dHhidWZmc2l6ZSkgcmVxdWlyZWQrKzsKKwkvKiBmb3Igbm93IHdlIGtlZXAgdHdvIGZyZWUgZGVzY3JpcHRvciBhcyBhIHNhZmV0eSBib3VuZGFyeQorCSAqIGJldHdlZW4gdGhlIHRhaWwgYW5kIHRoZSBoZWFkCisJICovCisKKwlyZXR1cm4gKHJlcXVpcmVkKzIgPCBnZXRfY3Vycl90eF9mcmVlX2Rlc2MoZGV2LHByaW9yaXR5KSk7Cit9CisKKworLyogVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGZvciBkZWJ1Z2luZyBwdXJwb3NlICovCit2b2lkIGNoZWNrX3R4X3Jpbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHByaSkKK3sKKwlzdGF0aWMgaW50IG1heGxvZyA9MzsKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxODBfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CisJdTMyKiB0bXA7CisJc3RydWN0IGJ1ZmZlciAqYnVmOworCWludCBpOworCWludCBuaWM7CisJdTMyKiB0YWlsOworCXUzMiogaGVhZDsKKwl1MzIqIGJlZ2luOworCXUzMiBuaWNiZWdpbjsKKwlzdHJ1Y3QgYnVmZmVyKiBidWZmZXI7CisKKwltYXhsb2cgLS07CisJaWYgKG1heGxvZyA8MCApIHJldHVybjsKKworCXN3aXRjaChwcmkpIHsKKwljYXNlIE1BTkFHRV9QUklPUklUWToKKwkJdGFpbCA9IHByaXYtPnR4bWFwcmluZ3RhaWw7CisJCWJlZ2luID0gcHJpdi0+dHhtYXByaW5nOworCQloZWFkID0gcHJpdi0+dHhtYXByaW5naGVhZDsKKwkJbmljID0gcmVhZF9uaWNfZHdvcmQoZGV2LFRYX01BTkFHRVBSSU9SSVRZX1JJTkdfQUREUik7CisJCWJ1ZmZlciA9IHByaXYtPnR4bWFwYnVmczsKKwkJbmljYmVnaW4gPSBwcml2LT50eG1hcHJpbmdkbWE7CisJCWJyZWFrOworCisKKwljYXNlIEJLX1BSSU9SSVRZOgorCQl0YWlsID0gcHJpdi0+dHhia3ByaW5ndGFpbDsKKwkJYmVnaW4gPSBwcml2LT50eGJrcHJpbmc7CisJCWhlYWQgPSBwcml2LT50eGJrcHJpbmdoZWFkOworCQluaWMgPSByZWFkX25pY19kd29yZChkZXYsVFhfQktQUklPUklUWV9SSU5HX0FERFIpOworCQlidWZmZXIgPSBwcml2LT50eGJrcGJ1ZnM7CisJCW5pY2JlZ2luID0gcHJpdi0+dHhia3ByaW5nZG1hOworCQlicmVhazsKKworCWNhc2UgQkVfUFJJT1JJVFk6CisJCXRhaWwgPSBwcml2LT50eGJlcHJpbmd0YWlsOworCQliZWdpbiA9IHByaXYtPnR4YmVwcmluZzsKKwkJaGVhZCA9IHByaXYtPnR4YmVwcmluZ2hlYWQ7CisJCW5pYyA9IHJlYWRfbmljX2R3b3JkKGRldixUWF9CRVBSSU9SSVRZX1JJTkdfQUREUik7CisJCWJ1ZmZlciA9IHByaXYtPnR4YmVwYnVmczsKKwkJbmljYmVnaW4gPSBwcml2LT50eGJlcHJpbmdkbWE7CisJCWJyZWFrOworCisJY2FzZSBWSV9QUklPUklUWToKKwkJdGFpbCA9IHByaXYtPnR4dmlwcmluZ3RhaWw7CisJCWJlZ2luID0gcHJpdi0+dHh2aXByaW5nOworCQloZWFkID0gcHJpdi0+dHh2aXByaW5naGVhZDsKKwkJbmljID0gcmVhZF9uaWNfZHdvcmQoZGV2LFRYX1ZJUFJJT1JJVFlfUklOR19BRERSKTsKKwkJYnVmZmVyID0gcHJpdi0+dHh2aXBidWZzOworCQluaWNiZWdpbiA9IHByaXYtPnR4dmlwcmluZ2RtYTsKKwkJYnJlYWs7CisKKworCWNhc2UgVk9fUFJJT1JJVFk6CisJCXRhaWwgPSBwcml2LT50eHZvcHJpbmd0YWlsOworCQliZWdpbiA9IHByaXYtPnR4dm9wcmluZzsKKwkJaGVhZCA9IHByaXYtPnR4dm9wcmluZ2hlYWQ7CisJCW5pYyA9IHJlYWRfbmljX2R3b3JkKGRldixUWF9WT1BSSU9SSVRZX1JJTkdfQUREUik7CisJCWJ1ZmZlciA9IHByaXYtPnR4dm9wYnVmczsKKwkJbmljYmVnaW4gPSBwcml2LT50eHZvcHJpbmdkbWE7CisJCWJyZWFrOworCisJY2FzZSBISV9QUklPUklUWToKKwkJdGFpbCA9IHByaXYtPnR4aHByaW5ndGFpbDsKKwkJYmVnaW4gPSBwcml2LT50eGhwcmluZzsKKwkJaGVhZCA9IHByaXYtPnR4aHByaW5naGVhZDsKKwkJbmljID0gcmVhZF9uaWNfZHdvcmQoZGV2LFRYX0hJR0hQUklPUklUWV9SSU5HX0FERFIpOworCQlidWZmZXIgPSBwcml2LT50eGhwYnVmczsKKwkJbmljYmVnaW4gPSBwcml2LT50eGhwcmluZ2RtYTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gOworCQlicmVhazsKKwl9CisKKwlpZighcHJpdi0+dHh2b3BidWZzKQorCQlETUVTR0UgKCJOSUMgVFggYWNrLCBidXQgVFggcXVldWUgY29ycnVwdGVkISIpOworCWVsc2V7CisKKwkJZm9yKGk9MCxidWY9YnVmZmVyLCB0bXA9YmVnaW47CisJCQl0bXA8YmVnaW4rKHByaXYtPnR4cmluZ2NvdW50KSo4OworCQkJdG1wKz04LGJ1Zj1idWYtPm5leHQsaSsrKQorCisJCQlETUVTRygiQlVGJWQgJXMgJXggJXMuIE5leHQgOiAleCIsaSwKKwkJCSAgICAgICp0bXAgJiAoMTw8MzEpID8gImZpbGxlZCIgOiAiZW1wdHkiLAorCQkJICAgICAgKihidWYtPmJ1ZiksCisJCQkgICAgICAqdG1wICYgKDE8PDE1KT8gIm9rIjogImVyciIsICoodG1wKzQpKTsKKwl9CisKKwlETUVTRygibmljIGF0ICVkIiwKKwkJKG5pYy1uaWNiZWdpbikgLyA4IC80KTsKKwlETUVTRygidGFpbCBhdCAlZCIsICgoaW50KXRhaWwgLSAoaW50KWJlZ2luKSAvOCAvNCk7CisJRE1FU0coImhlYWQgYXQgJWQiLCAoKGludCloZWFkIC0gKGludCliZWdpbikgLzggLzQpOworCURNRVNHKCJjaGVjayBmcmVlIGRlc2MgcmV0dXJucyAlZCIsIGNoZWNrX25pY19lbm91Z2h0X2Rlc2MoZGV2LHByaSkpOworCURNRVNHKCJmcmVlIGRlc2MgaXMgJWRcbiIsIGdldF9jdXJyX3R4X2ZyZWVfZGVzYyhkZXYscHJpKSk7CisJLy9ydGw4MTgwX3Jlc2V0KGRldik7CisJcmV0dXJuOworfQorCisKKworLyogdGhpcyBmdW5jdGlvbiBpcyBvbmx5IGZvciBkZWJ1Z2dpbmcgcHVycG9zZSAqLwordm9pZCBjaGVja19yeGJ1ZihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gKHN0cnVjdCByODE4MF9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsKKwl1MzIqIHRtcDsKKwlzdHJ1Y3QgYnVmZmVyICpidWY7CisJdTggcnhfZGVzY19zaXplOworCisjaWZkZWYgQ09ORklHX1JUTDgxODVCCisJcnhfZGVzY19zaXplID0gODsKKyNlbHNlCisJcnhfZGVzY19zaXplID0gNDsKKyNlbmRpZgorCisJaWYoIXByaXYtPnJ4YnVmZmVyKQorCQlETUVTR0UgKCJOSUMgUlggYWNrLCBidXQgUlggcXVldWUgY29ycnVwdGVkISIpOworCisJZWxzZXsKKworCQlmb3IoYnVmPXByaXYtPnJ4YnVmZmVyLCB0bXA9cHJpdi0+cnhyaW5nOworCQkgICAgdG1wIDwgcHJpdi0+cnhyaW5nKyhwcml2LT5yeHJpbmdjb3VudCkqcnhfZGVzY19zaXplOworCQkgICAgdG1wKz1yeF9kZXNjX3NpemUsIGJ1Zj1idWYtPm5leHQpCisKKwkJCURNRVNHKCJCVUYgJXMgJXgiLAorCQkJICAgICAgKnRtcCAmICgxPDwzMSkgPyAiZW1wdHkiIDogImZpbGxlZCIsCisJCQkgICAgICAqKGJ1Zi0+YnVmKSk7CisJfQorCisJcmV0dXJuOworfQorCisKK3ZvaWQgZHVtcF9lcHJvbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCBpOworCWZvcihpPTA7IGk8NjM7IGkrKykKKwkJRE1FU0coIkVFUFJPTSBhZGRyICV4IDogJXgiLCBpLCBlcHJvbV9yZWFkKGRldixpKSk7Cit9CisKKwordm9pZCBydGw4MTgwX2R1bXBfcmVnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaW50IGk7CisJaW50IG47CisJaW50IG1heD0weGZmOworCisJRE1FU0coIkR1bXBpbmcgTklDIHJlZ2lzdGVyIG1hcCIpOworCisJZm9yKG49MDtuPD1tYXg7KQorCXsKKwkJcHJpbnRrKCAiXG5EOiAlMng+ICIsIG4pOworCQlmb3IoaT0wO2k8MTYgJiYgbjw9bWF4O2krKyxuKyspCisJCQlwcmludGsoIiUyeCAiLHJlYWRfbmljX2J5dGUoZGV2LG4pKTsKKwl9CisJcHJpbnRrKCJcbiIpOworfQorCisKK3ZvaWQgZml4X3R4X2ZpZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxODBfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CisJdTMyICp0bXA7CisJaW50IGk7CisjaWZkZWYgREVCVUdfVFhfQUxMT0MKKwlETUVTRygiRklYSU5HIFRYIEZJRk9zIik7CisjZW5kaWYKKwlmb3IgKHRtcD1wcml2LT50eG1hcHJpbmcsIGk9MDsKKwkgICAgIGkgPCBwcml2LT50eHJpbmdjb3VudDsKKwkgICAgIHRtcCs9OCwgaSsrKXsKKwkJKnRtcCA9ICp0bXAgJn4gKDE8PDMxKTsKKwl9CisKKwlmb3IgKHRtcD1wcml2LT50eGJrcHJpbmcsIGk9MDsKKwkgICAgIGkgPCBwcml2LT50eHJpbmdjb3VudDsKKwkgICAgIHRtcCs9OCwgaSsrKSB7CisJCSp0bXAgPSAqdG1wICZ+ICgxPDwzMSk7CisJfQorCisJZm9yICh0bXA9cHJpdi0+dHhiZXByaW5nLCBpPTA7CisJICAgICBpIDwgcHJpdi0+dHhyaW5nY291bnQ7CisJICAgICB0bXArPTgsIGkrKyl7CisJCSp0bXAgPSAqdG1wICZ+ICgxPDwzMSk7CisJfQorCWZvciAodG1wPXByaXYtPnR4dmlwcmluZywgaT0wOworCSAgICAgaSA8IHByaXYtPnR4cmluZ2NvdW50OworCSAgICAgdG1wKz04LCBpKyspIHsKKwkJKnRtcCA9ICp0bXAgJn4gKDE8PDMxKTsKKwl9CisKKwlmb3IgKHRtcD1wcml2LT50eHZvcHJpbmcsIGk9MDsKKwkgICAgIGkgPCBwcml2LT50eHJpbmdjb3VudDsKKwkgICAgIHRtcCs9OCwgaSsrKXsKKwkJKnRtcCA9ICp0bXAgJn4gKDE8PDMxKTsKKwl9CisKKwlmb3IgKHRtcD1wcml2LT50eGhwcmluZywgaT0wOworCSAgICAgaSA8IHByaXYtPnR4cmluZ2NvdW50OworCSAgICAgdG1wKz04LGkrKyl7CisJCSp0bXAgPSAqdG1wICZ+ICgxPDwzMSk7CisJfQorCisJZm9yICh0bXA9cHJpdi0+dHhiZWFjb25yaW5nLCBpPTA7CisJICAgICBpIDwgcHJpdi0+dHhiZWFjb25jb3VudDsKKwkgICAgIHRtcCs9OCwgaSsrKXsKKwkJKnRtcCA9ICp0bXAgJn4gKDE8PDMxKTsKKwl9CisjaWZkZWYgREVCVUdfVFhfQUxMT0MKKwlETUVTRygiVFggRklGT3MgRklYRUQiKTsKKyNlbmRpZgorCXByaXYtPnR4bWFwcmluZ3RhaWwgPSBwcml2LT50eG1hcHJpbmc7CisJcHJpdi0+dHhtYXByaW5naGVhZCA9IHByaXYtPnR4bWFwcmluZzsKKwlwcml2LT50eG1hcGJ1ZnN0YWlsID0gcHJpdi0+dHhtYXBidWZzOworCisJcHJpdi0+dHhia3ByaW5ndGFpbCA9IHByaXYtPnR4YmtwcmluZzsKKwlwcml2LT50eGJrcHJpbmdoZWFkID0gcHJpdi0+dHhia3ByaW5nOworCXByaXYtPnR4YmtwYnVmc3RhaWwgPSBwcml2LT50eGJrcGJ1ZnM7CisKKwlwcml2LT50eGJlcHJpbmd0YWlsID0gcHJpdi0+dHhiZXByaW5nOworCXByaXYtPnR4YmVwcmluZ2hlYWQgPSBwcml2LT50eGJlcHJpbmc7CisJcHJpdi0+dHhiZXBidWZzdGFpbCA9IHByaXYtPnR4YmVwYnVmczsKKworCXByaXYtPnR4dmlwcmluZ3RhaWwgPSBwcml2LT50eHZpcHJpbmc7CisJcHJpdi0+dHh2aXByaW5naGVhZCA9IHByaXYtPnR4dmlwcmluZzsKKwlwcml2LT50eHZpcGJ1ZnN0YWlsID0gcHJpdi0+dHh2aXBidWZzOworCisJcHJpdi0+dHh2b3ByaW5ndGFpbCA9IHByaXYtPnR4dm9wcmluZzsKKwlwcml2LT50eHZvcHJpbmdoZWFkID0gcHJpdi0+dHh2b3ByaW5nOworCXByaXYtPnR4dm9wYnVmc3RhaWwgPSBwcml2LT50eHZvcGJ1ZnM7CisKKwlwcml2LT50eGhwcmluZ3RhaWwgPSBwcml2LT50eGhwcmluZzsKKwlwcml2LT50eGhwcmluZ2hlYWQgPSBwcml2LT50eGhwcmluZzsKKwlwcml2LT50eGhwYnVmc3RhaWwgPSBwcml2LT50eGhwYnVmczsKKworCXByaXYtPnR4YmVhY29ucmluZ3RhaWwgPSBwcml2LT50eGJlYWNvbnJpbmc7CisJcHJpdi0+dHhiZWFjb25idWZzdGFpbCA9IHByaXYtPnR4YmVhY29uYnVmczsKKwlzZXRfbmljX3R4cmluZyhkZXYpOworCisJaWVlZTgwMjExX3Jlc2V0X3F1ZXVlKHByaXYtPmllZWU4MDIxMSk7CisJcHJpdi0+YWNrX3R4X3RvX2llZWUgPSAwOworfQorCisKK3ZvaWQgZml4X3J4X2ZpZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxODBfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CisJdTMyICp0bXA7CisJc3RydWN0IGJ1ZmZlciAqcnhidWY7CisJdTggcnhfZGVzY19zaXplOworCisjaWZkZWYgQ09ORklHX1JUTDgxODVCCisJcnhfZGVzY19zaXplID0gODsgLy8gNCo4ID0gMzIgYnl0ZXMKKyNlbHNlCisJcnhfZGVzY19zaXplID0gNDsKKyNlbmRpZgorCisjaWZkZWYgREVCVUdfUlhBTExPQworCURNRVNHKCJGSVhJTkcgUlggRklGTyIpOworCWNoZWNrX3J4YnVmKGRldik7CisjZW5kaWYKKworCWZvciAodG1wPXByaXYtPnJ4cmluZywgcnhidWY9cHJpdi0+cnhidWZmZXJoZWFkOworCSAgICAgKHRtcCA8IChwcml2LT5yeHJpbmcpKyhwcml2LT5yeHJpbmdjb3VudCkqcnhfZGVzY19zaXplKTsKKwkgICAgIHRtcCs9cnhfZGVzY19zaXplLHJ4YnVmPXJ4YnVmLT5uZXh0KXsKKwkJKih0bXArMikgPSByeGJ1Zi0+ZG1hOworCQkqdG1wPSp0bXAgJn4gMHhmZmY7CisJCSp0bXA9KnRtcCB8IHByaXYtPnJ4YnVmZmVyc2l6ZTsKKwkJKnRtcCB8PSAoMTw8MzEpOworCX0KKworI2lmZGVmIERFQlVHX1JYQUxMT0MKKwlETUVTRygiUlggRklGTyBGSVhFRCIpOworCWNoZWNrX3J4YnVmKGRldik7CisjZW5kaWYKKworCXByaXYtPnJ4cmluZ3RhaWw9cHJpdi0+cnhyaW5nOworCXByaXYtPnJ4YnVmZmVyPXByaXYtPnJ4YnVmZmVyaGVhZDsKKwlwcml2LT5yeF9za2JfY29tcGxldGU9MTsKKwlzZXRfbmljX3J4cmluZyhkZXYpOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1IVyBTVFVGRi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3Vuc2lnbmVkIGNoYXIgUVVBTElUWV9NQVBbXSA9IHsKKyAgMHg2NCwgMHg2NCwgMHg2NCwgMHg2MywgMHg2MywgMHg2MiwgMHg2MiwgMHg2MSwKKyAgMHg2MSwgMHg2MCwgMHg2MCwgMHg1ZiwgMHg1ZiwgMHg1ZSwgMHg1ZCwgMHg1YywKKyAgMHg1YiwgMHg1YSwgMHg1OSwgMHg1NywgMHg1NiwgMHg1NCwgMHg1MiwgMHg0ZiwKKyAgMHg0YywgMHg0OSwgMHg0NSwgMHg0MSwgMHgzYywgMHgzNywgMHgzMSwgMHgyOSwKKyAgMHgyNCwgMHgyMiwgMHgyMiwgMHgyMiwgMHgyMiwgMHgyMiwgMHgyMiwgMHgyMiwKKyAgMHgyMiwgMHgyMiwgMHgyMSwgMHgyMSwgMHgyMSwgMHgyMSwgMHgyMSwgMHgyMCwKKyAgMHgyMCwgMHgyMCwgMHgyMCwgMHgxZiwgMHgxZiwgMHgxZSwgMHgxZSwgMHgxZSwKKyAgMHgxZCwgMHgxZCwgMHgxYywgMHgxYywgMHgxYiwgMHgxYSwgMHgxOSwgMHgxOSwKKyAgMHgxOCwgMHgxNywgMHgxNiwgMHgxNSwgMHgxNCwgMHgxMiwgMHgxMSwgMHgwZiwKKyAgMHgwZSwgMHgwYywgMHgwYSwgMHgwOCwgMHgwNiwgMHgwNCwgMHgwMSwgMHgwMAorfTsKKwordW5zaWduZWQgY2hhciBTVFJFTkdUSF9NQVBbXSA9IHsKKyAgMHg2NCwgMHg2NCwgMHg2MywgMHg2MiwgMHg2MSwgMHg2MCwgMHg1ZiwgMHg1ZSwKKyAgMHg1ZCwgMHg1YywgMHg1YiwgMHg1YSwgMHg1NywgMHg1NCwgMHg1MiwgMHg1MCwKKyAgMHg0ZSwgMHg0YywgMHg0YSwgMHg0OCwgMHg0NiwgMHg0NCwgMHg0MSwgMHgzZiwKKyAgMHgzYywgMHgzYSwgMHgzNywgMHgzNiwgMHgzNiwgMHgxYywgMHgxYywgMHgxYiwKKyAgMHgxYiwgMHgxYSwgMHgxYSwgMHgxOSwgMHgxOSwgMHgxOCwgMHgxOCwgMHgxNywKKyAgMHgxNywgMHgxNiwgMHgxNiwgMHgxNSwgMHgxNSwgMHgxNCwgMHgxNCwgMHgxMywKKyAgMHgxMywgMHgxMiwgMHgxMiwgMHgxMSwgMHgxMSwgMHgxMCwgMHgxMCwgMHgwZiwKKyAgMHgwZiwgMHgwZSwgMHgwZSwgMHgwZCwgMHgwZCwgMHgwYywgMHgwYywgMHgwYiwKKyAgMHgwYiwgMHgwYSwgMHgwYSwgMHgwOSwgMHgwOSwgMHgwOCwgMHgwOCwgMHgwNywKKyAgMHgwNywgMHgwNiwgMHgwNiwgMHgwNSwgMHgwNCwgMHgwMywgMHgwMiwgMHgwMAorfTsKKwordm9pZCBydGw4MTgwX1JTU0lfY2FsYyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCAqcnNzaSwgdTggKnF1YWwpeworCS8vdm9pZCBNbG1lX1VwZGF0ZVJzc2lTUShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCAqcnNzaSwgdTggKnF1YWwpeworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gKHN0cnVjdCByODE4MF9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsKKwl1MzIgdGVtcDsKKwl1MzIgdGVtcDI7CisJdTMyIHRlbXAzOworCXUzMiBsc2I7CisJdTMyIHE7CisJdTMyIG9yaWdfcXVhbDsKKwl1OCAgX3Jzc2k7CisKKwlxID0gKnF1YWw7CisJb3JpZ19xdWFsID0gKnF1YWw7CisJX3Jzc2kgPSAwOyAvLyBhdm9pZCBnY2MgY29tcGxhaW5zLi4KKworCWlmIChxIDw9IDB4NGUpIHsKKwkJdGVtcCA9IFFVQUxJVFlfTUFQW3FdOworCX0gZWxzZSB7CisJCWlmKCBxICYgMHg4MCApIHsKKwkJCXRlbXAgPSAweDMyOworCQl9IGVsc2UgeworCQkJdGVtcCA9IDE7CisJCX0KKwl9CisKKwkqcXVhbCA9IHRlbXA7CisJdGVtcDIgPSAqcnNzaTsKKworCXN3aXRjaChwcml2LT5yZl9jaGlwKXsKKwljYXNlIFJGQ0hJUElEX1JGTUQ6CisJCWxzYiA9IHRlbXAyICYgMTsKKwkJdGVtcDIgJj0gMHg3ZTsKKwkJaWYgKCAhbHNiIHx8ICEodGVtcDIgPD0gMHgzYykgKSB7CisJCQl0ZW1wMiA9IDB4NjQ7CisJCX0gZWxzZSB7CisJCQl0ZW1wMiA9IDEwMCAqIHRlbXAyIC8gMHgzYzsKKwkJfQorCQkqcnNzaSA9IHRlbXAyICYgMHhmZjsKKwkJX3Jzc2kgPSB0ZW1wMiAmIDB4ZmY7CisJCWJyZWFrOworCWNhc2UgUkZDSElQSURfSU5URVJTSUw6CisJCWxzYiA9IHRlbXAyOworCQl0ZW1wMiAmPSAweGZmZmZmZmZlOworCQl0ZW1wMiAqPSAyNTE7CisJCXRlbXAzID0gdGVtcDI7CisJCXRlbXAyIDw8PSA2OworCQl0ZW1wMyArPSB0ZW1wMjsKKwkJdGVtcDMgPDw9IDE7CisJCXRlbXAyID0gMHg0OTUwZGY7CisJCXRlbXAyIC09IHRlbXAzOworCQlsc2IgJj0gMTsKKwkJaWYgKCB0ZW1wMiA8PSAweDNlMDAwMCApIHsKKwkJCWlmICggdGVtcDIgPCAweGZmZWYwMDAwICkKKwkJCQl0ZW1wMiA9IDB4ZmZlZjAwMDA7CisJCX0gZWxzZSB7CisJCQl0ZW1wMiA9IDB4M2UwMDAwOworCQl9CisJCWlmICggIWxzYiApIHsKKwkJCXRlbXAyIC09IDB4ZjAwMDA7CisJCX0gZWxzZSB7CisJCQl0ZW1wMiArPSAweGYwMDAwOworCQl9CisKKwkJdGVtcDMgPSAweDRkMDAwMDsKKwkJdGVtcDMgLT0gdGVtcDI7CisJCXRlbXAzICo9IDEwMDsKKwkJdGVtcDMgPSB0ZW1wMyAvIDB4NmQ7CisJCXRlbXAzID4+PSAweDEwOworCQlfcnNzaSA9IHRlbXAzICYgMHhmZjsKKwkJKnJzc2kgPSB0ZW1wMyAmIDB4ZmY7CisJCWJyZWFrOworCWNhc2UgUkZDSElQSURfR0NUOgorCSAgICAgICAgbHNiID0gdGVtcDIgJiAxOworCQl0ZW1wMiAmPSAweDdlOworCQlpZiAoICEgbHNiIHx8ICEodGVtcDIgPD0gMHgzYykgKXsKKwkJCXRlbXAyID0gMHg2NDsKKwkJfSBlbHNlIHsKKwkJCXRlbXAyID0gKDEwMCAqIHRlbXAyKSAvIDB4M2M7CisJCX0KKwkJKnJzc2kgPSB0ZW1wMiAmIDB4ZmY7CisJCV9yc3NpID0gdGVtcDIgJiAweGZmOworCQlicmVhazsKKwljYXNlIFJGQ0hJUElEX1BISUxJUFM6CisJCWlmKCBvcmlnX3F1YWwgPD0gMHg0ZSApeworCQkJX3Jzc2kgPSBTVFJFTkdUSF9NQVBbb3JpZ19xdWFsXTsKKwkJCSpyc3NpID0gX3Jzc2k7CisJCX0gZWxzZSB7CisJCQlvcmlnX3F1YWwgLT0gMHg4MDsKKwkJCWlmICggIW9yaWdfcXVhbCApeworCQkJCV9yc3NpID0gMTsKKwkJCQkqcnNzaSA9IDE7CisJCQl9IGVsc2UgeworCQkJCV9yc3NpID0gMHgzMjsKKwkJCQkqcnNzaSA9IDB4MzI7CisJCQl9CisJCX0KKwkJYnJlYWs7CisKKwkvKiBjYXNlIDQgKi8KKwljYXNlIFJGQ0hJUElEX01BWElNOgorCQlsc2IgPSB0ZW1wMiAmIDE7CisJCXRlbXAyICY9IDB4N2U7CisJCXRlbXAyID4+PSAxOworCQl0ZW1wMiArPSAweDQyOworCQlpZiggbHNiICE9IDAgKXsKKwkJCXRlbXAyICs9IDB4YTsKKwkJfQorCQkqcnNzaSA9IHRlbXAyICYgMHhmZjsKKwkJX3Jzc2kgPSB0ZW1wMiAmIDB4ZmY7CisJCWJyZWFrOworCX0KKworCWlmICggX3Jzc2kgPCAweDY0ICl7CisJCWlmICggX3Jzc2kgPT0gMCApIHsKKwkJCSpyc3NpID0gMTsKKwkJfQorCX0gZWxzZSB7CisJCSpyc3NpID0gMHg2NDsKKwl9CisKKwlyZXR1cm47Cit9CisKKwordm9pZCBydGw4MTgwX2lycV9lbmFibGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxODBfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CisJcHJpdi0+aXJxX2VuYWJsZWQgPSAxOworLyoKKwl3cml0ZV9uaWNfd29yZChkZXYsSU5UQV9NQVNLLElOVEFfUlhPSyB8IElOVEFfUlhERVNDRVJSIHwgSU5UQV9SWE9WRVJGTE9XIHxcCisJSU5UQV9UWE9WRVJGTE9XIHwgSU5UQV9ISVBSSU9SSVRZREVTQ0VSUiB8IElOVEFfSElQUklPUklUWURFU0NPSyB8XAorCUlOVEFfTk9STVBSSU9SSVRZREVTQ0VSUiB8IElOVEFfTk9STVBSSU9SSVRZREVTQ09LIHxcCisJSU5UQV9MT1dQUklPUklUWURFU0NFUlIgfCBJTlRBX0xPV1BSSU9SSVRZREVTQ09LIHwgSU5UQV9USU1FT1VUKTsKKyovCisJd3JpdGVfbmljX3dvcmQoZGV2LElOVEFfTUFTSywgcHJpdi0+aXJxX21hc2spOworfQorCisKK3ZvaWQgcnRsODE4MF9pcnFfZGlzYWJsZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gKHN0cnVjdCByODE4MF9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsKKworI2lmZGVmIENPTkZJR19SVEw4MTg1QgorCXdyaXRlX25pY19kd29yZChkZXYsSU1SLDApOworI2Vsc2UKKwl3cml0ZV9uaWNfd29yZChkZXYsSU5UQV9NQVNLLDApOworI2VuZGlmCisJZm9yY2VfcGNpX3Bvc3RpbmcoZGV2KTsKKwlwcml2LT5pcnFfZW5hYmxlZCA9IDA7Cit9CisKKwordm9pZCBydGw4MTgwX3NldF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsaW50IG1vZGUpCit7CisJdTggZWNtZDsKKwllY21kPXJlYWRfbmljX2J5dGUoZGV2LCBFUFJPTV9DTUQpOworCWVjbWQ9ZWNtZCAmfiBFUFJPTV9DTURfT1BFUkFUSU5HX01PREVfTUFTSzsKKwllY21kPWVjbWQgfCAobW9kZTw8RVBST01fQ01EX09QRVJBVElOR19NT0RFX1NISUZUKTsKKwllY21kPWVjbWQgJn4gKDE8PEVQUk9NX0NTX1NISUZUKTsKKwllY21kPWVjbWQgJn4gKDE8PEVQUk9NX0NLX1NISUZUKTsKKwl3cml0ZV9uaWNfYnl0ZShkZXYsIEVQUk9NX0NNRCwgZWNtZCk7Cit9CisKK3ZvaWQgcnRsODE4MF9hZGFwdGVyX3N0YXJ0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwordm9pZCBydGw4MTgwX2JlYWNvbl90eF9lbmFibGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKK3ZvaWQgcnRsODE4MF91cGRhdGVfbXNyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCXU4IG1zcjsKKwl1MzIgcnhjb25mOworCisJbXNyICA9IHJlYWRfbmljX2J5dGUoZGV2LCBNU1IpOworCW1zciAmPSB+IE1TUl9MSU5LX01BU0s7CisKKwlyeGNvbmY9cmVhZF9uaWNfZHdvcmQoZGV2LFJYX0NPTkYpOworCisJaWYocHJpdi0+aWVlZTgwMjExLT5zdGF0ZSA9PSBJRUVFODAyMTFfTElOS0VEKQorCXsKKwkJaWYocHJpdi0+aWVlZTgwMjExLT5pd19tb2RlID09IElXX01PREVfQURIT0MpCisJCQltc3IgfD0gKE1TUl9MSU5LX0FESE9DPDxNU1JfTElOS19TSElGVCk7CisJCWVsc2UgaWYgKHByaXYtPmllZWU4MDIxMS0+aXdfbW9kZSA9PSBJV19NT0RFX01BU1RFUikKKwkJCW1zciB8PSAoTVNSX0xJTktfTUFTVEVSPDxNU1JfTElOS19TSElGVCk7CisJCWVsc2UgaWYgKHByaXYtPmllZWU4MDIxMS0+aXdfbW9kZSA9PSBJV19NT0RFX0lORlJBKQorCQkJbXNyIHw9IChNU1JfTElOS19NQU5BR0VEPDxNU1JfTElOS19TSElGVCk7CisJCWVsc2UKKwkJCW1zciB8PSAoTVNSX0xJTktfTk9ORTw8TVNSX0xJTktfU0hJRlQpOworCQlyeGNvbmYgfD0gKDE8PFJYX0NIRUNLX0JTU0lEX1NISUZUKTsKKworCX1lbHNlIHsKKwkJbXNyIHw9IChNU1JfTElOS19OT05FPDxNU1JfTElOS19TSElGVCk7CisJCXJ4Y29uZiAmPSB+KDE8PFJYX0NIRUNLX0JTU0lEX1NISUZUKTsKKwl9CisKKwl3cml0ZV9uaWNfYnl0ZShkZXYsIE1TUiwgbXNyKTsKKwl3cml0ZV9uaWNfZHdvcmQoZGV2LCBSWF9DT05GLCByeGNvbmYpOworCit9CisKKworCit2b2lkIHJ0bDgxODBfc2V0X2NoYW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldixzaG9ydCBjaCkKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxODBfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CisKKwlpZigoY2ggPiAxNCkgfHwgKGNoIDwgMSkpCisJeworCQlwcmludGsoIkluICVzOiBJbnZhbGlkIGNobmFuZWwgJWRcbiIsIF9fZnVuY19fLCBjaCk7CisJCXJldHVybjsKKwl9CisKKwlwcml2LT5jaGFuPWNoOworCS8vcHJpbnRrKCJpbiAlczpjaGFubmVsIGlzICVkXG4iLF9fZnVuY19fLGNoKTsKKwlwcml2LT5yZl9zZXRfY2hhbihkZXYscHJpdi0+Y2hhbik7CisKK30KKworCit2b2lkIHJ0bDgxODBfcnhfZW5hYmxlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJdTggY21kOworCXUzMiByeGNvbmY7CisJLyogZm9yIG5vdyB3ZSBhY2NlcHQgZGF0YSwgbWFuYWdlbWVudCAmIGN0bCBmcmFtZSovCisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTgwX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOworCisJcnhjb25mPXJlYWRfbmljX2R3b3JkKGRldixSWF9DT05GKTsKKwlyeGNvbmYgPSByeGNvbmYgJn4gTUFDX0ZJTFRFUl9NQVNLOworCXJ4Y29uZiA9IHJ4Y29uZiB8ICgxPDxBQ0NFUFRfTU5HX0ZSQU1FX1NISUZUKTsKKwlyeGNvbmYgPSByeGNvbmYgfCAoMTw8QUNDRVBUX0RBVEFfRlJBTUVfU0hJRlQpOworCXJ4Y29uZiA9IHJ4Y29uZiB8ICgxPDxBQ0NFUFRfQkNBU1RfRlJBTUVfU0hJRlQpOworCXJ4Y29uZiA9IHJ4Y29uZiB8ICgxPDxBQ0NFUFRfTUNBU1RfRlJBTUVfU0hJRlQpOworLy8Jcnhjb25mID0gcnhjb25mIHwgKDE8PEFDQ0VQVF9DUkNFUlJfRlJBTUVfU0hJRlQpOworCWlmIChkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpIERNRVNHICgiTklDIGluIHByb21pc2MgbW9kZSIpOworCisJaWYocHJpdi0+aWVlZTgwMjExLT5pd19tb2RlID09IElXX01PREVfTU9OSVRPUiB8fCBcCisJICAgZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKXsKKwkJcnhjb25mID0gcnhjb25mIHwgKDE8PEFDQ0VQVF9BTExNQUNfRlJBTUVfU0hJRlQpOworCX1lbHNleworCQlyeGNvbmYgPSByeGNvbmYgfCAoMTw8QUNDRVBUX05JQ01BQ19GUkFNRV9TSElGVCk7CisJCWlmKHByaXYtPmNhcmRfODE4NSA9PSAwKQorCQkJcnhjb25mID0gcnhjb25mIHwgKDE8PFJYX0NIRUNLX0JTU0lEX1NISUZUKTsKKwl9CisKKwkvKmlmKHByaXYtPmllZWU4MDIxMS0+aXdfbW9kZSA9PSBJV19NT0RFX01BU1RFUil7CisJCXJ4Y29uZiA9IHJ4Y29uZiB8ICgxPDxBQ0NFUFRfQUxMTUFDX0ZSQU1FX1NISUZUKTsKKwkJcnhjb25mID0gcnhjb25mIHwgKDE8PFJYX0NIRUNLX0JTU0lEX1NISUZUKTsKKwl9Ki8KKworCWlmKHByaXYtPmllZWU4MDIxMS0+aXdfbW9kZSA9PSBJV19NT0RFX01PTklUT1IpeworCQlyeGNvbmYgPSByeGNvbmYgfCAoMTw8QUNDRVBUX0NUTF9GUkFNRV9TSElGVCk7CisJCXJ4Y29uZiA9IHJ4Y29uZiB8ICgxPDxBQ0NFUFRfSUNWRVJSX0ZSQU1FX1NISUZUKTsKKwkJcnhjb25mID0gcnhjb25mIHwgKDE8PEFDQ0VQVF9QV1JfRlJBTUVfU0hJRlQpOworCX0KKworCWlmKCBwcml2LT5jcmNtb24gPT0gMSAmJiBwcml2LT5pZWVlODAyMTEtPml3X21vZGUgPT0gSVdfTU9ERV9NT05JVE9SKQorCQlyeGNvbmYgPSByeGNvbmYgfCAoMTw8QUNDRVBUX0NSQ0VSUl9GUkFNRV9TSElGVCk7CisKKwkvL2lmKCFwcml2LT5jYXJkXzgxODUpeworCQlyeGNvbmYgPSByeGNvbmYgJn4gUlhfRklGT19USFJFU0hPTERfTUFTSzsKKwkJcnhjb25mID0gcnhjb25mIHwgKFJYX0ZJRk9fVEhSRVNIT0xEX05PTkU8PFJYX0ZJRk9fVEhSRVNIT0xEX1NISUZUKTsKKwkvL30KKworCXJ4Y29uZiA9IHJ4Y29uZiB8ICgxPDxSWF9BVVRPUkVTRVRQSFlfU0hJRlQpOworCXJ4Y29uZiA9IHJ4Y29uZiAmfiBNQVhfUlhfRE1BX01BU0s7CisJcnhjb25mID0gcnhjb25mIHwgKE1BWF9SWF9ETUFfMjA0ODw8TUFYX1JYX0RNQV9TSElGVCk7CisKKwkvL2lmKCFwcml2LT5jYXJkXzgxODUpCisJCXJ4Y29uZiA9IHJ4Y29uZiB8IFJDUl9PTkxZRVJMUEtUOworCisJcnhjb25mID0gcnhjb25mICZ+IFJDUl9DU19NQVNLOworCWlmKCFwcml2LT5jYXJkXzgxODUpCisJCXJ4Y29uZiB8PSAocHJpdi0+cmNyX2NzZW5zZTw8UkNSX0NTX1NISUZUKTsKKy8vCXJ4Y29uZiAmPX4gMHhmZmYwMDAwMDsKKy8vCXJ4Y29uZiB8PSAweDkwMTAwMDAwOy8vOTAxNGY3NmY7CisJd3JpdGVfbmljX2R3b3JkKGRldiwgUlhfQ09ORiwgcnhjb25mKTsKKworCWZpeF9yeF9maWZvKGRldik7CisKKyNpZmRlZiBERUJVR19SWAorCURNRVNHKCJyeGNvbmY6ICV4ICV4IixyeGNvbmYgLHJlYWRfbmljX2R3b3JkKGRldixSWF9DT05GKSk7CisjZW5kaWYKKwljbWQ9cmVhZF9uaWNfYnl0ZShkZXYsQ01EKTsKKwl3cml0ZV9uaWNfYnl0ZShkZXYsQ01ELGNtZCB8ICgxPDxDTURfUlhfRU5BQkxFX1NISUZUKSk7CisKKwkvKiBJbiBydGw4MTM5IGRyaXZlciBzZWVtcyB0aGF0IERNQSB0aHJlc2hvbGQgaGFzIHRvIGJlIHdyaXR0ZW4KKwkgKiAgYWZ0ZXIgZW5hYmxpbmcgUlgsIHNvIHdlIHJld3JpdGUgUlhfQ09ORklHIHJlZ2lzdGVyCisJICovCisJLy9tZGVsYXkoMTAwKTsKKy8vCXdyaXRlX25pY19kd29yZChkZXYsIFJYX0NPTkYsIHJ4Y29uZik7CisKK30KKworCit2b2lkIHNldF9uaWNfdHhyaW5nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTgwX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOworLy8JCURNRVNHKCJyaW5nICV4ICV4IiwgcHJpdi0+dHhscHJpbmdkbWEscmVhZF9uaWNfZHdvcmQoZGV2LFRMUERBKSk7CisKKwl3cml0ZV9uaWNfZHdvcmQoZGV2LCBUWF9NQU5BR0VQUklPUklUWV9SSU5HX0FERFIsIHByaXYtPnR4bWFwcmluZ2RtYSk7CisvLwkJRE1FU0coInJpbmcgJXggJXgiLCBwcml2LT50eGxwcmluZ2RtYSxyZWFkX25pY19kd29yZChkZXYsVExQREEpKTsKKwl3cml0ZV9uaWNfZHdvcmQoZGV2LCBUWF9CS1BSSU9SSVRZX1JJTkdfQUREUiwgcHJpdi0+dHhia3ByaW5nZG1hKTsKKy8vCQlETUVTRygicmluZyAleCAleCIsIHByaXYtPnR4bHByaW5nZG1hLHJlYWRfbmljX2R3b3JkKGRldixUTFBEQSkpOworCXdyaXRlX25pY19kd29yZChkZXYsIFRYX0JFUFJJT1JJVFlfUklOR19BRERSLCBwcml2LT50eGJlcHJpbmdkbWEpOworLy8JCURNRVNHKCJyaW5nICV4ICV4IiwgcHJpdi0+dHhscHJpbmdkbWEscmVhZF9uaWNfZHdvcmQoZGV2LFRMUERBKSk7CisJd3JpdGVfbmljX2R3b3JkKGRldiwgVFhfVklQUklPUklUWV9SSU5HX0FERFIsIHByaXYtPnR4dmlwcmluZ2RtYSk7CisvLwkJRE1FU0coInJpbmcgJXggJXgiLCBwcml2LT50eGxwcmluZ2RtYSxyZWFkX25pY19kd29yZChkZXYsVExQREEpKTsKKwl3cml0ZV9uaWNfZHdvcmQoZGV2LCBUWF9WT1BSSU9SSVRZX1JJTkdfQUREUiwgcHJpdi0+dHh2b3ByaW5nZG1hKTsKKy8vCQlETUVTRygicmluZyAleCAleCIsIHByaXYtPnR4bHByaW5nZG1hLHJlYWRfbmljX2R3b3JkKGRldixUTFBEQSkpOworCXdyaXRlX25pY19kd29yZChkZXYsIFRYX0hJR0hQUklPUklUWV9SSU5HX0FERFIsIHByaXYtPnR4aHByaW5nZG1hKTsKKy8vCQlETUVTRygicmluZyAleCAleCIsIHByaXYtPnR4bHByaW5nZG1hLHJlYWRfbmljX2R3b3JkKGRldixUTFBEQSkpOworCisJd3JpdGVfbmljX2R3b3JkKGRldiwgVFhfQkVBQ09OX1JJTkdfQUREUiwgcHJpdi0+dHhiZWFjb25yaW5nZG1hKTsKK30KKworCit2b2lkIHJ0bDgxODBfY29udHR4X2VuYWJsZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXUzMiB0eGNvbmY7CisJdHhjb25mID0gcmVhZF9uaWNfZHdvcmQoZGV2LFRYX0NPTkYpOworCXR4Y29uZiA9IHR4Y29uZiAmfiBUWF9MT09QQkFDS19NQVNLOworCXR4Y29uZiA9IHR4Y29uZiB8IChUWF9MT09QQkFDS19DT05USU5VRSA8PFRYX0xPT1BCQUNLX1NISUZUKTsKKwl3cml0ZV9uaWNfZHdvcmQoZGV2LFRYX0NPTkYsdHhjb25mKTsKK30KKworCit2b2lkIHJ0bDgxODBfY29udHR4X2Rpc2FibGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl1MzIgdHhjb25mOworCXR4Y29uZiA9IHJlYWRfbmljX2R3b3JkKGRldixUWF9DT05GKTsKKwl0eGNvbmYgPSB0eGNvbmYgJn4gVFhfTE9PUEJBQ0tfTUFTSzsKKwl0eGNvbmYgPSB0eGNvbmYgfCAoVFhfTE9PUEJBQ0tfTk9ORSA8PFRYX0xPT1BCQUNLX1NISUZUKTsKKwl3cml0ZV9uaWNfZHdvcmQoZGV2LFRYX0NPTkYsdHhjb25mKTsKK30KKworCit2b2lkIHJ0bDgxODBfdHhfZW5hYmxlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJdTggY21kOworCXU4IHR4X2FnY19jdGw7CisJdTggYnl0ZTsKKwl1MzIgdHhjb25mOworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gKHN0cnVjdCByODE4MF9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsKKwl0eGNvbmY9IHJlYWRfbmljX2R3b3JkKGRldixUWF9DT05GKTsKKworCisJaWYocHJpdi0+Y2FyZF84MTg1KXsKKworCisJCWJ5dGUgPSByZWFkX25pY19ieXRlKGRldixDV19DT05GKTsKKwkJYnl0ZSAmPSB+KDE8PENXX0NPTkZfUEVSUEFDS0VUX0NXX1NISUZUKTsKKwkJYnl0ZSAmPSB+KDE8PENXX0NPTkZfUEVSUEFDS0VUX1JFVFJZX1NISUZUKTsKKwkJd3JpdGVfbmljX2J5dGUoZGV2LCBDV19DT05GLCBieXRlKTsKKworCQl0eF9hZ2NfY3RsID0gcmVhZF9uaWNfYnl0ZShkZXYsIFRYX0FHQ19DVEwpOworCQl0eF9hZ2NfY3RsICY9IH4oMTw8VFhfQUdDX0NUTF9QRVJQQUNLRVRfR0FJTl9TSElGVCk7CisJCXR4X2FnY19jdGwgJj0gfigxPDxUWF9BR0NfQ1RMX1BFUlBBQ0tFVF9BTlRTRUxfU0hJRlQpOworCQl0eF9hZ2NfY3RsIHw9KDE8PFRYX0FHQ19DVExfRkVFREJBQ0tfQU5UKTsKKwkJd3JpdGVfbmljX2J5dGUoZGV2LCBUWF9BR0NfQ1RMLCB0eF9hZ2NfY3RsKTsKKwkJLyoKKwkJd3JpdGVfbmljX3dvcmQoZGV2LCAweDVlLCAweDAxKTsKKwkJZm9yY2VfcGNpX3Bvc3RpbmcoZGV2KTsKKwkJbWRlbGF5KDEpOworCQl3cml0ZV9uaWNfd29yZChkZXYsIDB4ZmUsIDB4MTApOworCQlmb3JjZV9wY2lfcG9zdGluZyhkZXYpOworCQltZGVsYXkoMSk7CisJCXdyaXRlX25pY193b3JkKGRldiwgMHg1ZSwgMHgwMCk7CisJCWZvcmNlX3BjaV9wb3N0aW5nKGRldik7CisJCW1kZWxheSgxKTsKKwkJKi8KKwkJd3JpdGVfbmljX2J5dGUoZGV2LCAweGVjLCAweDNmKTsgLyogRGlzYWJsZSBlYXJseSBUWCAqLworCX0KKworCWlmKHByaXYtPmNhcmRfODE4NSl7CisKKwkJdHhjb25mID0gdHhjb25mICZ+ICgxPDxUQ1JfUFJPQkVfTk9USU1FU1RBTVBfU0hJRlQpOworCisJfWVsc2V7CisKKwkJaWYoaHdzZXFudW0pCisJCQl0eGNvbmY9IHR4Y29uZiAmfiAoMTw8VFhfQ09ORl9IRUFERVJfQVVUT0lDUkVNRU5UX1NISUZUKTsKKwkJZWxzZQorCQkJdHhjb25mPSB0eGNvbmYgfCAoMTw8VFhfQ09ORl9IRUFERVJfQVVUT0lDUkVNRU5UX1NISUZUKTsKKwl9CisKKwl0eGNvbmYgPSB0eGNvbmYgJn4gVFhfTE9PUEJBQ0tfTUFTSzsKKwl0eGNvbmYgPSB0eGNvbmYgfCAoVFhfTE9PUEJBQ0tfTk9ORSA8PFRYX0xPT1BCQUNLX1NISUZUKTsKKwl0eGNvbmYgPSB0eGNvbmYgJn4gVENSX0RQUkVUUllfTUFTSzsKKwl0eGNvbmYgPSB0eGNvbmYgJn4gVENSX1JUU1JFVFJZX01BU0s7CisJdHhjb25mID0gdHhjb25mIHwgKHByaXYtPnJldHJ5X2RhdGE8PFRYX0RQUkVUUllfU0hJRlQpOworCXR4Y29uZiA9IHR4Y29uZiB8IChwcml2LT5yZXRyeV9ydHM8PFRYX1JUU1JFVFJZX1NISUZUKTsKKwl0eGNvbmYgPSB0eGNvbmYgJn4gKDE8PFRYX05PQ1JDX1NISUZUKTsKKworCWlmKHByaXYtPmNhcmRfODE4NSl7CisJCWlmKHByaXYtPmh3X3BsY3BfbGVuKQorCQkJdHhjb25mID0gdHhjb25mICZ+IFRDUl9QTENQX0xFTjsKKwkJZWxzZQorCQkJdHhjb25mID0gdHhjb25mIHwgVENSX1BMQ1BfTEVOOworCX1lbHNleworCQl0eGNvbmYgPSB0eGNvbmYgJn4gVENSX1NBVDsKKwl9CisJdHhjb25mID0gdHhjb25mICZ+IFRDUl9NWERNQV9NQVNLOworCXR4Y29uZiA9IHR4Y29uZiB8IChUQ1JfTVhETUFfMjA0ODw8VENSX01YRE1BX1NISUZUKTsKKwl0eGNvbmYgPSB0eGNvbmYgfCBUQ1JfQ1dNSU47CisJdHhjb25mID0gdHhjb25mIHwgVENSX0RJU0NXOworCisvLwlpZihwcml2LT5pZWVlODAyMTEtPmh3X3dlcCkKKy8vCQl0eGNvbmY9dHhjb25mICZ+ICgxPDxUWF9OT0lDVl9TSElGVCk7CisvLwllbHNlCisJCXR4Y29uZj10eGNvbmYgfCAoMTw8VFhfTk9JQ1ZfU0hJRlQpOworCisJd3JpdGVfbmljX2R3b3JkKGRldixUWF9DT05GLHR4Y29uZik7CisKKworCWZpeF90eF9maWZvKGRldik7CisKKyNpZmRlZiBERUJVR19UWAorCURNRVNHKCJ0eGNvbmY6ICV4ICV4Iix0eGNvbmYscmVhZF9uaWNfZHdvcmQoZGV2LFRYX0NPTkYpKTsKKyNlbmRpZgorCisJY21kPXJlYWRfbmljX2J5dGUoZGV2LENNRCk7CisJd3JpdGVfbmljX2J5dGUoZGV2LENNRCxjbWQgfCAoMTw8Q01EX1RYX0VOQUJMRV9TSElGVCkpOworCisvLwltZGVsYXkoMTAwKTsKKwl3cml0ZV9uaWNfZHdvcmQoZGV2LFRYX0NPTkYsdHhjb25mKTsKKy8vCSNlbmRpZgorLyoKKwlydGw4MTgwX3NldF9tb2RlKGRldixFUFJPTV9DTURfQ09ORklHKTsKKwl3cml0ZV9uaWNfYnl0ZShkZXYsIFRYX0RNQV9QT0xMSU5HLCBwcml2LT5kbWFfcG9sbF9tYXNrKTsKKwlydGw4MTgwX3NldF9tb2RlKGRldixFUFJPTV9DTURfTk9STUFMKTsKKwkqLworfQorCisKK3ZvaWQgcnRsODE4MF9iZWFjb25fdHhfZW5hYmxlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTgwX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOworCisJcnRsODE4MF9zZXRfbW9kZShkZXYsRVBST01fQ01EX0NPTkZJRyk7CisjaWZkZWYgQ09ORklHX1JUTDgxODVCCisJcHJpdi0+ZG1hX3BvbGxfc3RvcF9tYXNrICY9IH4oVFBQT0xMU1RPUF9CUSk7CisJd3JpdGVfbmljX2J5dGUoZGV2LFRQUG9sbFN0b3AsIHByaXYtPmRtYV9wb2xsX21hc2spOworI2Vsc2UKKwlwcml2LT5kbWFfcG9sbF9tYXNrICY9figxPDxUWF9ETUFfU1RPUF9CRUFDT05fU0hJRlQpOworCXdyaXRlX25pY19ieXRlKGRldixUWF9ETUFfUE9MTElORyxwcml2LT5kbWFfcG9sbF9tYXNrKTsKKyNlbmRpZgorCXJ0bDgxODBfc2V0X21vZGUoZGV2LEVQUk9NX0NNRF9OT1JNQUwpOworfQorCisKK3ZvaWQgcnRsODE4MF9iZWFjb25fdHhfZGlzYWJsZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gKHN0cnVjdCByODE4MF9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCXJ0bDgxODBfc2V0X21vZGUoZGV2LEVQUk9NX0NNRF9DT05GSUcpOworI2lmZGVmIENPTkZJR19SVEw4MTg1QgorCXByaXYtPmRtYV9wb2xsX3N0b3BfbWFzayB8PSBUUFBPTExTVE9QX0JROworCXdyaXRlX25pY19ieXRlKGRldixUUFBvbGxTdG9wLCBwcml2LT5kbWFfcG9sbF9zdG9wX21hc2spOworI2Vsc2UKKwlwcml2LT5kbWFfcG9sbF9tYXNrIHw9ICgxPDxUWF9ETUFfU1RPUF9CRUFDT05fU0hJRlQpOworCXdyaXRlX25pY19ieXRlKGRldixUWF9ETUFfUE9MTElORyxwcml2LT5kbWFfcG9sbF9tYXNrKTsKKyNlbmRpZgorCXJ0bDgxODBfc2V0X21vZGUoZGV2LEVQUk9NX0NNRF9OT1JNQUwpOworCit9CisKKwordm9pZCBydGw4MTgwX3J0eF9kaXNhYmxlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJdTggY21kOworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCWNtZD1yZWFkX25pY19ieXRlKGRldixDTUQpOworCXdyaXRlX25pY19ieXRlKGRldiwgQ01ELCBjbWQgJn4gXAorCQkgICAgICAgKCgxPDxDTURfUlhfRU5BQkxFX1NISUZUKXwoMTw8Q01EX1RYX0VOQUJMRV9TSElGVCkpKTsKKwlmb3JjZV9wY2lfcG9zdGluZyhkZXYpOworCW1kZWxheSgxMCk7CisJLyp3aGlsZSAocmVhZF9uaWNfYnl0ZShkZXYsQ01EKSAmICgxPDxDTURfUlhfRU5BQkxFX1NISUZUKSkKKwkgIHVkZWxheSgxMCk7CisJKi8KKworCWlmKCFwcml2LT5yeF9za2JfY29tcGxldGUpCisJCWRldl9rZnJlZV9za2JfYW55KHByaXYtPnJ4X3NrYik7Cit9CisKKyNpZiAwCitpbnQgYWxsb2NfdHhfYmVhY29uX2Rlc2NfcmluZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgY291bnQpCit7CisJaW50IGk7CisJdTMyICp0bXA7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTgwX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOworCisJcHJpdi0+dHhiZWFjb25yaW5nID0gKHUzMiopcGNpX2FsbG9jX2NvbnNpc3RlbnQocHJpdi0+cGRldiwKKwkJCQkJICBzaXplb2YodTMyKSo4KmNvdW50LAorCQkJCQkgICZwcml2LT50eGJlYWNvbnJpbmdkbWEpOworCWlmICghcHJpdi0+dHhiZWFjb25yaW5nKSByZXR1cm4gLTE7CisJZm9yICh0bXA9cHJpdi0+dHhiZWFjb25yaW5nLGk9MDtpPGNvdW50O2krKyl7CisJCSp0bXAgPSAqdG1wICZ+ICgxPDwzMSk7IC8vIGRlc2NyaXB0b3IgZW1wdHksIG93bmVkIGJ5IHRoZSBkcnYKKwkJLyoKKwkJKih0bXArMikgPSAodTMyKWRtYV90bXA7CisJCSoodG1wKzMpID0gYnVmc2l6ZTsKKwkJKi8KKwkJaWYoaSsxPGNvdW50KQorCQkJKih0bXArNCkgPSAodTMyKXByaXYtPnR4YmVhY29ucmluZ2RtYSsoKGkrMSkqOCo0KTsKKwkJZWxzZQorCQkJKih0bXArNCkgPSAodTMyKXByaXYtPnR4YmVhY29ucmluZ2RtYTsKKworCQl0bXA9dG1wKzg7CisJfQorCXJldHVybiAwOworfQorI2VuZGlmCisKK3Nob3J0IGFsbG9jX3R4X2Rlc2NfcmluZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgYnVmc2l6ZSwgaW50IGNvdW50LAorCQkJIGludCBhZGRyKQoreworCWludCBpOworCXUzMiAqZGVzYzsKKwl1MzIgKnRtcDsKKwlkbWFfYWRkcl90IGRtYV9kZXNjLCBkbWFfdG1wOworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gKHN0cnVjdCByODE4MF9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHByaXYtPnBkZXY7CisJdm9pZCAqYnVmOworCisJaWYoKGJ1ZnNpemUgJiAweGZmZikgIT0gYnVmc2l6ZSkgeworCQlETUVTR0UgKCJUWCBidWZmZXIgYWxsb2NhdGlvbiB0b28gbGFyZ2UiKTsKKwkJcmV0dXJuIDA7CisJfQorCWRlc2MgPSAodTMyKilwY2lfYWxsb2NfY29uc2lzdGVudChwZGV2LAorCQkJCQkgIHNpemVvZih1MzIpKjgqY291bnQrMjU2LCAmZG1hX2Rlc2MpOworCWlmKGRlc2M9PU5VTEwpIHJldHVybiAtMTsKKwlpZihkbWFfZGVzYyAmIDB4ZmYpeworCisJCS8qCisJCSAqIGRlc2NyaXB0b3IncyBidWZmZXIgbXVzdCBiZSAyNTYgYnl0ZSBhbGlnbmVkCisJCSAqIHdlIHNob3VsZG4ndCBiZSBoZXJlLCBzaW5jZSB3ZSBzZXQgRE1BIG1hc2sgIQorCQkgKi8KKwkJRE1FU0dXKCJGaXhpbmcgVFggYWxpZ25tZW50Iik7CisJCWRlc2MgPSAodTMyKikoKHU4KilkZXNjICsgMjU2KTsKKyNpZiAoZGVmaW5lZChDT05GSUdfSElHSE1FTTY0RykgfHwgZGVmaW5lZChDT05GSUdfNjRCSVRfUEhZU19BRERSKSkKKwkJZGVzYyA9ICh1MzIqKSgodTY0KWRlc2MgJn4gMHhmZik7CisJCWRtYV9kZXNjID0gKGRtYV9hZGRyX3QpKCh1OCopZG1hX2Rlc2MgKyAyNTYpOworCQlkbWFfZGVzYyA9IChkbWFfYWRkcl90KSgodTY0KWRtYV9kZXNjICZ+IDB4ZmYpOworI2Vsc2UKKwkJZGVzYyA9ICh1MzIqKSgodTMyKWRlc2MgJn4gMHhmZik7CisJCWRtYV9kZXNjID0gKGRtYV9hZGRyX3QpKCh1OCopZG1hX2Rlc2MgKyAyNTYpOworCQlkbWFfZGVzYyA9IChkbWFfYWRkcl90KSgodTMyKWRtYV9kZXNjICZ+IDB4ZmYpOworI2VuZGlmCisJfQorCXRtcD1kZXNjOworCWZvciAoaT0wO2k8Y291bnQ7aSsrKQorCXsKKwkJYnVmID0gKHZvaWQqKXBjaV9hbGxvY19jb25zaXN0ZW50KHBkZXYsYnVmc2l6ZSwmZG1hX3RtcCk7CisJCWlmIChidWYgPT0gTlVMTCkgcmV0dXJuIC1FTk9NRU07CisKKwkJc3dpdGNoKGFkZHIpIHsKKyNpZiAwCisJCWNhc2UgVFhfTk9STVBSSU9SSVRZX1JJTkdfQUREUjoKKwkJCWlmKC0xID09IGJ1ZmZlcl9hZGQoJihwcml2LT50eG5wYnVmcyksYnVmLGRtYV90bXAsTlVMTCkpeworCQkJCURNRVNHRSgiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbSBmb3IgYnVmZmVyIE5QIik7CisJCQkJcmV0dXJuIC1FTk9NRU07CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFRYX0xPV1BSSU9SSVRZX1JJTkdfQUREUjoKKwkJCWlmKC0xID09IGJ1ZmZlcl9hZGQoJihwcml2LT50eGxwYnVmcyksYnVmLGRtYV90bXAsTlVMTCkpeworCQkJCURNRVNHRSgiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbSBmb3IgYnVmZmVyIExQIik7CisJCQkJcmV0dXJuIC1FTk9NRU07CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFRYX0hJR0hQUklPUklUWV9SSU5HX0FERFI6CisJCQlpZigtMSA9PSBidWZmZXJfYWRkKCYocHJpdi0+dHhocGJ1ZnMpLGJ1ZixkbWFfdG1wLE5VTEwpKXsKKwkJCQlETUVTR0UoIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW0gZm9yIGJ1ZmZlciBIUCIpOworCQkJCXJldHVybiAtRU5PTUVNOworCQkJfQorCQkJYnJlYWs7CisjZWxzZQorCQljYXNlIFRYX01BTkFHRVBSSU9SSVRZX1JJTkdfQUREUjoKKwkJCWlmKC0xID09IGJ1ZmZlcl9hZGQoJihwcml2LT50eG1hcGJ1ZnMpLGJ1ZixkbWFfdG1wLE5VTEwpKXsKKwkJCQlETUVTR0UoIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW0gZm9yIGJ1ZmZlciBOUCIpOworCQkJCXJldHVybiAtRU5PTUVNOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBUWF9CS1BSSU9SSVRZX1JJTkdfQUREUjoKKwkJCWlmKC0xID09IGJ1ZmZlcl9hZGQoJihwcml2LT50eGJrcGJ1ZnMpLGJ1ZixkbWFfdG1wLE5VTEwpKXsKKwkJCQlETUVTR0UoIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW0gZm9yIGJ1ZmZlciBMUCIpOworCQkJCXJldHVybiAtRU5PTUVNOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgVFhfQkVQUklPUklUWV9SSU5HX0FERFI6CisJCQlpZigtMSA9PSBidWZmZXJfYWRkKCYocHJpdi0+dHhiZXBidWZzKSxidWYsZG1hX3RtcCxOVUxMKSl7CisJCQkJRE1FU0dFKCJVbmFibGUgdG8gYWxsb2NhdGUgbWVtIGZvciBidWZmZXIgTlAiKTsKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgVFhfVklQUklPUklUWV9SSU5HX0FERFI6CisJCQlpZigtMSA9PSBidWZmZXJfYWRkKCYocHJpdi0+dHh2aXBidWZzKSxidWYsZG1hX3RtcCxOVUxMKSl7CisJCQkJRE1FU0dFKCJVbmFibGUgdG8gYWxsb2NhdGUgbWVtIGZvciBidWZmZXIgTFAiKTsKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRYX1ZPUFJJT1JJVFlfUklOR19BRERSOgorCQkJaWYoLTEgPT0gYnVmZmVyX2FkZCgmKHByaXYtPnR4dm9wYnVmcyksYnVmLGRtYV90bXAsTlVMTCkpeworCQkJCURNRVNHRSgiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbSBmb3IgYnVmZmVyIE5QIik7CisJCQkJcmV0dXJuIC1FTk9NRU07CisJCQl9CisJCQlicmVhazsKKyNlbmRpZgorCQljYXNlIFRYX0hJR0hQUklPUklUWV9SSU5HX0FERFI6CisJCQlpZigtMSA9PSBidWZmZXJfYWRkKCYocHJpdi0+dHhocGJ1ZnMpLGJ1ZixkbWFfdG1wLE5VTEwpKXsKKwkJCQlETUVTR0UoIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW0gZm9yIGJ1ZmZlciBIUCIpOworCQkJCXJldHVybiAtRU5PTUVNOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgVFhfQkVBQ09OX1JJTkdfQUREUjoKKwkJICAgICAgICBpZigtMSA9PSBidWZmZXJfYWRkKCYocHJpdi0+dHhiZWFjb25idWZzKSxidWYsZG1hX3RtcCxOVUxMKSl7CisJCQlETUVTR0UoIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW0gZm9yIGJ1ZmZlciBCUCIpOworCQkJCXJldHVybiAtRU5PTUVNOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwkJKnRtcCA9ICp0bXAgJn4gKDE8PDMxKTsgLy8gZGVzY3JpcHRvciBlbXB0eSwgb3duZWQgYnkgdGhlIGRydgorCQkqKHRtcCsyKSA9ICh1MzIpZG1hX3RtcDsKKwkJKih0bXArMykgPSBidWZzaXplOworCisJCWlmKGkrMTxjb3VudCkKKwkJCSoodG1wKzQpID0gKHUzMilkbWFfZGVzYysoKGkrMSkqOCo0KTsKKwkJZWxzZQorCQkJKih0bXArNCkgPSAodTMyKWRtYV9kZXNjOworCisJCXRtcD10bXArODsKKwl9CisKKwlzd2l0Y2goYWRkcikgeworCWNhc2UgVFhfTUFOQUdFUFJJT1JJVFlfUklOR19BRERSOgorCQlwcml2LT50eG1hcHJpbmdkbWE9ZG1hX2Rlc2M7CisJCXByaXYtPnR4bWFwcmluZz1kZXNjOworCQlicmVhazsKKworCWNhc2UgVFhfQktQUklPUklUWV9SSU5HX0FERFI6CisJCXByaXYtPnR4YmtwcmluZ2RtYT1kbWFfZGVzYzsKKwkJcHJpdi0+dHhia3ByaW5nPWRlc2M7CisJCWJyZWFrOworCisJY2FzZSBUWF9CRVBSSU9SSVRZX1JJTkdfQUREUjoKKwkJcHJpdi0+dHhiZXByaW5nZG1hPWRtYV9kZXNjOworCQlwcml2LT50eGJlcHJpbmc9ZGVzYzsKKwkJYnJlYWs7CisKKwljYXNlIFRYX1ZJUFJJT1JJVFlfUklOR19BRERSOgorCQlwcml2LT50eHZpcHJpbmdkbWE9ZG1hX2Rlc2M7CisJCXByaXYtPnR4dmlwcmluZz1kZXNjOworCQlicmVhazsKKworCWNhc2UgVFhfVk9QUklPUklUWV9SSU5HX0FERFI6CisJCXByaXYtPnR4dm9wcmluZ2RtYT1kbWFfZGVzYzsKKwkJcHJpdi0+dHh2b3ByaW5nPWRlc2M7CisJCWJyZWFrOworCisJY2FzZSBUWF9ISUdIUFJJT1JJVFlfUklOR19BRERSOgorCQlwcml2LT50eGhwcmluZ2RtYT1kbWFfZGVzYzsKKwkJcHJpdi0+dHhocHJpbmc9ZGVzYzsKKwkJYnJlYWs7CisKKwljYXNlIFRYX0JFQUNPTl9SSU5HX0FERFI6CisJCXByaXYtPnR4YmVhY29ucmluZ2RtYT1kbWFfZGVzYzsKKwkJcHJpdi0+dHhiZWFjb25yaW5nPWRlc2M7CisJCWJyZWFrOworCisJfQorCisjaWZkZWYgREVCVUdfVFgKKwlETUVTRygiVHggZG1hIHBoeXNpY2FsIGFkZHJlc3M6ICV4IixkbWFfZGVzYyk7CisjZW5kaWYKKworCXJldHVybiAwOworfQorCisKK3ZvaWQgZnJlZV90eF9kZXNjX3JpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxODBfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CisJc3RydWN0IHBjaV9kZXYgKnBkZXY9cHJpdi0+cGRldjsKKwlpbnQgY291bnQgPSBwcml2LT50eHJpbmdjb3VudDsKKworCXBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwgc2l6ZW9mKHUzMikqOCpjb3VudCsyNTYsCisJCQkgICAgcHJpdi0+dHhtYXByaW5nLCBwcml2LT50eG1hcHJpbmdkbWEpOworCWJ1ZmZlcl9mcmVlKGRldiwmKHByaXYtPnR4bWFwYnVmcykscHJpdi0+dHhidWZmc2l6ZSwxKTsKKworCXBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwgc2l6ZW9mKHUzMikqOCpjb3VudCsyNTYsCisJCQkgICAgcHJpdi0+dHhia3ByaW5nLCBwcml2LT50eGJrcHJpbmdkbWEpOworCWJ1ZmZlcl9mcmVlKGRldiwmKHByaXYtPnR4YmtwYnVmcykscHJpdi0+dHhidWZmc2l6ZSwxKTsKKworCXBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwgc2l6ZW9mKHUzMikqOCpjb3VudCsyNTYsCisJCQkgICAgcHJpdi0+dHhiZXByaW5nLCBwcml2LT50eGJlcHJpbmdkbWEpOworCWJ1ZmZlcl9mcmVlKGRldiwmKHByaXYtPnR4YmVwYnVmcykscHJpdi0+dHhidWZmc2l6ZSwxKTsKKworCXBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwgc2l6ZW9mKHUzMikqOCpjb3VudCsyNTYsCisJCQkgICAgcHJpdi0+dHh2aXByaW5nLCBwcml2LT50eHZpcHJpbmdkbWEpOworCWJ1ZmZlcl9mcmVlKGRldiwmKHByaXYtPnR4dmlwYnVmcykscHJpdi0+dHhidWZmc2l6ZSwxKTsKKworCXBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwgc2l6ZW9mKHUzMikqOCpjb3VudCsyNTYsCisJCQkgICAgcHJpdi0+dHh2b3ByaW5nLCBwcml2LT50eHZvcHJpbmdkbWEpOworCWJ1ZmZlcl9mcmVlKGRldiwmKHByaXYtPnR4dm9wYnVmcykscHJpdi0+dHhidWZmc2l6ZSwxKTsKKworCXBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwgc2l6ZW9mKHUzMikqOCpjb3VudCsyNTYsCisJCQkgICAgcHJpdi0+dHhocHJpbmcsIHByaXYtPnR4aHByaW5nZG1hKTsKKwlidWZmZXJfZnJlZShkZXYsJihwcml2LT50eGhwYnVmcykscHJpdi0+dHhidWZmc2l6ZSwxKTsKKworCWNvdW50ID0gcHJpdi0+dHhiZWFjb25jb3VudDsKKwlwY2lfZnJlZV9jb25zaXN0ZW50KHBkZXYsIHNpemVvZih1MzIpKjgqY291bnQrMjU2LAorCQkJICAgIHByaXYtPnR4YmVhY29ucmluZywgcHJpdi0+dHhiZWFjb25yaW5nZG1hKTsKKwlidWZmZXJfZnJlZShkZXYsJihwcml2LT50eGJlYWNvbmJ1ZnMpLHByaXYtPnR4YnVmZnNpemUsMSk7Cit9CisKKyNpZiAwCit2b2lkIGZyZWVfYmVhY29uX2Rlc2NfcmluZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LGludCBjb3VudCkKK3sKKworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gKHN0cnVjdCByODE4MF9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldj1wcml2LT5wZGV2OworCisJcGNpX2ZyZWVfY29uc2lzdGVudChwZGV2LCBzaXplb2YodTMyKSo4KmNvdW50KzI1NiwKKwkJCSAgICBwcml2LT50eGJlYWNvbnJpbmcsIHByaXYtPnR4YmVhY29ucmluZ2RtYSk7CisKKwlpZiAocHJpdi0+YmVhY29uX2J1ZikKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChwcml2LT5wZGV2LAorCQkJcHJpdi0+bWFzdGVyX2JlYWNvbnNpemUscHJpdi0+YmVhY29uX2J1Zixwcml2LT5iZWFjb25kbWFidWYpOworCit9CisjZW5kaWYKK3ZvaWQgZnJlZV9yeF9kZXNjX3Jpbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxODBfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBwcml2LT5wZGV2OworCisJaW50IGNvdW50ID0gcHJpdi0+cnhyaW5nY291bnQ7CisKKyNpZmRlZiBDT05GSUdfUlRMODE4NUIKKwlwY2lfZnJlZV9jb25zaXN0ZW50KHBkZXYsIHNpemVvZih1MzIpKjgqY291bnQrMjU2LAorCQkJICAgIHByaXYtPnJ4cmluZywgcHJpdi0+cnhyaW5nZG1hKTsKKyNlbHNlCisJcGNpX2ZyZWVfY29uc2lzdGVudChwZGV2LCBzaXplb2YodTMyKSo0KmNvdW50KzI1NiwKKwkJCSAgICBwcml2LT5yeHJpbmcsIHByaXYtPnJ4cmluZ2RtYSk7CisjZW5kaWYKKworCWJ1ZmZlcl9mcmVlKGRldiwmKHByaXYtPnJ4YnVmZmVyKSxwcml2LT5yeGJ1ZmZlcnNpemUsMCk7Cit9CisKKworc2hvcnQgYWxsb2NfcnhfZGVzY19yaW5nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUxNiBidWZzaXplLCBpbnQgY291bnQpCit7CisJaW50IGk7CisJdTMyICpkZXNjOworCXUzMiAqdG1wOworCWRtYV9hZGRyX3QgZG1hX2Rlc2MsZG1hX3RtcDsKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxODBfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CisJc3RydWN0IHBjaV9kZXYgKnBkZXY9cHJpdi0+cGRldjsKKwl2b2lkICpidWY7CisJdTggcnhfZGVzY19zaXplOworCisjaWZkZWYgQ09ORklHX1JUTDgxODVCCisJcnhfZGVzY19zaXplID0gODsgLy8gNCo4ID0gMzIgYnl0ZXMKKyNlbHNlCisJcnhfZGVzY19zaXplID0gNDsKKyNlbmRpZgorCisJaWYoKGJ1ZnNpemUgJiAweGZmZikgIT0gYnVmc2l6ZSl7CisJCURNRVNHRSAoIlJYIGJ1ZmZlciBhbGxvY2F0aW9uIHRvbyBsYXJnZSIpOworCQlyZXR1cm4gLTE7CisJfQorCisJZGVzYyA9ICh1MzIqKXBjaV9hbGxvY19jb25zaXN0ZW50KHBkZXYsc2l6ZW9mKHUzMikqcnhfZGVzY19zaXplKmNvdW50KzI1NiwKKwkJCQkJICAmZG1hX2Rlc2MpOworCisJaWYoZG1hX2Rlc2MgJiAweGZmKXsKKworCQkvKgorCQkgKiBkZXNjcmlwdG9yJ3MgYnVmZmVyIG11c3QgYmUgMjU2IGJ5dGUgYWxpZ25lZAorCQkgKiBzaG91bGQgbmV2ZXIgaGFwcGVuIHNpbmNlIHdlIHNwZWNpZnkgdGhlIERNQSBtYXNrCisJCSAqLworCisJCURNRVNHVygiRml4aW5nIFJYIGFsaWdubWVudCIpOworCQlkZXNjID0gKHUzMiopKCh1OCopZGVzYyArIDI1Nik7CisjaWYgKGRlZmluZWQoQ09ORklHX0hJR0hNRU02NEcpIHx8IGRlZmluZWQoQ09ORklHXzY0QklUX1BIWVNfQUREUikpCisJCWRlc2MgPSAodTMyKikoKHU2NClkZXNjICZ+IDB4ZmYpOworCQlkbWFfZGVzYyA9IChkbWFfYWRkcl90KSgodTgqKWRtYV9kZXNjICsgMjU2KTsKKwkJZG1hX2Rlc2MgPSAoZG1hX2FkZHJfdCkoKHU2NClkbWFfZGVzYyAmfiAweGZmKTsKKyNlbHNlCisJCWRlc2MgPSAodTMyKikoKHUzMilkZXNjICZ+IDB4ZmYpOworCQlkbWFfZGVzYyA9IChkbWFfYWRkcl90KSgodTgqKWRtYV9kZXNjICsgMjU2KTsKKwkJZG1hX2Rlc2MgPSAoZG1hX2FkZHJfdCkoKHUzMilkbWFfZGVzYyAmfiAweGZmKTsKKyNlbmRpZgorCX0KKworCXByaXYtPnJ4cmluZz1kZXNjOworCXByaXYtPnJ4cmluZ2RtYT1kbWFfZGVzYzsKKwl0bXA9ZGVzYzsKKworCWZvciAoaT0wO2k8Y291bnQ7aSsrKXsKKworCQlpZiAoKGJ1Zj0ga21hbGxvYyhidWZzaXplICogc2l6ZW9mKHU4KSxHRlBfQVRPTUlDKSkgPT0gTlVMTCl7CisJCQlETUVTR0UoIkZhaWxlZCB0byBrbWFsbG9jIFJYIGJ1ZmZlciIpOworCQkJcmV0dXJuIC0xOworCQl9CisKKwkJZG1hX3RtcCA9IHBjaV9tYXBfc2luZ2xlKHBkZXYsYnVmLGJ1ZnNpemUgKiBzaXplb2YodTgpLAorCQkJCQkgUENJX0RNQV9GUk9NREVWSUNFKTsKKworI2lmZGVmIERFQlVHX1pFUk9fUlgKKwkJaW50IGo7CisJCWZvcihqPTA7ajxidWZzaXplO2orKykgKCh1OCopYnVmKVtpXSA9IDA7CisjZW5kaWYKKworCQkvL2J1ZiA9ICh2b2lkKilwY2lfYWxsb2NfY29uc2lzdGVudChwZGV2LGJ1ZnNpemUsJmRtYV90bXApOworCQlpZigtMSA9PSBidWZmZXJfYWRkKCYocHJpdi0+cnhidWZmZXIpLCBidWYsZG1hX3RtcCwKKwkJCSAgICYocHJpdi0+cnhidWZmZXJoZWFkKSkpeworCQkJICAgRE1FU0dFKCJVbmFibGUgdG8gYWxsb2NhdGUgbWVtIFJYIGJ1ZiIpOworCQkJICAgcmV0dXJuIC0xOworCQl9CisJCSp0bXAgPSAwOyAvL3plcm8gcGFkcyB0aGUgaGVhZGVyIG9mIHRoZSBkZXNjcmlwdG9yCisJCSp0bXAgPSAqdG1wIHwoIGJ1ZnNpemUmMHhmZmYpOworCQkqKHRtcCsyKSA9ICh1MzIpZG1hX3RtcDsKKwkJKnRtcCA9ICp0bXAgfCgxPDwzMSk7IC8vIGRlc2NyaXB0b3Igdm9pZCwgb3duZWQgYnkgdGhlIE5JQworCisjaWZkZWYgREVCVUdfUlhBTExPQworCQlETUVTRygiQWxsb2MgJXggc2l6ZSBidWZmZXIsIERNQSBtZW0gQCAleCwgdmlydHVhbCBtZW0gQCAleCIsCisJCSAgICAgICh1MzIpKGJ1ZnNpemUmMHhmZmYpLCAodTMyKWRtYV90bXAsICh1MzIpYnVmKTsKKyNlbmRpZgorCisJCXRtcD10bXArcnhfZGVzY19zaXplOworCX0KKworCSoodG1wLXJ4X2Rlc2Nfc2l6ZSkgPSAqKHRtcC1yeF9kZXNjX3NpemUpIHwgKDE8PDMwKTsgLy8gdGhpcyBpcyB0aGUgbGFzdCBkZXNjcmlwdG9yCisKKworI2lmZGVmIERFQlVHX1JYQUxMT0MKKwlETUVTRygiUlggRE1BIHBoeXNpY2FsIGFkZHJlc3M6ICV4IixkbWFfZGVzYyk7CisjZW5kaWYKKworCXJldHVybiAwOworfQorCisKK3ZvaWQgc2V0X25pY19yeHJpbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl1OCBwZ3JlZzsKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxODBfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CisKKwkvL3J0bDgxODBfc2V0X21vZGUoZGV2LCBFUFJPTV9DTURfQ09ORklHKTsKKworCXBncmVnPXJlYWRfbmljX2J5dGUoZGV2LCBQR1NFTEVDVCk7CisJd3JpdGVfbmljX2J5dGUoZGV2LCBQR1NFTEVDVCwgcGdyZWcgJn4gKDE8PFBHU0VMRUNUX1BHX1NISUZUKSk7CisKKwkvL3J0bDgxODBfc2V0X21vZGUoZGV2LCBFUFJPTV9DTURfTk9STUFMKTsKKworCXdyaXRlX25pY19kd29yZChkZXYsIFJYUklOR19BRERSLHByaXYtPnJ4cmluZ2RtYSk7Cit9CisKKwordm9pZCBydGw4MTgwX3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJLy91MzIgdHhjb25mID0gMHg4MGUwMDcwNzsgLy9GSVhNRTogTWFrZSBtZSB1bmRlcnN0YW5kYWJsZQorCXU4IGNyOworCisJLy93cml0ZV9uaWNfZHdvcmQoZGV2LFRYX0NPTkYsdHhjb25mKTsKKworCXJ0bDgxODBfaXJxX2Rpc2FibGUoZGV2KTsKKworCWNyPXJlYWRfbmljX2J5dGUoZGV2LENNRCk7CisJY3IgPSBjciAmIDI7CisJY3IgPSBjciB8ICgxPDxDTURfUlNUX1NISUZUKTsKKwl3cml0ZV9uaWNfYnl0ZShkZXYsQ01ELGNyKTsKKworCWZvcmNlX3BjaV9wb3N0aW5nKGRldik7CisKKwltZGVsYXkoMjAwKTsKKworCWlmKHJlYWRfbmljX2J5dGUoZGV2LENNRCkgJiAoMTw8Q01EX1JTVF9TSElGVCkpCisJCURNRVNHVygiQ2FyZCByZXNldCB0aW1lb3V0ISIpOworCWVsc2UKKwkJRE1FU0coIkNhcmQgc3VjY2Vzc2Z1bGx5IHJlc2V0Iik7CisKKy8vI2lmbmRlZiBDT05GSUdfUlRMODE4NUIKKwlydGw4MTgwX3NldF9tb2RlKGRldixFUFJPTV9DTURfTE9BRCk7CisJZm9yY2VfcGNpX3Bvc3RpbmcoZGV2KTsKKwltZGVsYXkoMjAwKTsKKy8vI2VuZGlmCit9CisKK2lubGluZSB1MTYgaWVlZXJhdGUycnRscmF0ZShpbnQgcmF0ZSkKK3sKKwlzd2l0Y2gocmF0ZSl7CisJY2FzZSAxMDoKKwlyZXR1cm4gMDsKKwljYXNlIDIwOgorCXJldHVybiAxOworCWNhc2UgNTU6CisJcmV0dXJuIDI7CisJY2FzZSAxMTA6CisJcmV0dXJuIDM7CisJY2FzZSA2MDoKKwlyZXR1cm4gNDsKKwljYXNlIDkwOgorCXJldHVybiA1OworCWNhc2UgMTIwOgorCXJldHVybiA2OworCWNhc2UgMTgwOgorCXJldHVybiA3OworCWNhc2UgMjQwOgorCXJldHVybiA4OworCWNhc2UgMzYwOgorCXJldHVybiA5OworCWNhc2UgNDgwOgorCXJldHVybiAxMDsKKwljYXNlIDU0MDoKKwlyZXR1cm4gMTE7CisJZGVmYXVsdDoKKwlyZXR1cm4gMzsKKworCX0KK30KKworc3RhdGljIHUxNiBydGxfcmF0ZVtdID0gezEwLDIwLDU1LDExMCw2MCw5MCwxMjAsMTgwLDI0MCwzNjAsNDgwLDU0MCw3MjB9OworaW5saW5lIHUxNiBydGw4MTgwX3JhdGUycmF0ZShzaG9ydCByYXRlKQoreworCWlmIChyYXRlID4xMikgcmV0dXJuIDEwOworCXJldHVybiBydGxfcmF0ZVtyYXRlXTsKK30KK2lubGluZSB1OCBydGw4MTgwX0lzV2lyZWxlc3NCTW9kZSh1MTYgcmF0ZSkKK3sKKwlpZiggKChyYXRlIDw9IDExMCkgJiYgKHJhdGUgIT0gNjApICYmIChyYXRlICE9IDkwKSkgfHwgKHJhdGUgPT0gMjIwKSApCisJCXJldHVybiAxOworCWVsc2UgcmV0dXJuIDA7Cit9Cit1MTYgTl9EQlBTT2ZSYXRlKHUxNiBEYXRhUmF0ZSk7Cit1MTYgQ29tcHV0ZVR4VGltZSgKKwl1MTYJCUZyYW1lTGVuZ3RoLAorCXUxNgkJRGF0YVJhdGUsCisJdTgJCWJNYW5hZ2VtZW50RnJhbWUsCisJdTgJCWJTaG9ydFByZWFtYmxlCispCit7CisJdTE2CUZyYW1lVGltZTsKKwl1MTYJTl9EQlBTOworCXUxNglDZWlsaW5nOworCisJaWYoIHJ0bDgxODBfSXNXaXJlbGVzc0JNb2RlKERhdGFSYXRlKSApCisJeworCQlpZiggYk1hbmFnZW1lbnRGcmFtZSB8fCAhYlNob3J0UHJlYW1ibGUgfHwgRGF0YVJhdGUgPT0gMTAgKQorCQl7CS8vIGxvbmcgcHJlYW1ibGUKKwkJCUZyYW1lVGltZSA9ICh1MTYpKDE0NCs0OCsoRnJhbWVMZW5ndGgqOC8oRGF0YVJhdGUvMTApKSk7CisJCX0KKwkJZWxzZQorCQl7CS8vIFNob3J0IHByZWFtYmxlCisJCQlGcmFtZVRpbWUgPSAodTE2KSg3MisyNCsoRnJhbWVMZW5ndGgqOC8oRGF0YVJhdGUvMTApKSk7CisJCX0KKwkJaWYoICggRnJhbWVMZW5ndGgqOCAlIChEYXRhUmF0ZS8xMCkgKSAhPSAwICkgLy9HZXQgdGhlIENlaWxsaW5nCisJCQkJRnJhbWVUaW1lICsrOworCX0gZWxzZSB7CS8vODAyLjExZyBEU1NTLU9GRE0gUExDUCBsZW5ndGggZmllbGQgY2FsY3VsYXRpb24uCisJCU5fREJQUyA9IE5fREJQU09mUmF0ZShEYXRhUmF0ZSk7CisJCUNlaWxpbmcgPSAoMTYgKyA4KkZyYW1lTGVuZ3RoICsgNikgLyBOX0RCUFMKKwkJCQkrICgoKDE2ICsgOCpGcmFtZUxlbmd0aCArIDYpICUgTl9EQlBTKSA/IDEgOiAwKTsKKwkJRnJhbWVUaW1lID0gKHUxNikoMTYgKyA0ICsgNCpDZWlsaW5nICsgNik7CisJfQorCXJldHVybiBGcmFtZVRpbWU7Cit9Cit1MTYgTl9EQlBTT2ZSYXRlKHUxNiBEYXRhUmF0ZSkKK3sKKwkgdTE2IE5fREJQUyA9IDI0OworCisJIHN3aXRjaChEYXRhUmF0ZSkKKwkgeworCSBjYXNlIDYwOgorCSAgTl9EQlBTID0gMjQ7CisJICBicmVhazsKKworCSBjYXNlIDkwOgorCSAgTl9EQlBTID0gMzY7CisJICBicmVhazsKKworCSBjYXNlIDEyMDoKKwkgIE5fREJQUyA9IDQ4OworCSAgYnJlYWs7CisKKwkgY2FzZSAxODA6CisJICBOX0RCUFMgPSA3MjsKKwkgIGJyZWFrOworCisJIGNhc2UgMjQwOgorCSAgTl9EQlBTID0gOTY7CisJICBicmVhazsKKworCSBjYXNlIDM2MDoKKwkgIE5fREJQUyA9IDE0NDsKKwkgIGJyZWFrOworCisJIGNhc2UgNDgwOgorCSAgTl9EQlBTID0gMTkyOworCSAgYnJlYWs7CisKKwkgY2FzZSA1NDA6CisJICBOX0RCUFMgPSAyMTY7CisJICBicmVhazsKKworCSBkZWZhdWx0OgorCSAgYnJlYWs7CisJIH0KKworCSByZXR1cm4gTl9EQlBTOworfQorCisvL3tieSBhbXkgMDgwMzEyCisvLworLy8JRGVzY3JpcHRpb246CisvLyAJRm9yIE5ldGdlYXIgY2FzZSwgdGhleSB3YW50IGdvb2QtbG9va2luZyBzaW5nYWwgc3RyZW5ndGguCisvLwkJMjAwNC4xMi4wNSwgYnkgcmNuamtvLgorLy8KK2xvbmcKK05ldGdlYXJTaWduYWxTdHJlbmd0aFRyYW5zbGF0ZSgKKwlsb25nIExhc3RTUywKKwlsb25nIEN1cnJTUworCSkKK3sKKwlsb25nIFJldFNTOworCisJLy8gU3RlcCAxLiBTY2FsZSBtYXBwaW5nLgorCWlmKEN1cnJTUyA+PSA3MSAmJiBDdXJyU1MgPD0gMTAwKQorCXsKKwkJUmV0U1MgPSA5MCArICgoQ3VyclNTIC0gNzApIC8gMyk7CisJfQorCWVsc2UgaWYoQ3VyclNTID49IDQxICYmIEN1cnJTUyA8PSA3MCkKKwl7CisJCVJldFNTID0gNzggKyAoKEN1cnJTUyAtIDQwKSAvIDMpOworCX0KKwllbHNlIGlmKEN1cnJTUyA+PSAzMSAmJiBDdXJyU1MgPD0gNDApCisJeworCQlSZXRTUyA9IDY2ICsgKEN1cnJTUyAtIDMwKTsKKwl9CisJZWxzZSBpZihDdXJyU1MgPj0gMjEgJiYgQ3VyclNTIDw9IDMwKQorCXsKKwkJUmV0U1MgPSA1NCArIChDdXJyU1MgLSAyMCk7CisJfQorCWVsc2UgaWYoQ3VyclNTID49IDUgJiYgQ3VyclNTIDw9IDIwKQorCXsKKwkJUmV0U1MgPSA0MiArICgoKEN1cnJTUyAtIDUpICogMikgLyAzKTsKKwl9CisJZWxzZSBpZihDdXJyU1MgPT0gNCkKKwl7CisJCVJldFNTID0gMzY7CisJfQorCWVsc2UgaWYoQ3VyclNTID09IDMpCisJeworCQlSZXRTUyA9IDI3OworCX0KKwllbHNlIGlmKEN1cnJTUyA9PSAyKQorCXsKKwkJUmV0U1MgPSAxODsKKwl9CisJZWxzZSBpZihDdXJyU1MgPT0gMSkKKwl7CisJCVJldFNTID0gOTsKKwl9CisJZWxzZQorCXsKKwkJUmV0U1MgPSBDdXJyU1M7CisJfQorCS8vUlRfVFJBQ0UoQ09NUF9EQkcsIERCR19MT1VELCAoIiMjIyMjIEFmdGVyIE1hcHBpbmc6ICBMYXN0U1M6ICVkLCBDdXJyU1M6ICVkLCBSZXRTUzogJWRcbiIsIExhc3RTUywgQ3VyclNTLCBSZXRTUykpOworCisJLy8gU3RlcCAyLiBTbW9vdGhpbmcuCisJaWYoTGFzdFNTID4gMCkKKwl7CisJCVJldFNTID0gKChMYXN0U1MgKiA1KSArIChSZXRTUykrIDUpIC8gNjsKKwl9CisJLy9SVF9UUkFDRShDT01QX0RCRywgREJHX0xPVUQsICgiJCQkJCQgQWZ0ZXIgU21vb3RoaW5nOiAgTGFzdFNTOiAlZCwgQ3VyclNTOiAlZCwgUmV0U1M6ICVkXG4iLCBMYXN0U1MsIEN1cnJTUywgUmV0U1MpKTsKKworCXJldHVybiBSZXRTUzsKK30KKy8vCisvLwlEZXNjcmlwdGlvbjoKKy8vCQlUcmFuc2xhdGUgMC0xMDAgc2lnbmFsIHN0cmVuZ3RoIGluZGV4IGludG8gZEJtLgorLy8KK2xvbmcKK1RyYW5zbGF0ZVRvRGJtODE4NSgKKwl1OCBTaWduYWxTdHJlbmd0aEluZGV4CS8vIDAtMTAwIGluZGV4LgorCSkKK3sKKwlsb25nCVNpZ25hbFBvd2VyOyAvLyBpbiBkQm0uCisKKwkvLyBUcmFuc2xhdGUgdG8gZEJtICh4PTAuNXktOTUpLgorCVNpZ25hbFBvd2VyID0gKGxvbmcpKChTaWduYWxTdHJlbmd0aEluZGV4ICsgMSkgPj4gMSk7CisJU2lnbmFsUG93ZXIgLT0gOTU7CisKKwlyZXR1cm4gU2lnbmFsUG93ZXI7Cit9CisvLworLy8JRGVzY3JpcHRpb246CisvLwkJUGVyZm9ybSBzaWduYWwgc21vb3RoaW5nIGZvciBkeW5hbWljIG1lY2hhbmlzbS4KKy8vCQlUaGlzIGlzIGRpZmZlcmVudCB3aXRoIFBlcmZvcm1TaWduYWxTbW9vdGhpbmc4MTg1IGluIHNtb290aGluZyBmb211bGEuCisvLwkJTm8gZHJhbWF0aWMgYWRqdXN0aW9uIGlzIGFwcGx5IGJlY2F1c2UgZHluYW1pYyBtZWNoYW5pc20gbmVlZCBzb21lIGRlZ3JlZQorLy8JCW9mIGNvcnJlY3RuZXNzLiBQb3J0ZWQgZnJvbSA4MTg3Qi4KKy8vCTIwMDctMDItMjYsIGJ5IEJydWNlLgorLy8KK3ZvaWQKK1BlcmZvcm1VbmRlY29yYXRlZFNpZ25hbFNtb290aGluZzgxODUoCisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYsCisJYm9vbCAgICBiQ2NrUmF0ZQorCSkKK3sKKworCisJLy8gRGV0ZXJtaW4gdGhlIGN1cnJlbnQgcGFja2V0IGlzIENDSyByYXRlLgorCXByaXYtPmJDdXJDQ0tQa3QgPSBiQ2NrUmF0ZTsKKworCWlmKHByaXYtPlVuZGVjb3JhdGVkU21vb3RoZWRTUyA+PSAwKQorCXsKKwkJcHJpdi0+VW5kZWNvcmF0ZWRTbW9vdGhlZFNTID0gKCAocHJpdi0+VW5kZWNvcmF0ZWRTbW9vdGhlZFNTICogNSkgKyAocHJpdi0+U2lnbmFsU3RyZW5ndGggKiAxMCkgKSAvIDY7CisJfQorCWVsc2UKKwl7CisJCXByaXYtPlVuZGVjb3JhdGVkU21vb3RoZWRTUyA9IHByaXYtPlNpZ25hbFN0cmVuZ3RoICogMTA7CisJfQorCisJcHJpdi0+VW5kZXJjb3JhdGVTbW9vdGhlZFJ4UG93ZXIgPSAoIChwcml2LT5VbmRlcmNvcmF0ZVNtb290aGVkUnhQb3dlciAqIDUwKSArIChwcml2LT5SeFBvd2VyKiAxMSkpIC8gNjA7CisKKy8vCXByaW50aygiU29tbXRoaW5nIFNpZ25hbFN0ZXJuZ3RoICglZCkgPT4gVW5kZWNvcmF0ZWRTbW9vdGhlZFNTICglZClcbiIsIHByaXYtPlNpZ25hbFN0cmVuZ3RoLCBwcml2LT5VbmRlY29yYXRlZFNtb290aGVkU1MpOworLy8JcHJpbnRrKCJTb21tdGhpbmcgUnhQb3dlciAoJWQpID0+IFVuZGVjb3JhdGVkUnhQb3dlciAoJWQpXG4iLCBwcml2LT5SeFBvd2VyLCBwcml2LT5VbmRlcmNvcmF0ZVNtb290aGVkUnhQb3dlcik7CisKKwkvL2lmKHByaXYtPkN1ckNDS1JTU0kgPj0gMCAmJiBiQ2NrUmF0ZSkKKwlpZihiQ2NrUmF0ZSkKKwl7CisJCXByaXYtPkN1ckNDS1JTU0kgPSBwcml2LT5SU1NJOworCX0KKwllbHNlCisJeworCQlwcml2LT5DdXJDQ0tSU1NJID0gMDsKKwl9CisKKwkvLyBCb3VuZGFyeSBjaGVja2luZy4KKwkvLyBUT0RPOiBUaGUgb3ZlcmZsb3cgY29uZGl0aW9uIGRvZXMgaGFwcGVuLCBpZiB3ZSB3YW50IHRvIGZpeCwKKwkvLyB3ZSBzaGFsbCByZWNhbGN1bGF0ZSB0aHJlc2hvbGRzIGZpcnN0LgorCWlmKHByaXYtPlVuZGVjb3JhdGVkU21vb3RoZWRTUyA+IDEwMCkKKwl7CisvLwkJcHJpbnRrKCJVbmRlY29yYXRlZFNtb290aGVkU1MoJWQpIG92ZXJmbG93LCBTaWduYWxTdHJlbmd0aCglZClcbiIsIHByaXYtPlVuZGVjb3JhdGVkU21vb3RoZWRTUywgcHJpdi0+U2lnbmFsU3RyZW5ndGgpOworCX0KKwlpZihwcml2LT5VbmRlY29yYXRlZFNtb290aGVkU1MgPCAwKQorCXsKKy8vCQlwcmludGsoIlVuZGVjb3JhdGVkU21vb3RoZWRTUyglZCkgdW5kZXJmbG93LCBTaWduYWxTdHJlbmd0aCglZClcbiIsIHByaXYtPlVuZGVjb3JhdGVkU21vb3RoZWRTUywgcHJpdi0+U2lnbmFsU3RyZW5ndGgpOworCX0KKworfQorCisvL2J5IGFteSAwODAzMTJ9CisKKy8qIFRoaXMgaXMgcm91Z2ggUlggaXNyIGhhbmRsaW5nIHJvdXRpbmUqLwordm9pZCBydGw4MTgwX3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTgwX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOworCXN0cnVjdCBza19idWZmICp0bXBfc2tiOworCisJLy9zdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXNob3J0IGZpcnN0LGxhc3Q7CisJdTMyIGxlbjsKKwlpbnQgbGFzdGxlbjsKKwl1bnNpZ25lZCBjaGFyIHF1YWxpdHksIHNpZ25hbDsKKwl1OCByYXRlOworCS8vdTMyICpwcmlzbV9oZHI7CisJdTMyICp0bXAsKnRtcDI7CisJdTggcnhfZGVzY19zaXplOworCXU4IHBhZGRpbmc7CisJLy91MzIgY291bnQ9MDsKKwljaGFyIHJ4cG93ZXIgPSAwOworCXUzMiBSWEFHQyA9IDA7CisJbG9uZyBSeEFHQ19kQm0gPSAwOworCXU4CUxOQT0wLCBCQj0wOworCXU4IAlMTkFfZ2Fpbls0XT17MDIsIDE3LCAyOSwgMzl9OworCXU4ICBBbnRlbm5hID0gMDsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyOy8vYnkgYW15CisJdTE2IGZjLHR5cGU7CisJdTggYkh3RXJyb3IgPSAwLGJDUkMgPSAwLGJJQ1YgPSAwOworCS8vYkh3RXJyb3IgPSAwOworCS8vYkNSQyA9IDA7CisJLy9iSUNWID0gMDsKKwlib29sCWJDY2tSYXRlID0gZmFsc2U7CisJdTggICAgIFJTU0kgPSAwOworCWxvbmcJU2lnbmFsU3RyZW5ndGhJbmRleCA9IDA7Ly8rYnkgYW15IDA4MDMxMgorLy8JdTggU2lnbmFsU3RyZW5ndGggPSAwOworCXN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHMgc3RhdHMgPSB7CisJCS5zaWduYWwgPSAwLAorCQkubm9pc2UgPSAtOTgsCisJCS5yYXRlID0gMCwKKwkvLwkubWFjX3RpbWUgPSBqaWZmaWVzLAorCQkuZnJlcSA9IElFRUU4MDIxMV8yNEdIWl9CQU5ELAorCX07CisKKyNpZmRlZiBDT05GSUdfUlRMODE4NUIKKwlzdGF0cy5uaWNfdHlwZSA9IE5JQ184MTg1QjsKKwlyeF9kZXNjX3NpemUgPSA4OworCisjZWxzZQorCXN0YXRzLm5pY190eXBlID0gTklDXzgxODU7CisJcnhfZGVzY19zaXplID0gNDsKKyNlbmRpZgorCS8vcHJpbnRrKCJyZWNlaXZlIGZyYW1lISVkXG4iLGNvdW50KyspOworCS8vaWYgKCFwcml2LT5yeGJ1ZmZlcikgRE1FU0cgKCJFRTogTklDIFJYIGFjaywgYnV0IFJYIHF1ZXVlIGNvcnJ1cHRlZCEiKTsKKwkvL2Vsc2UgeworCisJaWYgKCgqKHByaXYtPnJ4cmluZ3RhaWwpKSAmICgxPDwzMSkpIHsKKworCQkvKiB3ZSBoYXZlIGdvdCBhbiBSWCBpbnQsIGJ1dCB0aGUgZGVzY3JpcHRvcgorCQkgKiB3ZSBhcmUgcG9pbnRpbmcgaXMgZW1wdHkqLworCisJCXByaXYtPnN0YXRzLnJ4bm9kYXRhKys7CisJCXByaXYtPmllZWU4MDIxMS0+c3RhdHMucnhfZXJyb3JzKys7CisKKwkvKglpZiAoISAqKHByaXYtPnJ4cmluZykgJiAoMTw8MzEpKSB7CisKKwkJCXByaXYtPnN0YXRzLnJ4cmVzZXQrKzsKKwkJCXByaXYtPnJ4cmluZ3RhaWw9cHJpdi0+cnhyaW5nOworCQkJcHJpdi0+cnhidWZmZXI9cHJpdi0+cnhidWZmZXJoZWFkOworCisJCX1lbHNleyovCisKKwkJI2lmIDAKKwkJLyogTWF5YmUgaXQgaXMgcG9zc2libGUgdGhhdCB0aGUgTklDIGhhcyBza2lwcGVkIHNvbWUgZGVzY3JpcHRvcnMgb3IKKwkJICogaXQgaGFzIHJlc2V0IGl0cyBpbnRlcm5hbCBwb2ludGVyIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHJpbmcKKwkJICogd2Ugc2VhcmNoIGZvciB0aGUgZmlyc3QgZmlsbGVkIGRlc2NyaXB0b3IgaW4gdGhlIHJpbmcsIG9yIHdlIGJyZWFrCisJCSAqIHB1dHRpbmcgYWdhaW4gdGhlIHBvaW50ZXIgaW4gdGhlIG9sZCBsb2NhdGlvbiBpZiB3ZSBkbyBub3QgZm91bmQgYW55LgorCQkgKiBUaGlzIGlzIHF1aXRlIGRhbmdlcm91cywgd2hhdCBkb2VzIGhhcHBlbiBpZiB0aGUgbmljIHdyaXRlcworCQkgKiB0d28gZGVzY3JpcHRvciAoc2F5IEEgYW5kIEIpIHdoZW4gd2UgaGF2ZSBqdXN0IGNoZWNrZWQgdGhlIGRlc2NyaXB0b3IKKwkJICogQSBhbmQgd2UgYXJlIGdvaW5nIHRvIGNoZWNrIHRoZSBkZXNjcmlwdG9yIEIuLlRoaXMgbWlnaHQgaGFwcGVuIGlmIHRoZQorCQkgKiBpbnRlcnJ1cHQgd2FzIGR1bW15LCB0aGVyZSB3YXMgbm90IHJlYWxseSBmaWxsZWQgZGVzY3JpcHRvcnMgYW5kCisJCSAqIHRoZSBOSUMgZGlkbid0IGxvc2UgcG9pbnRlcgorCQkgKi8KKworCQkvL3ByaXYtPnN0YXRzLnJ4d3JrYXJvdW5kKys7CisKKwkJdG1wID0gcHJpdi0+cnhyaW5ndGFpbDsKKwkJd2hpbGUgKCoocHJpdi0+cnhyaW5ndGFpbCkgJiAoMTw8MzEpKXsKKworCQkJcHJpdi0+cnhyaW5ndGFpbCs9NDsKKworCQkJaWYocHJpdi0+cnhyaW5ndGFpbCA+PQorCQkJCShwcml2LT5yeHJpbmcpKyhwcml2LT5yeHJpbmdjb3VudCApKjQpCisJCQkJcHJpdi0+cnhyaW5ndGFpbD1wcml2LT5yeHJpbmc7CisKKwkJCXByaXYtPnJ4YnVmZmVyPShwcml2LT5yeGJ1ZmZlci0+bmV4dCk7CisKKwkJCWlmKHByaXYtPnJ4cmluZ3RhaWwgPT0gdG1wICl7CisJCQkJLy9ETUVTRygiRUU6IENvdWxkIG5vdCBmaW5kIFJYIHBvaW50ZXIiKTsKKwkJCQlwcml2LT5zdGF0cy5yeG5vcG9pbnRlcisrOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCSNlbHNlCisKKwkJdG1wMiA9IE5VTEw7CisJCXRtcCA9IHByaXYtPnJ4cmluZ3RhaWw7CisJCWRveworCQkJaWYodG1wID09IHByaXYtPnJ4cmluZykKKwkJCQkvL3RtcCAgPSBwcml2LT5yeHJpbmcgKyAocHJpdi0+cnhyaW5nY291bnQgKSpyeF9kZXNjX3NpemU7IHhpb25nLTIwMDYtMTEtMTUKKwkJCQl0bXAgID0gcHJpdi0+cnhyaW5nICsgKHByaXYtPnJ4cmluZ2NvdW50IC0gMSkqcnhfZGVzY19zaXplOworCQkJZWxzZQorCQkJCXRtcCAtPSByeF9kZXNjX3NpemU7CisKKwkJCWlmKCEgKCp0bXAgJiAoMTw8MzEpKSkKKwkJCQl0bXAyID0gdG1wOworCQl9d2hpbGUodG1wICE9IHByaXYtPnJ4cmluZyk7CisKKwkJaWYodG1wMikgcHJpdi0+cnhyaW5ndGFpbCA9IHRtcDI7CisJCSNlbmRpZgorCQkvL30KKwl9CisKKwkvKiB3aGlsZSB0aGVyZSBhcmUgZmlsbGVkIGRlc2NyaXB0b3JzICovCisJd2hpbGUoISgqKHByaXYtPnJ4cmluZ3RhaWwpICYgKDE8PDMxKSkpeworCQlpZigqKHByaXYtPnJ4cmluZ3RhaWwpICYgKDE8PDI2KSkKKwkJCURNRVNHVygiUlggYnVmZmVyIG92ZXJmbG93Iik7CisJCWlmKCoocHJpdi0+cnhyaW5ndGFpbCkgJiAoMTw8MTIpKQorCQkJcHJpdi0+c3RhdHMucnhpY3ZlcnIrKzsKKworCQlpZigqKHByaXYtPnJ4cmluZ3RhaWwpICYgKDE8PDI3KSl7CisJCQlwcml2LT5zdGF0cy5yeGRtYWZhaWwrKzsKKwkJCS8vRE1FU0coIkVFOiBSWCBETUEgRkFJTEVEIGF0IGJ1ZmZlciBwb2ludGVkIGJ5IGRlc2NyaXB0b3IgJXgiLCh1MzIpcHJpdi0+cnhyaW5ndGFpbCk7CisJCQlnb3RvIGRyb3A7CisJCX0KKworCQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUocHJpdi0+cGRldiwKKwkJCQkgICAgcHJpdi0+cnhidWZmZXItPmRtYSwKKwkJCQkgICAgcHJpdi0+cnhidWZmZXJzaXplICogXAorCQkJCSAgICBzaXplb2YodTgpLAorCQkJCSAgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCisJCWZpcnN0ID0gKihwcml2LT5yeHJpbmd0YWlsKSAmICgxPDwyOSkgPyAxOjA7CisJCWlmKGZpcnN0KSBwcml2LT5yeF9wcmV2bGVuPTA7CisKKwkJbGFzdCA9ICoocHJpdi0+cnhyaW5ndGFpbCkgJiAoMTw8MjgpID8gMTowOworCQlpZihsYXN0KXsKKwkJCWxhc3RsZW49KCgqcHJpdi0+cnhyaW5ndGFpbCkgJjB4ZmZmKTsKKworCQkJLyogaWYgdGhlIGxhc3QgZGVzY3JpcHRvciAodGhhdCBzaG91bGQKKwkJCSAqIHRlbGwgdXMgdGhlIHRvdGFsIHBhY2tldCBsZW4pIHRlbGwKKwkJCSAqIHVzIHNvbWV0aGluZyBsZXNzIHRoYW4gdGhlIGRlc2NyaXB0b3JzCisJCQkgKiBsZW4gd2UgaGFkIHVudGlsIG5vdywgdGhlbiB0aGVyZSBpcyBzb21lCisJCQkgKiBwcm9ibGVtLi4KKwkJCSAqIHdvcmthcm91bmQgdG8gcHJldmVudCBrZXJuZWwgcGFuaWMKKwkJCSAqLworCQkJaWYobGFzdGxlbiA8IHByaXYtPnJ4X3ByZXZsZW4pCisJCQkJbGVuPTA7CisJCQllbHNlCisJCQkJbGVuPWxhc3RsZW4tcHJpdi0+cnhfcHJldmxlbjsKKworCQkJaWYoKihwcml2LT5yeHJpbmd0YWlsKSAmICgxPDwxMykpIHsKKy8vbGFzdGxlbj0oKCpwcml2LT5yeHJpbmd0YWlsKSAmMHhmZmYpOworCQkJCWlmICgoKihwcml2LT5yeHJpbmd0YWlsKSAmIDB4ZmZmKSA8NTAwKQorCQkJCQlwcml2LT5zdGF0cy5yeGNyY2Vycm1pbisrOworCQkJCWVsc2UgaWYgKCgqKHByaXYtPnJ4cmluZ3RhaWwpICYgMHgwZmZmKSA+MTAwMCkKKwkJCQkJcHJpdi0+c3RhdHMucnhjcmNlcnJtYXgrKzsKKwkJCQllbHNlCisJCQkJCXByaXYtPnN0YXRzLnJ4Y3JjZXJybWlkKys7CisKKwkJCX0KKworCQl9ZWxzZXsKKwkJCWxlbiA9IHByaXYtPnJ4YnVmZmVyc2l6ZTsKKwkJfQorCisjaWZkZWYgQ09ORklHX1JUTDgxODVCCisJCWlmKGZpcnN0ICYmIGxhc3QpIHsKKwkJCXBhZGRpbmcgPSAoKCoocHJpdi0+cnhyaW5ndGFpbCszKSkmKDB4MDQwMDAwMDApKT4+MjY7CisJCX1lbHNlIGlmKGZpcnN0KSB7CisJCQlwYWRkaW5nID0gKCgqKHByaXYtPnJ4cmluZ3RhaWwrMykpJigweDA0MDAwMDAwKSk+PjI2OworCQkJaWYocGFkZGluZykgeworCQkJCWxlbiAtPSAyOworCQkJfQorCQl9ZWxzZSB7CisJCQlwYWRkaW5nID0gMDsKKwkJfQorI2lmZGVmIENPTkZJR19SVEw4MThYX1MKKyAgICAgICAgICAgICAgIHBhZGRpbmcgPSAwOworI2VuZGlmCisjZW5kaWYKKwkJcHJpdi0+cnhfcHJldmxlbis9bGVuOworCisJCWlmKHByaXYtPnJ4X3ByZXZsZW4gPiBNQVhfRlJBR19USFJFU0hPTEQgKyAxMDApeworCQkJLyogSFcgaXMgcHJvYmFibHkgcGFzc2luZyBzZXZlcmFsIGJ1Z2d5IGZyYW1lcworCQkJKiB3aXRob3V0IEZEIG9yIExEIGZsYWcgc2V0LgorCQkJKiBUaHJvdyB0aGlzIGdhcmJhZ2UgYXdheSB0byBwcmV2ZW50IHNrYgorCQkJKiBtZW1vcnkgZXhhdXN0aW5nCisJCQkqLworCQkJaWYoIXByaXYtPnJ4X3NrYl9jb21wbGV0ZSkKKwkJCQlkZXZfa2ZyZWVfc2tiX2FueShwcml2LT5yeF9za2IpOworCQkJcHJpdi0+cnhfc2tiX2NvbXBsZXRlID0gMTsKKwkJfQorCisjaWZkZWYgREVCVUdfUlhfRlJBRworCQlETUVTRygiSXRlcmF0aW9uLi4gbGVuICV4IixsZW4pOworCQlpZihmaXJzdCkgRE1FU0cgKCJGaXJzdCBkZXNjcmlwdG9yIik7CisJCWlmKGxhc3QpIERNRVNHKCJMYXN0IGRlc2NyaXB0b3IiKTsKKworI2VuZGlmCisjaWZkZWYgREVCVUdfUlhfVkVSQk9TRQorCQlwcmludF9idWZmZXIoIHByaXYtPnJ4YnVmZmVyLT5idWYsIGxlbik7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19SVEw4MTg1QgorCQlzaWduYWw9KHVuc2lnbmVkIGNoYXIpKCgoKihwcml2LT5yeHJpbmd0YWlsKzMpKSYgKDB4MDBmZjAwMDApKT4+MTYpOworCQlzaWduYWw9KHNpZ25hbCYweGZlKT4+MTsJLy8gTW9kaWZ5IGJ5IGhpa2FydSA2LjYKKworCQlxdWFsaXR5PSh1bnNpZ25lZCBjaGFyKSgoKihwcml2LT5yeHJpbmd0YWlsKzMpKSAmICgweGZmKSk7CisKKwkJc3RhdHMubWFjX3RpbWVbMF0gPSAqKHByaXYtPnJ4cmluZ3RhaWwrMSk7CisJCXN0YXRzLm1hY190aW1lWzFdID0gKihwcml2LT5yeHJpbmd0YWlsKzIpOworCQlyeHBvd2VyID0oKGNoYXIpKCgoKihwcml2LT5yeHJpbmd0YWlsKzQpKSYgKDB4MDBmZjAwMDApKT4+MTYpKS8yIC0gNDI7CisJCVJTU0kgPSAoKHU4KSgoKCoocHJpdi0+cnhyaW5ndGFpbCszKSkgJiAoMHgwMDAwZmYwMCkpPj4gOCkpICYgKDB4N2YpOworCisjZWxzZQorCQlzaWduYWw9KCgqKHByaXYtPnJ4cmluZ3RhaWwrMSkpJiAoMHhmZjAwMDApKT4+MTY7CisJCXNpZ25hbD0oc2lnbmFsJjB4ZmUpPj4xOwkvLyBNb2RpZnkgYnkgaGlrYXJ1IDYuNgorCisJCXF1YWxpdHk9KCgqKHByaXYtPnJ4cmluZ3RhaWwrMSkpICYgKDB4ZmYpKTsKKworCQlzdGF0cy5tYWNfdGltZVswXSA9ICoocHJpdi0+cnhyaW5ndGFpbCsyKTsKKwkJc3RhdHMubWFjX3RpbWVbMV0gPSAqKHByaXYtPnJ4cmluZ3RhaWwrMyk7CisjZW5kaWYKKwkJcmF0ZT0oKCoocHJpdi0+cnhyaW5ndGFpbCkpICYKKwkJCSgoMTw8MjMpfCgxPDwyMil8KDE8PDIxKXwoMTw8MjApKSk+PjIwOworCisJCXN0YXRzLnJhdGUgPSBydGw4MTgwX3JhdGUycmF0ZShyYXRlKTsKKwkJLy9ETUVTRygiJWQiLHJhdGUpOworCQlBbnRlbm5hID0gKCgoKihwcml2LT5yeHJpbmd0YWlsICszKSkmICgweDAwMDA4MDAwKSkgPT0gMCApPyAwOjEgOworLy8JCXByaW50aygiaW4gcnRsODE4MF9yeCgpOkFudGVubmEgaXMgJWRcbiIsQW50ZW5uYSk7CisvL2J5IGFteSBmb3IgYW50ZW5uYQorCQlpZighcnRsODE4MF9Jc1dpcmVsZXNzQk1vZGUoc3RhdHMucmF0ZSkpCisJCXsgLy8gT0ZETSByYXRlLgorCisJCQlSeEFHQ19kQm0gPSByeHBvd2VyKzE7CS8vYmlhcworCQl9CisJCWVsc2UKKwkJeyAvLyBDQ0sgcmF0ZS4KKwkJCVJ4QUdDX2RCbSA9IHNpZ25hbDsvL2JpdCAwIGRpc2NhcmQKKworCQkJTE5BID0gKHU4KSAoUnhBR0NfZEJtICYgMHg2MCApID4+IDUgOyAvL2JpdCA2fiBiaXQgNQorCQkJQkIgID0gKHU4KSAoUnhBR0NfZEJtICYgMHgxRik7ICAvLyBiaXQgNCB+IGJpdCAwCisKKyAgIAkJCVJ4QUdDX2RCbSA9IC0oIExOQV9nYWluW0xOQV0gKyAoQkIgKjIpICk7IC8vUGluXzExYj0tKExOQV9nYWluK0JCX2dhaW4pIChkQm0pCisKKwkJCVJ4QUdDX2RCbSArPTQ7IC8vYmlhcworCQl9CisKKwkJaWYoUnhBR0NfZEJtICYgMHg4MCkgLy9hYnNvbHV0ZSB2YWx1ZQorICAgCQkJUlhBR0M9IH4oUnhBR0NfZEJtKSsxOworCQliQ2NrUmF0ZSA9IHJ0bDgxODBfSXNXaXJlbGVzc0JNb2RlKHN0YXRzLnJhdGUpOworCQkvLyBUcmFuc2xhdGUgUlhBR0MgaW50byAxLTEwMC4KKwkJaWYoIXJ0bDgxODBfSXNXaXJlbGVzc0JNb2RlKHN0YXRzLnJhdGUpKQorCQl7IC8vIE9GRE0gcmF0ZS4KKwkJCWlmKFJYQUdDPjkwKQorCQkJCVJYQUdDPTkwOworCQkJZWxzZSBpZihSWEFHQzwyNSkKKwkJCQlSWEFHQz0yNTsKKwkJCVJYQUdDPSg5MC1SWEFHQykqMTAwLzY1OworCQl9CisJCWVsc2UKKwkJeyAvLyBDQ0sgcmF0ZS4KKwkJCWlmKFJYQUdDPjk1KQorCQkJCVJYQUdDPTk1OworCQkJZWxzZSBpZihSWEFHQzwzMCkKKwkJCQlSWEFHQz0zMDsKKwkJCVJYQUdDPSg5NS1SWEFHQykqMTAwLzY1OworCQl9CisJCXByaXYtPlNpZ25hbFN0cmVuZ3RoID0gKHU4KVJYQUdDOworCQlwcml2LT5SZWN2U2lnbmFsUG93ZXIgPSBSeEFHQ19kQm0gOyAgLy8gSXQgY2FuIHVzZSBkaXJlY3RseSBieSBTRDMgQ01MaW4KKwkJcHJpdi0+UnhQb3dlciA9IHJ4cG93ZXI7CisJCXByaXYtPlJTU0kgPSBSU1NJOworLy97YnkgYW15IDA4MDMxMgorCQkvLyBTUSB0cmFuc2xhdGlvbiBmb3JtdWxhciBpcyBwcm92aWRlZCBieSBTRDMgRFouIDIwMDYuMDYuMjcsIGJ5IHJjbmprby4KKwkJaWYocXVhbGl0eSA+PSAxMjcpCisJCQlxdWFsaXR5ID0gMTsvLzA7IC8vMCB3aWxsIGNhdXNlIGVwYyB0byBzaG93IHNpZ25hbCB6ZXJvICwgd2FsayBhcm91ZCBub3c7CisJCWVsc2UgaWYocXVhbGl0eSA8IDI3KQorCQkJcXVhbGl0eSA9IDEwMDsKKwkJZWxzZQorCQkJcXVhbGl0eSA9IDEyNyAtIHF1YWxpdHk7CisJCXByaXYtPlNpZ25hbFF1YWxpdHkgPSBxdWFsaXR5OworCQlpZighcHJpdi0+Y2FyZF84MTg1KQorCQkJcHJpbnRrKCJjaGVjayB5b3VyIGNhcmQgdHlwZVxuIik7CisKKwkJc3RhdHMuc2lnbmFsID0gKHU4KXF1YWxpdHk7Ly9wcml2LT53c3RhdHMucXVhbC5sZXZlbCA9IHByaXYtPlNpZ25hbFN0cmVuZ3RoOworCQlzdGF0cy5zaWduYWxzdHJlbmd0aCA9IFJYQUdDOworCQlpZihzdGF0cy5zaWduYWxzdHJlbmd0aCA+IDEwMCkKKwkJCXN0YXRzLnNpZ25hbHN0cmVuZ3RoID0gMTAwOworCQlzdGF0cy5zaWduYWxzdHJlbmd0aCA9IChzdGF0cy5zaWduYWxzdHJlbmd0aCAqIDcwKS8xMDAgKyAzMDsKKwkvLwlwcmludGsoIj09PT09PT09PT09PT09PT09PT09PT09PT09PnJ4IDogUlhBR0MgaXMgJWQsc2lnbmFsc3RyZW5ndGggaXMgJWRcbiIsUlhBR0Msc3RhdHMuc2lnbmFsc3RyZW5ndGgpOworCQlzdGF0cy5yc3NpID0gcHJpdi0+d3N0YXRzLnF1YWwucXVhbCA9IHByaXYtPlNpZ25hbFF1YWxpdHk7CisJCXN0YXRzLm5vaXNlID0gcHJpdi0+d3N0YXRzLnF1YWwubm9pc2UgPSAxMDAgLSBwcml2IC0+d3N0YXRzLnF1YWwucXVhbDsKKy8vYnkgYW15IDA4MDMxMn0KKwkJYkh3RXJyb3IgPSAoKCgqKHByaXYtPnJ4cmluZ3RhaWwpKSYgKDB4MDAwMDBmZmYpKSA9PSA0MDgwKXwgKCgoKihwcml2LT5yeHJpbmd0YWlsKSkmICgweDA0MDAwMDAwKSkgIT0gMCApCisJCQl8ICgoKCoocHJpdi0+cnhyaW5ndGFpbCkpJiAoMHgwODAwMDAwMCkpICE9IDAgKXwgKCgofigqKHByaXYtPnJ4cmluZ3RhaWwpKSkmICgweDEwMDAwMDAwKSkgIT0gMCApfCAoKCh+KCoocHJpdi0+cnhyaW5ndGFpbCkpKSYgKDB4MjAwMDAwMDApKSAhPSAwICk7CisJCWJDUkMgPSAoKCoocHJpdi0+cnhyaW5ndGFpbCkpICYgKDB4MDAwMDIwMDApKSA+PiAxMzsKKwkJYklDViA9ICgoKihwcml2LT5yeHJpbmd0YWlsKSkgJiAoMHgwMDAwMTAwMCkpID4+IDEyOworICAgICAgICAgICAgaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopcHJpdi0+cnhidWZmZXItPmJ1ZjsKKwkJICAgIGZjID0gbGUxNl90b19jcHUoaGRyLT5mcmFtZV9jdGwpOworCSAgICAgICAgdHlwZSA9IFdMQU5fRkNfR0VUX1RZUEUoZmMpOworCisJCQlpZigoSUVFRTgwMjExX0ZUWVBFX0NUTCAhPSB0eXBlKSAmJgorCQkJCShlcU1hY0FkZHIocHJpdi0+aWVlZTgwMjExLT5jdXJyZW50X25ldHdvcmsuYnNzaWQsIChmYyAmIElFRUU4MDIxMV9GQ1RMX1RPRFMpPyBoZHItPmFkZHIxIDogKGZjICYgSUVFRTgwMjExX0ZDVExfRlJPTURTICk/IGhkci0+YWRkcjIgOiBoZHItPmFkZHIzKSkKKwkJCQkgJiYgKCFiSHdFcnJvcikgJiYgKCFiQ1JDKSYmICghYklDVikpCisJCQl7CisvL2J5IGFteSAwODAzMTIKKwkJCQkvLyBQZXJmb3JtIHNpZ25hbCBzbW9vdGhpbmcgZm9yIGR5bmFtaWMgbWVjaGFuaXNtIG9uIGRlbWFuZC4KKwkJCQkvLyBUaGlzIGlzIGRpZmZlcmVudCB3aXRoIFBlcmZvcm1TaWduYWxTbW9vdGhpbmc4MTg1IGluIHNtb290aGluZyBmb211bGEuCisJCQkJLy8gTm8gZHJhbWF0aWMgYWRqdXN0aW9uIGlzIGFwcGx5IGJlY2F1c2UgZHluYW1pYyBtZWNoYW5pc20gbmVlZCBzb21lIGRlZ3JlZQorCQkJCS8vIG9mIGNvcnJlY3RuZXNzLiAyMDA3LjAxLjIzLCBieSBzaGllbiBjaGFuZy4KKwkJCQlQZXJmb3JtVW5kZWNvcmF0ZWRTaWduYWxTbW9vdGhpbmc4MTg1KHByaXYsYkNja1JhdGUpOworCQkJCS8vCisJCQkJLy8gRm9yIGdvb2QtbG9va2luZyBzaW5nYWwgc3RyZW5ndGguCisJCQkJLy8KKwkJCQlTaWduYWxTdHJlbmd0aEluZGV4ID0gTmV0Z2VhclNpZ25hbFN0cmVuZ3RoVHJhbnNsYXRlKAorCQkJCQkJCQlwcml2LT5MYXN0U2lnbmFsU3RyZW5ndGhJblBlcmNlbnQsCisJCQkJCQkJCXByaXYtPlNpZ25hbFN0cmVuZ3RoKTsKKworCQkJCXByaXYtPkxhc3RTaWduYWxTdHJlbmd0aEluUGVyY2VudCA9IFNpZ25hbFN0cmVuZ3RoSW5kZXg7CisJCQkJcHJpdi0+U3RhdHNfU2lnbmFsU3RyZW5ndGggPSBUcmFuc2xhdGVUb0RibTgxODUoKHU4KVNpZ25hbFN0cmVuZ3RoSW5kZXgpOworCQkvLworCQkvLyBXZSBuZWVkIG1vcmUgY29ycmVjdCBwb3dlciBvZiByZWNlaXZlZCBwYWNrZXRzIGFuZCB0aGUgICJTaWduYWxTdHJlbmd0aCIgb2YgUnhTdGF0cyBpcyBiZWF1dGlmaWVkLAorCQkvLyBzbyB3ZSByZWNvcmQgdGhlIGNvcnJlY3QgcG93ZXIgaGVyZS4KKwkJLy8KKwkJCQlwcml2LT5TdGF0c19TaWduYWxRdWFsaXR5ID0obG9uZykgKHByaXYtPlN0YXRzX1NpZ25hbFF1YWxpdHkgKiA1ICsgKGxvbmcpcHJpdi0+U2lnbmFsUXVhbGl0eSArIDUpIC8gNjsKKwkJCQlwcml2LT5TdGF0c19SZWN2U2lnbmFsUG93ZXIgPSAobG9uZykocHJpdi0+U3RhdHNfUmVjdlNpZ25hbFBvd2VyICogNSArIHByaXYtPlJlY3ZTaWduYWxQb3dlciAtMSkgLyA2OworCisJCS8vIEZpZ3VyZSBvdXQgd2hpY2ggYW50ZW5uYSB0aGF0IHJlY2VpdmVkIHRoZSBsYXN0ZWQgcGFja2V0LgorCQkJCXByaXYtPkxhc3RSeFBrdEFudGVubmEgPSBBbnRlbm5hID8gMSA6IDA7IC8vIDA6IGF1eCwgMTogbWFpbi4KKy8vYnkgYW15IDA4MDMxMgorCQkJICAgIFN3QW50ZW5uYURpdmVyc2l0eVJ4T2s4MTg1KGRldiwgcHJpdi0+U2lnbmFsU3RyZW5ndGgpOworCQkJfQorCisvL2J5IGFteSBmb3IgYW50ZW5uYQorCisKKworCisKKworI2lmbmRlZiBEVU1NWV9SWAorCQlpZihmaXJzdCl7CisJCQlpZighcHJpdi0+cnhfc2tiX2NvbXBsZXRlKXsKKwkJCQkvKiBzZWVtcyB0aGF0IEhXIHNvbWV0aW1lcyBmYWlscyB0byByZWljZXZlIGFuZAorCQkJCSAgIGRvZXNuJ3QgcHJvdmlkZSB0aGUgbGFzdCBkZXNjcmlwdG9yICovCisjaWZkZWYgREVCVUdfUlhfU0tCCisJCQkJRE1FU0coImdvaW5nIHRvIGZyZWUgaW5jb21wbGV0ZSBza2IiKTsKKyNlbmRpZgorCQkJCWRldl9rZnJlZV9za2JfYW55KHByaXYtPnJ4X3NrYik7CisJCQkJcHJpdi0+c3RhdHMucnhub2xhc3QrKzsKKyNpZmRlZiBERUJVR19SWF9TS0IKKwkJCQlETUVTRygiZnJlZSBpbmNvbXBsZXRlIHNrYiBPSyIpOworI2VuZGlmCisJCQl9CisJCQkvKiBzdXBwb3J0IGZvciBwcmlzbSBoZWFkZXIgaGFzIGJlZW4gb3JpZ2luYWxseSBhZGRlZCBieSBDaHJpc3RpYW4gKi8KKwkJCWlmKHByaXYtPnByaXNtX2hkciAmJiBwcml2LT5pZWVlODAyMTEtPml3X21vZGUgPT0gSVdfTU9ERV9NT05JVE9SKXsKKworI2lmIDAKKwkJCQlwcml2LT5yeF9za2IgPSBkZXZfYWxsb2Nfc2tiKGxlbisyK1BSSVNNX0hEUl9TSVpFKTsKKwkJCQlpZighIHByaXYtPnJ4X3NrYikgZ290byBkcm9wOworCisJCQkJcHJpc21faGRyID0gKHUzMiopIHNrYl9wdXQocHJpdi0+cnhfc2tiLFBSSVNNX0hEUl9TSVpFKTsKKwkJCQlwcmlzbV9oZHJbMF09aHRvbmwoMHg4MDIxMTAwMSk7ICAgICAgICAvL3ZlcnNpb24KKwkJCQlwcmlzbV9oZHJbMV09aHRvbmwoMHg0MCk7ICAgICAgICAgICAgICAvL2xlbmd0aAorCQkJCXByaXNtX2hkclsyXT1odG9ubChzdGF0cy5tYWNfdGltZVsxXSk7ICAgIC8vbWFjdGltZSAoSElHSCkKKwkJCQlwcmlzbV9oZHJbM109aHRvbmwoc3RhdHMubWFjX3RpbWVbMF0pOyAgICAvL21hY3RpbWUgKExPVykKKwkJCQlyZHRzYyhwcmlzbV9oZHJbNV0sIHByaXNtX2hkcls0XSk7ICAgICAgICAgLy9ob3N0aW1lIChMT1crSElHSCkKKwkJCQlwcmlzbV9oZHJbNF09aHRvbmwocHJpc21faGRyWzRdKTsgICAgICAgICAgLy9CeXRlLU9yZGVyIGFlbmRlcm4KKwkJCQlwcmlzbV9oZHJbNV09aHRvbmwocHJpc21faGRyWzVdKTsgICAgICAgICAgLy9CeXRlLU9yZGVyIGFlbmRlcm4KKwkJCQlwcmlzbV9oZHJbNl09MHgwMDsgICAgICAgICAgICAgICAgICAgICAvL3BoeXR5cGUKKwkJCQlwcmlzbV9oZHJbN109aHRvbmwocHJpdi0+Y2hhbik7ICAgICAgICAvL2NoYW5uZWwKKwkJCQlwcmlzbV9oZHJbOF09aHRvbmwoc3RhdHMucmF0ZSk7ICAgICAgICAvL2RhdGFyYXRlCisJCQkJcHJpc21faGRyWzldPTB4MDA7ICAgICAgICAgICAgICAgICAgICAgLy9hbnRlbm5hCisJCQkJcHJpc21faGRyWzEwXT0weDAwOyAgICAgICAgICAgICAgICAgICAgLy9wcmlvcml0eQorCQkJCXByaXNtX2hkclsxMV09MHgwMDsgICAgICAgICAgICAgICAgICAgIC8vc3NpX3R5cGUKKwkJCQlwcmlzbV9oZHJbMTJdPWh0b25sKHN0YXRzLnNpZ25hbCk7ICAgICAvL3NzaV9zaWduYWwKKwkJCQlwcmlzbV9oZHJbMTNdPWh0b25sKHN0YXRzLm5vaXNlKTsgICAgICAvL3NzaV9ub2lzZQorCQkJCXByaXNtX2hkclsxNF09MHgwMDsgICAgICAgICAgICAgICAgICAgIC8vcHJlYW1ibGUKKwkJCQlwcmlzbV9oZHJbMTVdPTB4MDA7ICAgICAgICAgICAgICAgICAgICAvL2VuY29kaW5nCisKKyNlbmRpZgorCQkJfWVsc2V7CisJCQkJcHJpdi0+cnhfc2tiID0gZGV2X2FsbG9jX3NrYihsZW4rMik7CisJCQkJaWYoICFwcml2LT5yeF9za2IpIGdvdG8gZHJvcDsKKyNpZmRlZiBERUJVR19SWF9TS0IKKwkJCQlETUVTRygiQWxsb2MgaW5pdGlhbCBza2IgJXgiLGxlbisyKTsKKyNlbmRpZgorCQkJfQorCisJCQlwcml2LT5yeF9za2JfY29tcGxldGU9MDsKKwkJCXByaXYtPnJ4X3NrYi0+ZGV2PWRldjsKKwkJfWVsc2V7CisJCQkvKiBpZiB3ZSBhcmUgaGVyZSB3ZSBzaG91bGQgIGhhdmUgYWxyZWFkeSBSWGVkCisJCQkqIHRoZSBmaXJzdCBmcmFtZS4KKwkJCSogSWYgd2UgZ2V0IGhlcmUgYW5kIHRoZSBza2IgaXMgbm90IGFsbG9jYXRlZCB0aGVuCisJCQkqIHdlIGhhdmUganVzdCB0aHJvdyBvdXQgZ2FyYmFnZSAoc2tiIG5vdCBhbGxvY2F0ZWQpCisJCQkqIGFuZCB3ZSBhcmUgc3RpbGwgcnhpbmcgZ2FyYmFnZS4uLi4KKwkJCSovCisJCQlpZighcHJpdi0+cnhfc2tiX2NvbXBsZXRlKXsKKworCQkJCXRtcF9za2I9IGRldl9hbGxvY19za2IocHJpdi0+cnhfc2tiLT5sZW4gK2xlbisyKTsKKworCQkJCWlmKCF0bXBfc2tiKSBnb3RvIGRyb3A7CisKKwkJCQl0bXBfc2tiLT5kZXY9ZGV2OworI2lmZGVmIERFQlVHX1JYX1NLQgorCQkJCURNRVNHKCJSZWFsbG9jIHNrYiAleCIsbGVuKzIpOworI2VuZGlmCisKKyNpZmRlZiBERUJVR19SWF9TS0IKKwkJCQlETUVTRygiZ29pbmcgY29weSBwcmV2IGZyYWcgJXgiLHByaXYtPnJ4X3NrYi0+bGVuKTsKKyNlbmRpZgorCQkJCW1lbWNweShza2JfcHV0KHRtcF9za2IscHJpdi0+cnhfc2tiLT5sZW4pLAorCQkJCQlwcml2LT5yeF9za2ItPmRhdGEsCisJCQkJCXByaXYtPnJ4X3NrYi0+bGVuKTsKKyNpZmRlZiBERUJVR19SWF9TS0IKKwkJCQlETUVTRygic2tiIGNvcHkgcHJldiBmcmFnIGNvbXBsZXRlIik7CisjZW5kaWYKKworCQkJCWRldl9rZnJlZV9za2JfYW55KHByaXYtPnJ4X3NrYik7CisjaWZkZWYgREVCVUdfUlhfU0tCCisJCQkJRE1FU0coInByZXYgc2tiIGZyZWUgb2siKTsKKyNlbmRpZgorCisJCQkJcHJpdi0+cnhfc2tiPXRtcF9za2I7CisJCQl9CisJCX0KKyNpZmRlZiBERUJVR19SWF9TS0IKKwkJRE1FU0coImdvaW5nIHRvIGNvcHkgY3VycmVudCBwYXlsb2FkICV4IixsZW4pOworI2VuZGlmCisJCWlmKCFwcml2LT5yeF9za2JfY29tcGxldGUpIHsKKyNpZmRlZiBDT05GSUdfUlRMODE4NUIKKwkJCWlmKHBhZGRpbmcpIHsKKwkJCQltZW1jcHkoc2tiX3B1dChwcml2LT5yeF9za2IsbGVuKSwKKwkJCQkJKCgodW5zaWduZWQgY2hhciAqKXByaXYtPnJ4YnVmZmVyLT5idWYpICsgMiksbGVuKTsKKwkJCX0gZWxzZSB7CisjZW5kaWYKKwkJCQltZW1jcHkoc2tiX3B1dChwcml2LT5yeF9za2IsbGVuKSwKKwkJCQkJcHJpdi0+cnhidWZmZXItPmJ1ZixsZW4pOworI2lmZGVmIENPTkZJR19SVEw4MTg1QgorCQkJfQorI2VuZGlmCisJCX0KKyNpZmRlZiBERUJVR19SWF9TS0IKKwkJRE1FU0coImN1cnJlbnQgZnJhZ21lbnQgc2tiIGNvcHkgY29tcGxldGUiKTsKKyNlbmRpZgorCisJCWlmKGxhc3QgJiYgIXByaXYtPnJ4X3NrYl9jb21wbGV0ZSl7CisKKyNpZmRlZiBERUJVR19SWF9TS0IKKwkJCURNRVNHKCJHb3QgbGFzdCBmcmFnbWVudCIpOworI2VuZGlmCisKKwkJCWlmKHByaXYtPnJ4X3NrYi0+bGVuID4gNCkKKwkJCQlza2JfdHJpbShwcml2LT5yeF9za2IscHJpdi0+cnhfc2tiLT5sZW4tNCk7CisjaWZkZWYgREVCVUdfUlhfU0tCCisJCQlETUVTRygieWFua2VkIG91dCBjcmMsIHBhc3NpbmcgdG8gdGhlIHVwcGVyIGxheWVyIik7CisjZW5kaWYKKworI2lmbmRlZiBSWF9ET05UX1BBU1NfVUwKKwkJCWlmKCFpZWVlODAyMTFfcngocHJpdi0+aWVlZTgwMjExLAorCQkJCQkgcHJpdi0+cnhfc2tiLCAmc3RhdHMpKXsKKyNpZmRlZiBERUJVR19SWAorCQkJCURNRVNHVygiUGFja2V0IG5vdCBjb25zdW1lZCIpOworI2VuZGlmCisjZW5kaWYgLy8gUlhfRE9OVF9QQVNTX1VMCisKKwkJCQlkZXZfa2ZyZWVfc2tiX2FueShwcml2LT5yeF9za2IpOworI2lmbmRlZiBSWF9ET05UX1BBU1NfVUwKKwkJCX0KKyNlbmRpZgorI2lmZGVmIERFQlVHX1JYCisJCQllbHNleworCQkJCQlETUVTRygiUmN2IGZyYWciKTsKKwkJCX0KKyNlbmRpZgorCQkJcHJpdi0+cnhfc2tiX2NvbXBsZXRlPTE7CisJCX0KKworI2VuZGlmIC8vRFVNTVlfUlgKKworCQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2UocHJpdi0+cGRldiwKKwkJCQkgICAgcHJpdi0+cnhidWZmZXItPmRtYSwKKwkJCQkgICAgcHJpdi0+cnhidWZmZXJzaXplICogXAorCQkJCSAgICBzaXplb2YodTgpLAorCQkJCSAgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCisKK2Ryb3A6IC8vIHRoaXMgaXMgdXNlZCB3aGVuIHdlIGhhdmUgbm90IGVub3VnaHQgbWVtCisKKwkJLyogcmVzdG9yZSB0aGUgZGVzY3JpcHRvciAqLworCQkqKHByaXYtPnJ4cmluZ3RhaWwrMik9cHJpdi0+cnhidWZmZXItPmRtYTsKKwkJKihwcml2LT5yeHJpbmd0YWlsKT0qKHByaXYtPnJ4cmluZ3RhaWwpICZ+IDB4ZmZmOworCQkqKHByaXYtPnJ4cmluZ3RhaWwpPQorCQkJKihwcml2LT5yeHJpbmd0YWlsKSB8IHByaXYtPnJ4YnVmZmVyc2l6ZTsKKworCQkqKHByaXYtPnJ4cmluZ3RhaWwpPQorCQkJKihwcml2LT5yeHJpbmd0YWlsKSB8ICgxPDwzMSk7CisJCQkvL15lbXB0eSBkZXNjcmlwdG9yCisKKwkJCS8vd21iKCk7CisKKyNpZmRlZiBERUJVR19SWAorCQlETUVTRygiQ3VycmVudCBkZXNjcmlwdG9yOiAleCIsKHUzMilwcml2LT5yeHJpbmd0YWlsKTsKKyNlbmRpZgorCQkvL3Vuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCS8vc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmlycV9sb2NrLGZsYWdzKTsKKworCQlwcml2LT5yeHJpbmd0YWlsKz1yeF9kZXNjX3NpemU7CisJCWlmKHByaXYtPnJ4cmluZ3RhaWwgPj0KKwkJICAgKHByaXYtPnJ4cmluZykrKHByaXYtPnJ4cmluZ2NvdW50ICkqcnhfZGVzY19zaXplKQorCQkJcHJpdi0+cnhyaW5ndGFpbD1wcml2LT5yeHJpbmc7CisKKwkJLy9zcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5pcnFfbG9jayxmbGFncyk7CisKKworCQlwcml2LT5yeGJ1ZmZlcj0ocHJpdi0+cnhidWZmZXItPm5leHQpOworCisJfQorCisKKworLy8JaWYoZ2V0X2N1cnJfdHhfZnJlZV9kZXNjKGRldixwcmlvcml0eSkpCisvLwlpZWVlODAyMTFfc3RhX3BzX3NsZWVwKHByaXYtPmllZWU4MDIxMSwgJnRtcCwgJnRtcDIpOworCisKKworfQorCisKK3ZvaWQgcnRsODE4MF9kbWFfa2ljayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcHJpb3JpdHkpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTgwX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOworCisJcnRsODE4MF9zZXRfbW9kZShkZXYsRVBST01fQ01EX0NPTkZJRyk7CisvKgorCisJc3dpdGNoKHByaW9yaXR5KXsKKworCQljYXNlIExPV19QUklPUklUWToKKworCQl3cml0ZV9uaWNfYnl0ZShkZXYsVFhfRE1BX1BPTExJTkcsCisJCSAgICAgICAoMTw8IFRYX0RNQV9QT0xMSU5HX0xPV1BSSU9SSVRZX1NISUZUKSB8CisJCQkgICAgICAgIHByaXYtPmRtYV9wb2xsX21hc2spOworCQlicmVhazsKKworCQljYXNlIE5PUk1fUFJJT1JJVFk6CisKKwkJd3JpdGVfbmljX2J5dGUoZGV2LFRYX0RNQV9QT0xMSU5HLAorCQkgICAgICAgKDE8PCBUWF9ETUFfUE9MTElOR19OT1JNUFJJT1JJVFlfU0hJRlQpIHwKKwkJCSAgICAgICAgcHJpdi0+ZG1hX3BvbGxfbWFzayk7CisJCWJyZWFrOworCisJCWNhc2UgSElfUFJJT1JJVFk6CisKKwkJd3JpdGVfbmljX2J5dGUoZGV2LFRYX0RNQV9QT0xMSU5HLAorCQkgICAgICAgKDE8PCBUWF9ETUFfUE9MTElOR19ISVBSSU9SSVRZX1NISUZUKSB8CisJCQkgICAgICAgIHByaXYtPmRtYV9wb2xsX21hc2spOworCQlicmVhazsKKworCX0KKyovCisJd3JpdGVfbmljX2J5dGUoZGV2LCBUWF9ETUFfUE9MTElORywKKwkJCSgxIDw8IChwcmlvcml0eSArIDEpKSB8IHByaXYtPmRtYV9wb2xsX21hc2spOworCXJ0bDgxODBfc2V0X21vZGUoZGV2LEVQUk9NX0NNRF9OT1JNQUwpOworCisJZm9yY2VfcGNpX3Bvc3RpbmcoZGV2KTsKK30KKworI2lmIDAKK3ZvaWQgcnRsODE4MF90eF9xdWV1ZXNfc3RvcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCS8vc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTgwX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOworCXU4IGRtYV9wb2xsX21hc2sgPSAoMTw8VFhfRE1BX1NUT1BfTE9XUFJJT1JJVFlfU0hJRlQpOworCWRtYV9wb2xsX21hc2sgfD0gKDE8PFRYX0RNQV9TVE9QX0hJUFJJT1JJVFlfU0hJRlQpOworCWRtYV9wb2xsX21hc2sgfD0gKDE8PFRYX0RNQV9TVE9QX05PUk1QUklPUklUWV9TSElGVCk7CisJZG1hX3BvbGxfbWFzayB8PSAoMTw8VFhfRE1BX1NUT1BfQkVBQ09OX1NISUZUKTsKKworCXJ0bDgxODBfc2V0X21vZGUoZGV2LEVQUk9NX0NNRF9DT05GSUcpOworCXdyaXRlX25pY19ieXRlKGRldixUWF9ETUFfUE9MTElORyxkbWFfcG9sbF9tYXNrKTsKKwlydGw4MTgwX3NldF9tb2RlKGRldixFUFJPTV9DTURfTk9STUFMKTsKK30KKyNlbmRpZgorCit2b2lkIHJ0bDgxODBfZGF0YV9oYXJkX3N0b3Aoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxODBfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CisKKwlydGw4MTgwX3NldF9tb2RlKGRldixFUFJPTV9DTURfQ09ORklHKTsKKyNpZmRlZiBDT05GSUdfUlRMODE4NUIKKwlwcml2LT5kbWFfcG9sbF9zdG9wX21hc2sgfD0gVFBQT0xMU1RPUF9BQ19WSVE7CisJd3JpdGVfbmljX2J5dGUoZGV2LFRQUG9sbFN0b3AsIHByaXYtPmRtYV9wb2xsX3N0b3BfbWFzayk7CisjZWxzZQorCXByaXYtPmRtYV9wb2xsX21hc2sgfD0gKDE8PFRYX0RNQV9TVE9QX0xPV1BSSU9SSVRZX1NISUZUKTsKKwl3cml0ZV9uaWNfYnl0ZShkZXYsVFhfRE1BX1BPTExJTkcscHJpdi0+ZG1hX3BvbGxfbWFzayk7CisjZW5kaWYKKwlydGw4MTgwX3NldF9tb2RlKGRldixFUFJPTV9DTURfTk9STUFMKTsKK30KKworCit2b2lkIHJ0bDgxODBfZGF0YV9oYXJkX3Jlc3VtZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gKHN0cnVjdCByODE4MF9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCXJ0bDgxODBfc2V0X21vZGUoZGV2LEVQUk9NX0NNRF9DT05GSUcpOworI2lmZGVmICBDT05GSUdfUlRMODE4NUIKKwlwcml2LT5kbWFfcG9sbF9zdG9wX21hc2sgJj0gfihUUFBPTExTVE9QX0FDX1ZJUSk7CisJd3JpdGVfbmljX2J5dGUoZGV2LFRQUG9sbFN0b3AsIHByaXYtPmRtYV9wb2xsX3N0b3BfbWFzayk7CisjZWxzZQorCXByaXYtPmRtYV9wb2xsX21hc2sgJj0gfigxPDxUWF9ETUFfU1RPUF9MT1dQUklPUklUWV9TSElGVCk7CisJd3JpdGVfbmljX2J5dGUoZGV2LFRYX0RNQV9QT0xMSU5HLHByaXYtPmRtYV9wb2xsX21hc2spOworI2VuZGlmCisJcnRsODE4MF9zZXRfbW9kZShkZXYsRVBST01fQ01EX05PUk1BTCk7Cit9CisKKworLyogdGhpcyBmdW5jdGlvbiBUWCBkYXRhIGZyYW1lcyB3aGVuIHRoZSBpZWVlODAyMTEgc3RhY2sgcmVxdWlyZXMgdGhpcy4KKyAqIEl0IGNoZWNrcyBhbHNvIGlmIHdlIG5lZWQgdG8gc3RvcCB0aGUgaWVlZSB0eCBxdWV1ZSwgZXZlbnR1YWxseSBkbyBpdAorICovCit2b2lkIHJ0bDgxODBfaGFyZF9kYXRhX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYixzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQKK3JhdGUpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTgwX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOworCWludCBtb2RlOworCXN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICAqaCA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciAgKikgc2tiLT5kYXRhOworCXNob3J0IG1vcmVmcmFnID0gKGgtPmZyYW1lX2N0bCkgJiBJRUVFODAyMTFfRkNUTF9NT1JFRlJBR1M7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcHJpb3JpdHk7CisJLy9zdGF0aWMgaW50IGNvdW50ID0gMDsKKworCW1vZGUgPSBwcml2LT5pZWVlODAyMTEtPml3X21vZGU7CisKKwlyYXRlID0gaWVlZXJhdGUycnRscmF0ZShyYXRlKTsKKwkvKgorCSogVGhpcyBmdW5jdGlvbiBkb2Vzbid0IHJlcXVpcmUgbG9jayBiZWNhdXNlIHdlIG1ha2UKKwkqIHN1cmUgaXQncyBjYWxsZWQgd2l0aCB0aGUgdHhfbG9jayBhbHJlYWR5IGFjcXVpcmVkLgorCSogdGhpcyBjb21lIGZyb20gdGhlIGtlcm5lbCdzIGhhcmRfeG1pdCBjYWxsYmFjayAodHJvdWdodAorCSogdGhlIGllZWUgc3RhY2ssIG9yIGZyb20gdGhlIHRyeV93YWtlX3F1ZXVlIChhZ2FpbiB0cm91Z2h0CisJKiB0aGUgaWVlZSBzdGFjay4KKwkqLworI2lmZGVmIENPTkZJR19SVEw4MTg1QgorCXByaW9yaXR5ID0gQUMyUShza2ItPnByaW9yaXR5KTsKKyNlbHNlCisJcHJpb3JpdHkgPSBMT1dfUFJJT1JJVFk7CisjZW5kaWYKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+dHhfbG9jayxmbGFncyk7CisKKwlpZihwcml2LT5pZWVlODAyMTEtPmJId1JhZGlvT2ZmKQorCXsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+dHhfbG9jayxmbGFncyk7CisKKwkJcmV0dXJuOworCX0KKworCS8vcHJpbnRrKEtFUk5fV0FSTklORyAicHJpb3JpdHkgPSAlZEAlZFxuIiwgcHJpb3JpdHksIGNvdW50KyspOworCWlmICghY2hlY2tfbmljX2Vub3VnaHRfZGVzYyhkZXYsIHByaW9yaXR5KSl7CisJCS8vRE1FU0coIkVycm9yOiBubyBkZXNjcmlwdG9yIGxlZnQgYnkgcHJldmlvdXMgVFggKGF2YWlsICVkKSAiLAorCQkvLwlnZXRfY3Vycl90eF9mcmVlX2Rlc2MoZGV2LCBwcmlvcml0eSkpOworCQlETUVTR1coIkVycm9yOiBubyBkZXNjcmlwdG9yIGxlZnQgYnkgcHJldmlvdXMgVFggKGF2YWlsICVkKSAiLAorCQkJZ2V0X2N1cnJfdHhfZnJlZV9kZXNjKGRldiwgcHJpb3JpdHkpKTsKKwkvL3ByaW50ayhLRVJOX1dBUk5JTkcgIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PiBcbiIpOworCQlpZWVlODAyMTFfc3RvcF9xdWV1ZShwcml2LT5pZWVlODAyMTEpOworCX0KKwlydGw4MTgwX3R4KGRldiwgc2tiLT5kYXRhLCBza2ItPmxlbiwgcHJpb3JpdHksIG1vcmVmcmFnLDAscmF0ZSk7CisJaWYgKCFjaGVja19uaWNfZW5vdWdodF9kZXNjKGRldiwgcHJpb3JpdHkpKQorCQlpZWVlODAyMTFfc3RvcF9xdWV1ZShwcml2LT5pZWVlODAyMTEpOworCisJLy9kZXZfa2ZyZWVfc2tiX2FueShza2IpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnR4X2xvY2ssZmxhZ3MpOworCit9CisKKy8qIFRoaXMgaXMgYSByb3VnaCBhdHRlbXB0IHRvIFRYIGEgZnJhbWUKKyAqIFRoaXMgaXMgY2FsbGVkIGJ5IHRoZSBpZWVlIDgwMjExIHN0YWNrIHRvIFRYIG1hbmFnZW1lbnQgZnJhbWVzLgorICogSWYgdGhlIHJpbmcgaXMgZnVsbCBwYWNrZXQgYXJlIGRyb3BwZWQgKGZvciBkYXRhIGZyYW1lIHRoZSBxdWV1ZQorICogaXMgc3RvcHBlZCBiZWZvcmUgdGhpcyBjYW4gaGFwcGVuKS4gRm9yIHRoaXMgcmVhc29uIGl0IGlzIGJldHRlcgorICogaWYgdGhlIGRlc2NyaXB0b3JzIGFyZSBsYXJnZXIgdGhhbiB0aGUgbGFyZ2VzdCBtYW5hZ2VtZW50IGZyYW1lCisgKiB3ZSBpbnRlbmQgdG8gVFg6IGknbSB1bnN1cmUgd2hhdCB0aGUgSFcgZG9lcyBpZiBpdCB3aWxsIG5vdCBmb3VuZAorICogdGhlIGxhc3QgZnJhZ21lbnQgb2YgYSBmcmFtZSBiZWNhdXNlIGl0IGhhcyBiZWVuIGRyb3BwZWQuLi4KKyAqIFNpbmNlIHF1ZXVlcyBmb3IgTWFuYWdlbWVudCBhbmQgRGF0YSBmcmFtZXMgYXJlIGRpZmZlcmVudCB3ZQorICogbWlnaHQgdXNlIGEgZGlmZmVyZW50IGxvY2sgdGhhbiB0eF9sb2NrIChmb3IgZXhhbXBsZSBtZ210X3R4X2xvY2spCisgKi8KKy8qIHRoZXNlIGZ1bmN0aW9uIG1heSBsb29wcyBpZiBpbnZva2VkIHdpdGggMCBkZXNjcmlwdG9ycyBvciAwIGxlbiBidWZmZXIqLworaW50IHJ0bDgxODBfaGFyZF9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2Isc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxODBfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CisKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaW50IHByaW9yaXR5OworCisjaWZkZWYgQ09ORklHX1JUTDgxODVCCisJcHJpb3JpdHkgPSBNQU5BR0VfUFJJT1JJVFk7CisjZWxzZQorCXByaW9yaXR5ID0gTk9STV9QUklPUklUWTsKKyNlbmRpZgorCisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnR4X2xvY2ssZmxhZ3MpOworCisJaWYocHJpdi0+aWVlZTgwMjExLT5iSHdSYWRpb09mZikKKwl7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnR4X2xvY2ssZmxhZ3MpOworCisJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJCXJldHVybiAwOworCX0KKworCXJ0bDgxODBfdHgoZGV2LCBza2ItPmRhdGEsIHNrYi0+bGVuLCBwcmlvcml0eSwKKwkJMCwgMCxpZWVlcmF0ZTJydGxyYXRlKHByaXYtPmllZWU4MDIxMS0+YmFzaWNfcmF0ZSkpOworCisJcHJpdi0+aWVlZTgwMjExLT5zdGF0cy50eF9ieXRlcys9c2tiLT5sZW47CisJcHJpdi0+aWVlZTgwMjExLT5zdGF0cy50eF9wYWNrZXRzKys7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+dHhfbG9jayxmbGFncyk7CisKKwlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCXJldHVybiAwOworfQorCisvLyBsb25ncHJlIDE0NCs0OCBzaG9ydHByZSA3MisyNAordTE2IHJ0bDgxODBfbGVuMmR1cmF0aW9uKHUzMiBsZW4sIHNob3J0IHJhdGUsc2hvcnQqIGV4dCkKK3sKKwl1MTYgZHVyYXRpb247CisJdTE2IGRyaWZ0OworCSpleHQ9MDsKKworCXN3aXRjaChyYXRlKXsKKwljYXNlIDA6Ly8xbWJwcworCQkqZXh0PTA7CisJCWR1cmF0aW9uID0gKChsZW4rNCk8PDQpIC8weDI7CisJCWRyaWZ0ID0gKChsZW4rNCk8PDQpICUgMHgyOworCQlpZihkcmlmdCA9PTAgKSBicmVhazsKKwkJZHVyYXRpb24rKzsKKwkJYnJlYWs7CisKKwljYXNlIDE6Ly8ybWJwcworCQkqZXh0PTA7CisJCWR1cmF0aW9uID0gKChsZW4rNCk8PDQpIC8weDQ7CisJCWRyaWZ0ID0gKChsZW4rNCk8PDQpICUgMHg0OworCQlpZihkcmlmdCA9PTAgKSBicmVhazsKKwkJZHVyYXRpb24rKzsKKwkJYnJlYWs7CisKKwljYXNlIDI6IC8vNS41bWJwcworCQkqZXh0PTA7CisJCWR1cmF0aW9uID0gKChsZW4rNCk8PDQpIC8weGI7CisJCWRyaWZ0ID0gKChsZW4rNCk8PDQpICUgMHhiOworCQlpZihkcmlmdCA9PTAgKQorCQkJYnJlYWs7CisJCWR1cmF0aW9uKys7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwljYXNlIDM6Ly8xMW1icHMKKwkJKmV4dD0wOworCQlkdXJhdGlvbiA9ICgobGVuKzQpPDw0KSAvMHgxNjsKKwkJZHJpZnQgPSAoKGxlbis0KTw8NCkgJSAweDE2OworCQlpZihkcmlmdCA9PTAgKQorCQkJYnJlYWs7CisJCWR1cmF0aW9uKys7CisJCWlmKGRyaWZ0ID4gNikKKwkJCWJyZWFrOworCQkqZXh0PTE7CisJCWJyZWFrOworCX0KKworCXJldHVybiBkdXJhdGlvbjsKK30KKworCit2b2lkIHJ0bDgxODBfcHJlcGFyZV9iZWFjb24oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gKHN0cnVjdCByODE4MF9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCXN0cnVjdCBza19idWZmICpza2I7CisKKwl1MTYgd29yZCAgPSByZWFkX25pY193b3JkKGRldiwgQmNuSXR2KTsKKwl3b3JkICY9IH5CY25JdHZfQmNuSXR2OyAvLyBjbGVhciBCY25fSXR2CisJd29yZCB8PSBjcHVfdG9fbGUxNihwcml2LT5pZWVlODAyMTEtPmN1cnJlbnRfbmV0d29yay5iZWFjb25faW50ZXJ2YWwpOy8vMHg2NDsKKwl3cml0ZV9uaWNfd29yZChkZXYsIEJjbkl0diwgd29yZCk7CisKKworCXNrYiA9IGllZWU4MDIxMV9nZXRfYmVhY29uKHByaXYtPmllZWU4MDIxMSk7CisJaWYoc2tiKXsKKwkJcnRsODE4MF90eChkZXYsc2tiLT5kYXRhLHNrYi0+bGVuLEJFQUNPTl9QUklPUklUWSwKKwkJCTAsMCxpZWVlcmF0ZTJydGxyYXRlKHByaXYtPmllZWU4MDIxMS0+YmFzaWNfcmF0ZSkpOworCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCX0KKwkjaWYgMAorCS8vRE1FU0coInNpemUgJXgiLGxlbik7CisJaWYoKnRhaWwgJiAoMTw8MzEpKXsKKworCQkvL0RNRVNHKCJObyBtb3JlIGJlYWNvbiBUWCBkZXNjIik7CisJCXJldHVybiA7CisKKwl9CisJLy93aGlsZSghICp0YWlsICYgKDE8PDMxKSl7CisJCSp0YWlsPSAwOyAvLyB6ZXJvZXMgaGVhZGVyCisKKwkJKnRhaWwgPSAqdGFpbHwgKDE8PDI5KSA7IC8vZmlzdCBzZWdtZW50IG9mIHRoZSBwYWNrZXQKKwkJKnRhaWwgPSAoKnRhaWwpIHwgKDE8PDI4KTsgLy8gbGFzdCBzZWdtZW50CisJLy8JKnRhaWwgPSAqdGFpbCB8ICgxPDwxOCk7IC8vIHRoaXMgaXMgIGEgYmVhY29uIGZyYW1lCisJCSoodGFpbCszKT0qKHRhaWwrMykgJn4gMHhmZmY7CisJCSoodGFpbCszKT0qKHRhaWwrMykgfCBsZW47IC8vIGJ1ZmZlciBsZW5naHQKKwkJKnRhaWwgPSAqdGFpbCB8bGVuOworCQkvLyB6ZXJvZXMgdGhlIHNlY29uZCAzMi1iaXRzIGR3b3JkIG9mIHRoZSBkZXNjcmlwdG9yCisJCSoodGFpbCsxKT0gMDsKKwkJKnRhaWwgPSAqdGFpbCB8IChyYXRlIDw8IDI0KTsKKworCQkJZHVyYXRpb24gPSBydGw4MTgwX2xlbjJkdXJhdGlvbihsZW4scmF0ZSwmZXh0KTsKKworCQkqKHRhaWwrMSkgPSAqKHRhaWwrMSkgfCAoKGR1cmF0aW9uICYgMHg3ZmZmKTw8MTYpOworCisJCSp0YWlsID0gKnRhaWwgfCAoMTw8MzEpOworCQkvL14gZGVzY3JpcHRvciByZWFkeSB0byBiZSB0eGVkCisJCWlmKCh0YWlsIC0gYmVnaW4pLzggPT0gcHJpdi0+dHhiZWFjb25jb3VudC0xKQorCQkJdGFpbD1iZWdpbjsKKwkJZWxzZQorCQkJdGFpbD10YWlsKzg7CisJLy99CisjZW5kaWYKK30KKworLyogVGhpcyBmdW5jdGlvbiBkbyB0aGUgcmVhbCBkaXJ0eSB3b3JrOiBpdCBlbnF1ZXVlcyBhIFRYIGNvbW1hbmQKKyAqIGRlc2NyaXB0b3IgaW4gdGhlIHJpbmcgYnVmZmVyLCBjb3B5ZXMgdGhlIGZyYW1lIGluIGEgVFggYnVmZmVyCisgKiBhbmQga2lja3MgdGhlIE5JQyB0byBlbnN1cmUgaXQgZG9lcyB0aGUgRE1BIHRyYW5zZmVyLgorICovCitzaG9ydCBydGw4MTgwX3R4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4KiB0eGJ1ZiwgaW50IGxlbiwgaW50IHByaW9yaXR5LAorCQkgc2hvcnQgbW9yZWZyYWcsIHNob3J0IGRlc2NmcmFnLCBpbnQgcmF0ZSkKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJdTMyICp0YWlsLCp0ZW1wX3RhaWw7CisJdTMyICpiZWdpbjsKKwl1MzIgKmJ1ZjsKKwlpbnQgaTsKKwlpbnQgcmVtYWluOworCWludCBidWZsZW47CisJaW50IGNvdW50OworCS8vdTE2CUFja0N0c1RpbWU7CisJLy91MTYJRnJhbWVUaW1lOworCXUxNiBkdXJhdGlvbjsKKwlzaG9ydCBleHQ7CisJc3RydWN0IGJ1ZmZlciogYnVmbGlzdDsKKwkvL3Vuc2lnbmVkIGxvbmcgZmxhZ3M7CisjaWZkZWYgQ09ORklHX1JUTDgxODVCCisJc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgKmZyYWdfaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICopdHhidWY7CisJdTggZGVzdFtFVEhfQUxFTl07CisJdTgJCQliVXNlU2hvcnRQcmVhbWJsZSA9IDA7CisJdTgJCQliQ1RTRW5hYmxlID0gMDsKKwl1OAkJCWJSVFNFbmFibGUgPSAwOworCS8vdTE2CQkJUlRTUmF0ZSA9IDIyOworCS8vdTgJCQlSZXRyeUxpbWl0ID0gMDsKKwl1MTYgCQkJRHVyYXRpb24gPSAwOworCXUxNgkJCVJ0c0R1ciA9IDA7CisJdTE2CQkJVGhpc0ZyYW1lVGltZSA9IDA7CisJdTE2CQkJVHhEZXNjRHVyYXRpb24gPSAwOworCXU4IAkJCW93bmJpdF9mbGFnID0gZmFsc2U7IC8vYWRkZWQgYnkgZGF2aWQgd29vIGZvciBzeW5jIFR4LCAyMDA3LjEyLjE0CisjZW5kaWYKKworCXN3aXRjaChwcmlvcml0eSkgeworCWNhc2UgTUFOQUdFX1BSSU9SSVRZOgorCQl0YWlsPXByaXYtPnR4bWFwcmluZ3RhaWw7CisJCWJlZ2luPXByaXYtPnR4bWFwcmluZzsKKwkJYnVmbGlzdCA9IHByaXYtPnR4bWFwYnVmc3RhaWw7CisJCWNvdW50ID0gcHJpdi0+dHhyaW5nY291bnQ7CisJCWJyZWFrOworCisJY2FzZSBCS19QUklPUklUWToKKwkJdGFpbD1wcml2LT50eGJrcHJpbmd0YWlsOworCQliZWdpbj1wcml2LT50eGJrcHJpbmc7CisJCWJ1Zmxpc3QgPSBwcml2LT50eGJrcGJ1ZnN0YWlsOworCQljb3VudCA9IHByaXYtPnR4cmluZ2NvdW50OworCQlicmVhazsKKworCWNhc2UgQkVfUFJJT1JJVFk6CisJCXRhaWw9cHJpdi0+dHhiZXByaW5ndGFpbDsKKwkJYmVnaW49cHJpdi0+dHhiZXByaW5nOworCQlidWZsaXN0ID0gcHJpdi0+dHhiZXBidWZzdGFpbDsKKwkJY291bnQgPSBwcml2LT50eHJpbmdjb3VudDsKKwkJYnJlYWs7CisKKwljYXNlIFZJX1BSSU9SSVRZOgorCQl0YWlsPXByaXYtPnR4dmlwcmluZ3RhaWw7CisJCWJlZ2luPXByaXYtPnR4dmlwcmluZzsKKwkJYnVmbGlzdCA9IHByaXYtPnR4dmlwYnVmc3RhaWw7CisJCWNvdW50ID0gcHJpdi0+dHhyaW5nY291bnQ7CisJCWJyZWFrOworCisJY2FzZSBWT19QUklPUklUWToKKwkJdGFpbD1wcml2LT50eHZvcHJpbmd0YWlsOworCQliZWdpbj1wcml2LT50eHZvcHJpbmc7CisJCWJ1Zmxpc3QgPSBwcml2LT50eHZvcGJ1ZnN0YWlsOworCQljb3VudCA9IHByaXYtPnR4cmluZ2NvdW50OworCQlicmVhazsKKworCWNhc2UgSElfUFJJT1JJVFk6CisJCXRhaWw9cHJpdi0+dHhocHJpbmd0YWlsOworCQliZWdpbj1wcml2LT50eGhwcmluZzsKKwkJYnVmbGlzdCA9IHByaXYtPnR4aHBidWZzdGFpbDsKKwkJY291bnQgPSBwcml2LT50eHJpbmdjb3VudDsKKwkJYnJlYWs7CisKKwljYXNlIEJFQUNPTl9QUklPUklUWToKKwkJdGFpbD1wcml2LT50eGJlYWNvbnJpbmd0YWlsOworCQliZWdpbj1wcml2LT50eGJlYWNvbnJpbmc7CisJCWJ1Zmxpc3QgPSBwcml2LT50eGJlYWNvbmJ1ZnN0YWlsOworCQljb3VudCA9IHByaXYtPnR4YmVhY29uY291bnQ7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC0xOworCQlicmVhazsKKyAJfQorCisJLy9wcmludGsoImluIHJ0bDgxODBfdHgoKTogcmF0ZSBpcyAlZFxuIixwcml2LT5pZWVlODAyMTEtPnJhdGUpOworI2lmIDEKKwkJbWVtY3B5KCZkZXN0LCBmcmFnX2hkci0+YWRkcjEsIEVUSF9BTEVOKTsKKwkJaWYgKGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKGRlc3QpIHx8CisJCQkJaXNfYnJvYWRjYXN0X2V0aGVyX2FkZHIoZGVzdCkpCisJCXsKKwkJCUR1cmF0aW9uID0gMDsKKwkJCVJ0c0R1ciA9IDA7CisJCQliUlRTRW5hYmxlID0gMDsKKwkJCWJDVFNFbmFibGUgPSAwOworCisJCQlUaGlzRnJhbWVUaW1lID0gQ29tcHV0ZVR4VGltZShsZW4gKyBzQ3JjTG5nLCBydGw4MTgwX3JhdGUycmF0ZShyYXRlKSwgMCwgYlVzZVNob3J0UHJlYW1ibGUpOworCQkJVHhEZXNjRHVyYXRpb24gPSBUaGlzRnJhbWVUaW1lOworCQl9IGVsc2Ugey8vIFVuaWNhc3QgcGFja2V0CisJCQkvL3U4IEFja1JhdGU7CisJCQl1MTYgQWNrVGltZTsKKworCQkJLy9ZSixhZGQsMDgwODI4LGZvciBLZWVwIGFsaXZlCisJCQlwcml2LT5OdW1UeFVuaWNhc3QrKzsKKworCQkJLy8gRmlndXJlIG91dCBBQ0sgcmF0ZSBhY2NvcmRpbmcgdG8gQlNTIGJhc2ljIHJhdGUgYW5kIFR4IHJhdGUsIDIwMDYuMDMuMDggYnkgcmNuamtvLgorCQkJLy9BY2tSYXRlID0gQ29tcHV0ZUFja1JhdGUoIHBNZ250SW5mby0+bUJyYXRlcywgKHUxQnl0ZSkocFRjYi0+RGF0YVJhdGUpICk7CisJCQkvLyBGaWd1cmUgb3V0IEFDSyB0aW1lIGFjY29yZGluZyB0byB0aGUgQWNrUmF0ZSBhbmQgYXNzdW1lIGxvbmcgcHJlYW1ibGUgaXMgdXNlZCBvbiByZWNlaXZlciwgMjAwNi4wMy4wOCwgYnkgcmNuamtvLgorCQkJLy9BY2tUaW1lID0gQ29tcHV0ZVR4VGltZSggc0Fja0N0c0xuZy84LCBBY2tSYXRlLCBGQUxTRSwgRkFMU0UpOworCQkJLy9Gb3Igc2ltcGxpY2l0eSwganVzdCB1c2UgdGhlIDFNIGJhc2ljIHJhdGUKKwkJCS8vQWNrVGltZSA9IENvbXB1dGVUeFRpbWUoMTQsIDU0MCwwLCAwKTsJLy8gQWNrQ1RTTG5nID0gMTQgdXNlIDFNIGJwcyBzZW5kCisJCQlBY2tUaW1lID0gQ29tcHV0ZVR4VGltZSgxNCwgMTAsMCwgMCk7CS8vIEFja0NUU0xuZyA9IDE0IHVzZSAxTSBicHMgc2VuZAorCQkJLy9BY2tUaW1lID0gQ29tcHV0ZVR4VGltZSgxNCwgMixmYWxzZSwgZmFsc2UpOwkvLyBBY2tDVFNMbmcgPSAxNCB1c2UgMU0gYnBzIHNlbmQKKworCQkJaWYgKCAoKGxlbiArIHNDcmNMbmcpID4gcHJpdi0+cnRzKSAmJiBwcml2LT5ydHMgKQorCQkJeyAvLyBSVFMvQ1RTLgorCQkJCXUxNiBSdHNUaW1lLCBDdHNUaW1lOworCQkJCS8vdTE2IEN0c1JhdGU7CisJCQkJYlJUU0VuYWJsZSA9IDE7CisJCQkJYkNUU0VuYWJsZSA9IDA7CisKKwkJCQkvLyBSYXRlIGFuZCB0aW1lIHJlcXVpcmVkIGZvciBSVFMuCisJCQkJUnRzVGltZSA9IENvbXB1dGVUeFRpbWUoIHNBY2tDdHNMbmcvOCxwcml2LT5pZWVlODAyMTEtPmJhc2ljX3JhdGUsIDAsIDApOworCQkJCS8vIFJhdGUgYW5kIHRpbWUgcmVxdWlyZWQgZm9yIENUUy4KKwkJCQlDdHNUaW1lID0gQ29tcHV0ZVR4VGltZSgxNCwgMTAsMCwgMCk7CS8vIEFja0NUU0xuZyA9IDE0IHVzZSAxTSBicHMgc2VuZAorCisJCQkJLy8gRmlndXJlIG91dCB0aW1lIHJlcXVpcmVkIHRvIHRyYW5zbWl0IHRoaXMgZnJhbWUuCisJCQkJVGhpc0ZyYW1lVGltZSA9IENvbXB1dGVUeFRpbWUobGVuICsgc0NyY0xuZywKKwkJCQkJCXJ0bDgxODBfcmF0ZTJyYXRlKHJhdGUpLAorCQkJCQkJMCwKKwkJCQkJCWJVc2VTaG9ydFByZWFtYmxlKTsKKworCQkJCS8vIFJUUy1DVFMtVGhpc0ZyYW1lLUFDSy4KKwkJCQlSdHNEdXIgPSBDdHNUaW1lICsgVGhpc0ZyYW1lVGltZSArIEFja1RpbWUgKyAzKmFTaWZzVGltZTsKKworCQkJCVR4RGVzY0R1cmF0aW9uID0gUnRzVGltZSArIFJ0c0R1cjsKKwkJCX0KKwkJCWVsc2Ugey8vIE5vcm1hbCBjYXNlLgorCQkJCWJDVFNFbmFibGUgPSAwOworCQkJCWJSVFNFbmFibGUgPSAwOworCQkJCVJ0c0R1ciA9IDA7CisKKwkJCQlUaGlzRnJhbWVUaW1lID0gQ29tcHV0ZVR4VGltZShsZW4gKyBzQ3JjTG5nLCBydGw4MTgwX3JhdGUycmF0ZShyYXRlKSwgMCwgYlVzZVNob3J0UHJlYW1ibGUpOworCQkJCVR4RGVzY0R1cmF0aW9uID0gVGhpc0ZyYW1lVGltZSArIGFTaWZzVGltZSArIEFja1RpbWU7CisJCQl9CisKKwkJCWlmKCEoZnJhZ19oZHItPmZyYW1lX2N0bCAmIElFRUU4MDIxMV9GQ1RMX01PUkVGUkFHUykpIHsgLy9ubyBtb3JlIGZyYWdtZW50CisJCQkJLy8gVGhpc0ZyYW1lLUFDSy4KKwkJCQlEdXJhdGlvbiA9IGFTaWZzVGltZSArIEFja1RpbWU7CisJCQl9IGVsc2UgeyAvLyBPbmUgb3IgbW9yZSBmcmFnbWVudHMgcmVtYWluZWQuCisJCQkJdTE2IE5leHRGcmFnVGltZTsKKwkJCQlOZXh0RnJhZ1RpbWUgPSBDb21wdXRlVHhUaW1lKCBsZW4gKyBzQ3JjTG5nLCAvL3ByZXRlbmQgZm9sbG93aW5nIHBhY2tldCBsZW5ndGggZXF1YWwgY3VycmVudCBwYWNrZXQKKwkJCQkJCXJ0bDgxODBfcmF0ZTJyYXRlKHJhdGUpLAorCQkJCQkJMCwKKwkJCQkJCWJVc2VTaG9ydFByZWFtYmxlICk7CisKKwkJCQkvL1RoaXNGcmFnLUFDay1OZXh0RnJhZy1BQ0suCisJCQkJRHVyYXRpb24gPSBOZXh0RnJhZ1RpbWUgKyAzKmFTaWZzVGltZSArIDIqQWNrVGltZTsKKwkJCX0KKworCQl9IC8vIEVuZCBvZiBVbmljYXN0IHBhY2tldAorCisJCWZyYWdfaGRyLT5kdXJhdGlvbl9pZCA9IER1cmF0aW9uOworI2VuZGlmCisKKwlidWZsZW49cHJpdi0+dHhidWZmc2l6ZTsKKwlyZW1haW49bGVuOworCXRlbXBfdGFpbCA9IHRhaWw7CisvL3ByaW50aygiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0+YnVmbGVuID0gJWQsIHJlbWFpbiA9ICVkIVxuIiwgYnVmbGVuLHJlbWFpbik7CisJd2hpbGUocmVtYWluIT0wKXsKKyNpZmRlZiBERUJVR19UWF9GUkFHCisJCURNRVNHKCJUWCBpdGVyYXRpb24iKTsKKyNlbmRpZgorI2lmZGVmIERFQlVHX1RYCisJCURNRVNHKCJUWDogZmlsbGluZyBkZXNjcmlwdG9yICV4IiwodTMyKXRhaWwpOworI2VuZGlmCisJCW1iKCk7CisJCWlmKCFidWZsaXN0KXsKKwkJCURNRVNHRSgiVFggYnVmZmVyIGVycm9yLCBjYW5ub3QgVFggZnJhbWVzLiBwcmkgJWQuIiwgcHJpb3JpdHkpOworCQkJLy9zcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT50eF9sb2NrLGZsYWdzKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlidWY9YnVmbGlzdC0+YnVmOworCisJCWlmKCAoKnRhaWwgJiAoMTw8MzEpKSAmJiAocHJpb3JpdHkgIT0gQkVBQ09OX1BSSU9SSVRZKSl7CisKKwkJCQlETUVTR1coIk5vIG1vcmUgVFggZGVzYywgcmV0dXJuaW5nICV4IG9mICV4IiwKKwkJCQlyZW1haW4sbGVuKTsKKwkJCQlwcml2LT5zdGF0cy50eHJkdSsrOworI2lmZGVmIERFQlVHX1RYX0RFU0MKKwkJCQljaGVja190eF9yaW5nKGRldixwcmlvcml0eSk7CisJCQkvLwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJCQkvLwluZXRpZl9jYXJyaWVyX29mZihkZXYpOworI2VuZGlmCisJCQkvLwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT50eF9sb2NrLGZsYWdzKTsKKworCQkJcmV0dXJuIHJlbWFpbjsKKworCQl9CisKKwkJKnRhaWw9IDA7IC8vIHplcm9lcyBoZWFkZXIKKwkJKih0YWlsKzEpID0gMDsKKwkJKih0YWlsKzMpID0gMDsKKwkJKih0YWlsKzUpID0gMDsKKwkJKih0YWlsKzYpID0gMDsKKwkJKih0YWlsKzcpID0gMDsKKworCQlpZihwcml2LT5jYXJkXzgxODUpeworCQkJLy9GSVhNRTogdGhpcyBzaG91bGQgYmUgdHJpZ2dlcmVkIGJ5IEhXIGVuY3J5cHRpb24gcGFyYW1ldGVycy4KKwkJCSp0YWlsIHw9ICgxPDwxNSk7IC8vbm8gZW5jcnlwdAorLy8JCQkqdGFpbCB8PSAoMTw8MzApOyAvL3JhaXNlIGludCB3aGVuIGNvbXBsZXRlZAorCQl9CisJLy8JKnRhaWwgPSAqdGFpbCB8ICgxPDwxNik7CisJCWlmKHJlbWFpbj09bGVuICYmICFkZXNjZnJhZykgeworCQkJb3duYml0X2ZsYWcgPSBmYWxzZTsJLy9hZGRlZCBieSBkYXZpZCB3b28sMjAwNy4xMi4xNAorI2lmZGVmIERFQlVHX1RYX0ZSQUcKKwkJCURNRVNHKCJGaXJzdCBkZXNjcmlwdG9yIik7CisjZW5kaWYKKwkJCSp0YWlsID0gKnRhaWx8ICgxPDwyOSkgOyAvL2Zpc3Qgc2VnbWVudCBvZiB0aGUgcGFja2V0CisJCQkqdGFpbCA9ICp0YWlsIHwobGVuKTsKKwkJfSBlbHNlIHsKKwkJCW93bmJpdF9mbGFnID0gdHJ1ZTsKKwkJfQorCisJCWZvcihpPTA7aTxidWZsZW4mJiByZW1haW4gPjA7aSsrLHJlbWFpbi0tKXsKKwkJCSgodTgqKWJ1ZilbaV09dHhidWZbaV07IC8vY29weSBkYXRhIGludG8gZGVzY3JpcHRvciBwb2ludGVkIERNQWJsZSBidWZmZXIKKwkJCWlmKHJlbWFpbiA9PSA0ICYmIGkrNCA+PSBidWZsZW4pIGJyZWFrOworCQkJLyogZW5zdXJlIHRoZSBsYXN0IGRlc2MgaGFzIGF0IGxlYXN0IDQgYnl0ZXMgcGF5bG9hZCAqLworCisJCX0KKwkJdHhidWYgPSB0eGJ1ZiArIGk7CisJCSoodGFpbCszKT0qKHRhaWwrMykgJn4gMHhmZmY7CisJCSoodGFpbCszKT0qKHRhaWwrMykgfCBpOyAvLyBidWZmZXIgbGVuZ2h0CisJCS8vIFVzZSBzaG9ydCBwcmVhbWJsZSBvciBub3QKKwkJaWYgKHByaXYtPmllZWU4MDIxMS0+Y3VycmVudF9uZXR3b3JrLmNhcGFiaWxpdHkmV0xBTl9DQVBBQklMSVRZX1NIT1JUX1BSRUFNQkxFKQorCQkJaWYgKHByaXYtPnBsY3BfcHJlYW1ibGVfbW9kZT09MSAmJiByYXRlIT0wKQkvLyAgc2hvcnQgbW9kZSBub3csIG5vdCBsb25nIQorCQkJLy8JKnRhaWwgfD0gKDE8PDE2KTsJCQkJLy8gZW5hYmxlIHNob3J0IHByZWFtYmxlIG1vZGUuCisKKyNpZmRlZiBDT05GSUdfUlRMODE4NUIKKwkJaWYoYkNUU0VuYWJsZSkgeworCQkJKnRhaWwgfD0gKDE8PDE4KTsKKwkJfQorCisJCWlmKGJSVFNFbmFibGUpIC8vcnRzIGVuYWJsZQorCQl7CisJCQkqdGFpbCB8PSAoKGllZWVyYXRlMnJ0bHJhdGUocHJpdi0+aWVlZTgwMjExLT5iYXNpY19yYXRlKSk8PDE5KTsvL1JUUyBSQVRFCisJCQkqdGFpbCB8PSAoMTw8MjMpOy8vcnRzIGVuYWJsZQorCQkJKih0YWlsKzEpIHw9KFJ0c0R1ciYweGZmZmYpOy8vUlRTIER1cmF0aW9uCisJCX0KKwkJKih0YWlsKzMpIHw9ICgoVHhEZXNjRHVyYXRpb24mMHhmZmZmKTw8MTYpOyAvL0RVUkFUSU9OCisvLwkgICAgICAgICoodGFpbCszKSB8PSAoMHhlNjw8MTYpOworICAgICAgICAJKih0YWlsKzUpIHw9ICgxMTw8OCk7Ly8ocHJpdi0+cmV0cnlfZGF0YTw8OCk7IC8vcmV0cnkgbGltIDsKKyNlbHNlCisJCS8vVXNlIFJUUyBvciBub3QKKyNpZmRlZiBDT05GSUdfUlRMODE4N0IKKwkJaWYgKCAobGVuPnByaXYtPnJ0cykgJiYgcHJpdi0+cnRzICYmIHByaW9yaXR5IT1NQU5BR0VfUFJJT1JJVFkpeworI2Vsc2UKKwkJaWYgKCAobGVuPnByaXYtPnJ0cykgJiYgcHJpdi0+cnRzICYmIHByaW9yaXR5PT1MT1dfUFJJT1JJVFkpeworI2VuZGlmCisJCQkqdGFpbCB8PSAoMTw8MjMpOwkvL2VuYWxiZSBSVFMgZnVuY3Rpb24KKwkJCSp0YWlsIHw9ICgwPDwxOSk7CS8vdXNlIDFNIGJwcyBzZW5kIFJUUyBwYWNrZXQKKwkJCUFja0N0c1RpbWUgPSBDb21wdXRlVHhUaW1lKDE0LCAxMCwwLCAwKTsJLy8gQWNrQ1RTTG5nID0gMTQgdXNlIDFNIGJwcyBzZW5kCisJCQlGcmFtZVRpbWUgPSBDb21wdXRlVHhUaW1lKGxlbiArIDQsIHJ0bDgxODBfcmF0ZTJyYXRlKHJhdGUpLCAwLCAqdGFpbCYoMTw8MTYpKTsKKwkJCS8vIFJUUy9DVFMgdGltZSBpcyBjYWxjdWxhdGUgYXMgZm9sbG93CisJCQlkdXJhdGlvbiA9IEZyYW1lVGltZSArIDMqMTAgKyAyKkFja0N0c1RpbWU7CS8vMTB1cyBpcyB0aGUgU2lmc1RpbWU7CisJCQkqKHRhaWwrMSkgfD0gZHVyYXRpb247IAkvL05lZWQgdG8gZWRpdCBoZXJlISAgLS0tLWhpa2FydQorCQl9ZWxzZXsKKwkJCSoodGFpbCsxKT0gMDsgLy8gemVyb2VzIHRoZSBzZWNvbmQgMzItYml0cyBkd29yZCBvZiB0aGUgZGVzY3JpcHRvcgorCQl9CisjZW5kaWYKKworCQkqdGFpbCA9ICp0YWlsIHwgKChyYXRlJjB4ZikgPDwgMjQpOworCQkvL0RNRVNHKCJyYXRlICVkIixyYXRlKTsKKworCQlpZihwcml2LT5jYXJkXzgxODUpeworCisJCQkjaWYgMAorCQkJKih0YWlsKzUpJj0gfigxPDwyNCk7IC8qIHR4IGFudCAwICovCisKKwkJCSoodGFpbCs1KSAmPSB+KDE8PDIzKTsgLyogcmFuZG9tIHR4IGFnYyAyMy0xNiAqLworCQkJKih0YWlsKzUpIHw9ICgxPDwyMil8KDE8PDIxKXwoMTw8MjApfCgxPDwxOSl8KDE8PDE4KXwoMTw8MTcpfCgxPDwxNik7CisKKwkJCSoodGFpbCs1KSAmPQorfigoMTw8MTUpfCgxPDwxNCl8KDE8PDEzKXwoMTw8MTIpfCgxPDwxMSl8KDE8PDEwKXwoMTw8OSl8KDE8PDgpKTsKKwkJCSoodGFpbCs1KSB8PSAoNzw8OCk7IC8vIE1heCByZXRyeSBsaW1pdAorCisJCQkqKHRhaWwrNSkgJj0gfigoMTw8Nyl8KDE8PDYpfCgxPDw1KXwoMTw8NCl8KDE8PDMpfCgxPDwyKXwoMTw8MSl8KDE8PDApKTsKKwkJCSoodGFpbCs1KSB8PSAoODw8NCk7IC8vIE1heCBjb250ZW50aW9uIHdpbmRvdworCQkJKih0YWlsKzYpIHw9IDQ7IC8vIE1pbiBjb250ZW50aW9uIHdpbmRvdworCQkJI2VuZGlmCisgICAgICAgICAgIC8vICAgIAkqKHRhaWwrNSkgPSAwOworCQl9CisKKwkJLyogaHdfcGxjcF9sZW4gaXMgbm90IHVzZWQgZm9yIHJ0bDgxODAgY2hpcCAqLworCQkvKiBGSVhNRSAqLworCQlpZihwcml2LT5jYXJkXzgxODUgPT0gMCB8fCAhcHJpdi0+aHdfcGxjcF9sZW4peworCisJCQlkdXJhdGlvbiA9IHJ0bDgxODBfbGVuMmR1cmF0aW9uKGxlbiwKKwkJCQlyYXRlLCZleHQpOworCisKKyNpZmRlZiBERUJVR19UWAorCQkJRE1FU0coIlBMQ1AgZHVyYXRpb24gJWQiLGR1cmF0aW9uICk7CisJCQkvL0RNRVNHKCJkcmlmdCAlZCIsZHJpZnQpOworCQkJRE1FU0coImV4dGVuc2lvbiAlcyIsIChleHQ9PTEpID8gIm9uIjoib2ZmIik7CisjZW5kaWYKKwkJCSoodGFpbCsxKSA9ICoodGFpbCsxKSB8ICgoZHVyYXRpb24gJiAweDdmZmYpPDwxNik7CisJCQlpZihleHQpICoodGFpbCsxKSA9ICoodGFpbCsxKSB8KDE8PDMxKTsgLy9wbGNwIGxlbmd0aCBleHRlbnNpb24KKwkJfQorCisJCWlmKG1vcmVmcmFnKSAqdGFpbCA9ICgqdGFpbCkgfCAoMTw8MTcpOyAvLyBtb3JlIGZyYWdtZW50CisJCWlmKCFyZW1haW4pICp0YWlsID0gKCp0YWlsKSB8ICgxPDwyOCk7IC8vIGxhc3Qgc2VnbWVudCBvZiBmcmFtZQorCisjaWZkZWYgREVCVUdfVFhfRlJBRworCQlpZighcmVtYWluKURNRVNHKCJMYXN0IGRlc2NyaXB0b3IiKTsKKwkJaWYobW9yZWZyYWcpRE1FU0coIk1vcmUgZnJhZyIpOworI2VuZGlmCisgICAgICAgICAgICAgICAqKHRhaWwrNSkgPSAqKHRhaWwrNSl8KDI8PDI3KTsKKyAgICAgICAgICAgICAgICAqKHRhaWwrNykgPSAqKHRhaWwrNyl8KDE8PDQpOworCisJCXdtYigpOworCQlpZihvd25iaXRfZmxhZykKKwkJeworCQkJKnRhaWwgPSAqdGFpbCB8ICgxPDwzMSk7IC8vIGRlc2NyaXB0b3IgcmVhZHkgdG8gYmUgdHhlZAorCQl9CisKKyNpZmRlZiBERUJVR19UWF9ERVNDMgorICAgICAgICAgICAgICAgIHByaW50aygidHggZGVzYyBpczpcbiIpOworCQlETUVTRygiJTh4ICU4eCAlOHggJTh4ICU4eCAlOHggJTh4ICU4eCIsIHRhaWxbMF0sIHRhaWxbMV0sIHRhaWxbMl0sIHRhaWxbM10sCisJCQl0YWlsWzRdLCB0YWlsWzVdLCB0YWlsWzZdLCB0YWlsWzddKTsKKyNlbmRpZgorCisJCWlmKCh0YWlsIC0gYmVnaW4pLzggPT0gY291bnQtMSkKKwkJCXRhaWw9YmVnaW47CisKKwkJZWxzZQorCQkJdGFpbD10YWlsKzg7CisKKwkJYnVmbGlzdD1idWZsaXN0LT5uZXh0OworCisJCW1iKCk7CisKKwkJc3dpdGNoKHByaW9yaXR5KSB7CisJCQljYXNlIE1BTkFHRV9QUklPUklUWToKKwkJCQlwcml2LT50eG1hcHJpbmd0YWlsPXRhaWw7CisJCQkJcHJpdi0+dHhtYXBidWZzdGFpbD1idWZsaXN0OworCQkJCWJyZWFrOworCisJCQljYXNlIEJLX1BSSU9SSVRZOgorCQkJCXByaXYtPnR4YmtwcmluZ3RhaWw9dGFpbDsKKwkJCQlwcml2LT50eGJrcGJ1ZnN0YWlsPWJ1Zmxpc3Q7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgQkVfUFJJT1JJVFk6CisJCQkJcHJpdi0+dHhiZXByaW5ndGFpbD10YWlsOworCQkJCXByaXYtPnR4YmVwYnVmc3RhaWw9YnVmbGlzdDsKKwkJCQlicmVhazsKKworCQkJY2FzZSBWSV9QUklPUklUWToKKwkJCQlwcml2LT50eHZpcHJpbmd0YWlsPXRhaWw7CisJCQkJcHJpdi0+dHh2aXBidWZzdGFpbD1idWZsaXN0OworCQkJCWJyZWFrOworCisJCQljYXNlIFZPX1BSSU9SSVRZOgorCQkJCXByaXYtPnR4dm9wcmluZ3RhaWw9dGFpbDsKKwkJCQlwcml2LT50eHZvcGJ1ZnN0YWlsPWJ1Zmxpc3Q7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgSElfUFJJT1JJVFk6CisJCQkJcHJpdi0+dHhocHJpbmd0YWlsPXRhaWw7CisJCQkJcHJpdi0+dHhocGJ1ZnN0YWlsID0gYnVmbGlzdDsKKwkJCQlicmVhazsKKworCQkJY2FzZSBCRUFDT05fUFJJT1JJVFk6CisJCQkJLyogdGhlIEhXIHNlZW1zIHRvIGJlIGhhcHB5IHdpdGggdGhlIDFzdAorCQkJCSAqIGRlc2NyaXB0b3IgZmlsbGVkIGFuZCB0aGUgMm5kIGVtcHR5Li4uCisJCQkJICogU28gYWx3YXlzIHVwZGF0ZSBkZXNjcmlwdG9yIDEgYW5kIG5ldmVyCisJCQkJICogdG91Y2ggMm5kCisJCQkJICovCisJCQkvLwlwcml2LT50eGJlYWNvbnJpbmd0YWlsPXRhaWw7CisJCQkvLwlwcml2LT50eGJlYWNvbmJ1ZnN0YWlsPWJ1Zmxpc3Q7CisKKwkJCQlicmVhazsKKworCQl9CisKKwkJLy9ydGw4MTgwX2RtYV9raWNrKGRldixwcmlvcml0eSk7CisJfQorCSp0ZW1wX3RhaWwgPSAqdGVtcF90YWlsIHwgKDE8PDMxKTsgLy8gZGVzY3JpcHRvciByZWFkeSB0byBiZSB0eGVkCisJcnRsODE4MF9kbWFfa2ljayhkZXYscHJpb3JpdHkpOworCS8vc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+dHhfbG9jayxmbGFncyk7CisKKwlyZXR1cm4gMDsKKworfQorCisKK3ZvaWQgcnRsODE4MF9pcnFfcnhfdGFza2xldChzdHJ1Y3QgcjgxODBfcHJpdiAqIHByaXYpOworCisKK3ZvaWQgcnRsODE4MF9saW5rX2NoYW5nZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwl1MTYgYmVhY29uX2ludGVydmFsOworCisJc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpuZXQgPSAmcHJpdi0+aWVlZTgwMjExLT5jdXJyZW50X25ldHdvcms7CisvLwlydGw4MTgwX2FkYXB0ZXJfc3RhcnQoZGV2KTsKKwlydGw4MTgwX3VwZGF0ZV9tc3IoZGV2KTsKKworCisJcnRsODE4MF9zZXRfbW9kZShkZXYsRVBST01fQ01EX0NPTkZJRyk7CisKKwl3cml0ZV9uaWNfZHdvcmQoZGV2LEJTU0lELCgodTMyKiluZXQtPmJzc2lkKVswXSk7CisJd3JpdGVfbmljX3dvcmQoZGV2LEJTU0lEKzQsKCh1MTYqKW5ldC0+YnNzaWQpWzJdKTsKKworCisJYmVhY29uX2ludGVydmFsICA9IHJlYWRfbmljX2R3b3JkKGRldixCRUFDT05fSU5URVJWQUwpOworCWJlYWNvbl9pbnRlcnZhbCAmPSB+IEJFQUNPTl9JTlRFUlZBTF9NQVNLOworCWJlYWNvbl9pbnRlcnZhbCB8PSBuZXQtPmJlYWNvbl9pbnRlcnZhbDsKKwl3cml0ZV9uaWNfZHdvcmQoZGV2LCBCRUFDT05fSU5URVJWQUwsIGJlYWNvbl9pbnRlcnZhbCk7CisKKwlydGw4MTgwX3NldF9tb2RlKGRldiwgRVBST01fQ01EX05PUk1BTCk7CisKKworCS8qCisJdTE2IGF0aW0gPSByZWFkX25pY19kd29yZChkZXYsQVRJTSk7CisJdTE2ID0gdTE2ICZ+IEFUSU1fTUFTSzsKKwl1MTYgPSB1MTYgfCBiZWFjb24tPmF0aW07CisJKi8KKyNpZiAwCisJaWYgKG5ldC0+Y2FwYWJpbGl0eSAmIFdMQU5fQ0FQQUJJTElUWV9QUklWQUNZKSB7CisJCWlmIChwcml2LT5od193ZXApIHsKKwkJCURNRVNHKCJFbmFibGluZyBoYXJkd2FyZSBXRVAgc3VwcG9ydCIpOworCQkJcnRsODE4MF9zZXRfaHdfd2VwKGRldik7CisJCQlwcml2LT5pZWVlODAyMTEtPmhvc3RfZW5jcnlwdD0wOworCQkJcHJpdi0+aWVlZTgwMjExLT5ob3N0X2RlY3J5cHQ9MDsKKwkJfQorI2lmbmRlZiBDT05GSUdfSUVFRTgwMjExX05PV0VQCisJCWVsc2UgeworCQkJcHJpdi0+aWVlZTgwMjExLT5ob3N0X2VuY3J5cHQ9MTsKKwkJCXByaXYtPmllZWU4MDIxMS0+aG9zdF9kZWNyeXB0PTE7CisJCX0KKyNlbmRpZgorCX0KKyNpZm5kZWYgQ09ORklHX0lFRUU4MDIxMV9OT1dFUAorCWVsc2V7CisJCXByaXYtPmllZWU4MDIxMS0+aG9zdF9lbmNyeXB0PTA7CisJCXByaXYtPmllZWU4MDIxMS0+aG9zdF9kZWNyeXB0PTA7CisJfQorI2VuZGlmCisjZW5kaWYKKworCisJaWYocHJpdi0+Y2FyZF84MTg1KQorCQlydGw4MTgwX3NldF9jaGFuKGRldiwgcHJpdi0+Y2hhbik7CisKKworfQorCit2b2lkIHJ0bDgxODBfcnFfdHhfYWNrKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpeworCisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworLy8JcHJpbnRrKCI9PT09PT09PT09PT09PT09PT09PT4lc1xuIixfX2Z1bmNfXyk7CisJd3JpdGVfbmljX2J5dGUoZGV2LENPTkZJRzQscmVhZF9uaWNfYnl0ZShkZXYsQ09ORklHNCl8Q09ORklHNF9QV1JNR1QpOworCXByaXYtPmFja190eF90b19pZWVlID0gMTsKK30KKworc2hvcnQgcnRsODE4MF9pc190eF9xdWV1ZV9lbXB0eShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KXsKKworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwl1MzIqIGQ7CisKKwlmb3IgKGQgPSBwcml2LT50eG1hcHJpbmc7CisJCWQgPCBwcml2LT50eG1hcHJpbmcgKyBwcml2LT50eHJpbmdjb3VudDtkKz04KQorCQkJaWYoKmQgJiAoMTw8MzEpKSByZXR1cm4gMDsKKworCWZvciAoZCA9IHByaXYtPnR4YmtwcmluZzsKKwkJZCA8IHByaXYtPnR4YmtwcmluZyArIHByaXYtPnR4cmluZ2NvdW50O2QrPTgpCisJCQlpZigqZCAmICgxPDwzMSkpIHJldHVybiAwOworCisJZm9yIChkID0gcHJpdi0+dHhiZXByaW5nOworCQlkIDwgcHJpdi0+dHhiZXByaW5nICsgcHJpdi0+dHhyaW5nY291bnQ7ZCs9OCkKKwkJCWlmKCpkICYgKDE8PDMxKSkgcmV0dXJuIDA7CisKKwlmb3IgKGQgPSBwcml2LT50eHZpcHJpbmc7CisJCWQgPCBwcml2LT50eHZpcHJpbmcgKyBwcml2LT50eHJpbmdjb3VudDtkKz04KQorCQkJaWYoKmQgJiAoMTw8MzEpKSByZXR1cm4gMDsKKworCWZvciAoZCA9IHByaXYtPnR4dm9wcmluZzsKKwkJZCA8IHByaXYtPnR4dm9wcmluZyArIHByaXYtPnR4cmluZ2NvdW50O2QrPTgpCisJCQlpZigqZCAmICgxPDwzMSkpIHJldHVybiAwOworCisJZm9yIChkID0gcHJpdi0+dHhocHJpbmc7CisJCWQgPCBwcml2LT50eGhwcmluZyArIHByaXYtPnR4cmluZ2NvdW50O2QrPTgpCisJCQlpZigqZCAmICgxPDwzMSkpIHJldHVybiAwOworCXJldHVybiAxOworfQorLyogRklYTUUgRklYTUUgNW1zZWNzIGlzIHJhbmRvbSAqLworI2RlZmluZSBIV19XQUtFX0RFTEFZIDUKKwordm9pZCBydGw4MTgwX2h3X3dha2V1cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+cHNfbG9jayxmbGFncyk7CisJLy9ETUVTRygiV2FrZW4gdXAhIik7CisJd3JpdGVfbmljX2J5dGUoZGV2LENPTkZJRzQscmVhZF9uaWNfYnl0ZShkZXYsQ09ORklHNCkmfkNPTkZJRzRfUFdSTUdUKTsKKworCWlmKHByaXYtPnJmX3dha2V1cCkKKwkJcHJpdi0+cmZfd2FrZXVwKGRldik7CisvLwltZGVsYXkoSFdfV0FLRV9ERUxBWSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+cHNfbG9jayxmbGFncyk7Cit9CisKK3ZvaWQgcnRsODE4MF9od19zbGVlcF9kb3duKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKyAgICAgICAgc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCisgICAgICAgIHNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5wc19sb2NrLGZsYWdzKTsKKyAgICAgICAvL0RNRVNHKCJTbGVlcCEiKTsKKworICAgICAgICBpZihwcml2LT5yZl9zbGVlcCkKKyAgICAgICAgICAgICAgICBwcml2LT5yZl9zbGVlcChkZXYpOworICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5wc19sb2NrLGZsYWdzKTsKK30KKworCit2b2lkIHJ0bDgxODBfaHdfc2xlZXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIHRoLCB1MzIgdGwpCit7CisKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisKKwl1MzIgcmIgPSBqaWZmaWVzOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+cHNfbG9jayxmbGFncyk7CisKKwkvKiBXcml0aW5nIEhXIHJlZ2lzdGVyIHdpdGggMCBlcXVhbHMgdG8gZGlzYWJsZQorCSAqIHRoZSB0aW1lciwgdGhhdCBpcyBub3QgcmVhbGx5IHdoYXQgd2Ugd2FudAorCSAqLworCXRsIC09IE1TRUNTKDQrMTYrNyk7CisKKwkvL2lmKHRsID09IDApIHRsID0gMTsKKworCS8qIEZJWE1FIEhBQ0sgRklYTUUgSEFDSyAqLworLy8JZm9yY2VfcGNpX3Bvc3RpbmcoZGV2KTsKKwkvL21kZWxheSgxKTsKKworLy8JcmIgPSByZWFkX25pY19kd29yZChkZXYsIFRTRlRSKTsKKworCS8qIElmIHRoZSBpbnRlcnZhbCBpbiB3aXRjaCB3ZSBhcmUgcmVxdWVzdGVkIHRvIHNsZWVwIGlzIHRvbworCSAqIHNob3J0IHRoZW4gZ2l2ZSB1cCBhbmQgcmVtYWluIGF3YWtlCisJICovCisJaWYoKCh0bD49cmIpJiYgKHRsLXJiKSA8PSBNU0VDUyhNSU5fU0xFRVBfVElNRSkpCisJCXx8KChyYj50bCkmJiAocmItdGwpIDwgTVNFQ1MoTUlOX1NMRUVQX1RJTUUpKSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5wc19sb2NrLGZsYWdzKTsKKwkJcHJpbnRrKCJ0b28gc2hvcnQgdG8gc2xlZXBcbiIpOworCQlyZXR1cm47CisJfQorCisvLwl3cml0ZV9uaWNfZHdvcmQoZGV2LCBUaW1lckludCwgdGwpOworLy8JcmIgPSByZWFkX25pY19kd29yZChkZXYsIFRTRlRSKTsKKwl7CisJCXUzMiB0bXAgPSAodGw+cmIpPyh0bC1yYik6KHJiLXRsKTsKKwkvLwlpZiAodGw8cmIpCisKKwkJLy9sem0sYWRkLDA4MDgyOAorCQlwcml2LT5Eb3plUGVyaW9kSW5QYXN0MlNlYyArPSBqaWZmaWVzX3RvX21zZWNzKHRtcCk7CisKKwkJcXVldWVfZGVsYXllZF93b3JrKHByaXYtPmllZWU4MDIxMS0+d3EsICZwcml2LT5pZWVlODAyMTEtPmh3X3dha2V1cF93cSwgdG1wKTsgLy9hcyB0bCBtYXkgYmUgbGVzcyB0aGFuIHJiCisJfQorCS8qIGlmIHdlIHN1c3BlY3QgdGhlIFRpbWVySW50IGlzIGdvbmUgYmV5b25kIHRsCisJICogd2hpbGUgc2V0dGluZyBpdCwgdGhlbiBnaXZlIHVwCisJICovCisjaWYgMQorCWlmKCgodGwgPiByYikgJiYgKCh0bC1yYikgPiBNU0VDUyhNQVhfU0xFRVBfVElNRSkpKXx8CisJCSgodGwgPCByYikgJiYgKChyYi10bCkgPiBNU0VDUyhNQVhfU0xFRVBfVElNRSkpKSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5wc19sb2NrLGZsYWdzKTsKKwkJcmV0dXJuOworCX0KKyNlbmRpZgorLy8JaWYocHJpdi0+cmZfc2xlZXApCisvLwkJcHJpdi0+cmZfc2xlZXAoZGV2KTsKKworCXF1ZXVlX3dvcmsocHJpdi0+aWVlZTgwMjExLT53cSwgKHZvaWQgKikmcHJpdi0+aWVlZTgwMjExLT5od19zbGVlcF93cSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+cHNfbG9jayxmbGFncyk7Cit9CisKKworLy92b2lkIHJ0bDgxODBfd21tX3BhcmFtX3VwZGF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LHU4ICphY19wYXJhbSkKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj1LRVJORUxfVkVSU0lPTigyLDYsMjApCit2b2lkIHJ0bDgxODBfd21tX3BhcmFtX3VwZGF0ZShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKiB3b3JrKQoreworCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICogaWVlZSA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSx3bW1fcGFyYW1fdXBkYXRlX3dxKTsKKwkvL3N0cnVjdCByODE4MF9wcml2ICpwcml2ID0gKHN0cnVjdCByODE4MF9wcml2KikoaWVlZS0+cHJpdik7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGllZWUtPmRldjsKKyNlbHNlCit2b2lkIHJ0bDgxODBfd21tX3BhcmFtX3VwZGF0ZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gaWVlZS0+ZGV2OworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKyNlbmRpZgorCXU4ICphY19wYXJhbSA9ICh1OCAqKShpZWVlLT5jdXJyZW50X25ldHdvcmsud21tX3BhcmFtKTsKKwl1OCBtb2RlID0gaWVlZS0+Y3VycmVudF9uZXR3b3JrLm1vZGU7CisJQUNfQ09ESU5HCWVBQ0k7CisJQUNfUEFSQU0JQWNQYXJhbTsKKwlQQUNfUEFSQU0JcEFjUGFyYW07CisJdTggaTsKKworI2lmbmRlZiBDT05GSUdfUlRMODE4NUIKKyAgICAgICAgLy9mb3IgbGVnYWN5IDgxODUga2VlcCB0aGUgUEFSQU0gdW5jaGFuZ2UuCisJcmV0dXJuOworI2Vsc2UKKwlpZighaWVlZS0+Y3VycmVudF9uZXR3b3JrLlFvU19FbmFibGUpeworCQkvL2xlZ2FjeSBhY194eF9wYXJhbSB1cGRhdGUKKwkJQWNQYXJhbS5sb25nRGF0YSA9IDA7CisJCUFjUGFyYW0uZi5BY2lBaWZzbi5mLkFJRlNOID0gMjsgLy8gRm9sbG93IDgwMi4xMSBESUZTLgorCQlBY1BhcmFtLmYuQWNpQWlmc24uZi5BQ00gPSAwOworCQlBY1BhcmFtLmYuRWN3LmYuRUNXbWluID0gMzsgLy8gRm9sbG93IDgwMi4xMSBDV21pbi4KKwkJQWNQYXJhbS5mLkVjdy5mLkVDV21heCA9IDc7IC8vIEZvbGxvdyA4MDIuMTEgQ1dtYXguCisJCUFjUGFyYW0uZi5UWE9QTGltaXQgPSAwOworCQlmb3IoZUFDSSA9IDA7IGVBQ0kgPCBBQ19NQVg7IGVBQ0krKyl7CisJCQlBY1BhcmFtLmYuQWNpQWlmc24uZi5BQ0kgPSAodTgpZUFDSTsKKwkJCXsKKwkJCQl1OAkJdTFiQUlGUzsKKwkJCQl1MzIJCXU0YkFjUGFyYW07CisJCQkJcEFjUGFyYW0gPSAoUEFDX1BBUkFNKSgmQWNQYXJhbSk7CisJCQkJLy8gUmV0cml2ZSBwYXJhbXRlcnMgdG8gdWRwYXRlLgorCQkJCXUxYkFJRlMgPSBwQWNQYXJhbS0+Zi5BY2lBaWZzbi5mLkFJRlNOICooKChtb2RlJklFRUVfRykgPT0gSUVFRV9HKT85OjIwKSArIGFTaWZzVGltZTsKKwkJCQl1NGJBY1BhcmFtID0gKCgoKHUzMikocEFjUGFyYW0tPmYuVFhPUExpbWl0KSk8PEFDX1BBUkFNX1RYT1BfTElNSVRfT0ZGU0VUKXwKKwkJCQkJICAgICAgKCgodTMyKShwQWNQYXJhbS0+Zi5FY3cuZi5FQ1dtYXgpKTw8QUNfUEFSQU1fRUNXX01BWF9PRkZTRVQpfAorCQkJCQkgICAgICAoKCh1MzIpKHBBY1BhcmFtLT5mLkVjdy5mLkVDV21pbikpPDxBQ19QQVJBTV9FQ1dfTUlOX09GRlNFVCl8CisJCQkJCSAgICAgICAoKCh1MzIpdTFiQUlGUykgPDwgQUNfUEFSQU1fQUlGU19PRkZTRVQpKTsKKwkJCQlzd2l0Y2goZUFDSSl7CisJCQkJCWNhc2UgQUMxX0JLOgorCQkJCQkJd3JpdGVfbmljX2R3b3JkKGRldiwgQUNfQktfUEFSQU0sIHU0YkFjUGFyYW0pOworCQkJCQkJYnJlYWs7CisKKwkJCQkJY2FzZSBBQzBfQkU6CisJCQkJCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBBQ19CRV9QQVJBTSwgdTRiQWNQYXJhbSk7CisJCQkJCQlicmVhazsKKworCQkJCQljYXNlIEFDMl9WSToKKwkJCQkJCXdyaXRlX25pY19kd29yZChkZXYsIEFDX1ZJX1BBUkFNLCB1NGJBY1BhcmFtKTsKKwkJCQkJCWJyZWFrOworCisJCQkJCWNhc2UgQUMzX1ZPOgorCQkJCQkJd3JpdGVfbmljX2R3b3JkKGRldiwgQUNfVk9fUEFSQU0sIHU0YkFjUGFyYW0pOworCQkJCQkJYnJlYWs7CisKKwkJCQkJZGVmYXVsdDoKKwkJCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIlNldEh3UmVnODE4NSgpOmludmFsaWQgQUNJOiAlZCFcbiIsIGVBQ0kpOworCQkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisJCXJldHVybjsKKwl9CisKKwlmb3IoaSA9IDA7IGkgPCBBQ19NQVg7IGkrKyl7CisJCS8vQWNQYXJhbS5sb25nRGF0YSA9IDA7CisJCXBBY1BhcmFtID0gKEFDX1BBUkFNICogKWFjX3BhcmFtOworCQl7CisJCQlBQ19DT0RJTkcJZUFDSTsKKwkJCXU4CQl1MWJBSUZTOworCQkJdTMyCQl1NGJBY1BhcmFtOworCisJCQkvLyBSZXRyaXZlIHBhcmFtdGVycyB0byB1ZHBhdGUuCisJCQllQUNJID0gcEFjUGFyYW0tPmYuQWNpQWlmc24uZi5BQ0k7CisJCQkvL01vZGUgRy9BOiBzbG90VGltZVRpbWVyID0gOTsgTW9kZSBCOiAyMAorCQkJdTFiQUlGUyA9IHBBY1BhcmFtLT5mLkFjaUFpZnNuLmYuQUlGU04gKiAoKChtb2RlJklFRUVfRykgPT0gSUVFRV9HKT85OjIwKSArIGFTaWZzVGltZTsKKwkJCXU0YkFjUGFyYW0gPSAoCSgoKHUzMikocEFjUGFyYW0tPmYuVFhPUExpbWl0KSkgPDwgQUNfUEFSQU1fVFhPUF9MSU1JVF9PRkZTRVQpCXwKKwkJCQkJKCgodTMyKShwQWNQYXJhbS0+Zi5FY3cuZi5FQ1dtYXgpKSA8PCBBQ19QQVJBTV9FQ1dfTUFYX09GRlNFVCkJfAorCQkJCQkoKCh1MzIpKHBBY1BhcmFtLT5mLkVjdy5mLkVDV21pbikpIDw8IEFDX1BBUkFNX0VDV19NSU5fT0ZGU0VUKQl8CisJCQkJCSgoKHUzMil1MWJBSUZTKSA8PCBBQ19QQVJBTV9BSUZTX09GRlNFVCkpOworCisJCQlzd2l0Y2goZUFDSSl7CisJCQkJY2FzZSBBQzFfQks6CisJCQkJCXdyaXRlX25pY19kd29yZChkZXYsIEFDX0JLX1BBUkFNLCB1NGJBY1BhcmFtKTsKKwkJCQkJYnJlYWs7CisKKwkJCQljYXNlIEFDMF9CRToKKwkJCQkJd3JpdGVfbmljX2R3b3JkKGRldiwgQUNfQkVfUEFSQU0sIHU0YkFjUGFyYW0pOworCQkJCQlicmVhazsKKworCQkJCWNhc2UgQUMyX1ZJOgorCQkJCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBBQ19WSV9QQVJBTSwgdTRiQWNQYXJhbSk7CisJCQkJCWJyZWFrOworCisJCQkJY2FzZSBBQzNfVk86CisJCQkJCXdyaXRlX25pY19kd29yZChkZXYsIEFDX1ZPX1BBUkFNLCB1NGJBY1BhcmFtKTsKKwkJCQkJYnJlYWs7CisKKwkJCQlkZWZhdWx0OgorCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJTZXRId1JlZzgxODUoKTogaW52YWxpZCBBQ0k6ICVkICFcbiIsIGVBQ0kpOworCQkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlhY19wYXJhbSArPSAoc2l6ZW9mKEFDX1BBUkFNKSk7CisJfQorI2VuZGlmCit9CisKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwyMCkpCit2b2lkIHJ0bDgxODBfdHhfaXJxX3dxKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CisjZWxzZQordm9pZCBydGw4MTgwX3R4X2lycV93cShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKyNlbmRpZgorCisKKworCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMjApKQordm9pZCBydGw4MTgwX3Jlc3RhcnRfd3Eoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKKy8vdm9pZCBydGw4MTgwX3JxX3R4X2FjayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOworI2Vsc2UKKyB2b2lkIHJ0bDgxODBfcmVzdGFydF93cShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKy8vdm9pZCBydGw4MTgwX3JxX3R4X2FjayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKyNlbmRpZgorI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDIwKSkKK3ZvaWQgcnRsODE4MF93YXRjaF9kb2dfd3Eoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKKyNlbHNlCit2b2lkIHJ0bDgxODBfd2F0Y2hfZG9nX3dxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworI2VuZGlmCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMjApKQordm9pZCBydGw4MTgwX2h3X3dha2V1cF93cShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOworI2Vsc2UKK3ZvaWQgcnRsODE4MF9od193YWtldXBfd3Eoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisjZW5kaWYKKworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDIwKSkKK3ZvaWQgcnRsODE4MF9od19zbGVlcF93cShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOworI2Vsc2UKK3ZvaWQgcnRsODE4MF9od19zbGVlcF93cShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKyNlbmRpZgorCisKKworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDIwKSkKK3ZvaWQgcnRsODE4MF9zd19hbnRlbm5hX3dxKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CisjZWxzZQordm9pZCBydGw4MTgwX3N3X2FudGVubmFfd3Eoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisjZW5kaWYKKyB2b2lkIHJ0bDgxODBfd2F0Y2hfZG9nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwordm9pZCB3YXRjaF9kb2dfYWRhcHRpdmUodW5zaWduZWQgbG9uZyBkYXRhKQoreworICAgIHN0cnVjdCByODE4MF9wcml2KiBwcml2ID0gaWVlZTgwMjExX3ByaXYoKHN0cnVjdCBuZXRfZGV2aWNlICopZGF0YSk7CisvLwlETUVTRygiLS0tLT53YXRjaF9kb2dfYWRhcHRpdmUoKVxuIik7CisJaWYoIXByaXYtPnVwKQorCXsKKwkJRE1FU0coIjwtLS0td2F0Y2hfZG9nX2FkYXB0aXZlKCk6ZHJpdmVyIGlzIG5vdCB1cCFcbiIpOworCQlyZXR1cm47CisJfQorCisgIC8vICAgICAgcXVldWVfd29yayhwcml2LT5pZWVlODAyMTEtPndxLCZwcml2LT5pZWVlODAyMTEtPndhdGNoX2RvZ193cSk7CisvL3tieSBhbXkgMDgwMzEyCisjaWYgMQorCS8vIFR4IEhpZ2ggUG93ZXIgTWVjaGFuaXNtLgorI2lmZGVmIEhJR0hfUE9XRVIKKwlpZihDaGVja0hpZ2hQb3dlcigoc3RydWN0IG5ldF9kZXZpY2UgKilkYXRhKSkKKwl7CisJCXF1ZXVlX3dvcmsocHJpdi0+aWVlZTgwMjExLT53cSwgKHZvaWQgKikmcHJpdi0+aWVlZTgwMjExLT50eF9wd193cSk7CisJfQorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfUlRMODE4WF9TCisJLy8gVHggUG93ZXIgVHJhY2tpbmcgb24gODdTRS4KKyNpZmRlZiBUWF9UUkFDSworCS8vaWYoIHByaXYtPmJUeFBvd2VyVHJhY2sgKQkvL2x6bSBtb2QgMDgwODI2CisJaWYoIENoZWNrVHhQd3JUcmFja2luZygoc3RydWN0IG5ldF9kZXZpY2UgKilkYXRhKSk7CisJCVR4UHdyVHJhY2tpbmc4N1NFKChzdHJ1Y3QgbmV0X2RldmljZSAqKWRhdGEpOworI2VuZGlmCisjZW5kaWYKKworCS8vIFBlcmZvcm0gRElHIGltbWVkaWF0ZWx5LgorI2lmZGVmIFNXX0RJRworCWlmKENoZWNrRGlnKChzdHJ1Y3QgbmV0X2RldmljZSAqKWRhdGEpID09IHRydWUpCisJeworCQlxdWV1ZV93b3JrKHByaXYtPmllZWU4MDIxMS0+d3EsICh2b2lkICopJnByaXYtPmllZWU4MDIxMS0+aHdfZGlnX3dxKTsKKwl9CisjZW5kaWYKKyNlbmRpZgorLy9ieSBhbXkgMDgwMzEyfQorICAgCXJ0bDgxODBfd2F0Y2hfZG9nKChzdHJ1Y3QgbmV0X2RldmljZSAqKWRhdGEpOworCisKKwlxdWV1ZV93b3JrKHByaXYtPmllZWU4MDIxMS0+d3EsICh2b2lkICopJnByaXYtPmllZWU4MDIxMS0+R1BJT0NoYW5nZVJGV29ya0l0ZW0pOworCisgICAJcHJpdi0+d2F0Y2hfZG9nX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgTVNFQ1MoSUVFRTgwMjExX1dBVENIX0RPR19USU1FKTsKKwlhZGRfdGltZXIoJnByaXYtPndhdGNoX2RvZ190aW1lcik7CisvLyAgICAgICAgRE1FU0coIjwtLS0td2F0Y2hfZG9nX2FkYXB0aXZlKClcbiIpOworfQorCisjaWZkZWYgRU5BQkxFX0RPVDExRAorCitzdGF0aWMgQ0hBTk5FTF9MSVNUIENoYW5uZWxQbGFuW10gPSB7CisJe3sxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwzNiw0MCw0NCw0OCw1Miw1Niw2MCw2NH0sMTl9LCAgCQkvL0ZDQworCXt7MSwyLDMsNCw1LDYsNyw4LDksMTAsMTF9LDExfSwgICAgICAgICAgICAgICAgICAgIAkJCQkvL0lDCisJe3sxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywzNiw0MCw0NCw0OCw1Miw1Niw2MCw2NH0sMjF9LCAgCS8vRVRTSQorCXt7MSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIsMTMsMzYsNDAsNDQsNDgsNTIsNTYsNjAsNjR9LDIxfSwgICAgLy9TcGFpbi4gQ2hhbmdlIHRvIEVUU0kuCisJe3sxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywzNiw0MCw0NCw0OCw1Miw1Niw2MCw2NH0sMjF9LCAgCS8vRnJhbmNlLiBDaGFuZ2UgdG8gRVRTSS4KKwl7ezE0LDM2LDQwLDQ0LDQ4LDUyLDU2LDYwLDY0fSw5fSwJCQkJCQkvL01LSworCXt7MSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIsMTMsMTQsIDM2LDQwLDQ0LDQ4LDUyLDU2LDYwLDY0fSwyMn0sLy9NS0sxCisJe3sxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywzNiw0MCw0NCw0OCw1Miw1Niw2MCw2NH0sMjF9LAkvL0lzcmFlbC4KKwl7ezEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyLDEzLDM0LDM4LDQyLDQ2fSwxN30sCQkJLy8gRm9yIDExYSAsIFRFTEVDCisJe3sxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNH0sMTR9LCAgLy9Gb3IgR2xvYmFsIERvbWFpbi4gMS0xMTphY3RpdmUgc2NhbiwgMTItMTQgcGFzc2l2ZSBzY2FuLiAvLytZSiwgMDgwNjI2CisJe3sxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxM30sMTN9IC8vd29ybGQgd2lkZSAxMzogY2gxfmNoMTEgYWN0aXZlIHNjYW4sIGNoMTJ+MTMgcGFzc2l2ZSAvL2x6bSBhZGQgMDgwODI2Cit9OworCitzdGF0aWMgdm9pZCBydGw4MTgwX3NldF9jaGFubmVsX21hcCh1OCBjaGFubmVsX3BsYW4sIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCWludCBpOworCisJLy9sem0gYWRkIDA4MDgyNgorCWllZWUtPk1pblBhc3NpdmVDaG5sTnVtPU1BWF9DSEFOTkVMX05VTUJFUisxOworCWllZWUtPklic3NTdGFydENobmw9MDsKKworCXN3aXRjaCAoY2hhbm5lbF9wbGFuKQorCXsKKwkJY2FzZSBDT1VOVFJZX0NPREVfRkNDOgorCQljYXNlIENPVU5UUllfQ09ERV9JQzoKKwkJY2FzZSBDT1VOVFJZX0NPREVfRVRTSToKKwkJY2FzZSBDT1VOVFJZX0NPREVfU1BBSU46CisJCWNhc2UgQ09VTlRSWV9DT0RFX0ZSQU5DRToKKwkJY2FzZSBDT1VOVFJZX0NPREVfTUtLOgorCQljYXNlIENPVU5UUllfQ09ERV9NS0sxOgorCQljYXNlIENPVU5UUllfQ09ERV9JU1JBRUw6CisJCWNhc2UgQ09VTlRSWV9DT0RFX1RFTEVDOgorCQl7CisJCQlEb3QxMWRfSW5pdChpZWVlKTsKKwkJCWllZWUtPmJHbG9iYWxEb21haW4gPSBmYWxzZTsKKwkJCWlmIChDaGFubmVsUGxhbltjaGFubmVsX3BsYW5dLkxlbiAhPSAwKXsKKwkJCQkvLyBDbGVhciBvbGQgY2hhbm5lbCBtYXAKKwkJCQltZW1zZXQoR0VUX0RPVDExRF9JTkZPKGllZWUpLT5jaGFubmVsX21hcCwgMCwgc2l6ZW9mKEdFVF9ET1QxMURfSU5GTyhpZWVlKS0+Y2hhbm5lbF9tYXApKTsKKwkJCQkvLyBTZXQgbmV3IGNoYW5uZWwgbWFwCisJCQkJZm9yIChpPTA7aTxDaGFubmVsUGxhbltjaGFubmVsX3BsYW5dLkxlbjtpKyspCisJCQkJeworCQkJCQlpZihDaGFubmVsUGxhbltjaGFubmVsX3BsYW5dLkNoYW5uZWxbaV0gPD0gMTQpCisJCQkJCQlHRVRfRE9UMTFEX0lORk8oaWVlZSktPmNoYW5uZWxfbWFwW0NoYW5uZWxQbGFuW2NoYW5uZWxfcGxhbl0uQ2hhbm5lbFtpXV0gPSAxOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQl9CisJCWNhc2UgQ09VTlRSWV9DT0RFX0dMT0JBTF9ET01BSU46CisJCXsKKwkJCUdFVF9ET1QxMURfSU5GTyhpZWVlKS0+YkVuYWJsZWQgPSAwOworCQkJRG90MTFkX1Jlc2V0KGllZWUpOworCQkJaWVlZS0+Ykdsb2JhbERvbWFpbiA9IHRydWU7CisJCQlicmVhazsKKwkJfQorCQljYXNlIENPVU5UUllfQ09ERV9XT1JMRF9XSURFXzEzX0lOREVYOi8vbHptIGFkZCAwODA4MjYKKwkJeworCQlpZWVlLT5NaW5QYXNzaXZlQ2hubE51bT0xMjsKKwkJaWVlZS0+SWJzc1N0YXJ0Q2hubD0gMTA7CisJCWJyZWFrOworCQl9CisJCWRlZmF1bHQ6CisJCXsKKwkJCURvdDExZF9Jbml0KGllZWUpOworCQkJaWVlZS0+Ykdsb2JhbERvbWFpbiA9IGZhbHNlOworCQkJbWVtc2V0KEdFVF9ET1QxMURfSU5GTyhpZWVlKS0+Y2hhbm5lbF9tYXAsIDAsIHNpemVvZihHRVRfRE9UMTFEX0lORk8oaWVlZSktPmNoYW5uZWxfbWFwKSk7CisJCQlmb3IgKGk9MTtpPD0xNDtpKyspCisJCQl7CisJCQkJR0VUX0RPVDExRF9JTkZPKGllZWUpLT5jaGFubmVsX21hcFtpXSA9IDE7CisJCQl9CisJCQlicmVhazsKKwkJfQorCX0KK30KKyNlbmRpZgorCisvL0FkZCBmb3IgUkYgcG93ZXIgb24gcG93ZXIgb2ZmIGJ5IGxpemhhb21pbmcgMDgwNTEyCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMjApKQordm9pZCBHUElPQ2hhbmdlUkZXb3JrSXRlbUNhbGxCYWNrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CisjZWxzZQordm9pZCBHUElPQ2hhbmdlUkZXb3JrSXRlbUNhbGxCYWNrKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKKyNlbmRpZgorCisvL1lKLGFkZCwwODA4MjgKK3N0YXRpYyB2b2lkIHJ0bDgxODBfc3RhdGlzdGljc19pbml0KHN0cnVjdCBTdGF0cyAqcHN0YXRzKQoreworCW1lbXNldChwc3RhdHMsIDAsIHNpemVvZihzdHJ1Y3QgU3RhdHMpKTsKK30KK3N0YXRpYyB2b2lkIHJ0bDgxODBfbGlua19kZXRlY3RfaW5pdChwbGlua19kZXRlY3RfdCBwbGlua19kZXRlY3QpCit7CisJbWVtc2V0KHBsaW5rX2RldGVjdCwgMCwgc2l6ZW9mKGxpbmtfZGV0ZWN0X3QpKTsKKwlwbGlua19kZXRlY3QtPlNsb3ROdW0gPSBERUZBVUxUX1NMT1RfTlVNOworfQorLy9ZSixhZGQsMDgwODI4LGVuZAorCitzaG9ydCBydGw4MTgwX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJdTE2IHdvcmQ7CisJdTE2IHZlcnNpb247CisJdTggaHdfdmVyc2lvbjsKKwkvL3U4IGNvbmZpZzM7CisJdTMyIHVzVmFsdWU7CisJdTE2IHRtcHUxNjsKKwlpbnQgaSwgajsKKworI2lmZGVmIEVOQUJMRV9ET1QxMUQKKyNpZiAwCisJZm9yKGk9MDtpPDB4RkY7aSsrKSB7CisJCWlmKGklMTYgPT0gMCkKKwkJCXByaW50aygiXG5bJXhdOiAiLCBpLzE2KTsKKwkJcHJpbnRrKCJcdCU0LjR4IiwgZXByb21fcmVhZChkZXYsaSkpOworCX0KKyNlbmRpZgorCXByaXYtPmNoYW5uZWxfcGxhbiA9IGVwcm9tX3JlYWQoZGV2LCBFRVBST01fQ09VTlRSWV9DT0RFPj4xKSAmIDB4RkY7CisJaWYocHJpdi0+Y2hhbm5lbF9wbGFuID4gQ09VTlRSWV9DT0RFX0dMT0JBTF9ET01BSU4peworCQlwcmludGsoInJ0bDgxODBfaW5pdDpFcnJvciBjaGFubmVsIHBsYW4hIFNldCB0byBkZWZhdWx0LlxuIik7CisJCXByaXYtPmNoYW5uZWxfcGxhbiA9IDA7CisJfQorCS8vcHJpdi0+Y2hhbm5lbF9wbGFuID0gOTsgIC8vR2xvYmFsIERvbWFpbgorCisJRE1FU0coIkNoYW5uZWwgcGxhbiBpcyAlZFxuIixwcml2LT5jaGFubmVsX3BsYW4pOworCXJ0bDgxODBfc2V0X2NoYW5uZWxfbWFwKHByaXYtPmNoYW5uZWxfcGxhbiwgcHJpdi0+aWVlZTgwMjExKTsKKyNlbHNlCisJaW50IGNoOworCS8vU2V0IERlZmF1bHQgQ2hhbm5lbCBQbGFuCisJaWYoIWNoYW5uZWxzKXsKKwkJRE1FU0coIk5vIGNoYW5uZWxzLCBhYm9ydGluZyIpOworCQlyZXR1cm4gLTE7CisJfQorCWNoPWNoYW5uZWxzOworCXByaXYtPmNoYW5uZWxfcGxhbiA9IDA7Ly9oaWthcnUKKwkgLy8gc2V0IGNoYW5uZWxzIDEuLjE0IGFsbG93ZWQgaW4gZ2l2ZW4gbG9jYWxlCisJZm9yIChpPTE7IGk8PTE0OyBpKyspIHsKKwkJKHByaXYtPmllZWU4MDIxMS0+Y2hhbm5lbF9tYXApW2ldID0gKHU4KShjaCAmIDB4MDEpOworCQljaCA+Pj0gMTsKKwl9CisjZW5kaWYKKworCS8vbWVtY3B5KHByaXYtPnN0YXRzLDAsc2l6ZW9mKHN0cnVjdCBTdGF0cykpOworCisJLy9GSVhNRTogdGhlc2UgY29uc3RhbnRzIGFyZSBwbGFjZWQgaW4gYSBiYWQgcGxlYWNlLgorCXByaXYtPnR4YnVmZnNpemUgPSAyMDQ4Oy8vMTAyNDsKKwlwcml2LT50eHJpbmdjb3VudCA9IDMyOy8vMzI7CisJcHJpdi0+cnhidWZmZXJzaXplID0gMjA0ODsvLzEwMjQ7CisJcHJpdi0+cnhyaW5nY291bnQgPSA2NDsvLzMyOworCXByaXYtPnR4YmVhY29uY291bnQgPSAyOworCXByaXYtPnJ4X3NrYl9jb21wbGV0ZSA9IDE7CisJLy9wcml2LT50eG5wX3BlbmRpbmcuaXNwZW5kaW5nPTA7CisJLyogXl4gdGhlIFNLQiBkb2VzIG5vdCBjb250YWludCBhIHBhcnRpYWwgUlhlZAorCSAqIHBhY2tldCAoaXMgZW1wdHkpCisJICovCisKKyNpZmRlZiBDT05GSUdfUlRMODE4NUIKKyNpZmRlZiBDT05GSUdfUlRMODE4WF9TCisJcHJpdi0+UmVnVGhyZWVXaXJlTW9kZSA9IEhXX1RIUkVFX1dJUkVfU0k7CisjZWxzZQorICAgICAgICBwcml2LT5SZWdUaHJlZVdpcmVNb2RlID0gU1dfVEhSRUVfV0lSRTsKKyNlbmRpZgorI2VuZGlmCisKKy8vQWRkIGZvciBSRiBwb3dlciBvbiBwb3dlciBvZmYgYnkgbGl6aGFvbWluZyAwODA1MTIKKwlwcml2LT5SRkNoYW5nZUluUHJvZ3Jlc3MgPSBmYWxzZTsKKwlwcml2LT5TZXRSRlBvd2VyU3RhdGVJblByb2dyZXNzID0gZmFsc2U7CisJcHJpdi0+UkZQcm9nVHlwZSA9IDA7CisJcHJpdi0+YkluSGN0VGVzdCA9IGZhbHNlOworCisJcHJpdi0+aXJxX2VuYWJsZWQ9MDsKKworLy9ZSixtb2RpZmllZCwwODA4MjgKKyNpZiAwCisJcHJpdi0+c3RhdHMucnhkbWFmYWlsPTA7CisJcHJpdi0+c3RhdHMudHhyZHU9MDsKKwlwcml2LT5zdGF0cy5yeHJkdT0wOworCXByaXYtPnN0YXRzLnJ4bm9sYXN0PTA7CisJcHJpdi0+c3RhdHMucnhub2RhdGE9MDsKKwkvL3ByaXYtPnN0YXRzLnJ4cmVzZXQ9MDsKKwkvL3ByaXYtPnN0YXRzLnJ4d3JrYXJvdW5kPTA7CisJcHJpdi0+c3RhdHMucnhub3BvaW50ZXI9MDsKKwlwcml2LT5zdGF0cy50eG5wZXJyPTA7CisJcHJpdi0+c3RhdHMudHhyZXN1bWVkPTA7CisJcHJpdi0+c3RhdHMucnhlcnI9MDsKKwlwcml2LT5zdGF0cy5yeG92ZXJmbG93PTA7CisJcHJpdi0+c3RhdHMucnhpbnQ9MDsKKwlwcml2LT5zdGF0cy50eG5wb2tpbnQ9MDsKKwlwcml2LT5zdGF0cy50eGhwb2tpbnQ9MDsKKwlwcml2LT5zdGF0cy50eGhwZXJyPTA7CisJcHJpdi0+c3RhdHMuaW50cz0wOworCXByaXYtPnN0YXRzLnNoaW50cz0wOworCXByaXYtPnN0YXRzLnR4b3ZlcmZsb3c9MDsKKwlwcml2LT5zdGF0cy50eGJlYWNvbj0wOworCXByaXYtPnN0YXRzLnR4YmVhY29uZXJyPTA7CisJcHJpdi0+c3RhdHMudHhscGVycj0wOworCXByaXYtPnN0YXRzLnR4bHBva2ludD0wOworCXByaXYtPnN0YXRzLnR4cmV0cnk9MDsvL3RvbnkgMjAwNjA2MDEKKwlwcml2LT5zdGF0cy5yeGNyY2Vycm1pbj0wOworCXByaXYtPnN0YXRzLnJ4Y3JjZXJybWlkPTA7CisJcHJpdi0+c3RhdHMucnhjcmNlcnJtYXg9MDsKKwlwcml2LT5zdGF0cy5yeGljdmVycj0wOworI2Vsc2UKKwlydGw4MTgwX3N0YXRpc3RpY3NfaW5pdCgmcHJpdi0+c3RhdHMpOworCXJ0bDgxODBfbGlua19kZXRlY3RfaW5pdCgmcHJpdi0+bGlua19kZXRlY3QpOworI2VuZGlmCisvL1lKLG1vZGlmaWVkLDA4MDgyOCxlbmQKKworCisJcHJpdi0+YWNrX3R4X3RvX2llZWUgPSAwOworCXByaXYtPmllZWU4MDIxMS0+Y3VycmVudF9uZXR3b3JrLmJlYWNvbl9pbnRlcnZhbCA9IERFRkFVTFRfQkVBQ09OSU5URVJWQUw7CisJcHJpdi0+aWVlZTgwMjExLT5pd19tb2RlID0gSVdfTU9ERV9JTkZSQTsKKwlwcml2LT5pZWVlODAyMTEtPnNvZnRtYWNfZmVhdHVyZXMgID0gSUVFRV9TT0ZUTUFDX1NDQU4gfAorCQlJRUVFX1NPRlRNQUNfQVNTT0NJQVRFIHwgSUVFRV9TT0ZUTUFDX1BST0JFUlEgfAorCQlJRUVFX1NPRlRNQUNfUFJPQkVSUyB8IElFRUVfU09GVE1BQ19UWF9RVUVVRTsKKwlwcml2LT5pZWVlODAyMTEtPmFjdGl2ZV9zY2FuID0gMTsKKwlwcml2LT5pZWVlODAyMTEtPnJhdGUgPSAxMTA7IC8vMTEgbWJwcworCXByaXYtPmllZWU4MDIxMS0+bW9kdWxhdGlvbiA9IElFRUU4MDIxMV9DQ0tfTU9EVUxBVElPTjsKKwlwcml2LT5pZWVlODAyMTEtPmhvc3RfZW5jcnlwdCA9IDE7CisJcHJpdi0+aWVlZTgwMjExLT5ob3N0X2RlY3J5cHQgPSAxOworCXByaXYtPmllZWU4MDIxMS0+c3RhX3dha2VfdXAgPSBydGw4MTgwX2h3X3dha2V1cDsKKwlwcml2LT5pZWVlODAyMTEtPnBzX3JlcXVlc3RfdHhfYWNrID0gcnRsODE4MF9ycV90eF9hY2s7CisJcHJpdi0+aWVlZTgwMjExLT5lbnRlcl9zbGVlcF9zdGF0ZSA9IHJ0bDgxODBfaHdfc2xlZXA7CisJcHJpdi0+aWVlZTgwMjExLT5wc19pc19xdWV1ZV9lbXB0eSA9IHJ0bDgxODBfaXNfdHhfcXVldWVfZW1wdHk7CisKKwlwcml2LT5od193ZXAgPSBod3dlcDsKKwlwcml2LT5wcmlzbV9oZHI9MDsKKwlwcml2LT5kZXY9ZGV2OworCXByaXYtPnJldHJ5X3J0cyA9IERFRkFVTFRfUkVUUllfUlRTOworCXByaXYtPnJldHJ5X2RhdGEgPSBERUZBVUxUX1JFVFJZX0RBVEE7CisJcHJpdi0+UkZDaGFuZ2VJblByb2dyZXNzID0gZmFsc2U7CisJcHJpdi0+U2V0UkZQb3dlclN0YXRlSW5Qcm9ncmVzcyA9IGZhbHNlOworCXByaXYtPlJGUHJvZ1R5cGUgPSAwOworCXByaXYtPmJJbkhjdFRlc3QgPSBmYWxzZTsKKwlwcml2LT5iSW5hY3RpdmVQcyA9IHRydWU7Ly9mYWxzZTsKKwlwcml2LT5pZWVlODAyMTEtPmJJbmFjdGl2ZVBzID0gcHJpdi0+YkluYWN0aXZlUHM7CisJcHJpdi0+YlN3UmZQcm9jZXNzaW5nID0gZmFsc2U7CisJcHJpdi0+ZVJGUG93ZXJTdGF0ZSA9IGVSZk9mZjsKKwlwcml2LT5SZk9mZlJlYXNvbiA9IDA7CisJcHJpdi0+TGVkU3RyYXRlZ3kgPSBTV19MRURfTU9ERTA7CisJLy9wcml2LT5OdW1SeE9rSW5QZXJpb2QgPSAwOyAgLy9ZSixkZWwsMDgwODI4CisJLy9wcml2LT5OdW1UeE9rSW5QZXJpb2QgPSAwOyAgLy9ZSixkZWwsMDgwODI4CisJcHJpdi0+VHhQb2xsaW5nVGltZXMgPSAwOy8vbHptIGFkZCAwODA4MjYKKwlwcml2LT5iTGVpc3VyZVBzID0gdHJ1ZTsKKwlwcml2LT5kb3QxMVBvd2VyU2F2ZU1vZGUgPSBlQWN0aXZlOworLy9ieSBhbXkgZm9yIGFudGVubmEKKwlwcml2LT5BZE1pbkNoZWNrUGVyaW9kID0gNTsKKwlwcml2LT5BZE1heENoZWNrUGVyaW9kID0gMTA7CisvLyBMb3dlciBzaWduYWwgc3RyZW5ndGggdGhyZXNob2xkIHRvIGZpdCB0aGUgSFcgcGFydGljaXBhdGlvbiBpbiBhbnRlbm5hIGRpdmVyc2l0eS4gK2J5IGFteSAwODAzMTIKKwlwcml2LT5BZE1heFJ4U3NUaHJlc2hvbGQgPSAzMDsvLzYwLT4zMAorCXByaXYtPkFkUnhTc1RocmVzaG9sZCA9IDIwOy8vNTAtPjIwCisJcHJpdi0+QWRDaGVja1BlcmlvZCA9IHByaXYtPkFkTWluQ2hlY2tQZXJpb2Q7CisJcHJpdi0+QWRUaWNrQ291bnQgPSAwOworCXByaXYtPkFkUnhTaWduYWxTdHJlbmd0aCA9IC0xOworCXByaXYtPlJlZ1N3QW50ZW5uYURpdmVyc2l0eU1lY2hhbmlzbSA9IDA7CisJcHJpdi0+UmVnRGVmYXVsdEFudGVubmEgPSAwOworCXByaXYtPlNpZ25hbFN0cmVuZ3RoID0gMDsKKwlwcml2LT5BZFJ4T2tDbnQgPSAwOworCXByaXYtPkN1cnJBbnRlbm5hSW5kZXggPSAwOworCXByaXYtPkFkUnhTc0JlZm9yZVN3aXRjaGVkID0gMDsKKwlpbml0X3RpbWVyKCZwcml2LT5Td0FudGVubmFEaXZlcnNpdHlUaW1lcik7CisJcHJpdi0+U3dBbnRlbm5hRGl2ZXJzaXR5VGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKWRldjsKKwlwcml2LT5Td0FudGVubmFEaXZlcnNpdHlUaW1lci5mdW5jdGlvbiA9ICh2b2lkICopU3dBbnRlbm5hRGl2ZXJzaXR5VGltZXJDYWxsYmFjazsKKy8vYnkgYW15IGZvciBhbnRlbm5hCisvL3tieSBhbXkgMDgwMzEyCisJcHJpdi0+YkRpZ01lY2hhbmlzbSA9IDE7CisJcHJpdi0+SW5pdGlhbEdhaW4gPSA2OworCXByaXYtPmJYdGFsQ2FsaWJyYXRpb24gPSBmYWxzZTsKKwlwcml2LT5YdGFsQ2FsX1hpbiA9IDA7CisJcHJpdi0+WHRhbENhbF9Yb3V0ID0gMDsKKwlwcml2LT5iVHhQb3dlclRyYWNrID0gZmFsc2U7CisJcHJpdi0+VGhlcm1hbE1ldGVyID0gMDsKKwlwcml2LT5GYWxzZUFsYXJtUmVnVmFsdWUgPSAwOworCXByaXYtPlJlZ0RpZ09mZG1GYVVwVGggPSAweGM7IC8vIFVwcGVyIHRocmVob2xkIG9mIE9GRE0gZmFsc2UgYWxhcm0sIHdoaWNoIGlzIHVzZWQgaW4gRElHLgorCXByaXYtPkRJR19OdW1iZXJGYWxsYmFja1ZvdGUgPSAwOworCXByaXYtPkRJR19OdW1iZXJVcGdyYWRlVm90ZSA9IDA7CisJcHJpdi0+TGFzdFNpZ25hbFN0cmVuZ3RoSW5QZXJjZW50ID0gMDsKKwlwcml2LT5TdGF0c19TaWduYWxTdHJlbmd0aCA9IDA7CisJcHJpdi0+TGFzdFJ4UGt0QW50ZW5uYSA9IDA7CisJcHJpdi0+U2lnbmFsUXVhbGl0eSA9IDA7IC8vIGluIDAtMTAwIGluZGV4LgorCXByaXYtPlN0YXRzX1NpZ25hbFF1YWxpdHkgPSAwOworCXByaXYtPlJlY3ZTaWduYWxQb3dlciA9IDA7IC8vIGluIGRCbS4KKwlwcml2LT5TdGF0c19SZWN2U2lnbmFsUG93ZXIgPSAwOworCXByaXYtPkFkTWFpbkFudGVubmFSeE9rQ250ID0gMDsKKwlwcml2LT5BZEF1eEFudGVubmFSeE9rQ250ID0gMDsKKwlwcml2LT5iSFdBZFN3aXRjaGVkID0gZmFsc2U7CisJcHJpdi0+YlJlZ0hpZ2hQb3dlck1lY2hhbmlzbSA9IHRydWU7CisJcHJpdi0+UmVnSGlQd3JVcHBlclRoID0gNzc7CisJcHJpdi0+UmVnSGlQd3JMb3dlclRoID0gNzU7CisJcHJpdi0+UmVnUlNTSUhpUHdyVXBwZXJUaCA9IDcwOworCXByaXYtPlJlZ1JTU0lIaVB3ckxvd2VyVGggPSAyMDsKKwlwcml2LT5iQ3VyQ0NLUGt0ID0gZmFsc2U7CisJcHJpdi0+VW5kZWNvcmF0ZWRTbW9vdGhlZFNTID0gLTE7CisJcHJpdi0+YlRvVXBkYXRlVHhQd3IgPSBmYWxzZTsKKwlwcml2LT5DdXJDQ0tSU1NJID0gMDsKKwlwcml2LT5SeFBvd2VyID0gMDsKKwlwcml2LT5SU1NJID0gMDsKKwkvL1lKLGFkZCwwODA4MjgKKwlwcml2LT5OdW1UeE9rVG90YWwgPSAwOworCXByaXYtPk51bVR4VW5pY2FzdCA9IDA7CisJcHJpdi0+a2VlcEFsaXZlTGV2ZWwgPSBERUZBVUxUX0tFRVBfQUxJVkVfTEVWRUw7CisJcHJpdi0+UG93ZXJQcm9maWxlID0gUE9XRVJfUFJPRklMRV9BQzsKKwkvL1lKLGFkZCwwODA4MjgsZW5kCisvL2J5IGFteSBmb3IgcmF0ZSBhZGFwdGl2ZQorICAgIHByaXYtPkN1cnJSZXRyeUNudD0wOworICAgIHByaXYtPkxhc3RSZXRyeUNudD0wOworICAgIHByaXYtPkxhc3RUeG9rQ250PTA7CisgICAgcHJpdi0+TGFzdFJ4b2tDbnQ9MDsKKyAgICBwcml2LT5MYXN0UmV0cnlSYXRlPTA7CisgICAgcHJpdi0+YlRyeXVwaW5nPTA7CisgICAgcHJpdi0+Q3VyclR4UmF0ZT0wOworICAgIHByaXYtPkN1cnJSZXRyeVJhdGU9MDsKKyAgICBwcml2LT5Ucnl1cGluZ0NvdW50PTA7CisgICAgcHJpdi0+VHJ5dXBpbmdDb3VudE5vRGF0YT0wOworICAgIHByaXYtPlRyeURvd25Db3VudExvd0RhdGE9MDsKKyAgICBwcml2LT5MYXN0VHhPS0J5dGVzPTA7CisgICAgcHJpdi0+TGFzdEZhaWxUeFJhdGU9MDsKKyAgICBwcml2LT5MYXN0RmFpbFR4UmF0ZVNTPTA7CisgICAgcHJpdi0+RmFpbFR4UmF0ZUNvdW50PTA7CisgICAgcHJpdi0+TGFzdFR4VGhyb3VnaHB1dD0wOworICAgIHByaXYtPk51bVR4T2tCeXRlc1RvdGFsPTA7CisJcHJpdi0+Rm9yY2VkRGF0YVJhdGUgPSAwOworCXByaXYtPlJlZ0JNb2RlR2FpblN0YWdlID0gMTsKKworLy9ieSBhbXkgZm9yIHJhdGUgYWRhcHRpdmUKKy8vYnkgYW15IDA4MDMxMn0KKwlwcml2LT5wcm9taXNjID0gKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgPyAxOjA7CisJc3Bpbl9sb2NrX2luaXQoJnByaXYtPmlycV9sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmcHJpdi0+aXJxX3RoX2xvY2spOworCXNwaW5fbG9ja19pbml0KCZwcml2LT50eF9sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmcHJpdi0+cHNfbG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJnByaXYtPnJmX3BzX2xvY2spOworCXNlbWFfaW5pdCgmcHJpdi0+d3hfc2VtLDEpOworCXNlbWFfaW5pdCgmcHJpdi0+cmZfc3RhdGUsMSk7CisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMjApKQorCUlOSVRfV09SSygmcHJpdi0+cmVzZXRfd3EsKHZvaWQqKSBydGw4MTgwX3Jlc3RhcnRfd3EpOworCUlOSVRfV09SSygmcHJpdi0+dHhfaXJxX3dxLCh2b2lkKikgcnRsODE4MF90eF9pcnFfd3EpOworCUlOSVRfREVMQVlFRF9XT1JLKCZwcml2LT5pZWVlODAyMTEtPmh3X3dha2V1cF93cSwodm9pZCopIHJ0bDgxODBfaHdfd2FrZXVwX3dxKTsKKwlJTklUX0RFTEFZRURfV09SSygmcHJpdi0+aWVlZTgwMjExLT5od19zbGVlcF93cSwodm9pZCopIHJ0bDgxODBfaHdfc2xlZXBfd3EpOworCS8vSU5JVF9ERUxBWUVEX1dPUksoJnByaXYtPmllZWU4MDIxMS0+d2F0Y2hfZG9nX3dxLCh2b2lkKikgcnRsODE4MF93YXRjaF9kb2dfd3EpOworCS8vSU5JVF9ERUxBWUVEX1dPUksoJnByaXYtPmllZWU4MDIxMS0+c3dfYW50ZW5uYV93cSwodm9pZCopIHJ0bDgxODBfc3dfYW50ZW5uYV93cSk7CisJSU5JVF9XT1JLKCZwcml2LT5pZWVlODAyMTEtPndtbV9wYXJhbV91cGRhdGVfd3EsKHZvaWQqKSBydGw4MTgwX3dtbV9wYXJhbV91cGRhdGUpOworCUlOSVRfREVMQVlFRF9XT1JLKCZwcml2LT5pZWVlODAyMTEtPnJhdGVfYWRhcHRlcl93cSwodm9pZCopcnRsODE4MF9yYXRlX2FkYXB0ZXIpOy8vK2J5IGFteSAwODAzMTIKKwlJTklUX0RFTEFZRURfV09SSygmcHJpdi0+aWVlZTgwMjExLT5od19kaWdfd3EsKHZvaWQqKXJ0bDgxODBfaHdfZGlnX3dxKTsvLytieSBhbXkgMDgwMzEyCisJSU5JVF9ERUxBWUVEX1dPUksoJnByaXYtPmllZWU4MDIxMS0+dHhfcHdfd3EsKHZvaWQqKXJ0bDgxODBfdHhfcHdfd3EpOy8vK2J5IGFteSAwODAzMTIKKworCS8vYWRkIGZvciBSRiBwb3dlciBvbiBwb3dlciBvZmYgYnkgbGl6aGFvbWluZyAwODA1MTIKKwlJTklUX0RFTEFZRURfV09SSygmcHJpdi0+aWVlZTgwMjExLT5HUElPQ2hhbmdlUkZXb3JrSXRlbSwodm9pZCopIEdQSU9DaGFuZ2VSRldvcmtJdGVtQ2FsbEJhY2spOworI2Vsc2UKKwlJTklUX1dPUksoJnByaXYtPnJlc2V0X3dxLCh2b2lkKikgcnRsODE4MF9yZXN0YXJ0X3dxLGRldik7CisJSU5JVF9XT1JLKCZwcml2LT50eF9pcnFfd3EsKHZvaWQqKSBydGw4MTgwX3R4X2lycV93cSxkZXYpOworCS8vSU5JVF9XT1JLKCZwcml2LT5pZWVlODAyMTEtPndhdGNoX2RvZ193cSwodm9pZCopIHJ0bDgxODBfd2F0Y2hfZG9nX3dxLGRldik7CisJSU5JVF9XT1JLKCZwcml2LT5pZWVlODAyMTEtPmh3X3dha2V1cF93cSwodm9pZCopIHJ0bDgxODBfaHdfd2FrZXVwX3dxLGRldik7CisJSU5JVF9XT1JLKCZwcml2LT5pZWVlODAyMTEtPmh3X3NsZWVwX3dxLCh2b2lkKikgcnRsODE4MF9od19zbGVlcF93cSxkZXYpOworCS8vSU5JVF9XT1JLKCZwcml2LT5pZWVlODAyMTEtPnN3X2FudGVubmFfd3EsKHZvaWQqKSBydGw4MTgwX3N3X2FudGVubmFfd3EsZGV2KTsKKwlJTklUX1dPUksoJnByaXYtPmllZWU4MDIxMS0+d21tX3BhcmFtX3VwZGF0ZV93cSwodm9pZCopIHJ0bDgxODBfd21tX3BhcmFtX3VwZGF0ZSxwcml2LT5pZWVlODAyMTEpOworICAgIElOSVRfV09SSygmcHJpdi0+aWVlZTgwMjExLT5yYXRlX2FkYXB0ZXJfd3EsKHZvaWQqKXJ0bDgxODBfcmF0ZV9hZGFwdGVyLGRldik7Ly8rYnkgYW15IDA4MDMxMgorCUlOSVRfV09SSygmcHJpdi0+aWVlZTgwMjExLT5od19kaWdfd3EsKHZvaWQqKXJ0bDgxODBfaHdfZGlnX3dxLGRldik7Ly8rYnkgYW15IDA4MDMxMgorCUlOSVRfV09SSygmcHJpdi0+aWVlZTgwMjExLT50eF9wd193cSwodm9pZCopcnRsODE4MF90eF9wd193cSxkZXYpOy8vK2J5IGFteSAwODAzMTIKKworCS8vYWRkIGZvciBSRiBwb3dlciBvbiBwb3dlciBvZmYgYnkgbGl6aGFvbWluZyAwODA1MTIKKwlJTklUX1dPUksoJnByaXYtPmllZWU4MDIxMS0+R1BJT0NoYW5nZVJGV29ya0l0ZW0sKHZvaWQqKSBHUElPQ2hhbmdlUkZXb3JrSXRlbUNhbGxCYWNrLCBwcml2LT5pZWVlODAyMTEpOworI2VuZGlmCisJLy9JTklUX1dPUksoJnByaXYtPnJlc2V0X3dxLCh2b2lkKikgcnRsODE4MF9yZXN0YXJ0X3dxLGRldik7CisKKwl0YXNrbGV0X2luaXQoJnByaXYtPmlycV9yeF90YXNrbGV0LAorCQkgICAgICh2b2lkKCopKHVuc2lnbmVkIGxvbmcpKSBydGw4MTgwX2lycV9yeF90YXNrbGV0LAorCQkgICAgICh1bnNpZ25lZCBsb25nKXByaXYpOworLy9ieSBhbXkKKyAgICBpbml0X3RpbWVyKCZwcml2LT53YXRjaF9kb2dfdGltZXIpOworCXByaXYtPndhdGNoX2RvZ190aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpZGV2OworCXByaXYtPndhdGNoX2RvZ190aW1lci5mdW5jdGlvbiA9IHdhdGNoX2RvZ19hZGFwdGl2ZTsKKy8vYnkgYW15CisKKy8ve2J5IGFteSAwODAzMTIKKy8vYnkgYW15IGZvciByYXRlIGFkYXB0aXZlCisgICAgaW5pdF90aW1lcigmcHJpdi0+cmF0ZWFkYXB0ZXJfdGltZXIpOworICAgICAgICBwcml2LT5yYXRlYWRhcHRlcl90aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpZGV2OworICAgICAgICBwcml2LT5yYXRlYWRhcHRlcl90aW1lci5mdW5jdGlvbiA9IHRpbWVyX3JhdGVfYWRhcHRpdmU7CisJCXByaXYtPlJhdGVBZGFwdGl2ZVBlcmlvZD0gUkFURV9BREFQVElWRV9USU1FUl9QRVJJT0Q7CisJCXByaXYtPmJFbmhhbmNlVHhQd3I9ZmFsc2U7CisvL2J5IGFteSBmb3IgcmF0ZSBhZGFwdGl2ZQorLy9ieSBhbXkgMDgwMzEyfQorCS8vcHJpdi0+aWVlZTgwMjExLT5mdW5jID0KKwkvLwlrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2hlbHBlcl9mdW5jdGlvbnMpLEdGUF9LRVJORUwpOworCS8vbWVtc2V0KHByaXYtPmllZWU4MDIxMS0+ZnVuYywgMCwKKwkgIC8vICAgICBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9oZWxwZXJfZnVuY3Rpb25zKSk7CisKKwlwcml2LT5pZWVlODAyMTEtPnNvZnRtYWNfaGFyZF9zdGFydF94bWl0ID0gcnRsODE4MF9oYXJkX3N0YXJ0X3htaXQ7CisJcHJpdi0+aWVlZTgwMjExLT5zZXRfY2hhbiA9IHJ0bDgxODBfc2V0X2NoYW47CisJcHJpdi0+aWVlZTgwMjExLT5saW5rX2NoYW5nZSA9IHJ0bDgxODBfbGlua19jaGFuZ2U7CisJcHJpdi0+aWVlZTgwMjExLT5zb2Z0bWFjX2RhdGFfaGFyZF9zdGFydF94bWl0ID0gcnRsODE4MF9oYXJkX2RhdGFfeG1pdDsKKwlwcml2LT5pZWVlODAyMTEtPmRhdGFfaGFyZF9zdG9wID0gcnRsODE4MF9kYXRhX2hhcmRfc3RvcDsKKwlwcml2LT5pZWVlODAyMTEtPmRhdGFfaGFyZF9yZXN1bWUgPSBydGw4MTgwX2RhdGFfaGFyZF9yZXN1bWU7CisKKyAgICAgICAgcHJpdi0+aWVlZTgwMjExLT5pbml0X3dtbXBhcmFtX2ZsYWcgPSAwOworCisJcHJpdi0+aWVlZTgwMjExLT5zdGFydF9zZW5kX2JlYWNvbnMgPSBydGw4MTgwX3N0YXJ0X3R4X2JlYWNvbjsKKwlwcml2LT5pZWVlODAyMTEtPnN0b3Bfc2VuZF9iZWFjb25zID0gcnRsODE4MF9iZWFjb25fdHhfZGlzYWJsZTsKKwlwcml2LT5pZWVlODAyMTEtPmZ0cyA9IERFRkFVTFRfRlJBR19USFJFU0hPTEQ7CisKKyNpZmRlZiBDT05GSUdfUlRMODE4NUIKKwlwcml2LT5NV0lFbmFibGUgPSAwOworCisJcHJpdi0+U2hvcnRSZXRyeUxpbWl0ID0gNzsKKwlwcml2LT5Mb25nUmV0cnlMaW1pdCA9IDc7CisJcHJpdi0+RWFybHlSeFRocmVzaG9sZCA9IDc7CisKKwlwcml2LT5DU01ldGhvZCA9ICgweDAxIDw8IDI5KTsKKworCXByaXYtPlRyYW5zbWl0Q29uZmlnCT0KKwkJCQkJCQkJCTE8PFRDUl9EdXJQcm9jTW9kZV9PRkZTRVQgfAkJLy9mb3IgUlRMODE4NUIsIGR1cmF0aW9uIHNldHRpbmcgYnkgSFcKKwkJCQkJCQkJCSg3PDxUQ1JfTVhETUFfT0ZGU0VUKSB8CS8vIE1heCBETUEgQnVyc3QgU2l6ZSBwZXIgVHggRE1BIEJ1cnN0LCA3OiByZXNlcnZpZWQuCisJCQkJCQkJCQkocHJpdi0+U2hvcnRSZXRyeUxpbWl0PDxUQ1JfU1JMX09GRlNFVCkgfAkvLyBTaG9ydCByZXRyeSBsaW1pdAorCQkJCQkJCQkJKHByaXYtPkxvbmdSZXRyeUxpbWl0PDxUQ1JfTFJMX09GRlNFVCkgfAkvLyBMb25nIHJldHJ5IGxpbWl0CisJCQkJCQkJCQkoMCA/IFRDUl9TQVQgOiAwKTsJLy8gRkFMU0U6IEhXIHByb3ZpZXMgUExDUCBsZW5ndGggYW5kIExFTkdFWFQsIFRVUkU6IFNXIHByb2l2ZWRzIHRoZW0KKworCXByaXYtPlJlY2VpdmVDb25maWcJPQorI2lmZGVmIENPTkZJR19SVEw4MThYX1MKKyNlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaXYtPkNTTWV0aG9kIHwKKyNlbmRpZgorLy8JCQkJCQkJCVJDUl9FTk1BUlAgfAorCQkJCQkJCQlSQ1JfQU1GIHwgUkNSX0FERiB8CQkJCS8vYWNjZXB0IG1hbmFnZW1lbnQvZGF0YQorCQkJCQkJCQlSQ1JfQUNGIHwJCQkJCQkvL2FjY2VwdCBjb250cm9sIGZyYW1lIGZvciBTVyBBUCBuZWVkcyBQUy1wb2xsLCAyMDA1LjA3LjA3LCBieSByY25qa28uCisJCQkJCQkJCVJDUl9BQiB8IFJDUl9BTSB8IFJDUl9BUE0gfAkJLy9hY2NlcHQgQkMvTUMvVUMKKwkJCQkJCQkJLy9SQ1JfQUlDViB8IFJDUl9BQ1JDMzIgfCAJCS8vYWNjZXB0IElDVi9DUkMgZXJyb3IgcGFja2V0CisJCQkJCQkJCSg3PDxSQ1JfTVhETUFfT0ZGU0VUKSB8IC8vIE1heCBETUEgQnVyc3QgU2l6ZSBwZXIgUnggRE1BIEJ1cnN0LCA3OiB1bmxpbWl0ZWQuCisJCQkJCQkJCShwcml2LT5FYXJseVJ4VGhyZXNob2xkPDxSQ1JfRklGT19PRkZTRVQpIHwgLy8gUnggRklGTyBUaHJlc2hvbGQsIDc6IE5vIFJ4IHRocmVzaG9sZC4KKwkJCQkJCQkJKHByaXYtPkVhcmx5UnhUaHJlc2hvbGQgPT0gNyA/IFJDUl9PTkxZRVJMUEtUOjApOworCisJcHJpdi0+SW50ck1hc2sJCT0gSU1SX1RNR0RPSyB8IElNUl9UQkRFUiB8IElNUl9USFBERVIgfAorCQkJCQkJCQlJTVJfVEhQREVSIHwgSU1SX1RIUERPSyB8CisJCQkJCQkJCUlNUl9UVk9ERVIgfCBJTVJfVFZPRE9LIHwKKwkJCQkJCQkJSU1SX1RWSURFUiB8IElNUl9UVklET0sgfAorCQkJCQkJCQlJTVJfVEJFREVSIHwgSU1SX1RCRURPSyB8CisJCQkJCQkJCUlNUl9UQktERVIgfCBJTVJfVEJLRE9LIHwKKwkJCQkJCQkJSU1SX1JEVSB8CQkJCQkJLy8gVG8gaGFuZGxlIHRoZSBkZWZyYWdtZW50YXRpb24gbm90IGVub3VnaCBSeCBkZXNjcmlwdG9ycyBjYXNlLiBBbm5pZSwgMjAwNi0wMy0yNy4KKwkJCQkJCQkJSU1SX1JFUiB8IElNUl9ST0sgfAorCQkJCQkJCQlJTVJfUlFvU09LOyAvLyA8Tk9URT4gUk9LIGFuZCBSUW9TT0sgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZSwgc28sIHdlIG11c3QgaGFuZGxlIFJRb1NPSyBpbnRlcnJ1cHQgdG8gcmVjZWl2ZSBRb1MgZnJhbWVzLCAyMDA1LjEyLjA5LCBieSByY25qa28uCisKKwlwcml2LT5Jbml0aWFsR2FpbiA9IDY7CisjZW5kaWYKKworCWh3X3ZlcnNpb24gPSggcmVhZF9uaWNfZHdvcmQoZGV2LCBUQ1IpICYgVENSX0hXVkVSSURfTUFTSyk+PlRDUl9IV1ZFUklEX1NISUZUOworCisJc3dpdGNoIChod192ZXJzaW9uKXsKKyNpZmRlZiBDT05GSUdfUlRMODE4NUIKKwkJY2FzZSBIV19WRVJJRF9SODE4NUJfQjoKKyNpZmRlZiBDT05GSUdfUlRMODE4WF9TCisgICAgICAgICAgICAgICAgICAgICAgICBwcml2LT5jYXJkXzgxODUgPSBWRVJTSU9OXzgxODdTX0M7CisJCSAgICAgICAgRE1FU0coIk1BQyBjb250cm9sbGVyIGlzIGEgUlRMODE4N1NFIGIvZyIpOworCQkJcHJpdi0+cGh5X3ZlciA9IDI7CisJCQlicmVhazsKKyNlbHNlCisJCQlETUVTRygiTUFDIGNvbnRyb2xsZXIgaXMgYSBSVEw4MTg1QiBiL2ciKTsKKwkJCXByaXYtPmNhcmRfODE4NSA9IDM7CisJCQlwcml2LT5waHlfdmVyID0gMjsKKwkJCWJyZWFrOworI2VuZGlmCisjZW5kaWYKKwkJY2FzZSBIV19WRVJJRF9SODE4NV9BQkM6CisJCQlETUVTRygiTUFDIGNvbnRyb2xsZXIgaXMgYSBSVEw4MTg1IGIvZyIpOworCQkJcHJpdi0+Y2FyZF84MTg1ID0gMTsKKwkJCS8qIHlvdSBzaG91bGQgbm90IGZpbmQgYSBjYXJkIHdpdGggODIyNSBQSFkgdmVyIDwgQyovCisJCQlwcml2LT5waHlfdmVyID0gMjsKKwkJCWJyZWFrOworCisJCWNhc2UgSFdfVkVSSURfUjgxODVfRDoKKwkJCURNRVNHKCJNQUMgY29udHJvbGxlciBpcyBhIFJUTDgxODUgYi9nIChWLiBEKSIpOworCQkJcHJpdi0+Y2FyZF84MTg1ID0gMjsKKwkJCS8qIHlvdSBzaG91bGQgbm90IGZpbmQgYSBjYXJkIHdpdGggODIyNSBQSFkgdmVyIDwgQyovCisJCQlwcml2LT5waHlfdmVyID0gMjsKKwkJCWJyZWFrOworCisJCWNhc2UgSFdfVkVSSURfUjgxODBfQUJDRDoKKwkJCURNRVNHKCJNQUMgY29udHJvbGxlciBpcyBhIFJUTDgxODAiKTsKKwkJCXByaXYtPmNhcmRfODE4NSA9IDA7CisJCQlicmVhazsKKworCQljYXNlIEhXX1ZFUklEX1I4MTgwX0Y6CisJCQlETUVTRygiTUFDIGNvbnRyb2xsZXIgaXMgYSBSVEw4MTgwICh2LiBGKSIpOworCQkJcHJpdi0+Y2FyZF84MTg1ID0gMDsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlETUVTR1coIk1BQyBjaGlwIG5vdCByZWNvZ25pemVkOiB2ZXJzaW9uICV4LiBBc3N1bWluZyBSVEw4MTgwIixod192ZXJzaW9uKTsKKwkJCXByaXYtPmNhcmRfODE4NSA9IDA7CisJCQlicmVhazsKKwl9CisKKwlpZihwcml2LT5jYXJkXzgxODUpeworCQlwcml2LT5pZWVlODAyMTEtPm1vZHVsYXRpb24gfD0gSUVFRTgwMjExX09GRE1fTU9EVUxBVElPTjsKKwkJcHJpdi0+aWVlZTgwMjExLT5zaG9ydF9zbG90ID0gMTsKKwl9CisJLyogeW91IHNob3VsZCBub3QgZm91bmQgYW55IDgxODUgVmVyIEIgQ2FyZCAqLworCXByaXYtPmNhcmRfODE4NV9CdmVyc2lvbiA9IDA7CisKKyNpZmRlZiBDT05GSUdfUlRMODE4NUIKKyNpZmRlZiBDT05GSUdfUlRMODE4WF9TCisJLy8ganVzdCBmb3Igc3luYyA4NQorCXByaXYtPmNhcmRfdHlwZSA9IFBDSTsKKyAgICAgICAgRE1FU0coIlRoaXMgaXMgYSBQQ0kgTklDIik7CisjZWxzZQorCWNvbmZpZzMgPSByZWFkX25pY19ieXRlKGRldiwgQ09ORklHMyk7CisJaWYoY29uZmlnMyAmIDB4OCl7CisJCXByaXYtPmNhcmRfdHlwZSA9IENBUkRCVVM7CisJCURNRVNHKCJUaGlzIGlzIGEgQ0FSREJVUyBOSUMiKTsKKwl9CisJZWxzZSBpZiggY29uZmlnMyAmIDB4NCl7CisJCXByaXYtPmNhcmRfdHlwZSA9IE1JTklQQ0k7CisJCURNRVNHKCJUaGlzIGlzIGEgTUlOSS1QQ0kgTklDIik7CisJfWVsc2V7CisJCXByaXYtPmNhcmRfdHlwZSA9IFBDSTsKKwkJRE1FU0coIlRoaXMgaXMgYSBQQ0kgTklDIik7CisJfQorI2VuZGlmCisjZW5kaWYKKwlwcml2LT5lbmFibGVfZ3BpbzAgPSAwOworCisvL2J5IGFteSBmb3IgYW50ZW5uYQorI2lmZGVmIENPTkZJR19SVEw4MTg1QgorCXVzVmFsdWUgPSBlcHJvbV9yZWFkKGRldiwgRUVQUk9NX1NXX1JFVkRfT0ZGU0VUKTsKKwlETUVTRygidXNWYWx1ZSBpcyAweCV4XG4iLHVzVmFsdWUpOworI2lmZGVmIENPTkZJR19SVEw4MThYX1MKKwkvLzNSZWFkIEFudGVubmFEaXZlcnNpdHkKKwkvLyBTVyBBbnRlbm5hIERpdmVyc2l0eS4KKwlpZigJKHVzVmFsdWUgJiBFRVBST01fU1dfQURfTUFTSykgIT0gRUVQUk9NX1NXX0FEX0VOQUJMRSApCisJeworCQlwcml2LT5FRVBST01Td0FudGVubmFEaXZlcnNpdHkgPSBmYWxzZTsKKwkJLy9wcmludGsoIkVFUFJPTSBEaXNhYmxlIFNXIEFudGVubmEgRGl2ZXJzaXR5XG4iKTsKKwl9CisJZWxzZQorCXsKKwkJcHJpdi0+RUVQUk9NU3dBbnRlbm5hRGl2ZXJzaXR5ID0gdHJ1ZTsKKwkJLy9wcmludGsoIkVFUFJPTSBFbmFibGUgU1cgQW50ZW5uYSBEaXZlcnNpdHlcbiIpOworCX0KKwkvLyBEZWZhdWx0IEFudGVubmEgdG8gdXNlLgorCWlmKCAodXNWYWx1ZSAmIEVFUFJPTV9ERUZfQU5UX01BU0spICE9IEVFUFJPTV9ERUZfQU5UXzEgKQorCXsKKwkJcHJpdi0+RUVQUk9NRGVmYXVsdEFudGVubmExID0gZmFsc2U7CisJCS8vcHJpbnRrKCJFRVBST00gRGVmYXVsdCBBbnRlbm5hIDBcbiIpOworCX0KKwllbHNlCisJeworCQlwcml2LT5FRVBST01EZWZhdWx0QW50ZW5uYTEgPSB0cnVlOworCQkvL3ByaW50aygiRUVQUk9NIERlZmF1bHQgQW50ZW5uYSAxXG4iKTsKKwl9CisKKwkvLworCS8vIEFudGVubmEgZGl2ZXJzaXR5IG1lY2hhbmlzbS4gQWRkZWQgYnkgUm9nZXIsIDIwMDcuMTEuMDUuCisJLy8KKwlpZiggcHJpdi0+UmVnU3dBbnRlbm5hRGl2ZXJzaXR5TWVjaGFuaXNtID09IDAgKSAvLyBBdXRvCisJey8vIDA6IGRlZmF1bHQgZnJvbSBFRVBST00uCisJCXByaXYtPmJTd0FudGVubmFEaXZlcml0eSA9IHByaXYtPkVFUFJPTVN3QW50ZW5uYURpdmVyc2l0eTsKKwl9CisJZWxzZQorCXsvLyAxOmRpc2FibGUgYW50ZW5uYSBkaXZlcnNpdHksIDI6IGVuYWJsZSBhbnRlbm5hIGRpdmVyc2l0eS4KKwkJcHJpdi0+YlN3QW50ZW5uYURpdmVyaXR5ID0gKChwcml2LT5SZWdTd0FudGVubmFEaXZlcnNpdHlNZWNoYW5pc20gPT0gMSk/IGZhbHNlIDogdHJ1ZSk7CisJfQorCS8vcHJpbnRrKCJiU3dBbnRlbm5hRGl2ZXJpdHkgPSAlZFxuIiwgcHJpdi0+YlN3QW50ZW5uYURpdmVyaXR5KTsKKworCisJLy8KKwkvLyBEZWZhdWx0IGFudGVubmEgc2V0dGluZ3MuIEFkZGVkIGJ5IFJvZ2VyLCAyMDA3LjExLjA1LgorCS8vCisJaWYoIHByaXYtPlJlZ0RlZmF1bHRBbnRlbm5hID09IDApCisJey8vIDA6IGRlZmF1bHQgZnJvbSBFRVBST00uCisJCXByaXYtPmJEZWZhdWx0QW50ZW5uYTEgPSBwcml2LT5FRVBST01EZWZhdWx0QW50ZW5uYTE7CisJfQorCWVsc2UKKwl7Ly8gMTogbWFpbiwgMjogYXV4LgorCQlwcml2LT5iRGVmYXVsdEFudGVubmExID0gKChwcml2LT5SZWdEZWZhdWx0QW50ZW5uYT09IDIpID8gdHJ1ZSA6IGZhbHNlKTsKKwl9CisJLy9wcmludGsoImJEZWZhdWx0QW50ZW5uYTEgPSAlZFxuIiwgcHJpdi0+YkRlZmF1bHRBbnRlbm5hMSk7CisjZW5kaWYKKyNlbmRpZgorLy9ieSBhbXkgZm9yIGFudGVubmEKKwkvKiBydGw4MTg1IGNhbiBjYWxjIHBsY3AgbGVuIGluIEhXLiovCisJcHJpdi0+aHdfcGxjcF9sZW4gPSAxOworCisJcHJpdi0+cGxjcF9wcmVhbWJsZV9tb2RlID0gMjsKKwkvKnRoZSBlZXByb20gdHlwZSBpcyBzdG9yZWQgaW4gUkNSIHJlZ2lzdGVyIGJpdCAjNiAqLworCWlmIChSQ1JfOTM1NlNFTCAmIHJlYWRfbmljX2R3b3JkKGRldiwgUkNSKSl7CisJCXByaXYtPmVwcm9tdHlwZT1FUFJPTV85M2M1NjsKKwkJLy9ETUVTRygiUmVwb3J0ZWQgRUVQUk9NIGNoaXAgaXMgYSA5M2M1NiAoMktiaXQpIik7CisJfWVsc2V7CisJCXByaXYtPmVwcm9tdHlwZT1FUFJPTV85M2M0NjsKKwkJLy9ETUVTRygiUmVwb3J0ZWQgRUVQUk9NIGNoaXAgaXMgYSA5M2M0NiAoMUtiaXQpIik7CisJfQorCisJZGV2LT5nZXRfc3RhdHMgPSBydGw4MTgwX3N0YXRzOworCisJZGV2LT5kZXZfYWRkclswXT1lcHJvbV9yZWFkKGRldixNQUNfQURSKSAmIDB4ZmY7CisJZGV2LT5kZXZfYWRkclsxXT0oZXByb21fcmVhZChkZXYsTUFDX0FEUikgJiAweGZmMDApPj44OworCWRldi0+ZGV2X2FkZHJbMl09ZXByb21fcmVhZChkZXYsTUFDX0FEUisxKSAmIDB4ZmY7CisJZGV2LT5kZXZfYWRkclszXT0oZXByb21fcmVhZChkZXYsTUFDX0FEUisxKSAmIDB4ZmYwMCk+Pjg7CisJZGV2LT5kZXZfYWRkcls0XT1lcHJvbV9yZWFkKGRldixNQUNfQURSKzIpICYgMHhmZjsKKwlkZXYtPmRldl9hZGRyWzVdPShlcHJvbV9yZWFkKGRldixNQUNfQURSKzIpICYgMHhmZjAwKT4+ODsKKwkvL0RNRVNHKCJDYXJkIE1BQyBhZGRyZXNzIGlzICJNQUNfRk1ULCBNQUNfQVJHKGRldi0+ZGV2X2FkZHIpKTsKKworCisJZm9yKGk9MSxqPTA7IGk8MTQ7IGkrPTIsaisrKXsKKworCQl3b3JkID0gZXByb21fcmVhZChkZXYsRVBST01fVFhQV19DSDFfMiArIGopOworCQlwcml2LT5jaHR4cHdyW2ldPXdvcmQgJiAweGZmOworCQlwcml2LT5jaHR4cHdyW2krMV09KHdvcmQgJiAweGZmMDApPj44OworI2lmZGVmIERFQlVHX0VQUk9NCisJCURNRVNHKCJ0eCB3b3JkICV4OiV4IixqLHdvcmQpOworCQlETUVTRygiY2ggJWQgcHdyICV4IixpLHByaXYtPmNodHhwd3JbaV0pOworCQlETUVTRygiY2ggJWQgcHdyICV4IixpKzEscHJpdi0+Y2h0eHB3cltpKzFdKTsKKyNlbmRpZgorCX0KKwlpZihwcml2LT5jYXJkXzgxODUpeworCQlmb3IoaT0xLGo9MDsgaTwxNDsgaSs9MixqKyspeworCisJCQl3b3JkID0gZXByb21fcmVhZChkZXYsRVBST01fVFhQV19PRkRNX0NIMV8yICsgaik7CisJCQlwcml2LT5jaHR4cHdyX29mZG1baV09d29yZCAmIDB4ZmY7CisJCQlwcml2LT5jaHR4cHdyX29mZG1baSsxXT0od29yZCAmIDB4ZmYwMCk+Pjg7CisjaWZkZWYgREVCVUdfRVBST00KKwkJCURNRVNHKCJvZmRtIHR4IHdvcmQgJXg6JXgiLGosd29yZCk7CisJCQlETUVTRygib2ZkbSBjaCAlZCBwd3IgJXgiLGkscHJpdi0+Y2h0eHB3cl9vZmRtW2ldKTsKKwkJCURNRVNHKCJvZmRtIGNoICVkIHB3ciAleCIsaSsxLHByaXYtPmNodHhwd3Jfb2ZkbVtpKzFdKTsKKyNlbmRpZgorCQl9CisJfQorLy97YnkgYW15IDA4MDMxMgorCS8vM1JlYWQgY3J5c3RhbCBjYWxpYnRyYXRpb24gYW5kIHRoZXJtYWwgbWV0ZXIgaW5kaWNhdGlvbiBvbiA4N1NFLgorCisJLy8gQnkgU0QzIFNZJ3MgcmVxdWVzdC4gQWRkZWQgYnkgUm9nZXIsIDIwMDcuMTIuMTEuCisKKwl0bXB1MTYgPSBlcHJvbV9yZWFkKGRldiwgRUVQUk9NX1JTVj4+MSk7CisKKwkvL3ByaW50aygiUmVhZEFkYXB0ZXJJbmZvODE4NSgpOiBFRVBST01fUlNWKCUwNHgpXG4iLCB0bXB1MTYpOworCisJCS8vIENyeXN0YWwgY2FsaWJyYXRpb24gZm9yIFhpbiBhbmQgWG91dCByZXNwLgorCQlwcml2LT5YdGFsQ2FsX1hvdXQgPSB0bXB1MTYgJiBFRVBST01fWFRBTF9DQUxfWE9VVF9NQVNLOyAvLyAwfjcuNXBGCisJCXByaXYtPlh0YWxDYWxfWGluID0gKHRtcHUxNiAmIEVFUFJPTV9YVEFMX0NBTF9YSU5fTUFTSyk+PjQ7IC8vIDB+Ny41cEYKKwkJaWYoKHRtcHUxNiAmIEVFUFJPTV9YVEFMX0NBTF9FTkFCTEUpPj4xMikKKwkJCXByaXYtPmJYdGFsQ2FsaWJyYXRpb24gPSB0cnVlOworCisJCS8vIFRoZXJtYWwgbWV0ZXIgcmVmZXJlbmNlIGluZGljYXRpb24uCisJCXByaXYtPlRoZXJtYWxNZXRlciA9ICAodTgpKCh0bXB1MTYgJiBFRVBST01fVEhFUk1BTF9NRVRFUl9NQVNLKT4+OCk7CisJCWlmKCh0bXB1MTYgJiBFRVBST01fVEhFUk1BTF9NRVRFUl9FTkFCTEUpPj4xMykKKwkJCXByaXYtPmJUeFBvd2VyVHJhY2sgPSB0cnVlOworCisvL2J5IGFteSAwODAzMTJ9CisjaWZkZWYgQ09ORklHX1JUTDgxODVCCisJd29yZCA9IGVwcm9tX3JlYWQoZGV2LEVQUk9NX1RYUFdfQkFTRSk7CisJcHJpdi0+Y2NrX3R4cHdyX2Jhc2UgPSB3b3JkICYgMHhmOworCXByaXYtPm9mZG1fdHhwd3JfYmFzZSA9ICh3b3JkPj40KSAmIDB4ZjsKKyNlbmRpZgorCisJdmVyc2lvbiA9IGVwcm9tX3JlYWQoZGV2LEVQUk9NX1ZFUlNJT04pOworCURNRVNHKCJFRVBST00gdmVyc2lvbiAleCIsdmVyc2lvbik7CisJaWYoICghcHJpdi0+Y2FyZF84MTg1KSAmJiB2ZXJzaW9uIDwgMHgwMTAxKXsKKwkJRE1FU0cgKCJFRVBST00gdmVyc2lvbiB0b28gb2xkLCBhc3N1bWluZyBkZWZhdWx0cyIpOworCQlETUVTRyAoIklmIHlvdSBzZWUgdGhpcyBtZXNzYWdlICpwbGFzZSogc2VuZCB5b3VyIFwKK0RNRVNHIG91dHB1dCB0byBhbmRyZWFtcmxAdGlzY2FsaS5pdCBUSEFOS1MiKTsKKwkJcHJpdi0+ZGlncGh5PTE7CisJCXByaXYtPmFudGI9MDsKKwkJcHJpdi0+ZGl2ZXJzaXR5PTE7CisJCXByaXYtPmNzX3RyZXNob2xkPTB4YzsKKwkJcHJpdi0+cmNyX2NzZW5zZT0xOworCQlwcml2LT5yZl9jaGlwPVJGQ0hJUElEX1BISUxJUFM7CisJfWVsc2V7CisJCWlmKCFwcml2LT5jYXJkXzgxODUpeworCQkJdTggcmZwYXJhbSA9IGVwcm9tX3JlYWQoZGV2LFJGX1BBUkFNKTsKKwkJCURNRVNHKCJSZlBhcmFtOiAleCIscmZwYXJhbSk7CisKKwkJCXByaXYtPmRpZ3BoeSA9IHJmcGFyYW0gJiAoMTw8UkZfUEFSQU1fRElHUEhZX1NISUZUKSA/IDA6MTsKKwkJCXByaXYtPmFudGIgPSAgcmZwYXJhbSAmICgxPDxSRl9QQVJBTV9BTlRCREVGQVVMVF9TSElGVCkgPyAxOjA7CisKKwkJCXByaXYtPnJjcl9jc2Vuc2UgPSAocmZwYXJhbSAmIFJGX1BBUkFNX0NBUlJJRVJTRU5TRV9NQVNLKSA+PgorCQkJCQlSRl9QQVJBTV9DQVJSSUVSU0VOU0VfU0hJRlQ7CisKKwkJCXByaXYtPmRpdmVyc2l0eSA9CisJCQkJKHJlYWRfbmljX2J5dGUoZGV2LENPTkZJRzIpJigxPDxDT05GSUcyX0FOVEVOTkFfU0hJRlQpKSA/IDE6MDsKKwkJfWVsc2V7CisJCQlwcml2LT5yY3JfY3NlbnNlID0gMzsKKwkJfQorCisJCXByaXYtPmNzX3RyZXNob2xkID0gKGVwcm9tX3JlYWQoZGV2LEVORVJHWV9UUkVTSE9MRCkmMHhmZjAwKSA+Pjg7CisKKwkJcHJpdi0+cmZfY2hpcCA9IDB4ZmYgJiBlcHJvbV9yZWFkKGRldixSRkNISVBJRCk7CisJfQorCisjaWZkZWYgQ09ORklHX1JUTDgxODVCCisjaWZkZWYgQ09ORklHX1JUTDgxOFhfUworCXByaXYtPnJmX2NoaXAgPSBSRl9aRUJSQTQ7CisJcHJpdi0+cmZfc2xlZXAgPSBydGw4MjI1ejRfcmZfc2xlZXA7CisJcHJpdi0+cmZfd2FrZXVwID0gcnRsODIyNXo0X3JmX3dha2V1cDsKKyNlbHNlCisgICAgICAgIHByaXYtPnJmX2NoaXAgPSBSRl9aRUJSQTI7CisjZW5kaWYKKwkvL0RNRVNHKCJDYXJkIHJlcG9ydHMgUkYgZnJvbnRlbmQgUmVhbHRlayA4MjI1ejIiKTsKKwkvL0RNRVNHVygiVGhpcyBkcml2ZXIgaGFzIEVYUEVSSU1FTlRBTCBzdXBwb3J0IGZvciB0aGlzIGNoaXBzZXQuIik7CisJLy9ETUVTR1coInVzZSBpdCB3aXRoIGNhcmUgYW5kIGF0IHlvdXIgb3duIHJpc2sgYW5kIik7CisJRE1FU0dXKCIqKlBMRUFTRSoqIFJFUE9SVCBTVUNDRVNTRlVML1VOU1VDQ0VTU0ZVTCBUTyBSZWFsdGVrISIpOworCisJcHJpdi0+cmZfY2xvc2UgPSBydGw4MjI1ejJfcmZfY2xvc2U7CisJcHJpdi0+cmZfaW5pdCA9IHJ0bDgyMjV6Ml9yZl9pbml0OworCXByaXYtPnJmX3NldF9jaGFuID0gcnRsODIyNXoyX3JmX3NldF9jaGFuOworCXByaXYtPnJmX3NldF9zZW5zID0gTlVMTDsKKwkvL3ByaXYtPnJmX3NsZWVwID0gcnRsODIyNV9yZl9zbGVlcDsKKwkvL3ByaXYtPnJmX3dha2V1cCA9IHJ0bDgyMjVfcmZfd2FrZXVwOworCisjZWxzZQorCS8qIGNoZWNrIFJGIGZyb250ZW5kIGNoaXBzZXQgKi8KKwlzd2l0Y2ggKHByaXYtPnJmX2NoaXApIHsKKworCQljYXNlIFJGQ0hJUElEX1JUTDgyMjU6CisKKwkJaWYocHJpdi0+Y2FyZF84MTg1KXsKKwkJCURNRVNHKCJDYXJkIHJlcG9ydHMgUkYgZnJvbnRlbmQgUmVhbHRlayA4MjI1Iik7CisJCQlETUVTR1coIlRoaXMgZHJpdmVyIGhhcyBFWFBFUklNRU5UQUwgc3VwcG9ydCBmb3IgdGhpcyBjaGlwc2V0LiIpOworCQkJRE1FU0dXKCJ1c2UgaXQgd2l0aCBjYXJlIGFuZCBhdCB5b3VyIG93biByaXNrIGFuZCIpOworCQkJRE1FU0dXKCIqKlBMRUFTRSoqIFJFUE9SVCBTVUNDRVNTL0lOU1VDQ0VTUyBUTyBhbmRyZWFtcmxAdGlzY2FsaS5pdCIpOworCisJCQlwcml2LT5yZl9jbG9zZSA9IHJ0bDgyMjVfcmZfY2xvc2U7CisJCQlwcml2LT5yZl9pbml0ID0gcnRsODIyNV9yZl9pbml0OworCQkJcHJpdi0+cmZfc2V0X2NoYW4gPSBydGw4MjI1X3JmX3NldF9jaGFuOworCQkJcHJpdi0+cmZfc2V0X3NlbnMgPSBOVUxMOworCQkJcHJpdi0+cmZfc2xlZXAgPSBydGw4MjI1X3JmX3NsZWVwOworCQkJcHJpdi0+cmZfd2FrZXVwID0gcnRsODIyNV9yZl93YWtldXA7CisKKwkJfWVsc2V7CisJCQlETUVTR1coIkRldGVjdGVkIFJUTDgyMjUgcmFkaW8gb24gYSBjYXJkIHJlY29nbml6ZWQgYXMgUlRMODE4MCIpOworCQkJRE1FU0dXKCJUaGlzIGNvdWxkIG5vdCBiZS4uLiBzb21ldGhpbmcgd2VudCB3cm9uZy4uLi4iKTsKKwkJCXJldHVybiAtRU5PREVWOworCQl9CisJCQlicmVhazsKKworCQljYXNlIFJGQ0hJUElEX1JUTDgyNTU6CisJCWlmKHByaXYtPmNhcmRfODE4NSl7CisJCQlETUVTRygiQ2FyZCByZXBvcnRzIFJGIGZyb250ZW5kIFJlYWx0ZWsgODI1NSIpOworCQkJRE1FU0dXKCJUaGlzIGRyaXZlciBoYXMgRVhQRVJJTUVOVEFMIHN1cHBvcnQgZm9yIHRoaXMgY2hpcHNldC4iKTsKKwkJCURNRVNHVygidXNlIGl0IHdpdGggY2FyZSBhbmQgYXQgeW91ciBvd24gcmlzayBhbmQiKTsKKwkJCURNRVNHVygiKipQTEVBU0UqKiBSRVBPUlQgU1VDQ0VTUy9JTlNVQ0NFU1MgVE8gYW5kcmVhbXJsQHRpc2NhbGkuaXQiKTsKKworCQkJcHJpdi0+cmZfY2xvc2UgPSBydGw4MjU1X3JmX2Nsb3NlOworCQkJcHJpdi0+cmZfaW5pdCA9IHJ0bDgyNTVfcmZfaW5pdDsKKwkJCXByaXYtPnJmX3NldF9jaGFuID0gcnRsODI1NV9yZl9zZXRfY2hhbjsKKwkJCXByaXYtPnJmX3NldF9zZW5zID0gTlVMTDsKKwkJCXByaXYtPnJmX3NsZWVwID0gTlVMTDsKKwkJCXByaXYtPnJmX3dha2V1cCA9IE5VTEw7CisKKwkJfWVsc2V7CisJCQlETUVTR1coIkRldGVjdGVkIFJUTDgyNTUgcmFkaW8gb24gYSBjYXJkIHJlY29nbml6ZWQgYXMgUlRMODE4MCIpOworCQkJRE1FU0dXKCJUaGlzIGNvdWxkIG5vdCBiZS4uLiBzb21ldGhpbmcgd2VudCB3cm9uZy4uLi4iKTsKKwkJCXJldHVybiAtRU5PREVWOworCQl9CisJCQlicmVhazsKKworCisJCWNhc2UgUkZDSElQSURfSU5URVJTSUw6CisJCQlETUVTR1coIkNhcmQgcmVwb3J0cyBSRiBmcm9udGVuZCBieSBJbnRlcnNpbC4iKTsKKwkJCURNRVNHVygiVGhpcyBkcml2ZXIgaGFzIE5PIHN1cHBvcnQgZm9yIHRoaXMgY2hpcHNldC4iKTsKKwkJCXJldHVybiAtRU5PREVWOworCQkJYnJlYWs7CisKKwkJY2FzZSBSRkNISVBJRF9SRk1EOgorCQkJRE1FU0dXKCJDYXJkIHJlcG9ydHMgUkYgZnJvbnRlbmQgYnkgUkZNRC4iKTsKKwkJCURNRVNHVygiVGhpcyBkcml2ZXIgaGFzIE5PIHN1cHBvcnQgZm9yIHRoaXMgY2hpcHNldC4iKTsKKwkJCXJldHVybiAtRU5PREVWOworCQkJYnJlYWs7CisKKwkJY2FzZSBSRkNISVBJRF9HQ1Q6CisJCQlETUVTR1coIkNhcmQgcmVwb3J0cyBSRiBmcm9udGVuZCBieSBHQ1QuIik7CisJCQlETUVTR1coIlRoaXMgZHJpdmVyIGhhcyBFWFBFUklNRU5UQUwgc3VwcG9ydCBmb3IgdGhpcyBjaGlwc2V0LiIpOworCQkJRE1FU0dXKCJ1c2UgaXQgd2l0aCBjYXJlIGFuZCBhdCB5b3VyIG93biByaXNrIGFuZCIpOworCQkJRE1FU0dXKCIqKlBMRUFTRSoqIFJFUE9SVCBTVUNDRVNTL0lOU1VDQ0VTUyBUTyBhbmRyZWFtcmxAdGlzY2FsaS5pdCIpOworCQkJcHJpdi0+cmZfY2xvc2UgPSBnY3RfcmZfY2xvc2U7CisJCQlwcml2LT5yZl9pbml0ID0gZ2N0X3JmX2luaXQ7CisJCQlwcml2LT5yZl9zZXRfY2hhbiA9IGdjdF9yZl9zZXRfY2hhbjsKKwkJCXByaXYtPnJmX3NldF9zZW5zID0gTlVMTDsKKwkJCXByaXYtPnJmX3NsZWVwID0gTlVMTDsKKwkJCXByaXYtPnJmX3dha2V1cCA9IE5VTEw7CisJCQlicmVhazsKKworCQljYXNlIFJGQ0hJUElEX01BWElNOgorCQkJRE1FU0dXKCJDYXJkIHJlcG9ydHMgUkYgZnJvbnRlbmQgYnkgTUFYSU0uIik7CisJCQlETUVTR1coIlRoaXMgZHJpdmVyIGhhcyBFWFBFUklNRU5UQUwgc3VwcG9ydCBmb3IgdGhpcyBjaGlwc2V0LiIpOworCQkJRE1FU0dXKCJ1c2UgaXQgd2l0aCBjYXJlIGFuZCBhdCB5b3VyIG93biByaXNrIGFuZCIpOworCQkJRE1FU0dXKCIqKlBMRUFTRSoqIFJFUE9SVCBTVUNDRVNTL0lOU1VDQ0VTUyBUTyBhbmRyZWFtcmxAdGlzY2FsaS5pdCIpOworCQkJcHJpdi0+cmZfY2xvc2UgPSBtYXhpbV9yZl9jbG9zZTsKKwkJCXByaXYtPnJmX2luaXQgPSBtYXhpbV9yZl9pbml0OworCQkJcHJpdi0+cmZfc2V0X2NoYW4gPSBtYXhpbV9yZl9zZXRfY2hhbjsKKwkJCXByaXYtPnJmX3NldF9zZW5zID0gTlVMTDsKKwkJCXByaXYtPnJmX3NsZWVwID0gTlVMTDsKKwkJCXByaXYtPnJmX3dha2V1cCA9IE5VTEw7CisJCQlicmVhazsKKworCQljYXNlIFJGQ0hJUElEX1BISUxJUFM6CisJCQlETUVTRygiQ2FyZCByZXBvcnRzIFJGIGZyb250ZW5kIGJ5IFBoaWxpcHMuIik7CisJCQlETUVTRygiT0shIFBoaWxpcHMgU0EyNDAwIHJhZGlvIGNoaXBzZXQgaXMgc3VwcG9ydGVkLiIpOworCQkJcHJpdi0+cmZfY2xvc2UgPSBzYTI0MDBfcmZfY2xvc2U7CisJCQlwcml2LT5yZl9pbml0ID0gc2EyNDAwX3JmX2luaXQ7CisJCQlwcml2LT5yZl9zZXRfY2hhbiA9IHNhMjQwMF9yZl9zZXRfY2hhbjsKKwkJCXByaXYtPnJmX3NldF9zZW5zID0gc2EyNDAwX3JmX3NldF9zZW5zOworCQkJcHJpdi0+c2VucyA9IFNBMjQwMF9SRl9ERUZfU0VOUzsgLyogZGVmYXVsdCBzZW5zaXRpdml0eSAqLworCQkJcHJpdi0+bWF4X3NlbnMgPSBTQTI0MDBfUkZfTUFYX1NFTlM7IC8qIG1heGltdW0gc2Vuc2l0aXZpdHkgKi8KKwkJCXByaXYtPnJmX3NsZWVwID0gTlVMTDsKKwkJCXByaXYtPnJmX3dha2V1cCA9IE5VTEw7CisKKwkJCWlmKHByaXYtPmRpZ3BoeSl7CisJCQkJRE1FU0dXKCJEaWdpdGFsIFBIWSBmb3VuZCIpOworCQkJCURNRVNHVygiUGhpbGlwcyBESUdJVEFMIFBIWSBpcyB1bnRlc3RlZCEgKlBsZWFzZSpcCisJcmVwb3J0IHN1Y2Nlc3MvZmFpbHVyZSB0byA8YW5kcmVhbXJsQHRpc2NhbGkuaXQ+Iik7CisJCQl9ZWxzZXsKKwkJCQlETUVTRyAoIkFuYWxvZyBQSFkgZm91bmQiKTsKKwkJCX0KKworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCURNRVNHVygiVW5rbm93biBSRiBtb2R1bGUgJXgiLHByaXYtPnJmX2NoaXApOworCQkJRE1FU0dXKCJFeGl0aW5nLi4uIik7CisJCQlyZXR1cm4gLTE7CisKKwl9CisjZW5kaWYKKworCisJaWYoIXByaXYtPmNhcmRfODE4NSl7CisJCWlmKHByaXYtPmFudGIpCisJCQlETUVTRyAoIkFudGVubmEgQiBpcyBkZWZhdWx0IGFudGVubmEiKTsKKwkJZWxzZQorCQkJRE1FU0cgKCJBbnRlbm5hIEEgaXMgZGVmYXVsdCBhbnRlbm5hIik7CisKKwkJaWYocHJpdi0+ZGl2ZXJzaXR5KQorCQkJRE1FU0cgKCJBbnRlbm5hIGRpdmVyc2l0eSBpcyBlbmFibGVkIik7CisJCWVsc2UKKwkJCURNRVNHKCJBbnRlbm5hIGRpdmVyc2l0eSBpcyBkaXNhYmxlZCIpOworCisJCURNRVNHKCJDYXJyaWVyIHNlbnNlICVkIixwcml2LT5yY3JfY3NlbnNlKTsKKwl9CisKKwlpZiAoMCE9YWxsb2NfcnhfZGVzY19yaW5nKGRldiwgcHJpdi0+cnhidWZmZXJzaXplLCBwcml2LT5yeHJpbmdjb3VudCkpCisJCXJldHVybiAtRU5PTUVNOworCisJaWYgKDAhPWFsbG9jX3R4X2Rlc2NfcmluZyhkZXYsIHByaXYtPnR4YnVmZnNpemUsIHByaXYtPnR4cmluZ2NvdW50LAorCQkJCSAgVFhfTUFOQUdFUFJJT1JJVFlfUklOR19BRERSKSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAoMCE9YWxsb2NfdHhfZGVzY19yaW5nKGRldiwgcHJpdi0+dHhidWZmc2l6ZSwgcHJpdi0+dHhyaW5nY291bnQsCisJCQkJIFRYX0JLUFJJT1JJVFlfUklOR19BRERSKSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAoMCE9YWxsb2NfdHhfZGVzY19yaW5nKGRldiwgcHJpdi0+dHhidWZmc2l6ZSwgcHJpdi0+dHhyaW5nY291bnQsCisJCQkJIFRYX0JFUFJJT1JJVFlfUklOR19BRERSKSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAoMCE9YWxsb2NfdHhfZGVzY19yaW5nKGRldiwgcHJpdi0+dHhidWZmc2l6ZSwgcHJpdi0+dHhyaW5nY291bnQsCisJCQkJICBUWF9WSVBSSU9SSVRZX1JJTkdfQUREUikpCisJCXJldHVybiAtRU5PTUVNOworCisJaWYgKDAhPWFsbG9jX3R4X2Rlc2NfcmluZyhkZXYsIHByaXYtPnR4YnVmZnNpemUsIHByaXYtPnR4cmluZ2NvdW50LAorCQkJCSAgVFhfVk9QUklPUklUWV9SSU5HX0FERFIpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmICgwIT1hbGxvY190eF9kZXNjX3JpbmcoZGV2LCBwcml2LT50eGJ1ZmZzaXplLCBwcml2LT50eHJpbmdjb3VudCwKKwkJCQkgIFRYX0hJR0hQUklPUklUWV9SSU5HX0FERFIpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmICgwIT1hbGxvY190eF9kZXNjX3JpbmcoZGV2LCBwcml2LT50eGJ1ZmZzaXplLCBwcml2LT50eGJlYWNvbmNvdW50LAorCQkJCSAgVFhfQkVBQ09OX1JJTkdfQUREUikpCisJCXJldHVybiAtRU5PTUVNOworCisKKwkvL3ByaXYtPmJlYWNvbl9idWY9TlVMTDsKKworCWlmKCFwcml2LT5jYXJkXzgxODUpeworCisJCWlmKHJlYWRfbmljX2J5dGUoZGV2LCBDT05GSUcwKSAmICgxPDxDT05GSUcwX1dFUDQwX1NISUZUKSkKKwkJCURNRVNHICgiNDAtYml0IFdFUCBpcyBzdXBwb3J0ZWQgaW4gaGFyZHdhcmUiKTsKKwkJZWxzZQorCQkJRE1FU0cgKCI0MC1iaXQgV0VQIGlzIE5PVCBzdXBwb3J0ZWQgaW4gaGFyZHdhcmUiKTsKKworCQlpZihyZWFkX25pY19ieXRlKGRldixDT05GSUcwKSAmICgxPDxDT05GSUcwX1dFUDEwNF9TSElGVCkpCisJCQlETUVTRyAoIjEwNC1iaXQgV0VQIGlzIHN1cHBvcnRlZCBpbiBoYXJkd2FyZSIpOworCQllbHNlCisJCQlETUVTRyAoIjEwNC1iaXQgV0VQIGlzIE5PVCBzdXBwb3J0ZWQgaW4gaGFyZHdhcmUiKTsKKwl9CisjaWYgIWRlZmluZWQoU0FfU0hJUlEpCisgICAgICAgIGlmKHJlcXVlc3RfaXJxKGRldi0+aXJxLCAodm9pZCAqKXJ0bDgxODBfaW50ZXJydXB0LCBJUlFGX1NIQVJFRCwgZGV2LT5uYW1lLCBkZXYpKXsKKyNlbHNlCisgICAgICAgIGlmKHJlcXVlc3RfaXJxKGRldi0+aXJxLCAodm9pZCAqKXJ0bDgxODBfaW50ZXJydXB0LCBTQV9TSElSUSwgZGV2LT5uYW1lLCBkZXYpKXsKKyNlbmRpZgorICAgICAgICAgICAgICAgIERNRVNHRSgiRXJyb3IgYWxsb2NhdGluZyBJUlEgJWQiLGRldi0+aXJxKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisJfWVsc2V7CisJCXByaXYtPmlycT1kZXYtPmlycTsKKwkJRE1FU0coIklSUSAlZCIsZGV2LT5pcnEpOworCX0KKworI2lmZGVmIERFQlVHX0VQUk9NCisJZHVtcF9lcHJvbShkZXYpOworI2VuZGlmCisKKwlyZXR1cm4gMDsKKworfQorCisKK3ZvaWQgcnRsODE4MF9ub19od193ZXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisKKwlpZighcHJpdi0+Y2FyZF84MTg1KQorCXsKKwkJdTggc2VjdXJpdHk7CisKKwkJc2VjdXJpdHkgID0gcmVhZF9uaWNfYnl0ZShkZXYsIFNFQ1VSSVRZKTsKKwkJc2VjdXJpdHkgJj1+KDE8PFNFQ1VSSVRZX1dFUF9UWF9FTkFCTEVfU0hJRlQpOworCQlzZWN1cml0eSAmPX4oMTw8U0VDVVJJVFlfV0VQX1JYX0VOQUJMRV9TSElGVCk7CisKKwkJd3JpdGVfbmljX2J5dGUoZGV2LCBTRUNVUklUWSwgc2VjdXJpdHkpOworCisJfWVsc2V7CisKKwkJLy9GSVhNRSEhIQorCX0KKwkvKgorCSAgd3JpdGVfbmljX2R3b3JkKGRldixUWF9DT05GLHJlYWRfbmljX2R3b3JkKGRldixUWF9DT05GKSB8CisJICAoMTw8VFhfTk9JQ1ZfU0hJRlQpICk7CisJKi8KKy8vCXByaXYtPmllZWU4MDIxMS0+aHdfd2VwPTA7Cit9CisKKwordm9pZCBydGw4MTgwX3NldF9od193ZXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJdTggcGdyZWc7CisJdTggc2VjdXJpdHk7CisJdTMyIGtleTBfd29yZDQ7CisKKwlwZ3JlZz1yZWFkX25pY19ieXRlKGRldiwgUEdTRUxFQ1QpOworCXdyaXRlX25pY19ieXRlKGRldiwgUEdTRUxFQ1QsIHBncmVnICZ+ICgxPDxQR1NFTEVDVF9QR19TSElGVCkpOworCisJa2V5MF93b3JkNCA9IHJlYWRfbmljX2R3b3JkKGRldiwgS0VZMCs0KzQrNCk7CisJa2V5MF93b3JkNCAmPSB+IDB4ZmY7CisJa2V5MF93b3JkNCB8PSBwcml2LT5rZXkwWzNdJiAweGZmOworCXdyaXRlX25pY19kd29yZChkZXYsS0VZMCwocHJpdi0+a2V5MFswXSkpOworCXdyaXRlX25pY19kd29yZChkZXYsS0VZMCs0LChwcml2LT5rZXkwWzFdKSk7CisJd3JpdGVfbmljX2R3b3JkKGRldixLRVkwKzQrNCwocHJpdi0+a2V5MFsyXSkpOworCXdyaXRlX25pY19kd29yZChkZXYsS0VZMCs0KzQrNCwoa2V5MF93b3JkNCkpOworCisJLyoKKwkgIFRYX0NPTkYscmVhZF9uaWNfZHdvcmQoZGV2LFRYX0NPTkYpICZ+KDE8PFRYX05PSUNWX1NISUZUKSk7CisJKi8KKworCXNlY3VyaXR5ICA9IHJlYWRfbmljX2J5dGUoZGV2LFNFQ1VSSVRZKTsKKwlzZWN1cml0eSB8PSAoMTw8U0VDVVJJVFlfV0VQX1RYX0VOQUJMRV9TSElGVCk7CisJc2VjdXJpdHkgfD0gKDE8PFNFQ1VSSVRZX1dFUF9SWF9FTkFCTEVfU0hJRlQpOworCXNlY3VyaXR5ICY9IH4gU0VDVVJJVFlfRU5DUllQX01BU0s7CisJc2VjdXJpdHkgfD0gKFNFQ1VSSVRZX0VOQ1JZUF8xMDQ8PFNFQ1VSSVRZX0VOQ1JZUF9TSElGVCk7CisKKwl3cml0ZV9uaWNfYnl0ZShkZXYsIFNFQ1VSSVRZLCBzZWN1cml0eSk7CisKKwlETUVTRygia2V5ICV4ICV4ICV4ICV4IixyZWFkX25pY19kd29yZChkZXYsS0VZMCs0KzQrNCksCisJICAgICAgcmVhZF9uaWNfZHdvcmQoZGV2LEtFWTArNCs0KSxyZWFkX25pY19kd29yZChkZXYsS0VZMCs0KSwKKwkgICAgICByZWFkX25pY19kd29yZChkZXYsS0VZMCkpOworCisJLy9wcml2LT5pZWVlODAyMTEtPmh3X3dlcD0xOworfQorCisKK3ZvaWQgcnRsODE4NV9yZl9waW5zX2VuYWJsZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworLy8JdTE2IHRtcDsKKy8vCXRtcCA9IHJlYWRfbmljX3dvcmQoZGV2LCBSRlBpbnNFbmFibGUpOworCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zRW5hYmxlLCAweDFmZmYpOy8vIHwgdG1wKTsKKy8vCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zRW5hYmxlLDcgfCB0bXApOworfQorCisKK3ZvaWQgcnRsODE4NV9zZXRfYW5hcGFyYW0yKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBhKQoreworCXU4IGNvbmYzOworCisJcnRsODE4MF9zZXRfbW9kZShkZXYsIEVQUk9NX0NNRF9DT05GSUcpOworCisJY29uZjMgPSByZWFkX25pY19ieXRlKGRldiwgQ09ORklHMyk7CisJd3JpdGVfbmljX2J5dGUoZGV2LCBDT05GSUczLCBjb25mMyB8ICgxPDxDT05GSUczX0FOQVBBUkFNX1dfU0hJRlQpKTsKKwl3cml0ZV9uaWNfZHdvcmQoZGV2LCBBTkFQQVJBTTIsIGEpOworCisJY29uZjMgPSByZWFkX25pY19ieXRlKGRldiwgQ09ORklHMyk7CisJd3JpdGVfbmljX2J5dGUoZGV2LCBDT05GSUczLCBjb25mMyAmfigxPDxDT05GSUczX0FOQVBBUkFNX1dfU0hJRlQpKTsKKwlydGw4MTgwX3NldF9tb2RlKGRldiwgRVBST01fQ01EX05PUk1BTCk7CisKK30KKworCit2b2lkIHJ0bDgxODBfc2V0X2FuYXBhcmFtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBhKQoreworCXU4IGNvbmYzOworCisJcnRsODE4MF9zZXRfbW9kZShkZXYsIEVQUk9NX0NNRF9DT05GSUcpOworCisJY29uZjMgPSByZWFkX25pY19ieXRlKGRldiwgQ09ORklHMyk7CisJd3JpdGVfbmljX2J5dGUoZGV2LCBDT05GSUczLCBjb25mMyB8ICgxPDxDT05GSUczX0FOQVBBUkFNX1dfU0hJRlQpKTsKKwl3cml0ZV9uaWNfZHdvcmQoZGV2LCBBTkFQQVJBTSwgYSk7CisKKwljb25mMyA9IHJlYWRfbmljX2J5dGUoZGV2LCBDT05GSUczKTsKKwl3cml0ZV9uaWNfYnl0ZShkZXYsIENPTkZJRzMsIGNvbmYzICZ+KDE8PENPTkZJRzNfQU5BUEFSQU1fV19TSElGVCkpOworCXJ0bDgxODBfc2V0X21vZGUoZGV2LCBFUFJPTV9DTURfTk9STUFMKTsKK30KKworCit2b2lkIHJ0bDgxODVfdHhfYW50ZW5uYShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCBhbnQpCit7CisJd3JpdGVfbmljX2J5dGUoZGV2LCBUWF9BTlRFTk5BLCBhbnQpOworCWZvcmNlX3BjaV9wb3N0aW5nKGRldik7CisJbWRlbGF5KDEpOworfQorCisKK3ZvaWQgcnRsODE4NV93cml0ZV9waHkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggYWRyLCB1MzIgZGF0YSkKK3sKKwkvL3U4IHBoeXI7CisJdTMyIHBoeXc7CisJLy9pbnQgaTsKKworCWFkciB8PSAweDgwOworCisJcGh5dz0gKChkYXRhPDw4KSB8IGFkcik7CisjaWYgMAorCisJd3JpdGVfbmljX2R3b3JkKGRldiwgUEhZX0FEUiwgcGh5dyk7CisKKwkvL3JlYWRfbmljX2R3b3JkKGRldiwgUEhZX0FEUik7CisJZm9yKGk9MDtpPDEwO2krKyl7CisJCXdyaXRlX25pY19kd29yZChkZXYsIFBIWV9BRFIsIDB4ZmZmZmZmN2YgJiBwaHl3KTsKKwkJcGh5ciA9IHJlYWRfbmljX2J5dGUoZGV2LCBQSFlfUkVBRCk7CisJCWlmKHBoeXIgPT0gKGRhdGEmMHhmZikpIGJyZWFrOworCisJfQorI2Vsc2UKKwkvLyBOb3RlIHRoYXQsIHdlIG11c3Qgd3JpdGUgMHhmZjdjIGFmdGVyIDB4N2QtMHg3ZiB0byB3cml0ZSBCQiByZWdpc3Rlci4KKwl3cml0ZV9uaWNfYnl0ZShkZXYsIDB4N2YsICgocGh5dyAmIDB4ZmYwMDAwMDApID4+IDI0KSk7CisJd3JpdGVfbmljX2J5dGUoZGV2LCAweDdlLCAoKHBoeXcgJiAweDAwZmYwMDAwKSA+PiAxNikpOworCXdyaXRlX25pY19ieXRlKGRldiwgMHg3ZCwgKChwaHl3ICYgMHgwMDAwZmYwMCkgPj4gOCkpOworCXdyaXRlX25pY19ieXRlKGRldiwgMHg3YywgKChwaHl3ICYgMHgwMDAwMDBmZikgKSk7CisjZW5kaWYKKwkvKiB0aGlzIGlzIG9rIHRvIGZhaWwgd2hlbiB3ZSB3cml0ZSBBR0MgdGFibGUuIGNoZWNrIGZvciBBR0MgdGFibGUgbWlnaHQgYmUKKwkgKiBkb25lIGJ5IG1hc2tpbmcgd2l0aCAweDdmIGluc3RlYWQgb2YgMHhmZgorCSAqLworCS8vaWYocGh5ciAhPSAoZGF0YSYweGZmKSkgRE1FU0dXKCJQaHkgd3JpdGUgdGltZW91dCAleCAleCAleCIsIHBoeXIsIGRhdGEsYWRyKTsKK30KKworCitpbmxpbmUgdm9pZCB3cml0ZV9waHlfb2ZkbSAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggYWRyLCB1MzIgZGF0YSkKK3sKKwlkYXRhID0gZGF0YSAmIDB4ZmY7CisJcnRsODE4NV93cml0ZV9waHkoZGV2LCBhZHIsIGRhdGEpOworfQorCisKK3ZvaWQgd3JpdGVfcGh5X2NjayAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggYWRyLCB1MzIgZGF0YSkKK3sKKwlkYXRhID0gZGF0YSAmIDB4ZmY7CisJcnRsODE4NV93cml0ZV9waHkoZGV2LCBhZHIsIGRhdGEgfCAweDEwMDAwKTsKK30KKworCisvKiA3MCozID0gMjEwIG1zCisgKiBJIGhvcGUgdGhpcyBpcyBlbm91Z3RoCisgKi8KKyNkZWZpbmUgTUFYX1BIWSA3MAordm9pZCB3cml0ZV9waHkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggYWRyLCB1OCBkYXRhKQoreworCXUzMiBwaHk7CisJaW50IGk7CisKKwlwaHkgPSAweGZmMDAwMDsKKwlwaHkgfD0gYWRyOworCXBoeSB8PSAweDgwOyAvKiB0aGlzIHNob3VsZCBlbmFibGUgd3JpdGluZyAqLworCXBoeSB8PSAoZGF0YTw8OCk7CisKKwkvL1BIWV9BRFIsIFBIWV9SIGFuZCBQSFlfVyAgYXJlIGNvbnRpZyBhbmQgdHJlYXRlZCBhcyBvbmUgZHdvcmQKKwl3cml0ZV9uaWNfZHdvcmQoZGV2LFBIWV9BRFIsIHBoeSk7CisKKwlwaHk9IDB4ZmZmZjAwOworCXBoeSB8PSBhZHI7CisKKwl3cml0ZV9uaWNfZHdvcmQoZGV2LFBIWV9BRFIsIHBoeSk7CisJZm9yKGk9MDtpPE1BWF9QSFk7aSsrKXsKKwkJcGh5PXJlYWRfbmljX2R3b3JkKGRldixQSFlfQURSKTsKKwkJcGh5PSBwaHkgJiAweGZmMDAwMDsKKwkJcGh5PSBwaHkgPj4gMTY7CisJCWlmKHBoeSA9PSBkYXRhKXsgLy9TVUNDRVNTIQorCQkJZm9yY2VfcGNpX3Bvc3RpbmcoZGV2KTsKKwkJCW1kZWxheSgzKTsgLy9yYW5kb20gdmFsdWUKKyNpZmRlZiBERUJVR19CQgorCQkJRE1FU0coIlBoeSB3ciAleCwleCIsYWRyLGRhdGEpOworI2VuZGlmCisJCQlyZXR1cm47CisJCX1lbHNleworCQkJZm9yY2VfcGNpX3Bvc3RpbmcoZGV2KTsKKwkJCW1kZWxheSgzKTsgLy9yYW5kb20gdmFsdWUKKwkJfQorCX0KKwlETUVTR1cgKCJQaHkgd3JpdGluZyAleCAleCBmYWlsZWQhIiwgYWRyLGRhdGEpOworfQorCit2b2lkIHJ0bDgxODVfc2V0X3JhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgaTsKKwl1MTYgd29yZDsKKwlpbnQgYmFzaWNfcmF0ZSxtaW5fcnJfcmF0ZSxtYXhfcnJfcmF0ZTsKKworLy8Jc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCisJLy9pZiAoaWVlZTgwMjExX2lzXzU0Zyhwcml2LT5pZWVlODAyMTEtPmN1cnJlbnRfbmV0d29yaykgJiYKKy8vCQlwcml2LT5pZWVlODAyMTEtPnN0YXRlID09IElFRUU4MDIxMV9MSU5LRUQpeworCWJhc2ljX3JhdGUgPSBpZWVlcmF0ZTJydGxyYXRlKDI0MCk7CisJbWluX3JyX3JhdGUgPSBpZWVlcmF0ZTJydGxyYXRlKDYwKTsKKwltYXhfcnJfcmF0ZSA9IGllZWVyYXRlMnJ0bHJhdGUoMjQwKTsKKworLy8KKy8vCX1lbHNleworLy8JCWJhc2ljX3JhdGUgPSBpZWVlcmF0ZTJydGxyYXRlKDIwKTsKKy8vCQltaW5fcnJfcmF0ZSA9IGllZWVyYXRlMnJ0bHJhdGUoMTApOworLy8JCW1heF9ycl9yYXRlID0gaWVlZXJhdGUycnRscmF0ZSgxMTApOworLy8JfQorCisJd3JpdGVfbmljX2J5dGUoZGV2LCBSRVNQX1JBVEUsCisJCQltYXhfcnJfcmF0ZTw8TUFYX1JFU1BfUkFURV9TSElGVHwgbWluX3JyX3JhdGU8PE1JTl9SRVNQX1JBVEVfU0hJRlQpOworCisJd29yZCAgPSByZWFkX25pY193b3JkKGRldiwgQlJTUik7CisJd29yZCAmPSB+QlJTUl9NQlJfODE4NTsKKworCisJZm9yKGk9MDtpPD1iYXNpY19yYXRlO2krKykKKwkJd29yZCB8PSAoMTw8aSk7CisKKwl3cml0ZV9uaWNfd29yZChkZXYsIEJSU1IsIHdvcmQpOworCS8vRE1FU0coIlJSOiV4IEJSU1I6ICV4IiwgcmVhZF9uaWNfYnl0ZShkZXYsUkVTUF9SQVRFKSxyZWFkX25pY193b3JkKGRldixCUlNSKSk7Cit9CisKKworCit2b2lkIHJ0bDgxODBfYWRhcHRlcl9zdGFydChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgICAgICBzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJdTMyIGFuYXBhcmFtOworCXUxNiB3b3JkOworCXU4IGNvbmZpZzM7CisvLwlpbnQgaTsKKworCXJ0bDgxODBfcnR4X2Rpc2FibGUoZGV2KTsKKwlydGw4MTgwX3Jlc2V0KGRldik7CisKKwkvKiBzZWVtcyB0aGF0IDB4ZmZmZiBvciAweGFmZmYgd2lsbCBjYXVzZQorCSAqIEhXIGludGVycnVwdCBsaW5lIGNyYXNoCisJICovCisKKwkvL3ByaXYtPmlycV9tYXNrID0gMHhhZmZmOworLy8JcHJpdi0+aXJxX21hc2sgPSAweDRmY2Y7CisKKwkvKiBlbmFibGUgYmVhY29uIHRpbWVvdXQsIGJlYWNvbiBUWCBvayBhbmQgZXJyCisJICogTFAgdHggb2sgYW5kIGVyciwgSFAgVFggb2sgYW5kIGVyciwgTlAgVFggb2sgYW5kIGVyciwKKwkgKiBSWCBvayBhbmQgRVJSLCBhbmQgR1AgdGltZXIgKi8KKwlwcml2LT5pcnFfbWFzayA9IDB4NmZjZjsKKworCXByaXYtPmRtYV9wb2xsX21hc2sgPSAwOworCisJcnRsODE4MF9iZWFjb25fdHhfZGlzYWJsZShkZXYpOworCisJaWYocHJpdi0+Y2FyZF90eXBlID09IENBUkRCVVMgKXsKKwkJY29uZmlnMz1yZWFkX25pY19ieXRlKGRldiwgQ09ORklHMyk7CisJCXdyaXRlX25pY19ieXRlKGRldixDT05GSUczLGNvbmZpZzMgfCBDT05GSUczX0Z1bmNSZWdFbik7CisJCXdyaXRlX25pY193b3JkKGRldixGRU1SLCBGRU1SX0lOVFIgfCBGRU1SX1dLVVAgfCBGRU1SX0dXQUtFIHwKKwkJCXJlYWRfbmljX3dvcmQoZGV2LCBGRU1SKSk7CisJfQorCXJ0bDgxODBfc2V0X21vZGUoZGV2LCBFUFJPTV9DTURfQ09ORklHKTsKKwl3cml0ZV9uaWNfZHdvcmQoZGV2LCBNQUMwLCAoKHUzMiopZGV2LT5kZXZfYWRkcilbMF0pOworCXdyaXRlX25pY193b3JkKGRldiwgTUFDNCwgKCh1MzIqKWRldi0+ZGV2X2FkZHIpWzFdICYgMHhmZmZmICk7CisJcnRsODE4MF9zZXRfbW9kZShkZXYsIEVQUk9NX0NNRF9OT1JNQUwpOworCisJcnRsODE4MF91cGRhdGVfbXNyKGRldik7CisKKwlpZighcHJpdi0+Y2FyZF84MTg1KXsKKwkJYW5hcGFyYW0gID0gZXByb21fcmVhZChkZXYsRVBST01fQU5BUEFSQU1fQUREUkxXT1JEKTsKKwkJYW5hcGFyYW0gfD0gZXByb21fcmVhZChkZXYsRVBST01fQU5BUEFSQU1fQUREUkhXT1JEKTw8MTY7CisKKwkJcnRsODE4MF9zZXRfYW5hcGFyYW0oZGV2LGFuYXBhcmFtKTsKKwl9CisJLyogVGhlc2UgbWlnaHQgYmUgdW5uZWNlc3Nhcnkgc2luY2Ugd2UgZG8gaW4gcnhfZW5hYmxlIC8gdHhfZW5hYmxlICovCisJZml4X3J4X2ZpZm8oZGV2KTsKKwlmaXhfdHhfZmlmbyhkZXYpOworCS8qc2V0X25pY19yeHJpbmcoZGV2KTsKKwkgIHNldF9uaWNfdHhyaW5nKGRldik7Ki8KKworCXJ0bDgxODBfc2V0X21vZGUoZGV2LCBFUFJPTV9DTURfQ09ORklHKTsKKworCS8qCisJICAgVGhlIGZvbGxvd2luZyBpcyB2ZXJ5IHN0cmFuZ2UuIHNlZW1zIHRvIGJlIHRoYXQgMSBtZWFucyB0ZXN0IG1vZGUsCisJICAgYnV0IHdlIG5lZWQgdG8gYWNrbm9sd2xlZGdlcyB0aGUgbmljIHdoZW4gYSBwYWNrZXQgaXMgcmVhZHkKKwkgICBhbHRvdWdodCB3ZSBzZXQgaXQgdG8gMAorCSovCisKKwl3cml0ZV9uaWNfYnl0ZShkZXYsCisJCSAgICAgICBDT05GSUcyLCByZWFkX25pY19ieXRlKGRldixDT05GSUcyKSAmflwKKwkJICAgICAgICgxPDxDT05GSUcyX0RNQV9QT0xMSU5HX01PREVfU0hJRlQpKTsKKwkvL150aGUgbmljIGlzbid0IGluIHRlc3QgbW9kZQorCWlmKHByaXYtPmNhcmRfODE4NSkKKwkJCXdyaXRlX25pY19ieXRlKGRldiwKKwkJICAgICAgIENPTkZJRzIsIHJlYWRfbmljX2J5dGUoZGV2LENPTkZJRzIpfCgxPDw0KSk7CisKKwlydGw4MTgwX3NldF9tb2RlKGRldixFUFJPTV9DTURfTk9STUFMKTsKKworCXdyaXRlX25pY19kd29yZChkZXYsSU5UX1RJTUVPVVQsMCk7CisjaWZkZWYgREVCVUdfUkVHSVNURVJTCisJcnRsODE4MF9kdW1wX3JlZyhkZXYpOworI2VuZGlmCisKKwlpZighcHJpdi0+Y2FyZF84MTg1KQorCXsKKwkJLyoKKwkJZXhwZXJpbWVudGFsIC0gdGhpcyBtaWdodCBiZSBuZWVkZWQgdG8gY2FsaWJyYXRlIEFHQywKKwkJYW55d2F5IGl0IHNob3VsZG4ndCBodXJ0CisJCSovCisJCXdyaXRlX25pY19ieXRlKGRldiwgQ09ORklHNSwKKwkJCXJlYWRfbmljX2J5dGUoZGV2LCBDT05GSUc1KSB8ICgxPDxBR0NSRVNFVF9TSElGVCkpOworCQlyZWFkX25pY19ieXRlKGRldiwgQ09ORklHNSk7CisJCXVkZWxheSgxNSk7CisJCXdyaXRlX25pY19ieXRlKGRldiwgQ09ORklHNSwKKwkJCXJlYWRfbmljX2J5dGUoZGV2LCBDT05GSUc1KSAmfiAoMTw8QUdDUkVTRVRfU0hJRlQpKTsKKwl9ZWxzZXsKKworCQl3cml0ZV9uaWNfYnl0ZShkZXYsIFdQQV9DT05GSUcsIDApOworCQkvL3dyaXRlX25pY19ieXRlKGRldiwgVEVTVFIsIDB4ZCk7CisJfQorCisJcnRsODE4MF9ub19od193ZXAoZGV2KTsKKworCWlmKHByaXYtPmNhcmRfODE4NSl7CisJCXJ0bDgxODVfc2V0X3JhdGUoZGV2KTsKKwkJd3JpdGVfbmljX2J5dGUoZGV2LCBSQVRFX0ZBTExCQUNLLCAweDgxKTsKKwkvLwl3cml0ZV9uaWNfYnl0ZShkZXYsIDB4ZGYsIDB4MTUpOworCX1lbHNleworCQl3b3JkICA9IHJlYWRfbmljX3dvcmQoZGV2LCBCUlNSKTsKKwkJd29yZCAmPSB+QlJTUl9NQlI7CisJCXdvcmQgJj0gfkJSU1JfQlBMQ1A7CisJCXdvcmQgfD0gaWVlZXJhdGUycnRscmF0ZShwcml2LT5pZWVlODAyMTEtPmJhc2ljX3JhdGUpOworLy9ieSBhbXkKKyAgICAgICAgICAgICAgd29yZCB8PSAweDBmOworLy9ieSBhbXkKKwkJd3JpdGVfbmljX3dvcmQoZGV2LCBCUlNSLCB3b3JkKTsKKwl9CisKKworCWlmKHByaXYtPmNhcmRfODE4NSl7CisJCXdyaXRlX25pY19ieXRlKGRldiwgR1BfRU5BQkxFLHJlYWRfbmljX2J5dGUoZGV2LCBHUF9FTkFCTEUpICYgfigxPDw2KSk7CisKKwkJLy9GSVhNRSBjZmcgMyBDbGtSdW4gZW5hYmxlIC0gaXNuJ3QgaXQgUmVhZE9ubHkgPworCQlydGw4MTgwX3NldF9tb2RlKGRldiwgRVBST01fQ01EX0NPTkZJRyk7CisJCXdyaXRlX25pY19ieXRlKGRldixDT05GSUczLCByZWFkX25pY19ieXRlKGRldiwgQ09ORklHMykKK3woMTw8Q09ORklHM19DTEtSVU5fU0hJRlQpKTsKKwkJcnRsODE4MF9zZXRfbW9kZShkZXYsIEVQUk9NX0NNRF9OT1JNQUwpOworCisJfQorCisJcHJpdi0+cmZfaW5pdChkZXYpOworCisJaWYocHJpdi0+cmZfc2V0X3NlbnMgIT0gTlVMTCkKKwkJcHJpdi0+cmZfc2V0X3NlbnMoZGV2LHByaXYtPnNlbnMpOworCXJ0bDgxODBfaXJxX2VuYWJsZShkZXYpOworCisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwkvKkRNRVNHICgibGZyZWUgJWQiLGdldF9jdXJyX3R4X2ZyZWVfZGVzYyhkZXYsTE9XX1BSSU9SSVRZKSk7CisKKwlETUVTRyAoIm5mcmVlICVkIixnZXRfY3Vycl90eF9mcmVlX2Rlc2MoZGV2LE5PUk1fUFJJT1JJVFkpKTsKKworCURNRVNHICgiaGZyZWUgJWQiLGdldF9jdXJyX3R4X2ZyZWVfZGVzYyhkZXYsSElfUFJJT1JJVFkpKTsKKwlpZihjaGVja19uaWNfZW5vdWdodF9kZXNjKGRldixOT1JNX1BSSU9SSVRZKSkgRE1FU0coIk5PUk0gT0siKTsKKwlpZihjaGVja19uaWNfZW5vdWdodF9kZXNjKGRldixISV9QUklPUklUWSkpIERNRVNHKCJISSBPSyIpOworCWlmKGNoZWNrX25pY19lbm91Z2h0X2Rlc2MoZGV2LExPV19QUklPUklUWSkpIERNRVNHKCJMT1cgT0siKTsqLworfQorCisKKworLyogdGhpcyBjb25maWd1cmVzIHJlZ2lzdGVycyBmb3IgYmVhY29uIHR4IGFuZCBlbmFibGVzIGl0IHZpYQorICogcnRsODE4MF9iZWFjb25fdHhfZW5hYmxlKCkuIHJ0bDgxODBfYmVhY29uX3R4X2Rpc2FibGUoKSBtaWdodAorICogYmUgdXNlZCB0byBzdG9wIGJlYWNvbiB0cmFuc21pc3Npb24KKyAqLwordm9pZCBydGw4MTgwX3N0YXJ0X3R4X2JlYWNvbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworLy8Jc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTgwX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOworCXUxNiB3b3JkOworLy8JRE1FU0coInJpbmcgJXggJXgiLCBwcml2LT50eGxwcmluZ2RtYSxyZWFkX25pY19kd29yZChkZXYsVExQREEpKTsKKworCURNRVNHKCJFbmFibGluZyBiZWFjb24gVFgiKTsKKwkvL3dyaXRlX25pY19ieXRlKGRldiwgMHg0MiwweGU2KTsvLyBUQ1IKKy8vCXNldF9uaWNfdHhyaW5nKGRldik7CisvLwlmaXhfdHhfZmlmbyhkZXYpOworCXJ0bDgxODBfcHJlcGFyZV9iZWFjb24oZGV2KTsKKwlydGw4MTgwX2lycV9kaXNhYmxlKGRldik7CisJcnRsODE4MF9iZWFjb25fdHhfZW5hYmxlKGRldik7CisjaWYgMAorCXJ0bDgxODBfc2V0X21vZGUoZGV2LEVQUk9NX0NNRF9DT05GSUcpOworCS8vd3JpdGVfbmljX2J5dGUoZGV2LDB4OWQsMHgyMCk7IC8vRE1BIFBvbGwKKwkvL3dyaXRlX25pY193b3JkKGRldiwweDdhLDApOworCS8vd3JpdGVfbmljX3dvcmQoZGV2LDB4N2EsMHg4MDAwKTsKKworI2lmIDAKKwl3b3JkICA9IHJlYWRfbmljX3dvcmQoZGV2LCBCY25JdHYpOworCXdvcmQgJj0gfkJjbkl0dl9CY25JdHY7IC8vIGNsZWFyIEJjbl9JdHYKKwl3b3JkIHw9IHByaXYtPmllZWU4MDIxMS0+Y3VycmVudF9uZXR3b3JrLmJlYWNvbl9pbnRlcnZhbDsvLzB4NjQ7CisJd3JpdGVfbmljX3dvcmQoZGV2LCBCY25JdHYsIHdvcmQpOworI2VuZGlmCisjZW5kaWYKKwl3b3JkID0gcmVhZF9uaWNfd29yZChkZXYsIEF0aW1XbmQpICZ+IEF0aW1XbmRfQXRpbVduZDsKKwl3cml0ZV9uaWNfd29yZChkZXYsIEF0aW1XbmQsd29yZCk7Ly8gd29yZCB8PQorLy9wcml2LT5pZWVlODAyMTEtPmN1cnJlbnRfbmV0d29yay5hdGltX3dpbmRvdyk7CisKKwl3b3JkICA9IHJlYWRfbmljX3dvcmQoZGV2LCBCaW50ckl0dik7CisJd29yZCAmPSB+QmludHJJdHZfQmludHJJdHY7CisJd29yZCB8PSAxMDAwOy8qcHJpdi0+aWVlZTgwMjExLT5jdXJyZW50X25ldHdvcmsuYmVhY29uX2ludGVydmFsICoKKwkJKChwcml2LT50eGJlYWNvbmNvdW50ID4gMSk/KHByaXYtPnR4YmVhY29uY291bnQtMSk6MSk7CisJLy8gRklYTUU6IGNoZWNrIGlmIGNvcnJlY3QgXl4gd29ya2VkIHdpdGggMHgzZTg7CisJKi8KKwl3cml0ZV9uaWNfd29yZChkZXYsIEJpbnRySXR2LCB3b3JkKTsKKworCisJcnRsODE4MF9zZXRfbW9kZShkZXYsIEVQUk9NX0NNRF9OT1JNQUwpOworCisvLwlydGw4MTgwX2JlYWNvbl90eF9lbmFibGUoZGV2KTsKKyNpZmRlZiBDT05GSUdfUlRMODE4NUIKKyAgICAgICAgcnRsODE4NWJfaXJxX2VuYWJsZShkZXYpOworI2Vsc2UKKwlydGw4MTgwX2lycV9lbmFibGUoZGV2KTsKKyNlbmRpZgorCS8qIFZWICEhISEhISEhISEgVlYqLworCS8qCisJcnRsODE4MF9zZXRfbW9kZShkZXYsRVBST01fQ01EX0NPTkZJRyk7CisJd3JpdGVfbmljX2J5dGUoZGV2LDB4OWQsMHgwMCk7CisJcnRsODE4MF9zZXRfbW9kZShkZXYsRVBST01fQ01EX05PUk1BTCk7CisqLworLy8JRE1FU0coInJpbmcgJXggJXgiLCBwcml2LT50eGxwcmluZ2RtYSxyZWFkX25pY19kd29yZChkZXYsVExQREEpKTsKKworfQorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1ORVQgU1RVRkYtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqcnRsODE4MF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCXJldHVybiAmcHJpdi0+aWVlZTgwMjExLT5zdGF0czsKK30KKy8vCisvLyBDaGFuZ2UgY3VycmVudCBhbmQgZGVmYXVsdCBwcmVhbWJsZSBtb2RlLgorLy8gMjAwNS4wMS4wNiwgYnkgcmNuamtvLgorLy8KK2Jvb2wKK01nbnRBY3RTZXRfODAyXzExX1Bvd2VyU2F2ZU1vZGUoCisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYsCisJUlRfUFNfTU9ERQkJcnRQc01vZGUKKykKK3sKKworCS8vIEN1cnJlbnRseSwgd2UgZG8gbm90IGNoYW5nZSBwb3dlciBzYXZlIG1vZGUgb24gSUJTUyBtb2RlLgorCWlmKHByaXYtPmllZWU4MDIxMS0+aXdfbW9kZSA9PSBJV19NT0RFX0FESE9DKQorCXsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8vCisJLy8gPFJKX05PVEU+IElmIHdlIG1ha2UgSFcgdG8gZmlsbCB1cCB0aGUgUHdyTWd0IGJpdCBmb3IgdXMsCisJLy8gc29tZSBBUCB3aWxsIG5vdCByZXNwb25zZSB0byBvdXIgbWdudCBmcmFtZXMgd2l0aCBQd3JNZ3QgYml0IHNldCwKKwkvLyBlLmcuIGNhbm5vdCBhc3NvY2lhdGUgdGhlIEFQLgorCS8vIFNvIEkgY29tbWVudGVkIG91dCBpdC4gMjAwNS4wMi4xNiwgYnkgcmNuamtvLgorCS8vCisvLwkvLyBDaGFuZ2UgZGV2aWNlJ3MgcG93ZXIgc2F2ZSBtb2RlLgorLy8JQWRhcHRlci0+SGFsRnVuYy5TZXRQU01vZGVIYW5kbGVyKCBBZGFwdGVyLCBydFBzTW9kZSApOworCisJLy8gVXBkYXRlIHBvd2VyIHNhdmUgbW9kZSBjb25maWd1cmVkLgorLy8JcHJpdi0+ZG90MTFQb3dlclNhdmVNb2RlID0gcnRQc01vZGU7CisJcHJpdi0+aWVlZTgwMjExLT5wcyA9IHJ0UHNNb2RlOworCS8vIERldGVybWluZSBMaXN0ZW5JbnRlcnZhbC4KKyNpZiAwCisJaWYocHJpdi0+ZG90MTFQb3dlclNhdmVNb2RlID09IGVNYXhQcykKKwl7CisJCXByaXYtPmllZWU4MDIxMS0+TGlzdGVuSW50ZXJ2YWwgPSAxMDsKKwl9CisJZWxzZQorCXsKKwkJcHJpdi0+aWVlZTgwMjExLT5MaXN0ZW5JbnRlcnZhbCA9IDI7CisJfQorI2VuZGlmCisJcmV0dXJuIHRydWU7Cit9CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIExlaXN1cmUgUG93ZXIgU2F2ZSBpbiBsaW5rZWQgc3RhdGUuCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKy8vCisvLwlEZXNjcmlwdGlvbjoKKy8vCQlFbnRlciB0aGUgbGVpc3VyZSBwb3dlciBzYXZlIG1vZGUuCisvLwordm9pZAorTGVpc3VyZVBTRW50ZXIoCisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYKKwkpCit7CisJaWYgKHByaXYtPmJMZWlzdXJlUHMpCisJeworCQlpZiAocHJpdi0+aWVlZTgwMjExLT5wcyA9PSBJRUVFODAyMTFfUFNfRElTQUJMRUQpCisJCXsKKwkJCS8vcHJpbnRrKCItLS0tRW50ZXIgUFNcbiIpOworCQkJTWdudEFjdFNldF84MDJfMTFfUG93ZXJTYXZlTW9kZShwcml2LCBJRUVFODAyMTFfUFNfTUJDQVNUfElFRUU4MDIxMV9QU19VTklDQVNUKTsvL0lFRUU4MDIxMV9QU19FTkFCTEUKKwkJfQorCX0KK30KKworCisvLworLy8JRGVzY3JpcHRpb246CisvLwkJTGVhdmUgdGhlIGxlaXN1cmUgcG93ZXIgc2F2ZSBtb2RlLgorLy8KK3ZvaWQKK0xlaXN1cmVQU0xlYXZlKAorCXN0cnVjdCByODE4MF9wcml2ICpwcml2CisJKQoreworCWlmIChwcml2LT5iTGVpc3VyZVBzKQorCXsKKwkJaWYgKHByaXYtPmllZWU4MDIxMS0+cHMgIT0gSUVFRTgwMjExX1BTX0RJU0FCTEVEKQorCQl7CisJCQkvL3ByaW50aygiLS0tLUxlYXZlIFBTXG4iKTsKKwkJCU1nbnRBY3RTZXRfODAyXzExX1Bvd2VyU2F2ZU1vZGUocHJpdiwgSUVFRTgwMjExX1BTX0RJU0FCTEVEKTsKKwkJfQorCX0KK30KKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwyMCkpCit2b2lkIHJ0bDgxODBfaHdfd2FrZXVwX3dxIChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisvLwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgcjgxODBfcHJpdiwgd2F0Y2hfZG9nX3dxKTsKKy8vCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICogaWVlZSA9IChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSopCisvLwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGllZWU4MDIxMV9kZXZpY2UsIHdhdGNoX2RvZ193cSk7CisJc3RydWN0IGRlbGF5ZWRfd29yayAqZHdvcmsgPSBjb250YWluZXJfb2Yod29yayxzdHJ1Y3QgZGVsYXllZF93b3JrLHdvcmspOworCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlID0gY29udGFpbmVyX29mKGR3b3JrLHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlLGh3X3dha2V1cF93cSk7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGllZWUtPmRldjsKKyNlbHNlCit2b2lkIHJ0bDgxODBfaHdfd2FrZXVwX3dxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworI2VuZGlmCisKKy8vCXByaW50aygiZGV2IGlzICVkXG4iLGRldik7CisvLwlwcmludGsoIiYqJiheKigmKCY9PT09PT09PT0+JXMoKVxuIiwgX19mdW5jX18pOworCXJ0bDgxODBfaHdfd2FrZXVwKGRldik7CisKK30KKworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDIwKSkKK3ZvaWQgcnRsODE4MF9od19zbGVlcF93cSAoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworLy8gICAgICBzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgcjgxODBfcHJpdiwgd2F0Y2hfZG9nX3dxKTsKKy8vICAgICAgc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKiBpZWVlID0gKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKikKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlLCB3YXRjaF9kb2dfd3EpOworICAgICAgICBzdHJ1Y3QgZGVsYXllZF93b3JrICpkd29yayA9IGNvbnRhaW5lcl9vZih3b3JrLHN0cnVjdCBkZWxheWVkX3dvcmssd29yayk7CisgICAgICAgIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlID0gY29udGFpbmVyX29mKGR3b3JrLHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlLGh3X3NsZWVwX3dxKTsKKyAgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGllZWUtPmRldjsKKyNlbHNlCit2b2lkIHJ0bDgxODBfaHdfc2xlZXBfd3Eoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICAgICAgc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworI2VuZGlmCisKKyAgICAgICAgcnRsODE4MF9od19zbGVlcF9kb3duKGRldik7Cit9CisKKy8vWUosYWRkLDA4MDgyOCxmb3IgS2VlcEFsaXZlCitzdGF0aWMgdm9pZCBNZ250TGlua0tlZXBBbGl2ZShzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiApCit7CisJaWYgKHByaXYtPmtlZXBBbGl2ZUxldmVsID09IDApCisJCXJldHVybjsKKworCWlmKHByaXYtPmllZWU4MDIxMS0+c3RhdGUgPT0gSUVFRTgwMjExX0xJTktFRCkKKwl7CisJCS8vCisJCS8vIEtlZXAtQWxpdmUuCisJCS8vCisJCS8vcHJpbnRrKCJMYXN0VHg6JWQgVHg6JWQgTGFzdFJ4OiVkIFJ4OiVsZCBJZGxlOiVkXG4iLHByaXYtPmxpbmtfZGV0ZWN0Lkxhc3ROdW1UeFVuaWNhc3QscHJpdi0+TnVtVHhVbmljYXN0LCBwcml2LT5saW5rX2RldGVjdC5MYXN0TnVtUnhVbmljYXN0LCBwcml2LT5pZWVlODAyMTEtPk51bVJ4VW5pY2FzdCwgcHJpdi0+bGlua19kZXRlY3QuSWRsZUNvdW50KTsKKworCQlpZiAoIChwcml2LT5rZWVwQWxpdmVMZXZlbD09IDIpIHx8CisJCQkocHJpdi0+bGlua19kZXRlY3QuTGFzdE51bVR4VW5pY2FzdCA9PSBwcml2LT5OdW1UeFVuaWNhc3QgJiYKKwkJCXByaXYtPmxpbmtfZGV0ZWN0Lkxhc3ROdW1SeFVuaWNhc3QgPT0gcHJpdi0+aWVlZTgwMjExLT5OdW1SeFVuaWNhc3QgKQorCQkJKQorCQl7CisJCQlwcml2LT5saW5rX2RldGVjdC5JZGxlQ291bnQrKzsKKworCQkJLy8KKwkJCS8vIFNlbmQgYSBLZWVwLUFsaXZlIHBhY2tldCBwYWNrZXQgdG8gQVAgaWYgd2UgaGFkIGJlZW4gaWRsZSBmb3IgYSB3aGlsZS4KKwkJCS8vCisJCQlpZihwcml2LT5saW5rX2RldGVjdC5JZGxlQ291bnQgPj0gKChLRUVQX0FMSVZFX0lOVEVSVkFMIC8gQ0hFQ0tfRk9SX0hBTkdfUEVSSU9EKS0xKSApCisJCQl7CisJCQkJcHJpdi0+bGlua19kZXRlY3QuSWRsZUNvdW50ID0gMDsKKwkJCQlpZWVlODAyMTFfc3RhX3BzX3NlbmRfbnVsbF9mcmFtZShwcml2LT5pZWVlODAyMTEsIGZhbHNlKTsKKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCXByaXYtPmxpbmtfZGV0ZWN0LklkbGVDb3VudCA9IDA7CisJCX0KKwkJcHJpdi0+bGlua19kZXRlY3QuTGFzdE51bVR4VW5pY2FzdCA9IHByaXYtPk51bVR4VW5pY2FzdDsKKwkJcHJpdi0+bGlua19kZXRlY3QuTGFzdE51bVJ4VW5pY2FzdCA9IHByaXYtPmllZWU4MDIxMS0+TnVtUnhVbmljYXN0OworCX0KK30KKy8vWUosYWRkLDA4MDgyOCxmb3IgS2VlcEFsaXZlLGVuZAorCitzdGF0aWMgdTggcmVhZF9hY2FkYXB0ZXJfZmlsZShjaGFyICpmaWxlbmFtZSk7Cit2b2lkIHJ0bDgxODBfd2F0Y2hfZG9nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCWJvb2wgYkVudGVyUFMgPSBmYWxzZTsKKwlib29sIGJCdXN5VHJhZmZpYyA9IGZhbHNlOworCXUzMiBUb3RhbFJ4TnVtID0gMDsKKwl1MTYgU2xvdEluZGV4ID0gMDsKKwl1MTYgaSA9IDA7CisjaWZkZWYgRU5BQkxFX0lQUworCWlmKHByaXYtPmllZWU4MDIxMS0+YWN0c2Nhbm5pbmcgPT0gZmFsc2UpeworCQlpZigocHJpdi0+aWVlZTgwMjExLT5pd19tb2RlICE9IElXX01PREVfQURIT0MpICYmIChwcml2LT5pZWVlODAyMTEtPnN0YXRlID09IElFRUU4MDIxMV9OT0xJTkspICYmIChwcml2LT5pZWVlODAyMTEtPmJlaW5yZXRyeSA9PSBmYWxzZSkgJiYgKHByaXYtPmVSRlBvd2VyU3RhdGUgPT0gZVJmT24pKXsKKwkJCUlQU0VudGVyKGRldik7CisJCX0KKwl9CisjZW5kaWYKKwkvL1lKLGFkZCwwODA4MjgsZm9yIGxpbmsgc3RhdGUgY2hlY2sKKwlpZigocHJpdi0+aWVlZTgwMjExLT5zdGF0ZSA9PSBJRUVFODAyMTFfTElOS0VEKSAmJiAocHJpdi0+aWVlZTgwMjExLT5pd19tb2RlID09IElXX01PREVfSU5GUkEpKXsKKwkJU2xvdEluZGV4ID0gKHByaXYtPmxpbmtfZGV0ZWN0LlNsb3RJbmRleCsrKSAlIHByaXYtPmxpbmtfZGV0ZWN0LlNsb3ROdW07CisJCXByaXYtPmxpbmtfZGV0ZWN0LlJ4RnJhbWVOdW1bU2xvdEluZGV4XSA9IHByaXYtPmllZWU4MDIxMS0+TnVtUnhEYXRhSW5QZXJpb2QgKyBwcml2LT5pZWVlODAyMTEtPk51bVJ4QmNuSW5QZXJpb2Q7CisJCWZvciggaT0wOyBpPHByaXYtPmxpbmtfZGV0ZWN0LlNsb3ROdW07IGkrKyApCisJCQlUb3RhbFJ4TnVtKz0gcHJpdi0+bGlua19kZXRlY3QuUnhGcmFtZU51bVtpXTsKKwkJLy9wcmludGsoIiYmJiYmPT09IFRvdGFsUnhOdW0gPSAlZFxuIiwgVG90YWxSeE51bSk7CisJCWlmKFRvdGFsUnhOdW0gPT0gMCl7CisJCQlwcml2LT5pZWVlODAyMTEtPnN0YXRlID0gSUVFRTgwMjExX0FTU09DSUFUSU5HOworCQkJcXVldWVfd29yayhwcml2LT5pZWVlODAyMTEtPndxLCAmcHJpdi0+aWVlZTgwMjExLT5hc3NvY2lhdGVfcHJvY2VkdXJlX3dxKTsKKwkJfQorCX0KKworCS8vWUosYWRkLDA4MDgyOCxmb3IgS2VlcEFsaXZlCisJTWdudExpbmtLZWVwQWxpdmUocHJpdik7CisKKwkvL1lKLGFkZCwwODA4MjgsZm9yIExQUworI2lmZGVmIEVOQUJMRV9MUFMKKwlpZihwcml2LT5Qb3dlclByb2ZpbGUgPT0gUE9XRVJfUFJPRklMRV9CQVRURVJZICkKKwl7CisJCS8vVHVybiBvbiBMZWlzdXJlUFMgb24gYmF0dGVyeSBwb3dlcgorCQkvL3ByaW50aygiISEhISFPbiBiYXR0ZXJ5IHBvd2VyXG4iKTsKKwkJcHJpdi0+YkxlaXN1cmVQcyA9IHRydWU7CisJfQorCWVsc2UgaWYocHJpdi0+UG93ZXJQcm9maWxlID09IFBPV0VSX1BST0ZJTEVfQUMgKQorCXsKKwkJLy8gVHVybiBvZmYgTGVpc3VyZVBTIG9uIEFDIHBvd2VyCisJCS8vcHJpbnRrKCItLS0tT24gQUMgcG93ZXJcbiIpOworCQlMZWlzdXJlUFNMZWF2ZShwcml2KTsKKwkJcHJpdi0+YkxlaXN1cmVQcz0gZmFsc2U7CisJfQorI2VuZGlmCisKKyNpZiAwCisjaWZuZGVmIEVOQUJMRV9MUFMKKwlpZihwcml2LT5pZWVlODAyMTEtPnN0YXRlID09IElFRUU4MDIxMV9MSU5LRUQpeworCQlpZigJcHJpdi0+TnVtUnhPa0luUGVyaW9kPiA2NjYgfHwKKwkJCXByaXYtPk51bVR4T2tJblBlcmlvZCA+IDY2NiApIHsKKwkJCWJCdXN5VHJhZmZpYyA9IHRydWU7CisJCX0KKwkJaWYoKHByaXYtPmllZWU4MDIxMS0+TnVtUnhEYXRhICsgcHJpdi0+TnVtVHhPa0luUGVyaW9kKTw4KSB7CisJCQliRW50ZXJQUz0gdHJ1ZTsKKwkJfQorCQlpZihiRW50ZXJQUykgeworCQkJTGVpc3VyZVBTRW50ZXIocHJpdik7CisJCX0KKwkJZWxzZSB7CisJCQlMZWlzdXJlUFNMZWF2ZShwcml2KTsKKwkJfQorCX0KKwllbHNlCXsKKwkJTGVpc3VyZVBTTGVhdmUocHJpdik7CisJfQorI2VuZGlmCisJcHJpdi0+TnVtUnhPa0luUGVyaW9kID0gMDsKKwlwcml2LT5OdW1UeE9rSW5QZXJpb2QgPSAwOworCXByaXYtPmllZWU4MDIxMS0+TnVtUnhEYXRhID0gMDsKKyNlbHNlCisjaWZkZWYgRU5BQkxFX0xQUworCWlmKHByaXYtPmllZWU4MDIxMS0+c3RhdGUgPT0gSUVFRTgwMjExX0xJTktFRCl7CisJCXByaXYtPmxpbmtfZGV0ZWN0Lk51bVJ4T2tJblBlcmlvZCA9IHByaXYtPmllZWU4MDIxMS0+TnVtUnhEYXRhSW5QZXJpb2Q7CisJCS8vcHJpbnRrKCJUeE9rPSVkIFJ4T2s9JWRcbiIsIHByaXYtPmxpbmtfZGV0ZWN0Lk51bVR4T2tJblBlcmlvZCwgcHJpdi0+bGlua19kZXRlY3QuTnVtUnhPa0luUGVyaW9kKTsKKwkJaWYoCXByaXYtPmxpbmtfZGV0ZWN0Lk51bVJ4T2tJblBlcmlvZD4gNjY2IHx8CisJCQlwcml2LT5saW5rX2RldGVjdC5OdW1UeE9rSW5QZXJpb2Q+IDY2NiApIHsKKwkJCWJCdXN5VHJhZmZpYyA9IHRydWU7CisJCX0KKwkJaWYoKChwcml2LT5saW5rX2RldGVjdC5OdW1SeE9rSW5QZXJpb2QgKyBwcml2LT5saW5rX2RldGVjdC5OdW1UeE9rSW5QZXJpb2QpID4gOCkKKwkJCXx8IChwcml2LT5saW5rX2RldGVjdC5OdW1SeE9rSW5QZXJpb2QgPiAyKSkgeworCQkJYkVudGVyUFM9IGZhbHNlOworCQl9CisJCWVsc2UgeworCQkJYkVudGVyUFM9IHRydWU7CisJCX0KKworCQlpZihiRW50ZXJQUykgeworCQkJTGVpc3VyZVBTRW50ZXIocHJpdik7CisJCX0KKwkJZWxzZSB7CisJCQlMZWlzdXJlUFNMZWF2ZShwcml2KTsKKwkJfQorCX0KKwllbHNleworCQlMZWlzdXJlUFNMZWF2ZShwcml2KTsKKwl9CisjZW5kaWYKKwlwcml2LT5saW5rX2RldGVjdC5iQnVzeVRyYWZmaWMgPSBiQnVzeVRyYWZmaWM7CisJcHJpdi0+bGlua19kZXRlY3QuTnVtUnhPa0luUGVyaW9kID0gMDsKKwlwcml2LT5saW5rX2RldGVjdC5OdW1UeE9rSW5QZXJpb2QgPSAwOworCXByaXYtPmllZWU4MDIxMS0+TnVtUnhEYXRhSW5QZXJpb2QgPSAwOworCXByaXYtPmllZWU4MDIxMS0+TnVtUnhCY25JblBlcmlvZCA9IDA7CisjZW5kaWYKK30KK2ludCBfcnRsODE4MF91cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwkvL2ludCBpOworCisJcHJpdi0+dXA9MTsKKworCURNRVNHKCJCcmluZ2luZyB1cCBpZmFjZSIpOworI2lmZGVmIENPTkZJR19SVEw4MTg1QgorCXJ0bDgxODViX2FkYXB0ZXJfc3RhcnQoZGV2KTsKKwlydGw4MTg1Yl9yeF9lbmFibGUoZGV2KTsKKwlydGw4MTg1Yl90eF9lbmFibGUoZGV2KTsKKyNlbHNlCisJcnRsODE4MF9hZGFwdGVyX3N0YXJ0KGRldik7CisJcnRsODE4MF9yeF9lbmFibGUoZGV2KTsKKwlydGw4MTgwX3R4X2VuYWJsZShkZXYpOworI2VuZGlmCisjaWZkZWYgRU5BQkxFX0lQUworCWlmKHByaXYtPmJJbmFjdGl2ZVBzKXsKKwkJaWYocHJpdi0+aWVlZTgwMjExLT5pd19tb2RlID09IElXX01PREVfQURIT0MpCisJCQlJUFNMZWF2ZShkZXYpOworCX0KKyNlbmRpZgorLy9ieSBhbXkgMDgwMzEyCisjaWZkZWYgUkFURV9BREFQVAorICAgICAgIHRpbWVyX3JhdGVfYWRhcHRpdmUoKHVuc2lnbmVkIGxvbmcpZGV2KTsKKyNlbmRpZgorLy9ieSBhbXkgMDgwMzEyCisJd2F0Y2hfZG9nX2FkYXB0aXZlKCh1bnNpZ25lZCBsb25nKWRldik7CisjaWZkZWYgU1dfQU5URQorICAgICAgICBpZihwcml2LT5iU3dBbnRlbm5hRGl2ZXJpdHkpCisJCQlTd0FudGVubmFEaXZlcnNpdHlUaW1lckNhbGxiYWNrKGRldik7CisjZW5kaWYKKy8vCUlQU0VudGVyKGRldik7CisJaWVlZTgwMjExX3NvZnRtYWNfc3RhcnRfcHJvdG9jb2wocHJpdi0+aWVlZTgwMjExKTsKKworLy9BZGQgZm9yIFJGIHBvd2VyIG9uIHBvd2VyIG9mZiBieSBsaXpoYW9taW5nIDA4MDUxMgorLy8JcHJpdi0+ZVJGUG93ZXJTdGF0ZSA9IGVSZk9uOworLy8JcHJpbnRrKCJcbi0tLS0tLS0tU3RhcnQgcXVldWVfd29yazpHUElPQ2hhbmdlUkZXb3JrSXRlbSIpOworLy8JcXVldWVfZGVsYXllZF93b3JrKHByaXYtPmllZWU4MDIxMS0+d3EsJnByaXYtPmllZWU4MDIxMS0+R1BJT0NoYW5nZVJGV29ya0l0ZW0sMTAwMCk7CisKKwlyZXR1cm4gMDsKK30KKworCitpbnQgcnRsODE4MF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCWludCByZXQ7CisKKwlkb3duKCZwcml2LT53eF9zZW0pOworCXJldCA9IHJ0bDgxODBfdXAoZGV2KTsKKwl1cCgmcHJpdi0+d3hfc2VtKTsKKwlyZXR1cm4gcmV0OworCit9CisKKworaW50IHJ0bDgxODBfdXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisKKwlpZiAocHJpdi0+dXAgPT0gMSkgcmV0dXJuIC0xOworCisJcmV0dXJuIF9ydGw4MTgwX3VwKGRldik7Cit9CisKKworaW50IHJ0bDgxODBfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJaW50IHJldDsKKworCWRvd24oJnByaXYtPnd4X3NlbSk7CisJcmV0ID0gcnRsODE4MF9kb3duKGRldik7CisJdXAoJnByaXYtPnd4X3NlbSk7CisKKwlyZXR1cm4gcmV0OworCit9CisKK2ludCBydGw4MTgwX2Rvd24oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisKKwlpZiAocHJpdi0+dXAgPT0gMCkgcmV0dXJuIC0xOworCisJcHJpdi0+dXA9MDsKKworCWllZWU4MDIxMV9zb2Z0bWFjX3N0b3BfcHJvdG9jb2wocHJpdi0+aWVlZTgwMjExKTsKKwkvKiBGSVhNRSAqLworCWlmICghbmV0aWZfcXVldWVfc3RvcHBlZChkZXYpKQorCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJcnRsODE4MF9ydHhfZGlzYWJsZShkZXYpOworCXJ0bDgxODBfaXJxX2Rpc2FibGUoZGV2KTsKKwlkZWxfdGltZXJfc3luYygmcHJpdi0+d2F0Y2hfZG9nX3RpbWVyKTsKKwkvL2NhbmNlbF9kZWxheWVkX3dvcmsoJnByaXYtPmllZWU4MDIxMS0+d2F0Y2hfZG9nX3dxKTsKKy8ve2J5IGFteSAwODAzMTIKKyAgICBkZWxfdGltZXJfc3luYygmcHJpdi0+cmF0ZWFkYXB0ZXJfdGltZXIpOworICAgIGNhbmNlbF9kZWxheWVkX3dvcmsoJnByaXYtPmllZWU4MDIxMS0+cmF0ZV9hZGFwdGVyX3dxKTsKKy8vYnkgYW15IDA4MDMxMn0KKwljYW5jZWxfZGVsYXllZF93b3JrKCZwcml2LT5pZWVlODAyMTEtPmh3X3dha2V1cF93cSk7CisJY2FuY2VsX2RlbGF5ZWRfd29yaygmcHJpdi0+aWVlZTgwMjExLT5od19zbGVlcF93cSk7CisJY2FuY2VsX2RlbGF5ZWRfd29yaygmcHJpdi0+aWVlZTgwMjExLT5od19kaWdfd3EpOworCWNhbmNlbF9kZWxheWVkX3dvcmsoJnByaXYtPmllZWU4MDIxMS0+dHhfcHdfd3EpOworCWRlbF90aW1lcl9zeW5jKCZwcml2LT5Td0FudGVubmFEaXZlcnNpdHlUaW1lcik7CisJU2V0WmVicmFSRlBvd2VyU3RhdGU4MTg1KGRldixlUmZPZmYpOworCS8vaWVlZTgwMjExX3NvZnRtYWNfc3RvcF9wcm90b2NvbChwcml2LT5pZWVlODAyMTEpOworCW1lbXNldCgmKHByaXYtPmllZWU4MDIxMS0+Y3VycmVudF9uZXR3b3JrKSwwLHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmspKTsKKwlwcml2LT5pZWVlODAyMTEtPnN0YXRlID0gSUVFRTgwMjExX05PTElOSzsKKwlyZXR1cm4gMDsKK30KKworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDIwKSkKK3ZvaWQgcnRsODE4MF9yZXN0YXJ0X3dxKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgcjgxODBfcHJpdiwgcmVzZXRfd3EpOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwcml2LT5kZXY7CisjZWxzZQordm9pZCBydGw4MTgwX3Jlc3RhcnRfd3Eoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisjZW5kaWYKKwlkb3duKCZwcml2LT53eF9zZW0pOworCisJcnRsODE4MF9jb21taXQoZGV2KTsKKworCXVwKCZwcml2LT53eF9zZW0pOworfQorCit2b2lkIHJ0bDgxODBfcmVzdGFydChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwkvL3J0bDgxODBfY29tbWl0KGRldik7CisJc2NoZWR1bGVfd29yaygmcHJpdi0+cmVzZXRfd3EpOworCS8vRE1FU0coIlRYVElNRU9VVCIpOworfQorCisKK3ZvaWQgcnRsODE4MF9jb21taXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisKKwlpZiAocHJpdi0+dXAgPT0gMCkgcmV0dXJuIDsKKy8vK2J5IGFteSAwODAzMTIKKwlkZWxfdGltZXJfc3luYygmcHJpdi0+d2F0Y2hfZG9nX3RpbWVyKTsKKwkvL2NhbmNlbF9kZWxheWVkX3dvcmsoJnByaXYtPmllZWU4MDIxMS0+d2F0Y2hfZG9nX3dxKTsKKy8ve2J5IGFteSAwODAzMTIKKy8vYnkgYW15IGZvciByYXRlIGFkYXB0aXZlCisgICAgZGVsX3RpbWVyX3N5bmMoJnByaXYtPnJhdGVhZGFwdGVyX3RpbWVyKTsKKyAgICBjYW5jZWxfZGVsYXllZF93b3JrKCZwcml2LT5pZWVlODAyMTEtPnJhdGVfYWRhcHRlcl93cSk7CisvL2J5IGFteSBmb3IgcmF0ZSBhZGFwdGl2ZQorLy9ieSBhbXkgMDgwMzEyfQorCWNhbmNlbF9kZWxheWVkX3dvcmsoJnByaXYtPmllZWU4MDIxMS0+aHdfd2FrZXVwX3dxKTsKKwljYW5jZWxfZGVsYXllZF93b3JrKCZwcml2LT5pZWVlODAyMTEtPmh3X3NsZWVwX3dxKTsKKwljYW5jZWxfZGVsYXllZF93b3JrKCZwcml2LT5pZWVlODAyMTEtPmh3X2RpZ193cSk7CisJY2FuY2VsX2RlbGF5ZWRfd29yaygmcHJpdi0+aWVlZTgwMjExLT50eF9wd193cSk7CisJZGVsX3RpbWVyX3N5bmMoJnByaXYtPlN3QW50ZW5uYURpdmVyc2l0eVRpbWVyKTsKKwlpZWVlODAyMTFfc29mdG1hY19zdG9wX3Byb3RvY29sKHByaXYtPmllZWU4MDIxMSk7CisJcnRsODE4MF9pcnFfZGlzYWJsZShkZXYpOworCXJ0bDgxODBfcnR4X2Rpc2FibGUoZGV2KTsKKwlfcnRsODE4MF91cChkZXYpOworfQorCisKK3N0YXRpYyB2b2lkIHI4MTgwX3NldF9tdWx0aWNhc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJc2hvcnQgcHJvbWlzYzsKKworCS8vZG93bigmcHJpdi0+d3hfc2VtKTsKKworCXByb21pc2MgPSAoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSA/IDE6MDsKKworCWlmIChwcm9taXNjICE9IHByaXYtPnByb21pc2MpCisJCXJ0bDgxODBfcmVzdGFydChkZXYpOworCisJcHJpdi0+cHJvbWlzYyA9IHByb21pc2M7CisKKwkvL3VwKCZwcml2LT53eF9zZW0pOworfQorCisjaWYgMAorLyogdGhpcyBpcyBjYWxsZWQgYnkgdGhlIGtlcm5lbCB3aGVuIGl0IG5lZWRzIHRvIFRYIGEgODAyLjMgZW5jYXBzdWxhdGVkIGZyYW1lKi8KK2ludCBydGw4MTgwXzgwMjNfaGFyZF9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCWludCByZXQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT50eF9sb2NrLGZsYWdzKTsKKwlyZXQgPSBpZWVlODAyMTFfcjgxODBfODAyM19oYXJkc3RhcnR4bWl0KHNrYixwcml2LT5pZWVlODAyMTEpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnR4X2xvY2ssZmxhZ3MpOworCXJldHVybiByZXQ7Cit9CisjZW5kaWYKKworaW50IHI4MTgwX3NldF9tYWNfYWRyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHZvaWQgKm1hYykKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJc3RydWN0IHNvY2thZGRyICphZGRyID0gbWFjOworCisJZG93bigmcHJpdi0+d3hfc2VtKTsKKworCW1lbWNweShkZXYtPmRldl9hZGRyLCBhZGRyLT5zYV9kYXRhLCBFVEhfQUxFTik7CisKKwlpZihwcml2LT5pZWVlODAyMTEtPml3X21vZGUgPT0gSVdfTU9ERV9NQVNURVIpCisJCW1lbWNweShwcml2LT5pZWVlODAyMTEtPmN1cnJlbnRfbmV0d29yay5ic3NpZCwgZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOworCisJaWYgKHByaXYtPnVwKSB7CisJCXJ0bDgxODBfZG93bihkZXYpOworCQlydGw4MTgwX3VwKGRldik7CisJfQorCisJdXAoJnByaXYtPnd4X3NlbSk7CisKKwlyZXR1cm4gMDsKK30KKworLyogYmFzZWQgb24gaXB3MjIwMCBkcml2ZXIgKi8KK2ludCBydGw4MTgwX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqcnEsIGludCBjbWQpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTgwX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOworCisJc3RydWN0IGl3cmVxICp3cnEgPSAoc3RydWN0IGl3cmVxICopIHJxOworCWludCByZXQ9LTE7CisJc3dpdGNoIChjbWQpIHsKKwkgICAgY2FzZSBSVExfSU9DVExfV1BBX1NVUFBMSUNBTlQ6CisJCXJldCA9IGllZWU4MDIxMV93cGFfc3VwcGxpY2FudF9pb2N0bChwcml2LT5pZWVlODAyMTEsICZ3cnEtPnUuZGF0YSk7CisJCXJldHVybiByZXQ7CisKKwkgICAgZGVmYXVsdDoKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KKworCXJldHVybiAtRU9QTk9UU1VQUDsKK30KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tUENJIFNUVUZGLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBydGw4MTgwX3BjaV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKwkJCQkgICAgICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQoreworCXVuc2lnbmVkIGxvbmcgaW9hZGRyID0gMDsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gTlVMTDsKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdj0gTlVMTDsKKwkvL3U4ICpwdHI7CisJdTggdW5pdCA9IDA7CisKKyNpZmRlZiBDT05GSUdfUlRMODE4MF9JT19NQVAKKwl1bnNpZ25lZCBsb25nIHBpb19zdGFydCwgcGlvX2xlbiwgcGlvX2ZsYWdzOworI2Vsc2UKKwl1bnNpZ25lZCBsb25nIHBtZW1fc3RhcnQsIHBtZW1fbGVuLCBwbWVtX2ZsYWdzOworI2VuZGlmIC8vZW5kICNpZmRlZiBSVExfSU9fTUFQCisKKwlETUVTRygiQ29uZmlndXJpbmcgY2hpcCByZXNvdXJjZXMiKTsKKworCWlmKCBwY2lfZW5hYmxlX2RldmljZSAocGRldikgKXsKKwkJRE1FU0coIkZhaWxlZCB0byBlbmFibGUgUENJIGRldmljZSIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlwY2lfc2V0X21hc3RlcihwZGV2KTsKKwkvL3BjaV9zZXRfd21pKHBkZXYpOworCXBjaV9zZXRfZG1hX21hc2socGRldiwgMHhmZmZmZmYwMFVMTCk7CisJcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBkZXYsMHhmZmZmZmYwMFVMTCk7CisJZGV2ID0gYWxsb2NfaWVlZTgwMjExKHNpemVvZihzdHJ1Y3QgcjgxODBfcHJpdikpOworCWlmICghZGV2KQorCQlyZXR1cm4gLUVOT01FTTsKKwlwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlwcml2LT5pZWVlODAyMTEgPSBuZXRkZXZfcHJpdihkZXYpOworCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDI0KQorICAgICAgICBTRVRfTU9EVUxFX09XTkVSKGRldik7CisjZW5kaWYKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgZGV2KTsKKwlTRVRfTkVUREVWX0RFVihkZXYsICZwZGV2LT5kZXYpOworCisJcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisvLwltZW1zZXQocHJpdiwwLHNpemVvZihzdHJ1Y3QgcjgxODBfcHJpdikpOworCXByaXYtPnBkZXY9cGRldjsKKworCisjaWZkZWYgQ09ORklHX1JUTDgxODBfSU9fTUFQCisKKwlwaW9fc3RhcnQgPSAodW5zaWduZWQgbG9uZylwY2lfcmVzb3VyY2Vfc3RhcnQgKHBkZXYsIDApOworCXBpb19sZW4gPSAodW5zaWduZWQgbG9uZylwY2lfcmVzb3VyY2VfbGVuIChwZGV2LCAwKTsKKwlwaW9fZmxhZ3MgPSAodW5zaWduZWQgbG9uZylwY2lfcmVzb3VyY2VfZmxhZ3MgKHBkZXYsIDApOworCisgICAgICAJaWYgKCEocGlvX2ZsYWdzICYgSU9SRVNPVVJDRV9JTykpIHsKKwkJRE1FU0coInJlZ2lvbiAjMCBub3QgYSBQSU8gcmVzb3VyY2UsIGFib3J0aW5nIik7CisJCWdvdG8gZmFpbDsKKwl9CisKKwkvL0RNRVNHKCJJTyBzcGFjZSBAIDB4JTA4bHgiLCBwaW9fc3RhcnQgKTsKKwlpZiggISByZXF1ZXN0X3JlZ2lvbiggcGlvX3N0YXJ0LCBwaW9fbGVuLCBSVEw4MTgwX01PRFVMRV9OQU1FICkgKXsKKwkJRE1FU0coInJlcXVlc3RfcmVnaW9uIGZhaWxlZCEiKTsKKwkJZ290byBmYWlsOworCX0KKworCWlvYWRkciA9IHBpb19zdGFydDsKKwlkZXYtPmJhc2VfYWRkciA9IGlvYWRkcjsgLy8gZGV2aWNlIEkvTyBhZGRyZXNzCisKKyNlbHNlCisKKwlwbWVtX3N0YXJ0ID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDEpOworCXBtZW1fbGVuID0gcGNpX3Jlc291cmNlX2xlbihwZGV2LCAxKTsKKwlwbWVtX2ZsYWdzID0gcGNpX3Jlc291cmNlX2ZsYWdzIChwZGV2LCAxKTsKKworCWlmICghKHBtZW1fZmxhZ3MgJiBJT1JFU09VUkNFX01FTSkpIHsKKwkJRE1FU0coInJlZ2lvbiAjMSBub3QgYSBNTUlPIHJlc291cmNlLCBhYm9ydGluZyIpOworCQlnb3RvIGZhaWw7CisJfQorCisJLy9ETUVTRygiTWVtb3J5IG1hcHBlZCBzcGFjZSBAIDB4JTA4bHggIiwgcG1lbV9zdGFydCk7CisJaWYoICEgcmVxdWVzdF9tZW1fcmVnaW9uKHBtZW1fc3RhcnQsIHBtZW1fbGVuLCBSVEw4MTgwX01PRFVMRV9OQU1FKSkgeworCQlETUVTRygicmVxdWVzdF9tZW1fcmVnaW9uIGZhaWxlZCEiKTsKKwkJZ290byBmYWlsOworCX0KKworCisJaW9hZGRyID0gKHVuc2lnbmVkIGxvbmcpaW9yZW1hcF9ub2NhY2hlKCBwbWVtX3N0YXJ0LCBwbWVtX2xlbik7CisJaWYoIGlvYWRkciA9PSAodW5zaWduZWQgbG9uZylOVUxMICl7CisJCURNRVNHKCJpb3JlbWFwIGZhaWxlZCEiKTsKKwkgICAgICAgLy8gcmVsZWFzZV9tZW1fcmVnaW9uKCBwbWVtX3N0YXJ0LCBwbWVtX2xlbiApOworCQlnb3RvIGZhaWwxOworCX0KKworCWRldi0+bWVtX3N0YXJ0ID0gaW9hZGRyOyAvLyBzaGFyZWQgbWVtIHN0YXJ0CisJZGV2LT5tZW1fZW5kID0gaW9hZGRyICsgcGNpX3Jlc291cmNlX2xlbihwZGV2LCAwKTsgLy8gc2hhcmVkIG1lbSBlbmQKKworI2VuZGlmIC8vZW5kICNpZmRlZiBSVExfSU9fTUFQCisKKyNpZmRlZiBDT05GSUdfUlRMODE4NUIKKwkvL3BjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIDB4MDUsIHB0cik7CisJLy9wY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgMHgwNSwgKCpwdHIpICYgKH4weDA0KSk7CisJcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgMHgwNSwgJnVuaXQpOworCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCAweDA1LCB1bml0ICYgKH4weDA0KSk7CisjZW5kaWYKKworCWRldi0+aXJxID0gcGRldi0+aXJxOworCXByaXYtPmlycSA9IDA7CisKKwlkZXYtPm9wZW4gPSBydGw4MTgwX29wZW47CisJZGV2LT5zdG9wID0gcnRsODE4MF9jbG9zZTsKKwkvL2Rldi0+aGFyZF9zdGFydF94bWl0ID0gaWVlZTgwMjExX3htaXQ7CisJZGV2LT50eF90aW1lb3V0ID0gcnRsODE4MF9yZXN0YXJ0OworCWRldi0+d2lyZWxlc3NfaGFuZGxlcnMgPSAmcjgxODBfd3hfaGFuZGxlcnNfZGVmOworCWRldi0+ZG9faW9jdGwgPSBydGw4MTgwX2lvY3RsOworCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gcjgxODBfc2V0X211bHRpY2FzdDsKKwlkZXYtPnNldF9tYWNfYWRkcmVzcyA9IHI4MTgwX3NldF9tYWNfYWRyOworCisjaWYgV0lSRUxFU1NfRVhUID49IDEyCisjaWYgV0lSRUxFU1NfRVhUIDwgMTcKKwlkZXYtPmdldF93aXJlbGVzc19zdGF0cyA9IHI4MTgwX2dldF93aXJlbGVzc19zdGF0czsKKyNlbmRpZgorCWRldi0+d2lyZWxlc3NfaGFuZGxlcnMgPSAoc3RydWN0IGl3X2hhbmRsZXJfZGVmICopICZyODE4MF93eF9oYW5kbGVyc19kZWY7CisjZW5kaWYKKworCWRldi0+dHlwZT1BUlBIUkRfRVRIRVI7CisJZGV2LT53YXRjaGRvZ190aW1lbyA9IEhaKjM7IC8vYWRkZWQgYnkgZGF2aWQgd29vLCAyMDA3LjEyLjEzCisKKwlpZiAoZGV2X2FsbG9jX25hbWUoZGV2LCBpZm5hbWUpIDwgMCl7CisgICAgICAgICAgICAgICAgRE1FU0coIk9vcHM6IGRldm5hbWUgYWxyZWFkeSB0YWtlbiEgVHJ5aW5nIHdsYW4lJWQuLi5cbiIpOworCQlpZm5hbWUgPSAid2xhbiVkIjsKKwkvLwlpZm5hbWUgPSAiYXRoJWQiOworCQlkZXZfYWxsb2NfbmFtZShkZXYsIGlmbmFtZSk7CisgICAgICAgIH0KKworCisJaWYocnRsODE4MF9pbml0KGRldikhPTApeworCQlETUVTRygiSW5pdGlhbGl6YXRpb24gZmFpbGVkIik7CisJCWdvdG8gZmFpbDE7CisJfQorCisJbmV0aWZfY2Fycmllcl9vZmYoZGV2KTsKKworCXJlZ2lzdGVyX25ldGRldihkZXYpOworCisJcnRsODE4MF9wcm9jX2luaXRfb25lKGRldik7CisKKwlETUVTRygiRHJpdmVyIHByb2JlIGNvbXBsZXRlZFxuIik7CisJcmV0dXJuIDA7CisKK2ZhaWwxOgorCisjaWZkZWYgQ09ORklHX1JUTDgxODBfSU9fTUFQCisKKwlpZiggZGV2LT5iYXNlX2FkZHIgIT0gMCApeworCisJCXJlbGVhc2VfcmVnaW9uKGRldi0+YmFzZV9hZGRyLAorCSAgICAgICBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDApICk7CisJfQorI2Vsc2UKKwlpZiggZGV2LT5tZW1fc3RhcnQgIT0gKHVuc2lnbmVkIGxvbmcpTlVMTCApeworCQlpb3VubWFwKCAodm9pZCAqKWRldi0+bWVtX3N0YXJ0ICk7CisJCXJlbGVhc2VfbWVtX3JlZ2lvbiggcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDEpLAorCQkJCSAgICBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDEpICk7CisJfQorI2VuZGlmIC8vZW5kICNpZmRlZiBSVExfSU9fTUFQCisKKworZmFpbDoKKwlpZihkZXYpeworCisJCWlmIChwcml2LT5pcnEpIHsKKwkJCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCQkJZGV2LT5pcnE9MDsKKwkJfQorCQlmcmVlX2llZWU4MDIxMShkZXYpOworCX0KKworCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKworCURNRVNHKCJ3bGFuIGRyaXZlciBsb2FkIGZhaWxlZFxuIik7CisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCXJldHVybiAtRU5PREVWOworCit9CisKKworc3RhdGljIHZvaWQgX19kZXZleGl0IHJ0bDgxODBfcGNpX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworIAlpZihkZXYpeworCisJCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CisKKwkJcHJpdj1pZWVlODAyMTFfcHJpdihkZXYpOworCisJCXJ0bDgxODBfcHJvY19yZW1vdmVfb25lKGRldik7CisJCXJ0bDgxODBfZG93bihkZXYpOworCQlwcml2LT5yZl9jbG9zZShkZXYpOworCQlydGw4MTgwX3Jlc2V0KGRldik7CisJCS8vcnRsODE4MF9ydHhfZGlzYWJsZShkZXYpOworCQkvL3J0bDgxODBfaXJxX2Rpc2FibGUoZGV2KTsKKwkJbWRlbGF5KDEwKTsKKwkJLy93cml0ZV9uaWNfd29yZChkZXYsSU5UQSxyZWFkX25pY193b3JkKGRldixJTlRBKSk7CisJCS8vZm9yY2VfcGNpX3Bvc3RpbmcoZGV2KTsKKwkJLy9tZGVsYXkoMTApOworCisJCWlmKHByaXYtPmlycSl7CisKKwkJCURNRVNHKCJGcmVlaW5nIGlycSAlZCIsZGV2LT5pcnEpOworCQkJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisJCQlwcml2LT5pcnE9MDsKKworCQl9CisKKwkJZnJlZV9yeF9kZXNjX3JpbmcoZGV2KTsKKwkJZnJlZV90eF9kZXNjX3JpbmdzKGRldik7CisJLy8JZnJlZV9iZWFjb25fZGVzY19yaW5nKGRldixwcml2LT50eGJlYWNvbmNvdW50KTsKKworI2lmZGVmIENPTkZJR19SVEw4MTgwX0lPX01BUAorCisJCWlmKCBkZXYtPmJhc2VfYWRkciAhPSAwICl7CisKKwkJCXJlbGVhc2VfcmVnaW9uKGRldi0+YmFzZV9hZGRyLAorCQkJCSAgICAgICBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDApICk7CisJCX0KKyNlbHNlCisJCWlmKCBkZXYtPm1lbV9zdGFydCAhPSAodW5zaWduZWQgbG9uZylOVUxMICl7CisJCQlpb3VubWFwKCAodm9pZCAqKWRldi0+bWVtX3N0YXJ0ICk7CisJCQlyZWxlYXNlX21lbV9yZWdpb24oIHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAxKSwKKwkJCQkJICAgIHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMSkgKTsKKwkJfQorI2VuZGlmIC8qZW5kICNpZmRlZiBSVExfSU9fTUFQKi8KKworCQlmcmVlX2llZWU4MDIxMShkZXYpOworCX0KKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisKKwlETUVTRygid2xhbiBkcml2ZXIgcmVtb3ZlZFxuIik7Cit9CisKKworLyogZnVuIHdpdGggdGhlIGJ1aWx0LWluIGllZWU4MDIxMSBzdGFjay4uLiAqLworZXh0ZXJuIGludCBpZWVlODAyMTFfY3J5cHRvX2luaXQodm9pZCk7CitleHRlcm4gdm9pZCBpZWVlODAyMTFfY3J5cHRvX2RlaW5pdCh2b2lkKTsKK2V4dGVybiBpbnQgaWVlZTgwMjExX2NyeXB0b190a2lwX2luaXQodm9pZCk7CitleHRlcm4gdm9pZCBpZWVlODAyMTFfY3J5cHRvX3RraXBfZXhpdCh2b2lkKTsKK2V4dGVybiBpbnQgaWVlZTgwMjExX2NyeXB0b19jY21wX2luaXQodm9pZCk7CitleHRlcm4gdm9pZCBpZWVlODAyMTFfY3J5cHRvX2NjbXBfZXhpdCh2b2lkKTsKK2V4dGVybiBpbnQgaWVlZTgwMjExX2NyeXB0b193ZXBfaW5pdCh2b2lkKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9jcnlwdG9fd2VwX2V4aXQodm9pZCk7CisKK3N0YXRpYyBpbnQgX19pbml0IHJ0bDgxODBfcGNpX21vZHVsZV9pbml0KHZvaWQpCit7CisJaW50IHJldDsKKworCXJldCA9IGllZWU4MDIxMV9jcnlwdG9faW5pdCgpOworCWlmIChyZXQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJpZWVlODAyMTFfY3J5cHRvX2luaXQoKSBmYWlsZWQgJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCXJldCA9IGllZWU4MDIxMV9jcnlwdG9fdGtpcF9pbml0KCk7CisJaWYgKHJldCkgeworCQlwcmludGsoS0VSTl9FUlIgImllZWU4MDIxMV9jcnlwdG9fdGtpcF9pbml0KCkgZmFpbGVkICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKwlyZXQgPSBpZWVlODAyMTFfY3J5cHRvX2NjbXBfaW5pdCgpOworCWlmIChyZXQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJpZWVlODAyMTFfY3J5cHRvX2NjbXBfaW5pdCgpIGZhaWxlZCAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisJcmV0ID0gaWVlZTgwMjExX2NyeXB0b193ZXBfaW5pdCgpOworCWlmIChyZXQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJpZWVlODAyMTFfY3J5cHRvX3dlcF9pbml0KCkgZmFpbGVkICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXByaW50ayhLRVJOX0lORk8gIlxuTGludXgga2VybmVsIGRyaXZlciBmb3IgUlRMODE4MCBcCisvIFJUTDgxODUgYmFzZWQgV0xBTiBjYXJkc1xuIik7CisJcHJpbnRrKEtFUk5fSU5GTyAiQ29weXJpZ2h0IChjKSAyMDA0LTIwMDUsIEFuZHJlYSBNZXJlbGxvXG4iKTsKKwlETUVTRygiSW5pdGlhbGl6aW5nIG1vZHVsZSIpOworCURNRVNHKCJXaXJlbGVzcyBleHRlbnNpb25zIHZlcnNpb24gJWQiLCBXSVJFTEVTU19FWFQpOworCXJ0bDgxODBfcHJvY19tb2R1bGVfaW5pdCgpOworCisjaWYoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDIyKSkKKyAgICAgIGlmKDAhPXBjaV9tb2R1bGVfaW5pdCgmcnRsODE4MF9wY2lfZHJpdmVyKSkKKyNlbHNlCisgICAgICBpZigwIT1wY2lfcmVnaXN0ZXJfZHJpdmVyKCZydGw4MTgwX3BjaV9kcml2ZXIpKQorI2VuZGlmCisJLy9pZigwIT1wY2lfbW9kdWxlX2luaXQoJnJ0bDgxODBfcGNpX2RyaXZlcikpCisJeworCQlETUVTRygiTm8gZGV2aWNlIGZvdW5kIik7CisJCS8qcGNpX3VucmVnaXN0ZXJfZHJpdmVyICgmcnRsODE4MF9wY2lfZHJpdmVyKTsqLworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHZvaWQgX19leGl0IHJ0bDgxODBfcGNpX21vZHVsZV9leGl0KHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyICgmcnRsODE4MF9wY2lfZHJpdmVyKTsKKwlydGw4MTgwX3Byb2NfbW9kdWxlX3JlbW92ZSgpOworCWllZWU4MDIxMV9jcnlwdG9fZGVpbml0KCk7CisJaWVlZTgwMjExX2NyeXB0b190a2lwX2V4aXQoKTsKKwlpZWVlODAyMTFfY3J5cHRvX2NjbXBfZXhpdCgpOworCWllZWU4MDIxMV9jcnlwdG9fd2VwX2V4aXQoKTsKKwlETUVTRygiRXhpdGluZyIpOworfQorCisKK3ZvaWQgcnRsODE4MF90cnlfd2FrZV9xdWV1ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcHJpKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc2hvcnQgZW5vdWdoX2Rlc2M7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTgwX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnR4X2xvY2ssZmxhZ3MpOworCWVub3VnaF9kZXNjID0gY2hlY2tfbmljX2Vub3VnaHRfZGVzYyhkZXYscHJpKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT50eF9sb2NrLGZsYWdzKTsKKworCWlmKGVub3VnaF9kZXNjKQorCQlpZWVlODAyMTFfd2FrZV9xdWV1ZShwcml2LT5pZWVlODAyMTEpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tSVJRIFNUVUZGLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgcnRsODE4MF90eF9pc3Ioc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHByaSxzaG9ydCBlcnJvcikKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxODBfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CisKKwl1MzIgKnRhaWw7IC8vdGFpbCB2aXJ0dWFsIGFkZHIKKwl1MzIgKmhlYWQ7IC8vaGVhZCB2aXJ0dWFsIGFkZHIKKwl1MzIgKmJlZ2luOy8vc3RhcnQgb2YgcmluZyB2aXJ0dWFsIGFkZHIKKwl1MzIgKm5pY3Y7IC8vbmljIHBvaW50ZXIgdmlydHVhbCBhZGRyCisvLwl1MzIgKnR4ZHY7IC8vcGFja2V0IGp1c3QgVFhlZAorCXUzMiBuaWM7IC8vbmljIHBvaW50ZXIgcGh5c2ljYWwgYWRkcgorCXUzMiBuaWNiZWdpbjsvLyBzdGFydCBvZiByaW5nIHBoeXNpY2FsIGFkZHIKKy8vCXNob3J0IHR4ZWQ7CisJdW5zaWduZWQgbG9uZyBmbGFnOworCS8qIHBoeXNpY2FsIGFkZHIgYXJlIG9rIG9uIDMyIGJpdHMgc2luY2Ugd2Ugc2V0IERNQSBtYXNrKi8KKworCWludCBvZmZzOworCWludCBqLGk7CisJaW50IGhkOworCWlmIChlcnJvcikgcHJpdi0+c3RhdHMudHhyZXRyeSsrOyAvL3RvbnkgMjAwNjA2MDEKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+dHhfbG9jayxmbGFnKTsKKwlzd2l0Y2gocHJpKSB7CisJY2FzZSBNQU5BR0VfUFJJT1JJVFk6CisJCXRhaWwgPSBwcml2LT50eG1hcHJpbmd0YWlsOworCQliZWdpbiA9IHByaXYtPnR4bWFwcmluZzsKKwkJaGVhZCA9IHByaXYtPnR4bWFwcmluZ2hlYWQ7CisJCW5pYyA9IHJlYWRfbmljX2R3b3JkKGRldixUWF9NQU5BR0VQUklPUklUWV9SSU5HX0FERFIpOworCQluaWNiZWdpbiA9IHByaXYtPnR4bWFwcmluZ2RtYTsKKwkJYnJlYWs7CisKKwljYXNlIEJLX1BSSU9SSVRZOgorCQl0YWlsID0gcHJpdi0+dHhia3ByaW5ndGFpbDsKKwkJYmVnaW4gPSBwcml2LT50eGJrcHJpbmc7CisJCWhlYWQgPSBwcml2LT50eGJrcHJpbmdoZWFkOworCQluaWMgPSByZWFkX25pY19kd29yZChkZXYsVFhfQktQUklPUklUWV9SSU5HX0FERFIpOworCQluaWNiZWdpbiA9IHByaXYtPnR4YmtwcmluZ2RtYTsKKwkJYnJlYWs7CisKKwljYXNlIEJFX1BSSU9SSVRZOgorCQl0YWlsID0gcHJpdi0+dHhiZXByaW5ndGFpbDsKKwkJYmVnaW4gPSBwcml2LT50eGJlcHJpbmc7CisJCWhlYWQgPSBwcml2LT50eGJlcHJpbmdoZWFkOworCQluaWMgPSByZWFkX25pY19kd29yZChkZXYsVFhfQkVQUklPUklUWV9SSU5HX0FERFIpOworCQluaWNiZWdpbiA9IHByaXYtPnR4YmVwcmluZ2RtYTsKKwkJYnJlYWs7CisKKwljYXNlIFZJX1BSSU9SSVRZOgorCQl0YWlsID0gcHJpdi0+dHh2aXByaW5ndGFpbDsKKwkJYmVnaW4gPSBwcml2LT50eHZpcHJpbmc7CisJCWhlYWQgPSBwcml2LT50eHZpcHJpbmdoZWFkOworCQluaWMgPSByZWFkX25pY19kd29yZChkZXYsVFhfVklQUklPUklUWV9SSU5HX0FERFIpOworCQluaWNiZWdpbiA9IHByaXYtPnR4dmlwcmluZ2RtYTsKKwkJYnJlYWs7CisKKwljYXNlIFZPX1BSSU9SSVRZOgorCQl0YWlsID0gcHJpdi0+dHh2b3ByaW5ndGFpbDsKKwkJYmVnaW4gPSBwcml2LT50eHZvcHJpbmc7CisJCWhlYWQgPSBwcml2LT50eHZvcHJpbmdoZWFkOworCQluaWMgPSByZWFkX25pY19kd29yZChkZXYsVFhfVk9QUklPUklUWV9SSU5HX0FERFIpOworCQluaWNiZWdpbiA9IHByaXYtPnR4dm9wcmluZ2RtYTsKKwkJYnJlYWs7CisKKwljYXNlIEhJX1BSSU9SSVRZOgorCQl0YWlsID0gcHJpdi0+dHhocHJpbmd0YWlsOworCQliZWdpbiA9IHByaXYtPnR4aHByaW5nOworCQloZWFkID0gcHJpdi0+dHhocHJpbmdoZWFkOworCQluaWMgPSByZWFkX25pY19kd29yZChkZXYsVFhfSElHSFBSSU9SSVRZX1JJTkdfQUREUik7CisJCW5pY2JlZ2luID0gcHJpdi0+dHhocHJpbmdkbWE7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+dHhfbG9jayxmbGFnKTsKKwkJcmV0dXJuIDsKKwl9CisvKglETUVTRygiJXggJXMgJXggJXgiLCgoaW50KW5pYyAmIDB4ZmZmKS84LzQsCisJKihwcml2LT50eG5wcmluZyArICgoaW50KW5pYyYweGZmZikvNC84KSAmICgxPDwzMSkgPyAiZmlsbGVkIiA6ICJlbXB0eSIsCisJKHByaXYtPnR4bnByaW5ndGFpbCAtIHByaXYtPnR4bnByaW5nKS84LChwcml2LT50eG5wcmluZ2hlYWQgLQorcHJpdi0+dHhucHJpbmcpLzgpOworKi8KKwkvL25pY3YgPSAodTMyKikgKChuaWMgLSBuaWNiZWdpbikgKyAoaW50KWJlZ2luKTsKKwluaWN2ID0gKHUzMiopICgobmljIC0gbmljYmVnaW4pICsgKHU4KiliZWdpbik7CisJaWYoKGhlYWQgPD0gdGFpbCAmJiAobmljdiA+IHRhaWwgfHwgbmljdiA8IGhlYWQpKSB8fAorCQkoaGVhZCA+IHRhaWwgJiYgKG5pY3YgPiB0YWlsICYmIG5pY3YgPCBoZWFkKSkpeworCisJCQlETUVTR1coIm5pYyBoYXMgbG9zdCBwb2ludGVyIik7CisjaWZkZWYgREVCVUdfVFhfREVTQworCQkJLy9jaGVja190eF9yaW5nKGRldixOT1JNX1BSSU9SSVRZKTsKKwkJCWNoZWNrX3R4X3JpbmcoZGV2LHByaSk7CisjZW5kaWYKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnR4X2xvY2ssZmxhZyk7CisJCQlydGw4MTgwX3Jlc3RhcnQoZGV2KTsKKwkJCXJldHVybjsKKwkJfQorCisJLyogd2UgY2hlY2sgYWxsIHRoZSBkZXNjcmlwdG9ycyBiZXR3ZWVuIHRoZSBoZWFkIGFuZCB0aGUgbmljLAorCSAqIGJ1dCBub3QgdGhlIGN1cnJlbmx5IHBvaW50ZWQgYnkgdGhlIG5pYyAodGhlIG5leHQgdG8gYmUgdHhlZCkKKwkgKiBhbmQgdGhlIHByZXZpb3VzIG9mIHRoZSBwb2ludGVkIChtaWdodCBiZSBpbiBwcm9jZXNzID8/KQorCSovCisJLy9pZiAoaGVhZCA9PSBuaWMpIHJldHVybjsKKwkvL0RNRVNHKCIleCAleCIsaGVhZCxuaWMpOworCW9mZnMgPSAobmljIC0gbmljYmVnaW4pOworCS8vRE1FU0coIiV4ICV4ICV4IixuaWMgLCh1MzIpbmljYmVnaW4sIChpbnQpbmljIC1uaWNiZWdpbik7CisKKwlvZmZzID0gb2ZmcyAvIDggLzQ7CisKKwloZCA9IChoZWFkIC0gYmVnaW4pIC84OworCisJaWYob2ZmcyA+PSBoZCkKKwkJaiA9IG9mZnMgLSBoZDsKKwllbHNlCisJCWogPSBvZmZzICsgKHByaXYtPnR4cmluZ2NvdW50IC0xIC1oZCk7CisJLy8Jaj0gcHJpdi0+dHhyaW5nY291bnQgLTEtIChoZCAtIG9mZnMpOworCisJai09MjsKKwlpZihqPDApIGo9MDsKKworCisJZm9yKGk9MDtpPGo7aSsrKQorCXsKKy8vCQlwcmludGsoIisrKysrKysrKysrKytjaGVjayBzdGF0dXMgZGVzY1xuIik7CisJCWlmKCgqaGVhZCkgJiAoMTw8MzEpKQorCQkJYnJlYWs7CisJCWlmKCgoKmhlYWQpJigweDEwMDAwMDAwKSkgIT0gMCl7CisvLwkJCXByaW50aygiKysrKysrKysrKysrKytsYXN0IGRlc2MscmV0cnkgY291bnQgaXMgJWRcbiIsKCgqaGVhZCkgJiAoMHgwMDAwMDBmZikpKTsKKwkJCXByaXYtPkN1cnJSZXRyeUNudCArPSAodTE2KSgoKmhlYWQpICYgKDB4MDAwMDAwZmYpKTsKKyNpZiAxCisJCQlpZighZXJyb3IpCisJCQl7CisJCQkJcHJpdi0+TnVtVHhPa1RvdGFsKys7CisvLwkJCQlwcmludGsoIk51bVR4T2tUb3RhbCBpcyAlZFxuIixwcml2LT5OdW1UeE9rVG90YWwrKyk7CisJCQl9CisjZW5kaWYKKwkJCS8vCXByaW50aygiaW4gZnVuY3Rpb24gJXM6Y3Vycl9yZXRyeV9jb3VudCBpcyAlZFxuIixfX2Z1bmNfXywoKCpoZWFkKSAmICgweDAwMDAwMGZmKSkpOworCQl9CisJCWlmKCFlcnJvcil7CisJCQlwcml2LT5OdW1UeE9rQnl0ZXNUb3RhbCArPSAoKihoZWFkKzMpKSAmICgweDAwMDAwZmZmKTsKKwkJfQorLy8JCXByaW50aygiaW4gZnVuY3Rpb24gJXM6Y3Vycl90eG9rYnl0ZV9jb3VudCBpcyAlZFxuIixfX2Z1bmNfXywoKihoZWFkKzMpKSAmICgweDAwMDAwZmZmKSk7CisJCSpoZWFkID0gKmhlYWQgJn4gKDE8PDMxKTsKKworCQlpZigoaGVhZCAtIGJlZ2luKS84ID09IHByaXYtPnR4cmluZ2NvdW50LTEpCisJCQloZWFkPWJlZ2luOworCisJCWVsc2UKKwkJCWhlYWQrPTg7CisJfQorI2lmIDAKKwlpZihuaWN2ID09IGJlZ2luKQorCQl0eGR2ID0gYmVnaW4gKyAocHJpdi0+dHhyaW5nY291bnQgLTEpKjg7CisJZWxzZQorCQl0eGR2ID0gbmljdiAtIDg7CisKKwl0eGVkID0gISh0eGR2WzBdICYoMTw8MzEpKTsKKworCWlmKHR4ZWQpeworCQlpZighKHR4ZHZbMF0gJiAoMTw8MTUpKSkgZXJyb3IgPSAxOworCQkvL2lmKCEodHhkdlswXSAmICgxPDwzMCkpKSBlcnJvciA9IDE7CisJCWlmKGVycm9yKURNRVNHKCIleCIsdHhkdlswXSk7CisgCX0KKyNlbmRpZgorCS8vRE1FU0coIiV4Iix0eGR2WzBdKTsKKwkvKiB0aGUgaGVhZCBoYXMgYmVlbiBtb3ZlZCB0byB0aGUgbGFzdCBjZXJ0YWlubHkgVFhlZAorCSAqIChvciBhdCBsZWFzdCBwcm9jZXNzZWQgYnkgdGhlIG5pYykgcGFja2V0LgorCSAqIFRoZSBkcml2ZXIgdGFrZSBmb3JjZWZ1bGx5IG93bmluZyBvZiBhbGwgdGhlc2UgcGFja2V0cworCSAqIElmIHRoZSBwYWNrZXQgcHJldmlvdXMgb2YgdGhlIG5pYyBwb2ludGVyIGhhcyBiZWVuCisJICogcHJvY2Vzc2VkIHRoaXMgZG9lc24ndCBtYXR0ZXI6IGl0IHdpbGwgYmUgY2hlY2tlZAorCSAqIGhlcmUgYXQgdGhlIG5leHQgcm91bmQuIEFueXdheSBpZiBubyBtb3JlIHBhY2tldCBhcmUKKwkgKiBUWGVkIG5vIG1lbW9yeSBsZWFrIG9jY291ciBhdCBhbGwuCisJICovCisKKwlzd2l0Y2gocHJpKSB7CisJY2FzZSBNQU5BR0VfUFJJT1JJVFk6CisJCXByaXYtPnR4bWFwcmluZ2hlYWQgPSBoZWFkOworCQkJLy9wcmludGsoIjE9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0+IHByaW9yaXR5IGNoZWNrIVxuIik7CisJCWlmKHByaXYtPmFja190eF90b19pZWVlKXsKKwkJCQkvLyB0cnkgdG8gaW1wbGVtZW50IHBvd2VyLXNhdmUgbW9kZSAyMDA4LjEuMjIKKwkJLy8JcHJpbnRrKCIyPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PiBwcmlvcml0eSBjaGVjayFcbiIpOworI2lmIDEKKwkJCWlmKHJ0bDgxODBfaXNfdHhfcXVldWVfZW1wdHkoZGV2KSl7CisJCQkvLwlwcmludGsoInR4IHF1ZXVlIGVtcHR5LCBhZnRlciBzZW5kIG51bGwgc2xlZXAgcGFja2V0LCB0cnkgdG8gc2xlZXAgIVxuIik7CisJCQkJcHJpdi0+YWNrX3R4X3RvX2llZWUgPSAwOworCQkJCWllZWU4MDIxMV9wc190eF9hY2socHJpdi0+aWVlZTgwMjExLCFlcnJvcik7CisJCQl9CisjZW5kaWYKKwkJfQorCQlicmVhazsKKworCWNhc2UgQktfUFJJT1JJVFk6CisJCXByaXYtPnR4YmtwcmluZ2hlYWQgPSBoZWFkOworCQlicmVhazsKKworCWNhc2UgQkVfUFJJT1JJVFk6CisJCXByaXYtPnR4YmVwcmluZ2hlYWQgPSBoZWFkOworCQlicmVhazsKKworCWNhc2UgVklfUFJJT1JJVFk6CisJCXByaXYtPnR4dmlwcmluZ2hlYWQgPSBoZWFkOworCQlicmVhazsKKworCWNhc2UgVk9fUFJJT1JJVFk6CisJCXByaXYtPnR4dm9wcmluZ2hlYWQgPSBoZWFkOworCQlicmVhazsKKworCWNhc2UgSElfUFJJT1JJVFk6CisJCXByaXYtPnR4aHByaW5naGVhZCA9IGhlYWQ7CisJCWJyZWFrOworCX0KKworCS8qRE1FU0coIiV4ICV4ICV4IiwgKHByaXYtPnR4bnByaW5naGVhZCAtIHByaXYtPnR4bnByaW5nKSAvOCAsCisJCShwcml2LT50eG5wcmluZ3RhaWwgLSBwcml2LT50eG5wcmluZykgLzgsCisJCW9mZnMgKTsKKwkqLworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+dHhfbG9jayxmbGFnKTsKKworfQorCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMjApKQordm9pZCBydGw4MTgwX3R4X2lycV93cShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJLy9zdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgcjgxODBfcHJpdiwgcmVzZXRfd3EpOworICAgICAgICBzdHJ1Y3QgZGVsYXllZF93b3JrICpkd29yayA9IGNvbnRhaW5lcl9vZih3b3JrLHN0cnVjdCBkZWxheWVkX3dvcmssd29yayk7CisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKiBpZWVlID0gKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKikKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXJfb2YoZHdvcmssIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlLCB3YXRjaF9kb2dfd3EpOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBpZWVlLT5kZXY7CisjZWxzZQordm9pZCBydGw4MTgwX3R4X2lycV93cShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCS8vc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworI2VuZGlmCisJcnRsODE4MF90eF9pc3IoZGV2LE1BTkFHRV9QUklPUklUWSwwKTsKK30KK2lycXJldHVybl90IHJ0bDgxODBfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKm5ldGRldiwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBuZXRkZXY7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTgwX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTMyIGludGE7CisKKwkvKiBXZSBzaG91bGQgcmV0dXJuIElSUV9OT05FLCBidXQgZm9yIG5vdyBsZXQgbWUga2VlcCB0aGlzICovCisJaWYocHJpdi0+aXJxX2VuYWJsZWQgPT0gMCkgcmV0dXJuIElSUV9IQU5ETEVEOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmlycV90aF9sb2NrLGZsYWdzKTsKKworI2lmZGVmIENPTkZJR19SVEw4MTg1QgorCS8vSVNSOiA0Ynl0ZXMKKwlpbnRhID0gcmVhZF9uaWNfZHdvcmQoZGV2LCBJU1IpOy8vICYgcHJpdi0+SW50ck1hc2s7CisJd3JpdGVfbmljX2R3b3JkKGRldixJU1IsaW50YSk7IC8vIHJlc2V0IGludCBzaXR1YXRpb24KKyNlbHNlCisJaW50YSA9IHJlYWRfbmljX3dvcmQoZGV2LElOVEEpICYgcHJpdi0+aXJxX21hc2s7CisJd3JpdGVfbmljX3dvcmQoZGV2LElOVEEsaW50YSk7IC8vIHJlc2V0IGludCBzaXR1YXRpb24KKyNlbmRpZgorCisJcHJpdi0+c3RhdHMuc2hpbnRzKys7CisKKwkvL0RNRVNHKCJFbnRlciBpbnRlcnJ1cHQsIElTUiB2YWx1ZSA9IDB4JTA4eCIsIGludGEpOworCisJaWYoIWludGEpeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5pcnFfdGhfbG9jayxmbGFncyk7CisJCXJldHVybiBJUlFfSEFORExFRDsKKwkvKgorCSAgIG1vc3QgcHJvYmFibHkgd2UgY2FuIHNhZmVseSByZXR1cm4gSVJRX05PTkUsCisJICAgYnV0IGZvciBub3cgaXMgYmV0dGVyIHRvIGF2b2lkIHByb2JsZW1zCisJKi8KKwl9CisKKwlpZihpbnRhID09IDB4ZmZmZil7CisJCQkvKiBIVyBkaXNhcHBhcmVkICovCisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5pcnFfdGhfbG9jayxmbGFncyk7CisJCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQorCisJcHJpdi0+c3RhdHMuaW50cysrOworI2lmZGVmIERFQlVHX0lSUQorCURNRVNHKCJOSUMgaXJxICV4IixpbnRhKTsKKyNlbmRpZgorCS8vcHJpdi0+aXJxcGVuZGluZyA9IGludGE7CisKKworCWlmKCFuZXRpZl9ydW5uaW5nKGRldikpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+aXJxX3RoX2xvY2ssZmxhZ3MpOworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQorCisJaWYoaW50YSAmIElTUl9UaW1lT3V0KXsKKwkJd3JpdGVfbmljX2R3b3JkKGRldiwgVGltZXJJbnQsIDApOworCQkvL0RNRVNHKCI9PT09PT09PT09PT09PT09PT53YWtpbmcgdXAiKTsKKy8vCQlydGw4MTgwX2h3X3dha2V1cChkZXYpOworCX0KKworCWlmKGludGEgJiBJU1JfVEJET0speworCQlwcml2LT5zdGF0cy50eGJlYWNvbisrOworCX0KKworCWlmKGludGEgJiBJU1JfVEJERVIpeworCQlwcml2LT5zdGF0cy50eGJlYWNvbmVycisrOworCX0KKworCWlmKGludGEgICYgSU1SX1RNR0RPSyApIHsKKy8vCQlwcml2LT5OdW1UeE9rVG90YWwrKzsKKwkJcnRsODE4MF90eF9pc3IoZGV2LE1BTkFHRV9QUklPUklUWSwwKTsKKy8vCQkJc2NoZWR1bGVfd29yaygmcHJpdi0+dHhfaXJxX3dxKTsKKworCX0KKworCWlmKGludGEgJiBJU1JfVEhQREVSKXsKKyNpZmRlZiBERUJVR19UWAorCQlETUVTRyAoIlRYIGhpZ2ggcHJpb3JpdHkgRVJSIik7CisjZW5kaWYKKwkJcHJpdi0+c3RhdHMudHhocGVycisrOworCQlydGw4MTgwX3R4X2lzcihkZXYsSElfUFJJT1JJVFksMSk7CisJCXByaXYtPmllZWU4MDIxMS0+c3RhdHMudHhfZXJyb3JzKys7CisJfQorCisJaWYoaW50YSAmIElTUl9USFBET0speyAvL0hpZ2ggcHJpb3JpdHkgdHggb2sKKyNpZmRlZiBERUJVR19UWAorCQlETUVTRyAoIlRYIGhpZ2ggcHJpb3JpdHkgT0siKTsKKyNlbmRpZgorLy8JCXByaXYtPk51bVR4T2tUb3RhbCsrOworCQkvL3ByaXYtPk51bVR4T2tJblBlcmlvZCsrOyAgLy9ZSixkZWwsMDgwODI4CisJCXByaXYtPmxpbmtfZGV0ZWN0Lk51bVR4T2tJblBlcmlvZCsrOyAvL1lKLGFkZCwwODA4MjgKKwkJcHJpdi0+c3RhdHMudHhocG9raW50Kys7CisJCXJ0bDgxODBfdHhfaXNyKGRldixISV9QUklPUklUWSwwKTsKKwl9CisKKwlpZihpbnRhICYgSVNSX1JFUikgeworCQlwcml2LT5zdGF0cy5yeGVycisrOworI2lmZGVmIERFQlVHX1JYCisJCURNRVNHVygiUlggZXJyb3IgaW50Iik7CisjZW5kaWYKKwl9CisjaWZkZWYgQ09ORklHX1JUTDgxODVCCisJaWYoaW50YSAmIElTUl9UQktERVIpeyAvL2NvcnJlc3BvbmRpbmcgdG8gQktfUFJJT1JJVFkKKwkJcHJpdi0+c3RhdHMudHhia3BlcnIrKzsKKwkJcHJpdi0+aWVlZTgwMjExLT5zdGF0cy50eF9lcnJvcnMrKzsKKyNpZmRlZiBERUJVR19UWAorCQlETUVTR1coIlRYIGJrcCBlcnJvciBpbnQiKTsKKyNlbmRpZgorCQkvL3Rhc2tsZXRfc2NoZWR1bGUoJnByaXYtPmlycV90eF90YXNrbGV0KTsKKwkJcnRsODE4MF90eF9pc3IoZGV2LEJLX1BSSU9SSVRZLDEpOworCQlydGw4MTgwX3RyeV93YWtlX3F1ZXVlKGRldiwgQkVfUFJJT1JJVFkpOworCX0KKworCWlmKGludGEgJiBJU1JfVEJFREVSKXsgLy9jb3JyZXNwb25kaW5nIHRvIEJFX1BSSU9SSVRZCisJCXByaXYtPnN0YXRzLnR4YmVwZXJyKys7CisJCXByaXYtPmllZWU4MDIxMS0+c3RhdHMudHhfZXJyb3JzKys7CisjaWZkZWYgREVCVUdfVFgKKwkJRE1FU0dXKCJUWCBiZXAgZXJyb3IgaW50Iik7CisjZW5kaWYKKwkJcnRsODE4MF90eF9pc3IoZGV2LEJFX1BSSU9SSVRZLDEpOworCQkvL3Rhc2tsZXRfc2NoZWR1bGUoJnByaXYtPmlycV90eF90YXNrbGV0KTsKKwkJcnRsODE4MF90cnlfd2FrZV9xdWV1ZShkZXYsIEJFX1BSSU9SSVRZKTsKKwl9CisjZW5kaWYKKwlpZihpbnRhICYgSVNSX1ROUERFUil7IC8vY29ycmVzcG9uZGluZyB0byBWT19QUklPUklUWQorCQlwcml2LT5zdGF0cy50eG5wZXJyKys7CisJCXByaXYtPmllZWU4MDIxMS0+c3RhdHMudHhfZXJyb3JzKys7CisjaWZkZWYgREVCVUdfVFgKKwkJRE1FU0dXKCJUWCBucCBlcnJvciBpbnQiKTsKKyNlbmRpZgorCQkvL3Rhc2tsZXRfc2NoZWR1bGUoJnByaXYtPmlycV90eF90YXNrbGV0KTsKKwkJcnRsODE4MF90eF9pc3IoZGV2LE5PUk1fUFJJT1JJVFksMSk7CisjaWZkZWYgQ09ORklHX1JUTDgxODVCCisJCXJ0bDgxODBfdHJ5X3dha2VfcXVldWUoZGV2LCBOT1JNX1BSSU9SSVRZKTsKKyNlbmRpZgorCX0KKworCWlmKGludGEgJiBJU1JfVExQREVSKXsgLy9jb3JyZXNwb25kaW5nIHRvIFZJX1BSSU9SSVRZCisJCXByaXYtPnN0YXRzLnR4bHBlcnIrKzsKKwkJcHJpdi0+aWVlZTgwMjExLT5zdGF0cy50eF9lcnJvcnMrKzsKKyNpZmRlZiBERUJVR19UWAorCQlETUVTR1coIlRYIGxwIGVycm9yIGludCIpOworI2VuZGlmCisJCXJ0bDgxODBfdHhfaXNyKGRldixMT1dfUFJJT1JJVFksMSk7CisJCS8vdGFza2xldF9zY2hlZHVsZSgmcHJpdi0+aXJxX3R4X3Rhc2tsZXQpOworCQlydGw4MTgwX3RyeV93YWtlX3F1ZXVlKGRldiwgTE9XX1BSSU9SSVRZKTsKKwl9CisKKwlpZihpbnRhICYgSVNSX1JPSyl7CisjaWZkZWYgREVCVUdfUlgKKwkJRE1FU0coIkZyYW1lIGFycml2ZWQgISIpOworI2VuZGlmCisJCS8vcHJpdi0+TnVtUnhPa0luUGVyaW9kKys7ICAvL1lKLGRlbCwwODA4MjgKKwkJcHJpdi0+c3RhdHMucnhpbnQrKzsKKwkJdGFza2xldF9zY2hlZHVsZSgmcHJpdi0+aXJxX3J4X3Rhc2tsZXQpOworCX0KKworCWlmKGludGEgJiBJU1JfUlFvU09LICl7CisjaWZkZWYgREVCVUdfUlgKKwkJRE1FU0coIlFvUyBGcmFtZSBhcnJpdmVkICEiKTsKKyNlbmRpZgorCQkvL3ByaXYtPk51bVJ4T2tJblBlcmlvZCsrOyAgLy9ZSixkZWwsMDgwODI4CisJCXByaXYtPnN0YXRzLnJ4aW50Kys7CisJCXRhc2tsZXRfc2NoZWR1bGUoJnByaXYtPmlycV9yeF90YXNrbGV0KTsKKwl9CisJaWYoaW50YSAmIElTUl9CY25JbnQpIHsKKwkJLy9ETUVTRygiUHJlcGFyaW5nIEJlYWNvbnMiKTsKKwkJcnRsODE4MF9wcmVwYXJlX2JlYWNvbihkZXYpOworCX0KKworCWlmKGludGEgJiBJU1JfUkRVKXsKKy8vI2lmZGVmIERFQlVHX1JYCisJCURNRVNHVygiTm8gUlggZGVzY3JpcHRvciBhdmFpbGFibGUiKTsKKwkJcHJpdi0+c3RhdHMucnhyZHUrKzsKKy8vI2VuZGlmCisJCXRhc2tsZXRfc2NoZWR1bGUoJnByaXYtPmlycV9yeF90YXNrbGV0KTsKKwkJLypxdWV1ZV93b3JrKHByaXYtPndvcmtxdWV1ZSAsJnByaXYtPnJlc3RhcnRfd29yayk7Ki8KKworCX0KKwlpZihpbnRhICYgSVNSX1JYRk9WVyl7CisjaWZkZWYgREVCVUdfUlgKKwkJRE1FU0dXKCJSWCBmaWZvIG92ZXJmbG93Iik7CisjZW5kaWYKKwkJcHJpdi0+c3RhdHMucnhvdmVyZmxvdysrOworCQl0YXNrbGV0X3NjaGVkdWxlKCZwcml2LT5pcnFfcnhfdGFza2xldCk7CisJCS8vcXVldWVfd29yayhwcml2LT53b3JrcXVldWUgLCZwcml2LT5yZXN0YXJ0X3dvcmspOworCX0KKworCWlmKGludGEgJiBJU1JfVFhGT1ZXKSBwcml2LT5zdGF0cy50eG92ZXJmbG93Kys7CisKKwlpZihpbnRhICYgSVNSX1ROUERPSyl7IC8vTm9ybWFsIHByaW9yaXR5IHR4IG9rCisjaWZkZWYgREVCVUdfVFgKKwkJRE1FU0cgKCJUWCBub3JtYWwgcHJpb3JpdHkgT0siKTsKKyNlbmRpZgorLy8JCXByaXYtPk51bVR4T2tUb3RhbCsrOworCQkvL3ByaXYtPk51bVR4T2tJblBlcmlvZCsrOyAgLy9ZSixkZWwsMDgwODI4CisJCXByaXYtPmxpbmtfZGV0ZWN0Lk51bVR4T2tJblBlcmlvZCsrOyAvL1lKLGFkZCwwODA4MjgKKwkJLy8JcHJpdi0+aWVlZTgwMjExLT5zdGF0cy50eF9wYWNrZXRzKys7CisJCXByaXYtPnN0YXRzLnR4bnBva2ludCsrOworCQlydGw4MTgwX3R4X2lzcihkZXYsTk9STV9QUklPUklUWSwwKTsKKwl9CisKKwlpZihpbnRhICYgSVNSX1RMUERPSyl7IC8vTG93IHByaW9yaXR5IHR4IG9rCisjaWZkZWYgREVCVUdfVFgKKwkJRE1FU0cgKCJUWCBsb3cgcHJpb3JpdHkgT0siKTsKKyNlbmRpZgorLy8JCXByaXYtPk51bVR4T2tUb3RhbCsrOworCQkvL3ByaXYtPk51bVR4T2tJblBlcmlvZCsrOyAgLy9ZSixkZWwsMDgwODI4CisJCXByaXYtPmxpbmtfZGV0ZWN0Lk51bVR4T2tJblBlcmlvZCsrOyAvL1lKLGFkZCwwODA4MjgKKwkJLy8JcHJpdi0+aWVlZTgwMjExLT5zdGF0cy50eF9wYWNrZXRzKys7CisJCXByaXYtPnN0YXRzLnR4bHBva2ludCsrOworCQlydGw4MTgwX3R4X2lzcihkZXYsTE9XX1BSSU9SSVRZLDApOworCQlydGw4MTgwX3RyeV93YWtlX3F1ZXVlKGRldiwgTE9XX1BSSU9SSVRZKTsKKwl9CisKKyNpZmRlZiBDT05GSUdfUlRMODE4NUIKKwlpZihpbnRhICYgSVNSX1RCS0RPSyl7IC8vY29ycmVzcG9uZGluZyB0byBCS19QUklPUklUWQorCQlwcml2LT5zdGF0cy50eGJrcG9raW50Kys7CisjaWZkZWYgREVCVUdfVFgKKwkJRE1FU0dXKCJUWCBiayBwcmlvcml0eSBvayIpOworI2VuZGlmCisvLwkJcHJpdi0+TnVtVHhPa1RvdGFsKys7CisJCS8vcHJpdi0+TnVtVHhPa0luUGVyaW9kKys7ICAvL1lKLGRlbCwwODA4MjgKKwkJcHJpdi0+bGlua19kZXRlY3QuTnVtVHhPa0luUGVyaW9kKys7IC8vWUosYWRkLDA4MDgyOAorCQlydGw4MTgwX3R4X2lzcihkZXYsQktfUFJJT1JJVFksMCk7CisJCXJ0bDgxODBfdHJ5X3dha2VfcXVldWUoZGV2LCBCRV9QUklPUklUWSk7CisJfQorCisJaWYoaW50YSAmIElTUl9UQkVET0speyAvL2NvcnJlc3BvbmRpbmcgdG8gQkVfUFJJT1JJVFkKKwkJcHJpdi0+c3RhdHMudHhiZXBlcnIrKzsKKyNpZmRlZiBERUJVR19UWAorCQlETUVTR1coIlRYIGJlIHByaW9yaXR5IG9rIik7CisjZW5kaWYKKy8vCQlwcml2LT5OdW1UeE9rVG90YWwrKzsKKwkJLy9wcml2LT5OdW1UeE9rSW5QZXJpb2QrKzsgIC8vWUosZGVsLDA4MDgyOAorCQlwcml2LT5saW5rX2RldGVjdC5OdW1UeE9rSW5QZXJpb2QrKzsgLy9ZSixhZGQsMDgwODI4CisJCXJ0bDgxODBfdHhfaXNyKGRldixCRV9QUklPUklUWSwwKTsKKwkJcnRsODE4MF90cnlfd2FrZV9xdWV1ZShkZXYsIEJFX1BSSU9SSVRZKTsKKwl9CisjZW5kaWYKKwlmb3JjZV9wY2lfcG9zdGluZyhkZXYpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmlycV90aF9sb2NrLGZsYWdzKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworCit2b2lkIHJ0bDgxODBfaXJxX3J4X3Rhc2tsZXQoc3RydWN0IHI4MTgwX3ByaXYqIHByaXYpCit7CisvLwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisvKglzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+aXJxX2xvY2ssIGZsYWdzKTsKKwlwcml2LT5pcnFfbWFzayAmPX5JTVJfUk9LOworCXByaXYtPmlycV9tYXNrICY9fklNUl9SRFU7CisKKwlydGw4MTgwX2lycV9lbmFibGUocHJpdi0+ZGV2KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5pcnFfbG9jaywgZmxhZ3MpOworKi8KKwlydGw4MTgwX3J4KHByaXYtPmRldik7CisKKy8qCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5pcnFfbG9jaywgZmxhZ3MpOworCXByaXYtPmlycV9tYXNrIHw9IElNUl9ST0s7CisJcHJpdi0+aXJxX21hc2sgfD0gSU1SX1JEVTsKKwlydGw4MTgwX2lycV9lbmFibGUocHJpdi0+ZGV2KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5pcnFfbG9jaywgZmxhZ3MpOworKi8KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK2xpemhhb21pbmctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUkYgcG93ZXIgb24vcG93ZXIgb2ZmIC0tLS0tLS0tLS0tLS0tLS0tCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDIwKSkKK3ZvaWQgR1BJT0NoYW5nZVJGV29ya0l0ZW1DYWxsQmFjayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJLy9zdHJ1Y3QgZGVsYXllZF93b3JrICpkd29yayA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgZGVsYXllZF93b3JrLCB3b3JrKTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSwgR1BJT0NoYW5nZVJGV29ya0l0ZW0ud29yayk7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGllZWUtPmRldjsKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisjZWxzZQordm9pZCBHUElPQ2hhbmdlUkZXb3JrSXRlbUNhbGxCYWNrKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBpZWVlLT5kZXY7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworI2VuZGlmCisKKwkvL3UxNiB0bXAyYnl0ZTsKKwl1OCBidFBTUjsKKwl1OCBidENvbmZpZzA7CisJUlRfUkZfUE9XRVJfU1RBVEUJZVJmUG93ZXJTdGF0ZVRvU2V0OworCWJvb2wgCWJBY3R1YWxseVNldD1mYWxzZTsKKworCWNoYXIgKmFyZ3ZbM107CisgICAgICAgIHN0YXRpYyBjaGFyICpSYWRpb1Bvd2VyUGF0aCA9ICIvZXRjL2FjcGkvZXZlbnRzL1JhZGlvUG93ZXIuc2giOworICAgICAgICBzdGF0aWMgY2hhciAqZW52cFtdID0geyJIT01FPS8iLCAiVEVSTT1saW51eCIsICJQQVRIPS91c3IvYmluOi9iaW4iLCBOVUxMfTsKKwlzdGF0aWMgaW50IHJlYWRmX2NvdW50ID0gMDsKKwkvL3ByaW50aygiPT09PT09PT09PT09PiVzIGluIFxuIiwgX19mdW5jX18pOworCisjaWZkZWYgRU5BQkxFX0xQUworCWlmKHJlYWRmX2NvdW50ICUgMTAgPT0gMCkKKwkJcHJpdi0+UG93ZXJQcm9maWxlID0gcmVhZF9hY2FkYXB0ZXJfZmlsZSgiL3Byb2MvYWNwaS9hY19hZGFwdGVyL0FDMC9zdGF0ZSIpOworCisJcmVhZGZfY291bnQgPSAocmVhZGZfY291bnQrMSklMHhmZmZmOworI2VuZGlmCisjaWYgMAorCWlmKHByaXYtPnVwID09IDApLy9kcml2ZXIgc3RvcHBlZAorCQl7CisJCQlwcmludGsoIlxuRG8gbm90aGluZy4uLiIpOworCQkJZ290byBvdXQ7CisJCX0KKwllbHNlCisjZW5kaWYKKwkJeworCQkJLy8gV2Ugc2hvdWxkIHR1cm4gb2ZmIExFRCBiZWZvcmUgcG9sbGluZyBGRjUxWzRdLgorCisJCQkvL1R1cm4gb2ZmIExFRC4KKwkJCWJ0UFNSID0gcmVhZF9uaWNfYnl0ZShkZXYsIFBTUik7CisJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIFBTUiwgKGJ0UFNSICYgfkJJVDMpKTsKKworCQkJLy9JdCBuZWVkIHRvIGRlbGF5IDR1cyBzdWdnZXN0ZWQgYnkgSm9uZywgMjAwOC0wMS0xNgorCQkJdWRlbGF5KDQpOworCisJCQkvL0hXIHJhZGlvIE9uL09mZiBhY2NvcmRpbmcgdG8gdGhlIHZhbHVlIG9mIEZGNTFbNF0oY29uZmlnMCkKKwkJCWJ0Q29uZmlnMCA9IGJ0UFNSID0gcmVhZF9uaWNfYnl0ZShkZXYsIENPTkZJRzApOworCisJCQkvL1R1cm4gb24gTEVELgorCQkJd3JpdGVfbmljX2J5dGUoZGV2LCBQU1IsIGJ0UFNSfCBCSVQzKTsKKworCQkJZVJmUG93ZXJTdGF0ZVRvU2V0ID0gKGJ0Q29uZmlnMCAmIEJJVDQpID8gIGVSZk9uIDogZVJmT2ZmOworCisJCQlpZigocHJpdi0+aWVlZTgwMjExLT5iSHdSYWRpb09mZiA9PSB0cnVlKSAmJiAoZVJmUG93ZXJTdGF0ZVRvU2V0ID09IGVSZk9uKSkKKwkJCXsKKwkJCQlwcml2LT5pZWVlODAyMTEtPmJId1JhZGlvT2ZmID0gZmFsc2U7CisJCQkJYkFjdHVhbGx5U2V0ID0gdHJ1ZTsKKwkJCX0KKwkJCWVsc2UgaWYoKHByaXYtPmllZWU4MDIxMS0+Ykh3UmFkaW9PZmYgPT0gZmFsc2UpICYmIChlUmZQb3dlclN0YXRlVG9TZXQgPT0gZVJmT2ZmKSkKKwkJCXsKKwkJCQlwcml2LT5pZWVlODAyMTEtPmJId1JhZGlvT2ZmID0gdHJ1ZTsKKwkJCQliQWN0dWFsbHlTZXQgPSB0cnVlOworCQkJfQorCisJCQlpZihiQWN0dWFsbHlTZXQpCisJCQl7CisJCQkJTWdudEFjdFNldF9SRl9TdGF0ZShkZXYsIGVSZlBvd2VyU3RhdGVUb1NldCwgUkZfQ0hBTkdFX0JZX0hXKTsKKworCQkJCS8qIFRvIHVwZGF0ZSB0aGUgVUkgc3RhdHVzIGZvciBQb3dlciBzdGF0dXMgY2hhbmdlZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihwcml2LT5pZWVlODAyMTEtPmJId1JhZGlvT2ZmID09IHRydWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJndlsxXSA9ICJSRk9GRiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2V7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9pZighcHJpdi0+UmZPZmZSZWFzb24pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmd2WzFdID0gIlJGT04iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgYXJndlsxXSA9ICJSRk9GRiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJndlswXSA9IFJhZGlvUG93ZXJQYXRoOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmd2WzJdID0gTlVMTDsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsX3VzZXJtb2RlaGVscGVyKFJhZGlvUG93ZXJQYXRoLGFyZ3YsZW52cCwxKTsKKwkJCX0KKworCQl9CisKK30KKworc3RhdGljIHU4IHJlYWRfYWNhZGFwdGVyX2ZpbGUoY2hhciAqZmlsZW5hbWUpCit7CisvLyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwyMSkpCisjaWYgMAorCWludCBmZDsKKwljaGFyIGJ1ZlsxXTsKKwljaGFyIHJldFs1MF07CisJaW50IGkgPSAwOworCWludCBuID0gMDsKKwltbV9zZWdtZW50X3Qgb2xkX2ZzID0gZ2V0X2ZzKCk7CisJc2V0X2ZzKEtFUk5FTF9EUyk7CisKKwlmZCA9IHN5c19vcGVuKGZpbGVuYW1lLCBPX1JET05MWSwgMCk7CisJaWYgKGZkID49IDApIHsKKwkJd2hpbGUgKHN5c19yZWFkKGZkLCBidWYsIDEpID09IDEpCisJCXsKKwkJCWkrKzsKKwkJCWlmKGk+MTApCisJCQl7CisJCQkJaWYoYnVmWzBdIT0nICcpCisJCQkJeworCQkJCQlyZXRbbl09YnVmWzBdOworCQkJCQluKys7CisJCQkJfQorCQkJfQorCQl9CisJCXN5c19jbG9zZShmZCk7CisJfQorCXJldFtuXT0nXDAnOworLy8JcHJpbnRrKCIlcyBcbiIsIHJldCk7CisJc2V0X2ZzKG9sZF9mcyk7CisKKwlpZihzdHJuY21wKHJldCwgIm9mZi1saW5lIiw4KSA9PSAwKQorCXsKKwkJcmV0dXJuIDE7CisJfQorI2VuZGlmCisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLSBtb2R1bGUgaW5pdCAvIGV4aXQgc3R1YnMgLS0tLS0tLS0tLS0tLS0tLQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK21vZHVsZV9pbml0KHJ0bDgxODBfcGNpX21vZHVsZV9pbml0KTsKK21vZHVsZV9leGl0KHJ0bDgxODBfcGNpX21vZHVsZV9leGl0KTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MF9kbS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MF9kbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0MmRjMTEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwX2RtLmMKQEAgLTAsMCArMSwxNzI1IEBACisvLyNpbmNsdWRlICJyODE4MC5oIg0KKyNpbmNsdWRlICJyODE4MF9kbS5oIg0KKyNpbmNsdWRlICJyODE4MF9ody5oIg0KKyNpbmNsdWRlICJyODE4MF85M2N4Ni5oIg0KKy8ve2J5IGFteSAwODAzMTINCisNCisvLw0KKy8vCURlc2NyaXB0aW9uOg0KKy8vCQlSZXR1cm4gVFJVRSBpZiB3ZSBzaGFsbCBwZXJmb3JtIEhpZ2ggUG93ZXIgTWVjYWhuaXNtLCBGQUxTRSBvdGhlcndpc2UuCQ0KKy8vDQorLy8rYnkgYW15IDA4MDMxMg0KKyNkZWZpbmUgUkFURV9BREFQVElWRV9USU1FUl9QRVJJT0QgICAgICAzMDANCisNCitib29sIENoZWNrSGlnaFBvd2VyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpDQorew0KKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7DQorCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlID0gcHJpdi0+aWVlZTgwMjExOw0KKw0KKwlpZighcHJpdi0+YlJlZ0hpZ2hQb3dlck1lY2hhbmlzbSkNCisJew0KKwkJcmV0dXJuIGZhbHNlOw0KKwl9DQorCQkNCisJaWYoaWVlZS0+c3RhdGUgPT0gSUVFRTgwMjExX0xJTktFRF9TQ0FOTklORykNCisJew0KKwkJcmV0dXJuIGZhbHNlOw0KKwl9DQorDQorCXJldHVybiB0cnVlOw0KK30NCisNCisvLw0KKy8vCURlc2NyaXB0aW9uOg0KKy8vCQlVcGRhdGUgVHggcG93ZXIgbGV2ZWwgaWYgbmVjZXNzYXJ5Lg0KKy8vCQlTZWUgYWxzbyBEb1J4SGlnaFBvd2VyKCkgYW5kIFNldFR4UG93ZXJMZXZlbDgxODUoKSBmb3IgcmVmZXJlbmNlLg0KKy8vDQorLy8JTm90ZToNCisvLwkJVGhlIHJlYXNvbiB3aHkgd2UgdWRwYXRlIFR4IHBvd2VyIGxldmVsIGhlcmUgaW5zdGVhZCBvZiBEb1J4SGlnaFBvd2VyKCkgDQorLy8JCWlzIHRoZSBudW1iZXIgb2YgSU8gdG8gY2hhbmdlIFR4IHBvd2VyIGlzIG11Y2ggbW9yZSB0aGFuIGNoYW5lIFRSIHN3aXRjaCANCisvLwkJYW5kIHRoZXkgYXJlIHJlbGF0ZWQgdG8gT0ZETSBhbmQgTUFDIHJlZ2lzdGVycy4gDQorLy8JCVNvLCB3ZSBkb24ndCB3YW50IHRvIHVwZGF0ZSBpdCBzbyBmcmVxdWVudGx5IGluIHBlci1SeCBwYWNrZXQgYmFzZS4gDQorLy8NCit2b2lkDQorRG9UeEhpZ2hQb3dlcigNCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldg0KKwkpDQorew0KKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7DQorCXUxNgkJCUhpUHdyVXBwZXJUaCA9IDA7DQorCXUxNgkJCUhpUHdyTG93ZXJUaCA9IDA7DQorCXU4CQkJUlNTSUhpUHdyVXBwZXJUaDsNCisJdTgJCQlSU1NJSGlQd3JMb3dlclRoOw0KKwl1OAkJCXUxYlRtcDsNCisJY2hhcgkJCU9mZG1UeFB3cklkeCwgQ2NrVHhQd3JJZHg7DQorDQorCS8vcHJpbnRrKCItLS0tPiBEb1R4SGlnaFBvd2VyKClcbiIpOw0KKw0KKwlIaVB3clVwcGVyVGggPSBwcml2LT5SZWdIaVB3clVwcGVyVGg7DQorCUhpUHdyTG93ZXJUaCA9IHByaXYtPlJlZ0hpUHdyTG93ZXJUaDsJCQkJCQkNCisJDQorCUhpUHdyVXBwZXJUaCA9IEhpUHdyVXBwZXJUaCAqIDEwOw0KKwlIaVB3ckxvd2VyVGggPSBIaVB3ckxvd2VyVGggKiAxMDsNCisJUlNTSUhpUHdyVXBwZXJUaCA9IHByaXYtPlJlZ1JTU0lIaVB3clVwcGVyVGg7DQorCVJTU0lIaVB3ckxvd2VyVGggPSBwcml2LT5SZWdSU1NJSGlQd3JMb3dlclRoOw0KKw0KKwkvL2x6bSBhZGQgMDgwODI2DQorCU9mZG1UeFB3cklkeCAgPSBwcml2LT5jaHR4cHdyX29mZG1bcHJpdi0+aWVlZTgwMjExLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbF07IA0KKwlDY2tUeFB3cklkeCAgPSBwcml2LT5jaHR4cHdyW3ByaXYtPmllZWU4MDIxMS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWxdOyANCisNCisJLy8JcHJpbnRrKCJEb1R4SGlnaFBvd2VyKCkgLSBVbmRlY29yYXRlZFNtb290aGVkU1M6JWQsIEN1ckNDS1JTU0kgPSAlZCAsIGJDdXJDQ0tQa3Q9ICVkIFxuIiwgcHJpdi0+VW5kZWNvcmF0ZWRTbW9vdGhlZFNTLCBwcml2LT5DdXJDQ0tSU1NJLCBwcml2LT5iQ3VyQ0NLUGt0ICk7DQorCQ0KKwlpZigocHJpdi0+VW5kZWNvcmF0ZWRTbW9vdGhlZFNTID4gSGlQd3JVcHBlclRoKSB8fA0KKwkJKHByaXYtPmJDdXJDQ0tQa3QgJiYgKHByaXYtPkN1ckNDS1JTU0kgPiBSU1NJSGlQd3JVcHBlclRoKSkpDQorCXsNCisJCS8vIFN0ZXZlbmwgc3VnZ2VzdGVkIHRoYXQgZGVncmFkZSA4ZGJtIGluIGhpZ2ggcG93ZXIgc2F0ZS4gMjAwNy0xMi0wNCBJc2FpYWggDQorCQkNCisJLy8JcHJpbnRrKCI9PT09PT5Eb1R4SGlnaFBvd2VyKCkgLSBIaWdoIFBvd2VyIC0gVW5kZWNvcmF0ZWRTbW9vdGhlZFNTOiVkLCAgSGlQd3JVcHBlclRoID0gJWQgXG4iLCBwcml2LT5VbmRlY29yYXRlZFNtb290aGVkU1MsIEhpUHdyVXBwZXJUaCApOw0KKwkJcHJpdi0+YlRvVXBkYXRlVHhQd3IgPSB0cnVlOw0KKwkJdTFiVG1wPSByZWFkX25pY19ieXRlKGRldiwgQ0NLX1RYQUdDKTsNCisNCisJCS8vIElmIGl0IG5ldmVyIGVudGVyIEhpZ2ggUG93ZXIuDQorCQlpZiggQ2NrVHhQd3JJZHggPT0gdTFiVG1wKQ0KKwkJew0KKwkJdTFiVG1wID0gKHUxYlRtcCA+IDE2KSA/ICh1MWJUbXAgLTE2KTogMDsgIC8vIDhkYm0NCisJCXdyaXRlX25pY19ieXRlKGRldiwgQ0NLX1RYQUdDLCB1MWJUbXApOw0KKw0KKwkJdTFiVG1wPSByZWFkX25pY19ieXRlKGRldiwgT0ZETV9UWEFHQyk7DQorCQl1MWJUbXAgPSAodTFiVG1wID4gMTYpID8gKHUxYlRtcCAtMTYpOiAwOyAgLy8gOGRibQ0KKwkJd3JpdGVfbmljX2J5dGUoZGV2LCBPRkRNX1RYQUdDLCB1MWJUbXApOw0KKwkJfQ0KKwkJDQorCX0NCisJZWxzZSBpZigocHJpdi0+VW5kZWNvcmF0ZWRTbW9vdGhlZFNTIDwgSGlQd3JMb3dlclRoKSAmJg0KKwkJKCFwcml2LT5iQ3VyQ0NLUGt0IHx8IHByaXYtPkN1ckNDS1JTU0kgPCBSU1NJSGlQd3JMb3dlclRoKSkNCisJew0KKwkvLwkgcHJpbnRrKCJEb1R4SGlnaFBvd2VyKCkgLSBsb3dlciBQb3dlciAtIFVuZGVjb3JhdGVkU21vb3RoZWRTUzolZCwgIEhpUHdyVXBwZXJUaCA9ICVkIFxuIiwgcHJpdi0+VW5kZWNvcmF0ZWRTbW9vdGhlZFNTLCBIaVB3ckxvd2VyVGggKTsNCisJCWlmKHByaXYtPmJUb1VwZGF0ZVR4UHdyKQ0KKwkJew0KKwkJCXByaXYtPmJUb1VwZGF0ZVR4UHdyID0gZmFsc2U7DQorCQkJLy9TRDMgcmVxdWlyZWQuDQorCQkJdTFiVG1wPSByZWFkX25pY19ieXRlKGRldiwgQ0NLX1RYQUdDKTsJCQkNCisJCQlpZih1MWJUbXAgPCBDY2tUeFB3cklkeCkNCisJCQl7DQorCQkJLy91MWJUbXAgPSAoKHUxYlRtcCsxNikgPiAzNSkgPyAzNTogKHUxYlRtcCsxNik7ICAvLyA4ZGJtDQorCQkJLy93cml0ZV9uaWNfYnl0ZShkZXYsIENDS19UWEFHQywgdTFiVG1wKTsNCisJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIENDS19UWEFHQywgQ2NrVHhQd3JJZHgpOw0KKwkJCX0NCisNCisJCQl1MWJUbXA9IHJlYWRfbmljX2J5dGUoZGV2LCBPRkRNX1RYQUdDKTsNCisJCQlpZih1MWJUbXAgPCBPZmRtVHhQd3JJZHgpDQorCQkJew0KKwkJCS8vdTFiVG1wID0gKCh1MWJUbXArMTYpID4gMzUpID8gMzU6ICh1MWJUbXArMTYpOyAgLy8gOGRibQ0KKwkJCS8vd3JpdGVfbmljX2J5dGUoZGV2LCBPRkRNX1RYQUdDLCB1MWJUbXApOw0KKwkJCXdyaXRlX25pY19ieXRlKGRldiwgT0ZETV9UWEFHQywgT2ZkbVR4UHdySWR4KTsNCisJCQl9DQorCQl9DQorCX0NCisNCisJLy9wcmludGsoIjwtLS0tIERvVHhIaWdoUG93ZXIoKVxuIik7DQorfQ0KKw0KKw0KKy8vDQorLy8JRGVzY3JpcHRpb246DQorLy8JCUNhbGxiYWNrIGZ1bmN0aW9uIG9mIFVwZGF0ZVR4UG93ZXJXb3JrSXRlbS4NCisvLwkJQmVjYXVzZSBvZiBzb21lIGV2ZW50IGhhcHBlbmQsIGUuZy4gQ0NYIFRQQywgSGlnaCBQb3dlciBNZWNoYW5pc20sIA0KKy8vCQlXZSB1cGRhdGUgVHggcG93ZXIgb2YgY3VycmVudCBjaGFubmVsIGFnYWluLiANCisvLw0KKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwyMCkpDQordm9pZCBydGw4MTgwX3R4X3B3X3dxIChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspDQorew0KKy8vICAgICAgc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHI4MTgwX3ByaXYsIHdhdGNoX2RvZ193cSk7DQorLy8gICAgICBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqIGllZWUgPSAoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqKQ0KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlLCB3YXRjaF9kb2dfd3EpOw0KKyAgICAgICAgc3RydWN0IGRlbGF5ZWRfd29yayAqZHdvcmsgPSBjb250YWluZXJfb2Yod29yayxzdHJ1Y3QgZGVsYXllZF93b3JrLHdvcmspOw0KKyAgICAgICAgc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUgPSBjb250YWluZXJfb2YoZHdvcmssc3RydWN0IGllZWU4MDIxMV9kZXZpY2UsdHhfcHdfd3EpOw0KKyAgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGllZWUtPmRldjsNCisjZWxzZQ0KK3ZvaWQgcnRsODE4MF90eF9wd193cShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQ0KK3sNCisJLy8gc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOw0KKyNlbmRpZg0KKw0KKy8vCXByaW50aygiLS0tLT4gVXBkYXRlVHhQb3dlcldvcmtJdGVtQ2FsbGJhY2soKVxuIik7DQorCQ0KKwlEb1R4SGlnaFBvd2VyKGRldik7CQ0KKwkNCisvLwlwcmludGsoIjwtLS0tIFVwZGF0ZVR4UG93ZXJXb3JrSXRlbUNhbGxiYWNrKClcbiIpOw0KK30NCisNCisNCisvLw0KKy8vCURlc2NyaXB0aW9uOg0KKy8vCQlSZXR1cm4gVFJVRSBpZiB3ZSBzaGFsbCBwZXJmb3JtIERJRyBNZWNhaG5pc20sIEZBTFNFIG90aGVyd2lzZS4JDQorLy8NCitib29sDQorQ2hlY2tEaWcoDQorCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYNCisJKQ0KK3sNCisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOw0KKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSA9IHByaXYtPmllZWU4MDIxMTsNCisNCisJaWYoIXByaXYtPmJEaWdNZWNoYW5pc20pDQorCQlyZXR1cm4gZmFsc2U7DQorDQorCWlmKGllZWUtPnN0YXRlICE9IElFRUU4MDIxMV9MSU5LRUQpDQorCQlyZXR1cm4gZmFsc2U7DQorDQorCS8vaWYocHJpdi0+Q3VycmVudE9wZXJhUmF0ZSA8IDM2KSAvLyBTY2hlZHVsZSBEaWcgdW5kZXIgYWxsIE9GRE0gcmF0ZXMuIEJ5IEJydWNlLCAyMDA3LTA2LTAxLg0KKwlpZigocHJpdi0+aWVlZTgwMjExLT5yYXRlLzUpIDwgMzYpIC8vIFNjaGVkdWxlIERpZyB1bmRlciBhbGwgT0ZETSByYXRlcy4gQnkgQnJ1Y2UsIDIwMDctMDYtMDEuDQorCQlyZXR1cm4gZmFsc2U7DQorCXJldHVybiB0cnVlOw0KK30NCisvLw0KKy8vCURlc2NyaXB0aW9uOg0KKy8vCQlJbXBsZW1lbnRhdGlvbiBvZiBESUcgZm9yIFplYnJhIGFuZCBaZWJyYTIuCQ0KKy8vDQordm9pZA0KK0RJR19aZWJyYSgNCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldg0KKwkpDQorew0KKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7DQorCXUxNgkJCUNDS0ZhbHNlQWxhcm0sIE9GRE1GYWxzZUFsYXJtOw0KKwl1MTYJCQlPZmRtRkExLCBPZmRtRkEyOw0KKwlpbnQJCQlJbml0aWFsR2FpblN0ZXAgPSA3OyAvLyBUaGUgbnVtYmVyIG9mIGluaXRpYWwgZ2FpbiBzdGFnZXMuDQorCWludAkJCUxvd2VzdEdhaW5TdGFnZSA9IDQ7IC8vIFRoZSBjYXBhYmxlIGxvd2VzdCBzdGFnZSBvZiBwZXJmb3JtaW5nIGRpZyB3b3JraXRlbS4NCisJdTMyIAkJCUF3YWtlUGVyaW9kSW4yU2VjPTA7DQorDQorCS8vcHJpbnRrKCItLS0tLS0tLS0+IERJR19aZWJyYSgpXG4iKTsNCisNCisJQ0NLRmFsc2VBbGFybSA9ICh1MTYpKHByaXYtPkZhbHNlQWxhcm1SZWdWYWx1ZSAmIDB4MDAwMGZmZmYpOw0KKwlPRkRNRmFsc2VBbGFybSA9ICh1MTYpKChwcml2LT5GYWxzZUFsYXJtUmVnVmFsdWUgPj4gMTYpICYgMHgwMDAwZmZmZik7DQorCU9mZG1GQTEgPSAgMHgxNTsNCisJT2ZkbUZBMiA9ICgodTE2KShwcml2LT5SZWdEaWdPZmRtRmFVcFRoKSkgPDwgODsNCisNCisvLwlwcmludGsoIkRJRyoqKioqKioqKipDQ0sgRmFsc2UgQWxhcm06ICUjWCBcbiIsQ0NLRmFsc2VBbGFybSk7DQorLy8JcHJpbnRrKCJESUcqKioqKioqKioqT0ZETSBGYWxzZSBBbGFybTogJSNYIFxuIixPRkRNRmFsc2VBbGFybSk7DQorDQorICAgICAgICAvLyBUaGUgbnVtYmVyIG9mIGluaXRpYWwgZ2FpbiBzdGVwcyBpcyBkaWZmZXJlbnQsIGJ5IEJydWNlLCAyMDA3LTA0LTEzLg0KKwlpZiAocHJpdi0+SW5pdGlhbEdhaW4gPT0gMCApIC8vYXV0b0RJRw0KKwl7IC8vIEFkdmlzZWQgZnJvbSBTRDMgRFoNCisJCXByaXYtPkluaXRpYWxHYWluID0gNDsgLy8gSW4gODdCLCBtNzRkQm0gbWVhbnMgU3RhdGUgNCAobTgyZEJtKQ0KKwl9DQorCS8vaWYocEhhbERhdGEtPlZlcnNpb25JRCAhPSBWRVJTSU9OXzgxODdCX0IpDQorCXsgLy8gQWR2aXNlZCBmcm9tIFNEMyBEWg0KKwkJT2ZkbUZBMSA9ICAweDIwOw0KKwl9DQorCQ0KKyNpZiAxIC8vbHptIHJlc2VydmVkIDA4MDgyNg0KKwlBd2FrZVBlcmlvZEluMlNlYyA9ICgyMDAwLXByaXYgLT5Eb3plUGVyaW9kSW5QYXN0MlNlYyk7DQorCS8vcHJpbnRrKCImJiYgRG96ZVBlcmlvZD0lZCBBd2FrZVBlcmlvZD0lZFxuIiwgcHJpdi0+RG96ZVBlcmlvZEluUGFzdDJTZWMsIEF3YWtlUGVyaW9kSW4yU2VjKTsNCisJcHJpdiAtPkRvemVQZXJpb2RJblBhc3QyU2VjPTA7DQorCQ0KKwlpZihBd2FrZVBlcmlvZEluMlNlYykNCisJewkNCisJCS8vUlRfVFJBQ0UoQ09NUF9ESUcsIERCR19UUkFDRSwgKCJESUc6IEF3YWtlUGVyaW9kSW4yU2VjKCVkKSAtIEZBVGgoMHglWCAsIDB4JVgpIC0+IixBd2FrZVBlcmlvZEluMlNlYywgT2ZkbUZBMSwgT2ZkbUZBMikpOw0KKwkJLy8gYWRqdWVzdCBESUcgdGhyZXNob2xkLg0KKwkJT2ZkbUZBMSA9ICAodTE2KSgoT2ZkbUZBMSpBd2FrZVBlcmlvZEluMlNlYykgIC8gMjAwMCkgOyAgCQ0KKwkJT2ZkbUZBMiA9ICAodTE2KSgoT2ZkbUZBMipBd2FrZVBlcmlvZEluMlNlYykgIC8gMjAwMCkgOw0KKwkJLy9SVF9UUkFDRShDT01QX0RJRywgREJHX1RSQUNFLCAoIiggMHglWCAsIDB4JVgpXG4iLCBPZmRtRkExLCBPZmRtRkEyKSk7DQorCX0NCisJZWxzZQ0KKwl7DQorCQk7Ly9SVF9UUkFDRShDT01QX0RJRywgREJHX1dBUk5JTkcsICgiRVJST1IhISAgQXdha2VQZXJpb2RJbjJTZWMgc2hvdWxkIG5vdCBiZSBaRVJPISFcbiIpKTsNCisJfQ0KKyNlbmRpZg0KKw0KKwlJbml0aWFsR2FpblN0ZXAgPSA4Ow0KKwlMb3dlc3RHYWluU3RhZ2UgPSBwcml2LT5SZWdCTW9kZUdhaW5TdGFnZTsgLy8gTG93ZXN0IGdhaW4gc3RhZ2UuDQorDQorCWlmIChPRkRNRmFsc2VBbGFybSA+IE9mZG1GQTEpDQorCXsNCisJCWlmIChPRkRNRmFsc2VBbGFybSA+IE9mZG1GQTIpDQorCQl7DQorCQkJcHJpdi0+RElHX051bWJlckZhbGxiYWNrVm90ZSsrOw0KKwkJCWlmIChwcml2LT5ESUdfTnVtYmVyRmFsbGJhY2tWb3RlID4xKQ0KKwkJCXsNCisJCQkJLy9zZXJpb3VzIE9GRE0gIEZhbHNlIEFsYXJtLCBuZWVkIGZhbGxiYWNrDQorCQkJCWlmIChwcml2LT5Jbml0aWFsR2FpbiA8IEluaXRpYWxHYWluU3RlcCkNCisJCQkJew0KKwkJCQkJcHJpdi0+SW5pdGlhbEdhaW5CYWNrVXA9IHByaXYtPkluaXRpYWxHYWluOw0KKw0KKwkJCQkJcHJpdi0+SW5pdGlhbEdhaW4gPSAocHJpdi0+SW5pdGlhbEdhaW4gKyAxKTsNCisvLwkJCQkJcHJpbnRrKCJESUcqKioqKioqKioqT0ZETSBGYWxzZSBBbGFybTogJSNYLCAgT2ZkbUZBMTogJSNYLCBPZmRtRkEyOiAlI1hcbiIsIE9GRE1GYWxzZUFsYXJtLCBPZmRtRkExLCBPZmRtRkEyKTsNCisvLwkJCQkJcHJpbnRrKCJESUcrKysrKysrIGZhbGxiYWNrIE9GRE06JWQgXG4iLCBwcml2LT5Jbml0aWFsR2Fpbik7DQorCQkJCQlVcGRhdGVJbml0aWFsR2FpbihkZXYpOyANCisJCQkJfQ0KKwkJCQlwcml2LT5ESUdfTnVtYmVyRmFsbGJhY2tWb3RlID0gMDsNCisJCQkJcHJpdi0+RElHX051bWJlclVwZ3JhZGVWb3RlPTA7DQorCQkJfQ0KKwkJfQ0KKwkJZWxzZQ0KKwkJew0KKwkJCWlmIChwcml2LT5ESUdfTnVtYmVyRmFsbGJhY2tWb3RlKQ0KKwkJCQlwcml2LT5ESUdfTnVtYmVyRmFsbGJhY2tWb3RlLS07DQorCQl9DQorCQlwcml2LT5ESUdfTnVtYmVyVXBncmFkZVZvdGU9MDsJCQ0KKwl9DQorCWVsc2UJDQorCXsNCisJCWlmIChwcml2LT5ESUdfTnVtYmVyRmFsbGJhY2tWb3RlKQ0KKwkJCXByaXYtPkRJR19OdW1iZXJGYWxsYmFja1ZvdGUtLTsNCisJCXByaXYtPkRJR19OdW1iZXJVcGdyYWRlVm90ZSsrOw0KKw0KKwkJaWYgKHByaXYtPkRJR19OdW1iZXJVcGdyYWRlVm90ZT45KQ0KKwkJew0KKwkJCWlmIChwcml2LT5Jbml0aWFsR2FpbiA+IExvd2VzdEdhaW5TdGFnZSkgLy8gSW4gODdCLCBtNzhkQm0gbWVhbnMgU3RhdGUgNCAobTg2NGRCbSkNCisJCQl7DQorCQkJCXByaXYtPkluaXRpYWxHYWluQmFja1VwPSBwcml2LT5Jbml0aWFsR2FpbjsNCisNCisJCQkJcHJpdi0+SW5pdGlhbEdhaW4gPSAocHJpdi0+SW5pdGlhbEdhaW4gLSAxKTsNCisvLwkJCQlwcmludGsoIkRJRyoqKioqKioqKipPRkRNIEZhbHNlIEFsYXJtOiAlI1gsICBPZmRtRkExOiAlI1gsIE9mZG1GQTI6ICUjWFxuIiwgT0ZETUZhbHNlQWxhcm0sIE9mZG1GQTEsIE9mZG1GQTIpOw0KKy8vCQkJCXByaW50aygiRElHLS0tLS0tLS0tIFVwZ3JhZGUgT0ZETTolZCBcbiIsIHByaXYtPkluaXRpYWxHYWluKTsNCisJCQkJVXBkYXRlSW5pdGlhbEdhaW4oZGV2KTsgDQorCQkJfQ0KKwkJCXByaXYtPkRJR19OdW1iZXJGYWxsYmFja1ZvdGUgPSAwOw0KKwkJCXByaXYtPkRJR19OdW1iZXJVcGdyYWRlVm90ZT0wOw0KKwkJfQ0KKwl9DQorDQorLy8JcHJpbnRrKCJESUcrKysrKysrIE9GRE06JWRcbiIsIHByaXYtPkluaXRpYWxHYWluKTsJDQorCS8vcHJpbnRrKCI8LS0tLS0tLS0tIERJR19aZWJyYSgpXG4iKTsNCit9DQorDQorLy8NCisvLwlEZXNjcmlwdGlvbjoNCisvLwkJRGlzcGF0Y2ggRElHIGltcGxlbWVudGF0aW9uIGFjY29yZGluZyB0byBSRi4gCQ0KKy8vDQordm9pZA0KK0R5bmFtaWNJbml0R2FpbigNCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldg0KKwkpDQorew0KKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7DQorDQorCXN3aXRjaChwcml2LT5yZl9jaGlwKQ0KKwl7DQorCQljYXNlIFJGX1pFQlJBMjogIC8vIFtBbm5pZVdvcmthcm91bmRdIEZvciBaZWJyYTIsIDIwMDUtMDgtMDEuDQorCQljYXNlIFJGX1pFQlJBNDoNCisJCQlESUdfWmVicmEoIGRldiApOw0KKwkJCWJyZWFrOw0KKwkJDQorCQlkZWZhdWx0Og0KKwkJCXByaW50aygiRHluYW1pY0luaXRHYWluKCk6IHVua25vd24gUkZDaGlwSUQoJWQpICEhIVxuIiwgcHJpdi0+cmZfY2hpcCk7DQorCQkJYnJlYWs7DQorCX0NCit9DQorDQorI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDIwKSkNCit2b2lkIHJ0bDgxODBfaHdfZGlnX3dxIChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspDQorew0KKy8vICAgICAgc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHI4MTgwX3ByaXYsIHdhdGNoX2RvZ193cSk7DQorLy8gICAgICBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqIGllZWUgPSAoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqKQ0KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlLCB3YXRjaF9kb2dfd3EpOw0KKyAgICAgICAgc3RydWN0IGRlbGF5ZWRfd29yayAqZHdvcmsgPSBjb250YWluZXJfb2Yod29yayxzdHJ1Y3QgZGVsYXllZF93b3JrLHdvcmspOw0KKyAgICAgICAgc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUgPSBjb250YWluZXJfb2YoZHdvcmssc3RydWN0IGllZWU4MDIxMV9kZXZpY2UsaHdfZGlnX3dxKTsNCisgICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBpZWVlLT5kZXY7DQorI2Vsc2UNCit2b2lkIHJ0bDgxODBfaHdfZGlnX3dxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpDQorew0KKwkNCisjZW5kaWYNCisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOw0KKw0KKwkvLyBSZWFkIENDSyBhbmQgT0ZETSBGYWxzZSBBbGFybS4NCisJcHJpdi0+RmFsc2VBbGFybVJlZ1ZhbHVlID0gcmVhZF9uaWNfZHdvcmQoZGV2LCBDQ0tfRkFMU0VfQUxBUk0pOw0KKwkNCisNCisJLy8gQWRqdXN0IEluaXRpYWwgR2FpbiBkeW5hbWljYWxseS4NCisJRHluYW1pY0luaXRHYWluKGRldik7DQorCQ0KK30NCisNCitpbnQNCitJbmNsdWRlZEluU3VwcG9ydGVkUmF0ZXMoDQorICAgICAgICBzdHJ1Y3QgcjgxODBfcHJpdiAgICAgICAqcHJpdiwNCisgICAgICAgIHU4ICAgICAgICAgICAgICBUeFJhdGUgICkNCit7DQorICAgIHU4IHJhdGVfbGVuOw0KKyAgICAgICAgdTggcmF0ZV9leF9sZW47DQorICAgICAgICB1OCAgICAgICAgICAgICAgICAgICAgICBSYXRlTWFzayA9IDB4N0Y7DQorICAgICAgICB1OCAgICAgICAgICAgICAgICAgICAgICBpZHg7DQorICAgICAgICB1bnNpZ25lZCBzaG9ydCAgICAgICAgICBGb3VuZCA9IDA7DQorICAgICAgICB1OCAgICAgICAgICAgICAgICAgICAgICBOYWl2ZVR4UmF0ZSA9IFR4UmF0ZSZSYXRlTWFzazsNCisNCisgICAgcmF0ZV9sZW4gPSBwcml2LT5pZWVlODAyMTEtPmN1cnJlbnRfbmV0d29yay5yYXRlc19sZW47DQorICAgICAgICByYXRlX2V4X2xlbiA9IHByaXYtPmllZWU4MDIxMS0+Y3VycmVudF9uZXR3b3JrLnJhdGVzX2V4X2xlbjsNCisgICAgICAgIGZvciggaWR4PTA7IGlkeDwgcmF0ZV9sZW47IGlkeCsrICkNCisgICAgICAgIHsNCisgICAgICAgICAgICAgICAgaWYoIChwcml2LT5pZWVlODAyMTEtPmN1cnJlbnRfbmV0d29yay5yYXRlc1tpZHhdICYgUmF0ZU1hc2spID09IE5haXZlVHhSYXRlICkNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIEZvdW5kID0gMTsNCisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGZvdW5kX3JhdGU7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgZm9yKCBpZHg9MDsgaWR4PCByYXRlX2V4X2xlbjsgaWR4KysgKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgICAgICBpZiggKHByaXYtPmllZWU4MDIxMS0+Y3VycmVudF9uZXR3b3JrLnJhdGVzX2V4W2lkeF0gJiBSYXRlTWFzaykgPT0gTmFpdmVUeFJhdGUgKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgRm91bmQgPSAxOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZm91bmRfcmF0ZTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIEZvdW5kOw0KKyAgICAgICAgZm91bmRfcmF0ZToNCisgICAgICAgIHJldHVybiBGb3VuZDsNCit9DQorDQorLy8NCisvLyAgICAgIERlc2NyaXB0aW9uOg0KKy8vICAgICAgICAgICAgICBHZXQgdGhlIFR4IHJhdGUgb25lIGRlZ3JlZSB1cCBmb3JtIHRoZSBpbnB1dCByYXRlIGluIHRoZSBzdXBwb3J0ZWQgcmF0ZXMuDQorLy8gICAgICAgICAgICAgIFJldHVybiB0aGUgdXBncmFkZSByYXRlIGlmIGl0IGlzIHN1Y2Nlc3NlZCwgb3RoZXJ3aXNlIHJldHVybiB0aGUgaW5wdXQgcmF0ZS4NCisvLyAgICAgIEJ5IEJydWNlLCAyMDA3LTA2LTA1Lg0KKy8vIA0KK3U4DQorR2V0VXBncmFkZVR4UmF0ZSgNCisgICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsDQorICAgICAgICB1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhdGUNCisgICAgICAgICkNCit7DQorICAgICAgICBzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7DQorICAgICAgICB1OCAgICAgICAgICAgICAgICAgICAgICBVcFJhdGU7DQorDQorICAgICAgICAvLyBVcGdyYWRlIDEgZGVncmVlLg0KKyAgICAgICAgc3dpdGNoKHJhdGUpDQorICAgICAgICB7DQorICAgICAgICBjYXNlIDEwODogLy8gVXAgdG8gNTRNYnBzLg0KKyAgICAgICAgICAgICAgICBVcFJhdGUgPSAxMDg7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKw0KKyAgICAgICAgY2FzZSA5NjogLy8gVXAgdG8gNTRNYnBzLg0KKyAgICAgICAgICAgICAgICBVcFJhdGUgPSAxMDg7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKw0KKyAgICAgICAgY2FzZSA3MjogLy8gVXAgdG8gNDhNYnBzLg0KKyAgICAgICAgICAgICAgICBVcFJhdGUgPSA5NjsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorDQorICAgICAgICBjYXNlIDQ4OiAvLyBVcCB0byAzNk1icHMuDQorICAgICAgICAgICAgICAgIFVwUmF0ZSA9IDcyOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisNCisgICAgICAgIGNhc2UgMzY6IC8vIFVwIHRvIDI0TWJwcy4NCisgICAgICAgICAgICAgICAgVXBSYXRlID0gNDg7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKw0KKyAgICAgICAgY2FzZSAyMjogLy8gVXAgdG8gMThNYnBzLg0KKyAgICAgICAgICAgICAgICBVcFJhdGUgPSAzNjsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorDQorICAgICAgICBjYXNlIDExOiAvLyBVcCB0byAxMU1icHMuDQorICAgICAgICAgICAgICAgIFVwUmF0ZSA9IDIyOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisNCisgICAgICAgIGNhc2UgNDogLy8gVXAgdG8gNS41TWJwcy4NCisgICAgICAgICAgICAgICAgVXBSYXRlID0gMTE7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKw0KKyAgICAgICAgY2FzZSAyOiAvLyBVcCB0byAyTWJwcy4NCisgICAgICAgICAgICAgICAgVXBSYXRlID0gNDsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorDQorICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgICAgICBwcmludGsoIkdldFVwZ3JhZGVUeFJhdGUoKTogSW5wdXQgVHggUmF0ZSglZCkgaXMgdW5kZWZpbmVkIVxuIiwgcmF0ZSk7DQorICAgICAgICAgICAgICAgIHJldHVybiByYXRlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHJhdGUgaXMgdmFsaWQuDQorICAgICAgICBpZihJbmNsdWRlZEluU3VwcG9ydGVkUmF0ZXMocHJpdiwgVXBSYXRlKSkNCisgICAgICAgIHsNCisvLyAgICAgICAgICAgICAgcHJpbnRrKCJHZXRVcGdyYWRlVHhSYXRlKCk6IEdldFVwZ3JhZGUgVHggcmF0ZSglZCkgZnJvbSAlZCAhXG4iLCBVcFJhdGUsIHByaXYtPkN1cnJlbnRPcGVyYVJhdGUpOw0KKyAgICAgICAgICAgICAgICByZXR1cm4gVXBSYXRlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgZWxzZQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgICAgICAvL3ByaW50aygiR2V0VXBncmFkZVR4UmF0ZSgpOiBUeCByYXRlICglZCkgaXMgbm90IGluIHN1cHBvcnRlZCByYXRlc1xuIiwgVXBSYXRlKTsNCisgICAgICAgICAgICAgICAgcmV0dXJuIHJhdGU7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gcmF0ZTsNCit9DQorLy8NCisvLyAgICAgIERlc2NyaXB0aW9uOg0KKy8vICAgICAgICAgICAgICBHZXQgdGhlIFR4IHJhdGUgb25lIGRlZ3JlZSBkb3duIGZvcm0gdGhlIGlucHV0IHJhdGUgaW4gdGhlIHN1cHBvcnRlZCByYXRlcy4NCisvLyAgICAgICAgICAgICAgUmV0dXJuIHRoZSBkZWdyYWRlIHJhdGUgaWYgaXQgaXMgc3VjY2Vzc2VkLCBvdGhlcndpc2UgcmV0dXJuIHRoZSBpbnB1dCByYXRlLg0KKy8vICAgICAgQnkgQnJ1Y2UsIDIwMDctMDYtMDUuDQorLy8gDQordTgNCitHZXREZWdyYWRlVHhSYXRlKA0KKyAgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwNCisgICAgICAgIHU4ICAgICAgICAgcmF0ZQ0KKyAgICAgICAgKQ0KK3sNCisgICAgICAgIHN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsNCisgICAgICAgIHU4ICAgICAgICAgICAgICAgICAgICAgIERvd25SYXRlOw0KKw0KKyAgICAgICAgLy8gVXBncmFkZSAxIGRlZ3JlZS4NCisgICAgICAgIHN3aXRjaChyYXRlKQ0KKyAgICAgICAgew0KKyAgICAgICAgY2FzZSAxMDg6IC8vIERvd24gdG8gNDhNYnBzLg0KKyAgICAgICAgICAgICAgICBEb3duUmF0ZSA9IDk2Ow0KKyAgICAgICAgICAgICAgICBicmVhazsNCisNCisgICAgICAgIGNhc2UgOTY6IC8vIERvd24gdG8gMzZNYnBzLg0KKyAgICAgICAgICAgICAgICBEb3duUmF0ZSA9IDcyOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisNCisgICAgICAgIGNhc2UgNzI6IC8vIERvd24gdG8gMjRNYnBzLg0KKyAgICAgICAgICAgICAgICBEb3duUmF0ZSA9IDQ4Ow0KKyAgICAgICAgICAgICAgICBicmVhazsNCisNCisgICAgICAgIGNhc2UgNDg6IC8vIERvd24gdG8gMThNYnBzLg0KKyAgICAgICAgICAgICAgICBEb3duUmF0ZSA9IDM2Ow0KKyAgICAgICAgICAgICAgICBicmVhazsNCisNCisgICAgICAgIGNhc2UgMzY6IC8vIERvd24gdG8gMTFNYnBzLg0KKyAgICAgICAgICAgICAgICBEb3duUmF0ZSA9IDIyOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisNCisgICAgICAgIGNhc2UgMjI6IC8vIERvd24gdG8gNS41TWJwcy4NCisgICAgICAgICAgICAgICAgRG93blJhdGUgPSAxMTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorDQorICAgICAgICBjYXNlIDExOiAvLyBEb3duIHRvIDJNYnBzLg0KKyAgICAgICAgICAgICAgICBEb3duUmF0ZSA9IDQ7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKw0KKyAgICAgICAgY2FzZSA0OiAvLyBEb3duIHRvIDFNYnBzLg0KKyAgICAgICAgICAgICAgICBEb3duUmF0ZSA9IDI7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKw0KKyAgICAgICAgY2FzZSAyOiAvLyBEb3duIHRvIDFNYnBzLg0KKyAgICAgICAgICAgICAgICBEb3duUmF0ZSA9IDI7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKw0KKyAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICAgICAgcHJpbnRrKCJHZXREZWdyYWRlVHhSYXRlKCk6IElucHV0IFR4IFJhdGUoJWQpIGlzIHVuZGVmaW5lZCFcbiIsIHJhdGUpOw0KKyAgICAgICAgICAgICAgICByZXR1cm4gcmF0ZTsNCisgICAgICAgIH0NCisgICAgICAgIC8vIENoZWNrIGlmIHRoZSByYXRlIGlzIHZhbGlkLg0KKyAgICAgICAgaWYoSW5jbHVkZWRJblN1cHBvcnRlZFJhdGVzKHByaXYsIERvd25SYXRlKSkNCisgICAgICAgIHsNCisvLyAgICAgICAgICAgICAgcHJpbnRrKCJHZXREZWdyYWRlVHhSYXRlKCk6IEdldERlZ3JhZGUgVHggcmF0ZSglZCkgZnJvbSAlZCFcbiIsIERvd25SYXRlLCBwcml2LT5DdXJyZW50T3BlcmFSYXRlKTsNCisgICAgICAgICAgICAgICAgcmV0dXJuIERvd25SYXRlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgZWxzZQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgICAgICAvL3ByaW50aygiR2V0RGVncmFkZVR4UmF0ZSgpOiBUeCByYXRlICglZCkgaXMgbm90IGluIHN1cHBvcnRlZCByYXRlc1xuIiwgRG93blJhdGUpOw0KKyAgICAgICAgICAgICAgICByZXR1cm4gcmF0ZTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiByYXRlOw0KK30NCisvLw0KKy8vICAgICAgSGVscGVyIGZ1bmN0aW9uIHRvIGRldGVybWluZSBpZiBzcGVjaWZpZWQgZGF0YSByYXRlIGlzIA0KKy8vICAgICAgQ0NLIHJhdGUuDQorLy8gICAgICAyMDA1LjAxLjI1LCBieSByY25qa28uDQorLy8NCitib29sDQorTWdudElzQ2NrUmF0ZSgNCisgICAgICAgIHUxNiAgICAgcmF0ZQ0KKyAgICAgICAgKQ0KK3sNCisgICAgICAgIGJvb2wgYlJldHVybiA9IGZhbHNlOw0KKw0KKyAgICAgICAgaWYoKHJhdGUgPD0gMjIpICYmIChyYXRlICE9IDEyKSAmJiAocmF0ZSAhPSAxOCkpDQorICAgICAgICB7DQorICAgICAgICAgICAgICAgIGJSZXR1cm4gPSB0cnVlOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcmV0dXJuIGJSZXR1cm47DQorfQ0KKyNpZmRlZiBDT05GSUdfUlRMODE4WF9TDQorLy8NCisvLwlEZXNjcmlwdGlvbjoNCisvLwkJVHggUG93ZXIgdHJhY2tpbmcgbWVjaGFuaXNtIHJvdXRpbmUgb24gODdTRS4NCisvLyAJQ3JlYXRlZCBieSBSb2dlciwgMjAwNy4xMi4xMS4NCisvLw0KK3ZvaWQNCitUeFB3clRyYWNraW5nODdTRSgNCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldg0KKykNCit7CQkNCisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTgwX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOw0KKwl1OAl0bXB1MUJ5dGUsIEN1cnJlbnRUaGVybWFsLCBJZHg7CQ0KKwljaGFyCUNja1R4UHdySWR4LCBPZmRtVHhQd3JJZHg7CQ0KKwkvL3UzMgl1NGJSZlJlZzsNCisJDQorCXRtcHUxQnl0ZSA9IHJlYWRfbmljX2J5dGUoZGV2LCBFTl9MUEZfQ0FMKTsNCisJQ3VycmVudFRoZXJtYWwgPSAodG1wdTFCeXRlICYgMHhmMCk+PjQ7IC8vWyA3OjRdOiB0aGVybWFsIG1ldGVyIGluZGljYXRpb24uDQorCUN1cnJlbnRUaGVybWFsID0gKEN1cnJlbnRUaGVybWFsPjB4MGMpPyAweDBjOkN1cnJlbnRUaGVybWFsOy8vbHptIGFkZCAwODA4MjYNCisNCisJLy9wcmludGsoIlR4UHdyVHJhY2tpbmc4N1NFKCk6IEN1cnJlbnRUaGVybWFsKCVkKVxuIiwgQ3VycmVudFRoZXJtYWwpOw0KKwkNCisJaWYoIEN1cnJlbnRUaGVybWFsICE9IHByaXYtPlRoZXJtYWxNZXRlcikNCisJewkNCisvLwkJcHJpbnRrKCJUeFB3clRyYWNraW5nODdTRSgpOiBUaGVybWFsIG1ldGVyIGNoYW5nZWQhISFcbiIpOw0KKw0KKwkJLy8gVXBkYXRlIFR4IFBvd2VyIGxldmVsIG9uIGVhY2ggY2hhbm5lbC4NCisJCWZvcihJZHggPSAxOyBJZHg8MTU7IElkeCsrKQ0KKwkJewkJCQ0KKwkJCUNja1R4UHdySWR4ID0gcHJpdi0+Y2h0eHB3cltJZHhdOw0KKwkJCU9mZG1UeFB3cklkeCA9IHByaXYtPmNodHhwd3Jfb2ZkbVtJZHhdOwkJCQ0KKwkJCQ0KKwkJCWlmKCBDdXJyZW50VGhlcm1hbCA+IHByaXYtPlRoZXJtYWxNZXRlciApDQorCQkJeyAvLyBoaWdoZXIgdGhlcm1hbCBtZXRlci4JCQ0KKwkJCQlDY2tUeFB3cklkeCArPSAoQ3VycmVudFRoZXJtYWwgLSBwcml2LT5UaGVybWFsTWV0ZXIpKjI7DQorCQkJCU9mZG1UeFB3cklkeCArPSAoQ3VycmVudFRoZXJtYWwgLSBwcml2LT5UaGVybWFsTWV0ZXIpKjI7DQorCQkJDQorCQkJCWlmKENja1R4UHdySWR4ID4zNSkNCisJCQkJCUNja1R4UHdySWR4ID0gMzU7IC8vIEZvcmNlIFR4UG93ZXIgdG8gbWF4aW1hbCBpbmRleC4NCisJCQkJaWYoT2ZkbVR4UHdySWR4ID4zNSkNCisJCQkJCU9mZG1UeFB3cklkeCA9IDM1OwkJCQkNCisJCQl9DQorCQkJZWxzZQ0KKwkJCXsgLy8gbG93ZXIgdGhlcm1hbCBtZXRlci4JCQkJDQorCQkJCUNja1R4UHdySWR4IC09IChwcml2LT5UaGVybWFsTWV0ZXIgLSBDdXJyZW50VGhlcm1hbCkqMjsNCisJCQkJT2ZkbVR4UHdySWR4IC09IChwcml2LT5UaGVybWFsTWV0ZXIgLSBDdXJyZW50VGhlcm1hbCkqMjsNCisNCisJCQkJaWYoQ2NrVHhQd3JJZHggPDApDQorCQkJCQlDY2tUeFB3cklkeCA9IDA7CQkNCisJCQkJaWYoT2ZkbVR4UHdySWR4IDwwKQ0KKwkJCQkJT2ZkbVR4UHdySWR4ID0gMDsJCQkJDQorCQkJfQkJCQkJDQorCQkJDQorCQkJLy8gVXBkYXRlIFR4UG93ZXIgbGV2ZWwgb24gQ0NLIGFuZCBPRkRNIHJlc3AuDQorCQkJcHJpdi0+Y2h0eHB3cltJZHhdID0gQ2NrVHhQd3JJZHg7DQorCQkJcHJpdi0+Y2h0eHB3cl9vZmRtW0lkeF0gPSBPZmRtVHhQd3JJZHg7CQkJCQ0KKwkJfQkNCisNCisJCS8vIFVwZGF0ZSBUeFBvd2VyIGxldmVsIGltbWVkaWF0ZWx5Lg0KKwkJcnRsODIyNXoyX1NldFRYUG93ZXJMZXZlbChkZXYsIHByaXYtPmllZWU4MDIxMS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWwpOw0KKwl9CQ0KKwlwcml2LT5UaGVybWFsTWV0ZXIgPSBDdXJyZW50VGhlcm1hbDsJCQkJCQ0KK30NCit2b2lkDQorU3RhUmF0ZUFkYXB0aXZlODdTRSgNCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldg0KKwkpDQorew0KKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxODBfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7DQorCXVuc2lnbmVkIGxvbmcgCQkJQ3VyclR4b2tDbnQ7DQorCXUxNgkJCUN1cnJSZXRyeUNudDsNCisJdTE2CQkJQ3VyclJldHJ5UmF0ZTsNCisJLy91MTYJCQlpLGlkeDsNCisJdW5zaWduZWQgbG9uZyAgICAgICAJQ3VyclJ4b2tDbnQ7DQorCWJvb2wJCQliVHJ5VXAgPSBmYWxzZTsNCisJYm9vbAkJCWJUcnlEb3duID0gZmFsc2U7DQorCXU4CQkJVHJ5VXBUaCA9IDE7DQorCXU4CQkJVHJ5RG93blRoID0gMjsNCisJdTMyCQkJVHhUaHJvdWdocHV0Ow0KKwlsb25nCQlDdXJyU2lnbmFsU3RyZW5ndGg7DQorCWJvb2wJCWJVcGRhdGVJbml0aWFsR2FpbiA9IGZhbHNlOw0KKyAgICAJdTgJCQl1MWJPZmRtPTAsIHUxYkNjayA9IDA7DQorCWNoYXIJCU9mZG1UeFB3cklkeCwgQ2NrVHhQd3JJZHg7CQ0KKw0KKwlwcml2LT5SYXRlQWRhcHRpdmVQZXJpb2Q9IFJBVEVfQURBUFRJVkVfVElNRVJfUEVSSU9EOw0KKw0KKw0KKwlDdXJyUmV0cnlDbnQJPSBwcml2LT5DdXJyUmV0cnlDbnQ7DQorCUN1cnJUeG9rQ250CT0gcHJpdi0+TnVtVHhPa1RvdGFsIC0gcHJpdi0+TGFzdFR4b2tDbnQ7DQorCUN1cnJSeG9rQ250CT0gcHJpdi0+aWVlZTgwMjExLT5OdW1SeE9rVG90YWwgLSBwcml2LT5MYXN0Unhva0NudDsNCisJQ3VyclNpZ25hbFN0cmVuZ3RoID0gcHJpdi0+U3RhdHNfUmVjdlNpZ25hbFBvd2VyOw0KKwlUeFRocm91Z2hwdXQgPSAodTMyKShwcml2LT5OdW1UeE9rQnl0ZXNUb3RhbCAtIHByaXYtPkxhc3RUeE9LQnl0ZXMpOw0KKwlwcml2LT5MYXN0VHhPS0J5dGVzID0gcHJpdi0+TnVtVHhPa0J5dGVzVG90YWw7DQorCXByaXYtPkN1cnJlbnRPcGVyYVJhdGUgPSBwcml2LT5pZWVlODAyMTEtPnJhdGUvNTsNCisJLy9wcmludGsoInByaXYtPkN1cnJlbnRPcGVyYVJhdGUgaXMgJWRcbiIscHJpdi0+Q3VycmVudE9wZXJhUmF0ZSk7DQorCS8vMiBDb21wdXRlIHJldHJ5IHJhdGlvLg0KKwlpZiAoQ3VyclR4b2tDbnQ+MCkNCisJew0KKwkJQ3VyclJldHJ5UmF0ZSA9ICh1MTYpKEN1cnJSZXRyeUNudCoxMDAvQ3VyclR4b2tDbnQpOw0KKwl9DQorCWVsc2UNCisJeyAvLyBJdCBtYXkgYmUgc2VyaW91cyByZXRyeS4gVG8gZGlzdGluZ3Vpc2ggc2VyaW91cyByZXRyeSBvciBubyBwYWNrZXRzIG1vZGlmaWVkIGJ5IEJydWNlDQorCQlDdXJyUmV0cnlSYXRlID0gKHUxNikoQ3VyclJldHJ5Q250KjEwMC8xKTsNCisJfQ0KKw0KKw0KKwkvLw0KKwkvLyBBZGRlZCBieSBSb2dlciwgMjAwNy4wMS4wMi4NCisJLy8gRm9yIGRlYnVnIGluZm9ybWF0aW9uLg0KKwkvLw0KKwkvL3ByaW50aygiXG4oMSkgcEhhbERhdGEtPkxhc3RSZXRyeVJhdGU6ICVkIFxuIixwcml2LT5MYXN0UmV0cnlSYXRlKTsNCisJLy9wcmludGsoIigyKSBSZXRyeUNudCA9ICVkICBcbiIsIEN1cnJSZXRyeUNudCk7CQ0KKwkvL3ByaW50aygiKDMpIFR4b2tDbnQgPSAlZCBcbiIsIEN1cnJUeG9rQ250KTsNCisJLy9wcmludGsoIig0KSBDdXJyUmV0cnlSYXRlID0gJWQgXG4iLCBDdXJyUmV0cnlSYXRlKTsJDQorCS8vcHJpbnRrKCIoNSkgQ3VyclNpZ25hbFN0cmVuZ3RoID0gJWQgXG4iLEN1cnJTaWduYWxTdHJlbmd0aCk7DQorCS8vcHJpbnRrKCIoNikgVHhUaHJvdWdocHV0IGlzICVkXG4iLFR4VGhyb3VnaHB1dCk7DQorCS8vcHJpbnRrKCJwcml2LT5OdW1UeE9rQnl0ZXNUb3RhbCBpcyAlZFxuIixwcml2LT5OdW1UeE9rQnl0ZXNUb3RhbCk7CQkNCisNCisJcHJpdi0+TGFzdFJldHJ5Q250ID0gcHJpdi0+Q3VyclJldHJ5Q250Ow0KKwlwcml2LT5MYXN0VHhva0NudCA9IHByaXYtPk51bVR4T2tUb3RhbDsNCisJcHJpdi0+TGFzdFJ4b2tDbnQgPSBwcml2LT5pZWVlODAyMTEtPk51bVJ4T2tUb3RhbDsNCisJcHJpdi0+Q3VyclJldHJ5Q250ID0gMDsNCisNCisJLy8yTm8gVHggcGFja2V0cywgcmV0dXJuIHRvIGluaXRfcmF0ZSBvciBub3Q/DQorCWlmIChDdXJyUmV0cnlSYXRlPT0wICYmIEN1cnJUeG9rQ250ID09IDApDQorCXsJDQorCQkvLw0KKwkJLy9BZnRlciA5ICgzMCozMDBtcykgc2Vjb25kcyBpbiB0aGlzIGNvbmRpdGlvbiwgd2UgdHJ5IHRvIHJhaXNlIHJhdGUuDQorCQkvLw0KKwkJcHJpdi0+VHJ5dXBpbmdDb3VudE5vRGF0YSsrOw0KKwkJDQorLy8JCXByaW50aygiTm8gVHggcGFja2V0cywgVHJ5dXBpbmdDb3VudE5vRGF0YSglZClcbiIsIHByaXYtPlRyeXVwaW5nQ291bnROb0RhdGEpOw0KKwkJLy9bVFJDIERlbGwgTGFiXSBFeHRlbmQgcmFpc2VkIHBlcmlvZCBmcm9tIDQuNXNlYyB0byA5c2VjLCBJc2FpYWggMjAwOC0wMi0xNSAxODowMCANCisJCWlmIChwcml2LT5Ucnl1cGluZ0NvdW50Tm9EYXRhPjMwKQ0KKwkJew0KKwkJCXByaXYtPlRyeXVwaW5nQ291bnROb0RhdGEgPSAwOw0KKwkJIAlwcml2LT5DdXJyZW50T3BlcmFSYXRlID0gR2V0VXBncmFkZVR4UmF0ZShkZXYsIHByaXYtPkN1cnJlbnRPcGVyYVJhdGUpOwkJDQorCQkJLy8gUmVzZXQgRmFpbCBSZWNvcmQNCisJCQlwcml2LT5MYXN0RmFpbFR4UmF0ZSA9IDA7DQorCQkJcHJpdi0+TGFzdEZhaWxUeFJhdGVTUyA9IC0yMDA7DQorCQkJcHJpdi0+RmFpbFR4UmF0ZUNvdW50ID0gMDsNCisJCX0NCisJCWdvdG8gU2V0SW5pdGlhbEdhaW47DQorCX0NCisgICAgICAgIGVsc2UNCisJew0KKwkJcHJpdi0+VHJ5dXBpbmdDb3VudE5vRGF0YT0wOyAvL1Jlc2V0IHRyeWluZyB1cCB0aW1lcy4NCisJfQ0KKw0KKw0KKwkvLw0KKwkvLyBGb3IgTmV0Z2VhciBjYXNlLCBJIGNvbW1lbnQgb3V0IHRoZSBmb2xsb3dpbmcgc2lnbmFsIHN0cmVuZ3RoIGVzdGltYXRpb24sDQorCS8vIHdoaWNoIGNhbiByZXN1bHRzIGluIGxvd2VyIHJhdGUgdG8gdHJhbnNtaXQgd2hlbiBzYW1wbGUgaXMgTk9UIGVub3VnaCAoZS5nLiBQSU5HIHJlcXVlc3QpLiAgDQorCS8vIDIwMDcuMDQuMDksIGJ5IFJvZ2VyLgkNCisJLy8JDQorDQorCS8vDQorCS8vIFJlc3RydWN0dXJlIHJhdGUgYWRhcHRpdmUgYXMgdGhlIGZvbGxvd2luZyBtYWluIHN0YWdlczoNCisJLy8gKDEpIEFkZCByZXRyeSB0aHJlc2hvbGQgaW4gNTRNIHVwZ3JhZGluZyBjb25kaXRpb24gd2l0aCBzaWduYWwgc3RyZW5ndGguDQorCS8vICgyKSBBZGQgdGhlIG1lY2hhbmlzbSB0byBkZWdyYWRlIHRvIENDSyByYXRlIGFjY29yZGluZyB0byBzaWduYWwgc3RyZW5ndGggDQorCS8vCQlhbmQgcmV0cnkgcmF0ZS4NCisJLy8gKDMpIFJlbW92ZSBhbGwgSW5pdGlhbCBHYWluIFVwZGF0ZXMgb3ZlciBPRkRNIHJhdGUuIFRvIGF2b2lkIHRoZSBjb21wbGljYXRlZCANCisJLy8JCXNpdHVhdGlvbiwgSW5pdGlhbCBHYWluIFVwZGF0ZSBpcyB1cG9uIG9uIERJRyBtZWNoYW5pc20gZXhjZXB0IENDSyByYXRlLg0KKwkvLyAoNCkgQWRkIHRoZSBtZWhhbmlzbSBvZiB0cnlpbmcgdG8gdXBncmFkZSB0eCByYXRlLg0KKwkvLyAoNSkgUmVjb3JkIHRoZSBpbmZvcm1hdGlvbiBvZiB1cHBpbmcgdHggcmF0ZSB0byBhdm9pZCB0cnlpbmcgdXBwaW5nIHR4IHJhdGUgY29uc3RhbnRseS4NCisJLy8gQnkgQnJ1Y2UsIDIwMDctMDYtMDUuDQorCS8vCQ0KKwkvLw0KKw0KKwkvLyAxMU1icHMgb3IgMzZNYnBzDQorCS8vIENoZWNrIG1vcmUgdGltZXMgaW4gdGhlc2UgcmF0ZShrZXkgcmF0ZXMpLg0KKwkvLw0KKwlpZihwcml2LT5DdXJyZW50T3BlcmFSYXRlID09IDIyIHx8IHByaXYtPkN1cnJlbnRPcGVyYVJhdGUgPT0gNzIpDQorCXsgDQorCQlUcnlVcFRoICs9IDk7DQorCX0NCisJLy8NCisJLy8gTGV0IHRoZXNlIHJhdGVzIGRvd24gbW9yZSBkaWZmaWN1bHQuDQorCS8vDQorCWlmKE1nbnRJc0Nja1JhdGUocHJpdi0+Q3VycmVudE9wZXJhUmF0ZSkgfHwgcHJpdi0+Q3VycmVudE9wZXJhUmF0ZSA9PSAzNikNCisJew0KKwkJCVRyeURvd25UaCArPSAxOw0KKwl9DQorDQorCS8vMSBBZGp1c3QgUmF0ZS4NCisJaWYgKHByaXYtPmJUcnl1cGluZyA9PSB0cnVlKQ0KKwl7CQ0KKwkJLy8yIEZvciBUZXN0IFVwZ3JhZGluZyBtZWNoYW5pc20NCisJCS8vIE5vdGU6DQorCQkvLyAJU29tZXRpbWVzIHRoZSB0aHJvdWdocHV0IGlzIHVwb24gb24gdGhlIGNhcGFiaWxpdHkgYnd0d2VlbiB0aGUgQVAgYW5kIE5JQywNCisJCS8vIAl0aHVzIHRoZSBsb3cgZGF0YSByYXRlIGRvZXMgbm90IGltcHJvdmUgdGhlIHBlcmZvcm1hbmNlLg0KKwkJLy8gCVdlIHJhbmRvbWx5IHVwZ3JhZGUgdGhlIGRhdGEgcmF0ZSBhbmQgY2hlY2sgaWYgdGhlIHJldHJ5IHJhdGUgaXMgaW1wcm92ZWQuDQorCQkNCisJCS8vIFVwZ3JhZGluZyByYXRlIGRpZCBub3QgaW1wcm92ZSB0aGUgcmV0cnkgcmF0ZSwgZmFsbGJhY2sgdG8gdGhlIG9yaWdpbmFsIHJhdGUuDQorCQlpZiAoIChDdXJyUmV0cnlSYXRlID4gMjUpICYmIFR4VGhyb3VnaHB1dCA8IHByaXYtPkxhc3RUeFRocm91Z2hwdXQpDQorCQl7DQorCQkJLy9Ob3QgbmVjZXNzYXJ5IHJhaXNpbmcgcmF0ZSwgZmFsbCBiYWNrIHJhdGUuDQorCQkJYlRyeURvd24gPSB0cnVlOw0KKwkJCS8vcHJpbnRrKCJjYXNlMS0xOiBOb3QgbmVjZXNzYXJ5IHJhaXNpbmcgcmF0ZSwgZmFsbCBiYWNrIHJhdGUuLi4uXG4iKTsNCisJCQkvL3ByaW50aygiY2FzZTEtMTogcE1nbnRJbmZvLT5DdXJyZW50T3BlcmFSYXRlID0lZCwgVHhUaHJvdWdocHV0ID0gJWQsIExhc3RUaHJvdWdocHV0ID0gJWRcbiIsDQorCQkJLy8JCXByaXYtPkN1cnJlbnRPcGVyYVJhdGUsIFR4VGhyb3VnaHB1dCwgcHJpdi0+TGFzdFR4VGhyb3VnaHB1dCk7CQkJDQorCQl9DQorCQllbHNlDQorCQl7DQorCQkJcHJpdi0+YlRyeXVwaW5nID0gZmFsc2U7DQorCQl9DQorCX0JDQorCWVsc2UgaWYgKEN1cnJTaWduYWxTdHJlbmd0aCA+IC00NyAmJiAoQ3VyclJldHJ5UmF0ZSA8IDUwKSkNCisJew0KKwkJLy8yRm9yIEhpZ2ggUG93ZXINCisJCS8vDQorCQkvLyBBZGRlZCBieSBSb2dlciwgMjAwNy4wNC4wOS4NCisJCS8vIFJldHVybiB0byBoaWdoZXN0IGRhdGEgcmF0ZSwgaWYgc2lnbmFsIHN0cmVuZ3RoIGlzIGdvb2QgZW5vdWdoLg0KKwkJLy8gU2lnbmFsU3RyZW5ndGggdGhyZXNob2xkKC01MGRibSkgaXMgZm9yIFJUTDgxODYuDQorCQkvLyBSZXZpc2UgU2lnbmFsU3RyZW5ndGggdGhyZXNob2xkIHRvIC01MWRibS4JDQorCQkvLw0KKwkJLy8gQWxzbyBuZWVkIHRvIGNoZWNrIHJldHJ5IHJhdGUgZm9yIHNhZmV0eSwgYnkgQnJ1Y2UsIDIwMDctMDYtMDUuDQorCQlpZihwcml2LT5DdXJyZW50T3BlcmFSYXRlICE9IHByaXYtPmllZWU4MDIxMS0+Y3VycmVudF9uZXR3b3JrLkhpZ2hlc3RPcGVyYVJhdGUgKQ0KKwkJew0KKwkJCWJUcnlVcCA9IHRydWU7DQorCQkJLy8gVXBncmFkZSBUeCBSYXRlIGRpcmVjdGx5Lg0KKwkJCXByaXYtPlRyeXVwaW5nQ291bnQgKz0gVHJ5VXBUaDsNCisJCX0NCisvLwkJcHJpbnRrKCJjYXNlMjogU3RhUmF0ZUFkYXB0aXZlODdTRTogUG93ZXIoJWQpIGlzIGhpZ2ggZW5vdWdoISEuIFxuIiwgQ3VyclNpZ25hbFN0cmVuZ3RoKTsJCQkNCisJCQkJCQ0KKwl9DQorCWVsc2UgaWYoQ3VyclR4b2tDbnQgPiA5ICYmIEN1cnJUeG9rQ250PCAxMDAgJiYgQ3VyclJldHJ5UmF0ZSA+PSA2MDApIA0KKwl7DQorCQkvLzIgRm9yIFNlcmlvdXMgUmV0cnkNCisJCS8vDQorCQkvLyBUcmFmZmljIGlzIG5vdCBidXN5IGJ1dCBvdXIgVHggcmV0cnkgaXMgc2VyaW91cy4gDQorCQkvLw0KKwkJYlRyeURvd24gPSB0cnVlOw0KKwkJLy8gTGV0IFJhdGUgTWVjaGFuaXNtIHRvIGRlZ3JhZGUgdHggcmF0ZSBkaXJlY3RseS4NCisJCXByaXYtPlRyeURvd25Db3VudExvd0RhdGEgKz0gVHJ5RG93blRoOw0KKy8vCQlwcmludGsoImNhc2UzOiBSQTogVHggUmV0cnkgaXMgc2VyaW91cy4gRGVncmFkZSBUeCBSYXRlIHRvICVkIGRpcmVjdGx5Li4uXG4iLCBwcml2LT5DdXJyZW50T3BlcmFSYXRlKTsJDQorCX0NCisJZWxzZSBpZiAoIHByaXYtPkN1cnJlbnRPcGVyYVJhdGUgPT0gMTA4ICkNCisJew0KKwkJLy8yRm9yIDU0TWJwcw0KKwkJLy8gQWlyIExpbmsNCisJCWlmICggKEN1cnJSZXRyeVJhdGU+MjYpJiYocHJpdi0+TGFzdFJldHJ5UmF0ZT4yNSkpDQorLy8JCWlmICggKEN1cnJSZXRyeVJhdGU+NDApJiYocHJpdi0+TGFzdFJldHJ5UmF0ZT4zOSkpDQorCQl7DQorCQkJLy9Eb3duIHRvIHJhdGUgNDhNYnBzLg0KKwkJCWJUcnlEb3duID0gdHJ1ZTsNCisJCX0NCisJCS8vIENhYmxlIExpbmsNCisJCWVsc2UgaWYgKCAoQ3VyclJldHJ5UmF0ZT4xNykmJihwcml2LT5MYXN0UmV0cnlSYXRlPjE2KSAmJiAoQ3VyclNpZ25hbFN0cmVuZ3RoID4gLTcyKSkgDQorLy8JCWVsc2UgaWYgKCAoQ3VyclJldHJ5UmF0ZT4xNykmJihwcml2LT5MYXN0UmV0cnlSYXRlPjE2KSAmJiAoQ3VyclNpZ25hbFN0cmVuZ3RoID4gLTcyKSkNCisJCXsNCisJCQkvL0Rvd24gdG8gcmF0ZSA0OE1icHMuDQorCQkJYlRyeURvd24gPSB0cnVlOw0KKwkJfQ0KKw0KKwkJaWYoYlRyeURvd24gJiYgKEN1cnJTaWduYWxTdHJlbmd0aCA8IC03NSkpIC8vY2FibGUgbGluaw0KKwkJew0KKwkJCXByaXYtPlRyeURvd25Db3VudExvd0RhdGEgKz0gVHJ5RG93blRoOw0KKwkJfQ0KKwkJLy9wcmludGsoImNhc2U0LS0tNTRNIFxuIik7CQ0KKw0KKwl9DQorCWVsc2UgaWYgKCBwcml2LT5DdXJyZW50T3BlcmFSYXRlID09IDk2ICkNCisJew0KKwkJLy8yRm9yIDQ4TWJwcw0KKwkJLy9BaXIgTGluaw0KKwkJaWYgKCAoKEN1cnJSZXRyeVJhdGU+NDgpICYmIChwcml2LT5MYXN0UmV0cnlSYXRlPjQ3KSkpDQorLy8JCWlmICggKChDdXJyUmV0cnlSYXRlPjY1KSAmJiAocHJpdi0+TGFzdFJldHJ5UmF0ZT42NCkpKQ0KKw0KKwkJewkNCisJCQkvL0Rvd24gdG8gcmF0ZSAzNk1icHMuDQorCQkJYlRyeURvd24gPSB0cnVlOw0KKwkJfQ0KKwkJLy9DYWJsZSBMaW5rDQorCQllbHNlIGlmICggKChDdXJyUmV0cnlSYXRlPjIxKSAmJiAocHJpdi0+TGFzdFJldHJ5UmF0ZT4yMCkpICYmIChDdXJyU2lnbmFsU3RyZW5ndGggPiAtNzQpKQ0KKwkJew0KKwkJCS8vRG93biB0byByYXRlIDM2TWJwcy4NCisJCQliVHJ5RG93biA9IHRydWU7DQorCQl9DQorCQllbHNlIGlmKChDdXJyUmV0cnlSYXRlPiAgKHByaXYtPkxhc3RSZXRyeVJhdGUgKyA1MCApKSAmJiAocHJpdi0+RmFpbFR4UmF0ZUNvdW50ID4yICkpDQorLy8JCWVsc2UgaWYoKEN1cnJSZXRyeVJhdGU+ICAocHJpdi0+TGFzdFJldHJ5UmF0ZSArIDcwICkpICYmIChwcml2LT5GYWlsVHhSYXRlQ291bnQgPjIgKSkNCisJCXsNCisJCQliVHJ5RG93biA9IHRydWU7DQorCQkJcHJpdi0+VHJ5RG93bkNvdW50TG93RGF0YSArPSBUcnlEb3duVGg7DQorCQl9DQorCQllbHNlIGlmICggKEN1cnJSZXRyeVJhdGU8OCkgJiYgKHByaXYtPkxhc3RSZXRyeVJhdGU8OCkgKSAvL1RPIERPOiBuZWVkIHRvIGNvbnNpZGVyIChSU1NJKQ0KKy8vCQllbHNlIGlmICggKEN1cnJSZXRyeVJhdGU8MjgpICYmIChwcml2LT5MYXN0UmV0cnlSYXRlPDgpICkgDQorCQl7DQorCQkJYlRyeVVwID0gdHJ1ZTsNCisJCX0NCisNCisJCWlmKGJUcnlEb3duICYmIChDdXJyU2lnbmFsU3RyZW5ndGggPCAtNzUpKQ0KKwkJew0KKwkJCXByaXYtPlRyeURvd25Db3VudExvd0RhdGEgKz0gVHJ5RG93blRoOw0KKwkJfQ0KKwkJLy9wcmludGsoImNhc2U1LS0tNDhNIFxuIik7CQ0KKwl9DQorCWVsc2UgaWYgKCBwcml2LT5DdXJyZW50T3BlcmFSYXRlID09IDcyICkNCisJew0KKwkJLy8yRm9yIDM2TWJwcw0KKwkJaWYgKCAoQ3VyclJldHJ5UmF0ZT40MykgJiYgKHByaXYtPkxhc3RSZXRyeVJhdGU+NDEpKSANCisvLwkJaWYgKCAoQ3VyclJldHJ5UmF0ZT42MCkgJiYgKHByaXYtPkxhc3RSZXRyeVJhdGU+NTkpKQ0KKwkJewkNCisJCQkvL0Rvd24gdG8gcmF0ZSAyNE1icHMuDQorCQkJYlRyeURvd24gPSB0cnVlOw0KKwkJfQ0KKwkJZWxzZSBpZigoQ3VyclJldHJ5UmF0ZT4gIChwcml2LT5MYXN0UmV0cnlSYXRlICsgNTAgKSkgJiYgKHByaXYtPkZhaWxUeFJhdGVDb3VudCA+MiApKQ0KKy8vCQllbHNlIGlmKChDdXJyUmV0cnlSYXRlPiAgKHByaXYtPkxhc3RSZXRyeVJhdGUgKyA3MCApKSAmJiAocHJpdi0+RmFpbFR4UmF0ZUNvdW50ID4yICkpDQorCQl7DQorCQkJYlRyeURvd24gPSB0cnVlOw0KKwkJCXByaXYtPlRyeURvd25Db3VudExvd0RhdGEgKz0gVHJ5RG93blRoOw0KKwkJfQ0KKwkJZWxzZSBpZiAoIChDdXJyUmV0cnlSYXRlPDE1KSAmJiAgKHByaXYtPkxhc3RSZXRyeVJhdGU8MTYpKSAvL1RPIERPOiBuZWVkIHRvIGNvbnNpZGVyIChSU1NJKQ0KKy8vCQllbHNlIGlmICggKEN1cnJSZXRyeVJhdGU8MzUpICYmICAocHJpdi0+TGFzdFJldHJ5UmF0ZTwzNikpDQorCQl7DQorCQkJYlRyeVVwID0gdHJ1ZTsNCisJCX0NCisNCisJCWlmKGJUcnlEb3duICYmIChDdXJyU2lnbmFsU3RyZW5ndGggPCAtODApKQ0KKwkJew0KKwkJCXByaXYtPlRyeURvd25Db3VudExvd0RhdGEgKz0gVHJ5RG93blRoOw0KKwkJfQ0KKwkJLy9wcmludGsoImNhc2U2LS0tMzZNIFxuIik7CQ0KKwl9DQorCWVsc2UgaWYgKCBwcml2LT5DdXJyZW50T3BlcmFSYXRlID09IDQ4ICkNCisJew0KKwkJLy8yRm9yIDI0TWJwcw0KKwkJLy8gQWlyIExpbmsNCisJCWlmICggKChDdXJyUmV0cnlSYXRlPjYzKSAmJiAocHJpdi0+TGFzdFJldHJ5UmF0ZT42MikpKQ0KKy8vCQlpZiAoICgoQ3VyclJldHJ5UmF0ZT44MykgJiYgKHByaXYtPkxhc3RSZXRyeVJhdGU+ODIpKSkNCisJCXsJDQorCQkJLy9Eb3duIHRvIHJhdGUgMThNYnBzLg0KKwkJCWJUcnlEb3duID0gdHJ1ZTsNCisJCX0NCisJCS8vQ2FibGUgTGluaw0KKwkJZWxzZSBpZiAoICgoQ3VyclJldHJ5UmF0ZT4zMykgJiYgKHByaXYtPkxhc3RSZXRyeVJhdGU+MzIpKSAmJiAoQ3VyclNpZ25hbFN0cmVuZ3RoID4gLTgyKSApDQorLy8JCSBlbHNlIGlmICggKChDdXJyUmV0cnlSYXRlPjUwKSAmJiAocHJpdi0+TGFzdFJldHJ5UmF0ZT40OSkpICYmIChDdXJyU2lnbmFsU3RyZW5ndGggPiAtODIpICkNCisJCXsNCisJCQkvL0Rvd24gdG8gcmF0ZSAxOE1icHMuDQorCQkJYlRyeURvd24gPSB0cnVlOw0KKwkJfQ0KKwkJZWxzZSBpZigoQ3VyclJldHJ5UmF0ZT4gIChwcml2LT5MYXN0UmV0cnlSYXRlICsgNTAgKSkgJiYgKHByaXYtPkZhaWxUeFJhdGVDb3VudCA+MiApKQ0KKy8vCQllbHNlIGlmKChDdXJyUmV0cnlSYXRlPiAgKHByaXYtPkxhc3RSZXRyeVJhdGUgKyA3MCApKSAmJiAocHJpdi0+RmFpbFR4UmF0ZUNvdW50ID4yICkpDQorDQorCQl7DQorCQkJYlRyeURvd24gPSB0cnVlOw0KKwkJCXByaXYtPlRyeURvd25Db3VudExvd0RhdGEgKz0gVHJ5RG93blRoOw0KKwkJfQ0KKyAgCQllbHNlIGlmICggKEN1cnJSZXRyeVJhdGU8MjApICYmIChwcml2LT5MYXN0UmV0cnlSYXRlPDIxKSkgLy9UTyBETzogbmVlZCB0byBjb25zaWRlciAoUlNTSSkNCisvLwkJZWxzZSBpZiAoIChDdXJyUmV0cnlSYXRlPDQwKSAmJiAocHJpdi0+TGFzdFJldHJ5UmF0ZTw0MSkpDQorCQl7CQ0KKwkJCWJUcnlVcCA9IHRydWU7CQ0KKwkJfQ0KKw0KKwkJaWYoYlRyeURvd24gJiYgKEN1cnJTaWduYWxTdHJlbmd0aCA8IC04MikpDQorCQl7DQorCQkJcHJpdi0+VHJ5RG93bkNvdW50TG93RGF0YSArPSBUcnlEb3duVGg7DQorCQl9DQorCQkvL3ByaW50aygiY2FzZTctLS0yNE0gXG4iKTsJDQorCX0NCisJZWxzZSBpZiAoIHByaXYtPkN1cnJlbnRPcGVyYVJhdGUgPT0gMzYgKQ0KKwl7DQorCQkvLzJGb3IgMThNYnBzDQorCQkvLyBvcmlnaW5hbCAoMTA5LCAxMDkpIA0KKwkJLy9bVFJDIERlbGwgTGFiXSAoOTAsIDkxKSwgSXNhaWFoIDIwMDgtMDItMTggMjM6MjQNCisJCS8vCQkJICAgICAoODUsIDg2KSwgSXNhaWFoIDIwMDgtMDItMTggMjQ6MDANCisJCWlmICggKChDdXJyUmV0cnlSYXRlPjg1KSAmJiAocHJpdi0+TGFzdFJldHJ5UmF0ZT44NikpKQ0KKy8vCQlpZiAoICgoQ3VyclJldHJ5UmF0ZT4xMTUpICYmIChwcml2LT5MYXN0UmV0cnlSYXRlPjExNikpKQ0KKwkJew0KKwkJCS8vRG93biB0byByYXRlIDExTWJwcy4NCisJCQliVHJ5RG93biA9IHRydWU7DQorCQl9DQorCQkvL1tUUkMgRGVsbCBMYWJdICBJc2FpYWggMjAwOC0wMi0xOCAyMzoyNA0KKwkJZWxzZSBpZigoQ3VyclJldHJ5UmF0ZT4gIChwcml2LT5MYXN0UmV0cnlSYXRlICsgNTAgKSkgJiYgKHByaXYtPkZhaWxUeFJhdGVDb3VudCA+MiApKQ0KKy8vCQllbHNlIGlmKChDdXJyUmV0cnlSYXRlPiAgKHByaXYtPkxhc3RSZXRyeVJhdGUgKyA3MCApKSAmJiAocHJpdi0+RmFpbFR4UmF0ZUNvdW50ID4yICkpDQorCQl7DQorCQkJYlRyeURvd24gPSB0cnVlOw0KKwkJCXByaXYtPlRyeURvd25Db3VudExvd0RhdGEgKz0gVHJ5RG93blRoOw0KKwkJfQ0KKwkJZWxzZSBpZiAoIChDdXJyUmV0cnlSYXRlPDIyKSAmJiAocHJpdi0+TGFzdFJldHJ5UmF0ZTwyMykpIC8vVE8gRE86IG5lZWQgdG8gY29uc2lkZXIgKFJTU0kpDQorLy8JCWVsc2UgaWYgKCAoQ3VyclJldHJ5UmF0ZTw0MikgJiYgKHByaXYtPkxhc3RSZXRyeVJhdGU8NDMpKQ0KKwkJewkNCisJCQliVHJ5VXAgPSB0cnVlOwkNCisJCX0NCisJCS8vcHJpbnRrKCJjYXNlOC0tLTE4TSBcbiIpOwkNCisJfQ0KKwllbHNlIGlmICggcHJpdi0+Q3VycmVudE9wZXJhUmF0ZSA9PSAyMiApDQorCXsNCisJCS8vMkZvciAxMU1icHMNCisJCWlmIChDdXJyUmV0cnlSYXRlPjk1KQ0KKy8vCQlpZiAoQ3VyclJldHJ5UmF0ZT4xNTUpDQorCQl7DQorCQkJYlRyeURvd24gPSB0cnVlOw0KKwkJfQ0KKwkJZWxzZSBpZiAoIChDdXJyUmV0cnlSYXRlPDI5KSAmJiAocHJpdi0+TGFzdFJldHJ5UmF0ZSA8MzApICkvL1RPIERPOiBuZWVkIHRvIGNvbnNpZGVyIChSU1NJKQ0KKy8vCQllbHNlIGlmICggKEN1cnJSZXRyeVJhdGU8NDkpICYmIChwcml2LT5MYXN0UmV0cnlSYXRlIDw1MCkgKQ0KKwkJCXsNCisJCQliVHJ5VXAgPSB0cnVlOw0KKwkJCX0NCisJCS8vcHJpbnRrKCJjYXNlOS0tLTExTSBcbiIpOwkNCisJCX0JDQorCWVsc2UgaWYgKCBwcml2LT5DdXJyZW50T3BlcmFSYXRlID09IDExICkNCisJew0KKwkJLy8yRm9yIDUuNU1icHMNCisJCWlmIChDdXJyUmV0cnlSYXRlPjE0OSkgDQorLy8JCWlmIChDdXJyUmV0cnlSYXRlPjE4OSkNCisJCXsJDQorCQkJYlRyeURvd24gPSB0cnVlOwkJCQ0KKwkJfQ0KKwkJZWxzZSBpZiAoIChDdXJyUmV0cnlSYXRlPDYwKSAmJiAocHJpdi0+TGFzdFJldHJ5UmF0ZSA8IDY1KSkNCisvLwkJZWxzZSBpZiAoIChDdXJyUmV0cnlSYXRlPDgwKSAmJiAocHJpdi0+TGFzdFJldHJ5UmF0ZSA8IDg1KSkNCisNCisJCQl7DQorCQkJYlRyeVVwID0gdHJ1ZTsNCisJCQl9CQkNCisJCS8vcHJpbnRrKCJjYXNlMTAtLS01LjVNIFxuIik7CQ0KKwkJfQ0KKwllbHNlIGlmICggcHJpdi0+Q3VycmVudE9wZXJhUmF0ZSA9PSA0ICkNCisJew0KKwkJLy8yRm9yIDIgTWJwcw0KKwkJaWYoKEN1cnJSZXRyeVJhdGU+OTkpICYmIChwcml2LT5MYXN0UmV0cnlSYXRlPjk5KSkNCisvLwkJaWYoKEN1cnJSZXRyeVJhdGU+MTk5KSAmJiAocHJpdi0+TGFzdFJldHJ5UmF0ZT4xOTkpKQ0KKwkJew0KKwkJCWJUcnlEb3duID0gdHJ1ZTsJCQkNCisJCX0NCisJCWVsc2UgaWYgKCAoQ3VyclJldHJ5UmF0ZSA8IDY1KSAmJiAocHJpdi0+TGFzdFJldHJ5UmF0ZSA8IDcwKSkNCisvLwkJZWxzZSBpZiAoIChDdXJyUmV0cnlSYXRlIDwgODUpICYmIChwcml2LT5MYXN0UmV0cnlSYXRlIDwgOTApKQ0KKwkJew0KKwkJCWJUcnlVcCA9IHRydWU7DQorCQl9DQorCQkvL3ByaW50aygiY2FzZTExLS0tMk0gXG4iKTsJDQorCX0NCisJZWxzZSBpZiAoIHByaXYtPkN1cnJlbnRPcGVyYVJhdGUgPT0gMiApDQorCXsNCisJCS8vMkZvciAxIE1icHMNCisJCWlmKCAoQ3VyclJldHJ5UmF0ZTw3MCkgJiYgKHByaXYtPkxhc3RSZXRyeVJhdGU8NzUpKQ0KKy8vCQlpZiggKEN1cnJSZXRyeVJhdGU8OTApICYmIChwcml2LT5MYXN0UmV0cnlSYXRlPDk1KSkNCisJCXsNCisJCQliVHJ5VXAgPSB0cnVlOw0KKwkJfQ0KKwkJLy9wcmludGsoImNhc2UxMi0tLTFNIFxuIik7CQ0KKwl9DQorDQorCWlmKGJUcnlVcCAmJiBiVHJ5RG93bikNCisgICAgCXByaW50aygiU3RhUmF0ZUFkYXB0aXZlODdCKCk6IFR4IFJhdGUgdHJpZWQgdXBwaW5nIGFuZCBkb3duaW5nIHNpbXVsdGFuZW91c2x5IVxuIik7DQorCQkJCQ0KKwkvLzEgVGVzdCBVcGdyYWRpbmcgVHggUmF0ZQ0KKwkvLyBTb21ldGltZXMgdGhlIGNhdXNlIG9mIHRoZSBsb3cgdGhyb3VnaHB1dCAoaGlnaCByZXRyeSByYXRlKSBpcyB0aGUgY29tcGF0aWJpbGl0eSBiZXR3ZWVuIHRoZSBBUCBhbmQgTklDLg0KKwkvLyBUbyB0ZXN0IGlmIHRoZSB1cHBlciByYXRlIG1heSBjYXVzZSBsb3dlciByZXRyeSByYXRlLCB0aGlzIG1lY2hhbmlzbSByYW5kb21seSBvY2N1cnMgdG8gdGVzdCB1cGdyYWRpbmcgdHggcmF0ZS4NCisJaWYoIWJUcnlVcCAmJiAhYlRyeURvd24gJiYgKHByaXYtPlRyeXVwaW5nQ291bnQgPT0gMCkgJiYgKHByaXYtPlRyeURvd25Db3VudExvd0RhdGEgPT0gMCkNCisJCSYmIHByaXYtPkN1cnJlbnRPcGVyYVJhdGUgIT0gcHJpdi0+aWVlZTgwMjExLT5jdXJyZW50X25ldHdvcmsuSGlnaGVzdE9wZXJhUmF0ZSAmJiBwcml2LT5GYWlsVHhSYXRlQ291bnQgPCAyKQ0KKwl7DQorCQlpZihqaWZmaWVzJSAoQ3VyclJldHJ5UmF0ZSArIDEwMSkgPT0gMCkNCisJCXsNCisJCQliVHJ5VXAgPSB0cnVlOwkNCisJCQlwcml2LT5iVHJ5dXBpbmcgPSB0cnVlOw0KKwkJCS8vcHJpbnRrKCJTdGFSYXRlQWRhcHRpdmU4N1NFKCk6IFJhbmRvbWx5IHRyeSB1cGdyYWRpbmcuLi5cbiIpOw0KKwkJfQ0KKwl9DQorDQorCS8vMSBSYXRlIE1lY2hhbmlzbQ0KKwlpZihiVHJ5VXApDQorCXsNCisJCXByaXYtPlRyeXVwaW5nQ291bnQrKzsNCisJCXByaXYtPlRyeURvd25Db3VudExvd0RhdGEgPSAwOw0KKwkJCQ0KKwkJew0KKy8vCQkJcHJpbnRrKCJVUDogcEhhbERhdGEtPlRyeXVwaW5nQ291bnQgPSAlZFxuIiwgcHJpdi0+VHJ5dXBpbmdDb3VudCk7DQorLy8JCQlwcmludGsoIlVQOiBUcnlVcFRoKCVkKSsgKEZhaWxUeFJhdGVDb3VudCglZCkpXjIgPSVkXG4iLCANCisvLwkJCQlUcnlVcFRoLCBwcml2LT5GYWlsVHhSYXRlQ291bnQsIChUcnlVcFRoICsgcHJpdi0+RmFpbFR4UmF0ZUNvdW50ICogcHJpdi0+RmFpbFR4UmF0ZUNvdW50KSApOw0KKy8vCQkJcHJpbnRrKCJVUDogcEhhbERhdGEtPmJUcnl1cGluZz0lZFxuIiwgIHByaXYtPmJUcnl1cGluZyk7DQorDQorCQl9DQorCQkNCisJCS8vDQorCQkvLyBDaGVjayBtb3JlIHRpbWVzIGlmIHdlIG5lZWQgdG8gdXBncmFkZSBpbmRlZWQuDQorCQkvLyBCZWNhdXNlIHRoZSBsYXJnZXN0IHZhbHVlIG9mIHBIYWxEYXRhLT5Ucnl1cGluZ0NvdW50IGlzIDB4RkZGRiBhbmQgDQorCQkvLyB0aGUgbGFyZ2VzdCB2YWx1ZSBvZiBwSGFsRGF0YS0+RmFpbFR4UmF0ZUNvdW50IGlzIDB4MTQsDQorCQkvLyB0aGlzIGNvbmRpdGlvbiB3aWxsIGJlIHNhdGlzZmllZCBhdCBtb3N0IGV2ZXJ5IDIgbWluLg0KKwkJLy8NCisNCisJCWlmKChwcml2LT5Ucnl1cGluZ0NvdW50ID4gKFRyeVVwVGggKyBwcml2LT5GYWlsVHhSYXRlQ291bnQgKiBwcml2LT5GYWlsVHhSYXRlQ291bnQpKSB8fA0KKwkJCShDdXJyU2lnbmFsU3RyZW5ndGggPiBwcml2LT5MYXN0RmFpbFR4UmF0ZVNTKSB8fCBwcml2LT5iVHJ5dXBpbmcpDQorCQl7DQorCQkJcHJpdi0+VHJ5dXBpbmdDb3VudCA9IDA7DQorCQkJLy8gDQorCQkJLy8gV2hlbiB0cmFuc2ZlcmluZyBmcm9tIENDSyB0byBPRkRNLCBESUcgaXMgYW4gaW1wb3J0YW50IGlzc3VlLg0KKwkJCS8vDQorCQkJaWYocHJpdi0+Q3VycmVudE9wZXJhUmF0ZSA9PSAyMikNCisJCQkJYlVwZGF0ZUluaXRpYWxHYWluID0gdHJ1ZTsNCisNCisJCQkvLyBUaGUgZGlmZmVyZW5jZSBpbiB0aHJvdWdocHV0IGJldHdlZW4gNDhNYnBzIGFuZCAzNk1icHMgaXMgOE0uDQorCQkJLy8gU28sIHdlIG11c3QgYmUgY2FyZWZ1bGx5IGluIHRoaXMgcmF0ZSBzY2FsZS4gSXNhaWFoIDIwMDgtMDItMTUuDQorCQkJLy8NCisJCQlpZiggICgocHJpdi0+Q3VycmVudE9wZXJhUmF0ZSA9PSA3MikgfHwgKHByaXYtPkN1cnJlbnRPcGVyYVJhdGUgPT0gNDgpIHx8IChwcml2LT5DdXJyZW50T3BlcmFSYXRlID09IDM2KSkgJiYNCisJCQkJKHByaXYtPkZhaWxUeFJhdGVDb3VudCA+IDIpICkNCisJCQkJcHJpdi0+UmF0ZUFkYXB0aXZlUGVyaW9kPSAoUkFURV9BREFQVElWRV9USU1FUl9QRVJJT0QvMik7DQorCQkJDQorCQkJLy8gKDEpVG8gYXZvaWQgdXBncmFkZSBmcmVxdWVudGx5IHRvIHRoZSBmYWlsIHR4IHJhdGUsIGFkZCB0aGUgRmFpbFR4UmF0ZUNvdW50IGludG8gdGhlIHRocmVzaG9sZC4NCisJCQkvLyAoMilJZiB0aGUgc2lnbmFsIHN0cmVuZ3RoIGlzIGluY3JlYXNlZCwgaXQgbWF5IGJlIGFibGUgdG8gdXBncmFkZS4NCisNCisJCQlwcml2LT5DdXJyZW50T3BlcmFSYXRlID0gR2V0VXBncmFkZVR4UmF0ZShkZXYsIHByaXYtPkN1cnJlbnRPcGVyYVJhdGUpOw0KKy8vCQkJcHJpbnRrKCJTdGFSYXRlQWRhcHRpdmU4N1NFKCk6IFVwZ3JhZGUgVHggUmF0ZSB0byAlZFxuIiwgcHJpdi0+Q3VycmVudE9wZXJhUmF0ZSk7DQorDQorCQkJLy9bVFJDIERlbGwgTGFiXSBCeXBhc3MgMTIvOS82LCBJc2FpYWggMjAwOC0wMi0xOCAyMDowMCANCisJCQlpZihwcml2LT5DdXJyZW50T3BlcmFSYXRlID09MzYpDQorCQkJew0KKwkJCQlwcml2LT5iVXBkYXRlQVJGUj10cnVlOw0KKwkJCQl3cml0ZV9uaWNfd29yZChkZXYsIEFSRlIsIDB4MEY4Rik7IC8vYnlwYXNzIDEyLzkvNg0KKy8vCQkJCXByaW50aygiVVA6IEFSRlI9MHhGOEZcbiIpOw0KKwkJCX0NCisJCQllbHNlIGlmKHByaXYtPmJVcGRhdGVBUkZSKQ0KKwkJCXsNCisJCQkJcHJpdi0+YlVwZGF0ZUFSRlI9ZmFsc2U7DQorCQkJCXdyaXRlX25pY193b3JkKGRldiwgQVJGUiwgMHgwRkZGKTsgLy9zZXQgMU0gfiA1NE1icHMuDQorLy8JCQkJcHJpbnRrKCJVUDogQVJGUj0weEZGRlxuIik7DQorCQkJfQ0KKwkJCQkNCisJCQkvLyBVcGRhdGUgRmFpbCBUeCByYXRlIGFuZCBjb3VudC4NCisJCQlpZihwcml2LT5MYXN0RmFpbFR4UmF0ZSAhPSBwcml2LT5DdXJyZW50T3BlcmFSYXRlKQ0KKwkJCXsNCisJCQkJcHJpdi0+TGFzdEZhaWxUeFJhdGUgPSBwcml2LT5DdXJyZW50T3BlcmFSYXRlOw0KKwkJCQlwcml2LT5GYWlsVHhSYXRlQ291bnQgPSAwOw0KKwkJCQlwcml2LT5MYXN0RmFpbFR4UmF0ZVNTID0gLTIwMDsgLy8gU2V0IGxvd2VzdCBwb3dlci4NCisJCQl9DQorCQl9DQorCX0NCisJZWxzZQ0KKwl7CQ0KKwkJaWYocHJpdi0+VHJ5dXBpbmdDb3VudCA+IDApDQorCQkJcHJpdi0+VHJ5dXBpbmdDb3VudCAtLTsNCisJfQ0KKwkNCisJaWYoYlRyeURvd24pDQorCXsNCisJCXByaXYtPlRyeURvd25Db3VudExvd0RhdGErKzsNCisJCXByaXYtPlRyeXVwaW5nQ291bnQgPSAwOw0KKwkJew0KKy8vCQkJcHJpbnRrKCJETjogcEhhbERhdGEtPlRyeURvd25Db3VudExvd0RhdGEgPSAlZFxuIixwcml2LT5UcnlEb3duQ291bnRMb3dEYXRhKTsNCisvLwkJCXByaW50aygiRE46IFRyeURvd25UaCA9JWRcbiIsIFRyeURvd25UaCk7DQorLy8JCQlwcmludGsoIkROOiBwSGFsRGF0YS0+YlRyeXVwaW5nPSVkXG4iLCAgcHJpdi0+YlRyeXVwaW5nKTsNCisJCX0NCisJCQkJCQkNCisJCS8vQ2hlY2sgaWYgVHggcmF0ZSBjYW4gYmUgZGVncmFkZWQgb3IgVGVzdCB0cnlpbmcgdXBncmFkaW5nIHNob3VsZCBmYWxsYmFjay4NCisJCWlmKHByaXYtPlRyeURvd25Db3VudExvd0RhdGEgPiBUcnlEb3duVGggfHwgcHJpdi0+YlRyeXVwaW5nKQ0KKwkJew0KKwkJCXByaXYtPlRyeURvd25Db3VudExvd0RhdGEgPSAwOw0KKwkJCXByaXYtPmJUcnl1cGluZyA9IGZhbHNlOw0KKwkJCS8vIFVwZGF0ZSBmYWlsIGluZm9ybWF0aW9uLg0KKwkJCWlmKHByaXYtPkxhc3RGYWlsVHhSYXRlID09IHByaXYtPkN1cnJlbnRPcGVyYVJhdGUpDQorCQkJew0KKwkJCQlwcml2LT5GYWlsVHhSYXRlQ291bnQgKys7DQorCQkJCS8vIFJlY29yZCB0aGUgVHggZmFpbCByYXRlIHNpZ25hbCBzdHJlbmd0aC4NCisJCQkJaWYoQ3VyclNpZ25hbFN0cmVuZ3RoID4gcHJpdi0+TGFzdEZhaWxUeFJhdGVTUykNCisJCQkJew0KKwkJCQkJcHJpdi0+TGFzdEZhaWxUeFJhdGVTUyA9IEN1cnJTaWduYWxTdHJlbmd0aDsNCisJCQkJfQ0KKwkJCX0NCisJCQllbHNlDQorCQkJew0KKwkJCQlwcml2LT5MYXN0RmFpbFR4UmF0ZSA9IHByaXYtPkN1cnJlbnRPcGVyYVJhdGU7DQorCQkJCXByaXYtPkZhaWxUeFJhdGVDb3VudCA9IDE7DQorCQkJCXByaXYtPkxhc3RGYWlsVHhSYXRlU1MgPSBDdXJyU2lnbmFsU3RyZW5ndGg7DQorCQkJfQ0KKwkJCXByaXYtPkN1cnJlbnRPcGVyYVJhdGUgPSBHZXREZWdyYWRlVHhSYXRlKGRldiwgcHJpdi0+Q3VycmVudE9wZXJhUmF0ZSk7DQorDQorCQkJLy8gUmVkdWNlIGNoYXJpb3QgdHJhaW5pbmcgdGltZSBhdCB3ZWFrIHNpZ25hbCBzdHJlbmd0aCBzaXR1YXRpb24uIFNEMyBFRCBkZW1hbmQuIA0KKwkJCS8vW1RSQyBEZWxsIExhYl0gUmV2aXNlIFNpZ25hbCBUaHJlc2hvbGQgZnJvbSAtNzUgdG8gLTgwICwgSXNhaWFoIDIwMDgtMDItMTggMjA6MDAgDQorCQkJaWYoIChDdXJyU2lnbmFsU3RyZW5ndGggPCAtODApICYmIChwcml2LT5DdXJyZW50T3BlcmFSYXRlID4gNzIgKSkNCisJCQl7DQorCQkJCXByaXYtPkN1cnJlbnRPcGVyYVJhdGUgPSA3MjsNCisvLwkJCQlwcmludGsoIkROOiB3ZWFrIHNpZ25hbCBzdHJlbmd0aCAoJWQpLCBkZWdyYWRlIHRvIDM2TWJwc1xuIiwgQ3VyclNpZ25hbFN0cmVuZ3RoKTsNCisJCQl9DQorDQorCQkJLy9bVFJDIERlbGwgTGFiXSBCeXBhc3MgMTIvOS82LCBJc2FpYWggMjAwOC0wMi0xOCAyMDowMCANCisJCQlpZihwcml2LT5DdXJyZW50T3BlcmFSYXRlID09MzYpDQorCQkJew0KKwkJCQlwcml2LT5iVXBkYXRlQVJGUj10cnVlOw0KKwkJCQl3cml0ZV9uaWNfd29yZChkZXYsIEFSRlIsIDB4MEY4Rik7IC8vYnlwYXNzIDEyLzkvNg0KKy8vCQkJCXByaW50aygiRE46IEFSRlI9MHhGOEZcbiIpOw0KKwkJCX0NCisJCQllbHNlIGlmKHByaXYtPmJVcGRhdGVBUkZSKQ0KKwkJCXsNCisJCQkJcHJpdi0+YlVwZGF0ZUFSRlI9ZmFsc2U7DQorCQkJCXdyaXRlX25pY193b3JkKGRldiwgQVJGUiwgMHgwRkZGKTsgLy9zZXQgMU0gfiA1NE1icHMuDQorLy8JCQkJcHJpbnRrKCJETjogQVJGUj0weEZGRlxuIik7DQorCQkJfQ0KKwkJCQkNCisJCQkvLw0KKwkJCS8vIFdoZW4gaXQgaXMgQ0NLIHJhdGUsIGl0IG1heSBuZWVkIHRvIHVwZGF0ZSBpbml0aWFsIGdhaW4gdG8gcmVjZWl2ZSBsb3dlciBwb3dlciBwYWNrZXRzLg0KKwkJCS8vDQorCQkJaWYoTWdudElzQ2NrUmF0ZShwcml2LT5DdXJyZW50T3BlcmFSYXRlKSkNCisJCQl7DQorCQkJCWJVcGRhdGVJbml0aWFsR2FpbiA9IHRydWU7DQorCQkJfQ0KKy8vCQkJcHJpbnRrKCJTdGFSYXRlQWRhcHRpdmU4N1NFKCk6IERlZ3JhZGUgVHggUmF0ZSB0byAlZFxuIiwgcHJpdi0+Q3VycmVudE9wZXJhUmF0ZSk7DQorCQl9DQorCX0NCisJZWxzZQ0KKwl7DQorCQlpZihwcml2LT5UcnlEb3duQ291bnRMb3dEYXRhID4gMCkNCisJCQlwcml2LT5UcnlEb3duQ291bnRMb3dEYXRhIC0tOw0KKwl9DQorCQkJDQorCS8vIEtlZXAgdGhlIFR4IGZhaWwgcmF0ZSBjb3VudCB0byBlcXVhbCB0byAweDE1IGF0IG1vc3QuDQorCS8vIFJlZHVjZSB0aGUgZmFpbCBjb3VudCBhdCBsZWFzdCB0byAxMCBzZWMgaWYgdHggcmF0ZSBpcyB0ZW5kaW5nIHN0YWJsZS4NCisJaWYocHJpdi0+RmFpbFR4UmF0ZUNvdW50ID49IDB4MTUgfHwgDQorCQkoIWJUcnlVcCAmJiAhYlRyeURvd24gJiYgcHJpdi0+VHJ5RG93bkNvdW50TG93RGF0YSA9PSAwICYmIHByaXYtPlRyeXVwaW5nQ291bnQgJiYgcHJpdi0+RmFpbFR4UmF0ZUNvdW50ID4gMHg2KSkNCisJew0KKwkJcHJpdi0+RmFpbFR4UmF0ZUNvdW50IC0tOw0KKwl9CQkNCisNCisNCisJT2ZkbVR4UHdySWR4ICA9IHByaXYtPmNodHhwd3Jfb2ZkbVtwcml2LT5pZWVlODAyMTEtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsXTsgDQorCUNja1R4UHdySWR4ICA9IHByaXYtPmNodHhwd3JbcHJpdi0+aWVlZTgwMjExLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbF07IA0KKwkNCisJLy9bVFJDIERlbGwgTGFiXSBNYWMweDllIGluY3JlYXNlIDIgbGV2ZWwgaW4gMzZNfjE4TSBzaXR1YXRpb24sIElzYWlhaCAyMDA4LTAyLTE4IDI0OjAwIA0KKwlpZigocHJpdi0+Q3VycmVudE9wZXJhUmF0ZSA8IDk2KSAmJihwcml2LT5DdXJyZW50T3BlcmFSYXRlID4gMjIpKQ0KKwl7DQorCQl1MWJDY2sgPSByZWFkX25pY19ieXRlKGRldiwgQ0NLX1RYQUdDKTsNCisJCXUxYk9mZG0gPSByZWFkX25pY19ieXRlKGRldiwgT0ZETV9UWEFHQyk7DQorDQorCQkvLyBjYXNlIDE6IE5ldmVyIGVudGVyIEhpZ2ggcG93ZXINCisJCWlmKHUxYkNjayA9PSBDY2tUeFB3cklkeCApDQorCQl7DQorCQkJaWYodTFiT2ZkbSAhPSAoT2ZkbVR4UHdySWR4KzIpICkNCisJCQl7DQorCQkJcHJpdi0+YkVuaGFuY2VUeFB3cj0gdHJ1ZTsNCisJCQl1MWJPZmRtID0gKCh1MWJPZmRtKzIpID4gMzUpID8gMzU6ICh1MWJPZmRtKzIpOw0KKwkJCXdyaXRlX25pY19ieXRlKGRldiwgT0ZETV9UWEFHQywgdTFiT2ZkbSk7DQorLy8JCQlwcmludGsoIkVuaGFuY2UgT0ZETV9UWEFHQyA6ICsrKysrIHUxYk9mZG09IDB4JXhcbiIsIHUxYk9mZG0pOw0KKwkJCX0NCisJCX0NCisJCS8vIGNhc2UgMjogZW50ZXIgaGlnaCBwb3dlcg0KKwkJZWxzZSBpZih1MWJDY2sgPCBDY2tUeFB3cklkeCkNCisJCXsNCisJCQlpZighcHJpdi0+YkVuaGFuY2VUeFB3cikNCisJCQl7DQorCQkJCXByaXYtPmJFbmhhbmNlVHhQd3I9IHRydWU7DQorCQkJCXUxYk9mZG0gPSAoKHUxYk9mZG0rMikgPiAzNSkgPyAzNTogKHUxYk9mZG0rMik7DQorCQkJCXdyaXRlX25pY19ieXRlKGRldiwgT0ZETV9UWEFHQywgdTFiT2ZkbSk7DQorCQkJCS8vUlRfVFJBQ0UoQ09NUF9SQVRFLCBEQkdfVFJBQ0UsICgiRW5oYW5jZSBPRkRNX1RYQUdDKDIpIDogKysrKysgdTFiT2ZkbT0gMHgleFxuIiwgdTFiT2ZkbSkpOw0KKwkJCX0NCisJCX0NCisJfQ0KKwllbHNlIGlmKHByaXYtPmJFbmhhbmNlVHhQd3IpICAvLzU0LzQ4LzExLzUuNS8yLzENCisJew0KKwkJdTFiQ2NrID0gcmVhZF9uaWNfYnl0ZShkZXYsIENDS19UWEFHQyk7DQorCQl1MWJPZmRtID0gcmVhZF9uaWNfYnl0ZShkZXYsIE9GRE1fVFhBR0MpOw0KKw0KKwkJLy8gY2FzZSAxOiBOZXZlciBlbnRlciBIaWdoIHBvd2VyDQorCQlpZih1MWJDY2sgPT0gQ2NrVHhQd3JJZHggKQ0KKwkJew0KKwkJcHJpdi0+YkVuaGFuY2VUeFB3cj0gZmFsc2U7DQorCQl3cml0ZV9uaWNfYnl0ZShkZXYsIE9GRE1fVFhBR0MsIE9mZG1UeFB3cklkeCk7DQorCQkvL3ByaW50aygiUmVjb3ZlciBPRkRNX1RYQUdDIDogPT09PT0gdTFiT2ZkbT0gMHgleFxuIiwgT2ZkbVR4UHdySWR4KTsNCisJCX0NCisJCS8vIGNhc2UgMjogZW50ZXIgaGlnaCBwb3dlcg0KKwkJZWxzZSBpZih1MWJDY2sgPCBDY2tUeFB3cklkeCkNCisJCXsNCisJCQlwcml2LT5iRW5oYW5jZVR4UHdyPSBmYWxzZTsNCisJCQl1MWJPZmRtID0gKCh1MWJPZmRtLTIpID4gMCkgPyAodTFiT2ZkbS0yKTogMDsNCisJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIE9GRE1fVFhBR0MsIHUxYk9mZG0pOw0KKwkJCS8vUlRfVFJBQ0UoQ09NUF9SQVRFLCBEQkdfVFJBQ0UsICgiUmVjb3ZlciBPRkRNX1RYQUdDKDIpOiA9PT09PSB1MWJPZmRtPSAweCV4XG4iLCB1MWJPZmRtKSk7DQorDQorCQl9DQorCX0NCisNCisJLy8NCisJLy8gV2UgbmVlZCB1cGRhdGUgaW5pdGlhbCBnYWluIHdoZW4gd2Ugc2V0IHR4IHJhdGUgImZyb20gT0ZETSB0byBDQ0siIG9yDQorCS8vICJmcm9tIENDSyB0byBPRkRNIi4gDQorCS8vDQorU2V0SW5pdGlhbEdhaW46DQorCWlmKGJVcGRhdGVJbml0aWFsR2FpbikNCisJew0KKwkJaWYoTWdudElzQ2NrUmF0ZShwcml2LT5DdXJyZW50T3BlcmFSYXRlKSkgLy8gQ0NLDQorCQl7DQorCQkJaWYocHJpdi0+SW5pdGlhbEdhaW4gPiBwcml2LT5SZWdCTW9kZUdhaW5TdGFnZSkNCisJCQl7DQorCQkJCXByaXYtPkluaXRpYWxHYWluQmFja1VwPSBwcml2LT5Jbml0aWFsR2FpbjsNCisNCisJCQkJaWYoQ3VyclNpZ25hbFN0cmVuZ3RoIDwgLTg1KSAvLyBMb3cgcG93ZXIsIE9GRE0gWzB4MTddID0gMjYuDQorCQkJCXsNCisJCQkJCS8vU0QzIFNZcyBzdWdnZXN0IHRoYXQgQ3VyclNpZ25hbFN0cmVuZ3RoIDwgLTY1LCBvZmRtIDB4MTc9MjYuDQorCQkJCQlwcml2LT5Jbml0aWFsR2FpbiA9IHByaXYtPlJlZ0JNb2RlR2FpblN0YWdlOw0KKwkJCQl9DQorCQkJCWVsc2UgaWYocHJpdi0+SW5pdGlhbEdhaW4gPiBwcml2LT5SZWdCTW9kZUdhaW5TdGFnZSArIDEpDQorCQkJCXsNCisJCQkJCXByaXYtPkluaXRpYWxHYWluIC09IDI7DQorCQkJCX0NCisJCQkJZWxzZQ0KKwkJCQl7DQorCQkJCQlwcml2LT5Jbml0aWFsR2FpbiAtLTsNCisJCQkJfQ0KKwkJCQlwcmludGsoIlN0YVJhdGVBZGFwdGl2ZTg3U0UoKTogdXBkYXRlIGluaXRfZ2FpbiB0byBpbmRleCAlZCBmb3IgZGF0ZSByYXRlICVkXG4iLHByaXYtPkluaXRpYWxHYWluLCBwcml2LT5DdXJyZW50T3BlcmFSYXRlKTsJCQkNCisJCQkJVXBkYXRlSW5pdGlhbEdhaW4oZGV2KTsNCisJCQl9DQorCQl9DQorCQllbHNlIC8vIE9GRE0NCisJCXsJCQkNCisJCQlpZihwcml2LT5Jbml0aWFsR2FpbiA8IDQpDQorCQkJew0KKwkJCQlwcml2LT5Jbml0aWFsR2FpbkJhY2tVcD0gcHJpdi0+SW5pdGlhbEdhaW47DQorDQorCQkJCXByaXYtPkluaXRpYWxHYWluICsrOw0KKwkJCQlwcmludGsoIlN0YVJhdGVBZGFwdGl2ZTg3U0UoKTogdXBkYXRlIGluaXRfZ2FpbiB0byBpbmRleCAlZCBmb3IgZGF0ZSByYXRlICVkXG4iLHByaXYtPkluaXRpYWxHYWluLCBwcml2LT5DdXJyZW50T3BlcmFSYXRlKTsJCQkNCisJCQkJVXBkYXRlSW5pdGlhbEdhaW4oZGV2KTsNCisJCQl9CQkJCQkNCisJCX0NCisJfQ0KKw0KKwkvL1JlY29yZCB0aGUgcmVsYXRlZCBpbmZvDQorCXByaXYtPkxhc3RSZXRyeVJhdGUgPSBDdXJyUmV0cnlSYXRlOw0KKwlwcml2LT5MYXN0VHhUaHJvdWdocHV0ID0gVHhUaHJvdWdocHV0Ow0KKwlwcml2LT5pZWVlODAyMTEtPnJhdGUgPSBwcml2LT5DdXJyZW50T3BlcmFSYXRlICogNTsNCit9DQorDQorI2VuZGlmDQorI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PUtFUk5FTF9WRVJTSU9OKDIsNiwyMCkNCit2b2lkIHJ0bDgxODBfcmF0ZV9hZGFwdGVyKHN0cnVjdCB3b3JrX3N0cnVjdCAqIHdvcmspDQorew0KKwlzdHJ1Y3QgZGVsYXllZF93b3JrICpkd29yayA9IGNvbnRhaW5lcl9vZih3b3JrLHN0cnVjdCBkZWxheWVkX3dvcmssd29yayk7DQorICAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSA9IGNvbnRhaW5lcl9vZihkd29yayxzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSxyYXRlX2FkYXB0ZXJfd3EpOw0KKyAgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGllZWUtPmRldjsNCisjZWxzZQ0KK3ZvaWQgcnRsODE4MF9yYXRlX2FkYXB0ZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldikNCit7DQorDQorI2VuZGlmDQorICAgICAgICAvL3N0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsNCisvLyAgICBETUVTRygiLS0tLT5ydGw4MTgwX3JhdGVfYWRhcHRlciIpOw0KKyAgICAgICAgU3RhUmF0ZUFkYXB0aXZlODdTRShkZXYpOw0KKy8vICAgRE1FU0coIjwtLS0tcnRsODE4MF9yYXRlX2FkYXB0ZXIiKTsNCit9DQordm9pZCB0aW1lcl9yYXRlX2FkYXB0aXZlKHVuc2lnbmVkIGxvbmcgZGF0YSkNCit7DQorCXN0cnVjdCByODE4MF9wcml2KiBwcml2ID0gaWVlZTgwMjExX3ByaXYoKHN0cnVjdCBuZXRfZGV2aWNlICopZGF0YSk7DQorCS8vRE1FU0coIi0tLS0+dGltZXJfcmF0ZV9hZGFwdGl2ZSgpXG4iKTsNCisJaWYoIXByaXYtPnVwKQ0KKwl7DQorLy8JCURNRVNHKCI8LS0tLXRpbWVyX3JhdGVfYWRhcHRpdmUoKTpkcml2ZXIgaXMgbm90IHVwIVxuIik7DQorCQlyZXR1cm47DQorCX0NCisJaWYoKHByaXYtPmllZWU4MDIxMS0+aXdfbW9kZSAhPSBJV19NT0RFX01BU1RFUikNCisJCQkmJiAocHJpdi0+aWVlZTgwMjExLT5zdGF0ZSA9PSBJRUVFODAyMTFfTElOS0VEKSAmJg0KKwkJCShwcml2LT5Gb3JjZWREYXRhUmF0ZSA9PSAwKSApDQorCXsNCisvLwlETUVTRygidGltZXJfcmF0ZV9hZGFwdGl2ZSgpOnNjaGVkdWxlIHJhdGVfYWRhcHRlcl93cVxuIik7DQorI2lmZGVmIENPTkZJR19SVEw4MThYX1MNCisJCXF1ZXVlX3dvcmsocHJpdi0+aWVlZTgwMjExLT53cSwgKHZvaWQgKikmcHJpdi0+aWVlZTgwMjExLT5yYXRlX2FkYXB0ZXJfd3EpOw0KKy8vCQlTdGFSYXRlQWRhcHRpdmU4N1NFKChzdHJ1Y3QgbmV0X2RldmljZSAqKWRhdGEpOw0KKyNlbmRpZg0KKwl9DQorCXByaXYtPnJhdGVhZGFwdGVyX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgTVNFQ1MocHJpdi0+UmF0ZUFkYXB0aXZlUGVyaW9kKTsNCisJYWRkX3RpbWVyKCZwcml2LT5yYXRlYWRhcHRlcl90aW1lcik7DQorCS8vRE1FU0coIjwtLS0tdGltZXJfcmF0ZV9hZGFwdGl2ZSgpXG4iKTsNCit9DQorLy9ieSBhbXkgMDgwMzEyfQ0KK3ZvaWQNCitTd0FudGVubmFEaXZlcnNpdHlSeE9rODE4NSgNCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgDQorCXU4IFNpZ25hbFN0cmVuZ3RoDQorCSkNCit7DQorCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gKHN0cnVjdCByODE4MF9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsNCisNCisvLwlwcmludGsoIitTd0FudGVubmFEaXZlcnNpdHlSeE9rODE4NTogUnhTczogJWRcbiIsIFNpZ25hbFN0cmVuZ3RoKTsNCisNCisJcHJpdi0+QWRSeE9rQ250Kys7DQorDQorCWlmKCBwcml2LT5BZFJ4U2lnbmFsU3RyZW5ndGggIT0gLTEpDQorCXsNCisJCXByaXYtPkFkUnhTaWduYWxTdHJlbmd0aCA9ICgocHJpdi0+QWRSeFNpZ25hbFN0cmVuZ3RoKjcpICsgKFNpZ25hbFN0cmVuZ3RoKjMpKSAvIDEwOw0KKwl9DQorCWVsc2UNCisJeyAvLyBJbml0aWFsaXphdGlvbiBjYXNlLg0KKwkJcHJpdi0+QWRSeFNpZ25hbFN0cmVuZ3RoID0gU2lnbmFsU3RyZW5ndGg7DQorCX0NCisvL3srYnkgYW15IDA4MDMxMg0KKwlpZiggcHJpdi0+TGFzdFJ4UGt0QW50ZW5uYSApIC8vTWFpbiBhbnRlbm5hLgkNCisJCXByaXYtPkFkTWFpbkFudGVubmFSeE9rQ250Kys7CQ0KKwllbHNlCSAvLyBBdXggYW50ZW5uYS4NCisJCXByaXYtPkFkQXV4QW50ZW5uYVJ4T2tDbnQrKzsNCisvLytieSBhbXkgMDgwMzEyDQorLy8JcHJpbnRrKCItU3dBbnRlbm5hRGl2ZXJzaXR5UnhPazgxODU6IEFkUnhPa0NudDogJWQgQWRSeFNpZ25hbFN0cmVuZ3RoOiAlZFxuIiwgcHJpdi0+QWRSeE9rQ250LCBwcml2LT5BZFJ4U2lnbmFsU3RyZW5ndGgpOw0KK30NCisvLw0KKy8vCURlc2NyaXB0aW9uOg0KKy8vCQlDaGFuZ2UgQW50ZW5uYSBTd2l0Y2guDQorLy8NCitib29sDQorU2V0QW50ZW5uYTgxODUoDQorCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYsDQorCXU4CQl1MWJBbnRlbm5hSW5kZXgNCisJKQ0KK3sNCisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTgwX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOw0KKwlib29sIGJBbnRlbm5hU3dpdGNoZWQgPSBmYWxzZTsNCisNCisvLwlwcmludGsoIitTZXRBbnRlbm5hODE4NSgpOiBBbnRlbm5hIGlzIHN3aXRjaGluZyB0bzogJWQgXG4iLCB1MWJBbnRlbm5hSW5kZXgpOw0KKw0KKwlzd2l0Y2godTFiQW50ZW5uYUluZGV4KQ0KKwl7DQorCWNhc2UgMDoNCisJCXN3aXRjaChwcml2LT5yZl9jaGlwKQ0KKwkJew0KKwkJY2FzZSBSRl9aRUJSQTI6DQorCQljYXNlIFJGX1pFQlJBNDoNCisjaWZkZWYgQ09ORklHX1JUTDgxODVCDQorI2lmZGVmIENPTkZJR19SVEw4MThYX1MNCisJCQkvLyBNYWMgcmVnaXN0ZXIsIG1haW4gYW50ZW5uYQ0KKwkJCXdyaXRlX25pY19ieXRlKGRldiwgQU5UU0VMLCAweDAzKTsgDQorCQkJLy9iYXNlIGJhbmQNCisJCQl3cml0ZV9waHlfY2NrKGRldiwweDExLCAweDliKTsgLy8gQ29uZmlnIENDSyBSWCBhbnRlbm5hLg0KKwkJCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgwZCwgMHg1Yyk7IC8vIENvbmZpZyBPRkRNIFJYIGFudGVubmEuDQorDQorI2Vsc2UNCisJCQkvLyBNYWMgcmVnaXN0ZXIsIG1haW4gYW50ZW5uYQ0KKwkJCXdyaXRlX25pY19ieXRlKGRldiwgQU5UU0VMLCAweDAzKTsgDQorCQkJLy9iYXNlIGJhbmQNCisJCQl3cml0ZV9waHlfY2NrKGRldiwgMHgxMCwgMHg5Yik7IC8vIENvbmZpZyBDQ0sgUlggYW50ZW5uYS4NCisJCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MGQsIDB4NWMpOyAvLyBDb25maWcgT0ZETSBSWCBhbnRlbm5hLg0KKyNlbmRpZg0KKyNlbmRpZg0KKw0KKwkJCWJBbnRlbm5hU3dpdGNoZWQgPSB0cnVlOw0KKwkJCWJyZWFrOw0KKw0KKwkJZGVmYXVsdDoNCisJCQlwcmludGsoIlNldEFudGVubmE4MTg1OiB1bmtvd24gUkZDaGlwSUQoJWQpXG4iLCBwcml2LT5yZl9jaGlwKTsNCisJCQlicmVhazsNCisJCX0NCisJCWJyZWFrOw0KKw0KKwljYXNlIDE6DQorCQlzd2l0Y2gocHJpdi0+cmZfY2hpcCkNCisJCXsNCisJCWNhc2UgUkZfWkVCUkEyOg0KKwkJY2FzZSBSRl9aRUJSQTQ6DQorI2lmZGVmIENPTkZJR19SVEw4MTg1Qg0KKyNpZmRlZiBDT05GSUdfUlRMODE4WF9TDQorCQkJLy8gTWFjIHJlZ2lzdGVyLCBhdXggYW50ZW5uYQ0KKwkJCXdyaXRlX25pY19ieXRlKGRldiwgQU5UU0VMLCAweDAwKTsgDQorCQkJLy9iYXNlIGJhbmQNCisJCQl3cml0ZV9waHlfY2NrKGRldiwgMHgxMSwgMHhiYik7IC8vIENvbmZpZyBDQ0sgUlggYW50ZW5uYS4NCisJCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MGQsIDB4NTQpOyAvLyBDb25maWcgT0ZETSBSWCBhbnRlbm5hLg0KKyNlbHNlDQorCQkJLy8gTWFjIHJlZ2lzdGVyLCBhdXggYW50ZW5uYQ0KKwkJCXdyaXRlX25pY19ieXRlKGRldiwgQU5UU0VMLCAweDAwKTsgDQorCQkJLy9iYXNlIGJhbmQNCisJCQl3cml0ZV9waHlfY2NrKGRldiwgMHgxMCwgMHhiYik7IC8vIENvbmZpZyBDQ0sgUlggYW50ZW5uYS4NCisJCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MGQsIDB4NTQpOyAvLyBDb25maWcgT0ZETSBSWCBhbnRlbm5hLg0KKyNlbmRpZg0KKyNlbmRpZg0KKw0KKwkJCWJBbnRlbm5hU3dpdGNoZWQgPSB0cnVlOw0KKwkJCWJyZWFrOw0KKw0KKwkJZGVmYXVsdDoNCisJCQlwcmludGsoIlNldEFudGVubmE4MTg1OiB1bmtvd24gUkZDaGlwSUQoJWQpXG4iLCBwcml2LT5yZl9jaGlwKTsNCisJCQlicmVhazsNCisJCX0NCisJCWJyZWFrOw0KKw0KKwlkZWZhdWx0Og0KKwkJcHJpbnRrKCJTZXRBbnRlbm5hODE4NTogdW5rb3duIHUxYkFudGVubmFJbmRleCglZClcbiIsIHUxYkFudGVubmFJbmRleCk7DQorCQlicmVhazsNCisJfQ0KKw0KKwlpZihiQW50ZW5uYVN3aXRjaGVkKQ0KKwl7DQorCQlwcml2LT5DdXJyQW50ZW5uYUluZGV4ID0gdTFiQW50ZW5uYUluZGV4Ow0KKwl9DQorDQorLy8JcHJpbnRrKCItU2V0QW50ZW5uYTgxODUoKTogcmV0dXJuICglI1gpXG4iLCBiQW50ZW5uYVN3aXRjaGVkKTsNCisNCisJcmV0dXJuIGJBbnRlbm5hU3dpdGNoZWQ7DQorfQ0KKy8vDQorLy8JRGVzY3JpcHRpb246DQorLy8JCVRvZ2dsZSBBbnRlbm5hIHN3aXRjaC4NCisvLw0KK2Jvb2wNCitTd2l0Y2hBbnRlbm5hKA0KKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2DQorCSkNCit7DQorCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gKHN0cnVjdCByODE4MF9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsNCisNCisJYm9vbAkJYlJlc3VsdDsNCisNCisJaWYocHJpdi0+Q3VyckFudGVubmFJbmRleCA9PSAwKQ0KKwl7DQorI2lmIDAvL2x6bSBkZWwgMDgwODI2DQorLy9ieSBhbXkgMDgwMzEyDQorI2lmZGVmIENPTkZJR19SVEw4MThYX1MNCisJCWlmKHByaXYtPmJTd0FudGVubmFEaXZlcml0eSkNCisJCQliUmVzdWx0ID0gU2V0QW50ZW5uYUNvbmZpZzg3U0UoZGV2LCAxLCB0cnVlKTsNCisJCWVsc2UJCQkNCisjZW5kaWYNCisjZW5kaWYNCisJCQliUmVzdWx0ID0gU2V0QW50ZW5uYTgxODUoZGV2LCAxKTsNCisvL2J5IGFteSAwODAzMTINCisvLwkJcHJpbnRrKCJTd2l0Y2hBbnRlbm5hKCk6IHN3aXRjaGluZyB0byBhbnRlbm5hIDEgLi4uLi4uXG4iKTsNCisvLwkJYlJlc3VsdCA9IFNldEFudGVubmE4MTg1KGRldiwgMSk7Ly8tYnkgYW15IDA4MDMxMg0KKwl9DQorCWVsc2UNCisJew0KKyNpZiAwLy9sem0gZGVsIDA4MDgyNg0KKy8vYnkgYW15IDA4MDMxMg0KKyNpZmRlZiBDT05GSUdfUlRMODE4WF9TDQorCQlpZihwcml2LT5iU3dBbnRlbm5hRGl2ZXJpdHkpDQorCQkJYlJlc3VsdCA9IFNldEFudGVubmFDb25maWc4N1NFKGRldiwgMCwgdHJ1ZSk7DQorCQllbHNlCQ0KKyNlbmRpZg0KKyNlbmRpZg0KKwkJCWJSZXN1bHQgPSBTZXRBbnRlbm5hODE4NShkZXYsIDApOw0KKy8vYnkgYW15IDA4MDMxMg0KKy8vCQlwcmludGsoIlN3aXRjaEFudGVubmEoKTogc3dpdGNoaW5nIHRvIGFudGVubmEgMCAuLi4uLi5cbiIpOw0KKy8vCQliUmVzdWx0ID0gU2V0QW50ZW5uYTgxODUoZGV2LCAwKTsvLy1ieSBhbXkgMDgwMzEyDQorCX0NCisNCisJcmV0dXJuIGJSZXN1bHQ7DQorfQ0KKy8vDQorLy8JRGVzY3JpcHRpb246DQorLy8JCUVuZ2luZSBvZiBTVyBBbnRlbm5hIERpdmVyc2l0eSBtZWNoYW5pc20uDQorLy8JCVNpbmNlIDgxODcgaGFzIG5vIFR4IHBhcnQgaW5mb3JtYXRpb24sIA0KKy8vCQl0aGlzIGltcGxlbWVudGF0aW9uIGlzIG9ubHkgZGVwZW5kZW5kIG9uIFJ4IHBhcnQgaW5mb3JtYXRpb24uIA0KKy8vDQorLy8JMjAwNi4wNC4xNywgYnkgcmNuamtvLg0KKy8vDQordm9pZA0KK1N3QW50ZW5uYURpdmVyc2l0eSgNCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldg0KKwkpDQorew0KKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxODBfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7DQorCWJvb2wgICBiU3dDaGVja1NTPWZhbHNlOw0KKy8vCXByaW50aygiK1N3QW50ZW5uYURpdmVyc2l0eSgpOiBDdXJyQW50ZW5uYUluZGV4OiAlZFxuIiwgcHJpdi0+Q3VyckFudGVubmFJbmRleCk7DQorLy8JcHJpbnRrKCJBZFRpY2tDb3VudCBpcyAlZFxuIixwcml2LT5BZFRpY2tDb3VudCk7DQorLy9ieSBhbXkgMDgwMzEyDQorCWlmKGJTd0NoZWNrU1MpDQorCXsNCisJCXByaXYtPkFkVGlja0NvdW50Kys7DQorCQ0KKwkJcHJpbnRrKCIoMSkgQWRUaWNrQ291bnQ6ICVkLCBBZENoZWNrUGVyaW9kOiAlZFxuIiwgDQorCQkJcHJpdi0+QWRUaWNrQ291bnQsIHByaXYtPkFkQ2hlY2tQZXJpb2QpOw0KKwkJcHJpbnRrKCIoMikgQWRSeFNpZ25hbFN0cmVuZ3RoOiAlbGQsIEFkUnhTc1RocmVzaG9sZDogJWxkXG4iLCANCisJCQlwcml2LT5BZFJ4U2lnbmFsU3RyZW5ndGgsIHByaXYtPkFkUnhTc1RocmVzaG9sZCk7DQorCX0NCisvLwlwcml2LT5BZFRpY2tDb3VudCsrOy8vLWJ5IGFteSAwODAzMTINCisJDQorCS8vIENhc2UgMS4gTm8gTGluay4NCisJaWYocHJpdi0+aWVlZTgwMjExLT5zdGF0ZSAhPSBJRUVFODAyMTFfTElOS0VEKQ0KKwl7DQorCS8vCXByaW50aygiU3dBbnRlbm5hRGl2ZXJzaXR5KCk6IENhc2UgMS4gTm8gTGluay5cbiIpOw0KKw0KKwkJcHJpdi0+YkFkU3dpdGNoZWRDaGVja2luZyA9IGZhbHNlOw0KKwkJLy8gSSBzd2l0Y2ggYW50ZW5uYSBoZXJlIHRvIHByZXZlbnQgYW55IG9uZSBvZiBhbnRlbm5hIGlzIGJyb2tlbiBiZWZvcmUgbGluayBlc3RhYmxpc2hlZCwgMjAwNi4wNC4xOCwgYnkgcmNuamtvLi4NCisJCVN3aXRjaEFudGVubmEoZGV2KTsNCisJfQ0KKwkvLyBDYXNlIDIuIExpbmtlZCBidXQgbm8gcGFja2V0IHJlY2VpdmVkLg0KKwllbHNlIGlmKHByaXYtPkFkUnhPa0NudCA9PSAwKQ0KKwl7DQorCS8vCXByaW50aygiU3dBbnRlbm5hRGl2ZXJzaXR5KCk6IENhc2UgMi4gTGlua2VkIGJ1dCBubyBwYWNrZXQgcmVjZWl2ZWQuXG4iKTsNCisNCisJCXByaXYtPmJBZFN3aXRjaGVkQ2hlY2tpbmcgPSBmYWxzZTsNCisJCVN3aXRjaEFudGVubmEoZGV2KTsNCisJfQ0KKwkvLyBDYXNlIDMuIEV2YWx1YXRlIGxhc3QgYW50ZW5uYSBzd2l0Y2ggYWN0aW9uIGFuZCB1bmRvIGl0IGlmIG5lY2Vzc2FyeS4NCisJZWxzZSBpZihwcml2LT5iQWRTd2l0Y2hlZENoZWNraW5nID09IHRydWUpDQorCXsNCisJLy8JcHJpbnRrKCJTd0FudGVubmFEaXZlcnNpdHkoKTogQ2FzZSAzLiBFdmFsdWF0ZSBsYXN0IGFudGVubmEgc3dpdGNoIGFjdGlvbi5cbiIpOw0KKw0KKwkJcHJpdi0+YkFkU3dpdGNoZWRDaGVja2luZyA9IGZhbHNlOw0KKw0KKwkJLy8gQWRqdXN0IFJ4IHNpZ25hbCBzdHJlbmd0aCB0aHJlYXNob2xkLg0KKwkJcHJpdi0+QWRSeFNzVGhyZXNob2xkID0gKHByaXYtPkFkUnhTaWduYWxTdHJlbmd0aCArIHByaXYtPkFkUnhTc0JlZm9yZVN3aXRjaGVkKSAvIDI7DQorDQorCQlwcml2LT5BZFJ4U3NUaHJlc2hvbGQgPSAocHJpdi0+QWRSeFNzVGhyZXNob2xkID4gcHJpdi0+QWRNYXhSeFNzVGhyZXNob2xkKSA/CQ0KKwkJCQkJcHJpdi0+QWRNYXhSeFNzVGhyZXNob2xkOiBwcml2LT5BZFJ4U3NUaHJlc2hvbGQ7DQorCQlpZihwcml2LT5BZFJ4U2lnbmFsU3RyZW5ndGggPCBwcml2LT5BZFJ4U3NCZWZvcmVTd2l0Y2hlZCkNCisJCXsgLy8gUnggc2lnbmFsIHN0cmVuZ3RoIGlzIG5vdCBpbXByb3ZlZCBhZnRlciB3ZSBzd3RpY2hlZCBhbnRlbm5hLiA9PiBTd2ljaCBiYWNrLg0KKy8vCQkJcHJpbnRrKCJTd0FudGVubmFEaXZlcnNpdHkoKTogUnggU2lnbmFsIFN0cmVuZ3RoIGlzIG5vdCBpbXByb3ZlZCwgQ3VyclJ4U3M6ICVkLCBMYXN0UnhTczogJWRcbiIsIA0KKy8vCQkJCXByaXYtPkFkUnhTaWduYWxTdHJlbmd0aCwgcHJpdi0+QWRSeFNzQmVmb3JlU3dpdGNoZWQpOw0KKy8vYnkgYW15IDA4MDMxMg0KKwkJCS8vIEluY3JlYXNlIEFudGVubmEgRGl2ZXJzaXR5IGNoZWNraW5nIHBlcmlvZCBkdWUgdG8gYmFkIGRlY2lzaW9uLg0KKwkJCXByaXYtPkFkQ2hlY2tQZXJpb2QgKj0gMjsNCisvL2J5IGFteSAwODAzMTINCisJCQkvLyBJbmNyZWFzZSBBbnRlbm5hIERpdmVyc2l0eSBjaGVja2luZyBwZXJpb2QuDQorCQkJaWYocHJpdi0+QWRDaGVja1BlcmlvZCA+IHByaXYtPkFkTWF4Q2hlY2tQZXJpb2QpDQorCQkJCXByaXYtPkFkQ2hlY2tQZXJpb2QgPSBwcml2LT5BZE1heENoZWNrUGVyaW9kOw0KKwkNCisJCQkvLyBXcm9uZyBkZWNlaXNpb24gPT4gc3dpdGNoIGJhY2suDQorCQkJU3dpdGNoQW50ZW5uYShkZXYpOw0KKwkJfQ0KKwkJZWxzZQ0KKwkJeyAvLyBSeCBTaWduYWwgU3RyZW5ndGggaXMgaW1wcm92ZWQuIA0KKy8vCQkJcHJpbnRrKCJTd0FudGVubmFEaXZlcnNpdHkoKTogUnggU2lnbmFsIFN0cmVuZ3RoIGlzIGltcHJvdmVkLCBDdXJyUnhTczogJWQsIExhc3RSeFNzOiAlZFxuIiwgDQorLy8JCQkJcHJpdi0+QWRSeFNpZ25hbFN0cmVuZ3RoLCBwcml2LT5BZFJ4U3NCZWZvcmVTd2l0Y2hlZCk7DQorDQorCQkJLy8gUmVzZXQgQW50ZW5uYSBEaXZlcnNpdHkgY2hlY2tpbmcgcGVyaW9kIHRvIGl0cyBtaW4gdmFsdWUuDQorCQkJcHJpdi0+QWRDaGVja1BlcmlvZCA9IHByaXYtPkFkTWluQ2hlY2tQZXJpb2Q7DQorCQl9DQorDQorLy8JCXByaW50aygiU3dBbnRlbm5hRGl2ZXJzaXR5KCk6IEFkUnhTc1RocmVzaG9sZDogJWQsIEFkQ2hlY2tQZXJpb2Q6ICVkXG4iLA0KKy8vCQkJcHJpdi0+QWRSeFNzVGhyZXNob2xkLCBwcml2LT5BZENoZWNrUGVyaW9kKTsNCisJfQ0KKwkvLyBDYXNlIDQuIEV2YWx1YXRlIGlmIHdlIHNoYWxsIHN3aXRjaCBhbnRlbm5hIG5vdy4NCisJLy8gQ2F1c2UgVGFibGUgU3BlZWQgaXMgdmVyeSBmYXN0IGluIFRSQyBEZWxsIExhYiwgd2UgY2hlY2sgaXQgZXZlcnkgdGltZS4gDQorCWVsc2UvLyBpZihwcml2LT5BZFRpY2tDb3VudCA+PSBwcml2LT5BZENoZWNrUGVyaW9kKS8vLWJ5IGFteSAwODAzMTINCisJew0KKy8vCQlwcmludGsoIlN3QW50ZW5uYURpdmVyc2l0eSgpOiBDYXNlIDQuIEV2YWx1YXRlIGlmIHdlIHNoYWxsIHN3aXRjaCBhbnRlbm5hIG5vdy5cbiIpOw0KKw0KKwkJcHJpdi0+QWRUaWNrQ291bnQgPSAwOw0KKw0KKwkJLy8NCisJCS8vIDxSb2dlcl9Ob3Rlcz4gV2UgZXZhbHVhdGUgUnhPayBjb3VudHMgZm9yIGVhY2ggYW50ZW5uYSBmaXJzdCBhbmQgdGhhbiANCisJCS8vIGV2YWx1YXRlIHNpZ25hbCBzdHJlbmd0aC4gDQorCQkvLyBUaGUgZm9sbG93aW5nIG9wZXJhdGlvbiBjYW4gb3ZlcmNvbWUgdGhlIGRpc2FiaWxpdHkgb2YgQ0NBIG9uIGJvdGggdHdvIGFudGVubmFzDQorCQkvLyBXaGVuIHNpZ25hbCBzdHJlbmd0aCB3YXMgZXh0cmVtZWx5IGxvdyBvciBoaWdoLg0KKwkJLy8gMjAwOC4wMS4zMC4NCisJCS8vIA0KKwkJDQorCQkvLw0KKwkJLy8gRXZhbHVhdGUgUnhPayBjb3VudCBmcm9tIGVhY2ggYW50ZW5uYSBpZiB3ZSBzaGFsbCBzd2l0Y2ggZGVmYXVsdCBhbnRlbm5hIG5vdy4NCisJCS8vIEFkZGVkIGJ5IFJvZ2VyLCAyMDA4LjAyLjIxLg0KKy8ve2J5IGFteSAwODAzMTINCisJCWlmKChwcml2LT5BZE1haW5BbnRlbm5hUnhPa0NudCA8IHByaXYtPkFkQXV4QW50ZW5uYVJ4T2tDbnQpIA0KKwkJCSYmIChwcml2LT5DdXJyQW50ZW5uYUluZGV4ID09IDApKQ0KKwkJeyAvLyBXZSBzZXQgTWFpbiBhbnRlbm5hIGFzIGRlZmF1bHQgYnV0IFJ4T2sgY291bnQgd2FzIGxlc3MgdGhhbiBBdXggb25lcy4NCisNCisJLy8JCXByaW50aygiU3dBbnRlbm5hRGl2ZXJzaXR5KCk6IE1haW4gYW50ZW5uYSBSeE9LIGlzIHBvb3IsIEFkTWFpbkFudGVubmFSeE9rQ250OiAlZCwgQWRBdXhBbnRlbm5hUnhPa0NudDogJWRcbiIsIA0KKwkvLwkJCXByaXYtPkFkTWFpbkFudGVubmFSeE9rQ250LCBwcml2LT5BZEF1eEFudGVubmFSeE9rQ250KTsNCisJCQkNCisJCQkvLyBTd2l0Y2ggdG8gQXV4IGFudGVubmEuDQorCQkJU3dpdGNoQW50ZW5uYShkZXYpOwkNCisJCQlwcml2LT5iSFdBZFN3aXRjaGVkID0gdHJ1ZTsNCisJCX0NCisJCWVsc2UgaWYoKHByaXYtPkFkQXV4QW50ZW5uYVJ4T2tDbnQgPCBwcml2LT5BZE1haW5BbnRlbm5hUnhPa0NudCkgDQorCQkJJiYgKHByaXYtPkN1cnJBbnRlbm5hSW5kZXggPT0gMSkpDQorCQl7IC8vIFdlIHNldCBBdXggYW50ZW5uYSBhcyBkZWZhdWx0IGJ1dCBSeE9rIGNvdW50IHdhcyBsZXNzIHRoYW4gTWFpbiBvbmVzLg0KKw0KKwkvLwkJcHJpbnRrKCJTd0FudGVubmFEaXZlcnNpdHkoKTogQXV4IGFudGVubmEgUnhPSyBpcyBwb29yLCBBZE1haW5BbnRlbm5hUnhPa0NudDogJWQsIEFkQXV4QW50ZW5uYVJ4T2tDbnQ6ICVkXG4iLCANCisJLy8JCQlwcml2LT5BZE1haW5BbnRlbm5hUnhPa0NudCwgcHJpdi0+QWRBdXhBbnRlbm5hUnhPa0NudCk7DQorCQkJDQorCQkJLy8gU3dpdGNoIHRvIE1haW4gYW50ZW5uYS4NCisJCQlTd2l0Y2hBbnRlbm5hKGRldik7DQorCQkJcHJpdi0+YkhXQWRTd2l0Y2hlZCA9IHRydWU7DQorCQl9DQorCQllbHNlDQorCQl7Ly8gRGVmYXVsdCBhbnRlbm5hIGlzIGJldHRlci4NCisNCisJLy8JCXByaW50aygiU3dBbnRlbm5hRGl2ZXJzaXR5KCk6IERlZmF1bHQgYW50ZW5uYSBpcyBiZXR0ZXIuLCBBZE1haW5BbnRlbm5hUnhPa0NudDogJWQsIEFkQXV4QW50ZW5uYVJ4T2tDbnQ6ICVkXG4iLCANCisJLy8JCQlwcml2LT5BZE1haW5BbnRlbm5hUnhPa0NudCwgcHJpdi0+QWRBdXhBbnRlbm5hUnhPa0NudCk7DQorDQorCQkJLy8gU3RpbGwgbmVlZCB0byBjaGVjayBjdXJyZW50IHNpZ25hbCBzdHJlbmd0aC4NCisJCQlwcml2LT5iSFdBZFN3aXRjaGVkID0gZmFsc2U7CQ0KKwkJfQ0KKwkJLy8NCisJCS8vIDxSb2dlcl9Ob3Rlcz4gV2UgZXZhbHVhdGUgUnggc2lnbmFsIHN0cmVuZ3RoIE9OTFkgd2hlbiBkZWZhdWx0IGFudGVubmEgDQorCQkvLyBkaWRuJ3QgY2hhbmdlZCBieSBIVyBldmFsdWF0aW9uLiANCisJCS8vIDIwMDguMDIuMjcuDQorCQkvLw0KKwkJLy8gW1RSQyBEZWxsIExhYl0gU2lnbmFsU3RyZW5ndGggaXMgaW5hY2N1cmFjeS4gSXNhaWFoIDIwMDgtMDMtMDUgDQorCQkvLyBGb3IgZXhhbXBsZSwgVGhyb3VnaHB1dCBvZiBhdXggaXMgYmV0dGVyIHRoYW4gbWFpbiBhbnRlbm5hKGFib3V0IDEwTSB2LnMgMk0pLCANCisJCS8vIGJ1dCBBZFJ4U2lnbmFsU3RyZW5ndGggaXMgbGVzcyB0aGFuIG1haW4uIA0KKwkJLy8gT3VyIGd1ZXNzIGlzIHRoYXQgbWFpbiBhbnRlbm5hIGhhdmUgbG93ZXIgdGhyb3VnaHB1dCBhbmQgZ2V0IG1hbnkgY2hhbmdlIA0KKwkJLy8gdG8gcmVjZWl2ZSBtb3JlIENDSyBwYWNrZXRzKGV4LkJlYWNvbikgd2hpY2ggaGF2ZSBzdHJvbmdlciBTaWduYWxTdHJlbmd0aC4NCisJCS8vDQorCQlpZiggKCFwcml2LT5iSFdBZFN3aXRjaGVkKSAmJiAoYlN3Q2hlY2tTUykpDQorCQl7DQorLy9ieSBhbXkgMDgwMzEyfQ0KKwkJLy8gRXZhbHVhdGUgUnggc2lnbmFsIHN0cmVuZ3RoIGlmIHdlIHNoYWxsIHN3aXRjaCBhbnRlbm5hIG5vdy4NCisJCWlmKHByaXYtPkFkUnhTaWduYWxTdHJlbmd0aCA8IHByaXYtPkFkUnhTc1RocmVzaG9sZCkNCisJCXsgLy8gUnggc2lnbmFsIHN0cmVuZ3RoIGlzIHdlYWsgPT4gU3dpdGNoIEFudGVubmEuDQorLy8JCQlwcmludGsoIlN3QW50ZW5uYURpdmVyc2l0eSgpOiBSeCBTaWduYWwgU3RyZW5ndGggaXMgd2VhaywgQ3VyclJ4U3M6ICVkLCBSeFNzVGhyZXNob2xkOiAlZFxuIiwgDQorLy8JCQkJcHJpdi0+QWRSeFNpZ25hbFN0cmVuZ3RoLCBwcml2LT5BZFJ4U3NUaHJlc2hvbGQpOwkNCisNCisJCQlwcml2LT5BZFJ4U3NCZWZvcmVTd2l0Y2hlZCA9IHByaXYtPkFkUnhTaWduYWxTdHJlbmd0aDsgDQorCQkJcHJpdi0+YkFkU3dpdGNoZWRDaGVja2luZyA9IHRydWU7DQorDQorCQkJU3dpdGNoQW50ZW5uYShkZXYpOw0KKwkJfQ0KKwkJZWxzZQ0KKwkJeyAvLyBSeCBzaWduYWwgc3RyZW5ndGggaXMgT0suIA0KKy8vCQkJcHJpbnRrKCJTd0FudGVubmFEaXZlcnNpdHkoKTogUnggU2lnbmFsIFN0cmVuZ3RoIGlzIE9LLCBDdXJyUnhTczogJWQsIFJ4U3NUaHJlc2hvbGQ6ICVkXG4iLCANCisvLwkJCQlwcml2LT5BZFJ4U2lnbmFsU3RyZW5ndGgsIHByaXYtPkFkUnhTc1RocmVzaG9sZCk7DQorDQorCQkJcHJpdi0+YkFkU3dpdGNoZWRDaGVja2luZyA9IGZhbHNlOw0KKwkJCS8vIEluY3JlYXNlIFJ4IHNpZ25hbCBzdHJlbmd0aCB0aHJlYXNob2xkIGlmIG5lY2Vzc2FyeS4NCisJCQlpZigJKHByaXYtPkFkUnhTaWduYWxTdHJlbmd0aCA+IChwcml2LT5BZFJ4U3NUaHJlc2hvbGQgKyAxMCkpICYmIC8vIFNpZ25hbCBpcyBtdWNoIHN0cm9uZ2VyIHRoYW4gY3VycmVudCB0aHJlc2hvbGQNCisJCQkJcHJpdi0+QWRSeFNzVGhyZXNob2xkIDw9IHByaXYtPkFkTWF4UnhTc1RocmVzaG9sZCkgLy8gQ3VycmVudCB0aHJlaG9sZCBpcyBub3QgeWV0IHJlYWNoIHVwcGVyIGxpbWl0Lg0KKwkJCXsNCisJCQkJcHJpdi0+QWRSeFNzVGhyZXNob2xkID0gKHByaXYtPkFkUnhTc1RocmVzaG9sZCArIHByaXYtPkFkUnhTaWduYWxTdHJlbmd0aCkgLyAyOw0KKwkJCQlwcml2LT5BZFJ4U3NUaHJlc2hvbGQgPSAocHJpdi0+QWRSeFNzVGhyZXNob2xkID4gcHJpdi0+QWRNYXhSeFNzVGhyZXNob2xkKSA/DQorCQkJCQkJCQkJCQkJcHJpdi0+QWRNYXhSeFNzVGhyZXNob2xkOiBwcml2LT5BZFJ4U3NUaHJlc2hvbGQ7Ly8rYnkgYW15IDA4MDMxMg0KKwkJCX0NCisNCisJCQkvLyBSZWR1Y2UgQW50ZW5uYSBEaXZlcnNpdHkgY2hlY2tpbmcgcGVyaW9kIGlmIHBvc3NpYmxlLiANCisJCQlpZiggcHJpdi0+QWRDaGVja1BlcmlvZCA+IHByaXYtPkFkTWluQ2hlY2tQZXJpb2QgKQ0KKwkJCXsNCisJCQkJcHJpdi0+QWRDaGVja1BlcmlvZCAvPSAyOyANCisJCQl9DQorCQl9DQorCQl9DQorCX0NCisvL2J5IGFteSAwODAzMTINCisJLy8gUmVzZXQgYW50ZW5uYSBkaXZlcnNpdHkgUnggcmVsYXRlZCBzdGF0aXN0aWNzLg0KKwlwcml2LT5BZFJ4T2tDbnQgPSAwOw0KKwlwcml2LT5BZE1haW5BbnRlbm5hUnhPa0NudCA9IDA7DQorCXByaXYtPkFkQXV4QW50ZW5uYVJ4T2tDbnQgPSAwOw0KKy8vYnkgYW15IDA4MDMxMg0KKw0KKy8vCXByaXYtPkFkUnhPa0NudCA9IDA7Ly8tYnkgYW15IDA4MDMxMg0KKw0KKy8vCXByaW50aygiLVN3QW50ZW5uYURpdmVyc2l0eSgpXG4iKTsNCit9DQorDQorLy8NCisvLwlEZXNjcmlwdGlvbjoNCisvLwkJUmV0dXJuIFRSVUUgaWYgd2Ugc2hhbGwgcGVyZm9ybSBUeCBQb3dlciBUcmFja2luZyBNZWNhaG5pc20sIEZBTFNFIG90aGVyd2lzZS4JDQorLy8NCitib29sDQorQ2hlY2tUeFB3clRyYWNraW5nKAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQ0KK3sNCisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTgwX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOw0KKw0KKwlpZighcHJpdi0+YlR4UG93ZXJUcmFjaykNCisJew0KKwkJcmV0dXJuIGZhbHNlOw0KKwl9DQorDQorLy9sem0gcmVzZXJ2ZWQgMDgwODI2DQorCS8vaWYocHJpdi0+YlNjYW5JblByb2dyZXNzKQ0KKwkvL3sNCisJLy8JcmV0dXJuIGZhbHNlOw0KKwkvL30NCisNCisJLy9pZiA4N1NFIGlzIGluIEhpZ2ggUG93ZXIgLCBkb24ndCBkbyBUeCBQb3dlciBUcmFja2luZy4gYXNrZWQgYnkgU0QzIEVELiAyMDA4LTA4LTA4IElzYWlhaCANCisJaWYocHJpdi0+YlRvVXBkYXRlVHhQd3IpDQorCXsNCisJCXJldHVybiBmYWxzZTsNCisJfQ0KKwkJDQorCXJldHVybiB0cnVlOw0KK30NCisNCisNCisvLw0KKy8vCURlc2NyaXB0aW9uOg0KKy8vCQlUaW1lciBjYWxsYmFjayBmdW5jdGlvbiBvZiBTVyBBbnRlbm5hIERpdmVyc2l0eS4NCisvLw0KK3ZvaWQNCitTd0FudGVubmFEaXZlcnNpdHlUaW1lckNhbGxiYWNrKA0KKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2DQorCSkNCit7DQorCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gKHN0cnVjdCByODE4MF9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsNCisJUlRfUkZfUE9XRVJfU1RBVEUgcnRTdGF0ZTsNCisJDQorCS8vcHJpbnRrKCIrU3dBbnRlbm5hRGl2ZXJzaXR5VGltZXJDYWxsYmFjaygpXG4iKTsNCisNCisJLy8NCisJLy8gV2UgZG8gTk9UIG5lZWQgdG8gc3dpdGNoIGFudGVubmEgd2hpbGUgUkYgaXMgb2ZmLg0KKwkvLyAyMDA3LjA1LjA5LCBhZGRlZCBieSBSb2dlci4NCisJLy8NCisJcnRTdGF0ZSA9IHByaXYtPmVSRlBvd2VyU3RhdGU7DQorCWRvew0KKwkJaWYgKHJ0U3RhdGUgPT0gZVJmT2ZmKQ0KKwkJewkNCisvLwkJCXByaW50aygiU3dBbnRlbm5hRGl2ZXJzaXR5VGltZXIgLSBSRiBpcyBPRkYuXG4iKTsNCisJCQlicmVhazsNCisJCX0gIAkNCisJCWVsc2UgaWYgKHJ0U3RhdGUgPT0gZVJmU2xlZXApDQorCQl7CQ0KKwkJCS8vIERvbid0IGFjY2VzcyBCQi9SRiB1bmRlciBEaXNhYmxlIFBMTCBzaXR1YXRpb24uDQorCQkJLy9SVF9UUkFDRSgoQ09NUF9SRnxDT01QX0FOVEVOTkEpLCBEQkdfTE9VRCwgKCJTd0FudGVubmFEaXZlcnNpdHlUaW1lckNhbGxiYWNrKCk6IFJGIGlzIFNsZWVwID0+IHNraXAgaXRcbiIpKTsNCisJCQlicmVhazsNCisJCX0gIA0KKwkJU3dBbnRlbm5hRGl2ZXJzaXR5KGRldik7DQorDQorCX13aGlsZShmYWxzZSk7DQorDQorCWlmKHByaXYtPnVwKQ0KKwl7DQorCQlwcml2LT5Td0FudGVubmFEaXZlcnNpdHlUaW1lci5leHBpcmVzID0gamlmZmllcyArIE1TRUNTKEFOVEVOTkFfRElWRVJTSVRZX1RJTUVSX1BFUklPRCk7DQorCQlhZGRfdGltZXIoJnByaXYtPlN3QW50ZW5uYURpdmVyc2l0eVRpbWVyKTsNCisJfQ0KKw0KKwkvL3ByaW50aygiLVN3QW50ZW5uYURpdmVyc2l0eVRpbWVyQ2FsbGJhY2soKVxuIik7DQorfQ0KKw0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfZG0uaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfZG0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZGU5MmYwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MF9kbS5oCkBAIC0wLDAgKzEsNDEgQEAKKyNpZm5kZWYgUjgxODBfRE1fSCANCisjZGVmaW5lIFI4MTgwX0RNX0gNCisNCisjaW5jbHVkZSAicjgxODAuaCINCisvLyNpbmNsdWRlICJyODE4MF9ody5oIg0KKy8vI2luY2x1ZGUgInI4MTgwXzkzY3g2LmgiDQordm9pZCBTd0FudGVubmFEaXZlcnNpdHlSeE9rODE4NShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCBTaWduYWxTdHJlbmd0aCk7DQorYm9vbCBTZXRBbnRlbm5hODE4NShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAl1OCB1MWJBbnRlbm5hSW5kZXgpOw0KK2Jvb2wgU3dpdGNoQW50ZW5uYSgJc3RydWN0IG5ldF9kZXZpY2UgKmRldik7DQordm9pZCBTd0FudGVubmFEaXZlcnNpdHkoc3RydWN0IG5ldF9kZXZpY2UgKmRldgkpOw0KK3ZvaWQgU3dBbnRlbm5hRGl2ZXJzaXR5VGltZXJDYWxsYmFjayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsNCitib29sIENoZWNrRGlnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOw0KK2Jvb2wgQ2hlY2tIaWdoUG93ZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7DQorI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDIwKSkNCit2b2lkIHJ0bDgxODBfaHdfZGlnX3dxIChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOw0KKyNlbHNlDQordm9pZCBydGw4MTgwX2h3X2RpZ193cShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsNCisjZW5kaWYNCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMjApKQ0KK3ZvaWQgcnRsODE4MF90eF9wd193cSAoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsNCisjZWxzZQ0KK3ZvaWQgcnRsODE4MF90eF9wd193cShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsNCisjZW5kaWYNCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49S0VSTkVMX1ZFUlNJT04oMiw2LDIwKQ0KK3ZvaWQgcnRsODE4MF9yYXRlX2FkYXB0ZXIoc3RydWN0IHdvcmtfc3RydWN0ICogd29yayk7DQorDQorI2Vsc2UNCit2b2lkIHJ0bDgxODBfcmF0ZV9hZGFwdGVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOw0KKw0KKyNlbmRpZg0KK3ZvaWQgVHhQd3JUcmFja2luZzg3U0Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7DQorYm9vbCBDaGVja1R4UHdyVHJhY2tpbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7DQorI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PUtFUk5FTF9WRVJTSU9OKDIsNiwyMCkNCit2b2lkIHJ0bDgxODBfcmF0ZV9hZGFwdGVyKHN0cnVjdCB3b3JrX3N0cnVjdCAqIHdvcmspOw0KKyNlbHNlDQordm9pZCBydGw4MTgwX3JhdGVfYWRhcHRlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsNCisjZW5kaWYNCit2b2lkIHRpbWVyX3JhdGVfYWRhcHRpdmUodW5zaWduZWQgbG9uZyBkYXRhKTsNCisNCisNCisjZW5kaWYNCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwX2djdC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MF9nY3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NmNiNDI3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MF9nY3QuYwpAQCAtMCwwICsxLDI5NiBAQAorLyoKKyAgIFRoaXMgZmlsZXMgY29udGFpbnMgR0NUIHJhZGlvIGZyb250ZW5kIHByb2dyYW1taW5nIHJvdXRpbmVzLgorCisgICBUaGlzIGlzIHBhcnQgb2YgcnRsODE4MCBPcGVuU291cmNlIGRyaXZlcgorICAgQ29weXJpZ2h0IChDKSBBbmRyZWEgTWVyZWxsbyAyMDA0LTIwMDUgIDxhbmRyZWFtcmxAdGlzY2FsaS5pdD4KKyAgIFJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiBHUEwgKEdlbmVyYWwgUHVibGljIExpY2VuY2UpCisKKyAgIFBhcnRzIG9mIHRoaXMgZHJpdmVyIGFyZSBiYXNlZCBvbiB0aGUgR1BMIHBhcnQgb2YgdGhlCisgICBvZmZpY2lhbCByZWFsdGVrIGRyaXZlcgorCisgICBQYXJ0cyBvZiB0aGlzIGRyaXZlciBhcmUgYmFzZWQgb24gdGhlIHJ0bDgxODAgZHJpdmVyIHNrZWxldG9uCisgICBmcm9tIFBhdHJpYyBTY2hlbmtlICYgQW5kcmVzIFNhbG9tb24KKworICAgUGFydHMgb2YgdGhpcyBkcml2ZXIgYXJlIGJhc2VkIG9uIHRoZSBJbnRlbCBQcm8gV2lyZWxlc3MgMjEwMCBHUEwgZHJpdmVyLgorCisgICBDb2RlIGZyb20gUnR3ODE4MCBOZXRCU0QgZHJpdmVyIGJ5IERhdmlkIFlvdW5nIGhhcyBiZWVuIHJlYWxseSB1c2VmdWwgdG8KKyAgIHVuZGVyc3RhbmQgc29tZSB0aGluZ3MgYW5kIGdldHMgc29tZSBpZGVhcworCisgICBDb2RlIGZyb20gcnRsODE4MSBwcm9qZWN0IGhhcyBiZWVuIHVzZWZ1bCB0byBtZSB0byB1bmRlcnN0YW5kIHNvbWUgdGhpbmdzLgorCisgICBTb21lIGNvZGUgZnJvbSAnRGV1Y2UnIHdvcmsKKworICAgV2Ugd2FudCB0byB0YW5rcyB0aGUgQXV0aG9ycyBvZiBzdWNoIHByb2plY3RzIGFuZCB0aGUgTmRpc3dyYXBwZXIKKyAgIHByb2plY3QgQXV0aG9ycy4KKyovCisKKworI2luY2x1ZGUgInI4MTgwLmgiCisjaW5jbHVkZSAicjgxODBfaHcuaCIKKyNpbmNsdWRlICJyODE4MF9nY3QuaCIKKworCisvLyNkZWZpbmUgREVCVUdfR0NUCisKKy8qIHRoZSBmb2xsb3dpbmcgZXhwZXJpbWVudCBhcmUganVzdCBleHBlcmltZW50cy4KKyAqIHRoaXMgbWVhbnMgaWYgeW91IGVuYWJsZSB0aGVtIHlvdSBjYW4gaGF2ZSBldmVyeSBraW5kCisgKiBvZiByZXN1bHQsIGluY2x1ZGVkIGRhbWFnZSB0aGUgUkYgY2hpcCwgc28gZG9uJ3QKKyAqIHRvdWNoIHRoZW0gaWYgeW91IGRvbid0IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nLgorICogSW4gYW55IGNhc2UsIGlmIHlvdSBkbyBpdCwgZG8gYXQgeW91ciBvd24gcmlzaworICovCisKKy8vI2RlZmluZSBHQ1RfRVhQRVJJTUVOVDEgIC8vaW1wcm92ZSBSWCBzZW5zaXZpdHkKKworLy8jZGVmaW5lIEdDVF9FWFBFUklNRU5UMgorCisvLyNkZWZpbmUgR0NUX0VYUEVSSU1FTlQzICAvL2lwcm92ZSBhIGJpdCBSWCBzaWduYWwgcXVhbGl0eSA/CisKKy8vI2RlZmluZSBHQ1RfRVhQRVJJTUVOVDQgLy9tYXliZSBzb2x2ZSBzb21lIGJyb2tlbmVzcyB3aXRoIGV4cGVyaW1lbnQxID8KKworLy8jZGVmaW5lIEdDVF9FWFBFUklNRU5UNQorCisvLyNkZWZpbmUgR0NUX0VYUEVSSU1FTlQ2ICAvL25vdCBnb29kCisKKwordTMyIGdjdF9jaGFuW10gPSB7CisJMHgwLAkvL2R1bW15IGNoYW5uZWwgMAorCTB4MCwgLy8xCisJMHgxLCAvLzIKKwkweDIsIC8vMworCTB4MywgLy80CisJMHg0LCAvLzUKKwkweDUsIC8vNgorCTB4NiwgLy83CisJMHg3LCAvLzgKKwkweDgsIC8vOQorCTB4OSwgLy8xMAorCTB4YSwgLy8xMQorCTB4YiwgLy8xMgorCTB4YywgLy8xMworCTB4ZCwgLy8xNAorfTsKKworaW50IGdjdF9lbmNvZGVbMTZdID0geworCTAsIDgsIDQsIDB4QywKKwkyLCAweEEsIDYsIDB4RSwKKwkxLCA5LCA1LCAweEQsCisJMywgMHhCLCA3LCAweEYKK307CisKK3ZvaWQgZ2N0X3JmX3N0YWJpbGl6ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWZvcmNlX3BjaV9wb3N0aW5nKGRldik7CisJbWRlbGF5KDMpOyAvL2ZvciBub3cgdXNlIGEgZ3JlYXQgdmFsdWUuLiB3ZSBtYXkgb3B0aW1pemUgaW4gZnV0dXJlCit9CisKKwordm9pZCB3cml0ZV9nY3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggYWRyLCB1MzIgZGF0YSkKK3sKKy8vCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwl1MzIgcGh5X2NvbmZpZzsKKworCXBoeV9jb25maWcgPSAgZ2N0X2VuY29kZVsoZGF0YSAmIDB4ZjAwKSA+PiA4XTsKKwlwaHlfY29uZmlnIHw9IGdjdF9lbmNvZGVbKGRhdGEgJiAweGYwKSA+PiA0IF0gPDwgNDsKKwlwaHlfY29uZmlnIHw9IGdjdF9lbmNvZGVbKGRhdGEgJiAweGYpICAgICAgIF0gPDwgODsKKwlwaHlfY29uZmlnIHw9IGdjdF9lbmNvZGVbKGFkciA+PiAxKSAmIDB4ZiAgIF0gPDwgMTI7CisJcGh5X2NvbmZpZyB8PSAgICAgICAgICAgIChhZHIgJiAxICkgICAgICAgICAgIDw8IDE2OworCXBoeV9jb25maWcgfD0gZ2N0X2VuY29kZVsoZGF0YSAmIDB4ZjAwMCk+PjEyXSA8PCAyNDsKKworCXBoeV9jb25maWcgfD0gMHg5MDAwMDAwMDsgLy8gTUFDIHdpbGwgYmFuZyBiaXRzIHRvIHRoZSBjaGlwCisKKworCXdyaXRlX25pY19kd29yZChkZXYsUEhZX0NPTkZJRyxwaHlfY29uZmlnKTsKKyNpZmRlZiBERUJVR19HQ1QKKwlETUVTRygiV3JpdGluZyBHQ1Q6ICV4IChhZHIgJXgpIixwaHlfY29uZmlnLGFkcik7CisjZW5kaWYKKwlnY3RfcmZfc3RhYmlsaXplKGRldik7Cit9CisKKworCit2b2lkIGdjdF93cml0ZV9waHlfYW50ZW5uYShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LHNob3J0IGNoKQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwl1OCBhbnQ7CisKKwlhbnQgPSBHQ1RfQU5URU5OQTsKKwlpZihwcml2LT5hbnRiKSAvKmRlZmF1bHQgYW50ZW5uYSBpcyBhbnRlbm5hIEIgKi8KKwkJYW50IHw9IEJCX0FOVEVOTkFfQjsKKwlpZihjaCA9PSAxNCkKKwkJYW50IHw9IEJCX0FOVEFUVEVOX0NIQU4xNDsKKwl3cml0ZV9waHkoZGV2LDB4MTAsYW50KTsKKwkvL0RNRVNHKCJCQiBhbnRlbm5hICV4ICIsYW50KTsKK30KKworCit2b2lkIGdjdF9yZl9zZXRfY2hhbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzaG9ydCBjaCkKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJdTMyIHR4cHcgPSAweGZmICYgcHJpdi0+Y2h0eHB3cltjaF07CisJdTMyIGNoYW4gPSBnY3RfY2hhbltjaF07CisKKwkvL3dyaXRlX3BoeShkZXYsMyx0eHB3KTsKKyNpZmRlZiBERUJVR19HQ1QKKwlETUVTRygiR2N0IHNldCBjaGFubmVsIik7CisjZW5kaWYKKwkvKiBzZXQgVFggcG93ZXIgKi8KKwl3cml0ZV9nY3QoZGV2LDB4MTUsMCk7CisgCXdyaXRlX2djdChkZXYsNiwgdHhwdyk7CisJd3JpdGVfZ2N0KGRldiwweDE1LCAweDEwKTsKKwl3cml0ZV9nY3QoZGV2LDB4MTUsMCk7CisKKwkvKnNldCBmcmVxdWVuY3kqLworCXdyaXRlX2djdChkZXYsNywgMCk7CisgICAgICAJd3JpdGVfZ2N0KGRldiwweEIsIGNoYW4pOworICAgICAgCXdyaXRlX2djdChkZXYsNywgMHgxMDAwKTsKKworI2lmZGVmIERFQlVHX0dDVAorCURNRVNHKCJHY3Qgc2V0IGNoYW5uZWwgPiB3cml0ZSBwaHkgYW50ZW5uYSIpOworI2VuZGlmCisKKworCWdjdF93cml0ZV9waHlfYW50ZW5uYShkZXYsY2gpOworCit9CisKKwordm9pZCBnY3RfcmZfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl1MzIgYW5hcGFyYW07CisKKwlhbmFwYXJhbSA9IHJlYWRfbmljX2R3b3JkKGRldixBTkFQQVJBTSk7CisJYW5hcGFyYW0gJj0gMHgwMDBmZmZmZjsKKwlhbmFwYXJhbSB8PSAweDNmOTAwMDAwOworCXJ0bDgxODBfc2V0X2FuYXBhcmFtKGRldiwgYW5hcGFyYW0pOworCisJd3JpdGVfZ2N0KGRldiwgMHg3LCAwKTsKKwl3cml0ZV9nY3QoZGV2LCAweDFmLCAweDQ1KTsKKwl3cml0ZV9nY3QoZGV2LCAweDFmLCAweDUpOworCXdyaXRlX2djdChkZXYsIDB4MCwgMHg4ZTQpOworfQorCisKK3ZvaWQgZ2N0X3JmX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJLy91MzIgYW5hcGFyYW07CisKKworCXdyaXRlX25pY19ieXRlKGRldixQSFlfREVMQVksMHg2KTsJLy90aGlzIGlzIGdlbmVyYWwKKwl3cml0ZV9uaWNfYnl0ZShkZXYsQ0FSUklFUl9TRU5TRV9DT1VOVEVSLDB4NGMpOyAvL3RoaXMgaXMgZ2VuZXJhbAorCisJLy9ETUVTRygiJXgiLCByZWFkX25pY19kd29yZChkZXYsQU5BUEFSQU0pKTsKKwkvKiB3ZSBzaG91bGQgc2V0IGFuYXBhcm0gaGVyZSovCisJLy9ydGw4MTgwX3NldF9hbmFwYXJhbShkZXYsYW5hcGFyYW0pOworCisJd3JpdGVfZ2N0KGRldiwweDFmLDApOworCXdyaXRlX2djdChkZXYsMHgxZiwwKTsKKwl3cml0ZV9nY3QoZGV2LDB4MWYsMHg0MCk7CisJd3JpdGVfZ2N0KGRldiwweDFmLDB4NjApOworCXdyaXRlX2djdChkZXYsMHgxZiwweDYxKTsKKwl3cml0ZV9nY3QoZGV2LDB4MWYsMHg2MSk7CisJd3JpdGVfZ2N0KGRldiwweDAsMHhhZTQpOworCXdyaXRlX2djdChkZXYsMHgxZiwweDEpOworCXdyaXRlX2djdChkZXYsMHgxZiwweDQxKTsKKwl3cml0ZV9nY3QoZGV2LDB4MWYsMHg2MSk7CisJd3JpdGVfZ2N0KGRldiwweDEsMHgxYTIzKTsKKwl3cml0ZV9nY3QoZGV2LDB4MiwweDQ5NzEpOworCXdyaXRlX2djdChkZXYsMHgzLDB4NDFkZSk7CisJd3JpdGVfZ2N0KGRldiwweDQsMHgyZDgwKTsKKyNpZmRlZiBHQ1RfRVhQRVJJTUVOVDEKKwkvL3dyaXRlX2djdChkZXYsMHg1LDB4NjgxMCk7ICAvLyBmcm9tIHp5ZGFzIGRyaXZlci4gc2VucysgYnV0IHF1aXRlIHNsb3cKKwkvL3dyaXRlX2djdChkZXYsMHg1LDB4NjgxZik7ICAvL2dvb2QrIChzb21ld2hhdCBzdGFibGUsIGJldHRlciBzZW5zLCBwZXJmb3JtYW5jZSBkZWNlbnQpCisJd3JpdGVfZ2N0KGRldiwweDUsMHg2ODVmKTsgIC8vZ29vZCBwZXJmb3JtYW5jZXMsIG5vdCBzdXJlIHNlbnMgaXMgcmVhbGx5IHNvIGJlZXRlcgorCS8vd3JpdGVfZ2N0KGRldiwweDUsMHg2ODdmKTsgIC8vZ29vZCBwZXJmb3JtYW5jZXMsIG1heWJlIHNlbnMgaXMgbm90IGltcHJvdmVkCisJLy93cml0ZV9nY3QoZGV2LDB4NSwweDY4OWYpOyAgLy9saWtlIGFib3ZlCisJLy93cml0ZV9nY3QoZGV2LDB4NSwweDY4NWUpOyAgLy9iYWQKKwkvL3dyaXRlX2djdChkZXYsMHg1LDB4NjhmZik7ICAvL2dvb2QrIChzb21ld2hhdCBzdGFibGUsIGJldHRlciBzZW5zKD8pLCBwZXJmb3JtYW5jZSBkZWNlbnQpCisJLy93cml0ZV9nY3QoZGV2LDB4NSwweDY4ZjApOyAgLy9iYWQKKwkvL3dyaXRlX2djdChkZXYsMHg1LDB4NmNmZik7ICAvL3NlbnMrIGJ1dCBub3Qgc28gZ29vZAorCS8vd3JpdGVfZ2N0KGRldiwweDUsMHg2ZGZmKTsgIC8vc2VucyssYXBwYXJlbnRlbHkgdmVyeSBnb29kIGJ1dCBicm9rZW4KKwkvL3dyaXRlX2djdChkZXYsMHg1LDB4NjVmZik7ICAvL3NlbnMrLGdvb2QKKwkvL3dyaXRlX2djdChkZXYsMHg1LDB4NzhmZik7ICAvL3NlbnMgKyBidXQgYWxtb3N0IGJyb2tlbgorCS8vd3JpdGVfZ2N0KGRldiwweDUsMHg3ODEwKTsgIC8vLSAvL3NuZXMgKyBidXQgYnJva2VuCisJLy93cml0ZV9nY3QoZGV2LDB4NSwweDc4MWYpOyAgLy8tLSAvL3NlbnMgKworCS8vd3JpdGVfZ2N0KGRldiwweDUsMHg3OGYwKTsgIC8vbG93IHNlbnMKKyNlbHNlCisJd3JpdGVfZ2N0KGRldiwweDUsMHg2MWZmKTsgICAvL2Jlc3QgcGVyZm9ybWFuY2UgYnV0IHdlYWsgc2Vuc2l0aXZpdHkKKyNlbmRpZgorI2lmZGVmIEdDVF9FWFBFUklNRU5UMgorCXdyaXRlX2djdChkZXYsMHg2LDB4ZSk7CisjZWxzZQorCXdyaXRlX2djdChkZXYsMHg2LDB4MCk7CisjZW5kaWYKKwl3cml0ZV9nY3QoZGV2LDB4NywweDApOworCXdyaXRlX2djdChkZXYsMHg4LDB4NzUzMyk7CisJd3JpdGVfZ2N0KGRldiwweDksMHhjNDAxKTsKKwl3cml0ZV9nY3QoZGV2LDB4YSwweDApOworCXdyaXRlX2djdChkZXYsMHhjLDB4MWM3KTsKKwl3cml0ZV9nY3QoZGV2LDB4ZCwweDI5ZDMpOworCXdyaXRlX2djdChkZXYsMHhlLDB4MmU4KTsKKwl3cml0ZV9nY3QoZGV2LDB4MTAsMHgxOTIpOworI2lmZGVmIEdDVF9FWFBFUklNRU5UMworCXdyaXRlX2djdChkZXYsMHgxMSwweDI0Nik7CisjZWxzZQorCXdyaXRlX2djdChkZXYsMHgxMSwweDI0OCk7CisjZW5kaWYKKwl3cml0ZV9nY3QoZGV2LDB4MTIsMHgwKTsKKwl3cml0ZV9nY3QoZGV2LDB4MTMsMHgyMGM0KTsKKyNpZmRlZiBHQ1RfRVhQRVJJTUVOVDQKKwl3cml0ZV9nY3QoZGV2LDB4MTQsMHhmNDg4KTsKKyNlbHNlCisJd3JpdGVfZ2N0KGRldiwweDE0LDB4ZjRmYyk7CisjZW5kaWYKKyNpZmRlZiBHQ1RfRVhQRVJJTUVOVDUKKwl3cml0ZV9nY3QoZGV2LDB4MTUsMHhiMTUyKTsKKyNlbHNlCisJd3JpdGVfZ2N0KGRldiwweDE1LDB4MCk7CisjZW5kaWYKKyNpZmRlZiBHQ1RfRVhQRVJJTUVOVDYKKwl3cml0ZV9nY3QoZGV2LDB4MWUsMHgxKTsKKyNlbmRpZgorCXdyaXRlX2djdChkZXYsMHgxNiwweDE1MDApOworCisJd3JpdGVfZ2N0KGRldiwweDcsMHgxMDAwKTsKKwkvKndyaXRlX2djdChkZXYsMHgxNSwweDApOworCXdyaXRlX2djdChkZXYsMHg2LDB4MTUpOworCXdyaXRlX2djdChkZXYsMHgxNSwweDgpOworCXdyaXRlX2djdChkZXYsMHgxNSwweDApOworKi8KKwl3cml0ZV9waHkoZGV2LDAsMHhhOCk7CisKKy8qCXdyaXRlX2djdChkZXYsMHgxNSwweDApOworCXdyaXRlX2djdChkZXYsMHg2LDB4MTIpOworCXdyaXRlX2djdChkZXYsMHgxNSwweDgpOworCXdyaXRlX2djdChkZXYsMHgxNSwweDApOworKi8KKwl3cml0ZV9waHkoZGV2LDMsMHgwKTsKKwl3cml0ZV9waHkoZGV2LDQsMHhjMCk7IC8qIGxuYSBkZXQqLworCXdyaXRlX3BoeShkZXYsNSwweDkwKTsKKwl3cml0ZV9waHkoZGV2LDYsMHgxZSk7CisJd3JpdGVfcGh5KGRldiw3LDB4NjQpOworCisjaWZkZWYgREVCVUdfR0NUCisJRE1FU0coIkdjdCBpbml0PiB3cml0ZSBwaHkgYW50ZW5uYSIpOworI2VuZGlmCisKKwlnY3Rfd3JpdGVfcGh5X2FudGVubmEoZGV2LHByaXYtPmNoYW4pOworCisJd3JpdGVfcGh5KGRldiwweDExLDB4ODgpOworCWlmKCFwcml2LT5kaXZlcnNpdHkpCisJCXdyaXRlX3BoeShkZXYsMHgxMiwweGMwKTsKKwllbHNlCisJCXdyaXRlX3BoeShkZXYsMHgxMiwweDQwKTsKKworCXdyaXRlX3BoeShkZXYsMHgxMywweDkwIHwgcHJpdi0+Y3NfdHJlc2hvbGQgKTsKKworCXdyaXRlX3BoeShkZXYsMHgxOSwweDApOworCXdyaXRlX3BoeShkZXYsMHgxYSwweGEwKTsKKwl3cml0ZV9waHkoZGV2LDB4MWIsMHg0NCk7CisKKyNpZmRlZiBERUJVR19HQ1QKKwlETUVTRygiR2N0IGluaXQgPiBzZXQgY2hhbm5lbDIiKTsKKyNlbmRpZgorCisJZ2N0X3JmX3NldF9jaGFuKGRldixwcml2LT5jaGFuKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfZ2N0LmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwX2djdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlOTY1Y2EKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwX2djdC5oCkBAIC0wLDAgKzEsMjUgQEAKKy8qCisJVGhpcyBpcyBwYXJ0IG9mIHJ0bDgxODAgT3BlblNvdXJjZSBkcml2ZXIgLSB2IDAuMjAKKwlDb3B5cmlnaHQgKEMpIEFuZHJlYSBNZXJlbGxvIDIwMDQgIDxhbmRyZWFtcmxAdGlzY2FsaS5pdD4KKwlSZWxlYXNlZCB1bmRlciB0aGUgdGVybXMgb2YgR1BMIChHZW5lcmFsIFB1YmxpYyBMaWNlbmNlKQorCisJUGFydHMgb2YgdGhpcyBkcml2ZXIgYXJlIGJhc2VkIG9uIHRoZSBHUEwgcGFydCBvZiB0aGUgb2ZmaWNpYWwgcmVhbHRlayBkcml2ZXIKKwlQYXJ0cyBvZiB0aGlzIGRyaXZlciBhcmUgYmFzZWQgb24gdGhlIHJ0bDgxODAgZHJpdmVyIHNrZWxldG9uIGZyb20gUGF0cmljIFNjaGVua2UgJiBBbmRyZXMgU2Fsb21vbgorCVBhcnRzIG9mIHRoaXMgZHJpdmVyIGFyZSBiYXNlZCBvbiB0aGUgSW50ZWwgUHJvIFdpcmVsZXNzIDIxMDAgR1BMIGRyaXZlcgorCisJV2Ugd2FudCB0byB0YW5rcyB0aGUgQXV0aG9ycyBvZiBzdWNoIHByb2plY3RzIGFuZCB0aGUgTmRpc3dyYXBwZXIgcHJvamVjdCBBdXRob3JzLgorKi8KKworI2RlZmluZSBHQ1RfQU5URU5OQSAweEEzCisKKworLy8gd2UgdXNlIHRoZSB1bnRvdWNoZWQgZWVwcm9tIHZhbHVlLSBjcm9zcyB5b3VyIGZpbmdlciA7LSkKKyNkZWZpbmUgR0NUX0FOQVBBUkFNX1BXUjFfT04gPz8KKyNkZWZpbmUgR0NUX0FOQVBBUkFNX1BXUjBfT04gPz8KKworCisKK3ZvaWQgZ2N0X3JmX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Cit2b2lkIGdjdF9yZl9zZXRfY2hhbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LHNob3J0IGNoKTsKKwordm9pZCBnY3RfcmZfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwX2h3LmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwX2h3LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmYzODkzNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfaHcuaApAQCAtMCwwICsxLDk1NiBAQAorLyoKKwlUaGlzIGlzIHBhcnQgb2YgcnRsODE4MCBPcGVuU291cmNlIGRyaXZlci4KKwlDb3B5cmlnaHQgKEMpIEFuZHJlYSBNZXJlbGxvIDIwMDQtMjAwNSAgPGFuZHJlYW1ybEB0aXNjYWxpLml0PgorCVJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiBHUEwgKEdlbmVyYWwgUHVibGljIExpY2VuY2UpCisKKwlQYXJ0cyBvZiB0aGlzIGRyaXZlciBhcmUgYmFzZWQgb24gdGhlIEdQTCBwYXJ0IG9mIHRoZQorCW9mZmljaWFsIFJlYWx0ZWsgZHJpdmVyLgorCVBhcnRzIG9mIHRoaXMgZHJpdmVyIGFyZSBiYXNlZCBvbiB0aGUgcnRsODE4MCBkcml2ZXIgc2tlbGV0b24KKwlmcm9tIFBhdHJpYyBTY2hlbmtlICYgQW5kcmVzIFNhbG9tb24uCisJUGFydHMgb2YgdGhpcyBkcml2ZXIgYXJlIGJhc2VkIG9uIHRoZSBJbnRlbCBQcm8gV2lyZWxlc3MKKwkyMTAwIEdQTCBkcml2ZXIuCisKKwlXZSB3YW50IHRvIHRhbmtzIHRoZSBBdXRob3JzIG9mIHRob3NlIHByb2plY3RzCisJYW5kIHRoZSBOZGlzd3JhcHBlciBwcm9qZWN0IEF1dGhvcnMuCisqLworCisvKiBNYXJpdXN6IE1hdHVzemVrIGFkZGVkIGZ1bGwgcmVnaXN0ZXJzIGRlZmluaXRpb24gd2l0aCBSZWFsdGVrJ3MgbmFtZSAqLworCisvKiB0aGlzIGZpbGUgY29udGFpbnMgcmVnaXN0ZXIgZGVmaW5pdGlvbnMgZm9yIHRoZSBydGw4MTgwIE1BQyBjb250cm9sbGVyICovCisjaWZuZGVmIFI4MTgwX0hXCisjZGVmaW5lIFI4MTgwX0hXCisKKyNkZWZpbmUgQ09ORklHX1JUTDgxODVCICAvL3N1cHBvcnQgZm9yIHJ0bDgxODVCLCB4aW9uZy0yMDA2LTExLTE1CisjZGVmaW5lIENPTkZJR19SVEw4MThYX1MKKworI2RlZmluZSBCSVQwCTB4MDAwMDAwMDEKKyNkZWZpbmUgQklUMQkweDAwMDAwMDAyCisjZGVmaW5lIEJJVDIJMHgwMDAwMDAwNAorI2RlZmluZSBCSVQzCTB4MDAwMDAwMDgKKyNkZWZpbmUgQklUNAkweDAwMDAwMDEwCisjZGVmaW5lIEJJVDUJMHgwMDAwMDAyMAorI2RlZmluZSBCSVQ2CTB4MDAwMDAwNDAKKyNkZWZpbmUgQklUNwkweDAwMDAwMDgwCisjZGVmaW5lIEJJVDgJMHgwMDAwMDEwMAorI2RlZmluZSBCSVQ5CTB4MDAwMDAyMDAKKyNkZWZpbmUgQklUMTAJMHgwMDAwMDQwMAorI2RlZmluZSBCSVQxMQkweDAwMDAwODAwCisjZGVmaW5lIEJJVDEyCTB4MDAwMDEwMDAKKyNkZWZpbmUgQklUMTMJMHgwMDAwMjAwMAorI2RlZmluZSBCSVQxNAkweDAwMDA0MDAwCisjZGVmaW5lIEJJVDE1CTB4MDAwMDgwMDAKKyNkZWZpbmUgQklUMTYJMHgwMDAxMDAwMAorI2RlZmluZSBCSVQxNwkweDAwMDIwMDAwCisjZGVmaW5lIEJJVDE4CTB4MDAwNDAwMDAKKyNkZWZpbmUgQklUMTkJMHgwMDA4MDAwMAorI2RlZmluZSBCSVQyMAkweDAwMTAwMDAwCisjZGVmaW5lIEJJVDIxCTB4MDAyMDAwMDAKKyNkZWZpbmUgQklUMjIJMHgwMDQwMDAwMAorI2RlZmluZSBCSVQyMwkweDAwODAwMDAwCisjZGVmaW5lIEJJVDI0CTB4MDEwMDAwMDAKKyNkZWZpbmUgQklUMjUJMHgwMjAwMDAwMAorI2RlZmluZSBCSVQyNgkweDA0MDAwMDAwCisjZGVmaW5lIEJJVDI3CTB4MDgwMDAwMDAKKyNkZWZpbmUgQklUMjgJMHgxMDAwMDAwMAorI2RlZmluZSBCSVQyOQkweDIwMDAwMDAwCisjZGVmaW5lIEJJVDMwCTB4NDAwMDAwMDAKKyNkZWZpbmUgQklUMzEJMHg4MDAwMDAwMAorCisjZGVmaW5lIE1BWF9TTEVFUF9USU1FICgxMDAwMCkKKyNkZWZpbmUgTUlOX1NMRUVQX1RJTUUgKDUwKQorCisjZGVmaW5lIEJCX0FOVEFUVEVOX0NIQU4xNAkweDBjCisjZGVmaW5lIEJCX0FOVEVOTkFfQiAweDQwCisKKyNkZWZpbmUgQkJfSE9TVF9CQU5HICgxPDwzMCkKKyNkZWZpbmUgQkJfSE9TVF9CQU5HX0VOICgxPDwyKQorI2RlZmluZSBCQl9IT1NUX0JBTkdfQ0xLICgxPDwxKQorI2RlZmluZSBCQl9IT1NUX0JBTkdfREFUQQkgMQorCisjZGVmaW5lIEFOQVBBUkFNX1RYREFDT0ZGX1NISUZUIDI3CisjZGVmaW5lIEFOQVBBUkFNX1BXUjBfTUFTSyAoKDE8PDMwKXwoMTw8MjkpfCgxPDwyOCkpCisjZGVmaW5lIEFOQVBBUkFNX1BXUjBfU0hJRlQgMjgKKyNkZWZpbmUgQU5BUEFSQU1fUFdSMV9NQVNLICgoMTw8MjYpfCgxPDwyNSl8KDE8PDI0KXwoMTw8MjMpfCgxPDwyMil8KDE8PDIxKXwoMTw8MjApKQorI2RlZmluZSBBTkFQQVJBTV9QV1IxX1NISUZUIDIwCisKKyNkZWZpbmUgTUFDMCAwCisjZGVmaW5lIE1BQzEgMQorI2RlZmluZSBNQUMyIDIKKyNkZWZpbmUgTUFDMyAzCisjZGVmaW5lIE1BQzQgNAorI2RlZmluZSBNQUM1IDUKKyNkZWZpbmUgQ01EIDB4MzcKKyNkZWZpbmUgQ01EX1JTVF9TSElGVCA0CisjZGVmaW5lIENNRF9SRVNFUlZFRF9NQVNLICgoMTw8MSkgfCAoMTw8NSkgfCAoMTw8NikgfCAoMTw8NykpCisjZGVmaW5lIENNRF9SWF9FTkFCTEVfU0hJRlQgMworI2RlZmluZSBDTURfVFhfRU5BQkxFX1NISUZUIDIKKworI2RlZmluZSBFUFJPTV9DTUQgMHg1MAorI2RlZmluZSBFUFJPTV9DTURfUkVTRVJWRURfTUFTSyAoKDE8PDUpfCgxPDw0KSkKKyNkZWZpbmUgRVBST01fQ01EX09QRVJBVElOR19NT0RFX1NISUZUIDYKKyNkZWZpbmUgRVBST01fQ01EX09QRVJBVElOR19NT0RFX01BU0sgKCgxPDw3KXwoMTw8NikpCisjZGVmaW5lIEVQUk9NX0NNRF9DT05GSUcgMHgzCisjZGVmaW5lIEVQUk9NX0NNRF9OT1JNQUwgMAorI2RlZmluZSBFUFJPTV9DTURfTE9BRCAxCisjZGVmaW5lIEVQUk9NX0NNRF9QUk9HUkFNIDIKKyNkZWZpbmUgRVBST01fQ1NfU0hJRlQgMworI2RlZmluZSBFUFJPTV9DS19TSElGVCAyCisjZGVmaW5lIEVQUk9NX1dfU0hJRlQgMQorI2RlZmluZSBFUFJPTV9SX1NISUZUIDAKKyNkZWZpbmUgQ09ORklHMl9ETUFfUE9MTElOR19NT0RFX1NISUZUIDMKKyNkZWZpbmUgSU5UQSAweDNlCisjZGVmaW5lIElOVEFfVFhPVkVSRkxPVyAoMTw8MTUpCisjZGVmaW5lIElOVEFfVElNRU9VVCAoMTw8MTQpCisjZGVmaW5lIElOVEFfQkVBQ09OVElNRU9VVCAoMTw8MTMpCisjZGVmaW5lIElOVEFfQVRJTSAoMTw8MTIpCisjZGVmaW5lIElOVEFfQkVBQ09OREVTQ0VSUiAoMTw8MTEpCisjZGVmaW5lIElOVEFfQkVBQ09OREVTQ09LICgxPDwxMCkKKyNkZWZpbmUgSU5UQV9ISVBSSU9SSVRZREVTQ0VSUiAoMTw8OSkKKyNkZWZpbmUgSU5UQV9ISVBSSU9SSVRZREVTQ09LICgxPDw4KQorI2RlZmluZSBJTlRBX05PUk1QUklPUklUWURFU0NFUlIgKDE8PDcpCisjZGVmaW5lIElOVEFfTk9STVBSSU9SSVRZREVTQ09LICgxPDw2KQorI2RlZmluZSBJTlRBX1JYT1ZFUkZMT1cgKDE8PDUpCisjZGVmaW5lIElOVEFfUlhERVNDRVJSICgxPDw0KQorI2RlZmluZSBJTlRBX0xPV1BSSU9SSVRZREVTQ0VSUiAoMTw8MykKKyNkZWZpbmUgSU5UQV9MT1dQUklPUklUWURFU0NPSyAoMTw8MikKKyNkZWZpbmUgSU5UQV9SWENSQ0VSUiAoMTw8MSkKKyNkZWZpbmUgSU5UQV9SWE9LICgxKQorI2RlZmluZSBJTlRBX01BU0sgMHgzYworI2RlZmluZSBSWFJJTkdfQUREUiAweGU0IC8vIHBhZ2UgMAorI2RlZmluZSBQR1NFTEVDVCAweDVlCisjZGVmaW5lIFBHU0VMRUNUX1BHX1NISUZUIDAKKyNkZWZpbmUgUlhfQ09ORiAweDQ0CisjZGVmaW5lIE1BQ19GSUxURVJfTUFTSyAoKDE8PDApIHwgKDE8PDEpIHwgKDE8PDIpIHwgKDE8PDMpIHwgKDE8PDUpIHwgXAorKDE8PDEyKSB8ICgxPDwxOCkgfCAoMTw8MTkpIHwgKDE8PDIwKSB8ICgxPDwyMSkgfCAoMTw8MjIpIHwgKDE8PDIzKSkKKyNkZWZpbmUgUlhfQ0hFQ0tfQlNTSURfU0hJRlQgMjMKKyNkZWZpbmUgQUNDRVBUX1BXUl9GUkFNRV9TSElGVCAyMgorI2RlZmluZSBBQ0NFUFRfTU5HX0ZSQU1FX1NISUZUIDIwCisjZGVmaW5lIEFDQ0VQVF9DVExfRlJBTUVfU0hJRlQgMTkKKyNkZWZpbmUgQUNDRVBUX0RBVEFfRlJBTUVfU0hJRlQgMTgKKyNkZWZpbmUgQUNDRVBUX0lDVkVSUl9GUkFNRV9TSElGVCAxMgorI2RlZmluZSBBQ0NFUFRfQ1JDRVJSX0ZSQU1FX1NISUZUIDUKKyNkZWZpbmUgQUNDRVBUX0JDQVNUX0ZSQU1FX1NISUZUIDMKKyNkZWZpbmUgQUNDRVBUX01DQVNUX0ZSQU1FX1NISUZUIDIKKyNkZWZpbmUgQUNDRVBUX0FMTE1BQ19GUkFNRV9TSElGVCAwCisjZGVmaW5lIEFDQ0VQVF9OSUNNQUNfRlJBTUVfU0hJRlQgMQorI2RlZmluZSBSWF9GSUZPX1RIUkVTSE9MRF9NQVNLICgoMTw8MTMpIHwgKDE8PDE0KSB8ICgxPDwxNSkpCisjZGVmaW5lIFJYX0ZJRk9fVEhSRVNIT0xEX1NISUZUIDEzCisjZGVmaW5lIFJYX0ZJRk9fVEhSRVNIT0xEXzEyOCAzCisjZGVmaW5lIFJYX0ZJRk9fVEhSRVNIT0xEXzI1NiA0CisjZGVmaW5lIFJYX0ZJRk9fVEhSRVNIT0xEXzUxMiA1CisjZGVmaW5lIFJYX0ZJRk9fVEhSRVNIT0xEXzEwMjQgNgorI2RlZmluZSBSWF9GSUZPX1RIUkVTSE9MRF9OT05FIDcKKyNkZWZpbmUgUlhfQVVUT1JFU0VUUEhZX1NISUZUIDI4CisjZGVmaW5lIEVQUk9NX1RZUEVfU0hJRlQgNgorI2RlZmluZSBUWF9DT05GIDB4NDAKKyNkZWZpbmUgVFhfQ09ORl9IRUFERVJfQVVUT0lDUkVNRU5UX1NISUZUIDMwCisjZGVmaW5lIFRYX0xPT1BCQUNLX1NISUZUIDE3CisjZGVmaW5lIFRYX0xPT1BCQUNLX01BQyAxCisjZGVmaW5lIFRYX0xPT1BCQUNLX0JBU0VCQU5EIDIKKyNkZWZpbmUgVFhfTE9PUEJBQ0tfTk9ORSAwCisjZGVmaW5lIFRYX0xPT1BCQUNLX0NPTlRJTlVFIDMKKyNkZWZpbmUgVFhfTE9PUEJBQ0tfTUFTSyAoKDE8PDE3KXwoMTw8MTgpKQorI2RlZmluZSBUWF9EUFJFVFJZX1NISUZUIDAKKyNkZWZpbmUgUjgxODBfTUFYX1JFVFJZIDI1NQorI2RlZmluZSBUWF9SVFNSRVRSWV9TSElGVCA4CisjZGVmaW5lIFRYX05PSUNWX1NISUZUIDE5CisjZGVmaW5lIFRYX05PQ1JDX1NISUZUIDE2CisjZGVmaW5lIFRYX0RNQV9QT0xMSU5HIDB4ZDkKKyNkZWZpbmUgVFhfRE1BX1BPTExJTkdfQkVBQ09OX1NISUZUIDcKKyNkZWZpbmUgVFhfRE1BX1BPTExJTkdfSElQUklPUklUWV9TSElGVCA2CisjZGVmaW5lIFRYX0RNQV9QT0xMSU5HX05PUk1QUklPUklUWV9TSElGVCA1CisjZGVmaW5lIFRYX0RNQV9QT0xMSU5HX0xPV1BSSU9SSVRZX1NISUZUIDQKKyNkZWZpbmUgVFhfRE1BX1NUT1BfQkVBQ09OX1NISUZUIDMKKyNkZWZpbmUgVFhfRE1BX1NUT1BfSElQUklPUklUWV9TSElGVCAyCisjZGVmaW5lIFRYX0RNQV9TVE9QX05PUk1QUklPUklUWV9TSElGVCAxCisjZGVmaW5lIFRYX0RNQV9TVE9QX0xPV1BSSU9SSVRZX1NISUZUIDAKKyNkZWZpbmUgVFhfTUFOQUdFUFJJT1JJVFlfUklOR19BRERSIDB4MEMKKyNkZWZpbmUgVFhfQktQUklPUklUWV9SSU5HX0FERFIgMHgxMAorI2RlZmluZSBUWF9CRVBSSU9SSVRZX1JJTkdfQUREUiAweDE0CisjZGVmaW5lIFRYX1ZJUFJJT1JJVFlfUklOR19BRERSIDB4MjAKKyNkZWZpbmUgVFhfVk9QUklPUklUWV9SSU5HX0FERFIgMHgyNAorI2RlZmluZSBUWF9ISUdIUFJJT1JJVFlfUklOR19BRERSIDB4MjgKKy8vQUNfVkkgYW5kIExvdyBwcmlvcml0eSBzaGFyZSB0aGUgc2FuZSBxdWV1ZQorI2RlZmluZSBUWF9MT1dQUklPUklUWV9SSU5HX0FERFIgVFhfVklQUklPUklUWV9SSU5HX0FERFIKKy8vQUNfVk8gYW5kIE5vcm0gcHJpb3JpdHkgc2hhcmUgdGhlIHNhbWUgcXVldWUKKyNkZWZpbmUgVFhfTk9STVBSSU9SSVRZX1JJTkdfQUREUiBUWF9WT1BSSU9SSVRZX1JJTkdfQUREUgorCisjZGVmaW5lIE1BWF9SWF9ETUFfTUFTSyAoKDE8PDgpIHwgKDE8PDkpIHwgKDE8PDEwKSkKKyNkZWZpbmUgTUFYX1JYX0RNQV8yMDQ4IDcKKyNkZWZpbmUgTUFYX1JYX0RNQV8xMDI0CTYKKyNkZWZpbmUgTUFYX1JYX0RNQV9TSElGVCAxMAorI2RlZmluZSBJTlRfVElNRU9VVCAweDQ4CisjZGVmaW5lIENPTkZJRzNfQ0xLUlVOX1NISUZUIDIKKyNkZWZpbmUgQ09ORklHM19BTkFQQVJBTV9XX1NISUZUIDYKKyNkZWZpbmUgQU5BUEFSQU0gMHg1NAorI2RlZmluZSBCRUFDT05fSU5URVJWQUwgMHg3MAorI2RlZmluZSBCRUFDT05fSU5URVJWQUxfTUFTSyAoKDE8PDApfCgxPDwxKXwoMTw8Mil8KDE8PDMpfCgxPDw0KXwoMTw8NSl8IFwKKygxPDw2KXwoMTw8Nyl8KDE8PDgpfCgxPDw5KSkKKyNkZWZpbmUgQVRJTV9NQVNLICgoMTw8MCl8KDE8PDEpfCgxPDwyKXwoMTw8Myl8KDE8PDQpfCgxPDw1KXwoMTw8Nil8KDE8PDcpfCBcCisoMTw8OCl8KDE8PDkpKQorI2RlZmluZSBBVElNIDB4NzIKKyNkZWZpbmUgRVBST01fQ1NfU0hJRlQgMworI2RlZmluZSBFUFJPTV9DS19TSElGVCAyCisjZGVmaW5lIFBIWV9ERUxBWSAweDc4CisjZGVmaW5lIFBIWV9DT05GSUcgMHg4MAorI2RlZmluZSBQSFlfQURSIDB4N2MKKyNkZWZpbmUgUEhZX1JFQUQgMHg3ZQorI2RlZmluZSBDQVJSSUVSX1NFTlNFX0NPVU5URVIgMHg3OSAvL2J5dGUKKyNkZWZpbmUgU0VDVVJJVFkgMHg1ZiAvLzEyMDkgdGhpcyBpcyBzdGggd3JvbmcKKyNkZWZpbmUgU0VDVVJJVFlfV0VQX1RYX0VOQUJMRV9TSElGVCAxCisjZGVmaW5lIFNFQ1VSSVRZX1dFUF9SWF9FTkFCTEVfU0hJRlQgMAorI2RlZmluZSBTRUNVUklUWV9FTkNSWVBfMTA0IDEKKyNkZWZpbmUgU0VDVVJJVFlfRU5DUllQX1NISUZUIDQKKyNkZWZpbmUgU0VDVVJJVFlfRU5DUllQX01BU0sgKCgxPDw0KXwoMTw8NSkpCisjZGVmaW5lIEtFWTAgMHg5MCAgLy8xMjA5IHRoaXMgaXMgc3RoIHdyb25nCisjZGVmaW5lIENPTkZJRzJfQU5URU5OQV9TSElGVCA2CisjZGVmaW5lIFRYX0JFQUNPTl9SSU5HX0FERFIgMHg0YworI2RlZmluZSBDT05GSUcwX1dFUDQwX1NISUZUIDcKKyNkZWZpbmUgQ09ORklHMF9XRVAxMDRfU0hJRlQgNgorI2RlZmluZSBBR0NSRVNFVF9TSElGVCA1CisKKworCisvKgorICogT3BlcmF0aW9uYWwgcmVnaXN0ZXJzIG9mZnNldHMgaW4gUENJIChJL08pIHNwYWNlLgorICogUmVhbFRlayBuYW1lcyBhcmUgdXNlZC4KKyAqLworCisjZGVmaW5lIElEUjAgMHgwMDAwCisjZGVmaW5lIElEUjEgMHgwMDAxCisjZGVmaW5lIElEUjIgMHgwMDAyCisjZGVmaW5lIElEUjMgMHgwMDAzCisjZGVmaW5lIElEUjQgMHgwMDA0CisjZGVmaW5lIElEUjUgMHgwMDA1CisKKy8qIDB4MDAwNiAtIDB4MDAwNyAtIHJlc2VydmVkICovCisKKyNkZWZpbmUgTUFSMCAweDAwMDgKKyNkZWZpbmUgTUFSMSAweDAwMDkKKyNkZWZpbmUgTUFSMiAweDAwMEEKKyNkZWZpbmUgTUFSMyAweDAwMEIKKyNkZWZpbmUgTUFSNCAweDAwMEMKKyNkZWZpbmUgTUFSNSAweDAwMEQKKyNkZWZpbmUgTUFSNiAweDAwMEUKKyNkZWZpbmUgTUFSNyAweDAwMEYKKworLyogMHgwMDEwIC0gMHgwMDE3IC0gcmVzZXJ2ZWQgKi8KKworI2RlZmluZSBUU0ZUUiAweDAwMTgKKyNkZWZpbmUgVFNGVFJfRU5EIDB4MDAxRgorCisjZGVmaW5lIFRMUERBIDB4MDAyMAorI2RlZmluZSBUTFBEQV9FTkQgMHgwMDIzCisjZGVmaW5lIFROUERBIDB4MDAyNAorI2RlZmluZSBUTlBEQV9FTkQgMHgwMDI3CisjZGVmaW5lIFRIUERBIDB4MDAyOAorI2RlZmluZSBUSFBEQV9FTkQgMHgwMDJCCisKKyNkZWZpbmUgQlNTSUQgMHgwMDJFCisjZGVmaW5lIEJTU0lEX0VORCAweDAwMzMKKworI2RlZmluZSBDUiAweDAwMzcKKworI2lmZGVmIENPTkZJR19SVEw4MTg1QgorI2RlZmluZSBSRl9TV19DT05GSUcJICAgICAgICAweDgJCQkvLyBzdG9yZSBkYXRhIHdoaWNoIGlzIHRyYW5zbWl0dGVkIHRvIFJGIGZvciBkcml2ZXIKKyNkZWZpbmUgUkZfU1dfQ0ZHX1NJCQlCSVQxCisjZGVmaW5lIFBJRlMJCQkweDJDCQkJLy8gUENGIEludGVyRnJhbWUgU3BhY2luZyBUaW1lciBTZXR0aW5nLgorI2RlZmluZSBFSUZTCQkJMHgyRAkJCS8vIEV4dGVuZGVkIEludGVyRnJhbWUgU3BhY2UgVGltZXIsIGluIHVuaXQgb2YgNCB1cy4KKworI2RlZmluZSBCUlNSCQkJMHgzNAkJCS8vIEJhc2ljIHJhdGUgc2V0CisKKyNkZWZpbmUgSU1SIDB4MDA2QworI2RlZmluZSBJU1IgMHgwMDNDCisjZWxzZQorI2RlZmluZSBCUlNSIDB4MDAyQworI2RlZmluZSBCUlNSX0VORCAweDAwMkQKKworLyogMHgwMDM0IC0gMHgwMDM0IC0gcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgRUlGUyAweDAwMzUKKworI2RlZmluZSBJTVIgMHgwMDNDCisjZGVmaW5lIElNUl9FTkQgMHgwMDNECisjZGVmaW5lIElTUiAweDAwM0UKKyNkZWZpbmUgSVNSX0VORCAweDAwM0YKKyNlbmRpZgorCisjZGVmaW5lIFRDUiAweDAwNDAKKyNkZWZpbmUgVENSX0VORCAweDAwNDMKKworI2RlZmluZSBSQ1IgMHgwMDQ0CisjZGVmaW5lIFJDUl9FTkQgMHgwMDQ3CisKKyNkZWZpbmUgVGltZXJJbnQgMHgwMDQ4CisjZGVmaW5lIFRpbWVySW50X0VORCAweDAwNEIKKworI2RlZmluZSBUQkRBIDB4MDA0QworI2RlZmluZSBUQkRBX0VORCAweDAwNEYKKworI2RlZmluZSBDUjkzNDYgMHgwMDUwCisKKyNkZWZpbmUgQ09ORklHMCAweDAwNTEKKyNkZWZpbmUgQ09ORklHMSAweDAwNTIKKyNkZWZpbmUgQ09ORklHMiAweDAwNTMKKworI2RlZmluZSBBTkFfUEFSTSAweDAwNTQKKyNkZWZpbmUgQU5BX1BBUk1fRU5EIDB4MHgwMDU3CisKKyNkZWZpbmUgTVNSIDB4MDA1OAorCisjZGVmaW5lIENPTkZJRzMgMHgwMDU5CisjZGVmaW5lIENPTkZJRzQgMHgwMDVBCisjaWZkZWYgQ09ORklHX1JUTDgxODVCCisjaWZkZWYgQ09ORklHX1JUTDgxOFhfUworCS8vIFNEMyBzenV5aXRhc2k6IE1hYzB4NTc9IENDIC0+IEIwIE1hYzB4NjA9IEQxIC0+IEM2CisJLy8gTWFjMHg2MCA9IDB4MDAwMDA0QzYgcG93ZXIgc2F2ZSBwYXJhbWV0ZXJzCisJI2RlZmluZSBBTkFQQVJNX0FTSUNfT04gICAgMHhCMDA1NEQwMAorCSNkZWZpbmUgQU5BUEFSTTJfQVNJQ19PTiAgMHgwMDAwMDRDNgorCisJI2RlZmluZSBBTkFQQVJNX09OIEFOQVBBUk1fQVNJQ19PTgorCSNkZWZpbmUgQU5BUEFSTTJfT04gQU5BUEFSTTJfQVNJQ19PTgorI2Vsc2UKKwkvLyBTRDMgQ01MaW46CisJI2RlZmluZSBBTkFQQVJNX0FTSUNfT04gICAgMHg0NTA5MDY1OAorCSNkZWZpbmUgQU5BUEFSTTJfQVNJQ19PTiAgMHg3MjdmM2Y1MgorCisJI2RlZmluZSBBTkFQQVJNX09OIEFOQVBBUk1fQVNJQ19PTgorCSNkZWZpbmUgQU5BUEFSTTJfT04gQU5BUEFSTTJfQVNJQ19PTgorI2VuZGlmCisjZW5kaWYKKworI2RlZmluZSBURVNUUiAweDAwNUIKKworLyogMHgwMDVDIC0gMHgwMDVEIC0gcmVzZXJ2ZWQgKi8KKworI2RlZmluZSBQU1IgMHgwMDVFCisKKy8qIDB4MDA2MCAtIDB4MDA2RiAtIHJlc2VydmVkICovCisKKyNkZWZpbmUgQmNuSXR2IDB4MDA3MAorI2RlZmluZSBCY25JdHZfRU5EIDB4MDA3MQorCisjZGVmaW5lIEF0aW1XbmQgMHgwMDcyCisjZGVmaW5lIEF0aW1XbmRfRU5EIDB4MDA3MworCisjZGVmaW5lIEJpbnRySXR2IDB4MDA3NAorI2RlZmluZSBCaW50ckl0dl9FTkQgMHgwMDc1CisKKyNkZWZpbmUgQXRpbXRySXR2IDB4MDA3NgorI2RlZmluZSBBdGltdHJJdHZfRU5EIDB4MDA3NworCisjZGVmaW5lIFBoeURlbGF5IDB4MDA3OAorCisjZGVmaW5lIENSQ291bnQgMHgwMDc5CisKKy8qIDB4MDA3QSAtIDB4MDA3QiAtIHJlc2VydmVkICovCisKKyNkZWZpbmUgUGh5QWRkciAweDAwN0MKKyNkZWZpbmUgUGh5RGF0YVcgMHgwMDdECisjZGVmaW5lIFBoeURhdGFSIDB4MDA3RQorCisjZGVmaW5lIFBoeUNGRyAweDAwODAKKyNkZWZpbmUgUGh5Q0ZHX0VORCAweDAwODMKKworLyogZm9sbG93aW5nIGFyZSBmb3IgcnRsODE4NSAqLworI2RlZmluZSBSRlBpbnNPdXRwdXQgMHg4MAorI2RlZmluZSBSRlBpbnNFbmFibGUgMHg4MgorI2RlZmluZSBSRl9USU1JTkcgMHg4YworI2RlZmluZSBSRlBpbnNTZWxlY3QgMHg4NAorI2RlZmluZSBBTkFQQVJBTTIgMHg2MAorI2RlZmluZSBSRl9QQVJBIDB4ODgKKyNkZWZpbmUgUkZQaW5zSW5wdXQgMHg4NgorI2RlZmluZSBHUF9FTkFCTEUgMHg5MAorI2RlZmluZSBHUElPIDB4OTEKKyNkZWZpbmUgU1dfQ09OVFJPTF9HUElPIDB4NDAwCisjZGVmaW5lIFRYX0FOVEVOTkEgMHg5ZgorI2RlZmluZSBUWF9HQUlOX09GRE0gMHg5ZQorI2RlZmluZSBUWF9HQUlOX0NDSyAweDlkCisjZGVmaW5lIFdQQV9DT05GSUcgMHhiMAorI2RlZmluZSBUWF9BR0NfQ1RMIDB4OWMKKyNkZWZpbmUgVFhfQUdDX0NUTF9QRVJQQUNLRVRfR0FJTl9TSElGVCAwCisjZGVmaW5lIFRYX0FHQ19DVExfUEVSUEFDS0VUX0FOVFNFTF9TSElGVCAxCisjZGVmaW5lIFRYX0FHQ19DVExfRkVFREJBQ0tfQU5UIDIKKyNkZWZpbmUgUkVTUF9SQVRFIDB4MzQKKyNkZWZpbmUgU0lGUyAweGI0CisjZGVmaW5lIERJRlMgMHhiNQorCisjZGVmaW5lIFNMT1QgMHhiNgorI2RlZmluZSBDV19DT05GIDB4YmMKKyNkZWZpbmUgQ1dfQ09ORl9QRVJQQUNLRVRfUkVUUllfU0hJRlQgMQorI2RlZmluZSBDV19DT05GX1BFUlBBQ0tFVF9DV19TSElGVCAwCisjZGVmaW5lIENXX1ZBTCAweGJkCisjZGVmaW5lIE1BWF9SRVNQX1JBVEVfU0hJRlQgNAorI2RlZmluZSBNSU5fUkVTUF9SQVRFX1NISUZUIDAKKyNkZWZpbmUgUkFURV9GQUxMQkFDSyAweGJlCisvKgorICogIDB4MDA4NCAtIDB4MDBEMyBpcyBzZWxlY3RlZCB0byBwYWdlIDEgd2hlbiBQU0VuIGJpdCAoYml0MCwgUFNSKQorICogIGlzIHNldCB0byAxCisgKi8KKworI2RlZmluZSBXYWtldXAwIDB4MDA4NAorI2RlZmluZSBXYWtldXAwX0VORCAweDAwOEIKKworI2RlZmluZSBXYWtldXAxIDB4MDA4QworI2RlZmluZSBXYWtldXAxX0VORCAweDAwOTMKKworI2RlZmluZSBXYWtldXAyTEQgMHgwMDk0CisjZGVmaW5lIFdha2V1cDJMRF9FTkQgMHgwMDlCCisjZGVmaW5lIFdha2V1cDJIRCAweDAwOUMKKyNkZWZpbmUgV2FrZXVwMkhEX0VORCAweDAwQTMKKworI2RlZmluZSBXYWtldXAzTEQgMHgwMEE0CisjZGVmaW5lIFdha2V1cDNMRF9FTkQgMHgwMEFCCisjZGVmaW5lIFdha2V1cDNIRCAweDAwQUMKKyNkZWZpbmUgV2FrZXVwM0hEX0VORCAweDAwQjMKKworI2RlZmluZSBXYWtldXA0TEQgMHgwMEI0CisjZGVmaW5lIFdha2V1cDRMRF9FTkQgMHgwMEJCCisjZGVmaW5lIFdha2V1cDRIRCAweDAwQkMKKyNkZWZpbmUgV2FrZXVwNEhEX0VORCAweDAwQzMKKworI2RlZmluZSBDUkMwIDB4MDBDNAorI2RlZmluZSBDUkMwX0VORCAweDAwQzUKKyNkZWZpbmUgQ1JDMSAweDAwQzYKKyNkZWZpbmUgQ1JDMV9FTkQgMHgwMEM3CisjZGVmaW5lIENSQzIgMHgwMEM4CisjZGVmaW5lIENSQzJfRU5EIDB4MDBDOQorI2RlZmluZSBDUkMzIDB4MDBDQQorI2RlZmluZSBDUkMzX0VORCAweDAwQ0IKKyNkZWZpbmUgQ1JDNCAweDAwQ0MKKyNkZWZpbmUgQ1JDNF9FTkQgMHgwMENECisKKy8qIDB4MDBDRSAtIDB4MDBEMyAtIHJlc2VydmVkICovCisKKworCisvKgorICogIDB4MDA4NCAtIDB4MDBEMyBpcyBzZWxlY3RlZCB0byBwYWdlIDAgd2hlbiBQU0VuIGJpdCAoYml0MCwgUFNSKQorICogIGlzIHNldCB0byAwCisgKi8KKworLyogMHgwMDg0IC0gMHgwMDhGIC0gcmVzZXJ2ZWQgKi8KKworI2RlZmluZSBESzAgMHgwMDkwCisjZGVmaW5lIERLMF9FTkQgMHgwMDlGCisjZGVmaW5lIERLMSAweDAwQTAKKyNkZWZpbmUgREsxX0VORCAweDAwQUYKKyNkZWZpbmUgREsyIDB4MDBCMAorI2RlZmluZSBESzJfRU5EIDB4MDBCRgorI2RlZmluZSBESzMgMHgwMEMwCisjZGVmaW5lIERLM19FTkQgMHgwMENGCisKKy8qIDB4MDBEMCAtIDB4MDBEMyAtIHJlc2VydmVkICovCisKKworCisKKworLyogMHgwMEQ0IC0gMHgwMEQ3IC0gcmVzZXJ2ZWQgKi8KKworI2RlZmluZSBDT05GSUc1IDB4MDBEOAorCisjZGVmaW5lIFRQUG9sbCAweDAwRDkKKworLyogMHgwMERBIC0gMHgwMERCIC0gcmVzZXJ2ZWQgKi8KKworI2lmZGVmIENPTkZJR19SVEw4MThYX1MKKyNkZWZpbmUgUEhZUFIJCQkweERBCQkJLy8weERBIC0gMHgwQiBQSFkgUGFyYW1ldGVyIFJlZ2lzdGVyLgorI2VuZGlmCisKKyNkZWZpbmUgQ1dSIDB4MDBEQworI2RlZmluZSBDV1JfRU5EIDB4MDBERAorCisjZGVmaW5lIFJldHJ5Q1RSIDB4MDBERQorCisvKiAweDAwREYgLSAweDAwRTMgLSByZXNlcnZlZCAqLworCisjZGVmaW5lIFJEU0FSIDB4MDBFNAorI2RlZmluZSBSRFNBUl9FTkQgMHgwMEU3CisKKy8qIDB4MDBFOCAtIDB4MDBFRiAtIHJlc2VydmVkICovCisjaWZkZWYgQ09ORklHX1JUTDgxOFhfUworI2RlZmluZSBMRURfQ09OVFJPTAkJMHhFRAorI2VuZGlmCisKKyNkZWZpbmUgRkVSIDB4MDBGMAorI2RlZmluZSBGRVJfRU5EIDB4MDBGMworCisjaWZkZWYgQ09ORklHX1JUTDgxODVCCisjZGVmaW5lIEZFTVIJCQkweDFENAkvLyBGdW5jdGlvbiBFdmVudCBNYXNrIHJlZ2lzdGVyCisjZWxzZQorI2RlZmluZSBGRU1SIDB4MDBGNAorI2RlZmluZSBGRU1SX0VORCAweDAwRjcKKyNlbmRpZgorCisjZGVmaW5lIEZQU1IgMHgwMEY4CisjZGVmaW5lIEZQU1JfRU5EIDB4MDBGQgorCisjZGVmaW5lIEZGRVIgMHgwMEZDCisjZGVmaW5lIEZGRVJfRU5EIDB4MDBGRgorCisKKworLyoKKyAqIEJpdG1hc2tzIGZvciBzcGVjaWZpYyByZWdpc3RlciBmdW5jdGlvbnMuCisgKiBOYW1lcyBhcmUgZGVyaXZlZCBmcm9tIHRoZSByZWdpc3RlciBuYW1lIGFuZCBmdW5jdGlvbiBuYW1lLgorICoKKyAqIDxSRUdJU1RFUj5fPEZVTkNUSU9OPls8Yml0Pl0KKyAqCisgKiB0aGlzIGxlYWRzIHRvIHNvbWUgYXdrd2FyZCBuYW1lcy4uLgorICovCisKKyNkZWZpbmUgQlJTUl9CUExDUCAgKCgxPDwgOCkpCisjZGVmaW5lIEJSU1JfTUJSICAgICgoMTw8IDEpfCgxPDwgMCkpCisjZGVmaW5lIEJSU1JfTUJSXzgxODUgKCgxPDwgMTEpfCgxPDwgMTApfCgxPDwgOSl8KDE8PCA4KXwoMTw8IDcpfCgxPDwgNil8KDE8PCA1KXwoMTw8IDQpfCgxPDwgMyl8KDE8PCAyKXwoMTw8IDEpfCgxPDwgMCkpCisjZGVmaW5lIEJSU1JfTUJSMCAgICgoMTw8IDApKQorI2RlZmluZSBCUlNSX01CUjEgICAoKDE8PCAxKSkKKworI2RlZmluZSBDUl9SU1QgICAgICAoKDE8PCA0KSkKKyNkZWZpbmUgQ1JfUkUgICAgICAgKCgxPDwgMykpCisjZGVmaW5lIENSX1RFICAgICAgICgoMTw8IDIpKQorI2RlZmluZSBDUl9NdWxSVyAgICAoKDE8PCAwKSkKKworI2lmZGVmIENPTkZJR19SVEw4MTg1QgorI2RlZmluZSBJTVJfRG90MTFoSW50CSgoMTw8IDI1KSkJCQkvLyA4MDIuMTFoIE1lYXN1cmVtZW50IEludGVycnVwdAorI2RlZmluZSBJTVJfQmNuRG1hSW50CSgoMTw8IDI0KSkJCQkvLyBCZWFjb24gRE1BIEludGVycnVwdCAvLyBXaGF0IGRpZmZlcmVuY3QgYmV0d2VlbiBCY25EbWFJbnQgYW5kIEJjbkludD8/PworI2RlZmluZSBJTVJfV2FrZUludAkJKCgxPDwgMjMpKQkJCS8vIFdha2UgVXAgSW50ZXJydXB0CisjZGVmaW5lIElNUl9UWEZPVlcJCSgoMTw8IDIyKSkJCQkvLyBUeCBGSUZPIE92ZXJmbG93IEludGVycnVwdAorI2RlZmluZSBJTVJfVGltZU91dDEJKCgxPDwgMjEpKQkJCS8vIFRpbWUgT3V0IEludGVycnVwdCAxCisjZGVmaW5lIElNUl9CY25JbnQJCSgoMTw8IDIwKSkJCQkvLyBCZWFjb24gVGltZSBvdXQgSW50ZXJydXB0CisjZGVmaW5lIElNUl9BVElNSW50CQkoKDE8PCAxOSkpCQkJLy8gQVRJTSBUaW1lIE91dCBJbnRlcnJ1cHQKKyNkZWZpbmUgSU1SX1RCREVSCQkoKDE8PCAxOCkpCQkJLy8gVHggQmVhY29uIERlc2NyaXB0b3IgRXJyb3IgSW50ZXJydXB0CisjZGVmaW5lIElNUl9UQkRPSwkJKCgxPDwgMTcpKQkJCS8vIFR4IEJlYWNvbiBEZXNjcmlwdG9yIE9LIEludGVycnVwdAorI2RlZmluZSBJTVJfVEhQREVSCQkoKDE8PCAxNikpCQkJLy8gVHggSGlnaCBQcmlvcml0eSBEZXNjcmlwdG9yIEVycm9yIEludGVycnVwdAorI2RlZmluZSBJTVJfVEhQRE9LCQkoKDE8PCAxNSkpCQkJLy8gVHggSGlnaCBQcmlvcml0eSBEZXNjcmlwdG9yIE9LIEludGVycnVwdAorI2RlZmluZSBJTVJfVFZPREVSCQkoKDE8PCAxNCkpCQkJLy8gVHggQUNfVk8gRGVzY3JpcHRvciBFcnJvciBJbnRlcnJ1cHQKKyNkZWZpbmUgSU1SX1RWT0RPSwkJKCgxPDwgMTMpKQkJCS8vIFR4IEFDX1ZPIERlc2NyaXB0b3IgT0sgSW50ZXJydXB0CisjZGVmaW5lIElNUl9GT1ZXCQkoKDE8PCAxMikpCQkJLy8gUnggRklGTyBPdmVyZmxvdyBJbnRlcnJ1cHQKKyNkZWZpbmUgSU1SX1JEVQkJCSgoMTw8IDExKSkJCQkvLyBSeCBEZXNjcmlwdG9yIFVuYXZhaWxhYmxlIEludGVycnVwdAorI2RlZmluZSBJTVJfVFZJREVSCQkoKDE8PCAxMCkpCQkJLy8gVHggQUNfVkkgRGVzY3JpcHRvciBFcnJvciBJbnRlcnJ1cHQKKyNkZWZpbmUgSU1SX1RWSURPSwkJKCgxPDwgOSkpCQkvLyBUeCBBQ19WSSBEZXNjcmlwdG9yIE9LIEludGVycnVwdAorI2RlZmluZSBJTVJfUkVSCQkJKCgxPDwgOCkpCQkvLyBSeCBFcnJvciBJbnRlcnJ1cHQKKyNkZWZpbmUgSU1SX1JPSwkJCSgoMTw8IDcpKQkJLy8gUmVjZWl2ZSBPSyBJbnRlcnJ1cHQKKyNkZWZpbmUgSU1SX1RCRURFUgkJKCgxPDwgNikpCQkJLy8gVHggQUNfQkUgRGVzY3JpcHRvciBFcnJvciBJbnRlcnJ1cHQKKyNkZWZpbmUgSU1SX1RCRURPSwkJKCgxPDwgNSkpCQkJLy8gVHggQUNfQkUgRGVzY3JpcHRvciBPSyBJbnRlcnJ1cHQKKyNkZWZpbmUgSU1SX1RCS0RFUgkJKCgxPDwgNCkpCQkvLyBUeCBBQ19CSyBEZXNjcmlwdG9yIEVycm9yIEludGVycnVwdAorI2RlZmluZSBJTVJfVEJLRE9LCQkoKDE8PCAzKSkJCQkvLyBUeCBBQ19CSyBEZXNjcmlwdG9yIE9LIEludGVycnVwdAorI2RlZmluZSBJTVJfUlFvU09LCQkoKDE8PCAyKSkJCS8vIFJ4IFFvUyBPSyBJbnRlcnJ1cHQKKyNkZWZpbmUgSU1SX1RpbWVPdXQyCSgoMTw8IDEpKQkJLy8gVGltZSBPdXQgSW50ZXJydXB0IDIKKyNkZWZpbmUgSU1SX1RpbWVPdXQzCSgoMTw8IDApKQkJCS8vIFRpbWUgT3V0IEludGVycnVwdCAzCisjZGVmaW5lIElNUl9UTUdET0sgICAgICAoKDE8PDMwKSkKKyNkZWZpbmUgSVNSX0RvdDExaEludAkoKDE8PCAyNSkpCQkJLy8gODAyLjExaCBNZWFzdXJlbWVudCBJbnRlcnJ1cHQKKyNkZWZpbmUgSVNSX0JjbkRtYUludAkoKDE8PCAyNCkpCQkJLy8gQmVhY29uIERNQSBJbnRlcnJ1cHQgLy8gV2hhdCBkaWZmZXJlbmN0IGJldHdlZW4gQmNuRG1hSW50IGFuZCBCY25JbnQ/Pz8KKyNkZWZpbmUgSVNSX1dha2VJbnQJCSgoMTw8IDIzKSkJCQkvLyBXYWtlIFVwIEludGVycnVwdAorI2RlZmluZSBJU1JfVFhGT1ZXCQkoKDE8PCAyMikpCQkJLy8gVHggRklGTyBPdmVyZmxvdyBJbnRlcnJ1cHQKKyNkZWZpbmUgSVNSX1RpbWVPdXQxCSgoMTw8IDIxKSkJCQkvLyBUaW1lIE91dCBJbnRlcnJ1cHQgMQorI2RlZmluZSBJU1JfQmNuSW50CQkoKDE8PCAyMCkpCQkJLy8gQmVhY29uIFRpbWUgb3V0IEludGVycnVwdAorI2RlZmluZSBJU1JfQVRJTUludAkJKCgxPDwgMTkpKQkJCS8vIEFUSU0gVGltZSBPdXQgSW50ZXJydXB0CisjZGVmaW5lIElTUl9UQkRFUgkJKCgxPDwgMTgpKQkJCS8vIFR4IEJlYWNvbiBEZXNjcmlwdG9yIEVycm9yIEludGVycnVwdAorI2RlZmluZSBJU1JfVEJET0sJCSgoMTw8IDE3KSkJCQkvLyBUeCBCZWFjb24gRGVzY3JpcHRvciBPSyBJbnRlcnJ1cHQKKyNkZWZpbmUgSVNSX1RIUERFUgkJKCgxPDwgMTYpKQkJCS8vIFR4IEhpZ2ggUHJpb3JpdHkgRGVzY3JpcHRvciBFcnJvciBJbnRlcnJ1cHQKKyNkZWZpbmUgSVNSX1RIUERPSwkJKCgxPDwgMTUpKQkJCS8vIFR4IEhpZ2ggUHJpb3JpdHkgRGVzY3JpcHRvciBPSyBJbnRlcnJ1cHQKKyNkZWZpbmUgSVNSX1RWT0RFUgkJKCgxPDwgMTQpKQkJCS8vIFR4IEFDX1ZPIERlc2NyaXB0b3IgRXJyb3IgSW50ZXJydXB0CisjZGVmaW5lIElTUl9UVk9ET0sJCSgoMTw8IDEzKSkJCQkvLyBUeCBBQ19WTyBEZXNjcmlwdG9yIE9LIEludGVycnVwdAorI2RlZmluZSBJU1JfRk9WVwkJKCgxPDwgMTIpKQkJCS8vIFJ4IEZJRk8gT3ZlcmZsb3cgSW50ZXJydXB0CisjZGVmaW5lIElTUl9SRFUJCQkoKDE8PCAxMSkpCQkJLy8gUnggRGVzY3JpcHRvciBVbmF2YWlsYWJsZSBJbnRlcnJ1cHQKKyNkZWZpbmUgSVNSX1RWSURFUgkJKCgxPDwgMTApKQkJCS8vIFR4IEFDX1ZJIERlc2NyaXB0b3IgRXJyb3IgSW50ZXJydXB0CisjZGVmaW5lIElTUl9UVklET0sJCSgoMTw8IDkpKQkJLy8gVHggQUNfVkkgRGVzY3JpcHRvciBPSyBJbnRlcnJ1cHQKKyNkZWZpbmUgSVNSX1JFUgkJCSgoMTw8IDgpKQkJLy8gUnggRXJyb3IgSW50ZXJydXB0CisjZGVmaW5lIElTUl9ST0sJCQkoKDE8PCA3KSkJCS8vIFJlY2VpdmUgT0sgSW50ZXJydXB0CisjZGVmaW5lIElTUl9UQkVERVIJCSgoMTw8IDYpKQkJCS8vIFR4IEFDX0JFIERlc2NyaXB0b3IgRXJyb3IgSW50ZXJydXB0CisjZGVmaW5lIElTUl9UQkVET0sJCSgoMTw8IDUpKQkJCS8vIFR4IEFDX0JFIERlc2NyaXB0b3IgT0sgSW50ZXJydXB0CisjZGVmaW5lIElTUl9UQktERVIJCSgoMTw8IDQpKQkJLy8gVHggQUNfQksgRGVzY3JpcHRvciBFcnJvciBJbnRlcnJ1cHQKKyNkZWZpbmUgSVNSX1RCS0RPSwkJKCgxPDwgMykpCQkJLy8gVHggQUNfQksgRGVzY3JpcHRvciBPSyBJbnRlcnJ1cHQKKyNkZWZpbmUgSVNSX1JRb1NPSwkJKCgxPDwgMikpCQkvLyBSeCBRb1MgT0sgSW50ZXJydXB0CisjZGVmaW5lIElTUl9UaW1lT3V0MgkoKDE8PCAxKSkJCS8vIFRpbWUgT3V0IEludGVycnVwdCAyCisjZGVmaW5lIElTUl9UaW1lT3V0MwkoKDE8PCAwKSkJCQkvLyBUaW1lIE91dCBJbnRlcnJ1cHQgMworCisvL3RoZXNlIGRlZmluaXRpb24gaXMgdXNlZCBmb3IgVHgvUnggdGVzdCB0ZW1wb3JhcmlseQorI2RlZmluZSBJU1JfVExQREVSICBJU1JfVFZJREVSCisjZGVmaW5lIElTUl9UTFBET0sgIElTUl9UVklET0sKKyNkZWZpbmUgSVNSX1ROUERFUiAgSVNSX1RWT0RFUgorI2RlZmluZSBJU1JfVE5QRE9LICBJU1JfVFZPRE9LCisjZGVmaW5lIElTUl9UaW1lT3V0IElTUl9UaW1lT3V0MQorI2RlZmluZSBJU1JfUlhGT1ZXIElTUl9GT1ZXCisKKyNlbHNlCisjZGVmaW5lIElNUl9UWEZPVlcgICgoMTw8MTUpKQorI2RlZmluZSBJTVJfVGltZU91dCAoKDE8PDE0KSkKKyNkZWZpbmUgSU1SX0JjbkludCAgKCgxPDwxMykpCisjZGVmaW5lIElNUl9BVElNSW50ICgoMTw8MTIpKQorI2RlZmluZSBJTVJfVEJERVIgICAoKDE8PDExKSkKKyNkZWZpbmUgSU1SX1RCRE9LICAgKCgxPDwxMCkpCisjZGVmaW5lIElNUl9USFBERVIgICgoMTw8IDkpKQorI2RlZmluZSBJTVJfVEhQRE9LICAoKDE8PCA4KSkKKyNkZWZpbmUgSU1SX1ROUERFUiAgKCgxPDwgNykpCisjZGVmaW5lIElNUl9UTlBET0sgICgoMTw8IDYpKQorI2RlZmluZSBJTVJfUlhGT1ZXICAoKDE8PCA1KSkKKyNkZWZpbmUgSU1SX1JEVSAgICAgKCgxPDwgNCkpCisjZGVmaW5lIElNUl9UTFBERVIgICgoMTw8IDMpKQorI2RlZmluZSBJTVJfVExQRE9LICAoKDE8PCAyKSkKKyNkZWZpbmUgSU1SX1JFUiAgICAgKCgxPDwgMSkpCisjZGVmaW5lIElNUl9ST0sgICAgICgoMTw8IDApKQorCisjZGVmaW5lIElTUl9UWEZPVlcgICgoMTw8MTUpKQorI2RlZmluZSBJU1JfVGltZU91dCAoKDE8PDE0KSkKKyNkZWZpbmUgSVNSX0JjbkludCAgKCgxPDwxMykpCisjZGVmaW5lIElTUl9BVElNSW50ICgoMTw8MTIpKQorI2RlZmluZSBJU1JfVEJERVIgICAoKDE8PDExKSkKKyNkZWZpbmUgSVNSX1RCRE9LICAgKCgxPDwxMCkpCisjZGVmaW5lIElTUl9USFBERVIgICgoMTw8IDkpKQorI2RlZmluZSBJU1JfVEhQRE9LICAoKDE8PCA4KSkKKyNkZWZpbmUgSVNSX1ROUERFUiAgKCgxPDwgNykpCisjZGVmaW5lIElTUl9UTlBET0sgICgoMTw8IDYpKQorI2RlZmluZSBJU1JfUlhGT1ZXICAoKDE8PCA1KSkKKyNkZWZpbmUgSVNSX1JEVSAgICAgKCgxPDwgNCkpCisjZGVmaW5lIElTUl9UTFBERVIgICgoMTw8IDMpKQorI2RlZmluZSBJU1JfVExQRE9LICAoKDE8PCAyKSkKKyNkZWZpbmUgSVNSX1JFUiAgICAgKCgxPDwgMSkpCisjZGVmaW5lIElTUl9ST0sgICAgICgoMTw8IDApKQorI2VuZGlmCisKKyNkZWZpbmUgSFdfVkVSSURfUjgxODBfRiAzCisjZGVmaW5lIEhXX1ZFUklEX1I4MTgwX0FCQ0QgMgorI2RlZmluZSBIV19WRVJJRF9SODE4NV9BQkMgNAorI2RlZmluZSBIV19WRVJJRF9SODE4NV9EIDUKKyNpZmRlZiBDT05GSUdfUlRMODE4NUIKKyNkZWZpbmUgSFdfVkVSSURfUjgxODVCX0IgNgorI2VuZGlmCisKKyNkZWZpbmUgVENSX0NXTUlOICAgKCgxPDwzMSkpCisjZGVmaW5lIFRDUl9TV1NFUSAgICgoMTw8MzApKQorI2RlZmluZSBUQ1JfSFdWRVJJRF9NQVNLICgoMTw8MjcpfCgxPDwyNil8KDE8PDI1KSkKKyNkZWZpbmUgVENSX0hXVkVSSURfU0hJRlQgMjUKKyNkZWZpbmUgVENSX1NBVCAgICAgKCgxPDwyNCkpCisjZGVmaW5lIFRDUl9QTENQX0xFTiBUQ1JfU0FUIC8vIHJ0bDgxODAKKyNkZWZpbmUgVENSX01YRE1BX01BU0sgICAoKDE8PDIzKXwoMTw8MjIpfCgxPDwyMSkpCisjZGVmaW5lIFRDUl9NWERNQV8xMDI0IDYKKyNkZWZpbmUgVENSX01YRE1BXzIwNDggNworI2RlZmluZSBUQ1JfTVhETUFfU0hJRlQgIDIxCisjZGVmaW5lIFRDUl9ESVNDVyAgICgoMTw8MjApKQorI2RlZmluZSBUQ1JfSUNWICAgICAoKDE8PDE5KSkKKyNkZWZpbmUgVENSX0xCSyAgICAgKCgxPDwxOCl8KDE8PDE3KSkKKyNkZWZpbmUgVENSX0xCSzEgICAgKCgxPDwxOCkpCisjZGVmaW5lIFRDUl9MQkswICAgICgoMTw8MTcpKQorI2RlZmluZSBUQ1JfQ1JDICAgICAoKDE8PDE2KSkKKyNkZWZpbmUgVENSX0RQUkVUUllfTUFTSyAgICgoMTw8MTUpfCgxPDwxNCl8KDE8PDEzKXwoMTw8MTIpfCgxPDwxMSl8KDE8PDEwKXwoMTw8OSl8KDE8PDgpKQorI2RlZmluZSBUQ1JfUlRTUkVUUllfTUFTSyAgICgoMTw8MCl8KDE8PDEpfCgxPDwyKXwoMTw8Myl8KDE8PDQpfCgxPDw1KXwoMTw8Nil8KDE8PDcpKQorI2RlZmluZSBUQ1JfUFJPQkVfTk9USU1FU1RBTVBfU0hJRlQgMjkgLy9ydGw4MTg1CisKKyNkZWZpbmUgUkNSX09OTFlFUkxQS1QgKCgxPDwzMSkpCisjZGVmaW5lIFJDUl9DU19TSElGVCAgIDI5CisjZGVmaW5lIFJDUl9DU19NQVNLICAgICgoMTw8MzApIHwgKDE8PDI5KSkKKyNkZWZpbmUgUkNSX0VOTUFSUCAgICAgKCgxPDwyOCkpCisjZGVmaW5lIFJDUl9DQlNTSUQgICAgICgoMTw8MjMpKQorI2RlZmluZSBSQ1JfQVBXUk1HVCAgICAoKDE8PDIyKSkKKyNkZWZpbmUgUkNSX0FERDMgICAgICAgKCgxPDwyMSkpCisjZGVmaW5lIFJDUl9BTUYgICAgICAgICgoMTw8MjApKQorI2RlZmluZSBSQ1JfQUNGICAgICAgICAoKDE8PDE5KSkKKyNkZWZpbmUgUkNSX0FERiAgICAgICAgKCgxPDwxOCkpCisjZGVmaW5lIFJDUl9SWEZUSCAgICAgICgoMTw8MTUpfCgxPDwxNCl8KDE8PDEzKSkKKyNkZWZpbmUgUkNSX1JYRlRIMiAgICAgKCgxPDwxNSkpCisjZGVmaW5lIFJDUl9SWEZUSDEgICAgICgoMTw8MTQpKQorI2RlZmluZSBSQ1JfUlhGVEgwICAgICAoKDE8PDEzKSkKKyNkZWZpbmUgUkNSX0FJQ1YgICAgICAgKCgxPDwxMikpCisjZGVmaW5lIFJDUl9NWERNQSAgICAgICgoMTw8MTApfCgxPDwgOSl8KDE8PCA4KSkKKyNkZWZpbmUgUkNSX01YRE1BMiAgICAgKCgxPDwxMCkpCisjZGVmaW5lIFJDUl9NWERNQTEgICAgICgoMTw8IDkpKQorI2RlZmluZSBSQ1JfTVhETUEwICAgICAoKDE8PCA4KSkKKyNkZWZpbmUgUkNSXzkzNTZTRUwgICAgKCgxPDwgNikpCisjZGVmaW5lIFJDUl9BQ1JDMzIgICAgICgoMTw8IDUpKQorI2RlZmluZSBSQ1JfQUIgICAgICAgICAoKDE8PCAzKSkKKyNkZWZpbmUgUkNSX0FNICAgICAgICAgKCgxPDwgMikpCisjZGVmaW5lIFJDUl9BUE0gICAgICAgICgoMTw8IDEpKQorI2RlZmluZSBSQ1JfQUFQICAgICAgICAoKDE8PCAwKSkKKworI2RlZmluZSBDUjkzNDZfRUVNICAgICAoKDE8PDcpfCgxPDw2KSkKKyNkZWZpbmUgQ1I5MzQ2X0VFTTEgICAgKCgxPDw3KSkKKyNkZWZpbmUgQ1I5MzQ2X0VFTTAgICAgKCgxPDw2KSkKKyNkZWZpbmUgQ1I5MzQ2X0VFQ1MgICAgKCgxPDwzKSkKKyNkZWZpbmUgQ1I5MzQ2X0VFU0sgICAgKCgxPDwyKSkKKyNkZWZpbmUgQ1I5MzQ2X0VFRDEgICAgKCgxPDwxKSkKKyNkZWZpbmUgQ1I5MzQ2X0VFRDAgICAgKCgxPDwwKSkKKworI2RlZmluZSBDT05GSUcwX1dFUDEwNCAgICAgKCgxPDw2KSkKKyNkZWZpbmUgQ09ORklHMF9MRURHUE9fRW4gICgoMTw8NCkpCisjZGVmaW5lIENPTkZJRzBfQXV4X1N0YXR1cyAoKDE8PDMpKQorI2RlZmluZSBDT05GSUcwX0dMICAgICAgICAgKCgxPDwxKXwoMTw8MCkpCisjZGVmaW5lIENPTkZJRzBfR0wxICAgICAgICAoKDE8PDEpKQorI2RlZmluZSBDT05GSUcwX0dMMCAgICAgICAgKCgxPDwwKSkKKworI2RlZmluZSBDT05GSUcxX0xFRFMgICAgICAgKCgxPDw3KXwoMTw8NikpCisjZGVmaW5lIENPTkZJRzFfTEVEUzEgICAgICAoKDE8PDcpKQorI2RlZmluZSBDT05GSUcxX0xFRFMwICAgICAgKCgxPDw2KSkKKyNkZWZpbmUgQ09ORklHMV9MV0FDVCAgICAgICgoMTw8NCkpCisjZGVmaW5lIENPTkZJRzFfTUVNTUFQICAgICAoKDE8PDMpKQorI2RlZmluZSBDT05GSUcxX0lPTUFQICAgICAgKCgxPDwyKSkKKyNkZWZpbmUgQ09ORklHMV9WUEQgICAgICAgICgoMTw8MSkpCisjZGVmaW5lIENPTkZJRzFfUE1FbiAgICAgICAoKDE8PDApKQorCisjZGVmaW5lIENPTkZJRzJfTENLICAgICAgICAoKDE8PDcpKQorI2RlZmluZSBDT05GSUcyX0FOVCAgICAgICAgKCgxPDw2KSkKKyNkZWZpbmUgQ09ORklHMl9EUFMgICAgICAgICgoMTw8MykpCisjZGVmaW5lIENPTkZJRzJfUEFQRV9zaWduICAoKDE8PDIpKQorI2RlZmluZSBDT05GSUcyX1BBUEVfdGltZSAgKCgxPDwxKXwoMTw8MCkpCisjZGVmaW5lIENPTkZJRzJfUEFQRV90aW1lMSAoKDE8PDEpKQorI2RlZmluZSBDT05GSUcyX1BBUEVfdGltZTAgKCgxPDwwKSkKKworI2RlZmluZSBDT05GSUczX0dOVFNlbCAgICAgKCgxPDw3KSkKKyNkZWZpbmUgQ09ORklHM19QQVJNX0VuICAgICgoMTw8NikpCisjZGVmaW5lIENPTkZJRzNfTWFnaWMgICAgICAoKDE8PDUpKQorI2RlZmluZSBDT05GSUczX0NhcmRCX0VuICAgKCgxPDwzKSkKKyNkZWZpbmUgQ09ORklHM19DTEtSVU5fRW4gICgoMTw8MikpCisjZGVmaW5lIENPTkZJRzNfRnVuY1JlZ0VuICAoKDE8PDEpKQorI2RlZmluZSBDT05GSUczX0ZCdGJFbiAgICAgKCgxPDwwKSkKKworI2RlZmluZSBDT05GSUc0X1ZDT1BETiAgICAgKCgxPDw3KSkKKyNkZWZpbmUgQ09ORklHNF9QV1JPRkYgICAgICgoMTw8NikpCisjZGVmaW5lIENPTkZJRzRfUFdSTUdUICAgICAoKDE8PDUpKQorI2RlZmluZSBDT05GSUc0X0xXUE1FICAgICAgKCgxPDw0KSkKKyNkZWZpbmUgQ09ORklHNF9MV1BUTiAgICAgICgoMTw8MikpCisjZGVmaW5lIENPTkZJRzRfUkZUWVBFICAgICAoKDE8PDEpfCgxPDwwKSkKKyNkZWZpbmUgQ09ORklHNF9SRlRZUEUxICAgICgoMTw8MSkpCisjZGVmaW5lIENPTkZJRzRfUkZUWVBFMCAgICAoKDE8PDApKQorCisjZGVmaW5lIENPTkZJRzVfVFhfRklGT19PSyAoKDE8PDcpKQorI2RlZmluZSBDT05GSUc1X1JYX0ZJRk9fT0sgKCgxPDw2KSkKKyNkZWZpbmUgQ09ORklHNV9DQUxPTiAgICAgICgoMTw8NSkpCisjZGVmaW5lIENPTkZJRzVfRUFDUEkgICAgICAoKDE8PDIpKQorI2RlZmluZSBDT05GSUc1X0xBTldha2UgICAgKCgxPDwxKSkKKyNkZWZpbmUgQ09ORklHNV9QTUVfU1RTICAgICgoMTw8MCkpCisKKyNkZWZpbmUgTVNSX0xJTktfTUFTSyAgICAgICgoMTw8Mil8KDE8PDMpKQorI2RlZmluZSBNU1JfTElOS19NQU5BR0VEICAgMgorI2RlZmluZSBNU1JfTElOS19OT05FICAgICAgMAorI2RlZmluZSBNU1JfTElOS19TSElGVCAgICAgMgorI2RlZmluZSBNU1JfTElOS19BREhPQyAgICAgMQorI2RlZmluZSBNU1JfTElOS19NQVNURVIgICAgMworCisjZGVmaW5lIFBTUl9HUE8gICAgICAgICAgICAoKDE8PDcpKQorI2RlZmluZSBQU1JfR1BJICAgICAgICAgICAgKCgxPDw2KSkKKyNkZWZpbmUgUFNSX0xFREdQTzEgICAgICAgICgoMTw8NSkpCisjZGVmaW5lIFBTUl9MRURHUE8wICAgICAgICAoKDE8PDQpKQorI2RlZmluZSBQU1JfVVdGICAgICAgICAgICAgKCgxPDwxKSkKKyNkZWZpbmUgUFNSX1BTRW4gICAgICAgICAgICgoMTw8MCkpCisKKyNkZWZpbmUgU0NSX0tNICAgICAgICAgICAgICgoMTw8NSl8KDE8PDQpKQorI2RlZmluZSBTQ1JfS00xICAgICAgICAgICAgKCgxPDw1KSkKKyNkZWZpbmUgU0NSX0tNMCAgICAgICAgICAgICgoMTw8NCkpCisjZGVmaW5lIFNDUl9UWFNFQ09OICAgICAgICAoKDE8PDEpKQorI2RlZmluZSBTQ1JfUlhTRUNPTiAgICAgICAgKCgxPDwwKSkKKworI2RlZmluZSBCY25JdHZfQmNuSXR2ICAgICAgKDB4MDFGRikKKworI2RlZmluZSBBdGltV25kX0F0aW1XbmQgICAgKDB4MDFGRikKKworI2RlZmluZSBCaW50ckl0dl9CaW50ckl0diAgKDB4MDFGRikKKworI2RlZmluZSBBdGltdHJJdHZfQXRpbXRySXR2ICgweDAxRkYpCisKKyNkZWZpbmUgUGh5RGVsYXlfUGh5RGVsYXkgICgoMTw8Mil8KDE8PDEpfCgxPDwwKSkKKworI2RlZmluZSBUUFBvbGxfQlEgICAgKCgxPDw3KSkKKyNkZWZpbmUgVFBQb2xsX0hQUSAgICgoMTw8NikpCisjZGVmaW5lIFRQUG9sbF9OUFEgICAoKDE8PDUpKQorI2RlZmluZSBUUFBvbGxfTFBRICAgKCgxPDw0KSkKKyNkZWZpbmUgVFBQb2xsX1NCUSAgICgoMTw8MykpCisjZGVmaW5lIFRQUG9sbF9TSFBRICAoKDE8PDIpKQorI2RlZmluZSBUUFBvbGxfU05QUSAgKCgxPDwxKSkKKyNkZWZpbmUgVFBQb2xsX1NMUFEgICgoMTw8MCkpCisKKyNkZWZpbmUgQ1dSX0NXICAgICAgICgweDAxRkYpCisKKyNkZWZpbmUgRkVSX0lOVFIgICAgICgoMTw8MTUpKQorI2RlZmluZSBGRVJfR1dBS0UgICAgKCgxPDwgNCkpCisKKyNkZWZpbmUgRkVNUl9JTlRSICAgICgoMTw8MTUpKQorI2RlZmluZSBGRU1SX1dLVVAgICAgKCgxPDwxNCkpCisjZGVmaW5lIEZFTVJfR1dBS0UgICAoKDE8PCA0KSkKKworI2RlZmluZSBGUFNSX0lOVFIgICAgKCgxPDwxNSkpCisjZGVmaW5lIEZQU1JfR1dBS0UgICAoKDE8PCA0KSkKKworI2RlZmluZSBGRkVSX0lOVFIgICAgKCgxPDwxNSkpCisjZGVmaW5lIEZGRVJfR1dBS0UgICAoKDE8PCA0KSkKKworI2lmZGVmIENPTkZJR19SVEw4MTg1QgorLy8gVGhyZWUgd2lyZSBtb2RlLgorI2RlZmluZSBTV19USFJFRV9XSVJFCQkJMAorI2RlZmluZSBIV19USFJFRV9XSVJFCQkJMgorLy9SVEw4MTg3UyBieSBhbXkKKyNkZWZpbmUgSFdfVEhSRUVfV0lSRV9QSQkJNQorI2RlZmluZSBIV19USFJFRV9XSVJFX1NJCQk2CisvL2J5IGFteQorI2RlZmluZSBUQ1JfTFJMX09GRlNFVAkJMAorI2RlZmluZSBUQ1JfU1JMX09GRlNFVAkJOAorI2RlZmluZSBUQ1JfTVhETUFfT0ZGU0VUCTIxCisjZGVmaW5lIFRDUl9ESVNSZXFRc2l6ZV9PRkZTRVQJCTI4CisjZGVmaW5lIFRDUl9EdXJQcm9jTW9kZV9PRkZTRVQJCTMwCisKKyNkZWZpbmUgUkNSX01YRE1BX09GRlNFVAkJCQk4CisjZGVmaW5lIFJDUl9GSUZPX09GRlNFVAkJCQkJMTMKKworI2RlZmluZSBUTUdEUwkJCTB4MEMJCQkvLyBUeCBNYW5hZ2VtZW50IERlc2NyaXB0b3IgQWRkcmVzcworI2RlZmluZSBUQktEUwkJCTB4MTAJCQkvLyBUeCBBQ19CSyBEZXNjcmlwdG9yIEFkZHJlc3MKKyNkZWZpbmUgVEJFRFMJCQkweDE0CQkJLy8gVHggQUNfQkUgRGVzY3JpcHRvciBBZGRyZXNzCisjZGVmaW5lIFRMUERTCQkJMHgyMAkJCS8vIFR4IEFDX1ZJIERlc2NyaXB0b3IgQWRkcmVzcworI2RlZmluZSBUTlBEUwkJCTB4MjQJCQkvLyBUeCBBQ19WTyBEZXNjcmlwdG9yIEFkZHJlc3MKKyNkZWZpbmUgVEhQRFMJCQkweDI4CQkJLy8gVHggSGlnbiBQcmlvcml0eSBEZXNjcmlwdG9yIEFkZHJlc3MKKworI2RlZmluZSBUQkRTCQkJMHg0YwkJCS8vIEJlYWNvbiBkZXNjcmlwdG9yIHF1ZXVlIHN0YXJ0IGFkZHJlc3MKKworI2RlZmluZSBSRFNBCQkJMHhFNAkJCS8vIFJlY2VpdmUgZGVzY3JpcHRvciBxdWV1ZSBzdGFydCBhZGRyZXNzCisKKyNkZWZpbmUgQWNrVGltZU91dFJlZwkweDc5CQkvLyBBQ0sgdGltZW91dCByZWdpc3RlciwgaW4gdW5pdCBvZiA0IHVzLgorCisjZGVmaW5lIFJGVGltaW5nCQkJMHg4QworCisjZGVmaW5lIFRQUG9sbFN0b3AgCQkweDkzCisKKyNkZWZpbmUgVFhBR0NfQ1RMCQkweDlDCQkJLy8gPFJKX1RPRE9fODE4NUI+IFRYX0FHQ19DT05UUk9MICgweDlDIHNlZW1zIGJlIHJlbW92ZWQgYXQgODE4NUIsIHNlZSBwMzcpLgorI2RlZmluZSBDQ0tfVFhBR0MJCTB4OUQKKyNkZWZpbmUgT0ZETV9UWEFHQwkJMHg5RQorI2RlZmluZSBBTlRTRUwJCQkweDlGCisKKyNkZWZpbmUgQUNNX0NPTlRST0wgICAgICAgICAgICAgMHgwMEJGICAgICAgLy8gQUNNIENvbnRyb2wgUmVnaXN0ZQorCisjZGVmaW5lIFJUTDgxODVCX1ZFUl9SRUcgICAgMHhFMQorCisjZGVmaW5lCUludE1pZwkJCTB4RTIJCQkvLyBJbnRlcnJ1cHQgTWlncmF0aW9uICgweEUyIH4gMHhFMykKKworI2RlZmluZSBUSURfQUNfTUFQCQkweEU4CQkJLy8gVElEIHRvIEFDIE1hcHBpbmcgUmVnaXN0ZXIKKworI2RlZmluZSBBTkFQQVJBTTMJCTB4RUUJCQkvLyA8UkpfVE9ET184MTg1Qj4gSG93IHRvIHVzZSBpdD8KKworI2RlZmluZSBBQ19WT19QQVJBTQkJMHhGMAkJCS8vIEFDX1ZPIFBhcmFtZXRlcnMgUmVjb3JkCisjZGVmaW5lIEFDX1ZJX1BBUkFNCQkweEY0CQkJLy8gQUNfVkkgUGFyYW1ldGVycyBSZWNvcmQKKyNkZWZpbmUgQUNfQkVfUEFSQU0JCTB4RjgJCQkvLyBBQ19CRSBQYXJhbWV0ZXJzIFJlY29yZAorI2RlZmluZSBBQ19CS19QQVJBTQkJMHhGQwkJCS8vIEFDX0JLIFBhcmFtZXRlcnMgUmVjb3JkCisKKyNpZmRlZiBDT05GSUdfUlRMODE4WF9TCisjZGVmaW5lIEJjblRpbWluZ0FkanVzdAkweDE2QQkJCS8vIEJlYWNvbiBUaW1pbmcgQWRqdXN0IFJlZ2lzdGVyLgorI2RlZmluZSBHUElPQ3RybAkJCTB4MTZCCQkJLy8gR1BJTyBDb250cm9sIFJlZ2lzdGVyLgorI2RlZmluZSBQU0J5R0MJCQkweDE4MAkJCS8vIDB4MTgwIC0gMHgxODMgUG93ZXIgU2F2aW5nIGJ5IEdhdGVkIENsb2NrLgorI2VuZGlmCisjZGVmaW5lIEFSRlIJCQkweDFFMAkvLyBBdXRvIFJhdGUgRmFsbGJhY2sgUmVnaXN0ZXIgKDB4MWUwIH4gMHgxZTIpCisKKyNkZWZpbmUgUkZTV19DVFJMCQkJMHgyNzIJLy8gMHgyNzItMHgyNzMuCisjZGVmaW5lIFNXXzNXX0RCMAkJCTB4Mjc0CS8vIFNvZnR3YXJlIDMtd2lyZSBkYXRhIGJ1ZmZlciBiaXQgMzF+MC4KKyNkZWZpbmUgU1dfM1dfREIxCQkJMHgyNzgJLy8gU29mdHdhcmUgMy13aXJlIGRhdGEgYnVmZmVyIGJpdCA2M34zMi4KKyNkZWZpbmUgU1dfM1dfQ01EMAkJCTB4MjdDCS8vIFNvZnR3YXJlIDMtd2lyZSBDb250cm9sL1N0YXR1cyBSZWdpc3Rlci4KKyNkZWZpbmUgU1dfM1dfQ01EMQkJCTB4MjdECS8vIFNvZnR3YXJlIDMtd2lyZSBDb250cm9sL1N0YXR1cyBSZWdpc3Rlci4KKworI2lmZGVmIENPTkZJR19SVEw4MThYX1MKKyNkZWZpbmUgUElfREFUQV9SRUFECQkwWDM2MAkvLyAweDM2MCAtIDB4MzYxICBQYXJhbGxlbCBJbnRlcmZhY2UgRGF0YSBSZWdpc3Rlci4KKyNkZWZpbmUgU0lfREFUQV9SRUFECQkweDM2MgkvLyAweDM2MiAtIDB4MzYzICBTZXJpYWwgSW50ZXJmYWNlIERhdGEgUmVnaXN0ZXIuCisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgICAgICA4MTg1QiBUUFBvbGwgYml0cyAJCQkJKG9mZnNldCAweGQ5LCAxIGJ5dGUpCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgVFBQT0xMX0JRCQkJKDB4MDEgPDwgNykKKyNkZWZpbmUgVFBQT0xMX0hQUQkJCSgweDAxIDw8IDYpCisjZGVmaW5lIFRQUE9MTF9BQ19WT1EJCSgweDAxIDw8IDUpCisjZGVmaW5lIFRQUE9MTF9BQ19WSVEJCSgweDAxIDw8IDQpCisjZGVmaW5lIFRQUE9MTF9BQ19CRVEJCSgweDAxIDw8IDMpCisjZGVmaW5lIFRQUE9MTF9BQ19CS1EJCSgweDAxIDw8IDIpCisjZGVmaW5lIFRQUE9MTF9BQ19NR1EJCSgweDAxIDw8IDEpCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gICAgICAgODE4NUIgVFBQb2xsU3RvcCBiaXRzIAkJCQkob2Zmc2V0IDB4OTMsIDEgYnl0ZSkKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2RlZmluZSBUUFBPTExTVE9QX0JRCQkJKDB4MDEgPDwgNykKKyNkZWZpbmUgVFBQT0xMU1RPUF9IUFEJCQkoMHgwMSA8PCA2KQorI2RlZmluZSBUUFBPTExTVE9QX0FDX1ZPUQkJKDB4MDEgPDwgNSkKKyNkZWZpbmUgVFBQT0xMU1RPUF9BQ19WSVEJCSgweDAxIDw8IDQpCisjZGVmaW5lIFRQUE9MTFNUT1BfQUNfQkVRCQkoMHgwMSA8PCAzKQorI2RlZmluZSBUUFBPTExTVE9QX0FDX0JLUQkJKDB4MDEgPDwgMikKKyNkZWZpbmUgVFBQT0xMU1RPUF9BQ19NR1EJCSgweDAxIDw8IDEpCisKKworI2RlZmluZSBNU1JfTElOS19FTkVEQ0EJICAgKDE8PDQpCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gICAgICAgODE4N0IgQUNfWFhfUEFSQU0gYml0cworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZGVmaW5lIEFDX1BBUkFNX1RYT1BfTElNSVRfT0ZGU0VUCQkxNgorI2RlZmluZSBBQ19QQVJBTV9FQ1dfTUFYX09GRlNFVAkJCTEyCisjZGVmaW5lIEFDX1BBUkFNX0VDV19NSU5fT0ZGU0VUCQkJOAorI2RlZmluZSBBQ19QQVJBTV9BSUZTX09GRlNFVAkJCTAKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgICAgICA4MTg3QiBBQ01fQ09OVFJPTCBiaXRzCQkJCQkJKE9mZnNldCAweEJGLCAxIEJ5dGUpCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgVk9RX0FDTV9FTgkJCQkoMHgwMSA8PCA3KSAvL0JJVDcKKyNkZWZpbmUgVklRX0FDTV9FTgkJCQkoMHgwMSA8PCA2KSAvL0JJVDYKKyNkZWZpbmUgQkVRX0FDTV9FTgkJCQkoMHgwMSA8PCA1KSAvL0JJVDUKKyNkZWZpbmUgQUNNX0hXX0VOCQkJCSgweDAxIDw8IDQpIC8vQklUNAorI2RlZmluZSBUWE9QU0VMCQkJCQkoMHgwMSA8PCAzKSAvL0JJVDMKKyNkZWZpbmUgVk9RX0FDTV9DVEwJCQkJKDB4MDEgPDwgMikgLy9CSVQyIC8vIFNldCB0byAxIHdoZW4gQUNfVk8gdXNlZCB0aW1lIHJlYWNoZXMgb3IgZXhjZWVkcyB0aGUgYWRtaXR0ZWQgdGltZQorI2RlZmluZSBWSVFfQUNNX0NUTAkJCQkoMHgwMSA8PCAxKSAvL0JJVDEgLy8gU2V0IHRvIDEgd2hlbiBBQ19WSSB1c2VkIHRpbWUgcmVhY2hlcyBvciBleGNlZWRzIHRoZSBhZG1pdHRlZCB0aW1lCisjZGVmaW5lIEJFUV9BQ01fQ1RMCQkJCSgweDAxIDw8IDApIC8vQklUMCAvLyBTZXQgdG8gMSB3aGVuIEFDX0JFIHVzZWQgdGltZSByZWFjaGVzIG9yIGV4Y2VlZHMgdGhlIGFkbWl0dGVkIHRpbWUKKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICAgICAgIDgxODVCIFNXXzNXX0NNRCBiaXRzCQkJCQkoT2Zmc2V0IDB4MjdDLTB4MjdELCAxNmJpdCkKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2RlZmluZSBTV18zV19DTUQwX0hPTEQJCSgoMTw8IDcpKQorI2RlZmluZSBTV18zV19DTUQxX1JFCQkgCSgoMTw8IDApKSAvLyBCSVQ4CisjZGVmaW5lIFNXXzNXX0NNRDFfV0UJCSgoMTw8IDEpKSAvLyBCSVQ5CisjZGVmaW5lIFNXXzNXX0NNRDFfRE9ORQkJKCgxPDwgMikpIC8vIEJJVDEwCisKKyNkZWZpbmUgQkJfSE9TVF9CQU5HX1JXIAkoMTw8MykKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgICAgICA4MTg1QiBSQVRFX0ZBTExCQUNLX0NUTCBiaXRzCQkJCShPZmZzZXQgMHhCRSwgOGJpdCkKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2RlZmluZSBSQVRFX0ZBTExCQUNLX0NUTF9FTkFCTEUJCQkJKCgxPDwgNykpCisjZGVmaW5lIFJBVEVfRkFMTEJBQ0tfQ1RMX0VOQUJMRV9SVFNDVFMJCSgoMTw8IDYpKQorLy8gQXV0byByYXRlIGZhbGxiYWNrIHBlciAyXm4gcmV0cnkuCisjZGVmaW5lIFJBVEVfRkFMTEJBQ0tfQ1RMX0FVVE9fU1RFUDAJMHgwMAorI2RlZmluZSBSQVRFX0ZBTExCQUNLX0NUTF9BVVRPX1NURVAxCTB4MDEKKyNkZWZpbmUgUkFURV9GQUxMQkFDS19DVExfQVVUT19TVEVQMgkweDAyCisjZGVmaW5lIFJBVEVfRkFMTEJBQ0tfQ1RMX0FVVE9fU1RFUDMJMHgwMworCisKKyNkZWZpbmUgUlRMODIyNXoyX0FOQVBBUkFNX09GRgkweDU1NDgwNjU4CisjZGVmaW5lIFJUTDgyMjV6Ml9BTkFQQVJBTTJfT0ZGCTB4NzIwMDNmNzAKKy8vYnkgYW15IGZvciBwb3dlciBzYXZlCisjZGVmaW5lIFJGX0NIQU5HRV9CWV9TVyBCSVQzMQorI2RlZmluZSBSRl9DSEFOR0VfQllfSFcgQklUMzAKKyNkZWZpbmUgUkZfQ0hBTkdFX0JZX1BTIEJJVDI5CisjZGVmaW5lIFJGX0NIQU5HRV9CWV9JUFMgQklUMjgKKy8vYnkgYW15IGZvciBwb3dlciBzYXZlCisvL2J5IGFteSBmb3IgYW50ZW5uYQorI2RlZmluZSBFRVBST01fU1dfUkVWRF9PRkZTRVQgMHgzZgorLy8gQklUWzgtOV0gaXMgZm9yIFNXIEFudGVubmEgRGl2ZXJzaXR5LiBPbmx5IHRoZSB2YWx1ZSBFRVBST01fU1dfQURfRU5BQkxFIG1lYW5zIGVuYWJsZSwgb3RoZXIgdmFsdWVzIGFyZSBkaWFibGUuCisjZGVmaW5lIEVFUFJPTV9TV19BRF9NQVNLCQkJMHgwMzAwCisjZGVmaW5lIEVFUFJPTV9TV19BRF9FTkFCTEUJCQkweDAxMDAKKworLy8gQklUWzEwLTExXSBkZXRlcm1pbmUgaWYgQW50ZW5uYSAxIGlzIHRoZSBEZWZhdWx0IEFudGVubmEuIE9ubHkgdGhlIHZhbHVlIEVFUFJPTV9ERUZfQU5UXzEgbWVhbnMgVFJVRSwgb3RoZXIgdmFsdWVzIGFyZSBGQUxTRS4KKyNkZWZpbmUgRUVQUk9NX0RFRl9BTlRfTUFTSwkJCTB4MEMwMAorI2RlZmluZSBFRVBST01fREVGX0FOVF8xCQkJMHgwNDAwCisvL2J5IGFteSBmb3IgYW50ZW5uYQorLy97YnkgYW15IDA4MDMxMgorLy8weDdDLCAweDdEIENyeXN0YWwgY2FsaWJyYXRpb24gYW5kIFR4IFBvd2VyIHRyYWNraW5nIG1lY2hhbmlzbS4gQWRkZWQgYnkgUm9nZXIuIDIwMDcuMTIuMTAuCisjZGVmaW5lIEVFUFJPTV9SU1YJCQkJCQkweDdDCisjZGVmaW5lIEVFUFJPTV9YVEFMX0NBTF9NQVNLCQkJMHgwMEZGCS8vIDB4N0NbNzowXSwgQ3J5c3RhbCBjYWxpYnJhdGlvbiBtYXNrLgorI2RlZmluZSBFRVBST01fWFRBTF9DQUxfWE9VVF9NQVNLCTB4MEYJLy8gMHg3Q1szOjBdLCBDcnlzdGFsIGNhbGlicmF0aW9uIGZvciBYb3V0LgorI2RlZmluZSBFRVBST01fWFRBTF9DQUxfWElOX01BU0sJCTB4RjAJLy8gMHg3Q1s3OjRdLCBDcnlzdGFsIGNhbGlicmF0aW9uIGZvciBYaW4uCisjZGVmaW5lIEVFUFJPTV9USEVSTUFMX01FVEVSX01BU0sJMHgwRjAwCS8vIDB4N0RbMzowXSwgVGhlcm1hbCBtZXRlciByZWZlcmVuY2UgbGV2ZWwuCisjZGVmaW5lIEVFUFJPTV9YVEFMX0NBTF9FTkFCTEUJCTB4MTAwMAkvLyAweDdEWzRdLCBDcnlzdGFsIGNhbGlicmF0aW9uIGVuYWJsZWQvZGlzYWJsZWQgQklULgorI2RlZmluZSBFRVBST01fVEhFUk1BTF9NRVRFUl9FTkFCTEUJMHgyMDAwCS8vIDB4N0RbNV0sIFRoZXJtYWwgbWV0ZXIgZW5hYmxlZC9kaXNhYmxlZCBCSVQuCisjZGVmaW5lIEVFUFJPTV9DSURfUlNWRDEJCQkJMHgzRgorI2RlZmluZSBFTl9MUEZfQ0FMCQkJMHgyMzgJLy8gRW5hYmxlIExQRiBDYWxpYnJhdGlvbi4KKyNkZWZpbmUgUFdSX01FVEVSX0VOCQlCSVQxCisvLyA8UkpfVE9ET184MTg1Qj4gd2hlcmUgYXJlIGZhbHNlIGFsYXJtIGNvdW50ZXJzIGluIDgxODVCPworI2RlZmluZSBDQ0tfRkFMU0VfQUxBUk0JCTB4RDAKKyNkZWZpbmUgT0ZETV9GQUxTRV9BTEFSTQkweEQyCisvL2J5IGFteSAwODAzMTJ9CisKKy8vWUosYWRkIGZvciBDb3VudHJ5IElFLCAwODA2MzAKKyNkZWZpbmUgRUVQUk9NX0NPVU5UUllfQ09ERSAgMHgyRQorLy9ZSixhZGQsMDgwNjMwLGVuZAorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MF9tYXgyODIwLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwX21heDI4MjAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZWEwODQ2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MF9tYXgyODIwLmMKQEAgLTAsMCArMSwyNDAgQEAKKy8qCisgICBUaGlzIGZpbGVzIGNvbnRhaW5zIE1BWElNIE1BWDI4MjAgcmFkaW8gZnJvbnRlbmQgcHJvZ3JhbW1pbmcgcm91dGluZXMuCisKKyAgIFRoaXMgaXMgcGFydCBvZiBydGw4MTgwIE9wZW5Tb3VyY2UgZHJpdmVyCisgICBDb3B5cmlnaHQgKEMpIEFuZHJlYSBNZXJlbGxvIDIwMDQtMjAwNSAgPGFuZHJlYW1ybEB0aXNjYWxpLml0PgorICAgUmVsZWFzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIEdQTCAoR2VuZXJhbCBQdWJsaWMgTGljZW5jZSkKKworICAgUGFydHMgb2YgdGhpcyBkcml2ZXIgYXJlIGJhc2VkIG9uIHRoZSBHUEwgcGFydCBvZiB0aGUKKyAgIG9mZmljaWFsIHJlYWx0ZWsgZHJpdmVyCisKKyAgIFBhcnRzIG9mIHRoaXMgZHJpdmVyIGFyZSBiYXNlZCBvbiB0aGUgcnRsODE4MCBkcml2ZXIgc2tlbGV0b24KKyAgIGZyb20gUGF0cmljIFNjaGVua2UgJiBBbmRyZXMgU2Fsb21vbgorCisgICBQYXJ0cyBvZiB0aGlzIGRyaXZlciBhcmUgYmFzZWQgb24gdGhlIEludGVsIFBybyBXaXJlbGVzcyAyMTAwIEdQTCBkcml2ZXIuCisKKyAgIE5ldEJTRCBydGw4MTgwIGRyaXZlciBmcm9tIERhdmUgWW91bmcgaGFzIGJlZW4gcmVhbGx5IHVzZWZ1bCB0bworICAgdW5kZXJzdGFuZCBob3cgdG8gcHJvZ3JhbSB0aGUgTUFYSU0gcmFkaW8uIFRoYW5rcyBhIGxvdCEhIQorCisgICAnVGhlIERldWNlJyB0ZXN0ZWQgdGhpcyBhbmQgZml4ZWQgc29tZSBidWdzLgorCisgICBDb2RlIGZyb20gcnRsODE4MSBwcm9qZWN0IGhhcyBiZWVuIHVzZWZ1bCB0byBtZSB0byB1bmRlcnN0YW5kIHNvbWUgdGhpbmdzLgorCisgICBXZSB3YW50IHRvIHRhbmtzIHRoZSBBdXRob3JzIG9mIHN1Y2ggcHJvamVjdHMgYW5kIHRoZSBOZGlzd3JhcHBlcgorICAgcHJvamVjdCBBdXRob3JzLgorKi8KKworCisjaW5jbHVkZSAicjgxODAuaCIKKyNpbmNsdWRlICJyODE4MF9ody5oIgorI2luY2x1ZGUgInI4MTgwX21heDI4MjAuaCIKKworCisvLyNkZWZpbmUgREVCVUdfTUFYSU0KKwordTMyIG1heGltX2NoYW5bXSA9IHsKKwkwLAkvL2R1bW15IGNoYW5uZWwgMAorCTEyLCAvLzEKKwkxNywgLy8yCisJMjIsIC8vMworCTI3LCAvLzQKKwkzMiwgLy81CisJMzcsIC8vNgorCTQyLCAvLzcKKwk0NywgLy84CisJNTIsIC8vOQorCTU3LCAvLzEwCisJNjIsIC8vMTEKKwk2NywgLy8xMgorCTcyLCAvLzEzCisJODQsIC8vMTQKK307CisKKyNpZiAwCisvKiBtYXhpbSBleHBlY3RzIDQgYml0IGFkZHJlc3MgTVNGLCB0aGVuIDEyIGJpdCBkYXRhIE1TRiovCit2b2lkIHdyaXRlX21heGltKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsdTggYWRyLCB1MzIgZGF0YSkKK3sKKworCWludCBzaGlmdDsKKwlzaG9ydCBiaXQ7CisJdTE2IHdvcmQ7CisKKwlhZHIgPSBhZHIgJjB4ZjsKKwl3b3JkID0gKHUxNilkYXRhICYgMHhmZmY7CisJd29yZCB8PSAoYWRyPDwxMik7CisJLyp3cml0ZV9uaWNfZHdvcmQoZGV2LFBIWV9DT05GSUcsQkJfSE9TVF9CQU5HIHwgQkJfSE9TVF9CQU5HX0VOKTsKKwlyZWFkX25pY19kd29yZChkZXYsUEhZX0NPTkZJRyk7CisJbWRlbGF5KDEpOworCisJd3JpdGVfbmljX2R3b3JkKGRldixQSFlfQ09ORklHLEJCX0hPU1RfQkFORyB8IEJCX0hPU1RfQkFOR19FTiB8IEJCX0hPU1RfQkFOR19DTEspOworCXJlYWRfbmljX2R3b3JkKGRldixQSFlfQ09ORklHKTsKKwltZGVsYXkoMSk7CisJKi8KKworCS8qIE1BWDI4MjAgd2lsbCBzYW1wbGUgZGF0YSBvbiByaXNpbmcgZWRnZSBvZiBjbG9jayAqLworCWZvcihzaGlmdCA9IDE1O3NoaWZ0ID49MDsgc2hpZnQtLSl7CisJCWJpdCA9IHdvcmQ+PnNoaWZ0ICYgMTsKKworCQl3cml0ZV9uaWNfZHdvcmQoZGV2LFBIWV9DT05GSUcsQkJfSE9TVF9CQU5HIHwgKGJpdDw8QkJfSE9TVF9CQU5HX0RBVEEpKTsKKworCQlyZWFkX25pY19kd29yZChkZXYsUEhZX0NPTkZJRyk7CisJCW1kZWxheSgyKTsKKworCQl3cml0ZV9uaWNfZHdvcmQoZGV2LFBIWV9DT05GSUcsQkJfSE9TVF9CQU5HIHwKKwkJKGJpdDw8QkJfSE9TVF9CQU5HX0RBVEEpIHwgQkJfSE9TVF9CQU5HX0NMSyk7IC8qIHNhbXBsZSBkYXRhICovCisKKwkJcmVhZF9uaWNfZHdvcmQoZGV2LFBIWV9DT05GSUcpOworCQltZGVsYXkoMSk7CisKKwkJd3JpdGVfbmljX2R3b3JkKGRldixQSFlfQ09ORklHLEJCX0hPU1RfQkFORyB8CisJCShiaXQ8PEJCX0hPU1RfQkFOR19EQVRBKSk7CisKKwkJcmVhZF9uaWNfZHdvcmQoZGV2LFBIWV9DT05GSUcpOworCQltZGVsYXkoMik7CisKKwl9CisJd3JpdGVfbmljX2R3b3JkKGRldixQSFlfQ09ORklHLEJCX0hPU1RfQkFORyB8IChiaXQ8PEJCX0hPU1RfQkFOR19EQVRBKXwKKwkJCQkJQkJfSE9TVF9CQU5HX0VOKTsKKwlyZWFkX25pY19kd29yZChkZXYsUEhZX0NPTkZJRyk7CisJbWRlbGF5KDIpOworCisJLyogVGhlIHNoaWZ0IHJlZ2lzdGVyIGZpbGwgZmx1c2ggdG8gdGhlIHJlcXVlc3RlZCByZWdpc3RlciB0aGUKKwkgKiBsYXN0IDEyIGJpdHMgZGF0YSBzaGlmdGVkIGluCisJICovCisJd3JpdGVfbmljX2R3b3JkKGRldixQSFlfQ09ORklHLEJCX0hPU1RfQkFORyB8IChiaXQ8PEJCX0hPU1RfQkFOR19EQVRBKXwKKwkJCQkJQkJfSE9TVF9CQU5HX0VOIHwgQkJfSE9TVF9CQU5HX0NMSyk7CisJcmVhZF9uaWNfZHdvcmQoZGV2LFBIWV9DT05GSUcpOworCW1kZWxheSgyKTsKKworCXdyaXRlX25pY19kd29yZChkZXYsUEhZX0NPTkZJRyxCQl9IT1NUX0JBTkcgfCAoYml0PDxCQl9IT1NUX0JBTkdfREFUQSl8CisJCQkJCUJCX0hPU1RfQkFOR19FTik7CisJcmVhZF9uaWNfZHdvcmQoZGV2LFBIWV9DT05GSUcpOworCW1kZWxheSgyKTsKKworCisjaWZkZWYgREVCVUdfTUFYSU0KKwlETUVTRygiV3JpdGluZyBtYXhpbTogJXggKGFkciAleCkiLHBoeV9jb25maWcsYWRyKTsKKyNlbmRpZgorCit9CisjZW5kaWYKKwordm9pZCB3cml0ZV9tYXhpbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LHU4IGFkciwgdTMyIGRhdGEpIHsKKwl1MzIgdGVtcDsKKwl0ZW1wID0gIDB4OTAgKyAoZGF0YSAmIDB4Zik7CisJdGVtcCA8PD0gMTY7CisJdGVtcCArPSBhZHI7CisJdGVtcCA8PD0gODsKKwl0ZW1wICs9IChkYXRhID4+IDQpICYgMHhmZjsKKyNpZmRlZiBERUJVR19NQVhJTQorCURNRVNHKCJ3cml0ZV9tYXhpbTogJTA4eCIsIHRlbXApOworI2VuZGlmCisJd3JpdGVfbmljX2R3b3JkKGRldiwgUEhZX0NPTkZJRywgdGVtcCk7CisJZm9yY2VfcGNpX3Bvc3RpbmcoZGV2KTsKKwltZGVsYXkoMSk7Cit9CisKKwordm9pZCBtYXhpbV93cml0ZV9waHlfYW50ZW5uYShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LHNob3J0IGNoKQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwl1OCBhbnQ7CisKKwlhbnQgPSBNQVhJTV9BTlRFTk5BOworCWlmKHByaXYtPmFudGIpIC8qZGVmYXVsdCBhbnRlbm5hIGlzIGFudGVubmEgQiAqLworCQlhbnQgfD0gQkJfQU5URU5OQV9COworCWlmKGNoID09IDE0KQorCQlhbnQgfD0gQkJfQU5UQVRURU5fQ0hBTjE0OworCXdyaXRlX3BoeShkZXYsMHgxMCxhbnQpOworCS8vRE1FU0coIkJCIGFudGVubmEgJXggIixhbnQpOworfQorCisKK3ZvaWQgbWF4aW1fcmZfc2V0X2NoYW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc2hvcnQgY2gpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCXUzMiB0eHB3ID0gMHhmZiAmIHByaXYtPmNodHhwd3JbY2hdOworCXUzMiBjaGFuID0gbWF4aW1fY2hhbltjaF07CisKKwkvKldoaWxlIHBoaWxpcHMgU0EyNDAwIGRyaXZlIHRoZSBQQSBiaWFzCisJICpzZWVtcyB0aGF0IGZvciBNQVhJTSB3ZSBkZWxlZ2F0ZSB0aGlzCisJICp0byB0aGUgQkIKKwkgKi8KKworCS8vd3JpdGVfbWF4aW0oZGV2LDUsdHhwdyk7CisJd3JpdGVfcGh5KGRldiwzLHR4cHcpOworCisJbWF4aW1fd3JpdGVfcGh5X2FudGVubmEoZGV2LGNoKTsKKwl3cml0ZV9tYXhpbShkZXYsMyxjaGFuKTsKK30KKworCit2b2lkIG1heGltX3JmX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJd3JpdGVfcGh5KGRldiwgMywgMHg4KTsKKwl3cml0ZV9tYXhpbShkZXYsIDEsIDApOworfQorCisKK3ZvaWQgbWF4aW1fcmZfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwl1MzIgYW5hcGFyYW07CisKKwl3cml0ZV9uaWNfYnl0ZShkZXYsUEhZX0RFTEFZLDB4Nik7CS8vdGhpcyBpcyBnZW5lcmFsCisJd3JpdGVfbmljX2J5dGUoZGV2LENBUlJJRVJfU0VOU0VfQ09VTlRFUiwweDRjKTsgLy90aGlzIGlzIGdlbmVyYWwKKworCS8qdGhlc2UgYXJlIG1heGltIHNwZWNpZmljKi8KKwlhbmFwYXJhbSA9IHJlYWRfbmljX2R3b3JkKGRldixBTkFQQVJBTSk7CisJYW5hcGFyYW0gPSBhbmFwYXJhbSAmfiAoQU5BUEFSQU1fVFhEQUNPRkZfU0hJRlQpOworCWFuYXBhcmFtID0gYW5hcGFyYW0gJn5BTkFQQVJBTV9QV1IxX01BU0s7CisJYW5hcGFyYW0gPSBhbmFwYXJhbSAmfkFOQVBBUkFNX1BXUjBfTUFTSzsKKwlhbmFwYXJhbSB8PSAoTUFYSU1fQU5BUEFSQU1fUFdSMV9PTjw8QU5BUEFSQU1fUFdSMV9TSElGVCk7CisJYW5hcGFyYW0gfD0gKE1BWElNX0FOQVBBUkFNX1BXUjBfT048PEFOQVBBUkFNX1BXUjBfU0hJRlQpOworCisJLy9ydGw4MTgwX3NldF9hbmFwYXJhbShkZXYsYW5hcGFyYW0pOworCisJLyogTUFYSU0gZnJvbSBuZXRic2QgZHJpdmVyICovCisKKwl3cml0ZV9tYXhpbShkZXYsMCwgNyk7IC8qIHRlc3QgbW9kZSBhcyBpbmRpY2F0ZWQgaW4gZGF0YXNoZWV0Ki8KKwl3cml0ZV9tYXhpbShkZXYsMSwgMHgxZSk7IC8qIGVuYWJsZSByZWdpc3RlciovCisJd3JpdGVfbWF4aW0oZGV2LDIsIDEpOyAvKiBzeW50IHJlZ2lzdGVyICovCisKKworCW1heGltX3JmX3NldF9jaGFuKGRldixwcml2LT5jaGFuKTsKKworCXdyaXRlX21heGltKGRldiw0LCAweDMxMyk7IC8qIHJ4IHJlZ2lzdGVyKi8KKworCS8qIFBBIGlzIGRyaXZlbiBkaXJlY3RseSBieSB0aGUgQkIsIHdlIGtlZXAgdGhlIE1BWElNIGJpYXMKKwkgKiBhdCB0aGUgaGlnaGVzdCB2YWx1ZSBpbiB0aGUgYm91YnQgdGhhIHBsZWFjaW5nIGl0IHRvIGxvd2VyCisJICogdmFsdWVzIG1heSBpbnRyb2R1Y2Ugc29tZSBmdXJ0aGVyIGF0dGVudWF0aW9uIHNvbWV3aGVyZS4uCisJICovCisKKwl3cml0ZV9tYXhpbShkZXYsNSwgMHhmKTsKKworCisJLypiYXNlYmFuZCBjb25maWd1cmF0aW9uKi8KKwl3cml0ZV9waHkoZGV2LDAsMHg4OCk7IC8vc3lzMQorCXdyaXRlX3BoeShkZXYsMywweDgpOyAvL3R4YWdjCisJd3JpdGVfcGh5KGRldiw0LDB4ZjgpOyAvLyBsbmFkZXQKKwl3cml0ZV9waHkoZGV2LDUsMHg5MCk7IC8vIGlmYWdjaW5pdAorCXdyaXRlX3BoeShkZXYsNiwweDFhKTsgLy8gaWZhZ2NsaW1pdAorCXdyaXRlX3BoeShkZXYsNywweDY0KTsgLy8gaWZhZ2NkZXQKKworCS8qU2hvdWxkIGJlIGRvbmUgc29tZXRoaW5nIG1vcmUgaGVyZT8/Ki8KKworCW1heGltX3dyaXRlX3BoeV9hbnRlbm5hKGRldixwcml2LT5jaGFuKTsKKworCXdyaXRlX3BoeShkZXYsMHgxMSwweDg4KTsgLy90cmwKKwlpZihwcml2LT5kaXZlcnNpdHkpCisJCXdyaXRlX3BoeShkZXYsMHgxMiwweGM3KTsKKwllbHNlCisJCXdyaXRlX3BoeShkZXYsMHgxMiwweDQ3KTsKKworCXdyaXRlX3BoeShkZXYsMHgxMywweDliKTsKKworCXdyaXRlX3BoeShkZXYsMHgxOSwweDApOyAvL0NIRVNUTElNCisJd3JpdGVfcGh5KGRldiwweDFhLDB4OWYpOyAvL0NIU1FMSU0KKworCW1heGltX3JmX3NldF9jaGFuKGRldixwcml2LT5jaGFuKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfbWF4MjgyMC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MF9tYXgyODIwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQ0ZmI1NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfbWF4MjgyMC5oCkBAIC0wLDAgKzEsMjEgQEAKKy8qCisJVGhpcyBpcyBwYXJ0IG9mIHJ0bDgxODAgT3BlblNvdXJjZSBkcml2ZXIKKwlDb3B5cmlnaHQgKEMpIEFuZHJlYSBNZXJlbGxvIDIwMDQtMjAwNSAgPGFuZHJlYW1ybEB0aXNjYWxpLml0PgorCVJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiBHUEwgKEdlbmVyYWwgUHVibGljIExpY2VuY2UpCisKKwlQYXJ0cyBvZiB0aGlzIGRyaXZlciBhcmUgYmFzZWQgb24gdGhlIEdQTCBwYXJ0IG9mIHRoZSBvZmZpY2lhbCByZWFsdGVrIGRyaXZlcgorCVBhcnRzIG9mIHRoaXMgZHJpdmVyIGFyZSBiYXNlZCBvbiB0aGUgcnRsODE4MCBkcml2ZXIgc2tlbGV0b24gZnJvbSBQYXRyaWMgU2NoZW5rZSAmIEFuZHJlcyBTYWxvbW9uCisJUGFydHMgb2YgdGhpcyBkcml2ZXIgYXJlIGJhc2VkIG9uIHRoZSBJbnRlbCBQcm8gV2lyZWxlc3MgMjEwMCBHUEwgZHJpdmVyCisKKwlXZSB3YW50IHRvIHRhbmtzIHRoZSBBdXRob3JzIG9mIHN1Y2ggcHJvamVjdHMgYW5kIHRoZSBOZGlzd3JhcHBlciBwcm9qZWN0IEF1dGhvcnMuCisqLworCisjZGVmaW5lIE1BWElNX0FOVEVOTkEgMHhiMworI2RlZmluZSBNQVhJTV9BTkFQQVJBTV9QV1IxX09OIDB4OAorI2RlZmluZSBNQVhJTV9BTkFQQVJBTV9QV1IwX09OIDB4MAorCisKK3ZvaWQgbWF4aW1fcmZfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3ZvaWQgbWF4aW1fcmZfc2V0X2NoYW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldixzaG9ydCBjaCk7CisKK3ZvaWQgbWF4aW1fcmZfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwX3BtLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwX3BtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzg1MWI5MwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfcG0uYwpAQCAtMCwwICsxLDkwIEBACisvKgorICAgUG93ZXIgbWFuYWdlbWVudCBpbnRlcmZhY2Ugcm91dGluZXMuCisgICBXcml0dGVuIGJ5IE1hcml1c3ogTWF0dXN6ZWsuCisgICBUaGlzIGNvZGUgaXMgY3VycmVudGx5IGp1c3QgYSBwbGFjZWhvbGRlciBmb3IgbGF0ZXIgd29yayBhbmQKKyAgIGRvZXMgbm90IGRvIGFueXRoaW5nIHVzZWZ1bC4KKworICAgVGhpcyBpcyBwYXJ0IG9mIHJ0bDgxODAgT3BlblNvdXJjZSBkcml2ZXIuCisgICBDb3B5cmlnaHQgKEMpIEFuZHJlYSBNZXJlbGxvIDIwMDQgIDxhbmRyZWFtcmxAdGlzY2FsaS5pdD4KKyAgIFJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiBHUEwgKEdlbmVyYWwgUHVibGljIExpY2VuY2UpCisqLworCisjaWZkZWYgQ09ORklHX1JUTDgxODBfUE0KKworCisjaW5jbHVkZSAicjgxODBfaHcuaCIKKyNpbmNsdWRlICJyODE4MF9wbS5oIgorI2luY2x1ZGUgInI4MTgwLmgiCisKK2ludCBydGw4MTgwX3NhdmVfc3RhdGUgKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHUzMiBzdGF0ZSkKK3sKKyAgICAgICAgcHJpbnRrKEtFUk5fTk9USUNFICJyODE4MCBzYXZlIHN0YXRlIGNhbGwgKHN0YXRlICV1KS5cbiIsIHN0YXRlKTsKKwlyZXR1cm4oLUVBR0FJTik7Cit9CisKK2ludCBydGw4MTgwX3N1c3BlbmQgKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKy8vCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCWlmICghbmV0aWZfcnVubmluZyhkZXYpKQorCQlnb3RvIG91dF9wY2lfc3VzcGVuZDsKKworCWRldi0+c3RvcChkZXYpOworCisJbmV0aWZfZGV2aWNlX2RldGFjaChkZXYpOworCitvdXRfcGNpX3N1c3BlbmQ6CisJcGNpX3NhdmVfc3RhdGUocGRldik7CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCXBjaV9zZXRfcG93ZXJfc3RhdGUocGRldixwY2lfY2hvb3NlX3N0YXRlKHBkZXYsc3RhdGUpKTsKKwlyZXR1cm4gMDsKK30KKworaW50IHJ0bDgxODBfcmVzdW1lIChzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworLy8Jc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCWludCBlcnI7CisJdTMyIHZhbDsKKworCXBjaV9zZXRfcG93ZXJfc3RhdGUocGRldiwgUENJX0QwKTsKKworCWVyciA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOworCWlmKGVycikgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBwY2lfZW5hYmxlX2RldmljZSBmYWlsZWQgb24gcmVzdW1lXG4iLAorCQkJCWRldi0+bmFtZSk7CisKKwkJcmV0dXJuIGVycjsKKwl9CisJcGNpX3Jlc3RvcmVfc3RhdGUocGRldik7CisJLyoKKwkgKiBTdXNwZW5kL1Jlc3VtZSByZXNldHMgdGhlIFBDSSBjb25maWd1cmF0aW9uIHNwYWNlLCBzbyB3ZSBoYXZlIHRvCisJICogcmUtZGlzYWJsZSB0aGUgUkVUUllfVElNRU9VVCByZWdpc3RlciAoMHg0MSkgdG8ga2VlcCBQQ0kgVHggcmV0cmllcworCSAqIGZyb20gaW50ZXJmZXJpbmcgd2l0aCBDMyBDUFUgc3RhdGUuIHBjaV9yZXN0b3JlX3N0YXRlIHdvbid0IGhlbHAKKwkgKiBoZXJlIHNpbmNlIGl0IG9ubHkgcmVzdG9yZXMgdGhlIGZpcnN0IDY0IGJ5dGVzIHBjaSBjb25maWcgaGVhZGVyLgorCSAqLworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LCAweDQwLCAmdmFsKTsKKwlpZiAoKHZhbCAmIDB4MDAwMGZmMDApICE9IDApCisJCXBjaV93cml0ZV9jb25maWdfZHdvcmQocGRldiwgMHg0MCwgdmFsICYgMHhmZmZmMDBmZik7CisKKwlpZighbmV0aWZfcnVubmluZyhkZXYpKQorCQlnb3RvIG91dDsKKworCWRldi0+b3BlbihkZXYpOworCW5ldGlmX2RldmljZV9hdHRhY2goZGV2KTsKK291dDoKKwlyZXR1cm4gMDsKK30KKworCitpbnQgcnRsODE4MF9lbmFibGVfd2FrZSAoc3RydWN0IHBjaV9kZXYgKmRldiwgdTMyIHN0YXRlLCBpbnQgZW5hYmxlKQoreworICAgICAgICBwcmludGsoS0VSTl9OT1RJQ0UgInI4MTgwIGVuYWJsZSB3YWtlIGNhbGwgKHN0YXRlICV1LCBlbmFibGUgJWQpLlxuIiwKKwkgICAgICAgc3RhdGUsIGVuYWJsZSk7CisJcmV0dXJuKC1FQUdBSU4pOworfQorCisKKworI2VuZGlmIC8vQ09ORklHX1JUTDgxODBfUE0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfcG0uaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfcG0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTU4YjNhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MF9wbS5oCkBAIC0wLDAgKzEsMjggQEAKKy8qCisgICAgICAgIFBvd2VyIG1hbmFnZW1lbnQgaW50ZXJmYWNlIHJvdXRpbmVzLgorCVdyaXR0ZW4gYnkgTWFyaXVzeiBNYXR1c3play4KKwlUaGlzIGNvZGUgaXMgY3VycmVudGx5IGp1c3QgYSBwbGFjZWhvbGRlciBmb3IgbGF0ZXIgd29yayBhbmQKKwlkb2VzIG5vdCBkbyBhbnl0aGluZyB1c2VmdWwuCisKKwlUaGlzIGlzIHBhcnQgb2YgcnRsODE4MCBPcGVuU291cmNlIGRyaXZlci4KKwlDb3B5cmlnaHQgKEMpIEFuZHJlYSBNZXJlbGxvIDIwMDQgIDxhbmRyZWFtcmxAdGlzY2FsaS5pdD4KKwlSZWxlYXNlZCB1bmRlciB0aGUgdGVybXMgb2YgR1BMIChHZW5lcmFsIFB1YmxpYyBMaWNlbmNlKQorCisqLworCisjaWZkZWYgQ09ORklHX1JUTDgxODBfUE0KKworI2lmbmRlZiBSODE4MF9QTV9ICisjZGVmaW5lIFI4MTgwX1BNX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisKK2ludCBydGw4MTgwX3NhdmVfc3RhdGUgKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHUzMiBzdGF0ZSk7CitpbnQgcnRsODE4MF9zdXNwZW5kIChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKTsKK2ludCBydGw4MTgwX3Jlc3VtZSAoc3RydWN0IHBjaV9kZXYgKnBkZXYpOworaW50IHJ0bDgxODBfZW5hYmxlX3dha2UgKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHUzMiBzdGF0ZSwgaW50IGVuYWJsZSk7CisKKyNlbmRpZiAvL1I4MTgwX1BNX0gKKworI2VuZGlmIC8vIENPTkZJR19SVEw4MTgwX1BNCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwX3J0bDgyMjUuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfcnRsODIyNS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2ZWQwMjkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwX3J0bDgyMjUuYwpAQCAtMCwwICsxLDkzMyBAQAorLyoKKyAgVGhpcyBpcyBwYXJ0IG9mIHRoZSBydGw4MTgwLXNhMjQwMCBkcml2ZXIKKyAgcmVsZWFzZWQgdW5kZXIgdGhlIEdQTCAoU2VlIGZpbGUgQ09QWUlORyBmb3IgZGV0YWlscykuCisgIENvcHlyaWdodCAoYykgMjAwNSBBbmRyZWEgTWVyZWxsbyA8YW5kcmVhbXJsQHRpc2NhbGkuaXQ+CisKKyAgVGhpcyBmaWxlcyBjb250YWlucyBwcm9ncmFtbWluZyBjb2RlIGZvciB0aGUgcnRsODIyNQorICByYWRpbyBmcm9udGVuZC4KKworICAqTWFueSogdGhhbmtzIHRvIFJlYWx0ZWsgQ29ycC4gZm9yIHRoZWlyIGdyZWF0IHN1cHBvcnQhCisKKyovCisKKworCisjaW5jbHVkZSAicjgxODBfaHcuaCIKKyNpbmNsdWRlICJyODE4MF9ydGw4MjI1LmgiCisKKwordTggcnRsODIyNV9nYWluW109eworCTB4MjMsMHg4OCwweDdjLDB4YTUsLy8gLTgyZGJtCisJMHgyMywweDg4LDB4N2MsMHhiNSwvLyAtODJkYm0KKwkweDIzLDB4ODgsMHg3YywweGM1LC8vIC04MmRibQorCTB4MzMsMHg4MCwweDc5LDB4YzUsLy8gLTc4ZGJtCisJMHg0MywweDc4LDB4NzYsMHhjNSwvLyAtNzRkYm0KKwkweDUzLDB4NjAsMHg3MywweGM1LC8vIC03MGRibQorCTB4NjMsMHg1OCwweDcwLDB4YzUsLy8gLTY2ZGJtCit9OworCisjaWYgMAordTggcnRsODIyNV9pbml0X2dhaW5bXT17CisJLy8weDAwLDB4MDAsMHgwMCwweDAwLC8vMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDMzLDB4ODAsMHg2YywweGM1LC8vMHgwMCwweDQ5LDB4MDYsMHhiNSwvL0dhaW4gPSAwIH4gLTc4ZGJtCisJMHg0MywweDc4LDB4NjksMHhjNSwvLzB4MDAsMHg0NSwweDA2LDB4YjEsLy9HYWluID0gMSB+IC03NGRibQorCTB4NTMsMHg2MCwweDY2LDB4YzUsLy8weDAwLDB4NDEsMHgwNiwweGFiLC8vR2FpbiA9IDIgfiAtNzBkYm0KKwkweDYzLDB4NTgsMHg2MywweGM1LC8vMHgwMCwweDNkLDB4MDYsMHhhNSwvL0dhaW4gPSAzIH4gLTY2ZGJtCisJMHg3MywweDUwLDB4NjIsMHhjNSwvLzB4MDAsMHgzOSwweDA2LDB4YTEsLy9HYWluID0gNCB+IC02MmRibQorCTB4ODMsMHg0MywweDYxLDB4YzUsLy8weDAwLDB4MzUsMHgwNiwweDliLC8vR2FpbiA9IDUgfiAtNThkYm0KKwkweDkzLDB4MzgsMHg1YSwweGM1LC8vMHgwMCwweDMxLDB4MDYsMHg5OSwvL0dhaW4gPSA2IH4gLTU0ZGJtCit9OworI2VuZGlmCisjaWZkZWYgQ09ORklHX1JUTDgxOFhfUwordTMyIHJ0bDgyMjVfY2hhbltdID17CisgICAgICAgICAgICAgIDAsCisJCTB4MDA4MCwgLy9jaDEKKwkJMHgwMTAwLCAvL2NoMgorCQkweDAxODAsIC8vY2gzCisJCTB4MDIwMCwgLy9jaDQKKwkJMHgwMjgwLAorCQkweDAzMDAsCisJCTB4MDM4MCwKKwkJMHgwNDAwLAorCQkweDA0ODAsCisJCTB4MDUwMCwKKwkJMHgwNTgwLAorCQkweDA2MDAsCisJCTB4MDY4MCwKKwkJMHgwNzRBLCAvL2NoMTQKK307CisjZWxzZQordTMyIHJ0bDgyMjVfY2hhbltdID0geworCTAsCS8vZHVtbXkgY2hhbm5lbCAwCisJMHgwODVjLCAvLzEKKwkweDA4ZGMsIC8vMgorCTB4MDk1YywgLy8zCisJMHgwOWRjLCAvLzQKKwkweDBhNWMsIC8vNQorCTB4MGFkYywgLy82CisJMHgwYjVjLCAvLzcKKwkweDBiZGMsIC8vOAorCTB4MGM1YywgLy85CisJMHgwY2RjLCAvLzEwCisJMHgwZDVjLCAvLzExCisJMHgwZGRjLCAvLzEyCisJMHgwZTVjLCAvLzEzCisJLy8weDBmNWMsIC8vMTQKKwkweDBmNzIsIC8vIDE0Cit9OworI2VuZGlmCisKK3UxNiBydGw4MjI1YmNkX3J4Z2FpbltdPXsKKwkweDA0MDAsIDB4MDQwMSwgMHgwNDAyLCAweDA0MDMsIDB4MDQwNCwgMHgwNDA1LCAweDA0MDgsIDB4MDQwOSwKKwkweDA0MGEsIDB4MDQwYiwgMHgwNTAyLCAweDA1MDMsIDB4MDUwNCwgMHgwNTA1LCAweDA1NDAsIDB4MDU0MSwKKwkweDA1NDIsIDB4MDU0MywgMHgwNTQ0LCAweDA1NDUsIDB4MDU4MCwgMHgwNTgxLCAweDA1ODIsIDB4MDU4MywKKwkweDA1ODQsIDB4MDU4NSwgMHgwNTg4LCAweDA1ODksIDB4MDU4YSwgMHgwNThiLCAweDA2NDMsIDB4MDY0NCwKKwkweDA2NDUsIDB4MDY4MCwgMHgwNjgxLCAweDA2ODIsIDB4MDY4MywgMHgwNjg0LCAweDA2ODUsIDB4MDY4OCwKKwkweDA2ODksIDB4MDY4YSwgMHgwNjhiLCAweDA2OGMsIDB4MDc0MiwgMHgwNzQzLCAweDA3NDQsIDB4MDc0NSwKKwkweDA3ODAsIDB4MDc4MSwgMHgwNzgyLCAweDA3ODMsIDB4MDc4NCwgMHgwNzg1LCAweDA3ODgsIDB4MDc4OSwKKwkweDA3OGEsIDB4MDc4YiwgMHgwNzhjLCAweDA3OGQsIDB4MDc5MCwgMHgwNzkxLCAweDA3OTIsIDB4MDc5MywKKwkweDA3OTQsIDB4MDc5NSwgMHgwNzk4LCAweDA3OTksIDB4MDc5YSwgMHgwNzliLCAweDA3OWMsIDB4MDc5ZCwKKwkweDA3YTAsIDB4MDdhMSwgMHgwN2EyLCAweDA3YTMsIDB4MDdhNCwgMHgwN2E1LCAweDA3YTgsIDB4MDdhOSwKKwkweDA3YWEsIDB4MDdhYiwgMHgwN2FjLCAweDA3YWQsIDB4MDdiMCwgMHgwN2IxLCAweDA3YjIsIDB4MDdiMywKKwkweDA3YjQsIDB4MDdiNSwgMHgwN2I4LCAweDA3YjksIDB4MDdiYSwgMHgwN2JiLCAweDA3YmIKKworfTsKKworCisjaWYgMAordTE2IHJ0bDgyMjViY19yeGdhaW5bXT17CisJMHgwNDAwLCAweDA0MDEsIDB4MDQwMiwgMHgwNDAzLCAweDA0MDQsIDB4MDQwNSwgMHgwNDA4LCAweDA0MDksCisJMHgwNDBhLCAweDA0MGIsIDB4MDUwMiwgMHgwNTAzLCAweDA1MDQsIDB4MDUwNSwgMHgwNTQwLCAweDA1NDEsCisJMHgwNTQyLCAweDA1NDMsIDB4MDU0NCwgMHgwNTQ1LCAweDA1ODAsIDB4MDU4MSwgMHgwNTgyLCAweDA1ODMsCisJMHgwNTg0LCAweDA1ODUsIDB4MDU4OCwgMHgwNTg5LCAweDA1OGEsIDB4MDU4YiwgMHgwNjQzLCAweDA2NDQsCisJMHgwNjQ1LCAweDA2ODAsIDB4MDY4MSwgMHgwNjgyLCAweDA2ODMsIDB4MDY4NCwgMHgwNjg1LCAweDA2ODgsCisJMHgwNjg5LCAweDA2OGEsIDB4MDY4YiwgMHgwNjhjLCAweDA3NDIsIDB4MDc0MywgMHgwNzQ0LCAweDA3NDUsCisJMHgwNzgwLCAweDA3ODEsIDB4MDc4MiwgMHgwNzgzLCAweDA3ODQsIDB4MDc4NSwgMHgwNzg4LCAweDA3ODksCisJMHgwNzhhLCAweDA3OGIsIDB4MDc4YywgMHgwNzhkLCAweDA3OTAsIDB4MDc5MSwgMHgwNzkyLCAweDA3OTMsCisJMHgwNzk0LCAweDA3OTUsIDB4MDc5OCwgMHgwNzk5LCAweDAzOWEsIDB4MDM5YiwgMHgwMzljLCAweDAzOWQsCisJMHgwM2EwLCAweDAzYTEsIDB4MDNhMiwgMHgwM2EzLCAweDAzYTQsIDB4MDNhNSwgMHgwM2E4LCAweDAzYTksCisJMHgwM2FhLCAweDAzYWIsIDB4MDNhYywgMHgwM2FkLCAweDAzYjAsIDB4MDNiMSwgMHgwM2IyLCAweDAzYjMsCisJMHgwM2I0LCAweDAzYjUsIDB4MDNiOCwgMHgwM2I5LCAweDAzYmEsIDB4MDNiYiwgMHgwM2JiCisKK307CisKKwordTE2IHJ0bDgyMjVhX3J4Z2FpbltdPXsKKwkweDA0MDAsIDB4MDQwMSwgMHgwNDAyLCAweDA0MDMsIDB4MDQwNCwgMHgwNDA1LCAweDA0MDgsIDB4MDQwOSwKKwkweDA0MGEsIDB4MDQwYiwgMHgwNTAyLCAweDA1MDMsIDB4MDUwNCwgMHgwNTA1LCAweDA1NDAsIDB4MDU0MSwKKwkweDA1NDIsIDB4MDU0MywgMHgwNTQ0LCAweDA1NDUsIDB4MDU4MCwgMHgwNTgxLCAweDA1ODIsIDB4MDU4MywKKwkweDA1ODQsIDB4MDU4NSwgMHgwNTg4LCAweDA1ODksIDB4MDU4YSwgMHgwNThiLCAweDA2NDMsIDB4MDY0NCwKKwkweDA2NDUsIDB4MDY4MCwgMHgwNjgxLCAweDA2ODIsIDB4MDY4MywgMHgwNjg0LCAweDA2ODUsIDB4MDY4OCwKKwkweDA2ODksIDB4MDY4YSwgMHgwNjhiLCAweDA2OGMsIDB4MDc0MiwgMHgwNzQzLCAweDA3NDQsIDB4MDc0NSwKKwkweDA3ODAsIDB4MDc4MSwgMHgwNzgyLCAweDA3ODMsIDB4MDc4NCwgMHgwNzg1LCAweDA3ODgsIDB4MDc4OSwKKwkweDA3OGEsIDB4MDc4YiwgMHgwNzhjLCAweDA3OGQsIDB4MDc5MCwgMHgwNzkxLCAweDA3OTIsIDB4MDc5MywKKwkweDA3OTQsIDB4MDc5NSwgMHgwNzk4LCAweDA3OTksIDB4MDc5YSwgMHgwNzliLCAweDA3OWMsIDB4MDc5ZCwKKwkweDA3YTAsIDB4MDdhMSwgMHgwN2EyLCAweDA3YTMsIDB4MDdhNCwgMHgwN2E1LCAweDA3YTgsIDB4MDdhOSwKKwkweDA3YWEsIDB4MDdhYiwgMHgwN2FjLCAweDA3YWQsIDB4MDdhZCwgMHgwN2FkLCAweDA3YWQsIDB4MDdhZCwKKwkweDA3YWQsIDB4MDdhZCwgMHgwN2FkLCAweDA3YWQsIDB4MDdhZCwgMHgwN2FkLCAweDA3YWQKK307CisjZW5kaWYKKwordTggcnRsODIyNV9hZ2NbXT17CisJMHg5ZSwweDllLDB4OWUsMHg5ZSwweDllLDB4OWUsMHg5ZSwweDllLDB4OWQsMHg5YywweDliLDB4OWEsMHg5OSwweDk4LDB4OTcsMHg5NiwKKwkweDk1LDB4OTQsMHg5MywweDkyLDB4OTEsMHg5MCwweDhmLDB4OGUsMHg4ZCwweDhjLDB4OGIsMHg4YSwweDg5LDB4ODgsMHg4NywweDg2LAorCTB4ODUsMHg4NCwweDgzLDB4ODIsMHg4MSwweDgwLDB4M2YsMHgzZSwweDNkLDB4M2MsMHgzYiwweDNhLDB4MzksMHgzOCwweDM3LDB4MzYsCisJMHgzNSwweDM0LDB4MzMsMHgzMiwweDMxLDB4MzAsMHgyZiwweDJlLDB4MmQsMHgyYywweDJiLDB4MmEsMHgyOSwweDI4LDB4MjcsMHgyNiwKKwkweDI1LDB4MjQsMHgyMywweDIyLDB4MjEsMHgyMCwweDFmLDB4MWUsMHgxZCwweDFjLDB4MWIsMHgxYSwweDE5LDB4MTgsMHgxNywweDE2LAorCTB4MTUsMHgxNCwweDEzLDB4MTIsMHgxMSwweDEwLDB4MGYsMHgwZSwweDBkLDB4MGMsMHgwYiwweDBhLDB4MDksMHgwOCwweDA3LDB4MDYsCisJMHgwNSwweDA0LDB4MDMsMHgwMiwweDAxLDB4MDEsMHgwMSwweDAxLDB4MDEsMHgwMSwweDAxLDB4MDEsMHgwMSwweDAxLDB4MDEsMHgwMSwKKwkweDAxLDB4MDEsMHgwMSwweDAxLDB4MDEsMHgwMSwweDAxLDB4MDEsMHgwMSwweDAxLDB4MDEsMHgwMSwweDAxLDB4MDEsMHgwMSwweDAxLAorfTsKKworCit1OCBydGw4MjI1X3R4X2dhaW5fY2NrX29mZG1bXT17CisJMHgwMiwweDA2LDB4MGUsMHgxZSwweDNlLDB4N2UKK307CisKKwordTggcnRsODIyNV90eF9wb3dlcl9vZmRtW109eworCTB4ODAsMHg5MCwweGEyLDB4YjUsMHhjYiwweGU0Cit9OworCisKK3U4IHJ0bDgyMjVfdHhfcG93ZXJfY2NrX2NoMTRbXT17CisJMHgxOCwweDE3LDB4MTUsMHgwYywweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MWIsMHgxYSwweDE3LDB4MGUsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDFmLDB4MWUsMHgxYSwweDBmLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgyMiwweDIxLDB4MWQsMHgxMSwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MjYsMHgyNSwweDIxLDB4MTMsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDJiLDB4MmEsMHgyNSwweDE1LDB4MDAsMHgwMCwweDAwLDB4MDAKK307CisKKwordTggcnRsODIyNV90eF9wb3dlcl9jY2tbXT17CisJMHgxOCwweDE3LDB4MTUsMHgxMSwweDBjLDB4MDgsMHgwNCwweDAyLAorCTB4MWIsMHgxYSwweDE3LDB4MTMsMHgwZSwweDA5LDB4MDQsMHgwMiwKKwkweDFmLDB4MWUsMHgxYSwweDE1LDB4MTAsMHgwYSwweDA1LDB4MDIsCisJMHgyMiwweDIxLDB4MWQsMHgxOCwweDExLDB4MGIsMHgwNiwweDAyLAorCTB4MjYsMHgyNSwweDIxLDB4MWIsMHgxNCwweDBkLDB4MDYsMHgwMywKKwkweDJiLDB4MmEsMHgyNSwweDFlLDB4MTYsMHgwZSwweDA3LDB4MDMKK307CisKKwordm9pZCBydGw4MjI1X3NldF9nYWluKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHNob3J0IGdhaW4pCit7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDBkLCBydGw4MjI1X2dhaW5bZ2FpbiAqIDRdKTsKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MjMsIHJ0bDgyMjVfZ2FpbltnYWluICogNCArIDFdKTsKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MWIsIHJ0bDgyMjVfZ2FpbltnYWluICogNCArIDJdKTsKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MWQsIHJ0bDgyMjVfZ2FpbltnYWluICogNCArIDNdKTsKK30KKyNpZiAwCisKK3ZvaWQgcnRsODIyNV9zZXRfZ2FpbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzaG9ydCBnYWluKQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCXJ0bDgxODBfc2V0X2FuYXBhcmFtKGRldiwgUlRMODIyNV9BTkFQQVJBTV9PTik7CisKKwlpZihwcml2LT5jYXJkXzgxODUgPT0gMikKKwkJd3JpdGVfcGh5X29mZG0oZGV2LCAweDIxLCAweDI3KTsKKwllbHNlCisJCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgyMSwgMHgzNyk7CisKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MjUsIDB4MjApOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxMSwgMHg2KTsKKworCWlmKHByaXYtPmNhcmRfODE4NSA9PSAxICYmIHByaXYtPmNhcmRfODE4NV9CdmVyc2lvbikKKwkJd3JpdGVfcGh5X29mZG0oZGV2LCAweDI3LCAweDgpOworCWVsc2UKKwkJd3JpdGVfcGh5X29mZG0oZGV2LCAweDI3LCAweDg4KTsKKworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxNCwgMCk7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDE2LCAwKTsKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MTUsIDB4NDApOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxNywgMHg0MCk7CisKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MGQsIHJ0bDgyMjVfZ2FpbltnYWluICogNF0pOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgyMywgcnRsODIyNV9nYWluW2dhaW4gKiA0ICsgMV0pOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxYiwgcnRsODIyNV9nYWluW2dhaW4gKiA0ICsgMl0pOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxZCwgcnRsODIyNV9nYWluW2dhaW4gKiA0ICsgM10pOworCS8vcnRsODIyNV9zZXRfZ2Fpbl91c2IoZGV2LCBnYWluKTsKK30KKyNlbmRpZgorCisKK3ZvaWQgd3JpdGVfcnRsODIyNShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCBhZHIsIHUxNiBkYXRhKQoreworCWludCBpOworCXUxNiBvdXQsc2VsZWN0OworCXU4IGJpdDsKKwl1MzIgYmFuZ2RhdGEgPSAoZGF0YSA8PCA0KSB8IChhZHIgJiAweGYpOworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCW91dCA9IHJlYWRfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQpICYgMHhmZmYzOworCisJd3JpdGVfbmljX3dvcmQoZGV2LFJGUGluc0VuYWJsZSwKKwkJKHJlYWRfbmljX3dvcmQoZGV2LFJGUGluc0VuYWJsZSkgfCAweDcpKTsKKworCXNlbGVjdCA9IHJlYWRfbmljX3dvcmQoZGV2LCBSRlBpbnNTZWxlY3QpOworCisJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNTZWxlY3QsIHNlbGVjdCB8IDB4NyB8CisJCSgocHJpdi0+Y2FyZF90eXBlID09IFVTQikgPyAwIDogU1dfQ09OVFJPTF9HUElPKSk7CisKKwlmb3JjZV9wY2lfcG9zdGluZyhkZXYpOworCXVkZWxheSgxMCk7CisKKwl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCwgb3V0IHwgQkJfSE9TVF9CQU5HX0VOICk7Ly98IDB4MWZmZik7CisKKwlmb3JjZV9wY2lfcG9zdGluZyhkZXYpOworCXVkZWxheSgyKTsKKworCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCBvdXQpOworCisJZm9yY2VfcGNpX3Bvc3RpbmcoZGV2KTsKKwl1ZGVsYXkoMTApOworCisKKwlmb3IoaT0xNTsgaT49MDtpLS0peworCisJCWJpdCA9IChiYW5nZGF0YSAmICgxPDxpKSkgPj4gaTsKKworCQl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCwgYml0IHwgb3V0KTsKKworCQl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCwgYml0IHwgb3V0IHwgQkJfSE9TVF9CQU5HX0NMSyk7CisJCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCBiaXQgfCBvdXQgfCBCQl9IT1NUX0JBTkdfQ0xLKTsKKworCQlpLS07CisJCWJpdCA9IChiYW5nZGF0YSAmICgxPDxpKSkgPj4gaTsKKworCQl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCwgYml0IHwgb3V0IHwgQkJfSE9TVF9CQU5HX0NMSyk7CisJCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCBiaXQgfCBvdXQgfCBCQl9IT1NUX0JBTkdfQ0xLKTsKKworCQl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCwgYml0IHwgb3V0KTsKKworCX0KKworCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCBvdXQgfCBCQl9IT1NUX0JBTkdfRU4pOworCisJZm9yY2VfcGNpX3Bvc3RpbmcoZGV2KTsKKwl1ZGVsYXkoMTApOworCisJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQsIG91dCB8CisJCSgocHJpdi0+Y2FyZF90eXBlID09IFVTQikgPyA0IDogQkJfSE9TVF9CQU5HX0VOKSk7CisKKwl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc1NlbGVjdCwgc2VsZWN0IHwKKwkJKChwcml2LT5jYXJkX3R5cGUgPT0gVVNCKSA/IDAgOiBTV19DT05UUk9MX0dQSU8pKTsKKworCWlmKHByaXYtPmNhcmRfdHlwZSA9PSBVU0IpCisJCW1kZWxheSgyKTsKKwllbHNlCisJCXJ0bDgxODVfcmZfcGluc19lbmFibGUoZGV2KTsKK30KKwordm9pZCBydGw4MjI1X3JmX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJd3JpdGVfcnRsODIyNShkZXYsIDB4NCwgMHgxZik7CisKKwlmb3JjZV9wY2lfcG9zdGluZyhkZXYpOworCW1kZWxheSgxKTsKKworCXJ0bDgxODBfc2V0X2FuYXBhcmFtKGRldiwgUlRMODIyNV9BTkFQQVJBTV9PRkYpOworCXJ0bDgxODVfc2V0X2FuYXBhcmFtMihkZXYsIFJUTDgyMjVfQU5BUEFSQU0yX09GRik7Cit9CisKK3ZvaWQgcnRsODIyNV9TZXRUWFBvd2VyTGV2ZWwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc2hvcnQgY2gpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCisJaW50IEdhaW5JZHg7CisJaW50IEdhaW5TZXR0aW5nOworCWludCBpOworCXU4IHBvd2VyOworCXU4ICpjY2tfcG93ZXJfdGFibGU7CisJdTggbWF4X2Nja19wb3dlcl9sZXZlbDsKKwl1OCBtYXhfb2ZkbV9wb3dlcl9sZXZlbDsKKwl1OCBtaW5fb2ZkbV9wb3dlcl9sZXZlbDsKKwl1OCBjY2tfcG93ZXJfbGV2ZWwgPSAweGZmICYgcHJpdi0+Y2h0eHB3cltjaF07CisJdTggb2ZkbV9wb3dlcl9sZXZlbCA9IDB4ZmYgJiBwcml2LT5jaHR4cHdyX29mZG1bY2hdOworCisJaWYocHJpdi0+Y2FyZF90eXBlID09IFVTQil7CisJCW1heF9jY2tfcG93ZXJfbGV2ZWwgPSAxMTsKKwkJbWF4X29mZG1fcG93ZXJfbGV2ZWwgPSAyNTsgLy8gIDEyIC0+IDI1CisJCW1pbl9vZmRtX3Bvd2VyX2xldmVsID0gMTA7CisJfWVsc2V7CisJCW1heF9jY2tfcG93ZXJfbGV2ZWwgPSAzNTsKKwkJbWF4X29mZG1fcG93ZXJfbGV2ZWwgPSAzNTsKKwkJbWluX29mZG1fcG93ZXJfbGV2ZWwgPSAwOworCX0KKwkvKiBDQ0sgcG93ZXIgc2V0dGluZyAqLworCWlmKGNja19wb3dlcl9sZXZlbCA+IG1heF9jY2tfcG93ZXJfbGV2ZWwpCisJCWNja19wb3dlcl9sZXZlbCA9IG1heF9jY2tfcG93ZXJfbGV2ZWw7CisJR2FpbklkeD1jY2tfcG93ZXJfbGV2ZWwgJSA2OworCUdhaW5TZXR0aW5nPWNja19wb3dlcl9sZXZlbCAvIDY7CisKKwlpZihjaCA9PSAxNCkKKwkJY2NrX3Bvd2VyX3RhYmxlID0gcnRsODIyNV90eF9wb3dlcl9jY2tfY2gxNDsKKwllbHNlCisJCWNja19wb3dlcl90YWJsZSA9IHJ0bDgyMjVfdHhfcG93ZXJfY2NrOworCisvLwlpZihwcml2LT5jYXJkXzgxODUgPT0gMSAmJiBwcml2LT5jYXJkXzgxODVfQnZlcnNpb24gKXsKKwkJLypWZXIgQiovCisvLwkJd3JpdGVfbmljX2J5dGUoZGV2LCBUWF9HQUlOX0NDSywgcnRsODIyNV90eF9nYWluX2Nja19vZmRtW0dhaW5TZXR0aW5nXSk7CisvLwl9ZWxzZXsKKwkJLypWZXIgQyAtIEQgKi8KKwl3cml0ZV9uaWNfYnl0ZShkZXYsIFRYX0dBSU5fQ0NLLCBydGw4MjI1X3R4X2dhaW5fY2NrX29mZG1bR2FpblNldHRpbmddPj4xKTsKKy8vCX0KKworCWZvcihpPTA7aTw4O2krKyl7CisKKwkJcG93ZXIgPSBjY2tfcG93ZXJfdGFibGVbR2FpbklkeCAqIDggKyBpXTsKKwkJd3JpdGVfcGh5X2NjayhkZXYsIDB4NDQgKyBpLCBwb3dlcik7CisJfQorCisJLyogRklYTUUgSXMgdGhpcyBkZWxheSByZWFsbHkgbmVlZGVlZCA/ICovCisJZm9yY2VfcGNpX3Bvc3RpbmcoZGV2KTsKKwltZGVsYXkoMSk7CisKKwkvKiBPRkRNIHBvd2VyIHNldHRpbmcgKi8KKy8vICBPbGQ6CisvLwlpZihvZmRtX3Bvd2VyX2xldmVsID4gbWF4X29mZG1fcG93ZXJfbGV2ZWwpCisvLwkJb2ZkbV9wb3dlcl9sZXZlbCA9IDM1OworLy8Jb2ZkbV9wb3dlcl9sZXZlbCArPSBtaW5fb2ZkbV9wb3dlcl9sZXZlbDsKKy8vICBMYXRlc3Q6CisJaWYob2ZkbV9wb3dlcl9sZXZlbCA+IChtYXhfb2ZkbV9wb3dlcl9sZXZlbCAtIG1pbl9vZmRtX3Bvd2VyX2xldmVsKSkKKwkJb2ZkbV9wb3dlcl9sZXZlbCA9IG1heF9vZmRtX3Bvd2VyX2xldmVsOworCWVsc2UKKwkJb2ZkbV9wb3dlcl9sZXZlbCArPSBtaW5fb2ZkbV9wb3dlcl9sZXZlbDsKKwlpZihvZmRtX3Bvd2VyX2xldmVsID4gMzUpCisJCW9mZG1fcG93ZXJfbGV2ZWwgPSAzNTsKKy8vCisKKwlHYWluSWR4PW9mZG1fcG93ZXJfbGV2ZWwgJSA2OworCUdhaW5TZXR0aW5nPW9mZG1fcG93ZXJfbGV2ZWwgLyA2OworI2lmIDEKKy8vCWlmKHByaXYtPmNhcmRfdHlwZSA9PSBVU0IpeworCQlydGw4MTg1X3NldF9hbmFwYXJhbTIoZGV2LFJUTDgyMjVfQU5BUEFSQU0yX09OKTsKKworCQl3cml0ZV9waHlfb2ZkbShkZXYsMiwweDQyKTsKKwkJd3JpdGVfcGh5X29mZG0oZGV2LDYsMCk7CisJCXdyaXRlX3BoeV9vZmRtKGRldiw4LDApOworLy8JfQorI2VuZGlmCisvLwlpZihwcml2LT5jYXJkXzgxODUgPT0gMSAmJiBwcml2LT5jYXJkXzgxODVfQnZlcnNpb24peworLy8JCS8qVmVyIEIqLworLy8JCXdyaXRlX25pY19ieXRlKGRldiwgVFhfR0FJTl9PRkRNLCBydGw4MjI1X3R4X2dhaW5fY2NrX29mZG1bR2FpblNldHRpbmddKTsKKy8vCX1lbHNleworCQkvKlZlciBDIC0gRCAqLworCXdyaXRlX25pY19ieXRlKGRldiwgVFhfR0FJTl9PRkRNLCBydGw4MjI1X3R4X2dhaW5fY2NrX29mZG1bR2FpblNldHRpbmddPj4xKTsKKy8vCX0KKworCisJcG93ZXIgPSBydGw4MjI1X3R4X3Bvd2VyX29mZG1bR2FpbklkeF07CisKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4NSwgcG93ZXIpOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHg3LCBwb3dlcik7CisKKwlmb3JjZV9wY2lfcG9zdGluZyhkZXYpOworCW1kZWxheSgxKTsKKwkvL3dyaXRlX25pY19ieXRlKGRldiwgVFhfQUdDX0NPTlRST0wsNCk7Cit9CisjaWYgMAorLyogc3dpdGNoIGJldHdlZW4gbW9kZSBCIGFuZCBHICovCit2b2lkIHJ0bDgyMjVfc2V0X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc2hvcnQgbW9kZWIpCit7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDE1LCAobW9kZWIgPyAweDAgOiAweDQwKSk7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDE3LCAobW9kZWIgPyAweDAgOiAweDQwKSk7Cit9CisjZW5kaWYKK3ZvaWQgcnRsODIyNV9yZl9zZXRfY2hhbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzaG9ydCBjaCkKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJc2hvcnQgZ3NldCA9IChwcml2LT5pZWVlODAyMTEtPnN0YXRlID09IElFRUU4MDIxMV9MSU5LRUQgJiYKKwkJaWVlZTgwMjExX2lzXzU0Zyhwcml2LT5pZWVlODAyMTEtPmN1cnJlbnRfbmV0d29yaykpIHx8CisJCXByaXYtPmllZWU4MDIxMS0+aXdfbW9kZSA9PSBJV19NT0RFX01PTklUT1I7CisKKwlydGw4MjI1X1NldFRYUG93ZXJMZXZlbChkZXYsIGNoKTsKKworCXdyaXRlX3J0bDgyMjUoZGV2LCAweDcsIHJ0bDgyMjVfY2hhbltjaF0pOworCisJZm9yY2VfcGNpX3Bvc3RpbmcoZGV2KTsKKwltZGVsYXkoMTApOworCisJLy8gQSBtb2RlIHNpZnMgMHg0NCwgZGlmcyAzNC0xNCwgc2xvdCA5LCBlaWZzIDIzLCBjd20gMywgY3dNIDcsIGN0c3Rvc2VsZiAweDEwCisJaWYoZ3NldCl7CisJCXdyaXRlX25pY19ieXRlKGRldixTSUZTLDB4MjIpOy8vIFNJRlM6IDB4MjIKKwkJd3JpdGVfbmljX2J5dGUoZGV2LERJRlMsMHgxNCk7IC8vRElGUzogMjAKKwkJLy93cml0ZV9uaWNfYnl0ZShkZXYsRElGUywyMCk7IC8vRElGUzogMjAKKwl9ZWxzZXsKKwkJd3JpdGVfbmljX2J5dGUoZGV2LFNJRlMsMHg0NCk7Ly8gU0lGUzogMHgyMgorCQl3cml0ZV9uaWNfYnl0ZShkZXYsRElGUyw1MCAtIDE0KTsgLy9ESUZTOiAzNgorCX0KKwlpZihwcml2LT5pZWVlODAyMTEtPnN0YXRlID09IElFRUU4MDIxMV9MSU5LRUQgJiYKKwkJaWVlZTgwMjExX2lzX3Nob3J0c2xvdChwcml2LT5pZWVlODAyMTEtPmN1cnJlbnRfbmV0d29yaykpCisJCXdyaXRlX25pY19ieXRlKGRldixTTE9ULDB4OSk7IC8vU0xPVDogOQorCisJZWxzZQorCQl3cml0ZV9uaWNfYnl0ZShkZXYsU0xPVCwweDE0KTsgLy9TTE9UOiAyMCAoMHgxNCkKKworCisJaWYoZ3NldCl7CisJCXdyaXRlX25pY19ieXRlKGRldixFSUZTLDgxKTsvLzkxIC0gMjApOyAvLyBFSUZTOiA5MSAoMHg1QikKKwkJd3JpdGVfbmljX2J5dGUoZGV2LENXX1ZBTCwweDczKTsgLy9DVyBWQUxVRTogMHgzNworCQkvL0RNRVNHKCJ1c2luZyBHIG5ldCBwYXJhbXMiKTsKKwl9ZWxzZXsKKwkJd3JpdGVfbmljX2J5dGUoZGV2LEVJRlMsODEpOyAvLyBFSUZTOiA5MSAoMHg1QikKKwkJd3JpdGVfbmljX2J5dGUoZGV2LENXX1ZBTCwweGE1KTsgLy9DVyBWQUxVRTogMHgzNworCQkvL0RNRVNHKCJ1c2luZyBCIG5ldCBwYXJhbXMiKTsKKwl9CisKKworfQorCit2b2lkIHJ0bDgyMjVfaG9zdF9wY2lfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCAweDQ4MCk7CisKKwlydGw4MTg1X3JmX3BpbnNfZW5hYmxlKGRldik7CisKKwkvL2lmKHByaXYtPmNhcmRfODE4NSA9PSAyICYmIHByaXYtPmVuYWJsZV9ncGlvMCApIC8qIHZlcnNpb24gRCAqLworCS8vd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNTZWxlY3QsIDB4ODgpOworCS8vZWxzZQorCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zU2VsZWN0LCAweDg4IHwgU1dfQ09OVFJPTF9HUElPKTsgLyogMHg0ODggfCBTV19DT05UUk9MX0dQSU8gKi8KKworCXdyaXRlX25pY19ieXRlKGRldiwgR1BfRU5BQkxFLCAwKTsKKworCWZvcmNlX3BjaV9wb3N0aW5nKGRldik7CisJbWRlbGF5KDIwMCk7CisKKwl3cml0ZV9uaWNfd29yZChkZXYsIEdQX0VOQUJMRSwgMHhmZiAmICh+KDE8PDYpKSk7IC8qIGJpdCA2IGlzIGZvciBSRiBvbi9vZmYgZGV0ZWN0aW9uICovCisKKworfQorCit2b2lkIHJ0bDgyMjVfaG9zdF91c2JfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCSNpZiAwCisJd3JpdGVfbmljX2J5dGUoZGV2LFJGUGluc1NlbGVjdCsxLDApOworCisJd3JpdGVfbmljX2J5dGUoZGV2LEdQSU8sMCk7CisKKwl3cml0ZV9uaWNfYnl0ZV9FKGRldiwweDUzLHJlYWRfbmljX2J5dGVfRShkZXYsMHg1MykgfCAoMTw8NykpOworCisJd3JpdGVfbmljX2J5dGUoZGV2LFJGUGluc1NlbGVjdCsxLDQpOworCisJd3JpdGVfbmljX2J5dGUoZGV2LEdQSU8sMHgyMCk7CisKKwl3cml0ZV9uaWNfYnl0ZShkZXYsR1BfRU5BQkxFLDApOworCisKKwkvKiBDb25maWcgQkIgJiBSRiAqLworCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCAweDgwKTsKKworCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zU2VsZWN0LCAweDgwKTsKKworCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zRW5hYmxlLCAweDgwKTsKKworCisJbWRlbGF5KDEwMCk7CisKKwltZGVsYXkoMTAwMCk7CisjZW5kaWYKKworfQorCit2b2lkIHJ0bDgyMjVfcmZfc2xlZXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl3cml0ZV9ydGw4MjI1KGRldiwweDQsMHhkZmYpOworCWZvcmNlX3BjaV9wb3N0aW5nKGRldik7CisJbWRlbGF5KDEpOworCXJ0bDgxODBfc2V0X2FuYXBhcmFtKGRldiwgUlRMODIyNV9BTkFQQVJBTV9TTEVFUCk7CisJcnRsODE4NV9zZXRfYW5hcGFyYW0yKGRldiwgUlRMODIyNV9BTkFQQVJBTTJfU0xFRVApOworCWZvcmNlX3BjaV9wb3N0aW5nKGRldik7Cit9CisKK3ZvaWQgcnRsODIyNV9yZl93YWtldXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl3cml0ZV9ydGw4MjI1KGRldiwweDQsMHg5ZmYpOworCXJ0bDgxODBfc2V0X2FuYXBhcmFtKGRldiwgUlRMODIyNV9BTkFQQVJBTV9PTik7CisJcnRsODE4NV9zZXRfYW5hcGFyYW0yKGRldiwgUlRMODIyNV9BTkFQQVJBTTJfT04pOworCWZvcmNlX3BjaV9wb3N0aW5nKGRldik7Cit9CisKK3ZvaWQgcnRsODIyNV9yZl9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCWludCBpOworCXNob3J0IGNoYW5uZWwgPSAxOworCXUxNiBicnNyOworCisJcHJpdi0+Y2hhbiA9IGNoYW5uZWw7CisKKwlydGw4MTgwX3NldF9hbmFwYXJhbShkZXYsIFJUTDgyMjVfQU5BUEFSQU1fT04pOworCisKKwlpZihwcml2LT5jYXJkX3R5cGUgPT0gVVNCKQorCQlydGw4MjI1X2hvc3RfdXNiX2luaXQoZGV2KTsKKwllbHNlCisJCXJ0bDgyMjVfaG9zdF9wY2lfaW5pdChkZXYpOworCisJd3JpdGVfbmljX2R3b3JkKGRldiwgUkZfVElNSU5HLCAweDAwMGE4MDA4KTsKKworCWJyc3IgPSByZWFkX25pY193b3JkKGRldiwgQlJTUik7CisKKwl3cml0ZV9uaWNfd29yZChkZXYsIEJSU1IsIDB4ZmZmZik7CisKKwkjaWYgMAorCWlmKHByaXYtPmNhcmRfODE4NSA9PSAxKXsvKiB2ZXJzaW9uIEMgb3IgQiAqLworCQlpZihwcml2LT5jYXJkXzgxODVfQnZlcnNpb24pICAvKiB2ZXJzaW9uIEIqLworCQkJd3JpdGVfbmljX2R3b3JkKGRldiwgUkZfUEFSQSwgMHg0NCk7CisJCWVsc2UgICAgLyogdmVyc2lvbiBDICovCisJCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBSRl9QQVJBLCAweDEwMDA0NCk7CisJfWVsc2V7IC8qIHZlcnNpb24gRCAqLworCQlpZihwcml2LT5lbmFibGVfZ3BpbzApCisJCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBSRl9QQVJBLCAweDIwMTAwMDQ0KTsKKwkJZWxzZSAvKiBhbHNvIFVTQiAqLworCQkJd3JpdGVfbmljX2R3b3JkKGRldiwgUkZfUEFSQSwgMHgxMDAwNDQpOworCX0KKwkjZW5kaWYKKworCXdyaXRlX25pY19kd29yZChkZXYsIFJGX1BBUkEsIDB4MTAwMDQ0KTsKKworCSNpZiAxICAvLzAtPjEKKwlydGw4MTgwX3NldF9tb2RlKGRldiwgRVBST01fQ01EX0NPTkZJRyk7CisJd3JpdGVfbmljX2J5dGUoZGV2LCBDT05GSUczLCAweDQ0KTsKKwlydGw4MTgwX3NldF9tb2RlKGRldiwgRVBST01fQ01EX05PUk1BTCk7CisJI2VuZGlmCisKKwlpZihwcml2LT5jYXJkX3R5cGUgPT0gVVNCKXsKKwkJcnRsODE4NV9yZl9waW5zX2VuYWJsZShkZXYpOworCisJCW1kZWxheSgxMDAwKTsKKwl9CisKKwl3cml0ZV9ydGw4MjI1KGRldiwgMHgwLCAweDY3KTsgbWRlbGF5KDEpOworCisKKwl3cml0ZV9ydGw4MjI1KGRldiwgMHgxLCAweGZlMCk7IG1kZWxheSgxKTsKKworCXdyaXRlX3J0bDgyMjUoZGV2LCAweDIsIDB4NDRkKTsgbWRlbGF5KDEpOworCisJd3JpdGVfcnRsODIyNShkZXYsIDB4MywgMHg0NDEpOyBtZGVsYXkoMSk7CisKKwlpZihwcml2LT5jYXJkX3R5cGUgPT0gVVNCKQorCQl3cml0ZV9ydGw4MjI1KGRldiwgMHg0LCAweDQ4Nik7CisJZWxzZQorCQl3cml0ZV9ydGw4MjI1KGRldiwgMHg0LCAweDhiZSk7CisKKwltZGVsYXkoMSk7CisKKworCSNpZiAwCisJfWVsc2UgaWYocHJpdi0+cGh5X3ZlciA9PSAxKXsKKwkJLyogdmVyc2lvbiBBICovCisJCXdyaXRlX3J0bDgyMjUoZGV2LCAweDUsIDB4YmMwICsgMik7CisJfWVsc2V7CisJI2VuZGlmCisJLyogdmVyc2lvbiBCICYgQyAqLworCisJaWYocHJpdi0+Y2FyZF90eXBlID09IFVTQikKKwkJd3JpdGVfcnRsODIyNShkZXYsIDB4NSwgMHhiYzApOworCWVsc2UgaWYocHJpdi0+Y2FyZF90eXBlID09IE1JTklQQ0kpCisJCXdyaXRlX3J0bDgyMjUoZGV2LCAweDUsIDB4YmMwICsgMyArKDY8PDMpKTsKKwllbHNlCisJCXdyaXRlX3J0bDgyMjUoZGV2LCAweDUsIDB4YmMwICsgKDY8PDMpKTsKKworCSBtZGVsYXkoMSk7CisvLwl9CisKKwl3cml0ZV9ydGw4MjI1KGRldiwgMHg2LCAweGFlNik7ICBtZGVsYXkoMSk7CisKKwl3cml0ZV9ydGw4MjI1KGRldiwgMHg3LCAoKHByaXYtPmNhcmRfdHlwZSA9PSBVU0IpPyAweDgyYSA6IHJ0bDgyMjVfY2hhbltjaGFubmVsXSkpOyAgbWRlbGF5KDEpOworCisJd3JpdGVfcnRsODIyNShkZXYsIDB4OCwgMHgxZik7ICBtZGVsYXkoMSk7CisKKwl3cml0ZV9ydGw4MjI1KGRldiwgMHg5LCAweDMzNCk7ICBtZGVsYXkoMSk7CisKKwl3cml0ZV9ydGw4MjI1KGRldiwgMHhhLCAweGZkNCk7ICBtZGVsYXkoMSk7CisKKwl3cml0ZV9ydGw4MjI1KGRldiwgMHhiLCAweDM5MSk7ICBtZGVsYXkoMSk7CisKKwl3cml0ZV9ydGw4MjI1KGRldiwgMHhjLCAweDUwKTsgIG1kZWxheSgxKTsKKworCisJd3JpdGVfcnRsODIyNShkZXYsIDB4ZCwgMHg2ZGIpOyAgIG1kZWxheSgxKTsKKworCXdyaXRlX3J0bDgyMjUoZGV2LCAweGUsIDB4MjkpOyAgbWRlbGF5KDEpOworCisJd3JpdGVfcnRsODIyNShkZXYsIDB4ZiwgMHg5MTQpOworCisJaWYocHJpdi0+Y2FyZF90eXBlID09IFVTQil7CisJCS8vZm9yY2VfcGNpX3Bvc3RpbmcoZGV2KTsKKwkJbWRlbGF5KDEwMCk7CisJfQorCisJd3JpdGVfcnRsODIyNShkZXYsIDB4MiwgMHhjNGQpOworCisJaWYocHJpdi0+Y2FyZF90eXBlID09IFVTQil7CisJLy8JZm9yY2VfcGNpX3Bvc3RpbmcoZGV2KTsKKwkJbWRlbGF5KDIwMCk7CisKKwkJd3JpdGVfcnRsODIyNShkZXYsIDB4MiwgMHg0NGQpOworCisJLy8JZm9yY2VfcGNpX3Bvc3RpbmcoZGV2KTsKKwkJbWRlbGF5KDEwMCk7CisKKwl9Ly9FbmQgb2YgaWYocHJpdi0+Y2FyZF90eXBlID09IFVTQikKKwkvKiBGSVhNRSEhIHJ0bDgxODcgd2UgaGF2ZSB0byBjaGVjayBpZiBjYWxpYnJhcmlvbgorCSAqIGlzIHN1Y2Nlc3NmdWwgYW5kIGV2ZW50dWFsbHkgY2FsLiBhZ2FpbiAocmVwZWF0CisJICogdGhlIHR3byB3cml0ZSBvbiByZWcgMikKKwkqLworCWZvcmNlX3BjaV9wb3N0aW5nKGRldik7CisKKwltZGVsYXkoMTAwKTsgLy8yMDAgZm9yIDgxODcKKworCS8vaWYocHJpdi0+Y2FyZF90eXBlICE9IFVTQikgLyogbWF5YmUgbm90IG5lZWRlZCBldmVuIGZvciA4MTg1ICovCisvLwl3cml0ZV9ydGw4MjI1KGRldiwgMHg3LCBydGw4MjI1X2NoYW5bY2hhbm5lbF0pOworCisJd3JpdGVfcnRsODIyNShkZXYsIDB4MCwgMHgxMjcpOworCisJZm9yKGk9MDtpPDk1O2krKyl7CisJCXdyaXRlX3J0bDgyMjUoZGV2LCAweDEsICh1OCkoaSsxKSk7CisKKwkJI2lmIDAKKwkJaWYocHJpdi0+cGh5X3ZlciA9PSAxKQorCQkJLyogdmVyc2lvbiBBICovCisJCQl3cml0ZV9ydGw4MjI1KGRldiwgMHgyLCBydGw4MjI1YV9yeGdhaW5baV0pOworCQllbHNlCisJCSNlbmRpZgorCQkvKiB2ZXJzaW9uIEIgJiBDICYgRCovCisKKwkJd3JpdGVfcnRsODIyNShkZXYsIDB4MiwgcnRsODIyNWJjZF9yeGdhaW5baV0pOworCX0KKworCXdyaXRlX3J0bDgyMjUoZGV2LCAweDAsIDB4MjcpOworCisKKy8vCS8vaWYocHJpdi0+Y2FyZF90eXBlICE9IFVTQil7CisvLwkJd3JpdGVfcnRsODIyNShkZXYsIDB4MiwgMHg0NGQpOworLy8JCXdyaXRlX3J0bDgyMjUoZGV2LCAweDcsIHJ0bDgyMjVfY2hhbltjaGFubmVsXSk7CisvLwkJd3JpdGVfcnRsODIyNShkZXYsIDB4MiwgMHg0N2QpOworLy8KKy8vCQlmb3JjZV9wY2lfcG9zdGluZyhkZXYpOworLy8JCW1kZWxheSgxMDApOworLy8KKy8vCQl3cml0ZV9ydGw4MjI1KGRldiwgMHgyLCAweDQ0ZCk7CisvLwkvL30KKworCXdyaXRlX3J0bDgyMjUoZGV2LCAweDAsIDB4MjJmKTsKKworCWlmKHByaXYtPmNhcmRfdHlwZSAhPSBVU0IpCisJCXJ0bDgxODVfcmZfcGluc19lbmFibGUoZGV2KTsKKworCWZvcihpPTA7aTwxMjg7aSsrKXsKKwkJd3JpdGVfcGh5X29mZG0oZGV2LCAweGIsIHJ0bDgyMjVfYWdjW2ldKTsKKworCQltZGVsYXkoMSk7CisJCXdyaXRlX3BoeV9vZmRtKGRldiwgMHhhLCAodTgpaSsgMHg4MCk7CisKKwkJbWRlbGF5KDEpOworCX0KKworCWZvcmNlX3BjaV9wb3N0aW5nKGRldik7CisJbWRlbGF5KDEpOworCisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDAsIDB4MSk7IG1kZWxheSgxKTsKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MSwgMHgyKTsgbWRlbGF5KDEpOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgyLCAoKHByaXYtPmNhcmRfdHlwZSA9PSBVU0IpPyAweDQyIDogMHg2MikpOyBtZGVsYXkoMSk7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDMsIDB4MCk7IG1kZWxheSgxKTsKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4NCwgMHgwKTsgbWRlbGF5KDEpOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHg1LCAweDApOyBtZGVsYXkoMSk7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDYsIDB4NDApOyBtZGVsYXkoMSk7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDcsIDB4MCk7IG1kZWxheSgxKTsKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4OCwgMHg0MCk7IG1kZWxheSgxKTsKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4OSwgMHhmZSk7IG1kZWxheSgxKTsKKworCSNpZiAwCisJaWYocHJpdi0+Y2FyZF90eXBlID09IFVTQil7CisJCXdyaXRlX3BoeV9vZmRtKGRldiwgMHhhLCAweDkpOworCX1lbHNleworCQlpZihwcml2LT5jYXJkXzgxODUgPT0gMSAmJiBwcml2LT5jYXJkXzgxODVfQnZlcnNpb24peworCQkJLyogVmVyIEIKKwkJCSogbWF5YmUgbGF0ZXIgdmVyc2lvbiBjYW4gYWNjZXB0IHRoaXMgYWxzbz8KKwkJCSovCisJCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4YSwgMHg2KTsKKwkJCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxOCwgMHg2Zik7CisJCX1lbHNleworCSNlbmRpZgorCQkJLyogdmVyIEMgJiBEICovCisJd3JpdGVfcGh5X29mZG0oZGV2LCAweGEsIDB4OSk7IG1kZWxheSgxKTsKKworCS8vd3JpdGVfcGh5X29mZG0oZGV2LCAweDE4LCAweGVmKTsKKwkvLwl9CisJLy99CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweGIsIDB4ODApOyBtZGVsYXkoMSk7CisKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4YywgMHgxKTttZGVsYXkoMSk7CisKKworCS8vaWYocHJpdi0+Y2FyZF90eXBlICE9IFVTQikKKwkvL3dyaXRlX3BoeV9vZmRtKGRldiwgMHhkLCAweDMzKTsgLy8gPD4KKworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHhlLCAweGQzKTttZGVsYXkoMSk7CisKKworCSNpZiAwCisJaWYocHJpdi0+Y2FyZF84MTg1ID09IDEpeworCQlpZihwcml2LT5jYXJkXzgxODVfQnZlcnNpb24pCisJCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4ZiwgMHgyMCk7Lyp2ZXIgQiovCisJCWVsc2UKKwkJCXdyaXRlX3BoeV9vZmRtKGRldiwgMHhmLCAweDI4KTsvKnZlciBDKi8KKwl9ZWxzZXsKKwkjZW5kaWYKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4ZiwgMHgzOCk7bWRlbGF5KDEpOworLyp2ZXIgRCAmIDgxODcqLworLy8JfQorCisvLwlpZihwcml2LT5jYXJkXzgxODUgPT0gMSAmJiBwcml2LT5jYXJkXzgxODVfQnZlcnNpb24pCisvLwkJd3JpdGVfcGh5X29mZG0oZGV2LCAweDEwLCAweDA0KTsvKnZlciBCKi8KKy8vCWVsc2UKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MTAsIDB4ODQpO21kZWxheSgxKTsKKy8qdmVyIEMgJiBEICYgODE4NyovCisKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MTEsIDB4MDYpO21kZWxheSgxKTsKKy8qYWdjIHJlc3AgdGltZSA3MDAqLworCisKKy8vCWlmKHByaXYtPmNhcmRfODE4NSA9PSAyKXsKKwkvKiBWZXIgRCAmIDgxODcqLworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxMiwgMHgyMCk7bWRlbGF5KDEpOworCisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDEzLCAweDIwKTttZGVsYXkoMSk7CisKKyNpZiAwCisJfWVsc2V7CisJCS8qIFZlciBCICYgQyovCisJCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxMiwgMHgwKTsKKwkJd3JpdGVfcGh5X29mZG0oZGV2LCAweDEzLCAweDApOworCX0KKyNlbmRpZgorCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxNCwgMHgwKTsgbWRlbGF5KDEpOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxNSwgMHg0MCk7IG1kZWxheSgxKTsKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MTYsIDB4MCk7IG1kZWxheSgxKTsKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MTcsIDB4NDApOyBtZGVsYXkoMSk7CisKKy8vCWlmIChwcml2LT5jYXJkX3R5cGUgPT0gVVNCKQorLy8JCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxOCwgMHhlZik7CisKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MTgsIDB4ZWYpO21kZWxheSgxKTsKKworCisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDE5LCAweDE5KTsgbWRlbGF5KDEpOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxYSwgMHgyMCk7IG1kZWxheSgxKTsKKworLy8JaWYgKHByaXYtPmNhcmRfdHlwZSAhPSBVU0IpeworLy8JCWlmKHByaXYtPmNhcmRfODE4NSA9PSAxICYmIHByaXYtPmNhcmRfODE4NV9CdmVyc2lvbikKKy8vCQkJd3JpdGVfcGh5X29mZG0oZGV2LCAweDFiLCAweDY2KTsgLyogVmVyIEIgKi8KKy8vCQllbHNlCisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDFiLCAweDc2KTttZGVsYXkoMSk7CisgLyogVmVyIEMgJiBEICovIC8vRklYTUU6TUFZQkUgbm90IG5lZWRlZAorLy8JfQorCisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDFjLCAweDQpO21kZWxheSgxKTsKKworI2lmIDAKKwlpZihwcml2LT5jYXJkXzgxODUgPT0gMSl7CisJCWlmKHByaXYtPmNhcmRfODE4NV9CdmVyc2lvbil7CisJCQkvKnZlciBCKi8KKwkJCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxZSwgMHg5NSk7CisJCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MWYsIDB4NTUpOworCQl9ZWxzZXsKKwkJCS8qdmVyIEMqLworCQkJd3JpdGVfcGh5X29mZG0oZGV2LCAweDFlLCAweDkwKTsKKwkJCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxZiwgMHgzNCk7CisKKwkJfQorCX1lbHNleworI2VuZGlmCisJCS8qdmVyIEQgJiA4MTg3Ki8KKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MWUsIDB4OTUpO21kZWxheSgxKTsKKworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxZiwgMHg3NSk7CW1kZWxheSgxKTsKKworLy8JfQorCisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDIwLCAweDFmKTttZGVsYXkoMSk7CisKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MjEsIDB4MjcpO21kZWxheSgxKTsKKworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgyMiwgMHgxNik7bWRlbGF5KDEpOworCisvLwlpZihwcml2LT5jYXJkX3R5cGUgIT0gVVNCKQorCS8vd3JpdGVfcGh5X29mZG0oZGV2LCAweDIzLCAweDQzKTsgLy9GSVhNRSBtYXliZSBub3QgbmVlZGVkIC8vIDw+CisKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MjQsIDB4NDYpOyBtZGVsYXkoMSk7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDI1LCAweDIwKTsgbWRlbGF5KDEpOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgyNiwgMHg5MCk7IG1kZWxheSgxKTsKKyNpZiAwCisJaWYocHJpdi0+Y2FyZF84MTg1ID09IDEgJiYgcHJpdi0+Y2FyZF84MTg1X0J2ZXJzaW9uKQorCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MjcsIDB4MDgpOyAvKiBWZXIgQi4gbWlnaHQgd29yayBhbHNvIGZvIHZlciBDJkQgPyovCisJZWxzZQorI2VuZGlmCisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDI3LCAweDg4KTsgbWRlbGF5KDEpOworLyogVmVyIEMgJiBEICYgODE4NyovCisKKwkvLyA8PiBTZXQgaW5pdC4gZ2FpbiB0byBtNzRkQm0uCisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDBkLCAweDQzKTsJIG1kZWxheSgxKTsKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MWIsIDB4NzYpOwkgbWRlbGF5KDEpOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxZCwgMHhjNSk7CSBtZGVsYXkoMSk7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDIzLCAweDc4KTsJIG1kZWxheSgxKTsKKworCS8vaWYocHJpdi0+Y2FyZF90eXBlID09IFVTQik7CisJLy8JcnRsODIyNV9zZXRfZ2Fpbl91c2IoZGV2LCAxKTsgLyogRklYTUUgdGhpcyAnMicgaXMgcmFuZG9tICovCisKKwl3cml0ZV9waHlfY2NrKGRldiwgMHgwLCAweDk4KTsgbWRlbGF5KDEpOworCXdyaXRlX3BoeV9jY2soZGV2LCAweDMsIDB4MjApOyBtZGVsYXkoMSk7CisJd3JpdGVfcGh5X2NjayhkZXYsIDB4NCwgMHg3ZSk7IG1kZWxheSgxKTsKKwl3cml0ZV9waHlfY2NrKGRldiwgMHg1LCAweDEyKTsgbWRlbGF5KDEpOworCXdyaXRlX3BoeV9jY2soZGV2LCAweDYsIDB4ZmMpOyBtZGVsYXkoMSk7CisjaWYgMAorCWlmKHByaXYtPmNhcmRfODE4NSA9PSAxICYmIHByaXYtPmNhcmRfODE4NV9CdmVyc2lvbikKKwkJd3JpdGVfcGh5X2NjayhkZXYsIDB4NywgMHhkOCk7IC8qIFZlciBCICovCisJZWxzZQorI2VuZGlmCisJd3JpdGVfcGh5X2NjayhkZXYsIDB4NywgMHg3OCk7bWRlbGF5KDEpOworIC8qIFZlciBDICYgRCAmIDgxODcqLworCisJd3JpdGVfcGh5X2NjayhkZXYsIDB4OCwgMHgyZSk7bWRlbGF5KDEpOworCisJd3JpdGVfcGh5X2NjayhkZXYsIDB4MTAsICgocHJpdi0+Y2FyZF90eXBlID09IFVTQikgPyAweDliOiAweDkzKSk7IG1kZWxheSgxKTsKKwl3cml0ZV9waHlfY2NrKGRldiwgMHgxMSwgMHg4OCk7IG1kZWxheSgxKTsKKwl3cml0ZV9waHlfY2NrKGRldiwgMHgxMiwgMHg0Nyk7IG1kZWxheSgxKTsKKyNpZiAwCisJaWYocHJpdi0+Y2FyZF84MTg1ID09IDEgJiYgcHJpdi0+Y2FyZF84MTg1X0J2ZXJzaW9uKQorCQl3cml0ZV9waHlfY2NrKGRldiwgMHgxMywgMHg5OCk7IC8qIFZlciBCICovCisJZWxzZQorI2VuZGlmCisJd3JpdGVfcGh5X2NjayhkZXYsIDB4MTMsIDB4ZDApOyAvKiBWZXIgQyAmIEQgJiA4MTg3Ki8KKworCXdyaXRlX3BoeV9jY2soZGV2LCAweDE5LCAweDApOworCXdyaXRlX3BoeV9jY2soZGV2LCAweDFhLCAweGEwKTsKKwl3cml0ZV9waHlfY2NrKGRldiwgMHgxYiwgMHg4KTsKKwl3cml0ZV9waHlfY2NrKGRldiwgMHg0MCwgMHg4Nik7IC8qIENDSyBDYXJyaWVyIFNlbnNlIFRocmVzaG9sZCAqLworCisJd3JpdGVfcGh5X2NjayhkZXYsIDB4NDEsIDB4OGQpO21kZWxheSgxKTsKKworCisJd3JpdGVfcGh5X2NjayhkZXYsIDB4NDIsIDB4MTUpOyBtZGVsYXkoMSk7CisJd3JpdGVfcGh5X2NjayhkZXYsIDB4NDMsIDB4MTgpOyBtZGVsYXkoMSk7CisJd3JpdGVfcGh5X2NjayhkZXYsIDB4NDQsIDB4MWYpOyBtZGVsYXkoMSk7CisJd3JpdGVfcGh5X2NjayhkZXYsIDB4NDUsIDB4MWUpOyBtZGVsYXkoMSk7CisJd3JpdGVfcGh5X2NjayhkZXYsIDB4NDYsIDB4MWEpOyBtZGVsYXkoMSk7CisJd3JpdGVfcGh5X2NjayhkZXYsIDB4NDcsIDB4MTUpOyBtZGVsYXkoMSk7CisJd3JpdGVfcGh5X2NjayhkZXYsIDB4NDgsIDB4MTApOyBtZGVsYXkoMSk7CisJd3JpdGVfcGh5X2NjayhkZXYsIDB4NDksIDB4YSk7IG1kZWxheSgxKTsKKwl3cml0ZV9waHlfY2NrKGRldiwgMHg0YSwgMHg1KTsgbWRlbGF5KDEpOworCXdyaXRlX3BoeV9jY2soZGV2LCAweDRiLCAweDIpOyBtZGVsYXkoMSk7CisJd3JpdGVfcGh5X2NjayhkZXYsIDB4NGMsIDB4NSk7bWRlbGF5KDEpOworCisKKwl3cml0ZV9uaWNfYnl0ZShkZXYsIDB4NWIsIDB4MGQpOyBtZGVsYXkoMSk7CisKKworCisvLyA8PgorLy8JLy8gVEVTVFIgMHhiIDgxODcKKy8vCXdyaXRlX3BoeV9jY2soZGV2LCAweDEwLCAweDkzKTsvLyAmIDB4ZmIpOworLy8KKy8vCS8vaWYocHJpdi0+Y2FyZF90eXBlICE9IFVTQil7CisvLwkJd3JpdGVfcGh5X29mZG0oZGV2LCAweDIsIDB4NjIpOworLy8JCXdyaXRlX3BoeV9vZmRtKGRldiwgMHg2LCAweDApOworLy8JCXdyaXRlX3BoeV9vZmRtKGRldiwgMHg4LCAweDApOworLy8JLy99CisKKwlydGw4MjI1X1NldFRYUG93ZXJMZXZlbChkZXYsIGNoYW5uZWwpOworCisJd3JpdGVfcGh5X2NjayhkZXYsIDB4MTAsIDB4OWIpOyBtZGVsYXkoMSk7IC8qIFJ4IGFudCBBLCAweGRiIGZvciBCICovCisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDI2LCAweDkwKTsgbWRlbGF5KDEpOyAvKiBSeCBhbnQgQSwgMHgxMCBmb3IgQiAqLworCisJcnRsODE4NV90eF9hbnRlbm5hKGRldiwgMHgzKTsgLyogVFggYW50IEEsIDB4MCBmb3IgQiAqLworCisJLyogc3dpdGNoIHRvIGhpZ2gtc3BlZWQgMy13aXJlCisJICogbGFzdCBkaWdpdC4gMiBmb3IgYm90aCBjY2sgYW5kIG9mZG0KKwkgKi8KKwlpZihwcml2LT5jYXJkX3R5cGUgPT0gVVNCKQorCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCAweDk0LCAweDNkYzAwMDAyKTsKKwllbHNleworCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCAweDk0LCAweDE1YzAwMDAyKTsKKwkJcnRsODE4NV9yZl9waW5zX2VuYWJsZShkZXYpOworCX0KKworLy8JaWYocHJpdi0+Y2FyZF90eXBlICE9IFVTQikKKy8vCXJ0bDgyMjVfc2V0X2dhaW4oZGV2LCA0KTsgLyogRklYTUUgdGhpcyAnMScgaXMgcmFuZG9tICovIC8vIDw+CisvLwkgcnRsODIyNV9zZXRfbW9kZShkZXYsIDEpOyAvKiBGSVhNRSBzdGFydCBpbiBCIG1vZGUgKi8gLy8gPD4KKy8vCisvLwkvKiBtYWtlIHN1cmUgaXMgd2FrZW4gdXAhICovCisvLwl3cml0ZV9ydGw4MjI1KGRldiwweDQsIDB4OWZmKTsKKy8vCXJ0bDgxODBfc2V0X2FuYXBhcmFtKGRldiwgUlRMODIyNV9BTkFQQVJBTV9PTik7CisvLwlydGw4MTg1X3NldF9hbmFwYXJhbTIoZGV2LCBSVEw4MjI1X0FOQVBBUkFNMl9PTik7CisKKwlydGw4MjI1X3JmX3NldF9jaGFuKGRldiwgcHJpdi0+Y2hhbik7CisKKwl3cml0ZV9uaWNfd29yZChkZXYsQlJTUixicnNyKTsKKworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MF9ydGw4MjI1LmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwX3J0bDgyMjUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NThkZTY2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MF9ydGw4MjI1LmgKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAgVGhpcyBpcyBwYXJ0IG9mIHRoZSBydGw4MTgwLXNhMjQwMCBkcml2ZXIKKyAgcmVsZWFzZWQgdW5kZXIgdGhlIEdQTCAoU2VlIGZpbGUgQ09QWUlORyBmb3IgZGV0YWlscykuCisgIENvcHlyaWdodCAoYykgMjAwNSBBbmRyZWEgTWVyZWxsbyA8YW5kcmVhbXJsQHRpc2NhbGkuaXQ+CisKKyAgVGhpcyBmaWxlcyBjb250YWlucyBwcm9ncmFtbWluZyBjb2RlIGZvciB0aGUgcnRsODIyNQorICByYWRpbyBmcm9udGVuZC4KKworICAqTWFueSogdGhhbmtzIHRvIFJlYWx0ZWsgQ29ycC4gZm9yIHRoZWlyIGdyZWF0IHN1cHBvcnQhCisKKyovCisKKyNpbmNsdWRlICJyODE4MC5oIgorCisjZGVmaW5lIFJUTDgyMjVfQU5BUEFSQU1fT04gIDB4YTAwMDBiNTkKKyNkZWZpbmUgUlRMODIyNV9BTkFQQVJBTV9PRkYgMHhhMDBiZWI1OQorI2RlZmluZSBSVEw4MjI1X0FOQVBBUkFNMl9PRkYgMHg4NDBkZWMxMQorI2RlZmluZSBSVEw4MjI1X0FOQVBBUkFNMl9PTiAgMHg4NjBkZWMxMQorI2RlZmluZSBSVEw4MjI1X0FOQVBBUkFNX1NMRUVQIDB4YTAwYmFiNTkKKyNkZWZpbmUgUlRMODIyNV9BTkFQQVJBTTJfU0xFRVAgMHg4NDBkZWMxMQorCisjaWZkZWYgQ09ORklHX1JUTDgxODVCCit2b2lkIHJ0bDgyMjV6Ml9yZl9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwordm9pZCBydGw4MjI1ejJfcmZfc2V0X2NoYW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldixzaG9ydCBjaCk7Cit2b2lkIHJ0bDgyMjV6Ml9yZl9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKwordm9pZCBydGw4MjI1X2hvc3RfcGNpX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Cit2b2lkIHJ0bDgyMjVfaG9zdF91c2JfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKwordm9pZCB3cml0ZV9ydGw4MjI1KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4IGFkciwgdTE2IGRhdGEpOwordm9pZCBSRl9Xcml0ZVJlZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCBvZmZzZXQsIHUzMglkYXRhKTsKK3UzMiBSRl9SZWFkUmVnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4IG9mZnNldCk7CisjZW5kaWYKK3ZvaWQgcnRsODIyNV9yZl9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwordm9pZCBydGw4MjI1X3JmX3NldF9jaGFuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsc2hvcnQgY2gpOwordm9pZCBydGw4MjI1X3JmX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwordm9pZCBydGw4MjI1X3JmX3NsZWVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwordm9pZCBydGw4MjI1X3JmX3dha2V1cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3ZvaWQgcnRsODE4MF9zZXRfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LGludCBtb2RlKTsKK3ZvaWQgcnRsODE4MF9zZXRfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LGludCBtb2RlKTsKK2Jvb2wgU2V0WmVicmFSRlBvd2VyU3RhdGU4MTg1KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsUlRfUkZfUE9XRVJfU1RBVEUgIGVSRlBvd2VyU3RhdGUpOwordm9pZCBydGw4MjI1ejRfcmZfc2xlZXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Cit2b2lkIHJ0bDgyMjV6NF9yZl93YWtldXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfcnRsODIyNXoyLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwX3J0bDgyMjV6Mi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxMzZiOTQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwX3J0bDgyMjV6Mi5jCkBAIC0wLDAgKzEsMTU4NyBAQAorLyoKKyAgVGhpcyBpcyBwYXJ0IG9mIHRoZSBydGw4MTgwLXNhMjQwMCBkcml2ZXIKKyAgcmVsZWFzZWQgdW5kZXIgdGhlIEdQTCAoU2VlIGZpbGUgQ09QWUlORyBmb3IgZGV0YWlscykuCisgIENvcHlyaWdodCAoYykgMjAwNSBBbmRyZWEgTWVyZWxsbyA8YW5kcmVhbXJsQHRpc2NhbGkuaXQ+CisKKyAgVGhpcyBmaWxlcyBjb250YWlucyBwcm9ncmFtbWluZyBjb2RlIGZvciB0aGUgcnRsODIyNQorICByYWRpbyBmcm9udGVuZC4KKworICAqTWFueSogdGhhbmtzIHRvIFJlYWx0ZWsgQ29ycC4gZm9yIHRoZWlyIGdyZWF0IHN1cHBvcnQhCisKKyovCisKKyNpbmNsdWRlICJyODE4MF9ody5oIgorI2luY2x1ZGUgInI4MTgwX3J0bDgyMjUuaCIKKyNpbmNsdWRlICJyODE4MF85M2N4Ni5oIgorCisjaWZkZWYgRU5BQkxFX0RPVDExRAorI2luY2x1ZGUgImRvdDExZC5oIgorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfUlRMODE4NUIKKworZXh0ZXJuIHU4IHJ0bDgyMjVfYWdjW107CisKK2V4dGVybiB1MzIgcnRsODIyNV9jaGFuW107CisKKy8vMjAwNS4xMS4xNgordTggcnRsODIyNXoyX3RocmVzaG9sZFtdPXsKKyAgICAgICAgMHg4ZCwgMHg4ZCwgMHg4ZCwgMHg4ZCwgMHg5ZCwgMHhhZCwgMHhiZCwKK307CisKKy8vICAgICAgMHhkIDB4MTkgMHgxYiAweDIxCit1OCBydGw4MjI1ejJfZ2Fpbl9iZ1tdPXsKKwkweDIzLCAweDE1LCAweGE1LCAvLyAtODItMWRibQorICAgICAgICAweDIzLCAweDE1LCAweGI1LCAvLyAtODItMmRibQorICAgICAgICAweDIzLCAweDE1LCAweGM1LCAvLyAtODItM2RibQorICAgICAgICAweDMzLCAweDE1LCAweGM1LCAvLyAtNzhkYm0KKyAgICAgICAgMHg0MywgMHgxNSwgMHhjNSwgLy8gLTc0ZGJtCisgICAgICAgIDB4NTMsIDB4MTUsIDB4YzUsIC8vIC03MGRibQorICAgICAgICAweDYzLCAweDE1LCAweGM1LCAvLyAtNjZkYm0KK307CisKK3U4IHJ0bDgyMjV6Ml9nYWluX2FbXT17CisJMHgxMywweDI3LDB4NWEsLy8sMHgzNywvLyAtODJkYm0KKwkweDIzLDB4MjMsMHg1OCwvLywweDM3LC8vIC04MmRibQorCTB4MzMsMHgxZiwweDU2LC8vLDB4MzcsLy8gLTgyZGJtCisJMHg0MywweDFiLDB4NTQsLy8sMHgzNywvLyAtNzhkYm0KKwkweDUzLDB4MTcsMHg1MSwvLywweDM3LC8vIC03NGRibQorCTB4NjMsMHgyNCwweDRmLC8vLDB4MzcsLy8gLTcwZGJtCisJMHg3MywweDBmLDB4NGMsLy8sMHgzNywvLyAtNjZkYm0KK307CisjaWYgMAordTMyIHJ0bDgyMjVfY2hhbltdID0geworCTAsCS8vZHVtbXkgY2hhbm5lbCAwCisJMHgwODVjLCAvLzEKKwkweDA4ZGMsIC8vMgorCTB4MDk1YywgLy8zCisJMHgwOWRjLCAvLzQKKwkweDBhNWMsIC8vNQorCTB4MGFkYywgLy82CisJMHgwYjVjLCAvLzcKKwkweDBiZGMsIC8vOAorCTB4MGM1YywgLy85CisJMHgwY2RjLCAvLzEwCisJMHgwZDVjLCAvLzExCisJMHgwZGRjLCAvLzEyCisJMHgwZTVjLCAvLzEzCisJLy8weDBmNWMsIC8vMTQKKwkweDBmNzIsIC8vIDE0Cit9OworI2VuZGlmCisKKy8vLQordTE2IHJ0bDgyMjV6Ml9yeGdhaW5bXT17CisJMHgwNDAwLCAweDA0MDEsIDB4MDQwMiwgMHgwNDAzLCAweDA0MDQsIDB4MDQwNSwgMHgwNDA4LCAweDA0MDksCisJMHgwNDBhLCAweDA0MGIsIDB4MDUwMiwgMHgwNTAzLCAweDA1MDQsIDB4MDUwNSwgMHgwNTQwLCAweDA1NDEsCisJMHgwNTQyLCAweDA1NDMsIDB4MDU0NCwgMHgwNTQ1LCAweDA1ODAsIDB4MDU4MSwgMHgwNTgyLCAweDA1ODMsCisJMHgwNTg0LCAweDA1ODUsIDB4MDU4OCwgMHgwNTg5LCAweDA1OGEsIDB4MDU4YiwgMHgwNjQzLCAweDA2NDQsCisJMHgwNjQ1LCAweDA2ODAsIDB4MDY4MSwgMHgwNjgyLCAweDA2ODMsIDB4MDY4NCwgMHgwNjg1LCAweDA2ODgsCisJMHgwNjg5LCAweDA2OGEsIDB4MDY4YiwgMHgwNjhjLCAweDA3NDIsIDB4MDc0MywgMHgwNzQ0LCAweDA3NDUsCisJMHgwNzgwLCAweDA3ODEsIDB4MDc4MiwgMHgwNzgzLCAweDA3ODQsIDB4MDc4NSwgMHgwNzg4LCAweDA3ODksCisJMHgwNzhhLCAweDA3OGIsIDB4MDc4YywgMHgwNzhkLCAweDA3OTAsIDB4MDc5MSwgMHgwNzkyLCAweDA3OTMsCisJMHgwNzk0LCAweDA3OTUsIDB4MDc5OCwgMHgwNzk5LCAweDA3OWEsIDB4MDc5YiwgMHgwNzljLCAweDA3OWQsCisJMHgwN2EwLCAweDA3YTEsIDB4MDdhMiwgMHgwN2EzLCAweDA3YTQsIDB4MDdhNSwgMHgwN2E4LCAweDA3YTksCisJMHgwM2FhLCAweDAzYWIsIDB4MDNhYywgMHgwM2FkLCAweDAzYjAsIDB4MDNiMSwgMHgwM2IyLCAweDAzYjMsCisJMHgwM2I0LCAweDAzYjUsIDB4MDNiOCwgMHgwM2I5LCAweDAzYmEsIDB4MDNiYiwgMHgwM2JiCisKK307CisKKy8vMjAwNS4xMS4xNiwKK3U4IFpFQlJBMl9DQ0tfT0ZETV9HQUlOX1NFVFRJTkdbXT17CisgICAgICAgIDB4MDAsMHgwMSwweDAyLDB4MDMsMHgwNCwweDA1LAorICAgICAgICAweDA2LDB4MDcsMHgwOCwweDA5LDB4MGEsMHgwYiwKKyAgICAgICAgMHgwYywweDBkLDB4MGUsMHgwZiwweDEwLDB4MTEsCisgICAgICAgIDB4MTIsMHgxMywweDE0LDB4MTUsMHgxNiwweDE3LAorICAgICAgICAweDE4LDB4MTksMHgxYSwweDFiLDB4MWMsMHgxZCwKKyAgICAgICAgMHgxZSwweDFmLDB4MjAsMHgyMSwweDIyLDB4MjMsCit9OworCisjaWYgMAorLy8tCit1OCBydGw4MjI1X2FnY1tdPXsKKwkweDllLDB4OWUsMHg5ZSwweDllLDB4OWUsMHg5ZSwweDllLDB4OWUsMHg5ZCwweDljLDB4OWIsMHg5YSwweDk5LDB4OTgsMHg5NywweDk2LAorCTB4OTUsMHg5NCwweDkzLDB4OTIsMHg5MSwweDkwLDB4OGYsMHg4ZSwweDhkLDB4OGMsMHg4YiwweDhhLDB4ODksMHg4OCwweDg3LDB4ODYsCisJMHg4NSwweDg0LDB4ODMsMHg4MiwweDgxLDB4ODAsMHgzZiwweDNlLDB4M2QsMHgzYywweDNiLDB4M2EsMHgzOSwweDM4LDB4MzcsMHgzNiwKKwkweDM1LDB4MzQsMHgzMywweDMyLDB4MzEsMHgzMCwweDJmLDB4MmUsMHgyZCwweDJjLDB4MmIsMHgyYSwweDI5LDB4MjgsMHgyNywweDI2LAorCTB4MjUsMHgyNCwweDIzLDB4MjIsMHgyMSwweDIwLDB4MWYsMHgxZSwweDFkLDB4MWMsMHgxYiwweDFhLDB4MTksMHgxOCwweDE3LDB4MTYsCisJMHgxNSwweDE0LDB4MTMsMHgxMiwweDExLDB4MTAsMHgwZiwweDBlLDB4MGQsMHgwYywweDBiLDB4MGEsMHgwOSwweDA4LDB4MDcsMHgwNiwKKwkweDA1LDB4MDQsMHgwMywweDAyLDB4MDEsMHgwMSwweDAxLDB4MDEsMHgwMSwweDAxLDB4MDEsMHgwMSwweDAxLDB4MDEsMHgwMSwweDAxLAorCTB4MDEsMHgwMSwweDAxLDB4MDEsMHgwMSwweDAxLDB4MDEsMHgwMSwweDAxLDB4MDEsMHgwMSwweDAxLDB4MDEsMHgwMSwweDAxLDB4MDEsCit9OworI2VuZGlmCisvKgorIGZyb20gMCB0byAweDIzCit1OCBydGw4MjI1X3R4X2dhaW5fY2NrX29mZG1bXT17CisJMHgwMiwweDA2LDB4MGUsMHgxZSwweDNlLDB4N2UKK307CisqLworCisvLy0KK3U4IHJ0bDgyMjV6Ml90eF9wb3dlcl9vZmRtW109eworCTB4NDIsMHgwMCwweDQwLDB4MDAsMHg0MAorfTsKKworCisvLy0KK3U4IHJ0bDgyMjV6Ml90eF9wb3dlcl9jY2tfY2gxNFtdPXsKKwkweDM2LDB4MzUsMHgyZSwweDFiLDB4MDAsMHgwMCwweDAwLDB4MDAKK307CisKKworLy8tCit1OCBydGw4MjI1ejJfdHhfcG93ZXJfY2NrW109eworCTB4MzYsMHgzNSwweDJlLDB4MjUsMHgxYywweDEyLDB4MDksMHgwNAorfTsKKworCit2b2lkIHJ0bDgyMjV6Ml9zZXRfZ2FpbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzaG9ydCBnYWluKQoreworCXU4KiBydGw4MjI1X2dhaW47CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCisJdTggbW9kZSA9IHByaXYtPmllZWU4MDIxMS0+bW9kZTsKKworCWlmKG1vZGUgPT0gSUVFRV9CIHx8IG1vZGUgPT0gSUVFRV9HKQorCQlydGw4MjI1X2dhaW4gPSBydGw4MjI1ejJfZ2Fpbl9iZzsKKwllbHNlCisJCXJ0bDgyMjVfZ2FpbiA9IHJ0bDgyMjV6Ml9nYWluX2E7CisKKwkvL3dyaXRlX3BoeV9vZmRtKGRldiwgMHgwZCwgcnRsODIyNV9nYWluW2dhaW4gKiAzXSk7CisJLy93cml0ZV9waHlfb2ZkbShkZXYsIDB4MTksIHJ0bDgyMjVfZ2FpbltnYWluICogMyArIDFdKTsKKwkvL3dyaXRlX3BoeV9vZmRtKGRldiwgMHgxYiwgcnRsODIyNV9nYWluW2dhaW4gKiAzICsgMl0pOworICAgICAgICAvLzIwMDUuMTEuMTcsIGJ5IGNoLWhzdQorICAgICAgICB3cml0ZV9waHlfb2ZkbShkZXYsIDB4MGIsIHJ0bDgyMjVfZ2FpbltnYWluICogM10pOworICAgICAgICB3cml0ZV9waHlfb2ZkbShkZXYsIDB4MWIsIHJ0bDgyMjVfZ2FpbltnYWluICogMyArIDFdKTsKKyAgICAgICAgd3JpdGVfcGh5X29mZG0oZGV2LCAweDFkLCBydGw4MjI1X2dhaW5bZ2FpbiAqIDMgKyAyXSk7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDIxLCAweDM3KTsKKworfQorCisjaWYgMAorCit2b2lkIHJ0bDgyMjVfc2V0X2dhaW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc2hvcnQgZ2FpbikKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisKKwlydGw4MTgwX3NldF9hbmFwYXJhbShkZXYsIFJUTDgyMjVfQU5BUEFSQU1fT04pOworCisJaWYocHJpdi0+Y2FyZF84MTg1ID09IDIpCisJCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgyMSwgMHgyNyk7CisJZWxzZQorCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MjEsIDB4MzcpOworCisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDI1LCAweDIwKTsKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MTEsIDB4Nik7CisKKwlpZihwcml2LT5jYXJkXzgxODUgPT0gMSAmJiBwcml2LT5jYXJkXzgxODVfQnZlcnNpb24pCisJCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgyNywgMHg4KTsKKwllbHNlCisJCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgyNywgMHg4OCk7CisKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MTQsIDApOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxNiwgMCk7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDE1LCAweDQwKTsKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MTcsIDB4NDApOworCisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDBkLCBydGw4MjI1X2dhaW5bZ2FpbiAqIDRdKTsKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MjMsIHJ0bDgyMjVfZ2FpbltnYWluICogNCArIDFdKTsKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MWIsIHJ0bDgyMjVfZ2FpbltnYWluICogNCArIDJdKTsKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MWQsIHJ0bDgyMjVfZ2FpbltnYWluICogNCArIDNdKTsKKwkvL3J0bDgyMjVfc2V0X2dhaW5fdXNiKGRldiwgZ2Fpbik7Cit9CisjZW5kaWYKKwordTMyIHJlYWRfcnRsODIyNShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCBhZHIpCit7CisJdTMyIGRhdGEyV3JpdGUgPSAoKHUzMikoYWRyICYgMHgxZikpIDw8IDI3OworCXUzMiBkYXRhUmVhZDsKKwl1MzIgbWFzazsKKwl1MTYgb3ZhbCxvdmFsMixvdmFsMyx0bXA7CisvLwlUaHJlZVdpcmVSZWcgdHdyZWc7CisvLwlUaHJlZVdpcmVSZWcgdGRhdGE7CisJaW50IGk7CisJc2hvcnQgYml0LCBydzsKKworCXU4IHdMZW5ndGggPSA2OworCXU4IHJMZW5ndGggPSAxMjsKKwl1OCBsb3cyaGlnaCA9IDA7CisKKwlvdmFsID0gcmVhZF9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCk7CisJb3ZhbDIgPSByZWFkX25pY193b3JkKGRldiwgUkZQaW5zRW5hYmxlKTsKKwlvdmFsMyA9IHJlYWRfbmljX3dvcmQoZGV2LCBSRlBpbnNTZWxlY3QpOworCisJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNFbmFibGUsIChvdmFsMnwweGYpKTsKKwl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc1NlbGVjdCwgKG92YWwzfDB4ZikpOworCisJZGF0YVJlYWQgPSAwOworCisJb3ZhbCAmPSB+MHhmOworCisJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQsIG92YWwgfCBCQl9IT1NUX0JBTkdfRU4gKTsgdWRlbGF5KDQpOworCisJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQsIG92YWwgKTsgdWRlbGF5KDUpOworCisJcncgPSAwOworCisJbWFzayA9IChsb3cyaGlnaCkgPyAweDAxIDogKCgodTMyKTB4MDEpPDwoMzItMSkpOworCWZvcihpID0gMDsgaSA8IHdMZW5ndGgvMjsgaSsrKQorCXsKKwkJYml0ID0gKChkYXRhMldyaXRlJm1hc2spICE9IDApID8gMSA6IDA7CisJCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCBiaXR8b3ZhbCB8IHJ3KTsgdWRlbGF5KDEpOworCisJCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCBiaXR8b3ZhbCB8IEJCX0hPU1RfQkFOR19DTEsgfCBydyk7IHVkZWxheSgyKTsKKwkJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQsIGJpdHxvdmFsIHwgQkJfSE9TVF9CQU5HX0NMSyB8IHJ3KTsgdWRlbGF5KDIpOworCisJCW1hc2sgPSAobG93MmhpZ2gpID8gKG1hc2s8PDEpOiAobWFzaz4+MSk7CisKKwkJaWYoaSA9PSAyKQorCQl7CisJCQlydyA9IEJCX0hPU1RfQkFOR19SVzsKKwkJCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCBiaXR8b3ZhbCB8IEJCX0hPU1RfQkFOR19DTEsgfCBydyk7IHVkZWxheSgyKTsKKwkJCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCBiaXR8b3ZhbCB8IHJ3KTsgdWRlbGF5KDIpOworCQkJYnJlYWs7CisJCX0KKworCQliaXQgPSAoKGRhdGEyV3JpdGUmbWFzaykgIT0gMCkgPyAxOiAwOworCisJCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCBvdmFsfGJpdHxyd3wgQkJfSE9TVF9CQU5HX0NMSyk7IHVkZWxheSgyKTsKKwkJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQsIG92YWx8Yml0fHJ3fCBCQl9IT1NUX0JBTkdfQ0xLKTsgdWRlbGF5KDIpOworCisJCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCBvdmFsfCBiaXQgfHJ3KTsgdWRlbGF5KDEpOworCisJCW1hc2sgPSAobG93MmhpZ2gpID8gKG1hc2s8PDEpIDogKG1hc2s+PjEpOworCX0KKworCS8vdHdyZWcuc3RydWMuY2xrID0gMDsKKwkvL3R3cmVnLnN0cnVjLmRhdGEgPSAwOworCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCByd3xvdmFsKTsgdWRlbGF5KDIpOworCW1hc2sgPSAobG93MmhpZ2gpID8gMHgwMSA6ICgoKHUzMikweDAxKSA8PCAoMTItMSkpOworCisJLy8gV2UgbXVzdCBzZXQgZGF0YSBwaW4gdG8gSFcgY29udHJvbGVkLCBvdGhlcndpc2UgUkYgY2FuJ3QgZHJpdmVyIGl0IGFuZAorCS8vIHZhbHVlIFJGIHJlZ2lzdGVyIHdvbid0IGJlIGFibGUgdG8gcmVhZCBiYWNrIHByb3Blcmx5LiAyMDA2LjA2LjEzLCBieSByY25qa28uCisJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNFbmFibGUsIChvdmFsMiAmICh+MHgwMSkpKTsKKworCWZvcihpID0gMDsgaSA8IHJMZW5ndGg7IGkrKykKKwl7CisJCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCByd3xvdmFsKTsgdWRlbGF5KDEpOworCisJCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCByd3xvdmFsfEJCX0hPU1RfQkFOR19DTEspOyB1ZGVsYXkoMik7CisJCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCByd3xvdmFsfEJCX0hPU1RfQkFOR19DTEspOyB1ZGVsYXkoMik7CisJCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCByd3xvdmFsfEJCX0hPU1RfQkFOR19DTEspOyB1ZGVsYXkoMik7CisJCXRtcCA9IHJlYWRfbmljX3dvcmQoZGV2LCBSRlBpbnNJbnB1dCk7CisKKwkJZGF0YVJlYWQgfD0gKHRtcCAmIEJCX0hPU1RfQkFOR19DTEsgPyBtYXNrIDogMCk7CisKKwkJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQsIChyd3xvdmFsKSk7IHVkZWxheSgyKTsKKworCQltYXNrID0gKGxvdzJoaWdoKSA/IChtYXNrPDwxKSA6IChtYXNrPj4xKTsKKwl9CisKKwl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCwgQkJfSE9TVF9CQU5HX0VOfEJCX0hPU1RfQkFOR19SV3xvdmFsKTsgdWRlbGF5KDIpOworCisJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNFbmFibGUsIG92YWwyKTsKKwl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc1NlbGVjdCwgb3ZhbDMpOyAgIC8vIFNldCBUbyBTVyBTd2l0Y2gKKwl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCwgMHgzYTApOworCisJcmV0dXJuIGRhdGFSZWFkOworCit9CisjaWYgMAordm9pZCB3cml0ZV9ydGw4MjI1KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4IGFkciwgdTE2IGRhdGEpCit7CisJaW50IGk7CisJdTE2IG91dCxzZWxlY3Q7CisJdTggYml0OworCXUzMiBiYW5nZGF0YSA9IChkYXRhIDw8IDQpIHwgKGFkciAmIDB4Zik7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCisJb3V0ID0gcmVhZF9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCkgJiAweGZmZjM7CisKKwl3cml0ZV9uaWNfd29yZChkZXYsUkZQaW5zRW5hYmxlLAorCQkocmVhZF9uaWNfd29yZChkZXYsUkZQaW5zRW5hYmxlKSB8IDB4NykpOworCisJc2VsZWN0ID0gcmVhZF9uaWNfd29yZChkZXYsIFJGUGluc1NlbGVjdCk7CisKKwl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc1NlbGVjdCwgc2VsZWN0IHwgMHg3IHwKKwkJKChwcml2LT5jYXJkX3R5cGUgPT0gVVNCKSA/IDAgOiBTV19DT05UUk9MX0dQSU8pKTsKKworCWZvcmNlX3BjaV9wb3N0aW5nKGRldik7CisJdWRlbGF5KDEwKTsKKworCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCBvdXQgfCBCQl9IT1NUX0JBTkdfRU4gKTsvL3wgMHgxZmZmKTsKKworCWZvcmNlX3BjaV9wb3N0aW5nKGRldik7CisJdWRlbGF5KDIpOworCisJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQsIG91dCk7CisKKwlmb3JjZV9wY2lfcG9zdGluZyhkZXYpOworCXVkZWxheSgxMCk7CisKKworCWZvcihpPTE1OyBpPj0wO2ktLSl7CisKKwkJYml0ID0gKGJhbmdkYXRhICYgKDE8PGkpKSA+PiBpOworCisJCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCBiaXQgfCBvdXQpOworCisJCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCBiaXQgfCBvdXQgfCBCQl9IT1NUX0JBTkdfQ0xLKTsKKwkJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQsIGJpdCB8IG91dCB8IEJCX0hPU1RfQkFOR19DTEspOworCisJCWktLTsKKwkJYml0ID0gKGJhbmdkYXRhICYgKDE8PGkpKSA+PiBpOworCisJCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCBiaXQgfCBvdXQgfCBCQl9IT1NUX0JBTkdfQ0xLKTsKKwkJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQsIGJpdCB8IG91dCB8IEJCX0hPU1RfQkFOR19DTEspOworCisJCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCBiaXQgfCBvdXQpOworCisJfQorCisJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQsIG91dCB8IEJCX0hPU1RfQkFOR19FTik7CisKKwlmb3JjZV9wY2lfcG9zdGluZyhkZXYpOworCXVkZWxheSgxMCk7CisKKwl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCwgb3V0IHwKKwkJKChwcml2LT5jYXJkX3R5cGUgPT0gVVNCKSA/IDQgOiBCQl9IT1NUX0JBTkdfRU4pKTsKKworCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zU2VsZWN0LCBzZWxlY3QgfAorCQkoKHByaXYtPmNhcmRfdHlwZSA9PSBVU0IpID8gMCA6IFNXX0NPTlRST0xfR1BJTykpOworCisJaWYocHJpdi0+Y2FyZF90eXBlID09IFVTQikKKwkJbWRlbGF5KDIpOworCWVsc2UKKwkJcnRsODE4NV9yZl9waW5zX2VuYWJsZShkZXYpOworfQorCisjZW5kaWYKK3Nob3J0IHJ0bDgyMjVfaXNfVl96MihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXNob3J0IHZ6MiA9IDE7CisJLy9pbnQgaTsKKwkvKiBzdyB0byByZWcgcGcgMSAqLworCS8vd3JpdGVfcnRsODIyNShkZXYsIDAsIDB4MWI3KTsKKwkvL3dyaXRlX3J0bDgyMjUoZGV2LCAwLCAweDBiNyk7CisKKwkvKiByZWcgOCBwZyAxID0gMjMqLworCS8vcHJpbnRrKEtFUk5fV0FSTklORyAiUkYgUmlnaXN0ZXJzOlxuIik7CisjaWYgMAorCWZvcihpID0gMDsgaSA8PSAweGY7IGkrKykKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJTA4eCwiLCByZWFkX3J0bDgyMjUoZGV2LCBpKSk7CisJLy9wcmludGsoS0VSTl9XQVJOSU5HICJyZWdbOV1AcGcxID0gMHgleFxuIiwgcmVhZF9ydGw4MjI1KGRldiwgMHgwRikpOworCisvLwlwcmludGsoS0VSTl9XQVJOSU5HICJSRjpcbiIpOworI2VuZGlmCisJaWYoIHJlYWRfcnRsODIyNShkZXYsIDgpICE9IDB4NTg4KQorCQl2ejIgPSAwOworCisJZWxzZQkvKiByZWcgOSBwZyAxID0gMjQgKi8KKwkJaWYoIHJlYWRfcnRsODIyNShkZXYsIDkpICE9IDB4NzAwKQorCQkJdnoyID0gMDsKKworCS8qIHN3IGJhY2sgdG8gcGcgMCAqLworCXdyaXRlX3J0bDgyMjUoZGV2LCAwLCAweGI3KTsKKworCXJldHVybiB2ejI7CisKK30KKworI2lmIDAKK3ZvaWQgcnRsODIyNV9yZl9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXdyaXRlX3J0bDgyMjUoZGV2LCAweDQsIDB4MWYpOworCisJZm9yY2VfcGNpX3Bvc3RpbmcoZGV2KTsKKwltZGVsYXkoMSk7CisKKwlydGw4MTgwX3NldF9hbmFwYXJhbShkZXYsIFJUTDgyMjVfQU5BUEFSQU1fT0ZGKTsKKwlydGw4MTg1X3NldF9hbmFwYXJhbTIoZGV2LCBSVEw4MjI1X0FOQVBBUkFNMl9PRkYpOworfQorI2VuZGlmCisjaWYgMAorc2hvcnQgcnRsODIyNV9yZl9zZXRfc2VucyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzaG9ydCBzZW5zKQoreworCWlmIChzZW5zIDwwIHx8IHNlbnMgPiA2KSByZXR1cm4gLTE7CisKKwlpZihzZW5zID4gNCkKKwkJd3JpdGVfcnRsODIyNShkZXYsIDB4MGMsIDB4ODUwKTsKKwllbHNlCisJCXdyaXRlX3J0bDgyMjUoZGV2LCAweDBjLCAweDUwKTsKKworCXNlbnM9IDYtc2VuczsKKwlydGw4MjI1X3NldF9nYWluKGRldiwgc2Vucyk7CisKKwl3cml0ZV9waHlfY2NrKGRldiwgMHg0MSwgcnRsODIyNV90aHJlc2hvbGRbc2Vuc10pOworCXJldHVybiAwOworCit9CisjZW5kaWYKKworCit2b2lkIHJ0bDgyMjV6Ml9yZl9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCVJGX1dyaXRlUmVnKGRldiwgMHg0LCAweDFmKTsKKworCWZvcmNlX3BjaV9wb3N0aW5nKGRldik7CisJbWRlbGF5KDEpOworCisJcnRsODE4MF9zZXRfYW5hcGFyYW0oZGV2LCBSVEw4MjI1ejJfQU5BUEFSQU1fT0ZGKTsKKwlydGw4MTg1X3NldF9hbmFwYXJhbTIoZGV2LCBSVEw4MjI1ejJfQU5BUEFSQU0yX09GRik7Cit9CisKKyNpZmRlZiBFTkFCTEVfRE9UMTFECisvLworLy8JRGVzY3JpcHRpb246CisvLwkJTWFwIGRCbSBpbnRvIFR4IHBvd2VyIGluZGV4IGFjY29yZGluZyB0bworLy8JCWN1cnJlbnQgSFcgbW9kZWwsIGZvciBleGFtcGxlLCBSRiBhbmQgUEEsIGFuZAorLy8JCWN1cnJlbnQgd2lyZWxlc3MgbW9kZS4KKy8vCitzOAorRGJtVG9UeFB3cklkeCgKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiwKKwlXSVJFTEVTU19NT0RFCVdpcmVsZXNzTW9kZSwKKwlzMzIJCQlQb3dlckluRGJtCisJKQoreworIAlib29sIGJVc2VEZWZhdWx0ID0gdHJ1ZTsKKwlzOCBUeFB3cklkeCA9IDA7CisKKyNpZmRlZiBDT05GSUdfUlRMODE4WF9TCisJLy8KKwkvLyAwNzEwMTEsIFNEMyBTWToKKwkvLyBPRkRNIFBvd2VyIGluIGRCbSA9IEluZGV4ICogMC41ICsgMAorCS8vIENDSyBQb3dlciBpbiBkQm0gPSBJbmRleCAqIDAuMjUgKyAxMworCS8vCisJaWYocHJpdi0+Y2FyZF84MTg1ID49IFZFUlNJT05fODE4N1NfQikKKwl7CisJCXMzMiB0bXAgPSAwOworCisJCWlmKFdpcmVsZXNzTW9kZSA9PSBXSVJFTEVTU19NT0RFX0cpCisJCXsKKwkJCWJVc2VEZWZhdWx0ID0gZmFsc2U7CisJCQl0bXAgPSAoMiAqIFBvd2VySW5EYm0pOworCisJCQlpZih0bXAgPCAwKQorCQkJCVR4UHdySWR4ID0gMDsKKwkJCWVsc2UgaWYodG1wID4gNDApIC8vIDQwIG1lYW5zIDIwIGRCbS4KKwkJCQlUeFB3cklkeCA9IDQwOworCQkJZWxzZQorCQkJCVR4UHdySWR4ID0gKHM4KXRtcDsKKwkJfQorCQllbHNlIGlmKFdpcmVsZXNzTW9kZSA9PSBXSVJFTEVTU19NT0RFX0IpCisJCXsKKwkJCWJVc2VEZWZhdWx0ID0gZmFsc2U7CisJCQl0bXAgPSAoNCAqIFBvd2VySW5EYm0pIC0gNTI7CisKKwkJCWlmKHRtcCA8IDApCisJCQkJVHhQd3JJZHggPSAwOworCQkJZWxzZSBpZih0bXAgPiAyOCkgLy8gMjggbWVhbnMgMjAgZEJtLgorCQkJCVR4UHdySWR4ID0gMjg7CisJCQllbHNlCisJCQkJVHhQd3JJZHggPSAoczgpdG1wOworCQl9CisJfQorI2VuZGlmCisKKwkvLworCS8vIFRSVUUgaWYgd2Ugd2FudCB0byB1c2UgYSBkZWZhdWx0IGltcGxlbWVudGF0aW9uLgorCS8vIFdlIHNoYWxsIHNldCBpdCB0byBGQUxTRSB3aGVuIHdlIGhhdmUgZXhhY3QgdHJhbnNsYXRpb24gZm9ybXVsYXIKKwkvLyBmb3IgdGFyZ2V0IElDLiAwNzA2MjIsIGJ5IHJjbmprby4KKwkvLworCWlmKGJVc2VEZWZhdWx0KQorCXsKKwkJaWYoUG93ZXJJbkRibSA8IDApCisJCQlUeFB3cklkeCA9IDA7CisJCWVsc2UgaWYoUG93ZXJJbkRibSA+IDM1KQorCQkJVHhQd3JJZHggPSAzNTsKKwkJZWxzZQorCQkJVHhQd3JJZHggPSAodTgpUG93ZXJJbkRibTsKKwl9CisKKwlyZXR1cm4gVHhQd3JJZHg7Cit9CisjZW5kaWYKKwordm9pZCBydGw4MjI1ejJfU2V0VFhQb3dlckxldmVsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHNob3J0IGNoKQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKworLy8JaW50IEdhaW5JZHg7CisvLwlpbnQgR2FpblNldHRpbmc7CisJLy9pbnQgaTsKKwkvL3U4IHBvd2VyOworCS8vdTggKmNja19wb3dlcl90YWJsZTsKKwl1OCBtYXhfY2NrX3Bvd2VyX2xldmVsOworCS8vdTggbWluX2Nja19wb3dlcl9sZXZlbDsKKwl1OCBtYXhfb2ZkbV9wb3dlcl9sZXZlbDsKKwl1OCBtaW5fb2ZkbV9wb3dlcl9sZXZlbDsKKy8vCXU4IGNja19wb3dlcl9sZXZlbCA9IDB4ZmYgJiBwcml2LT5jaHR4cHdyW2NoXTsvLy1ieSBhbXkgMDgwMzEyCisvLwl1OCBvZmRtX3Bvd2VyX2xldmVsID0gMHhmZiAmIHByaXYtPmNodHhwd3Jfb2ZkbVtjaF07Ly8tYnkgYW15IDA4MDMxMgorCWNoYXIgY2NrX3Bvd2VyX2xldmVsID0gKGNoYXIpKDB4ZmYgJiBwcml2LT5jaHR4cHdyW2NoXSk7Ly8rYnkgYW15IDA4MDMxMgorCWNoYXIgb2ZkbV9wb3dlcl9sZXZlbCA9IChjaGFyKSgweGZmICYgcHJpdi0+Y2h0eHB3cl9vZmRtW2NoXSk7Ly8rYnkgYW15IDA4MDMxMgorI2lmIDAKKwkvLworCS8vIENDWCAyIFMzMSwgQVAgY29udHJvbCBvZiBjbGllbnQgdHJhbnNtaXQgcG93ZXI6CisJLy8gMS4gV2Ugc2hhbGwgbm90IGV4Y2VlZCBDZWxsIFBvd2VyIExpbWl0IGFzIHBvc3NpYmxlIGFzIHdlIGNhbi4KKwkvLyAyLiBUb2xlcmFuY2UgaXMgKy8tIDVkQi4KKwkvLyAzLiA4MDIuMTFoIFBvd2VyIENvbnRyYWludCB0YWtlcyBoaWdoZXIgcHJlY2VkZW5jZSBvdmVyIENDWCBDZWxsIFBvd2VyIExpbWl0LgorCS8vCisJLy8gVE9ETzoKKwkvLyAxLiA4MDIuMTFoIHBvd2VyIGNvbnRyYWludAorCS8vCisJLy8gMDcxMDExLCBieSByY25qa28uCisJLy8KKwlpZigJcHJpdi0+T3BNb2RlID09IFJUX09QX01PREVfSU5GUkFTVFJVQ1RVUkUgJiYKKwkJcHJpdi0+YldpdGhDY3hDZWxsUHdyICYmCisJCWNoID09IHByaXYtPmRvdDExQ3VycmVudENoYW5uZWxOdW1iZXIpCisJeworCQl1OCBDY2tDZWxsUHdySWR4ID0gRGJtVG9UeFB3cklkeChkZXYsIFdJUkVMRVNTX01PREVfQiwgcE1nbnRJbmZvLT5DY3hDZWxsUHdyKTsKKwkJdTggT2ZkbUNlbGxQd3JJZHggPSBEYm1Ub1R4UHdySWR4KGRldiwgV0lSRUxFU1NfTU9ERV9HLCBwTWdudEluZm8tPkNjeENlbGxQd3IpOworCisJCXByaW50aygiQ0NYIENlbGwgTGltaXQ6ICVkIGRCbSA9PiBDQ0sgVHggcG93ZXIgaW5kZXggOiAlZCwgT0ZETSBUeCBwb3dlciBpbmRleDogJWRcbiIsCisJCQlwcml2LT5DY3hDZWxsUHdyLCBDY2tDZWxsUHdySWR4LCBPZmRtQ2VsbFB3cklkeCk7CisJCXByaW50aygiRUVQUk9NIGNoYW5uZWwoJWQpID0+IENDSyBUeCBwb3dlciBpbmRleDogJWQsIE9GRE0gVHggcG93ZXIgaW5kZXg6ICVkXG4iLAorCQkJY2hhbm5lbCwgQ2NrVHhQd3JJZHgsIE9mZG1UeFB3cklkeCk7CisKKwkJaWYoY2NrX3Bvd2VyX2xldmVsID4gQ2NrQ2VsbFB3cklkeCkKKwkJCWNja19wb3dlcl9sZXZlbCA9IENja0NlbGxQd3JJZHg7CisJCWlmKG9mZG1fcG93ZXJfbGV2ZWwgPiBPZmRtQ2VsbFB3cklkeCkKKwkJCW9mZG1fcG93ZXJfbGV2ZWwgPSBPZmRtQ2VsbFB3cklkeDsKKworCQlwcmludGsoIkFsdGVyZWQgQ0NLIFR4IHBvd2VyIGluZGV4IDogJWQsIE9GRE0gVHggcG93ZXIgaW5kZXg6ICVkXG4iLAorCQkJQ2NrVHhQd3JJZHgsIE9mZG1UeFB3cklkeCk7CisJfQorI2VuZGlmCisjaWZkZWYgRU5BQkxFX0RPVDExRAorCWlmKElTX0RPVDExRF9FTkFCTEUocHJpdi0+aWVlZTgwMjExKSAmJgorCQlJU19ET1QxMURfU1RBVEVfRE9ORShwcml2LT5pZWVlODAyMTEpICkKKwl7CisJCS8vUFJUX0RPVDExRF9JTkZPIHBEb3QxMWRJbmZvID0gR0VUX0RPVDExRF9JTkZPKHByaXYtPmllZWU4MDIxMSk7CisJCXU4IE1heFR4UHdySW5EYm0gPSBET1QxMURfR2V0TWF4VHhQd3JJbkRibShwcml2LT5pZWVlODAyMTEsIGNoKTsKKwkJdTggQ2NrTWF4UHdySWR4ID0gRGJtVG9UeFB3cklkeChwcml2LCBXSVJFTEVTU19NT0RFX0IsIE1heFR4UHdySW5EYm0pOworCQl1OCBPZmRtTWF4UHdySWR4ID0gRGJtVG9UeFB3cklkeChwcml2LCBXSVJFTEVTU19NT0RFX0csIE1heFR4UHdySW5EYm0pOworCisJCS8vcHJpbnRrKCJNYXggVHggUG93ZXIgZEJtICglZCkgPT4gQ0NLIFR4IHBvd2VyIGluZGV4IDogJWQsIE9GRE0gVHggcG93ZXIgaW5kZXg6ICVkXG4iLCBNYXhUeFB3ckluRGJtLCBDY2tNYXhQd3JJZHgsIE9mZG1NYXhQd3JJZHgpOworCisJCS8vcHJpbnRrKCJFRVBST00gY2hhbm5lbCglZCkgPT4gQ0NLIFR4IHBvd2VyIGluZGV4OiAlZCwgT0ZETSBUeCBwb3dlciBpbmRleDogJWRcbiIsCisJCS8vCWNoLCBjY2tfcG93ZXJfbGV2ZWwsIG9mZG1fcG93ZXJfbGV2ZWwpOworCisJCWlmKGNja19wb3dlcl9sZXZlbCA+IENja01heFB3cklkeCkKKwkJCWNja19wb3dlcl9sZXZlbCA9IENja01heFB3cklkeDsKKwkJaWYob2ZkbV9wb3dlcl9sZXZlbCA+IE9mZG1NYXhQd3JJZHgpCisJCQlvZmRtX3Bvd2VyX2xldmVsID0gT2ZkbU1heFB3cklkeDsKKwl9CisKKwkvL3ByaXYtPkN1cnJlbnRDY2tUeFB3cklkeCA9IGNja19wb3dlcl9sZXZlbDsKKwkvL3ByaXYtPkN1cnJlbnRPZmRtVHhQd3JJZHggPSBvZmRtX3Bvd2VyX2xldmVsOworI2VuZGlmCisKKwltYXhfY2NrX3Bvd2VyX2xldmVsID0gMTU7CisJbWF4X29mZG1fcG93ZXJfbGV2ZWwgPSAyNTsgLy8gIDEyIC0+IDI1CisJbWluX29mZG1fcG93ZXJfbGV2ZWwgPSAxMDsKKworI2lmZGVmIENPTkZJR19SVEw4MTg1QgorI2lmZGVmIENPTkZJR19SVEw4MThYX1MKKworCWlmKGNja19wb3dlcl9sZXZlbCA+IDM1KQorCXsKKwkJY2NrX3Bvd2VyX2xldmVsID0gMzU7CisJfQorCS8vCisJLy8gU2V0IHVwIENDSyBUWEFHQy4gc3VnZ2VzdGVkIGJ5IFNEMyBTWS4KKwkvLworICAgICAgIHdyaXRlX25pY19ieXRlKGRldiwgQ0NLX1RYQUdDLCAoWkVCUkEyX0NDS19PRkRNX0dBSU5fU0VUVElOR1sodTgpY2NrX3Bvd2VyX2xldmVsXSkgKTsKKyAgICAgICAvL3ByaW50aygiQ0NLIFRYIHBvd2VyIGlzICV4XG4iLCAoWkVCUkEyX0NDS19PRkRNX0dBSU5fU0VUVElOR1tjY2tfcG93ZXJfbGV2ZWxdKSk7CisgICAgICAgZm9yY2VfcGNpX3Bvc3RpbmcoZGV2KTsKKwltZGVsYXkoMSk7CisjZWxzZQorCisJLyogQ0NLIHBvd2VyIHNldHRpbmcgKi8KKwlpZihjY2tfcG93ZXJfbGV2ZWwgPiBtYXhfY2NrX3Bvd2VyX2xldmVsKQorCQljY2tfcG93ZXJfbGV2ZWwgPSBtYXhfY2NrX3Bvd2VyX2xldmVsOworCisJY2NrX3Bvd2VyX2xldmVsICs9IHByaXYtPmNja190eHB3cl9iYXNlOworCisJaWYoY2NrX3Bvd2VyX2xldmVsID4gMzUpCisJCWNja19wb3dlcl9sZXZlbCA9IDM1OworCisJaWYoY2ggPT0gMTQpCisJCWNja19wb3dlcl90YWJsZSA9IHJ0bDgyMjV6Ml90eF9wb3dlcl9jY2tfY2gxNDsKKwllbHNlCisJCWNja19wb3dlcl90YWJsZSA9IHJ0bDgyMjV6Ml90eF9wb3dlcl9jY2s7CisKKworCWZvcihpPTA7aTw4O2krKyl7CisKKwkJcG93ZXIgPSBjY2tfcG93ZXJfdGFibGVbaV07CisJCXdyaXRlX3BoeV9jY2soZGV2LCAweDQ0ICsgaSwgcG93ZXIpOworCX0KKworCS8vd3JpdGVfbmljX2J5dGUoZGV2LCBUWF9HQUlOX0NDSywgcG93ZXIpOworCS8vMjAwNS4xMS4xNywKKwl3cml0ZV9uaWNfYnl0ZShkZXYsIENDS19UWEFHQywgWkVCUkEyX0NDS19PRkRNX0dBSU5fU0VUVElOR1sodTgpY2NrX3Bvd2VyX2xldmVsXSk7CisKKwlmb3JjZV9wY2lfcG9zdGluZyhkZXYpOworCW1kZWxheSgxKTsKKyNlbmRpZgorI2VuZGlmCisJLyogT0ZETSBwb3dlciBzZXR0aW5nICovCisvLyAgT2xkOgorLy8JaWYob2ZkbV9wb3dlcl9sZXZlbCA+IG1heF9vZmRtX3Bvd2VyX2xldmVsKQorLy8JCW9mZG1fcG93ZXJfbGV2ZWwgPSAzNTsKKy8vCW9mZG1fcG93ZXJfbGV2ZWwgKz0gbWluX29mZG1fcG93ZXJfbGV2ZWw7CisvLyAgTGF0ZXN0OgorLyoJaWYob2ZkbV9wb3dlcl9sZXZlbCA+IChtYXhfb2ZkbV9wb3dlcl9sZXZlbCAtIG1pbl9vZmRtX3Bvd2VyX2xldmVsKSkKKwkJb2ZkbV9wb3dlcl9sZXZlbCA9IG1heF9vZmRtX3Bvd2VyX2xldmVsOworCWVsc2UKKwkJb2ZkbV9wb3dlcl9sZXZlbCArPSBtaW5fb2ZkbV9wb3dlcl9sZXZlbDsKKworCW9mZG1fcG93ZXJfbGV2ZWwgKz0gcHJpdi0+b2ZkbV90eHB3cl9iYXNlOworKi8KKwlpZihvZmRtX3Bvd2VyX2xldmVsID4gMzUpCisJCW9mZG1fcG93ZXJfbGV2ZWwgPSAzNTsKKworLy8JcnRsODE4NV9zZXRfYW5hcGFyYW0yKGRldixSVEw4MjI1X0FOQVBBUkFNMl9PTik7CisKKwkvL3J0bDgxODVfc2V0X2FuYXBhcmFtMihkZXYsIEFOQVBBUk0yX0FTSUNfT04pOworCisJaWYgKHByaXYtPnVwID09IDApIHsKKwkJLy9tdXN0IGFkZCB0aGVzZSBmb3IgcnRsODE4NUIgZG93biwgeGlvbmctMjAwNi0xMS0yMQorCQl3cml0ZV9waHlfb2ZkbShkZXYsMiwweDQyKTsKKwkJd3JpdGVfcGh5X29mZG0oZGV2LDUsMCk7CisJCXdyaXRlX3BoeV9vZmRtKGRldiw2LDB4NDApOworCQl3cml0ZV9waHlfb2ZkbShkZXYsNywwKTsKKwkJd3JpdGVfcGh5X29mZG0oZGV2LDgsMHg0MCk7CisJfQorCisJLy93cml0ZV9uaWNfYnl0ZShkZXYsIFRYX0dBSU5fT0ZETSwgb2ZkbV9wb3dlcl9sZXZlbCk7CisJLy8yMDA1LjExLjE3LAorI2lmZGVmIENPTkZJR19SVEw4MThYX1MKKyAgICAgICAgd3JpdGVfbmljX2J5dGUoZGV2LCBPRkRNX1RYQUdDLCBaRUJSQTJfQ0NLX09GRE1fR0FJTl9TRVRUSU5HWyh1OClvZmRtX3Bvd2VyX2xldmVsXSk7CisjZWxzZQorICAgICAgICB3cml0ZV9uaWNfYnl0ZShkZXYsIE9GRE1fVFhBR0MsIFpFQlJBMl9DQ0tfT0ZETV9HQUlOX1NFVFRJTkdbKHU4KW9mZG1fcG93ZXJfbGV2ZWxdKjIpOworI2VuZGlmCisgICAgICAgIGlmKG9mZG1fcG93ZXJfbGV2ZWw8PTExKQorICAgICAgICB7CisvLyAgICAgICAgICAgIHdyaXRlX25pY19kd29yZChkZXYsUEhZX0FEUiwweDAwMDA1Yzg3KTsKKy8vICAgICAgICAgICAgd3JpdGVfbmljX2R3b3JkKGRldixQSFlfQURSLDB4MDAwMDVjODkpOworCQl3cml0ZV9waHlfb2ZkbShkZXYsMHgwNywweDVjKTsKKwkJd3JpdGVfcGh5X29mZG0oZGV2LDB4MDksMHg1Yyk7CisgICAgICAgIH0KKwlpZihvZmRtX3Bvd2VyX2xldmVsPD0xNykKKyAgICAgICAgeworLy8gICAgICAgICAgICAgd3JpdGVfbmljX2R3b3JkKGRldixQSFlfQURSLDB4MDAwMDU0ODcpOworLy8gICAgICAgICAgICAgd3JpdGVfbmljX2R3b3JkKGRldixQSFlfQURSLDB4MDAwMDU0ODkpOworCQl3cml0ZV9waHlfb2ZkbShkZXYsMHgwNywweDU0KTsKKwkJd3JpdGVfcGh5X29mZG0oZGV2LDB4MDksMHg1NCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisvLyAgICAgICAgICAgICB3cml0ZV9uaWNfZHdvcmQoZGV2LFBIWV9BRFIsMHgwMDAwNTA4Nyk7CisvLyAgICAgICAgICAgICB3cml0ZV9uaWNfZHdvcmQoZGV2LFBIWV9BRFIsMHgwMDAwNTA4OSk7CisJCXdyaXRlX3BoeV9vZmRtKGRldiwweDA3LDB4NTApOworCQl3cml0ZV9waHlfb2ZkbShkZXYsMHgwOSwweDUwKTsKKyAgICAgICAgfQorCWZvcmNlX3BjaV9wb3N0aW5nKGRldik7CisJbWRlbGF5KDEpOworCit9CisjaWYgMAorLyogc3dpdGNoIGJldHdlZW4gbW9kZSBCIGFuZCBHICovCit2b2lkIHJ0bDgyMjVfc2V0X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc2hvcnQgbW9kZWIpCit7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDE1LCAobW9kZWIgPyAweDAgOiAweDQwKSk7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDE3LCAobW9kZWIgPyAweDAgOiAweDQwKSk7Cit9CisjZW5kaWYKKwordm9pZCBydGw4MjI1ejJfcmZfc2V0X2NoYW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc2hvcnQgY2gpCit7CisvKgorCXNob3J0IGdzZXQgPSAocHJpdi0+aWVlZTgwMjExLT5zdGF0ZSA9PSBJRUVFODAyMTFfTElOS0VEICYmCisJCWllZWU4MDIxMV9pc181NGcocHJpdi0+aWVlZTgwMjExLT5jdXJyZW50X25ldHdvcmspKSB8fAorCQlwcml2LT5pZWVlODAyMTEtPml3X21vZGUgPT0gSVdfTU9ERV9NT05JVE9SOworKi8KKwlydGw4MjI1ejJfU2V0VFhQb3dlckxldmVsKGRldiwgY2gpOworCisJUkZfV3JpdGVSZWcoZGV2LCAweDcsIHJ0bDgyMjVfY2hhbltjaF0pOworCisJLy9ZSixhZGQsMDgwODI4LCBpZiBzZXQgY2hhbm5lbCBmYWlsZWQsIHdyaXRlIGFnYWluCisJaWYoKFJGX1JlYWRSZWcoZGV2LCAweDcpICYgMHgwRjgwKSAhPSBydGw4MjI1X2NoYW5bY2hdKQorCXsKKwkJUkZfV3JpdGVSZWcoZGV2LCAweDcsIHJ0bDgyMjVfY2hhbltjaF0pOworCX0KKworCW1kZWxheSgxKTsKKworCWZvcmNlX3BjaV9wb3N0aW5nKGRldik7CisJbWRlbGF5KDEwKTsKKy8vZGVsZXRlZCBieSBEYXZpZCA6IDIwMDYvOC85CisjaWYgMAorCXdyaXRlX25pY19ieXRlKGRldixTSUZTLDB4MjIpOy8vIFNJRlM6IDB4MjIKKworCWlmKGdzZXQpCisJCXdyaXRlX25pY19ieXRlKGRldixESUZTLDIwKTsgLy9ESUZTOiAyMAorCWVsc2UKKwkJd3JpdGVfbmljX2J5dGUoZGV2LERJRlMsMHgyNCk7IC8vRElGUzogMzYKKworCWlmKHByaXYtPmllZWU4MDIxMS0+c3RhdGUgPT0gSUVFRTgwMjExX0xJTktFRCAmJgorCQlpZWVlODAyMTFfaXNfc2hvcnRzbG90KHByaXYtPmllZWU4MDIxMS0+Y3VycmVudF9uZXR3b3JrKSkKKwkJd3JpdGVfbmljX2J5dGUoZGV2LFNMT1QsMHg5KTsgLy9TTE9UOiA5CisKKwllbHNlCisJCXdyaXRlX25pY19ieXRlKGRldixTTE9ULDB4MTQpOyAvL1NMT1Q6IDIwICgweDE0KQorCisKKwlpZihnc2V0KXsKKwkJd3JpdGVfbmljX2J5dGUoZGV2LEVJRlMsOTEgLSAyMCk7IC8vIEVJRlM6IDkxICgweDVCKQorCQl3cml0ZV9uaWNfYnl0ZShkZXYsQ1dfVkFMLDB4NzMpOyAvL0NXIFZBTFVFOiAweDM3CisJCS8vRE1FU0coInVzaW5nIEcgbmV0IHBhcmFtcyIpOworCX1lbHNleworCQl3cml0ZV9uaWNfYnl0ZShkZXYsRUlGUyw5MSAtIDB4MjQpOyAvLyBFSUZTOiA5MSAoMHg1QikKKwkJd3JpdGVfbmljX2J5dGUoZGV2LENXX1ZBTCwweGE1KTsgLy9DVyBWQUxVRTogMHgzNworCQkvL0RNRVNHKCJ1c2luZyBCIG5ldCBwYXJhbXMiKTsKKwl9CisjZW5kaWYKKworfQorI2lmIDAKK3ZvaWQgcnRsODIyNV9ob3N0X3BjaV9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQsIDB4NDgwKTsKKworCXJ0bDgxODVfcmZfcGluc19lbmFibGUoZGV2KTsKKworCS8vaWYocHJpdi0+Y2FyZF84MTg1ID09IDIgJiYgcHJpdi0+ZW5hYmxlX2dwaW8wICkgLyogdmVyc2lvbiBEICovCisJLy93cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc1NlbGVjdCwgMHg4OCk7CisJLy9lbHNlCisJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNTZWxlY3QsIDB4ODggfCBTV19DT05UUk9MX0dQSU8pOyAvKiAweDQ4OCB8IFNXX0NPTlRST0xfR1BJTyAqLworCisJd3JpdGVfbmljX2J5dGUoZGV2LCBHUF9FTkFCTEUsIDApOworCisJZm9yY2VfcGNpX3Bvc3RpbmcoZGV2KTsKKwltZGVsYXkoMjAwKTsKKworCXdyaXRlX25pY193b3JkKGRldiwgR1BfRU5BQkxFLCAweGZmICYgKH4oMTw8NikpKTsgLyogYml0IDYgaXMgZm9yIFJGIG9uL29mZiBkZXRlY3Rpb24gKi8KKworCit9CisKK3ZvaWQgcnRsODIyNV9ob3N0X3VzYl9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJd3JpdGVfbmljX2J5dGUoZGV2LFJGUGluc1NlbGVjdCsxLDApOworCisJd3JpdGVfbmljX2J5dGUoZGV2LEdQSU8sMCk7CisKKwl3cml0ZV9uaWNfYnl0ZV9FKGRldiwweDUzLHJlYWRfbmljX2J5dGVfRShkZXYsMHg1MykgfCAoMTw8NykpOworCisJd3JpdGVfbmljX2J5dGUoZGV2LFJGUGluc1NlbGVjdCsxLDQpOworCisJd3JpdGVfbmljX2J5dGUoZGV2LEdQSU8sMHgyMCk7CisKKwl3cml0ZV9uaWNfYnl0ZShkZXYsR1BfRU5BQkxFLDApOworCisKKwkvKiBDb25maWcgQkIgJiBSRiAqLworCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCAweDgwKTsKKworCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zU2VsZWN0LCAweDgwKTsKKworCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zRW5hYmxlLCAweDgwKTsKKworCisJbWRlbGF5KDEwMCk7CisKKwltZGVsYXkoMTAwMCk7CisKK30KKyNlbmRpZgordm9pZCBydGw4MjI1ejJfcmZfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlpbnQgaTsKKwlzaG9ydCBjaGFubmVsID0gMTsKKwl1MTYJYnJzcjsKKwl1MzIJZGF0YSxhZGRyOworCisJcHJpdi0+Y2hhbiA9IGNoYW5uZWw7CisKKy8vCXJ0bDgxODBfc2V0X2FuYXBhcmFtKGRldiwgUlRMODIyNV9BTkFQQVJBTV9PTik7CisKKworCWlmKHByaXYtPmNhcmRfdHlwZSA9PSBVU0IpCisJCXJ0bDgyMjVfaG9zdF91c2JfaW5pdChkZXYpOworCWVsc2UKKwkJcnRsODIyNV9ob3N0X3BjaV9pbml0KGRldik7CisKKwl3cml0ZV9uaWNfZHdvcmQoZGV2LCBSRl9USU1JTkcsIDB4MDAwYTgwMDgpOworCisJYnJzciA9IHJlYWRfbmljX3dvcmQoZGV2LCBCUlNSKTsKKworCXdyaXRlX25pY193b3JkKGRldiwgQlJTUiwgMHhmZmZmKTsKKworCisJd3JpdGVfbmljX2R3b3JkKGRldiwgUkZfUEFSQSwgMHgxMDAwNDQpOworCisJI2lmIDEgIC8vMC0+MQorCXJ0bDgxODBfc2V0X21vZGUoZGV2LCBFUFJPTV9DTURfQ09ORklHKTsKKwl3cml0ZV9uaWNfYnl0ZShkZXYsIENPTkZJRzMsIDB4NDQpOworCXJ0bDgxODBfc2V0X21vZGUoZGV2LCBFUFJPTV9DTURfTk9STUFMKTsKKwkjZW5kaWYKKworCisJcnRsODE4NV9yZl9waW5zX2VuYWJsZShkZXYpOworCisvLwkJbWRlbGF5KDEwMDApOworCisJd3JpdGVfcnRsODIyNShkZXYsIDB4MCwgMHgyYmYpOyBtZGVsYXkoMSk7CisKKworCXdyaXRlX3J0bDgyMjUoZGV2LCAweDEsIDB4ZWUwKTsgbWRlbGF5KDEpOworCisJd3JpdGVfcnRsODIyNShkZXYsIDB4MiwgMHg0NGQpOyBtZGVsYXkoMSk7CisKKwl3cml0ZV9ydGw4MjI1KGRldiwgMHgzLCAweDQ0MSk7IG1kZWxheSgxKTsKKworCisJd3JpdGVfcnRsODIyNShkZXYsIDB4NCwgMHg4YzMpO21kZWxheSgxKTsKKworCisKKwl3cml0ZV9ydGw4MjI1KGRldiwgMHg1LCAweGM3Mik7bWRlbGF5KDEpOworLy8JfQorCisJd3JpdGVfcnRsODIyNShkZXYsIDB4NiwgMHhlNik7ICBtZGVsYXkoMSk7CisKKwl3cml0ZV9ydGw4MjI1KGRldiwgMHg3LCAoKHByaXYtPmNhcmRfdHlwZSA9PSBVU0IpPyAweDgyYSA6IHJ0bDgyMjVfY2hhbltjaGFubmVsXSkpOyAgbWRlbGF5KDEpOworCisJd3JpdGVfcnRsODIyNShkZXYsIDB4OCwgMHgzZik7ICBtZGVsYXkoMSk7CisKKwl3cml0ZV9ydGw4MjI1KGRldiwgMHg5LCAweDMzNSk7ICBtZGVsYXkoMSk7CisKKwl3cml0ZV9ydGw4MjI1KGRldiwgMHhhLCAweDlkNCk7ICBtZGVsYXkoMSk7CisKKwl3cml0ZV9ydGw4MjI1KGRldiwgMHhiLCAweDdiYik7ICBtZGVsYXkoMSk7CisKKwl3cml0ZV9ydGw4MjI1KGRldiwgMHhjLCAweDg1MCk7ICBtZGVsYXkoMSk7CisKKworCXdyaXRlX3J0bDgyMjUoZGV2LCAweGQsIDB4Y2RmKTsgICBtZGVsYXkoMSk7CisKKwl3cml0ZV9ydGw4MjI1KGRldiwgMHhlLCAweDJiKTsgIG1kZWxheSgxKTsKKworCXdyaXRlX3J0bDgyMjUoZGV2LCAweGYsIDB4MTE0KTsKKworCisJbWRlbGF5KDEwMCk7CisKKworCS8vaWYocHJpdi0+Y2FyZF90eXBlICE9IFVTQikgLyogbWF5YmUgbm90IG5lZWRlZCBldmVuIGZvciA4MTg1ICovCisvLwl3cml0ZV9ydGw4MjI1KGRldiwgMHg3LCBydGw4MjI1X2NoYW5bY2hhbm5lbF0pOworCisJd3JpdGVfcnRsODIyNShkZXYsIDB4MCwgMHgxYjcpOworCisJZm9yKGk9MDtpPDk1O2krKyl7CisJCXdyaXRlX3J0bDgyMjUoZGV2LCAweDEsICh1OCkoaSsxKSk7CisKKwkJI2lmIDAKKwkJaWYocHJpdi0+cGh5X3ZlciA9PSAxKQorCQkJLyogdmVyc2lvbiBBICovCisJCQl3cml0ZV9ydGw4MjI1KGRldiwgMHgyLCBydGw4MjI1YV9yeGdhaW5baV0pOworCQllbHNlCisJCSNlbmRpZgorCQkvKiB2ZXJzaW9uIEIgJiBDICYgRCovCisKKwkJd3JpdGVfcnRsODIyNShkZXYsIDB4MiwgcnRsODIyNXoyX3J4Z2FpbltpXSk7CisJfQorCXdyaXRlX3J0bDgyMjUoZGV2LCAweDMsIDB4ODApOworCXdyaXRlX3J0bDgyMjUoZGV2LCAweDUsIDB4NCk7CisKKwl3cml0ZV9ydGw4MjI1KGRldiwgMHgwLCAweGI3KTsKKworCXdyaXRlX3J0bDgyMjUoZGV2LCAweDIsIDB4YzRkKTsKKworCWlmKHByaXYtPmNhcmRfdHlwZSA9PSBVU0IpeworCS8vCWZvcmNlX3BjaV9wb3N0aW5nKGRldik7CisJCW1kZWxheSgyMDApOworCisJCXdyaXRlX3J0bDgyMjUoZGV2LCAweDIsIDB4NDRkKTsKKworCS8vCWZvcmNlX3BjaV9wb3N0aW5nKGRldik7CisJCW1kZWxheSgxMDApOworCisJfS8vRW5kIG9mIGlmKHByaXYtPmNhcmRfdHlwZSA9PSBVU0IpCisJLyogRklYTUUhISBydGw4MTg3IHdlIGhhdmUgdG8gY2hlY2sgaWYgY2FsaWJyYXJpb24KKwkgKiBpcyBzdWNjZXNzZnVsIGFuZCBldmVudHVhbGx5IGNhbC4gYWdhaW4gKHJlcGVhdAorCSAqIHRoZSB0d28gd3JpdGUgb24gcmVnIDIpCisJKi8KKwkvLyBDaGVjayBmb3IgY2FsaWJyYXRpb24gc3RhdHVzLCAyMDA1LjExLjE3LAorICAgICAgICBkYXRhID0gcmVhZF9ydGw4MjI1KGRldiwgNik7CisgICAgICAgIGlmICghKGRhdGEmMHgwMDAwMDA4MCkpCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3cml0ZV9ydGw4MjI1KGRldiwgMHgwMiwgMHgwYzRkKTsKKyAgICAgICAgICAgICAgICBmb3JjZV9wY2lfcG9zdGluZyhkZXYpOyBtZGVsYXkoMjAwKTsKKyAgICAgICAgICAgICAgICB3cml0ZV9ydGw4MjI1KGRldiwgMHgwMiwgMHgwNDRkKTsKKyAgICAgICAgICAgICAgICBmb3JjZV9wY2lfcG9zdGluZyhkZXYpOyBtZGVsYXkoMTAwKTsKKyAgICAgICAgICAgICAgICBkYXRhID0gcmVhZF9ydGw4MjI1KGRldiwgNik7CisgICAgICAgICAgICAgICAgaWYgKCEoZGF0YSYweDAwMDAwMDgwKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRE1FU0dXKCJSRiBDYWxpYnJhdGlvbiBGYWlsZWQhISEhXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorCS8vZm9yY2VfcGNpX3Bvc3RpbmcoZGV2KTsKKworCW1kZWxheSgyMDApOyAvLzIwMCBmb3IgODE4NworCisKKy8vCS8vaWYocHJpdi0+Y2FyZF90eXBlICE9IFVTQil7CisvLwkJd3JpdGVfcnRsODIyNShkZXYsIDB4MiwgMHg0NGQpOworLy8JCXdyaXRlX3J0bDgyMjUoZGV2LCAweDcsIHJ0bDgyMjVfY2hhbltjaGFubmVsXSk7CisvLwkJd3JpdGVfcnRsODIyNShkZXYsIDB4MiwgMHg0N2QpOworLy8KKy8vCQlmb3JjZV9wY2lfcG9zdGluZyhkZXYpOworLy8JCW1kZWxheSgxMDApOworLy8KKy8vCQl3cml0ZV9ydGw4MjI1KGRldiwgMHgyLCAweDQ0ZCk7CisvLwkvL30KKworCXdyaXRlX3J0bDgyMjUoZGV2LCAweDAsIDB4MmJmKTsKKworCWlmKHByaXYtPmNhcmRfdHlwZSAhPSBVU0IpCisJCXJ0bDgxODVfcmZfcGluc19lbmFibGUoZGV2KTsKKwkvL3NldCB1cCBaRUJSQSBBR0MgdGFibGUsIDIwMDUuMTEuMTcsCisgICAgICAgIGZvcihpPTA7aTwxMjg7aSsrKXsKKyAgICAgICAgICAgICAgICBkYXRhID0gcnRsODIyNV9hZ2NbaV07CisKKyAgICAgICAgICAgICAgICBhZGRyID0gaSArIDB4ODA7IC8vZW5hYmxlIHdyaXRpbmcgQUdDIHRhYmxlCisgICAgICAgICAgICAgICAgd3JpdGVfcGh5X29mZG0oZGV2LCAweGIsIGRhdGEpOworCisgICAgICAgICAgICAgICAgbWRlbGF5KDEpOworICAgICAgICAgICAgICAgIHdyaXRlX3BoeV9vZmRtKGRldiwgMHhhLCBhZGRyKTsKKworICAgICAgICAgICAgICAgIG1kZWxheSgxKTsKKyAgICAgICAgfQorI2lmIDAKKwlmb3IoaT0wO2k8MTI4O2krKyl7CisJCXdyaXRlX3BoeV9vZmRtKGRldiwgMHhiLCBydGw4MjI1X2FnY1tpXSk7CisKKwkJbWRlbGF5KDEpOworCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4YSwgKHU4KWkrIDB4ODApOworCisJCW1kZWxheSgxKTsKKwl9CisjZW5kaWYKKworCWZvcmNlX3BjaV9wb3N0aW5nKGRldik7CisJbWRlbGF5KDEpOworCisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDAsIDB4MSk7IG1kZWxheSgxKTsKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MSwgMHgyKTsgbWRlbGF5KDEpOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgyLCAoKHByaXYtPmNhcmRfdHlwZSA9PSBVU0IpPyAweDQyIDogMHg2MikpOyBtZGVsYXkoMSk7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDMsIDB4MCk7IG1kZWxheSgxKTsKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4NCwgMHgwKTsgbWRlbGF5KDEpOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHg1LCAweDApOyBtZGVsYXkoMSk7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDYsIDB4NDApOyBtZGVsYXkoMSk7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDcsIDB4MCk7IG1kZWxheSgxKTsKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4OCwgMHg0MCk7IG1kZWxheSgxKTsKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4OSwgMHhmZSk7IG1kZWxheSgxKTsKKworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHhhLCAweDgpOyBtZGVsYXkoMSk7CisKKwkvL3dyaXRlX3BoeV9vZmRtKGRldiwgMHgxOCwgMHhlZik7CisJLy8JfQorCS8vfQorCXdyaXRlX3BoeV9vZmRtKGRldiwgMHhiLCAweDgwKTsgbWRlbGF5KDEpOworCisJd3JpdGVfcGh5X29mZG0oZGV2LCAweGMsIDB4MSk7bWRlbGF5KDEpOworCisKKwkvL2lmKHByaXYtPmNhcmRfdHlwZSAhPSBVU0IpCisJd3JpdGVfcGh5X29mZG0oZGV2LCAweGQsIDB4NDMpOworCisJd3JpdGVfcGh5X29mZG0oZGV2LCAweGUsIDB4ZDMpO21kZWxheSgxKTsKKworCisJI2lmIDAKKwlpZihwcml2LT5jYXJkXzgxODUgPT0gMSl7CisJCWlmKHByaXYtPmNhcmRfODE4NV9CdmVyc2lvbikKKwkJCXdyaXRlX3BoeV9vZmRtKGRldiwgMHhmLCAweDIwKTsvKnZlciBCKi8KKwkJZWxzZQorCQkJd3JpdGVfcGh5X29mZG0oZGV2LCAweGYsIDB4MjgpOy8qdmVyIEMqLworCX1lbHNleworCSNlbmRpZgorCXdyaXRlX3BoeV9vZmRtKGRldiwgMHhmLCAweDM4KTttZGVsYXkoMSk7CisvKnZlciBEICYgODE4NyovCisvLwl9CisKKy8vCWlmKHByaXYtPmNhcmRfODE4NSA9PSAxICYmIHByaXYtPmNhcmRfODE4NV9CdmVyc2lvbikKKy8vCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MTAsIDB4MDQpOy8qdmVyIEIqLworLy8JZWxzZQorCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxMCwgMHg4NCk7bWRlbGF5KDEpOworLyp2ZXIgQyAmIEQgJiA4MTg3Ki8KKworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxMSwgMHgwNyk7bWRlbGF5KDEpOworLyphZ2MgcmVzcCB0aW1lIDcwMCovCisKKworLy8JaWYocHJpdi0+Y2FyZF84MTg1ID09IDIpeworCS8qIFZlciBEICYgODE4NyovCisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDEyLCAweDIwKTttZGVsYXkoMSk7CisKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MTMsIDB4MjApO21kZWxheSgxKTsKKworI2lmIDAKKwl9ZWxzZXsKKwkJLyogVmVyIEIgJiBDKi8KKwkJd3JpdGVfcGh5X29mZG0oZGV2LCAweDEyLCAweDApOworCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MTMsIDB4MCk7CisJfQorI2VuZGlmCisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDE0LCAweDApOyBtZGVsYXkoMSk7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDE1LCAweDQwKTsgbWRlbGF5KDEpOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxNiwgMHgwKTsgbWRlbGF5KDEpOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxNywgMHg0MCk7IG1kZWxheSgxKTsKKworLy8JaWYgKHByaXYtPmNhcmRfdHlwZSA9PSBVU0IpCisvLwkJd3JpdGVfcGh5X29mZG0oZGV2LCAweDE4LCAweGVmKTsKKworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxOCwgMHhlZik7bWRlbGF5KDEpOworCisKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MTksIDB4MTkpOyBtZGVsYXkoMSk7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDFhLCAweDIwKTsgbWRlbGF5KDEpOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxYiwgMHgxNSk7bWRlbGF5KDEpOworCisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDFjLCAweDQpO21kZWxheSgxKTsKKworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxZCwgMHhjNSk7bWRlbGF5KDEpOyAvLzIwMDUuMTEuMTcsCisKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MWUsIDB4OTUpO21kZWxheSgxKTsKKworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxZiwgMHg3NSk7CW1kZWxheSgxKTsKKworLy8JfQorCisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDIwLCAweDFmKTttZGVsYXkoMSk7CisKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MjEsIDB4MTcpO21kZWxheSgxKTsKKworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgyMiwgMHgxNik7bWRlbGF5KDEpOworCisvLwlpZihwcml2LT5jYXJkX3R5cGUgIT0gVVNCKQorCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgyMywgMHg4MCk7bWRlbGF5KDEpOyAvL0ZJWE1FIG1heWJlIG5vdCBuZWVkZWQgLy8gPD4KKworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgyNCwgMHg0Nik7IG1kZWxheSgxKTsKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MjUsIDB4MDApOyBtZGVsYXkoMSk7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDI2LCAweDkwKTsgbWRlbGF5KDEpOworCisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDI3LCAweDg4KTsgbWRlbGF5KDEpOworCisKKwkvLyA8PiBTZXQgaW5pdC4gZ2FpbiB0byBtNzRkQm0uCisKKwlydGw4MjI1ejJfc2V0X2dhaW4oZGV2LDQpOworCisJd3JpdGVfcGh5X2NjayhkZXYsIDB4MCwgMHg5OCk7IG1kZWxheSgxKTsKKwl3cml0ZV9waHlfY2NrKGRldiwgMHgzLCAweDIwKTsgbWRlbGF5KDEpOworCXdyaXRlX3BoeV9jY2soZGV2LCAweDQsIDB4N2UpOyBtZGVsYXkoMSk7CisJd3JpdGVfcGh5X2NjayhkZXYsIDB4NSwgMHgxMik7IG1kZWxheSgxKTsKKwl3cml0ZV9waHlfY2NrKGRldiwgMHg2LCAweGZjKTsgbWRlbGF5KDEpOworCisJd3JpdGVfcGh5X2NjayhkZXYsIDB4NywgMHg3OCk7bWRlbGF5KDEpOworIC8qIFZlciBDICYgRCAmIDgxODcqLworCisJd3JpdGVfcGh5X2NjayhkZXYsIDB4OCwgMHgyZSk7bWRlbGF5KDEpOworCisJd3JpdGVfcGh5X2NjayhkZXYsIDB4MTAsICgocHJpdi0+Y2FyZF90eXBlID09IFVTQikgPyAweDliOiAweDkzKSk7IG1kZWxheSgxKTsKKwl3cml0ZV9waHlfY2NrKGRldiwgMHgxMSwgMHg4OCk7IG1kZWxheSgxKTsKKwl3cml0ZV9waHlfY2NrKGRldiwgMHgxMiwgMHg0Nyk7IG1kZWxheSgxKTsKKyNpZiAwCisJaWYocHJpdi0+Y2FyZF84MTg1ID09IDEgJiYgcHJpdi0+Y2FyZF84MTg1X0J2ZXJzaW9uKQorCQl3cml0ZV9waHlfY2NrKGRldiwgMHgxMywgMHg5OCk7IC8qIFZlciBCICovCisJZWxzZQorI2VuZGlmCisJd3JpdGVfcGh5X2NjayhkZXYsIDB4MTMsIDB4ZDApOyAvKiBWZXIgQyAmIEQgJiA4MTg3Ki8KKworCXdyaXRlX3BoeV9jY2soZGV2LCAweDE5LCAweDApOworCXdyaXRlX3BoeV9jY2soZGV2LCAweDFhLCAweGEwKTsKKwl3cml0ZV9waHlfY2NrKGRldiwgMHgxYiwgMHg4KTsKKwl3cml0ZV9waHlfY2NrKGRldiwgMHg0MCwgMHg4Nik7IC8qIENDSyBDYXJyaWVyIFNlbnNlIFRocmVzaG9sZCAqLworCisJd3JpdGVfcGh5X2NjayhkZXYsIDB4NDEsIDB4OGQpO21kZWxheSgxKTsKKworCisJd3JpdGVfcGh5X2NjayhkZXYsIDB4NDIsIDB4MTUpOyBtZGVsYXkoMSk7CisJd3JpdGVfcGh5X2NjayhkZXYsIDB4NDMsIDB4MTgpOyBtZGVsYXkoMSk7CisKKworCXdyaXRlX3BoeV9jY2soZGV2LCAweDQ0LCAweDM2KTsgbWRlbGF5KDEpOworCXdyaXRlX3BoeV9jY2soZGV2LCAweDQ1LCAweDM1KTsgbWRlbGF5KDEpOworCXdyaXRlX3BoeV9jY2soZGV2LCAweDQ2LCAweDJlKTsgbWRlbGF5KDEpOworCXdyaXRlX3BoeV9jY2soZGV2LCAweDQ3LCAweDI1KTsgbWRlbGF5KDEpOworCXdyaXRlX3BoeV9jY2soZGV2LCAweDQ4LCAweDFjKTsgbWRlbGF5KDEpOworCXdyaXRlX3BoeV9jY2soZGV2LCAweDQ5LCAweDEyKTsgbWRlbGF5KDEpOworCXdyaXRlX3BoeV9jY2soZGV2LCAweDRhLCAweDkpOyBtZGVsYXkoMSk7CisJd3JpdGVfcGh5X2NjayhkZXYsIDB4NGIsIDB4NCk7IG1kZWxheSgxKTsKKwl3cml0ZV9waHlfY2NrKGRldiwgMHg0YywgMHg1KTttZGVsYXkoMSk7CisKKworCXdyaXRlX25pY19ieXRlKGRldiwgMHg1YiwgMHgwZCk7IG1kZWxheSgxKTsKKworCisKKy8vIDw+CisvLwkvLyBURVNUUiAweGIgODE4NworLy8Jd3JpdGVfcGh5X2NjayhkZXYsIDB4MTAsIDB4OTMpOy8vICYgMHhmYik7CisvLworLy8JLy9pZihwcml2LT5jYXJkX3R5cGUgIT0gVVNCKXsKKy8vCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MiwgMHg2Mik7CisvLwkJd3JpdGVfcGh5X29mZG0oZGV2LCAweDYsIDB4MCk7CisvLwkJd3JpdGVfcGh5X29mZG0oZGV2LCAweDgsIDB4MCk7CisvLwkvL30KKworCXJ0bDgyMjV6Ml9TZXRUWFBvd2VyTGV2ZWwoZGV2LCBjaGFubmVsKTsKKyNpZmRlZiBDT05GSUdfUlRMODE4WF9TCisgICAgICAgIHdyaXRlX3BoeV9jY2soZGV2LCAweDExLCAweDliKTsgbWRlbGF5KDEpOyAvKiBSeCBhbnQgQSwgMHhkYiBmb3IgQiAqLworI2Vsc2UKKwl3cml0ZV9waHlfY2NrKGRldiwgMHgxMCwgMHg5Yik7IG1kZWxheSgxKTsgLyogUnggYW50IEEsIDB4ZGIgZm9yIEIgKi8KKyNlbmRpZgorCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgyNiwgMHg5MCk7IG1kZWxheSgxKTsgLyogUnggYW50IEEsIDB4MTAgZm9yIEIgKi8KKworCXJ0bDgxODVfdHhfYW50ZW5uYShkZXYsIDB4Myk7IC8qIFRYIGFudCBBLCAweDAgZm9yIEIgKi8KKworCS8qIHN3aXRjaCB0byBoaWdoLXNwZWVkIDMtd2lyZQorCSAqIGxhc3QgZGlnaXQuIDIgZm9yIGJvdGggY2NrIGFuZCBvZmRtCisJICovCisJaWYocHJpdi0+Y2FyZF90eXBlID09IFVTQikKKwkJd3JpdGVfbmljX2R3b3JkKGRldiwgMHg5NCwgMHgzZGMwMDAwMik7CisJZWxzZXsKKwkJd3JpdGVfbmljX2R3b3JkKGRldiwgMHg5NCwgMHgxNWMwMDAwMik7CisJCXJ0bDgxODVfcmZfcGluc19lbmFibGUoZGV2KTsKKwl9CisKKy8vCWlmKHByaXYtPmNhcmRfdHlwZSAhPSBVU0IpCisvLwlydGw4MjI1X3NldF9nYWluKGRldiwgNCk7IC8qIEZJWE1FIHRoaXMgJzEnIGlzIHJhbmRvbSAqLyAvLyA8PgorLy8JIHJ0bDgyMjVfc2V0X21vZGUoZGV2LCAxKTsgLyogRklYTUUgc3RhcnQgaW4gQiBtb2RlICovIC8vIDw+CisvLworLy8JLyogbWFrZSBzdXJlIGlzIHdha2VuIHVwISAqLworLy8Jd3JpdGVfcnRsODIyNShkZXYsMHg0LCAweDlmZik7CisvLwlydGw4MTgwX3NldF9hbmFwYXJhbShkZXYsIFJUTDgyMjVfQU5BUEFSQU1fT04pOworLy8JcnRsODE4NV9zZXRfYW5hcGFyYW0yKGRldiwgUlRMODIyNV9BTkFQQVJBTTJfT04pOworCisJcnRsODIyNV9yZl9zZXRfY2hhbihkZXYsIHByaXYtPmNoYW4pOworCisJLy93cml0ZV9uaWNfd29yZChkZXYsQlJTUixicnNyKTsKKworCS8vcnRsODIyNXoyX3JmX3NldF9tb2RlKGRldik7Cit9CisKK3ZvaWQgcnRsODIyNXoyX3JmX3NldF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCisJaWYocHJpdi0+aWVlZTgwMjExLT5tb2RlID09IElFRUVfQSkKKwl7CisJCXdyaXRlX3J0bDgyMjUoZGV2LCAweDUsIDB4MTg2NSk7CisJCXdyaXRlX25pY19kd29yZChkZXYsIFJGX1BBUkEsIDB4MTAwODQpOworCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBSRl9USU1JTkcsIDB4YTgwMDgpOworCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MCwgMHgwKTsKKwkJd3JpdGVfcGh5X29mZG0oZGV2LCAweGEsIDB4Nik7CisJCXdyaXRlX3BoeV9vZmRtKGRldiwgMHhiLCAweDk5KTsKKwkJd3JpdGVfcGh5X29mZG0oZGV2LCAweGYsIDB4MjApOworCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MTEsIDB4Nyk7CisKKwkJcnRsODIyNXoyX3NldF9nYWluKGRldiw0KTsKKworCQl3cml0ZV9waHlfb2ZkbShkZXYsMHgxNSwgMHg0MCk7CisJCXdyaXRlX3BoeV9vZmRtKGRldiwweDE3LCAweDQwKTsKKworCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCAweDk0LDB4MTAwMDAwMDApOworCX1lbHNleworCisJCXdyaXRlX3J0bDgyMjUoZGV2LCAweDUsIDB4MTg2NCk7CisJCXdyaXRlX25pY19kd29yZChkZXYsIFJGX1BBUkEsIDB4MTAwNDQpOworCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBSRl9USU1JTkcsIDB4YTgwMDgpOworCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MCwgMHgxKTsKKwkJd3JpdGVfcGh5X29mZG0oZGV2LCAweGEsIDB4Nik7CisJCXdyaXRlX3BoeV9vZmRtKGRldiwgMHhiLCAweDk5KTsKKwkJd3JpdGVfcGh5X29mZG0oZGV2LCAweGYsIDB4MjApOworCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MTEsIDB4Nyk7CisKKwkJcnRsODIyNXoyX3NldF9nYWluKGRldiw0KTsKKworCQl3cml0ZV9waHlfb2ZkbShkZXYsMHgxNSwgMHg0MCk7CisJCXdyaXRlX3BoeV9vZmRtKGRldiwweDE3LCAweDQwKTsKKworCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCAweDk0LDB4MDQwMDAwMDIpOworCX0KK30KKworLy9sem0gbW9kIDA4MDgyNgorLy8jZGVmaW5lIE1BWF9ET1pFX1dBSVRJTkdfVElNRVNfODVCIDY0CisvLyNkZWZpbmUgTUFYX1BPTExJTkdfMjRGX1RJTUVTXzg3U0UgCTUKKyNkZWZpbmUgTUFYX0RPWkVfV0FJVElOR19USU1FU184NUIgCQkyMAorI2RlZmluZSBNQVhfUE9MTElOR18yNEZfVElNRVNfODdTRSAJCQkxMAorI2RlZmluZSBMUFNfTUFYX1NMRUVQX1dBSVRJTkdfVElNRVNfODdTRSAJNQorCitib29sCitTZXRaZWJyYVJGUG93ZXJTdGF0ZTgxODUoCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwlSVF9SRl9QT1dFUl9TVEFURQllUkZQb3dlclN0YXRlCisJKQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwl1OAkJCWJ0Q1I5MzQ2LCBidENvbmZpZzM7CisJYm9vbCBiQWN0aW9uQWxsb3dlZD0gdHJ1ZSwgYlR1cm5PZmZCQiA9IHRydWU7Ly9sem0gbW9kIDA4MDgyNgorCS8vdTMyCQkJRFdvcmRDb250ZW50OworCXU4CQkJdTFiVG1wOworCWludAkJCWk7CisJLy91MTYJCQl1MmJURlBDID0gMDsKKwlib29sCQliUmVzdWx0ID0gdHJ1ZTsKKwl1OAkJCVF1ZXVlSUQ7CisKKwlpZihwcml2LT5TZXRSRlBvd2VyU3RhdGVJblByb2dyZXNzID09IHRydWUpCisJCXJldHVybiBmYWxzZTsKKworCXByaXYtPlNldFJGUG93ZXJTdGF0ZUluUHJvZ3Jlc3MgPSB0cnVlOworCisJLy8gZW5hYmxlIEVFTTAgYW5kIEVFTTEgaW4gOTM0NkNSCisJYnRDUjkzNDYgPSByZWFkX25pY19ieXRlKGRldiwgQ1I5MzQ2KTsKKwl3cml0ZV9uaWNfYnl0ZShkZXYsIENSOTM0NiwgKGJ0Q1I5MzQ2fDB4QzApICk7CisJLy8gZW5hYmxlIFBBUk1fRW4gaW4gQ29uZmlnMworCWJ0Q29uZmlnMyA9IHJlYWRfbmljX2J5dGUoZGV2LCBDT05GSUczKTsKKwl3cml0ZV9uaWNfYnl0ZShkZXYsIENPTkZJRzMsIChidENvbmZpZzN8Q09ORklHM19QQVJNX0VuKSApOworCisJc3dpdGNoKCBwcml2LT5yZl9jaGlwICkKKwl7CisJY2FzZSBSRl9aRUJSQTI6CisJCXN3aXRjaCggZVJGUG93ZXJTdGF0ZSApCisJCXsKKwkJY2FzZSBlUmZPbjoKKwkJCVJGX1dyaXRlUmVnKGRldiwweDQsMHg5RkYpOworCisJCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBBTkFQQVJBTSwgQU5BUEFSTV9PTik7CisJCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBBTkFQQVJBTTIsIEFOQVBBUk0yX09OKTsKKworCQkJd3JpdGVfbmljX2J5dGUoZGV2LCBDT05GSUc0LCBwcml2LT5SRlByb2dUeXBlKTsKKworCQkJLy9Gb2xsb3cgODdCLCBJc2FpYWggMjAwNy0wNC0yNworCQkJdTFiVG1wID0gcmVhZF9uaWNfYnl0ZShkZXYsIDB4MjRFKTsKKwkJCXdyaXRlX25pY19ieXRlKGRldiwgMHgyNEUsICh1MWJUbXAgJiAofihCSVQ1fEJJVDYpKSkgKTsvLyAwNzAxMjQgU0QxIEFsZXg6IHR1cm4gb24gQ0NLIGFuZCBPRkRNLgorCQkJYnJlYWs7CisKKwkJY2FzZSBlUmZTbGVlcDoKKwkJCWJyZWFrOworCisJCWNhc2UgZVJmT2ZmOgorCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWJSZXN1bHQgPSBmYWxzZTsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCisJY2FzZSBSRl9aRUJSQTQ6CisJCXN3aXRjaCggZVJGUG93ZXJTdGF0ZSApCisJCXsKKwkJY2FzZSBlUmZPbjoKKwkJCS8vcHJpbnRrKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PXBvd2VyIG9uQGppZmZpZXM6JWRcbiIsamlmZmllcyk7CisJCQl3cml0ZV9uaWNfd29yZChkZXYsIDB4MzdDLCAweDAwRUMpOworCisJCQkvL3R1cm4gb24gQUZFCisJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIDB4NTQsIDB4MDApOworCQkJd3JpdGVfbmljX2J5dGUoZGV2LCAweDYyLCAweDAwKTsKKworCQkJLy9sem0gbW9kIDA4MDgyNgorCQkJLy90dXJuIG9uIFJGCisJCQkvL1JGX1dyaXRlUmVnKGRldiwgMHgwLCAweDAwOWYpOyAvL21kZWxheSgxKTsKKwkJCS8vUkZfV3JpdGVSZWcoZGV2LCAweDQsIDB4MDk3Mik7IC8vbWRlbGF5KDEpOworCQkJUkZfV3JpdGVSZWcoZGV2LCAweDAsIDB4MDA5Zik7IHVkZWxheSg1MDApOworCQkJUkZfV3JpdGVSZWcoZGV2LCAweDQsIDB4MDk3Mik7IHVkZWxheSg1MDApOworCQkJLy90dXJuIG9uIFJGIGFnYWluLCBzdWdnZXN0ZWQgYnkgU0QzIHN0ZXZlbmwuCisJCQlSRl9Xcml0ZVJlZyhkZXYsIDB4MCwgMHgwMDlmKTsgdWRlbGF5KDUwMCk7CisJCQlSRl9Xcml0ZVJlZyhkZXYsIDB4NCwgMHgwOTcyKTsgdWRlbGF5KDUwMCk7CisKKwkJCS8vdHVybiBvbiBCQgorLy8JCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBQaHlBZGRyLCAweDQwOTApOyAvL29mZG0gMTA9MDAKKy8vCQkJd3JpdGVfbmljX2R3b3JkKGRldiwgUGh5QWRkciwgMHg0MDkyKTsgLy9vZmRtIDEyPTAwCisJCQl3cml0ZV9waHlfb2ZkbShkZXYsMHgxMCwweDQwKTsKKwkJCXdyaXRlX3BoeV9vZmRtKGRldiwweDEyLDB4NDApOworCQkJLy9Bdm9pZCBwb3dlciBkb3duIGF0IGluaXQgdGltZS4KKwkJCXdyaXRlX25pY19ieXRlKGRldiwgQ09ORklHNCwgcHJpdi0+UkZQcm9nVHlwZSk7CisKKwkJCXUxYlRtcCA9IHJlYWRfbmljX2J5dGUoZGV2LCAweDI0RSk7CisJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIDB4MjRFLCAodTFiVG1wICYgKH4oQklUNXxCSVQ2KSkpICk7CisKKwkJCWJyZWFrOworCisJCWNhc2UgZVJmU2xlZXA6CisJCQkvLyBNYWtlIHN1cmUgQnVzeVF1ZXVlIGlzIGVtcHR5IGJlZm9yIHR1cm4gb2ZmIFJGRSBwd29lci4KKwkJCS8vcHJpbnRrKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PXBvd2VyIHNsZWVwQGppZmZpZXM6JWRcbiIsamlmZmllcyk7CisKKwkJCWZvcihRdWV1ZUlEID0gMCwgaSA9IDA7IFF1ZXVlSUQgPCA2OyApCisJCQl7CisJCQkJaWYoZ2V0X2N1cnJfdHhfZnJlZV9kZXNjKGRldixRdWV1ZUlEKSA9PSBwcml2LT50eHJpbmdjb3VudCkKKwkJCQl7CisJCQkJCVF1ZXVlSUQrKzsKKwkJCQkJY29udGludWU7CisJCQkJfQorI2lmIDAJCS8vcmVzZXJ2ZWQgYW15CisJCQkJZWxzZSBpZihwcml2LT5OZGlzQWRhcHRlci5DdXJyZW50UG93ZXJTdGF0ZSAhPSBOZGlzRGV2aWNlU3RhdGVEMCkKKwkJCQl7CisJCQkJCVJUX1RSQUNFKENPTVBfUE9XRVIsIERCR19MT1VELCAoImVSZlNsZWVwOiAlZCB0aW1lcyBUY2JCdXN5UXVldWVbJWRdICE9MCBidXQgbG93ZXIgcG93ZXIgc3RhdGUhXG4iLCAocE1nbnRJbmZvLT5UeFBvbGxpbmdUaW1lcysxKSwgUXVldWVJRCkpOworCQkJCQlicmVhazsKKwkJCQl9CisjZW5kaWYKKwkJCQllbHNlLy9sem0gbW9kIDA4MDgyNgorCQkJCXsKKwkJCQkJcHJpdi0+VHhQb2xsaW5nVGltZXMgKys7CisJCQkJCWlmKHByaXYtPlR4UG9sbGluZ1RpbWVzID49IExQU19NQVhfU0xFRVBfV0FJVElOR19USU1FU184N1NFKQorCQkJCQkJeworCQkJCQkJCS8vUlRfVFJBQ0UoQ09NUF9QT1dFUiwgREJHX1dBUk5JTkcsICgiXG5cblxuIFNldFplYnJhUkZQb3dlclN0YXRlODE4NUIoKTplUmZTbGVlcDogICVkIHRpbWVzIFRjYkJ1c3lRdWV1ZVslZF0gIT0gMCAhISFcblxuXG4iLCBMUFNfTUFYX1NMRUVQX1dBSVRJTkdfVElNRVNfODdTRSwgUXVldWVJRCkpOworCQkJCQkJCWJBY3Rpb25BbGxvd2VkPWZhbHNlOworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQkJZWxzZQorCQkJCQkJeworCQkJCQkJCXVkZWxheSgxMCk7ICAvLyBXaW5kb3dzIG1heSBkZWxheSAzfjE2bXMgYWN0dWFsbHkuCisJCQkJCQkJLy9SVF9UUkFDRShDT01QX1BPV0VSLCBEQkdfTE9VRCwgKCJlUmZTbGVlcDogJWQgdGltZXMgVGNiQnVzeVF1ZXVlWyVkXSAhPTAgYmVmb3JlIGRvemUhXG4iLCAocE1nbnRJbmZvLT5UeFBvbGxpbmdUaW1lcyksIFF1ZXVlSUQpKTsKKwkJCQkJCX0KKwkJCQl9CisKKwkJCQkvL2x6bSBkZWwgMDgwODI2CisJCQkJLy9pZihpID49IE1BWF9ET1pFX1dBSVRJTkdfVElNRVNfODVCKQorCQkJCS8veworCQkJCQkvL3ByaW50aygiXG5cblxuIFNldFplYnJhUkZQb3dlclN0YXRlODE4NUIoKTogJWQgdGltZXMgQnVzeVF1ZXVlWyVkXSAhPSAwICEhIVxuXG5cbiIsIE1BWF9ET1pFX1dBSVRJTkdfVElNRVNfODVCLCBRdWV1ZUlEKTsKKwkJCQkJLy9icmVhazsKKwkJCQkvL30KKwkJCX0KKworCQkJaWYoYkFjdGlvbkFsbG93ZWQpLy9sem0gYWRkIDA4MDgyNgorCQkJeworCQkJCS8vdHVybiBvZmYgQkIgUlhJUSBtYXRyaXggdG8gY3V0IG9mZiByeCBzaWduYWwKKy8vCQkJCXdyaXRlX25pY19kd29yZChkZXYsIFBoeUFkZHIsIDB4MDA5MCk7IC8vb2ZkbSAxMD0wMAorLy8JCQkJd3JpdGVfbmljX2R3b3JkKGRldiwgUGh5QWRkciwgMHgwMDkyKTsgLy9vZmRtIDEyPTAwCisJCQkJd3JpdGVfcGh5X29mZG0oZGV2LDB4MTAsMHgwMCk7CisJCQkJd3JpdGVfcGh5X29mZG0oZGV2LDB4MTIsMHgwMCk7CisJCQkJLy90dXJuIG9mZiBSRgorCQkJCVJGX1dyaXRlUmVnKGRldiwgMHg0LCAweDAwMDApOyAvL21kZWxheSgxKTsKKwkJCQlSRl9Xcml0ZVJlZyhkZXYsIDB4MCwgMHgwMDAwKTsgLy9tZGVsYXkoMSk7CisJCQkJLy90dXJuIG9mZiBBRkUgZXhjZXB0IFBMTAorCQkJCXdyaXRlX25pY19ieXRlKGRldiwgMHg2MiwgMHhmZik7CisJCQkJd3JpdGVfbmljX2J5dGUoZGV2LCAweDU0LCAweGVjKTsKKy8vCQkJCW1kZWxheSgxMCk7CisKKyNpZiAxCisJCQkJbWRlbGF5KDEpOworCQkJCXsKKwkJCQkJaW50IGkgPSAwOworCQkJCQl3aGlsZSAodHJ1ZSkKKwkJCQkJeworCQkJCQkJdTggdG1wMjRGID0gcmVhZF9uaWNfYnl0ZShkZXYsIDB4MjRmKTsKKwkJCQkJCWlmICgodG1wMjRGID09IDB4MDEpIHx8ICh0bXAyNEYgPT0gMHgwOSkpCisJCQkJCQl7CisJCQkJCQkJYlR1cm5PZmZCQiA9IHRydWU7CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCQllbHNlLy9sem0gbW9kIDA4MDgyNgorCQkJCQkJeworCQkJCQkJCXVkZWxheSgxMCk7CisJCQkJCQkJaSsrOworCQkJCQkJCXByaXYtPlR4UG9sbGluZ1RpbWVzKys7CisKKwkJCQkJCQlpZihwcml2LT5UeFBvbGxpbmdUaW1lcyA+PSBMUFNfTUFYX1NMRUVQX1dBSVRJTkdfVElNRVNfODdTRSkKKwkJCQkJCQl7CisJCQkJCQkJCS8vUlRfVFJBQ0UoQ09NUF9QT1dFUiwgREJHX1dBUk5JTkcsICgiXG5cblxuIFNldFplYnJhUkZQb3dlclN0YXRlODE4NUIoKTogZVJmT2ZmOiAlZCB0aW1lcyBSeCBNYWMweDI0Rj0weCV4ICEhIVxuXG5cbiIsIGksIHUxYlRtcDI0RikpOworCQkJCQkJCQliVHVybk9mZkJCPWZhbHNlOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQl9CisJCQkJCQkJZWxzZQorCQkJCQkJCXsKKwkJCQkJCQkJdWRlbGF5KDEwKTsvLyBXaW5kb3dzIG1heSBkZWxheSAzfjE2bXMgYWN0dWFsbHkuCisJCQkJCQkJCS8vUlRfVFJBQ0UoQ09NUF9QT1dFUiwgREJHX0xPVUQsKCIoJWQpZVJmU2xlZXAtIHUxYlRtcDI0Rj0gMHglWFxuIiwgaSwgdTFiVG1wMjRGKSk7CisKKwkJCQkJCQl9CisJCQkJCQl9CisKKwkJCQkJCS8vbHptIGRlbCAwODA4MjYKKwkJCQkJCS8vaWYgKGkgPiBNQVhfUE9MTElOR18yNEZfVElNRVNfODdTRSkKKwkJCQkJCS8vCWJyZWFrOworCQkJCQl9CisJCQkJfQorI2VuZGlmCisJCQkJaWYgKGJUdXJuT2ZmQkIpLy9sem0gbW9kIDA4MDgyNgorCQkJCXsKKwkJCQkvL3R1cm4gb2ZmIEJCCisJCQkJdTFiVG1wID0gcmVhZF9uaWNfYnl0ZShkZXYsIDB4MjRFKTsKKwkJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIDB4MjRFLCAodTFiVG1wfEJJVDV8QklUNikpOworCisJCQkJLy90dXJuIG9mZiBBRkUgUExMCisJCQkJLy93cml0ZV9uaWNfYnl0ZShkZXYsIDB4NTQsIDB4ZWMpOworCQkJCS8vd3JpdGVfbmljX3dvcmQoZGV2LCAweDM3QywgMHgwMGVjKTsKKwkJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIDB4NTQsIDB4RkMpOyAgLy9bRUNTXSBGQy0+IEVDLT5GQywgYXNrZWQgYnkgU0QzIFN0ZXZlbmwKKwkJCQl3cml0ZV9uaWNfd29yZChkZXYsIDB4MzdDLCAweDAwRkMpOy8vW0VDU10gRkMtPiBFQy0+RkMsIGFza2VkIGJ5IFNEMyBTdGV2ZW5sCisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBlUmZPZmY6CisJCQkvLyBNYWtlIHN1cmUgQnVzeVF1ZXVlIGlzIGVtcHR5IGJlZm9yIHR1cm4gb2ZmIFJGRSBwd29lci4KKwkJCS8vcHJpbnRrKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PXBvd2VyIG9mZkBqaWZmaWVzOiVkXG4iLGppZmZpZXMpOworCQkJZm9yKFF1ZXVlSUQgPSAwLCBpID0gMDsgUXVldWVJRCA8IDY7ICkKKwkJCXsKKwkJCQlpZihnZXRfY3Vycl90eF9mcmVlX2Rlc2MoZGV2LFF1ZXVlSUQpID09IHByaXYtPnR4cmluZ2NvdW50KQorCQkJCXsKKwkJCQkJUXVldWVJRCsrOworCQkJCQljb250aW51ZTsKKwkJCQl9CisjaWYgMAorCQkJCWVsc2UgaWYoQWRhcHRlci0+TmRpc0FkYXB0ZXIuQ3VycmVudFBvd2VyU3RhdGUgIT0gTmRpc0RldmljZVN0YXRlRDApCisJCQkJeworCQkJCQlSVF9UUkFDRShDT01QX1BPV0VSLCBEQkdfTE9VRCwgKCIlZCB0aW1lcyBUY2JCdXN5UXVldWVbJWRdICE9MCBidXQgbG93ZXIgcG93ZXIgc3RhdGUhXG4iLCAoaSsxKSwgUXVldWVJRCkpOworCQkJCQlicmVhazsKKwkJCQl9CisjZW5kaWYKKwkJCQllbHNlCisJCQkJeworCQkJCQl1ZGVsYXkoMTApOworCQkJCQlpKys7CisJCQkJfQorCisJCQkJaWYoaSA+PSBNQVhfRE9aRV9XQUlUSU5HX1RJTUVTXzg1QikKKwkJCQl7CisJCQkJCS8vcHJpbnRrKCJcblxuXG4gU2V0WmVicmFSRlBvd2VyU3RhdGU4MTg1QigpOiAlZCB0aW1lcyBCdXN5UXVldWVbJWRdICE9IDAgISEhXG5cblxuIiwgTUFYX0RPWkVfV0FJVElOR19USU1FU184NUIsIFF1ZXVlSUQpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisKKwkJCS8vdHVybiBvZmYgQkIgUlhJUSBtYXRyaXggdG8gY3V0IG9mZiByeCBzaWduYWwKKy8vCQkJd3JpdGVfbmljX2R3b3JkKGRldiwgUGh5QWRkciwgMHgwMDkwKTsgLy9vZmRtIDEwPTAwCisvLwkJCXdyaXRlX25pY19kd29yZChkZXYsIFBoeUFkZHIsIDB4MDA5Mik7IC8vb2ZkbSAxMj0wMAorCQkJd3JpdGVfcGh5X29mZG0oZGV2LDB4MTAsMHgwMCk7CisJCQl3cml0ZV9waHlfb2ZkbShkZXYsMHgxMiwweDAwKTsKKwkJCS8vdHVybiBvZmYgUkYKKwkJCVJGX1dyaXRlUmVnKGRldiwgMHg0LCAweDAwMDApOyAvL21kZWxheSgxKTsKKwkJCVJGX1dyaXRlUmVnKGRldiwgMHgwLCAweDAwMDApOyAvL21kZWxheSgxKTsKKwkJCS8vdHVybiBvZmYgQUZFIGV4Y2VwdCBQTEwKKwkJCXdyaXRlX25pY19ieXRlKGRldiwgMHg2MiwgMHhmZik7CisJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIDB4NTQsIDB4ZWMpOworLy8JCQltZGVsYXkoMTApOworI2lmIDEKKwkJCW1kZWxheSgxKTsKKwkJCXsKKwkJCQlpbnQgaSA9IDA7CisJCQkJd2hpbGUgKHRydWUpCisJCQkJeworCQkJCQl1OCB0bXAyNEYgPSByZWFkX25pY19ieXRlKGRldiwgMHgyNGYpOworCQkJCQlpZiAoKHRtcDI0RiA9PSAweDAxKSB8fCAodG1wMjRGID09IDB4MDkpKQorCQkJCQl7CisJCQkJCQliVHVybk9mZkJCID0gdHJ1ZTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJYlR1cm5PZmZCQiA9IGZhbHNlOworCQkJCQkJdWRlbGF5KDEwKTsKKwkJCQkJCWkrKzsKKwkJCQkJfQorCQkJCQlpZiAoaSA+IE1BWF9QT0xMSU5HXzI0Rl9USU1FU184N1NFKQorCQkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorI2VuZGlmCisJCQlpZiAoYlR1cm5PZmZCQikvL2x6bSBtb2QgMDgwODI2CisJCQl7CisKKwkJCS8vdHVybiBvZmYgQkIKKwkJCXUxYlRtcCA9IHJlYWRfbmljX2J5dGUoZGV2LCAweDI0RSk7CisJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIDB4MjRFLCAodTFiVG1wfEJJVDV8QklUNikpOworCQkJLy90dXJuIG9mZiBBRkUgUExMICg4ME0pCisJCQkvL3dyaXRlX25pY19ieXRlKGRldiwgMHg1NCwgMHhlYyk7CisJCQkvL3dyaXRlX25pY193b3JkKGRldiwgMHgzN0MsIDB4MDBlYyk7CisJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIDB4NTQsIDB4RkMpOyAvL1tFQ1NdIEZDLT4gRUMtPkZDLCBhc2tlZCBieSBTRDMgU3RldmVubAorCQkJd3JpdGVfbmljX3dvcmQoZGV2LCAweDM3QywgMHgwMEZDKTsgLy9bRUNTXSBGQy0+IEVDLT5GQywgYXNrZWQgYnkgU0QzIFN0ZXZlbmwKKwkJCX0KKworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWJSZXN1bHQgPSBmYWxzZTsKKwkJCXByaW50aygiU2V0WmVicmFSRlBvd2VyU3RhdGU4MTg1KCk6IHVua25vdyBzdGF0ZSB0byBzZXQ6IDB4JVghISFcbiIsIGVSRlBvd2VyU3RhdGUpOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJfQorCisJLy8gZGlzYWJsZSBQQVJNX0VuIGluIENvbmZpZzMKKwlidENvbmZpZzMgJj0gfihDT05GSUczX1BBUk1fRW4pOworCXdyaXRlX25pY19ieXRlKGRldiwgQ09ORklHMywgYnRDb25maWczKTsKKwkvLyBkaXNhYmxlIEVFTTAgYW5kIEVFTTEgaW4gOTM0NkNSCisJYnRDUjkzNDYgJj0gfigweEMwKTsKKwl3cml0ZV9uaWNfYnl0ZShkZXYsIENSOTM0NiwgYnRDUjkzNDYpOworCisJaWYoYlJlc3VsdCAmJiBiQWN0aW9uQWxsb3dlZCkvL2x6bSBtb2QgMDgwODI2CisJeworCQkvLyBVcGRhdGUgY3VycmVudCBSRiBzdGF0ZSB2YXJpYWJsZS4KKwkJcHJpdi0+ZVJGUG93ZXJTdGF0ZSA9IGVSRlBvd2VyU3RhdGU7CisjaWYgMAorCQlzd2l0Y2gocHJpdi0+ZVJGUG93ZXJTdGF0ZSkKKwkJeworCQljYXNlIGVSZk9mZjoKKwkJCS8vCisJCQkvL0lmIFJmIG9mZiByZWFzb24gaXMgZnJvbSBJUFMsIExlZCBzaG91bGQgYmxpbmsgd2l0aCBubyBsaW5rLCBieSBNYWRkZXN0IDA3MTAxNQorCQkJLy8KKwkJCWlmKHByaXYtPlJmT2ZmUmVhc29uPT1SRl9DSEFOR0VfQllfSVBTICkKKwkJCXsKKwkJCQlBZGFwdGVyLT5IYWxGdW5jLkxlZENvbnRyb2xIYW5kbGVyKEFkYXB0ZXIsTEVEX0NUTF9OT19MSU5LKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQkvLyBUdXJuIG9mZiBMRUQgaWYgUkYgaXMgbm90IE9OLgorCQkJCUFkYXB0ZXItPkhhbEZ1bmMuTGVkQ29udHJvbEhhbmRsZXIoQWRhcHRlciwgTEVEX0NUTF9QT1dFUl9PRkYpOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBlUmZPbjoKKwkJCS8vIFR1cm4gb24gUkYgd2UgYXJlIHN0aWxsIGxpbmtlZCwgd2hpY2ggbWlnaHQgaGFwcGVuIHdoZW4KKwkJCS8vIHdlIHF1aWNrbHkgdHVybiBvZmYgYW5kIG9uIEhXIFJGLiAyMDA2LjA1LjEyLCBieSByY25qa28uCisJCQlpZiggcE1nbnRJbmZvLT5iTWVkaWFDb25uZWN0ID09IFRSVUUgKQorCQkJeworCQkJCUFkYXB0ZXItPkhhbEZ1bmMuTGVkQ29udHJvbEhhbmRsZXIoQWRhcHRlciwgTEVEX0NUTF9MSU5LKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQkvLyBkbyBub3RoaW5nLgorCQkJYnJlYWs7CisJCX0KKyNlbmRpZgorCisJfQorCisJcHJpdi0+U2V0UkZQb3dlclN0YXRlSW5Qcm9ncmVzcyA9IGZhbHNlOworCisJcmV0dXJuIChiUmVzdWx0ICYmIGJBY3Rpb25BbGxvd2VkKSA7Cit9Cit2b2lkIHJ0bDgyMjV6NF9yZl9zbGVlcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCS8vCisJLy8gVHVybiBvZmYgUkYgcG93ZXIuCisJLy8KKwkvL3ByaW50aygiPT09PT09PT09PiVzKClcbiIsIF9fZnVuY19fKTsKKwlNZ250QWN0U2V0X1JGX1N0YXRlKGRldiwgZVJmU2xlZXAsIFJGX0NIQU5HRV9CWV9QUyk7CisJLy9tZGVsYXkoMik7CS8vRklYTUUKK30KK3ZvaWQgcnRsODIyNXo0X3JmX3dha2V1cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCS8vCisJLy8gVHVybiBvbiBSRiBwb3dlci4KKwkvLworCS8vcHJpbnRrKCI9PT09PT09PT0+JXMoKVxuIiwgX19mdW5jX18pOworCU1nbnRBY3RTZXRfUkZfU3RhdGUoZGV2LCBlUmZPbiwgUkZfQ0hBTkdFX0JZX1BTKTsKK30KKyNlbmRpZgorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwX3J0bDgyNTUuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfcnRsODI1NS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhNjI0NDQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwX3J0bDgyNTUuYwpAQCAtMCwwICsxLDE4MzggQEAKKy8qCisgIFRoaXMgaXMgcGFydCBvZiB0aGUgcnRsODE4MC1zYTI0MDAgZHJpdmVyCisgIHJlbGVhc2VkIHVuZGVyIHRoZSBHUEwgKFNlZSBmaWxlIENPUFlJTkcgZm9yIGRldGFpbHMpLgorICBDb3B5cmlnaHQgKGMpIDIwMDUgQW5kcmVhIE1lcmVsbG8gPGFuZHJlYW1ybEB0aXNjYWxpLml0PgorCisgIFRoaXMgZmlsZXMgY29udGFpbnMgcHJvZ3JhbW1pbmcgY29kZSBmb3IgdGhlIHJ0bDgyNTUKKyAgcmFkaW8gZnJvbnRlbmQuCisKKyAgKk1hbnkqIHRoYW5rcyB0byBSZWFsdGVrIENvcnAuIGZvciB0aGVpciBncmVhdCBzdXBwb3J0IQorCisqLworCisjZGVmaW5lIEJBTkRfQSAxCisjZGVmaW5lIEJBTkRfQkcgMgorCisjaW5jbHVkZSAicjgxODAuaCIKKyNpbmNsdWRlICJyODE4MF9ody5oIgorI2luY2x1ZGUgInI4MTgwX3J0bDgyNTUuaCIKKwordTMyIHJ0bDgyNTVfY2hhbltdID0geworCTAsCS8vZHVtbXkgY2hhbm5lbCAwCisJMHgxMywgLy8xCisJMHgxMTUsIC8vMgorCTB4MjE3LCAvLzMKKwkweDIxOSwgLy80CisJMHgzMWIsIC8vNQorCTB4NDFkLCAvLzYKKwkweDQxZiwgLy83CisJMHg2MjEsIC8vOAorCTB4NjIzLCAvLzkKKwkweDYyNSwgLy8xMAorCTB4NjI3LCAvLzExCisJMHg4MjksIC8vMTIKKwkweDgyYiwgLy8xMworCTB4OTJmLCAvLyAxNAorfTsKKworc3RhdGljIHNob3J0IHJ0bDgyNTVfZ2Fpbl8yR1tdPXsKKwkweDMzLCAweDE3LCAweDdjLCAweGM1LC8vLTc4CisJMHg0MywgMHgxNywgMHg3YSwgMHhjNSwvLy03NAorCTB4NTMsIDB4MTcsIDB4NzgsIDB4YzUsLy8tNzAKKwkweDYzLCAweDE3LCAweDc2LCAweGM1LC8vLTY2Cit9OworCisKK3N0YXRpYyBzaG9ydCBydGw4MjU1X2FnY1tdPXsKKwkweDEsIDB4MSwgMHgxLCAweDEsIDB4MSwgICAgICAgICAweDEsIDB4MSwgMHgxLCAweDEsIDB4MSwKKworCTB4MSwgMHgxLCAweDIsIDB4MiwgMHgzLCAgICAgICAgIDB4MywgMHg0LCAweDQsIDB4NSwgMHg1LAorCTB4NiwgMHg2LCAweDcsIDB4NywgMHg4LCAgICAgICAgIDB4OCwgMHg5LCAweDksIDB4YSwgMHhhLAorCTB4YiwgMHhiLCAweGMsIDB4YywgMHhkLCAgICAgICAgIDB4ZCwgMHhlLCAweGUsIDB4ZiwgMHhmLAorCisJMHgxMCwgMHgxMCwgMHgxMSwgMHgxMSwgMHgxMiwgICAgMHgxMiwgMHgxMywgMHgxMywgMHgxNCwgMHgxNCwKKwkweDE1LCAweDE1LCAweDE2LCAweDE2LCAweDE3LCAgICAweDE3LCAweDE4LCAweDE4LCAweDE5LCAweDE5LAorCTB4MWEsIDB4MWEsIDB4MWIsIDB4MWIsIDB4MWMsICAgIDB4MWMsIDB4MWQsIDB4MWQsIDB4MWUsIDB4MWUsCisJMHgxZiwgMHgxZiwKKworCTB4MjAsIDB4MjAsIDB4MjEsIDB4MjEsIDB4MjIsICAgIDB4MjIsIDB4MjMsIDB4MjMsIDB4MjQsIDB4MjQsCisJMHgyNSwgMHgyNSwgMHgyNiwgMHgyNiwgMHgyNywgICAgMHgyNywgMHgyOCwgMHgyOCwgMHgyOSwgMHgyOSwKKwkweDJhLCAweDJhLAorCisJMHgyYSwgMHgyYSwgMHgyYSwgMHgyYSwgMHgyYSwgICAgMHgyYSwgMHgyYSwgMHgyYSwgMHgyYSwgMHgyYSwKKwkweDJhLCAweDJhLCAweDJhLCAweDJhLCAweDJhLCAgICAweDJhLCAweDJhLCAweDJhLCAweDJhLCAweDJhLAorCTB4MmEsIDB4MmEsIDB4MmEsIDB4MmEsIDB4MmEsICAgIDB4MmEsIDB4MmEsIDB4MmEsIDB4MmEsIDB4MmEsCisJMHgyYSwgMHgyYSwgMHgyYSwgMHgyYQorCit9OworCit2b2lkIHJ0bDgyNTVfc2V0X2dhaW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc2hvcnQgZ2FpbikKK3sKKworLy8Jc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDBkLCBydGw4MjU1X2dhaW5fMkdbZ2FpbiAqIDRdKTsKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MjMsIHJ0bDgyNTVfZ2Fpbl8yR1tnYWluICogNCArIDFdKTsKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MWIsIHJ0bDgyNTVfZ2Fpbl8yR1tnYWluICogNCArIDJdKTsKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MWQsIHJ0bDgyNTVfZ2Fpbl8yR1tnYWluICogNCArIDNdKTsKKwkvL3J0bDgyMjVfc2V0X2dhaW5fdXNiKGRldiwgZ2Fpbik7Cit9CisKK3ZvaWQgd3JpdGVfcnRsODI1NV9yZWcwYyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgZDEsIHUzMiBkMiwgdTMyIGQzLCB1MzIgZDQsCit1MzIgZDUsIHUzMiBkNiwgdTMyIGQ3LCB1MzIgZDgsIHUzMiBkOSwgdTMyIGQxMCkKK3sKKwlpbnQgaSxqOworCXUxNiBvdXQsc2VsZWN0OworCXU4IGJpdDsKKwl1MzIgYmFuZ2RhdGE7CisvLwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisKKwl3cml0ZV9uaWNfd29yZChkZXYsUkZQaW5zRW5hYmxlLAorCQkocmVhZF9uaWNfd29yZChkZXYsUkZQaW5zRW5hYmxlKSB8IDB4NykpOworCisJc2VsZWN0ID0gcmVhZF9uaWNfd29yZChkZXYsIFJGUGluc1NlbGVjdCk7CisKKwl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc1NlbGVjdCwgc2VsZWN0IHwgMHg3IHwgU1dfQ09OVFJPTF9HUElPKTsKKworCW91dCA9IHJlYWRfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQpICYgMHhmZmYzOworCisJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQsIG91dCB8IEJCX0hPU1RfQkFOR19FTiApOy8vfCAweDFmZmYpOworCisJZm9yY2VfcGNpX3Bvc3RpbmcoZGV2KTsKKwl1ZGVsYXkoMik7CisKKwl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCwgb3V0KTsKKworCWZvcmNlX3BjaV9wb3N0aW5nKGRldik7CisJdWRlbGF5KDIpOworCisJZm9yKGo9MDtqPDEwO2orKykKKwl7CisJCXN3aXRjaChqKQorCQl7CisJCQljYXNlIDk6CisJCQliYW5nZGF0YSA9IGQxMCB8IDB4MGM7CisJCQlicmVhazsKKwkJCWNhc2UgODoKKwkJCWJhbmdkYXRhID0gZDk7CisJCQlicmVhazsKKwkJCWNhc2UgNzoKKwkJCWJhbmdkYXRhID0gZDg7CisJCQlicmVhazsKKwkJCWNhc2UgNjoKKwkJCWJhbmdkYXRhID0gZDc7CisJCQlicmVhazsKKwkJCWNhc2UgNToKKwkJCWJhbmdkYXRhID0gZDY7CisJCQlicmVhazsKKwkJCWNhc2UgNDoKKwkJCWJhbmdkYXRhID0gZDU7CisJCQlicmVhazsKKwkJCWNhc2UgMzoKKwkJCWJhbmdkYXRhID0gZDQ7CisJCQlicmVhazsKKwkJCWNhc2UgMjoKKwkJCWJhbmdkYXRhID0gZDM7CisJCQlicmVhazsKKwkJCWNhc2UgMToKKwkJCWJhbmdkYXRhID0gZDI7CisJCQlicmVhazsKKwkJCWNhc2UgMDoKKwkJCWJhbmdkYXRhID0gZDE7CisJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQliYW5nZGF0YT0weGJhZGMwZGU7IC8qIGF2b2lkIGdjYyBjb21wbGFpbnRzICovCisJCQlicmVhazsKKwkJfQorCisJCWZvcihpPTMxOyBpPj0wO2ktLSl7CisKKwkJCWJpdCA9IChiYW5nZGF0YSAmICgxPDxpKSkgPj4gaTsKKworCQkJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQsIGJpdCB8IG91dCk7CisJCQlmb3JjZV9wY2lfcG9zdGluZyhkZXYpOworCQkJdWRlbGF5KDEpOworCQkJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQsIGJpdCB8IG91dCB8IEJCX0hPU1RfQkFOR19DTEspOworCQkJZm9yY2VfcGNpX3Bvc3RpbmcoZGV2KTsKKwkJCXVkZWxheSgxKTsKKwkJLy8Jd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQsIGJpdCB8IG91dCB8IEJCX0hPU1RfQkFOR19DTEspOworCQkJaS0tOworCQkJYml0ID0gKGJhbmdkYXRhICYgKDE8PGkpKSA+PiBpOworCisJCQl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCwgYml0IHwgb3V0IHwgQkJfSE9TVF9CQU5HX0NMSyk7CisJCQlmb3JjZV9wY2lfcG9zdGluZyhkZXYpOworCQkJdWRlbGF5KDEpOworCQkvLwl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCwgYml0IHwgb3V0IHwgQkJfSE9TVF9CQU5HX0NMSyk7CisJCQl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCwgYml0IHwgb3V0KTsKKwkJCWZvcmNlX3BjaV9wb3N0aW5nKGRldik7CisJCQl1ZGVsYXkoMSk7CisJCX0KKwl9CisKKwl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCwgb3V0IHwgQkJfSE9TVF9CQU5HX0VOKTsKKwlmb3JjZV9wY2lfcG9zdGluZyhkZXYpOworCXVkZWxheSgxMCk7CisKKy8vCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCBvdXQgfCBCQl9IT1NUX0JBTkdfRU4pOworCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zU2VsZWN0LCBzZWxlY3QgfCBTV19DT05UUk9MX0dQSU8pOworLy8JcnRsODE4NV9yZl9waW5zX2VuYWJsZShkZXYpOworCit9CisKK3ZvaWQgd3JpdGVfcnRsODI1NShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCBhZHIsIHUxNiBkYXRhKQoreworCWludCBpOworCXUxNiBvdXQsc2VsZWN0OworCXU4IGJpdDsKKwl1MzIgYmFuZ2RhdGEgPSAoZGF0YSA8PCA0KSB8IChhZHIgJiAweGYpOworLy8Jc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCisJb3V0ID0gcmVhZF9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCkgJiAweGZmZjM7CisKKwl3cml0ZV9uaWNfd29yZChkZXYsUkZQaW5zRW5hYmxlLAorCQkocmVhZF9uaWNfd29yZChkZXYsUkZQaW5zRW5hYmxlKSB8IDB4NykpOworCisJc2VsZWN0ID0gcmVhZF9uaWNfd29yZChkZXYsIFJGUGluc1NlbGVjdCk7CisKKwl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc1NlbGVjdCwgc2VsZWN0IHwgMHg3IHwgU1dfQ09OVFJPTF9HUElPKTsKKworCWZvcmNlX3BjaV9wb3N0aW5nKGRldik7CisJdWRlbGF5KDEwKTsKKworCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCBvdXQgfCBCQl9IT1NUX0JBTkdfRU4gKTsvL3wgMHgxZmZmKTsKKworCWZvcmNlX3BjaV9wb3N0aW5nKGRldik7CisJdWRlbGF5KDIpOworCisJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQsIG91dCk7CisKKwlmb3JjZV9wY2lfcG9zdGluZyhkZXYpOworCXVkZWxheSgxMCk7CisKKworCWZvcihpPTE1OyBpPj0wO2ktLSl7CisKKwkJYml0ID0gKGJhbmdkYXRhICYgKDE8PGkpKSA+PiBpOworCisJCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCBiaXQgfCBvdXQpOworCQl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCwgYml0IHwgb3V0IHwgQkJfSE9TVF9CQU5HX0NMSyk7CisJCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCBiaXQgfCBvdXQgfCBCQl9IT1NUX0JBTkdfQ0xLKTsKKwkJaS0tOworCQliaXQgPSAoYmFuZ2RhdGEgJiAoMTw8aSkpID4+IGk7CisKKwkJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQsIGJpdCB8IG91dCB8IEJCX0hPU1RfQkFOR19DTEspOworCQl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCwgYml0IHwgb3V0IHwgQkJfSE9TVF9CQU5HX0NMSyk7CisJCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCBiaXQgfCBvdXQpOworCX0KKworCisJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQsIG91dCB8IEJCX0hPU1RfQkFOR19FTik7CisKKwlmb3JjZV9wY2lfcG9zdGluZyhkZXYpOworCXVkZWxheSgxMCk7CisKKwl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCwgb3V0IHwgQkJfSE9TVF9CQU5HX0VOKTsKKwl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc1NlbGVjdCwgc2VsZWN0IHwgU1dfQ09OVFJPTF9HUElPKTsKKworCXJ0bDgxODVfcmZfcGluc19lbmFibGUoZGV2KTsKK30KKwordm9pZCBydGw4MjU1X3JmX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisKKy8vCXJ0bDgxODBfc2V0X2FuYXBhcmFtKGRldiwgUlRMODIyNV9BTkFQQVJBTV9PRkYpOworLy8JcnRsODE4NV9zZXRfYW5hcGFyYW0yKGRldiwgUlRMODIyNV9BTkFQQVJBTTJfT0ZGKTsKK30KKwordm9pZCBydGw4MjU1X1NldFRYUG93ZXJMZXZlbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzaG9ydCBjaCkKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisKKwl1OCBjY2tfcG93ZXJfbGV2ZWwgPSAweGZmICYgcHJpdi0+Y2h0eHB3cltjaF07CisJdTggb2ZkbV9wb3dlcl9sZXZlbCA9IDB4ZmYgJiBwcml2LT5jaHR4cHdyX29mZG1bY2hdOworCXdyaXRlX25pY19ieXRlKGRldiwgVFhfR0FJTl9PRkRNLCBvZmRtX3Bvd2VyX2xldmVsKTsKKwl3cml0ZV9uaWNfYnl0ZShkZXYsIFRYX0dBSU5fQ0NLLCBjY2tfcG93ZXJfbGV2ZWwpOworCWZvcmNlX3BjaV9wb3N0aW5nKGRldik7CisJbWRlbGF5KDEpOworCS8vd3JpdGVfbmljX2J5dGUoZGV2LCBUWF9BR0NfQ09OVFJPTCw0KTsKK30KKyNpZiAwCisvKiBzd2l0Y2ggYmV0d2VlbiBtb2RlIEIgYW5kIEcgKi8KK3ZvaWQgcnRsODI1NV9zZXRfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzaG9ydCBtb2RlYikKK3sKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MTUsIChtb2RlYiA/IDB4MCA6IDB4NDApKTsKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MTcsIChtb2RlYiA/IDB4MCA6IDB4NDApKTsKK30KKyNlbmRpZgorCit2b2lkIHJ0bDgyNTVfcmZfc2V0X2NoYW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc2hvcnQgY2gpCit7CisJLy93cml0ZV9ydGw4MjI1KGRldiwgMHg3LCBydGw4MjI1X2NoYW5bMV0pOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDUsIDB4NjUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDYsIHJ0bDgyNTVfY2hhbltjaF0pOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDcsIDB4N2MpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDgsIDB4Nik7CisKKworCWZvcmNlX3BjaV9wb3N0aW5nKGRldik7CisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwlzY2hlZHVsZV90aW1lb3V0KEhaKTsKKy8vCXJ0bDgyMjVfc2V0X21vZGVfQihkZXYpOworCisJcnRsODI1NV9TZXRUWFBvd2VyTGV2ZWwoZGV2LCBjaCk7CisJLyogRklYTUUgRklYTUUgRklYTUUgKi8KKworCSNpZiAwCisJd3JpdGVfbmljX2J5dGUoZGV2LERJRlMsMHhlKTsgLy9ESUZTCisJd3JpdGVfbmljX2J5dGUoZGV2LFNMT1QsMHgxNCk7IC8vU0xPVAorCXdyaXRlX25pY19ieXRlKGRldixFSUZTLDB4NWIpOyAvLyBFSUZTCisJLy93cml0ZV9uaWNfYnl0ZShkZXYsMHhiYywwKTsgLy9DVyBDT05GSUcKKwl3cml0ZV9uaWNfYnl0ZShkZXYsMHhiZCwweGE0KTsgLy9DVyBWQUxVRQorCS8vd3JpdGVfbmljX2J5dGUoZGV2LFRYX0FHQ19DT05UUk9MLDQpOworCS8vd3JpdGVfbmljX2J5dGUoZGV2LCAweDlkLDcpOworLy9BcHIgMjAgMTM6MjU6MDMgbG9jYWxob3N0IGtlcm5lbDogdzguIDQwOWQ8LTcgIC8vIENDSyBBR0MKKwkvKndyaXRlX25pY193b3JkKGRldiwweDg0LDB4NDg4KTsKKwl3cml0ZV9uaWNfYnl0ZShkZXYsMHg5MSwweDNlKTsKKwl3cml0ZV9uaWNfYnl0ZShkZXYsMHg5MCwweDMwKTsKKwl3cml0ZV9uaWNfd29yZChkZXYsMHg4NCwweDQ4OCk7CisJd3JpdGVfbmljX2J5dGUoZGV2LDB4OTEsMHgzZSk7CisJd3JpdGVfbmljX2J5dGUoZGV2LDB4OTAsMHgyMCk7CisJKi8KKwkvL21kZWxheSgxMDApOworCSNlbmRpZgorfQorCit2b2lkIHJ0bDgyNTVfaW5pdF9CR2JhbmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4ODA3KTsKKwl3cml0ZV9ydGw4MjU1X3JlZzBjKGRldiwgMHgxNTU0LCAweGE4MDA0MDNiLCAweGY2ZDQ0Mjc4LCAweDgwNDE4N2NmLCAweDQwMDAwMDI3LAorCQkweDkyNDAyYWMwLCAweGYwMDA5LCAweDI4MDAwLCAweGMwMCwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDgwNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ZTAwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMwMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgwMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YTAwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgwMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MjYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MjcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjAwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQwMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MTAwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYwMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MDApOworCXdyaXRlX3J0bDgyNTVfcmVnMGMoZGV2LCAweDE1NTQsIDB4YTgwMDQwM2IsIDB4ZjZkNDQyNzgsIDB4ODA0MTg3Y2UsIDB4ODAwMDAwMjcsCisJCTB4OTI0MDJhYzAsIDB4ZjAwMDksIDB4MjgwMDAsIDB4YzAwLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4ODA3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMwMSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhlMDEpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzAxKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODAxKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhhMDEpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODAxKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQwMSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgyNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgyNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MDEpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDAxKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQwMSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgxMDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjAxKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQwMSk7CisJd3JpdGVfcnRsODI1NV9yZWcwYyhkZXYsIDB4MTU1NCwgMHhhODAwNDAzYiwgMHhmNmQ0NDI3OCwgMHg4MDQxOGJkZiwgMHg0MDAwMDAyNywKKwkJMHg5MjQwMmFjNCwgMHhmMDAwOSwgMHgyODAwMCwgMHhjMDAsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHg4MDcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzAyKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGUwMik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMDIpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MDIpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGEwMik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MDIpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDAyKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDI2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDI2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYwMik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MDIpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDAyKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDEwMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MDIpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDAyKTsKKwl3cml0ZV9ydGw4MjU1X3JlZzBjKGRldiwgMHgxNTU0LCAweGE4MDA0MDNiLCAweGY2ZDQ0Mjc4LCAweDgwNDE4YmJmLCAweDQwMDAwMDI3LAorCQkweDkyNDAyYWM0LCAweGYwMDA5LCAweDI4MDAwLCAweGMwMCwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDgwNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMDMpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ZTAzKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMwMyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgwMyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YTAzKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgwMyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MDMpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MjYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MjYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjAzKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQwMyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MDMpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MTAwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYwMyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MDMpOworCXdyaXRlX3J0bDgyNTVfcmVnMGMoZGV2LCAweDE1NTQsIDB4YTgwMDQwM2IsIDB4ZjZkNDQyNzgsIDB4ODA0MThiOWYsIDB4NDAwMDAwMjcsCisJCTB4OTI0MDJhYzgsIDB4ZjAwMDksIDB4MjgwMDAsIDB4YzAwLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4ODA3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMwNCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhlMDQpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzA0KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODA0KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhhMDQpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODA0KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQwNCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgyNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgyNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MDQpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDA0KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQwNCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgxMDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjA0KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQwNCk7CisJd3JpdGVfcnRsODI1NV9yZWcwYyhkZXYsIDB4MTU1NCwgMHhhODAwNDAzYiwgMHhmNmQ0NDI3OCwgMHg4MDQxODNkZiwgMHg0MDAwMDAyNywKKwkJMHg5MjQwMmFjOCwgMHhmMDAwOSwgMHgyODAwMCwgMHhjMDAsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHg4MDcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzA1KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGUwNSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMDUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MDUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGEwNSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MDUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDA1KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDI2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDI2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYwNSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MDUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDA1KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDEwMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MDUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDA1KTsKKwl3cml0ZV9ydGw4MjU1X3JlZzBjKGRldiwgMHgxNTU0LCAweGE4MDA0MDNiLCAweGY2ZDQ0Mjc4LCAweDgwNDE4M2NmLCAweDI3LAorCQkweDkyNDAyYWNjLCAweGYwMDA5LCAweDI4MDAwLCAweGMwMCwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDgwNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMDYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ZTA2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMwNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgwNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YTA2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgwNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MDYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MjUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MjYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjA2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQwNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MDYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MTAwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYwNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MDYpOworCXdyaXRlX3J0bDgyNTVfcmVnMGMoZGV2LCAweDE1NTQsIDB4YTgwMDQwM2IsIDB4ZjZkNDQyNzgsIDB4ODA0MTgzYWYsIDB4MjcsCisJCTB4OTI0MDJhY2MsIDB4ZjAwMDksIDB4MjgwMDAsIDB4YzAwLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4ODA3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMwNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhlMDcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzA3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODA3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhhMDcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODA3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQwNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgyNSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgyNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MDcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDA3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQwNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgxMDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjA3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQwNyk7CisJd3JpdGVfcnRsODI1NV9yZWcwYyhkZXYsIDB4MTU1NCwgMHhhODAwNDAzYiwgMHhmNmQ0NDI3OCwgMHg4MDQwODNkNywgMHg0MDAwMDAyNywKKwkJMHg5MjQwMmFkMCwgMHhmMDAwOSwgMHgyODAwMCwgMHhjMDAsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHg4MDcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzA4KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGUwOCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMDgpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MDgpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGEwOCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MDgpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDA4KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDI1KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDI2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYwOCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MDgpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDA4KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDEwMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MDgpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDA4KTsKKwl3cml0ZV9ydGw4MjU1X3JlZzBjKGRldiwgMHgxNTU0LCAweGE4MDA0MDNiLCAweGY2ZDQ0Mjc4LCAweDgwNDA4M2M3LCAweDI3LAorCQkweDkyNDAyYWQwLCAweGYwMDA5LCAweDI4MDAwLCAweGMwMCwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDgwNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMDkpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ZTA5KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMwOSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgwOSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YTA5KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgwOSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MDkpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MjUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MjYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjA5KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQwOSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MDkpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MTAwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYwOSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MDkpOworCXdyaXRlX3J0bDgyNTVfcmVnMGMoZGV2LCAweDE1NTQsIDB4YTgwMDQwM2IsIDB4ZjZkNDQyNzgsIDB4ODA0MDQzZDcsIDB4NDAwMDAwMjcsCisJCTB4OTI0MDJhZDQsIDB4ZjAwMDksIDB4MjgwMDAsIDB4YzAwLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4ODA3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMwYSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhlMGEpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzBhKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODBhKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhhMGEpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODBhKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQwYSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgyNSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgyNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MGEpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDBhKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQwYSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgxMDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjBhKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQwYSk7CisJd3JpdGVfcnRsODI1NV9yZWcwYyhkZXYsIDB4MTU1NCwgMHhhODAwNDAzYiwgMHhmNmQ0NDI3OCwgMHg4MDQwNDNkNywgMHg0MDAwMDAyNywKKwkJMHg5MjQwMmFkNCwgMHhmMDAwOSwgMHgyODAwMCwgMHhjMDAsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHg4MDcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzBiKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGUwYik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMGIpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MGIpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGEwYik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MGIpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDBiKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDI1KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDI2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYwYik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MGIpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDBiKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDEwMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MGIpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDBiKTsKKwl3cml0ZV9ydGw4MjU1X3JlZzBjKGRldiwgMHgxNTU0LCAweGE4MDA0MDNiLCAweGY2ZDQ0Mjc4LCAweDgwNDA0M2M3LCAweDI3LAorCQkweDkyNDAyYWQ4LCAweGYwMDA5LCAweDI4MDAwLCAweGMwMCwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDgwNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMGMpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ZTBjKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMwYyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgwYyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YTBjKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgwYyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MGMpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MjUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MjYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjBjKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQwYyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MGMpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MTAwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYwYyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MGMpOworCXdyaXRlX3J0bDgyNTVfcmVnMGMoZGV2LCAweDE1NTQsIDB4YTgwMDQwM2IsIDB4ZjZkNDQyNzgsIDB4ODA0MDQzYTcsIDB4MjcsCisJCTB4OTI0MDJhZDgsIDB4ZjAwMDksIDB4MjgwMDAsIDB4YzAwLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4ODA3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMwZCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhlMGQpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzBkKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODBkKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhhMGQpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODBkKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQwZCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgyNSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgyNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MGQpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDBkKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQwZCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgxMDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjBkKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQwZCk7CisJd3JpdGVfcnRsODI1NV9yZWcwYyhkZXYsIDB4MTU1NCwgMHhhODAwNDAzYiwgMHhmNmQ0NDI3OCwgMHg4MDQwNDM4NywgMHgyNywKKwkJMHg5MjQwMmFhOCwgMHhmMDAwOSwgMHgyODAwMCwgMHhjMDAsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHg4MDcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzBlKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGUwZSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMGUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MGUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGEwZSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MGUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDBlKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDI1KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDI2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYwZSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MGUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDBlKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDEwMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MGUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDBlKTsKKwl3cml0ZV9ydGw4MjU1X3JlZzBjKGRldiwgMHgxNTU0LCAweGE4MDA0MDNiLCAweGY2ZDQ0Mjc4LCAweDgwNDA0MWM3LCAweDI3LAorCQkweDkyNDAyYWE4LCAweGYwMDA5LCAweDI4MDAwLCAweGMwMCwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDgwNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMGYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ZTBmKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMwZik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgwZik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YTBmKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgwZik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MGYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MjUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MjYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjBmKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQwZik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MGYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MTAwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYwZik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MGYpOworCXdyaXRlX3J0bDgyNTVfcmVnMGMoZGV2LCAweDE1NTQsIDB4YTgwMDQwM2IsIDB4ZjZkNDQyNzgsIDB4ODA0MDQxYTcsIDB4MjcsCisJCTB4OTI0MDJhYWMsIDB4ZjAwMDksIDB4MjgwMDAsIDB4YzAwLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4ODA3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMxMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhlMTApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzEwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODEwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhhMTApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODEwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQxMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgyNSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgyNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MTApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDEwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQxMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgxMDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjEwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQxMCk7CisJd3JpdGVfcnRsODI1NV9yZWcwYyhkZXYsIDB4MTU1NCwgMHhhODAwNDAzYiwgMHhmNmQ0NDI3OCwgMHg4MDQwNDE4NywgMHgyNywKKwkJMHg5MjQwMmFhYywgMHhmMDAwOSwgMHgyODAwMCwgMHhjMDAsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHg4MDcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzExKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGUxMSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMTEpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MTEpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGExMSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MTEpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDExKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDI1KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDI2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYxMSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MTEpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDExKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDEwMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MTEpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDExKTsKKwl3cml0ZV9ydGw4MjU1X3JlZzBjKGRldiwgMHgxNTU0LCAweGE4MDA0MDNiLCAweGY2ZDQ0Mjc4LCAweDgwNDA0MTg2LCAweDgwMDAwMDI3LAorCQkweDkyNDAyYWIwLCAweGYwMDA5LCAweDI4MDAwLCAweGMwMCwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDgwNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMTIpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ZTEyKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMxMik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgxMik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YTEyKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgxMik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MTIpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MjUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MjYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjEyKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQxMik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MTIpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MTAwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYxMik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MTIpOworCXdyaXRlX3J0bDgyNTVfcmVnMGMoZGV2LCAweDE1NTQsIDB4YTgwMDQwM2IsIDB4ZjZkNDQyNzgsIDB4ODA0MDQxODYsIDB4MjcsCisJCTB4OTI0MDJhYjAsIDB4ZjAwMDksIDB4MjgwMDAsIDB4YzAwLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4ODA3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMxMyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhlMTMpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzEzKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODEzKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhhMTMpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODEzKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQxMyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgyNSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgyNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MTMpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDEzKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQxMyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgxMDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjEzKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQxMyk7CisJd3JpdGVfcnRsODI1NV9yZWcwYyhkZXYsIDB4MTU1NCwgMHhhODAwNDAzYiwgMHhmNmQ0NDI3OCwgMHg4MDQwNDE0NiwgMHgyNywKKwkJMHg5MjQwMmFiNCwgMHhmMDAwOSwgMHgyODAwMCwgMHhjMDAsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHg4MDcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzE0KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGUxNCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMTQpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MTQpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGExNCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MTQpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDE0KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDI1KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDI2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYxNCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MTQpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDE0KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDEwMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MTQpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDE0KTsKKwl3cml0ZV9ydGw4MjU1X3JlZzBjKGRldiwgMHgxNTU0LCAweGE4MDA0MDNiLCAweGY2ZDQ0Mjc4LCAweDgwNDA0MTI2LCAweDI3LAorCQkweDkyNDAyYWI0LCAweGYwMDA5LCAweDI4MDAwLCAweGMwMCwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDgwNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMTUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ZTE1KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMxNSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgxNSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YTE1KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgxNSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MTUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MjUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MjYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjE1KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQxNSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MTUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MTAwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYxNSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MTUpOworCXdyaXRlX3J0bDgyNTVfcmVnMGMoZGV2LCAweDE1NTQsIDB4YTgwMDQwM2IsIDB4ZjZkNDQyNzgsIDB4ODA0MDQxMDYsIDB4MjcsCisJCTB4OTI0MDJhYjgsIDB4ZjAwMDksIDB4MjgwMDAsIDB4YzAwLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4ODA3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMxNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhlMTYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzE2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODE2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhhMTYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODE2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQxNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgyNSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgyNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MTYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDE2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQxNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgxMDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjE2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQxNik7CisJd3JpdGVfcnRsODI1NV9yZWcwYyhkZXYsIDB4MTU1NCwgMHhhODAwNDAzYiwgMHhmNmQ0NDI3OCwgMHg4MDQwNDEwNSwgMHgyNywKKwkJMHg5MjQwMmFiOCwgMHhmMDAwOSwgMHgyODAwMCwgMHhjMDAsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHg4MDcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzE3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGUxNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMTcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MTcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGExNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MTcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDE3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDI1KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDI2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYxNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MTcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDE3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDEwMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MTcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDE3KTsKKwl3cml0ZV9ydGw4MjU1X3JlZzBjKGRldiwgMHgxNTU0LCAweGE4MDA0MDNiLCAweGY2ZDQ0Mjc4LCAweDgwNDA0MTA0LCAweDgwMDAwMDI3LAorCQkweDkyNDAyYTg4LCAweGYwMDA5LCAweDI4MDAwLCAweGMwMCwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDgwNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMTgpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ZTE4KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMxOCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgxOCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YTE4KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgxOCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MTgpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MjUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MjYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjE4KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQxOCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MTgpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MTAwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYxOCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MTgpOworCXdyaXRlX3J0bDgyNTVfcmVnMGMoZGV2LCAweDE1NTQsIDB4YTgwMDQwM2IsIDB4ZjZkNDQyNzgsIDB4ODA0MDQxMDQsIDB4MjcsCisJCTB4OTI0MDJhODgsIDB4ZjAwMDksIDB4MjgwMDAsIDB4YzAwLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4ODA3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMxOSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhlMTkpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzE5KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODE5KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhhMTkpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODE5KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQxOSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgyNSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgyNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MTkpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDE5KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQxOSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgxMDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjE5KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQxOSk7CisJd3JpdGVfcnRsODI1NV9yZWcwYyhkZXYsIDB4MTU1NCwgMHhhODAwNDAzYiwgMHhmNmQ0NDI3OCwgMHg4MDQwNDA0NCwgMHgyNywKKwkJMHg5MjQwMmE4YywgMHhmMDAwOSwgMHgyODAwMCwgMHhjMDAsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHg4MDcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzFhKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGUxYSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMWEpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MWEpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGExYSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MWEpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDFhKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDI1KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDI2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYxYSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MWEpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDFhKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDEwMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MWEpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDFhKTsKKwl3cml0ZV9ydGw4MjU1X3JlZzBjKGRldiwgMHgxNTU0LCAweGE4MDA0MDNiLCAweGY2ZDQ0Mjc4LCAweDgwNDA0MDI0LCAweDI3LAorCQkweDkyNDAyYThjLCAweGYwMDA5LCAweDI4MDAwLCAweGMwMCwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDgwNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMWIpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ZTFiKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMxYik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgxYik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YTFiKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgxYik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MWIpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MjUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MjYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjFiKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQxYik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MWIpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MTAwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYxYik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MWIpOworCXdyaXRlX3J0bDgyNTVfcmVnMGMoZGV2LCAweDE1NTQsIDB4YTgwMDQwM2IsIDB4ZjZkNDQyNzgsIDB4ODA0MDQwMDQsIDB4MjcsCisJCTB4OTI0MDJhOTAsIDB4ZjAwMDksIDB4MjgwMDAsIDB4YzAwLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4ODA3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMxYyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhlMWMpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzFjKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODFjKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhhMWMpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODFjKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQxYyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgyNSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgyNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MWMpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDFjKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQxYyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgxMDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjFjKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQxYyk7CisJd3JpdGVfcnRsODI1NV9yZWcwYyhkZXYsIDB4MTU1NCwgMHhhODAwNDAzYiwgMHhmNmQ0NDI3OCwgMHg4MDQwNDAwMSwgMHgyNywKKwkJMHg5MjQwMmE5MCwgMHhmMDAwOSwgMHgyODAwMCwgMHhjMDAsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHg4MDcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzFkKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGUxZCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMWQpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MWQpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGExZCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MWQpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDFkKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDI1KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDI2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYxZCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MWQpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDFkKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDEwMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MWQpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDFkKTsKKwl3cml0ZV9ydGw4MjU1X3JlZzBjKGRldiwgMHgxNTU0LCAweGE4MDA0MDNiLCAweGY2ZDQ0Mjc4LCAweDgwNDA0MDAwLCAweDgwMDAwMDI3LAorCQkweDkyNDAyYTk0LCAweGYwMDA5LCAweDI4MDAwLCAweGMwMCwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDgwNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMWUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ZTFlKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMxZSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgxZSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YTFlKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgxZSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MWUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MjUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MjYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjFlKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQxZSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MWUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MTAwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYxZSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MWUpOworCXdyaXRlX3J0bDgyNTVfcmVnMGMoZGV2LCAweDE1NTQsIDB4YTgwMDQwM2IsIDB4ZjZkNDQyNzgsIDB4ODA0MDQwMDAsIDB4MjcsCisJCTB4OTI0MDJhOTQsIDB4ZjAwMDksIDB4MjgwMDAsIDB4YzAwLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4ODA3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMxZik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhlMWYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzFmKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODFmKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhhMWYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODFmKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQxZik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgyNSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgyNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MWYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDFmKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQxZik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgxMDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjFmKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQxZik7CisJd3JpdGVfcnRsODI1NV9yZWcwYyhkZXYsIDB4MTU1NCwgMHhhODAwNDAzYiwgMHhmNmQ0NDI3OCwgMHg4MDQwNDAyMCwgMHg4MDAwMDAyNywKKwkJMHg5MjQwMmE5OCwgMHhmODAwOSwgMHgyODAwMCwgMHhjMDAsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHg4MDcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzIwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGUyMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMjApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MjApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGEyMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MjApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDIwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDI1KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDI2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYyMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MjApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDIwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDEwMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MjApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDIwKTsKKwl3cml0ZV9ydGw4MjU1X3JlZzBjKGRldiwgMHgxNTU0LCAweGE4MDA0MDNiLCAweGY2ZDQ0Mjc4LCAweDgwNDA0MDIwLCAweDI3LAorCQkweDkyNDAyYTk4LCAweGY4MDA5LCAweDI4MDAwLCAweGMwMCwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDgwNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMjEpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ZTIxKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMyMSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgyMSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YTIxKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgyMSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MjEpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MjUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MjYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjIxKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQyMSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MjEpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MTAwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYyMSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MjEpOworCXdyaXRlX3J0bDgyNTVfcmVnMGMoZGV2LCAweDE1NTQsIDB4YTgwMDQwM2IsIDB4ZjZkNDQyNzgsIDB4ODA0MDQwMDAsIDB4ODAwMDAwMjcsCisJCTB4OTI0MDJhNjgsIDB4ZjAwMDksIDB4MTAwMjgwMDAsIDB4YzAwLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4ODA3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMyMik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhlMjIpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzIyKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODIyKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhhMjIpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODIyKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQyMik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgyNSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgyNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MjIpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDIyKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQyMik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgxMDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjIyKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQyMik7CisJd3JpdGVfcnRsODI1NV9yZWcwYyhkZXYsIDB4MTU1NCwgMHhhODAwNDAzYiwgMHhmNmQ0NDI3OCwgMHg4MDQwNDAxMCwgMHg4MDAwMDAyNywKKwkJMHg5MjQwMmE2OCwgMHhmMDAwOSwgMHgyMDAyODAwMCwgMHhjMDAsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHg4MDcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzIzKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGUyMyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMjMpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MjMpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGEyMyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MjMpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDIzKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDI1KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDI2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYyMyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MjMpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDIzKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDEwMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MjMpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDIzKTsKKwl3cml0ZV9ydGw4MjU1X3JlZzBjKGRldiwgMHgxNTU0LCAweGE4MDA0MDNiLCAweGY2ZDQ0Mjc4LCAweDgwNDA0MDEwLCAweDgwMDAwMDI3LAorCQkweDkyNDAyYTZjLCAweGYwMDA5LCAweDMwMDI4MDAwLCAweGMwMCwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDgwNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMjQpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ZTI0KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMyNCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgyNCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YTI0KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgyNCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MjQpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MjUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MjYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjI0KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQyNCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MjQpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MTAwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYyNCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MjQpOworCXdyaXRlX3J0bDgyNTVfcmVnMGMoZGV2LCAweDE1NTQsIDB4YTgwMDQwM2IsIDB4ZjZkNDQyNzgsIDB4ODA0MDQwMTAsIDB4ODAwMDAwMjcsCisJCTB4OTI0MDJhNmMsIDB4ZjAwMDksIDB4NDAwMjgwMDAsIDB4YzAwLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4ODA3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMyNSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhlMjUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzI1KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODI1KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhhMjUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODI1KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQyNSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgyNSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgyNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MjUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDI1KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQyNSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgxMDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjI1KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQyNSk7CisJd3JpdGVfcnRsODI1NV9yZWcwYyhkZXYsIDB4MTU1NCwgMHhhODAwNDAzYiwgMHhmNmQ0NDI3OCwgMHg4MDQwNDAwMCwgMHg4MDAwMDAyNywKKwkJMHg5MjQwMmE3MCwgMHhmMDAwOSwgMHg2MDAyODAwMCwgMHhjMDAsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHg4MDcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzI2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGUyNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMjYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MjYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGEyNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MjYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDI2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDI1KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDI2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYyNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MjYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDI2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDEwMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MjYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDI2KTsKKwl3cml0ZV9ydGw4MjU1X3JlZzBjKGRldiwgMHgxNTU0LCAweGE4MDA0MDNiLCAweGY2ZDQ0Mjc4LCAweDgwNDA0MDMxLCAweDQwMDAwMDI3LAorCQkweDkyNDAyYTcwLCAweGYwMDExLCAweDYwMDI4MDAwLCAweGMwMCwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDgwNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMjcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ZTI3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMyNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgyNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YTI3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgyNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MjcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MjUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MjYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjI3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQyNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MjcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MTAwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYyNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MjcpOworCXdyaXRlX3J0bDgyNTVfcmVnMGMoZGV2LCAweDE1NTQsIDB4YTgwMDQwM2IsIDB4ZjZkNDQyNzgsIDB4ODA0MDQwMTEsIDB4NDAwMDAwMjcsCisJCTB4OTI0MDJhNzQsIDB4ZjAwMTEsIDB4NjAwMjgwMDAsIDB4YzAwLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4ODA3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMyOCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhlMjgpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzI4KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODI4KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhhMjgpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODI4KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQyOCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgyNSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgyNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MjgpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDI4KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQyOCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgxMDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjI4KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQyOCk7CisJd3JpdGVfcnRsODI1NV9yZWcwYyhkZXYsIDB4MTU1NCwgMHhhODAwNDAzYiwgMHhmNmQ0NDI3OCwgMHg4MDQwNDAxMCwgMHhjMDAwMDAyNywKKwkJMHg5MjQwMmE3NCwgMHhmMDAxMSwgMHg2MDAyODAwMCwgMHhjMDAsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHg4MDcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzI5KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGUyOSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMjkpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MjkpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGEyOSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MjkpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDI5KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDI1KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDI2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYyOSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MjkpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDI5KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDEwMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MjkpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDI5KTsKKwl3cml0ZV9ydGw4MjU1X3JlZzBjKGRldiwgMHgxNTU0LCAweGE4MDA0MDNiLCAweGY2ZDQ0Mjc4LCAweDgwNDA0MDAwLCAweDgwMDAwMDI3LAorCQkweDkyNDAyYTc4LCAweGYwMDExLCAweDYwMDI4MDAwLCAweGMwMCwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDgwNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMmEpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ZTJhKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMyYSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgyYSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YTJhKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgyYSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MmEpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MjQpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MjYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjJhKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQyYSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MmEpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MTAwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYyYSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MmEpOworCXdyaXRlX3J0bDgyNTVfcmVnMGMoZGV2LCAweDE1NTQsIDB4YTgwMDQwM2IsIDB4ZjZkNDQyNzgsIDB4ODA0MDQwMDAsIDB4ODAwMDAwMjcsCisJCTB4OTI0MDJhNzgsIDB4ZjAwMTEsIDB4NzAwMjgwMDAsIDB4YzAwLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4ODA3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMyYik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhlMmIpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzJiKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODJiKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhhMmIpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODJiKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQyYik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgyNCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgyNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MmIpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDJiKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQyYik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgxMDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjJiKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQyYik7CisJd3JpdGVfcnRsODI1NV9yZWcwYyhkZXYsIDB4MTU1NCwgMHhhODAwNDAzYiwgMHhmNmQ0NDI3OCwgMHg4MDQwNDAwMCwgMHg4MDAwMDAyNywKKwkJMHg5MjQwMmE0OCwgMHhmMDAxOSwgMHg3MDAyODAwMCwgMHhjMDAsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHg4MDcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzJjKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGUyYyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMmMpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MmMpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGEyYyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MmMpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDJjKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDI0KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDI2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYyYyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MmMpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDJjKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDEwMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MmMpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDJjKTsKKwl3cml0ZV9ydGw4MjU1X3JlZzBjKGRldiwgMHgxNTU0LCAweGE4MDA0MDNiLCAweGY2ZDQ0Mjc4LCAweDgwNDA0MDAwLCAweDgwMDAwMDI3LAorCQkweDkyNDAyYTQ4LCAweGY4MDE5LCAweDcwMDI4MDAwLCAweGMwMCwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDgwNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMmQpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ZTJkKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMyZCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgyZCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YTJkKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgyZCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MmQpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MjQpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MjYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjJkKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQyZCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MmQpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MTAwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYyZCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MmQpOworCXdyaXRlX3J0bDgyNTVfcmVnMGMoZGV2LCAweDE1NTQsIDB4YTgwMDQwM2IsIDB4ZjZkNDQyNzgsIDB4ODA0MDQwMDAsIDB4ODAwMDAwMjcsCisJCTB4OTI0MDJhNGMsIDB4ZjgwMTksIDB4NzAwMjgwMDAsIDB4YzAwLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4ODA3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMyZSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhlMmUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzJlKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODJlKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhhMmUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODJlKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQyZSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgyNCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgyNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MmUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDJlKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQyZSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgxMDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjJlKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQyZSk7CisJd3JpdGVfcnRsODI1NV9yZWcwYyhkZXYsIDB4MTU1NCwgMHhhODAwNDAzYiwgMHhmNmQ0NDI3OCwgMHg4MDQwNDAwMCwgMHg4MDAwMDAyNywKKwkJMHg5MjQwMmE0YywgMHhmODAxOSwgMHg3MDAyODAwMCwgMHhjMDAsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHg4MDcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzJmKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGUyZik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMmYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MmYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGEyZik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MmYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDJmKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDI0KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDI2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYyZik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MmYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDJmKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDEwMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MmYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDJmKTsKKwl3cml0ZV9ydGw4MjU1X3JlZzBjKGRldiwgMHgxNTU0LCAweGE4MDA0MDNiLCAweGY2ZDQ0Mjc4LCAweDgwNDA0MDAwLCAweDgwMDAwMDI3LAorCQkweDkyNDAyYTUwLCAweGY4MDE5LCAweDcwMDI4MDAwLCAweGMwMCwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDgwNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMzApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ZTMwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMzMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgzMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YTMwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgzMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MzApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MjQpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MjYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjMwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQzMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MzApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MTAwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYzMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MzApOworCXdyaXRlX3J0bDgyNTVfcmVnMGMoZGV2LCAweDE1NTQsIDB4YTgwMDQwM2IsIDB4ZjZkNDQyNzgsIDB4ODA0MDQwMDAsIDB4ODAwMDAwMjcsCisJCTB4OTI0MDJhNTAsIDB4ZjgwMTksIDB4NzAwMjgwMDAsIDB4YzAwLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4ODA3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMzMSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhlMzEpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzMxKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODMxKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhhMzEpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODMxKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQzMSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgyNCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgyNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MzEpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDMxKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQzMSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgxMDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjMxKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQzMSk7CisJd3JpdGVfcnRsODI1NV9yZWcwYyhkZXYsIDB4MTU1NCwgMHhhODAwNDAzYiwgMHhmNmQ0NDI3OCwgMHg4MDQwNDAwMCwgMHg4MDAwMDAyNywKKwkJMHg5MjQwMmE1NCwgMHhmODAxOSwgMHg3MDAyODAwMCwgMHhjMDAsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHg4MDcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzMyKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGUzMik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMzIpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MzIpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGEzMik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MzIpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDMyKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDI0KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDI2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYzMik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MzIpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDMyKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDEwMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MzIpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDMyKTsKKwl3cml0ZV9ydGw4MjU1X3JlZzBjKGRldiwgMHgxNTU0LCAweGE4MDA0MDNiLCAweGY2ZDQ0Mjc4LCAweDgwNDA0MDAwLCAweDgwMDAwMDI3LAorCQkweDkyNDAyYTU0LCAweGY4MDE5LCAweDcwMDI4MDAwLCAweGMwMCwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDgwNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMzMpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ZTMzKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMzMyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgzMyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YTMzKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgzMyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MzMpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MjQpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MjYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjMzKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQzMyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MzMpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MTAwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYzMyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MzMpOworCXdyaXRlX3J0bDgyNTVfcmVnMGMoZGV2LCAweDE1NTQsIDB4YTgwMDQwM2IsIDB4ZjZkNDQyNzgsIDB4ODA0MDQwMDAsIDB4ODAwMDAwMjcsCisJCTB4OTI0MDJhNTgsIDB4ZjgwMTksIDB4NzAwMjgwMDAsIDB4YzAwLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4ODA3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMzNCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhlMzQpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzM0KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODM0KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhhMzQpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODM0KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQzNCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgyNCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgyNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MzQpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDM0KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQzNCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgxMDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjM0KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQzNCk7CisJd3JpdGVfcnRsODI1NV9yZWcwYyhkZXYsIDB4MTU1NCwgMHhhODAwNDAzYiwgMHhmNmQ0NDI3OCwgMHg4MDQwNDAwMCwgMHg4MDAwMDAyNywKKwkJMHg5MjQwMmE1OCwgMHhmODAxOSwgMHg3MDAyODAwMCwgMHhjMDAsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHg4MDcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzM1KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGUzNSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMzUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MzUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGEzNSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MzUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDM1KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDI0KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDI2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYzNSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MzUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDM1KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDEwMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MzUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDM1KTsKKwl3cml0ZV9ydGw4MjU1X3JlZzBjKGRldiwgMHgxNTU0LCAweGE4MDA0MDNiLCAweGY2ZDQ0Mjc4LCAweDgwNDA0MDAwLCAweDgwMDAwMDI3LAorCQkweDkyNDAyYTI0LCAweGY4MDE5LCAweDcwMDI4MDAwLCAweGMwMCwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDgwNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMzYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ZTM2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMzNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgzNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YTM2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgzNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MzYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MjQpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MjUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjM2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQzNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MzYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MTAwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYzNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MzYpOworCXdyaXRlX3J0bDgyNTVfcmVnMGMoZGV2LCAweDE1NTQsIDB4YTgwMDQwM2IsIDB4ZjZkNDQyNzgsIDB4ODA0MDQwMDAsIDB4ODAwMDAwMjcsCisJCTB4OTI0MDJhMjQsIDB4ZjgwMTksIDB4NzAwMjgwMDAsIDB4YzAwLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4ODA3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMzNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhlMzcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzM3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODM3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhhMzcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODM3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQzNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgyNCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgyNSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MzcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDM3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQzNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgxMDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjM3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQzNyk7CisJd3JpdGVfcnRsODI1NV9yZWcwYyhkZXYsIDB4MTU1NCwgMHhhODAwNDAzYiwgMHhmNmQ0NDI3OCwgMHg4MDQwNDAwMCwgMHg4MDAwMDAyNywKKwkJMHg5MjQwMmEyOCwgMHhmODAxOSwgMHg3MDAyODAwMCwgMHhjMDAsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHg4MDcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzM4KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGUzOCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMzgpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MzgpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGEzOCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MzgpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDM4KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDI0KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDI1KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYzOCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MzgpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDM4KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDEwMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MzgpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDM4KTsKKwl3cml0ZV9ydGw4MjU1X3JlZzBjKGRldiwgMHgxNTU0LCAweGE4MDA0MDNiLCAweGY2ZDQ0Mjc4LCAweDgwNDA0MDAwLCAweDgwMDAwMDI3LAorCQkweDkyNDAyYTI4LCAweGY4MDE5LCAweDcwMDI4MDAwLCAweGMwMCwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDgwNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMzkpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ZTM5KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMzOSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgzOSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YTM5KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgzOSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MzkpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MjQpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MjUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjM5KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQzOSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MzkpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MTAwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYzOSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MzkpOworCXdyaXRlX3J0bDgyNTVfcmVnMGMoZGV2LCAweDE1NTQsIDB4YTgwMDQwM2IsIDB4ZjZkNDQyNzgsIDB4ODA0MDQwMDAsIDB4ODAwMDAwMjcsCisJCTB4OTI0MDJhMDAsIDB4ZjgwMTksIDB4NzAwMjgwMDAsIDB4YzAwLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4ODA3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMzYSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhlM2EpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzNhKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODNhKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhhM2EpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODNhKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQzYSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjNhKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQzYSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0M2EpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MTAwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYzYSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0M2EpOworCXdyaXRlX3J0bDgyNTVfcmVnMGMoZGV2LCAweDE1NTQsIDB4YTgwMDQwM2IsIDB4ZjZkNDQyNzgsIDB4ODA0MDQwMDAsIDB4ODAwMDAwMjcsCisJCTB4OTI0MDJhMDAsIDB4ZjgwMTksIDB4NzAwMjgwMDAsIDB4YzAwLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4ODA3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMzYik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhlM2IpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzNiKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODNiKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhhM2IpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODNiKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQzYik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjNiKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQzYik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0M2IpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MTAwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYzYik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0M2IpOworCXdyaXRlX3J0bDgyNTVfcmVnMGMoZGV2LCAweDE1NTQsIDB4YTgwMDQwM2IsIDB4ZjZkNDQyNzgsIDB4ODA0MDQwMDAsIDB4ODAwMDAwMjcsCisJCTB4OTI0MDJhMDAsIDB4ZjgwMTksIDB4NzAwMjgwMDAsIDB4YzAwLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4ODA3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMzYyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhlM2MpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzNjKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODNjKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhhM2MpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODNjKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQzYyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjNjKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQzYyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0M2MpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MTAwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYzYyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0M2MpOworCXdyaXRlX3J0bDgyNTVfcmVnMGMoZGV2LCAweDE1NTQsIDB4YTgwMDQwM2IsIDB4ZjZkNDQyNzgsIDB4ODA0MDQwMDAsIDB4ODAwMDAwMjcsCisJCTB4OTI0MDJhMDAsIDB4ZjgwMTksIDB4NzAwMjgwMDAsIDB4YzAwLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4ODA3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMzZCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhlM2QpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzNkKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODNkKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhhM2QpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODNkKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQzZCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjNkKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQzZCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0M2QpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MTAwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYzZCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0M2QpOworCXdyaXRlX3J0bDgyNTVfcmVnMGMoZGV2LCAweDE1NTQsIDB4YTgwMDQwM2IsIDB4ZjZkNDQyNzgsIDB4ODA0MDQwMDAsIDB4ODAwMDAwMjcsCisJCTB4OTI0MDJhMDAsIDB4ZjgwMTksIDB4NzAwMjgwMDAsIDB4YzAwLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4ODA3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMzZSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhlM2UpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzNlKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODNlKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhhM2UpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODNlKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQzZSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjNlKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQzZSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0M2UpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MTAwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYzZSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0M2UpOworCXdyaXRlX3J0bDgyNTVfcmVnMGMoZGV2LCAweDE1NTQsIDB4YTgwMDQwM2IsIDB4ZjZkNDQyNzgsIDB4ODA0MDQwMDAsIDB4ODAwMDAwMjcsCisJCTB4OTI0MDJhMDAsIDB4ZjgwMTEsIDB4NzAwMjgwMDAsIDB4YzAwLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4ODA3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMzZik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhlM2YpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzNmKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODNmKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhhM2YpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODNmKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQzZik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjNmKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQzZik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0M2YpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MTAwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYzZik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0M2YpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1X3JlZzBjKGRldiwgMHgzNTM5LCAweDcwMDAwYzAzLCAweGZlZjQ2MTc4LCAweDQwODAwMCwgMHg0MDMzMDcsCisJCTB4OTI0ZjgwYzAsIDB4Zjk1NWMsIDB4ODQwMCwgMHg0MjkyMDAsIDB4MWNlMjApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4MWM3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDI2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDI3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDQ3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDk4Yyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NSwgMHg2NSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NiwgMHgxMyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NywgMHg3Yyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4OCwgMHg2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg4LCAweDcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDgsIDB4Nik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4OSwgMHhjZTIpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweGIsIDB4MWM1KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHhkLCAweGQ3Zik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4ZSwgMHgzNjkpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweGEsIDB4ZDU2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHhhLCAweGQ1Nyk7CisJbWRlbGF5KDIwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHhkLCAweGQ3ZSk7CisKK30KKworCit2b2lkIHJ0bDgyNTVfc2V0X2JhbmRfcGFyYW0oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc2hvcnQgYmFuZCkKK3sKKwlpZihiYW5kICE9IEJBTkRfQSl7CisJCXdyaXRlX25pY19kd29yZChkZXYsIDB4OTQsIDB4M2RjMDAwMDIpOworCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCAweDg4LCAweDAwMTAwMDQwKTsKKworCQl3cml0ZV9waHlfY2NrKGRldiwgMHgxMywgMHhkMCk7CisKKwkJd3JpdGVfcGh5X2NjayhkZXYsIDB4NDEsIDB4OWQpOworCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCAweDhjLCAweDAwMDgyMjA1KTsKKwkJd3JpdGVfbmljX2J5dGUoZGV2LCAweGI0LCAweDY2KTsKKwl9Cit9CisKK3ZvaWQgcnRsODI1NV9yZl9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCWludCBpOworCXUxNiBicnNyOworLy8Jc2hvcnQgY2hhbm5lbCAvKj0gcHJpdi0+Y2hhbiovID0gMTsKKwlwcml2LT5jaGFuID0gMTsKKworCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCAweDgwKTsKKwl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc1NlbGVjdCwgMHg4MCB8IFNXX0NPTlRST0xfR1BJTyk7CisJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNFbmFibGUsIDB4ODApOworCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zU2VsZWN0LCBTV19DT05UUk9MX0dQSU8pOworCisJd3JpdGVfbmljX2R3b3JkKGRldiwgUkZfVElNSU5HLCAweDAwMGY4MDBmKTsKKworCWJyc3IgPSByZWFkX25pY193b3JkKGRldiwgQlJTUik7CisKKwl3cml0ZV9uaWNfd29yZChkZXYsIDB4MmMsIDB4ZmZmZik7CisKKworCXJ0bDgxODBfc2V0X2FuYXBhcmFtKGRldiwgUlRMODI1NV9BTkFQQVJBTV9PTik7CisJcnRsODE4NV9zZXRfYW5hcGFyYW0yKGRldiwgUlRMODI1NV9BTkFQQVJBTTJfT04pOworCisJd3JpdGVfbmljX2R3b3JkKGRldiwgMHg5NCwgMHgxMWMwMDAwMik7CisKKwl3cml0ZV9uaWNfZHdvcmQoZGV2LCBSRl9QQVJBLCAweDEwMDA0MCk7CisKKwlydGw4MTg1X3JmX3BpbnNfZW5hYmxlKGRldik7CisKKwlydGw4MjU1X2luaXRfQkdiYW5kKGRldik7CisJcnRsODI1NV9zZXRfYmFuZF9wYXJhbShkZXYsQkFORF9CRyk7CisKKwl3cml0ZV9waHlfY2NrKGRldiwgMHgwLCAweDk4KTsKKwl3cml0ZV9waHlfY2NrKGRldiwgMHgzLCAweDIwKTsKKwl3cml0ZV9waHlfY2NrKGRldiwgMHg0LCAweDJlKTsKKwl3cml0ZV9waHlfY2NrKGRldiwgMHg1LCAweDEyKTsKKwl3cml0ZV9waHlfY2NrKGRldiwgMHg2LCAweGZjKTsKKwl3cml0ZV9waHlfY2NrKGRldiwgMHg3LCAweGQ4KTsKKwl3cml0ZV9waHlfY2NrKGRldiwgMHg4LCAweDJlKTsKKwl3cml0ZV9waHlfY2NrKGRldiwgMHgxMCwgMHhkMyk7CisJd3JpdGVfcGh5X2NjayhkZXYsIDB4MTEsIDB4ODgpOworCXdyaXRlX3BoeV9jY2soZGV2LCAweDEyLCAweDQ3KTsKKwl3cml0ZV9waHlfY2NrKGRldiwgMHgxMywgMHhkMCk7IC8qIFZlciBDICYgRCAmIDgxODcqLworCisJd3JpdGVfcGh5X2NjayhkZXYsIDB4MTksIDB4MCk7CisJd3JpdGVfcGh5X2NjayhkZXYsIDB4MWEsIDB4YTApOworCXdyaXRlX3BoeV9jY2soZGV2LCAweDFiLCAweDgpOworCXdyaXRlX3BoeV9jY2soZGV2LCAweDQwLCAweDg2KTsgLyogQ0NLIENhcnJpZXIgU2Vuc2UgVGhyZXNob2xkICovCisJd3JpdGVfcGh5X2NjayhkZXYsIDB4NDEsIDB4OWQpOyAvKiBFbmVyZ3kgVGhyZXNob2xkICovCisJLy93cml0ZV9waHlfY2NrKGRldiwgMHg0MiwgMHgwKTsKKwl3cml0ZV9waHlfY2NrKGRldiwgMHg0MywgMHg4KTsKKworCXdyaXRlX25pY19ieXRlKGRldiwgVEVTVFIsMHg4KTsKKworCWZvcihpPTA7aTwxMjg7aSsrKXsKKwkJd3JpdGVfcGh5X29mZG0oZGV2LCAweDRiLCBydGw4MjU1X2FnY1tpXSk7CisJCXdyaXRlX3BoeV9vZmRtKGRldiwgMHg0YSwgKHU4KWkrIDB4ODApOworCX0KKworCisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDAsIDB4MSk7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDEsIDB4Mik7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDIsIDB4NDMpOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgzLCAweDApOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHg0LCAweDApOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHg1LCAweDApOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHg2LCAweDQwKTsKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4NywgMHgwKTsKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4OCwgMHg0MCk7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDksIDB4ZmUpOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHhhLCAweDkpOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHhiLCAweDgwKTsKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4YywgMHgxKTsKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4ZCwgMHg0Myk7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweGUsIDB4ZDMpOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHhmLCAweDM4KTsKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MTAsIDB4NCk7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDExLCAweDA2KTsvKmFnYyByZXNwIHRpbWUgNzAwKi8KKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MTIsIDB4MjApOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxMywgMHgyMCk7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDE0LCAweDApOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxNSwgMHg0MCk7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDE2LCAweDApOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxNywgMHg0MCk7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDE4LCAweGVmKTsKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MTksIDB4MjUpOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxYSwgMHgyMCk7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDFiLCAweDdhKTsKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MWMsIDB4ODQpOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxZSwgMHg5NSk7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDFmLCAweDc1KTsKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MjAsIDB4MWYpOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgyMSwgMHgxNyk7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDIyLCAweDE2KTsKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MjMsIDB4NzApOyAvL0ZJWE1FIG1heWJlIG5vdCBuZWVkZWQKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MjQsIDB4NzApOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgyNSwgMHgwKTsKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MjYsIDB4MTApOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgyNywgMHg4OCk7CisKKworCXdyaXRlX25pY19kd29yZChkZXYsIDB4OTQsIDB4M2RjMDAwMDIpOyAvL0JBTkQgREVQRU5ELgorLy8Jd3JpdGVfbmljX2R3b3JkKGRldiwgMHg5NCwgMHgxNWMwMDAwMik7IC8vQkFORCBERVBFTkQuCisKKwl3cml0ZV9waHlfY2NrKGRldiwgMHg0LCAweDE4KTsKKwl3cml0ZV9waHlfY2NrKGRldiwgMHg0MywgMHgxOCk7CisJd3JpdGVfcGh5X2NjayhkZXYsIDB4NiwgMHhkYyk7CisJd3JpdGVfcGh5X2NjayhkZXYsIDB4NDQsIDB4MmIpOworCXdyaXRlX3BoeV9jY2soZGV2LCAweDQ1LCAweDJiKTsKKwl3cml0ZV9waHlfY2NrKGRldiwgMHg0NiwgMHgyNSk7CisJd3JpdGVfcGh5X2NjayhkZXYsIDB4NDcsIDB4MTUpOworCXdyaXRlX3BoeV9jY2soZGV2LCAweDQ4LCAweDApOworCXdyaXRlX3BoeV9jY2soZGV2LCAweDQ5LCAweDApOworCXdyaXRlX3BoeV9jY2soZGV2LCAweDRhLCAweDApOworCXdyaXRlX3BoeV9jY2soZGV2LCAweDRiLCAweDApOworLy8Jd3JpdGVfcGh5X2NjayhkZXYsIDB4NGMsIDB4NSk7CisjaWYgMAorCXdyaXRlX3BoeV9jY2soZGV2LCAweDQxLCAweDlkKTsgLyogRW5lcmd5IFRocmVzaG9sZCAqLworCS8vIFRFU1RSIDB4YiA4MTg3CisJd3JpdGVfcGh5X2NjayhkZXYsIDB4MTAsIDB4OTMpOy8vICYgMHhmYik7CisjZW5kaWYKKwkvL3J0bDgyNTVfc2V0X2dhaW4oZGV2LCAxKTsgLyogRklYTUUgdGhpcyAnMScgaXMgcmFuZG9tICovCisKKwlydGw4MjU1X1NldFRYUG93ZXJMZXZlbChkZXYsIHByaXYtPmNoYW4pOworCisJd3JpdGVfcGh5X2NjayhkZXYsIDB4MTAsIDB4OTMgfDB4NCk7IC8qIFJ4IGFudCBCLCAweGQzIGZvciBBICovCisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDI2LCAweDkwKTsgLyogUnggYW50IEIsIDB4MTAgZm9yIEEgKi8KKworCXJ0bDgxODVfdHhfYW50ZW5uYShkZXYsIDB4Myk7IC8qIFRYIGFudCBCLCAweDAgZm9yIEEqLworCS8qIG1ha2Ugc3VyZSBpcyB3YWtlbiB1cCEgKi8KKwlydGw4MTgwX3NldF9hbmFwYXJhbShkZXYsIFJUTDgyNTVfQU5BUEFSQU1fT04pOworCXJ0bDgxODVfc2V0X2FuYXBhcmFtMihkZXYsIFJUTDgyNTVfQU5BUEFSQU0yX09OKTsKKworCXJ0bDgyNTVfc2V0X2JhbmRfcGFyYW0oZGV2LEJBTkRfQkcpOworCisJd3JpdGVfcGh5X2NjayhkZXYsIDB4NDEsIDB4OWQpOworCisJcnRsODI1NV9zZXRfZ2FpbihkZXYsIDQpOworCS8vcnRsODI1NV9zZXRfZW5lcmd5X3RocmVzaG9sZChkZXYpOworCXdyaXRlX3BoeV9jY2soZGV2LCAweDQxLCAweDlkKTsKKwlydGw4MjU1X3JmX3NldF9jaGFuKGRldiwgcHJpdi0+Y2hhbik7CisKKwl3cml0ZV9uaWNfd29yZChkZXYsIEJSU1IsIGJyc3IpOworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwX3J0bDgyNTUuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfcnRsODI1NS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlNDRjYTYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwX3J0bDgyNTUuaApAQCAtMCwwICsxLDE5IEBACisvKgorICBUaGlzIGlzIHBhcnQgb2YgdGhlIHJ0bDgxODAtc2EyNDAwIGRyaXZlcgorICByZWxlYXNlZCB1bmRlciB0aGUgR1BMIChTZWUgZmlsZSBDT1BZSU5HIGZvciBkZXRhaWxzKS4KKyAgQ29weXJpZ2h0IChjKSAyMDA1IEFuZHJlYSBNZXJlbGxvIDxhbmRyZWFtcmxAdGlzY2FsaS5pdD4KKworICBUaGlzIGZpbGVzIGNvbnRhaW5zIHByb2dyYW1taW5nIGNvZGUgZm9yIHRoZSBydGw4MjU1CisgIHJhZGlvIGZyb250ZW5kLgorCisgICpNYW55KiB0aGFua3MgdG8gUmVhbHRlayBDb3JwLiBmb3IgdGhlaXIgZ3JlYXQgc3VwcG9ydCEKKworKi8KKworI2RlZmluZSBSVEw4MjU1X0FOQVBBUkFNX09OIDB4YTAwMDBiNTkKKyNkZWZpbmUgUlRMODI1NV9BTkFQQVJBTTJfT04gMHg4NDBjZjMxMQorCisKK3ZvaWQgcnRsODI1NV9yZl9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwordm9pZCBydGw4MjU1X3JmX3NldF9jaGFuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsc2hvcnQgY2gpOwordm9pZCBydGw4MjU1X3JmX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MF9zYTI0MDAuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfc2EyNDAwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY0OTU2MAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfc2EyNDAwLmMKQEAgLTAsMCArMSwyMzMgQEAKKy8qCisgICBUaGlzIGZpbGVzIGNvbnRhaW5zIFBISUxJUFMgU0EyNDAwIHJhZGlvIGZyb250ZW5kIHByb2dyYW1taW5nIHJvdXRpbmVzLgorCisgICBUaGlzIGlzIHBhcnQgb2YgcnRsODE4MCBPcGVuU291cmNlIGRyaXZlcgorICAgQ29weXJpZ2h0IChDKSBBbmRyZWEgTWVyZWxsbyAyMDA0LTIwMDUgIDxhbmRyZWFtcmxAdGlzY2FsaS5pdD4KKyAgIFJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiBHUEwgKEdlbmVyYWwgUHVibGljIExpY2VuY2UpCisKKyAgIFBhcnRzIG9mIHRoaXMgZHJpdmVyIGFyZSBiYXNlZCBvbiB0aGUgR1BMIHBhcnQgb2YgdGhlCisgICBvZmZpY2lhbCByZWFsdGVrIGRyaXZlcgorCisgICBQYXJ0cyBvZiB0aGlzIGRyaXZlciBhcmUgYmFzZWQgb24gdGhlIHJ0bDgxODAgZHJpdmVyIHNrZWxldG9uCisgICBmcm9tIFBhdHJpYyBTY2hlbmtlICYgQW5kcmVzIFNhbG9tb24KKworICAgUGFydHMgb2YgdGhpcyBkcml2ZXIgYXJlIGJhc2VkIG9uIHRoZSBJbnRlbCBQcm8gV2lyZWxlc3MgMjEwMCBHUEwgZHJpdmVyLgorCisgICBDb2RlIGF0IGh0dHA6Ly9jaGUub2pjdGVjaC5jb20vfmR5b3VuZy9ydHcvIGhhcyBiZWVuIHVzZWZ1bCB0byBtZSB0bworICAgdW5kZXJzdGFuZCBzb21lIHRoaW5ncy4KKworICAgQ29kZSBmcm9tIHJ0bDgxODEgcHJvamVjdCBoYXMgYmVlbiB1c2VmdWwgdG8gbWUgdG8gdW5kZXJzdGFuZCBzb21lIHRoaW5ncy4KKworICAgV2Ugd2FudCB0byB0YW5rcyB0aGUgQXV0aG9ycyBvZiBzdWNoIHByb2plY3RzIGFuZCB0aGUgTmRpc3dyYXBwZXIKKyAgIHByb2plY3QgQXV0aG9ycy4KKyovCisKKworI2luY2x1ZGUgInI4MTgwLmgiCisjaW5jbHVkZSAicjgxODBfaHcuaCIKKyNpbmNsdWRlICJyODE4MF9zYTI0MDAuaCIKKworCisvLyNkZWZpbmUgREVCVUdfU0EyNDAwCisKK3UzMiBzYTI0MDBfY2hhbltdID0geworCTB4MCwJLy9kdW1teSBjaGFubmVsIDAKKwkweDAwMDk2YywgLy8xCisJMHgwODA5NzAsIC8vMgorCTB4MTAwOTc0LCAvLzMKKwkweDE4MDk3OCwgLy80CisJMHgwMDA5ODAsIC8vNQorCTB4MDgwOTg0LCAvLzYKKwkweDEwMDk4OCwgLy83CisJMHgxODA5OGMsIC8vOAorCTB4MDAwOTk0LCAvLzkKKwkweDA4MDk5OCwgLy8xMAorCTB4MTAwOTljLCAvLzExCisJMHgxODA5YTAsIC8vMTIKKwkweDAwMDlhOCwgLy8xMworCTB4MDAwOWI0LCAvLzE0Cit9OworCisKK3ZvaWQgcmZfc3RhYmlsaXplKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJZm9yY2VfcGNpX3Bvc3RpbmcoZGV2KTsKKwltZGVsYXkoMyk7IC8vZm9yIG5vdyB1c2UgYSBncmVhdCB2YWx1ZS4uIHdlIG1heSBvcHRpbWl6ZSBpbiBmdXR1cmUKK30KKworCit2b2lkIHdyaXRlX3NhMjQwMChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LHU4IGFkciwgdTMyIGRhdGEpCit7CisvLwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJdTMyIHBoeV9jb25maWc7CisKKyAgICAgICAgLy8gcGhpbGlwcyBzYTI0MDAgZXhwZWN0cyAyNCBiaXRzIGRhdGEKKworCS8qaWYoYWRyID09IDQgJiYgcHJpdi0+ZGlncGh5KXsKKwkJcGh5X2NvbmZpZz0weDYwMDAwMDAwOworCX1lbHNleworCQlwaHlfY29uZmlnPTB4YjAwMDAwMDA7CisJfSovCisKKwlwaHlfY29uZmlnID0gMHhiMDAwMDAwMDsgLy8gTUFDIHdpbGwgYmFuZyBiaXRzIHRvIHRoZSBzYTI0MDAKKworCXBoeV9jb25maWcgfD0gKCgodTMyKShhZHImMHhmKSk8PCAyNCk7CisJcGh5X2NvbmZpZyB8PSAoZGF0YSAmIDB4ZmZmZmZmKTsKKwl3cml0ZV9uaWNfZHdvcmQoZGV2LFBIWV9DT05GSUcscGh5X2NvbmZpZyk7CisjaWZkZWYgREVCVUdfU0EyNDAwCisJRE1FU0coIldyaXRpbmcgc2EyNDAwOiAleCAoYWRyICV4KSIscGh5X2NvbmZpZyxhZHIpOworI2VuZGlmCisJcmZfc3RhYmlsaXplKGRldik7Cit9CisKKworCit2b2lkIHNhMjQwMF93cml0ZV9waHlfYW50ZW5uYShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LHNob3J0IGNoKQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwl1OCBhbnQ7CisKKwlhbnQgPSBTQTI0MDBfQU5URU5OQTsKKwlpZihwcml2LT5hbnRiKSAvKmRlZmF1bHQgYW50ZW5uYSBpcyBhbnRlbm5hIEIgKi8KKwkJYW50IHw9IEJCX0FOVEVOTkFfQjsKKwlpZihjaCA9PSAxNCkKKwkJYW50IHw9IEJCX0FOVEFUVEVOX0NIQU4xNDsKKwl3cml0ZV9waHkoZGV2LDB4MTAsYW50KTsKKwkvL0RNRVNHKCJCQiBhbnRlbm5hICV4ICIsYW50KTsKK30KKworCisvKiBmcm9tIHRoZSBydGw4MTgxIGVtYmVkZGVkIGRyaXZlciAqLworc2hvcnQgc2EyNDAwX3JmX3NldF9zZW5zKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHNob3J0IHNlbnMpCit7CisJdTggZmluZXR1bmUgPSAwOworCWlmICgoc2VucyA+IDg1KSB8fCAoc2VucyA8IDU0KSkgcmV0dXJuIC0xOworCisJd3JpdGVfc2EyNDAwKGRldiw1LDB4MWRmYiB8IChzZW5zLTU0KSA8PCAxNSB8KGZpbmV0dW5lPDwyMCkpOyAgLy8gQUdDCTB4YzlkZmIKKworCXJldHVybiAwOworfQorCisKK3ZvaWQgc2EyNDAwX3JmX3NldF9jaGFuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHNob3J0IGNoKQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwl1MzIgdHhwdyA9IDB4ZmYgJiBwcml2LT5jaHR4cHdyW2NoXTsKKwl1MzIgY2hhbiA9IHNhMjQwMF9jaGFuW2NoXTsKKworCXdyaXRlX3NhMjQwMChkZXYsNyx0eHB3KTsKKwkvL3dyaXRlX3BoeShkZXYsMHgxMCwweGQxKTsKKwlzYTI0MDBfd3JpdGVfcGh5X2FudGVubmEoZGV2LGNoKTsKKwl3cml0ZV9zYTI0MDAoZGV2LDAsY2hhbik7CisJd3JpdGVfc2EyNDAwKGRldiwxLDB4YmI1MCk7CisJd3JpdGVfc2EyNDAwKGRldiwyLDB4ODApOworCXdyaXRlX3NhMjQwMChkZXYsMywwKTsKK30KKworCit2b2lkIHNhMjQwMF9yZl9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXdyaXRlX3NhMjQwMChkZXYsIDQsIDApOworfQorCisKK3ZvaWQgc2EyNDAwX3JmX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJdTMyIGFuYXBhcmFtOworCXU4IGZpcmRhYzsKKworCXdyaXRlX25pY19ieXRlKGRldixQSFlfREVMQVksMHg2KTsJLy90aGlzIGlzIGdlbmVyYWwKKwl3cml0ZV9uaWNfYnl0ZShkZXYsQ0FSUklFUl9TRU5TRV9DT1VOVEVSLDB4NGMpOyAvL3RoaXMgaXMgZ2VuZXJhbAorCisJLyp0aGVzZSBhcmUgcGhpbGlwcyBzYTI0MDAgc3BlY2lmaWMqLworCWFuYXBhcmFtID0gcmVhZF9uaWNfZHdvcmQoZGV2LEFOQVBBUkFNKTsKKwlhbmFwYXJhbSA9IGFuYXBhcmFtICZ+ICgxPDxBTkFQQVJBTV9UWERBQ09GRl9TSElGVCk7CisKKwlhbmFwYXJhbSA9IGFuYXBhcmFtICZ+QU5BUEFSQU1fUFdSMV9NQVNLOworCWFuYXBhcmFtID0gYW5hcGFyYW0gJn5BTkFQQVJBTV9QV1IwX01BU0s7CisJaWYocHJpdi0+ZGlncGh5KXsKKwkJYW5hcGFyYW0gfD0gKFNBMjQwMF9ESUdfQU5BUEFSQU1fUFdSMV9PTjw8QU5BUEFSQU1fUFdSMV9TSElGVCk7CisJCWFuYXBhcmFtIHw9IChTQTI0MDBfQU5BUEFSQU1fUFdSMF9PTjw8QU5BUEFSQU1fUFdSMF9TSElGVCk7CisJfWVsc2V7CisJCWFuYXBhcmFtIHw9IChTQTI0MDBfQU5BX0FOQVBBUkFNX1BXUjFfT048PEFOQVBBUkFNX1BXUjFfU0hJRlQpOworCX0KKworCXJ0bDgxODBfc2V0X2FuYXBhcmFtKGRldixhbmFwYXJhbSk7CisKKwlmaXJkYWMgPSAocHJpdi0+ZGlncGh5KSA/ICgxPDxTQTI0MDBfUkVHNF9GSVJEQUNfU0hJRlQpIDogMDsKKwl3cml0ZV9zYTI0MDAoZGV2LDAsc2EyNDAwX2NoYW5bcHJpdi0+Y2hhbl0pOworCXdyaXRlX3NhMjQwMChkZXYsMSwweGJiNTApOworCXdyaXRlX3NhMjQwMChkZXYsMiwweDgwKTsKKwl3cml0ZV9zYTI0MDAoZGV2LDMsMCk7CisJd3JpdGVfc2EyNDAwKGRldiw0LDB4MTkzNDAgfCBmaXJkYWMpOworCXdyaXRlX3NhMjQwMChkZXYsNSwweGM5ZGZiKTsgIC8vIEFHQworCXdyaXRlX3NhMjQwMChkZXYsNCwweDE5MzQ4IHwgZmlyZGFjKTsgIC8vY2FsaWJyYXRlcyBWQ08KKworCWlmKHByaXYtPmRpZ3BoeSkKKwkJd3JpdGVfc2EyNDAwKGRldiw0LDB4MTkzOGMpOyAvKj8/PyovCisKKwl3cml0ZV9zYTI0MDAoZGV2LDQsMHgxOTM0MCB8IGZpcmRhYyk7CisKKwl3cml0ZV9zYTI0MDAoZGV2LDAsc2EyNDAwX2NoYW5bcHJpdi0+Y2hhbl0pOworCXdyaXRlX3NhMjQwMChkZXYsMSwweGJiNTApOworCXdyaXRlX3NhMjQwMChkZXYsMiwweDgwKTsKKwl3cml0ZV9zYTI0MDAoZGV2LDMsMCk7CisJd3JpdGVfc2EyNDAwKGRldiw0LDB4MTkzNDQgfCBmaXJkYWMpOyAvL2NhbGlicmF0ZXMgZmlsdGVyCisKKwkvKiBuZXcgZnJvbSBydGw4MTgwIGVtYmVkZGVkIGRyaXZlciAocnRsODE4MSBwcm9qZWN0KSAqLworCXdyaXRlX3NhMjQwMChkZXYsNiwweDEzZmYgfCAoMTw8MjMpKTsgLy8gTUFOUlgKKwl3cml0ZV9zYTI0MDAoZGV2LDgsMCk7IC8vVkNPCisKKwlpZighcHJpdi0+ZGlncGh5KQorCXsKKwkJcnRsODE4MF9zZXRfYW5hcGFyYW0oZGV2LCBhbmFwYXJhbSB8IFwKKwkJCQkgICAgICgxPDxBTkFQQVJBTV9UWERBQ09GRl9TSElGVCkpOworCisJCXJ0bDgxODBfY29udHR4X2VuYWJsZShkZXYpOworCisJCXdyaXRlX3NhMjQwMChkZXYsIDQsIDB4MTkzNDEpOyAvLyBjYWxpYnJhdGVzIERDCisKKwkJLyogYSA1dXMgc2xlZXAgaXMgcmVxdWlyZWQgaGVyZSwKKwkJICAgd2UgcmVseSBvbiB0aGUgM21zIGRlbGF5IGludHJvZHVjZWQgaW4gd3JpdGVfc2EyNDAwCisJCSovCisJCXdyaXRlX3NhMjQwMChkZXYsIDQsIDB4MTkzNDUpOworCQkvKiBhIDIwdXMgc2xlZXAgaXMgcmVxdWlyZWQgaGVyZSwKKwkJICAgd2UgcmVseSBvbiB0aGUgM21zIGRlbGF5IGludHJvZHVjZWQgaW4gd3JpdGVfc2EyNDAwCisJCSovCisJCXJ0bDgxODBfY29udHR4X2Rpc2FibGUoZGV2KTsKKworCQlydGw4MTgwX3NldF9hbmFwYXJhbShkZXYsIGFuYXBhcmFtKTsKKwl9CisJLyogZW5kIG5ldyAqLworCisJd3JpdGVfc2EyNDAwKGRldiw0LDB4MTkzNDEgfCBmaXJkYWMgKTsgLy9SVFggTU9ERQorCisJLy8gU2V0IHR4IHBvd2VyIGxldmVsICE/CisKKworCS8qYmFzZWJhbmQgY29uZmlndXJhdGlvbiovCisJd3JpdGVfcGh5KGRldiwwLDB4OTgpOworCXdyaXRlX3BoeShkZXYsMywweDM4KTsKKwl3cml0ZV9waHkoZGV2LDQsMHhlMCk7CisJd3JpdGVfcGh5KGRldiw1LDB4OTApOworCXdyaXRlX3BoeShkZXYsNiwweDFhKTsKKwl3cml0ZV9waHkoZGV2LDcsMHg2NCk7CisKKwkvKlNob3VsZCBiZSBkb25lIHNvbWV0aGluZyBtb3JlIGhlcmU/PyovCisKKwlzYTI0MDBfd3JpdGVfcGh5X2FudGVubmEoZGV2LHByaXYtPmNoYW4pOworCisJd3JpdGVfcGh5KGRldiwweDExLDB4ODApOworCWlmKHByaXYtPmRpdmVyc2l0eSkKKwkJd3JpdGVfcGh5KGRldiwweDEyLDB4YzcpOworCWVsc2UKKwkJd3JpdGVfcGh5KGRldiwweDEyLDB4NDcpOworCisJd3JpdGVfcGh5KGRldiwweDEzLDB4OTAgfCBwcml2LT5jc190cmVzaG9sZCApOworCisJd3JpdGVfcGh5KGRldiwweDE5LDB4MCk7CisJd3JpdGVfcGh5KGRldiwweDFhLDB4YTApOworCisJc2EyNDAwX3JmX3NldF9jaGFuKGRldixwcml2LT5jaGFuKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfc2EyNDAwLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwX3NhMjQwMC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4M2E2OWIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwX3NhMjQwMC5oCkBAIC0wLDAgKzEsMjYgQEAKKy8qCisJVGhpcyBpcyBwYXJ0IG9mIHJ0bDgxODAgT3BlblNvdXJjZSBkcml2ZXIgLSB2IDAuNworCUNvcHlyaWdodCAoQykgQW5kcmVhIE1lcmVsbG8gMjAwNCAgPGFuZHJlYW1ybEB0aXNjYWxpLml0PgorCVJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiBHUEwgKEdlbmVyYWwgUHVibGljIExpY2VuY2UpCisKKwlQYXJ0cyBvZiB0aGlzIGRyaXZlciBhcmUgYmFzZWQgb24gdGhlIEdQTCBwYXJ0IG9mIHRoZSBvZmZpY2lhbCByZWFsdGVrIGRyaXZlcgorCVBhcnRzIG9mIHRoaXMgZHJpdmVyIGFyZSBiYXNlZCBvbiB0aGUgcnRsODE4MCBkcml2ZXIgc2tlbGV0b24gZnJvbSBQYXRyaWMgU2NoZW5rZSAmIEFuZHJlcyBTYWxvbW9uCisJUGFydHMgb2YgdGhpcyBkcml2ZXIgYXJlIGJhc2VkIG9uIHRoZSBJbnRlbCBQcm8gV2lyZWxlc3MgMjEwMCBHUEwgZHJpdmVyCisKKwlXZSB3YW50IHRvIHRhbmtzIHRoZSBBdXRob3JzIG9mIHN1Y2ggcHJvamVjdHMgYW5kIHRoZSBOZGlzd3JhcHBlciBwcm9qZWN0IEF1dGhvcnMuCisqLworCisjZGVmaW5lIFNBMjQwMF9BTlRFTk5BIDB4OTEKKyNkZWZpbmUgU0EyNDAwX0RJR19BTkFQQVJBTV9QV1IxX09OIDB4OAorI2RlZmluZSBTQTI0MDBfQU5BX0FOQVBBUkFNX1BXUjFfT04gMHgyOAorI2RlZmluZSBTQTI0MDBfQU5BUEFSQU1fUFdSMF9PTiAweDMKKworI2RlZmluZSBTQTI0MDBfUkZfTUFYX1NFTlMgODUKKyNkZWZpbmUgU0EyNDAwX1JGX0RFRl9TRU5TIDgwCisKKyNkZWZpbmUgU0EyNDAwX1JFRzRfRklSREFDX1NISUZUIDcKKwordm9pZCBzYTI0MDBfcmZfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3ZvaWQgc2EyNDAwX3JmX3NldF9jaGFuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsc2hvcnQgY2gpOworc2hvcnQgc2EyNDAwX3JmX3NldF9zZW5zKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsc2hvcnQgc2Vucyk7Cit2b2lkIHNhMjQwMF9yZl9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfd3guYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfd3guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjM5MDFkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MF93eC5jCkBAIC0wLDAgKzEsMTY0NCBAQAorLyoKKyAgIFRoaXMgZmlsZSBjb250YWlucyB3aXJlbGVzcyBleHRlbnNpb24gaGFuZGxlcnMuCisKKyAgIFRoaXMgaXMgcGFydCBvZiBydGw4MTgwIE9wZW5Tb3VyY2UgZHJpdmVyLgorICAgQ29weXJpZ2h0IChDKSBBbmRyZWEgTWVyZWxsbyAyMDA0LTIwMDUgIDxhbmRyZWFtcmxAdGlzY2FsaS5pdD4KKyAgIFJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiBHUEwgKEdlbmVyYWwgUHVibGljIExpY2VuY2UpCisKKyAgIFBhcnRzIG9mIHRoaXMgZHJpdmVyIGFyZSBiYXNlZCBvbiB0aGUgR1BMIHBhcnQKKyAgIG9mIHRoZSBvZmZpY2lhbCByZWFsdGVrIGRyaXZlci4KKworICAgUGFydHMgb2YgdGhpcyBkcml2ZXIgYXJlIGJhc2VkIG9uIHRoZSBydGw4MTgwIGRyaXZlciBza2VsZXRvbgorICAgZnJvbSBQYXRyaWMgU2NoZW5rZSAmIEFuZHJlcyBTYWxvbW9uLgorCisgICBQYXJ0cyBvZiB0aGlzIGRyaXZlciBhcmUgYmFzZWQgb24gdGhlIEludGVsIFBybyBXaXJlbGVzcyAyMTAwIEdQTCBkcml2ZXIuCisKKyAgIFdlIHdhbnQgdG8gdGFua3MgdGhlIEF1dGhvcnMgb2YgdGhvc2UgcHJvamVjdHMgYW5kIHRoZSBOZGlzd3JhcHBlcgorICAgcHJvamVjdCBBdXRob3JzLgorKi8KKworCisjaW5jbHVkZSAicjgxODAuaCIKKyNpbmNsdWRlICJyODE4MF9ody5oIgorI2luY2x1ZGUgInI4MTgwX3NhMjQwMC5oIgorCisjaWZkZWYgRU5BQkxFX0RPVDExRAorI2luY2x1ZGUgImRvdDExZC5oIgorI2VuZGlmCisKKy8vI2RlZmluZSBSQVRFX0NPVU5UIDQKK3UzMiBydGw4MTgwX3JhdGVzW10gPSB7MTAwMDAwMCwyMDAwMDAwLDU1MDAwMDAsMTEwMDAwMDAsCisJNjAwMDAwMCw5MDAwMDAwLDEyMDAwMDAwLDE4MDAwMDAwLDI0MDAwMDAwLDM2MDAwMDAwLDQ4MDAwMDAwLDU0MDAwMDAwfTsKKworI2RlZmluZSBSQVRFX0NPVU5UIChzaXplb2YocnRsODE4MF9yYXRlcykvc2l6ZW9mKHJ0bDgxODBfcmF0ZXNbMF0pKQorCitzdGF0aWMgQ0hBTk5FTF9MSVNUIERlZmF1bHRDaGFubmVsUGxhbltdID0geworLy8Je3sxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNH0sMTR9LAkJCS8vRGVmYXVsdCBjaGFubmVsIHBsYW4KKwl7ezEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDM2LDQwLDQ0LDQ4LDUyLDU2LDYwLDY0fSwxOX0sICAJCS8vRkNDCisJe3sxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMX0sMTF9LCAgICAgICAgICAgICAgICAgICAgCQkJCS8vSUMKKwl7ezEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyLDEzLDM2LDQwLDQ0LDQ4LDUyLDU2LDYwLDY0fSwyMX0sICAJLy9FVFNJCisJe3sxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywzNiw0MCw0NCw0OCw1Miw1Niw2MCw2NH0sMjF9LCAgICAvL1NwYWluLiBDaGFuZ2UgdG8gRVRTSS4KKwl7ezEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyLDEzLDM2LDQwLDQ0LDQ4LDUyLDU2LDYwLDY0fSwyMX0sICAJLy9GcmFuY2UuIENoYW5nZSB0byBFVFNJLgorCXt7MTQsMzYsNDAsNDQsNDgsNTIsNTYsNjAsNjR9LDl9LAkJCQkJCS8vTUtLCisJe3sxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwgMzYsNDAsNDQsNDgsNTIsNTYsNjAsNjR9LDIyfSwvL01LSzEKKwl7ezEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyLDEzLDM2LDQwLDQ0LDQ4LDUyLDU2LDYwLDY0fSwyMX0sCS8vSXNyYWVsLgorCXt7MSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIsMTMsMzQsMzgsNDIsNDZ9LDE3fSwJCQkvLyBGb3IgMTFhICwgVEVMRUMKKwl7ezEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyLDEzLDE0fSwxNH0JCQkJCS8vRm9yIEdsb2JhbCBEb21haW4uIDEtMTE6YWN0aXZlIHNjYW4sIDEyLTE0IHBhc3NpdmUgc2Nhbi4gLy8rWUosIDA4MDYyNgorfTsKK3N0YXRpYyBpbnQgcjgxODBfd3hfZ2V0X2ZyZXEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqYSwKKwkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqYikKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisKKwlyZXR1cm4gaWVlZTgwMjExX3d4X2dldF9mcmVxKHByaXYtPmllZWU4MDIxMSwgYSwgd3JxdSwgYik7Cit9CisKKworaW50IHI4MTgwX3d4X3NldF9rZXkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICprZXkpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCXN0cnVjdCBpd19wb2ludCAqZXJxID0gJih3cnF1LT5lbmNvZGluZyk7CisKKwlpZihwcml2LT5pZWVlODAyMTEtPmJId1JhZGlvT2ZmKQorCQlyZXR1cm4gMDsKKworCWlmIChlcnEtPmZsYWdzICYgSVdfRU5DT0RFX0RJU0FCTEVEKSB7CisJfQorCisKKy8qCWkgPSBlcnEtPmZsYWdzICYgSVdfRU5DT0RFX0lOREVYOworCWlmIChpIDwgMSB8fCBpID4gNCkKKyovCisKKwlpZiAoZXJxLT5sZW5ndGggPiAwKSB7CisKKwkJLy9pbnQgbGVuID0gZXJxLT5sZW5ndGggPD0gNSA/IDUgOiAxMzsKKworCQl1MzIqIHRrZXk9ICh1MzIqKSBrZXk7CisJCXByaXYtPmtleTBbMF0gPSB0a2V5WzBdOworCQlwcml2LT5rZXkwWzFdID0gdGtleVsxXTsKKwkJcHJpdi0+a2V5MFsyXSA9IHRrZXlbMl07CisJCXByaXYtPmtleTBbM10gPSB0a2V5WzNdICYweGZmOworCQlETUVTRygiU2V0dGluZyB3ZXAga2V5IHRvICV4ICV4ICV4ICV4IiwKKwkJICAgICAgdGtleVswXSx0a2V5WzFdLHRrZXlbMl0sdGtleVszXSk7CisJCXJ0bDgxODBfc2V0X2h3X3dlcChkZXYpOworCX0KKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IHI4MTgwX3d4X3NldF9iZWFjb25pbnRlcnZhbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICphYSwKKwkJCSAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqYikKK3sKKwlpbnQgKnBhcm1zID0gKGludCAqKWI7CisJaW50IGJpID0gcGFybXNbMF07CisKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisKKwlpZihwcml2LT5pZWVlODAyMTEtPmJId1JhZGlvT2ZmKQorCQlyZXR1cm4gMDsKKworCWRvd24oJnByaXYtPnd4X3NlbSk7CisJRE1FU0coInNldHRpbmcgYmVhY29uIGludGVydmFsIHRvICV4IixiaSk7CisKKwlwcml2LT5pZWVlODAyMTEtPmN1cnJlbnRfbmV0d29yay5iZWFjb25faW50ZXJ2YWw9Ymk7CisJcnRsODE4MF9jb21taXQoZGV2KTsKKwl1cCgmcHJpdi0+d3hfc2VtKTsKKworCXJldHVybiAwOworfQorCisKKworc3RhdGljIGludCByODE4MF93eF9nZXRfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICphLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpiKQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlyZXR1cm4gaWVlZTgwMjExX3d4X2dldF9tb2RlKHByaXYtPmllZWU4MDIxMSxhLHdycXUsYik7Cit9CisKKworCitzdGF0aWMgaW50IHI4MTgwX3d4X2dldF9yYXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlyZXR1cm4gaWVlZTgwMjExX3d4X2dldF9yYXRlKHByaXYtPmllZWU4MDIxMSxpbmZvLHdycXUsZXh0cmEpOworfQorCisKKworc3RhdGljIGludCByODE4MF93eF9zZXRfcmF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCisJaWYocHJpdi0+aWVlZTgwMjExLT5iSHdSYWRpb09mZikKKwkJcmV0dXJuIDA7CisKKwlkb3duKCZwcml2LT53eF9zZW0pOworCisJcmV0ID0gaWVlZTgwMjExX3d4X3NldF9yYXRlKHByaXYtPmllZWU4MDIxMSxpbmZvLHdycXUsZXh0cmEpOworCisJdXAoJnByaXYtPnd4X3NlbSk7CisKKwlyZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyBpbnQgcjgxODBfd3hfc2V0X2NyY21vbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCWludCAqcGFybXMgPSAoaW50ICopZXh0cmE7CisJaW50IGVuYWJsZSA9IChwYXJtc1swXSA+IDApOworCXNob3J0IHByZXYgPSBwcml2LT5jcmNtb247CisKKworCWlmKHByaXYtPmllZWU4MDIxMS0+Ykh3UmFkaW9PZmYpCisJCXJldHVybiAwOworCisJZG93bigmcHJpdi0+d3hfc2VtKTsKKworCWlmKGVuYWJsZSkKKwkJcHJpdi0+Y3JjbW9uPTE7CisJZWxzZQorCQlwcml2LT5jcmNtb249MDsKKworCURNRVNHKCJiYWQgQ1JDIGluIG1vbml0b3IgbW9kZSBhcmUgJXMiLAorCSAgICAgIHByaXYtPmNyY21vbiA/ICJhY2NlcHRlZCIgOiAicmVqZWN0ZWQiKTsKKworCWlmKHByZXYgIT0gcHJpdi0+Y3JjbW9uICYmIHByaXYtPnVwKXsKKwkJcnRsODE4MF9kb3duKGRldik7CisJCXJ0bDgxODBfdXAoZGV2KTsKKwl9CisKKwl1cCgmcHJpdi0+d3hfc2VtKTsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgcjgxODBfd3hfc2V0X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqYSwKKwkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqYikKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJaW50IHJldDsKKworCisJaWYocHJpdi0+aWVlZTgwMjExLT5iSHdSYWRpb09mZikKKwkJcmV0dXJuIDA7CisKKwlkb3duKCZwcml2LT53eF9zZW0pOworI2lmZGVmIEVOQUJMRV9JUFMKKy8vCXByaW50aygic2V0IG1vZGUgRU5BQkxFX0lQU1xuIik7CisJaWYocHJpdi0+YkluYWN0aXZlUHMpeworCQlpZih3cnF1LT5tb2RlID09IElXX01PREVfQURIT0MpCisJCQlJUFNMZWF2ZShkZXYpOworCX0KKyNlbmRpZgorCXJldCA9IGllZWU4MDIxMV93eF9zZXRfbW9kZShwcml2LT5pZWVlODAyMTEsYSx3cnF1LGIpOworCisJLy9ydGw4MTgwX2NvbW1pdChkZXYpOworCisJdXAoJnByaXYtPnd4X3NlbSk7CisJcmV0dXJuIHJldDsKK30KKworLy9ZSixhZGQsMDgwODE5LGZvciBoaWRkZW4gYXAKK3N0cnVjdCAgaXdfcmFuZ2Vfd2l0aF9zY2FuX2NhcGEKK3sKKyAgICAgICAgLyogSW5mb3JtYXRpdmUgc3R1ZmYgKHRvIGNob29zZSBiZXR3ZWVuIGRpZmZlcmVudCBpbnRlcmZhY2UpICovCisgICAgICAgIF9fdTMyICAgICAgICAgICB0aHJvdWdocHV0OyAgICAgLyogVG8gZ2l2ZSBhbiBpZGVhLi4uICovCisgICAgICAgIC8qIEluIHRoZW9yeSB0aGlzIHZhbHVlIHNob3VsZCBiZSB0aGUgbWF4aW11bSBiZW5jaG1hcmtlZAorICAgICAgICAgKiBUQ1AvSVAgdGhyb3VnaHB1dCwgYmVjYXVzZSB3aXRoIG1vc3Qgb2YgdGhlc2UgZGV2aWNlcyB0aGUKKyAgICAgICAgICogYml0IHJhdGUgaXMgbWVhbmluZ2xlc3MgKG92ZXJoZWFkIGFuIGNvKSB0byBlc3RpbWF0ZSBob3cKKyAgICAgICAgICogZmFzdCB0aGUgY29ubmVjdGlvbiB3aWxsIGdvIGFuZCBwaWNrIHRoZSBmYXN0ZXN0IG9uZS4KKyAgICAgICAgICogSSBzdWdnZXN0IHBlb3BsZSB0byBwbGF5IHdpdGggTmV0cGVyZiBvciBhbnkgYmVuY2htYXJrLi4uCisgICAgICAgICAqLworCisgICAgICAgIC8qIE5XSUQgKG9yIGRvbWFpbiBpZCkgKi8KKyAgICAgICAgX191MzIgICAgICAgICAgIG1pbl9ud2lkOyAgICAgICAvKiBNaW5pbWFsIE5XSUQgd2UgYXJlIGFibGUgdG8gc2V0ICovCisgICAgICAgIF9fdTMyICAgICAgICAgICBtYXhfbndpZDsgICAgICAgLyogTWF4aW1hbCBOV0lEIHdlIGFyZSBhYmxlIHRvIHNldCAqLworCisgICAgICAgIC8qIE9sZCBGcmVxdWVuY3kgKGJhY2t3YXJkIGNvbXBhdCAtIG1vdmVkIGxvd2VyICkgKi8KKyAgICAgICAgX191MTYgICAgICAgICAgIG9sZF9udW1fY2hhbm5lbHM7CisgICAgICAgIF9fdTggICAgICAgICAgICBvbGRfbnVtX2ZyZXF1ZW5jeTsKKworICAgICAgICAvKiBTY2FuIGNhcGFiaWxpdGllcyAqLworICAgICAgICBfX3U4ICAgICAgICAgICAgc2Nhbl9jYXBhOworfTsKKy8vWUosYWRkLDA4MDgxOSxmb3IgaGlkZGVuIGFwCisKKworc3RhdGljIGludCBydGw4MTgwX3d4X2dldF9yYW5nZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkJdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IGl3X3JhbmdlICpyYW5nZSA9IChzdHJ1Y3QgaXdfcmFuZ2UgKilleHRyYTsKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJdTE2IHZhbDsKKwlpbnQgaTsKKwkvL3N0cnVjdCBpd19yYW5nZV93aXRoX3NjYW5fY2FwYSogdG1wID0gKHN0cnVjdCBpd19yYW5nZV93aXRoX3NjYW5fY2FwYSopcmFuZ2U7IC8vWUosYWRkLDA4MDgxOSxmb3IgaGlkZGVuIGFwCisKKwl3cnF1LT5kYXRhLmxlbmd0aCA9IHNpemVvZigqcmFuZ2UpOworCW1lbXNldChyYW5nZSwgMCwgc2l6ZW9mKCpyYW5nZSkpOworCisJLyogTGV0J3MgdHJ5IHRvIGtlZXAgdGhpcyBzdHJ1Y3QgaW4gdGhlIHNhbWUgb3JkZXIgYXMgaW4KKwkgKiBsaW51eC9pbmNsdWRlL3dpcmVsZXNzLmgKKwkgKi8KKworCS8qIFRPRE86IFNlZSB3aGF0IHZhbHVlcyB3ZSBjYW4gc2V0LCBhbmQgcmVtb3ZlIHRoZSBvbmVzIHdlIGNhbid0CisJICogc2V0LCBvciBmaWxsIHRoZW0gd2l0aCBzb21lIGRlZmF1bHQgZGF0YS4KKwkgKi8KKworCS8qIH41IE1iL3MgcmVhbCAoODAyLjExYikgKi8KKwlyYW5nZS0+dGhyb3VnaHB1dCA9IDUgKiAxMDAwICogMTAwMDsKKworCS8vIFRPRE86IE5vdCB1c2VkIGluIDgwMi4xMWI/CisvLwlyYW5nZS0+bWluX253aWQ7CS8qIE1pbmltYWwgTldJRCB3ZSBhcmUgYWJsZSB0byBzZXQgKi8KKwkvLyBUT0RPOiBOb3QgdXNlZCBpbiA4MDIuMTFiPworLy8JcmFuZ2UtPm1heF9ud2lkOwkvKiBNYXhpbWFsIE5XSUQgd2UgYXJlIGFibGUgdG8gc2V0ICovCisKKyAgICAgICAgLyogT2xkIEZyZXF1ZW5jeSAoYmFja3dhcmQgY29tcGF0IC0gbW92ZWQgbG93ZXIgKSAqLworLy8JcmFuZ2UtPm9sZF9udW1fY2hhbm5lbHM7CisvLwlyYW5nZS0+b2xkX251bV9mcmVxdWVuY3k7CisvLwlyYW5nZS0+b2xkX2ZyZXFbNl07IC8qIEZpbGxlciB0byBrZWVwICJ2ZXJzaW9uIiBhdCB0aGUgc2FtZSBvZmZzZXQgKi8KKwlpZihwcml2LT5yZl9zZXRfc2VucyAhPSBOVUxMKQorCQlyYW5nZS0+c2Vuc2l0aXZpdHkgPSBwcml2LT5tYXhfc2VuczsJLyogc2lnbmFsIGxldmVsIHRocmVzaG9sZCByYW5nZSAqLworCisJcmFuZ2UtPm1heF9xdWFsLnF1YWwgPSAxMDA7CisJLyogVE9ETzogRmluZCByZWFsIG1heCBSU1NJIGFuZCBzdGljayBoZXJlICovCisJcmFuZ2UtPm1heF9xdWFsLmxldmVsID0gMDsKKwlyYW5nZS0+bWF4X3F1YWwubm9pc2UgPSAtOTg7CisJcmFuZ2UtPm1heF9xdWFsLnVwZGF0ZWQgPSA3OyAvKiBVcGRhdGVkIGFsbCB0aHJlZSAqLworCisJcmFuZ2UtPmF2Z19xdWFsLnF1YWwgPSA5MjsgLyogPiA4JSBtaXNzZWQgYmVhY29ucyBpcyAnYmFkJyAqLworCS8qIFRPRE86IEZpbmQgcmVhbCAnZ29vZCcgdG8gJ2JhZCcgdGhyZXNob2wgdmFsdWUgZm9yIFJTU0kgKi8KKwlyYW5nZS0+YXZnX3F1YWwubGV2ZWwgPSAyMCArIC05ODsKKwlyYW5nZS0+YXZnX3F1YWwubm9pc2UgPSAwOworCXJhbmdlLT5hdmdfcXVhbC51cGRhdGVkID0gNzsgLyogVXBkYXRlZCBhbGwgdGhyZWUgKi8KKworCXJhbmdlLT5udW1fYml0cmF0ZXMgPSBSQVRFX0NPVU5UOworCisJZm9yIChpID0gMDsgaSA8IFJBVEVfQ09VTlQgJiYgaSA8IElXX01BWF9CSVRSQVRFUzsgaSsrKSB7CisJCXJhbmdlLT5iaXRyYXRlW2ldID0gcnRsODE4MF9yYXRlc1tpXTsKKwl9CisKKwlyYW5nZS0+bWluX2ZyYWcgPSBNSU5fRlJBR19USFJFU0hPTEQ7CisJcmFuZ2UtPm1heF9mcmFnID0gTUFYX0ZSQUdfVEhSRVNIT0xEOworCisJcmFuZ2UtPnBtX2NhcGEgPSAwOworCisJcmFuZ2UtPndlX3ZlcnNpb25fY29tcGlsZWQgPSBXSVJFTEVTU19FWFQ7CisJcmFuZ2UtPndlX3ZlcnNpb25fc291cmNlID0gMTY7CisKKy8vCXJhbmdlLT5yZXRyeV9jYXBhOwkvKiBXaGF0IHJldHJ5IG9wdGlvbnMgYXJlIHN1cHBvcnRlZCAqLworLy8JcmFuZ2UtPnJldHJ5X2ZsYWdzOwkvKiBIb3cgdG8gZGVjb2RlIG1heC9taW4gcmV0cnkgbGltaXQgKi8KKy8vCXJhbmdlLT5yX3RpbWVfZmxhZ3M7CS8qIEhvdyB0byBkZWNvZGUgbWF4L21pbiByZXRyeSBsaWZlICovCisvLwlyYW5nZS0+bWluX3JldHJ5OwkvKiBNaW5pbWFsIG51bWJlciBvZiByZXRyaWVzICovCisvLwlyYW5nZS0+bWF4X3JldHJ5OwkvKiBNYXhpbWFsIG51bWJlciBvZiByZXRyaWVzICovCisvLwlyYW5nZS0+bWluX3JfdGltZTsJLyogTWluaW1hbCByZXRyeSBsaWZldGltZSAqLworLy8JcmFuZ2UtPm1heF9yX3RpbWU7CS8qIE1heGltYWwgcmV0cnkgbGlmZXRpbWUgKi8KKworICAgICAgICByYW5nZS0+bnVtX2NoYW5uZWxzID0gMTQ7CisKKwlmb3IgKGkgPSAwLCB2YWwgPSAwOyBpIDwgMTQ7IGkrKykgeworCisJCS8vIEluY2x1ZGUgb25seSBsZWdhbCBmcmVxdWVuY2llcyBmb3Igc29tZSBjb3VudHJpZXMKKyNpZmRlZiBFTkFCTEVfRE9UMTFECisJCWlmICgoR0VUX0RPVDExRF9JTkZPKHByaXYtPmllZWU4MDIxMSktPmNoYW5uZWxfbWFwKVtpKzFdKSB7CisjZWxzZQorCQlpZiAoKHByaXYtPmllZWU4MDIxMS0+Y2hhbm5lbF9tYXApW2krMV0pIHsKKyNlbmRpZgorCQkgICAgICAgIHJhbmdlLT5mcmVxW3ZhbF0uaSA9IGkgKyAxOworCQkJcmFuZ2UtPmZyZXFbdmFsXS5tID0gaWVlZTgwMjExX3dsYW5fZnJlcXVlbmNpZXNbaV0gKiAxMDAwMDA7CisJCQlyYW5nZS0+ZnJlcVt2YWxdLmUgPSAxOworCQkJdmFsKys7CisJCX0gZWxzZSB7CisJCQkvLyBGSVhNRTogZG8gd2UgbmVlZCB0byBzZXQgYW55dGhpbmcgZm9yIGNoYW5uZWxzCisJCQkvLyB3ZSBkb24ndCB1c2UgPworCQl9CisKKwkJaWYgKHZhbCA9PSBJV19NQVhfRlJFUVVFTkNJRVMpCisJCWJyZWFrOworCX0KKworCXJhbmdlLT5udW1fZnJlcXVlbmN5ID0gdmFsOworCXJhbmdlLT5lbmNfY2FwYSA9IElXX0VOQ19DQVBBX1dQQSB8IElXX0VOQ19DQVBBX1dQQTIgfAorICAgICAgICAgICAgICAgICAgICAgICAgICBJV19FTkNfQ0FQQV9DSVBIRVJfVEtJUCB8IElXX0VOQ19DQVBBX0NJUEhFUl9DQ01QOworCisJLy90bXAtPnNjYW5fY2FwYSA9IDB4MDE7IC8vWUosYWRkLDA4MDgxOSxmb3IgaGlkZGVuIGFwCisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IHI4MTgwX3d4X3NldF9zY2FuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmEsCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmIpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCWludCByZXQ7CisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUgPSBwcml2LT5pZWVlODAyMTE7CisKKworCWlmKHByaXYtPmllZWU4MDIxMS0+Ykh3UmFkaW9PZmYpCisJCXJldHVybiAwOworCisvL1lKLGFkZCwwODA4MTksIGZvciBoaWRkZW4gYXAKKwkvL3ByaW50aygiPT0qJiomKiY9PT4lcyBpblxuIiwgX19mdW5jX18pOworCS8vcHJpbnRrKCI9KiYqJiomKj09PT5mbGFnOiV4LCAleFxuIiwgd3JxdS0+ZGF0YS5mbGFncywgSVdfU0NBTl9USElTX0VTU0lEKTsKKwlpZiAod3JxdS0+ZGF0YS5mbGFncyAmIElXX1NDQU5fVEhJU19FU1NJRCkKKwl7CisJCXN0cnVjdCBpd19zY2FuX3JlcSogcmVxID0gKHN0cnVjdCBpd19zY2FuX3JlcSopYjsKKwkJaWYgKHJlcS0+ZXNzaWRfbGVuKQorCQl7CisJCQkvL3ByaW50aygiPT0qKiYqJiomKio9PT0+c2NhbiBzZXQgc3NpZDolc1xuIiwgcmVxLT5lc3NpZCk7CisJCQlpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZF9sZW4gPSByZXEtPmVzc2lkX2xlbjsKKwkJCW1lbWNweShpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZCwgcmVxLT5lc3NpZCwgcmVxLT5lc3NpZF9sZW4pOworCQkJLy9wcmludGsoIj09PT09Pm5ldHdvcmsgc3NpZDolc1xuIiwgaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWQpOworCQl9CisJfQorLy9ZSixhZGQsMDgwODE5LCBmb3IgaGlkZGVuIGFwLCBlbmQKKworCWRvd24oJnByaXYtPnd4X3NlbSk7CisJaWYocHJpdi0+dXApeworI2lmZGVmIEVOQUJMRV9JUFMKKy8vCQlwcmludGsoInNldCBzY2FuIEVOQUJMRV9JUFNcbiIpOworCQlwcml2LT5pZWVlODAyMTEtPmFjdHNjYW5uaW5nID0gdHJ1ZTsKKwkJaWYocHJpdi0+YkluYWN0aXZlUHMgJiYgKHByaXYtPmllZWU4MDIxMS0+c3RhdGUgIT0gSUVFRTgwMjExX0xJTktFRCkpeworCQkJSVBTTGVhdmUoZGV2KTsKKy8vCQkJZG93bigmcHJpdi0+aWVlZTgwMjExLT53eF9zZW0pOworCisvLwkJCWlmIChwcml2LT5pZWVlODAyMTEtPml3X21vZGUgPT0gSVdfTU9ERV9NT05JVE9SIHx8ICEocHJpdi0+aWVlZTgwMjExLT5wcm90b19zdGFydGVkKSl7CisvLwkJCQlyZXQgPSAtMTsKKy8vCQkJCXVwKCZwcml2LT5pZWVlODAyMTEtPnd4X3NlbSk7CisvLwkJCQl1cCgmcHJpdi0+d3hfc2VtKTsKKy8vCQkJCXJldHVybiByZXQ7CisvLwkJCX0KKworCS8vCXF1ZXVlX3dvcmsocHJpdi0+aWVlZTgwMjExLT53cSwgJnByaXYtPmllZWU4MDIxMS0+d3hfc3luY19zY2FuX3dxKTsKKwkJLy9wcmludGsoInN0YXJ0IHNjYW49PT09PT09PT09PT09PT09PT09PT09PT09PT09PlxuIik7CisJCWllZWU4MDIxMV9zb2Z0bWFjX2lwc19zY2FuX3N5bmNybyhwcml2LT5pZWVlODAyMTEpOworLy9pZWVlODAyMTFfc3RhcnRfc2Nhbihwcml2LT5pZWVlODAyMTEpOworCQkvKiBpbnRlbnRpb25hbGx5IGZvcmdldCB0byB1cCBzZW0gKi8KKy8vCQkJdXAoJnByaXYtPmllZWU4MDIxMS0+d3hfc2VtKTsKKwkJCXJldCA9IDA7CisJCX0KKwkJZWxzZQorI2VuZGlmCisJCXsKKwkJCS8vWUosYWRkLDA4MDgyOCwgcHJldmVudCBzY2FuIGluIEJ1c3lUcmFmZmljCisJCQkvL0ZJWE1FOiBOZWVkIHRvIGNvbnNpZGVyIGxhc3Qgc2NhbiB0aW1lCisJCQlpZiAoKHByaXYtPmxpbmtfZGV0ZWN0LmJCdXN5VHJhZmZpYykgJiYgKHRydWUpKQorCQkJeworCQkJCXJldCA9IDA7CisJCQkJcHJpbnRrKCJOb3cgdHJhZmZpYyBpcyBidXN5LCBwbGVhc2UgdHJ5IGxhdGVyIVxuIik7CisJCQl9CisJCQllbHNlCisJCQkvL1lKLGFkZCwwODA4MjgsIHByZXZlbnQgc2NhbiBpbiBCdXN5VHJhZmZpYyxlbmQKKwkJCQlyZXQgPSBpZWVlODAyMTFfd3hfc2V0X3NjYW4ocHJpdi0+aWVlZTgwMjExLGEsd3JxdSxiKTsKKwkJfQorCX0KKwllbHNlCisJCXJldCA9IC0xOworCisJdXAoJnByaXYtPnd4X3NlbSk7CisKKwlyZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyBpbnQgcjgxODBfd3hfZ2V0X3NjYW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqYSwKKwkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqYikKK3sKKworCWludCByZXQ7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCisJZG93bigmcHJpdi0+d3hfc2VtKTsKKwlpZihwcml2LT51cCkKKwkJcmV0ID0gaWVlZTgwMjExX3d4X2dldF9zY2FuKHByaXYtPmllZWU4MDIxMSxhLHdycXUsYik7CisJZWxzZQorCQlyZXQgPSAtMTsKKworCXVwKCZwcml2LT53eF9zZW0pOworCXJldHVybiByZXQ7Cit9CisKKworc3RhdGljIGludCByODE4MF93eF9zZXRfZXNzaWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmEsCisJCQkgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpiKQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCWludCByZXQ7CisKKwlpZihwcml2LT5pZWVlODAyMTEtPmJId1JhZGlvT2ZmKQorCQlyZXR1cm4gMDsKKworCWRvd24oJnByaXYtPnd4X3NlbSk7CisjaWZkZWYgRU5BQkxFX0lQUworCS8vcHJpbnRrKCJzZXQgZXNzaWQgRU5BQkxFX0lQU1xuIik7CisJaWYocHJpdi0+YkluYWN0aXZlUHMpCisJCUlQU0xlYXZlKGRldik7CisjZW5kaWYKKy8vCXByaW50aygiaGFoYTpzZXQgZXNzaWQgJXMgZXNzaWRfbGVuID0gJWQgZXNzaWRfZmxncyA9ICVkXG4iLGIsICB3cnF1LT5lc3NpZC5sZW5ndGgsIHdycXUtPmVzc2lkLmZsYWdzKTsKKworCXJldCA9IGllZWU4MDIxMV93eF9zZXRfZXNzaWQocHJpdi0+aWVlZTgwMjExLGEsd3JxdSxiKTsKKworCXVwKCZwcml2LT53eF9zZW0pOworCXJldHVybiByZXQ7Cit9CisKKworc3RhdGljIGludCByODE4MF93eF9nZXRfZXNzaWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmEsCisJCQkgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpiKQoreworCWludCByZXQ7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCisJZG93bigmcHJpdi0+d3hfc2VtKTsKKworCXJldCA9IGllZWU4MDIxMV93eF9nZXRfZXNzaWQocHJpdi0+aWVlZTgwMjExLCBhLCB3cnF1LCBiKTsKKworCXVwKCZwcml2LT53eF9zZW0pOworCisJcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMgaW50IHI4MTgwX3d4X3NldF9mcmVxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmEsCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmIpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisKKworCWlmKHByaXYtPmllZWU4MDIxMS0+Ykh3UmFkaW9PZmYpCisJCXJldHVybiAwOworCisJZG93bigmcHJpdi0+d3hfc2VtKTsKKworCXJldCA9IGllZWU4MDIxMV93eF9zZXRfZnJlcShwcml2LT5pZWVlODAyMTEsIGEsIHdycXUsIGIpOworCisJdXAoJnByaXYtPnd4X3NlbSk7CisJcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMgaW50IHI4MTgwX3d4X2dldF9uYW1lKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlyZXR1cm4gaWVlZTgwMjExX3d4X2dldF9uYW1lKHByaXYtPmllZWU4MDIxMSwgaW5mbywgd3JxdSwgZXh0cmEpOworfQorCitzdGF0aWMgaW50IHI4MTgwX3d4X3NldF9mcmFnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCWlmKHByaXYtPmllZWU4MDIxMS0+Ykh3UmFkaW9PZmYpCisJCXJldHVybiAwOworCisJaWYgKHdycXUtPmZyYWcuZGlzYWJsZWQpCisJCXByaXYtPmllZWU4MDIxMS0+ZnRzID0gREVGQVVMVF9GUkFHX1RIUkVTSE9MRDsKKwllbHNlIHsKKwkJaWYgKHdycXUtPmZyYWcudmFsdWUgPCBNSU5fRlJBR19USFJFU0hPTEQgfHwKKwkJICAgIHdycXUtPmZyYWcudmFsdWUgPiBNQVhfRlJBR19USFJFU0hPTEQpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlwcml2LT5pZWVlODAyMTEtPmZ0cyA9IHdycXUtPmZyYWcudmFsdWUgJiB+MHgxOworCX0KKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgcjgxODBfd3hfZ2V0X2ZyYWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCisJd3JxdS0+ZnJhZy52YWx1ZSA9IHByaXYtPmllZWU4MDIxMS0+ZnRzOworCXdycXUtPmZyYWcuZml4ZWQgPSAwOwkvKiBubyBhdXRvIHNlbGVjdCAqLworCXdycXUtPmZyYWcuZGlzYWJsZWQgPSAod3JxdS0+ZnJhZy52YWx1ZSA9PSBERUZBVUxUX0ZSQUdfVEhSRVNIT0xEKTsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgcjgxODBfd3hfc2V0X3dhcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgdW5pb24gaXdyZXFfZGF0YSAqYXdycSwKKwkJCSBjaGFyICpleHRyYSkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCWlmKHByaXYtPmllZWU4MDIxMS0+Ykh3UmFkaW9PZmYpCisJCXJldHVybiAwOworCisJZG93bigmcHJpdi0+d3hfc2VtKTsKKworCXJldCA9IGllZWU4MDIxMV93eF9zZXRfd2FwKHByaXYtPmllZWU4MDIxMSxpbmZvLGF3cnEsZXh0cmEpOworCisJdXAoJnByaXYtPnd4X3NlbSk7CisJcmV0dXJuIHJldDsKKworfQorCisKK3N0YXRpYyBpbnQgcjgxODBfd3hfZ2V0X3dhcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCisJcmV0dXJuIGllZWU4MDIxMV93eF9nZXRfd2FwKHByaXYtPmllZWU4MDIxMSxpbmZvLHdycXUsZXh0cmEpOworfQorCisKK3N0YXRpYyBpbnQgcjgxODBfd3hfc2V0X2VuYyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqa2V5KQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlpbnQgcmV0OworCisJaWYocHJpdi0+aWVlZTgwMjExLT5iSHdSYWRpb09mZikKKwkJcmV0dXJuIDA7CisKKworCWRvd24oJnByaXYtPnd4X3NlbSk7CisKKwlpZihwcml2LT5od193ZXApIHJldCA9IHI4MTgwX3d4X3NldF9rZXkoZGV2LGluZm8sd3JxdSxrZXkpOworCWVsc2V7CisJCURNRVNHKCJTZXR0aW5nIFNXIHdlcCBrZXkiKTsKKwkJcmV0ID0gaWVlZTgwMjExX3d4X3NldF9lbmNvZGUocHJpdi0+aWVlZTgwMjExLGluZm8sd3JxdSxrZXkpOworCX0KKworCXVwKCZwcml2LT53eF9zZW0pOworCXJldHVybiByZXQ7Cit9CisKKworc3RhdGljIGludCByODE4MF93eF9nZXRfZW5jKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICprZXkpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCisJcmV0dXJuIGllZWU4MDIxMV93eF9nZXRfZW5jb2RlKHByaXYtPmllZWU4MDIxMSwgaW5mbywgd3JxdSwga2V5KTsKK30KKworCitzdGF0aWMgaW50IHI4MTgwX3d4X3NldF9zY2FuX3R5cGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqYWEsIHVuaW9uCisgaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqcCl7CisKKyAJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCWludCAqcGFybXM9KGludCopcDsKKwlpbnQgbW9kZT1wYXJtc1swXTsKKworCWlmKHByaXYtPmllZWU4MDIxMS0+Ykh3UmFkaW9PZmYpCisJCXJldHVybiAwOworCisJcHJpdi0+aWVlZTgwMjExLT5hY3RpdmVfc2NhbiA9IG1vZGU7CisKKwlyZXR1cm4gMTsKK30KKworCisvKiBhZGRlZCBieSBjaHJpc3RpYW4gKi8KKy8qCitzdGF0aWMgaW50IHI4MTgwX3d4X3NldF9tb25pdG9yX3R5cGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqYWEsIHVuaW9uCisgaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqcCl7CisKKyAJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCWludCAqcGFybXM9KGludCopcDsKKwlpbnQgbW9kZT1wYXJtc1swXTsKKworCWlmKHByaXYtPmllZWU4MDIxMS0+aXdfbW9kZSAhPSBJV19NT0RFX01PTklUT1IpIHJldHVybiAtMTsKKyAgCXByaXYtPnByaXNtX2hkciA9IG1vZGU7CisJaWYoIW1vZGUpZGV2LT50eXBlPUFSUEhSRF9JRUVFODAyMTE7CisJZWxzZSBkZXYtPnR5cGU9QVJQSFJEX0lFRUU4MDIxMV9QUklTTTsKKwlETUVTRygidXNpbmcgJXMgUlggZW5jYXAiLCBtb2RlID8gIkFWUyI6IjgwMjExIik7CisJcmV0dXJuIDA7CisKK30KKyovCisvL29mICAgICAgICAgcjgxODBfd3hfc2V0X21vbml0b3JfdHlwZQorLyogZW5kIGFkZGVkIGNocmlzdGlhbiAqLworCitzdGF0aWMgaW50IHI4MTgwX3d4X3NldF9yZXRyeShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkJdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCWludCBlcnIgPSAwOworCisJaWYocHJpdi0+aWVlZTgwMjExLT5iSHdSYWRpb09mZikKKwkJcmV0dXJuIDA7CisKKwlkb3duKCZwcml2LT53eF9zZW0pOworCisJaWYgKHdycXUtPnJldHJ5LmZsYWdzICYgSVdfUkVUUllfTElGRVRJTUUgfHwKKwkgICAgd3JxdS0+cmV0cnkuZGlzYWJsZWQpeworCQllcnIgPSAtRUlOVkFMOworCQlnb3RvIGV4aXQ7CisJfQorCWlmICghKHdycXUtPnJldHJ5LmZsYWdzICYgSVdfUkVUUllfTElNSVQpKXsKKwkJZXJyID0gLUVJTlZBTDsKKwkJZ290byBleGl0OworCX0KKworCWlmKHdycXUtPnJldHJ5LnZhbHVlID4gUjgxODBfTUFYX1JFVFJZKXsKKwkJZXJyPSAtRUlOVkFMOworCQlnb3RvIGV4aXQ7CisJfQorCWlmICh3cnF1LT5yZXRyeS5mbGFncyAmIElXX1JFVFJZX01BWCkgeworCQlwcml2LT5yZXRyeV9ydHMgPSB3cnF1LT5yZXRyeS52YWx1ZTsKKwkJRE1FU0coIlNldHRpbmcgcmV0cnkgZm9yIFJUUy9DVFMgZGF0YSB0byAlZCIsIHdycXUtPnJldHJ5LnZhbHVlKTsKKworCX1lbHNlIHsKKwkJcHJpdi0+cmV0cnlfZGF0YSA9IHdycXUtPnJldHJ5LnZhbHVlOworCQlETUVTRygiU2V0dGluZyByZXRyeSBmb3Igbm9uIFJUUy9DVFMgZGF0YSB0byAlZCIsIHdycXUtPnJldHJ5LnZhbHVlKTsKKwl9CisKKwkvKiBGSVhNRSAhCisJICogV2UgbWlnaHQgdHJ5IHRvIHdyaXRlIGRpcmVjdGx5IHRoZSBUWCBjb25maWcgcmVnaXN0ZXIKKwkgKiBvciB0byByZXN0YXJ0IGp1c3QgdGhlIChSKVRYIHByb2Nlc3MuCisJICogSSdtIHVuc3VyZSBpZiB3aG9sZSByZXNldCBpcyByZWFsbHkgbmVlZGVkCisJICovCisKKyAJcnRsODE4MF9jb21taXQoZGV2KTsKKwkvKgorCWlmKHByaXYtPnVwKXsKKwkJcnRsODE4MF9ydHhfZGlzYWJsZShkZXYpOworCQlydGw4MTgwX3J4X2VuYWJsZShkZXYpOworCQlydGw4MTgwX3R4X2VuYWJsZShkZXYpOworCisJfQorCSovCitleGl0OgorCXVwKCZwcml2LT53eF9zZW0pOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCByODE4MF93eF9nZXRfcmV0cnkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJCXVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCisJd3JxdS0+cmV0cnkuZGlzYWJsZWQgPSAwOyAvKiBjYW4ndCBiZSBkaXNhYmxlZCAqLworCisJaWYgKCh3cnF1LT5yZXRyeS5mbGFncyAmIElXX1JFVFJZX1RZUEUpID09CisJICAgIElXX1JFVFJZX0xJRkVUSU1FKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICh3cnF1LT5yZXRyeS5mbGFncyAmIElXX1JFVFJZX01BWCkgeworCQl3cnF1LT5yZXRyeS5mbGFncyA9IElXX1JFVFJZX0xJTUlUICYgSVdfUkVUUllfTUFYOworCQl3cnF1LT5yZXRyeS52YWx1ZSA9IHByaXYtPnJldHJ5X3J0czsKKwl9IGVsc2UgeworCQl3cnF1LT5yZXRyeS5mbGFncyA9IElXX1JFVFJZX0xJTUlUICYgSVdfUkVUUllfTUlOOworCQl3cnF1LT5yZXRyeS52YWx1ZSA9IHByaXYtPnJldHJ5X2RhdGE7CisJfQorCS8vRE1FU0coInJldHVybmluZyAlZCIsd3JxdS0+cmV0cnkudmFsdWUpOworCisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByODE4MF93eF9nZXRfc2VucyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkJdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCWlmKHByaXYtPnJmX3NldF9zZW5zID09IE5VTEwpCisJCXJldHVybiAtMTsgLyogd2UgaGF2ZSBub3QgdGhpcyBzdXBwb3J0IGZvciB0aGlzIHJhZGlvICovCisJd3JxdS0+c2Vucy52YWx1ZSA9IHByaXYtPnNlbnM7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCByODE4MF93eF9zZXRfc2VucyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkJdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisKKwlzaG9ydCBlcnIgPSAwOworCisJaWYocHJpdi0+aWVlZTgwMjExLT5iSHdSYWRpb09mZikKKwkJcmV0dXJuIDA7CisKKwlkb3duKCZwcml2LT53eF9zZW0pOworCS8vRE1FU0coImF0dGVtcHQgdG8gc2V0IHNlbnNpdml0eSB0byAlZGRiIix3cnF1LT5zZW5zLnZhbHVlKTsKKwlpZihwcml2LT5yZl9zZXRfc2VucyA9PSBOVUxMKSB7CisJCWVycj0gLTE7IC8qIHdlIGhhdmUgbm90IHRoaXMgc3VwcG9ydCBmb3IgdGhpcyByYWRpbyAqLworCQlnb3RvIGV4aXQ7CisJfQorCWlmKHByaXYtPnJmX3NldF9zZW5zKGRldiwgd3JxdS0+c2Vucy52YWx1ZSkgPT0gMCkKKwkJcHJpdi0+c2VucyA9IHdycXUtPnNlbnMudmFsdWU7CisJZWxzZQorCQllcnI9IC1FSU5WQUw7CisKK2V4aXQ6CisJdXAoJnByaXYtPnd4X3NlbSk7CisKKwlyZXR1cm4gZXJyOworfQorCisKK3N0YXRpYyBpbnQgcjgxODBfd3hfc2V0X3Jhd3R4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJaW50IHJldDsKKworCWlmKHByaXYtPmllZWU4MDIxMS0+Ykh3UmFkaW9PZmYpCisJCXJldHVybiAwOworCisJZG93bigmcHJpdi0+d3hfc2VtKTsKKworCXJldCA9IGllZWU4MDIxMV93eF9zZXRfcmF3dHgocHJpdi0+aWVlZTgwMjExLCBpbmZvLCB3cnF1LCBleHRyYSk7CisKKwl1cCgmcHJpdi0+d3hfc2VtKTsKKworCXJldHVybiByZXQ7CisKK30KKworc3RhdGljIGludCByODE4MF93eF9nZXRfcG93ZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCWludCByZXQ7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCisJZG93bigmcHJpdi0+d3hfc2VtKTsKKworCXJldCA9IGllZWU4MDIxMV93eF9nZXRfcG93ZXIocHJpdi0+aWVlZTgwMjExLCBpbmZvLCB3cnF1LCBleHRyYSk7CisKKwl1cCgmcHJpdi0+d3hfc2VtKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcjgxODBfd3hfc2V0X3Bvd2VyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCisJaWYocHJpdi0+aWVlZTgwMjExLT5iSHdSYWRpb09mZikKKwkJcmV0dXJuIDA7CisKKwlkb3duKCZwcml2LT53eF9zZW0pOworCXByaW50aygiPT4+Pj4+Pj4+Pj49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT5zZXQgcG93ZXI6JWQsJWQhXG4iLHdycXUtPnBvd2VyLmRpc2FibGVkLCB3cnF1LT5wb3dlci5mbGFncyk7CisJaWYgKHdycXUtPnBvd2VyLmRpc2FibGVkPT0wKSB7CisJCXdycXUtPnBvd2VyLmZsYWdzfD1JV19QT1dFUl9BTExfUjsKKwkJd3JxdS0+cG93ZXIuZmxhZ3N8PUlXX1BPV0VSX1RJTUVPVVQ7CisJCXdycXUtPnBvd2VyLnZhbHVlID0xMDAwOworCX0KKworCXJldCA9IGllZWU4MDIxMV93eF9zZXRfcG93ZXIocHJpdi0+aWVlZTgwMjExLCBpbmZvLCB3cnF1LCBleHRyYSk7CisKKwl1cCgmcHJpdi0+d3hfc2VtKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcjgxODBfd3hfc2V0X3J0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisKKworCWlmKHByaXYtPmllZWU4MDIxMS0+Ykh3UmFkaW9PZmYpCisJCXJldHVybiAwOworCisJaWYgKHdycXUtPnJ0cy5kaXNhYmxlZCkKKwkJcHJpdi0+cnRzID0gREVGQVVMVF9SVFNfVEhSRVNIT0xEOworCWVsc2UgeworCQlpZiAod3JxdS0+cnRzLnZhbHVlIDwgTUlOX1JUU19USFJFU0hPTEQgfHwKKwkJICAgIHdycXUtPnJ0cy52YWx1ZSA+IE1BWF9SVFNfVEhSRVNIT0xEKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJcHJpdi0+cnRzID0gd3JxdS0+cnRzLnZhbHVlOworCX0KKworCXJldHVybiAwOworfQorc3RhdGljIGludCByODE4MF93eF9nZXRfcnRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCisKKwl3cnF1LT5ydHMudmFsdWUgPSBwcml2LT5ydHM7CisJd3JxdS0+cnRzLmZpeGVkID0gMDsJLyogbm8gYXV0byBzZWxlY3QgKi8KKwl3cnF1LT5ydHMuZGlzYWJsZWQgPSAod3JxdS0+cnRzLnZhbHVlID09IDApOworCisJcmV0dXJuIDA7Cit9CitzdGF0aWMgaW50IGR1bW15KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmEsCisJCSB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LGNoYXIgKmIpCit7CisJcmV0dXJuIC0xOworfQorCisvKgorc3RhdGljIGludCByODE4MF93eF9nZXRfcHNtb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWU7CisJaW50IHJldCA9IDA7CisKKworCisJZG93bigmcHJpdi0+d3hfc2VtKTsKKworCWlmKHByaXYpIHsKKwkJaWVlZSA9IHByaXYtPmllZWU4MDIxMTsKKwkJaWYoaWVlZS0+cHMgPT0gSUVFRTgwMjExX1BTX0RJU0FCTEVEKSB7CisJCQkqKCh1bnNpZ25lZCBpbnQgKilleHRyYSkgPSBJRUVFODAyMTFfUFNfRElTQUJMRUQ7CisJCQlnb3RvIGV4aXQ7CisJCX0KKwkJKigodW5zaWduZWQgaW50ICopZXh0cmEpID0gSVdfUE9XRVJfVElNRU9VVDsKKyAJaWYgKGllZWUtPnBzICYgSUVFRTgwMjExX1BTX01CQ0FTVCkKKwkJCSooKHVuc2lnbmVkIGludCAqKWV4dHJhKSB8PSBJV19QT1dFUl9BTExfUjsKKwkJZWxzZQorCQkJKigodW5zaWduZWQgaW50ICopZXh0cmEpIHw9IElXX1BPV0VSX1VOSUNBU1RfUjsKKwl9IGVsc2UKKwkJcmV0ID0gLTE7CitleGl0OgorCXVwKCZwcml2LT53eF9zZW0pOworCisJcmV0dXJuIHJldDsKK30KK3N0YXRpYyBpbnQgcjgxODBfd3hfc2V0X3BzbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCS8vc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWU7CisJaW50IHJldCA9IDA7CisKKworCisJZG93bigmcHJpdi0+d3hfc2VtKTsKKworCXJldCA9IGllZWU4MDIxMV93eF9zZXRfcG93ZXIocHJpdi0+aWVlZTgwMjExLCBpbmZvLCB3cnF1LCBleHRyYSk7CisKKwl1cCgmcHJpdi0+d3hfc2VtKTsKKworCXJldHVybiByZXQ7CisKK30KKyovCisKK3N0YXRpYyBpbnQgcjgxODBfd3hfZ2V0X2l3bW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlOworCWludCByZXQgPSAwOworCisKKworCWRvd24oJnByaXYtPnd4X3NlbSk7CisKKwlpZWVlID0gcHJpdi0+aWVlZTgwMjExOworCisJc3RyY3B5KGV4dHJhLCAiODAyLjExIik7CisJaWYoaWVlZS0+bW9kdWxhdGlvbiAmIElFRUU4MDIxMV9DQ0tfTU9EVUxBVElPTikgeworCQlzdHJjYXQoZXh0cmEsICJiIik7CisJCWlmKGllZWUtPm1vZHVsYXRpb24gJiBJRUVFODAyMTFfT0ZETV9NT0RVTEFUSU9OKQorCQkJc3RyY2F0KGV4dHJhLCAiL2ciKTsKKwl9IGVsc2UgaWYoaWVlZS0+bW9kdWxhdGlvbiAmIElFRUU4MDIxMV9PRkRNX01PRFVMQVRJT04pCisJCXN0cmNhdChleHRyYSwgImciKTsKKworCXVwKCZwcml2LT53eF9zZW0pOworCisJcmV0dXJuIHJldDsKK30KK3N0YXRpYyBpbnQgcjgxODBfd3hfc2V0X2l3bW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlID0gcHJpdi0+aWVlZTgwMjExOworCWludCAqcGFyYW0gPSAoaW50ICopZXh0cmE7CisJaW50IHJldCA9IDA7CisJaW50IG1vZHVsYXRpb24gPSAwLCBtb2RlID0gMDsKKworCisJaWYocHJpdi0+aWVlZTgwMjExLT5iSHdSYWRpb09mZikKKwkJcmV0dXJuIDA7CisKKwlkb3duKCZwcml2LT53eF9zZW0pOworCisJaWYgKCpwYXJhbSA9PSAxKSB7CisJCW1vZHVsYXRpb24gfD0gSUVFRTgwMjExX0NDS19NT0RVTEFUSU9OOworCQltb2RlID0gSUVFRV9COworCXByaW50ayhLRVJOX0lORk8gIkIgbW9kZSFcbiIpOworCX0gZWxzZSBpZiAoKnBhcmFtID09IDIpIHsKKwkJbW9kdWxhdGlvbiB8PSBJRUVFODAyMTFfT0ZETV9NT0RVTEFUSU9OOworCQltb2RlID0gSUVFRV9HOworCXByaW50ayhLRVJOX0lORk8gIkcgbW9kZSFcbiIpOworCX0gZWxzZSBpZiAoKnBhcmFtID09IDMpIHsKKwkJbW9kdWxhdGlvbiB8PSBJRUVFODAyMTFfQ0NLX01PRFVMQVRJT047CisJCW1vZHVsYXRpb24gfD0gSUVFRTgwMjExX09GRE1fTU9EVUxBVElPTjsKKwkJbW9kZSA9IElFRUVfQnxJRUVFX0c7CisJcHJpbnRrKEtFUk5fSU5GTyAiQi9HIG1vZGUhXG4iKTsKKwl9CisKKwlpZihpZWVlLT5wcm90b19zdGFydGVkKSB7CisJCWllZWU4MDIxMV9zdG9wX3Byb3RvY29sKGllZWUpOworCQlpZWVlLT5tb2RlID0gbW9kZTsKKwkJaWVlZS0+bW9kdWxhdGlvbiA9IG1vZHVsYXRpb247CisJCWllZWU4MDIxMV9zdGFydF9wcm90b2NvbChpZWVlKTsKKwl9IGVsc2UgeworCQlpZWVlLT5tb2RlID0gbW9kZTsKKwkJaWVlZS0+bW9kdWxhdGlvbiA9IG1vZHVsYXRpb247CisvLwkJaWVlZTgwMjExX3N0YXJ0X3Byb3RvY29sKGllZWUpOworCX0KKworCXVwKCZwcml2LT53eF9zZW0pOworCisJcmV0dXJuIHJldDsKK30KK3N0YXRpYyBpbnQgcjgxODBfd3hfZ2V0X3ByZWFtYmxlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCisKKwlkb3duKCZwcml2LT53eF9zZW0pOworCisKKworCSpleHRyYSA9IChjaGFyKSBwcml2LT5wbGNwX3ByZWFtYmxlX21vZGU7IAkvLyAwOmF1dG8gMTpzaG9ydCAyOmxvbmcKKwl1cCgmcHJpdi0+d3hfc2VtKTsKKworCXJldHVybiAwOworfQorc3RhdGljIGludCByODE4MF93eF9zZXRfcHJlYW1ibGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCWludCByZXQgPSAwOworCisKKwlpZihwcml2LT5pZWVlODAyMTEtPmJId1JhZGlvT2ZmKQorCQlyZXR1cm4gMDsKKworCWRvd24oJnByaXYtPnd4X3NlbSk7CisJaWYgKCpleHRyYTwwfHwqZXh0cmE+MikKKwkJcmV0ID0gLTE7CisJZWxzZQorCQlwcml2LT5wbGNwX3ByZWFtYmxlX21vZGUgPSAqKChzaG9ydCAqKWV4dHJhKSA7CisKKworCisJdXAoJnByaXYtPnd4X3NlbSk7CisKKwlyZXR1cm4gcmV0OworfQorc3RhdGljIGludCByODE4MF93eF9nZXRfc2lnbGV2ZWwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwkvL3N0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqbmV0d29yayA9ICYocHJpdi0+aWVlZTgwMjExLT5jdXJyZW50X25ldHdvcmspOworCWludCByZXQgPSAwOworCisKKworCWRvd24oJnByaXYtPnd4X3NlbSk7CisJLy8gTW9kaWZ5IGJ5IGhpa2FydSA2LjUKKwkqKChpbnQgKilleHRyYSkgPSBwcml2LT53c3RhdHMucXVhbC5sZXZlbDsvL2ZvciBpbnRlcmZhY2UgdGVzdCAsaXQgc2hvdWxkIGJlIHRoZSBwcml2LT53c3RhdHMucXVhbC5sZXZlbDsKKworCisKKwl1cCgmcHJpdi0+d3hfc2VtKTsKKworCXJldHVybiByZXQ7Cit9CitzdGF0aWMgaW50IHI4MTgwX3d4X2dldF9zaWdxdWFsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJLy9zdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKm5ldHdvcmsgPSAmKHByaXYtPmllZWU4MDIxMS0+Y3VycmVudF9uZXR3b3JrKTsKKwlpbnQgcmV0ID0gMDsKKworCisKKwlkb3duKCZwcml2LT53eF9zZW0pOworCS8vIE1vZGlmeSBieSBoaWthcnUgNi41CisJKigoaW50ICopZXh0cmEpID0gcHJpdi0+d3N0YXRzLnF1YWwucXVhbDsvL2ZvciBpbnRlcmZhY2UgdGVzdCAsaXQgc2hvdWxkIGJlIHRoZSBwcml2LT53c3RhdHMucXVhbC5xdWFsOworCisKKworCXVwKCZwcml2LT53eF9zZW0pOworCisJcmV0dXJuIHJldDsKK30KK3N0YXRpYyBpbnQgcjgxODBfd3hfcmVzZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJCXVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID1pZWVlODAyMTFfcHJpdihkZXYpOworCWRvd24oJnByaXYtPnd4X3NlbSk7CisKKwlwcml2LT5zdGF0cy50eHJkdSA9IDA7CisJcHJpdi0+c3RhdHMucnhyZHUgPSAwOworCXByaXYtPnN0YXRzLnJ4bm9sYXN0ID0gMDsKKwlwcml2LT5zdGF0cy5yeG5vZGF0YSA9IDA7CisJcHJpdi0+c3RhdHMucnhub3BvaW50ZXIgPSAwOworCXByaXYtPnN0YXRzLnR4bnBlcnIgPSAwOworCXByaXYtPnN0YXRzLnR4cmVzdW1lZCA9IDA7CisJcHJpdi0+c3RhdHMucnhlcnIgPSAwOworCXByaXYtPnN0YXRzLnJ4b3ZlcmZsb3cgPSAwOworCXByaXYtPnN0YXRzLnJ4aW50ID0gMDsKKworCXByaXYtPnN0YXRzLnR4bnBva2ludCA9IDA7CisJcHJpdi0+c3RhdHMudHhocG9raW50ID0gMDsKKwlwcml2LT5zdGF0cy50eGhwZXJyID0gMDsKKwlwcml2LT5zdGF0cy5pbnRzID0gMDsKKwlwcml2LT5zdGF0cy5zaGludHMgPSAwOworCXByaXYtPnN0YXRzLnR4b3ZlcmZsb3cgPSAwOworCXByaXYtPnN0YXRzLnJ4ZG1hZmFpbCA9IDA7CisJcHJpdi0+c3RhdHMudHhiZWFjb24gPSAwOworCXByaXYtPnN0YXRzLnR4YmVhY29uZXJyID0gMDsKKwlwcml2LT5zdGF0cy50eGxwb2tpbnQgPSAwOworCXByaXYtPnN0YXRzLnR4bHBlcnIgPSAwOworCXByaXYtPnN0YXRzLnR4cmV0cnkgPTA7Ly8yMDA2MDYwMQorCXByaXYtPnN0YXRzLnJ4Y3JjZXJybWluPTA7CisJcHJpdi0+c3RhdHMucnhjcmNlcnJtaWQ9MDsKKwlwcml2LT5zdGF0cy5yeGNyY2Vycm1heD0wOworCXByaXYtPnN0YXRzLnJ4aWN2ZXJyPTA7CisKKwl1cCgmcHJpdi0+d3hfc2VtKTsKKworCXJldHVybiAwOworCit9CitzdGF0aWMgaW50IHI4MTgwX3d4X3JhZGlvX29uKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCQl1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9aWVlZTgwMjExX3ByaXYoZGV2KTsKKworCWlmKHByaXYtPmllZWU4MDIxMS0+Ykh3UmFkaW9PZmYpCisJCXJldHVybiAwOworCisKKwlkb3duKCZwcml2LT53eF9zZW0pOworCXByaXYtPnJmX3dha2V1cChkZXYpOworCisJdXAoJnByaXYtPnd4X3NlbSk7CisKKwlyZXR1cm4gMDsKKworfQorCitzdGF0aWMgaW50IHI4MTgwX3d4X3JhZGlvX29mZihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkJdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPWllZWU4MDIxMV9wcml2KGRldik7CisKKwlpZihwcml2LT5pZWVlODAyMTEtPmJId1JhZGlvT2ZmKQorCQlyZXR1cm4gMDsKKworCisJZG93bigmcHJpdi0+d3hfc2VtKTsKKwlwcml2LT5yZl9zbGVlcChkZXYpOworCisJdXAoJnByaXYtPnd4X3NlbSk7CisKKwlyZXR1cm4gMDsKKworfQorc3RhdGljIGludCByODE4MF93eF9nZXRfY2hhbm5lbHBsYW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCisKKworCWRvd24oJnByaXYtPnd4X3NlbSk7CisJKmV4dHJhID0gcHJpdi0+Y2hhbm5lbF9wbGFuOworCisKKworCXVwKCZwcml2LT53eF9zZW0pOworCisJcmV0dXJuIDA7Cit9CitzdGF0aWMgaW50IHI4MTgwX3d4X3NldF9jaGFubmVscGxhbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJLy9zdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSA9IG5ldGRldl9wcml2KGRldik7CisJaW50ICp2YWwgPSAoaW50ICopZXh0cmE7CisJaW50IGk7CisJcHJpbnRrKCItLS0tLWluIGZ1biAlc1xuIiwgX19mdW5jX18pOworCisJaWYocHJpdi0+aWVlZTgwMjExLT5iSHdSYWRpb09mZikKKwkJcmV0dXJuIDA7CisKKwkvL3Vuc2lnbmVkIGxvbmcgZmxhZ3M7CisJZG93bigmcHJpdi0+d3hfc2VtKTsKKwlpZiAoRGVmYXVsdENoYW5uZWxQbGFuWyp2YWxdLkxlbiAhPSAwKXsKKwkJcHJpdiAtPmNoYW5uZWxfcGxhbiA9ICp2YWw7CisJCS8vIENsZWFyIG9sZCBjaGFubmVsIG1hcAorCQlmb3IgKGk9MTtpPD1NQVhfQ0hBTk5FTF9OVU1CRVI7aSsrKQorCQl7CisjaWZkZWYgRU5BQkxFX0RPVDExRAorCQkJR0VUX0RPVDExRF9JTkZPKHByaXYtPmllZWU4MDIxMSktPmNoYW5uZWxfbWFwW2ldID0gMDsKKyNlbHNlCisJCQlwcml2LT5pZWVlODAyMTEtPmNoYW5uZWxfbWFwW2ldID0gMDsKKyNlbmRpZgorCQl9CisJCS8vIFNldCBuZXcgY2hhbm5lbCBtYXAKKwkJZm9yIChpPTE7aTw9RGVmYXVsdENoYW5uZWxQbGFuWyp2YWxdLkxlbjtpKyspCisJCXsKKyNpZmRlZiBFTkFCTEVfRE9UMTFECisJCQlHRVRfRE9UMTFEX0lORk8ocHJpdi0+aWVlZTgwMjExKS0+Y2hhbm5lbF9tYXBbRGVmYXVsdENoYW5uZWxQbGFuWyp2YWxdLkNoYW5uZWxbaS0xXV0gPSAxOworI2Vsc2UKKwkJCXByaXYtPmllZWU4MDIxMS0+Y2hhbm5lbF9tYXBbRGVmYXVsdENoYW5uZWxQbGFuWyp2YWxdLkNoYW5uZWxbaS0xXV0gPSAxOworI2VuZGlmCisJCX0KKwl9CisJdXAoJnByaXYtPnd4X3NlbSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByODE4MF93eF9nZXRfdmVyc2lvbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCS8vc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWU7CisKKwlkb3duKCZwcml2LT53eF9zZW0pOworCXN0cmNweShleHRyYSwgIjEwMjAuMDgwOCIpOworCXVwKCZwcml2LT53eF9zZW0pOworCisJcmV0dXJuIDA7Cit9CisKKy8vYWRkZWQgYnkgYW15IDA4MDgxOAorLy9yZWNlaXZlIGRhdGFyYXRlIGZyb20gdXNlciB0eXBpbmcgdmFsaWQgcmF0ZSBpcyBmcm9tIDIgdG8gMTA4ICgxIC0gNTRNKSwgaWYgaW5wdXQgMCwgcmV0dXJuIHRvIG5vcm1hbCByYXRlIGFkYXB0aXZlLgorc3RhdGljIGludCByODE4MF93eF9zZXRfZm9yY2VyYXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwl1OCBmb3JjZXJhdGUgPSAqZXh0cmE7CisKKwlkb3duKCZwcml2LT53eF9zZW0pOworCisJcHJpbnRrKCI9PT09PT09PT09PT09PT4lcygpOiBmb3JjZXJhdGUgaXMgJWRcbiIsX19mdW5jX18sZm9yY2VyYXRlKTsKKwlpZigoZm9yY2VyYXRlID09IDIpIHx8IChmb3JjZXJhdGUgPT0gNCkgfHwgKGZvcmNlcmF0ZSA9PSAxMSkgfHwgKGZvcmNlcmF0ZSA9PSAyMikgfHwgKGZvcmNlcmF0ZSA9PSAxMikgfHwKKwkJKGZvcmNlcmF0ZSA9PSAxOCkgfHwgKGZvcmNlcmF0ZSA9PSAyNCkgfHwgKGZvcmNlcmF0ZSA9PSAzNikgfHwgKGZvcmNlcmF0ZSA9PSA0OCkgfHwgKGZvcmNlcmF0ZSA9PSA3MikgfHwKKwkJKGZvcmNlcmF0ZSA9PSA5NikgfHwgKGZvcmNlcmF0ZSA9PSAxMDgpKQorCXsKKwkJcHJpdi0+Rm9yY2VkRGF0YVJhdGUgPSAxOworCQlwcml2LT5pZWVlODAyMTEtPnJhdGUgPSBmb3JjZXJhdGUgKiA1OworCX0KKwllbHNlIGlmKGZvcmNlcmF0ZSA9PSAwKQorCXsKKwkJcHJpdi0+Rm9yY2VkRGF0YVJhdGUgPSAwOworCQlwcmludGsoIk9LISByZXR1cm4gcmF0ZSBhZGFwdGl2ZVxuIik7CisJfQorCWVsc2UKKwkJcHJpbnRrKCJFUlI6IHdyb25nIHJhdGVcbiIpOworCXVwKCZwcml2LT53eF9zZW0pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHI4MTgwX3d4X3NldF9lbmNfZXh0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwkvL3ByaW50aygiPT09PiVzKClcbiIsIF9fZnVuY19fKTsKKworCWludCByZXQ9MDsKKworCWlmKHByaXYtPmllZWU4MDIxMS0+Ykh3UmFkaW9PZmYpCisJCXJldHVybiAwOworCisJZG93bigmcHJpdi0+d3hfc2VtKTsKKwlyZXQgPSBpZWVlODAyMTFfd3hfc2V0X2VuY29kZV9leHQocHJpdi0+aWVlZTgwMjExLCBpbmZvLCB3cnF1LCBleHRyYSk7CisJdXAoJnByaXYtPnd4X3NlbSk7CisJcmV0dXJuIHJldDsKKworfQorc3RhdGljIGludCByODE4MF93eF9zZXRfYXV0aChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGl3X3BhcmFtICpkYXRhLCBjaGFyICpleHRyYSkKK3sKKwkvL3ByaW50aygiPT09PT4lcygpXG4iLCBfX2Z1bmNfXyk7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCWludCByZXQ9MDsKKworCWlmKHByaXYtPmllZWU4MDIxMS0+Ykh3UmFkaW9PZmYpCisJCXJldHVybiAwOworCisJZG93bigmcHJpdi0+d3hfc2VtKTsKKwlyZXQgPSBpZWVlODAyMTFfd3hfc2V0X2F1dGgocHJpdi0+aWVlZTgwMjExLCBpbmZvLCBkYXRhLCBleHRyYSk7CisJdXAoJnByaXYtPnd4X3NlbSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCByODE4MF93eF9zZXRfbWxtZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJLy9wcmludGsoIj09PT0+JXMoKVxuIiwgX19mdW5jX18pOworCisJaW50IHJldD0wOworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCisJaWYocHJpdi0+aWVlZTgwMjExLT5iSHdSYWRpb09mZikKKwkJcmV0dXJuIDA7CisKKworCWRvd24oJnByaXYtPnd4X3NlbSk7CisjaWYgMQorCXJldCA9IGllZWU4MDIxMV93eF9zZXRfbWxtZShwcml2LT5pZWVlODAyMTEsIGluZm8sIHdycXUsIGV4dHJhKTsKKyNlbmRpZgorCXVwKCZwcml2LT53eF9zZW0pOworCXJldHVybiByZXQ7Cit9CitzdGF0aWMgaW50IHI4MTgwX3d4X3NldF9nZW5faWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpd19wb2ludCAqZGF0YSwgY2hhciAqZXh0cmEpCit7CisvLwlwcmludGsoIj09PT0+JXMoKSwgbGVuOiVkXG4iLCBfX2Z1bmNfXywgZGF0YS0+bGVuZ3RoKTsKKwlpbnQgcmV0PTA7CisgICAgICAgIHN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCisJaWYocHJpdi0+aWVlZTgwMjExLT5iSHdSYWRpb09mZikKKwkJcmV0dXJuIDA7CisKKyAgICAgICAgZG93bigmcHJpdi0+d3hfc2VtKTsKKyNpZiAxCisgICAgICAgIHJldCA9IGllZWU4MDIxMV93eF9zZXRfZ2VuX2llKHByaXYtPmllZWU4MDIxMSwgZXh0cmEsIGRhdGEtPmxlbmd0aCk7CisjZW5kaWYKKyAgICAgICAgdXAoJnByaXYtPnd4X3NlbSk7CisJLy9wcmludGsoIjw9PT09PT0lcygpLCByZXQ6JWRcbiIsIF9fZnVuY19fLCByZXQpOworICAgICAgICByZXR1cm4gcmV0OworCisKK30KK3N0YXRpYyBpd19oYW5kbGVyIHI4MTgwX3d4X2hhbmRsZXJzW10gPQoreworICAgICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgIC8qIFNJT0NTSVdDT01NSVQgKi8KKyAgICAgICAgcjgxODBfd3hfZ2V0X25hbWUsICAgCSAgLyogU0lPQ0dJV05BTUUgKi8KKyAgICAgICAgZHVtbXksICAgICAgICAgICAgICAgICAgICAvKiBTSU9DU0lXTldJRCAqLworICAgICAgICBkdW1teSwgICAgICAgICAgICAgICAgICAgIC8qIFNJT0NHSVdOV0lEICovCisgICAgICAgIHI4MTgwX3d4X3NldF9mcmVxLCAgICAgICAgLyogU0lPQ1NJV0ZSRVEgKi8KKyAgICAgICAgcjgxODBfd3hfZ2V0X2ZyZXEsICAgICAgICAvKiBTSU9DR0lXRlJFUSAqLworICAgICAgICByODE4MF93eF9zZXRfbW9kZSwgICAgICAgIC8qIFNJT0NTSVdNT0RFICovCisgICAgICAgIHI4MTgwX3d4X2dldF9tb2RlLCAgICAgICAgLyogU0lPQ0dJV01PREUgKi8KKyAgICAgICAgcjgxODBfd3hfc2V0X3NlbnMsICAgICAgICAvKiBTSU9DU0lXU0VOUyAqLworICAgICAgICByODE4MF93eF9nZXRfc2VucywgICAgICAgIC8qIFNJT0NHSVdTRU5TICovCisgICAgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgLyogU0lPQ1NJV1JBTkdFICovCisgICAgICAgIHJ0bDgxODBfd3hfZ2V0X3JhbmdlLAkgIC8qIFNJT0NHSVdSQU5HRSAqLworICAgICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgIC8qIFNJT0NTSVdQUklWICovCisgICAgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgLyogU0lPQ0dJV1BSSVYgKi8KKyAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAvKiBTSU9DU0lXU1RBVFMgKi8KKyAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAvKiBTSU9DR0lXU1RBVFMgKi8KKyAgICAgICAgZHVtbXksICAgICAgICAgICAgICAgICAgICAvKiBTSU9DU0lXU1BZICovCisgICAgICAgIGR1bW15LCAgICAgICAgICAgICAgICAgICAgLyogU0lPQ0dJV1NQWSAqLworICAgICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgIC8qIFNJT0NHSVdUSFJTUFkgKi8KKyAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAvKiBTSU9DV0lXVEhSU1BZICovCisgICAgICAgIHI4MTgwX3d4X3NldF93YXAsICAgICAgCSAgLyogU0lPQ1NJV0FQICovCisgICAgICAgIHI4MTgwX3d4X2dldF93YXAsICAgICAgICAgLyogU0lPQ0dJV0FQICovCisJcjgxODBfd3hfc2V0X21sbWUsICAgICAgICAvKiBTSU9DU0lXTUxNRSovCisgICAgICAgIGR1bW15LCAgICAgICAgICAgICAgICAgICAgLyogU0lPQ0dJV0FQTElTVCAtLSBkZXByaWNhdGVkICovCisgICAgICAgIHI4MTgwX3d4X3NldF9zY2FuLCAgICAgICAgLyogU0lPQ1NJV1NDQU4gKi8KKyAgICAgICAgcjgxODBfd3hfZ2V0X3NjYW4sICAgICAgICAvKiBTSU9DR0lXU0NBTiAqLworICAgICAgICByODE4MF93eF9zZXRfZXNzaWQsICAgICAgIC8qIFNJT0NTSVdFU1NJRCAqLworICAgICAgICByODE4MF93eF9nZXRfZXNzaWQsICAgICAgIC8qIFNJT0NHSVdFU1NJRCAqLworICAgICAgICBkdW1teSwgICAgICAgICAgICAgICAgICAgIC8qIFNJT0NTSVdOSUNLTiAqLworICAgICAgICBkdW1teSwgICAgICAgICAgICAgICAgICAgIC8qIFNJT0NHSVdOSUNLTiAqLworICAgICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgIC8qIC0tIGhvbGUgLS0gKi8KKyAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAvKiAtLSBob2xlIC0tICovCisgICAgICAgIHI4MTgwX3d4X3NldF9yYXRlLCAgICAgICAgLyogU0lPQ1NJV1JBVEUgKi8KKyAgICAgICAgcjgxODBfd3hfZ2V0X3JhdGUsICAgICAgICAvKiBTSU9DR0lXUkFURSAqLworICAgICAgICByODE4MF93eF9zZXRfcnRzLCAgICAgICAgIC8qIFNJT0NTSVdSVFMgKi8KKyAgICAgICAgcjgxODBfd3hfZ2V0X3J0cywgICAgICAgICAvKiBTSU9DR0lXUlRTICovCisgICAgICAgIHI4MTgwX3d4X3NldF9mcmFnLCAgICAgICAgLyogU0lPQ1NJV0ZSQUcgKi8KKyAgICAgICAgcjgxODBfd3hfZ2V0X2ZyYWcsICAgICAgICAvKiBTSU9DR0lXRlJBRyAqLworICAgICAgICBkdW1teSwgICAgICAgICAgICAgICAgICAgIC8qIFNJT0NTSVdUWFBPVyAqLworICAgICAgICBkdW1teSwgICAgICAgICAgICAgICAgICAgIC8qIFNJT0NHSVdUWFBPVyAqLworICAgICAgICByODE4MF93eF9zZXRfcmV0cnksICAgICAgIC8qIFNJT0NTSVdSRVRSWSAqLworICAgICAgICByODE4MF93eF9nZXRfcmV0cnksICAgICAgIC8qIFNJT0NHSVdSRVRSWSAqLworICAgICAgICByODE4MF93eF9zZXRfZW5jLCAgICAgICAgIC8qIFNJT0NTSVdFTkNPREUgKi8KKyAgICAgICAgcjgxODBfd3hfZ2V0X2VuYywgICAgICAgICAvKiBTSU9DR0lXRU5DT0RFICovCisgICAgICAgIHI4MTgwX3d4X3NldF9wb3dlciwgICAgICAgLyogU0lPQ1NJV1BPV0VSICovCisgICAgICAgIHI4MTgwX3d4X2dldF9wb3dlciwgICAgICAgLyogU0lPQ0dJV1BPV0VSICovCisgICAgICAgIE5VTEwsCQkJICAvKi0tLWhvbGUtLS0qLworCU5VTEwsIAkJCSAgLyotLS1ob2xlLS0tKi8KKwlyODE4MF93eF9zZXRfZ2VuX2llLCAgICAgIC8qIFNJT0NTSVdHRU5JRSAqLworCU5VTEwsIAkJCSAgLyogU0lPQ1NJV0dFTklFICovCisJcjgxODBfd3hfc2V0X2F1dGgsCSAgLyogU0lPQ1NJV0FVVEggKi8KKwlOVUxMLCAgICAgICAgICAgICAgICAgICAgIC8qIFNJT0NTSVdBVVRIICovCisJcjgxODBfd3hfc2V0X2VuY19leHQsIAkgIC8qIFNJT0NTSVdFTkNPREVFWFQgKi8KKwlOVUxMLCAgICAgICAgICAgICAgICAgIAkgIC8qIFNJT0NTSVdFTkNPREVFWFQgKi8KKwlOVUxMLCAJCQkgLyogU0lPQ1NJV1BNS1NBICovCisJTlVMTCwgCQkJICAvKi0tLWhvbGUtLS0qLworfTsKKworCitzdGF0aWMgY29uc3Qgc3RydWN0IGl3X3ByaXZfYXJncyByODE4MF9wcml2YXRlX2FyZ3NbXSA9IHsKKwl7CisJCVNJT0NJV0ZJUlNUUFJJViArIDB4MCwKKwkJSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsIDAsICJiYWRjcmMiCisJfSwKKwl7CVNJT0NJV0ZJUlNUUFJJViArIDB4MSwKKwkJMCwgMCwgImR1bW15IgorCisJfSwKKwl7CisJCVNJT0NJV0ZJUlNUUFJJViArIDB4MiwKKwkJSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsIDAsICJiZWFjb25pbnQiCisJfSwKKwl7CVNJT0NJV0ZJUlNUUFJJViArIDB4MywKKwkJMCwgMCwgImR1bW15IgorCisJfSwKKwkvKiBhZGRlZCBieSBjaHJpc3RpYW4gKi8KKwkvL3sKKwkvLwlTSU9DSVdGSVJTVFBSSVYgKyAweDIsCisJLy8JSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsIDAsICJwcmlzbWhkciIKKwkvL30sCisJLyogZW5kIGFkZGVkIGJ5IGNocmlzdGlhbiAqLworCXsKKwkJU0lPQ0lXRklSU1RQUklWICsgMHg0LAorCQlJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwgMCwgImFjdGl2ZXNjYW4iCisKKwl9LAorCXsJU0lPQ0lXRklSU1RQUklWICsgMHg1LAorCQkwLCAwLCAiZHVtbXkiCisKKwl9LAorCXsKKwkJU0lPQ0lXRklSU1RQUklWICsgMHg2LAorCQlJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwgMCwgInJhd3R4IgorCisJfSwKKwl7CVNJT0NJV0ZJUlNUUFJJViArIDB4NywKKwkJMCwgMCwgImR1bW15IgorCisJfSwKKy8vCXsKKy8vCQlTSU9DSVdGSVJTVFBSSVYgKyAweDUsCisvLwkJMCwgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsICJnZXRwc21vZGUiCisvLwl9LAorLy8JeworLy8JCVNJT0NJV0ZJUlNUUFJJViArIDB4NiwKKy8vCQlJV19QUklWX1NJWkVfRklYRUQsIDAsICJzZXRwc21vZGUiCisvLwl9LAorLy9zZXQvZ2V0IG1vZGUgaGF2ZSBiZWVuIHJlYWxpemVkIGluIHB1YmxpYyBoYW5kbGVycworCisJeworCQlTSU9DSVdGSVJTVFBSSVYgKyAweDgsCisJCUlXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAwLCAic2V0aXdtb2RlIgorCX0sCisJeworCQlTSU9DSVdGSVJTVFBSSVYgKyAweDksCisJCTAsIElXX1BSSVZfVFlQRV9DSEFSIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMzIsICJnZXRpd21vZGUiCisJfSwKKwl7CisJCVNJT0NJV0ZJUlNUUFJJViArIDB4QSwKKwkJSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsIDAsICJzZXRwcmVhbWJsZSIKKwl9LAorCXsKKwkJU0lPQ0lXRklSU1RQUklWICsgMHhCLAorCQkwLCBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwgImdldHByZWFtYmxlIgorCX0sCisJewlTSU9DSVdGSVJTVFBSSVYgKyAweEMsCisJCTAsIDAsICJkdW1teSIKKwl9LAorCXsKKwkJU0lPQ0lXRklSU1RQUklWICsgMHhELAorCQkwLCBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwgImdldHJzc2kiCisJfSwKKwl7CVNJT0NJV0ZJUlNUUFJJViArIDB4RSwKKwkJMCwgMCwgImR1bW15IgorCX0sCisJeworCQlTSU9DSVdGSVJTVFBSSVYgKyAweEYsCisJCTAsIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAiZ2V0bGlua3F1YWwiCisgCX0sCisJeworCQlTSU9DSVdGSVJTVFBSSVYgKyAweDEwLAorCQkwLCAwLCAicmVzZXRzdGF0cyIKKyAJfSwKKwl7CisJCVNJT0NJV0ZJUlNUUFJJViArIDB4MTEsCisJCTAsMCwgImR1bW15IgorIAl9LAorCXsKKwkJU0lPQ0lXRklSU1RQUklWICsgMHgxMiwKKwkJMCwgMCwgInJhZGlvb24iCisgCX0sCisJeworCQlTSU9DSVdGSVJTVFBSSVYgKyAweDEzLAorCQkwLCAwLCAicmFkaW9vZmYiCisgCX0sCisgCXsKKwkJU0lPQ0lXRklSU1RQUklWICsgMHgxNCwKKwkJSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsIDAsICJzZXRjaGFubmVsIgorIAl9LAorCXsKKwkJU0lPQ0lXRklSU1RQUklWICsgMHgxNSwKKwkJMCwgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsICJnZXRjaGFubmVsIgorIAl9LAorCXsKKwkJU0lPQ0lXRklSU1RQUklWICsgMHgxNiwKKwkJMCwwLCAiZHVtbXkiCisgCX0sCisJeworCQlTSU9DSVdGSVJTVFBSSVYgKyAweDE3LAorCQkwLElXX1BSSVZfVFlQRV9DSEFSIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMzIsICJnZXR2ZXJzaW9uIgorIAl9LAorCXsKKwkJU0lPQ0lXRklSU1RQUklWICsgMHgxOCwKKwkJSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsIDAsICJzZXRyYXRlIgorCX0sCit9OworCisKK3N0YXRpYyBpd19oYW5kbGVyIHI4MTgwX3ByaXZhdGVfaGFuZGxlcltdID0geworCXI4MTgwX3d4X3NldF9jcmNtb24sICAgLypTSU9DSVdTRUNPTkRQUklWKi8KKwlkdW1teSwKKwlyODE4MF93eF9zZXRfYmVhY29uaW50ZXJ2YWwsCisJZHVtbXksCisJLy9yODE4MF93eF9zZXRfbW9uaXRvcl90eXBlLAorCXI4MTgwX3d4X3NldF9zY2FuX3R5cGUsCisJZHVtbXksCisJcjgxODBfd3hfc2V0X3Jhd3R4LAorCWR1bW15LAorCXI4MTgwX3d4X3NldF9pd21vZGUsCisJcjgxODBfd3hfZ2V0X2l3bW9kZSwKKwlyODE4MF93eF9zZXRfcHJlYW1ibGUsCisJcjgxODBfd3hfZ2V0X3ByZWFtYmxlLAorCWR1bW15LAorCXI4MTgwX3d4X2dldF9zaWdsZXZlbCwKKwlkdW1teSwKKwlyODE4MF93eF9nZXRfc2lncXVhbCwKKwlyODE4MF93eF9yZXNldF9zdGF0cywKKwlkdW1teSwvL3I4MTgwX3d4X2dldF9zdGF0cworCXI4MTgwX3d4X3JhZGlvX29uLAorCXI4MTgwX3d4X3JhZGlvX29mZiwKKwlyODE4MF93eF9zZXRfY2hhbm5lbHBsYW4sCisJcjgxODBfd3hfZ2V0X2NoYW5uZWxwbGFuLAorCWR1bW15LAorCXI4MTgwX3d4X2dldF92ZXJzaW9uLAorCXI4MTgwX3d4X3NldF9mb3JjZXJhdGUsCit9OworCisjaWYgV0lSRUxFU1NfRVhUID49IDE3CitzdGF0aWMgaW5saW5lIGludCBpc19zYW1lX25ldHdvcmsoc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpkc3QsCisJCQkJICBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKyAgICAgICAgLyogQSBuZXR3b3JrIGlzIG9ubHkgYSBkdXBsaWNhdGUgaWYgdGhlIGNoYW5uZWwsIEJTU0lELCBFU1NJRAorICAgICAgICAgKiBhbmQgdGhlIGNhcGFiaWxpdHkgZmllbGQgKGluIHBhcnRpY3VsYXIgSUJTUyBhbmQgQlNTKSBhbGwgbWF0Y2guCisgICAgICAgICAqIFdlIHRyZWF0IGFsbCA8aGlkZGVuPiB3aXRoIHRoZSBzYW1lIEJTU0lEIGFuZCBjaGFubmVsCisgICAgICAgICAqIGFzIG9uZSBuZXR3b3JrICovCisgICAgICAgIHJldHVybiAoKChzcmMtPnNzaWRfbGVuID09IGRzdC0+c3NpZF9sZW4pfHwoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX0lORlJBKSkgJiYgIC8vWUosbW9kLCAwODA4MTksZm9yIGhpZGRlbiBhcAorCQkJLy8oKHNyYy0+c3NpZF9sZW4gPT0gZHN0LT5zc2lkX2xlbikgJiYKKwkJCShzcmMtPmNoYW5uZWwgPT0gZHN0LT5jaGFubmVsKSAmJgorCQkJIW1lbWNtcChzcmMtPmJzc2lkLCBkc3QtPmJzc2lkLCBFVEhfQUxFTikgJiYKKwkJCSghbWVtY21wKHNyYy0+c3NpZCwgZHN0LT5zc2lkLCBzcmMtPnNzaWRfbGVuKXx8KGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9JTkZSQSkpICYmICAvL1lKLG1vZCwgMDgwODE5LGZvciBoaWRkZW4gYXAKKwkJCS8vIW1lbWNtcChzcmMtPnNzaWQsIGRzdC0+c3NpZCwgc3JjLT5zc2lkX2xlbikgJiYKKwkJCSgoc3JjLT5jYXBhYmlsaXR5ICYgV0xBTl9DQVBBQklMSVRZX0lCU1MpID09CisJCQkoZHN0LT5jYXBhYmlsaXR5ICYgV0xBTl9DQVBBQklMSVRZX0lCU1MpKSAmJgorCQkJKChzcmMtPmNhcGFiaWxpdHkgJiBXTEFOX0NBUEFCSUxJVFlfQlNTKSA9PQorCQkJKGRzdC0+Y2FwYWJpbGl0eSAmIFdMQU5fQ0FQQUJJTElUWV9CU1MpKSk7Cit9CisKKy8vV0IgbW9kZWZpZWQgdG8gc2hvdyBzaWduYWwgdG8gR1VJIG9uIDE4LTAxLTIwMDgKK3N0YXRpYyBzdHJ1Y3QgaXdfc3RhdGlzdGljcyAqcjgxODBfZ2V0X3dpcmVsZXNzX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgICAgc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlID0gcHJpdi0+aWVlZTgwMjExOworCXN0cnVjdCBpd19zdGF0aXN0aWNzKiB3c3RhdHMgPSAmcHJpdi0+d3N0YXRzOworCS8vc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrKiB0YXJnZXQgPSBOVUxMOworCWludCB0bXBfbGV2ZWwgPSAwOworCWludCB0bXBfcXVhbCA9IDA7CisJaW50IHRtcF9ub2lzZSA9IDA7CisJLy91bnNpZ25lZCBsb25nIGZsYWc7CisKKwlpZiAoaWVlZS0+c3RhdGUgPCBJRUVFODAyMTFfTElOS0VEKQorCXsKKwkJd3N0YXRzLT5xdWFsLnF1YWwgPSAwOworCQl3c3RhdHMtPnF1YWwubGV2ZWwgPSAwOworCQl3c3RhdHMtPnF1YWwubm9pc2UgPSAwOworCQl3c3RhdHMtPnF1YWwudXBkYXRlZCA9IElXX1FVQUxfQUxMX1VQREFURUQgfCBJV19RVUFMX0RCTTsKKwkJcmV0dXJuIHdzdGF0czsKKwl9CisjaWYgMAorCXNwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5sb2NrLCBmbGFnKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRhcmdldCwgJmllZWUtPm5ldHdvcmtfbGlzdCwgbGlzdCkKKwl7CisJCWlmIChpc19zYW1lX25ldHdvcmsodGFyZ2V0LCAmaWVlZS0+Y3VycmVudF9uZXR3b3JrLCBpZWVlKSkKKwkJeworCQkJcHJpbnRrKCJpdCdzIHNhbWUgbmV0d29yazolc1xuIiwgdGFyZ2V0LT5zc2lkKTsKKyNpZiAwCisJCQlpZiAoIXRtcF9sZXZlbCkKKwkJCXsKKwkJCQl0bXBfbGV2ZWwgPSB0YXJnZXQtPnN0YXRzLnNpZ25hbHN0cmVuZ3RoOworCQkJCXRtcF9xdWFsID0gdGFyZ2V0LT5zdGF0cy5zaWduYWw7CisJCQl9CisJCQllbHNlCisJCQl7CisKKwkJCQl0bXBfbGV2ZWwgPSAoMTUqdG1wX2xldmVsICsgdGFyZ2V0LT5zdGF0cy5zaWduYWxzdHJlbmd0aCkvMTY7CisJCQkJdG1wX3F1YWwgPSAoMTUqdG1wX3F1YWwgKyB0YXJnZXQtPnN0YXRzLnNpZ25hbCkvMTY7CisJCQl9CisjZWxzZQorCQkJdG1wX2xldmVsID0gdGFyZ2V0LT5zdGF0cy5zaWduYWw7CisJCQl0bXBfcXVhbCA9IHRhcmdldC0+c3RhdHMuc2lnbmFsc3RyZW5ndGg7CisJCQl0bXBfbm9pc2UgPSB0YXJnZXQtPnN0YXRzLm5vaXNlOworCQkJcHJpbnRrKCJsZXZlbDolZCwgcXVhbDolZCwgbm9pc2U6JWRcbiIsIHRtcF9sZXZlbCwgdG1wX3F1YWwsIHRtcF9ub2lzZSk7CisjZW5kaWYKKwkJCWJyZWFrOworCQl9CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmxvY2ssIGZsYWcpOworI2VuZGlmCisJdG1wX2xldmVsID0gKCZpZWVlLT5jdXJyZW50X25ldHdvcmspLT5zdGF0cy5zaWduYWw7CisJdG1wX3F1YWwgPSAoJmllZWUtPmN1cnJlbnRfbmV0d29yayktPnN0YXRzLnNpZ25hbHN0cmVuZ3RoOworCXRtcF9ub2lzZSA9ICgmaWVlZS0+Y3VycmVudF9uZXR3b3JrKS0+c3RhdHMubm9pc2U7CisJLy9wcmludGsoImxldmVsOiVkLCBxdWFsOiVkLCBub2lzZTolZFxuIiwgdG1wX2xldmVsLCB0bXBfcXVhbCwgdG1wX25vaXNlKTsKKworLy8JcHJpbnRrKCJsZXZlbDolZFxuIiwgdG1wX2xldmVsKTsKKwl3c3RhdHMtPnF1YWwubGV2ZWwgPSB0bXBfbGV2ZWw7CisJd3N0YXRzLT5xdWFsLnF1YWwgPSB0bXBfcXVhbDsKKwl3c3RhdHMtPnF1YWwubm9pc2UgPSB0bXBfbm9pc2U7CisJd3N0YXRzLT5xdWFsLnVwZGF0ZWQgPSBJV19RVUFMX0FMTF9VUERBVEVEfCBJV19RVUFMX0RCTTsKKwlyZXR1cm4gd3N0YXRzOworfQorI2VuZGlmCisKKworc3RydWN0IGl3X2hhbmRsZXJfZGVmICByODE4MF93eF9oYW5kbGVyc19kZWY9eworCS5zdGFuZGFyZCA9IHI4MTgwX3d4X2hhbmRsZXJzLAorCS5udW1fc3RhbmRhcmQgPSBzaXplb2YocjgxODBfd3hfaGFuZGxlcnMpIC8gc2l6ZW9mKGl3X2hhbmRsZXIpLAorCS5wcml2YXRlID0gcjgxODBfcHJpdmF0ZV9oYW5kbGVyLAorCS5udW1fcHJpdmF0ZSA9IHNpemVvZihyODE4MF9wcml2YXRlX2hhbmRsZXIpIC8gc2l6ZW9mKGl3X2hhbmRsZXIpLAorIAkubnVtX3ByaXZhdGVfYXJncyA9IHNpemVvZihyODE4MF9wcml2YXRlX2FyZ3MpIC8gc2l6ZW9mKHN0cnVjdCBpd19wcml2X2FyZ3MpLAorI2lmIFdJUkVMRVNTX0VYVCA+PSAxNworCS5nZXRfd2lyZWxlc3Nfc3RhdHMgPSByODE4MF9nZXRfd2lyZWxlc3Nfc3RhdHMsCisjZW5kaWYKKwkucHJpdmF0ZV9hcmdzID0gKHN0cnVjdCBpd19wcml2X2FyZ3MgKilyODE4MF9wcml2YXRlX2FyZ3MsCit9OworCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfd3guaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfd3guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjBhNjdkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MF93eC5oCkBAIC0wLDAgKzEsMjEgQEAKKy8qCisJVGhpcyBpcyBwYXJ0IG9mIHJ0bDgxODAgT3BlblNvdXJjZSBkcml2ZXIgLSB2IDAuMworCUNvcHlyaWdodCAoQykgQW5kcmVhIE1lcmVsbG8gMjAwNCAgPGFuZHJlYW1ybEB0aXNjYWxpLml0PgorCVJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiBHUEwgKEdlbmVyYWwgUHVibGljIExpY2VuY2UpCisKKwlQYXJ0cyBvZiB0aGlzIGRyaXZlciBhcmUgYmFzZWQgb24gdGhlIEdQTCBwYXJ0IG9mIHRoZSBvZmZpY2lhbCByZWFsdGVrIGRyaXZlcgorCVBhcnRzIG9mIHRoaXMgZHJpdmVyIGFyZSBiYXNlZCBvbiB0aGUgcnRsODE4MCBkcml2ZXIgc2tlbGV0b24gZnJvbSBQYXRyaWMgU2NoZW5rZSAmIEFuZHJlcyBTYWxvbW9uCisJUGFydHMgb2YgdGhpcyBkcml2ZXIgYXJlIGJhc2VkIG9uIHRoZSBJbnRlbCBQcm8gV2lyZWxlc3MgMjEwMCBHUEwgZHJpdmVyCisKKwlXZSB3YW50IHRvIHRhbmtzIHRoZSBBdXRob3JzIG9mIHN1Y2ggcHJvamVjdHMgYW5kIHRoZSBOZGlzd3JhcHBlciBwcm9qZWN0IEF1dGhvcnMuCisqLworCisvKiB0aGlzIGZpbGUgKHdpbGwpIGNvbnRhaW5zIHdpcmVsZXNzIGV4dGVuc2lvbiBoYW5kbGVycyovCisKKyNpZm5kZWYgUjgxODBfV1hfSAorI2RlZmluZSBSODE4MF9XWF9ICisjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KKyNpbmNsdWRlICJpZWVlODAyMTEuaCIKK2V4dGVybiBzdHJ1Y3QgaXdfaGFuZGxlcl9kZWYgcjgxODBfd3hfaGFuZGxlcnNfZGVmOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODViX2luaXQuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODViX2luaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Yjg4NWEyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4NWJfaW5pdC5jCkBAIC0wLDAgKzEsMzM0MiBAQAorLyorKworQ29weXJpZ2h0IChjKSBSZWFsdGVrIFNlbWljb25kdWN0b3IgQ29ycC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworTW9kdWxlIE5hbWU6CisgCXI4MTg1Yl9pbml0LmMKKworQWJzdHJhY3Q6CisgCUhhcmR3YXJlIEluaXRpYWxpemF0aW9uIGFuZCBIYXJkd2FyZSBJTyBmb3IgUlRMODE4NUIKKworTWFqb3IgQ2hhbmdlIEhpc3Rvcnk6CisJV2hlbiAgICAgICAgV2hvICAgICAgV2hhdAorCS0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCTIwMDYtMTEtMTUgICAgWGlvbmcJCUNyZWF0ZWQKKworTm90ZXM6CisJVGhpcyBmaWxlIGlzIHBvcnRlZCBmcm9tIFJUTDgxODVCIFdpbmRvd3MgZHJpdmVyLgorCisKKy0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLUluY2x1ZGUgRmlsZS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlICJyODE4MF9ody5oIgorI2luY2x1ZGUgInI4MTgwLmgiCisjaW5jbHVkZSAicjgxODBfc2EyNDAwLmgiICAvKiBQSElMSVBTIFJhZGlvIGZyb250ZW5kICovCisjaW5jbHVkZSAicjgxODBfbWF4MjgyMC5oIiAvKiBNQVhJTSBSYWRpbyBmcm9udGVuZCAqLworI2luY2x1ZGUgInI4MTgwX2djdC5oIiAgICAgLyogR0NUIFJhZGlvIGZyb250ZW5kICovCisjaW5jbHVkZSAicjgxODBfcnRsODIyNS5oIiAvKiBSVEw4MjI1IFJhZGlvIGZyb250ZW5kICovCisjaW5jbHVkZSAicjgxODBfcnRsODI1NS5oIiAvKiBSVEw4MjU1IFJhZGlvIGZyb250ZW5kICovCisjaW5jbHVkZSAicjgxODBfOTNjeDYuaCIgICAvKiBDYXJkIEVFUFJPTSAqLworI2luY2x1ZGUgInI4MTgwX3d4LmgiCisKKyNpZmRlZiBDT05GSUdfUlRMODE4MF9QTQorI2luY2x1ZGUgInI4MTgwX3BtLmgiCisjZW5kaWYKKworI2lmZGVmIEVOQUJMRV9ET1QxMUQKKyNpbmNsdWRlICJkb3QxMWQuaCIKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1JUTDgxODVCCisKKy8vI2RlZmluZSBDT05GSUdfUlRMODE4MF9JT19NQVAKKworI2RlZmluZSBUQ18zV19QT0xMX01BWF9UUllfQ05UIDUKKyNpZmRlZiBDT05GSUdfUlRMODE4WF9TCitzdGF0aWMgdTggTUFDX1JFR19UQUJMRVtdWzJdPXsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vUEFHQSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gMHgzNChCUlNSKSwgMHhCRShSQVRFX0ZBTExCQUNLX0NUTCksIDB4MUUwKEFSRlIpIHdvdWxkIHNldCBpbiBId0NvbmZpZ3VyZVJUTDgxODUoKQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gMHgyNzIoUkZTV19DVFJMKSwgMHgxQ0UoQUVTTVNLX1FDKSBzZXQgaW4gSW5pdGlhbGl6ZUFkYXB0ZXI4MTg1KCkuCisgICAgICAgICAgICAgICAgICAgICAgICAvLyAweDFGMH4weDFGOCAgc2V0IGluIE1hY0NvbmZpZ184NUJBU0lDKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsweDA4LCAweGFlfSwgezB4MGEsIDB4NzJ9LCB7MHg1YiwgMHg0Mn0sCisgICAgICAgICAgICAgICAgICAgICAgICB7MHg4NCwgMHg4OH0sIHsweDg1LCAweDI0fSwgezB4ODgsIDB4NTR9LCB7MHg4YiwgMHhiOH0sIHsweDhjLCAweDAzfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsweDhkLCAweDQwfSwgezB4OGUsIDB4MDB9LCB7MHg4ZiwgMHgwMH0sIHsweDViLCAweDE4fSwgezB4OTEsIDB4MDN9LAorICAgICAgICAgICAgICAgICAgICAgICAgezB4OTQsIDB4MEZ9LCB7MHg5NSwgMHgzMn0sCisgICAgICAgICAgICAgICAgICAgICAgICB7MHg5NiwgMHgwMH0sIHsweDk3LCAweDA3fSwgezB4YjQsIDB4MjJ9LCB7MHhkYiwgMHgwMH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7MHhmMCwgMHgzMn0sIHsweGYxLCAweDMyfSwgezB4ZjIsIDB4MDB9LCB7MHhmMywgMHgwMH0sIHsweGY0LCAweDMyfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsweGY1LCAweDQzfSwgezB4ZjYsIDB4MDB9LCB7MHhmNywgMHgwMH0sIHsweGY4LCAweDQ2fSwgezB4ZjksIDB4YTR9LAorICAgICAgICAgICAgICAgICAgICAgICAgezB4ZmEsIDB4MDB9LCB7MHhmYiwgMHgwMH0sIHsweGZjLCAweDk2fSwgezB4ZmQsIDB4YTR9LCB7MHhmZSwgMHgwMH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7MHhmZiwgMHgwMH0sCisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vUEFHRSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gRm9yIEZsZXh0cm9uaWNzIHN5c3RlbSBMb2dvIFBDSUhDVCBmYWlsdXJlOgorCQkJLy8gMHgxQzR+MHgxQ0Qgc2V0IG5vLXplcm8gdmFsdWUgdG8gYXZvaWQgUENJIGNvbmZpZ3VyYXRpb24gc3BhY2UgMHg0NVs3XT0xCisgICAgICAgICAgICAgICAgICAgICAgICB7MHg1ZSwgMHgwMX0sCisgICAgICAgICAgICAgICAgICAgICAgICB7MHg1OCwgMHgwMH0sIHsweDU5LCAweDAwfSwgezB4NWEsIDB4MDR9LCB7MHg1YiwgMHgwMH0sIHsweDYwLCAweDI0fSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsweDYxLCAweDk3fSwgezB4NjIsIDB4RjB9LCB7MHg2MywgMHgwOX0sIHsweDgwLCAweDBGfSwgezB4ODEsIDB4RkZ9LAorICAgICAgICAgICAgICAgICAgICAgICAgezB4ODIsIDB4RkZ9LCB7MHg4MywgMHgwM30sCisgICAgICAgICAgICAgICAgICAgICAgICB7MHhDNCwgMHgyMn0sIHsweEM1LCAweDIyfSwgezB4QzYsIDB4MjJ9LCB7MHhDNywgMHgyMn0sIHsweEM4LCAweDIyfSwgLy9sem0gYWRkIDA4MDgyNgorCQkJezB4QzksIDB4MjJ9LCB7MHhDQSwgMHgyMn0sIHsweENCLCAweDIyfSwgezB4Q0MsIDB4MjJ9LCB7MHhDRCwgMHgyMn0sLy9sem0gYWRkIDA4MDgyNgorICAgICAgICAgICAgICAgICAgICAgICAgezB4ZTIsIDB4MDB9LAorCisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vUEFHRSAyOgorICAgICAgICAgICAgICAgICAgICAgICAgezB4NWUsIDB4MDJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgezB4MGMsIDB4MDR9LCB7MHg0YywgMHgzMH0sIHsweDRkLCAweDA4fSwgezB4NTAsIDB4MDV9LCB7MHg1MSwgMHhmNX0sCisgICAgICAgICAgICAgICAgICAgICAgICB7MHg1MiwgMHgwNH0sIHsweDUzLCAweGEwfSwgezB4NTQsIDB4ZmZ9LCB7MHg1NSwgMHhmZn0sIHsweDU2LCAweGZmfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsweDU3LCAweGZmfSwgezB4NTgsIDB4MDh9LCB7MHg1OSwgMHgwOH0sIHsweDVhLCAweDA4fSwgezB4NWIsIDB4MDh9LAorICAgICAgICAgICAgICAgICAgICAgICAgezB4NjAsIDB4MDh9LCB7MHg2MSwgMHgwOH0sIHsweDYyLCAweDA4fSwgezB4NjMsIDB4MDh9LCB7MHg2NCwgMHgyZn0sCisgICAgICAgICAgICAgICAgICAgICAgICB7MHg4YywgMHgzZn0sIHsweDhkLCAweDNmfSwgezB4OGUsIDB4M2Z9LAorICAgICAgICAgICAgICAgICAgICAgICAgezB4OGYsIDB4M2Z9LCB7MHhjNCwgMHhmZn0sIHsweGM1LCAweGZmfSwgezB4YzYsIDB4ZmZ9LCB7MHhjNywgMHhmZn0sCisgICAgICAgICAgICAgICAgICAgICAgICB7MHhjOCwgMHgwMH0sIHsweGM5LCAweDAwfSwgezB4Y2EsIDB4ODB9LCB7MHhjYiwgMHgwMH0sCisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vUEFHQSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgezB4NWUsIDB4MDB9LHsweDlmLCAweDAzfQorICAgICAgICAgICAgICAgIH07CisKKworc3RhdGljIHU4ICBaRUJSQV9BR0NbXT17CisJCQkwLAorCQkJMHg3RSwweDdFLDB4N0UsMHg3RSwweDdELDB4N0MsMHg3QiwweDdBLDB4NzksMHg3OCwweDc3LDB4NzYsMHg3NSwweDc0LDB4NzMsMHg3MiwKKwkJCTB4NzEsMHg3MCwweDZGLDB4NkUsMHg2RCwweDZDLDB4NkIsMHg2QSwweDY5LDB4NjgsMHg2NywweDY2LDB4NjUsMHg2NCwweDYzLDB4NjIsCisJCQkweDQ4LDB4NDcsMHg0NiwweDQ1LDB4NDQsMHgyOSwweDI4LDB4MjcsMHgyNiwweDI1LDB4MjQsMHgyMywweDIyLDB4MjEsMHgwOCwweDA3LAorCQkJMHgwNiwweDA1LDB4MDQsMHgwMywweDAyLDB4MDEsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkJCTB4MGYsMHgwZiwweDBmLDB4MGYsMHgwZiwweDBmLDB4MGYsMHgwZiwweDBmLDB4MGYsMHgxMCwweDExLDB4MTIsMHgxMywweDE1LDB4MTYsCisJCQkweDE3LDB4MTcsMHgxOCwweDE4LDB4MTksMHgxYSwweDFhLDB4MWIsMHgxYiwweDFjLDB4MWMsMHgxZCwweDFkLDB4MWQsMHgxZSwweDFlLAorCQkJMHgxZiwweDFmLDB4MWYsMHgyMCwweDIwLDB4MjAsMHgyMCwweDIxLDB4MjEsMHgyMSwweDIyLDB4MjIsMHgyMiwweDIzLDB4MjMsMHgyNCwKKwkJCTB4MjQsMHgyNSwweDI1LDB4MjUsMHgyNiwweDI2LDB4MjcsMHgyNywweDJGLDB4MkYsMHgyRiwweDJGLDB4MkYsMHgyRiwweDJGLDB4MkYKKwkJCX07CisKK3N0YXRpYyB1MzIgWkVCUkFfUkZfUlhfR0FJTl9UQUJMRVtdPXsKKwkJCTB4MDA5NiwweDAwNzYsMHgwMDU2LDB4MDAzNiwweDAwMTYsMHgwMWY2LDB4MDFkNiwweDAxYjYsCisJCQkweDAxOTYsMHgwMTc2LDB4MDBGNywweDAwRDcsMHgwMEI3LDB4MDA5NywweDAwNzcsMHgwMDU3LAorCQkJMHgwMDM3LDB4MDBGQiwweDAwREIsMHgwMEJCLDB4MDBGRiwweDAwRTMsMHgwMEMzLDB4MDBBMywKKwkJCTB4MDA4MywweDAwNjMsMHgwMDQzLDB4MDAyMywweDAwMDMsMHgwMUUzLDB4MDFDMywweDAxQTMsCisJCQkweDAxODMsMHgwMTYzLDB4MDE0MywweDAxMjMsMHgwMTAzCisJfTsKKworc3RhdGljIHU4IE9GRE1fQ09ORklHW109eworCQkJLy8gT0ZETSByZWcweDA2Wzc6MF09MHhGRjogRW5hYmxlIHBvd2VyIHNhdmluZyBtb2RlIGluIFJYCisJCQkvLyBPRkRNIHJlZzB4M0NbNF09MSdiMTogRW5hYmxlIFJYIHBvd2VyIHNhdmluZyBtb2RlCisJCQkvLyBvZmRtIDB4M2EgPSAweDdiICwob3JpZ2luYWwgOiAweGZiKSBGb3IgRUNTIHNoaWVsZGluZyByb29tIFRQIHRlc3QKKworCQkJLy8gMHgwMAorCQkJMHgxMCwgMHgwRiwgMHgwQSwgMHgwQywgMHgxNCwgMHhGQSwgMHhGRiwgMHg1MCwKKwkJCTB4MDAsIDB4NTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NUMsIDB4MDAsIDB4MDAsCisJCQkvLyAweDEwCisJCQkweDQwLCAweDAwLCAweDQwLCAweDAwLCAweDAwLCAweDAwLCAweEE4LCAweDI2LAorCQkJMHgzMiwgMHgzMywgMHgwNiwgMHhBNSwgMHg2RiwgMHg1NSwgMHhDOCwgMHhCQiwKKwkJCS8vIDB4MjAKKwkJCTB4MEEsIDB4RTEsIDB4MkMsIDB4NEEsIDB4ODYsIDB4ODMsIDB4MzQsIDB4MDAsCisJCQkweDRGLCAweDI0LCAweDZGLCAweEMyLCAweDAzLCAweDQwLCAweDgwLCAweDAwLAorCQkJLy8gMHgzMAorCQkJMHhDMCwgMHhDMSwgMHg1OCwgMHhGMSwgMHgwMCwgMHhDNCwgMHg5MCwgMHgzZSwKKwkJCTB4RDgsIDB4M0MsIDB4N0IsIDB4MTAsIDB4MTAKKwkJfTsKKyNlbHNlCisgc3RhdGljIHU4IE1BQ19SRUdfVEFCTEVbXVsyXT17CisJCQkvL1BBR0EgMDoKKwkJCXsweGYwLCAweDMyfSwgezB4ZjEsIDB4MzJ9LCB7MHhmMiwgMHgwMH0sIHsweGYzLCAweDAwfSwgezB4ZjQsIDB4MzJ9LAorCQkJezB4ZjUsIDB4NDN9LCB7MHhmNiwgMHgwMH0sIHsweGY3LCAweDAwfSwgezB4ZjgsIDB4NDZ9LCB7MHhmOSwgMHhhNH0sCisJCQl7MHhmYSwgMHgwMH0sIHsweGZiLCAweDAwfSwgezB4ZmMsIDB4OTZ9LCB7MHhmZCwgMHhhNH0sIHsweGZlLCAweDAwfSwKKwkJCXsweGZmLCAweDAwfSwKKworCQkJLy9QQUdFIDE6CisJCQl7MHg1ZSwgMHgwMX0sCisJCQl7MHg1OCwgMHg0Yn0sIHsweDU5LCAweDAwfSwgezB4NWEsIDB4NGJ9LCB7MHg1YiwgMHgwMH0sIHsweDYwLCAweDRifSwKKwkJCXsweDYxLCAweDA5fSwgezB4NjIsIDB4NGJ9LCB7MHg2MywgMHgwOX0sIHsweGNlLCAweDBmfSwgezB4Y2YsIDB4MDB9LAorCQkJezB4ZTAsIDB4ZmZ9LCB7MHhlMSwgMHgwZn0sIHsweGUyLCAweDAwfSwgezB4ZjAsIDB4NGV9LCB7MHhmMSwgMHgwMX0sCisJCQl7MHhmMiwgMHgwMn0sIHsweGYzLCAweDAzfSwgezB4ZjQsIDB4MDR9LCB7MHhmNSwgMHgwNX0sIHsweGY2LCAweDA2fSwKKwkJCXsweGY3LCAweDA3fSwgezB4ZjgsIDB4MDh9LAorCisKKwkJCS8vUEFHRSAyOgorCQkJezB4NWUsIDB4MDJ9LAorCQkJezB4MGMsIDB4MDR9LCB7MHgyMSwgMHg2MX0sIHsweDIyLCAweDY4fSwgezB4MjMsIDB4NmZ9LCB7MHgyNCwgMHg3Nn0sCisJCQl7MHgyNSwgMHg3ZH0sIHsweDI2LCAweDg0fSwgezB4MjcsIDB4OGR9LCB7MHg0ZCwgMHgwOH0sIHsweDRlLCAweDAwfSwKKwkJCXsweDUwLCAweDA1fSwgezB4NTEsIDB4ZjV9LCB7MHg1MiwgMHgwNH0sIHsweDUzLCAweGEwfSwgezB4NTQsIDB4MWZ9LAorCQkJezB4NTUsIDB4MjN9LCB7MHg1NiwgMHg0NX0sIHsweDU3LCAweDY3fSwgezB4NTgsIDB4MDh9LCB7MHg1OSwgMHgwOH0sCisJCQl7MHg1YSwgMHgwOH0sIHsweDViLCAweDA4fSwgezB4NjAsIDB4MDh9LCB7MHg2MSwgMHgwOH0sIHsweDYyLCAweDA4fSwKKwkJCXsweDYzLCAweDA4fSwgezB4NjQsIDB4Y2Z9LCB7MHg3MiwgMHg1Nn0sIHsweDczLCAweDlhfSwKKworCQkJLy9QQUdBIDA6CisJCQl7MHg1ZSwgMHgwMH0sCisJCQl7MHgzNCwgMHhmZn0sIHsweDM1LCAweDBmfSwgezB4NWIsIDB4NDB9LCB7MHg4NCwgMHg4OH0sIHsweDg1LCAweDI0fSwKKwkJCXsweDg4LCAweDU0fSwgezB4OGIsIDB4Yjh9LCB7MHg4YywgMHgwN30sIHsweDhkLCAweDAwfSwgezB4OTQsIDB4MWJ9LAorCQkJezB4OTUsIDB4MTJ9LCB7MHg5NiwgMHgwMH0sIHsweDk3LCAweDA2fSwgezB4OWQsIDB4MWF9LCB7MHg5ZiwgMHgxMH0sCisJCQl7MHhiNCwgMHgyMn0sIHsweGJlLCAweDgwfSwgezB4ZGIsIDB4MDB9LCB7MHhlZSwgMHgwMH0sIHsweDViLCAweDQyfSwKKwkJCXsweDkxLCAweDAzfSwKKworCQkJLy9QQUdFIDI6CisJCQl7MHg1ZSwgMHgwMn0sCisJCQl7MHg0YywgMHgwM30sCisKKwkJCS8vUEFHRSAwOgorCQkJezB4NWUsIDB4MDB9LAorCisJCQkvL1BBR0UgMzoKKwkJCXsweDVlLCAweDAzfSwKKwkJCXsweDlmLCAweDAwfSwKKworCQkJLy9QQUdFIDA6CisJCQl7MHg1ZSwgMHgwMH0sCisJCQl7MHg4YywgMHgwMX0sIHsweDhkLCAweDEwfSx7MHg4ZSwgMHgwOH0sIHsweDhmLCAweDAwfQorCQl9OworCisKK3N0YXRpYyB1OCAgWkVCUkFfQUdDW109eworCTAsCisJMHg1ZSwweDVlLDB4NWUsMHg1ZSwweDVkLDB4NWIsMHg1OSwweDU3LDB4NTUsMHg1MywweDUxLDB4NGYsMHg0ZCwweDRiLDB4NDksMHg0NywKKwkweDQ1LDB4NDMsMHg0MSwweDNmLDB4M2QsMHgzYiwweDM5LDB4MzcsMHgzNSwweDMzLDB4MzEsMHgyZiwweDJkLDB4MmIsMHgyOSwweDI3LAorCTB4MjUsMHgyMywweDIxLDB4MWYsMHgxZCwweDFiLDB4MTksMHgxNywweDE1LDB4MTMsMHgxMSwweDBmLDB4MGQsMHgwYiwweDA5LDB4MDcsCisJMHgwNSwweDAzLDB4MDEsMHgwMSwweDAxLDB4MDEsMHgwMSwweDAxLDB4MDEsMHgwMSwweDAxLDB4MDEsMHgwMSwweDAxLDB4MDEsMHgwMSwKKwkweDE5LDB4MTksMHgxOSwweDAxOSwweDE5LDB4MTksMHgxOSwweDE5LDB4MTksMHgxOSwweDFlLDB4MWYsMHgyMCwweDIxLDB4MjEsMHgyMiwKKwkweDIzLDB4MjQsMHgyNCwweDI1LDB4MjUsMHgyNiwweDI2LDB4MjcsMHgyNywweDI4LDB4MjgsMHgyOCwweDI5LDB4MmEsMHgyYSwweDJiLAorCTB4MmIsMHgyYiwweDJjLDB4MmMsMHgyYywweDJkLDB4MmQsMHgyZCwweDJlLDB4MmUsMHgyZiwweDMwLDB4MzEsMHgzMSwweDMxLDB4MzEsCisJMHgzMSwweDMxLDB4MzEsMHgzMSwweDMxLDB4MzEsMHgzMSwweDMxLDB4MzEsMHgzMSwweDMxLDB4MzEsMHgzMSwweDMxLDB4MzEsMHgzMQorCX07CisKK3N0YXRpYyB1MzIgWkVCUkFfUkZfUlhfR0FJTl9UQUJMRVtdPXsKKwkwLAorCTB4MDQwMCwweDA0MDEsMHgwNDAyLDB4MDQwMywweDA0MDQsMHgwNDA1LDB4MDQwOCwweDA0MDksCisJMHgwNDBhLDB4MDQwYiwweDA1MDIsMHgwNTAzLDB4MDUwNCwweDA1MDUsMHgwNTQwLDB4MDU0MSwKKwkweDA1NDIsMHgwNTQzLDB4MDU0NCwweDA1NDUsMHgwNTgwLDB4MDU4MSwweDA1ODIsMHgwNTgzLAorCTB4MDU4NCwweDA1ODUsMHgwNTg4LDB4MDU4OSwweDA1OGEsMHgwNThiLDB4MDY0MywweDA2NDQsCisJMHgwNjQ1LDB4MDY4MCwweDA2ODEsMHgwNjgyLDB4MDY4MywweDA2ODQsMHgwNjg1LDB4MDY4OCwKKwkweDA2ODksMHgwNjhhLDB4MDY4YiwweDA2OGMsMHgwNzQyLDB4MDc0MywweDA3NDQsMHgwNzQ1LAorCTB4MDc4MCwweDA3ODEsMHgwNzgyLDB4MDc4MywweDA3ODQsMHgwNzg1LDB4MDc4OCwweDA3ODksCisJMHgwNzhhLDB4MDc4YiwweDA3OGMsMHgwNzhkLDB4MDc5MCwweDA3OTEsMHgwNzkyLDB4MDc5MywKKwkweDA3OTQsMHgwNzk1LDB4MDc5OCwweDA3OTksMHgwNzlhLDB4MDc5YiwweDA3OWMsMHgwNzlkLAorCTB4MDdhMCwweDA3YTEsMHgwN2EyLDB4MDdhMywweDA3YTQsMHgwN2E1LDB4MDdhOCwweDA3YTksCisJMHgwM2FhLDB4MDNhYiwweDAzYWMsMHgwM2FkLDB4MDNiMCwweDAzYjEsMHgwM2IyLDB4MDNiMywKKwkweDAzYjQsMHgwM2I1LDB4MDNiOCwweDAzYjksMHgwM2JhLDB4MDNiYiwweDAzYmIKK307CisKKy8vIDIwMDYuMDcuMTMsIFNEMyBzenV5aXRhc2k6CisvLwlPRkRNLjB4MDM9MHgwQyAob3JpZ2luYWwgaXMgMHgwRikKKy8vIFVzZSB0aGUgbmV3IFNEMyBnaXZlbiBwYXJhbSwgYnkgc2hpZW4gY2hhbmcsIDIwMDYuMDcuMTQKK3N0YXRpYyB1OCBPRkRNX0NPTkZJR1tdPXsKKwkweDEwLCAweDBkLCAweDAxLCAweDBDLCAweDE0LCAweGZiLCAweDBmLCAweDYwLCAweDAwLCAweDYwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4NWMsIDB4MDAsIDB4MDAsIDB4NDAsIDB4MDAsIDB4NDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHhhOCwgMHg0NiwgMHhiMiwgMHgzMywgMHgwNywgMHhhNSwgMHg2ZiwgMHg1NSwKKwkweGM4LCAweGIzLCAweDBhLCAweGUxLCAweDFjLCAweDhhLCAweGI2LCAweDgzLCAweDM0LCAweDBmLAorCTB4NGYsIDB4MjMsIDB4NmYsIDB4YzIsIDB4NmIsIDB4NDAsIDB4ODAsIDB4MDAsIDB4YzAsIDB4YzEsCisJMHg1OCwgMHhmMSwgMHgwMCwgMHhlNCwgMHg5MCwgMHgzZSwgMHg2ZCwgMHgzYywgMHhmZiwgMHgwNworfTsKKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAqIEhhcmR3YXJlIElPCisgICogdGhlIGNvZGUgaXMgcG9ydGVkIGZyb20gV2luZG93cyBzb3VyY2UgY29kZQorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZAorUGxhdGZvcm1JT1dyaXRlMUJ5dGUoCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwl1MzIJCW9mZnNldCwKKwl1OAkJZGF0YQorCSkKK3sKKyNpZm5kZWYgQ09ORklHX1JUTDgxODBfSU9fTUFQCisJd3JpdGVfbmljX2J5dGUoZGV2LCBvZmZzZXQsIGRhdGEpOworCXJlYWRfbmljX2J5dGUoZGV2LCBvZmZzZXQpOyAvLyBUbyBtYWtlIHN1cmUgd3JpdGUgb3BlcmF0aW9uIGlzIGNvbXBsZXRlZCwgMjAwNS4xMS4wOSwgYnkgcmNuamtvLgorCisjZWxzZSAvLyBQb3J0IElPCisJdTMyIFBhZ2UgPSAob2Zmc2V0ID4+IDgpOworCisJc3dpdGNoKFBhZ2UpCisJeworCWNhc2UgMDogLy8gUGFnZSAwCisJCXdyaXRlX25pY19ieXRlKGRldiwgb2Zmc2V0LCBkYXRhKTsKKwkJYnJlYWs7CisKKwljYXNlIDE6IC8vIFBhZ2UgMQorCWNhc2UgMjogLy8gUGFnZSAyCisJY2FzZSAzOiAvLyBQYWdlIDMKKwkJeworCQkJdTggcHNyID0gcmVhZF9uaWNfYnl0ZShkZXYsIFBTUik7CisKKwkJCXdyaXRlX25pY19ieXRlKGRldiwgUFNSLCAoKHBzciAmIDB4ZmMpIHwgKHU4KVBhZ2UpKTsgLy8gU3dpdGNoIHRvIHBhZ2UgTi4KKwkJCXdyaXRlX25pY19ieXRlKGRldiwgKG9mZnNldCAmIDB4ZmYpLCBkYXRhKTsKKwkJCXdyaXRlX25pY19ieXRlKGRldiwgUFNSLCAocHNyICYgMHhmYykpOyAvLyBTd2l0Y2ggdG8gcGFnZSAwLgorCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJLy8gSWxsZWdhbCBwYWdlIG51bWJlci4KKwkJRE1FU0dFKCJQbGF0Zm9ybUlPV3JpdGUxQnl0ZSgpOiBpbGxlZ2FsIHBhZ2UgbnVtYmVyOiAlZCwgb2Zmc2V0OiAlI1giLCBQYWdlLCBvZmZzZXQpOworCQlicmVhazsKKwl9CisjZW5kaWYKK30KKwordm9pZAorUGxhdGZvcm1JT1dyaXRlMkJ5dGUoCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwl1MzIJCW9mZnNldCwKKwl1MTYJCWRhdGEKKwkpCit7CisjaWZuZGVmIENPTkZJR19SVEw4MTgwX0lPX01BUAorCXdyaXRlX25pY193b3JkKGRldiwgb2Zmc2V0LCBkYXRhKTsKKwlyZWFkX25pY193b3JkKGRldiwgb2Zmc2V0KTsgLy8gVG8gbWFrZSBzdXJlIHdyaXRlIG9wZXJhdGlvbiBpcyBjb21wbGV0ZWQsIDIwMDUuMTEuMDksIGJ5IHJjbmprby4KKworCisjZWxzZSAvLyBQb3J0IElPCisJdTMyIFBhZ2UgPSAob2Zmc2V0ID4+IDgpOworCisJc3dpdGNoKFBhZ2UpCisJeworCWNhc2UgMDogLy8gUGFnZSAwCisJCXdyaXRlX25pY193b3JkKGRldiwgb2Zmc2V0LCBkYXRhKTsKKwkJYnJlYWs7CisKKwljYXNlIDE6IC8vIFBhZ2UgMQorCWNhc2UgMjogLy8gUGFnZSAyCisJY2FzZSAzOiAvLyBQYWdlIDMKKwkJeworCQkJdTggcHNyID0gcmVhZF9uaWNfYnl0ZShkZXYsIFBTUik7CisKKwkJCXdyaXRlX25pY19ieXRlKGRldiwgUFNSLCAoKHBzciAmIDB4ZmMpIHwgKHU4KVBhZ2UpKTsgLy8gU3dpdGNoIHRvIHBhZ2UgTi4KKwkJCXdyaXRlX25pY193b3JkKGRldiwgKG9mZnNldCAmIDB4ZmYpLCBkYXRhKTsKKwkJCXdyaXRlX25pY19ieXRlKGRldiwgUFNSLCAocHNyICYgMHhmYykpOyAvLyBTd2l0Y2ggdG8gcGFnZSAwLgorCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJLy8gSWxsZWdhbCBwYWdlIG51bWJlci4KKwkJRE1FU0dFKCJQbGF0Zm9ybUlPV3JpdGUyQnl0ZSgpOiBpbGxlZ2FsIHBhZ2UgbnVtYmVyOiAlZCwgb2Zmc2V0OiAlI1giLCBQYWdlLCBvZmZzZXQpOworCQlicmVhazsKKwl9CisjZW5kaWYKK30KK3U4IFBsYXRmb3JtSU9SZWFkMUJ5dGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIG9mZnNldCk7CisKK3ZvaWQKK1BsYXRmb3JtSU9Xcml0ZTRCeXRlKAorCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJdTMyCQlvZmZzZXQsCisJdTMyCQlkYXRhCisJKQoreworI2lmbmRlZiBDT05GSUdfUlRMODE4MF9JT19NQVAKKy8ve2J5IGFteSAwODAzMTIKK2lmIChvZmZzZXQgPT0gUGh5QWRkcikKKwl7Ly9Gb3IgQmFzZSBCYW5kIGNvbmZpZ3VyYXRpb24uCisJCXVuc2lnbmVkIGNoYXIJY21kQnl0ZTsKKwkJdW5zaWduZWQgbG9uZwlkYXRhQnl0ZXM7CisJCXVuc2lnbmVkIGNoYXIJaWR4OworCQl1OAl1MWJUbXA7CisKKwkJY21kQnl0ZSA9ICh1OCkoZGF0YSAmIDB4MDAwMDAwZmYpOworCQlkYXRhQnl0ZXMgPSBkYXRhPj44OworCisJCS8vCisJCS8vIDA3MTAxMCwgcmNuamtvOgorCQkvLyBUaGUgY3JpdGljYWwgc2VjdGlvbiBpcyBvbmx5IEJCIHJlYWQvd3JpdGUgcmFjZSBjb25kaXRpb24uCisJCS8vIEFzc3VtcHRpb246CisJCS8vIDEuIFdlIGFzc3VtZSBOTyBvbmUgd2lsbCBhY2Nlc3MgQkIgYXQgRElSUUwsIG90aGVyd2lzZSwgc3lzdGVtIHdpbGwgY3Jhc2ggZm9yCisJCS8vIGFjcXVpcmluZyB0aGUgc3BpbmxvY2sgaW4gc3VjaCBjb250ZXh0LgorCQkvLyAyLiBQbGF0Zm9ybUlPV3JpdGU0Qnl0ZSgpIE1VU1QgTk9UIGJlIHJlY3Vyc2l2ZS4KKwkJLy8KKy8vCQlOZGlzQWNxdWlyZVNwaW5Mb2NrKCAmKHBEZXZpY2UtPklvU3BpbkxvY2spICk7CisKKwkJZm9yKGlkeCA9IDA7IGlkeCA8IDMwOyBpZHgrKykKKwkJeyAvLyBNYWtlIHN1cmUgY29tbWFuZCBiaXQgaXMgY2xlYXIgYmVmb3JlIGFjY2VzcyBpdC4KKwkJCXUxYlRtcCA9IFBsYXRmb3JtSU9SZWFkMUJ5dGUoZGV2LCBQaHlBZGRyKTsKKwkJCWlmKCh1MWJUbXAgJiBCSVQ3KSA9PSAwKQorCQkJCWJyZWFrOworCQkJZWxzZQorCQkJCW1kZWxheSgxMCk7CisJCX0KKworCQlmb3IoaWR4PTA7IGlkeCA8IDM7IGlkeCsrKQorCQl7CisJCQlQbGF0Zm9ybUlPV3JpdGUxQnl0ZShkZXYsb2Zmc2V0KzEraWR4LCgodTgqKSZkYXRhQnl0ZXMpW2lkeF0gKTsKKwkJfQorCQl3cml0ZV9uaWNfYnl0ZShkZXYsIG9mZnNldCwgY21kQnl0ZSk7CisKKy8vCQlOZGlzUmVsZWFzZVNwaW5Mb2NrKCAmKHBEZXZpY2UtPklvU3BpbkxvY2spICk7CisJfQorLy9ieSBhbXkgMDgwMzEyfQorCWVsc2V7CisJCXdyaXRlX25pY19kd29yZChkZXYsIG9mZnNldCwgZGF0YSk7CisJCXJlYWRfbmljX2R3b3JkKGRldiwgb2Zmc2V0KTsgLy8gVG8gbWFrZSBzdXJlIHdyaXRlIG9wZXJhdGlvbiBpcyBjb21wbGV0ZWQsIDIwMDUuMTEuMDksIGJ5IHJjbmprby4KKwl9CisjZWxzZSAvLyBQb3J0IElPCisJdTMyIFBhZ2UgPSAob2Zmc2V0ID4+IDgpOworCisJc3dpdGNoKFBhZ2UpCisJeworCWNhc2UgMDogLy8gUGFnZSAwCisJCXdyaXRlX25pY193b3JkKGRldiwgb2Zmc2V0LCBkYXRhKTsKKwkJYnJlYWs7CisKKwljYXNlIDE6IC8vIFBhZ2UgMQorCWNhc2UgMjogLy8gUGFnZSAyCisJY2FzZSAzOiAvLyBQYWdlIDMKKwkJeworCQkJdTggcHNyID0gcmVhZF9uaWNfYnl0ZShkZXYsIFBTUik7CisKKwkJCXdyaXRlX25pY19ieXRlKGRldiwgUFNSLCAoKHBzciAmIDB4ZmMpIHwgKHU4KVBhZ2UpKTsgLy8gU3dpdGNoIHRvIHBhZ2UgTi4KKwkJCXdyaXRlX25pY19kd29yZChkZXYsIChvZmZzZXQgJiAweGZmKSwgZGF0YSk7CisJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIFBTUiwgKHBzciAmIDB4ZmMpKTsgLy8gU3dpdGNoIHRvIHBhZ2UgMC4KKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCS8vIElsbGVnYWwgcGFnZSBudW1iZXIuCisJCURNRVNHRSgiUGxhdGZvcm1JT1dyaXRlNEJ5dGUoKTogaWxsZWdhbCBwYWdlIG51bWJlcjogJWQsIG9mZnNldDogJSNYIiwgUGFnZSwgb2Zmc2V0KTsKKwkJYnJlYWs7CisJfQorI2VuZGlmCit9CisKK3U4CitQbGF0Zm9ybUlPUmVhZDFCeXRlKAorCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJdTMyCQlvZmZzZXQKKwkpCit7CisJdTgJZGF0YSA9IDA7CisKKyNpZm5kZWYgQ09ORklHX1JUTDgxODBfSU9fTUFQCisJZGF0YSA9IHJlYWRfbmljX2J5dGUoZGV2LCBvZmZzZXQpOworCisjZWxzZSAvLyBQb3J0IElPCisJdTMyIFBhZ2UgPSAob2Zmc2V0ID4+IDgpOworCisJc3dpdGNoKFBhZ2UpCisJeworCWNhc2UgMDogLy8gUGFnZSAwCisJCWRhdGEgPSByZWFkX25pY19ieXRlKGRldiwgb2Zmc2V0KTsKKwkJYnJlYWs7CisKKwljYXNlIDE6IC8vIFBhZ2UgMQorCWNhc2UgMjogLy8gUGFnZSAyCisJY2FzZSAzOiAvLyBQYWdlIDMKKwkJeworCQkJdTggcHNyID0gcmVhZF9uaWNfYnl0ZShkZXYsIFBTUik7CisKKwkJCXdyaXRlX25pY19ieXRlKGRldiwgUFNSLCAoKHBzciAmIDB4ZmMpIHwgKHU4KVBhZ2UpKTsgLy8gU3dpdGNoIHRvIHBhZ2UgTi4KKwkJCWRhdGEgPSByZWFkX25pY19ieXRlKGRldiwgKG9mZnNldCAmIDB4ZmYpKTsKKwkJCXdyaXRlX25pY19ieXRlKGRldiwgUFNSLCAocHNyICYgMHhmYykpOyAvLyBTd2l0Y2ggdG8gcGFnZSAwLgorCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJLy8gSWxsZWdhbCBwYWdlIG51bWJlci4KKwkJRE1FU0dFKCJQbGF0Zm9ybUlPUmVhZDFCeXRlKCk6IGlsbGVnYWwgcGFnZSBudW1iZXI6ICVkLCBvZmZzZXQ6ICUjWCIsIFBhZ2UsIG9mZnNldCk7CisJCWJyZWFrOworCX0KKyNlbmRpZgorCisJcmV0dXJuIGRhdGE7Cit9CisKK3UxNgorUGxhdGZvcm1JT1JlYWQyQnl0ZSgKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCXUzMgkJb2Zmc2V0CisJKQoreworCXUxNglkYXRhID0gMDsKKworI2lmbmRlZiBDT05GSUdfUlRMODE4MF9JT19NQVAKKwlkYXRhID0gcmVhZF9uaWNfd29yZChkZXYsIG9mZnNldCk7CisKKyNlbHNlIC8vIFBvcnQgSU8KKwl1MzIgUGFnZSA9IChvZmZzZXQgPj4gOCk7CisKKwlzd2l0Y2goUGFnZSkKKwl7CisJY2FzZSAwOiAvLyBQYWdlIDAKKwkJZGF0YSA9IHJlYWRfbmljX3dvcmQoZGV2LCBvZmZzZXQpOworCQlicmVhazsKKworCWNhc2UgMTogLy8gUGFnZSAxCisJY2FzZSAyOiAvLyBQYWdlIDIKKwljYXNlIDM6IC8vIFBhZ2UgMworCQl7CisJCQl1OCBwc3IgPSByZWFkX25pY19ieXRlKGRldiwgUFNSKTsKKworCQkJd3JpdGVfbmljX2J5dGUoZGV2LCBQU1IsICgocHNyICYgMHhmYykgfCAodTgpUGFnZSkpOyAvLyBTd2l0Y2ggdG8gcGFnZSBOLgorCQkJZGF0YSA9IHJlYWRfbmljX3dvcmQoZGV2LCAob2Zmc2V0ICYgMHhmZikpOworCQkJd3JpdGVfbmljX2J5dGUoZGV2LCBQU1IsIChwc3IgJiAweGZjKSk7IC8vIFN3aXRjaCB0byBwYWdlIDAuCisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQkvLyBJbGxlZ2FsIHBhZ2UgbnVtYmVyLgorCQlETUVTR0UoIlBsYXRmb3JtSU9SZWFkMkJ5dGUoKTogaWxsZWdhbCBwYWdlIG51bWJlcjogJWQsIG9mZnNldDogJSNYIiwgUGFnZSwgb2Zmc2V0KTsKKwkJYnJlYWs7CisJfQorI2VuZGlmCisKKwlyZXR1cm4gZGF0YTsKK30KKwordTMyCitQbGF0Zm9ybUlPUmVhZDRCeXRlKAorCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJdTMyCQlvZmZzZXQKKwkpCit7CisJdTMyCWRhdGEgPSAwOworCisjaWZuZGVmIENPTkZJR19SVEw4MTgwX0lPX01BUAorCWRhdGEgPSByZWFkX25pY19kd29yZChkZXYsIG9mZnNldCk7CisKKyNlbHNlIC8vIFBvcnQgSU8KKwl1MzIgUGFnZSA9IChvZmZzZXQgPj4gOCk7CisKKwlzd2l0Y2goUGFnZSkKKwl7CisJY2FzZSAwOiAvLyBQYWdlIDAKKwkJZGF0YSA9IHJlYWRfbmljX2R3b3JkKGRldiwgb2Zmc2V0KTsKKwkJYnJlYWs7CisKKwljYXNlIDE6IC8vIFBhZ2UgMQorCWNhc2UgMjogLy8gUGFnZSAyCisJY2FzZSAzOiAvLyBQYWdlIDMKKwkJeworCQkJdTggcHNyID0gcmVhZF9uaWNfYnl0ZShkZXYsIFBTUik7CisKKwkJCXdyaXRlX25pY19ieXRlKGRldiwgUFNSLCAoKHBzciAmIDB4ZmMpIHwgKHU4KVBhZ2UpKTsgLy8gU3dpdGNoIHRvIHBhZ2UgTi4KKwkJCWRhdGEgPSByZWFkX25pY19kd29yZChkZXYsIChvZmZzZXQgJiAweGZmKSk7CisJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIFBTUiwgKHBzciAmIDB4ZmMpKTsgLy8gU3dpdGNoIHRvIHBhZ2UgMC4KKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCS8vIElsbGVnYWwgcGFnZSBudW1iZXIuCisJCURNRVNHRSgiUGxhdGZvcm1JT1JlYWQ0Qnl0ZSgpOiBpbGxlZ2FsIHBhZ2UgbnVtYmVyOiAlZCwgb2Zmc2V0OiAlI1hcbiIsIFBhZ2UsIG9mZnNldCk7CisJCWJyZWFrOworCX0KKyNlbmRpZgorCisJcmV0dXJuIGRhdGE7Cit9CisKK3ZvaWQKK1NldE91dHB1dEVuYWJsZU9mUmZQaW5zKAorCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYKKwkpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTgwX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOworCisJc3dpdGNoKHByaXYtPnJmX2NoaXApCisJeworCWNhc2UgUkZDSElQSURfUlRMODIyNToKKwljYXNlIFJGX1pFQlJBMjoKKwljYXNlIFJGX1pFQlJBNDoKKwkJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNFbmFibGUsIDB4MWJmZik7CisJCS8vd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNFbmFibGUsIDB4MWZmZik7CisJCWJyZWFrOworCX0KK30KKwordm9pZAorWkVCUkFfUkZTZXJpYWxXcml0ZSgKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCXUzMgkJCWRhdGEyV3JpdGUsCisJdTgJCQl0b3RhbExlbmd0aCwKKwl1OAkJCWxvdzJoaWdoCisJKQoreworCVRocmVlV2lyZVJlZwkJdHdyZWc7CisJaW50IAkJCQlpOworCXUxNgkJCQlvdmFsLG92YWwyLG92YWwzOworCXUzMgkJCQltYXNrOworCXUxNgkJCQlVc2hvcnRCdWZmZXI7CisKKwl1OAkJCXUxYlRtcDsKKyNpZmRlZiBDT05GSUdfUlRMODE4WF9TCisJLy8gUlRMODE4N1MgSFNTSSBSZWFkL1dyaXRlIEZ1bmN0aW9uCisJdTFiVG1wID0gcmVhZF9uaWNfYnl0ZShkZXYsIFJGX1NXX0NPTkZJRyk7CisJdTFiVG1wIHw9ICAgUkZfU1dfQ0ZHX1NJOyAgIC8vcmVnMDhbMV09MSBTZXJpYWwgSW50ZXJmYWNlKFNJKQorCXdyaXRlX25pY19ieXRlKGRldiwgUkZfU1dfQ09ORklHLCB1MWJUbXApOworI2VuZGlmCisJVXNob3J0QnVmZmVyID0gcmVhZF9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCk7CisJb3ZhbCA9IFVzaG9ydEJ1ZmZlciAmIDB4ZmZmODsgLy8gV2Ugc2hhbGwgY2xlYXIgYml0MCwgMSwgMiBmaXJzdCwgMjAwNS4xMC4yOCwgYnkgcmNuamtvLgorCisJb3ZhbDIgPSByZWFkX25pY193b3JkKGRldiwgUkZQaW5zRW5hYmxlKTsKKwlvdmFsMyA9IHJlYWRfbmljX3dvcmQoZGV2LCBSRlBpbnNTZWxlY3QpOworCisJLy8gPFJKX05PVEU+IDMtd2lyZSBzaG91bGQgYmUgY29udHJvbGVkIGJ5IEhXIHdoZW4gd2UgZmluaXNoIFNXIDMtd2lyZSBwcm9ncmFtbWluZy4gMjAwNS4wOC4xMCwgYnkgcmNuamtvLgorCW92YWwzICY9IDB4ZmZmODsKKworCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zRW5hYmxlLCAob3ZhbDJ8MHgwMDA3KSk7IC8vIFNldCBUbyBPdXRwdXQgRW5hYmxlCisJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNTZWxlY3QsIChvdmFsM3wweDAwMDcpKTsgLy8gU2V0IFRvIFNXIFN3aXRjaAorCXVkZWxheSgxMCk7CisKKwkvLyBBZGQgdGhpcyB0byBhdm9pZCBoYXJkd2FyZSBhbmQgc29mdHdhcmUgMy13aXJlIGNvbmZsaWN0LgorCS8vIDIwMDUuMDMuMDEsIGJ5IHJjbmprby4KKwl0d3JlZy5sb25nRGF0YSA9IDA7CisJdHdyZWcuc3RydWMuZW5hYmxlQiA9IDE7CisJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQsICh0d3JlZy5sb25nRGF0YXxvdmFsKSk7IC8vIFNldCBTSV9FTiAoUkZMRSkKKwl1ZGVsYXkoMik7CisJdHdyZWcuc3RydWMuZW5hYmxlQiA9IDA7CisJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQsICh0d3JlZy5sb25nRGF0YXxvdmFsKSk7IC8vIENsZWFyIFNJX0VOIChSRkxFKQorCXVkZWxheSgxMCk7CisKKwltYXNrID0gKGxvdzJoaWdoKT8weDAxOigodTMyKTB4MDE8PCh0b3RhbExlbmd0aC0xKSk7CisKKwlmb3IoaT0wOyBpPHRvdGFsTGVuZ3RoLzI7IGkrKykKKwl7CisJCXR3cmVnLnN0cnVjLmRhdGEgPSAoKGRhdGEyV3JpdGUmbWFzaykhPTApID8gMSA6IDA7CisJCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCAodHdyZWcubG9uZ0RhdGF8b3ZhbCkpOworCQl0d3JlZy5zdHJ1Yy5jbGsgPSAxOworCQl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCwgKHR3cmVnLmxvbmdEYXRhfG92YWwpKTsKKwkJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQsICh0d3JlZy5sb25nRGF0YXxvdmFsKSk7CisKKwkJbWFzayA9IChsb3cyaGlnaCk/KG1hc2s8PDEpOihtYXNrPj4xKTsKKwkJdHdyZWcuc3RydWMuZGF0YSA9ICgoZGF0YTJXcml0ZSZtYXNrKSE9MCkgPyAxIDogMDsKKwkJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQsICh0d3JlZy5sb25nRGF0YXxvdmFsKSk7CisJCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCAodHdyZWcubG9uZ0RhdGF8b3ZhbCkpOworCQl0d3JlZy5zdHJ1Yy5jbGsgPSAwOworCQl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCwgKHR3cmVnLmxvbmdEYXRhfG92YWwpKTsKKwkJbWFzayA9IChsb3cyaGlnaCk/KG1hc2s8PDEpOihtYXNrPj4xKTsKKwl9CisKKwl0d3JlZy5zdHJ1Yy5lbmFibGVCID0gMTsKKwl0d3JlZy5zdHJ1Yy5jbGsgPSAwOworCXR3cmVnLnN0cnVjLmRhdGEgPSAwOworCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCB0d3JlZy5sb25nRGF0YXxvdmFsKTsKKwl1ZGVsYXkoMTApOworCisJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQsIG92YWx8MHgwMDA0KTsKKwl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc1NlbGVjdCwgb3ZhbDN8MHgwMDAwKTsKKworCVNldE91dHB1dEVuYWJsZU9mUmZQaW5zKGRldik7Cit9CisvL2J5IGFteQorCisKK2ludAorSHdIU1NJVGhyZWVXaXJlKAorCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJdTgJCQkqcERhdGFCdWYsCisJdTgJCQluRGF0YUJ1ZkJpdENudCwKKwlpbnQJCQliU0ksCisJaW50CQkJYldyaXRlCisJKQoreworCWludAliUmVzdWx0ID0gMTsKKwl1OAlUcnlDbnQ7CisJdTgJdTFiVG1wOworCisJZG8KKwl7CisJCS8vIENoZWNrIGlmIFdFIGFuZCBSRSBhcmUgY2xlYXJlZC4KKwkJZm9yKFRyeUNudCA9IDA7IFRyeUNudCA8IFRDXzNXX1BPTExfTUFYX1RSWV9DTlQ7IFRyeUNudCsrKQorCQl7CisJCQl1MWJUbXAgPSByZWFkX25pY19ieXRlKGRldiwgU1dfM1dfQ01EMSk7CisJCQlpZiggKHUxYlRtcCAmIChTV18zV19DTUQxX1JFfFNXXzNXX0NNRDFfV0UpKSA9PSAwICkKKwkJCXsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXVkZWxheSgxMCk7CisJCX0KKwkJaWYgKFRyeUNudCA9PSBUQ18zV19QT0xMX01BWF9UUllfQ05UKQorCQkJcGFuaWMoIkh3VGhyZWVXaXJlKCk6IENtZFJlZzogJSNYIFJFfFdFIGJpdHMgYXJlIG5vdCBjbGVhciEhXG4iLCB1MWJUbXApOworCisJCS8vIFJUTDgxODdTIEhTU0kgUmVhZC9Xcml0ZSBGdW5jdGlvbgorCQl1MWJUbXAgPSByZWFkX25pY19ieXRlKGRldiwgUkZfU1dfQ09ORklHKTsKKworCQlpZihiU0kpCisJCXsKKwkJCXUxYlRtcCB8PSAgIFJGX1NXX0NGR19TSTsgICAvL3JlZzA4WzFdPTEgU2VyaWFsIEludGVyZmFjZShTSSkKKwkJfWVsc2UKKwkJeworCQkJdTFiVG1wICY9IH5SRl9TV19DRkdfU0k7ICAvL3JlZzA4WzFdPTAgUGFyYWxsZWwgSW50ZXJmYWNlKFBJKQorCQl9CisKKwkJd3JpdGVfbmljX2J5dGUoZGV2LCBSRl9TV19DT05GSUcsIHUxYlRtcCk7CisKKwkJaWYoYlNJKQorCQl7CisJCQkvLyBqb25nOiBIVyBTSSByZWFkIG11c3Qgc2V0IHJlZzg0WzNdPTAuCisJCQl1MWJUbXAgPSByZWFkX25pY19ieXRlKGRldiwgUkZQaW5zU2VsZWN0KTsKKwkJCXUxYlRtcCAmPSB+QklUMzsKKwkJCXdyaXRlX25pY19ieXRlKGRldiwgUkZQaW5zU2VsZWN0LCB1MWJUbXAgKTsKKwkJfQorCSAJLy8gRmlsbCB1cCBkYXRhIGJ1ZmZlciBmb3Igd3JpdGUgb3BlcmF0aW9uLgorCisJCWlmKGJXcml0ZSkKKwkJeworCQkJaWYobkRhdGFCdWZCaXRDbnQgPT0gMTYpCisJCQl7CisJCQkJd3JpdGVfbmljX3dvcmQoZGV2LCBTV18zV19EQjAsICooKHUxNiopcERhdGFCdWYpKTsKKwkJCX0KKwkJCWVsc2UgaWYobkRhdGFCdWZCaXRDbnQgPT0gNjQpICAvLyBSVEw4MTg3UyBzaG91bGRuJ3QgZW50ZXIgdGhpcyBjYXNlCisJCQl7CisJCQkJd3JpdGVfbmljX2R3b3JkKGRldiwgU1dfM1dfREIwLCAqKCh1MzIqKXBEYXRhQnVmKSk7CisJCQkJd3JpdGVfbmljX2R3b3JkKGRldiwgU1dfM1dfREIxLCAqKCh1MzIqKShwRGF0YUJ1ZiArIDQpKSk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJaW50IGlkeDsKKwkJCQlpbnQgQnl0ZUNudCA9IG5EYXRhQnVmQml0Q250IC8gODsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9wcmludGsoIiVkXG4iLG5EYXRhQnVmQml0Q250KTsKKwkJCQlpZiAoKG5EYXRhQnVmQml0Q250ICUgOCkgIT0gMCkKKwkJCQlwYW5pYygiSHdUaHJlZVdpcmUoKTogbkRhdGFCdWZCaXRDbnQoJWQpIHNob3VsZCBiZSBtdWx0aXBsZSBvZiA4ISEhXG4iLAorCQkJCW5EYXRhQnVmQml0Q250KTsKKworCQkJICAgICAgIGlmIChuRGF0YUJ1ZkJpdENudCA+IDY0KQorCQkJCXBhbmljKCJId1RocmVlV2lyZSgpOiBuRGF0YUJ1ZkJpdENudCglZCkgc2hvdWxkIDw9IDY0ISEhXG4iLAorCQkJCW5EYXRhQnVmQml0Q250KTsKKworCQkJCWZvcihpZHggPSAwOyBpZHggPCBCeXRlQ250OyBpZHgrKykKKwkJCQl7CisJCQkJCXdyaXRlX25pY19ieXRlKGRldiwgKFNXXzNXX0RCMCtpZHgpLCAqKHBEYXRhQnVmK2lkeCkpOworCQkJCX0KKwkJCX0KKwkJfQorCQllbHNlCQkvL3JlYWQKKwkJeworCQkJaWYoYlNJKQorCQkJeworCQkJCS8vIFNJIC0gcmVnMjc0WzM6MF0gOiBSRiByZWdpc3RlcidzIEFkZHJlc3MKKwkJCQl3cml0ZV9uaWNfd29yZChkZXYsIFNXXzNXX0RCMCwgKigodTE2KilwRGF0YUJ1ZikgKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQkvLyBQSSAtIHJlZzI3NFsxNToxMl0gOiBSRiByZWdpc3RlcidzIEFkZHJlc3MKKwkJCQl3cml0ZV9uaWNfd29yZChkZXYsIFNXXzNXX0RCMCwgKCooKHUxNiopcERhdGFCdWYpKSA8PCAxMik7CisJCQl9CisJCX0KKworCQkvLyBTZXQgdXAgY29tbWFuZDogV0Ugb3IgUkUuCisJCWlmKGJXcml0ZSkKKwkJeworCQkJd3JpdGVfbmljX2J5dGUoZGV2LCBTV18zV19DTUQxLCBTV18zV19DTUQxX1dFKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXdyaXRlX25pY19ieXRlKGRldiwgU1dfM1dfQ01EMSwgU1dfM1dfQ01EMV9SRSk7CisJCX0KKworCQkvLyBDaGVjayBpZiBET05FIGlzIHNldC4KKwkJZm9yKFRyeUNudCA9IDA7IFRyeUNudCA8IFRDXzNXX1BPTExfTUFYX1RSWV9DTlQ7IFRyeUNudCsrKQorCQl7CisJCQl1MWJUbXAgPSByZWFkX25pY19ieXRlKGRldiwgU1dfM1dfQ01EMSk7CisJCQlpZiggICh1MWJUbXAgJiBTV18zV19DTUQxX0RPTkUpICE9IDAgKQorCQkJeworCQkJCWJyZWFrOworCQkJfQorCQkJdWRlbGF5KDEwKTsKKwkJfQorCisJCXdyaXRlX25pY19ieXRlKGRldiwgU1dfM1dfQ01EMSwgMCk7CisKKwkJLy8gUmVhZCBiYWNrIGRhdGEgZm9yIHJlYWQgb3BlcmF0aW9uLgorCQlpZihiV3JpdGUgPT0gMCkKKwkJeworCQkJaWYoYlNJKQorCQkJeworCQkJCS8vU2VyaWFsIEludGVyZmFjZSA6IHJlZzM2M18zNjJbMTE6MF0KKwkJCQkqKCh1MTYqKXBEYXRhQnVmKSA9IHJlYWRfbmljX3dvcmQoZGV2LCBTSV9EQVRBX1JFQUQpIDsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQkvL1BhcmFsbGVsIEludGVyZmFjZSA6IHJlZzM2MV8zNjBbMTE6MF0KKwkJCQkqKCh1MTYqKXBEYXRhQnVmKSA9IHJlYWRfbmljX3dvcmQoZGV2LCBQSV9EQVRBX1JFQUQpOworCQkJfQorCisJCQkqKCh1MTYqKXBEYXRhQnVmKSAmPSAweDBGRkY7CisJCX0KKworCX13aGlsZSgwKTsKKworCXJldHVybiBiUmVzdWx0OworfQorLy9ieSBhbXkKKworaW50CitId1RocmVlV2lyZSgKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCXU4CQkJKnBEYXRhQnVmLAorCXU4CQkJbkRhdGFCdWZCaXRDbnQsCisJaW50CQkJYkhvbGQsCisJaW50CQkJYldyaXRlCisJKQoreworCWludAliUmVzdWx0ID0gMTsKKwl1OAlUcnlDbnQ7CisJdTgJdTFiVG1wOworCisJZG8KKwl7CisJCS8vIENoZWNrIGlmIFdFIGFuZCBSRSBhcmUgY2xlYXJlZC4KKwkJZm9yKFRyeUNudCA9IDA7IFRyeUNudCA8IFRDXzNXX1BPTExfTUFYX1RSWV9DTlQ7IFRyeUNudCsrKQorCQl7CisJCQl1MWJUbXAgPSByZWFkX25pY19ieXRlKGRldiwgU1dfM1dfQ01EMSk7CisJCQlpZiggKHUxYlRtcCAmIChTV18zV19DTUQxX1JFfFNXXzNXX0NNRDFfV0UpKSA9PSAwICkKKwkJCXsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXVkZWxheSgxMCk7CisJCX0KKwkJaWYgKFRyeUNudCA9PSBUQ18zV19QT0xMX01BWF9UUllfQ05UKQorCQkJcGFuaWMoIkh3VGhyZWVXaXJlKCk6IENtZFJlZzogJSNYIFJFfFdFIGJpdHMgYXJlIG5vdCBjbGVhciEhXG4iLCB1MWJUbXApOworCisJCS8vIEZpbGwgdXAgZGF0YSBidWZmZXIgZm9yIHdyaXRlIG9wZXJhdGlvbi4KKwkJaWYobkRhdGFCdWZCaXRDbnQgPT0gMTYpCisJCXsKKwkJCXdyaXRlX25pY193b3JkKGRldiwgU1dfM1dfREIwLCAqKCh1MTYgKilwRGF0YUJ1ZikpOworCQl9CisJCWVsc2UgaWYobkRhdGFCdWZCaXRDbnQgPT0gNjQpCisJCXsKKwkJCXdyaXRlX25pY19kd29yZChkZXYsIFNXXzNXX0RCMCwgKigodTMyICopcERhdGFCdWYpKTsKKwkJCXdyaXRlX25pY19kd29yZChkZXYsIFNXXzNXX0RCMSwgKigodTMyICopKHBEYXRhQnVmICsgNCkpKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCWludCBpZHg7CisJCQlpbnQgQnl0ZUNudCA9IG5EYXRhQnVmQml0Q250IC8gODsKKworCQkJaWYgKChuRGF0YUJ1ZkJpdENudCAlIDgpICE9IDApCisJCQkJcGFuaWMoIkh3VGhyZWVXaXJlKCk6IG5EYXRhQnVmQml0Q250KCVkKSBzaG91bGQgYmUgbXVsdGlwbGUgb2YgOCEhIVxuIiwKKwkJCQluRGF0YUJ1ZkJpdENudCk7CisKKwkJCWlmIChuRGF0YUJ1ZkJpdENudCA+IDY0KQorCQkJCXBhbmljKCJId1RocmVlV2lyZSgpOiBuRGF0YUJ1ZkJpdENudCglZCkgc2hvdWxkIDw9IDY0ISEhXG4iLAorCQkJCW5EYXRhQnVmQml0Q250KTsKKworCQkJZm9yKGlkeCA9IDA7IGlkeCA8IEJ5dGVDbnQ7IGlkeCsrKQorCQkJeworCQkJCXdyaXRlX25pY19ieXRlKGRldiwgKFNXXzNXX0RCMCtpZHgpLCAqKHBEYXRhQnVmK2lkeCkpOworCQkJfQorCQl9CisKKwkJLy8gRmlsbCB1cCBsZW5ndGggZmllbGQuCisJCXUxYlRtcCA9ICh1OCkobkRhdGFCdWZCaXRDbnQgLSAxKTsgLy8gTnVtYmVyIG9mIGJpdHMgLSAxLgorCQlpZihiSG9sZCkKKwkJCXUxYlRtcCB8PSBTV18zV19DTUQwX0hPTEQ7CisJCXdyaXRlX25pY19ieXRlKGRldiwgU1dfM1dfQ01EMCwgdTFiVG1wKTsKKworCQkvLyBTZXQgdXAgY29tbWFuZDogV0Ugb3IgUkUuCisJCWlmKGJXcml0ZSkKKwkJeworCQkJd3JpdGVfbmljX2J5dGUoZGV2LCBTV18zV19DTUQxLCBTV18zV19DTUQxX1dFKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXdyaXRlX25pY19ieXRlKGRldiwgU1dfM1dfQ01EMSwgU1dfM1dfQ01EMV9SRSk7CisJCX0KKworCQkvLyBDaGVjayBpZiBXRSBhbmQgUkUgYXJlIGNsZWFyZWQgYW5kIERPTkUgaXMgc2V0LgorCQlmb3IoVHJ5Q250ID0gMDsgVHJ5Q250IDwgVENfM1dfUE9MTF9NQVhfVFJZX0NOVDsgVHJ5Q250KyspCisJCXsKKwkJCXUxYlRtcCA9IHJlYWRfbmljX2J5dGUoZGV2LCBTV18zV19DTUQxKTsKKwkJCWlmKCAodTFiVG1wICYgKFNXXzNXX0NNRDFfUkV8U1dfM1dfQ01EMV9XRSkpID09IDAgJiYKKwkJCQkodTFiVG1wICYgU1dfM1dfQ01EMV9ET05FKSAhPSAwICkKKwkJCXsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXVkZWxheSgxMCk7CisJCX0KKwkJaWYoVHJ5Q250ID09IFRDXzNXX1BPTExfTUFYX1RSWV9DTlQpCisJCXsKKwkJCS8vUlRfQVNTRVJUKFRyeUNudCAhPSBUQ18zV19QT0xMX01BWF9UUllfQ05ULAorCQkJLy8JKCJId1RocmVlV2lyZSgpOiBDbWRSZWc6ICUjWCBSRXxXRSBiaXRzIGFyZSBub3QgY2xlYXIgb3IgRE9ORSBpcyBub3Qgc2V0ISFcbiIsIHUxYlRtcCkpOworCQkJLy8gV29ya2Fyb3VuZCBzdWdnZXN0ZWQgYnkgd2NjaHU6IGNsZWFyIFdFIGhlcmUuIDIwMDYuMDcuMDcsIGJ5IHJjbmprby4KKwkJCXdyaXRlX25pY19ieXRlKGRldiwgU1dfM1dfQ01EMSwgMCk7CisJCX0KKworCQkvLyBSZWFkIGJhY2sgZGF0YSBmb3IgcmVhZCBvcGVyYXRpb24uCisJCS8vIDxSSl9UT0RPPiBJIGFtIG5vdCBzdXJlIGlmIHRoaXMgaXMgY29ycmVjdCBvdXRwdXQgZm9ybWF0IG9mIGEgcmVhZCBvcGVyYXRpb24uCisJCWlmKGJXcml0ZSA9PSAwKQorCQl7CisJCQlpZihuRGF0YUJ1ZkJpdENudCA9PSAxNikKKwkJCXsKKwkJCQkqKCh1MTYgKilwRGF0YUJ1ZikgPSByZWFkX25pY193b3JkKGRldiwgU1dfM1dfREIwKTsKKwkJCX0KKwkJCWVsc2UgaWYobkRhdGFCdWZCaXRDbnQgPT0gNjQpCisJCQl7CisJCQkJKigodTMyICopcERhdGFCdWYpID0gcmVhZF9uaWNfZHdvcmQoZGV2LCBTV18zV19EQjApOworCQkJCSooKHUzMiAqKShwRGF0YUJ1ZiArIDQpKSA9IHJlYWRfbmljX2R3b3JkKGRldiwgU1dfM1dfREIxKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlpbnQgaWR4OworCQkJCWludCBCeXRlQ250ID0gbkRhdGFCdWZCaXRDbnQgLyA4OworCisJCQkJaWYgKChuRGF0YUJ1ZkJpdENudCAlIDgpICE9IDApCisJCQkJCXBhbmljKCJId1RocmVlV2lyZSgpOiBuRGF0YUJ1ZkJpdENudCglZCkgc2hvdWxkIGJlIG11bHRpcGxlIG9mIDghISFcbiIsCisJCQkJCW5EYXRhQnVmQml0Q250KTsKKworCQkJCWlmIChuRGF0YUJ1ZkJpdENudCA+IDY0KQorCQkJCQlwYW5pYygiSHdUaHJlZVdpcmUoKTogbkRhdGFCdWZCaXRDbnQoJWQpIHNob3VsZCA8PSA2NCEhIVxuIiwKKwkJCQkJbkRhdGFCdWZCaXRDbnQpOworCisJCQkJZm9yKGlkeCA9IDA7IGlkeCA8IEJ5dGVDbnQ7IGlkeCsrKQorCQkJCXsKKwkJCQkJKihwRGF0YUJ1ZitpZHgpID0gcmVhZF9uaWNfYnl0ZShkZXYsIChTV18zV19EQjAraWR4KSk7CisJCQkJfQorCQkJfQorCQl9CisKKwl9d2hpbGUoMCk7CisKKwlyZXR1cm4gYlJlc3VsdDsKK30KKworCit2b2lkCitSRl9Xcml0ZVJlZygKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCXU4CQlvZmZzZXQsCisJdTMyCQlkYXRhCisJKQoreworCS8vUkZSZWcJCQlyZWc7CisJdTMyCQkJZGF0YTJXcml0ZTsKKwl1OAkJCWxlbjsKKwl1OAkJCWxvdzJoaWdoOworCS8vdTMyCQkJUkZfUmVhZCA9IDA7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTgwX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOworCisKKwlzd2l0Y2gocHJpdi0+cmZfY2hpcCkKKwl7CisJY2FzZSBSRkNISVBJRF9SVEw4MjI1OgorCWNhc2UgUkZfWkVCUkEyOgkJLy8gQW5uaWUgMjAwNi0wNS0xMi4KKwljYXNlIFJGX1pFQlJBNDogICAgICAgIC8vYnkgYW15CisJCXN3aXRjaChwcml2LT5SZWdUaHJlZVdpcmVNb2RlKQorCQl7CisJCWNhc2UgU1dfVEhSRUVfV0lSRToKKwkJCXsgLy8gUGVyZm9ybSBTVyAzLXdpcmUgcHJvZ3JhbW1pbmcgYnkgZHJpdmVyLgorCQkJCWRhdGEyV3JpdGUgPSAoZGF0YSA8PCA0KSB8ICh1MzIpKG9mZnNldCAmIDB4MGYpOworCQkJCWxlbiA9IDE2OworCQkJCWxvdzJoaWdoID0gMDsKKwkJCQlaRUJSQV9SRlNlcmlhbFdyaXRlKGRldiwgZGF0YTJXcml0ZSwgbGVuLCBsb3cyaGlnaCk7CisgICAgICAgCQkJfQorCQkJYnJlYWs7CisKKyAJCWNhc2UgSFdfVEhSRUVfV0lSRToKKwkJCXsgLy8gUHVyZSBIVyAzLXdpcmUuCisJCQkJZGF0YTJXcml0ZSA9IChkYXRhIDw8IDQpIHwgKHUzMikob2Zmc2V0ICYgMHgwZik7CisJCQkJbGVuID0gMTY7CisJCQkJSHdUaHJlZVdpcmUoCisJCQkJCWRldiwKKwkJCQkJKHU4ICopKCZkYXRhMldyaXRlKSwJLy8gcERhdGFCdWYsCisJCQkJCWxlbiwJCQkJLy8gbkRhdGFCdWZCaXRDbnQsCisJCQkJCTAsCQkJCQkvLyBiSG9sZCwKKwkJCQkJMSk7CQkJCQkvLyBiV3JpdGUKKyAgICAgICAgIAkJfQorCQkJYnJlYWs7CisgICNpZmRlZiBDT05GSUdfUlRMODE4WF9TCisJCQljYXNlIEhXX1RIUkVFX1dJUkVfUEk6IC8vUGFyYWxsZWwgSW50ZXJmYWNlCisJCQl7IC8vIFB1cmUgSFcgMy13aXJlLgorCQkJCWRhdGEyV3JpdGUgPSAoZGF0YSA8PCA0KSB8ICh1MzIpKG9mZnNldCAmIDB4MGYpOworCQkJCWxlbiA9IDE2OworCQkJCQlId0hTU0lUaHJlZVdpcmUoCisJCQkJCQlkZXYsCisJCQkJCQkodTgqKSgmZGF0YTJXcml0ZSksCS8vIHBEYXRhQnVmLAorCQkJCQkJbGVuLAkJCQkJCS8vIG5EYXRhQnVmQml0Q250LAorCQkJCQkJMCwgCQkJCQkvLyBiU0kKKwkJCQkJCTEpOyAJCQkJCS8vIGJXcml0ZQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vcHJpbnRrKCIzMzMzM1xuIik7CisJCQl9CisJCQlicmVhazsKKworCQkJY2FzZSBIV19USFJFRV9XSVJFX1NJOiAvL1NlcmlhbCBJbnRlcmZhY2UKKwkJCXsgLy8gUHVyZSBIVyAzLXdpcmUuCisJCQkJZGF0YTJXcml0ZSA9IChkYXRhIDw8IDQpIHwgKHUzMikob2Zmc2V0ICYgMHgwZik7CisJCQkJbGVuID0gMTY7CisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCIgZW50ZXIgIFpFQlJBX1JGU2VyaWFsV3JpdGVcbiAiKTsKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb3cyaGlnaCA9IDA7CisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWkVCUkFfUkZTZXJpYWxXcml0ZShkZXYsIGRhdGEyV3JpdGUsIGxlbiwgbG93MmhpZ2gpOworCisJCQkJSHdIU1NJVGhyZWVXaXJlKAorCQkJCQlkZXYsCisJCQkJCSh1OCopKCZkYXRhMldyaXRlKSwJLy8gcERhdGFCdWYsCisJCQkJCWxlbiwJCQkJCQkvLyBuRGF0YUJ1ZkJpdENudCwKKwkJCQkJMSwgCQkJCQkvLyBiU0kKKwkJCQkJMSk7IAkJCQkJLy8gYldyaXRlCisKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCIgZXhpdCBaRUJSQV9SRlNlcmlhbFdyaXRlXG4gIik7CisJCQl9CisJCQlicmVhazsKKyAgI2VuZGlmCisKKworCQlkZWZhdWx0OgorCQkJRE1FU0dFKCJSRl9Xcml0ZVJlZygpOiBpbnZhbGlkIFJlZ1RocmVlV2lyZU1vZGUoJWQpICEhISIsIHByaXYtPlJlZ1RocmVlV2lyZU1vZGUpOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlETUVTR0UoIlJGX1dyaXRlUmVnKCk6IHVua25vd24gUkZDaGlwSUQ6ICUjWCIsIHByaXYtPnJmX2NoaXApOworCQlicmVhazsKKwl9Cit9CisKKwordm9pZAorWkVCUkFfUkZTZXJpYWxSZWFkKAorCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJdTMyCQlkYXRhMldyaXRlLAorCXU4CQl3TGVuZ3RoLAorCXUzMgkJKmRhdGEyUmVhZCwKKwl1OAkJckxlbmd0aCwKKwl1OAkJbG93MmhpZ2gKKwkpCit7CisJVGhyZWVXaXJlUmVnCXR3cmVnOworCWludAkJCQlpOworCXUxNgkJCW92YWwsb3ZhbDIsb3ZhbDMsdG1wLCB3UmVnODA7CisJdTMyCQkJbWFzazsKKwl1OAkJCXUxYlRtcDsKKwlUaHJlZVdpcmVSZWcJdGRhdGE7CisJLy9QSEFMX0RBVEFfODE4NwlwSGFsRGF0YSA9IEdldEhhbERhdGE4MTg3KHBBZGFwdGVyKTsKKyNpZmRlZiBDT05GSUdfUlRMODE4WF9TCisJeyAvLyBSVEw4MTg3UyBIU1NJIFJlYWQvV3JpdGUgRnVuY3Rpb24KKwkJdTFiVG1wID0gcmVhZF9uaWNfYnl0ZShkZXYsIFJGX1NXX0NPTkZJRyk7CisJCXUxYlRtcCB8PSAgIFJGX1NXX0NGR19TSTsgICAvL3JlZzA4WzFdPTEgU2VyaWFsIEludGVyZmFjZShTSSkKKwkJd3JpdGVfbmljX2J5dGUoZGV2LCBSRl9TV19DT05GSUcsIHUxYlRtcCk7CisJfQorI2VuZGlmCisKKwl3UmVnODAgPSBvdmFsID0gcmVhZF9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCk7CisJb3ZhbDIgPSByZWFkX25pY193b3JkKGRldiwgUkZQaW5zRW5hYmxlKTsKKwlvdmFsMyA9IHJlYWRfbmljX3dvcmQoZGV2LCBSRlBpbnNTZWxlY3QpOworCisJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNFbmFibGUsIG92YWwyfDB4Zik7CisJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNTZWxlY3QsIG92YWwzfDB4Zik7CisKKwkqZGF0YTJSZWFkID0gMDsKKworCS8vIFdlIG11c3QgY2xlYXIgQklUMC0zIGhlcmUsIG90aGVyd2lzZSwKKwkvLyBTV19FbmFsYmUgd2lsbCBiZSB0cnVlIHdoZW4gd2UgZmlyc3QgY2FsbCBaRUJSQV9SRlNlcmlhbFJlYWQoKSBhZnRlciA4MTg3TVBWQyBvcGVuLAorCS8vIHdoaWNoIHdpbGwgY2F1c2UgdGhlIHZhbHVlIHJlYWQgYmVjb21lIDAuIDIwMDUuMDQuMTEsIGJ5IHJjbmprby4KKwlvdmFsICY9IH4weGY7CisKKwkvLyBBdm9pZCBjb2xsaXNpb24gd2l0aCBoYXJkd2FyZSB0aHJlZS13aXJlLgorCXR3cmVnLmxvbmdEYXRhID0gMDsKKwl0d3JlZy5zdHJ1Yy5lbmFibGVCID0gMTsKKwl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCwgdHdyZWcubG9uZ0RhdGF8b3ZhbCk7IHVkZWxheSg0KTsKKworCXR3cmVnLmxvbmdEYXRhID0gMDsKKwl0d3JlZy5zdHJ1Yy5lbmFibGVCID0gMDsKKwl0d3JlZy5zdHJ1Yy5jbGsgPSAwOworCXR3cmVnLnN0cnVjLnJlYWRfd3JpdGUgPSAwOworCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCB0d3JlZy5sb25nRGF0YXxvdmFsKTsgdWRlbGF5KDUpOworCisJbWFzayA9IChsb3cyaGlnaCkgPyAweDAxIDogKCh1MzIpMHgwMTw8KDMyLTEpKTsKKwlmb3IoaSA9IDA7IGkgPCB3TGVuZ3RoLzI7IGkrKykKKwl7CisJCXR3cmVnLnN0cnVjLmRhdGEgPSAoKGRhdGEyV3JpdGUmbWFzaykgIT0gMCkgPyAxIDogMDsKKwkJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQsIHR3cmVnLmxvbmdEYXRhfG92YWwpOyB1ZGVsYXkoMSk7CisJCXR3cmVnLnN0cnVjLmNsayA9IDE7CisJCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCB0d3JlZy5sb25nRGF0YXxvdmFsKTsgdWRlbGF5KDIpOworCQl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCwgdHdyZWcubG9uZ0RhdGF8b3ZhbCk7IHVkZWxheSgyKTsKKworCQltYXNrID0gKGxvdzJoaWdoKSA/IChtYXNrPDwxKTogKG1hc2s+PjEpOworCisJCWlmKGkgPT0gMikKKwkJeworCQkJLy8gQ29tbWVudGVkIG91dCBieSBKYWNraWUsIDIwMDQuMDguMjYuIDxSSl9OT1RFPiBXZSBtdXN0IGNvbW1lbnQgb3V0IHRoZSBmb2xsb3dpbmcgdHdvIGxpbmVzIGZvciB3ZSBjYW5ub3QgcHVsbCBkb3duIFZDT1BETiBkdXJpbmcgUkYgU2VyYWlsIFJlYWQuCisJCQkvL1BsYXRmb3JtRUZJT1dyaXRlMkJ5dGUocEFkYXB0ZXIsIFJGUGluc0VuYWJsZSwgMHhlKTsgICAgIC8vIHR1cm4gb2ZmIGRhdGEgZW5hYmxlCisJCQkvL1BsYXRmb3JtRUZJT1dyaXRlMkJ5dGUocEFkYXB0ZXIsIFJGUGluc1NlbGVjdCwgMHhlKTsKKworCQkJdHdyZWcuc3RydWMucmVhZF93cml0ZT0xOworCQkJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQsIHR3cmVnLmxvbmdEYXRhfG92YWwpOyB1ZGVsYXkoMik7CisJCQl0d3JlZy5zdHJ1Yy5jbGsgPSAwOworCQkJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQsIHR3cmVnLmxvbmdEYXRhfG92YWwpOyB1ZGVsYXkoMik7CisJCQlicmVhazsKKwkJfQorCQl0d3JlZy5zdHJ1Yy5kYXRhID0gKChkYXRhMldyaXRlJm1hc2spICE9IDApID8gMTogMDsKKwkJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQsIHR3cmVnLmxvbmdEYXRhfG92YWwpOyB1ZGVsYXkoMik7CisJCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCB0d3JlZy5sb25nRGF0YXxvdmFsKTsgdWRlbGF5KDIpOworCisJCXR3cmVnLnN0cnVjLmNsayA9IDA7CisJCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCB0d3JlZy5sb25nRGF0YXxvdmFsKTsgdWRlbGF5KDEpOworCisJCW1hc2sgPSAobG93MmhpZ2gpID8gKG1hc2s8PDEpIDogKG1hc2s+PjEpOworCX0KKworCXR3cmVnLnN0cnVjLmNsayA9IDA7CisJdHdyZWcuc3RydWMuZGF0YSA9IDA7CisJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQsIHR3cmVnLmxvbmdEYXRhfG92YWwpOyB1ZGVsYXkoMik7CisJbWFzayA9IChsb3cyaGlnaCkgPyAweDAxIDogKCh1MzIpMHgwMSA8PCAoMTItMSkpOworCisJLy8KKwkvLyAwNjEwMTYsIGJ5IHJjbmprbzoKKwkvLyBXZSBtdXN0IHNldCBkYXRhIHBpbiB0byBIVyBjb250cm9sZWQsIG90aGVyd2lzZSBSRiBjYW4ndCBkcml2ZXIgaXQgYW5kCisJLy8gdmFsdWUgUkYgcmVnaXN0ZXIgd29uJ3QgYmUgYWJsZSB0byByZWFkIGJhY2sgcHJvcGVybHkuCisJLy8KKwl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc0VuYWJsZSwgKCAoKG92YWwyfDB4MEUpICYgKH4weDAxKSkpICk7CisKKwlmb3IoaSA9IDA7IGkgPCByTGVuZ3RoOyBpKyspCisJeworCQl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCwgdHdyZWcubG9uZ0RhdGF8b3ZhbCk7IHVkZWxheSgxKTsKKwkJdHdyZWcuc3RydWMuY2xrID0gMTsKKwkJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQsIHR3cmVnLmxvbmdEYXRhfG92YWwpOyB1ZGVsYXkoMik7CisJCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCB0d3JlZy5sb25nRGF0YXxvdmFsKTsgdWRlbGF5KDIpOworCQl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCwgdHdyZWcubG9uZ0RhdGF8b3ZhbCk7IHVkZWxheSgyKTsKKwkJdG1wID0gcmVhZF9uaWNfd29yZChkZXYsIFJGUGluc0lucHV0KTsKKwkJdGRhdGEubG9uZ0RhdGEgPSB0bXA7CisJCSpkYXRhMlJlYWQgfD0gdGRhdGEuc3RydWMuY2xrID8gbWFzayA6IDA7CisKKwkJdHdyZWcuc3RydWMuY2xrID0gMDsKKwkJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQsIHR3cmVnLmxvbmdEYXRhfG92YWwpOyB1ZGVsYXkoMik7CisKKwkJbWFzayA9IChsb3cyaGlnaCkgPyAobWFzazw8MSkgOiAobWFzaz4+MSk7CisJfQorCXR3cmVnLnN0cnVjLmVuYWJsZUIgPSAxOworCXR3cmVnLnN0cnVjLmNsayA9IDA7CisJdHdyZWcuc3RydWMuZGF0YSA9IDA7CisJdHdyZWcuc3RydWMucmVhZF93cml0ZSA9IDE7CisJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQsIHR3cmVnLmxvbmdEYXRhfG92YWwpOyB1ZGVsYXkoMik7CisKKwkvL1BsYXRmb3JtRUZJT1dyaXRlMkJ5dGUocEFkYXB0ZXIsIFJGUGluc0VuYWJsZSwgb3ZhbDJ8MHg4KTsgICAvLyBTZXQgVG8gT3V0cHV0IEVuYWJsZQorCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zRW5hYmxlLCBvdmFsMik7ICAgLy8gU2V0IFRvIE91dHB1dCBFbmFibGUsIDxSSl9OT1RFPiBXZSBjYW5ub3QgZW5hYmxlIEJJVDMgaGVyZSwgb3RoZXJ3aXNlLCB3ZSB3aWxsIGZhaWxlZCB0byBzd2l0Y2ggY2hhbm5lbC4gMjAwNS4wNC4xMi4KKwkvL1BsYXRmb3JtRUZJT1dyaXRlMkJ5dGUocEFkYXB0ZXIsIFJGUGluc0VuYWJsZSwgMHgxYmZmKTsKKwl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc1NlbGVjdCwgb3ZhbDMpOyAgIC8vIFNldCBUbyBTVyBTd2l0Y2gKKwkvL1BsYXRmb3JtRUZJT1dyaXRlMkJ5dGUocEFkYXB0ZXIsIFJGUGluc1NlbGVjdCwgMHgwNDg4KTsKKwl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCwgMHgzYTApOworCS8vUGxhdGZvcm1FRklPV3JpdGUyQnl0ZShwQWRhcHRlciwgUkZQaW5zT3V0cHV0LCAweDA0ODApOworfQorCisKK3UzMgorUkZfUmVhZFJlZygKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCXU4CQlvZmZzZXQKKwkpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTgwX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOworCXUzMgkJCWRhdGEyV3JpdGU7CisJdTgJCQl3bGVuOworCXU4CQkJcmxlbjsKKwl1OAkJCWxvdzJoaWdoOworCXUzMgkJCWRhdGFSZWFkOworCisJc3dpdGNoKHByaXYtPnJmX2NoaXApCisJeworCWNhc2UgUkZDSElQSURfUlRMODIyNToKKwljYXNlIFJGX1pFQlJBMjoKKwljYXNlIFJGX1pFQlJBNDoKKwkJc3dpdGNoKHByaXYtPlJlZ1RocmVlV2lyZU1vZGUpCisJCXsKKyNpZmRlZiBDT05GSUdfUlRMODE4WF9TCisJCQljYXNlIEhXX1RIUkVFX1dJUkVfUEk6IC8vIEZvciA4N1MgIFBhcmFsbGVsIEludGVyZmFjZS4KKwkJCXsKKwkJCQlkYXRhMldyaXRlID0gKCh1MzIpKG9mZnNldCYweDBmKSk7CisJCQkJd2xlbj0xNjsKKwkJCQlId0hTU0lUaHJlZVdpcmUoCisJCQkJCWRldiwKKwkJCQkJKHU4KikoJmRhdGEyV3JpdGUpLAkvLyBwRGF0YUJ1ZiwKKwkJCQkJd2xlbiwJCQkJCS8vIG5EYXRhQnVmQml0Q250LAorCQkJCQkwLCAJCQkJCS8vIGJTSQorCQkJCQkwKTsgCQkJCQkvLyBiV3JpdGUKKwkJCQlkYXRhUmVhZD0gZGF0YTJXcml0ZTsKKwkJCX0KKwkJCWJyZWFrOworCisJCQljYXNlIEhXX1RIUkVFX1dJUkVfU0k6IC8vIEZvciA4N1MgU2VyaWFsIEludGVyZmFjZS4KKwkJCXsKKwkJCQlkYXRhMldyaXRlID0gKCh1MzIpKG9mZnNldCYweDBmKSkgOworCQkJCXdsZW49MTY7CisJCQkJSHdIU1NJVGhyZWVXaXJlKAorCQkJCQlkZXYsCisJCQkJCSh1OCopKCZkYXRhMldyaXRlKSwJLy8gcERhdGFCdWYsCisJCQkJCXdsZW4sCQkJCQkvLyBuRGF0YUJ1ZkJpdENudCwKKwkJCQkJMSwgCQkJCQkvLyBiU0kKKwkJCQkJMAkJCQkJLy8gYldyaXRlCisJCQkJCSk7CisJCQkJZGF0YVJlYWQ9IGRhdGEyV3JpdGU7CisJCQl9CisJCQlicmVhazsKKworI2VuZGlmCisJCQkvLyBQZXJmb3JtIFNXIDMtd2lyZSBwcm9ncmFtbWluZyBieSBkcml2ZXIuCisJCQlkZWZhdWx0OgorCQkJeworCQkJCWRhdGEyV3JpdGUgPSAoKHUzMikob2Zmc2V0JjB4MWYpKSA8PCAyNzsgLy8gRm9yIFplYnJhIEUtY3V0LiAyMDA1LjA0LjExLCBieSByY25qa28uCisJCQkJd2xlbiA9IDY7CisJCQkJcmxlbiA9IDEyOworCQkJCWxvdzJoaWdoID0gMDsKKwkJCQlaRUJSQV9SRlNlcmlhbFJlYWQoZGV2LCBkYXRhMldyaXRlLCB3bGVuLCZkYXRhUmVhZCxybGVuLCBsb3cyaGlnaCk7CisJCQl9CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlkYXRhUmVhZCA9IDA7CisJCWJyZWFrOworCX0KKworCXJldHVybiBkYXRhUmVhZDsKK30KKworCisvLyBieSBPd2VuIG9uIDA0LzA3LzE0IGZvciB3cml0aW5nIEJCIHJlZ2lzdGVyIHN1Y2Nlc3NmdWxseQordm9pZAorV3JpdGVCQlBvcnRVY2hhcigKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCXUzMgkJRGF0YQorCSkKK3sKKwkvL3U4CVRpbWVvdXRDb3VudGVyOworCXU4CVJlZ2lzdGVyQ29udGVudDsKKwl1OAlVQ2hhckRhdGE7CisKKwlVQ2hhckRhdGEgPSAodTgpKChEYXRhICYgMHgwMDAwZmYwMCkgPj4gOCk7CisJUGxhdGZvcm1JT1dyaXRlNEJ5dGUoZGV2LCBQaHlBZGRyLCBEYXRhKTsKKwkvL2ZvcihUaW1lb3V0Q291bnRlciA9IDEwOyBUaW1lb3V0Q291bnRlciA+IDA7IFRpbWVvdXRDb3VudGVyLS0pCisJeworCQlQbGF0Zm9ybUlPV3JpdGU0Qnl0ZShkZXYsIFBoeUFkZHIsIERhdGEgJiAweGZmZmZmZjdmKTsKKwkJUmVnaXN0ZXJDb250ZW50ID0gUGxhdGZvcm1JT1JlYWQxQnl0ZShkZXYsIFBoeURhdGFSKTsKKwkJLy9pZihVQ2hhckRhdGEgPT0gUmVnaXN0ZXJDb250ZW50KQorCQkvLwlicmVhazsKKwl9Cit9CisKK3U4CitSZWFkQkJQb3J0VWNoYXIoCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwl1MzIJCWFkZHIKKwkpCit7CisJLy91OAlUaW1lb3V0Q291bnRlcjsKKwl1OAlSZWdpc3RlckNvbnRlbnQ7CisKKwlQbGF0Zm9ybUlPV3JpdGU0Qnl0ZShkZXYsIFBoeUFkZHIsIGFkZHIgJiAweGZmZmZmZjdmKTsKKwlSZWdpc3RlckNvbnRlbnQgPSBQbGF0Zm9ybUlPUmVhZDFCeXRlKGRldiwgUGh5RGF0YVIpOworCisJcmV0dXJuIFJlZ2lzdGVyQ29udGVudDsKK30KKy8ve2J5IGFteSAwODAzMTIKKyNpZmRlZiBDT05GSUdfUlRMODE4WF9TCisvLworLy8JRGVzY3JpcHRpb246CisvLwkJUGVyZm9ybSBBbnRlbm5hIHNldHRpbmdzIHdpdGggYW50ZW5uYSBkaXZlcnNpdHkgb24gODdTRS4KKy8vICAgIENyZWF0ZWQgYnkgUm9nZXIsIDIwMDguMDEuMjUuCisvLworYm9vbAorU2V0QW50ZW5uYUNvbmZpZzg3U0UoCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwl1OAkJCURlZmF1bHRBbnQsCQkvLyAwOiBNYWluLCAxOiBBdXguCisJYm9vbAkJYkFudERpdmVyc2l0eSAJLy8gMTpFbmFibGUsIDA6IERpc2FibGUuCispCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTgwX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOworCWJvb2wgICBiQW50ZW5uYVN3aXRjaGVkID0gdHJ1ZTsKKworCS8vcHJpbnRrKCJTZXRBbnRlbm5hQ29uZmlnODdTRSgpOiBEZWZhdWx0QW50KCVkKSwgYkFudERpdmVyc2l0eSglZClcbiIsIERlZmF1bHRBbnQsIGJBbnREaXZlcnNpdHkpOworCisJLy8gVGhyZXNob2xkIGZvciBhbnRlbm5hIGRpdmVyc2l0eS4KKwl3cml0ZV9waHlfY2NrKGRldiwgMHgwYywgMHgwOSk7IC8vIFJlZzBjIDogMDkKKworCWlmKCBiQW50RGl2ZXJzaXR5ICkgIC8vICBFbmFibGUgQW50ZW5uYSBEaXZlcnNpdHkuCisJeworCQlpZiggRGVmYXVsdEFudCA9PSAxICkgIC8vIGF1eCBhbnRlbm5hCisJCXsKKwkJCS8vIE1hYyByZWdpc3RlciwgYXV4IGFudGVubmEKKwkJCXdyaXRlX25pY19ieXRlKGRldiwgQU5UU0VMLCAweDAwKTsKKworCQkJLy8gQ29uZmlnIENDSyBSWCBhbnRlbm5hLgorCQkJd3JpdGVfcGh5X2NjayhkZXYsIDB4MTEsIDB4YmIpOyAvLyBSZWcxMSA6IGJiCisJCQl3cml0ZV9waHlfY2NrKGRldiwgMHgwMSwgMHhjNyk7IC8vIFJlZzAxIDogYzcKKworCQkJLy8gQ29uZmlnIE9GRE0gUlggYW50ZW5uYS4KKwkJCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgwRCwgMHg1NCk7ICAgLy8gUmVnMGQgOiA1NAorCQkJd3JpdGVfcGh5X29mZG0oZGV2LCAweDE4LCAweGIyKTsgIC8vIFJlZzE4IDogYjIKKwkJfQorCQllbHNlIC8vICB1c2UgbWFpbiBhbnRlbm5hCisJCXsKKwkJCS8vIE1hYyByZWdpc3RlciwgbWFpbiBhbnRlbm5hCisJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIEFOVFNFTCwgMHgwMyk7CisJCQkvL2Jhc2UgYmFuZAorCQkJLy8gQ29uZmlnIENDSyBSWCBhbnRlbm5hLgorCQkJd3JpdGVfcGh5X2NjayhkZXYsIDB4MTEsIDB4OWIpOyAvLyBSZWcxMSA6IDliCisJCQl3cml0ZV9waHlfY2NrKGRldiwgMHgwMSwgMHhjNyk7IC8vIFJlZzAxIDogYzcKKworCQkJLy8gQ29uZmlnIE9GRE0gUlggYW50ZW5uYS4KKwkJCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgwZCwgMHg1Yyk7ICAgLy8gUmVnMGQgOiA1YworCQkJd3JpdGVfcGh5X29mZG0oZGV2LCAweDE4LCAweGIyKTsgIC8vIFJlZzE4IDogYjIKKwkJfQorCX0KKwllbHNlICAgLy8gRGlzYWJsZSBBbnRlbm5hIERpdmVyc2l0eS4KKwl7CisJCWlmKCBEZWZhdWx0QW50ID09IDEgKSAvLyBhdXggQW50ZW5uYQorCQl7CisJCQkvLyBNYWMgcmVnaXN0ZXIsIGF1eCBhbnRlbm5hCisJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIEFOVFNFTCwgMHgwMCk7CisKKwkJCS8vIENvbmZpZyBDQ0sgUlggYW50ZW5uYS4KKwkJCXdyaXRlX3BoeV9jY2soZGV2LCAweDExLCAweGJiKTsgLy8gUmVnMTEgOiBiYgorCQkJd3JpdGVfcGh5X2NjayhkZXYsIDB4MDEsIDB4NDcpOyAvLyBSZWcwMSA6IDQ3CisKKwkJCS8vIENvbmZpZyBPRkRNIFJYIGFudGVubmEuCisJCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MEQsIDB4NTQpOyAgIC8vIFJlZzBkIDogNTQKKwkJCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxOCwgMHgzMik7ICAvLyBSZWcxOCA6IDMyCisJCX0KKwkJZWxzZSAvLyBtYWluIEFudGVubmEKKwkJeworCQkJLy8gTWFjIHJlZ2lzdGVyLCBtYWluIGFudGVubmEKKwkJCXdyaXRlX25pY19ieXRlKGRldiwgQU5UU0VMLCAweDAzKTsKKworCQkJLy8gQ29uZmlnIENDSyBSWCBhbnRlbm5hLgorCQkJd3JpdGVfcGh5X2NjayhkZXYsIDB4MTEsIDB4OWIpOyAvLyBSZWcxMSA6IDliCisJCQl3cml0ZV9waHlfY2NrKGRldiwgMHgwMSwgMHg0Nyk7IC8vIFJlZzAxIDogNDcKKworCQkJLy8gQ29uZmlnIE9GRE0gUlggYW50ZW5uYS4KKwkJCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgwRCwgMHg1Yyk7ICAgLy8gUmVnMGQgOiA1YworCQkJd3JpdGVfcGh5X29mZG0oZGV2LCAweDE4LCAweDMyKTsgIC8vIFJlZzE4IDogMzIKKwkJfQorCX0KKwlwcml2LT5DdXJyQW50ZW5uYUluZGV4ID0gRGVmYXVsdEFudDsgLy8gVXBkYXRlIGRlZmF1bHQgc2V0dGluZ3MuCisJcmV0dXJuCWJBbnRlbm5hU3dpdGNoZWQ7Cit9CisjZW5kaWYKKy8vYnkgYW15IDA4MDMxMgorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgKiBIYXJkd2FyZSBJbml0aWFsaXphdGlvbi4KKyAgKiB0aGUgY29kZSBpcyBwb3J0ZWQgZnJvbSBXaW5kb3dzIHNvdXJjZSBjb2RlCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkCitaRUJSQV9Db25maWdfODVCQVNJQ19IYXJkQ29kZSgKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2CisJKQoreworCisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTgwX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOworCXUzMgkJCWk7CisJdTMyCWFkZHIsZGF0YTsKKwl1MzIJdTRiUmVnT2Zmc2V0LCB1NGJSZWdWYWx1ZSwgdTRiUkYyMywgdTRiUkYyNDsKKyAgICAgICB1OAkJCXUxYjI0RTsKKworI2lmZGVmIENPTkZJR19SVEw4MThYX1MKKworCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyA4N1NfUENJRSA6OiBSQURJT0NGRy5UWFQKKwkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKworCS8vIFBhZ2UxIDogcmVnMTYtcmVnMzAKKwlSRl9Xcml0ZVJlZyhkZXYsIDB4MDAsIDB4MDEzZik7CQkJbWRlbGF5KDEpOyAvLyBzd2l0Y2ggdG8gcGFnZTEKKwl1NGJSRjIzPSBSRl9SZWFkUmVnKGRldiwgMHgwOCk7CQkJbWRlbGF5KDEpOworCXU0YlJGMjQ9IFJGX1JlYWRSZWcoZGV2LCAweDA5KTsJCQltZGVsYXkoMSk7CisKKwlpZiAodTRiUkYyMz09MHg4MTggJiYgdTRiUkYyND09MHg3MEMgJiYgcHJpdi0+Y2FyZF84MTg1ID09IFZFUlNJT05fODE4N1NfQykKKwkJcHJpdi0+Y2FyZF84MTg1ID0gVkVSU0lPTl84MTg3U19EOworCisJLy8gUGFnZTAgOiByZWcwLXJlZzE1CisKKy8vCVJGX1dyaXRlUmVnKGRldiwgMHgwMCwgMHgwMDNmKTsJCQltZGVsYXkoMSk7Ly8xCisJUkZfV3JpdGVSZWcoZGV2LCAweDAwLCAweDAwOWYpOyAgICAgIAltZGVsYXkoMSk7Ly8gMQorCisJUkZfV3JpdGVSZWcoZGV2LCAweDAxLCAweDA2ZTApOwkJCW1kZWxheSgxKTsKKworLy8JUkZfV3JpdGVSZWcoZGV2LCAweDAyLCAweDAwNGMpOwkJCW1kZWxheSgxKTsvLzIKKwlSRl9Xcml0ZVJlZyhkZXYsIDB4MDIsIDB4MDA0ZCk7CQkJbWRlbGF5KDEpOy8vIDIKKworLy8JUkZfV3JpdGVSZWcoZGV2LCAweDAzLCAweDAwMDApOwkJCW1kZWxheSgxKTsvLzMKKwlSRl9Xcml0ZVJlZyhkZXYsIDB4MDMsIDB4MDdmMSk7CQkJbWRlbGF5KDEpOy8vIDMKKworCVJGX1dyaXRlUmVnKGRldiwgMHgwNCwgMHgwOTc1KTsJCQltZGVsYXkoMSk7CisJUkZfV3JpdGVSZWcoZGV2LCAweDA1LCAweDBjNzIpOwkJCW1kZWxheSgxKTsKKwlSRl9Xcml0ZVJlZyhkZXYsIDB4MDYsIDB4MGFlNik7CQkJbWRlbGF5KDEpOworCVJGX1dyaXRlUmVnKGRldiwgMHgwNywgMHgwMGNhKTsJCQltZGVsYXkoMSk7CisJUkZfV3JpdGVSZWcoZGV2LCAweDA4LCAweDBlMWMpOwkJCW1kZWxheSgxKTsKKwlSRl9Xcml0ZVJlZyhkZXYsIDB4MDksIDB4MDJmMCk7CQkJbWRlbGF5KDEpOworCVJGX1dyaXRlUmVnKGRldiwgMHgwYSwgMHgwOWQwKTsJCQltZGVsYXkoMSk7CisJUkZfV3JpdGVSZWcoZGV2LCAweDBiLCAweDAxYmEpOwkJCW1kZWxheSgxKTsKKwlSRl9Xcml0ZVJlZyhkZXYsIDB4MGMsIDB4MDY0MCk7CQkJbWRlbGF5KDEpOworCVJGX1dyaXRlUmVnKGRldiwgMHgwZCwgMHgwOGRmKTsJCQltZGVsYXkoMSk7CisJUkZfV3JpdGVSZWcoZGV2LCAweDBlLCAweDAwMjApOwkJCW1kZWxheSgxKTsKKwlSRl9Xcml0ZVJlZyhkZXYsIDB4MGYsIDB4MDk5MCk7CQkJbWRlbGF5KDEpOworCisKKwkvLyBQYWdlMSA6IHJlZzE2LXJlZzMwCisJUkZfV3JpdGVSZWcoZGV2LCAweDAwLCAweDAxM2YpOwkJCW1kZWxheSgxKTsKKworCVJGX1dyaXRlUmVnKGRldiwgMHgwMywgMHgwODA2KTsJCQltZGVsYXkoMSk7CisKKwlpZihwcml2LT5jYXJkXzgxODUgPCBWRVJTSU9OXzgxODdTX0MpCisJeworCQlSRl9Xcml0ZVJlZyhkZXYsIDB4MDQsIDB4MDNmNyk7CQkJbWRlbGF5KDEpOworCQlSRl9Xcml0ZVJlZyhkZXYsIDB4MDUsIDB4MDVhYik7CQkJbWRlbGF5KDEpOworCQlSRl9Xcml0ZVJlZyhkZXYsIDB4MDYsIDB4MDBjMSk7CQkJbWRlbGF5KDEpOworCX0KKwllbHNlCisJeworCQlSRl9Xcml0ZVJlZyhkZXYsIDB4MDQsIDB4MDNhNyk7CQkJbWRlbGF5KDEpOworCQlSRl9Xcml0ZVJlZyhkZXYsIDB4MDUsIDB4MDU5Yik7CQkJbWRlbGF5KDEpOworCQlSRl9Xcml0ZVJlZyhkZXYsIDB4MDYsIDB4MDA4MSk7CQkJbWRlbGF5KDEpOworCX0KKworCisJUkZfV3JpdGVSZWcoZGV2LCAweDA3LCAweDAxQTApOwkJCW1kZWxheSgxKTsKKy8vIERvbid0IHdyaXRlIFJGMjMvUkYyNCB0byBtYWtlIGEgZGlmZmVyZW5jZSBiZXR3ZWVuIDg3UyBDIGN1dCBhbmQgRCBjdXQuIGFza2VkIGJ5IFNEMyBzdGV2ZW5sLgorLy8JUkZfV3JpdGVSZWcoZGV2LCAweDA4LCAweDA1OTcpOwkJCW1kZWxheSgxKTsKKy8vCVJGX1dyaXRlUmVnKGRldiwgMHgwOSwgMHgwNTBhKTsJCQltZGVsYXkoMSk7CisJUkZfV3JpdGVSZWcoZGV2LCAweDBhLCAweDAwMDEpOwkJCW1kZWxheSgxKTsKKwlSRl9Xcml0ZVJlZyhkZXYsIDB4MGIsIDB4MDQxOCk7CQkJbWRlbGF5KDEpOworCisJaWYocHJpdi0+Y2FyZF84MTg1ID09IFZFUlNJT05fODE4N1NfRCkKKwl7CisJCVJGX1dyaXRlUmVnKGRldiwgMHgwYywgMHgwZmJlKTsJCQltZGVsYXkoMSk7CisJCVJGX1dyaXRlUmVnKGRldiwgMHgwZCwgMHgwMDA4KTsJCQltZGVsYXkoMSk7CisJCVJGX1dyaXRlUmVnKGRldiwgMHgwZSwgMHgwODA3KTsJCQltZGVsYXkoMSk7IC8vIFJYIExPIGJ1ZmZlcgorCX0KKwllbHNlCisJeworCQlSRl9Xcml0ZVJlZyhkZXYsIDB4MGMsIDB4MGZiZSk7CQkJbWRlbGF5KDEpOworCQlSRl9Xcml0ZVJlZyhkZXYsIDB4MGQsIDB4MDAwOCk7CQkJbWRlbGF5KDEpOworCQlSRl9Xcml0ZVJlZyhkZXYsIDB4MGUsIDB4MDgwNik7CQkJbWRlbGF5KDEpOyAvLyBSWCBMTyBidWZmZXIKKwl9CisKKwlSRl9Xcml0ZVJlZyhkZXYsIDB4MGYsIDB4MGFjYyk7CQkJbWRlbGF5KDEpOworCisvLwlSRl9Xcml0ZVJlZyhkZXYsIDB4MDAsIDB4MDE3Zik7CQkJbWRlbGF5KDEpOy8vNgorCVJGX1dyaXRlUmVnKGRldiwgMHgwMCwgMHgwMWQ3KTsJCQltZGVsYXkoMSk7Ly8gNgorCisJUkZfV3JpdGVSZWcoZGV2LCAweDAzLCAweDBlMDApOwkJCW1kZWxheSgxKTsKKwlSRl9Xcml0ZVJlZyhkZXYsIDB4MDQsIDB4MGU1MCk7CQkJbWRlbGF5KDEpOworCWZvcihpPTA7aTw9MzY7aSsrKQorCXsKKwkJUkZfV3JpdGVSZWcoZGV2LCAweDAxLCBpKTsgICAgICAgICAgICAgICAgICAgICBtZGVsYXkoMSk7CisJCVJGX1dyaXRlUmVnKGRldiwgMHgwMiwgWkVCUkFfUkZfUlhfR0FJTl9UQUJMRVtpXSk7IG1kZWxheSgxKTsKKwkJLy9EYmdQcmludCgiUkYgLSAweCV4ID0gMHgleCIsIGksIFpFQlJBX1JGX1JYX0dBSU5fVEFCTEVbaV0pOworCX0KKworCVJGX1dyaXRlUmVnKGRldiwgMHgwNSwgMHgwMjAzKTsJCQltZGVsYXkoMSk7IAkvLy8gMjAzLCAzNDMKKwkvL1JGX1dyaXRlUmVnKGRldiwgMHgwNiwgMHgwMzAwKTsJCQltZGVsYXkoMSk7CS8vIDQwMAorCVJGX1dyaXRlUmVnKGRldiwgMHgwNiwgMHgwMjAwKTsJCQltZGVsYXkoMSk7CS8vIDQwMAorCisJUkZfV3JpdGVSZWcoZGV2LCAweDAwLCAweDAxMzcpOwkJCW1kZWxheSgxKTsJLy8gc3dpdGNoIHRvIHJlZzE2LXJlZzMwLCBhbmQgSFNTSSBkaXNhYmxlIDEzNworCW1kZWxheSgxMCk7IAkvLyBEZWF5IDEwIG1zLiAvLzB4ZmQKKworLy8JUkZfV3JpdGVSZWcoZGV2LCAweDBjLCAweDA5YmUpOwkJCW1kZWxheSgxKTsJLy8gNworCS8vUkZfV3JpdGVSZWcoZGV2LCAweDBjLCAweDA3YmUpOwkJCW1kZWxheSgxKTsKKwkvL21kZWxheSgxMCk7IAkvLyBEZWF5IDEwIG1zLiAvLzB4ZmQKKworCVJGX1dyaXRlUmVnKGRldiwgMHgwZCwgMHgwMDA4KTsJCQltZGVsYXkoMSk7CS8vIFo0IHN5bnRoZXNpemVyIGxvb3AgZmlsdGVyIHNldHRpbmcsIDM5MgorCW1kZWxheSgxMCk7IAkvLyBEZWF5IDEwIG1zLiAvLzB4ZmQKKworCVJGX1dyaXRlUmVnKGRldiwgMHgwMCwgMHgwMDM3KTsJCQltZGVsYXkoMSk7CS8vIHN3aXRjaCB0byByZWcwLXJlZzE1LCBhbmQgSFNTSSBkaXNhYmxlCisJbWRlbGF5KDEwKTsgCS8vIERlYXkgMTAgbXMuIC8vMHhmZAorCisJUkZfV3JpdGVSZWcoZGV2LCAweDA0LCAweDAxNjApOwkJCW1kZWxheSgxKTsgCS8vIENCQyBvbiwgVHggUnggZGlzYWJsZSwgSGlnaCBnYWluCisJbWRlbGF5KDEwKTsgCS8vIERlYXkgMTAgbXMuIC8vMHhmZAorCisJUkZfV3JpdGVSZWcoZGV2LCAweDA3LCAweDAwODApOwkJCW1kZWxheSgxKTsJLy8gWjQgc2V0dGVkIGNoYW5uZWwgMQorCW1kZWxheSgxMCk7IAkvLyBEZWF5IDEwIG1zLiAvLzB4ZmQKKworCVJGX1dyaXRlUmVnKGRldiwgMHgwMiwgMHgwODhEKTsJCQltZGVsYXkoMSk7CS8vIExDIGNhbGlicmF0aW9uCisJbWRlbGF5KDIwMCk7IAkvLyBEZWF5IDIwMCBtcy4gLy8weGZkCisJbWRlbGF5KDEwKTsgCS8vIERlYXkgMTAgbXMuIC8vMHhmZAorCW1kZWxheSgxMCk7IAkvLyBEZWF5IDEwIG1zLiAvLzB4ZmQKKworCVJGX1dyaXRlUmVnKGRldiwgMHgwMCwgMHgwMTM3KTsJCQltZGVsYXkoMSk7CS8vIHN3aXRjaCB0byByZWcxNi1yZWczMCAxMzcsIGFuZCBIU1NJIGRpc2FibGUgMTM3CisJbWRlbGF5KDEwKTsgCS8vIERlYXkgMTAgbXMuIC8vMHhmZAorCisJUkZfV3JpdGVSZWcoZGV2LCAweDA3LCAweDAwMDApOwkJCW1kZWxheSgxKTsKKwlSRl9Xcml0ZVJlZyhkZXYsIDB4MDcsIDB4MDE4MCk7CQkJbWRlbGF5KDEpOworCVJGX1dyaXRlUmVnKGRldiwgMHgwNywgMHgwMjIwKTsJCQltZGVsYXkoMSk7CisJUkZfV3JpdGVSZWcoZGV2LCAweDA3LCAweDAzRTApOwkJCW1kZWxheSgxKTsKKworCS8vIERBQyBjYWxpYnJhdGlvbiBvZmYgMjAwNzA3MDIKKwlSRl9Xcml0ZVJlZyhkZXYsIDB4MDYsIDB4MDBjMSk7CQkJbWRlbGF5KDEpOworCVJGX1dyaXRlUmVnKGRldiwgMHgwYSwgMHgwMDAxKTsJCQltZGVsYXkoMSk7CisvL3tieSBhbXkgMDgwMzEyCisJLy8gRm9yIGNyeXN0YWwgY2FsaWJyYXRpb24sIGFkZGVkIGJ5IFJvZ2VyLCAyMDA3LjEyLjExLgorCWlmKCBwcml2LT5iWHRhbENhbGlicmF0aW9uICkgLy8gcmVnIDMwLgorCXsgLy8gZW5hYmxlIGNyeXN0YWwgY2FsaWJyYXRpb24uCisJCS8vIFJGIFJlZ1szMF0sICgxKVhpbjpbMTI6OV0sIFhvdXQ6Wzg6NV0sICBhZGRyWzQ6MF0uCisJCS8vICgyKVBBIFB3ciBkZWxheSB0aW1lclsxNToxNF0sIGRlZmF1bHQ6IDIuNHVzLCBzZXQgQklUMTU9MAorCQkvLyAoMylSRiBzaWduYWwgb24vb2ZmIHdoZW4gY2FsaWJyYXRpb25bMTNdLCBkZWZhdWx0OiBvbiwgc2V0IEJJVDEzPTAuCisJCS8vIFNvIHdlIHNob3VsZCBtaW51cyA0IEJJVHMgb2Zmc2V0LgorCQlSRl9Xcml0ZVJlZyhkZXYsIDB4MGYsIChwcml2LT5YdGFsQ2FsX1hpbjw8NSl8KHByaXYtPlh0YWxDYWxfWG91dDw8MSl8QklUMTF8QklUOSk7CQkJbWRlbGF5KDEpOworCQlwcmludGsoIlpFQlJBX0NvbmZpZ184NUJBU0lDX0hhcmRDb2RlKCk6ICglMDJ4KVxuIiwKKwkJCQkocHJpdi0+WHRhbENhbF9YaW48PDUpIHwgKHByaXYtPlh0YWxDYWxfWG91dDw8MSkgfCBCSVQxMXwgQklUOSk7CisJfQorCWVsc2UKKwl7IC8vIHVzaW5nIGRlZmF1bHQgdmFsdWUuIFhpbj02LCBYb3V0PTYuCisJCVJGX1dyaXRlUmVnKGRldiwgMHgwZiwgMHgwYWNjKTsJCQltZGVsYXkoMSk7CisJfQorLy9ieSBhbXkgMDgwMzEyCisvLwlSRl9Xcml0ZVJlZyhkZXYsIDB4MGYsIDB4MGFjYyk7CQkJbWRlbGF5KDEpOyAgLy8tYnkgYW15IDA4MDMxMgorCisJUkZfV3JpdGVSZWcoZGV2LCAweDAwLCAweDAwYmYpOwkJCW1kZWxheSgxKTsgLy8gc3dpdGNoIHRvIHJlZzAtcmVnMTUsIGFuZCBIU1NJIGVuYWJsZQorLy8JUkZfV3JpdGVSZWcoZGV2LCAweDBkLCAweDAwOWYpOwkJCW1kZWxheSgxKTsgLy8gUnggQkIgc3RhcnQgY2FsaWJyYXRpb24sIDAwYy8vLWVkd2FyZAorCVJGX1dyaXRlUmVnKGRldiwgMHgwZCwgMHgwOGRmKTsJCQltZGVsYXkoMSk7IC8vIFJ4IEJCIHN0YXJ0IGNhbGlicmF0aW9uLCAwMGMvLytlZHdhcmQKKwlSRl9Xcml0ZVJlZyhkZXYsIDB4MDIsIDB4MDA0ZCk7CQkJbWRlbGF5KDEpOyAvLyB0ZW1wZXJhdHVyZSBtZXRlciBvZmYKKwlSRl9Xcml0ZVJlZyhkZXYsIDB4MDQsIDB4MDk3NSk7CQkJbWRlbGF5KDEpOyAvLyBSeCBtb2RlCisJbWRlbGF5KDEwKTsJLy8gRGVheSAxMCBtcy4gLy8weGZlCisJbWRlbGF5KDEwKTsJLy8gRGVheSAxMCBtcy4gLy8weGZlCisJbWRlbGF5KDEwKTsJLy8gRGVheSAxMCBtcy4gLy8weGZlCisJUkZfV3JpdGVSZWcoZGV2LCAweDAwLCAweDAxOTcpOwkJCW1kZWxheSgxKTsgLy8gUnggbW9kZS8vK2Vkd2FyZAorCVJGX1dyaXRlUmVnKGRldiwgMHgwNSwgMHgwNWFiKTsJCQltZGVsYXkoMSk7IC8vIFJ4IG1vZGUvLytlZHdhcmQKKwlSRl9Xcml0ZVJlZyhkZXYsIDB4MDAsIDB4MDA5Zik7CQkJbWRlbGF5KDEpOyAvLyBSeCBtb2RlLy8rZWR3YXJkCisKKyNpZiAwLy8tZWR3YXJkCisJUkZfV3JpdGVSZWcoZGV2LCAweDAwLCAweDAxOTcpOwkJCW1kZWxheSgxKTsKKwlSRl9Xcml0ZVJlZyhkZXYsIDB4MDUsIDB4MDVhYik7CQkJbWRlbGF5KDEpOworCVJGX1dyaXRlUmVnKGRldiwgMHgwMCwgMHgwMDlGKTsJCQltZGVsYXkoMSk7CisjZW5kaWYKKwlSRl9Xcml0ZVJlZyhkZXYsIDB4MDEsIDB4MDAwMCk7CQkJbWRlbGF5KDEpOyAvLyBSeCBtb2RlLy8rZWR3YXJkCisJUkZfV3JpdGVSZWcoZGV2LCAweDAyLCAweDAwMDApOwkJCW1kZWxheSgxKTsgLy8gUnggbW9kZS8vK2Vkd2FyZAorCS8vcG93ZXIgc2F2ZSBwYXJhbWV0ZXJzLgorCXUxYjI0RSA9IHJlYWRfbmljX2J5dGUoZGV2LCAweDI0RSk7CisJd3JpdGVfbmljX2J5dGUoZGV2LCAweDI0RSwgKHUxYjI0RSAmICh+KEJJVDV8QklUNikpKSk7CisKKwkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gQ0NLQ09ORi5UWFQKKwkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKglbUE9XRVIgU0FWRV0gUG93ZXIgU2F2aW5nIFBhcmFtZXRlcnMgYnkgam9uZy4gMjAwNy0xMS0yNworCSAgIAlDQ0sgcmVnMHgwMFs3XT0xJ2IxIDpwb3dlciBzYXZpbmcgZm9yIFRYIChkZWZhdWx0KQorCQlDQ0sgcmVnMHgwMFs2XT0xJ2IxOiBwb3dlciBzYXZpbmcgZm9yIFJYIChkZWZhdWx0KQorCQlDQ0sgcmVnMHgwNls0XT0xJ2IxOiB0dXJuIG9mZiBjaGFubmVsIGVzdGltYXRpb24gcmVsYXRlZCBjaXJjdWl0cyBpZiBub3QgZG9pbmcgY2hhbm5lbCBlc3RpbWF0aW9uLgorCQlDQ0sgcmVnMHgwNlszXT0xJ2IxOiB0dXJuIG9mZiB1bnVzZWQgY2lyY3VpdHMgYmVmb3JlIGNjYSA9IDEKKwkJQ0NLIHJlZzB4MDZbMl09MSdiMTogdHVybiBvZmYgY2NrJ3MgY2lyY3VpdCBpZiBtYWNyc3QgPTAKKwkqLworI2lmIDAKKwl3cml0ZV9uaWNfZHdvcmQoZGV2LCBQSFlfQURSLCAweDAxMDBjODgwKTsKKwl3cml0ZV9uaWNfZHdvcmQoZGV2LCBQSFlfQURSLCAweDAxMDAxYzg2KTsKKwl3cml0ZV9uaWNfZHdvcmQoZGV2LCBQSFlfQURSLCAweDAxMDA3ODkwKTsKKwl3cml0ZV9uaWNfZHdvcmQoZGV2LCBQSFlfQURSLCAweDAxMDBkMGFlKTsKKwl3cml0ZV9uaWNfZHdvcmQoZGV2LCBQSFlfQURSLCAweDAxMDAwNmFmKTsKKwl3cml0ZV9uaWNfZHdvcmQoZGV2LCBQSFlfQURSLCAweDAxMDA0NjgxKTsKKyNlbmRpZgorCXdyaXRlX3BoeV9jY2soZGV2LDB4MDAsMHhjOCk7CisJd3JpdGVfcGh5X2NjayhkZXYsMHgwNiwweDFjKTsKKwl3cml0ZV9waHlfY2NrKGRldiwweDEwLDB4NzgpOworCXdyaXRlX3BoeV9jY2soZGV2LDB4MmUsMHhkMCk7CisJd3JpdGVfcGh5X2NjayhkZXYsMHgyZiwweDA2KTsKKwl3cml0ZV9waHlfY2NrKGRldiwweDAxLDB4NDYpOworCisJLy8gcG93ZXIgY29udHJvbAorCXdyaXRlX25pY19ieXRlKGRldiwgQ0NLX1RYQUdDLCAweDEwKTsKKwl3cml0ZV9uaWNfYnl0ZShkZXYsIE9GRE1fVFhBR0MsIDB4MUIpOworCXdyaXRlX25pY19ieXRlKGRldiwgQU5UU0VMLCAweDAzKTsKKyNlbHNlCisJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIFJBRElPQ0ZHLlRYVAorCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJGX1dyaXRlUmVnKGRldiwgMHgwMCwgMHgwMGI3KTsJCQltZGVsYXkoMSk7CisJUkZfV3JpdGVSZWcoZGV2LCAweDAxLCAweDBlZTApOwkJCW1kZWxheSgxKTsKKwlSRl9Xcml0ZVJlZyhkZXYsIDB4MDIsIDB4MDQ0ZCk7CQkJbWRlbGF5KDEpOworCVJGX1dyaXRlUmVnKGRldiwgMHgwMywgMHgwNDQxKTsJCQltZGVsYXkoMSk7CisJUkZfV3JpdGVSZWcoZGV2LCAweDA0LCAweDA4YzMpOwkJCW1kZWxheSgxKTsKKwlSRl9Xcml0ZVJlZyhkZXYsIDB4MDUsIDB4MGM3Mik7CQkJbWRlbGF5KDEpOworCVJGX1dyaXRlUmVnKGRldiwgMHgwNiwgMHgwMGU2KTsJCQltZGVsYXkoMSk7CisJUkZfV3JpdGVSZWcoZGV2LCAweDA3LCAweDA4MmEpOwkJCW1kZWxheSgxKTsKKwlSRl9Xcml0ZVJlZyhkZXYsIDB4MDgsIDB4MDAzZik7CQkJbWRlbGF5KDEpOworCVJGX1dyaXRlUmVnKGRldiwgMHgwOSwgMHgwMzM1KTsJCQltZGVsYXkoMSk7CisJUkZfV3JpdGVSZWcoZGV2LCAweDBhLCAweDA5ZDQpOwkJCW1kZWxheSgxKTsKKwlSRl9Xcml0ZVJlZyhkZXYsIDB4MGIsIDB4MDdiYik7CQkJbWRlbGF5KDEpOworCVJGX1dyaXRlUmVnKGRldiwgMHgwYywgMHgwODUwKTsJCQltZGVsYXkoMSk7CisJUkZfV3JpdGVSZWcoZGV2LCAweDBkLCAweDBjZGYpOwkJCW1kZWxheSgxKTsKKwlSRl9Xcml0ZVJlZyhkZXYsIDB4MGUsIDB4MDAyYik7CQkJbWRlbGF5KDEpOworCVJGX1dyaXRlUmVnKGRldiwgMHgwZiwgMHgwMTE0KTsJCQltZGVsYXkoMSk7CisKKwlSRl9Xcml0ZVJlZyhkZXYsIDB4MDAsIDB4MDFiNyk7CQkJbWRlbGF5KDEpOworCisKKwlmb3IoaT0xO2k8PTk1O2krKykKKwl7CisJCVJGX1dyaXRlUmVnKGRldiwgMHgwMSwgaSk7CW1kZWxheSgxKTsKKwkJUkZfV3JpdGVSZWcoZGV2LCAweDAyLCBaRUJSQV9SRl9SWF9HQUlOX1RBQkxFW2ldKTsgbWRlbGF5KDEpOworCQkvL0RiZ1ByaW50KCJSRiAtIDB4JXggPSAweCV4IiwgaSwgWkVCUkFfUkZfUlhfR0FJTl9UQUJMRVtpXSk7CisJfQorCisJUkZfV3JpdGVSZWcoZGV2LCAweDAzLCAweDAwODApOwkJCW1kZWxheSgxKTsgCS8vIHdyaXRlIHJlZyAxOAorCVJGX1dyaXRlUmVnKGRldiwgMHgwNSwgMHgwMDA0KTsJCQltZGVsYXkoMSk7CS8vIHdyaXRlIHJlZyAyMAorCVJGX1dyaXRlUmVnKGRldiwgMHgwMCwgMHgwMGI3KTsJCQltZGVsYXkoMSk7CS8vIHN3aXRjaCB0byByZWcwLXJlZzE1CisJLy8weGZkCisJLy8weGZkCisJLy8weGZkCisJUkZfV3JpdGVSZWcoZGV2LCAweDAyLCAweDBjNGQpOwkJCW1kZWxheSgxKTsKKwltZGVsYXkoMTAwKTsJLy8gRGVheSAxMDAgbXMuIC8vMHhmZQorCW1kZWxheSgxMDApOwkvLyBEZWF5IDEwMCBtcy4gLy8weGZlCisJUkZfV3JpdGVSZWcoZGV2LCAweDAyLCAweDA0NGQpOwkJCW1kZWxheSgxKTsKKwlSRl9Xcml0ZVJlZyhkZXYsIDB4MDAsIDB4MDJiZik7CQkJbWRlbGF5KDEpOwkvLzB4MDAyZiBkaXNhYmxlIDZ1cyBjb3JuZXIgY2hhbmdlLCAgMDZmLS0+IGVuYWJsZQorCisJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIENDS0NPTkYuVFhUCisJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIEZvbGxvdyBXTUFDIFJUTDgyMjVfQ29uZmlnKCkKKwkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvLyBwb3dlciBjb250cm9sCisJd3JpdGVfbmljX2J5dGUoZGV2LCBDQ0tfVFhBR0MsIDB4MDMpOworCXdyaXRlX25pY19ieXRlKGRldiwgT0ZETV9UWEFHQywgMHgwNyk7CisJd3JpdGVfbmljX2J5dGUoZGV2LCBBTlRTRUwsIDB4MDMpOworCisJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLy8gT0ZETSBCQlAgc2V0dXAKKy8vCVNldE91dHB1dEVuYWJsZU9mUmZQaW5zKGRldik7Ly9ieSBhbXkKKyNlbmRpZgorCisKKworCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBBR0MudHh0CisJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisvLwlQbGF0Zm9ybUlPV3JpdGU0Qnl0ZSggZGV2LCBQaHlBZGRyLCAweDAwMDAxMjgwKTsJLy8gQW5uaWUsIDIwMDYtMDUtMDUKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MDAsIDB4MTIpOworCS8vV3JpdGVCQlBvcnRVY2hhcihkZXYsIDB4MDAwMDEyODApOworCisJZm9yIChpPTA7IGk8MTI4OyBpKyspCisJeworCQkvL0RiZ1ByaW50KCJBR0MgLSBbJXgrMV0gPSAweCV4XG4iLCBpLCBaRUJSQV9BR0NbaSsxXSk7CisKKwkJZGF0YSA9IFpFQlJBX0FHQ1tpKzFdOworCQlkYXRhID0gZGF0YSA8PCA4OworCQlkYXRhID0gZGF0YSB8IDB4MDAwMDAwOEY7CisKKwkJYWRkciA9IGkgKyAweDgwOyAvL2VuYWJsZSB3cml0aW5nIEFHQyB0YWJsZQorCQlhZGRyID0gYWRkciA8PCA4OworCQlhZGRyID0gYWRkciB8IDB4MDAwMDAwOEU7CisKKwkJV3JpdGVCQlBvcnRVY2hhcihkZXYsIGRhdGEpOworCQlXcml0ZUJCUG9ydFVjaGFyKGRldiwgYWRkcik7CisJCVdyaXRlQkJQb3J0VWNoYXIoZGV2LCAweDAwMDAwMDhFKTsKKwl9CisKKwlQbGF0Zm9ybUlPV3JpdGU0Qnl0ZSggZGV2LCBQaHlBZGRyLCAweDAwMDAxMDgwKTsJLy8gQW5uaWUsIDIwMDYtMDUtMDUKKwkvL1dyaXRlQkJQb3J0VWNoYXIoZGV2LCAweDAwMDAxMDgwKTsKKworCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBPRkRNQ09ORi5UWFQKKwkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlmb3IoaT0wOyBpPDYwOyBpKyspCisJeworCQl1NGJSZWdPZmZzZXQ9aTsKKwkJdTRiUmVnVmFsdWU9T0ZETV9DT05GSUdbaV07CisKKwkJLy9EYmdQcmludCgiT0ZETSAtIDB4JXggPSAweCV4XG4iLCB1NGJSZWdPZmZzZXQsIHU0YlJlZ1ZhbHVlKTsKKworCQlXcml0ZUJCUG9ydFVjaGFyKGRldiwKKwkJCQkJCSgweDAwMDAwMDgwIHwKKwkJCQkJCSh1NGJSZWdPZmZzZXQgJiAweDdmKSB8CisJCQkJCQkoKHU0YlJlZ1ZhbHVlICYgMHhmZikgPDwgOCkpKTsKKwl9CisKKwkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvL2J5IGFteSBmb3IgYW50ZW5uYQorCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8ve2J5IGFteSAwODAzMTIKKyNpZmRlZiBDT05GSUdfUlRMODE4WF9TCisJLy8gQ29uZmlnIFN3L0h3ICBDb21iaW5hdGlvbmFsIEFudGVubmEgRGl2ZXJzaXR5LiBBZGRlZCBieSBSb2dlciwgMjAwOC4wMi4yNi4KKwlTZXRBbnRlbm5hQ29uZmlnODdTRShkZXYsIHByaXYtPmJEZWZhdWx0QW50ZW5uYTEsIHByaXYtPmJTd0FudGVubmFEaXZlcml0eSk7CisjZW5kaWYKKy8vYnkgYW15IDA4MDMxMn0KKyNpZiAwCisJLy8gQ29uZmlnIFN3L0h3ICBBbnRlbm5hIERpdmVyc2l0eQorCWlmKCBwcml2LT5iU3dBbnRlbm5hRGl2ZXJpdHkgKSAgLy8gIFVzZSBTVytIdyBBbnRlbm5hIERpdmVyc2l0eQorCXsKKwkJaWYoIHByaXYtPmJEZWZhdWx0QW50ZW5uYTEgPT0gdHJ1ZSApICAvLyBhdXggYW50ZW5uYQorCQl7CisJCQkvLyBNYWMgcmVnaXN0ZXIsIGF1eCBhbnRlbm5hCisJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIEFOVFNFTCwgMHgwMCk7CisJCQkvLyBDb25maWcgQ0NLIFJYIGFudGVubmEuCisJCQl3cml0ZV9waHlfY2NrKGRldiwgMHgxMSwgMHhiYik7IC8vIFJlZzExIDogYmIKKwkJCXdyaXRlX3BoeV9jY2soZGV2LCAweDBjLCAweDA5KTsgLy8gUmVnMGMgOiAwOQorCQkJd3JpdGVfcGh5X2NjayhkZXYsIDB4MDEsIDB4YzcpOyAvLyBSZWcwMSA6IGM3CisJCQkvLyBDb25maWcgT0ZETSBSWCBhbnRlbm5hLgorCQkJd3JpdGVfcGh5X29mZG0oZGV2LCAweDBkLCAweDU0KTsgICAvLyBSZWcwZCA6IDU0CisJCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MTgsIDB4YjIpOyAgLy8gUmVnMTggOiBiMgorCQl9CisJCWVsc2UgLy8gIG1haW4gYW50ZW5uYQorCQl7CisJCQkvLyBNYWMgcmVnaXN0ZXIsIG1haW4gYW50ZW5uYQorCQkJd3JpdGVfbmljX2J5dGUoZGV2LCBBTlRTRUwsIDB4MDMpOworCQkJLy9iYXNlIGJhbmQKKwkJCS8vIENvbmZpZyBDQ0sgUlggYW50ZW5uYS4KKwkJCXdyaXRlX3BoeV9jY2soZGV2LCAweDExLCAweDliKTsgLy8gUmVnMTEgOiA5YgorCQkJd3JpdGVfcGh5X2NjayhkZXYsIDB4MGMsIDB4MDkpOyAvLyBSZWcwYyA6IDA5CisJCQl3cml0ZV9waHlfY2NrKGRldiwgMHgwMSwgMHhjNyk7IC8vIFJlZzAxIDogYzcKKwkJCS8vIENvbmZpZyBPRkRNIFJYIGFudGVubmEuCisJCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MGQsIDB4NWMpOyAgIC8vIFJlZzBkIDogNWMKKwkJCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxOCwgMHhiMik7ICAvLyBSZWcxOCA6IGIyCisJCX0KKwl9CisJZWxzZSAgIC8vIERpc2FibGUgQW50ZW5uYSBEaXZlcnNpdHkKKwl7CisJCWlmKCBwcml2LT5iRGVmYXVsdEFudGVubmExID09IHRydWUgKSAvLyBhdXggQW50ZW5uYQorCQl7CisJCQkvLyBNYWMgcmVnaXN0ZXIsIGF1eCBhbnRlbm5hCisJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIEFOVFNFTCwgMHgwMCk7CisJCQkvLyBDb25maWcgQ0NLIFJYIGFudGVubmEuCisJCQl3cml0ZV9waHlfY2NrKGRldiwgMHgxMSwgMHhiYik7IC8vIFJlZzExIDogYmIKKwkJCXdyaXRlX3BoeV9jY2soZGV2LCAweDBjLCAweDA5KTsgLy8gUmVnMGMgOiAwOQorCQkJd3JpdGVfcGh5X2NjayhkZXYsIDB4MDEsIDB4NDcpOyAvLyBSZWcwMSA6IDQ3CisJCQkvLyBDb25maWcgT0ZETSBSWCBhbnRlbm5hLgorCQkJd3JpdGVfcGh5X29mZG0oZGV2LCAweDBkLCAweDU0KTsgICAvLyBSZWcwZCA6IDU0CisJCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MTgsIDB4MzIpOyAgLy8gUmVnMTggOiAzMgorCQl9CisJCWVsc2UgLy8gbWFpbiBBbnRlbm5hCisJCXsKKwkJCS8vIE1hYyByZWdpc3RlciwgbWFpbiBhbnRlbm5hCisJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIEFOVFNFTCwgMHgwMyk7CisJCQkvLyBDb25maWcgQ0NLIFJYIGFudGVubmEuCisJCQl3cml0ZV9waHlfY2NrKGRldiwgMHgxMSwgMHg5Yik7IC8vIFJlZzExIDogOWIKKwkJCXdyaXRlX3BoeV9jY2soZGV2LCAweDBjLCAweDA5KTsgLy8gUmVnMGMgOiAwOQorCQkJd3JpdGVfcGh5X2NjayhkZXYsIDB4MDEsIDB4NDcpOyAvLyBSZWcwMSA6IDQ3CisJCQkvLyBDb25maWcgT0ZETSBSWCBhbnRlbm5hLgorCQkJd3JpdGVfcGh5X29mZG0oZGV2LCAweDBkLCAweDVjKTsgICAvLyBSZWcwZCA6IDVjCisJCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MTgsIDB4MzIpOyAgLy8gUmVnMTggOiAzMgorCQl9CisJfQorI2VuZGlmCisvL2J5IGFteSBmb3IgYW50ZW5uYQorfQorCisKK3ZvaWQKK1VwZGF0ZUluaXRpYWxHYWluKAorCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYKKwkpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTgwX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOworCS8vdW5zaWduZWQgY2hhciogSUdUYWJsZTsKKwkvL3U4CQkJRElHX0N1cnJlbnRJbml0aWFsR2FpbiA9IDQ7CisJLy91bnNpZ25lZCBjaGFyIHUxVG1wOworCisJLy9sem0gYWRkIDA4MDgyNgorCWlmKHByaXYtPmVSRlBvd2VyU3RhdGUgIT0gZVJmT24pCisJeworCQkvL0Rvbid0IGFjY2VzcyBCQi9SRiB1bmRlciBkaXNhYmxlIFBMTCBzaXR1YXRpb24uCisJCS8vUlRfVFJBQ0UoQ09NUF9ESUcsIERCR19MT1VELCAoIlVwZGF0ZUluaXRpYWxHYWluIC0gcEhhbERhdGEtPmVSRlBvd2VyU3RhdGUhPWVSZk9uXG4iKSk7CisJCS8vIEJhY2sgdG8gdGhlIG9yaWdpbmFsIHN0YXRlCisJCXByaXYtPkluaXRpYWxHYWluPSBwcml2LT5Jbml0aWFsR2FpbkJhY2tVcDsKKwkJcmV0dXJuOworCX0KKworCXN3aXRjaChwcml2LT5yZl9jaGlwKQorCXsKKyNpZiAwCisJY2FzZSBSRl9aRUJSQTI6CisJCS8vIER5bmFtaWMgc2V0IGluaXRpYWwgZ2FpbiwgYnkgc2hpZW4gY2hhbmcsIDIwMDYuMDcuMTQKKwkJc3dpdGNoKHByaXYtPkluaXRpYWxHYWluKQorCQl7CisJCQljYXNlIDE6IC8vbTg2MWRCbQorCQkJCURNRVNHKCJSVEw4MTg1QiArIDgyMjUgSW5pdGlhbCBHYWluIFN0YXRlIDE6IC04MiBkQm0gXG4iKTsKKwkJCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBQaHlBZGRyLCAweDI2OTcpOwltZGVsYXkoMSk7CisJCQkJd3JpdGVfbmljX2R3b3JkKGRldiwgUGh5QWRkciwgMHg4NmE0KTsJbWRlbGF5KDEpOworCQkJCXdyaXRlX25pY19kd29yZChkZXYsIFBoeUFkZHIsIDB4ZmE4NSk7CW1kZWxheSgxKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSAyOiAvL204NjJkQm0KKwkJCQlETUVTRygiUlRMODE4NUIgKyA4MjI1IEluaXRpYWwgR2FpbiBTdGF0ZSAyOiAtODIgZEJtIFxuIik7CisJCQkJd3JpdGVfbmljX2R3b3JkKGRldiwgUGh5QWRkciwgMHgyNjk3KTsJbWRlbGF5KDEpOworCQkJCXdyaXRlX25pY19kd29yZChkZXYsIFBoeUFkZHIsIDB4ODZhNCk7CW1kZWxheSgxKTsKKwkJCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBQaHlBZGRyLCAweGZiODUpOwltZGVsYXkoMSk7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgMzogLy9tODYzZEJtCisJCQkJRE1FU0coIlJUTDgxODVCICsgODIyNSBJbml0aWFsIEdhaW4gU3RhdGUgMzogLTgyIGRCbSBcbiIpOworCQkJCXdyaXRlX25pY19kd29yZChkZXYsIFBoeUFkZHIsIDB4MjY5Nyk7CW1kZWxheSgxKTsKKwkJCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBQaHlBZGRyLCAweDk2YTQpOwltZGVsYXkoMSk7CisJCQkJd3JpdGVfbmljX2R3b3JkKGRldiwgUGh5QWRkciwgMHhmYjg1KTsJbWRlbGF5KDEpOworCQkJCWJyZWFrOworCisJCQljYXNlIDQ6IC8vbTg2NGRCbQorCQkJCURNRVNHKCJSVEw4MTg1QiArIDgyMjUgSW5pdGlhbCBHYWluIFN0YXRlIDQ6IC03OCBkQm0gXG4iKTsKKwkJCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBQaHlBZGRyLCAweDI2OTcpOwltZGVsYXkoMSk7CisJCQkJd3JpdGVfbmljX2R3b3JkKGRldiwgUGh5QWRkciwgMHhhNmE0KTsJbWRlbGF5KDEpOworCQkJCXdyaXRlX25pY19kd29yZChkZXYsIFBoeUFkZHIsIDB4ZmI4NSk7CW1kZWxheSgxKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSA1OiAvL204MmRCbQorCQkJCURNRVNHKCJSVEw4MTg1QiArIDgyMjUgSW5pdGlhbCBHYWluIFN0YXRlIDU6IC03NCBkQm0gXG4iKTsKKwkJCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBQaHlBZGRyLCAweDM2OTcpOwltZGVsYXkoMSk7CisJCQkJd3JpdGVfbmljX2R3b3JkKGRldiwgUGh5QWRkciwgMHhhNmE0KTsJbWRlbGF5KDEpOworCQkJCXdyaXRlX25pY19kd29yZChkZXYsIFBoeUFkZHIsIDB4ZmI4NSk7CW1kZWxheSgxKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSA2OiAvL203OGRCbQorCQkJCURNRVNHKCJSVEw4MTg1QiArIDgyMjUgSW5pdGlhbCBHYWluIFN0YXRlIDY6IC03MCBkQm0gXG4iKTsKKwkJCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBQaHlBZGRyLCAweDQ2OTcpOwltZGVsYXkoMSk7CisJCQkJd3JpdGVfbmljX2R3b3JkKGRldiwgUGh5QWRkciwgMHhhNmE0KTsJbWRlbGF5KDEpOworCQkJCXdyaXRlX25pY19kd29yZChkZXYsIFBoeUFkZHIsIDB4ZmI4NSk7CW1kZWxheSgxKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSA3OiAvL203NGRCbQorCQkJCURNRVNHKCJSVEw4MTg1QiArIDgyMjUgSW5pdGlhbCBHYWluIFN0YXRlIDc6IC02NiBkQm0gXG4iKTsKKwkJCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBQaHlBZGRyLCAweDU2OTcpOwltZGVsYXkoMSk7CisJCQkJd3JpdGVfbmljX2R3b3JkKGRldiwgUGh5QWRkciwgMHhhNmE0KTsJbWRlbGF5KDEpOworCQkJCXdyaXRlX25pY19kd29yZChkZXYsIFBoeUFkZHIsIDB4ZmI4NSk7CW1kZWxheSgxKTsKKwkJCQlicmVhazsKKworCQkJZGVmYXVsdDoJLy9NUAorCQkJCURNRVNHKCJSVEw4MTg1QiArIDgyMjUgSW5pdGlhbCBHYWluIFN0YXRlIDE6IC04MiBkQm0gKGRlZmF1bHQpXG4iKTsKKwkJCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBQaHlBZGRyLCAweDI2OTcpOwltZGVsYXkoMSk7CisJCQkJd3JpdGVfbmljX2R3b3JkKGRldiwgUGh5QWRkciwgMHg4NmE0KTsJbWRlbGF5KDEpOworCQkJCXdyaXRlX25pY19kd29yZChkZXYsIFBoeUFkZHIsIDB4ZmE4NSk7CW1kZWxheSgxKTsKKwkJCQlicmVhazsKKwkJfQorCQlicmVhazsKKyNlbmRpZgorCWNhc2UgUkZfWkVCUkE0OgorCQkvLyBEeW5hbWljIHNldCBpbml0aWFsIGdhaW4sIGZvbGxvdyA4N0IKKwkJc3dpdGNoKHByaXYtPkluaXRpYWxHYWluKQorCQl7CisJCQljYXNlIDE6IC8vbTg2MWRCbQorCQkJCS8vRE1FU0coIlJUTDgxODcgKyA4MjI1IEluaXRpYWwgR2FpbiBTdGF0ZSAxOiAtODIgZEJtIFxuIik7CisJCQkJd3JpdGVfcGh5X29mZG0oZGV2LCAweDE3LCAweDI2KTsJbWRlbGF5KDEpOworCQkJCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgyNCwgMHg4Nik7CW1kZWxheSgxKTsKKwkJCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MDUsIDB4ZmEpOwltZGVsYXkoMSk7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgMjogLy9tODYyZEJtCisJCQkJLy9ETUVTRygiUlRMODE4NyArIDgyMjUgSW5pdGlhbCBHYWluIFN0YXRlIDI6IC04MiBkQm0gXG4iKTsKKwkJCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MTcsIDB4MzYpOwltZGVsYXkoMSk7CisJCQkJd3JpdGVfcGh5X29mZG0oZGV2LCAweDI0LCAweDg2KTsJbWRlbGF5KDEpOworCQkJCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgwNSwgMHhmYSk7CW1kZWxheSgxKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSAzOiAvL204NjNkQm0KKwkJCQkvL0RNRVNHKCJSVEw4MTg3ICsgODIyNSBJbml0aWFsIEdhaW4gU3RhdGUgMzogLTgyIGRCbSBcbiIpOworCQkJCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxNywgMHgzNik7CW1kZWxheSgxKTsKKwkJCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MjQsIDB4ODYpOwltZGVsYXkoMSk7CisJCQkJd3JpdGVfcGh5X29mZG0oZGV2LCAweDA1LCAweGZiKTsJbWRlbGF5KDEpOworCQkJCWJyZWFrOworCisJCQljYXNlIDQ6IC8vbTg2NGRCbQorCQkJCS8vRE1FU0coIlJUTDgxODcgKyA4MjI1IEluaXRpYWwgR2FpbiBTdGF0ZSA0OiAtNzggZEJtIFxuIik7CisJCQkJd3JpdGVfcGh5X29mZG0oZGV2LCAweDE3LCAweDQ2KTsJbWRlbGF5KDEpOworCQkJCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgyNCwgMHg4Nik7CW1kZWxheSgxKTsKKwkJCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MDUsIDB4ZmIpOwltZGVsYXkoMSk7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgNTogLy9tODJkQm0KKwkJCQkvL0RNRVNHKCJSVEw4MTg3ICsgODIyNSBJbml0aWFsIEdhaW4gU3RhdGUgNTogLTc0IGRCbSBcbiIpOworCQkJCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxNywgMHg0Nik7CW1kZWxheSgxKTsKKwkJCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MjQsIDB4OTYpOwltZGVsYXkoMSk7CisJCQkJd3JpdGVfcGh5X29mZG0oZGV2LCAweDA1LCAweGZiKTsJbWRlbGF5KDEpOworCQkJCWJyZWFrOworCisJCQljYXNlIDY6IC8vbTc4ZEJtCisJCQkJLy9ETUVTRyAoIlJUTDgxODcgKyA4MjI1IEluaXRpYWwgR2FpbiBTdGF0ZSA2OiAtNzAgZEJtIFxuIik7CisJCQkJd3JpdGVfcGh5X29mZG0oZGV2LCAweDE3LCAweDU2KTsJbWRlbGF5KDEpOworCQkJCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgyNCwgMHg5Nik7CW1kZWxheSgxKTsKKwkJCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MDUsIDB4ZmMpOwltZGVsYXkoMSk7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgNzogLy9tNzRkQm0KKwkJCQkvL0RNRVNHKCJSVEw4MTg3ICsgODIyNSBJbml0aWFsIEdhaW4gU3RhdGUgNzogLTY2IGRCbSBcbiIpOworCQkJCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxNywgMHg1Nik7CW1kZWxheSgxKTsKKwkJCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MjQsIDB4YTYpOwltZGVsYXkoMSk7CisJCQkJd3JpdGVfcGh5X29mZG0oZGV2LCAweDA1LCAweGZjKTsJbWRlbGF5KDEpOworCQkJCWJyZWFrOworCisJCQljYXNlIDg6CisJCQkJLy9ETUVTRygiUlRMODE4NyArIDgyMjUgSW5pdGlhbCBHYWluIFN0YXRlIDg6XG4iKTsKKwkJCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MTcsIDB4NjYpOwltZGVsYXkoMSk7CisJCQkJd3JpdGVfcGh5X29mZG0oZGV2LCAweDI0LCAweGI2KTsJbWRlbGF5KDEpOworCQkJCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgwNSwgMHhmYyk7CW1kZWxheSgxKTsKKwkJCQlicmVhazsKKworCisJCQlkZWZhdWx0OgkvL01QCisJCQkJLy9ETUVTRygiUlRMODE4NyArIDgyMjUgSW5pdGlhbCBHYWluIFN0YXRlIDE6IC04MiBkQm0gKGRlZmF1bHQpXG4iKTsKKwkJCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MTcsIDB4MjYpOwltZGVsYXkoMSk7CisJCQkJd3JpdGVfcGh5X29mZG0oZGV2LCAweDI0LCAweDg2KTsJbWRlbGF5KDEpOworCQkJCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgwNSwgMHhmYSk7CW1kZWxheSgxKTsKKwkJCQlicmVhazsKKwkJfQorCQlicmVhazsKKworCisJZGVmYXVsdDoKKwkJRE1FU0coIlVwZGF0ZUluaXRpYWxHYWluKCk6IHVua25vd24gUkZDaGlwSUQ6ICUjWFxuIiwgcHJpdi0+cmZfY2hpcCk7CisJCWJyZWFrOworCX0KK30KKyNpZmRlZiBDT05GSUdfUlRMODE4WF9TCisvLworLy8JRGVzY3JpcHRpb246CisvLwkJVHggUG93ZXIgdHJhY2tpbmcgbWVjaGFuaXNtIHJvdXRpbmUgb24gODdTRS4KKy8vIAlDcmVhdGVkIGJ5IFJvZ2VyLCAyMDA3LjEyLjExLgorLy8KK3ZvaWQKK0luaXRUeFB3clRyYWNraW5nODdTRSgKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2CispCit7CisJLy9zdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxODBfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CisJdTMyCXU0YlJmUmVnOworCisJdTRiUmZSZWcgPSBSRl9SZWFkUmVnKGRldiwgMHgwMik7CisKKwkvLyBFbmFibGUgVGhlcm1hbCBtZXRlciBpbmRpY2F0aW9uLgorCS8vcHJpbnRrKCJJbml0VHhQd3JUcmFja2luZzg3U0UoKTogRW5hYmxlIHRoZXJtYWwgbWV0ZXIgaW5kaWNhdGlvbiwgV3JpdGUgUkZbMHgwMl0gPSAlI3giLCB1NGJSZlJlZ3xQV1JfTUVURVJfRU4pOworCVJGX1dyaXRlUmVnKGRldiwgMHgwMiwgdTRiUmZSZWd8UFdSX01FVEVSX0VOKTsJCQltZGVsYXkoMSk7Cit9CisKKyNlbmRpZgordm9pZAorUGh5Q29uZmlnODE4NSgKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2CisJKQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gKHN0cnVjdCByODE4MF9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsKKyAgICAgICB3cml0ZV9uaWNfZHdvcmQoZGV2LCBSQ1IsIHByaXYtPlJlY2VpdmVDb25maWcpOworCSAgIHByaXYtPlJGUHJvZ1R5cGUgPSByZWFkX25pY19ieXRlKGRldiwgQ09ORklHNCkgJiAweDAzOworICAgICAJLy8gUkYgY29uZmlnCisJc3dpdGNoKHByaXYtPnJmX2NoaXApCisJeworCWNhc2UgUkZfWkVCUkEyOgorCWNhc2UgUkZfWkVCUkE0OgorCQlaRUJSQV9Db25maWdfODVCQVNJQ19IYXJkQ29kZSggZGV2KTsKKwkJYnJlYWs7CisJfQorLy97YnkgYW15IDA4MDMxMgorI2lmZGVmIENPTkZJR19SVEw4MThYX1MKKwkvLyBTZXQgZGVmYXVsdCBpbml0aWFsIGdhaW4gc3RhdGUgdG8gNCwgYXBwcm92ZWQgYnkgU0QzIERaLCBieSBCcnVjZSwgMjAwNy0wNi0wNi4KKwlpZihwcml2LT5iRGlnTWVjaGFuaXNtKQorCXsKKwkJaWYocHJpdi0+SW5pdGlhbEdhaW4gPT0gMCkKKwkJCXByaXYtPkluaXRpYWxHYWluID0gNDsKKwkJLy9wcmludGsoIlBoeUNvbmZpZzgxODUoKTogRElHIGlzIGVuYWJsZWQsIHNldCBkZWZhdWx0IGluaXRpYWwgZ2FpbiBpbmRleCB0byAlZFxuIiwgcHJpdi0+SW5pdGlhbEdhaW4pOworCX0KKworCS8vCisJLy8gRW5hYmxlIHRoZXJtYWwgbWV0ZXIgaW5kaWNhdGlvbiB0byBpbXBsZW1lbnQgVHhQb3dlciB0cmFja2luZyBvbiA4N1NFLgorCS8vIFdlIGluaXRpYWxpemUgdGhlcm1hbCBtZXRlciBoZXJlIHRvIGF2b2lkIHVuc3VjY2Vzc2Z1bCBjb25maWd1cmF0aW9uLgorCS8vIEFkZGVkIGJ5IFJvZ2VyLCAyMDA3LjEyLjExLgorCS8vCisJaWYocHJpdi0+YlR4UG93ZXJUcmFjaykKKwkJSW5pdFR4UHdyVHJhY2tpbmc4N1NFKGRldik7CisKKyNlbmRpZgorLy9ieSBhbXkgMDgwMzEyfQorCXByaXYtPkluaXRpYWxHYWluQmFja1VwPSBwcml2LT5Jbml0aWFsR2FpbjsKKwlVcGRhdGVJbml0aWFsR2FpbihkZXYpOworCisJcmV0dXJuOworfQorCisKKworCit2b2lkCitId0NvbmZpZ3VyZVJUTDgxODUoCisJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYKKwkJKQoreworCS8vUlRMODE4NV9UT0RPOiBEZXRlcm1pbmUgUmV0cnlsaW1pdCwgVHhBR0MsIEF1dG9SYXRlRmFsbGJhY2sgY29udHJvbC4KKy8vCXU4CQliVU5JVkVSU0FMX0NPTlRST0xfUkwgPSAxOworICAgICAgICB1OCAgICAgICAgICAgICAgYlVOSVZFUlNBTF9DT05UUk9MX1JMID0gMDsKKworCXU4CQliVU5JVkVSU0FMX0NPTlRST0xfQUdDID0gMTsKKwl1OAkJYlVOSVZFUlNBTF9DT05UUk9MX0FOVCA9IDE7CisJdTgJCWJBVVRPX1JBVEVfRkFMTEJBQ0tfQ1RMID0gMTsKKwl1OAkJdmFsODsKKwkvL3N0cnVjdCByODE4MF9wcml2ICpwcml2ID0gKHN0cnVjdCByODE4MF9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsKKwkvL3N0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlID0gcHJpdi0+aWVlZTgwMjExOworICAgICAgCS8vaWYoSVNfV0lSRUxFU1NfTU9ERV9BKGRldikgfHwgSVNfV0lSRUxFU1NfTU9ERV9HKGRldikpCisvL3tieSBhbXkgMDgwMzEyCWlmKChpZWVlLT5tb2RlID09IElFRUVfRyl8fChpZWVlLT5tb2RlID09IElFRUVfQSkpCisvLwl7CisvLwkJd3JpdGVfbmljX3dvcmQoZGV2LCBCUlNSLCAweGZmZmYpOworLy8JfQorLy8JZWxzZQorLy8JeworLy8JCXdyaXRlX25pY193b3JkKGRldiwgQlJTUiwgMHgwMDBmKTsKKy8vCX0KKy8vYnkgYW15IDA4MDMxMn0KKyAgICAgICAgd3JpdGVfbmljX3dvcmQoZGV2LCBCUlNSLCAweDBmZmYpOworCS8vIFJldHJ5IGxpbWl0CisJdmFsOCA9IHJlYWRfbmljX2J5dGUoZGV2LCBDV19DT05GKTsKKworCWlmKGJVTklWRVJTQUxfQ09OVFJPTF9STCkKKwkJdmFsOCA9IHZhbDggJiAweGZkOworCWVsc2UKKwkJdmFsOCA9IHZhbDggfCAweDAyOworCisJd3JpdGVfbmljX2J5dGUoZGV2LCBDV19DT05GLCB2YWw4KTsKKworCS8vIFR4IEFHQworCXZhbDggPSByZWFkX25pY19ieXRlKGRldiwgVFhBR0NfQ1RMKTsKKwlpZihiVU5JVkVSU0FMX0NPTlRST0xfQUdDKQorCXsKKwkJd3JpdGVfbmljX2J5dGUoZGV2LCBDQ0tfVFhBR0MsIDEyOCk7CisJCXdyaXRlX25pY19ieXRlKGRldiwgT0ZETV9UWEFHQywgMTI4KTsKKwkJdmFsOCA9IHZhbDggJiAweGZlOworCX0KKwllbHNlCisJeworCQl2YWw4ID0gdmFsOCB8IDB4MDEgOworCX0KKworCisJd3JpdGVfbmljX2J5dGUoZGV2LCBUWEFHQ19DVEwsIHZhbDgpOworCisJLy8gVHggQW50ZW5uYSBpbmNsdWRpbmcgRmVlZGJhY2sgY29udHJvbAorCXZhbDggPSByZWFkX25pY19ieXRlKGRldiwgVFhBR0NfQ1RMICk7CisKKwlpZihiVU5JVkVSU0FMX0NPTlRST0xfQU5UKQorCXsKKwkJd3JpdGVfbmljX2J5dGUoZGV2LCBBTlRTRUwsIDB4MDApOworCQl2YWw4ID0gdmFsOCAmIDB4ZmQ7CisJfQorCWVsc2UKKwl7CisJCXZhbDggPSB2YWw4ICYgKHZhbDh8MHgwMik7IC8veGlvbmctMjAwNi0xMS0xNQorCX0KKworCXdyaXRlX25pY19ieXRlKGRldiwgVFhBR0NfQ1RMLCB2YWw4KTsKKworCS8vIEF1dG8gUmF0ZSBmYWxsYmFjayBjb250cm9sCisJdmFsOCA9IHJlYWRfbmljX2J5dGUoZGV2LCBSQVRFX0ZBTExCQUNLKTsKKwl2YWw4ICY9IDB4N2M7CisJaWYoIGJBVVRPX1JBVEVfRkFMTEJBQ0tfQ1RMICkKKwl7CisJCXZhbDggfD0gUkFURV9GQUxMQkFDS19DVExfRU5BQkxFIHwgUkFURV9GQUxMQkFDS19DVExfQVVUT19TVEVQMTsKKworCQkvLyA8UkpfVE9ET184MTg1Qj4gV2Ugc2hhbGwgc2V0IHVwIHRoZSBBUkZSIGFjY29yZGluZyB0byB1c2VyJ3Mgc2V0dGluZy4KKwkJLy93cml0ZV9uaWNfd29yZChkZXYsIEFSRlIsIDB4MGZmZik7IC8vIHNldCAxTSB+IDU0TQorLy9ieSBhbXkKKyNpZiAwCisJCVBsYXRmb3JtSU9Xcml0ZTJCeXRlKGRldiwgQVJGUiwgMHgwZmZmKTsgCS8vIHNldCAxTSB+IDU0TQorI2VuZGlmCisjaWZkZWYgQ09ORklHX1JUTDgxOFhfUworCSAgICAgICAgLy8gQWFkZGVkIGJ5IFJvZ2VyLCAyMDA3LjExLjE1LgorCSAgICAgICAgUGxhdGZvcm1JT1dyaXRlMkJ5dGUoZGV2LCBBUkZSLCAweDBmZmYpOyAvL3NldCAxTSB+IDU0TWJwcy4KKyNlbHNlCisJCVBsYXRmb3JtSU9Xcml0ZTJCeXRlKGRldiwgQVJGUiwgMHgwYzAwKTsgLy9zZXQgNDhNYnBzLCA1NE1icHMuCisgICAgICAgICAgICAgICAgLy8gQnkgU0QzIHN6dXlpJ3MgcmVxdWVzdC4gYnkgUm9nZXIsIDIwMDcuMDMuMjYuCisjZW5kaWYKKy8vYnkgYW15CisJfQorCWVsc2UKKwl7CisJfQorCXdyaXRlX25pY19ieXRlKGRldiwgUkFURV9GQUxMQkFDSywgdmFsOCk7Cit9CisKKworCitzdGF0aWMgdm9pZAorTWFjQ29uZmlnXzg1QkFTSUNfSGFyZENvZGUoCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBNQUNSRUcuVFhUCisJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJaW50CQkJbkxpbmVzUmVhZCA9IDA7CisKKwl1MzIJdTRiUmVnT2Zmc2V0LCB1NGJSZWdWYWx1ZSx1NGJQYWdlSW5kZXggPSAwOworCWludAlpOworCisJbkxpbmVzUmVhZD1zaXplb2YoTUFDX1JFR19UQUJMRSkvMjsKKworCWZvcihpID0gMDsgaSA8IG5MaW5lc1JlYWQ7IGkrKykgIC8vbkxpbmVzUmVhZD0xMDEKKwl7CisJCXU0YlJlZ09mZnNldD1NQUNfUkVHX1RBQkxFW2ldWzBdOworCQl1NGJSZWdWYWx1ZT1NQUNfUkVHX1RBQkxFW2ldWzFdOworCisgICAgICAgICAgICAgICAgaWYodTRiUmVnT2Zmc2V0ID09IDB4NWUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB1NGJQYWdlSW5kZXggPSB1NGJSZWdWYWx1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdTRiUmVnT2Zmc2V0IHw9ICh1NGJQYWdlSW5kZXggPDwgOCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vRGJnUHJpbnQoIk1BQyAtIDB4JXggPSAweCV4XG4iLCB1NGJSZWdPZmZzZXQsIHU0YlJlZ1ZhbHVlKTsKKwkJd3JpdGVfbmljX2J5dGUoZGV2LCB1NGJSZWdPZmZzZXQsICh1OCl1NGJSZWdWYWx1ZSk7CisJfQorCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorfQorCisKKworc3RhdGljIHZvaWQKK01hY0NvbmZpZ184NUJBU0lDKAorCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisKKyAgICAgICB1OAkJCXUxREE7CisJTWFjQ29uZmlnXzg1QkFTSUNfSGFyZENvZGUoZGV2KTsKKworCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLy8gRm9sbG93IFRJRF9BQ19NQVAgb2YgV01hYy4KKwl3cml0ZV9uaWNfd29yZChkZXYsIFRJRF9BQ19NQVAsIDB4ZmE1MCk7CisKKwkvLyBJbnRlcnJ1cHQgTWlncmF0aW9uLCBKb25nIHN1Z2dlc3RlZCB3ZSB1c2Ugc2V0IDB4MDAwMCBmaXJzdCwgMjAwNS4xMi4xNCwgYnkgcmNuamtvLgorCXdyaXRlX25pY193b3JkKGRldiwgSW50TWlnLCAweDAwMDApOworCisJLy8gUHJldmVudCBUUEMgdG8gY2F1c2UgQ1JDIGVycm9yLiBBZGRlZCBieSBBbm5pZSwgMjAwNi0wNi0xMC4KKwlQbGF0Zm9ybUlPV3JpdGU0Qnl0ZShkZXYsIDB4MUYwLCAweDAwMDAwMDAwKTsKKwlQbGF0Zm9ybUlPV3JpdGU0Qnl0ZShkZXYsIDB4MUY0LCAweDAwMDAwMDAwKTsKKwlQbGF0Zm9ybUlPV3JpdGUxQnl0ZShkZXYsIDB4MUY4LCAweDAwKTsKKworCS8vIEFza2VkIGZvciBieSBTRDMgQ00gTGluLCAyMDA2LjA2LjI3LCBieSByY25qa28uCisJLy9QbGF0Zm9ybUlPV3JpdGU0Qnl0ZShkZXYsIFJGVGltaW5nLCAweDAwMDA0MDAxKTsKKy8vYnkgYW15CisjaWYgMAorCXdyaXRlX25pY19kd29yZChkZXYsIFJGVGltaW5nLCAweDAwMDA0MDAxKTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19SVEw4MThYX1MKKwkvLyBwb3dlciBzYXZlIHBhcmFtZXRlciBiYXNlZCBvbiAiODdTRSBwb3dlciBzYXZlIHBhcmFtZXRlcnMgMjAwNzExMjcuZG9jIiwgYXMgZm9sbG93LgorCisJLy9FbmFibGUgREExMCBUWCBwb3dlciBzYXZpbmcKKwl1MURBID0gcmVhZF9uaWNfYnl0ZShkZXYsIFBIWVBSKTsKKwl3cml0ZV9uaWNfYnl0ZShkZXYsIFBIWVBSLCAodTFEQSB8IEJJVDIpICk7CisKKwkvL1BPV0VSOgorCXdyaXRlX25pY193b3JkKGRldiwgMHgzNjAsIDB4MTAwMCk7CisJd3JpdGVfbmljX3dvcmQoZGV2LCAweDM2MiwgMHgxMDAwKTsKKworCS8vIEFGRS4KKwl3cml0ZV9uaWNfd29yZChkZXYsIDB4MzcwLCAweDA1NjApOworCXdyaXRlX25pY193b3JkKGRldiwgMHgzNzIsIDB4MDU2MCk7CisJd3JpdGVfbmljX3dvcmQoZGV2LCAweDM3NCwgMHgwREE0KTsKKwl3cml0ZV9uaWNfd29yZChkZXYsIDB4Mzc2LCAweDBEQTQpOworCXdyaXRlX25pY193b3JkKGRldiwgMHgzNzgsIDB4MDU2MCk7CisJd3JpdGVfbmljX3dvcmQoZGV2LCAweDM3QSwgMHgwNTYwKTsKKwl3cml0ZV9uaWNfd29yZChkZXYsIDB4MzdDLCAweDAwRUMpOworLy8Jd3JpdGVfbmljX3dvcmQoZGV2LCAweDM3RSwgMHgwMEZFKTsvLy1lZHdhcmQKKwl3cml0ZV9uaWNfd29yZChkZXYsIDB4MzdFLCAweDAwRUMpOy8vK2Vkd2FyZAorI2Vsc2UKKyAgICAgICB3cml0ZV9uaWNfZHdvcmQoZGV2LCBSRlRpbWluZywgMHgwMDAwNDAwMyk7CisjZW5kaWYKKyAgICAgICB3cml0ZV9uaWNfYnl0ZShkZXYsIDB4MjRFLDB4MDEpOworLy9ieSBhbXkKKworfQorCisKKworCit1OAorR2V0U3VwcG9ydGVkV2lyZWxlc3NNb2RlODE4NSgKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2CispCit7CisJdTgJCQlidFN1cHBvcnRlZFdpcmVsZXNzTW9kZSA9IDA7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTgwX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOworCisJc3dpdGNoKHByaXYtPnJmX2NoaXApCisJeworCWNhc2UgUkZfWkVCUkEyOgorCWNhc2UgUkZfWkVCUkE0OgorCQlidFN1cHBvcnRlZFdpcmVsZXNzTW9kZSA9IChXSVJFTEVTU19NT0RFX0IgfCBXSVJFTEVTU19NT0RFX0cpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlidFN1cHBvcnRlZFdpcmVsZXNzTW9kZSA9IFdJUkVMRVNTX01PREVfQjsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIGJ0U3VwcG9ydGVkV2lyZWxlc3NNb2RlOworfQorCit2b2lkCitBY3RVcGRhdGVDaGFubmVsQWNjZXNzU2V0dGluZygKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCVdJUkVMRVNTX01PREUJCQlXaXJlbGVzc01vZGUsCisJUENIQU5ORUxfQUNDRVNTX1NFVFRJTkcJQ2hubEFjY2Vzc1NldHRpbmcKKwkpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlID0gcHJpdi0+aWVlZTgwMjExOworCUFDX0NPRElORwllQUNJOworCUFDX1BBUkFNCUFjUGFyYW07CisJLy9QU1RBX1FPUwlwU3RhUW9zID0gQWRhcHRlci0+TWdudEluZm8ucFN0YVFvczsKKwl1OAliRm9sbG93TGVnYWN5U2V0dGluZyA9IDA7CisJdTggICB1MWJBSUZTOworCisJLy8KKwkvLyA8UkpfVE9ET184MTg1Qj4KKwkvLyBUT0RPOiBXZSBzdGlsbCBkb24ndCBrbm93IGhvdyB0byBzZXQgdXAgdGhlc2UgcmVnaXN0ZXJzLCBqdXN0IGZvbGxvdyBXTUFDIHRvCisJLy8gdmVyaWZ5IDgxODVCIEZQQUcuCisJLy8KKwkvLyA8UkpfVE9ET184MTg1Qj4KKwkvLyBKb25nIHNhaWQgQ1dtaW4vQ1dtYXggcmVnaXN0ZXIgYXJlIG5vdCBmdW5jdGlvbmFsIGluIDgxODVCLAorCS8vIHNvIHdlIHNoYWxsIGZpbGwgY2hhbm5lbCBhY2Nlc3MgcmVhbHRlZCByZWdpc3RlciBpbnRvIEFDIHBhcmFtZXRlciByZWdpc3RlcnMsCisJLy8gZXZlbiBpbiBuUUJzcy4KKwkvLworCUNobmxBY2Nlc3NTZXR0aW5nLT5TSUZTX1RpbWVyID0gMHgyMjsgLy8gU3VnZ2VzdGVkIGJ5IEpvbmcsIDIwMDUuMTIuMDguCisJQ2hubEFjY2Vzc1NldHRpbmctPkRJRlNfVGltZXIgPSAweDFDOyAvLyAyMDA2LjA2LjAyLCBieSByY25qa28uCisJQ2hubEFjY2Vzc1NldHRpbmctPlNsb3RUaW1lVGltZXIgPSA5OyAvLyAyMDA2LjA2LjAyLCBieSByY25qa28uCisJQ2hubEFjY2Vzc1NldHRpbmctPkVJRlNfVGltZXIgPSAweDVCOyAvLyBTdWdnZXN0ZWQgYnkgd2NjaHUsIGl0IGlzIHRoZSBkZWZhdWx0IHZhbHVlIG9mIEVJRlMgcmVnaXN0ZXIsIDIwMDUuMTIuMDguCisJQ2hubEFjY2Vzc1NldHRpbmctPkNXbWluSW5kZXggPSAzOyAvLyAyMDA2LjA2LjAyLCBieSByY25qa28uCisJQ2hubEFjY2Vzc1NldHRpbmctPkNXbWF4SW5kZXggPSA3OyAvLyAyMDA2LjA2LjAyLCBieSByY25qa28uCisKKwl3cml0ZV9uaWNfYnl0ZShkZXYsIFNJRlMsIENobmxBY2Nlc3NTZXR0aW5nLT5TSUZTX1RpbWVyKTsKKwkvL0FkYXB0ZXItPkhhbEZ1bmMuU2V0SHdSZWdIYW5kbGVyKCBBZGFwdGVyLCBIV19WQVJfU0xPVF9USU1FLCAmQ2hubEFjY2Vzc1NldHRpbmctPlNsb3RUaW1lVGltZXIgKTsJLy8gUmV3cml0ZWQgZnJvbSBkaXJlY3RseSB1c2UgUGxhdGZvcm1FRklPV3JpdGUxQnl0ZSgpLCBieSBBbm5pZSwgMjAwNi0wMy0yOS4KKwl3cml0ZV9uaWNfYnl0ZShkZXYsIFNMT1QsIENobmxBY2Nlc3NTZXR0aW5nLT5TbG90VGltZVRpbWVyKTsJLy8gUmV3cml0ZWQgZnJvbSBkaXJlY3RseSB1c2UgUGxhdGZvcm1FRklPV3JpdGUxQnl0ZSgpLCBieSBBbm5pZSwgMjAwNi0wMy0yOS4KKworCXUxYkFJRlMgPSBhU2lmc1RpbWUgKyAoMiAqIENobmxBY2Nlc3NTZXR0aW5nLT5TbG90VGltZVRpbWVyICk7CisKKwkvL3dyaXRlX25pY19ieXRlKGRldiwgQUNfVk9fUEFSQU0sIHUxYkFJRlMpOworCS8vd3JpdGVfbmljX2J5dGUoZGV2LCBBQ19WSV9QQVJBTSwgdTFiQUlGUyk7CisJLy93cml0ZV9uaWNfYnl0ZShkZXYsIEFDX0JFX1BBUkFNLCB1MWJBSUZTKTsKKwkvL3dyaXRlX25pY19ieXRlKGRldiwgQUNfQktfUEFSQU0sIHUxYkFJRlMpOworCisJd3JpdGVfbmljX2J5dGUoZGV2LCBFSUZTLCBDaG5sQWNjZXNzU2V0dGluZy0+RUlGU19UaW1lcik7CisKKwl3cml0ZV9uaWNfYnl0ZShkZXYsIEFja1RpbWVPdXRSZWcsIDB4NUIpOyAvLyA8UkpfRVhQUl9RT1M+IFN1Z2dlc3RlZCBieSB3Y2NodSwgaXQgaXMgdGhlIGRlZmF1bHQgdmFsdWUgb2YgRUlGUyByZWdpc3RlciwgMjAwNS4xMi4wOC4KKworI2lmZGVmIFRPRE8KKwkvLyA8UkpfVE9ET19OT1dfODE4NUI+IFVwZGF0ZSBFQ1dtaW4vRUNXbWF4LCBBSUZTLCBUWE9QIExpbWl0IG9mIGVhY2ggQUMgdG8gdGhlIHZhbHVlIGRlZmluZWQgYnkgU1BFQy4KKwlpZiggcFN0YVFvcy0+Q3VycmVudFFvc01vZGUgPiBRT1NfRElTQUJMRSApCisJeyAvLyBRb1MgbW9kZS4KKwkJaWYocFN0YVFvcy0+UUJzc1dpcmVsZXNzTW9kZSA9PSBXaXJlbGVzc01vZGUpCisJCXsKKwkJCS8vIEZvbGxvdyBBQyBQYXJhbWV0ZXJzIG9mIHRoZSBRQlNTLgorCQkJZm9yKGVBQ0kgPSAwOyBlQUNJIDwgQUNfTUFYOyBlQUNJKyspCisJCQl7CisJCQkJQWRhcHRlci0+SGFsRnVuYy5TZXRId1JlZ0hhbmRsZXIoQWRhcHRlciwgSFdfVkFSX0FDX1BBUkFNLCAocHUxQnl0ZSkoJihwU3RhUW9zLT5XTU1QYXJhbUVsZS5BY1BhcmFtW2VBQ0ldKSkgKTsKKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCS8vIEZvbGxvdyBEZWZhdWx0IFdNTSBBQyBQYXJhbWV0ZXJzLgorCQkJYkZvbGxvd0xlZ2FjeVNldHRpbmcgPSAxOworCQl9CisJfQorCWVsc2UKKyNlbmRpZgorCXsgLy8gTGVnYWN5IDgwMi4xMS4KKwkJYkZvbGxvd0xlZ2FjeVNldHRpbmcgPSAxOworCisJfQorCisJLy8gdGhpcyBzZXR0aW5nIGlzIGNvcGllZCBmcm9tIHJ0bDgxODdCLiAgeGlvbmctMjAwNi0xMS0xMworCWlmKGJGb2xsb3dMZWdhY3lTZXR0aW5nKQorCXsKKworCisJCS8vCisJCS8vIEZvbGxvdyA4MDIuMTEgc2VldGluZyB0byBBQyBwYXJhbWV0ZXIsIGFsbCBBQyBzaGFsbCB1c2UgdGhlIHNhbWUgcGFyYW1ldGVyLgorCQkvLyAyMDA1LjEyLjAxLCBieSByY25qa28uCisJCS8vCisJCUFjUGFyYW0ubG9uZ0RhdGEgPSAwOworCQlBY1BhcmFtLmYuQWNpQWlmc24uZi5BSUZTTiA9IDI7IC8vIEZvbGxvdyA4MDIuMTEgRElGUy4KKwkJQWNQYXJhbS5mLkFjaUFpZnNuLmYuQUNNID0gMDsKKwkJQWNQYXJhbS5mLkVjdy5mLkVDV21pbiA9IENobmxBY2Nlc3NTZXR0aW5nLT5DV21pbkluZGV4OyAvLyBGb2xsb3cgODAyLjExIENXbWluLgorCQlBY1BhcmFtLmYuRWN3LmYuRUNXbWF4ID0gQ2hubEFjY2Vzc1NldHRpbmctPkNXbWF4SW5kZXg7IC8vIEZvbGxvdyA4MDIuMTEgQ1dtYXguCisJCUFjUGFyYW0uZi5UWE9QTGltaXQgPSAwOworCisJCS8vbHptIHJlc2VydmVkIDA4MDgyNgorI2lmIDEKKyNpZmRlZiBUSE9NQVNfVFVSQk8KKwkJLy8gRm9yIHR1cmJvIG1vZGUgc2V0dGluZy4gcG9ydCBmcm9tIDg3QiBieSBJc2FpYWggMjAwOC0wOC0wMQorCQlpZiggaWVlZS0+Y3VycmVudF9uZXR3b3JrLlR1cmJvX0VuYWJsZSA9PSAxICkKKwkJCUFjUGFyYW0uZi5UWE9QTGltaXQgPSAweDAxRkY7CisjZW5kaWYKKwkJLy8gRm9yIDg3U0Ugd2l0aCBJbnRlbCA0OTY1ICBBZC1Ib2MgbW9kZSBoYXZlIHBvb3IgdGhyb3VnaHB1dCAoMTlNQikKKwkJaWYgKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9BREhPQykKKwkJCUFjUGFyYW0uZi5UWE9QTGltaXQgPSAweDAwMjA7CisjZW5kaWYKKworCQlmb3IoZUFDSSA9IDA7IGVBQ0kgPCBBQ19NQVg7IGVBQ0krKykKKwkJeworCQkJQWNQYXJhbS5mLkFjaUFpZnNuLmYuQUNJID0gKHU4KWVBQ0k7CisJCQl7CisJCQkJUEFDX1BBUkFNCXBBY1BhcmFtID0gKFBBQ19QQVJBTSkoJkFjUGFyYW0pOworCQkJCUFDX0NPRElORwllQUNJOworCQkJCXU4CQl1MWJBSUZTOworCQkJCXUzMgkJdTRiQWNQYXJhbTsKKworCQkJCS8vIFJldHJpdmUgcGFyYW10ZXJzIHRvIHVkcGF0ZS4KKwkJCQllQUNJID0gcEFjUGFyYW0tPmYuQWNpQWlmc24uZi5BQ0k7CisJCQkJdTFiQUlGUyA9IHBBY1BhcmFtLT5mLkFjaUFpZnNuLmYuQUlGU04gKiBDaG5sQWNjZXNzU2V0dGluZy0+U2xvdFRpbWVUaW1lciArIGFTaWZzVGltZTsKKwkJCQl1NGJBY1BhcmFtID0gKAkoKCh1MzIpKHBBY1BhcmFtLT5mLlRYT1BMaW1pdCkpIDw8IEFDX1BBUkFNX1RYT1BfTElNSVRfT0ZGU0VUKQl8CisJCQkJCQkoKCh1MzIpKHBBY1BhcmFtLT5mLkVjdy5mLkVDV21heCkpIDw8IEFDX1BBUkFNX0VDV19NQVhfT0ZGU0VUKQl8CisJCQkJCQkoKCh1MzIpKHBBY1BhcmFtLT5mLkVjdy5mLkVDV21pbikpIDw8IEFDX1BBUkFNX0VDV19NSU5fT0ZGU0VUKQl8CisJCQkJCQkoKCh1MzIpdTFiQUlGUykgPDwgQUNfUEFSQU1fQUlGU19PRkZTRVQpKTsKKworCQkJCXN3aXRjaChlQUNJKQorCQkJCXsKKwkJCQkJY2FzZSBBQzFfQks6CisJCQkJCQkvL3dyaXRlX25pY19kd29yZChkZXYsIEFDX0JLX1BBUkFNLCB1NGJBY1BhcmFtKTsKKwkJCQkJCWJyZWFrOworCisJCQkJCWNhc2UgQUMwX0JFOgorCQkJCQkJLy93cml0ZV9uaWNfZHdvcmQoZGV2LCBBQ19CRV9QQVJBTSwgdTRiQWNQYXJhbSk7CisJCQkJCQlicmVhazsKKworCQkJCQljYXNlIEFDMl9WSToKKwkJCQkJCS8vd3JpdGVfbmljX2R3b3JkKGRldiwgQUNfVklfUEFSQU0sIHU0YkFjUGFyYW0pOworCQkJCQkJYnJlYWs7CisKKwkJCQkJY2FzZSBBQzNfVk86CisJCQkJCQkvL3dyaXRlX25pY19kd29yZChkZXYsIEFDX1ZPX1BBUkFNLCB1NGJBY1BhcmFtKTsKKwkJCQkJCWJyZWFrOworCisJCQkJCWRlZmF1bHQ6CisJCQkJCQlETUVTR1coICJTZXRId1JlZzgxODUoKTogaW52YWxpZCBBQ0k6ICVkICFcbiIsIGVBQ0kpOworCQkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gQ2VoY2sgQUNNIGJpdC4KKwkJCQkvLyBJZiBpdCBpcyBzZXQsIGltbWVkaWF0ZWx5IHNldCBBQ00gY29udHJvbCBiaXQgdG8gZG93bmdyYWRpbmcgQUMgZm9yIHBhc3NpbmcgV01NIHRlc3RwbGFuLiBBbm5pZSwgMjAwNS0xMi0xMy4KKwkJCQkvL3dyaXRlX25pY19ieXRlKGRldiwgQUNNX0NPTlRST0wsIHBBY1BhcmFtLT5mLkFjaUFpZnNuKTsKKwkJCQl7CisJCQkJCVBBQ0lfQUlGU04JcEFjaUFpZnNuID0gKFBBQ0lfQUlGU04pKCZwQWNQYXJhbS0+Zi5BY2lBaWZzbik7CisJCQkJCUFDX0NPRElORwllQUNJID0gcEFjaUFpZnNuLT5mLkFDSTsKKworCQkJCQkvL21vZGlmaWVkIEpvc2VwaAorCQkJCQkvL2ZvciA4MTg3QiBBc3luSU9SZWFkIGlzc3VlCisjaWZkZWYgVE9ETworCQkJCQl1OAlBY21DdHJsID0gcEhhbERhdGEtPkFjbUNvbnRyb2w7CisjZWxzZQorCQkJCQl1OAlBY21DdHJsID0gMDsKKyNlbmRpZgorCQkJCQlpZiggcEFjaUFpZnNuLT5mLkFDTSApCisJCQkJCXsgLy8gQUNNIGJpdCBpcyAxLgorCQkJCQkJc3dpdGNoKGVBQ0kpCisJCQkJCQl7CisJCQkJCQkJY2FzZSBBQzBfQkU6CisJCQkJCQkJCUFjbUN0cmwgfD0gKEJFUV9BQ01fRU58QkVRX0FDTV9DVEx8QUNNX0hXX0VOKTsJLy8gb3IgMHgyMQorCQkJCQkJCQlicmVhazsKKworCQkJCQkJCWNhc2UgQUMyX1ZJOgorCQkJCQkJCQlBY21DdHJsIHw9IChWSVFfQUNNX0VOfFZJUV9BQ01fQ1RMfEFDTV9IV19FTik7CS8vIG9yIDB4NDIKKwkJCQkJCQkJYnJlYWs7CisKKwkJCQkJCQljYXNlIEFDM19WTzoKKwkJCQkJCQkJQWNtQ3RybCB8PSAoVk9RX0FDTV9FTnxWT1FfQUNNX0NUTHxBQ01fSFdfRU4pOwkvLyBvciAweDg0CisJCQkJCQkJCWJyZWFrOworCisJCQkJCQkJZGVmYXVsdDoKKwkJCQkJCQkJRE1FU0dXKCJTZXRId1JlZzgxODUoKTogW0hXX1ZBUl9BQ01fQ1RSTF0gQUNNIHNldCBmYWlsZWQ6IGVBQ0kgaXMgJWRcbiIsIGVBQ0kgKTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7IC8vIEFDTSBiaXQgaXMgMC4KKwkJCQkJCXN3aXRjaChlQUNJKQorCQkJCQkJeworCQkJCQkJCWNhc2UgQUMwX0JFOgorCQkJCQkJCQlBY21DdHJsICY9ICggKH5CRVFfQUNNX0VOKSAmICh+QkVRX0FDTV9DVEwpICYgKH5BQ01fSFdfRU4pICk7CS8vIGFuZCAweERFCisJCQkJCQkJCWJyZWFrOworCisJCQkJCQkJY2FzZSBBQzJfVkk6CisJCQkJCQkJCUFjbUN0cmwgJj0gKCAoflZJUV9BQ01fRU4pICYgKH5WSVFfQUNNX0NUTCkgJiAofkFDTV9IV19FTikgKTsJLy8gYW5kIDB4QkQKKwkJCQkJCQkJYnJlYWs7CisKKwkJCQkJCQljYXNlIEFDM19WTzoKKwkJCQkJCQkJQWNtQ3RybCAmPSAoICh+Vk9RX0FDTV9FTikgJiAoflZPUV9BQ01fQ1RMKSAmICh+QUNNX0hXX0VOKSApOwkvLyBhbmQgMHg3QgorCQkJCQkJCQlicmVhazsKKworCQkJCQkJCWRlZmF1bHQ6CisJCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQl9CisKKwkJCQkJLy9wcmludGsoS0VSTl9XQVJOSU5HICJTZXRId1JlZzgxODUoKTogW0hXX1ZBUl9BQ01fQ1RSTF0gV3JpdGUgMHglWFxuIiwgQWNtQ3RybCk7CisKKyNpZmRlZiBUT19ETworCQkJCQlwSGFsRGF0YS0+QWNtQ29udHJvbCA9IEFjbUN0cmw7CisjZW5kaWYKKwkJCQkJLy93cml0ZV9uaWNfYnl0ZShkZXYsIEFDTV9DT05UUk9MLCBBY21DdHJsKTsKKwkJCQkJd3JpdGVfbmljX2J5dGUoZGV2LCBBQ01fQ09OVFJPTCwgMCk7CisJCQkJfQorCQkJfQorCQl9CisKKworCX0KK30KKwordm9pZAorQWN0U2V0V2lyZWxlc3NNb2RlODE4NSgKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCXU4CQkJCWJ0V2lyZWxlc3NNb2RlCisJKQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gKHN0cnVjdCByODE4MF9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSA9IHByaXYtPmllZWU4MDIxMTsKKwkvL1BNR05UX0lORk8JCXBNZ250SW5mbyA9ICYoQWRhcHRlci0+TWdudEluZm8pOworCXU4CWJ0U3VwcG9ydGVkV2lyZWxlc3NNb2RlID0gR2V0U3VwcG9ydGVkV2lyZWxlc3NNb2RlODE4NShkZXYpOworCisJaWYoIChidFdpcmVsZXNzTW9kZSAmIGJ0U3VwcG9ydGVkV2lyZWxlc3NNb2RlKSA9PSAwICkKKwl7IC8vIERvbid0IHN3aXRjaCB0byB1bnN1cHBvcnRlZCB3aXJlbGVzcyBtb2RlLCAyMDA2LjAyLjE1LCBieSByY25qa28uCisJCURNRVNHVygiQWN0U2V0V2lyZWxlc3NNb2RlODE4NSgpOiBXaXJlbGVzc01vZGUoJWQpIGlzIG5vdCBzdXBwb3J0ZWQgKCVkKSFcbiIsCisJCQlidFdpcmVsZXNzTW9kZSwgYnRTdXBwb3J0ZWRXaXJlbGVzc01vZGUpOworCQlyZXR1cm47CisJfQorCisJLy8gMS4gQXNzaWduIHdpcmVsZXNzIG1vZGUgdG8gc3d0aWNoIGlmIG5lY2Vzc2FyeS4KKwlpZiAoYnRXaXJlbGVzc01vZGUgPT0gV0lSRUxFU1NfTU9ERV9BVVRPKQorCXsKKwkJaWYoKGJ0U3VwcG9ydGVkV2lyZWxlc3NNb2RlICYgV0lSRUxFU1NfTU9ERV9BKSkKKwkJeworCQkJYnRXaXJlbGVzc01vZGUgPSBXSVJFTEVTU19NT0RFX0E7CisJCX0KKwkJZWxzZSBpZigoYnRTdXBwb3J0ZWRXaXJlbGVzc01vZGUgJiBXSVJFTEVTU19NT0RFX0cpKQorCQl7CisJCQlidFdpcmVsZXNzTW9kZSA9IFdJUkVMRVNTX01PREVfRzsKKwkJfQorCQllbHNlIGlmKChidFN1cHBvcnRlZFdpcmVsZXNzTW9kZSAmIFdJUkVMRVNTX01PREVfQikpCisJCXsKKwkJCWJ0V2lyZWxlc3NNb2RlID0gV0lSRUxFU1NfTU9ERV9COworCQl9CisJCWVsc2UKKwkJeworCQkJRE1FU0dXKCJBY3RTZXRXaXJlbGVzc01vZGU4MTg1KCk6IE5vIHZhbGlkIHdpcmVsZXNzIG1vZGUgc3VwcG9ydGVkLCBidFN1cHBvcnRlZFdpcmVsZXNzTW9kZSgleCkhISFcbiIsCisJCQkJCSBidFN1cHBvcnRlZFdpcmVsZXNzTW9kZSk7CisJCQlidFdpcmVsZXNzTW9kZSA9IFdJUkVMRVNTX01PREVfQjsKKwkJfQorCX0KKworCisJLy8gMi4gU3d0aWNoIGJhbmQ6IFJGIG9yIEJCIHNwZWNpZmljIGFjdGlvbnMsCisJLy8gZm9yIGV4YW1wbGUsIHJlZnJlc2ggdGFibGVzIGluIG9tYzgyNTUsIG9yIGNoYW5nZSBpbml0aWFsIGdhaW4gaWYgbmVjZXNzYXJ5LgorCXN3aXRjaChwcml2LT5yZl9jaGlwKQorCXsKKwljYXNlIFJGX1pFQlJBMjoKKwljYXNlIFJGX1pFQlJBNDoKKwkJeworCQkJLy8gTm90aGluZyB0byBkbyBmb3IgWmVicmEgdG8gc3dpdGNoIGJhbmQuCisJCQkvLyBVcGRhdGUgY3VycmVudCB3aXJlbGVzcyBtb2RlIGlmIHdlIHN3dGljaCB0byBzcGVjaWZpZWQgYmFuZCBzdWNjZXNzZnVsbHkuCisJCQlpZWVlLT5tb2RlID0gKFdJUkVMRVNTX01PREUpYnRXaXJlbGVzc01vZGU7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlETUVTR1coIkFjdFNldFdpcmVsZXNzTW9kZTgxODUoKTogdW5zdXBwb3J0ZWQgUkY6IDB4JVggISEhXG4iLCBwcml2LT5yZl9jaGlwKTsKKwkJYnJlYWs7CisJfQorCisJLy8gMy4gQ2hhbmdlIHJlbGF0ZWQgc2V0dGluZy4KKwlpZiggaWVlZS0+bW9kZSA9PSBXSVJFTEVTU19NT0RFX0EgKXsKKwkJRE1FU0coIldJUkVMRVNTX01PREVfQVxuIik7CisJfQorCWVsc2UgaWYoIGllZWUtPm1vZGUgPT0gV0lSRUxFU1NfTU9ERV9CICl7CisJCURNRVNHKCJXSVJFTEVTU19NT0RFX0JcbiIpOworCX0KKwllbHNlIGlmKCBpZWVlLT5tb2RlID09IFdJUkVMRVNTX01PREVfRyApeworCQlETUVTRygiV0lSRUxFU1NfTU9ERV9HXG4iKTsKKwl9CisKKwlBY3RVcGRhdGVDaGFubmVsQWNjZXNzU2V0dGluZyggZGV2LCBpZWVlLT5tb2RlLCAmcHJpdi0+Q2hhbm5lbEFjY2Vzc1NldHRpbmcpOworfQorCit2b2lkIHJ0bDgxODViX2lycV9lbmFibGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxODBfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CisKKwlwcml2LT5pcnFfZW5hYmxlZCA9IDE7CisJd3JpdGVfbmljX2R3b3JkKGRldiwgSU1SLCBwcml2LT5JbnRyTWFzayk7Cit9CisvL2J5IGFteSBmb3IgcG93ZXIgc2F2ZQordm9pZAorRHJ2SUZJbmRpY2F0ZURpc2Fzc29jaWF0aW9uKAorCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJdTE2CQkJcmVhc29uCisJKQoreworCS8vcHJpbnRrKCI9PT4gRHJ2SUZJbmRpY2F0ZURpc2Fzc29jaWF0aW9uKClcbiIpOworCisJLy8gbm90aGluZyBpcyBuZWVkZWQgYWZ0ZXIgZGlzYXNzb2NpYXRpb24gcmVxdWVzdC4KKworCS8vcHJpbnRrKCI8PT0gRHJ2SUZJbmRpY2F0ZURpc2Fzc29jaWF0aW9uKClcbiIpOworfQordm9pZAorTWdudERpc2Nvbm5lY3RJQlNTKAorCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYKKykKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxODBfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CisJdTgJCQlpOworCisJLy9wcmludGsoIlhYWFhYWFhYWFggTWdudERpc2Nvbm5lY3QgSUJTU1xuIik7CisKKwlEcnZJRkluZGljYXRlRGlzYXNzb2NpYXRpb24oZGV2LCB1bnNwZWNfcmVhc29uKTsKKworLy8JUGxhdGZvcm1aZXJvTWVtb3J5KCBwTWdudEluZm8tPkJzc2lkLCA2ICk7CisJZm9yKGk9MDtpPDY7aSsrKSAgcHJpdi0+aWVlZTgwMjExLT5jdXJyZW50X25ldHdvcmsuYnNzaWRbaV0gPSAweDU1OworCisJcHJpdi0+aWVlZTgwMjExLT5zdGF0ZSA9IElFRUU4MDIxMV9OT0xJTks7CisKKwkvL1N0b3AgQmVhY29uLgorCisJLy8gVmlzdGEgYWRkIGEgQWRob2MgcHJvZmlsZSwgSFcgcmFkaW8gb2ZmIHVudGlsbCBPSURfRE9UMTFfUkVTRVRfUkVRVUVTVAorCS8vIERyaXZlciB3b3VsZCBzZXQgTVNSPU5PX0xJTkssIHRoZW4gSFcgUmFkaW8gT04sIE1nbnRRdWV1ZSBTdHVjay4KKwkvLyBCZWNhdXNlIEJjbiBETUEgaXNuJ3QgY29tcGxldGUsIG1nbnQgcXVldWUgd291bGQgc3R1Y2sgdW50aWwgQmNuIHBhY2tldCBzZW5kLgorCisJLy8gRGlzYWJsZSBCZWFjb24gUXVldWUgT3duIGJpdCwgc3VnZ2VzdGVkIGJ5IGpvbmcKKy8vCUFkYXB0ZXItPkhhbEZ1bmMuU2V0VHhEZXNjT1dOSGFuZGxlcihBZGFwdGVyLCBCRUFDT05fUVVFVUUsIDAsIDApOworCWllZWU4MDIxMV9zdG9wX3NlbmRfYmVhY29ucyhwcml2LT5pZWVlODAyMTEpOworCisJcHJpdi0+aWVlZTgwMjExLT5saW5rX2NoYW5nZShkZXYpOworCW5vdGlmeV93eF9hc3NvY19ldmVudChwcml2LT5pZWVlODAyMTEpOworCisJLy8gU3RvcCBTVyBCZWFjb24uVXNlIGh3IGJlYWNvbiBzbyBkbyBub3QgbmVlZCB0byBkbyBzby5ieSBhbXkKKyNpZiAwCisJaWYocE1nbnRJbmZvLT5iRW5hYmxlU3dCZWFjb25UaW1lcikKKwl7CisJCS8vIFN3QmVhY29uVGltZXIgd2lsbCBzdG9wIGlmIHBNZ250SW5mby0+bUlic3M9PUZBTFNFLCBzZWUgU3dCZWFjb25DYWxsYmFjaygpIGZvciBkZXRhaWxzLgorLy8gY29tbWVudCBvdXQgYnkgaGFpY2gsIDIwMDcuMTAuMDEKKy8vI2lmIERFVl9CVVNfVFlQRT09VVNCX0lOVEVSRkFDRQorCQlQbGF0Zm9ybUNhbmNlbFRpbWVyKCBBZGFwdGVyLCAmcE1nbnRJbmZvLT5Td0JlYWNvblRpbWVyKTsKKy8vI2VuZGlmCisJfQorI2VuZGlmCisKKy8vCQlNZ250SW5kaWNhdGVNZWRpYVN0YXR1cyggQWRhcHRlciwgUlRfTUVESUFfRElTQ09OTkVDVCwgR0VORVJBTF9JTkRJQ0FURSApOworCit9Cit2b2lkCitNbG1lRGlzYXNzb2NpYXRlUmVxdWVzdCgKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCXU4KgkJCWFzU3RhLAorCXU4CQkJYXNSc24KKwkpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTgwX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOworCXU4IGk7CisKKwlTZW5kRGlzYXNzb2NpYXRpb24ocHJpdi0+aWVlZTgwMjExLCBhc1N0YSwgYXNSc24gKTsKKworCWlmKCBtZW1jbXAocHJpdi0+aWVlZTgwMjExLT5jdXJyZW50X25ldHdvcmsuYnNzaWQsIGFzU3RhLCA2ICkgPT0gMCApeworCQkvL1NodUNoZW4gVE9ETzogY2hhbmdlIG1lZGlhIHN0YXR1cy4KKwkJLy9TaHVDaGVuIFRPRE86IFdoYXQgdG8gZG8gd2hlbiBkaXNhc3NvY2lhdGUuCisJCURydklGSW5kaWNhdGVEaXNhc3NvY2lhdGlvbihkZXYsIHVuc3BlY19yZWFzb24pOworCisKKwkvLwlwTWdudEluZm8tPkFzb2NUaW1lc3RhbXAgPSAwOworCQlmb3IoaT0wO2k8NjtpKyspICBwcml2LT5pZWVlODAyMTEtPmN1cnJlbnRfbmV0d29yay5ic3NpZFtpXSA9IDB4MjI7CisvLwkJcE1nbnRJbmZvLT5tQnJhdGVzLkxlbmd0aCA9IDA7CisvLwkJQWRhcHRlci0+SGFsRnVuYy5TZXRId1JlZ0hhbmRsZXIoIEFkYXB0ZXIsIEhXX1ZBUl9CQVNJQ19SQVRFLCAocHUxQnl0ZSkoJnBNZ250SW5mby0+bUJyYXRlcykgKTsKKworCQlpZWVlODAyMTFfZGlzYXNzb2NpYXRlKHByaXYtPmllZWU4MDIxMSk7CisKKworCX0KKworfQorCit2b2lkCitNZ250RGlzY29ubmVjdEFQKAorCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJdTgJCQlhc1JzbgorKQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gKHN0cnVjdCByODE4MF9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsKKworLy8KKy8vIENvbW1lbnRlZCBvdXQgYnkgcmNuamtvLCAyMDA1LjAxLjI3OgorLy8gSSBtb3ZlIFNlY0NsZWFyQWxsS2V5cygpIHRvIE1nbnRBY3RTZXRfODAyXzExX0RJU0FTU09DSUFURSgpLgorLy8KKy8vCS8vMjAwNC8wOS8xNSwga2N3dSwgdGhlIGtleSBzaG91bGQgYmUgY2xlYXJlZCwgb3IgdGhlIG5ldyBoYW5kc2hha2luZyB3aWxsIG5vdCBzdWNjZXNzCisvLwlTZWNDbGVhckFsbEtleXMoQWRhcHRlcik7CisKKwkvLyBJbiBXUEEgV1BBMiBuZWVkIHRvIENsZWFyIGFsbCBrZXkgLi4uIGJlY2F1c2UgbmV3IGtleSB3aWxsIHNldCBhZnRlciBuZXcgaGFuZHNoYWtpbmcuCisjaWZkZWYgVE9ETworCWlmKCAgIHBNZ250SW5mby0+U2VjdXJpdHlJbmZvLkF1dGhNb2RlID4gUlRfODAyXzExQXV0aE1vZGVBdXRvU3dpdGNoIHx8CisJCShwTWdudEluZm8tPmJBUFN1cG9ydENDS00gJiYgcE1nbnRJbmZvLT5iQ0NYODAyMXhlbmFibGUpICkgIC8vIEluIENDS00gbW9kZSB3aWxsIENsZWFyIGtleQorCXsKKwkJU2VjQ2xlYXJBbGxLZXlzKEFkYXB0ZXIpOworCQlSVF9UUkFDRShDT01QX1NFQywgREJHX0xPVUQsKCI9PT09PT0+Q0NLTSBjbGVhciBrZXkuLi4iKSkKKwl9CisjZW5kaWYKKwkvLyAyMDA0LjEwLjExLCBieSByY25qa28uCisJLy9NbG1lRGlzYXNzb2NpYXRlUmVxdWVzdCggQWRhcHRlciwgcE1nbnRJbmZvLT5Cc3NpZCwgZGlzYXNfbHZfc3MgKTsKKwlNbG1lRGlzYXNzb2NpYXRlUmVxdWVzdCggZGV2LCBwcml2LT5pZWVlODAyMTEtPmN1cnJlbnRfbmV0d29yay5ic3NpZCwgYXNSc24gKTsKKworCXByaXYtPmllZWU4MDIxMS0+c3RhdGUgPSBJRUVFODAyMTFfTk9MSU5LOworLy8JcE1nbnRJbmZvLT5Bc29jVGltZXN0YW1wID0gMDsKK30KK2Jvb2wKK01nbnREaXNjb25uZWN0KAorCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJdTgJCQlhc1JzbgorKQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gKHN0cnVjdCByODE4MF9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsKKwkvLworCS8vIFNjaGVkdWxlIGFuIHdvcmtpdGVtIHRvIHdha2UgdXAgZm9yIHBzIG1vZGUsIDA3MDEwOSwgYnkgcmNuamtvLgorCS8vCisjaWZkZWYgVE9ETworCWlmKHBNZ250SW5mby0+bVBzcyAhPSBlQXdha2UpCisJeworCQkvLworCQkvLyBVc2luZyBBd2thZVRpbWVyIHRvIHByZXZlbnQgbWlzbWF0Y2ggcHMgc3RhdGUuCisJCS8vIEluIHRoZSB0aW1lciB0aGUgc3RhdGUgd2lsbCBiZSBjaGFuZ2VkIGFjY29yZGluZyB0byB0aGUgUkYgaXMgYmVpbmcgYXdva2Ugb3Igbm90LiBCeSBCcnVjZSwgMjAwNy0xMC0zMS4KKwkJLy8KKwkJLy8gUGxhdGZvcm1TY2hlZHVsZVdvcmtJdGVtKCAmKHBNZ250SW5mby0+QXdha2VXb3JrSXRlbSkgKTsKKwkJUGxhdGZvcm1TZXRUaW1lciggQWRhcHRlciwgJihwTWdudEluZm8tPkF3YWtlVGltZXIpLCAwICk7CisJfQorI2VuZGlmCisKKwkvLyBJbmRpY2F0aW9uIG9mIGRpc2Fzc29jaWF0aW9uIGV2ZW50LgorCS8vRHJ2SUZJbmRpY2F0ZURpc2Fzc29jaWF0aW9uKEFkYXB0ZXIsIGFzUnNuKTsKKyNpZmRlZiBFTkFCTEVfRE9UMTFECisJaWYoSVNfRE9UMTFEX0VOQUJMRShwcml2LT5pZWVlODAyMTEpKQorCQlEb3QxMWRfUmVzZXQocHJpdi0+aWVlZTgwMjExKTsKKyNlbmRpZgorCS8vIEluIGFkaG9jIG1vZGUsIHVwZGF0ZSBiZWFjb24gZnJhbWUuCisJaWYoIHByaXYtPmllZWU4MDIxMS0+c3RhdGUgPT0gSUVFRTgwMjExX0xJTktFRCApCisJeworCQlpZiggcHJpdi0+aWVlZTgwMjExLT5pd19tb2RlID09IElXX01PREVfQURIT0MgKQorCQl7CisvLwkJCVJUX1RSQUNFKENPTVBfTUxNRSwgREJHX0xPVUQsICgiTWdudERpc2Nvbm5lY3QoKSA9PT0+IE1nbnREaXNjb25uZWN0SUJTU1xuIikpOworCQkJLy9wcmludGsoIk1nbnREaXNjb25uZWN0KCkgPT09PiBNZ250RGlzY29ubmVjdElCU1NcbiIpOworCQkJTWdudERpc2Nvbm5lY3RJQlNTKGRldik7CisJCX0KKwkJaWYoIHByaXYtPmllZWU4MDIxMS0+aXdfbW9kZSA9PSBJV19NT0RFX0lORlJBICkKKwkJeworCQkJLy8gV2UgY2xlYXIga2V5IGhlcmUgaW5zdGVhZCBvZiBNZ250RGlzY29ubmVjdEFQKCkgYmVjYXVzZSB0aGF0CisJCQkvLyBNZ250QWN0U2V0XzgwMl8xMV9ESVNBU1NPQ0lBVEUoKSBpcyBhbiBpbnRlcmZhY2UgY2FsbGVkIGJ5IE9TLAorCQkJLy8gZS5nLiBPSURfODAyXzExX0RJU0FTU09DSUFURSBpbiBXaW5kb3dzIHdoaWxlIGFzIE1nbnREaXNjb25uZWN0QVAoKSBpcworCQkJLy8gdXNlZCB0byBoYW5kbGUgZGlzYXNzb2NpYXRpb24gcmVsYXRlZCB0aGluZ3MgdG8gQVAsIGUuZy4gc2VuZCBEaXNhc3NvYworCQkJLy8gZnJhbWUgdG8gQVAuICAyMDA1LjAxLjI3LCBieSByY25qa28uCisvLwkJCVNlY0NsZWFyQWxsS2V5cyhBZGFwdGVyKTsKKworLy8JCQlSVF9UUkFDRShDT01QX01MTUUsIERCR19MT1VELCAoIk1nbnREaXNjb25uZWN0KCkgPT09PiBNZ250RGlzY29ubmVjdEFQXG4iKSk7CisJCQkvL3ByaW50aygiTWdudERpc2Nvbm5lY3QoKSA9PT0+IE1nbnREaXNjb25uZWN0QVBcbiIpOworCQkJTWdudERpc2Nvbm5lY3RBUChkZXYsIGFzUnNuKTsKKwkJfQorCisJCS8vIEluaWRpY2F0ZSBEaXNjb25uZWN0LCAyMDA1LjAyLjIzLCBieSByY25qa28uCisvLwkJTWdudEluZGljYXRlTWVkaWFTdGF0dXMoIEFkYXB0ZXIsIFJUX01FRElBX0RJU0NPTk5FQ1QsIEdFTkVSQUxfSU5ESUNBVEUpOworCX0KKworCXJldHVybiB0cnVlOworfQorLy8KKy8vCURlc2NyaXB0aW9uOgorLy8JCUNoYW5nIFJGIFBvd2VyIFN0YXRlLgorLy8JCU5vdGUgdGhhdCwgb25seSBNZ250QWN0U2V0X1JGX1N0YXRlKCkgaXMgYWxsb3dlZCB0byBzZXQgSFdfVkFSX1JGX1NUQVRFLgorLy8KKy8vCUFzc3VtcHRpb246CisvLwkJUEFTU0lWRSBMRVZFTC4KKy8vCitib29sCitTZXRSRlBvd2VyU3RhdGUoCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwlSVF9SRl9QT1dFUl9TVEFURQllUkZQb3dlclN0YXRlCisJKQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gKHN0cnVjdCByODE4MF9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlib29sCQkJYlJlc3VsdCA9IGZhbHNlOworCisvLwlwcmludGsoIi0tLS0tLS0tLT4gU2V0UkZQb3dlclN0YXRlKCk6IGVSRlBvd2VyU3RhdGUoJWQpXG4iLCBlUkZQb3dlclN0YXRlKTsKKwlpZihlUkZQb3dlclN0YXRlID09IHByaXYtPmVSRlBvd2VyU3RhdGUpCisJeworLy8JCXByaW50aygiPC0tLS0tLS0tLSBTZXRSRlBvd2VyU3RhdGUoKTogZGlzY2FyZCB0aGUgcmVxdWVzdCBmb3IgZVJGUG93ZXJTdGF0ZSglZCkgaXMgdGhlIHNhbWUuXG4iLCBlUkZQb3dlclN0YXRlKTsKKwkJcmV0dXJuIGJSZXN1bHQ7CisJfQorCisJc3dpdGNoKHByaXYtPnJmX2NoaXApCisJeworCQljYXNlIFJGX1pFQlJBMjoKKwkJY2FzZSBSRl9aRUJSQTQ6CisJCQkgYlJlc3VsdCA9IFNldFplYnJhUkZQb3dlclN0YXRlODE4NShkZXYsIGVSRlBvd2VyU3RhdGUpOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCXByaW50aygiU2V0UkZQb3dlclN0YXRlODE4NSgpOiB1bmtub3duIFJGQ2hpcElEOiAweCVYISEhXG4iLCBwcml2LT5yZl9jaGlwKTsKKwkJCWJyZWFrOzsKK30KKy8vCXByaW50aygiPC0tLS0tLS0tLSBTZXRSRlBvd2VyU3RhdGUoKTogYlJlc3VsdCglZClcbiIsIGJSZXN1bHQpOworCisJcmV0dXJuIGJSZXN1bHQ7Cit9Cit2b2lkCitIYWxFbmFibGVSeDgxODVEdW1teSgKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2CisJKQoreworfQordm9pZAorSGFsRGlzYWJsZVJ4ODE4NUR1bW15KAorCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYKKwkpCit7Cit9CisKK2Jvb2wKK01nbnRBY3RTZXRfUkZfU3RhdGUoCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwlSVF9SRl9QT1dFUl9TVEFURQlTdGF0ZVRvU2V0LAorCXUzMglDaGFuZ2VTb3VyY2UKKwkpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTgwX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOworCWJvb2wJCQkJYkFjdGlvbkFsbG93ZWQgPSBmYWxzZTsKKwlib29sCQkJCWJDb25uZWN0QnlTU0lEID0gZmFsc2U7CisJUlRfUkZfUE9XRVJfU1RBVEUgCXJ0U3RhdGU7CisJdTE2CQkJCVJGV2FpdENvdW50ZXIgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZzsKKy8vCSBwcmludGsoIj09PT5NZ250QWN0U2V0X1JGX1N0YXRlKCk6IFN0YXRlVG9TZXQoJWQpLCBDaGFuZ2VTb3VyY2UoMHgleClcbiIsU3RhdGVUb1NldCwgQ2hhbmdlU291cmNlKTsKKwkvLworCS8vIFByZXZlbnQgdGhlIHJhY2UgY29uZGl0aW9uIG9mIFJGIHN0YXRlIGNoYW5nZS4gQnkgQnJ1Y2UsIDIwMDctMTEtMjguCisJLy8gT25seSBvbmUgdGhyZWFkIGNhbiBjaGFuZ2UgdGhlIFJGIHN0YXRlIGF0IG9uZSB0aW1lLCBhbmQgb3RoZXJzIHNob3VsZCB3YWl0IHRvIGJlIGV4ZWN1dGVkLgorCS8vCisjaWYgMQorCXdoaWxlKHRydWUpCisJeworLy8JCWRvd24oJnByaXYtPnJmX3N0YXRlKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnJmX3BzX2xvY2ssZmxhZyk7CisJCWlmKHByaXYtPlJGQ2hhbmdlSW5Qcm9ncmVzcykKKwkJeworLy8JCQlwcmludGsoIj09PT09PT09PT09PT09PT09PT09PmhhaGExMTExMTExMTFcbiIpOworLy8JCQl1cCgmcHJpdi0+cmZfc3RhdGUpOworLy8JCQlSVF9UUkFDRShDT01QX1JGLCBEQkdfTE9VRCwgKCJNZ250QWN0U2V0X1JGX1N0YXRlKCk6IFJGIENoYW5nZSBpbiBwcm9ncmVzcyEgV2FpdCB0byBzZXQuLlN0YXRlVG9TZXQoJWQpLlxuIiwgU3RhdGVUb1NldCkpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+cmZfcHNfbG9jayxmbGFnKTsKKwkJCS8vIFNldCBSRiBhZnRlciB0aGUgcHJldmlvdXMgYWN0aW9uIGlzIGRvbmUuCisJCQl3aGlsZShwcml2LT5SRkNoYW5nZUluUHJvZ3Jlc3MpCisJCQl7CisJCQkJUkZXYWl0Q291bnRlciArKzsKKy8vCQkJCVJUX1RSQUNFKENPTVBfUkYsIERCR19MT1VELCAoIk1nbnRBY3RTZXRfUkZfU3RhdGUoKTogV2FpdCAxIG1zICglZCB0aW1lcykuLi5cbiIsIFJGV2FpdENvdW50ZXIpKTsKKwkJCQl1ZGVsYXkoMTAwMCk7IC8vIDEgbXMKKworCQkJCS8vIFdhaXQgdG9vIGxvbmcsIHJldHVybiBGQUxTRSB0byBhdm9pZCB0byBiZSBzdHVjayBoZXJlLgorCQkJCWlmKFJGV2FpdENvdW50ZXIgPiAxMDAwKSAvLyAxc2VjCisJCQkJeworLy8JCQkJCVJUX0FTU0VSVChGQUxTRSwgKCJNZ250QWN0U2V0X1JGX1N0YXRlKCk6IFdhaXQgdG9vIGxvZ24gdG8gc2V0IFJGXG4iKSk7CisJCQkJCXByaW50aygiTWdudEFjdFNldF9SRl9TdGF0ZSgpOiBXYWl0IHRvbyBsb25nIHRvIHNldCBSRlxuIik7CisJCQkJCS8vIFRPRE86IFJlc2V0IFJGIHN0YXRlPworCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJfQorCQkJfQorCQl9CisJCWVsc2UKKwkJeworLy8JCQlwcmludGsoIj09PT09PT09PT09PT09PT09PT09PT09PT5oYWhhMlxuIik7CisJCQlwcml2LT5SRkNoYW5nZUluUHJvZ3Jlc3MgPSB0cnVlOworLy8JCQl1cCgmcHJpdi0+cmZfc3RhdGUpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+cmZfcHNfbG9jayxmbGFnKTsKKwkJCWJyZWFrOworCQl9CisJfQorI2VuZGlmCisJcnRTdGF0ZSA9IHByaXYtPmVSRlBvd2VyU3RhdGU7CisKKworCXN3aXRjaChTdGF0ZVRvU2V0KQorCXsKKwljYXNlIGVSZk9uOgorCQkvLworCQkvLyBUdXJuIE9uIFJGIG5vIG1hdHRlciB0aGUgSVBTIHNldHRpbmcgYmVjYXVzZSB3ZSBuZWVkIHRvIHVwZGF0ZSB0aGUgUkYgc3RhdGUgdG8gTmRpcyB1bmRlciBWaXN0YSwgb3IKKwkJLy8gdGhlIFdpbmRvd3MgZG9lcyBub3QgYWxsb3cgdGhlIGRyaXZlciB0byBwZXJmb3JtIHNpdGUgc3VydmV5IGFueSBtb3JlLiBCeSBCcnVjZSwgMjAwNy0xMC0wMi4KKwkJLy8KKwkJcHJpdi0+UmZPZmZSZWFzb24gJj0gKH5DaGFuZ2VTb3VyY2UpOworCisJCWlmKCEgcHJpdi0+UmZPZmZSZWFzb24pCisJCXsKKwkJCXByaXYtPlJmT2ZmUmVhc29uID0gMDsKKwkJCWJBY3Rpb25BbGxvd2VkID0gdHJ1ZTsKKworCQkJaWYocnRTdGF0ZSA9PSBlUmZPZmYgJiYgQ2hhbmdlU291cmNlID49UkZfQ0hBTkdFX0JZX0hXICYmICFwcml2LT5iSW5IY3RUZXN0KQorCQkJeworCQkJCWJDb25uZWN0QnlTU0lEID0gdHJ1ZTsKKwkJCX0KKwkJfQorCQllbHNlCisvLwkJCVJUX1RSQUNFKENPTVBfUkYsIERCR19MT1VELCAoIk1nbnRBY3RTZXRfUkZfU3RhdGUgLSBlUmZvbiByZWplY3QgcE1nbnRJbmZvLT5SZk9mZlJlYXNvbj0gMHgleCwgQ2hhbmdlU291cmNlPTB4JVhcbiIsIHBNZ250SW5mby0+UmZPZmZSZWFzb24sIENoYW5nZVNvdXJjZSkpOworCQkJOworCQlicmVhazsKKworCWNhc2UgZVJmT2ZmOgorCQkgLy8gMDcwMTI1LCByY25qa286IHdlIGFsd2F5cyBrZWVwIGNvbm5lY3RlZCBpbiBBUCBtb2RlLgorCisJCQlpZiAocHJpdi0+UmZPZmZSZWFzb24gPiBSRl9DSEFOR0VfQllfSVBTKQorCQkJeworCQkJCS8vCisJCQkJLy8gMDYwODA4LCBBbm5pZToKKwkJCQkvLyBEaXNjb25uZWN0IHRvIGN1cnJlbnQgQlNTIHdoZW4gcmFkaW8gb2ZmLiBBc2tlZCBieSBRdWFuVGEuCisJCQkJLy8KKworCQkJCS8vCisJCQkJLy8gQ2FsbGluZyBNZ250RGlzY29ubmVjdCgpIGluc3RlYWQgb2YgTWdudEFjdFNldF84MDJfMTFfRElTQVNTT0NJQVRFKCksCisJCQkJLy8gYmVjYXVzZSB3ZSBkbyBOT1QgbmVlZCB0byBzZXQgc3NpZCB0byBkdW1teSBvbmVzLgorCQkJCS8vIFJldmlzZWQgYnkgUm9nZXIsIDIwMDcuMTIuMDQuCisJCQkJLy8KKwkJCQlNZ250RGlzY29ubmVjdCggZGV2LCBkaXNhc19sdl9zcyApOworCisJCQkJLy8gQ2xlYXIgY29udGVudCBvZiBic3NEZXNjW10gYW5kIGJzc0Rlc2M0UXVlcnlbXSB0byBhdm9pZCByZXBvcnRpbmcgb2xkIGJzcyB0byBVSS4KKwkJCQkvLyAyMDA3LjA1LjI4LCBieSBzaGllbiBjaGFuZy4KKy8vCQkJCVBsYXRmb3JtWmVyb01lbW9yeSggcE1nbnRJbmZvLT5ic3NEZXNjLCBzaXplb2YoUlRfV0xBTl9CU1MpKk1BWF9CU1NfREVTQyApOworLy8JCQkJcE1nbnRJbmZvLT5OdW1Cc3NEZXNjID0gMDsKKy8vCQkJCVBsYXRmb3JtWmVyb01lbW9yeSggcE1nbnRJbmZvLT5ic3NEZXNjNFF1ZXJ5LCBzaXplb2YoUlRfV0xBTl9CU1MpKk1BWF9CU1NfREVTQyApOworLy8JCQkJcE1nbnRJbmZvLT5OdW1Cc3NEZXNjNFF1ZXJ5ID0gMDsKKwkJCX0KKworCisKKwkJcHJpdi0+UmZPZmZSZWFzb24gfD0gQ2hhbmdlU291cmNlOworCQliQWN0aW9uQWxsb3dlZCA9IHRydWU7CisJCWJyZWFrOworCisJY2FzZSBlUmZTbGVlcDoKKwkJcHJpdi0+UmZPZmZSZWFzb24gfD0gQ2hhbmdlU291cmNlOworCQliQWN0aW9uQWxsb3dlZCA9IHRydWU7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJaWYoYkFjdGlvbkFsbG93ZWQpCisJeworLy8JCVJUX1RSQUNFKENPTVBfUkYsIERCR19MT1VELCAoIk1nbnRBY3RTZXRfUkZfU3RhdGUoKTogQWN0aW9uIGlzIGFsbG93ZWQuLi4uIFN0YXRlVG9TZXQoJWQpLCBSZk9mZlJlYXNvbiglI1gpXG4iLCBTdGF0ZVRvU2V0LCBwTWdudEluZm8tPlJmT2ZmUmVhc29uKSk7CisgICAgICAgICAgICAgICAgLy8gQ29uZmlnIEhXIHRvIHRoZSBzcGVjaWZpZWQgbW9kZS4KKy8vCQlwcmludGsoIk1nbnRBY3RTZXRfUkZfU3RhdGUoKTogQWN0aW9uIGlzIGFsbG93ZWQuLi4uIFN0YXRlVG9TZXQoJWQpLCBSZk9mZlJlYXNvbiglI1gpXG4iLCBTdGF0ZVRvU2V0LCBwcml2LT5SZk9mZlJlYXNvbik7CisJCVNldFJGUG93ZXJTdGF0ZShkZXYsIFN0YXRlVG9TZXQpOworCisJCS8vIFR1cm4gb24gUkYuCisJCWlmKFN0YXRlVG9TZXQgPT0gZVJmT24pCisJCXsKKwkJCUhhbEVuYWJsZVJ4ODE4NUR1bW15KGRldik7CisJCQlpZihiQ29ubmVjdEJ5U1NJRCkKKwkJCXsKKwkJCS8vIGJ5IGFteSBub3Qgc3VwcG9ydGVkCisvLwkJCQlNZ250QWN0U2V0XzgwMl8xMV9TU0lEKEFkYXB0ZXIsIEFkYXB0ZXItPk1nbnRJbmZvLlNzaWQuT2N0ZXQsIEFkYXB0ZXItPk1nbnRJbmZvLlNzaWQuTGVuZ3RoLCBUUlVFICk7CisJCQl9CisJCX0KKwkJLy8gVHVybiBvZmYgUkYuCisJCWVsc2UgaWYoU3RhdGVUb1NldCA9PSBlUmZPZmYpCisJCXsKKwkJCUhhbERpc2FibGVSeDgxODVEdW1teShkZXYpOworCQl9CisJfQorCWVsc2UKKwl7CisJLy8JcHJpbnRrKCJNZ250QWN0U2V0X1JGX1N0YXRlKCk6IEFjdGlvbiBpcyByZWplY3RlZC4uLi4gU3RhdGVUb1NldCglZCksIENoYW5nZVNvdXJjZSglI1gpLCBSZk9mZlJlYXNvbiglI1gpXG4iLCBTdGF0ZVRvU2V0LCBDaGFuZ2VTb3VyY2UsIHByaXYtPlJmT2ZmUmVhc29uKTsKKwl9CisKKwkvLyBSZWxlYXNlIFJGIHNwaW5sb2NrCisvLwlkb3duKCZwcml2LT5yZl9zdGF0ZSk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnJmX3BzX2xvY2ssZmxhZyk7CisJcHJpdi0+UkZDaGFuZ2VJblByb2dyZXNzID0gZmFsc2U7CisvLwl1cCgmcHJpdi0+cmZfc3RhdGUpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnJmX3BzX2xvY2ssZmxhZyk7CisvLwlwcmludGsoIjw9PT1NZ250QWN0U2V0X1JGX1N0YXRlKClcbiIpOworCXJldHVybiBiQWN0aW9uQWxsb3dlZDsKK30KK3ZvaWQKK0luYWN0aXZlUG93ZXJTYXZlKAorCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYKKwkpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTgwX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOworCS8vdTggaW5kZXggPSAwOworCisJLy8KKwkvLyBUaGlzIGZsYWcgImJTd1JmUHJvY2Vzc2luZyIsIGluZGljYXRlcyB0aGUgc3RhdHVzIG9mIElQUyBwcm9jZWR1cmUsIHNob3VsZCBiZSBzZXQgaWYgdGhlIElQUyB3b3JraXRlbQorCS8vIGlzIHJlYWxseSBzY2hlZHVsZWQuCisJLy8gVGhlIG9sZCBjb2RlLCBzZXRzIHRoaXMgZmxhZyBiZWZvcmUgc2NoZWR1bGluZyB0aGUgSVBTIHdvcmtpdGVtIGFuZCBob3dldmVyLCBhdCB0aGUgc2FtZSB0aW1lIHRoZQorCS8vIHByZXZpb3VzIElQUyB3b3JraXRlbSBkaWQgbm90IGVuZCB5ZXQsIGZhaWxzIHRvIHNjaGVkdWxlIHRoZSBjdXJyZW50IHdvcmtpdGVtLiBUaHVzLCBiU3dSZlByb2Nlc3NpbmcKKwkvLyBibG9ja3MgdGhlIElQUyBwcm9jZWR1cmUgb2Ygc3dpdGNoaW5nIFJGLgorCS8vIEJ5IEJydWNlLCAyMDA3LTEyLTI1LgorCS8vCisJcHJpdi0+YlN3UmZQcm9jZXNzaW5nID0gdHJ1ZTsKKworCU1nbnRBY3RTZXRfUkZfU3RhdGUoZGV2LCBwcml2LT5lSW5hY3RpdmVQb3dlclN0YXRlLCBSRl9DSEFOR0VfQllfSVBTKTsKKworCS8vCisJLy8gVG8gc29sdmUgQ0FNIHZhbHVlcyBtaXNzIGluIFJGIE9GRiwgcmV3cml0ZSBDQU0gdmFsdWVzIGFmdGVyIFJGIE9OLiBCeSBCcnVjZSwgMjAwNy0wOS0yMC4KKwkvLworI2lmIDAKKwl3aGlsZSggaW5kZXggPCA0ICkKKwl7CisJCWlmKCAoIHBNZ250SW5mby0+U2VjdXJpdHlJbmZvLlBhaXJ3aXNlRW5jQWxnb3JpdGhtID09IFdFUDEwNF9FbmNyeXB0aW9uICkgfHwKKwkJCShwTWdudEluZm8tPlNlY3VyaXR5SW5mby5QYWlyd2lzZUVuY0FsZ29yaXRobSA9PSBXRVA0MF9FbmNyeXB0aW9uKSApCisJCXsKKwkJCWlmKCBwTWdudEluZm8tPlNlY3VyaXR5SW5mby5LZXlMZW5baW5kZXhdICE9IDApCisJCQlwQWRhcHRlci0+SGFsRnVuYy5TZXRLZXlIYW5kbGVyKHBBZGFwdGVyLCBpbmRleCwgMCwgRkFMU0UsIHBNZ250SW5mby0+U2VjdXJpdHlJbmZvLlBhaXJ3aXNlRW5jQWxnb3JpdGhtLCBUUlVFLCBGQUxTRSk7CisKKwkJfQorCQlpbmRleCsrOworCX0KKyNlbmRpZgorCXByaXYtPmJTd1JmUHJvY2Vzc2luZyA9IGZhbHNlOworfQorCisvLworLy8JRGVzY3JpcHRpb246CisvLwkJRW50ZXIgdGhlIGluYWN0aXZlIHBvd2VyIHNhdmUgbW9kZS4gUkYgd2lsbCBiZSBvZmYKKy8vCTIwMDcuMDguMTcsIGJ5IHNoaWVuIGNoYW5nLgorLy8KK3ZvaWQKK0lQU0VudGVyKAorCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYKKwkpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTgwX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOworCVJUX1JGX1BPV0VSX1NUQVRFIHJ0U3RhdGU7CisJLy9wcmludGsoIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT5lbnRlciBJUFNcbiIpOworCWlmIChwcml2LT5iSW5hY3RpdmVQcykKKwl7CisJCXJ0U3RhdGUgPSBwcml2LT5lUkZQb3dlclN0YXRlOworCisJCS8vCisJCS8vIEFkZGVkIGJ5IEJydWNlLCAyMDA3LTEyLTI1LgorCQkvLyBEbyBub3QgZW50ZXIgSVBTIGluIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKwkJLy8gKDEpIFJGIGlzIGFscmVhZHkgT0ZGIG9yIFNsZWVwCisJCS8vICgyKSBiU3dSZlByb2Nlc3NpbmcgKGluZGljYXRlcyB0aGUgSVBTIGlzIHN0aWxsIHVuZGVyIGdvaW5nKQorCQkvLyAoMykgQ29ubmVjdHRlZCAob25seSBkaXNjb25uZWN0ZWQgY2FuIHRyaWdnZXIgSVBTKQorCQkvLyAoNCkgSUJTUyAoc2VuZCBCZWFjb24pCisJCS8vICg1KSBBUCBtb2RlIChzZW5kIEJlYWNvbikKKwkJLy8KKwkJaWYgKHJ0U3RhdGUgPT0gZVJmT24gJiYgIXByaXYtPmJTd1JmUHJvY2Vzc2luZworCQkJJiYgKHByaXYtPmllZWU4MDIxMS0+c3RhdGUgIT0gSUVFRTgwMjExX0xJTktFRCApKQorCQl7CisJLy8JCXByaW50aygiSVBTRW50ZXIoKTogVHVybiBvZmYgUkYuXG4iKTsKKwkJCXByaXYtPmVJbmFjdGl2ZVBvd2VyU3RhdGUgPSBlUmZPZmY7CisJCQlJbmFjdGl2ZVBvd2VyU2F2ZShkZXYpOworCQl9CisJfQorLy8JcHJpbnRrKCJwcml2LT5lUkZQb3dlclN0YXRlIGlzICVkXG4iLHByaXYtPmVSRlBvd2VyU3RhdGUpOworfQordm9pZAorSVBTTGVhdmUoCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldgorCSkKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxODBfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CisJUlRfUkZfUE9XRVJfU1RBVEUgcnRTdGF0ZTsKKwkvL3ByaW50aygiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0+bGVhdmUgSVBTXG4iKTsKKwlpZiAocHJpdi0+YkluYWN0aXZlUHMpCisJeworCQlydFN0YXRlID0gcHJpdi0+ZVJGUG93ZXJTdGF0ZTsKKwkJaWYgKChydFN0YXRlID09IGVSZk9mZiB8fCBydFN0YXRlID09IGVSZlNsZWVwKSAmJiAoIXByaXYtPmJTd1JmUHJvY2Vzc2luZykgJiYgcHJpdi0+UmZPZmZSZWFzb24gPD0gUkZfQ0hBTkdFX0JZX0lQUykKKwkJeworLy8JCQlwcmludGsoIklQU0xlYXZlKCk6IFR1cm4gb24gUkYuXG4iKTsKKwkJCXByaXYtPmVJbmFjdGl2ZVBvd2VyU3RhdGUgPSBlUmZPbjsKKwkJCUluYWN0aXZlUG93ZXJTYXZlKGRldik7CisJCX0KKwl9CisvLwlwcmludGsoInByaXYtPmVSRlBvd2VyU3RhdGUgaXMgJWRcbiIscHJpdi0+ZVJGUG93ZXJTdGF0ZSk7Cit9CisvL2J5IGFteSBmb3IgcG93ZXIgc2F2ZQordm9pZCBydGw4MTg1Yl9hZGFwdGVyX3N0YXJ0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgICBzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUgPSBwcml2LT5pZWVlODAyMTE7CisKKwl1OCBTdXBwb3J0ZWRXaXJlbGVzc01vZGU7CisJdTgJCQlJbml0V2lyZWxlc3NNb2RlOworCXU4CQkJYkludmFsaWRXaXJlbGVzc01vZGUgPSAwOworCS8vaW50IGk7CisJdTggdG1wdTg7CisgICAgCS8vdTggdTF0bXAsdTJ0bXA7CisJdTggYnRDUjkzNDY7CisJdTggVG1wVTFiOworCXU4IGJ0UFNSOworCisJLy9ydGw4MTgwX3J0eF9kaXNhYmxlKGRldik7CisvL3tieSBhbXkgMDgwMzEyCisJd3JpdGVfbmljX2J5dGUoZGV2LDB4MjRlLCAoQklUNXxCSVQ2fEJJVDApKTsKKy8vYnkgYW15IDA4MDMxMn0KKwlydGw4MTgwX3Jlc2V0KGRldik7CisKKwlwcml2LT5kbWFfcG9sbF9tYXNrID0gMDsKKwlwcml2LT5kbWFfcG9sbF9zdG9wX21hc2sgPSAwOworCisJLy9ydGw4MTgwX2JlYWNvbl90eF9kaXNhYmxlKGRldik7CisKKwlId0NvbmZpZ3VyZVJUTDgxODUoZGV2KTsKKworCXdyaXRlX25pY19kd29yZChkZXYsIE1BQzAsICgodTMyKilkZXYtPmRldl9hZGRyKVswXSk7CisJd3JpdGVfbmljX3dvcmQoZGV2LCBNQUM0LCAoKHUzMiopZGV2LT5kZXZfYWRkcilbMV0gJiAweGZmZmYgKTsKKworCXdyaXRlX25pY19ieXRlKGRldiwgTVNSLCByZWFkX25pY19ieXRlKGRldiwgTVNSKSAmIDB4ZjMpOwkvLyBkZWZhdWx0IG5ldHdvcmsgdHlwZSB0byAnTm8JTGluaycKKworCS8vd3JpdGVfbmljX2J5dGUoZGV2LCBCUlNSLCAweDApOwkJLy8gU2V0IEJSU1I9IDFNCisKKwl3cml0ZV9uaWNfd29yZChkZXYsIEJjbkl0diwgMTAwKTsKKwl3cml0ZV9uaWNfd29yZChkZXYsIEF0aW1XbmQsIDIpOworCisJLy9QbGF0Zm9ybUVGSU9Xcml0ZTJCeXRlKGRldiwgRkVNUiwgMHhGRkZGKTsKKwlQbGF0Zm9ybUlPV3JpdGUyQnl0ZShkZXYsIEZFTVIsIDB4RkZGRik7CisKKwl3cml0ZV9uaWNfYnl0ZShkZXYsIFdQQV9DT05GSUcsIDApOworCisJTWFjQ29uZmlnXzg1QkFTSUMoZGV2KTsKKworCS8vIE92ZXJyaWRlIHRoZSBSRlNXX0NUUkwgKE1BQyBvZmZzZXQgMHgyNzItMHgyNzMpLCAyMDA2LjA2LjA3LCBieSByY25qa28uCisJLy8gQlRfREVNT19CT0FSRCB0eXBlCisJUGxhdGZvcm1JT1dyaXRlMkJ5dGUoZGV2LCBSRlNXX0NUUkwsIDB4NTY5YSk7CisvL2J5IGFteQorLy8jaWZkZWYgQ09ORklHX1JUTDgxOFhfUworCQkvLyBmb3Igam9uZyByZXF1aXJlZAorLy8JUGxhdGZvcm1JT1dyaXRlMkJ5dGUoZGV2LCBSRlNXX0NUUkwsIDB4OWE1Nik7CisvLyNlbmRpZgorLy9ieSBhbXkKKwkvL0JUX1FBX0JPQVJECisJLy9QbGF0Zm9ybUlPV3JpdGUyQnl0ZShkZXYsIFJGU1dfQ1RSTCwgMHg5YTU2KTsKKworCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkvLyBTZXQgdXAgUEhZIHJlbGF0ZWQuCisJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCS8vIEVuYWJsZSBDb25maWczLlBBUkFNX0VuIHRvIHJldmlzZSBBbmFhUGFybS4KKwl3cml0ZV9uaWNfYnl0ZShkZXYsIENSOTM0NiwgMHhjMCk7CS8vIGVuYWJsZSBjb25maWcgcmVnaXN0ZXIgd3JpdGUKKy8vYnkgYW15CisJdG1wdTggPSByZWFkX25pY19ieXRlKGRldiwgQ09ORklHMyk7CisjaWZkZWYgQ09ORklHX1JUTDgxOFhfUworCXdyaXRlX25pY19ieXRlKGRldiwgQ09ORklHMywgKHRtcHU4IHxDT05GSUczX1BBUk1fRW4pICk7CisjZWxzZQorCXdyaXRlX25pY19ieXRlKGRldiwgQ09ORklHMywgKHRtcHU4IHxDT05GSUczX1BBUk1fRW4gfCBDT05GSUczX0NMS1JVTl9FbikgKTsKKyNlbmRpZgorLy9ieSBhbXkKKwkvLyBUdXJuIG9uIEFuYWxvZyBwb3dlci4KKwkvLyBBc2tlZCBmb3IgYnkgV2lsbGlhbSwgb3RoZXJ3aXNlLCBNQUMgMy13aXJlIGNhbid0IHdvcmssIDIwMDYuMDYuMjcsIGJ5IHJjbmprby4KKwl3cml0ZV9uaWNfZHdvcmQoZGV2LCBBTkFQQVJBTTIsIEFOQVBBUk0yX0FTSUNfT04pOworCXdyaXRlX25pY19kd29yZChkZXYsIEFOQVBBUkFNLCBBTkFQQVJNX0FTSUNfT04pOworLy9ieSBhbXkKKyNpZmRlZiBDT05GSUdfUlRMODE4WF9TCisJd3JpdGVfbmljX3dvcmQoZGV2LCBBTkFQQVJBTTMsIDB4MDAxMCk7CisjZWxzZQorICAgICAgd3JpdGVfbmljX2J5dGUoZGV2LCBBTkFQQVJBTTMsIDB4MDApOworI2VuZGlmCisvL2J5IGFteQorCisJd3JpdGVfbmljX2J5dGUoZGV2LCBDT05GSUczLCB0bXB1OCk7CisJd3JpdGVfbmljX2J5dGUoZGV2LCBDUjkzNDYsIDB4MDApOworLy97YnkgYW15IDA4MDMxMiBmb3IgbGVkCisJLy8gZW5hYmxlIEVFTTAgYW5kIEVFTTEgaW4gOTM0NkNSCisJYnRDUjkzNDYgPSByZWFkX25pY19ieXRlKGRldiwgQ1I5MzQ2KTsKKwl3cml0ZV9uaWNfYnl0ZShkZXYsIENSOTM0NiwgKGJ0Q1I5MzQ2fDB4QzApICk7CisKKwkvLyBCIGN1dCB1c2UgTEVEMSB0byBjb250cm9sIEhXIFJGIG9uL29mZgorCVRtcFUxYiA9IHJlYWRfbmljX2J5dGUoZGV2LCBDT05GSUc1KTsKKwlUbXBVMWIgPSBUbXBVMWIgJiB+QklUMzsKKwl3cml0ZV9uaWNfYnl0ZShkZXYsQ09ORklHNSwgVG1wVTFiKTsKKworCS8vIGRpc2FibGUgRUVNMCBhbmQgRUVNMSBpbiA5MzQ2Q1IKKwlidENSOTM0NiAmPSB+KDB4QzApOworCXdyaXRlX25pY19ieXRlKGRldiwgQ1I5MzQ2LCBidENSOTM0Nik7CisKKwkvL0VuYWJsZSBMZWQgKHN1Z2dlc3RlZCBieSBKb25nKQorCS8vIEItY3V0IFJGIFJhZGlvIG9uL29mZiAgNWVbM109MAorCWJ0UFNSID0gcmVhZF9uaWNfYnl0ZShkZXYsIFBTUik7CisJd3JpdGVfbmljX2J5dGUoZGV2LCBQU1IsIChidFBTUiB8IEJJVDMpKTsKKy8vYnkgYW15IDA4MDMxMiBmb3IgbGVkfQorCS8vIHNldHVwIGluaXRpYWwgdGltaW5nIGZvciBSRkUuCisJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQsIDB4MDQ4MCk7CisJU2V0T3V0cHV0RW5hYmxlT2ZSZlBpbnMoZGV2KTsKKwl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc1NlbGVjdCwgMHgyNDg4KTsKKworCS8vIFBIWSBjb25maWcuCisJUGh5Q29uZmlnODE4NShkZXYpOworCisJLy8gV2UgYXNzdW1lIFJlZ1dpcmVsZXNzTW9kZSBoYXMgYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkIGJlZm9yZSwKKwkvLyBob3dldmVyLCB3ZSBoYXMgdG8gdmFsaWRhdGUgdGhlIHdpcmVsZXNzIG1vZGUgaGVyZSBhbmQgcHJvdmlkZSBhIHJlYXNvbmJsZQorCS8vIGluaXRpYWxpemVkIHZhbHVlIGlmIG5lY2Vzc2FyeS4gMjAwNS4wMS4xMywgYnkgcmNuamtvLgorCVN1cHBvcnRlZFdpcmVsZXNzTW9kZSA9IEdldFN1cHBvcnRlZFdpcmVsZXNzTW9kZTgxODUoZGV2KTsKKwlpZigJKGllZWUtPm1vZGUgIT0gV0lSRUxFU1NfTU9ERV9CKSAmJgorCQkoaWVlZS0+bW9kZSAhPSBXSVJFTEVTU19NT0RFX0cpICYmCisJCShpZWVlLT5tb2RlICE9IFdJUkVMRVNTX01PREVfQSkgJiYKKwkJKGllZWUtPm1vZGUgIT0gV0lSRUxFU1NfTU9ERV9BVVRPKSkKKwl7IC8vIEl0IHNob3VsZCBiZSBvbmUgb2YgQiwgRywgQSwgb3IgQVVUTy4KKwkJYkludmFsaWRXaXJlbGVzc01vZGUgPSAxOworCX0KKwllbHNlCisJeyAvLyBPbmUgb2YgQiwgRywgQSwgb3IgQVVUTy4KKwkJLy8gQ2hlY2sgaWYgdGhlIHdpcmVsZXNzIG1vZGUgaXMgc3VwcG9ydGVkIGJ5IFJGLgorCQlpZiggKGllZWUtPm1vZGUgIT0gV0lSRUxFU1NfTU9ERV9BVVRPKSAmJgorCQkJKGllZWUtPm1vZGUgJiBTdXBwb3J0ZWRXaXJlbGVzc01vZGUpID09IDAgKQorCQl7CisJCQliSW52YWxpZFdpcmVsZXNzTW9kZSA9IDE7CisJCX0KKwl9CisKKwlpZihiSW52YWxpZFdpcmVsZXNzTW9kZSB8fCBpZWVlLT5tb2RlPT1XSVJFTEVTU19NT0RFX0FVVE8pCisJeyAvLyBBdXRvIG9yIG90aGVyIGludmFsaWQgdmFsdWUuCisJCS8vIEFzc2lnbmUgYSB3aXJlbGVzcyBtb2RlIHRvIGluaXRpYWxpemUuCisJCWlmKChTdXBwb3J0ZWRXaXJlbGVzc01vZGUgJiBXSVJFTEVTU19NT0RFX0EpKQorCQl7CisJCQlJbml0V2lyZWxlc3NNb2RlID0gV0lSRUxFU1NfTU9ERV9BOworCQl9CisJCWVsc2UgaWYoKFN1cHBvcnRlZFdpcmVsZXNzTW9kZSAmIFdJUkVMRVNTX01PREVfRykpCisJCXsKKwkJCUluaXRXaXJlbGVzc01vZGUgPSBXSVJFTEVTU19NT0RFX0c7CisJCX0KKwkJZWxzZSBpZigoU3VwcG9ydGVkV2lyZWxlc3NNb2RlICYgV0lSRUxFU1NfTU9ERV9CKSkKKwkJeworCQkJSW5pdFdpcmVsZXNzTW9kZSA9IFdJUkVMRVNTX01PREVfQjsKKwkJfQorCQllbHNlCisJCXsKKwkJCURNRVNHVygiSW5pdGlhbGl6ZUFkYXB0ZXI4MTg1KCk6IE5vIHZhbGlkIHdpcmVsZXNzIG1vZGUgc3VwcG9ydGVkLCBTdXBwb3J0ZWRXaXJlbGVzc01vZGUoJXgpISEhXG4iLAorCQkJCSBTdXBwb3J0ZWRXaXJlbGVzc01vZGUpOworCQkJSW5pdFdpcmVsZXNzTW9kZSA9IFdJUkVMRVNTX01PREVfQjsKKwkJfQorCisJCS8vIEluaXRpYWxpemUgUmVnV2lyZWxlc3NNb2RlIGlmIGl0IGlzIG5vdCBhIHZhbGlkIG9uZS4KKwkJaWYoYkludmFsaWRXaXJlbGVzc01vZGUpCisJCXsKKwkJCWllZWUtPm1vZGUgPSAoV0lSRUxFU1NfTU9ERSlJbml0V2lyZWxlc3NNb2RlOworCQl9CisJfQorCWVsc2UKKwl7IC8vIE9uZSBvZiBCLCBHLCBBLgorCQlJbml0V2lyZWxlc3NNb2RlID0gaWVlZS0+bW9kZTsKKwl9CisvL2J5IGFteSBmb3IgcG93ZXIgc2F2ZQorI2lmZGVmIEVOQUJMRV9JUFMKKy8vCXByaW50aygiaW5pdGlhbGl6ZSBFTkFCTEVfSVBTXG4iKTsKKwlwcml2LT5lUkZQb3dlclN0YXRlID0gZVJmT2ZmOworCXByaXYtPlJmT2ZmUmVhc29uID0gMDsKKwl7CisJLy8JdTMyIHRtcDI7CisJLy8JdTMyIHRtcCA9IGppZmZpZXM7CisJCU1nbnRBY3RTZXRfUkZfU3RhdGUoZGV2LCBlUmZPbiwgMCk7CisJLy8JdG1wMiA9IGppZmZpZXM7CisJLy8JcHJpbnRrKCJyZiBvbiBjb3N0IGppZmZpZXM6JWx4XG4iLCAodG1wMi10bXApKjEwMDAvSFopOworCX0KKy8vCURydklGSW5kaWNhdGVDdXJyZW50UGh5U3RhdHVzKHByaXYpOworCQkvLworCQkvLyBJZiBpbmFjdGl2ZSBwb3dlciBtb2RlIGlzIGVuYWJsZWQsIGRpc2FibGUgcmYgd2hpbGUgaW4gZGlzY29ubmVjdGVkIHN0YXRlLgorCQkvLyAyMDA3LjA3LjE2LCBieSBzaGllbiBjaGFuZy4KKwkJLy8KKwlpZiAocHJpdi0+YkluYWN0aXZlUHMpCisJeworCS8vCXUzMiB0bXAyOworCS8vCXUzMiB0bXAgPSBqaWZmaWVzOworCQlNZ250QWN0U2V0X1JGX1N0YXRlKGRldixlUmZPZmYsIFJGX0NIQU5HRV9CWV9JUFMpOworCS8vCXRtcDIgPSBqaWZmaWVzOworCS8vCXByaW50aygicmYgb2ZmIGNvc3QgamlmZmllczolbHhcbiIsICh0bXAyLXRtcCkqMTAwMC9IWik7CisKKwl9CisjZW5kaWYKKy8vCUlQU0VudGVyKGRldik7CisvL2J5IGFteSBmb3IgcG93ZXIgc2F2ZQorI2lmZGVmIFRPRE8KKwkvLyBUdXJuIG9mZiBSRiBpZiBuZWNlc3NhcnkuIDIwMDUuMDguMjMsIGJ5IHJjbmprby4KKwkvLyBXZSBzaGFsbCB0dXJuIG9mZiBSRiBhZnRlciBzZXR0aW5nIENNRFIsIG90aGVyd2lzZSwKKwkvLyBSRiB3aWxsIGJlIHR1cm5uZWQgb24gYWZ0ZXIgd2UgZW5hYmxlIE1BQyBUeC9SeC4KKwlpZihBZGFwdGVyLT5NZ250SW5mby5SZWdSZk9mZiA9PSBUUlVFKQorCXsKKwkJU2V0UkZQb3dlclN0YXRlODE4NShBZGFwdGVyLCBSRl9PRkYpOworCX0KKwllbHNlCisJeworCQlTZXRSRlBvd2VyU3RhdGU4MTg1KEFkYXB0ZXIsIFJGX09OKTsKKwl9CisjZW5kaWYKKworLyogICAvL3RoZXNlIGlzIGVxdWFsIHdpdGggYWJvdmUgVE9ETy4KKwl3cml0ZV9uaWNfYnl0ZShkZXYsIENSOTM0NiwgMHhjMCk7CS8vIGVuYWJsZSBjb25maWcgcmVnaXN0ZXIgd3JpdGUKKwl3cml0ZV9uaWNfYnl0ZShkZXYsIENPTkZJRzMsIHJlYWRfbmljX2J5dGUoZGV2LCBDT05GSUczKSB8IENPTkZJRzNfUEFSTV9Fbik7CisJUkZfV3JpdGVSZWcoZGV2LCAweDQsIDB4OUZGKTsKKwl3cml0ZV9uaWNfZHdvcmQoZGV2LCBBTkFQQVJBTTIsIEFOQVBBUk0yX0FTSUNfT04pOworCXdyaXRlX25pY19kd29yZChkZXYsIEFOQVBBUkFNLCBBTkFQQVJNX0FTSUNfT04pOworCXdyaXRlX25pY19ieXRlKGRldiwgQ09ORklHMywgKHJlYWRfbmljX2J5dGUoZGV2LCBDT05GSUczKSYofkNPTkZJRzNfUEFSTV9FbikpKTsKKwl3cml0ZV9uaWNfYnl0ZShkZXYsIENSOTM0NiwgMHgwMCk7CisqLworCisJQWN0U2V0V2lyZWxlc3NNb2RlODE4NShkZXYsICh1OCkoSW5pdFdpcmVsZXNzTW9kZSkpOworCisJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisJcnRsODE4NWJfaXJxX2VuYWJsZShkZXYpOworCisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKworIH0KKworCit2b2lkIHJ0bDgxODViX3J4X2VuYWJsZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXU4IGNtZDsKKwkvL3UzMiByeGNvbmY7CisJLyogZm9yIG5vdyB3ZSBhY2NlcHQgZGF0YSwgbWFuYWdlbWVudCAmIGN0bCBmcmFtZSovCisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTgwX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOworI2lmIDAKKwlyeGNvbmY9cmVhZF9uaWNfZHdvcmQoZGV2LFJYX0NPTkYpOworCXJ4Y29uZiA9IHJ4Y29uZiAmfiBNQUNfRklMVEVSX01BU0s7CisJcnhjb25mID0gcnhjb25mIHwgKDE8PEFDQ0VQVF9NTkdfRlJBTUVfU0hJRlQpOworCXJ4Y29uZiA9IHJ4Y29uZiB8ICgxPDxBQ0NFUFRfREFUQV9GUkFNRV9TSElGVCk7CisJcnhjb25mID0gcnhjb25mIHwgKDE8PEFDQ0VQVF9CQ0FTVF9GUkFNRV9TSElGVCk7CisJcnhjb25mID0gcnhjb25mIHwgKDE8PEFDQ0VQVF9NQ0FTVF9GUkFNRV9TSElGVCk7CisvLwlyeGNvbmYgPSByeGNvbmYgfCAoMTw8QUNDRVBUX0NSQ0VSUl9GUkFNRV9TSElGVCk7CisJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgRE1FU0cgKCJOSUMgaW4gcHJvbWlzYyBtb2RlIik7CisKKwlpZihwcml2LT5pZWVlODAyMTEtPml3X21vZGUgPT0gSVdfTU9ERV9NT05JVE9SIHx8IFwKKwkgICBkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpeworCQlyeGNvbmYgPSByeGNvbmYgfCAoMTw8QUNDRVBUX0FMTE1BQ19GUkFNRV9TSElGVCk7CisJfWVsc2V7CisJCXJ4Y29uZiA9IHJ4Y29uZiB8ICgxPDxBQ0NFUFRfTklDTUFDX0ZSQU1FX1NISUZUKTsKKwkJaWYocHJpdi0+Y2FyZF84MTg1ID09IDApCisJCQlyeGNvbmYgPSByeGNvbmYgfCAoMTw8UlhfQ0hFQ0tfQlNTSURfU0hJRlQpOworCX0KKworCS8qaWYocHJpdi0+aWVlZTgwMjExLT5pd19tb2RlID09IElXX01PREVfTUFTVEVSKXsKKwkJcnhjb25mID0gcnhjb25mIHwgKDE8PEFDQ0VQVF9BTExNQUNfRlJBTUVfU0hJRlQpOworCQlyeGNvbmYgPSByeGNvbmYgfCAoMTw8UlhfQ0hFQ0tfQlNTSURfU0hJRlQpOworCX0qLworCisJaWYocHJpdi0+aWVlZTgwMjExLT5pd19tb2RlID09IElXX01PREVfTU9OSVRPUil7CisJCXJ4Y29uZiA9IHJ4Y29uZiB8ICgxPDxBQ0NFUFRfQ1RMX0ZSQU1FX1NISUZUKTsKKwkJcnhjb25mID0gcnhjb25mIHwgKDE8PEFDQ0VQVF9JQ1ZFUlJfRlJBTUVfU0hJRlQpOworCQlyeGNvbmYgPSByeGNvbmYgfCAoMTw8QUNDRVBUX1BXUl9GUkFNRV9TSElGVCk7CisJfQorCisJaWYoIHByaXYtPmNyY21vbiA9PSAxICYmIHByaXYtPmllZWU4MDIxMS0+aXdfbW9kZSA9PSBJV19NT0RFX01PTklUT1IpCisJCXJ4Y29uZiA9IHJ4Y29uZiB8ICgxPDxBQ0NFUFRfQ1JDRVJSX0ZSQU1FX1NISUZUKTsKKworCS8vaWYoIXByaXYtPmNhcmRfODE4NSl7CisJCXJ4Y29uZiA9IHJ4Y29uZiAmfiBSWF9GSUZPX1RIUkVTSE9MRF9NQVNLOworCQlyeGNvbmYgPSByeGNvbmYgfCAoUlhfRklGT19USFJFU0hPTERfTk9ORTw8UlhfRklGT19USFJFU0hPTERfU0hJRlQpOworCS8vfQorCisJcnhjb25mID0gcnhjb25mIHwgKDE8PFJYX0FVVE9SRVNFVFBIWV9TSElGVCk7CisJcnhjb25mID0gcnhjb25mICZ+IE1BWF9SWF9ETUFfTUFTSzsKKwlyeGNvbmYgPSByeGNvbmYgfCAoTUFYX1JYX0RNQV8yMDQ4PDxNQVhfUlhfRE1BX1NISUZUKTsKKworCS8vaWYoIXByaXYtPmNhcmRfODE4NSkKKwkJcnhjb25mID0gcnhjb25mIHwgUkNSX09OTFlFUkxQS1Q7CisKKwlyeGNvbmYgPSByeGNvbmYgJn4gUkNSX0NTX01BU0s7CisJaWYoIXByaXYtPmNhcmRfODE4NSkKKwkJcnhjb25mIHw9IChwcml2LT5yY3JfY3NlbnNlPDxSQ1JfQ1NfU0hJRlQpOworLy8Jcnhjb25mICY9fiAweGZmZjAwMDAwOworLy8Jcnhjb25mIHw9IDB4OTAxMDAwMDA7Ly85MDE0Zjc2ZjsKKwl3cml0ZV9uaWNfZHdvcmQoZGV2LCBSWF9DT05GLCByeGNvbmYpOworI2VuZGlmCisKKwlpZiAoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSBETUVTRyAoIk5JQyBpbiBwcm9taXNjIG1vZGUiKTsKKworCWlmKHByaXYtPmllZWU4MDIxMS0+aXdfbW9kZSA9PSBJV19NT0RFX01PTklUT1IgfHwgXAorCSAgIGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQyl7CisJICAgCXByaXYtPlJlY2VpdmVDb25maWcgPSBwcml2LT5SZWNlaXZlQ29uZmlnICYgKH5SQ1JfQVBNKTsKKwkJcHJpdi0+UmVjZWl2ZUNvbmZpZyA9IHByaXYtPlJlY2VpdmVDb25maWcgfCBSQ1JfQUFQOworCX0KKworCS8qaWYocHJpdi0+aWVlZTgwMjExLT5pd19tb2RlID09IElXX01PREVfTUFTVEVSKXsKKwkJcnhjb25mID0gcnhjb25mIHwgKDE8PEFDQ0VQVF9BTExNQUNfRlJBTUVfU0hJRlQpOworCQlyeGNvbmYgPSByeGNvbmYgfCAoMTw8UlhfQ0hFQ0tfQlNTSURfU0hJRlQpOworCX0qLworCisJaWYocHJpdi0+aWVlZTgwMjExLT5pd19tb2RlID09IElXX01PREVfTU9OSVRPUil7CisJCXByaXYtPlJlY2VpdmVDb25maWcgPSBwcml2LT5SZWNlaXZlQ29uZmlnIHwgUkNSX0FDRiB8IFJDUl9BUFdSTUdUIHwgUkNSX0FJQ1Y7CisJfQorCisJaWYoIHByaXYtPmNyY21vbiA9PSAxICYmIHByaXYtPmllZWU4MDIxMS0+aXdfbW9kZSA9PSBJV19NT0RFX01PTklUT1IpCisJCXByaXYtPlJlY2VpdmVDb25maWcgPSBwcml2LT5SZWNlaXZlQ29uZmlnIHwgUkNSX0FDUkMzMjsKKworCXdyaXRlX25pY19kd29yZChkZXYsIFJDUiwgcHJpdi0+UmVjZWl2ZUNvbmZpZyk7CisKKwlmaXhfcnhfZmlmbyhkZXYpOworCisjaWZkZWYgREVCVUdfUlgKKwlETUVTRygicnhjb25mOiAleCAleCIscHJpdi0+UmVjZWl2ZUNvbmZpZyAscmVhZF9uaWNfZHdvcmQoZGV2LFJDUikpOworI2VuZGlmCisJY21kPXJlYWRfbmljX2J5dGUoZGV2LENNRCk7CisJd3JpdGVfbmljX2J5dGUoZGV2LENNRCxjbWQgfCAoMTw8Q01EX1JYX0VOQUJMRV9TSElGVCkpOworCit9CisKK3ZvaWQgcnRsODE4NWJfdHhfZW5hYmxlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJdTggY21kOworCS8vdTggdHhfYWdjX2N0bDsKKwl1OCBieXRlOworCS8vdTMyIHR4Y29uZjsKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxODBfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CisKKyNpZiAwCisJdHhjb25mPSByZWFkX25pY19kd29yZChkZXYsVFhfQ09ORik7CisJaWYocHJpdi0+Y2FyZF84MTg1KXsKKworCisJCWJ5dGUgPSByZWFkX25pY19ieXRlKGRldixDV19DT05GKTsKKwkJYnl0ZSAmPSB+KDE8PENXX0NPTkZfUEVSUEFDS0VUX0NXX1NISUZUKTsKKwkJYnl0ZSAmPSB+KDE8PENXX0NPTkZfUEVSUEFDS0VUX1JFVFJZX1NISUZUKTsKKwkJd3JpdGVfbmljX2J5dGUoZGV2LCBDV19DT05GLCBieXRlKTsKKworCQl0eF9hZ2NfY3RsID0gcmVhZF9uaWNfYnl0ZShkZXYsIFRYX0FHQ19DVEwpOworCQl0eF9hZ2NfY3RsICY9IH4oMTw8VFhfQUdDX0NUTF9QRVJQQUNLRVRfR0FJTl9TSElGVCk7CisJCXR4X2FnY19jdGwgJj0gfigxPDxUWF9BR0NfQ1RMX1BFUlBBQ0tFVF9BTlRTRUxfU0hJRlQpOworCQl0eF9hZ2NfY3RsIHw9KDE8PFRYX0FHQ19DVExfRkVFREJBQ0tfQU5UKTsKKwkJd3JpdGVfbmljX2J5dGUoZGV2LCBUWF9BR0NfQ1RMLCB0eF9hZ2NfY3RsKTsKKwkJLyoKKwkJd3JpdGVfbmljX3dvcmQoZGV2LCAweDVlLCAweDAxKTsKKwkJZm9yY2VfcGNpX3Bvc3RpbmcoZGV2KTsKKwkJbWRlbGF5KDEpOworCQl3cml0ZV9uaWNfd29yZChkZXYsIDB4ZmUsIDB4MTApOworCQlmb3JjZV9wY2lfcG9zdGluZyhkZXYpOworCQltZGVsYXkoMSk7CisJCXdyaXRlX25pY193b3JkKGRldiwgMHg1ZSwgMHgwMCk7CisJCWZvcmNlX3BjaV9wb3N0aW5nKGRldik7CisJCW1kZWxheSgxKTsKKwkJKi8KKwkJd3JpdGVfbmljX2J5dGUoZGV2LCAweGVjLCAweDNmKTsgLyogRGlzYWJsZSBlYXJseSBUWCAqLworCX0KKworCWlmKHByaXYtPmNhcmRfODE4NSl7CisKKwkJdHhjb25mID0gdHhjb25mICZ+ICgxPDxUQ1JfUFJPQkVfTk9USU1FU1RBTVBfU0hJRlQpOworCisJfWVsc2V7CisKKwkJaWYoaHdzZXFudW0pCisJCQl0eGNvbmY9IHR4Y29uZiAmfiAoMTw8VFhfQ09ORl9IRUFERVJfQVVUT0lDUkVNRU5UX1NISUZUKTsKKwkJZWxzZQorCQkJdHhjb25mPSB0eGNvbmYgfCAoMTw8VFhfQ09ORl9IRUFERVJfQVVUT0lDUkVNRU5UX1NISUZUKTsKKwl9CisKKwl0eGNvbmYgPSB0eGNvbmYgJn4gVFhfTE9PUEJBQ0tfTUFTSzsKKwl0eGNvbmYgPSB0eGNvbmYgfCAoVFhfTE9PUEJBQ0tfTk9ORSA8PFRYX0xPT1BCQUNLX1NISUZUKTsKKwl0eGNvbmYgPSB0eGNvbmYgJn4gVENSX0RQUkVUUllfTUFTSzsKKwl0eGNvbmYgPSB0eGNvbmYgJn4gVENSX1JUU1JFVFJZX01BU0s7CisJdHhjb25mID0gdHhjb25mIHwgKHByaXYtPnJldHJ5X2RhdGE8PFRYX0RQUkVUUllfU0hJRlQpOworCXR4Y29uZiA9IHR4Y29uZiB8IChwcml2LT5yZXRyeV9ydHM8PFRYX1JUU1JFVFJZX1NISUZUKTsKKwl0eGNvbmYgPSB0eGNvbmYgJn4gKDE8PFRYX05PQ1JDX1NISUZUKTsKKworCWlmKHByaXYtPmNhcmRfODE4NSl7CisJCWlmKHByaXYtPmh3X3BsY3BfbGVuKQorCQkJdHhjb25mID0gdHhjb25mICZ+IFRDUl9QTENQX0xFTjsKKwkJZWxzZQorCQkJdHhjb25mID0gdHhjb25mIHwgVENSX1BMQ1BfTEVOOworCX1lbHNleworCQl0eGNvbmYgPSB0eGNvbmYgJn4gVENSX1NBVDsKKwl9CisJdHhjb25mID0gdHhjb25mICZ+IFRDUl9NWERNQV9NQVNLOworCXR4Y29uZiA9IHR4Y29uZiB8IChUQ1JfTVhETUFfMjA0ODw8VENSX01YRE1BX1NISUZUKTsKKwl0eGNvbmYgPSB0eGNvbmYgfCBUQ1JfQ1dNSU47CisJdHhjb25mID0gdHhjb25mIHwgVENSX0RJU0NXOworCisvLwlpZihwcml2LT5pZWVlODAyMTEtPmh3X3dlcCkKKy8vCQl0eGNvbmY9dHhjb25mICZ+ICgxPDxUWF9OT0lDVl9TSElGVCk7CisvLwllbHNlCisJCXR4Y29uZj10eGNvbmYgfCAoMTw8VFhfTk9JQ1ZfU0hJRlQpOworCisJd3JpdGVfbmljX2R3b3JkKGRldixUWF9DT05GLHR4Y29uZik7CisjZW5kaWYKKworCXdyaXRlX25pY19kd29yZChkZXYsIFRDUiwgcHJpdi0+VHJhbnNtaXRDb25maWcpOworCWJ5dGUgPSByZWFkX25pY19ieXRlKGRldiwgTVNSKTsKKwlieXRlIHw9IE1TUl9MSU5LX0VORURDQTsKKwl3cml0ZV9uaWNfYnl0ZShkZXYsIE1TUiwgYnl0ZSk7CisKKwlmaXhfdHhfZmlmbyhkZXYpOworCisjaWZkZWYgREVCVUdfVFgKKwlETUVTRygidHhjb25mOiAleCAleCIscHJpdi0+VHJhbnNtaXRDb25maWcscmVhZF9uaWNfZHdvcmQoZGV2LFRDUikpOworI2VuZGlmCisKKwljbWQ9cmVhZF9uaWNfYnl0ZShkZXYsQ01EKTsKKwl3cml0ZV9uaWNfYnl0ZShkZXYsQ01ELGNtZCB8ICgxPDxDTURfVFhfRU5BQkxFX1NISUZUKSk7CisKKwkvL3dyaXRlX25pY19kd29yZChkZXYsVFhfQ09ORix0eGNvbmYpOworCisKKy8qCisJcnRsODE4MF9zZXRfbW9kZShkZXYsRVBST01fQ01EX0NPTkZJRyk7CisJd3JpdGVfbmljX2J5dGUoZGV2LCBUWF9ETUFfUE9MTElORywgcHJpdi0+ZG1hX3BvbGxfbWFzayk7CisJcnRsODE4MF9zZXRfbW9kZShkZXYsRVBST01fQ01EX05PUk1BTCk7CisJKi8KK30KKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zbGljb3NzL3NsaWMuaCBiL2RyaXZlcnMvc3RhZ2luZy9zbGljb3NzL3NsaWMuaAppbmRleCAwZDVkYzI0Li5hOGVhNTlkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvc2xpY29zcy9zbGljLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NsaWNvc3Mvc2xpYy5oCkBAIC00MSw2ICs0MSw0MCBAQAogI2lmbmRlZiBfX1NMSUNfRFJJVkVSX0hfXwogI2RlZmluZSBfX1NMSUNfRFJJVkVSX0hfXwogCisvKiBmaXJtd2FyZSBzdHVmZiAqLworI2RlZmluZSBPQVNJU19VQ09ERV9WRVJTX1NUUklORwkiMS4yIgorI2RlZmluZSBPQVNJU19VQ09ERV9WRVJTX0RBVEUgIAkiMjAwNi8wMy8yNyAxNToxMDozNyIKKyNkZWZpbmUgT0FTSVNfVUNPREVfSE9TVElGX0lEICAJMworCitzdGF0aWMgczMyIE9OdW1TZWN0aW9ucyA9IDB4MjsKK3N0YXRpYyB1MzIgT1NlY3Rpb25TaXplW10gPSB7CisJMHgwMDAwNDAwMCwgMHgwMDAxMDAwMCwKK307CisKK3N0YXRpYyB1MzIgT1NlY3Rpb25TdGFydFtdID0geworCTB4MDAwMDAwMDAsIDB4MDAwMDgwMDAsCit9OworCisjZGVmaW5lIE1PSkFWRV9VQ09ERV9WRVJTX1NUUklORwkiMS4yIgorI2RlZmluZSBNT0pBVkVfVUNPREVfVkVSU19EQVRFICAJIjIwMDYvMDMvMjcgMTU6MTI6MjIiCisjZGVmaW5lIE1PSkFWRV9VQ09ERV9IT1NUSUZfSUQgIAkzCisKK3N0YXRpYyBzMzIgTU51bVNlY3Rpb25zID0gMHgyOworc3RhdGljIHUzMiBNU2VjdGlvblNpemVbXSA9Cit7CisJMHgwMDAwODAwMCwgMHgwMDAxMDAwMCwKK307CisKK3N0YXRpYyB1MzIgTVNlY3Rpb25TdGFydFtdID0KK3sKKwkweDAwMDAwMDAwLCAweDAwMDA4MDAwLAorfTsKKworI2RlZmluZSBHQl9SQ1ZVQ09ERV9WRVJTX1NUUklORwkiMS4yIgorI2RlZmluZSBHQl9SQ1ZVQ09ERV9WRVJTX0RBVEUgIAkiMjAwNi8wMy8yNyAxNToxMjoxNSIKK3N0YXRpYyB1MzIgT2FzaXNSY3ZVQ29kZUxlbiA9IDUxMjsKK3N0YXRpYyB1MzIgR0JSY3ZVQ29kZUxlbiA9IDUxMjsKKyNkZWZpbmUgU0VDVElPTl9TSVpFIDY1NTM2CiAKIHN0cnVjdCBzbGljX3NwaW5sb2NrIHsKIAlzcGlubG9ja190CWxvY2s7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc2xpY29zcy9zbGljb3NzLmMgYi9kcml2ZXJzL3N0YWdpbmcvc2xpY29zcy9zbGljb3NzLmMKaW5kZXggMDAzOTAzNi4uYmY3ZGE4ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3NsaWNvc3Mvc2xpY29zcy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zbGljb3NzL3NsaWNvc3MuYwpAQCAtOTQsNiArOTQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CiAKKyNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9taWkuaD4KQEAgLTEwNSwxNSArMTA2LDYgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KICNpbmNsdWRlICJzbGljaW5jLmgiCi0jaW5jbHVkZSAiZ2Jkb3dubG9hZC5oIgotI2luY2x1ZGUgImdicmN2dWNvZGUuaCIKLSNpbmNsdWRlICJvYXNpc3JjdnVjb2RlLmgiCi0KLSNpZmRlZiBERUJVR19NSUNST0NPREUKLSNpbmNsdWRlICJvYXNpc2RiZ2Rvd25sb2FkLmgiCi0jZWxzZQotI2luY2x1ZGUgIm9hc2lzZG93bmxvYWQuaCIKLSNlbmRpZgogCiAjaWYgU0xJQ19EVU1QX0VOQUJMRUQKICNpbmNsdWRlICJzbGljZHVtcC5oIgpAQCAtMzIzLDcgKzMxNSw3IEBACiAJaW5kZXgsIHBzbGljX2hhbmRsZSwgYWRhcHRlci0+cGZyZWVfc2xpY19oYW5kbGVzLCBwc2xpY19oYW5kbGUtPm5leHQpOyovCiAJYWRhcHRlci0+cHNobWVtID0gKHN0cnVjdCBzbGljX3NobWVtICopCiAJCQkJCXBjaV9hbGxvY19jb25zaXN0ZW50KGFkYXB0ZXItPnBjaWRldiwKLQkJCQkJc2l6ZW9mKHN0cnVjdCBzbGljX3NobWVtICopLAorCQkJCQlzaXplb2Yoc3RydWN0IHNsaWNfc2htZW0pLAogCQkJCQkmYWRhcHRlci0+CiAJCQkJCXBoeXNfc2htZW0pOwogLyoKQEAgLTE0MzEsNyArMTQyMyw3IEBACiAJCURCR19NU0coImFkYXB0ZXJbJXBdIHBvcnQgJWQgcHNobWVtWyVwXSBGcmVlU2htZW0gIiwKIAkJCWFkYXB0ZXIsIGFkYXB0ZXItPnBvcnQsICh2b2lkICopIGFkYXB0ZXItPnBzaG1lbSk7CiAJCXBjaV9mcmVlX2NvbnNpc3RlbnQoYWRhcHRlci0+cGNpZGV2LAotCQkJCSAgICBzaXplb2Yoc3RydWN0IHNsaWNfc2htZW0gKiksCisJCQkJICAgIHNpemVvZihzdHJ1Y3Qgc2xpY19zaG1lbSksCiAJCQkJICAgIGFkYXB0ZXItPnBzaG1lbSwgYWRhcHRlci0+cGh5c19zaG1lbSk7CiAJCWFkYXB0ZXItPnBzaG1lbSA9IE5VTEw7CiAJCWFkYXB0ZXItPnBoeXNfc2htZW0gPSAoZG1hX2FkZHJfdCkgTlVMTDsKQEAgLTIxODYsNiArMjE3OCw5IEBACiAKIHN0YXRpYyBpbnQgc2xpY19jYXJkX2Rvd25sb2FkX2dicmN2KHN0cnVjdCBhZGFwdGVyICphZGFwdGVyKQogeworCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZnc7CisJY29uc3QgY2hhciAqZmlsZSA9ICIiOworCWludCByZXQ7CiAJX19pb21lbSBzdHJ1Y3Qgc2xpY19yZWdzICpzbGljX3JlZ3MgPSBhZGFwdGVyLT5zbGljX3JlZ3M7CiAJdTMyIGNvZGVhZGRyOwogCXVuc2lnbmVkIGNoYXIgKmluc3RydWN0aW9uID0gTlVMTDsKQEAgLTIxOTMsMTIgKzIxODgsMzIgQEAKIAogCXN3aXRjaCAoYWRhcHRlci0+ZGV2aWQpIHsKIAljYXNlIFNMSUNfMkdCX0RFVklDRV9JRDoKLQkJaW5zdHJ1Y3Rpb24gPSAodW5zaWduZWQgY2hhciAqKSZPYXNpc1JjdlVDb2RlWzBdOwotCQlyY3Z1Y29kZWxlbiA9IE9hc2lzUmN2VUNvZGVMZW47CisJCWZpbGUgPSAib2FzaXNfcmN2LmJpbiI7CiAJCWJyZWFrOwogCWNhc2UgU0xJQ18xR0JfREVWSUNFX0lEOgotCQlpbnN0cnVjdGlvbiA9ICh1bnNpZ25lZCBjaGFyICopJkdCUmN2VUNvZGVbMF07Ci0JCXJjdnVjb2RlbGVuID0gR0JSY3ZVQ29kZUxlbjsKKwkJZmlsZSA9ICJnYl9yY3YuYmluIjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQVNTRVJUKDApOworCQlicmVhazsKKwl9CisKKwlyZXQgPSByZXF1ZXN0X2Zpcm13YXJlKCZmdywgZmlsZSwgJmFkYXB0ZXItPnBjaWRldi0+ZGV2KTsKKwlpZiAocmV0KSB7CisJCXByaW50ayhLRVJOX0VSUiAiU0xJQ09TUzogRmFpbGVkIHRvIGxvYWQgZmlybXdhcmUgJXNcbiIsIGZpbGUpOworCQlyZXR1cm4gcmV0OworCX0KKworCWluc3RydWN0aW9uID0gKHVuc2lnbmVkIGNoYXIgKilmdy0+ZGF0YTsKKwlyY3Z1Y29kZWxlbiA9IGZ3LT5zaXplOworCXN3aXRjaCAoYWRhcHRlci0+ZGV2aWQpIHsKKwljYXNlIFNMSUNfMkdCX0RFVklDRV9JRDoKKwkJaWYgKHJjdnVjb2RlbGVuICE9IE9hc2lzUmN2VUNvZGVMZW4pCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJYnJlYWs7CisJY2FzZSBTTElDXzFHQl9ERVZJQ0VfSUQ6CisJCWlmIChyY3Z1Y29kZWxlbiAhPSBHQlJjdlVDb2RlTGVuKQorCQkJcmV0dXJuIC1FSU5WQUw7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCUFTU0VSVCgwKTsKQEAgLTIyMjUsMTMgKzIyNDAsMTYgQEAKIAl9CiAKIAkvKiBkb3dubG9hZCBmaW5pc2hlZCAqLworCXJlbGVhc2VfZmlybXdhcmUoZncpOwogCVdSSVRFX1JFRyhzbGljX3JlZ3MtPnNsaWNfcmN2X3djcywgU0xJQ19SQ1ZXQ1NfRklOSVNILCBGTFVTSCk7Ci0KIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBzbGljX2NhcmRfZG93bmxvYWQoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpCiB7CisJY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdzsKKwljb25zdCBjaGFyICpmaWxlID0gIiI7CisJaW50IHJldDsKIAl1MzIgc2VjdGlvbjsKIAlpbnQgdGhpc3NlY3Rpb25zaXplOwogCWludCBjb2RlYWRkcjsKQEAgLTIyNTUsNiArMjI3Myw3IEBACiAJY2FzZSBTTElDXzJHQl9ERVZJQ0VfSUQ6CiAvKiAgICAgIERCR19NU0cgKCJzbGljb3NzOiAlcyBkZXZpZD09U0xJQ18yR0JfREVWSUNFX0lEIHNlY3Rpb25zWyV4XVxuIiwKIAlfX2Z1bmNfXywgKHVpbnQpIE9OdW1TZWN0aW9ucyk7ICovCisJCWZpbGUgPSAic2xpY19vYXNpcy5iaW4iOwogCQludW1zZWN0cyA9IE9OdW1TZWN0aW9uczsKIAkJZm9yIChpID0gMDsgaSA8IG51bXNlY3RzOyBpKyspIHsKIAkJCXNlY3RzaXplW2ldID0gT1NlY3Rpb25TaXplW2ldOwpAQCAtMjI2NCw2ICsyMjgzLDcgQEAKIAljYXNlIFNMSUNfMUdCX0RFVklDRV9JRDoKIC8qICAgICAgICAgICAgICBEQkdfTVNHICgic2xpY29zczogJXMgZGV2aWQ9PVNMSUNfMUdCX0RFVklDRV9JRCBzZWN0aW9uc1sleF1cbiIsCiAJCV9fZnVuY19fLCAodWludCkgTU51bVNlY3Rpb25zKTsgKi8KKwkJZmlsZSA9ICJzbGljX21vamF2ZS5iaW4iOwogCQludW1zZWN0cyA9IE1OdW1TZWN0aW9uczsKIAkJZm9yIChpID0gMDsgaSA8IG51bXNlY3RzOyBpKyspIHsKIAkJCXNlY3RzaXplW2ldID0gTVNlY3Rpb25TaXplW2ldOwpAQCAtMjI3NCwyNiArMjI5NCwzMyBAQAogCQlBU1NFUlQoMCk7CiAJCWJyZWFrOwogCX0KKwlyZXQgPSByZXF1ZXN0X2Zpcm13YXJlKCZmdywgZmlsZSwgJmFkYXB0ZXItPnBjaWRldi0+ZGV2KTsKKwlpZiAocmV0KSB7CisJCXByaW50ayhLRVJOX0VSUiAiU0xJQ09TUzogRmFpbGVkIHRvIGxvYWQgZmlybXdhcmUgJXNcbiIsIGZpbGUpOworCQlyZXR1cm4gcmV0OworCX0KIAogCUFTU0VSVChudW1zZWN0cyA8PSAzKTsKIAogCWZvciAoc2VjdGlvbiA9IDA7IHNlY3Rpb24gPCBudW1zZWN0czsgc2VjdGlvbisrKSB7CiAJCXN3aXRjaCAoYWRhcHRlci0+ZGV2aWQpIHsKIAkJY2FzZSBTTElDXzJHQl9ERVZJQ0VfSUQ6Ci0JCQlpbnN0cnVjdGlvbiA9ICh1MzIgKikgJk9hc2lzVUNvZGVbc2VjdGlvbl1bMF07CisJCQlpbnN0cnVjdGlvbiA9ICh1MzIgKikoZnctPmRhdGEgKyAoU0VDVElPTl9TSVpFICoKKwkJCQkJCQkJc2VjdGlvbikpOwogCQkJYmFzZWFkZHJlc3MgPSBzZWN0c3RhcnRbc2VjdGlvbl07CiAJCQl0aGlzc2VjdGlvbnNpemUgPSBzZWN0c2l6ZVtzZWN0aW9uXSA+PiAzOwogCQkJbGFzdGluc3RydWN0ID0KLQkJCSAgICAodTMyICopICZPYXNpc1VDb2RlW3NlY3Rpb25dW3NlY3RzaXplW3NlY3Rpb25dIC0KLQkJCQkJCQkgICAgIDhdOworCQkJICAgICh1MzIgKikoZnctPmRhdGEgKyAoU0VDVElPTl9TSVpFICogc2VjdGlvbikgKworCQkJCQlzZWN0c2l6ZVtzZWN0aW9uXSAtIDgpOwogCQkJYnJlYWs7CiAJCWNhc2UgU0xJQ18xR0JfREVWSUNFX0lEOgotCQkJaW5zdHJ1Y3Rpb24gPSAodTMyICopICZNb2phdmVVQ29kZVtzZWN0aW9uXVswXTsKKwkJCWluc3RydWN0aW9uID0gKHUzMiAqKShmdy0+ZGF0YSArIChTRUNUSU9OX1NJWkUgKgorCQkJCQkJCQlzZWN0aW9uKSk7CiAJCQliYXNlYWRkcmVzcyA9IHNlY3RzdGFydFtzZWN0aW9uXTsKIAkJCXRoaXNzZWN0aW9uc2l6ZSA9IHNlY3RzaXplW3NlY3Rpb25dID4+IDM7CiAJCQlsYXN0aW5zdHJ1Y3QgPQotCQkJICAgICh1MzIgKikgJk1vamF2ZVVDb2RlW3NlY3Rpb25dW3NlY3RzaXplW3NlY3Rpb25dCi0JCQkJCQkJICAgICAgLSA4XTsKKwkJCSAgICAodTMyICopKGZ3LT5kYXRhICsgKFNFQ1RJT05fU0laRSAqIHNlY3Rpb24pICsKKwkJCQkJc2VjdHNpemVbc2VjdGlvbl0gLSA4KTsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJQVNTRVJUKDApOwpAQCAtMjMyOSwxMCArMjM1NiwxMiBAQAogCWZvciAoc2VjdGlvbiA9IDA7IHNlY3Rpb24gPCBudW1zZWN0czsgc2VjdGlvbisrKSB7CiAJCXN3aXRjaCAoYWRhcHRlci0+ZGV2aWQpIHsKIAkJY2FzZSBTTElDXzJHQl9ERVZJQ0VfSUQ6Ci0JCQlpbnN0cnVjdGlvbiA9ICh1MzIgKikmT2FzaXNVQ29kZVtzZWN0aW9uXVswXTsKKwkJCWluc3RydWN0aW9uID0gKHUzMiAqKWZ3LT5kYXRhICsgKFNFQ1RJT05fU0laRSAqCisJCQkJCQkJCXNlY3Rpb24pOwogCQkJYnJlYWs7CiAJCWNhc2UgU0xJQ18xR0JfREVWSUNFX0lEOgotCQkJaW5zdHJ1Y3Rpb24gPSAodTMyICopJk1vamF2ZVVDb2RlW3NlY3Rpb25dWzBdOworCQkJaW5zdHJ1Y3Rpb24gPSAodTMyICopZnctPmRhdGEgKyAoU0VDVElPTl9TSVpFICoKKwkJCQkJCQkJc2VjdGlvbik7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCUFTU0VSVCgwKTsKQEAgLTIzNzQsMTMgKzI0MDMsMTMgQEAKIAkJCQkgICAgdGhpc3NlY3Rpb25zaXplWyV4XSBmYWlsdXJlWyV4XVxuIiwKIAkJCQkgICAgIF9fZnVuY19fLCBjb2RlYWRkciwgdGhpc3NlY3Rpb25zaXplLAogCQkJCSAgICAgZmFpbHVyZSk7Ci0KKwkJCQlyZWxlYXNlX2Zpcm13YXJlKGZ3KTsKIAkJCQlyZXR1cm4gLUVJTzsKIAkJCX0KIAkJfQogCX0KIC8qICAgIERCR19NU0cgKCJzbGljb3NzOiBDb21wYXJlIGRvbmVcbiIpOyovCi0KKwlyZWxlYXNlX2Zpcm13YXJlKGZ3KTsKIAkvKiBFdmVyeXRoaW5nIE9LLCBraWNrIG9mZiB0aGUgY2FyZCAqLwogCW1kZWxheSgxMCk7CiAJV1JJVEVfUkVHKHNsaWNfcmVncy0+c2xpY193Y3MsIFNMSUNfV0NTX1NUQVJULCBGTFVTSCk7CkBAIC0yODMyLDkgKzI4NjEsOCBAQAogCX0KIAlpZiAoIXBoeXNjYXJkKSB7CiAJCS8qIG5vIHN0cnVjdHVyZSBhbGxvY2F0ZWQgZm9yIHRoaXMgcGh5c2ljYWwgY2FyZCB5ZXQgKi8KLQkJcGh5c2NhcmQgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcGh5c2NhcmQgKiksIEdGUF9BVE9NSUMpOworCQlwaHlzY2FyZCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBwaHlzY2FyZCksIEdGUF9BVE9NSUMpOwogCQlBU1NFUlQocGh5c2NhcmQpOwotCQltZW1zZXQocGh5c2NhcmQsIDAsIHNpemVvZihzdHJ1Y3QgcGh5c2NhcmQgKikpOwogCiAJCURCR19NU0cKIAkJICAgICgiXG4lcyBBbGxvY2F0ZSBhIFBIWVNJQ0FMY2FyZDpcbiAgICBQSFlTSUNBTF9DYXJkWyVwXVxuXApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3N4Zy9SRUFETUUgYi9kcml2ZXJzL3N0YWdpbmcvc3hnL1JFQURNRQppbmRleCBkNTE0ZDE4Li5lNDJmMzQ0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvc3hnL1JFQURNRQorKysgYi9kcml2ZXJzL3N0YWdpbmcvc3hnL1JFQURNRQpAQCAtMiw4ICsyLDYgQEAKIE5vbi1BY2NlbGVyYXRlZCAxMEdiZSBuZXR3b3JrIGRyaXZlci4KIAogVE9ETzoKLQktIGxpbmRlbnQgdGhlIGNvZGUKLQktIHJlbW92ZSB0eXBlZGVmcwogCS0gcmVtb3ZlIHdyYXBwZXJzCiAJLSBjaGVja3BhdGNoLnBsIGNsZWFudXBzCiAJLSBuZXcgZnVuY3Rpb25hbGl0eSB0aGF0IHRoZSBjYXJkIG5lZWRzCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc3hnL3N4Zy5jIGIvZHJpdmVycy9zdGFnaW5nL3N4Zy9zeGcuYwppbmRleCA1MjcyYTE4Li4xZTBjZmNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvc3hnL3N4Zy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zeGcvc3hnLmMKQEAgLTgwLDEzICs4MCwxMyBAQAogI2luY2x1ZGUgInN4Z3BoeWNvZGUuaCIKICNpbmNsdWRlICJzYWhhcmFkYmdkb3dubG9hZC5oIgogCi1zdGF0aWMgaW50IHN4Z19hbGxvY2F0ZV9idWZmZXJfbWVtb3J5KHBfYWRhcHRlcl90IGFkYXB0ZXIsIHUzMiBTaXplLAotCQkJCSAgICAgIFNYR19CVUZGRVJfVFlQRSBCdWZmZXJUeXBlKTsKLXN0YXRpYyB2b2lkIHN4Z19hbGxvY2F0ZV9yY3ZibG9ja19jb21wbGV0ZShwX2FkYXB0ZXJfdCBhZGFwdGVyLCB2b2lkICpSY3ZCbG9jaywKK3N0YXRpYyBpbnQgc3hnX2FsbG9jYXRlX2J1ZmZlcl9tZW1vcnkoc3RydWN0IGFkYXB0ZXJfdCAqYWRhcHRlciwgdTMyIFNpemUsCisJCQkJICAgICAgZW51bSBTWEdfQlVGRkVSX1RZUEUgQnVmZmVyVHlwZSk7CitzdGF0aWMgdm9pZCBzeGdfYWxsb2NhdGVfcmN2YmxvY2tfY29tcGxldGUoc3RydWN0IGFkYXB0ZXJfdCAqYWRhcHRlciwgdm9pZCAqUmN2QmxvY2ssCiAJCQkJCSAgIGRtYV9hZGRyX3QgUGh5c2ljYWxBZGRyZXNzLAogCQkJCQkgICB1MzIgTGVuZ3RoKTsKLXN0YXRpYyB2b2lkIHN4Z19hbGxvY2F0ZV9zZ2xfYnVmZmVyX2NvbXBsZXRlKHBfYWRhcHRlcl90IGFkYXB0ZXIsCi0JCQkJCSAgICAgUFNYR19TQ0FUVEVSX0dBVEhFUiBTeGdTZ2wsCitzdGF0aWMgdm9pZCBzeGdfYWxsb2NhdGVfc2dsX2J1ZmZlcl9jb21wbGV0ZShzdHJ1Y3QgYWRhcHRlcl90ICphZGFwdGVyLAorCQkJCQkgICAgIHN0cnVjdCBTWEdfU0NBVFRFUl9HQVRIRVIgKlN4Z1NnbCwKIAkJCQkJICAgICBkbWFfYWRkcl90IFBoeXNpY2FsQWRkcmVzcywKIAkJCQkJICAgICB1MzIgTGVuZ3RoKTsKIApAQCAtOTYsMTcgKzk2LDE3IEBACiBzdGF0aWMgaW50IHN4Z19lbnRyeV9oYWx0KHBfbmV0X2RldmljZSBkZXYpOwogc3RhdGljIGludCBzeGdfaW9jdGwocF9uZXRfZGV2aWNlIGRldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCk7CiBzdGF0aWMgaW50IHN4Z19zZW5kX3BhY2tldHMoc3RydWN0IHNrX2J1ZmYgKnNrYiwgcF9uZXRfZGV2aWNlIGRldik7Ci1zdGF0aWMgaW50IHN4Z190cmFuc21pdF9wYWNrZXQocF9hZGFwdGVyX3QgYWRhcHRlciwgc3RydWN0IHNrX2J1ZmYgKnNrYik7Ci1zdGF0aWMgdm9pZCBzeGdfZHVtYl9zZ2woUFNDQVRURVJfR0FUSEVSX0xJU1QgcFNnbCwgUFNYR19TQ0FUVEVSX0dBVEhFUiBTeGdTZ2wpOworc3RhdGljIGludCBzeGdfdHJhbnNtaXRfcGFja2V0KHN0cnVjdCBhZGFwdGVyX3QgKmFkYXB0ZXIsIHN0cnVjdCBza19idWZmICpza2IpOworc3RhdGljIHZvaWQgc3hnX2R1bWJfc2dsKHN0cnVjdCBTQ0FUVEVSX0dBVEhFUl9MSVNUICpwU2dsLCBzdHJ1Y3QgU1hHX1NDQVRURVJfR0FUSEVSICpTeGdTZ2wpOwogCi1zdGF0aWMgdm9pZCBzeGdfaGFuZGxlX2ludGVycnVwdChwX2FkYXB0ZXJfdCBhZGFwdGVyKTsKLXN0YXRpYyBpbnQgc3hnX3Byb2Nlc3NfaXNyKHBfYWRhcHRlcl90IGFkYXB0ZXIsIHUzMiBNZXNzYWdlSWQpOwotc3RhdGljIHUzMiBzeGdfcHJvY2Vzc19ldmVudF9xdWV1ZShwX2FkYXB0ZXJfdCBhZGFwdGVyLCB1MzIgUnNzSWQpOwotc3RhdGljIHZvaWQgc3hnX2NvbXBsZXRlX3Nsb3dfc2VuZChwX2FkYXB0ZXJfdCBhZGFwdGVyKTsKLXN0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqc3hnX3Nsb3dfcmVjZWl2ZShwX2FkYXB0ZXJfdCBhZGFwdGVyLCBQU1hHX0VWRU5UIEV2ZW50KTsKLXN0YXRpYyB2b2lkIHN4Z19wcm9jZXNzX3Jjdl9lcnJvcihwX2FkYXB0ZXJfdCBhZGFwdGVyLCB1MzIgRXJyb3JTdGF0dXMpOwotc3RhdGljIGJvb2wgc3hnX21hY19maWx0ZXIocF9hZGFwdGVyX3QgYWRhcHRlciwKLQkJCSAgIHBfZXRoZXJfaGVhZGVyIEV0aGVySGRyLCB1c2hvcnQgbGVuZ3RoKTsKK3N0YXRpYyB2b2lkIHN4Z19oYW5kbGVfaW50ZXJydXB0KHN0cnVjdCBhZGFwdGVyX3QgKmFkYXB0ZXIpOworc3RhdGljIGludCBzeGdfcHJvY2Vzc19pc3Ioc3RydWN0IGFkYXB0ZXJfdCAqYWRhcHRlciwgdTMyIE1lc3NhZ2VJZCk7CitzdGF0aWMgdTMyIHN4Z19wcm9jZXNzX2V2ZW50X3F1ZXVlKHN0cnVjdCBhZGFwdGVyX3QgKmFkYXB0ZXIsIHUzMiBSc3NJZCk7CitzdGF0aWMgdm9pZCBzeGdfY29tcGxldGVfc2xvd19zZW5kKHN0cnVjdCBhZGFwdGVyX3QgKmFkYXB0ZXIpOworc3RhdGljIHN0cnVjdCBza19idWZmICpzeGdfc2xvd19yZWNlaXZlKHN0cnVjdCBhZGFwdGVyX3QgKmFkYXB0ZXIsIHN0cnVjdCBTWEdfRVZFTlQgKkV2ZW50KTsKK3N0YXRpYyB2b2lkIHN4Z19wcm9jZXNzX3Jjdl9lcnJvcihzdHJ1Y3QgYWRhcHRlcl90ICphZGFwdGVyLCB1MzIgRXJyb3JTdGF0dXMpOworc3RhdGljIGJvb2wgc3hnX21hY19maWx0ZXIoc3RydWN0IGFkYXB0ZXJfdCAqYWRhcHRlciwKKwkJCSAgIHN0cnVjdCBldGhlcl9oZWFkZXIgKkV0aGVySGRyLCB1c2hvcnQgbGVuZ3RoKTsKIAogI2lmIFNMSUNfR0VUX1NUQVRTX0VOQUJMRUQKIHN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3hnX2dldF9zdGF0cyhwX25ldF9kZXZpY2UgZGV2KTsKQEAgLTExOSwyMiArMTE5LDIyIEBACiBzdGF0aWMgdm9pZCBzeGdfbWNhc3Rfc2V0X2xpc3QocF9uZXRfZGV2aWNlIGRldik7CiAjZW5kaWYKIAotc3RhdGljIHZvaWQgc3hnX2FkYXB0ZXJfc2V0X2h3YWRkcihwX2FkYXB0ZXJfdCBhZGFwdGVyKTsKK3N0YXRpYyB2b2lkIHN4Z19hZGFwdGVyX3NldF9od2FkZHIoc3RydWN0IGFkYXB0ZXJfdCAqYWRhcHRlcik7CiAKLXN0YXRpYyB2b2lkIHN4Z191bm1hcF9tbWlvX3NwYWNlKHBfYWRhcHRlcl90IGFkYXB0ZXIpOworc3RhdGljIHZvaWQgc3hnX3VubWFwX21taW9fc3BhY2Uoc3RydWN0IGFkYXB0ZXJfdCAqYWRhcHRlcik7CiAKLXN0YXRpYyBpbnQgc3hnX2luaXRpYWxpemVfYWRhcHRlcihwX2FkYXB0ZXJfdCBhZGFwdGVyKTsKLXN0YXRpYyB2b2lkIHN4Z19zdG9ja19yY3ZfYnVmZmVycyhwX2FkYXB0ZXJfdCBhZGFwdGVyKTsKLXN0YXRpYyB2b2lkIHN4Z19jb21wbGV0ZV9kZXNjcmlwdG9yX2Jsb2NrcyhwX2FkYXB0ZXJfdCBhZGFwdGVyLAorc3RhdGljIGludCBzeGdfaW5pdGlhbGl6ZV9hZGFwdGVyKHN0cnVjdCBhZGFwdGVyX3QgKmFkYXB0ZXIpOworc3RhdGljIHZvaWQgc3hnX3N0b2NrX3Jjdl9idWZmZXJzKHN0cnVjdCBhZGFwdGVyX3QgKmFkYXB0ZXIpOworc3RhdGljIHZvaWQgc3hnX2NvbXBsZXRlX2Rlc2NyaXB0b3JfYmxvY2tzKHN0cnVjdCBhZGFwdGVyX3QgKmFkYXB0ZXIsCiAJCQkJCSAgIHVuc2lnbmVkIGNoYXIgSW5kZXgpOwotc3RhdGljIGludCBzeGdfaW5pdGlhbGl6ZV9saW5rKHBfYWRhcHRlcl90IGFkYXB0ZXIpOwotc3RhdGljIGludCBzeGdfcGh5X2luaXQocF9hZGFwdGVyX3QgYWRhcHRlcik7Ci1zdGF0aWMgdm9pZCBzeGdfbGlua19ldmVudChwX2FkYXB0ZXJfdCBhZGFwdGVyKTsKLXN0YXRpYyBTWEdfTElOS19TVEFURSBzeGdfZ2V0X2xpbmtfc3RhdGUocF9hZGFwdGVyX3QgYWRhcHRlcik7Ci1zdGF0aWMgdm9pZCBzeGdfbGlua19zdGF0ZShwX2FkYXB0ZXJfdCBhZGFwdGVyLCBTWEdfTElOS19TVEFURSBMaW5rU3RhdGUpOwotc3RhdGljIGludCBzeGdfd3JpdGVfbWRpb19yZWcocF9hZGFwdGVyX3QgYWRhcHRlciwKK3N0YXRpYyBpbnQgc3hnX2luaXRpYWxpemVfbGluayhzdHJ1Y3QgYWRhcHRlcl90ICphZGFwdGVyKTsKK3N0YXRpYyBpbnQgc3hnX3BoeV9pbml0KHN0cnVjdCBhZGFwdGVyX3QgKmFkYXB0ZXIpOworc3RhdGljIHZvaWQgc3hnX2xpbmtfZXZlbnQoc3RydWN0IGFkYXB0ZXJfdCAqYWRhcHRlcik7CitzdGF0aWMgZW51bSBTWEdfTElOS19TVEFURSBzeGdfZ2V0X2xpbmtfc3RhdGUoc3RydWN0IGFkYXB0ZXJfdCAqYWRhcHRlcik7CitzdGF0aWMgdm9pZCBzeGdfbGlua19zdGF0ZShzdHJ1Y3QgYWRhcHRlcl90ICphZGFwdGVyLCBlbnVtIFNYR19MSU5LX1NUQVRFIExpbmtTdGF0ZSk7CitzdGF0aWMgaW50IHN4Z193cml0ZV9tZGlvX3JlZyhzdHJ1Y3QgYWRhcHRlcl90ICphZGFwdGVyLAogCQkJICAgICAgdTMyIERldkFkZHIsIHUzMiBSZWdBZGRyLCB1MzIgVmFsdWUpOwotc3RhdGljIGludCBzeGdfcmVhZF9tZGlvX3JlZyhwX2FkYXB0ZXJfdCBhZGFwdGVyLAorc3RhdGljIGludCBzeGdfcmVhZF9tZGlvX3JlZyhzdHJ1Y3QgYWRhcHRlcl90ICphZGFwdGVyLAogCQkJICAgICB1MzIgRGV2QWRkciwgdTMyIFJlZ0FkZHIsIHUzMiAqcFZhbHVlKTsKIAogc3RhdGljIHVuc2lnbmVkIGludCBzeGdfZmlyc3RfaW5pdCA9IDE7CkBAIC0xNDUsNyArMTQ1LDcgQEAKIHN0YXRpYyBpbnQgZGVidWcgPSAtMTsKIHN0YXRpYyBwX25ldF9kZXZpY2UgaGVhZF9uZXRkZXZpY2UgPSBOVUxMOwogCi1zdGF0aWMgc3hnYmFzZV9kcml2ZXJfdCBzeGdfZ2xvYmFsID0geworc3RhdGljIHN0cnVjdCBzeGdiYXNlX2RyaXZlcl90IHN4Z19nbG9iYWwgPSB7CiAJLmR5bmFtaWNfaW50YWdnID0gMSwKIH07CiBzdGF0aWMgaW50IGludGFnZ19kZWxheSA9IDEwMDsKQEAgLTE4Niw3ICsxODYsNyBAQAogCQltYigpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgc3hnX3JlZzY0X3dyaXRlKHBfYWRhcHRlcl90IGFkYXB0ZXIsIHZvaWQgX19pb21lbSAqcmVnLAorc3RhdGljIGlubGluZSB2b2lkIHN4Z19yZWc2NF93cml0ZShzdHJ1Y3QgYWRhcHRlcl90ICphZGFwdGVyLCB2b2lkIF9faW9tZW0gKnJlZywKIAkJCQkgICB1NjQgdmFsdWUsIHUzMiBjcHUpCiB7CiAJdTMyIHZhbHVlX2hpZ2ggPSAodTMyKSAodmFsdWUgPj4gMzIpOwpAQCAtMjA5LDcgKzIwOSw3IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBzeGdfZGJnX21hY2FkZHJzKHBfYWRhcHRlcl90IGFkYXB0ZXIpCitzdGF0aWMgdm9pZCBzeGdfZGJnX21hY2FkZHJzKHN0cnVjdCBhZGFwdGVyX3QgKmFkYXB0ZXIpCiB7CiAJREJHX0VSUk9SKCIgICglcykgY3VyciAlMi4yWDolMi4yWDolMi4yWDolMi4yWDolMi4yWDolMi4yWFxuIiwKIAkJICBhZGFwdGVyLT5uZXRkZXYtPm5hbWUsIGFkYXB0ZXItPmN1cnJtYWNhZGRyWzBdLApAQCAtMjI1LDEyICsyMjUsMTIgQEAKIH0KIAogLyogU1hHIEdsb2JhbHMgKi8KLXN0YXRpYyBTWEdfRFJJVkVSIFN4Z0RyaXZlcjsKK3N0YXRpYyBzdHJ1Y3QgU1hHX0RSSVZFUiBTeGdEcml2ZXI7CiAKICNpZmRlZiAgQVRLREJHCi1zdGF0aWMgc3hnX3RyYWNlX2J1ZmZlcl90IExTeGdUcmFjZUJ1ZmZlcjsKK3N0YXRpYyBzdHJ1Y3Qgc3hnX3RyYWNlX2J1ZmZlcl90IExTeGdUcmFjZUJ1ZmZlcjsKICNlbmRpZiAvKiBBVEtEQkcgKi8KLXN0YXRpYyBzeGdfdHJhY2VfYnVmZmVyX3QgKlN4Z1RyYWNlQnVmZmVyID0gTlVMTDsKK3N0YXRpYyBzdHJ1Y3Qgc3hnX3RyYWNlX2J1ZmZlcl90ICpTeGdUcmFjZUJ1ZmZlciA9IE5VTEw7CiAKIC8qCiAgKiBzeGdfZG93bmxvYWRfbWljcm9jb2RlCkBAIC0yNDQsOSArMjQ0LDkgQEAKICAqIFJldHVybgogICoJaW50CiAgKi8KLXN0YXRpYyBib29sIHN4Z19kb3dubG9hZF9taWNyb2NvZGUocF9hZGFwdGVyX3QgYWRhcHRlciwgU1hHX1VDT0RFX1NFTCBVY29kZVNlbCkKK3N0YXRpYyBib29sIHN4Z19kb3dubG9hZF9taWNyb2NvZGUoc3RydWN0IGFkYXB0ZXJfdCAqYWRhcHRlciwgZW51bSBTWEdfVUNPREVfU0VMIFVjb2RlU2VsKQogewotCVBTWEdfSFdfUkVHUyBId1JlZ3MgPSBhZGFwdGVyLT5Id1JlZ3M7CisJc3RydWN0IFNYR19IV19SRUdTICpId1JlZ3MgPSBhZGFwdGVyLT5Id1JlZ3M7CiAJdTMyIFNlY3Rpb247CiAJdTMyIFRoaXNTZWN0aW9uU2l6ZTsKIAl1MzIgKkluc3RydWN0aW9uID0gTlVMTDsKQEAgLTQxNiwxMyArNDE2LDEzIEBACiAgKiBSZXR1cm4KICAqCWludAogICovCi1zdGF0aWMgaW50IHN4Z19hbGxvY2F0ZV9yZXNvdXJjZXMocF9hZGFwdGVyX3QgYWRhcHRlcikKK3N0YXRpYyBpbnQgc3hnX2FsbG9jYXRlX3Jlc291cmNlcyhzdHJ1Y3QgYWRhcHRlcl90ICphZGFwdGVyKQogewogCWludCBzdGF0dXM7CiAJdTMyIGk7CiAJdTMyIFJzc0lkcywgSXNyQ291bnQ7Ci0vKiAgICAgIFBTWEdfWE1UX1JJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhtdFJpbmc7ICovCi0vKiAgICAgIFBTWEdfUkNWX1JJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJjdlJpbmc7ICovCisvKiAgICAgIHN0cnVjdCBTWEdfWE1UX1JJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpYbXRSaW5nOyAqLworLyogICAgICBzdHJ1Y3QgU1hHX1JDVl9SSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqUmN2UmluZzsgKi8KIAogCURCR19FUlJPUigiJXMgRU5URVJcbiIsIF9fZnVuY19fKTsKIApAQCAtNDYxLDEzICs0NjEsMTMgQEAKIAogCWZvciAoOzspIHsKIAkJREJHX0VSUk9SKCIlcyBBbGxvY2F0ZSBYbXRSaW5ncyBzaXplWyV4XVxuIiwgX19mdW5jX18sCi0JCQkgICh1bnNpZ25lZCBpbnQpKHNpemVvZihTWEdfWE1UX1JJTkcpICogMSkpOworCQkJICAodW5zaWduZWQgaW50KShzaXplb2Yoc3RydWN0IFNYR19YTVRfUklORykgKiAxKSk7CiAKIAkJLyogU3RhcnQgd2l0aCBiaWcgaXRlbXMgZmlyc3QgLSByZWNlaXZlIGFuZCB0cmFuc21pdCByaW5ncy4gIEF0IHRoZSBtb21lbnQgKi8KIAkJLyogSSdtIGdvaW5nIHRvIGtlZXAgdGhlIHJpbmcgc2l6ZSBmaXhlZCBhbmQgYWRqdXN0IHRoZSBudW1iZXIgb2YgKi8KIAkJLyogVENCcyBpZiB3ZSBmYWlsLiAgTGF0ZXIgd2UgbWlnaHQgY29uc2lkZXIgcmVkdWNpbmcgdGhlIHJpbmcgc2l6ZSBhcyB3ZWxsLi4gKi8KIAkJYWRhcHRlci0+WG10UmluZ3MgPSBwY2lfYWxsb2NfY29uc2lzdGVudChhZGFwdGVyLT5wY2lkZXYsCi0JCQkJCQkJIHNpemVvZihTWEdfWE1UX1JJTkcpICoKKwkJCQkJCQkgc2l6ZW9mKHN0cnVjdCBTWEdfWE1UX1JJTkcpICoKIAkJCQkJCQkgMSwKIAkJCQkJCQkgJmFkYXB0ZXItPlBYbXRSaW5ncyk7CiAJCURCR19FUlJPUigiJXMgWG10UmluZ3NbJXBdXG4iLCBfX2Z1bmNfXywgYWRhcHRlci0+WG10UmluZ3MpOwpAQCAtNDc1LDMzICs0NzUsMzMgQEAKIAkJaWYgKCFhZGFwdGVyLT5YbXRSaW5ncykgewogCQkJZ290byBwZXJfdGNiX2FsbG9jYXRpb25fZmFpbGVkOwogCQl9Ci0JCW1lbXNldChhZGFwdGVyLT5YbXRSaW5ncywgMCwgc2l6ZW9mKFNYR19YTVRfUklORykgKiAxKTsKKwkJbWVtc2V0KGFkYXB0ZXItPlhtdFJpbmdzLCAwLCBzaXplb2Yoc3RydWN0IFNYR19YTVRfUklORykgKiAxKTsKIAogCQlEQkdfRVJST1IoIiVzIEFsbG9jYXRlIFJjdlJpbmdzIHNpemVbJXhdXG4iLCBfX2Z1bmNfXywKLQkJCSAgKHVuc2lnbmVkIGludCkoc2l6ZW9mKFNYR19SQ1ZfUklORykgKiAxKSk7CisJCQkgICh1bnNpZ25lZCBpbnQpKHNpemVvZihzdHJ1Y3QgU1hHX1JDVl9SSU5HKSAqIDEpKTsKIAkJYWRhcHRlci0+UmN2UmluZ3MgPQogCQkgICAgcGNpX2FsbG9jX2NvbnNpc3RlbnQoYWRhcHRlci0+cGNpZGV2LAotCQkJCQkgc2l6ZW9mKFNYR19SQ1ZfUklORykgKiAxLAorCQkJCQkgc2l6ZW9mKHN0cnVjdCBTWEdfUkNWX1JJTkcpICogMSwKIAkJCQkJICZhZGFwdGVyLT5QUmN2UmluZ3MpOwogCQlEQkdfRVJST1IoIiVzIFJjdlJpbmdzWyVwXVxuIiwgX19mdW5jX18sIGFkYXB0ZXItPlJjdlJpbmdzKTsKIAkJaWYgKCFhZGFwdGVyLT5SY3ZSaW5ncykgewogCQkJZ290byBwZXJfdGNiX2FsbG9jYXRpb25fZmFpbGVkOwogCQl9Ci0JCW1lbXNldChhZGFwdGVyLT5SY3ZSaW5ncywgMCwgc2l6ZW9mKFNYR19SQ1ZfUklORykgKiAxKTsKKwkJbWVtc2V0KGFkYXB0ZXItPlJjdlJpbmdzLCAwLCBzaXplb2Yoc3RydWN0IFNYR19SQ1ZfUklORykgKiAxKTsKIAkJYnJlYWs7CiAKIAkgICAgICBwZXJfdGNiX2FsbG9jYXRpb25fZmFpbGVkOgogCQkvKiBhbiBhbGxvY2F0aW9uIGZhaWxlZC4gIEZyZWUgYW55IHN1Y2Nlc3NmdWwgYWxsb2NhdGlvbnMuICovCiAJCWlmIChhZGFwdGVyLT5YbXRSaW5ncykgewogCQkJcGNpX2ZyZWVfY29uc2lzdGVudChhZGFwdGVyLT5wY2lkZXYsCi0JCQkJCSAgICBzaXplb2YoU1hHX1hNVF9SSU5HKSAqIDQwOTYsCisJCQkJCSAgICBzaXplb2Yoc3RydWN0IFNYR19YTVRfUklORykgKiA0MDk2LAogCQkJCQkgICAgYWRhcHRlci0+WG10UmluZ3MsCiAJCQkJCSAgICBhZGFwdGVyLT5QWG10UmluZ3MpOwogCQkJYWRhcHRlci0+WG10UmluZ3MgPSBOVUxMOwogCQl9CiAJCWlmIChhZGFwdGVyLT5SY3ZSaW5ncykgewogCQkJcGNpX2ZyZWVfY29uc2lzdGVudChhZGFwdGVyLT5wY2lkZXYsCi0JCQkJCSAgICBzaXplb2YoU1hHX1JDVl9SSU5HKSAqIDQwOTYsCisJCQkJCSAgICBzaXplb2Yoc3RydWN0IFNYR19SQ1ZfUklORykgKiA0MDk2LAogCQkJCQkgICAgYWRhcHRlci0+UmN2UmluZ3MsCiAJCQkJCSAgICBhZGFwdGVyLT5QUmN2UmluZ3MpOwogCQkJYWRhcHRlci0+UmN2UmluZ3MgPSBOVUxMOwpAQCAtNTE3LDcgKzUxNyw3IEBACiAJLyogU2FuaXR5IGNoZWNrIHJlY2VpdmUgZGF0YSBzdHJ1Y3R1cmUgZm9ybWF0ICovCiAJQVNTRVJUKChhZGFwdGVyLT5SZWNlaXZlQnVmZmVyU2l6ZSA9PSBTWEdfUkNWX0RBVEFfQlVGRkVSX1NJWkUpIHx8CiAJICAgICAgIChhZGFwdGVyLT5SZWNlaXZlQnVmZmVyU2l6ZSA9PSBTWEdfUkNWX0pVTUJPX0JVRkZFUl9TSVpFKSk7Ci0JQVNTRVJUKHNpemVvZihTWEdfUkNWX0RFU0NSSVBUT1JfQkxPQ0spID09CisJQVNTRVJUKHNpemVvZihzdHJ1Y3QgU1hHX1JDVl9ERVNDUklQVE9SX0JMT0NLKSA9PQogCSAgICAgICBTWEdfUkNWX0RFU0NSSVBUT1JfQkxPQ0tfU0laRSk7CiAKIAkvKiBBbGxvY2F0ZSByZWNlaXZlIGRhdGEgYnVmZmVycy4gIFdlIGFsbG9jYXRlIGEgYmxvY2sgb2YgYnVmZmVycyBhbmQgKi8KQEAgLTUzOSwxMSArNTM5LDExIEBACiAJfQogCiAJREJHX0VSUk9SKCIlcyBBbGxvY2F0ZSBFdmVudFJpbmdzIHNpemVbJXhdXG4iLCBfX2Z1bmNfXywKLQkJICAodW5zaWduZWQgaW50KShzaXplb2YoU1hHX0VWRU5UX1JJTkcpICogUnNzSWRzKSk7CisJCSAgKHVuc2lnbmVkIGludCkoc2l6ZW9mKHN0cnVjdCBTWEdfRVZFTlRfUklORykgKiBSc3NJZHMpKTsKIAogCS8qIEFsbG9jYXRlIGV2ZW50IHF1ZXVlcy4gKi8KIAlhZGFwdGVyLT5FdmVudFJpbmdzID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQoYWRhcHRlci0+cGNpZGV2LAotCQkJCQkJICAgc2l6ZW9mKFNYR19FVkVOVF9SSU5HKSAqCisJCQkJCQkgICBzaXplb2Yoc3RydWN0IFNYR19FVkVOVF9SSU5HKSAqCiAJCQkJCQkgICBSc3NJZHMsCiAJCQkJCQkgICAmYWRhcHRlci0+UEV2ZW50UmluZ3MpOwogCkBAIC01NTQsNyArNTU0LDcgQEAKIAkJc3RhdHVzID0gU1RBVFVTX1JFU09VUkNFUzsKIAkJZ290byBwZXJfdGNiX2FsbG9jYXRpb25fZmFpbGVkOwogCX0KLQltZW1zZXQoYWRhcHRlci0+RXZlbnRSaW5ncywgMCwgc2l6ZW9mKFNYR19FVkVOVF9SSU5HKSAqIFJzc0lkcyk7CisJbWVtc2V0KGFkYXB0ZXItPkV2ZW50UmluZ3MsIDAsIHNpemVvZihzdHJ1Y3QgU1hHX0VWRU5UX1JJTkcpICogUnNzSWRzKTsKIAogCURCR19FUlJPUigiJXMgQWxsb2NhdGUgSVNSIHNpemVbJXhdXG4iLCBfX2Z1bmNfXywgSXNyQ291bnQpOwogCS8qIEFsbG9jYXRlIElTUiAqLwpAQCAtNjI4LDcgKzYyOCw3IEBACiAJc3RhdGljIGludCBkaWRfdmVyc2lvbiA9IDA7CiAJaW50IGVycjsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2OwotCXBfYWRhcHRlcl90IGFkYXB0ZXI7CisJc3RydWN0IGFkYXB0ZXJfdCAqYWRhcHRlcjsKIAl2b2lkIF9faW9tZW0gKm1lbW1hcHBlZF9pb2FkZHI7CiAJdTMyIHN0YXR1cyA9IDA7CiAJdWxvbmcgbW1pb19zdGFydCA9IDA7CkBAIC02ODEsNyArNjgxLDcgQEAKIAlwY2lfc2V0X21hc3RlcihwY2lkZXYpOwogCiAJREJHX0VSUk9SKCJjYWxsIGFsbG9jX2V0aGVyZGV2XG4iKTsKLQluZXRkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2YoYWRhcHRlcl90KSk7CisJbmV0ZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKHN0cnVjdCBhZGFwdGVyX3QpKTsKIAlpZiAoIW5ldGRldikgewogCQllcnIgPSAtRU5PTUVNOwogCQlnb3RvIGVycl9vdXRfZXhpdF9zeGdfcHJvYmU7CkBAIC04NzEsNyArODcxLDcgQEAKICAqIFJldHVybiBWYWx1ZToKICAqIAlOb25lLgogICovCi1zdGF0aWMgdm9pZCBzeGdfZGlzYWJsZV9pbnRlcnJ1cHQocF9hZGFwdGVyX3QgYWRhcHRlcikKK3N0YXRpYyB2b2lkIHN4Z19kaXNhYmxlX2ludGVycnVwdChzdHJ1Y3QgYWRhcHRlcl90ICphZGFwdGVyKQogewogCVNYR19UUkFDRShUUkFDRV9TWEcsIFN4Z1RyYWNlQnVmZmVyLCBUUkFDRV9OT0lTWSwgIkRpc0ludHIiLAogCQkgIGFkYXB0ZXIsIGFkYXB0ZXItPkludGVycnVwdHNFbmFibGVkLCAwLCAwKTsKQEAgLTkwMiw3ICs5MDIsNyBAQAogICogUmV0dXJuIFZhbHVlOgogICogCU5vbmUuCiAgKi8KLXN0YXRpYyB2b2lkIHN4Z19lbmFibGVfaW50ZXJydXB0KHBfYWRhcHRlcl90IGFkYXB0ZXIpCitzdGF0aWMgdm9pZCBzeGdfZW5hYmxlX2ludGVycnVwdChzdHJ1Y3QgYWRhcHRlcl90ICphZGFwdGVyKQogewogCVNYR19UUkFDRShUUkFDRV9TWEcsIFN4Z1RyYWNlQnVmZmVyLCBUUkFDRV9OT0lTWSwgIkVuSW50ciIsCiAJCSAgYWRhcHRlciwgYWRhcHRlci0+SW50ZXJydXB0c0VuYWJsZWQsIDAsIDApOwpAQCAtOTM1LDcgKzkzNSw3IEBACiBzdGF0aWMgaXJxcmV0dXJuX3Qgc3hnX2lzcihpbnQgaXJxLCB2b2lkICpkZXZfaWQpCiB7CiAJcF9uZXRfZGV2aWNlIGRldiA9IChwX25ldF9kZXZpY2UpIGRldl9pZDsKLQlwX2FkYXB0ZXJfdCBhZGFwdGVyID0gKHBfYWRhcHRlcl90KSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBhZGFwdGVyX3QgKmFkYXB0ZXIgPSAoc3RydWN0IGFkYXB0ZXJfdCAqKSBuZXRkZXZfcHJpdihkZXYpOwogLyogICAgICB1MzIgICAgICAgICAgICAgICAgIENwdU1hc2sgPSAwLCBpOyAqLwogCiAJYWRhcHRlci0+U3RhdHMuTnVtSW50cysrOwpAQCAtOTYzLDggKzk2Myw4IEBACiAJCWZvciAoaSA9IDA7CiAJCSAgICAgaSA8IGFkYXB0ZXItPlJzc1N5c3RlbUluZm8tPlByb2Nlc3NvckluZm8uUnNzQ3B1Q291bnQ7CiAJCSAgICAgaSsrKSB7Ci0JCQlQU1hHX0VWRU5UX1JJTkcgRXZlbnRSaW5nID0gJmFkYXB0ZXItPkV2ZW50UmluZ3NbaV07Ci0JCQlQU1hHX0VWRU5UIEV2ZW50ID0KKwkJCXN0cnVjdCBYR19FVkVOVF9SSU5HICpFdmVudFJpbmcgPSAmYWRhcHRlci0+RXZlbnRSaW5nc1tpXTsKKwkJCXN0cnVjdCBTWEdfRVZFTlQgKkV2ZW50ID0KIAkJCSAgICAmRXZlbnRSaW5nLT5SaW5nW2FkYXB0ZXItPk5leHRFdmVudFtpXV07CiAJCQl1bnNpZ25lZCBjaGFyIENwdSA9CiAJCQkgICAgYWRhcHRlci0+UnNzU3lzdGVtSW5mby0+UnNzSWRUb0NwdVtpXTsKQEAgLTk5Miw3ICs5OTIsNyBAQAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAotc3RhdGljIHZvaWQgc3hnX2hhbmRsZV9pbnRlcnJ1cHQocF9hZGFwdGVyX3QgYWRhcHRlcikKK3N0YXRpYyB2b2lkIHN4Z19oYW5kbGVfaW50ZXJydXB0KHN0cnVjdCBhZGFwdGVyX3QgKmFkYXB0ZXIpCiB7CiAvKiAgICB1bnNpZ25lZCBjaGFyICAgICAgICAgICBSc3NJZCAgID0gMDsgKi8KIAl1MzIgTmV3SXNyOwpAQCAtMTA1Niw3ICsxMDU2LDcgQEAKICAqIFJldHVybiBWYWx1ZToKICAqIAlOb25lCiAgKi8KLXN0YXRpYyBpbnQgc3hnX3Byb2Nlc3NfaXNyKHBfYWRhcHRlcl90IGFkYXB0ZXIsIHUzMiBNZXNzYWdlSWQpCitzdGF0aWMgaW50IHN4Z19wcm9jZXNzX2lzcihzdHJ1Y3QgYWRhcHRlcl90ICphZGFwdGVyLCB1MzIgTWVzc2FnZUlkKQogewogCXUzMiBJc3IgPSBhZGFwdGVyLT5Jc3JDb3B5W01lc3NhZ2VJZF07CiAJdTMyIE5ld0lzciA9IDA7CkBAIC0xMTUzLDEwICsxMTUzLDEwIEBACiAgKiBSZXR1cm4gVmFsdWU6CiAgKiAJTm9uZS4KICAqLwotc3RhdGljIHUzMiBzeGdfcHJvY2Vzc19ldmVudF9xdWV1ZShwX2FkYXB0ZXJfdCBhZGFwdGVyLCB1MzIgUnNzSWQpCitzdGF0aWMgdTMyIHN4Z19wcm9jZXNzX2V2ZW50X3F1ZXVlKHN0cnVjdCBhZGFwdGVyX3QgKmFkYXB0ZXIsIHUzMiBSc3NJZCkKIHsKLQlQU1hHX0VWRU5UX1JJTkcgRXZlbnRSaW5nID0gJmFkYXB0ZXItPkV2ZW50UmluZ3NbUnNzSWRdOwotCVBTWEdfRVZFTlQgRXZlbnQgPSAmRXZlbnRSaW5nLT5SaW5nW2FkYXB0ZXItPk5leHRFdmVudFtSc3NJZF1dOworCXN0cnVjdCBTWEdfRVZFTlRfUklORyAqRXZlbnRSaW5nID0gJmFkYXB0ZXItPkV2ZW50UmluZ3NbUnNzSWRdOworCXN0cnVjdCBTWEdfRVZFTlQgKkV2ZW50ID0gJkV2ZW50UmluZy0+UmluZ1thZGFwdGVyLT5OZXh0RXZlbnRbUnNzSWRdXTsKIAl1MzIgRXZlbnRzUHJvY2Vzc2VkID0gMCwgQmF0Y2hlcyA9IDA7CiAJdTMyIG51bV9za2JzID0gMDsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwpAQCAtMTE2NCw3ICsxMTY0LDcgQEAKIAlzdHJ1Y3Qgc2tfYnVmZiAqcHJldl9za2IgPSBOVUxMOwogCXN0cnVjdCBza19idWZmICpJbmRpY2F0aW9uTGlzdFtTWEdfUkNWX0FSUkFZU0laRV07CiAJdTMyIEluZGV4OwotCVBTWEdfUkNWX0RBVEFfQlVGRkVSX0hEUiBSY3ZEYXRhQnVmZmVySGRyOworCXN0cnVjdCBTWEdfUkNWX0RBVEFfQlVGRkVSX0hEUiAqUmN2RGF0YUJ1ZmZlckhkcjsKICNlbmRpZgogCXUzMiBSZXR1cm5TdGF0dXMgPSAwOwogCkBAIC0xMjkzLDEyICsxMjkzLDEyIEBACiAgKiBSZXR1cm4KICAqCU5vbmUKICAqLwotc3RhdGljIHZvaWQgc3hnX2NvbXBsZXRlX3Nsb3dfc2VuZChwX2FkYXB0ZXJfdCBhZGFwdGVyKQorc3RhdGljIHZvaWQgc3hnX2NvbXBsZXRlX3Nsb3dfc2VuZChzdHJ1Y3QgYWRhcHRlcl90ICphZGFwdGVyKQogewotCVBTWEdfWE1UX1JJTkcgWG10UmluZyA9ICZhZGFwdGVyLT5YbXRSaW5nc1swXTsKLQlQU1hHX1JJTkdfSU5GTyBYbXRSaW5nSW5mbyA9ICZhZGFwdGVyLT5YbXRSaW5nWmVyb0luZm87CisJc3RydWN0IFNYR19YTVRfUklORyAqWG10UmluZyA9ICZhZGFwdGVyLT5YbXRSaW5nc1swXTsKKwlzdHJ1Y3QgU1hHX1JJTkdfSU5GTyAqWG10UmluZ0luZm8gPSAmYWRhcHRlci0+WG10UmluZ1plcm9JbmZvOwogCXUzMiAqQ29udGV4dFR5cGU7Ci0JUFNYR19DTUQgWG10Q21kOworCXN0cnVjdCBTWEdfQ01EICpYbXRDbWQ7CiAKIAkvKiBOT1RFIC0gVGhpcyBsb2NrIGlzIGRyb3BwZWQgYW5kIHJlZ3JhYmJlZCBpbiB0aGlzIGxvb3AuICovCiAJLyogVGhpcyBtZWFucyB0d28gZGlmZmVyZW50IHByb2Nlc3NvcnMgY2FuIGJvdGggYmUgcnVubmluZyAqLwpAQCAtMTM1OSwxMiArMTM1OSwxMiBAQAogICogUmV0dXJuCiAgKgkgc2tiCiAgKi8KLXN0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqc3hnX3Nsb3dfcmVjZWl2ZShwX2FkYXB0ZXJfdCBhZGFwdGVyLCBQU1hHX0VWRU5UIEV2ZW50KQorc3RhdGljIHN0cnVjdCBza19idWZmICpzeGdfc2xvd19yZWNlaXZlKHN0cnVjdCBhZGFwdGVyX3QgKmFkYXB0ZXIsIHN0cnVjdCBTWEdfRVZFTlQgKkV2ZW50KQogewotCVBTWEdfUkNWX0RBVEFfQlVGRkVSX0hEUiBSY3ZEYXRhQnVmZmVySGRyOworCXN0cnVjdCBTWEdfUkNWX0RBVEFfQlVGRkVSX0hEUiAqUmN2RGF0YUJ1ZmZlckhkcjsKIAlzdHJ1Y3Qgc2tfYnVmZiAqUGFja2V0OwogCi0JUmN2RGF0YUJ1ZmZlckhkciA9IChQU1hHX1JDVl9EQVRBX0JVRkZFUl9IRFIpIEV2ZW50LT5Ib3N0SGFuZGxlOworCVJjdkRhdGFCdWZmZXJIZHIgPSAoc3RydWN0IFNYR19SQ1ZfREFUQV9CVUZGRVJfSERSKikgRXZlbnQtPkhvc3RIYW5kbGU7CiAJQVNTRVJUKFJjdkRhdGFCdWZmZXJIZHIpOwogCUFTU0VSVChSY3ZEYXRhQnVmZmVySGRyLT5TdGF0ZSA9PSBTWEdfQlVGRkVSX09OQ0FSRCk7CiAJQVNTRVJUKFNYR19SRUNFSVZFX0RBVEFfTE9DQVRJT04oUmN2RGF0YUJ1ZmZlckhkcikgPT0KQEAgLTE0MDAsNyArMTQwMCw3IEBACiAJfQogI2lmIFhYWFRPRE8JCQkvKiBWTEFOIHN0dWZmICovCiAJLyogSWYgdGhlcmUncyBhIFZMQU4gdGFnLCBleHRyYWN0IGl0IGFuZCB2YWxpZGF0ZSBpdCAqLwotCWlmICgoKHBfZXRoZXJfaGVhZGVyKSAoU1hHX1JFQ0VJVkVfREFUQV9MT0NBVElPTihSY3ZEYXRhQnVmZmVySGRyKSkpLT4KKwlpZiAoKChzdHJ1Y3QgZXRoZXJfaGVhZGVyKikgKFNYR19SRUNFSVZFX0RBVEFfTE9DQVRJT04oUmN2RGF0YUJ1ZmZlckhkcikpKS0+CiAJICAgIEV0aGVyVHlwZSA9PSBFVEhFUlRZUEVfVkxBTikgewogCQlpZiAoU3hnRXh0cmFjdFZsYW5IZWFkZXIoYWRhcHRlciwgUmN2RGF0YUJ1ZmZlckhkciwgRXZlbnQpICE9CiAJCSAgICBTVEFUVVNfU1VDQ0VTUykgewpAQCAtMTQxNSw3ICsxNDE1LDcgQEAKIAkvKiAqLwogCS8qIER1bWItbmljIGZyYW1lLiAgU2VlIGlmIGl0IHBhc3NlcyBvdXIgbWFjIGZpbHRlciBhbmQgdXBkYXRlIHN0YXRzICovCiAJLyogKi8KLQlpZiAoIXN4Z19tYWNfZmlsdGVyKGFkYXB0ZXIsIChwX2V0aGVyX2hlYWRlcikKKwlpZiAoIXN4Z19tYWNfZmlsdGVyKGFkYXB0ZXIsIChzdHJ1Y3QgZXRoZXJfaGVhZGVyKikKIAkJCSAgICBTWEdfUkVDRUlWRV9EQVRBX0xPQ0FUSU9OKFJjdkRhdGFCdWZmZXJIZHIpLAogCQkJICAgIEV2ZW50LT5MZW5ndGgpKSB7CiAJCVNYR19UUkFDRShUUkFDRV9TWEcsIFN4Z1RyYWNlQnVmZmVyLCBUUkFDRV9OT0lTWSwgIlJjdkZpbHRyIiwKQEAgLTE0NTYsNyArMTQ1Niw3IEBACiAgKiBSZXR1cm4gVmFsdWU6CiAgKiAJTm9uZQogICovCi1zdGF0aWMgdm9pZCBzeGdfcHJvY2Vzc19yY3ZfZXJyb3IocF9hZGFwdGVyX3QgYWRhcHRlciwgdTMyIEVycm9yU3RhdHVzKQorc3RhdGljIHZvaWQgc3hnX3Byb2Nlc3NfcmN2X2Vycm9yKHN0cnVjdCBhZGFwdGVyX3QgKmFkYXB0ZXIsIHUzMiBFcnJvclN0YXR1cykKIHsKIAl1MzIgRXJyb3I7CiAKQEAgLTE1MzUsNyArMTUzNSw3IEBACiAgKiBSZXR1cm4gVmFsdWU6CiAgKiAJVFJVRSBpZiB0aGUgZnJhbWUgaXMgdG8gYmUgYWxsb3dlZAogICovCi1zdGF0aWMgYm9vbCBzeGdfbWFjX2ZpbHRlcihwX2FkYXB0ZXJfdCBhZGFwdGVyLCBwX2V0aGVyX2hlYWRlciBFdGhlckhkciwKK3N0YXRpYyBib29sIHN4Z19tYWNfZmlsdGVyKHN0cnVjdCBhZGFwdGVyX3QgKmFkYXB0ZXIsIHN0cnVjdCBldGhlcl9oZWFkZXIgKkV0aGVySGRyLAogCQkJICAgdXNob3J0IGxlbmd0aCkKIHsKIAlib29sIEVxdWFsQWRkcjsKQEAgLTE1NjAsNyArMTU2MCw3IEBACiAJCQkJcmV0dXJuIChUUlVFKTsKIAkJCX0KIAkJCWlmIChhZGFwdGVyLT5NYWNGaWx0ZXIgJiBNQUNfTUNBU1QpIHsKLQkJCQlQU1hHX01VTFRJQ0FTVF9BRERSRVNTIE11bHRpY2FzdEFkZHJzID0KKwkJCQlzdHJ1Y3QgU1hHX01VTFRJQ0FTVF9BRERSRVNTICpNdWx0aWNhc3RBZGRycyA9CiAJCQkJICAgIGFkYXB0ZXItPk11bHRpY2FzdEFkZHJzOwogCQkJCXdoaWxlIChNdWx0aWNhc3RBZGRycykgewogCQkJCQlFVEhFUl9FUV9BRERSKE11bHRpY2FzdEFkZHJzLT5BZGRyZXNzLApAQCAtMTYwMCw3ICsxNjAwLDcgQEAKIAlyZXR1cm4gKEZBTFNFKTsKIH0KIAotc3RhdGljIGludCBzeGdfcmVnaXN0ZXJfaW50ZXJydXB0KHBfYWRhcHRlcl90IGFkYXB0ZXIpCitzdGF0aWMgaW50IHN4Z19yZWdpc3Rlcl9pbnRlcnJ1cHQoc3RydWN0IGFkYXB0ZXJfdCAqYWRhcHRlcikKIHsKIAlpZiAoIWFkYXB0ZXItPmludHJyZWdpc3RlcmVkKSB7CiAJCWludCByZXR2YWw7CkBAIC0xNjM1LDcgKzE2MzUsNyBAQAogCXJldHVybiAoU1RBVFVTX1NVQ0NFU1MpOwogfQogCi1zdGF0aWMgdm9pZCBzeGdfZGVyZWdpc3Rlcl9pbnRlcnJ1cHQocF9hZGFwdGVyX3QgYWRhcHRlcikKK3N0YXRpYyB2b2lkIHN4Z19kZXJlZ2lzdGVyX2ludGVycnVwdChzdHJ1Y3QgYWRhcHRlcl90ICphZGFwdGVyKQogewogCURCR19FUlJPUigic3hnOiAlcyBFTlRFUiBhZGFwdGVyWyVwXVxuIiwgX19mdW5jX18sIGFkYXB0ZXIpOwogI2lmIFhYWFRPRE8KQEAgLTE2NjEsNyArMTY2MSw3IEBACiAgKiAgUGVyZm9ybSBpbml0aWFsaXphdGlvbiBvZiBvdXIgc2xpYyBpbnRlcmZhY2UuCiAgKgogICovCi1zdGF0aWMgaW50IHN4Z19pZl9pbml0KHBfYWRhcHRlcl90IGFkYXB0ZXIpCitzdGF0aWMgaW50IHN4Z19pZl9pbml0KHN0cnVjdCBhZGFwdGVyX3QgKmFkYXB0ZXIpCiB7CiAJcF9uZXRfZGV2aWNlIGRldiA9IGFkYXB0ZXItPm5ldGRldjsKIAlpbnQgc3RhdHVzID0gMDsKQEAgLTE3MjEsNyArMTcyMSw3IEBACiAKIHN0YXRpYyBpbnQgc3hnX2VudHJ5X29wZW4ocF9uZXRfZGV2aWNlIGRldikKIHsKLQlwX2FkYXB0ZXJfdCBhZGFwdGVyID0gKHBfYWRhcHRlcl90KSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBhZGFwdGVyX3QgKmFkYXB0ZXIgPSAoc3RydWN0IGFkYXB0ZXJfdCAqKSBuZXRkZXZfcHJpdihkZXYpOwogCWludCBzdGF0dXM7CiAKIAlBU1NFUlQoYWRhcHRlcik7CkBAIC0xNzc3LDcgKzE3NzcsNyBAQAogCXBfbmV0X2RldmljZSBkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGNpZGV2KTsKIAl1MzIgbW1pb19zdGFydCA9IDA7CiAJdW5zaWduZWQgaW50IG1taW9fbGVuID0gMDsKLQlwX2FkYXB0ZXJfdCBhZGFwdGVyID0gKHBfYWRhcHRlcl90KSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBhZGFwdGVyX3QgKmFkYXB0ZXIgPSAoc3RydWN0IGFkYXB0ZXJfdCAqKSBuZXRkZXZfcHJpdihkZXYpOwogCiAJQVNTRVJUKGFkYXB0ZXIpOwogCURCR19FUlJPUigic3hnOiAlcyBFTlRFUiBkZXZbJXBdIGFkYXB0ZXJbJXBdXG4iLCBfX2Z1bmNfXywgZGV2LApAQCAtMTgwNSw3ICsxODA1LDcgQEAKIAogc3RhdGljIGludCBzeGdfZW50cnlfaGFsdChwX25ldF9kZXZpY2UgZGV2KQogewotCXBfYWRhcHRlcl90IGFkYXB0ZXIgPSAocF9hZGFwdGVyX3QpIG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGFkYXB0ZXJfdCAqYWRhcHRlciA9IChzdHJ1Y3QgYWRhcHRlcl90ICopIG5ldGRldl9wcml2KGRldik7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmc3hnX2dsb2JhbC5kcml2ZXJfbG9jaywgc3hnX2dsb2JhbC5mbGFncyk7CiAJREJHX0VSUk9SKCJzeGc6ICVzICglcykgRU5URVJcbiIsIF9fZnVuY19fLCBkZXYtPm5hbWUpOwpAQCAtMTgzMCw3ICsxODMwLDcgQEAKIAlzd2l0Y2ggKGNtZCkgewogCWNhc2UgU0lPQ1NMSUNTRVRJTlRBR0c6CiAJCXsKLS8qICAgICAgICAgICAgICAgICAgICAgIHBfYWRhcHRlcl90IGFkYXB0ZXIgPSAocF9hZGFwdGVyX3QpIG5ldGRldl9wcml2KGRldik7ICovCisvKiAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYWRhcHRlcl90ICphZGFwdGVyID0gKHN0cnVjdCBhZGFwdGVyX3QgKikgbmV0ZGV2X3ByaXYoZGV2KTsgKi8KIAkJCXUzMiBkYXRhWzddOwogCQkJdTMyIGludGFnZzsKIApAQCAtMTg2OCw3ICsxODY4LDcgQEAKICAqLwogc3RhdGljIGludCBzeGdfc2VuZF9wYWNrZXRzKHN0cnVjdCBza19idWZmICpza2IsIHBfbmV0X2RldmljZSBkZXYpCiB7Ci0JcF9hZGFwdGVyX3QgYWRhcHRlciA9IChwX2FkYXB0ZXJfdCkgbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgYWRhcHRlcl90ICphZGFwdGVyID0gKHN0cnVjdCBhZGFwdGVyX3QgKikgbmV0ZGV2X3ByaXYoZGV2KTsKIAl1MzIgc3RhdHVzID0gU1RBVFVTX1NVQ0NFU1M7CiAKIAlEQkdfRVJST1IoInN4ZzogJXMgRU5URVIgc3hnX3NlbmRfcGFja2V0cyBza2JbJXBdXG4iLCBfX2Z1bmNfXywKQEAgLTE5MzQsMTAgKzE5MzQsMTAgQEAKICAqIFJldHVybiAtCiAgKiAJCVNUQVRVUyBvZiBzZW5kCiAgKi8KLXN0YXRpYyBpbnQgc3hnX3RyYW5zbWl0X3BhY2tldChwX2FkYXB0ZXJfdCBhZGFwdGVyLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQorc3RhdGljIGludCBzeGdfdHJhbnNtaXRfcGFja2V0KHN0cnVjdCBhZGFwdGVyX3QgKmFkYXB0ZXIsIHN0cnVjdCBza19idWZmICpza2IpCiB7Ci0JUFNDQVRURVJfR0FUSEVSX0xJU1QgcFNnbDsKLQlQU1hHX1NDQVRURVJfR0FUSEVSIFN4Z1NnbDsKKwlzdHJ1Y3QgU0NBVFRFUl9HQVRIRVJfTElTVCAqcFNnbDsKKwlzdHJ1Y3QgU1hHX1NDQVRURVJfR0FUSEVSICpTeGdTZ2w7CiAJdm9pZCAqU2dsQnVmZmVyOwogCXUzMiBTZ2xCdWZmZXJMZW5ndGg7CiAKQEAgLTE5ODAsMTQgKzE5ODAsMTQgQEAKICAqIFJldHVybiBWYWx1ZToKICAqIAlOb25lLgogICovCi1zdGF0aWMgdm9pZCBzeGdfZHVtYl9zZ2woUFNDQVRURVJfR0FUSEVSX0xJU1QgcFNnbCwgUFNYR19TQ0FUVEVSX0dBVEhFUiBTeGdTZ2wpCitzdGF0aWMgdm9pZCBzeGdfZHVtYl9zZ2woc3RydWN0IFNDQVRURVJfR0FUSEVSX0xJU1QgKnBTZ2wsIHN0cnVjdCBTWEdfU0NBVFRFUl9HQVRIRVIgKlN4Z1NnbCkKIHsKLQlwX2FkYXB0ZXJfdCBhZGFwdGVyID0gU3hnU2dsLT5hZGFwdGVyOworCXN0cnVjdCBhZGFwdGVyX3QgKmFkYXB0ZXIgPSBTeGdTZ2wtPmFkYXB0ZXI7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IFN4Z1NnbC0+RHVtYlBhY2tldDsKIAkvKiBGb3Igbm93LCBhbGwgZHVtYi1uaWMgc2VuZHMgZ28gb24gUlNTIHF1ZXVlIHplcm8gKi8KLQlQU1hHX1hNVF9SSU5HIFhtdFJpbmcgPSAmYWRhcHRlci0+WG10UmluZ3NbMF07Ci0JUFNYR19SSU5HX0lORk8gWG10UmluZ0luZm8gPSAmYWRhcHRlci0+WG10UmluZ1plcm9JbmZvOwotCVBTWEdfQ01EIFhtdENtZCA9IE5VTEw7CisJc3RydWN0IFNYR19YTVRfUklORyAqWG10UmluZyA9ICZhZGFwdGVyLT5YbXRSaW5nc1swXTsKKwlzdHJ1Y3QgU1hHX1JJTkdfSU5GTyAqWG10UmluZ0luZm8gPSAmYWRhcHRlci0+WG10UmluZ1plcm9JbmZvOworCXN0cnVjdCBTWEdfQ01EICpYbXRDbWQgPSBOVUxMOwogLyogICAgICB1MzIgICAgICAgICAgICAgICAgICAgICAgICAgSW5kZXggPSAwOyAqLwogCXUzMiBEYXRhTGVuZ3RoID0gc2tiLT5sZW47CiAvKiAgdW5zaWduZWQgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWZMZW47ICovCkBAIC0yMTE3LDkgKzIxMTcsOSBAQAogICogUmV0dXJuCiAgKglzdGF0dXMKICAqLwotc3RhdGljIGludCBzeGdfaW5pdGlhbGl6ZV9saW5rKHBfYWRhcHRlcl90IGFkYXB0ZXIpCitzdGF0aWMgaW50IHN4Z19pbml0aWFsaXplX2xpbmsoc3RydWN0IGFkYXB0ZXJfdCAqYWRhcHRlcikKIHsKLQlQU1hHX0hXX1JFR1MgSHdSZWdzID0gYWRhcHRlci0+SHdSZWdzOworCXN0cnVjdCBTWEdfSFdfUkVHUyAqSHdSZWdzID0gYWRhcHRlci0+SHdSZWdzOwogCXUzMiBWYWx1ZTsKIAl1MzIgQ29uZmlnRGF0YTsKIAl1MzIgTWF4RnJhbWU7CkBAIC0yMjc0LDEwICsyMjc0LDEwIEBACiAgKiBSZXR1cm4KICAqCXN0YXR1cwogICovCi1zdGF0aWMgaW50IHN4Z19waHlfaW5pdChwX2FkYXB0ZXJfdCBhZGFwdGVyKQorc3RhdGljIGludCBzeGdfcGh5X2luaXQoc3RydWN0IGFkYXB0ZXJfdCAqYWRhcHRlcikKIHsKIAl1MzIgVmFsdWU7Ci0JUFBIWV9VQ09ERSBwOworCXN0cnVjdCBQSFlfVUNPREUgKnA7CiAJaW50IHN0YXR1czsKIAogCURCR19FUlJPUigiRU5URVIgJXNcbiIsIF9fZnVuY19fKTsKQEAgLTIzMjIsMTAgKzIzMjIsMTAgQEAKICAqIFJldHVybgogICoJTm9uZQogICovCi1zdGF0aWMgdm9pZCBzeGdfbGlua19ldmVudChwX2FkYXB0ZXJfdCBhZGFwdGVyKQorc3RhdGljIHZvaWQgc3hnX2xpbmtfZXZlbnQoc3RydWN0IGFkYXB0ZXJfdCAqYWRhcHRlcikKIHsKLQlQU1hHX0hXX1JFR1MgSHdSZWdzID0gYWRhcHRlci0+SHdSZWdzOwotCVNYR19MSU5LX1NUQVRFIExpbmtTdGF0ZTsKKwlzdHJ1Y3QgU1hHX0hXX1JFR1MgKkh3UmVncyA9IGFkYXB0ZXItPkh3UmVnczsKKwllbnVtIFNYR19MSU5LX1NUQVRFIExpbmtTdGF0ZTsKIAlpbnQgc3RhdHVzOwogCXUzMiBWYWx1ZTsKIApAQCAtMjM3OSw3ICsyMzc5LDcgQEAKICAqIFJldHVybgogICoJTGluayBTdGF0ZQogICovCi1zdGF0aWMgU1hHX0xJTktfU1RBVEUgc3hnX2dldF9saW5rX3N0YXRlKHBfYWRhcHRlcl90IGFkYXB0ZXIpCitzdGF0aWMgZW51bSBTWEdfTElOS19TVEFURSBzeGdfZ2V0X2xpbmtfc3RhdGUoc3RydWN0IGFkYXB0ZXJfdCAqYWRhcHRlcikKIHsKIAlpbnQgc3RhdHVzOwogCXUzMiBWYWx1ZTsKQEAgLTI0MzMsOCArMjQzMyw4IEBACiAJcmV0dXJuIChTWEdfTElOS19ET1dOKTsKIH0KIAotc3RhdGljIHZvaWQgc3hnX2luZGljYXRlX2xpbmtfc3RhdGUocF9hZGFwdGVyX3QgYWRhcHRlciwKLQkJCQkgICAgU1hHX0xJTktfU1RBVEUgTGlua1N0YXRlKQorc3RhdGljIHZvaWQgc3hnX2luZGljYXRlX2xpbmtfc3RhdGUoc3RydWN0IGFkYXB0ZXJfdCAqYWRhcHRlciwKKwkJCQkgICAgZW51bSBTWEdfTElOS19TVEFURSBMaW5rU3RhdGUpCiB7CiAJaWYgKGFkYXB0ZXItPkxpbmtTdGF0ZSA9PSBTWEdfTElOS19VUCkgewogCQlEQkdfRVJST1IoIiVzOiBMSU5LIG5vdyBVUCwgY2FsbCBuZXRpZl9zdGFydF9xdWV1ZVxuIiwKQEAgLTI0NjAsNyArMjQ2MCw3IEBACiAgKiBSZXR1cm4KICAqCU5vbmUKICAqLwotc3RhdGljIHZvaWQgc3hnX2xpbmtfc3RhdGUocF9hZGFwdGVyX3QgYWRhcHRlciwgU1hHX0xJTktfU1RBVEUgTGlua1N0YXRlKQorc3RhdGljIHZvaWQgc3hnX2xpbmtfc3RhdGUoc3RydWN0IGFkYXB0ZXJfdCAqYWRhcHRlciwgZW51bSBTWEdfTElOS19TVEFURSBMaW5rU3RhdGUpCiB7CiAJU1hHX1RSQUNFKFRSQUNFX1NYRywgU3hnVHJhY2VCdWZmZXIsIFRSQUNFX0lNUE9SVEFOVCwgIkxua0lORENUIiwKIAkJICBhZGFwdGVyLCBMaW5rU3RhdGUsIGFkYXB0ZXItPkxpbmtTdGF0ZSwgYWRhcHRlci0+U3RhdGUpOwpAQCAtMjQ5OCwxMCArMjQ5OCwxMCBAQAogICogUmV0dXJuCiAgKglzdGF0dXMKICAqLwotc3RhdGljIGludCBzeGdfd3JpdGVfbWRpb19yZWcocF9hZGFwdGVyX3QgYWRhcHRlciwKK3N0YXRpYyBpbnQgc3hnX3dyaXRlX21kaW9fcmVnKHN0cnVjdCBhZGFwdGVyX3QgKmFkYXB0ZXIsCiAJCQkgICAgICB1MzIgRGV2QWRkciwgdTMyIFJlZ0FkZHIsIHUzMiBWYWx1ZSkKIHsKLQlQU1hHX0hXX1JFR1MgSHdSZWdzID0gYWRhcHRlci0+SHdSZWdzOworCXN0cnVjdCBTWEdfSFdfUkVHUyAqSHdSZWdzID0gYWRhcHRlci0+SHdSZWdzOwogCXUzMiBBZGRyT3A7CQkvKiBBZGRyZXNzIG9wZXJhdGlvbiAod3JpdHRlbiB0byBNSUlNIGZpZWxkIHJlZykgKi8KIAl1MzIgV3JpdGVPcDsJCS8qIFdyaXRlIG9wZXJhdGlvbiAod3JpdHRlbiB0byBNSUlNIGZpZWxkIHJlZykgKi8KIAl1MzIgQ21kOwkJLyogQ29tbWFuZCAod3JpdHRlbiB0byBNSUlNIGNvbW1hbmQgcmVnKSAqLwpAQCAtMjU4OCwxMCArMjU4OCwxMCBAQAogICogUmV0dXJuCiAgKglzdGF0dXMKICAqLwotc3RhdGljIGludCBzeGdfcmVhZF9tZGlvX3JlZyhwX2FkYXB0ZXJfdCBhZGFwdGVyLAorc3RhdGljIGludCBzeGdfcmVhZF9tZGlvX3JlZyhzdHJ1Y3QgYWRhcHRlcl90ICphZGFwdGVyLAogCQkJICAgICB1MzIgRGV2QWRkciwgdTMyIFJlZ0FkZHIsIHUzMiAqcFZhbHVlKQogewotCVBTWEdfSFdfUkVHUyBId1JlZ3MgPSBhZGFwdGVyLT5Id1JlZ3M7CisJc3RydWN0IFNYR19IV19SRUdTICpId1JlZ3MgPSBhZGFwdGVyLT5Id1JlZ3M7CiAJdTMyIEFkZHJPcDsJCS8qIEFkZHJlc3Mgb3BlcmF0aW9uICh3cml0dGVuIHRvIE1JSU0gZmllbGQgcmVnKSAqLwogCXUzMiBSZWFkT3A7CQkvKiBSZWFkIG9wZXJhdGlvbiAod3JpdHRlbiB0byBNSUlNIGZpZWxkIHJlZykgKi8KIAl1MzIgQ21kOwkJLyogQ29tbWFuZCAod3JpdHRlbiB0byBNSUlNIGNvbW1hbmQgcmVnKSAqLwpAQCAtMjczNSw5ICsyNzM1LDkgQEAKIAlyZXR1cm4gKG1hY2hhc2gpOwogfQogCi1zdGF0aWMgdm9pZCBzeGdfbWNhc3Rfc2V0X21hc2socF9hZGFwdGVyX3QgYWRhcHRlcikKK3N0YXRpYyB2b2lkIHN4Z19tY2FzdF9zZXRfbWFzayhzdHJ1Y3QgYWRhcHRlcl90ICphZGFwdGVyKQogewotCVBTWEdfVUNPREVfUkVHUyBzeGdfcmVncyA9IGFkYXB0ZXItPlVjb2RlUmVnczsKKwlzdHJ1Y3QgU1hHX1VDT0RFX1JFR1MgKnN4Z19yZWdzID0gYWRhcHRlci0+VWNvZGVSZWdzOwogCiAJREJHX0VSUk9SKCIlcyBFTlRFUiAoJXMpIG1hY29wdHNbJXhdIG1hc2tbJWxseF1cbiIsIF9fZnVuY19fLAogCQkgIGFkYXB0ZXItPm5ldGRldi0+bmFtZSwgKHVuc2lnbmVkIGludClhZGFwdGVyLT5NYWNGaWx0ZXIsCkBAIC0yNzc1LDcgKzI3NzUsNyBAQAogICogIEFsbG9jYXRlIGEgbWNhc3RfYWRkcmVzcyBzdHJ1Y3R1cmUgdG8gaG9sZCB0aGUgbXVsdGljYXN0IGFkZHJlc3MuCiAgKiAgTGluayBpdCBpbi4KICAqLwotc3RhdGljIGludCBzeGdfbWNhc3RfYWRkX2xpc3QocF9hZGFwdGVyX3QgYWRhcHRlciwgY2hhciAqYWRkcmVzcykKK3N0YXRpYyBpbnQgc3hnX21jYXN0X2FkZF9saXN0KHN0cnVjdCBhZGFwdGVyX3QgKmFkYXB0ZXIsIGNoYXIgKmFkZHJlc3MpCiB7CiAJcF9tY2FzdF9hZGRyZXNzX3QgbWNhZGRyLCBtbGlzdDsKIAlib29sIGVxdWFsYWRkcjsKQEAgLTI4MDMsNyArMjgwMyw3IEBACiAJcmV0dXJuIChTVEFUVVNfU1VDQ0VTUyk7CiB9CiAKLXN0YXRpYyB2b2lkIHN4Z19tY2FzdF9zZXRfYml0KHBfYWRhcHRlcl90IGFkYXB0ZXIsIGNoYXIgKmFkZHJlc3MpCitzdGF0aWMgdm9pZCBzeGdfbWNhc3Rfc2V0X2JpdChzdHJ1Y3QgYWRhcHRlcl90ICphZGFwdGVyLCBjaGFyICphZGRyZXNzKQogewogCXVuc2lnbmVkIGNoYXIgY3JjcG9seTsKIApAQCAtMjgyMSw3ICsyODIxLDcgQEAKIAogc3RhdGljIHZvaWQgc3hnX21jYXN0X3NldF9saXN0KHBfbmV0X2RldmljZSBkZXYpCiB7Ci0JcF9hZGFwdGVyX3QgYWRhcHRlciA9IChwX2FkYXB0ZXJfdCkgbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgYWRhcHRlcl90ICphZGFwdGVyID0gKHN0cnVjdCBhZGFwdGVyX3QgKikgbmV0ZGV2X3ByaXYoZGV2KTsKIAlpbnQgc3RhdHVzID0gU1RBVFVTX1NVQ0NFU1M7CiAJaW50IGk7CiAJY2hhciAqYWRkcmVzc2VzOwpAQCAtMjg3Niw3ICsyODc2LDcgQEAKIH0KICNlbmRpZgogCi1zdGF0aWMgdm9pZCBzeGdfdW5tYXBfbW1pb19zcGFjZShwX2FkYXB0ZXJfdCBhZGFwdGVyKQorc3RhdGljIHZvaWQgc3hnX3VubWFwX21taW9fc3BhY2Uoc3RydWN0IGFkYXB0ZXJfdCAqYWRhcHRlcikKIHsKICNpZiBMSU5VWF9GUkVFU19BREFQVEVSX1JFU09VUkNFUwogLyogICAgICBpZiAoYWRhcHRlci0+UmVncykgeyAqLwpAQCAtMjg5Niw3ICsyODk2LDcgQEAKICAqIFJldHVybgogICoJbm9uZQogICovCi12b2lkIFN4Z0ZyZWVSZXNvdXJjZXMocF9hZGFwdGVyX3QgYWRhcHRlcikKK3ZvaWQgU3hnRnJlZVJlc291cmNlcyhzdHJ1Y3QgYWRhcHRlcl90ICphZGFwdGVyKQogewogCXUzMiBSc3NJZHMsIElzckNvdW50OwogCVBUQ1BfT0JKRUNUIFRjcE9iamVjdDsKQEAgLTI5MjQsNyArMjkyNCw3IEBACiAJLyogRnJlZSBldmVudCBxdWV1ZXMuICovCiAJaWYgKGFkYXB0ZXItPkV2ZW50UmluZ3MpIHsKIAkJcGNpX2ZyZWVfY29uc2lzdGVudChhZGFwdGVyLT5wY2lkZXYsCi0JCQkJICAgIHNpemVvZihTWEdfRVZFTlRfUklORykgKiBSc3NJZHMsCisJCQkJICAgIHNpemVvZihzdHJ1Y3QgU1hHX0VWRU5UX1JJTkcpICogUnNzSWRzLAogCQkJCSAgICBhZGFwdGVyLT5FdmVudFJpbmdzLCBhZGFwdGVyLT5QRXZlbnRSaW5ncyk7CiAJfQogCWlmIChhZGFwdGVyLT5Jc3IpIHsKQEAgLTI5OTEsNyArMjk5MSw3IEBACiAgKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIHdoZW4gYSBtZW1vcnkgYWxsb2NhdGlvbiBoYXMgY29tcGxldGVkLgogICoKICAqIEFyZ3VtZW50cyAtCi0gKglwX2FkYXB0ZXJfdCAgICAJLSBPdXIgYWRhcHRlciBzdHJ1Y3R1cmUKKyAqCXN0cnVjdCBhZGFwdGVyX3QgKiAgIAktIE91ciBhZGFwdGVyIHN0cnVjdHVyZQogICoJVmlydHVhbEFkZHJlc3MJLSBNZW1vcnkgdmlydHVhbCBhZGRyZXNzCiAgKglQaHlzaWNhbEFkZHJlc3MJLSBNZW1vcnkgcGh5c2ljYWwgYWRkcmVzcwogICoJTGVuZ3RoCQktIExlbmd0aCBvZiBtZW1vcnkgYWxsb2NhdGVkIChvciAwKQpAQCAtMzAwMCwxMCArMzAwMCwxMCBAQAogICogUmV0dXJuCiAgKglOb25lLgogICovCi1zdGF0aWMgdm9pZCBzeGdfYWxsb2NhdGVfY29tcGxldGUocF9hZGFwdGVyX3QgYWRhcHRlciwKK3N0YXRpYyB2b2lkIHN4Z19hbGxvY2F0ZV9jb21wbGV0ZShzdHJ1Y3QgYWRhcHRlcl90ICphZGFwdGVyLAogCQkJCSAgdm9pZCAqVmlydHVhbEFkZHJlc3MsCiAJCQkJICBkbWFfYWRkcl90IFBoeXNpY2FsQWRkcmVzcywKLQkJCQkgIHUzMiBMZW5ndGgsIFNYR19CVUZGRVJfVFlQRSBDb250ZXh0KQorCQkJCSAgdTMyIExlbmd0aCwgZW51bSBTWEdfQlVGRkVSX1RZUEUgQ29udGV4dCkKIHsKIAlTWEdfVFJBQ0UoVFJBQ0VfU1hHLCBTeGdUcmFjZUJ1ZmZlciwgVFJBQ0VfTk9JU1ksICJBbGxvY0NtcCIsCiAJCSAgYWRhcHRlciwgVmlydHVhbEFkZHJlc3MsIExlbmd0aCwgQ29udGV4dCk7CkBAIC0zMDE4LDcgKzMwMTgsNyBAQAogCQkJCQkgICAgICAgUGh5c2ljYWxBZGRyZXNzLCBMZW5ndGgpOwogCQlicmVhazsKIAljYXNlIFNYR19CVUZGRVJfVFlQRV9TR0w6Ci0JCXN4Z19hbGxvY2F0ZV9zZ2xfYnVmZmVyX2NvbXBsZXRlKGFkYXB0ZXIsIChQU1hHX1NDQVRURVJfR0FUSEVSKQorCQlzeGdfYWxsb2NhdGVfc2dsX2J1ZmZlcl9jb21wbGV0ZShhZGFwdGVyLCAoc3RydWN0IFNYR19TQ0FUVEVSX0dBVEhFUiopCiAJCQkJCQkgVmlydHVhbEFkZHJlc3MsCiAJCQkJCQkgUGh5c2ljYWxBZGRyZXNzLCBMZW5ndGgpOwogCQlicmVhazsKQEAgLTMwMzksOCArMzAzOSw4IEBACiAgKiBSZXR1cm4KICAqCWludAogICovCi1zdGF0aWMgaW50IHN4Z19hbGxvY2F0ZV9idWZmZXJfbWVtb3J5KHBfYWRhcHRlcl90IGFkYXB0ZXIsCi0JCQkJICAgICAgdTMyIFNpemUsIFNYR19CVUZGRVJfVFlQRSBCdWZmZXJUeXBlKQorc3RhdGljIGludCBzeGdfYWxsb2NhdGVfYnVmZmVyX21lbW9yeShzdHJ1Y3QgYWRhcHRlcl90ICphZGFwdGVyLAorCQkJCSAgICAgIHUzMiBTaXplLCBlbnVtIFNYR19CVUZGRVJfVFlQRSBCdWZmZXJUeXBlKQogewogCWludCBzdGF0dXM7CiAJdm9pZCAqQnVmZmVyOwpAQCAtMzA5MSw3ICszMDkxLDcgQEAKICAqIFJldHVybgogICoKICAqLwotc3RhdGljIHZvaWQgc3hnX2FsbG9jYXRlX3JjdmJsb2NrX2NvbXBsZXRlKHBfYWRhcHRlcl90IGFkYXB0ZXIsCitzdGF0aWMgdm9pZCBzeGdfYWxsb2NhdGVfcmN2YmxvY2tfY29tcGxldGUoc3RydWN0IGFkYXB0ZXJfdCAqYWRhcHRlciwKIAkJCQkJICAgdm9pZCAqUmN2QmxvY2ssCiAJCQkJCSAgIGRtYV9hZGRyX3QgUGh5c2ljYWxBZGRyZXNzLAogCQkJCQkgICB1MzIgTGVuZ3RoKQpAQCAtMzA5OSwxMSArMzA5OSwxMSBAQAogCXUzMiBpOwogCXUzMiBCdWZmZXJTaXplID0gYWRhcHRlci0+UmVjZWl2ZUJ1ZmZlclNpemU7CiAJdTY0IFBhZGRyOwotCVBTWEdfUkNWX0JMT0NLX0hEUiBSY3ZCbG9ja0hkcjsKKwlzdHJ1Y3QgU1hHX1JDVl9CTE9DS19IRFIgKlJjdkJsb2NrSGRyOwogCXVuc2lnbmVkIGNoYXIgKlJjdkRhdGFCdWZmZXI7Ci0JUFNYR19SQ1ZfREFUQV9CVUZGRVJfSERSIFJjdkRhdGFCdWZmZXJIZHI7Ci0JUFNYR19SQ1ZfREVTQ1JJUFRPUl9CTE9DSyBSY3ZEZXNjcmlwdG9yQmxvY2s7Ci0JUFNYR19SQ1ZfREVTQ1JJUFRPUl9CTE9DS19IRFIgUmN2RGVzY3JpcHRvckJsb2NrSGRyOworCXN0cnVjdCBTWEdfUkNWX0RBVEFfQlVGRkVSX0hEUiAqUmN2RGF0YUJ1ZmZlckhkcjsKKwlzdHJ1Y3QgU1hHX1JDVl9ERVNDUklQVE9SX0JMT0NLICpSY3ZEZXNjcmlwdG9yQmxvY2s7CisJc3RydWN0IFNYR19SQ1ZfREVTQ1JJUFRPUl9CTE9DS19IRFIgKlJjdkRlc2NyaXB0b3JCbG9ja0hkcjsKIAogCVNYR19UUkFDRShUUkFDRV9TWEcsIFN4Z1RyYWNlQnVmZmVyLCBUUkFDRV9OT0lTWSwgIkFsUmN2QmxrIiwKIAkJICBhZGFwdGVyLCBSY3ZCbG9jaywgTGVuZ3RoLCAwKTsKQEAgLTMxMjksNyArMzEyOSw3IEBACiAJCSAgICAgaSsrLCBQYWRkciArPSBCdWZmZXJTaXplLCBSY3ZEYXRhQnVmZmVyICs9IEJ1ZmZlclNpemUpIHsKIAkJCS8qICovCiAJCQlSY3ZEYXRhQnVmZmVySGRyID0KLQkJCSAgICAoUFNYR19SQ1ZfREFUQV9CVUZGRVJfSERSKSAoUmN2RGF0YUJ1ZmZlciArCisJCQkgICAgKHN0cnVjdCBTWEdfUkNWX0RBVEFfQlVGRkVSX0hEUiopIChSY3ZEYXRhQnVmZmVyICsKIAkJCQkJCQlTWEdfUkNWX0RBVEFfQlVGRkVSX0hEUl9PRkZTRVQKIAkJCQkJCQkoQnVmZmVyU2l6ZSkpOwogCQkJUmN2RGF0YUJ1ZmZlckhkci0+VmlydHVhbEFkZHJlc3MgPSBSY3ZEYXRhQnVmZmVyOwpAQCAtMzE0Nyw3ICszMTQ3LDcgQEAKIAkvKiBQbGFjZSB0aGlzIGVudGlyZSBibG9jayBvZiBtZW1vcnkgb24gdGhlIEFsbFJjdkJsb2NrcyBxdWV1ZSBzbyBpdCBjYW4gYmUgKi8KIAkvKiBmcmVlIGxhdGVyICovCiAJUmN2QmxvY2tIZHIgPQotCSAgICAoUFNYR19SQ1ZfQkxPQ0tfSERSKSAoKHVuc2lnbmVkIGNoYXIgKilSY3ZCbG9jayArCisJICAgIChzdHJ1Y3QgU1hHX1JDVl9CTE9DS19IRFIqKSAoKHVuc2lnbmVkIGNoYXIgKilSY3ZCbG9jayArCiAJCQkJICBTWEdfUkNWX0JMT0NLX0hEUl9PRkZTRVQoQnVmZmVyU2l6ZSkpOwogCVJjdkJsb2NrSGRyLT5WaXJ0dWFsQWRkcmVzcyA9IFJjdkJsb2NrOwogCVJjdkJsb2NrSGRyLT5QaHlzaWNhbEFkZHJlc3MgPSBQaHlzaWNhbEFkZHJlc3M7CkBAIC0zMTYxLDcgKzMxNjEsNyBAQAogCWZvciAoaSA9IDAsIFBhZGRyID0gUGh5c2ljYWxBZGRyZXNzOwogCSAgICAgaSA8IFNYR19SQ1ZfREVTQ1JJUFRPUlNfUEVSX0JMT0NLOwogCSAgICAgaSsrLCBQYWRkciArPSBCdWZmZXJTaXplLCBSY3ZEYXRhQnVmZmVyICs9IEJ1ZmZlclNpemUpIHsKLQkJUmN2RGF0YUJ1ZmZlckhkciA9IChQU1hHX1JDVl9EQVRBX0JVRkZFUl9IRFIpIChSY3ZEYXRhQnVmZmVyICsKKwkJUmN2RGF0YUJ1ZmZlckhkciA9IChzdHJ1Y3QgU1hHX1JDVl9EQVRBX0JVRkZFUl9IRFIqKSAoUmN2RGF0YUJ1ZmZlciArCiAJCQkJCQkJICAgICAgIFNYR19SQ1ZfREFUQV9CVUZGRVJfSERSX09GRlNFVAogCQkJCQkJCSAgICAgICAoQnVmZmVyU2l6ZSkpOwogCQlzcGluX2xvY2soJmFkYXB0ZXItPlJjdlFMb2NrKTsKQEAgLTMxNzEsMTEgKzMxNzEsMTEgQEAKIAogCS8qIExvY2F0ZSB0aGUgZGVzY3JpcHRvciBibG9jayBhbmQgcHV0IGl0IG9uIGEgc2VwYXJhdGUgZnJlZSBxdWV1ZSAqLwogCVJjdkRlc2NyaXB0b3JCbG9jayA9Ci0JICAgIChQU1hHX1JDVl9ERVNDUklQVE9SX0JMT0NLKSAoKHVuc2lnbmVkIGNoYXIgKilSY3ZCbG9jayArCisJICAgIChzdHJ1Y3QgU1hHX1JDVl9ERVNDUklQVE9SX0JMT0NLKikgKCh1bnNpZ25lZCBjaGFyICopUmN2QmxvY2sgKwogCQkJCQkgU1hHX1JDVl9ERVNDUklQVE9SX0JMT0NLX09GRlNFVAogCQkJCQkgKEJ1ZmZlclNpemUpKTsKIAlSY3ZEZXNjcmlwdG9yQmxvY2tIZHIgPQotCSAgICAoUFNYR19SQ1ZfREVTQ1JJUFRPUl9CTE9DS19IRFIpICgodW5zaWduZWQgY2hhciAqKVJjdkJsb2NrICsKKwkgICAgKHN0cnVjdCBTWEdfUkNWX0RFU0NSSVBUT1JfQkxPQ0tfSERSKikgKCh1bnNpZ25lZCBjaGFyICopUmN2QmxvY2sgKwogCQkJCQkgICAgIFNYR19SQ1ZfREVTQ1JJUFRPUl9CTE9DS19IRFJfT0ZGU0VUCiAJCQkJCSAgICAgKEJ1ZmZlclNpemUpKTsKIAlSY3ZEZXNjcmlwdG9yQmxvY2tIZHItPlZpcnR1YWxBZGRyZXNzID0gUmN2RGVzY3JpcHRvckJsb2NrOwpAQCAtMzE5Myw3ICszMTkzLDcgQEAKIAkJZm9yIChpID0gMDsgaSA8IFNYR19SQ1ZfREVTQ1JJUFRPUlNfUEVSX0JMT0NLOwogCQkgICAgIGkrKywgUmN2RGF0YUJ1ZmZlciArPSBCdWZmZXJTaXplKSB7CiAJCQlSY3ZEYXRhQnVmZmVySGRyID0KLQkJCSAgICAoUFNYR19SQ1ZfREFUQV9CVUZGRVJfSERSKSAoUmN2RGF0YUJ1ZmZlciArCisJCQkgICAgKHN0cnVjdCBTWEdfUkNWX0RBVEFfQlVGRkVSX0hEUiopIChSY3ZEYXRhQnVmZmVyICsKIAkJCQkJCQlTWEdfUkNWX0RBVEFfQlVGRkVSX0hEUl9PRkZTRVQKIAkJCQkJCQkoQnVmZmVyU2l6ZSkpOwogCQkJU1hHX0ZSRUVfUkNWX1BBQ0tFVChSY3ZEYXRhQnVmZmVySGRyKTsKQEAgLTMyMjAsOCArMzIyMCw4IEBACiAgKiBSZXR1cm4KICAqCiAgKi8KLXN0YXRpYyB2b2lkIHN4Z19hbGxvY2F0ZV9zZ2xfYnVmZmVyX2NvbXBsZXRlKHBfYWRhcHRlcl90IGFkYXB0ZXIsCi0JCQkJCSAgICAgUFNYR19TQ0FUVEVSX0dBVEhFUiBTeGdTZ2wsCitzdGF0aWMgdm9pZCBzeGdfYWxsb2NhdGVfc2dsX2J1ZmZlcl9jb21wbGV0ZShzdHJ1Y3QgYWRhcHRlcl90ICphZGFwdGVyLAorCQkJCQkgICAgIHN0cnVjdCBTWEdfU0NBVFRFUl9HQVRIRVIgKlN4Z1NnbCwKIAkJCQkJICAgICBkbWFfYWRkcl90IFBoeXNpY2FsQWRkcmVzcywKIAkJCQkJICAgICB1MzIgTGVuZ3RoKQogewpAQCAtMzIyOSw3ICszMjI5LDcgQEAKIAkJICBhZGFwdGVyLCBTeGdTZ2wsIExlbmd0aCwgMCk7CiAJc3Bpbl9sb2NrKCZhZGFwdGVyLT5TZ2xRTG9jayk7CiAJYWRhcHRlci0+QWxsU2dsQnVmZmVyQ291bnQrKzsKLQltZW1zZXQoU3hnU2dsLCAwLCBzaXplb2YoU1hHX1NDQVRURVJfR0FUSEVSKSk7CisJbWVtc2V0KFN4Z1NnbCwgMCwgc2l6ZW9mKHN0cnVjdCBTWEdfU0NBVFRFUl9HQVRIRVIqKSk7CiAJU3hnU2dsLT5QaHlzaWNhbEFkZHJlc3MgPSBQaHlzaWNhbEFkZHJlc3M7CS8qICpQaHlzaWNhbEFkZHJlc3M7ICovCiAJU3hnU2dsLT5hZGFwdGVyID0gYWRhcHRlcjsJLyogSW5pdGlhbGl6ZSBiYWNrcG9pbnRlciBvbmNlICovCiAJSW5zZXJ0VGFpbExpc3QoJmFkYXB0ZXItPkFsbFNnbEJ1ZmZlcnMsICZTeGdTZ2wtPkFsbExpc3QpOwpAQCAtMzI0MywxNCArMzI0MywxNCBAQAogc3RhdGljIHVuc2lnbmVkIGNoYXIgdGVtcF9tYWNfYWRkcmVzc1s2XSA9CiAgICAgeyAweDAwLCAweGFiLCAweGNkLCAweGVmLCAweDEyLCAweDY5IH07CiAKLXN0YXRpYyB2b2lkIHN4Z19hZGFwdGVyX3NldF9od2FkZHIocF9hZGFwdGVyX3QgYWRhcHRlcikKK3N0YXRpYyB2b2lkIHN4Z19hZGFwdGVyX3NldF9od2FkZHIoc3RydWN0IGFkYXB0ZXJfdCAqYWRhcHRlcikKIHsKIC8qICBEQkdfRVJST1IgKCIlcyBFTlRFUiBjYXJkLT5jb25maWdfc2V0WyV4XSBwb3J0WyVkXSBwaHlzcG9ydFslZF0gZnVuY3QjWyVkXVxuIiwgX19mdW5jX18sICovCiAvKiAgICAgICAgICAgICBjYXJkLT5jb25maWdfc2V0LCBhZGFwdGVyLT5wb3J0LCBhZGFwdGVyLT5waHlzcG9ydCwgYWRhcHRlci0+ZnVuY3Rpb25udW1iZXIpOyAqLwogLyogKi8KIC8qICBzeGdfZGJnX21hY2FkZHJzKGFkYXB0ZXIpOyAqLwogCi0JbWVtY3B5KGFkYXB0ZXItPm1hY2FkZHIsIHRlbXBfbWFjX2FkZHJlc3MsIHNpemVvZihTWEdfQ09ORklHX01BQykpOworCW1lbWNweShhZGFwdGVyLT5tYWNhZGRyLCB0ZW1wX21hY19hZGRyZXNzLCBzaXplb2Yoc3RydWN0IFNYR19DT05GSUdfTUFDKSk7CiAvKiAgICAgIERCR19FUlJPUiAoIiVzIEFGVEVSIGNvcHlpbmcgZnJvbSBjb25maWcubWFjaW5mbyBpbnRvIGN1cnJtYWNhZGRyXG4iLCBfX2Z1bmNfXyk7ICovCiAvKiAgICAgIHN4Z19kYmdfbWFjYWRkcnMoYWRhcHRlcik7ICovCiAJaWYgKCEoYWRhcHRlci0+Y3Vycm1hY2FkZHJbMF0gfHwKQEAgLTMyNzEsNyArMzI3MSw3IEBACiAjaWYgWFhYVE9ETwogc3RhdGljIGludCBzeGdfbWFjX3NldF9hZGRyZXNzKHBfbmV0X2RldmljZSBkZXYsIHZvaWQgKnB0cikKIHsKLQlwX2FkYXB0ZXJfdCBhZGFwdGVyID0gKHBfYWRhcHRlcl90KSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBhZGFwdGVyX3QgKmFkYXB0ZXIgPSAoc3RydWN0IGFkYXB0ZXJfdCAqKSBuZXRkZXZfcHJpdihkZXYpOwogCXN0cnVjdCBzb2NrYWRkciAqYWRkciA9IHB0cjsKIAogCURCR19FUlJPUigiJXMgRU5URVIgKCVzKVxuIiwgX19mdW5jX18sIGFkYXB0ZXItPm5ldGRldi0+bmFtZSk7CkBAIC0zMzEzLDcgKzMzMTMsNyBAQAogICogUmV0dXJuCiAgKglpbnQKICAqLwotc3RhdGljIGludCBzeGdfaW5pdGlhbGl6ZV9hZGFwdGVyKHBfYWRhcHRlcl90IGFkYXB0ZXIpCitzdGF0aWMgaW50IHN4Z19pbml0aWFsaXplX2FkYXB0ZXIoc3RydWN0IGFkYXB0ZXJfdCAqYWRhcHRlcikKIHsKIAl1MzIgUnNzSWRzLCBJc3JDb3VudDsKIAl1MzIgaTsKQEAgLTMzMjcsNyArMzMyNyw3IEBACiAKIAkvKiBTYW5pdHkgY2hlY2sgU1hHX1VDT0RFX1JFR1Mgc3RydWN0dXJlIGRlZmluaXRpb24gdG8gKi8KIAkvKiBtYWtlIHN1cmUgdGhlIGxlbmd0aCBpcyBjb3JyZWN0ICovCi0JQVNTRVJUKHNpemVvZihTWEdfVUNPREVfUkVHUykgPT0gU1hHX1JFR0lTVEVSX1NJWkVfUEVSX0NQVSk7CisJQVNTRVJUKHNpemVvZihzdHJ1Y3QgU1hHX1VDT0RFX1JFR1MpID09IFNYR19SRUdJU1RFUl9TSVpFX1BFUl9DUFUpOwogCiAJLyogRGlzYWJsZSBpbnRlcnJ1cHRzICovCiAJU1hHX0RJU0FCTEVfQUxMX0lOVEVSUlVQVFMoYWRhcHRlcik7CkBAIC0zNDEyLDE2ICszNDEyLDE2IEBACiAgKiBSZXR1cm4KICAqCXN0YXR1cwogICovCi1zdGF0aWMgaW50IHN4Z19maWxsX2Rlc2NyaXB0b3JfYmxvY2socF9hZGFwdGVyX3QgYWRhcHRlciwKLQkJCQkgICAgIFBTWEdfUkNWX0RFU0NSSVBUT1JfQkxPQ0tfSERSCi0JCQkJICAgICBSY3ZEZXNjcmlwdG9yQmxvY2tIZHIpCitzdGF0aWMgaW50IHN4Z19maWxsX2Rlc2NyaXB0b3JfYmxvY2soc3RydWN0IGFkYXB0ZXJfdCAqYWRhcHRlciwKKwkJCQkgICAgIHN0cnVjdCBTWEdfUkNWX0RFU0NSSVBUT1JfQkxPQ0tfSERSCisJCQkJICAgICAqUmN2RGVzY3JpcHRvckJsb2NrSGRyKQogewogCXUzMiBpOwotCVBTWEdfUklOR19JTkZPIFJjdlJpbmdJbmZvID0gJmFkYXB0ZXItPlJjdlJpbmdaZXJvSW5mbzsKLQlQU1hHX1JDVl9EQVRBX0JVRkZFUl9IRFIgUmN2RGF0YUJ1ZmZlckhkcjsKLQlQU1hHX1JDVl9ERVNDUklQVE9SX0JMT0NLIFJjdkRlc2NyaXB0b3JCbG9jazsKLQlQU1hHX0NNRCBSaW5nRGVzY3JpcHRvckNtZDsKLQlQU1hHX1JDVl9SSU5HIFJpbmdaZXJvID0gJmFkYXB0ZXItPlJjdlJpbmdzWzBdOworCXN0cnVjdCBTWEdfUklOR19JTkZPICpSY3ZSaW5nSW5mbyA9ICZhZGFwdGVyLT5SY3ZSaW5nWmVyb0luZm87CisJc3RydWN0IFNYR19SQ1ZfREFUQV9CVUZGRVJfSERSICpSY3ZEYXRhQnVmZmVySGRyOworCXN0cnVjdCBTWEdfUkNWX0RFU0NSSVBUT1JfQkxPQ0sgKlJjdkRlc2NyaXB0b3JCbG9jazsKKwlzdHJ1Y3QgU1hHX0NNRCAqUmluZ0Rlc2NyaXB0b3JDbWQ7CisJc3RydWN0IFNYR19SQ1ZfUklORyAqUmluZ1plcm8gPSAmYWRhcHRlci0+UmN2UmluZ3NbMF07CiAKIAlTWEdfVFJBQ0UoVFJBQ0VfU1hHLCBTeGdUcmFjZUJ1ZmZlciwgVFJBQ0VfTk9JU1ksICJGaWxCbGsiLAogCQkgIGFkYXB0ZXIsIGFkYXB0ZXItPlJjdkJ1ZmZlcnNPbkNhcmQsCkBAIC0zNDQyLDcgKzM0NDIsNyBAQAogCUFTU0VSVChSaW5nRGVzY3JpcHRvckNtZCk7CiAJUmN2RGVzY3JpcHRvckJsb2NrSGRyLT5TdGF0ZSA9IFNYR19CVUZGRVJfT05DQVJEOwogCVJjdkRlc2NyaXB0b3JCbG9jayA9Ci0JICAgIChQU1hHX1JDVl9ERVNDUklQVE9SX0JMT0NLKSBSY3ZEZXNjcmlwdG9yQmxvY2tIZHItPlZpcnR1YWxBZGRyZXNzOworCSAgICAoc3RydWN0IFNYR19SQ1ZfREVTQ1JJUFRPUl9CTE9DSyopIFJjdkRlc2NyaXB0b3JCbG9ja0hkci0+VmlydHVhbEFkZHJlc3M7CiAKIAkvKiBGaWxsIGluIHRoZSBkZXNjcmlwdG9yIGJsb2NrICovCiAJZm9yIChpID0gMDsgaSA8IFNYR19SQ1ZfREVTQ1JJUFRPUlNfUEVSX0JMT0NLOyBpKyspIHsKQEAgLTM0ODQsOSArMzQ4NCw5IEBACiAgKiBSZXR1cm4KICAqCU5vbmUKICAqLwotc3RhdGljIHZvaWQgc3hnX3N0b2NrX3Jjdl9idWZmZXJzKHBfYWRhcHRlcl90IGFkYXB0ZXIpCitzdGF0aWMgdm9pZCBzeGdfc3RvY2tfcmN2X2J1ZmZlcnMoc3RydWN0IGFkYXB0ZXJfdCAqYWRhcHRlcikKIHsKLQlQU1hHX1JDVl9ERVNDUklQVE9SX0JMT0NLX0hEUiBSY3ZEZXNjcmlwdG9yQmxvY2tIZHI7CisJc3RydWN0IFNYR19SQ1ZfREVTQ1JJUFRPUl9CTE9DS19IRFIgKlJjdkRlc2NyaXB0b3JCbG9ja0hkcjsKIAogCVNYR19UUkFDRShUUkFDRV9TWEcsIFN4Z1RyYWNlQnVmZmVyLCBUUkFDRV9OT0lTWSwgIlN0b2NrQnVmIiwKIAkJICBhZGFwdGVyLCBhZGFwdGVyLT5SY3ZCdWZmZXJzT25DYXJkLApAQCAtMzUwNiwxNCArMzUwNiwxNCBAQAogCS8qIE5vdyBncmFiIHRoZSBSY3ZRTG9jayBsb2NrIGFuZCBwcm9jZWVkICovCiAJc3Bpbl9sb2NrKCZhZGFwdGVyLT5SY3ZRTG9jayk7CiAJd2hpbGUgKGFkYXB0ZXItPlJjdkJ1ZmZlcnNPbkNhcmQgPCBTWEdfUkNWX0RBVEFfQlVGRkVSUykgewotCQlQTElTVF9FTlRSWSBfcGxlOworCQlzdHJ1Y3QgTElTVF9FTlRSWSAqX3BsZTsKIAogCQkvKiBHZXQgYSBkZXNjcmlwdG9yIGJsb2NrICovCiAJCVJjdkRlc2NyaXB0b3JCbG9ja0hkciA9IE5VTEw7CiAJCWlmIChhZGFwdGVyLT5GcmVlUmN2QmxvY2tDb3VudCkgewogCQkJX3BsZSA9IFJlbW92ZUhlYWRMaXN0KCZhZGFwdGVyLT5GcmVlUmN2QmxvY2tzKTsKIAkJCVJjdkRlc2NyaXB0b3JCbG9ja0hkciA9Ci0JCQkgICAgY29udGFpbmVyX29mKF9wbGUsIFNYR19SQ1ZfREVTQ1JJUFRPUl9CTE9DS19IRFIsCisJCQkgICAgY29udGFpbmVyX29mKF9wbGUsIHN0cnVjdCBTWEdfUkNWX0RFU0NSSVBUT1JfQkxPQ0tfSERSLAogCQkJCQkgRnJlZUxpc3QpOwogCQkJYWRhcHRlci0+RnJlZVJjdkJsb2NrQ291bnQtLTsKIAkJCVJjdkRlc2NyaXB0b3JCbG9ja0hkci0+U3RhdGUgPSBTWEdfQlVGRkVSX0JVU1k7CkBAIC0zNTUwLDEzICszNTUwLDEzIEBACiAgKiBSZXR1cm4KICAqCU5vbmUKICAqLwotc3RhdGljIHZvaWQgc3hnX2NvbXBsZXRlX2Rlc2NyaXB0b3JfYmxvY2tzKHBfYWRhcHRlcl90IGFkYXB0ZXIsCitzdGF0aWMgdm9pZCBzeGdfY29tcGxldGVfZGVzY3JpcHRvcl9ibG9ja3Moc3RydWN0IGFkYXB0ZXJfdCAqYWRhcHRlciwKIAkJCQkJICAgdW5zaWduZWQgY2hhciBJbmRleCkKIHsKLQlQU1hHX1JDVl9SSU5HIFJpbmdaZXJvID0gJmFkYXB0ZXItPlJjdlJpbmdzWzBdOwotCVBTWEdfUklOR19JTkZPIFJjdlJpbmdJbmZvID0gJmFkYXB0ZXItPlJjdlJpbmdaZXJvSW5mbzsKLQlQU1hHX1JDVl9ERVNDUklQVE9SX0JMT0NLX0hEUiBSY3ZEZXNjcmlwdG9yQmxvY2tIZHI7Ci0JUFNYR19DTUQgUmluZ0Rlc2NyaXB0b3JDbWQ7CisJc3RydWN0IFNYR19SQ1ZfUklORyAqUmluZ1plcm8gPSAmYWRhcHRlci0+UmN2UmluZ3NbMF07CisJc3RydWN0IFNYR19SSU5HX0lORk8gKlJjdlJpbmdJbmZvID0gJmFkYXB0ZXItPlJjdlJpbmdaZXJvSW5mbzsKKwlzdHJ1Y3QgU1hHX1JDVl9ERVNDUklQVE9SX0JMT0NLX0hEUiAqUmN2RGVzY3JpcHRvckJsb2NrSGRyOworCXN0cnVjdCBTWEdfQ01EICpSaW5nRGVzY3JpcHRvckNtZDsKIAogCVNYR19UUkFDRShUUkFDRV9TWEcsIFN4Z1RyYWNlQnVmZmVyLCBUUkFDRV9OT0lTWSwgIkNtcFJCbGtzIiwKIAkJICBhZGFwdGVyLCBJbmRleCwgUmN2UmluZ0luZm8tPkhlYWQsIFJjdlJpbmdJbmZvLT5UYWlsKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zeGcvc3hnLmggYi9kcml2ZXJzL3N0YWdpbmcvc3hnL3N4Zy5oCmluZGV4IDg0NGNhNTYuLjY1M2NmM2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9zeGcvc3hnLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3N4Zy9zeGcuaApAQCAtNDUsNyArNDUsNyBAQAogI2RlZmluZSBwX25ldF9kZXZpY2Ugc3RydWN0IG5ldF9kZXZpY2UgKgogLy8gU1hHX1NUQVRTIC0gUHJvYmFibHkgbW92ZSB0aGVzZSB0byBzb21lcGxhY2Ugd2hlcmUKIC8vIHRoZSBzbGljc3RhdCAoc3hnc3RhdD8pIHByb2dyYW0gY2FuIGdldCB0aGVtLgotdHlwZWRlZiBzdHJ1Y3QgX1NYR19TVEFUUyB7CitzdHJ1Y3QgU1hHX1NUQVRTIHsKIAkvLyBYbXQKIAl1MzIJCQkJWG10TkJMOwkJCQkvLyBPZmZsb2FkIHNlbmQgTkJMIGNvdW50CiAJdTY0CQkJCUR1bWJYbXRCeXRlczsJCS8vIER1bWJuaWMgc2VuZCBieXRlcwpAQCAtMTA5LDcgKzEwOSw3IEBACiAJdTY0CQkJCUxpbmtDcmM7CQkJLy8gU1hHX1JDVl9TVEFUVVNfTElOS19DUkM6CiAJdTY0CQkJCUxpbmtPZmxvdzsJCQkvLyBTWEdfUkNWX1NUQVRVU19MSU5LX09GTE9XOgogCXU2NAkJCQlMaW5rVWZsb3c7CQkJLy8gU1hHX1JDVl9TVEFUVVNfTElOS19VRkxPVzoKLX0gU1hHX1NUQVRTLCAqUFNYR19TVEFUUzsKK307CiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTIxNSwxMiArMjE1LDEyIEBACiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAvLyBOT1RFIC0gTG9jayBtdXN0IGJlIGhlbGQgd2l0aCBSQ1YgbWFjcm9zCiAjZGVmaW5lIFNYR19HRVRfUkNWX0RBVEFfQlVGRkVSKF9wQWRhcHQsIF9IZHIpIHsJCQkJCQkJCVwKLQlQTElTVF9FTlRSWSAgICAgCQkJCV9wbGU7CQkJCQkJCQkJCVwKKwlzdHJ1Y3QgTElTVF9FTlRSWSAgICAgCQkJCSpfcGxlOwkJCQkJCQkJCQlcCiAJX0hkciA9IE5VTEw7CQkJCQkJCQkJCQkJCQkJCVwKIAlpZigoX3BBZGFwdCktPkZyZWVSY3ZCdWZmZXJDb3VudCkgewkJCQkJCQkJCQkJXAogCQlBU1NFUlQoIShJc0xpc3RFbXB0eSgmKF9wQWRhcHQpLT5GcmVlUmN2QnVmZmVycykpKTsJCQkJCQlcCiAJCV9wbGUgPSBSZW1vdmVIZWFkTGlzdCgmKF9wQWRhcHQpLT5GcmVlUmN2QnVmZmVycyk7CSAgICAJCQkJXAotCQkoX0hkcikgPSBjb250YWluZXJfb2YoX3BsZSwgU1hHX1JDVl9EQVRBX0JVRkZFUl9IRFIsIEZyZWVMaXN0KTsJICAgICAgICBcCisJCShfSGRyKSA9IGNvbnRhaW5lcl9vZihfcGxlLCBzdHJ1Y3QgU1hHX1JDVl9EQVRBX0JVRkZFUl9IRFIsIEZyZWVMaXN0KTsJICAgICAgICBcCiAJCShfcEFkYXB0KS0+RnJlZVJjdkJ1ZmZlckNvdW50LS07CQkJCQkJCQkJCVwKIAkJQVNTRVJUKChfSGRyKS0+U3RhdGUgPT0gU1hHX0JVRkZFUl9GUkVFKTsJCQkJCQkJCVwKIAl9CQkJCQkJCQkJCQkJCQkJCQkJCVwKQEAgLTI2MywxMiArMjYzLDEyIEBACiAvLyB1bnRpbCBhZnRlciB0aGF0LiAgV2UncmUgZGVhbGluZyB3aXRoIHJvdW5kIG51bWJlcnMgaGVyZSwgc28gd2UgZG9uJ3QgbmVlZCB0bywKIC8vIGFuZCBub3QgZ3JhYmJpbmcgaXQgYXZvaWRzIGEgcG9zc2libGUgZG91YmxlLXRyaXAuCiAjZGVmaW5lIFNYR19HRVRfU0dMX0JVRkZFUihfcEFkYXB0LCBfU2dsKSB7CQkJCVwKLQlQTElTVF9FTlRSWSBfcGxlOwkJCQkJCVwKKwlzdHJ1Y3QgTElTVF9FTlRSWSAqX3BsZTsJCQkJCQlcCiAJaWYgKChfcEFkYXB0LT5GcmVlU2dsQnVmZmVyQ291bnQgPCBTWEdfTUlOX1NHTF9CVUZGRVJTKSAmJglcCiAJICAgKF9wQWRhcHQtPkFsbFNnbEJ1ZmZlckNvdW50IDwgU1hHX01BWF9TR0xfQlVGRkVSUykgJiYJXAogCSAgIChfcEFkYXB0LT5BbGxvY2F0aW9uc1BlbmRpbmcgPT0gMCkpIHsJCQlcCiAJCXN4Z19hbGxvY2F0ZV9idWZmZXJfbWVtb3J5KF9wQWRhcHQsCQkJXAotCQkJKHNpemVvZihTWEdfU0NBVFRFUl9HQVRIRVIpICsgU1hHX1NHTF9CVUZfU0laRSksXAorCQkJKHNpemVvZihzdHJ1Y3QgU1hHX1NDQVRURVJfR0FUSEVSKSArIFNYR19TR0xfQlVGX1NJWkUpLFwKIAkJCVNYR19CVUZGRVJfVFlQRV9TR0wpOwkJCQlcCiAJfQkJCQkJCQkJXAogCV9TZ2wgPSBOVUxMOwkJCQkJCQlcCkBAIC0yNzYsNyArMjc2LDcgQEAKIAlpZigoX3BBZGFwdCktPkZyZWVTZ2xCdWZmZXJDb3VudCkgewkJCQlcCiAJCUFTU0VSVCghKElzTGlzdEVtcHR5KCYoX3BBZGFwdCktPkZyZWVTZ2xCdWZmZXJzKSkpOwlcCiAJCV9wbGUgPSBSZW1vdmVIZWFkTGlzdCgmKF9wQWRhcHQpLT5GcmVlU2dsQnVmZmVycyk7CVwKLQkJKF9TZ2wpID0gY29udGFpbmVyX29mKF9wbGUsIFNYR19TQ0FUVEVSX0dBVEhFUiwgRnJlZUxpc3QpOyBcCisJCShfU2dsKSA9IGNvbnRhaW5lcl9vZihfcGxlLCBzdHJ1Y3QgU1hHX1NDQVRURVJfR0FUSEVSLCBGcmVlTGlzdCk7IFwKICAgICAgICAgICAgIChfcEFkYXB0KS0+RnJlZVNnbEJ1ZmZlckNvdW50LS07CQkJCVwKIAkJQVNTRVJUKChfU2dsKS0+U3RhdGUgPT0gU1hHX0JVRkZFUl9GUkVFKTsJCVwKIAkJKF9TZ2wpLT5TdGF0ZSA9IFNYR19CVUZGRVJfQlVTWTsJCQlcCkBAIC0yODksMTcgKzI4OSwxNyBAQAogLy8gU1hHX01VTFRJQ0FTVF9BRERSRVNTCiAvLwogLy8gTGlua2VkIGxpc3Qgb2YgbXVsdGljYXN0IGFkZHJlc3Nlcy4KLXR5cGVkZWYgc3RydWN0IF9TWEdfTVVMVElDQVNUX0FERFJFU1Mgeworc3RydWN0IFNYR19NVUxUSUNBU1RfQUREUkVTUyB7CiAJdW5zaWduZWQgY2hhcgkJCQkJCQlBZGRyZXNzWzZdOwotCXN0cnVjdCBfU1hHX01VTFRJQ0FTVF9BRERSRVNTCSpOZXh0OwotfSBTWEdfTVVMVElDQVNUX0FERFJFU1MsICpQU1hHX01VTFRJQ0FTVF9BRERSRVNTOworCXN0cnVjdCBTWEdfTVVMVElDQVNUX0FERFJFU1MJKk5leHQ7Cit9OwogCiAvLyBTdHJ1Y3R1cmUgdG8gbWFpbnRhaW4gY2hpbW5leSBzZW5kIGFuZCByZWNlaXZlIGJ1ZmZlciBxdWV1ZXMuCiAvLyBUaGlzIHN0cnVjdHVyZSBtYWludGFpbnMgTkVUX0JVRkZFUl9MSVNUIHF1ZXVlcyB0aGF0IGFyZQogLy8gZ2l2ZW4gdG8gdXMgdmlhIHRoZSBDaGltbmV5IE1pbmlwb3J0VGNwT2ZmbG9hZFNlbmQgYW5kCiAvLyBNaW5pcG9ydFRjcE9mZmxvYWRSZWNlaXZlIHJvdXRpbmVzLiAgVGhpcyBzdHJ1Y3R1cmUgRE9FUyBOT1QKIC8vIG1hbmFnZSBvdXIgZGF0YSBidWZmZXIgcXVldWUKLXR5cGVkZWYgc3RydWN0IF9TWEdfQlVGRkVSX1FVRVVFIHsKK3N0cnVjdCBTWEdfQlVGRkVSX1FVRVVFIHsKIAl1MzIJCQkJCQlUeXBlOwkJCS8vIFNsb3cgb3IgZmFzdCAtIFNlZSBiZWxvdwogCXUzMgkJCQkJCURpcmVjdGlvbjsJCS8vIFhtdCBvciBSY3YKIAl1MzIJCQkJCQlCeXRlczsJCQkvLyBCeXRlIGNvdW50CkBAIC0zMDcsNyArMzA3LDcgQEAKIAl1MzIgKiAgICAgICAgCQkJVGFpbDsJCQkvLyBTZW5kIHF1ZXVlIHRhaWwKIC8vCVBORVRfQlVGRkVSX0xJU1QJCQlOZXh0TkJMOwkJLy8gU2hvcnQgY3V0IC0gbmV4dCBOQkwKIC8vCVBORVRfQlVGRkVSCQkJCQlOZXh0TkI7CQkJLy8gU2hvcnQgY3V0IC0gbmV4dCBOQgotfSBTWEdfQlVGRkVSX1FVRVVFLCAqUFNYR19CVUZGRVJfUVVFVUU7Cit9OwogCiAjZGVmaW5lCQlTWEdfU0xPV19TRU5EX0JVRkZFUgkwCiAjZGVmaW5lCQlTWEdfRkFTVF9TRU5EX0JVRkZFUgkxCkBAIC0zMzUsNyArMzM1LDcgQEAKIAogLy8gQWRhcHRlciBzdGF0ZXMgLSBUaGVzZSBzdGF0ZXMgY2xvc2VseSBtYXRjaCB0aGUgYWRhcHRlciBzdGF0ZXMKIC8vIGRvY3VtZW50ZWQgaW4gdGhlIERESyAod2l0aCBhIGZldyBleGNlcHRpb25zKS4KLXR5cGVkZWYgZW51bSBfU1hHX1NUQVRFIHsKK2VudW0gU1hHX1NUQVRFIHsKIAlTWEdfU1RBVEVfSU5JVElBTElaSU5HLAkJCS8vIEluaXRpYWxpemluZwogCVNYR19TVEFURV9CT09URElBRywJCQkJLy8gQm9vdC1EaWFnbm9zdGljIG1vZGUKIAlTWEdfU1RBVEVfUEFVU0lORywJCQkJLy8gUGF1c2luZwpAQCAtMzQ3LDI0ICszNDcsMjQgQEAKIAlTWEdfU1RBVEVfSEFMVElORywJCQkJLy8gSGFsdGluZwogCVNYR19TVEFURV9IQUxURUQsCQkJCS8vIERvd24gb3Igbm90LWluaXRpYWxpemVkCiAJU1hHX1NUQVRFX1NIVVRET1dOCQkJCS8vIHNodXRkb3duCi19IFNYR19TVEFURSwgKlBTWEdfU1RBVEU7Cit9OwogCiAvLyBMaW5rIHN0YXRlCi10eXBlZGVmIGVudW0gX1NYR19MSU5LX1NUQVRFIHsKK2VudW0gU1hHX0xJTktfU1RBVEUgewogCVNYR19MSU5LX0RPV04sCiAJU1hHX0xJTktfVVAKLX0gU1hHX0xJTktfU1RBVEUsICpQU1hHX0xJTktfU1RBVEU7Cit9OwogCiAvLyBMaW5rIGluaXRpYWxpemF0aW9uIHRpbWVvdXQgaW4gMTAwdXMgdW5pdHMKICNkZWZpbmUgU1hHX0xJTktfVElNRU9VVAkxMDAwMDAJCS8vIDEwIFNlY29uZHMgLSBSRURVQ0UhCiAKIAogLy8gTWljcm9jb2RlIGZpbGUgc2VsZWN0aW9uIGNvZGVzCi10eXBlZGVmIGVudW0gX1NYR19VQ09ERV9TRUwgeworZW51bSBTWEdfVUNPREVfU0VMIHsKIAlTWEdfVUNPREVfU0FIQVJBLAkJCQkvLyBTYWhhcmEgdWNvZGUKIAlTWEdfVUNPREVfU0RJQUdDUFUsCQkJCS8vIFNhaGFyYSBDUFUgZGlhZ25vc3RpYyB1Y29kZQogCVNYR19VQ09ERV9TRElBR1NZUwkJCQkvLyBTYWhhcmEgc3lzdGVtIGRpYWdub3N0aWMgdWNvZGUKLX0gU1hHX1VDT0RFX1NFTDsKK307CiAKIAogI2RlZmluZSBTWEdfRElTQUJMRV9BTExfSU5URVJSVVBUUyhfcGFkYXB0KSBzeGdfZGlzYWJsZV9pbnRlcnJ1cHQoX3BhZGFwdCkKQEAgLTM4NCwxMCArMzg0LDEwIEBACiAvLwogLy8gY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN4ZyBkcml2ZXIuICBUaGVyZSBpcyBvbmx5CiAvLyBvbmUgb2YgdGhlc2UsIGFuZCBpdCBpcyBkZWZpbmVkIGFzIGEgZ2xvYmFsLgotdHlwZWRlZiBzdHJ1Y3QgX1NYR19EUklWRVIgewotCXN0cnVjdCBfYWRhcHRlcl90CSpBZGFwdGVyczsJCS8vIExpbmtlZCBsaXN0IG9mIGFkYXB0ZXJzCitzdHJ1Y3QgU1hHX0RSSVZFUiB7CisJc3RydWN0IGFkYXB0ZXJfdAkqQWRhcHRlcnM7CQkvLyBMaW5rZWQgbGlzdCBvZiBhZGFwdGVycwogCXVzaG9ydAkJCQlBZGFwdGVySUQ7CQkvLyBNYWludGFpbiB1bmlxdWUgYWRhcHRlciBJRAotfSBTWEdfRFJJVkVSLCAqUFNYR19EUklWRVI7Cit9OwogCiAjaWZkZWYgU1RBVFVTX1NVQ0NFU1MKICN1bmRlZiBTVEFUVVNfU1VDQ0VTUwpAQCAtNDE2LDExICs0MTYsMTAgQEAKICNkZWZpbmUgTUlOKGEsIGIpICgodTMyKShhKSA8ICh1MzIpKGIpID8gKGEpIDogKGIpKQogI2RlZmluZSBNQVgoYSwgYikgKCh1MzIpKGEpID4gKHUzMikoYikgPyAoYSkgOiAoYikpCiAKLXR5cGVkZWYgc3RydWN0IF9tY2FzdF9hZGRyZXNzX3QKLXsKK3N0cnVjdCBtY2FzdF9hZGRyZXNzX3QgewogICAgIHVuc2lnbmVkIGNoYXIgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzWzZdOwotICAgIHN0cnVjdCBfbWNhc3RfYWRkcmVzc190ICAgKm5leHQ7Ci19ICBtY2FzdF9hZGRyZXNzX3QsICpwX21jYXN0X2FkZHJlc3NfdDsKKyAgICBzdHJ1Y3QgbWNhc3RfYWRkcmVzc190ICAgKm5leHQ7Cit9OwogCiAjZGVmaW5lIENBUkRfRE9XTiAgICAgICAgMHgwMDAwMDAwMAogI2RlZmluZSBDQVJEX1VQICAgICAgICAgIDB4MDAwMDAwMDEKQEAgLTQ3Miw0MSArNDcxLDM3IEBACiAjZGVmaW5lIFNMSUNfQ0FSRF9TVEFURSh4KSAgICAoKHg9PUNBUkRfVVApID8gIlVQIiA6ICJEb3duIikKIAogCi10eXBlZGVmIHN0cnVjdCBfZXRoZXJfaGVhZGVyCi17CitzdHJ1Y3QgZXRoZXJfaGVhZGVyIHsKICAgICB1bnNpZ25lZCBjaGFyICAgIGV0aGVyX2Rob3N0WzZdOwogICAgIHVuc2lnbmVkIGNoYXIgICAgZXRoZXJfc2hvc3RbNl07CiAgICAgdXNob3J0ICAgZXRoZXJfdHlwZTsKLX0gZXRoZXJfaGVhZGVyLCAqcF9ldGhlcl9oZWFkZXI7Cit9OwogCiAKICNkZWZpbmUgTlVNX0NGR19TUEFDRVMgICAgICAyCiAjZGVmaW5lIE5VTV9DRkdfUkVHUyAgICAgICAgNjQKIAotdHlwZWRlZiBzdHJ1Y3QgX3BoeXNjYXJkX3QKLXsKLSAgICBzdHJ1Y3QgX2FkYXB0ZXJfdCAgKmFkYXB0ZXJbU0xJQ19NQVhfUE9SVFNdOwotICAgIHN0cnVjdCBfcGh5c2NhcmRfdCAqbmV4dDsKK3N0cnVjdCBwaHlzY2FyZF90IHsKKyAgICBzdHJ1Y3QgYWRhcHRlcl90ICAqYWRhcHRlcltTTElDX01BWF9QT1JUU107CisgICAgc3RydWN0IHBoeXNjYXJkX3QgKm5leHQ7CiAgICAgdW5zaWduZWQgaW50ICAgICAgICAgICAgICAgIGFkYXB0ZXJzX2FsbG9jZDsKLX0gcGh5c2NhcmRfdCwgKnBfcGh5c2NhcmRfdDsKK307CiAKLXR5cGVkZWYgc3RydWN0IF9zeGdiYXNlX2RyaXZlcgoteworc3RydWN0IHN4Z2Jhc2VfZHJpdmVyX3QgewogCXNwaW5sb2NrX3QJZHJpdmVyX2xvY2s7CiAJdW5zaWduZWQgbG9uZwlmbGFnczsJLyogaXJxc2F2ZSBmb3Igc3BpbmxvY2sgKi8KIAl1MzIJCW51bV9zeGdfY2FyZHM7CiAJdTMyCQludW1fc3hnX3BvcnRzOwogCXUzMgkJbnVtX3N4Z19wb3J0c19hY3RpdmU7CiAJdTMyCQlkeW5hbWljX2ludGFnZzsKLQlwX3BoeXNjYXJkX3QJcGh5c19jYXJkOwotfSBzeGdiYXNlX2RyaXZlcl90OworCXN0cnVjdCBwaHlzY2FyZF90CSpwaHlzX2NhcmQ7Cit9OwogCiAKLXR5cGVkZWYgc3RydWN0IF9hZGFwdGVyX3QKLXsKK3N0cnVjdCBhZGFwdGVyX3QgewogCXZvaWQgKiAgICAgICAgICAgICAgIGlmcDsKIAl1bnNpZ25lZCBpbnQgICAgICAgICAgICAgICAgcG9ydDsKLQlwX3BoeXNjYXJkX3QgICAgICAgIHBoeXNjYXJkOworCXN0cnVjdCBwaHlzY2FyZF90ICAgICAgICAqcGh5c2NhcmQ7CiAJdW5zaWduZWQgaW50ICAgICAgICAgICAgICAgIHBoeXNwb3J0OwogCXVuc2lnbmVkIGludCAgICAgICAgICAgICAgICBjYXJkaW5kZXg7CiAJdW5zaWduZWQgaW50ICAgICAgICAgICAgICAgIGNhcmRfc2l6ZTsKQEAgLTU0NCw3ICs1MzksNyBAQAogCXUzMiAgICAgICAgICAgICBtYWNvcHRzOwogCXVzaG9ydCAgICAgICAgICAgICAgZGV2ZmxhZ3NfcHJldjsKIAl1NjQgICAgICAgICAgICAgbWNhc3RtYXNrOwotCXBfbWNhc3RfYWRkcmVzc190ICAgbWNhc3RhZGRyczsKKwlzdHJ1Y3QgbWNhc3RfYWRkcmVzc190ICAgKm1jYXN0YWRkcnM7CiAJc3RydWN0IHRpbWVyX2xpc3QgICBwaW5ndGltZXI7CiAJdTMyICAgICAgICAgICAgIHBpbmd0aW1lcnNldDsKIAlzdHJ1Y3QgdGltZXJfbGlzdCAgIHN0YXRzdGltZXI7CkBAIC01ODAsMTEgKzU3NSwxMSBAQAogCXUzMiAgICAgICAgICAgICBpbnRhZ2dfcGVyaW9kOwogCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOwogCXUzMiAqCQkJCQlNaW5pcG9ydEhhbmRsZTsJCS8vIE91ciBtaW5pcG9ydCBoYW5kbGUKLQlTWEdfU1RBVEUJCQkJCVN0YXRlOwkJCQkvLyBBZGFwdGVyIHN0YXRlCi0JU1hHX0xJTktfU1RBVEUJCQkJTGlua1N0YXRlOwkJCS8vIExpbmsgc3RhdGUKKwllbnVtIFNYR19TVEFURQkJCQkJU3RhdGU7CQkJCS8vIEFkYXB0ZXIgc3RhdGUKKwllbnVtIFNYR19MSU5LX1NUQVRFCQkJCUxpbmtTdGF0ZTsJCQkvLyBMaW5rIHN0YXRlCiAJdTY0CQkJCQkJTGlua1NwZWVkOwkJCS8vIExpbmsgU3BlZWQKIAl1MzIJCQkJCQlQb3dlclN0YXRlOwkJCS8vIE5ESVMgcG93ZXIgc3RhdGUKLQlzdHJ1Y3QgX2FkYXB0ZXJfdCAgIAkJKk5leHQ7CQkJCS8vIExpbmtlZCBsaXN0CisJc3RydWN0IGFkYXB0ZXJfdCAgIAkJKk5leHQ7CQkJCS8vIExpbmtlZCBsaXN0CiAJdXNob3J0CQkJCQkJQWRhcHRlcklEOwkJCS8vIDEuLm4KIAl1bnNpZ25lZCBjaGFyCQkJCQkJTWFjQWRkcls2XTsJCQkvLyBPdXIgcGVybWFuZW50IEhXIG1hYyBhZGRyZXNzCiAJdW5zaWduZWQgY2hhcgkJCQkJCUN1cnJNYWNBZGRyWzZdOwkJLy8gT3VyIEN1cnJlbnQgbWFjIGFkZHJlc3MKQEAgLTU5MiwxNiArNTg3LDE2IEBACiAJcF9uZXRfZGV2aWNlICAgICAgICAgICAgICAgIG5leHRfbmV0ZGV2aWNlOwogCXN0cnVjdCBwY2lfZGV2ICAgICAgICAgICAgKiBwY2lkZXY7CiAKLQlQU1hHX01VTFRJQ0FTVF9BRERSRVNTCQlNdWx0aWNhc3RBZGRyczsJCS8vIE11bHRpY2FzdCBsaXN0CisJc3RydWN0IFNYR19NVUxUSUNBU1RfQUREUkVTUwkJKk11bHRpY2FzdEFkZHJzOwkJLy8gTXVsdGljYXN0IGxpc3QKIAl1NjQgICAgIAkJCQlNdWx0aWNhc3RNYXNrOwkJLy8gTXVsdGljYXN0IG1hc2sKIAl1MzIgKgkJCQkJSW50ZXJydXB0SGFuZGxlOwkvLyBSZWdpc3RlciBJbnRlcnJ1cHQgaGFuZGxlCiAJdTMyCQkJCQkJSW50ZXJydXB0TGV2ZWw7CQkvLyBGcm9tIFJlc291cmNlIGxpc3QKIAl1MzIJCQkJCQlJbnRlcnJ1cHRWZWN0b3I7CS8vIEZyb20gUmVzb3VyY2UgbGlzdAogCXNwaW5sb2NrX3QJQWRhcHRlckxvY2s7CS8qIFNlcmlhbGl6ZSBhY2Nlc3MgYWRhcHRlciByb3V0aW5lcyAqLwogCXNwaW5sb2NrX3QJQml0NjRSZWdMb2NrOwkvKiBGb3Igd3JpdGluZyA2NC1iaXQgYWRkcmVzc2VzICovCi0JUFNYR19IV19SRUdTCQkJCUh3UmVnczsJCQkJLy8gU2FoYXJhIEhXIFJlZ2lzdGVyIE1lbW9yeSAoQkFSMC8xKQotCVBTWEdfVUNPREVfUkVHUwkJCQlVY29kZVJlZ3M7CQkJLy8gTWljcm9jb2RlIFJlZ2lzdGVyIE1lbW9yeSAoQkFSMi8zKQotCVBTWEdfVENCX1JFR1MJCQkJVGNiUmVnczsJCQkvLyBTYW1lIGFzIFVjb2RlIHJlZ3MgLSBTZWUgc3hnaHcuaAorCXN0cnVjdCBTWEdfSFdfUkVHUwkJCSpId1JlZ3M7CQkJCS8vIFNhaGFyYSBIVyBSZWdpc3RlciBNZW1vcnkgKEJBUjAvMSkKKwlzdHJ1Y3QgU1hHX1VDT0RFX1JFR1MJCQkqVWNvZGVSZWdzOwkJCS8vIE1pY3JvY29kZSBSZWdpc3RlciBNZW1vcnkgKEJBUjIvMykKKwlzdHJ1Y3QgU1hHX1RDQl9SRUdTCQkJKlRjYlJlZ3M7CQkJLy8gU2FtZSBhcyBVY29kZSByZWdzIC0gU2VlIHN4Z2h3LmgKIAl1c2hvcnQJCQkJCQlSZXNldERwY0NvdW50OwkJLy8gRm9yIHRpbWVvdXQKIAl1c2hvcnQJCQkJCQlSc3NEcGNDb3VudDsJCS8vIEZvciB0aW1lb3V0CiAJdXNob3J0CQkJCQkJVmVuZG9ySUQ7CQkJLy8gVmVuZG9yIElECkBAIC02MTMsMjUgKzYwOCwyNSBAQAogCXUzMiAqCQkJCQlCdWZmZXJQb29sSGFuZGxlOwkvLyBVc2VkIHdpdGggTkRJUyA1LjIgb25seS4gIERvbid0IGlmZGVmIG91dAogCXUzMgkJCQkJCU1hY0ZpbHRlcjsJCQkvLyBORElTIE1BQyBGaWx0ZXIKIAl1c2hvcnQJCQkJCQlJcElkOwkJCQkvLyBGb3Igc2xvd3BhdGgKLQlQU1hHX0VWRU5UX1JJTkcJCQkJRXZlbnRSaW5nczsJCQkvLyBIb3N0IGV2ZW50IHJpbmdzLiAgMS9DUFUgdG8gMTYgbWF4CisJc3RydWN0IFNYR19FVkVOVF9SSU5HCQkJKkV2ZW50UmluZ3M7CQkJLy8gSG9zdCBldmVudCByaW5ncy4gIDEvQ1BVIHRvIDE2IG1heAogCWRtYV9hZGRyX3QgICAgICAgICAgICAgIAlQRXZlbnRSaW5nczsJCS8vIFBoeXNpY2FsIGFkZHJlc3MKIAl1MzIJCQkJCQlOZXh0RXZlbnRbU1hHX01BWF9SU1NdOwkvLyBDdXJyZW50IGxvY2F0aW9uIGluIHJpbmcKIAlkbWFfYWRkcl90ICAgICAgICAgIAkJUFRjYkJ1ZmZlcnM7CQkvLyBUQ0IgQnVmZmVycyAtIHBoeXNpY2FsIGFkZHJlc3MKIAlkbWFfYWRkcl90CSAgICAgICAgICAgIAlQVGNiQ29tcEJ1ZmZlcnM7CS8vIFRDQiBDb21wb3NpdGUgQnVmZmVycyAtIHBoeXMgYWRkcgotCVBTWEdfWE1UX1JJTkcJCQkJWG10UmluZ3M7CQkJLy8gVHJhbnNtaXQgcmluZ3MKKwlzdHJ1Y3QgU1hHX1hNVF9SSU5HCQkJCSpYbXRSaW5nczsJCQkvLyBUcmFuc21pdCByaW5ncwogCWRtYV9hZGRyX3QJCSAgICAgICAgICAgIFBYbXRSaW5nczsJCQkvLyBUcmFuc21pdCByaW5ncyAtIHBoeXNpY2FsIGFkZHJlc3MKLQlTWEdfUklOR19JTkZPCQkJCVhtdFJpbmdaZXJvSW5mbzsJLy8gVHJhbnNtaXQgcmluZyAwIGluZm8KKwlzdHJ1Y3QgU1hHX1JJTkdfSU5GTwkJCQlYbXRSaW5nWmVyb0luZm87CS8vIFRyYW5zbWl0IHJpbmcgMCBpbmZvCiAJc3BpbmxvY2tfdAlYbXRaZXJvTG9jazsJLyogVHJhbnNtaXQgcmluZyAwIGxvY2sgKi8KIAl1MzIgKgkJCQkJWG10UmluZ1plcm9JbmRleDsJLy8gU2hhcmVkIFhNVCByaW5nIDAgaW5kZXgKIAlkbWFfYWRkcl90ICAgICAgICAgIAkJUFhtdFJpbmdaZXJvSW5kZXg7CS8vIFNoYXJlZCBYTVQgcmluZyAwIGluZGV4IC0gcGh5c2ljYWwKLQlMSVNUX0VOVFJZCQkJCQlGcmVlUHJvdG9jb2xIZWFkZXJzOy8vIEZyZWUgcHJvdG9jb2wgaGVhZGVycworCXN0cnVjdCBMSVNUX0VOVFJZCQkJCQlGcmVlUHJvdG9jb2xIZWFkZXJzOy8vIEZyZWUgcHJvdG9jb2wgaGVhZGVycwogCXUzMgkJCQkJCUZyZWVQcm90b0hkckNvdW50OwkvLyBDb3VudAogCXZvaWQgKgkJCQkJCVByb3RvY29sSGVhZGVyczsJLy8gQmxvY2sgb2YgcHJvdG9jb2wgaGVhZGVyCiAJZG1hX2FkZHJfdAkgICAgICAgICAgICAJUFByb3RvY29sSGVhZGVyczsJLy8gQmxvY2sgb2YgcHJvdG9jb2wgaGVhZGVycyAtIHBoeXMKIAotCVBTWEdfUkNWX1JJTkcJCQkJUmN2UmluZ3M7CQkJLy8gUmVjZWl2ZSByaW5ncworCXN0cnVjdCBTWEdfUkNWX1JJTkcJCSpSY3ZSaW5nczsJCQkvLyBSZWNlaXZlIHJpbmdzCiAJZG1hX2FkZHJfdAkgICAgICAgICAgICAJUFJjdlJpbmdzOwkJCS8vIFJlY2VpdmUgcmluZ3MgLSBwaHlzaWNhbCBhZGRyZXNzCi0JU1hHX1JJTkdfSU5GTwkJCQlSY3ZSaW5nWmVyb0luZm87CS8vIFJlY2VpdmUgcmluZyAwIGluZm8KKwlzdHJ1Y3QgU1hHX1JJTkdfSU5GTwkJCQlSY3ZSaW5nWmVyb0luZm87CS8vIFJlY2VpdmUgcmluZyAwIGluZm8KIAogCXUzMiAqCQkJCQlJc3I7CQkJCS8vIEludGVycnVwdCBzdGF0dXMgcmVnaXN0ZXIKIAlkbWFfYWRkcl90CSAgICAgICAgICAgIAlQSXNyOwkJCQkvLyBJU1IgLSBwaHlzaWNhbCBhZGRyZXNzCkBAIC02NDUsOSArNjQwLDkgQEAKIAl1MzIJCQkJCQlIYXNoSW5mb3JtYXRpb247CiAJLy8gUmVjZWl2ZSBidWZmZXIgcXVldWVzCiAJc3BpbmxvY2tfdAlSY3ZRTG9jazsJLyogUmVjZWl2ZSBRdWV1ZSBMb2NrICovCi0JTElTVF9FTlRSWQkJCQkJRnJlZVJjdkJ1ZmZlcnM7CQkvLyBGcmVlIFNYR19EQVRBX0JVRkZFUiBxdWV1ZQotCUxJU1RfRU5UUlkJCQkJCUZyZWVSY3ZCbG9ja3M7CQkvLyBGcmVlIFNYR19SQ1ZfREVTQ1JJUFRPUl9CTE9DSyBRCi0JTElTVF9FTlRSWQkJCQkJQWxsUmN2QmxvY2tzOwkJLy8gQWxsIFNYR19SQ1ZfQkxPQ0tzCisJc3RydWN0IExJU1RfRU5UUlkJCQkJCUZyZWVSY3ZCdWZmZXJzOwkJLy8gRnJlZSBTWEdfREFUQV9CVUZGRVIgcXVldWUKKwlzdHJ1Y3QgTElTVF9FTlRSWQkJCQkJRnJlZVJjdkJsb2NrczsJCS8vIEZyZWUgU1hHX1JDVl9ERVNDUklQVE9SX0JMT0NLIFEKKwlzdHJ1Y3QgTElTVF9FTlRSWQkJCQkJQWxsUmN2QmxvY2tzOwkJLy8gQWxsIFNYR19SQ1ZfQkxPQ0tzCiAJdXNob3J0CQkJCQkJRnJlZVJjdkJ1ZmZlckNvdW50OwkvLyBOdW1iZXIgb2YgZnJlZSByY3YgZGF0YSBidWZmZXJzCiAJdXNob3J0CQkJCQkJRnJlZVJjdkJsb2NrQ291bnQ7CS8vICMgb2YgZnJlZSByY3YgZGVzY3JpcHRvciBibG9ja3MKIAl1c2hvcnQJCQkJCQlBbGxSY3ZCbG9ja0NvdW50OwkvLyBOdW1iZXIgb2YgdG90YWwgcmVjZWl2ZSBibG9ja3MKQEAgLTY1Niw4ICs2NTEsOCBAQAogCXUzMgkJCQkJCVJjdkJ1ZmZlcnNPbkNhcmQ7CS8vIFNYR19EQVRBX0JVRkZFUlMgb3duZWQgYnkgY2FyZAogCS8vIFNHTCBidWZmZXJzCiAJc3BpbmxvY2tfdAlTZ2xRTG9jazsJLyogU0dMIFF1ZXVlIExvY2sgKi8KLQlMSVNUX0VOVFJZCQkJCQlGcmVlU2dsQnVmZmVyczsJCS8vIEZyZWUgU1hHX1NDQVRURVJfR0FUSEVSCi0JTElTVF9FTlRSWQkJCQkJQWxsU2dsQnVmZmVyczsJCS8vIEFsbCBTWEdfU0NBVFRFUl9HQVRIRVIKKwlzdHJ1Y3QgTElTVF9FTlRSWQkJCQkJRnJlZVNnbEJ1ZmZlcnM7CQkvLyBGcmVlIFNYR19TQ0FUVEVSX0dBVEhFUgorCXN0cnVjdCBMSVNUX0VOVFJZCQkJCQlBbGxTZ2xCdWZmZXJzOwkJLy8gQWxsIFNYR19TQ0FUVEVSX0dBVEhFUgogCXVzaG9ydAkJCQkJCUZyZWVTZ2xCdWZmZXJDb3VudDsJLy8gTnVtYmVyIG9mIGZyZWUgU0dMIGJ1ZmZlcnMKIAl1c2hvcnQJCQkJCQlBbGxTZ2xCdWZmZXJDb3VudDsJLy8gTnVtYmVyIG9mIHRvdGFsIFNHTCBidWZmZXJzCiAJdTMyCQkJCQkJQ3VycmVudFRpbWU7CQkvLyBUaWNrIGNvdW50CkBAIC02NzksNyArNjc0LDcgQEAKIAkvLyBTdGF0cwogCXUzMgkJCQkJCVBlbmRpbmdSY3ZDb3VudDsJLy8gT3V0c3RhbmRpbmcgcmN2IGluZGljYXRpb25zCiAJdTMyCQkJCQkJUGVuZGluZ1htdENvdW50OwkvLyBPdXRzdGFuZGluZyBzZW5kIHJlcXVlc3RzCi0JU1hHX1NUQVRTCQkJCQlTdGF0czsJCQkJLy8gU3RhdGlzdGljcworCXN0cnVjdCBTWEdfU1RBVFMJCQkJU3RhdHM7CQkJCS8vIFN0YXRpc3RpY3MKIAl1MzIJCQkJCQlSZWFzc0J1ZnM7CQkJLy8gTnVtYmVyIG9mIHJlYXNzZW1ibHkgYnVmZmVycwogCS8vIENhcmQgQ3Jhc2ggSW5mbwogCXVzaG9ydAkJCQkJCUNyYXNoTG9jYXRpb247CQkvLyBNaWNyb2NvZGUgY3Jhc2ggbG9jYXRpb24KQEAgLTcwOCw3ICs3MDMsNyBAQAogCS8vCWRtYV9hZGRyX3QJCVBEdW1wQnVmZmVyOwkJLy8gUGh5c2ljYWwgYWRkcmVzcwogCS8vI2VuZGlmIC8vIFNYR19GQUlMVVJFX0RVTVAKIAotfSBhZGFwdGVyX3QsICpwX2FkYXB0ZXJfdDsKK307CiAKICNpZiBTTElDX0RVTVBfRU5BQkxFRAogI2RlZmluZSBTTElDX0RVTVBfUkVRVUVTVEVEICAgICAgMQpAQCAtNzIxLDEwICs3MTYsMTAgQEAKICAqIHN0cnVjdHVyZSBpcyB3cml0dGVuIG91dCB0byB0aGUgY2FyZCdzIFNSQU0gd2hlbiB0aGUgbWljcm9jb2RlIHBhbmljJ3MuCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10eXBlZGVmIHN0cnVjdCBfc2xpY19jcmFzaF9pbmZvIHsKK3N0cnVjdCBzbGljX2NyYXNoX2luZm8gewogICAgIHVzaG9ydCAgY3B1X2lkOwogICAgIHVzaG9ydCAgY3Jhc2hfcGM7Ci19IHNsaWNfY3Jhc2hfaW5mbywgKnBfc2xpY19jcmFzaF9pbmZvOworfTsKIAogI2RlZmluZSBDUkFTSF9JTkZPX09GRlNFVCAgIDB4MTU1QwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc3hnL3N4Z19vcy5oIGIvZHJpdmVycy9zdGFnaW5nL3N4Zy9zeGdfb3MuaAppbmRleCAwMTE4MjY4Li42ZDNmMjNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvc3hnL3N4Z19vcy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zeGcvc3hnX29zLmgKQEAgLTQ0LDEwICs0NCwxMCBAQAogI2RlZmluZSBGQUxTRQkoMCkKICNkZWZpbmUgVFJVRQkoMSkKIAotdHlwZWRlZiBzdHJ1Y3QgX0xJU1RfRU5UUlkgewotCXN0cnVjdCBfTElTVF9FTlRSWSAqbmxlX2ZsaW5rOwotCXN0cnVjdCBfTElTVF9FTlRSWSAqbmxlX2JsaW5rOwotfSBsaXN0X2VudHJ5LCBMSVNUX0VOVFJZLCAqUExJU1RfRU5UUlk7CitzdHJ1Y3QgTElTVF9FTlRSWSB7CisJc3RydWN0IExJU1RfRU5UUlkgKm5sZV9mbGluazsKKwlzdHJ1Y3QgTElTVF9FTlRSWSAqbmxlX2JsaW5rOworfTsKIAogI2RlZmluZSBJbml0aWFsaXplTGlzdEhlYWQobCkgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAobCktPm5sZV9mbGluayA9IChsKS0+bmxlX2JsaW5rID0gKGwpCkBAIC02OCwxMCArNjgsMTAgQEAKIAogLyogVGhlc2UgdHdvIGhhdmUgdG8gYmUgaW5saW5lZCBzaW5jZSB0aGV5IHJldHVybiB0aGluZ3MuICovCiAKLXN0YXRpYyBfX2lubGluZSBQTElTVF9FTlRSWSBSZW1vdmVIZWFkTGlzdChsaXN0X2VudHJ5ICogbCkKK3N0YXRpYyBfX2lubGluZSBzdHJ1Y3QgTElTVF9FTlRSWSAqUmVtb3ZlSGVhZExpc3Qoc3RydWN0IExJU1RfRU5UUlkgKmwpCiB7Ci0JbGlzdF9lbnRyeSAqZjsKLQlsaXN0X2VudHJ5ICplOworCXN0cnVjdCBMSVNUX0VOVFJZICpmOworCXN0cnVjdCBMSVNUX0VOVFJZICplOwogCiAJZSA9IGwtPm5sZV9mbGluazsKIAlmID0gZS0+bmxlX2ZsaW5rOwpAQCAtODEsMTAgKzgxLDEwIEBACiAJcmV0dXJuIChlKTsKIH0KIAotc3RhdGljIF9faW5saW5lIFBMSVNUX0VOVFJZIFJlbW92ZVRhaWxMaXN0KGxpc3RfZW50cnkgKiBsKQorc3RhdGljIF9faW5saW5lIHN0cnVjdCBMSVNUX0VOVFJZICpSZW1vdmVUYWlsTGlzdChzdHJ1Y3QgTElTVF9FTlRSWSAqbCkKIHsKLQlsaXN0X2VudHJ5ICpiOwotCWxpc3RfZW50cnkgKmU7CisJc3RydWN0IExJU1RfRU5UUlkgKmI7CisJc3RydWN0IExJU1RfRU5UUlkgKmU7CiAKIAllID0gbC0+bmxlX2JsaW5rOwogCWIgPSBlLT5ubGVfYmxpbms7CkBAIC05Niw3ICs5Niw3IEBACiAKICNkZWZpbmUgSW5zZXJ0VGFpbExpc3QobCwgZSkgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICBsaXN0X2VudHJ5ICAgICAgICAgICAgICAqYjsgICAgIFwKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgTElTVF9FTlRSWSAgICAgICAqYjsgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICBiID0gKGwpLT5ubGVfYmxpbms7ICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAoZSktPm5sZV9mbGluayA9IChsKTsgICAgICAgICAgIFwKQEAgLTEwNyw3ICsxMDcsNyBAQAogCiAjZGVmaW5lIEluc2VydEhlYWRMaXN0KGwsIGUpICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgbGlzdF9lbnRyeSAgICAgICAgICAgICAgKmY7ICAgICBcCisgICAgICAgICAgICAgICAgc3RydWN0IExJU1RfRU5UUlkgICAgICAgKmY7ICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgZiA9IChsKS0+bmxlX2ZsaW5rOyAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgKGUpLT5ubGVfZmxpbmsgPSBmOyAgICAgICAgICAgICBcCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc3hnL3N4Z2RiZy5oIGIvZHJpdmVycy9zdGFnaW5nL3N4Zy9zeGdkYmcuaAppbmRleCA0NTIyYjhkLi5iYjU4ZGRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvc3hnL3N4Z2RiZy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zeGcvc3hnZGJnLmgKQEAgLTg2LDcgKzg2LDcgQEAKICAqIG5lZWRzIG9mIHRoZSB0cmFjZSBlbnRyeS4gIFR5cGljYWxseSB0aGV5IGFyZSBmdW5jdGlvbiBjYWxsCiAgKiBwYXJhbWV0ZXJzLgogICovCi10eXBlZGVmIHN0cnVjdCBfdHJhY2VfZW50cnlfcyB7CitzdHJ1Y3QgdHJhY2VfZW50cnlfdCB7CiAgICAgICAgIGNoYXIgICAgICBuYW1lWzhdOyAgICAgICAgLyogOCBjaGFyYWN0ZXIgbmFtZSAtIGxpa2UgJ3MnaSdtJ2InYSdyJ2MndicgKi8KICAgICAgICAgdTMyICAgdGltZTsgICAgICAgICAgIC8qIEN1cnJlbnQgY2xvY2sgdGljICovCiAgICAgICAgIHVuc2lnbmVkIGNoYXIgICAgIGNwdTsgICAgICAgICAgICAvKiBDdXJyZW50IENQVSAqLwpAQCAtOTcsNyArOTcsNyBAQAogICAgICAgICB1MzIgICBhcmcyOyAgICAgICAgICAgLyogQ2FsbGVyIGFyZzIgKi8KICAgICAgICAgdTMyICAgYXJnMzsgICAgICAgICAgIC8qIENhbGxlciBhcmczICovCiAgICAgICAgIHUzMiAgIGFyZzQ7ICAgICAgICAgICAvKiBDYWxsZXIgYXJnNCAqLwotfSB0cmFjZV9lbnRyeV90LCAqcHRyYWNlX2VudHJ5X3Q7Cit9OwogCiAvKgogICogRHJpdmVyIHR5cGVzIGZvciBkcml2ZXIgZmllbGQgaW4gdHJhY2VfZW50cnlfdApAQCAtMTA4LDE0ICsxMDgsMTMgQEAKIAogI2RlZmluZSBUUkFDRV9FTlRSSUVTICAgMTAyNAogCi10eXBlZGVmIHN0cnVjdCBfc3hnX3RyYWNlX2J1ZmZlcl90Ci17CitzdHJ1Y3Qgc3hnX3RyYWNlX2J1ZmZlcl90IHsKICAgICAgICAgdW5zaWduZWQgaW50ICAgICAgICAgICAgICAgICAgICBzaXplOyAgICAgICAgICAgICAgICAgIC8qIGFpZCBmb3Igd2luZGJnIGV4dGVuc2lvbiAqLwogICAgICAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgICAgICAgICAgIGluOyAgICAgICAgICAgICAgICAgICAgLyogV2hlcmUgdG8gYWRkICovCiAgICAgICAgIHVuc2lnbmVkIGludCAgICAgICAgICAgICAgICAgICAgbGV2ZWw7ICAgICAgICAgICAgICAgICAvKiBDdXJyZW50IFRyYWNlIGxldmVsICovCiAJc3BpbmxvY2tfdAlsb2NrOyAgICAgICAgICAgICAgICAgIC8qIEZvciBNUCB0cmFjaW5nICovCi0gICAgICAgIHRyYWNlX2VudHJ5X3QgICAgICAgICAgIGVudHJpZXNbVFJBQ0VfRU5UUklFU107LyogVGhlIGNpcmN1bGFyIGJ1ZmZlciAqLwotfSBzeGdfdHJhY2VfYnVmZmVyX3Q7CisgICAgICAgIHN0cnVjdCB0cmFjZV9lbnRyeV90ICAgICAgICAgICBlbnRyaWVzW1RSQUNFX0VOVFJJRVNdOy8qIFRoZSBjaXJjdWxhciBidWZmZXIgKi8KK307CiAKIC8qCiAgKiBUaGUgdHJhY2UgbGV2ZWxzCkBAIC0xMzcsNyArMTM2LDcgQEAKICNpZiBBVEtfVFJBQ0VfRU5BQkxFRAogI2RlZmluZSBTWEdfVFJBQ0VfSU5JVChidWZmZXIsIHRsZXZlbCkJCQkJXAogewkJCQkJCQkJXAotCW1lbXNldCgoYnVmZmVyKSwgMCwgc2l6ZW9mKHN4Z190cmFjZV9idWZmZXJfdCkpOwlcCisJbWVtc2V0KChidWZmZXIpLCAwLCBzaXplb2Yoc3RydWN0IHN4Z190cmFjZV9idWZmZXJfdCkpOwlcCiAJKGJ1ZmZlciktPmxldmVsID0gKHRsZXZlbCk7CQkJCVwKIAkoYnVmZmVyKS0+c2l6ZSA9IFRSQUNFX0VOVFJJRVM7CQkJCVwKIAlzcGluX2xvY2tfaW5pdCgmKGJ1ZmZlciktPmxvY2spOwkJCVwKQEAgLTE1NCw3ICsxNTMsNyBAQAogICAgICAgICBpZiAoKGJ1ZmZlcikgJiYgKChidWZmZXIpLT5sZXZlbCA+PSAodGxldmVsKSkpIHsgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAgICAgICAgICAgIHRyYWNlX2lycWwgPSAwOyAgICAvKiA/Pz8/Pz8gRklYIFRISVMgICovICAgIFwKICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgICB0cmFjZV9sZW47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgcHRyYWNlX2VudHJ5X3QgIHRyYWNlX2VudHJ5OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgdHJhY2VfZW50cnlfdAkqdHJhY2VfZW50cnk7CQkJCVwKICAgICAgICAgICAgICAgICBzdHJ1Y3QgdGltZXZhbCAgdGltZXY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgc3Bpbl9sb2NrKCYoYnVmZmVyKS0+bG9jayk7ICAgICAgICAgICAgICAgICAgICAgICBcCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc3hnL3N4Z2hpZi5oIGIvZHJpdmVycy9zdGFnaW5nL3N4Zy9zeGdoaWYuaAppbmRleCA4OGJmZmJhLi5hNGU5NDY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvc3hnL3N4Z2hpZi5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zeGcvc3hnaGlmLmgKQEAgLTEyLDcgKzEyLDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBVQ09ERSBSZWdpc3RlcnMKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdHlwZWRlZiBzdHJ1Y3QgX1NYR19VQ09ERV9SRUdTIHsKK3N0cnVjdCBTWEdfVUNPREVfUkVHUyB7CiAJLy8gQWRkcmVzcyAwIC0gMHgzRiA9IENvbW1hbmQgY29kZXMgMC0xNSBmb3IgVENCIDAuICBFeGNvZGUgMAogCXUzMiBJY3I7CQkvLyBDb2RlID0gMCAoZXh0ZW5kZWQpLCBFeENvZGUgPSAwIC0gSW50IGNvbnRyb2wKIAl1MzIgUnN2ZFJlZzE7CQkvLyBDb2RlID0gMSAtIFRPRSAtTkEKQEAgLTEyNyw3ICsxMjcsNyBAQAogCS8vIGJhc2UuICBBcyBleHRlbmRlZCBjb2RlcyBhcmUgYWRkZWQsIHJlZHVjZSB0aGUgZmlyc3QgYXJyYXkgdmFsdWUgaW4KIAkvLyB0aGUgZm9sbG93aW5nIGZpZWxkCiAJdTMyIFBhZFRvTmV4dENwdVs5NF1bMTZdOwkvLyA5NCA9IDEyOCAtIDM0ICgzNCA9IEV4Y29kZXMgMCAtIDMzKQotfSBTWEdfVUNPREVfUkVHUywgKlBTWEdfVUNPREVfUkVHUzsKK307CiAKIC8vIEludGVycnVwdCBjb250cm9sIHJlZ2lzdGVyICgwKSB2YWx1ZXMKICNkZWZpbmUgU1hHX0lDUl9ESVNBQkxFCQkJCQkweDAwMDAwMDAwCkBAIC0xNjksNyArMTY5LDcgQEAKICAqIGlzIGhhcHBlbmluZyBpcyB0aGF0IHRoZXNlIHJlZ2lzdGVycyBvY2N1cHkgdGhlICJQYWRFeFsxNV0iIGFyZWFzIGluIHRoZQogICogU1hHX1VDT0RFX1JFR1MgZGVmaW5pdGlvbiBhYm92ZQogICovCi10eXBlZGVmIHN0cnVjdCBfU1hHX1RDQl9SRUdTIHsKK3N0cnVjdCBTWEdfVENCX1JFR1MgewogCXUzMiBFeENvZGU7CQkvKiBFeHRlbmRlZCBjb2RlcyAtIHNlZSBTWEdfVUNPREVfUkVHUyAqLwogCXUzMiBYbXQ7CQkvKiBDb2RlID0gMSAtICMgb2YgWG10IGRlc2NyaXB0b3JzIGFkZGVkIHRvIHJpbmcgKi8KIAl1MzIgUmN2OwkJLyogQ29kZSA9IDIgLSAjIG9mIFJjdiBkZXNjcmlwdG9ycyBhZGRlZCB0byByaW5nICovCkBAIC0xODAsNyArMTgwLDcgQEAKIAl1MzIgUnN2ZDQ7CQkvKiBDb2RlID0gNyAtIFRPRSBOQSAqLwogCXUzMiBSc3ZkNTsJCS8qIENvZGUgPSA4IC0gVE9FIE5BICovCiAJdTMyIFBhZFs3XTsJCS8qIENvZGVzIDgtMTUgLSBOb3QgdXNlZC4gKi8KLX0gU1hHX1RDQl9SRUdTLCAqUFNYR19UQ0JfUkVHUzsKK307CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIElTUiBGb3JtYXQKQEAgLTI3Miw3ICsyNzIsNyBAQAogICoKICAqLwogI3ByYWdtYSBwYWNrKHB1c2gsIDEpCi10eXBlZGVmIHN0cnVjdCBfU1hHX0VWRU5UIHsKK3N0cnVjdCBTWEdfRVZFTlQgewogCXUzMiBQYWRbMV07CQkvLyBub3QgdXNlZAogCXUzMiBTbmRVbmE7CQkvLyBTbmRVbmEgdmFsdWUKIAl1MzIgUmVzaWQ7CQkvLyByZWNlaXZlIE1ETCByZXNpZApAQCAtMjk0LDcgKzI5NCw3IEBACiAJdW5zaWduZWQgY2hhciBDb2RlOwkvLyBFdmVudCBjb2RlCiAJdW5zaWduZWQgY2hhciBDb21tYW5kSW5kZXg7CS8vIE5ldyByaW5nIGluZGV4CiAJdW5zaWduZWQgY2hhciBTdGF0dXM7CS8vIEV2ZW50IHN0YXR1cwotfSBTWEdfRVZFTlQsICpQU1hHX0VWRU5UOworfTsKICNwcmFnbWEgcGFjayhwb3ApCiAKIC8vIEV2ZW50IGNvZGUgZGVmaW5pdGlvbnMKQEAgLTMyMSw5ICszMjEsOSBAQAogI2RlZmluZSBFVkVOVF9SSU5HX0JBVENICTE2CS8vIEhhbmQgZW50cmllcyBiYWNrIDE2IGF0IGEgdGltZS4KICNkZWZpbmUgRVZFTlRfQkFUQ0hfTElNSVQJMjU2CS8vIFN0b3AgcHJvY2Vzc2luZyBldmVudHMgYWZ0ZXIgMjU2ICgxNiAqIDE2KQogCi10eXBlZGVmIHN0cnVjdCBfU1hHX0VWRU5UX1JJTkcgewotCVNYR19FVkVOVCBSaW5nW0VWRU5UX1JJTkdfU0laRV07Ci19IFNYR19FVkVOVF9SSU5HLCAqUFNYR19FVkVOVF9SSU5HOworc3RydWN0IFNYR19FVkVOVF9SSU5HIHsKKwlzdHJ1Y3QgU1hHX0VWRU5UIFJpbmdbRVZFTlRfUklOR19TSVpFXTsKK307CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC00MDAsMTIgKzQwMCwxMiBAQAogI2RlZmluZSBTWEdfTUFYX0VOVFJJRVMgICAgIDQwOTYKIAogLy8gU3RydWN0dXJlIGFuZCBtYWNyb3MgdG8gbWFuYWdlIGEgcmluZwotdHlwZWRlZiBzdHJ1Y3QgX1NYR19SSU5HX0lORk8geworc3RydWN0IFNYR19SSU5HX0lORk8gewogCXVuc2lnbmVkIGNoYXIgSGVhZDsJLy8gV2hlcmUgd2UgYWRkIGVudHJpZXMgLSBOb3RlIHVuc2lnbmVkIGNoYXI6UklOR19TSVpFCiAJdW5zaWduZWQgY2hhciBUYWlsOwkvLyBXaGVyZSB3ZSBwdWxsIG9mZiBjb21wbGV0ZWQgZW50cmllcwogCXVzaG9ydCBTaXplOwkJLy8gUmluZyBzaXplIC0gTXVzdCBiZSBtdWx0aXBsZSBvZiAyCiAJdm9pZCAqQ29udGV4dFtTWEdfTUFYX1JJTkdfU0laRV07CS8vIFNoYWRvdyByaW5nCi19IFNYR19SSU5HX0lORk8sICpQU1hHX1JJTkdfSU5GTzsKK307CiAKICNkZWZpbmUgU1hHX0lOSVRJQUxJWkVfUklORyhfcmluZywgX3NpemUpIHsJCQkJCQkJXAogCShfcmluZykuSGVhZCA9IDA7CQkJCQkJCQkJCQkJXApAQCAtNDgxLDcgKzQ4MSw3IEBACiAgKiAgfF9fX19fX19fX3xfX19fX19fX198X19fX19fX19ffF9fX19fX19fX3wyOAkJMHgxYwogICovCiAjcHJhZ21hIHBhY2socHVzaCwgMSkKLXR5cGVkZWYgc3RydWN0IF9TWEdfQ01EIHsKK3N0cnVjdCBTWEdfQ01EIHsKIAlkbWFfYWRkcl90IFNnbDsJCS8vIFBoeXNpY2FsIGFkZHJlc3Mgb2YgU0dMCiAJdW5pb24gewogCQlzdHJ1Y3QgewpAQCAtNTE4LDE0ICs1MTgsMTQgQEAKIAkJCXVuc2lnbmVkIGNoYXIgTm90VXNlZDsKIAkJfSBTdGF0dXM7CiAJfTsKLX0gU1hHX0NNRCwgKlBTWEdfQ01EOworfTsKICNwcmFnbWEgcGFjayhwb3ApCiAKICNwcmFnbWEgcGFjayhwdXNoLCAxKQotdHlwZWRlZiBzdHJ1Y3QgX1ZMQU5fSERSIHsKK3N0cnVjdCBWTEFOX0hEUiB7CiAJdXNob3J0IFZsYW5UY2k7CiAJdXNob3J0IFZsYW5UcGlkOwotfSBWTEFOX0hEUiwgKlBWTEFOX0hEUjsKK307CiAjcHJhZ21hIHBhY2socG9wKQogCiAvKgpAQCAtNTY0LDIyICs1NjQsMjIgQEAKICNkZWZpbmUgU1hHX1NMT1dDTURfQ1NVTV9UQ1AJCTB4MDIJLy8gQ2hlY2tzdW0gVENQCiAjZGVmaW5lIFNYR19TTE9XQ01EX0xTTwkJCQkweDA0CS8vIExhcmdlIHNlZ21lbnQgc2VuZAogCi10eXBlZGVmIHN0cnVjdCBfU1hHX1hNVF9SSU5HIHsKLQlTWEdfQ01EIERlc2NyaXB0b3JzW1NYR19YTVRfUklOR19TSVpFXTsKLX0gU1hHX1hNVF9SSU5HLCAqUFNYR19YTVRfUklORzsKK3N0cnVjdCBTWEdfWE1UX1JJTkcgeworCXN0cnVjdCBTWEdfQ01EIERlc2NyaXB0b3JzW1NYR19YTVRfUklOR19TSVpFXTsKK307CiAKLXR5cGVkZWYgc3RydWN0IF9TWEdfUkNWX1JJTkcgewotCVNYR19DTUQgRGVzY3JpcHRvcnNbU1hHX1JDVl9SSU5HX1NJWkVdOwotfSBTWEdfUkNWX1JJTkcsICpQU1hHX1JDVl9SSU5HOworc3RydWN0IFNYR19SQ1ZfUklORyB7CisJc3RydWN0IFNYR19DTUQgRGVzY3JpcHRvcnNbU1hHX1JDVl9SSU5HX1NJWkVdOworfTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogU2hhcmUgbWVtb3J5IGJ1ZmZlciB0eXBlcyAtIFVzZWQgdG8gaWRlbnRpZnkgYXN5bmNocm9ub3VzCiAgKiBzaGFyZWQgbWVtb3J5IGFsbG9jYXRpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10eXBlZGVmIGVudW0geworZW51bSBTWEdfQlVGRkVSX1RZUEUgewogCVNYR19CVUZGRVJfVFlQRV9SQ1YsCS8vIFJlY2VpdmUgYnVmZmVyCiAJU1hHX0JVRkZFUl9UWVBFX1NHTAkvLyBTR0wgYnVmZmVyCi19IFNYR19CVUZGRVJfVFlQRTsKK307CiAKIC8vIFN0YXRlIGZvciBTWEcgYnVmZmVycwogI2RlZmluZSBTWEdfQlVGRkVSX0ZSRUUJCTB4MDEKQEAgLTY3MCwxOSArNjcwLDE5IEBACiAjZGVmaW5lIFNYR19NQVhfUkNWX0JMT0NLUwkJCQkxMjgJLy8gPSAxNjM4NCByZWNlaXZlIGJ1ZmZlcnMKIAogLy8gUmVjZWl2ZSBidWZmZXIgaGVhZGVyCi10eXBlZGVmIHN0cnVjdCBfU1hHX1JDVl9EQVRBX0JVRkZFUl9IRFIgeworc3RydWN0IFNYR19SQ1ZfREFUQV9CVUZGRVJfSERSIHsKIAlkbWFfYWRkcl90IFBoeXNpY2FsQWRkcmVzczsJLy8gQnVmZmVyIHBoeXNpY2FsIGFkZHJlc3MKIAkvLyBOb3RlIC0gRE8gTk9UIFVTRSB0aGUgVmlydHVhbEFkZHJlc3MgZmllbGQgdG8gbG9jYXRlIGRhdGEuCiAJLy8gVXNlIHRoZSBzeGcuaDpTWEdfUkVDRUlWRV9EQVRBX0xPQ0FUSU9OIG1hY3JvIGluc3RlYWQuCiAJdm9pZCAqVmlydHVhbEFkZHJlc3M7CS8vIFN0YXJ0IG9mIGJ1ZmZlcgotCUxJU1RfRU5UUlkgRnJlZUxpc3Q7CS8vIEZyZWUgcXVldWUgb2YgYnVmZmVycwotCXN0cnVjdCBfU1hHX1JDVl9EQVRBX0JVRkZFUl9IRFIgKk5leHQ7CS8vIEZhc3RwYXRoIGRhdGEgYnVmZmVyIHF1ZXVlCisJc3RydWN0IExJU1RfRU5UUlkgRnJlZUxpc3Q7CS8vIEZyZWUgcXVldWUgb2YgYnVmZmVycworCXN0cnVjdCBTWEdfUkNWX0RBVEFfQlVGRkVSX0hEUiAqTmV4dDsJLy8gRmFzdHBhdGggZGF0YSBidWZmZXIgcXVldWUKIAl1MzIgU2l6ZTsJCS8vIEJ1ZmZlciBzaXplCiAJdTMyIEJ5dGVPZmZzZXQ7CQkvLyBTZWUgU1hHX1JFU1RPUkVfTURMX09GRlNFVAogCXVuc2lnbmVkIGNoYXIgU3RhdGU7CS8vIFNlZSBTWEdfQlVGRkVSIHN0YXRlIGFib3ZlCiAJdW5zaWduZWQgY2hhciBTdGF0dXM7CS8vIEV2ZW50IHN0YXR1cyAodG8gbG9nIFBVU0gpCiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsJLy8gRG91YmxlIG1hcHBlZCAobmJsIGFuZCBwa3QpCi19IFNYR19SQ1ZfREFUQV9CVUZGRVJfSERSLCAqUFNYR19SQ1ZfREFUQV9CVUZGRVJfSERSOworfTsKIAogLy8gU3hnU2xvd1JlY2VpdmUgdXNlcyB0aGUgUEFDS0VUIChza2IpIGNvbnRhaW5lZAogLy8gaW4gdGhlIFNYR19SQ1ZfREFUQV9CVUZGRVJfSERSIHdoZW4gaW5kaWNhdGluZyBkdW1iLW5pYyBkYXRhCkBAIC02OTMsNDIgKzY5Myw0MyBAQAogI2RlZmluZSBTWEdfUkNWX0pVTUJPX0JVRkZFUl9TSVpFCQkxMDI0MAkvLyBqdW1ibyA9IDEwayBpbmNsdWRpbmcgSERSCiAKIC8vIFJlY2VpdmUgZGF0YSBkZXNjcmlwdG9yCi10eXBlZGVmIHN0cnVjdCBfU1hHX1JDVl9EQVRBX0RFU0NSSVBUT1Igeworc3RydWN0IFNYR19SQ1ZfREFUQV9ERVNDUklQVE9SIHsKIAl1bmlvbiB7CiAJCXN0cnVjdCBza19idWZmICpWaXJ0dWFsQWRkcmVzczsJLy8gSG9zdCBoYW5kbGUKIAkJdTY0IEZvcmNlVG84Qnl0ZXM7CS8vIEZvcmNlIHg4NiB0byA4LWJ5dGUgYm91bmRhcnkKIAl9OwogCWRtYV9hZGRyX3QgUGh5c2ljYWxBZGRyZXNzOwotfSBTWEdfUkNWX0RBVEFfREVTQ1JJUFRPUiwgKlBTWEdfUkNWX0RBVEFfREVTQ1JJUFRPUjsKK307CiAKIC8vIFJlY2VpdmUgZGVzY3JpcHRvciBibG9jawogI2RlZmluZSBTWEdfUkNWX0RFU0NSSVBUT1JTX1BFUl9CTE9DSwkJMTI4CiAjZGVmaW5lIFNYR19SQ1ZfREVTQ1JJUFRPUl9CTE9DS19TSVpFCQkyMDQ4CS8vIEZvciBzYW5pdHkgY2hlY2sKLXR5cGVkZWYgc3RydWN0IF9TWEdfUkNWX0RFU0NSSVBUT1JfQkxPQ0sgewotCVNYR19SQ1ZfREFUQV9ERVNDUklQVE9SIERlc2NyaXB0b3JzW1NYR19SQ1ZfREVTQ1JJUFRPUlNfUEVSX0JMT0NLXTsKLX0gU1hHX1JDVl9ERVNDUklQVE9SX0JMT0NLLCAqUFNYR19SQ1ZfREVTQ1JJUFRPUl9CTE9DSzsKKworc3RydWN0IFNYR19SQ1ZfREVTQ1JJUFRPUl9CTE9DSyB7CisJc3RydWN0IFNYR19SQ1ZfREFUQV9ERVNDUklQVE9SIERlc2NyaXB0b3JzW1NYR19SQ1ZfREVTQ1JJUFRPUlNfUEVSX0JMT0NLXTsKK307CiAKIC8vIFJlY2VpdmUgZGVzY3JpcHRvciBibG9jayBoZWFkZXIKLXR5cGVkZWYgc3RydWN0IF9TWEdfUkNWX0RFU0NSSVBUT1JfQkxPQ0tfSERSIHsKK3N0cnVjdCBTWEdfUkNWX0RFU0NSSVBUT1JfQkxPQ0tfSERSIHsKIAl2b2lkICpWaXJ0dWFsQWRkcmVzczsJLy8gU3RhcnQgb2YgMmsgYnVmZmVyCiAJZG1hX2FkZHJfdCBQaHlzaWNhbEFkZHJlc3M7CS8vIC4uYW5kIGl0J3MgcGh5c2ljYWwgYWRkcmVzcwotCUxJU1RfRU5UUlkgRnJlZUxpc3Q7CS8vIEZyZWUgcXVldWUgb2YgZGVzY3JpcHRvciBibG9ja3MKKwlzdHJ1Y3QgTElTVF9FTlRSWSBGcmVlTGlzdDsJLy8gRnJlZSBxdWV1ZSBvZiBkZXNjcmlwdG9yIGJsb2NrcwogCXVuc2lnbmVkIGNoYXIgU3RhdGU7CS8vIFNlZSBTWEdfQlVGRkVSIHN0YXRlIGFib3ZlCi19IFNYR19SQ1ZfREVTQ1JJUFRPUl9CTE9DS19IRFIsICpQU1hHX1JDVl9ERVNDUklQVE9SX0JMT0NLX0hEUjsKK307CiAKIC8vIFJlY2VpdmUgYmxvY2sgaGVhZGVyCi10eXBlZGVmIHN0cnVjdCBfU1hHX1JDVl9CTE9DS19IRFIgeworc3RydWN0IFNYR19SQ1ZfQkxPQ0tfSERSIHsKIAl2b2lkICpWaXJ0dWFsQWRkcmVzczsJLy8gU3RhcnQgb2YgdmlydHVhbCBtZW1vcnkKIAlkbWFfYWRkcl90IFBoeXNpY2FsQWRkcmVzczsJLy8gLi5hbmQgaXQncyBwaHlzaWNhbCBhZGRyZXNzCi0JTElTVF9FTlRSWSBBbGxMaXN0OwkvLyBRdWV1ZSBvZiBhbGwgU1hHX1JDVl9CTE9DS1MKLX0gU1hHX1JDVl9CTE9DS19IRFIsICpQU1hHX1JDVl9CTE9DS19IRFI7CisJc3RydWN0IExJU1RfRU5UUlkgQWxsTGlzdDsJLy8gUXVldWUgb2YgYWxsIFNYR19SQ1ZfQkxPQ0tTCit9OwogCiAvLyBNYWNyb3MgdG8gZGV0ZXJtaW5lIGRhdGEgc3RydWN0dXJlIG9mZnNldHMgaW50byByZWNlaXZlIGJsb2NrCiAjZGVmaW5lIFNYR19SQ1ZfQkxPQ0tfU0laRShfQnVmZmVyc2l6ZSkgCQkJCQlcCiAJKCgoX0J1ZmZlcnNpemUpICogU1hHX1JDVl9ERVNDUklQVE9SU19QRVJfQkxPQ0spICsJCVwKLQkgKHNpemVvZihTWEdfUkNWX0RFU0NSSVBUT1JfQkxPQ0spKSAgICAgICAgICAgICAgKwkJXAotCSAoc2l6ZW9mKFNYR19SQ1ZfREVTQ1JJUFRPUl9CTE9DS19IRFIpKSAgICAgICAgICArCQlcCi0JIChzaXplb2YoU1hHX1JDVl9CTE9DS19IRFIpKSkKKwkgKHNpemVvZihzdHJ1Y3QgU1hHX1JDVl9ERVNDUklQVE9SX0JMT0NLKSkgICAgICAgICAgICAgICsJCVwKKwkgKHNpemVvZihzdHJ1Y3QgU1hHX1JDVl9ERVNDUklQVE9SX0JMT0NLX0hEUikpICAgICAgICAgICsJCVwKKwkgKHNpemVvZihzdHJ1Y3QgU1hHX1JDVl9CTE9DS19IRFIpKSkKICNkZWZpbmUgU1hHX1JDVl9CVUZGRVJfREFUQV9TSVpFKF9CdWZmZXJzaXplKQkJCQlcCiAJKChfQnVmZmVyc2l6ZSkgLSBTWEdfUkNWX0RBVEFfSERSX1NJWkUpCiAjZGVmaW5lIFNYR19SQ1ZfREFUQV9CVUZGRVJfSERSX09GRlNFVChfQnVmZmVyc2l6ZSkJCQlcCkBAIC03MzcsMTggKzczOCwxOCBAQAogCSgoX0J1ZmZlcnNpemUpICogU1hHX1JDVl9ERVNDUklQVE9SU19QRVJfQkxPQ0spCiAjZGVmaW5lIFNYR19SQ1ZfREVTQ1JJUFRPUl9CTE9DS19IRFJfT0ZGU0VUKF9CdWZmZXJzaXplKQlcCiAJKCgoX0J1ZmZlcnNpemUpICogU1hHX1JDVl9ERVNDUklQVE9SU19QRVJfQkxPQ0spICsJCVwKLQkgKHNpemVvZihTWEdfUkNWX0RFU0NSSVBUT1JfQkxPQ0spKSkKKwkgKHNpemVvZihzdHJ1Y3QgU1hHX1JDVl9ERVNDUklQVE9SX0JMT0NLKSkpCiAjZGVmaW5lIFNYR19SQ1ZfQkxPQ0tfSERSX09GRlNFVChfQnVmZmVyc2l6ZSkJCQkJXAogCSgoKF9CdWZmZXJzaXplKSAqIFNYR19SQ1ZfREVTQ1JJUFRPUlNfUEVSX0JMT0NLKSArCQlcCi0JIChzaXplb2YoU1hHX1JDVl9ERVNDUklQVE9SX0JMT0NLKSkgICAgICAgICAgICAgICsJCVwKLQkgKHNpemVvZihTWEdfUkNWX0RFU0NSSVBUT1JfQkxPQ0tfSERSKSkpCisJIChzaXplb2Yoc3RydWN0IFNYR19SQ1ZfREVTQ1JJUFRPUl9CTE9DSykpICAgICAgICAgICAgICArCQlcCisJIChzaXplb2Yoc3RydWN0IFNYR19SQ1ZfREVTQ1JJUFRPUl9CTE9DS19IRFIpKSkKIAogLy8gVXNlIHRoZSBtaW5pcG9ydCByZXNlcnZlZCBwb3J0aW9uIG9mIHRoZSBOQkwgdG8gbG9jYXRlCiAvLyBvdXIgU1hHX1JDVl9EQVRBX0JVRkZFUl9IRFIgc3RydWN0dXJlLgotdHlwZWRlZiBzdHJ1Y3QgX1NYR19SQ1ZfTkJMX1JFU0VSVkVEIHsKLQlQU1hHX1JDVl9EQVRBX0JVRkZFUl9IRFIgUmN2RGF0YUJ1ZmZlckhkcjsKK3N0cnVjdCBTWEdfUkNWX05CTF9SRVNFUlZFRCB7CisJc3RydWN0IFNYR19SQ1ZfREFUQV9CVUZGRVJfSERSICpSY3ZEYXRhQnVmZmVySGRyOwogCXZvaWQgKkF2YWlsYWJsZTsKLX0gU1hHX1JDVl9OQkxfUkVTRVJWRUQsICpQU1hHX1JDVl9OQkxfUkVTRVJWRUQ7Cit9OwogCiAjZGVmaW5lIFNYR19SQ1ZfTkJMX0JVRkZFUl9IRFIoX05CTCkgKCgoUFNYR19SQ1ZfTkJMX1JFU0VSVkVEKU5FVF9CVUZGRVJfTElTVF9NSU5JUE9SVF9SRVNFUlZFRChfTkJMKSktPlJjdkRhdGFCdWZmZXJIZHIpCiAKQEAgLTc2MCwxMSArNzYxLDExIEBACiAjZGVmaW5lIFNYR19NQVhfU0dMX0JVRkZFUlMJCQkxNjM4NAkvLyBNYXhpbXVtIHRvIGFsbG9jYXRlIChub3RlIEFEQVBUOnVzaG9ydCkKIAogLy8gU2VsZiBpZGVudGlmeWluZyBzdHJ1Y3R1cmUgdHlwZQotdHlwZWRlZiBlbnVtIF9TWEdfU0dMX1RZUEUgeworZW51bSBTWEdfU0dMX1RZUEUgewogCVNYR19TR0xfRFVNQiwJCS8vIER1bWIgTklDIFNHTAogCVNYR19TR0xfU0xPVywJCS8vIFNsb3dwYXRoIHByb3RvY29sIGhlYWRlciAtIHNlZSBiZWxvdwogCVNYR19TR0xfQ0hJTU5FWQkJLy8gQ2hpbW5leSBvZmZsb2FkIFNHTAotfSBTWEdfU0dMX1RZUEUsIFBTWEdfU0dMX1RZUEU7Cit9OwogCiAvLyBOb3RlIC0gdGhlIGRlc2NyaXB0aW9uIGJlbG93IGlzIE1pY3Jvc29mdCBzcGVjaWZpYwogLy8KQEAgLTc5OCw0MSArNzk5LDQxIEBACiAvLyB0byB0aGUgY2FyZCBkaXJlY3RseS4gIEZvciB4ODYgc3lzdGVtcyB3ZSBtdXN0IHJlY29uc3RydWN0CiAvLyB0aGUgU0dMLiAgVGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmUgZGVmaW5lcyBhbiB4NjQKIC8vIGZvcm1hdHRlZCBTR0wgZW50cnkKLXR5cGVkZWYgc3RydWN0IF9TWEdfWDY0X1NHRSB7CitzdHJ1Y3QgU1hHX1g2NF9TR0UgewogCWRtYTY0X2FkZHJfdCBBZGRyZXNzOwkvLyBzYW1lIGFzIHdkbS5oCiAJdTMyIExlbmd0aDsJCS8vIHNhbWUgYXMgd2RtLmgKIAl1MzIgQ29tcGlsZXJQYWQ7CS8vIFRoZSBjb21waWxlciBwYWRzIHRvIDgtYnl0ZXMKIAl1NjQgUmVzZXJ2ZWQ7CQkvLyB1MzIgKiBpbiB3ZG0uaC4gIEZvcmNlIHRvIDggYnl0ZXMKLX0gU1hHX1g2NF9TR0UsICpQU1hHX1g2NF9TR0U7Cit9OwogCi10eXBlZGVmIHN0cnVjdCBfU0NBVFRFUl9HQVRIRVJfRUxFTUVOVCB7CitzdHJ1Y3QgU0NBVFRFUl9HQVRIRVJfRUxFTUVOVCB7CiAJZG1hNjRfYWRkcl90IEFkZHJlc3M7CS8vIHNhbWUgYXMgd2RtLmgKIAl1MzIgTGVuZ3RoOwkJLy8gc2FtZSBhcyB3ZG0uaAogCXUzMiBDb21waWxlclBhZDsJLy8gVGhlIGNvbXBpbGVyIHBhZHMgdG8gOC1ieXRlcwogCXU2NCBSZXNlcnZlZDsJCS8vIHUzMiAqIGluIHdkbS5oLiAgRm9yY2UgdG8gOCBieXRlcwotfSBTQ0FUVEVSX0dBVEhFUl9FTEVNRU5ULCAqUFNDQVRURVJfR0FUSEVSX0VMRU1FTlQ7Cit9OwogCi10eXBlZGVmIHN0cnVjdCBfU0NBVFRFUl9HQVRIRVJfTElTVCB7CitzdHJ1Y3QgU0NBVFRFUl9HQVRIRVJfTElTVCB7CiAJdTMyIE51bWJlck9mRWxlbWVudHM7CiAJdTMyICpSZXNlcnZlZDsKLQlTQ0FUVEVSX0dBVEhFUl9FTEVNRU5UIEVsZW1lbnRzW107Ci19IFNDQVRURVJfR0FUSEVSX0xJU1QsICpQU0NBVFRFUl9HQVRIRVJfTElTVDsKKwlzdHJ1Y3QgU0NBVFRFUl9HQVRIRVJfRUxFTUVOVCBFbGVtZW50c1tdOworfTsKIAogLy8gVGhlIGNhcmQgZG9lc24ndCBjYXJlIGFib3V0IGFueXRoaW5nIGV4Y2VwdCBlbGVtZW50cywgc28KIC8vIHdlIGNhbiBsZWF2ZSB0aGUgdTMyICogcmVzZXJ2ZWQgZmllbGQgYWxvbmUgaW4gdGhlIGZvbGxvd2luZwogLy8gU0dMIHN0cnVjdHVyZS4gIEJ1dCByZWRlZmluZSBmcm9tIHdkbS5oOlNDQVRURVJfR0FUSEVSX0xJU1Qgc28KIC8vIHdlIGNhbiBzcGVjaWZ5IFNYR19YNjRfU0dFIGFuZCBkZWZpbmUgYSBmaXhlZCBudW1iZXIgb2YgZWxlbWVudHMKLXR5cGVkZWYgc3RydWN0IF9TWEdfWDY0X1NHTCB7CitzdHJ1Y3QgU1hHX1g2NF9TR0wgewogCXUzMiBOdW1iZXJPZkVsZW1lbnRzOwogCXUzMiAqUmVzZXJ2ZWQ7Ci0JU1hHX1g2NF9TR0UgRWxlbWVudHNbU1hHX1NHTF9FTlRSSUVTXTsKLX0gU1hHX1g2NF9TR0wsICpQU1hHX1g2NF9TR0w7CisJc3RydWN0IFNYR19YNjRfU0dFIEVsZW1lbnRzW1NYR19TR0xfRU5UUklFU107Cit9OwogCi10eXBlZGVmIHN0cnVjdCBfU1hHX1NDQVRURVJfR0FUSEVSIHsKLQlTWEdfU0dMX1RZUEUgVHlwZTsJLy8gRklSU1QhIER1bWItbmljIG9yIG9mZmxvYWQKK3N0cnVjdCBTWEdfU0NBVFRFUl9HQVRIRVIgeworCWVudW0gU1hHX1NHTF9UWVBFIFR5cGU7CS8vIEZJUlNUISBEdW1iLW5pYyBvciBvZmZsb2FkCiAJdm9pZCAqYWRhcHRlcjsJCS8vIEJhY2sgcG9pbnRlciB0byBhZGFwdGVyCi0JTElTVF9FTlRSWSBGcmVlTGlzdDsJLy8gRnJlZSBTWEdfU0NBVFRFUl9HQVRIRVIgYmxvY2tzCi0JTElTVF9FTlRSWSBBbGxMaXN0OwkvLyBBbGwgU1hHX1NDQVRURVJfR0FUSEVSIGJsb2NrcworCXN0cnVjdCBMSVNUX0VOVFJZIEZyZWVMaXN0OwkvLyBGcmVlIFNYR19TQ0FUVEVSX0dBVEhFUiBibG9ja3MKKwlzdHJ1Y3QgTElTVF9FTlRSWSBBbGxMaXN0OwkvLyBBbGwgU1hHX1NDQVRURVJfR0FUSEVSIGJsb2NrcwogCWRtYV9hZGRyX3QgUGh5c2ljYWxBZGRyZXNzOwkvLyBwaHlzaWNhbCBhZGRyZXNzCiAJdW5zaWduZWQgY2hhciBTdGF0ZTsJLy8gU2VlIFNYR19CVUZGRVIgc3RhdGUgYWJvdmUKIAl1bnNpZ25lZCBjaGFyIENtZEluZGV4OwkvLyBDb21tYW5kIHJpbmcgaW5kZXgKQEAgLTg0MCwxOCArODQxLDE4IEBACiAJdTMyIERpcmVjdGlvbjsJCS8vIEZvciBhc3luY2hyb25vdXMgY29tcGxldGlvbnMKIAl1MzIgQ3VyT2Zmc2V0OwkJLy8gQ3VycmVudCBTR0wgb2Zmc2V0CiAJdTMyIFNnbFJlZjsJCS8vIFNHTCByZWZlcmVuY2UgY291bnQKLQlWTEFOX0hEUiBWbGFuVGFnOwkvLyBWTEFOIHRhZyB0byBiZSBpbnNlcnRlZCBpbnRvIFNHTAotCVBTQ0FUVEVSX0dBVEhFUl9MSVNUIHBTZ2w7CS8vIFNHTCBBZGRyLiBQb3NzaWJseSAmU2dsCi0JU1hHX1g2NF9TR0wgU2dsOwkvLyBTR0wgaGFuZGVkIHRvIGNhcmQKLX0gU1hHX1NDQVRURVJfR0FUSEVSLCAqUFNYR19TQ0FUVEVSX0dBVEhFUjsKKwlzdHJ1Y3QgVkxBTl9IRFIgVmxhblRhZzsJLy8gVkxBTiB0YWcgdG8gYmUgaW5zZXJ0ZWQgaW50byBTR0wKKwlzdHJ1Y3QgU0NBVFRFUl9HQVRIRVJfTElTVCAqcFNnbDsJLy8gU0dMIEFkZHIuIFBvc3NpYmx5ICZTZ2wKKwlzdHJ1Y3QgU1hHX1g2NF9TR0wgU2dsOwkvLyBTR0wgaGFuZGVkIHRvIGNhcmQKK307CiAKICNpZiBkZWZpbmVkKENPTkZJR19YODZfNjQpCiAjZGVmaW5lIFNYR19TR0xfQlVGRkVSKF9TeGdTZ2wpCQkoJl9TeGdTZ2wtPlNnbCkKLSNkZWZpbmUgU1hHX1NHTF9CVUZfU0laRQkJCXNpemVvZihTWEdfWDY0X1NHTCkKKyNkZWZpbmUgU1hHX1NHTF9CVUZfU0laRQkJCXNpemVvZihzdHJ1Y3QgU1hHX1g2NF9TR0wpCiAjZWxpZiBkZWZpbmVkKENPTkZJR19YODYpCiAvLyBGb3JjZSBORElTIHRvIGdpdmUgdXMgaXQncyBvd24gYnVmZmVyIHNvIHdlIGNhbiByZWZvcm1hdCB0byBvdXIgb3duCiAjZGVmaW5lIFNYR19TR0xfQlVGRkVSKF9TeGdTZ2wpCQlOVUxMCiAjZGVmaW5lIFNYR19TR0xfQlVGX1NJWkUJCQkwCiAjZWxzZQotU3RvcCBDb21waWxhdGlvbjsKKyNlcnJvciBzdGFnaW5nOiBzeGc6IGRyaXZlciBpcyBmb3IgWDg2IG9ubHkhCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zeGcvc3hnaHcuaCBiL2RyaXZlcnMvc3RhZ2luZy9zeGcvc3hnaHcuaAppbmRleCAyMjIyYWU5Li5iMGVmZmY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvc3hnL3N4Z2h3LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3N4Zy9zeGdody5oCkBAIC00OCw3ICs0OCw3IEBACiAjZGVmaW5lIFNYR19IV1JFR19NRU1TSVpFCTB4NDAwMAkJLy8gMTZrCiAKICNwcmFnbWEgcGFjayhwdXNoLCAxKQotdHlwZWRlZiBzdHJ1Y3QgX1NYR19IV19SRUdTIHsKK3N0cnVjdCBTWEdfSFdfUkVHUyB7CiAJdTMyCQlSZXNldDsJCQkJLy8gV3JpdGUgMHhkZWFkIHRvIGludm9rZSBzb2Z0IHJlc2V0CiAJdTMyCQlQYWQxOwkJCQkvLyBObyByZWdpc3RlciBkZWZpbmVkIGF0IG9mZnNldCA0CiAJdTMyCQlJbnRlcnJ1cHRNYXNrMDsJCS8vIERlYXNzZXJ0IGxlZ2FjeSBpbnRlcnJ1cHQgb24gZnVuY3Rpb24gMApAQCAtMTEzLDcgKzExMyw3IEBACiAJdTMyCQlTb2Z0d2FyZVsxOTIwXTsJCS8vIDB4MjAwIC0gMHgyMDAwIC0gU29mdHdhcmUgZGVmaW5lZCAobm90IHVzZWQpCiAJdTMyCQlNc2l4VGFibGVbMTAyNF07CS8vIDB4MjAwMCAtIDB4MzAwMCAtIE1TSVggVGFibGUKIAl1MzIJCU1zaXhCaXRBcnJheVsxMDI0XTsJLy8gMHgzMDAwIC0gMHg0MDAwIC0gTVNJWCBQZW5kaW5nIEJpdCBBcnJheQotfSBTWEdfSFdfUkVHUywgKlBTWEdfSFdfUkVHUzsKK307CiAjcHJhZ21hIHBhY2socG9wKQogCiAvLyBNaWNyb2NvZGUgQWRkcmVzcyBGbGFncwpAQCAtNTE5LDEwICs1MTksMTAgQEAKICNkZWZpbmUJWFNfTEFORV9BTElHTgkJCTB4MTAwMAkJCS8vIFhTIHRyYW5zbWl0IGxhbmVzIGFsaWduZWQKIAogLy8gUEhZIE1pY3JvY29kZSBkb3dubG9hZCBkYXRhIHN0cnVjdHVyZQotdHlwZWRlZiBzdHJ1Y3QgX1BIWV9VQ09ERSB7CitzdHJ1Y3QgUEhZX1VDT0RFIHsKIAl1c2hvcnQJQWRkcjsKIAl1c2hvcnQJRGF0YTsKLX0gUEhZX1VDT0RFLCAqUFBIWV9VQ09ERTsKK307CiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC01MzcsNyArNTM3LDcgQEAKIC8vIGFsbCBjb21tYW5kcyAtIHNlZSB0aGUgU2FoYXJhIHNwZWMgZm9yIGRldGFpbHMuICBOb3RlIHRoYXQgdGhpcyBzdHJ1Y3R1cmUgaXMKIC8vIG9ubHkgdmFsaWQgd2hlbiBjb21waWxlZCBvbiBhIGxpdHRsZSBlbmRpYW4gbWFjaGluZS4KICNwcmFnbWEgcGFjayhwdXNoLCAxKQotdHlwZWRlZiBzdHJ1Y3QgX1hNVF9ERVNDIHsKK3N0cnVjdCBYTVRfREVTQyB7CiAJdXNob3J0CVhtdExlbjsJCQkvLyB3b3JkIDAsIGJpdHMgWzE1OjBdIC0gIHRyYW5zbWl0IGxlbmd0aAogCXVuc2lnbmVkIGNoYXIJWG10Q3RsOwkJCS8vIHdvcmQgMCwgYml0cyBbMjM6MTZdIC0gdHJhbnNtaXQgY29udHJvbCBieXRlCiAJdW5zaWduZWQgY2hhcglDbWQ7CQkJLy8gd29yZCAwLCBiaXRzIFszMToyNF0gLSB0cmFuc21pdCBjb21tYW5kIHBsdXMgbWlzYy4KQEAgLTU1MSw3ICs1NTEsNyBAQAogCXUzMglSc3ZkMzsJCQkvLyB3b3JkIDUsIGJpdHMgWzMxOjBdIC0gIFBBRAogCXUzMglSc3ZkNDsJCSAgICAvLyB3b3JkIDYsIGJpdHMgWzMxOjBdIC0gIFBBRAogCXUzMglSc3ZkNTsJCSAgICAvLyB3b3JkIDcsIGJpdHMgWzMxOjBdIC0gIFBBRAotfSBYTVRfREVTQywgKlBYTVRfREVTQzsKK307CiAjcHJhZ21hIHBhY2socG9wKQogCiAvLyBYTVRfREVTQyBDbWQgYnl0ZSBkZWZpbml0aW9ucwpAQCAtNjAwLDcgKzYwMCw3IEBACiAvLyBGb3JtYXQgb2YgdGhlIDE4IGJ5dGUgUmVjZWl2ZSBCdWZmZXIgcmV0dXJuZWQgYnkgdGhlCiAvLyBSZWNlaXZlIFNlcXVlbmNlciBmb3IgcmVjZWl2ZWQgcGFja2V0cwogI3ByYWdtYSBwYWNrKHB1c2gsIDEpCi10eXBlZGVmIHN0cnVjdCBfUkNWX0JVRl9IRFIgeworc3RydWN0IFJDVl9CVUZfSERSIHsKIAl1MzIJU3RhdHVzOwkJCQkvLyBTdGF0dXMgd29yZCBmcm9tIFJjdiBTZXEgUGFyc2VyCiAJdXNob3J0CUxlbmd0aDsJCQkJLy8gUmN2IHBhY2tldCBieXRlIGNvdW50CiAJdW5pb24gewpAQCAtNjE1LDcgKzYxNSw3IEBACiAJdW5zaWduZWQgY2hhcglJcEhkck9mZnNldDsJCS8vIElQIGhlYWRlciBvZmZzZXQgaW50byBwYWNrZXQKIAl1MzIJVHB6SGFzaDsJCQkvLyBUb2VwbGl0eiBoYXNoCiAJdXNob3J0CVJlc2VydmVkOwkJCS8vIFJlc2VydmVkCi19IFJDVl9CVUZfSERSLCAqUFJDVl9CVUZfSERSOworfTsKICNwcmFnbWEgcGFjayhwb3ApCiAKIApAQCAtNjY1LDI4ICs2NjUsMjggQEAKICNwcmFnbWEgcGFjayhwdXNoLCAxKQogCiAvKiAqLwotdHlwZWRlZiBzdHJ1Y3QgX0hXX0NGR19EQVRBIHsKK3N0cnVjdCBIV19DRkdfREFUQSB7CiAJdXNob3J0CQlBZGRyOwogCXVuaW9uIHsKIAkJdXNob3J0CURhdGE7CiAJCXVzaG9ydAlDaGVja3N1bTsKIAl9OwotfSBIV19DRkdfREFUQSwgKlBIV19DRkdfREFUQTsKK307CiAKIC8qICovCi0jZGVmaW5lCU5VTV9IV19DRkdfRU5UUklFUwkoKDEyOC9zaXplb2YoSFdfQ0ZHX0RBVEEpKSAtIDQpCisjZGVmaW5lCU5VTV9IV19DRkdfRU5UUklFUwkoKDEyOC9zaXplb2Yoc3RydWN0IEhXX0NGR19EQVRBKSkgLSA0KQogCiAvKiBNQUMgYWRkcmVzcyAqLwotdHlwZWRlZiBzdHJ1Y3QgX1NYR19DT05GSUdfTUFDIHsKK3N0cnVjdCBTWEdfQ09ORklHX01BQyB7CiAJdW5zaWduZWQgY2hhcgkJTWFjQWRkcls2XTsJCQkvKiBNQUMgQWRkcmVzcyAqLwotfSBTWEdfQ09ORklHX01BQywgKlBTWEdfQ09ORklHX01BQzsKK307CiAKIC8qICovCi10eXBlZGVmIHN0cnVjdCBfQVRLX0ZSVSB7CitzdHJ1Y3QgQVRLX0ZSVSB7CiAJdW5zaWduZWQgY2hhcgkJUGFydE51bVs2XTsKIAl1bnNpZ25lZCBjaGFyCQlSZXZpc2lvblsyXTsKIAl1bnNpZ25lZCBjaGFyCQlTZXJpYWxbMTRdOwotfSBBVEtfRlJVLCAqUEFUS19GUlU7Cit9OwogCiAvKiBPRU0gRlJVIEZvcm1hdCB0eXBlcyAqLwogI2RlZmluZQlBVEtfRlJVX0ZPUk1BVAkJMHgwMDAwCkBAIC02OTgsMjQgKzY5OCwyNCBAQAogI2RlZmluZSBOT19GUlVfRk9STUFUCQkweEZGRkYKIAogLyogRUVQUk9NL0ZsYXNoIEZvcm1hdCAqLwotdHlwZWRlZiBzdHJ1Y3QgX1NYR19DT05GSUcgeworc3RydWN0IFNYR19DT05GSUcgewogCS8qICovCiAJLyogU2VjdGlvbiAxICgxMjggYnl0ZXMpICovCiAJLyogKi8KIAl1c2hvcnQJCQlNYWdpY1dvcmQ7CQkJLyogRUVQUk9NL0ZMQVNIIE1hZ2ljIGNvZGUgJ0E1QTUnICovCiAJdXNob3J0CQkJU3BpQ2xrczsJCQkvKiBTUEkgYnVzIGNsb2NrIGRpdmlkZXJzICovCi0JSFdfQ0ZHX0RBVEEJCUh3Q2ZnW05VTV9IV19DRkdfRU5UUklFU107CisJc3RydWN0IEhXX0NGR19EQVRBCQlId0NmZ1tOVU1fSFdfQ0ZHX0VOVFJJRVNdOwogCS8qICovCiAJLyogKi8KIAkvKiAqLwogCXVzaG9ydAkJCVZlcnNpb247CQkJLyogRUVQUk9NIGZvcm1hdCB2ZXJzaW9uICovCi0JU1hHX0NPTkZJR19NQUMJTWFjQWRkcls0XTsJCQkvKiBzcGFjZSBmb3IgNCBNQUMgYWRkcmVzc2VzICovCi0JQVRLX0ZSVQkJCUF0a0ZydTsJCQkJLyogRlJVIGluZm9ybWF0aW9uICovCisJc3RydWN0IFNYR19DT05GSUdfTUFDCU1hY0FkZHJbNF07CQkJLyogc3BhY2UgZm9yIDQgTUFDIGFkZHJlc3NlcyAqLworCXN0cnVjdCBBVEtfRlJVCQkJQXRrRnJ1OwkJCQkvKiBGUlUgaW5mb3JtYXRpb24gKi8KIAl1c2hvcnQJCQlPZW1GcnVGb3JtYXQ7CQkvKiBPRU0gRlJVIGZvcm1hdCB0eXBlICovCiAJdW5zaWduZWQgY2hhcgkJCU9lbUZydVs3Nl07CQkJLyogT0VNIEZSVSBpbmZvcm1hdGlvbiAob3B0aW9uYWwpICovCiAJdXNob3J0CQkJQ2hlY2tzdW07CQkJLyogQ2hlY2tzdW0gb2Ygc2VjdGlvbiAyICovCiAJLyogQ1MgaW5mbyBYWFhUT0RPICovCi19IFNYR19DT05GSUcsICpQU1hHX0NPTkZJRzsKK307CiAjcHJhZ21hIHBhY2socG9wKQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zeGcvc3hncGh5Y29kZS5oIGIvZHJpdmVycy9zdGFnaW5nL3N4Zy9zeGdwaHljb2RlLmgKaW5kZXggOGRiYWVkYS4uMTY3ZjM1NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3N4Zy9zeGdwaHljb2RlLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3N4Zy9zeGdwaHljb2RlLmgKQEAgLTE4LDcgKzE4LDcgQEAKIC8qCiAgKiBEb3dubG9hZCBmb3IgQUVMMjAwNUMgUEhZIHdpdGggU1IvTFIgdHJhbnNjZWl2ZXIgKDEwR0JBU0UtU1Igb3IgMTBHQkFTRS1MUikKICAqLwotc3RhdGljIFBIWV9VQ09ERSBQaHlVY29kZVtdID0geworc3RhdGljIHN0cnVjdCBQSFlfVUNPREUgUGh5VWNvZGVbXSA9IHsKIAkvKgogCSAqIE5PVEU6ICBBbiBhZGRyZXNzIG9mIDAgaXMgYSBzcGVjaWFsIGNhc2UuICBXaGVuIHRoZSBkb3dubG9hZCByb3V0aW5lCiAJICogc2VlcyBhbiBhZGRyZXNzIG9mIDAsIGl0IGRvZXMgbm90IHdyaXRlIHRvIHRoZSBQSFkuICBJbnN0ZWFkLCBpdApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3N0dWIuaCBiL2RyaXZlcnMvc3RhZ2luZy91c2JpcC9zdHViLmgKaW5kZXggZjU0MWEzYS4uMDIyZDA2NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3N0dWIuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvc3R1Yi5oCkBAIC05MSw1ICs5MSw1IEBACiB2b2lkIHN0dWJfZW5xdWV1ZV9yZXRfdW5saW5rKHN0cnVjdCBzdHViX2RldmljZSAqLCBfX3UzMiwgX191MzIpOwogCiAvKiBzdHViX21haW4uYyAqLwotaW50IG1hdGNoX2J1c2lkKGNoYXIgKmJ1c2lkKTsKK2ludCBtYXRjaF9idXNpZChjb25zdCBjaGFyICpidXNpZCk7CiB2b2lkIHN0dWJfZGV2aWNlX2NsZWFudXBfdXJicyhzdHJ1Y3Qgc3R1Yl9kZXZpY2UgKnNkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3N0dWJfZGV2LmMgYi9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvc3R1Yl9kZXYuYwppbmRleCBlZTQ1NWEwLi4xZTMyMGNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvc3R1Yl9kZXYuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvc3R1Yl9kZXYuYwpAQCAtMzg5LDcgKzM4OSw3IEBACiB7CiAJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KGludGVyZmFjZSk7CiAJc3RydWN0IHN0dWJfZGV2aWNlICpzZGV2ID0gTlVMTDsKLQljaGFyICp1ZGV2X2J1c2lkID0gaW50ZXJmYWNlLT5kZXYucGFyZW50LT5idXNfaWQ7CisJY29uc3QgY2hhciAqdWRldl9idXNpZCA9IGRldl9uYW1lKGludGVyZmFjZS0+ZGV2LnBhcmVudCk7CiAJaW50IGVyciA9IDA7CiAKIAlkZXZfZGJnKCZpbnRlcmZhY2UtPmRldiwgIkVudGVyXG4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91c2JpcC9zdHViX21haW4uYyBiL2RyaXZlcnMvc3RhZ2luZy91c2JpcC9zdHViX21haW4uYwppbmRleCBjNjY1ZDdmLi4wNWU0YzYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvc3R1Yl9tYWluLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3N0dWJfbWFpbi5jCkBAIC00MCwxMSArNDAsMTIgQEAKICAqIHJlbW90ZSBob3N0LgogICovCiAjZGVmaW5lIE1BWF9CVVNJRCAxNgotc3RhdGljIGNoYXIgYnVzaWRfdGFibGVbTUFYX0JVU0lEXVtCVVNfSURfU0laRV07CisjZGVmaW5lIEJVU0lEX1NJWkUgMjAKK3N0YXRpYyBjaGFyIGJ1c2lkX3RhYmxlW01BWF9CVVNJRF1bQlVTSURfU0laRV07CiBzdGF0aWMgc3BpbmxvY2tfdCBidXNpZF90YWJsZV9sb2NrOwogCiAKLWludCBtYXRjaF9idXNpZChjaGFyICpidXNpZCkKK2ludCBtYXRjaF9idXNpZChjb25zdCBjaGFyICpidXNpZCkKIHsKIAlpbnQgaTsKIApAQCAtNTIsNyArNTMsNyBAQAogCiAJZm9yIChpID0gMDsgaSA8IE1BWF9CVVNJRDsgaSsrKQogCQlpZiAoYnVzaWRfdGFibGVbaV1bMF0pCi0JCQlpZiAoIXN0cm5jbXAoYnVzaWRfdGFibGVbaV0sIGJ1c2lkLCBCVVNfSURfU0laRSkpIHsKKwkJCWlmICghc3RybmNtcChidXNpZF90YWJsZVtpXSwgYnVzaWQsIEJVU0lEX1NJWkUpKSB7CiAJCQkJLyogYWxyZWFkeSByZWdpc3RlcmQgKi8KIAkJCQlzcGluX3VubG9jaygmYnVzaWRfdGFibGVfbG9jayk7CiAJCQkJcmV0dXJuIDA7CkBAIC05Miw3ICs5Myw3IEBACiAKIAlmb3IgKGkgPSAwOyBpIDwgTUFYX0JVU0lEOyBpKyspCiAJCWlmICghYnVzaWRfdGFibGVbaV1bMF0pIHsKLQkJCXN0cm5jcHkoYnVzaWRfdGFibGVbaV0sIGJ1c2lkLCBCVVNfSURfU0laRSk7CisJCQlzdHJuY3B5KGJ1c2lkX3RhYmxlW2ldLCBidXNpZCwgQlVTSURfU0laRSk7CiAJCQlzcGluX3VubG9jaygmYnVzaWRfdGFibGVfbG9jayk7CiAJCQlyZXR1cm4gMDsKIAkJfQpAQCAtMTA5LDkgKzExMCw5IEBACiAJc3Bpbl9sb2NrKCZidXNpZF90YWJsZV9sb2NrKTsKIAogCWZvciAoaSA9IDA7IGkgPCBNQVhfQlVTSUQ7IGkrKykKLQkJaWYgKCFzdHJuY21wKGJ1c2lkX3RhYmxlW2ldLCBidXNpZCwgQlVTX0lEX1NJWkUpKSB7CisJCWlmICghc3RybmNtcChidXNpZF90YWJsZVtpXSwgYnVzaWQsIEJVU0lEX1NJWkUpKSB7CiAJCQkvKiBmb3VuZCAqLwotCQkJbWVtc2V0KGJ1c2lkX3RhYmxlW2ldLCAwLCBCVVNfSURfU0laRSk7CisJCQltZW1zZXQoYnVzaWRfdGFibGVbaV0sIDAsIEJVU0lEX1NJWkUpOwogCQkJc3Bpbl91bmxvY2soJmJ1c2lkX3RhYmxlX2xvY2spOwogCQkJcmV0dXJuIDA7CiAJCX0KQEAgLTEyNSwxOSArMTI2LDE5IEBACiAJCXNpemVfdCBjb3VudCkKIHsKIAlpbnQgbGVuOwotCWNoYXIgYnVzaWRbQlVTX0lEX1NJWkVdOworCWNoYXIgYnVzaWRbQlVTSURfU0laRV07CiAKIAlpZiAoY291bnQgPCA1KQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCS8qIHN0cm5sZW4oKSBkb2VzIG5vdCBpbmNsdWRlIFwwICovCi0JbGVuID0gc3RybmxlbihidWYgKyA0LCBCVVNfSURfU0laRSk7CisJbGVuID0gc3RybmxlbihidWYgKyA0LCBCVVNJRF9TSVpFKTsKIAogCS8qIGJ1c2lkIG5lZWRzIHRvIGluY2x1ZGUgXDAgdGVybWluYXRpb24gKi8KLQlpZiAoIShsZW4gPCBCVVNfSURfU0laRSkpCisJaWYgKCEobGVuIDwgQlVTSURfU0laRSkpCiAJCXJldHVybiAtRUlOVkFMOwogCi0Jc3RybmNweShidXNpZCwgYnVmICsgNCwgQlVTX0lEX1NJWkUpOworCXN0cm5jcHkoYnVzaWQsIGJ1ZiArIDQsIEJVU0lEX1NJWkUpOwogCiAKIAlpZiAoIXN0cm5jbXAoYnVmLCAiYWRkICIsIDQpKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvc3R1Yl9yeC5jIGIvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3N0dWJfcnguYwppbmRleCAzNmNlODk4Li4yZWI2MTM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvc3R1Yl9yeC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91c2JpcC9zdHViX3J4LmMKQEAgLTE1Nyw3ICsxNTcsNyBAQAogCSAqIEEgdXNlciBtYXkgbmVlZCB0byBzZXQgYSBzcGVjaWFsIGNvbmZpZ3VyYXRpb24gdmFsdWUgYmVmb3JlCiAJICogZXhwb3J0aW5nIHRoZSBkZXZpY2UuCiAJICovCi0JdWluZm8oInNldF9jb25maWd1cmF0aW9uICglZCkgdG8gJXNcbiIsIGNvbmZpZywgdXJiLT5kZXYtPmRldi5idXNfaWQpOworCXVpbmZvKCJzZXRfY29uZmlndXJhdGlvbiAoJWQpIHRvICVzXG4iLCBjb25maWcsIGRldl9uYW1lKCZ1cmItPmRldi0+ZGV2KSk7CiAJdWluZm8oImJ1dCwgc2tpcCFcbiIpOwogCiAJcmV0dXJuIDA7CkBAIC0xNzUsNyArMTc1LDcgQEAKIAl2YWx1ZSA9IGxlMTZfdG9fY3B1KHJlcS0+d1ZhbHVlKTsKIAlpbmRleCA9IGxlMTZfdG9fY3B1KHJlcS0+d0luZGV4KTsKIAotCXVpbmZvKCJyZXNldF9kZXZpY2UgKHBvcnQgJWQpIHRvICVzXG4iLCBpbmRleCwgdXJiLT5kZXYtPmRldi5idXNfaWQpOworCXVpbmZvKCJyZXNldF9kZXZpY2UgKHBvcnQgJWQpIHRvICVzXG4iLCBpbmRleCwgZGV2X25hbWUoJnVyYi0+ZGV2LT5kZXYpKTsKIAogCS8qIGFsbCBpbnRlcmZhY2VzIHNob3VsZCBiZSBvd25lZCBieSB1c2JpcCBkcml2ZXIsIHNvIGp1c3QgcmVzZXQgaXQuICAqLwogCXJldCA9IHVzYl9sb2NrX2RldmljZV9mb3JfcmVzZXQodXJiLT5kZXYsIE5VTEwpOwpAQCAtMjM0LDggKzIzNCw2IEBACiBzdGF0aWMgaW50IHN0dWJfcmVjdl9jbWRfdW5saW5rKHN0cnVjdCBzdHViX2RldmljZSAqc2RldiwKIAkJCQkJCXN0cnVjdCB1c2JpcF9oZWFkZXIgKnBkdSkKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0aGVhZCA9ICZzZGV2LT5wcml2X2luaXQ7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcHRyOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlzdHJ1Y3Qgc3R1Yl9wcml2ICpwcml2OwpAQCAtMjQzLDggKzI0MSw3IEBACiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmc2Rldi0+cHJpdl9sb2NrLCBmbGFncyk7CiAKLQlmb3IgKHB0ciA9IGxpc3RoZWFkLT5uZXh0OyBwdHIgIT0gbGlzdGhlYWQ7IHB0ciA9IHB0ci0+bmV4dCkgewotCQlwcml2ID0gbGlzdF9lbnRyeShwdHIsIHN0cnVjdCBzdHViX3ByaXYsIGxpc3QpOworCWxpc3RfZm9yX2VhY2hfZW50cnkocHJpdiwgJnNkZXYtPnByaXZfaW5pdCwgbGlzdCkgewogCQlpZiAocHJpdi0+c2VxbnVtID09IHBkdS0+dS5jbWRfdW5saW5rLnNlcW51bSkgewogCQkJaW50IHJldDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3N0dWJfdHguYyBiL2RyaXZlcnMvc3RhZ2luZy91c2JpcC9zdHViX3R4LmMKaW5kZXggZDU1NjNjZC4uNzgwNThmNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3N0dWJfdHguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvc3R1Yl90eC5jCkBAIC01NCw3ICs1NCw2IEBACiAvKioKICAqIHN0dWJfY29tcGxldGUgLSBjb21wbGV0aW9uIGhhbmRsZXIgb2YgYSB1c2JpcCB1cmIKICAqIEB1cmI6IHBvaW50ZXIgdG8gdGhlIHVyYiBjb21wbGV0ZWQKLSAqIEByZWdzOgogICoKICAqIFdoZW4gYSB1cmIgaGFzIGNvbXBsZXRlZCwgdGhlIFVTQiBjb3JlIGRyaXZlciBjYWxscyB0aGlzIGZ1bmN0aW9uIG1vc3RseSBpbgogICogdGhlIGludGVycnVwdCBjb250ZXh0LiBUbyByZXR1cm4gdGhlIHJlc3VsdCBvZiBhIHVyYiwgdGhlIGNvbXBsZXRlZCB1cmIgaXMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91c2JpcC92aGNpX2hjZC5jIGIvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3ZoY2lfaGNkLmMKaW5kZXggNWI1YTJlMy4uZjY5Y2EzNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3ZoY2lfaGNkLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3ZoY2lfaGNkLmMKQEAgLTEwOTEsNyArMTA5MSw3IEBACiAJICogQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgaGNkLgogCSAqIE91ciBwcml2YXRlIGRhdGEgaXMgYWxzbyBhbGxvY2F0ZWQgYXV0b21hdGljYWxseS4KIAkgKi8KLQloY2QgPSB1c2JfY3JlYXRlX2hjZCgmdmhjaV9oY19kcml2ZXIsICZwZGV2LT5kZXYsIHBkZXYtPmRldi5idXNfaWQpOworCWhjZCA9IHVzYl9jcmVhdGVfaGNkKCZ2aGNpX2hjX2RyaXZlciwgJnBkZXYtPmRldiwgZGV2X25hbWUoJnBkZXYtPmRldikpOwogCWlmICghaGNkKSB7CiAJCXVlcnIoImNyZWF0ZSBoY2QgZmFpbGVkXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdmhjaV9zeXNmcy5jIGIvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3ZoY2lfc3lzZnMuYwppbmRleCAyNGMyODUxLi4wZmQzM2E2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdmhjaV9zeXNmcy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91c2JpcC92aGNpX3N5c2ZzLmMKQEAgLTYwLDcgKzYwLDcgQEAKIAkJCW91dCArPSBzcHJpbnRmKG91dCwgIiUwM3UgJTA4eCAiLAogCQkJCQl2ZGV2LT5zcGVlZCwgdmRldi0+ZGV2aWQpOwogCQkJb3V0ICs9IHNwcmludGYob3V0LCAiJTE2cCAiLCB2ZGV2LT51ZC50Y3Bfc29ja2V0KTsKLQkJCW91dCArPSBzcHJpbnRmKG91dCwgIiVzIiwgdmRldi0+dWRldi0+ZGV2LmJ1c19pZCk7CisJCQlvdXQgKz0gc3ByaW50ZihvdXQsICIlcyIsIGRldl9uYW1lKCZ2ZGV2LT51ZGV2LT5kZXYpKTsKIAogCQl9IGVsc2UKIAkJCW91dCArPSBzcHJpbnRmKG91dCwgIjAwMCAwMDAgMDAwIDAwMDAwMDAwMDAwMDAwMDAgMC0wIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvS2NvbmZpZwppbmRleCA0MjUyMTllLi45NDA0NjBjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9LY29uZmlnCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL0tjb25maWcKQEAgLTEsNyArMSwxMSBAQAogY29uZmlnIFczNVVORAotCXRyaXN0YXRlICJXaW5ib25kIGRyaXZlciIKLQlkZXBlbmRzIG9uIE1BQzgwMjExICYmIFdMQU5fODAyMTEgJiYgVVNCICYmIEVYUEVSSU1FTlRBTCAmJiAhNEtTVEFDS1MKKwl0cmlzdGF0ZSAiSVM4OUMzNSBXTEFOIFVTQiBkcml2ZXIiCisJZGVwZW5kcyBvbiBNQUM4MDIxMSAmJiBXTEFOXzgwMjExICYmIFVTQiAmJiBFWFBFUklNRU5UQUwKIAlkZWZhdWx0IG4KIAktLS1oZWxwLS0tCi0JICBUaGlzIGlzIGhpZ2hseSBleHBlcmltZW50YWwgZHJpdmVyIGZvciB3aW5ib25kIHdpZmkgY2FyZCBvbiBzb21lIEtvaGppbnNoYSBub3RlYm9va3MKLQkgIENoZWNrIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC93aW5ib25kcG9ydC8gZm9yIG5ldyB2ZXJzaW9uCisJICBUaGlzIGlzIGhpZ2hseSBleHBlcmltZW50YWwgZHJpdmVyIGZvciBXaW5ib25kIFdJRkkgY2FyZC4KKworCSAgSGFyZHdhcmUgaXMgcHJlc2VudCBpbiBzb21lIEtvaGppbnNoYSBzdWJub3RlYm9va3MsIGFuZCBpbiBzb21lCisJICBzdGFuZC1hbG9uZSBVU0IgbW9kdWxlcy4gQ2hpcHNldCBuYW1lIHNlZW1zIHRvIGJlIHc4OWMzNWQuCisKKwkgIENoZWNrIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC93aW5ib25kcG9ydC8gZm9yIG5ldyB2ZXJzaW9uLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9NYWtlZmlsZQppbmRleCAyOWM5OGJmLi5iNDljOTczIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9NYWtlZmlsZQpAQCAtMSwxNSArMSwxNCBAQAotCURSSVZFUl9ESVI9Li9saW51eAotCi13MzV1bmQtb2JqcyA6PSAkKERSSVZFUl9ESVIpL3didXNiLm8gJChEUklWRVJfRElSKS93YjM1cmVnLm8gJChEUklWRVJfRElSKS93YjM1cngubyAkKERSSVZFUl9ESVIpL3diMzV0eC5vIFwKLQltZHMubyBcCi0JbWxtZXR4cngubyBcCi0JbXRvLm8JXAordzM1dW5kLW9ianMgOj0JCQlcCisJbWRzLm8JCQlcCisJbWxtZXR4cngubwkJXAorCW10by5vCQkJXAogCXBoeV9jYWxpYnJhdGlvbi5vCVwKIAlyZWcubwkJCVwKLQlyeGlzci5vCQkJXAotCXNtZV9hcGkubwkJXAorCXdiMzVyZWcubwkJXAorCXdiMzVyeC5vCQlcCisJd2IzNXR4Lm8JCVwKIAl3YmhhbC5vCQkJXAotCXdibGludXgubwkJXAorCXdidXNiLm8JCQlcCiAKIAogb2JqLSQoQ09ORklHX1czNVVORCkgKz0gdzM1dW5kLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL2FkYXB0ZXIuaCBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL2FkYXB0ZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjA5NzAxZC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9hZGFwdGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vLwotLy8gQURBUFRFUi5IIC0KLS8vIFdpbmRvd3MgTkRJUyBnbG9iYWwgdmFyaWFibGUgJ0FkYXB0ZXInIHR5cGVkZWYKLS8vCi0jZGVmaW5lIE1BWF9BTlNJX1NUUklORwkJNDAKLXR5cGVkZWYgc3RydWN0IFdCMzJfQURBUFRFUgotewotCXUzMiBBZGFwdGVySW5kZXg7IC8vIDIwMDYwNzAzLjQgQWRkIGZvciB1c2luZyBwQWRhcHRlckNvbnRleHQgZ2xvYmFsIEFkYXB0ZXIgcG9pbnQKLQotCVdCX0xPQ0FMREVTQ1JJUFQJc0xvY2FsUGFyYTsJCS8vIE15c2VsZiBjb25uZWN0ZWQgcGFyYW1ldGVycwotCVBXQl9CU1NERVNDUklQVElPTglhc0JTU0Rlc2NyaXB0RWxlbWVudDsKLQotCU1MTUVfRlJBTUUJCXNNbG1lRnJhbWU7CQkvLyBjb25uZWN0IHRvIHBlZXJTVEEgcGFyYW1ldGVycwotCi0JTVRPX1BBUkFNRVRFUlMJCXNNdG9QYXJhOyAvLyBNVE9fc3RydWN0IC4uLgotCWh3X2RhdGFfdAkJCXNId0RhdGE7IC8vRm9yIEhBTAotCU1EUwkJCQkJTWRzOwotCi0JV0JMSU5VWAkJV2JMaW51eDsKLSAgICAgICAgc3RydWN0IGl3X3N0YXRpc3RpY3MgaXdfc3RhdHM7Ci0KLQl1OAlMaW5rTmFtZVtNQVhfQU5TSV9TVFJJTkddOwotfSBXQjMyX0FEQVBURVIsIEFEQVBURVIsICpQV0IzMl9BREFQVEVSLCAqUEFEQVBURVI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9ic3NfZi5oIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvYnNzX2YuaAppbmRleCAwMTMxODMxLi5hNDMzYjVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9ic3NfZi5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL2Jzc19mLmgKQEAgLTEsNTkgKzEsNjMgQEAKKyNpZm5kZWYgX19XSU5CT05EX0JTU19GX0gKKyNkZWZpbmUgX19XSU5CT05EX0JTU19GX0gKKworI2luY2x1ZGUgImNvcmUuaCIKKworc3RydWN0IFBNS0lEX0luZm9ybWF0aW9uX0VsZW1lbnQ7CisKIC8vCiAvLyBCU1MgZGVzY3JpcHRvciBEYXRhQmFzZSBtYW5hZ2VtZW50IGdsb2JhbCBmdW5jdGlvbgogLy8KIAotdm9pZCB2QlNTZGVzY3JpcHRpb25Jbml0KFBXQjMyX0FEQVBURVIgQWRhcHRlcik7Ci12b2lkIHZCU1Nmb3VuZExpc3QoUFdCMzJfQURBUFRFUiBBZGFwdGVyKTsKLXU4IGJvQ2hhbkZpbHRlcihQV0IzMl9BREFQVEVSIEFkYXB0ZXIsIHU4IENoYW5Obyk7Ci11MTYgd0JTU2FsbG9jYXRlRW50cnkoUFdCMzJfQURBUFRFUiBBZGFwdGVyKTsKLXUxNiB3QlNTR2V0RW50cnkoUFdCMzJfQURBUFRFUiBBZGFwdGVyKTsKLXZvaWQgdlNpbXBsZUhvdXNlS2VlcGluZyhQV0IzMl9BREFQVEVSIEFkYXB0ZXIpOwotdTE2IHdCU1Nob3VzZUtlZXBpbmcoUFdCMzJfQURBUFRFUiBBZGFwdGVyKTsKLXZvaWQgQ2xlYXJCU1NkZXNjcHQoUFdCMzJfQURBUFRFUiBBZGFwdGVyLCB1MTYgaSk7Ci11MTYgd0JTU2ZpbmRCc3NJRChQV0IzMl9BREFQVEVSIEFkYXB0ZXIsIHU4ICpwYkJzc2lkKTsKLXUxNiB3QlNTZmluZERlZGljYXRlQ2FuZGlkYXRlKFBXQjMyX0FEQVBURVIgQWRhcHRlciwgc3RydWN0IFNTSURfRWxlbWVudCAqcHNTc2lkLCB1OCAqcGJCc3NpZCk7Ci11MTYgd0JTU2ZpbmRNQUNhZGRyKFBXQjMyX0FEQVBURVIgQWRhcHRlciwgdTggKnBiTWFjQWRkcik7Ci11MTYgd0JTU3NlYXJjaE1BQ2FkZHIoUFdCMzJfQURBUFRFUiBBZGFwdGVyLCB1OCAqcGJNYWNBZGRyLCB1OCBiYW5kKTsKLXUxNiB3QlNTYWRkU2NhbkRhdGEoUFdCMzJfQURBUFRFUiwgdTE2LCBwc1JYREFUQSk7Ci11MTYgd0JTU1VwZGF0ZVNjYW5EYXRhKFBXQjMyX0FEQVBURVIgQWRhcHRlciwgdTE2IHdCc3NJZHgsIHBzUlhEQVRBIHBzUmN2RGF0YSk7Ci11MTYgd0JTU2NyZWF0ZUlCU1NkYXRhKFBXQjMyX0FEQVBURVIgQWRhcHRlciwgUFdCX0JTU0RFU0NSSVBUSU9OIHBzRGVzRGF0YSk7Ci12b2lkIERlc2lyZWRSYXRlMkJTU2Rlc2NyaXB0b3IoUFdCMzJfQURBUFRFUiBBZGFwdGVyLCBQV0JfQlNTREVTQ1JJUFRJT04gcHNEZXNEYXRhLAordm9pZCB2QlNTZGVzY3JpcHRpb25Jbml0KHN0cnVjdCB3YnNvZnRfcHJpdiAqIGFkYXB0ZXIpOwordm9pZCB2QlNTZm91bmRMaXN0KHN0cnVjdCB3YnNvZnRfcHJpdiAqIGFkYXB0ZXIpOwordTggYm9DaGFuRmlsdGVyKHN0cnVjdCB3YnNvZnRfcHJpdiAqIGFkYXB0ZXIsIHU4IENoYW5Obyk7Cit1MTYgd0JTU2FsbG9jYXRlRW50cnkoc3RydWN0IHdic29mdF9wcml2ICogYWRhcHRlcik7Cit1MTYgd0JTU0dldEVudHJ5KHN0cnVjdCB3YnNvZnRfcHJpdiAqIGFkYXB0ZXIpOwordm9pZCB2U2ltcGxlSG91c2VLZWVwaW5nKHN0cnVjdCB3YnNvZnRfcHJpdiAqIGFkYXB0ZXIpOwordTE2IHdCU1Nob3VzZUtlZXBpbmcoc3RydWN0IHdic29mdF9wcml2ICogYWRhcHRlcik7Cit2b2lkIENsZWFyQlNTZGVzY3B0KHN0cnVjdCB3YnNvZnRfcHJpdiAqIGFkYXB0ZXIsIHUxNiBpKTsKK3UxNiB3QlNTZmluZEJzc0lEKHN0cnVjdCB3YnNvZnRfcHJpdiAqIGFkYXB0ZXIsIHU4ICpwYkJzc2lkKTsKK3UxNiB3QlNTZmluZERlZGljYXRlQ2FuZGlkYXRlKHN0cnVjdCB3YnNvZnRfcHJpdiAqIGFkYXB0ZXIsIHN0cnVjdCBTU0lEX0VsZW1lbnQgKnBzU3NpZCwgdTggKnBiQnNzaWQpOwordTE2IHdCU1NmaW5kTUFDYWRkcihzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKiBhZGFwdGVyLCB1OCAqcGJNYWNBZGRyKTsKK3UxNiB3QlNTc2VhcmNoTUFDYWRkcihzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKiBhZGFwdGVyLCB1OCAqcGJNYWNBZGRyLCB1OCBiYW5kKTsKK3UxNiB3QlNTYWRkU2NhbkRhdGEoc3RydWN0IHdic29mdF9wcml2ICosIHUxNiwgcHNSWERBVEEpOwordTE2IHdCU1NVcGRhdGVTY2FuRGF0YShzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKiBhZGFwdGVyLCB1MTYgd0Jzc0lkeCwgcHNSWERBVEEgcHNSY3ZEYXRhKTsKK3UxNiB3QlNTY3JlYXRlSUJTU2RhdGEoc3RydWN0IHdic29mdF9wcml2ICogYWRhcHRlciwgUFdCX0JTU0RFU0NSSVBUSU9OIHBzRGVzRGF0YSk7Cit2b2lkIERlc2lyZWRSYXRlMkJTU2Rlc2NyaXB0b3Ioc3RydWN0IHdic29mdF9wcml2ICogYWRhcHRlciwgUFdCX0JTU0RFU0NSSVBUSU9OIHBzRGVzRGF0YSwKIAkJCQkJCQkgdTggKnBCYXNpY1JhdGVTZXQsIHU4IEJhc2ljUmF0ZUNvdW50LAogCQkJCQkJCSB1OCAqcE9wZXJhdGlvblJhdGVTZXQsIHU4IE9wZXJhdGlvblJhdGVDb3VudCk7Ci12b2lkIERlc2lyZWRSYXRlMkluZm9FbGVtZW50KFBXQjMyX0FEQVBURVIgQWRhcHRlciwgdTgJKmFkZHIsIHUxNiAqaUZpbGRPZmZzZXQsCit2b2lkIERlc2lyZWRSYXRlMkluZm9FbGVtZW50KHN0cnVjdCB3YnNvZnRfcHJpdiAqIGFkYXB0ZXIsIHU4CSphZGRyLCB1MTYgKmlGaWxkT2Zmc2V0LAogCQkJCQkJCSB1OCAqcEJhc2ljUmF0ZVNldCwgdTggQmFzaWNSYXRlQ291bnQsCiAJCQkJCQkJIHU4ICpwT3BlcmF0aW9uUmF0ZVNldCwgdTggT3BlcmF0aW9uUmF0ZUNvdW50KTsKLXZvaWQgQlNTQWRkSUJTU2RhdGEoUFdCMzJfQURBUFRFUiBBZGFwdGVyLCBQV0JfQlNTREVTQ1JJUFRJT04gcHNEZXNEYXRhKTsKK3ZvaWQgQlNTQWRkSUJTU2RhdGEoc3RydWN0IHdic29mdF9wcml2ICogYWRhcHRlciwgUFdCX0JTU0RFU0NSSVBUSU9OIHBzRGVzRGF0YSk7CiB1bnNpZ25lZCBjaGFyIGJvQ21wTWFjQWRkciggdTggKiwgdTggKik7CiB1bnNpZ25lZCBjaGFyIGJvQ21wU1NJRChzdHJ1Y3QgU1NJRF9FbGVtZW50ICpwc1NTSUQxLCBzdHJ1Y3QgU1NJRF9FbGVtZW50ICpwc1NTSUQyKTsKLXUxNiB3QlNTZmluZFNTSUQoUFdCMzJfQURBUFRFUiBBZGFwdGVyLCBzdHJ1Y3QgU1NJRF9FbGVtZW50ICpwc1NzaWQpOwotdTE2IHdSb2FtaW5nUXVlcnkoUFdCMzJfQURBUFRFUiBBZGFwdGVyKTsKLXZvaWQgdlJhdGVUb0JpdG1hcChQV0IzMl9BREFQVEVSIEFkYXB0ZXIsIHUxNiBpbmRleCk7Ci11OCBiUmF0ZVRvQml0bWFwSW5kZXgoUFdCMzJfQURBUFRFUiBBZGFwdGVyLCB1OCBiUmF0ZSk7Cit1MTYgd0JTU2ZpbmRTU0lEKHN0cnVjdCB3YnNvZnRfcHJpdiAqIGFkYXB0ZXIsIHN0cnVjdCBTU0lEX0VsZW1lbnQgKnBzU3NpZCk7Cit1MTYgd1JvYW1pbmdRdWVyeShzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKiBhZGFwdGVyKTsKK3ZvaWQgdlJhdGVUb0JpdG1hcChzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKiBhZGFwdGVyLCB1MTYgaW5kZXgpOwordTggYlJhdGVUb0JpdG1hcEluZGV4KHN0cnVjdCB3YnNvZnRfcHJpdiAqIGFkYXB0ZXIsIHU4IGJSYXRlKTsKIHU4IGJCaXRtYXBUb1JhdGUodTggaSk7Ci11bnNpZ25lZCBjaGFyIGJvSXNFUlBzdGEoUFdCMzJfQURBUFRFUiBBZGFwdGVyLCB1MTYgaSk7Ci11bnNpZ25lZCBjaGFyIGJvQ2hlY2tDb25uZWN0KFBXQjMyX0FEQVBURVIgQWRhcHRlcik7Ci11bnNpZ25lZCBjaGFyIGJvQ2hlY2tTaWduYWwoUFdCMzJfQURBUFRFUiBBZGFwdGVyKTsKLXZvaWQgQWRkSUJTU0llKFBXQjMyX0FEQVBURVIgQWRhcHRlcixQV0JfQlNTREVTQ1JJUFRJT04gcHNEZXNEYXRhICk7Ly9hZGRlZCBieSB3cyBmb3IgV1BBX05vbmUwNi8wMS8wNAotdm9pZCBCc3NTY2FuVXBUb0RhdGUoUFdCMzJfQURBUFRFUiBBZGFwdGVyKTsKLXZvaWQgQnNzVXBUb0RhdGUoUFdCMzJfQURBUFRFUiBBZGFwdGVyKTsKK3Vuc2lnbmVkIGNoYXIgYm9Jc0VSUHN0YShzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKiBhZGFwdGVyLCB1MTYgaSk7Cit1bnNpZ25lZCBjaGFyIGJvQ2hlY2tDb25uZWN0KHN0cnVjdCB3YnNvZnRfcHJpdiAqIGFkYXB0ZXIpOwordW5zaWduZWQgY2hhciBib0NoZWNrU2lnbmFsKHN0cnVjdCB3YnNvZnRfcHJpdiAqIGFkYXB0ZXIpOwordm9pZCBBZGRJQlNTSWUoc3RydWN0IHdic29mdF9wcml2ICogYWRhcHRlcixQV0JfQlNTREVTQ1JJUFRJT04gcHNEZXNEYXRhICk7Ly9hZGRlZCBieSB3cyBmb3IgV1BBX05vbmUwNi8wMS8wNAordm9pZCBCc3NTY2FuVXBUb0RhdGUoc3RydWN0IHdic29mdF9wcml2ICogYWRhcHRlcik7Cit2b2lkIEJzc1VwVG9EYXRlKHN0cnVjdCB3YnNvZnRfcHJpdiAqIGFkYXB0ZXIpOwogdm9pZCBSYXRlU29ydCh1OCAqUmF0ZUFycmF5LCB1OCBudW0sIHU4IG1vZGUpOwotdm9pZCBSYXRlUmVTb3J0Rm9yU1JhdGUoUFdCMzJfQURBUFRFUiBBZGFwdGVyLCB1OCAqUmF0ZUFycmF5LCB1OCBudW0pOwotdm9pZCBBc3NlbWJsZV9JRShQV0IzMl9BREFQVEVSIEFkYXB0ZXIsIHUxNiB3QnNzSWR4KTsKLXZvaWQgU2V0TWF4VHhSYXRlKFBXQjMyX0FEQVBURVIgQWRhcHRlcik7Cit2b2lkIFJhdGVSZVNvcnRGb3JTUmF0ZShzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKiBhZGFwdGVyLCB1OCAqUmF0ZUFycmF5LCB1OCBudW0pOwordm9pZCBBc3NlbWJsZV9JRShzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKiBhZGFwdGVyLCB1MTYgd0Jzc0lkeCk7Cit2b2lkIFNldE1heFR4UmF0ZShzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKiBhZGFwdGVyKTsKIAotdm9pZCBDcmVhdGVXcGFJRShQV0IzMl9BREFQVEVSIEFkYXB0ZXIsIHUxNiogaUZpbGRPZmZzZXQsIHU4ICptc2csIHN0cnVjdCAgTWFuYWdlbWVudF9GcmFtZSogbXNnSGVhZGVyLAordm9pZCBDcmVhdGVXcGFJRShzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKiBhZGFwdGVyLCB1MTYqIGlGaWxkT2Zmc2V0LCB1OCAqbXNnLCBzdHJ1Y3QgIE1hbmFnZW1lbnRfRnJhbWUqIG1zZ0hlYWRlciwKIAkJCQkgc3RydWN0IEFzc29jaWF0aW9uX1JlcXVlc3RfRnJhbWVfQm9keSogbXNnQm9keSwgdTE2IGlNU2luZGV4KTsgLy9hZGRlZCBieSBXUyAwNS8xNC8wNQogCiAjaWZkZWYgX1dQQTJfCi12b2lkIENyZWF0ZVJzbklFKFBXQjMyX0FEQVBURVIgQWRhcHRlciwgdTE2KiBpRmlsZE9mZnNldCwgdTggKm1zZywgc3RydWN0ICBNYW5hZ2VtZW50X0ZyYW1lKiBtc2dIZWFkZXIsCit2b2lkIENyZWF0ZVJzbklFKHN0cnVjdCB3YnNvZnRfcHJpdiAqIGFkYXB0ZXIsIHUxNiogaUZpbGRPZmZzZXQsIHU4ICptc2csIHN0cnVjdCAgTWFuYWdlbWVudF9GcmFtZSogbXNnSGVhZGVyLAogCQkJCSBzdHJ1Y3QgQXNzb2NpYXRpb25fUmVxdWVzdF9GcmFtZV9Cb2R5KiBtc2dCb2R5LCB1MTYgaU1TaW5kZXgpOy8vYWRkZWQgYnkgV1MgMDUvMTQvMDUKIAotdTE2IFNlYXJjaFBta2lkKFBXQjMyX0FEQVBURVIgQWRhcHRlciwgc3RydWN0ICBNYW5hZ2VtZW50X0ZyYW1lKiBtc2dIZWFkZXIsCit1MTYgU2VhcmNoUG1raWQoc3RydWN0IHdic29mdF9wcml2ICogYWRhcHRlciwgc3RydWN0ICBNYW5hZ2VtZW50X0ZyYW1lKiBtc2dIZWFkZXIsCiAJCQkJICAgc3RydWN0IFBNS0lEX0luZm9ybWF0aW9uX0VsZW1lbnQgKiBBc3NvUmVxX1BNS0lEICk7CiAjZW5kaWYKIAotCi0KLQotCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL2Jzc2RzY3B0LmggYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9ic3Nkc2NwdC5oCmluZGV4IDk3MTUwYTIuLjNhNzFkNGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL2Jzc2RzY3B0LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvYnNzZHNjcHQuaApAQCAtMSwzICsxLDExIEBACisjaWZuZGVmIF9fV0lOQk9ORF9CU1NEU0NQVF9ICisjZGVmaW5lIF9fV0lOQk9ORF9CU1NEU0NQVF9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjaW5jbHVkZSAibWRzX3MuaCIKKyNpbmNsdWRlICJtbG1lX3MuaCIKKwogLy8rKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKwogLy8JYnNzZHNjcHQuYwogLy8JCUJTUyBkZXNjcmlwdG9yIGRhdGEgYmFzZQpAQCAtNzgsOCArODYsOCBAQAogICAgIHUxNgkJd1N0YXRlOwkJCS8vIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBzeXN0ZW0KIAl1MTYJCXdJbmRleDsJCQkvLyBUSElTIEJTUyBlbGVtZW50IGVudHJ5IGluZGV4CiAKLQl2b2lkKglwc0FkYXB0ZXI7CQkvLyBwb2ludGVyIHRvIFRISVMgQWRhcHRlcgotCU9TX1RJTUVSCW5UaW1lcjsgIC8vIE1MTUUgdGltZXIKKwl2b2lkKglwc2FkYXB0ZXI7CQkvLyBwb2ludGVyIHRvIFRISVMgYWRhcHRlcgorCXN0cnVjdCB0aW1lcl9saXN0IHRpbWVyOyAgLy8gTUxNRSB0aW1lcgogCiAgICAgLy8gQXV0aGVudGljYXRpb24KICAgICB1MTYJCXdBdXRoQWxnbzsgICAgICAvLyBwZWVyIE1BQyBNTE1FIHVzZSBBdXRoIGFsZ29yaXRobSwgZGVmYXVsdCBPUEVOX0FVVEgKQEAgLTE0OCw5ICsxNTYsOSBAQAogCiB9IFdCX0JTU0RFU0NSSVBUSU9OLCAqUFdCX0JTU0RFU0NSSVBUSU9OOwogCi0jZGVmaW5lIHdCU1NDb25uZWN0ZWRTVEEoQWRhcHRlcikgICAgICAgICAgICAgXAotICAgICgodTE2KShBZGFwdGVyKS0+c0xvY2FsUGFyYS53Q29ubmVjdGVkU1RBaW5kZXgpCisjZGVmaW5lIHdCU1NDb25uZWN0ZWRTVEEoYWRhcHRlcikgICAgICAgICAgICAgXAorICAgICgodTE2KShhZGFwdGVyKS0+c0xvY2FsUGFyYS53Q29ubmVjdGVkU1RBaW5kZXgpCiAKLSNkZWZpbmUgcHNCU1MoaSkJCQkoJihBZGFwdGVyLT5hc0JTU0Rlc2NyaXB0RWxlbWVudFsoaSldKSkKKyNkZWZpbmUgcHNCU1MoaSkJCQkoJihhZGFwdGVyLT5hc0JTU0Rlc2NyaXB0RWxlbWVudFsoaSldKSkKIAotCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL2NvbW1vbi5oIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvY29tbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzRkOTYwNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL2NvbW1vbi5oCkBAIC0wLDAgKzEsMjcgQEAKKy8vCisvLyBjb21tb24uaAorLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyB0aGUgT1MgZGVwZW5kYW50IGRlZmluaXRpb24gYW5kIGZ1bmN0aW9uLgorLy8gRXZlcnkgT1MgaGFzIHRoaXMgZmlsZSBpbmRpdmlkdWFsLgorLy8KKworI2RlZmluZSBEZWJ1Z1VzYmRTdGF0dXNJbmZvcm1hdGlvbiggX0EgKQorCisjaWZuZGVmIENPTU1PTl9ERUYKKyNkZWZpbmUgQ09NTU9OX0RFRgorCisvLyNkZWZpbmUgREVCVUdfRU5BQkxFRCAgMQorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBDb21tb24gZnVuY3Rpb24gZGVmaW5pdGlvbgorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorI2RlZmluZSBERUJVR19FTkFCTEVECisjZGVmaW5lIEVUSF9MRU5HVEhfT0ZfQUREUkVTUwk2CisjaWZkZWYgREVCVUdfRU5BQkxFRAorI2RlZmluZSBXQkRFQlVHKCBfTSApCXByaW50ayBfTQorI2Vsc2UKKyNkZWZpbmUgV0JERUJVRyggX00gKQkwCisjZW5kaWYKKworI2VuZGlmIC8vIENPTU1PTl9ERUYKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvY29yZS5oIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvY29yZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlMTQyYTEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9jb3JlLmgKQEAgLTAsMCArMSw0MiBAQAorI2lmbmRlZiBfX1dJTkJPTkRfQ09SRV9ICisjZGVmaW5lIF9fV0lOQk9ORF9DT1JFX0gKKworI2luY2x1ZGUgPGxpbnV4L3dpcmVsZXNzLmg+CisKKyNpbmNsdWRlICJic3Nkc2NwdC5oIgorI2luY2x1ZGUgIm10by5oIgorI2luY2x1ZGUgIndiaGFsX3MuaCIKKworI2RlZmluZSBXQkxJTlVYX1BBQ0tFVF9BUlJBWV9TSVpFIChFVEhFUk5FVF9UWF9ERVNDUklQVE9SUyo0KQorCisjZGVmaW5lIFdCX01BWF9MSU5LX05BTUVfTEVOIDQwCisKK3N0cnVjdCB3YnNvZnRfcHJpdiB7CisJdTMyIGFkYXB0ZXJJbmRleDsJLy8gMjAwNjA3MDMuNCBBZGQgZm9yIHVzaW5nIHBhZGFwdGVyQ29udGV4dCBnbG9iYWwgYWRhcHRlciBwb2ludAorCisJV0JfTE9DQUxERVNDUklQVCBzTG9jYWxQYXJhOwkvLyBNeXNlbGYgY29ubmVjdGVkIHBhcmFtZXRlcnMKKwlQV0JfQlNTREVTQ1JJUFRJT04gYXNCU1NEZXNjcmlwdEVsZW1lbnQ7CisKKwlNTE1FX0ZSQU1FIHNNbG1lRnJhbWU7CS8vIGNvbm5lY3QgdG8gcGVlclNUQSBwYXJhbWV0ZXJzCisKKwlNVE9fUEFSQU1FVEVSUyBzTXRvUGFyYTsJLy8gTVRPX3N0cnVjdCAuLi4KKwlod19kYXRhX3Qgc0h3RGF0YTsJLy9Gb3IgSEFMCisJTURTIE1kczsKKworCXNwaW5sb2NrX3QgU3BpbkxvY2s7CisKKwlhdG9taWNfdCBUaHJlYWRDb3VudDsKKworCXUzMiBSeEJ5dGVDb3VudDsKKwl1MzIgVHhCeXRlQ291bnQ7CisKKwlzdHJ1Y3Qgc2tfYnVmZiAqcGFja2V0X3JldHVybjsKKwlzMzIgbmV0aWZfc3RhdGVfc3RvcDsJLy8gMTogc3RvcCAgMDogbm9ybWFsCisJc3RydWN0IGl3X3N0YXRpc3RpY3MgaXdfc3RhdHM7CisKKwl1OCBMaW5rTmFtZVtXQl9NQVhfTElOS19OQU1FX0xFTl07CisKKwlib29sIGVuYWJsZWQ7Cit9OworCisjZW5kaWYgLyogX19XSU5CT05EX0NPUkVfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvZHNfdGtpcC5oIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvZHNfdGtpcC5oCmluZGV4IDY4NDFkNjYuLjljNWM0ZTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL2RzX3RraXAuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9kc190a2lwLmgKQEAgLTEsMyArMSw4IEBACisjaWZuZGVmIF9fV0lOQk9ORF9EU19US0lQX0gKKyNkZWZpbmUgX19XSU5CT05EX0RTX1RLSVBfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKwogLy8gUm90YXRpb24gZnVuY3Rpb25zIG9uIDMyIGJpdCB2YWx1ZXMKICNkZWZpbmUgUk9MMzIoIEEsIG4gKSBcCiAgICAgKCAoKEEpIDw8IChuKSkgfCAoICgoQSk+PigzMi0obikpKSAgJiAoICgxVUwgPDwgKG4pKSAtIDEgKSApICkKQEAgLTI2LDggKzMxLDcgQEAKIH0gdGtpcF90OwogCiAvL3ZvaWQgX2FwcGVuZF9kYXRhKCB1OCAqcERhdGEsIHUxNiBzaXplLCB0a2lwX3QgKnAgKTsKLXZvaWQgTWRzX01pY0dldCggIHZvaWQqIEFkYXB0ZXIsICB2b2lkKiBwUnhMYXllcjEsICB1OCAqcEtleSwgIHU4ICpwTWljICk7Ci12b2lkIE1kc19NaWNGaWxsKCAgdm9pZCogQWRhcHRlciwgIHZvaWQqIHBEZXMsICB1OCAqWG1pdEJ1ZkFkZHJlc3MgKTsKK3ZvaWQgTWRzX01pY0dldCggIHZvaWQqIGFkYXB0ZXIsICB2b2lkKiBwUnhMYXllcjEsICB1OCAqcEtleSwgIHU4ICpwTWljICk7Cit2b2lkIE1kc19NaWNGaWxsKCAgdm9pZCogYWRhcHRlciwgIHZvaWQqIHBEZXMsICB1OCAqWG1pdEJ1ZkFkZHJlc3MgKTsKIAotCi0KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvZ2xfODAyMTEuaCBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL2dsXzgwMjExLmgKaW5kZXggMTgwNmQ4MS4uNWEyNDRjNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvZ2xfODAyMTEuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9nbF84MDIxMS5oCkBAIC0xLDcgKzEsOCBAQAotCiAjaWZuZGVmIF9fR0xfODAyMTFfSF9fCiAjZGVmaW5lIF9fR0xfODAyMTFfSF9fCiAKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCiAvKioqKioqKioqKioqKioqKioqIENPTlNUQU5UIEFORCBNQUNSTyBTRUNUSU9OICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyogQlNTIFR5cGUgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL2xpbnV4L2NvbW1vbi5oIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbGludXgvY29tbW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxMmE4NmMuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbGludXgvY29tbW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjggKzAsMCBAQAotLy8KLS8vIGNvbW1vbi5oCi0vLwotLy8gVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBPUyBkZXBlbmRhbnQgZGVmaW5pdGlvbiBhbmQgZnVuY3Rpb24uCi0vLyBFdmVyeSBPUyBoYXMgdGhpcyBmaWxlIGluZGl2aWR1YWwuCi0vLwotCi0jZGVmaW5lIERlYnVnVXNiZFN0YXR1c0luZm9ybWF0aW9uKCBfQSApCi0KLSNpZm5kZWYgQ09NTU9OX0RFRgotI2RlZmluZSBDT01NT05fREVGCi0KLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+Ci0jaW5jbHVkZSA8bGludXgvdXNiLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+IC8vbmVlZCBmb3Iga2VybmVsIGFsZXJ0Ci0jaW5jbHVkZSA8bGludXgvYXV0b2NvbmYuaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4gLy9tZW1vcnkgYWxsb2NhdGUKLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4vL25lZWQgZm9yIGluaXQgYW5kIGV4aXQgbW9kdWxlcyBtYXJjbwotI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+Ci0jaW5jbHVkZSA8bGludXgvd2FpdC5oPgotI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KLSNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgotI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgotI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+Ci0jaW5jbHVkZSA8bmV0L2l3X2hhbmRsZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KLQotCi0vLyNkZWZpbmUgREVCVUdfRU5BQkxFRCAgMQotCi0KLQotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIENvbW1vbiB0eXBlIGRlZmluaXRpb24KLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotI2RlZmluZSBJR05PUkUgICAgICAyCi0jZGVmaW5lCVNVQ0NFU1MgICAgIDEKLSNkZWZpbmUJRkFJTFVSRSAgICAgMAotCi0KLSNpZm5kZWYgdHJ1ZQotI2RlZmluZSB0cnVlICAgICAgICAxCi0jZW5kaWYKLQotI2lmbmRlZiBmYWxzZQotI2RlZmluZSBmYWxzZSAgICAgICAwCi0jZW5kaWYKLQotLy8gUEQ0MyAyMDAyMTEwOAotI2lmbmRlZiBUUlVFCi0jZGVmaW5lIFRSVUUgICAgICAgIDEKLSNlbmRpZgotCi0jaWZuZGVmIEZBTFNFCi0jZGVmaW5lIEZBTFNFICAgICAgIDAKLSNlbmRpZgotCi0jZGVmaW5lIFNUQVRVU19NRURJQV9DT05ORUNUIDEKLSNkZWZpbmUgU1RBVFVTX01FRElBX0RJU0NPTk5FQ1QgMAotCi0jaWZuZGVmIEJJVAotI2RlZmluZSBCSVQoeCkgICAgICAgICAgICAgICAgICAoMSA8PCAoeCkpCi0jZW5kaWYKLQotdHlwZWRlZiBzdHJ1Y3QgdXJiICogUFVSQjsKLQotCi0KLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIENvbW1vbiBmdW5jdGlvbiBkZWZpbml0aW9uCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jaWZuZGVmIGFicwotI2RlZmluZSBhYnMoX1QpCQkJCQkJCSgoX1QpIDwgMCA/IC1fVCA6IF9UKQotI2VuZGlmCi0jZGVmaW5lIERFQlVHX0VOQUJMRUQKLSNkZWZpbmUgRVRIX0xFTkdUSF9PRl9BRERSRVNTCTYKLSNpZmRlZiBERUJVR19FTkFCTEVECi0jZGVmaW5lIFdCREVCVUcoIF9NICkJcHJpbnRrIF9NCi0jZWxzZQotI2RlZmluZSBXQkRFQlVHKCBfTSApCTAKLSNlbmRpZgotCi0jZGVmaW5lIE9TX0RJU0NPTk5FQ1RFRAkwCi0jZGVmaW5lIE9TX0NPTk5FQ1RFRAkxCi0KLQotI2RlZmluZSBPU19FVkVOVF9JTkRJQ0FURSggX0EsIF9CLCBfRiApCi0jZGVmaW5lIE9TX1BNS0lEX1NUQVRVU19FVkVOVCggX0EgKQotCi0KLS8qIFVmZiwgbm8sIGxvbmdzIGFyZSBub3QgYXRvbWljIG9uIGFsbCBhcmNoaXRlY3R1cmVzIExpbnV4Ci0gKiBzdXBwb3J0cy4gVGhpcyBzaG91bGQgcmVhbGx5IHVzZSBhdG9taWNfdCAqLwotCi0jZGVmaW5lIE9TX0FUT01JQwkJCXUzMgotI2RlZmluZSBPU19BVE9NSUNfUkVBRCggX0EsIF9WICkJX1YKLSNkZWZpbmUgT1NfQVRPTUlDX0lOQyggX0EsIF9WICkJCUVuY2FwQXRvbWljSW5jKCBfQSwgKHZvaWQqKV9WICkKLSNkZWZpbmUgT1NfQVRPTUlDX0RFQyggX0EsIF9WICkJCUVuY2FwQXRvbWljRGVjKCBfQSwgKHZvaWQqKV9WICkKLSNkZWZpbmUgT1NfTUVNT1JZX0NMRUFSKCBfQSwgX1MgKQltZW1zZXQoICh1OCAqKV9BLDAsX1MpCi0jZGVmaW5lIE9TX01FTU9SWV9DT01QQVJFKCBfQSwgX0IsIF9TICkJKG1lbWNtcChfQSxfQixfUyk/IDAgOiAxKSAvLyBEZWZpbml0aW9uIGlzIHJldmVyc2Ugd2l0aCBOZGlzIDE6IHRoZSBzYW1lIDA6IGRpZmZlcmVudAotCi0jZGVmaW5lIE9TX1RJTUVSCXN0cnVjdCB0aW1lcl9saXN0Ci0jZGVmaW5lIE9TX1RJTUVSX0lOSVRJQUwoIF9ULCBfRiwgX1AgKQkJCVwKLXsJCQkJCQkJXAotCWluaXRfdGltZXIoIF9UICk7CQkJCVwKLQkoX1QpLT5mdW5jdGlvbiA9ICh2b2lkICopX0YjI18xYTsJCVwKLQkoX1QpLT5kYXRhID0gKHVuc2lnbmVkIGxvbmcpX1A7CQkJXAotfQotCi0vLyBfUyA6IE1pbGxpc2Vjb25kCi0vLyAyMDA2MDQyMCBBdCBsZWFzdCAxIGxhcmdlIHRoYW4gamlmZmllcwotI2RlZmluZSBPU19USU1FUl9TRVQoIF9ULCBfUyApCQkJCQlcCi17CQkJCQkJCQlcCi0JKF9UKS0+ZXhwaXJlcyA9IGppZmZpZXMgKyAoKF9TKkhaKzk5OSkvMTAwMCk7XAotCWFkZF90aW1lciggX1QgKTsJCQkJCVwKLX0KLSNkZWZpbmUgT1NfVElNRVJfQ0FOQ0VMKCBfVCwgX0IgKQkJZGVsX3RpbWVyX3N5bmMoIF9UICkKLSNkZWZpbmUgT1NfVElNRVJfR0VUX1NZU19USU1FKCBfVCApCQkoKl9UPWppZmZpZXMpCi0KLQotI2VuZGlmIC8vIENPTU1PTl9ERUYKLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbGludXgvc3lzZGVmLmggYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9saW51eC9zeXNkZWYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ2ZDYzZS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9saW51eC9zeXNkZWYuaAorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLQotCi0vLwotLy8gV2luYm9uZCBXTEFOIFN5c3RlbSBDb25maWd1cmF0aW9uIGRlZmluZXMKLS8vCi0KLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBDdXJyZW50IGRpcmVjdG9yeSBpcyBMaW51eAotLy8gVGhlIGRlZmluaXRpb24gV0JfTElOVVggaXMgYSBrZXl3b3JkIGZvciB0aGlzIE9TCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotI2lmbmRlZiBTWVNfREVGX0gKLSNkZWZpbmUgU1lTX0RFRl9ICi0jZGVmaW5lIFdCX0xJTlVYCi0jZGVmaW5lIFdCX0xJTlVYX1dQQV9QU0sKLQotCi0vLyNkZWZpbmUgX0lCU1NfQkVBQ09OX1NFUV9TVElDS18KLSNkZWZpbmUgX1VTRV9GQUxMQkFDS19SQVRFXwotLy8jZGVmaW5lIEFOVERJVl9ERUZBVUxUX09OCi0KLSNkZWZpbmUgX1dQQTJfCS8vIDIwMDYxMTIyIEl0J3MgbmVlZGVkIGZvciBjdXJyZW50IExpbnV4IGRyaXZlcgotCi0KLSNpZm5kZWYgX1dQQV9QU0tfREVCVUcKLSN1bmRlZiAgX1dQQV9QU0tfREVCVUcKLSNlbmRpZgotCi0vLyBkZWJ1ZyBwcmludCBvcHRpb25zLCBtYXJrIHdoYXQgZGVidWcgeW91IGRvbid0IG5lZWQKLQotI2lmZGVmIEZVTExfREVCVUcKLSNkZWZpbmUgX1BFX1NUQVRFX0RVTVBfCi0jZGVmaW5lIF9QRV9UWF9EVU1QXwotI2RlZmluZSBfUEVfUlhfRFVNUF8KLSNkZWZpbmUgX1BFX09JRF9EVU1QXwotI2RlZmluZSBfUEVfRFRPX0RVTVBfCi0jZGVmaW5lIF9QRV9SRUdfRFVNUF8KLSNkZWZpbmUgX1BFX1VTQl9JTklfRFVNUF8KLSNlbmRpZgotCi0KLQotI2luY2x1ZGUgImNvbW1vbi5oIgkvLyBJbmRpdmlkdWFsIGZpbGUgZGVwZW5kcyBvbiBPUwotCi0jaW5jbHVkZSAiLi4vd2IzNV92ZXIuaCIKLSNpbmNsdWRlICIuLi9tYWNfc3RydWN0dXJlcy5oIgotI2luY2x1ZGUgIi4uL2RzX3RraXAuaCIKLSNpbmNsdWRlICIuLi9sb2NhbHBhcmEuaCIKLSNpbmNsdWRlICIuLi9zbWVfcy5oIgotI2luY2x1ZGUgIi4uL3NjYW5fcy5oIgotI2luY2x1ZGUgIi4uL21kc19zLmgiCi0jaW5jbHVkZSAiLi4vbWxtZV9zLmgiCi0jaW5jbHVkZSAiLi4vYnNzZHNjcHQuaCIKLSNpbmNsdWRlICIuLi9zbWVfYXBpLmgiCi0jaW5jbHVkZSAiLi4vZ2xfODAyMTEuaCIKLSNpbmNsdWRlICIuLi9tdG8uaCIKLSNpbmNsdWRlICIuLi93YmxpbnV4X3MuaCIKLSNpbmNsdWRlICIuLi93YmhhbF9zLmgiCi0KLQotI2luY2x1ZGUgIi4uL2FkYXB0ZXIuaCIKLQotI2luY2x1ZGUgIi4uL21sbWVfbWliLmgiCi0jaW5jbHVkZSAiLi4vbWRzX2YuaCIKLSNpbmNsdWRlICIuLi9ic3NfZi5oIgotI2luY2x1ZGUgIi4uL21sbWV0eHJ4X2YuaCIKLSNpbmNsdWRlICIuLi9tdG9fZi5oIgotI2luY2x1ZGUgIi4uL3diaGFsX2YuaCIKLSNpbmNsdWRlICIuLi93YmxpbnV4X2YuaCIKLS8vIEtlcm5lbCBUaW1lciByZXNvbHV0aW9uLCBORElTIGlzIDEwbXMsIDEwMDAwdXMKLSNkZWZpbmUgTUlOX1RJTUVPVVRfVkFMCSgxMCkgLy9tcwotCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbGludXgvd2IzNXJlZy5jIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbGludXgvd2IzNXJlZy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYmI2ZGI1Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL2xpbnV4L3diMzVyZWcuYworKysgL2Rldi9udWxsCkBAIC0xLDc0NCArMCwwIEBACi0jaW5jbHVkZSAic3lzZGVmLmgiCi0KLWV4dGVybiB2b2lkIHBoeV9jYWxpYnJhdGlvbl93aW5ib25kKGh3X2RhdGFfdCAqcGh3X2RhdGEsIHUzMiBmcmVxdWVuY3kpOwotCi0vLyBUUlVFICA6IHJlYWQgY29tbWFuZCBwcm9jZXNzIHN1Y2Nlc3NmdWxseQotLy8gRkFMU0UgOiByZWdpc3RlciBub3Qgc3VwcG9ydAotLy8gUmVnaXN0ZXJObyA6IHN0YXJ0IGJhc2UKLS8vIHBSZWdpc3RlckRhdGEgOiBkYXRhIHBvaW50Ci0vLyBOdW1iZXJPZkRhdGEgOiBudW1iZXIgb2YgcmVnaXN0ZXIgZGF0YQotLy8gRmxhZyA6IEFVVE9fSU5DUkVNRU5UIC0gUmVnaXN0ZXJObyB3aWxsIGF1dG8gaW5jcmVtZW50IDQKLS8vCQkgIE5PX0lOQ1JFTUVOVCAtIEZ1bmN0aW9uIHdpbGwgd3JpdGUgZGF0YSBpbnRvIHRoZSBzYW1lIHJlZ2lzdGVyCi11bnNpZ25lZCBjaGFyCi1XYjM1UmVnX0J1cnN0V3JpdGUocGh3X2RhdGFfdCBwSHdEYXRhLCB1MTYgUmVnaXN0ZXJObywgdTMyICogcFJlZ2lzdGVyRGF0YSwgdTggTnVtYmVyT2ZEYXRhLCB1OCBGbGFnKQotewotCVBXQjM1UkVHIHBXYjM1UmVnID0gJnBId0RhdGEtPldiMzVSZWc7Ci0JUFVSQgkJcFVyYiA9IE5VTEw7Ci0JUFJFR19RVUVVRQlwUmVnUXVldWUgPSBOVUxMOwotCXUxNgkJVXJiU2l6ZTsKLQlzdHJ1Y3QgICAgICB1c2JfY3RybHJlcXVlc3QgKmRyOwotCXUxNgkJaSwgRGF0YVNpemUgPSBOdW1iZXJPZkRhdGEqNDsKLQotCS8vIE1vZHVsZSBzaHV0ZG93bgotCWlmIChwSHdEYXRhLT5TdXJwcmlzZVJlbW92ZSkKLQkJcmV0dXJuIEZBTFNFOwotCi0JLy8gVHJ5aW5nIHRvIHVzZSBidXJzdCB3cml0ZSBmdW5jdGlvbiBpZiB1c2UgbmV3IGhhcmR3YXJlCi0JVXJiU2l6ZSA9IHNpemVvZihSRUdfUVVFVUUpICsgRGF0YVNpemUgKyBzaXplb2Yoc3RydWN0IHVzYl9jdHJscmVxdWVzdCk7Ci0JT1NfTUVNT1JZX0FMTE9DKCAodm9pZCogKikmcFJlZ1F1ZXVlLCBVcmJTaXplICk7Ci0JcFVyYiA9IHdiX3VzYl9hbGxvY191cmIoMCk7Ci0JaWYoIHBVcmIgJiYgcFJlZ1F1ZXVlICkgewotCQlwUmVnUXVldWUtPkRJUkVDVCA9IDI7Ly8gYnVyc3Qgd3JpdGUgcmVnaXN0ZXIKLQkJcFJlZ1F1ZXVlLT5JTkRFWCA9IFJlZ2lzdGVyTm87Ci0JCXBSZWdRdWV1ZS0+cEJ1ZmZlciA9ICh1MzIgKikoKHU4ICopcFJlZ1F1ZXVlICsgc2l6ZW9mKFJFR19RVUVVRSkpOwotCQltZW1jcHkoIHBSZWdRdWV1ZS0+cEJ1ZmZlciwgcFJlZ2lzdGVyRGF0YSwgRGF0YVNpemUgKTsKLQkJLy90aGUgZnVuY3Rpb24gZm9yIHJldmVyc2luZyByZWdpc3RlciBkYXRhIGZyb20gbGl0dGxlIGVuZGlhbiB0byBiaWcgZW5kaWFuCi0JCWZvciggaT0wOyBpPE51bWJlck9mRGF0YSA7IGkrKyApCi0JCQlwUmVnUXVldWUtPnBCdWZmZXJbaV0gPSBjcHVfdG9fbGUzMiggcFJlZ1F1ZXVlLT5wQnVmZmVyW2ldICk7Ci0KLQkJZHIgPSAoc3RydWN0IHVzYl9jdHJscmVxdWVzdCAqKSgodTggKilwUmVnUXVldWUgKyBzaXplb2YoUkVHX1FVRVVFKSArIERhdGFTaXplKTsKLQkJZHItPmJSZXF1ZXN0VHlwZSA9IFVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9ESVJfT1VUIHwgVVNCX1JFQ0lQX0RFVklDRTsKLQkJZHItPmJSZXF1ZXN0ID0gMHgwNDsgLy8gVVNCIG9yIHZlbmRvci1kZWZpbmVkIHJlcXVlc3QgY29kZSwgYnVyc3QgbW9kZQotCQlkci0+d1ZhbHVlID0gY3B1X3RvX2xlMTYoIEZsYWcgKTsgLy8gMDogUmVnaXN0ZXIgbnVtYmVyIGF1dG8taW5jcmVtZW50LCAxOiBObyBhdXRvIGluY3JlbWVudAotCQlkci0+d0luZGV4ID0gY3B1X3RvX2xlMTYoIFJlZ2lzdGVyTm8gKTsKLQkJZHItPndMZW5ndGggPSBjcHVfdG9fbGUxNiggRGF0YVNpemUgKTsKLQkJcFJlZ1F1ZXVlLT5OZXh0ID0gTlVMTDsKLQkJcFJlZ1F1ZXVlLT5wVXNiUmVxID0gZHI7Ci0JCXBSZWdRdWV1ZS0+cFVyYiA9IHBVcmI7Ci0KLQkJc3Bpbl9sb2NrX2lycSggJnBXYjM1UmVnLT5FUDBWTV9zcGluX2xvY2sgKTsKLQkJaWYgKHBXYjM1UmVnLT5wUmVnRmlyc3QgPT0gTlVMTCkKLQkJCXBXYjM1UmVnLT5wUmVnRmlyc3QgPSBwUmVnUXVldWU7Ci0JCWVsc2UKLQkJCXBXYjM1UmVnLT5wUmVnTGFzdC0+TmV4dCA9IHBSZWdRdWV1ZTsKLQkJcFdiMzVSZWctPnBSZWdMYXN0ID0gcFJlZ1F1ZXVlOwotCi0JCXNwaW5fdW5sb2NrX2lycSggJnBXYjM1UmVnLT5FUDBWTV9zcGluX2xvY2sgKTsKLQotCQkvLyBTdGFydCBFUDBWTQotCQlXYjM1UmVnX0VQMFZNX3N0YXJ0KHBId0RhdGEpOwotCi0JCXJldHVybiBUUlVFOwotCX0gZWxzZSB7Ci0JCWlmIChwVXJiKQotCQkJdXNiX2ZyZWVfdXJiKHBVcmIpOwotCQlpZiAocFJlZ1F1ZXVlKQotCQkJa2ZyZWUocFJlZ1F1ZXVlKTsKLQkJcmV0dXJuIEZBTFNFOwotCX0KLSAgIHJldHVybiBGQUxTRTsKLX0KLQotdm9pZAotV2IzNVJlZ19VcGRhdGUocGh3X2RhdGFfdCBwSHdEYXRhLCAgdTE2IFJlZ2lzdGVyTm8sICB1MzIgUmVnaXN0ZXJWYWx1ZSkKLXsKLQlQV0IzNVJFRwlwV2IzNVJlZyA9ICZwSHdEYXRhLT5XYjM1UmVnOwotCXN3aXRjaCAoUmVnaXN0ZXJObykgewotCWNhc2UgMHgzYjA6IHBXYjM1UmVnLT5VMUIwID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7Ci0JY2FzZSAweDNiYzogcFdiMzVSZWctPlUxQkNfTEVEQ29uZmlndXJlID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7Ci0JY2FzZSAweDQwMDogcFdiMzVSZWctPkQwMF9EbWFDb250cm9sID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7Ci0JY2FzZSAweDgwMDogcFdiMzVSZWctPk0wMF9NYWNDb250cm9sID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7Ci0JY2FzZSAweDgwNDogcFdiMzVSZWctPk0wNF9NdWx0aWNhc3RBZGRyZXNzMSA9IFJlZ2lzdGVyVmFsdWU7IGJyZWFrOwotCWNhc2UgMHg4MDg6IHBXYjM1UmVnLT5NMDhfTXVsdGljYXN0QWRkcmVzczIgPSBSZWdpc3RlclZhbHVlOyBicmVhazsKLQljYXNlIDB4ODI0OiBwV2IzNVJlZy0+TTI0X01hY0NvbnRyb2wgPSBSZWdpc3RlclZhbHVlOyBicmVhazsKLQljYXNlIDB4ODI4OiBwV2IzNVJlZy0+TTI4X01hY0NvbnRyb2wgPSBSZWdpc3RlclZhbHVlOyBicmVhazsKLQljYXNlIDB4ODJjOiBwV2IzNVJlZy0+TTJDX01hY0NvbnRyb2wgPSBSZWdpc3RlclZhbHVlOyBicmVhazsKLQljYXNlIDB4ODM4OiBwV2IzNVJlZy0+TTM4X01hY0NvbnRyb2wgPSBSZWdpc3RlclZhbHVlOyBicmVhazsKLQljYXNlIDB4ODQwOiBwV2IzNVJlZy0+TTQwX01hY0NvbnRyb2wgPSBSZWdpc3RlclZhbHVlOyBicmVhazsKLQljYXNlIDB4ODQ0OiBwV2IzNVJlZy0+TTQ0X01hY0NvbnRyb2wgPSBSZWdpc3RlclZhbHVlOyBicmVhazsKLQljYXNlIDB4ODQ4OiBwV2IzNVJlZy0+TTQ4X01hY0NvbnRyb2wgPSBSZWdpc3RlclZhbHVlOyBicmVhazsKLQljYXNlIDB4ODRjOiBwV2IzNVJlZy0+TTRDX01hY1N0YXR1cyA9IFJlZ2lzdGVyVmFsdWU7IGJyZWFrOwotCWNhc2UgMHg4NjA6IHBXYjM1UmVnLT5NNjBfTWFjQ29udHJvbCA9IFJlZ2lzdGVyVmFsdWU7IGJyZWFrOwotCWNhc2UgMHg4Njg6IHBXYjM1UmVnLT5NNjhfTWFjQ29udHJvbCA9IFJlZ2lzdGVyVmFsdWU7IGJyZWFrOwotCWNhc2UgMHg4NzA6IHBXYjM1UmVnLT5NNzBfTWFjQ29udHJvbCA9IFJlZ2lzdGVyVmFsdWU7IGJyZWFrOwotCWNhc2UgMHg4NzQ6IHBXYjM1UmVnLT5NNzRfTWFjQ29udHJvbCA9IFJlZ2lzdGVyVmFsdWU7IGJyZWFrOwotCWNhc2UgMHg4Nzg6IHBXYjM1UmVnLT5NNzhfRVJQSW5mb3JtYXRpb24gPSBSZWdpc3RlclZhbHVlOyBicmVhazsKLQljYXNlIDB4ODdDOiBwV2IzNVJlZy0+TTdDX01hY0NvbnRyb2wgPSBSZWdpc3RlclZhbHVlOyBicmVhazsKLQljYXNlIDB4ODgwOiBwV2IzNVJlZy0+TTgwX01hY0NvbnRyb2wgPSBSZWdpc3RlclZhbHVlOyBicmVhazsKLQljYXNlIDB4ODg0OiBwV2IzNVJlZy0+TTg0X01hY0NvbnRyb2wgPSBSZWdpc3RlclZhbHVlOyBicmVhazsKLQljYXNlIDB4ODg4OiBwV2IzNVJlZy0+TTg4X01hY0NvbnRyb2wgPSBSZWdpc3RlclZhbHVlOyBicmVhazsKLQljYXNlIDB4ODk4OiBwV2IzNVJlZy0+TTk4X01hY0NvbnRyb2wgPSBSZWdpc3RlclZhbHVlOyBicmVhazsKLQljYXNlIDB4MTAwYzogcFdiMzVSZWctPkJCMEMgPSBSZWdpc3RlclZhbHVlOyBicmVhazsKLQljYXNlIDB4MTAyYzogcFdiMzVSZWctPkJCMkMgPSBSZWdpc3RlclZhbHVlOyBicmVhazsKLQljYXNlIDB4MTAzMDogcFdiMzVSZWctPkJCMzAgPSBSZWdpc3RlclZhbHVlOyBicmVhazsKLQljYXNlIDB4MTAzYzogcFdiMzVSZWctPkJCM0MgPSBSZWdpc3RlclZhbHVlOyBicmVhazsKLQljYXNlIDB4MTA0ODogcFdiMzVSZWctPkJCNDggPSBSZWdpc3RlclZhbHVlOyBicmVhazsKLQljYXNlIDB4MTA0YzogcFdiMzVSZWctPkJCNEMgPSBSZWdpc3RlclZhbHVlOyBicmVhazsKLQljYXNlIDB4MTA1MDogcFdiMzVSZWctPkJCNTAgPSBSZWdpc3RlclZhbHVlOyBicmVhazsKLQljYXNlIDB4MTA1NDogcFdiMzVSZWctPkJCNTQgPSBSZWdpc3RlclZhbHVlOyBicmVhazsKLQljYXNlIDB4MTA1ODogcFdiMzVSZWctPkJCNTggPSBSZWdpc3RlclZhbHVlOyBicmVhazsKLQljYXNlIDB4MTA1YzogcFdiMzVSZWctPkJCNUMgPSBSZWdpc3RlclZhbHVlOyBicmVhazsKLQljYXNlIDB4MTA2MDogcFdiMzVSZWctPkJCNjAgPSBSZWdpc3RlclZhbHVlOyBicmVhazsKLQl9Ci19Ci0KLS8vIFRSVUUgIDogcmVhZCBjb21tYW5kIHByb2Nlc3Mgc3VjY2Vzc2Z1bGx5Ci0vLyBGQUxTRSA6IHJlZ2lzdGVyIG5vdCBzdXBwb3J0Ci11bnNpZ25lZCBjaGFyCi1XYjM1UmVnX1dyaXRlU3luYyggIHBod19kYXRhX3QgcEh3RGF0YSwgIHUxNiBSZWdpc3Rlck5vLCAgdTMyIFJlZ2lzdGVyVmFsdWUgKQotewotCVBXQjM1UkVHIHBXYjM1UmVnID0gJnBId0RhdGEtPldiMzVSZWc7Ci0JaW50IHJldCA9IC0xOwotCi0JLy8gTW9kdWxlIHNodXRkb3duCi0JaWYgKHBId0RhdGEtPlN1cnByaXNlUmVtb3ZlKQotCQlyZXR1cm4gRkFMU0U7Ci0KLQlSZWdpc3RlclZhbHVlID0gY3B1X3RvX2xlMzIoUmVnaXN0ZXJWYWx1ZSk7Ci0KLQkvLyB1cGRhdGUgdGhlIHJlZ2lzdGVyIGJ5IHNlbmQgdXNiIG1lc3NhZ2UtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQlwV2IzNVJlZy0+U3luY0lvUGF1c2UgPSAxOwotCi0JLy8gMjAwNjA3MTcuNSBXYWl0IHVudGlsIEVQMFZNIHN0b3AKLQl3aGlsZSAocFdiMzVSZWctPkVQMHZtX3N0YXRlICE9IFZNX1NUT1ApCi0JCU9TX1NMRUVQKDEwMDAwKTsKLQotCS8vIFN5bmMgSW9DYWxsRHJpdmVyCi0JcFdiMzVSZWctPkVQMHZtX3N0YXRlID0gVk1fUlVOTklORzsKLQlyZXQgPSB1c2JfY29udHJvbF9tc2coIHBId0RhdGEtPldiVXNiLnVkZXYsCi0JCQkgICAgICAgdXNiX3NuZGN0cmxwaXBlKCBwSHdEYXRhLT5XYlVzYi51ZGV2LCAwICksCi0JCQkgICAgICAgMHgwMywgVVNCX1RZUEVfVkVORE9SIHwgVVNCX1JFQ0lQX0RFVklDRSB8IFVTQl9ESVJfT1VULAotCQkJICAgICAgIDB4MCxSZWdpc3Rlck5vLCAmUmVnaXN0ZXJWYWx1ZSwgNCwgSFoqMTAwICk7Ci0JcFdiMzVSZWctPkVQMHZtX3N0YXRlID0gVk1fU1RPUDsKLQlwV2IzNVJlZy0+U3luY0lvUGF1c2UgPSAwOwotCi0JV2IzNVJlZ19FUDBWTV9zdGFydChwSHdEYXRhKTsKLQotCWlmIChyZXQgPCAwKSB7Ci0JCSNpZmRlZiBfUEVfUkVHX0RVTVBfCi0JCVdCREVCVUcoKCJFUDAgV3JpdGUgcmVnaXN0ZXIgdXNiIG1lc3NhZ2Ugc2VuZGluZyBlcnJvclxuIikpOwotCQkjZW5kaWYKLQotCQlwSHdEYXRhLT5TdXJwcmlzZVJlbW92ZSA9IDE7IC8vIDIwMDYwNzA0LjIKLQkJcmV0dXJuIEZBTFNFOwotCX0KLQotCXJldHVybiBUUlVFOwotfQotCi0vLyBUUlVFICA6IHJlYWQgY29tbWFuZCBwcm9jZXNzIHN1Y2Nlc3NmdWxseQotLy8gRkFMU0UgOiByZWdpc3RlciBub3Qgc3VwcG9ydAotdW5zaWduZWQgY2hhcgotV2IzNVJlZ19Xcml0ZSggIHBod19kYXRhX3QgcEh3RGF0YSwgIHUxNiBSZWdpc3Rlck5vLCAgdTMyIFJlZ2lzdGVyVmFsdWUgKQotewotCVBXQjM1UkVHCXBXYjM1UmVnID0gJnBId0RhdGEtPldiMzVSZWc7Ci0Jc3RydWN0IHVzYl9jdHJscmVxdWVzdCAqZHI7Ci0JUFVSQgkJcFVyYiA9IE5VTEw7Ci0JUFJFR19RVUVVRQlwUmVnUXVldWUgPSBOVUxMOwotCXUxNgkJVXJiU2l6ZTsKLQotCi0JLy8gTW9kdWxlIHNodXRkb3duCi0JaWYgKHBId0RhdGEtPlN1cnByaXNlUmVtb3ZlKQotCQlyZXR1cm4gRkFMU0U7Ci0KLQkvLyB1cGRhdGUgdGhlIHJlZ2lzdGVyIGJ5IHNlbmQgdXJiIHJlcXVlc3QtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQlVcmJTaXplID0gc2l6ZW9mKFJFR19RVUVVRSkgKyBzaXplb2Yoc3RydWN0IHVzYl9jdHJscmVxdWVzdCk7Ci0JT1NfTUVNT1JZX0FMTE9DKCAodm9pZCogKikmcFJlZ1F1ZXVlLCBVcmJTaXplICk7Ci0JcFVyYiA9IHdiX3VzYl9hbGxvY191cmIoMCk7Ci0JaWYgKHBVcmIgJiYgcFJlZ1F1ZXVlKSB7Ci0JCXBSZWdRdWV1ZS0+RElSRUNUID0gMTsvLyBidXJzdCB3cml0ZSByZWdpc3RlcgotCQlwUmVnUXVldWUtPklOREVYID0gUmVnaXN0ZXJObzsKLQkJcFJlZ1F1ZXVlLT5WQUxVRSA9IGNwdV90b19sZTMyKFJlZ2lzdGVyVmFsdWUpOwotCQlwUmVnUXVldWUtPlJFU0VSVkVEX1ZBTElEID0gRkFMU0U7Ci0JCWRyID0gKHN0cnVjdCB1c2JfY3RybHJlcXVlc3QgKikoKHU4ICopcFJlZ1F1ZXVlICsgc2l6ZW9mKFJFR19RVUVVRSkpOwotCQlkci0+YlJlcXVlc3RUeXBlID0gVVNCX1RZUEVfVkVORE9SfFVTQl9ESVJfT1VUIHxVU0JfUkVDSVBfREVWSUNFOwotCQlkci0+YlJlcXVlc3QgPSAweDAzOyAvLyBVU0Igb3IgdmVuZG9yLWRlZmluZWQgcmVxdWVzdCBjb2RlLCBidXJzdCBtb2RlCi0JCWRyLT53VmFsdWUgPSBjcHVfdG9fbGUxNigweDApOwotCQlkci0+d0luZGV4ID0gY3B1X3RvX2xlMTYoUmVnaXN0ZXJObyk7Ci0JCWRyLT53TGVuZ3RoID0gY3B1X3RvX2xlMTYoNCk7Ci0KLQkJLy8gRW50ZXIgdGhlIHNlbmRpbmcgcXVldWUKLQkJcFJlZ1F1ZXVlLT5OZXh0ID0gTlVMTDsKLQkJcFJlZ1F1ZXVlLT5wVXNiUmVxID0gZHI7Ci0JCXBSZWdRdWV1ZS0+cFVyYiA9IHBVcmI7Ci0KLQkJc3Bpbl9sb2NrX2lycSgmcFdiMzVSZWctPkVQMFZNX3NwaW5fbG9jayApOwotCQlpZiAocFdiMzVSZWctPnBSZWdGaXJzdCA9PSBOVUxMKQotCQkJcFdiMzVSZWctPnBSZWdGaXJzdCA9IHBSZWdRdWV1ZTsKLQkJZWxzZQotCQkJcFdiMzVSZWctPnBSZWdMYXN0LT5OZXh0ID0gcFJlZ1F1ZXVlOwotCQlwV2IzNVJlZy0+cFJlZ0xhc3QgPSBwUmVnUXVldWU7Ci0KLQkJc3Bpbl91bmxvY2tfaXJxKCAmcFdiMzVSZWctPkVQMFZNX3NwaW5fbG9jayApOwotCi0JCS8vIFN0YXJ0IEVQMFZNCi0JCVdiMzVSZWdfRVAwVk1fc3RhcnQocEh3RGF0YSk7Ci0KLQkJcmV0dXJuIFRSVUU7Ci0JfSBlbHNlIHsKLQkJaWYgKHBVcmIpCi0JCQl1c2JfZnJlZV91cmIocFVyYik7Ci0JCWtmcmVlKHBSZWdRdWV1ZSk7Ci0JCXJldHVybiBGQUxTRTsKLQl9Ci19Ci0KLS8vVGhpcyBjb21tYW5kIHdpbGwgYmUgZXhlY3V0ZWQgd2l0aCBhIHVzZXIgZGVmaW5lZCB2YWx1ZS4gV2hlbiBpdCBjb21wbGV0ZXMsCi0vL3RoaXMgdmFsdWUgaXMgdXNlZnVsLiBGb3IgZXhhbXBsZSwgaGFsX3NldF9jdXJyZW50X2NoYW5uZWwgd2lsbCB1c2UgaXQuCi0vLyBUUlVFICA6IHJlYWQgY29tbWFuZCBwcm9jZXNzIHN1Y2Nlc3NmdWxseQotLy8gRkFMU0UgOiByZWdpc3RlciBub3Qgc3VwcG9ydAotdW5zaWduZWQgY2hhcgotV2IzNVJlZ19Xcml0ZVdpdGhDYWxsYmFja1ZhbHVlKCBwaHdfZGF0YV90IHBId0RhdGEsIHUxNiBSZWdpc3Rlck5vLCB1MzIgUmVnaXN0ZXJWYWx1ZSwKLQkJCQlzOCAqcFZhbHVlLCBzOCBMZW4pCi17Ci0JUFdCMzVSRUcJcFdiMzVSZWcgPSAmcEh3RGF0YS0+V2IzNVJlZzsKLQlzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0ICpkcjsKLQlQVVJCCQlwVXJiID0gTlVMTDsKLQlQUkVHX1FVRVVFCXBSZWdRdWV1ZSA9IE5VTEw7Ci0JdTE2CQlVcmJTaXplOwotCi0JLy8gTW9kdWxlIHNodXRkb3duCi0JaWYgKHBId0RhdGEtPlN1cnByaXNlUmVtb3ZlKQotCQlyZXR1cm4gRkFMU0U7Ci0KLQkvLyB1cGRhdGUgdGhlIHJlZ2lzdGVyIGJ5IHNlbmQgdXJiIHJlcXVlc3QtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQlVcmJTaXplID0gc2l6ZW9mKFJFR19RVUVVRSkgKyBzaXplb2Yoc3RydWN0IHVzYl9jdHJscmVxdWVzdCk7Ci0JT1NfTUVNT1JZX0FMTE9DKCh2b2lkKiAqKSAmcFJlZ1F1ZXVlLCBVcmJTaXplICk7Ci0JcFVyYiA9IHdiX3VzYl9hbGxvY191cmIoMCk7Ci0JaWYgKHBVcmIgJiYgcFJlZ1F1ZXVlKSB7Ci0JCXBSZWdRdWV1ZS0+RElSRUNUID0gMTsvLyBidXJzdCB3cml0ZSByZWdpc3RlcgotCQlwUmVnUXVldWUtPklOREVYID0gUmVnaXN0ZXJObzsKLQkJcFJlZ1F1ZXVlLT5WQUxVRSA9IGNwdV90b19sZTMyKFJlZ2lzdGVyVmFsdWUpOwotCQkvL05PVEUgOiBVc2VycyBtdXN0IGd1YXJhbnRlZSB0aGUgc2l6ZSBvZiB2YWx1ZSB3aWxsIG5vdCBleGNlZWQgdGhlIGJ1ZmZlciBzaXplLgotCQltZW1jcHkocFJlZ1F1ZXVlLT5SRVNFUlZFRCwgcFZhbHVlLCBMZW4pOwotCQlwUmVnUXVldWUtPlJFU0VSVkVEX1ZBTElEID0gVFJVRTsKLQkJZHIgPSAoc3RydWN0IHVzYl9jdHJscmVxdWVzdCAqKSgodTggKilwUmVnUXVldWUgKyBzaXplb2YoUkVHX1FVRVVFKSk7Ci0JCWRyLT5iUmVxdWVzdFR5cGUgPSBVU0JfVFlQRV9WRU5ET1J8VVNCX0RJUl9PVVQgfFVTQl9SRUNJUF9ERVZJQ0U7Ci0JCWRyLT5iUmVxdWVzdCA9IDB4MDM7IC8vIFVTQiBvciB2ZW5kb3ItZGVmaW5lZCByZXF1ZXN0IGNvZGUsIGJ1cnN0IG1vZGUKLQkJZHItPndWYWx1ZSA9IGNwdV90b19sZTE2KDB4MCk7Ci0JCWRyLT53SW5kZXggPSBjcHVfdG9fbGUxNihSZWdpc3Rlck5vKTsKLQkJZHItPndMZW5ndGggPSBjcHVfdG9fbGUxNig0KTsKLQotCQkvLyBFbnRlciB0aGUgc2VuZGluZyBxdWV1ZQotCQlwUmVnUXVldWUtPk5leHQgPSBOVUxMOwotCQlwUmVnUXVldWUtPnBVc2JSZXEgPSBkcjsKLQkJcFJlZ1F1ZXVlLT5wVXJiID0gcFVyYjsKLQkJc3Bpbl9sb2NrX2lycSAoJnBXYjM1UmVnLT5FUDBWTV9zcGluX2xvY2sgKTsKLQkJaWYoIHBXYjM1UmVnLT5wUmVnRmlyc3QgPT0gTlVMTCApCi0JCQlwV2IzNVJlZy0+cFJlZ0ZpcnN0ID0gcFJlZ1F1ZXVlOwotCQllbHNlCi0JCQlwV2IzNVJlZy0+cFJlZ0xhc3QtPk5leHQgPSBwUmVnUXVldWU7Ci0JCXBXYjM1UmVnLT5wUmVnTGFzdCA9IHBSZWdRdWV1ZTsKLQotCQlzcGluX3VubG9ja19pcnEgKCAmcFdiMzVSZWctPkVQMFZNX3NwaW5fbG9jayApOwotCi0JCS8vIFN0YXJ0IEVQMFZNCi0JCVdiMzVSZWdfRVAwVk1fc3RhcnQocEh3RGF0YSk7Ci0JCXJldHVybiBUUlVFOwotCX0gZWxzZSB7Ci0JCWlmIChwVXJiKQotCQkJdXNiX2ZyZWVfdXJiKHBVcmIpOwotCQlrZnJlZShwUmVnUXVldWUpOwotCQlyZXR1cm4gRkFMU0U7Ci0JfQotfQotCi0vLyBUUlVFICA6IHJlYWQgY29tbWFuZCBwcm9jZXNzIHN1Y2Nlc3NmdWxseQotLy8gRkFMU0UgOiByZWdpc3RlciBub3Qgc3VwcG9ydAotLy8gcFJlZ2lzdGVyVmFsdWUgOiBJdCBtdXN0IGJlIGEgcmVzaWRlbnQgYnVmZmVyIGR1ZSB0byBhc3luY2hyb25vdXMgcmVhZCByZWdpc3Rlci4KLXVuc2lnbmVkIGNoYXIKLVdiMzVSZWdfUmVhZFN5bmMoICBwaHdfZGF0YV90IHBId0RhdGEsICB1MTYgUmVnaXN0ZXJObywgICB1MzIgKiBwUmVnaXN0ZXJWYWx1ZSApCi17Ci0JUFdCMzVSRUcgcFdiMzVSZWcgPSAmcEh3RGF0YS0+V2IzNVJlZzsKLQl1MzIgKglwbHRtcCA9IHBSZWdpc3RlclZhbHVlOwotCWludCByZXQgPSAtMTsKLQotCS8vIE1vZHVsZSBzaHV0ZG93bgotCWlmIChwSHdEYXRhLT5TdXJwcmlzZVJlbW92ZSkKLQkJcmV0dXJuIEZBTFNFOwotCi0JLy8gUmVhZCB0aGUgcmVnaXN0ZXIgYnkgc2VuZCB1c2IgbWVzc2FnZS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0JcFdiMzVSZWctPlN5bmNJb1BhdXNlID0gMTsKLQotCS8vIDIwMDYwNzE3LjUgV2FpdCB1bnRpbCBFUDBWTSBzdG9wCi0Jd2hpbGUgKHBXYjM1UmVnLT5FUDB2bV9zdGF0ZSAhPSBWTV9TVE9QKQotCQlPU19TTEVFUCgxMDAwMCk7Ci0KLQlwV2IzNVJlZy0+RVAwdm1fc3RhdGUgPSBWTV9SVU5OSU5HOwotCXJldCA9IHVzYl9jb250cm9sX21zZyggcEh3RGF0YS0+V2JVc2IudWRldiwKLQkJCSAgICAgICB1c2JfcmN2Y3RybHBpcGUocEh3RGF0YS0+V2JVc2IudWRldiwgMCksCi0JCQkgICAgICAgMHgwMSwgVVNCX1RZUEVfVkVORE9SfFVTQl9SRUNJUF9ERVZJQ0V8VVNCX0RJUl9JTiwKLQkJCSAgICAgICAweDAsIFJlZ2lzdGVyTm8sIHBsdG1wLCA0LCBIWioxMDAgKTsKLQotCSpwUmVnaXN0ZXJWYWx1ZSA9IGNwdV90b19sZTMyKCpwbHRtcCk7Ci0KLQlwV2IzNVJlZy0+RVAwdm1fc3RhdGUgPSBWTV9TVE9QOwotCi0JV2IzNVJlZ19VcGRhdGUoIHBId0RhdGEsIFJlZ2lzdGVyTm8sICpwUmVnaXN0ZXJWYWx1ZSApOwotCXBXYjM1UmVnLT5TeW5jSW9QYXVzZSA9IDA7Ci0KLQlXYjM1UmVnX0VQMFZNX3N0YXJ0KCBwSHdEYXRhICk7Ci0KLQlpZiAocmV0IDwgMCkgewotCQkjaWZkZWYgX1BFX1JFR19EVU1QXwotCQlXQkRFQlVHKCgiRVAwIFJlYWQgcmVnaXN0ZXIgdXNiIG1lc3NhZ2Ugc2VuZGluZyBlcnJvclxuIikpOwotCQkjZW5kaWYKLQotCQlwSHdEYXRhLT5TdXJwcmlzZVJlbW92ZSA9IDE7IC8vIDIwMDYwNzA0LjIKLQkJcmV0dXJuIEZBTFNFOwotCX0KLQotCXJldHVybiBUUlVFOwotfQotCi0vLyBUUlVFICA6IHJlYWQgY29tbWFuZCBwcm9jZXNzIHN1Y2Nlc3NmdWxseQotLy8gRkFMU0UgOiByZWdpc3RlciBub3Qgc3VwcG9ydAotLy8gcFJlZ2lzdGVyVmFsdWUgOiBJdCBtdXN0IGJlIGEgcmVzaWRlbnQgYnVmZmVyIGR1ZSB0byBhc3luY2hyb25vdXMgcmVhZCByZWdpc3Rlci4KLXVuc2lnbmVkIGNoYXIKLVdiMzVSZWdfUmVhZChwaHdfZGF0YV90IHBId0RhdGEsIHUxNiBSZWdpc3Rlck5vLCAgdTMyICogcFJlZ2lzdGVyVmFsdWUgKQotewotCVBXQjM1UkVHCXBXYjM1UmVnID0gJnBId0RhdGEtPldiMzVSZWc7Ci0Jc3RydWN0IHVzYl9jdHJscmVxdWVzdCAqIGRyOwotCVBVUkIJCXBVcmI7Ci0JUFJFR19RVUVVRQlwUmVnUXVldWU7Ci0JdTE2CQlVcmJTaXplOwotCi0JLy8gTW9kdWxlIHNodXRkb3duCi0JaWYgKHBId0RhdGEtPlN1cnByaXNlUmVtb3ZlKQotCQlyZXR1cm4gRkFMU0U7Ci0KLQkvLyB1cGRhdGUgdGhlIHZhcmlhYmxlIGJ5IHNlbmQgVXJiIHRvIHJlYWQgcmVnaXN0ZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JVXJiU2l6ZSA9IHNpemVvZihSRUdfUVVFVUUpICsgc2l6ZW9mKHN0cnVjdCB1c2JfY3RybHJlcXVlc3QpOwotCU9TX01FTU9SWV9BTExPQyggKHZvaWQqICopJnBSZWdRdWV1ZSwgVXJiU2l6ZSApOwotCXBVcmIgPSB3Yl91c2JfYWxsb2NfdXJiKDApOwotCWlmKCBwVXJiICYmIHBSZWdRdWV1ZSApCi0JewotCQlwUmVnUXVldWUtPkRJUkVDVCA9IDA7Ly8gcmVhZCByZWdpc3RlcgotCQlwUmVnUXVldWUtPklOREVYID0gUmVnaXN0ZXJObzsKLQkJcFJlZ1F1ZXVlLT5wQnVmZmVyID0gcFJlZ2lzdGVyVmFsdWU7Ci0JCWRyID0gKHN0cnVjdCB1c2JfY3RybHJlcXVlc3QgKikoKHU4ICopcFJlZ1F1ZXVlICsgc2l6ZW9mKFJFR19RVUVVRSkpOwotCQlkci0+YlJlcXVlc3RUeXBlID0gVVNCX1RZUEVfVkVORE9SfFVTQl9SRUNJUF9ERVZJQ0V8VVNCX0RJUl9JTjsKLQkJZHItPmJSZXF1ZXN0ID0gMHgwMTsgLy8gVVNCIG9yIHZlbmRvci1kZWZpbmVkIHJlcXVlc3QgY29kZSwgYnVyc3QgbW9kZQotCQlkci0+d1ZhbHVlID0gY3B1X3RvX2xlMTYoMHgwKTsKLQkJZHItPndJbmRleCA9IGNwdV90b19sZTE2IChSZWdpc3Rlck5vKTsKLQkJZHItPndMZW5ndGggPSBjcHVfdG9fbGUxNiAoNCk7Ci0KLQkJLy8gRW50ZXIgdGhlIHNlbmRpbmcgcXVldWUKLQkJcFJlZ1F1ZXVlLT5OZXh0ID0gTlVMTDsKLQkJcFJlZ1F1ZXVlLT5wVXNiUmVxID0gZHI7Ci0JCXBSZWdRdWV1ZS0+cFVyYiA9IHBVcmI7Ci0JCXNwaW5fbG9ja19pcnEgKCAmcFdiMzVSZWctPkVQMFZNX3NwaW5fbG9jayApOwotCQlpZiggcFdiMzVSZWctPnBSZWdGaXJzdCA9PSBOVUxMICkKLQkJCXBXYjM1UmVnLT5wUmVnRmlyc3QgPSBwUmVnUXVldWU7Ci0JCWVsc2UKLQkJCXBXYjM1UmVnLT5wUmVnTGFzdC0+TmV4dCA9IHBSZWdRdWV1ZTsKLQkJcFdiMzVSZWctPnBSZWdMYXN0ID0gcFJlZ1F1ZXVlOwotCi0JCXNwaW5fdW5sb2NrX2lycSggJnBXYjM1UmVnLT5FUDBWTV9zcGluX2xvY2sgKTsKLQotCQkvLyBTdGFydCBFUDBWTQotCQlXYjM1UmVnX0VQMFZNX3N0YXJ0KCBwSHdEYXRhICk7Ci0KLQkJcmV0dXJuIFRSVUU7Ci0JfSBlbHNlIHsKLQkJaWYgKHBVcmIpCi0JCQl1c2JfZnJlZV91cmIoIHBVcmIgKTsKLQkJa2ZyZWUocFJlZ1F1ZXVlKTsKLQkJcmV0dXJuIEZBTFNFOwotCX0KLX0KLQotCi12b2lkCi1XYjM1UmVnX0VQMFZNX3N0YXJ0KCAgcGh3X2RhdGFfdCBwSHdEYXRhICkKLXsKLQlQV0IzNVJFRyBwV2IzNVJlZyA9ICZwSHdEYXRhLT5XYjM1UmVnOwotCi0JaWYgKE9TX0FUT01JQ19JTkMoIHBId0RhdGEtPkFkYXB0ZXIsICZwV2IzNVJlZy0+UmVnRmlyZUNvdW50KSA9PSAxKSB7Ci0JCXBXYjM1UmVnLT5FUDB2bV9zdGF0ZSA9IFZNX1JVTk5JTkc7Ci0JCVdiMzVSZWdfRVAwVk0ocEh3RGF0YSk7Ci0JfSBlbHNlCi0JCU9TX0FUT01JQ19ERUMoIHBId0RhdGEtPkFkYXB0ZXIsICZwV2IzNVJlZy0+UmVnRmlyZUNvdW50ICk7Ci19Ci0KLXZvaWQKLVdiMzVSZWdfRVAwVk0ocGh3X2RhdGFfdCBwSHdEYXRhICkKLXsKLQlQV0IzNVJFRwlwV2IzNVJlZyA9ICZwSHdEYXRhLT5XYjM1UmVnOwotCVBVUkIJCXBVcmI7Ci0Jc3RydWN0IHVzYl9jdHJscmVxdWVzdCAqZHI7Ci0JdTMyICoJCXBCdWZmZXI7Ci0JaW50CQkJcmV0ID0gLTE7Ci0JUFJFR19RVUVVRQlwUmVnUXVldWU7Ci0KLQotCWlmIChwV2IzNVJlZy0+U3luY0lvUGF1c2UpCi0JCWdvdG8gY2xlYW51cDsKLQotCWlmIChwSHdEYXRhLT5TdXJwcmlzZVJlbW92ZSkKLQkJZ290byBjbGVhbnVwOwotCi0JLy8gR2V0IHRoZSByZWdpc3RlciBkYXRhIGFuZCBzZW5kIHRvIFVTQiB0aHJvdWdoIElycAotCXNwaW5fbG9ja19pcnEoICZwV2IzNVJlZy0+RVAwVk1fc3Bpbl9sb2NrICk7Ci0JcFJlZ1F1ZXVlID0gcFdiMzVSZWctPnBSZWdGaXJzdDsKLQlzcGluX3VubG9ja19pcnEoICZwV2IzNVJlZy0+RVAwVk1fc3Bpbl9sb2NrICk7Ci0KLQlpZiAoIXBSZWdRdWV1ZSkKLQkJZ290byBjbGVhbnVwOwotCi0JLy8gR2V0IGFuIFVyYiwgc2VuZCBpdAotCXBVcmIgPSAoUFVSQilwUmVnUXVldWUtPnBVcmI7Ci0KLQlkciA9IHBSZWdRdWV1ZS0+cFVzYlJlcTsKLQlwVXJiID0gcFJlZ1F1ZXVlLT5wVXJiOwotCXBCdWZmZXIgPSBwUmVnUXVldWUtPnBCdWZmZXI7Ci0JaWYgKHBSZWdRdWV1ZS0+RElSRUNUID09IDEpIC8vIG91dHB1dAotCQlwQnVmZmVyID0gJnBSZWdRdWV1ZS0+VkFMVUU7Ci0KLQl1c2JfZmlsbF9jb250cm9sX3VyYiggcFVyYiwgcEh3RGF0YS0+V2JVc2IudWRldiwKLQkJCSAgICAgIFJFR19ESVJFQ1RJT04ocEh3RGF0YS0+V2JVc2IudWRldixwUmVnUXVldWUpLAotCQkJICAgICAgKHU4ICopZHIscEJ1ZmZlcixjcHVfdG9fbGUxNihkci0+d0xlbmd0aCksCi0JCQkgICAgICBXYjM1UmVnX0VQMFZNX2NvbXBsZXRlLCAodm9pZCopcEh3RGF0YSk7Ci0KLQlwV2IzNVJlZy0+RVAwdm1fc3RhdGUgPSBWTV9SVU5OSU5HOwotCi0JcmV0ID0gd2JfdXNiX3N1Ym1pdF91cmIoIHBVcmIgKTsKLQotCWlmIChyZXQgPCAwKSB7Ci0jaWZkZWYgX1BFX1JFR19EVU1QXwotCQlXQkRFQlVHKCgiRVAwIElycCBzZW5kaW5nIGVycm9yXG4iKSk7Ci0jZW5kaWYKLQkJZ290byBjbGVhbnVwOwotCX0KLQotCXJldHVybjsKLQotIGNsZWFudXA6Ci0JcFdiMzVSZWctPkVQMHZtX3N0YXRlID0gVk1fU1RPUDsKLQlPU19BVE9NSUNfREVDKCBwSHdEYXRhLT5BZGFwdGVyLCAmcFdiMzVSZWctPlJlZ0ZpcmVDb3VudCApOwotfQotCi0KLXZvaWQKLVdiMzVSZWdfRVAwVk1fY29tcGxldGUoUFVSQiBwVXJiKQotewotCXBod19kYXRhX3QgIHBId0RhdGEgPSAocGh3X2RhdGFfdClwVXJiLT5jb250ZXh0OwotCVBXQjM1UkVHCXBXYjM1UmVnID0gJnBId0RhdGEtPldiMzVSZWc7Ci0JUFJFR19RVUVVRQlwUmVnUXVldWU7Ci0KLQotCS8vIFZhcmlhYmxlIHNldHRpbmcKLQlwV2IzNVJlZy0+RVAwdm1fc3RhdGUgPSBWTV9DT01QTEVURUQ7Ci0JcFdiMzVSZWctPkVQMFZNX3N0YXR1cyA9IHBVcmItPnN0YXR1czsKLQotCWlmIChwSHdEYXRhLT5TdXJwcmlzZVJlbW92ZSkgeyAvLyBMZXQgV2JXbGFuSGFsdCB0byBoYW5kbGUgc3VycHJpc2UgcmVtb3ZlCi0JCXBXYjM1UmVnLT5FUDB2bV9zdGF0ZSA9IFZNX1NUT1A7Ci0JCU9TX0FUT01JQ19ERUMoIHBId0RhdGEtPkFkYXB0ZXIsICZwV2IzNVJlZy0+UmVnRmlyZUNvdW50ICk7Ci0JfSBlbHNlIHsKLQkJLy8gQ29tcGxldGUgdG8gc2VuZCwgcmVtb3ZlIHRoZSBVUkIgZnJvbSB0aGUgZmlyc3QKLQkJc3Bpbl9sb2NrX2lycSggJnBXYjM1UmVnLT5FUDBWTV9zcGluX2xvY2sgKTsKLQkJcFJlZ1F1ZXVlID0gcFdiMzVSZWctPnBSZWdGaXJzdDsKLQkJaWYgKHBSZWdRdWV1ZSA9PSBwV2IzNVJlZy0+cFJlZ0xhc3QpCi0JCQlwV2IzNVJlZy0+cFJlZ0xhc3QgPSBOVUxMOwotCQlwV2IzNVJlZy0+cFJlZ0ZpcnN0ID0gcFdiMzVSZWctPnBSZWdGaXJzdC0+TmV4dDsKLQkJc3Bpbl91bmxvY2tfaXJxKCAmcFdiMzVSZWctPkVQMFZNX3NwaW5fbG9jayApOwotCi0JCWlmIChwV2IzNVJlZy0+RVAwVk1fc3RhdHVzKSB7Ci0jaWZkZWYgX1BFX1JFR19EVU1QXwotCQkJV0JERUJVRygoIkVQMCBJb0NvbXBsZXRlUm91dGluZSByZXR1cm4gZXJyb3JcbiIpKTsKLQkJCURlYnVnVXNiZFN0YXR1c0luZm9ybWF0aW9uKCBwV2IzNVJlZy0+RVAwVk1fc3RhdHVzICk7Ci0jZW5kaWYKLQkJCXBXYjM1UmVnLT5FUDB2bV9zdGF0ZSA9IFZNX1NUT1A7Ci0JCQlwSHdEYXRhLT5TdXJwcmlzZVJlbW92ZSA9IDE7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBTdWNjZXNzLiBVcGRhdGUgdGhlIHJlc3VsdAotCi0JCQkvLyBTdGFydCB0aGUgbmV4dCBzZW5kCi0JCQlXYjM1UmVnX0VQMFZNKHBId0RhdGEpOwotCQl9Ci0KLSAgIAkJa2ZyZWUocFJlZ1F1ZXVlKTsKLQl9Ci0KLQl1c2JfZnJlZV91cmIocFVyYik7Ci19Ci0KLQotdm9pZAotV2IzNVJlZ19kZXN0cm95KHBod19kYXRhX3QgcEh3RGF0YSkKLXsKLQlQV0IzNVJFRwlwV2IzNVJlZyA9ICZwSHdEYXRhLT5XYjM1UmVnOwotCVBVUkIJCXBVcmI7Ci0JUFJFR19RVUVVRQlwUmVnUXVldWU7Ci0KLQotCVV4eF9wb3dlcl9vZmZfcHJvY2VkdXJlKHBId0RhdGEpOwotCi0JLy8gV2FpdCBmb3IgUmVnIG9wZXJhdGlvbiBjb21wbGV0ZWQKLQlkbyB7Ci0JCU9TX1NMRUVQKDEwMDAwKTsgLy8gRGVsYXkgZm9yIHdhaXRpbmcgZnVuY3Rpb24gZW50ZXIgOTQwNjIzLjEuYQotCX0gd2hpbGUgKHBXYjM1UmVnLT5FUDB2bV9zdGF0ZSAhPSBWTV9TVE9QKTsKLQlPU19TTEVFUCgxMDAwMCk7ICAvLyBEZWxheSBmb3Igd2FpdGluZyBmdW5jdGlvbiBlbnRlciA5NDA2MjMuMS5iCi0KLQkvLyBSZWxlYXNlIGFsbCB0aGUgZGF0YSBpbiBSZWdRdWV1ZQotCXNwaW5fbG9ja19pcnEoICZwV2IzNVJlZy0+RVAwVk1fc3Bpbl9sb2NrICk7Ci0JcFJlZ1F1ZXVlID0gcFdiMzVSZWctPnBSZWdGaXJzdDsKLQl3aGlsZSAocFJlZ1F1ZXVlKSB7Ci0JCWlmIChwUmVnUXVldWUgPT0gcFdiMzVSZWctPnBSZWdMYXN0KQotCQkJcFdiMzVSZWctPnBSZWdMYXN0ID0gTlVMTDsKLQkJcFdiMzVSZWctPnBSZWdGaXJzdCA9IHBXYjM1UmVnLT5wUmVnRmlyc3QtPk5leHQ7Ci0KLQkJcFVyYiA9IHBSZWdRdWV1ZS0+cFVyYjsKLQkJc3Bpbl91bmxvY2tfaXJxKCAmcFdiMzVSZWctPkVQMFZNX3NwaW5fbG9jayApOwotCQlpZiAocFVyYikgewotCQkJdXNiX2ZyZWVfdXJiKHBVcmIpOwotCQkJa2ZyZWUocFJlZ1F1ZXVlKTsKLQkJfSBlbHNlIHsKLQkJCSNpZmRlZiBfUEVfUkVHX0RVTVBfCi0JCQlXQkRFQlVHKCgiRVAwIHF1ZXVlIHJlbGVhc2UgZXJyb3JcbiIpKTsKLQkJCSNlbmRpZgotCQl9Ci0JCXNwaW5fbG9ja19pcnEoICZwV2IzNVJlZy0+RVAwVk1fc3Bpbl9sb2NrICk7Ci0KLQkJcFJlZ1F1ZXVlID0gcFdiMzVSZWctPnBSZWdGaXJzdDsKLQl9Ci0Jc3Bpbl91bmxvY2tfaXJxKCAmcFdiMzVSZWctPkVQMFZNX3NwaW5fbG9jayApOwotfQotCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gVGhlIGZ1bmN0aW9uIGNhbiBiZSBydW4gaW4gcGFzc2l2ZS1sZXZlbCBvbmx5LgotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLXVuc2lnbmVkIGNoYXIgV2IzNVJlZ19pbml0aWFsKHBod19kYXRhX3QgcEh3RGF0YSkKLXsKLQlQV0IzNVJFRyBwV2IzNVJlZz0mcEh3RGF0YS0+V2IzNVJlZzsKLQl1MzIgbHRtcDsKLQl1MzIgU29mdHdhcmVTZXQsIFZDT190cmltLCBUeFZnYSwgUmVnaW9uX1NjYW5JbnRlcnZhbDsKLQotCS8vIFNwaW4gbG9jayBpcyBhY3F1aXJlZCBmb3IgcmVhZCBhbmQgd3JpdGUgSVJQIGNvbW1hbmQKLQlzcGluX2xvY2tfaW5pdCggJnBXYjM1UmVnLT5FUDBWTV9zcGluX2xvY2sgKTsKLQotCS8vIEdldHRpbmcgUkYgbW9kdWxlIHR5cGUgZnJvbSBFRVBST00gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JV2IzNVJlZ19Xcml0ZVN5bmMoIHBId0RhdGEsIDB4MDNiNCwgMHgwODBkMDAwMCApOyAvLyBTdGFydCBFRVBST00gYWNjZXNzICsgUmVhZCArIGFkZHJlc3MoMHgwZCkKLQlXYjM1UmVnX1JlYWRTeW5jKCBwSHdEYXRhLCAweDAzYjQsICZsdG1wICk7Ci0KLQkvL1VwZGF0ZSBSRiBtb2R1bGUgdHlwZSBhbmQgZGV0ZXJtaW5lIHRoZSBQSFkgdHlwZSBieSBpbmYgb3IgRUVQUk9NCi0JcFdiMzVSZWctPkVFUFJPTVBoeVR5cGUgPSAodTgpKCBsdG1wICYgMHhmZiApOwotCS8vIDAgViBNQVgyODI1LCAxIFYgTUFYMjgyNywgMiBWIE1BWDI4MjgsIDMgViBNQVgyODI5Ci0JLy8gMTZWIEFMMjIzMCwgMTcgLSBBTDcyMzAsIDE4IC0gQUwyMjMwUwotCS8vIDMyIFJlc2VydmVkCi0JLy8gMzMgLSBXODlSRjI0MihUeFZHQSAwfjE5KSwgMzQgLSBXODlSRjI0MihUeFZHQSAwfjM0KQotCWlmIChwV2IzNVJlZy0+RUVQUk9NUGh5VHlwZSAhPSBSRl9ERUNJREVfQllfSU5GKSB7Ci0JCWlmKCAocFdiMzVSZWctPkVFUFJPTVBoeVR5cGUgPT0gUkZfTUFYSU1fMjgyNSkJfHwKLQkJCShwV2IzNVJlZy0+RUVQUk9NUGh5VHlwZSA9PSBSRl9NQVhJTV8yODI3KQl8fAotCQkJKHBXYjM1UmVnLT5FRVBST01QaHlUeXBlID09IFJGX01BWElNXzI4MjgpCXx8Ci0JCQkocFdiMzVSZWctPkVFUFJPTVBoeVR5cGUgPT0gUkZfTUFYSU1fMjgyOSkJfHwKLQkJCShwV2IzNVJlZy0+RUVQUk9NUGh5VHlwZSA9PSBSRl9NQVhJTV9WMSkJfHwKLQkJCShwV2IzNVJlZy0+RUVQUk9NUGh5VHlwZSA9PSBSRl9BSVJPSEFfMjIzMCkJfHwKLQkJCShwV2IzNVJlZy0+RUVQUk9NUGh5VHlwZSA9PSBSRl9BSVJPSEFfMjIzMFMpICAgIHx8Ci0JCQkocFdiMzVSZWctPkVFUFJPTVBoeVR5cGUgPT0gUkZfQUlST0hBXzcyMzApCXx8Ci0JCQkocFdiMzVSZWctPkVFUFJPTVBoeVR5cGUgPT0gUkZfV0JfMjQyKQkJfHwKLQkJCShwV2IzNVJlZy0+RUVQUk9NUGh5VHlwZSA9PSBSRl9XQl8yNDJfMSkpCi0JCQlwSHdEYXRhLT5waHlfdHlwZSA9IHBXYjM1UmVnLT5FRVBST01QaHlUeXBlOwotCX0KLQotCS8vIFBvd2VyIE9uIHByb2NlZHVyZSBydW5uaW5nLiBUaGUgcmVsYXRpdmUgcGFyYW1ldGVyIHdpbGwgYmUgc2V0IGFjY29yZGluZyB0byBwaHlfdHlwZQotCVV4eF9wb3dlcl9vbl9wcm9jZWR1cmUoIHBId0RhdGEgKTsKLQotCS8vIFJlYWRpbmcgTUFDIGFkZHJlc3MKLQlVeHhfUmVhZEV0aGVybmV0QWRkcmVzcyggcEh3RGF0YSApOwotCi0JLy8gUmVhZCBWQ08gdHJpbSBmb3IgUkYgcGFyYW1ldGVyCi0JV2IzNVJlZ19Xcml0ZVN5bmMoIHBId0RhdGEsIDB4MDNiNCwgMHgwODIwMDAwMCApOwotCVdiMzVSZWdfUmVhZFN5bmMoIHBId0RhdGEsIDB4MDNiNCwgJlZDT190cmltICk7Ci0KLQkvLyBSZWFkIEFudGVubmEgT24vT2ZmIG9mIHNvZnR3YXJlIGZsYWcKLQlXYjM1UmVnX1dyaXRlU3luYyggcEh3RGF0YSwgMHgwM2I0LCAweDA4MjEwMDAwICk7Ci0JV2IzNVJlZ19SZWFkU3luYyggcEh3RGF0YSwgMHgwM2I0LCAmU29mdHdhcmVTZXQgKTsKLQotCS8vIFJlYWQgVFhWR0EKLQlXYjM1UmVnX1dyaXRlU3luYyggcEh3RGF0YSwgMHgwM2I0LCAweDA4MTAwMDAwICk7Ci0JV2IzNVJlZ19SZWFkU3luYyggcEh3RGF0YSwgMHgwM2I0LCAmVHhWZ2EgKTsKLQotCS8vIEdldCBTY2FuIGludGVydmFsIHNldHRpbmcgZnJvbSBFRVBST00gb2Zmc2V0IDB4MWMKLQlXYjM1UmVnX1dyaXRlU3luYyggcEh3RGF0YSwgMHgwM2I0LCAweDA4MWQwMDAwICk7Ci0JV2IzNVJlZ19SZWFkU3luYyggcEh3RGF0YSwgMHgwM2I0LCAmUmVnaW9uX1NjYW5JbnRlcnZhbCApOwotCi0JLy8gVXBkYXRlIEV0aGVybmV0IGFkZHJlc3MKLQltZW1jcHkoIHBId0RhdGEtPkN1cnJlbnRNYWNBZGRyZXNzLCBwSHdEYXRhLT5QZXJtYW5lbnRNYWNBZGRyZXNzLCBFVEhfTEVOR1RIX09GX0FERFJFU1MgKTsKLQotCS8vIFVwZGF0ZSBzb2Z0d2FyZSB2YXJpYWJsZQotCXBId0RhdGEtPlNvZnR3YXJlU2V0ID0gKHUxNikoU29mdHdhcmVTZXQgJiAweGZmZmYpOwotCVR4VmdhICY9IDB4MDAwMDAwZmY7Ci0JcEh3RGF0YS0+UG93ZXJJbmRleEZyb21FRVBST00gPSAodTgpVHhWZ2E7Ci0JcEh3RGF0YS0+VkNPX3RyaW0gPSAodTgpVkNPX3RyaW0gJiAweGZmOwotCWlmIChwSHdEYXRhLT5WQ09fdHJpbSA9PSAweGZmKQotCQlwSHdEYXRhLT5WQ09fdHJpbSA9IDB4Mjg7Ci0KLQlwV2IzNVJlZy0+RUVQUk9NUmVnaW9uID0gKHU4KShSZWdpb25fU2NhbkludGVydmFsPj44KTsgLy8gMjAwNjA3MjAKLQlpZiggcFdiMzVSZWctPkVFUFJPTVJlZ2lvbjwxIHx8IHBXYjM1UmVnLT5FRVBST01SZWdpb24+NiApCi0JCXBXYjM1UmVnLT5FRVBST01SZWdpb24gPSBSRUdJT05fQVVUTzsKLQotCS8vRm9yIEdldCBUeCBWR0EgZnJvbSBFRVBST00gMjAwNjAzMTUuNSBtb3ZlIGhlcmUKLQlHZXRUeFZnYUZyb21FRVBST00oIHBId0RhdGEgKTsKLQotCS8vIFNldCBTY2FuIEludGVydmFsCi0JcEh3RGF0YS0+U2Nhbl9JbnRlcnZhbCA9ICh1OCkoUmVnaW9uX1NjYW5JbnRlcnZhbCAmIDB4ZmYpICogMTA7Ci0JaWYgKChwSHdEYXRhLT5TY2FuX0ludGVydmFsID09IDI1NTApIHx8IChwSHdEYXRhLT5TY2FuX0ludGVydmFsIDwgMTApKSAvLyBJcyBkZWZhdWx0IHNldHRpbmcgMHhmZiAqIDEwCi0JCXBId0RhdGEtPlNjYW5fSW50ZXJ2YWwgPSBTQ0FOX01BWF9DSE5MX1RJTUU7Ci0KLQkvLyBJbml0aWFsIHJlZ2lzdGVyCi0JUkZTeW50aGVzaXplcl9pbml0aWFsKHBId0RhdGEpOwotCi0JQkJQcm9jZXNzb3JfaW5pdGlhbChwSHdEYXRhKTsgLy8gQXN5bmMgd3JpdGUsIG11c3Qgd2FpdCB1bnRpbCBjb21wbGV0ZQotCi0JV2IzNVJlZ19waHlfY2FsaWJyYXRpb24ocEh3RGF0YSk7Ci0KLQlNeHhfaW5pdGlhbChwSHdEYXRhKTsKLQlEeHhfaW5pdGlhbChwSHdEYXRhKTsKLQotCWlmIChwSHdEYXRhLT5TdXJwcmlzZVJlbW92ZSkKLQkJcmV0dXJuIEZBTFNFOwotCWVsc2UKLQkJcmV0dXJuIFRSVUU7IC8vIEluaXRpYWwgZmFpbAotfQotCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyAgQ2FyZENvbXB1dGVDcmMgLS0KLS8vCi0vLyAgRGVzY3JpcHRpb246Ci0vLyAgICBSdW5zIHRoZSBBVVRPRElOIElJIENSQyBhbGdvcml0aG0gb24gYnVmZmVyIEJ1ZmZlciBvZiBsZW5ndGgsIExlbmd0aC4KLS8vCi0vLyAgQXJndW1lbnRzOgotLy8gICAgQnVmZmVyIC0gdGhlIGlucHV0IGJ1ZmZlcgotLy8gICAgTGVuZ3RoIC0gdGhlIGxlbmd0aCBvZiBCdWZmZXIKLS8vCi0vLyAgUmV0dXJuIFZhbHVlOgotLy8gICAgVGhlIDMyLWJpdCBDUkMgdmFsdWUuCi0vLwotLy8gIE5vdGU6Ci0vLyAgICBUaGlzIGlzIGFkYXB0ZWQgZnJvbSB0aGUgY29tbWVudHMgaW4gdGhlIGFzc2VtYmx5IGxhbmd1YWdlCi0vLyAgICB2ZXJzaW9uIGluIF9HRU5SRVEuQVNNIG9mIHRoZSBEV0IgTkUxMDAwLzIwMDAgZHJpdmVyLgotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci11MzIKLUNhcmRDb21wdXRlQ3JjKHU4ICogQnVmZmVyLCB1MzIgTGVuZ3RoKQotewotICAgIHUzMiBDcmMsIENhcnJ5OwotICAgIHUzMiAgaSwgajsKLSAgICB1OCBDdXJCeXRlOwotCi0gICAgQ3JjID0gMHhmZmZmZmZmZjsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBMZW5ndGg7IGkrKykgewotCi0gICAgICAgIEN1ckJ5dGUgPSBCdWZmZXJbaV07Ci0KLSAgICAgICAgZm9yIChqID0gMDsgaiA8IDg7IGorKykgewotCi0gICAgICAgICAgICBDYXJyeSAgICAgPSAoKENyYyAmIDB4ODAwMDAwMDApID8gMSA6IDApIF4gKEN1ckJ5dGUgJiAweDAxKTsKLSAgICAgICAgICAgIENyYyAgICAgPDw9IDE7Ci0gICAgICAgICAgICBDdXJCeXRlID4+PSAxOwotCi0gICAgICAgICAgICBpZiAoQ2FycnkpIHsKLSAgICAgICAgICAgICAgICBDcmMgPShDcmMgXiAweDA0YzExZGI2KSB8IENhcnJ5OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIENyYzsKLX0KLQotCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gQml0UmV2ZXJzZSAtLQotLy8gICBSZXZlcnNlIHRoZSBiaXRzIGluIHRoZSBpbnB1dCBhcmd1bWVudCwgZHdEYXRhLCB3aGljaCBpcwotLy8gICByZWdhcmRlZCBhcyBhIHN0cmluZyBvZiBiaXRzIHdpdGggdGhlIGxlbmd0aCwgRGF0YUxlbmd0aC4KLS8vCi0vLyBBcmd1bWVudHM6Ci0vLyAgIGR3RGF0YSAgICAgOgotLy8gICBEYXRhTGVuZ3RoIDoKLS8vCi0vLyBSZXR1cm46Ci0vLyAgIFRoZSBjb252ZXJ0ZWQgdmFsdWUuCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotdTMyIEJpdFJldmVyc2UoIHUzMiBkd0RhdGEsIHUzMiBEYXRhTGVuZ3RoKQotewotCXUzMiAgIEhhbGZMZW5ndGgsIGksIGo7Ci0JdTMyICAgQml0QSwgQml0QjsKLQotCWlmICggRGF0YUxlbmd0aCA8PSAwKSAgICAgICByZXR1cm4gMDsgICAvLyBObyBjb252ZXJzaW9uIGlzIGRvbmUuCi0JZHdEYXRhID0gZHdEYXRhICYgKDB4ZmZmZmZmZmYgPj4gKDMyIC0gRGF0YUxlbmd0aCkpOwotCi0JSGFsZkxlbmd0aCA9IERhdGFMZW5ndGggLyAyOwotCWZvciAoIGkgPSAwLCBqID0gRGF0YUxlbmd0aC0xIDsgaSA8IEhhbGZMZW5ndGg7IGkrKywgai0tKQotCXsKLQkJQml0QSA9IEdldEJpdCggZHdEYXRhLCBpKTsKLQkJQml0QiA9IEdldEJpdCggZHdEYXRhLCBqKTsKLQkJaWYgKEJpdEEgJiYgIUJpdEIpIHsKLQkJCWR3RGF0YSA9IENsZWFyQml0KCBkd0RhdGEsIGkpOwotCQkJZHdEYXRhID0gU2V0Qml0KCBkd0RhdGEsIGopOwotCQl9IGVsc2UgaWYgKCFCaXRBICYmIEJpdEIpIHsKLQkJCWR3RGF0YSA9IFNldEJpdCggZHdEYXRhLCBpKTsKLQkJCWR3RGF0YSA9IENsZWFyQml0KCBkd0RhdGEsIGopOwotCQl9IGVsc2UKLQkJewotCQkJLy8gRG8gbm90aGluZyBzaW5jZSB0aGVzZSB0d28gYml0cyBhcmUgb2YgdGhlIHNhdmUgdmFsdWVzLgotCQl9Ci0JfQotCi0JcmV0dXJuIGR3RGF0YTsKLX0KLQotdm9pZCBXYjM1UmVnX3BoeV9jYWxpYnJhdGlvbiggIHBod19kYXRhX3QgcEh3RGF0YSApCi17Ci0JdTMyIEJCM2MsIEJCNTQ7Ci0KLQlpZiAoKHBId0RhdGEtPnBoeV90eXBlID09IFJGX1dCXzI0MikgfHwKLQkJKHBId0RhdGEtPnBoeV90eXBlID09IFJGX1dCXzI0Ml8xKSkgewotCQlwaHlfY2FsaWJyYXRpb25fd2luYm9uZCAoIHBId0RhdGEsIDI0MTIgKTsgLy8gU3luYyBvcGVyYXRpb24KLQkJV2IzNVJlZ19SZWFkU3luYyggcEh3RGF0YSwgMHgxMDNjLCAmQkIzYyApOwotCQlXYjM1UmVnX1JlYWRTeW5jKCBwSHdEYXRhLCAweDEwNTQsICZCQjU0ICk7Ci0KLQkJcEh3RGF0YS0+QkIzY19jYWwgPSBCQjNjOwotCQlwSHdEYXRhLT5CQjU0X2NhbCA9IEJCNTQ7Ci0KLQkJUkZTeW50aGVzaXplcl9pbml0aWFsKHBId0RhdGEpOwotCQlCQlByb2Nlc3Nvcl9pbml0aWFsKHBId0RhdGEpOyAvLyBBc3luYyBvcGVyYXRpb24KLQotCQlXYjM1UmVnX1dyaXRlU3luYyggcEh3RGF0YSwgMHgxMDNjLCBCQjNjICk7Ci0JCVdiMzVSZWdfV3JpdGVTeW5jKCBwSHdEYXRhLCAweDEwNTQsIEJCNTQgKTsKLQl9Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbGludXgvd2IzNXJlZ19mLmggYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9saW51eC93YjM1cmVnX2YuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzAwNmNmZS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9saW51eC93YjM1cmVnX2YuaAorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBJbnRlcmZhY2UgZnVuY3Rpb24gZGVjbGFyZQotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLXVuc2lnbmVkIGNoYXIgV2IzNVJlZ19pbml0aWFsKCAgcGh3X2RhdGFfdCBwSHdEYXRhICk7Ci12b2lkIFV4eF9wb3dlcl9vbl9wcm9jZWR1cmUoICBwaHdfZGF0YV90IHBId0RhdGEgKTsKLXZvaWQgVXh4X3Bvd2VyX29mZl9wcm9jZWR1cmUoICBwaHdfZGF0YV90IHBId0RhdGEgKTsKLXZvaWQgVXh4X1JlYWRFdGhlcm5ldEFkZHJlc3MoICBwaHdfZGF0YV90IHBId0RhdGEgKTsKLXZvaWQgRHh4X2luaXRpYWwoICBwaHdfZGF0YV90IHBId0RhdGEgKTsKLXZvaWQgTXh4X2luaXRpYWwoICBwaHdfZGF0YV90IHBId0RhdGEgKTsKLXZvaWQgUkZTeW50aGVzaXplcl9pbml0aWFsKCAgcGh3X2RhdGFfdCBwSHdEYXRhICk7Ci0vL3ZvaWQgUkZTeW50aGVzaXplcl9Td2l0Y2hpbmdDaGFubmVsKCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgczggQ2hhbm5lbCApOwotdm9pZCBSRlN5bnRoZXNpemVyX1N3aXRjaGluZ0NoYW5uZWwoICBwaHdfZGF0YV90IHBId0RhdGEsICBDaGFuSW5mbyBDaGFubmVsICk7Ci12b2lkIEJCUHJvY2Vzc29yX2luaXRpYWwoICBwaHdfZGF0YV90IHBId0RhdGEgKTsKLXZvaWQgQkJQcm9jZXNzb3JfUmF0ZUNoYW5naW5nKCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgdTggcmF0ZSApOyAvLyAyMDA2MDYxMy4xCi0vL3ZvaWQgUkZfUmF0ZUNoYW5naW5nKCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgdTggcmF0ZSApOyAvLyAyMDA2MDYyNi41LmMgQWRkCi11OCBSRlN5bnRoZXNpemVyX1NldFBvd2VySW5kZXgoICBwaHdfZGF0YV90IHBId0RhdGEsICB1OCBQb3dlckluZGV4ICk7Ci11OCBSRlN5bnRoZXNpemVyX1NldE1heGltMjgyOF8yNFBvd2VyKCAgcGh3X2RhdGFfdCwgIHU4IGluZGV4ICk7Ci11OCBSRlN5bnRoZXNpemVyX1NldE1heGltMjgyOF81MFBvd2VyKCAgcGh3X2RhdGFfdCwgIHU4IGluZGV4ICk7Ci11OCBSRlN5bnRoZXNpemVyX1NldE1heGltMjgyN18yNFBvd2VyKCAgcGh3X2RhdGFfdCwgIHU4IGluZGV4ICk7Ci11OCBSRlN5bnRoZXNpemVyX1NldE1heGltMjgyN181MFBvd2VyKCAgcGh3X2RhdGFfdCwgIHU4IGluZGV4ICk7Ci11OCBSRlN5bnRoZXNpemVyX1NldE1heGltMjgyNVBvd2VyKCAgcGh3X2RhdGFfdCwgIHU4IGluZGV4ICk7Ci11OCBSRlN5bnRoZXNpemVyX1NldEFpcm9oYTIyMzBQb3dlciggIHBod19kYXRhX3QsICB1OCBpbmRleCApOwotdTggUkZTeW50aGVzaXplcl9TZXRBaXJvaGE3MjMwUG93ZXIoICBwaHdfZGF0YV90LCAgdTggaW5kZXggKTsKLXU4IFJGU3ludGhlc2l6ZXJfU2V0V2luYm9uZDI0MlBvd2VyKCAgcGh3X2RhdGFfdCwgIHU4IGluZGV4ICk7Ci12b2lkIEdldFR4VmdhRnJvbUVFUFJPTSggIHBod19kYXRhX3QgcEh3RGF0YSApOwotdm9pZCBFRVBST01UeFZnYUFkanVzdCggIHBod19kYXRhX3QgcEh3RGF0YSApOyAvLyAyMDA2MDYxOS41IEFkZAotCi0jZGVmaW5lIFJGV3JpdGVDb250cm9sRGF0YSggX0EsIF9WICkgV2IzNVJlZ19Xcml0ZSggX0EsIDB4MDg2NCwgX1YgKQotCi12b2lkIFdiMzVSZWdfZGVzdHJveSggIHBod19kYXRhX3QgcEh3RGF0YSApOwotCi11bnNpZ25lZCBjaGFyIFdiMzVSZWdfUmVhZCggIHBod19kYXRhX3QgcEh3RGF0YSwgIHUxNiBSZWdpc3Rlck5vLCAgIHUzMiAqIHBSZWdpc3RlclZhbHVlICk7Ci11bnNpZ25lZCBjaGFyIFdiMzVSZWdfUmVhZFN5bmMoICBwaHdfZGF0YV90IHBId0RhdGEsICB1MTYgUmVnaXN0ZXJObywgICB1MzIgKiBwUmVnaXN0ZXJWYWx1ZSApOwotdW5zaWduZWQgY2hhciBXYjM1UmVnX1dyaXRlKCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgdTE2IFJlZ2lzdGVyTm8sICB1MzIgUmVnaXN0ZXJWYWx1ZSApOwotdW5zaWduZWQgY2hhciBXYjM1UmVnX1dyaXRlU3luYyggIHBod19kYXRhX3QgcEh3RGF0YSwgIHUxNiBSZWdpc3Rlck5vLCAgdTMyIFJlZ2lzdGVyVmFsdWUgKTsKLXVuc2lnbmVkIGNoYXIgV2IzNVJlZ19Xcml0ZVdpdGhDYWxsYmFja1ZhbHVlKCAgcGh3X2RhdGFfdCBwSHdEYXRhLAotCQkJCQkJCQkgdTE2IFJlZ2lzdGVyTm8sCi0JCQkJCQkJCSB1MzIgUmVnaXN0ZXJWYWx1ZSwKLQkJCQkJCQkJIHM4ICpwVmFsdWUsCi0JCQkJCQkJCSBzOCBMZW4pOwotdW5zaWduZWQgY2hhciBXYjM1UmVnX0J1cnN0V3JpdGUoICBwaHdfZGF0YV90IHBId0RhdGEsICB1MTYgUmVnaXN0ZXJObywgIHUzMiAqIHBSZWdpc3RlckRhdGEsICB1OCBOdW1iZXJPZkRhdGEsICB1OCBGbGFnICk7Ci0KLXZvaWQgV2IzNVJlZ19FUDBWTSggIHBod19kYXRhX3QgcEh3RGF0YSApOwotdm9pZCBXYjM1UmVnX0VQMFZNX3N0YXJ0KCAgcGh3X2RhdGFfdCBwSHdEYXRhICk7Ci12b2lkIFdiMzVSZWdfRVAwVk1fY29tcGxldGUoICBQVVJCIHBVcmIgKTsKLQotdTMyIEJpdFJldmVyc2UoIHUzMiBkd0RhdGEsIHUzMiBEYXRhTGVuZ3RoKTsKLQotdm9pZCBDYXJkR2V0TXVsdGljYXN0Qml0KCAgIHU4IEFkZHJlc3NbTUFDX0FERFJfTEVOR1RIXSwgIHU4ICpCeXRlLCAgdTggKlZhbHVlICk7Ci11MzIgQ2FyZENvbXB1dGVDcmMoICB1OCAqIEJ1ZmZlciwgIHUzMiBMZW5ndGggKTsKLQotdm9pZCBXYjM1UmVnX3BoeV9jYWxpYnJhdGlvbiggIHBod19kYXRhX3QgcEh3RGF0YSApOwotdm9pZCBXYjM1UmVnX1VwZGF0ZSggIHBod19kYXRhX3QgcEh3RGF0YSwgIHUxNiBSZWdpc3Rlck5vLCAgdTMyIFJlZ2lzdGVyVmFsdWUgKTsKLXVuc2lnbmVkIGNoYXIgYWRqdXN0X1RYVkdBX2Zvcl9pcV9tYWcoICBwaHdfZGF0YV90IHBId0RhdGEgKTsKLQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9saW51eC93YjM1cmVnX3MuaCBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL2xpbnV4L3diMzVyZWdfcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjM1YjkzLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL2xpbnV4L3diMzVyZWdfcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTcwICswLDAgQEAKLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vKgotCQkJCUhBTCBzZXR0aW5nIGZ1bmN0aW9uCi0KLQkJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCQl8VXh4fCAJfER4eHwJfE14eHwJfEJCfAl8UkZ8Ci0JCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQkJCXwJCQkJCXwKLQkJV2IzNVJlZ19SZWFkCQlXYjM1UmVnX1dyaXRlCi0KLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQkJCVdiVXNiX0NhbGxVU0JEQVN5bmMJCQkJCXN1cHBsaWVkIEJ5IFdiVXNiIG1vZHVsZQotKi8KLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSNkZWZpbmUgICAgIEdldEJpdCggZHdEYXRhLCBpKSAgICAgICggZHdEYXRhICYgKDB4MDAwMDAwMDEgPDwgaSkpCi0jZGVmaW5lICAgICBTZXRCaXQoIGR3RGF0YSwgaSkgICAgICAoIGR3RGF0YSB8ICgweDAwMDAwMDAxIDw8IGkpKQotI2RlZmluZSAgICAgQ2xlYXJCaXQoIGR3RGF0YSwgaSkgICAgKCBkd0RhdGEgJiB+KDB4MDAwMDAwMDEgPDwgaSkpCi0KLSNkZWZpbmUJCUlHTk9SRV9JTkNSRU1FTlQJMAotI2RlZmluZQkJQVVUT19JTkNSRU1FTlQJCTAKLSNkZWZpbmUJCU5PX0lOQ1JFTUVOVAkJMQotI2RlZmluZSBSRUdfRElSRUNUSU9OKF94LF95KSAgICgoX3kpLT5ESVJFQ1QgPT0wID8gdXNiX3JjdmN0cmxwaXBlKF94LDApIDogdXNiX3NuZGN0cmxwaXBlKF94LDApKQotI2RlZmluZSBSRUdfQlVGX1NJWkUoX3gpICAgICAgICgoX3gpLT5iUmVxdWVzdD09IDB4MDQgPyBjcHVfdG9fbGUxNigoX3gpLT53TGVuZ3RoKSA6IDQpCi0KLS8vIDIwMDYwNjEzLjIgQWRkIHRoZSBmb2xsb3cgZGVmaW5pdGlvbgotI2RlZmluZSBCQjQ4X0RFRkFVTFRfQUwyMjMwXzExQgkJMHgwMDMzNDQ3YwotI2RlZmluZSBCQjRDX0RFRkFVTFRfQUwyMjMwXzExQgkJMHgwQTAwRkVGRgotI2RlZmluZSBCQjQ4X0RFRkFVTFRfQUwyMjMwXzExRwkJMHgwMDMzMkMxQgotI2RlZmluZSBCQjRDX0RFRkFVTFRfQUwyMjMwXzExRwkJMHgwQTAwRkVGRgotCi0KLSNkZWZpbmUgQkI0OF9ERUZBVUxUX1dCMjQyXzExQgkJMHgwMDI5MjMxNQkvL2JhY2tvZmYgIDJkQgotI2RlZmluZSBCQjRDX0RFRkFVTFRfV0IyNDJfMTFCCQkweDA4MDBGRUZGCS8vYmFja29mZiAgMmRCCi0vLyNkZWZpbmUgQkI0OF9ERUZBVUxUX1dCMjQyXzExQgkJMHgwMDIwMUIxMQkvL2JhY2tvZmYgIDRkQgotLy8jZGVmaW5lIEJCNENfREVGQVVMVF9XQjI0Ml8xMUIJCTB4MDYwMEZGMDAJLy9iYWNrb2ZmICA0ZEIKLSNkZWZpbmUgQkI0OF9ERUZBVUxUX1dCMjQyXzExRwkJMHgwMDQ1M0IyNAotI2RlZmluZSBCQjRDX0RFRkFVTFRfV0IyNDJfMTFHCQkweDBFMDBGRUZGCi0KLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBEZWZhdWx0IHNldHRpbmcgZm9yIE14eAotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSNkZWZpbmUgREVGQVVMVF9DV01JTgkJCQkJMzEJCS8vKE0yQykgQ1dtaW4uIEl0cyB2YWx1ZSBpcyBpbiB0aGUgcmFuZ2UgMC0zMS4KLSNkZWZpbmUgREVGQVVMVF9DV01BWAkJCQkJMTAyMwkvLyhNMkMpIENXbWF4LiBJdHMgdmFsdWUgaXMgaW4gdGhlIHJhbmdlIDAtMTAyMy4KLSNkZWZpbmUgREVGQVVMVF9BSUQJCQkJCQkxCQkvLyhNMzQpIEFJRC4gSXRzIHZhbHVlIGlzIGluIHRoZSByYW5nZSAxLTIwMDcuCi0KLSNpZmRlZiBfVVNFX0ZBTExCQUNLX1JBVEVfCi0jZGVmaW5lIERFRkFVTFRfUkFURV9SRVRSWV9MSU1JVAkJMgkJLy8oTTM4KSBhcyBuYW1lZAotI2Vsc2UKLSNkZWZpbmUgREVGQVVMVF9SQVRFX1JFVFJZX0xJTUlUCQk3CQkvLyhNMzgpIGFzIG5hbWVkCi0jZW5kaWYKLQotI2RlZmluZSBERUZBVUxUX0xPTkdfUkVUUllfTElNSVQJCTcJCS8vKE0zOCkgTG9uZ1JldHJ5TGltaXQuIEl0cyB2YWx1ZSBpcyBpbiB0aGUgcmFuZ2UgMC0xNS4KLSNkZWZpbmUgREVGQVVMVF9TSE9SVF9SRVRSWV9MSU1JVAkJNwkJLy8oTTM4KSBTaG9ydFJldHJ5TGltaXQuIEl0cyB2YWx1ZSBpcyBpbiB0aGUgcmFuZ2UgMC0xNS4KLSNkZWZpbmUgREVGQVVMVF9QSUZTVAkJCQkJMjUJCS8vKE0zQykgUElGUyBUaW1lLiBJdHMgdmFsdWUgaXMgaW4gdGhlIHJhbmdlIDAtNjU1MzUuCi0jZGVmaW5lIERFRkFVTFRfRUlGU1QJCQkJCTM1NAkJLy8oTTNDKSBFSUZTIFRpbWUuIEl0cyB2YWx1ZSBpcyBpbiB0aGUgcmFuZ2UgMC0xMDQ4NTc1LgotI2RlZmluZSBERUZBVUxUX0RJRlNUCQkJCQk0NQkJLy8oTTNDKSBESUZTIFRpbWUuIEl0cyB2YWx1ZSBpcyBpbiB0aGUgcmFuZ2UgMC02NTUzNS4KLSNkZWZpbmUgREVGQVVMVF9TSUZTVAkJCQkJNQkJLy8oTTNDKSBTSUZTIFRpbWUuIEl0cyB2YWx1ZSBpcyBpbiB0aGUgcmFuZ2UgMC02NTUzNS4KLSNkZWZpbmUgREVGQVVMVF9PU0lGU1QJCQkJCTEwCQkvLyhNM0MpIE9yaWdpbmFsIFNJRlMgVGltZS4gSXRzIHZhbHVlIGlzIGluIHRoZSByYW5nZSAwLTE1LgotI2RlZmluZSBERUZBVUxUX0FUSU1XRAkJCQkJMAkJLy8oTTQwKSBBVElNIFdpbmRvdy4gSXRzIHZhbHVlIGlzIGluIHRoZSByYW5nZSAwLTY1NTM1LgotI2RlZmluZSBERUZBVUxUX1NMT1RfVElNRQkJCQkyMAkJLy8oTTQwKSAoJCkgU2xvdFRpbWUuIEl0cyB2YWx1ZSBpcyBpbiB0aGUgcmFuZ2UgMC0yNTUuCi0jZGVmaW5lIERFRkFVTFRfTUFYX1RYX01TRFVfTElGRV9USU1FCTUxMgkvLyhNNDQpIE1heFR4TVNEVUxpZmVUaW1lLiBJdHMgdmFsdWUgaXMgaW4gdGhlIHJhbmdlIDAtNDI5NDk2NzI5NS4KLSNkZWZpbmUgREVGQVVMVF9CRUFDT05fSU5URVJWQUwJCQk1MDAJCS8vKE00OCkgQmVhY29uIEludGVydmFsLiBJdHMgdmFsdWUgaXMgaW4gdGhlIHJhbmdlIDAtNjU1MzUuCi0jZGVmaW5lIERFRkFVTFRfUFJPQkVfREVMQVlfVElNRQkJMjAwCQkvLyhNNDgpIFByb2JlIERlbGF5IFRpbWUuIEl0cyB2YWx1ZSBpcyBpbiB0aGUgcmFuZ2UgMC02NTUzNS4KLSNkZWZpbmUgREVGQVVMVF9QUk9UT0NPTF9WRVJTSU9OCQkwCQkvLyhNNEMpCi0jZGVmaW5lIERFRkFVTFRfTUFDX1BPV0VSX1NUQVRFCQkJMgkJLy8oTTRDKSAyOiBNQUMgYXQgcG93ZXIgYWN0aXZlCi0jZGVmaW5lIERFRkFVTFRfRFRJTV9BTEVSVF9USU1FCQkJMAotCi0KLXR5cGVkZWYgc3RydWN0IF9SRUdfUVVFVUUKLXsKLSAgICBzdHJ1Y3QgIHVyYiAqcFVyYjsKLQl2b2lkKglwVXNiUmVxOwotCXZvaWQqCU5leHQ7Ci0JdW5pb24KLQl7Ci0JCXUzMglWQUxVRTsKLQkJdTMyICoJcEJ1ZmZlcjsKLQl9OwotCXU4CVJFU0VSVkVEWzRdOy8vIHNwYWNlIHJlc2VydmVkIGZvciBjb21tdW5pY2F0aW9uCi0KLSAgICB1MTYJSU5ERVg7IC8vIEZvciBzdG9yaW5nIHRoZSByZWdpc3RlciBpbmRleAotICAgIHU4CVJFU0VSVkVEX1ZBTElEOwkvL0luZGljYXRlIHdoZXRoZXIgdGhlIFJFU0VSVkVEIHNwYWNlIGlzIHZhbGlkIGF0IHRoaXMgY29tbWFuZC4KLQl1OAlESVJFQ1Q7IC8vIDA6SW4gICAxOk91dAotCi19IFJFR19RVUVVRSwgKlBSRUdfUVVFVUU7Ci0KLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBJbnRlcm5hbCB2YXJpYWJsZSBmb3IgbW9kdWxlCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotI2RlZmluZSBNQVhfU1EzX0ZJTFRFUl9TSVpFCQk1Ci10eXBlZGVmIHN0cnVjdCBfV0IzNVJFRwotewotCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCS8vIFJlZ2lzdGVyIEJhbmsgYmFja3VwCi0JLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JdTMyCVUxQjA7CQkJLy9iaXQxNiByZWNvcmQgdGhlIGgvdyByYWRpbyBvbi9vZmYgc3RhdHVzCi0JdTMyCVUxQkNfTEVEQ29uZmlndXJlOwotCXUzMglEMDBfRG1hQ29udHJvbDsKLQl1MzIJTTAwX01hY0NvbnRyb2w7Ci0JdW5pb24gewotCQlzdHJ1Y3QgewotCQkJdTMyCU0wNF9NdWx0aWNhc3RBZGRyZXNzMTsKLQkJCXUzMglNMDhfTXVsdGljYXN0QWRkcmVzczI7Ci0JCX07Ci0JCXU4CQlNdWx0aWNhc3RbOF07CS8vIGNvbnRlbnRzIG9mIGNhcmQgbXVsdGljYXN0IHJlZ2lzdGVycwotCX07Ci0KLQl1MzIJTTI0X01hY0NvbnRyb2w7Ci0JdTMyCU0yOF9NYWNDb250cm9sOwotCXUzMglNMkNfTWFjQ29udHJvbDsKLQl1MzIJTTM4X01hY0NvbnRyb2w7Ci0JdTMyCU0zQ19NYWNDb250cm9sOyAvLyAyMDA2MDIxNCBiYWNrdXAgb25seQotCXUzMglNNDBfTWFjQ29udHJvbDsKLQl1MzIJTTQ0X01hY0NvbnRyb2w7IC8vIDIwMDYwMjE0IGJhY2t1cCBvbmx5Ci0JdTMyCU00OF9NYWNDb250cm9sOyAvLyAyMDA2MDIxNCBiYWNrdXAgb25seQotCXUzMglNNENfTWFjU3RhdHVzOwotCXUzMglNNjBfTWFjQ29udHJvbDsgLy8gMjAwNjAyMTQgYmFja3VwIG9ubHkKLQl1MzIJTTY4X01hY0NvbnRyb2w7IC8vIDIwMDYwMjE0IGJhY2t1cCBvbmx5Ci0JdTMyCU03MF9NYWNDb250cm9sOyAvLyAyMDA2MDIxNCBiYWNrdXAgb25seQotCXUzMglNNzRfTWFjQ29udHJvbDsgLy8gMjAwNjAyMTQgYmFja3VwIG9ubHkKLQl1MzIJTTc4X0VSUEluZm9ybWF0aW9uOy8vOTMwMjA2LjIuYgotCXUzMglNN0NfTWFjQ29udHJvbDsgLy8gMjAwNjAyMTQgYmFja3VwIG9ubHkKLQl1MzIJTTgwX01hY0NvbnRyb2w7IC8vIDIwMDYwMjE0IGJhY2t1cCBvbmx5Ci0JdTMyCU04NF9NYWNDb250cm9sOyAvLyAyMDA2MDIxNCBiYWNrdXAgb25seQotCXUzMglNODhfTWFjQ29udHJvbDsgLy8gMjAwNjAyMTQgYmFja3VwIG9ubHkKLQl1MzIJTTk4X01hY0NvbnRyb2w7IC8vIDIwMDYwMjE0IGJhY2t1cCBvbmx5Ci0KLQkvL1syMDA0MDcyMiBXS10KLQkvL0Jhc2ViYW5kIHJlZ2lzdGVyCi0JdTMyCUJCMEM7CS8vIFVzZWQgZm9yIExOQSBjYWxjdWxhdGlvbgotCXUzMglCQjJDOwkvLwotCXUzMglCQjMwOwkvLzExYiBhY3F1aXNpdGlvbiBjb250cm9sIHJlZ2lzdGVyCi0JdTMyCUJCM0M7Ci0JdTMyCUJCNDg7CS8vIDIwMDUxMjIxLjEuYSAyMDA2MDYxMy4xIEZpeCBPQlcgaXNzdWUgb2YgMTFiLzExZyByYXRlCi0JdTMyCUJCNEM7CS8vIDIwMDYwNjEzLjEgIEZpeCBPQlcgaXNzdWUgb2YgMTFiLzExZyByYXRlCi0JdTMyCUJCNTA7CS8vbW9kZSBjb250cm9sIHJlZ2lzdGVyCi0JdTMyCUJCNTQ7Ci0JdTMyIAlCQjU4OwkvL0lRX0FMUEhBCi0JdTMyCUJCNUM7CS8vIEZvciB0ZXN0Ci0JdTMyCUJCNjA7CS8vIGZvciBXVE8gcmVhZCB2YWx1ZQotCi0JLy8tLS0tLS0tLS0tLS0tLS0tLS0tCi0JLy8gVk0KLQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0KLQlzcGlubG9ja190CUVQMFZNX3NwaW5fbG9jazsgLy8gNEIKLQl1MzIJICAgICAgICBFUDBWTV9zdGF0dXM7Ly8kJAotCVBSRUdfUVVFVUUJICAgIHBSZWdGaXJzdDsKLQlQUkVHX1FVRVVFCSAgICBwUmVnTGFzdDsKLQlPU19BVE9NSUMgICAgICAgUmVnRmlyZUNvdW50OwotCi0JLy8gSGFyZHdhcmUgc3RhdHVzCi0JdTgJRVAwdm1fc3RhdGU7Ci0JdTgJbWFjX3Bvd2VyX3NhdmU7Ci0JdTgJRUVQUk9NUGh5VHlwZTsgLy8gMCB+IDE1IGZvciBNYXhpbSAoMCDEhFYgTUFYMjgyNSwgMSDEhFYgTUFYMjgyNywgMiDEhFYgTUFYMjgyOCwgMyDEhFYgTUFYMjgyOSksCi0JCQkJCQkgICAvLyAxNiB+IDMxIGZvciBBaXJvaGEgKDE2IMSEViBBTDIyMzAsIDExIC0gQUw3MjMwKQotCQkJCQkJICAgLy8gMzIgfiBSZXNlcnZlZAotCQkJCQkJICAgLy8gMzMgfiA0NyBGb3IgV0IyNDIgKCAzMyAtIFdCMjQyLCAzNCAtIFdCMjQyIHdpdGggbmV3IFR4dmdhIDAuNSBkYiBzdGVwKQotCQkJCQkJICAgLy8gNDggfiAyNTUgQVJFIFJFU0VSVkVELgotCXU4CUVFUFJPTVJlZ2lvbjsJLy9SZWdpb24gc2V0dGluZyBpbiBFRVBST00KLQotCXUzMglTeW5jSW9QYXVzZTsgLy8gSWYgdXNlciB1c2UgdGhlIFN5bmMgSW8gdG8gYWNjZXNzIEh3LCB0aGVuIHBhdXNlIHRoZSBhc3luYyBhY2Nlc3MKLQotCXU4CUxOQVZhbHVlWzRdOyAvL1RhYmxlIGZvciBzcGVlZCB1cCBydW5uaW5nCi0JdTMyCVNRM19maWx0ZXJbTUFYX1NRM19GSUxURVJfU0laRV07Ci0JdTMyCVNRM19pbmRleDsKLQotfSBXQjM1UkVHLCAqUFdCMzVSRUc7Ci0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbGludXgvd2IzNXJ4LmMgYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9saW51eC93YjM1cnguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjRiOWY1Zi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9saW51eC93YjM1cnguYworKysgL2Rldi9udWxsCkBAIC0xLDMzNCArMCwwIEBACi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vICBDb3B5cmlnaHQgKGMpIDE5OTYtMjAwMiBXaW5ib25kIEVsZWN0cm9uaWMgQ29ycG9yYXRpb24KLS8vCi0vLyAgTW9kdWxlIE5hbWU6Ci0vLyAgICBXYjM1UnguYwotLy8KLS8vICBBYnN0cmFjdDoKLS8vICAgIFByb2Nlc3NpbmcgdGhlIFJ4IG1lc3NhZ2UgZnJvbSBkb3duIGxheWVyCi0vLwotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jaW5jbHVkZSAic3lzZGVmLmgiCi0KLQotdm9pZCBXYjM1Unhfc3RhcnQocGh3X2RhdGFfdCBwSHdEYXRhKQotewotCVBXQjM1UlggcFdiMzVSeCA9ICZwSHdEYXRhLT5XYjM1Ung7Ci0KLQkvLyBBbGxvdyBvbmx5IG9uZSB0aHJlYWQgdG8gcnVuIGludG8gdGhlIFdiMzVSeCgpIGZ1bmN0aW9uCi0JaWYgKE9TX0FUT01JQ19JTkMocEh3RGF0YS0+QWRhcHRlciwgJnBXYjM1UngtPlJ4RmlyZUNvdW50ZXIpID09IDEpIHsKLQkJcFdiMzVSeC0+RVAzdm1fc3RhdGUgPSBWTV9SVU5OSU5HOwotCQlXYjM1UngocEh3RGF0YSk7Ci0JfSBlbHNlCi0JCU9TX0FUT01JQ19ERUMocEh3RGF0YS0+QWRhcHRlciwgJnBXYjM1UngtPlJ4RmlyZUNvdW50ZXIpOwotfQotCi0vLyBUaGlzIGZ1bmN0aW9uIGNhbm5vdCByZWVudHJhaW4KLXZvaWQgV2IzNVJ4KCAgcGh3X2RhdGFfdCBwSHdEYXRhICkKLXsKLQlQV0IzNVJYCXBXYjM1UnggPSAmcEh3RGF0YS0+V2IzNVJ4OwotCXU4ICoJcFJ4QnVmZmVyQWRkcmVzczsKLQlQVVJCCXBVcmIgPSAoUFVSQilwV2IzNVJ4LT5SeFVyYjsKLQlpbnQJcmV0djsKLQl1MzIJUnhCdWZmZXJJZDsKLQotCS8vCi0JLy8gSXNzdWluZyBVUkIKLQkvLwotCWlmIChwSHdEYXRhLT5TdXJwcmlzZVJlbW92ZSB8fCBwSHdEYXRhLT5Id1N0b3ApCi0JCWdvdG8gZXJyb3I7Ci0KLQlpZiAocFdiMzVSeC0+cnhfaGFsdCkKLQkJZ290byBlcnJvcjsKLQotCS8vIEdldCBSeEJ1ZmZlcidzIElECi0JUnhCdWZmZXJJZCA9IHBXYjM1UngtPlJ4QnVmZmVySWQ7Ci0JaWYgKCFwV2IzNVJ4LT5SeE93bmVyW1J4QnVmZmVySWRdKSB7Ci0JCS8vIEl0J3MgaW1wb3NzaWJsZSB0byBydW4gaGVyZS4KLQkJI2lmZGVmIF9QRV9SWF9EVU1QXwotCQlXQkRFQlVHKCgiUnggZHJpdmVyIGZpZm8gdW5hdmFpbGFibGVcbiIpKTsKLQkJI2VuZGlmCi0JCWdvdG8gZXJyb3I7Ci0JfQotCi0JLy8gVXBkYXRlIGJ1ZmZlciBwb2ludCwgdGhlbiBzdGFydCB0byBidWxraW4gdGhlIGRhdGEgZnJvbSBVU0IKLQlwV2IzNVJ4LT5SeEJ1ZmZlcklkKys7Ci0JcFdiMzVSeC0+UnhCdWZmZXJJZCAlPSBNQVhfVVNCX1JYX0JVRkZFUl9OVU1CRVI7Ci0KLQlwV2IzNVJ4LT5DdXJyZW50UnhCdWZmZXJJZCA9IFJ4QnVmZmVySWQ7Ci0KLQlpZiAoMSAhPSBPU19NRU1PUllfQUxMT0MoKHZvaWQqICopJnBXYjM1UngtPnBEUngsIE1BWF9VU0JfUlhfQlVGRkVSKSkgewotCQlwcmludGsoInczNXVuZDogUnggbWVtb3J5IGFsbG9jIGZhaWxlZFxuIik7Ci0JCWdvdG8gZXJyb3I7Ci0JfQotCXBSeEJ1ZmZlckFkZHJlc3MgPSBwV2IzNVJ4LT5wRFJ4OwotCi0JdXNiX2ZpbGxfYnVsa191cmIocFVyYiwgcEh3RGF0YS0+V2JVc2IudWRldiwKLQkJCSAgdXNiX3JjdmJ1bGtwaXBlKHBId0RhdGEtPldiVXNiLnVkZXYsIDMpLAotCQkJICBwUnhCdWZmZXJBZGRyZXNzLCBNQVhfVVNCX1JYX0JVRkZFUiwKLQkJCSAgV2IzNVJ4X0NvbXBsZXRlLCBwSHdEYXRhKTsKLQotCXBXYjM1UngtPkVQM3ZtX3N0YXRlID0gVk1fUlVOTklORzsKLQotCXJldHYgPSB3Yl91c2Jfc3VibWl0X3VyYihwVXJiKTsKLQotCWlmIChyZXR2ICE9IDApIHsKLQkJcHJpbnRrKCJSeCBVUkIgc2VuZGluZyBlcnJvclxuIik7Ci0JCWdvdG8gZXJyb3I7Ci0JfQotCXJldHVybjsKLQotZXJyb3I6Ci0JLy8gVk0gc3RvcAotCXBXYjM1UngtPkVQM3ZtX3N0YXRlID0gVk1fU1RPUDsKLQlPU19BVE9NSUNfREVDKCBwSHdEYXRhLT5BZGFwdGVyLCAmcFdiMzVSeC0+UnhGaXJlQ291bnRlciApOwotfQotCi12b2lkIFdiMzVSeF9Db21wbGV0ZShQVVJCIHBVcmIpCi17Ci0JcGh3X2RhdGFfdAlwSHdEYXRhID0gcFVyYi0+Y29udGV4dDsKLQlQV0IzNVJYCQlwV2IzNVJ4ID0gJnBId0RhdGEtPldiMzVSeDsKLQl1OCAqCQlwUnhCdWZmZXJBZGRyZXNzOwotCXUzMgkJU2l6ZUNoZWNrOwotCXUxNgkJQnVsa0xlbmd0aDsKLQl1MzIJCVJ4QnVmZmVySWQ7Ci0JUjAwX0RFU0NSSVBUT1IgCVIwMDsKLQotCS8vIFZhcmlhYmxlIHNldHRpbmcKLQlwV2IzNVJ4LT5FUDN2bV9zdGF0ZSA9IFZNX0NPTVBMRVRFRDsKLQlwV2IzNVJ4LT5FUDNWTV9zdGF0dXMgPSBwVXJiLT5zdGF0dXM7Ly9TdG9yZSB0aGUgbGFzdCByZXN1bHQgb2YgSXJwCi0KLQlSeEJ1ZmZlcklkID0gcFdiMzVSeC0+Q3VycmVudFJ4QnVmZmVySWQ7Ci0KLQlwUnhCdWZmZXJBZGRyZXNzID0gcFdiMzVSeC0+cERSeDsKLQlCdWxrTGVuZ3RoID0gKHUxNilwVXJiLT5hY3R1YWxfbGVuZ3RoOwotCi0JLy8gVGhlIElSUCBpcyBjb21wbGV0ZWQKLQlwV2IzNVJ4LT5FUDN2bV9zdGF0ZSA9IFZNX0NPTVBMRVRFRDsKLQotCWlmIChwSHdEYXRhLT5TdXJwcmlzZVJlbW92ZSB8fCBwSHdEYXRhLT5Id1N0b3ApIC8vIE11c3QgYmUgaGVyZSwgb3IgUnhCdWZmZXJJZCBpcyBpbnZhbGlkCi0JCWdvdG8gZXJyb3I7Ci0KLQlpZiAocFdiMzVSeC0+cnhfaGFsdCkKLQkJZ290byBlcnJvcjsKLQotCS8vIFN0YXJ0IHRvIHByb2Nlc3MgdGhlIGRhdGEgb25seSBpbiBzdWNjZXNzZnVsIGNvbmRpdGlvbgotCXBXYjM1UngtPlJ4T3duZXJbIFJ4QnVmZmVySWQgXSA9IDA7IC8vIFNldCB0aGUgb3duZXIgdG8gZHJpdmVyCi0JUjAwLnZhbHVlID0gbGUzMl90b19jcHUoKih1MzIgKilwUnhCdWZmZXJBZGRyZXNzKTsKLQotCS8vIFRoZSBVUkIgaXMgY29tcGxldGVkLCBjaGVjayB0aGUgcmVzdWx0Ci0JaWYgKHBXYjM1UngtPkVQM1ZNX3N0YXR1cyAhPSAwKSB7Ci0JCSNpZmRlZiBfUEVfVVNCX1NUQVRFX0RVTVBfCi0JCVdCREVCVUcoKCJFUDMgSW9Db21wbGV0ZVJvdXRpbmUgcmV0dXJuIGVycm9yXG4iKSk7Ci0JCURlYnVnVXNiZFN0YXR1c0luZm9ybWF0aW9uKCBwV2IzNVJ4LT5FUDNWTV9zdGF0dXMgKTsKLQkJI2VuZGlmCi0JCXBXYjM1UngtPkVQM3ZtX3N0YXRlID0gVk1fU1RPUDsKLQkJZ290byBlcnJvcjsKLQl9Ci0KLQkvLyAyMDA2MDIyMCBGb3IgcmVjb3ZlcmluZy4gY2hlY2sgaWYgb3BlcmF0aW5nIGluIHNpbmdsZSBVU0IgbW9kZQotCWlmICghSEFMX1VTQl9NT0RFX0JVUlNUKHBId0RhdGEpKSB7Ci0JCVNpemVDaGVjayA9IFIwMC5SMDBfcmVjZWl2ZV9ieXRlX2NvdW50OyAgLy8yMDA2MDkyNiBhbnNvbidzIGVuZGlhbgotCQlpZiAoKFNpemVDaGVjayAmIDB4MDMpID4gMCkKLQkJCVNpemVDaGVjayAtPSA0OwotCQlTaXplQ2hlY2sgPSAoU2l6ZUNoZWNrICsgMykgJiB+MHgwMzsKLQkJU2l6ZUNoZWNrICs9IDEyOyAvLyA4ICsgNCBiYWRiZWVmCi0JCWlmICgoQnVsa0xlbmd0aCA+IDE2MDApIHx8Ci0JCQkoU2l6ZUNoZWNrID4gMTYwMCkgfHwKLQkJCShCdWxrTGVuZ3RoICE9IFNpemVDaGVjaykgfHwKLQkJCShCdWxrTGVuZ3RoID09IDApKSB7IC8vIEFkZCBmb3IgZmFpbCBVcmIKLQkJCXBXYjM1UngtPkVQM3ZtX3N0YXRlID0gVk1fU1RPUDsKLQkJCXBXYjM1UngtPkVwM0Vycm9yQ291bnQyKys7Ci0JCX0KLQl9Ci0KLQkvLyBJbmRpY2F0aW5nIHRoZSByZWNlaXZpbmcgZGF0YQotCXBXYjM1UngtPkJ5dGVSZWNlaXZlZCArPSBCdWxrTGVuZ3RoOwotCXBXYjM1UngtPlJ4QnVmZmVyU2l6ZVsgUnhCdWZmZXJJZCBdID0gQnVsa0xlbmd0aDsKLQotCWlmICghcFdiMzVSeC0+UnhPd25lclsgUnhCdWZmZXJJZCBdKQotCQlXYjM1UnhfaW5kaWNhdGUocEh3RGF0YSk7Ci0KLQlrZnJlZShwV2IzNVJ4LT5wRFJ4KTsKLQkvLyBEbyB0aGUgbmV4dCByZWNlaXZlCi0JV2IzNVJ4KHBId0RhdGEpOwotCXJldHVybjsKLQotZXJyb3I6Ci0JcFdiMzVSeC0+UnhPd25lclsgUnhCdWZmZXJJZCBdID0gMTsgLy8gU2V0IHRoZSBvd25lciB0byBoYXJkd2FyZQotCU9TX0FUT01JQ19ERUMoIHBId0RhdGEtPkFkYXB0ZXIsICZwV2IzNVJ4LT5SeEZpcmVDb3VudGVyICk7Ci0JcFdiMzVSeC0+RVAzdm1fc3RhdGUgPSBWTV9TVE9QOwotfQotCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLXVuc2lnbmVkIGNoYXIgV2IzNVJ4X2luaXRpYWwocGh3X2RhdGFfdCBwSHdEYXRhKQotewotCVBXQjM1UlggcFdiMzVSeCA9ICZwSHdEYXRhLT5XYjM1Ung7Ci0KLQkvLyBJbml0aWFsIHRoZSBCdWZmZXIgUXVldWUKLQlXYjM1UnhfcmVzZXRfZGVzY3JpcHRvciggcEh3RGF0YSApOwotCi0JcFdiMzVSeC0+UnhVcmIgPSB3Yl91c2JfYWxsb2NfdXJiKDApOwotCXJldHVybiAoISFwV2IzNVJ4LT5SeFVyYik7Ci19Ci0KLXZvaWQgV2IzNVJ4X3N0b3AocGh3X2RhdGFfdCBwSHdEYXRhKQotewotCVBXQjM1UlggcFdiMzVSeCA9ICZwSHdEYXRhLT5XYjM1Ung7Ci0KLQkvLyBDYW5jZWxpbmcgdGhlIElycCBpZiBhbHJlYWR5IHNlbmRzIGl0IG91dC4KLQlpZiAocFdiMzVSeC0+RVAzdm1fc3RhdGUgPT0gVk1fUlVOTklORykgewotCQl1c2JfdW5saW5rX3VyYiggcFdiMzVSeC0+UnhVcmIgKTsgLy8gT25seSB1c2UgdW5saW5rLCBsZXQgV2IzNVJ4X2Rlc3Ryb3kgdG8gZnJlZSB0aGVtCi0JCSNpZmRlZiBfUEVfUlhfRFVNUF8KLQkJV0JERUJVRygoIkVQMyBSeCBzdG9wXG4iKSk7Ci0JCSNlbmRpZgotCX0KLX0KLQotLy8gTmVlZHMgcHJvY2VzcyBjb250ZXh0Ci12b2lkIFdiMzVSeF9kZXN0cm95KHBod19kYXRhX3QgcEh3RGF0YSkKLXsKLQlQV0IzNVJYIHBXYjM1UnggPSAmcEh3RGF0YS0+V2IzNVJ4OwotCi0JZG8gewotCQlPU19TTEVFUCgxMDAwMCk7IC8vIERlbGF5IGZvciB3YWl0aW5nIGZ1bmN0aW9uIGVudGVyIDk0MDYyMy4xLmEKLQl9IHdoaWxlIChwV2IzNVJ4LT5FUDN2bV9zdGF0ZSAhPSBWTV9TVE9QKTsKLQlPU19TTEVFUCgxMDAwMCk7IC8vIERlbGF5IGZvciB3YWl0aW5nIGZ1bmN0aW9uIGV4aXQgOTQwNjIzLjEuYgotCi0JaWYgKHBXYjM1UngtPlJ4VXJiKQotCQl1c2JfZnJlZV91cmIoIHBXYjM1UngtPlJ4VXJiICk7Ci0JI2lmZGVmIF9QRV9SWF9EVU1QXwotCVdCREVCVUcoKCJXYjM1UnhfZGVzdHJveSBPS1xuIikpOwotCSNlbmRpZgotfQotCi12b2lkIFdiMzVSeF9yZXNldF9kZXNjcmlwdG9yKCAgcGh3X2RhdGFfdCBwSHdEYXRhICkKLXsKLQlQV0IzNVJYIHBXYjM1UnggPSAmcEh3RGF0YS0+V2IzNVJ4OwotCXUzMglpOwotCi0JcFdiMzVSeC0+Qnl0ZVJlY2VpdmVkID0gMDsKLQlwV2IzNVJ4LT5SeFByb2Nlc3NJbmRleCA9IDA7Ci0JcFdiMzVSeC0+UnhCdWZmZXJJZCA9IDA7Ci0JcFdiMzVSeC0+RVAzdm1fc3RhdGUgPSBWTV9TVE9QOwotCXBXYjM1UngtPnJ4X2hhbHQgPSAwOwotCi0JLy8gSW5pdGlhbCB0aGUgUXVldWUuIFRoZSBsYXN0IGJ1ZmZlciBpcyByZXNlcnZlZCBmb3IgdXNlZCBpZiB0aGUgUnggcmVzb3VyY2UgaXMgdW5hdmFpbGFibGUuCi0JZm9yKCBpPTA7IGk8TUFYX1VTQl9SWF9CVUZGRVJfTlVNQkVSOyBpKysgKQotCQlwV2IzNVJ4LT5SeE93bmVyW2ldID0gMTsKLX0KLQotdm9pZCBXYjM1UnhfYWRqdXN0KFBERVNDUklQVE9SIHBSeERlcykKLXsKLQl1MzIgKglwUnhCdWZmZXJBZGRyZXNzOwotCXUzMglEZWNyeXB0aW9uTWV0aG9kOwotCXUzMglpOwotCXUxNglCdWZmZXJTaXplOwotCi0JRGVjcnlwdGlvbk1ldGhvZCA9IHBSeERlcy0+UjAxLlIwMV9kZWNyeXB0aW9uX21ldGhvZDsKLQlwUnhCdWZmZXJBZGRyZXNzID0gcFJ4RGVzLT5idWZmZXJfYWRkcmVzc1swXTsKLQlCdWZmZXJTaXplID0gcFJ4RGVzLT5idWZmZXJfc2l6ZVswXTsKLQotCS8vIEFkanVzdCB0aGUgbGFzdCBwYXJ0IG9mIGRhdGEuIE9ubHkgZGF0YSBsZWZ0Ci0JQnVmZmVyU2l6ZSAtPSA0OyAvLyBGb3IgQ1JDLTMyCi0JaWYgKERlY3J5cHRpb25NZXRob2QpCi0JCUJ1ZmZlclNpemUgLT0gNDsKLQlpZiAoRGVjcnlwdGlvbk1ldGhvZCA9PSAzKSAvLyBGb3IgQ0NNUAotCQlCdWZmZXJTaXplIC09IDQ7Ci0KLQkvLyBBZGp1c3QgdGhlIElWIGZpZWxkIHdoaWNoIGFmdGVyIDgwMi4xMSBoZWFkZXIgYW5kIElDViBmaWVsZC4KLQlpZiAoRGVjcnlwdGlvbk1ldGhvZCA9PSAxKSAvLyBGb3IgV0VQCi0JewotCQlmb3IoIGk9NjsgaT4wOyBpLS0gKQotCQkJcFJ4QnVmZmVyQWRkcmVzc1tpXSA9IHBSeEJ1ZmZlckFkZHJlc3NbaS0xXTsKLQkJcFJ4RGVzLT5idWZmZXJfYWRkcmVzc1swXSA9IHBSeEJ1ZmZlckFkZHJlc3MgKyAxOwotCQlCdWZmZXJTaXplIC09IDQ7IC8vIDQgYnl0ZSBmb3IgSVYKLQl9Ci0JZWxzZSBpZiggRGVjcnlwdGlvbk1ldGhvZCApIC8vIEZvciBUS0lQIGFuZCBDQ01QCi0JewotCQlmb3IgKGk9NzsgaT4xOyBpLS0pCi0JCQlwUnhCdWZmZXJBZGRyZXNzW2ldID0gcFJ4QnVmZmVyQWRkcmVzc1tpLTJdOwotCQlwUnhEZXMtPmJ1ZmZlcl9hZGRyZXNzWzBdID0gcFJ4QnVmZmVyQWRkcmVzcyArIDI7Ly9VcGRhdGUgdGhlIGRlc2NyaXB0b3IsIHNoaWZ0IDggYnl0ZQotCQlCdWZmZXJTaXplIC09IDg7IC8vIDggYnl0ZSBmb3IgSVYgKyBJQ1YKLQl9Ci0JcFJ4RGVzLT5idWZmZXJfc2l6ZVswXSA9IEJ1ZmZlclNpemU7Ci19Ci0KLWV4dGVybiB2b2lkIHBhY2tldF9jYW1lKGNoYXIgKnBSeEJ1ZmZlckFkZHJlc3MsIGludCBQYWNrZXRTaXplKTsKLQotCi11MTYgV2IzNVJ4X2luZGljYXRlKHBod19kYXRhX3QgcEh3RGF0YSkKLXsKLQlERVNDUklQVE9SCVJ4RGVzOwotCVBXQjM1UlgJcFdiMzVSeCA9ICZwSHdEYXRhLT5XYjM1Ung7Ci0JdTggKgkJcFJ4QnVmZmVyQWRkcmVzczsKLQl1MTYJCVBhY2tldFNpemU7Ci0JdTE2CQlzdG1wLCBCdWZmZXJTaXplLCBzdG1wMiA9IDA7Ci0JdTMyCQlSeEJ1ZmZlcklkOwotCi0JLy8gT25seSBvbmUgdGhyZWFkIGJlIGFsbG93ZWQgdG8gcnVuIGludG8gdGhlIGZvbGxvd2luZwotCWRvIHsKLQkJUnhCdWZmZXJJZCA9IHBXYjM1UngtPlJ4UHJvY2Vzc0luZGV4OwotCQlpZiAocFdiMzVSeC0+UnhPd25lclsgUnhCdWZmZXJJZCBdKSAvL093bmVyIGJ5IFZNCi0JCQlicmVhazsKLQotCQlwV2IzNVJ4LT5SeFByb2Nlc3NJbmRleCsrOwotCQlwV2IzNVJ4LT5SeFByb2Nlc3NJbmRleCAlPSBNQVhfVVNCX1JYX0JVRkZFUl9OVU1CRVI7Ci0KLQkJcFJ4QnVmZmVyQWRkcmVzcyA9IHBXYjM1UngtPnBEUng7Ci0JCUJ1ZmZlclNpemUgPSBwV2IzNVJ4LT5SeEJ1ZmZlclNpemVbIFJ4QnVmZmVySWQgXTsKLQotCQkvLyBQYXJzZSB0aGUgYnVsa2luIGJ1ZmZlcgotCQl3aGlsZSAoQnVmZmVyU2l6ZSA+PSA0KSB7Ci0JCQlpZiAoKGNwdV90b19sZTMyKCoodTMyICopcFJ4QnVmZmVyQWRkcmVzcykgJiAweDBmZmZmZmZmKSA9PSBSWF9FTkRfVEFHKSAvL0lzIGVuZGluZz8gOTIxMDAyLjkuYQotCQkJCWJyZWFrOwotCi0JCQkvLyBHZXQgdGhlIFIwMCBSMDEgZmlyc3QKLQkJCVJ4RGVzLlIwMC52YWx1ZSA9IGxlMzJfdG9fY3B1KCoodTMyICopcFJ4QnVmZmVyQWRkcmVzcyk7Ci0JCQlQYWNrZXRTaXplID0gKHUxNilSeERlcy5SMDAuUjAwX3JlY2VpdmVfYnl0ZV9jb3VudDsKLQkJCVJ4RGVzLlIwMS52YWx1ZSA9IGxlMzJfdG9fY3B1KCooKHUzMiAqKShwUnhCdWZmZXJBZGRyZXNzKzQpKSk7Ci0JCQkvLyBGb3IgbmV3IERNQSA0awotCQkJaWYgKChQYWNrZXRTaXplICYgMHgwMykgPiAwKQotCQkJCVBhY2tldFNpemUgLT0gNDsKLQotCQkJLy8gQmFzaWMgY2hlY2sgZm9yIFJ4IGxlbmd0aC4gSXMgbGVuZ3RoIHZhbGlkPwotCQkJaWYgKFBhY2tldFNpemUgPiBNQVhfUEFDS0VUX1NJWkUpIHsKLQkJCQkjaWZkZWYgX1BFX1JYX0RVTVBfCi0JCQkJV0JERUJVRygoIlNlcmlvdXMgRVJST1IgOiBSeCBkYXRhIHNpemUgdG9vIGxvbmcsIHNpemUgPSVkXG4iLCBQYWNrZXRTaXplKSk7Ci0JCQkJI2VuZGlmCi0KLQkJCQlwV2IzNVJ4LT5FUDN2bV9zdGF0ZSA9IFZNX1NUT1A7Ci0JCQkJcFdiMzVSeC0+RXAzRXJyb3JDb3VudDIrKzsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJLy8gU3RhcnQgdG8gcHJvY2VzcyBSeCBidWZmZXIKLS8vCQkJUnhEZXMuRGVzY3JpcHRvcl9JRCA9IFJ4QnVmZmVySWQ7IC8vIER1ZSB0byBzeW5jaHJvbm91cyBpbmRpY2F0ZSwgdGhlIGZpZWxkIGRvZXNuJ3QgbmVjZXNzYXJ5IHRvIHVzZS4KLQkJCUJ1ZmZlclNpemUgLT0gODsgLy9zdWJ0cmFjdCA4IGJ5dGUgZm9yIDM1J3MgVVNCIGhlYWRlciBsZW5ndGgKLQkJCXBSeEJ1ZmZlckFkZHJlc3MgKz0gODsKLQotCQkJUnhEZXMuYnVmZmVyX2FkZHJlc3NbMF0gPSBwUnhCdWZmZXJBZGRyZXNzOwotCQkJUnhEZXMuYnVmZmVyX3NpemVbMF0gPSBQYWNrZXRTaXplOwotCQkJUnhEZXMuYnVmZmVyX251bWJlciA9IDE7Ci0JCQlSeERlcy5idWZmZXJfc3RhcnRfaW5kZXggPSAwOwotCQkJUnhEZXMuYnVmZmVyX3RvdGFsX3NpemUgPSBSeERlcy5idWZmZXJfc2l6ZVswXTsKLQkJCVdiMzVSeF9hZGp1c3QoJlJ4RGVzKTsKLQotCQkJcGFja2V0X2NhbWUocFJ4QnVmZmVyQWRkcmVzcywgUGFja2V0U2l6ZSk7Ci0KLQkJCS8vIE1vdmUgUnhCdWZmZXIgcG9pbnQgdG8gdGhlIG5leHQKLQkJCXN0bXAgPSBQYWNrZXRTaXplICsgMzsKLQkJCXN0bXAgJj0gfjB4MDM7IC8vIDRuIGFsaWdubWVudAotCQkJcFJ4QnVmZmVyQWRkcmVzcyArPSBzdG1wOwotCQkJQnVmZmVyU2l6ZSAtPSBzdG1wOwotCQkJc3RtcDIgKz0gc3RtcDsKLQkJfQotCi0JCS8vIFJlY2xhaW0gcmVzb3VyY2UKLQkJcFdiMzVSeC0+UnhPd25lclsgUnhCdWZmZXJJZCBdID0gMTsKLQl9IHdoaWxlKFRSVUUpOwotCi0JcmV0dXJuIHN0bXAyOwotfQotCi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL2xpbnV4L3diMzVyeF9mLmggYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9saW51eC93YjM1cnhfZi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYWEzZTczLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL2xpbnV4L3diMzVyeF9mLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gSW50ZXJmYWNlIGZ1bmN0aW9uIGRlY2xhcmUKLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci12b2lkCQlXYjM1UnhfcmVzZXRfZGVzY3JpcHRvciggIHBod19kYXRhX3QgcEh3RGF0YSApOwotdW5zaWduZWQgY2hhcgkJV2IzNVJ4X2luaXRpYWwoICBwaHdfZGF0YV90IHBId0RhdGEgKTsKLXZvaWQJCVdiMzVSeF9kZXN0cm95KCAgcGh3X2RhdGFfdCBwSHdEYXRhICk7Ci12b2lkCQlXYjM1Unhfc3RvcCggIHBod19kYXRhX3QgcEh3RGF0YSApOwotdTE2CQlXYjM1UnhfaW5kaWNhdGUoICBwaHdfZGF0YV90IHBId0RhdGEgKTsKLXZvaWQJCVdiMzVSeF9hZGp1c3QoICBQREVTQ1JJUFRPUiBwUnhEZXMgKTsKLXZvaWQJCVdiMzVSeF9zdGFydCggIHBod19kYXRhX3QgcEh3RGF0YSApOwotCi12b2lkCQlXYjM1UngoICBwaHdfZGF0YV90IHBId0RhdGEgKTsKLXZvaWQJCVdiMzVSeF9Db21wbGV0ZSggIFBVUkIgcFVyYiApOwotCi0KLQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9saW51eC93YjM1cnhfcy5oIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbGludXgvd2IzNXJ4X3MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjkwYzI2OS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9saW51eC93YjM1cnhfcy5oCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyB3YjM1cnguaCAtLQotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLS8vIERlZmluaXRpb24gZm9yIHRoaXMgbW9kdWxlIHVzZWQKLSNkZWZpbmUgTUFYX1VTQl9SWF9CVUZGRVIJNDA5NgkvLyBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIDQwOTYgOTMxMTMwLjQuZgotCi0jZGVmaW5lIE1BWF9VU0JfUlhfQlVGRkVSX05VTUJFUglFVEhFUk5FVF9SWF9ERVNDUklQVE9SUwkJLy8gTWF4aW11bSAyNTQsIDI1NSBpcyBSRVNFUlZFRCBJRAotI2RlZmluZSBSWF9JTlRFUkZBQ0UJCQkJMAkvLyBJbnRlcmZhY2UgMQotI2RlZmluZSBSWF9QSVBFCQkJCQkJMgkvLyBQaXBlIDMKLSNkZWZpbmUgTUFYX1BBQ0tFVF9TSVpFCQkJCTE2MDAgLy8xNTY4CS8vIDggKyAxNTMyICsgNCArIDI0KElWIEVJViBNSUMgSUNWIENSQykgZm9yIGNoZWNrIERNQSBkYXRhIDkzMTEzMC40LmcKLSNkZWZpbmUgUlhfRU5EX1RBRwkJCQkJMHgwYmFkYmVlZgotCi0KLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBJbnRlcm5hbCB2YXJpYWJsZSBmb3IgbW9kdWxlCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotdHlwZWRlZiBzdHJ1Y3QgX1dCMzVSWAotewotCXUzMgkJCUJ5dGVSZWNlaXZlZDsvLyBGb3IgY2FsY3VsYXRpbmcgdGhyb3VnaHB1dCBvZiBCdWxrSW4KLQlPU19BVE9NSUMJCVJ4RmlyZUNvdW50ZXI7Ly8gRG9lcyBXYjM1UnggbW9kdWxlIGZpcmU/Ci0KLQl1OAlSeEJ1ZmZlclsgTUFYX1VTQl9SWF9CVUZGRVJfTlVNQkVSIF1bICgoTUFYX1VTQl9SWF9CVUZGRVIrMykgJiB+MHgwMyApIF07Ci0JdTE2CVJ4QnVmZmVyU2l6ZVsgKChNQVhfVVNCX1JYX0JVRkZFUl9OVU1CRVIrMSkgJiB+MHgwMSkgXTsKLQl1OAlSeE93bmVyWyAoKE1BWF9VU0JfUlhfQlVGRkVSX05VTUJFUiszKSAmIH4weDAzICkgXTsvL093bmVyc2hpcCBvZiBidWZmZXIgIDA6IFNXIDE6SFcKLQotCXUzMglSeFByb2Nlc3NJbmRleDsvL1RoZSBuZXh0IGluZGV4IHRvIHByb2Nlc3MKLQl1MzIJUnhCdWZmZXJJZDsKLQl1MzIJRVAzdm1fc3RhdGU7Ci0KLQl1MzIJcnhfaGFsdDsgLy8gRm9yIFZNIHN0b3BwaW5nCi0KLQl1MTYJTW9yZURhdGFTaXplOwotCXUxNglQYWNrZXRTaXplOwotCi0JdTMyCUN1cnJlbnRSeEJ1ZmZlcklkOyAvLyBGb3IgY29tcGxldGUgcm91dGluZSB1c2FnZQotCXUzMglSeDNVcmJDYW5jZWw7Ci0KLQl1MzIJTGFzdFIxOyAvLyBGb3IgUlNTSSByZXBvcnRpbmcKLQlzdHJ1Y3QgdXJiICoJCQkJUnhVcmI7Ci0JdTMyCQlFcDNFcnJvckNvdW50MjsgLy8gMjAwNjA2MjUuMSBVc2JkIGZvciBSeCBETUEgZXJyb3IgY291bnQKLQotCWludAkJRVAzVk1fc3RhdHVzOwotCXU4ICoJcERSeDsKLQotfSBXQjM1UlgsICpQV0IzNVJYOwotCi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL2xpbnV4L3diMzV0eC5jIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbGludXgvd2IzNXR4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhOWQ1MTIuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbGludXgvd2IzNXR4LmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMDcgKzAsMCBAQAotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyAgQ29weXJpZ2h0IChjKSAxOTk2LTIwMDIgV2luYm9uZCBFbGVjdHJvbmljIENvcnBvcmF0aW9uCi0vLwotLy8gIE1vZHVsZSBOYW1lOgotLy8gICAgV2IzNVR4LmMKLS8vCi0vLyAgQWJzdHJhY3Q6Ci0vLyAgICBQcm9jZXNzaW5nIHRoZSBUeCBtZXNzYWdlIGFuZCBwdXQgaW50byBkb3duIGxheWVyCi0vLwotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jaW5jbHVkZSAic3lzZGVmLmgiCi0KLQotdW5zaWduZWQgY2hhcgotV2IzNVR4X2dldF90eF9idWZmZXIocGh3X2RhdGFfdCBwSHdEYXRhLCB1OCAqKnBCdWZmZXIpCi17Ci0JUFdCMzVUWCBwV2IzNVR4ID0gJnBId0RhdGEtPldiMzVUeDsKLQotCSpwQnVmZmVyID0gcFdiMzVUeC0+VHhCdWZmZXJbMF07Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLXZvaWQgV2IzNVR4X3N0YXJ0KHBod19kYXRhX3QgcEh3RGF0YSkKLXsKLQlQV0IzNVRYIHBXYjM1VHggPSAmcEh3RGF0YS0+V2IzNVR4OwotCi0JLy8gQWxsb3cgb25seSBvbmUgdGhyZWFkIHRvIHJ1biBpbnRvIGZ1bmN0aW9uCi0JaWYgKE9TX0FUT01JQ19JTkMocEh3RGF0YS0+QWRhcHRlciwgJnBXYjM1VHgtPlR4RmlyZUNvdW50ZXIpID09IDEpIHsKLQkJcFdiMzVUeC0+RVA0dm1fc3RhdGUgPSBWTV9SVU5OSU5HOwotCQlXYjM1VHgocEh3RGF0YSk7Ci0JfSBlbHNlCi0JCU9TX0FUT01JQ19ERUMoIHBId0RhdGEtPkFkYXB0ZXIsICZwV2IzNVR4LT5UeEZpcmVDb3VudGVyICk7Ci19Ci0KLQotdm9pZCBXYjM1VHgocGh3X2RhdGFfdCBwSHdEYXRhKQotewotCVBXQjM1VFgJCXBXYjM1VHggPSAmcEh3RGF0YS0+V2IzNVR4OwotCVBBREFQVEVSCUFkYXB0ZXIgPSBwSHdEYXRhLT5BZGFwdGVyOwotCXU4CQkqcFR4QnVmZmVyQWRkcmVzczsKLQlQTURTCQlwTWRzID0gJkFkYXB0ZXItPk1kczsKLQlzdHJ1Y3QgdXJiICoJcFVyYiA9IChzdHJ1Y3QgdXJiICopcFdiMzVUeC0+VHg0VXJiOwotCWludCAgICAgICAgIAlyZXR2OwotCXUzMgkJU2VuZEluZGV4OwotCi0KLQlpZiAocEh3RGF0YS0+U3VycHJpc2VSZW1vdmUgfHwgcEh3RGF0YS0+SHdTdG9wKQotCQlnb3RvIGNsZWFudXA7Ci0KLQlpZiAocFdiMzVUeC0+dHhfaGFsdCkKLQkJZ290byBjbGVhbnVwOwotCi0JLy8gT3duZXJzaGlwIGNoZWNraW5nCi0JU2VuZEluZGV4ID0gcFdiMzVUeC0+VHhTZW5kSW5kZXg7Ci0JaWYgKCFwTWRzLT5UeE93bmVyW1NlbmRJbmRleF0pIC8vTm8gbW9yZSBkYXRhIG5lZWQgdG8gYmUgc2VudCwgcmV0dXJuIGltbWVkaWF0ZWx5Ci0JCWdvdG8gY2xlYW51cDsKLQotCXBUeEJ1ZmZlckFkZHJlc3MgPSBwV2IzNVR4LT5UeEJ1ZmZlcltTZW5kSW5kZXhdOwotCS8vCi0JLy8gSXNzdWluZyBVUkIKLQkvLwotCXVzYl9maWxsX2J1bGtfdXJiKHBVcmIsIHBId0RhdGEtPldiVXNiLnVkZXYsCi0JCQkgIHVzYl9zbmRidWxrcGlwZShwSHdEYXRhLT5XYlVzYi51ZGV2LCA0KSwKLQkJCSAgcFR4QnVmZmVyQWRkcmVzcywgcE1kcy0+VHhCdWZmZXJTaXplWyBTZW5kSW5kZXggXSwKLQkJCSAgV2IzNVR4X2NvbXBsZXRlLCBwSHdEYXRhKTsKLQotCXBXYjM1VHgtPkVQNHZtX3N0YXRlID0gVk1fUlVOTklORzsKLQlyZXR2ID0gd2JfdXNiX3N1Ym1pdF91cmIoIHBVcmIgKTsKLQlpZiAocmV0djwwKSB7Ci0JCXByaW50aygiRVA0IFR4IElycCBzZW5kaW5nIGVycm9yXG4iKTsKLQkJZ290byBjbGVhbnVwOwotCX0KLQotCS8vIENoZWNrIGlmIGRyaXZlciBuZWVkcyBpc3N1ZSBJcnAgZm9yIEVQMgotCXBXYjM1VHgtPlR4RmlsbENvdW50ICs9IHBNZHMtPlR4Q291bnRJbkJ1ZmZlcltTZW5kSW5kZXhdOwotCWlmIChwV2IzNVR4LT5UeEZpbGxDb3VudCA+IDEyKQotCQlXYjM1VHhfRVAyVk1fc3RhcnQoIHBId0RhdGEgKTsKLQotCXBXYjM1VHgtPkJ5dGVUcmFuc2ZlciArPSBwTWRzLT5UeEJ1ZmZlclNpemVbU2VuZEluZGV4XTsKLQlyZXR1cm47Ci0KLSBjbGVhbnVwOgotCXBXYjM1VHgtPkVQNHZtX3N0YXRlID0gVk1fU1RPUDsKLQlPU19BVE9NSUNfREVDKCBwSHdEYXRhLT5BZGFwdGVyLCAmcFdiMzVUeC0+VHhGaXJlQ291bnRlciApOwotfQotCi0KLXZvaWQgV2IzNVR4X2NvbXBsZXRlKHN0cnVjdCB1cmIgKiBwVXJiKQotewotCXBod19kYXRhX3QJcEh3RGF0YSA9IHBVcmItPmNvbnRleHQ7Ci0JUEFEQVBURVIJQWRhcHRlciA9IChQQURBUFRFUilwSHdEYXRhLT5BZGFwdGVyOwotCVBXQjM1VFgJCXBXYjM1VHggPSAmcEh3RGF0YS0+V2IzNVR4OwotCVBNRFMJCXBNZHMgPSAmQWRhcHRlci0+TWRzOwotCi0JcHJpbnRrKCJ3YjM1OiB0eCBjb21wbGV0ZVxuIik7Ci0JLy8gVmFyaWFibGUgc2V0dGluZwotCXBXYjM1VHgtPkVQNHZtX3N0YXRlID0gVk1fQ09NUExFVEVEOwotCXBXYjM1VHgtPkVQNFZNX3N0YXR1cyA9IHBVcmItPnN0YXR1czsgLy9TdG9yZSB0aGUgbGFzdCByZXN1bHQgb2YgSXJwCi0JcE1kcy0+VHhPd25lclsgcFdiMzVUeC0+VHhTZW5kSW5kZXggXSA9IDA7Ly8gU2V0IHRoZSBvd25lci4gRnJlZSB0aGUgb3duZXIgYml0IGFsd2F5cy4KLQlwV2IzNVR4LT5UeFNlbmRJbmRleCsrOwotCXBXYjM1VHgtPlR4U2VuZEluZGV4ICU9IE1BWF9VU0JfVFhfQlVGRkVSX05VTUJFUjsKLQotCWlmIChwSHdEYXRhLT5TdXJwcmlzZVJlbW92ZSB8fCBwSHdEYXRhLT5Id1N0b3ApIC8vIExldCBXYldsYW5IYWx0IHRvIGhhbmRsZSBzdXJwcmlzZSByZW1vdmUKLQkJZ290byBlcnJvcjsKLQotCWlmIChwV2IzNVR4LT50eF9oYWx0KQotCQlnb3RvIGVycm9yOwotCi0JLy8gVGhlIFVSQiBpcyBjb21wbGV0ZWQsIGNoZWNrIHRoZSByZXN1bHQKLQlpZiAocFdiMzVUeC0+RVA0Vk1fc3RhdHVzICE9IDApIHsKLQkJcHJpbnRrKCJVUkIgc3VibWlzc2lvbiBmYWlsZWRcbiIpOwotCQlwV2IzNVR4LT5FUDR2bV9zdGF0ZSA9IFZNX1NUT1A7Ci0JCWdvdG8gZXJyb3I7Ci0JfQotCi0JTWRzX1R4KEFkYXB0ZXIpOwotCVdiMzVUeChwSHdEYXRhKTsKLQlyZXR1cm47Ci0KLWVycm9yOgotCU9TX0FUT01JQ19ERUMoIHBId0RhdGEtPkFkYXB0ZXIsICZwV2IzNVR4LT5UeEZpcmVDb3VudGVyICk7Ci0JcFdiMzVUeC0+RVA0dm1fc3RhdGUgPSBWTV9TVE9QOwotfQotCi12b2lkIFdiMzVUeF9yZXNldF9kZXNjcmlwdG9yKCAgcGh3X2RhdGFfdCBwSHdEYXRhICkKLXsKLQlQV0IzNVRYIHBXYjM1VHggPSAmcEh3RGF0YS0+V2IzNVR4OwotCi0JcFdiMzVUeC0+VHhTZW5kSW5kZXggPSAwOwotCXBXYjM1VHgtPnR4X2hhbHQgPSAwOwotfQotCi11bnNpZ25lZCBjaGFyIFdiMzVUeF9pbml0aWFsKHBod19kYXRhX3QgcEh3RGF0YSkKLXsKLQlQV0IzNVRYIHBXYjM1VHggPSAmcEh3RGF0YS0+V2IzNVR4OwotCi0JcFdiMzVUeC0+VHg0VXJiID0gd2JfdXNiX2FsbG9jX3VyYigwKTsKLQlpZiAoIXBXYjM1VHgtPlR4NFVyYikKLQkJcmV0dXJuIEZBTFNFOwotCi0JcFdiMzVUeC0+VHgyVXJiID0gd2JfdXNiX2FsbG9jX3VyYigwKTsKLQlpZiAoIXBXYjM1VHgtPlR4MlVyYikKLQl7Ci0JCXVzYl9mcmVlX3VyYiggcFdiMzVUeC0+VHg0VXJiICk7Ci0JCXJldHVybiBGQUxTRTsKLQl9Ci0KLQlyZXR1cm4gVFJVRTsKLX0KLQotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLXZvaWQgV2IzNVR4X3N0b3AocGh3X2RhdGFfdCBwSHdEYXRhKQotewotCVBXQjM1VFggcFdiMzVUeCA9ICZwSHdEYXRhLT5XYjM1VHg7Ci0KLQkvLyBUcnlpbmcgdG8gY2FuY2VsaW5nIHRoZSBUcnAgb2YgRVAyCi0JaWYgKHBXYjM1VHgtPkVQMnZtX3N0YXRlID09IFZNX1JVTk5JTkcpCi0JCXVzYl91bmxpbmtfdXJiKCBwV2IzNVR4LT5UeDJVcmIgKTsgLy8gT25seSB1c2UgdW5saW5rLCBsZXQgV2IzNVR4X2Rlc3Ryb3QgdG8gZnJlZSB0aGVtCi0JI2lmZGVmIF9QRV9UWF9EVU1QXwotCVdCREVCVUcoKCJFUDIgVHggc3RvcFxuIikpOwotCSNlbmRpZgotCi0JLy8gVHJ5aW5nIHRvIGNhbmNlbGluZyB0aGUgSXJwIG9mIEVQNAotCWlmIChwV2IzNVR4LT5FUDR2bV9zdGF0ZSA9PSBWTV9SVU5OSU5HKQotCQl1c2JfdW5saW5rX3VyYiggcFdiMzVUeC0+VHg0VXJiICk7IC8vIE9ubHkgdXNlIHVubGluaywgbGV0IFdiMzVUeF9kZXN0cm90IHRvIGZyZWUgdGhlbQotCSNpZmRlZiBfUEVfVFhfRFVNUF8KLQlXQkRFQlVHKCgiRVA0IFR4IHN0b3BcbiIpKTsKLQkjZW5kaWYKLX0KLQotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLXZvaWQgV2IzNVR4X2Rlc3Ryb3kocGh3X2RhdGFfdCBwSHdEYXRhKQotewotCVBXQjM1VFggcFdiMzVUeCA9ICZwSHdEYXRhLT5XYjM1VHg7Ci0KLQkvLyBXYWl0IGZvciBWTSBzdG9wCi0JZG8gewotCQlPU19TTEVFUCgxMDAwMCk7ICAvLyBEZWxheSBmb3Igd2FpdGluZyBmdW5jdGlvbiBlbnRlciA5NDA2MjMuMS5hCi0JfSB3aGlsZSggKHBXYjM1VHgtPkVQMnZtX3N0YXRlICE9IFZNX1NUT1ApICYmIChwV2IzNVR4LT5FUDR2bV9zdGF0ZSAhPSBWTV9TVE9QKSApOwotCU9TX1NMRUVQKDEwMDAwKTsgIC8vIERlbGF5IGZvciB3YWl0aW5nIGZ1bmN0aW9uIGVudGVyIDk0MDYyMy4xLmIKLQotCWlmIChwV2IzNVR4LT5UeDRVcmIpCi0JCXVzYl9mcmVlX3VyYiggcFdiMzVUeC0+VHg0VXJiICk7Ci0KLQlpZiAocFdiMzVUeC0+VHgyVXJiKQotCQl1c2JfZnJlZV91cmIoIHBXYjM1VHgtPlR4MlVyYiApOwotCi0JI2lmZGVmIF9QRV9UWF9EVU1QXwotCVdCREVCVUcoKCJXYjM1VHhfZGVzdHJveSBPS1xuIikpOwotCSNlbmRpZgotfQotCi12b2lkIFdiMzVUeF9DdXJyZW50VGltZShwaHdfZGF0YV90IHBId0RhdGEsIHUzMiBUaW1lQ291bnQpCi17Ci0JUFdCMzVUWCBwV2IzNVR4ID0gJnBId0RhdGEtPldiMzVUeDsKLQl1bnNpZ25lZCBjaGFyIFRyaWdnZXIgPSBGQUxTRTsKLQotCWlmIChwV2IzNVR4LT5UeFRpbWVyID4gVGltZUNvdW50KQotCQlUcmlnZ2VyID0gVFJVRTsKLQllbHNlIGlmIChUaW1lQ291bnQgPiAocFdiMzVUeC0+VHhUaW1lcis1MDApKQotCQlUcmlnZ2VyID0gVFJVRTsKLQotCWlmIChUcmlnZ2VyKSB7Ci0JCXBXYjM1VHgtPlR4VGltZXIgPSBUaW1lQ291bnQ7Ci0JCVdiMzVUeF9FUDJWTV9zdGFydCggcEh3RGF0YSApOwotCX0KLX0KLQotdm9pZCBXYjM1VHhfRVAyVk1fc3RhcnQocGh3X2RhdGFfdCBwSHdEYXRhKQotewotCVBXQjM1VFggcFdiMzVUeCA9ICZwSHdEYXRhLT5XYjM1VHg7Ci0KLQkvLyBBbGxvdyBvbmx5IG9uZSB0aHJlYWQgdG8gcnVuIGludG8gZnVuY3Rpb24KLQlpZiAoT1NfQVRPTUlDX0lOQyggcEh3RGF0YS0+QWRhcHRlciwgJnBXYjM1VHgtPlR4UmVzdWx0Q291bnQgKSA9PSAxKSB7Ci0JCXBXYjM1VHgtPkVQMnZtX3N0YXRlID0gVk1fUlVOTklORzsKLQkJV2IzNVR4X0VQMlZNKCBwSHdEYXRhICk7Ci0JfQotCWVsc2UKLQkJT1NfQVRPTUlDX0RFQyggcEh3RGF0YS0+QWRhcHRlciwgJnBXYjM1VHgtPlR4UmVzdWx0Q291bnQgKTsKLX0KLQotCi12b2lkIFdiMzVUeF9FUDJWTShwaHdfZGF0YV90IHBId0RhdGEpCi17Ci0JUFdCMzVUWCBwV2IzNVR4ID0gJnBId0RhdGEtPldiMzVUeDsKLQlzdHJ1Y3QgdXJiICoJcFVyYiA9IChzdHJ1Y3QgdXJiICopcFdiMzVUeC0+VHgyVXJiOwotCXUzMiAqCXBsdG1wID0gKHUzMiAqKXBXYjM1VHgtPkVQMl9idWY7Ci0JaW50CQlyZXR2OwotCi0JaWYgKHBId0RhdGEtPlN1cnByaXNlUmVtb3ZlIHx8IHBId0RhdGEtPkh3U3RvcCkKLQkJZ290byBlcnJvcjsKLQotCWlmIChwV2IzNVR4LT50eF9oYWx0KQotCQlnb3RvIGVycm9yOwotCi0JLy8KLQkvLyBJc3N1aW5nIFVSQgotCS8vCi0JdXNiX2ZpbGxfaW50X3VyYiggcFVyYiwgcEh3RGF0YS0+V2JVc2IudWRldiwgdXNiX3JjdmludHBpcGUocEh3RGF0YS0+V2JVc2IudWRldiwyKSwKLQkJCSAgcGx0bXAsIE1BWF9JTlRFUlJVUFRfTEVOR1RILCBXYjM1VHhfRVAyVk1fY29tcGxldGUsIHBId0RhdGEsIDMyKTsKLQotCXBXYjM1VHgtPkVQMnZtX3N0YXRlID0gVk1fUlVOTklORzsKLQlyZXR2ID0gd2JfdXNiX3N1Ym1pdF91cmIoIHBVcmIgKTsKLQotCWlmIChyZXR2IDwgMCkgewotCQkjaWZkZWYgX1BFX1RYX0RVTVBfCi0JCVdCREVCVUcoKCJFUDIgVHggSXJwIHNlbmRpbmcgZXJyb3JcbiIpKTsKLQkJI2VuZGlmCi0JCWdvdG8gZXJyb3I7Ci0JfQotCi0JcmV0dXJuOwotZXJyb3I6Ci0JcFdiMzVUeC0+RVAydm1fc3RhdGUgPSBWTV9TVE9QOwotCU9TX0FUT01JQ19ERUMoIHBId0RhdGEtPkFkYXB0ZXIsICZwV2IzNVR4LT5UeFJlc3VsdENvdW50ICk7Ci19Ci0KLQotdm9pZCBXYjM1VHhfRVAyVk1fY29tcGxldGUoc3RydWN0IHVyYiAqIHBVcmIpCi17Ci0JcGh3X2RhdGFfdAlwSHdEYXRhID0gcFVyYi0+Y29udGV4dDsKLQlUMDJfREVTQ1JJUFRPUglUMDIsIFRTVEFUVVM7Ci0JUEFEQVBURVIJQWRhcHRlciA9IChQQURBUFRFUilwSHdEYXRhLT5BZGFwdGVyOwotCVBXQjM1VFgJCXBXYjM1VHggPSAmcEh3RGF0YS0+V2IzNVR4OwotCXUzMiAqCQlwbHRtcCA9ICh1MzIgKilwV2IzNVR4LT5FUDJfYnVmOwotCXUzMgkJaTsKLQl1MTYJCUludGVycnVwdEluTGVuZ3RoOwotCi0KLQkvLyBWYXJpYWJsZSBzZXR0aW5nCi0JcFdiMzVUeC0+RVAydm1fc3RhdGUgPSBWTV9DT01QTEVURUQ7Ci0JcFdiMzVUeC0+RVAyVk1fc3RhdHVzID0gcFVyYi0+c3RhdHVzOwotCi0JLy8gRm9yIExpbnV4IDIuNC4gSW50ZXJydXB0IHdpbGwgYWx3YXlzIHRyaWdnZXIKLQlpZiAocEh3RGF0YS0+U3VycHJpc2VSZW1vdmUgfHwgcEh3RGF0YS0+SHdTdG9wKSAvLyBMZXQgV2JXbGFuSGFsdCB0byBoYW5kbGUgc3VycHJpc2UgcmVtb3ZlCi0JCWdvdG8gZXJyb3I7Ci0KLQlpZiAocFdiMzVUeC0+dHhfaGFsdCkKLQkJZ290byBlcnJvcjsKLQotCS8vVGhlIFVyYiBpcyBjb21wbGV0ZWQsIGNoZWNrIHRoZSByZXN1bHQKLQlpZiAocFdiMzVUeC0+RVAyVk1fc3RhdHVzICE9IDApIHsKLQkJV0JERUJVRygoIkVQMiBJb0NvbXBsZXRlUm91dGluZSByZXR1cm4gZXJyb3JcbiIpKTsKLQkJcFdiMzVUeC0+RVAydm1fc3RhdGU9IFZNX1NUT1A7Ci0JCWdvdG8gZXJyb3I7Ci0JfQotCi0JLy8gVXBkYXRlIHRoZSBUeCByZXN1bHQKLQlJbnRlcnJ1cHRJbkxlbmd0aCA9IHBVcmItPmFjdHVhbF9sZW5ndGg7Ci0JLy8gTW9kaWZ5IGZvciBtaW5pbXVtIG1lbW9yeSBhY2Nlc3MgYW5kIERXT1JEIGFsaWdubWVudC4KLQlUMDIudmFsdWUgPSBjcHVfdG9fbGUzMihwbHRtcFswXSkgPj4gODsgLy8gWzMxOjhdIC0+IFsyNDowXQotCUludGVycnVwdEluTGVuZ3RoIC09IDE7Ly8gMjAwNTEyMjEuMS5jIE1vZGlmeSB0aGUgZm9sbG93IGZvciBtb3JlIHN0YWJsZQotCUludGVycnVwdEluTGVuZ3RoID4+PSAyOyAvLyBJbnRlcnJ1cHRJbkxlbmd0aC80Ci0JZm9yIChpID0gMTsgaSA8PSBJbnRlcnJ1cHRJbkxlbmd0aDsgaSsrKSB7Ci0JCVQwMi52YWx1ZSB8PSAoKGNwdV90b19sZTMyKHBsdG1wW2ldKSAmIDB4ZmYpIDw8IDI0KTsKLQotCQlUU1RBVFVTLnZhbHVlID0gVDAyLnZhbHVlOyAgLy8yMDA2MTAwOSBhbnNvbidzIGVuZGlhbgotCQlNZHNfU2VuZENvbXBsZXRlKCBBZGFwdGVyLCAmVFNUQVRVUyApOwotCQlUMDIudmFsdWUgPSBjcHVfdG9fbGUzMihwbHRtcFtpXSkgPj4gODsKLQl9Ci0KLQlyZXR1cm47Ci1lcnJvcjoKLQlPU19BVE9NSUNfREVDKCBwSHdEYXRhLT5BZGFwdGVyLCAmcFdiMzVUeC0+VHhSZXN1bHRDb3VudCApOwotCXBXYjM1VHgtPkVQMnZtX3N0YXRlID0gVk1fU1RPUDsKLX0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbGludXgvd2IzNXR4X2YuaCBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL2xpbnV4L3diMzV0eF9mLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwN2IxMjkuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbGludXgvd2IzNXR4X2YuaAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBJbnRlcmZhY2UgZnVuY3Rpb24gZGVjbGFyZQotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLXVuc2lnbmVkIGNoYXIgV2IzNVR4X2luaXRpYWwoCSBwaHdfZGF0YV90IHBId0RhdGEgKTsKLXZvaWQgV2IzNVR4X2Rlc3Ryb3koICBwaHdfZGF0YV90IHBId0RhdGEgKTsKLXVuc2lnbmVkIGNoYXIgV2IzNVR4X2dldF90eF9idWZmZXIoICBwaHdfZGF0YV90IHBId0RhdGEsICB1OCAqKnBCdWZmZXIgKTsKLQotdm9pZCBXYjM1VHhfRVAyVk0oICBwaHdfZGF0YV90IHBId0RhdGEgKTsKLXZvaWQgV2IzNVR4X0VQMlZNX3N0YXJ0KCAgcGh3X2RhdGFfdCBwSHdEYXRhICk7Ci12b2lkIFdiMzVUeF9FUDJWTV9jb21wbGV0ZSggIFBVUkIgcHVyYiApOwotCi12b2lkIFdiMzVUeF9zdGFydCggIHBod19kYXRhX3QgcEh3RGF0YSApOwotdm9pZCBXYjM1VHhfc3RvcCggIHBod19kYXRhX3QgcEh3RGF0YSApOwotdm9pZCBXYjM1VHgoICBwaHdfZGF0YV90IHBId0RhdGEgKTsKLXZvaWQgV2IzNVR4X2NvbXBsZXRlKCAgUFVSQiBwdXJiICk7Ci12b2lkIFdiMzVUeF9yZXNldF9kZXNjcmlwdG9yKCAgcGh3X2RhdGFfdCBwSHdEYXRhICk7Ci0KLXZvaWQgV2IzNVR4X0N1cnJlbnRUaW1lKCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgdTMyIFRpbWVDb3VudCApOwotCi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL2xpbnV4L3diMzV0eF9zLmggYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9saW51eC93YjM1dHhfcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzQzMjU3Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL2xpbnV4L3diMzV0eF9zLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gSVM4OUMzNSBUeCByZWxhdGVkIGRlZmluaXRpb24KLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jZGVmaW5lIFRYX0lOVEVSRkFDRQkJCTAJLy8gSW50ZXJmYWNlIDEKLSNkZWZpbmUgVFhfUElQRQkJCQkJMwkvLyBlbmRwb2ludCA0Ci0jZGVmaW5lIFRYX0lOVEVSUlVQVAkJCTEJLy8gZW5kcG9pbnQgMgotI2RlZmluZSBNQVhfSU5URVJSVVBUX0xFTkdUSAk2NAkvLyBJdCBtdXN0IGJlIDY0IGZvciBFUDIgaGFyZHdhcmUKLQotCi0KLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBJbnRlcm5hbCB2YXJpYWJsZSBmb3IgbW9kdWxlCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0KLXR5cGVkZWYgc3RydWN0IF9XQjM1VFgKLXsKLQkvLyBGb3IgVHggYnVmZmVyCi0JdTgJVHhCdWZmZXJbIE1BWF9VU0JfVFhfQlVGRkVSX05VTUJFUiBdWyBNQVhfVVNCX1RYX0JVRkZFUiBdOwotCi0JLy8gRm9yIEludGVycnVwdCBwaXBlCi0JdTgJRVAyX2J1ZltNQVhfSU5URVJSVVBUX0xFTkdUSF07Ci0KLQlPU19BVE9NSUMJVHhSZXN1bHRDb3VudDsvLyBGb3IgdGhyZWFkIGNvbnRyb2wgb2YgRVAyIDkzMTEzMC40Lm0KLQlPU19BVE9NSUMJVHhGaXJlQ291bnRlcjsvLyBGb3IgdGhyZWFkIGNvbnRyb2wgb2YgRVA0IDkzMTEzMC40Lm4KLQl1MzIJCQlCeXRlVHJhbnNmZXI7Ci0KLQl1MzIJICAgIFR4U2VuZEluZGV4Oy8vIFRoZSBuZXh0IGluZGV4IG9mIE1kcyBhcnJheSB0byBiZSBzZW50Ci0JdTMyCSAgICBFUDJ2bV9zdGF0ZTsgLy8gZm9yIEVQMnZtIHN0YXRlCi0JdTMyCSAgICBFUDR2bV9zdGF0ZTsgLy8gZm9yIEVQNHZtIHN0YXRlCi0JdTMyCSAgICB0eF9oYWx0OyAvLyBTdG9wcGluZyBWTQotCi0Jc3RydWN0IHVyYiAqCQkJCVR4NFVyYjsKLQlzdHJ1Y3QgdXJiICoJCQkJVHgyVXJiOwotCi0JaW50CQlFUDJWTV9zdGF0dXM7Ci0JaW50CQlFUDRWTV9zdGF0dXM7Ci0KLQl1MzIJVHhGaWxsQ291bnQ7IC8vIDIwMDYwOTI4Ci0JdTMyCVR4VGltZXI7IC8vIDIwMDYwOTI4IEFkZCBpZiBzZW5kaW5nIHBhY2tldCBub3QgZ3JlYXQgdGhhbiAxMwotCi19IFdCMzVUWCwgKlBXQjM1VFg7Ci0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbGludXgvd2J1c2IuYyBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL2xpbnV4L3didXNiLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5Y2E5YjkuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbGludXgvd2J1c2IuYworKysgL2Rldi9udWxsCkBAIC0xLDM5MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDggUGF2ZWwgTWFjaGVrIDxwYXZlbEBzdXNlLmN6PgotICoKLSAqIERpc3RyaWJ1dGUgdW5kZXIgR1BMdjIuCi0gKi8KLSNpbmNsdWRlICJzeXNkZWYuaCIKLSNpbmNsdWRlIDxuZXQvbWFjODAyMTEuaD4KLQotTU9EVUxFX0FVVEhPUihEUklWRVJfQVVUSE9SKTsKLU1PRFVMRV9ERVNDUklQVElPTihEUklWRVJfREVTQyk7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci1NT0RVTEVfVkVSU0lPTigiMC4xIik7Ci0KLXN0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9pZCB3YjM1X3RhYmxlW10gX19kZXZpbml0ZGF0YSA9IHsKLQl7VVNCX0RFVklDRSgweDA0MTYsIDB4MDAzNSl9LAotCXtVU0JfREVWSUNFKDB4MThFOCwgMHg2MjAxKX0sCi0Je1VTQl9ERVZJQ0UoMHgxOEU4LCAweDYyMDYpfSwKLQl7VVNCX0RFVklDRSgweDE4RTgsIDB4NjIxNyl9LAotCXtVU0JfREVWSUNFKDB4MThFOCwgMHg2MjMwKX0sCi0Je1VTQl9ERVZJQ0UoMHgxOEU4LCAweDYyMzMpfSwKLQl7VVNCX0RFVklDRSgweDExMzEsIDB4MjAzNSl9LAotCXsgMCwgfQotfTsKLQotTU9EVUxFX0RFVklDRV9UQUJMRSh1c2IsIHdiMzVfdGFibGUpOwotCi1zdGF0aWMgc3RydWN0IGllZWU4MDIxMV9yYXRlIHdic29mdF9yYXRlc1tdID0gewotCXsgLmJpdHJhdGUgPSAxMCwgLmZsYWdzID0gSUVFRTgwMjExX1JBVEVfU0hPUlRfUFJFQU1CTEUgfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgd2Jzb2Z0X2NoYW5uZWxzW10gPSB7Ci0JeyAuY2VudGVyX2ZyZXEgPSAyNDEyfSwKLX07Ci0KLWludCB3YnNvZnRfZW5hYmxlZDsKLXN0cnVjdCBpZWVlODAyMTFfaHcgKm15X2RldjsKLVBBREFQVEVSIG15X2FkYXB0ZXI7Ci0KLXN0YXRpYyBpbnQgd2Jzb2Z0X2FkZF9pbnRlcmZhY2Uoc3RydWN0IGllZWU4MDIxMV9odyAqZGV2LAotCQkJCSBzdHJ1Y3QgaWVlZTgwMjExX2lmX2luaXRfY29uZiAqY29uZikKLXsKLQlwcmludGsoIndic29mdF9hZGQgaW50ZXJmYWNlIGNhbGxlZFxuIik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIHdic29mdF9yZW1vdmVfaW50ZXJmYWNlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmRldiwKLQkJCQkgICAgIHN0cnVjdCBpZWVlODAyMTFfaWZfaW5pdF9jb25mICpjb25mKQotewotCXByaW50aygid2Jzb2Z0X3JlbW92ZSBpbnRlcmZhY2UgY2FsbGVkXG4iKTsKLX0KLQotc3RhdGljIHZvaWQgd2Jzb2Z0X3N0b3Aoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCi17Ci0JcHJpbnRrKEtFUk5fSU5GTyAiJXMgY2FsbGVkXG4iLCBfX2Z1bmNfXyk7Ci19Ci0KLXN0YXRpYyBpbnQgd2Jzb2Z0X2dldF9zdGF0cyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKLQkJCSAgICBzdHJ1Y3QgaWVlZTgwMjExX2xvd19sZXZlbF9zdGF0cyAqc3RhdHMpCi17Ci0JcHJpbnRrKEtFUk5fSU5GTyAiJXMgY2FsbGVkXG4iLCBfX2Z1bmNfXyk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgd2Jzb2Z0X2dldF90eF9zdGF0cyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKLQkJCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3R4X3F1ZXVlX3N0YXRzICpzdGF0cykKLXsKLQlwcmludGsoS0VSTl9JTkZPICIlcyBjYWxsZWRcbiIsIF9fZnVuY19fKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgd2Jzb2Z0X2NvbmZpZ3VyZV9maWx0ZXIoc3RydWN0IGllZWU4MDIxMV9odyAqZGV2LAotCQkJCSAgICAgdW5zaWduZWQgaW50IGNoYW5nZWRfZmxhZ3MsCi0JCQkJICAgICB1bnNpZ25lZCBpbnQgKnRvdGFsX2ZsYWdzLAotCQkJCSAgICAgaW50IG1jX2NvdW50LCBzdHJ1Y3QgZGV2X21jX2xpc3QgKm1jbGlzdCkKLXsKLQl1bnNpZ25lZCBpbnQgYml0X25yLCBuZXdfZmxhZ3M7Ci0JdTMyIG1jX2ZpbHRlclsyXTsKLQlpbnQgaTsKLQotCW5ld19mbGFncyA9IDA7Ci0KLQlpZiAoKnRvdGFsX2ZsYWdzICYgRklGX1BST01JU0NfSU5fQlNTKSB7Ci0JCW5ld19mbGFncyB8PSBGSUZfUFJPTUlTQ19JTl9CU1M7Ci0JCW1jX2ZpbHRlclsxXSA9IG1jX2ZpbHRlclswXSA9IH4wOwotCX0gZWxzZSBpZiAoKCp0b3RhbF9mbGFncyAmIEZJRl9BTExNVUxUSSkgfHwgKG1jX2NvdW50ID4gMzIpKSB7Ci0JCW5ld19mbGFncyB8PSBGSUZfQUxMTVVMVEk7Ci0JCW1jX2ZpbHRlclsxXSA9IG1jX2ZpbHRlclswXSA9IH4wOwotCX0gZWxzZSB7Ci0JCW1jX2ZpbHRlclsxXSA9IG1jX2ZpbHRlclswXSA9IDA7Ci0JCWZvciAoaSA9IDA7IGkgPCBtY19jb3VudDsgaSsrKSB7Ci0JCQlpZiAoIW1jbGlzdCkKLQkJCQlicmVhazsKLQkJCXByaW50aygiU2hvdWxkIGNhbGwgZXRoZXJfY3JjIGhlcmVcbiIpOwotCQkJLy9iaXRfbnIgPSBldGhlcl9jcmMoRVRIX0FMRU4sIG1jbGlzdC0+ZG1pX2FkZHIpID4+IDI2OwotCQkJYml0X25yID0gMDsKLQotCQkJYml0X25yICY9IDB4M0Y7Ci0JCQltY19maWx0ZXJbYml0X25yID4+IDVdIHw9IDEgPDwgKGJpdF9uciAmIDMxKTsKLQkJCW1jbGlzdCA9IG1jbGlzdC0+bmV4dDsKLQkJfQotCX0KLQotCWRldi0+ZmxhZ3MgJj0gfklFRUU4MDIxMV9IV19SWF9JTkNMVURFU19GQ1M7Ci0KLQkqdG90YWxfZmxhZ3MgPSBuZXdfZmxhZ3M7Ci19Ci0KLXN0YXRpYyBpbnQgd2Jzb2Z0X3R4KHN0cnVjdCBpZWVlODAyMTFfaHcgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKLXsKLQljaGFyICpidWZmZXIgPSBrbWFsbG9jKHNrYi0+bGVuLCBHRlBfQVRPTUlDKTsKLQlwcmludGsoIlNlbmRpbmcgZnJhbWUgJWQgYnl0ZXNcbiIsIHNrYi0+bGVuKTsKLQltZW1jcHkoYnVmZmVyLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKLQlpZiAoMSA9PSBNTE1FU2VuZEZyYW1lKG15X2FkYXB0ZXIsIGJ1ZmZlciwgc2tiLT5sZW4sIEZSQU1FX1RZUEVfODAyXzExX01BTkFHRU1FTlQpKQotCQlwcmludGsoImZyYW1lIHNlbnQgb2sgKCVkIGJ5dGVzKT9cbiIsIHNrYi0+bGVuKTsKLQlyZXR1cm4gTkVUREVWX1RYX09LOwotfQotCi0KLXN0YXRpYyBpbnQgd2Jzb2Z0X3N0YXJ0KHN0cnVjdCBpZWVlODAyMTFfaHcgKmRldikKLXsKLQl3YnNvZnRfZW5hYmxlZCA9IDE7Ci0JcHJpbnRrKCJ3YnNvZnRfc3RhcnQgY2FsbGVkXG4iKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB3YnNvZnRfY29uZmlnKHN0cnVjdCBpZWVlODAyMTFfaHcgKmRldiwgc3RydWN0IGllZWU4MDIxMV9jb25mICpjb25mKQotewotCUNoYW5JbmZvIGNoOwotCXByaW50aygid2Jzb2Z0X2NvbmZpZyBjYWxsZWRcbiIpOwotCi0JY2guYmFuZCA9IDE7Ci0JY2guQ2hhbk5vID0gMTsJLyogU2hvdWxkIHVzZSBjaGFubmVsX251bSwgb3Igc29tZXRoaW5nLCBhcyB0aGF0IGlzIGFscmVhZHkgcHJlLXRyYW5zbGF0ZWQgKi8KLQotCi0JaGFsX3NldF9jdXJyZW50X2NoYW5uZWwoJm15X2FkYXB0ZXItPnNId0RhdGEsIGNoKTsKLQloYWxfc2V0X2JlYWNvbl9wZXJpb2QoJm15X2FkYXB0ZXItPnNId0RhdGEsIGNvbmYtPmJlYWNvbl9pbnQpOwotLy8JaGFsX3NldF9jYXBfaW5mbygmbXlfYWRhcHRlci0+c0h3RGF0YSwgPz8gKTsKLS8vIGhhbF9zZXRfc3NpZChwaHdfZGF0YV90IHBId0RhdGEsICB1OCAqIHBzc2lkLCAgdTggc3NpZF9sZW4pOyA/PwotCWhhbF9zZXRfYWNjZXB0X2Jyb2FkY2FzdCgmbXlfYWRhcHRlci0+c0h3RGF0YSwgMSk7Ci0JaGFsX3NldF9hY2NlcHRfcHJvbWlzY3VvdXMoJm15X2FkYXB0ZXItPnNId0RhdGEsICAxKTsKLQloYWxfc2V0X2FjY2VwdF9tdWx0aWNhc3QoJm15X2FkYXB0ZXItPnNId0RhdGEsICAxKTsKLQloYWxfc2V0X2FjY2VwdF9iZWFjb24oJm15X2FkYXB0ZXItPnNId0RhdGEsICAxKTsKLQloYWxfc2V0X3JhZGlvX21vZGUoJm15X2FkYXB0ZXItPnNId0RhdGEsICAwKTsKLQkvL2hhbF9zZXRfYW50ZW5uYV9udW1iZXIoICBwaHdfZGF0YV90IHBId0RhdGEsIHU4IG51bWJlciApCi0JLy9oYWxfc2V0X3JmX3Bvd2VyKHBod19kYXRhX3QgcEh3RGF0YSwgdTggUG93ZXJJbmRleCkKLQotCi0vLwloYWxfc3RhcnRfYnNzKCZteV9hZGFwdGVyLT5zSHdEYXRhLCBXTEFOX0JTU1RZUEVfSU5GUkFTVFJVQ1RVUkUpOwk/PwotCi0vL3ZvaWQgaGFsX3NldF9yYXRlcyhwaHdfZGF0YV90IHBId0RhdGEsIHU4ICogcGJzc19yYXRlcywKLS8vCQkgICB1OCBsZW5ndGgsIHVuc2lnbmVkIGNoYXIgYmFzaWNfcmF0ZV9zZXQpCi0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB3YnNvZnRfY29uZmlnX2ludGVyZmFjZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpkZXYsCi0JCQkJICAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCi0JCQkJICAgIHN0cnVjdCBpZWVlODAyMTFfaWZfY29uZiAqY29uZikKLXsKLQlwcmludGsoIndic29mdF9jb25maWdfaW50ZXJmYWNlIGNhbGxlZFxuIik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB1NjQgd2Jzb2Z0X2dldF90c2Yoc3RydWN0IGllZWU4MDIxMV9odyAqZGV2KQotewotCXByaW50aygid2Jzb2Z0X2dldF90c2YgY2FsbGVkXG4iKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfb3BzIHdic29mdF9vcHMgPSB7Ci0JLnR4CQkJPSB3YnNvZnRfdHgsCi0JLnN0YXJ0CQkJPSB3YnNvZnRfc3RhcnQsCQkvKiBTdGFydCBjYW4gYmUgcHJldHR5IG11Y2ggZW1wdHkgYXMgd2UgZG8gV2JXTGFuSW5pdGlhbGl6ZSgpIGR1cmluZyBwcm9iZT8gKi8KLQkuc3RvcAkJCT0gd2Jzb2Z0X3N0b3AsCi0JLmFkZF9pbnRlcmZhY2UJCT0gd2Jzb2Z0X2FkZF9pbnRlcmZhY2UsCi0JLnJlbW92ZV9pbnRlcmZhY2UJPSB3YnNvZnRfcmVtb3ZlX2ludGVyZmFjZSwKLQkuY29uZmlnCQkJPSB3YnNvZnRfY29uZmlnLAotCS5jb25maWdfaW50ZXJmYWNlCT0gd2Jzb2Z0X2NvbmZpZ19pbnRlcmZhY2UsCi0JLmNvbmZpZ3VyZV9maWx0ZXIJPSB3YnNvZnRfY29uZmlndXJlX2ZpbHRlciwKLQkuZ2V0X3N0YXRzCQk9IHdic29mdF9nZXRfc3RhdHMsCi0JLmdldF90eF9zdGF0cwkJPSB3YnNvZnRfZ2V0X3R4X3N0YXRzLAotCS5nZXRfdHNmCQk9IHdic29mdF9nZXRfdHNmLAotLy8gY29uZl90eDogaGFsX3NldF9jd21pbigpL2hhbF9zZXRfY3dtYXg7Ci19OwotCi1zdHJ1Y3Qgd2Jzb2Z0X3ByaXYgewotfTsKLQotCi0vLyBVc2Iga2VybmVsIHN1YnN5c3RlbSB3aWxsIGNhbGwgdGhpcyBmdW5jdGlvbiB3aGVuIGEgbmV3IGRldmljZSBpcyBwbHVnZ2VkIGludG8uCi1pbnQgd2IzNV9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkX3RhYmxlKQotewotCVBBREFQVEVSCUFkYXB0ZXI7Ci0JUFdCTElOVVgJcFdiTGludXg7Ci0JUFdCVVNCCQlwV2JVc2I7Ci0gICAgICAgIHN0cnVjdCB1c2JfaG9zdF9pbnRlcmZhY2UgKmludGVyZmFjZTsKLQlzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVuZHBvaW50OwotCWludAlyZXQgPSAtMTsKLQl1MzIJbHRtcDsKLQlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IGludGVyZmFjZV90b191c2JkZXYoaW50Zik7Ci0KLQl1c2JfZ2V0X2Rldih1ZGV2KTsKLQotCXByaW50aygiW3czNXVuZF13YjM1X3Byb2JlIC0+XG4iKTsKLQotCS8vIDIwMDYwNjMwLjIgQ2hlY2sgdGhlIGRldmljZSBpZiBpdCBhbHJlYWR5IGJlIG9wZW5lZAotCXJldCA9IHVzYl9jb250cm9sX21zZyh1ZGV2LCB1c2JfcmN2Y3RybHBpcGUoIHVkZXYsIDAgKSwKLQkJCSAgICAgIDB4MDEsIFVTQl9UWVBFX1ZFTkRPUnxVU0JfUkVDSVBfREVWSUNFfFVTQl9ESVJfSU4sCi0JCQkgICAgICAweDAsIDB4NDAwLCAmbHRtcCwgNCwgSFoqMTAwICk7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gZXJyb3I7Ci0KLQlsdG1wID0gY3B1X3RvX2xlMzIobHRtcCk7Ci0JaWYgKGx0bXApICAvLyBJcyBhbHJlYWR5IGluaXRpYWxpemVkPwotCQlnb3RvIGVycm9yOwotCi0JQWRhcHRlciA9IGt6YWxsb2Moc2l6ZW9mKEFEQVBURVIpLCBHRlBfS0VSTkVMKTsKLQotCW15X2FkYXB0ZXIgPSBBZGFwdGVyOwotCXBXYkxpbnV4ID0gJkFkYXB0ZXItPldiTGludXg7Ci0JcFdiVXNiID0gJkFkYXB0ZXItPnNId0RhdGEuV2JVc2I7Ci0JcFdiVXNiLT51ZGV2ID0gdWRldjsKLQotICAgICAgICBpbnRlcmZhY2UgPSBpbnRmLT5jdXJfYWx0c2V0dGluZzsKLSAgICAgICAgZW5kcG9pbnQgPSAmaW50ZXJmYWNlLT5lbmRwb2ludFswXS5kZXNjOwotCi0JaWYgKGVuZHBvaW50WzJdLndNYXhQYWNrZXRTaXplID09IDUxMikgewotCQlwcmludGsoIlt3MzV1bmRdIFdvcmtpbmcgb24gVVNCIDIuMFxuIik7Ci0JCXBXYlVzYi0+SXNVc2IyMCA9IDE7Ci0JfQotCi0JaWYgKCFXYldMYW5Jbml0aWFsaXplKEFkYXB0ZXIpKSB7Ci0JCXByaW50aygiW3czNXVuZF1XYldMYW5Jbml0aWFsaXplIGZhaWxcbiIpOwotCQlnb3RvIGVycm9yOwotCX0KLQotCXsKLQkJc3RydWN0IHdic29mdF9wcml2ICpwcml2OwotCQlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpkZXY7Ci0JCXN0YXRpYyBzdHJ1Y3QgaWVlZTgwMjExX3N1cHBvcnRlZF9iYW5kIGJhbmQ7Ci0JCWludCByZXM7Ci0KLQkJZGV2ID0gaWVlZTgwMjExX2FsbG9jX2h3KHNpemVvZigqcHJpdiksICZ3YnNvZnRfb3BzKTsKLQotCQlpZiAoIWRldikgewotCQkJcHJpbnRrKCJ3MzV1bmQ6IGllZWU4MDIxMSBhbGxvYyBmYWlsZWRcbiIgKTsKLQkJCUJVRygpOwotCQl9Ci0KLQkJbXlfZGV2ID0gZGV2OwotCi0JCVNFVF9JRUVFODAyMTFfREVWKGRldiwgJnVkZXYtPmRldik7Ci0JCXsKLQkJCXBod19kYXRhX3QgcEh3RGF0YSA9ICZBZGFwdGVyLT5zSHdEYXRhOwotCQkJdW5zaWduZWQgY2hhcgkJZGV2X2FkZHJbTUFYX0FERFJfTEVOXTsKLQkJCWhhbF9nZXRfcGVybWFuZW50X2FkZHJlc3MocEh3RGF0YSwgZGV2X2FkZHIpOwotCQkJU0VUX0lFRUU4MDIxMV9QRVJNX0FERFIoZGV2LCBkZXZfYWRkcik7Ci0JCX0KLQotCi0JCWRldi0+ZXh0cmFfdHhfaGVhZHJvb20gPSAxMjsJLyogRklYTUUgKi8KLQkJZGV2LT5mbGFncyA9IDA7Ci0KLQkJZGV2LT5jaGFubmVsX2NoYW5nZV90aW1lID0gMTAwMDsKLS8vCQlkZXYtPm1heF9yc3NpID0gMTAwOwotCi0JCWRldi0+cXVldWVzID0gMTsKLQotCQliYW5kLmNoYW5uZWxzID0gd2Jzb2Z0X2NoYW5uZWxzOwotCQliYW5kLm5fY2hhbm5lbHMgPSBBUlJBWV9TSVpFKHdic29mdF9jaGFubmVscyk7Ci0JCWJhbmQuYml0cmF0ZXMgPSB3YnNvZnRfcmF0ZXM7Ci0JCWJhbmQubl9iaXRyYXRlcyA9IEFSUkFZX1NJWkUod2Jzb2Z0X3JhdGVzKTsKLQotCQlkZXYtPndpcGh5LT5iYW5kc1tJRUVFODAyMTFfQkFORF8yR0haXSA9ICZiYW5kOwotI2lmIDAKLQkJd2Jzb2Z0X21vZGVzWzBdLm51bV9jaGFubmVscyA9IDE7Ci0JCXdic29mdF9tb2Rlc1swXS5jaGFubmVscyA9IHdic29mdF9jaGFubmVsczsKLQkJd2Jzb2Z0X21vZGVzWzBdLm1vZGUgPSBNT0RFX0lFRUU4MDIxMUI7Ci0JCXdic29mdF9tb2Rlc1swXS5udW1fcmF0ZXMgPSBBUlJBWV9TSVpFKHdic29mdF9yYXRlcyk7Ci0JCXdic29mdF9tb2Rlc1swXS5yYXRlcyA9IHdic29mdF9yYXRlczsKLQotCQlyZXMgPSBpZWVlODAyMTFfcmVnaXN0ZXJfaHdtb2RlKGRldiwgJndic29mdF9tb2Rlc1swXSk7Ci0JCUJVR19PTihyZXMpOwotI2VuZGlmCi0KLQkJcmVzID0gaWVlZTgwMjExX3JlZ2lzdGVyX2h3KGRldik7Ci0JCUJVR19PTihyZXMpOwotCX0KLQotCXVzYl9zZXRfaW50ZmRhdGEoIGludGYsIEFkYXB0ZXIgKTsKLQotCXByaW50aygiW3czNXVuZF0gX3Byb2JlIE9LXG4iKTsKLQlyZXR1cm4gMDsKLWVycm9yOgotCXJldHVybiAtRU5PTUVNOwotfQotCi12b2lkIHBhY2tldF9jYW1lKGNoYXIgKnBSeEJ1ZmZlckFkZHJlc3MsIGludCBQYWNrZXRTaXplKQotewotCXN0cnVjdCBza19idWZmICpza2I7Ci0Jc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0dXMgcnhfc3RhdHVzID0gezB9OwotCi0JaWYgKCF3YnNvZnRfZW5hYmxlZCkKLQkJcmV0dXJuOwotCi0Jc2tiID0gZGV2X2FsbG9jX3NrYihQYWNrZXRTaXplKTsKLQlpZiAoIXNrYikgewotCQlwcmludGsoIk5vdCBlbm91Z2ggbWVtb3J5IGZvciBwYWNrZXQsIEZJWE1FXG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCW1lbWNweShza2JfcHV0KHNrYiwgUGFja2V0U2l6ZSksCi0JICAgICAgIHBSeEJ1ZmZlckFkZHJlc3MsCi0JICAgICAgIFBhY2tldFNpemUpOwotCi0vKgotCXJ4X3N0YXR1cy5yYXRlID0gMTA7Ci0Jcnhfc3RhdHVzLmNoYW5uZWwgPSAxOwotCXJ4X3N0YXR1cy5mcmVxID0gMTIzNDU7Ci0Jcnhfc3RhdHVzLnBoeW1vZGUgPSBNT0RFX0lFRUU4MDIxMUI7Ci0qLwotCi0JaWVlZTgwMjExX3J4X2lycXNhZmUobXlfZGV2LCBza2IsICZyeF9zdGF0dXMpOwotfQotCi11bnNpZ25lZCBjaGFyCi1XYlVzYl9pbml0aWFsKHBod19kYXRhX3QgcEh3RGF0YSkKLXsKLQlyZXR1cm4gMTsKLX0KLQotCi12b2lkCi1XYlVzYl9kZXN0cm95KHBod19kYXRhX3QgcEh3RGF0YSkKLXsKLX0KLQotaW50IHdiMzVfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQotewotCS8qIG5ldGRldl9wcml2KCkgb3IgbmV0ZGV2LT5tbF9wcml2IHNob3VsZCByZWZlcmVuY2UgdG8gdGhlIGFkZHJlc3Mgb2YKLQkgKiBwcml2YXRlIGRhdGEoUEFEQVBURVIpLiBJdCBkZXBlbmRzIG9uIHdoZXRoZXIgcHJpdmF0ZSBkYXRhIG1lbW9yeSBpcwotCSAqIGFsbG9jYXRlZCB3aGVuIGFsbG9jX25ldGRldigpLgotCSAqLwotCVBBREFQVEVSIEFkYXB0ZXIgPSAoUEFEQVBURVIpbmV0ZGV2X3ByaXYobmV0ZGV2KTsKLQlwaHdfZGF0YV90IHBId0RhdGEgPSAmQWRhcHRlci0+c0h3RGF0YTsKLQotICAgICAgICBuZXRpZl9zdGFydF9xdWV1ZShuZXRkZXYpOwotCi0JLy9UT0RPIDogcHV0IGhlcmUgdGVtcG9yYXJpbHkKLQloYWxfc2V0X2FjY2VwdF9icm9hZGNhc3QocEh3RGF0YSwgMSk7IC8vIG9wZW4gYWNjZXB0IGJyb2FkY2FzdAotCi0JcmV0dXJuIDA7Ci19Ci0KLWludCB3YjM1X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCi17Ci0JbmV0aWZfc3RvcF9xdWV1ZShuZXRkZXYpOwotCXJldHVybiAwOwotfQotCi12b2lkIHdiMzVfZGlzY29ubmVjdChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKLXsKLQlQV0JMSU5VWCBwV2JMaW51eDsKLQlQQURBUFRFUiBBZGFwdGVyID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsKLQl1c2Jfc2V0X2ludGZkYXRhKGludGYsIE5VTEwpOwotCi0gICAgICAgIHBXYkxpbnV4ID0gJkFkYXB0ZXItPldiTGludXg7Ci0KLQkvLyBDYXJkIHJlbW92ZQotCVdiV2xhbkhhbHQoQWRhcHRlcik7Ci0KLX0KLQotc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIHdiMzVfZHJpdmVyID0gewotCS5uYW1lCQk9ICJ3MzV1bmQiLAotCS5pZF90YWJsZQk9IHdiMzVfdGFibGUsCi0JLnByb2JlCQk9IHdiMzVfcHJvYmUsCi0JLmRpc2Nvbm5lY3QJPSB3YjM1X2Rpc2Nvbm5lY3QsCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCB3YjM1X2luaXQodm9pZCkKLXsKLQlyZXR1cm4gdXNiX3JlZ2lzdGVyKCZ3YjM1X2RyaXZlcik7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCB3YjM1X2V4aXQodm9pZCkKLXsKLQl1c2JfZGVyZWdpc3Rlcigmd2IzNV9kcml2ZXIpOwotfQotCi1tb2R1bGVfaW5pdCh3YjM1X2luaXQpOwotbW9kdWxlX2V4aXQod2IzNV9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL2xpbnV4L3didXNiX2YuaCBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL2xpbnV4L3didXNiX2YuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2FlMjllMS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9saW51eC93YnVzYl9mLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vLysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKLS8vIENvcHlyaWdodCAoYykgMTk5Ni0yMDA0IFdpbmJvbmQgRWxlY3Ryb25pYyBDb3Jwb3JhdGlvbgotLy8KLS8vICBNb2R1bGUgTmFtZToKLS8vICAgIHdidXNiX2YuaAotLy8KLS8vICBBYnN0cmFjdDoKLS8vICAgIExpbnV4IGRyaXZlci4KLS8vCi0vLyAgQXV0aG9yOgotLy8KLS8vKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKLQotaW50IHdiMzVfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KTsKLWludCB3YjM1X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpOwotdW5zaWduZWQgY2hhciBXYlVzYl9pbml0aWFsKHBod19kYXRhX3QgcEh3RGF0YSk7Ci12b2lkIFdiVXNiX2Rlc3Ryb3kocGh3X2RhdGFfdCBwSHdEYXRhKTsKLXVuc2lnbmVkIGNoYXIgV2JXTGFuSW5pdGlhbGl6ZShQQURBUFRFUiBBZGFwdGVyKTsKLSNkZWZpbmUJV2JVc2JfU3RvcCggX0EgKQotCi1pbnQgd2IzNV9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50Zixjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWRfdGFibGUpOwotdm9pZCB3YjM1X2Rpc2Nvbm5lY3Qoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpOwotCi0KLSNkZWZpbmUgd2JfdXNiX3N1Ym1pdF91cmIoX0EpIHVzYl9zdWJtaXRfdXJiKF9BLCBHRlBfQVRPTUlDKQotI2RlZmluZSB3Yl91c2JfYWxsb2NfdXJiKF9BKSB1c2JfYWxsb2NfdXJiKF9BLCBHRlBfQVRPTUlDKQotCi0jZGVmaW5lIFdiVXNiX0NoZWNrRm9ySGFuZyggX1AgKQotI2RlZmluZSBXYlVzYl9EZXRlY3RTdGFydCggX1AsIF9JICkKLQotCi0KLQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9saW51eC93YnVzYl9zLmggYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9saW51eC93YnVzYl9zLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1YzFkNTMuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbGludXgvd2J1c2Jfcy5oCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLy8rKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCi0vLyBDb3B5cmlnaHQgKGMpIDE5OTYtMjAwNCBXaW5ib25kIEVsZWN0cm9uaWMgQ29ycG9yYXRpb24KLS8vCi0vLyAgTW9kdWxlIE5hbWU6Ci0vLyAgICB3YnVzYl9zLmgKLS8vCi0vLyAgQWJzdHJhY3Q6Ci0vLyAgICBMaW51eCBkcml2ZXIuCi0vLwotLy8gIEF1dGhvcjoKLS8vCi0vLysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCi0KLSNkZWZpbmUgT1NfU0xFRVAoIF9NVCApCXsgc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsgXAotCQkJICBzY2hlZHVsZV90aW1lb3V0KCBfTVQqSFovMTAwMDAwMCApOyB9Ci0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vICBSV19DT05URVhUIC0tCi0vLwotLy8gIFVzZWQgdG8gdHJhY2sgZHJpdmVyLWdlbmVyYXRlZCBpbyBpcnBzCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotdHlwZWRlZiBzdHJ1Y3QgX1JXX0NPTlRFWFQKLXsKLQl2b2lkKgkJCXBId0RhdGE7Ci0JUFVSQgkJCXBVcmI7Ci0Jdm9pZCoJCQlwQ2FsbEJhY2tGdW5jdGlvblBhcmFtZXRlcjsKLX0gUldfQ09OVEVYVCwgKlBSV19DT05URVhUOwotCi0KLQotCi0jZGVmaW5lIERSSVZFUl9BVVRIT1IgIk9yaWdpbmFsIGJ5OiBKZWZmIExlZTxZWV9MZWVAaXNzYy5jb20udHc+IEFkYXB0ZWQgdG8gMi42LnggYnkgQ29zdGFudGlubyBMZWFuZHJvIChSeGFydCBEZXNrdG9wKSA8bGVfY29zdGFudGlub0BwaXhhcnRhcmdlbnRpbmEuY29tLmFyPiIKLSNkZWZpbmUgRFJJVkVSX0RFU0MgICAiSVM4OUMzNSA4MDIuMTFiZyBXTEFOIFVTQiBEcml2ZXIiCi0KLQotCi10eXBlZGVmIHN0cnVjdCBfV0JVU0IgewotCXUzMglJc1VzYjIwOwotCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2OwotCXUzMglEZXRlY3RDb3VudDsKLX0gV0JVU0IsICpQV0JVU0I7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9sb2NhbHBhcmEuaCBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL2xvY2FscGFyYS5oCmluZGV4IDI2OGNmOTEuLjYwN2JiMDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL2xvY2FscGFyYS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL2xvY2FscGFyYS5oCkBAIC0xLDYgKzEsMTIgQEAKKyNpZm5kZWYgX19XSU5CT05EX0xPQ0FMUEFSQV9ICisjZGVmaW5lIF9fV0lOQk9ORF9MT0NBTFBBUkFfSAorCiAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIC8vIExvY2FsUGFyYS5oIC0KIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisjaW5jbHVkZSAibWFjX3N0cnVjdHVyZXMuaCIKKwogLy9EZWZpbmUgdGhlIGxvY2FsIGFiaWxpdHkKIAogI2RlZmluZSBMT0NBTF9ERUZBVUxUX0JFQUNPTl9QRVJJT0QJCQkxMDAJCS8vbXMKQEAgLTI1LDcgKzMxLDcgQEAKICNkZWZpbmUgTE9DQUxfVU5LTk9XTl81X0NIQU5ORUxfTlVNCQkJMzQJLy9ub3QgaW5jbHVkZSAxNjUKIAogCi0jZGVmaW5lIHBzTE9DQUwJCQkoJihBZGFwdGVyLT5zTG9jYWxQYXJhKSkKKyNkZWZpbmUgcHNMT0NBTAkJCSgmKGFkYXB0ZXItPnNMb2NhbFBhcmEpKQogCiAjZGVmaW5lIE1PREVfODAyXzExX0JHCQkJMAogI2RlZmluZSBNT0RFXzgwMl8xMV9BCQkJMQpAQCAtMTQzLDcgKzE0OSw2IEBACiAKICAgICAvLy8vIHBvd2VyLXNhdmUgdmFyaWFibGVzCiAgICAgdTggIAkJICAJaVBvd2VyU2F2ZU1vZGU7ICAgICAvLyAwIGluZGljYXRlcyBpdCBpcyBvbiwgMSBpbmRpY2F0ZXMgaXQgaXMgb2ZmCi0JdTgJCQlTaHV0RG93bmVkOwogCXU4CQkJQVRJTW1vZGU7CiAJdTgJCQlFeGNsdWRlVW5lbmNyeXB0ZWQ7CiAKQEAgLTI3Miw0ICsyNzcsNCBAQAogCiB9IFdCX0xPQ0FMREVTQ1JJUFQsICpQV0JfTE9DQUxERVNDUklQVDsKIAotCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL21hY19zdHJ1Y3R1cmVzLmggYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9tYWNfc3RydWN0dXJlcy5oCmluZGV4IDAzMWQyY2IuLjBkMTYxOTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL21hY19zdHJ1Y3R1cmVzLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbWFjX3N0cnVjdHVyZXMuaApAQCAtMjEsNiArMjEsNyBAQAogI2lmbmRlZiBfTUFDX1N0cnVjdHVyZXNfSF8KICNkZWZpbmUgX01BQ19TdHJ1Y3R1cmVzX0hfCiAKKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KIAogLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIC8vIFNvbWUgbWlzY2VsbGFuZW91cyBkZWZpbml0aW9ucwpAQCAtMTE1LDEwICsxMTYsNiBAQAogI2RlZmluZSBXTEFOX01BWF9QQUlSV0lTRV9DSVBIRVJfU1VJVEVfQ09VTlQgICAgKCh1MTYpIDYpCiAjZGVmaW5lIFdMQU5fTUFYX0FVVEhfS0VZX01HVF9TVUlURV9MSVNUX0NPVU5UICAoKHUxNikgMikKIAotI2lmZGVmIFdCX0xJTlVYCi0jZGVmaW5lIFVOQUxJR05FRAotI2VuZGlmCi0KIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIHR5cGVkZWYgZW51bSBlbnVtX1Bvd2VyTWFuYWdlbWVudE1vZGUKIHsKQEAgLTQ2NCw3ICs0NjEsNyBAQAogewogCXU4CQkJCQlFbGVtZW50X0lEOwogCXU4CQkJCQlMZW5ndGg7Ci0JVU5BTElHTkVEIFNVSVRFX1NFTEVDVE9SCU91aVdQQUFkZGl0aW9uYWw7Ly9XUEEgdmVyc2lvbiAyLjAgYWRkaXRpb25hbCBmaWVsZCwgYW5kIHNob3VsZCBiZSAwMDo1MDpGMjowMQorCVNVSVRFX1NFTEVDVE9SCU91aVdQQUFkZGl0aW9uYWw7Ly9XUEEgdmVyc2lvbiAyLjAgYWRkaXRpb25hbCBmaWVsZCwgYW5kIHNob3VsZCBiZSAwMDo1MDpGMjowMQogCXUxNgkJCQkJVmVyc2lvbjsKIAlTVUlURV9TRUxFQ1RPUgkJR3JvdXBLZXlTdWl0ZTsKIAl1MTYJCQkJCVBhaXJ3aXNlS2V5U3VpdGVDb3VudDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL21kcy5jIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbWRzLmMKaW5kZXggZjFkZTgxMy4uZTQzMTQwNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbWRzLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbWRzLmMKQEAgLTEsNDQ1ICsxLDM5IEBACisjaW5jbHVkZSAiZHNfdGtpcC5oIgorI2luY2x1ZGUgImdsXzgwMjExLmgiCisjaW5jbHVkZSAibWRzX2YuaCIKKyNpbmNsdWRlICJtbG1ldHhyeF9mLmgiCisjaW5jbHVkZSAibXRvX2YuaCIKICNpbmNsdWRlICJvc19jb21tb24uaCIKLQotdm9pZAotTWRzX3Jlc2V0X2Rlc2NyaXB0b3IoUEFEQVBURVIgQWRhcHRlcikKLXsKLQlQTURTIHBNZHMgPSAmQWRhcHRlci0+TWRzOwotCi0JcE1kcy0+VHhQYXVzZSA9IDA7Ci0JcE1kcy0+VHhUaHJlYWRDb3VudCA9IDA7Ci0JcE1kcy0+VHhGaWxsSW5kZXggPSAwOwotCXBNZHMtPlR4RGVzSW5kZXggPSAwOwotCXBNZHMtPlNjYW5UeFBhdXNlID0gMDsKLQltZW1zZXQocE1kcy0+VHhPd25lciwgMCwgKChNQVhfVVNCX1RYX0JVRkZFUl9OVU1CRVIgKyAzKSAmIH4weDAzKSk7Ci19CisjaW5jbHVkZSAid2JoYWxfZi5oIgorI2luY2x1ZGUgIndibGludXhfZi5oIgogCiB1bnNpZ25lZCBjaGFyCi1NZHNfaW5pdGlhbChQQURBUFRFUiBBZGFwdGVyKQorTWRzX2luaXRpYWwoc3RydWN0IHdic29mdF9wcml2ICogYWRhcHRlcikKIHsKLQlQTURTIHBNZHMgPSAmQWRhcHRlci0+TWRzOworCVBNRFMgcE1kcyA9ICZhZGFwdGVyLT5NZHM7CiAKLQlwTWRzLT5UeFBhdXNlID0gRkFMU0U7CisJcE1kcy0+VHhQYXVzZSA9IGZhbHNlOwogCXBNZHMtPlR4UlRTVGhyZXNob2xkID0gREVGQVVMVF9SVFNUaHJlc2hvbGQ7CiAJcE1kcy0+VHhGcmFnbWVudFRocmVzaG9sZCA9IERFRkFVTFRfRlJBR01FTlRfVEhSRVNIT0xEOwogCi0JdlJ4VGltZXJJbml0KEFkYXB0ZXIpOy8vZm9yIFdQQSBjb3VudGVybWVhc3VyZQotCi0JcmV0dXJuIGhhbF9nZXRfdHhfYnVmZmVyKCAmQWRhcHRlci0+c0h3RGF0YSwgJnBNZHMtPnBUeEJ1ZmZlciApOworCXJldHVybiBoYWxfZ2V0X3R4X2J1ZmZlciggJmFkYXB0ZXItPnNId0RhdGEsICZwTWRzLT5wVHhCdWZmZXIgKTsKIH0KIAogdm9pZAotTWRzX0Rlc3Ryb3koUEFEQVBURVIgQWRhcHRlcikKK01kc19EZXN0cm95KHN0cnVjdCB3YnNvZnRfcHJpdiAqIGFkYXB0ZXIpCiB7Ci0JdlJ4VGltZXJTdG9wKEFkYXB0ZXIpOwogfQogCi12b2lkCi1NZHNfVHgoUEFEQVBURVIgQWRhcHRlcikKLXsKLQlwaHdfZGF0YV90CXBId0RhdGEgPSAmQWRhcHRlci0+c0h3RGF0YTsKLQlQTURTCQlwTWRzID0gJkFkYXB0ZXItPk1kczsKLQlERVNDUklQVE9SCVR4RGVzOwotCVBERVNDUklQVE9SCXBUeERlcyA9ICZUeERlczsKLQl1OAkJKlhtaXRCdWZBZGRyZXNzOwotCXUxNgkJWG1pdEJ1ZlNpemUsIFBhY2tldFNpemUsIHN0bXAsIEN1cnJlbnRTaXplLCBGcmFnbWVudFRocmVzaG9sZDsKLQl1OAkJRmlsbEluZGV4LCBUeERlc0luZGV4LCBGcmFnbWVudENvdW50LCBGaWxsQ291bnQ7Ci0JdW5zaWduZWQgY2hhcglCdWZmZXJGaWxsZWQgPSBGQUxTRSwgTUlDQWRkID0gMDsKLQotCi0JaWYgKHBNZHMtPlR4UGF1c2UpCi0JCXJldHVybjsKLQlpZiAoIWhhbF9kcml2ZXJfaW5pdF9PSyhwSHdEYXRhKSkKLQkJcmV0dXJuOwotCi0JLy9Pbmx5IG9uZSB0aHJlYWQgY2FuIGJlIHJ1biBoZXJlCi0JaWYgKCFPU19BVE9NSUNfSU5DKCBBZGFwdGVyLCAmcE1kcy0+VHhUaHJlYWRDb3VudCkgPT0gMSkKLQkJZ290byBjbGVhbnVwOwotCi0JLy8gU3RhcnQgdG8gZmlsbCB0aGUgZGF0YQotCWRvIHsKLQkJRmlsbEluZGV4ID0gcE1kcy0+VHhGaWxsSW5kZXg7Ci0JCWlmIChwTWRzLT5UeE93bmVyW0ZpbGxJbmRleF0pIHsgLy8gSXMgb3duZWQgYnkgc29mdHdhcmUgMDpZZXMgMTpObwotI2lmZGVmIF9QRV9UWF9EVU1QXwotCQkJV0JERUJVRygoIltNZHNfVHhdIFR4IE93bmVyIGlzIEgvVy5cbiIpKTsKLSNlbmRpZgotCQkJYnJlYWs7Ci0JCX0KLQotCQlYbWl0QnVmQWRkcmVzcyA9IHBNZHMtPnBUeEJ1ZmZlciArIChNQVhfVVNCX1RYX0JVRkZFUiAqIEZpbGxJbmRleCk7IC8vR2V0IGJ1ZmZlcgotCQlYbWl0QnVmU2l6ZSA9IDA7Ci0JCUZpbGxDb3VudCA9IDA7Ci0JCWRvIHsKLQkJCVBhY2tldFNpemUgPSBBZGFwdGVyLT5zTWxtZUZyYW1lLmxlbjsKLQkJCWlmICghUGFja2V0U2l6ZSkKLQkJCQlicmVhazsKLQotCQkJLy9Gb3IgQ2hlY2sgdGhlIGJ1ZmZlciByZXNvdXJjZQotCQkJRnJhZ21lbnRUaHJlc2hvbGQgPSBDVVJSRU5UX0ZSQUdNRU5UX1RIUkVTSE9MRDsKLQkJCS8vOTMxMTMwLjUuYgotCQkJRnJhZ21lbnRDb3VudCA9IFBhY2tldFNpemUvRnJhZ21lbnRUaHJlc2hvbGQgKyAxOwotCQkJc3RtcCA9IFBhY2tldFNpemUgKyBGcmFnbWVudENvdW50KjMyICsgODsvLzkzMTEzMC41LmMgODpNSUMKLQkJCWlmICgoWG1pdEJ1ZlNpemUgKyBzdG1wKSA+PSBNQVhfVVNCX1RYX0JVRkZFUikgewotCQkJCXByaW50aygiW01kc19UeF0gRXhjZXNzIG1heCB0eCBidWZmZXIuXG4iKTsKLQkJCQlicmVhazsgLy8gYnVmZmVyIGlzIG5vdCBlbm91Z2gKLQkJCX0KLQotCi0JCQkvLwotCQkJLy8gU3RhcnQgdHJhbnNtaXR0aW5nCi0JCQkvLwotCQkJQnVmZmVyRmlsbGVkID0gVFJVRTsKLQotCQkJLyogTGVhdmVzIGZpcnN0IHU4IGludGFjdCAqLwotCQkJbWVtc2V0KCh1OCAqKXBUeERlcyArIDEsIDAsIHNpemVvZihERVNDUklQVE9SKSAtIDEpOwotCi0JCQlUeERlc0luZGV4ID0gcE1kcy0+VHhEZXNJbmRleDsvL0dldCB0aGUgY3VycmVudCBJRAotCQkJcFR4RGVzLT5EZXNjcmlwdG9yX0lEID0gVHhEZXNJbmRleDsKLQkJCXBNZHMtPlR4RGVzRnJvbVsgVHhEZXNJbmRleCBdID0gMjsvL1N0b3JpbmcgdGhlIGluZm9ybWF0aW9uIG9mIHNvdXJjZSBjb21taW5nIGZyb20KLQkJCXBNZHMtPlR4RGVzSW5kZXgrKzsKLQkJCXBNZHMtPlR4RGVzSW5kZXggJT0gTUFYX1VTQl9UWF9ERVNDUklQVE9SOwotCi0JCQlNTE1FX0dldE5leHRQYWNrZXQoIEFkYXB0ZXIsIHBUeERlcyApOwotCi0JCQkvLyBDb3B5IGhlYWRlci4gOGJ5dGUgVVNCICsgMjRieXRlIDgwMi4xMUhkci4gU2V0IFR4UmF0ZSwgUHJlYW1ibGUgdHlwZQotCQkJTWRzX0hlYWRlckNvcHkoIEFkYXB0ZXIsIHBUeERlcywgWG1pdEJ1ZkFkZHJlc3MgKTsKLQotCQkJLy8gRm9yIHNwZWVkIHVwIEtleSBzZXR0aW5nCi0JCQlpZiAocFR4RGVzLT5FYXBGaXgpIHsKLSNpZmRlZiBfUEVfVFhfRFVNUF8KLQkJCQlXQkRFQlVHKCgiMzU6IEVQQSA0dGggZnJhbWUgZGV0ZWN0ZWQuIFNpemUgPSAlZFxuIiwgUGFja2V0U2l6ZSkpOwotI2VuZGlmCi0JCQkJcEh3RGF0YS0+SXNLZXlQcmVTZXQgPSAxOwotCQkJfQotCi0JCQkvLyBDb3B5IChmcmFnbWVudCkgZnJhbWUgYm9keSwgYW5kIHNldCBVU0IsIDgwMi4xMSBoZHIgZmxhZwotCQkJQ3VycmVudFNpemUgPSBNZHNfQm9keUNvcHkoQWRhcHRlciwgcFR4RGVzLCBYbWl0QnVmQWRkcmVzcyk7Ci0KLQkJCS8vIFNldCBSVFMvQ1RTIGFuZCBOb3JtYWwgZHVyYXRpb24gZmllbGQgaW50byBidWZmZXIKLQkJCU1kc19EdXJhdGlvblNldChBZGFwdGVyLCBwVHhEZXMsIFhtaXRCdWZBZGRyZXNzKTsKLQotCQkJLy8KLQkJCS8vIENhbGN1bGF0aW9uIE1JQyBmcm9tIGJ1ZmZlciB3aGljaCBtYXliZSBmcmFnbWVudCwgdGhlbiBmaWxsIGludG8gdGVtcG9yYXJ5IGFkZHJlc3MgOCBieXRlCi0JCQkvLyA5MzExMzAuNS5lCi0JCQlpZiAoTUlDQWRkKQotCQkJCU1kc19NaWNGaWxsKCBBZGFwdGVyLCBwVHhEZXMsIFhtaXRCdWZBZGRyZXNzICk7Ci0KLQkJCS8vU2hpZnQgdG8gdGhlIG5leHQgYWRkcmVzcwotCQkJWG1pdEJ1ZlNpemUgKz0gQ3VycmVudFNpemU7Ci0JCQlYbWl0QnVmQWRkcmVzcyArPSBDdXJyZW50U2l6ZTsKLQotI2lmZGVmIF9JQlNTX0JFQUNPTl9TRVFfU1RJQ0tfCi0JCQlpZiAoKFhtaXRCdWZBZGRyZXNzWyBET1RfMTFfREFfT0ZGU0VUKzggXSAmIDB4ZmMpICE9IE1BQ19TVUJUWVBFX01OR01OVF9QUk9CRV9SRVFVRVNUKSAvLyArOCBmb3IgVVNCIGhkcgotI2VuZGlmCi0JCQkJcE1kcy0+VHhUb2dnbGUgPSBUUlVFOwotCi0JCQkvLyBHZXQgcGFja2V0IHRvIHRyYW5zbWl0IGNvbXBsZXRlZCwgMTpURVNUU1RBIDI6TUxNRSAzOiBOZGlzIGRhdGEKLQkJCU1MTUVfU2VuZENvbXBsZXRlKEFkYXB0ZXIsIDAsIFRSVUUpOwotCi0JCQkvLyBTb2Z0d2FyZSBUU0MgY291bnQgMjAwNjAyMTQKLQkJCXBNZHMtPlR4VHNjKys7Ci0JCQlpZiAocE1kcy0+VHhUc2MgPT0gMCkKLQkJCQlwTWRzLT5UeFRzY18yKys7Ci0KLQkJCUZpbGxDb3VudCsrOyAvLyAyMDA2MDkyOAotCQl9IHdoaWxlIChIQUxfVVNCX01PREVfQlVSU1QocEh3RGF0YSkpOyAvLyBFbmQgb2YgbXVsdGlwbGUgTVNEVSBjb3B5IGxvb3AuIEZBTFNFID0gc2luZ2xlIFRSVUUgPSBtdWx0aXBsZSBzZW5kaW5nCi0KLQkJLy8gTW92ZSB0byB0aGUgbmV4dCBvbmUsIGlmIG5lY2Vzc2FyeQotCQlpZiAoQnVmZmVyRmlsbGVkKSB7Ci0JCQkvLyBzaXplIHNldHRpbmcKLQkJCXBNZHMtPlR4QnVmZmVyU2l6ZVsgRmlsbEluZGV4IF0gPSBYbWl0QnVmU2l6ZTsKLQotCQkJLy8gMjAwNjA5Mjggc2V0IFR4IGNvdW50Ci0JCQlwTWRzLT5UeENvdW50SW5CdWZmZXJbRmlsbEluZGV4XSA9IEZpbGxDb3VudDsKLQotCQkJLy8gU2V0IG93bmVyIGZsYWcKLQkJCXBNZHMtPlR4T3duZXJbRmlsbEluZGV4XSA9IDE7Ci0KLQkJCXBNZHMtPlR4RmlsbEluZGV4Kys7Ci0JCQlwTWRzLT5UeEZpbGxJbmRleCAlPSBNQVhfVVNCX1RYX0JVRkZFUl9OVU1CRVI7Ci0JCQlCdWZmZXJGaWxsZWQgPSBGQUxTRTsKLQkJfSBlbHNlCi0JCQlicmVhazsKLQotCQlpZiAoIVBhY2tldFNpemUpIC8vIE5vIG1vcmUgcGsgZm9yIHRyYW5zbWl0dGluZwotCQkJYnJlYWs7Ci0KLQl9IHdoaWxlKFRSVUUpOwotCi0JLy8KLQkvLyBTdGFydCB0byBzZW5kIGJ5IGxvd2VyIG1vZHVsZQotCS8vCi0JaWYgKCFwSHdEYXRhLT5Jc0tleVByZVNldCkKLQkJV2IzNVR4X3N0YXJ0KHBId0RhdGEpOwotCi0gY2xlYW51cDoKLQlPU19BVE9NSUNfREVDKCBBZGFwdGVyLCAmcE1kcy0+VHhUaHJlYWRDb3VudCApOwotfQotCi12b2lkCi1NZHNfU2VuZENvbXBsZXRlKFBBREFQVEVSIEFkYXB0ZXIsIFBUMDJfREVTQ1JJUFRPUiBwVDAyKQotewotCVBNRFMJcE1kcyA9ICZBZGFwdGVyLT5NZHM7Ci0JcGh3X2RhdGFfdAlwSHdEYXRhID0gJkFkYXB0ZXItPnNId0RhdGE7Ci0JdTgJUGFja2V0SWQgPSAodTgpcFQwMi0+VDAyX1R4X1BrdElEOwotCXVuc2lnbmVkIGNoYXIJU2VuZE9LID0gVFJVRTsKLQl1OAlSZXRyeUNvdW50LCBUeFJhdGU7Ci0KLQlpZiAocFQwMi0+VDAyX0lnbm9yZVJlc3VsdCkgLy8gRG9uJ3QgY2FyZSB0aGUgcmVzdWx0Ci0JCXJldHVybjsKLQlpZiAocFQwMi0+VDAyX0lzTGFzdE1wZHUpIHsKLQkJLy9UT0RPOiBEVE8gLS0gZ2V0IHRoZSByZXRyeSBjb3VudCBhbmQgZnJhZ21lbnQgY291bnQKLQkJLy8gVHggcmF0ZQotCQlUeFJhdGUgPSBwTWRzLT5UeFJhdGVbIFBhY2tldElkIF1bIDAgXTsKLQkJUmV0cnlDb3VudCA9ICh1OClwVDAyLT5UMDJfTVBEVV9DbnQ7Ci0JCWlmIChwVDAyLT52YWx1ZSAmIEZMQUdfRVJST1JfVFhfTUFTSykgewotCQkJU2VuZE9LID0gRkFMU0U7Ci0KLQkJCWlmIChwVDAyLT5UMDJfdHJhbnNtaXRfYWJvcnQgfHwgcFQwMi0+VDAyX291dF9vZl9NYXhUeE1TRFVMaWZ0VGltZSkgewotCQkJCS8vcmV0cnkgZXJyb3IKLQkJCQlwSHdEYXRhLT5kdG9fdHhfcmV0cnlfY291bnQgKz0gKFJldHJ5Q291bnQrMSk7Ci0JCQkJLy9bZm9yIHR4IGRlYnVnXQotCQkJCWlmIChSZXRyeUNvdW50PDcpCi0JCQkJCXBId0RhdGEtPnR4X3JldHJ5X2NvdW50W1JldHJ5Q291bnRdICs9IFJldHJ5Q291bnQ7Ci0JCQkJZWxzZQotCQkJCQlwSHdEYXRhLT50eF9yZXRyeV9jb3VudFs3XSArPSBSZXRyeUNvdW50OwotCQkJCSNpZmRlZiBfUEVfU1RBVEVfRFVNUF8KLQkJCQlXQkRFQlVHKCgiZHRvX3R4X3JldHJ5X2NvdW50ID0lZFxuIiwgcEh3RGF0YS0+ZHRvX3R4X3JldHJ5X2NvdW50KSk7Ci0JCQkJI2VuZGlmCi0JCQkJTVRPX1NldFR4Q291bnQoQWRhcHRlciwgVHhSYXRlLCBSZXRyeUNvdW50KTsKLQkJCX0KLQkJCXBId0RhdGEtPmR0b190eF9mcmFnX2NvdW50ICs9IChSZXRyeUNvdW50KzEpOwotCi0JCQkvL1tmb3IgdHggZGVidWddCi0JCQlpZiAocFQwMi0+VDAyX3RyYW5zbWl0X2Fib3J0X2R1ZV90b19UQlRUKQotCQkJCXBId0RhdGEtPnR4X1RCVFRfc3RhcnRfY291bnQrKzsKLQkJCWlmIChwVDAyLT5UMDJfdHJhbnNtaXRfd2l0aG91dF9lbmNyeXB0aW9uX2R1ZV90b193ZXBfb25fZmFsc2UpCi0JCQkJcEh3RGF0YS0+dHhfV2VwT25fZmFsc2VfY291bnQrKzsKLQkJCWlmIChwVDAyLT5UMDJfZGlzY2FyZF9kdWVfdG9fbnVsbF93ZXBfa2V5KQotCQkJCXBId0RhdGEtPnR4X051bGxfa2V5X2NvdW50Kys7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAocFQwMi0+VDAyX2VmZmVjdGl2ZV90cmFuc21pc3Npb25fcmF0ZSkKLQkJCQlwSHdEYXRhLT50eF9FVFJfY291bnQrKzsKLQkJCU1UT19TZXRUeENvdW50KEFkYXB0ZXIsIFR4UmF0ZSwgUmV0cnlDb3VudCk7Ci0JCX0KLQotCQkvLyBDbGVhciBzZW5kIHJlc3VsdCBidWZmZXIKLQkJcE1kcy0+VHhSZXN1bHRbIFBhY2tldElkIF0gPSAwOwotCX0gZWxzZQotCQlwTWRzLT5UeFJlc3VsdFsgUGFja2V0SWQgXSB8PSAoKHUxNikocFQwMi0+dmFsdWUgJiAweDBmZmZmKSk7Ci19Ci0KLXZvaWQKLU1kc19IZWFkZXJDb3B5KFBBREFQVEVSIEFkYXB0ZXIsIFBERVNDUklQVE9SIHBEZXMsIHU4ICpUYXJnZXRCdWZmZXIpCi17Ci0JUE1EUwlwTWRzID0gJkFkYXB0ZXItPk1kczsKLQl1OAkqc3JjX2J1ZmZlciA9IHBEZXMtPmJ1ZmZlcl9hZGRyZXNzWzBdOy8vOTMxMTMwLjUuZwotCVBUMDBfREVTQ1JJUFRPUglwVDAwOwotCVBUMDFfREVTQ1JJUFRPUglwVDAxOwotCXUxNglzdG1wOwotCXU4CWksIGN0bXAxLCBjdG1wMiwgY3RtcGY7Ci0JdTE2CUZyYWdtZW50VGhyZXNob2xkID0gQ1VSUkVOVF9GUkFHTUVOVF9USFJFU0hPTEQ7Ci0KLQotCXN0bXAgPSBwRGVzLT5idWZmZXJfdG90YWxfc2l6ZTsKLQkvLwotCS8vIFNldCBVU0IgaGVhZGVyIDggYnl0ZQotCS8vCi0JcFQwMCA9IChQVDAwX0RFU0NSSVBUT1IpVGFyZ2V0QnVmZmVyOwotCVRhcmdldEJ1ZmZlciArPSA0OwotCXBUMDEgPSAoUFQwMV9ERVNDUklQVE9SKVRhcmdldEJ1ZmZlcjsKLQlUYXJnZXRCdWZmZXIgKz0gNDsKLQotCXBUMDAtPnZhbHVlID0gMDsvLyBDbGVhcgotCXBUMDEtPnZhbHVlID0gMDsvLyBDbGVhcgotCi0JcFQwMC0+VDAwX3R4X3BhY2tldF9pZCA9IHBEZXMtPkRlc2NyaXB0b3JfSUQ7Ly8gU2V0IHBhY2tldCBJRAotCXBUMDAtPlQwMF9oZWFkZXJfbGVuZ3RoID0gMjQ7Ly8gU2V0IGhlYWRlciBsZW5ndGgKLQlwVDAxLT5UMDFfcmV0cnlfYWJvcnRfZWJhYmxlID0gMTsvLzkyMTAxMyA5MzExMzAuNS5oCi0KLQkvLyBLZXkgSUQgc2V0dXAKLQlwVDAxLT5UMDFfd2VwX2lkID0gMDsKLQotCUZyYWdtZW50VGhyZXNob2xkID0gREVGQVVMVF9GUkFHTUVOVF9USFJFU0hPTEQ7CS8vRG8gbm90IGZyYWdtZW50Ci0JLy8gQ29weSBmdWxsIGRhdGEsIHRoZSAxJ3N0IGJ1ZmZlciBjb250YWluIGFsbCB0aGUgZGF0YSA5MzExMzAuNS5qCi0JbWVtY3B5KCBUYXJnZXRCdWZmZXIsIHNyY19idWZmZXIsIERPVF8xMV9NQUNfSEVBREVSX1NJWkUgKTsvLyBDb3B5IGhlYWRlcgotCXBEZXMtPmJ1ZmZlcl9hZGRyZXNzWzBdID0gc3JjX2J1ZmZlciArIERPVF8xMV9NQUNfSEVBREVSX1NJWkU7Ci0JcERlcy0+YnVmZmVyX3RvdGFsX3NpemUgLT0gRE9UXzExX01BQ19IRUFERVJfU0laRTsKLQlwRGVzLT5idWZmZXJfc2l6ZVswXSA9IHBEZXMtPmJ1ZmZlcl90b3RhbF9zaXplOwotCi0JLy8gU2V0IGZyYWdtZW50IHRocmVzaG9sZAotCUZyYWdtZW50VGhyZXNob2xkIC09IChET1RfMTFfTUFDX0hFQURFUl9TSVpFICsgNCk7Ci0JcERlcy0+RnJhZ21lbnRUaHJlc2hvbGQgPSBGcmFnbWVudFRocmVzaG9sZDsKLQotCS8vIFNldCBtb3JlIGZyYWcgYml0Ci0JVGFyZ2V0QnVmZmVyWzFdIHw9IDB4MDQ7Ly8gU2V0IG1vcmUgZnJhZyBiaXQKLQotCS8vCi0JLy8gU2V0IHR4IHJhdGUKLQkvLwotCXN0bXAgPSAqKHUxNiAqKShUYXJnZXRCdWZmZXIrMzApOyAvLyAybiBhbGlnbm1lbnQgYWRkcmVzcwotCi0JLy9Vc2UgYmFzaWMgcmF0ZQotCWN0bXAxID0gY3RtcGYgPSBDVVJSRU5UX1RYX1JBVEVfRk9SX01ORzsKLQotCXBEZXMtPlR4UmF0ZSA9IGN0bXAxOwotCSNpZmRlZiBfUEVfVFhfRFVNUF8KLQlXQkRFQlVHKCgiVHggcmF0ZSA9JXhcbiIsIGN0bXAxKSk7Ci0JI2VuZGlmCi0KLQlwVDAxLT5UMDFfbW9kdWxhdGlvbl90eXBlID0gKGN0bXAxJTMpID8gMCA6IDE7Ci0KLQlmb3IoIGk9MDsgaTwyOyBpKysgKSB7Ci0JCWlmKCBpID09IDEgKQotCQkJY3RtcDEgPSBjdG1wZjsKLQotCQlwTWRzLT5UeFJhdGVbcERlcy0+RGVzY3JpcHRvcl9JRF1baV0gPSBjdG1wMTsgLy8gYmFja3VwIHRoZSB0YSByYXRlIGFuZCBmYWxsIGJhY2sgcmF0ZQotCi0JCWlmKCBjdG1wMSA9PSAxMDgpIGN0bXAyID0gNzsKLQkJZWxzZSBpZiggY3RtcDEgPT0gOTYgKSBjdG1wMiA9IDY7IC8vIFJhdGUgY29udmVydCBmb3IgVVNCCi0JCWVsc2UgaWYoIGN0bXAxID09IDcyICkgY3RtcDIgPSA1OwotCQllbHNlIGlmKCBjdG1wMSA9PSA0OCApIGN0bXAyID0gNDsKLQkJZWxzZSBpZiggY3RtcDEgPT0gMzYgKSBjdG1wMiA9IDM7Ci0JCWVsc2UgaWYoIGN0bXAxID09IDI0ICkgY3RtcDIgPSAyOwotCQllbHNlIGlmKCBjdG1wMSA9PSAxOCApIGN0bXAyID0gMTsKLQkJZWxzZSBpZiggY3RtcDEgPT0gMTIgKSBjdG1wMiA9IDA7Ci0JCWVsc2UgaWYoIGN0bXAxID09IDIyICkgY3RtcDIgPSAzOwotCQllbHNlIGlmKCBjdG1wMSA9PSAxMSApIGN0bXAyID0gMjsKLQkJZWxzZSBpZiggY3RtcDEgPT0gNCAgKSBjdG1wMiA9IDE7Ci0JCWVsc2UgY3RtcDIgPSAwOyAvLyBpZiggY3RtcDEgPT0gMiAgKSBvciBkZWZhdWx0Ci0KLQkJaWYoIGkgPT0gMCApCi0JCQlwVDAxLT5UMDFfdHJhbnNtaXRfcmF0ZSA9IGN0bXAyOwotCQllbHNlCi0JCQlwVDAxLT5UMDFfZmFsbF9iYWNrX3JhdGUgPSBjdG1wMjsKLQl9Ci0KLQkvLwotCS8vIFNldCBwcmVhbWJsZSB0eXBlCi0JLy8KLQlpZiAoKHBUMDEtPlQwMV9tb2R1bGF0aW9uX3R5cGUgPT0gMCkgJiYgKHBUMDEtPlQwMV90cmFuc21pdF9yYXRlID09IDApKQkvLyBSQVRFXzFNCi0JCXBEZXMtPlByZWFtYmxlTW9kZSA9ICBXTEFOX1BSRUFNQkxFX1RZUEVfTE9ORzsKLQllbHNlCi0JCXBEZXMtPlByZWFtYmxlTW9kZSA9ICBDVVJSRU5UX1BSRUFNQkxFX01PREU7Ci0JcFQwMS0+VDAxX3BsY3BfaGVhZGVyX2xlbmd0aCA9IHBEZXMtPlByZWFtYmxlTW9kZTsJLy8gU2V0IHByZWFtYmxlCi0KLX0KLQotLy8gVGhlIGZ1bmN0aW9uIHJldHVybiB0aGUgNG4gc2l6ZSBvZiB1c2IgcGsKLXUxNgotTWRzX0JvZHlDb3B5KFBBREFQVEVSIEFkYXB0ZXIsIFBERVNDUklQVE9SIHBEZXMsIHU4ICpUYXJnZXRCdWZmZXIpCi17Ci0JUFQwMF9ERVNDUklQVE9SCXBUMDA7Ci0JUE1EUwlwTWRzID0gJkFkYXB0ZXItPk1kczsKLQl1OAkqYnVmZmVyOwotCXU4CSpzcmNfYnVmZmVyOwotCXU4CSpwY3RtcDsKLQl1MTYJU2l6ZSA9IDA7Ci0JdTE2CVNpemVMZWZ0LCBDb3B5U2l6ZSwgQ29weUxlZnQsIHN0bXA7Ci0JdTgJYnVmX2luZGV4LCBGcmFnbWVudENvdW50ID0gMDsKLQotCi0JLy8gQ29weSBmcmFnbWVudCBib2R5Ci0JYnVmZmVyID0gVGFyZ2V0QnVmZmVyOyAvLyBzaGlmdCA4QiB1c2IgKyAyNEIgODAyLjExCi0JU2l6ZUxlZnQgPSBwRGVzLT5idWZmZXJfdG90YWxfc2l6ZTsKLQlidWZfaW5kZXggPSBwRGVzLT5idWZmZXJfc3RhcnRfaW5kZXg7Ci0KLQlwVDAwID0gKFBUMDBfREVTQ1JJUFRPUilidWZmZXI7Ci0Jd2hpbGUgKFNpemVMZWZ0KSB7Ci0JCXBUMDAgPSAoUFQwMF9ERVNDUklQVE9SKWJ1ZmZlcjsKLQkJQ29weVNpemUgPSBTaXplTGVmdDsKLQkJaWYgKFNpemVMZWZ0ID4gcERlcy0+RnJhZ21lbnRUaHJlc2hvbGQpIHsKLQkJCUNvcHlTaXplID0gcERlcy0+RnJhZ21lbnRUaHJlc2hvbGQ7Ci0JCQlwVDAwLT5UMDBfZnJhbWVfbGVuZ3RoID0gMjQgKyBDb3B5U2l6ZTsvL1NldCBVU0IgbGVuZ3RoCi0JCX0gZWxzZQotCQkJcFQwMC0+VDAwX2ZyYW1lX2xlbmd0aCA9IDI0ICsgU2l6ZUxlZnQ7Ly9TZXQgVVNCIGxlbmd0aAotCi0JCVNpemVMZWZ0IC09IENvcHlTaXplOwotCi0JCS8vIDEgQnl0ZSBvcGVyYXRpb24KLQkJcGN0bXAgPSAodTggKikoIGJ1ZmZlciArIDggKyBET1RfMTFfU0VRVUVOQ0VfT0ZGU0VUICk7Ci0JCSpwY3RtcCAmPSAweGYwOwotCQkqcGN0bXAgfD0gRnJhZ21lbnRDb3VudDsvLzkzMTEzMC41Lm0KLQkJaWYoICFGcmFnbWVudENvdW50ICkKLQkJCXBUMDAtPlQwMF9maXJzdF9tcGR1ID0gMTsKLQotCQlidWZmZXIgKz0gMzI7IC8vIDhCIHVzYiArIDI0QiA4MDIuMTEgaGVhZGVyCi0JCVNpemUgKz0gMzI7Ci0KLQkJLy8gQ29weSBpbnRvIGJ1ZmZlcgotCQlzdG1wID0gQ29weVNpemUgKyAzOwotCQlzdG1wICY9IH4weDAzOy8vNG4gQWxpZ25tZW50Ci0JCVNpemUgKz0gc3RtcDsvLyBDdXJyZW50IDRuIG9mZnNldCBvZiBtcGR1Ci0KLQkJd2hpbGUgKENvcHlTaXplKSB7Ci0JCQkvLyBDb3B5IGJvZHkKLQkJCXNyY19idWZmZXIgPSBwRGVzLT5idWZmZXJfYWRkcmVzc1tidWZfaW5kZXhdOwotCQkJQ29weUxlZnQgPSBDb3B5U2l6ZTsKLQkJCWlmIChDb3B5U2l6ZSA+PSBwRGVzLT5idWZmZXJfc2l6ZVtidWZfaW5kZXhdKSB7Ci0JCQkJQ29weUxlZnQgPSBwRGVzLT5idWZmZXJfc2l6ZVtidWZfaW5kZXhdOwotCi0JCQkJLy8gR2V0IHRoZSBuZXh0IGJ1ZmZlciBvZiBkZXNjcmlwdG9yCi0JCQkJYnVmX2luZGV4Kys7Ci0JCQkJYnVmX2luZGV4ICU9IE1BWF9ERVNDUklQVE9SX0JVRkZFUl9JTkRFWDsKLQkJCX0gZWxzZSB7Ci0JCQkJdTgJKnBjdG1wID0gcERlcy0+YnVmZmVyX2FkZHJlc3NbYnVmX2luZGV4XTsKLQkJCQlwY3RtcCArPSBDb3B5U2l6ZTsKLQkJCQlwRGVzLT5idWZmZXJfYWRkcmVzc1tidWZfaW5kZXhdID0gcGN0bXA7Ci0JCQkJcERlcy0+YnVmZmVyX3NpemVbYnVmX2luZGV4XSAtPSBDb3B5U2l6ZTsKLQkJCX0KLQotCQkJbWVtY3B5KGJ1ZmZlciwgc3JjX2J1ZmZlciwgQ29weUxlZnQpOwotCQkJYnVmZmVyICs9IENvcHlMZWZ0OwotCQkJQ29weVNpemUgLT0gQ29weUxlZnQ7Ci0JCX0KLQotCQkvLyA5MzExMzAuNS5uCi0JCWlmIChwTWRzLT5NaWNBZGQpIHsKLQkJCWlmICghU2l6ZUxlZnQpIHsKLQkJCQlwTWRzLT5NaWNXcml0ZUFkZHJlc3NbIHBNZHMtPk1pY1dyaXRlSW5kZXggXSA9IGJ1ZmZlciAtIHBNZHMtPk1pY0FkZDsKLQkJCQlwTWRzLT5NaWNXcml0ZVNpemVbIHBNZHMtPk1pY1dyaXRlSW5kZXggXSA9IHBNZHMtPk1pY0FkZDsKLQkJCQlwTWRzLT5NaWNBZGQgPSAwOwotCQkJfQotCQkJZWxzZSBpZiggU2l6ZUxlZnQgPCA4ICkgLy85MzExMzAuNS5wCi0JCQl7Ci0JCQkJcE1kcy0+TWljQWRkID0gU2l6ZUxlZnQ7Ci0JCQkJcE1kcy0+TWljV3JpdGVBZGRyZXNzWyBwTWRzLT5NaWNXcml0ZUluZGV4IF0gPSBidWZmZXIgLSAoIDggLSBTaXplTGVmdCApOwotCQkJCXBNZHMtPk1pY1dyaXRlU2l6ZVsgcE1kcy0+TWljV3JpdGVJbmRleCBdID0gOCAtIFNpemVMZWZ0OwotCQkJCXBNZHMtPk1pY1dyaXRlSW5kZXgrKzsKLQkJCX0KLQkJfQotCi0JCS8vIERvZXMgaXQgbmVlZCB0byBnZW5lcmF0ZSB0aGUgbmV3IGhlYWRlciBmb3IgbmV4dCBtcGR1PwotCQlpZiAoU2l6ZUxlZnQpIHsKLQkJCWJ1ZmZlciA9IFRhcmdldEJ1ZmZlciArIFNpemU7IC8vIEdldCB0aGUgbmV4dCA0biBzdGFydCBhZGRyZXNzCi0JCQltZW1jcHkoIGJ1ZmZlciwgVGFyZ2V0QnVmZmVyLCAzMiApOy8vQ29weSA4QiBVU0IgKzI0QiA4MDIuMTEKLQkJCXBUMDAgPSAoUFQwMF9ERVNDUklQVE9SKWJ1ZmZlcjsKLQkJCXBUMDAtPlQwMF9maXJzdF9tcGR1ID0gMDsKLQkJfQotCi0JCUZyYWdtZW50Q291bnQrKzsKLQl9Ci0KLQlwVDAwLT5UMDBfbGFzdF9tcGR1ID0gMTsKLQlwVDAwLT5UMDBfSXNMYXN0TXBkdSA9IDE7Ci0JYnVmZmVyID0gKHU4ICopcFQwMCArIDg7IC8vICs4IGZvciBVU0IgaGRyCi0JYnVmZmVyWzFdICY9IH4weDA0OyAvLyBDbGVhciBtb3JlIGZyYWcgYml0IG9mIDgwMi4xMSBmcmFtZSBjb250cm9sCi0JcERlcy0+RnJhZ21lbnRDb3VudCA9IEZyYWdtZW50Q291bnQ7IC8vIFVwZGF0ZSB0aGUgY29ycmVjdCBmcmFnbWVudCBudW1iZXIKLQlyZXR1cm4gU2l6ZTsKLX0KLQotCi12b2lkCi1NZHNfRHVyYXRpb25TZXQoICBQQURBUFRFUiBBZGFwdGVyLCAgUERFU0NSSVBUT1IgcERlcywgIHU4ICpidWZmZXIgKQorc3RhdGljIHZvaWQgTWRzX0R1cmF0aW9uU2V0KHN0cnVjdCB3YnNvZnRfcHJpdiAqYWRhcHRlciwgIFBERVNDUklQVE9SIHBEZXMsICB1OCAqYnVmZmVyKQogewogCVBUMDBfREVTQ1JJUFRPUglwVDAwOwogCVBUMDFfREVTQ1JJUFRPUglwVDAxOwogCXUxNglEdXJhdGlvbiwgTmV4dEJvZHlMZW4sIE9mZnNldFNpemU7CiAJdTgJUmF0ZSwgaTsKLQl1bnNpZ25lZCBjaGFyCUNUU19vbiA9IEZBTFNFLCBSVFNfb24gPSBGQUxTRTsKKwl1bnNpZ25lZCBjaGFyCUNUU19vbiA9IGZhbHNlLCBSVFNfb24gPSBmYWxzZTsKIAlQVDAwX0RFU0NSSVBUT1IgcE5leHRUMDA7CiAJdTE2IEJvZHlMZW4gPSAwOwotCXVuc2lnbmVkIGNoYXIgYm9Hcm91cEFkZHIgPSBGQUxTRTsKLQorCXVuc2lnbmVkIGNoYXIgYm9Hcm91cEFkZHIgPSBmYWxzZTsKIAogCU9mZnNldFNpemUgPSBwRGVzLT5GcmFnbWVudFRocmVzaG9sZCArIDMyICsgMzsKIAlPZmZzZXRTaXplICY9IH4weDAzOwpAQCAtNDUyLDcgKzQ2LDcgQEAKIAlwTmV4dFQwMCA9IChQVDAwX0RFU0NSSVBUT1IpKGJ1ZmZlcitPZmZzZXRTaXplKTsKIAogCWlmKCBidWZmZXJbIERPVF8xMV9EQV9PRkZTRVQrOCBdICYgMHgxICkgLy8gKzggZm9yIFVTQiBoZHIKLQkJYm9Hcm91cEFkZHIgPSBUUlVFOworCQlib0dyb3VwQWRkciA9IHRydWU7CiAKIAkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAkvLyBTZXQgUlRTL0NUUyBtZWNoYW5pc20KQEAgLTQ2NywxMyArNjEsMTMgQEAKIAkJQm9keUxlbiArPSA0OwkvL0NSQwogCiAJCWlmKCBCb2R5TGVuID49IENVUlJFTlRfUlRTX1RIUkVTSE9MRCApCi0JCQlSVFNfb24gPSBUUlVFOyAvLyBVc2luZyBSVFMKKwkJCVJUU19vbiA9IHRydWU7IC8vIFVzaW5nIFJUUwogCQllbHNlCiAJCXsKIAkJCWlmKCBwVDAxLT5UMDFfbW9kdWxhdGlvbl90eXBlICkgLy8gSXMgdXNpbmcgT0ZETQogCQkJewogCQkJCWlmKCBDVVJSRU5UX1BST1RFQ1RfTUVDSEFOSVNNICkgLy8gSXMgdXNpbmcgcHJvdGVjdAotCQkJCQlDVFNfb24gPSBUUlVFOyAvLyBVc2luZyBDVFMKKwkJCQkJQ1RTX29uID0gdHJ1ZTsgLy8gVXNpbmcgQ1RTCiAJCQl9CiAJCX0KIAl9CkBAIC02MjQsOSArMjE4LDM5NCBAQAogCiB9CiAKLXZvaWQgTURTX0V0aGVybmV0UGFja2V0UmVjZWl2ZSggIFBBREFQVEVSIEFkYXB0ZXIsICBQUlhMQVlFUjEgcFJ4TGF5ZXIxICkKKy8vIFRoZSBmdW5jdGlvbiByZXR1cm4gdGhlIDRuIHNpemUgb2YgdXNiIHBrCitzdGF0aWMgdTE2IE1kc19Cb2R5Q29weShzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKmFkYXB0ZXIsIFBERVNDUklQVE9SIHBEZXMsIHU4ICpUYXJnZXRCdWZmZXIpCiB7Ci0JCU9TX1JFQ0VJVkVfUEFDS0VUX0lORElDQVRFKCBBZGFwdGVyLCBwUnhMYXllcjEgKTsKKwlQVDAwX0RFU0NSSVBUT1IJcFQwMDsKKwlQTURTCXBNZHMgPSAmYWRhcHRlci0+TWRzOworCXU4CSpidWZmZXI7CisJdTgJKnNyY19idWZmZXI7CisJdTgJKnBjdG1wOworCXUxNglTaXplID0gMDsKKwl1MTYJU2l6ZUxlZnQsIENvcHlTaXplLCBDb3B5TGVmdCwgc3RtcDsKKwl1OAlidWZfaW5kZXgsIEZyYWdtZW50Q291bnQgPSAwOworCisKKwkvLyBDb3B5IGZyYWdtZW50IGJvZHkKKwlidWZmZXIgPSBUYXJnZXRCdWZmZXI7IC8vIHNoaWZ0IDhCIHVzYiArIDI0QiA4MDIuMTEKKwlTaXplTGVmdCA9IHBEZXMtPmJ1ZmZlcl90b3RhbF9zaXplOworCWJ1Zl9pbmRleCA9IHBEZXMtPmJ1ZmZlcl9zdGFydF9pbmRleDsKKworCXBUMDAgPSAoUFQwMF9ERVNDUklQVE9SKWJ1ZmZlcjsKKwl3aGlsZSAoU2l6ZUxlZnQpIHsKKwkJcFQwMCA9IChQVDAwX0RFU0NSSVBUT1IpYnVmZmVyOworCQlDb3B5U2l6ZSA9IFNpemVMZWZ0OworCQlpZiAoU2l6ZUxlZnQgPiBwRGVzLT5GcmFnbWVudFRocmVzaG9sZCkgeworCQkJQ29weVNpemUgPSBwRGVzLT5GcmFnbWVudFRocmVzaG9sZDsKKwkJCXBUMDAtPlQwMF9mcmFtZV9sZW5ndGggPSAyNCArIENvcHlTaXplOy8vU2V0IFVTQiBsZW5ndGgKKwkJfSBlbHNlCisJCQlwVDAwLT5UMDBfZnJhbWVfbGVuZ3RoID0gMjQgKyBTaXplTGVmdDsvL1NldCBVU0IgbGVuZ3RoCisKKwkJU2l6ZUxlZnQgLT0gQ29weVNpemU7CisKKwkJLy8gMSBCeXRlIG9wZXJhdGlvbgorCQlwY3RtcCA9ICh1OCAqKSggYnVmZmVyICsgOCArIERPVF8xMV9TRVFVRU5DRV9PRkZTRVQgKTsKKwkJKnBjdG1wICY9IDB4ZjA7CisJCSpwY3RtcCB8PSBGcmFnbWVudENvdW50Oy8vOTMxMTMwLjUubQorCQlpZiggIUZyYWdtZW50Q291bnQgKQorCQkJcFQwMC0+VDAwX2ZpcnN0X21wZHUgPSAxOworCisJCWJ1ZmZlciArPSAzMjsgLy8gOEIgdXNiICsgMjRCIDgwMi4xMSBoZWFkZXIKKwkJU2l6ZSArPSAzMjsKKworCQkvLyBDb3B5IGludG8gYnVmZmVyCisJCXN0bXAgPSBDb3B5U2l6ZSArIDM7CisJCXN0bXAgJj0gfjB4MDM7Ly80biBBbGlnbm1lbnQKKwkJU2l6ZSArPSBzdG1wOy8vIEN1cnJlbnQgNG4gb2Zmc2V0IG9mIG1wZHUKKworCQl3aGlsZSAoQ29weVNpemUpIHsKKwkJCS8vIENvcHkgYm9keQorCQkJc3JjX2J1ZmZlciA9IHBEZXMtPmJ1ZmZlcl9hZGRyZXNzW2J1Zl9pbmRleF07CisJCQlDb3B5TGVmdCA9IENvcHlTaXplOworCQkJaWYgKENvcHlTaXplID49IHBEZXMtPmJ1ZmZlcl9zaXplW2J1Zl9pbmRleF0pIHsKKwkJCQlDb3B5TGVmdCA9IHBEZXMtPmJ1ZmZlcl9zaXplW2J1Zl9pbmRleF07CisKKwkJCQkvLyBHZXQgdGhlIG5leHQgYnVmZmVyIG9mIGRlc2NyaXB0b3IKKwkJCQlidWZfaW5kZXgrKzsKKwkJCQlidWZfaW5kZXggJT0gTUFYX0RFU0NSSVBUT1JfQlVGRkVSX0lOREVYOworCQkJfSBlbHNlIHsKKwkJCQl1OAkqcGN0bXAgPSBwRGVzLT5idWZmZXJfYWRkcmVzc1tidWZfaW5kZXhdOworCQkJCXBjdG1wICs9IENvcHlTaXplOworCQkJCXBEZXMtPmJ1ZmZlcl9hZGRyZXNzW2J1Zl9pbmRleF0gPSBwY3RtcDsKKwkJCQlwRGVzLT5idWZmZXJfc2l6ZVtidWZfaW5kZXhdIC09IENvcHlTaXplOworCQkJfQorCisJCQltZW1jcHkoYnVmZmVyLCBzcmNfYnVmZmVyLCBDb3B5TGVmdCk7CisJCQlidWZmZXIgKz0gQ29weUxlZnQ7CisJCQlDb3B5U2l6ZSAtPSBDb3B5TGVmdDsKKwkJfQorCisJCS8vIDkzMTEzMC41Lm4KKwkJaWYgKHBNZHMtPk1pY0FkZCkgeworCQkJaWYgKCFTaXplTGVmdCkgeworCQkJCXBNZHMtPk1pY1dyaXRlQWRkcmVzc1sgcE1kcy0+TWljV3JpdGVJbmRleCBdID0gYnVmZmVyIC0gcE1kcy0+TWljQWRkOworCQkJCXBNZHMtPk1pY1dyaXRlU2l6ZVsgcE1kcy0+TWljV3JpdGVJbmRleCBdID0gcE1kcy0+TWljQWRkOworCQkJCXBNZHMtPk1pY0FkZCA9IDA7CisJCQl9CisJCQllbHNlIGlmKCBTaXplTGVmdCA8IDggKSAvLzkzMTEzMC41LnAKKwkJCXsKKwkJCQlwTWRzLT5NaWNBZGQgPSBTaXplTGVmdDsKKwkJCQlwTWRzLT5NaWNXcml0ZUFkZHJlc3NbIHBNZHMtPk1pY1dyaXRlSW5kZXggXSA9IGJ1ZmZlciAtICggOCAtIFNpemVMZWZ0ICk7CisJCQkJcE1kcy0+TWljV3JpdGVTaXplWyBwTWRzLT5NaWNXcml0ZUluZGV4IF0gPSA4IC0gU2l6ZUxlZnQ7CisJCQkJcE1kcy0+TWljV3JpdGVJbmRleCsrOworCQkJfQorCQl9CisKKwkJLy8gRG9lcyBpdCBuZWVkIHRvIGdlbmVyYXRlIHRoZSBuZXcgaGVhZGVyIGZvciBuZXh0IG1wZHU/CisJCWlmIChTaXplTGVmdCkgeworCQkJYnVmZmVyID0gVGFyZ2V0QnVmZmVyICsgU2l6ZTsgLy8gR2V0IHRoZSBuZXh0IDRuIHN0YXJ0IGFkZHJlc3MKKwkJCW1lbWNweSggYnVmZmVyLCBUYXJnZXRCdWZmZXIsIDMyICk7Ly9Db3B5IDhCIFVTQiArMjRCIDgwMi4xMQorCQkJcFQwMCA9IChQVDAwX0RFU0NSSVBUT1IpYnVmZmVyOworCQkJcFQwMC0+VDAwX2ZpcnN0X21wZHUgPSAwOworCQl9CisKKwkJRnJhZ21lbnRDb3VudCsrOworCX0KKworCXBUMDAtPlQwMF9sYXN0X21wZHUgPSAxOworCXBUMDAtPlQwMF9Jc0xhc3RNcGR1ID0gMTsKKwlidWZmZXIgPSAodTggKilwVDAwICsgODsgLy8gKzggZm9yIFVTQiBoZHIKKwlidWZmZXJbMV0gJj0gfjB4MDQ7IC8vIENsZWFyIG1vcmUgZnJhZyBiaXQgb2YgODAyLjExIGZyYW1lIGNvbnRyb2wKKwlwRGVzLT5GcmFnbWVudENvdW50ID0gRnJhZ21lbnRDb3VudDsgLy8gVXBkYXRlIHRoZSBjb3JyZWN0IGZyYWdtZW50IG51bWJlcgorCXJldHVybiBTaXplOwogfQogCitzdGF0aWMgdm9pZCBNZHNfSGVhZGVyQ29weShzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKiBhZGFwdGVyLCBQREVTQ1JJUFRPUiBwRGVzLCB1OCAqVGFyZ2V0QnVmZmVyKQoreworCVBNRFMJcE1kcyA9ICZhZGFwdGVyLT5NZHM7CisJdTgJKnNyY19idWZmZXIgPSBwRGVzLT5idWZmZXJfYWRkcmVzc1swXTsvLzkzMTEzMC41LmcKKwlQVDAwX0RFU0NSSVBUT1IJcFQwMDsKKwlQVDAxX0RFU0NSSVBUT1IJcFQwMTsKKwl1MTYJc3RtcDsKKwl1OAlpLCBjdG1wMSwgY3RtcDIsIGN0bXBmOworCXUxNglGcmFnbWVudFRocmVzaG9sZCA9IENVUlJFTlRfRlJBR01FTlRfVEhSRVNIT0xEOwogCisKKwlzdG1wID0gcERlcy0+YnVmZmVyX3RvdGFsX3NpemU7CisJLy8KKwkvLyBTZXQgVVNCIGhlYWRlciA4IGJ5dGUKKwkvLworCXBUMDAgPSAoUFQwMF9ERVNDUklQVE9SKVRhcmdldEJ1ZmZlcjsKKwlUYXJnZXRCdWZmZXIgKz0gNDsKKwlwVDAxID0gKFBUMDFfREVTQ1JJUFRPUilUYXJnZXRCdWZmZXI7CisJVGFyZ2V0QnVmZmVyICs9IDQ7CisKKwlwVDAwLT52YWx1ZSA9IDA7Ly8gQ2xlYXIKKwlwVDAxLT52YWx1ZSA9IDA7Ly8gQ2xlYXIKKworCXBUMDAtPlQwMF90eF9wYWNrZXRfaWQgPSBwRGVzLT5EZXNjcmlwdG9yX0lEOy8vIFNldCBwYWNrZXQgSUQKKwlwVDAwLT5UMDBfaGVhZGVyX2xlbmd0aCA9IDI0Oy8vIFNldCBoZWFkZXIgbGVuZ3RoCisJcFQwMS0+VDAxX3JldHJ5X2Fib3J0X2ViYWJsZSA9IDE7Ly85MjEwMTMgOTMxMTMwLjUuaAorCisJLy8gS2V5IElEIHNldHVwCisJcFQwMS0+VDAxX3dlcF9pZCA9IDA7CisKKwlGcmFnbWVudFRocmVzaG9sZCA9IERFRkFVTFRfRlJBR01FTlRfVEhSRVNIT0xEOwkvL0RvIG5vdCBmcmFnbWVudAorCS8vIENvcHkgZnVsbCBkYXRhLCB0aGUgMSdzdCBidWZmZXIgY29udGFpbiBhbGwgdGhlIGRhdGEgOTMxMTMwLjUuagorCW1lbWNweSggVGFyZ2V0QnVmZmVyLCBzcmNfYnVmZmVyLCBET1RfMTFfTUFDX0hFQURFUl9TSVpFICk7Ly8gQ29weSBoZWFkZXIKKwlwRGVzLT5idWZmZXJfYWRkcmVzc1swXSA9IHNyY19idWZmZXIgKyBET1RfMTFfTUFDX0hFQURFUl9TSVpFOworCXBEZXMtPmJ1ZmZlcl90b3RhbF9zaXplIC09IERPVF8xMV9NQUNfSEVBREVSX1NJWkU7CisJcERlcy0+YnVmZmVyX3NpemVbMF0gPSBwRGVzLT5idWZmZXJfdG90YWxfc2l6ZTsKKworCS8vIFNldCBmcmFnbWVudCB0aHJlc2hvbGQKKwlGcmFnbWVudFRocmVzaG9sZCAtPSAoRE9UXzExX01BQ19IRUFERVJfU0laRSArIDQpOworCXBEZXMtPkZyYWdtZW50VGhyZXNob2xkID0gRnJhZ21lbnRUaHJlc2hvbGQ7CisKKwkvLyBTZXQgbW9yZSBmcmFnIGJpdAorCVRhcmdldEJ1ZmZlclsxXSB8PSAweDA0Oy8vIFNldCBtb3JlIGZyYWcgYml0CisKKwkvLworCS8vIFNldCB0eCByYXRlCisJLy8KKwlzdG1wID0gKih1MTYgKikoVGFyZ2V0QnVmZmVyKzMwKTsgLy8gMm4gYWxpZ25tZW50IGFkZHJlc3MKKworCS8vVXNlIGJhc2ljIHJhdGUKKwljdG1wMSA9IGN0bXBmID0gQ1VSUkVOVF9UWF9SQVRFX0ZPUl9NTkc7CisKKwlwRGVzLT5UeFJhdGUgPSBjdG1wMTsKKwkjaWZkZWYgX1BFX1RYX0RVTVBfCisJV0JERUJVRygoIlR4IHJhdGUgPSV4XG4iLCBjdG1wMSkpOworCSNlbmRpZgorCisJcFQwMS0+VDAxX21vZHVsYXRpb25fdHlwZSA9IChjdG1wMSUzKSA/IDAgOiAxOworCisJZm9yKCBpPTA7IGk8MjsgaSsrICkgeworCQlpZiggaSA9PSAxICkKKwkJCWN0bXAxID0gY3RtcGY7CisKKwkJcE1kcy0+VHhSYXRlW3BEZXMtPkRlc2NyaXB0b3JfSURdW2ldID0gY3RtcDE7IC8vIGJhY2t1cCB0aGUgdGEgcmF0ZSBhbmQgZmFsbCBiYWNrIHJhdGUKKworCQlpZiggY3RtcDEgPT0gMTA4KSBjdG1wMiA9IDc7CisJCWVsc2UgaWYoIGN0bXAxID09IDk2ICkgY3RtcDIgPSA2OyAvLyBSYXRlIGNvbnZlcnQgZm9yIFVTQgorCQllbHNlIGlmKCBjdG1wMSA9PSA3MiApIGN0bXAyID0gNTsKKwkJZWxzZSBpZiggY3RtcDEgPT0gNDggKSBjdG1wMiA9IDQ7CisJCWVsc2UgaWYoIGN0bXAxID09IDM2ICkgY3RtcDIgPSAzOworCQllbHNlIGlmKCBjdG1wMSA9PSAyNCApIGN0bXAyID0gMjsKKwkJZWxzZSBpZiggY3RtcDEgPT0gMTggKSBjdG1wMiA9IDE7CisJCWVsc2UgaWYoIGN0bXAxID09IDEyICkgY3RtcDIgPSAwOworCQllbHNlIGlmKCBjdG1wMSA9PSAyMiApIGN0bXAyID0gMzsKKwkJZWxzZSBpZiggY3RtcDEgPT0gMTEgKSBjdG1wMiA9IDI7CisJCWVsc2UgaWYoIGN0bXAxID09IDQgICkgY3RtcDIgPSAxOworCQllbHNlIGN0bXAyID0gMDsgLy8gaWYoIGN0bXAxID09IDIgICkgb3IgZGVmYXVsdAorCisJCWlmKCBpID09IDAgKQorCQkJcFQwMS0+VDAxX3RyYW5zbWl0X3JhdGUgPSBjdG1wMjsKKwkJZWxzZQorCQkJcFQwMS0+VDAxX2ZhbGxfYmFja19yYXRlID0gY3RtcDI7CisJfQorCisJLy8KKwkvLyBTZXQgcHJlYW1ibGUgdHlwZQorCS8vCisJaWYgKChwVDAxLT5UMDFfbW9kdWxhdGlvbl90eXBlID09IDApICYmIChwVDAxLT5UMDFfdHJhbnNtaXRfcmF0ZSA9PSAwKSkJLy8gUkFURV8xTQorCQlwRGVzLT5QcmVhbWJsZU1vZGUgPSAgV0xBTl9QUkVBTUJMRV9UWVBFX0xPTkc7CisJZWxzZQorCQlwRGVzLT5QcmVhbWJsZU1vZGUgPSAgQ1VSUkVOVF9QUkVBTUJMRV9NT0RFOworCXBUMDEtPlQwMV9wbGNwX2hlYWRlcl9sZW5ndGggPSBwRGVzLT5QcmVhbWJsZU1vZGU7CS8vIFNldCBwcmVhbWJsZQorCit9CisKK3ZvaWQKK01kc19UeChzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKiBhZGFwdGVyKQoreworCXBod19kYXRhX3QJcEh3RGF0YSA9ICZhZGFwdGVyLT5zSHdEYXRhOworCVBNRFMJCXBNZHMgPSAmYWRhcHRlci0+TWRzOworCURFU0NSSVBUT1IJVHhEZXM7CisJUERFU0NSSVBUT1IJcFR4RGVzID0gJlR4RGVzOworCXU4CQkqWG1pdEJ1ZkFkZHJlc3M7CisJdTE2CQlYbWl0QnVmU2l6ZSwgUGFja2V0U2l6ZSwgc3RtcCwgQ3VycmVudFNpemUsIEZyYWdtZW50VGhyZXNob2xkOworCXU4CQlGaWxsSW5kZXgsIFR4RGVzSW5kZXgsIEZyYWdtZW50Q291bnQsIEZpbGxDb3VudDsKKwl1bnNpZ25lZCBjaGFyCUJ1ZmZlckZpbGxlZCA9IGZhbHNlLCBNSUNBZGQgPSAwOworCisKKwlpZiAocE1kcy0+VHhQYXVzZSkKKwkJcmV0dXJuOworCWlmICghaGFsX2RyaXZlcl9pbml0X09LKHBId0RhdGEpKQorCQlyZXR1cm47CisKKwkvL09ubHkgb25lIHRocmVhZCBjYW4gYmUgcnVuIGhlcmUKKwlpZiAoIWF0b21pY19pbmNfcmV0dXJuKCZwTWRzLT5UeFRocmVhZENvdW50KSA9PSAxKQorCQlnb3RvIGNsZWFudXA7CisKKwkvLyBTdGFydCB0byBmaWxsIHRoZSBkYXRhCisJZG8geworCQlGaWxsSW5kZXggPSBwTWRzLT5UeEZpbGxJbmRleDsKKwkJaWYgKHBNZHMtPlR4T3duZXJbRmlsbEluZGV4XSkgeyAvLyBJcyBvd25lZCBieSBzb2Z0d2FyZSAwOlllcyAxOk5vCisjaWZkZWYgX1BFX1RYX0RVTVBfCisJCQlXQkRFQlVHKCgiW01kc19UeF0gVHggT3duZXIgaXMgSC9XLlxuIikpOworI2VuZGlmCisJCQlicmVhazsKKwkJfQorCisJCVhtaXRCdWZBZGRyZXNzID0gcE1kcy0+cFR4QnVmZmVyICsgKE1BWF9VU0JfVFhfQlVGRkVSICogRmlsbEluZGV4KTsgLy9HZXQgYnVmZmVyCisJCVhtaXRCdWZTaXplID0gMDsKKwkJRmlsbENvdW50ID0gMDsKKwkJZG8geworCQkJUGFja2V0U2l6ZSA9IGFkYXB0ZXItPnNNbG1lRnJhbWUubGVuOworCQkJaWYgKCFQYWNrZXRTaXplKQorCQkJCWJyZWFrOworCisJCQkvL0ZvciBDaGVjayB0aGUgYnVmZmVyIHJlc291cmNlCisJCQlGcmFnbWVudFRocmVzaG9sZCA9IENVUlJFTlRfRlJBR01FTlRfVEhSRVNIT0xEOworCQkJLy85MzExMzAuNS5iCisJCQlGcmFnbWVudENvdW50ID0gUGFja2V0U2l6ZS9GcmFnbWVudFRocmVzaG9sZCArIDE7CisJCQlzdG1wID0gUGFja2V0U2l6ZSArIEZyYWdtZW50Q291bnQqMzIgKyA4Oy8vOTMxMTMwLjUuYyA4Ok1JQworCQkJaWYgKChYbWl0QnVmU2l6ZSArIHN0bXApID49IE1BWF9VU0JfVFhfQlVGRkVSKSB7CisJCQkJcHJpbnRrKCJbTWRzX1R4XSBFeGNlc3MgbWF4IHR4IGJ1ZmZlci5cbiIpOworCQkJCWJyZWFrOyAvLyBidWZmZXIgaXMgbm90IGVub3VnaAorCQkJfQorCisKKwkJCS8vCisJCQkvLyBTdGFydCB0cmFuc21pdHRpbmcKKwkJCS8vCisJCQlCdWZmZXJGaWxsZWQgPSB0cnVlOworCisJCQkvKiBMZWF2ZXMgZmlyc3QgdTggaW50YWN0ICovCisJCQltZW1zZXQoKHU4ICopcFR4RGVzICsgMSwgMCwgc2l6ZW9mKERFU0NSSVBUT1IpIC0gMSk7CisKKwkJCVR4RGVzSW5kZXggPSBwTWRzLT5UeERlc0luZGV4Oy8vR2V0IHRoZSBjdXJyZW50IElECisJCQlwVHhEZXMtPkRlc2NyaXB0b3JfSUQgPSBUeERlc0luZGV4OworCQkJcE1kcy0+VHhEZXNGcm9tWyBUeERlc0luZGV4IF0gPSAyOy8vU3RvcmluZyB0aGUgaW5mb3JtYXRpb24gb2Ygc291cmNlIGNvbW1pbmcgZnJvbQorCQkJcE1kcy0+VHhEZXNJbmRleCsrOworCQkJcE1kcy0+VHhEZXNJbmRleCAlPSBNQVhfVVNCX1RYX0RFU0NSSVBUT1I7CisKKwkJCU1MTUVfR2V0TmV4dFBhY2tldCggYWRhcHRlciwgcFR4RGVzICk7CisKKwkJCS8vIENvcHkgaGVhZGVyLiA4Ynl0ZSBVU0IgKyAyNGJ5dGUgODAyLjExSGRyLiBTZXQgVHhSYXRlLCBQcmVhbWJsZSB0eXBlCisJCQlNZHNfSGVhZGVyQ29weSggYWRhcHRlciwgcFR4RGVzLCBYbWl0QnVmQWRkcmVzcyApOworCisJCQkvLyBGb3Igc3BlZWQgdXAgS2V5IHNldHRpbmcKKwkJCWlmIChwVHhEZXMtPkVhcEZpeCkgeworI2lmZGVmIF9QRV9UWF9EVU1QXworCQkJCVdCREVCVUcoKCIzNTogRVBBIDR0aCBmcmFtZSBkZXRlY3RlZC4gU2l6ZSA9ICVkXG4iLCBQYWNrZXRTaXplKSk7CisjZW5kaWYKKwkJCQlwSHdEYXRhLT5Jc0tleVByZVNldCA9IDE7CisJCQl9CisKKwkJCS8vIENvcHkgKGZyYWdtZW50KSBmcmFtZSBib2R5LCBhbmQgc2V0IFVTQiwgODAyLjExIGhkciBmbGFnCisJCQlDdXJyZW50U2l6ZSA9IE1kc19Cb2R5Q29weShhZGFwdGVyLCBwVHhEZXMsIFhtaXRCdWZBZGRyZXNzKTsKKworCQkJLy8gU2V0IFJUUy9DVFMgYW5kIE5vcm1hbCBkdXJhdGlvbiBmaWVsZCBpbnRvIGJ1ZmZlcgorCQkJTWRzX0R1cmF0aW9uU2V0KGFkYXB0ZXIsIHBUeERlcywgWG1pdEJ1ZkFkZHJlc3MpOworCisJCQkvLworCQkJLy8gQ2FsY3VsYXRpb24gTUlDIGZyb20gYnVmZmVyIHdoaWNoIG1heWJlIGZyYWdtZW50LCB0aGVuIGZpbGwgaW50byB0ZW1wb3JhcnkgYWRkcmVzcyA4IGJ5dGUKKwkJCS8vIDkzMTEzMC41LmUKKwkJCWlmIChNSUNBZGQpCisJCQkJTWRzX01pY0ZpbGwoIGFkYXB0ZXIsIHBUeERlcywgWG1pdEJ1ZkFkZHJlc3MgKTsKKworCQkJLy9TaGlmdCB0byB0aGUgbmV4dCBhZGRyZXNzCisJCQlYbWl0QnVmU2l6ZSArPSBDdXJyZW50U2l6ZTsKKwkJCVhtaXRCdWZBZGRyZXNzICs9IEN1cnJlbnRTaXplOworCisjaWZkZWYgX0lCU1NfQkVBQ09OX1NFUV9TVElDS18KKwkJCWlmICgoWG1pdEJ1ZkFkZHJlc3NbIERPVF8xMV9EQV9PRkZTRVQrOCBdICYgMHhmYykgIT0gTUFDX1NVQlRZUEVfTU5HTU5UX1BST0JFX1JFUVVFU1QpIC8vICs4IGZvciBVU0IgaGRyCisjZW5kaWYKKwkJCQlwTWRzLT5UeFRvZ2dsZSA9IHRydWU7CisKKwkJCS8vIEdldCBwYWNrZXQgdG8gdHJhbnNtaXQgY29tcGxldGVkLCAxOlRFU1RTVEEgMjpNTE1FIDM6IE5kaXMgZGF0YQorCQkJTUxNRV9TZW5kQ29tcGxldGUoYWRhcHRlciwgMCwgdHJ1ZSk7CisKKwkJCS8vIFNvZnR3YXJlIFRTQyBjb3VudCAyMDA2MDIxNAorCQkJcE1kcy0+VHhUc2MrKzsKKwkJCWlmIChwTWRzLT5UeFRzYyA9PSAwKQorCQkJCXBNZHMtPlR4VHNjXzIrKzsKKworCQkJRmlsbENvdW50Kys7IC8vIDIwMDYwOTI4CisJCX0gd2hpbGUgKEhBTF9VU0JfTU9ERV9CVVJTVChwSHdEYXRhKSk7IC8vIEVuZCBvZiBtdWx0aXBsZSBNU0RVIGNvcHkgbG9vcC4gZmFsc2UgPSBzaW5nbGUgdHJ1ZSA9IG11bHRpcGxlIHNlbmRpbmcKKworCQkvLyBNb3ZlIHRvIHRoZSBuZXh0IG9uZSwgaWYgbmVjZXNzYXJ5CisJCWlmIChCdWZmZXJGaWxsZWQpIHsKKwkJCS8vIHNpemUgc2V0dGluZworCQkJcE1kcy0+VHhCdWZmZXJTaXplWyBGaWxsSW5kZXggXSA9IFhtaXRCdWZTaXplOworCisJCQkvLyAyMDA2MDkyOCBzZXQgVHggY291bnQKKwkJCXBNZHMtPlR4Q291bnRJbkJ1ZmZlcltGaWxsSW5kZXhdID0gRmlsbENvdW50OworCisJCQkvLyBTZXQgb3duZXIgZmxhZworCQkJcE1kcy0+VHhPd25lcltGaWxsSW5kZXhdID0gMTsKKworCQkJcE1kcy0+VHhGaWxsSW5kZXgrKzsKKwkJCXBNZHMtPlR4RmlsbEluZGV4ICU9IE1BWF9VU0JfVFhfQlVGRkVSX05VTUJFUjsKKwkJCUJ1ZmZlckZpbGxlZCA9IGZhbHNlOworCQl9IGVsc2UKKwkJCWJyZWFrOworCisJCWlmICghUGFja2V0U2l6ZSkgLy8gTm8gbW9yZSBwayBmb3IgdHJhbnNtaXR0aW5nCisJCQlicmVhazsKKworCX0gd2hpbGUodHJ1ZSk7CisKKwkvLworCS8vIFN0YXJ0IHRvIHNlbmQgYnkgbG93ZXIgbW9kdWxlCisJLy8KKwlpZiAoIXBId0RhdGEtPklzS2V5UHJlU2V0KQorCQlXYjM1VHhfc3RhcnQoYWRhcHRlcik7CisKKyBjbGVhbnVwOgorCWF0b21pY19kZWMoJnBNZHMtPlR4VGhyZWFkQ291bnQpOworfQorCit2b2lkCitNZHNfU2VuZENvbXBsZXRlKHN0cnVjdCB3YnNvZnRfcHJpdiAqIGFkYXB0ZXIsIFBUMDJfREVTQ1JJUFRPUiBwVDAyKQoreworCVBNRFMJcE1kcyA9ICZhZGFwdGVyLT5NZHM7CisJcGh3X2RhdGFfdAlwSHdEYXRhID0gJmFkYXB0ZXItPnNId0RhdGE7CisJdTgJUGFja2V0SWQgPSAodTgpcFQwMi0+VDAyX1R4X1BrdElEOworCXVuc2lnbmVkIGNoYXIJU2VuZE9LID0gdHJ1ZTsKKwl1OAlSZXRyeUNvdW50LCBUeFJhdGU7CisKKwlpZiAocFQwMi0+VDAyX0lnbm9yZVJlc3VsdCkgLy8gRG9uJ3QgY2FyZSB0aGUgcmVzdWx0CisJCXJldHVybjsKKwlpZiAocFQwMi0+VDAyX0lzTGFzdE1wZHUpIHsKKwkJLy9UT0RPOiBEVE8gLS0gZ2V0IHRoZSByZXRyeSBjb3VudCBhbmQgZnJhZ21lbnQgY291bnQKKwkJLy8gVHggcmF0ZQorCQlUeFJhdGUgPSBwTWRzLT5UeFJhdGVbIFBhY2tldElkIF1bIDAgXTsKKwkJUmV0cnlDb3VudCA9ICh1OClwVDAyLT5UMDJfTVBEVV9DbnQ7CisJCWlmIChwVDAyLT52YWx1ZSAmIEZMQUdfRVJST1JfVFhfTUFTSykgeworCQkJU2VuZE9LID0gZmFsc2U7CisKKwkJCWlmIChwVDAyLT5UMDJfdHJhbnNtaXRfYWJvcnQgfHwgcFQwMi0+VDAyX291dF9vZl9NYXhUeE1TRFVMaWZ0VGltZSkgeworCQkJCS8vcmV0cnkgZXJyb3IKKwkJCQlwSHdEYXRhLT5kdG9fdHhfcmV0cnlfY291bnQgKz0gKFJldHJ5Q291bnQrMSk7CisJCQkJLy9bZm9yIHR4IGRlYnVnXQorCQkJCWlmIChSZXRyeUNvdW50PDcpCisJCQkJCXBId0RhdGEtPnR4X3JldHJ5X2NvdW50W1JldHJ5Q291bnRdICs9IFJldHJ5Q291bnQ7CisJCQkJZWxzZQorCQkJCQlwSHdEYXRhLT50eF9yZXRyeV9jb3VudFs3XSArPSBSZXRyeUNvdW50OworCQkJCSNpZmRlZiBfUEVfU1RBVEVfRFVNUF8KKwkJCQlXQkRFQlVHKCgiZHRvX3R4X3JldHJ5X2NvdW50ID0lZFxuIiwgcEh3RGF0YS0+ZHRvX3R4X3JldHJ5X2NvdW50KSk7CisJCQkJI2VuZGlmCisJCQkJTVRPX1NldFR4Q291bnQoYWRhcHRlciwgVHhSYXRlLCBSZXRyeUNvdW50KTsKKwkJCX0KKwkJCXBId0RhdGEtPmR0b190eF9mcmFnX2NvdW50ICs9IChSZXRyeUNvdW50KzEpOworCisJCQkvL1tmb3IgdHggZGVidWddCisJCQlpZiAocFQwMi0+VDAyX3RyYW5zbWl0X2Fib3J0X2R1ZV90b19UQlRUKQorCQkJCXBId0RhdGEtPnR4X1RCVFRfc3RhcnRfY291bnQrKzsKKwkJCWlmIChwVDAyLT5UMDJfdHJhbnNtaXRfd2l0aG91dF9lbmNyeXB0aW9uX2R1ZV90b193ZXBfb25fZmFsc2UpCisJCQkJcEh3RGF0YS0+dHhfV2VwT25fZmFsc2VfY291bnQrKzsKKwkJCWlmIChwVDAyLT5UMDJfZGlzY2FyZF9kdWVfdG9fbnVsbF93ZXBfa2V5KQorCQkJCXBId0RhdGEtPnR4X051bGxfa2V5X2NvdW50Kys7CisJCX0gZWxzZSB7CisJCQlpZiAocFQwMi0+VDAyX2VmZmVjdGl2ZV90cmFuc21pc3Npb25fcmF0ZSkKKwkJCQlwSHdEYXRhLT50eF9FVFJfY291bnQrKzsKKwkJCU1UT19TZXRUeENvdW50KGFkYXB0ZXIsIFR4UmF0ZSwgUmV0cnlDb3VudCk7CisJCX0KKworCQkvLyBDbGVhciBzZW5kIHJlc3VsdCBidWZmZXIKKwkJcE1kcy0+VHhSZXN1bHRbIFBhY2tldElkIF0gPSAwOworCX0gZWxzZQorCQlwTWRzLT5UeFJlc3VsdFsgUGFja2V0SWQgXSB8PSAoKHUxNikocFQwMi0+dmFsdWUgJiAweDBmZmZmKSk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9tZHNfZi5oIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbWRzX2YuaAppbmRleCA3YTY4MmQ0Li5lZTBmMTIwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9tZHNfZi5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL21kc19mLmgKQEAgLTEsMzMgKzEsMjMgQEAKLXVuc2lnbmVkIGNoYXIgTWRzX2luaXRpYWwoICBQQURBUFRFUiBBZGFwdGVyICk7Ci12b2lkIE1kc19EZXN0cm95KCAgUEFEQVBURVIgQWRhcHRlciApOwotdm9pZCBNZHNfVHgoICBQQURBUFRFUiBBZGFwdGVyICk7Ci12b2lkIE1kc19IZWFkZXJDb3B5KCAgUEFEQVBURVIgQWRhcHRlciwgIFBERVNDUklQVE9SIHBEZXMsICB1OCAqVGFyZ2V0QnVmZmVyICk7Ci11MTYgTWRzX0JvZHlDb3B5KCAgUEFEQVBURVIgQWRhcHRlciwgIFBERVNDUklQVE9SIHBEZXMsICB1OCAqVGFyZ2V0QnVmZmVyICk7Ci12b2lkIE1kc19EdXJhdGlvblNldCggIFBBREFQVEVSIEFkYXB0ZXIsICBQREVTQ1JJUFRPUiBwRGVzLCAgdTggKlRhcmdldEJ1ZmZlciApOwotdm9pZCBNZHNfU2VuZENvbXBsZXRlKCAgUEFEQVBURVIgQWRhcHRlciwgIFBUMDJfREVTQ1JJUFRPUiBwVDAyICk7Ci12b2lkIE1kc19NcGR1UHJvY2VzcyggIFBBREFQVEVSIEFkYXB0ZXIsICBQREVTQ1JJUFRPUiBwUnhEZXMgKTsKLXZvaWQgTWRzX3Jlc2V0X2Rlc2NyaXB0b3IoICBQQURBUFRFUiBBZGFwdGVyICk7CisjaWZuZGVmIF9fV0lOQk9ORF9NRFNfRl9ICisjZGVmaW5lIF9fV0lOQk9ORF9NRFNfRl9ICisKKyNpbmNsdWRlICJ3YmhhbF9zLmgiCisjaW5jbHVkZSAiY29yZS5oIgorCit1bnNpZ25lZCBjaGFyIE1kc19pbml0aWFsKCAgc3RydWN0IHdic29mdF9wcml2ICphZGFwdGVyICk7Cit2b2lkIE1kc19EZXN0cm95KCAgc3RydWN0IHdic29mdF9wcml2ICphZGFwdGVyICk7Cit2b2lkIE1kc19UeCggIHN0cnVjdCB3YnNvZnRfcHJpdiAqYWRhcHRlciApOwordm9pZCBNZHNfU2VuZENvbXBsZXRlKCAgc3RydWN0IHdic29mdF9wcml2ICphZGFwdGVyLCAgUFQwMl9ERVNDUklQVE9SIHBUMDIgKTsKK3ZvaWQgTWRzX01wZHVQcm9jZXNzKCAgc3RydWN0IHdic29mdF9wcml2ICphZGFwdGVyLCAgUERFU0NSSVBUT1IgcFJ4RGVzICk7CiBleHRlcm4gdm9pZCBEYXRhRG1wKHU4ICpwZGF0YSwgdTMyIGxlbiwgdTMyIG9mZnNldCk7CiAKLQotdm9pZCB2UnhUaW1lckluaXQoUFdCMzJfQURBUFRFUiBBZGFwdGVyKTsKLXZvaWQgdlJ4VGltZXJTdGFydChQV0IzMl9BREFQVEVSIEFkYXB0ZXIsIGludCB0aW1lb3V0X3ZhbHVlKTsKLXZvaWQgUnhUaW1lckhhbmRsZXJfMWEoIFBBREFQVEVSIEFkYXB0ZXIpOwotdm9pZCB2UnhUaW1lclN0b3AoUFdCMzJfQURBUFRFUiBBZGFwdGVyKTsKLXZvaWQgUnhUaW1lckhhbmRsZXIoIHZvaWQqCQkJU3lzdGVtU3BlY2lmaWMxLAotCQkJCQkgICBQV0IzMl9BREFQVEVSIAlBZGFwdGVyLAotCQkJCQkgICB2b2lkKgkJCVN5c3RlbVNwZWNpZmljMiwKLQkJCQkJICAgdm9pZCoJCQlTeXN0ZW1TcGVjaWZpYzMpOwotCi0KIC8vIEZvciBBc3luY2hyb25vdXMgaW5kaWNhdGluZy4gVGhlIHJvdXRpbmUgY29sbG9jYXRlcyB3aXRoIFVTQi4KLXZvaWQgTWRzX01zZHVQcm9jZXNzKCAgUFdCMzJfQURBUFRFUiBBZGFwdGVyLCAgUFJYTEFZRVIxIHBSeExheWVyMSwgIHU4IFNsb3RJbmRleCk7Cit2b2lkIE1kc19Nc2R1UHJvY2VzcyggIHN0cnVjdCB3YnNvZnRfcHJpdiAqYWRhcHRlciwgIFBSWExBWUVSMSBwUnhMYXllcjEsICB1OCBTbG90SW5kZXgpOwogCiAvLyBGb3IgZGF0YSBmcmFtZSBzZW5kaW5nIDIwMDYwODAyCi11MTYgTURTX0dldFBhY2tldFNpemUoICBQQURBUFRFUiBBZGFwdGVyICk7Ci12b2lkIE1EU19HZXROZXh0UGFja2V0KCAgUEFEQVBURVIgQWRhcHRlciwgIFBERVNDUklQVE9SIHBEZXMgKTsKLXZvaWQgTURTX0dldE5leHRQYWNrZXRDb21wbGV0ZSggIFBBREFQVEVSIEFkYXB0ZXIsICBQREVTQ1JJUFRPUiBwRGVzICk7Ci12b2lkIE1EU19TZW5kUmVzdWx0KCAgUEFEQVBURVIgQWRhcHRlciwgIHU4IFBhY2tldElkLCAgdW5zaWduZWQgY2hhciBTZW5kT0sgKTsKLXZvaWQgTURTX0V0aGVybmV0UGFja2V0UmVjZWl2ZSggIFBBREFQVEVSIEFkYXB0ZXIsICBQUlhMQVlFUjEgcFJ4TGF5ZXIxICk7Cit1MTYgTURTX0dldFBhY2tldFNpemUoICBzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKmFkYXB0ZXIgKTsKK3ZvaWQgTURTX0dldE5leHRQYWNrZXQoICBzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKmFkYXB0ZXIsICBQREVTQ1JJUFRPUiBwRGVzICk7Cit2b2lkIE1EU19HZXROZXh0UGFja2V0Q29tcGxldGUoICBzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKmFkYXB0ZXIsICBQREVTQ1JJUFRPUiBwRGVzICk7Cit2b2lkIE1EU19TZW5kUmVzdWx0KCAgc3RydWN0IHdic29mdF9wcml2ICphZGFwdGVyLCAgdTggUGFja2V0SWQsICB1bnNpZ25lZCBjaGFyIFNlbmRPSyApOwogCi0KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbWRzX3MuaCBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL21kc19zLmgKaW5kZXggOWRmMmUwOS4uZWJmNjFlMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbWRzX3MuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9tZHNfcy5oCkBAIC0xLDkgKzEsMTkgQEAKKyNpZm5kZWYgX19XSU5CT05EX01EU19ICisjZGVmaW5lIF9fV0lOQk9ORF9NRFNfSAorCisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KKworI2luY2x1ZGUgImxvY2FscGFyYS5oIgorI2luY2x1ZGUgIm1hY19zdHJ1Y3R1cmVzLmgiCisjaW5jbHVkZSAic2Nhbl9zLmgiCisKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAjZGVmaW5lIE1BWF9VU0JfVFhfREVTQ1JJUFRPUgkJMTUJCS8vIElTODlDMzUgYWJpbGl0eQogI2RlZmluZSBNQVhfVVNCX1RYX0JVRkZFUl9OVU1CRVIJNAkJLy8gVmlydHVhbCBwcmUtYnVmZmVyIG51bWJlciBvZiBNQVhfVVNCX1RYX0JVRkZFUgogI2RlZmluZSBNQVhfVVNCX1RYX0JVRkZFUgkJCTQwOTYJLy8gSVM4OUMzNSBhYmlsaXR5IDRuIGFsaWdubWVudCBpcyByZXF1aXJlZCBmb3IgaGFyZHdhcmUKIAotI2RlZmluZSBNRFNfRVZFTlRfSU5ESUNBVEUoIF9BLCBfQiwgX0YgKQlPU19FVkVOVF9JTkRJQ0FURSggX0EsIF9CLCBfRiApCiAjZGVmaW5lIEFVVEhfUkVRVUVTVF9QQUlSV0lTRV9FUlJPUgkJCTAJCS8vIF9GIGZsYWcgc2V0dGluZwogI2RlZmluZSBBVVRIX1JFUVVFU1RfR1JPVVBfRVJST1IJCQkxCQkvLyBfRiBmbGFnIHNldHRpbmcKIApAQCAtMjEsMjAgKzMxLDE5IEBACiAjZGVmaW5lIENVUlJFTlRfUEFJUldJU0VfS0VZCQkJcHNTTUUtPnR4X21pY19rZXkKICNkZWZpbmUgQ1VSUkVOVF9HUk9VUF9LRVkJCQkJcHNTTUUtPmdyb3VwX3R4X21pY19rZXkKICNkZWZpbmUgQ1VSUkVOVF9FTkNSWVBUX1NUQVRVUwkJCXBzU01FLT5lbmNyeXB0X3N0YXR1cwotI2RlZmluZSBDVVJSRU5UX1dFUF9JRAkJCQkJQWRhcHRlci0+c1NtZVBhcmEuX2RvdDExV0VQRGVmYXVsdEtleUlECi0jZGVmaW5lIENVUlJFTlRfQ09OVFJPTF9QT1JUX0JMT0NLCQkoIHBzU01FLT53cGFfb2shPTEgfHwgKEFkYXB0ZXItPk1kcy5ib0NvdW50ZXJNZWFzdXJlQmxvY2s9PTEgJiYgKENVUlJFTlRfRU5DUllQVF9TVEFUVVM9PUVOQ1JZUFRfVEtJUCkpICkKLSNkZWZpbmUgQ1VSUkVOVF9GUkFHTUVOVF9USFJFU0hPTEQJCShBZGFwdGVyLT5NZHMuVHhGcmFnbWVudFRocmVzaG9sZCAmIH4weDEpCisjZGVmaW5lIENVUlJFTlRfV0VQX0lECQkJCQlhZGFwdGVyLT5zU21lUGFyYS5fZG90MTFXRVBEZWZhdWx0S2V5SUQKKyNkZWZpbmUgQ1VSUkVOVF9DT05UUk9MX1BPUlRfQkxPQ0sJCSggcHNTTUUtPndwYV9vayE9MSB8fCAoYWRhcHRlci0+TWRzLmJvQ291bnRlck1lYXN1cmVCbG9jaz09MSAmJiAoQ1VSUkVOVF9FTkNSWVBUX1NUQVRVUz09RU5DUllQVF9US0lQKSkgKQorI2RlZmluZSBDVVJSRU5UX0ZSQUdNRU5UX1RIUkVTSE9MRAkJKGFkYXB0ZXItPk1kcy5UeEZyYWdtZW50VGhyZXNob2xkICYgfjB4MSkKICNkZWZpbmUgQ1VSUkVOVF9QUkVBTUJMRV9NT0RFCQkJcHNMT0NBTC0+Ym9TaG9ydFByZWFtYmxlP1dMQU5fUFJFQU1CTEVfVFlQRV9TSE9SVDpXTEFOX1BSRUFNQkxFX1RZUEVfTE9ORwotI2RlZmluZSBDVVJSRU5UX0xJTktfT04JCQkJCU9TX0xJTktfU1RBVFVTCi0jZGVmaW5lIENVUlJFTlRfVFhfUkFURQkJCQkJQWRhcHRlci0+c0xvY2FsUGFyYS5DdXJyZW50VHhSYXRlCi0jZGVmaW5lIENVUlJFTlRfRkFMTF9CQUNLX1RYX1JBVEUJCUFkYXB0ZXItPnNMb2NhbFBhcmEuQ3VycmVudFR4RmFsbGJhY2tSYXRlCi0jZGVmaW5lIENVUlJFTlRfVFhfUkFURV9GT1JfTU5HCQkJQWRhcHRlci0+c0xvY2FsUGFyYS5DdXJyZW50VHhSYXRlRm9yTW5nCisjZGVmaW5lIENVUlJFTlRfVFhfUkFURQkJCQkJYWRhcHRlci0+c0xvY2FsUGFyYS5DdXJyZW50VHhSYXRlCisjZGVmaW5lIENVUlJFTlRfRkFMTF9CQUNLX1RYX1JBVEUJCWFkYXB0ZXItPnNMb2NhbFBhcmEuQ3VycmVudFR4RmFsbGJhY2tSYXRlCisjZGVmaW5lIENVUlJFTlRfVFhfUkFURV9GT1JfTU5HCQkJYWRhcHRlci0+c0xvY2FsUGFyYS5DdXJyZW50VHhSYXRlRm9yTW5nCiAjZGVmaW5lIENVUlJFTlRfUFJPVEVDVF9NRUNIQU5JU00JCXBzTE9DQUwtPmJvUHJvdGVjdE1lY2hhbmlzbQotI2RlZmluZSBDVVJSRU5UX1JUU19USFJFU0hPTEQJCQlBZGFwdGVyLT5NZHMuVHhSVFNUaHJlc2hvbGQKKyNkZWZpbmUgQ1VSUkVOVF9SVFNfVEhSRVNIT0xECQkJYWRhcHRlci0+TWRzLlR4UlRTVGhyZXNob2xkCiAKLSNkZWZpbmUgTUlCX0dTX1hNSVRfT0tfSU5DCQkJCUFkYXB0ZXItPnNMb2NhbFBhcmEuR1NfWE1JVF9PSysrCi0jZGVmaW5lIE1JQl9HU19SQ1ZfT0tfSU5DCQkJCUFkYXB0ZXItPnNMb2NhbFBhcmEuR1NfUkNWX09LKysKLSNkZWZpbmUgTUlCX0dTX1hNSVRfRVJST1JfSU5DCQkJQWRhcHRlci0+c0xvY2FsUGFyYS5HU19YTUlUX0VSUk9SCisjZGVmaW5lIE1JQl9HU19YTUlUX09LX0lOQwkJCQlhZGFwdGVyLT5zTG9jYWxQYXJhLkdTX1hNSVRfT0srKworI2RlZmluZSBNSUJfR1NfUkNWX09LX0lOQwkJCQlhZGFwdGVyLT5zTG9jYWxQYXJhLkdTX1JDVl9PSysrCisjZGVmaW5lIE1JQl9HU19YTUlUX0VSUk9SX0lOQwkJCWFkYXB0ZXItPnNMb2NhbFBhcmEuR1NfWE1JVF9FUlJPUgogCiAvLy0tLS0tLS0tLS0gVFggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICNkZWZpbmUgRVRIRVJORVRfVFhfREVTQ1JJUFRPUlMgICAgICAgICBNQVhfVVNCX1RYX0JVRkZFUl9OVU1CRVIKQEAgLTk2LDkgKzEwNSw5IEBACiAJdTgJU2NhblR4UGF1c2U7CS8vZGF0YSBUeCBwYXVzZSBiZWNhdXNlIHRoZSBzY2FubmluZyBpcyBwcm9ncmVzc2luZywgYnV0IHByb2JlIHJlcXVlc3QgVHggd29uJ3QuCiAJdTgJVHhQYXVzZTsvL0ZvciBwYXVzZSB0aGUgTWRzX1R4IG1vZHVsdAogCi0JT1NfQVRPTUlDCVR4VGhyZWFkQ291bnQ7Ly9Gb3IgdGhyZWFkIGNvdW50aW5nIDkzMTEzMC40LnYKKwlhdG9taWNfdAlUeFRocmVhZENvdW50Oy8vRm9yIHRocmVhZCBjb3VudGluZyA5MzExMzAuNC52CiAvLzk1MDMwMSBkZWxldGUgZHVlIHRvIEhXCi0vLwlPU19BVE9NSUMJVHhDb25jdXJyZW50Q291bnQ7Ly85MzExMzAuNC53CisvLwlhdG9taWNfdAlUeENvbmN1cnJlbnRDb3VudDsvLzkzMTEzMC40LncKIAogCXUxNglUeFJlc3VsdFsgKChNQVhfVVNCX1RYX0RFU0NSSVBUT1IgKyAxKSAmIH4weDAxKSBdOy8vQ29sbGVjdCB0aGUgc2VuZGluZyByZXN1bHQgb2YgTXBkdQogCkBAIC0xMzMsOSArMTQyLDYgQEAKIAl1OAkJYm9Db3VudGVyTWVhc3VyZUJsb2NrOwogCXU4CQlyZXNlcnZlZF80WzJdOwogCi0JLy9ORElTX01JTklQT1JUX1RJTUVSCW5UaW1lcjsKLQlPU19USU1FUgluVGltZXI7Ci0KIAl1MzIJVHhUc2M7IC8vIDIwMDYwMjE0CiAJdTMyCVR4VHNjXzI7IC8vIDIwMDYwMjE0CiAKQEAgLTE4MCw0ICsxODYsNCBAQAogCiB9UlhMQVlFUjEsICogUFJYTEFZRVIxOwogCi0KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbWxtZV9taWIuaCBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL21sbWVfbWliLmgKaW5kZXggODk3NTk3My4uY2E4OTIyZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbWxtZV9taWIuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9tbG1lX21pYi5oCkBAIC0yMiwxNSArMjIsMTUgQEAKIC8vICAgU2V0IHRoZSBkb3QxMUV4Y2x1ZGVVbmVuY3J5cHRlZCB2YWx1ZS4KIC8vCiAvLyBBcmd1bWVudHM6Ci0vLyAgIEFkYXB0ZXIgICAgICAgIC0gVGhlIHBvaW50ZXIgdG8gdGhlIG1pbmlwb3J0IGFkYXB0ZXIgY29udGV4dC4KKy8vICAgYWRhcHRlciAgICAgICAgLSBUaGUgcG9pbnRlciB0byB0aGUgbWluaXBvcnQgYWRhcHRlciBjb250ZXh0LgogLy8gICBFeFVuZW5jcnlwdGVkICAtIHVuc2lnbmVkIGNoYXIgdHlwZS4gVGhlIHZhbHVlIHRvIGJlIHNldC4KIC8vCiAvLyBSZXR1cm4gdmFsdWVzOgogLy8gICBOb25lLgogLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jZGVmaW5lIE1MTUVTZXRFeGNsdWRlVW5lbmNyeXB0ZWQoQWRhcHRlciwgRXhVbmVuY3J5cHRlZCkgICAgIFwKKyNkZWZpbmUgTUxNRVNldEV4Y2x1ZGVVbmVuY3J5cHRlZChhZGFwdGVyLCBFeFVuZW5jcnlwdGVkKSAgICAgXAogeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIChBZGFwdGVyKS0+c0xvY2FsUGFyYS5FeGNsdWRlVW5lbmNyeXB0ZWQgPSBFeFVuZW5jcnlwdGVkOyAgICAgICAgICAgICBcCisgICAgKGFkYXB0ZXIpLT5zTG9jYWxQYXJhLkV4Y2x1ZGVVbmVuY3J5cHRlZCA9IEV4VW5lbmNyeXB0ZWQ7ICAgICAgICAgICAgIFwKIH0KIAogLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CkBAIC00MCwxMiArNDAsMTIgQEAKIC8vICAgR2V0IHRoZSBkb3QxMUV4Y2x1ZGVVbmVuY3J5cHRlZCB2YWx1ZS4KIC8vCiAvLyBBcmd1bWVudHM6Ci0vLyAgIEFkYXB0ZXIgICAgICAgIC0gVGhlIHBvaW50ZXIgdG8gdGhlIG1pbmlwb3J0IGFkYXB0ZXIgY29udGV4dC4KKy8vICAgYWRhcHRlciAgICAgICAgLSBUaGUgcG9pbnRlciB0byB0aGUgbWluaXBvcnQgYWRhcHRlciBjb250ZXh0LgogLy8KIC8vIFJldHVybiB2YWx1ZXM6CiAvLyAgIHVuc2lnbmVkIGNoYXIgdHlwZS4gVGhlIGN1cnJlbnQgZG90MTFFeGNsdWRlVW5lbmNyeXB0ZWQgdmFsdWUuCiAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSNkZWZpbmUgTUxNRUdldEV4Y2x1ZGVVbmVuY3J5cHRlZChBZGFwdGVyKSAoKHVuc2lnbmVkIGNoYXIpIChBZGFwdGVyKS0+c0xvY2FsUGFyYS5FeGNsdWRlVW5lbmNyeXB0ZWQpCisjZGVmaW5lIE1MTUVHZXRFeGNsdWRlVW5lbmNyeXB0ZWQoYWRhcHRlcikgKCh1bnNpZ25lZCBjaGFyKSAoYWRhcHRlciktPnNMb2NhbFBhcmEuRXhjbHVkZVVuZW5jcnlwdGVkKQogCiAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIC8vIE1MTUVTZXRNYXhSZWNlaXZlTGlmZVRpbWUgLS0KQEAgLTU0LDE1ICs1NCwxNSBAQAogLy8gICBTZXQgdGhlIGRvdDExTWF4UmVjZWl2ZUxpZmVUaW1lIHZhbHVlLgogLy8KIC8vIEFyZ3VtZW50czoKLS8vICAgQWRhcHRlciAgICAgICAgLSBUaGUgcG9pbnRlciB0byB0aGUgbWluaXBvcnQgYWRhcHRlciBjb250ZXh0LgorLy8gICBhZGFwdGVyICAgICAgICAtIFRoZSBwb2ludGVyIHRvIHRoZSBtaW5pcG9ydCBhZGFwdGVyIGNvbnRleHQuCiAvLyAgIFJlY2VpdmVMaWZlVGltZS0gdTMyIHR5cGUuIFRoZSB2YWx1ZSB0byBiZSBzZXQuCiAvLwogLy8gUmV0dXJuIHZhbHVlczoKIC8vICAgTm9uZS4KIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotI2RlZmluZSBNTE1FU2V0TWF4UmVjZWl2ZUxpZmVUaW1lKEFkYXB0ZXIsIFJlY2VpdmVMaWZlVGltZSkgICAgXAorI2RlZmluZSBNTE1FU2V0TWF4UmVjZWl2ZUxpZmVUaW1lKGFkYXB0ZXIsIFJlY2VpdmVMaWZlVGltZSkgICAgXAogeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAoQWRhcHRlciktPk1kcy5NYXhSZWNlaXZlVGltZSA9IFJlY2VpdmVMaWZlVGltZTsgICAgICAgICAgICAgICAgXAorICAgIChhZGFwdGVyKS0+TWRzLk1heFJlY2VpdmVUaW1lID0gUmVjZWl2ZUxpZmVUaW1lOyAgICAgICAgICAgICAgICBcCiB9CiAKIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpAQCAtNzIsMTIgKzcyLDEyIEBACiAvLyAgIEdldCB0aGUgZG90MTFNYXhSZWNlaXZlTGlmZVRpbWUgdmFsdWUuCiAvLwogLy8gQXJndW1lbnRzOgotLy8gICBBZGFwdGVyICAgICAgICAtIFRoZSBwb2ludGVyIHRvIHRoZSBtaW5pcG9ydCBhZGFwdGVyIGNvbnRleHQuCisvLyAgIGFkYXB0ZXIgICAgICAgIC0gVGhlIHBvaW50ZXIgdG8gdGhlIG1pbmlwb3J0IGFkYXB0ZXIgY29udGV4dC4KIC8vCiAvLyBSZXR1cm4gdmFsdWVzOgogLy8gICB1MzIgdHlwZS4gVGhlIGN1cnJlbnQgZG90MTFNYXhSZWNlaXZlTGlmZVRpbWUgdmFsdWUuCiAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSNkZWZpbmUgTUxNRUdldE1heFJlY2VpdmVMaWZlVGltZShBZGFwdGVyKSAoKHUzMikgKEFkYXB0ZXIpLT5NZHMuTWF4UmVjZWl2ZVRpbWUpCisjZGVmaW5lIE1MTUVHZXRNYXhSZWNlaXZlTGlmZVRpbWUoYWRhcHRlcikgKCh1MzIpIChhZGFwdGVyKS0+TWRzLk1heFJlY2VpdmVUaW1lKQogCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbWxtZV9zLmggYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9tbG1lX3MuaAppbmRleCAwMzlmZDQwLi5lYTEyNjg0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9tbG1lX3MuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9tbG1lX3MuaApAQCAtMSwzICsxLDEyIEBACisjaWZuZGVmIF9fV0lOQk9ORF9NTE1FX0gKKyNkZWZpbmUgX19XSU5CT05EX01MTUVfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorCisjaW5jbHVkZSAibWFjX3N0cnVjdHVyZXMuaCIKKyNpbmNsdWRlICJtZHNfcy5oIgorCiAvLysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCiAvLwlNbG1lLmgKIC8vCQlEZWZpbmUgdGhlIHJlbGF0ZWQgZGVmaW5pdGlvbnMgb2YgTUxNRSBtb2R1bGUKQEAgLTE5Miw0ICsyMDEsNCBAQAogCiB9X19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIFJYREFUQSwgKnBzUlhEQVRBOwogCi0KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbWxtZXR4cnguYyBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL21sbWV0eHJ4LmMKaW5kZXggZTg1MzNiOGQxLi4wNzgwMmFmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9tbG1ldHhyeC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL21sbWV0eHJ4LmMKQEAgLTE3LDExMyArMTcsNTYgQEAKIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogI2luY2x1ZGUgIm9zX2NvbW1vbi5oIgogCi12b2lkIE1MTUVSZXNldFR4UngoUFdCMzJfQURBUFRFUiBBZGFwdGVyKQotewotCXMzMiAgICAgaTsKLQotCS8vIFJlc2V0IHRoZSBpbnRlcmZhY2UgYmV0d2VlbiBNRFMgYW5kIE1MTUUKLQlmb3IgKGkgPSAwOyBpIDwgTUFYX05VTV9UWF9NTVBEVTsgaSsrKQotCQlBZGFwdGVyLT5zTWxtZUZyYW1lLlR4TU1QRFVJblVzZVtpXSA9IEZBTFNFOwotCWZvciAoaSA9IDA7IGkgPCBNQVhfTlVNX1JYX01NUERVOyBpKyspCi0JCUFkYXB0ZXItPnNNbG1lRnJhbWUuU2F2ZVJ4QnVmU2xvdEluVXNlW2ldID0gRkFMU0U7Ci0KLQlBZGFwdGVyLT5zTWxtZUZyYW1lLndOdW1SeE1NUERVSW5NTE1FICAgPSAwOwotCUFkYXB0ZXItPnNNbG1lRnJhbWUud051bVJ4TU1QRFVEaXNjYXJkZWQgPSAwOwotCUFkYXB0ZXItPnNNbG1lRnJhbWUud051bVJ4TU1QRFUgICAgICAgICAgPSAwOwotCUFkYXB0ZXItPnNNbG1lRnJhbWUud051bVR4TU1QRFVEaXNjYXJkZWQgPSAwOwotCUFkYXB0ZXItPnNNbG1lRnJhbWUud051bVR4TU1QRFUgICAgICAgICAgPSAwOwotCUFkYXB0ZXItPnNMb2NhbFBhcmEuYm9DQ0FidXN5ICAgID0gRkFMU0U7Ci0JQWRhcHRlci0+c0xvY2FsUGFyYS5pUG93ZXJTYXZlTW9kZSAgICAgPSBQV1JfQUNUSVZFOyAgICAgLy8gUG93ZXIgYWN0aXZlCi19CisjaW5jbHVkZSAibWRzX2YuaCIKIAogLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8JRnVuY3Rpb246Ci0vLyAgICBNTE1FR2V0TU1QRFVCdWZmZXIoKQotLy8KLS8vCURlc2NyaXB0aW9uOgotLy8gICAgUmV0dXJuIHRoZSBwb2ludGVyIHRvIGFuIGF2YWlsYWJsZSBkYXRhIGJ1ZmZlciB3aXRoCi0vLyAgICB0aGUgc2l6ZSBNQVhfTU1QRFVfU0laRSBmb3IgYSBNTVBEVS4KLS8vCi0vLyAgQXJndW1lbnRzOgotLy8gICAgQWRhcHRlciAgIC0gcG9pbnRlciB0byB0aGUgbWluaXBvcnQgYWRhcHRlciBjb250ZXh0LgotLy8KLS8vCVJldHVybiB2YWx1ZToKLS8vICAgIE5VTEwgICAgIDogTm8gYXZhaWxhYmxlIGRhdGEgYnVmZmVyIGF2YWlsYWJsZQotLy8gICAgT3RoZXJ3aXNlOiBQb2ludGVyIHRvIHRoZSBkYXRhIGJ1ZmZlcgotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0vKiBGSVhNRTogU2hvdWxkIHRoaXMganVzdCBiZSByZXBsYWNlZCB3aXRoIGttYWxsb2MoKSBhbmQga2ZyZWUoKT8gKi8KLXU4ICpNTE1FR2V0TU1QRFVCdWZmZXIoUFdCMzJfQURBUFRFUiBBZGFwdGVyKQotewotCXMzMiBpOwotCXU4ICpyZXR1cm5WYWw7Ci0KLQlmb3IgKGkgPSAwOyBpPCBNQVhfTlVNX1RYX01NUERVOyBpKyspIHsKLQkJaWYgKEFkYXB0ZXItPnNNbG1lRnJhbWUuVHhNTVBEVUluVXNlW2ldID09IEZBTFNFKQotCQkJYnJlYWs7Ci0JfQotCWlmIChpID49IE1BWF9OVU1fVFhfTU1QRFUpIHJldHVybiBOVUxMOwotCi0JcmV0dXJuVmFsID0gKHU4ICopJihBZGFwdGVyLT5zTWxtZUZyYW1lLlR4TU1QRFVbaV0pOwotCUFkYXB0ZXItPnNNbG1lRnJhbWUuVHhNTVBEVUluVXNlW2ldID0gVFJVRTsKLQotCXJldHVybiByZXR1cm5WYWw7Ci19Ci0KLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLXU4IE1MTUVTZW5kRnJhbWUoUFdCMzJfQURBUFRFUiBBZGFwdGVyLCB1OCAqcE1NUERVLCB1MTYgbGVuLCB1OCBEYXRhVHlwZSkKK3U4IE1MTUVTZW5kRnJhbWUoc3RydWN0IHdic29mdF9wcml2ICogYWRhcHRlciwgdTggKnBNTVBEVSwgdTE2IGxlbiwgdTggRGF0YVR5cGUpCiAvKglEYXRhVHlwZSA6IEZSQU1FX1RZUEVfODAyXzExX01BTkFHRU1FTlQsIEZSQU1FX1RZUEVfODAyXzExX01BTkFHRU1FTlRfQ0hBTExFTkdFLAogCQkJCUZSQU1FX1RZUEVfODAyXzExX0RBVEEgKi8KIHsKLQlpZiAoQWRhcHRlci0+c01sbWVGcmFtZS5Jc0luVXNlZCAhPSBQQUNLRVRfRlJFRV9UT19VU0UpIHsKLQkJQWRhcHRlci0+c01sbWVGcmFtZS53TnVtVHhNTVBEVURpc2NhcmRlZCsrOwotCQlyZXR1cm4gRkFMU0U7CisJaWYgKGFkYXB0ZXItPnNNbG1lRnJhbWUuSXNJblVzZWQgIT0gUEFDS0VUX0ZSRUVfVE9fVVNFKSB7CisJCWFkYXB0ZXItPnNNbG1lRnJhbWUud051bVR4TU1QRFVEaXNjYXJkZWQrKzsKKwkJcmV0dXJuIGZhbHNlOwogCX0KLQlBZGFwdGVyLT5zTWxtZUZyYW1lLklzSW5Vc2VkID0gUEFDS0VUX0NPTUVfRlJPTV9NTE1FOworCWFkYXB0ZXItPnNNbG1lRnJhbWUuSXNJblVzZWQgPSBQQUNLRVRfQ09NRV9GUk9NX01MTUU7CiAKIAkvLyBLZWVwIGluZm9ybWF0aW9uIGZvciBzZW5kaW5nCi0JQWRhcHRlci0+c01sbWVGcmFtZS5wTU1QRFUgPSBwTU1QRFU7Ci0JQWRhcHRlci0+c01sbWVGcmFtZS5EYXRhVHlwZSA9IERhdGFUeXBlOworCWFkYXB0ZXItPnNNbG1lRnJhbWUucE1NUERVID0gcE1NUERVOworCWFkYXB0ZXItPnNNbG1lRnJhbWUuRGF0YVR5cGUgPSBEYXRhVHlwZTsKIAkvLyBsZW4gbXVzdCBiZSB0aGUgbGFzdCBzZXR0aW5nIGR1ZSB0byBRVUVSWV9TSVpFX1NFQ09ORCBvZiBNZHMKLQlBZGFwdGVyLT5zTWxtZUZyYW1lLmxlbiA9IGxlbjsKLQlBZGFwdGVyLT5zTWxtZUZyYW1lLndOdW1UeE1NUERVKys7CisJYWRhcHRlci0+c01sbWVGcmFtZS5sZW4gPSBsZW47CisJYWRhcHRlci0+c01sbWVGcmFtZS53TnVtVHhNTVBEVSsrOwogCiAJLy8gSC9XIHdpbGwgZW50ZXIgcG93ZXIgc2F2ZSBieSBzZXQgdGhlIHJlZ2lzdGVyLiBTL1cgZG9uJ3Qgc2VuZCBudWxsIGZyYW1lCiAJLy93aXRoIFBXUk1ndCBiaXQgZW5ibGVkIHRvIGVudGVyIHBvd2VyIHNhdmUgbm93LgogCiAJLy8gVHJhbnNtaXQgTkRJUyBwYWNrZXQKLQlNZHNfVHgoQWRhcHRlcik7Ci0JcmV0dXJuIFRSVUU7CisJTWRzX1R4KGFkYXB0ZXIpOworCXJldHVybiB0cnVlOwogfQogCi12b2lkCi1NTE1FX0dldE5leHRQYWNrZXQoUEFEQVBURVIgQWRhcHRlciwgUERFU0NSSVBUT1IgcERlcykKK3ZvaWQgTUxNRV9HZXROZXh0UGFja2V0KHN0cnVjdCB3YnNvZnRfcHJpdiAqYWRhcHRlciwgUERFU0NSSVBUT1IgZGVzYykKIHsKLSNkZWZpbmUgREVTQ1JJUFRPUl9BRERfQlVGRkVSKCBfRCwgX0EsIF9TICkgXAote1wKLQlfRC0+SW50ZXJuYWxVc2VkID0gX0QtPmJ1ZmZlcl9zdGFydF9pbmRleCArIF9ELT5idWZmZXJfbnVtYmVyOyBcCi0JX0QtPkludGVybmFsVXNlZCAlPSBNQVhfREVTQ1JJUFRPUl9CVUZGRVJfSU5ERVg7IFwKLQlfRC0+YnVmZmVyX2FkZHJlc3NbIF9ELT5JbnRlcm5hbFVzZWQgXSA9IF9BOyBcCi0JX0QtPmJ1ZmZlcl9zaXplWyBfRC0+SW50ZXJuYWxVc2VkIF0gPSBfUzsgXAotCV9ELT5idWZmZXJfdG90YWxfc2l6ZSArPSBfUzsgXAotCV9ELT5idWZmZXJfbnVtYmVyKys7XAorCWRlc2MtPkludGVybmFsVXNlZCA9IGRlc2MtPmJ1ZmZlcl9zdGFydF9pbmRleCArIGRlc2MtPmJ1ZmZlcl9udW1iZXI7CisJZGVzYy0+SW50ZXJuYWxVc2VkICU9IE1BWF9ERVNDUklQVE9SX0JVRkZFUl9JTkRFWDsKKwlkZXNjLT5idWZmZXJfYWRkcmVzc1tkZXNjLT5JbnRlcm5hbFVzZWRdID0gYWRhcHRlci0+c01sbWVGcmFtZS5wTU1QRFU7CisJZGVzYy0+YnVmZmVyX3NpemVbZGVzYy0+SW50ZXJuYWxVc2VkXSA9IGFkYXB0ZXItPnNNbG1lRnJhbWUubGVuOworCWRlc2MtPmJ1ZmZlcl90b3RhbF9zaXplICs9IGFkYXB0ZXItPnNNbG1lRnJhbWUubGVuOworCWRlc2MtPmJ1ZmZlcl9udW1iZXIrKzsKKwlkZXNjLT5UeXBlID0gYWRhcHRlci0+c01sbWVGcmFtZS5EYXRhVHlwZTsKIH0KIAotCURFU0NSSVBUT1JfQUREX0JVRkZFUiggcERlcywgQWRhcHRlci0+c01sbWVGcmFtZS5wTU1QRFUsIEFkYXB0ZXItPnNNbG1lRnJhbWUubGVuICk7Ci0JcERlcy0+VHlwZSA9IEFkYXB0ZXItPnNNbG1lRnJhbWUuRGF0YVR5cGU7Ci19Ci0KLXZvaWQgTUxNRWZyZWVNTVBEVUJ1ZmZlcihQV0IzMl9BREFQVEVSIEFkYXB0ZXIsIHM4ICpwRGF0YSkKK3N0YXRpYyB2b2lkIE1MTUVmcmVlTU1QRFVCdWZmZXIoc3RydWN0IHdic29mdF9wcml2ICphZGFwdGVyLCBzOCAqcERhdGEpCiB7CiAJaW50IGk7CiAKIAkvLyBSZWNsYWltIHRoZSBkYXRhIGJ1ZmZlcgogCWZvciAoaSA9IDA7IGkgPCBNQVhfTlVNX1RYX01NUERVOyBpKyspIHsKLQkJaWYgKHBEYXRhID09IChzOCAqKSYoQWRhcHRlci0+c01sbWVGcmFtZS5UeE1NUERVW2ldKSkKKwkJaWYgKHBEYXRhID09IChzOCAqKSYoYWRhcHRlci0+c01sbWVGcmFtZS5UeE1NUERVW2ldKSkKIAkJCWJyZWFrOwogCX0KLQlpZiAoQWRhcHRlci0+c01sbWVGcmFtZS5UeE1NUERVSW5Vc2VbaV0pCi0JCUFkYXB0ZXItPnNNbG1lRnJhbWUuVHhNTVBEVUluVXNlW2ldID0gRkFMU0U7CisJaWYgKGFkYXB0ZXItPnNNbG1lRnJhbWUuVHhNTVBEVUluVXNlW2ldKQorCQlhZGFwdGVyLT5zTWxtZUZyYW1lLlR4TU1QRFVJblVzZVtpXSA9IGZhbHNlOwogCWVsc2UgIHsKIAkJLy8gU29tZXRoaW5nIHdyb25nCiAJCS8vIFBENDMgQWRkIGRlYnVnIGNvZGUgaGVyZT8/PwpAQCAtMTMxLDE5ICs3NCwxOSBAQAogfQogCiB2b2lkCi1NTE1FX1NlbmRDb21wbGV0ZShQQURBUFRFUiBBZGFwdGVyLCB1OCBQYWNrZXRJRCwgdW5zaWduZWQgY2hhciBTZW5kT0spCitNTE1FX1NlbmRDb21wbGV0ZShzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKiBhZGFwdGVyLCB1OCBQYWNrZXRJRCwgdW5zaWduZWQgY2hhciBTZW5kT0spCiB7CiAJTUxNRV9UWENBTExCQUNLCVR4Q2FsbGJhY2s7CiAKICAgICAvLyBSZWNsYWltIHRoZSBkYXRhIGJ1ZmZlcgotCUFkYXB0ZXItPnNNbG1lRnJhbWUubGVuID0gMDsKLQlNTE1FZnJlZU1NUERVQnVmZmVyKCBBZGFwdGVyLCBBZGFwdGVyLT5zTWxtZUZyYW1lLnBNTVBEVSApOworCWFkYXB0ZXItPnNNbG1lRnJhbWUubGVuID0gMDsKKwlNTE1FZnJlZU1NUERVQnVmZmVyKCBhZGFwdGVyLCBhZGFwdGVyLT5zTWxtZUZyYW1lLnBNTVBEVSApOwogCiAKIAlUeENhbGxiYWNrLmJSZXN1bHQgPSBNTE1FX1NVQ0NFU1M7CiAKIAkvLyBSZXR1cm4gcmVzb3VyY2UKLQlBZGFwdGVyLT5zTWxtZUZyYW1lLklzSW5Vc2VkID0gUEFDS0VUX0ZSRUVfVE9fVVNFOworCWFkYXB0ZXItPnNNbG1lRnJhbWUuSXNJblVzZWQgPSBQQUNLRVRfRlJFRV9UT19VU0U7CiB9CiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbWxtZXR4cnhfZi5oIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbWxtZXR4cnhfZi5oCmluZGV4IDI0Y2Q1ZjMuLjVmMDVhNmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL21sbWV0eHJ4X2YuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9tbG1ldHhyeF9mLmgKQEAgLTgsMzIgKzgsMjUgQEAKICNpZm5kZWYgX01MTUVUWFJYX0gKICNkZWZpbmUgX01MTUVUWFJYX0gKIAorI2luY2x1ZGUgImNvcmUuaCIKKwogdm9pZAogTUxNRVByb2NUaHJlYWQoCi0gICAgIFBXQjMyX0FEQVBURVIgICAgQWRhcHRlcgorICAgICBzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKiAgICBhZGFwdGVyCiAJKTsKIAotdm9pZCBNTE1FUmVzZXRUeFJ4KCBQV0IzMl9BREFQVEVSIEFkYXB0ZXIpOwotCi11OCAqCi1NTE1FR2V0TU1QRFVCdWZmZXIoCi0gICAgIFBXQjMyX0FEQVBURVIgICAgQWRhcHRlcgotICAgKTsKLQotdm9pZCBNTE1FZnJlZU1NUERVQnVmZmVyKCBQV0IzMl9BREFQVEVSIEFkYXB0ZXIsICBzOCAqIHBEYXRhKTsKLQotdm9pZCBNTE1FX0dldE5leHRQYWNrZXQoICBQQURBUFRFUiBBZGFwdGVyLCAgUERFU0NSSVBUT1IgcERlcyApOwotdTggTUxNRVNlbmRGcmFtZSggUFdCMzJfQURBUFRFUiBBZGFwdGVyLAordm9pZCBNTE1FX0dldE5leHRQYWNrZXQoICBzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKiBhZGFwdGVyLCAgUERFU0NSSVBUT1IgcERlcyApOwordTggTUxNRVNlbmRGcmFtZSggc3RydWN0IHdic29mdF9wcml2ICogYWRhcHRlciwKIAkJCQkJdTgJKnBNTVBEVSwKIAkJCQkJdTE2CWxlbiwKIAkJCQkJIHU4CURhdGFUeXBlKTsKIAogdm9pZAotTUxNRV9TZW5kQ29tcGxldGUoICBQV0IzMl9BREFQVEVSIEFkYXB0ZXIsICB1OCBQYWNrZXRJRCwgIHVuc2lnbmVkIGNoYXIgU2VuZE9LICk7CitNTE1FX1NlbmRDb21wbGV0ZSggIHN0cnVjdCB3YnNvZnRfcHJpdiAqIGFkYXB0ZXIsICB1OCBQYWNrZXRJRCwgIHVuc2lnbmVkIGNoYXIgU2VuZE9LICk7CiAKIHZvaWQKIE1MTUVSY3ZGcmFtZSgKLSAgICAgUFdCMzJfQURBUFRFUiAgICBBZGFwdGVyLAorICAgICBzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKiAgICBhZGFwdGVyLAogICAgICBQUlhCVUZGRVIgICAgICAgIHBSeEJ1ZmZlckFycmF5LAogICAgICB1OCAgICAgICAgICAgIE51bU9mQnVmZmVyLAogICAgICB1OCAgICAgICAgICAgIFJldHVyblNsb3RJbmRleApAQCAtNDEsMTEgKzM0LDExIEBACiAKIHZvaWQKIE1MTUVSZXR1cm5QYWNrZXQoCi0gICAgIFBXQjMyX0FEQVBURVIgICAgQWRhcHRlciwKKyAgICAgc3RydWN0IHdic29mdF9wcml2ICogICAgYWRhcHRlciwKICAgICAgdTggKiAgICAgICAgICBwUnhCdWZlcgogICAgKTsKICNpZmRlZiBfSUJTU19CRUFDT05fU0VRX1NUSUNLXwotczggU2VuZEJDTnVsbERhdGEoUFdCMzJfQURBUFRFUiBBZGFwdGVyLCB1MTYgd0lkeCk7CitzOCBTZW5kQkNOdWxsRGF0YShzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKiBhZGFwdGVyLCB1MTYgd0lkeCk7CiAjZW5kaWYKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9tdG8uYyBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL210by5jCmluZGV4IDJlZjYwZTUuLmRlMTFhMDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL210by5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL210by5jCkBAIC0yMywxMCArMjMsMTIgQEAKIAogLy8gTEEyMDA0MDIxMF9EVE8ga2V2aW4KICNpbmNsdWRlICJvc19jb21tb24uaCIKKyNpbmNsdWRlICJzbWVfYXBpLmgiCisjaW5jbHVkZSAiZ2xfODAyMTEuaCIKKyNpbmNsdWRlICJ3YmhhbF9mLmgiCiAKIC8vIERlY2xhcmUgU1EzIHRvIHJhdGUgYW5kIGZyYWdtZW50YXRpb24gdGhyZXNob2xkIHRhYmxlCiAvLyBEZWNsYXJlIGZyYWdtZW50YXRpb24gdGhyZXNob2xkcyB0YWJsZQotI2RlZmluZSBNVE9fTUFYX1NRM19MRVZFTFMgICAgICAgICAgICAgICAgICAgICAgMTQKICNkZWZpbmUgTVRPX01BWF9GUkFHX1RIX0xFVkVMUyAgICAgICAgICAgICAgICAgIDUKICNkZWZpbmUgTVRPX01BWF9EQVRBX1JBVEVfTEVWRUxTICAgICAgICAgICAgICAgIDEyCiAKQEAgLTM1LDE4MSArMzcsMTUgQEAKICAgICAyNTYsIDM4NCwgNTEyLCA3NjgsIDE1MzYKIH07CiAKLXU4ICBNVE9fU1EzX0xldmVsW01UT19NQVhfU1EzX0xFVkVMU10gPQotewotICAgIDAsIDI2LCAzMCwgMzIsIDM0LCAzNSwgMzcsIDQyLCA0NCwgNDYsIDU0LCA2MiwgNzgsIDgxCi19OwotdTggIE1UT19TUTN0b1JhdGVbTVRPX01BWF9TUTNfTEVWRUxTXSA9Ci17Ci0gICAgMCwgMSwgMSwgMiwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExCi19OwotdTggIE1UT19TUTN0b0ZyYWdbTVRPX01BWF9TUTNfTEVWRUxTXSA9Ci17Ci0gICAgMCwgMiwgMiwgMywgMywgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNAotfTsKLQotLy8gT25lIEV4Y2hhbmdlIFRpbWUgdGFibGUKLS8vCi11MTYgTVRPX09uZV9FeGNoYW5nZV9UaW1lX1RibF9sW01UT19NQVhfRlJBR19USF9MRVZFTFNdW01UT19NQVhfREFUQV9SQVRFX0xFVkVMU10gPQotewotICAgIHsgMjU1NCwgMTQ3NCwgIDgyMiwgICAgMCwgICAgMCwgIDYzNiwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMH0sCi0gICAgeyAzNTc4LCAxOTg2LCAxMDA5LCAgICAwLCAgICAwLCAgNzI5LCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwfSwKLSAgICB7IDQ2MDIsIDI0OTgsIDExOTUsICAgIDAsICAgIDAsICA4MjIsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDB9LAotICAgIHsgNjY1MCwgMzUyMiwgMTU2NywgICAgMCwgICAgMCwgMTAwOSwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMH0sCi0gICAgezEyNzk0LCA2NTk0LCAyNjg0LCAgICAwLCAgICAwLCAxNTY3LCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwfQotfTsKLQotdTE2IE1UT19PbmVfRXhjaGFuZ2VfVGltZV9UYmxfc1tNVE9fTUFYX0ZSQUdfVEhfTEVWRUxTXVtNVE9fTUFYX0RBVEFfUkFURV9MRVZFTFNdID0KLXsKLSAgICB7ICAgIDAsIDEyODIsICA2MzAsICA0MDQsICAyODgsICA0NDQsICAyMzIsICAxNzIsICAxNDQsICAxMTYsICAxMDAsICAgOTZ9LAotICAgIHsgICAgMCwgMTc5NCwgIDgxNywgIDU3MiwgIDQwMCwgIDUzNywgIDMxNiwgIDIyOCwgIDE4OCwgIDE0NCwgIDEyNCwgIDExNn0sCi0gICAgeyAgICAwLCAyMzA2LCAxMDAzLCAgNzQ0LCAgNTE2LCAgNjMwLCAgNDAwLCAgMjg4LCAgMjI4LCAgMTcyLCAgMTQ0LCAgMTM2fSwKLSAgICB7ICAgIDAsIDMzMzAsIDEzNzUsIDEwODQsICA3NDQsICA4MTcsICA1NzIsICA0MDAsICAzMTYsICAyMjgsICAxODgsICAxNzJ9LAotICAgIHsgICAgMCwgNjQwMiwgMjQ5MiwgMjEwOCwgMTQyNCwgMTM3NSwgMTA4NCwgIDc0MCwgIDU3MiwgIDQwMCwgIDMxNiwgIDI4NH0KLX07Ci0KLSNkZWZpbmUgTVRPX09ORV9FWENIQU5HRV9USU1FKHByZWFtYmxlX3R5cGUsIGZyYWdfdGhfbHZsLCBkYXRhX3JhdGVfbHZsKSBcCi0gICAgICAgICAgICAocHJlYW1ibGVfdHlwZSkgPyAgIE1UT19PbmVfRXhjaGFuZ2VfVGltZV9UYmxfc1tmcmFnX3RoX2x2bF1bZGF0YV9yYXRlX2x2bF0gOiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1UT19PbmVfRXhjaGFuZ2VfVGltZV9UYmxfbFtmcmFnX3RoX2x2bF1bZGF0YV9yYXRlX2x2bF0KLQogLy8gRGVjbGFyZSBkYXRhIHJhdGUgdGFibGUKIC8vVGhlIGZvbGxvd2luZyB0YWJsZSB3aWxsIGJlIGNoYW5nZWQgYXQgYW55dGltZSBpZiB0aGUgb3ByYXRpb24gcmF0ZSBzdXBwb3J0ZWQgYnkgQVAgZG9uJ3QKIC8vbWF0Y2ggdGhlIHRhYmxlCi11OCAgTVRPX0RhdGFfUmF0ZV9UYmxbTVRPX01BWF9EQVRBX1JBVEVfTEVWRUxTXSA9Ci17CitzdGF0aWMgdTggTVRPX0RhdGFfUmF0ZV9UYmxbTVRPX01BWF9EQVRBX1JBVEVfTEVWRUxTXSA9IHsKICAgICAyLCA0LCAxMSwgMjIsIDEyLCAxOCwgMjQsIDM2LCA0OCwgNzIsIDk2LCAxMDgKIH07CiAKLS8vVGhlIFN0YXJkYXJkX0RhdGFfUmF0ZV9UYmwgYW5kIExldmVsMlBlclRibCB0YWJsZSBpcyB1c2VkIHRvIGluZGlyZWN0bHkgcmV0cmVpdmUgUEVSCi0vL2luZm9ybWF0aW9uIGZyb20gUmF0ZV9QRVJfVEJMCi0vL1RoZSBkZWZhdWx0IHNldHRpbmdzIGlzIEFQIGNhbiBzdXBwb3J0IGZ1bGwgcmF0ZSBzZXQuCi1zdGF0aWMgdTggIFN0YXJkYXJkX0RhdGFfUmF0ZV9UYmxbTVRPX01BWF9EQVRBX1JBVEVfTEVWRUxTXSA9Ci17Ci0JMiwgNCwgMTEsIDIyLCAxMiwgMTgsIDI0LCAzNiwgNDgsIDcyLCA5NiwgMTA4Ci19Owotc3RhdGljIHU4ICBMZXZlbDJQZXJUYmxbTVRPX01BWF9EQVRBX1JBVEVfTEVWRUxTXSA9Ci17Ci0JMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExCi19OwotLy9Ib3cgbWFueSBraW5kIG9mIHR4IHJhdGUgY2FuIGJlIHN1cHBvcnRlZCBieSBBUAotLy9EVE8gd2lsbCBjaGFuZ2UgUmF0ZSBiZXR3ZWVuIE1UT19EYXRhX1JhdGVfVGJsWzBdIGFuZCBNVE9fRGF0YV9SYXRlX1RibFtNVE9fRGF0YVJhdGVBdmFpbGFibGVMZXZlbC0xXQotc3RhdGljIHU4ICBNVE9fRGF0YVJhdGVBdmFpbGFibGVMZXZlbCA9IE1UT19NQVhfREFUQV9SQVRFX0xFVkVMUzsKLS8vU21vb3RoZWQgUEVSIHRhYmxlIGZvciBlYWNoIGRpZmZlcmVudCBSQVRFIGJhc2VkIG9uIHBhY2tldCBsZW5ndGggb2YgMTUxNAotc3RhdGljIGludCBSYXRlX1BFUl9UQkxbOTFdW01UT19NQVhfREFUQV9SQVRFX0xFVkVMU10gPSB7Ci0vLyAgICAgICAgMU0gICAgMk0gICAgNS41TSAgMTFNICAgNk0gICAgOU0gICAgMTJNICAgICAxOE0gICAgMjRNICAgIDM2TSAgICA0OE0gICA1NE0KLS8qIDAlICAqL3sgOTMsICAgMTc3LCAgNDIwLCAgNTM4LCAgNjkwLCAgNzc0LCAgMTAwMSwgIDE0MDEsICAxNzY4LCAgMjM1OCwgIDI4MzgsICAzMDM5fSwKLS8qIDElICAqL3sgOTIsICAgMTc2LCAgNDE2LCAgNTMzLCAgNjgzLCAgNzY3LCAgOTkyLCAgIDEzODksICAxNzUyLCAgMjMzNiwgIDI4MTEsICAzMDEwfSwKLS8qIDIlICAqL3sgOTEsICAgMTc0LCAgNDEyLCAgNTI4LCAgNjc1LCAgNzYwLCAgOTgzLCAgIDEzNzYsICAxNzM1LCAgMjMxMywgIDI3ODMsICAyOTc5fSwKLS8qIDMlICAqL3sgOTAsICAgMTcyLCAgNDA3LCAgNTIzLCAgNjY3LCAgNzUzLCAgOTczLCAgIDEzNjMsICAxNzE5LCAgMjI5MCwgIDI3NTUsICAyOTQ4fSwKLS8qIDQlICAqL3sgOTAsICAgMTcwLCAgNDAzLCAgNTE4LCAgNjU5LCAgNzQ2LCAgOTY0LCAgIDEzNTAsICAxNzAxLCAgMjI2NiwgIDI3MjYsICAyOTE2fSwKLS8qIDUlICAqL3sgODksICAgMTY5LCAgMzk4LCAgNTEyLCAgNjUxLCAgNzM4LCAgOTU0LCAgIDEzMzYsICAxNjg0LCAgMjI0MiwgIDI2OTYsICAyODg0fSwKLS8qIDYlICAqL3sgODgsICAgMTY3LCAgMzk0LCAgNTA3LCAgNjQzLCAgNzMxLCAgOTQ0LCAgIDEzMjIsICAxNjY2LCAgMjIxNywgIDI2NjUsICAyODUxfSwKLS8qIDclICAqL3sgODcsICAgMTY1LCAgMzg5LCAgNTAyLCAgNjM1LCAgNzIzLCAgOTM1LCAgIDEzMDgsICAxNjQ4LCAgMjE5MiwgIDI2MzQsICAyODE3fSwKLS8qIDglICAqL3sgODYsICAgMTYzLCAgMzg0LCAgNDk3LCAgNjI2LCAgNzE2LCAgOTI0LCAgIDEyOTQsICAxNjI5LCAgMjE2NiwgIDI2MDIsICAyNzgyfSwKLS8qIDklICAqL3sgODUsICAgMTYxLCAgMzgwLCAgNDkxLCAgNjE4LCAgNzA4LCAgOTE0LCAgIDEyNzksICAxNjExLCAgMjE0MCwgIDI1NzAsICAyNzQ3fSwKLS8qIDEwJSAqL3sgODQsICAgMTYwLCAgMzc1LCAgNDg2LCAgNjA5LCAgNzAwLCAgOTA0LCAgIDEyNjUsICAxNTkxLCAgMjExMywgIDI1MzcsICAyNzExfSwKLS8qIDExJSAqL3sgODMsICAgMTU4LCAgMzcwLCAgNDgwLCAgNjAwLCAgNjkyLCAgODk0LCAgIDEyNTAsICAxNTcyLCAgMjA4NiwgIDI1MDMsICAyNjc1fSwKLS8qIDEyJSAqL3sgODIsICAgMTU2LCAgMzY1LCAgNDc1LCAgNTkyLCAgNjg0LCAgODgzLCAgIDEyMzQsICAxNTUyLCAgMjA1OSwgIDI0NjksICAyNjM4fSwKLS8qIDEzJSAqL3sgODEsICAgMTU0LCAgMzYwLCAgNDY5LCAgNTgzLCAgNjc2LCAgODcyLCAgIDEyMTksICAxNTMyLCAgMjAzMSwgIDI0MzUsICAyNjAwfSwKLS8qIDE0JSAqL3sgODAsICAgMTUyLCAgMzU1LCAgNDY0LCAgNTc0LCAgNjY4LCAgODYyLCAgIDEyMDQsICAxNTEyLCAgMjAwMywgIDI0MDAsICAyNTYyfSwKLS8qIDE1JSAqL3sgNzksICAgMTUwLCAgMzUwLCAgNDU4LCAgNTY1LCAgNjYwLCAgODUxLCAgIDExODgsICAxNDkyLCAgMTk3NCwgIDIzNjUsICAyNTI0fSwKLS8qIDE2JSAqL3sgNzgsICAgMTQ4LCAgMzQ1LCAgNDUzLCAgNTU2LCAgNjUyLCAgODQwLCAgIDExNzIsICAxNDcxLCAgMTk0NSwgIDIzMjksICAyNDg1fSwKLS8qIDE3JSAqL3sgNzcsICAgMTQ2LCAgMzQwLCAgNDQ3LCAgNTQ3LCAgNjQzLCAgODI5LCAgIDExNTYsICAxNDUwLCAgMTkxNiwgIDIyOTMsICAyNDQ2fSwKLS8qIDE4JSAqL3sgNzYsICAgMTQ0LCAgMzM1LCAgNDQxLCAgNTM4LCAgNjM1LCAgODE4LCAgIDExNDAsICAxNDI5LCAgMTg4NywgIDIyNTYsICAyNDA2fSwKLS8qIDE5JSAqL3sgNzUsICAgMTQzLCAgMzMwLCAgNDM2LCAgNTI5LCAgNjI3LCAgODA3LCAgIDExMjQsICAxNDA4LCAgMTg1NywgIDIyMTksICAyMzY2fSwKLS8qIDIwJSAqL3sgNzQsICAgMTQxLCAgMzI1LCAgNDMwLCAgNTIwLCAgNjE4LCAgNzk1LCAgIDExMDcsICAxMzg2LCAgMTgyNywgIDIxODIsICAyMzI2fSwKLS8qIDIxJSAqL3sgNzMsICAgMTM5LCAgMzIwLCAgNDI0LCAgNTEwLCAgNjEwLCAgNzg0LCAgIDEwOTEsICAxMzY1LCAgMTc5NywgIDIxNDUsICAyMjg1fSwKLS8qIDIyJSAqL3sgNzIsICAgMTM3LCAgMzE0LCAgNDE4LCAgNTAxLCAgNjAxLCAgNzcyLCAgIDEwNzQsICAxMzQzLCAgMTc2NiwgIDIxMDcsICAyMjQ0fSwKLS8qIDIzJSAqL3sgNzEsICAgMTM1LCAgMzA5LCAgNDEyLCAgNDkyLCAgNTkyLCAgNzYxLCAgIDEwNTcsICAxMzIxLCAgMTczNiwgIDIwNjksICAyMjAzfSwKLS8qIDI0JSAqL3sgNzAsICAgMTMzLCAgMzA0LCAgNDA3LCAgNDgyLCAgNTg0LCAgNzQ5LCAgIDEwNDAsICAxMjk5LCAgMTcwNSwgIDIwMzEsICAyMTYxfSwKLS8qIDI1JSAqL3sgNjksICAgMTMxLCAgMjk5LCAgNDAxLCAgNDczLCAgNTc1LCAgNzM4LCAgIDEwMjMsICAxMjc3LCAgMTY3NCwgIDE5OTIsICAyMTIwfSwKLS8qIDI2JSAqL3sgNjgsICAgMTI5LCAgMjkzLCAgMzk1LCAgNDY0LCAgNTY2LCAgNzI2LCAgIDEwMDYsICAxMjU0LCAgMTY0MiwgIDE5NTMsICAyMDc4fSwKLS8qIDI3JSAqL3sgNjcsICAgMTI3LCAgMjg4LCAgMzg5LCAgNDU0LCAgNTU3LCAgNzE0LCAgIDk4OSwgICAxMjMyLCAgMTYxMSwgIDE5MTUsICAyMDM1fSwKLS8qIDI4JSAqL3sgNjYsICAgMTI1LCAgMjgzLCAgMzgzLCAgNDQ1LCAgNTQ5LCAgNzAzLCAgIDk3MiwgICAxMjA5LCAgMTU3OSwgIDE4NzYsICAxOTkzfSwKLS8qIDI5JSAqL3sgNjUsICAgMTIzLCAgMjc4LCAgMzc3LCAgNDM2LCAgNTQwLCAgNjkxLCAgIDk1NSwgICAxMTg3LCAgMTU0OCwgIDE4MzYsICAxOTUxfSwKLS8qIDMwJSAqL3sgNjQsICAgMTIxLCAgMjcyLCAgMzcxLCAgNDI2LCAgNTMxLCAgNjc5LCAgIDkzNywgICAxMTY0LCAgMTUxNiwgIDE3OTcsICAxOTA4fSwKLS8qIDMxJSAqL3sgNjMsICAgMTE5LCAgMjY3LCAgMzY1LCAgNDE3LCAgNTIyLCAgNjY3LCAgIDkyMCwgICAxMTQxLCAgMTQ4NCwgIDE3NTgsICAxODY2fSwKLS8qIDMyJSAqL3sgNjIsICAgMTE3LCAgMjYyLCAgMzU5LCAgNDA3LCAgNTEzLCAgNjU1LCAgIDkwMiwgICAxMTE4LCAgMTQ1MywgIDE3MTksICAxODIzfSwKLS8qIDMzJSAqL3sgNjEsICAgMTE1LCAgMjU2LCAgMzUzLCAgMzk4LCAgNTA0LCAgNjQzLCAgIDg4NSwgICAxMDk1LCAgMTQyMSwgIDE2NzksICAxNzgxfSwKLS8qIDM0JSAqL3sgNjAsICAgMTEzLCAgMjUxLCAgMzQ3LCAgMzg5LCAgNDk1LCAgNjMxLCAgIDg2NywgICAxMDcyLCAgMTM4OSwgIDE2NDAsICAxNzM4fSwKLS8qIDM1JSAqL3sgNTksICAgMTExLCAgMjQ2LCAgMzQxLCAgMzc5LCAgNDg2LCAgNjE5LCAgIDg1MCwgICAxMDQ5LCAgMTM1NywgIDE2MDAsICAxNjk1fSwKLS8qIDM2JSAqL3sgNTgsICAgMTA4LCAgMjQwLCAgMzM1LCAgMzcwLCAgNDc3LCAgNjA3LCAgIDgzMiwgICAxMDI3LCAgMTMyNSwgIDE1NjEsICAxNjUzfSwKLS8qIDM3JSAqL3sgNTcsICAgMTA2LCAgMjM1LCAgMzI5LCAgMzYxLCAgNDY4LCAgNTk1LCAgIDgxNSwgICAxMDA0LCAgMTI5MywgIDE1MjIsICAxNjEwfSwKLS8qIDM4JSAqL3sgNTYsICAgMTA0LCAgMjMwLCAgMzIzLCAgMzUxLCAgNDU5LCAgNTg0LCAgIDc5NywgICA5ODEsICAgMTI2MSwgIDE0ODMsICAxNTY4fSwKLS8qIDM5JSAqL3sgNTUsICAgMTAyLCAgMjI0LCAgMzE3LCAgMzQyLCAgNDUwLCAgNTcyLCAgIDc4MCwgICA5NTgsICAgMTIzMCwgIDE0NDMsICAxNTI2fSwKLS8qIDQwJSAqL3sgNTQsICAgMTAwLCAgMjE5LCAgMzExLCAgMzMzLCAgNDQxLCAgNTYwLCAgIDc2MiwgICA5MzUsICAgMTE5OCwgIDE0MDQsICAxNDg0fSwKLS8qIDQxJSAqL3sgNTMsICAgOTgsICAgMjE0LCAgMzA1LCAgMzI0LCAgNDMyLCAgNTQ4LCAgIDc0NCwgICA5MTIsICAgMTE2NiwgIDEzNjYsICAxNDQyfSwKLS8qIDQyJSAqL3sgNTIsICAgOTYsICAgMjA5LCAgMjk5LCAgMzE1LCAgNDIzLCAgNTM2LCAgIDcyNywgICA4ODksICAgMTEzNSwgIDEzMjcsICAxNDAwfSwKLS8qIDQzJSAqL3sgNTEsICAgOTQsICAgMjAzLCAgMjkzLCAgMzA2LCAgNDE0LCAgNTI0LCAgIDcwOSwgICA4NjYsICAgMTEwNCwgIDEyODksICAxMzU4fSwKLS8qIDQ0JSAqL3sgNTAsICAgOTIsICAgMTk4LCAgMjg3LCAgMjk3LCAgNDA1LCAgNTEyLCAgIDY5MiwgICA4NDQsICAgMTA3MiwgIDEyNTAsICAxMzE3fSwKLS8qIDQ1JSAqL3sgNDksICAgOTAsICAgMTkzLCAgMjgxLCAgMjg4LCAgMzk2LCAgNTAwLCAgIDY3NSwgICA4MjEsICAgMTA0MSwgIDEyMTIsICAxMjc2fSwKLS8qIDQ2JSAqL3sgNDgsICAgODgsICAgMTg4LCAgMjc1LCAgMjc5LCAgMzg3LCAgNDg4LCAgIDY1NywgICA3OTksICAgMTAxMSwgIDExNzQsICAxMjM2fSwKLS8qIDQ3JSAqL3sgNDcsICAgODYsICAgMTgzLCAgMjY5LCAgMjcxLCAgMzc4LCAgNDc2LCAgIDY0MCwgICA3NzcsICAgOTgwLCAgIDExMzcsICAxMTk1fSwKLS8qIDQ4JSAqL3sgNDYsICAgODQsICAgMTc4LCAgMjYyLCAgMjYyLCAgMzY5LCAgNDY0LCAgIDYyMywgICA3NTQsICAgOTQ5LCAgIDExMDAsICAxMTU1fSwKLS8qIDQ5JSAqL3sgNDUsICAgODIsICAgMTczLCAgMjU2LCAgMjU0LCAgMzYwLCAgNDUyLCAgIDYwNiwgICA3MzIsICAgOTE5LCAgIDEwNjMsICAxMTE2fSwKLS8qIDUwJSAqL3sgNDQsICAgODAsICAgMTY4LCAgMjUxLCAgMjQ1LCAgMzUxLCAgNDQxLCAgIDU4OSwgICA3MTAsICAgODg5LCAgIDEwMjYsICAxMDc2fSwKLS8qIDUxJSAqL3sgNDMsICAgNzgsICAgMTYzLCAgMjQ1LCAgMjM3LCAgMzQyLCAgNDI5LCAgIDU3MiwgICA2ODksICAgODYwLCAgIDk5MCwgICAxMDM4fSwKLS8qIDUyJSAqL3sgNDIsICAgNzYsICAgMTU4LCAgMjM5LCAgMjI4LCAgMzMzLCAgNDE3LCAgIDU1NSwgICA2NjcsICAgODMwLCAgIDk1NSwgICA5OTl9LAotLyogNTMlICoveyA0MSwgICA3NCwgICAxNTMsICAyMzMsICAyMjAsICAzMjQsICA0MDYsICAgNTM4LCAgIDY0NSwgICA4MDEsICAgOTE5LCAgIDk2MX0sCi0vKiA1NCUgKi97IDQwLCAgIDcyLCAgIDE0OCwgIDIyNywgIDIxMiwgIDMxNSwgIDM5NCwgICA1MjIsICAgNjI0LCAgIDc3MywgICA4ODQsICAgOTI0fSwKLS8qIDU1JSAqL3sgMzksICAgNzAsICAgMTQzLCAgMjIxLCAgMjA0LCAgMzA3LCAgMzgzLCAgIDUwNSwgICA2MDMsICAgNzQ0LCAgIDg1MCwgICA4ODd9LAotLyogNTYlICoveyAzOCwgICA2OCwgICAxMzgsICAyMTUsICAxOTYsICAyOTgsICAzNzEsICAgNDg5LCAgIDU4MiwgICA3MTYsICAgODE2LCAgIDg1MX0sCi0vKiA1NyUgKi97IDM3LCAgIDY3LCAgIDEzNCwgIDIwOSwgIDE4OSwgIDI4OSwgIDM2MCwgICA0NzMsICAgNTYyLCAgIDY4OCwgICA3ODMsICAgODE1fSwKLS8qIDU4JSAqL3sgMzYsICAgNjUsICAgMTI5LCAgMjAzLCAgMTgxLCAgMjgxLCAgMzQ5LCAgIDQ1NywgICA1NDEsICAgNjYxLCAgIDc1MCwgICA3ODB9LAotLyogNTklICoveyAzNSwgICA2MywgICAxMjQsICAxOTcsICAxNzQsICAyNzIsICAzMzgsICAgNDQxLCAgIDUyMSwgICA2MzQsICAgNzE3LCAgIDc0NX0sCi0vKiA2MCUgKi97IDM0LCAgIDYxLCAgIDEyMCwgIDE5MiwgIDE2NiwgIDI2NCwgIDMyNywgICA0MjUsICAgNTAxLCAgIDYwOCwgICA2ODYsICAgNzEyfSwKLS8qIDYxJSAqL3sgMzMsICAgNTksICAgMTE1LCAgMTg2LCAgMTU5LCAgMjU1LCAgMzE2LCAgIDQwOSwgICA0ODIsICAgNTgyLCAgIDY1NSwgICA2Nzh9LAotLyogNjIlICoveyAzMiwgICA1NywgICAxMTEsICAxODAsICAxNTIsICAyNDcsICAzMDUsICAgMzk0LCAgIDQ2MiwgICA1NTYsICAgNjI0LCAgIDY0Nn0sCi0vKiA2MyUgKi97IDMxLCAgIDU1LCAgIDEwNywgIDE3NCwgIDE0NSwgIDIzOCwgIDI5NCwgICAzNzksICAgNDQzLCAgIDUzMSwgICA1OTQsICAgNjE0fSwKLS8qIDY0JSAqL3sgMzAsICAgNTMsICAgMTAyLCAgMTY5LCAgMTM4LCAgMjMwLCAgMjgzLCAgIDM2NCwgICA0MjUsICAgNTA2LCAgIDU2NSwgICA1ODN9LAotLyogNjUlICoveyAyOSwgICA1MiwgICA5OCwgICAxNjMsICAxMzIsICAyMjIsICAyNzMsICAgMzQ5LCAgIDQwNiwgICA0ODIsICAgNTM2LCAgIDU1M30sCi0vKiA2NiUgKi97IDI4LCAgIDUwLCAgIDk0LCAgIDE1OCwgIDEyNSwgIDIxNCwgIDI2MiwgICAzMzQsICAgMzg4LCAgIDQ1OSwgICA1MDgsICAgNTIzfSwKLS8qIDY3JSAqL3sgMjcsICAgNDgsICAgOTAsICAgMTUyLCAgMTE5LCAgMjA2LCAgMjUyLCAgIDMyMCwgICAzNzAsICAgNDM2LCAgIDQ4MSwgICA0OTV9LAotLyogNjglICoveyAyNiwgICA0NiwgICA4NiwgICAxNDcsICAxMTMsICAxOTgsICAyNDIsICAgMzA2LCAgIDM1MywgICA0MTMsICAgNDU1LCAgIDQ2N30sCi0vKiA2OSUgKi97IDI2LCAgIDQ0LCAgIDgyLCAgIDE0MSwgIDEwNywgIDE5MCwgIDIzMSwgICAyOTIsICAgMzM2LCAgIDM5MSwgICA0MjksICAgNDQwfSwKLS8qIDcwJSAqL3sgMjUsICAgNDMsICAgNzgsICAgMTM2LCAgMTAxLCAgMTgyLCAgMjIxLCAgIDI3OCwgICAzMTksICAgMzcwLCAgIDQwNSwgICA0MTR9LAotLyogNzElICoveyAyNCwgICA0MSwgICA3NCwgICAxMzAsICA5NSwgICAxNzQsICAyMTIsICAgMjY1LCAgIDMwMywgICAzNTAsICAgMzgxLCAgIDM4OX0sCi0vKiA3MiUgKi97IDIzLCAgIDM5LCAgIDcxLCAgIDEyNSwgIDkwLCAgIDE2NywgIDIwMiwgICAyNTIsICAgMjg3LCAgIDMyOSwgICAzNTgsICAgMzY1fSwKLS8qIDczJSAqL3sgMjIsICAgMzcsICAgNjcsICAgMTE5LCAgODUsICAgMTU5LCAgMTkyLCAgIDIzOSwgICAyNzEsICAgMzEwLCAgIDMzNSwgICAzNDJ9LAotLyogNzQlICoveyAyMSwgICAzNiwgICA2MywgICAxMTQsICA4MCwgICAxNTEsICAxODMsICAgMjI2LCAgIDI1NiwgICAyOTEsICAgMzE0LCAgIDMyMH0sCi0vKiA3NSUgKi97IDIwLCAgIDM0LCAgIDYwLCAgIDEwOSwgIDc1LCAgIDE0NCwgIDE3NCwgICAyMTQsICAgMjQxLCAgIDI3MywgICAyOTQsICAgMjk4fSwKLS8qIDc2JSAqL3sgMTksICAgMzIsICAgNTcsICAgMTA0LCAgNzAsICAgMTM3LCAgMTY0LCAgIDIwMiwgICAyMjcsICAgMjU2LCAgIDI3NCwgICAyNzh9LAotLyogNzclICoveyAxOCwgICAzMSwgICA1MywgICA5OSwgICA2NiwgICAxMzAsICAxNTUsICAgMTkwLCAgIDIxMywgICAyMzksICAgMjU2LCAgIDI1OX0sCi0vKiA3OCUgKi97IDE3LCAgIDI5LCAgIDUwLCAgIDk0LCAgIDYyLCAgIDEyMiwgIDE0NiwgICAxNzgsICAgMjAwLCAgIDIyMywgICAyMzgsICAgMjQxfSwKLS8qIDc5JSAqL3sgMTYsICAgMjgsICAgNDcsICAgODksICAgNTgsICAgMTE1LCAgMTM4LCAgIDE2NywgICAxODcsICAgMjA4LCAgIDIyMiwgICAyMjV9LAotLyogODAlICoveyAxNiwgICAyNiwgICA0NCwgICA4NCwgICA1NCwgICAxMDksICAxMjksICAgMTU2LCAgIDE3NSwgICAxOTQsICAgMjA2LCAgIDIwOX0sCi0vKiA4MSUgKi97IDE1LCAgIDI0LCAgIDQxLCAgIDc5LCAgIDUwLCAgIDEwMiwgIDEyMSwgICAxNDYsICAgMTYzLCAgIDE4MCwgICAxOTIsICAgMTk0fSwKLS8qIDgyJSAqL3sgMTQsICAgMjMsICAgMzksICAgNzQsICAgNDcsICAgOTUsICAgMTEzLCAgIDEzNiwgICAxNTEsICAgMTY3LCAgIDE3OCwgICAxODF9LAotLyogODMlICoveyAxMywgICAyMSwgICAzNiwgICA2OSwgICA0NCwgICA4OSwgICAxMDUsICAgMTI2LCAgIDE0MCwgICAxNTUsICAgMTY2LCAgIDE2OX0sCi0vKiA4NCUgKi97IDEyLCAgIDIwLCAgIDMzLCAgIDY0LCAgIDQxLCAgIDgyLCAgIDk3LCAgICAxMTYsICAgMTMwLCAgIDE0NCwgICAxNTUsICAgMTU4fSwKLS8qIDg1JSAqL3sgMTEsICAgMTksICAgMzEsICAgNjAsICAgMzksICAgNzYsICAgODksICAgIDEwNywgICAxMjAsICAgMTM0LCAgIDE0NSwgICAxNDl9LAotLyogODYlICoveyAxMSwgICAxNywgICAyOSwgICA1NSwgICAzNiwgICA3MCwgICA4MiwgICAgOTgsICAgIDExMCwgICAxMjUsICAgMTM2LCAgIDE0MH0sCi0vKiA4NyUgKi97IDEwLCAgIDE2LCAgIDI2LCAgIDUxLCAgIDM0LCAgIDY0LCAgIDc1LCAgICA5MCwgICAgMTAyLCAgIDExNiwgICAxMjgsICAgMTMzfSwKLS8qIDg4JSAqL3sgOSwgICAgMTQsICAgMjQsICAgNDYsICAgMzIsICAgNTgsICAgNjgsICAgIDgxLCAgICA5MywgICAgMTA4LCAgIDEyMSwgICAxMjh9LAotLyogODklICoveyA4LCAgICAxMywgICAyMiwgICA0MiwgICAzMSwgICA1MiwgICA2MSwgICAgNzQsICAgIDg2LCAgICAxMDIsICAgMTE2LCAgIDEyNH0sCi0vKiA5MCUgKi97IDcsICAgIDEyLCAgIDIxLCAgIDM3LCAgIDI5LCAgIDQ2LCAgIDU0LCAgICA2NiwgICAgNzksICAgIDk2LCAgICAxMTIsICAgMTIxfQotfTsKLQotI2RlZmluZSBSU1NJQlVGX05VTSAxMAotI2RlZmluZSBSU1NJMlJBVEVfU0laRSA5Ci0KLXN0YXRpYyBUWFJFVFJZX1JFQyBUeFJhdGVSZWM9e01UT19NQVhfREFUQV9SQVRFX0xFVkVMUyAtIDEsIDB9OyAgIC8vbmV3IHJlY29yZD0+VHhSYXRlUmVjCi1zdGF0aWMgaW50IFR4UmV0cnlSYXRlOwotLy9zdGF0aWMgaW50IFNRMywgQlNTX1BLX0NOVCwgTklETEVTTE9ULCBTTE9UX0NOVCwgSU5URVJGX0NOVCwgR0FQX0NOVCwgRFNfRVZNOwotc3RhdGljIHMzMiBSU1NJQnVmW1JTU0lCVUZfTlVNXT17LTcwLCAtNzAsIC03MCwgLTcwLCAtNzAsIC03MCwgLTcwLCAtNzAsIC03MCwgLTcwfTsKLXN0YXRpYyBzMzIgUlNTSVNtb290aGVkPS03MDA7Ci1zdGF0aWMgaW50IFJTU0lCdWZJbmRleD0wOwotc3RhdGljIHU4IG1heF9yc3NpX3JhdGU7Ci1zdGF0aWMgaW50IHJhdGVfdGJsWzEzXSA9IHswLDEsMiw1LDExLDYsOSwxMiwxOCwyNCwzNiw0OCw1NH07Ci0vL1tXS0NIRU5dc3RhdGljIGNvcmVfZGF0YV90ICpwTVRPY29yZV9kYXRhPU5VTEw7Ci0KIHN0YXRpYyBpbnQgVG90YWxUeFBrdCA9IDA7CiBzdGF0aWMgaW50IFRvdGFsVHhQa3RSZXRyeSA9IDA7Ci1zdGF0aWMgaW50IFR4UGt0UGVyQW50WzNdID0gezAsMCwwfTsKLXN0YXRpYyBpbnQgUlhSU1NJQU5UWzNdID17LTcwLC03MCwtNzB9Owotc3RhdGljIGludCBUeFBrdFJldHJ5UGVyQW50WzNdID0gezAsMCwwfTsKLS8vc3RhdGljIGludCBUeERvbWluYXRlRmxhZz1GQUxTRTsKLXN0YXRpYyB1OCBvbGRfYW50ZW5uYVs0XT17MSAsMCAsMSAsMH07CiBzdGF0aWMgaW50IHJldHJ5cmF0ZV9yZWNbTVRPX01BWF9EQVRBX1JBVEVfTEVWRUxTXTsvL3RoaXMgcmVjb3JkIHRoZSByZXRyeSByYXRlIGF0IGRpZmZlcmVudCBkYXRhIHJhdGUKIAogc3RhdGljIGludCBQZXJpb2RUb3RhbFR4UGt0ID0gMDsKQEAgLTIyMSwxMjggKzU3LDE0IEBACiAJdTggIFR4UmF0ZTsKIH1SU1NJMlJBVEU7CiAKLXN0YXRpYyBSU1NJMlJBVEUgUlNTSTJSYXRlVGJsW1JTU0kyUkFURV9TSVpFXSA9Ci17Ci0Jey03NDAsIDEwOH0sICAvLyA1NE0KLQl7LTc2MCwgOTZ9LCAgLy8gNDhNCi0Jey04MjAsIDcyfSwgIC8vIDM2TQotCXstODUwLCA0OH0sICAvLyAyNE0KLQl7LTg3MCwgMzZ9LCAgLy8gMThNCi0Jey04OTAsIDI0fSwgIC8vIDEyTQotCXstOTAwLCAxMn0sICAvLyA2TQotCXstOTIwLCAxMX0sIC8vIDUuNU0KLQl7LTk1MCwgNH0sIC8vIDJNCi19Owotc3RhdGljIHU4IHVudG9nZ2xlY291bnQ7Ci1zdGF0aWMgdTggbGFzdF9yYXRlX2FudDsgLy90aGlzIGlzIHVzZWQgZm9yIGFudGVubmEgYmFja29mZi1oaAotCi11OAlib1NwYXJzZVR4VHJhZmZpYyA9IEZBTFNFOworc3RhdGljIHU4IGJvU3BhcnNlVHhUcmFmZmljID0gZmFsc2U7CiAKIHZvaWQgTVRPX0luaXQoTVRPX0ZVTkNfSU5QVVQpOwotdm9pZCBBbnRlbm5hVG9nZ2xlSW5pdGlhdG9yKE1UT19GVU5DX0lOUFVUKTsKLXZvaWQgQW50ZW5uYVRvZ2dsZVN0YXRlKE1UT19GVU5DX0lOUFVUKTsKLXZvaWQgVHhQd3JDb250cm9sKE1UT19GVU5DX0lOUFVUKTsKLXZvaWQgR2V0RnJlc2hBbnRlbm5hRGF0YShNVE9fRlVOQ19JTlBVVCk7CiB2b2lkIFR4UmF0ZVJlZHVjdGlvbkN0cmwoTVRPX0ZVTkNfSU5QVVQpOwogLyoqIDEuMS4zMS4xMDAwIFR1cmJvIG1vZGlmeSAqLwotLy92b2lkIE1UT19TZXREVE9SYXRlUmFuZ2UoaW50IHR5cGUpOwotdm9pZCBNVE9fU2V0RFRPUmF0ZVJhbmdlKE1UT19GVU5DX0lOUFVULCB1OCAqcFJhdGVBcnJheSwgdTggQXJyYXlTaXplKTsKIHZvaWQgTVRPX1NldFR4Q291bnQoTVRPX0ZVTkNfSU5QVVQsIHU4IHQwLCB1OCBpbmRleCk7CiB2b2lkIE1UT19UeEZhaWxlZChNVE9fRlVOQ19JTlBVVCk7Ci12b2lkIFNtb290aFJTU0koczMyIG5ld19yc3NpKTsKIHZvaWQgaGFsX2dldF9kdG9fcGFyYShNVE9fRlVOQ19JTlBVVCwgY2hhciAqYnVmZmVyKTsKLXU4IENhbGNOZXdSYXRlKE1UT19GVU5DX0lOUFVULCB1OCBvbGRfcmF0ZSwgdTMyIHJldHJ5X2NudCwgdTMyIHR4X2ZyYWdfY250KTsKLXU4IEdldE1heFJhdGVMZXZlbEZyb21SU1NJKHZvaWQpOwotdTggTVRPX0dldFR4RmFsbGJhY2tSYXRlKE1UT19GVU5DX0lOUFVUKTsKLWludCBEaXZpZGUoaW50IGEsIGludCBiKTsKLXZvaWQgbXVsdGlhZ2MoTVRPX0ZVTkNfSU5QVVQsIHU4IGhpZ2hfZ2Fpbl9tb2RlKTsKLQotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vICBNVE9fSW5pdCAtLQotLy8KLS8vICBEZXNjcmlwdGlvbjoKLS8vICAgIFNldCBEVE8gVHggUmF0ZSBTY29wZSBiZWNhdXNlIGRpZmZlcmVudCBBUCBjb3VsZCBoYXZlIGRpZmZlcmVudCBSYXRlIHNldC4KLS8vICAgIEFmdGVyIG91ciBzdGFpb24gam9pbiB3aXRoIEFQLCBMTSBjb3JlIHdpbGwgY2FsbCB0aGlzIGZ1bmN0aW9uIHRvIGluaXRpYWxpemUKLS8vICAgIFR4IFJhdGUgdGFibGUuCi0vLwotLy8gIEFyZ3VtZW50czoKLS8vICAgIHBSYXRlQXJyYXkgICAgICAtIFRoZSBwb2ludGVyIHRvIHRoZSBUeCBSYXRlIEFycmF5IGJ5IHRoZSBmb2xsb3dpbmcgb3JkZXIKLS8vICAgICAgICAgICAgICAgICAgICAtIDIsIDQsIDExLCAyMiwgMTIsIDE4LCAyNCwgMzYsIDQ4LCA3MiwgOTYsIDEwOAotLy8gICAgICAgICAgICAgICAgICAgIC0gRFRPIHdvbid0IGNoZWNrIHdoZXRoZXIgcmF0ZSBvcmRlciBpcyBpbnZhbGlkIG9yIG5vdAotLy8gICAgQXJyYXlTaXplICAgICAgIC0gVGhlIGFycmF5IHNpemUgdG8gaW5kaWNhdGUgaG93IG1hbnkgdHggcmF0ZSB3ZSBjYW4gY2hvb3NlCi0vLwotLy8gIHNhbXBsZSBjb2RlOgotLy8JewotLy8JCXU4IFJhdGVBcnJheVs0XSA9IHsyLCA0LCAxMSwgMjJ9OwotLy8JCU1UT19TZXREVE9SYXRlUmFuZ2UoUmF0ZUFycmF5LCA0KTsKLS8vCX0KLS8vCi0vLyAgUmV0dXJuIFZhbHVlOgotLy8gICAgTm9uZQotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci12b2lkIE1UT19TZXREVE9SYXRlUmFuZ2UoTVRPX0ZVTkNfSU5QVVQsdTggKnBSYXRlQXJyYXksIHU4IEFycmF5U2l6ZSkKLXsKLQl1OAlpLCBqPTA7Ci0KLQlmb3IoaT0wO2k8QXJyYXlTaXplO2krKykKLQl7Ci0JCWlmKHBSYXRlQXJyYXlbaV0gPT0gMjIpCi0JCQlicmVhazsKLQl9Ci0JaWYoaSA8IEFycmF5U2l6ZSkgLy93ZSBuZWVkIGFkanVzdCB0aGUgb3JkZXIgb2YgcmF0ZSBsaXN0IGJlY2F1c2UgMTFNYnBzIHJhdGUgZXhpc3RzCi0JewotCQlmb3IoO2k+MDtpLS0pCi0JCXsKLQkJCWlmKHBSYXRlQXJyYXlbaS0xXSA8PSAxMSkKLQkJCQlicmVhazsKLQkJCXBSYXRlQXJyYXlbaV0gPSBwUmF0ZUFycmF5W2ktMV07Ci0JCX0KLQkJcFJhdGVBcnJheVtpXSA9IDIyOwotCQlNVE9fT0ZETV9SQVRFX0xFVkVMKCkgPSBpOwotCX0KLQllbHNlCi0JewotCQlmb3IoaT0wOyBpPEFycmF5U2l6ZTsgaSsrKQotCQl7Ci0JCQlpZiAocFJhdGVBcnJheVtpXSA+PSAxMikKLQkJCQlicmVhazsKLQkJfQotCQlNVE9fT0ZETV9SQVRFX0xFVkVMKCkgPSBpOwotCX0KLQotCWZvcihpPTA7aTxBcnJheVNpemU7aSsrKQotCXsKLQkJTVRPX0RhdGFfUmF0ZV9UYmxbaV0gPSBwUmF0ZUFycmF5W2ldOwotCQlmb3IoO2o8TVRPX01BWF9EQVRBX1JBVEVfTEVWRUxTO2orKykKLQkJewotCQkJaWYoU3RhcmRhcmRfRGF0YV9SYXRlX1RibFtqXSA9PSBwUmF0ZUFycmF5W2ldKQotCQkJCWJyZWFrOwotCQl9Ci0JCUxldmVsMlBlclRibFtpXSA9IGo7Ci0JCSNpZmRlZiBfUEVfRFRPX0RVTVBfCi0JCVdCREVCVUcoKCJbTVRPXTpPcCBSYXRlWyVkXTogJWRcbiIsaSwgTVRPX0RhdGFfUmF0ZV9UYmxbaV0pKTsKLQkJI2VuZGlmCi0JfQotCU1UT19EYXRhUmF0ZUF2YWlsYWJsZUxldmVsID0gQXJyYXlTaXplOwotCWlmKCBNVE9fREFUQSgpLlJhdGVQb2xpY3kgKSAvLyAwIG1lYW5zIHRoYXQgbm8gcmVnaXN0cnkgc2V0dGluZwotCXsKLQkJaWYoIE1UT19EQVRBKCkuUmF0ZVBvbGljeSA9PSAxICkKLQkJCVR4UmF0ZVJlYy50eF9yYXRlID0gMDsJLy9hc2NlbnQKLQkJZWxzZQotCQkJVHhSYXRlUmVjLnR4X3JhdGUgPSBNVE9fRGF0YVJhdGVBdmFpbGFibGVMZXZlbCAtMSA7CS8vZGVzY2VudAotCX0KLQllbHNlCi0JewotCQlpZiggTVRPX0lOSVRUWFJBVEVfTU9ERSApCi0JCQlUeFJhdGVSZWMudHhfcmF0ZSA9IDA7CS8vYXNjZW50Ci0JCWVsc2UKLQkJCVR4UmF0ZVJlYy50eF9yYXRlID0gTVRPX0RhdGFSYXRlQXZhaWxhYmxlTGV2ZWwgLTEgOwkvL2Rlc2NlbnQKLQl9Ci0JVHhSYXRlUmVjLnR4X3JldHJ5X3JhdGUgPSAwOwotCS8vc2V0IGRlZmF1bHQgcmF0ZSBmb3IgaW5pdGlhbCB1c2UKLQlNVE9fUkFURV9MRVZFTCgpID0gVHhSYXRlUmVjLnR4X3JhdGU7Ci0JTVRPX0ZBTExCQUNLX1JBVEVfTEVWRUwoKSA9IE1UT19SQVRFX0xFVkVMKCk7Ci19CiAKIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAvLyAgTVRPX0luaXQgLS0KQEAgLTM1Myw3ICs3NSw3IEBACiAvLyAgICBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBpbnZva2VkIGR1cmluZyBzeXN0ZW0gaW5pdGlhbGl6YXRpb24uCiAvLwogLy8gIEFyZ3VtZW50czoKLS8vICAgIEFkYXB0ZXIgICAgICAtIFRoZSBwb2ludGVyIHRvIHRoZSBNaW5pcG9ydCBBZGFwdGVyIENvbnRleHQKKy8vICAgIGFkYXB0ZXIgICAgICAtIFRoZSBwb2ludGVyIHRvIHRoZSBNaW5pcG9ydCBhZGFwdGVyIENvbnRleHQKIC8vCiAvLyAgUmV0dXJuIFZhbHVlOgogLy8gICAgTm9uZQpAQCAtMzkzLDggKzExNSw4IEBACiAgICAgTVRPX1NRX0FOVCgwKSAgICAgICA9IDA7CiAgICAgTVRPX1NRX0FOVCgxKSAgICAgICA9IDA7CiAgICAgTVRPX0FOVF9ESVZFUlNJVFkoKSA9IE1UT19BTlRFTk5BX0RJVkVSU0lUWV9PTjsKLSAgICAvL0NhcmRTZXRfQW50ZW5uYURpdmVyc2l0eShBZGFwdGVyLCBNVE9fQU5UX0RJVkVSU0lUWSgpKTsKLSAgICAvL1BMTUVTZXRBbnRlbm5hRGl2ZXJzaXR5KCBBZGFwdGVyLCBNVE9fQU5UX0RJVkVSU0lUWSgpKTsKKyAgICAvL0NhcmRTZXRfQW50ZW5uYURpdmVyc2l0eShhZGFwdGVyLCBNVE9fQU5UX0RJVkVSU0lUWSgpKTsKKyAgICAvL1BMTUVTZXRBbnRlbm5hRGl2ZXJzaXR5KCBhZGFwdGVyLCBNVE9fQU5UX0RJVkVSU0lUWSgpKTsKIAogICAgIE1UT19BR0lOR19USU1FT1VUKCkgPSAwOy8vTVRPX1RNUl9BR0lORygpIC8gTVRPX1RNUl9QRVJJT0RJQygpOwogCkBAIC00MDIsNyArMTI0LDYgQEAKICAgICAvLwogICAgIC8vTVRPX1JBVEVfTEVWRUwoKSAgICAgICAgICAgID0gMTA7CiAgICAgTVRPX1JBVEVfTEVWRUwoKSAgICAgICAgICAgID0gMDsKLQlNVE9fRkFMTEJBQ0tfUkFURV9MRVZFTCgpCT0gTVRPX1JBVEVfTEVWRUwoKTsKICAgICBNVE9fRlJBR19USF9MRVZFTCgpICAgICAgICAgPSA0OwogICAgIC8qKiAxLjEuMjMuMTAwMCBUdXJibyBtb2RpZnkgZnJvbSAtMSB0byArMQogCU1UT19SVFNfVEhSRVNIT0xEKCkgICAgICAgICA9IE1UT19GUkFHX1RIKCkgLSAxOwpAQCAtNDcwLDY2OSArMTkxLDYgQEAKIAlNVE9fREFUQSgpLlJTU0lfbG93ID0gLTYwOwogfQogCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS8vCi1zdGF0aWMgdTMyIERUT19SeF9JbmZvWzEzXVszXTsKLXN0YXRpYyB1MzIgRFRPX1J4Q1JDRmFpbF9JbmZvWzEzXVszXTsKLXN0YXRpYyB1MzIgQW50ZW5uYVRvZ2dsZUJrb2ZmVGltZXI9NTsKLXR5cGVkZWYgc3RydWN0ewotCWludCBSeFJhdGU7Ci0JaW50IFJ4UmF0ZVBrdHM7Ci0JaW50IGluZGV4OwotfVJYUkFURV9BTlQ7Ci1SWFJBVEVfQU5UIFJ4UmF0ZVBlYWtBbnRbM107Ci0KLSNkZWZpbmUgQU5UMCAgICAwCi0jZGVmaW5lIEFOVDEgICAgMQotI2RlZmluZSBPTERfQU5UIDIKLQotdm9pZCBTZWFyY2hQZWFrUnhSYXRlKGludCBpbmRleCkKLXsKLQlpbnQgaTsKLQlSeFJhdGVQZWFrQW50W2luZGV4XS5SeFJhdGVQa3RzPTA7Ci0JLy9GaW5kIG91dCB0aGUgYmVzdCByeCByYXRlIHdoaWNoIGlzIHVzZWQgb24gZGlmZmVyZW50IGFudGVubmEKLQlmb3IoaT0xO2k8MTM7aSsrKQotCXsKLQkJaWYoRFRPX1J4X0luZm9baV1baW5kZXhdID4gKHUzMikgUnhSYXRlUGVha0FudFtpbmRleF0uUnhSYXRlUGt0cykKLQkJewotCQkJUnhSYXRlUGVha0FudFtpbmRleF0uUnhSYXRlUGt0cyA9IERUT19SeF9JbmZvW2ldW2luZGV4XTsKLQkJCVJ4UmF0ZVBlYWtBbnRbaW5kZXhdLlJ4UmF0ZSA9IHJhdGVfdGJsW2ldOwotCQkJUnhSYXRlUGVha0FudFtpbmRleF0uaW5kZXggPSBpOwotCQl9Ci0JfQotfQotCi12b2lkIFJlc2V0RFRPX1J4SW5mbyhpbnQgaW5kZXgsIE1UT19GVU5DX0lOUFVUKQotewotCWludCBpOwotCi0JI2lmZGVmIF9QRV9EVE9fRFVNUF8KLQlXQkRFQlVHKCgiUmVzZXREVE9yeFxuIikpOwotCSNlbmRpZgotCi0JZm9yKGk9MDtpPDEzO2krKykKLQkJRFRPX1J4X0luZm9baV1baW5kZXhdID0gTVRPX0hBTCgpLT5yeF9va19jb3VudFtpXTsKLQotCWZvcihpPTA7aTwxMztpKyspCi0JCURUT19SeENSQ0ZhaWxfSW5mb1tpXVtpbmRleF0gPSBNVE9fSEFMKCktPnJ4X2Vycl9jb3VudFtpXTsKLQotCVRvdGFsVHhQa3QgPSAwOwotCVRvdGFsVHhQa3RSZXRyeSA9IDA7Ci19Ci0KLXZvaWQgR2V0RFRPX1J4SW5mbyhpbnQgaW5kZXgsIE1UT19GVU5DX0lOUFVUKQotewotCWludCBpOwotCi0JI2lmZGVmIF9QRV9EVE9fRFVNUF8KLQlXQkRFQlVHKCgiR2V0RFRPcnhcbiIpKTsKLQkjZW5kaWYKLQotCS8vUERFQlVHKCgiW01UT106RFRPX1J4X0luZm9bJWRdPSVkLCByeF9va19jb3VudD0lZFxuIiwgaW5kZXgsIERUT19SeF9JbmZvWzBdW2luZGV4XSwgcGh3X2RhdGEtPnJ4X29rX2NvdW50WzBdKSk7Ci0JZm9yKGk9MDtpPDEzO2krKykKLQkJRFRPX1J4X0luZm9baV1baW5kZXhdID0gYWJzKE1UT19IQUwoKS0+cnhfb2tfY291bnRbaV0gLSBEVE9fUnhfSW5mb1tpXVtpbmRleF0pOwotCWlmKERUT19SeF9JbmZvWzBdW2luZGV4XT09MCkgRFRPX1J4X0luZm9bMF1baW5kZXhdID0gMTsKLQotCWZvcihpPTA7aTwxMztpKyspCi0JCURUT19SeENSQ0ZhaWxfSW5mb1tpXVtpbmRleF0gPSBNVE9fSEFMKCktPnJ4X2Vycl9jb3VudFtpXSAtIERUT19SeENSQ0ZhaWxfSW5mb1tpXVtpbmRleF07Ci0KLQlUeFBrdFBlckFudFtpbmRleF0gPSBUb3RhbFR4UGt0OwotCVR4UGt0UmV0cnlQZXJBbnRbaW5kZXhdID0gVG90YWxUeFBrdFJldHJ5OwotCVRvdGFsVHhQa3QgPSAwOwotCVRvdGFsVHhQa3RSZXRyeSA9IDA7Ci19Ci0KLXZvaWQgT3V0cHV0RGVidWdJbmZvKGludCBpbmRleDEsIGludCBpbmRleDIpCi17Ci0JI2lmZGVmIF9QRV9EVE9fRFVNUF8KLQlXQkRFQlVHKCgiW0hIRFRPXTpUb3RhbCBSeCAoJWQpXHRcdCglZCkgXG4gIiwgRFRPX1J4X0luZm9bMF1baW5kZXgxXSwgRFRPX1J4X0luZm9bMF1baW5kZXgyXSkpOwotICAgIFdCREVCVUcoKCJbSEhEVE9dOlJFQ0VJVkUgUlNTSTogKCVkKVx0XHQoJWQpIFxuICIsIFJYUlNTSUFOVFtpbmRleDFdLCBSWFJTU0lBTlRbaW5kZXgyXSkpOwotCVdCREVCVUcoKCJbSEhEVE9dOlRYIHBhY2tldCBjb3JyZWN0IHJhdGU6ICglZCklJVx0XHQoJWQpJSUgXG4gIixEaXZpZGUoVHhQa3RQZXJBbnRbaW5kZXgxXSoxMDAsVHhQa3RSZXRyeVBlckFudFtpbmRleDFdKSwgRGl2aWRlKFR4UGt0UGVyQW50W2luZGV4Ml0qMTAwLFR4UGt0UmV0cnlQZXJBbnRbaW5kZXgyXSkpKTsKLQkjZW5kaWYKLQl7Ci0JCWludCB0bXAxLCB0bXAyOwotCQkjaWZkZWYgX1BFX0RUT19EVU1QXwotCQlXQkRFQlVHKCgiW0hIRFRPXTpUb3RhbCBUeCAoJWQpXHRcdCglZCkgXG4gIiwgVHhQa3RQZXJBbnRbaW5kZXgxXSwgVHhQa3RQZXJBbnRbaW5kZXgyXSkpOwotCQlXQkRFQlVHKCgiW0hIRFRPXTpUb3RhbCBUeCByZXRyeSAoJWQpXHRcdCglZCkgXG4gIiwgVHhQa3RSZXRyeVBlckFudFtpbmRleDFdLCBUeFBrdFJldHJ5UGVyQW50W2luZGV4Ml0pKTsKLQkJI2VuZGlmCi0JCXRtcDEgPSBUeFBrdFBlckFudFtpbmRleDFdICsgRFRPX1J4X0luZm9bMF1baW5kZXgxXTsKLQkJdG1wMiA9IFR4UGt0UGVyQW50W2luZGV4Ml0gKyBEVE9fUnhfSW5mb1swXVtpbmRleDJdOwotCQkjaWZkZWYgX1BFX0RUT19EVU1QXwotCQlXQkRFQlVHKCgiW0hIRFRPXTpUb3RhbCBUeCtSWCAoJWQpXHRcdCglZCkgXG4gIiwgdG1wMSwgdG1wMikpOwotCQkjZW5kaWYKLQl9Ci19Ci0KLXVuc2lnbmVkIGNoYXIgVHhEb21pbmF0ZShpbnQgaW5kZXgpCi17Ci0JaW50IHRtcDsKLQotCXRtcCA9IFR4UGt0UGVyQW50W2luZGV4XSArIERUT19SeF9JbmZvWzBdW2luZGV4XTsKLQotCWlmKERpdmlkZShUeFBrdFBlckFudFtpbmRleF0qMTAwLCB0bXApID4gNDApCi0JCXJldHVybiBUUlVFOwotCWVsc2UKLQkJcmV0dXJuIEZBTFNFOwotfQotCi11bnNpZ25lZCBjaGFyIENtcFR4UmV0cnlSYXRlKGludCBpbmRleDEsIGludCBpbmRleDIpCi17Ci0JaW50IHR4X3JldHJ5X3JhdGUxLCB0eF9yZXRyeV9yYXRlMjsKLQl0eF9yZXRyeV9yYXRlMSA9IERpdmlkZSgoVHhQa3RSZXRyeVBlckFudFtpbmRleDFdIC0gVHhQa3RQZXJBbnRbaW5kZXgxXSkqMTAwLCBUeFBrdFJldHJ5UGVyQW50W2luZGV4MV0pOwotCXR4X3JldHJ5X3JhdGUyID0gRGl2aWRlKChUeFBrdFJldHJ5UGVyQW50W2luZGV4Ml0gLSBUeFBrdFBlckFudFtpbmRleDJdKSoxMDAsIFR4UGt0UmV0cnlQZXJBbnRbaW5kZXgyXSk7Ci0JI2lmZGVmIF9QRV9EVE9fRFVNUF8KLQlXQkRFQlVHKCgiW01UT106VHhSZXRyeSBBbnQwOiAoJWQlJSkgIEFudDE6ICglZCUlKSBcbiAiLCB0eF9yZXRyeV9yYXRlMSwgdHhfcmV0cnlfcmF0ZTIpKTsKLQkjZW5kaWYKLQotCWlmKHR4X3JldHJ5X3JhdGUxID4gdHhfcmV0cnlfcmF0ZTIpCi0JCXJldHVybiBUUlVFOwotCWVsc2UKLQkJcmV0dXJuIEZBTFNFOwotfQotCi12b2lkIEdldEZyZXNoQW50ZW5uYURhdGEoTVRPX0ZVTkNfSU5QVVQpCi17Ci0gICAgdTggICAgICB4OwotCi0JeCA9IGhhbF9nZXRfYW50ZW5uYV9udW1iZXIoTVRPX0hBTCgpKTsKLQkvL2hhbF9nZXRfYnNzX3BrX2NudChNVE9fSEFMKCkpOwotCS8vaGFsX2dldF9lc3Rfc3EzKE1UT19IQUwoKSwgMSk7Ci0Jb2xkX2FudGVubmFbMF0gPSB4OwotCS8vaWYgdGhpcyBpcyB0aGUgZnVuY3Rpb24gZm9yIHRpbWVyCi0JUmVzZXREVE9fUnhJbmZvKHgsIE1UT19GVU5DX0lOUFVUX0RBVEEpOwotCWlmKEFudGVubmFUb2dnbGVCa29mZlRpbWVyKQotCQkJQW50ZW5uYVRvZ2dsZUJrb2ZmVGltZXItLTsKLQlpZiAoYWJzKGxhc3RfcmF0ZV9hbnQtTVRPX1JBVEVfTEVWRUwoKSk+MSkgIC8vYmFja29mZiB0aW1lciByZXNldAotCQlBbnRlbm5hVG9nZ2xlQmtvZmZUaW1lcj0wOwotCi0JaWYgKE1UT19BTlRfRElWRVJTSVRZKCkgIT0gTVRPX0FOVEVOTkFfRElWRVJTSVRZX09OIHx8Ci0JCU1UT19BTlRfRElWRVJTSVRZX0VOQUJMRSgpICE9IDEpCi0JQW50ZW5uYVRvZ2dsZUJrb2ZmVGltZXI9MTsKLQkjaWZkZWYgX1BFX0RUT19EVU1QXwotCVdCREVCVUcoKCJbSEhEVE9dOioqbGFzdCBkYXRhIHJhdGU9JWQsbm93IGRhdGEgcmF0ZT0lZCoqYW50ZW5uYSB0b2dnbGUgdGltZXI9JWQiLGxhc3RfcmF0ZV9hbnQsTVRPX1JBVEVfTEVWRUwoKSxBbnRlbm5hVG9nZ2xlQmtvZmZUaW1lcikpOwotCSNlbmRpZgotCWxhc3RfcmF0ZV9hbnQ9TVRPX1JBVEVfTEVWRUwoKTsKLQlpZihBbnRlbm5hVG9nZ2xlQmtvZmZUaW1lcj09MCkKLQl7Ci0JCU1UT19UT0dHTEVfU1RBVEUoKSA9IFRPR0dMRV9TVEFURV9XQUlUMDsKLQkJI2lmZGVmIF9QRV9EVE9fRFVNUF8KLQkJV0JERUJVRygoIltISERUT106PT09c3RhdGUgaXMgc3RhcnRpbmc9PWZvciBhbnRlbm5hIHRvZ2dsZT09PSIpKTsKLQkJI2VuZGlmCi0JfQotCWVsc2UKLQkJTVRPX1RPR0dMRV9TVEFURSgpID0gVE9HR0xFX1NUQVRFX0lETEU7Ci0KLQlpZiAoKE1UT19CQUNLT0ZGX1RNUigpIT0wKSYmKE1UT19SQVRFX0xFVkVMKCk+TVRPX0RhdGFSYXRlQXZhaWxhYmxlTGV2ZWwgLSAzKSkKLQl7Ci0JCU1UT19UT0dHTEVfU1RBVEUoKSA9IFRPR0dMRV9TVEFURV9JRExFOwotCQkjaWZkZWYgX1BFX0RUT19EVU1QXwotCQlXQkRFQlVHKCgiW0hIRFRPXTo9PT10aGUgZGF0YSByYXRlIGlzICVkIChnb29kKWFuZCB3aWxsIG5vdCB0b29nbGUgID09PSIsTVRPX0RBVEFfUkFURSgpPj4xKSk7Ci0JCSNlbmRpZgotCX0KLQotCi19Ci0KLWludCBXQl9QQ1JbMl07IC8vcGFja2V0IGNvcnJlY3QgcmF0ZQotCi12b2lkIEFudGVubmFUb2dnbGVTdGF0ZShNVE9fRlVOQ19JTlBVVCkKLXsKLSAgICBpbnQgZGVjaWRlYW50ZmxhZyA9IDA7Ci0JdTggICAgICB4OwotCXMzMiAgICAgcnNzaTsKLQotCWlmKE1UT19BTlRfRElWRVJTSVRZX0VOQUJMRSgpICE9IDEpCi0JCXJldHVybjsKLQl4ID0gaGFsX2dldF9hbnRlbm5hX251bWJlcihNVE9fSEFMKCkpOwotCXN3aXRjaChNVE9fVE9HR0xFX1NUQVRFKCkpCi0JewotCi0JICAgLy9NaXNzaW5nLi4uLi4KLQkgICBjYXNlIFRPR0dMRV9TVEFURV9JRExFOgotCSBjYXNlIFRPR0dMRV9TVEFURV9CS09GRjoKLQkgICAgICAgICAgICAgYnJlYWs7OwotCi0JCWNhc2UgVE9HR0xFX1NUQVRFX1dBSVQwOi8vPT09PT09PT0KLQkgICAgICAgICAgICAgICBHZXREVE9fUnhJbmZvKHgsIE1UT19GVU5DX0lOUFVUX0RBVEEpOwotCQkJc21lX2dldF9yc3NpKE1UT19GVU5DX0lOUFVUX0RBVEEsICZyc3NpKTsKLQkJCVJYUlNTSUFOVFt4XSA9IHJzc2k7Ci0JCQkjaWZkZWYgX1BFX0RUT19EVU1QXwotCQkJV0JERUJVRygoIltISERUT10gKip3YWl0MD09PT0gQ29sbGVjdGluZyBBbnQlZC0tcnNzaT0lZFxuIiwgeCxSWFJTU0lBTlRbeF0pKTsKLQkJCSNlbmRpZgotCi0JCQkvL2NoYW5nZSBhbnRlbm5hIGFuZCByZXNldCB0aGUgZGF0YSBhdCBjaGFuZ2VkIGFudGVubmEKLQkJCXggPSAofngpICYgMHgwMTsKLQkJCU1UT19BTlRfU0VMKCkgPSB4OwotCQkJaGFsX3NldF9hbnRlbm5hX251bWJlcihNVE9fSEFMKCksIE1UT19BTlRfU0VMKCkpOwotCQkJTE9DQUxfQU5URU5OQV9OTygpID0geDsKLQotCQkJTVRPX1RPR0dMRV9TVEFURSgpID0gVE9HR0xFX1NUQVRFX1dBSVQxOy8vZ28gdG8gd2FpdDEKLQkJCVJlc2V0RFRPX1J4SW5mbyh4LCBNVE9fRlVOQ19JTlBVVF9EQVRBKTsKLQkJCWJyZWFrOwotCQljYXNlIFRPR0dMRV9TVEFURV9XQUlUMTovLz09PT09d2FpdDEKLQkJCS8vTVRPX0NOVF9BTlQoeCkgPSBoYWxfZ2V0X2Jzc19wa19jbnQoTVRPX0hBTCgpKTsKLQkJCS8vUlhSU1NJQU5UW3hdID0gaGFsX2dldF9yc3NpKE1UT19IQUwoKSk7Ci0JCQlzbWVfZ2V0X3Jzc2koTVRPX0ZVTkNfSU5QVVRfREFUQSwgJnJzc2kpOwotCQkJUlhSU1NJQU5UW3hdID0gcnNzaTsKLQkJCUdldERUT19SeEluZm8oeCwgTVRPX0ZVTkNfSU5QVVRfREFUQSk7Ci0JCQkjaWZkZWYgX1BFX0RUT19EVU1QXwotCQkJV0JERUJVRygoIltISERUT10gKip3YWl0MT09PT0gQ29sbGVjdGluZyBBbnQlZC0tcnNzaT0lZFxuIiwgeCxSWFJTU0lBTlRbeF0pKTsKLQkJCSNlbmRpZgotCQkJTVRPX1RPR0dMRV9TVEFURSgpID0gVE9HR0xFX1NUQVRFX01BS0VERVNJU0lPTjsKLQkJCWJyZWFrOwotCQljYXNlIFRPR0dMRV9TVEFURV9NQUtFREVTSVNJT046Ci0JCQkjaWZkZWYgX1BFX0RUT19EVU1QXwotCQkJV0JERUJVRygoIltISERUT106QW50LS0wLS0tLS0tLS0tLS0tLS0tLS0xLS0tXG4iKSk7Ci0JCQlPdXRwdXREZWJ1Z0luZm8oQU5UMCxBTlQxKTsKLQkJCSNlbmRpZgotCQkJLy9QREVCVUcoKCJbSEhEVE9dICoqZGVjaXNpb249PT09XG4gIikpOwotCi0JCQkvLz09PT09Zm9sbG93aW5nIGlzIHRoZSBkZWNpc2lvbiBwcm9kdXJjZQotCQkJLy8KLQkJCS8vICAgIGZpcnN0OiBjb21wYXJlIHRoZSByc3NpIGlmIGRpZmZlcmVuY2UgPjEwCi0JCQkvLyAgICAgICAgICAgc2VsZWN0IHRoZSBsYXJnZXIgb25lCi0JCQkvLyAgICAgICAgICAgLG90aGVycyBnbyB0byBzZWNvbmQKLQkJCS8vICAgIHNlY29uZDogY29tYXByZSB0aGUgdHgrcnggcGFja2V0IGNvdW50IGlmIGRpZmZlcmVuY2UgPjEwMAotCQkJLy8gICAgICAgICAgICB1c2UgbGFyZ2VyIHRvdGFsIHBhY2tldHMgYW50ZW5uYQotCQkJLy8gICAgdGhpcmQ6OmNvbXBhcmUgdGhlIHR4IFBFUiBpZiBwYWNrZXRzPjIwCi0JCQkvLyAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGRpZmZlcmVuY2UgPjUlIHVzaW5nIHRoZSBiaWdnZXIgb25lCi0JCQkvLwotCQkJLy8gICAgZm91cnRoOmNvbXBhcmUgdGhlIFJYIFBFUiBpZiBwYWNrZXRzPjIwCi0JCQkvLyAgICAgICAgICAgICAgICAgICAgaWYgUEVSIGRpZmZlcmVuY2UgPDUlCi0JCQkvLyAgICAgICAgICAgICAgICAgICB1c2luZyBvbGQgYW50ZW5uYQotCQkJLy8KLQkJCS8vCi0JCQlpZiAoYWJzKFJYUlNTSUFOVFtBTlQwXS1SWFJTU0lBTlRbQU5UMV0pID4gTVRPUEFSQV9SU1NJX1RIX0ZPUl9BTlRESVYoKSkvLz09PT1yc3NpX3RoCi0JCQl7Ci0JCQkJaWYgKFJYUlNTSUFOVFtBTlQwXT5SWFJTU0lBTlRbQU5UMV0pCi0JCQkJewotCQkJCQlkZWNpZGVhbnRmbGFnPTE7Ci0JCQkJCU1UT19BTlRfTUFDKCkgPSBBTlQwOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQlkZWNpZGVhbnRmbGFnPTE7Ci0JCQkJCU1UT19BTlRfTUFDKCkgPSBBTlQxOwotCQkJCX0KLQkJCQkjaWZkZWYgX1BFX0RUT19EVU1QXwotCQkJCVdCREVCVUcoKCJTZWxlY3QgYW50ZW5uYSBieSBSU1NJXG4iKSk7Ci0JCQkJI2VuZGlmCi0JCQl9Ci0JCQllbHNlIGlmICAoYWJzKFR4UGt0UGVyQW50W0FOVDBdICsgRFRPX1J4X0luZm9bMF1bQU5UMF0tVHhQa3RQZXJBbnRbQU5UMV0tRFRPX1J4X0luZm9bMF1bQU5UMV0pPDUwKS8vPT09PT10b3RhbCBwYWNrZXRfdGgKLQkJCXsKLQkJCQkjaWZkZWYgX1BFX0RUT19EVU1QXwotCQkJCVdCREVCVUcoKCJUb3RhbCB0eC9yeCBpcyBjbG9zZVxuIikpOwotCQkJCSNlbmRpZgotCQkJCWlmIChUeERvbWluYXRlKEFOVDApICYmIFR4RG9taW5hdGUoQU5UMSkpCi0JCQkJewotCQkJCQlpZiAoKFR4UGt0UGVyQW50W0FOVDBdPjEwKSAmJiAoVHhQa3RQZXJBbnRbQU5UMV0+MTApKS8vPT09PXR4IHBhY2tldF90aAotCQkJCQl7Ci0JCQkJCQlXQl9QQ1JbQU5UMF09RGl2aWRlKFR4UGt0UGVyQW50W0FOVDBdKjEwMCxUeFBrdFJldHJ5UGVyQW50W0FOVDBdKTsKLQkJCQkJCVdCX1BDUltBTlQxXT1EaXZpZGUoVHhQa3RQZXJBbnRbQU5UMV0qMTAwLFR4UGt0UmV0cnlQZXJBbnRbQU5UMV0pOwotCQkJCQkJaWYgKGFicyhXQl9QQ1JbQU5UMF0tV0JfUENSW0FOVDFdKT41KS8vIHR4IFBFUl90aAotCQkJCQkJewotCQkJCQkJCSNpZmRlZiBfUEVfRFRPX0RVTVBfCi0JCQkJCQkJV0JERUJVRygoIkRlY2lkZSBieSBUeCBjb3JyZWN0IHJhdGVcbiIpKTsKLQkJCQkJCQkjZW5kaWYKLQkJCQkJCQlpZiAoV0JfUENSW0FOVDBdPldCX1BDUltBTlQxXSkKLQkJCQkJCQl7Ci0JCQkJCQkJCWRlY2lkZWFudGZsYWc9MTsKLQkJCQkJCQkJTVRPX0FOVF9NQUMoKSA9IEFOVDA7Ci0JCQkJCQkJfQotCQkJCQkJCWVsc2UKLQkJCQkJCQl7Ci0JCQkJCQkJCWRlY2lkZWFudGZsYWc9MTsKLQkJCQkJCQkJTVRPX0FOVF9NQUMoKSA9IEFOVDE7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJZWxzZQotCQkJCQkJewotCQkJCQkJCWRlY2lkZWFudGZsYWc9MDsKLQkJCQkJCQl1bnRvZ2dsZWNvdW50Kys7Ci0JCQkJCQkJTVRPX0FOVF9NQUMoKSA9IG9sZF9hbnRlbm5hWzBdOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsc2UKLQkJCQkJewotCQkJCQkJZGVjaWRlYW50ZmxhZz0wOwotCQkJCQkJTVRPX0FOVF9NQUMoKSA9IG9sZF9hbnRlbm5hWzBdOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgaWYgKChEVE9fUnhfSW5mb1swXVtBTlQwXT4xMCkmJihEVE9fUnhfSW5mb1swXVtBTlQxXT4xMCkpLy9yeCBwYWNrZXQgdGgKLQkJCQl7Ci0JCQkJCSNpZmRlZiBfUEVfRFRPX0RVTVBfCi0JCQkJCVdCREVCVUcoKCJEZWNpZGUgYnkgUnhcbiIpKTsKLQkJCQkJI2VuZGlmCi0JCQkJCWlmIChhYnMoRFRPX1J4X0luZm9bMF1bQU5UMF0gLSBEVE9fUnhfSW5mb1swXVtBTlQxXSk+NTApCi0JCQkJCXsKLQkJCQkJCWlmIChEVE9fUnhfSW5mb1swXVtBTlQwXSA+IERUT19SeF9JbmZvWzBdW0FOVDFdKQotCQkJCQkJewotCQkJCQkJCWRlY2lkZWFudGZsYWc9MTsKLQkJCQkJCQlNVE9fQU5UX01BQygpID0gQU5UMDsKLQkJCQkJCX0KLQkJCQkJCWVsc2UKLQkJCQkJCXsKLQkJCQkJCQlkZWNpZGVhbnRmbGFnPTE7Ci0JCQkJCQkJTVRPX0FOVF9NQUMoKSA9IEFOVDE7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZWxzZQotCQkJCQl7Ci0JCQkJCQlkZWNpZGVhbnRmbGFnPTA7Ci0JCQkJCQl1bnRvZ2dsZWNvdW50Kys7Ci0JCQkJCQlNVE9fQU5UX01BQygpID0gb2xkX2FudGVubmFbMF07Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJZGVjaWRlYW50ZmxhZz0wOwotCQkJCQlNVE9fQU5UX01BQygpID0gb2xkX2FudGVubmFbMF07Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAoKFR4UGt0UGVyQW50W0FOVDBdK0RUT19SeF9JbmZvWzBdW0FOVDBdKT4oVHhQa3RQZXJBbnRbQU5UMV0rRFRPX1J4X0luZm9bMF1bQU5UMV0pKS8vdXNlIG1vcmUgcGFja2VrdHMKLQkJCXsKLQkJCQkjaWZkZWYgX1BFX0RUT19EVU1QXwotCQkJCVdCREVCVUcoKCJkZWNpZGUgYnkgdG90YWwgdHgvcnggOiBBTlQgMFxuIikpOwotCQkJCSNlbmRpZgotCi0JCQkJZGVjaWRlYW50ZmxhZz0xOwotCQkJCU1UT19BTlRfTUFDKCkgPSBBTlQwOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCSNpZmRlZiBfUEVfRFRPX0RVTVBfCi0JCQkJV0JERUJVRygoImRlY2lkZSBieSB0b3RhbCB0eC9yeCA6IEFOVCAxXG4iKSk7Ci0JCQkJI2VuZGlmCi0JCQkJZGVjaWRlYW50ZmxhZz0xOwotCQkJCU1UT19BTlRfTUFDKCkgPSBBTlQxOwotCi0JCQl9Ci0JCQkvL3RoaXMgaXMgZm9yY2UgYW50IHRvZ2dsZQotCQkJaWYgKGRlY2lkZWFudGZsYWc9PTEpCi0JCQkJdW50b2dnbGVjb3VudD0wOwotCi0JCQl1bnRvZ2dsZWNvdW50PXVudG9nZ2xlY291bnQlNDsKLQkJCWlmICh1bnRvZ2dsZWNvdW50PT0zKSAvL2NoYW5nZSBhbnRlbm5hCi0JCQkJTVRPX0FOVF9NQUMoKSA9ICgofm9sZF9hbnRlbm5hWzBdKSAmIDB4MSk7Ci0JCQkjaWZkZWYgX1BFX0RUT19EVU1QXwotCQkJV0JERUJVRygoIltISERUT106PT09PT09PT09PT09PT09PT09dW50b2dnbGUtY291bnQ9JWQiLHVudG9nZ2xlY291bnQpKTsKLQkJCSNlbmRpZgotCi0KLQotCi0JCQkvL1BERUJVRygoIltISERUT10gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKkRUTyBFTkFCTEU9JWQiLE1UT19BTlRfRElWRVJTSVRZX0VOQUJMRSgpKSk7Ci0JCQlpZihNVE9fQU5UX0RJVkVSU0lUWV9FTkFCTEUoKSA9PSAxKQotCQkJewotCQkJCQlNVE9fQU5UX1NFTCgpID0gTVRPX0FOVF9NQUMoKTsKLQkJCQkJaGFsX3NldF9hbnRlbm5hX251bWJlcihNVE9fSEFMKCksIE1UT19BTlRfU0VMKCkpOwotCQkJCQlMT0NBTF9BTlRFTk5BX05PKCkgPSBNVE9fQU5UX1NFTCgpOwotCQkJCQkjaWZkZWYgX1BFX0RUT19EVU1QXwotCQkJCQlXQkRFQlVHKCgiW0hIRFRPXSA9PWRlY2lzaW9uPT0qKioqKioqYW50ZmxhZz0lZCoqKioqKioqKioqKioqKioqKnNlbGVjdGVkIGFudGVubmE9JWRcbiIsZGVjaWRlYW50ZmxhZyxNVE9fQU5UX1NFTCgpKSk7Ci0JCQkJCSNlbmRpZgotCQkJfQotCQkJaWYgKGRlY2lkZWFudGZsYWcpCi0JCQl7Ci0JCQkJb2xkX2FudGVubmFbM109b2xkX2FudGVubmFbMl07Ly9zdG9yZSBhbnRlbm5hIGluZm8KLQkJCQlvbGRfYW50ZW5uYVsyXT1vbGRfYW50ZW5uYVsxXTsKLQkJCQlvbGRfYW50ZW5uYVsxXT1vbGRfYW50ZW5uYVswXTsKLQkJCQlvbGRfYW50ZW5uYVswXT0gTVRPX0FOVF9NQUMoKTsKLQkJCX0KLQkJCSNpZmRlZiBfUEVfRFRPX0RVTVBfCi0JCQlXQkRFQlVHKCgiW0hIRFRPXToqKm9sZCBhbnRlbm5hPVslZF1bJWRdWyVkXVslZF1cbiIsb2xkX2FudGVubmFbMF0sb2xkX2FudGVubmFbMV0sb2xkX2FudGVubmFbMl0sb2xkX2FudGVubmFbM10pKTsKLQkJCSNlbmRpZgotCQkJaWYgKG9sZF9hbnRlbm5hWzBdIT1vbGRfYW50ZW5uYVsxXSkKLQkJCQlBbnRlbm5hVG9nZ2xlQmtvZmZUaW1lcj0wOwotCQkJZWxzZSBpZiAob2xkX2FudGVubmFbMV0hPW9sZF9hbnRlbm5hWzJdKQotCQkJCUFudGVubmFUb2dnbGVCa29mZlRpbWVyPTE7Ci0JCQllbHNlIGlmIChvbGRfYW50ZW5uYVsyXSE9b2xkX2FudGVubmFbM10pCi0JCQkJQW50ZW5uYVRvZ2dsZUJrb2ZmVGltZXI9MjsKLQkJCWVsc2UKLQkJCQlBbnRlbm5hVG9nZ2xlQmtvZmZUaW1lcj00OwotCi0JCQkjaWZkZWYgX1BFX0RUT19EVU1QXwotCQkJV0JERUJVRygoIltISERUT106KipiYWNrIG9mZiB0aW1lcj0lZCIsQW50ZW5uYVRvZ2dsZUJrb2ZmVGltZXIpKTsKLQkJCSNlbmRpZgotCi0JCQlSZXNldERUT19SeEluZm8oTVRPX0FOVF9NQUMoKSwgTVRPX0ZVTkNfSU5QVVRfREFUQSk7Ci0JCQlpZiAoQW50ZW5uYVRvZ2dsZUJrb2ZmVGltZXI9PTAgJiYgZGVjaWRlYW50ZmxhZykKLQkJCQlNVE9fVE9HR0xFX1NUQVRFKCkgPSBUT0dHTEVfU1RBVEVfV0FJVDA7Ci0JCQllbHNlCi0JCQkJTVRPX1RPR0dMRV9TVEFURSgpID0gVE9HR0xFX1NUQVRFX0lETEU7Ci0JCQlicmVhazsKLQl9Ci0KLX0KLQotdm9pZCBtdWx0aWFnYyhNVE9fRlVOQ19JTlBVVCwgdTggaGlnaF9nYWluX21vZGUgKQotewotCXMzMgkJcnNzaTsKLQlod19kYXRhX3QJKnBId0RhdGEgPSBNVE9fSEFMKCk7Ci0KLQlzbWVfZ2V0X3Jzc2koTVRPX0ZVTkNfSU5QVVRfREFUQSwgJnJzc2kpOwotCi0JaWYoIChSRl9XQl8yNDIgPT0gcEh3RGF0YS0+cGh5X3R5cGUpIHx8Ci0JCShSRl9XQl8yNDJfMSA9PSBwSHdEYXRhLT5waHlfdHlwZSkgKSAvLyAyMDA2MDYxOS41IEFkZAotCXsKLQkJaWYgKGhpZ2hfZ2Fpbl9tb2RlPT0xKQotCQl7Ci0JCQkvL2h3X3NldF9keHhfcmVnKHBod19kYXRhLCAweDBDLCAweGY4ZjUyMjMwKTsKLQkJCS8vaHdfc2V0X2R4eF9yZWcocGh3X2RhdGEsIDB4MjAsIDB4MDZDNDM0NDApOwotCQkJV2IzNVJlZ19Xcml0ZSggcEh3RGF0YSwgMHgxMDBDLCAweEYyRjMyMjMyICk7IC8vIDk0MDkxNiAweGY4ZjUyMjMwICk7Ci0JCQlXYjM1UmVnX1dyaXRlKCBwSHdEYXRhLCAweDEwMjAsIDB4MDRjYjM0NDAgKTsgLy8gOTQwOTE1IDB4MDZDNDM0NDAKLQkJfQotCQllbHNlIGlmIChoaWdoX2dhaW5fbW9kZT09MCkKLQkJewotCQkJLy9od19zZXRfZHh4X3JlZyhwaHdfZGF0YSwgMHgwQywgMHhFRUVFMDAwRCk7Ci0JCQkvL2h3X3NldF9keHhfcmVnKHBod19kYXRhLCAweDIwLCAweDA2YzQxNDQwKTsKLQkJCVdiMzVSZWdfV3JpdGUoIHBId0RhdGEsIDB4MTAwQywgMHhFRUVFMDAwRCApOwotCQkJV2IzNVJlZ19Xcml0ZSggcEh3RGF0YSwgMHgxMDIwLCAweDA0Y2IxNDQwICk7IC8vIDk0MDkxNSAweDA2YzQxNDQwCi0JCX0KLQkJI2lmZGVmIF9QRV9EVE9fRFVNUF8KLQkJV0JERUJVRygoIltISERUT0FHQ10gKipyc3NpPSVkLCBoaWdoIGdhaW4gbW9kZT0lZCIsIHJzc2ksIGhpZ2hfZ2Fpbl9tb2RlKSk7Ci0JCSNlbmRpZgotCX0KLX0KLQotdm9pZCBUeFB3ckNvbnRyb2woTVRPX0ZVTkNfSU5QVVQpCi17Ci0gICAgczMyICAgICByc3NpOwotCWh3X2RhdGFfdAkqcEh3RGF0YSA9IE1UT19IQUwoKTsKLQotCXNtZV9nZXRfcnNzaShNVE9fRlVOQ19JTlBVVF9EQVRBLCAmcnNzaSk7Ci0JaWYoIChSRl9XQl8yNDIgPT0gcEh3RGF0YS0+cGh5X3R5cGUpIHx8Ci0JCShSRl9XQl8yNDJfMSA9PSBwSHdEYXRhLT5waHlfdHlwZSkgKSAvLyAyMDA2MDYxOS41IEFkZAotCXsKLQkJc3RhdGljIHU4IGhpZ2hfZ2Fpbl9tb2RlOyAvL3RoaXMgaXMgZm9yIHdpbmJvbmQgUkYgc3dpdGNoIExOQQotCQkgICAgICAgICAgICAgICAgICAgICAgICAgIC8vdXNpbmcgZGlmZmVyZW50IHJlZ2lzdGVyIHNldHRpbmcKLQotCQlpZiAoaGlnaF9nYWluX21vZGU9PTEpCi0JCXsKLQkJCWlmKCByc3NpID4gTVRPX0RBVEEoKS5SU1NJX2hpZ2ggKQotCQkJewotCQkJCS8vaHdfc2V0X2R4eF9yZWcocGh3X2RhdGEsIDB4MEMsIDB4ZjhmNTIyMzApOwotCQkJCS8vaHdfc2V0X2R4eF9yZWcocGh3X2RhdGEsIDB4MjAsIDB4MDU1NDE2NDApOwotCQkJCWhpZ2hfZ2Fpbl9tb2RlPTA7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJLy9od19zZXRfZHh4X3JlZyhwaHdfZGF0YSwgMHgwQywgMHhmOGY1MTgzMCk7Ci0JCQkJLy9od19zZXRfZHh4X3JlZyhwaHdfZGF0YSwgMHgyMCwgMHgwNTU0M0U0MCk7Ci0JCQkJaGlnaF9nYWluX21vZGU9MTsKLQkJCX0KLQkJfQotCQllbHNlIC8vaWYgKGhpZ2hfZ2Fpbl9tb2RlPT0wKQotCQl7Ci0JCQlpZiggcnNzaSA8IE1UT19EQVRBKCkuUlNTSV9sb3cgKQotCQkJewotCQkJCS8vaHdfc2V0X2R4eF9yZWcocGh3X2RhdGEsIDB4MEMsIDB4ZjhmNTE4MzApOwotCQkJCS8vaHdfc2V0X2R4eF9yZWcocGh3X2RhdGEsIDB4MjAsIDB4MDU1NDNFNDApOwotCQkJCWhpZ2hfZ2Fpbl9tb2RlPTE7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJLy9od19zZXRfZHh4X3JlZyhwaHdfZGF0YSwgMHgwQywgMHhmOGY1MjIzMCk7Ci0JCQkJLy9od19zZXRfZHh4X3JlZyhwaHdfZGF0YSwgMHgyMCwgMHgwNTU0MTY0MCk7Ci0JCQkJaGlnaF9nYWluX21vZGU9MDsKLQkJCX0KLQkJfQotCi0JCS8vIEFsd2F5cyBoaWdoIGdhaW4gMjAwNTEwMTQuIFVzaW5nIHRoZSBpbml0aWFsIHZhbHVlIG9ubHkuCi0JCW11bHRpYWdjKE1UT19GVU5DX0lOUFVUX0RBVEEsIGhpZ2hfZ2Fpbl9tb2RlKTsKLQl9Ci19Ci0KLQotdTggQ2FsY05ld1JhdGUoTVRPX0ZVTkNfSU5QVVQsIHU4IG9sZF9yYXRlLCB1MzIgcmV0cnlfY250LCB1MzIgdHhfZnJhZ19jbnQpCi17Ci0JaW50IGk7Ci0JdTggbmV3X3JhdGU7Ci0gICAgdTMyIHJldHJ5X3JhdGU7Ci0JaW50IFR4VGhyb3VwdXQxLCBUeFRocm91cHV0MiwgVHhUaHJvdXB1dDMsIEJlc3RUaHJvdXBodDsKLQotCWlmKHR4X2ZyYWdfY250IDwgTVRPUEFSQV9UWENPVU5UX1RIX0ZPUl9DQUxDX1JBVEUoKSkgLy90b28gZmV3IHBhY2tldHMgdHJhbnNtaXQKLQl7Ci0JCXJldHVybiAweGZmOwotCX0KLQlyZXRyeV9yYXRlID0gRGl2aWRlKHJldHJ5X2NudCAqIDEwMCwgdHhfZnJhZ19jbnQpOwotCi0JaWYocmV0cnlfcmF0ZSA+IDkwKSByZXRyeV9yYXRlID0gOTA7IC8vYWx3YXlzIHRydW5jYXRlIHRvIDkwJSBkdWUgdG8gbG9va3VwIHRhYmxlIHNpemUKLQkjaWZkZWYgX1BFX0RUT19EVU1QXwotCVdCREVCVUcoKCIjIyMjIyBDdXJyZW50IGxldmVsID0lZCwgUmV0cnkgY291bnQgPSVkLCBGcmFnIGNvdW50ID0lZFxuIiwKLQkJCQkJCW9sZF9yYXRlLCByZXRyeV9jbnQsIHR4X2ZyYWdfY250KSk7Ci0JV0JERUJVRygoIiojIyogUmV0cnkgcmF0ZSA9JWQsIHRocm91Z2hwdXQgPSVkXG4iLAotCQkJCQkJcmV0cnlfcmF0ZSwgUmF0ZV9QRVJfVEJMW3JldHJ5X3JhdGVdW29sZF9yYXRlXSkpOwotCVdCREVCVUcoKCJUeFJhdGVSZWMudHhfcmF0ZSA9JWQsIFJldHJ5IHJhdGUgPSAlZCwgdGhyb3VnaHB1dCA9ICVkXG4iLAotCQkJCQkJVHhSYXRlUmVjLnR4X3JhdGUsIFR4UmF0ZVJlYy50eF9yZXRyeV9yYXRlLAotCQkJCQkJUmF0ZV9QRVJfVEJMW1R4UmF0ZVJlYy50eF9yZXRyeV9yYXRlXVtMZXZlbDJQZXJUYmxbVHhSYXRlUmVjLnR4X3JhdGVdXSkpOwotCVdCREVCVUcoKCJvbGRfcmF0ZS0xID0lZCwgUmV0cnkgcmF0ZSA9ICVkLCB0aHJvdWdocHV0ID0gJWRcbiIsCi0JCQkJCQlvbGRfcmF0ZS0xLCByZXRyeXJhdGVfcmVjW29sZF9yYXRlLTFdLAotCQkJCQkJUmF0ZV9QRVJfVEJMW3JldHJ5cmF0ZV9yZWNbb2xkX3JhdGUtMV1dW29sZF9yYXRlLTFdKSk7Ci0JV0JERUJVRygoIm9sZF9yYXRlKzEgPSVkLCBSZXRyeSByYXRlID0gJWQsIHRocm91Z2hwdXQgPSAlZFxuIiwKLQkJCQkJCW9sZF9yYXRlKzEsIHJldHJ5cmF0ZV9yZWNbb2xkX3JhdGUrMV0sCi0JCQkJCQlSYXRlX1BFUl9UQkxbcmV0cnlyYXRlX3JlY1tvbGRfcmF0ZSsxXV1bb2xkX3JhdGUrMV0pKTsKLQkjZW5kaWYKLQotCS8vZm9sbG93aW5nIGlzIGZvciByZWNvcmQgdGhlIHJldHJ5IHJhdGUgYXQgdGhlIGRpZmZlcmVudCBkYXRhIHJhdGUKLQlpZiAoYWJzKHJldHJ5X3JhdGUtcmV0cnlyYXRlX3JlY1tvbGRfcmF0ZV0pPDUwKS8vLS0tdGhlIHBlciBUSAotCQlyZXRyeXJhdGVfcmVjW29sZF9yYXRlXSA9IHJldHJ5X3JhdGU7IC8vdXBkYXRlIHJldHJ5IHJhdGUKLQllbHNlCi0JewotCQlmb3IgKGk9MDtpPE1UT19EYXRhUmF0ZUF2YWlsYWJsZUxldmVsO2krKykgLy9yZXNldCBhbGwgcmV0cnkgcmF0ZQotCQkJcmV0cnlyYXRlX3JlY1tpXT0wOwotCQlyZXRyeXJhdGVfcmVjW29sZF9yYXRlXSA9IHJldHJ5X3JhdGU7Ci0JCSNpZmRlZiBfUEVfRFRPX0RVTVBfCi0JCVdCREVCVUcoKCJSZXNldCByZXRyeSByYXRlIHRhYmxlXG4iKSk7Ci0JCSNlbmRpZgotCX0KLQotCWlmKFR4UmF0ZVJlYy50eF9yYXRlID4gb2xkX3JhdGUpICAgLy9EZWNyZWFzZSBUeCBSYXRlCi0JewotCQlUeFRocm91cHV0MSA9IFJhdGVfUEVSX1RCTFtUeFJhdGVSZWMudHhfcmV0cnlfcmF0ZV1bTGV2ZWwyUGVyVGJsW1R4UmF0ZVJlYy50eF9yYXRlXV07Ci0JCVR4VGhyb3VwdXQyID0gUmF0ZV9QRVJfVEJMW3JldHJ5X3JhdGVdW0xldmVsMlBlclRibFtvbGRfcmF0ZV1dOwotCQlpZihUeFRocm91cHV0MSA+IFR4VGhyb3VwdXQyKQotCQl7Ci0JCQluZXdfcmF0ZSA9IFR4UmF0ZVJlYy50eF9yYXRlOwotCQkJQmVzdFRocm91cGh0ID0gVHhUaHJvdXB1dDE7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQluZXdfcmF0ZSA9IG9sZF9yYXRlOwotCQkJQmVzdFRocm91cGh0ID0gVHhUaHJvdXB1dDI7Ci0JCX0KLQkJaWYoKG9sZF9yYXRlID4gMCkgJiYocmV0cnlfcmF0ZT5NVE9QQVJBX1RYUkFURV9ERUNfVEgoKSkpICAgLy9NaW4gUmF0ZQotCQl7Ci0JCQlUeFRocm91cHV0MyA9IFJhdGVfUEVSX1RCTFtyZXRyeXJhdGVfcmVjW29sZF9yYXRlLTFdXVtMZXZlbDJQZXJUYmxbb2xkX3JhdGUtMV1dOwotCQkJaWYoQmVzdFRocm91cGh0IDwgVHhUaHJvdXB1dDMpCi0JCQl7Ci0JCQkJbmV3X3JhdGUgPSBvbGRfcmF0ZSAtIDE7Ci0JCQkJI2lmZGVmIF9QRV9EVE9fRFVNUF8KLQkJCQlXQkRFQlVHKCgiLS0tLS0tLS1cbiIpKTsKLQkJCQkjZW5kaWYKLQkJCQlCZXN0VGhyb3VwaHQgPSBUeFRocm91cHV0MzsKLQkJCX0KLQkJfQotCX0KLQllbHNlIGlmKFR4UmF0ZVJlYy50eF9yYXRlIDwgb2xkX3JhdGUpICAvL0luY3JlYXNlIFR4IFJhdGUKLQl7Ci0JCVR4VGhyb3VwdXQxID0gUmF0ZV9QRVJfVEJMW1R4UmF0ZVJlYy50eF9yZXRyeV9yYXRlXVtMZXZlbDJQZXJUYmxbVHhSYXRlUmVjLnR4X3JhdGVdXTsKLQkJVHhUaHJvdXB1dDIgPSBSYXRlX1BFUl9UQkxbcmV0cnlfcmF0ZV1bTGV2ZWwyUGVyVGJsW29sZF9yYXRlXV07Ci0JCWlmKFR4VGhyb3VwdXQxID4gVHhUaHJvdXB1dDIpCi0JCXsKLQkJCW5ld19yYXRlID0gVHhSYXRlUmVjLnR4X3JhdGU7Ci0JCQlCZXN0VGhyb3VwaHQgPSBUeFRocm91cHV0MTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCW5ld19yYXRlID0gb2xkX3JhdGU7Ci0JCQlCZXN0VGhyb3VwaHQgPSBUeFRocm91cHV0MjsKLQkJfQotCQlpZiAoKG9sZF9yYXRlIDwgTVRPX0RhdGFSYXRlQXZhaWxhYmxlTGV2ZWwgLSAxKSYmKHJldHJ5X3JhdGU8TVRPUEFSQV9UWFJBVEVfSU5DX1RIKCkpKQotCQl7Ci0JCQkvL1R4VGhyb3VwdXQzID0gUmF0ZV9QRVJfVEJMW3JldHJ5cmF0ZV9yZWNbb2xkX3JhdGUrMV1dW0xldmVsMlBlclRibFtvbGRfcmF0ZSsxXV07Ci0JCQlpZiAocmV0cnlyYXRlX3JlY1tvbGRfcmF0ZSsxXSA+IE1UT1BBUkFfVFhSRVRSWVJBVEVfUkVEVUNFKCkpCi0JCQkJVHhUaHJvdXB1dDMgPSBSYXRlX1BFUl9UQkxbcmV0cnlyYXRlX3JlY1tvbGRfcmF0ZSsxXS1NVE9QQVJBX1RYUkVUUllSQVRFX1JFRFVDRSgpXVtMZXZlbDJQZXJUYmxbb2xkX3JhdGUrMV1dOwotCQkJZWxzZQotCQkJCVR4VGhyb3VwdXQzID0gUmF0ZV9QRVJfVEJMW3JldHJ5cmF0ZV9yZWNbb2xkX3JhdGUrMV1dW0xldmVsMlBlclRibFtvbGRfcmF0ZSsxXV07Ci0JCQlpZihCZXN0VGhyb3VwaHQgPCBUeFRocm91cHV0MykKLQkJCXsKLQkJCQluZXdfcmF0ZSA9IG9sZF9yYXRlICsgMTsKLQkJCQkjaWZkZWYgX1BFX0RUT19EVU1QXwotCQkJCVdCREVCVUcoKCIrKysrKysrKysrXG4iKSk7Ci0JCQkJI2VuZGlmCi0JCQkJQmVzdFRocm91cGh0ID0gVHhUaHJvdXB1dDM7Ci0JCQl9Ci0JCX0KLQl9Ci0JZWxzZSAgLy9UeCBSYXRlIG5vIGNoYW5nZQotCXsKLQkJVHhUaHJvdXB1dDIgPSBSYXRlX1BFUl9UQkxbcmV0cnlfcmF0ZV1bTGV2ZWwyUGVyVGJsW29sZF9yYXRlXV07Ci0JCW5ld19yYXRlID0gb2xkX3JhdGU7Ci0JCUJlc3RUaHJvdXBodCA9IFR4VGhyb3VwdXQyOwotCi0JCWlmIChyZXRyeV9yYXRlIDxNVE9QQVJBX1RYUkFURV9FUV9USCgpKSAgICAvL3RoIGZvciBjaGFuZ2UgaGlnaGVyIHJhdGUKLQkJewotCQkJaWYob2xkX3JhdGUgPCBNVE9fRGF0YVJhdGVBdmFpbGFibGVMZXZlbCAtIDEpCi0JCQl7Ci0JCQkJLy9UeFRocm91cHV0MyA9IFJhdGVfUEVSX1RCTFtyZXRyeXJhdGVfcmVjW29sZF9yYXRlKzFdXVtMZXZlbDJQZXJUYmxbb2xkX3JhdGUrMV1dOwotCQkJCWlmIChyZXRyeXJhdGVfcmVjW29sZF9yYXRlKzFdID4gTVRPUEFSQV9UWFJFVFJZUkFURV9SRURVQ0UoKSkKLQkJCQkJVHhUaHJvdXB1dDMgPSBSYXRlX1BFUl9UQkxbcmV0cnlyYXRlX3JlY1tvbGRfcmF0ZSsxXS1NVE9QQVJBX1RYUkVUUllSQVRFX1JFRFVDRSgpXVtMZXZlbDJQZXJUYmxbb2xkX3JhdGUrMV1dOwotCQkJCWVsc2UKLQkJCQkJVHhUaHJvdXB1dDMgPSBSYXRlX1BFUl9UQkxbcmV0cnlyYXRlX3JlY1tvbGRfcmF0ZSsxXV1bTGV2ZWwyUGVyVGJsW29sZF9yYXRlKzFdXTsKLQkJCQlpZihCZXN0VGhyb3VwaHQgPCBUeFRocm91cHV0MykKLQkJCQl7Ci0JCQkJCW5ld19yYXRlID0gb2xkX3JhdGUgKyAxOwotCQkJCQlCZXN0VGhyb3VwaHQgPSBUeFRocm91cHV0MzsKLQkJCQkJI2lmZGVmIF9QRV9EVE9fRFVNUF8KLQkJCQkJV0JERUJVRygoIj0rKysrKysrKysrXG4iKSk7Ci0JCQkJCSNlbmRpZgotCQkJCX0KLQkJCX0KLQkJfQotCQllbHNlCi0JCWlmKG9sZF9yYXRlID4gMCkgICAvL01pbiBSYXRlCi0JCXsKLQkJCVR4VGhyb3VwdXQzID0gUmF0ZV9QRVJfVEJMW3JldHJ5cmF0ZV9yZWNbb2xkX3JhdGUtMV1dW0xldmVsMlBlclRibFtvbGRfcmF0ZS0xXV07Ci0JCQlpZihCZXN0VGhyb3VwaHQgPCBUeFRocm91cHV0MykKLQkJCXsKLQkJCQluZXdfcmF0ZSA9IG9sZF9yYXRlIC0gMTsKLQkJCQkjaWZkZWYgX1BFX0RUT19EVU1QXwotCQkJCVdCREVCVUcoKCI9LS0tLS0tLS1cbiIpKTsKLQkJCQkjZW5kaWYKLQkJCQlCZXN0VGhyb3VwaHQgPSBUeFRocm91cHV0MzsKLQkJCX0KLQkJfQotCX0KLQotCWlmICghTE9DQUxfSVNfSUJTU19NT0RFKCkpCi0JewotCW1heF9yc3NpX3JhdGUgPSBHZXRNYXhSYXRlTGV2ZWxGcm9tUlNTSSgpOwotCSNpZmRlZiBfUEVfRFRPX0RVTVBfCi0JV0JERUJVRygoIltNVE9dOlJTU0kyUmF0ZT0lZFxuIiwgTVRPX0RhdGFfUmF0ZV9UYmxbbWF4X3Jzc2lfcmF0ZV0pKTsKLQkjZW5kaWYKLQlpZihuZXdfcmF0ZSA+IG1heF9yc3NpX3JhdGUpCi0JCW5ld19yYXRlID0gbWF4X3Jzc2lfcmF0ZTsKLQl9Ci0KLQkvL3NhdmUgbmV3IHJhdGU7Ci0JVHhSYXRlUmVjLnR4X3JhdGUgPSBvbGRfcmF0ZTsKLQlUeFJhdGVSZWMudHhfcmV0cnlfcmF0ZSA9ICh1OCkgcmV0cnlfcmF0ZTsKLQlUeFJldHJ5UmF0ZSA9IHJldHJ5X3JhdGU7Ci0JcmV0dXJuIG5ld19yYXRlOwotfQotCi12b2lkIFNtb290aFJTU0koczMyIG5ld19yc3NpKQotewotCVJTU0lTbW9vdGhlZCA9IFJTU0lTbW9vdGhlZCArIG5ld19yc3NpIC0gUlNTSUJ1ZltSU1NJQnVmSW5kZXhdOwotCVJTU0lCdWZbUlNTSUJ1ZkluZGV4XSA9IG5ld19yc3NpOwotCVJTU0lCdWZJbmRleCA9IChSU1NJQnVmSW5kZXggKyAxKSAlIDEwOwotfQotCi11OCBHZXRNYXhSYXRlTGV2ZWxGcm9tUlNTSSh2b2lkKQotewotCXU4IGk7Ci0JdTggVHhSYXRlOwotCi0JZm9yKGk9MDtpPFJTU0kyUkFURV9TSVpFO2krKykKLQl7Ci0JCWlmKFJTU0lTbW9vdGhlZCA+IFJTU0kyUmF0ZVRibFtpXS5SU1NJKQotCQkJYnJlYWs7Ci0JfQotCSNpZmRlZiBfUEVfRFRPX0RVTVBfCi0JV0JERUJVRygoIltNVE9dOlJTU0k9JWRcbiIsIERpdmlkZShSU1NJU21vb3RoZWQsIDEwKSkpOwotCSNlbmRpZgotCWlmKGkgPCBSU1NJMlJBVEVfU0laRSkKLQkJVHhSYXRlID0gUlNTSTJSYXRlVGJsW2ldLlR4UmF0ZTsKLQllbHNlCi0JCVR4UmF0ZSA9IDI7ICAvL2RpdmlkZWQgYnkgMiA9IDFNYnBzCi0KLQlmb3IoaT1NVE9fRGF0YVJhdGVBdmFpbGFibGVMZXZlbC0xO2k+MDtpLS0pCi0JewotCQlpZihUeFJhdGUgPj1NVE9fRGF0YV9SYXRlX1RibFtpXSkKLQkJCWJyZWFrOwotCX0KLQlyZXR1cm4gaTsKLX0KLQogLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIC8vICBEZXNjcmlwdGlvbjoKIC8vICAgICAgSWYgd2UgZW5hYmxlIERUTywgd2Ugd2lsbCBpZ25vcmUgdGhlIHR4IGNvdW50IHdpdGggZGlmZmVyZW50IHR4IHJhdGUgZnJvbQpAQCAtMTE5NCwzNiArMjUyLDMgQEAKIAlQZXJpb2RUb3RhbFR4UGt0ICsrOwogCVBlcmlvZFRvdGFsVHhQa3RSZXRyeSArPSAoaW5kZXgrMSk7CiB9Ci0KLXU4IE1UT19HZXRUeEZhbGxiYWNrUmF0ZShNVE9fRlVOQ19JTlBVVCkKLXsKLQlyZXR1cm4gTVRPX0RBVEFfRkFMTEJBQ0tfUkFURSgpOwotfQotCi0KLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyAgTVRPX1R4RmFpbGVkIC0tCi0vLwotLy8gIERlc2NyaXB0aW9uOgotLy8gICAgRmFpbHVyZSBvZiB0cmFuc21pdHRpbmcgYSBwYWNrZXQgaW5kaWNhdGVzIHRoYXQgY2VydGFpbiBNVE8gcGFybWV0ZXJzCi0vLyAgICBtYXkgbmVlZCB0byBiZSBhZGp1c3RlZC4gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiBOSUMganVzdCBmYWlsZWQKLS8vICAgIHRvIHRyYW5zbWl0IGEgcGFja2V0IG9yIHdoZW4gTVNEVUxpZmVUaW1lIGV4cGlyZWQuCi0vLwotLy8gIEFyZ3VtZW50czoKLS8vICAgIEFkYXB0ZXIgICAgICAtIFRoZSBwb2ludGVyIHRvIHRoZSBNaW5pcG9ydCBBZGFwdGVyIENvbnRleHQKLS8vCi0vLyAgUmV0dXJuIFZhbHVlOgotLy8gICAgTm9uZQotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci12b2lkIE1UT19UeEZhaWxlZChNVE9fRlVOQ19JTlBVVCkKLXsKLQlyZXR1cm47Ci19Ci0KLWludCBEaXZpZGUoaW50IGEsIGludCBiKQotewotCWlmIChiPT0wKSBiPTE7Ci0JcmV0dXJuIGEvYjsKLX0KLQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9tdG8uaCBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL210by5oCmluZGV4IGY0NzkzNmYuLjBkMzc3NWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL210by5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL210by5oCkBAIC0xMSw2ICsxMSw4IEBACiAjaWZuZGVmIF9fTVRPX0hfXwogI2RlZmluZSBfX01UT19IX18KIAorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKICNkZWZpbmUgTVRPX0RFRkFVTFRfVEhfQ05UICAgICAgICAgICAgICA1CiAjZGVmaW5lIE1UT19ERUZBVUxUX1RIX1NRMyAgICAgICAgICAgICAgMTEyICAvL09MRCBJUyAxMyByZWZlcmVuY2UgSm9oblh1CiAjZGVmaW5lIE1UT19ERUZBVUxUX1RIX0lETEVfU0xPVCAgICAgICAgMTUKQEAgLTEyOSwxNyArMTMxLDE3IEBACiB9IE1UT19QQVJBTUVURVJTLCAqUE1UT19QQVJBTUVURVJTOwogCiAKLSNkZWZpbmUgTVRPX0ZVTkNfSU5QVVQgICAgICAgICAgICAgIFBXQjMyX0FEQVBURVIJQWRhcHRlcgotI2RlZmluZSBNVE9fRlVOQ19JTlBVVF9EQVRBICAgICAgICAgQWRhcHRlcgotI2RlZmluZSBNVE9fREFUQSgpICAgICAgICAgICAgICAgICAgKEFkYXB0ZXItPnNNdG9QYXJhKQotI2RlZmluZSBNVE9fSEFMKCkgICAgICAgICAgICAgICAgICAgKCZBZGFwdGVyLT5zSHdEYXRhKQorI2RlZmluZSBNVE9fRlVOQ19JTlBVVCAgICAgICAgICAgICAgc3RydWN0IHdic29mdF9wcml2ICoJYWRhcHRlcgorI2RlZmluZSBNVE9fRlVOQ19JTlBVVF9EQVRBICAgICAgICAgYWRhcHRlcgorI2RlZmluZSBNVE9fREFUQSgpICAgICAgICAgICAgICAgICAgKGFkYXB0ZXItPnNNdG9QYXJhKQorI2RlZmluZSBNVE9fSEFMKCkgICAgICAgICAgICAgICAgICAgKCZhZGFwdGVyLT5zSHdEYXRhKQogI2RlZmluZSBNVE9fU0VUX1BSRUFNQkxFX1RZUEUoeCkgICAgLy8gMjAwNDA1MTEgVHVyYm8gbWFyayBMTV9QUkVBTUJMRV9UWVBFKCZwY29yZV9kYXRhLT5sbV9kYXRhKSA9ICh4KQotI2RlZmluZSBNVE9fRU5BQkxFCQkJCQkoQWRhcHRlci0+c0xvY2FsUGFyYS5UeFJhdGVNb2RlID09IFJBVEVfQVVUTykKLSNkZWZpbmUgTVRPX1RYUE9XRVJfRlJPTV9FRVBST00JCShBZGFwdGVyLT5zSHdEYXRhLlBvd2VySW5kZXhGcm9tRUVQUk9NKQotI2RlZmluZSBMT0NBTF9BTlRFTk5BX05PKCkJCQkoQWRhcHRlci0+c0xvY2FsUGFyYS5iQW50ZW5uYU5vKQotI2RlZmluZSBMT0NBTF9JU19DT05ORUNURUQoKQkJKEFkYXB0ZXItPnNMb2NhbFBhcmEud0Nvbm5lY3RlZFNUQWluZGV4ICE9IDApCi0jZGVmaW5lIExPQ0FMX0lTX0lCU1NfTU9ERSgpCQkoQWRhcHRlci0+YXNCU1NEZXNjcmlwdEVsZW1lbnRbQWRhcHRlci0+c0xvY2FsUGFyYS53Q29ubmVjdGVkU1RBaW5kZXhdLmJCc3NUeXBlID09IElCU1NfTkVUKQotI2RlZmluZSBNVE9fSU5JVFRYUkFURV9NT0RFCQkJKEFkYXB0ZXItPnNId0RhdGEuU29mdHdhcmVTZXQmMHgyKQkvL2JpdCAxCisjZGVmaW5lIE1UT19FTkFCTEUJCQkJCShhZGFwdGVyLT5zTG9jYWxQYXJhLlR4UmF0ZU1vZGUgPT0gUkFURV9BVVRPKQorI2RlZmluZSBNVE9fVFhQT1dFUl9GUk9NX0VFUFJPTQkJKGFkYXB0ZXItPnNId0RhdGEuUG93ZXJJbmRleEZyb21FRVBST00pCisjZGVmaW5lIExPQ0FMX0FOVEVOTkFfTk8oKQkJCShhZGFwdGVyLT5zTG9jYWxQYXJhLmJBbnRlbm5hTm8pCisjZGVmaW5lIExPQ0FMX0lTX0NPTk5FQ1RFRCgpCQkoYWRhcHRlci0+c0xvY2FsUGFyYS53Q29ubmVjdGVkU1RBaW5kZXggIT0gMCkKKyNkZWZpbmUgTE9DQUxfSVNfSUJTU19NT0RFKCkJCShhZGFwdGVyLT5hc0JTU0Rlc2NyaXB0RWxlbWVudFthZGFwdGVyLT5zTG9jYWxQYXJhLndDb25uZWN0ZWRTVEFpbmRleF0uYkJzc1R5cGUgPT0gSUJTU19ORVQpCisjZGVmaW5lIE1UT19JTklUVFhSQVRFX01PREUJCQkoYWRhcHRlci0+c0h3RGF0YS5Tb2Z0d2FyZVNldCYweDIpCS8vYml0IDEKIC8vIDIwMDQwNTEwIFR1cmJvIGFkZAogI2RlZmluZSBNVE9fVE1SX0NOVCgpICAgICAgICAgICAgICAgTVRPX0RBVEEoKS5UbXJDbnQKICNkZWZpbmUgTVRPX1RPR0dMRV9TVEFURSgpICAgICAgICAgIE1UT19EQVRBKCkuVG9nZ2xlU3RhdGUKQEAgLTE1Nyw3ICsxNTksNyBAQAogI2RlZmluZSBNVE9fVE1SX1BFUklPRElDKCkgICAgICAgICAgTVRPX0RBVEEoKS5UbXJfUGVyaW9kaWMKIAogI2RlZmluZSBNVE9fUE9XRVJfQ0hBTkdFX0VOQUJMRSgpICAgTVRPX0RBVEEoKS5Qb3dlckNoYW5nZUVuYWJsZQotI2RlZmluZSBNVE9fQU5UX0RJVkVSU0lUWV9FTkFCTEUoKSAgQWRhcHRlci0+c0xvY2FsUGFyYS5ib0FudGVubmFEaXZlcnNpdHkKKyNkZWZpbmUgTVRPX0FOVF9ESVZFUlNJVFlfRU5BQkxFKCkgIGFkYXB0ZXItPnNMb2NhbFBhcmEuYm9BbnRlbm5hRGl2ZXJzaXR5CiAjZGVmaW5lIE1UT19BTlRfTUFDKCkgICAgICAgICAgICAgICBNVE9fREFUQSgpLkFudF9tYWMKICNkZWZpbmUgTVRPX0FOVF9ESVZFUlNJVFkoKSAgICAgICAgIE1UT19EQVRBKCkuQW50X2RpdgogI2RlZmluZSBNVE9fQ0NBX01PREUoKSAgICAgICAgICAgICAgTVRPX0RBVEEoKS5DQ0FfTW9kZQpAQCAtMTY2LDcgKzE2OCw2IEBACiAjZGVmaW5lIE1UT19QUkVBTUJMRV9DSEFOR0VfRU5BQkxFKCkgICAgICAgICBNVE9fREFUQSgpLlByZWFtYmxlQ2hhbmdlRW5hYmxlCiAKICNkZWZpbmUgTVRPX1JBVEVfTEVWRUwoKSAgICAgICAgICAgIE1UT19EQVRBKCkuRGF0YVJhdGVMZXZlbAotI2RlZmluZSBNVE9fRkFMTEJBQ0tfUkFURV9MRVZFTCgpCU1UT19EQVRBKCkuRmFsbGJhY2tSYXRlTGV2ZWwKICNkZWZpbmUgTVRPX09GRE1fUkFURV9MRVZFTCgpCQlNVE9fREFUQSgpLk9mZG1SYXRlTGV2ZWwKICNkZWZpbmUgTVRPX1JBVEVfQ0hBTkdFX0VOQUJMRSgpICAgIE1UT19EQVRBKCkuRGF0YVJhdGVDaGFuZ2VFbmFibGUKICNkZWZpbmUgTVRPX0ZSQUdfVEhfTEVWRUwoKSAgICAgICAgIE1UT19EQVRBKCkuRnJhZ1RocmVzaG9sZExldmVsCkBAIC0xOTksMTEgKzIwMCw5IEBACiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiAKLWV4dGVybiB1OCAgIE1UT19EYXRhX1JhdGVfVGJsW107CiBleHRlcm4gdTE2ICBNVE9fRnJhZ19UaF9UYmxbXTsKIAogI2RlZmluZSBNVE9fREFUQV9SQVRFKCkgICAgICAgICAgTVRPX0RhdGFfUmF0ZV9UYmxbTVRPX1JBVEVfTEVWRUwoKV0KLSNkZWZpbmUgTVRPX0RBVEFfRkFMTEJBQ0tfUkFURSgpIE1UT19EYXRhX1JhdGVfVGJsW01UT19GQUxMQkFDS19SQVRFX0xFVkVMKCldCS8vbmV4dCBsZXZlbAogI2RlZmluZSBNVE9fRlJBR19USCgpICAgICAgICAgICAgTVRPX0ZyYWdfVGhfVGJsW01UT19GUkFHX1RIX0xFVkVMKCldCiAKIHR5cGVkZWYgc3RydWN0IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL210b19mLmggYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9tdG9fZi5oCmluZGV4IDMwYjNkZjIuLjgxZjU5MTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL210b19mLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbXRvX2YuaApAQCAtMSw3ICsxLDEzIEBACi1leHRlcm4gdm9pZCBNVE9fSW5pdChQV0IzMl9BREFQVEVSKTsKLWV4dGVybiB2b2lkIE1UT19QZXJpb2RpY1RpbWVyRXhwaXJlZChQV0IzMl9BREFQVEVSKTsKLWV4dGVybiB2b2lkIE1UT19TZXREVE9SYXRlUmFuZ2UoUFdCMzJfQURBUFRFUiwgdTggKiwgdTgpOworI2lmbmRlZiBfX1dJTkJPTkRfTVRPX0ZfSAorI2RlZmluZSBfX1dJTkJPTkRfTVRPX0ZfSAorCisjaW5jbHVkZSAiY29yZS5oIgorCitleHRlcm4gdm9pZCBNVE9fSW5pdChzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKik7CitleHRlcm4gdm9pZCBNVE9fUGVyaW9kaWNUaW1lckV4cGlyZWQoc3RydWN0IHdic29mdF9wcml2ICopOworZXh0ZXJuIHZvaWQgTVRPX1NldERUT1JhdGVSYW5nZShzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKiwgdTggKiwgdTgpOwogZXh0ZXJuIHU4IE1UT19HZXRUeFJhdGUoTVRPX0ZVTkNfSU5QVVQsIHUzMiBmcGR1X2xlbik7CiBleHRlcm4gdTggTVRPX0dldFR4RmFsbGJhY2tSYXRlKE1UT19GVU5DX0lOUFVUKTsKIGV4dGVybiB2b2lkIE1UT19TZXRUeENvdW50KE1UT19GVU5DX0lOUFVULCB1OCB0MCwgdTggaW5kZXgpOwogCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL29zX2NvbW1vbi5oIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvb3NfY29tbW9uLmgKaW5kZXggZTI0ZmY0MS4uMmMyNzZlMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvb3NfY29tbW9uLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvb3NfY29tbW9uLmgKQEAgLTEsMiArMSwyIEBACi0jaW5jbHVkZSAibGludXgvc3lzZGVmLmgiCisjaW5jbHVkZSAic3lzZGVmLmgiCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3BoeV9jYWxpYnJhdGlvbi5jIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvcGh5X2NhbGlicmF0aW9uLmMKaW5kZXggMjcyYTY1MC4uNjc4MjU1MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvcGh5X2NhbGlicmF0aW9uLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvcGh5X2NhbGlicmF0aW9uLmMKQEAgLTEyLDYgKzEyLDcgQEAKIC8qKioqKioqKioqKioqKioqKiogSU5DTFVERSBGSUxFUyBTRUNUSU9OICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogI2luY2x1ZGUgIm9zX2NvbW1vbi5oIgogI2luY2x1ZGUgInBoeV9jYWxpYnJhdGlvbi5oIgorI2luY2x1ZGUgIndiaGFsX2YuaCIKIAogCiAvKioqKioqKioqKioqKioqKioqIERFQlVHIENPTlNUQU5UIEFORCBNQUNSTyBTRUNUSU9OICoqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTQzMSw3ICs0MzIsNiBAQAogCiAJdmFsIHw9IE1BU0tfQURDX0RDX0NBTF9TVFI7CiAJaHdfc2V0X2R4eF9yZWcocGh3X2RhdGEsIFJFR19NT0RFX0NUUkwsIHZhbCk7Ci0JcGFfc3RhbGxfZXhlY3V0aW9uKFVTKTsgLy8gKk1VU1QqIHdhaXQgZm9yIGEgd2hpbGUKIAogCS8vIGUuIFRoZSByZXN1bHQgYXJlIHNob3duIGluICJhZGNfZGNfY2FsX2lbODowXSBhbmQgYWRjX2RjX2NhbF9xWzg6MF0iCiAjaWZkZWYgX0RFQlVHCkBAIC01MjIsNyArNTIyLDYgQEAKIAlyZWdfbW9kZV9jdHJsIHw9IChNQVNLX0NBTElCX1NUQVJUfDJ8KDI8PDIpKTsKIAlod19zZXRfZHh4X3JlZyhwaHdfZGF0YSwgUkVHX01PREVfQ1RSTCwgcmVnX21vZGVfY3RybCk7CiAJUEhZX0RFQlVHKCgiW0NBTF0gICAgTU9ERV9DVFJMICh3cml0ZSkgPSAweCUwOFhcbiIsIHJlZ19tb2RlX2N0cmwpKTsKLQlwYV9zdGFsbF9leGVjdXRpb24oVVMpOwogCiAJaHdfZ2V0X2R4eF9yZWcocGh3X2RhdGEsIDB4NUMsICZyZWdfZGNfY2FuY2VsKTsKIAlQSFlfREVCVUcoKCJbQ0FMXSAgICBEQ19DQU5DRUwgKHJlYWQpID0gMHglMDhYXG4iLCByZWdfZGNfY2FuY2VsKSk7CkBAIC01MzYsNyArNTM1LDYgQEAKIAkJcmVnX2RjX2NhbmNlbCAmPSB+KDB4MDNGRik7CiAJCVBIWV9ERUJVRygoIltDQUxdICAgIERDX0NBTkNFTCAod3JpdGUpID0gMHglMDhYXG4iLCByZWdfZGNfY2FuY2VsKSk7CiAJCWh3X3NldF9keHhfcmVnKHBod19kYXRhLCAweDVDLCByZWdfZGNfY2FuY2VsKTsKLQkJcGFfc3RhbGxfZXhlY3V0aW9uKFVTKTsKIAogCQlod19nZXRfZHh4X3JlZyhwaHdfZGF0YSwgUkVHX0NBTElCX1JFQUQyLCAmdmFsKTsKIAkJUEhZX0RFQlVHKCgiW0NBTF0gICAgQ0FMSUJfUkVBRDIgPSAweCUwOFhcbiIsIHZhbCkpOwpAQCAtNTUyLDcgKzU1MCw2IEBACiAJCXJlZ19kY19jYW5jZWwgfD0gKDEgPDwgQ0FOQ0VMX0RDX0lfU0hJRlQpOwogCQlQSFlfREVCVUcoKCJbQ0FMXSAgICBEQ19DQU5DRUwgKHdyaXRlKSA9IDB4JTA4WFxuIiwgcmVnX2RjX2NhbmNlbCkpOwogCQlod19zZXRfZHh4X3JlZyhwaHdfZGF0YSwgMHg1QywgcmVnX2RjX2NhbmNlbCk7Ci0JCXBhX3N0YWxsX2V4ZWN1dGlvbihVUyk7CiAKIAkJaHdfZ2V0X2R4eF9yZWcocGh3X2RhdGEsIFJFR19DQUxJQl9SRUFEMiwgJnZhbCk7CiAJCVBIWV9ERUJVRygoIltDQUxdICAgIENBTElCX1JFQUQyID0gMHglMDhYXG4iLCB2YWwpKTsKQEAgLTYwMCw3ICs1OTcsNiBAQAogCXJlZ19tb2RlX2N0cmwgJj0gfk1BU0tfQ0FMSUJfU1RBUlQ7CiAJaHdfc2V0X2R4eF9yZWcocGh3X2RhdGEsIFJFR19NT0RFX0NUUkwsIHJlZ19tb2RlX2N0cmwpOwogCVBIWV9ERUJVRygoIltDQUxdICAgIE1PREVfQ1RSTCAod3JpdGUpID0gMHglMDhYXG4iLCByZWdfbW9kZV9jdHJsKSk7Ci0JcGFfc3RhbGxfZXhlY3V0aW9uKFVTKTsKIH0KIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwpAQCAtNjUxLDcgKzY0Nyw2IEBACiAJcmVnX21vZGVfY3RybCB8PSAoTUFTS19DQUxJQl9TVEFSVHwzKTsKIAlod19zZXRfZHh4X3JlZyhwaHdfZGF0YSwgUkVHX01PREVfQ1RSTCwgcmVnX21vZGVfY3RybCk7CiAJUEhZX0RFQlVHKCgiW0NBTF0gICAgTU9ERV9DVFJMICh3cml0ZSkgPSAweCUwOFhcbiIsIHJlZ19tb2RlX2N0cmwpKTsKLQlwYV9zdGFsbF9leGVjdXRpb24oVVMpOwogCiAJaHdfZ2V0X2R4eF9yZWcocGh3X2RhdGEsIDB4NUMsICZyZWdfZGNfY2FuY2VsKTsKIAlQSFlfREVCVUcoKCJbQ0FMXSAgICBEQ19DQU5DRUwgKHJlYWQpID0gMHglMDhYXG4iLCByZWdfZGNfY2FuY2VsKSk7CkBAIC02NjUsMTEgKzY2MCw5IEBACiAJCXJlZ19kY19jYW5jZWwgJj0gfigweDAwMUYpOwogCQlQSFlfREVCVUcoKCJbQ0FMXSAgICBEQ19DQU5DRUwgKHdyaXRlKSA9IDB4JTA4WFxuIiwgcmVnX2RjX2NhbmNlbCkpOwogCQlod19zZXRfZHh4X3JlZyhwaHdfZGF0YSwgMHg1QywgcmVnX2RjX2NhbmNlbCk7Ci0JCXBhX3N0YWxsX2V4ZWN1dGlvbihVUyk7CiAKIAkJaHdfZ2V0X2R4eF9yZWcocGh3X2RhdGEsIFJFR19DQUxJQl9SRUFEMiwgJnZhbCk7CiAJCVBIWV9ERUJVRygoIltDQUxdICAgIENBTElCX1JFQUQyID0gMHglMDhYXG4iLCB2YWwpKTsKLQkJcGFfc3RhbGxfZXhlY3V0aW9uKFVTKTsKIAogCQlpcWNhbF9pbWFnZV9pID0gX3MxM190b19zMzIodmFsICYgMHgwMDAwMUZGRik7CiAJCWlxY2FsX2ltYWdlX3EgPSBfczEzX3RvX3MzMigodmFsICYgMHgwM0ZGRTAwMCkgPj4gMTMpOwpAQCAtNjgyLDExICs2NzUsOSBAQAogCQlyZWdfZGNfY2FuY2VsIHw9ICgxIDw8IENBTkNFTF9EQ19RX1NISUZUKTsKIAkJUEhZX0RFQlVHKCgiW0NBTF0gICAgRENfQ0FOQ0VMICh3cml0ZSkgPSAweCUwOFhcbiIsIHJlZ19kY19jYW5jZWwpKTsKIAkJaHdfc2V0X2R4eF9yZWcocGh3X2RhdGEsIDB4NUMsIHJlZ19kY19jYW5jZWwpOwotCQlwYV9zdGFsbF9leGVjdXRpb24oVVMpOwogCiAJCWh3X2dldF9keHhfcmVnKHBod19kYXRhLCBSRUdfQ0FMSUJfUkVBRDIsICZ2YWwpOwogCQlQSFlfREVCVUcoKCJbQ0FMXSAgICBDQUxJQl9SRUFEMiA9IDB4JTA4WFxuIiwgdmFsKSk7Ci0JCXBhX3N0YWxsX2V4ZWN1dGlvbihVUyk7CiAKIAkJaXFjYWxfaW1hZ2VfaSA9IF9zMTNfdG9fczMyKHZhbCAmIDB4MDAwMDFGRkYpOwogCQlpcWNhbF9pbWFnZV9xID0gX3MxM190b19zMzIoKHZhbCAmIDB4MDNGRkUwMDApID4+IDEzKTsKQEAgLTczMiw3ICs3MjMsNiBAQAogCXJlZ19tb2RlX2N0cmwgJj0gfk1BU0tfQ0FMSUJfU1RBUlQ7CiAJaHdfc2V0X2R4eF9yZWcocGh3X2RhdGEsIFJFR19NT0RFX0NUUkwsIHJlZ19tb2RlX2N0cmwpOwogCVBIWV9ERUJVRygoIltDQUxdICAgIE1PREVfQ1RSTCAod3JpdGUpID0gMHglMDhYXG4iLCByZWdfbW9kZV9jdHJsKSk7Ci0JcGFfc3RhbGxfZXhlY3V0aW9uKFVTKTsKIH0KIAogLy8yMDA2MDYxMi4xLmEgMjAwNjA3MTguMSBNb2RpZnkKQEAgLTc5MiwxMiArNzgyLDEwIEBACiAJCQlyZWdfbW9kZV9jdHJsIHw9IChNQVNLX0NBTElCX1NUQVJUfDB4MDJ8Mjw8Mik7CiAJCQlod19zZXRfZHh4X3JlZyhwaHdfZGF0YSwgUkVHX01PREVfQ1RSTCwgcmVnX21vZGVfY3RybCk7CiAJCQlQSFlfREVCVUcoKCJbQ0FMXSAgICBNT0RFX0NUUkwgKHdyaXRlKSA9IDB4JTA4WFxuIiwgcmVnX21vZGVfY3RybCkpOwotCQkJcGFfc3RhbGxfZXhlY3V0aW9uKFVTKTsKIAogCQkJLy8gYi4KIAkJCWh3X2dldF9keHhfcmVnKHBod19kYXRhLCBSRUdfQ0FMSUJfUkVBRDEsICZ2YWwpOwogCQkJUEhZX0RFQlVHKCgiW0NBTF0gICAgQ0FMSUJfUkVBRDEgPSAweCUwOFhcbiIsIHZhbCkpOwotCQkJcGFfc3RhbGxfZXhlY3V0aW9uKFVTKTsKIAogCQkJaXFjYWxfdG9uZV9pMCA9IF9zMTNfdG9fczMyKHZhbCAmIDB4MDAwMDFGRkYpOwogCQkJaXFjYWxfdG9uZV9xMCA9IF9zMTNfdG9fczMyKCh2YWwgJiAweDAzRkZFMDAwKSA+PiAxMyk7CkBAIC04MTMsNyArODAxLDYgQEAKIAkJCXJlZ19tb2RlX2N0cmwgJj0gfk1BU0tfQ0FMSUJfU1RBUlQ7CiAJCQlod19zZXRfZHh4X3JlZyhwaHdfZGF0YSwgUkVHX01PREVfQ1RSTCwgcmVnX21vZGVfY3RybCk7CiAJCQlQSFlfREVCVUcoKCJbQ0FMXSAgICBNT0RFX0NUUkwgKHdyaXRlKSA9IDB4JTA4WFxuIiwgcmVnX21vZGVfY3RybCkpOwotCQkJcGFfc3RhbGxfZXhlY3V0aW9uKFVTKTsKIAogCQkJLy8gZC4gU2V0IGlxY2FsX21vZGVbMTowXSB0byAweDMgYW5kIHNldCAiY2FsaWJfc3RhcnQiIHRvIDB4MSB0bwogCQkJLy8gICAgZW5hYmxlICJJUSBhbGlicmF0aW9uIE1vZGUgSUkiCkBAIC04MjMsMTIgKzgxMCwxMCBAQAogCQkJcmVnX21vZGVfY3RybCB8PSAoTUFTS19DQUxJQl9TVEFSVHwweDAzKTsKIAkJCWh3X3NldF9keHhfcmVnKHBod19kYXRhLCBSRUdfTU9ERV9DVFJMLCByZWdfbW9kZV9jdHJsKTsKIAkJCVBIWV9ERUJVRygoIltDQUxdICAgIE1PREVfQ1RSTCAod3JpdGUpID0gMHglMDhYXG4iLCByZWdfbW9kZV9jdHJsKSk7Ci0JCQlwYV9zdGFsbF9leGVjdXRpb24oVVMpOwogCiAJCQkvLyBlLgogCQkJaHdfZ2V0X2R4eF9yZWcocGh3X2RhdGEsIFJFR19DQUxJQl9SRUFEMSwgJnZhbCk7CiAJCQlQSFlfREVCVUcoKCJbQ0FMXSAgICBDQUxJQl9SRUFEMSA9IDB4JTA4WFxuIiwgdmFsKSk7Ci0JCQlwYV9zdGFsbF9leGVjdXRpb24oVVMpOwogCiAJCQlpcWNhbF90b25lX2kgPSBfczEzX3RvX3MzMih2YWwgJiAweDAwMDAxRkZGKTsKIAkJCWlxY2FsX3RvbmVfcSA9IF9zMTNfdG9fczMyKCh2YWwgJiAweDAzRkZFMDAwKSA+PiAxMyk7CkBAIC0xMDc1LDcgKzEwNjAsNyBAQAogCS8vOyBbQkItY2hpcF06IENhbGlicmF0aW9uICg2aCkuIENhY3VsYXRlIFRYLXBhdGggSVEgaW1iYWxhbmNlIGFuZCBzZXR0aW5nIFRYIHBhdGggSVEgY29tcGVuc2F0aW9uIHRhYmxlCiAJLy9waHlfc2V0X3JmX2RhdGEocGh3X2RhdGEsIDMsICgzPDwyNCl8MHgwMjU1ODYpOwogCi0JT1NfU0xFRVAoMzAwMDApOyAvLyAyMDA2MDYxMi4xLmEgMzBtcyBkZWxheS4gQWRkIHRoZSBmb2xsb3cgMiBsaW5lcworCW1zbGVlcCgzMCk7IC8vIDIwMDYwNjEyLjEuYSAzMG1zIGRlbGF5LiBBZGQgdGhlIGZvbGxvdyAyIGxpbmVzCiAJLy9UbyBhZGp1c3QgVFhWR0EgdG8gZml0IGlxX21hZ18wIHJhbmdlIGZyb20gMTI1MCB+IDE3NTAKIAlhZGp1c3RfVFhWR0FfZm9yX2lxX21hZyggcGh3X2RhdGEgKTsKIApAQCAtMTI4MiwxMyArMTI2NywxMSBAQAogCQlpZiggIWh3X3NldF9keHhfcmVnKHBod19kYXRhLCBSRUdfTU9ERV9DVFJMLCByZWdfbW9kZV9jdHJsKSApLy8yMDA2MDcxOC4xIG1vZGlmeQogCQkJcmV0dXJuIDA7CiAJCVBIWV9ERUJVRygoIltDQUxdICAgIE1PREVfQ1RSTCAod3JpdGUpID0gMHglMDhYXG4iLCByZWdfbW9kZV9jdHJsKSk7Ci0JCXBhX3N0YWxsX2V4ZWN1dGlvbihVUyk7CiAKIAkJcmVnX21vZGVfY3RybCAmPSB+TUFTS19JUUNBTF9NT0RFOwogCQlyZWdfbW9kZV9jdHJsIHw9IChNQVNLX0NBTElCX1NUQVJUfDB4MSk7CiAJCWh3X3NldF9keHhfcmVnKHBod19kYXRhLCBSRUdfTU9ERV9DVFJMLCByZWdfbW9kZV9jdHJsKTsKIAkJUEhZX0RFQlVHKCgiW0NBTF0gICAgTU9ERV9DVFJMICh3cml0ZSkgPSAweCUwOFhcbiIsIHJlZ19tb2RlX2N0cmwpKTsKLQkJcGFfc3RhbGxfZXhlY3V0aW9uKFVTKTsgIC8vU2hvdWxkIGJlIHJlYWQgb3V0IGFmdGVyIDQ1MHVzCiAKIAkJLy8gYy4KIAkJaHdfZ2V0X2R4eF9yZWcocGh3X2RhdGEsIFJFR19DQUxJQl9SRUFEMSwgJnZhbCk7CkBAIC0xNjk3LDExICsxNjgwLDEwIEBACiAJCXBoeV9zZXRfcmZfZGF0YShwaHdfZGF0YSwgNSwgKCg1PDwyNCl8Y3VycmVudF90eHZnYSkgKTsKIAkJcGh3X2RhdGEtPnR4dmdhX3NldHRpbmdfZm9yX2NhbCA9IGN1cnJlbnRfdHh2Z2E7CiAKLQkJLy9wYV9zdGFsbF9leGVjdXRpb24oMzAwMDApOy8vU2xlZXAoMzApOwotCQlPU19TTEVFUCgzMDAwMCk7IC8vIDIwMDYwNjEyLjEuYQorCQltc2xlZXAoMzApOyAvLyAyMDA2MDYxMi4xLmEKIAogCQlpZiggIWh3X2dldF9keHhfcmVnKHBod19kYXRhLCBSRUdfTU9ERV9DVFJMLCAmcmVnX21vZGVfY3RybCkgKSAvLyAyMDA2MDcxOC4xIG1vZGlmeQotCQkJcmV0dXJuIEZBTFNFOworCQkJcmV0dXJuIGZhbHNlOwogCiAJCVBIWV9ERUJVRygoIltDQUxdICAgIE1PREVfQ1RSTCAocmVhZCkgPSAweCUwOFhcbiIsIHJlZ19tb2RlX2N0cmwpKTsKIApAQCAtMTcxNCwxOSArMTY5NiwxNSBAQAogCQlod19zZXRfZHh4X3JlZyhwaHdfZGF0YSwgUkVHX01PREVfQ1RSTCwgcmVnX21vZGVfY3RybCk7CiAJCVBIWV9ERUJVRygoIltDQUxdICAgIE1PREVfQ1RSTCAod3JpdGUpID0gMHglMDhYXG4iLCByZWdfbW9kZV9jdHJsKSk7CiAKLQkJLy9wYV9zdGFsbF9leGVjdXRpb24oVVMpOwotCQlPU19TTEVFUCgxKTsgLy8gMjAwNjA2MTIuMS5hCisJCXVkZWxheSgxKTsgLy8gMjAwNjA2MTIuMS5hCiAKLQkJLy9wYV9zdGFsbF9leGVjdXRpb24oMzAwKTsvL1NsZWVwKDMwKTsKLQkJT1NfU0xFRVAoMzAwKTsgLy8gMjAwNjA2MTIuMS5hCisJCXVkZWxheSgzMDApOyAvLyAyMDA2MDYxMi4xLmEKIAogCQkvLyBiLgogCQlod19nZXRfZHh4X3JlZyhwaHdfZGF0YSwgUkVHX0NBTElCX1JFQUQxLCAmdmFsKTsKIAogCQlQSFlfREVCVUcoKCJbQ0FMXSAgICBDQUxJQl9SRUFEMSA9IDB4JTA4WFxuIiwgdmFsKSk7Ci0JCS8vcGFfc3RhbGxfZXhlY3V0aW9uKFVTKTsKLQkJLy9wYV9zdGFsbF9leGVjdXRpb24oMzAwKTsvL1NsZWVwKDMwKTsKLQkJT1NfU0xFRVAoMzAwKTsgLy8gMjAwNjA2MTIuMS5hCisJCXVkZWxheSgzMDApOyAvLyAyMDA2MDYxMi4xLmEKIAogCQlpcWNhbF90b25lX2kwID0gX3MxM190b19zMzIodmFsICYgMHgwMDAwMUZGRik7CiAJCWlxY2FsX3RvbmVfcTAgPSBfczEzX3RvX3MzMigodmFsICYgMHgwM0ZGRTAwMCkgPj4gMTMpOwpAQCAtMTc1MCw5ICsxNzI4LDkgQEAKIAl9CiAKIAlpZiggaXFfbWFnXzBfdHg+PTcwMCAmJiBpcV9tYWdfMF90eDw9MTc1MCApCi0JCXJldHVybiBUUlVFOworCQlyZXR1cm4gdHJ1ZTsKIAllbHNlCi0JCXJldHVybiBGQUxTRTsKKwkJcmV0dXJuIGZhbHNlOwogfQogCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3BoeV9jYWxpYnJhdGlvbi5oIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvcGh5X2NhbGlicmF0aW9uLmgKaW5kZXggYjZhNjVkMy4uMDNiODIwYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvcGh5X2NhbGlicmF0aW9uLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvcGh5X2NhbGlicmF0aW9uLmgKQEAgLTEsMyArMSw4IEBACisjaWZuZGVmIF9fV0lOQk9ORF9QSFlfQ0FMSUJSQVRJT05fSAorI2RlZmluZSBfX1dJTkJPTkRfUEhZX0NBTElCUkFUSU9OX0gKKworI2luY2x1ZGUgIndiaGFsX2YuaCIKKwogLy8gMjAwMzEyMjkgVHVyYm8gYWRkCiAjZGVmaW5lIFJFR19BR0NfQ1RSTDEgICAgICAgICAgICAgICAweDEwMDAKICNkZWZpbmUgUkVHX0FHQ19DVFJMMiAgICAgICAgICAgICAgIDB4MTAwNApAQCAtOTksMyArMTA0LDQgQEAKIHZvaWQgcGh5X3NldF9yZl9kYXRhKCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgdTMyIGluZGV4LCAgdTMyIHZhbHVlICk7CiAjZGVmaW5lIHBoeV9pbml0X3JmKCBfQSApCS8vUkZTeW50aGVzaXplcl9pbml0aWFsKCBfQSApCiAKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvcmVnLmMgYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9yZWcuYwppbmRleCA1N2FmNWI4Li5jZDIxMjcyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9yZWcuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9yZWcuYwpAQCAtMSw0ICsxLDUgQEAKICNpbmNsdWRlICJvc19jb21tb24uaCIKKyNpbmNsdWRlICJ3YmhhbF9mLmgiCiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogLy8gT3JpZ2luYWwgUGh5LmgKQEAgLTk3Niw5ICs5NzcsOSBAQAogCiAJCS8vIDIwMDYwNTExLjEgRml4IHRoZSBmb2xsb3dpbmcgNCBzdGVwcyBmb3IgUnggb2YgUkYgMjIzMCBpbml0aWFsIGZhaWwKIAkJV2IzNVJlZ19Xcml0ZVN5bmMoIHBId0RhdGEsIDB4MDNkNCwgMHg4MCApOy8vIHJlZ3VsYXRvciBvbiBvbmx5Ci0JCU9TX1NMRUVQKDEwMDAwKTsgLy8gTW9kaWZ5IDIwMDUxMjIxLjEuYgorCQltc2xlZXAoMTApOyAvLyBNb2RpZnkgMjAwNTEyMjEuMS5iCiAJCVdiMzVSZWdfV3JpdGVTeW5jKCBwSHdEYXRhLCAweDAzZDQsIDB4YjggKTsvLyBSRUdfT04gUkZfUlNUTiBvbiwgYW5kCi0JCU9TX1NMRUVQKDEwMDAwKTsgLy8gTW9kaWZ5IDIwMDUxMjIxLjEuYgorCQltc2xlZXAoMTApOyAvLyBNb2RpZnkgMjAwNTEyMjEuMS5iCiAKIAkJbHRtcCA9IDB4NDk2ODsKIAkJaWYoIChwSHdEYXRhLT5waHlfdHlwZSA9PSBSRl9XQl8yNDIpIHx8CkBAIC05ODgsMTIgKzk4OSwxMiBAQAogCiAJCVdiMzVSZWdfV3JpdGVTeW5jKCBwSHdEYXRhLCAweDAzZDQsIDB4YTAgKTsvLyBQTExfUEQgUkVGX1BEIHNldCB0byAwCiAKLQkJT1NfU0xFRVAoMjAwMDApOyAvLyBNb2RpZnkgMjAwNTEyMjEuMS5iCisJCW1zbGVlcCgyMCk7IC8vIE1vZGlmeSAyMDA1MTIyMS4xLmIKIAkJV2IzNVJlZ19SZWFkU3luYyggcEh3RGF0YSwgMHgwM2QwLCAmbHRtcCApOwogCQlsb29wID0gNTAwOyAvLyBXYWl0IGZvciA1IHNlY29uZCAyMDA2MTEwMQogCQl3aGlsZSggIShsdG1wICYgMHgyMCkgJiYgbG9vcC0tICkKIAkJewotCQkJT1NfU0xFRVAoMTAwMDApOyAvLyBNb2RpZnkgMjAwNTEyMjEuMS5iCisJCQltc2xlZXAoMTApOyAvLyBNb2RpZnkgMjAwNTEyMjEuMS5iCiAJCQlpZiggIVdiMzVSZWdfUmVhZFN5bmMoIHBId0RhdGEsIDB4MDNkMCwgJmx0bXAgKSApCiAJCQkJYnJlYWs7CiAJCX0KQEAgLTEwMDIsNyArMTAwMyw3IEBACiAJfQogCiAJV2IzNVJlZ19Xcml0ZVN5bmMoIHBId0RhdGEsIDB4MDNiMCwgMSApOy8vIFJlc2V0IGhhcmR3YXJlIGZpcnN0Ci0JT1NfU0xFRVAoMTAwMDApOyAvLyBBZGQgdGhpcyAyMDA1MTIyMS4xLmIKKwltc2xlZXAoMTApOyAvLyBBZGQgdGhpcyAyMDA1MTIyMS4xLmIKIAogCS8vIFNldCBidXJzdCB3cml0ZSBkZWxheQogCVdiMzVSZWdfV3JpdGVTeW5jKCBwSHdEYXRhLCAweDAzZjgsIDB4N2ZmICk7CkBAIC0xMTY3LDIzICsxMTY4LDIzIEBACiAJCQkvLyAyMDA2MDUxMS4xIC0tLSBNb2RpZnlpbmcgdGhlIGZvbGxvdyBzdGVwIGZvciBSeCBpc3N1ZS0tLS0tLS0tLS0tLS0tLS0tCiAJCQlsdG1wID0gKDEgPDwgMzEpIHwgKDAgPDwgMzApIHwgKDIwIDw8IDI0KSB8IEJpdFJldmVyc2UoICgweDA3PDwyMCl8MHhFMTY4RSwgMjApOwogCQkJV2IzNVJlZ19Xcml0ZVN5bmMoIHBId0RhdGEsIDB4MDg2NCwgbHRtcCApOwotCQkJT1NfU0xFRVAoMTAwMDApOworCQkJbXNsZWVwKDEwKTsKIAkJCWx0bXAgPSAoMSA8PCAzMSkgfCAoMCA8PCAzMCkgfCAoMjAgPDwgMjQpIHwgQml0UmV2ZXJzZSggYWwyMjMwX3JmX2RhdGFbN10sIDIwKTsKIAkJCVdiMzVSZWdfV3JpdGVTeW5jKCBwSHdEYXRhLCAweDA4NjQsIGx0bXAgKTsKLQkJCU9TX1NMRUVQKDEwMDAwKTsKKwkJCW1zbGVlcCgxMCk7CiAKIAkJY2FzZSBSRl9BSVJPSEFfMjIzMFM6IC8vIDIwMDYwNDIwIEFkZCB0aGlzCiAKIAkJCS8vIDIwMDYwNTExLjEgLS0tIE1vZGlmeWluZyB0aGUgZm9sbG93IHN0ZXAgZm9yIFJ4IGlzc3VlLS0tLS0tLS0tLS0tLS0tLS0KIAkJCVdiMzVSZWdfV3JpdGVTeW5jKCBwSHdEYXRhLCAweDAzZDQsIDB4ODAgKTsvLyByZWd1bGF0b3Igb24gb25seQotCQkJT1NfU0xFRVAoMTAwMDApOyAvLyBNb2RpZnkgMjAwNTEyMjEuMS5iCisJCQltc2xlZXAoMTApOyAvLyBNb2RpZnkgMjAwNTEyMjEuMS5iCiAKIAkJCVdiMzVSZWdfV3JpdGVTeW5jKCBwSHdEYXRhLCAweDAzZDQsIDB4YTAgKTsvLyBQTExfUEQgUkVGX1BEIHNldCB0byAwCi0JCQlPU19TTEVFUCgxMDAwMCk7IC8vIE1vZGlmeSAyMDA1MTIyMS4xLmIKKwkJCW1zbGVlcCgxMCk7IC8vIE1vZGlmeSAyMDA1MTIyMS4xLmIKIAogCQkJV2IzNVJlZ19Xcml0ZVN5bmMoIHBId0RhdGEsIDB4MDNkNCwgMHhlMCApOy8vIE1MS19FTgogCQkJV2IzNVJlZ19Xcml0ZVN5bmMoIHBId0RhdGEsIDB4MDNiMCwgMSApOy8vIFJlc2V0IGhhcmR3YXJlIGZpcnN0Ci0JCQlPU19TTEVFUCgxMDAwMCk7IC8vIEFkZCB0aGlzIDIwMDUxMjIxLjEuYgorCQkJbXNsZWVwKDEwKTsgLy8gQWRkIHRoaXMgMjAwNTEyMjEuMS5iCiAJCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiAJCQkvLyBUaGUgZm9sbG93IGNvZGUgZG9lc24ndCB1c2UgdGhlIGJ1cnN0LXdyaXRlIG1vZGUKQEAgLTExOTEsMzAgKzExOTIsMzAgQEAKIAkJCWx0bXAgPSAoMSA8PCAzMSkgfCAoMCA8PCAzMCkgfCAoMjAgPDwgMjQpIHwgQml0UmV2ZXJzZSggKDB4MEY8PDIwKSB8IDB4RjAxQTAsIDIwKTsKIAkJCVdiMzVSZWdfV3JpdGVTeW5jKCBwSHdEYXRhLCAweDA4NjQsIGx0bXAgKTsKIAotCQkJbHRtcCA9IHBId0RhdGEtPldiMzVSZWcuQkI1QyAmIDB4ZmZmZmYwMDA7CisJCQlsdG1wID0gcEh3RGF0YS0+cmVnLkJCNUMgJiAweGZmZmZmMDAwOwogCQkJV2IzNVJlZ19Xcml0ZVN5bmMoIHBId0RhdGEsIDB4MTA1YywgbHRtcCApOwotCQkJcEh3RGF0YS0+V2IzNVJlZy5CQjUwIHw9IDB4MTM7Ly8oTUFTS19JUUNBTF9NT0RFfE1BU0tfQ0FMSUJfU1RBUlQpOy8vMjAwNjAzMTUuMSBtb2RpZnkKLSAgICAgICAgCVdiMzVSZWdfV3JpdGVTeW5jKCBwSHdEYXRhLCAweDEwNTAsIHBId0RhdGEtPldiMzVSZWcuQkI1MCk7Ci0JCQlPU19TTEVFUCg1MDAwKTsKKwkJCXBId0RhdGEtPnJlZy5CQjUwIHw9IDB4MTM7Ly8oTUFTS19JUUNBTF9NT0RFfE1BU0tfQ0FMSUJfU1RBUlQpOy8vMjAwNjAzMTUuMSBtb2RpZnkKKwkgICAgICAgIAlXYjM1UmVnX1dyaXRlU3luYyhwSHdEYXRhLCAweDEwNTAsIHBId0RhdGEtPnJlZy5CQjUwKTsKKwkJCW1zbGVlcCg1KTsKIAogCQkJLy9waHlfc2V0X3JmX2RhdGEocGh3X2RhdGEsIDB4MEYsICgweDBGPDwyMCkgfCAweEYwMUIwKTsgLy9BY3RpdmF0ZSBGaWx0ZXIgQ2FsLgogCQkJbHRtcCA9ICgxIDw8IDMxKSB8ICgwIDw8IDMwKSB8ICgyMCA8PCAyNCkgfCBCaXRSZXZlcnNlKCAoMHgwRjw8MjApIHwgMHhGMDFCMCwgMjApOwogCQkJV2IzNVJlZ19Xcml0ZVN5bmMoIHBId0RhdGEsIDB4MDg2NCwgbHRtcCApOwotCQkJT1NfU0xFRVAoNTAwMCk7CisJCQltc2xlZXAoNSk7CiAKIAkJCS8vcGh5X3NldF9yZl9kYXRhKHBod19kYXRhLCAweDBGLCAoMHgwRjw8MjApIHwgMHhGMDFlMCk7IC8vQWN0aXZhdGUgVFggRENDCiAJCQlsdG1wID0gKDEgPDwgMzEpIHwgKDAgPDwgMzApIHwgKDIwIDw8IDI0KSB8IEJpdFJldmVyc2UoICgweDBGPDwyMCkgfCAweEYwMUUwLCAyMCk7CiAJCQlXYjM1UmVnX1dyaXRlU3luYyggcEh3RGF0YSwgMHgwODY0LCBsdG1wICk7Ci0JCQlPU19TTEVFUCg1MDAwKTsKKwkJCW1zbGVlcCg1KTsKIAogCQkJLy9waHlfc2V0X3JmX2RhdGEocGh3X2RhdGEsIDB4MEYsICgweDBGPDwyMCkgfCAweEYwMUEwKTsgLy9SZXNvdHJlIEluaXRpYWwgU2V0dGluZwogCQkJbHRtcCA9ICgxIDw8IDMxKSB8ICgwIDw8IDMwKSB8ICgyMCA8PCAyNCkgfCBCaXRSZXZlcnNlKCAoMHgwRjw8MjApIHwgMHhGMDFBMCwgMjApOwogCQkJV2IzNVJlZ19Xcml0ZVN5bmMoIHBId0RhdGEsIDB4MDg2NCwgbHRtcCApOwogCiAvLwkJCS8vRm9yY2UgVFhJKFEpUChOKSB0byBub3JtYWwgY29udHJvbAotCQkJV2IzNVJlZ19Xcml0ZVN5bmMoIHBId0RhdGEsIDB4MTA1YywgcEh3RGF0YS0+V2IzNVJlZy5CQjVDICk7Ci0JCQlwSHdEYXRhLT5XYjM1UmVnLkJCNTAgJj0gfjB4MTM7Ly8oTUFTS19JUUNBTF9NT0RFfE1BU0tfQ0FMSUJfU1RBUlQpOwotICAgICAgICAJV2IzNVJlZ19Xcml0ZVN5bmMoIHBId0RhdGEsIDB4MTA1MCwgcEh3RGF0YS0+V2IzNVJlZy5CQjUwKTsKKwkJCVdiMzVSZWdfV3JpdGVTeW5jKCBwSHdEYXRhLCAweDEwNWMsIHBId0RhdGEtPnJlZy5CQjVDICk7CisJCQlwSHdEYXRhLT5yZWcuQkI1MCAmPSB+MHgxMzsvLyhNQVNLX0lRQ0FMX01PREV8TUFTS19DQUxJQl9TVEFSVCk7CisgICAgICAgIAlXYjM1UmVnX1dyaXRlU3luYyggcEh3RGF0YSwgMHgxMDUwLCBwSHdEYXRhLT5yZWcuQkI1MCk7CiAJCQlicmVhazsKIAogCQljYXNlIFJGX0FJUk9IQV83MjMwOgpAQCAtMTIyOSwxNiArMTIzMCwxNiBAQAogCQkJLy8yLjRHSHoKIAkJCS8vbHRtcCA9ICgxIDw8IDMxKSB8ICgwIDw8IDMwKSB8ICgyNCA8PCAyNCkgfCAweDFBQkE4RjsKIAkJCS8vV2IzNVJlZ19Xcml0ZVN5bmMgcEh3RGF0YSwgMHgwODY0LCBsdG1wICk7Ci0JCQkvL09TX1NMRUVQKDEwMDApOyAvLyBTbGVlcCAxIG1zCisJCQkvL21zbGVlcCgxKTsgLy8gU2xlZXAgMSBtcwogCQkJbHRtcCA9ICgxIDw8IDMxKSB8ICgwIDw8IDMwKSB8ICgyNCA8PCAyNCkgfCAweDlBQkE4RjsKIAkJCVdiMzVSZWdfV3JpdGVTeW5jKCBwSHdEYXRhLCAweDA4NjQsIGx0bXAgKTsKLQkJCU9TX1NMRUVQKDUwMDApOworCQkJbXNsZWVwKDUpOwogCQkJbHRtcCA9ICgxIDw8IDMxKSB8ICgwIDw8IDMwKSB8ICgyNCA8PCAyNCkgfCAweDNBQkE4RjsKIAkJCVdiMzVSZWdfV3JpdGVTeW5jKCBwSHdEYXRhLCAweDA4NjQsIGx0bXAgKTsKLQkJCU9TX1NMRUVQKDUwMDApOworCQkJbXNsZWVwKDUpOwogCQkJbHRtcCA9ICgxIDw8IDMxKSB8ICgwIDw8IDMwKSB8ICgyNCA8PCAyNCkgfCAweDFBQkE4RjsKIAkJCVdiMzVSZWdfV3JpdGVTeW5jKCBwSHdEYXRhLCAweDA4NjQsIGx0bXAgKTsKLQkJCU9TX1NMRUVQKDUwMDApOworCQkJbXNsZWVwKDUpOwogCiAJCQkvLzVHSHoKIAkJCVdiMzVSZWdfV3JpdGVTeW5jKCBwSHdEYXRhLCAweDAzZGMsIDB4MDAwMDAwMDAgKTsKQEAgLTEyNTEsNyArMTI1Miw3IEBACiAJCQkvLyBXcml0ZSB0byByZWdpc3Rlci4gbnVtYmVyIG11c3QgbGVzcyBhbmQgZXF1YWwgdGhhbiAxNgogCQkJZm9yKCBpPTA7IGk8bnVtYmVyOyBpKysgKQogCQkJCVdiMzVSZWdfV3JpdGVTeW5jKCBwSHdEYXRhLCAweDA4NjQsIHBsdG1wW2ldICk7Ci0JCQlPU19TTEVFUCg1MDAwKTsKKwkJCW1zbGVlcCg1KTsKIAogCQkJV2IzNVJlZ19Xcml0ZVN5bmMoIHBId0RhdGEsIDB4MDNkYywgMHgwMDAwMDA4MCApOwogCQkJI2lmZGVmIF9QRV9TVEFURV9EVU1QXwpAQCAtMTI2MiwxMyArMTI2MywxMyBAQAogCQkJLy9XYjM1UmVnX1dyaXRlU3luYyggcEh3RGF0YSwgMHgwODY0LCBsdG1wICk7CiAJCQlsdG1wID0gKDEgPDwgMzEpIHwgKDAgPDwgMzApIHwgKDI0IDw8IDI0KSB8IDB4OUFCQThGOwogCQkJV2IzNVJlZ19Xcml0ZVN5bmMoIHBId0RhdGEsIDB4MDg2NCwgbHRtcCApOwotCQkJT1NfU0xFRVAoNTAwMCk7CisJCQltc2xlZXAoNSk7CiAJCQlsdG1wID0gKDEgPDwgMzEpIHwgKDAgPDwgMzApIHwgKDI0IDw8IDI0KSB8IDB4M0FCQThGOwogCQkJV2IzNVJlZ19Xcml0ZVN5bmMoIHBId0RhdGEsIDB4MDg2NCwgbHRtcCApOwotCQkJT1NfU0xFRVAoNTAwMCk7CisJCQltc2xlZXAoNSk7CiAJCQlsdG1wID0gKDEgPDwgMzEpIHwgKDAgPDwgMzApIHwgKDI0IDw8IDI0KSB8IDB4MTJCQUNGOwogCQkJV2IzNVJlZ19Xcml0ZVN5bmMoIHBId0RhdGEsIDB4MDg2NCwgbHRtcCApOwotCQkJT1NfU0xFRVAoNTAwMCk7CisJCQltc2xlZXAoNSk7CiAKIAkJCS8vV2IzNVJlZ19Xcml0ZVN5bmMoIHBId0RhdGEsIDB4MDNkYywgMHgwMDAwMDA4MCApOwogCQkJLy9XQkRFQlVHKCgiKiBQTExfT04gICAgaGlnaFxuIikpOwpAQCAtMTI4MCwyMSArMTI4MSwyMSBAQAogCQkJLy8KIAkJCS8vIDsgVmVyc2lvbiAxLjNCIHJldmlzaW9uIGl0ZW1zOiBmb3IgRkE1OTc2QSAsIE9jdG9iZXIgMywgMjAwNSBieSBIVEhvCiAJCQkvLwotCQkJbHRtcCA9IHBId0RhdGEtPldiMzVSZWcuQkI1QyAmIDB4ZmZmZmYwMDA7CisJCQlsdG1wID0gcEh3RGF0YS0+cmVnLkJCNUMgJiAweGZmZmZmMDAwOwogCQkJV2IzNVJlZ19Xcml0ZVN5bmMoIHBId0RhdGEsIDB4MTA1YywgbHRtcCApOwogCQkJV2IzNVJlZ19Xcml0ZVN5bmMoIHBId0RhdGEsIDB4MTA1OCwgMCApOwotCQkJcEh3RGF0YS0+V2IzNVJlZy5CQjUwIHw9IDB4MzsvLyhNQVNLX0lRQ0FMX01PREV8TUFTS19DQUxJQl9TVEFSVCk7Ly8yMDA2MDYzMAotCSAgICAgIAlXYjM1UmVnX1dyaXRlU3luYyggcEh3RGF0YSwgMHgxMDUwLCBwSHdEYXRhLT5XYjM1UmVnLkJCNTApOworCQkJcEh3RGF0YS0+cmVnLkJCNTAgfD0gMHgzOy8vKE1BU0tfSVFDQUxfTU9ERXxNQVNLX0NBTElCX1NUQVJUKTsvLzIwMDYwNjMwCisJCSAgICAgIAlXYjM1UmVnX1dyaXRlU3luYyhwSHdEYXRhLCAweDEwNTAsIHBId0RhdGEtPnJlZy5CQjUwKTsKIAogCQkJLy8tLS0tLSBDYWxpYnJhdGlvbiAoMSkuIFZDTyBmcmVxdWVuY3kgY2FsaWJyYXRpb24KIAkJCS8vQ2FsaWJyYXRpb24gKDFhLjApLiBTeW50aGVzaXplciByZXNldCAoSFRIbyBjb3JyZWN0ZWQgMjAwNS8wNS8xMCkKIAkJCWx0bXAgPSAoMSA8PCAzMSkgfCAoMCA8PCAzMCkgfCAoMjQgPDwgMjQpIHwgQml0UmV2ZXJzZSggKDB4MEY8PDI0KSB8IDB4MDAxMDFFLCAyNCk7CiAJCQlXYjM1UmVnX1dyaXRlU3luYyggcEh3RGF0YSwgMHgwODY0LCBsdG1wICk7Ci0JCQlPU19TTEVFUCggNTAwMCApOyAvLyBTbGVlcCA1bXMKKwkJCW1zbGVlcCg1KTsgLy8gU2xlZXAgNW1zCiAJCQkvL0NhbGlicmF0aW9uICgxYSkuIFZDTyBmcmVxdWVuY3kgY2FsaWJyYXRpb24gbW9kZSA7IHdhaXRpbmcgMm1zZWMgVkNPIGNhbGlicmF0aW9uIHRpbWUKIAkJCWx0bXAgPSAoMSA8PCAzMSkgfCAoMCA8PCAzMCkgfCAoMjQgPDwgMjQpIHwgQml0UmV2ZXJzZSggKDB4MDA8PDI0KSB8IDB4RkU2OWMwLCAyNCk7CiAJCQlXYjM1UmVnX1dyaXRlU3luYyggcEh3RGF0YSwgMHgwODY0LCBsdG1wICk7Ci0JCQlPU19TTEVFUCggMjAwMCApOyAvLyBTbGVlcCAybXMKKwkJCW1zbGVlcCgyKTsgLy8gU2xlZXAgMm1zCiAKIAkJCS8vLS0tLS0gQ2FsaWJyYXRpb24gKDIpLiBUWCBiYXNlYmFuZCBHbS1DIGZpbHRlciBhdXRvLXR1bmluZwogCQkJLy9DYWxpYnJhdGlvbiAoMmEpLiB0dXJuIG9mZiBFTkNBTCBzaWduYWwKQEAgLTEzMDksNyArMTMxMCw3IEBACiAJCQkvL0NhbGlicmF0aW9uICgyYykuIHR1cm4tb24gVFggR20tQyBmaWx0ZXIgYXV0by10dW5pbmcKIAkJCWx0bXAgPSAoMSA8PCAzMSkgfCAoMCA8PCAzMCkgfCAoMjQgPDwgMjQpIHwgQml0UmV2ZXJzZSggKDB4MDA8PDI0KSB8IDB4RkNFQkMwLCAyNCk7CiAJCQlXYjM1UmVnX1dyaXRlU3luYyggcEh3RGF0YSwgMHgwODY0LCBsdG1wICk7Ci0JCQlPU19TTEVFUCggMTUwICk7IC8vIFNsZWVwIDE1MCB1cworCQkJdWRlbGF5KDE1MCk7IC8vIFNsZWVwIDE1MCB1cwogCQkJLy90dXJuIG9mZiBFTkNBTCBzaWduYWwKIAkJCWx0bXAgPSAoMSA8PCAzMSkgfCAoMCA8PCAzMCkgfCAoMjQgPDwgMjQpIHwgQml0UmV2ZXJzZSggKDB4MDA8PDI0KSB8IDB4RjhFQkMwLCAyNCk7CiAJCQlXYjM1UmVnX1dyaXRlU3luYyggcEh3RGF0YSwgMHgwODY0LCBsdG1wICk7CkBAIC0xMzI3LDcgKzEzMjgsNyBAQAogCQkJLy9DYWxpYnJhdGlvbiAoM2MpLiB0dXJuLW9uIFJYIEdtLUMgZmlsdGVyIGF1dG8tdHVuaW5nCiAJCQlsdG1wID0gKDEgPDwgMzEpIHwgKDAgPDwgMzApIHwgKDI0IDw8IDI0KSB8IEJpdFJldmVyc2UoICgweDAwPDwyNCkgfCAweEZFRURDMCwgMjQpOwogCQkJV2IzNVJlZ19Xcml0ZVN5bmMoIHBId0RhdGEsIDB4MDg2NCwgbHRtcCApOwotCQkJT1NfU0xFRVAoIDE1MCApOyAvLyBTbGVlcCAxNTAgdXMKKwkJCXVkZWxheSgxNTApOyAvLyBTbGVlcCAxNTAgdXMKIAkJCS8vQ2FsaWJyYXRpb24gKDNlKS4gdHVybiBvZmYgRU5DQUwgc2lnbmFsCiAJCQlsdG1wID0gKDEgPDwgMzEpIHwgKDAgPDwgMzApIHwgKDI0IDw8IDI0KSB8IEJpdFJldmVyc2UoICgweDAwPDwyNCkgfCAweEZBRURDMCwgMjQpOwogCQkJV2IzNVJlZ19Xcml0ZVN5bmMoIHBId0RhdGEsIDB4MDg2NCwgbHRtcCApOwpAQCAtMTMzNiw3ICsxMzM3LDcgQEAKIAkJCS8vQ2FsaWJyYXRpb24gKDRhKS4gVFggTE8gbGVha2FnZSBjYWxpYnJhdGlvbgogCQkJbHRtcCA9ICgxIDw8IDMxKSB8ICgwIDw8IDMwKSB8ICgyNCA8PCAyNCkgfCBCaXRSZXZlcnNlKCAoMHgwMDw8MjQpIHwgMHhGRDZCQzAsIDI0KTsKIAkJCVdiMzVSZWdfV3JpdGVTeW5jKCBwSHdEYXRhLCAweDA4NjQsIGx0bXAgKTsKLQkJCU9TX1NMRUVQKCAxNTAgKTsgLy8gU2xlZXAgMTUwIHVzCisJCQl1ZGVsYXkoMTUwKTsgLy8gU2xlZXAgMTUwIHVzCiAKIAkJCS8vLS0tLS0gQ2FsaWJyYXRpb24gKDUpLiBSWCBEQyBvZmZzZXQgY2FsaWJyYXRpb24KIAkJCS8vQ2FsaWJyYXRpb24gKDVhKS4gdHVybiBvZmYgRU5DQUwgc2lnbmFsIGFuZCBzZXQgdG8gUlggU1cgREMgY2FsaXJhdGlvbiBtb2RlCkBAIC0xMzUzLDcgKzEzNTQsNyBAQAogCQkJLy9DYWxpYnJhdGlvbiAoNWQpLiB0dXJuIG9uIFJYIERDIG9mZnNldCBjYWwgZnVuY3Rpb247IGFuZCB3YWl0aW5nIDIgbXNlYyBjYWwgdGltZQogCQkJbHRtcCA9ICgxIDw8IDMxKSB8ICgwIDw8IDMwKSB8ICgyNCA8PCAyNCkgfCBCaXRSZXZlcnNlKCAoMHgwMDw8MjQpIHwgMHhGRjZEQzAsIDI0KTsKIAkJCVdiMzVSZWdfV3JpdGVTeW5jKCBwSHdEYXRhLCAweDA4NjQsIGx0bXAgKTsKLQkJCU9TX1NMRUVQKDIwMDApOyAvLyBTbGVlcCAybXMKKwkJCW1zbGVlcCgyKTsgLy8gU2xlZXAgMm1zCiAJCQkvL0NhbGlicmF0aW9uICg1ZikuIHR1cm4gb2ZmIEVOQ0FMIHNpZ25hbAogCQkJbHRtcCA9ICgxIDw8IDMxKSB8ICgwIDw8IDMwKSB8ICgyNCA8PCAyNCkgfCBCaXRSZXZlcnNlKCAoMHgwMDw8MjQpIHwgMHhGQUVEQzAsIDI0KTsKIAkJCVdiMzVSZWdfV3JpdGVTeW5jKCBwSHdEYXRhLCAweDA4NjQsIGx0bXAgKTsKQEAgLTEzNjUsNyArMTM2Niw3IEBACiAJCQkvL0NhbGlicmF0aW9uICg1ZCkuIHR1cm4gb24gUlggREMgb2Zmc2V0IGNhbCBmdW5jdGlvbjsgYW5kIHdhaXRpbmcgMiBtc2VjIGNhbCB0aW1lCiAJCQlsdG1wID0gKDEgPDwgMzEpIHwgKDAgPDwgMzApIHwgKDI0IDw8IDI0KSB8IEJpdFJldmVyc2UoICgweDAwPDwyNCkgfCAweEZGNkRDMCwgMjQpOwogCQkJV2IzNVJlZ19Xcml0ZVN5bmMoIHBId0RhdGEsIDB4MDg2NCwgbHRtcCApOwotCQkJT1NfU0xFRVAoMjAwMCk7IC8vIFNsZWVwIDJtcworCQkJbXNsZWVwKDIpOyAvLyBTbGVlcCAybXMKIAkJCS8vQ2FsaWJyYXRpb24gKDVmKS4gdHVybiBvZmYgRU5DQUwgc2lnbmFsCiAJCQlsdG1wID0gKDEgPDwgMzEpIHwgKDAgPDwgMzApIHwgKDI0IDw8IDI0KSB8IEJpdFJldmVyc2UoICgweDAwPDwyNCkgfCAweEZBRURDMCwgMjQpOwogCQkJV2IzNVJlZ19Xcml0ZVN5bmMoIHBId0RhdGEsIDB4MDg2NCwgbHRtcCApOwpAQCAtMTM3Nyw3ICsxMzc4LDcgQEAKIAkJCS8vQ2FsaWJyYXRpb24gKDVkKS4gdHVybiBvbiBSWCBEQyBvZmZzZXQgY2FsIGZ1bmN0aW9uOyBhbmQgd2FpdGluZyAyIG1zZWMgY2FsIHRpbWUKIAkJCWx0bXAgPSAoMSA8PCAzMSkgfCAoMCA8PCAzMCkgfCAoMjQgPDwgMjQpIHwgQml0UmV2ZXJzZSggKDB4MDA8PDI0KSB8IDB4RkY2REMwLCAyNCk7CiAJCQlXYjM1UmVnX1dyaXRlU3luYyggcEh3RGF0YSwgMHgwODY0LCBsdG1wICk7Ci0JCQlPU19TTEVFUCgyMDAwKTsgLy8gU2xlZXAgMm1zCisJCQltc2xlZXAoMik7IC8vIFNsZWVwIDJtcwogCQkJLy9DYWxpYnJhdGlvbiAoNWYpLiB0dXJuIG9mZiBFTkNBTCBzaWduYWwKIAkJCWx0bXAgPSAoMSA8PCAzMSkgfCAoMCA8PCAzMCkgfCAoMjQgPDwgMjQpIHwgQml0UmV2ZXJzZSggKDB4MDA8PDI0KSB8IDB4RkFFREMwLCAyNCk7CiAJCQlXYjM1UmVnX1dyaXRlU3luYyggcEh3RGF0YSwgMHgwODY0LCBsdG1wICk7CkBAIC0xMzg5LDcgKzEzOTAsNyBAQAogCQkJLy9DYWxpYnJhdGlvbiAoNWQpLiB0dXJuIG9uIFJYIERDIG9mZnNldCBjYWwgZnVuY3Rpb247IGFuZCB3YWl0aW5nIDIgbXNlYyBjYWwgdGltZQogCQkJbHRtcCA9ICgxIDw8IDMxKSB8ICgwIDw8IDMwKSB8ICgyNCA8PCAyNCkgfCBCaXRSZXZlcnNlKCAoMHgwMDw8MjQpIHwgMHhGRjZEQzAsIDI0KTsKIAkJCVdiMzVSZWdfV3JpdGVTeW5jKCBwSHdEYXRhLCAweDA4NjQsIGx0bXAgKTsKLQkJCU9TX1NMRUVQKDIwMDApOyAvLyBTbGVlcCAybXMKKwkJCW1zbGVlcCgyKTsgLy8gU2xlZXAgMm1zCiAJCQkvL0NhbGlicmF0aW9uICg1ZikuIHR1cm4gb2ZmIEVOQ0FMIHNpZ25hbAogCQkJbHRtcCA9ICgxIDw8IDMxKSB8ICgwIDw8IDMwKSB8ICgyNCA8PCAyNCkgfCBCaXRSZXZlcnNlKCAoMHgwMDw8MjQpIHwgMHhGQUVEQzAsIDI0KTsKIAkJCVdiMzVSZWdfV3JpdGVTeW5jKCBwSHdEYXRhLCAweDA4NjQsIGx0bXAgKTsKQEAgLTEzOTksMzAgKzE0MDAsMzAgQEAKIAogCQkJLy87IC0tLS0tIENhbGlicmF0aW9uICg3KS4gU3dpdGNoIFJGIGNoaXAgdG8gbm9ybWFsIG1vZGUKIAkJCS8vMHgwMCAweEY4NjEwMCA7IDNFMTg0ICAgOyBTd2l0Y2ggUkYgY2hpcCB0byBub3JtYWwgbW9kZQotLy8JCQlPU19TTEVFUCgxMDAwMCk7IC8vIEBAIDIwMDYwNzIxCisvLwkJCW1zbGVlcCgxMCk7IC8vIEBAIDIwMDYwNzIxCiAJCQlsdG1wID0gKDEgPDwgMzEpIHwgKDAgPDwgMzApIHwgKDI0IDw8IDI0KSB8IEJpdFJldmVyc2UoICgweDAwPDwyNCkgfCAweEY4NjEwMCwgMjQpOwogCQkJV2IzNVJlZ19Xcml0ZVN5bmMoIHBId0RhdGEsIDB4MDg2NCwgbHRtcCApOwotCQkJT1NfU0xFRVAoNTAwMCk7IC8vIFNsZWVwIDUgbXMKKwkJCW1zbGVlcCg1KTsgLy8gU2xlZXAgNSBtcwogCiAvLwkJCS8vd3JpdGUgYmFjawotLy8JCQlXYjM1UmVnX1dyaXRlU3luYyggcEh3RGF0YSwgMHgxMDVjLCBwSHdEYXRhLT5XYjM1UmVnLkJCNUMgKTsKLS8vCQkJcEh3RGF0YS0+V2IzNVJlZy5CQjUwICY9IH4weDEzOy8vKE1BU0tfSVFDQUxfTU9ERXxNQVNLX0NBTElCX1NUQVJUKTsgLy8gMjAwNjAzMTUuMSBmaXgKLS8vICAgICAgCVdiMzVSZWdfV3JpdGVTeW5jKCBwSHdEYXRhLCAweDEwNTAsIHBId0RhdGEtPldiMzVSZWcuQkI1MCk7Ci0vLwkJCU9TX1NMRUVQKDEwMDApOyAvLyBTbGVlcCAxIG1zCisvLwkJCVdiMzVSZWdfV3JpdGVTeW5jKHBId0RhdGEsIDB4MTA1YywgcEh3RGF0YS0+cmVnLkJCNUMpOworLy8JCQlwSHdEYXRhLT5yZWcuQkI1MCAmPSB+MHgxMzsvLyhNQVNLX0lRQ0FMX01PREV8TUFTS19DQUxJQl9TVEFSVCk7IC8vIDIwMDYwMzE1LjEgZml4CisvLwkJICAgICAgCVdiMzVSZWdfV3JpdGVTeW5jKHBId0RhdGEsIDB4MTA1MCwgcEh3RGF0YS0+cmVnLkJCNTApOworLy8JCQltc2xlZXAoMSk7IC8vIFNsZWVwIDEgbXMKIAkJCWJyZWFrOwogCX0KIH0KIAogdm9pZCBCQlByb2Nlc3Nvcl9BTDcyMzBfMjQwMCggIHBod19kYXRhX3QgcEh3RGF0YSkKIHsKLQlQV0IzNVJFRwlwV2IzNVJlZyA9ICZwSHdEYXRhLT5XYjM1UmVnOworCXN0cnVjdCB3YjM1X3JlZyAqcmVnID0gJnBId0RhdGEtPnJlZzsKIAl1MzIJcGx0bXBbMTJdOwogCiAJcGx0bXBbMF0gPSAweDE2QTgzMzdBOyAvLyAweDE2YTUyMTVmOyAvLyAweDEwMDAgQUdDX0N0cmwxCiAJcGx0bXBbMV0gPSAweDlBRkY5QUE2OyAvLyAweDlhZmY5Y2E2OyAvLyAweDEwMDQgQUdDX0N0cmwyCiAJcGx0bXBbMl0gPSAweDU1RDAwQTA0OyAvLyAweDU1ZDAwYTA0OyAvLyAweDEwMDggQUdDX0N0cmwzCiAJcGx0bXBbM10gPSAweEZGRjcyMDMxOyAvLyAweEZmRmYyMTM4OyAvLyAweDEwMGMgQUdDX0N0cmw0Ci0JcFdiMzVSZWctPkJCMEMgPSAweEZGRjcyMDMxOworCXJlZy0+QkIwQyA9IDB4RkZGNzIwMzE7CiAJcGx0bXBbNF0gPSAweDBGYWNEQ0M1OyAvLyAweDEwMTAgQUdDX0N0cmw1IC8vIDIwMDUwOTI3IDB4MEZhY0RDQjcKIAlwbHRtcFs1XSA9IDB4MDBDQUEzMzM7IC8vIDB4MDBlYWEzMzM7IC8vIDB4MTAxNCBBR0NfQ3RybDYKIAlwbHRtcFs2XSA9IDB4RjIyMTExMTE7IC8vIDB4MTExMTExMTE7IC8vIDB4MTAxOCBBR0NfQ3RybDcKQEAgLTE0MzEsMjUgKzE0MzIsMjUgQEAKIAlwbHRtcFs5XSA9IDB4QTgwMDJBNzk7IC8vIDB4YTkwMDJBNzk7IC8vIDB4MTAyNCBBR0NfQ3RybDEwCiAJcGx0bXBbMTBdID0gMHg0MDAwMDUyODsgLy8gMjAwNTA5MjcgMHg0MDAwMDIyOAogCXBsdG1wWzExXSA9IDB4MjMyRDdGMzA7IC8vIDB4MjM0NTdmMzA7Ly8gMHgxMDJjIEFfQUNRX0N0cmwKLQlwV2IzNVJlZy0+QkIyQyA9IDB4MjMyRDdGMzA7CisJcmVnLT5CQjJDID0gMHgyMzJEN0YzMDsKIAlXYjM1UmVnX0J1cnN0V3JpdGUoIHBId0RhdGEsIDB4MTAwMCwgcGx0bXAsIDEyLCBBVVRPX0lOQ1JFTUVOVCApOwogCiAJcGx0bXBbMF0gPSAweDAwMDAyYzU0OyAvLyAweDEwMzAgQl9BQ1FfQ3RybAotCXBXYjM1UmVnLT5CQjMwID0gMHgwMDAwMmM1NDsKKwlyZWctPkJCMzAgPSAweDAwMDAyYzU0OwogCXBsdG1wWzFdID0gMHgwMEMwRDZDNTsgLy8gMHgxMDM0IEFfVFhSWF9DdHJsCiAJcGx0bXBbMl0gPSAweDVCMkM4NzY5OyAvLyAweDEwMzggQl9UWFJYX0N0cmwKIAlwbHRtcFszXSA9IDB4MDAwMDAwMDA7IC8vIDB4MTAzYyAxMWEgVFggTFMgZmlsdGVyCi0JcFdiMzVSZWctPkJCM0MgPSAweDAwMDAwMDAwOworCXJlZy0+QkIzQyA9IDB4MDAwMDAwMDA7CiAJcGx0bXBbNF0gPSAweDAwMDAzRjI5OyAvLyAweDEwNDAgMTFhIFRYIExTIGZpbHRlcgogCXBsdG1wWzVdID0gMHgwRUZFRkJGRTsgLy8gMHgxMDQ0IDExYSBUWCBMUyBmaWx0ZXIKIAlwbHRtcFs2XSA9IDB4MDAzMzJDMUI7IC8vIDB4MDA0NTNCMjQ7IC8vIDB4MTA0OCAxMWIgVFggUkMgZmlsdGVyCiAJcGx0bXBbN10gPSAweDBBMDBGRUZGOyAvLyAweDBFMDBGRUZGOyAvLyAweDEwNGMgMTFiIFRYIFJDIGZpbHRlcgogCXBsdG1wWzhdID0gMHgyQjEwNjIwODsgLy8gMHgxMDUwIE1PREVfQ3RybAotCXBXYjM1UmVnLT5CQjUwID0gMHgyQjEwNjIwODsKKwlyZWctPkJCNTAgPSAweDJCMTA2MjA4OwogCXBsdG1wWzldID0gMDsgLy8gMHgxMDU0Ci0JcFdiMzVSZWctPkJCNTQgPSAweDAwMDAwMDAwOworCXJlZy0+QkI1NCA9IDB4MDAwMDAwMDA7CiAJcGx0bXBbMTBdID0gMHg1MjUyNDI0MjsgLy8gMHg2NDY0NTI1MjsgLy8gMHgxMDU4IElRX0FscGhhCi0JcFdiMzVSZWctPkJCNTggPSAweDUyNTI0MjQyOworCXJlZy0+QkI1OCA9IDB4NTI1MjQyNDI7CiAJcGx0bXBbMTFdID0gMHhBQTBBQzAwMDsgLy8gMHgxMDVjIERDX0NhbmNlbAogCVdiMzVSZWdfQnVyc3RXcml0ZSggcEh3RGF0YSwgMHgxMDMwLCBwbHRtcCwgMTIsIEFVVE9fSU5DUkVNRU5UICk7CiAKQEAgLTE0NTcsMTQgKzE0NTgsMTQgQEAKIAogdm9pZCBCQlByb2Nlc3Nvcl9BTDcyMzBfNTAwMCggIHBod19kYXRhX3QgcEh3RGF0YSkKIHsKLQlQV0IzNVJFRwlwV2IzNVJlZyA9ICZwSHdEYXRhLT5XYjM1UmVnOworCXN0cnVjdCB3YjM1X3JlZyAqcmVnID0gJnBId0RhdGEtPnJlZzsKIAl1MzIJcGx0bXBbMTJdOwogCiAJcGx0bXBbMF0gPSAweDE2QUE2Njc4OyAvLyAweDEwMDAgQUdDX0N0cmwxCiAJcGx0bXBbMV0gPSAweDlBRkZBMEIyOyAvLyAweDEwMDQgQUdDX0N0cmwyCiAJcGx0bXBbMl0gPSAweDU1RDAwQTA0OyAvLyAweDEwMDggQUdDX0N0cmwzCiAJcGx0bXBbM10gPSAweEVGRkYyMzNFOyAvLyAweDEwMGMgQUdDX0N0cmw0Ci0JcFdiMzVSZWctPkJCMEMgPSAweEVGRkYyMzNFOworCXJlZy0+QkIwQyA9IDB4RUZGRjIzM0U7CiAJcGx0bXBbNF0gPSAweDBGYWNEQ0M1OyAvLyAweDEwMTAgQUdDX0N0cmw1IC8vIDIwMDUwOTI3IDB4MEZhY0RDQjcKIAlwbHRtcFs1XSA9IDB4MDBDQUEzMzM7IC8vIDB4MTAxNCBBR0NfQ3RybDYKIAlwbHRtcFs2XSA9IDB4RjI0MzIxMTE7IC8vIDB4MTAxOCBBR0NfQ3RybDcKQEAgLTE0NzMsMjQgKzE0NzQsMjQgQEAKIAlwbHRtcFs5XSA9IDB4MDAwMDJBNzk7IC8vIDB4MTAyNCBBR0NfQ3RybDEwCiAJcGx0bXBbMTBdID0gMHg0MDAwMDUyODsgLy8gMjAwNTA5MjcgMHg0MDAwMDIyOAogCXBsdG1wWzExXSA9IDB4MjMyRkRGMzA7Ly8gMHgxMDJjIEFfQUNRX0N0cmwKLQlwV2IzNVJlZy0+QkIyQyA9IDB4MjMyRkRGMzA7CisJcmVnLT5CQjJDID0gMHgyMzJGREYzMDsKIAlXYjM1UmVnX0J1cnN0V3JpdGUoIHBId0RhdGEsIDB4MTAwMCwgcGx0bXAsIDEyLCBBVVRPX0lOQ1JFTUVOVCApOwogCiAJcGx0bXBbMF0gPSAweDgwMDAyQzdDOyAvLyAweDEwMzAgQl9BQ1FfQ3RybAogCXBsdG1wWzFdID0gMHgwMEMwRDZDNTsgLy8gMHgxMDM0IEFfVFhSWF9DdHJsCiAJcGx0bXBbMl0gPSAweDVCMkM4NzY5OyAvLyAweDEwMzggQl9UWFJYX0N0cmwKIAlwbHRtcFszXSA9IDB4MDAwMDAwMDA7IC8vIDB4MTAzYyAxMWEgVFggTFMgZmlsdGVyCi0JcFdiMzVSZWctPkJCM0MgPSAweDAwMDAwMDAwOworCXJlZy0+QkIzQyA9IDB4MDAwMDAwMDA7CiAJcGx0bXBbNF0gPSAweDAwMDAzRjI5OyAvLyAweDEwNDAgMTFhIFRYIExTIGZpbHRlcgogCXBsdG1wWzVdID0gMHgwRUZFRkJGRTsgLy8gMHgxMDQ0IDExYSBUWCBMUyBmaWx0ZXIKIAlwbHRtcFs2XSA9IDB4MDAzMzJDMUI7IC8vIDB4MTA0OCAxMWIgVFggUkMgZmlsdGVyCiAJcGx0bXBbN10gPSAweDBBMDBGRUZGOyAvLyAweDEwNGMgMTFiIFRYIFJDIGZpbHRlcgogCXBsdG1wWzhdID0gMHgyQjEwNzIwODsgLy8gMHgxMDUwIE1PREVfQ3RybAotCXBXYjM1UmVnLT5CQjUwID0gMHgyQjEwNzIwODsKKwlyZWctPkJCNTAgPSAweDJCMTA3MjA4OwogCXBsdG1wWzldID0gMDsgLy8gMHgxMDU0Ci0JcFdiMzVSZWctPkJCNTQgPSAweDAwMDAwMDAwOworCXJlZy0+QkI1NCA9IDB4MDAwMDAwMDA7CiAJcGx0bXBbMTBdID0gMHg1MjUyNDI0MjsgLy8gMHgxMDU4IElRX0FscGhhCi0JcFdiMzVSZWctPkJCNTggPSAweDUyNTI0MjQyOworCXJlZy0+QkI1OCA9IDB4NTI1MjQyNDI7CiAJcGx0bXBbMTFdID0gMHhBQTBBQzAwMDsgLy8gMHgxMDVjIERDX0NhbmNlbAogCVdiMzVSZWdfQnVyc3RXcml0ZSggcEh3RGF0YSwgMHgxMDMwLCBwbHRtcCwgMTIsIEFVVE9fSU5DUkVNRU5UICk7CiAKQEAgLTE1MTEsNyArMTUxMiw3IEBACiB2b2lkCiBCQlByb2Nlc3Nvcl9pbml0aWFsKCAgcGh3X2RhdGFfdCBwSHdEYXRhICkKIHsKLQlQV0IzNVJFRwlwV2IzNVJlZyA9ICZwSHdEYXRhLT5XYjM1UmVnOworCXN0cnVjdCB3YjM1X3JlZyAqcmVnID0gJnBId0RhdGEtPnJlZzsKIAl1MzIJaSwgcGx0bXBbMTJdOwogCiAgICAgc3dpdGNoKCBwSHdEYXRhLT5waHlfdHlwZSApCkBAIC0xNTIyLDcgKzE1MjMsNyBAQAogCQkJcGx0bXBbMV0gPSAweDlBRkZBRUE0OyAvLyAweDEwMDQgQUdDX0N0cmwyCiAJCQlwbHRtcFsyXSA9IDB4NTVEMDBBMDQ7IC8vIDB4MTAwOCBBR0NfQ3RybDMKIAkJCXBsdG1wWzNdID0gMHhFRkZGMUEzNDsgLy8gMHgxMDBjIEFHQ19DdHJsNAotCQkJcFdiMzVSZWctPkJCMEMgPSAweEVGRkYxQTM0OworCQkJcmVnLT5CQjBDID0gMHhFRkZGMUEzNDsKIAkJCXBsdG1wWzRdID0gMHgwRkFCRTBCNzsgLy8gMHgxMDEwIEFHQ19DdHJsNQogCQkJcGx0bXBbNV0gPSAweDAwQ0FBMzMyOyAvLyAweDEwMTQgQUdDX0N0cmw2CiAJCQlwbHRtcFs2XSA9IDB4RjY2MzIxMTE7IC8vIDB4MTAxOCBBR0NfQ3RybDcKQEAgLTE1MzEsMjUgKzE1MzIsMjUgQEAKIAkJCXBsdG1wWzldID0gMHgwMDAwMkE3OTsgLy8gMHgxMDI0IEFHQ19DdHJsMTAKIAkJCXBsdG1wWzEwXSA9IChwSHdEYXRhLT5waHlfdHlwZT09MykgPyAweDQwMDAwYTI4IDogMHg0MDAwMDIyODsgLy8gMHgxMDI4IE1BWElNXzMzMShiMzE9MCkgKyBXQlJGX1YxKGIxMT0xKSA6IE1BWElNXzMzMShiMzE9MCkgKyBXQlJGX1YyKGIxMT0wKQogCQkJcGx0bXBbMTFdID0gMHgyMzJGREYzMDsgLy8gMHgxMDJjIEFfQUNRX0N0cmwKLQkJCXBXYjM1UmVnLT5CQjJDID0gMHgyMzJGREYzMDsgLy9Nb2RpZnkgZm9yIDMzJ3MgMS4wLjk1Lnh4eCB2ZXJzaW9uLCBhbnRlbm5hIDEKKwkJCXJlZy0+QkIyQyA9IDB4MjMyRkRGMzA7IC8vTW9kaWZ5IGZvciAzMydzIDEuMC45NS54eHggdmVyc2lvbiwgYW50ZW5uYSAxCiAJCQlXYjM1UmVnX0J1cnN0V3JpdGUoIHBId0RhdGEsIDB4MTAwMCwgcGx0bXAsIDEyLCBBVVRPX0lOQ1JFTUVOVCApOwogCiAJCQlwbHRtcFswXSA9IDB4MDAwMDJDNTQ7IC8vIDB4MTAzMCBCX0FDUV9DdHJsCi0JCQlwV2IzNVJlZy0+QkIzMCA9IDB4MDAwMDJDNTQ7CisJCQlyZWctPkJCMzAgPSAweDAwMDAyQzU0OwogCQkJcGx0bXBbMV0gPSAweDAwQzBENkM1OyAvLyAweDEwMzQgQV9UWFJYX0N0cmwKIAkJCXBsdG1wWzJdID0gMHg1QjZDODc2OTsgLy8gMHgxMDM4IEJfVFhSWF9DdHJsCiAJCQlwbHRtcFszXSA9IDB4MDAwMDAwMDA7IC8vIDB4MTAzYyAxMWEgVFggTFMgZmlsdGVyCi0JCQlwV2IzNVJlZy0+QkIzQyA9IDB4MDAwMDAwMDA7CisJCQlyZWctPkJCM0MgPSAweDAwMDAwMDAwOwogCQkJcGx0bXBbNF0gPSAweDAwMDAzRjI5OyAvLyAweDEwNDAgMTFhIFRYIExTIGZpbHRlcgogCQkJcGx0bXBbNV0gPSAweDBFRkVGQkZFOyAvLyAweDEwNDQgMTFhIFRYIExTIGZpbHRlcgogCQkJcGx0bXBbNl0gPSAweDAwNDUzQjI0OyAvLyAweDEwNDggMTFiIFRYIFJDIGZpbHRlcgogCQkJcGx0bXBbN10gPSAweDBFMDBGRUZGOyAvLyAweDEwNGMgMTFiIFRYIFJDIGZpbHRlcgogCQkJcGx0bXBbOF0gPSAweDI3MTA2MjA4OyAvLyAweDEwNTAgTU9ERV9DdHJsCi0JCQlwV2IzNVJlZy0+QkI1MCA9IDB4MjcxMDYyMDg7CisJCQlyZWctPkJCNTAgPSAweDI3MTA2MjA4OwogCQkJcGx0bXBbOV0gPSAwOyAvLyAweDEwNTQKLQkJCXBXYjM1UmVnLT5CQjU0ID0gMHgwMDAwMDAwMDsKKwkJCXJlZy0+QkI1NCA9IDB4MDAwMDAwMDA7CiAJCQlwbHRtcFsxMF0gPSAweDY0NjQ2NDY0OyAvLyAweDEwNTggSVFfQWxwaGEKLQkJCXBXYjM1UmVnLT5CQjU4ID0gMHg2NDY0NjQ2NDsKKwkJCXJlZy0+QkI1OCA9IDB4NjQ2NDY0NjQ7CiAJCQlwbHRtcFsxMV0gPSAweEFBMEFDMDAwOyAvLyAweDEwNWMgRENfQ2FuY2VsCiAJCQlXYjM1UmVnX0J1cnN0V3JpdGUoIHBId0RhdGEsIDB4MTAzMCwgcGx0bXAsIDEyLCBBVVRPX0lOQ1JFTUVOVCApOwogCkBAIC0xNTY4LDcgKzE1NjksNyBAQAogCQkJcGx0bXBbMV0gPSAweDlhZmZhZWE0OyAvLyAweDEwMDQgQUdDX0N0cmwyCiAJCQlwbHRtcFsyXSA9IDB4NTVkMDBhMDQ7IC8vIDB4MTAwOCBBR0NfQ3RybDMKIAkJCXBsdG1wWzNdID0gMHhlZmZmMWEzNDsgLy8gMHgxMDBjIEFHQ19DdHJsNAotCQkJcFdiMzVSZWctPkJCMEMgPSAweGVmZmYxYTM0OworCQkJcmVnLT5CQjBDID0gMHhlZmZmMWEzNDsKIAkJCXBsdG1wWzRdID0gMHgwZmFiZTBiNzsgLy8gMHgxMDEwIEFHQ19DdHJsNQogCQkJcGx0bXBbNV0gPSAweDAwY2FhMzMyOyAvLyAweDEwMTQgQUdDX0N0cmw2CiAJCQlwbHRtcFs2XSA9IDB4ZjY2MzIxMTE7IC8vIDB4MTAxOCBBR0NfQ3RybDcKQEAgLTE1NzcsMjUgKzE1NzgsMjUgQEAKIAkJCXBsdG1wWzldID0gMHgwMDAwMkE3OTsgLy8gMHgxMDI0IEFHQ19DdHJsMTAKIAkJCXBsdG1wWzEwXSA9IDB4NDAwMDA1Mjg7IC8vIDB4NDAwMDAxMjg7IE1vZGlmeSBmb3IgMzMncyAxLjAuOTUKIAkJCXBsdG1wWzExXSA9IDB4MjMyZmRmMzA7IC8vIDB4MTAyYyBBX0FDUV9DdHJsCi0JCQlwV2IzNVJlZy0+QkIyQyA9IDB4MjMyZmRmMzA7IC8vTW9kaWZ5IGZvciAzMydzIDEuMC45NS54eHggdmVyc2lvbiwgYW50ZW5uYSAxCisJCQlyZWctPkJCMkMgPSAweDIzMmZkZjMwOyAvL01vZGlmeSBmb3IgMzMncyAxLjAuOTUueHh4IHZlcnNpb24sIGFudGVubmEgMQogCQkJV2IzNVJlZ19CdXJzdFdyaXRlKCBwSHdEYXRhLCAweDEwMDAsIHBsdG1wLCAxMiwgQVVUT19JTkNSRU1FTlQgKTsKIAogCQkJcGx0bXBbMF0gPSAweDAwMDAyQzU0OyAvLyAweDEwMzAgQl9BQ1FfQ3RybAotCQkJcFdiMzVSZWctPkJCMzAgPSAweDAwMDAyQzU0OworCQkJcmVnLT5CQjMwID0gMHgwMDAwMkM1NDsKIAkJCXBsdG1wWzFdID0gMHgwMEMwRDZDNTsgLy8gMHgxMDM0IEFfVFhSWF9DdHJsCiAJCQlwbHRtcFsyXSA9IDB4NUI2Qzg3Njk7IC8vIDB4MTAzOCBCX1RYUlhfQ3RybAogCQkJcGx0bXBbM10gPSAweDAwMDAwMDAwOyAvLyAweDEwM2MgMTFhIFRYIExTIGZpbHRlcgotCQkJcFdiMzVSZWctPkJCM0MgPSAweDAwMDAwMDAwOworCQkJcmVnLT5CQjNDID0gMHgwMDAwMDAwMDsKIAkJCXBsdG1wWzRdID0gMHgwMDAwM0YyOTsgLy8gMHgxMDQwIDExYSBUWCBMUyBmaWx0ZXIKIAkJCXBsdG1wWzVdID0gMHgwRUZFRkJGRTsgLy8gMHgxMDQ0IDExYSBUWCBMUyBmaWx0ZXIKIAkJCXBsdG1wWzZdID0gMHgwMDQ1M0IyNDsgLy8gMHgxMDQ4IDExYiBUWCBSQyBmaWx0ZXIKIAkJCXBsdG1wWzddID0gMHgwRDAwRkRGRjsgLy8gMHgxMDRjIDExYiBUWCBSQyBmaWx0ZXIKIAkJCXBsdG1wWzhdID0gMHgyNzEwNjIwODsgLy8gMHgxMDUwIE1PREVfQ3RybAotCQkJcFdiMzVSZWctPkJCNTAgPSAweDI3MTA2MjA4OworCQkJcmVnLT5CQjUwID0gMHgyNzEwNjIwODsKIAkJCXBsdG1wWzldID0gMDsgLy8gMHgxMDU0Ci0JCQlwV2IzNVJlZy0+QkI1NCA9IDB4MDAwMDAwMDA7CisJCQlyZWctPkJCNTQgPSAweDAwMDAwMDAwOwogCQkJcGx0bXBbMTBdID0gMHg2NDY0NjQ2NDsgLy8gMHgxMDU4IElRX0FscGhhCi0JCQlwV2IzNVJlZy0+QkI1OCA9IDB4NjQ2NDY0NjQ7CisJCQlyZWctPkJCNTggPSAweDY0NjQ2NDY0OwogCQkJcGx0bXBbMTFdID0gMHhBQTI4QzAwMDsgLy8gMHgxMDVjIERDX0NhbmNlbAogCQkJV2IzNVJlZ19CdXJzdFdyaXRlKCBwSHdEYXRhLCAweDEwMzAsIHBsdG1wLCAxMiwgQVVUT19JTkNSRU1FTlQgKTsKIApAQCAtMTYwOCw3ICsxNjA5LDcgQEAKIAkJCXBsdG1wWzFdID0gMHg5YWZmYWVhNDsgLy8gMHgxMDA0IEFHQ19DdHJsMgogCQkJcGx0bXBbMl0gPSAweDU1ZDAwYTA0OyAvLyAweDEwMDggQUdDX0N0cmwzCiAJCQlwbHRtcFszXSA9IDB4ZjRmZjE2MzI7IC8vIDB4ZWZmZjFhMzQ7IC8vIDB4MTAwYyBBR0NfQ3RybDQgTW9kaWZ5IGZvciAzMydzIDEuMC45NQotCQkJcFdiMzVSZWctPkJCMEMgPSAweGY0ZmYxNjMyOyAvLyAweGVmZmYxYTM0OyBNb2RpZnkgZm9yIDMzJ3MgMS4wLjk1CisJCQlyZWctPkJCMEMgPSAweGY0ZmYxNjMyOyAvLyAweGVmZmYxYTM0OyBNb2RpZnkgZm9yIDMzJ3MgMS4wLjk1CiAJCQlwbHRtcFs0XSA9IDB4MGZhYmUwYjc7IC8vIDB4MTAxMCBBR0NfQ3RybDUKIAkJCXBsdG1wWzVdID0gMHgwMGNhYTMzMjsgLy8gMHgxMDE0IEFHQ19DdHJsNgogCQkJcGx0bXBbNl0gPSAweGY4NjMyMTEyOyAvLyAweGY2NjMyMTExOyAvLyAweDEwMTggQUdDX0N0cmw3IE1vZGlmeSBmb3IgMzMncyAxLjAuOTUKQEAgLTE2MTcsMjUgKzE2MTgsMjUgQEAKIAkJCXBsdG1wWzldID0gMHgwMDAwMkE3OTsgLy8gMHgxMDI0IEFHQ19DdHJsMTAKIAkJCXBsdG1wWzEwXSA9IDB4NDAwMDA1Mjg7IC8vIDB4NDAwMDAxMjg7IG1vZGlmeSBmb3IgMzMncyAxLjAuOTUKIAkJCXBsdG1wWzExXSA9IDB4MjMyZmRmMzA7IC8vIDB4MTAyYyBBX0FDUV9DdHJsCi0JCQlwV2IzNVJlZy0+QkIyQyA9IDB4MjMyZmRmMzA7IC8vTW9kaWZ5IGZvciAzMydzIDEuMC45NS54eHggdmVyc2lvbiwgYW50ZW5uYSAxCisJCQlyZWctPkJCMkMgPSAweDIzMmZkZjMwOyAvL01vZGlmeSBmb3IgMzMncyAxLjAuOTUueHh4IHZlcnNpb24sIGFudGVubmEgMQogCQkJV2IzNVJlZ19CdXJzdFdyaXRlKCBwSHdEYXRhLCAweDEwMDAsIHBsdG1wLCAxMiwgQVVUT19JTkNSRU1FTlQgKTsKIAogCQkJcGx0bXBbMF0gPSAweDAwMDAyQzU0OyAvLyAweDEwMzAgQl9BQ1FfQ3RybAotCQkJcFdiMzVSZWctPkJCMzAgPSAweDAwMDAyQzU0OworCQkJcmVnLT5CQjMwID0gMHgwMDAwMkM1NDsKIAkJCXBsdG1wWzFdID0gMHgwMEMwRDZDNTsgLy8gMHgxMDM0IEFfVFhSWF9DdHJsCiAJCQlwbHRtcFsyXSA9IDB4NWIyYzg3Njk7IC8vIDB4NUI2Qzg3Njk7IC8vIDB4MTAzOCBCX1RYUlhfQ3RybCBNb2RpZnkgZm9yIDMzJ3MgMS4wLjk1CiAJCQlwbHRtcFszXSA9IDB4MDAwMDAwMDA7IC8vIDB4MTAzYyAxMWEgVFggTFMgZmlsdGVyCi0JCQlwV2IzNVJlZy0+QkIzQyA9IDB4MDAwMDAwMDA7CisJCQlyZWctPkJCM0MgPSAweDAwMDAwMDAwOwogCQkJcGx0bXBbNF0gPSAweDAwMDAzRjI5OyAvLyAweDEwNDAgMTFhIFRYIExTIGZpbHRlcgogCQkJcGx0bXBbNV0gPSAweDBFRkVGQkZFOyAvLyAweDEwNDQgMTFhIFRYIExTIGZpbHRlcgogCQkJcGx0bXBbNl0gPSAweDAwMmMyNjE3OyAvLyAweDAwNDUzQjI0OyAvLyAweDEwNDggMTFiIFRYIFJDIGZpbHRlciBNb2RpZnkgZm9yIDMzJ3MgMS4wLjk1CiAJCQlwbHRtcFs3XSA9IDB4MDgwMGZlZmY7IC8vIDB4MEQwMEZERkY7IC8vIDB4MTA0YyAxMWIgVFggUkMgZmlsdGVyIE1vZGlmeSBmb3IgMzMncyAxLjAuOTUKIAkJCXBsdG1wWzhdID0gMHgyNzEwNjIwODsgLy8gMHgxMDUwIE1PREVfQ3RybAotCQkJcFdiMzVSZWctPkJCNTAgPSAweDI3MTA2MjA4OworCQkJcmVnLT5CQjUwID0gMHgyNzEwNjIwODsKIAkJCXBsdG1wWzldID0gMDsgLy8gMHgxMDU0Ci0JCQlwV2IzNVJlZy0+QkI1NCA9IDB4MDAwMDAwMDA7CisJCQlyZWctPkJCNTQgPSAweDAwMDAwMDAwOwogCQkJcGx0bXBbMTBdID0gMHg2NDY0NGE0YTsgLy8gMHg2NDY0NjQ2NDsgLy8gMHgxMDU4IElRX0FscGhhIE1vZGlmeSBmb3IgMzMncyAxLjAuOTUKLQkJCXBXYjM1UmVnLT5CQjU4ID0gMHg2NDY0NjQ2NDsKKwkJCXJlZy0+QkI1OCA9IDB4NjQ2NDY0NjQ7CiAJCQlwbHRtcFsxMV0gPSAweEFBMjhDMDAwOyAvLyAweDEwNWMgRENfQ2FuY2VsCiAJCQlXYjM1UmVnX0J1cnN0V3JpdGUoIHBId0RhdGEsIDB4MTAzMCwgcGx0bXAsIDEyLCBBVVRPX0lOQ1JFTUVOVCApOwogCkBAIC0xNjQ4LDcgKzE2NDksNyBAQAogCQkJcGx0bXBbMV0gPSAweDlhZmZhZmIyOyAvLyAweDEwMDQgQUdDX0N0cmwyCiAJCQlwbHRtcFsyXSA9IDB4NTVkMDBhMDQ7IC8vIDB4MTAwOCBBR0NfQ3RybDMKIAkJCXBsdG1wWzNdID0gMHhGRkZkMjAzYzsgLy8gMHhGRkZiMjAzYTsgLy8gMHgxMDBjIEFHQ19DdHJsNCBNb2RpZnkgZm9yIDMzJ3MgMS4wLjk1Lnh4eCB2ZXJzaW9uCi0JCQlwV2IzNVJlZy0+QkIwQyA9IDB4RkZGZDIwM2M7CisJCQlyZWctPkJCMEMgPSAweEZGRmQyMDNjOwogCQkJcGx0bXBbNF0gPSAwWDBGQkZEQ2M1OyAvLyAwWDBGQkZEQ0EwOyAvLyAweDEwMTAgQUdDX0N0cmw1IC8vMHgwRkIyRTBCNyBNb2RpZnkgZm9yIDMzJ3MgMS4wLjk1Lnh4eCB2ZXJzaW9uCiAJCQlwbHRtcFs1XSA9IDB4MDBjYWEzMzI7IC8vIDB4MDBjYWEzMzM7IC8vIDB4MTAxNCBBR0NfQ3RybDYgTW9kaWZ5IGZvciAzMydzIDEuMC45NS54eHggdmVyc2lvbgogCQkJcGx0bXBbNl0gPSAwWEY2NjMyMTExOyAvLyAwWEYxNjMyMTEyOyAvLyAweDEwMTggQUdDX0N0cmw3CQkvLzB4ZjY2MzIxMTIgTW9kaWZ5IGZvciAzMydzIDEuMC45NS54eHggdmVyc2lvbgpAQCAtMTY1NywyNyArMTY1OCwyNyBAQAogCQkJcGx0bXBbOV0gPSAweDAwMDAyQTc5OyAvLyAweDEwMjQgQUdDX0N0cmwxMAogCQkJcGx0bXBbMTBdID0gMFg0MDAwMDUyODsJCQkJCQkJLy8weDQwMDAwMjI4CiAJCQlwbHRtcFsxMV0gPSAweDIzMmRmRjMwOyAvLyAweDIzMkE5RjMwOyAvLyAweDEwMmMgQV9BQ1FfQ3RybAkvLzB4MjMyYTk3MzAKLQkJCXBXYjM1UmVnLT5CQjJDID0gMHgyMzJkZkYzMDsgLy9Nb2RpZnkgZm9yIDMzJ3MgMS4wLjk1Lnh4eCB2ZXJzaW9uLCBhbnRlbm5hIDEKKwkJCXJlZy0+QkIyQyA9IDB4MjMyZGZGMzA7IC8vTW9kaWZ5IGZvciAzMydzIDEuMC45NS54eHggdmVyc2lvbiwgYW50ZW5uYSAxCiAJCQlXYjM1UmVnX0J1cnN0V3JpdGUoIHBId0RhdGEsIDB4MTAwMCwgcGx0bXAsIDEyLCBBVVRPX0lOQ1JFTUVOVCApOwogCiAJCQlwbHRtcFswXSA9IDB4MDAwMDJDNTQ7IC8vIDB4MTAzMCBCX0FDUV9DdHJsCi0JCQlwV2IzNVJlZy0+QkIzMCA9IDB4MDAwMDJDNTQ7CisJCQlyZWctPkJCMzAgPSAweDAwMDAyQzU0OwogCQkJcGx0bXBbMV0gPSAweDAwQzBENkM1OyAvLyAweDEwMzQgQV9UWFJYX0N0cmwKIAkJCXBsdG1wWzJdID0gMHg1QjJDODc2OTsgLy8gMHgxMDM4IEJfVFhSWF9DdHJsCS8vMHg1QjZDODc2OQogCQkJcGx0bXBbM10gPSAweDAwMDAwMDAwOyAvLyAweDEwM2MgMTFhIFRYIExTIGZpbHRlcgotCQkJcFdiMzVSZWctPkJCM0MgPSAweDAwMDAwMDAwOworCQkJcmVnLT5CQjNDID0gMHgwMDAwMDAwMDsKIAkJCXBsdG1wWzRdID0gMHgwMDAwM0YyOTsgLy8gMHgxMDQwIDExYSBUWCBMUyBmaWx0ZXIKIAkJCXBsdG1wWzVdID0gMHgwRUZFRkJGRTsgLy8gMHgxMDQ0IDExYSBUWCBMUyBmaWx0ZXIKIAkJCXBsdG1wWzZdID0gQkI0OF9ERUZBVUxUX0FMMjIzMF8xMUc7IC8vIDB4MTA0OCAxMWIgVFggUkMgZmlsdGVyIDIwMDYwNjEzLjIKLQkJCXBXYjM1UmVnLT5CQjQ4ID0gQkI0OF9ERUZBVUxUX0FMMjIzMF8xMUc7IC8vIDIwMDUxMjIxIGNoMTQgMjAwNjA2MTMuMgorCQkJcmVnLT5CQjQ4ID0gQkI0OF9ERUZBVUxUX0FMMjIzMF8xMUc7IC8vIDIwMDUxMjIxIGNoMTQgMjAwNjA2MTMuMgogCQkJcGx0bXBbN10gPSBCQjRDX0RFRkFVTFRfQUwyMjMwXzExRzsgLy8gMHgxMDRjIDExYiBUWCBSQyBmaWx0ZXIgMjAwNjA2MTMuMgotCQkJcFdiMzVSZWctPkJCNEMgPSBCQjRDX0RFRkFVTFRfQUwyMjMwXzExRzsgLy8gMjAwNjA2MTMuMSAyMDA2MDYxMy4yCisJCQlyZWctPkJCNEMgPSBCQjRDX0RFRkFVTFRfQUwyMjMwXzExRzsgLy8gMjAwNjA2MTMuMSAyMDA2MDYxMy4yCiAJCQlwbHRtcFs4XSA9IDB4MjcxMDYyMDA7IC8vIDB4MTA1MCBNT0RFX0N0cmwKLQkJCXBXYjM1UmVnLT5CQjUwID0gMHgyNzEwNjIwMDsKKwkJCXJlZy0+QkI1MCA9IDB4MjcxMDYyMDA7CiAJCQlwbHRtcFs5XSA9IDA7IC8vIDB4MTA1NAotCQkJcFdiMzVSZWctPkJCNTQgPSAweDAwMDAwMDAwOworCQkJcmVnLT5CQjU0ID0gMHgwMDAwMDAwMDsKIAkJCXBsdG1wWzEwXSA9IDB4NTI1MjQyNDI7IC8vIDB4MTA1OCBJUV9BbHBoYQotCQkJcFdiMzVSZWctPkJCNTggPSAweDUyNTI0MjQyOworCQkJcmVnLT5CQjU4ID0gMHg1MjUyNDI0MjsKIAkJCXBsdG1wWzExXSA9IDB4QUEwQUMwMDA7IC8vIDB4MTA1YyBEQ19DYW5jZWwKIAkJCVdiMzVSZWdfQnVyc3RXcml0ZSggcEh3RGF0YSwgMHgxMDMwLCBwbHRtcCwgMTIsIEFVVE9fSU5DUkVNRU5UICk7CiAKQEAgLTE2OTAsNyArMTY5MSw3IEBACiAJCQlwbHRtcFsxXSA9IDB4OWFmZmFmYjI7IC8vIDB4MTAwNCBBR0NfQ3RybDIKIAkJCXBsdG1wWzJdID0gMHg1NWQwMGEwNDsgLy8gMHgxMDA4IEFHQ19DdHJsMwogCQkJcGx0bXBbM10gPSAweEZGRmQyMDNjOyAvLyAweEZGRmIyMDNhOyAvLyAweDEwMGMgQUdDX0N0cmw0IE1vZGlmeSBmb3IgMzMncyAxLjAuOTUueHh4IHZlcnNpb24KLQkJCXBXYjM1UmVnLT5CQjBDID0gMHhGRkZkMjAzYzsKKwkJCXJlZy0+QkIwQyA9IDB4RkZGZDIwM2M7CiAJCQlwbHRtcFs0XSA9IDBYMEZCRkRDYzU7IC8vIDBYMEZCRkRDQTA7IC8vIDB4MTAxMCBBR0NfQ3RybDUgLy8weDBGQjJFMEI3IE1vZGlmeSBmb3IgMzMncyAxLjAuOTUueHh4IHZlcnNpb24KIAkJCXBsdG1wWzVdID0gMHgwMGNhYTMzMjsgLy8gMHgwMGNhYTMzMzsgLy8gMHgxMDE0IEFHQ19DdHJsNiBNb2RpZnkgZm9yIDMzJ3MgMS4wLjk1Lnh4eCB2ZXJzaW9uCiAJCQlwbHRtcFs2XSA9IDBYRjY2MzIxMTE7IC8vIDBYRjE2MzIxMTI7IC8vIDB4MTAxOCBBR0NfQ3RybDcJCS8vMHhmNjYzMjExMiBNb2RpZnkgZm9yIDMzJ3MgMS4wLjk1Lnh4eCB2ZXJzaW9uCkBAIC0xNjk5LDI3ICsxNzAwLDI3IEBACiAJCQlwbHRtcFs5XSA9IDB4MDAwMDJBNzk7IC8vIDB4MTAyNCBBR0NfQ3RybDEwCiAJCQlwbHRtcFsxMF0gPSAwWDQwMDAwNTI4OwkJCQkJCQkvLzB4NDAwMDAyMjgKIAkJCXBsdG1wWzExXSA9IDB4MjMyZGZGMzA7IC8vIDB4MjMyQTlGMzA7IC8vIDB4MTAyYyBBX0FDUV9DdHJsCS8vMHgyMzJhOTczMAotCQkJcFdiMzVSZWctPkJCMkMgPSAweDIzMmRmRjMwOyAvL01vZGlmeSBmb3IgMzMncyAxLjAuOTUueHh4IHZlcnNpb24sIGFudGVubmEgMQorCQkJcmVnLT5CQjJDID0gMHgyMzJkZkYzMDsgLy9Nb2RpZnkgZm9yIDMzJ3MgMS4wLjk1Lnh4eCB2ZXJzaW9uLCBhbnRlbm5hIDEKIAkJCVdiMzVSZWdfQnVyc3RXcml0ZSggcEh3RGF0YSwgMHgxMDAwLCBwbHRtcCwgMTIsIEFVVE9fSU5DUkVNRU5UICk7CiAKIAkJCXBsdG1wWzBdID0gMHgwMDAwMkM1NDsgLy8gMHgxMDMwIEJfQUNRX0N0cmwKLQkJCXBXYjM1UmVnLT5CQjMwID0gMHgwMDAwMkM1NDsKKwkJCXJlZy0+QkIzMCA9IDB4MDAwMDJDNTQ7CiAJCQlwbHRtcFsxXSA9IDB4MDBDMEQ2QzU7IC8vIDB4MTAzNCBBX1RYUlhfQ3RybAogCQkJcGx0bXBbMl0gPSAweDVCMkM4NzY5OyAvLyAweDEwMzggQl9UWFJYX0N0cmwJLy8weDVCNkM4NzY5CiAJCQlwbHRtcFszXSA9IDB4MDAwMDAwMDA7IC8vIDB4MTAzYyAxMWEgVFggTFMgZmlsdGVyCi0JCQlwV2IzNVJlZy0+QkIzQyA9IDB4MDAwMDAwMDA7CisJCQlyZWctPkJCM0MgPSAweDAwMDAwMDAwOwogCQkJcGx0bXBbNF0gPSAweDAwMDAzRjI5OyAvLyAweDEwNDAgMTFhIFRYIExTIGZpbHRlcgogCQkJcGx0bXBbNV0gPSAweDBFRkVGQkZFOyAvLyAweDEwNDQgMTFhIFRYIExTIGZpbHRlcgogCQkJcGx0bXBbNl0gPSBCQjQ4X0RFRkFVTFRfQUwyMjMwXzExRzsgLy8gMHgxMDQ4IDExYiBUWCBSQyBmaWx0ZXIgMjAwNjA2MTMuMgotCQkJcFdiMzVSZWctPkJCNDggPSBCQjQ4X0RFRkFVTFRfQUwyMjMwXzExRzsgLy8gMjAwNTEyMjEgY2gxNCAyMDA2MDYxMy4yCisJCQlyZWctPkJCNDggPSBCQjQ4X0RFRkFVTFRfQUwyMjMwXzExRzsgLy8gMjAwNTEyMjEgY2gxNCAyMDA2MDYxMy4yCiAJCQlwbHRtcFs3XSA9IEJCNENfREVGQVVMVF9BTDIyMzBfMTFHOyAvLyAweDEwNGMgMTFiIFRYIFJDIGZpbHRlciAyMDA2MDYxMy4yCi0JCQlwV2IzNVJlZy0+QkI0QyA9IEJCNENfREVGQVVMVF9BTDIyMzBfMTFHOyAvLyAyMDA2MDYxMy4xCisJCQlyZWctPkJCNEMgPSBCQjRDX0RFRkFVTFRfQUwyMjMwXzExRzsgLy8gMjAwNjA2MTMuMQogCQkJcGx0bXBbOF0gPSAweDI3MTA2MjAwOyAvLyAweDEwNTAgTU9ERV9DdHJsCi0JCQlwV2IzNVJlZy0+QkI1MCA9IDB4MjcxMDYyMDA7CisJCQlyZWctPkJCNTAgPSAweDI3MTA2MjAwOwogCQkJcGx0bXBbOV0gPSAwOyAvLyAweDEwNTQKLQkJCXBXYjM1UmVnLT5CQjU0ID0gMHgwMDAwMDAwMDsKKwkJCXJlZy0+QkI1NCA9IDB4MDAwMDAwMDA7CiAJCQlwbHRtcFsxMF0gPSAweDUyNTIzMjMyOyAvLyAyMDA2MDQxOSAweDUyNTI0MjQyOyAvLyAweDEwNTggSVFfQWxwaGEKLQkJCXBXYjM1UmVnLT5CQjU4ID0gMHg1MjUyMzIzMjsgLy8gMjAwNjA0MTkgMHg1MjUyNDI0MjsKKwkJCXJlZy0+QkI1OCA9IDB4NTI1MjMyMzI7IC8vIDIwMDYwNDE5IDB4NTI1MjQyNDI7CiAJCQlwbHRtcFsxMV0gPSAweEFBMEFDMDAwOyAvLyAweDEwNWMgRENfQ2FuY2VsCiAJCQlXYjM1UmVnX0J1cnN0V3JpdGUoIHBId0RhdGEsIDB4MTAzMCwgcGx0bXAsIDEyLCBBVVRPX0lOQ1JFTUVOVCApOwogCkBAIC0xNzMyLDcgKzE3MzMsNyBAQAogCQkJcGx0bXBbMV0gPSAweDlhZmZhZmIyOyAvLyAweDEwMDQgQUdDX0N0cmwyCiAJCQlwbHRtcFsyXSA9IDB4NTVkMDBhMDQ7IC8vIDB4MTAwOCBBR0NfQ3RybDMKIAkJCXBsdG1wWzNdID0gMHhGRkZiMjAzYTsgLy8gMHgxMDBjIEFHQ19DdHJsNAotCQkJcFdiMzVSZWctPkJCMGMgPSAweEZGRmIyMDNhOworCQkJcmVnLT5CQjBjID0gMHhGRkZiMjAzYTsKIAkJCXBsdG1wWzRdID0gMHgwRkJGRENCNzsgLy8gMHgxMDEwIEFHQ19DdHJsNQogCQkJcGx0bXBbNV0gPSAweDAwY2FhMzMzOyAvLyAweDEwMTQgQUdDX0N0cmw2CiAJCQlwbHRtcFs2XSA9IDB4ZjY2MzIxMTI7IC8vIDB4MTAxOCBBR0NfQ3RybDcKQEAgLTE3NDEsMjUgKzE3NDIsMjUgQEAKIAkJCXBsdG1wWzldID0gMHgwMDAwMkE3OTsgLy8gMHgxMDI0IEFHQ19DdHJsMTAKIAkJCXBsdG1wWzEwXSA9IDB4NDAwMDAyMjg7CiAJCQlwbHRtcFsxMV0gPSAweDIzMkE5RjMwOy8vIDB4MTAyYyBBX0FDUV9DdHJsCi0JCQlwV2IzNVJlZy0+QkIyYyA9IDB4MjMyQTlGMzA7CisJCQlyZWctPkJCMmMgPSAweDIzMkE5RjMwOwogCQkJV2IzNVJlZ19CdXJzdFdyaXRlKCBwSHdEYXRhLCAweDEwMDAsIHBsdG1wLCAxMiwgQVVUT19JTkNSRU1FTlQgKTsKIAogCQkJcGx0bXBbMF0gPSAweDAwMDAyQzU0OyAvLyAweDEwMzAgQl9BQ1FfQ3RybAotCQkJcFdiMzVSZWctPkJCMzAgPSAweDAwMDAyQzU0OworCQkJcmVnLT5CQjMwID0gMHgwMDAwMkM1NDsKIAkJCXBsdG1wWzFdID0gMHgwMEMwRDZDNTsgLy8gMHgxMDM0IEFfVFhSWF9DdHJsCiAJCQlwbHRtcFsyXSA9IDB4NUIyQzg3Njk7IC8vIDB4MTAzOCBCX1RYUlhfQ3RybAogCQkJcGx0bXBbM10gPSAweDAwMDAwMDAwOyAvLyAweDEwM2MgMTFhIFRYIExTIGZpbHRlcgotCQkJcFdiMzVSZWctPkJCM2MgPSAweDAwMDAwMDAwOworCQkJcmVnLT5CQjNjID0gMHgwMDAwMDAwMDsKIAkJCXBsdG1wWzRdID0gMHgwMDAwM0YyOTsgLy8gMHgxMDQwIDExYSBUWCBMUyBmaWx0ZXIKIAkJCXBsdG1wWzVdID0gMHgwRUZFRkJGRTsgLy8gMHgxMDQ0IDExYSBUWCBMUyBmaWx0ZXIKIAkJCXBsdG1wWzZdID0gMHgwMDQ1M0IyNDsgLy8gMHgxMDQ4IDExYiBUWCBSQyBmaWx0ZXIKIAkJCXBsdG1wWzddID0gMHgwRTAwRkVGRjsgLy8gMHgxMDRjIDExYiBUWCBSQyBmaWx0ZXIKIAkJCXBsdG1wWzhdID0gMHgyNzEwNjIwMDsgLy8gMHgxMDUwIE1PREVfQ3RybAotCQkJcFdiMzVSZWctPkJCNTAgPSAweDI3MTA2MjAwOworCQkJcmVnLT5CQjUwID0gMHgyNzEwNjIwMDsKIAkJCXBsdG1wWzldID0gMDsgLy8gMHgxMDU0Ci0JCQlwV2IzNVJlZy0+QkI1NCA9IDB4MDAwMDAwMDA7CisJCQlyZWctPkJCNTQgPSAweDAwMDAwMDAwOwogCQkJcGx0bXBbMTBdID0gMHg2NDY0NTI1MjsgLy8gMHgxMDU4IElRX0FscGhhCi0JCQlwV2IzNVJlZy0+QkI1OCA9IDB4NjQ2NDUyNTI7CisJCQlyZWctPkJCNTggPSAweDY0NjQ1MjUyOwogCQkJcGx0bXBbMTFdID0gMHhBQTBBQzAwMDsgLy8gMHgxMDVjIERDX0NhbmNlbAogCQkJV2IzNVJlZ19CdXJzdFdyaXRlKCBwSHdEYXRhLCAweDEwMzAsIHBsdG1wLCAxMiwgQVVUT19JTkNSRU1FTlQgKTsKICovCkBAIC0xNzc1LDcgKzE3NzYsNyBAQAogCQkJcGx0bXBbMV0gPSAweDlBRkY5QUJBOyAvLyAweDEwMDQgQUdDX0N0cmwyCiAJCQlwbHRtcFsyXSA9IDB4NTVEMDBBMDQ7IC8vIDB4MTAwOCBBR0NfQ3RybDMKIAkJCXBsdG1wWzNdID0gMHhFRUU5MUMzMjsgLy8gMHgxMDBjIEFHQ19DdHJsNAotCQkJcFdiMzVSZWctPkJCMEMgPSAweEVFRTkxQzMyOworCQkJcmVnLT5CQjBDID0gMHhFRUU5MUMzMjsKIAkJCXBsdG1wWzRdID0gMHgwRkFDRENDNTsgLy8gMHgxMDEwIEFHQ19DdHJsNQogCQkJcGx0bXBbNV0gPSAweDAwMEFBMzQ0OyAvLyAweDEwMTQgQUdDX0N0cmw2CiAJCQlwbHRtcFs2XSA9IDB4MjIyMjIyMjE7IC8vIDB4MTAxOCBBR0NfQ3RybDcKQEAgLTE3ODQsMjcgKzE3ODUsMjcgQEAKIAkJCXBsdG1wWzldID0gMHhBOTAwMkE3OTsgLy8gMHgxMDI0IEFHQ19DdHJsMTAKIAkJCXBsdG1wWzEwXSA9IDB4NDAwMDA1Mjg7IC8vIDB4MTAyOAogCQkJcGx0bXBbMTFdID0gMHgyMzQ1N0YzMDsgLy8gMHgxMDJjIEFfQUNRX0N0cmwKLQkJCXBXYjM1UmVnLT5CQjJDID0gMHgyMzQ1N0YzMDsKKwkJCXJlZy0+QkIyQyA9IDB4MjM0NTdGMzA7CiAJCQlXYjM1UmVnX0J1cnN0V3JpdGUoIHBId0RhdGEsIDB4MTAwMCwgcGx0bXAsIDEyLCBBVVRPX0lOQ1JFTUVOVCApOwogCiAJCQlwbHRtcFswXSA9IDB4MDAwMDJDNTQ7IC8vIDB4MTAzMCBCX0FDUV9DdHJsCi0JCQlwV2IzNVJlZy0+QkIzMCA9IDB4MDAwMDJDNTQ7CisJCQlyZWctPkJCMzAgPSAweDAwMDAyQzU0OwogCQkJcGx0bXBbMV0gPSAweDAwQzBENkM1OyAvLyAweDEwMzQgQV9UWFJYX0N0cmwKIAkJCXBsdG1wWzJdID0gMHg1QjJDODc2OTsgLy8gMHgxMDM4IEJfVFhSWF9DdHJsCiAJCQlwbHRtcFszXSA9IHBId0RhdGEtPkJCM2NfY2FsOyAvLyAweDEwM2MgMTFhIFRYIExTIGZpbHRlcgotCQkJcFdiMzVSZWctPkJCM0MgPSBwSHdEYXRhLT5CQjNjX2NhbDsKKwkJCXJlZy0+QkIzQyA9IHBId0RhdGEtPkJCM2NfY2FsOwogCQkJcGx0bXBbNF0gPSAweDAwMDAzRjI5OyAvLyAweDEwNDAgMTFhIFRYIExTIGZpbHRlcgogCQkJcGx0bXBbNV0gPSAweDBFRkVGQkZFOyAvLyAweDEwNDQgMTFhIFRYIExTIGZpbHRlcgogCQkJcGx0bXBbNl0gPSBCQjQ4X0RFRkFVTFRfV0IyNDJfMTFHOyAvLyAweDEwNDggMTFiIFRYIFJDIGZpbHRlciAyMDA2MDYxMy4yCi0JCQlwV2IzNVJlZy0+QkI0OCA9IEJCNDhfREVGQVVMVF9XQjI0Ml8xMUc7IC8vIDIwMDYwNjEzLjEgMjAwNjA2MTMuMgorCQkJcmVnLT5CQjQ4ID0gQkI0OF9ERUZBVUxUX1dCMjQyXzExRzsgLy8gMjAwNjA2MTMuMSAyMDA2MDYxMy4yCiAJCQlwbHRtcFs3XSA9IEJCNENfREVGQVVMVF9XQjI0Ml8xMUc7IC8vIDB4MTA0YyAxMWIgVFggUkMgZmlsdGVyIDIwMDYwNjEzLjIKLQkJCXBXYjM1UmVnLT5CQjRDID0gQkI0Q19ERUZBVUxUX1dCMjQyXzExRzsgLy8gMjAwNjA2MTMuMSAyMDA2MDYxMy4yCisJCQlyZWctPkJCNEMgPSBCQjRDX0RFRkFVTFRfV0IyNDJfMTFHOyAvLyAyMDA2MDYxMy4xIDIwMDYwNjEzLjIKIAkJCXBsdG1wWzhdID0gMHgyNzEwNjIwODsgLy8gMHgxMDUwIE1PREVfQ3RybAotCQkJcFdiMzVSZWctPkJCNTAgPSAweDI3MTA2MjA4OworCQkJcmVnLT5CQjUwID0gMHgyNzEwNjIwODsKIAkJCXBsdG1wWzldID0gcEh3RGF0YS0+QkI1NF9jYWw7IC8vIDB4MTA1NAotCQkJcFdiMzVSZWctPkJCNTQgPSBwSHdEYXRhLT5CQjU0X2NhbDsKKwkJCXJlZy0+QkI1NCA9IHBId0RhdGEtPkJCNTRfY2FsOwogCQkJcGx0bXBbMTBdID0gMHg1MjUyMzEzMTsgLy8gMHgxMDU4IElRX0FscGhhCi0JCQlwV2IzNVJlZy0+QkI1OCA9IDB4NTI1MjMxMzE7CisJCQlyZWctPkJCNTggPSAweDUyNTIzMTMxOwogCQkJcGx0bXBbMTFdID0gMHhBQTBBQzAwMDsgLy8gMjAwNjA4MjUgMHhBQTJBQzAwMDsgLy8gMHgxMDVjIERDX0NhbmNlbAogCQkJV2IzNVJlZ19CdXJzdFdyaXRlKCBwSHdEYXRhLCAweDEwMzAsIHBsdG1wLCAxMiwgQVVUT19JTkNSRU1FTlQgKTsKIApAQCAtMTgxMywxNCArMTgxNCwxNCBAQAogICAgIH0KIAogCS8vIEZpbGwgdGhlIExOQSB0YWJsZQotCXBXYjM1UmVnLT5MTkFWYWx1ZVswXSA9ICh1OCkocFdiMzVSZWctPkJCMEMgJiAweGZmKTsKLQlwV2IzNVJlZy0+TE5BVmFsdWVbMV0gPSAwOwotCXBXYjM1UmVnLT5MTkFWYWx1ZVsyXSA9ICh1OCkoKHBXYjM1UmVnLT5CQjBDICYgMHhmZjAwKT4+OCk7Ci0JcFdiMzVSZWctPkxOQVZhbHVlWzNdID0gMDsKKwlyZWctPkxOQVZhbHVlWzBdID0gKHU4KShyZWctPkJCMEMgJiAweGZmKTsKKwlyZWctPkxOQVZhbHVlWzFdID0gMDsKKwlyZWctPkxOQVZhbHVlWzJdID0gKHU4KSgocmVnLT5CQjBDICYgMHhmZjAwKT4+OCk7CisJcmVnLT5MTkFWYWx1ZVszXSA9IDA7CiAKIAkvLyBGaWxsIFNRMyB0YWJsZQogCWZvciggaT0wOyBpPE1BWF9TUTNfRklMVEVSX1NJWkU7IGkrKyApCi0JCXBXYjM1UmVnLT5TUTNfZmlsdGVyW2ldID0gMHgyZjsgLy8gaGFsZiBvZiBCaXQgMCB+IDYKKwkJcmVnLT5TUTNfZmlsdGVyW2ldID0gMHgyZjsgLy8gaGFsZiBvZiBCaXQgMCB+IDYKIH0KIAogdm9pZCBzZXRfdHhfcG93ZXJfcGVyX2NoYW5uZWxfbWF4MjgyOSggIHBod19kYXRhX3QgcEh3RGF0YSwgIENoYW5JbmZvIENoYW5uZWwpCkBAIC0xOTAzLDcgKzE5MDQsNyBAQAogdm9pZAogUkZTeW50aGVzaXplcl9Td2l0Y2hpbmdDaGFubmVsKCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgQ2hhbkluZm8gQ2hhbm5lbCApCiB7Ci0JUFdCMzVSRUcgcFdiMzVSZWcgPSAmcEh3RGF0YS0+V2IzNVJlZzsKKwlzdHJ1Y3Qgd2IzNV9yZWcgKnJlZyA9ICZwSHdEYXRhLT5yZWc7CiAJdTMyCXBsdG1wWzE2XTsgLy8gVGhlIDE2IGlzIHRoZSBtYXhpbXVtIGNhcGFiaWxpdHkgb2YgaGFyZHdhcmUKIAl1MzIJY291bnQsIGx0bXA7CiAJdTgJaSwgaiwgbnVtYmVyOwpAQCAtMjA5MCw0MCArMjA5MSw0MCBAQAogCWlmKCBDaGFubmVsLmJhbmQgPD0gQkFORF9UWVBFX09GRE1fMjQgKQogCXsKICAgICAgICAgLy8gQkI6IHNlbGVjdCAyLjQgR0h6LCBiaXRbMTItMTFdPTAwCi0JCXBXYjM1UmVnLT5CQjUwICY9IH4oQklUKDExKXxCSVQoMTIpKTsKLQkJV2IzNVJlZ19Xcml0ZSggcEh3RGF0YSwgMHgxMDUwLCBwV2IzNVJlZy0+QkI1MCApOyAvLyBNT0RFX0N0cmwKKwkJcmVnLT5CQjUwICY9IH4oQklUKDExKXxCSVQoMTIpKTsKKwkJV2IzNVJlZ19Xcml0ZSggcEh3RGF0YSwgMHgxMDUwLCByZWctPkJCNTAgKTsgLy8gTU9ERV9DdHJsCiAgICAgICAgIC8vIE1BQzogc2VsZWN0IDIuNCBHSHosIGJpdFs1XT0wCi0JCXBXYjM1UmVnLT5NNzhfRVJQSW5mb3JtYXRpb24gJj0gfkJJVCg1KTsKLQkJV2IzNVJlZ19Xcml0ZSggcEh3RGF0YSwgMHgwODc4LCBwV2IzNVJlZy0+TTc4X0VSUEluZm9ybWF0aW9uICk7CisJCXJlZy0+TTc4X0VSUEluZm9ybWF0aW9uICY9IH5CSVQoNSk7CisJCVdiMzVSZWdfV3JpdGUoIHBId0RhdGEsIDB4MDg3OCwgcmVnLT5NNzhfRVJQSW5mb3JtYXRpb24gKTsKICAgICAgICAgLy8gZW5hYmxlIDExYiBCYXNlYmFuZAotCQlwV2IzNVJlZy0+QkIzMCAmPSB+QklUKDMxKTsKLQkJV2IzNVJlZ19Xcml0ZSggcEh3RGF0YSwgMHgxMDMwLCBwV2IzNVJlZy0+QkIzMCApOworCQlyZWctPkJCMzAgJj0gfkJJVCgzMSk7CisJCVdiMzVSZWdfV3JpdGUoIHBId0RhdGEsIDB4MTAzMCwgcmVnLT5CQjMwICk7CiAJfQogCWVsc2UgaWYoIChDaGFubmVsLmJhbmQgPT0gQkFORF9UWVBFX09GRE1fNSkgKQogCXsKICAgICAgICAgLy8gQkI6IHNlbGVjdCA1IEdIegotCQlwV2IzNVJlZy0+QkI1MCAmPSB+KEJJVCgxMSl8QklUKDEyKSk7CisJCXJlZy0+QkI1MCAmPSB+KEJJVCgxMSl8QklUKDEyKSk7CiAJCWlmIChDaGFubmVsLkNoYW5ObyA8PTY0ICkKLQkJCXBXYjM1UmVnLT5CQjUwIHw9IEJJVCgxMik7CQkJCS8vIDEwLTUuMjVHSHoKKwkJCXJlZy0+QkI1MCB8PSBCSVQoMTIpOwkJCQkvLyAxMC01LjI1R0h6CiAJCWVsc2UgaWYgKChDaGFubmVsLkNoYW5ObyA+PSAxMDApICYmIChDaGFubmVsLkNoYW5ObyA8PSAxMjQpKQotCQkJcFdiMzVSZWctPkJCNTAgfD0gQklUKDExKTsJCQkJLy8gMDEtNS40OEdIegorCQkJcmVnLT5CQjUwIHw9IEJJVCgxMSk7CQkJCS8vIDAxLTUuNDhHSHoKIAkJZWxzZSBpZiAoKENoYW5uZWwuQ2hhbk5vID49MTI4KSAmJiAoQ2hhbm5lbC5DaGFuTm8gPD0gMTYxKSkKLQkJCXBXYjM1UmVnLT5CQjUwIHw9IChCSVQoMTIpfEJJVCgxMSkpOwkvLyAxMS01Ljc3NUdIegorCQkJcmVnLT5CQjUwIHw9IChCSVQoMTIpfEJJVCgxMSkpOwkvLyAxMS01Ljc3NUdIegogCQllbHNlCS8vQ2hhbiAxODQgfiAxOTYgd2lsbCB1c2UgYml0WzEyLTExXSA9IDEwIGluIHZlcnNpb24gc2gtc3JjLTEuMi4yNQotCQkJcFdiMzVSZWctPkJCNTAgfD0gQklUKDEyKTsKLQkJV2IzNVJlZ19Xcml0ZSggcEh3RGF0YSwgMHgxMDUwLCBwV2IzNVJlZy0+QkI1MCApOyAvLyBNT0RFX0N0cmwKKwkJCXJlZy0+QkI1MCB8PSBCSVQoMTIpOworCQlXYjM1UmVnX1dyaXRlKCBwSHdEYXRhLCAweDEwNTAsIHJlZy0+QkI1MCApOyAvLyBNT0RFX0N0cmwKIAogCQkvLygxKSBNNzggc2hvdWxkIGFsd2F5IHVzZSAyLjRHIHNldHRpbmcgd2hlbiB1c2luZyBSRl9BSVJPSEFfNzIzMAogCQkvLygyKSBCQjMwIGhhcyBiZWVuIHVwZGF0ZWQgcHJldmlvdXNseS4KIAkJaWYgKHBId0RhdGEtPnBoeV90eXBlICE9IFJGX0FJUk9IQV83MjMwKQogCQl7CiAgICAgCSAgICAvLyBNQUM6IHNlbGVjdCA1IEdIeiwgYml0WzVdPTEKLQkJCXBXYjM1UmVnLT5NNzhfRVJQSW5mb3JtYXRpb24gfD0gQklUKDUpOwotCQkJV2IzNVJlZ19Xcml0ZSggcEh3RGF0YSwgMHgwODc4LCBwV2IzNVJlZy0+TTc4X0VSUEluZm9ybWF0aW9uICk7CisJCQlyZWctPk03OF9FUlBJbmZvcm1hdGlvbiB8PSBCSVQoNSk7CisJCQlXYjM1UmVnX1dyaXRlKCBwSHdEYXRhLCAweDA4NzgsIHJlZy0+TTc4X0VSUEluZm9ybWF0aW9uICk7CiAKICAgICAJICAgIC8vIGRpc2FibGUgMTFiIEJhc2ViYW5kCi0JCQlwV2IzNVJlZy0+QkIzMCB8PSBCSVQoMzEpOwotCQkJV2IzNVJlZ19Xcml0ZSggcEh3RGF0YSwgMHgxMDMwLCBwV2IzNVJlZy0+QkIzMCApOworCQkJcmVnLT5CQjMwIHw9IEJJVCgzMSk7CisJCQlXYjM1UmVnX1dyaXRlKCBwSHdEYXRhLCAweDEwMzAsIHJlZy0+QkIzMCApOwogCQl9CiAJfQogfQpAQCAtMjMxMywyMSArMjMxNCwyMSBAQAogLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogdm9pZCBEeHhfaW5pdGlhbCggIHBod19kYXRhX3QgcEh3RGF0YSApCiB7Ci0JUFdCMzVSRUcJcFdiMzVSZWcgPSAmcEh3RGF0YS0+V2IzNVJlZzsKKwlzdHJ1Y3Qgd2IzNV9yZWcgKnJlZyA9ICZwSHdEYXRhLT5yZWc7CiAKIAkvLyBPbGQgSUM6U2luZ2xlIG1vZGUgb25seS4KIAkvLyBOZXcgSUM6IG9wZXJhdGlvbiBkZWNpZGUgYnkgU29mdHdhcmUgc2V0IGJpdFs0XS4gMTptdWx0aXBsZSAwOiBzaW5nbGUKLQlwV2IzNVJlZy0+RDAwX0RtYUNvbnRyb2wgPSAweGMwMDAwMDA0OwkvL1R4b24sIFJ4b24sIG11bHRpcGxlIFJ4IGZvciBuZXcgNGsgRE1BCisJcmVnLT5EMDBfRG1hQ29udHJvbCA9IDB4YzAwMDAwMDQ7CS8vVHhvbiwgUnhvbiwgbXVsdGlwbGUgUnggZm9yIG5ldyA0ayBETUEKIAkJCQkJCQkJCQkJLy9UeG9uLCBSeG9uLCBzaW5nbGUgUnggZm9yIG9sZCA4ayBBU0lDCiAJaWYoICFIQUxfVVNCX01PREVfQlVSU1QoIHBId0RhdGEgKSApCi0JCXBXYjM1UmVnLT5EMDBfRG1hQ29udHJvbCA9IDB4YzAwMDAwMDA7Ly9UeG9uLCBSeG9uLCBzaW5nbGUgUnggZm9yIG5ldyA0ayBETUEKKwkJcmVnLT5EMDBfRG1hQ29udHJvbCA9IDB4YzAwMDAwMDA7Ly9UeG9uLCBSeG9uLCBzaW5nbGUgUnggZm9yIG5ldyA0ayBETUEKIAotCVdiMzVSZWdfV3JpdGVTeW5jKCBwSHdEYXRhLCAweDA0MDAsIHBXYjM1UmVnLT5EMDBfRG1hQ29udHJvbCApOworCVdiMzVSZWdfV3JpdGVTeW5jKCBwSHdEYXRhLCAweDA0MDAsIHJlZy0+RDAwX0RtYUNvbnRyb2wgKTsKIH0KIAogdm9pZCBNeHhfaW5pdGlhbCggIHBod19kYXRhX3QgcEh3RGF0YSApCiB7Ci0JUFdCMzVSRUcJcFdiMzVSZWcgPSAmcEh3RGF0YS0+V2IzNVJlZzsKKwlzdHJ1Y3Qgd2IzNV9yZWcgKnJlZyA9ICZwSHdEYXRhLT5yZWc7CiAJdTMyCQl0bXA7CiAJdTMyCQlwbHRtcFsxMV07CiAJdTE2CWk7CkBAIC0yMzM5LDIzICsyMzQwLDIzIEBACiAKIAkvLyBNMDAgYml0IHNldAogI2lmZGVmIF9JQlNTX0JFQUNPTl9TRVFfU1RJQ0tfCi0JcFdiMzVSZWctPk0wMF9NYWNDb250cm9sID0gMDsgLy8gU29sdmUgYmVhY29uIHNlcXVlbmNlIG51bWJlciBzdG9wIGJ5IHNvZnR3YXJlCisJcmVnLT5NMDBfTWFjQ29udHJvbCA9IDA7IC8vIFNvbHZlIGJlYWNvbiBzZXF1ZW5jZSBudW1iZXIgc3RvcCBieSBzb2Z0d2FyZQogI2Vsc2UKLQlwV2IzNVJlZy0+TTAwX01hY0NvbnRyb2wgPSAweDgwMDAwMDAwOyAvLyBTb2x2ZSBiZWFjb24gc2VxdWVuY2UgbnVtYmVyIHN0b3AgYnkgaGFyZHdhcmUKKwlyZWctPk0wMF9NYWNDb250cm9sID0gMHg4MDAwMDAwMDsgLy8gU29sdmUgYmVhY29uIHNlcXVlbmNlIG51bWJlciBzdG9wIGJ5IGhhcmR3YXJlCiAjZW5kaWYKIAogCS8vIE0yNCBkaXNhYmxlIGVudGVyIHBvd2VyIHNhdmUsIEJCIFJ4T24gYW5kIGVuYWJsZSBOQVYgYXR0YWNrCi0JcFdiMzVSZWctPk0yNF9NYWNDb250cm9sID0gMHgwODA0MDA0MjsKLQlwbHRtcFswXSA9IHBXYjM1UmVnLT5NMjRfTWFjQ29udHJvbDsKKwlyZWctPk0yNF9NYWNDb250cm9sID0gMHgwODA0MDA0MjsKKwlwbHRtcFswXSA9IHJlZy0+TTI0X01hY0NvbnRyb2w7CiAKIAlwbHRtcFsxXSA9IDA7IC8vIFNraXAgTTI4LCBiZWNhdXNlIG5vIGluaXRpYWxpemUgdmFsdWUgaXMgcmVxdWlyZWQuCiAKIAkvLyBNMkMgQ1dtaW4gYW5kIENXbWF4IHNldHRpbmcKIAlwSHdEYXRhLT5jd21pbiA9IERFRkFVTFRfQ1dNSU47CiAJcEh3RGF0YS0+Y3dtYXggPSBERUZBVUxUX0NXTUFYOwotCXBXYjM1UmVnLT5NMkNfTWFjQ29udHJvbCA9IERFRkFVTFRfQ1dNSU4gPDwgMTA7Ci0JcFdiMzVSZWctPk0yQ19NYWNDb250cm9sIHw9IERFRkFVTFRfQ1dNQVg7Ci0JcGx0bXBbMl0gPSBwV2IzNVJlZy0+TTJDX01hY0NvbnRyb2w7CisJcmVnLT5NMkNfTWFjQ29udHJvbCA9IERFRkFVTFRfQ1dNSU4gPDwgMTA7CisJcmVnLT5NMkNfTWFjQ29udHJvbCB8PSBERUZBVUxUX0NXTUFYOworCXBsdG1wWzJdID0gcmVnLT5NMkNfTWFjQ29udHJvbDsKIAogCS8vIE0zMCBCU1NJRAogCXBsdG1wWzNdID0gKih1MzIgKilwSHdEYXRhLT5ic3NpZDsKQEAgLTIzNjcsMzUgKzIzNjgsMzUgQEAKIAlwbHRtcFs0XSA9IHRtcDsKIAogCS8vIE0zOAotCXBXYjM1UmVnLT5NMzhfTWFjQ29udHJvbCA9IChERUZBVUxUX1JBVEVfUkVUUllfTElNSVQ8PDgpIHwgKERFRkFVTFRfTE9OR19SRVRSWV9MSU1JVCA8PCA0KSB8IERFRkFVTFRfU0hPUlRfUkVUUllfTElNSVQ7Ci0JcGx0bXBbNV0gPSBwV2IzNVJlZy0+TTM4X01hY0NvbnRyb2w7CisJcmVnLT5NMzhfTWFjQ29udHJvbCA9IChERUZBVUxUX1JBVEVfUkVUUllfTElNSVQ8PDgpIHwgKERFRkFVTFRfTE9OR19SRVRSWV9MSU1JVCA8PCA0KSB8IERFRkFVTFRfU0hPUlRfUkVUUllfTElNSVQ7CisJcGx0bXBbNV0gPSByZWctPk0zOF9NYWNDb250cm9sOwogCiAJLy8gTTNDCiAJdG1wID0gKERFRkFVTFRfUElGU1QgPDwgMjYpIHwgKERFRkFVTFRfRUlGU1QgPDwgMTYpIHwgKERFRkFVTFRfRElGU1QgPDwgOCkgfCAoREVGQVVMVF9TSUZTVCA8PCA0KSB8IERFRkFVTFRfT1NJRlNUIDsKLQlwV2IzNVJlZy0+TTNDX01hY0NvbnRyb2wgPSB0bXA7CisJcmVnLT5NM0NfTWFjQ29udHJvbCA9IHRtcDsKIAlwbHRtcFs2XSA9IHRtcDsKIAogCS8vIE00MAogCXBId0RhdGEtPnNsb3RfdGltZV9zZWxlY3QgPSBERUZBVUxUX1NMT1RfVElNRTsKIAl0bXAgPSAoREVGQVVMVF9BVElNV0QgPDwgMTYpIHwgREVGQVVMVF9TTE9UX1RJTUU7Ci0JcFdiMzVSZWctPk00MF9NYWNDb250cm9sID0gdG1wOworCXJlZy0+TTQwX01hY0NvbnRyb2wgPSB0bXA7CiAJcGx0bXBbN10gPSB0bXA7CiAKIAkvLyBNNDQKIAl0bXAgPSBERUZBVUxUX01BWF9UWF9NU0RVX0xJRkVfVElNRSA8PCAxMDsgLy8gKjEwMjQKLQlwV2IzNVJlZy0+TTQ0X01hY0NvbnRyb2wgPSB0bXA7CisJcmVnLT5NNDRfTWFjQ29udHJvbCA9IHRtcDsKIAlwbHRtcFs4XSA9IHRtcDsKIAogCS8vIE00OAogCXBId0RhdGEtPkJlYWNvblBlcmlvZCA9IERFRkFVTFRfQkVBQ09OX0lOVEVSVkFMOwogCXBId0RhdGEtPlByb2JlRGVsYXkgPSBERUZBVUxUX1BST0JFX0RFTEFZX1RJTUU7CiAJdG1wID0gKERFRkFVTFRfQkVBQ09OX0lOVEVSVkFMIDw8IDE2KSB8IERFRkFVTFRfUFJPQkVfREVMQVlfVElNRTsKLQlwV2IzNVJlZy0+TTQ4X01hY0NvbnRyb2wgPSB0bXA7CisJcmVnLT5NNDhfTWFjQ29udHJvbCA9IHRtcDsKIAlwbHRtcFs5XSA9IHRtcDsKIAogCS8vTTRDCi0JcFdiMzVSZWctPk00Q19NYWNTdGF0dXMgPSAoREVGQVVMVF9QUk9UT0NPTF9WRVJTSU9OIDw8IDMwKSB8IChERUZBVUxUX01BQ19QT1dFUl9TVEFURSA8PCAyOCkgfCAoREVGQVVMVF9EVElNX0FMRVJUX1RJTUUgPDwgMjQpOwotCXBsdG1wWzEwXSA9IHBXYjM1UmVnLT5NNENfTWFjU3RhdHVzOworCXJlZy0+TTRDX01hY1N0YXR1cyA9IChERUZBVUxUX1BST1RPQ09MX1ZFUlNJT04gPDwgMzApIHwgKERFRkFVTFRfTUFDX1BPV0VSX1NUQVRFIDw8IDI4KSB8IChERUZBVUxUX0RUSU1fQUxFUlRfVElNRSA8PCAyNCk7CisJcGx0bXBbMTBdID0gcmVnLT5NNENfTWFjU3RhdHVzOwogCiAJLy8gQnVyc3Qgd3JpdGUKIAkvL1diMzVSZWdfQnVyc3RXcml0ZSggcEh3RGF0YSwgMHgwODI0LCBwbHRtcCwgMTEsIEFVVE9fSU5DUkVNRU5UICk7CkBAIC0yNDA0LDE1ICsyNDA1LDE1IEBACiAKIAkvLyBNNjAKIAlXYjM1UmVnX1dyaXRlU3luYyggcEh3RGF0YSwgMHgwODYwLCAweDEyNDgxMjQ4ICk7Ci0JcFdiMzVSZWctPk02MF9NYWNDb250cm9sID0gMHgxMjQ4MTI0ODsKKwlyZWctPk02MF9NYWNDb250cm9sID0gMHgxMjQ4MTI0ODsKIAogCS8vIE02OAogCVdiMzVSZWdfV3JpdGVTeW5jKCBwSHdEYXRhLCAweDA4NjgsIDB4MDAwNTA5MDAgKTsgLy8gMjAwNTEwMTggMHgwMDBGMEYwMCApOyAvLyA5NDA5MzAgMHgwMDEzMTMwMAotCXBXYjM1UmVnLT5NNjhfTWFjQ29udHJvbCA9IDB4MDAwNTA5MDA7CisJcmVnLT5NNjhfTWFjQ29udHJvbCA9IDB4MDAwNTA5MDA7CiAKIAkvLyBNOTgKIAlXYjM1UmVnX1dyaXRlU3luYyggcEh3RGF0YSwgMHgwODk4LCAweGZmZmY4ODg4ICk7Ci0JcFdiMzVSZWctPk05OF9NYWNDb250cm9sID0gMHhmZmZmODg4ODsKKwlyZWctPk05OF9NYWNDb250cm9sID0gMHhmZmZmODg4ODsKIH0KIAogCkBAIC0yNjIwLDcgKzI2MjEsNyBAQAogCiB2b2lkIEJCUHJvY2Vzc29yX1JhdGVDaGFuZ2luZyggIHBod19kYXRhX3QgcEh3RGF0YSwgIHU4IHJhdGUgKSAvLyAyMDA2MDYxMy4xCiB7Ci0JUFdCMzVSRUcJcFdiMzVSZWcgPSAmcEh3RGF0YS0+V2IzNVJlZzsKKwlzdHJ1Y3Qgd2IzNV9yZWcgKnJlZyA9ICZwSHdEYXRhLT5yZWc7CiAJdW5zaWduZWQgY2hhcgkJSXMxMWJSYXRlOwogCiAJSXMxMWJSYXRlID0gKHJhdGUgJSA2KSA/IDEgOiAwOwpAQCAtMjYzMCw4ICsyNjMxLDggQEAKIAkJY2FzZSBSRl9BSVJPSEFfMjIzMFM6IC8vIDIwMDYwNDIwIEFkZCB0aGlzCiAJCQlpZiggSXMxMWJSYXRlICkKIAkJCXsKLQkJCQlpZiggKHBXYjM1UmVnLT5CQjQ4ICE9IEJCNDhfREVGQVVMVF9BTDIyMzBfMTFCKSAmJgotCQkJCQkocFdiMzVSZWctPkJCNEMgIT0gQkI0Q19ERUZBVUxUX0FMMjIzMF8xMUIpICkKKwkJCQlpZiggKHJlZy0+QkI0OCAhPSBCQjQ4X0RFRkFVTFRfQUwyMjMwXzExQikgJiYKKwkJCQkJKHJlZy0+QkI0QyAhPSBCQjRDX0RFRkFVTFRfQUwyMjMwXzExQikgKQogCQkJCXsKIAkJCQkJV2IzNVJlZ19Xcml0ZSggcEh3RGF0YSwgMHgxMDQ4LCBCQjQ4X0RFRkFVTFRfQUwyMjMwXzExQiApOwogCQkJCQlXYjM1UmVnX1dyaXRlKCBwSHdEYXRhLCAweDEwNGMsIEJCNENfREVGQVVMVF9BTDIyMzBfMTFCICk7CkBAIC0yNjM5LDggKzI2NDAsOCBAQAogCQkJfQogCQkJZWxzZQogCQkJewotCQkJCWlmKCAocFdiMzVSZWctPkJCNDggIT0gQkI0OF9ERUZBVUxUX0FMMjIzMF8xMUcpICYmCi0JCQkJCShwV2IzNVJlZy0+QkI0QyAhPSBCQjRDX0RFRkFVTFRfQUwyMjMwXzExRykgKQorCQkJCWlmKCAocmVnLT5CQjQ4ICE9IEJCNDhfREVGQVVMVF9BTDIyMzBfMTFHKSAmJgorCQkJCQkocmVnLT5CQjRDICE9IEJCNENfREVGQVVMVF9BTDIyMzBfMTFHKSApCiAJCQkJewogCQkJCQlXYjM1UmVnX1dyaXRlKCBwSHdEYXRhLCAweDEwNDgsIEJCNDhfREVGQVVMVF9BTDIyMzBfMTFHICk7CiAJCQkJCVdiMzVSZWdfV3JpdGUoIHBId0RhdGEsIDB4MTA0YywgQkI0Q19ERUZBVUxUX0FMMjIzMF8xMUcgKTsKQEAgLTI2NTEsMjIgKzI2NTIsMjIgQEAKIAkJY2FzZSBSRl9XQl8yNDI6IC8vIDIwMDYwNjIzIFRoZSBmaXggb25seSBmb3Igb2xkIFR4VkdBIHNldHRpbmcKIAkJCWlmKCBJczExYlJhdGUgKQogCQkJewotCQkJCWlmKCAocFdiMzVSZWctPkJCNDggIT0gQkI0OF9ERUZBVUxUX1dCMjQyXzExQikgJiYKLQkJCQkJKHBXYjM1UmVnLT5CQjRDICE9IEJCNENfREVGQVVMVF9XQjI0Ml8xMUIpICkKKwkJCQlpZiggKHJlZy0+QkI0OCAhPSBCQjQ4X0RFRkFVTFRfV0IyNDJfMTFCKSAmJgorCQkJCQkocmVnLT5CQjRDICE9IEJCNENfREVGQVVMVF9XQjI0Ml8xMUIpICkKIAkJCQl7Ci0JCQkJCXBXYjM1UmVnLT5CQjQ4ID0gQkI0OF9ERUZBVUxUX1dCMjQyXzExQjsKLQkJCQkJcFdiMzVSZWctPkJCNEMgPSBCQjRDX0RFRkFVTFRfV0IyNDJfMTFCOworCQkJCQlyZWctPkJCNDggPSBCQjQ4X0RFRkFVTFRfV0IyNDJfMTFCOworCQkJCQlyZWctPkJCNEMgPSBCQjRDX0RFRkFVTFRfV0IyNDJfMTFCOwogCQkJCQlXYjM1UmVnX1dyaXRlKCBwSHdEYXRhLCAweDEwNDgsIEJCNDhfREVGQVVMVF9XQjI0Ml8xMUIgKTsKIAkJCQkJV2IzNVJlZ19Xcml0ZSggcEh3RGF0YSwgMHgxMDRjLCBCQjRDX0RFRkFVTFRfV0IyNDJfMTFCICk7CiAJCQkJfQogCQkJfQogCQkJZWxzZQogCQkJewotCQkJCWlmKCAocFdiMzVSZWctPkJCNDggIT0gQkI0OF9ERUZBVUxUX1dCMjQyXzExRykgJiYKLQkJCQkJKHBXYjM1UmVnLT5CQjRDICE9IEJCNENfREVGQVVMVF9XQjI0Ml8xMUcpICkKKwkJCQlpZiggKHJlZy0+QkI0OCAhPSBCQjQ4X0RFRkFVTFRfV0IyNDJfMTFHKSAmJgorCQkJCQkocmVnLT5CQjRDICE9IEJCNENfREVGQVVMVF9XQjI0Ml8xMUcpICkKIAkJCQl7Ci0JCQkJCXBXYjM1UmVnLT5CQjQ4ID0gQkI0OF9ERUZBVUxUX1dCMjQyXzExRzsKLQkJCQkJcFdiMzVSZWctPkJCNEMgPSBCQjRDX0RFRkFVTFRfV0IyNDJfMTFHOworCQkJCQlyZWctPkJCNDggPSBCQjQ4X0RFRkFVTFRfV0IyNDJfMTFHOworCQkJCQlyZWctPkJCNEMgPSBCQjRDX0RFRkFVTFRfV0IyNDJfMTFHOwogCQkJCQlXYjM1UmVnX1dyaXRlKCBwSHdEYXRhLCAweDEwNDgsIEJCNDhfREVGQVVMVF9XQjI0Ml8xMUcgKTsKIAkJCQkJV2IzNVJlZ19Xcml0ZSggcEh3RGF0YSwgMHgxMDRjLCBCQjRDX0RFRkFVTFRfV0IyNDJfMTFHICk7CiAJCQkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvcnhpc3IuYyBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3J4aXNyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4ZTk0MmMuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvcnhpc3IuYworKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLSNpbmNsdWRlICJvc19jb21tb24uaCIKLQotdm9pZCB2UnhUaW1lckluaXQoUFdCMzJfQURBUFRFUiBBZGFwdGVyKQotewotCU9TX1RJTUVSX0lOSVRJQUwoJihBZGFwdGVyLT5NZHMublRpbWVyKSwgKHZvaWQqKSBSeFRpbWVySGFuZGxlciwgKHZvaWQqKSBBZGFwdGVyKTsKLX0KLQotdm9pZCB2UnhUaW1lclN0YXJ0KFBXQjMyX0FEQVBURVIgQWRhcHRlciwgaW50IHRpbWVvdXRfdmFsdWUpCi17Ci0JaWYgKHRpbWVvdXRfdmFsdWU8TUlOX1RJTUVPVVRfVkFMKQotCQl0aW1lb3V0X3ZhbHVlPU1JTl9USU1FT1VUX1ZBTDsKLQotCU9TX1RJTUVSX1NFVCggJihBZGFwdGVyLT5NZHMublRpbWVyKSwgdGltZW91dF92YWx1ZSApOwotfQotCi12b2lkIHZSeFRpbWVyU3RvcChQV0IzMl9BREFQVEVSIEFkYXB0ZXIpCi17Ci0JT1NfVElNRVJfQ0FOQ0VMKCAmKEFkYXB0ZXItPk1kcy5uVGltZXIpLCAwICk7Ci19Ci0KLXZvaWQgUnhUaW1lckhhbmRsZXJfMWEoIFBBREFQVEVSIEFkYXB0ZXIpCi17Ci0JUnhUaW1lckhhbmRsZXIoTlVMTCwgQWRhcHRlciwgTlVMTCwgTlVMTCk7Ci19Ci0KLXZvaWQgUnhUaW1lckhhbmRsZXIodm9pZCogU3lzdGVtU3BlY2lmaWMxLCBQV0IzMl9BREFQVEVSIEFkYXB0ZXIsCi0JCSAgICB2b2lkKiBTeXN0ZW1TcGVjaWZpYzIsIHZvaWQqIFN5c3RlbVNwZWNpZmljMykKLXsKLQlXQVJOX09OKDEpOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvc2Nhbl9zLmggYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9zY2FuX3MuaAppbmRleCAxZDFiMGM0Li43NzViYjgxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9zY2FuX3MuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9zY2FuX3MuaApAQCAtMSwzICsxLDkgQEAKKyNpZm5kZWYgX19XSU5CT05EX1NDQU5fU19ICisjZGVmaW5lIF9fV0lOQk9ORF9TQ0FOX1NfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlICJsb2NhbHBhcmEuaCIKKwogLy8KIC8vIFNDQU4gdGFzayBnbG9iYWwgQ09OU1RBTlRTLCBTVFJVQ1RVUkVTLCB2YXJpYWJsZXMKIC8vCkBAIC02Miw4ICs2OCw3IEBACiAJdTgJCQkJYm9DQ0FidXN5OwkJCQkJLy8gV2I6IEhXTUFDIENDQSBidXN5IHN0YXR1cwogCXU4CQkJCXJlc2VydmVkXzI7CiAKLQkvL05ESVNfTUlOSVBPUlRfVElNRVIJblRpbWVyOwotCU9TX1RJTUVSCQkJblRpbWVyOworCXN0cnVjdCB0aW1lcl9saXN0IHRpbWVyOwogCiAJdTMyCQkJCVNjYW5UaW1lU3RhbXA7CQkJLy9JbmNyZWFzZSAxIHBlciBiYWNrZ3JvdW5kIHNjYW4oMSBtaW51dGUpCiAJdTMyCQkJCUJzc1RpbWVTdGFtcDsJCQkvL0luY3JlYXNlIDEgcGVyIGNvbm5lY3Qgc3RhdHVzIGNoZWNrCkBAIC03OCw5ICs4Myw5IEBACiAKIH0gU0NBTl9QQVJBTUVURVJTLCAqcHNTQ0FOX1BBUkFNRVRFUlM7CiAKLS8vIEVuY2Fwc3VsYXRlICdBZGFwdGVyJyBkYXRhIHN0cnVjdHVyZQotI2RlZmluZSBwc1NDQU4JCQkoJihBZGFwdGVyLT5zU2NhblBhcmEpKQotI2RlZmluZSBwc1NDQU5SRVEJCQkoJihBZGFwdGVyLT5zU2NhblBhcmEuc1NjYW5SZXEpKQorLy8gRW5jYXBzdWxhdGUgJ2FkYXB0ZXInIGRhdGEgc3RydWN0dXJlCisjZGVmaW5lIHBzU0NBTgkJCSgmKGFkYXB0ZXItPnNTY2FuUGFyYSkpCisjZGVmaW5lIHBzU0NBTlJFUQkJCSgmKGFkYXB0ZXItPnNTY2FuUGFyYS5zU2NhblJlcSkpCiAKIC8vKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKIC8vCXNjYW4uaApAQCAtMTA5LDcgKzExNCw4IEBACiAKIC8vIHN0YXRpYyBmdW5jdGlvbnMKIAotLy9zdGF0aWMgdm9pZCBTY2FuVGltZXJIYW5kbGVyKFBXQjMyX0FEQVBURVIgQWRhcHRlcik7Ci0vL3N0YXRpYyB2b2lkIHZTY2FuVGltZXJTdGFydChQV0IzMl9BREFQVEVSCUFkYXB0ZXIsIGludCB0aW1lb3V0X3ZhbHVlKTsKLS8vc3RhdGljIHZvaWQgdlNjYW5UaW1lclN0b3AoUFdCMzJfQURBUFRFUiBBZGFwdGVyKTsKKy8vc3RhdGljIHZvaWQgU2NhblRpbWVySGFuZGxlcihzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKiBhZGFwdGVyKTsKKy8vc3RhdGljIHZvaWQgdlNjYW5UaW1lclN0YXJ0KHN0cnVjdCB3YnNvZnRfcHJpdiAqCWFkYXB0ZXIsIGludCB0aW1lb3V0X3ZhbHVlKTsKKy8vc3RhdGljIHZvaWQgdlNjYW5UaW1lclN0b3Aoc3RydWN0IHdic29mdF9wcml2ICogYWRhcHRlcik7CiAKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvc21lX2FwaS5jIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvc21lX2FwaS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMWM5NjczLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3NtZV9hcGkuYworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBzbWVfYXBpLmMKLS8vCi0vLyBDb3B5cmlnaHQoQykgMjAwMiBXaW5ib25kIEVsZWN0cm9uaWNzIENvcnAuCi0vLwotLy8KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jaW5jbHVkZSAib3NfY29tbW9uLmgiCi0KLXM4IHNtZV9nZXRfcnNzaSh2b2lkICpwY29yZV9kYXRhLCBzMzIgKnByc3NpKQotewotICAgICAgIEJVRygpOwotICAgICAgIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvc21lX2FwaS5oIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvc21lX2FwaS5oCmluZGV4IDc0NWViMzcuLjE4OGEyNTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3NtZV9hcGkuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9zbWVfYXBpLmgKQEAgLTEzLDYgKzEzLDEwIEBACiAjaWZuZGVmIF9fU01FX0FQSV9IX18KICNkZWZpbmUgX19TTUVfQVBJX0hfXwogCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2luY2x1ZGUgImxvY2FscGFyYS5oIgorCiAvKioqKioqKioqKioqKioqKioqIElOQ0xVREUgRklMRVMgU0VDVElPTiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8vI2luY2x1ZGUgIkdMXGdsX2NvcmUuaCIKIApAQCAtNTIsOSArNTYsNiBAQAogczggc21lX2dldF9ydHNfdGhyZXNob2xkKHZvaWQgKnBjb3JlX2RhdGEsIHUzMiAqcHRocmVzaG9sZCk7CiBzOCBzbWVfc2V0X3J0c190aHJlc2hvbGQodm9pZCAqcGNvcmVfZGF0YSwgdTMyIHRocmVzaG9sZCk7CiAKLS8vIE9JRF84MDJfMTFfUlNTSQotczggc21lX2dldF9yc3NpKHZvaWQgKnBjb3JlX2RhdGEsIHMzMiAqcHJzc2kpOwotCiAvLyBPSURfODAyXzExX0NPTkZJR1VSQVRJT04KIHM4IHNtZV9nZXRfYmVhY29uX3BlcmlvZCh2b2lkICpwY29yZV9kYXRhLCB1MTYgKnBiZWFjb25fcGVyaW9kKTsKIHM4IHNtZV9zZXRfYmVhY29uX3BlcmlvZCh2b2lkICpwY29yZV9kYXRhLCB1MTYgYmVhY29uX3BlcmlvZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9zbWVfcy5oIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvc21lX3MuaAppbmRleCBkZmQyZmJjLi4xYmQxMThmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9zbWVfcy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3NtZV9zLmgKQEAgLTEsMyArMSwxMSBAQAorI2lmbmRlZiBfX1dJTkJPTkRfU01FX1NfSAorI2RlZmluZSBfX1dJTkJPTkRfU01FX1NfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2luY2x1ZGUgIm1hY19zdHJ1Y3R1cmVzLmgiCisjaW5jbHVkZSAibG9jYWxwYXJhLmgiCisKIC8vCiAvLyBTTUVfUy5IIC0KIC8vIFNNRSB0YXNrIGdsb2JhbCBDT05TVEFOVFMsIFNUUlVDVFVSRVMsIHZhcmlhYmxlcwpAQCAtMTA2LDggKzExNCw3IEBACiAJdTgJCQkJYkRlc2lyZWRQb3dlclNhdmU7CiAKIAkvLyBTTUUgdGltZXIgYW5kIHRpbWVvdXQgdmFsdWUKLQkvL05ESVNfTUlOSVBPUlRfVElNRVIJblRpbWVyOwotCU9TX1RJTUVSCQkJblRpbWVyOworCXN0cnVjdCB0aW1lcl9saXN0IHRpbWVyOwogCiAJdTgJCQkJYm9JblRpbWVySGFuZGxlcjsKIAl1OCAJCQkJYm9BdXRoUmV0cnlBY3RpdmU7CkBAIC0xOTYsOSArMjAzLDkgQEAKIAogfSBTTUVfUEFSQU1FVEVSUywgKlBTTUVfUEFSQU1FVEVSUzsKIAotI2RlZmluZSBwc1NNRQkJCSgmKEFkYXB0ZXItPnNTbWVQYXJhKSkKKyNkZWZpbmUgcHNTTUUJCQkoJihhZGFwdGVyLT5zU21lUGFyYSkpCiAKLSNkZWZpbmUgd1NNRUdldEN1cnJlbnRTVEFTdGF0ZShBZGFwdGVyKQkJKCh1MTYpKEFkYXB0ZXIpLT5zU21lUGFyYS53U3RhdGUpCisjZGVmaW5lIHdTTUVHZXRDdXJyZW50U1RBU3RhdGUoYWRhcHRlcikJCSgodTE2KShhZGFwdGVyKS0+c1NtZVBhcmEud1N0YXRlKQogCiAKIApAQCAtMjI2LDMgKzIzMyw0IEBACiAKIC8vIFN0YXRpYyBmdW5jdGlvbgogCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3N5c2RlZi5oIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvc3lzZGVmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjUxYjljNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3N5c2RlZi5oCkBAIC0wLDAgKzEsNDAgQEAKKworCisvLworLy8gV2luYm9uZCBXTEFOIFN5c3RlbSBDb25maWd1cmF0aW9uIGRlZmluZXMKKy8vCisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBDdXJyZW50IGRpcmVjdG9yeSBpcyBMaW51eAorLy8gVGhlIGRlZmluaXRpb24gV0JfTElOVVggaXMgYSBrZXl3b3JkIGZvciB0aGlzIE9TCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorI2lmbmRlZiBTWVNfREVGX0gKKyNkZWZpbmUgU1lTX0RFRl9ICisjZGVmaW5lIFdCX0xJTlVYCisjZGVmaW5lIFdCX0xJTlVYX1dQQV9QU0sKKworCisvLyNkZWZpbmUgX0lCU1NfQkVBQ09OX1NFUV9TVElDS18KKyNkZWZpbmUgX1VTRV9GQUxMQkFDS19SQVRFXworLy8jZGVmaW5lIEFOVERJVl9ERUZBVUxUX09OCisKKyNkZWZpbmUgX1dQQTJfCS8vIDIwMDYxMTIyIEl0J3MgbmVlZGVkIGZvciBjdXJyZW50IExpbnV4IGRyaXZlcgorCisKKyNpZm5kZWYgX1dQQV9QU0tfREVCVUcKKyN1bmRlZiAgX1dQQV9QU0tfREVCVUcKKyNlbmRpZgorCisvLyBkZWJ1ZyBwcmludCBvcHRpb25zLCBtYXJrIHdoYXQgZGVidWcgeW91IGRvbid0IG5lZWQKKworI2lmZGVmIEZVTExfREVCVUcKKyNkZWZpbmUgX1BFX1NUQVRFX0RVTVBfCisjZGVmaW5lIF9QRV9UWF9EVU1QXworI2RlZmluZSBfUEVfUlhfRFVNUF8KKyNkZWZpbmUgX1BFX09JRF9EVU1QXworI2RlZmluZSBfUEVfRFRPX0RVTVBfCisjZGVmaW5lIF9QRV9SRUdfRFVNUF8KKyNkZWZpbmUgX1BFX1VTQl9JTklfRFVNUF8KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3diMzVyZWcuYyBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3diMzVyZWcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzRiM2ZkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2IzNXJlZy5jCkBAIC0wLDAgKzEsNzQ3IEBACisjaW5jbHVkZSAic3lzZGVmLmgiCisjaW5jbHVkZSAid2IzNXJlZ19mLmgiCisKKyNpbmNsdWRlIDxsaW51eC91c2IuaD4KKworZXh0ZXJuIHZvaWQgcGh5X2NhbGlicmF0aW9uX3dpbmJvbmQoaHdfZGF0YV90ICpwaHdfZGF0YSwgdTMyIGZyZXF1ZW5jeSk7CisKKy8vIHRydWUgIDogcmVhZCBjb21tYW5kIHByb2Nlc3Mgc3VjY2Vzc2Z1bGx5CisvLyBmYWxzZSA6IHJlZ2lzdGVyIG5vdCBzdXBwb3J0CisvLyBSZWdpc3Rlck5vIDogc3RhcnQgYmFzZQorLy8gcFJlZ2lzdGVyRGF0YSA6IGRhdGEgcG9pbnQKKy8vIE51bWJlck9mRGF0YSA6IG51bWJlciBvZiByZWdpc3RlciBkYXRhCisvLyBGbGFnIDogQVVUT19JTkNSRU1FTlQgLSBSZWdpc3Rlck5vIHdpbGwgYXV0byBpbmNyZW1lbnQgNAorLy8JCSAgTk9fSU5DUkVNRU5UIC0gRnVuY3Rpb24gd2lsbCB3cml0ZSBkYXRhIGludG8gdGhlIHNhbWUgcmVnaXN0ZXIKK3Vuc2lnbmVkIGNoYXIKK1diMzVSZWdfQnVyc3RXcml0ZShwaHdfZGF0YV90IHBId0RhdGEsIHUxNiBSZWdpc3Rlck5vLCB1MzIgKiBwUmVnaXN0ZXJEYXRhLCB1OCBOdW1iZXJPZkRhdGEsIHU4IEZsYWcpCit7CisJc3RydWN0IHdiMzVfcmVnICpyZWcgPSAmcEh3RGF0YS0+cmVnOworCXN0cnVjdCB1cmIJKnVyYiA9IE5VTEw7CisJc3RydWN0IHdiMzVfcmVnX3F1ZXVlICpyZWdfcXVldWUgPSBOVUxMOworCXUxNgkJVXJiU2l6ZTsKKwlzdHJ1Y3QgICAgICB1c2JfY3RybHJlcXVlc3QgKmRyOworCXUxNgkJaSwgRGF0YVNpemUgPSBOdW1iZXJPZkRhdGEqNDsKKworCS8vIE1vZHVsZSBzaHV0ZG93bgorCWlmIChwSHdEYXRhLT5TdXJwcmlzZVJlbW92ZSkKKwkJcmV0dXJuIGZhbHNlOworCisJLy8gVHJ5aW5nIHRvIHVzZSBidXJzdCB3cml0ZSBmdW5jdGlvbiBpZiB1c2UgbmV3IGhhcmR3YXJlCisJVXJiU2l6ZSA9IHNpemVvZihzdHJ1Y3Qgd2IzNV9yZWdfcXVldWUpICsgRGF0YVNpemUgKyBzaXplb2Yoc3RydWN0IHVzYl9jdHJscmVxdWVzdCk7CisJcmVnX3F1ZXVlID0ga3phbGxvYyhVcmJTaXplLCBHRlBfQVRPTUlDKTsKKwl1cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9BVE9NSUMpOworCWlmKCB1cmIgJiYgcmVnX3F1ZXVlICkgeworCQlyZWdfcXVldWUtPkRJUkVDVCA9IDI7Ly8gYnVyc3Qgd3JpdGUgcmVnaXN0ZXIKKwkJcmVnX3F1ZXVlLT5JTkRFWCA9IFJlZ2lzdGVyTm87CisJCXJlZ19xdWV1ZS0+cEJ1ZmZlciA9ICh1MzIgKikoKHU4ICopcmVnX3F1ZXVlICsgc2l6ZW9mKHN0cnVjdCB3YjM1X3JlZ19xdWV1ZSkpOworCQltZW1jcHkoIHJlZ19xdWV1ZS0+cEJ1ZmZlciwgcFJlZ2lzdGVyRGF0YSwgRGF0YVNpemUgKTsKKwkJLy90aGUgZnVuY3Rpb24gZm9yIHJldmVyc2luZyByZWdpc3RlciBkYXRhIGZyb20gbGl0dGxlIGVuZGlhbiB0byBiaWcgZW5kaWFuCisJCWZvciggaT0wOyBpPE51bWJlck9mRGF0YSA7IGkrKyApCisJCQlyZWdfcXVldWUtPnBCdWZmZXJbaV0gPSBjcHVfdG9fbGUzMiggcmVnX3F1ZXVlLT5wQnVmZmVyW2ldICk7CisKKwkJZHIgPSAoc3RydWN0IHVzYl9jdHJscmVxdWVzdCAqKSgodTggKilyZWdfcXVldWUgKyBzaXplb2Yoc3RydWN0IHdiMzVfcmVnX3F1ZXVlKSArIERhdGFTaXplKTsKKwkJZHItPmJSZXF1ZXN0VHlwZSA9IFVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9ESVJfT1VUIHwgVVNCX1JFQ0lQX0RFVklDRTsKKwkJZHItPmJSZXF1ZXN0ID0gMHgwNDsgLy8gVVNCIG9yIHZlbmRvci1kZWZpbmVkIHJlcXVlc3QgY29kZSwgYnVyc3QgbW9kZQorCQlkci0+d1ZhbHVlID0gY3B1X3RvX2xlMTYoIEZsYWcgKTsgLy8gMDogUmVnaXN0ZXIgbnVtYmVyIGF1dG8taW5jcmVtZW50LCAxOiBObyBhdXRvIGluY3JlbWVudAorCQlkci0+d0luZGV4ID0gY3B1X3RvX2xlMTYoIFJlZ2lzdGVyTm8gKTsKKwkJZHItPndMZW5ndGggPSBjcHVfdG9fbGUxNiggRGF0YVNpemUgKTsKKwkJcmVnX3F1ZXVlLT5OZXh0ID0gTlVMTDsKKwkJcmVnX3F1ZXVlLT5wVXNiUmVxID0gZHI7CisJCXJlZ19xdWV1ZS0+dXJiID0gdXJiOworCisJCXNwaW5fbG9ja19pcnEoICZyZWctPkVQMFZNX3NwaW5fbG9jayApOworCQlpZiAocmVnLT5yZWdfZmlyc3QgPT0gTlVMTCkKKwkJCXJlZy0+cmVnX2ZpcnN0ID0gcmVnX3F1ZXVlOworCQllbHNlCisJCQlyZWctPnJlZ19sYXN0LT5OZXh0ID0gcmVnX3F1ZXVlOworCQlyZWctPnJlZ19sYXN0ID0gcmVnX3F1ZXVlOworCisJCXNwaW5fdW5sb2NrX2lycSggJnJlZy0+RVAwVk1fc3Bpbl9sb2NrICk7CisKKwkJLy8gU3RhcnQgRVAwVk0KKwkJV2IzNVJlZ19FUDBWTV9zdGFydChwSHdEYXRhKTsKKworCQlyZXR1cm4gdHJ1ZTsKKwl9IGVsc2UgeworCQlpZiAodXJiKQorCQkJdXNiX2ZyZWVfdXJiKHVyYik7CisJCWlmIChyZWdfcXVldWUpCisJCQlrZnJlZShyZWdfcXVldWUpOworCQlyZXR1cm4gZmFsc2U7CisJfQorICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkCitXYjM1UmVnX1VwZGF0ZShwaHdfZGF0YV90IHBId0RhdGEsICB1MTYgUmVnaXN0ZXJObywgIHUzMiBSZWdpc3RlclZhbHVlKQoreworCXN0cnVjdCB3YjM1X3JlZyAqcmVnID0gJnBId0RhdGEtPnJlZzsKKwlzd2l0Y2ggKFJlZ2lzdGVyTm8pIHsKKwljYXNlIDB4M2IwOiByZWctPlUxQjAgPSBSZWdpc3RlclZhbHVlOyBicmVhazsKKwljYXNlIDB4M2JjOiByZWctPlUxQkNfTEVEQ29uZmlndXJlID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7CisJY2FzZSAweDQwMDogcmVnLT5EMDBfRG1hQ29udHJvbCA9IFJlZ2lzdGVyVmFsdWU7IGJyZWFrOworCWNhc2UgMHg4MDA6IHJlZy0+TTAwX01hY0NvbnRyb2wgPSBSZWdpc3RlclZhbHVlOyBicmVhazsKKwljYXNlIDB4ODA0OiByZWctPk0wNF9NdWx0aWNhc3RBZGRyZXNzMSA9IFJlZ2lzdGVyVmFsdWU7IGJyZWFrOworCWNhc2UgMHg4MDg6IHJlZy0+TTA4X011bHRpY2FzdEFkZHJlc3MyID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7CisJY2FzZSAweDgyNDogcmVnLT5NMjRfTWFjQ29udHJvbCA9IFJlZ2lzdGVyVmFsdWU7IGJyZWFrOworCWNhc2UgMHg4Mjg6IHJlZy0+TTI4X01hY0NvbnRyb2wgPSBSZWdpc3RlclZhbHVlOyBicmVhazsKKwljYXNlIDB4ODJjOiByZWctPk0yQ19NYWNDb250cm9sID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7CisJY2FzZSAweDgzODogcmVnLT5NMzhfTWFjQ29udHJvbCA9IFJlZ2lzdGVyVmFsdWU7IGJyZWFrOworCWNhc2UgMHg4NDA6IHJlZy0+TTQwX01hY0NvbnRyb2wgPSBSZWdpc3RlclZhbHVlOyBicmVhazsKKwljYXNlIDB4ODQ0OiByZWctPk00NF9NYWNDb250cm9sID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7CisJY2FzZSAweDg0ODogcmVnLT5NNDhfTWFjQ29udHJvbCA9IFJlZ2lzdGVyVmFsdWU7IGJyZWFrOworCWNhc2UgMHg4NGM6IHJlZy0+TTRDX01hY1N0YXR1cyA9IFJlZ2lzdGVyVmFsdWU7IGJyZWFrOworCWNhc2UgMHg4NjA6IHJlZy0+TTYwX01hY0NvbnRyb2wgPSBSZWdpc3RlclZhbHVlOyBicmVhazsKKwljYXNlIDB4ODY4OiByZWctPk02OF9NYWNDb250cm9sID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7CisJY2FzZSAweDg3MDogcmVnLT5NNzBfTWFjQ29udHJvbCA9IFJlZ2lzdGVyVmFsdWU7IGJyZWFrOworCWNhc2UgMHg4NzQ6IHJlZy0+TTc0X01hY0NvbnRyb2wgPSBSZWdpc3RlclZhbHVlOyBicmVhazsKKwljYXNlIDB4ODc4OiByZWctPk03OF9FUlBJbmZvcm1hdGlvbiA9IFJlZ2lzdGVyVmFsdWU7IGJyZWFrOworCWNhc2UgMHg4N0M6IHJlZy0+TTdDX01hY0NvbnRyb2wgPSBSZWdpc3RlclZhbHVlOyBicmVhazsKKwljYXNlIDB4ODgwOiByZWctPk04MF9NYWNDb250cm9sID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7CisJY2FzZSAweDg4NDogcmVnLT5NODRfTWFjQ29udHJvbCA9IFJlZ2lzdGVyVmFsdWU7IGJyZWFrOworCWNhc2UgMHg4ODg6IHJlZy0+TTg4X01hY0NvbnRyb2wgPSBSZWdpc3RlclZhbHVlOyBicmVhazsKKwljYXNlIDB4ODk4OiByZWctPk05OF9NYWNDb250cm9sID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7CisJY2FzZSAweDEwMGM6IHJlZy0+QkIwQyA9IFJlZ2lzdGVyVmFsdWU7IGJyZWFrOworCWNhc2UgMHgxMDJjOiByZWctPkJCMkMgPSBSZWdpc3RlclZhbHVlOyBicmVhazsKKwljYXNlIDB4MTAzMDogcmVnLT5CQjMwID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7CisJY2FzZSAweDEwM2M6IHJlZy0+QkIzQyA9IFJlZ2lzdGVyVmFsdWU7IGJyZWFrOworCWNhc2UgMHgxMDQ4OiByZWctPkJCNDggPSBSZWdpc3RlclZhbHVlOyBicmVhazsKKwljYXNlIDB4MTA0YzogcmVnLT5CQjRDID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7CisJY2FzZSAweDEwNTA6IHJlZy0+QkI1MCA9IFJlZ2lzdGVyVmFsdWU7IGJyZWFrOworCWNhc2UgMHgxMDU0OiByZWctPkJCNTQgPSBSZWdpc3RlclZhbHVlOyBicmVhazsKKwljYXNlIDB4MTA1ODogcmVnLT5CQjU4ID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7CisJY2FzZSAweDEwNWM6IHJlZy0+QkI1QyA9IFJlZ2lzdGVyVmFsdWU7IGJyZWFrOworCWNhc2UgMHgxMDYwOiByZWctPkJCNjAgPSBSZWdpc3RlclZhbHVlOyBicmVhazsKKwl9Cit9CisKKy8vIHRydWUgIDogcmVhZCBjb21tYW5kIHByb2Nlc3Mgc3VjY2Vzc2Z1bGx5CisvLyBmYWxzZSA6IHJlZ2lzdGVyIG5vdCBzdXBwb3J0Cit1bnNpZ25lZCBjaGFyCitXYjM1UmVnX1dyaXRlU3luYyggIHBod19kYXRhX3QgcEh3RGF0YSwgIHUxNiBSZWdpc3Rlck5vLCAgdTMyIFJlZ2lzdGVyVmFsdWUgKQoreworCXN0cnVjdCB3YjM1X3JlZyAqcmVnID0gJnBId0RhdGEtPnJlZzsKKwlpbnQgcmV0ID0gLTE7CisKKwkvLyBNb2R1bGUgc2h1dGRvd24KKwlpZiAocEh3RGF0YS0+U3VycHJpc2VSZW1vdmUpCisJCXJldHVybiBmYWxzZTsKKworCVJlZ2lzdGVyVmFsdWUgPSBjcHVfdG9fbGUzMihSZWdpc3RlclZhbHVlKTsKKworCS8vIHVwZGF0ZSB0aGUgcmVnaXN0ZXIgYnkgc2VuZCB1c2IgbWVzc2FnZS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCXJlZy0+U3luY0lvUGF1c2UgPSAxOworCisJLy8gMjAwNjA3MTcuNSBXYWl0IHVudGlsIEVQMFZNIHN0b3AKKwl3aGlsZSAocmVnLT5FUDB2bV9zdGF0ZSAhPSBWTV9TVE9QKQorCQltc2xlZXAoMTApOworCisJLy8gU3luYyBJb0NhbGxEcml2ZXIKKwlyZWctPkVQMHZtX3N0YXRlID0gVk1fUlVOTklORzsKKwlyZXQgPSB1c2JfY29udHJvbF9tc2coIHBId0RhdGEtPldiVXNiLnVkZXYsCisJCQkgICAgICAgdXNiX3NuZGN0cmxwaXBlKCBwSHdEYXRhLT5XYlVzYi51ZGV2LCAwICksCisJCQkgICAgICAgMHgwMywgVVNCX1RZUEVfVkVORE9SIHwgVVNCX1JFQ0lQX0RFVklDRSB8IFVTQl9ESVJfT1VULAorCQkJICAgICAgIDB4MCxSZWdpc3Rlck5vLCAmUmVnaXN0ZXJWYWx1ZSwgNCwgSFoqMTAwICk7CisJcmVnLT5FUDB2bV9zdGF0ZSA9IFZNX1NUT1A7CisJcmVnLT5TeW5jSW9QYXVzZSA9IDA7CisKKwlXYjM1UmVnX0VQMFZNX3N0YXJ0KHBId0RhdGEpOworCisJaWYgKHJldCA8IDApIHsKKwkJI2lmZGVmIF9QRV9SRUdfRFVNUF8KKwkJV0JERUJVRygoIkVQMCBXcml0ZSByZWdpc3RlciB1c2IgbWVzc2FnZSBzZW5kaW5nIGVycm9yXG4iKSk7CisJCSNlbmRpZgorCisJCXBId0RhdGEtPlN1cnByaXNlUmVtb3ZlID0gMTsgLy8gMjAwNjA3MDQuMgorCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcmV0dXJuIHRydWU7Cit9CisKKy8vIHRydWUgIDogcmVhZCBjb21tYW5kIHByb2Nlc3Mgc3VjY2Vzc2Z1bGx5CisvLyBmYWxzZSA6IHJlZ2lzdGVyIG5vdCBzdXBwb3J0Cit1bnNpZ25lZCBjaGFyCitXYjM1UmVnX1dyaXRlKCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgdTE2IFJlZ2lzdGVyTm8sICB1MzIgUmVnaXN0ZXJWYWx1ZSApCit7CisJc3RydWN0IHdiMzVfcmVnICpyZWcgPSAmcEh3RGF0YS0+cmVnOworCXN0cnVjdCB1c2JfY3RybHJlcXVlc3QgKmRyOworCXN0cnVjdCB1cmIJKnVyYiA9IE5VTEw7CisJc3RydWN0IHdiMzVfcmVnX3F1ZXVlICpyZWdfcXVldWUgPSBOVUxMOworCXUxNgkJVXJiU2l6ZTsKKworCisJLy8gTW9kdWxlIHNodXRkb3duCisJaWYgKHBId0RhdGEtPlN1cnByaXNlUmVtb3ZlKQorCQlyZXR1cm4gZmFsc2U7CisKKwkvLyB1cGRhdGUgdGhlIHJlZ2lzdGVyIGJ5IHNlbmQgdXJiIHJlcXVlc3QtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlVcmJTaXplID0gc2l6ZW9mKHN0cnVjdCB3YjM1X3JlZ19xdWV1ZSkgKyBzaXplb2Yoc3RydWN0IHVzYl9jdHJscmVxdWVzdCk7CisJcmVnX3F1ZXVlID0ga3phbGxvYyhVcmJTaXplLCBHRlBfQVRPTUlDKTsKKwl1cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9BVE9NSUMpOworCWlmICh1cmIgJiYgcmVnX3F1ZXVlKSB7CisJCXJlZ19xdWV1ZS0+RElSRUNUID0gMTsvLyBidXJzdCB3cml0ZSByZWdpc3RlcgorCQlyZWdfcXVldWUtPklOREVYID0gUmVnaXN0ZXJObzsKKwkJcmVnX3F1ZXVlLT5WQUxVRSA9IGNwdV90b19sZTMyKFJlZ2lzdGVyVmFsdWUpOworCQlyZWdfcXVldWUtPlJFU0VSVkVEX1ZBTElEID0gZmFsc2U7CisJCWRyID0gKHN0cnVjdCB1c2JfY3RybHJlcXVlc3QgKikoKHU4ICopcmVnX3F1ZXVlICsgc2l6ZW9mKHN0cnVjdCB3YjM1X3JlZ19xdWV1ZSkpOworCQlkci0+YlJlcXVlc3RUeXBlID0gVVNCX1RZUEVfVkVORE9SfFVTQl9ESVJfT1VUIHxVU0JfUkVDSVBfREVWSUNFOworCQlkci0+YlJlcXVlc3QgPSAweDAzOyAvLyBVU0Igb3IgdmVuZG9yLWRlZmluZWQgcmVxdWVzdCBjb2RlLCBidXJzdCBtb2RlCisJCWRyLT53VmFsdWUgPSBjcHVfdG9fbGUxNigweDApOworCQlkci0+d0luZGV4ID0gY3B1X3RvX2xlMTYoUmVnaXN0ZXJObyk7CisJCWRyLT53TGVuZ3RoID0gY3B1X3RvX2xlMTYoNCk7CisKKwkJLy8gRW50ZXIgdGhlIHNlbmRpbmcgcXVldWUKKwkJcmVnX3F1ZXVlLT5OZXh0ID0gTlVMTDsKKwkJcmVnX3F1ZXVlLT5wVXNiUmVxID0gZHI7CisJCXJlZ19xdWV1ZS0+dXJiID0gdXJiOworCisJCXNwaW5fbG9ja19pcnEoJnJlZy0+RVAwVk1fc3Bpbl9sb2NrICk7CisJCWlmIChyZWctPnJlZ19maXJzdCA9PSBOVUxMKQorCQkJcmVnLT5yZWdfZmlyc3QgPSByZWdfcXVldWU7CisJCWVsc2UKKwkJCXJlZy0+cmVnX2xhc3QtPk5leHQgPSByZWdfcXVldWU7CisJCXJlZy0+cmVnX2xhc3QgPSByZWdfcXVldWU7CisKKwkJc3Bpbl91bmxvY2tfaXJxKCAmcmVnLT5FUDBWTV9zcGluX2xvY2sgKTsKKworCQkvLyBTdGFydCBFUDBWTQorCQlXYjM1UmVnX0VQMFZNX3N0YXJ0KHBId0RhdGEpOworCisJCXJldHVybiB0cnVlOworCX0gZWxzZSB7CisJCWlmICh1cmIpCisJCQl1c2JfZnJlZV91cmIodXJiKTsKKwkJa2ZyZWUocmVnX3F1ZXVlKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KK30KKworLy9UaGlzIGNvbW1hbmQgd2lsbCBiZSBleGVjdXRlZCB3aXRoIGEgdXNlciBkZWZpbmVkIHZhbHVlLiBXaGVuIGl0IGNvbXBsZXRlcywKKy8vdGhpcyB2YWx1ZSBpcyB1c2VmdWwuIEZvciBleGFtcGxlLCBoYWxfc2V0X2N1cnJlbnRfY2hhbm5lbCB3aWxsIHVzZSBpdC4KKy8vIHRydWUgIDogcmVhZCBjb21tYW5kIHByb2Nlc3Mgc3VjY2Vzc2Z1bGx5CisvLyBmYWxzZSA6IHJlZ2lzdGVyIG5vdCBzdXBwb3J0Cit1bnNpZ25lZCBjaGFyCitXYjM1UmVnX1dyaXRlV2l0aENhbGxiYWNrVmFsdWUoIHBod19kYXRhX3QgcEh3RGF0YSwgdTE2IFJlZ2lzdGVyTm8sIHUzMiBSZWdpc3RlclZhbHVlLAorCQkJCXM4ICpwVmFsdWUsIHM4IExlbikKK3sKKwlzdHJ1Y3Qgd2IzNV9yZWcgKnJlZyA9ICZwSHdEYXRhLT5yZWc7CisJc3RydWN0IHVzYl9jdHJscmVxdWVzdCAqZHI7CisJc3RydWN0IHVyYgkqdXJiID0gTlVMTDsKKwlzdHJ1Y3Qgd2IzNV9yZWdfcXVldWUgKnJlZ19xdWV1ZSA9IE5VTEw7CisJdTE2CQlVcmJTaXplOworCisJLy8gTW9kdWxlIHNodXRkb3duCisJaWYgKHBId0RhdGEtPlN1cnByaXNlUmVtb3ZlKQorCQlyZXR1cm4gZmFsc2U7CisKKwkvLyB1cGRhdGUgdGhlIHJlZ2lzdGVyIGJ5IHNlbmQgdXJiIHJlcXVlc3QtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlVcmJTaXplID0gc2l6ZW9mKHN0cnVjdCB3YjM1X3JlZ19xdWV1ZSkgKyBzaXplb2Yoc3RydWN0IHVzYl9jdHJscmVxdWVzdCk7CisJcmVnX3F1ZXVlID0ga3phbGxvYyhVcmJTaXplLCBHRlBfQVRPTUlDKTsKKwl1cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9BVE9NSUMpOworCWlmICh1cmIgJiYgcmVnX3F1ZXVlKSB7CisJCXJlZ19xdWV1ZS0+RElSRUNUID0gMTsvLyBidXJzdCB3cml0ZSByZWdpc3RlcgorCQlyZWdfcXVldWUtPklOREVYID0gUmVnaXN0ZXJObzsKKwkJcmVnX3F1ZXVlLT5WQUxVRSA9IGNwdV90b19sZTMyKFJlZ2lzdGVyVmFsdWUpOworCQkvL05PVEUgOiBVc2VycyBtdXN0IGd1YXJhbnRlZSB0aGUgc2l6ZSBvZiB2YWx1ZSB3aWxsIG5vdCBleGNlZWQgdGhlIGJ1ZmZlciBzaXplLgorCQltZW1jcHkocmVnX3F1ZXVlLT5SRVNFUlZFRCwgcFZhbHVlLCBMZW4pOworCQlyZWdfcXVldWUtPlJFU0VSVkVEX1ZBTElEID0gdHJ1ZTsKKwkJZHIgPSAoc3RydWN0IHVzYl9jdHJscmVxdWVzdCAqKSgodTggKilyZWdfcXVldWUgKyBzaXplb2Yoc3RydWN0IHdiMzVfcmVnX3F1ZXVlKSk7CisJCWRyLT5iUmVxdWVzdFR5cGUgPSBVU0JfVFlQRV9WRU5ET1J8VVNCX0RJUl9PVVQgfFVTQl9SRUNJUF9ERVZJQ0U7CisJCWRyLT5iUmVxdWVzdCA9IDB4MDM7IC8vIFVTQiBvciB2ZW5kb3ItZGVmaW5lZCByZXF1ZXN0IGNvZGUsIGJ1cnN0IG1vZGUKKwkJZHItPndWYWx1ZSA9IGNwdV90b19sZTE2KDB4MCk7CisJCWRyLT53SW5kZXggPSBjcHVfdG9fbGUxNihSZWdpc3Rlck5vKTsKKwkJZHItPndMZW5ndGggPSBjcHVfdG9fbGUxNig0KTsKKworCQkvLyBFbnRlciB0aGUgc2VuZGluZyBxdWV1ZQorCQlyZWdfcXVldWUtPk5leHQgPSBOVUxMOworCQlyZWdfcXVldWUtPnBVc2JSZXEgPSBkcjsKKwkJcmVnX3F1ZXVlLT51cmIgPSB1cmI7CisJCXNwaW5fbG9ja19pcnEgKCZyZWctPkVQMFZNX3NwaW5fbG9jayApOworCQlpZiggcmVnLT5yZWdfZmlyc3QgPT0gTlVMTCApCisJCQlyZWctPnJlZ19maXJzdCA9IHJlZ19xdWV1ZTsKKwkJZWxzZQorCQkJcmVnLT5yZWdfbGFzdC0+TmV4dCA9IHJlZ19xdWV1ZTsKKwkJcmVnLT5yZWdfbGFzdCA9IHJlZ19xdWV1ZTsKKworCQlzcGluX3VubG9ja19pcnEgKCAmcmVnLT5FUDBWTV9zcGluX2xvY2sgKTsKKworCQkvLyBTdGFydCBFUDBWTQorCQlXYjM1UmVnX0VQMFZNX3N0YXJ0KHBId0RhdGEpOworCQlyZXR1cm4gdHJ1ZTsKKwl9IGVsc2UgeworCQlpZiAodXJiKQorCQkJdXNiX2ZyZWVfdXJiKHVyYik7CisJCWtmcmVlKHJlZ19xdWV1ZSk7CisJCXJldHVybiBmYWxzZTsKKwl9Cit9CisKKy8vIHRydWUgIDogcmVhZCBjb21tYW5kIHByb2Nlc3Mgc3VjY2Vzc2Z1bGx5CisvLyBmYWxzZSA6IHJlZ2lzdGVyIG5vdCBzdXBwb3J0CisvLyBwUmVnaXN0ZXJWYWx1ZSA6IEl0IG11c3QgYmUgYSByZXNpZGVudCBidWZmZXIgZHVlIHRvIGFzeW5jaHJvbm91cyByZWFkIHJlZ2lzdGVyLgordW5zaWduZWQgY2hhcgorV2IzNVJlZ19SZWFkU3luYyggIHBod19kYXRhX3QgcEh3RGF0YSwgIHUxNiBSZWdpc3Rlck5vLCAgIHUzMiAqIHBSZWdpc3RlclZhbHVlICkKK3sKKwlzdHJ1Y3Qgd2IzNV9yZWcgKnJlZyA9ICZwSHdEYXRhLT5yZWc7CisJdTMyICoJcGx0bXAgPSBwUmVnaXN0ZXJWYWx1ZTsKKwlpbnQgcmV0ID0gLTE7CisKKwkvLyBNb2R1bGUgc2h1dGRvd24KKwlpZiAocEh3RGF0YS0+U3VycHJpc2VSZW1vdmUpCisJCXJldHVybiBmYWxzZTsKKworCS8vIFJlYWQgdGhlIHJlZ2lzdGVyIGJ5IHNlbmQgdXNiIG1lc3NhZ2UtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCXJlZy0+U3luY0lvUGF1c2UgPSAxOworCisJLy8gMjAwNjA3MTcuNSBXYWl0IHVudGlsIEVQMFZNIHN0b3AKKwl3aGlsZSAocmVnLT5FUDB2bV9zdGF0ZSAhPSBWTV9TVE9QKQorCQltc2xlZXAoMTApOworCisJcmVnLT5FUDB2bV9zdGF0ZSA9IFZNX1JVTk5JTkc7CisJcmV0ID0gdXNiX2NvbnRyb2xfbXNnKCBwSHdEYXRhLT5XYlVzYi51ZGV2LAorCQkJICAgICAgIHVzYl9yY3ZjdHJscGlwZShwSHdEYXRhLT5XYlVzYi51ZGV2LCAwKSwKKwkJCSAgICAgICAweDAxLCBVU0JfVFlQRV9WRU5ET1J8VVNCX1JFQ0lQX0RFVklDRXxVU0JfRElSX0lOLAorCQkJICAgICAgIDB4MCwgUmVnaXN0ZXJObywgcGx0bXAsIDQsIEhaKjEwMCApOworCisJKnBSZWdpc3RlclZhbHVlID0gY3B1X3RvX2xlMzIoKnBsdG1wKTsKKworCXJlZy0+RVAwdm1fc3RhdGUgPSBWTV9TVE9QOworCisJV2IzNVJlZ19VcGRhdGUoIHBId0RhdGEsIFJlZ2lzdGVyTm8sICpwUmVnaXN0ZXJWYWx1ZSApOworCXJlZy0+U3luY0lvUGF1c2UgPSAwOworCisJV2IzNVJlZ19FUDBWTV9zdGFydCggcEh3RGF0YSApOworCisJaWYgKHJldCA8IDApIHsKKwkJI2lmZGVmIF9QRV9SRUdfRFVNUF8KKwkJV0JERUJVRygoIkVQMCBSZWFkIHJlZ2lzdGVyIHVzYiBtZXNzYWdlIHNlbmRpbmcgZXJyb3JcbiIpKTsKKwkJI2VuZGlmCisKKwkJcEh3RGF0YS0+U3VycHJpc2VSZW1vdmUgPSAxOyAvLyAyMDA2MDcwNC4yCisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworLy8gdHJ1ZSAgOiByZWFkIGNvbW1hbmQgcHJvY2VzcyBzdWNjZXNzZnVsbHkKKy8vIGZhbHNlIDogcmVnaXN0ZXIgbm90IHN1cHBvcnQKKy8vIHBSZWdpc3RlclZhbHVlIDogSXQgbXVzdCBiZSBhIHJlc2lkZW50IGJ1ZmZlciBkdWUgdG8gYXN5bmNocm9ub3VzIHJlYWQgcmVnaXN0ZXIuCit1bnNpZ25lZCBjaGFyCitXYjM1UmVnX1JlYWQocGh3X2RhdGFfdCBwSHdEYXRhLCB1MTYgUmVnaXN0ZXJObywgIHUzMiAqIHBSZWdpc3RlclZhbHVlICkKK3sKKwlzdHJ1Y3Qgd2IzNV9yZWcgKnJlZyA9ICZwSHdEYXRhLT5yZWc7CisJc3RydWN0IHVzYl9jdHJscmVxdWVzdCAqIGRyOworCXN0cnVjdCB1cmIJKnVyYjsKKwlzdHJ1Y3Qgd2IzNV9yZWdfcXVldWUgKnJlZ19xdWV1ZTsKKwl1MTYJCVVyYlNpemU7CisKKwkvLyBNb2R1bGUgc2h1dGRvd24KKwlpZiAocEh3RGF0YS0+U3VycHJpc2VSZW1vdmUpCisJCXJldHVybiBmYWxzZTsKKworCS8vIHVwZGF0ZSB0aGUgdmFyaWFibGUgYnkgc2VuZCBVcmIgdG8gcmVhZCByZWdpc3RlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlVcmJTaXplID0gc2l6ZW9mKHN0cnVjdCB3YjM1X3JlZ19xdWV1ZSkgKyBzaXplb2Yoc3RydWN0IHVzYl9jdHJscmVxdWVzdCk7CisJcmVnX3F1ZXVlID0ga3phbGxvYyhVcmJTaXplLCBHRlBfQVRPTUlDKTsKKwl1cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9BVE9NSUMpOworCWlmKCB1cmIgJiYgcmVnX3F1ZXVlICkKKwl7CisJCXJlZ19xdWV1ZS0+RElSRUNUID0gMDsvLyByZWFkIHJlZ2lzdGVyCisJCXJlZ19xdWV1ZS0+SU5ERVggPSBSZWdpc3Rlck5vOworCQlyZWdfcXVldWUtPnBCdWZmZXIgPSBwUmVnaXN0ZXJWYWx1ZTsKKwkJZHIgPSAoc3RydWN0IHVzYl9jdHJscmVxdWVzdCAqKSgodTggKilyZWdfcXVldWUgKyBzaXplb2Yoc3RydWN0IHdiMzVfcmVnX3F1ZXVlKSk7CisJCWRyLT5iUmVxdWVzdFR5cGUgPSBVU0JfVFlQRV9WRU5ET1J8VVNCX1JFQ0lQX0RFVklDRXxVU0JfRElSX0lOOworCQlkci0+YlJlcXVlc3QgPSAweDAxOyAvLyBVU0Igb3IgdmVuZG9yLWRlZmluZWQgcmVxdWVzdCBjb2RlLCBidXJzdCBtb2RlCisJCWRyLT53VmFsdWUgPSBjcHVfdG9fbGUxNigweDApOworCQlkci0+d0luZGV4ID0gY3B1X3RvX2xlMTYgKFJlZ2lzdGVyTm8pOworCQlkci0+d0xlbmd0aCA9IGNwdV90b19sZTE2ICg0KTsKKworCQkvLyBFbnRlciB0aGUgc2VuZGluZyBxdWV1ZQorCQlyZWdfcXVldWUtPk5leHQgPSBOVUxMOworCQlyZWdfcXVldWUtPnBVc2JSZXEgPSBkcjsKKwkJcmVnX3F1ZXVlLT51cmIgPSB1cmI7CisJCXNwaW5fbG9ja19pcnEgKCAmcmVnLT5FUDBWTV9zcGluX2xvY2sgKTsKKwkJaWYoIHJlZy0+cmVnX2ZpcnN0ID09IE5VTEwgKQorCQkJcmVnLT5yZWdfZmlyc3QgPSByZWdfcXVldWU7CisJCWVsc2UKKwkJCXJlZy0+cmVnX2xhc3QtPk5leHQgPSByZWdfcXVldWU7CisJCXJlZy0+cmVnX2xhc3QgPSByZWdfcXVldWU7CisKKwkJc3Bpbl91bmxvY2tfaXJxKCAmcmVnLT5FUDBWTV9zcGluX2xvY2sgKTsKKworCQkvLyBTdGFydCBFUDBWTQorCQlXYjM1UmVnX0VQMFZNX3N0YXJ0KCBwSHdEYXRhICk7CisKKwkJcmV0dXJuIHRydWU7CisJfSBlbHNlIHsKKwkJaWYgKHVyYikKKwkJCXVzYl9mcmVlX3VyYiggdXJiICk7CisJCWtmcmVlKHJlZ19xdWV1ZSk7CisJCXJldHVybiBmYWxzZTsKKwl9Cit9CisKKwordm9pZAorV2IzNVJlZ19FUDBWTV9zdGFydCggIHBod19kYXRhX3QgcEh3RGF0YSApCit7CisJc3RydWN0IHdiMzVfcmVnICpyZWcgPSAmcEh3RGF0YS0+cmVnOworCisJaWYgKGF0b21pY19pbmNfcmV0dXJuKCZyZWctPlJlZ0ZpcmVDb3VudCkgPT0gMSkgeworCQlyZWctPkVQMHZtX3N0YXRlID0gVk1fUlVOTklORzsKKwkJV2IzNVJlZ19FUDBWTShwSHdEYXRhKTsKKwl9IGVsc2UKKwkJYXRvbWljX2RlYygmcmVnLT5SZWdGaXJlQ291bnQpOworfQorCit2b2lkCitXYjM1UmVnX0VQMFZNKHBod19kYXRhX3QgcEh3RGF0YSApCit7CisJc3RydWN0IHdiMzVfcmVnICpyZWcgPSAmcEh3RGF0YS0+cmVnOworCXN0cnVjdCB1cmIJKnVyYjsKKwlzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0ICpkcjsKKwl1MzIgKgkJcEJ1ZmZlcjsKKwlpbnQJCQlyZXQgPSAtMTsKKwlzdHJ1Y3Qgd2IzNV9yZWdfcXVldWUgKnJlZ19xdWV1ZTsKKworCisJaWYgKHJlZy0+U3luY0lvUGF1c2UpCisJCWdvdG8gY2xlYW51cDsKKworCWlmIChwSHdEYXRhLT5TdXJwcmlzZVJlbW92ZSkKKwkJZ290byBjbGVhbnVwOworCisJLy8gR2V0IHRoZSByZWdpc3RlciBkYXRhIGFuZCBzZW5kIHRvIFVTQiB0aHJvdWdoIElycAorCXNwaW5fbG9ja19pcnEoICZyZWctPkVQMFZNX3NwaW5fbG9jayApOworCXJlZ19xdWV1ZSA9IHJlZy0+cmVnX2ZpcnN0OworCXNwaW5fdW5sb2NrX2lycSggJnJlZy0+RVAwVk1fc3Bpbl9sb2NrICk7CisKKwlpZiAoIXJlZ19xdWV1ZSkKKwkJZ290byBjbGVhbnVwOworCisJLy8gR2V0IGFuIFVyYiwgc2VuZCBpdAorCXVyYiA9IChzdHJ1Y3QgdXJiICopcmVnX3F1ZXVlLT51cmI7CisKKwlkciA9IHJlZ19xdWV1ZS0+cFVzYlJlcTsKKwl1cmIgPSByZWdfcXVldWUtPnVyYjsKKwlwQnVmZmVyID0gcmVnX3F1ZXVlLT5wQnVmZmVyOworCWlmIChyZWdfcXVldWUtPkRJUkVDVCA9PSAxKSAvLyBvdXRwdXQKKwkJcEJ1ZmZlciA9ICZyZWdfcXVldWUtPlZBTFVFOworCisJdXNiX2ZpbGxfY29udHJvbF91cmIoIHVyYiwgcEh3RGF0YS0+V2JVc2IudWRldiwKKwkJCSAgICAgIFJFR19ESVJFQ1RJT04ocEh3RGF0YS0+V2JVc2IudWRldixyZWdfcXVldWUpLAorCQkJICAgICAgKHU4ICopZHIscEJ1ZmZlcixjcHVfdG9fbGUxNihkci0+d0xlbmd0aCksCisJCQkgICAgICBXYjM1UmVnX0VQMFZNX2NvbXBsZXRlLCAodm9pZCopcEh3RGF0YSk7CisKKwlyZWctPkVQMHZtX3N0YXRlID0gVk1fUlVOTklORzsKKworCXJldCA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQyk7CisKKwlpZiAocmV0IDwgMCkgeworI2lmZGVmIF9QRV9SRUdfRFVNUF8KKwkJV0JERUJVRygoIkVQMCBJcnAgc2VuZGluZyBlcnJvclxuIikpOworI2VuZGlmCisJCWdvdG8gY2xlYW51cDsKKwl9CisKKwlyZXR1cm47CisKKyBjbGVhbnVwOgorCXJlZy0+RVAwdm1fc3RhdGUgPSBWTV9TVE9QOworCWF0b21pY19kZWMoJnJlZy0+UmVnRmlyZUNvdW50KTsKK30KKworCit2b2lkCitXYjM1UmVnX0VQMFZNX2NvbXBsZXRlKHN0cnVjdCB1cmIgKnVyYikKK3sKKwlwaHdfZGF0YV90ICBwSHdEYXRhID0gKHBod19kYXRhX3QpdXJiLT5jb250ZXh0OworCXN0cnVjdCB3YjM1X3JlZyAqcmVnID0gJnBId0RhdGEtPnJlZzsKKwlzdHJ1Y3Qgd2IzNV9yZWdfcXVldWUgKnJlZ19xdWV1ZTsKKworCisJLy8gVmFyaWFibGUgc2V0dGluZworCXJlZy0+RVAwdm1fc3RhdGUgPSBWTV9DT01QTEVURUQ7CisJcmVnLT5FUDBWTV9zdGF0dXMgPSB1cmItPnN0YXR1czsKKworCWlmIChwSHdEYXRhLT5TdXJwcmlzZVJlbW92ZSkgeyAvLyBMZXQgV2JXbGFuSGFsdCB0byBoYW5kbGUgc3VycHJpc2UgcmVtb3ZlCisJCXJlZy0+RVAwdm1fc3RhdGUgPSBWTV9TVE9QOworCQlhdG9taWNfZGVjKCZyZWctPlJlZ0ZpcmVDb3VudCk7CisJfSBlbHNlIHsKKwkJLy8gQ29tcGxldGUgdG8gc2VuZCwgcmVtb3ZlIHRoZSBVUkIgZnJvbSB0aGUgZmlyc3QKKwkJc3Bpbl9sb2NrX2lycSggJnJlZy0+RVAwVk1fc3Bpbl9sb2NrICk7CisJCXJlZ19xdWV1ZSA9IHJlZy0+cmVnX2ZpcnN0OworCQlpZiAocmVnX3F1ZXVlID09IHJlZy0+cmVnX2xhc3QpCisJCQlyZWctPnJlZ19sYXN0ID0gTlVMTDsKKwkJcmVnLT5yZWdfZmlyc3QgPSByZWctPnJlZ19maXJzdC0+TmV4dDsKKwkJc3Bpbl91bmxvY2tfaXJxKCAmcmVnLT5FUDBWTV9zcGluX2xvY2sgKTsKKworCQlpZiAocmVnLT5FUDBWTV9zdGF0dXMpIHsKKyNpZmRlZiBfUEVfUkVHX0RVTVBfCisJCQlXQkRFQlVHKCgiRVAwIElvQ29tcGxldGVSb3V0aW5lIHJldHVybiBlcnJvclxuIikpOworCQkJRGVidWdVc2JkU3RhdHVzSW5mb3JtYXRpb24oIHJlZy0+RVAwVk1fc3RhdHVzICk7CisjZW5kaWYKKwkJCXJlZy0+RVAwdm1fc3RhdGUgPSBWTV9TVE9QOworCQkJcEh3RGF0YS0+U3VycHJpc2VSZW1vdmUgPSAxOworCQl9IGVsc2UgeworCQkJLy8gU3VjY2Vzcy4gVXBkYXRlIHRoZSByZXN1bHQKKworCQkJLy8gU3RhcnQgdGhlIG5leHQgc2VuZAorCQkJV2IzNVJlZ19FUDBWTShwSHdEYXRhKTsKKwkJfQorCisgICAJCWtmcmVlKHJlZ19xdWV1ZSk7CisJfQorCisJdXNiX2ZyZWVfdXJiKHVyYik7Cit9CisKKwordm9pZAorV2IzNVJlZ19kZXN0cm95KHBod19kYXRhX3QgcEh3RGF0YSkKK3sKKwlzdHJ1Y3Qgd2IzNV9yZWcgKnJlZyA9ICZwSHdEYXRhLT5yZWc7CisJc3RydWN0IHVyYgkqdXJiOworCXN0cnVjdCB3YjM1X3JlZ19xdWV1ZSAqcmVnX3F1ZXVlOworCisKKwlVeHhfcG93ZXJfb2ZmX3Byb2NlZHVyZShwSHdEYXRhKTsKKworCS8vIFdhaXQgZm9yIFJlZyBvcGVyYXRpb24gY29tcGxldGVkCisJZG8geworCQltc2xlZXAoMTApOyAvLyBEZWxheSBmb3Igd2FpdGluZyBmdW5jdGlvbiBlbnRlciA5NDA2MjMuMS5hCisJfSB3aGlsZSAocmVnLT5FUDB2bV9zdGF0ZSAhPSBWTV9TVE9QKTsKKwltc2xlZXAoMTApOyAgLy8gRGVsYXkgZm9yIHdhaXRpbmcgZnVuY3Rpb24gZW50ZXIgOTQwNjIzLjEuYgorCisJLy8gUmVsZWFzZSBhbGwgdGhlIGRhdGEgaW4gUmVnUXVldWUKKwlzcGluX2xvY2tfaXJxKCAmcmVnLT5FUDBWTV9zcGluX2xvY2sgKTsKKwlyZWdfcXVldWUgPSByZWctPnJlZ19maXJzdDsKKwl3aGlsZSAocmVnX3F1ZXVlKSB7CisJCWlmIChyZWdfcXVldWUgPT0gcmVnLT5yZWdfbGFzdCkKKwkJCXJlZy0+cmVnX2xhc3QgPSBOVUxMOworCQlyZWctPnJlZ19maXJzdCA9IHJlZy0+cmVnX2ZpcnN0LT5OZXh0OworCisJCXVyYiA9IHJlZ19xdWV1ZS0+dXJiOworCQlzcGluX3VubG9ja19pcnEoICZyZWctPkVQMFZNX3NwaW5fbG9jayApOworCQlpZiAodXJiKSB7CisJCQl1c2JfZnJlZV91cmIodXJiKTsKKwkJCWtmcmVlKHJlZ19xdWV1ZSk7CisJCX0gZWxzZSB7CisJCQkjaWZkZWYgX1BFX1JFR19EVU1QXworCQkJV0JERUJVRygoIkVQMCBxdWV1ZSByZWxlYXNlIGVycm9yXG4iKSk7CisJCQkjZW5kaWYKKwkJfQorCQlzcGluX2xvY2tfaXJxKCAmcmVnLT5FUDBWTV9zcGluX2xvY2sgKTsKKworCQlyZWdfcXVldWUgPSByZWctPnJlZ19maXJzdDsKKwl9CisJc3Bpbl91bmxvY2tfaXJxKCAmcmVnLT5FUDBWTV9zcGluX2xvY2sgKTsKK30KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIFRoZSBmdW5jdGlvbiBjYW4gYmUgcnVuIGluIHBhc3NpdmUtbGV2ZWwgb25seS4KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cit1bnNpZ25lZCBjaGFyIFdiMzVSZWdfaW5pdGlhbChwaHdfZGF0YV90IHBId0RhdGEpCit7CisJc3RydWN0IHdiMzVfcmVnICpyZWc9JnBId0RhdGEtPnJlZzsKKwl1MzIgbHRtcDsKKwl1MzIgU29mdHdhcmVTZXQsIFZDT190cmltLCBUeFZnYSwgUmVnaW9uX1NjYW5JbnRlcnZhbDsKKworCS8vIFNwaW4gbG9jayBpcyBhY3F1aXJlZCBmb3IgcmVhZCBhbmQgd3JpdGUgSVJQIGNvbW1hbmQKKwlzcGluX2xvY2tfaW5pdCggJnJlZy0+RVAwVk1fc3Bpbl9sb2NrICk7CisKKwkvLyBHZXR0aW5nIFJGIG1vZHVsZSB0eXBlIGZyb20gRUVQUk9NIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCVdiMzVSZWdfV3JpdGVTeW5jKCBwSHdEYXRhLCAweDAzYjQsIDB4MDgwZDAwMDAgKTsgLy8gU3RhcnQgRUVQUk9NIGFjY2VzcyArIFJlYWQgKyBhZGRyZXNzKDB4MGQpCisJV2IzNVJlZ19SZWFkU3luYyggcEh3RGF0YSwgMHgwM2I0LCAmbHRtcCApOworCisJLy9VcGRhdGUgUkYgbW9kdWxlIHR5cGUgYW5kIGRldGVybWluZSB0aGUgUEhZIHR5cGUgYnkgaW5mIG9yIEVFUFJPTQorCXJlZy0+RUVQUk9NUGh5VHlwZSA9ICh1OCkoIGx0bXAgJiAweGZmICk7CisJLy8gMCBWIE1BWDI4MjUsIDEgViBNQVgyODI3LCAyIFYgTUFYMjgyOCwgMyBWIE1BWDI4MjkKKwkvLyAxNlYgQUwyMjMwLCAxNyAtIEFMNzIzMCwgMTggLSBBTDIyMzBTCisJLy8gMzIgUmVzZXJ2ZWQKKwkvLyAzMyAtIFc4OVJGMjQyKFR4VkdBIDB+MTkpLCAzNCAtIFc4OVJGMjQyKFR4VkdBIDB+MzQpCisJaWYgKHJlZy0+RUVQUk9NUGh5VHlwZSAhPSBSRl9ERUNJREVfQllfSU5GKSB7CisJCWlmKCAocmVnLT5FRVBST01QaHlUeXBlID09IFJGX01BWElNXzI4MjUpCXx8CisJCQkocmVnLT5FRVBST01QaHlUeXBlID09IFJGX01BWElNXzI4MjcpCXx8CisJCQkocmVnLT5FRVBST01QaHlUeXBlID09IFJGX01BWElNXzI4MjgpCXx8CisJCQkocmVnLT5FRVBST01QaHlUeXBlID09IFJGX01BWElNXzI4MjkpCXx8CisJCQkocmVnLT5FRVBST01QaHlUeXBlID09IFJGX01BWElNX1YxKQl8fAorCQkJKHJlZy0+RUVQUk9NUGh5VHlwZSA9PSBSRl9BSVJPSEFfMjIzMCkJfHwKKwkJCShyZWctPkVFUFJPTVBoeVR5cGUgPT0gUkZfQUlST0hBXzIyMzBTKSAgICB8fAorCQkJKHJlZy0+RUVQUk9NUGh5VHlwZSA9PSBSRl9BSVJPSEFfNzIzMCkJfHwKKwkJCShyZWctPkVFUFJPTVBoeVR5cGUgPT0gUkZfV0JfMjQyKQkJfHwKKwkJCShyZWctPkVFUFJPTVBoeVR5cGUgPT0gUkZfV0JfMjQyXzEpKQorCQkJcEh3RGF0YS0+cGh5X3R5cGUgPSByZWctPkVFUFJPTVBoeVR5cGU7CisJfQorCisJLy8gUG93ZXIgT24gcHJvY2VkdXJlIHJ1bm5pbmcuIFRoZSByZWxhdGl2ZSBwYXJhbWV0ZXIgd2lsbCBiZSBzZXQgYWNjb3JkaW5nIHRvIHBoeV90eXBlCisJVXh4X3Bvd2VyX29uX3Byb2NlZHVyZSggcEh3RGF0YSApOworCisJLy8gUmVhZGluZyBNQUMgYWRkcmVzcworCVV4eF9SZWFkRXRoZXJuZXRBZGRyZXNzKCBwSHdEYXRhICk7CisKKwkvLyBSZWFkIFZDTyB0cmltIGZvciBSRiBwYXJhbWV0ZXIKKwlXYjM1UmVnX1dyaXRlU3luYyggcEh3RGF0YSwgMHgwM2I0LCAweDA4MjAwMDAwICk7CisJV2IzNVJlZ19SZWFkU3luYyggcEh3RGF0YSwgMHgwM2I0LCAmVkNPX3RyaW0gKTsKKworCS8vIFJlYWQgQW50ZW5uYSBPbi9PZmYgb2Ygc29mdHdhcmUgZmxhZworCVdiMzVSZWdfV3JpdGVTeW5jKCBwSHdEYXRhLCAweDAzYjQsIDB4MDgyMTAwMDAgKTsKKwlXYjM1UmVnX1JlYWRTeW5jKCBwSHdEYXRhLCAweDAzYjQsICZTb2Z0d2FyZVNldCApOworCisJLy8gUmVhZCBUWFZHQQorCVdiMzVSZWdfV3JpdGVTeW5jKCBwSHdEYXRhLCAweDAzYjQsIDB4MDgxMDAwMDAgKTsKKwlXYjM1UmVnX1JlYWRTeW5jKCBwSHdEYXRhLCAweDAzYjQsICZUeFZnYSApOworCisJLy8gR2V0IFNjYW4gaW50ZXJ2YWwgc2V0dGluZyBmcm9tIEVFUFJPTSBvZmZzZXQgMHgxYworCVdiMzVSZWdfV3JpdGVTeW5jKCBwSHdEYXRhLCAweDAzYjQsIDB4MDgxZDAwMDAgKTsKKwlXYjM1UmVnX1JlYWRTeW5jKCBwSHdEYXRhLCAweDAzYjQsICZSZWdpb25fU2NhbkludGVydmFsICk7CisKKwkvLyBVcGRhdGUgRXRoZXJuZXQgYWRkcmVzcworCW1lbWNweSggcEh3RGF0YS0+Q3VycmVudE1hY0FkZHJlc3MsIHBId0RhdGEtPlBlcm1hbmVudE1hY0FkZHJlc3MsIEVUSF9MRU5HVEhfT0ZfQUREUkVTUyApOworCisJLy8gVXBkYXRlIHNvZnR3YXJlIHZhcmlhYmxlCisJcEh3RGF0YS0+U29mdHdhcmVTZXQgPSAodTE2KShTb2Z0d2FyZVNldCAmIDB4ZmZmZik7CisJVHhWZ2EgJj0gMHgwMDAwMDBmZjsKKwlwSHdEYXRhLT5Qb3dlckluZGV4RnJvbUVFUFJPTSA9ICh1OClUeFZnYTsKKwlwSHdEYXRhLT5WQ09fdHJpbSA9ICh1OClWQ09fdHJpbSAmIDB4ZmY7CisJaWYgKHBId0RhdGEtPlZDT190cmltID09IDB4ZmYpCisJCXBId0RhdGEtPlZDT190cmltID0gMHgyODsKKworCXJlZy0+RUVQUk9NUmVnaW9uID0gKHU4KShSZWdpb25fU2NhbkludGVydmFsPj44KTsgLy8gMjAwNjA3MjAKKwlpZiggcmVnLT5FRVBST01SZWdpb248MSB8fCByZWctPkVFUFJPTVJlZ2lvbj42ICkKKwkJcmVnLT5FRVBST01SZWdpb24gPSBSRUdJT05fQVVUTzsKKworCS8vRm9yIEdldCBUeCBWR0EgZnJvbSBFRVBST00gMjAwNjAzMTUuNSBtb3ZlIGhlcmUKKwlHZXRUeFZnYUZyb21FRVBST00oIHBId0RhdGEgKTsKKworCS8vIFNldCBTY2FuIEludGVydmFsCisJcEh3RGF0YS0+U2Nhbl9JbnRlcnZhbCA9ICh1OCkoUmVnaW9uX1NjYW5JbnRlcnZhbCAmIDB4ZmYpICogMTA7CisJaWYgKChwSHdEYXRhLT5TY2FuX0ludGVydmFsID09IDI1NTApIHx8IChwSHdEYXRhLT5TY2FuX0ludGVydmFsIDwgMTApKSAvLyBJcyBkZWZhdWx0IHNldHRpbmcgMHhmZiAqIDEwCisJCXBId0RhdGEtPlNjYW5fSW50ZXJ2YWwgPSBTQ0FOX01BWF9DSE5MX1RJTUU7CisKKwkvLyBJbml0aWFsIHJlZ2lzdGVyCisJUkZTeW50aGVzaXplcl9pbml0aWFsKHBId0RhdGEpOworCisJQkJQcm9jZXNzb3JfaW5pdGlhbChwSHdEYXRhKTsgLy8gQXN5bmMgd3JpdGUsIG11c3Qgd2FpdCB1bnRpbCBjb21wbGV0ZQorCisJV2IzNVJlZ19waHlfY2FsaWJyYXRpb24ocEh3RGF0YSk7CisKKwlNeHhfaW5pdGlhbChwSHdEYXRhKTsKKwlEeHhfaW5pdGlhbChwSHdEYXRhKTsKKworCWlmIChwSHdEYXRhLT5TdXJwcmlzZVJlbW92ZSkKKwkJcmV0dXJuIGZhbHNlOworCWVsc2UKKwkJcmV0dXJuIHRydWU7IC8vIEluaXRpYWwgZmFpbAorfQorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyAgQ2FyZENvbXB1dGVDcmMgLS0KKy8vCisvLyAgRGVzY3JpcHRpb246CisvLyAgICBSdW5zIHRoZSBBVVRPRElOIElJIENSQyBhbGdvcml0aG0gb24gYnVmZmVyIEJ1ZmZlciBvZiBsZW5ndGgsIExlbmd0aC4KKy8vCisvLyAgQXJndW1lbnRzOgorLy8gICAgQnVmZmVyIC0gdGhlIGlucHV0IGJ1ZmZlcgorLy8gICAgTGVuZ3RoIC0gdGhlIGxlbmd0aCBvZiBCdWZmZXIKKy8vCisvLyAgUmV0dXJuIFZhbHVlOgorLy8gICAgVGhlIDMyLWJpdCBDUkMgdmFsdWUuCisvLworLy8gIE5vdGU6CisvLyAgICBUaGlzIGlzIGFkYXB0ZWQgZnJvbSB0aGUgY29tbWVudHMgaW4gdGhlIGFzc2VtYmx5IGxhbmd1YWdlCisvLyAgICB2ZXJzaW9uIGluIF9HRU5SRVEuQVNNIG9mIHRoZSBEV0IgTkUxMDAwLzIwMDAgZHJpdmVyLgorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cit1MzIKK0NhcmRDb21wdXRlQ3JjKHU4ICogQnVmZmVyLCB1MzIgTGVuZ3RoKQoreworICAgIHUzMiBDcmMsIENhcnJ5OworICAgIHUzMiAgaSwgajsKKyAgICB1OCBDdXJCeXRlOworCisgICAgQ3JjID0gMHhmZmZmZmZmZjsKKworICAgIGZvciAoaSA9IDA7IGkgPCBMZW5ndGg7IGkrKykgeworCisgICAgICAgIEN1ckJ5dGUgPSBCdWZmZXJbaV07CisKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IDg7IGorKykgeworCisgICAgICAgICAgICBDYXJyeSAgICAgPSAoKENyYyAmIDB4ODAwMDAwMDApID8gMSA6IDApIF4gKEN1ckJ5dGUgJiAweDAxKTsKKyAgICAgICAgICAgIENyYyAgICAgPDw9IDE7CisgICAgICAgICAgICBDdXJCeXRlID4+PSAxOworCisgICAgICAgICAgICBpZiAoQ2FycnkpIHsKKyAgICAgICAgICAgICAgICBDcmMgPShDcmMgXiAweDA0YzExZGI2KSB8IENhcnJ5OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIENyYzsKK30KKworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gQml0UmV2ZXJzZSAtLQorLy8gICBSZXZlcnNlIHRoZSBiaXRzIGluIHRoZSBpbnB1dCBhcmd1bWVudCwgZHdEYXRhLCB3aGljaCBpcworLy8gICByZWdhcmRlZCBhcyBhIHN0cmluZyBvZiBiaXRzIHdpdGggdGhlIGxlbmd0aCwgRGF0YUxlbmd0aC4KKy8vCisvLyBBcmd1bWVudHM6CisvLyAgIGR3RGF0YSAgICAgOgorLy8gICBEYXRhTGVuZ3RoIDoKKy8vCisvLyBSZXR1cm46CisvLyAgIFRoZSBjb252ZXJ0ZWQgdmFsdWUuCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQordTMyIEJpdFJldmVyc2UoIHUzMiBkd0RhdGEsIHUzMiBEYXRhTGVuZ3RoKQoreworCXUzMiAgIEhhbGZMZW5ndGgsIGksIGo7CisJdTMyICAgQml0QSwgQml0QjsKKworCWlmICggRGF0YUxlbmd0aCA8PSAwKSAgICAgICByZXR1cm4gMDsgICAvLyBObyBjb252ZXJzaW9uIGlzIGRvbmUuCisJZHdEYXRhID0gZHdEYXRhICYgKDB4ZmZmZmZmZmYgPj4gKDMyIC0gRGF0YUxlbmd0aCkpOworCisJSGFsZkxlbmd0aCA9IERhdGFMZW5ndGggLyAyOworCWZvciAoIGkgPSAwLCBqID0gRGF0YUxlbmd0aC0xIDsgaSA8IEhhbGZMZW5ndGg7IGkrKywgai0tKQorCXsKKwkJQml0QSA9IEdldEJpdCggZHdEYXRhLCBpKTsKKwkJQml0QiA9IEdldEJpdCggZHdEYXRhLCBqKTsKKwkJaWYgKEJpdEEgJiYgIUJpdEIpIHsKKwkJCWR3RGF0YSA9IENsZWFyQml0KCBkd0RhdGEsIGkpOworCQkJZHdEYXRhID0gU2V0Qml0KCBkd0RhdGEsIGopOworCQl9IGVsc2UgaWYgKCFCaXRBICYmIEJpdEIpIHsKKwkJCWR3RGF0YSA9IFNldEJpdCggZHdEYXRhLCBpKTsKKwkJCWR3RGF0YSA9IENsZWFyQml0KCBkd0RhdGEsIGopOworCQl9IGVsc2UKKwkJeworCQkJLy8gRG8gbm90aGluZyBzaW5jZSB0aGVzZSB0d28gYml0cyBhcmUgb2YgdGhlIHNhdmUgdmFsdWVzLgorCQl9CisJfQorCisJcmV0dXJuIGR3RGF0YTsKK30KKwordm9pZCBXYjM1UmVnX3BoeV9jYWxpYnJhdGlvbiggIHBod19kYXRhX3QgcEh3RGF0YSApCit7CisJdTMyIEJCM2MsIEJCNTQ7CisKKwlpZiAoKHBId0RhdGEtPnBoeV90eXBlID09IFJGX1dCXzI0MikgfHwKKwkJKHBId0RhdGEtPnBoeV90eXBlID09IFJGX1dCXzI0Ml8xKSkgeworCQlwaHlfY2FsaWJyYXRpb25fd2luYm9uZCAoIHBId0RhdGEsIDI0MTIgKTsgLy8gU3luYyBvcGVyYXRpb24KKwkJV2IzNVJlZ19SZWFkU3luYyggcEh3RGF0YSwgMHgxMDNjLCAmQkIzYyApOworCQlXYjM1UmVnX1JlYWRTeW5jKCBwSHdEYXRhLCAweDEwNTQsICZCQjU0ICk7CisKKwkJcEh3RGF0YS0+QkIzY19jYWwgPSBCQjNjOworCQlwSHdEYXRhLT5CQjU0X2NhbCA9IEJCNTQ7CisKKwkJUkZTeW50aGVzaXplcl9pbml0aWFsKHBId0RhdGEpOworCQlCQlByb2Nlc3Nvcl9pbml0aWFsKHBId0RhdGEpOyAvLyBBc3luYyBvcGVyYXRpb24KKworCQlXYjM1UmVnX1dyaXRlU3luYyggcEh3RGF0YSwgMHgxMDNjLCBCQjNjICk7CisJCVdiMzVSZWdfV3JpdGVTeW5jKCBwSHdEYXRhLCAweDEwNTQsIEJCNTQgKTsKKwl9Cit9CisKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2IzNXJlZ19mLmggYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YjM1cmVnX2YuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTcyMTVhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2IzNXJlZ19mLmgKQEAgLTAsMCArMSw2MSBAQAorI2lmbmRlZiBfX1dJTkJPTkRfV0IzNVJFR19GX0gKKyNkZWZpbmUgX19XSU5CT05EX1dCMzVSRUdfRl9ICisKKyNpbmNsdWRlICJ3YmhhbF9zLmgiCisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBJbnRlcmZhY2UgZnVuY3Rpb24gZGVjbGFyZQorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK3Vuc2lnbmVkIGNoYXIgV2IzNVJlZ19pbml0aWFsKCAgcGh3X2RhdGFfdCBwSHdEYXRhICk7Cit2b2lkIFV4eF9wb3dlcl9vbl9wcm9jZWR1cmUoICBwaHdfZGF0YV90IHBId0RhdGEgKTsKK3ZvaWQgVXh4X3Bvd2VyX29mZl9wcm9jZWR1cmUoICBwaHdfZGF0YV90IHBId0RhdGEgKTsKK3ZvaWQgVXh4X1JlYWRFdGhlcm5ldEFkZHJlc3MoICBwaHdfZGF0YV90IHBId0RhdGEgKTsKK3ZvaWQgRHh4X2luaXRpYWwoICBwaHdfZGF0YV90IHBId0RhdGEgKTsKK3ZvaWQgTXh4X2luaXRpYWwoICBwaHdfZGF0YV90IHBId0RhdGEgKTsKK3ZvaWQgUkZTeW50aGVzaXplcl9pbml0aWFsKCAgcGh3X2RhdGFfdCBwSHdEYXRhICk7CisvL3ZvaWQgUkZTeW50aGVzaXplcl9Td2l0Y2hpbmdDaGFubmVsKCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgczggQ2hhbm5lbCApOwordm9pZCBSRlN5bnRoZXNpemVyX1N3aXRjaGluZ0NoYW5uZWwoICBwaHdfZGF0YV90IHBId0RhdGEsICBDaGFuSW5mbyBDaGFubmVsICk7Cit2b2lkIEJCUHJvY2Vzc29yX2luaXRpYWwoICBwaHdfZGF0YV90IHBId0RhdGEgKTsKK3ZvaWQgQkJQcm9jZXNzb3JfUmF0ZUNoYW5naW5nKCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgdTggcmF0ZSApOyAvLyAyMDA2MDYxMy4xCisvL3ZvaWQgUkZfUmF0ZUNoYW5naW5nKCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgdTggcmF0ZSApOyAvLyAyMDA2MDYyNi41LmMgQWRkCit1OCBSRlN5bnRoZXNpemVyX1NldFBvd2VySW5kZXgoICBwaHdfZGF0YV90IHBId0RhdGEsICB1OCBQb3dlckluZGV4ICk7Cit1OCBSRlN5bnRoZXNpemVyX1NldE1heGltMjgyOF8yNFBvd2VyKCAgcGh3X2RhdGFfdCwgIHU4IGluZGV4ICk7Cit1OCBSRlN5bnRoZXNpemVyX1NldE1heGltMjgyOF81MFBvd2VyKCAgcGh3X2RhdGFfdCwgIHU4IGluZGV4ICk7Cit1OCBSRlN5bnRoZXNpemVyX1NldE1heGltMjgyN18yNFBvd2VyKCAgcGh3X2RhdGFfdCwgIHU4IGluZGV4ICk7Cit1OCBSRlN5bnRoZXNpemVyX1NldE1heGltMjgyN181MFBvd2VyKCAgcGh3X2RhdGFfdCwgIHU4IGluZGV4ICk7Cit1OCBSRlN5bnRoZXNpemVyX1NldE1heGltMjgyNVBvd2VyKCAgcGh3X2RhdGFfdCwgIHU4IGluZGV4ICk7Cit1OCBSRlN5bnRoZXNpemVyX1NldEFpcm9oYTIyMzBQb3dlciggIHBod19kYXRhX3QsICB1OCBpbmRleCApOwordTggUkZTeW50aGVzaXplcl9TZXRBaXJvaGE3MjMwUG93ZXIoICBwaHdfZGF0YV90LCAgdTggaW5kZXggKTsKK3U4IFJGU3ludGhlc2l6ZXJfU2V0V2luYm9uZDI0MlBvd2VyKCAgcGh3X2RhdGFfdCwgIHU4IGluZGV4ICk7Cit2b2lkIEdldFR4VmdhRnJvbUVFUFJPTSggIHBod19kYXRhX3QgcEh3RGF0YSApOwordm9pZCBFRVBST01UeFZnYUFkanVzdCggIHBod19kYXRhX3QgcEh3RGF0YSApOyAvLyAyMDA2MDYxOS41IEFkZAorCisjZGVmaW5lIFJGV3JpdGVDb250cm9sRGF0YSggX0EsIF9WICkgV2IzNVJlZ19Xcml0ZSggX0EsIDB4MDg2NCwgX1YgKQorCit2b2lkIFdiMzVSZWdfZGVzdHJveSggIHBod19kYXRhX3QgcEh3RGF0YSApOworCit1bnNpZ25lZCBjaGFyIFdiMzVSZWdfUmVhZCggIHBod19kYXRhX3QgcEh3RGF0YSwgIHUxNiBSZWdpc3Rlck5vLCAgIHUzMiAqIHBSZWdpc3RlclZhbHVlICk7Cit1bnNpZ25lZCBjaGFyIFdiMzVSZWdfUmVhZFN5bmMoICBwaHdfZGF0YV90IHBId0RhdGEsICB1MTYgUmVnaXN0ZXJObywgICB1MzIgKiBwUmVnaXN0ZXJWYWx1ZSApOwordW5zaWduZWQgY2hhciBXYjM1UmVnX1dyaXRlKCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgdTE2IFJlZ2lzdGVyTm8sICB1MzIgUmVnaXN0ZXJWYWx1ZSApOwordW5zaWduZWQgY2hhciBXYjM1UmVnX1dyaXRlU3luYyggIHBod19kYXRhX3QgcEh3RGF0YSwgIHUxNiBSZWdpc3Rlck5vLCAgdTMyIFJlZ2lzdGVyVmFsdWUgKTsKK3Vuc2lnbmVkIGNoYXIgV2IzNVJlZ19Xcml0ZVdpdGhDYWxsYmFja1ZhbHVlKCAgcGh3X2RhdGFfdCBwSHdEYXRhLAorCQkJCQkJCQkgdTE2IFJlZ2lzdGVyTm8sCisJCQkJCQkJCSB1MzIgUmVnaXN0ZXJWYWx1ZSwKKwkJCQkJCQkJIHM4ICpwVmFsdWUsCisJCQkJCQkJCSBzOCBMZW4pOwordW5zaWduZWQgY2hhciBXYjM1UmVnX0J1cnN0V3JpdGUoICBwaHdfZGF0YV90IHBId0RhdGEsICB1MTYgUmVnaXN0ZXJObywgIHUzMiAqIHBSZWdpc3RlckRhdGEsICB1OCBOdW1iZXJPZkRhdGEsICB1OCBGbGFnICk7CisKK3ZvaWQgV2IzNVJlZ19FUDBWTSggIHBod19kYXRhX3QgcEh3RGF0YSApOwordm9pZCBXYjM1UmVnX0VQMFZNX3N0YXJ0KCAgcGh3X2RhdGFfdCBwSHdEYXRhICk7Cit2b2lkIFdiMzVSZWdfRVAwVk1fY29tcGxldGUoc3RydWN0IHVyYiAqdXJiKTsKKwordTMyIEJpdFJldmVyc2UoIHUzMiBkd0RhdGEsIHUzMiBEYXRhTGVuZ3RoKTsKKwordm9pZCBDYXJkR2V0TXVsdGljYXN0Qml0KCAgIHU4IEFkZHJlc3NbTUFDX0FERFJfTEVOR1RIXSwgIHU4ICpCeXRlLCAgdTggKlZhbHVlICk7Cit1MzIgQ2FyZENvbXB1dGVDcmMoICB1OCAqIEJ1ZmZlciwgIHUzMiBMZW5ndGggKTsKKwordm9pZCBXYjM1UmVnX3BoeV9jYWxpYnJhdGlvbiggIHBod19kYXRhX3QgcEh3RGF0YSApOwordm9pZCBXYjM1UmVnX1VwZGF0ZSggIHBod19kYXRhX3QgcEh3RGF0YSwgIHUxNiBSZWdpc3Rlck5vLCAgdTMyIFJlZ2lzdGVyVmFsdWUgKTsKK3Vuc2lnbmVkIGNoYXIgYWRqdXN0X1RYVkdBX2Zvcl9pcV9tYWcoICBwaHdfZGF0YV90IHBId0RhdGEgKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YjM1cmVnX3MuaCBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3diMzVyZWdfcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyZWY0YjgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YjM1cmVnX3MuaApAQCAtMCwwICsxLDE3MiBAQAorI2lmbmRlZiBfX1dJTkJPTkRfV0IzNVJFR19TX0gKKyNkZWZpbmUgX19XSU5CT05EX1dCMzVSRUdfU19ICisKKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLyoKKwkJCQlIQUwgc2V0dGluZyBmdW5jdGlvbgorCisJCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkJfFV4eHwgCXxEeHh8CXxNeHh8CXxCQnwJfFJGfAorCQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJCQl8CQkJCQl8CisJCVdiMzVSZWdfUmVhZAkJV2IzNVJlZ19Xcml0ZQorCisJCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJCQlXYlVzYl9DYWxsVVNCREFTeW5jCQkJCQlzdXBwbGllZCBCeSBXYlVzYiBtb2R1bGUKKyovCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisjZGVmaW5lICAgICBHZXRCaXQoIGR3RGF0YSwgaSkgICAgICAoIGR3RGF0YSAmICgweDAwMDAwMDAxIDw8IGkpKQorI2RlZmluZSAgICAgU2V0Qml0KCBkd0RhdGEsIGkpICAgICAgKCBkd0RhdGEgfCAoMHgwMDAwMDAwMSA8PCBpKSkKKyNkZWZpbmUgICAgIENsZWFyQml0KCBkd0RhdGEsIGkpICAgICggZHdEYXRhICYgfigweDAwMDAwMDAxIDw8IGkpKQorCisjZGVmaW5lCQlJR05PUkVfSU5DUkVNRU5UCTAKKyNkZWZpbmUJCUFVVE9fSU5DUkVNRU5UCQkwCisjZGVmaW5lCQlOT19JTkNSRU1FTlQJCTEKKyNkZWZpbmUgUkVHX0RJUkVDVElPTihfeCxfeSkgICAoKF95KS0+RElSRUNUID09MCA/IHVzYl9yY3ZjdHJscGlwZShfeCwwKSA6IHVzYl9zbmRjdHJscGlwZShfeCwwKSkKKyNkZWZpbmUgUkVHX0JVRl9TSVpFKF94KSAgICAgICAoKF94KS0+YlJlcXVlc3Q9PSAweDA0ID8gY3B1X3RvX2xlMTYoKF94KS0+d0xlbmd0aCkgOiA0KQorCisvLyAyMDA2MDYxMy4yIEFkZCB0aGUgZm9sbG93IGRlZmluaXRpb24KKyNkZWZpbmUgQkI0OF9ERUZBVUxUX0FMMjIzMF8xMUIJCTB4MDAzMzQ0N2MKKyNkZWZpbmUgQkI0Q19ERUZBVUxUX0FMMjIzMF8xMUIJCTB4MEEwMEZFRkYKKyNkZWZpbmUgQkI0OF9ERUZBVUxUX0FMMjIzMF8xMUcJCTB4MDAzMzJDMUIKKyNkZWZpbmUgQkI0Q19ERUZBVUxUX0FMMjIzMF8xMUcJCTB4MEEwMEZFRkYKKworCisjZGVmaW5lIEJCNDhfREVGQVVMVF9XQjI0Ml8xMUIJCTB4MDAyOTIzMTUJLy9iYWNrb2ZmICAyZEIKKyNkZWZpbmUgQkI0Q19ERUZBVUxUX1dCMjQyXzExQgkJMHgwODAwRkVGRgkvL2JhY2tvZmYgIDJkQgorLy8jZGVmaW5lIEJCNDhfREVGQVVMVF9XQjI0Ml8xMUIJCTB4MDAyMDFCMTEJLy9iYWNrb2ZmICA0ZEIKKy8vI2RlZmluZSBCQjRDX0RFRkFVTFRfV0IyNDJfMTFCCQkweDA2MDBGRjAwCS8vYmFja29mZiAgNGRCCisjZGVmaW5lIEJCNDhfREVGQVVMVF9XQjI0Ml8xMUcJCTB4MDA0NTNCMjQKKyNkZWZpbmUgQkI0Q19ERUZBVUxUX1dCMjQyXzExRwkJMHgwRTAwRkVGRgorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gRGVmYXVsdCBzZXR0aW5nIGZvciBNeHgKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjZGVmaW5lIERFRkFVTFRfQ1dNSU4JCQkJCTMxCQkvLyhNMkMpIENXbWluLiBJdHMgdmFsdWUgaXMgaW4gdGhlIHJhbmdlIDAtMzEuCisjZGVmaW5lIERFRkFVTFRfQ1dNQVgJCQkJCTEwMjMJLy8oTTJDKSBDV21heC4gSXRzIHZhbHVlIGlzIGluIHRoZSByYW5nZSAwLTEwMjMuCisjZGVmaW5lIERFRkFVTFRfQUlECQkJCQkJMQkJLy8oTTM0KSBBSUQuIEl0cyB2YWx1ZSBpcyBpbiB0aGUgcmFuZ2UgMS0yMDA3LgorCisjaWZkZWYgX1VTRV9GQUxMQkFDS19SQVRFXworI2RlZmluZSBERUZBVUxUX1JBVEVfUkVUUllfTElNSVQJCTIJCS8vKE0zOCkgYXMgbmFtZWQKKyNlbHNlCisjZGVmaW5lIERFRkFVTFRfUkFURV9SRVRSWV9MSU1JVAkJNwkJLy8oTTM4KSBhcyBuYW1lZAorI2VuZGlmCisKKyNkZWZpbmUgREVGQVVMVF9MT05HX1JFVFJZX0xJTUlUCQk3CQkvLyhNMzgpIExvbmdSZXRyeUxpbWl0LiBJdHMgdmFsdWUgaXMgaW4gdGhlIHJhbmdlIDAtMTUuCisjZGVmaW5lIERFRkFVTFRfU0hPUlRfUkVUUllfTElNSVQJCTcJCS8vKE0zOCkgU2hvcnRSZXRyeUxpbWl0LiBJdHMgdmFsdWUgaXMgaW4gdGhlIHJhbmdlIDAtMTUuCisjZGVmaW5lIERFRkFVTFRfUElGU1QJCQkJCTI1CQkvLyhNM0MpIFBJRlMgVGltZS4gSXRzIHZhbHVlIGlzIGluIHRoZSByYW5nZSAwLTY1NTM1LgorI2RlZmluZSBERUZBVUxUX0VJRlNUCQkJCQkzNTQJCS8vKE0zQykgRUlGUyBUaW1lLiBJdHMgdmFsdWUgaXMgaW4gdGhlIHJhbmdlIDAtMTA0ODU3NS4KKyNkZWZpbmUgREVGQVVMVF9ESUZTVAkJCQkJNDUJCS8vKE0zQykgRElGUyBUaW1lLiBJdHMgdmFsdWUgaXMgaW4gdGhlIHJhbmdlIDAtNjU1MzUuCisjZGVmaW5lIERFRkFVTFRfU0lGU1QJCQkJCTUJCS8vKE0zQykgU0lGUyBUaW1lLiBJdHMgdmFsdWUgaXMgaW4gdGhlIHJhbmdlIDAtNjU1MzUuCisjZGVmaW5lIERFRkFVTFRfT1NJRlNUCQkJCQkxMAkJLy8oTTNDKSBPcmlnaW5hbCBTSUZTIFRpbWUuIEl0cyB2YWx1ZSBpcyBpbiB0aGUgcmFuZ2UgMC0xNS4KKyNkZWZpbmUgREVGQVVMVF9BVElNV0QJCQkJCTAJCS8vKE00MCkgQVRJTSBXaW5kb3cuIEl0cyB2YWx1ZSBpcyBpbiB0aGUgcmFuZ2UgMC02NTUzNS4KKyNkZWZpbmUgREVGQVVMVF9TTE9UX1RJTUUJCQkJMjAJCS8vKE00MCkgKCQpIFNsb3RUaW1lLiBJdHMgdmFsdWUgaXMgaW4gdGhlIHJhbmdlIDAtMjU1LgorI2RlZmluZSBERUZBVUxUX01BWF9UWF9NU0RVX0xJRkVfVElNRQk1MTIJLy8oTTQ0KSBNYXhUeE1TRFVMaWZlVGltZS4gSXRzIHZhbHVlIGlzIGluIHRoZSByYW5nZSAwLTQyOTQ5NjcyOTUuCisjZGVmaW5lIERFRkFVTFRfQkVBQ09OX0lOVEVSVkFMCQkJNTAwCQkvLyhNNDgpIEJlYWNvbiBJbnRlcnZhbC4gSXRzIHZhbHVlIGlzIGluIHRoZSByYW5nZSAwLTY1NTM1LgorI2RlZmluZSBERUZBVUxUX1BST0JFX0RFTEFZX1RJTUUJCTIwMAkJLy8oTTQ4KSBQcm9iZSBEZWxheSBUaW1lLiBJdHMgdmFsdWUgaXMgaW4gdGhlIHJhbmdlIDAtNjU1MzUuCisjZGVmaW5lIERFRkFVTFRfUFJPVE9DT0xfVkVSU0lPTgkJMAkJLy8oTTRDKQorI2RlZmluZSBERUZBVUxUX01BQ19QT1dFUl9TVEFURQkJCTIJCS8vKE00QykgMjogTUFDIGF0IHBvd2VyIGFjdGl2ZQorI2RlZmluZSBERUZBVUxUX0RUSU1fQUxFUlRfVElNRQkJCTAKKworCitzdHJ1Y3Qgd2IzNV9yZWdfcXVldWUgeworCXN0cnVjdCB1cmIgCSp1cmI7CisJdm9pZAkJKnBVc2JSZXE7CisJdm9pZAkJKk5leHQ7CisJdW5pb24geworCQl1MzIJVkFMVUU7CisJCXUzMgkqcEJ1ZmZlcjsKKwl9OworCXU4CQlSRVNFUlZFRFs0XTsgLy8gc3BhY2UgcmVzZXJ2ZWQgZm9yIGNvbW11bmljYXRpb24KKwl1MTYJCUlOREVYOyAvLyBGb3Igc3RvcmluZyB0aGUgcmVnaXN0ZXIgaW5kZXgKKwl1OAkJUkVTRVJWRURfVkFMSUQ7CS8vIEluZGljYXRlIHdoZXRoZXIgdGhlIFJFU0VSVkVEIHNwYWNlIGlzIHZhbGlkIGF0IHRoaXMgY29tbWFuZC4KKwl1OAkJRElSRUNUOyAvLyAwOkluICAgMTpPdXQKK307CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBJbnRlcm5hbCB2YXJpYWJsZSBmb3IgbW9kdWxlCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorI2RlZmluZSBNQVhfU1EzX0ZJTFRFUl9TSVpFCQk1CitzdHJ1Y3Qgd2IzNV9yZWcgeworCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIFJlZ2lzdGVyIEJhbmsgYmFja3VwCisJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJdTMyCVUxQjA7CQkJLy9iaXQxNiByZWNvcmQgdGhlIGgvdyByYWRpbyBvbi9vZmYgc3RhdHVzCisJdTMyCVUxQkNfTEVEQ29uZmlndXJlOworCXUzMglEMDBfRG1hQ29udHJvbDsKKwl1MzIJTTAwX01hY0NvbnRyb2w7CisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJdTMyCU0wNF9NdWx0aWNhc3RBZGRyZXNzMTsKKwkJCXUzMglNMDhfTXVsdGljYXN0QWRkcmVzczI7CisJCX07CisJCXU4CQlNdWx0aWNhc3RbOF07CS8vIGNvbnRlbnRzIG9mIGNhcmQgbXVsdGljYXN0IHJlZ2lzdGVycworCX07CisKKwl1MzIJTTI0X01hY0NvbnRyb2w7CisJdTMyCU0yOF9NYWNDb250cm9sOworCXUzMglNMkNfTWFjQ29udHJvbDsKKwl1MzIJTTM4X01hY0NvbnRyb2w7CisJdTMyCU0zQ19NYWNDb250cm9sOyAvLyAyMDA2MDIxNCBiYWNrdXAgb25seQorCXUzMglNNDBfTWFjQ29udHJvbDsKKwl1MzIJTTQ0X01hY0NvbnRyb2w7IC8vIDIwMDYwMjE0IGJhY2t1cCBvbmx5CisJdTMyCU00OF9NYWNDb250cm9sOyAvLyAyMDA2MDIxNCBiYWNrdXAgb25seQorCXUzMglNNENfTWFjU3RhdHVzOworCXUzMglNNjBfTWFjQ29udHJvbDsgLy8gMjAwNjAyMTQgYmFja3VwIG9ubHkKKwl1MzIJTTY4X01hY0NvbnRyb2w7IC8vIDIwMDYwMjE0IGJhY2t1cCBvbmx5CisJdTMyCU03MF9NYWNDb250cm9sOyAvLyAyMDA2MDIxNCBiYWNrdXAgb25seQorCXUzMglNNzRfTWFjQ29udHJvbDsgLy8gMjAwNjAyMTQgYmFja3VwIG9ubHkKKwl1MzIJTTc4X0VSUEluZm9ybWF0aW9uOy8vOTMwMjA2LjIuYgorCXUzMglNN0NfTWFjQ29udHJvbDsgLy8gMjAwNjAyMTQgYmFja3VwIG9ubHkKKwl1MzIJTTgwX01hY0NvbnRyb2w7IC8vIDIwMDYwMjE0IGJhY2t1cCBvbmx5CisJdTMyCU04NF9NYWNDb250cm9sOyAvLyAyMDA2MDIxNCBiYWNrdXAgb25seQorCXUzMglNODhfTWFjQ29udHJvbDsgLy8gMjAwNjAyMTQgYmFja3VwIG9ubHkKKwl1MzIJTTk4X01hY0NvbnRyb2w7IC8vIDIwMDYwMjE0IGJhY2t1cCBvbmx5CisKKwkvL1syMDA0MDcyMiBXS10KKwkvL0Jhc2ViYW5kIHJlZ2lzdGVyCisJdTMyCUJCMEM7CS8vIFVzZWQgZm9yIExOQSBjYWxjdWxhdGlvbgorCXUzMglCQjJDOwkvLworCXUzMglCQjMwOwkvLzExYiBhY3F1aXNpdGlvbiBjb250cm9sIHJlZ2lzdGVyCisJdTMyCUJCM0M7CisJdTMyCUJCNDg7CS8vIDIwMDUxMjIxLjEuYSAyMDA2MDYxMy4xIEZpeCBPQlcgaXNzdWUgb2YgMTFiLzExZyByYXRlCisJdTMyCUJCNEM7CS8vIDIwMDYwNjEzLjEgIEZpeCBPQlcgaXNzdWUgb2YgMTFiLzExZyByYXRlCisJdTMyCUJCNTA7CS8vbW9kZSBjb250cm9sIHJlZ2lzdGVyCisJdTMyCUJCNTQ7CisJdTMyIAlCQjU4OwkvL0lRX0FMUEhBCisJdTMyCUJCNUM7CS8vIEZvciB0ZXN0CisJdTMyCUJCNjA7CS8vIGZvciBXVE8gcmVhZCB2YWx1ZQorCisJLy8tLS0tLS0tLS0tLS0tLS0tLS0tCisJLy8gVk0KKwkvLy0tLS0tLS0tLS0tLS0tLS0tLS0KKwlzcGlubG9ja190CUVQMFZNX3NwaW5fbG9jazsgLy8gNEIKKwl1MzIJICAgICAgICBFUDBWTV9zdGF0dXM7Ly8kJAorCXN0cnVjdCB3YjM1X3JlZ19xdWV1ZSAqcmVnX2ZpcnN0OworCXN0cnVjdCB3YjM1X3JlZ19xdWV1ZSAqcmVnX2xhc3Q7CisJYXRvbWljX3QgICAgICAgUmVnRmlyZUNvdW50OworCisJLy8gSGFyZHdhcmUgc3RhdHVzCisJdTgJRVAwdm1fc3RhdGU7CisJdTgJbWFjX3Bvd2VyX3NhdmU7CisJdTgJRUVQUk9NUGh5VHlwZTsgLy8gMCB+IDE1IGZvciBNYXhpbSAoMCDEhFYgTUFYMjgyNSwgMSDEhFYgTUFYMjgyNywgMiDEhFYgTUFYMjgyOCwgMyDEhFYgTUFYMjgyOSksCisJCQkJCQkgICAvLyAxNiB+IDMxIGZvciBBaXJvaGEgKDE2IMSEViBBTDIyMzAsIDExIC0gQUw3MjMwKQorCQkJCQkJICAgLy8gMzIgfiBSZXNlcnZlZAorCQkJCQkJICAgLy8gMzMgfiA0NyBGb3IgV0IyNDIgKCAzMyAtIFdCMjQyLCAzNCAtIFdCMjQyIHdpdGggbmV3IFR4dmdhIDAuNSBkYiBzdGVwKQorCQkJCQkJICAgLy8gNDggfiAyNTUgQVJFIFJFU0VSVkVELgorCXU4CUVFUFJPTVJlZ2lvbjsJLy9SZWdpb24gc2V0dGluZyBpbiBFRVBST00KKworCXUzMglTeW5jSW9QYXVzZTsgLy8gSWYgdXNlciB1c2UgdGhlIFN5bmMgSW8gdG8gYWNjZXNzIEh3LCB0aGVuIHBhdXNlIHRoZSBhc3luYyBhY2Nlc3MKKworCXU4CUxOQVZhbHVlWzRdOyAvL1RhYmxlIGZvciBzcGVlZCB1cCBydW5uaW5nCisJdTMyCVNRM19maWx0ZXJbTUFYX1NRM19GSUxURVJfU0laRV07CisJdTMyCVNRM19pbmRleDsKKworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YjM1cnguYyBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3diMzVyeC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmOGI2ZDcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YjM1cnguYwpAQCAtMCwwICsxLDM3MyBAQAorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyAgQ29weXJpZ2h0IChjKSAxOTk2LTIwMDIgV2luYm9uZCBFbGVjdHJvbmljIENvcnBvcmF0aW9uCisvLworLy8gIE1vZHVsZSBOYW1lOgorLy8gICAgV2IzNVJ4LmMKKy8vCisvLyAgQWJzdHJhY3Q6CisvLyAgICBQcm9jZXNzaW5nIHRoZSBSeCBtZXNzYWdlIGZyb20gZG93biBsYXllcgorLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorCisjaW5jbHVkZSAiY29yZS5oIgorI2luY2x1ZGUgInN5c2RlZi5oIgorI2luY2x1ZGUgIndiMzVyeF9mLmgiCisKK3N0YXRpYyB2b2lkIHBhY2tldF9jYW1lKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBjaGFyICpwUnhCdWZmZXJBZGRyZXNzLCBpbnQgUGFja2V0U2l6ZSkKK3sKKwlzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKnByaXYgPSBody0+cHJpdjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHVzIHJ4X3N0YXR1cyA9IHswfTsKKworCWlmICghcHJpdi0+ZW5hYmxlZCkKKwkJcmV0dXJuOworCisJc2tiID0gZGV2X2FsbG9jX3NrYihQYWNrZXRTaXplKTsKKwlpZiAoIXNrYikgeworCQlwcmludGsoIk5vdCBlbm91Z2ggbWVtb3J5IGZvciBwYWNrZXQsIEZJWE1FXG4iKTsKKwkJcmV0dXJuOworCX0KKworCW1lbWNweShza2JfcHV0KHNrYiwgUGFja2V0U2l6ZSksCisJICAgICAgIHBSeEJ1ZmZlckFkZHJlc3MsCisJICAgICAgIFBhY2tldFNpemUpOworCisvKgorCXJ4X3N0YXR1cy5yYXRlID0gMTA7CisJcnhfc3RhdHVzLmNoYW5uZWwgPSAxOworCXJ4X3N0YXR1cy5mcmVxID0gMTIzNDU7CisJcnhfc3RhdHVzLnBoeW1vZGUgPSBNT0RFX0lFRUU4MDIxMUI7CisqLworCisJaWVlZTgwMjExX3J4X2lycXNhZmUoaHcsIHNrYiwgJnJ4X3N0YXR1cyk7Cit9CisKK3N0YXRpYyB2b2lkIFdiMzVSeF9hZGp1c3QoUERFU0NSSVBUT1IgcFJ4RGVzKQoreworCXUzMiAqCXBSeEJ1ZmZlckFkZHJlc3M7CisJdTMyCURlY3J5cHRpb25NZXRob2Q7CisJdTMyCWk7CisJdTE2CUJ1ZmZlclNpemU7CisKKwlEZWNyeXB0aW9uTWV0aG9kID0gcFJ4RGVzLT5SMDEuUjAxX2RlY3J5cHRpb25fbWV0aG9kOworCXBSeEJ1ZmZlckFkZHJlc3MgPSBwUnhEZXMtPmJ1ZmZlcl9hZGRyZXNzWzBdOworCUJ1ZmZlclNpemUgPSBwUnhEZXMtPmJ1ZmZlcl9zaXplWzBdOworCisJLy8gQWRqdXN0IHRoZSBsYXN0IHBhcnQgb2YgZGF0YS4gT25seSBkYXRhIGxlZnQKKwlCdWZmZXJTaXplIC09IDQ7IC8vIEZvciBDUkMtMzIKKwlpZiAoRGVjcnlwdGlvbk1ldGhvZCkKKwkJQnVmZmVyU2l6ZSAtPSA0OworCWlmIChEZWNyeXB0aW9uTWV0aG9kID09IDMpIC8vIEZvciBDQ01QCisJCUJ1ZmZlclNpemUgLT0gNDsKKworCS8vIEFkanVzdCB0aGUgSVYgZmllbGQgd2hpY2ggYWZ0ZXIgODAyLjExIGhlYWRlciBhbmQgSUNWIGZpZWxkLgorCWlmIChEZWNyeXB0aW9uTWV0aG9kID09IDEpIC8vIEZvciBXRVAKKwl7CisJCWZvciggaT02OyBpPjA7IGktLSApCisJCQlwUnhCdWZmZXJBZGRyZXNzW2ldID0gcFJ4QnVmZmVyQWRkcmVzc1tpLTFdOworCQlwUnhEZXMtPmJ1ZmZlcl9hZGRyZXNzWzBdID0gcFJ4QnVmZmVyQWRkcmVzcyArIDE7CisJCUJ1ZmZlclNpemUgLT0gNDsgLy8gNCBieXRlIGZvciBJVgorCX0KKwllbHNlIGlmKCBEZWNyeXB0aW9uTWV0aG9kICkgLy8gRm9yIFRLSVAgYW5kIENDTVAKKwl7CisJCWZvciAoaT03OyBpPjE7IGktLSkKKwkJCXBSeEJ1ZmZlckFkZHJlc3NbaV0gPSBwUnhCdWZmZXJBZGRyZXNzW2ktMl07CisJCXBSeERlcy0+YnVmZmVyX2FkZHJlc3NbMF0gPSBwUnhCdWZmZXJBZGRyZXNzICsgMjsvL1VwZGF0ZSB0aGUgZGVzY3JpcHRvciwgc2hpZnQgOCBieXRlCisJCUJ1ZmZlclNpemUgLT0gODsgLy8gOCBieXRlIGZvciBJViArIElDVgorCX0KKwlwUnhEZXMtPmJ1ZmZlcl9zaXplWzBdID0gQnVmZmVyU2l6ZTsKK30KKworc3RhdGljIHUxNiBXYjM1UnhfaW5kaWNhdGUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCit7CisJc3RydWN0IHdic29mdF9wcml2ICpwcml2ID0gaHctPnByaXY7CisJcGh3X2RhdGFfdCBwSHdEYXRhID0gJnByaXYtPnNId0RhdGE7CisJREVTQ1JJUFRPUglSeERlczsKKwlQV0IzNVJYCXBXYjM1UnggPSAmcEh3RGF0YS0+V2IzNVJ4OworCXU4ICoJCXBSeEJ1ZmZlckFkZHJlc3M7CisJdTE2CQlQYWNrZXRTaXplOworCXUxNgkJc3RtcCwgQnVmZmVyU2l6ZSwgc3RtcDIgPSAwOworCXUzMgkJUnhCdWZmZXJJZDsKKworCS8vIE9ubHkgb25lIHRocmVhZCBiZSBhbGxvd2VkIHRvIHJ1biBpbnRvIHRoZSBmb2xsb3dpbmcKKwlkbyB7CisJCVJ4QnVmZmVySWQgPSBwV2IzNVJ4LT5SeFByb2Nlc3NJbmRleDsKKwkJaWYgKHBXYjM1UngtPlJ4T3duZXJbIFJ4QnVmZmVySWQgXSkgLy9Pd25lciBieSBWTQorCQkJYnJlYWs7CisKKwkJcFdiMzVSeC0+UnhQcm9jZXNzSW5kZXgrKzsKKwkJcFdiMzVSeC0+UnhQcm9jZXNzSW5kZXggJT0gTUFYX1VTQl9SWF9CVUZGRVJfTlVNQkVSOworCisJCXBSeEJ1ZmZlckFkZHJlc3MgPSBwV2IzNVJ4LT5wRFJ4OworCQlCdWZmZXJTaXplID0gcFdiMzVSeC0+UnhCdWZmZXJTaXplWyBSeEJ1ZmZlcklkIF07CisKKwkJLy8gUGFyc2UgdGhlIGJ1bGtpbiBidWZmZXIKKwkJd2hpbGUgKEJ1ZmZlclNpemUgPj0gNCkgeworCQkJaWYgKChjcHVfdG9fbGUzMigqKHUzMiAqKXBSeEJ1ZmZlckFkZHJlc3MpICYgMHgwZmZmZmZmZikgPT0gUlhfRU5EX1RBRykgLy9JcyBlbmRpbmc/IDkyMTAwMi45LmEKKwkJCQlicmVhazsKKworCQkJLy8gR2V0IHRoZSBSMDAgUjAxIGZpcnN0CisJCQlSeERlcy5SMDAudmFsdWUgPSBsZTMyX3RvX2NwdSgqKHUzMiAqKXBSeEJ1ZmZlckFkZHJlc3MpOworCQkJUGFja2V0U2l6ZSA9ICh1MTYpUnhEZXMuUjAwLlIwMF9yZWNlaXZlX2J5dGVfY291bnQ7CisJCQlSeERlcy5SMDEudmFsdWUgPSBsZTMyX3RvX2NwdSgqKCh1MzIgKikocFJ4QnVmZmVyQWRkcmVzcys0KSkpOworCQkJLy8gRm9yIG5ldyBETUEgNGsKKwkJCWlmICgoUGFja2V0U2l6ZSAmIDB4MDMpID4gMCkKKwkJCQlQYWNrZXRTaXplIC09IDQ7CisKKwkJCS8vIEJhc2ljIGNoZWNrIGZvciBSeCBsZW5ndGguIElzIGxlbmd0aCB2YWxpZD8KKwkJCWlmIChQYWNrZXRTaXplID4gTUFYX1BBQ0tFVF9TSVpFKSB7CisJCQkJI2lmZGVmIF9QRV9SWF9EVU1QXworCQkJCVdCREVCVUcoKCJTZXJpb3VzIEVSUk9SIDogUnggZGF0YSBzaXplIHRvbyBsb25nLCBzaXplID0lZFxuIiwgUGFja2V0U2l6ZSkpOworCQkJCSNlbmRpZgorCisJCQkJcFdiMzVSeC0+RVAzdm1fc3RhdGUgPSBWTV9TVE9QOworCQkJCXBXYjM1UngtPkVwM0Vycm9yQ291bnQyKys7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCS8vIFN0YXJ0IHRvIHByb2Nlc3MgUnggYnVmZmVyCisvLwkJCVJ4RGVzLkRlc2NyaXB0b3JfSUQgPSBSeEJ1ZmZlcklkOyAvLyBEdWUgdG8gc3luY2hyb25vdXMgaW5kaWNhdGUsIHRoZSBmaWVsZCBkb2Vzbid0IG5lY2Vzc2FyeSB0byB1c2UuCisJCQlCdWZmZXJTaXplIC09IDg7IC8vc3VidHJhY3QgOCBieXRlIGZvciAzNSdzIFVTQiBoZWFkZXIgbGVuZ3RoCisJCQlwUnhCdWZmZXJBZGRyZXNzICs9IDg7CisKKwkJCVJ4RGVzLmJ1ZmZlcl9hZGRyZXNzWzBdID0gcFJ4QnVmZmVyQWRkcmVzczsKKwkJCVJ4RGVzLmJ1ZmZlcl9zaXplWzBdID0gUGFja2V0U2l6ZTsKKwkJCVJ4RGVzLmJ1ZmZlcl9udW1iZXIgPSAxOworCQkJUnhEZXMuYnVmZmVyX3N0YXJ0X2luZGV4ID0gMDsKKwkJCVJ4RGVzLmJ1ZmZlcl90b3RhbF9zaXplID0gUnhEZXMuYnVmZmVyX3NpemVbMF07CisJCQlXYjM1UnhfYWRqdXN0KCZSeERlcyk7CisKKwkJCXBhY2tldF9jYW1lKGh3LCBwUnhCdWZmZXJBZGRyZXNzLCBQYWNrZXRTaXplKTsKKworCQkJLy8gTW92ZSBSeEJ1ZmZlciBwb2ludCB0byB0aGUgbmV4dAorCQkJc3RtcCA9IFBhY2tldFNpemUgKyAzOworCQkJc3RtcCAmPSB+MHgwMzsgLy8gNG4gYWxpZ25tZW50CisJCQlwUnhCdWZmZXJBZGRyZXNzICs9IHN0bXA7CisJCQlCdWZmZXJTaXplIC09IHN0bXA7CisJCQlzdG1wMiArPSBzdG1wOworCQl9CisKKwkJLy8gUmVjbGFpbSByZXNvdXJjZQorCQlwV2IzNVJ4LT5SeE93bmVyWyBSeEJ1ZmZlcklkIF0gPSAxOworCX0gd2hpbGUgKHRydWUpOworCisJcmV0dXJuIHN0bXAyOworfQorCitzdGF0aWMgdm9pZCBXYjM1Ungoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOworCitzdGF0aWMgdm9pZCBXYjM1UnhfQ29tcGxldGUoc3RydWN0IHVyYiAqdXJiKQoreworCXN0cnVjdCBpZWVlODAyMTFfaHcgKmh3ID0gdXJiLT5jb250ZXh0OworCXN0cnVjdCB3YnNvZnRfcHJpdiAqcHJpdiA9IGh3LT5wcml2OworCXBod19kYXRhX3QgcEh3RGF0YSA9ICZwcml2LT5zSHdEYXRhOworCVBXQjM1UlgJCXBXYjM1UnggPSAmcEh3RGF0YS0+V2IzNVJ4OworCXU4ICoJCXBSeEJ1ZmZlckFkZHJlc3M7CisJdTMyCQlTaXplQ2hlY2s7CisJdTE2CQlCdWxrTGVuZ3RoOworCXUzMgkJUnhCdWZmZXJJZDsKKwlSMDBfREVTQ1JJUFRPUiAJUjAwOworCisJLy8gVmFyaWFibGUgc2V0dGluZworCXBXYjM1UngtPkVQM3ZtX3N0YXRlID0gVk1fQ09NUExFVEVEOworCXBXYjM1UngtPkVQM1ZNX3N0YXR1cyA9IHVyYi0+c3RhdHVzOy8vU3RvcmUgdGhlIGxhc3QgcmVzdWx0IG9mIElycAorCisJUnhCdWZmZXJJZCA9IHBXYjM1UngtPkN1cnJlbnRSeEJ1ZmZlcklkOworCisJcFJ4QnVmZmVyQWRkcmVzcyA9IHBXYjM1UngtPnBEUng7CisJQnVsa0xlbmd0aCA9ICh1MTYpdXJiLT5hY3R1YWxfbGVuZ3RoOworCisJLy8gVGhlIElSUCBpcyBjb21wbGV0ZWQKKwlwV2IzNVJ4LT5FUDN2bV9zdGF0ZSA9IFZNX0NPTVBMRVRFRDsKKworCWlmIChwSHdEYXRhLT5TdXJwcmlzZVJlbW92ZSB8fCBwSHdEYXRhLT5Id1N0b3ApIC8vIE11c3QgYmUgaGVyZSwgb3IgUnhCdWZmZXJJZCBpcyBpbnZhbGlkCisJCWdvdG8gZXJyb3I7CisKKwlpZiAocFdiMzVSeC0+cnhfaGFsdCkKKwkJZ290byBlcnJvcjsKKworCS8vIFN0YXJ0IHRvIHByb2Nlc3MgdGhlIGRhdGEgb25seSBpbiBzdWNjZXNzZnVsIGNvbmRpdGlvbgorCXBXYjM1UngtPlJ4T3duZXJbIFJ4QnVmZmVySWQgXSA9IDA7IC8vIFNldCB0aGUgb3duZXIgdG8gZHJpdmVyCisJUjAwLnZhbHVlID0gbGUzMl90b19jcHUoKih1MzIgKilwUnhCdWZmZXJBZGRyZXNzKTsKKworCS8vIFRoZSBVUkIgaXMgY29tcGxldGVkLCBjaGVjayB0aGUgcmVzdWx0CisJaWYgKHBXYjM1UngtPkVQM1ZNX3N0YXR1cyAhPSAwKSB7CisJCSNpZmRlZiBfUEVfVVNCX1NUQVRFX0RVTVBfCisJCVdCREVCVUcoKCJFUDMgSW9Db21wbGV0ZVJvdXRpbmUgcmV0dXJuIGVycm9yXG4iKSk7CisJCURlYnVnVXNiZFN0YXR1c0luZm9ybWF0aW9uKCBwV2IzNVJ4LT5FUDNWTV9zdGF0dXMgKTsKKwkJI2VuZGlmCisJCXBXYjM1UngtPkVQM3ZtX3N0YXRlID0gVk1fU1RPUDsKKwkJZ290byBlcnJvcjsKKwl9CisKKwkvLyAyMDA2MDIyMCBGb3IgcmVjb3ZlcmluZy4gY2hlY2sgaWYgb3BlcmF0aW5nIGluIHNpbmdsZSBVU0IgbW9kZQorCWlmICghSEFMX1VTQl9NT0RFX0JVUlNUKHBId0RhdGEpKSB7CisJCVNpemVDaGVjayA9IFIwMC5SMDBfcmVjZWl2ZV9ieXRlX2NvdW50OyAgLy8yMDA2MDkyNiBhbnNvbidzIGVuZGlhbgorCQlpZiAoKFNpemVDaGVjayAmIDB4MDMpID4gMCkKKwkJCVNpemVDaGVjayAtPSA0OworCQlTaXplQ2hlY2sgPSAoU2l6ZUNoZWNrICsgMykgJiB+MHgwMzsKKwkJU2l6ZUNoZWNrICs9IDEyOyAvLyA4ICsgNCBiYWRiZWVmCisJCWlmICgoQnVsa0xlbmd0aCA+IDE2MDApIHx8CisJCQkoU2l6ZUNoZWNrID4gMTYwMCkgfHwKKwkJCShCdWxrTGVuZ3RoICE9IFNpemVDaGVjaykgfHwKKwkJCShCdWxrTGVuZ3RoID09IDApKSB7IC8vIEFkZCBmb3IgZmFpbCBVcmIKKwkJCXBXYjM1UngtPkVQM3ZtX3N0YXRlID0gVk1fU1RPUDsKKwkJCXBXYjM1UngtPkVwM0Vycm9yQ291bnQyKys7CisJCX0KKwl9CisKKwkvLyBJbmRpY2F0aW5nIHRoZSByZWNlaXZpbmcgZGF0YQorCXBXYjM1UngtPkJ5dGVSZWNlaXZlZCArPSBCdWxrTGVuZ3RoOworCXBXYjM1UngtPlJ4QnVmZmVyU2l6ZVsgUnhCdWZmZXJJZCBdID0gQnVsa0xlbmd0aDsKKworCWlmICghcFdiMzVSeC0+UnhPd25lclsgUnhCdWZmZXJJZCBdKQorCQlXYjM1UnhfaW5kaWNhdGUoaHcpOworCisJa2ZyZWUocFdiMzVSeC0+cERSeCk7CisJLy8gRG8gdGhlIG5leHQgcmVjZWl2ZQorCVdiMzVSeChodyk7CisJcmV0dXJuOworCitlcnJvcjoKKwlwV2IzNVJ4LT5SeE93bmVyWyBSeEJ1ZmZlcklkIF0gPSAxOyAvLyBTZXQgdGhlIG93bmVyIHRvIGhhcmR3YXJlCisJYXRvbWljX2RlYygmcFdiMzVSeC0+UnhGaXJlQ291bnRlcik7CisJcFdiMzVSeC0+RVAzdm1fc3RhdGUgPSBWTV9TVE9QOworfQorCisvLyBUaGlzIGZ1bmN0aW9uIGNhbm5vdCByZWVudHJhaW4KK3N0YXRpYyB2b2lkIFdiMzVSeChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKK3sKKwlzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKnByaXYgPSBody0+cHJpdjsKKwlwaHdfZGF0YV90IHBId0RhdGEgPSAmcHJpdi0+c0h3RGF0YTsKKwlQV0IzNVJYCXBXYjM1UnggPSAmcEh3RGF0YS0+V2IzNVJ4OworCXU4ICoJcFJ4QnVmZmVyQWRkcmVzczsKKwlzdHJ1Y3QgdXJiICp1cmIgPSBwV2IzNVJ4LT5SeFVyYjsKKwlpbnQJcmV0djsKKwl1MzIJUnhCdWZmZXJJZDsKKworCS8vCisJLy8gSXNzdWluZyBVUkIKKwkvLworCWlmIChwSHdEYXRhLT5TdXJwcmlzZVJlbW92ZSB8fCBwSHdEYXRhLT5Id1N0b3ApCisJCWdvdG8gZXJyb3I7CisKKwlpZiAocFdiMzVSeC0+cnhfaGFsdCkKKwkJZ290byBlcnJvcjsKKworCS8vIEdldCBSeEJ1ZmZlcidzIElECisJUnhCdWZmZXJJZCA9IHBXYjM1UngtPlJ4QnVmZmVySWQ7CisJaWYgKCFwV2IzNVJ4LT5SeE93bmVyW1J4QnVmZmVySWRdKSB7CisJCS8vIEl0J3MgaW1wb3NzaWJsZSB0byBydW4gaGVyZS4KKwkJI2lmZGVmIF9QRV9SWF9EVU1QXworCQlXQkRFQlVHKCgiUnggZHJpdmVyIGZpZm8gdW5hdmFpbGFibGVcbiIpKTsKKwkJI2VuZGlmCisJCWdvdG8gZXJyb3I7CisJfQorCisJLy8gVXBkYXRlIGJ1ZmZlciBwb2ludCwgdGhlbiBzdGFydCB0byBidWxraW4gdGhlIGRhdGEgZnJvbSBVU0IKKwlwV2IzNVJ4LT5SeEJ1ZmZlcklkKys7CisJcFdiMzVSeC0+UnhCdWZmZXJJZCAlPSBNQVhfVVNCX1JYX0JVRkZFUl9OVU1CRVI7CisKKwlwV2IzNVJ4LT5DdXJyZW50UnhCdWZmZXJJZCA9IFJ4QnVmZmVySWQ7CisKKwlwV2IzNVJ4LT5wRFJ4ID0ga3phbGxvYyhNQVhfVVNCX1JYX0JVRkZFUiwgR0ZQX0FUT01JQyk7CisJaWYgKCFwV2IzNVJ4LT5wRFJ4KSB7CisJCXByaW50aygidzM1dW5kOiBSeCBtZW1vcnkgYWxsb2MgZmFpbGVkXG4iKTsKKwkJZ290byBlcnJvcjsKKwl9CisJcFJ4QnVmZmVyQWRkcmVzcyA9IHBXYjM1UngtPnBEUng7CisKKwl1c2JfZmlsbF9idWxrX3VyYih1cmIsIHBId0RhdGEtPldiVXNiLnVkZXYsCisJCQkgIHVzYl9yY3ZidWxrcGlwZShwSHdEYXRhLT5XYlVzYi51ZGV2LCAzKSwKKwkJCSAgcFJ4QnVmZmVyQWRkcmVzcywgTUFYX1VTQl9SWF9CVUZGRVIsCisJCQkgIFdiMzVSeF9Db21wbGV0ZSwgaHcpOworCisJcFdiMzVSeC0+RVAzdm1fc3RhdGUgPSBWTV9SVU5OSU5HOworCisJcmV0diA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQyk7CisKKwlpZiAocmV0diAhPSAwKSB7CisJCXByaW50aygiUnggVVJCIHNlbmRpbmcgZXJyb3JcbiIpOworCQlnb3RvIGVycm9yOworCX0KKwlyZXR1cm47CisKK2Vycm9yOgorCS8vIFZNIHN0b3AKKwlwV2IzNVJ4LT5FUDN2bV9zdGF0ZSA9IFZNX1NUT1A7CisJYXRvbWljX2RlYygmcFdiMzVSeC0+UnhGaXJlQ291bnRlcik7Cit9CisKK3ZvaWQgV2IzNVJ4X3N0YXJ0KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQoreworCXN0cnVjdCB3YnNvZnRfcHJpdiAqcHJpdiA9IGh3LT5wcml2OworCXBod19kYXRhX3QgcEh3RGF0YSA9ICZwcml2LT5zSHdEYXRhOworCVBXQjM1UlggcFdiMzVSeCA9ICZwSHdEYXRhLT5XYjM1Ung7CisKKwkvLyBBbGxvdyBvbmx5IG9uZSB0aHJlYWQgdG8gcnVuIGludG8gdGhlIFdiMzVSeCgpIGZ1bmN0aW9uCisJaWYgKGF0b21pY19pbmNfcmV0dXJuKCZwV2IzNVJ4LT5SeEZpcmVDb3VudGVyKSA9PSAxKSB7CisJCXBXYjM1UngtPkVQM3ZtX3N0YXRlID0gVk1fUlVOTklORzsKKwkJV2IzNVJ4KGh3KTsKKwl9IGVsc2UKKwkJYXRvbWljX2RlYygmcFdiMzVSeC0+UnhGaXJlQ291bnRlcik7Cit9CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorc3RhdGljIHZvaWQgV2IzNVJ4X3Jlc2V0X2Rlc2NyaXB0b3IoICBwaHdfZGF0YV90IHBId0RhdGEgKQoreworCVBXQjM1UlggcFdiMzVSeCA9ICZwSHdEYXRhLT5XYjM1Ung7CisJdTMyCWk7CisKKwlwV2IzNVJ4LT5CeXRlUmVjZWl2ZWQgPSAwOworCXBXYjM1UngtPlJ4UHJvY2Vzc0luZGV4ID0gMDsKKwlwV2IzNVJ4LT5SeEJ1ZmZlcklkID0gMDsKKwlwV2IzNVJ4LT5FUDN2bV9zdGF0ZSA9IFZNX1NUT1A7CisJcFdiMzVSeC0+cnhfaGFsdCA9IDA7CisKKwkvLyBJbml0aWFsIHRoZSBRdWV1ZS4gVGhlIGxhc3QgYnVmZmVyIGlzIHJlc2VydmVkIGZvciB1c2VkIGlmIHRoZSBSeCByZXNvdXJjZSBpcyB1bmF2YWlsYWJsZS4KKwlmb3IoIGk9MDsgaTxNQVhfVVNCX1JYX0JVRkZFUl9OVU1CRVI7IGkrKyApCisJCXBXYjM1UngtPlJ4T3duZXJbaV0gPSAxOworfQorCit1bnNpZ25lZCBjaGFyIFdiMzVSeF9pbml0aWFsKHBod19kYXRhX3QgcEh3RGF0YSkKK3sKKwlQV0IzNVJYIHBXYjM1UnggPSAmcEh3RGF0YS0+V2IzNVJ4OworCisJLy8gSW5pdGlhbCB0aGUgQnVmZmVyIFF1ZXVlCisJV2IzNVJ4X3Jlc2V0X2Rlc2NyaXB0b3IoIHBId0RhdGEgKTsKKworCXBXYjM1UngtPlJ4VXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfQVRPTUlDKTsKKwlyZXR1cm4gKCEhcFdiMzVSeC0+UnhVcmIpOworfQorCit2b2lkIFdiMzVSeF9zdG9wKHBod19kYXRhX3QgcEh3RGF0YSkKK3sKKwlQV0IzNVJYIHBXYjM1UnggPSAmcEh3RGF0YS0+V2IzNVJ4OworCisJLy8gQ2FuY2VsaW5nIHRoZSBJcnAgaWYgYWxyZWFkeSBzZW5kcyBpdCBvdXQuCisJaWYgKHBXYjM1UngtPkVQM3ZtX3N0YXRlID09IFZNX1JVTk5JTkcpIHsKKwkJdXNiX3VubGlua191cmIoIHBXYjM1UngtPlJ4VXJiICk7IC8vIE9ubHkgdXNlIHVubGluaywgbGV0IFdiMzVSeF9kZXN0cm95IHRvIGZyZWUgdGhlbQorCQkjaWZkZWYgX1BFX1JYX0RVTVBfCisJCVdCREVCVUcoKCJFUDMgUnggc3RvcFxuIikpOworCQkjZW5kaWYKKwl9Cit9CisKKy8vIE5lZWRzIHByb2Nlc3MgY29udGV4dAordm9pZCBXYjM1UnhfZGVzdHJveShwaHdfZGF0YV90IHBId0RhdGEpCit7CisJUFdCMzVSWCBwV2IzNVJ4ID0gJnBId0RhdGEtPldiMzVSeDsKKworCWRvIHsKKwkJbXNsZWVwKDEwKTsgLy8gRGVsYXkgZm9yIHdhaXRpbmcgZnVuY3Rpb24gZW50ZXIgOTQwNjIzLjEuYQorCX0gd2hpbGUgKHBXYjM1UngtPkVQM3ZtX3N0YXRlICE9IFZNX1NUT1ApOworCW1zbGVlcCgxMCk7IC8vIERlbGF5IGZvciB3YWl0aW5nIGZ1bmN0aW9uIGV4aXQgOTQwNjIzLjEuYgorCisJaWYgKHBXYjM1UngtPlJ4VXJiKQorCQl1c2JfZnJlZV91cmIoIHBXYjM1UngtPlJ4VXJiICk7CisJI2lmZGVmIF9QRV9SWF9EVU1QXworCVdCREVCVUcoKCJXYjM1UnhfZGVzdHJveSBPS1xuIikpOworCSNlbmRpZgorfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YjM1cnhfZi5oIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2IzNXJ4X2YuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTkzMDQxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2IzNXJ4X2YuaApAQCAtMCwwICsxLDE1IEBACisjaWZuZGVmIF9fV0lOQk9ORF9XQjM1UlhfRl9ICisjZGVmaW5lIF9fV0lOQk9ORF9XQjM1UlhfRl9ICisKKyNpbmNsdWRlIDxuZXQvbWFjODAyMTEuaD4KKyNpbmNsdWRlICJ3YmhhbF9zLmgiCisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBJbnRlcmZhY2UgZnVuY3Rpb24gZGVjbGFyZQorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK3Vuc2lnbmVkIGNoYXIJCVdiMzVSeF9pbml0aWFsKCAgcGh3X2RhdGFfdCBwSHdEYXRhICk7Cit2b2lkCQlXYjM1UnhfZGVzdHJveSggIHBod19kYXRhX3QgcEh3RGF0YSApOwordm9pZAkJV2IzNVJ4X3N0b3AoICBwaHdfZGF0YV90IHBId0RhdGEgKTsKK3ZvaWQJCVdiMzVSeF9zdGFydChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2IzNXJ4X3MuaCBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3diMzVyeF9zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE4MzUwYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3diMzVyeF9zLmgKQEAgLTAsMCArMSw0OCBAQAorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyB3YjM1cnguaCAtLQorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKy8vIERlZmluaXRpb24gZm9yIHRoaXMgbW9kdWxlIHVzZWQKKyNkZWZpbmUgTUFYX1VTQl9SWF9CVUZGRVIJNDA5NgkvLyBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIDQwOTYgOTMxMTMwLjQuZgorCisjZGVmaW5lIE1BWF9VU0JfUlhfQlVGRkVSX05VTUJFUglFVEhFUk5FVF9SWF9ERVNDUklQVE9SUwkJLy8gTWF4aW11bSAyNTQsIDI1NSBpcyBSRVNFUlZFRCBJRAorI2RlZmluZSBSWF9JTlRFUkZBQ0UJCQkJMAkvLyBJbnRlcmZhY2UgMQorI2RlZmluZSBSWF9QSVBFCQkJCQkJMgkvLyBQaXBlIDMKKyNkZWZpbmUgTUFYX1BBQ0tFVF9TSVpFCQkJCTE2MDAgLy8xNTY4CS8vIDggKyAxNTMyICsgNCArIDI0KElWIEVJViBNSUMgSUNWIENSQykgZm9yIGNoZWNrIERNQSBkYXRhIDkzMTEzMC40LmcKKyNkZWZpbmUgUlhfRU5EX1RBRwkJCQkJMHgwYmFkYmVlZgorCisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBJbnRlcm5hbCB2YXJpYWJsZSBmb3IgbW9kdWxlCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQordHlwZWRlZiBzdHJ1Y3QgX1dCMzVSWAoreworCXUzMgkJCUJ5dGVSZWNlaXZlZDsvLyBGb3IgY2FsY3VsYXRpbmcgdGhyb3VnaHB1dCBvZiBCdWxrSW4KKwlhdG9taWNfdAkJUnhGaXJlQ291bnRlcjsvLyBEb2VzIFdiMzVSeCBtb2R1bGUgZmlyZT8KKworCXU4CVJ4QnVmZmVyWyBNQVhfVVNCX1JYX0JVRkZFUl9OVU1CRVIgXVsgKChNQVhfVVNCX1JYX0JVRkZFUiszKSAmIH4weDAzICkgXTsKKwl1MTYJUnhCdWZmZXJTaXplWyAoKE1BWF9VU0JfUlhfQlVGRkVSX05VTUJFUisxKSAmIH4weDAxKSBdOworCXU4CVJ4T3duZXJbICgoTUFYX1VTQl9SWF9CVUZGRVJfTlVNQkVSKzMpICYgfjB4MDMgKSBdOy8vT3duZXJzaGlwIG9mIGJ1ZmZlciAgMDogU1cgMTpIVworCisJdTMyCVJ4UHJvY2Vzc0luZGV4Oy8vVGhlIG5leHQgaW5kZXggdG8gcHJvY2VzcworCXUzMglSeEJ1ZmZlcklkOworCXUzMglFUDN2bV9zdGF0ZTsKKworCXUzMglyeF9oYWx0OyAvLyBGb3IgVk0gc3RvcHBpbmcKKworCXUxNglNb3JlRGF0YVNpemU7CisJdTE2CVBhY2tldFNpemU7CisKKwl1MzIJQ3VycmVudFJ4QnVmZmVySWQ7IC8vIEZvciBjb21wbGV0ZSByb3V0aW5lIHVzYWdlCisJdTMyCVJ4M1VyYkNhbmNlbDsKKworCXUzMglMYXN0UjE7IC8vIEZvciBSU1NJIHJlcG9ydGluZworCXN0cnVjdCB1cmIgKgkJCQlSeFVyYjsKKwl1MzIJCUVwM0Vycm9yQ291bnQyOyAvLyAyMDA2MDYyNS4xIFVzYmQgZm9yIFJ4IERNQSBlcnJvciBjb3VudAorCisJaW50CQlFUDNWTV9zdGF0dXM7CisJdTggKglwRFJ4OworCit9IFdCMzVSWCwgKlBXQjM1Ulg7CisKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2IzNXR4LmMgYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YjM1dHguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOWI0NDU2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2IzNXR4LmMKQEAgLTAsMCArMSwzMDUgQEAKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gIENvcHlyaWdodCAoYykgMTk5Ni0yMDAyIFdpbmJvbmQgRWxlY3Ryb25pYyBDb3Jwb3JhdGlvbgorLy8KKy8vICBNb2R1bGUgTmFtZToKKy8vICAgIFdiMzVUeC5jCisvLworLy8gIEFic3RyYWN0OgorLy8gICAgUHJvY2Vzc2luZyB0aGUgVHggbWVzc2FnZSBhbmQgcHV0IGludG8gZG93biBsYXllcgorLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorCisjaW5jbHVkZSAid2IzNXR4X2YuaCIKKyNpbmNsdWRlICJtZHNfZi5oIgorI2luY2x1ZGUgInN5c2RlZi5oIgorCit1bnNpZ25lZCBjaGFyCitXYjM1VHhfZ2V0X3R4X2J1ZmZlcihwaHdfZGF0YV90IHBId0RhdGEsIHU4ICoqcEJ1ZmZlcikKK3sKKwlQV0IzNVRYIHBXYjM1VHggPSAmcEh3RGF0YS0+V2IzNVR4OworCisJKnBCdWZmZXIgPSBwV2IzNVR4LT5UeEJ1ZmZlclswXTsKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIHZvaWQgV2IzNVR4KHN0cnVjdCB3YnNvZnRfcHJpdiAqYWRhcHRlcik7CisKK3N0YXRpYyB2b2lkIFdiMzVUeF9jb21wbGV0ZShzdHJ1Y3QgdXJiICogcFVyYikKK3sKKwlzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKmFkYXB0ZXIgPSBwVXJiLT5jb250ZXh0OworCXBod19kYXRhX3QJcEh3RGF0YSA9ICZhZGFwdGVyLT5zSHdEYXRhOworCVBXQjM1VFgJCXBXYjM1VHggPSAmcEh3RGF0YS0+V2IzNVR4OworCVBNRFMJCXBNZHMgPSAmYWRhcHRlci0+TWRzOworCisJcHJpbnRrKCJ3YjM1OiB0eCBjb21wbGV0ZVxuIik7CisJLy8gVmFyaWFibGUgc2V0dGluZworCXBXYjM1VHgtPkVQNHZtX3N0YXRlID0gVk1fQ09NUExFVEVEOworCXBXYjM1VHgtPkVQNFZNX3N0YXR1cyA9IHBVcmItPnN0YXR1czsgLy9TdG9yZSB0aGUgbGFzdCByZXN1bHQgb2YgSXJwCisJcE1kcy0+VHhPd25lclsgcFdiMzVUeC0+VHhTZW5kSW5kZXggXSA9IDA7Ly8gU2V0IHRoZSBvd25lci4gRnJlZSB0aGUgb3duZXIgYml0IGFsd2F5cy4KKwlwV2IzNVR4LT5UeFNlbmRJbmRleCsrOworCXBXYjM1VHgtPlR4U2VuZEluZGV4ICU9IE1BWF9VU0JfVFhfQlVGRkVSX05VTUJFUjsKKworCWlmIChwSHdEYXRhLT5TdXJwcmlzZVJlbW92ZSB8fCBwSHdEYXRhLT5Id1N0b3ApIC8vIExldCBXYldsYW5IYWx0IHRvIGhhbmRsZSBzdXJwcmlzZSByZW1vdmUKKwkJZ290byBlcnJvcjsKKworCWlmIChwV2IzNVR4LT50eF9oYWx0KQorCQlnb3RvIGVycm9yOworCisJLy8gVGhlIFVSQiBpcyBjb21wbGV0ZWQsIGNoZWNrIHRoZSByZXN1bHQKKwlpZiAocFdiMzVUeC0+RVA0Vk1fc3RhdHVzICE9IDApIHsKKwkJcHJpbnRrKCJVUkIgc3VibWlzc2lvbiBmYWlsZWRcbiIpOworCQlwV2IzNVR4LT5FUDR2bV9zdGF0ZSA9IFZNX1NUT1A7CisJCWdvdG8gZXJyb3I7CisJfQorCisJTWRzX1R4KGFkYXB0ZXIpOworCVdiMzVUeChhZGFwdGVyKTsKKwlyZXR1cm47CisKK2Vycm9yOgorCWF0b21pY19kZWMoJnBXYjM1VHgtPlR4RmlyZUNvdW50ZXIpOworCXBXYjM1VHgtPkVQNHZtX3N0YXRlID0gVk1fU1RPUDsKK30KKworc3RhdGljIHZvaWQgV2IzNVR4KHN0cnVjdCB3YnNvZnRfcHJpdiAqYWRhcHRlcikKK3sKKwlwaHdfZGF0YV90CXBId0RhdGEgPSAmYWRhcHRlci0+c0h3RGF0YTsKKwlQV0IzNVRYCQlwV2IzNVR4ID0gJnBId0RhdGEtPldiMzVUeDsKKwl1OAkJKnBUeEJ1ZmZlckFkZHJlc3M7CisJUE1EUwkJcE1kcyA9ICZhZGFwdGVyLT5NZHM7CisJc3RydWN0IHVyYiAqCXBVcmIgPSAoc3RydWN0IHVyYiAqKXBXYjM1VHgtPlR4NFVyYjsKKwlpbnQgICAgICAgICAJcmV0djsKKwl1MzIJCVNlbmRJbmRleDsKKworCisJaWYgKHBId0RhdGEtPlN1cnByaXNlUmVtb3ZlIHx8IHBId0RhdGEtPkh3U3RvcCkKKwkJZ290byBjbGVhbnVwOworCisJaWYgKHBXYjM1VHgtPnR4X2hhbHQpCisJCWdvdG8gY2xlYW51cDsKKworCS8vIE93bmVyc2hpcCBjaGVja2luZworCVNlbmRJbmRleCA9IHBXYjM1VHgtPlR4U2VuZEluZGV4OworCWlmICghcE1kcy0+VHhPd25lcltTZW5kSW5kZXhdKSAvL05vIG1vcmUgZGF0YSBuZWVkIHRvIGJlIHNlbnQsIHJldHVybiBpbW1lZGlhdGVseQorCQlnb3RvIGNsZWFudXA7CisKKwlwVHhCdWZmZXJBZGRyZXNzID0gcFdiMzVUeC0+VHhCdWZmZXJbU2VuZEluZGV4XTsKKwkvLworCS8vIElzc3VpbmcgVVJCCisJLy8KKwl1c2JfZmlsbF9idWxrX3VyYihwVXJiLCBwSHdEYXRhLT5XYlVzYi51ZGV2LAorCQkJICB1c2Jfc25kYnVsa3BpcGUocEh3RGF0YS0+V2JVc2IudWRldiwgNCksCisJCQkgIHBUeEJ1ZmZlckFkZHJlc3MsIHBNZHMtPlR4QnVmZmVyU2l6ZVsgU2VuZEluZGV4IF0sCisJCQkgIFdiMzVUeF9jb21wbGV0ZSwgYWRhcHRlcik7CisKKwlwV2IzNVR4LT5FUDR2bV9zdGF0ZSA9IFZNX1JVTk5JTkc7CisJcmV0diA9IHVzYl9zdWJtaXRfdXJiKHBVcmIsIEdGUF9BVE9NSUMpOworCWlmIChyZXR2PDApIHsKKwkJcHJpbnRrKCJFUDQgVHggSXJwIHNlbmRpbmcgZXJyb3JcbiIpOworCQlnb3RvIGNsZWFudXA7CisJfQorCisJLy8gQ2hlY2sgaWYgZHJpdmVyIG5lZWRzIGlzc3VlIElycCBmb3IgRVAyCisJcFdiMzVUeC0+VHhGaWxsQ291bnQgKz0gcE1kcy0+VHhDb3VudEluQnVmZmVyW1NlbmRJbmRleF07CisJaWYgKHBXYjM1VHgtPlR4RmlsbENvdW50ID4gMTIpCisJCVdiMzVUeF9FUDJWTV9zdGFydChhZGFwdGVyKTsKKworCXBXYjM1VHgtPkJ5dGVUcmFuc2ZlciArPSBwTWRzLT5UeEJ1ZmZlclNpemVbU2VuZEluZGV4XTsKKwlyZXR1cm47CisKKyBjbGVhbnVwOgorCXBXYjM1VHgtPkVQNHZtX3N0YXRlID0gVk1fU1RPUDsKKwlhdG9taWNfZGVjKCZwV2IzNVR4LT5UeEZpcmVDb3VudGVyKTsKK30KKwordm9pZCBXYjM1VHhfc3RhcnQoc3RydWN0IHdic29mdF9wcml2ICphZGFwdGVyKQoreworCXBod19kYXRhX3QgcEh3RGF0YSA9ICZhZGFwdGVyLT5zSHdEYXRhOworCVBXQjM1VFggcFdiMzVUeCA9ICZwSHdEYXRhLT5XYjM1VHg7CisKKwkvLyBBbGxvdyBvbmx5IG9uZSB0aHJlYWQgdG8gcnVuIGludG8gZnVuY3Rpb24KKwlpZiAoYXRvbWljX2luY19yZXR1cm4oJnBXYjM1VHgtPlR4RmlyZUNvdW50ZXIpID09IDEpIHsKKwkJcFdiMzVUeC0+RVA0dm1fc3RhdGUgPSBWTV9SVU5OSU5HOworCQlXYjM1VHgoYWRhcHRlcik7CisJfSBlbHNlCisJCWF0b21pY19kZWMoJnBXYjM1VHgtPlR4RmlyZUNvdW50ZXIpOworfQorCit1bnNpZ25lZCBjaGFyIFdiMzVUeF9pbml0aWFsKHBod19kYXRhX3QgcEh3RGF0YSkKK3sKKwlQV0IzNVRYIHBXYjM1VHggPSAmcEh3RGF0YS0+V2IzNVR4OworCisJcFdiMzVUeC0+VHg0VXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfQVRPTUlDKTsKKwlpZiAoIXBXYjM1VHgtPlR4NFVyYikKKwkJcmV0dXJuIGZhbHNlOworCisJcFdiMzVUeC0+VHgyVXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfQVRPTUlDKTsKKwlpZiAoIXBXYjM1VHgtPlR4MlVyYikKKwl7CisJCXVzYl9mcmVlX3VyYiggcFdiMzVUeC0+VHg0VXJiICk7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK3ZvaWQgV2IzNVR4X3N0b3AocGh3X2RhdGFfdCBwSHdEYXRhKQoreworCVBXQjM1VFggcFdiMzVUeCA9ICZwSHdEYXRhLT5XYjM1VHg7CisKKwkvLyBUcnlpbmcgdG8gY2FuY2VsaW5nIHRoZSBUcnAgb2YgRVAyCisJaWYgKHBXYjM1VHgtPkVQMnZtX3N0YXRlID09IFZNX1JVTk5JTkcpCisJCXVzYl91bmxpbmtfdXJiKCBwV2IzNVR4LT5UeDJVcmIgKTsgLy8gT25seSB1c2UgdW5saW5rLCBsZXQgV2IzNVR4X2Rlc3Ryb3QgdG8gZnJlZSB0aGVtCisJI2lmZGVmIF9QRV9UWF9EVU1QXworCVdCREVCVUcoKCJFUDIgVHggc3RvcFxuIikpOworCSNlbmRpZgorCisJLy8gVHJ5aW5nIHRvIGNhbmNlbGluZyB0aGUgSXJwIG9mIEVQNAorCWlmIChwV2IzNVR4LT5FUDR2bV9zdGF0ZSA9PSBWTV9SVU5OSU5HKQorCQl1c2JfdW5saW5rX3VyYiggcFdiMzVUeC0+VHg0VXJiICk7IC8vIE9ubHkgdXNlIHVubGluaywgbGV0IFdiMzVUeF9kZXN0cm90IHRvIGZyZWUgdGhlbQorCSNpZmRlZiBfUEVfVFhfRFVNUF8KKwlXQkRFQlVHKCgiRVA0IFR4IHN0b3BcbiIpKTsKKwkjZW5kaWYKK30KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK3ZvaWQgV2IzNVR4X2Rlc3Ryb3kocGh3X2RhdGFfdCBwSHdEYXRhKQoreworCVBXQjM1VFggcFdiMzVUeCA9ICZwSHdEYXRhLT5XYjM1VHg7CisKKwkvLyBXYWl0IGZvciBWTSBzdG9wCisJZG8geworCQltc2xlZXAoMTApOyAgLy8gRGVsYXkgZm9yIHdhaXRpbmcgZnVuY3Rpb24gZW50ZXIgOTQwNjIzLjEuYQorCX0gd2hpbGUoIChwV2IzNVR4LT5FUDJ2bV9zdGF0ZSAhPSBWTV9TVE9QKSAmJiAocFdiMzVUeC0+RVA0dm1fc3RhdGUgIT0gVk1fU1RPUCkgKTsKKwltc2xlZXAoMTApOyAgLy8gRGVsYXkgZm9yIHdhaXRpbmcgZnVuY3Rpb24gZW50ZXIgOTQwNjIzLjEuYgorCisJaWYgKHBXYjM1VHgtPlR4NFVyYikKKwkJdXNiX2ZyZWVfdXJiKCBwV2IzNVR4LT5UeDRVcmIgKTsKKworCWlmIChwV2IzNVR4LT5UeDJVcmIpCisJCXVzYl9mcmVlX3VyYiggcFdiMzVUeC0+VHgyVXJiICk7CisKKwkjaWZkZWYgX1BFX1RYX0RVTVBfCisJV0JERUJVRygoIldiMzVUeF9kZXN0cm95IE9LXG4iKSk7CisJI2VuZGlmCit9CisKK3ZvaWQgV2IzNVR4X0N1cnJlbnRUaW1lKHN0cnVjdCB3YnNvZnRfcHJpdiAqYWRhcHRlciwgdTMyIFRpbWVDb3VudCkKK3sKKwlwaHdfZGF0YV90IHBId0RhdGEgPSAmYWRhcHRlci0+c0h3RGF0YTsKKwlQV0IzNVRYIHBXYjM1VHggPSAmcEh3RGF0YS0+V2IzNVR4OworCXVuc2lnbmVkIGNoYXIgVHJpZ2dlciA9IGZhbHNlOworCisJaWYgKHBXYjM1VHgtPlR4VGltZXIgPiBUaW1lQ291bnQpCisJCVRyaWdnZXIgPSB0cnVlOworCWVsc2UgaWYgKFRpbWVDb3VudCA+IChwV2IzNVR4LT5UeFRpbWVyKzUwMCkpCisJCVRyaWdnZXIgPSB0cnVlOworCisJaWYgKFRyaWdnZXIpIHsKKwkJcFdiMzVUeC0+VHhUaW1lciA9IFRpbWVDb3VudDsKKwkJV2IzNVR4X0VQMlZNX3N0YXJ0KGFkYXB0ZXIpOworCX0KK30KKworc3RhdGljIHZvaWQgV2IzNVR4X0VQMlZNKHN0cnVjdCB3YnNvZnRfcHJpdiAqYWRhcHRlcik7CisKK3N0YXRpYyB2b2lkIFdiMzVUeF9FUDJWTV9jb21wbGV0ZShzdHJ1Y3QgdXJiICogcFVyYikKK3sKKwlzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKmFkYXB0ZXIgPSBwVXJiLT5jb250ZXh0OworCXBod19kYXRhX3QJcEh3RGF0YSA9ICZhZGFwdGVyLT5zSHdEYXRhOworCVQwMl9ERVNDUklQVE9SCVQwMiwgVFNUQVRVUzsKKwlQV0IzNVRYCQlwV2IzNVR4ID0gJnBId0RhdGEtPldiMzVUeDsKKwl1MzIgKgkJcGx0bXAgPSAodTMyICopcFdiMzVUeC0+RVAyX2J1ZjsKKwl1MzIJCWk7CisJdTE2CQlJbnRlcnJ1cHRJbkxlbmd0aDsKKworCisJLy8gVmFyaWFibGUgc2V0dGluZworCXBXYjM1VHgtPkVQMnZtX3N0YXRlID0gVk1fQ09NUExFVEVEOworCXBXYjM1VHgtPkVQMlZNX3N0YXR1cyA9IHBVcmItPnN0YXR1czsKKworCS8vIEZvciBMaW51eCAyLjQuIEludGVycnVwdCB3aWxsIGFsd2F5cyB0cmlnZ2VyCisJaWYgKHBId0RhdGEtPlN1cnByaXNlUmVtb3ZlIHx8IHBId0RhdGEtPkh3U3RvcCkgLy8gTGV0IFdiV2xhbkhhbHQgdG8gaGFuZGxlIHN1cnByaXNlIHJlbW92ZQorCQlnb3RvIGVycm9yOworCisJaWYgKHBXYjM1VHgtPnR4X2hhbHQpCisJCWdvdG8gZXJyb3I7CisKKwkvL1RoZSBVcmIgaXMgY29tcGxldGVkLCBjaGVjayB0aGUgcmVzdWx0CisJaWYgKHBXYjM1VHgtPkVQMlZNX3N0YXR1cyAhPSAwKSB7CisJCVdCREVCVUcoKCJFUDIgSW9Db21wbGV0ZVJvdXRpbmUgcmV0dXJuIGVycm9yXG4iKSk7CisJCXBXYjM1VHgtPkVQMnZtX3N0YXRlPSBWTV9TVE9QOworCQlnb3RvIGVycm9yOworCX0KKworCS8vIFVwZGF0ZSB0aGUgVHggcmVzdWx0CisJSW50ZXJydXB0SW5MZW5ndGggPSBwVXJiLT5hY3R1YWxfbGVuZ3RoOworCS8vIE1vZGlmeSBmb3IgbWluaW11bSBtZW1vcnkgYWNjZXNzIGFuZCBEV09SRCBhbGlnbm1lbnQuCisJVDAyLnZhbHVlID0gY3B1X3RvX2xlMzIocGx0bXBbMF0pID4+IDg7IC8vIFszMTo4XSAtPiBbMjQ6MF0KKwlJbnRlcnJ1cHRJbkxlbmd0aCAtPSAxOy8vIDIwMDUxMjIxLjEuYyBNb2RpZnkgdGhlIGZvbGxvdyBmb3IgbW9yZSBzdGFibGUKKwlJbnRlcnJ1cHRJbkxlbmd0aCA+Pj0gMjsgLy8gSW50ZXJydXB0SW5MZW5ndGgvNAorCWZvciAoaSA9IDE7IGkgPD0gSW50ZXJydXB0SW5MZW5ndGg7IGkrKykgeworCQlUMDIudmFsdWUgfD0gKChjcHVfdG9fbGUzMihwbHRtcFtpXSkgJiAweGZmKSA8PCAyNCk7CisKKwkJVFNUQVRVUy52YWx1ZSA9IFQwMi52YWx1ZTsgIC8vMjAwNjEwMDkgYW5zb24ncyBlbmRpYW4KKwkJTWRzX1NlbmRDb21wbGV0ZSggYWRhcHRlciwgJlRTVEFUVVMgKTsKKwkJVDAyLnZhbHVlID0gY3B1X3RvX2xlMzIocGx0bXBbaV0pID4+IDg7CisJfQorCisJcmV0dXJuOworZXJyb3I6CisJYXRvbWljX2RlYygmcFdiMzVUeC0+VHhSZXN1bHRDb3VudCk7CisJcFdiMzVUeC0+RVAydm1fc3RhdGUgPSBWTV9TVE9QOworfQorCitzdGF0aWMgdm9pZCBXYjM1VHhfRVAyVk0oc3RydWN0IHdic29mdF9wcml2ICphZGFwdGVyKQoreworCXBod19kYXRhX3QJcEh3RGF0YSA9ICZhZGFwdGVyLT5zSHdEYXRhOworCVBXQjM1VFggcFdiMzVUeCA9ICZwSHdEYXRhLT5XYjM1VHg7CisJc3RydWN0IHVyYiAqCXBVcmIgPSAoc3RydWN0IHVyYiAqKXBXYjM1VHgtPlR4MlVyYjsKKwl1MzIgKglwbHRtcCA9ICh1MzIgKilwV2IzNVR4LT5FUDJfYnVmOworCWludAkJcmV0djsKKworCWlmIChwSHdEYXRhLT5TdXJwcmlzZVJlbW92ZSB8fCBwSHdEYXRhLT5Id1N0b3ApCisJCWdvdG8gZXJyb3I7CisKKwlpZiAocFdiMzVUeC0+dHhfaGFsdCkKKwkJZ290byBlcnJvcjsKKworCS8vCisJLy8gSXNzdWluZyBVUkIKKwkvLworCXVzYl9maWxsX2ludF91cmIoIHBVcmIsIHBId0RhdGEtPldiVXNiLnVkZXYsIHVzYl9yY3ZpbnRwaXBlKHBId0RhdGEtPldiVXNiLnVkZXYsMiksCisJCQkgIHBsdG1wLCBNQVhfSU5URVJSVVBUX0xFTkdUSCwgV2IzNVR4X0VQMlZNX2NvbXBsZXRlLCBhZGFwdGVyLCAzMik7CisKKwlwV2IzNVR4LT5FUDJ2bV9zdGF0ZSA9IFZNX1JVTk5JTkc7CisJcmV0diA9IHVzYl9zdWJtaXRfdXJiKHBVcmIsIEdGUF9BVE9NSUMpOworCisJaWYgKHJldHYgPCAwKSB7CisJCSNpZmRlZiBfUEVfVFhfRFVNUF8KKwkJV0JERUJVRygoIkVQMiBUeCBJcnAgc2VuZGluZyBlcnJvclxuIikpOworCQkjZW5kaWYKKwkJZ290byBlcnJvcjsKKwl9CisKKwlyZXR1cm47CitlcnJvcjoKKwlwV2IzNVR4LT5FUDJ2bV9zdGF0ZSA9IFZNX1NUT1A7CisJYXRvbWljX2RlYygmcFdiMzVUeC0+VHhSZXN1bHRDb3VudCk7Cit9CisKK3ZvaWQgV2IzNVR4X0VQMlZNX3N0YXJ0KHN0cnVjdCB3YnNvZnRfcHJpdiAqYWRhcHRlcikKK3sKKwlwaHdfZGF0YV90IHBId0RhdGEgPSAmYWRhcHRlci0+c0h3RGF0YTsKKwlQV0IzNVRYIHBXYjM1VHggPSAmcEh3RGF0YS0+V2IzNVR4OworCisJLy8gQWxsb3cgb25seSBvbmUgdGhyZWFkIHRvIHJ1biBpbnRvIGZ1bmN0aW9uCisJaWYgKGF0b21pY19pbmNfcmV0dXJuKCZwV2IzNVR4LT5UeFJlc3VsdENvdW50KSA9PSAxKSB7CisJCXBXYjM1VHgtPkVQMnZtX3N0YXRlID0gVk1fUlVOTklORzsKKwkJV2IzNVR4X0VQMlZNKGFkYXB0ZXIpOworCX0KKwllbHNlCisJCWF0b21pY19kZWMoJnBXYjM1VHgtPlR4UmVzdWx0Q291bnQpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2IzNXR4X2YuaCBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3diMzV0eF9mLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDIyMmZhOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3diMzV0eF9mLmgKQEAgLTAsMCArMSwyMSBAQAorI2lmbmRlZiBfX1dJTkJPTkRfV0IzNVRYX0ZfSAorI2RlZmluZSBfX1dJTkJPTkRfV0IzNVRYX0ZfSAorCisjaW5jbHVkZSAiY29yZS5oIgorI2luY2x1ZGUgIndiaGFsX2YuaCIKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIEludGVyZmFjZSBmdW5jdGlvbiBkZWNsYXJlCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQordW5zaWduZWQgY2hhciBXYjM1VHhfaW5pdGlhbCgJIHBod19kYXRhX3QgcEh3RGF0YSApOwordm9pZCBXYjM1VHhfZGVzdHJveSggIHBod19kYXRhX3QgcEh3RGF0YSApOwordW5zaWduZWQgY2hhciBXYjM1VHhfZ2V0X3R4X2J1ZmZlciggIHBod19kYXRhX3QgcEh3RGF0YSwgIHU4ICoqcEJ1ZmZlciApOworCit2b2lkIFdiMzVUeF9FUDJWTV9zdGFydChzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKmFkYXB0ZXIpOworCit2b2lkIFdiMzVUeF9zdGFydChzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKmFkYXB0ZXIpOwordm9pZCBXYjM1VHhfc3RvcCggIHBod19kYXRhX3QgcEh3RGF0YSApOworCit2b2lkIFdiMzVUeF9DdXJyZW50VGltZShzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKmFkYXB0ZXIsICB1MzIgVGltZUNvdW50KTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YjM1dHhfcy5oIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2IzNXR4X3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTYwMjc2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2IzNXR4X3MuaApAQCAtMCwwICsxLDQ5IEBACisjaWZuZGVmIF9fV0lOQk9ORF9XQjM1X1RYX1NfSAorI2RlZmluZSBfX1dJTkJPTkRfV0IzNV9UWF9TX0gKKworI2luY2x1ZGUgIm1kc19zLmgiCisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBJUzg5QzM1IFR4IHJlbGF0ZWQgZGVmaW5pdGlvbgorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyNkZWZpbmUgVFhfSU5URVJGQUNFCQkJMAkvLyBJbnRlcmZhY2UgMQorI2RlZmluZSBUWF9QSVBFCQkJCQkzCS8vIGVuZHBvaW50IDQKKyNkZWZpbmUgVFhfSU5URVJSVVBUCQkJMQkvLyBlbmRwb2ludCAyCisjZGVmaW5lIE1BWF9JTlRFUlJVUFRfTEVOR1RICTY0CS8vIEl0IG11c3QgYmUgNjQgZm9yIEVQMiBoYXJkd2FyZQorCisKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIEludGVybmFsIHZhcmlhYmxlIGZvciBtb2R1bGUKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwordHlwZWRlZiBzdHJ1Y3QgX1dCMzVUWAoreworCS8vIEZvciBUeCBidWZmZXIKKwl1OAlUeEJ1ZmZlclsgTUFYX1VTQl9UWF9CVUZGRVJfTlVNQkVSIF1bIE1BWF9VU0JfVFhfQlVGRkVSIF07CisKKwkvLyBGb3IgSW50ZXJydXB0IHBpcGUKKwl1OAlFUDJfYnVmW01BWF9JTlRFUlJVUFRfTEVOR1RIXTsKKworCWF0b21pY190CVR4UmVzdWx0Q291bnQ7Ly8gRm9yIHRocmVhZCBjb250cm9sIG9mIEVQMiA5MzExMzAuNC5tCisJYXRvbWljX3QJVHhGaXJlQ291bnRlcjsvLyBGb3IgdGhyZWFkIGNvbnRyb2wgb2YgRVA0IDkzMTEzMC40Lm4KKwl1MzIJCQlCeXRlVHJhbnNmZXI7CisKKwl1MzIJICAgIFR4U2VuZEluZGV4Oy8vIFRoZSBuZXh0IGluZGV4IG9mIE1kcyBhcnJheSB0byBiZSBzZW50CisJdTMyCSAgICBFUDJ2bV9zdGF0ZTsgLy8gZm9yIEVQMnZtIHN0YXRlCisJdTMyCSAgICBFUDR2bV9zdGF0ZTsgLy8gZm9yIEVQNHZtIHN0YXRlCisJdTMyCSAgICB0eF9oYWx0OyAvLyBTdG9wcGluZyBWTQorCisJc3RydWN0IHVyYiAqCQkJCVR4NFVyYjsKKwlzdHJ1Y3QgdXJiICoJCQkJVHgyVXJiOworCisJaW50CQlFUDJWTV9zdGF0dXM7CisJaW50CQlFUDRWTV9zdGF0dXM7CisKKwl1MzIJVHhGaWxsQ291bnQ7IC8vIDIwMDYwOTI4CisJdTMyCVR4VGltZXI7IC8vIDIwMDYwOTI4IEFkZCBpZiBzZW5kaW5nIHBhY2tldCBub3QgZ3JlYXQgdGhhbiAxMworCit9IFdCMzVUWCwgKlBXQjM1VFg7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2JoYWwuYyBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3diaGFsLmMKaW5kZXggNWQ2OGVjZS4uOGE5ZDIxYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2JoYWwuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YmhhbC5jCkBAIC0xLDExICsxLDYgQEAKICNpbmNsdWRlICJvc19jb21tb24uaCIKLQotdm9pZCBoYWxfZ2V0X2V0aGVybmV0X2FkZHJlc3MoIHBod19kYXRhX3QgcEh3RGF0YSwgdTggKmN1cnJlbnRfYWRkcmVzcyApCi17Ci0JaWYoIHBId0RhdGEtPlN1cnByaXNlUmVtb3ZlICkgcmV0dXJuOwotCi0JbWVtY3B5KCBjdXJyZW50X2FkZHJlc3MsIHBId0RhdGEtPkN1cnJlbnRNYWNBZGRyZXNzLCBFVEhfTEVOR1RIX09GX0FERFJFU1MgKTsKLX0KKyNpbmNsdWRlICJ3YmhhbF9mLmgiCisjaW5jbHVkZSAid2JsaW51eF9mLmgiCiAKIHZvaWQgaGFsX3NldF9ldGhlcm5ldF9hZGRyZXNzKCBwaHdfZGF0YV90IHBId0RhdGEsIHU4ICpjdXJyZW50X2FkZHJlc3MgKQogewpAQCAtMjgsNDIzICsyMywxMSBAQAogCW1lbWNweSggcGV0aGVybmV0X2FkZHJlc3MsIHBId0RhdGEtPlBlcm1hbmVudE1hY0FkZHJlc3MsIDYgKTsKIH0KIAotdTggaGFsX2luaXRfaGFyZHdhcmUocGh3X2RhdGFfdCBwSHdEYXRhLCBQV0IzMl9BREFQVEVSIEFkYXB0ZXIpCitzdGF0aWMgdm9pZCBoYWxfbGVkX2NvbnRyb2wodW5zaWduZWQgbG9uZyBkYXRhKQogewotCXUxNiBTb2Z0d2FyZVNldDsKLQlwSHdEYXRhLT5BZGFwdGVyID0gQWRhcHRlcjsKLQotCS8vIEluaXRpYWwgdGhlIHZhcmlhYmxlCi0JcEh3RGF0YS0+TWF4UmVjZWl2ZUxpZmVUaW1lID0gREVGQVVMVF9NU0RVX0xJRkVfVElNRTsgLy8gU2V0dGluZyBSeCBtYXhpbXVtIE1TRFUgbGlmZSB0aW1lCi0JcEh3RGF0YS0+RnJhZ21lbnRUaHJlc2hvbGQgPSBERUZBVUxUX0ZSQUdNRU5UX1RIUkVTSE9MRDsgLy8gU2V0dGluZyBkZWZhdWx0IGZyYWdtZW50IHRocmVzaG9sZAotCi0JaWYgKFdiVXNiX2luaXRpYWwocEh3RGF0YSkpIHsKLQkJcEh3RGF0YS0+SW5pdGlhbFJlc291cmNlID0gMTsKLQkJaWYoIFdiMzVSZWdfaW5pdGlhbChwSHdEYXRhKSkgewotCQkJcEh3RGF0YS0+SW5pdGlhbFJlc291cmNlID0gMjsKLQkJCWlmIChXYjM1VHhfaW5pdGlhbChwSHdEYXRhKSkgewotCQkJCXBId0RhdGEtPkluaXRpYWxSZXNvdXJjZSA9IDM7Ci0JCQkJaWYgKFdiMzVSeF9pbml0aWFsKHBId0RhdGEpKSB7Ci0JCQkJCXBId0RhdGEtPkluaXRpYWxSZXNvdXJjZSA9IDQ7Ci0JCQkJCU9TX1RJTUVSX0lOSVRJQUwoICZwSHdEYXRhLT5MRURUaW1lciwgaGFsX2xlZF9jb250cm9sLCBwSHdEYXRhICk7Ci0JCQkJCU9TX1RJTUVSX1NFVCggJnBId0RhdGEtPkxFRFRpbWVyLCAxMDAwICk7IC8vIDIwMDYwNjIzCi0KLQkJCQkJLy8KLQkJCQkJLy8gRm9yIHJlc3RyaWN0IHRvIHZlbmRvcidzIGhhcmR3YXJlCi0JCQkJCS8vCi0JCQkJCVNvZnR3YXJlU2V0ID0gaGFsX3NvZnR3YXJlX3NldCggcEh3RGF0YSApOwotCi0JCQkJCSNpZmRlZiBWZW5kb3IyCi0JCQkJCS8vIFRyeSB0byBtYWtlIHN1cmUgdGhlIEVFUFJPTSBjb250YWluCi0JCQkJCVNvZnR3YXJlU2V0ID4+PSA4OwotCQkJCQlpZiggU29mdHdhcmVTZXQgIT0gMHg4MiApCi0JCQkJCQlyZXR1cm4gRkFMU0U7Ci0JCQkJCSNlbmRpZgotCi0JCQkJCVdiMzVSeF9zdGFydCggcEh3RGF0YSApOwotCQkJCQlXYjM1VHhfRVAyVk1fc3RhcnQoIHBId0RhdGEgKTsKLQotCQkJCQlyZXR1cm4gVFJVRTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwSHdEYXRhLT5TdXJwcmlzZVJlbW92ZSA9IDE7Ci0JcmV0dXJuIEZBTFNFOwotfQotCi0KLXZvaWQgaGFsX2hhbHQocGh3X2RhdGFfdCBwSHdEYXRhLCB2b2lkICpwcGFfZGF0YSkKLXsKLQlzd2l0Y2goIHBId0RhdGEtPkluaXRpYWxSZXNvdXJjZSApCi0JewotCQljYXNlIDQ6Ci0JCWNhc2UgMzogT1NfVElNRVJfQ0FOQ0VMKCAmcEh3RGF0YS0+TEVEVGltZXIsICZjYW5jZWwgKTsKLQkJCU9TX1NMRUVQKDEwMDAwMCk7IC8vIFdhaXQgZm9yIFRpbWVyIERQQyBleGl0IDk0MDYyMy4yCi0JCQlXYjM1UnhfZGVzdHJveSggcEh3RGF0YSApOyAvLyBSZWxlYXNlIHRoZSBSeAotCQljYXNlIDI6IFdiMzVUeF9kZXN0cm95KCBwSHdEYXRhICk7IC8vIFJlbGVhc2UgdGhlIFR4Ci0JCWNhc2UgMTogV2IzNVJlZ19kZXN0cm95KCBwSHdEYXRhICk7IC8vIFJlbGVhc2UgdGhlIFdiMzUgUmVnaXNzdGVyIHJlc291cmNlcwotCQkJCVdiVXNiX2Rlc3Ryb3koIHBId0RhdGEgKTsvLyBSZWxlYXNlIHRoZSBXYlVzYgotCX0KLX0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXZvaWQgaGFsX3NldF9yYXRlcyhwaHdfZGF0YV90IHBId0RhdGEsIHU4ICpwYnNzX3JhdGVzLAotCQkgICB1OCBsZW5ndGgsIHVuc2lnbmVkIGNoYXIgYmFzaWNfcmF0ZV9zZXQpCi17Ci0JUFdCMzVSRUcJcFdiMzVSZWcgPSAmcEh3RGF0YS0+V2IzNVJlZzsKLQl1MzIJCXRtcCwgdG1wMTsKLQl1OAkJUmF0ZVsxMl09eyAyLCA0LCAxMSwgMjIsIDEyLCAxOCwgMjQsIDM2LCA0OCwgNzIsIDk2LCAxMDggfTsKLQl1OAkJU3VwcG9ydGVkUmF0ZVsxNl07Ci0JdTgJCWksIGosIGssIENvdW50MSwgQ291bnQyLCBCeXRlOwotCi0JaWYoIHBId0RhdGEtPlN1cnByaXNlUmVtb3ZlICkgcmV0dXJuOwotCi0JaWYgKGJhc2ljX3JhdGVfc2V0KSB7Ci0JCXBXYjM1UmVnLT5NMjhfTWFjQ29udHJvbCAmPSB+MHgwMDBmZmYwMDsKLQkJdG1wMSA9IDB4MDAwMDAxMDA7Ci0JfSBlbHNlIHsKLQkJcFdiMzVSZWctPk0yOF9NYWNDb250cm9sICY9IH4weGZmZjAwMDAwOwotCQl0bXAxID0gMHgwMDEwMDAwMDsKLQl9Ci0KLQl0bXAgPSAwOwotCWZvciAoaT0wOyBpPGxlbmd0aDsgaSsrKSB7Ci0JCUJ5dGUgPSBwYnNzX3JhdGVzW2ldICYgMHg3ZjsKLQkJZm9yIChqPTA7IGo8MTI7IGorKykgewotCQkJaWYoIEJ5dGUgPT0gUmF0ZVtqXSApCi0JCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAoaiA8IDEyKQotCQkJdG1wIHw9ICh0bXAxPDxqKTsKLQl9Ci0KLQlwV2IzNVJlZy0+TTI4X01hY0NvbnRyb2wgfD0gdG1wOwotCVdiMzVSZWdfV3JpdGUoIHBId0RhdGEsIDB4MDgyOCwgcFdiMzVSZWctPk0yOF9NYWNDb250cm9sICk7Ci0KLQkvLyA5MzAyMDYuMi5jIE03OCBzZXR0aW5nCi0JaiA9IGsgPSBDb3VudDEgPSBDb3VudDIgPSAwOwotCW1lbXNldCggU3VwcG9ydGVkUmF0ZSwgMCwgMTYgKTsKLQl0bXAgPSAweDAwMTAwMDAwOwotCXRtcDEgPSAweDAwMDAwMTAwOwotCWZvciAoaT0wOyBpPDEyOyBpKyspIHsgLy8gR2V0IHRoZSBzdXBwb3J0ZWQgcmF0ZQotCQlpZiAodG1wICYgcFdiMzVSZWctPk0yOF9NYWNDb250cm9sKSB7Ci0JCQlTdXBwb3J0ZWRSYXRlW2pdID0gUmF0ZVtpXTsKLQotCQkJaWYgKHRtcDEgJiBwV2IzNVJlZy0+TTI4X01hY0NvbnRyb2wpCi0JCQkJU3VwcG9ydGVkUmF0ZVtqXSB8PSAweDgwOwotCi0JCQlpZiAoaykKLQkJCQlDb3VudDIrKzsKLQkJCWVsc2UKLQkJCQlDb3VudDErKzsKLQotCQkJaisrOwotCQl9Ci0KLQkJaWYgKGk9PTQgJiYgaz09MCkgewotCQkJaWYoICEocFdiMzVSZWctPk0yOF9NYWNDb250cm9sICYgMHgwMDBmZjAwMCkgKSAvLyBpZiBiYXNpYyByYXRlIGluIDExZyBkb21haW4pCi0JCQl7Ci0JCQkJayA9IDE7Ci0JCQkJaiA9IDg7Ci0JCQl9Ci0JCX0KLQotCQl0bXAgPDw9IDE7Ci0JCXRtcDEgPDw9IDE7Ci0JfQotCi0JLy8gRmlsbCBkYXRhIGludG8gc3VwcG9ydCByYXRlIHVudGlsIGJ1ZmZlciBmdWxsCi0JLy8tLS0yMDA2MDkyNiBhZGQgYnkgYW5zb24ncyBlbmRpYW4KLQlmb3IgKGk9MDsgaTw0OyBpKyspCi0JCSoodTMyICopKFN1cHBvcnRlZFJhdGUrKGk8PDIpKSA9IGNwdV90b19sZTMyKCAqKHUzMiAqKShTdXBwb3J0ZWRSYXRlKyhpPDwyKSkgKTsKLQkvLy0tLSBlbmQgMjAwNjA5MjYgYWRkIGJ5IGFuc29uJ3MgZW5kaWFuCi0JV2IzNVJlZ19CdXJzdFdyaXRlKCBwSHdEYXRhLDB4MDg3YywgKHUzMiAqKVN1cHBvcnRlZFJhdGUsIDQsIEFVVE9fSU5DUkVNRU5UICk7Ci0JcFdiMzVSZWctPk03Q19NYWNDb250cm9sID0gKCh1MzIgKilTdXBwb3J0ZWRSYXRlKVswXTsKLQlwV2IzNVJlZy0+TTgwX01hY0NvbnRyb2wgPSAoKHUzMiAqKVN1cHBvcnRlZFJhdGUpWzFdOwotCXBXYjM1UmVnLT5NODRfTWFjQ29udHJvbCA9ICgodTMyICopU3VwcG9ydGVkUmF0ZSlbMl07Ci0JcFdiMzVSZWctPk04OF9NYWNDb250cm9sID0gKCh1MzIgKilTdXBwb3J0ZWRSYXRlKVszXTsKLQotCS8vIEZpbGwgbGVuZ3RoCi0JdG1wID0gQ291bnQxPDwyOCB8IENvdW50Mjw8MjQ7Ci0JcFdiMzVSZWctPk03OF9FUlBJbmZvcm1hdGlvbiAmPSB+MHhmZjAwMDAwMDsKLQlwV2IzNVJlZy0+TTc4X0VSUEluZm9ybWF0aW9uIHw9IHRtcDsKLQlXYjM1UmVnX1dyaXRlKCBwSHdEYXRhLCAweDA4NzgsIHBXYjM1UmVnLT5NNzhfRVJQSW5mb3JtYXRpb24gKTsKLX0KLQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotdm9pZCBoYWxfc2V0X2JlYWNvbl9wZXJpb2QoICBwaHdfZGF0YV90IHBId0RhdGEsICB1MTYgYmVhY29uX3BlcmlvZCApCi17Ci0JdTMyCXRtcDsKLQotCWlmKCBwSHdEYXRhLT5TdXJwcmlzZVJlbW92ZSApIHJldHVybjsKLQotCXBId0RhdGEtPkJlYWNvblBlcmlvZCA9IGJlYWNvbl9wZXJpb2Q7Ci0JdG1wID0gcEh3RGF0YS0+QmVhY29uUGVyaW9kIDw8IDE2OwotCXRtcCB8PSBwSHdEYXRhLT5Qcm9iZURlbGF5OwotCVdiMzVSZWdfV3JpdGUoIHBId0RhdGEsIDB4MDg0OCwgdG1wICk7Ci19Ci0KLQotdm9pZCBoYWxfc2V0X2N1cnJlbnRfY2hhbm5lbF9leCggIHBod19kYXRhX3QgcEh3RGF0YSwgIENoYW5JbmZvIGNoYW5uZWwgKQotewotCVBXQjM1UkVHIHBXYjM1UmVnID0gJnBId0RhdGEtPldiMzVSZWc7Ci0KLQlpZiggcEh3RGF0YS0+U3VycHJpc2VSZW1vdmUgKQotCQlyZXR1cm47Ci0KLQlwcmludGsoIkdvaW5nIHRvIGNoYW5uZWw6ICVkLyVkXG4iLCBjaGFubmVsLmJhbmQsIGNoYW5uZWwuQ2hhbk5vKTsKLQotCVJGU3ludGhlc2l6ZXJfU3dpdGNoaW5nQ2hhbm5lbCggcEh3RGF0YSwgY2hhbm5lbCApOy8vIFN3aXRjaCBjaGFubmVsCi0JcEh3RGF0YS0+Q2hhbm5lbCA9IGNoYW5uZWwuQ2hhbk5vOwotCXBId0RhdGEtPmJhbmQgPSBjaGFubmVsLmJhbmQ7Ci0JI2lmZGVmIF9QRV9TVEFURV9EVU1QXwotCVdCREVCVUcoKCJTZXQgY2hhbm5lbCBpcyAlZCwgYmFuZCA9JWRcbiIsIHBId0RhdGEtPkNoYW5uZWwsIHBId0RhdGEtPmJhbmQpKTsKLQkjZW5kaWYKLQlwV2IzNVJlZy0+TTI4X01hY0NvbnRyb2wgJj0gfjB4ZmY7IC8vIENsZWFuIGNoYW5uZWwgaW5mb3JtYXRpb24gZmllbGQKLQlwV2IzNVJlZy0+TTI4X01hY0NvbnRyb2wgfD0gY2hhbm5lbC5DaGFuTm87Ci0JV2IzNVJlZ19Xcml0ZVdpdGhDYWxsYmFja1ZhbHVlKCBwSHdEYXRhLCAweDA4MjgsIHBXYjM1UmVnLT5NMjhfTWFjQ29udHJvbCwKLQkJCQkJKHM4ICopJmNoYW5uZWwsIHNpemVvZihDaGFuSW5mbykpOwotfQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXZvaWQgaGFsX3NldF9jdXJyZW50X2NoYW5uZWwoICBwaHdfZGF0YV90IHBId0RhdGEsICBDaGFuSW5mbyBjaGFubmVsICkKLXsKLQloYWxfc2V0X2N1cnJlbnRfY2hhbm5lbF9leCggcEh3RGF0YSwgY2hhbm5lbCApOwotfQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXZvaWQgaGFsX2dldF9jdXJyZW50X2NoYW5uZWwoICBwaHdfZGF0YV90IHBId0RhdGEsICBDaGFuSW5mbyAqY2hhbm5lbCApCi17Ci0JY2hhbm5lbC0+Q2hhbk5vID0gcEh3RGF0YS0+Q2hhbm5lbDsKLQljaGFubmVsLT5iYW5kID0gcEh3RGF0YS0+YmFuZDsKLX0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi12b2lkIGhhbF9zZXRfYWNjZXB0X2Jyb2FkY2FzdCggIHBod19kYXRhX3QgcEh3RGF0YSwgIHU4IGVuYWJsZSApCi17Ci0JUFdCMzVSRUcJcFdiMzVSZWcgPSAmcEh3RGF0YS0+V2IzNVJlZzsKLQotCWlmKCBwSHdEYXRhLT5TdXJwcmlzZVJlbW92ZSApIHJldHVybjsKLQotCXBXYjM1UmVnLT5NMDBfTWFjQ29udHJvbCAmPSB+MHgwMjAwMDAwMDsvL1RoZSBIVyB2YWx1ZQotCi0JaWYgKGVuYWJsZSkKLQkJcFdiMzVSZWctPk0wMF9NYWNDb250cm9sIHw9IDB4MDIwMDAwMDA7Ly9UaGUgSFcgdmFsdWUKLQotCVdiMzVSZWdfV3JpdGUoIHBId0RhdGEsIDB4MDgwMCwgcFdiMzVSZWctPk0wMF9NYWNDb250cm9sICk7Ci19Ci0KLS8vZm9yIHdlcCBrZXkgZXJyb3IgZGV0ZWN0aW9uLCB3ZSBuZWVkIHRvIGFjY2VwdCBicm9hZGNhc3QgcGFja2V0cyB0byBiZSByZWNlaXZlZCB0ZW1wb3JhcnkuCi12b2lkIGhhbF9zZXRfYWNjZXB0X3Byb21pc2N1b3VzKCBwaHdfZGF0YV90IHBId0RhdGEsICB1OCBlbmFibGUpCi17Ci0JUFdCMzVSRUcJcFdiMzVSZWcgPSAmcEh3RGF0YS0+V2IzNVJlZzsKLQotCWlmIChwSHdEYXRhLT5TdXJwcmlzZVJlbW92ZSkgcmV0dXJuOwotCWlmIChlbmFibGUpIHsKLQkJcFdiMzVSZWctPk0wMF9NYWNDb250cm9sIHw9IDB4MDA0MDAwMDA7Ci0JCVdiMzVSZWdfV3JpdGUoIHBId0RhdGEsIDB4MDgwMCwgcFdiMzVSZWctPk0wMF9NYWNDb250cm9sICk7Ci0JfSBlbHNlIHsKLQkJcFdiMzVSZWctPk0wMF9NYWNDb250cm9sJj1+MHgwMDQwMDAwMDsKLQkJV2IzNVJlZ19Xcml0ZSggcEh3RGF0YSwgMHgwODAwLCBwV2IzNVJlZy0+TTAwX01hY0NvbnRyb2wgKTsKLQl9Ci19Ci0KLXZvaWQgaGFsX3NldF9hY2NlcHRfbXVsdGljYXN0KCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgdTggZW5hYmxlICkKLXsKLQlQV0IzNVJFRwlwV2IzNVJlZyA9ICZwSHdEYXRhLT5XYjM1UmVnOwotCi0JaWYoIHBId0RhdGEtPlN1cnByaXNlUmVtb3ZlICkgcmV0dXJuOwotCi0JcFdiMzVSZWctPk0wMF9NYWNDb250cm9sICY9IH4weDAxMDAwMDAwOy8vVGhlIEhXIHZhbHVlCi0JaWYgKGVuYWJsZSkgIHBXYjM1UmVnLT5NMDBfTWFjQ29udHJvbCB8PSAweDAxMDAwMDAwOy8vVGhlIEhXIHZhbHVlCi0JV2IzNVJlZ19Xcml0ZSggcEh3RGF0YSwgMHgwODAwLCBwV2IzNVJlZy0+TTAwX01hY0NvbnRyb2wgKTsKLX0KLQotdm9pZCBoYWxfc2V0X2FjY2VwdF9iZWFjb24oICBwaHdfZGF0YV90IHBId0RhdGEsICB1OCBlbmFibGUgKQotewotCVBXQjM1UkVHCXBXYjM1UmVnID0gJnBId0RhdGEtPldiMzVSZWc7Ci0KLQlpZiggcEh3RGF0YS0+U3VycHJpc2VSZW1vdmUgKSByZXR1cm47Ci0KLQkvLyAyMDA0MDEwOCBkZWJ1ZwotCWlmKCAhZW5hYmxlICkvL0R1ZSB0byBTTUUgYW5kIE1MTUUgYXJlIG5vdCBzdWl0YWJsZSBmb3IgMzUKLQkJcmV0dXJuOwotCi0JcFdiMzVSZWctPk0wMF9NYWNDb250cm9sICY9IH4weDA0MDAwMDAwOy8vVGhlIEhXIHZhbHVlCi0JaWYoIGVuYWJsZSApCi0JCXBXYjM1UmVnLT5NMDBfTWFjQ29udHJvbCB8PSAweDA0MDAwMDAwOy8vVGhlIEhXIHZhbHVlCi0KLQlXYjM1UmVnX1dyaXRlKCBwSHdEYXRhLCAweDA4MDAsIHBXYjM1UmVnLT5NMDBfTWFjQ29udHJvbCApOwotfQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXZvaWQgaGFsX3NldF9tdWx0aWNhc3RfYWRkcmVzcyggcGh3X2RhdGFfdCBwSHdEYXRhLCB1OCAqYWRkcmVzcywgdTggbnVtYmVyICkKLXsKLQlQV0IzNVJFRwlwV2IzNVJlZyA9ICZwSHdEYXRhLT5XYjM1UmVnOwotCXU4CQlCeXRlLCBCaXQ7Ci0KLQlpZiggcEh3RGF0YS0+U3VycHJpc2VSZW1vdmUgKSByZXR1cm47Ci0KLQkvL0VyYXNlcyBhbmQgcmVmaWxscyB0aGUgY2FyZCBtdWx0aWNhc3QgcmVnaXN0ZXJzLiBVc2VkIHdoZW4gYW4gYWRkcmVzcwotCS8vICAgIGhhcyBiZWVuIGRlbGV0ZWQgYW5kIGFsbCBiaXRzIG11c3QgYmUgcmVjb21wdXRlZC4KLQlwV2IzNVJlZy0+TTA0X011bHRpY2FzdEFkZHJlc3MxID0gMDsKLQlwV2IzNVJlZy0+TTA4X011bHRpY2FzdEFkZHJlc3MyID0gMDsKLQotCXdoaWxlKCBudW1iZXIgKQotCXsKLQkJbnVtYmVyLS07Ci0JCUNhcmRHZXRNdWx0aWNhc3RCaXQoIChhZGRyZXNzKyhudW1iZXIqRVRIX0xFTkdUSF9PRl9BRERSRVNTKSksICZCeXRlLCAmQml0KTsKLQkJcFdiMzVSZWctPk11bHRpY2FzdFtCeXRlXSB8PSBCaXQ7Ci0JfQotCi0JLy8gVXBkYXRpbmcgcmVnaXN0ZXIKLQlXYjM1UmVnX0J1cnN0V3JpdGUoIHBId0RhdGEsIDB4MDgwNCwgKHUzMiAqKXBXYjM1UmVnLT5NdWx0aWNhc3QsIDIsIEFVVE9fSU5DUkVNRU5UICk7Ci19Ci0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotdTggaGFsX2dldF9hY2NlcHRfYmVhY29uKCAgcGh3X2RhdGFfdCBwSHdEYXRhICkKLXsKLQlQV0IzNVJFRyBwV2IzNVJlZyA9ICZwSHdEYXRhLT5XYjM1UmVnOwotCi0JaWYoIHBId0RhdGEtPlN1cnByaXNlUmVtb3ZlICkgcmV0dXJuIDA7Ci0KLQlpZiggcFdiMzVSZWctPk0wMF9NYWNDb250cm9sICYgMHgwNDAwMDAwMCApCi0JCXJldHVybiAxOwotCWVsc2UKLQkJcmV0dXJuIDA7Ci19Ci0KLXVuc2lnbmVkIGNoYXIgaGFsX3Jlc2V0X2hhcmR3YXJlKCBwaHdfZGF0YV90IHBId0RhdGEsIHZvaWQqIHBwYSApCi17Ci0JLy8gTm90IGltcGxlbWVudCB5ZXQKLQlyZXR1cm4gVFJVRTsKLX0KLQotdm9pZCBoYWxfc3RvcCggIHBod19kYXRhX3QgcEh3RGF0YSApCi17Ci0JUFdCMzVSRUcJcFdiMzVSZWcgPSAmcEh3RGF0YS0+V2IzNVJlZzsKLQotCXBId0RhdGEtPldiMzVSeC5yeF9oYWx0ID0gMTsKLQlXYjM1Unhfc3RvcCggcEh3RGF0YSApOwotCi0JcEh3RGF0YS0+V2IzNVR4LnR4X2hhbHQgPSAxOwotCVdiMzVUeF9zdG9wKCBwSHdEYXRhICk7Ci0KLQlwV2IzNVJlZy0+RDAwX0RtYUNvbnRyb2wgJj0gfjB4YzAwMDAwMDA7Ly9UeCBPZmYsIFJ4IE9mZgotCVdiMzVSZWdfV3JpdGUoIHBId0RhdGEsIDB4MDQwMCwgcFdiMzVSZWctPkQwMF9EbWFDb250cm9sICk7Ci0KLQlXYlVzYl9TdG9wKCBwSHdEYXRhICk7IC8vIDIwMDUxMjMwIEFkZC40Ci19Ci0KLXVuc2lnbmVkIGNoYXIgaGFsX2lkbGUocGh3X2RhdGFfdCBwSHdEYXRhKQotewotCVBXQjM1UkVHCXBXYjM1UmVnID0gJnBId0RhdGEtPldiMzVSZWc7Ci0JUFdCVVNCCXBXYlVzYiA9ICZwSHdEYXRhLT5XYlVzYjsKLQotCWlmKCAhcEh3RGF0YS0+U3VycHJpc2VSZW1vdmUgJiYgKCBwV2JVc2ItPkRldGVjdENvdW50IHx8IHBXYjM1UmVnLT5FUDB2bV9zdGF0ZSE9Vk1fU1RPUCApICkKLQkJcmV0dXJuIEZBTFNFOwotCi0JcmV0dXJuIFRSVUU7Ci19Ci0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotdm9pZCBoYWxfc2V0X2N3bWluKCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgdTgJY3dpbl9taW4gKQotewotCVBXQjM1UkVHCXBXYjM1UmVnID0gJnBId0RhdGEtPldiMzVSZWc7Ci0KLQlpZiggcEh3RGF0YS0+U3VycHJpc2VSZW1vdmUgKSByZXR1cm47Ci0KLQlwSHdEYXRhLT5jd21pbiA9IGN3aW5fbWluOwotCXBXYjM1UmVnLT5NMkNfTWFjQ29udHJvbCAmPSB+MHg3YzAwOwkvL2JpdCAxMCB+IDE0Ci0JcFdiMzVSZWctPk0yQ19NYWNDb250cm9sIHw9IChwSHdEYXRhLT5jd21pbjw8MTApOwotCVdiMzVSZWdfV3JpdGUoIHBId0RhdGEsIDB4MDgyYywgcFdiMzVSZWctPk0yQ19NYWNDb250cm9sICk7Ci19Ci0KLXMzMiBoYWxfZ2V0X3Jzc2koICBwaHdfZGF0YV90IHBId0RhdGEsICB1MzIgKkhhbFJzc2lBcnJ5LCAgdTggQ291bnQgKQotewotCVBXQjM1UkVHIHBXYjM1UmVnID0gJnBId0RhdGEtPldiMzVSZWc7Ci0JUjAxX0RFU0NSSVBUT1IJcjAxOwotCXMzMiBsdG1wID0gMCwgdG1wOwotCXU4CWk7Ci0KLQlpZiggcEh3RGF0YS0+U3VycHJpc2VSZW1vdmUgKSByZXR1cm4gLTIwMDsKLQlpZiggQ291bnQgPiBNQVhfQUNDX1JTU0lfQ09VTlQgKSAvLyBCZWNhdXNlIHRoZSBUUyBtYXkgdXNlIHRoaXMgZnVudGlvbgotCQlDb3VudCA9IE1BWF9BQ0NfUlNTSV9DT1VOVDsKLQotCS8vIFJTU0kgPSBDMSArIEMyICogKGFnY19zdGF0ZVs3OjBdICsgb2Zmc2V0X21hcChsbmFfc3RhdGVbMTowXSkpCi0JLy8gQzEgPSAtMTk1LCBDMiA9IDAuNjYgPSA4NS8xMjgKLQlmb3IgKGk9MDsgaTxDb3VudDsgaSsrKQotCXsKLQkJcjAxLnZhbHVlID0gSGFsUnNzaUFycnlbaV07Ci0JCXRtcCA9ICgoKCByMDEuUjAxX0FHQ19zdGF0ZSArIHBXYjM1UmVnLT5MTkFWYWx1ZVtyMDEuUjAxX0xOQV9zdGF0ZV0pICogODUgKSA+PjcgKSAtIDE5NTsKLQkJbHRtcCArPSB0bXA7Ci0JfQotCWx0bXAgLz0gQ291bnQ7Ci0JaWYoIHBId0RhdGEtPnBoeV90eXBlID09IFJGX0FJUk9IQV8yMjMwICkgbHRtcCAtPSA1OyAvLyAxMDsKLQlpZiggcEh3RGF0YS0+cGh5X3R5cGUgPT0gUkZfQUlST0hBXzIyMzBTICkgbHRtcCAtPSA1OyAvLyAxMDsgMjAwNjA0MjAgQWRkIHRoaXMKLQotCS8vaWYoIGx0bXAgPCAtMjAwICkgbHRtcCA9IC0yMDA7Ci0JaWYoIGx0bXAgPCAtMTEwICkgbHRtcCA9IC0xMTA7Ly8gMS4wLjI0LjAgRm9yIE5KUkMKLQotCXJldHVybiBsdG1wOwotfQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1zMzIgaGFsX2dldF9yc3NpX2JzcyggIHBod19kYXRhX3QgcEh3RGF0YSwgIHUxNiBpZHgsICB1OCBDb3VudCApCi17Ci0JUFdCMzVSRUcgcFdiMzVSZWcgPSAmcEh3RGF0YS0+V2IzNVJlZzsKLQlSMDFfREVTQ1JJUFRPUglyMDE7Ci0JczMyIGx0bXAgPSAwLCB0bXA7Ci0JdTgJaSwgajsKLQlQQURBUFRFUglBZGFwdGVyID0gcEh3RGF0YS0+QWRhcHRlcjsKLS8vCXUzMiAqSGFsUnNzaUFycnkgPSBwc0JTUyhpZHgpLT5IYWxSc3NpOwotCi0JaWYoIHBId0RhdGEtPlN1cnByaXNlUmVtb3ZlICkgcmV0dXJuIC0yMDA7Ci0JaWYoIENvdW50ID4gTUFYX0FDQ19SU1NJX0NPVU5UICkgLy8gQmVjYXVzZSB0aGUgVFMgbWF5IHVzZSB0aGlzIGZ1bnRpb24KLQkJQ291bnQgPSBNQVhfQUNDX1JTU0lfQ09VTlQ7Ci0KLQkvLyBSU1NJID0gQzEgKyBDMiAqIChhZ2Nfc3RhdGVbNzowXSArIG9mZnNldF9tYXAobG5hX3N0YXRlWzE6MF0pKQotCS8vIEMxID0gLTE5NSwgQzIgPSAwLjY2ID0gODUvMTI4Ci0jaWYgMAotCWZvciAoaT0wOyBpPENvdW50OyBpKyspCi0JewotCQlyMDEudmFsdWUgPSBIYWxSc3NpQXJyeVtpXTsKLQkJdG1wID0gKCgoIHIwMS5SMDFfQUdDX3N0YXRlICsgcFdiMzVSZWctPkxOQVZhbHVlW3IwMS5SMDFfTE5BX3N0YXRlXSkgKiA4NSApID4+NyApIC0gMTk1OwotCQlsdG1wICs9IHRtcDsKLQl9Ci0jZWxzZQotCWlmIChwc0JTUyhpZHgpLT5IYWxSc3NpSW5kZXggPT0gMCkKLQkJcHNCU1MoaWR4KS0+SGFsUnNzaUluZGV4ID0gTUFYX0FDQ19SU1NJX0NPVU5UOwotCWogPSAodTgpcHNCU1MoaWR4KS0+SGFsUnNzaUluZGV4LTE7Ci0KLQlmb3IgKGk9MDsgaTxDb3VudDsgaSsrKQotCXsKLQkJcjAxLnZhbHVlID0gcHNCU1MoaWR4KS0+SGFsUnNzaVtqXTsKLQkJdG1wID0gKCgoIHIwMS5SMDFfQUdDX3N0YXRlICsgcFdiMzVSZWctPkxOQVZhbHVlW3IwMS5SMDFfTE5BX3N0YXRlXSkgKiA4NSApID4+NyApIC0gMTk1OwotCQlsdG1wICs9IHRtcDsKLQkJaWYgKGogPT0gMCkKLQkJewotCQkJaiA9IE1BWF9BQ0NfUlNTSV9DT1VOVDsKLQkJfQotCQlqLS07Ci0JfQotI2VuZGlmCi0JbHRtcCAvPSBDb3VudDsKLQlpZiggcEh3RGF0YS0+cGh5X3R5cGUgPT0gUkZfQUlST0hBXzIyMzAgKSBsdG1wIC09IDU7IC8vIDEwOwotCWlmKCBwSHdEYXRhLT5waHlfdHlwZSA9PSBSRl9BSVJPSEFfMjIzMFMgKSBsdG1wIC09IDU7IC8vIDEwOyAyMDA2MDQyMCBBZGQgdGhpcwotCi0JLy9pZiggbHRtcCA8IC0yMDAgKSBsdG1wID0gLTIwMDsKLQlpZiggbHRtcCA8IC0xMTAgKSBsdG1wID0gLTExMDsvLyAxLjAuMjQuMCBGb3IgTkpSQwotCi0JcmV0dXJuIGx0bXA7Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi12b2lkIGhhbF9sZWRfY29udHJvbF8xYSggIHBod19kYXRhX3QgcEh3RGF0YSApCi17Ci0JaGFsX2xlZF9jb250cm9sKCBOVUxMLCBwSHdEYXRhLCBOVUxMLCBOVUxMICk7Ci19Ci0KLXZvaWQgaGFsX2xlZF9jb250cm9sKCAgdm9pZCogUzEsICBwaHdfZGF0YV90IHBId0RhdGEsICB2b2lkKiBTMywgIHZvaWQqIFM0ICkKLXsKLQlQQURBUFRFUglBZGFwdGVyID0gcEh3RGF0YS0+QWRhcHRlcjsKLQlQV0IzNVJFRwlwV2IzNVJlZyA9ICZwSHdEYXRhLT5XYjM1UmVnOworCXN0cnVjdCB3YnNvZnRfcHJpdiAqYWRhcHRlciA9IChzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKikgZGF0YTsKKwlwaHdfZGF0YV90IHBId0RhdGEgPSAmYWRhcHRlci0+c0h3RGF0YTsKKwlzdHJ1Y3Qgd2IzNV9yZWcgKnJlZyA9ICZwSHdEYXRhLT5yZWc7CiAJdTMyCUxFRFNldCA9IChwSHdEYXRhLT5Tb2Z0d2FyZVNldCAmIEhBTF9MRURfU0VUX01BU0spID4+IEhBTF9MRURfU0VUX1NISUZUOwogCXU4CUxFRGdyYXlbMjBdID0geyAwLDMsNCw2LDgsMTAsMTEsMTIsMTMsMTQsMTUsMTQsMTMsMTIsMTEsMTAsOCw2LDQsMiB9OwogCXU4CUxFRGdyYXkyWzMwXSA9IHsgNyw4LDksMTAsMTEsMTIsMTMsMTQsMTUsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxNSwxNCwxMywxMiwxMSwxMCw5LDggfTsKQEAgLTQ4NywyMSArNzAsMjEgQEAKIAkJCX0KIAkJCXBId0RhdGEtPkxFRF9CbGlua2luZysrOwogCi0JCQlwV2IzNVJlZy0+VTFCQ19MRURDb25maWd1cmUgPSBsdG1wOworCQkJcmVnLT5VMUJDX0xFRENvbmZpZ3VyZSA9IGx0bXA7CiAJCQlpZiggTEVEU2V0ICE9IDcgKSAvLyBPbmx5IDExMSBtb2RlIGhhcyAyIExFRHMgb24gUENCLgogCQkJewotCQkJCXBXYjM1UmVnLT5VMUJDX0xFRENvbmZpZ3VyZSB8PSAobHRtcCAmMHhmZik8PDg7IC8vIENvcHkgTEVEIHJlc3VsdCB0byBlYWNoIExFRCBjb250cm9sIHJlZ2lzdGVyCi0JCQkJcFdiMzVSZWctPlUxQkNfTEVEQ29uZmlndXJlIHw9IChsdG1wICYweGZmMDApPj44OworCQkJCXJlZy0+VTFCQ19MRURDb25maWd1cmUgfD0gKGx0bXAgJjB4ZmYpPDw4OyAvLyBDb3B5IExFRCByZXN1bHQgdG8gZWFjaCBMRUQgY29udHJvbCByZWdpc3RlcgorCQkJCXJlZy0+VTFCQ19MRURDb25maWd1cmUgfD0gKGx0bXAgJjB4ZmYwMCk+Pjg7CiAJCQl9Ci0JCQlXYjM1UmVnX1dyaXRlKCBwSHdEYXRhLCAweDAzYmMsIHBXYjM1UmVnLT5VMUJDX0xFRENvbmZpZ3VyZSApOworCQkJV2IzNVJlZ19Xcml0ZSggcEh3RGF0YSwgMHgwM2JjLCByZWctPlUxQkNfTEVEQ29uZmlndXJlICk7CiAJCX0KIAl9CiAJZWxzZSBpZiggcEh3RGF0YS0+Q3VycmVudFJhZGlvU3cgfHwgcEh3RGF0YS0+Q3VycmVudFJhZGlvSHcgKSAvLyBJZiByYWRpbyBvZmYKIAl7Ci0JCWlmKCBwV2IzNVJlZy0+VTFCQ19MRURDb25maWd1cmUgJiAweDEwMTAgKQorCQlpZiggcmVnLT5VMUJDX0xFRENvbmZpZ3VyZSAmIDB4MTAxMCApCiAJCXsKLQkJCXBXYjM1UmVnLT5VMUJDX0xFRENvbmZpZ3VyZSAmPSB+MHgxMDEwOwotCQkJV2IzNVJlZ19Xcml0ZSggcEh3RGF0YSwgMHgwM2JjLCBwV2IzNVJlZy0+VTFCQ19MRURDb25maWd1cmUgKTsKKwkJCXJlZy0+VTFCQ19MRURDb25maWd1cmUgJj0gfjB4MTAxMDsKKwkJCVdiMzVSZWdfV3JpdGUoIHBId0RhdGEsIDB4MDNiYywgcmVnLT5VMUJDX0xFRENvbmZpZ3VyZSApOwogCQl9CiAJfQogCWVsc2UKQEAgLTUxNiwxNSArOTksMTUgQEAKIAkJCQkJewogCQkJCQkJaWYoIHBId0RhdGEtPkxFRF9CbGlua2luZyA9PSAwICkKIAkJCQkJCXsKLQkJCQkJCQlwV2IzNVJlZy0+VTFCQ19MRURDb25maWd1cmUgfD0gMHgxMDsKLQkJCQkJCQlXYjM1UmVnX1dyaXRlKCBwSHdEYXRhLCAweDAzYmMsIHBXYjM1UmVnLT5VMUJDX0xFRENvbmZpZ3VyZSApOyAvLyBMRURfMCBPbgorCQkJCQkJCXJlZy0+VTFCQ19MRURDb25maWd1cmUgfD0gMHgxMDsKKwkJCQkJCQlXYjM1UmVnX1dyaXRlKCBwSHdEYXRhLCAweDAzYmMsIHJlZy0+VTFCQ19MRURDb25maWd1cmUgKTsgLy8gTEVEXzAgT24KIAkJCQkJCQlwSHdEYXRhLT5MRURfQmxpbmtpbmcgPSAxOwogCQkJCQkJCVRpbWVJbnRlcnZhbCA9IDMwMDsKIAkJCQkJCX0KIAkJCQkJCWVsc2UKIAkJCQkJCXsKLQkJCQkJCQlwV2IzNVJlZy0+VTFCQ19MRURDb25maWd1cmUgJj0gfjB4MTA7Ci0JCQkJCQkJV2IzNVJlZ19Xcml0ZSggcEh3RGF0YSwgMHgwM2JjLCBwV2IzNVJlZy0+VTFCQ19MRURDb25maWd1cmUgKTsgLy8gTEVEXzAgT2ZmCisJCQkJCQkJcmVnLT5VMUJDX0xFRENvbmZpZ3VyZSAmPSB+MHgxMDsKKwkJCQkJCQlXYjM1UmVnX1dyaXRlKCBwSHdEYXRhLCAweDAzYmMsIHJlZy0+VTFCQ19MRURDb25maWd1cmUgKTsgLy8gTEVEXzAgT2ZmCiAJCQkJCQkJcEh3RGF0YS0+TEVEX0JsaW5raW5nID0gMDsKIAkJCQkJCQlUaW1lSW50ZXJ2YWwgPSAzMDA7CiAJCQkJCQl9CkBAIC01MzIsMjAgKzExNSwyMCBAQAogCQkJCQllbHNlCiAJCQkJCXsKIAkJCQkJCS8vVHVybiBPZmYgTEVEXzAKLQkJCQkJCWlmKCBwV2IzNVJlZy0+VTFCQ19MRURDb25maWd1cmUgJiAweDEwICkKKwkJCQkJCWlmKCByZWctPlUxQkNfTEVEQ29uZmlndXJlICYgMHgxMCApCiAJCQkJCQl7Ci0JCQkJCQkJcFdiMzVSZWctPlUxQkNfTEVEQ29uZmlndXJlICY9IH4weDEwOwotCQkJCQkJCVdiMzVSZWdfV3JpdGUoIHBId0RhdGEsIDB4MDNiYywgcFdiMzVSZWctPlUxQkNfTEVEQ29uZmlndXJlICk7IC8vIExFRF8wIE9mZgorCQkJCQkJCXJlZy0+VTFCQ19MRURDb25maWd1cmUgJj0gfjB4MTA7CisJCQkJCQkJV2IzNVJlZ19Xcml0ZSggcEh3RGF0YSwgMHgwM2JjLCByZWctPlUxQkNfTEVEQ29uZmlndXJlICk7IC8vIExFRF8wIE9mZgogCQkJCQkJfQogCQkJCQl9CiAJCQkJfQogCQkJCWVsc2UKIAkJCQl7CiAJCQkJCS8vIFR1cm4gT24gTEVEXzAKLQkJCQkJaWYoIChwV2IzNVJlZy0+VTFCQ19MRURDb25maWd1cmUgJiAweDEwKSA9PSAwICkKKwkJCQkJaWYoIChyZWctPlUxQkNfTEVEQ29uZmlndXJlICYgMHgxMCkgPT0gMCApCiAJCQkJCXsKLQkJCQkJCXBXYjM1UmVnLT5VMUJDX0xFRENvbmZpZ3VyZSB8PSAweDEwOwotCQkJCQkJV2IzNVJlZ19Xcml0ZSggcEh3RGF0YSwgMHgwM2JjLCBwV2IzNVJlZy0+VTFCQ19MRURDb25maWd1cmUgKTsgLy8gTEVEXzAgT2ZmCisJCQkJCQlyZWctPlUxQkNfTEVEQ29uZmlndXJlIHw9IDB4MTA7CisJCQkJCQlXYjM1UmVnX1dyaXRlKCBwSHdEYXRhLCAweDAzYmMsIHJlZy0+VTFCQ19MRURDb25maWd1cmUgKTsgLy8gTEVEXzAgT2ZmCiAJCQkJCX0KIAkJCQl9CiAJCQkJYnJlYWs7CkBAIC01NTgsMTYgKzE0MSwxNiBAQAogCQkJCQl7CiAJCQkJCQlpZiggcEh3RGF0YS0+TEVEX0JsaW5raW5nID09IDAgKQogCQkJCQkJewotCQkJCQkJCXBXYjM1UmVnLT5VMUJDX0xFRENvbmZpZ3VyZSAmPSB+MHhmOwotCQkJCQkJCXBXYjM1UmVnLT5VMUJDX0xFRENvbmZpZ3VyZSB8PSAweDEwOwotCQkJCQkJCVdiMzVSZWdfV3JpdGUoIHBId0RhdGEsIDB4MDNiYywgcFdiMzVSZWctPlUxQkNfTEVEQ29uZmlndXJlICk7IC8vIExFRF8wIE9uCisJCQkJCQkJcmVnLT5VMUJDX0xFRENvbmZpZ3VyZSAmPSB+MHhmOworCQkJCQkJCXJlZy0+VTFCQ19MRURDb25maWd1cmUgfD0gMHgxMDsKKwkJCQkJCQlXYjM1UmVnX1dyaXRlKCBwSHdEYXRhLCAweDAzYmMsIHJlZy0+VTFCQ19MRURDb25maWd1cmUgKTsgLy8gTEVEXzAgT24KIAkJCQkJCQlwSHdEYXRhLT5MRURfQmxpbmtpbmcgPSAxOwogCQkJCQkJCVRpbWVJbnRlcnZhbCA9IDMwMDsKIAkJCQkJCX0KIAkJCQkJCWVsc2UKIAkJCQkJCXsKLQkJCQkJCQlwV2IzNVJlZy0+VTFCQ19MRURDb25maWd1cmUgJj0gfjB4MWY7Ci0JCQkJCQkJV2IzNVJlZ19Xcml0ZSggcEh3RGF0YSwgMHgwM2JjLCBwV2IzNVJlZy0+VTFCQ19MRURDb25maWd1cmUgKTsgLy8gTEVEXzAgT2ZmCisJCQkJCQkJcmVnLT5VMUJDX0xFRENvbmZpZ3VyZSAmPSB+MHgxZjsKKwkJCQkJCQlXYjM1UmVnX1dyaXRlKCBwSHdEYXRhLCAweDAzYmMsIHJlZy0+VTFCQ19MRURDb25maWd1cmUgKTsgLy8gTEVEXzAgT2ZmCiAJCQkJCQkJcEh3RGF0YS0+TEVEX0JsaW5raW5nID0gMDsKIAkJCQkJCQlUaW1lSW50ZXJ2YWwgPSAzMDA7CiAJCQkJCQl9CkBAIC01NzUsMjYgKzE1OCwyNiBAQAogCQkJCQllbHNlCiAJCQkJCXsKIAkJCQkJCS8vIDIwMDYwOTAxIEdyYXkgYmxpbmtpbmcgaWYgaW4gZGlzY29ubmVjdCBzdGF0ZSBhbmQgbm90IHNjYW5uaW5nCi0JCQkJCQlsdG1wID0gcFdiMzVSZWctPlUxQkNfTEVEQ29uZmlndXJlOwotCQkJCQkJcFdiMzVSZWctPlUxQkNfTEVEQ29uZmlndXJlICY9IH4weDFmOworCQkJCQkJbHRtcCA9IHJlZy0+VTFCQ19MRURDb25maWd1cmU7CisJCQkJCQlyZWctPlUxQkNfTEVEQ29uZmlndXJlICY9IH4weDFmOwogCQkJCQkJaWYoIExFRGdyYXkyWyhwSHdEYXRhLT5MRURfQmxpbmtpbmclMzApXSApCiAJCQkJCQl7Ci0JCQkJCQkJcFdiMzVSZWctPlUxQkNfTEVEQ29uZmlndXJlIHw9IDB4MTA7Ci0JCQkJCQkJcFdiMzVSZWctPlUxQkNfTEVEQ29uZmlndXJlIHw9IExFRGdyYXkyWyAocEh3RGF0YS0+TEVEX0JsaW5raW5nJTMwKSBdOworCQkJCQkJCXJlZy0+VTFCQ19MRURDb25maWd1cmUgfD0gMHgxMDsKKwkJCQkJCQlyZWctPlUxQkNfTEVEQ29uZmlndXJlIHw9IExFRGdyYXkyWyAocEh3RGF0YS0+TEVEX0JsaW5raW5nJTMwKSBdOwogCQkJCQkJfQogCQkJCQkJcEh3RGF0YS0+TEVEX0JsaW5raW5nKys7Ci0JCQkJCQlpZiggcFdiMzVSZWctPlUxQkNfTEVEQ29uZmlndXJlICE9IGx0bXAgKQotCQkJCQkJCVdiMzVSZWdfV3JpdGUoIHBId0RhdGEsIDB4MDNiYywgcFdiMzVSZWctPlUxQkNfTEVEQ29uZmlndXJlICk7IC8vIExFRF8wIE9mZgorCQkJCQkJaWYoIHJlZy0+VTFCQ19MRURDb25maWd1cmUgIT0gbHRtcCApCisJCQkJCQkJV2IzNVJlZ19Xcml0ZSggcEh3RGF0YSwgMHgwM2JjLCByZWctPlUxQkNfTEVEQ29uZmlndXJlICk7IC8vIExFRF8wIE9mZgogCQkJCQkJVGltZUludGVydmFsID0gMTAwOwogCQkJCQl9CiAJCQkJfQogCQkJCWVsc2UKIAkJCQl7CiAJCQkJCS8vIFR1cm4gT24gTEVEXzAKLQkJCQkJaWYoIChwV2IzNVJlZy0+VTFCQ19MRURDb25maWd1cmUgJiAweDEwKSA9PSAwICkKKwkJCQkJaWYoIChyZWctPlUxQkNfTEVEQ29uZmlndXJlICYgMHgxMCkgPT0gMCApCiAJCQkJCXsKLQkJCQkJCXBXYjM1UmVnLT5VMUJDX0xFRENvbmZpZ3VyZSB8PSAweDEwOwotCQkJCQkJV2IzNVJlZ19Xcml0ZSggcEh3RGF0YSwgMHgwM2JjLCBwV2IzNVJlZy0+VTFCQ19MRURDb25maWd1cmUgKTsgLy8gTEVEXzAgT2ZmCisJCQkJCQlyZWctPlUxQkNfTEVEQ29uZmlndXJlIHw9IDB4MTA7CisJCQkJCQlXYjM1UmVnX1dyaXRlKCBwSHdEYXRhLCAweDAzYmMsIHJlZy0+VTFCQ19MRURDb25maWd1cmUgKTsgLy8gTEVEXzAgT2ZmCiAJCQkJCX0KIAkJCQl9CiAJCQkJYnJlYWs7CkBAIC02MDcsMTUgKzE5MCwxNSBAQAogCQkJCQl7CiAJCQkJCQlpZiggcEh3RGF0YS0+TEVEX0JsaW5raW5nID09IDAgKQogCQkJCQkJewotCQkJCQkJCXBXYjM1UmVnLT5VMUJDX0xFRENvbmZpZ3VyZSB8PSAweDEwMDA7Ci0JCQkJCQkJV2IzNVJlZ19Xcml0ZSggcEh3RGF0YSwgMHgwM2JjLCBwV2IzNVJlZy0+VTFCQ19MRURDb25maWd1cmUgKTsgLy8gTEVEXzEgT24KKwkJCQkJCQlyZWctPlUxQkNfTEVEQ29uZmlndXJlIHw9IDB4MTAwMDsKKwkJCQkJCQlXYjM1UmVnX1dyaXRlKCBwSHdEYXRhLCAweDAzYmMsIHJlZy0+VTFCQ19MRURDb25maWd1cmUgKTsgLy8gTEVEXzEgT24KIAkJCQkJCQlwSHdEYXRhLT5MRURfQmxpbmtpbmcgPSAxOwogCQkJCQkJCVRpbWVJbnRlcnZhbCA9IDMwMDsKIAkJCQkJCX0KIAkJCQkJCWVsc2UKIAkJCQkJCXsKLQkJCQkJCQlwV2IzNVJlZy0+VTFCQ19MRURDb25maWd1cmUgJj0gfjB4MTAwMDsKLQkJCQkJCQlXYjM1UmVnX1dyaXRlKCBwSHdEYXRhLCAweDAzYmMsIHBXYjM1UmVnLT5VMUJDX0xFRENvbmZpZ3VyZSApOyAvLyBMRURfMSBPZmYKKwkJCQkJCQlyZWctPlUxQkNfTEVEQ29uZmlndXJlICY9IH4weDEwMDA7CisJCQkJCQkJV2IzNVJlZ19Xcml0ZSggcEh3RGF0YSwgMHgwM2JjLCByZWctPlUxQkNfTEVEQ29uZmlndXJlICk7IC8vIExFRF8xIE9mZgogCQkJCQkJCXBId0RhdGEtPkxFRF9CbGlua2luZyA9IDA7CiAJCQkJCQkJVGltZUludGVydmFsID0gMzAwOwogCQkJCQkJfQpAQCAtNjIzLDU3ICsyMDYsNTcgQEAKIAkJCQkJZWxzZQogCQkJCQl7CiAJCQkJCQkvL1R1cm4gT2ZmIExFRF8xCi0JCQkJCQlpZiggcFdiMzVSZWctPlUxQkNfTEVEQ29uZmlndXJlICYgMHgxMDAwICkKKwkJCQkJCWlmKCByZWctPlUxQkNfTEVEQ29uZmlndXJlICYgMHgxMDAwICkKIAkJCQkJCXsKLQkJCQkJCQlwV2IzNVJlZy0+VTFCQ19MRURDb25maWd1cmUgJj0gfjB4MTAwMDsKLQkJCQkJCQlXYjM1UmVnX1dyaXRlKCBwSHdEYXRhLCAweDAzYmMsIHBXYjM1UmVnLT5VMUJDX0xFRENvbmZpZ3VyZSApOyAvLyBMRURfMSBPZmYKKwkJCQkJCQlyZWctPlUxQkNfTEVEQ29uZmlndXJlICY9IH4weDEwMDA7CisJCQkJCQkJV2IzNVJlZ19Xcml0ZSggcEh3RGF0YSwgMHgwM2JjLCByZWctPlUxQkNfTEVEQ29uZmlndXJlICk7IC8vIExFRF8xIE9mZgogCQkJCQkJfQogCQkJCQl9CiAJCQkJfQogCQkJCWVsc2UKIAkJCQl7CiAJCQkJCS8vIElzIHRyYW5zbWl0dGluZy9yZWNlaXZpbmcgPz8KLQkJCQkJaWYoIChPU19DVVJSRU5UX1JYX0JZVEUoIEFkYXB0ZXIgKSAhPSBwSHdEYXRhLT5SeEJ5dGVDb3VudExhc3QgKSB8fAotCQkJCQkJKE9TX0NVUlJFTlRfVFhfQllURSggQWRhcHRlciApICE9IHBId0RhdGEtPlR4Qnl0ZUNvdW50TGFzdCApICkKKwkJCQkJaWYoIChhZGFwdGVyLT5SeEJ5dGVDb3VudCAhPSBwSHdEYXRhLT5SeEJ5dGVDb3VudExhc3QgKSB8fAorCQkJCQkJKGFkYXB0ZXItPlR4Qnl0ZUNvdW50ICE9IHBId0RhdGEtPlR4Qnl0ZUNvdW50TGFzdCApICkKIAkJCQkJewotCQkJCQkJaWYoIChwV2IzNVJlZy0+VTFCQ19MRURDb25maWd1cmUgJiAweDMwMDApICE9IDB4MzAwMCApCisJCQkJCQlpZiggKHJlZy0+VTFCQ19MRURDb25maWd1cmUgJiAweDMwMDApICE9IDB4MzAwMCApCiAJCQkJCQl7Ci0JCQkJCQkJcFdiMzVSZWctPlUxQkNfTEVEQ29uZmlndXJlIHw9IDB4MzAwMDsKLQkJCQkJCQlXYjM1UmVnX1dyaXRlKCBwSHdEYXRhLCAweDAzYmMsIHBXYjM1UmVnLT5VMUJDX0xFRENvbmZpZ3VyZSApOyAvLyBMRURfMSBPbgorCQkJCQkJCXJlZy0+VTFCQ19MRURDb25maWd1cmUgfD0gMHgzMDAwOworCQkJCQkJCVdiMzVSZWdfV3JpdGUoIHBId0RhdGEsIDB4MDNiYywgcmVnLT5VMUJDX0xFRENvbmZpZ3VyZSApOyAvLyBMRURfMSBPbgogCQkJCQkJfQogCiAJCQkJCQkvLyBVcGRhdGUgdmFyaWFibGUKLQkJCQkJCXBId0RhdGEtPlJ4Qnl0ZUNvdW50TGFzdCA9IE9TX0NVUlJFTlRfUlhfQllURSggQWRhcHRlciApOwotCQkJCQkJcEh3RGF0YS0+VHhCeXRlQ291bnRMYXN0ID0gT1NfQ1VSUkVOVF9UWF9CWVRFKCBBZGFwdGVyICk7CisJCQkJCQlwSHdEYXRhLT5SeEJ5dGVDb3VudExhc3QgPSBhZGFwdGVyLT5SeEJ5dGVDb3VudDsKKwkJCQkJCXBId0RhdGEtPlR4Qnl0ZUNvdW50TGFzdCA9IGFkYXB0ZXItPlR4Qnl0ZUNvdW50OwogCQkJCQkJVGltZUludGVydmFsID0gMjAwOwogCQkJCQl9CiAJCQkJCWVsc2UKIAkJCQkJewogCQkJCQkJLy8gVHVybiBPbiBMRURfMSBhbmQgYmxpbmtpbmcgaWYgdHJhbnNtaXR0aW5nL3JlY2VpdmluZwotCQkJCQkJIGlmKCAocFdiMzVSZWctPlUxQkNfTEVEQ29uZmlndXJlICYgMHgzMDAwKSAhPSAweDEwMDAgKQorCQkJCQkJIGlmKCAocmVnLT5VMUJDX0xFRENvbmZpZ3VyZSAmIDB4MzAwMCkgIT0gMHgxMDAwICkKIAkJCQkJCSB7Ci0JCQkJCQkJIHBXYjM1UmVnLT5VMUJDX0xFRENvbmZpZ3VyZSAmPSB+MHgzMDAwOwotCQkJCQkJCSBwV2IzNVJlZy0+VTFCQ19MRURDb25maWd1cmUgfD0gMHgxMDAwOwotCQkJCQkJCSBXYjM1UmVnX1dyaXRlKCBwSHdEYXRhLCAweDAzYmMsIHBXYjM1UmVnLT5VMUJDX0xFRENvbmZpZ3VyZSApOyAvLyBMRURfMSBPbgorCQkJCQkJCSByZWctPlUxQkNfTEVEQ29uZmlndXJlICY9IH4weDMwMDA7CisJCQkJCQkJIHJlZy0+VTFCQ19MRURDb25maWd1cmUgfD0gMHgxMDAwOworCQkJCQkJCSBXYjM1UmVnX1dyaXRlKCBwSHdEYXRhLCAweDAzYmMsIHJlZy0+VTFCQ19MRURDb25maWd1cmUgKTsgLy8gTEVEXzEgT24KIAkJCQkJCSB9CiAJCQkJCX0KIAkJCQl9CiAJCQkJYnJlYWs7CiAKIAkJCWRlZmF1bHQ6IC8vIERlZmF1bHQgc2V0dGluZy4gMiBMRUQgYmUgcGxhY2VkIG9uIFBDQi4gTEVEXzA6IExpbmsgT24gTEVEXzEgQWN0aXZlCi0JCQkJaWYoIChwV2IzNVJlZy0+VTFCQ19MRURDb25maWd1cmUgJiAweDMwMDApICE9IDB4MzAwMCApCisJCQkJaWYoIChyZWctPlUxQkNfTEVEQ29uZmlndXJlICYgMHgzMDAwKSAhPSAweDMwMDAgKQogCQkJCXsKLQkJCQkJcFdiMzVSZWctPlUxQkNfTEVEQ29uZmlndXJlIHw9IDB4MzAwMDsvLyBMRURfMSBpcyBhbHdheXMgb24gYW5kIGV2ZW50IGVuYWJsZQotCQkJCQlXYjM1UmVnX1dyaXRlKCBwSHdEYXRhLCAweDAzYmMsIHBXYjM1UmVnLT5VMUJDX0xFRENvbmZpZ3VyZSApOworCQkJCQlyZWctPlUxQkNfTEVEQ29uZmlndXJlIHw9IDB4MzAwMDsvLyBMRURfMSBpcyBhbHdheXMgb24gYW5kIGV2ZW50IGVuYWJsZQorCQkJCQlXYjM1UmVnX1dyaXRlKCBwSHdEYXRhLCAweDAzYmMsIHJlZy0+VTFCQ19MRURDb25maWd1cmUgKTsKIAkJCQl9CiAKIAkJCQlpZiggcEh3RGF0YS0+TEVEX0JsaW5raW5nICkKIAkJCQl7CiAJCQkJCS8vIEdyYXkgYmxpbmtpbmcKLQkJCQkJcFdiMzVSZWctPlUxQkNfTEVEQ29uZmlndXJlICY9IH4weDBmOwotCQkJCQlwV2IzNVJlZy0+VTFCQ19MRURDb25maWd1cmUgfD0gMHgxMDsKLQkJCQkJcFdiMzVSZWctPlUxQkNfTEVEQ29uZmlndXJlIHw9IExFRGdyYXlbIChwSHdEYXRhLT5MRURfQmxpbmtpbmctMSklMjAgXTsKLQkJCQkJV2IzNVJlZ19Xcml0ZSggcEh3RGF0YSwgMHgwM2JjLCBwV2IzNVJlZy0+VTFCQ19MRURDb25maWd1cmUgKTsKKwkJCQkJcmVnLT5VMUJDX0xFRENvbmZpZ3VyZSAmPSB+MHgwZjsKKwkJCQkJcmVnLT5VMUJDX0xFRENvbmZpZ3VyZSB8PSAweDEwOworCQkJCQlyZWctPlUxQkNfTEVEQ29uZmlndXJlIHw9IExFRGdyYXlbIChwSHdEYXRhLT5MRURfQmxpbmtpbmctMSklMjAgXTsKKwkJCQkJV2IzNVJlZ19Xcml0ZSggcEh3RGF0YSwgMHgwM2JjLCByZWctPlUxQkNfTEVEQ29uZmlndXJlICk7CiAKIAkJCQkJcEh3RGF0YS0+TEVEX0JsaW5raW5nICs9IDI7CiAJCQkJCWlmKCBwSHdEYXRhLT5MRURfQmxpbmtpbmcgPCA0MCApCkBAIC02ODEsMjggKzI2NCwyOCBAQAogCQkJCQllbHNlCiAJCQkJCXsKIAkJCQkJCXBId0RhdGEtPkxFRF9CbGlua2luZyA9IDA7IC8vIFN0b3AgYmxpbmtpbmcKLQkJCQkJCXBXYjM1UmVnLT5VMUJDX0xFRENvbmZpZ3VyZSAmPSB+MHgwZjsKLQkJCQkJCVdiMzVSZWdfV3JpdGUoIHBId0RhdGEsIDB4MDNiYywgcFdiMzVSZWctPlUxQkNfTEVEQ29uZmlndXJlICk7CisJCQkJCQlyZWctPlUxQkNfTEVEQ29uZmlndXJlICY9IH4weDBmOworCQkJCQkJV2IzNVJlZ19Xcml0ZSggcEh3RGF0YSwgMHgwM2JjLCByZWctPlUxQkNfTEVEQ29uZmlndXJlICk7CiAJCQkJCX0KIAkJCQkJYnJlYWs7CiAJCQkJfQogCiAJCQkJaWYoIHBId0RhdGEtPkxFRF9MaW5rT24gKQogCQkJCXsKLQkJCQkJaWYoICEocFdiMzVSZWctPlUxQkNfTEVEQ29uZmlndXJlICYgMHgxMCkgKSAvLyBDaGVjayB0aGUgTEVEXzAKKwkJCQkJaWYoICEocmVnLT5VMUJDX0xFRENvbmZpZ3VyZSAmIDB4MTApICkgLy8gQ2hlY2sgdGhlIExFRF8wCiAJCQkJCXsKIAkJCQkJCS8vVHJ5IHRvIHR1cm4gT04gTEVEXzAgYWZ0ZXIgZ3JheSBibGlua2luZwotCQkJCQkJcFdiMzVSZWctPlUxQkNfTEVEQ29uZmlndXJlIHw9IDB4MTA7CisJCQkJCQlyZWctPlUxQkNfTEVEQ29uZmlndXJlIHw9IDB4MTA7CiAJCQkJCQlwSHdEYXRhLT5MRURfQmxpbmtpbmcgPSAxOyAvL1N0YXJ0IGJsaW5raW5nCiAJCQkJCQlUaW1lSW50ZXJ2YWwgPSA1MDsKIAkJCQkJfQogCQkJCX0KIAkJCQllbHNlCiAJCQkJewotCQkJCQlpZiggcFdiMzVSZWctPlUxQkNfTEVEQ29uZmlndXJlICYgMHgxMCApIC8vIENoZWNrIHRoZSBMRURfMAorCQkJCQlpZiggcmVnLT5VMUJDX0xFRENvbmZpZ3VyZSAmIDB4MTAgKSAvLyBDaGVjayB0aGUgTEVEXzAKIAkJCQkJewotCQkJCQkJcFdiMzVSZWctPlUxQkNfTEVEQ29uZmlndXJlICY9IH4weDEwOwotCQkJCQkJV2IzNVJlZ19Xcml0ZSggcEh3RGF0YSwgMHgwM2JjLCBwV2IzNVJlZy0+VTFCQ19MRURDb25maWd1cmUgKTsKKwkJCQkJCXJlZy0+VTFCQ19MRURDb25maWd1cmUgJj0gfjB4MTA7CisJCQkJCQlXYjM1UmVnX1dyaXRlKCBwSHdEYXRhLCAweDAzYmMsIHJlZy0+VTFCQ19MRURDb25maWd1cmUgKTsKIAkJCQkJfQogCQkJCX0KIAkJCQlicmVhazsKQEAgLTcyMCw4NCArMzAzLDI0MCBAQAogCX0KIAogCXBId0RhdGEtPnRpbWVfY291bnQgKz0gVGltZUludGVydmFsOwotCVdiMzVUeF9DdXJyZW50VGltZSggcEh3RGF0YSwgcEh3RGF0YS0+dGltZV9jb3VudCApOyAvLyAyMDA2MDkyOCBhZGQKLQlPU19USU1FUl9TRVQoICZwSHdEYXRhLT5MRURUaW1lciwgVGltZUludGVydmFsICk7IC8vIDIwMDYwNjIzLjEKKwlXYjM1VHhfQ3VycmVudFRpbWUoYWRhcHRlciwgcEh3RGF0YS0+dGltZV9jb3VudCk7IC8vIDIwMDYwOTI4IGFkZAorCXBId0RhdGEtPkxFRFRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyhUaW1lSW50ZXJ2YWwpOworCWFkZF90aW1lcigmcEh3RGF0YS0+TEVEVGltZXIpOworfQorCit1OCBoYWxfaW5pdF9oYXJkd2FyZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKK3sKKwlzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKnByaXYgPSBody0+cHJpdjsKKwlwaHdfZGF0YV90IHBId0RhdGEgPSAmcHJpdi0+c0h3RGF0YTsKKwl1MTYgU29mdHdhcmVTZXQ7CisKKwkvLyBJbml0aWFsIHRoZSB2YXJpYWJsZQorCXBId0RhdGEtPk1heFJlY2VpdmVMaWZlVGltZSA9IERFRkFVTFRfTVNEVV9MSUZFX1RJTUU7IC8vIFNldHRpbmcgUnggbWF4aW11bSBNU0RVIGxpZmUgdGltZQorCXBId0RhdGEtPkZyYWdtZW50VGhyZXNob2xkID0gREVGQVVMVF9GUkFHTUVOVF9USFJFU0hPTEQ7IC8vIFNldHRpbmcgZGVmYXVsdCBmcmFnbWVudCB0aHJlc2hvbGQKKworCXBId0RhdGEtPkluaXRpYWxSZXNvdXJjZSA9IDE7CisJaWYoIFdiMzVSZWdfaW5pdGlhbChwSHdEYXRhKSkgeworCQlwSHdEYXRhLT5Jbml0aWFsUmVzb3VyY2UgPSAyOworCQlpZiAoV2IzNVR4X2luaXRpYWwocEh3RGF0YSkpIHsKKwkJCXBId0RhdGEtPkluaXRpYWxSZXNvdXJjZSA9IDM7CisJCQlpZiAoV2IzNVJ4X2luaXRpYWwocEh3RGF0YSkpIHsKKwkJCQlwSHdEYXRhLT5Jbml0aWFsUmVzb3VyY2UgPSA0OworCQkJCWluaXRfdGltZXIoJnBId0RhdGEtPkxFRFRpbWVyKTsKKwkJCQlwSHdEYXRhLT5MRURUaW1lci5mdW5jdGlvbiA9IGhhbF9sZWRfY29udHJvbDsKKwkJCQlwSHdEYXRhLT5MRURUaW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIHByaXY7CisJCQkJcEh3RGF0YS0+TEVEVGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDEwMDApOworCQkJCWFkZF90aW1lcigmcEh3RGF0YS0+TEVEVGltZXIpOworCisJCQkJLy8KKwkJCQkvLyBGb3IgcmVzdHJpY3QgdG8gdmVuZG9yJ3MgaGFyZHdhcmUKKwkJCQkvLworCQkJCVNvZnR3YXJlU2V0ID0gaGFsX3NvZnR3YXJlX3NldCggcEh3RGF0YSApOworCisJCQkJI2lmZGVmIFZlbmRvcjIKKwkJCQkvLyBUcnkgdG8gbWFrZSBzdXJlIHRoZSBFRVBST00gY29udGFpbgorCQkJCVNvZnR3YXJlU2V0ID4+PSA4OworCQkJCWlmKCBTb2Z0d2FyZVNldCAhPSAweDgyICkKKwkJCQkJcmV0dXJuIGZhbHNlOworCQkJCSNlbmRpZgorCisJCQkJV2IzNVJ4X3N0YXJ0KGh3KTsKKwkJCQlXYjM1VHhfRVAyVk1fc3RhcnQocHJpdik7CisKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJfQorCX0KKworCXBId0RhdGEtPlN1cnByaXNlUmVtb3ZlID0gMTsKKwlyZXR1cm4gZmFsc2U7CiB9CiAKIAordm9pZCBoYWxfaGFsdChwaHdfZGF0YV90IHBId0RhdGEsIHZvaWQgKnBwYV9kYXRhKQoreworCXN3aXRjaCggcEh3RGF0YS0+SW5pdGlhbFJlc291cmNlICkKKwl7CisJCWNhc2UgNDoKKwkJY2FzZSAzOiBkZWxfdGltZXJfc3luYygmcEh3RGF0YS0+TEVEVGltZXIpOworCQkJbXNsZWVwKDEwMCk7IC8vIFdhaXQgZm9yIFRpbWVyIERQQyBleGl0IDk0MDYyMy4yCisJCQlXYjM1UnhfZGVzdHJveSggcEh3RGF0YSApOyAvLyBSZWxlYXNlIHRoZSBSeAorCQljYXNlIDI6IFdiMzVUeF9kZXN0cm95KCBwSHdEYXRhICk7IC8vIFJlbGVhc2UgdGhlIFR4CisJCWNhc2UgMTogV2IzNVJlZ19kZXN0cm95KCBwSHdEYXRhICk7IC8vIFJlbGVhc2UgdGhlIFdiMzUgUmVnaXNzdGVyIHJlc291cmNlcworCX0KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3ZvaWQgaGFsX3NldF9iZWFjb25fcGVyaW9kKCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgdTE2IGJlYWNvbl9wZXJpb2QgKQoreworCXUzMgl0bXA7CisKKwlpZiggcEh3RGF0YS0+U3VycHJpc2VSZW1vdmUgKSByZXR1cm47CisKKwlwSHdEYXRhLT5CZWFjb25QZXJpb2QgPSBiZWFjb25fcGVyaW9kOworCXRtcCA9IHBId0RhdGEtPkJlYWNvblBlcmlvZCA8PCAxNjsKKwl0bXAgfD0gcEh3RGF0YS0+UHJvYmVEZWxheTsKKwlXYjM1UmVnX1dyaXRlKCBwSHdEYXRhLCAweDA4NDgsIHRtcCApOworfQorCisKK3N0YXRpYyB2b2lkIGhhbF9zZXRfY3VycmVudF9jaGFubmVsX2V4KCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgQ2hhbkluZm8gY2hhbm5lbCApCit7CisJc3RydWN0IHdiMzVfcmVnICpyZWcgPSAmcEh3RGF0YS0+cmVnOworCisJaWYoIHBId0RhdGEtPlN1cnByaXNlUmVtb3ZlICkKKwkJcmV0dXJuOworCisJcHJpbnRrKCJHb2luZyB0byBjaGFubmVsOiAlZC8lZFxuIiwgY2hhbm5lbC5iYW5kLCBjaGFubmVsLkNoYW5Obyk7CisKKwlSRlN5bnRoZXNpemVyX1N3aXRjaGluZ0NoYW5uZWwoIHBId0RhdGEsIGNoYW5uZWwgKTsvLyBTd2l0Y2ggY2hhbm5lbAorCXBId0RhdGEtPkNoYW5uZWwgPSBjaGFubmVsLkNoYW5ObzsKKwlwSHdEYXRhLT5iYW5kID0gY2hhbm5lbC5iYW5kOworCSNpZmRlZiBfUEVfU1RBVEVfRFVNUF8KKwlXQkRFQlVHKCgiU2V0IGNoYW5uZWwgaXMgJWQsIGJhbmQgPSVkXG4iLCBwSHdEYXRhLT5DaGFubmVsLCBwSHdEYXRhLT5iYW5kKSk7CisJI2VuZGlmCisJcmVnLT5NMjhfTWFjQ29udHJvbCAmPSB+MHhmZjsgLy8gQ2xlYW4gY2hhbm5lbCBpbmZvcm1hdGlvbiBmaWVsZAorCXJlZy0+TTI4X01hY0NvbnRyb2wgfD0gY2hhbm5lbC5DaGFuTm87CisJV2IzNVJlZ19Xcml0ZVdpdGhDYWxsYmFja1ZhbHVlKCBwSHdEYXRhLCAweDA4MjgsIHJlZy0+TTI4X01hY0NvbnRyb2wsCisJCQkJCShzOCAqKSZjaGFubmVsLCBzaXplb2YoQ2hhbkluZm8pKTsKK30KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2b2lkIGhhbF9zZXRfY3VycmVudF9jaGFubmVsKCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgQ2hhbkluZm8gY2hhbm5lbCApCit7CisJaGFsX3NldF9jdXJyZW50X2NoYW5uZWxfZXgoIHBId0RhdGEsIGNoYW5uZWwgKTsKK30KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2b2lkIGhhbF9zZXRfYWNjZXB0X2Jyb2FkY2FzdCggIHBod19kYXRhX3QgcEh3RGF0YSwgIHU4IGVuYWJsZSApCit7CisJc3RydWN0IHdiMzVfcmVnICpyZWcgPSAmcEh3RGF0YS0+cmVnOworCisJaWYoIHBId0RhdGEtPlN1cnByaXNlUmVtb3ZlICkgcmV0dXJuOworCisJcmVnLT5NMDBfTWFjQ29udHJvbCAmPSB+MHgwMjAwMDAwMDsvL1RoZSBIVyB2YWx1ZQorCisJaWYgKGVuYWJsZSkKKwkJcmVnLT5NMDBfTWFjQ29udHJvbCB8PSAweDAyMDAwMDAwOy8vVGhlIEhXIHZhbHVlCisKKwlXYjM1UmVnX1dyaXRlKCBwSHdEYXRhLCAweDA4MDAsIHJlZy0+TTAwX01hY0NvbnRyb2wgKTsKK30KKworLy9mb3Igd2VwIGtleSBlcnJvciBkZXRlY3Rpb24sIHdlIG5lZWQgdG8gYWNjZXB0IGJyb2FkY2FzdCBwYWNrZXRzIHRvIGJlIHJlY2VpdmVkIHRlbXBvcmFyeS4KK3ZvaWQgaGFsX3NldF9hY2NlcHRfcHJvbWlzY3VvdXMoIHBod19kYXRhX3QgcEh3RGF0YSwgIHU4IGVuYWJsZSkKK3sKKwlzdHJ1Y3Qgd2IzNV9yZWcgKnJlZyA9ICZwSHdEYXRhLT5yZWc7CisKKwlpZiAocEh3RGF0YS0+U3VycHJpc2VSZW1vdmUpIHJldHVybjsKKwlpZiAoZW5hYmxlKSB7CisJCXJlZy0+TTAwX01hY0NvbnRyb2wgfD0gMHgwMDQwMDAwMDsKKwkJV2IzNVJlZ19Xcml0ZSggcEh3RGF0YSwgMHgwODAwLCByZWctPk0wMF9NYWNDb250cm9sICk7CisJfSBlbHNlIHsKKwkJcmVnLT5NMDBfTWFjQ29udHJvbCY9fjB4MDA0MDAwMDA7CisJCVdiMzVSZWdfV3JpdGUoIHBId0RhdGEsIDB4MDgwMCwgcmVnLT5NMDBfTWFjQ29udHJvbCApOworCX0KK30KKwordm9pZCBoYWxfc2V0X2FjY2VwdF9tdWx0aWNhc3QoICBwaHdfZGF0YV90IHBId0RhdGEsICB1OCBlbmFibGUgKQoreworCXN0cnVjdCB3YjM1X3JlZyAqcmVnID0gJnBId0RhdGEtPnJlZzsKKworCWlmKCBwSHdEYXRhLT5TdXJwcmlzZVJlbW92ZSApIHJldHVybjsKKworCXJlZy0+TTAwX01hY0NvbnRyb2wgJj0gfjB4MDEwMDAwMDA7Ly9UaGUgSFcgdmFsdWUKKwlpZiAoZW5hYmxlKSAgcmVnLT5NMDBfTWFjQ29udHJvbCB8PSAweDAxMDAwMDAwOy8vVGhlIEhXIHZhbHVlCisJV2IzNVJlZ19Xcml0ZSggcEh3RGF0YSwgMHgwODAwLCByZWctPk0wMF9NYWNDb250cm9sICk7Cit9CisKK3ZvaWQgaGFsX3NldF9hY2NlcHRfYmVhY29uKCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgdTggZW5hYmxlICkKK3sKKwlzdHJ1Y3Qgd2IzNV9yZWcgKnJlZyA9ICZwSHdEYXRhLT5yZWc7CisKKwlpZiggcEh3RGF0YS0+U3VycHJpc2VSZW1vdmUgKSByZXR1cm47CisKKwkvLyAyMDA0MDEwOCBkZWJ1ZworCWlmKCAhZW5hYmxlICkvL0R1ZSB0byBTTUUgYW5kIE1MTUUgYXJlIG5vdCBzdWl0YWJsZSBmb3IgMzUKKwkJcmV0dXJuOworCisJcmVnLT5NMDBfTWFjQ29udHJvbCAmPSB+MHgwNDAwMDAwMDsvL1RoZSBIVyB2YWx1ZQorCWlmKCBlbmFibGUgKQorCQlyZWctPk0wMF9NYWNDb250cm9sIHw9IDB4MDQwMDAwMDA7Ly9UaGUgSFcgdmFsdWUKKworCVdiMzVSZWdfV3JpdGUoIHBId0RhdGEsIDB4MDgwMCwgcmVnLT5NMDBfTWFjQ29udHJvbCApOworfQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZCBoYWxfc3RvcCggIHBod19kYXRhX3QgcEh3RGF0YSApCit7CisJc3RydWN0IHdiMzVfcmVnICpyZWcgPSAmcEh3RGF0YS0+cmVnOworCisJcEh3RGF0YS0+V2IzNVJ4LnJ4X2hhbHQgPSAxOworCVdiMzVSeF9zdG9wKCBwSHdEYXRhICk7CisKKwlwSHdEYXRhLT5XYjM1VHgudHhfaGFsdCA9IDE7CisJV2IzNVR4X3N0b3AoIHBId0RhdGEgKTsKKworCXJlZy0+RDAwX0RtYUNvbnRyb2wgJj0gfjB4YzAwMDAwMDA7Ly9UeCBPZmYsIFJ4IE9mZgorCVdiMzVSZWdfV3JpdGUoIHBId0RhdGEsIDB4MDQwMCwgcmVnLT5EMDBfRG1hQ29udHJvbCApOworfQorCit1bnNpZ25lZCBjaGFyIGhhbF9pZGxlKHBod19kYXRhX3QgcEh3RGF0YSkKK3sKKwlzdHJ1Y3Qgd2IzNV9yZWcgKnJlZyA9ICZwSHdEYXRhLT5yZWc7CisJUFdCVVNCCXBXYlVzYiA9ICZwSHdEYXRhLT5XYlVzYjsKKworCWlmKCAhcEh3RGF0YS0+U3VycHJpc2VSZW1vdmUgJiYgKCBwV2JVc2ItPkRldGVjdENvdW50IHx8IHJlZy0+RVAwdm1fc3RhdGUhPVZNX1NUT1AgKSApCisJCXJldHVybiBmYWxzZTsKKworCXJldHVybiB0cnVlOworfQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIHZvaWQgaGFsX3NldF9waHlfdHlwZSggIHBod19kYXRhX3QgcEh3RGF0YSwgIHU4IFBoeVR5cGUgKQogewogCXBId0RhdGEtPnBoeV90eXBlID0gUGh5VHlwZTsKIH0KIAotdm9pZCBoYWxfZ2V0X3BoeV90eXBlKCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgdTggKlBoeVR5cGUgKQotewotCSpQaHlUeXBlID0gcEh3RGF0YS0+cGh5X3R5cGU7Ci19Ci0KLXZvaWQgaGFsX3Jlc2V0X2NvdW50ZXIoICBwaHdfZGF0YV90IHBId0RhdGEgKQotewotCXBId0RhdGEtPmR0b190eF9yZXRyeV9jb3VudCA9IDA7Ci0JcEh3RGF0YS0+ZHRvX3R4X2ZyYWdfY291bnQgPSAwOwotCW1lbXNldCggcEh3RGF0YS0+dHhfcmV0cnlfY291bnQsIDAsIDgpOwotfQotCiB2b2lkIGhhbF9zZXRfcmFkaW9fbW9kZSggcGh3X2RhdGFfdCBwSHdEYXRhLCAgdW5zaWduZWQgY2hhciByYWRpb19vZmYpCiB7Ci0JUFdCMzVSRUcJcFdiMzVSZWcgPSAmcEh3RGF0YS0+V2IzNVJlZzsKKwlzdHJ1Y3Qgd2IzNV9yZWcgKnJlZyA9ICZwSHdEYXRhLT5yZWc7CiAKIAlpZiggcEh3RGF0YS0+U3VycHJpc2VSZW1vdmUgKSByZXR1cm47CiAKIAlpZiAocmFkaW9fb2ZmKQkvL2Rpc2FibGUgQmFzZWJhbmQgcmVjZWl2ZSBvZmYKIAl7CiAJCXBId0RhdGEtPkN1cnJlbnRSYWRpb1N3ID0gMTsgLy8gb2ZmCi0JCXBXYjM1UmVnLT5NMjRfTWFjQ29udHJvbCAmPSAweGZmZmZmZmJmOworCQlyZWctPk0yNF9NYWNDb250cm9sICY9IDB4ZmZmZmZmYmY7CiAJfQogCWVsc2UKIAl7CiAJCXBId0RhdGEtPkN1cnJlbnRSYWRpb1N3ID0gMDsgLy8gb24KLQkJcFdiMzVSZWctPk0yNF9NYWNDb250cm9sIHw9IDB4MDAwMDAwNDA7CisJCXJlZy0+TTI0X01hY0NvbnRyb2wgfD0gMHgwMDAwMDA0MDsKIAl9Ci0JV2IzNVJlZ19Xcml0ZSggcEh3RGF0YSwgMHgwODI0LCBwV2IzNVJlZy0+TTI0X01hY0NvbnRyb2wgKTsKKwlXYjM1UmVnX1dyaXRlKCBwSHdEYXRhLCAweDA4MjQsIHJlZy0+TTI0X01hY0NvbnRyb2wgKTsKIH0KIAogdTggaGFsX2dldF9hbnRlbm5hX251bWJlciggIHBod19kYXRhX3QgcEh3RGF0YSApCiB7Ci0JUFdCMzVSRUcJcFdiMzVSZWcgPSAmcEh3RGF0YS0+V2IzNVJlZzsKKwlzdHJ1Y3Qgd2IzNV9yZWcgKnJlZyA9ICZwSHdEYXRhLT5yZWc7CiAKLQlpZiAoKHBXYjM1UmVnLT5CQjJDICYgQklUKDExKSkgPT0gMCkKKwlpZiAoKHJlZy0+QkIyQyAmIEJJVCgxMSkpID09IDApCiAJCXJldHVybiAwOwogCWVsc2UKIAkJcmV0dXJuIDE7CiB9CiAKLXZvaWQgaGFsX3NldF9hbnRlbm5hX251bWJlciggIHBod19kYXRhX3QgcEh3RGF0YSwgdTggbnVtYmVyICkKLXsKLQotCVBXQjM1UkVHCXBXYjM1UmVnID0gJnBId0RhdGEtPldiMzVSZWc7Ci0KLQlpZiAobnVtYmVyID09IDEpIHsKLQkJcFdiMzVSZWctPkJCMkMgfD0gQklUKDExKTsKLQl9IGVsc2UgewotCQlwV2IzNVJlZy0+QkIyQyAmPSB+QklUKDExKTsKLQl9Ci0JV2IzNVJlZ19Xcml0ZSggcEh3RGF0YSwgMHgxMDJjLCBwV2IzNVJlZy0+QkIyQyApOwotI2lmZGVmIF9QRV9TVEFURV9EVU1QXwotCVdCREVCVUcoKCJDdXJyZW50IGFudGVubmEgbnVtYmVyIDogJWRcbiIsIG51bWJlcikpOwotI2VuZGlmCi19Ci0KIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8wIDogcmFkaW8gb247IDE6IHJhZGlvIG9mZgogdTggaGFsX2dldF9od19yYWRpb19vZmYoICBwaHdfZGF0YV90IHBId0RhdGEgKQogewotCVBXQjM1UkVHCXBXYjM1UmVnID0gJnBId0RhdGEtPldiMzVSZWc7CisJc3RydWN0IHdiMzVfcmVnICpyZWcgPSAmcEh3RGF0YS0+cmVnOwogCiAJaWYoIHBId0RhdGEtPlN1cnByaXNlUmVtb3ZlICkgcmV0dXJuIDE7CiAKIAkvL3JlYWQgdGhlIGJpdDE2IG9mIHJlZ2lzdGVyIFUxQjAKLQlXYjM1UmVnX1JlYWQoIHBId0RhdGEsIDB4M2IwLCAmcFdiMzVSZWctPlUxQjAgKTsKLQlpZiAoKHBXYjM1UmVnLT5VMUIwICYgMHgwMDAxMDAwMCkpIHsKKwlXYjM1UmVnX1JlYWQoIHBId0RhdGEsIDB4M2IwLCAmcmVnLT5VMUIwICk7CisJaWYgKChyZWctPlUxQjAgJiAweDAwMDEwMDAwKSkgewogCQlwSHdEYXRhLT5DdXJyZW50UmFkaW9IdyA9IDE7CiAJCXJldHVybiAxOwogCX0gZWxzZSB7CkBAIC04MjMsNTYgKzU2Miw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotdm9pZCBoYWxfc2Nhbl9zdGF0dXNfaW5kaWNhdGUocGh3X2RhdGFfdCBwSHdEYXRhLCB1bnNpZ25lZCBjaGFyIElzT25Qcm9ncmVzcykKLXsKLQlpZiggcEh3RGF0YS0+U3VycHJpc2VSZW1vdmUgKSByZXR1cm47Ci0JcEh3RGF0YS0+TEVEX1NjYW5uaW5nID0gSXNPblByb2dyZXNzID8gMSA6IDA7Ci19Ci0KLXZvaWQgaGFsX3N5c3RlbV9wb3dlcl9jaGFuZ2UocGh3X2RhdGFfdCBwSHdEYXRhLCB1MzIgUG93ZXJTdGF0ZSkKLXsKLQlpZiggUG93ZXJTdGF0ZSAhPSAwICkKLQl7Ci0JCXBId0RhdGEtPlN1cnByaXNlUmVtb3ZlID0gMTsKLQkJaWYoIHBId0RhdGEtPldiVXNiLklzVXNiMjAgKQotCQkJaGFsX3N0b3AoIHBId0RhdGEgKTsKLQl9Ci0JZWxzZQotCXsKLQkJaWYoICFwSHdEYXRhLT5XYlVzYi5Jc1VzYjIwICkKLQkJCWhhbF9zdG9wKCBwSHdEYXRhICk7Ci0JfQotfQotCi12b2lkIGhhbF9zdXJwcmlzZV9yZW1vdmUoICBwaHdfZGF0YV90IHBId0RhdGEgKQotewotCVBBREFQVEVSIEFkYXB0ZXIgPSBwSHdEYXRhLT5BZGFwdGVyOwotCWlmIChPU19BVE9NSUNfSU5DKCBBZGFwdGVyLCAmcEh3RGF0YS0+U3VycHJpc2VSZW1vdmVDb3VudCApID09IDEpIHsKLQkJI2lmZGVmIF9QRV9TVEFURV9EVU1QXwotCQlXQkRFQlVHKCgiQ2FsbGluZyBoYWxfc3VycHJpc2VfcmVtb3ZlXG4iKSk7Ci0JCSNlbmRpZgotCQlPU19TVE9QKCBBZGFwdGVyICk7Ci0JfQotfQotCi12b2lkIGhhbF9yYXRlX2NoYW5nZSggIHBod19kYXRhX3QgcEh3RGF0YSApIC8vIE5vdGlmeSB0aGUgSEFMIHJhdGUgaXMgY2hhbmdpbmcgMjAwNjA2MTMuMQotewotCVBBREFQVEVSCUFkYXB0ZXIgPSBwSHdEYXRhLT5BZGFwdGVyOwotCXU4CQlyYXRlID0gQ1VSUkVOVF9UWF9SQVRFOwotCi0JQkJQcm9jZXNzb3JfUmF0ZUNoYW5naW5nKCBwSHdEYXRhLCByYXRlICk7Ci19Ci0KIHZvaWQgaGFsX3NldF9yZl9wb3dlcihwaHdfZGF0YV90IHBId0RhdGEsIHU4IFBvd2VySW5kZXgpCiB7CiAJUkZTeW50aGVzaXplcl9TZXRQb3dlckluZGV4KCBwSHdEYXRhLCBQb3dlckluZGV4ICk7CiB9Ci0KLXVuc2lnbmVkIGNoYXIgaGFsX3NldF9MRUQocGh3X2RhdGFfdCBwSHdEYXRhLCB1MzIgTW9kZSkgLy8gMjAwNjExMDggZm9yIFdQUyBsZWQgY29udHJvbAotewotCXBId0RhdGEtPkxFRF9CbGlua2luZyA9IDA7Ci0JcEh3RGF0YS0+TEVEX2NvbnRyb2wgPSBNb2RlOwotCU9TX1RJTUVSX1NFVCggJnBId0RhdGEtPkxFRFRpbWVyLCAxMCApOyAvLyAyMDA2MDYyMwotCXJldHVybiBUUlVFOwotfQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YmhhbF9mLmggYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YmhhbF9mLmgKaW5kZXggZWE5NTMxYS4uZTgwNWY0MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2JoYWxfZi5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3diaGFsX2YuaApAQCAtMSwyNSArMSwxOSBAQAogLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIC8vIERldmljZSByZWxhdGVkIGluY2x1ZGUKIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jaWZkZWYgV0JfTElOVVgKLQkjaW5jbHVkZSAibGludXgvd2J1c2JfZi5oIgotCSNpbmNsdWRlICJsaW51eC93YjM1cmVnX2YuaCIKLQkjaW5jbHVkZSAibGludXgvd2IzNXR4X2YuaCIKLQkjaW5jbHVkZSAibGludXgvd2IzNXJ4X2YuaCIKLSNlbHNlCi0JI2luY2x1ZGUgIndidXNiX2YuaCIKLQkjaW5jbHVkZSAid2IzNXJlZ19mLmgiCi0JI2luY2x1ZGUgIndiMzV0eF9mLmgiCi0JI2luY2x1ZGUgIndiMzVyeF9mLmgiCi0jZW5kaWYKKyNpbmNsdWRlICJ3YjM1cmVnX2YuaCIKKyNpbmNsdWRlICJ3YjM1dHhfZi5oIgorI2luY2x1ZGUgIndiMzVyeF9mLmgiCisKKyNpbmNsdWRlICJjb3JlLmgiCiAKIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAvLyBGdW5jdGlvbiBkZWNsYXJhdGlvbgogLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIHZvaWQgaGFsX3JlbW92ZV9tYXBwaW5nX2tleSggIHBod19kYXRhX3QgcEh3RGF0YSwgIHU4ICpwbWFjX2FkZHIgKTsKIHZvaWQgaGFsX3JlbW92ZV9kZWZhdWx0X2tleSggIHBod19kYXRhX3QgcEh3RGF0YSwgIHUzMiBpbmRleCApOwotdW5zaWduZWQgY2hhciBoYWxfc2V0X21hcHBpbmdfa2V5KCAgcGh3X2RhdGFfdCBBZGFwdGVyLCAgdTggKnBtYWNfYWRkciwgIHU4IG51bGxfa2V5LCAgdTggd2VwX29uLCAgdTggKnB0eF90c2MsICB1OCAqcHJ4X3RzYywgIHU4IGtleV90eXBlLCAgdTgga2V5X2xlbiwgIHU4ICpwa2V5X2RhdGEgKTsKLXVuc2lnbmVkIGNoYXIgaGFsX3NldF9kZWZhdWx0X2tleSggIHBod19kYXRhX3QgQWRhcHRlciwgIHU4IGluZGV4LCAgdTggbnVsbF9rZXksICB1OCB3ZXBfb24sICB1OCAqcHR4X3RzYywgIHU4ICpwcnhfdHNjLCAgdTgga2V5X3R5cGUsICB1OCBrZXlfbGVuLCAgdTggKnBrZXlfZGF0YSApOwordW5zaWduZWQgY2hhciBoYWxfc2V0X21hcHBpbmdfa2V5KCAgcGh3X2RhdGFfdCBhZGFwdGVyLCAgdTggKnBtYWNfYWRkciwgIHU4IG51bGxfa2V5LCAgdTggd2VwX29uLCAgdTggKnB0eF90c2MsICB1OCAqcHJ4X3RzYywgIHU4IGtleV90eXBlLCAgdTgga2V5X2xlbiwgIHU4ICpwa2V5X2RhdGEgKTsKK3Vuc2lnbmVkIGNoYXIgaGFsX3NldF9kZWZhdWx0X2tleSggIHBod19kYXRhX3QgYWRhcHRlciwgIHU4IGluZGV4LCAgdTggbnVsbF9rZXksICB1OCB3ZXBfb24sICB1OCAqcHR4X3RzYywgIHU4ICpwcnhfdHNjLCAgdTgga2V5X3R5cGUsICB1OCBrZXlfbGVuLCAgdTggKnBrZXlfZGF0YSApOwogdm9pZCBoYWxfY2xlYXJfYWxsX2RlZmF1bHRfa2V5KCAgcGh3X2RhdGFfdCBwSHdEYXRhICk7CiB2b2lkIGhhbF9jbGVhcl9hbGxfZ3JvdXBfa2V5KCAgcGh3X2RhdGFfdCBwSHdEYXRhICk7CiB2b2lkIGhhbF9jbGVhcl9hbGxfbWFwcGluZ19rZXkoICBwaHdfZGF0YV90IHBId0RhdGEgKTsKQEAgLTI3LDE0ICsyMSwxMSBAQAogdm9pZCBoYWxfZ2V0X2V0aGVybmV0X2FkZHJlc3MoICBwaHdfZGF0YV90IHBId0RhdGEsICB1OCAqY3VycmVudF9hZGRyZXNzICk7CiB2b2lkIGhhbF9zZXRfZXRoZXJuZXRfYWRkcmVzcyggIHBod19kYXRhX3QgcEh3RGF0YSwgIHU4ICpjdXJyZW50X2FkZHJlc3MgKTsKIHZvaWQgaGFsX2dldF9wZXJtYW5lbnRfYWRkcmVzcyggIHBod19kYXRhX3QgcEh3RGF0YSwgIHU4ICpwZXRoZXJuZXRfYWRkcmVzcyApOwotdW5zaWduZWQgY2hhciBoYWxfaW5pdF9oYXJkd2FyZSggIHBod19kYXRhX3QgcEh3RGF0YSwgIFBBREFQVEVSIEFkYXB0ZXIgKTsKK3U4IGhhbF9pbml0X2hhcmR3YXJlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KTsKIHZvaWQgaGFsX3NldF9wb3dlcl9zYXZlX21vZGUoICBwaHdfZGF0YV90IHBId0RhdGEsICB1bnNpZ25lZCBjaGFyIHBvd2VyX3NhdmUsICB1bnNpZ25lZCBjaGFyIHdha2V1cCwgIHVuc2lnbmVkIGNoYXIgZHRpbSApOwogdm9pZCBoYWxfZ2V0X3Bvd2VyX3NhdmVfbW9kZSggIHBod19kYXRhX3QgcEh3RGF0YSwgICB1OCAqcGluX3B3cl9zYXZlICk7CiB2b2lkIGhhbF9zZXRfc2xvdF90aW1lKCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgdTggdHlwZSApOwogI2RlZmluZSBoYWxfc2V0X2F0aW1fd2luZG93KCBfQSwgX0FUTSApCi12b2lkIGhhbF9zZXRfcmF0ZXMoICBwaHdfZGF0YV90IHBId0RhdGEsICB1OCAqcGJzc19yYXRlcywgIHU4IGxlbmd0aCwgIHVuc2lnbmVkIGNoYXIgYmFzaWNfcmF0ZV9zZXQgKTsKLSNkZWZpbmUgaGFsX3NldF9iYXNpY19yYXRlcyggX0EsIF9SLCBfTCApIGhhbF9zZXRfcmF0ZXMoIF9BLCBfUiwgX0wsIFRSVUUgKQotI2RlZmluZSBoYWxfc2V0X29wX3JhdGVzKCBfQSwgX1IsIF9MICkgaGFsX3NldF9yYXRlcyggX0EsIF9SLCBfTCwgRkFMU0UgKQogdm9pZCBoYWxfc3RhcnRfYnNzKCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgdTggbWFjX29wX21vZGUgKTsKIHZvaWQgaGFsX2pvaW5fcmVxdWVzdCggIHBod19kYXRhX3QgcEh3RGF0YSwgIHU4IGJzc190eXBlICk7IC8vIDA6QlNTIFNUQSAxOklCU1MgU1RBLy8KIHZvaWQgaGFsX3N0b3Bfc3luY19ic3MoICBwaHdfZGF0YV90IHBId0RhdGEgKTsKQEAgLTQ3LDM5ICszOCwyNSBAQAogdm9pZCBoYWxfc2V0X2NhcF9pbmZvKCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgdTE2IGNhcGFiaWxpdHlfaW5mbyApOwogdm9pZCBoYWxfc2V0X3NzaWQoICBwaHdfZGF0YV90IHBId0RhdGEsICB1OCAqcHNzaWQsICB1OCBzc2lkX2xlbiApOwogdm9pZCBoYWxfc2V0X2N1cnJlbnRfY2hhbm5lbCggIHBod19kYXRhX3QgcEh3RGF0YSwgIENoYW5JbmZvIGNoYW5uZWwgKTsKLXZvaWQgaGFsX3NldF9jdXJyZW50X2NoYW5uZWxfZXgoICBwaHdfZGF0YV90IHBId0RhdGEsICBDaGFuSW5mbyBjaGFubmVsICk7Ci12b2lkIGhhbF9nZXRfY3VycmVudF9jaGFubmVsKCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgQ2hhbkluZm8gKmNoYW5uZWwgKTsKIHZvaWQgaGFsX3NldF9hY2NlcHRfYnJvYWRjYXN0KCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgdTggZW5hYmxlICk7CiB2b2lkIGhhbF9zZXRfYWNjZXB0X211bHRpY2FzdCggIHBod19kYXRhX3QgcEh3RGF0YSwgIHU4IGVuYWJsZSApOwogdm9pZCBoYWxfc2V0X2FjY2VwdF9iZWFjb24oICBwaHdfZGF0YV90IHBId0RhdGEsICB1OCBlbmFibGUgKTsKLXZvaWQgaGFsX3NldF9tdWx0aWNhc3RfYWRkcmVzcyggIHBod19kYXRhX3QgcEh3RGF0YSwgIHU4ICphZGRyZXNzLCAgdTggbnVtYmVyICk7Ci11OCBoYWxfZ2V0X2FjY2VwdF9iZWFjb24oICBwaHdfZGF0YV90IHBId0RhdGEgKTsKIHZvaWQgaGFsX3N0b3AoICBwaHdfZGF0YV90IHBId0RhdGEgKTsKIHZvaWQgaGFsX2hhbHQoICBwaHdfZGF0YV90IHBId0RhdGEsIHZvaWQgKnBwYV9kYXRhICk7CiB2b2lkIGhhbF9zdGFydF90eDAoICBwaHdfZGF0YV90IHBId0RhdGEgKTsKIHZvaWQgaGFsX3NldF9waHlfdHlwZSggIHBod19kYXRhX3QgcEh3RGF0YSwgIHU4IFBoeVR5cGUgKTsKLXZvaWQgaGFsX2dldF9waHlfdHlwZSggIHBod19kYXRhX3QgcEh3RGF0YSwgIHU4ICpQaHlUeXBlICk7Ci11bnNpZ25lZCBjaGFyIGhhbF9yZXNldF9oYXJkd2FyZSggIHBod19kYXRhX3QgcEh3RGF0YSwgIHZvaWQqIHBwYSApOwotdm9pZCBoYWxfc2V0X2N3bWluKCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgdTgJY3dpbl9taW4gKTsKICNkZWZpbmUgaGFsX2dldF9jd21pbiggX0EgKSAoIChfQSktPmN3bWluICkKIHZvaWQgaGFsX3NldF9jd21heCggIHBod19kYXRhX3QgcEh3RGF0YSwgIHUxNiBjd2luX21heCApOwogI2RlZmluZSBoYWxfZ2V0X2N3bWF4KCBfQSApICggKF9BKS0+Y3dtYXggKQogdm9pZCBoYWxfc2V0X3Jzbl93cGEoICBwaHdfZGF0YV90IHBId0RhdGEsICB1MzIgKiBSU05fSUVfQml0bWFwICwgdTMyICogUlNOX09VSV90eXBlICwgdW5zaWduZWQgY2hhciBiRGVzaXJlZEF1dGhNb2RlKTsKLS8vczMyIGhhbF9nZXRfcnNzaSggIHBod19kYXRhX3QgcEh3RGF0YSwgIHUzMiBIYWxSc3NpICk7Ci1zMzIgaGFsX2dldF9yc3NpKCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgdTMyICpIYWxSc3NpQXJyeSwgIHU4IENvdW50ICk7Ci1zMzIgaGFsX2dldF9yc3NpX2JzcyggIHBod19kYXRhX3QgcEh3RGF0YSwgIHUxNiBpZHgsICB1OCBDb3VudCApOwogdm9pZCBoYWxfc2V0X2Nvbm5lY3RfaW5mbyggIHBod19kYXRhX3QgcEh3RGF0YSwgIHVuc2lnbmVkIGNoYXIgYm9Db25uZWN0ICk7CiB1OCBoYWxfZ2V0X2VzdF9zcTMoICBwaHdfZGF0YV90IHBId0RhdGEsICB1OCBDb3VudCApOwotdm9pZCBoYWxfbGVkX2NvbnRyb2xfMWEoICBwaHdfZGF0YV90IHBId0RhdGEgKTsKLXZvaWQgaGFsX2xlZF9jb250cm9sKCAgdm9pZCogUzEsICBwaHdfZGF0YV90IHBId0RhdGEsICB2b2lkKiBTMywgIHZvaWQqIFM0ICk7CiB2b2lkIGhhbF9zZXRfcmZfcG93ZXIoICBwaHdfZGF0YV90IHBId0RhdGEsICB1OCBQb3dlckluZGV4ICk7IC8vIDIwMDYwNjIxIE1vZGlmeQotdm9pZCBoYWxfcmVzZXRfY291bnRlciggIHBod19kYXRhX3QgcEh3RGF0YSApOwogdm9pZCBoYWxfc2V0X3JhZGlvX21vZGUoICBwaHdfZGF0YV90IHBId0RhdGEsICB1bnNpZ25lZCBjaGFyIGJvVmFsdWUpOwogdm9pZCBoYWxfZGVzY3JpcHRvcl9pbmRpY2F0ZSggIHBod19kYXRhX3QgcEh3RGF0YSwgIFBERVNDUklQVE9SIHBEZXMgKTsKIHU4IGhhbF9nZXRfYW50ZW5uYV9udW1iZXIoICBwaHdfZGF0YV90IHBId0RhdGEgKTsKLXZvaWQgaGFsX3NldF9hbnRlbm5hX251bWJlciggIHBod19kYXRhX3QgcEh3RGF0YSwgdTggbnVtYmVyICk7CiB1MzIgaGFsX2dldF9ic3NfcGtfY250KCAgcGh3X2RhdGFfdCBwSHdEYXRhICk7Ci0jZGVmaW5lIGhhbF9nZXRfcmVnaW9uX2Zyb21fRUVQUk9NKCBfQSApICggKF9BKS0+V2IzNVJlZy5FRVBST01SZWdpb24gKQorI2RlZmluZSBoYWxfZ2V0X3JlZ2lvbl9mcm9tX0VFUFJPTSggX0EgKSAoIChfQSktPnJlZy5FRVBST01SZWdpb24gKQogdm9pZCBoYWxfc2V0X2FjY2VwdF9wcm9taXNjdW91cwkJKCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgdTggZW5hYmxlKTsKICNkZWZpbmUgaGFsX2dldF90eF9idWZmZXIoIF9BLCBfQiApIFdiMzVUeF9nZXRfdHhfYnVmZmVyKCBfQSwgX0IgKQogdTggaGFsX2dldF9od19yYWRpb19vZmYJCQkoICBwaHdfZGF0YV90IHBId0RhdGEgKTsKQEAgLTg4LDIwICs2NSwxMyBAQAogI2RlZmluZSBoYWxfcnNzaV9ib3VuZGFyeV9oaWdoKCBfQSApIChfQS0+UlNTSV9oaWdoKQogI2RlZmluZSBoYWxfcnNzaV9ib3VuZGFyeV9sb3coIF9BICkgKF9BLT5SU1NJX2xvdykKICNkZWZpbmUgaGFsX3NjYW5faW50ZXJ2YWwoIF9BICkJCShfQS0+U2Nhbl9JbnRlcnZhbCkKLXZvaWQgaGFsX3NjYW5fc3RhdHVzX2luZGljYXRlKCAgcGh3X2RhdGFfdCBwSHdEYXRhLCB1OCBzdGF0dXMpOwkvLyAwOiBjb21wbGV0ZSwgMTogaW4gcHJvZ3Jlc3MKLXZvaWQgaGFsX3N5c3RlbV9wb3dlcl9jaGFuZ2UoICBwaHdfZGF0YV90IHBId0RhdGEsIHUzMiBQb3dlclN0YXRlICk7IC8vIDIwMDUxMjMwIC09RDAgMT1EMSAuLgotdm9pZCBoYWxfc3VycHJpc2VfcmVtb3ZlKCAgcGh3X2RhdGFfdCBwSHdEYXRhICk7CiAKICNkZWZpbmUgUEhZX0RFQlVHKCBtc2csIGFyZ3MuLi4gKQogCi0KLQotdm9pZCBoYWxfcmF0ZV9jaGFuZ2UoICBwaHdfZGF0YV90IHBId0RhdGEgKTsgLy8gTm90aWZ5IHRoZSBIQUwgcmF0ZSBpcyBjaGFuZ2luZyAyMDA2MDYxMy4xCiB1bnNpZ25lZCBjaGFyIGhhbF9nZXRfZHh4X3JlZyggIHBod19kYXRhX3QgcEh3RGF0YSwgIHUxNiBudW1iZXIsICB1MzIgKiBwVmFsdWUgKTsKIHVuc2lnbmVkIGNoYXIgaGFsX3NldF9keHhfcmVnKCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgdTE2IG51bWJlciwgIHUzMiB2YWx1ZSApOwogI2RlZmluZSBoYWxfZ2V0X3RpbWVfY291bnQoIF9QICkJKF9QLT50aW1lX2NvdW50LzEwKQkvLyByZXR1cm4gMTAwbXMgY291bnQKICNkZWZpbmUgaGFsX2RldGVjdF9lcnJvciggX1AgKQkJKF9QLT5XYlVzYi5EZXRlY3RDb3VudCkKLXVuc2lnbmVkIGNoYXIgaGFsX3NldF9MRUQoICBwaHdfZGF0YV90IHBId0RhdGEsICB1MzIgTW9kZSApOyAvLyAyMDA2MTEwOCBmb3IgV1BTIGxlZCBjb250cm9sCiAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gVGhlIGZvbGxvdyBmdW5jdGlvbiBpcyB1bnVzZWQgZm9yIElTODlDMzUKQEAgLTExMyw3ICs4Myw2IEBACiAjZGVmaW5lIGhhbF9pYnNzX2Rpc2Nvbm5lY3QoX0EpIGhhbF9zdG9wX3N5bmNfYnNzKF9BKQogI2RlZmluZSBoYWxfam9pbl9yZXF1ZXN0X3N0b3AoX0EpCiB1bnNpZ25lZCBjaGFyCWhhbF9pZGxlKCAgcGh3X2RhdGFfdCBwSHdEYXRhICk7Ci0jZGVmaW5lIHBhX3N0YWxsX2V4ZWN1dGlvbiggX0EgKQkvL09TX1NMRUVQKCAxICkKICNkZWZpbmUgaHdfZ2V0X2N4eF9yZWcoIF9BLCBfQiwgX0MgKQogI2RlZmluZSBod19zZXRfY3h4X3JlZyggX0EsIF9CLCBfQyApCiAjZGVmaW5lIGh3X2dldF9keHhfcmVnKCBfQSwgX0IsIF9DICkJaGFsX2dldF9keHhfcmVnKCBfQSwgX0IsICh1MzIgKilfQyApCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YmhhbF9zLmggYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YmhhbF9zLmgKaW5kZXggMmVlM2YwZi4uMjc2ZDJiMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2JoYWxfcy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3diaGFsX3MuaApAQCAtMSwzICsxLDEwIEBACisjaWZuZGVmIF9fV0lOQk9ORF9XQkhBTF9TX0gKKyNkZWZpbmUgX19XSU5CT05EX1dCSEFMX1NfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2luY2x1ZGUgImNvbW1vbi5oIgorCiAvL1syMDA0MDcyMiBXS10KICNkZWZpbmUgSEFMX0xFRF9TRVRfTUFTSwkJMHgwMDFjCS8vMjAwNjA5MDEgRXh0ZW5kCiAjZGVmaW5lIEhBTF9MRURfU0VUX1NISUZUCQkyCkBAIC00MTUsMTAgKzQyMiwxMCBAQAogLy8gRGV2aWNlIHJlbGF0ZWQgaW5jbHVkZQogLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAotI2luY2x1ZGUgImxpbnV4L3didXNiX3MuaCIKLSNpbmNsdWRlICJsaW51eC93YjM1cmVnX3MuaCIKLSNpbmNsdWRlICJsaW51eC93YjM1dHhfcy5oIgotI2luY2x1ZGUgImxpbnV4L3diMzVyeF9zLmgiCisjaW5jbHVkZSAid2J1c2Jfcy5oIgorI2luY2x1ZGUgIndiMzVyZWdfcy5oIgorI2luY2x1ZGUgIndiMzV0eF9zLmgiCisjaW5jbHVkZSAid2IzNXJ4X3MuaCIKIAogCiAvLyBGb3IgSGFsIHVzaW5nID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpAQCAtNDQyLDE2ICs0NDksNiBAQAogCXUzMglGcmFnQ291bnQ7CiAJdTMyCURNQUZpeDsgLy9WMV9ETUFfRklYIFRoZSB2YXJpYWJsZSBjYW4gYmUgcmVtb3ZlZCBpZiBkcml2ZXIgd2FudCB0byBzYXZlIG1lbSBzcGFjZSBmb3IgVjIuCiAKLQkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCS8vIEZvciBVU0IgZHJpdmVyLCBoYWwgbmVlZCBtb3JlIHZhcmlhYmxlcy4gRHVlIHRvCi0JLy8JMS4gTkRJUy1XRE0gb3BlcmF0aW9uCi0JLy8JMi4gVGhlIFNNRSwgTUxNRSBhbmQgT0xEIE1EUyBuZWVkIEFkYXB0ZXIgc3RydWN0dXJlLCBidXQgdGhlIGRyaXZlciB1bmRlciBIQUwgZG9lc24ndAotCS8vCQloYXZlIHRoYXQgcGFyYW1ldGVyIHdoZW4gcmVjZWl2aW5nIGFuZCBpbmRpY2F0aW5nIHBhY2tldC4KLQkvLwkJVGhlIE1EUyBtdXN0IGlucHV0IHRoZSBBZGFwdGVyIHBvaW50ZXIgYXMgdGhlIHNlY29uZCBwYXJhbWV0ZXIgb2YgaGFsX2luaXRfaGFyZHdhcmUuCi0JLy8JCVRoZSBmdW5jdGlvbiB1c2FnZSBpcyBkaWZmZXJlbnQgdGhhbiBQQ0kgZHJpdmVyLgotCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0Jdm9pZCogQWRhcHRlcjsKLQogCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAkvLyBEZWZpbml0aW9uIGZvciBNQUMgYWRkcmVzcwogCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KQEAgLTUwNiwxMSArNTAzLDExIEBACiAJLy8gVmFyaWFibGUgZm9yIGVhY2ggbW9kdWxlCiAJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAlXQlVTQgkJV2JVc2I7IC8vIE5lZWQgV2JVc2IuaAotCVdCMzVSRUcJCVdiMzVSZWc7IC8vIE5lZWQgV2IzNVJlZy5oCisJc3RydWN0IHdiMzVfcmVnCXJlZzsgLy8gTmVlZCBXYjM1UmVnLmgKIAlXQjM1VFgJCVdiMzVUeDsgLy8gTmVlZCBXYjM1VHguaAogCVdCMzVSWAkJV2IzNVJ4OyAvLyBOZWVkIFdiMzVSeC5oCiAKLQlPU19USU1FUglMRURUaW1lcjsvLyBGb3IgTEVECisJc3RydWN0IHRpbWVyX2xpc3QJTEVEVGltZXI7Ly8gRm9yIExFRAogCiAJdTMyCQlMRURwb2ludDsvLyBGb3IgTEVECiAKQEAgLTU3MCw3ICs1NjcsNyBAQAogCXUzMgkJUnhCeXRlQ291bnRMYXN0OwogCXUzMgkJVHhCeXRlQ291bnRMYXN0OwogCi0JczMyCQlTdXJwcmlzZVJlbW92ZUNvdW50OworCWF0b21pY190CVN1cnByaXNlUmVtb3ZlQ291bnQ7CiAKIAkvLyBGb3IgZ2xvYmFsIHRpbWVyCiAJdTMyCQl0aW1lX2NvdW50Oy8vVElDS19USU1FXzEwMG1zIDEgPSAxMDBtcwpAQCAtNjEyLDQgKzYwOSw0IEBACiAJdTMyICAgTnVtUmF0ZTU0TTsKIH0gSEFMX1JBVEUsICpQSEFMX1JBVEU7CiAKLQorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YmxpbnV4LmMgYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YmxpbnV4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlZDQ1ZTQuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2JsaW51eC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjc1ICswLDAgQEAKLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gIENvcHlyaWdodCAoYykgMTk5Ni0yMDA1IFdpbmJvbmQgRWxlY3Ryb25pYyBDb3Jwb3JhdGlvbgotLy8KLS8vICBNb2R1bGUgTmFtZToKLS8vICAgIHdibGludXguYwotLy8KLS8vICBBYnN0cmFjdDoKLS8vICAgIExpbnV4IHJlbGVhdGVkIHJvdXRpbmVzCi0vLwotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jaW5jbHVkZSAib3NfY29tbW9uLmgiCi0KLXUzMgotV0JMSU5VWF9NZW1vcnlBbGxvYyh2b2lkKiAqVmlydHVhbEFkZHJlc3MsIHUzMiBMZW5ndGgpCi17Ci0JKlZpcnR1YWxBZGRyZXNzID0ga3phbGxvYyggTGVuZ3RoLCBHRlBfQVRPTUlDICk7IC8vR0ZQX0tFUk5FTCBpcyBub3Qgc3VpdGFibGUKLQotCWlmICgqVmlydHVhbEFkZHJlc3MgPT0gTlVMTCkKLQkJcmV0dXJuIDA7Ci0JcmV0dXJuIDE7Ci19Ci0KLXMzMgotRW5jYXBBdG9taWNJbmMoUEFEQVBURVIgQWRhcHRlciwgdm9pZCogcEF0b21pYykKLXsKLQlQV0JMSU5VWCBwV2JMaW51eCA9ICZBZGFwdGVyLT5XYkxpbnV4OwotCXUzMglsdG1wOwotCXUzMiAqCXBsdG1wID0gKHUzMiAqKXBBdG9taWM7Ci0Jc3Bpbl9sb2NrX2lycSggJnBXYkxpbnV4LT5BdG9taWNTcGluTG9jayApOwotCSgqcGx0bXApKys7Ci0JbHRtcCA9ICgqcGx0bXApOwotCXNwaW5fdW5sb2NrX2lycSggJnBXYkxpbnV4LT5BdG9taWNTcGluTG9jayApOwotCXJldHVybiBsdG1wOwotfQotCi1zMzIKLUVuY2FwQXRvbWljRGVjKFBBREFQVEVSIEFkYXB0ZXIsIHZvaWQqIHBBdG9taWMpCi17Ci0JUFdCTElOVVggcFdiTGludXggPSAmQWRhcHRlci0+V2JMaW51eDsKLQl1MzIJbHRtcDsKLQl1MzIgKglwbHRtcCA9ICh1MzIgKilwQXRvbWljOwotCXNwaW5fbG9ja19pcnEoICZwV2JMaW51eC0+QXRvbWljU3BpbkxvY2sgKTsKLQkoKnBsdG1wKS0tOwotCWx0bXAgPSAoKnBsdG1wKTsKLQlzcGluX3VubG9ja19pcnEoICZwV2JMaW51eC0+QXRvbWljU3BpbkxvY2sgKTsKLQlyZXR1cm4gbHRtcDsKLX0KLQotdW5zaWduZWQgY2hhcgotV0JMSU5VWF9Jbml0aWFsKFBBREFQVEVSIEFkYXB0ZXIpCi17Ci0JUFdCTElOVVggcFdiTGludXggPSAmQWRhcHRlci0+V2JMaW51eDsKLQotCXNwaW5fbG9ja19pbml0KCAmcFdiTGludXgtPlNwaW5Mb2NrICk7Ci0Jc3Bpbl9sb2NrX2luaXQoICZwV2JMaW51eC0+QXRvbWljU3BpbkxvY2sgKTsKLQlyZXR1cm4gVFJVRTsKLX0KLQotdm9pZAotV0JMaW51eF9SZWNlaXZlUGFja2V0KFBBREFQVEVSIEFkYXB0ZXIsIFBSWExBWUVSMSBwUnhMYXllcjEpCi17Ci0JQlVHKCk7Ci19Ci0KLQotdm9pZAotV0JMSU5VWF9HZXROZXh0UGFja2V0KFBBREFQVEVSIEFkYXB0ZXIsICBQREVTQ1JJUFRPUiBwRGVzKQotewotCUJVRygpOwotfQotCi12b2lkCi1XQkxJTlVYX0dldE5leHRQYWNrZXRDb21wbGV0ZWQoUEFEQVBURVIgQWRhcHRlciwgUERFU0NSSVBUT1IgcERlcykKLXsKLQlCVUcoKTsKLX0KLQotdm9pZAotV0JMSU5VWF9EZXN0cm95KFBBREFQVEVSIEFkYXB0ZXIpCi17Ci0JV0JMSU5VWF9zdG9wKCBBZGFwdGVyICk7Ci0jaWZkZWYgX1BFX1VTQl9JTklfRFVNUF8KLQlXQkRFQlVHKCgiW3czNXVuZF0gdW5yZWdpc3Rlcl9uZXRkZXYhXG4iKSk7Ci0jZW5kaWYKLX0KLQotdm9pZAotV0JMSU5VWF9zdG9wKCAgUEFEQVBURVIgQWRhcHRlciApCi17Ci0JUFdCTElOVVgJcFdiTGludXggPSAmQWRhcHRlci0+V2JMaW51eDsKLQlzdHJ1Y3Qgc2tfYnVmZiAqcFNrYjsKLQotCWlmIChPU19BVE9NSUNfSU5DKCBBZGFwdGVyLCAmcFdiTGludXgtPlRocmVhZENvdW50ICkgPT0gMSkgewotCQkvLyBTaHV0ZG93biBtb2R1bGUgaW1tZWRpYXRlbHkKLQkJcFdiTGludXgtPnNodXRkb3duID0gMTsKLQotCQl3aGlsZSAocFdiTGludXgtPnNrYl9hcnJheVsgcFdiTGludXgtPnNrYl9HZXRJbmRleCBdKSB7Ci0JCQkvLyBUcnlpbmcgdG8gZnJlZSB0aGUgdW4tc2VuZGluZyBwYWNrZXQKLQkJCXBTa2IgPSBwV2JMaW51eC0+c2tiX2FycmF5WyBwV2JMaW51eC0+c2tiX0dldEluZGV4IF07Ci0JCQlwV2JMaW51eC0+c2tiX2FycmF5WyBwV2JMaW51eC0+c2tiX0dldEluZGV4IF0gPSBOVUxMOwotCQkJaWYoIGluX2lycSgpICkKLQkJCQlkZXZfa2ZyZWVfc2tiX2lycSggcFNrYiApOwotCQkJZWxzZQotCQkJCWRldl9rZnJlZV9za2IoIHBTa2IgKTsKLQotCQkJcFdiTGludXgtPnNrYl9HZXRJbmRleCsrOwotCQkJcFdiTGludXgtPnNrYl9HZXRJbmRleCAlPSBXQkxJTlVYX1BBQ0tFVF9BUlJBWV9TSVpFOwotCQl9Ci0KLSNpZmRlZiBfUEVfU1RBVEVfRFVNUF8KLQkJV0JERUJVRygoICJbdzM1dW5kXSBTS0JfUkVMRUFTRSBPS1xuIiApKTsKLSNlbmRpZgotCX0KLQotCU9TX0FUT01JQ19ERUMoIEFkYXB0ZXIsICZwV2JMaW51eC0+VGhyZWFkQ291bnQgKTsKLX0KLQotdm9pZAotV2JXbGFuSGFsdCggIFBBREFQVEVSIEFkYXB0ZXIgKQotewotCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JQWRhcHRlci0+c0xvY2FsUGFyYS5TaHV0RG93bmVkID0gVFJVRTsKLQotCU1kc19EZXN0cm95KCBBZGFwdGVyICk7Ci0KLQkvLyBUdXJuIG9mZiBSeCBhbmQgVHggaGFyZHdhcmUgYWJpbGl0eQotCWhhbF9zdG9wKCAmQWRhcHRlci0+c0h3RGF0YSApOwotI2lmZGVmIF9QRV9VU0JfSU5JX0RVTVBfCi0JV0JERUJVRygoIlt3MzV1bmRdIEhhbF9zdG9wIE8uSy5cbiIpKTsKLSNlbmRpZgotCU9TX1NMRUVQKDEwMDAwMCk7Ly8gV2FpdGluZyBJcnAgY29tcGxldGVkCi0KLQkvLyBEZXN0cm95IHRoZSBORElTIG1vZHVsZQotCVdCTElOVVhfRGVzdHJveSggQWRhcHRlciApOwotCi0JLy8gSGFsdCB0aGUgSEFMCi0JaGFsX2hhbHQoJkFkYXB0ZXItPnNId0RhdGEsIE5VTEwpOwotfQotCi11bnNpZ25lZCBjaGFyCi1XYldMYW5Jbml0aWFsaXplKFBBREFQVEVSIEFkYXB0ZXIpCi17Ci0JcGh3X2RhdGFfdAlwSHdEYXRhOwotCXU4CQkqcE1hY0FkZHI7Ci0JdTgJCSpwTWFjQWRkcjI7Ci0JdTMyCQlJbml0U3RlcCA9IDA7Ci0JdTgJCUVFUFJPTV9yZWdpb247Ci0JdTgJCUh3UmFkaW9PZmY7Ci0KLQkvLwotCS8vIFNldHRpbmcgZGVmYXVsdCB2YWx1ZSBmb3IgTGludXgKLQkvLwotCUFkYXB0ZXItPnNMb2NhbFBhcmEucmVnaW9uX0lORiA9IFJFR0lPTl9BVVRPOwotCUFkYXB0ZXItPnNMb2NhbFBhcmEuVHhSYXRlTW9kZSA9IFJBVEVfQVVUTzsKLQlwc0xPQ0FMLT5iTWFjT3BlcmF0aW9uTW9kZSA9IE1PREVfODAyXzExX0JHOwkvLyBCL0cgbW9kZQotCUFkYXB0ZXItPk1kcy5UeFJUU1RocmVzaG9sZCA9IERFRkFVTFRfUlRTVGhyZXNob2xkOwotCUFkYXB0ZXItPk1kcy5UeEZyYWdtZW50VGhyZXNob2xkID0gREVGQVVMVF9GUkFHTUVOVF9USFJFU0hPTEQ7Ci0JaGFsX3NldF9waHlfdHlwZSggJkFkYXB0ZXItPnNId0RhdGEsIFJGX1dCXzI0Ml8xICk7Ci0JQWRhcHRlci0+c0xvY2FsUGFyYS5NVFVzaXplID0gTUFYX0VUSEVSTkVUX1BBQ0tFVF9TSVpFOwotCXBzTE9DQUwtPmJQcmVhbWJsZU1vZGUgPSBBVVRPX01PREU7Ci0JQWRhcHRlci0+c0xvY2FsUGFyYS5SYWRpb09mZlN0YXR1cy5ib1N3UmFkaW9PZmYgPSBGQUxTRTsKLQlwSHdEYXRhID0gJkFkYXB0ZXItPnNId0RhdGE7Ci0JaGFsX3NldF9waHlfdHlwZSggcEh3RGF0YSwgUkZfREVDSURFX0JZX0lORiApOwotCi0JLy8KLQkvLyBJbml0aWFsIGVhY2ggbW9kdWxlIGFuZCB2YXJpYWJsZQotCS8vCi0JaWYgKCFXQkxJTlVYX0luaXRpYWwoQWRhcHRlcikpIHsKLSNpZmRlZiBfUEVfVVNCX0lOSV9EVU1QXwotCQlXQkRFQlVHKCgiW3czNXVuZF1XQk5ESVMgaW5pdGlhbGl6YXRpb24gZmFpbGVkXG4iKSk7Ci0jZW5kaWYKLQkJZ290byBlcnJvcjsKLQl9Ci0KLQkvLyBJbml0aWFsIFNvZnR3YXJlIHZhcmlhYmxlCi0JQWRhcHRlci0+c0xvY2FsUGFyYS5TaHV0RG93bmVkID0gRkFMU0U7Ci0KLQkvL2FkZGVkIGJ5IHdzIGZvciB3ZXAga2V5IGVycm9yIGRldGVjdGlvbgotCUFkYXB0ZXItPnNMb2NhbFBhcmEuYldlcEtleUVycm9yPSBGQUxTRTsKLQlBZGFwdGVyLT5zTG9jYWxQYXJhLmJUb1NlbGZQYWNrZXRSZWNlaXZlZCA9IEZBTFNFOwotCUFkYXB0ZXItPnNMb2NhbFBhcmEuV2VwS2V5RGV0ZWN0VGltZXJDb3VudD0gMiAqIDEwMDsgLy8vIDIgc2Vjb25kcwotCi0JLy8gSW5pdGlhbCBVU0IgaGFsCi0JSW5pdFN0ZXAgPSAxOwotCXBId0RhdGEgPSAmQWRhcHRlci0+c0h3RGF0YTsKLQlpZiAoIWhhbF9pbml0X2hhcmR3YXJlKHBId0RhdGEsIEFkYXB0ZXIpKQotCQlnb3RvIGVycm9yOwotCi0JRUVQUk9NX3JlZ2lvbiA9IGhhbF9nZXRfcmVnaW9uX2Zyb21fRUVQUk9NKCBwSHdEYXRhICk7Ci0JaWYgKEVFUFJPTV9yZWdpb24gIT0gUkVHSU9OX0FVVE8pCi0JCXBzTE9DQUwtPnJlZ2lvbiA9IEVFUFJPTV9yZWdpb247Ci0JZWxzZSB7Ci0JCWlmIChwc0xPQ0FMLT5yZWdpb25fSU5GICE9IFJFR0lPTl9BVVRPKQotCQkJcHNMT0NBTC0+cmVnaW9uID0gcHNMT0NBTC0+cmVnaW9uX0lORjsKLQkJZWxzZQotCQkJcHNMT0NBTC0+cmVnaW9uID0gUkVHSU9OX1VTQTsJLy9kZWZhdWx0IHNldHRpbmcKLQl9Ci0KLQkvLyBHZXQgU29mdHdhcmUgc2V0dGluZyBmbGFnIGZyb20gaGFsCi0JQWRhcHRlci0+c0xvY2FsUGFyYS5ib0FudGVubmFEaXZlcnNpdHkgPSBGQUxTRTsKLQlpZiAoaGFsX3NvZnR3YXJlX3NldChwSHdEYXRhKSAmIDB4MDAwMDAwMDEpCi0JCUFkYXB0ZXItPnNMb2NhbFBhcmEuYm9BbnRlbm5hRGl2ZXJzaXR5ID0gVFJVRTsKLQotCS8vCi0JLy8gRm9yIFRTIG1vZHVsZQotCS8vCi0JSW5pdFN0ZXAgPSAyOwotCi0JLy8gRm9yIE1EUyBtb2R1bGUKLQlJbml0U3RlcCA9IDM7Ci0JTWRzX2luaXRpYWwoQWRhcHRlcik7Ci0KLQkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCS8vIEluaXRpYWxpemUgdGhlIFNNRSwgU0NBTiwgTUxNRSwgUk9BTQotCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JSW5pdFN0ZXAgPSA0OwotCUluaXRTdGVwID0gNTsKLQlJbml0U3RlcCA9IDY7Ci0KLQkvLyBJZiBubyB1c2VyLWRlZmluZWQgYWRkcmVzcyBpbiB0aGUgcmVnaXN0cnksIHVzZSB0aGUgYWRkcmVzc3MgImJ1cm5lZCIgb24gdGhlIE5JQyBpbnN0ZWFkLgotCXBNYWNBZGRyID0gQWRhcHRlci0+c0xvY2FsUGFyYS5UaGlzTWFjQWRkcmVzczsKLQlwTWFjQWRkcjIgPSBBZGFwdGVyLT5zTG9jYWxQYXJhLlBlcm1hbmVudEFkZHJlc3M7Ci0JaGFsX2dldF9wZXJtYW5lbnRfYWRkcmVzcyggcEh3RGF0YSwgQWRhcHRlci0+c0xvY2FsUGFyYS5QZXJtYW5lbnRBZGRyZXNzICk7Ly8gUmVhZGluZyBldGhlcm5ldCBhZGRyZXNzIGZyb20gRUVQUk9NCi0JaWYgKE9TX01FTU9SWV9DT01QQVJFKHBNYWNBZGRyLCAiXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIiwgTUFDX0FERFJfTEVOR1RIICkpIC8vIElzIGVxdWFsCi0JewotCQltZW1jcHkoIHBNYWNBZGRyLCBwTWFjQWRkcjIsIE1BQ19BRERSX0xFTkdUSCApOwotCX0gZWxzZSB7Ci0JCS8vIFNldCB0aGUgdXNlciBkZWZpbmUgTUFDIGFkZHJlc3MKLQkJaGFsX3NldF9ldGhlcm5ldF9hZGRyZXNzKCBwSHdEYXRhLCBBZGFwdGVyLT5zTG9jYWxQYXJhLlRoaXNNYWNBZGRyZXNzICk7Ci0JfQotCi0JLy9nZXQgY3VycmVudCBhbnRlbm5hCi0JcHNMT0NBTC0+YkFudGVubmFObyA9IGhhbF9nZXRfYW50ZW5uYV9udW1iZXIocEh3RGF0YSk7Ci0jaWZkZWYgX1BFX1NUQVRFX0RVTVBfCi0JV0JERUJVRygoIkRyaXZlciBpbml0LCBhbnRlbm5hIG5vID0gJWRcbiIsIHBzTE9DQUwtPmJBbnRlbm5hTm8pKTsKLSNlbmRpZgotCWhhbF9nZXRfaHdfcmFkaW9fb2ZmKCBwSHdEYXRhICk7Ci0KLQkvLyBXYWl0aW5nIGZvciBIQUwgc2V0dGluZyBPSwotCXdoaWxlICghaGFsX2lkbGUocEh3RGF0YSkpCi0JCU9TX1NMRUVQKDEwMDAwKTsKLQotCU1UT19Jbml0KEFkYXB0ZXIpOwotCi0JSHdSYWRpb09mZiA9IGhhbF9nZXRfaHdfcmFkaW9fb2ZmKCBwSHdEYXRhICk7Ci0JcHNMT0NBTC0+UmFkaW9PZmZTdGF0dXMuYm9Id1JhZGlvT2ZmID0gISFId1JhZGlvT2ZmOwotCi0JaGFsX3NldF9yYWRpb19tb2RlKCBwSHdEYXRhLCAodW5zaWduZWQgY2hhcikocHNMT0NBTC0+UmFkaW9PZmZTdGF0dXMuYm9Td1JhZGlvT2ZmIHx8IHBzTE9DQUwtPlJhZGlvT2ZmU3RhdHVzLmJvSHdSYWRpb09mZikgKTsKLQotCWhhbF9kcml2ZXJfaW5pdF9PSyhwSHdEYXRhKSA9IDE7IC8vIE5vdGlmeSBoYWwgdGhhdCB0aGUgZHJpdmVyIGlzIHJlYWR5IG5vdy4KLQkvL3NldCBhIHR4IHBvd2VyIGZvciByZWZlcmVuY2UuLi4uLgotLy8Jc21lX3NldF90eF9wb3dlcl9sZXZlbChBZGFwdGVyLCAxMik7CUZJWE1FPwotCXJldHVybiBUUlVFOwotCi1lcnJvcjoKLQlzd2l0Y2ggKEluaXRTdGVwKSB7Ci0JY2FzZSA1OgotCWNhc2UgNDoKLQljYXNlIDM6IE1kc19EZXN0cm95KCBBZGFwdGVyICk7Ci0JY2FzZSAyOgotCWNhc2UgMTogV0JMSU5VWF9EZXN0cm95KCBBZGFwdGVyICk7Ci0JCWhhbF9oYWx0KCBwSHdEYXRhLCBOVUxMICk7Ci0JY2FzZSAwOiBicmVhazsKLQl9Ci0KLQlyZXR1cm4gRkFMU0U7Ci19Ci0KLXZvaWQgV0JMSU5VWF9Db25uZWN0U3RhdHVzKFBBREFQVEVSIEFkYXB0ZXIsIHUzMiBmbGFnKQotewotCVBXQkxJTlVYCXBXYkxpbnV4ID0gJkFkYXB0ZXItPldiTGludXg7Ci0KLQlwV2JMaW51eC0+TGlua1N0YXR1cyA9IGZsYWc7IC8vIE9TX0RJU0NPTk5FQ1RFRAlvciAgT1NfQ09OTkVDVEVECi19Ci0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3dibGludXhfZi5oIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2JsaW51eF9mLmgKaW5kZXggNjgyNDBjNS4uODY4ZTg3NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2JsaW51eF9mLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2JsaW51eF9mLmgKQEAgLTEsMjMgKzEsMTYgQEAKKyNpZm5kZWYgX19XQkxJTlVYX0ZfSAorI2RlZmluZSBfX1dCTElOVVhfRl9ICisKKyNpbmNsdWRlICJjb3JlLmgiCisjaW5jbHVkZSAibWRzX3MuaCIKKwogLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAvLyBDb3B5cmlnaHQgKGMpIDE5OTYtMjAwNCBXaW5ib25kIEVsZWN0cm9uaWMgQ29ycG9yYXRpb24KIC8vCiAvLyB3YmxpbnV4X2YuaAogLy8KLXUzMiBXQkxJTlVYX01lbW9yeUFsbG9jKCAgdm9pZCogKlZpcnR1YWxBZGRyZXNzLCAgdTMyIExlbmd0aCApOwotczMyIEVuY2FwQXRvbWljSW5jKCAgUEFEQVBURVIgQWRhcHRlciwgIHZvaWQqIHBBdG9taWMgKTsKLXMzMiBFbmNhcEF0b21pY0RlYyggIFBBREFQVEVSIEFkYXB0ZXIsICB2b2lkKiBwQXRvbWljICk7Ci12b2lkIFdCTGludXhfUmVjZWl2ZVBhY2tldCggIFBBREFQVEVSIEFkYXB0ZXIsICBQUlhMQVlFUjEgcFJ4TGF5ZXIxICk7Ci11bnNpZ25lZCBjaGFyIFdCTElOVVhfSW5pdGlhbCggIFBBREFQVEVSIEFkYXB0ZXIgKTsKIGludCB3YjM1X3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiApOwotdm9pZCBXQkxJTlVYX0dldE5leHRQYWNrZXQoICBQQURBUFRFUiBBZGFwdGVyLCAgUERFU0NSSVBUT1IgcERlcyApOwotdm9pZCBXQkxJTlVYX0dldE5leHRQYWNrZXRDb21wbGV0ZWQoICBQQURBUFRFUiBBZGFwdGVyLCAgUERFU0NSSVBUT1IgcERlcyApOwotdm9pZCBXQkxJTlVYX3N0b3AoICBQQURBUFRFUiBBZGFwdGVyICk7Ci12b2lkIFdCTElOVVhfRGVzdHJveSggIFBBREFQVEVSIEFkYXB0ZXIgKTsKIHZvaWQgd2IzNV9zZXRfbXVsdGljYXN0KCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ICk7CiBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqIHdiMzVfbmV0ZGV2X3N0YXRzKCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ICk7Ci12b2lkIFdCTElOVVhfc3RvcCggIFBBREFQVEVSIEFkYXB0ZXIgKTsKLXZvaWQgV2JXbGFuSGFsdCggIFBBREFQVEVSIEFkYXB0ZXIgKTsKLXZvaWQgV0JMSU5VWF9Db25uZWN0U3RhdHVzKCAgUEFEQVBURVIgQWRhcHRlciwgIHUzMiBmbGFnICk7CiAKLQotCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3dibGludXhfcy5oIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2JsaW51eF9zLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkMmJiNDMuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2JsaW51eF9zLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gd2JsaW51eF9zLmgKLS8vCi0jZGVmaW5lIE9TX01FTU9SWV9BTExPQyggX1YsIF9TICkJV0JMSU5VWF9NZW1vcnlBbGxvYyggX1YsIF9TICkKLSNkZWZpbmUgT1NfTElOS19TVEFUVVMJCQkoQWRhcHRlci0+V2JMaW51eC5MaW5rU3RhdHVzID09IE9TX0NPTk5FQ1RFRCkKLSNkZWZpbmUgT1NfU0VUX1NIVVRET1dOKCBfQSApCQlfQS0+V2JMaW51eC5zaHV0ZG93bj0xCi0jZGVmaW5lIE9TX1NFVF9SRVNVTUUoIF9BICkJCV9BLT5XYkxpbnV4LnNodXRkb3duPTAKLSNkZWZpbmUgT1NfQ09OTkVDVF9TVEFUVVNfSU5ESUNBVEUoIF9BLCBfRiApCQlXQkxJTlVYX0Nvbm5lY3RTdGF0dXMoIF9BLCBfRiApCi0jZGVmaW5lIE9TX0RJU0NPTk5FQ1RFRAkwCi0jZGVmaW5lIE9TX0NPTk5FQ1RFRAkxCi0jZGVmaW5lIE9TX1NUT1AoIF9BICkJV0JMSU5VWF9zdG9wKCBfQSApCi0KLSNkZWZpbmUgT1NfQ1VSUkVOVF9SWF9CWVRFKCBfQSApCQlfQS0+V2JMaW51eC5SeEJ5dGVDb3VudAotI2RlZmluZSBPU19DVVJSRU5UX1RYX0JZVEUoIF9BICkJCV9BLT5XYkxpbnV4LlR4Qnl0ZUNvdW50Ci0jZGVmaW5lIE9TX0VWRU5UX0lORElDQVRFKCBfQSwgX0IsIF9GICkKLSNkZWZpbmUgT1NfUE1LSURfU1RBVFVTX0VWRU5UKCBfQSApCi0jZGVmaW5lIE9TX1JFQ0VJVkVfUEFDS0VUX0lORElDQVRFKCBfQSwgX0QgKQkJV0JMaW51eF9SZWNlaXZlUGFja2V0KCBfQSwgX0QgKQotI2RlZmluZSBPU19SRUNFSVZFXzgwMl8xWF9QQUNLRVRfSU5ESUNBVEUoIF9BLCBfRCApCUVBUF9SZWNlaXZlUGFja2V0KCBfQSwgX0QgKQotI2RlZmluZSBPU19HRVRfUEFDS0VUKCBfQSwgX0QgKQkJCQlXQkxJTlVYX0dldE5leHRQYWNrZXQoIF9BLCBfRCApCi0jZGVmaW5lIE9TX0dFVF9QQUNLRVRfQ09NUExFVEUoIF9BLCBfRCApCVdCTElOVVhfR2V0TmV4dFBhY2tldENvbXBsZXRlZCggX0EsIF9EICkKLSNkZWZpbmUgT1NfU0VORF9SRVNVTFQoIF9BLCBfSUQsIF9SICkKLQotI2RlZmluZSBXQkxJTlVYX1BBQ0tFVF9BUlJBWV9TSVpFCShFVEhFUk5FVF9UWF9ERVNDUklQVE9SUyo0KQotCi10eXBlZGVmIHN0cnVjdCBfV0JMSU5VWAotewotCXNwaW5sb2NrX3QJQXRvbWljU3BpbkxvY2s7Ci0Jc3BpbmxvY2tfdAlTcGluTG9jazsKLQl1MzIJc2h1dGRvd247Ci0KLQlPU19BVE9NSUMJVGhyZWFkQ291bnQ7Ci0KLQl1MzIJTGlua1N0YXR1czsJCS8vIE9TX0RJU0NPTk5FQ1RFRCBvciBPU19DT05ORUNURUQKLQotCXUzMglSeEJ5dGVDb3VudDsKLQl1MzIJVHhCeXRlQ291bnQ7Ci0KLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiX2FycmF5WyBXQkxJTlVYX1BBQ0tFVF9BUlJBWV9TSVpFIF07Ci0Jc3RydWN0IHNrX2J1ZmYgKnBhY2tldF9yZXR1cm47Ci0JczMyCXNrYl9TZXRJbmRleDsKLQlzMzIJc2tiX0dldEluZGV4OwotCXMzMgluZXRpZl9zdGF0ZV9zdG9wOyAvLyAxOiBzdG9wICAwOiBub3JtYWwKLX0gV0JMSU5VWCwgKlBXQkxJTlVYOwotCi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3didXNiLmMgYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YnVzYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwMDNmOWEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YnVzYi5jCkBAIC0wLDAgKzEsNDM4IEBACisvKgorICogQ29weXJpZ2h0IDIwMDggUGF2ZWwgTWFjaGVrIDxwYXZlbEBzdXNlLmN6PgorICoKKyAqIERpc3RyaWJ1dGUgdW5kZXIgR1BMdjIuCisgKi8KKyNpbmNsdWRlIDxuZXQvbWFjODAyMTEuaD4KKyNpbmNsdWRlIDxsaW51eC91c2IuaD4KKworI2luY2x1ZGUgImNvcmUuaCIKKyNpbmNsdWRlICJtZHNfZi5oIgorI2luY2x1ZGUgIm1sbWV0eHJ4X2YuaCIKKyNpbmNsdWRlICJtdG9fZi5oIgorI2luY2x1ZGUgIndiaGFsX2YuaCIKKyNpbmNsdWRlICJ3YmxpbnV4X2YuaCIKKworTU9EVUxFX0FVVEhPUigiT3JpZ2luYWwgYnk6IEplZmYgTGVlPFlZX0xlZUBpc3NjLmNvbS50dz4gQWRhcHRlZCB0byAyLjYueCBieSBDb3N0YW50aW5vIExlYW5kcm8gKFJ4YXJ0IERlc2t0b3ApIDxsZV9jb3N0YW50aW5vQHBpeGFydGFyZ2VudGluYS5jb20uYXI+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIklTODlDMzUgODAyLjExYmcgV0xBTiBVU0IgRHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfVkVSU0lPTigiMC4xIik7CisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9pZCB3YjM1X3RhYmxlW10gX19kZXZpbml0ZGF0YSA9IHsKKwl7VVNCX0RFVklDRSgweDA0MTYsIDB4MDAzNSl9LAorCXtVU0JfREVWSUNFKDB4MThFOCwgMHg2MjAxKX0sCisJe1VTQl9ERVZJQ0UoMHgxOEU4LCAweDYyMDYpfSwKKwl7VVNCX0RFVklDRSgweDE4RTgsIDB4NjIxNyl9LAorCXtVU0JfREVWSUNFKDB4MThFOCwgMHg2MjMwKX0sCisJe1VTQl9ERVZJQ0UoMHgxOEU4LCAweDYyMzMpfSwKKwl7VVNCX0RFVklDRSgweDExMzEsIDB4MjAzNSl9LAorCXsgMCwgfQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRSh1c2IsIHdiMzVfdGFibGUpOworCitzdGF0aWMgc3RydWN0IGllZWU4MDIxMV9yYXRlIHdic29mdF9yYXRlc1tdID0geworCXsgLmJpdHJhdGUgPSAxMCwgLmZsYWdzID0gSUVFRTgwMjExX1JBVEVfU0hPUlRfUFJFQU1CTEUgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgd2Jzb2Z0X2NoYW5uZWxzW10gPSB7CisJeyAuY2VudGVyX2ZyZXEgPSAyNDEyfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaWVlZTgwMjExX3N1cHBvcnRlZF9iYW5kIHdic29mdF9iYW5kXzJHSHogPSB7CisJLmNoYW5uZWxzCT0gd2Jzb2Z0X2NoYW5uZWxzLAorCS5uX2NoYW5uZWxzCT0gQVJSQVlfU0laRSh3YnNvZnRfY2hhbm5lbHMpLAorCS5iaXRyYXRlcwk9IHdic29mdF9yYXRlcywKKwkubl9iaXRyYXRlcwk9IEFSUkFZX1NJWkUod2Jzb2Z0X3JhdGVzKSwKK307CisKK3N0YXRpYyBpbnQgd2Jzb2Z0X2FkZF9pbnRlcmZhY2Uoc3RydWN0IGllZWU4MDIxMV9odyAqZGV2LAorCQkJCSBzdHJ1Y3QgaWVlZTgwMjExX2lmX2luaXRfY29uZiAqY29uZikKK3sKKwlwcmludGsoIndic29mdF9hZGQgaW50ZXJmYWNlIGNhbGxlZFxuIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHdic29mdF9yZW1vdmVfaW50ZXJmYWNlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmRldiwKKwkJCQkgICAgIHN0cnVjdCBpZWVlODAyMTFfaWZfaW5pdF9jb25mICpjb25mKQoreworCXByaW50aygid2Jzb2Z0X3JlbW92ZSBpbnRlcmZhY2UgY2FsbGVkXG4iKTsKK30KKworc3RhdGljIHZvaWQgd2Jzb2Z0X3N0b3Aoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCit7CisJcHJpbnRrKEtFUk5fSU5GTyAiJXMgY2FsbGVkXG4iLCBfX2Z1bmNfXyk7Cit9CisKK3N0YXRpYyBpbnQgd2Jzb2Z0X2dldF9zdGF0cyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCSAgICBzdHJ1Y3QgaWVlZTgwMjExX2xvd19sZXZlbF9zdGF0cyAqc3RhdHMpCit7CisJcHJpbnRrKEtFUk5fSU5GTyAiJXMgY2FsbGVkXG4iLCBfX2Z1bmNfXyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd2Jzb2Z0X2dldF90eF9zdGF0cyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3R4X3F1ZXVlX3N0YXRzICpzdGF0cykKK3sKKwlwcmludGsoS0VSTl9JTkZPICIlcyBjYWxsZWRcbiIsIF9fZnVuY19fKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgd2Jzb2Z0X2NvbmZpZ3VyZV9maWx0ZXIoc3RydWN0IGllZWU4MDIxMV9odyAqZGV2LAorCQkJCSAgICAgdW5zaWduZWQgaW50IGNoYW5nZWRfZmxhZ3MsCisJCQkJICAgICB1bnNpZ25lZCBpbnQgKnRvdGFsX2ZsYWdzLAorCQkJCSAgICAgaW50IG1jX2NvdW50LCBzdHJ1Y3QgZGV2X21jX2xpc3QgKm1jbGlzdCkKK3sKKwl1bnNpZ25lZCBpbnQgYml0X25yLCBuZXdfZmxhZ3M7CisJdTMyIG1jX2ZpbHRlclsyXTsKKwlpbnQgaTsKKworCW5ld19mbGFncyA9IDA7CisKKwlpZiAoKnRvdGFsX2ZsYWdzICYgRklGX1BST01JU0NfSU5fQlNTKSB7CisJCW5ld19mbGFncyB8PSBGSUZfUFJPTUlTQ19JTl9CU1M7CisJCW1jX2ZpbHRlclsxXSA9IG1jX2ZpbHRlclswXSA9IH4wOworCX0gZWxzZSBpZiAoKCp0b3RhbF9mbGFncyAmIEZJRl9BTExNVUxUSSkgfHwgKG1jX2NvdW50ID4gMzIpKSB7CisJCW5ld19mbGFncyB8PSBGSUZfQUxMTVVMVEk7CisJCW1jX2ZpbHRlclsxXSA9IG1jX2ZpbHRlclswXSA9IH4wOworCX0gZWxzZSB7CisJCW1jX2ZpbHRlclsxXSA9IG1jX2ZpbHRlclswXSA9IDA7CisJCWZvciAoaSA9IDA7IGkgPCBtY19jb3VudDsgaSsrKSB7CisJCQlpZiAoIW1jbGlzdCkKKwkJCQlicmVhazsKKwkJCXByaW50aygiU2hvdWxkIGNhbGwgZXRoZXJfY3JjIGhlcmVcbiIpOworCQkJLy9iaXRfbnIgPSBldGhlcl9jcmMoRVRIX0FMRU4sIG1jbGlzdC0+ZG1pX2FkZHIpID4+IDI2OworCQkJYml0X25yID0gMDsKKworCQkJYml0X25yICY9IDB4M0Y7CisJCQltY19maWx0ZXJbYml0X25yID4+IDVdIHw9IDEgPDwgKGJpdF9uciAmIDMxKTsKKwkJCW1jbGlzdCA9IG1jbGlzdC0+bmV4dDsKKwkJfQorCX0KKworCWRldi0+ZmxhZ3MgJj0gfklFRUU4MDIxMV9IV19SWF9JTkNMVURFU19GQ1M7CisKKwkqdG90YWxfZmxhZ3MgPSBuZXdfZmxhZ3M7Cit9CisKK3N0YXRpYyBpbnQgd2Jzb2Z0X3R4KHN0cnVjdCBpZWVlODAyMTFfaHcgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKnByaXYgPSBkZXYtPnByaXY7CisKKwlNTE1FU2VuZEZyYW1lKHByaXYsIHNrYi0+ZGF0YSwgc2tiLT5sZW4sIEZSQU1FX1RZUEVfODAyXzExX01BTkFHRU1FTlQpOworCisJcmV0dXJuIE5FVERFVl9UWF9PSzsKK30KKworCitzdGF0aWMgaW50IHdic29mdF9zdGFydChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpkZXYpCit7CisJc3RydWN0IHdic29mdF9wcml2ICpwcml2ID0gZGV2LT5wcml2OworCisJcHJpdi0+ZW5hYmxlZCA9IHRydWU7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3YnNvZnRfY29uZmlnKHN0cnVjdCBpZWVlODAyMTFfaHcgKmRldiwgdTMyIGNoYW5nZWQpCit7CisJc3RydWN0IHdic29mdF9wcml2ICpwcml2ID0gZGV2LT5wcml2OworCXN0cnVjdCBpZWVlODAyMTFfY29uZiAqY29uZiA9ICZkZXYtPmNvbmY7CisJQ2hhbkluZm8gY2g7CisKKwlwcmludGsoIndic29mdF9jb25maWcgY2FsbGVkXG4iKTsKKworCWNoLmJhbmQgPSAxOworCWNoLkNoYW5ObyA9IDE7CS8qIFNob3VsZCB1c2UgY2hhbm5lbF9udW0sIG9yIHNvbWV0aGluZywgYXMgdGhhdCBpcyBhbHJlYWR5IHByZS10cmFuc2xhdGVkICovCisKKworCWhhbF9zZXRfY3VycmVudF9jaGFubmVsKCZwcml2LT5zSHdEYXRhLCBjaCk7CisJaGFsX3NldF9iZWFjb25fcGVyaW9kKCZwcml2LT5zSHdEYXRhLCBjb25mLT5iZWFjb25faW50KTsKKy8vCWhhbF9zZXRfY2FwX2luZm8oJnByaXYtPnNId0RhdGEsID8/ICk7CisvLyBoYWxfc2V0X3NzaWQocGh3X2RhdGFfdCBwSHdEYXRhLCAgdTggKiBwc3NpZCwgIHU4IHNzaWRfbGVuKTsgPz8KKwloYWxfc2V0X2FjY2VwdF9icm9hZGNhc3QoJnByaXYtPnNId0RhdGEsIDEpOworCWhhbF9zZXRfYWNjZXB0X3Byb21pc2N1b3VzKCZwcml2LT5zSHdEYXRhLCAgMSk7CisJaGFsX3NldF9hY2NlcHRfbXVsdGljYXN0KCZwcml2LT5zSHdEYXRhLCAgMSk7CisJaGFsX3NldF9hY2NlcHRfYmVhY29uKCZwcml2LT5zSHdEYXRhLCAgMSk7CisJaGFsX3NldF9yYWRpb19tb2RlKCZwcml2LT5zSHdEYXRhLCAgMCk7CisJLy9oYWxfc2V0X2FudGVubmFfbnVtYmVyKCAgcGh3X2RhdGFfdCBwSHdEYXRhLCB1OCBudW1iZXIgKQorCS8vaGFsX3NldF9yZl9wb3dlcihwaHdfZGF0YV90IHBId0RhdGEsIHU4IFBvd2VySW5kZXgpCisKKworLy8JaGFsX3N0YXJ0X2JzcygmcHJpdi0+c0h3RGF0YSwgV0xBTl9CU1NUWVBFX0lORlJBU1RSVUNUVVJFKTsJPz8KKworLy92b2lkIGhhbF9zZXRfcmF0ZXMocGh3X2RhdGFfdCBwSHdEYXRhLCB1OCAqIHBic3NfcmF0ZXMsCisvLwkJICAgdTggbGVuZ3RoLCB1bnNpZ25lZCBjaGFyIGJhc2ljX3JhdGVfc2V0KQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd2Jzb2Z0X2NvbmZpZ19pbnRlcmZhY2Uoc3RydWN0IGllZWU4MDIxMV9odyAqZGV2LAorCQkJCSAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAorCQkJCSAgICBzdHJ1Y3QgaWVlZTgwMjExX2lmX2NvbmYgKmNvbmYpCit7CisJcHJpbnRrKCJ3YnNvZnRfY29uZmlnX2ludGVyZmFjZSBjYWxsZWRcbiIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdTY0IHdic29mdF9nZXRfdHNmKHN0cnVjdCBpZWVlODAyMTFfaHcgKmRldikKK3sKKwlwcmludGsoIndic29mdF9nZXRfdHNmIGNhbGxlZFxuIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX29wcyB3YnNvZnRfb3BzID0geworCS50eAkJCT0gd2Jzb2Z0X3R4LAorCS5zdGFydAkJCT0gd2Jzb2Z0X3N0YXJ0LAkJLyogU3RhcnQgY2FuIGJlIHByZXR0eSBtdWNoIGVtcHR5IGFzIHdlIGRvIHdiMzVfaHdfaW5pdCgpIGR1cmluZyBwcm9iZT8gKi8KKwkuc3RvcAkJCT0gd2Jzb2Z0X3N0b3AsCisJLmFkZF9pbnRlcmZhY2UJCT0gd2Jzb2Z0X2FkZF9pbnRlcmZhY2UsCisJLnJlbW92ZV9pbnRlcmZhY2UJPSB3YnNvZnRfcmVtb3ZlX2ludGVyZmFjZSwKKwkuY29uZmlnCQkJPSB3YnNvZnRfY29uZmlnLAorCS5jb25maWdfaW50ZXJmYWNlCT0gd2Jzb2Z0X2NvbmZpZ19pbnRlcmZhY2UsCisJLmNvbmZpZ3VyZV9maWx0ZXIJPSB3YnNvZnRfY29uZmlndXJlX2ZpbHRlciwKKwkuZ2V0X3N0YXRzCQk9IHdic29mdF9nZXRfc3RhdHMsCisJLmdldF90eF9zdGF0cwkJPSB3YnNvZnRfZ2V0X3R4X3N0YXRzLAorCS5nZXRfdHNmCQk9IHdic29mdF9nZXRfdHNmLAorLy8gY29uZl90eDogaGFsX3NldF9jd21pbigpL2hhbF9zZXRfY3dtYXg7Cit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB3YjM1X2h3X2luaXQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCit7CisJc3RydWN0IHdic29mdF9wcml2ICpwcml2ID0gaHctPnByaXY7CisJcGh3X2RhdGFfdAlwSHdEYXRhOworCXU4CQkqcE1hY0FkZHI7CisJdTgJCSpwTWFjQWRkcjI7CisJdTMyCQlJbml0U3RlcCA9IDA7CisJdTgJCUVFUFJPTV9yZWdpb247CisJdTgJCUh3UmFkaW9PZmY7CisKKwkvLworCS8vIFNldHRpbmcgZGVmYXVsdCB2YWx1ZSBmb3IgTGludXgKKwkvLworCXByaXYtPnNMb2NhbFBhcmEucmVnaW9uX0lORiA9IFJFR0lPTl9BVVRPOworCXByaXYtPnNMb2NhbFBhcmEuVHhSYXRlTW9kZSA9IFJBVEVfQVVUTzsKKwlwcml2LT5zTG9jYWxQYXJhLmJNYWNPcGVyYXRpb25Nb2RlID0gTU9ERV84MDJfMTFfQkc7CS8vIEIvRyBtb2RlCisJcHJpdi0+TWRzLlR4UlRTVGhyZXNob2xkID0gREVGQVVMVF9SVFNUaHJlc2hvbGQ7CisJcHJpdi0+TWRzLlR4RnJhZ21lbnRUaHJlc2hvbGQgPSBERUZBVUxUX0ZSQUdNRU5UX1RIUkVTSE9MRDsKKwloYWxfc2V0X3BoeV90eXBlKCAmcHJpdi0+c0h3RGF0YSwgUkZfV0JfMjQyXzEgKTsKKwlwcml2LT5zTG9jYWxQYXJhLk1UVXNpemUgPSBNQVhfRVRIRVJORVRfUEFDS0VUX1NJWkU7CisJcHJpdi0+c0xvY2FsUGFyYS5iUHJlYW1ibGVNb2RlID0gQVVUT19NT0RFOworCXByaXYtPnNMb2NhbFBhcmEuUmFkaW9PZmZTdGF0dXMuYm9Td1JhZGlvT2ZmID0gZmFsc2U7CisJcEh3RGF0YSA9ICZwcml2LT5zSHdEYXRhOworCWhhbF9zZXRfcGh5X3R5cGUoIHBId0RhdGEsIFJGX0RFQ0lERV9CWV9JTkYgKTsKKworCS8vYWRkZWQgYnkgd3MgZm9yIHdlcCBrZXkgZXJyb3IgZGV0ZWN0aW9uCisJcHJpdi0+c0xvY2FsUGFyYS5iV2VwS2V5RXJyb3I9IGZhbHNlOworCXByaXYtPnNMb2NhbFBhcmEuYlRvU2VsZlBhY2tldFJlY2VpdmVkID0gZmFsc2U7CisJcHJpdi0+c0xvY2FsUGFyYS5XZXBLZXlEZXRlY3RUaW1lckNvdW50PSAyICogMTAwOyAvLy8gMiBzZWNvbmRzCisKKwkvLyBJbml0aWFsIFVTQiBoYWwKKwlJbml0U3RlcCA9IDE7CisJcEh3RGF0YSA9ICZwcml2LT5zSHdEYXRhOworCWlmICghaGFsX2luaXRfaGFyZHdhcmUoaHcpKQorCQlnb3RvIGVycm9yOworCisJRUVQUk9NX3JlZ2lvbiA9IGhhbF9nZXRfcmVnaW9uX2Zyb21fRUVQUk9NKCBwSHdEYXRhICk7CisJaWYgKEVFUFJPTV9yZWdpb24gIT0gUkVHSU9OX0FVVE8pCisJCXByaXYtPnNMb2NhbFBhcmEucmVnaW9uID0gRUVQUk9NX3JlZ2lvbjsKKwllbHNlIHsKKwkJaWYgKHByaXYtPnNMb2NhbFBhcmEucmVnaW9uX0lORiAhPSBSRUdJT05fQVVUTykKKwkJCXByaXYtPnNMb2NhbFBhcmEucmVnaW9uID0gcHJpdi0+c0xvY2FsUGFyYS5yZWdpb25fSU5GOworCQllbHNlCisJCQlwcml2LT5zTG9jYWxQYXJhLnJlZ2lvbiA9IFJFR0lPTl9VU0E7CS8vZGVmYXVsdCBzZXR0aW5nCisJfQorCisJLy8gR2V0IFNvZnR3YXJlIHNldHRpbmcgZmxhZyBmcm9tIGhhbAorCXByaXYtPnNMb2NhbFBhcmEuYm9BbnRlbm5hRGl2ZXJzaXR5ID0gZmFsc2U7CisJaWYgKGhhbF9zb2Z0d2FyZV9zZXQocEh3RGF0YSkgJiAweDAwMDAwMDAxKQorCQlwcml2LT5zTG9jYWxQYXJhLmJvQW50ZW5uYURpdmVyc2l0eSA9IHRydWU7CisKKwkvLworCS8vIEZvciBUUyBtb2R1bGUKKwkvLworCUluaXRTdGVwID0gMjsKKworCS8vIEZvciBNRFMgbW9kdWxlCisJSW5pdFN0ZXAgPSAzOworCU1kc19pbml0aWFsKHByaXYpOworCisJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBJbml0aWFsaXplIHRoZSBTTUUsIFNDQU4sIE1MTUUsIFJPQU0KKwkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCUluaXRTdGVwID0gNDsKKwlJbml0U3RlcCA9IDU7CisJSW5pdFN0ZXAgPSA2OworCisJLy8gSWYgbm8gdXNlci1kZWZpbmVkIGFkZHJlc3MgaW4gdGhlIHJlZ2lzdHJ5LCB1c2UgdGhlIGFkZHJlc3NzICJidXJuZWQiIG9uIHRoZSBOSUMgaW5zdGVhZC4KKwlwTWFjQWRkciA9IHByaXYtPnNMb2NhbFBhcmEuVGhpc01hY0FkZHJlc3M7CisJcE1hY0FkZHIyID0gcHJpdi0+c0xvY2FsUGFyYS5QZXJtYW5lbnRBZGRyZXNzOworCWhhbF9nZXRfcGVybWFuZW50X2FkZHJlc3MoIHBId0RhdGEsIHByaXYtPnNMb2NhbFBhcmEuUGVybWFuZW50QWRkcmVzcyApOy8vIFJlYWRpbmcgZXRoZXJuZXQgYWRkcmVzcyBmcm9tIEVFUFJPTQorCWlmIChtZW1jbXAocE1hY0FkZHIsICJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiLCBNQUNfQUREUl9MRU5HVEgpID09IDApCisJCW1lbWNweShwTWFjQWRkciwgcE1hY0FkZHIyLCBNQUNfQUREUl9MRU5HVEgpOworCWVsc2UgeworCQkvLyBTZXQgdGhlIHVzZXIgZGVmaW5lIE1BQyBhZGRyZXNzCisJCWhhbF9zZXRfZXRoZXJuZXRfYWRkcmVzcyhwSHdEYXRhLCBwcml2LT5zTG9jYWxQYXJhLlRoaXNNYWNBZGRyZXNzKTsKKwl9CisKKwkvL2dldCBjdXJyZW50IGFudGVubmEKKwlwcml2LT5zTG9jYWxQYXJhLmJBbnRlbm5hTm8gPSBoYWxfZ2V0X2FudGVubmFfbnVtYmVyKHBId0RhdGEpOworI2lmZGVmIF9QRV9TVEFURV9EVU1QXworCVdCREVCVUcoKCJEcml2ZXIgaW5pdCwgYW50ZW5uYSBubyA9ICVkXG4iLCBwc0xPQ0FMLT5iQW50ZW5uYU5vKSk7CisjZW5kaWYKKwloYWxfZ2V0X2h3X3JhZGlvX29mZiggcEh3RGF0YSApOworCisJLy8gV2FpdGluZyBmb3IgSEFMIHNldHRpbmcgT0sKKwl3aGlsZSAoIWhhbF9pZGxlKHBId0RhdGEpKQorCQltc2xlZXAoMTApOworCisJTVRPX0luaXQocHJpdik7CisKKwlId1JhZGlvT2ZmID0gaGFsX2dldF9od19yYWRpb19vZmYoIHBId0RhdGEgKTsKKwlwcml2LT5zTG9jYWxQYXJhLlJhZGlvT2ZmU3RhdHVzLmJvSHdSYWRpb09mZiA9ICEhSHdSYWRpb09mZjsKKworCWhhbF9zZXRfcmFkaW9fbW9kZSggcEh3RGF0YSwgKHVuc2lnbmVkIGNoYXIpKHByaXYtPnNMb2NhbFBhcmEuUmFkaW9PZmZTdGF0dXMuYm9Td1JhZGlvT2ZmIHx8IHByaXYtPnNMb2NhbFBhcmEuUmFkaW9PZmZTdGF0dXMuYm9Id1JhZGlvT2ZmKSApOworCisJaGFsX2RyaXZlcl9pbml0X09LKHBId0RhdGEpID0gMTsgLy8gTm90aWZ5IGhhbCB0aGF0IHRoZSBkcml2ZXIgaXMgcmVhZHkgbm93LgorCS8vc2V0IGEgdHggcG93ZXIgZm9yIHJlZmVyZW5jZS4uLi4uCisvLwlzbWVfc2V0X3R4X3Bvd2VyX2xldmVsKHByaXYsIDEyKTsJRklYTUU/CisJcmV0dXJuIHRydWU7CisKK2Vycm9yOgorCXN3aXRjaCAoSW5pdFN0ZXApIHsKKwljYXNlIDU6CisJY2FzZSA0OgorCWNhc2UgMzogTWRzX0Rlc3Ryb3koIHByaXYgKTsKKwljYXNlIDI6CisJY2FzZSAxOiBoYWxfaGFsdCggcEh3RGF0YSwgTlVMTCApOworCWNhc2UgMDogYnJlYWs7CisJfQorCisJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgaW50IHdiMzVfcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZF90YWJsZSkKK3sKKwlQV0JVU0IJCXBXYlVzYjsKKyAgICAgICAgc3RydWN0IHVzYl9ob3N0X2ludGVyZmFjZSAqaW50ZXJmYWNlOworCXN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZW5kcG9pbnQ7CisJdTMyCWx0bXA7CisJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpOworCXN0cnVjdCB3YnNvZnRfcHJpdiAqcHJpdjsKKwlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpkZXY7CisJaW50IGVycjsKKworCXVzYl9nZXRfZGV2KHVkZXYpOworCisJLy8gMjAwNjA2MzAuMiBDaGVjayB0aGUgZGV2aWNlIGlmIGl0IGFscmVhZHkgYmUgb3BlbmVkCisJZXJyID0gdXNiX2NvbnRyb2xfbXNnKHVkZXYsIHVzYl9yY3ZjdHJscGlwZSggdWRldiwgMCApLAorCQkJICAgICAgMHgwMSwgVVNCX1RZUEVfVkVORE9SfFVTQl9SRUNJUF9ERVZJQ0V8VVNCX0RJUl9JTiwKKwkJCSAgICAgIDB4MCwgMHg0MDAsICZsdG1wLCA0LCBIWioxMDAgKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycm9yOworCisJbHRtcCA9IGNwdV90b19sZTMyKGx0bXApOworCWlmIChsdG1wKSB7ICAvLyBJcyBhbHJlYWR5IGluaXRpYWxpemVkPworCQllcnIgPSAtRUJVU1k7CisJCWdvdG8gZXJyb3I7CisJfQorCisJZGV2ID0gaWVlZTgwMjExX2FsbG9jX2h3KHNpemVvZigqcHJpdiksICZ3YnNvZnRfb3BzKTsKKwlpZiAoIWRldikKKwkJZ290byBlcnJvcjsKKworCXByaXYgPSBkZXYtPnByaXY7CisKKwlzcGluX2xvY2tfaW5pdCgmcHJpdi0+U3BpbkxvY2spOworCisJcFdiVXNiID0gJnByaXYtPnNId0RhdGEuV2JVc2I7CisJcFdiVXNiLT51ZGV2ID0gdWRldjsKKworICAgICAgICBpbnRlcmZhY2UgPSBpbnRmLT5jdXJfYWx0c2V0dGluZzsKKyAgICAgICAgZW5kcG9pbnQgPSAmaW50ZXJmYWNlLT5lbmRwb2ludFswXS5kZXNjOworCisJaWYgKGVuZHBvaW50WzJdLndNYXhQYWNrZXRTaXplID09IDUxMikgeworCQlwcmludGsoIlt3MzV1bmRdIFdvcmtpbmcgb24gVVNCIDIuMFxuIik7CisJCXBXYlVzYi0+SXNVc2IyMCA9IDE7CisJfQorCisJaWYgKCF3YjM1X2h3X2luaXQoZGV2KSkgeworCQllcnIgPSAtRUlOVkFMOworCQlnb3RvIGVycm9yX2ZyZWVfaHc7CisJfQorCisJU0VUX0lFRUU4MDIxMV9ERVYoZGV2LCAmdWRldi0+ZGV2KTsKKwl7CisJCXBod19kYXRhX3QgcEh3RGF0YSA9ICZwcml2LT5zSHdEYXRhOworCQl1bnNpZ25lZCBjaGFyCQlkZXZfYWRkcltNQVhfQUREUl9MRU5dOworCQloYWxfZ2V0X3Blcm1hbmVudF9hZGRyZXNzKHBId0RhdGEsIGRldl9hZGRyKTsKKwkJU0VUX0lFRUU4MDIxMV9QRVJNX0FERFIoZGV2LCBkZXZfYWRkcik7CisJfQorCisJZGV2LT5leHRyYV90eF9oZWFkcm9vbSA9IDEyOwkvKiBGSVhNRSAqLworCWRldi0+ZmxhZ3MgPSAwOworCisJZGV2LT5jaGFubmVsX2NoYW5nZV90aW1lID0gMTAwMDsKKwlkZXYtPnF1ZXVlcyA9IDE7CisKKwlkZXYtPndpcGh5LT5iYW5kc1tJRUVFODAyMTFfQkFORF8yR0haXSA9ICZ3YnNvZnRfYmFuZF8yR0h6OworCisJZXJyID0gaWVlZTgwMjExX3JlZ2lzdGVyX2h3KGRldik7CisJaWYgKGVycikKKwkJZ290byBlcnJvcl9mcmVlX2h3OworCisJdXNiX3NldF9pbnRmZGF0YShpbnRmLCBwcml2KTsKKworCXJldHVybiAwOworCitlcnJvcl9mcmVlX2h3OgorCWllZWU4MDIxMV9mcmVlX2h3KGRldik7CitlcnJvcjoKKwl1c2JfcHV0X2Rldih1ZGV2KTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCB3YjM1X2h3X2hhbHQoc3RydWN0IHdic29mdF9wcml2ICphZGFwdGVyKQoreworCU1kc19EZXN0cm95KCBhZGFwdGVyICk7CisKKwkvLyBUdXJuIG9mZiBSeCBhbmQgVHggaGFyZHdhcmUgYWJpbGl0eQorCWhhbF9zdG9wKCAmYWRhcHRlci0+c0h3RGF0YSApOworI2lmZGVmIF9QRV9VU0JfSU5JX0RVTVBfCisJV0JERUJVRygoIlt3MzV1bmRdIEhhbF9zdG9wIE8uSy5cbiIpKTsKKyNlbmRpZgorCW1zbGVlcCgxMDApOy8vIFdhaXRpbmcgSXJwIGNvbXBsZXRlZAorCisJLy8gSGFsdCB0aGUgSEFMCisJaGFsX2hhbHQoJmFkYXB0ZXItPnNId0RhdGEsIE5VTEwpOworfQorCisKK3N0YXRpYyB2b2lkIHdiMzVfZGlzY29ubmVjdChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKK3sKKwlzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKnByaXYgPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOworCisJd2IzNV9od19oYWx0KHByaXYpOworCisJdXNiX3NldF9pbnRmZGF0YShpbnRmLCBOVUxMKTsKKwl1c2JfcHV0X2RldihpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpKTsKK30KKworc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIHdiMzVfZHJpdmVyID0geworCS5uYW1lCQk9ICJ3MzV1bmQiLAorCS5pZF90YWJsZQk9IHdiMzVfdGFibGUsCisJLnByb2JlCQk9IHdiMzVfcHJvYmUsCisJLmRpc2Nvbm5lY3QJPSB3YjM1X2Rpc2Nvbm5lY3QsCit9OworCitzdGF0aWMgaW50IF9faW5pdCB3YjM1X2luaXQodm9pZCkKK3sKKwlyZXR1cm4gdXNiX3JlZ2lzdGVyKCZ3YjM1X2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB3YjM1X2V4aXQodm9pZCkKK3sKKwl1c2JfZGVyZWdpc3Rlcigmd2IzNV9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdCh3YjM1X2luaXQpOworbW9kdWxlX2V4aXQod2IzNV9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3didXNiX3MuaCBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3didXNiX3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZGU5MzYwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2J1c2Jfcy5oCkBAIC0wLDAgKzEsMzcgQEAKKy8vKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKworLy8gQ29weXJpZ2h0IChjKSAxOTk2LTIwMDQgV2luYm9uZCBFbGVjdHJvbmljIENvcnBvcmF0aW9uCisvLworLy8gIE1vZHVsZSBOYW1lOgorLy8gICAgd2J1c2Jfcy5oCisvLworLy8gIEFic3RyYWN0OgorLy8gICAgTGludXggZHJpdmVyLgorLy8KKy8vICBBdXRob3I6CisvLworLy8rKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKworCisjaWZuZGVmIF9fV0lOQk9ORF9XQlVTQl9TX0gKKyNkZWZpbmUgX19XSU5CT05EX1dCVVNCX1NfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBSV19DT05URVhUIC0tCisvLworLy8gIFVzZWQgdG8gdHJhY2sgZHJpdmVyLWdlbmVyYXRlZCBpbyBpcnBzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordHlwZWRlZiBzdHJ1Y3QgX1JXX0NPTlRFWFQKK3sKKwl2b2lkKgkJCXBId0RhdGE7CisJc3RydWN0IHVyYgkJKnVyYjsKKwl2b2lkKgkJCXBDYWxsQmFja0Z1bmN0aW9uUGFyYW1ldGVyOworfSBSV19DT05URVhULCAqUFJXX0NPTlRFWFQ7CisKK3R5cGVkZWYgc3RydWN0IF9XQlVTQiB7CisJdTMyCUlzVXNiMjA7CisJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXY7CisJdTMyCURldGVjdENvdW50OworfSBXQlVTQiwgKlBXQlVTQjsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvS2NvbmZpZwppbmRleCAyNDI1ZDg2Li45OTU5YjY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9LY29uZmlnCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL0tjb25maWcKQEAgLTEsOSArMSw5IEBACiBjb25maWcgUFJJU00yX1VTQgotCXRyaXN0YXRlICJQcmlzbTIuNSBVU0IgZHJpdmVyIgotCWRlcGVuZHMgb24gV0xBTl84MDIxMSAmJiBVU0IKKwl0cmlzdGF0ZSAiUHJpc20yLjUvMyBVU0IgZHJpdmVyIgorCWRlcGVuZHMgb24gV0xBTl84MDIxMSAmJiBVU0IgJiYgV0lSRUxFU1NfRVhUCiAJZGVmYXVsdCBuCiAJLS0taGVscC0tLQotCSAgVGhpcyBpcyB0aGUgd2xhbi1uZyBwcmlzbSAyLjUgVVNCIGRyaXZlciBmb3IgYSB3aWRlIHJhbmdlIG9mCisJICBUaGlzIGlzIHRoZSB3bGFuLW5nIHByaXNtIDIuNS8zIFVTQiBkcml2ZXIgZm9yIGEgd2lkZSByYW5nZSBvZgogCSAgb2xkIFVTQiB3aXJlbGVzcyBkZXZpY2VzLgogCiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL01ha2VmaWxlCmluZGV4IDc3N2I1MTEuLjVlZGFjNWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL01ha2VmaWxlCkBAIC0xLDcgKzEsNiBAQAogb2JqLSQoQ09ORklHX1BSSVNNMl9VU0IpICs9IHByaXNtMl91c2Iubwotb2JqLSQoQ09ORklHX1BSSVNNMl9VU0IpICs9IHA4MDIxMS5vCiAKLXA4MDIxMS1vYmpzIDo9IHA4MDIxMW1vZC5vIFwKK3ByaXNtMl91c2Itb2JqcyA6PSBwcmlzbTJ1c2IubyBcCiAJCXA4MDIxMWNvbnYubyBcCiAJCXA4MDIxMXJlcS5vIFwKIAkJcDgwMjExd2VwLm8gXApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvUkVBRE1FIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvUkVBRE1FCmluZGV4IGY1MGU0ZWIuLjljMTBkYmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL1JFQURNRQorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9SRUFETUUKQEAgLTMsNiArMyw1IEBACiAJLSBzcGFyc2Ugd2FybmluZ3MKIAktIExpbmRlbnQgY2xlYW51cHMKIAktIG1vdmUgdG8gdXNlIHRoZSBpbi1rZXJuZWwgd2lyZWxlc3Mgc3RhY2sKLQktIHBvc3NpYmxlIGVuYWJsZSB0aGUgcGNtY2lhIGFuZCBwY2kgcG9ydGlvbnMgb2YgdGhlIGRyaXZlcgogCiBQbGVhc2Ugc2VuZCBhbGwgcGF0Y2hlcyB0byBHcmVnIEtyb2FoLUhhcnRtYW4gPGdyZWdAa3JvYWguY29tPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvaGZhMzg0eC5jIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvaGZhMzg0eC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNGRmM2ZkLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL2hmYTM4NHguYworKysgL2Rldi9udWxsCkBAIC0xLDQwMTggKzAsMCBAQAotLyogc3JjL3ByaXNtMi9kcml2ZXIvaGZhMzg0eC5jCi0qCi0qIEltcGxlbWVudHMgdGhlIGZ1bmN0aW9ucyBvZiB0aGUgSW50ZXJzaWwgaGZhMzg0eCBNQUMKLSoKLSogQ29weXJpZ2h0IChDKSAxOTk5IEFic29sdXRlVmFsdWUgU3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSoKLSogbGludXgtd2xhbgotKgotKiAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljCi0qICAgTGljZW5zZSBWZXJzaW9uIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8KLSoKLSogICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMKLSogICBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZQotKiAgIHRlcm1zIG9mIHRoZSBHTlUgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyICh0aGUgIkdQTCIpLCBpbiB3aGljaAotKiAgIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkIG9mIHRoZQotKiAgIGFib3ZlLiAgSWYgeW91IHdpc2ggdG8gYWxsb3cgdGhlIHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlCi0qICAgb25seSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdQTCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0byB1c2UKLSogICB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSBNUEwsIGluZGljYXRlIHlvdXIgZGVjaXNpb24KLSogICBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQotKiAgIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwuICBJZiB5b3UgZG8gbm90IGRlbGV0ZQotKiAgIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzCi0qICAgZmlsZSB1bmRlciBlaXRoZXIgdGhlIE1QTCBvciB0aGUgR1BMLgotKgotKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKgotKiBJbnF1aXJpZXMgcmVnYXJkaW5nIHRoZSBsaW51eC13bGFuIE9wZW4gU291cmNlIHByb2plY3QgY2FuIGJlCi0qIG1hZGUgZGlyZWN0bHkgdG86Ci0qCi0qIEFic29sdXRlVmFsdWUgU3lzdGVtcyBJbmMuCi0qIGluZm9AbGludXgtd2xhbi5jb20KLSogaHR0cDovL3d3dy5saW51eC13bGFuLmNvbQotKgotKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKgotKiBQb3J0aW9ucyBvZiB0aGUgZGV2ZWxvcG1lbnQgb2YgdGhpcyBzb2Z0d2FyZSB3ZXJlIGZ1bmRlZCBieQotKiBJbnRlcnNpbCBDb3Jwb3JhdGlvbiBhcyBwYXJ0IG9mIFBSSVNNKFIpIGNoaXBzZXQgcHJvZHVjdCBkZXZlbG9wbWVudC4KLSoKLSogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSoKLSogVGhpcyBmaWxlIGltcGxlbWVudHMgZnVuY3Rpb25zIHRoYXQgY29ycmVzcG9uZCB0byB0aGUgcHJpc20yL2hmYTM4NHgKLSogODAyLjExIE1BQyBoYXJkd2FyZSBhbmQgZmlybXdhcmUgaG9zdCBpbnRlcmZhY2UuCi0qCi0qIFRoZSBmdW5jdGlvbnMgY2FuIGJlIGNvbnNpZGVyZWQgdG8gcmVwcmVzZW50IHNldmVyYWwgbGV2ZWxzIG9mCi0qIGFic3RyYWN0aW9uLiAgVGhlIGxvd2VzdCBsZXZlbCBmdW5jdGlvbnMgYXJlIHNpbXBseSBDLWNhbGxhYmxlIHdyYXBwZXJzCi0qIGFyb3VuZCB0aGUgcmVnaXN0ZXIgYWNjZXNzZXMuICBUaGUgbmV4dCBoaWdoZXIgbGV2ZWwgcmVwcmVzZW50cyBDLWNhbGxhYmxlCi0qIHByaXNtMiBBUEkgZnVuY3Rpb25zIHRoYXQgbWF0Y2ggdGhlIEludGVyc2lsIGRvY3VtZW50YXRpb24gYXMgY2xvc2VseQotKiBhcyBpcyByZWFzb25hYmxlLiAgVGhlIG5leHQgaGlnaGVyIGxheWVyIGltcGxlbWVudHMgY29tbW9uIHNlcXVlbmNlcwotKiBvZiBpbnZva2F0aW9ucyBvZiB0aGUgQVBJIGxheWVyIChlLmcuIHdyaXRlIHRvIGJhcCwgZm9sbG93ZWQgYnkgY21kKS4KLSoKLSogQ29tbW9uIHNlcXVlbmNlczoKLSogaGZhMzg0eF9kcnZyX3h4eAlIaWdoZXN0IGxldmVsIGFic3RyYWN0aW9ucyBwcm92aWRlZCBieSB0aGUKLSoJCQloZmEzODR4IGNvZGUuICBUaGV5IGFyZSBkcml2ZXIgZGVmaW5lZCB3cmFwcGVycwotKgkJCWZvciBjb21tb24gc2VxdWVuY2VzLiAgVGhlc2UgZnVuY3Rpb25zIGdlbmVyYWxseQotKgkJCXVzZSB0aGUgc2VydmljZXMgb2YgdGhlIGxvd2VyIGxldmVscy4KLSoKLSogaGZhMzg0eF9kcnZyX3h4eGNvbmZpZyAgQW4gZXhhbXBsZSBvZiB0aGUgZHJ2ciBsZXZlbCBhYnN0cmFjdGlvbi4gVGhlc2UKLSoJCQlmdW5jdGlvbnMgYXJlIHdyYXBwZXJzIGZvciB0aGUgUklEIGdldC9zZXQKLSoJCQlzZXF1ZW5jZS4gVGhleSAJY2FsbCBjb3B5X1t0b3xmcm9tXV9iYXAoKSBhbmQKLSoJCQljbWRfYWNjZXNzKCkuCVRoZXNlIGZ1bmN0aW9ucyBvcGVyYXRlIG9uIHRoZQotKgkJCVJJRHMgYW5kIGJ1ZmZlcnMgd2l0aG91dCB2YWxpZGF0aW9uLiAgVGhlIGNhbGxlcgotKgkJCWlzIHJlc3BvbnNpYmxlIGZvciB0aGF0LgotKgotKiBBUEkgd3JhcHBlciBmdW5jdGlvbnM6Ci0qIGhmYTM4NHhfY21kX3h4eAlmdW5jdGlvbnMgdGhhdCBwcm92aWRlIGFjY2VzcyB0byB0aGUgZi93IGNvbW1hbmRzLgotKgkJCVRoZSBmdW5jdGlvbiBhcmd1bWVudHMgY29ycmVzcG9uZCB0byBlYWNoIGNvbW1hbmQKLSoJCQlhcmd1bWVudCwgZXZlbiBjb21tYW5kIGFyZ3VtZW50cyB0aGF0IGdldCBwYWNrZWQKLSoJCQlpbnRvIHNpbmdsZSByZWdpc3RlcnMuICBUaGVzZSBmdW5jdGlvbnMgX2p1c3RfCi0qCQkJaXNzdWUgdGhlIGNvbW1hbmQgYnkgc2V0dGluZyB0aGUgY21kL3Bhcm0gcmVncwotKgkJCSYgcmVhZGluZyB0aGUgc3RhdHVzL3Jlc3AgcmVncy4gIEFkZGl0aW9uYWwKLSoJCQlhY3Rpdml0aWVzIHJlcXVpcmVkIHRvIGZ1bGx5IHVzZSBhIGNvbW1hbmQKLSoJCQkocmVhZC93cml0ZSBmcm9tL3RvIGJhcCwgZ2V0L3NldCBpbnQgc3RhdHVzIGV0Yy4pCi0qCQkJYXJlIGltcGxlbWVudGVkIHNlcGFyYXRlbHkuICBUaGluayBvZiB0aGVzZSBhcwotKgkJCUMtY2FsbGFibGUgcHJpc20yIGNvbW1hbmRzLgotKgotKiBMb3dlc3QgTGF5ZXIgRnVuY3Rpb25zOgotKiBoZmEzODR4X2RvY21kX3h4eAlUaGVzZSBmdW5jdGlvbnMgaW1wbGVtZW50IHRoZSBzZXF1ZW5jZSByZXF1aXJlZAotKgkJCXRvIGlzc3VlIGFueSBwcmlzbTIgY29tbWFuZC4gIFByaW1hcmlseSB1c2VkIGJ5IHRoZQotKgkJCWhmYTM4NHhfY21kX3h4eCBmdW5jdGlvbnMuCi0qCi0qIGhmYTM4NHhfYmFwX3h4eAlCQVAgcmVhZC93cml0ZSBhY2Nlc3MgZnVuY3Rpb25zLgotKgkJCU5vdGU6IHdlIHVzdWFsbHkgdXNlIEJBUDAgZm9yIG5vbi1pbnRlcnJ1cHQgY29udGV4dAotKgkJCSBhbmQgQkFQMSBmb3IgaW50ZXJydXB0IGNvbnRleHQuCi0qCi0qIGhmYTM4NHhfZGxfeHh4CWRvd25sb2FkIHJlbGF0ZWQgZnVuY3Rpb25zLgotKgotKiBEcml2ZXIgU3RhdGUgSXNzdWVzOgotKiBOb3RlIHRoYXQgdGhlcmUgYXJlIHR3byBwYWlycyBvZiBmdW5jdGlvbnMgdGhhdCBtYW5hZ2UgdGhlCi0qICdpbml0aWFsaXplZCcgYW5kICdydW5uaW5nJyBzdGF0ZXMgb2YgdGhlIGh3L01BQyBjb21iby4gIFRoZSBmb3VyCi0qIGZ1bmN0aW9ucyBhcmUgY3JlYXRlKCksIGRlc3Ryb3koKSwgc3RhcnQoKSwgYW5kIHN0b3AoKS4gIGNyZWF0ZSgpCi0qIHNldHMgdXAgdGhlIGRhdGEgc3RydWN0dXJlcyByZXF1aXJlZCB0byBzdXBwb3J0IHRoZSBoZmEzODR4XyoKLSogZnVuY3Rpb25zIGFuZCBkZXN0cm95KCkgY2xlYW5zIHRoZW0gdXAuICBUaGUgc3RhcnQoKSBmdW5jdGlvbiBnZXRzCi0qIHRoZSBhY3R1YWwgaGFyZHdhcmUgcnVubmluZyBhbmQgZW5hYmxlcyB0aGUgaW50ZXJydXB0cy4gIFRoZSBzdG9wKCkKLSogZnVuY3Rpb24gc2h1dHMgdGhlIGhhcmR3YXJlIGRvd24uICBUaGUgc2VxdWVuY2Ugc2hvdWxkIGJlOgotKiBjcmVhdGUoKQotKiAgLgotKiAgLiAgU2VsZiBjb250YWluZWQgdGVzdCByb3V0aW5lcyBjYW4gcnVuIGhlcmUsIHBhcnRpY3VsYXJseQotKiAgLiAgY29yZXJlc2V0KCkgYW5kIHRlc3RfaG9zdGlmKCkuCi0qICAuCi0qIHN0YXJ0KCkKLSogIC4KLSogIC4gIERvIGludGVyZXN0aW5nIHRoaW5ncyB3LyB0aGUgaGFyZHdhcmUKLSogIC4KLSogc3RvcCgpCi0qIGRlc3Ryb3koKQotKgotKiBOb3RlIHRoYXQgZGVzdHJveSgpIGNhbiBiZSBjYWxsZWQgd2l0aG91dCBjYWxsaW5nIHN0b3AoKSBmaXJzdC4KLSogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSovCi0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0KLS8qIFN5c3RlbSBJbmNsdWRlcyAqLwotI2RlZmluZSBXTEFOX0RCVkFSCXByaXNtMl9kZWJ1ZwotI2luY2x1ZGUgInZlcnNpb24uaCIKLQotCi0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+Ci0jaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgotI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KLQotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkpCi0jaW5jbHVkZSA8bGludXgvdHF1ZXVlLmg+Ci0jZWxzZQotI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgotI2VuZGlmCi0KLSNpZiAoV0xBTl9IT1NUSUYgPT0gV0xBTl9QQ01DSUEpCi0jaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwxMykgKQotI2luY2x1ZGUgPHBjbWNpYS92ZXJzaW9uLmg+Ci0jZW5kaWYKLSNpbmNsdWRlIDxwY21jaWEvY3NfdHlwZXMuaD4KLSNpbmNsdWRlIDxwY21jaWEvY3MuaD4KLSNpbmNsdWRlIDxwY21jaWEvY2lzdHBsLmg+Ci0jaW5jbHVkZSA8cGNtY2lhL2RzLmg+Ci0jaW5jbHVkZSA8cGNtY2lhL2Npc3JlZy5oPgotI2VuZGlmCi0KLSNpZiAoKFdMQU5fSE9TVElGID09IFdMQU5fUExYKSB8fCAoV0xBTl9IT1NUSUYgPT0gV0xBTl9QQ0kpKQotI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2VuZGlmCi0KLSNpbmNsdWRlICJ3bGFuX2NvbXBhdC5oIgotCi0vLyBYWFhYICNkZWZpbmUgQ01EX0lSUQotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotLyogUHJvamVjdCBJbmNsdWRlcyAqLwotCi0jaW5jbHVkZSAicDgwMjExdHlwZXMuaCIKLSNpbmNsdWRlICJwODAyMTFoZHIuaCIKLSNpbmNsdWRlICJwODAyMTFtZ210LmgiCi0jaW5jbHVkZSAicDgwMjExY29udi5oIgotI2luY2x1ZGUgInA4MDIxMW1zZy5oIgotI2luY2x1ZGUgInA4MDIxMW5ldGRldi5oIgotI2luY2x1ZGUgInA4MDIxMXJlcS5oIgotI2luY2x1ZGUgInA4MDIxMW1ldGFkZWYuaCIKLSNpbmNsdWRlICJwODAyMTFtZXRhc3RydWN0LmgiCi0jaW5jbHVkZSAiaGZhMzg0eC5oIgotI2luY2x1ZGUgInByaXNtMm1nbXQuaCIKLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLS8qIExvY2FsIENvbnN0YW50cyAqLwotCi1zdGF0aWMgY29uc3QgVUlOVDE2IGNyYzE2dGFiWzI1Nl0gPQotewotCTB4MDAwMCwgMHhjMGMxLCAweGMxODEsIDB4MDE0MCwgMHhjMzAxLCAweDAzYzAsIDB4MDI4MCwgMHhjMjQxLAotCTB4YzYwMSwgMHgwNmMwLCAweDA3ODAsIDB4Yzc0MSwgMHgwNTAwLCAweGM1YzEsIDB4YzQ4MSwgMHgwNDQwLAotCTB4Y2MwMSwgMHgwY2MwLCAweDBkODAsIDB4Y2Q0MSwgMHgwZjAwLCAweGNmYzEsIDB4Y2U4MSwgMHgwZTQwLAotCTB4MGEwMCwgMHhjYWMxLCAweGNiODEsIDB4MGI0MCwgMHhjOTAxLCAweDA5YzAsIDB4MDg4MCwgMHhjODQxLAotCTB4ZDgwMSwgMHgxOGMwLCAweDE5ODAsIDB4ZDk0MSwgMHgxYjAwLCAweGRiYzEsIDB4ZGE4MSwgMHgxYTQwLAotCTB4MWUwMCwgMHhkZWMxLCAweGRmODEsIDB4MWY0MCwgMHhkZDAxLCAweDFkYzAsIDB4MWM4MCwgMHhkYzQxLAotCTB4MTQwMCwgMHhkNGMxLCAweGQ1ODEsIDB4MTU0MCwgMHhkNzAxLCAweDE3YzAsIDB4MTY4MCwgMHhkNjQxLAotCTB4ZDIwMSwgMHgxMmMwLCAweDEzODAsIDB4ZDM0MSwgMHgxMTAwLCAweGQxYzEsIDB4ZDA4MSwgMHgxMDQwLAotCTB4ZjAwMSwgMHgzMGMwLCAweDMxODAsIDB4ZjE0MSwgMHgzMzAwLCAweGYzYzEsIDB4ZjI4MSwgMHgzMjQwLAotCTB4MzYwMCwgMHhmNmMxLCAweGY3ODEsIDB4Mzc0MCwgMHhmNTAxLCAweDM1YzAsIDB4MzQ4MCwgMHhmNDQxLAotCTB4M2MwMCwgMHhmY2MxLCAweGZkODEsIDB4M2Q0MCwgMHhmZjAxLCAweDNmYzAsIDB4M2U4MCwgMHhmZTQxLAotCTB4ZmEwMSwgMHgzYWMwLCAweDNiODAsIDB4ZmI0MSwgMHgzOTAwLCAweGY5YzEsIDB4Zjg4MSwgMHgzODQwLAotCTB4MjgwMCwgMHhlOGMxLCAweGU5ODEsIDB4Mjk0MCwgMHhlYjAxLCAweDJiYzAsIDB4MmE4MCwgMHhlYTQxLAotCTB4ZWUwMSwgMHgyZWMwLCAweDJmODAsIDB4ZWY0MSwgMHgyZDAwLCAweGVkYzEsIDB4ZWM4MSwgMHgyYzQwLAotCTB4ZTQwMSwgMHgyNGMwLCAweDI1ODAsIDB4ZTU0MSwgMHgyNzAwLCAweGU3YzEsIDB4ZTY4MSwgMHgyNjQwLAotCTB4MjIwMCwgMHhlMmMxLCAweGUzODEsIDB4MjM0MCwgMHhlMTAxLCAweDIxYzAsIDB4MjA4MCwgMHhlMDQxLAotCTB4YTAwMSwgMHg2MGMwLCAweDYxODAsIDB4YTE0MSwgMHg2MzAwLCAweGEzYzEsIDB4YTI4MSwgMHg2MjQwLAotCTB4NjYwMCwgMHhhNmMxLCAweGE3ODEsIDB4Njc0MCwgMHhhNTAxLCAweDY1YzAsIDB4NjQ4MCwgMHhhNDQxLAotCTB4NmMwMCwgMHhhY2MxLCAweGFkODEsIDB4NmQ0MCwgMHhhZjAxLCAweDZmYzAsIDB4NmU4MCwgMHhhZTQxLAotCTB4YWEwMSwgMHg2YWMwLCAweDZiODAsIDB4YWI0MSwgMHg2OTAwLCAweGE5YzEsIDB4YTg4MSwgMHg2ODQwLAotCTB4NzgwMCwgMHhiOGMxLCAweGI5ODEsIDB4Nzk0MCwgMHhiYjAxLCAweDdiYzAsIDB4N2E4MCwgMHhiYTQxLAotCTB4YmUwMSwgMHg3ZWMwLCAweDdmODAsIDB4YmY0MSwgMHg3ZDAwLCAweGJkYzEsIDB4YmM4MSwgMHg3YzQwLAotCTB4YjQwMSwgMHg3NGMwLCAweDc1ODAsIDB4YjU0MSwgMHg3NzAwLCAweGI3YzEsIDB4YjY4MSwgMHg3NjQwLAotCTB4NzIwMCwgMHhiMmMxLCAweGIzODEsIDB4NzM0MCwgMHhiMTAxLCAweDcxYzAsIDB4NzA4MCwgMHhiMDQxLAotCTB4NTAwMCwgMHg5MGMxLCAweDkxODEsIDB4NTE0MCwgMHg5MzAxLCAweDUzYzAsIDB4NTI4MCwgMHg5MjQxLAotCTB4OTYwMSwgMHg1NmMwLCAweDU3ODAsIDB4OTc0MSwgMHg1NTAwLCAweDk1YzEsIDB4OTQ4MSwgMHg1NDQwLAotCTB4OWMwMSwgMHg1Y2MwLCAweDVkODAsIDB4OWQ0MSwgMHg1ZjAwLCAweDlmYzEsIDB4OWU4MSwgMHg1ZTQwLAotCTB4NWEwMCwgMHg5YWMxLCAweDliODEsIDB4NWI0MCwgMHg5OTAxLCAweDU5YzAsIDB4NTg4MCwgMHg5ODQxLAotCTB4ODgwMSwgMHg0OGMwLCAweDQ5ODAsIDB4ODk0MSwgMHg0YjAwLCAweDhiYzEsIDB4OGE4MSwgMHg0YTQwLAotCTB4NGUwMCwgMHg4ZWMxLCAweDhmODEsIDB4NGY0MCwgMHg4ZDAxLCAweDRkYzAsIDB4NGM4MCwgMHg4YzQxLAotCTB4NDQwMCwgMHg4NGMxLCAweDg1ODEsIDB4NDU0MCwgMHg4NzAxLCAweDQ3YzAsIDB4NDY4MCwgMHg4NjQxLAotCTB4ODIwMSwgMHg0MmMwLCAweDQzODAsIDB4ODM0MSwgMHg0MTAwLCAweDgxYzEsIDB4ODA4MSwgMHg0MDQwCi19OwotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotLyogTG9jYWwgTWFjcm9zICovCi0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0vKiBMb2NhbCBUeXBlcyAqLwotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotLyogTG9jYWwgU3RhdGljIERlZmluaXRpb25zICovCi1leHRlcm4gaW50IHByaXNtMl9kZWJ1ZzsKLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLS8qIExvY2FsIEZ1bmN0aW9uIERlY2xhcmF0aW9ucyAqLwotCi1zdGF0aWMgdm9pZAloZmEzODR4X2ludF9kdGltKHdsYW5kZXZpY2VfdCAqd2xhbmRldik7Ci1zdGF0aWMgdm9pZAloZmEzODR4X2ludF9pbmZkcm9wKHdsYW5kZXZpY2VfdCAqd2xhbmRldik7Ci0KLXN0YXRpYyB2b2lkICAgICBoZmEzODR4X2JhcF90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSk7Ci0KLXN0YXRpYyB2b2lkCWhmYTM4NHhfaW50X2luZm8od2xhbmRldmljZV90ICp3bGFuZGV2KTsKLXN0YXRpYyB2b2lkCWhmYTM4NHhfaW50X3R4ZXhjKHdsYW5kZXZpY2VfdCAqd2xhbmRldik7Ci1zdGF0aWMgdm9pZAloZmEzODR4X2ludF90eCh3bGFuZGV2aWNlX3QgKndsYW5kZXYpOwotc3RhdGljIHZvaWQJaGZhMzg0eF9pbnRfcngod2xhbmRldmljZV90ICp3bGFuZGV2KTsKLQotI2lmZGVmIENNRF9JUlEKLXN0YXRpYyB2b2lkCWhmYTM4NHhfaW50X2NtZCh3bGFuZGV2aWNlX3QgKndsYW5kZXYpOwotI2VuZGlmCi1zdGF0aWMgdm9pZAloZmEzODR4X2ludF9yeG1vbml0b3IoIHdsYW5kZXZpY2VfdCAqd2xhbmRldiwKLQkJCVVJTlQxNiByeGZpZCwgaGZhMzg0eF9yeF9mcmFtZV90ICpyeGRlc2MpOwotc3RhdGljIHZvaWQJaGZhMzg0eF9pbnRfYWxsb2Mod2xhbmRldmljZV90ICp3bGFuZGV2KTsKLQotc3RhdGljIGludCBoZmEzODR4X2RvY21kX3dhaXQoIGhmYTM4NHhfdCAqaHcsIGhmYTM4NHhfbWV0YWNtZF90ICpjbWQpOwotCi1zdGF0aWMgaW50IGhmYTM4NHhfZGxfZG9jbWRfd2FpdCggaGZhMzg0eF90ICpodywgaGZhMzg0eF9tZXRhY21kX3QgKmNtZCk7Ci0KLXN0YXRpYyBVSU5UMTYKLWhmYTM4NHhfbWtjcmMxNihVSU5UOCAqcCwgaW50IGxlbik7Ci0KLWludCBoZmEzODR4X2NvcHlfdG9fYmFwNChoZmEzODR4X3QgKmh3LCBVSU5UMTYgYmFwLCBVSU5UMTYgaWQsIFVJTlQxNiBvZmZzZXQsCi0JCQkgdm9pZCAqYnVmLCBVSU5UIGxlbiwgdm9pZCogYnVmMiwgVUlOVCBsZW4yLAotCQkJIHZvaWQgKmJ1ZjMsIFVJTlQgbGVuMywgdm9pZCogYnVmNCwgVUlOVCBsZW40KTsKLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLS8qIEZ1bmN0aW9uIERlZmluaXRpb25zICovCi0KLXN0YXRpYyBVSU5UMTYKLXR4ZmlkX3F1ZXVlX2VtcHR5KGhmYTM4NHhfdCAqaHcpCi17Ci0JcmV0dXJuIChody0+dHhmaWRfaGVhZCA9PSBody0+dHhmaWRfdGFpbCkgPyAxIDogMDsKLX0KLQotc3RhdGljIFVJTlQxNgotdHhmaWRfcXVldWVfcmVtb3ZlKGhmYTM4NHhfdCAqaHcpCi17Ci0JVUlOVDE2IHJlc3VsdD0gMDsKLQotCWlmICh0eGZpZF9xdWV1ZV9lbXB0eShodykpIHsKLQkJV0xBTl9MT0dfREVCVUcoMywicXVldWUgZW1wdHkuXG4iKTsKLQl9IGVsc2UgewotCQlyZXN1bHQgPSBody0+dHhmaWRfcXVldWVbaHctPnR4ZmlkX2hlYWRdOwotCQlody0+dHhmaWRfaGVhZCA9IChody0+dHhmaWRfaGVhZCArIDEpICUgaHctPnR4ZmlkX047Ci0JfQotCi0JcmV0dXJuIChVSU5UMTYpcmVzdWx0OwotfQotCi1zdGF0aWMgSU5UMTYKLXR4ZmlkX3F1ZXVlX2FkZChoZmEzODR4X3QgKmh3LCBVSU5UMTYgdmFsKQotewotCUlOVDE2IHJlc3VsdCA9IDA7Ci0KLQlpZiAoaHctPnR4ZmlkX2hlYWQgPT0gKChody0+dHhmaWRfdGFpbCArIDEpICUgaHctPnR4ZmlkX04pKSB7Ci0JCXJlc3VsdCA9IC0xOwotCQlXTEFOX0xPR19ERUJVRygzLCJxdWV1ZSBmdWxsLlxuIik7Ci0JfSBlbHNlIHsKLQkJaHctPnR4ZmlkX3F1ZXVlW2h3LT50eGZpZF90YWlsXSA9IHZhbDsKLQkJcmVzdWx0ID0gaHctPnR4ZmlkX3RhaWw7Ci0JCWh3LT50eGZpZF90YWlsID0gKGh3LT50eGZpZF90YWlsICsgMSkgJSBody0+dHhmaWRfTjsKLQl9Ci0KLQlyZXR1cm4gcmVzdWx0OwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogaGZhMzg0eF9jcmVhdGUKLSoKLSogSW5pdGlhbGl6ZXMgdGhlIGhmYTM4NHhfdCBkYXRhIHN0cnVjdHVyZSBmb3IgdXNlLiAgTm90ZSB0aGlzCi0qIGRvZXMgX25vdF8gaW50aWFsaXplIHRoZSBhY3R1YWwgaGFyZHdhcmUsIGp1c3QgdGhlIGRhdGEgc3RydWN0dXJlcwotKiB3ZSB1c2UgdG8ga2VlcCB0cmFjayBvZiBpdHMgc3RhdGUuCi0qCi0qIEFyZ3VtZW50czoKLSoJaHcJCWRldmljZSBzdHJ1Y3R1cmUKLSoJaXJxCQlkZXZpY2UgaXJxIG51bWJlcgotKglpb2Jhc2UJCVtwY21jaWFdIGkvbyBiYXNlIGFkZHJlc3MgZm9yIHJlZ2lzdGVyIGFjY2VzcwotKgkJCVtwY2ldIHplcm8KLSoJCQlbcGx4XSBpL28gYmFzZSBhZGRyZXNzIGZvciByZWdpc3RlciBhY2Nlc3MKLSoJbWVtYmFzZQkJW3BjbWNpYV0gcGNtY2lhX2NzICJsaW5rIiBwb2ludGVyCi0qCQkJW3BjaV0gbWVtb3J5IGJhc2UgYWRkcmVzcyBmb3IgcmVnaXN0ZXIgYWNjZXNzCi0qCQkJW3BseF0gbWVtb3J5IGJhc2UgYWRkcmVzcyBmb3IgY2FyZCBhdHRyaWJ1dGUgbWVtb3J5Ci0qCi0qIFJldHVybnM6Ci0qCW5vdGhpbmcKLSoKLSogU2lkZSBlZmZlY3RzOgotKgotKiBDYWxsIGNvbnRleHQ6Ci0qCXByb2Nlc3MgdGhyZWFkCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXZvaWQgaGZhMzg0eF9jcmVhdGUoaGZhMzg0eF90ICpodywgVUlOVCBpcnEsIFVJTlQzMiBpb2Jhc2UsCi0JCSAgICBVSU5UOCBfX2lvbWVtICptZW1iYXNlKQotewotCURCRkVOVEVSOwotCW1lbXNldChodywgMCwgc2l6ZW9mKGhmYTM4NHhfdCkpOwotCWh3LT5pcnEgPSBpcnE7Ci0JaHctPmlvYmFzZSA9IGlvYmFzZTsKLQlody0+bWVtYmFzZSA9IG1lbWJhc2U7Ci0Jc3Bpbl9sb2NrX2luaXQoJihody0+Y21kbG9jaykpOwotCi0JLyogQkFQIHNldHVwICovCi0gCXNwaW5fbG9ja19pbml0KCYoaHctPmJhcGxvY2spKTsKLQl0YXNrbGV0X2luaXQoJmh3LT5iYXBfdGFza2xldCwKLQkJICAgICBoZmEzODR4X2JhcF90YXNrbGV0LAotCQkgICAgICh1bnNpZ25lZCBsb25nKSBodyk7Ci0KLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZody0+Y21kcSk7Ci0Jc2VtYV9pbml0KCZody0+aW5mb2ZpZF9zZW0sIDEpOwotCi0gICAgICAgIGh3LT50eGZpZF9oZWFkID0gMDsKLSAgICAgICAgaHctPnR4ZmlkX3RhaWwgPSAwOwotICAgICAgICBody0+dHhmaWRfTiA9IEhGQTM4NHhfRFJWUl9GSURTVEFDS0xFTl9NQVg7Ci0gICAgICAgIG1lbXNldChody0+dHhmaWRfcXVldWUsIDAsIHNpemVvZihody0+dHhmaWRfcXVldWUpKTsKLQotCWh3LT5pc3JhbTE2ID0gMTsKLQotCS8qIEluaXQgdGhlIGF1dGggcXVldWUgaGVhZCAqLwotCXNrYl9xdWV1ZV9oZWFkX2luaXQoJmh3LT5hdXRocSk7Ci0KLQlJTklUX1dPUksyKCZody0+bGlua19iaCwgcHJpc20yc3RhX3Byb2Nlc3NpbmdfZGVmZXIpOwotCi0gICAgICAgIElOSVRfV09SSzIoJmh3LT5jb21tc3F1YWxfYmgsIHByaXNtMnN0YV9jb21tc3F1YWxfZGVmZXIpOwotCi0JaW5pdF90aW1lcigmaHctPmNvbW1zcXVhbF90aW1lcik7Ci0JaHctPmNvbW1zcXVhbF90aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIGh3OwotCWh3LT5jb21tc3F1YWxfdGltZXIuZnVuY3Rpb24gPSBwcmlzbTJzdGFfY29tbXNxdWFsX3RpbWVyOwotCi0JaHctPmxpbmtfc3RhdHVzID0gSEZBMzg0eF9MSU5LX05PVENPTk5FQ1RFRDsKLQlody0+c3RhdGUgPSBIRkEzODR4X1NUQVRFX0lOSVQ7Ci0KLQlEQkZFWElUOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogaGZhMzg0eF9kZXN0cm95Ci0qCi0qIFBhcnRuZXIgdG8gaGZhMzg0eF9jcmVhdGUoKS4gIFRoaXMgZnVuY3Rpb24gY2xlYW5zIHVwIHRoZSBodwotKiBzdHJ1Y3R1cmUgc28gdGhhdCBpdCBjYW4gYmUgZnJlZWQgYnkgdGhlIGNhbGxlciB1c2luZyBhIHNpbXBsZQotKiBrZnJlZS4gIEN1cnJlbnRseSwgdGhpcyBmdW5jdGlvbiBpcyBqdXN0IGEgcGxhY2Vob2xkZXIuICBJZiwgYXQgc29tZQotKiBwb2ludCBpbiB0aGUgZnV0dXJlLCBhbiBodyBpbiB0aGUgJ3NodXRkb3duJyBzdGF0ZSByZXF1aXJlcyBhICdkZWVwJwotKiBrZnJlZSwgdGhpcyBpcyB3aGVyZSBpdCBzaG91bGQgYmUgZG9uZS4gIE5vdGUgdGhhdCBpZiB0aGlzIGZ1bmN0aW9uCi0qIGlzIGNhbGxlZCBvbiBhIF9ydW5uaW5nXyBodyBzdHJ1Y3R1cmUsIHRoZSBkcnZyX3N0b3AoKSBmdW5jdGlvbiBpcwotKiBjYWxsZWQuCi0qCi0qIEFyZ3VtZW50czoKLSoJaHcJCWRldmljZSBzdHJ1Y3R1cmUKLSoKLSogUmV0dXJuczoKLSoJbm90aGluZywgdGhpcyBmdW5jdGlvbiBpcyBub3QgYWxsb3dlZCB0byBmYWlsLgotKgotKiBTaWRlIGVmZmVjdHM6Ci0qCi0qIENhbGwgY29udGV4dDoKLSoJcHJvY2VzcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi12b2lkCi1oZmEzODR4X2Rlc3Ryb3koIGhmYTM4NHhfdCAqaHcpCi17Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQotCURCRkVOVEVSOwotCi0JaWYgKCBody0+c3RhdGUgPT0gSEZBMzg0eF9TVEFURV9SVU5OSU5HICkgewotCQloZmEzODR4X2RydnJfc3RvcChodyk7Ci0JfQotCWh3LT5zdGF0ZSA9IEhGQTM4NHhfU1RBVEVfUFJFSU5JVDsKLQotCWlmIChody0+c2NhbnJlc3VsdHMpIHsKLQkJa2ZyZWUoaHctPnNjYW5yZXN1bHRzKTsKLQkJaHctPnNjYW5yZXN1bHRzID0gTlVMTDsKLQl9Ci0KLSAgICAgICAgLyogTm93IHRvIGNsZWFuIG91dCB0aGUgYXV0aCBxdWV1ZSAqLwotICAgICAgICB3aGlsZSAoIChza2IgPSBza2JfZGVxdWV1ZSgmaHctPmF1dGhxKSkgKSB7Ci0gICAgICAgICAgICAgICAgZGV2X2tmcmVlX3NrYihza2IpOwotICAgICAgICB9Ci0KLQlEQkZFWElUOwotCXJldHVybjsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIGhmYTM4NHhfZHJ2cl9nZXRjb25maWcKLSoKLSogUGVyZm9ybXMgdGhlIHNlcXVlbmNlIG5lY2Vzc2FyeSB0byByZWFkIGEgY29uZmlnL2luZm8gaXRlbS4KLSoKLSogQXJndW1lbnRzOgotKglodwkJZGV2aWNlIHN0cnVjdHVyZQotKglyaWQJCWNvbmZpZy9pbmZvIHJlY29yZCBpZCAoaG9zdCBvcmRlcikKLSoJYnVmCQlob3N0IHNpZGUgcmVjb3JkIGJ1ZmZlci4gIFVwb24gcmV0dXJuIGl0IHdpbGwKLSoJCQljb250YWluIHRoZSBib2R5IHBvcnRpb24gb2YgdGhlIHJlY29yZCAobWludXMgdGhlCi0qCQkJUklEIGFuZCBsZW4pLgotKglsZW4JCWJ1ZmZlciBsZW5ndGggKGluIGJ5dGVzLCBzaG91bGQgbWF0Y2ggcmVjb3JkIGxlbmd0aCkKLSoKLSogUmV0dXJuczoKLSoJMAkJc3VjY2VzcwotKgk+MAkJZi93IHJlcG9ydGVkIGVycm9yIC0gZi93IHN0YXR1cyBjb2RlCi0qCTwwCQlkcml2ZXIgcmVwb3J0ZWQgZXJyb3IKLSoJLUVOT0RBVEEgCWxlbmd0aCBtaXNtYXRjaCBiZXR3ZWVuIGFyZ3VtZW50IGFuZCByZXRyaWV2ZWQKLSoJCQlyZWNvcmQuCi0qCi0qIFNpZGUgZWZmZWN0czoKLSoKLSogQ2FsbCBjb250ZXh0OgotKglwcm9jZXNzIHRocmVhZAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgaGZhMzg0eF9kcnZyX2dldGNvbmZpZyhoZmEzODR4X3QgKmh3LCBVSU5UMTYgcmlkLCB2b2lkICpidWYsIFVJTlQxNiBsZW4pCi17Ci0JaW50IAkJcmVzdWx0ID0gMDsKLQlEQkZFTlRFUjsKLQotCXJlc3VsdCA9IGhmYTM4NHhfY21kX2FjY2VzcyggaHcsIDAsIHJpZCwgYnVmLCBsZW4pOwotCi0JREJGRVhJVDsKLQlyZXR1cm4gcmVzdWx0OwotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBoZmEzODR4X2RydnJfc2V0Y29uZmlnCi0qCi0qIFBlcmZvcm1zIHRoZSBzZXF1ZW5jZSBuZWNlc3NhcnkgdG8gd3JpdGUgYSBjb25maWcvaW5mbyBpdGVtLgotKgotKiBBcmd1bWVudHM6Ci0qCWh3CQlkZXZpY2Ugc3RydWN0dXJlCi0qCXJpZAkJY29uZmlnL2luZm8gcmVjb3JkIGlkIChpbiBob3N0IG9yZGVyKQotKglidWYJCWhvc3Qgc2lkZSByZWNvcmQgYnVmZmVyCi0qCWxlbgkJYnVmZmVyIGxlbmd0aCAoaW4gYnl0ZXMpCi0qCi0qIFJldHVybnM6Ci0qCTAJCXN1Y2Nlc3MKLSoJPjAJCWYvdyByZXBvcnRlZCBlcnJvciAtIGYvdyBzdGF0dXMgY29kZQotKgk8MAkJZHJpdmVyIHJlcG9ydGVkIGVycm9yCi0qCi0qIFNpZGUgZWZmZWN0czoKLSoKLSogQ2FsbCBjb250ZXh0OgotKglwcm9jZXNzIHRocmVhZAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgaGZhMzg0eF9kcnZyX3NldGNvbmZpZyhoZmEzODR4X3QgKmh3LCBVSU5UMTYgcmlkLCB2b2lkICpidWYsIFVJTlQxNiBsZW4pCi17Ci0JaW50CQlyZXN1bHQgPSAwOwotCURCRkVOVEVSOwotCi0JcmVzdWx0ID0gaGZhMzg0eF9jbWRfYWNjZXNzKCBodywgMSwgcmlkLCBidWYsIGxlbik7Ci0KLQlEQkZFWElUOwotCXJldHVybiByZXN1bHQ7Ci19Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIGhmYTM4NHhfZHJ2cl9yZWFkcGRhCi0qCi0qIFBlcmZvcm1zIHRoZSBzZXF1ZW5jZSB0byByZWFkIHRoZSBQREEgc3BhY2UuICBOb3RlIHRoZXJlIGlzIG5vCi0qIGRydnJfd3JpdGVwZGEoKSBmdW5jdGlvbi4gIFdyaXRpbmcgYSBQREEgaXMKLSogZ2VuZXJhbGx5IGltcGxlbWVudGVkIGJ5IGEgY2FsbGluZyBjb21wb25lbnQgdmlhIGNhbGxzIHRvCi0qIGNtZF9kb3dubG9hZCBhbmQgd3JpdGluZyB0byB0aGUgZmxhc2ggZG93bmxvYWQgYnVmZmVyIHZpYSB0aGUKLSogYXV4IHJlZ3MuCi0qCi0qIEFyZ3VtZW50czoKLSoJaHcJCWRldmljZSBzdHJ1Y3R1cmUKLSoJYnVmCQlidWZmZXIgdG8gc3RvcmUgUERBIGluCi0qCWxlbgkJYnVmZmVyIGxlbmd0aAotKgotKiBSZXR1cm5zOgotKgkwCQlzdWNjZXNzCi0qCT4wCQlmL3cgcmVwb3J0ZWQgZXJyb3IgLSBmL3cgc3RhdHVzIGNvZGUKLSoJPDAJCWRyaXZlciByZXBvcnRlZCBlcnJvcgotKgktRVRJTUVPVVQJdGltb3V0IHdhaXRpbmcgZm9yIHRoZSBjbWQgcmVncyB0byBiZWNvbWUKLSoJCQlhdmFpbGFibGUsIG9yIHdhaXRpbmcgZm9yIHRoZSBjb250cm9sIHJlZwotKgkJCXRvIGluZGljYXRlIHRoZSBBdXggcG9ydCBpcyBlbmFibGVkLgotKgktRU5PREFUQQl0aGUgYnVmZmVyIGRvZXMgTk9UIGNvbnRhaW4gYSB2YWxpZCBQREEuCi0qCQkJRWl0aGVyIHRoZSBjYXJkIFBEQSBpcyBiYWQsIG9yIHRoZSBhdXhkYXRhCi0qCQkJcmVhZHMgYXJlIGdpdmluZyB1cyBnYXJiYWdlLgotCi0qCi0qIFNpZGUgZWZmZWN0czoKLSoKLSogQ2FsbCBjb250ZXh0OgotKglwcm9jZXNzIHRocmVhZCBvciBub24tY2FyZCBpbnRlcnJ1cHQuCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCBoZmEzODR4X2RydnJfcmVhZHBkYShoZmEzODR4X3QgKmh3LCB2b2lkICpidWYsIFVJTlQgbGVuKQotewotCWludAkJcmVzdWx0ID0gMDsKLQlVSU5UMTYJCSpwZGEgPSBidWY7Ci0JaW50CQlwZGFvayA9IDA7Ci0JaW50CQltb3JlcGRycyA9IDE7Ci0JaW50CQljdXJycGRyID0gMDsJLyogd29yZCBvZmZzZXQgb2YgdGhlIGN1cnJlbnQgcGRyICovCi0JaW50CQlpOwotCVVJTlQxNgkJcGRybGVuOwkJLyogcGRyIGxlbmd0aCBpbiBieXRlcywgaG9zdCBvcmRlciAqLwotCVVJTlQxNgkJcGRyY29kZTsJLyogcGRyIGNvZGUsIGhvc3Qgb3JkZXIgKi8KLQlVSU5UMTYJCWNyYzsKLQlVSU5UMTYJCXBkYWNyYzsKLQlzdHJ1Y3QgcGRhbG9jIHsKLQkJVUlOVDMyCWNhcmRhZGRyOwotCQlVSU5UMTYJYXV4Y3RsOwotCX0gcGRhbG9jW10gPQotCXsKLQkJeyBIRkEzODQyX1BEQV9CQVNFLAkJSEZBMzg0eF9BVVhfQ1RMX05WfSwKLQkJeyBIRkEzODQyX1BEQV9CQVNFLAkJSEZBMzg0eF9BVVhfQ1RMX0VYVERTfSwKLQkJeyBIRkEzODQxX1BEQV9CQVNFLAkJSEZBMzg0eF9BVVhfQ1RMX05WfSwKLQkJeyBIRkEzODQxX1BEQV9CQVNFLAkJSEZBMzg0eF9BVVhfQ1RMX0VYVERTfSwKLQkJeyBIRkEzODQxX1BEQV9CT0dVU19CQVNFLAlIRkEzODR4X0FVWF9DVExfTlZ9Ci0JfTsKLQotCURCRkVOVEVSOwotCS8qIENoZWNrIGZvciBhdXggYXZhaWxhYmxlICovCi0JcmVzdWx0ID0gaGZhMzg0eF9jbWRfYXV4X2VuYWJsZShodywgMCk7Ci0JaWYgKCByZXN1bHQgKSB7Ci0JCVdMQU5fTE9HX0RFQlVHKDEsImF1eF9lbmFibGUoKSBmYWlsZWQuIHJlc3VsdD0lZFxuIiwgcmVzdWx0KTsKLQkJZ290byBmYWlsZWQ7Ci0JfQotCi0JLyogUmVhZCB0aGUgcGRhIGZyb20gZWFjaCBrbm93biBhZGRyZXNzLiAgKi8KLQlmb3IgKCBpID0gMDsgaSA8IChzaXplb2YocGRhbG9jKS9zaXplb2YocGRhbG9jWzBdKSk7IGkrKykgewotCQlXTEFOX0xPR19ERUJVRyggMywgIkNoZWNraW5nIFBEQUAoMHglMDh4LCVzKVxuIiwKLQkJCXBkYWxvY1tpXS5jYXJkYWRkciwKLQkJCXBkYWxvY1tpXS5hdXhjdGwgPT0gSEZBMzg0eF9BVVhfQ1RMX05WID8KLQkJCSJDVExfTlYiIDogIkNUTF9FWFREUyIpOwotCi0JCS8qIENvcHkgYnVmc2l6ZSBieXRlcyBmcm9tIG91ciBjdXJyZW50IHBkYWxvYyAqLwotCQloZmEzODR4X2NvcHlfZnJvbV9hdXgoaHcsCi0JCQlwZGFsb2NbaV0uY2FyZGFkZHIsCi0JCQlwZGFsb2NbaV0uYXV4Y3RsLAotCQkJYnVmLAotCQkJbGVuKTsKLQotCQkvKiBUZXN0IGZvciBnYXJiYWdlICovCi0JCS8qIFRyYXZlcnNlIHRoZSBQRFIgbGlzdCBMb29raW5nIGZvciBQREEtRU5EICovCi0JCXBkYW9rID0gMTsJLyogaW50aWFsbHkgYXNzdW1lIGdvb2QgKi8KLQkJbW9yZXBkcnMgPSAxOwotCQljdXJycGRyID0gMDsKLQkJd2hpbGUgKCBwZGFvayAmJiBtb3JlcGRycyApIHsKLQkJCXBkcmxlbiA9IGhmYTM4NHgyaG9zdF8xNihwZGFbY3VycnBkcl0pICogMjsKLQkJCXBkcmNvZGUgPSBoZmEzODR4Mmhvc3RfMTYocGRhW2N1cnJwZHIrMV0pOwotCi0JCQkvKiBUZXN0IGZvciBjb21wbGV0aW9uIGF0IEVORCByZWNvcmQgKi8KLQkJCWlmICggcGRyY29kZSA9PSBIRkEzODR4X1BEUl9FTkRfT0ZfUERBICkgewotCQkJCWlmICggcGRybGVuID09IDQgKSB7Ci0JCQkJCW1vcmVwZHJzID0gMDsKLQkJCQkJLyogQ2FsY3VsYXRlIENSQy0xNiBhbmQgY29tcGFyZSB0byBQREEKLQkJCQkJICogdmFsdWUuICBOb3RlIHRoZSBhZGRpdGlvbiBvZiAyIHdvcmRzCi0JCQkJCSAqIGZvciBFTkRSRUMubGVuIGFuZCBFTkRSRUMuY29kZQotCQkJCQkgKiBmaWVsZHMuCi0JCQkJCSAqLwotCQkJCQljcmMgPSBoZmEzODR4X21rY3JjMTYoIChVSU5UOCopcGRhLAotCQkJCQkJKGN1cnJwZHIgKyAyKSAqIHNpemVvZihVSU5UMTYpKTsKLQkJCQkJcGRhY3JjID1oZmEzODR4Mmhvc3RfMTYocGRhW2N1cnJwZHIrMl0pOwotCQkJCQlpZiAoIGNyYyAhPSBwZGFjcmMgKSB7Ci0JCQkJCQlXTEFOX0xPR19ERUJVRygzLAotCQkJCQkJIlBEQSBjcmMgZmFpbGVkOiIKLQkJCQkJCSJjYWxjX2NyYz0weCUwNHgsIgotCQkJCQkJInBkcl9jcmM9MHglMDR4LlxuIiwKLQkJCQkJCWNyYywgcGRhY3JjKTsKLQkJCQkJCXBkYW9rID0gMDsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCVdMQU5fTE9HX0RFQlVHKDMsCi0JCQkJCSJFTkQgcmVjb3JkIGRldGVjdGVkIHcvICIKLQkJCQkJImxlbiglZCkgIT0gMiwgYXNzdW1pbmcgYmFkIFBEQVxuIiwKLQkJCQkJcGRybGVuKTsKLQkJCQkJcGRhb2sgPSAwOwotCi0JCQkJfQotCQkJCWJyZWFrOwotCQkJfQotCi0JCQkvKiBUZXN0IHRoZSByZWNvcmQgbGVuZ3RoICovCi0JCQlpZiAoIHBkcmxlbiA+IEhGQTM4NHhfUERSX0xFTl9NQVggfHwgcGRybGVuID09IDApIHsKLQkJCQlXTEFOX0xPR19ERUJVRygzLAotCQkJCQkicGRybGVuIGZvciBhZGRyZXNzICMlZCAiCi0JCQkJCSJhdCAlI3g6JSN4OiVkXG4iLAotCQkJCQlpLCBwZGFsb2NbaV0uY2FyZGFkZHIsCi0JCQkJCXBkYWxvY1tpXS5hdXhjdGwsIHBkcmxlbik7Ci0JCQkJV0xBTl9MT0dfREVCVUcoMywicGRybGVuIGludmFsaWQ9JWRcbiIsCi0JCQkJCXBkcmxlbik7Ci0JCQkJcGRhb2sgPSAwOwotCQkJCWJyZWFrOwotCQkJfQotCi0JCQkvKiBNb3ZlIHRvIHRoZSBuZXh0IHBkciAqLwotCQkJaWYgKCBtb3JlcGRycyApIHsKLQkJCQkvKiBub3RlIHRoZSBhY2Nlc3MgdG8gcGRhW10sIHdlIG5lZWQgd29yZHMgKi8KLQkJCQljdXJycGRyICs9IGhmYTM4NHgyaG9zdF8xNihwZGFbY3VycnBkcl0pICsgMTsKLQkJCQlpZiAoY3VycnBkcipzaXplb2YoVUlOVDE2KSA+IGxlbikgewotCQkJCQlXTEFOX0xPR19ERUJVRygzLAotCQkJCQkiRGlkbid0IGZpbmQgUERBX0VORCBpbiBidWZmZXIsICIKLQkJCQkJInRyeWluZyBuZXh0IGxvY2F0aW9uLlxuIik7Ci0JCQkJCXBkYW9rID0gMDsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmICggcGRhb2sgKSB7Ci0JCQlXTEFOX0xPR19JTkZPKAotCQkJCSJQREEgUmVhZCBmcm9tIDB4JTA4eCBpbiAlcyBzcGFjZS5cbiIsCi0JCQkJcGRhbG9jW2ldLmNhcmRhZGRyLAotCQkJCXBkYWxvY1tpXS5hdXhjdGwgPT0gMCA/ICJFWFREUyIgOgotCQkJCXBkYWxvY1tpXS5hdXhjdGwgPT0gMSA/ICJOViIgOgotCQkJCXBkYWxvY1tpXS5hdXhjdGwgPT0gMiA/ICJQSFkiIDoKLQkJCQlwZGFsb2NbaV0uYXV4Y3RsID09IDMgPyAiSUNTUkFNIiA6Ci0JCQkJIjxib2d1cyBhdXhjdGw+Iik7Ci0JCQlicmVhazsKLQkJfQotCX0KLQlyZXN1bHQgPSBwZGFvayA/IDAgOiAtRU5PREFUQTsKLQotCWlmICggcmVzdWx0ICkgewotCQlXTEFOX0xPR19ERUJVRygzLCJGYWlsdXJlOiBwZGEgaXMgbm90IG9rYXlcbiIpOwotCX0KLQotCWhmYTM4NHhfY21kX2F1eF9kaXNhYmxlKGh3KTsKLWZhaWxlZDoKLQlEQkZFWElUOwotCXJldHVybiByZXN1bHQ7Ci19Ci0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogbWtwZGFfY3JjCi0qCi0qIENhbGN1bGF0ZXMgdGhlIENSQzE2IGZvciB0aGUgZ2l2ZW4gUERBIGFuZCBpbnNlcnRzIHRoZSB2YWx1ZQotKiBpbnRvIHRoZSBlbmQgcmVjb3JkLgotKgotKiBBcmd1bWVudHM6Ci0qCXBkYQlwdHIgdG8gdGhlIFBEQSBkYXRhIHN0cnVjdHVyZS4KLSoKLSogUmV0dXJuczoKLSoJMAktIHN1Y2Nlc3MKLSoJfjAJLSBmYWlsdXJlIChwcm9iYWJseSBhbiBlcnJubykKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotc3RhdGljIFVJTlQxNgotaGZhMzg0eF9ta2NyYzE2KFVJTlQ4ICpwLCBpbnQgbGVuKQotewotCVVJTlQxNgljcmMgPSAwOwotCVVJTlQ4CSpsaW0gPSBwICsgbGVuOwotCi0Jd2hpbGUgKHAgPCBsaW0pIHsKLQkJY3JjID0gKGNyYyA+PiA4ICkgXiBjcmMxNnRhYlsoY3JjICYgMHhmZikgXiAqcCsrXTsKLQl9Ci0KLQlyZXR1cm4gY3JjOwotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBoZmEzODR4X2RydnJfcmFtZGxfZW5hYmxlCi0qCi0qIEJlZ2lucyB0aGUgcmFtIGRvd25sb2FkIHN0YXRlLiAgQ2hlY2tzIHRvIHNlZSB0aGF0IHdlJ3JlIG5vdAotKiBhbHJlYWR5IGluIGEgZG93bmxvYWQgc3RhdGUgYW5kIHRoYXQgYSBwb3J0IGlzbid0IGVuYWJsZWQuCi0qIFNldHMgdGhlIGRvd25sb2FkIHN0YXRlIGFuZCBjYWxscyBjbWRfZG93bmxvYWQgd2l0aCB0aGUKLSogRU5BQkxFX1ZPTEFUSUxFIHN1YmNvbW1hbmQgYW5kIHRoZSBleGVhZGRyIGFyZ3VtZW50LgotKgotKiBBcmd1bWVudHM6Ci0qCWh3CQlkZXZpY2Ugc3RydWN0dXJlCi0qCWV4ZWFkZHIJCXRoZSBjYXJkIGV4ZWN1dGlvbiBhZGRyZXNzIHRoYXQgd2lsbCBiZQotKiAgICAgICAgICAgICAgICAgICAgICAganVtcGVkIHRvIHdoZW4gcmFtZGxfZGlzYWJsZSgpIGlzIGNhbGxlZAotKgkJCShob3N0IG9yZGVyKS4KLSoKLSogUmV0dXJuczoKLSoJMAkJc3VjY2VzcwotKgk+MAkJZi93IHJlcG9ydGVkIGVycm9yIC0gZi93IHN0YXR1cyBjb2RlCi0qCTwwCQlkcml2ZXIgcmVwb3J0ZWQgZXJyb3IKLSoKLSogU2lkZSBlZmZlY3RzOgotKgotKiBDYWxsIGNvbnRleHQ6Ci0qCXByb2Nlc3MgdGhyZWFkCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCBoZmEzODR4X2RydnJfcmFtZGxfZW5hYmxlKGhmYTM4NHhfdCAqaHcsIFVJTlQzMiBleGVhZGRyKQotewotCWludAkJcmVzdWx0ID0gMDsKLQlVSU5UMTYJCWxvd2FkZHI7Ci0JVUlOVDE2CQloaWFkZHI7Ci0JaW50CQlpOwotCURCRkVOVEVSOwotCS8qIENoZWNrIHRoYXQgYSBwb3J0IGlzbid0IGFjdGl2ZSAqLwotCWZvciAoIGkgPSAwOyBpIDwgSEZBMzg0eF9QT1JUSURfTUFYOyBpKyspIHsKLQkJaWYgKCBody0+cG9ydF9lbmFibGVkW2ldICkgewotCQkJV0xBTl9MT0dfREVCVUcoMSwiQ2FuJ3QgZG93bmxvYWQgd2l0aCBhIHBvcnQgZW5hYmxlZC5cbiIpOwotCQkJcmVzdWx0ID0gLUVJTlZBTDsKLQkJCWdvdG8gZG9uZTsKLQkJfQotCX0KLQotCS8qIENoZWNrIHRoYXQgd2UncmUgbm90IGFscmVhZHkgaW4gYSBkb3dubG9hZCBzdGF0ZSAqLwotCWlmICggaHctPmRsc3RhdGUgIT0gSEZBMzg0eF9ETFNUQVRFX0RJU0FCTEVEICkgewotCQlXTEFOX0xPR19ERUJVRygxLCJEb3dubG9hZCBzdGF0ZSBub3QgZGlzYWJsZWQuXG4iKTsKLQkJcmVzdWx0ID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLQotCS8qIEFyZSB3ZSBzdXBwb3NlZCB0byBnbyBpbnRvIGdlbmVzaXMgbW9kZT8gKi8KLQlpZiAoZXhlYWRkciA9PSAweDNmMDAwMCkgewotCQlVSU5UMTYgaW5pdHNlcVsyXSA9IHsgMHhlMTAwLCAweGZmYTEgfTsKLQkJVUlOVDE2IHJlYWRidWZbMl07Ci0JCVVJTlQ4IGhjciA9IDB4MGY7IC8qIERlZmF1bHQgdG8geDE2IFNSQU0gKi8KLQkJaHctPmlzcmFtMTYgPSAxOwotCi0JCVdMQU5fTE9HX0RFQlVHKDEsICJEcm9wcGluZyBpbnRvIEdlbmVzaXMgbW9kZVxuIik7Ci0KLQkJLyogSXNzdWUgY2FyZCByZXNldCBhbmQgZW5hYmxlIGF1eCBwb3J0ICovCi0JCWhmYTM4NHhfY29yZXJlc2V0KGh3LCBwcmlzbTJfcmVzZXRfaG9sZHRpbWUsCi0JCQkJICBwcmlzbTJfcmVzZXRfc2V0dGxldGltZSwgMCk7Ci0JCWhmYTM4NHhfY21kX2F1eF9lbmFibGUoaHcsIDEpOwotCi0JCS8qIEdlbmVzaXMgc2V0ICovCi0JCWhmYTM4NHhfY29weV90b19hdXgoaHcsIDB4N0UwMDM4LCBIRkEzODR4X0FVWF9DVExfRVhURFMsCi0JCQkJICAgIGluaXRzZXEsIHNpemVvZihpbml0c2VxKSk7Ci0KLQkJaGZhMzg0eF9jb3JlcmVzZXQoaHcsIHByaXNtMl9yZXNldF9ob2xkdGltZSwKLQkJCQkgIHByaXNtMl9yZXNldF9zZXR0bGV0aW1lLCBoY3IpOwotCi0JCS8qIFZhbGlkYXRlIG1lbW9yeSBjb25maWcgKi8KLQkJaGZhMzg0eF9jb3B5X3RvX2F1eChodywgMHg3RTAwMzgsIEhGQTM4NHhfQVVYX0NUTF9FWFREUywKLQkJCQkgICAgaW5pdHNlcSwgc2l6ZW9mKGluaXRzZXEpKTsKLQkJaGZhMzg0eF9jb3B5X2Zyb21fYXV4KGh3LCAweDdFMDAzOCwgSEZBMzg0eF9BVVhfQ1RMX0VYVERTLAotCQkJCSAgICByZWFkYnVmLCBzaXplb2YoaW5pdHNlcSkpOwotCQlXTEFOX0hFWF9EVU1QKDMsICJyZWFkYmFjayIsIHJlYWRidWYsIHNpemVvZihyZWFkYnVmKSk7Ci0KLQkJaWYgKG1lbWNtcChpbml0c2VxLCByZWFkYnVmLCBzaXplb2YocmVhZGJ1ZikpKSB7Ci0JCQloY3IgPSAweDFmOyAvKiB4OCBTUkFNICovCi0JCQlody0+aXNyYW0xNiA9IDA7Ci0KLQkJCWhmYTM4NHhfY29weV90b19hdXgoaHcsIDB4N0UwMDM4LCBIRkEzODR4X0FVWF9DVExfRVhURFMsCi0JCQkJCSAgICBpbml0c2VxLCBzaXplb2YoaW5pdHNlcSkpOwotCQkJaGZhMzg0eF9jb3JlcmVzZXQoaHcsIHByaXNtMl9yZXNldF9ob2xkdGltZSwKLQkJCQkJICBwcmlzbTJfcmVzZXRfc2V0dGxldGltZSwgaGNyKTsKLQotCQkJaGZhMzg0eF9jb3B5X3RvX2F1eChodywgMHg3RTAwMzgsIEhGQTM4NHhfQVVYX0NUTF9FWFREUywKLQkJCQkJICAgIGluaXRzZXEsIHNpemVvZihpbml0c2VxKSk7Ci0JCQloZmEzODR4X2NvcHlfZnJvbV9hdXgoaHcsIDB4N0UwMDM4LCBIRkEzODR4X0FVWF9DVExfRVhURFMsCi0JCQkJCSAgICByZWFkYnVmLCBzaXplb2YoaW5pdHNlcSkpOwotCQkJV0xBTl9IRVhfRFVNUCgyLCAicmVhZGJhY2siLCByZWFkYnVmLCBzaXplb2YocmVhZGJ1ZikpOwotCi0JCQlpZiAobWVtY21wKGluaXRzZXEsIHJlYWRidWYsIHNpemVvZihyZWFkYnVmKSkpIHsKLQkJCQlXTEFOX0xPR19FUlJPUigiR2VuZXNpcyBtb2RlIGZhaWxlZFxuIik7Ci0JCQkJcmVzdWx0ID0gLTE7Ci0JCQkJZ290byBkb25lOwotCQkJfQotCQl9Ci0KLQkJLyogTm93IHdlJ3JlIGluIGdlbmVzaXMgbW9kZSAqLwotCQlody0+ZGxzdGF0ZSA9IEhGQTM4NHhfRExTVEFURV9HRU5FU0lTOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JLyogUmV0cmlldmUgdGhlIGJ1ZmZlciBsb2Mmc2l6ZSBhbmQgdGltZW91dCAqLwotCWlmICggKHJlc3VsdCA9IGhmYTM4NHhfZHJ2cl9nZXRjb25maWcoaHcsIEhGQTM4NHhfUklEX0RPV05MT0FEQlVGRkVSLAotCQkJCSYoaHctPmJ1ZmluZm8pLCBzaXplb2YoaHctPmJ1ZmluZm8pKSkgKSB7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaHctPmJ1ZmluZm8ucGFnZSA9IGhmYTM4NHgyaG9zdF8xNihody0+YnVmaW5mby5wYWdlKTsKLQlody0+YnVmaW5mby5vZmZzZXQgPSBoZmEzODR4Mmhvc3RfMTYoaHctPmJ1ZmluZm8ub2Zmc2V0KTsKLQlody0+YnVmaW5mby5sZW4gPSBoZmEzODR4Mmhvc3RfMTYoaHctPmJ1ZmluZm8ubGVuKTsKLQlpZiAoIChyZXN1bHQgPSBoZmEzODR4X2RydnJfZ2V0Y29uZmlnMTYoaHcsIEhGQTM4NHhfUklEX01BWExPQURUSU1FLAotCQkJCSYoaHctPmRsdGltZW91dCkpKSApIHsKLQkJZ290byBkb25lOwotCX0KLQlody0+ZGx0aW1lb3V0ID0gaGZhMzg0eDJob3N0XzE2KGh3LT5kbHRpbWVvdXQpOwotCi0JLyogRW5hYmxlIHRoZSBhdXggcG9ydCAqLwotCWlmICggKHJlc3VsdCA9IGhmYTM4NHhfY21kX2F1eF9lbmFibGUoaHcsIDApKSApIHsKLQkJV0xBTl9MT0dfREVCVUcoMSwiQXV4IGVuYWJsZSBmYWlsZWQsIHJlc3VsdD0lZC5cbiIsIHJlc3VsdCk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQkvKiBDYWxsIHRoZSBkb3dubG9hZCgxLGFkZHIpIGZ1bmN0aW9uICovCi0JbG93YWRkciA9IEhGQTM4NHhfQUREUl9DTURfTUtPRkYoZXhlYWRkcik7Ci0JaGlhZGRyID0gIEhGQTM4NHhfQUREUl9DTURfTUtQQUdFKGV4ZWFkZHIpOwotCi0JcmVzdWx0ID0gaGZhMzg0eF9jbWRfZG93bmxvYWQoaHcsIEhGQTM4NHhfUFJPR01PREVfUkFNLAotCQkJbG93YWRkciwgaGlhZGRyLCAwKTsKLQlpZiAoIHJlc3VsdCA9PSAwKSB7Ci0JCS8qIFNldCB0aGUgZG93bmxvYWQgc3RhdGUgKi8KLQkJaHctPmRsc3RhdGUgPSBIRkEzODR4X0RMU1RBVEVfUkFNRU5BQkxFRDsKLQl9IGVsc2UgewotCQlXTEFOX0xPR19ERUJVRygxLCJjbWRfZG93bmxvYWQoMHglMDR4LCAweCUwNHgpIGZhaWxlZCwgcmVzdWx0PSVkLlxuIiwKLQkJCQlsb3dhZGRyLGhpYWRkciwgcmVzdWx0KTsKLQkJLyogRGlzYWJsZSAgdGhlIGF1eCBwb3J0ICovCi0JCWhmYTM4NHhfY21kX2F1eF9kaXNhYmxlKGh3KTsKLQl9Ci0KLSBkb25lOgotCURCRkVYSVQ7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogaGZhMzg0eF9kcnZyX3JhbWRsX2Rpc2FibGUKLSoKLSogRW5kcyB0aGUgcmFtIGRvd25sb2FkIHN0YXRlLgotKgotKiBBcmd1bWVudHM6Ci0qCWh3CQlkZXZpY2Ugc3RydWN0dXJlCi0qCi0qIFJldHVybnM6Ci0qCTAJCXN1Y2Nlc3MKLSoJPjAJCWYvdyByZXBvcnRlZCBlcnJvciAtIGYvdyBzdGF0dXMgY29kZQotKgk8MAkJZHJpdmVyIHJlcG9ydGVkIGVycm9yCi0qCi0qIFNpZGUgZWZmZWN0czoKLSoKLSogQ2FsbCBjb250ZXh0OgotKglwcm9jZXNzIHRocmVhZAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgaGZhMzg0eF9kcnZyX3JhbWRsX2Rpc2FibGUoaGZhMzg0eF90ICpodykKLXsKLQlEQkZFTlRFUjsKLQkvKiBDaGVjayB0aGF0IHdlJ3JlIGFscmVhZHkgaW4gdGhlIGRvd25sb2FkIHN0YXRlICovCi0JaWYgKCAoIGh3LT5kbHN0YXRlICE9IEhGQTM4NHhfRExTVEFURV9SQU1FTkFCTEVEICkgJiYKLQkgICAgICggaHctPmRsc3RhdGUgIT0gSEZBMzg0eF9ETFNUQVRFX0dFTkVTSVMgKSApIHsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKGh3LT5kbHN0YXRlID09IEhGQTM4NHhfRExTVEFURV9HRU5FU0lTKSB7Ci0JCWhmYTM4NHhfY29yZXJlc2V0KGh3LCBwcmlzbTJfcmVzZXRfaG9sZHRpbWUsCi0JCQkJICBwcmlzbTJfcmVzZXRfc2V0dGxldGltZSwKLQkJCQkgIGh3LT5pc3JhbTE2ID8gMHgwNzogMHgxNyk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQkvKiBEaXNhYmxlIHRoZSBhdXggcG9ydCAqLwotCWhmYTM4NHhfY21kX2Rvd25sb2FkKGh3LCBIRkEzODR4X1BST0dNT0RFX0RJU0FCTEUsIDAsIDAgLCAwKTsKLQotIGRvbmU6Ci0JaHctPmRsc3RhdGUgPSBIRkEzODR4X0RMU1RBVEVfRElTQUJMRUQ7Ci0JaGZhMzg0eF9jbWRfYXV4X2Rpc2FibGUoaHcpOwotCi0JREJGRVhJVDsKLQlyZXR1cm4gMDsKLX0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogaGZhMzg0eF9kcnZyX3JhbWRsX3dyaXRlCi0qCi0qIFBlcmZvcm1zIGEgUkFNIGRvd25sb2FkIG9mIGEgY2h1bmsgb2YgZGF0YS4gRmlyc3QgY2hlY2tzIHRvIHNlZQotKiB0aGF0IHdlJ3JlIGluIHRoZSBSQU0gZG93bmxvYWQgc3RhdGUsIHRoZW4gdXNlcyB0aGUgYXV4IGZ1bmN0aW9ucwotKiB0byAxKSBjb3B5IHRoZSBkYXRhLCAyKSByZWFkYmFjayBhbmQgY29tcGFyZS4gIFRoZSBkb3dubG9hZAotKiBzdGF0ZSBpcyB1bmFmZmVjdGVkLiAgV2hlbiBhbGwgZGF0YSBoYXMgYmVlbiB3cml0dGVuIHVzaW5nCi0qIHRoaXMgZnVuY3Rpb24sIGNhbGwgZHJ2cl9yYW1kbF9kaXNhYmxlKCkgdG8gZW5kIHRoZSBkb3dubG9hZCBzdGF0ZQotKiBhbmQgcmVzdGFydCB0aGUgTUFDLgotKgotKiBBcmd1bWVudHM6Ci0qCWh3CQlkZXZpY2Ugc3RydWN0dXJlCi0qCWRhZGRyCQlDYXJkIGFkZHJlc3MgdG8gd3JpdGUgdG8uIChob3N0IG9yZGVyKQotKglidWYJCVB0ciB0byBkYXRhIHRvIHdyaXRlLgotKglsZW4JCUxlbmd0aCBvZiBkYXRhIChob3N0IG9yZGVyKS4KLSoKLSogUmV0dXJuczoKLSoJMAkJc3VjY2VzcwotKgk+MAkJZi93IHJlcG9ydGVkIGVycm9yIC0gZi93IHN0YXR1cyBjb2RlCi0qCTwwCQlkcml2ZXIgcmVwb3J0ZWQgZXJyb3IKLSoKLSogU2lkZSBlZmZlY3RzOgotKgotKiBDYWxsIGNvbnRleHQ6Ci0qCXByb2Nlc3MgdGhyZWFkCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCBoZmEzODR4X2RydnJfcmFtZGxfd3JpdGUoaGZhMzg0eF90ICpodywgVUlOVDMyIGRhZGRyLCB2b2lkKiBidWYsIFVJTlQzMiBsZW4pCi17Ci0JaW50CQlyZXN1bHQgPSAwOwotCVVJTlQ4CQkqdmVyYnVmOwotCURCRkVOVEVSOwotCS8qIENoZWNrIHRoYXQgd2UncmUgaW4gdGhlIHJhbSBkb3dubG9hZCBzdGF0ZSAqLwotCWlmICggKCBody0+ZGxzdGF0ZSAhPSBIRkEzODR4X0RMU1RBVEVfUkFNRU5BQkxFRCApICYmCi0JICAgICAoIGh3LT5kbHN0YXRlICE9IEhGQTM4NHhfRExTVEFURV9HRU5FU0lTICkgKSB7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCVdMQU5fTE9HX0lORk8oIldyaXRpbmcgJWQgYnl0ZXMgdG8gcmFtIEAweCUwNnhcbiIsIGxlbiwgZGFkZHIpOwotI2lmIDAKLVdMQU5fSEVYX0RVTVAoMSwgImRsZGF0YSIsIGJ1ZiwgbGVuKTsKLSNlbmRpZgotCS8qIENvcHkgdGhlIGRhdGEgdmlhIHRoZSBhdXggcG9ydCAqLwotCWhmYTM4NHhfY29weV90b19hdXgoaHcsIGRhZGRyLCBIRkEzODR4X0FVWF9DVExfRVhURFMsIGJ1ZiwgbGVuKTsKLQotCS8qIENyZWF0ZSBhIGJ1ZmZlciBmb3IgdGhlIHZlcmlmeSAqLwotCXZlcmJ1ZiA9IGttYWxsb2MobGVuLCBHRlBfS0VSTkVMKTsKLQlpZiAodmVyYnVmID09IE5VTEwgKSByZXR1cm4gMTsKLQotCS8qIFJlYWQgYmFjayBhbmQgY29tcGFyZSAqLwotCWhmYTM4NHhfY29weV9mcm9tX2F1eChodywgZGFkZHIsIEhGQTM4NHhfQVVYX0NUTF9FWFREUywgdmVyYnVmLCBsZW4pOwotCi0JaWYgKCBtZW1jbXAoYnVmLCB2ZXJidWYsIGxlbikgKSB7Ci0JCVdMQU5fTE9HX0RFQlVHKDEsInJhbWRsIHZlcmlmeSBmYWlsZWQhXG4iKTsKLQkJcmVzdWx0ID0gLUVJTlZBTDsKLQl9Ci0KLQlrZnJlZV9zKHZlcmJ1ZiwgbGVuKTsKLQlEQkZFWElUOwotCXJldHVybiByZXN1bHQ7Ci19Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIGhmYTM4NHhfZHJ2cl9mbGFzaGRsX2VuYWJsZQotKgotKiBCZWdpbnMgdGhlIGZsYXNoIGRvd25sb2FkIHN0YXRlLiAgQ2hlY2tzIHRvIHNlZSB0aGF0IHdlJ3JlIG5vdAotKiBhbHJlYWR5IGluIGEgZG93bmxvYWQgc3RhdGUgYW5kIHRoYXQgYSBwb3J0IGlzbid0IGVuYWJsZWQuCi0qIFNldHMgdGhlIGRvd25sb2FkIHN0YXRlIGFuZCByZXRyaWV2ZXMgdGhlIGZsYXNoIGRvd25sb2FkCi0qIGJ1ZmZlciBsb2NhdGlvbiwgYnVmZmVyIHNpemUsIGFuZCB0aW1lb3V0IGxlbmd0aC4KLSoKLSogQXJndW1lbnRzOgotKglodwkJZGV2aWNlIHN0cnVjdHVyZQotKgotKiBSZXR1cm5zOgotKgkwCQlzdWNjZXNzCi0qCT4wCQlmL3cgcmVwb3J0ZWQgZXJyb3IgLSBmL3cgc3RhdHVzIGNvZGUKLSoJPDAJCWRyaXZlciByZXBvcnRlZCBlcnJvcgotKgotKiBTaWRlIGVmZmVjdHM6Ci0qCi0qIENhbGwgY29udGV4dDoKLSoJcHJvY2VzcyB0aHJlYWQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IGhmYTM4NHhfZHJ2cl9mbGFzaGRsX2VuYWJsZShoZmEzODR4X3QgKmh3KQotewotCWludAkJcmVzdWx0ID0gMDsKLQlpbnQJCWk7Ci0KLQlEQkZFTlRFUjsKLQkvKiBDaGVjayB0aGF0IGEgcG9ydCBpc24ndCBhY3RpdmUgKi8KLQlmb3IgKCBpID0gMDsgaSA8IEhGQTM4NHhfUE9SVElEX01BWDsgaSsrKSB7Ci0JCWlmICggaHctPnBvcnRfZW5hYmxlZFtpXSApIHsKLQkJCVdMQU5fTE9HX0RFQlVHKDEsImNhbGxlZCB3aGVuIHBvcnQgZW5hYmxlZC5cbiIpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQl9Ci0KLQkvKiBDaGVjayB0aGF0IHdlJ3JlIG5vdCBhbHJlYWR5IGluIGEgZG93bmxvYWQgc3RhdGUgKi8KLQlpZiAoIGh3LT5kbHN0YXRlICE9IEhGQTM4NHhfRExTVEFURV9ESVNBQkxFRCApIHsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JLyogUmV0cmlldmUgdGhlIGJ1ZmZlciBsb2Mmc2l6ZSBhbmQgdGltZW91dCAqLwotCWlmICggKHJlc3VsdCA9IGhmYTM4NHhfZHJ2cl9nZXRjb25maWcoaHcsIEhGQTM4NHhfUklEX0RPV05MT0FEQlVGRkVSLAotCQkJCSYoaHctPmJ1ZmluZm8pLCBzaXplb2YoaHctPmJ1ZmluZm8pKSkgKSB7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCWh3LT5idWZpbmZvLnBhZ2UgPSBoZmEzODR4Mmhvc3RfMTYoaHctPmJ1ZmluZm8ucGFnZSk7Ci0JaHctPmJ1ZmluZm8ub2Zmc2V0ID0gaGZhMzg0eDJob3N0XzE2KGh3LT5idWZpbmZvLm9mZnNldCk7Ci0JaHctPmJ1ZmluZm8ubGVuID0gaGZhMzg0eDJob3N0XzE2KGh3LT5idWZpbmZvLmxlbik7Ci0JaWYgKCAocmVzdWx0ID0gaGZhMzg0eF9kcnZyX2dldGNvbmZpZzE2KGh3LCBIRkEzODR4X1JJRF9NQVhMT0FEVElNRSwKLQkJCQkmKGh3LT5kbHRpbWVvdXQpKSkgKSB7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCWh3LT5kbHRpbWVvdXQgPSBoZmEzODR4Mmhvc3RfMTYoaHctPmRsdGltZW91dCk7Ci0KLQkvKiBFbmFibGUgdGhlIGF1eCBwb3J0ICovCi0JaWYgKCAocmVzdWx0ID0gaGZhMzg0eF9jbWRfYXV4X2VuYWJsZShodywgMCkpICkgewotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCWh3LT5kbHN0YXRlID0gSEZBMzg0eF9ETFNUQVRFX0ZMQVNIRU5BQkxFRDsKLQlEQkZFWElUOwotCXJldHVybiByZXN1bHQ7Ci19Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIGhmYTM4NHhfZHJ2cl9mbGFzaGRsX2Rpc2FibGUKLSoKLSogRW5kcyB0aGUgZmxhc2ggZG93bmxvYWQgc3RhdGUuICBOb3RlIHRoYXQgdGhpcyB3aWxsIGNhdXNlIHRoZSBNQUMKLSogZmlybXdhcmUgdG8gcmVzdGFydC4KLSoKLSogQXJndW1lbnRzOgotKglodwkJZGV2aWNlIHN0cnVjdHVyZQotKgotKiBSZXR1cm5zOgotKgkwCQlzdWNjZXNzCi0qCT4wCQlmL3cgcmVwb3J0ZWQgZXJyb3IgLSBmL3cgc3RhdHVzIGNvZGUKLSoJPDAJCWRyaXZlciByZXBvcnRlZCBlcnJvcgotKgotKiBTaWRlIGVmZmVjdHM6Ci0qCi0qIENhbGwgY29udGV4dDoKLSoJcHJvY2VzcyB0aHJlYWQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IGhmYTM4NHhfZHJ2cl9mbGFzaGRsX2Rpc2FibGUoaGZhMzg0eF90ICpodykKLXsKLQlEQkZFTlRFUjsKLQkvKiBDaGVjayB0aGF0IHdlJ3JlIGFscmVhZHkgaW4gdGhlIGRvd25sb2FkIHN0YXRlICovCi0JaWYgKCBody0+ZGxzdGF0ZSAhPSBIRkEzODR4X0RMU1RBVEVfRkxBU0hFTkFCTEVEICkgewotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQkvKiBUaGVyZSBpc24ndCBtdWNoIHdlIGNhbiBkbyBhdCB0aGlzIHBvaW50LCBzbyBJIGRvbid0ICovCi0JLyogIGJvdGhlciAgdy8gdGhlIHJldHVybiB2YWx1ZSAqLwotCWhmYTM4NHhfY21kX2Rvd25sb2FkKGh3LCBIRkEzODR4X1BST0dNT0RFX0RJU0FCTEUsIDAsIDAgLCAwKTsKLQlody0+ZGxzdGF0ZSA9IEhGQTM4NHhfRExTVEFURV9ESVNBQkxFRDsKLQotCS8qIERpc2FibGUgdGhlIGF1eCBwb3J0ICovCi0JaGZhMzg0eF9jbWRfYXV4X2Rpc2FibGUoaHcpOwotCi0JREJGRVhJVDsKLQlyZXR1cm4gMDsKLX0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogaGZhMzg0eF9kcnZyX2ZsYXNoZGxfd3JpdGUKLSoKLSogUGVyZm9ybXMgYSBGTEFTSCBkb3dubG9hZCBvZiBhIGNodW5rIG9mIGRhdGEuIEZpcnN0IGNoZWNrcyB0byBzZWUKLSogdGhhdCB3ZSdyZSBpbiB0aGUgRkxBU0ggZG93bmxvYWQgc3RhdGUsIHRoZW4gc2V0cyB0aGUgZG93bmxvYWQKLSogbW9kZSwgdXNlcyB0aGUgYXV4IGZ1bmN0aW9ucyB0byAxKSBjb3B5IHRoZSBkYXRhIHRvIHRoZSBmbGFzaAotKiBidWZmZXIsIDIpIHNldHMgdGhlIGRvd25sb2FkICd3cml0ZSBmbGFzaCcgbW9kZSwgMykgcmVhZGJhY2sgYW5kCi0qIGNvbXBhcmUuICBMYXRoZXIgcmluc2UsIHJlcGVhdCBhcyBtYW55IHRpbWVzIGFuIG5lY2Vzc2FyeSB0byBnZXQKLSogYWxsIHRoZSBnaXZlbiBkYXRhIGludG8gZmxhc2guCi0qIFdoZW4gYWxsIGRhdGEgaGFzIGJlZW4gd3JpdHRlbiB1c2luZyB0aGlzIGZ1bmN0aW9uIChwb3NzaWJseQotKiByZXBlYXRlZGx5KSwgY2FsbCBkcnZyX2ZsYXNoZGxfZGlzYWJsZSgpIHRvIGVuZCB0aGUgZG93bmxvYWQgc3RhdGUKLSogYW5kIHJlc3RhcnQgdGhlIE1BQy4KLSoKLSogQXJndW1lbnRzOgotKglodwkJZGV2aWNlIHN0cnVjdHVyZQotKglkYWRkcgkJQ2FyZCBhZGRyZXNzIHRvIHdyaXRlIHRvLiAoaG9zdCBvcmRlcikKLSoJYnVmCQlQdHIgdG8gZGF0YSB0byB3cml0ZS4KLSoJbGVuCQlMZW5ndGggb2YgZGF0YSAoaG9zdCBvcmRlcikuCi0qCi0qIFJldHVybnM6Ci0qCTAJCXN1Y2Nlc3MKLSoJPjAJCWYvdyByZXBvcnRlZCBlcnJvciAtIGYvdyBzdGF0dXMgY29kZQotKgk8MAkJZHJpdmVyIHJlcG9ydGVkIGVycm9yCi0qCi0qIFNpZGUgZWZmZWN0czoKLSoKLSogQ2FsbCBjb250ZXh0OgotKglwcm9jZXNzIHRocmVhZAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgaGZhMzg0eF9kcnZyX2ZsYXNoZGxfd3JpdGUoaGZhMzg0eF90ICpodywgVUlOVDMyIGRhZGRyLCB2b2lkKiBidWYsIFVJTlQzMiBsZW4pCi17Ci0JaW50CQlyZXN1bHQgPSAwOwotCVVJTlQ4CQkqdmVyYnVmOwotCVVJTlQzMgkJZGxidWZhZGRyOwotCVVJTlQzMgkJY3VycmxlbjsKLQlVSU5UMzIJCWN1cnJkYWRkcjsKLQlVSU5UMTYJCWRlc3RsbzsKLQlVSU5UMTYJCWRlc3RoaTsKLQlpbnQJCW53cml0ZXM7Ci0JaW50CQlpOwotCi0JREJGRU5URVI7Ci0JLyogQ2hlY2sgdGhhdCB3ZSdyZSBpbiB0aGUgZmxhc2ggZG93bmxvYWQgc3RhdGUgKi8KLQlpZiAoIGh3LT5kbHN0YXRlICE9IEhGQTM4NHhfRExTVEFURV9GTEFTSEVOQUJMRUQgKSB7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCVdMQU5fTE9HX0lORk8oIkRvd25sb2FkICVkIGJ5dGVzIHRvIGZsYXNoIEAweCUwNnhcbiIsIGxlbiwgZGFkZHIpOwotCi0JLyogTmVlZCBhIGZsYXQgYWRkcmVzcyBmb3IgYXJpdGhtZXRpYyAqLwotCWRsYnVmYWRkciA9IEhGQTM4NHhfQUREUl9BVVhfTUtGTEFUKAotCQkJaHctPmJ1ZmluZm8ucGFnZSwKLQkJCWh3LT5idWZpbmZvLm9mZnNldCk7Ci0JdmVyYnVmID0ga21hbGxvYyhody0+YnVmaW5mby5sZW4sIEdGUF9LRVJORUwpOwotCi0jaWYgMAotV0xBTl9MT0dfV0FSTklORygiZGxidWZAMHglMDZseCBsZW49JWQgdG89JWRcbiIsIGRsYnVmYWRkciwgaHctPmJ1ZmluZm8ubGVuLCBody0+ZGx0aW1lb3V0KTsKLSNlbmRpZgotCS8qIEZpZ3VyZSBvdXQgaG93IG1hbnkgdGltZXMgdG8gdG8gdGhlIGZsYXNoIHByb2cgKi8KLQlud3JpdGVzID0gbGVuIC8gaHctPmJ1ZmluZm8ubGVuOwotCW53cml0ZXMgKz0gKGxlbiAlIGh3LT5idWZpbmZvLmxlbikgPyAxIDogMDsKLQotCWlmICggdmVyYnVmID09IE5VTEwgKSB7Ci0JCVdMQU5fTE9HX0VSUk9SKCJGYWlsZWQgdG8gYWxsb2NhdGUgZmxhc2ggdmVyaWZ5IGJ1ZmZlclxuIik7Ci0JCXJldHVybiAxOwotCX0KLQkvKiBGb3IgZWFjaCAqLwotCWZvciAoIGkgPSAwOyBpIDwgbndyaXRlczsgaSsrKSB7Ci0JCS8qIEdldCB0aGUgZGVzdCBhZGRyZXNzIGFuZCBsZW4gKi8KLQkJY3VycmxlbiA9IChsZW4gLSAoaHctPmJ1ZmluZm8ubGVuICogaSkpID4gaHctPmJ1ZmluZm8ubGVuID8KLQkJCQlody0+YnVmaW5mby5sZW4gOgotCQkJCShsZW4gLSAoaHctPmJ1ZmluZm8ubGVuICogaSkpOwotCQljdXJyZGFkZHIgPSBkYWRkciArIChody0+YnVmaW5mby5sZW4gKiBpKTsKLQkJZGVzdGxvID0gSEZBMzg0eF9BRERSX0NNRF9NS09GRihjdXJyZGFkZHIpOwotCQlkZXN0aGkgPSBIRkEzODR4X0FERFJfQ01EX01LUEFHRShjdXJyZGFkZHIpOwotCQlXTEFOX0xPR19JTkZPKCJXcml0aW5nICVkIGJ5dGVzIHRvIGZsYXNoIEAweCUwNnhcbiIsIGN1cnJsZW4sIGN1cnJkYWRkcik7Ci0jaWYgMAotV0xBTl9IRVhfRFVNUCgxLCAiZGxkYXRhIiwgYnVmKyhody0+YnVmaW5mby5sZW4qaSksIGN1cnJsZW4pOwotI2VuZGlmCi0JCS8qIFNldCB0aGUgZG93bmxvYWQgbW9kZSAqLwotCQlyZXN1bHQgPSBoZmEzODR4X2NtZF9kb3dubG9hZChodywgSEZBMzg0eF9QUk9HTU9ERV9OViwKLQkJCQlkZXN0bG8sIGRlc3RoaSwgY3Vycmxlbik7Ci0JCWlmICggcmVzdWx0ICkgewotCQkJV0xBTl9MT0dfRVJST1IoImRvd25sb2FkKE5WLGxvPSV4LGhpPSV4LGxlbj0leCkgIgotCQkJCSJjbWQgZmFpbGVkLCByZXN1bHQ9JWQuIEFib3J0aW5nIGQvbFxuIiwKLQkJCQlkZXN0bG8sIGRlc3RoaSwgY3VycmxlbiwgcmVzdWx0KTsKLQkJCWdvdG8gZXhpdF9wcm9jOwotCQl9Ci0JCS8qIGNvcHkgdGhlIGRhdGEgdG8gdGhlIGZsYXNoIGJ1ZmZlciAqLwotCQloZmEzODR4X2NvcHlfdG9fYXV4KGh3LCBkbGJ1ZmFkZHIsIEhGQTM4NHhfQVVYX0NUTF9FWFREUywKLQkJCQkJYnVmKyhody0+YnVmaW5mby5sZW4qaSksIGN1cnJsZW4pOwotCQkvKiBzZXQgdGhlIGRvd25sb2FkICd3cml0ZSBmbGFzaCcgbW9kZSAqLwotCQlyZXN1bHQgPSBoZmEzODR4X2NtZF9kb3dubG9hZChodywgSEZBMzg0eF9QUk9HTU9ERV9OVldSSVRFLCAwLDAsMCk7Ci0JCWlmICggcmVzdWx0ICkgewotCQkJV0xBTl9MT0dfRVJST1IoCi0JCQkJImRvd25sb2FkKE5WV1JJVEUsbG89JXgsaGk9JXgsbGVuPSV4KSAiCi0JCQkJImNtZCBmYWlsZWQsIHJlc3VsdD0lZC4gQWJvcnRpbmcgZC9sXG4iLAotCQkJCWRlc3RsbywgZGVzdGhpLCBjdXJybGVuLCByZXN1bHQpOwotCQkJZ290byBleGl0X3Byb2M7Ci0JCX0KLQkJLyogcmVhZGJhY2sgYW5kIGNvbXBhcmUsIGlmIGZhaWwuLi5iYWlsICovCi0JCWhmYTM4NHhfY29weV9mcm9tX2F1eChodywKLQkJCQljdXJyZGFkZHIsIEhGQTM4NHhfQVVYX0NUTF9OViwKLQkJCQl2ZXJidWYsIGN1cnJsZW4pOwotCi0JCWlmICggbWVtY21wKGJ1ZisoaHctPmJ1ZmluZm8ubGVuKmkpLCB2ZXJidWYsIGN1cnJsZW4pICkgewotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQl9Ci0KLWV4aXRfcHJvYzoKLSAgICAgICAgIC8qIERPSCEgVGhpcyBrZnJlZSdzIGZvciB5b3UgTWFyayA6LSkgTXkgZm9yZWhlYWQgaHVydHMuLi4gKi8KLSAgICAgICAgIGtmcmVlKHZlcmJ1Zik7Ci0KLQkvKiBMZWF2ZSB0aGUgZmlybXdhcmUgaW4gdGhlICdwb3N0LXByb2cnIG1vZGUuICBmbGFzaGRsX2Rpc2FibGUgd2lsbCAqLwotCS8qICBhY3R1YWxseSBkaXNhYmxlIHByb2dyYW1taW5nIG1vZGUuICBSZW1lbWJlciwgdGhhdCB3aWxsIGNhdXNlIHRoZSAqLwotCS8qICB0aGUgZmlybXdhcmUgdG8gZWZmZWN0aXZlbHkgcmVzZXQgaXRzZWxmLiAqLwotCi0JREJGRVhJVDsKLQlyZXR1cm4gcmVzdWx0OwotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBoZmEzODR4X2NtZF9pbml0aWFsaXplCi0qCi0qIElzc3VlcyB0aGUgaW5pdGlhbGl6ZSBjb21tYW5kIGFuZCBzZXRzIHRoZSBody0+c3RhdGUgYmFzZWQKLSogb24gdGhlIHJlc3VsdC4KLSoKLSogQXJndW1lbnRzOgotKglodwkJZGV2aWNlIHN0cnVjdHVyZQotKgotKiBSZXR1cm5zOgotKgkwCQlzdWNjZXNzCi0qCT4wCQlmL3cgcmVwb3J0ZWQgZXJyb3IgLSBmL3cgc3RhdHVzIGNvZGUKLSoJPDAJCWRyaXZlciByZXBvcnRlZCBlcnJvcgotKgotKiBTaWRlIGVmZmVjdHM6Ci0qCi0qIENhbGwgY29udGV4dDoKLSoJcHJvY2VzcyB0aHJlYWQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IGhmYTM4NHhfY21kX2luaXRpYWxpemUoaGZhMzg0eF90ICpodykKLXsKLQlpbnQgcmVzdWx0ID0gMDsKLQlpbnQgaTsKLQloZmEzODR4X21ldGFjbWRfdCBjbWQ7Ci0KLQlEQkZFTlRFUjsKLQotCS8qIHdlIGRvbid0IHdhbnQgdG8gYmUgaW50ZXJydXB0ZWQgZHVyaW5nIHRoZSByZXNldCAqLwotCWhmYTM4NHhfc2V0cmVnKGh3LCAwLCBIRkEzODR4X0lOVEVOKTsKLQloZmEzODR4X3NldHJlZyhodywgMHhmZmZmLCBIRkEzODR4X0VWQUNLKTsKLQotCWNtZC5jbWQgPSBIRkEzODR4X0NNRENPREVfSU5JVDsKLQljbWQucGFybTAgPSAwOwotCWNtZC5wYXJtMSA9IDA7Ci0JY21kLnBhcm0yID0gMDsKLQotCXNwaW5fbG9ja19iaCgmaHctPmNtZGxvY2spOwotCXJlc3VsdCA9IGhmYTM4NHhfZG9jbWRfd2FpdChodywgJmNtZCk7Ci0Jc3Bpbl91bmxvY2tfYmgoJmh3LT5jbWRsb2NrKTsKLQotCWlmICggcmVzdWx0ID09IDAgKSB7Ci0JCWZvciAoIGkgPSAwOyBpIDwgSEZBMzg0eF9OVU1QT1JUU19NQVg7IGkrKykgewotCQkJaHctPnBvcnRfZW5hYmxlZFtpXSA9IDA7Ci0JCX0KLQl9Ci0KLSAgICAgICAgaHctPmxpbmtfc3RhdHVzID0gSEZBMzg0eF9MSU5LX05PVENPTk5FQ1RFRDsKLQotCURCRkVYSVQ7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogaGZhMzg0eF9kcnZyX2NvbW10YWxsaWVzCi0qCi0qIFNlbmQgYSBjb21tdGFsbGllcyBpbnF1aXJ5IHRvIHRoZSBNQUMuICBOb3RlIHRoYXQgdGhpcyBpcyBhbiBhc3luYwotKiBjYWxsIHRoYXQgd2lsbCByZXN1bHQgaW4gYW4gaW5mbyBmcmFtZSBhcnJpdmluZyBzb21ldGltZSBsYXRlci4KLSoKLSogQXJndW1lbnRzOgotKglodwkJZGV2aWNlIHN0cnVjdHVyZQotKgotKiBSZXR1cm5zOgotKgl6ZXJvCQlzdWNjZXNzLgotKgotKiBTaWRlIGVmZmVjdHM6Ci0qCi0qIENhbGwgY29udGV4dDoKLSoJcHJvY2VzcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgaGZhMzg0eF9kcnZyX2NvbW10YWxsaWVzKCBoZmEzODR4X3QgKmh3ICkKLXsKLQloZmEzODR4X21ldGFjbWRfdCBjbWQ7Ci0JaW50IHJlc3VsdDsKLQotCURCRkVOVEVSOwotCi0JY21kLmNtZCA9IEhGQTM4NHhfQ01EQ09ERV9JTlE7Ci0JY21kLnBhcm0wID0gSEZBMzg0eF9JVF9DT01NVEFMTElFUzsKLQljbWQucGFybTEgPSAwOwotCWNtZC5wYXJtMiA9IDA7Ci0KLQlzcGluX2xvY2tfYmgoJmh3LT5jbWRsb2NrKTsKLQlyZXN1bHQgPSBoZmEzODR4X2RvY21kX3dhaXQoaHcsICZjbWQpOwotCXNwaW5fdW5sb2NrX2JoKCZody0+Y21kbG9jayk7Ci0KLQlEQkZFWElUOwotCXJldHVybiByZXN1bHQ7Ci19Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIGhmYTM4NHhfZHJ2cl9lbmFibGUKLSoKLSogSXNzdWVzIHRoZSBlbmFibGUgY29tbWFuZCB0byBlbmFibGUgY29tbXVuaWNhdGlvbnMgb24gb25lIG9mCi0qIHRoZSBNQUNzICdwb3J0cycuICBPbmx5IG1hY3BvcnQgMCBpcyB2YWxpZCAgZm9yIHN0YXRpb25zLgotKiBBUHMgbWF5IGFsc28gZW5hYmxlIG1hY3BvcnRzIDEtNi4gIE9ubHkgcG9ydHMgdGhhdCBhcmUgY3VycmVudGx5Ci0qIGRpc2FibGVkIG1heSBiZSBlbmFibGVkLgotKgotKiBBcmd1bWVudHM6Ci0qCWh3CQlkZXZpY2Ugc3RydWN0dXJlCi0qCW1hY3BvcnQJCU1BQyBwb3J0IG51bWJlcgotKgotKiBSZXR1cm5zOgotKgkwCQlzdWNjZXNzCi0qCT4wCQlmL3cgcmVwb3J0ZWQgZmFpbHVyZSAtIGYvdyBzdGF0dXMgY29kZQotKgk8MAkJZHJpdmVyIHJlcG9ydGVkIGVycm9yICh0aW1lb3V0fGJhZCBhcmcpCi0qCi0qIFNpZGUgZWZmZWN0czoKLSoKLSogQ2FsbCBjb250ZXh0OgotKglwcm9jZXNzIHRocmVhZAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgaGZhMzg0eF9kcnZyX2VuYWJsZShoZmEzODR4X3QgKmh3LCBVSU5UMTYgbWFjcG9ydCkKLXsKLQlpbnQJcmVzdWx0ID0gMDsKLQotCURCRkVOVEVSOwotCWlmICgoIWh3LT5pc2FwICYmIG1hY3BvcnQgIT0gMCkgfHwKLQkgICAgKGh3LT5pc2FwICYmICEobWFjcG9ydCA8PSBIRkEzODR4X1BPUlRJRF9NQVgpKSB8fAotCSAgICAoaHctPnBvcnRfZW5hYmxlZFttYWNwb3J0XSkgKXsKLQkJcmVzdWx0ID0gLUVJTlZBTDsKLQl9IGVsc2UgewotCQlyZXN1bHQgPSBoZmEzODR4X2NtZF9lbmFibGUoaHcsIG1hY3BvcnQpOwotCQlpZiAoIHJlc3VsdCA9PSAwICkgewotCQkJaHctPnBvcnRfZW5hYmxlZFttYWNwb3J0XSA9IDE7Ci0JCX0KLQl9Ci0JREJGRVhJVDsKLQlyZXR1cm4gcmVzdWx0OwotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBoZmEzODR4X2NtZF9lbmFibGUKLSoKLSogSXNzdWVzIHRoZSB0aGUgZW5hYmxlIGNvbW1hbmQgdG8gZW5hYmxlIGNvbW11bmljYXRpb25zIG9uIG9uZSBvZiB0aGUKLSogTUFDcyAncG9ydHMnLgotKgotKiBBcmd1bWVudHM6Ci0qCWh3CQlkZXZpY2Ugc3RydWN0dXJlCi0qCW1hY3BvcnQJCU1BQyBwb3J0IG51bWJlcgotKgotKiBSZXR1cm5zOgotKgkwCQlzdWNjZXNzCi0qCT4wCQlmL3cgcmVwb3J0ZWQgZmFpbHVyZSAtIGYvdyBzdGF0dXMgY29kZQotKgk8MAkJZHJpdmVyIHJlcG9ydGVkIGVycm9yICh0aW1lb3V0fGJhZCBhcmcpCi0qCi0qIFNpZGUgZWZmZWN0czoKLSoKLSogQ2FsbCBjb250ZXh0OgotKglwcm9jZXNzIHRocmVhZAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgaGZhMzg0eF9jbWRfZW5hYmxlKGhmYTM4NHhfdCAqaHcsIFVJTlQxNiBtYWNwb3J0KQotewotCWludAlyZXN1bHQgPSAwOwotCWhmYTM4NHhfbWV0YWNtZF90IGNtZDsKLQotCURCRkVOVEVSOwotCi0JY21kLmNtZCA9IEhGQTM4NHhfQ01EX0NNRENPREVfU0VUKEhGQTM4NHhfQ01EQ09ERV9FTkFCTEUpIHwKLQkJICBIRkEzODR4X0NNRF9NQUNQT1JUX1NFVChtYWNwb3J0KTsKLQljbWQucGFybTAgPSAwOwotCWNtZC5wYXJtMSA9IDA7Ci0JY21kLnBhcm0yID0gMDsKLQotCXNwaW5fbG9ja19iaCgmaHctPmNtZGxvY2spOwotCXJlc3VsdCA9IGhmYTM4NHhfZG9jbWRfd2FpdChodywgJmNtZCk7Ci0Jc3Bpbl91bmxvY2tfYmgoJmh3LT5jbWRsb2NrKTsKLQotCURCRkVYSVQ7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogaGZhMzg0eF9kcnZyX2Rpc2FibGUKLSoKLSogSXNzdWVzIHRoZSBkaXNhYmxlIGNvbW1hbmQgdG8gc3RvcCBjb21tdW5pY2F0aW9ucyBvbiBvbmUgb2YKLSogdGhlIE1BQ3MgJ3BvcnRzJy4gIE9ubHkgbWFjcG9ydCAwIGlzIHZhbGlkICBmb3Igc3RhdGlvbnMuCi0qIEFQcyBtYXkgYWxzbyBkaXNhYmxlIG1hY3BvcnRzIDEtNi4gIE9ubHkgcG9ydHMgdGhhdCBoYXZlIGJlZW4KLSogcHJldmlvdXNseSBlbmFibGVkIG1heSBiZSBkaXNhYmxlZC4KLSoKLSogQXJndW1lbnRzOgotKglodwkJZGV2aWNlIHN0cnVjdHVyZQotKgltYWNwb3J0CQlNQUMgcG9ydCBudW1iZXIgKGhvc3Qgb3JkZXIpCi0qCi0qIFJldHVybnM6Ci0qCTAJCXN1Y2Nlc3MKLSoJPjAJCWYvdyByZXBvcnRlZCBmYWlsdXJlIC0gZi93IHN0YXR1cyBjb2RlCi0qCTwwCQlkcml2ZXIgcmVwb3J0ZWQgZXJyb3IgKHRpbWVvdXR8YmFkIGFyZykKLSoKLSogU2lkZSBlZmZlY3RzOgotKgotKiBDYWxsIGNvbnRleHQ6Ci0qCXByb2Nlc3MgdGhyZWFkCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCBoZmEzODR4X2RydnJfZGlzYWJsZShoZmEzODR4X3QgKmh3LCBVSU5UMTYgbWFjcG9ydCkKLXsKLQlpbnQJcmVzdWx0ID0gMDsKLQotCURCRkVOVEVSOwotCWlmICgoIWh3LT5pc2FwICYmIG1hY3BvcnQgIT0gMCkgfHwKLQkgICAgKGh3LT5pc2FwICYmICEobWFjcG9ydCA8PSBIRkEzODR4X1BPUlRJRF9NQVgpKSB8fAotCSAgICAhKGh3LT5wb3J0X2VuYWJsZWRbbWFjcG9ydF0pICl7Ci0JCXJlc3VsdCA9IC1FSU5WQUw7Ci0JfSBlbHNlIHsKLQkJcmVzdWx0ID0gaGZhMzg0eF9jbWRfZGlzYWJsZShodywgbWFjcG9ydCk7Ci0JCWlmICggcmVzdWx0ID09IDAgKSB7Ci0JCQlody0+cG9ydF9lbmFibGVkW21hY3BvcnRdID0gMDsKLQkJfQotCX0KLQlEQkZFWElUOwotCXJldHVybiByZXN1bHQ7Ci19Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIGhmYTM4NHhfY21kX2Rpc2FibGUKLSoKLSogSXNzdWVzIHRoZSBjb21tYW5kIHRvIGRpc2FibGUgYSBwb3J0LgotKgotKiBBcmd1bWVudHM6Ci0qCWh3CQlkZXZpY2Ugc3RydWN0dXJlCi0qCW1hY3BvcnQJCU1BQyBwb3J0IG51bWJlciAoaG9zdCBvcmRlcikKLSoKLSogUmV0dXJuczoKLSoJMAkJc3VjY2VzcwotKgk+MAkJZi93IHJlcG9ydGVkIGZhaWx1cmUgLSBmL3cgc3RhdHVzIGNvZGUKLSoJPDAJCWRyaXZlciByZXBvcnRlZCBlcnJvciAodGltZW91dHxiYWQgYXJnKQotKgotKiBTaWRlIGVmZmVjdHM6Ci0qCi0qIENhbGwgY29udGV4dDoKLSoJcHJvY2VzcyB0aHJlYWQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IGhmYTM4NHhfY21kX2Rpc2FibGUoaGZhMzg0eF90ICpodywgVUlOVDE2IG1hY3BvcnQpCi17Ci0JaW50CXJlc3VsdCA9IDA7Ci0JaGZhMzg0eF9tZXRhY21kX3QgY21kOwotCi0JREJGRU5URVI7Ci0KLQljbWQuY21kID0gSEZBMzg0eF9DTURfQ01EQ09ERV9TRVQoSEZBMzg0eF9DTURDT0RFX0RJU0FCTEUpIHwKLQkJICBIRkEzODR4X0NNRF9NQUNQT1JUX1NFVChtYWNwb3J0KTsKLQljbWQucGFybTAgPSAwOwotCWNtZC5wYXJtMSA9IDA7Ci0JY21kLnBhcm0yID0gMDsKLQotCXNwaW5fbG9ja19iaCgmaHctPmNtZGxvY2spOwotCXJlc3VsdCA9IGhmYTM4NHhfZG9jbWRfd2FpdChodywgJmNtZCk7Ci0Jc3Bpbl91bmxvY2tfYmgoJmh3LT5jbWRsb2NrKTsKLQotCURCRkVYSVQ7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogaGZhMzg0eF9jbWRfZGlhZ25vc2UKLSoKLSogSXNzdWVzIHRoZSBkaWFnbm9zZSBjb21tYW5kIHRvIHRlc3QgdGhlOiByZWdpc3RlciBpbnRlcmZhY2UsCi0qIE1BQyBjb250cm9sbGVyIChpbmNsdWRpbmcgbG9vcGJhY2spLCBFeHRlcm5hbCBSQU0sIE5vbi12b2xhdGlsZQotKiBtZW1vcnkgaW50ZWdyaXR5LCBhbmQgc3ludGhlc2l6ZXJzLiAgRm9sbG93aW5nIGV4ZWN1dGlvbiBvZiB0aGlzCi0qIGNvbW1hbmQsIE1BQy9maXJtd2FyZSBhcmUgaW4gdGhlICdpbml0aWFsIHN0YXRlJy4gIFRoZXJlZm9yZSwKLSogdGhlIEluaXRpYWxpemUgY29tbWFuZCBzaG91bGQgYmUgaXNzdWVkIGFmdGVyIHN1Y2Nlc3NmdWwKLSogY29tcGxldGlvbiBvZiB0aGlzIGNvbW1hbmQuICBUaGlzIGZ1bmN0aW9uIG1heSBvbmx5IGJlIGNhbGxlZAotKiB3aGVuIHRoZSBNQUMgaXMgaW4gdGhlICdjb21tdW5pY2F0aW9uIGRpc2FibGVkJyBzdGF0ZS4KLSoKLSogQXJndW1lbnRzOgotKglodwkJZGV2aWNlIHN0cnVjdHVyZQotKgotKiBSZXR1cm5zOgotKgkwCQlzdWNjZXNzCi0qCT4wCQlmL3cgcmVwb3J0ZWQgZmFpbHVyZSAtIGYvdyBzdGF0dXMgY29kZQotKgk8MAkJZHJpdmVyIHJlcG9ydGVkIGVycm9yICh0aW1lb3V0fGJhZCBhcmcpCi0qCi0qIFNpZGUgZWZmZWN0czoKLSoKLSogQ2FsbCBjb250ZXh0OgotKglwcm9jZXNzIHRocmVhZAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jZGVmaW5lIERJQUdfUEFUVEVSTkEgKChVSU5UMTYpMHhhYWFhKQotI2RlZmluZSBESUFHX1BBVFRFUk5CICgoVUlOVDE2KTB4NTU1NSkKLQotaW50IGhmYTM4NHhfY21kX2RpYWdub3NlKGhmYTM4NHhfdCAqaHcpCi17Ci0JaW50CXJlc3VsdCA9IDA7Ci0JaGZhMzg0eF9tZXRhY21kX3QgY21kOwotCi0JREJGRU5URVI7Ci0KLQljbWQuY21kID0gSEZBMzg0eF9DTURfQ01EQ09ERV9TRVQoSEZBMzg0eF9DTURDT0RFX0RJQUcpOwotCWNtZC5wYXJtMCA9IERJQUdfUEFUVEVSTkE7Ci0JY21kLnBhcm0xID0gRElBR19QQVRURVJOQjsKLQljbWQucGFybTIgPSAwOwotCi0Jc3Bpbl9sb2NrX2JoKCZody0+Y21kbG9jayk7Ci0JcmVzdWx0ID0gaGZhMzg0eF9kb2NtZF93YWl0KGh3LCAmY21kKTsKLQlzcGluX3VubG9ja19iaCgmaHctPmNtZGxvY2spOwotCi0JREJGRVhJVDsKLQlyZXR1cm4gcmVzdWx0OwotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBoZmEzODR4X2NtZF9hbGxvY2F0ZQotKgotKiBJc3N1ZXMgdGhlIGFsbG9jYXRlIGNvbW1hbmQgaW5zdHJ1Y3RpbmcgdGhlIGZpcm13YXJlIHRvIGFsbG9jYXRlCi0qIGEgJ2ZyYW1lIHN0cnVjdHVyZSBidWZmZXInIGluIE1BQyBjb250cm9sbGVyIFJBTS4gIFRoaXMgY29tbWFuZAotKiBkb2VzIG5vdCBwcm92aWRlIHRoZSByZXN1bHQsIGl0IG9ubHkgaW5pdGlhdGVzIG9uZSBvZiB0aGUgZi93J3MKLSogYXN5bmNocm9ub3VzIHByb2Nlc3NlcyB0byBjb25zdHJ1Y3QgdGhlIGJ1ZmZlci4gIFdoZW4gdGhlCi0qIGFsbG9jYXRpb24gaXMgY29tcGxldGUsIGl0IHdpbGwgYmUgaW5kaWNhdGVkIHZpYSB0aGUgQWxsb2MKLSogYml0IGluIHRoZSBFdlN0YXQgcmVnaXN0ZXIgYW5kIHRoZSBGSUQgaWRlbnRpZnlpbmcgdGhlIGFsbG9jYXRlZAotKiBzcGFjZSB3aWxsIGJlIGF2YWlsYWJsZSBmcm9tIHRoZSBBbGxvY0ZJRCByZWdpc3Rlci4gIFNvbWUgY2FyZQotKiBzaG91bGQgYmUgdGFrZW4gd2hlbiB3YWl0aW5nIGZvciB0aGUgQWxsb2MgZXZlbnQuICBJZiBhIFR4IG9yCi0qIE5vdGlmeSBjb21tYW5kIHcvIFJlY2xhaW0gaGFzIGJlZW4gcHJldmlvdXNseSBleGVjdXRlZCwgaXQncwotKiBwb3NzaWJsZSB0aGUgZmlyc3QgQWxsb2MgZXZlbnQgYWZ0ZXIgZXhlY3V0aW9uIG9mIHRoaXMgY29tbWFuZAotKiB3aWxsIGJlIGZvciB0aGUgcmVjbGFpbWVkIGJ1ZmZlciBhbmQgbm90IHRoZSBvbmUgeW91IGFza2VkIGZvci4KLSogVGhpcyBjYXNlIG11c3QgYmUgaGFuZGxlZCBpbiB0aGUgQWxsb2MgZXZlbnQgaGFuZGxlci4KLSoKLSogQXJndW1lbnRzOgotKglodwkJZGV2aWNlIHN0cnVjdHVyZQotKglsZW4JCWFsbG9jYXRpb24gbGVuZ3RoLCBtdXN0IGJlIGFuIGV2ZW4gdmFsdWUKLSoJCQlpbiB0aGUgcmFuZ2UgWzQtMjQwMF0uIChob3N0IG9yZGVyKQotKgotKiBSZXR1cm5zOgotKgkwCQlzdWNjZXNzCi0qCT4wCQlmL3cgcmVwb3J0ZWQgZmFpbHVyZSAtIGYvdyBzdGF0dXMgY29kZQotKgk8MAkJZHJpdmVyIHJlcG9ydGVkIGVycm9yICh0aW1lb3V0fGJhZCBhcmcpCi0qCi0qIFNpZGUgZWZmZWN0czoKLSoKLSogQ2FsbCBjb250ZXh0OgotKglwcm9jZXNzIHRocmVhZAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgaGZhMzg0eF9jbWRfYWxsb2NhdGUoaGZhMzg0eF90ICpodywgVUlOVDE2IGxlbikKLXsKLQlpbnQJcmVzdWx0ID0gMDsKLQloZmEzODR4X21ldGFjbWRfdCBjbWQ7Ci0KLQlEQkZFTlRFUjsKLQotCWlmICggKGxlbiAlIDIpIHx8Ci0JICAgICBsZW4gPCBIRkEzODR4X0NNRF9BTExPQ19MRU5fTUlOIHx8Ci0JICAgICBsZW4gPiBIRkEzODR4X0NNRF9BTExPQ19MRU5fTUFYICkgewotCQlyZXN1bHQgPSAtRUlOVkFMOwotCX0gZWxzZSB7Ci0JCWNtZC5jbWQgPSBIRkEzODR4X0NNRF9DTURDT0RFX1NFVChIRkEzODR4X0NNRENPREVfQUxMT0MpOwotCQljbWQucGFybTAgPSBsZW47Ci0JCWNtZC5wYXJtMSA9IDA7Ci0JCWNtZC5wYXJtMiA9IDA7Ci0KLQkJc3Bpbl9sb2NrX2JoKCZody0+Y21kbG9jayk7Ci0JCXJlc3VsdCA9IGhmYTM4NHhfZG9jbWRfd2FpdChodywgJmNtZCk7Ci0JCXNwaW5fdW5sb2NrX2JoKCZody0+Y21kbG9jayk7Ci0JfQotCURCRkVYSVQ7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogaGZhMzg0eF9jbWRfdHJhbnNtaXQKLSoKLSogSW5zdHJ1Y3RzIHRoZSBmaXJtd2FyZSB0byB0cmFuc21pdCBhIGZyYW1lIHByZXZpb3VzbHkgY29waWVkCi0qIHRvIGEgZ2l2ZW4gYnVmZmVyLiAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIGltbWVkaWF0ZWx5LCB0aGUgVHgKLSogcmVzdWx0cyBhcmUgYXZhaWxhYmxlIHZpYSB0aGUgVHggb3IgVHhFeGMgZXZlbnRzIChpZiB0aGUgZnJhbWUKLSogY29udHJvbCBiaXRzIGFyZSBzZXQpLiAgVGhlIHJlY2xhaW0gYXJndW1lbnQgc3BlY2lmaWVzIGlmIHRoZQotKiBGSUQgcGFzc2VkIHdpbGwgYmUgdXNlZCBieSB0aGUgZi93IHR4IHByb2Nlc3Mgb3IgcmV0dXJuZWQgZm9yCi0qIHVzZSB3LyBhbm90aGVyIHRyYW5zbWl0IGNvbW1hbmQuICBJZiByZWNsYWltIGlzIHNldCwgZXhwZWN0IGFuCi0qIEFsbG9jIGV2ZW50IHNpZ25hbGxpbmcgdGhlIGF2YWlsaWJpbGl0eSBvZiB0aGUgRklEIGZvciByZXVzZS4KLSoKLSogTk9URTogaHctPmNtZGxvY2sgTVVTVCBCRSBIRUxEIGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24hCi0qCi0qIEFyZ3VtZW50czoKLSoJaHcJCWRldmljZSBzdHJ1Y3R1cmUKLSoJcmVjbGFpbQkJWzB8MV0gaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGdpdmVuIEZJRCB3aWxsCi0qCQkJYmUgaGFuZGVkIGJhY2sgKHZpYSBBbGxvYyBldmVudCkgZm9yIHJldXNlLgotKgkJCShob3N0IG9yZGVyKQotKglxb3MJCVswLTNdIFZhbHVlIHRvIHB1dCBpbiB0aGUgUW9TIGZpZWxkIG9mIHRoZQotKgkJCXR4IGNvbW1hbmQsIGlkZW50aWZpZXMgYSBxdWV1ZSB0byBwbGFjZSB0aGUKLSoJCQlvdXRnb2luZyBmcmFtZSBpbi4KLSoJCQkoaG9zdCBvcmRlcikKLSoJZmlkCQlGSUQgb2YgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIGZyYW1lIHRoYXQgd2FzCi0qCQkJcHJldmlvdXNseSBjb3BpZWQgdG8gTUFDIG1lbW9yeSB2aWEgdGhlIGJhcC4KLSoJCQkoaG9zdCBvcmRlcikKLSoKLSogUmV0dXJuczoKLSoJMAkJc3VjY2VzcwotKgk+MAkJZi93IHJlcG9ydGVkIGZhaWx1cmUgLSBmL3cgc3RhdHVzIGNvZGUKLSoJPDAJCWRyaXZlciByZXBvcnRlZCBlcnJvciAodGltZW91dHxiYWQgYXJnKQotKgotKiBTaWRlIGVmZmVjdHM6Ci0qCWh3LT5yZXNwMCB3aWxsIGNvbnRhaW4gdGhlIEZJRCBiZWluZyB1c2VkIGJ5IGFzeW5jIHR4Ci0qCXByb2Nlc3MuICBJZiByZWNsYWltPT0wLCByZXNwMCB3aWxsIGJlIHRoZSBzYW1lIGFzIHRoZSBmaWQKLSoJYXJndW1lbnQuICBJZiByZWNsYWltPT0xLCByZXNwMCB3aWxsIGJlIHRoZSBkaWZmZXJlbnQgYW5kCi0qCWlzIHRoZSB2YWx1ZSB0byB3YXRjaCBmb3IgaW4gdGhlIFR4fFR4RXhjIHRvIGluZGljYXRlIGNvbXBsZXRpb24KLSoJb2YgdGhlIGZyYW1lIHBhc3NlZCBpbiBmaWQuCi0qCi0qIENhbGwgY29udGV4dDoKLSoJcHJvY2VzcyB0aHJlYWQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IGhmYTM4NHhfY21kX3RyYW5zbWl0KGhmYTM4NHhfdCAqaHcsIFVJTlQxNiByZWNsYWltLCBVSU5UMTYgcW9zLCBVSU5UMTYgZmlkKQotewotCWludAlyZXN1bHQgPSAwOwotCWhmYTM4NHhfbWV0YWNtZF90IGNtZDsKLQotCURCRkVOVEVSOwotCWNtZC5jbWQgPSBIRkEzODR4X0NNRF9DTURDT0RFX1NFVChIRkEzODR4X0NNRENPREVfVFgpIHwKLQkJSEZBMzg0eF9DTURfUkVDTF9TRVQocmVjbGFpbSkgfAotCQlIRkEzODR4X0NNRF9RT1NfU0VUKHFvcyk7Ci0JY21kLnBhcm0wID0gZmlkOwotCWNtZC5wYXJtMSA9IDA7Ci0JY21kLnBhcm0yID0gMDsKLQotCXJlc3VsdCA9IGhmYTM4NHhfZG9jbWRfd2FpdChodywgJmNtZCk7Ci0KLQlEQkZFWElUOwotCXJldHVybiByZXN1bHQ7Ci19Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIGhmYTM4NHhfY21kX2NsZWFycGVyc2lzdAotKgotKiBJbnN0cnVjdHMgdGhlIGZpcm13YXJlIHRvIGNsZWFyIHRoZSBwZXJzaXN0ZW5jZSBiaXQgaW4gYSBnaXZlbgotKiBGSUQuICBUaGlzIGhhcyB0aGUgZWZmZWN0IG9mIHRlbGxpbmcgdGhlIGZpcm13YXJlIHRvIGRyb3AgdGhlCi0qIHBlcnNpc3RlbnQgZnJhbWUuICBUaGUgRklEIG11c3QgYmUgb25lIHRoYXQgd2FzIHByZXZpb3VzbHkgdXNlZAotKiB0byB0cmFuc21pdCBhIFBSU1QgZnJhbWUuCi0qCi0qIEFyZ3VtZW50czoKLSoJaHcJCWRldmljZSBzdHJ1Y3R1cmUKLSoJZmlkCQlGSUQgb2YgdGhlIHBlcnNpc3RlbnQgZnJhbWUgKGhvc3Qgb3JkZXIpCi0qCi0qIFJldHVybnM6Ci0qCTAJCXN1Y2Nlc3MKLSoJPjAJCWYvdyByZXBvcnRlZCBmYWlsdXJlIC0gZi93IHN0YXR1cyBjb2RlCi0qCTwwCQlkcml2ZXIgcmVwb3J0ZWQgZXJyb3IgKHRpbWVvdXR8YmFkIGFyZykKLSoKLSogU2lkZSBlZmZlY3RzOgotKgotKiBDYWxsIGNvbnRleHQ6Ci0qCXByb2Nlc3MgdGhyZWFkCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCBoZmEzODR4X2NtZF9jbGVhcnBlcnNpc3QoaGZhMzg0eF90ICpodywgVUlOVDE2IGZpZCkKLXsKLQlpbnQJcmVzdWx0ID0gMDsKLQloZmEzODR4X21ldGFjbWRfdCBjbWQ7Ci0KLQlEQkZFTlRFUjsKLQotCWNtZC5jbWQgPSBIRkEzODR4X0NNRF9DTURDT0RFX1NFVChIRkEzODR4X0NNRENPREVfQ0xSUFJTVCk7Ci0JY21kLnBhcm0wID0gZmlkOwotCWNtZC5wYXJtMSA9IDA7Ci0JY21kLnBhcm0yID0gMDsKLQotCXNwaW5fbG9ja19iaCgmaHctPmNtZGxvY2spOwotCXJlc3VsdCA9IGhmYTM4NHhfZG9jbWRfd2FpdChodywgJmNtZCk7Ci0Jc3Bpbl91bmxvY2tfYmgoJmh3LT5jbWRsb2NrKTsKLQotCURCRkVYSVQ7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIGhmYTM4NHhfY21kX25vdGlmeQotKgotKiBTZW5kcyBhbiBpbmZvIGZyYW1lIHRvIHRoZSBmaXJtd2FyZSB0byBhbHRlciB0aGUgYmVoYXZpb3IKLSogb2YgdGhlIGYvdyBhc3luY2ggcHJvY2Vzc2VzLiAgQ2FuIG9ubHkgYmUgY2FsbGVkIHdoZW4gdGhlIE1BQwotKiBpcyBpbiB0aGUgZW5hYmxlZCBzdGF0ZS4KLSoKLSogQXJndW1lbnRzOgotKglodwkJZGV2aWNlIHN0cnVjdHVyZQotKglyZWNsYWltCQlbMHwxXSBpbmRpY2F0ZXMgd2hldGhlciB0aGUgZ2l2ZW4gRklEIHdpbGwKLSoJCQliZSBoYW5kZWQgYmFjayAodmlhIEFsbG9jIGV2ZW50KSBmb3IgcmV1c2UuCi0qCQkJKGhvc3Qgb3JkZXIpCi0qCWZpZAkJRklEIG9mIGJ1ZmZlciBjb250YWluaW5nIHRoZSBmcmFtZSB0aGF0IHdhcwotKgkJCXByZXZpb3VzbHkgY29waWVkIHRvIE1BQyBtZW1vcnkgdmlhIHRoZSBiYXAuCi0qCQkJKGhvc3Qgb3JkZXIpCi0qCi0qIFJldHVybnM6Ci0qCTAJCXN1Y2Nlc3MKLSoJPjAJCWYvdyByZXBvcnRlZCBmYWlsdXJlIC0gZi93IHN0YXR1cyBjb2RlCi0qCTwwCQlkcml2ZXIgcmVwb3J0ZWQgZXJyb3IgKHRpbWVvdXR8YmFkIGFyZykKLSoKLSogU2lkZSBlZmZlY3RzOgotKglody0+cmVzcDAgd2lsbCBjb250YWluIHRoZSBGSUQgYmVpbmcgdXNlZCBieSBhc3luYyBub3RpZnkKLSoJcHJvY2Vzcy4gIElmIHJlY2xhaW09PTAsIHJlc3AwIHdpbGwgYmUgdGhlIHNhbWUgYXMgdGhlIGZpZAotKglhcmd1bWVudC4gIElmIHJlY2xhaW09PTEsIHJlc3AwIHdpbGwgYmUgdGhlIGRpZmZlcmVudC4KLSoKLSogQ2FsbCBjb250ZXh0OgotKglwcm9jZXNzIHRocmVhZAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgaGZhMzg0eF9jbWRfbm90aWZ5KGhmYTM4NHhfdCAqaHcsIFVJTlQxNiByZWNsYWltLCBVSU5UMTYgZmlkLAotCQkgICAgICAgdm9pZCAqYnVmLCBVSU5UMTYgbGVuKQotewotCWludAlyZXN1bHQgPSAwOwotCWhmYTM4NHhfbWV0YWNtZF90IGNtZDsKLQotCURCRkVOVEVSOwotCWNtZC5jbWQgPSBIRkEzODR4X0NNRF9DTURDT0RFX1NFVChIRkEzODR4X0NNRENPREVfTk9USUZZKSB8Ci0JCUhGQTM4NHhfQ01EX1JFQ0xfU0VUKHJlY2xhaW0pOwotCWNtZC5wYXJtMCA9IGZpZDsKLQljbWQucGFybTEgPSAwOwotCWNtZC5wYXJtMiA9IDA7Ci0KLQlzcGluX2xvY2tfYmgoJmh3LT5jbWRsb2NrKTsKLQotICAgICAgICAvKiBDb3B5IHRoZSByZWNvcmQgdG8gRklEICovCi0gICAgICAgIHJlc3VsdCA9IGhmYTM4NHhfY29weV90b19iYXAoaHcsIEhGQTM4NHhfQkFQX1BST0MsIGh3LT5pbmZvZmlkLCAwLCBidWYsIGxlbik7Ci0gICAgICAgIGlmICggcmVzdWx0ICkgewotICAgICAgICAgICAgICAgIFdMQU5fTE9HX0RFQlVHKDEsCi0JCQkiY29weV90b19iYXAoJTA0eCwgMCwgJWQpIGZhaWxlZCwgcmVzdWx0PTB4JXhcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBody0+aW5mb2ZpZCwgbGVuLCByZXN1bHQpOwotCQlyZXN1bHQgPSAtRUlPOwotICAgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOwotICAgICAgICB9Ci0KLQlyZXN1bHQgPSBoZmEzODR4X2RvY21kX3dhaXQoaHcsICZjbWQpOwotCi0gZmFpbGVkOgotCXNwaW5fdW5sb2NrX2JoKCZody0+Y21kbG9jayk7Ci0KLQlEQkZFWElUOwotCXJldHVybiByZXN1bHQ7Ci19Ci0KLQotI2lmIDAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBoZmEzODR4X2NtZF9pbnF1aXJ5Ci0qCi0qIFJlcXVlc3RzIGFuIGluZm8gZnJhbWUgZnJvbSB0aGUgZmlybXdhcmUuICBUaGUgaW5mbyBmcmFtZSB3aWxsCi0qIGJlIGRlbGl2ZXJlZCBhc3luY2hyb25vdXNseSB2aWEgdGhlIEluZm8gZXZlbnQuCi0qCi0qIEFyZ3VtZW50czoKLSoJaHcJCWRldmljZSBzdHJ1Y3R1cmUKLSoJZmlkCQlGSUQgb2YgdGhlIGluZm8gZnJhbWUgcmVxdWVzdGVkLiAoaG9zdCBvcmRlcikKLSoKLSogUmV0dXJuczoKLSoJMAkJc3VjY2VzcwotKgk+MAkJZi93IHJlcG9ydGVkIGZhaWx1cmUgLSBmL3cgc3RhdHVzIGNvZGUKLSoJPDAJCWRyaXZlciByZXBvcnRlZCBlcnJvciAodGltZW91dHxiYWQgYXJnKQotKgotKiBTaWRlIGVmZmVjdHM6Ci0qCi0qIENhbGwgY29udGV4dDoKLSoJcHJvY2VzcyB0aHJlYWQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotc3RhdGljIGludCBoZmEzODR4X2NtZF9pbnF1aXJ5KGhmYTM4NHhfdCAqaHcsIFVJTlQxNiBmaWQpCi17Ci0JaW50CXJlc3VsdCA9IDA7Ci0JaGZhMzg0eF9tZXRhY21kX3QgY21kOwotCi0JREJGRU5URVI7Ci0KLQljbWQuY21kID0gSEZBMzg0eF9DTURfQ01EQ09ERV9TRVQoSEZBMzg0eF9DTURDT0RFX0lOUSk7Ci0JY21kLnBhcm0wID0gZmlkOwotCWNtZC5wYXJtMSA9IDA7Ci0JY21kLnBhcm0yID0gMDsKLQotCXNwaW5fbG9ja19iaCgmaHctPmNtZGxvY2spOwotCXJlc3VsdCA9IGhmYTM4NHhfZG9jbWRfd2FpdChodywgJmNtZCk7Ci0Jc3Bpbl91bmxvY2tfYmgoJmh3LT5jbWRsb2NrKTsKLQotCURCRkVYSVQ7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLSNlbmRpZgotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBoZmEzODR4X2NtZF9hY2Nlc3MKLSoKLSogUmVxdWVzdHMgdGhhdCBhIGdpdmVuIHJlY29yZCBiZSBjb3BpZWQgdG8vZnJvbSB0aGUgcmVjb3JkCi0qIGJ1ZmZlci4gIElmIHdlJ3JlIHdyaXRpbmcgZnJvbSB0aGUgcmVjb3JkIGJ1ZmZlciwgdGhlIGNvbnRlbnRzCi0qIG11c3QgcHJldmlvdXNseSBoYXZlIGJlZW4gd3JpdHRlbiB0byB0aGUgcmVjb3JkIGJ1ZmZlciB2aWEgdGhlCi0qIGJhcC4gIElmIHdlJ3JlIHJlYWRpbmcgaW50byB0aGUgcmVjb3JkIGJ1ZmZlciwgdGhlIHJlY29yZCBjYW4KLSogYmUgcmVhZCBvdXQgb2YgdGhlIHJlY29yZCBidWZmZXIgYWZ0ZXIgdGhpcyBjYWxsLgotKgotKiBBcmd1bWVudHM6Ci0qCWh3CQlkZXZpY2Ugc3RydWN0dXJlCi0qCXdyaXRlCQlbMHwxXSBjb3B5IHRoZSByZWNvcmQgYnVmZmVyIHRvIHRoZSBnaXZlbgotKgkJCWNvbmZpZ3VyYXRpb24gcmVjb3JkLiAoaG9zdCBvcmRlcikKLSoJcmlkCQlSSUQgb2YgdGhlIHJlY29yZCB0byByZWFkL3dyaXRlLiAoaG9zdCBvcmRlcikKLSoJYnVmCQlob3N0IHNpZGUgcmVjb3JkIGJ1ZmZlci4gIFVwb24gcmV0dXJuIGl0IHdpbGwKLSoJCQljb250YWluIHRoZSBib2R5IHBvcnRpb24gb2YgdGhlIHJlY29yZCAobWludXMgdGhlCi0qCQkJUklEIGFuZCBsZW4pLgotKglsZW4JCWJ1ZmZlciBsZW5ndGggKGluIGJ5dGVzLCBzaG91bGQgbWF0Y2ggcmVjb3JkIGxlbmd0aCkKLSoKLSogUmV0dXJuczoKLSoJMAkJc3VjY2VzcwotKgk+MAkJZi93IHJlcG9ydGVkIGZhaWx1cmUgLSBmL3cgc3RhdHVzIGNvZGUKLSoJPDAJCWRyaXZlciByZXBvcnRlZCBlcnJvciAodGltZW91dHxiYWQgYXJnKQotKgotKiBTaWRlIGVmZmVjdHM6Ci0qCi0qIENhbGwgY29udGV4dDoKLSoJcHJvY2VzcyB0aHJlYWQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IGhmYTM4NHhfY21kX2FjY2VzcyhoZmEzODR4X3QgKmh3LCBVSU5UMTYgd3JpdGUsIFVJTlQxNiByaWQsCi0JCSAgICAgICB2b2lkKiBidWYsIFVJTlQxNiBsZW4pCi17Ci0JaW50CXJlc3VsdCA9IDA7Ci0JaGZhMzg0eF9tZXRhY21kX3QgY21kOwotCWhmYTM4NHhfcmVjX3QJcmVjOwotCi0JREJGRU5URVI7Ci0KLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNCwwKSkKLQkvKiBUaGlzIHNob3VsZCBOT1QgYmUgY2FsbGVkIGluIGludGVycnVwdCBjb250ZXh0ISAqLwotCWlmIChpbl9pcnEoKSkgewotCQlXTEFOX0xPR19FUlJPUigiS3JhcCwgaW4gSW50ZXJydXB0IGNvbnRleHQhIik7Ci0jaWZkZWYgV0xBTl9JTkNMVURFX0RFQlVHCi0JCUJVRygpOwotI2VuZGlmCi0JfQotI2VuZGlmCi0Jc3Bpbl9sb2NrX2JoKCZody0+Y21kbG9jayk7Ci0KLQlpZiAod3JpdGUpIHsKLQkJcmVjLnJpZCA9IGhvc3QyaGZhMzg0eF8xNihyaWQpOwotCQlyZWMucmVjbGVuID0gaG9zdDJoZmEzODR4XzE2KChsZW4vMikgKyAxKTsgLyogbm90ZSBjb252ZXJzaW9uIHRvIHdvcmRzLCArMSBmb3IgcmlkIGZpZWxkICovCi0JCS8qIHdyaXRlIHRoZSByZWNvcmQgKi8KLQkJcmVzdWx0ID0gaGZhMzg0eF9jb3B5X3RvX2JhcDQoIGh3LCBIRkEzODR4X0JBUF9QUk9DLCByaWQsIDAsCi0JCQkJCSAgICAgICAmcmVjLCBzaXplb2YocmVjKSwKLQkJCQkJICAgICAgIGJ1ZiwgbGVuLAotCQkJCQkgICAgICAgTlVMTCwgMCwgTlVMTCwgMCk7Ci0JCWlmICggcmVzdWx0ICkgewotCQkJV0xBTl9MT0dfREVCVUcoMywiRmFpbHVyZSB3cml0aW5nIHJlY29yZCBoZWFkZXIrZGF0YVxuIik7Ci0JCQlnb3RvIGZhaWw7Ci0JCX0KLQotCX0KLQotCWNtZC5jbWQgPSBIRkEzODR4X0NNRF9DTURDT0RFX1NFVChIRkEzODR4X0NNRENPREVfQUNDRVNTKSB8Ci0JCUhGQTM4NHhfQ01EX1dSSVRFX1NFVCh3cml0ZSk7Ci0JY21kLnBhcm0wID0gcmlkOwotCWNtZC5wYXJtMSA9IDA7Ci0JY21kLnBhcm0yID0gMDsKLQotCXJlc3VsdCA9IGhmYTM4NHhfZG9jbWRfd2FpdChodywgJmNtZCk7Ci0JaWYgKCByZXN1bHQgKSB7Ci0JCVdMQU5fTE9HX0VSUk9SKCJDYWxsIHRvIGhmYTM4NHhfZG9jbWRfd2FpdCBmYWlsZWQgKCVkICVkKVxuIiwKLQkJCQlyZXN1bHQsIGNtZC5yZXN1bHQucmVzcDApOwotCQlnb3RvIGZhaWw7Ci0JfQotCi0JaWYgKCF3cml0ZSkgewotCQlyZXN1bHQgPSBoZmEzODR4X2NvcHlfZnJvbV9iYXAoIGh3LCBIRkEzODR4X0JBUF9QUk9DLCByaWQsIDAsICZyZWMsIHNpemVvZihyZWMpKTsKLQkJaWYgKCByZXN1bHQgKSB7Ci0JCQlXTEFOX0xPR19ERUJVRygzLCJDYWxsIHRvIGhmYTM4NHhfY29weV9mcm9tX2JhcCBmYWlsZWRcbiIpOwotCQkJZ290byBmYWlsOwotCQl9Ci0KLQkJLyogVmFsaWRhdGUgdGhlIHJlY29yZCBsZW5ndGggKi8KLQkJaWYgKCAoKGhmYTM4NHgyaG9zdF8xNihyZWMucmVjbGVuKS0xKSoyKSAhPSBsZW4gKSB7ICAvKiBub3RlIGJvZHkgbGVuIGNhbGN1bGF0aW9uIGluIGJ5dGVzICovCi0JCQlXTEFOX0xPR19ERUJVRygxLCAiUklEIGxlbiBtaXNtYXRjaCwgcmlkPTB4JTA0eCBobGVuPSVkIGZ3bGVuPSVkXG4iLAotCQkJCQlyaWQsIGxlbiwgKGhmYTM4NHgyaG9zdF8xNihyZWMucmVjbGVuKS0xKSoyKTsKLQkJCXJlc3VsdCA9IC1FTk9EQVRBOwotCQkJZ290byBmYWlsOwotCQl9Ci0KLQkJcmVzdWx0ID0gaGZhMzg0eF9jb3B5X2Zyb21fYmFwKCBodywgSEZBMzg0eF9CQVBfUFJPQywgcmlkLCBzaXplb2YocmVjKSwgYnVmLCBsZW4pOwotCi0JfQotCi0gZmFpbDoKLQlzcGluX3VubG9ja19iaCgmaHctPmNtZGxvY2spOwotCURCRkVYSVQ7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogaGZhMzg0eF9jbWRfbW9uaXRvcgotKgotKiBFbmFibGVzIHRoZSAnbW9uaXRvciBtb2RlJyBvZiB0aGUgTUFDLiAgSGVyZSdzIHRoZSBkZXNjcmlwdGlvbiBvZgotKiBtb25pdG9yIG1vZGUgdGhhdCBJJ3ZlIHJlY2VpdmVkIHRodXMgZmFyOgotKgotKiAgIlRoZSAibW9uaXRvciBtb2RlIiBvZiBvcGVyYXRpb24gaXMgdGhhdCB0aGUgTUFDIHBhc3NlcyBhbGwKLSogIGZyYW1lcyBmb3Igd2hpY2ggdGhlIFBMQ1AgY2hlY2tzIGFyZSBjb3JyZWN0LiBBbGwgcmVjZWl2ZWQKLSogIE1QRFVzIGFyZSBwYXNzZWQgdG8gdGhlIGhvc3Qgd2l0aCBNQUMgUG9ydCA9IDcsIHdpdGggYQotKiAgcmVjZWl2ZSBzdGF0dXMgb2YgZ29vZCwgRkNTIGVycm9yLCBvciB1bmRlY3J5cHRhYmxlLiBQYXNzaW5nCi0qICBjZXJ0YWluIE1QRFVzIGlzIGEgdmlvbGF0aW9uIG9mIHRoZSA4MDIuMTEgc3RhbmRhcmQsIGJ1dCB1c2VmdWwKLSogIGZvciBhIGRlYnVnZ2luZyB0b29sLiIgIE5vcm1hbCBjb21tdW5pY2F0aW9uIGlzIG5vdCBwb3NzaWJsZQotKiAgd2hpbGUgbW9uaXRvciBtb2RlIGlzIGVuYWJsZWQuCi0qCi0qIEFyZ3VtZW50czoKLSoJaHcJCWRldmljZSBzdHJ1Y3R1cmUKLSoJZW5hYmxlCQlhIGNvZGUgKDB4MGJ8MHgwZikgdGhhdCBlbmFibGVzL2Rpc2FibGVzCi0qCQkJbW9uaXRvciBtb2RlLiAoaG9zdCBvcmRlcikKLSoKLSogUmV0dXJuczoKLSoJMAkJc3VjY2VzcwotKgk+MAkJZi93IHJlcG9ydGVkIGZhaWx1cmUgLSBmL3cgc3RhdHVzIGNvZGUKLSoJPDAJCWRyaXZlciByZXBvcnRlZCBlcnJvciAodGltZW91dHxiYWQgYXJnKQotKgotKiBTaWRlIGVmZmVjdHM6Ci0qCi0qIENhbGwgY29udGV4dDoKLSoJcHJvY2VzcyB0aHJlYWQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IGhmYTM4NHhfY21kX21vbml0b3IoaGZhMzg0eF90ICpodywgVUlOVDE2IGVuYWJsZSkKLXsKLQlpbnQJcmVzdWx0ID0gMDsKLQloZmEzODR4X21ldGFjbWRfdCBjbWQ7Ci0KLQlEQkZFTlRFUjsKLQotCWNtZC5jbWQgPSBIRkEzODR4X0NNRF9DTURDT0RFX1NFVChIRkEzODR4X0NNRENPREVfTU9OSVRPUikgfAotCQlIRkEzODR4X0NNRF9BSU5GT19TRVQoZW5hYmxlKTsKLQljbWQucGFybTAgPSAwOwotCWNtZC5wYXJtMSA9IDA7Ci0JY21kLnBhcm0yID0gMDsKLQotCXNwaW5fbG9ja19iaCgmaHctPmNtZGxvY2spOwotCXJlc3VsdCA9IGhmYTM4NHhfZG9jbWRfd2FpdChodywgJmNtZCk7Ci0Jc3Bpbl91bmxvY2tfYmgoJmh3LT5jbWRsb2NrKTsKLQotCURCRkVYSVQ7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogaGZhMzg0eF9jbWRfZG93bmxvYWQKLSoKLSogU2V0cyB0aGUgY29udHJvbHMgZm9yIHRoZSBNQUMgY29udHJvbGxlciBjb2RlL2RhdGEgZG93bmxvYWQKLSogcHJvY2Vzcy4gIFRoZSBhcmd1bWVudHMgc2V0IHRoZSBtb2RlIGFuZCBhZGRyZXNzIGFzc29jaWF0ZWQKLSogd2l0aCBhIGRvd25sb2FkLiAgTm90ZSB0aGF0IHRoZSBhdXggcmVnaXN0ZXJzIHNob3VsZCBiZSBlbmFibGVkCi0qIHByaW9yIHRvIHNldHRpbmcgb25lIG9mIHRoZSBkb3dubG9hZCBlbmFibGUgbW9kZXMuCi0qCi0qIEFyZ3VtZW50czoKLSoJaHcJCWRldmljZSBzdHJ1Y3R1cmUKLSoJbW9kZQkJMCAtIERpc2FibGUgcHJvZ3JhbW1pbmcgYW5kIGJlZ2luIGNvZGUgZXhlYwotKgkJCTEgLSBFbmFibGUgdm9sYXRpbGUgbWVtIHByb2dyYW1taW5nCi0qCQkJMiAtIEVuYWJsZSBub24tdm9sYXRpbGUgbWVtIHByb2dyYW1taW5nCi0qCQkJMyAtIFByb2dyYW0gbm9uLXZvbGF0aWxlIHNlY3Rpb24gZnJvbSBOViBkb3dubG9hZAotKgkJCSAgICBidWZmZXIuCi0qCQkJKGhvc3Qgb3JkZXIpCi0qCWxvd2FkZHIKLSoJaGlnaGFkZHIJRm9yIG1vZGUgMSwgc2V0cyB0aGUgaGlnaCAmIGxvdyBvcmRlciBiaXRzIG9mCi0qCQkJdGhlICJkZXN0aW5hdGlvbiBhZGRyZXNzIi4gIFRoaXMgYWRkcmVzcyB3aWxsIGJlCi0qCQkJdGhlIGV4ZWN1dGlvbiBzdGFydCBhZGRyZXNzIHdoZW4gZG93bmxvYWQgaXMKLSoJCQlzdWJzZXF1ZW50bHkgZGlzYWJsZWQuCi0qCQkJRm9yIG1vZGUgMiwgc2V0cyB0aGUgaGlnaCAmIGxvdyBvcmRlciBiaXRzIG9mCi0qCQkJdGhlIGRlc3RpbmF0aW9uIGluIE5WIHJhbS4KLSoJCQlGb3IgbW9kZXMgMCAmIDMsIHNob3VsZCBiZSB6ZXJvLiAoaG9zdCBvcmRlcikKLSoJCQlOT1RFOiB0aGVzZSBhZGRyZXNzIGFyZ3MgYXJlIGluIENNRCBmb3JtYXQKLSoJY29kZWxlbgkJTGVuZ3RoIG9mIHRoZSBkYXRhIHRvIHdyaXRlIGluIG1vZGUgMiwKLSoJCQl6ZXJvIG90aGVyd2lzZS4gKGhvc3Qgb3JkZXIpCi0qCi0qIFJldHVybnM6Ci0qCTAJCXN1Y2Nlc3MKLSoJPjAJCWYvdyByZXBvcnRlZCBmYWlsdXJlIC0gZi93IHN0YXR1cyBjb2RlCi0qCTwwCQlkcml2ZXIgcmVwb3J0ZWQgZXJyb3IgKHRpbWVvdXR8YmFkIGFyZykKLSoKLSogU2lkZSBlZmZlY3RzOgotKgotKiBDYWxsIGNvbnRleHQ6Ci0qCXByb2Nlc3MgdGhyZWFkCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCBoZmEzODR4X2NtZF9kb3dubG9hZChoZmEzODR4X3QgKmh3LCBVSU5UMTYgbW9kZSwgVUlOVDE2IGxvd2FkZHIsCi0JCQkJVUlOVDE2IGhpZ2hhZGRyLCBVSU5UMTYgY29kZWxlbikKLXsKLQlpbnQJcmVzdWx0ID0gMDsKLQloZmEzODR4X21ldGFjbWRfdCBjbWQ7Ci0KLQlEQkZFTlRFUjsKLQotCWNtZC5jbWQgPSBIRkEzODR4X0NNRF9DTURDT0RFX1NFVChIRkEzODR4X0NNRENPREVfRE9XTkxEKSB8Ci0JCUhGQTM4NHhfQ01EX1BST0dNT0RFX1NFVChtb2RlKTsKLQljbWQucGFybTAgPSBsb3dhZGRyOwotCWNtZC5wYXJtMSA9IGhpZ2hhZGRyOwotCWNtZC5wYXJtMiA9IGNvZGVsZW47Ci0KLQlzcGluX2xvY2tfYmgoJmh3LT5jbWRsb2NrKTsKLQlyZXN1bHQgPSBoZmEzODR4X2RsX2RvY21kX3dhaXQoaHcsICZjbWQpOwotCXNwaW5fdW5sb2NrX2JoKCZody0+Y21kbG9jayk7Ci0KLQlEQkZFWElUOwotCXJldHVybiByZXN1bHQ7Ci19Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIGhmYTM4NHhfY21kX2F1eF9lbmFibGUKLSoKLSogR29lcyB0aHJvdWdoIHRoZSBwcm9jZXNzIG9mIGVuYWJsaW5nIHRoZSBhdXhpbGFyeSBwb3J0LiAgVGhpcwotKiBpcyBuZWNlc3NhcnkgcHJpb3IgdG8gcmF3IHJlYWRzL3dyaXRlcyB0byBjYXJkIGRhdGEgc3BhY2UuCi0qIERpcmVjdCBhY2Nlc3MgdG8gdGhlIGNhcmQgZGF0YSBzcGFjZSBpcyBvbmx5IHVzZWQgZm9yIGRvd25sb2FkaW5nCi0qIGNvZGUgYW5kIGRlYnVnZ2luZy4KLSogTm90ZSB0aGF0IGEgY2FsbCB0byB0aGlzIGZ1bmN0aW9uIGlzIHJlcXVpcmVkIGJlZm9yZSBhdHRlbXB0aW5nCi0qIGEgZG93bmxvYWQuCi0qCi0qIEFyZ3VtZW50czoKLSoJaHcJCWRldmljZSBzdHJ1Y3R1cmUKLSoKLSogUmV0dXJuczoKLSoJMAkJc3VjY2VzcwotKgk+MAkJZi93IHJlcG9ydGVkIGZhaWx1cmUgLSBmL3cgc3RhdHVzIGNvZGUKLSoJPDAJCWRyaXZlciByZXBvcnRlZCBlcnJvciAodGltZW91dCkKLSoKLSogU2lkZSBlZmZlY3RzOgotKgotKiBDYWxsIGNvbnRleHQ6Ci0qCXByb2Nlc3MgdGhyZWFkCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCBoZmEzODR4X2NtZF9hdXhfZW5hYmxlKGhmYTM4NHhfdCAqaHcsIGludCBmb3JjZSkKLXsKLQlpbnQJCXJlc3VsdCA9IC1FVElNRURPVVQ7Ci0JdW5zaWduZWQgbG9uZwlmbGFnczsKLQlVSU5UMzIJCXJldHJpZXNfcmVtYWluaW5nOwotCVVJTlQxNgkJcmVnOwotCVVJTlQJCWF1eGVuX21pcnJvciA9IGh3LT5hdXhlbjsKLQotCURCRkVOVEVSOwotCi0JLyogQ2hlY2sgZm9yIGV4aXN0aW5nIGVuYWJsZSAqLwotCWlmICggaHctPmF1eGVuICkgewotCQlody0+YXV4ZW4rKzsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JLyogYWNxdWlyZSB0aGUgbG9jayAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCAmKGh3LT5jbWRsb2NrKSwgZmxhZ3MpOwotCS8qIHdhaXQgZm9yIGNtZCByZWdpc3RlciBidXN5IGJpdCB0byBjbGVhciAqLwotCXJldHJpZXNfcmVtYWluaW5nID0gMTAwMDAwOwotCWRvIHsKLQkJcmVnID0gaGZhMzg0eF9nZXRyZWcoaHcsIEhGQTM4NHhfQ01EKTsKLQkJdWRlbGF5KDEwKTsKLQl9Ci0Jd2hpbGUgKEhGQTM4NHhfQ01EX0lTQlVTWShyZWcpICYmIC0tcmV0cmllc19yZW1haW5pbmcpOwotCWlmIChyZXRyaWVzX3JlbWFpbmluZyAhPSAwKSB7Ci0JCS8qIGJ1c3kgYml0IGNsZWFyLCBpdCdzIE9LIHRvIHdyaXRlIHRvIFBhcmFtWCByZWdzICovCi0JCWhmYTM4NHhfc2V0cmVnKGh3LCBIRkEzODR4X0FVWFBXMCwKLQkJCUhGQTM4NHhfUEFSQU0wKTsKLQkJaGZhMzg0eF9zZXRyZWcoaHcsIEhGQTM4NHhfQVVYUFcxLAotCQkJSEZBMzg0eF9QQVJBTTEpOwotCQloZmEzODR4X3NldHJlZyhodywgSEZBMzg0eF9BVVhQVzIsCi0JCQlIRkEzODR4X1BBUkFNMik7Ci0KLQkJLyogU2V0IHRoZSBhdXggZW5hYmxlIGluIHRoZSBDb250cm9sIHJlZ2lzdGVyICovCi0JCWhmYTM4NHhfc2V0cmVnKGh3LCBIRkEzODR4X0NPTlRST0xfQVVYX0RPRU5BQkxFLAotCQkJSEZBMzg0eF9DT05UUk9MKTsKLQotCQkvKiBOb3cgd2FpdCBmb3IgY29tcGxldGlvbiAqLwotCQlyZXRyaWVzX3JlbWFpbmluZyA9IDEwMDAwMDsKLQkJZG8gewotCQkJcmVnID0gaGZhMzg0eF9nZXRyZWcoaHcsIEhGQTM4NHhfQ09OVFJPTCk7Ci0JCQl1ZGVsYXkoMTApOwotCQl9Ci0JCXdoaWxlICggKChyZWcgJiAoQklUMTR8QklUMTUpKSAhPSBIRkEzODR4X0NPTlRST0xfQVVYX0lTRU5BQkxFRCkgJiYKLQkJCS0tcmV0cmllc19yZW1haW5pbmcgKTsKLQkJaWYgKHJldHJpZXNfcmVtYWluaW5nICE9IDApIHsKLQkJCXJlc3VsdCA9IDA7Ci0JCQlody0+YXV4ZW4rKzsKLQkJfQotCX0KLQotCS8qIEZvcmNlIGl0IGVuYWJsZWQgZXZlbiBpZiB0aGUgY29tbWFuZCBmYWlsZWQsIGlmIHRvbGQuLiAqLwotCWlmICgoaHctPmF1eGVuID09IGF1eGVuX21pcnJvcikgJiYgZm9yY2UpCi0JCWh3LT5hdXhlbisrOwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSggJihody0+Y21kbG9jayksIGZsYWdzKTsKLQlEQkZFWElUOwotCXJldHVybiByZXN1bHQ7Ci19Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIGhmYTM4NHhfY21kX2F1eF9kaXNhYmxlCi0qCi0qIEdvZXMgdGhyb3VnaCB0aGUgcHJvY2VzcyBvZiBkaXNhYmxpbmcgdGhlIGF1eGlsYXJ5IHBvcnQKLSogZW5hYmxlZCB3aXRoIGF1eF9lbmFibGUoKS4KLSoKLSogQXJndW1lbnRzOgotKglodwkJZGV2aWNlIHN0cnVjdHVyZQotKgotKiBSZXR1cm5zOgotKgkwCQlzdWNjZXNzCi0qCT4wCQlmL3cgcmVwb3J0ZWQgZmFpbHVyZSAtIGYvdyBzdGF0dXMgY29kZQotKgk8MAkJZHJpdmVyIHJlcG9ydGVkIGVycm9yICh0aW1lb3V0KQotKgotKiBTaWRlIGVmZmVjdHM6Ci0qCi0qIENhbGwgY29udGV4dDoKLSoJcHJvY2VzcyB0aHJlYWQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IGhmYTM4NHhfY21kX2F1eF9kaXNhYmxlKGhmYTM4NHhfdCAqaHcpCi17Ci0JaW50CQlyZXN1bHQgPSAtRVRJTUVET1VUOwotCXVuc2lnbmVkIGxvbmcgICB0aW1lb3V0OwotCVVJTlQxNgkJcmVnID0gMDsKLQotCURCRkVOVEVSOwotCi0JLyogU2VlIGlmIHRoZXJlJ3MgbW9yZSB0aGFuIG9uZSBlbmFibGUgKi8KLQlpZiAoaHctPmF1eGVuKSBody0+YXV4ZW4tLTsKLQlpZiAoaHctPmF1eGVuKSByZXR1cm4gMDsKLQotCS8qIENsZWFyIHRoZSBhdXggZW5hYmxlIGluIHRoZSBDb250cm9sIHJlZ2lzdGVyICovCi0JaGZhMzg0eF9zZXRyZWcoaHcsIDAsIEhGQTM4NHhfUEFSQU0wKTsKLQloZmEzODR4X3NldHJlZyhodywgMCwgSEZBMzg0eF9QQVJBTTEpOwotCWhmYTM4NHhfc2V0cmVnKGh3LCAwLCBIRkEzODR4X1BBUkFNMik7Ci0JaGZhMzg0eF9zZXRyZWcoaHcsIEhGQTM4NHhfQ09OVFJPTF9BVVhfRE9ESVNBQkxFLAotCQlIRkEzODR4X0NPTlRST0wpOwotCi0JLyogTm93IHdhaXQgZm9yIGNvbXBsZXRpb24gKi8KLQl0aW1lb3V0ID0gamlmZmllcyArIDEqSFo7Ci0JcmVnID0gaGZhMzg0eF9nZXRyZWcoaHcsIEhGQTM4NHhfQ09OVFJPTCk7Ci0Jd2hpbGUgKCAoKHJlZyAmIChCSVQxNHxCSVQxNSkpICE9IEhGQTM4NHhfQ09OVFJPTF9BVVhfSVNESVNBQkxFRCkgJiYKLQkJdGltZV9iZWZvcmUoamlmZmllcyx0aW1lb3V0KSApewotCQl1ZGVsYXkoMTApOwotCQlyZWcgPSBoZmEzODR4X2dldHJlZyhodywgSEZBMzg0eF9DT05UUk9MKTsKLQl9Ci0JaWYgKChyZWcgJiAoQklUMTR8QklUMTUpKSA9PSBIRkEzODR4X0NPTlRST0xfQVVYX0lTRElTQUJMRUQgKSB7Ci0JCXJlc3VsdCA9IDA7Ci0JfQotCURCRkVYSVQ7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIGhmYTM4NHhfZHJ2cl9sb3dfbGV2ZWwKLSoKLSogV3JpdGUgdGVzdCBjb21tYW5kcyB0byB0aGUgY2FyZC4gIFNvbWUgdGVzdCBjb21tYW5kcyBkb24ndCBtYWtlCi0qIHNlbnNlIHdpdGhvdXQgcHJpb3Igc2V0LXVwLiAgRm9yIGV4YW1wbGUsIGNvbnRpbm91cyBUWCBpc24ndCB2ZXJ5Ci0qIHVzZWZ1bCB1bnRpbCB5b3Ugc2V0IHRoZSBjaGFubmVsLiAgVGhhdCBmdW5jdGlvbmFsaXR5IHNob3VsZCBiZQotKgotKiBTaWRlIGVmZmVjdHM6Ci0qCi0qIENhbGwgY29udGV4dDoKLSogICAgICBwcm9jZXNzIHRocmVhZAotKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgaGZhMzg0eF9kcnZyX2xvd19sZXZlbChoZmEzODR4X3QgKmh3LCBoZmEzODR4X21ldGFjbWRfdCAqY21kKQotewotCWludCAgICAgICAgICAgICByZXN1bHQgPSAwOwotCURCRkVOVEVSOwotCi0JLyogRG8gaSBuZWVkIGEgaG9zdDJoZmEuLi4gY29udmVyc2lvbiA/ICovCi0jaWYgMAotCXByaW50ayhLRVJOX0lORk8gIiUjeCAlI3ggJSN4ICUjeFxuIiwgY21kLT5jbWQsIGNtZC0+cGFybTAsIGNtZC0+cGFybTEsIGNtZC0+cGFybTIpOwotI2VuZGlmCi0Jc3Bpbl9sb2NrX2JoKCZody0+Y21kbG9jayk7Ci0JcmVzdWx0ID0gaGZhMzg0eF9kb2NtZF93YWl0KGh3LCBjbWQpOwotCXNwaW5fdW5sb2NrX2JoKCZody0+Y21kbG9jayk7Ci0KLQlEQkZFWElUOwotCXJldHVybiByZXN1bHQ7Ci19Ci0KLQotLyogVE9ETzogZGV0ZXJtaW5lIGlmIHRoZXNlIHdpbGwgZXZlciBiZSBuZWVkZWQgKi8KLSNpZiAwCi1pbnQgaGZhMzg0eF9jbWRfcmVhZG1pZihoZmEzODR4X3QgKmh3KQotewotCURCRkVOVEVSOwotCURCRkVYSVQ7Ci0JcmV0dXJuIDA7Ci19Ci0KLQotaW50IGhmYTM4NHhfY21kX3dyaXRlbWlmKGhmYTM4NHhfdCAqaHcpCi17Ci0JREJGRU5URVI7Ci0JREJGRVhJVDsKLQlyZXR1cm4gMDsKLX0KLSNlbmRpZgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogaGZhMzg0eF9kcnZyX21taV9yZWFkCi0qCi0qIFJlYWQgbW1pIHJlZ2lzdGVycy4gIG1taSBpcyBpbnRlcnNpbC1zcGVhayBmb3IgdGhlIGJhc2ViYW5kCi0qIHByb2Nlc3NvciByZWdpc3RlcnMuCi0qCi0qIEFyZ3VtZW50czoKLSogICAgICAgaHcgICAgICAgICAgICAgIGRldmljZSBzdHJ1Y3R1cmUKLSogICAgICAgcmVnaXN0ZXIgICAgICAgIFRoZSB0ZXN0IHJlZ2lzdGVyIHRvIGJlIGFjY2Vzc2VkIChtdXN0IGJlIGV2ZW4gIykuCi0qCi0qIFJldHVybnM6Ci0qICAgICAgIDAgICAgICAgICAgICAgICBzdWNjZXNzCi0qICAgICAgID4wICAgICAgICAgICAgICBmL3cgcmVwb3J0ZWQgZXJyb3IgLSBmL3cgc3RhdHVzIGNvZGUKLSogICAgICAgPDAgICAgICAgICAgICAgIGRyaXZlciByZXBvcnRlZCBlcnJvcgotKgotKiBTaWRlIGVmZmVjdHM6Ci0qCi0qIENhbGwgY29udGV4dDoKLSogICAgICAgcHJvY2VzcyB0aHJlYWQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IGhmYTM4NHhfZHJ2cl9tbWlfcmVhZChoZmEzODR4X3QgKmh3LCBVSU5UMzIgYWRkciwgVUlOVDMyICpyZXNwKQotewotICAgICAgICBpbnQgICAgICAgICAgICAgcmVzdWx0ID0gMDsKLQloZmEzODR4X21ldGFjbWRfdCBjbWQ7Ci0KLSAgICAgICAgREJGRU5URVI7Ci0JY21kLmNtZCA9IChVSU5UMTYpIDB4MzA7Ci0JY21kLnBhcm0wID0gKFVJTlQxNikgYWRkcjsKLQljbWQucGFybTEgPSAwOwotCWNtZC5wYXJtMiA9IDA7Ci0KLSAgICAgICAgLyogRG8gaSBuZWVkIGEgaG9zdDJoZmEuLi4gY29udmVyc2lvbiA/ICovCi0Jc3Bpbl9sb2NrX2JoKCZody0+Y21kbG9jayk7Ci0JcmVzdWx0ID0gaGZhMzg0eF9kb2NtZF93YWl0KGh3LCAmY21kKTsKLQlzcGluX3VubG9ja19iaCgmaHctPmNtZGxvY2spOwotCi0JKnJlc3AgPSAoVUlOVDMyKSBjbWQucmVzdWx0LnJlc3AwOwotCi0gICAgICAgIERCRkVYSVQ7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBoZmEzODR4X2RydnJfbW1pX3dyaXRlCi0qCi0qIFJlYWQgbW1pIHJlZ2lzdGVycy4gIG1taSBpcyBpbnRlcnNpbC1zcGVhayBmb3IgdGhlIGJhc2ViYW5kCi0qIHByb2Nlc3NvciByZWdpc3RlcnMuCi0qCi0qIEFyZ3VtZW50czoKLSogICAgICAgaHcgICAgICAgICAgICAgIGRldmljZSBzdHJ1Y3R1cmUKLSogICAgICAgYWRkciAgICAgICAgICAgIFRoZSB0ZXN0IHJlZ2lzdGVyIHRvIGJlIGFjY2Vzc2VkIChtdXN0IGJlIGV2ZW4gIykuCi0qICAgICAgIGRhdGEgICAgICAgICAgICBUaGUgZGF0YSB2YWx1ZSB0byB3cml0ZSB0byB0aGUgcmVnaXN0ZXIuCi0qCi0qIFJldHVybnM6Ci0qICAgICAgIDAgICAgICAgICAgICAgICBzdWNjZXNzCi0qICAgICAgID4wICAgICAgICAgICAgICBmL3cgcmVwb3J0ZWQgZXJyb3IgLSBmL3cgc3RhdHVzIGNvZGUKLSogICAgICAgPDAgICAgICAgICAgICAgIGRyaXZlciByZXBvcnRlZCBlcnJvcgotKgotKiBTaWRlIGVmZmVjdHM6Ci0qCi0qIENhbGwgY29udGV4dDoKLSogICAgICAgcHJvY2VzcyB0aHJlYWQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1pbnQKLWhmYTM4NHhfZHJ2cl9tbWlfd3JpdGUoaGZhMzg0eF90ICpodywgVUlOVDMyIGFkZHIsIFVJTlQzMiBkYXRhKQotewotICAgICAgICBpbnQgICAgICAgICAgICAgcmVzdWx0ID0gMDsKLQloZmEzODR4X21ldGFjbWRfdCBjbWQ7Ci0KLSAgICAgICAgREJGRU5URVI7Ci0JY21kLmNtZCA9IChVSU5UMTYpIDB4MzE7Ci0JY21kLnBhcm0wID0gKFVJTlQxNikgYWRkcjsKLQljbWQucGFybTEgPSAoVUlOVDE2KSBkYXRhOwotCWNtZC5wYXJtMiA9IDA7Ci0KLSAgICAgICAgV0xBTl9MT0dfREVCVUcoMSwibW1pIHdyaXRlIDogYWRkciA9IDB4JTA4eFxuIiwgYWRkcik7Ci0gICAgICAgIFdMQU5fTE9HX0RFQlVHKDEsIm1taSB3cml0ZSA6IGRhdGEgPSAweCUwOHhcbiIsIGRhdGEpOwotCi0gICAgICAgIC8qIERvIGkgbmVlZCBhIGhvc3QyaGZhLi4uIGNvbnZlcnNpb24gPyAqLwotCXNwaW5fbG9ja19iaCgmaHctPmNtZGxvY2spOwotCXJlc3VsdCA9IGhmYTM4NHhfZG9jbWRfd2FpdChodywgJmNtZCk7Ci0Jc3Bpbl91bmxvY2tfYmgoJmh3LT5jbWRsb2NrKTsKLQotICAgICAgICBEQkZFWElUOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotfQotCi0KLS8qIFRPRE86IGRldGVybWluZSBpZiB0aGVzZSB3aWxsIGV2ZXIgYmUgbmVlZGVkICovCi0jaWYgMAotaW50IGhmYTM4NHhfY21kX3JlYWRtaWYoaGZhMzg0eF90ICpodykKLXsKLSAgICAgICAgREJGRU5URVI7Ci0gICAgICAgIERCRkVYSVQ7Ci0gICAgICAgIHJldHVybiAwOwotfQotCi0KLWludCBoZmEzODR4X2NtZF93cml0ZW1pZihoZmEzODR4X3QgKmh3KQotewotICAgICAgICBEQkZFTlRFUjsKLSAgICAgICAgREJGRVhJVDsKLSAgICAgICAgcmV0dXJuIDA7Ci19Ci0jZW5kaWYKLQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBoZmEzODR4X2NvcHlfZnJvbV9iYXAKLSoKLSogQ29waWVzIGEgY29sbGVjdGlvbiBvZiBieXRlcyBmcm9tIHRoZSBNQUMgY29udHJvbGxlciBtZW1vcnkgdmlhCi0qIG9uZSBzZXQgb2YgQkFQIHJlZ2lzdGVycy4KLSoKLSogQXJndW1lbnRzOgotKglodwkJZGV2aWNlIHN0cnVjdHVyZQotKgliYXAJCVswfDFdIHdoaWNoIEJBUCB0byB1c2UKLSoJaWQJCUZJRCBvciBSSUQsIGRlc3RpbmVkIGZvciB0aGUgc2VsZWN0IHJlZ2lzdGVyIChob3N0IG9yZGVyKQotKglvZmZzZXQJCUFuIF9ldmVuXyBvZmZzZXQgaW50byB0aGUgYnVmZmVyIGZvciB0aGUgZ2l2ZW4KLSoJCQlGSUQvUklELiAgV2UgaGF2ZW4ndCB0aGUgbWVhbnMgdG8gdmFsaWRhdGUgdGhpcywKLSoJCQlzbyBiZSBjYXJlZnVsLiAoaG9zdCBvcmRlcikKLSoJYnVmCQlwdHIgdG8gYXJyYXkgb2YgYnl0ZXMKLSoJbGVuCQlsZW5ndGggb2YgZGF0YSB0byB0cmFuc2ZlciBpbiBieXRlcwotKgotKiBSZXR1cm5zOgotKgkwCQlzdWNjZXNzCi0qCT4wCQlmL3cgcmVwb3J0ZWQgZmFpbHVyZSAtIHZhbHVlIG9mIG9mZnNldCByZWcuCi0qCTwwCQlkcml2ZXIgcmVwb3J0ZWQgZXJyb3IgKHRpbWVvdXR8YmFkIGFyZykKLSoKLSogU2lkZSBlZmZlY3RzOgotKgotKiBDYWxsIGNvbnRleHQ6Ci0qCXByb2Nlc3MgdGhyZWFkCi0qCWludGVycnVwdAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgaGZhMzg0eF9jb3B5X2Zyb21fYmFwKGhmYTM4NHhfdCAqaHcsIFVJTlQxNiBiYXAsIFVJTlQxNiBpZCwgVUlOVDE2IG9mZnNldCwKLQkJCQl2b2lkICpidWYsIFVJTlQgbGVuKQotewotCWludAkJcmVzdWx0ID0gMDsKLQl1bnNpZ25lZCBsb25nCWZsYWdzID0gMDsKLQlVSU5UOAkJKmQgPSAoVUlOVDgqKWJ1ZjsKLQlVSU5UCQlzZWxlY3RyZWc7Ci0JVUlOVAkJb2Zmc2V0cmVnOwotCVVJTlQJCWRhdGFyZWc7Ci0JVUlOVAkJaTsKLQlVSU5UMTYJCXJlZyA9IDA7Ci0KLQlEQkZFTlRFUjsKLQotCS8qIFZhbGlkYXRlIGJhcCwgb2Zmc2V0LCBidWYsIGFuZCBsZW4gKi8KLQlpZiAoIChiYXAgPiAxKSB8fAotCSAgICAgKG9mZnNldCA+IEhGQTM4NHhfQkFQX09GRlNFVF9NQVgpIHx8Ci0JICAgICAob2Zmc2V0ICUgMikgfHwKLQkgICAgIChidWYgPT0gTlVMTCkgfHwKLQkgICAgIChsZW4gPiBIRkEzODR4X0JBUF9EQVRBTEVOX01BWCkgKXsKLQkgICAgIAlyZXN1bHQgPSAtRUlOVkFMOwotCX0gZWxzZSB7Ci0JCXNlbGVjdHJlZyA9IChiYXAgPT0gMSkgPyAgSEZBMzg0eF9TRUxFQ1QxIDogSEZBMzg0eF9TRUxFQ1QwIDsKLQkJb2Zmc2V0cmVnID0gKGJhcCA9PSAxKSA/ICBIRkEzODR4X09GRlNFVDEgOiBIRkEzODR4X09GRlNFVDAgOwotCQlkYXRhcmVnID0gICAoYmFwID09IDEpID8gIEhGQTM4NHhfREFUQTEgOiBIRkEzODR4X0RBVEEwIDsKLQotCQkvKiBPYnRhaW4gbG9jayAqLwotCQlzcGluX2xvY2tfaXJxc2F2ZSggJihody0+YmFwbG9jayksIGZsYWdzKTsKLQotCQkvKiBXcml0ZSBpZCB0byBzZWxlY3QgcmVnICovCi0JCWhmYTM4NHhfc2V0cmVnKGh3LCBpZCwgc2VsZWN0cmVnKTsKLQkJLyogV3JpdGUgb2Zmc2V0IHRvIG9mZnNldCByZWcgKi8KLQkJaGZhMzg0eF9zZXRyZWcoaHcsIG9mZnNldCwgb2Zmc2V0cmVnKTsKLQkJLyogV2FpdCBmb3Igb2Zmc2V0W2J1c3ldIHRvIGNsZWFyIChzZWUgQkFQX1RJTUVPVVQpICovCi0JCWkgPSAwOwotCQlkbyB7Ci0JCQlyZWcgPSBoZmEzODR4X2dldHJlZyhodywgb2Zmc2V0cmVnKTsKLQkJCWlmICggaSA+IDAgKSB1ZGVsYXkoMTApOwotCQkJaSsrOwotCQl9IHdoaWxlICggaSA8IHByaXNtMl9iYXBfdGltZW91dCAmJiBIRkEzODR4X09GRlNFVF9JU0JVU1kocmVnKSk7Ci0jaWYgKFdMQU5fSE9TVElGICE9IFdMQU5fUENJKQotCQkvKiBSZWxlYXNlIGxvY2sgKi8KLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSggJihody0+YmFwbG9jayksIGZsYWdzKTsKLSNlbmRpZgotCi0JCWlmICggSEZBMzg0eF9PRkZTRVRfSVNCVVNZKHJlZykgKXsKLQkJCS8qIElmIHRpbWVvdXQsIHJldHVybiAtRVRJTUVET1VUICovCi0JCQlyZXN1bHQgPSByZWc7Ci0JCX0gZWxzZSBpZiAoIEhGQTM4NHhfT0ZGU0VUX0lTRVJSKHJlZykgKXsKLQkJCS8qIElmIG9mZnNldFtlcnJdID09IDEsIHJldHVybiAtRUlOVkFMICovCi0JCQlyZXN1bHQgPSByZWc7Ci0JCX0gZWxzZSB7Ci0JCQkvKiBSZWFkIGV2ZW4obGVuKSBidWYgY29udGVudHMgZnJvbSBkYXRhIHJlZyAqLwotCQkJZm9yICggaSA9IDA7IGkgPCAobGVuICYgMHhmZmZlKTsgaSs9MiApIHsKLQkJCQkqKFVJTlQxNiopKCYoZFtpXSkpID0KLQkJCQkJaGZhMzg0eF9nZXRyZWdfbm9zd2FwKGh3LCBkYXRhcmVnKTsKLQkJCX0KLQkJCS8qIElmIGxlbiBvZGQsIGhhbmRsZSBsYXN0IGJ5dGUgKi8KLQkJCWlmICggbGVuICUgMiApewotCQkJCXJlZyA9IGhmYTM4NHhfZ2V0cmVnX25vc3dhcChodywgZGF0YXJlZyk7Ci0JCQkJZFtsZW4tMV0gPSAoKFVJTlQ4KikoJnJlZykpWzBdOwotCQkJfQotCQl9Ci0KLQkJLyogQWNjb3JkaW5nIHRvIEludGVyc2lsIGVycmF0YSBkYXRlZCA5LzE2LzAyOgotCi0JCSJJbiBQUklTTSBQQ0kgTUFDIGhvc3QgaW50ZXJmYWNlLCBpZiBib3RoIEJBUHMgYXJlIGNvbmN1cnJlbnRseQotCQkgcmVxdWVzaW5nIG1lbW9yeSBhY2Nlc3MsIGJvdGggd2lsbCBhY2NlcHQgdGhlIEFjay4gICBUaGVyZSBpcyBubwotCQkgZmlybXdhcmUgd29ya2Fyb3VuZCBwb3NzaWJsZS4gIFRvIHByZXZlbnQgQkFQIGFjY2VzcyBmYWlsdXJlcyBvcgotCQkgaGFuZyBjb25kaXRpb25zIHRoZSBob3N0IE1VU1QgTk9UIGFjY2VzcyBib3RoIEJBUHMgaW4gc3VjZXNzaW9uCi0JCSB1bmxlc3MgYXQgbGVhc3QgNXVzIGVsYXBzZXMgYmV0d2VlbiBhY2Nlc3Nlcy4gIFRoZSBzYWZlc3QgY2hvaWNlCi0JCSBpcyB0byBVU0UgT05MWSBPTkUgQkFQIGZvciBhbGwgZGF0YSBtb3ZlbWVudCBvcGVyYXRpb25zLiIKLQotCQkgV2hhdCB0aGlzIG1lYW5zOgotCi0JCSBXZSBoYXZlIHRvIHNlcmlhbGl6ZSBBTEwgQkFQIGFjY2Vzc2VzLCBhbmQgZnVydGhlcm1vcmUsIGFkZCBhIDV1cwotCQkgZGVsYXkgYWZ0ZXIgYWNjZXNzIGlmIHdlJ3JlIHVzaW5nIGEgUENJIHBsYXRmb3JtLgotCi0JCSBVbmZvcnR1bmF0ZWx5LCB0aGlzIG1lYW5zIHdlIGhhdmUgdG8gbG9jayBvdXQgaW50ZXJydXB0cyB0aHJvdWdvdXQKLQkJIHRoZSBlbnRpcmUgQkFQIGNvcHkuCi0KLQkJIEl0IHJlbWFpbnMgdG8gYmUgc2VlbiBpZiAiQkFQIGFjY2VzcyIgbWVhbnMgIkJBUCBzZXR1cCIgb3IgdGhlIG1vcmUKLQkJIGxpdGVyYWwgZGVmaW5pdGlvbiBvZiAiY29weWluZyBkYXRhIGJhY2sgYW5kIGZvcnRoIiAgSSdtIGVycmluZyBmb3IKLQkJIHRoZSBsYXR0ZXIsIHNhZmVyIGRlZmluaXRpb24uICAtLSBTTFAuCi0KLQkJKi8KLQotI2lmIChXTEFOX0hPU1RJRiA9PSBXTEFOX1BDSSkKLQkJdWRlbGF5KDUpOwotCQkvKiBSZWxlYXNlIGxvY2sgKi8KLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSggJihody0+YmFwbG9jayksIGZsYWdzKTsKLSNlbmRpZgotCi0JfQotCi0JaWYgKHJlc3VsdCkgewotCSAgV0xBTl9MT0dfREVCVUcoMSwKLQkJCSAgImNvcHlfZnJvbV9iYXAoMHglMDR4LCAwLCAlZCkgZmFpbGVkLCByZXN1bHQ9MHgleFxuIiwKLQkJCSAgcmVnLCBsZW4sIHJlc3VsdCk7Ci0JfQotCURCRkVYSVQ7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogaGZhMzg0eF9jb3B5X3RvX2JhcAotKgotKiBDb3BpZXMgYSBjb2xsZWN0aW9uIG9mIGJ5dGVzIHRvIHRoZSBNQUMgY29udHJvbGxlciBtZW1vcnkgdmlhCi0qIG9uZSBzZXQgb2YgQkFQIHJlZ2lzdGVycy4KLSoKLSogQXJndW1lbnRzOgotKglodwkJZGV2aWNlIHN0cnVjdHVyZQotKgliYXAJCVswfDFdIHdoaWNoIEJBUCB0byB1c2UKLSoJaWQJCUZJRCBvciBSSUQsIGRlc3RpbmVkIGZvciB0aGUgc2VsZWN0IHJlZ2lzdGVyIChob3N0IG9yZGVyKQotKglvZmZzZXQJCUFuIF9ldmVuXyBvZmZzZXQgaW50byB0aGUgYnVmZmVyIGZvciB0aGUgZ2l2ZW4KLSoJCQlGSUQvUklELiAgV2UgaGF2ZW4ndCB0aGUgbWVhbnMgdG8gdmFsaWRhdGUgdGhpcywKLSoJCQlzbyBiZSBjYXJlZnVsLiAoaG9zdCBvcmRlcikKLSoJYnVmCQlwdHIgdG8gYXJyYXkgb2YgYnl0ZXMKLSoJbGVuCQlsZW5ndGggb2YgZGF0YSB0byB0cmFuc2ZlciAoaW4gYnl0ZXMpCi0qCi0qIFJldHVybnM6Ci0qCTAJCXN1Y2Nlc3MKLSoJPjAJCWYvdyByZXBvcnRlZCBmYWlsdXJlIC0gdmFsdWUgb2Ygb2Zmc2V0IHJlZy4KLSoJPDAJCWRyaXZlciByZXBvcnRlZCBlcnJvciAodGltZW91dHxiYWQgYXJnKQotKgotKiBTaWRlIGVmZmVjdHM6Ci0qCi0qIENhbGwgY29udGV4dDoKLSoJcHJvY2VzcyB0aHJlYWQKLSoJaW50ZXJydXB0Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCBoZmEzODR4X2NvcHlfdG9fYmFwKGhmYTM4NHhfdCAqaHcsIFVJTlQxNiBiYXAsIFVJTlQxNiBpZCwgVUlOVDE2IG9mZnNldCwKLQkJCQl2b2lkICpidWYsIFVJTlQgbGVuKQotewotCXJldHVybiBoZmEzODR4X2NvcHlfdG9fYmFwNChodywgYmFwLCBpZCwgb2Zmc2V0LCBidWYsIGxlbiwgTlVMTCwgMCwgTlVMTCwgMCwgTlVMTCwgMCk7Ci19Ci0KLWludCBoZmEzODR4X2NvcHlfdG9fYmFwNChoZmEzODR4X3QgKmh3LCBVSU5UMTYgYmFwLCBVSU5UMTYgaWQsIFVJTlQxNiBvZmZzZXQsCi0JCQkgdm9pZCAqYnVmLCBVSU5UIGxlbjEsIHZvaWQqIGJ1ZjIsIFVJTlQgbGVuMiwKLQkJCSB2b2lkICpidWYzLCBVSU5UIGxlbjMsIHZvaWQgKmJ1ZjQsIFVJTlQgbGVuNCkKLXsKLQlpbnQJCXJlc3VsdCA9IDA7Ci0JdW5zaWduZWQgbG9uZwlmbGFncyA9IDA7Ci0JVUlOVDgJCSpkOwotCVVJTlQJCXNlbGVjdHJlZzsKLQlVSU5UCQlvZmZzZXRyZWc7Ci0JVUlOVAkJZGF0YXJlZzsKLQlVSU5UCQlpOwotCVVJTlQxNgkJcmVnOwotCi0JREJGRU5URVI7Ci0KLS8vCXByaW50ayhLRVJOX0RFQlVHICJjdGIxICVkIGlkICUwNHggbyAlZCAlZCAlZCAlZCAlZFxuIiwgYmFwLCBpZCwgb2Zmc2V0LCBsZW4xLCBsZW4yLCBsZW4zLCBsZW40KTsKLQotCS8qIFZhbGlkYXRlIGJhcCwgb2Zmc2V0LCBidWYsIGFuZCBsZW4gKi8KLQlpZiAoIChiYXAgPiAxKSB8fAotCSAgICAgKG9mZnNldCA+IEhGQTM4NHhfQkFQX09GRlNFVF9NQVgpIHx8Ci0JICAgICAob2Zmc2V0ICUgMikgfHwKLQkgICAgIChidWYgPT0gTlVMTCkgfHwKLQkgICAgIChsZW4xK2xlbjIrbGVuMytsZW40ID4gSEZBMzg0eF9CQVBfREFUQUxFTl9NQVgpICl7Ci0JICAgICAJcmVzdWx0ID0gLUVJTlZBTDsKLQl9IGVsc2UgewotCQlzZWxlY3RyZWcgPSAoYmFwID09IDEpID8gSEZBMzg0eF9TRUxFQ1QxIDogSEZBMzg0eF9TRUxFQ1QwOwotCQlvZmZzZXRyZWcgPSAoYmFwID09IDEpID8gSEZBMzg0eF9PRkZTRVQxIDogSEZBMzg0eF9PRkZTRVQwOwotCQlkYXRhcmVnID0gICAoYmFwID09IDEpID8gSEZBMzg0eF9EQVRBMSAgIDogSEZBMzg0eF9EQVRBMDsKLQkJLyogT2J0YWluIGxvY2sgKi8KLQkJc3Bpbl9sb2NrX2lycXNhdmUoICYoaHctPmJhcGxvY2spLCBmbGFncyk7Ci0KLQkJLyogV3JpdGUgaWQgdG8gc2VsZWN0IHJlZyAqLwotCQloZmEzODR4X3NldHJlZyhodywgaWQsIHNlbGVjdHJlZyk7Ci0JCXVkZWxheSgxMCk7Ci0JCS8qIFdyaXRlIG9mZnNldCB0byBvZmZzZXQgcmVnICovCi0JCWhmYTM4NHhfc2V0cmVnKGh3LCBvZmZzZXQsIG9mZnNldHJlZyk7Ci0JCS8qIFdhaXQgZm9yIG9mZnNldFtidXN5XSB0byBjbGVhciAoc2VlIEJBUF9USU1FT1VUKSAqLwotCQlpID0gMDsKLQkJZG8gewotCQkJcmVnID0gaGZhMzg0eF9nZXRyZWcoaHcsIG9mZnNldHJlZyk7Ci0JCQlpZiAoIGkgPiAwICkgdWRlbGF5KDEwKTsKLQkJCWkrKzsKLQkJfSB3aGlsZSAoIGkgPCBwcmlzbTJfYmFwX3RpbWVvdXQgJiYgSEZBMzg0eF9PRkZTRVRfSVNCVVNZKHJlZykpOwotCi0jaWYgKFdMQU5fSE9TVElGICE9IFdMQU5fUENJKQotCQkvKiBSZWxlYXNlIGxvY2sgKi8KLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSggJihody0+YmFwbG9jayksIGZsYWdzKTsKLSNlbmRpZgotCi0JCWlmICggSEZBMzg0eF9PRkZTRVRfSVNCVVNZKHJlZykgKXsKLQkJCS8qIElmIHRpbWVvdXQsIHJldHVybiByZWcgKi8KLQkJCXJlc3VsdCA9IHJlZzsKLQkJfSBlbHNlIGlmICggSEZBMzg0eF9PRkZTRVRfSVNFUlIocmVnKSApewotCQkJLyogSWYgb2Zmc2V0W2Vycl0gPT0gMSwgcmV0dXJuIHJlZyAqLwotCQkJcmVzdWx0ID0gcmVnOwotCQl9IGVsc2UgewotCQkJZCA9IChVSU5UOCopYnVmOwotCQkJLyogV3JpdGUgZXZlbihsZW4xKSBidWYgY29udGVudHMgdG8gZGF0YSByZWcgKi8KLQkJCWZvciAoIGkgPSAwOyBpIDwgKGxlbjEgJiAweGZmZmUpOyBpKz0yICkgewotCQkJCWhmYTM4NHhfc2V0cmVnX25vc3dhcChodywKLQkJCQkJKihVSU5UMTYqKSgmKGRbaV0pKSwgZGF0YXJlZyk7Ci0JCQl9Ci0JCQlpZiAobGVuMSAmIDEpIHsKLQkJCQlVSU5UMTYgZGF0YTsKLQkJCQlVSU5UOCAqYiA9IChVSU5UOCAqKSAmZGF0YTsKLQkJCQliWzBdID0gZFtsZW4xLTFdOwotCQkJCWlmIChidWYyICE9IE5VTEwpIHsKLQkJCQkJZCA9IChVSU5UOCopYnVmMjsKLQkJCQkJYlsxXSA9IGRbMF07Ci0JCQkJCWxlbjItLTsKLQkJCQkJYnVmMisrOwotCQkJCX0KLQkJCQloZmEzODR4X3NldHJlZ19ub3N3YXAoaHcsIGRhdGEsIGRhdGFyZWcpOwotCQkJfQotCQkJaWYgKChidWYyICE9IE5VTEwpICYmIChsZW4yID4gMCkpIHsKLQkJCQkvKiBXcml0ZSBldmVuKGxlbjIpIGJ1ZiBjb250ZW50cyB0byBkYXRhIHJlZyAqLwotCQkJCWQgPSAoVUlOVDgqKWJ1ZjI7Ci0JCQkJZm9yICggaSA9IDA7IGkgPCAobGVuMiAmIDB4ZmZmZSk7IGkrPTIgKSB7Ci0JCQkJCWhmYTM4NHhfc2V0cmVnX25vc3dhcChodywgKihVSU5UMTYqKSgmKGRbaV0pKSwgZGF0YXJlZyk7Ci0JCQkJfQotCQkJCWlmIChsZW4yICYgMSkgewotCQkJCQlVSU5UMTYgZGF0YTsKLQkJCQkJVUlOVDggKmIgPSAoVUlOVDggKikgJmRhdGE7Ci0JCQkJCWJbMF0gPSBkW2xlbjItMV07Ci0JCQkJCWlmIChidWYzICE9IE5VTEwpIHsKLQkJCQkJCWQgPSAoVUlOVDgqKWJ1ZjM7Ci0JCQkJCQliWzFdID0gZFswXTsKLQkJCQkJCWxlbjMtLTsKLQkJCQkJCWJ1ZjMrKzsKLQkJCQkJfQotCQkJCQloZmEzODR4X3NldHJlZ19ub3N3YXAoaHcsIGRhdGEsIGRhdGFyZWcpOwotCQkJCX0KLQkJCX0KLQotCQkJaWYgKChidWYzICE9IE5VTEwpICYmIChsZW4zID4gMCkpIHsKLQkJCQkvKiBXcml0ZSBldmVuKGxlbjMpIGJ1ZiBjb250ZW50cyB0byBkYXRhIHJlZyAqLwotCQkJCWQgPSAoVUlOVDgqKWJ1ZjM7Ci0JCQkJZm9yICggaSA9IDA7IGkgPCAobGVuMyAmIDB4ZmZmZSk7IGkrPTIgKSB7Ci0JCQkJCWhmYTM4NHhfc2V0cmVnX25vc3dhcChodywgKihVSU5UMTYqKSgmKGRbaV0pKSwgZGF0YXJlZyk7Ci0JCQkJfQotCQkJCWlmIChsZW4zICYgMSkgewotCQkJCQlVSU5UMTYgZGF0YTsKLQkJCQkJVUlOVDggKmIgPSAoVUlOVDggKikgJmRhdGE7Ci0JCQkJCWJbMF0gPSBkW2xlbjMtMV07Ci0JCQkJCWlmIChidWY0ICE9IE5VTEwpIHsKLQkJCQkJCWQgPSAoVUlOVDgqKWJ1ZjQ7Ci0JCQkJCQliWzFdID0gZFswXTsKLQkJCQkJCWxlbjQtLTsKLQkJCQkJCWJ1ZjQrKzsKLQkJCQkJfQotCQkJCQloZmEzODR4X3NldHJlZ19ub3N3YXAoaHcsIGRhdGEsIGRhdGFyZWcpOwotCQkJCX0KLQkJCX0KLQkJCWlmICgoYnVmNCAhPSBOVUxMKSAmJiAobGVuNCA+IDApKSB7Ci0JCQkJLyogV3JpdGUgZXZlbihsZW40KSBidWYgY29udGVudHMgdG8gZGF0YSByZWcgKi8KLQkJCQlkID0gKFVJTlQ4KilidWY0OwotCQkJCWZvciAoIGkgPSAwOyBpIDwgKGxlbjQgJiAweGZmZmUpOyBpKz0yICkgewotCQkJCQloZmEzODR4X3NldHJlZ19ub3N3YXAoaHcsICooVUlOVDE2KikoJihkW2ldKSksIGRhdGFyZWcpOwotCQkJCX0KLQkJCQlpZiAobGVuNCAmIDEpIHsKLQkJCQkJVUlOVDE2IGRhdGE7Ci0JCQkJCVVJTlQ4ICpiID0gKFVJTlQ4ICopICZkYXRhOwotCQkJCQliWzBdID0gZFtsZW40LTFdOwotCQkJCQliWzFdID0gMDsKLQotCQkJCQloZmEzODR4X3NldHJlZ19ub3N3YXAoaHcsIGRhdGEsIGRhdGFyZWcpOwotCQkJCX0KLQkJCX0KLS8vCQkJcHJpbnRrKEtFUk5fREVCVUcgImN0YjIgJWQgaWQgJTA0eCBvICVkICVkICVkICVkICVkXG4iLCBiYXAsIGlkLCBvZmZzZXQsIGxlbjEsIGxlbjIsIGxlbjMsIGxlbjQpOwotCi0JCX0KLQotI2lmIChXTEFOX0hPU1RJRiA9PSBXTEFOX1BDSSkKLQkJdWRlbGF5KDUpOwotCQkvKiBSZWxlYXNlIGxvY2sgKi8KLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSggJihody0+YmFwbG9jayksIGZsYWdzKTsKLSNlbmRpZgotCi0JfQotCi0JaWYgKHJlc3VsdCkKLQkJV0xBTl9MT0dfRVJST1IoImNvcHlfdG9fYmFwKCkgZmFpbGVkLlxuIik7Ci0KLQlEQkZFWElUOwotCXJldHVybiByZXN1bHQ7Ci19Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIGhmYTM4NHhfY29weV9mcm9tX2F1eAotKgotKiBDb3BpZXMgYSBjb2xsZWN0aW9uIG9mIGJ5dGVzIGZyb20gdGhlIGNvbnRyb2xsZXIgbWVtb3J5LiAgVGhlCi0qIEF1eGlsaWFyeSBwb3J0IE1VU1QgYmUgZW5hYmxlZCBwcmlvciB0byBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uCi0qIFdlIF9taWdodF8gYmUgaW4gYSBkb3dubG9hZCBzdGF0ZS4KLSoKLSogQXJndW1lbnRzOgotKglodwkJZGV2aWNlIHN0cnVjdHVyZQotKgljYXJkYWRkcglhZGRyZXNzIGluIGhmYTM4NHggZGF0YSBzcGFjZSB0byByZWFkCi0qCWF1eGN0bAkJYWRkcmVzcyBzcGFjZSBzZWxlY3QKLSoJYnVmCQlwdHIgdG8gZGVzdGluYXRpb24gaG9zdCBidWZmZXIKLSoJbGVuCQlsZW5ndGggb2YgZGF0YSB0byB0cmFuc2ZlciAoaW4gYnl0ZXMpCi0qCi0qIFJldHVybnM6Ci0qCW5vdGhpbmcKLSoKLSogU2lkZSBlZmZlY3RzOgotKglidWYgY29udGFpbnMgdGhlIGRhdGEgY29waWVkCi0qCi0qIENhbGwgY29udGV4dDoKLSoJcHJvY2VzcyB0aHJlYWQKLSoJaW50ZXJydXB0Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXZvaWQKLWhmYTM4NHhfY29weV9mcm9tX2F1eCgKLQloZmEzODR4X3QgKmh3LCBVSU5UMzIgY2FyZGFkZHIsIFVJTlQzMiBhdXhjdGwsIHZvaWQgKmJ1ZiwgVUlOVCBsZW4pCi17Ci0JVUlOVDE2CQljdXJycGFnZTsKLQlVSU5UMTYJCWN1cnJvZmZzZXQ7Ci0JVUlOVAkJaSA9IDA7Ci0KLQlEQkZFTlRFUjsKLQotCWlmICggIShody0+YXV4ZW4pICkgewotCQlXTEFOX0xPR19ERUJVRygxLAotCQkJIkF0dGVtcHQgdG8gcmVhZCAweCUwNHggd2hlbiBhdXggbm90IGVuYWJsZWRcbiIsCi0JCQljYXJkYWRkcik7Ci0JCXJldHVybjsKLQotCX0KLQkvKiBCdWlsZCBhcHByb3ByaWF0ZSBhdXggcGFnZSBhbmQgb2Zmc2V0ICovCi0JY3VycnBhZ2UgPSBIRkEzODR4X0FVWF9NS1BBR0UoY2FyZGFkZHIpOwotCWN1cnJvZmZzZXQgPSBIRkEzODR4X0FVWF9NS09GRihjYXJkYWRkciwgYXV4Y3RsKTsKLQloZmEzODR4X3NldHJlZyhodywgY3VycnBhZ2UsIEhGQTM4NHhfQVVYUEFHRSk7Ci0JaGZhMzg0eF9zZXRyZWcoaHcsIGN1cnJvZmZzZXQsIEhGQTM4NHhfQVVYT0ZGU0VUKTsKLQl1ZGVsYXkoNSk7CS8qIGJlYXQgKi8KLQotCS8qIHJlYWQgdGhlIGRhdGEgKi8KLQl3aGlsZSAoIGkgPCBsZW4pIHsKLQkJKigoVUlOVDE2KikoYnVmK2kpKSA9IGhmYTM4NHhfZ2V0cmVnX25vc3dhcChodywgSEZBMzg0eF9BVVhEQVRBKTsKLQkJaSs9MjsKLQkJY3Vycm9mZnNldCs9MjsKLQkJaWYgKCAoY3Vycm9mZnNldCZIRkEzODR4X0FERFJfQVVYX09GRl9NQVNLKSA+Ci0JCQlIRkEzODR4X0FERFJfQVVYX09GRl9NQVggKSB7Ci0JCQljdXJycGFnZSsrOwotCQkJY3Vycm9mZnNldCA9IDA7Ci0JCQljdXJyb2Zmc2V0ID0gSEZBMzg0eF9BVVhfTUtPRkYoY3Vycm9mZnNldCwgYXV4Y3RsKTsKLQkJCWhmYTM4NHhfc2V0cmVnKGh3LCBjdXJycGFnZSwgSEZBMzg0eF9BVVhQQUdFKTsKLQkJCWhmYTM4NHhfc2V0cmVnKGh3LCBjdXJyb2Zmc2V0LCBIRkEzODR4X0FVWE9GRlNFVCk7Ci0JCQl1ZGVsYXkoNSk7CS8qIGJlYXQgKi8KLQkJfQotCX0KLQkvKiBNYWtlIHN1cmUgdGhlIGF1eGN0bCBiaXRzIGFyZSBjbGVhciAqLwotCWhmYTM4NHhfc2V0cmVnKGh3LCAwLCBIRkEzODR4X0FVWE9GRlNFVCk7Ci0JREJGRVhJVDsKLX0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogaGZhMzg0eF9jb3B5X3RvX2F1eAotKgotKiBDb3BpZXMgYSBjb2xsZWN0aW9uIG9mIGJ5dGVzIHRvIHRoZSBjb250cm9sbGVyIG1lbW9yeS4gIFRoZQotKiBBdXhpbGlhcnkgcG9ydCBNVVNUIGJlIGVuYWJsZWQgcHJpb3IgdG8gY2FsbGluZyB0aGlzIGZ1bmN0aW9uLgotKiBXZSBfbWlnaHRfIGJlIGluIGEgZG93bmxvYWQgc3RhdGUuCi0qCi0qIEFyZ3VtZW50czoKLSoJaHcJCWRldmljZSBzdHJ1Y3R1cmUKLSoJY2FyZGFkZHIJYWRkcmVzcyBpbiBoZmEzODR4IGRhdGEgc3BhY2UgdG8gcmVhZAotKglhdXhjdGwJCWFkZHJlc3Mgc3BhY2Ugc2VsZWN0Ci0qCWJ1ZgkJcHRyIHRvIGRlc3RpbmF0aW9uIGhvc3QgYnVmZmVyCi0qCWxlbgkJbGVuZ3RoIG9mIGRhdGEgdG8gdHJhbnNmZXIgKGluIGJ5dGVzKQotKgotKiBSZXR1cm5zOgotKglub3RoaW5nCi0qCi0qIFNpZGUgZWZmZWN0czoKLSoJQ29udHJvbGxlciBtZW1vcnkgbm93IGNvbnRhaW5zIGEgY29weSBvZiBidWYKLSoKLSogQ2FsbCBjb250ZXh0OgotKglwcm9jZXNzIHRocmVhZAotKglpbnRlcnJ1cHQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdm9pZAotaGZhMzg0eF9jb3B5X3RvX2F1eCgKLQloZmEzODR4X3QgKmh3LCBVSU5UMzIgY2FyZGFkZHIsIFVJTlQzMiBhdXhjdGwsIHZvaWQgKmJ1ZiwgVUlOVCBsZW4pCi17Ci0JVUlOVDE2CQljdXJycGFnZTsKLQlVSU5UMTYJCWN1cnJvZmZzZXQ7Ci0JVUlOVAkJaSA9IDA7Ci0KLQlEQkZFTlRFUjsKLQotCWlmICggIShody0+YXV4ZW4pICkgewotCQlXTEFOX0xPR19ERUJVRygxLAotCQkJIkF0dGVtcHQgdG8gcmVhZCAweCUwNHggd2hlbiBhdXggbm90IGVuYWJsZWRcbiIsCi0JCQljYXJkYWRkcik7Ci0JCXJldHVybjsKLQotCX0KLQkvKiBCdWlsZCBhcHByb3ByaWF0ZSBhdXggcGFnZSBhbmQgb2Zmc2V0ICovCi0JY3VycnBhZ2UgPSBIRkEzODR4X0FVWF9NS1BBR0UoY2FyZGFkZHIpOwotCWN1cnJvZmZzZXQgPSBIRkEzODR4X0FVWF9NS09GRihjYXJkYWRkciwgYXV4Y3RsKTsKLQloZmEzODR4X3NldHJlZyhodywgY3VycnBhZ2UsIEhGQTM4NHhfQVVYUEFHRSk7Ci0JaGZhMzg0eF9zZXRyZWcoaHcsIGN1cnJvZmZzZXQsIEhGQTM4NHhfQVVYT0ZGU0VUKTsKLQl1ZGVsYXkoNSk7CS8qIGJlYXQgKi8KLQotCS8qIHdyaXRlIHRoZSBkYXRhICovCi0Jd2hpbGUgKCBpIDwgbGVuKSB7Ci0JCWhmYTM4NHhfc2V0cmVnX25vc3dhcChodywKLQkJCSooKFVJTlQxNiopKGJ1ZitpKSksIEhGQTM4NHhfQVVYREFUQSk7Ci0JCWkrPTI7Ci0JCWN1cnJvZmZzZXQrPTI7Ci0JCWlmICggY3Vycm9mZnNldCA+IEhGQTM4NHhfQUREUl9BVVhfT0ZGX01BWCApIHsKLQkJCWN1cnJwYWdlKys7Ci0JCQljdXJyb2Zmc2V0ID0gMDsKLQkJCWhmYTM4NHhfc2V0cmVnKGh3LCBjdXJycGFnZSwgSEZBMzg0eF9BVVhQQUdFKTsKLQkJCWhmYTM4NHhfc2V0cmVnKGh3LCBjdXJyb2Zmc2V0LCBIRkEzODR4X0FVWE9GRlNFVCk7Ci0JCQl1ZGVsYXkoNSk7CS8qIGJlYXQgKi8KLQkJfQotCX0KLQlEQkZFWElUOwotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBoZmEzODR4X2NtZF93YWl0Ci0qCi0qIFdhaXRzIGZvciBhdmFpbGFiaWxpdHkgb2YgdGhlIENvbW1hbmQgcmVnaXN0ZXIsIHRoZW4KLSogaXNzdWVzIHRoZSBnaXZlbiBjb21tYW5kLiAgVGhlbiBwb2xscyB0aGUgRXZzdGF0IHJlZ2lzdGVyCi0qIHdhaXRpbmcgZm9yIGNvbW1hbmQgY29tcGxldGlvbi4gIFRpbWVvdXRzIHNob3VsZG4ndCBiZQotKiBwb3NzaWJsZSBzaW5jZSB3ZSdyZSBwcmV2ZW50aW5nIG92ZXJsYXBwaW5nIGNvbW1hbmRzIGFuZCBhbGwKLSogY29tbWFuZHMgc2hvdWxkIGJlIGNsZWFyZWQgYW5kIGFja25vd2xlZGdlZC4KLSoKLSogQXJndW1lbnRzOgotKgl3bGFuZGV2CQlkZXZpY2Ugc3RydWN0dXJlCi0qICAgICAgIGNtZCAgICAgICAgICAgICBjbWQgc3RydWN0dXJlLiAgSW5jbHVkZXMgYWxsIGFyZ3VtZW50cyBhbmQgcmVzdWx0Ci0qICAgICAgICAgICAgICAgICAgICAgICBkYXRhIHBvaW50cy4gIEFsbCBpbiBob3N0IG9yZGVyLgotKgotKiBSZXR1cm5zOgotKgkwCQlzdWNjZXNzCi0qCS1FVElNRURPVVQJdGltZWQgb3V0IHdhaXRpbmcgZm9yIHJlZ2lzdGVyIHJlYWR5IG9yCi0qCQkJY29tbWFuZCBjb21wbGV0aW9uCi0qCT4wCQljb21tYW5kIGluZGljYXRlZCBlcnJvciwgU3RhdHVzIGFuZCBSZXNwMC0yIGFyZQotKgkJCWluIGh3IHN0cnVjdHVyZS4KLSoKLSogU2lkZSBlZmZlY3RzOgotKgotKgotKiBDYWxsIGNvbnRleHQ6Ci0qCXByb2Nlc3MgdGhyZWFkCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXN0YXRpYyBpbnQgaGZhMzg0eF9kb2NtZF93YWl0KCBoZmEzODR4X3QgKmh3LCBoZmEzODR4X21ldGFjbWRfdCAqY21kKQotewotCWludAkJcmVzdWx0ID0gLUVUSU1FRE9VVDsKLQlVSU5UMTYJCXJlZyA9IDA7Ci0JVUlOVDE2ICAgICAgICAgIGNvdW50ZXI7Ci0KLQlEQkZFTlRFUjsKLQotCWh3LT5jbWRmbGFnID0gMDsKLQlody0+Y21kZGF0YSA9IGNtZDsKLQotCS8qIHdhaXQgZm9yIHRoZSBidXN5IGJpdCB0byBjbGVhciAqLwotCWNvdW50ZXIgPSAwOwotCXJlZyA9IGhmYTM4NHhfZ2V0cmVnKGh3LCBIRkEzODR4X0NNRCk7Ci0Jd2hpbGUgKCBIRkEzODR4X0NNRF9JU0JVU1kocmVnKSAmJgotCQkoY291bnRlciA8IDEwKSkgewotCQlyZWcgPSBoZmEzODR4X2dldHJlZyhodywgSEZBMzg0eF9DTUQpOwotCQljb3VudGVyKys7Ci0JCXVkZWxheSgxMCk7Ci0JfQotCi0JaWYgKEhGQTM4NHhfQ01EX0lTQlVTWShyZWcpKSB7Ci0JCVdMQU5fTE9HX0VSUk9SKCJoZmEzODR4X2NtZCB0aW1lb3V0KDEpLCByZWc9MHglMGh4LlxuIiwgcmVnKTsKLQkJZ290byBmYWlsZWQ7Ci0JfQotCWlmICghSEZBMzg0eF9DTURfSVNCVVNZKHJlZykpIHsKLQkJLyogYnVzeSBiaXQgY2xlYXIsIHdyaXRlIGNvbW1hbmQgKi8KLQkJaGZhMzg0eF9zZXRyZWcoaHcsIGNtZC0+cGFybTAsIEhGQTM4NHhfUEFSQU0wKTsKLQkJaGZhMzg0eF9zZXRyZWcoaHcsIGNtZC0+cGFybTEsIEhGQTM4NHhfUEFSQU0xKTsKLQkJaGZhMzg0eF9zZXRyZWcoaHcsIGNtZC0+cGFybTIsIEhGQTM4NHhfUEFSQU0yKTsKLQkJaGZhMzg0eF9zZXRyZWcoaHcsIGNtZC0+Y21kLCBIRkEzODR4X0NNRCk7Ci0KLSNpZmRlZiBDTURfSVJRCi0KLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiwyLDApKQotCQl3aGlsZSAoISBody0+Y21kZmxhZykKLQkJCWludGVycnVwdGlibGVfc2xlZXBfb24oJmh3LT5jbWRxKTsKLSNlbHNlCi0JCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShody0+Y21kcSwgaHctPmNtZGZsYWcpOwotI2VuZGlmCi0JCXJlc3VsdCA9IEhGQTM4NHhfU1RBVFVTX1JFU1VMVF9HRVQoY21kLT5zdGF0dXMpOwotI2Vsc2UgLy8gQ01EX0lSUQotCQkvKiBOb3cgd2FpdCBmb3IgY29tcGxldGlvbiAqLwotCQljb3VudGVyID0gMDsKLQkJcmVnID0gaGZhMzg0eF9nZXRyZWcoaHcsIEhGQTM4NHhfRVZTVEFUKTsKLQkJLyogSW5pdGlhbGl6YXRpb24gaXMgdGhlIHByb2JsZW0uICBJdCB0YWtlcyBhYm91dAotICAgICAgICAgICAgICAgICAgIDEwMG1zLiAibm9ybWFsIiBjb21tYW5kcyBhcmUgdHlwaWNhbGx5IGlzIGFib3V0Ci0gICAgICAgICAgICAgICAgICAgMjAwLTQwMCB1cyAoSSd2ZSBuZXZlciBzZWVuIGxlc3MgdGhhbiAyMDApLiAgTG9uZ2VyCi0gICAgICAgICAgICAgICAgICAgaXMgYmV0dGVyIHNvIHRoYXQgd2UncmUgbm90IGhhbW1lcmluZyB0aGUgYnVzLiAqLwotCQl3aGlsZSAoICFIRkEzODR4X0VWU1RBVF9JU0NNRChyZWcpICYmCi0JCQkoY291bnRlciA8IDUwMDApKSB7Ci0JCQlyZWcgPSBoZmEzODR4X2dldHJlZyhodywgSEZBMzg0eF9FVlNUQVQpOwotCQkJY291bnRlcisrOwotCQkJdWRlbGF5KDIwMCk7Ci0JCX0KLQotCQlpZiAoIEhGQTM4NHhfRVZTVEFUX0lTQ01EKHJlZykgKSB7Ci0JCQlyZXN1bHQgPSAwOwotCQkJY21kLT5yZXN1bHQuc3RhdHVzID0gaGZhMzg0eF9nZXRyZWcoaHcsIEhGQTM4NHhfU1RBVFVTKTsKLQkJCWNtZC0+cmVzdWx0LnJlc3AwID0gaGZhMzg0eF9nZXRyZWcoaHcsIEhGQTM4NHhfUkVTUDApOwotCQkJY21kLT5yZXN1bHQucmVzcDEgPSBoZmEzODR4X2dldHJlZyhodywgSEZBMzg0eF9SRVNQMSk7Ci0JCQljbWQtPnJlc3VsdC5yZXNwMiA9IGhmYTM4NHhfZ2V0cmVnKGh3LCBIRkEzODR4X1JFU1AyKTsKLQkJCWhmYTM4NHhfc2V0cmVnKGh3LCBIRkEzODR4X0VWQUNLX0NNRCwKLQkJCQlIRkEzODR4X0VWQUNLKTsKLQkJCXJlc3VsdCA9IEhGQTM4NHhfU1RBVFVTX1JFU1VMVF9HRVQoY21kLT5yZXN1bHQuc3RhdHVzKTsKLQkJfSBlbHNlIHsKLQkJCVdMQU5fTE9HX0VSUk9SKCJoZmEzODR4X2NtZCB0aW1lb3V0KDIpLCByZWc9MHglMGh4LlxuIiwgcmVnKTsKLQkJfQotI2VuZGlmICAvKiBDTURfSVJRICovCi0JfQotCi0gZmFpbGVkOgotCWh3LT5jbWRmbGFnID0gMDsKLQlody0+Y21kZGF0YSA9IE5VTEw7Ci0KLQlEQkZFWElUOwotCXJldHVybiByZXN1bHQ7Ci19Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIGhmYTM4NHhfZGxfZG9jbWRfd2FpdAotKgotKiBXYWl0cyBmb3IgYXZhaWxhYmlsaXR5IG9mIHRoZSBDb21tYW5kIHJlZ2lzdGVyLCB0aGVuCi0qIGlzc3VlcyB0aGUgZ2l2ZW4gY29tbWFuZC4gIFRoZW4gcG9sbHMgdGhlIEV2c3RhdCByZWdpc3RlcgotKiB3YWl0aW5nIGZvciBjb21tYW5kIGNvbXBsZXRpb24uICBUaW1lb3V0cyBzaG91bGRuJ3QgYmUKLSogcG9zc2libGUgc2luY2Ugd2UncmUgcHJldmVudGluZyBvdmVybGFwcGluZyBjb21tYW5kcyBhbmQgYWxsCi0qIGNvbW1hbmRzIHNob3VsZCBiZSBjbGVhcmVkIGFuZCBhY2tub3dsZWRnZWQuCi0qCi0qIFRoaXMgcm91dGluZSBpcyBvbmx5IHVzZWQgZm9yIGRvd25sb2Fkcy4gIFNpbmNlIGl0IGRvZXNuJ3QgbG9jayBvdXQKLSogaW50ZXJydXB0cyB0aGUgc3lzdGVtIHJlc3BvbnNlIGlzIG11Y2ggYmV0dGVyLgotKgotKiBBcmd1bWVudHM6Ci0qCXdsYW5kZXYJCWRldmljZSBzdHJ1Y3R1cmUKLSogICAgICAgY21kICAgICAgICAgICAgIGNtZCBzdHJ1Y3R1cmUuICBJbmNsdWRlcyBhbGwgYXJndW1lbnRzIGFuZCByZXN1bHQKLSogICAgICAgICAgICAgICAgICAgICAgIGRhdGEgcG9pbnRzLiAgQWxsIGluIGhvc3Qgb3JkZXIuCi0qCi0qIFJldHVybnM6Ci0qCTAJCXN1Y2Nlc3MKLSoJLUVUSU1FRE9VVAl0aW1lZCBvdXQgd2FpdGluZyBmb3IgcmVnaXN0ZXIgcmVhZHkgb3IKLSoJCQljb21tYW5kIGNvbXBsZXRpb24KLSoJPjAJCWNvbW1hbmQgaW5kaWNhdGVkIGVycm9yLCBTdGF0dXMgYW5kIFJlc3AwLTIgYXJlCi0qCQkJaW4gaHcgc3RydWN0dXJlLgotKgotKiBTaWRlIGVmZmVjdHM6Ci0qCi0qCi0qIENhbGwgY29udGV4dDoKLSoJcHJvY2VzcyB0aHJlYWQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotc3RhdGljIGludCBoZmEzODR4X2RsX2RvY21kX3dhaXQoIGhmYTM4NHhfdCAqaHcsIGhmYTM4NHhfbWV0YWNtZF90ICpjbWQpCi17Ci0JaW50CQlyZXN1bHQgPSAtRVRJTUVET1VUOwotCXVuc2lnbmVkIGxvbmcJdGltZW91dDsKLQlVSU5UMTYJCXJlZyA9IDA7Ci0KLQlEQkZFTlRFUjsKLQkvKiB3YWl0IGZvciB0aGUgYnVzeSBiaXQgdG8gY2xlYXIgKi8KLQl0aW1lb3V0ID0gamlmZmllcyArIDEqSFo7Ci0JcmVnID0gaGZhMzg0eF9nZXRyZWcoaHcsIEhGQTM4NHhfQ01EKTsKLQl3aGlsZSAoIEhGQTM4NHhfQ01EX0lTQlVTWShyZWcpICYmIHRpbWVfYmVmb3JlKCBqaWZmaWVzLCB0aW1lb3V0KSApIHsKLQkJcmVnID0gaGZhMzg0eF9nZXRyZWcoaHcsIEhGQTM4NHhfQ01EKTsKLQkJdWRlbGF5KDEwKTsKLQl9Ci0JaWYgKEhGQTM4NHhfQ01EX0lTQlVTWShyZWcpKSB7Ci0JCVdMQU5fTE9HX1dBUk5JTkcoIlRpbWVkIG91dCB3YWl0aW5nIGZvciBjbWQgcmVnaXN0ZXIuXG4iKTsKLQkJZ290byBmYWlsZWQ7Ci0JfQotCi0JaWYgKCFIRkEzODR4X0NNRF9JU0JVU1kocmVnKSkgewotCQkvKiBidXN5IGJpdCBjbGVhciwgd3JpdGUgY29tbWFuZCAqLwotCQloZmEzODR4X3NldHJlZyhodywgY21kLT5wYXJtMCwgSEZBMzg0eF9QQVJBTTApOwotCQloZmEzODR4X3NldHJlZyhodywgY21kLT5wYXJtMSwgSEZBMzg0eF9QQVJBTTEpOwotCQloZmEzODR4X3NldHJlZyhodywgY21kLT5wYXJtMiwgSEZBMzg0eF9QQVJBTTIpOwotCQloZmEzODR4X3NldHJlZyhodywgY21kLT5jbWQsIEhGQTM4NHhfQ01EKTsKLQotCQkvKiBOb3cgd2FpdCBmb3IgY29tcGxldGlvbiAqLwotCQlpZiAoIChIRkEzODR4X0NNRF9DTURDT0RFX0dFVChjbWQtPmNtZCkgPT0gSEZBMzg0eF9DTURDT0RFX0RPV05MRCkgKSB7Ci0JCQkvKiBkbHRpbWVvdXQgaXMgaW4gbXMgKi8KLQkJCXRpbWVvdXQgPSAoKChVSU5UMzIpaHctPmRsdGltZW91dCkgLyAxMDAwVUwpICogSFo7Ci0JCQlpZiAoIHRpbWVvdXQgPiAwICkgewotCQkJCXRpbWVvdXQgKz0gamlmZmllczsKLQkJCX0gZWxzZSB7Ci0JCQkJdGltZW91dCA9IGppZmZpZXMgKyAxKkhaOwotCQkJfQotCQl9IGVsc2UgewotCQkJdGltZW91dCA9IGppZmZpZXMgKyAxKkhaOwotCQl9Ci0JCXJlZyA9IGhmYTM4NHhfZ2V0cmVnKGh3LCBIRkEzODR4X0VWU1RBVCk7Ci0JCXdoaWxlICggIUhGQTM4NHhfRVZTVEFUX0lTQ01EKHJlZykgJiYgdGltZV9iZWZvcmUoamlmZmllcyx0aW1lb3V0KSApIHsKLQkJCXVkZWxheSgxMDApOwotCQkJcmVnID0gaGZhMzg0eF9nZXRyZWcoaHcsIEhGQTM4NHhfRVZTVEFUKTsKLQkJfQotCQlpZiAoIEhGQTM4NHhfRVZTVEFUX0lTQ01EKHJlZykgKSB7Ci0JCQlyZXN1bHQgPSAwOwotCQkJY21kLT5yZXN1bHQuc3RhdHVzID0gaGZhMzg0eF9nZXRyZWcoaHcsIEhGQTM4NHhfU1RBVFVTKTsKLQkJCWNtZC0+cmVzdWx0LnJlc3AwID0gaGZhMzg0eF9nZXRyZWcoaHcsIEhGQTM4NHhfUkVTUDApOwotCQkJY21kLT5yZXN1bHQucmVzcDEgPSBoZmEzODR4X2dldHJlZyhodywgSEZBMzg0eF9SRVNQMSk7Ci0JCQljbWQtPnJlc3VsdC5yZXNwMiA9IGhmYTM4NHhfZ2V0cmVnKGh3LCBIRkEzODR4X1JFU1AyKTsKLQkJCWhmYTM4NHhfc2V0cmVnKGh3LCBIRkEzODR4X0VWQUNLX0NNRCwgSEZBMzg0eF9FVkFDSyk7Ci0JCQlyZXN1bHQgPSBIRkEzODR4X1NUQVRVU19SRVNVTFRfR0VUKGNtZC0+cmVzdWx0LnN0YXR1cyk7Ci0JCX0KLQl9Ci0KLWZhaWxlZDoKLQlEQkZFWElUOwotCXJldHVybiByZXN1bHQ7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBoZmEzODR4X2RydnJfc3RhcnQKLSoKLSogSXNzdWVzIHRoZSBNQUMgaW5pdGlhbGl6ZSBjb21tYW5kLCBzZXRzIHVwIHNvbWUgZGF0YSBzdHJ1Y3R1cmVzLAotKiBhbmQgZW5hYmxlcyB0aGUgaW50ZXJydXB0cy4gIEFmdGVyIHRoaXMgZnVuY3Rpb24gY29tcGxldGVzLCB0aGUKLSogbG93LWxldmVsIHN0dWZmIHNob3VsZCBiZSByZWFkeSBmb3IgYW55L2FsbCBjb21tYW5kcy4KLSoKLSogQXJndW1lbnRzOgotKglodwkJZGV2aWNlIHN0cnVjdHVyZQotKiBSZXR1cm5zOgotKgkwCQlzdWNjZXNzCi0qCT4wCQlmL3cgcmVwb3J0ZWQgZXJyb3IgLSBmL3cgc3RhdHVzIGNvZGUKLSoJPDAJCWRyaXZlciByZXBvcnRlZCBlcnJvcgotKgotKiBTaWRlIGVmZmVjdHM6Ci0qCi0qIENhbGwgY29udGV4dDoKLSoJcHJvY2VzcyB0aHJlYWQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IGhmYTM4NHhfZHJ2cl9zdGFydChoZmEzODR4X3QgKmh3KQotewotCWludAlyZXN1bHQgPSAwOwotCVVJTlQxNgkJCXJlZzsKLQlpbnQJCQlpOwotCWludAkJCWo7Ci0JREJGRU5URVI7Ci0KLQkvKiBjYWxsIGluaXRpYWxpemUgKi8KLQlyZXN1bHQgPSBoZmEzODR4X2NtZF9pbml0aWFsaXplKGh3KTsKLQlpZiAocmVzdWx0ICE9IDApIHsKLQkJV0xBTl9MT0dfRVJST1IoIkluaXRpYWxpemUgY29tbWFuZCBmYWlsZWQuXG4iKTsKLQkJZ290byBmYWlsZWQ7Ci0JfQotCi0JLyogbWFrZSBzdXJlIGludGVycnVwdHMgYXJlIGRpc2FibGVkIGFuZCBhbnkgbGF5YWJvdXQgZXZlbnRzIGNsZWFyZWQgKi8KLQloZmEzODR4X3NldHJlZyhodywgMCwgSEZBMzg0eF9JTlRFTik7Ci0JaGZhMzg0eF9zZXRyZWcoaHcsIDB4ZmZmZiwgSEZBMzg0eF9FVkFDSyk7Ci0KLSAgICAgICAgaHctPnR4ZmlkX2hlYWQgPSAwOwotICAgICAgICBody0+dHhmaWRfdGFpbCA9IDA7Ci0gICAgICAgIGh3LT50eGZpZF9OID0gSEZBMzg0eF9EUlZSX0ZJRFNUQUNLTEVOX01BWDsKLSAgICAgICAgbWVtc2V0KGh3LT50eGZpZF9xdWV1ZSwgMCwgc2l6ZW9mKGh3LT50eGZpZF9xdWV1ZSkpOwotCi0JLyogQWxsb2NhdGUgdHggYW5kIG5vdGlmeSBGSURzICovCi0JLyogRmlyc3QsIHR4ICovCi0JZm9yICggaSA9IDA7IGkgPCBIRkEzODR4X0RSVlJfRklEU1RBQ0tMRU5fTUFYLTE7IGkrKykgewotCQlyZXN1bHQgPSBoZmEzODR4X2NtZF9hbGxvY2F0ZShodywgSEZBMzg0eF9EUlZSX1RYQlVGX01BWCk7Ci0JCWlmIChyZXN1bHQgIT0gMCkgewotCQkJV0xBTl9MT0dfRVJST1IoIkFsbG9jYXRlKHR4KSBjb21tYW5kIGZhaWxlZC5cbiIpOwotCQkJZ290byBmYWlsZWQ7Ci0JCX0KLQkJaiA9IDA7Ci0JCWRvIHsKLQkJCXJlZyA9IGhmYTM4NHhfZ2V0cmVnKGh3LCBIRkEzODR4X0VWU1RBVCk7Ci0JCQl1ZGVsYXkoMTApOwotCQkJaisrOwotCQl9IHdoaWxlICggIUhGQTM4NHhfRVZTVEFUX0lTQUxMT0MocmVnKSAmJiBqIDwgNTApOyAvKiA1MCBpcyB0aW1lb3V0ICovCi0JCWlmICggaiA+PSA1MCApIHsKLQkJCVdMQU5fTE9HX0VSUk9SKCJUaW1lZCBvdXQgd2FpdGluZyBmb3IgZXZhbGxvYyh0eCkuXG4iKTsKLQkJCXJlc3VsdCA9IC1FVElNRURPVVQ7Ci0JCQlnb3RvIGZhaWxlZDsKLQkJfQotCQlyZWcgPSBoZmEzODR4X2dldHJlZyhodywgSEZBMzg0eF9BTExPQ0ZJRCk7Ci0KLQkJdHhmaWRfcXVldWVfYWRkKGh3LCByZWcpOwotCi0JCVdMQU5fTE9HX0RFQlVHKDQsImh3LT50eGZpZF9xdWV1ZVslZF09MHglMDR4XG4iLGkscmVnKTsKLQotCQlyZWcgPSBIRkEzODR4X0VWQUNLX0FMTE9DX1NFVCgxKTsKLQkJaGZhMzg0eF9zZXRyZWcoaHcsIHJlZywgSEZBMzg0eF9FVkFDSyk7Ci0KLQl9Ci0KLQkvKiBOb3csIHRoZSBpbmZvIGZyYW1lIGZpZCAqLwotCXJlc3VsdCA9IGhmYTM4NHhfY21kX2FsbG9jYXRlKGh3LCBIRkEzODR4X0lORk9GUk1fTUFYTEVOKTsKLQlpZiAocmVzdWx0ICE9IDApIHsKLQkJV0xBTl9MT0dfRVJST1IoIkFsbG9jYXRlKHR4KSBjb21tYW5kIGZhaWxlZC5cbiIpOwotCQlnb3RvIGZhaWxlZDsKLQl9Ci0JaSA9IDA7Ci0JZG8gewotCQlyZWcgPSBoZmEzODR4X2dldHJlZyhodywgSEZBMzg0eF9FVlNUQVQpOwotCQl1ZGVsYXkoMTApOwotCQlpKys7Ci0JfSB3aGlsZSAoICFIRkEzODR4X0VWU1RBVF9JU0FMTE9DKHJlZykgJiYgaSA8IDUwKTsgLyogNTAgaXMgdGltZW91dCAqLwotCWlmICggaSA+PSA1MCApIHsKLQkJV0xBTl9MT0dfRVJST1IoIlRpbWVkIG91dCB3YWl0aW5nIGZvciBldmFsbG9jKGluZm8pLlxuIik7Ci0JCXJlc3VsdCA9IC1FVElNRURPVVQ7Ci0JCWdvdG8gZmFpbGVkOwotCX0KLQlody0+aW5mb2ZpZCA9IGhmYTM4NHhfZ2V0cmVnKGh3LCBIRkEzODR4X0FMTE9DRklEKTsKLQlyZWcgPSBIRkEzODR4X0VWQUNLX0FMTE9DX1NFVCgxKTsKLQloZmEzODR4X3NldHJlZyhodywgcmVnLCBIRkEzODR4X0VWQUNLKTsKLQlXTEFOX0xPR19ERUJVRyg0LCJody0+aW5mb2ZpZD0weCUwNHhcbiIsIGh3LT5pbmZvZmlkKTsKLQotCS8qIFNldCBzd3N1cHBvcnQgcmVncyB0byBtYWdpYyAjIGZvciBjYXJkIHByZXNlbmNlIGRldGVjdGlvbiAqLwotCWhmYTM4NHhfc2V0cmVnKGh3LCBIRkEzODR4X0RSVlJfTUFHSUMsIEhGQTM4NHhfU1dTVVBQT1JUMCk7Ci0KLQkvKiBOb3cgZW5hYmxlIHRoZSBpbnRlcnJ1cHRzIGFuZCBzZXQgdGhlIHJ1bm5pbmcgc3RhdGUgKi8KLQloZmEzODR4X3NldHJlZyhodywgMHhmZmZmLCBIRkEzODR4X0VWU1RBVCk7Ci0JaGZhMzg0eF9ldmVudHNfYWxsKGh3KTsKLQotCWh3LT5zdGF0ZSA9IEhGQTM4NHhfU1RBVEVfUlVOTklORzsKLQotCWdvdG8gZG9uZTsKLWZhaWxlZDoKLQlXTEFOX0xPR19FUlJPUigiRmFpbGVkLCByZXN1bHQ9JWRcbiIsIHJlc3VsdCk7Ci1kb25lOgotCURCRkVYSVQ7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogaGZhMzg0eF9kcnZyX3N0b3AKLSoKLSogSXNzdWVzIHRoZSBpbml0aWFsaXplIGNvbW1hbmQgdG8gbGVhdmUgdXMgaW4gdGhlICdyZXNldCcgc3RhdGUuCi0qCi0qIEFyZ3VtZW50czoKLSoJaHcJCWRldmljZSBzdHJ1Y3R1cmUKLSogUmV0dXJuczoKLSoJMAkJc3VjY2VzcwotKgk+MAkJZi93IHJlcG9ydGVkIGVycm9yIC0gZi93IHN0YXR1cyBjb2RlCi0qCTwwCQlkcml2ZXIgcmVwb3J0ZWQgZXJyb3IKLSoKLSogU2lkZSBlZmZlY3RzOgotKgotKiBDYWxsIGNvbnRleHQ6Ci0qCXByb2Nlc3MgdGhyZWFkCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCBoZmEzODR4X2RydnJfc3RvcChoZmEzODR4X3QgKmh3KQotewotCWludAlyZXN1bHQgPSAwOwotCWludCBpOwotCURCRkVOVEVSOwotCi0JZGVsX3RpbWVyX3N5bmMoJmh3LT5jb21tc3F1YWxfdGltZXIpOwotCi0JaWYgKCBody0+d2xhbmRldi0+aHdyZW1vdmVkICkgewotCQkvKiBvbmx5IGZsdXNoIHdoZW4gd2UncmUgc2h1dHRpbmcgZG93biBmb3IgZ29vZCAqLwotCQlmbHVzaF9zY2hlZHVsZWRfd29yaygpOwotCX0KLQotCWlmIChody0+c3RhdGUgPT0gSEZBMzg0eF9TVEFURV9SVU5OSU5HKSB7Ci0JCS8qCi0JCSAqIFNlbmQgdGhlIE1BQyBpbml0aWFsaXplIGNtZC4KLQkJICovCi0JCWhmYTM4NHhfY21kX2luaXRpYWxpemUoaHcpOwotCi0JCS8qCi0JCSAqIE1ha2UgYWJzb2x1dGVseSBzdXJlIGludGVycnVwdHMgYXJlIGRpc2FibGVkIGFuZCBhbnkKLQkJICogbGF5YWJvdXQgZXZlbnRzIGNsZWFyZWQKLQkJICovCi0JCWhmYTM4NHhfc2V0cmVnKGh3LCAwLCBIRkEzODR4X0lOVEVOKTsKLQkJaGZhMzg0eF9zZXRyZWcoaHcsIDB4ZmZmZiwgSEZBMzg0eF9FVkFDSyk7Ci0JfQotCi0JdGFza2xldF9raWxsKCZody0+YmFwX3Rhc2tsZXQpOwotCi0JaHctPmxpbmtfc3RhdHVzID0gSEZBMzg0eF9MSU5LX05PVENPTk5FQ1RFRDsKLQlody0+c3RhdGUgPSBIRkEzODR4X1NUQVRFX0lOSVQ7Ci0KLQkvKiBDbGVhciBhbGwgdGhlIHBvcnQgc3RhdHVzICovCi0JZm9yICggaSA9IDA7IGkgPCBIRkEzODR4X05VTVBPUlRTX01BWDsgaSsrKSB7Ci0JCWh3LT5wb3J0X2VuYWJsZWRbaV0gPSAwOwotCX0KLQotCURCRkVYSVQ7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogaGZhMzg0eF9kcnZyX3R4ZnJhbWUKLSoKLSogVGFrZXMgYSBmcmFtZSBmcm9tIHByaXNtMnN0YSBhbmQgcXVldWVzIGl0IGZvciB0cmFuc21pc3Npb24uCi0qCi0qIEFyZ3VtZW50czoKLSoJaHcJCWRldmljZSBzdHJ1Y3R1cmUKLSoJc2tiCQlwYWNrZXQgYnVmZmVyIHN0cnVjdC4gIENvbnRhaW5zIGFuIDgwMi4xMQotKgkJCWRhdGEgZnJhbWUuCi0qICAgICAgIHA4MDIxMV9oZHIgICAgICBwb2ludHMgdG8gdGhlIDgwMi4xMSBoZWFkZXIgZm9yIHRoZSBwYWNrZXQuCi0qIFJldHVybnM6Ci0qCTAJCVN1Y2Nlc3MgYW5kIG1vcmUgYnVmZnMgYXZhaWxhYmxlCi0qCTEJCVN1Y2Nlc3MgYnV0IG5vIG1vcmUgYnVmZnMKLSoJMgkJQWxsb2NhdGlvbiBmYWlsdXJlCi0qCTMJCU1BQyBUeCBjb21tYW5kIGZhaWxlZAotKgk0CQlCdWZmZXIgZnVsbCBvciBxdWV1ZSBidXN5Ci0qCi0qIFNpZGUgZWZmZWN0czoKLSoKLSogQ2FsbCBjb250ZXh0OgotKglwcm9jZXNzIHRocmVhZAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgaGZhMzg0eF9kcnZyX3R4ZnJhbWUoaGZhMzg0eF90ICpodywgc3RydWN0IHNrX2J1ZmYgKnNrYiwgcDgwMjExX2hkcl90ICpwODAyMTFfaGRyLCBwODAyMTFfbWV0YXdlcF90ICpwODAyMTFfd2VwKQotewotCWhmYTM4NHhfdHhfZnJhbWVfdAl0eGRlc2M7Ci0JVUlOVDE2CQkJbWFjcSA9IDA7Ci0JVUlOVDE2CQkJZmlkOwotCWludAkJCXJlc3VsdDsKLQotCURCRkVOVEVSOwotCi0JLyogQnVpbGQgVHggZnJhbWUgc3RydWN0dXJlICovCi0JLyogU2V0IHVwIHRoZSBjb250cm9sIGZpZWxkICovCi0JbWVtc2V0KCZ0eGRlc2MsIDAsIHNpemVvZih0eGRlc2MpKTsKLQotLyogVHggY29tcGxldGUgYW5kIFR4IGV4Y2VwdGlvbiBkaXNhYmxlIHBlciBkbGVhY2guICBNaWdodCBiZSBjYXVzaW5nCi0gKiBidWYgZGVwbGV0aW9uCi0gKi8KLSNkZWZpbmUgRE9CT1RIIDEKLSNpZiBET0JPVEgKLQl0eGRlc2MudHhfY29udHJvbCA9Ci0JCUhGQTM4NHhfVFhfTUFDUE9SVF9TRVQoMCkgfCBIRkEzODR4X1RYX1NUUlVDVFlQRV9TRVQoMSkgfAotCQlIRkEzODR4X1RYX1RYRVhfU0VUKDEpIHwgSEZBMzg0eF9UWF9UWE9LX1NFVCgxKTsKLSNlbGlmIERPRVhDCi0JdHhkZXNjLnR4X2NvbnRyb2wgPQotCQlIRkEzODR4X1RYX01BQ1BPUlRfU0VUKDApIHwgSEZBMzg0eF9UWF9TVFJVQ1RZUEVfU0VUKDEpIHwKLQkJSEZBMzg0eF9UWF9UWEVYX1NFVCgxKSB8IEhGQTM4NHhfVFhfVFhPS19TRVQoMCk7Ci0jZWxzZQotCXR4ZGVzYy50eF9jb250cm9sID0KLQkJSEZBMzg0eF9UWF9NQUNQT1JUX1NFVCgwKSB8IEhGQTM4NHhfVFhfU1RSVUNUWVBFX1NFVCgxKSB8Ci0JCUhGQTM4NHhfVFhfVFhFWF9TRVQoMCkgfCBIRkEzODR4X1RYX1RYT0tfU0VUKDApOwotI2VuZGlmCi0KLQkvKiBpZiB3ZSdyZSB1c2luZyBob3N0IFdFUCwgaW5jcmVhc2Ugc2l6ZSBieSBJVitJQ1YgKi8KLQlpZiAocDgwMjExX3dlcC0+ZGF0YSkgewotCQl0eGRlc2MuZGF0YV9sZW4gPSBob3N0MmhmYTM4NHhfMTYoc2tiLT5sZW4rOCk7Ci0JCS8vCQl0eGRlc2MudHhfY29udHJvbCB8PSBIRkEzODR4X1RYX05PRU5DUllQVF9TRVQoMSk7Ci0JfSBlbHNlIHsKLQkJdHhkZXNjLmRhdGFfbGVuID0gIGhvc3QyaGZhMzg0eF8xNihza2ItPmxlbik7Ci0JfQotCi0JdHhkZXNjLnR4X2NvbnRyb2wgPSBob3N0MmhmYTM4NHhfMTYodHhkZXNjLnR4X2NvbnRyb2wpOwotCS8qIGNvcHkgdGhlIGhlYWRlciBvdmVyIHRvIHRoZSB0eGRlc2MgKi8KLQltZW1jcHkoJih0eGRlc2MuZnJhbWVfY29udHJvbCksIHA4MDIxMV9oZHIsIHNpemVvZihwODAyMTFfaGRyX3QpKTsKLQotCS8qIFNpbmNlIHRidXN5IGlzIHNldCB3aGVuZXZlciB0aGUgc3RhY2sgaXMgZW1wdHksIHRoZXJlIHNob3VsZAotCSAqIGFsd2F5cyBiZSBzb21ldGhpbmcgb24gdGhlIHN0YWNrIGlmIHdlIGdldCB0byB0aGlzIHBvaW50LgotCSAqIFtNU01dOiBOT1QgVFJVRSEhISEhIHNvIEkgYWRkZWQgdGhlIHRlc3Qgb2YgZmlkIGJlbG93LgotCSAqLwotCi0JLyogQWxsb2NhdGUgRklEICovCi0KLQlmaWQgPSB0eGZpZF9xdWV1ZV9yZW1vdmUoaHcpOwotCi0JaWYgKCBmaWQgPT0gMCApIHsgLyogc3RhY2sgb3IgcXVldWUgd2FzIGVtcHR5ICovCi0JCXJldHVybiA0OwotCX0KLQotCS8qIG5vdyBsZXQncyBnZXQgdGhlIGNtZGxvY2sgKi8KLQlzcGluX2xvY2soJmh3LT5jbWRsb2NrKTsKLQotCS8qIENvcHkgZGVzY3JpcHRvcitwYXlsb2FkIHRvIEZJRCAqLwotICAgICAgICBpZiAocDgwMjExX3dlcC0+ZGF0YSkgewotCQlyZXN1bHQgPSBoZmEzODR4X2NvcHlfdG9fYmFwNChodywgSEZBMzg0eF9CQVBfUFJPQywgZmlkLCAwLAotCQkJCQkgICAgICAmdHhkZXNjLCBzaXplb2YodHhkZXNjKSwKLQkJCQkJICAgICAgcDgwMjExX3dlcC0+aXYsIHNpemVvZihwODAyMTFfd2VwLT5pdiksCi0JCQkJCSAgICAgIHA4MDIxMV93ZXAtPmRhdGEsIHNrYi0+bGVuLAotCQkJCQkgICAgICBwODAyMTFfd2VwLT5pY3YsIHNpemVvZihwODAyMTFfd2VwLT5pY3YpKTsKLQl9IGVsc2UgewotCQlyZXN1bHQgPSBoZmEzODR4X2NvcHlfdG9fYmFwNChodywgSEZBMzg0eF9CQVBfUFJPQywgZmlkLCAwLAotCQkJCQkgICAgICAmdHhkZXNjLCBzaXplb2YodHhkZXNjKSwKLQkJCQkJICAgICAgc2tiLT5kYXRhLCBza2ItPmxlbiwKLQkJCQkJICAgICAgTlVMTCwgMCwgTlVMTCwgMCk7Ci0JfQotCi0JaWYgKCByZXN1bHQgKSB7Ci0JCVdMQU5fTE9HX0RFQlVHKDEsCi0JCQkiY29weV90b19iYXAoJTA0eCwgJWQsICVkKSBmYWlsZWQsIHJlc3VsdD0weCV4XG4iLAotCQkJZmlkLAotCQkgCXNpemVvZih0eGRlc2MpLAotCSAJCXNrYi0+bGVuLAotCQkJcmVzdWx0KTsKLQotCQkvKiBwdXQgdGhlIGZpZCBiYWNrIGluIHRoZSBxdWV1ZSAqLwotCQl0eGZpZF9xdWV1ZV9hZGQoaHcsIGZpZCk7Ci0KLQkJcmVzdWx0ID0gMzsKLQkJZ290byBmYWlsZWQ7Ci0JfQotCi0JLyogSXNzdWUgVHggY29tbWFuZCAqLwotCXJlc3VsdCA9IGhmYTM4NHhfY21kX3RyYW5zbWl0KGh3LCBIRkEzODR4X1RYQ01EX1JFQ0wsIG1hY3EsIGZpZCk7Ci0KLQlpZiAoIHJlc3VsdCAhPSAwICkgewotCQl0eGZpZF9xdWV1ZV9hZGQoaHcsIGZpZCk7Ci0KLQkJV0xBTl9MT0dfREVCVUcoMSwiY21kX3R4KCUwNHgpIGZhaWxlZCwgcmVzdWx0PSVkXG4iLAotCQkJZmlkLCByZXN1bHQpOwotCQlyZXN1bHQgPSAzOwotCQlnb3RvIGZhaWxlZDsKLQl9Ci0KLQkvKiBpbmRpY2F0ZSB3ZSBoYXZlbid0IGFueSBidWZmZXJzLCBpbnRfYWxsb2Mgd2lsbCBjbGVhciAqLwotCXJlc3VsdCA9IHR4ZmlkX3F1ZXVlX2VtcHR5KGh3KTsKLWZhaWxlZDoKLQotCXNwaW5fdW5sb2NrKCZody0+Y21kbG9jayk7Ci0KLQlEQkZFWElUOwotCXJldHVybiByZXN1bHQ7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBoZmEzODR4X2ludGVycnVwdAotKgotKiBEcml2ZXIgaW50ZXJydXB0IGhhbmRsZXIuCi0qCi0qIEFyZ3VtZW50czoKLSoJaXJxCQlpcnEgbnVtYmVyCi0qCWRldl9pZAkJcG9pbnRlciB0byB0aGUgZGV2aWNlCi0qCXJlZ3MJCXJlZ2lzdGVycwotKgotKiBSZXR1cm5zOgotKglub3RoaW5nCi0qCi0qIFNpZGUgZWZmZWN0czoKLSoJTWF5IHJlc3VsdCBpbiBhIGZyYW1lIGJlaW5nIHBhc3NlZCB1cCB0aGUgc3RhY2sgb3IgYW4gaW5mbwotKglmcmFtZSBiZWluZyBoYW5kbGVkLgotKgotKiBDYWxsIGNvbnRleHQ6Ci0qCVVtbW0sIGNvdWxkIGl0IGJlIGludGVycnVwdD8KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaXJxcmV0dXJuX3QgaGZhMzg0eF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkIFBUX1JFR1MpCi17Ci0JaW50CQkJcmVnOwotCXdsYW5kZXZpY2VfdAkJKndsYW5kZXYgPSAod2xhbmRldmljZV90KilkZXZfaWQ7Ci0JaGZhMzg0eF90CQkqaHcgPSB3bGFuZGV2LT5wcml2OwotCWludAkJCWV2X3JlYWQgPSAwOwotCURCRkVOVEVSOwotCi0JaWYgKCF3bGFuZGV2IHx8IHdsYW5kZXYtPmh3cmVtb3ZlZCkKLQkJcmV0dXJuIElSUV9OT05FOyAgLyogTm90IG11Y2ggd2UgY2FuIGRvIHcvbyBoYXJkd2FyZSAqLwotI2lmIChXTEFOX0hPU1RJRiA9PSBXTEFOX1BDTUNJQSkKLQlpZiAoaHctPmlvYmFzZSA9PSAwKSAgLyogWFhYIEZJWE1FIFByb3Blcmx5ICovCi0JCXJldHVybiBJUlFfTk9ORTsKLSNlbmRpZgotCi0JZm9yICg7O2V2X3JlYWQrKykgewotCQlpZiAoZXZfcmVhZCA+PSBwcmlzbTJfaXJxX2V2cmVhZF9tYXgpCi0JCQlicmVhazsKLQotCQkvKiBDaGVjayBzd3N1cHBvcnQgcmVnIG1hZ2ljICMgZm9yIGNhcmQgcHJlc2VuY2UgKi8KLQkJcmVnID0gaGZhMzg0eF9nZXRyZWcoaHcsIEhGQTM4NHhfU1dTVVBQT1JUMCk7Ci0JCWlmICggcmVnICE9IEhGQTM4NHhfRFJWUl9NQUdJQykgewotCQkJV0xBTl9MT0dfREVCVUcoMiwgImlycT0lZCwgbm8gbWFnaWMuICBDYXJkIHJlbW92ZWQ/LlxuIiwgaXJxKTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJLyogcmVhZCB0aGUgRXZTdGF0IHJlZ2lzdGVyIGZvciBpbnRlcnJ1cHQgZW5hYmxlZCBldmVudHMgKi8KLQkJcmVnID0gaGZhMzg0eF9nZXRyZWcoaHcsIEhGQTM4NHhfRVZTVEFUKTsKLQotCQkvKiBBTkQgd2l0aCB0aGUgZW5hYmxlZCBpbnRlcnJ1cHRzICovCi0JCXJlZyAmPSBoZmEzODR4X2dldHJlZyhodywgSEZBMzg0eF9JTlRFTik7Ci0KLQkJLyogSGFuZGxlIHRoZSBldmVudHMgKi8KLQkJaWYgKCBIRkEzODR4X0VWU1RBVF9JU1dURVJSKHJlZykgKXsKLQkJCVdMQU5fTE9HX0VSUk9SKAotCQkJIkVycm9yOiBXVEVSUiBpbnRlcnJ1cHQgcmVjZWl2ZWQgKHVuaGFuZGxlZCkuXG4iKTsKLQkJCWhmYTM4NHhfc2V0cmVnKGh3LCBIRkEzODR4X0VWQUNLX1dURVJSX1NFVCgxKSwKLQkJCQlIRkEzODR4X0VWQUNLKTsKLQkJfQotCi0JCWlmICggSEZBMzg0eF9FVlNUQVRfSVNJTkZEUk9QKHJlZykgKXsKLQkJCWhmYTM4NHhfaW50X2luZmRyb3Aod2xhbmRldik7Ci0JCQloZmEzODR4X3NldHJlZyhodywgSEZBMzg0eF9FVkFDS19JTkZEUk9QX1NFVCgxKSwKLQkJCQlIRkEzODR4X0VWQUNLKTsKLQkJfQotCi0JCWlmIChIRkEzODR4X0VWU1RBVF9JU0JBUF9PUChyZWcpKSB7Ci0JCQkvKiBEaXNhYmxlIHRoZSBCQVAgaW50ZXJydXB0cyAqLwotCQkJaGZhMzg0eF9ldmVudHNfbm9iYXAoaHcpOwotCQkJdGFza2xldF9zY2hlZHVsZSgmaHctPmJhcF90YXNrbGV0KTsKLQkJfQotCi0JCWlmICggSEZBMzg0eF9FVlNUQVRfSVNBTExPQyhyZWcpICl7Ci0JCQloZmEzODR4X2ludF9hbGxvYyh3bGFuZGV2KTsKLQkJCWhmYTM4NHhfc2V0cmVnKGh3LCBIRkEzODR4X0VWQUNLX0FMTE9DX1NFVCgxKSwKLQkJCQlIRkEzODR4X0VWQUNLKTsKLQkJfQotCi0JCWlmICggSEZBMzg0eF9FVlNUQVRfSVNEVElNKHJlZykgKXsKLQkJCWhmYTM4NHhfaW50X2R0aW0od2xhbmRldik7Ci0JCQloZmEzODR4X3NldHJlZyhodywgSEZBMzg0eF9FVkFDS19EVElNX1NFVCgxKSwKLQkJCQlIRkEzODR4X0VWQUNLKTsKLQkJfQotI2lmZGVmIENNRF9JUlEKLQkJaWYgKCBIRkEzODR4X0VWU1RBVF9JU0NNRChyZWcpICl7Ci0JCQloZmEzODR4X2ludF9jbWQod2xhbmRldik7Ci0JCQloZmEzODR4X3NldHJlZyhodywgSEZBMzg0eF9FVkFDS19DTURfU0VUKDEpLAotCQkJCSAgICAgICBIRkEzODR4X0VWQUNLKTsKLQkJfQotI2VuZGlmCi0KLQkJLyogYWxsb3cgdGhlIGV2c3RhdCB0byBiZSB1cGRhdGVkIGFmdGVyIHRoZSBldmFjayAqLwotCQl1ZGVsYXkoMjApOwotCX0KLQotCURCRkVYSVQ7Ci0JcmV0dXJuIElSUV9IQU5ETEVEOwotfQotCi0jaWZkZWYgQ01EX0lSUQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIGhmYTM4NHhfaW50X2NtZAotKgotKiBIYW5kbGVzIGNvbW1hbmQgY29tcGxldGlvbiBldmVudC4KLSoKLSogQXJndW1lbnRzOgotKgl3bGFuZGV2CQl3bGFuIGRldmljZSBzdHJ1Y3R1cmUKLSoKLSogUmV0dXJuczoKLSoJbm90aGluZwotKgotKiBTaWRlIGVmZmVjdHM6Ci0qCi0qIENhbGwgY29udGV4dDoKLSoJaW50ZXJydXB0Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXZvaWQgaGZhMzg0eF9pbnRfY21kKHdsYW5kZXZpY2VfdCAqd2xhbmRldikKLXsKLQloZmEzODR4X3QJCSpodyA9IHdsYW5kZXYtPnByaXY7Ci0JREJGRU5URVI7Ci0KLQkvLyBjaGVjayB0byBtYWtlIHN1cmUgaXQncyB0aGUgcmlnaHQgY29tbWFuZD8KLQlpZiAoaHctPmNtZGRhdGEpIHsKLQkJaHctPmNtZGRhdGEtPnN0YXR1cyA9IGhmYTM4NHhfZ2V0cmVnKGh3LCBIRkEzODR4X1NUQVRVUyk7Ci0JCWh3LT5jbWRkYXRhLT5yZXNwMCA9IGhmYTM4NHhfZ2V0cmVnKGh3LCBIRkEzODR4X1JFU1AwKTsKLQkJaHctPmNtZGRhdGEtPnJlc3AxID0gaGZhMzg0eF9nZXRyZWcoaHcsIEhGQTM4NHhfUkVTUDEpOwotCQlody0+Y21kZGF0YS0+cmVzcDIgPSBoZmEzODR4X2dldHJlZyhodywgSEZBMzg0eF9SRVNQMik7Ci0JfQotCWh3LT5jbWRmbGFnID0gMTsKLQotCXByaW50ayhLRVJOX0lORk8gInVtLiBpbnRfY21kXG4iKTsKLQotCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmaHctPmNtZHEpOwotCi0JLy8gWFhYWCBwZXJmb3JtIGEgYmFwIGNvcHkgdG9vPwotCi0JREJGRVhJVDsKLQlyZXR1cm47Ci19Ci0jZW5kaWYKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIGhmYTM4NHhfaW50X2R0aW0KLSoKLSogSGFuZGxlcyB0aGUgRFRJTSBlYXJseSB3YXJuaW5nIGV2ZW50LgotKgotKiBBcmd1bWVudHM6Ci0qCXdsYW5kZXYJCXdsYW4gZGV2aWNlIHN0cnVjdHVyZQotKgotKiBSZXR1cm5zOgotKglub3RoaW5nCi0qCi0qIFNpZGUgZWZmZWN0czoKLSoKLSogQ2FsbCBjb250ZXh0OgotKglpbnRlcnJ1cHQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotc3RhdGljIHZvaWQgaGZhMzg0eF9pbnRfZHRpbSh3bGFuZGV2aWNlX3QgKndsYW5kZXYpCi17Ci0jaWYgMAotCWhmYTM4NHhfdAkJKmh3ID0gd2xhbmRldi0+cHJpdjsKLSNlbmRpZgotCURCRkVOVEVSOwotCXByaXNtMnN0YV9ldl9kdGltKHdsYW5kZXYpOwotCURCRkVYSVQ7Ci0JcmV0dXJuOwotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBoZmEzODR4X2ludF9pbmZkcm9wCi0qCi0qIEhhbmRsZXMgdGhlIEluZkRyb3AgZXZlbnQuCi0qCi0qIEFyZ3VtZW50czoKLSoJd2xhbmRldgkJd2xhbiBkZXZpY2Ugc3RydWN0dXJlCi0qCi0qIFJldHVybnM6Ci0qCW5vdGhpbmcKLSoKLSogU2lkZSBlZmZlY3RzOgotKgotKiBDYWxsIGNvbnRleHQ6Ci0qCWludGVycnVwdAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1zdGF0aWMgdm9pZCBoZmEzODR4X2ludF9pbmZkcm9wKHdsYW5kZXZpY2VfdCAqd2xhbmRldikKLXsKLSNpZiAwCi0JaGZhMzg0eF90CQkqaHcgPSB3bGFuZGV2LT5wcml2OwotI2VuZGlmCi0JREJGRU5URVI7Ci0JcHJpc20yc3RhX2V2X2luZmRyb3Aod2xhbmRldik7Ci0JREJGRVhJVDsKLQlyZXR1cm47Ci19Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIGhmYTM4NHhfaW50X2luZm8KLSoKLSogSGFuZGxlcyB0aGUgSW5mbyBldmVudC4KLSoKLSogQXJndW1lbnRzOgotKgl3bGFuZGV2CQl3bGFuIGRldmljZSBzdHJ1Y3R1cmUKLSoKLSogUmV0dXJuczoKLSoJbm90aGluZwotKgotKiBTaWRlIGVmZmVjdHM6Ci0qCi0qIENhbGwgY29udGV4dDoKLSoJdGFza2xldAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1zdGF0aWMgdm9pZCBoZmEzODR4X2ludF9pbmZvKHdsYW5kZXZpY2VfdCAqd2xhbmRldikKLXsKLQloZmEzODR4X3QJCSpodyA9IHdsYW5kZXYtPnByaXY7Ci0JVUlOVDE2CQkJcmVnOwotCWhmYTM4NHhfSW5mRnJhbWVfdAlpbmY7Ci0JaW50CQkJcmVzdWx0OwotCURCRkVOVEVSOwotCS8qIFJldHJpZXZlIHRoZSBGSUQgKi8KLQlyZWcgPSBoZmEzODR4X2dldHJlZyhodywgSEZBMzg0eF9JTkZPRklEKTsKLQotCS8qIFJldHJpZXZlIHRoZSBsZW5ndGggKi8KLQlyZXN1bHQgPSBoZmEzODR4X2NvcHlfZnJvbV9iYXAoIGh3LAotCQlIRkEzODR4X0JBUF9JTlQsIHJlZywgMCwgJmluZi5mcmFtZWxlbiwgc2l6ZW9mKFVJTlQxNikpOwotCWlmICggcmVzdWx0ICkgewotCQlXTEFOX0xPR19ERUJVRygxLAotCQkJImNvcHlfZnJvbV9iYXAoMHglMDR4LCAwLCAlZCkgZmFpbGVkLCByZXN1bHQ9MHgleFxuIiwKLQkJCXJlZywgc2l6ZW9mKGluZiksIHJlc3VsdCk7Ci0JCWdvdG8gZmFpbGVkOwotCX0KLQlpbmYuZnJhbWVsZW4gPSBoZmEzODR4Mmhvc3RfMTYoaW5mLmZyYW1lbGVuKTsKLQotCS8qIFJldHJpZXZlIHRoZSByZXN0ICovCi0JcmVzdWx0ID0gaGZhMzg0eF9jb3B5X2Zyb21fYmFwKCBodywKLQkJSEZBMzg0eF9CQVBfSU5ULCByZWcsIHNpemVvZihVSU5UMTYpLAotCQkmKGluZi5pbmZvdHlwZSksIGluZi5mcmFtZWxlbiAqIHNpemVvZihVSU5UMTYpKTsKLQlpZiAoIHJlc3VsdCApIHsKLQkJV0xBTl9MT0dfREVCVUcoMSwKLQkJCSJjb3B5X2Zyb21fYmFwKDB4JTA0eCwgMCwgJWQpIGZhaWxlZCwgcmVzdWx0PTB4JXhcbiIsCi0JCQlyZWcsIHNpemVvZihpbmYpLCByZXN1bHQpOwotCQlnb3RvIGZhaWxlZDsKLQl9Ci0KLQlwcmlzbTJzdGFfZXZfaW5mbyh3bGFuZGV2LCAmaW5mKTsKLWZhaWxlZDoKLQlEQkZFWElUOwotCXJldHVybjsKLX0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogaGZhMzg0eF9pbnRfdHhleGMKLSoKLSogSGFuZGxlcyB0aGUgVHhFeGMgZXZlbnQuICBBIFRyYW5zbWl0IEV4Y2VwdGlvbiBldmVudCBpbmRpY2F0ZXMKLSogdGhhdCB0aGUgTUFDJ3MgVFggcHJvY2VzcyB3YXMgdW5zdWNjZXNzZnVsIC0gc28gdGhlIHBhY2tldCBkaWQKLSogbm90IGdldCB0cmFuc21pdHRlZC4KLSoKLSogQXJndW1lbnRzOgotKgl3bGFuZGV2CQl3bGFuIGRldmljZSBzdHJ1Y3R1cmUKLSoKLSogUmV0dXJuczoKLSoJbm90aGluZwotKgotKiBTaWRlIGVmZmVjdHM6Ci0qCi0qIENhbGwgY29udGV4dDoKLSoJdGFza2xldAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1zdGF0aWMgdm9pZCBoZmEzODR4X2ludF90eGV4Yyh3bGFuZGV2aWNlX3QgKndsYW5kZXYpCi17Ci0JaGZhMzg0eF90CQkqaHcgPSB3bGFuZGV2LT5wcml2OwotCVVJTlQxNgkJCXN0YXR1czsKLQlVSU5UMTYJCQlmaWQ7Ci0JaW50CQkJcmVzdWx0ID0gMDsKLQlEQkZFTlRFUjsKLQkvKiBDb2xsZWN0IHRoZSBzdGF0dXMgYW5kIGRpc3BsYXkgKi8KLQlmaWQgPSBoZmEzODR4X2dldHJlZyhodywgSEZBMzg0eF9UWENPTVBMRklEKTsKLQlyZXN1bHQgPSBoZmEzODR4X2NvcHlfZnJvbV9iYXAoaHcsIEhGQTM4NHhfQkFQX0lOVCwgZmlkLCAwLCAmc3RhdHVzLCBzaXplb2Yoc3RhdHVzKSk7Ci0JaWYgKCByZXN1bHQgKSB7Ci0JCVdMQU5fTE9HX0RFQlVHKDEsCi0JCQkiY29weV9mcm9tX2JhcCgweCUwNHgsIDAsICVkKSBmYWlsZWQsIHJlc3VsdD0weCV4XG4iLAotCQkJZmlkLCBzaXplb2Yoc3RhdHVzKSwgcmVzdWx0KTsKLQkJZ290byBmYWlsZWQ7Ci0JfQotCXN0YXR1cyA9IGhmYTM4NHgyaG9zdF8xNihzdGF0dXMpOwotCXByaXNtMnN0YV9ldl90eGV4Yyh3bGFuZGV2LCBzdGF0dXMpOwotZmFpbGVkOgotCURCRkVYSVQ7Ci0JcmV0dXJuOwotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBoZmEzODR4X2ludF90eAotKgotKiBIYW5kbGVzIHRoZSBUeCBldmVudC4KLSoKLSogQXJndW1lbnRzOgotKgl3bGFuZGV2CQl3bGFuIGRldmljZSBzdHJ1Y3R1cmUKLSoKLSogUmV0dXJuczoKLSoJbm90aGluZwotKgotKiBTaWRlIGVmZmVjdHM6Ci0qCi0qIENhbGwgY29udGV4dDoKLSoJdGFza2xldAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1zdGF0aWMgdm9pZCBoZmEzODR4X2ludF90eCh3bGFuZGV2aWNlX3QgKndsYW5kZXYpCi17Ci0JaGZhMzg0eF90CQkqaHcgPSB3bGFuZGV2LT5wcml2OwotCVVJTlQxNgkJCWZpZDsKLQlVSU5UMTYJCQlzdGF0dXM7Ci0JaW50CQkJcmVzdWx0ID0gMDsKLQlEQkZFTlRFUjsKLQlmaWQgPSBoZmEzODR4X2dldHJlZyhodywgSEZBMzg0eF9UWENPTVBMRklEKTsKLQlyZXN1bHQgPSBoZmEzODR4X2NvcHlfZnJvbV9iYXAoaHcsIEhGQTM4NHhfQkFQX0lOVCwgZmlkLCAwLCAmc3RhdHVzLCBzaXplb2Yoc3RhdHVzKSk7Ci0JaWYgKCByZXN1bHQgKSB7Ci0JCVdMQU5fTE9HX0RFQlVHKDEsCi0JCQkiY29weV9mcm9tX2JhcCgweCUwNHgsIDAsICVkKSBmYWlsZWQsIHJlc3VsdD0weCV4XG4iLAotCQkJZmlkLCBzaXplb2Yoc3RhdHVzKSwgcmVzdWx0KTsKLQkJZ290byBmYWlsZWQ7Ci0JfQotCXN0YXR1cyA9IGhmYTM4NHgyaG9zdF8xNihzdGF0dXMpOwotCXByaXNtMnN0YV9ldl90eCh3bGFuZGV2LCBzdGF0dXMpOwotZmFpbGVkOgotCURCRkVYSVQ7Ci0JcmV0dXJuOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogaGZhMzg0eF9pbnRfcngKLSoKLSogSGFuZGxlcyB0aGUgUnggZXZlbnQuCi0qCi0qIEFyZ3VtZW50czoKLSoJd2xhbmRldgkJd2xhbiBkZXZpY2Ugc3RydWN0dXJlCi0qCi0qIFJldHVybnM6Ci0qCW5vdGhpbmcKLSoKLSogU2lkZSBlZmZlY3RzOgotKgotKiBDYWxsIGNvbnRleHQ6Ci0qCXRhc2tsZXQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotc3RhdGljIHZvaWQgaGZhMzg0eF9pbnRfcngod2xhbmRldmljZV90ICp3bGFuZGV2KQotewotCWhmYTM4NHhfdAkJKmh3ID0gd2xhbmRldi0+cHJpdjsKLQlVSU5UMTYJCQlyeGZpZDsKLQloZmEzODR4X3J4X2ZyYW1lX3QJcnhkZXNjOwotCWludAkJCXJlc3VsdDsKLQlpbnQgICAgICAgICAgICAgICAgICAgICBoZHJsZW47Ci0JVUlOVDE2ICAgICAgICAgICAgICAgICAgZmM7Ci0JcDgwMjExX3J4bWV0YV90CSpyeG1ldGE7Ci0Jc3RydWN0IHNrX2J1ZmYgICAgICAgICAgKnNrYiA9IE5VTEw7Ci0JVUlOVDggKmRhdGFwOwotCi0JREJGRU5URVI7Ci0KLQkvKiBHZXQgdGhlIEZJRCAqLwotCXJ4ZmlkID0gaGZhMzg0eF9nZXRyZWcoaHcsIEhGQTM4NHhfUlhGSUQpOwotCS8qIEdldCB0aGUgZGVzY3JpcHRvciAoaW5jbHVkaW5nIGhlYWRlcnMpICovCi0JcmVzdWx0ID0gaGZhMzg0eF9jb3B5X2Zyb21fYmFwKGh3LAotCQkJSEZBMzg0eF9CQVBfSU5ULAotCQkJcnhmaWQsCi0JCQkwLAotCQkJJnJ4ZGVzYywKLQkJCXNpemVvZihyeGRlc2MpKTsKLQlpZiAoIHJlc3VsdCApIHsKLQkJV0xBTl9MT0dfREVCVUcoMSwKLQkJCSJjb3B5X2Zyb21fYmFwKDB4JTA0eCwgJWQsICVkKSBmYWlsZWQsIHJlc3VsdD0weCV4XG4iLAotCQkJcnhmaWQsCi0JCQkwLAotCQkJc2l6ZW9mKHJ4ZGVzYyksCi0JCQlyZXN1bHQpOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JLyogQnl0ZSBvcmRlciBjb252ZXJ0IG9uY2UgdXAgZnJvbnQuICovCi0JcnhkZXNjLnN0YXR1cyA9CWhmYTM4NHgyaG9zdF8xNihyeGRlc2Muc3RhdHVzKTsKLQlyeGRlc2MudGltZSA9CWhmYTM4NHgyaG9zdF8zMihyeGRlc2MudGltZSk7Ci0KLQkvKiBkcm9wIGVycm9ycyBhbmQgd2hhdG5vdCBpbiBwcm9taXNjIG1vZGUgKi8KLQlpZiAoKCB3bGFuZGV2LT5uZXRkZXYtPmZsYWdzICYgSUZGX1BST01JU0MgKSAmJgotCSAgICAoSEZBMzg0eF9SWFNUQVRVU19JU0ZDU0VSUihyeGRlc2Muc3RhdHVzKSB8fAotCSAgICAgSEZBMzg0eF9SWFNUQVRVU19JU1VOREVDUihyeGRlc2Muc3RhdHVzKSkpCi0JICBnb3RvIGRvbmU7Ci0KLQkvKiBOb3cgaGFuZGxlIGZyYW1lIGJhc2VkIG9uIHBvcnQjICovCi0Jc3dpdGNoKCBIRkEzODR4X1JYU1RBVFVTX01BQ1BPUlRfR0VUKHJ4ZGVzYy5zdGF0dXMpICkKLQl7Ci0JY2FzZSAwOgotCi0JCWZjID0gaWVlZTJob3N0MTYocnhkZXNjLmZyYW1lX2NvbnRyb2wpOwotCi0JCS8qIElmIGV4Y2x1ZGUgYW5kIHdlIHJlY2VpdmUgYW4gdW5lbmNyeXB0ZWQsIGRyb3AgaXQgKi8KLQkJaWYgKCAod2xhbmRldi0+aG9zdHdlcCAmIEhPU1RXRVBfRVhDTFVERVVORU5DUllQVEVEKSAmJgotCQkgICAgICFXTEFOX0dFVF9GQ19JU1dFUChmYykpIHsKLQkJCWdvdG8gZG9uZTsKLQkJfQotCi0JCWhkcmxlbiA9IHA4MDIxMV9oZWFkZXJsZW4oZmMpOwotCi0JCS8qIEFsbG9jYXRlIHRoZSBidWZmZXIsIG5vdGUgQ1JDIChha2EgRkNTKS4gcGJhbGxvYyAqLwotCQkvKiBhc3N1bWVzIHRoZXJlIG5lZWRzIHRvIGJlIHNwYWNlIGZvciBvbmUgKi8KLQkJc2tiID0gZGV2X2FsbG9jX3NrYihoZmEzODR4Mmhvc3RfMTYocnhkZXNjLmRhdGFfbGVuKSArIGhkcmxlbiArIFdMQU5fQ1JDX0xFTiArIDIpOyAvKiBhIGxpdHRsZSBleHRyYSAqLwotCi0JCWlmICggISBza2IgKSB7Ci0JCQlXTEFOX0xPR19FUlJPUigiYWxsb2Nfc2tiIGZhaWxlZC5cbiIpOwotCQkJZ290byBkb25lOwotICAgICAgICAgICAgICAgIH0KLQotCQlza2ItPmRldiA9IHdsYW5kZXYtPm5ldGRldjsKLQotCQkvKiB0aGVvcmV0aWNhbGx5IGFsaWduIHRoZSBJUCBoZWFkZXIgb24gYSAzMi1iaXQgd29yZC4gKi8KLQkJaWYgKCBoZHJsZW4gPT0gV0xBTl9IRFJfQTRfTEVOICkKLQkJCXNrYl9yZXNlcnZlKHNrYiwgMik7Ci0KLQkJLyogQ29weSB0aGUgODAyLjExIGhkciB0byB0aGUgYnVmZmVyICovCi0JCWRhdGFwID0gc2tiX3B1dChza2IsIFdMQU5fSERSX0EzX0xFTik7Ci0JCW1lbWNweShkYXRhcCwgJnJ4ZGVzYy5mcmFtZV9jb250cm9sLCBXTEFOX0hEUl9BM19MRU4pOwotCi0JCS8qIFNuYWcgdGhlIEE0IGFkZHJlc3MgaWYgcHJlc2VudCAqLwotCQlpZiAoaGRybGVuID09IFdMQU5fSERSX0E0X0xFTikgewotCQkJZGF0YXAgPSBza2JfcHV0KHNrYiwgV0xBTl9BRERSX0xFTik7Ci0JCQltZW1jcHkoZGF0YXAsICZyeGRlc2MuYWRkcmVzczQsIFdMQU5fSERSX0EzX0xFTik7Ci0JCX0KLQotCQkvKiB3ZSBjYW4gY29udmVydCB0aGUgZGF0YV9sZW4gYXMgd2UgcGFzc2VkIHRoZSBvcmlnaW5hbCBvbiAqLwotCQlyeGRlc2MuZGF0YV9sZW4gPSBoZmEzODR4Mmhvc3RfMTYocnhkZXNjLmRhdGFfbGVuKTsKLQotCQkvKiBDb3B5IHRoZSBwYXlsb2FkIGRhdGEgdG8gdGhlIGJ1ZmZlciAqLwotCQlpZiAoIHJ4ZGVzYy5kYXRhX2xlbiA+IDAgKSB7Ci0JCQlkYXRhcCA9IHNrYl9wdXQoc2tiLCByeGRlc2MuZGF0YV9sZW4pOwotCQkJcmVzdWx0ID0gaGZhMzg0eF9jb3B5X2Zyb21fYmFwKGh3LAotCQkJCUhGQTM4NHhfQkFQX0lOVCwgcnhmaWQsIEhGQTM4NHhfUlhfREFUQV9PRkYsCi0JCQkJZGF0YXAsIHJ4ZGVzYy5kYXRhX2xlbik7Ci0JCQlpZiAoIHJlc3VsdCApIHsKLQkJCQlXTEFOX0xPR19ERUJVRygxLAotCQkJCQkiY29weV9mcm9tX2JhcCgweCUwNHgsICVkLCAlZCkgZmFpbGVkLCByZXN1bHQ9MHgleFxuIiwKLQkJCQkJcnhmaWQsCi0JCQkJCUhGQTM4NHhfUlhfREFUQV9PRkYsCi0JCQkJCXJ4ZGVzYy5kYXRhX2xlbiwKLQkJCQkJcmVzdWx0KTsKLQkJCQlnb3RvIGZhaWxlZDsKLQkJCX0KLQkJfQotCQkvKiB0aGUgcHJpc20yIGNhcmRzIGRvbid0IHJldHVybiB0aGUgRkNTICovCi0JCWRhdGFwID0gc2tiX3B1dChza2IsIFdMQU5fQ1JDX0xFTik7Ci0JCW1lbXNldCAoZGF0YXAsIDB4ZmYsIFdMQU5fQ1JDX0xFTik7Ci0JCXNrYl9yZXNldF9tYWNfaGVhZGVyKHNrYik7Ci0KLQkJLyogQXR0YWNoIHRoZSByeG1ldGEsIHNldCBzb21lIHN0dWZmICovCi0JCXA4MDIxMXNrYl9yeG1ldGFfYXR0YWNoKHdsYW5kZXYsIHNrYik7Ci0JCXJ4bWV0YSA9IFA4MDIxMVNLQl9SWE1FVEEoc2tiKTsKLQkJcnhtZXRhLT5tYWN0aW1lID0gcnhkZXNjLnRpbWU7Ci0JCXJ4bWV0YS0+cnhyYXRlID0gcnhkZXNjLnJhdGU7Ci0JCXJ4bWV0YS0+c2lnbmFsID0gcnhkZXNjLnNpZ25hbCAtIGh3LT5kYm1hZGp1c3Q7Ci0JCXJ4bWV0YS0+bm9pc2UgPSByeGRlc2Muc2lsZW5jZSAtIGh3LT5kYm1hZGp1c3Q7Ci0KLQkJcHJpc20yc3RhX2V2X3J4KHdsYW5kZXYsIHNrYik7Ci0JCWdvdG8gZG9uZTsKLQljYXNlIDc6Ci0KLSAgICAgICAgCWlmICggISBIRkEzODR4X1JYU1RBVFVTX0lTRkNTRVJSKHJ4ZGVzYy5zdGF0dXMpICkgewotICAgICAgICAgICAgICAgICAgICAgICAgaGZhMzg0eF9pbnRfcnhtb25pdG9yKCB3bGFuZGV2LCByeGZpZCwgJnJ4ZGVzYyk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFdMQU5fTE9HX0RFQlVHKDMsIlJlY2VpdmVkIG1vbml0b3IgZnJhbWU6IEZDU2VyciBzZXRcbiIpOwotICAgICAgICAgICAgICAgIH0KLQkJZ290byBkb25lOwotCi0JZGVmYXVsdDoKLQotCQlXTEFOX0xPR19XQVJOSU5HKCJSZWNlaXZlZCBmcmFtZSBvbiB1bnN1cHBvcnRlZCBwb3J0PSVkXG4iLAotCQkJSEZBMzg0eF9SWFNUQVRVU19NQUNQT1JUX0dFVChyeGRlc2Muc3RhdHVzKSApOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0gZmFpbGVkOgotCWRldl9rZnJlZV9za2Ioc2tiKTsKLQotIGRvbmU6Ci0JREJGRVhJVDsKLQlyZXR1cm47Ci19Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIGhmYTM4NHhfaW50X3J4bW9uaXRvcgotKgotKiBIZWxwZXIgZnVuY3Rpb24gZm9yIGludF9yeC4gIEhhbmRsZXMgbW9uaXRvciBmcmFtZXMuCi0qIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIGFsbG9jYXRlcyBzcGFjZSBmb3IgdGhlIEZDUyBhbmQgc2V0cyBpdAotKiB0byAweGZmZmZmZmZmLiAgVGhlIGhmYTM4NHggZG9lc24ndCBnaXZlIHVzIHRoZSBGQ1MgdmFsdWUgYnV0IHRoZQotKiBoaWdoZXIgbGF5ZXJzIGV4cGVjdCBpdC4gIDB4ZmZmZmZmZmYgaXMgdXNlZCBhcyBhIGZsYWcgdG8gaW5kaWNhdGUKLSogdGhlIEZDUyBpcyBib2d1cy4KLSoKLSogQXJndW1lbnRzOgotKgl3bGFuZGV2CQl3bGFuIGRldmljZSBzdHJ1Y3R1cmUKLSoJcnhmaWQJCXJlY2VpdmVkIEZJRAotKglyeGRlc2MJCXJ4IGRlc2NyaXB0b3IgcmVhZCBmcm9tIGNhcmQgaW4gaW50X3J4Ci0qCi0qIFJldHVybnM6Ci0qCW5vdGhpbmcKLSoKLSogU2lkZSBlZmZlY3RzOgotKglBbGxvY2F0ZXMgYW4gc2tiIGFuZCBwYXNzZXMgaXQgdXAgdmlhIHRoZSBQRl9QQUNLRVQgaW50ZXJmYWNlLgotKiBDYWxsIGNvbnRleHQ6Ci0qCWludGVycnVwdAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1zdGF0aWMgdm9pZCBoZmEzODR4X2ludF9yeG1vbml0b3IoIHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgVUlOVDE2IHJ4ZmlkLAotCQkJCSAgIGhmYTM4NHhfcnhfZnJhbWVfdCAqcnhkZXNjKQotewotCWhmYTM4NHhfdAkJCSpodyA9IHdsYW5kZXYtPnByaXY7Ci0JVUlOVAkJCQloZHJsZW4gPSAwOwotCVVJTlQJCQkJZGF0YWxlbiA9IDA7Ci0JVUlOVAkJCQlza2JsZW4gPSAwOwotCVVJTlQJCQkJdHJ1bmNhdGVkID0gMDsKLQlVSU5UOAkJCQkqZGF0YXA7Ci0JVUlOVDE2CQkJCWZjOwotCXN0cnVjdCBza19idWZmCQkJKnNrYjsKLQotCURCRkVOVEVSOwotCS8qIERvbid0IGZvcmdldCB0aGUgc3RhdHVzLCB0aW1lLCBhbmQgZGF0YV9sZW4gZmllbGRzIGFyZSBpbiBob3N0IG9yZGVyICovCi0JLyogRmlndXJlIG91dCBob3cgYmlnIHRoZSBmcmFtZSBpcyAqLwotCWZjID0gaWVlZTJob3N0MTYocnhkZXNjLT5mcmFtZV9jb250cm9sKTsKLQloZHJsZW4gPSBwODAyMTFfaGVhZGVybGVuKGZjKTsKLQlkYXRhbGVuID0gaGZhMzg0eDJob3N0XzE2KHJ4ZGVzYy0+ZGF0YV9sZW4pOwotCi0JLyogQWxsb2NhdGUgYW4gaW5kIG1lc3NhZ2UrZnJhbWVzaXplIHNrYiAqLwotCXNrYmxlbiA9IHNpemVvZihwODAyMTFtc2dfbG54aW5kX3dsYW5zbmlmZnJtX3QpICsKLQkJaGRybGVuICsgZGF0YWxlbiArIFdMQU5fQ1JDX0xFTjsKLQotCS8qIHNhbml0eSBjaGVjayB0aGUgbGVuZ3RoICovCi0JaWYgKCBza2JsZW4gPgotCQkoc2l6ZW9mKHA4MDIxMW1zZ19sbnhpbmRfd2xhbnNuaWZmcm1fdCkgKwotCQlXTEFOX0hEUl9BNF9MRU4gKyBXTEFOX0RBVEFfTUFYTEVOICsgV0xBTl9DUkNfTEVOKSApIHsKLQkJV0xBTl9MT0dfREVCVUcoMSwgIm92ZXJsZW4gZnJtOiBsZW49JWRcbiIsCi0JCQlza2JsZW4gLSBzaXplb2YocDgwMjExbXNnX2xueGluZF93bGFuc25pZmZybV90KSk7Ci0JfQotCi0JaWYgKCAoc2tiID0gZGV2X2FsbG9jX3NrYihza2JsZW4pKSA9PSBOVUxMICkgewotCQlXTEFOX0xPR19FUlJPUigiYWxsb2Nfc2tiIGZhaWxlZCB0cnlpbmcgdG8gYWxsb2NhdGUgJWQgYnl0ZXNcbiIsIHNrYmxlbik7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKiBvbmx5IHByZXBlbmQgdGhlIHByaXNtIGhlYWRlciBpZiBpbiB0aGUgcmlnaHQgbW9kZSAqLwotCWlmICgod2xhbmRldi0+bmV0ZGV2LT50eXBlID09IEFSUEhSRF9JRUVFODAyMTFfUFJJU00pICYmCi0JICAgIChody0+c25pZmZoZHIgPT0gMCkpIHsKLQkJcDgwMjExbXNnX2xueGluZF93bGFuc25pZmZybV90CSptc2c7Ci0JCWRhdGFwID0gc2tiX3B1dChza2IsIHNpemVvZihwODAyMTFtc2dfbG54aW5kX3dsYW5zbmlmZnJtX3QpKTsKLQkJbXNnID0gKHA4MDIxMW1zZ19sbnhpbmRfd2xhbnNuaWZmcm1fdCopIGRhdGFwOwotCi0JCS8qIEluaXRpYWxpemUgdGhlIG1lc3NhZ2UgbWVtYmVycyAqLwotCQltc2ctPm1zZ2NvZGUgPSBESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtOwotCQltc2ctPm1zZ2xlbiA9IHNpemVvZihwODAyMTFtc2dfbG54aW5kX3dsYW5zbmlmZnJtX3QpOwotCQlzdHJjcHkobXNnLT5kZXZuYW1lLCB3bGFuZGV2LT5uYW1lKTsKLQotCQltc2ctPmhvc3R0aW1lLmRpZCA9IERJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm1faG9zdHRpbWU7Ci0JCW1zZy0+aG9zdHRpbWUuc3RhdHVzID0gMDsKLQkJbXNnLT5ob3N0dGltZS5sZW4gPSA0OwotCQltc2ctPmhvc3R0aW1lLmRhdGEgPSBqaWZmaWVzOwotCi0JCW1zZy0+bWFjdGltZS5kaWQgPSBESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX21hY3RpbWU7Ci0JCW1zZy0+bWFjdGltZS5zdGF0dXMgPSAwOwotCQltc2ctPm1hY3RpbWUubGVuID0gNDsKLQkJbXNnLT5tYWN0aW1lLmRhdGEgPSByeGRlc2MtPnRpbWUgKiAxMDAwOwotCi0JCW1zZy0+Y2hhbm5lbC5kaWQgPSBESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX2NoYW5uZWw7Ci0JCW1zZy0+Y2hhbm5lbC5zdGF0dXMgPSAwOwotCQltc2ctPmNoYW5uZWwubGVuID0gNDsKLQkJbXNnLT5jaGFubmVsLmRhdGEgPSBody0+c25pZmZfY2hhbm5lbDsKLQotCQltc2ctPnJzc2kuZGlkID0gRElEbXNnX2xueGluZF93bGFuc25pZmZybV9yc3NpOwotCQltc2ctPnJzc2kuc3RhdHVzID0gUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19ub192YWx1ZTsKLQkJbXNnLT5yc3NpLmxlbiA9IDQ7Ci0JCW1zZy0+cnNzaS5kYXRhID0gMDsKLQotCQltc2ctPnNxLmRpZCA9IERJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm1fc3E7Ci0JCW1zZy0+c3Euc3RhdHVzID0gUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19ub192YWx1ZTsKLQkJbXNnLT5zcS5sZW4gPSA0OwotCQltc2ctPnNxLmRhdGEgPSAwOwotCi0JCW1zZy0+c2lnbmFsLmRpZCA9IERJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm1fc2lnbmFsOwotCQltc2ctPnNpZ25hbC5zdGF0dXMgPSAwOwotCQltc2ctPnNpZ25hbC5sZW4gPSA0OwotCQltc2ctPnNpZ25hbC5kYXRhID0gcnhkZXNjLT5zaWduYWw7Ci0KLQkJbXNnLT5ub2lzZS5kaWQgPSBESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX25vaXNlOwotCQltc2ctPm5vaXNlLnN0YXR1cyA9IDA7Ci0JCW1zZy0+bm9pc2UubGVuID0gNDsKLQkJbXNnLT5ub2lzZS5kYXRhID0gcnhkZXNjLT5zaWxlbmNlOwotCi0JCW1zZy0+cmF0ZS5kaWQgPSBESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX3JhdGU7Ci0JCW1zZy0+cmF0ZS5zdGF0dXMgPSAwOwotCQltc2ctPnJhdGUubGVuID0gNDsKLQkJbXNnLT5yYXRlLmRhdGEgPSByeGRlc2MtPnJhdGUgLyA1OyAvKiBzZXQgdG8gODAyLjExIHVuaXRzICovCi0KLQkJbXNnLT5pc3R4LmRpZCA9IERJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm1faXN0eDsKLQkJbXNnLT5pc3R4LnN0YXR1cyA9IDA7Ci0JCW1zZy0+aXN0eC5sZW4gPSA0OwotCQltc2ctPmlzdHguZGF0YSA9IFA4MDIxMUVOVU1fdHJ1dGhfZmFsc2U7Ci0KLQkJbXNnLT5mcm1sZW4uZGlkID0gRElEbXNnX2xueGluZF93bGFuc25pZmZybV9mcm1sZW47Ci0JCW1zZy0+ZnJtbGVuLnN0YXR1cyA9IDA7Ci0JCW1zZy0+ZnJtbGVuLmxlbiA9IDQ7Ci0JCW1zZy0+ZnJtbGVuLmRhdGEgPSBoZHJsZW4gKyBkYXRhbGVuICsgV0xBTl9DUkNfTEVOOwotCX0gZWxzZSBpZiAoKHdsYW5kZXYtPm5ldGRldi0+dHlwZSA9PSBBUlBIUkRfSUVFRTgwMjExX1BSSVNNKSAmJgotCQkgICAoaHctPnNuaWZmaGRyICE9IDApKSB7Ci0JCXA4MDIxMV9jYXBoZHJfdAkJKmNhcGhkcjsKLQkJLyogVGhlIE5FVyBoZWFkZXIgZm9ybWF0ISAqLwotCQlkYXRhcCA9IHNrYl9wdXQoc2tiLCBzaXplb2YocDgwMjExX2NhcGhkcl90KSk7Ci0JCWNhcGhkciA9IChwODAyMTFfY2FwaGRyX3QqKSBkYXRhcDsKLQotCQljYXBoZHItPnZlcnNpb24gPQlodG9ubChQODAyMTFDQVBUVVJFX1ZFUlNJT04pOwotCQljYXBoZHItPmxlbmd0aCA9CWh0b25sKHNpemVvZihwODAyMTFfY2FwaGRyX3QpKTsKLQkJY2FwaGRyLT5tYWN0aW1lID0JX19jcHVfdG9fYmU2NChyeGRlc2MtPnRpbWUpOwotCQljYXBoZHItPmhvc3R0aW1lID0JX19jcHVfdG9fYmU2NChqaWZmaWVzKTsKLQkJY2FwaGRyLT5waHl0eXBlID0JaHRvbmwoNCk7IC8qIGRzc19kb3QxMV9iICovCi0JCWNhcGhkci0+Y2hhbm5lbCA9CWh0b25sKGh3LT5zbmlmZl9jaGFubmVsKTsKLQkJY2FwaGRyLT5kYXRhcmF0ZSA9CWh0b25sKHJ4ZGVzYy0+cmF0ZSk7Ci0JCWNhcGhkci0+YW50ZW5uYSA9CWh0b25sKDApOyAvKiB1bmtub3duICovCi0JCWNhcGhkci0+cHJpb3JpdHkgPQlodG9ubCgwKTsgLyogdW5rbm93biAqLwotCQljYXBoZHItPnNzaV90eXBlID0JaHRvbmwoMyk7IC8qIHJzc2lfcmF3ICovCi0JCWNhcGhkci0+c3NpX3NpZ25hbCA9CWh0b25sKHJ4ZGVzYy0+c2lnbmFsKTsKLQkJY2FwaGRyLT5zc2lfbm9pc2UgPQlodG9ubChyeGRlc2MtPnNpbGVuY2UpOwotCQljYXBoZHItPnByZWFtYmxlID0JaHRvbmwoMCk7IC8qIHVua25vd24gKi8KLQkJY2FwaGRyLT5lbmNvZGluZyA9CWh0b25sKDEpOyAvKiBjY2sgKi8KLQl9Ci0JLyogQ29weSB0aGUgODAyLjExIGhlYWRlciB0byB0aGUgc2tiIChjdGwgZnJhbWVzIG1heSBiZSBsZXNzIHRoYW4gYSBmdWxsIGhlYWRlcikgKi8KLQlkYXRhcCA9IHNrYl9wdXQoc2tiLCBoZHJsZW4pOwotCW1lbWNweSggZGF0YXAsICYocnhkZXNjLT5mcmFtZV9jb250cm9sKSwgaGRybGVuKTsKLQotCS8qIElmIGFueSwgY29weSB0aGUgZGF0YSBmcm9tIHRoZSBjYXJkIHRvIHRoZSBza2IgKi8KLQlpZiAoIGRhdGFsZW4gPiAwICkKLQl7Ci0JCS8qIFRydW5jYXRlIHRoZSBwYWNrZXQgaWYgdGhlIHVzZXIgd2FudHMgdXMgdG8gKi8KLQkJVUlOVAlkYXRhcmVhZCA9IGRhdGFsZW47Ci0JCWlmKGh3LT5zbmlmZl90cnVuY2F0ZSA+IDAgJiYgZGF0YXJlYWQgPiBody0+c25pZmZfdHJ1bmNhdGUpIHsKLQkJCWRhdGFyZWFkID0gaHctPnNuaWZmX3RydW5jYXRlOwotCQkJdHJ1bmNhdGVkID0gMTsKLQkJfQotCi0JCWRhdGFwID0gc2tiX3B1dChza2IsIGRhdGFyZWFkKTsKLQkJaGZhMzg0eF9jb3B5X2Zyb21fYmFwKGh3LAotCQkJSEZBMzg0eF9CQVBfSU5ULCByeGZpZCwgSEZBMzg0eF9SWF9EQVRBX09GRiwKLQkJCWRhdGFwLCBkYXRhcmVhZCk7Ci0KLQkJLyogY2hlY2sgZm9yIHVuZW5jcnlwdGVkIHN0dWZmIGlmIFdFUCBiaXQgc2V0LiAqLwotCQlpZiAoKihkYXRhcCAtIGhkcmxlbiArIDEpICYgMHg0MCkgLy8gd2VwIHNldAotCQkgIGlmICgoKihkYXRhcCkgPT0gMHhhYSkgJiYgKCooZGF0YXArMSkgPT0gMHhhYSkpCi0JCSAgICAqKGRhdGFwIC0gaGRybGVuICsgMSkgJj0gMHhiZjsgLy8gY2xlYXIgd2VwOyBpdCdzIHRoZSA4MDIuMiBoZWFkZXIhCi0JfQotCi0JaWYgKCF0cnVuY2F0ZWQgJiYgaHctPnNuaWZmX2ZjcykgewotCQkvKiBTZXQgdGhlIEZDUyAqLwotCQlkYXRhcCA9IHNrYl9wdXQoc2tiLCBXTEFOX0NSQ19MRU4pOwotCQltZW1zZXQoIGRhdGFwLCAweGZmLCBXTEFOX0NSQ19MRU4pOwotCX0KLQotCS8qIHBhc3MgaXQgYmFjayB1cCAqLwotCXByaXNtMnN0YV9ldl9yeCh3bGFuZGV2LCBza2IpOwotCi0JREJGRVhJVDsKLQlyZXR1cm47Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBoZmEzODR4X2ludF9hbGxvYwotKgotKiBIYW5kbGVzIHRoZSBBbGxvYyBldmVudC4KLSoKLSogQXJndW1lbnRzOgotKgl3bGFuZGV2CQl3bGFuIGRldmljZSBzdHJ1Y3R1cmUKLSoKLSogUmV0dXJuczoKLSoJbm90aGluZwotKgotKiBTaWRlIGVmZmVjdHM6Ci0qCi0qIENhbGwgY29udGV4dDoKLSoJaW50ZXJydXB0Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXN0YXRpYyB2b2lkIGhmYTM4NHhfaW50X2FsbG9jKHdsYW5kZXZpY2VfdCAqd2xhbmRldikKLXsKLQloZmEzODR4X3QJCSpodyA9IHdsYW5kZXYtPnByaXY7Ci0JVUlOVDE2CQkJZmlkOwotCUlOVDE2CQkJcmVzdWx0OwotCi0JREJGRU5URVI7Ci0KLQkvKiBIYW5kbGUgdGhlIHJlY2xhaW1lZCBGSUQgKi8KLQkvKiAgIGNvbGxlY3QgdGhlIEZJRCBhbmQgcHVzaCBpdCBvbnRvIHRoZSBzdGFjayAqLwotCWZpZCA9IGhmYTM4NHhfZ2V0cmVnKGh3LCBIRkEzODR4X0FMTE9DRklEKTsKLQotCWlmICggZmlkICE9IGh3LT5pbmZvZmlkICkgeyAvKiBJdCdzIGEgdHJhbnNtaXQgZmlkICovCi0JCVdMQU5fTE9HX0RFQlVHKDUsICJpbnRfYWxsb2MoJSN4KVxuIiwgZmlkKTsKLQkJcmVzdWx0ID0gdHhmaWRfcXVldWVfYWRkKGh3LCBmaWQpOwotCQlpZiAocmVzdWx0ICE9IC0xKSB7Ci0JCQlwcmlzbTJzdGFfZXZfYWxsb2Mod2xhbmRldik7Ci0JCQlXTEFOX0xPR19ERUJVRyg1LCAicV9hZGQuXG4iKTsKLQkJfSBlbHNlIHsKLQkJCVdMQU5fTE9HX0RFQlVHKDUsICJxX2Z1bGwuXG4iKTsKLQkJfQotCX0gZWxzZSB7Ci0JCS8qIHVubG9jayB0aGUgaW5mbyBmaWQgKi8KLQkJdXAoJmh3LT5pbmZvZmlkX3NlbSk7Ci0JfQotCi0JREJGRVhJVDsKLQlyZXR1cm47Ci19Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIGhmYTM4NHhfZHJ2cl9oYW5kb3ZlcgotKgotKiBTZW5kcyBhIGhhbmRvdmVyIG5vdGlmaWNhdGlvbiB0byB0aGUgTUFDLgotKgotKiBBcmd1bWVudHM6Ci0qCWh3CQlkZXZpY2Ugc3RydWN0dXJlCi0qCWFkZHIJCWFkZHJlc3Mgb2Ygc3RhdGlvbiB0aGF0J3MgbGVmdAotKgotKiBSZXR1cm5zOgotKgl6ZXJvCQlzdWNjZXNzLgotKgktRVJFU1RBUlRTWVMJcmVjZWl2ZWQgc2lnbmFsIHdoaWxlIHdhaXRpbmcgZm9yIHNlbWFwaG9yZS4KLSoJLUVJTwkJZmFpbGVkIHRvIHdyaXRlIHRvIGJhcCwgb3IgZmFpbGVkIGluIGNtZC4KLSoKLSogU2lkZSBlZmZlY3RzOgotKgotKiBDYWxsIGNvbnRleHQ6Ci0qCXByb2Nlc3MgdGhyZWFkLCBOT1RFOiB0aGlzIGNhbGwgbWF5IGJsb2NrIG9uIGEgc2VtYXBob3JlIQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgaGZhMzg0eF9kcnZyX2hhbmRvdmVyKCBoZmEzODR4X3QgKmh3LCBVSU5UOCAqYWRkcikKLXsKLQlpbnQJCQlyZXN1bHQgPSAwOwotICAgICAgICBoZmEzODR4X0hhbmRvdmVyQWRkcl90ICByZWM7Ci0gICAgICAgIFVJTlQgICAgICAgICAgICAgICAgICAgIGxlbjsKLSAgICAgICAgREJGRU5URVI7Ci0KLQkvKiBBY3F1aXJlIHRoZSBpbmZvZmlkICovCi0JaWYgKCBkb3duX2ludGVycnVwdGlibGUoJmh3LT5pbmZvZmlkX3NlbSkgKSB7Ci0JCXJlc3VsdCA9IC1FUkVTVEFSVFNZUzsKLQkJZ290byBmYWlsZWQ7Ci0JfQotCi0gICAgICAgIC8qIFNldCB1cCB0aGUgcmVjb3JkICovCi0gICAgICAgIGxlbiA9IHNpemVvZihoZmEzODR4X0hhbmRvdmVyQWRkcl90KTsKLSAgICAgICAgcmVjLmZyYW1lbGVuID0gaG9zdDJoZmEzODR4XzE2KGxlbi8yIC0gMSk7Ci0gICAgICAgIHJlYy5pbmZvdHlwZSA9IGhvc3QyaGZhMzg0eF8xNihIRkEzODR4X0lUX0hBTkRPVkVSQUREUik7Ci0gICAgICAgIG1lbWNweShyZWMuaGFuZG92ZXJfYWRkciwgYWRkciwgc2l6ZW9mKHJlYy5oYW5kb3Zlcl9hZGRyKSk7Ci0KLSAgICAgICAgLyogSXNzdWUgdGhlIGNvbW1hbmQgKi8KLSAgICAgICAgcmVzdWx0ID0gaGZhMzg0eF9jbWRfbm90aWZ5KGh3LCAxLCBody0+aW5mb2ZpZCwgJnJlYywgbGVuKTsKLQotICAgICAgICBpZiAoIHJlc3VsdCAhPSAwICkgewotICAgICAgICAgICAgICAgIFdMQU5fTE9HX0RFQlVHKDEsImNtZF9ub3RpZnkoJTA0eCkgZmFpbGVkLCByZXN1bHQ9JWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgaHctPmluZm9maWQsIHJlc3VsdCk7Ci0JCXJlc3VsdCA9IC1FSU87Ci0gICAgICAgICAgICAgICAgZ290byBmYWlsZWQ7Ci0gICAgICAgIH0KLQotZmFpbGVkOgotCURCRkVYSVQ7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotdm9pZCBoZmEzODR4X3R4X3RpbWVvdXQod2xhbmRldmljZV90ICp3bGFuZGV2KQotewotCURCRkVOVEVSOwotCi0JV0xBTl9MT0dfV0FSTklORygiSW1wbGVtZW50IG1lLlxuIik7Ci0KLQlEQkZFWElUOwotfQotCi0vKiBIYW5kbGVzIGFsbCAicngiIEJBUCBvcGVyYXRpb25zICovCi1zdGF0aWMgdm9pZCAgICAgaGZhMzg0eF9iYXBfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpCi17Ci0JaGZhMzg0eF90ICpodyA9IChoZmEzODR4X3QgKikgZGF0YTsKLQl3bGFuZGV2aWNlX3QgKndsYW5kZXYgPSBody0+d2xhbmRldjsKLQlpbnQgY291bnRlciA9IHByaXNtMl9pcnFfZXZyZWFkX21heDsKLQlpbnQJCQlyZWc7Ci0KLQlEQkZFTlRFUjsKLQotCXdoaWxlIChjb3VudGVyLS0gPiAwKSB7Ci0JCS8qIEdldCBpbnRlcnJ1cHQgcmVnaXN0ZXIgKi8KLQkJcmVnID0gaGZhMzg0eF9nZXRyZWcoaHcsIEhGQTM4NHhfRVZTVEFUKTsKLQotCQlpZiAoKHJlZyA9PSAweGZmZmYpIHx8Ci0JCSAgICAhKHJlZyAmIEhGQTM4NHhfSU5UX0JBUF9PUCkpIHsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJaWYgKCBIRkEzODR4X0VWU1RBVF9JU0lORk8ocmVnKSApewotCQkJaGZhMzg0eF9pbnRfaW5mbyh3bGFuZGV2KTsKLQkJCWhmYTM4NHhfc2V0cmVnKGh3LCBIRkEzODR4X0VWQUNLX0lORk9fU0VUKDEpLAotCQkJCUhGQTM4NHhfRVZBQ0spOwotCQl9Ci0JCWlmICggSEZBMzg0eF9FVlNUQVRfSVNUWEVYQyhyZWcpICl7Ci0JCQloZmEzODR4X2ludF90eGV4Yyh3bGFuZGV2KTsKLQkJCWhmYTM4NHhfc2V0cmVnKGh3LCBIRkEzODR4X0VWQUNLX1RYRVhDX1NFVCgxKSwKLQkJCQlIRkEzODR4X0VWQUNLKTsKLQkJfQotCQlpZiAoIEhGQTM4NHhfRVZTVEFUX0lTVFgocmVnKSApewotCQkJaGZhMzg0eF9pbnRfdHgod2xhbmRldik7Ci0JCQloZmEzODR4X3NldHJlZyhodywgSEZBMzg0eF9FVkFDS19UWF9TRVQoMSksCi0JCQkJSEZBMzg0eF9FVkFDSyk7Ci0JCX0KLQkJaWYgKCBIRkEzODR4X0VWU1RBVF9JU1JYKHJlZykgKXsKLQkJCWhmYTM4NHhfaW50X3J4KHdsYW5kZXYpOwotCQkJaGZhMzg0eF9zZXRyZWcoaHcsIEhGQTM4NHhfRVZBQ0tfUlhfU0VUKDEpLAotCQkJCUhGQTM4NHhfRVZBQ0spOwotCQl9Ci0JfQotCi0JLyogcmUtZW5hYmxlIGludGVycnVwdHMgKi8KLQloZmEzODR4X2V2ZW50c19hbGwoaHcpOwotCi0JREJGRVhJVDsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL2hmYTM4NHguaCBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL2hmYTM4NHguaAppbmRleCAwZGZiOGNlLi45Yjc0NjY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9oZmEzODR4LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvaGZhMzg0eC5oCkBAIC02MywxOCArNjMsMTggQEAKIAogLyotLS0tLS0gQ29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qLS0tIE1pbnMgJiBNYXhzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNkZWZpbmUJCUhGQTM4NHhfQ01EX0FMTE9DX0xFTl9NSU4JKChVSU5UMTYpNCkKLSNkZWZpbmUJCUhGQTM4NHhfQ01EX0FMTE9DX0xFTl9NQVgJKChVSU5UMTYpMjQwMCkKLSNkZWZpbmUJCUhGQTM4NHhfQkFQX0RBVEFMRU5fTUFYCQkoKFVJTlQxNik0MDk2KQotI2RlZmluZQkJSEZBMzg0eF9CQVBfT0ZGU0VUX01BWAkJKChVSU5UMTYpNDA5NikKLSNkZWZpbmUJCUhGQTM4NHhfUE9SVElEX01BWAkJKChVSU5UMTYpNykKLSNkZWZpbmUJCUhGQTM4NHhfTlVNUE9SVFNfTUFYCQkoKFVJTlQxNikoSEZBMzg0eF9QT1JUSURfTUFYKzEpKQotI2RlZmluZQkJSEZBMzg0eF9QRFJfTEVOX01BWAkJKChVSU5UMTYpNTEyKQkvKiBpbiBieXRlcywgZnJvbSBFSyAqLwotI2RlZmluZQkJSEZBMzg0eF9QREFfUkVDU19NQVgJCSgoVUlOVDE2KTIwMCkJLyogYSBndWVzcyAqLwotI2RlZmluZQkJSEZBMzg0eF9QREFfTEVOX01BWAkJKChVSU5UMTYpMTAyNCkJLyogaW4gYnl0ZXMsIGZyb20gRUsgKi8KLSNkZWZpbmUJCUhGQTM4NHhfU0NBTlJFU1VMVF9NQVgJCSgoVUlOVDE2KTMxKQotI2RlZmluZQkJSEZBMzg0eF9IU0NBTlJFU1VMVF9NQVgJCSgoVUlOVDE2KTMxKQotI2RlZmluZQkJSEZBMzg0eF9DSElORk9SRVNVTFRfTUFYCSgoVUlOVDE2KTE2KQorI2RlZmluZQkJSEZBMzg0eF9DTURfQUxMT0NfTEVOX01JTgkoKHUxNik0KQorI2RlZmluZQkJSEZBMzg0eF9DTURfQUxMT0NfTEVOX01BWAkoKHUxNikyNDAwKQorI2RlZmluZQkJSEZBMzg0eF9CQVBfREFUQUxFTl9NQVgJCSgodTE2KTQwOTYpCisjZGVmaW5lCQlIRkEzODR4X0JBUF9PRkZTRVRfTUFYCQkoKHUxNik0MDk2KQorI2RlZmluZQkJSEZBMzg0eF9QT1JUSURfTUFYCQkoKHUxNik3KQorI2RlZmluZQkJSEZBMzg0eF9OVU1QT1JUU19NQVgJCSgodTE2KShIRkEzODR4X1BPUlRJRF9NQVgrMSkpCisjZGVmaW5lCQlIRkEzODR4X1BEUl9MRU5fTUFYCQkoKHUxNik1MTIpCS8qIGluIGJ5dGVzLCBmcm9tIEVLICovCisjZGVmaW5lCQlIRkEzODR4X1BEQV9SRUNTX01BWAkJKCh1MTYpMjAwKQkvKiBhIGd1ZXNzICovCisjZGVmaW5lCQlIRkEzODR4X1BEQV9MRU5fTUFYCQkoKHUxNikxMDI0KQkvKiBpbiBieXRlcywgZnJvbSBFSyAqLworI2RlZmluZQkJSEZBMzg0eF9TQ0FOUkVTVUxUX01BWAkJKCh1MTYpMzEpCisjZGVmaW5lCQlIRkEzODR4X0hTQ0FOUkVTVUxUX01BWAkJKCh1MTYpMzEpCisjZGVmaW5lCQlIRkEzODR4X0NISU5GT1JFU1VMVF9NQVgJKCh1MTYpMTYpCiAjZGVmaW5lCQlIRkEzODR4X0RSVlJfRklEU1RBQ0tMRU5fTUFYCSgxMCkKICNkZWZpbmUJCUhGQTM4NHhfRFJWUl9UWEJVRl9NQVgJCShzaXplb2YoaGZhMzg0eF90eF9mcmFtZV90KSArIFwKIAkJCQkJCVdMQU5fREFUQV9NQVhMRU4gLSBcCkBAIC04OCw0MiArODgsNDIgQEAKICNkZWZpbmUJCUhGQTM4NHhfVVNCX1JXTUVNX01BWExFTgkyMDQ4CiAKIC8qLS0tIFN1cHBvcnQgQ29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNkZWZpbmUJCUhGQTM4NHhfQkFQX1BST0MJCQkoKFVJTlQxNikwKQotI2RlZmluZQkJSEZBMzg0eF9CQVBfSU5UCQkJCSgoVUlOVDE2KTEpCi0jZGVmaW5lCQlIRkEzODR4X1BPUlRUWVBFX0lCU1MJCQkoKFVJTlQxNikwKQotI2RlZmluZQkJSEZBMzg0eF9QT1JUVFlQRV9CU1MJCQkoKFVJTlQxNikxKQotI2RlZmluZQkJSEZBMzg0eF9QT1JUVFlQRV9XRFMJCQkoKFVJTlQxNikyKQotI2RlZmluZQkJSEZBMzg0eF9QT1JUVFlQRV9QU1VFRE9JQlNTCQkoKFVJTlQxNikzKQotI2RlZmluZQkJSEZBMzg0eF9QT1JUVFlQRV9IT1NUQVAgICAgCQkoKFVJTlQxNik2KQotI2RlZmluZQkJSEZBMzg0eF9XRVBGTEFHU19QUklWSU5WT0tFRAkJKChVSU5UMTYpQklUMCkKLSNkZWZpbmUJCUhGQTM4NHhfV0VQRkxBR1NfRVhDTFVERQkJKChVSU5UMTYpQklUMSkKLSNkZWZpbmUJCUhGQTM4NHhfV0VQRkxBR1NfRElTQUJMRV9UWENSWVBUCSgoVUlOVDE2KUJJVDQpCi0jZGVmaW5lCQlIRkEzODR4X1dFUEZMQUdTX0RJU0FCTEVfUlhDUllQVAkoKFVJTlQxNilCSVQ3KQotI2RlZmluZQkJSEZBMzg0eF9XRVBGTEFHU19ESVNBTExPV19NSVhFRCAJKChVSU5UMTYpQklUMTEpCi0jZGVmaW5lCQlIRkEzODR4X1dFUEZMQUdTX0lWX0lOVEVSVkFMMQkJKChVSU5UMTYpMCkKLSNkZWZpbmUJCUhGQTM4NHhfV0VQRkxBR1NfSVZfSU5URVJWQUwxMAkJKChVSU5UMTYpQklUNSkKLSNkZWZpbmUJCUhGQTM4NHhfV0VQRkxBR1NfSVZfSU5URVJWQUw1MAkJKChVSU5UMTYpQklUNikKLSNkZWZpbmUJCUhGQTM4NHhfV0VQRkxBR1NfSVZfSU5URVJWQUwxMDAJCSgoVUlOVDE2KShCSVQ1IHwgQklUNikpCi0jZGVmaW5lCQlIRkEzODR4X1dFUEZMQUdTX0ZJUk1XQVJFX1dQQSAgCQkoKFVJTlQxNilCSVQ4KQotI2RlZmluZQkJSEZBMzg0eF9XRVBGTEFHU19IT1NUX01JQyAgICAgIAkJKChVSU5UMTYpQklUOSkKLSNkZWZpbmUgCUhGQTM4NHhfUk9BTU1PREVfRldTQ0FOX0ZXUk9BTQkJKChVSU5UMTYpMSkKLSNkZWZpbmUgCUhGQTM4NHhfUk9BTU1PREVfRldTQ0FOX0hPU1RST0FNCSgoVUlOVDE2KTIpCi0jZGVmaW5lIAlIRkEzODR4X1JPQU1NT0RFX0hPU1RTQ0FOX0hPU1RST0FNCSgoVUlOVDE2KTMpCi0jZGVmaW5lIAlIRkEzODR4X1BPUlRTVEFUVVNfRElTQUJMRUQJCSgoVUlOVDE2KTEpCi0jZGVmaW5lIAlIRkEzODR4X1BPUlRTVEFUVVNfSU5JVFNSQ0gJCSgoVUlOVDE2KTIpCi0jZGVmaW5lIAlIRkEzODR4X1BPUlRTVEFUVVNfQ09OTl9JQlNTCQkoKFVJTlQxNikzKQotI2RlZmluZSAJSEZBMzg0eF9QT1JUU1RBVFVTX0NPTk5fRVNTCQkoKFVJTlQxNik0KQotI2RlZmluZSAJSEZBMzg0eF9QT1JUU1RBVFVTX09PUl9FU1MJCSgoVUlOVDE2KTUpCi0jZGVmaW5lIAlIRkEzODR4X1BPUlRTVEFUVVNfQ09OTl9XRFMJCSgoVUlOVDE2KTYpCi0jZGVmaW5lIAlIRkEzODR4X1BPUlRTVEFUVVNfSE9TVEFQCQkoKFVJTlQxNik4KQotI2RlZmluZQkJSEZBMzg0eF9SQVRFQklUXzEJCQkoKFVJTlQxNikxKQotI2RlZmluZQkJSEZBMzg0eF9SQVRFQklUXzIJCQkoKFVJTlQxNikyKQotI2RlZmluZQkJSEZBMzg0eF9SQVRFQklUXzVkb3Q1CQkJKChVSU5UMTYpNCkKLSNkZWZpbmUJCUhGQTM4NHhfUkFURUJJVF8xMQkJCSgoVUlOVDE2KTgpCisjZGVmaW5lCQlIRkEzODR4X0JBUF9QUk9DCQkJKCh1MTYpMCkKKyNkZWZpbmUJCUhGQTM4NHhfQkFQX2ludAkJCQkoKHUxNikxKQorI2RlZmluZQkJSEZBMzg0eF9QT1JUVFlQRV9JQlNTCQkJKCh1MTYpMCkKKyNkZWZpbmUJCUhGQTM4NHhfUE9SVFRZUEVfQlNTCQkJKCh1MTYpMSkKKyNkZWZpbmUJCUhGQTM4NHhfUE9SVFRZUEVfV0RTCQkJKCh1MTYpMikKKyNkZWZpbmUJCUhGQTM4NHhfUE9SVFRZUEVfUFNVRURPSUJTUwkJKCh1MTYpMykKKyNkZWZpbmUJCUhGQTM4NHhfUE9SVFRZUEVfSE9TVEFQICAgIAkJKCh1MTYpNikKKyNkZWZpbmUJCUhGQTM4NHhfV0VQRkxBR1NfUFJJVklOVk9LRUQJCSgodTE2KUJJVDApCisjZGVmaW5lCQlIRkEzODR4X1dFUEZMQUdTX0VYQ0xVREUJCSgodTE2KUJJVDEpCisjZGVmaW5lCQlIRkEzODR4X1dFUEZMQUdTX0RJU0FCTEVfVFhDUllQVAkoKHUxNilCSVQ0KQorI2RlZmluZQkJSEZBMzg0eF9XRVBGTEFHU19ESVNBQkxFX1JYQ1JZUFQJKCh1MTYpQklUNykKKyNkZWZpbmUJCUhGQTM4NHhfV0VQRkxBR1NfRElTQUxMT1dfTUlYRUQgCSgodTE2KUJJVDExKQorI2RlZmluZQkJSEZBMzg0eF9XRVBGTEFHU19JVl9pbnRFUlZBTDEJCSgodTE2KTApCisjZGVmaW5lCQlIRkEzODR4X1dFUEZMQUdTX0lWX2ludEVSVkFMMTAJCSgodTE2KUJJVDUpCisjZGVmaW5lCQlIRkEzODR4X1dFUEZMQUdTX0lWX2ludEVSVkFMNTAJCSgodTE2KUJJVDYpCisjZGVmaW5lCQlIRkEzODR4X1dFUEZMQUdTX0lWX2ludEVSVkFMMTAwCQkoKHUxNikoQklUNSB8IEJJVDYpKQorI2RlZmluZQkJSEZBMzg0eF9XRVBGTEFHU19GSVJNV0FSRV9XUEEgIAkJKCh1MTYpQklUOCkKKyNkZWZpbmUJCUhGQTM4NHhfV0VQRkxBR1NfSE9TVF9NSUMgICAgICAJCSgodTE2KUJJVDkpCisjZGVmaW5lIAlIRkEzODR4X1JPQU1NT0RFX0ZXU0NBTl9GV1JPQU0JCSgodTE2KTEpCisjZGVmaW5lIAlIRkEzODR4X1JPQU1NT0RFX0ZXU0NBTl9IT1NUUk9BTQkoKHUxNikyKQorI2RlZmluZSAJSEZBMzg0eF9ST0FNTU9ERV9IT1NUU0NBTl9IT1NUUk9BTQkoKHUxNikzKQorI2RlZmluZSAJSEZBMzg0eF9QT1JUU1RBVFVTX0RJU0FCTEVECQkoKHUxNikxKQorI2RlZmluZSAJSEZBMzg0eF9QT1JUU1RBVFVTX0lOSVRTUkNICQkoKHUxNikyKQorI2RlZmluZSAJSEZBMzg0eF9QT1JUU1RBVFVTX0NPTk5fSUJTUwkJKCh1MTYpMykKKyNkZWZpbmUgCUhGQTM4NHhfUE9SVFNUQVRVU19DT05OX0VTUwkJKCh1MTYpNCkKKyNkZWZpbmUgCUhGQTM4NHhfUE9SVFNUQVRVU19PT1JfRVNTCQkoKHUxNik1KQorI2RlZmluZSAJSEZBMzg0eF9QT1JUU1RBVFVTX0NPTk5fV0RTCQkoKHUxNik2KQorI2RlZmluZSAJSEZBMzg0eF9QT1JUU1RBVFVTX0hPU1RBUAkJKCh1MTYpOCkKKyNkZWZpbmUJCUhGQTM4NHhfUkFURUJJVF8xCQkJKCh1MTYpMSkKKyNkZWZpbmUJCUhGQTM4NHhfUkFURUJJVF8yCQkJKCh1MTYpMikKKyNkZWZpbmUJCUhGQTM4NHhfUkFURUJJVF81ZG90NQkJCSgodTE2KTQpCisjZGVmaW5lCQlIRkEzODR4X1JBVEVCSVRfMTEJCQkoKHUxNik4KQogCiAvKi0tLSBKdXN0IHNvbWUgc3ltYm9saWMgbmFtZXMgZm9yIGxlZ2liaWxpdHkgLS0tLS0tLSovCi0jZGVmaW5lCQlIRkEzODR4X1RYQ01EX05PUkVDTAkJKChVSU5UMTYpMCkKLSNkZWZpbmUJCUhGQTM4NHhfVFhDTURfUkVDTAkJKChVSU5UMTYpMSkKKyNkZWZpbmUJCUhGQTM4NHhfVFhDTURfTk9SRUNMCQkoKHUxNikwKQorI2RlZmluZQkJSEZBMzg0eF9UWENNRF9SRUNMCQkoKHUxNikxKQogCiAvKi0tLSBNQUMgSW50ZXJuYWwgbWVtb3J5IGNvbnN0YW50cyBhbmQgbWFjcm9zIC0tLS0tLSovCiAvKiBtYXNrcyBhbmQgbWFjcm9zIHVzZWQgdG8gbWFuaXB1bGF0ZSBNQUMgaW50ZXJuYWwgbWVtb3J5IGFkZHJlc3Nlcy4gKi8KQEAgLTE0MCw3ICsxNDAsNyBAQAogICovCiAKIC8qIEhhbmR5IGNvbnN0YW50ICovCi0jZGVmaW5lCQlIRkEzODR4X0FERFJfQVVYX09GRl9NQVgJKChVSU5UMTYpMHgwMDdmKQorI2RlZmluZQkJSEZBMzg0eF9BRERSX0FVWF9PRkZfTUFYCSgodTE2KTB4MDA3ZikKIAogLyogTWFzayBiaXRzIGZvciBkaXNjYXJkaW5nIHVud2FudGVkIHBpZWNlcyBpbiBhIGZsYXQgYWRkcmVzcyAqLwogI2RlZmluZQkJSEZBMzg0eF9BRERSX0ZMQVRfQVVYX1BBR0VfTUFTSwkoMHgwMDdmZmY4MCkKQEAgLTE1OCwyNSArMTU4LDI1IEBACiAKIC8qIE1ha2UgYSAzMi1iaXQgZmxhdCBhZGRyZXNzIGZyb20gQVVYIGZvcm1hdCAxNi1iaXQgcGFnZSBhbmQgb2Zmc2V0ICovCiAjZGVmaW5lCQlIRkEzODR4X0FERFJfQVVYX01LRkxBVChwLG8pCVwKLQkJKCgoVUlOVDMyKSgoKFVJTlQxNikocCkpJkhGQTM4NHhfQUREUl9BVVhfUEFHRV9NQVNLKSkgPDw3KSB8IFwKLQkJKChVSU5UMzIpKCgoVUlOVDE2KShvKSkmSEZBMzg0eF9BRERSX0FVWF9PRkZfTUFTSykpCisJCSgoKHUzMikoKCh1MTYpKHApKSZIRkEzODR4X0FERFJfQVVYX1BBR0VfTUFTSykpIDw8NykgfCBcCisJCSgodTMyKSgoKHUxNikobykpJkhGQTM4NHhfQUREUl9BVVhfT0ZGX01BU0spKQogCiAvKiBNYWtlIGEgMzItYml0IGZsYXQgYWRkcmVzcyBmcm9tIENNRCBmb3JtYXQgMTYtYml0IHBhZ2UgYW5kIG9mZnNldCAqLwogI2RlZmluZQkJSEZBMzg0eF9BRERSX0NNRF9NS0ZMQVQocCxvKQlcCi0JCSgoKFVJTlQzMikoKChVSU5UMTYpKHApKSZIRkEzODR4X0FERFJfQ01EX1BBR0VfTUFTSykpIDw8MTYpIHwgXAotCQkoKFVJTlQzMikoKChVSU5UMTYpKG8pKSZIRkEzODR4X0FERFJfQ01EX09GRl9NQVNLKSkKKwkJKCgodTMyKSgoKHUxNikocCkpJkhGQTM4NHhfQUREUl9DTURfUEFHRV9NQVNLKSkgPDwxNikgfCBcCisJCSgodTMyKSgoKHUxNikobykpJkhGQTM4NHhfQUREUl9DTURfT0ZGX01BU0spKQogCiAvKiBNYWtlIEFVWCBmb3JtYXQgb2Zmc2V0IGFuZCBwYWdlIGZyb20gYSAzMi1iaXQgZmxhdCBhZGRyZXNzICovCiAjZGVmaW5lCQlIRkEzODR4X0FERFJfQVVYX01LUEFHRShmKSBcCi0JCSgoVUlOVDE2KSgoKChVSU5UMzIpKGYpKSZIRkEzODR4X0FERFJfRkxBVF9BVVhfUEFHRV9NQVNLKT4+NykpCisJCSgodTE2KSgoKCh1MzIpKGYpKSZIRkEzODR4X0FERFJfRkxBVF9BVVhfUEFHRV9NQVNLKT4+NykpCiAjZGVmaW5lCQlIRkEzODR4X0FERFJfQVVYX01LT0ZGKGYpIFwKLQkJKChVSU5UMTYpKCgoVUlOVDMyKShmKSkmSEZBMzg0eF9BRERSX0ZMQVRfQVVYX09GRl9NQVNLKSkKKwkJKCh1MTYpKCgodTMyKShmKSkmSEZBMzg0eF9BRERSX0ZMQVRfQVVYX09GRl9NQVNLKSkKIAogLyogTWFrZSBDTUQgZm9ybWF0IG9mZnNldCBhbmQgcGFnZSBmcm9tIGEgMzItYml0IGZsYXQgYWRkcmVzcyAqLwogI2RlZmluZQkJSEZBMzg0eF9BRERSX0NNRF9NS1BBR0UoZikgXAotCQkoKFVJTlQxNikoKCgoVUlOVDMyKShmKSkmSEZBMzg0eF9BRERSX0ZMQVRfQ01EX1BBR0VfTUFTSyk+PjE2KSkKKwkJKCh1MTYpKCgoKHUzMikoZikpJkhGQTM4NHhfQUREUl9GTEFUX0NNRF9QQUdFX01BU0spPj4xNikpCiAjZGVmaW5lCQlIRkEzODR4X0FERFJfQ01EX01LT0ZGKGYpIFwKLQkJKChVSU5UMTYpKCgoVUlOVDMyKShmKSkmSEZBMzg0eF9BRERSX0ZMQVRfQ01EX09GRl9NQVNLKSkKKwkJKCh1MTYpKCgodTMyKShmKSkmSEZBMzg0eF9BRERSX0ZMQVRfQ01EX09GRl9NQVNLKSkKIAogLyotLS0gQXV4IHJlZ2lzdGVyIG1hc2tzL3Rlc3RzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyogU29tZSBvZiB0aGUgdXBwZXIgYml0cyBvZiB0aGUgQVVYIG9mZnNldCByZWdpc3RlciBhcmUgdXNlZCB0byAqLwpAQCAtMTg4LDcgKzE4OCw3IEBACiAKIC8qIE1ha2UgQVVYIHJlZ2lzdGVyIG9mZnNldCBhbmQgcGFnZSB2YWx1ZXMgZnJvbSBhIGZsYXQgYWRkcmVzcyAqLwogI2RlZmluZQkJSEZBMzg0eF9BVVhfTUtPRkYoZiwgYykgXAotCShIRkEzODR4X0FERFJfQVVYX01LT0ZGKGYpIHwgKCgoVUlOVDE2KShjKSk8PDEyKSkKKwkoSEZBMzg0eF9BRERSX0FVWF9NS09GRihmKSB8ICgoKHUxNikoYykpPDwxMikpCiAjZGVmaW5lCQlIRkEzODR4X0FVWF9NS1BBR0UoZikJSEZBMzg0eF9BRERSX0FVWF9NS1BBR0UoZikKIAogCkBAIC0yMDUsNDAgKzIwNSw2IEBACiAjZGVmaW5lCQlIRkEzODR4X0RMU1RBVEVfRkxBU0hXUklURVBFTkRJTkcJNAogI2RlZmluZQkJSEZBMzg0eF9ETFNUQVRFX0dFTkVTSVMgCQk1CiAKLS8qLS0tIFJlZ2lzdGVyIEkvTyBvZmZzZXRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNpZiAoKFdMQU5fSE9TVElGID09IFdMQU5fUENNQ0lBKSB8fCAoV0xBTl9IT1NUSUYgPT0gV0xBTl9QTFgpKQotCi0jZGVmaW5lCQlIRkEzODR4X0NNRF9PRkYJCQkoMHgwMCkKLSNkZWZpbmUJCUhGQTM4NHhfUEFSQU0wX09GRgkJKDB4MDIpCi0jZGVmaW5lCQlIRkEzODR4X1BBUkFNMV9PRkYJCSgweDA0KQotI2RlZmluZQkJSEZBMzg0eF9QQVJBTTJfT0ZGCQkoMHgwNikKLSNkZWZpbmUJCUhGQTM4NHhfU1RBVFVTX09GRgkJKDB4MDgpCi0jZGVmaW5lCQlIRkEzODR4X1JFU1AwX09GRgkJKDB4MEEpCi0jZGVmaW5lCQlIRkEzODR4X1JFU1AxX09GRgkJKDB4MEMpCi0jZGVmaW5lCQlIRkEzODR4X1JFU1AyX09GRgkJKDB4MEUpCi0jZGVmaW5lCQlIRkEzODR4X0lORk9GSURfT0ZGCQkoMHgxMCkKLSNkZWZpbmUJCUhGQTM4NHhfUlhGSURfT0ZGCQkoMHgyMCkKLSNkZWZpbmUJCUhGQTM4NHhfQUxMT0NGSURfT0ZGCQkoMHgyMikKLSNkZWZpbmUJCUhGQTM4NHhfVFhDT01QTEZJRF9PRkYJCSgweDI0KQotI2RlZmluZQkJSEZBMzg0eF9TRUxFQ1QwX09GRgkJKDB4MTgpCi0jZGVmaW5lCQlIRkEzODR4X09GRlNFVDBfT0ZGCQkoMHgxQykKLSNkZWZpbmUJCUhGQTM4NHhfREFUQTBfT0ZGCQkoMHgzNikKLSNkZWZpbmUJCUhGQTM4NHhfU0VMRUNUMV9PRkYJCSgweDFBKQotI2RlZmluZQkJSEZBMzg0eF9PRkZTRVQxX09GRgkJKDB4MUUpCi0jZGVmaW5lCQlIRkEzODR4X0RBVEExX09GRgkJKDB4MzgpCi0jZGVmaW5lCQlIRkEzODR4X0VWU1RBVF9PRkYJCSgweDMwKQotI2RlZmluZQkJSEZBMzg0eF9JTlRFTl9PRkYJCSgweDMyKQotI2RlZmluZQkJSEZBMzg0eF9FVkFDS19PRkYJCSgweDM0KQotI2RlZmluZQkJSEZBMzg0eF9DT05UUk9MX09GRgkJKDB4MTQpCi0jZGVmaW5lCQlIRkEzODR4X1NXU1VQUE9SVDBfT0ZGCQkoMHgyOCkKLSNkZWZpbmUJCUhGQTM4NHhfU1dTVVBQT1JUMV9PRkYJCSgweDJBKQotI2RlZmluZQkJSEZBMzg0eF9TV1NVUFBPUlQyX09GRgkJKDB4MkMpCi0jZGVmaW5lCQlIRkEzODR4X0FVWFBBR0VfT0ZGCQkoMHgzQSkKLSNkZWZpbmUJCUhGQTM4NHhfQVVYT0ZGU0VUX09GRgkJKDB4M0MpCi0jZGVmaW5lCQlIRkEzODR4X0FVWERBVEFfT0ZGCQkoMHgzRSkKLQotI2VsaWYgKFdMQU5fSE9TVElGID09IFdMQU5fUENJIHx8IFdMQU5fSE9TVElGID09IFdMQU5fVVNCKQotCiAjZGVmaW5lCQlIRkEzODR4X0NNRF9PRkYJCQkoMHgwMCkKICNkZWZpbmUJCUhGQTM4NHhfUEFSQU0wX09GRgkJKDB4MDQpCiAjZGVmaW5lCQlIRkEzODR4X1BBUkFNMV9PRkYJCSgweDA4KQpAQCAtMjU4LDcgKzIyNCw3IEBACiAjZGVmaW5lCQlIRkEzODR4X09GRlNFVDFfT0ZGCQkoMHgzYykKICNkZWZpbmUJCUhGQTM4NHhfREFUQTFfT0ZGCQkoMHg3MCkKICNkZWZpbmUJCUhGQTM4NHhfRVZTVEFUX09GRgkJKDB4NjApCi0jZGVmaW5lCQlIRkEzODR4X0lOVEVOX09GRgkJKDB4NjQpCisjZGVmaW5lCQlIRkEzODR4X2ludEVOX09GRgkJKDB4NjQpCiAjZGVmaW5lCQlIRkEzODR4X0VWQUNLX09GRgkJKDB4NjgpCiAjZGVmaW5lCQlIRkEzODR4X0NPTlRST0xfT0ZGCQkoMHgyOCkKICNkZWZpbmUJCUhGQTM4NHhfU1dTVVBQT1JUMF9PRkYJCSgweDUwKQpAQCAtMjc5LDk0ICsyNDUsOTIgQEAKICNkZWZpbmUJCUhGQTM4NHhfUENJX00xX0xFTl9PRkYJCSgweGE4KQogI2RlZmluZQkJSEZBMzg0eF9QQ0lfTTFfQ1RMX09GRgkJKDB4YWMpCiAKLSNlbmRpZgotCiAvKi0tLSBSZWdpc3RlciBGaWVsZCBNYXNrcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jZGVmaW5lCQlIRkEzODR4X0NNRF9CVVNZCQkoKFVJTlQxNilCSVQxNSkKLSNkZWZpbmUJCUhGQTM4NHhfQ01EX0FJTkZPCQkoKFVJTlQxNikoQklUMTQgfCBCSVQxMyB8IEJJVDEyIHwgQklUMTEgfCBCSVQxMCB8IEJJVDkgfCBCSVQ4KSkKLSNkZWZpbmUJCUhGQTM4NHhfQ01EX01BQ1BPUlQJCSgoVUlOVDE2KShCSVQxMCB8IEJJVDkgfCBCSVQ4KSkKLSNkZWZpbmUJCUhGQTM4NHhfQ01EX1JFQ0wJCSgoVUlOVDE2KUJJVDgpCi0jZGVmaW5lCQlIRkEzODR4X0NNRF9XUklURQkJKChVSU5UMTYpQklUOCkKLSNkZWZpbmUJCUhGQTM4NHhfQ01EX1BST0dNT0RFCQkoKFVJTlQxNikoQklUOSB8IEJJVDgpKQotI2RlZmluZQkJSEZBMzg0eF9DTURfQ01EQ09ERQkJKChVSU5UMTYpKEJJVDUgfCBCSVQ0IHwgQklUMyB8IEJJVDIgfCBCSVQxIHwgQklUMCkpCisjZGVmaW5lCQlIRkEzODR4X0NNRF9CVVNZCQkoKHUxNilCSVQxNSkKKyNkZWZpbmUJCUhGQTM4NHhfQ01EX0FJTkZPCQkoKHUxNikoQklUMTQgfCBCSVQxMyB8IEJJVDEyIHwgQklUMTEgfCBCSVQxMCB8IEJJVDkgfCBCSVQ4KSkKKyNkZWZpbmUJCUhGQTM4NHhfQ01EX01BQ1BPUlQJCSgodTE2KShCSVQxMCB8IEJJVDkgfCBCSVQ4KSkKKyNkZWZpbmUJCUhGQTM4NHhfQ01EX1JFQ0wJCSgodTE2KUJJVDgpCisjZGVmaW5lCQlIRkEzODR4X0NNRF9XUklURQkJKCh1MTYpQklUOCkKKyNkZWZpbmUJCUhGQTM4NHhfQ01EX1BST0dNT0RFCQkoKHUxNikoQklUOSB8IEJJVDgpKQorI2RlZmluZQkJSEZBMzg0eF9DTURfQ01EQ09ERQkJKCh1MTYpKEJJVDUgfCBCSVQ0IHwgQklUMyB8IEJJVDIgfCBCSVQxIHwgQklUMCkpCiAKLSNkZWZpbmUJCUhGQTM4NHhfU1RBVFVTX1JFU1VMVAkJKChVSU5UMTYpKEJJVDE0IHwgQklUMTMgfCBCSVQxMiB8IEJJVDExIHwgQklUMTAgfCBCSVQ5IHwgQklUOCkpCi0jZGVmaW5lCQlIRkEzODR4X1NUQVRVU19DTURDT0RFCQkoKFVJTlQxNikoQklUNSB8IEJJVDQgfCBCSVQzIHwgQklUMiB8IEJJVDEgfCBCSVQwKSkKKyNkZWZpbmUJCUhGQTM4NHhfU1RBVFVTX1JFU1VMVAkJKCh1MTYpKEJJVDE0IHwgQklUMTMgfCBCSVQxMiB8IEJJVDExIHwgQklUMTAgfCBCSVQ5IHwgQklUOCkpCisjZGVmaW5lCQlIRkEzODR4X1NUQVRVU19DTURDT0RFCQkoKHUxNikoQklUNSB8IEJJVDQgfCBCSVQzIHwgQklUMiB8IEJJVDEgfCBCSVQwKSkKIAotI2RlZmluZQkJSEZBMzg0eF9PRkZTRVRfQlVTWQkJKChVSU5UMTYpQklUMTUpCi0jZGVmaW5lCQlIRkEzODR4X09GRlNFVF9FUlIJCSgoVUlOVDE2KUJJVDE0KQotI2RlZmluZQkJSEZBMzg0eF9PRkZTRVRfREFUQU9GRgkJKChVSU5UMTYpKEJJVDExIHwgQklUMTAgfCBCSVQ5IHwgQklUOCB8IEJJVDcgfCBCSVQ2IHwgQklUNSB8IEJJVDQgfCBCSVQzIHwgQklUMiB8IEJJVDEpKQorI2RlZmluZQkJSEZBMzg0eF9PRkZTRVRfQlVTWQkJKCh1MTYpQklUMTUpCisjZGVmaW5lCQlIRkEzODR4X09GRlNFVF9FUlIJCSgodTE2KUJJVDE0KQorI2RlZmluZQkJSEZBMzg0eF9PRkZTRVRfREFUQU9GRgkJKCh1MTYpKEJJVDExIHwgQklUMTAgfCBCSVQ5IHwgQklUOCB8IEJJVDcgfCBCSVQ2IHwgQklUNSB8IEJJVDQgfCBCSVQzIHwgQklUMiB8IEJJVDEpKQogCi0jZGVmaW5lCQlIRkEzODR4X0VWU1RBVF9USUNLCQkoKFVJTlQxNilCSVQxNSkKLSNkZWZpbmUJCUhGQTM4NHhfRVZTVEFUX1dURVJSCQkoKFVJTlQxNilCSVQxNCkKLSNkZWZpbmUJCUhGQTM4NHhfRVZTVEFUX0lORkRST1AJCSgoVUlOVDE2KUJJVDEzKQotI2RlZmluZQkJSEZBMzg0eF9FVlNUQVRfSU5GTwkJKChVSU5UMTYpQklUNykKLSNkZWZpbmUJCUhGQTM4NHhfRVZTVEFUX0RUSU0JCSgoVUlOVDE2KUJJVDUpCi0jZGVmaW5lCQlIRkEzODR4X0VWU1RBVF9DTUQJCSgoVUlOVDE2KUJJVDQpCi0jZGVmaW5lCQlIRkEzODR4X0VWU1RBVF9BTExPQwkJKChVSU5UMTYpQklUMykKLSNkZWZpbmUJCUhGQTM4NHhfRVZTVEFUX1RYRVhDCQkoKFVJTlQxNilCSVQyKQotI2RlZmluZQkJSEZBMzg0eF9FVlNUQVRfVFgJCSgoVUlOVDE2KUJJVDEpCi0jZGVmaW5lCQlIRkEzODR4X0VWU1RBVF9SWAkJKChVSU5UMTYpQklUMCkKKyNkZWZpbmUJCUhGQTM4NHhfRVZTVEFUX1RJQ0sJCSgodTE2KUJJVDE1KQorI2RlZmluZQkJSEZBMzg0eF9FVlNUQVRfV1RFUlIJCSgodTE2KUJJVDE0KQorI2RlZmluZQkJSEZBMzg0eF9FVlNUQVRfSU5GRFJPUAkJKCh1MTYpQklUMTMpCisjZGVmaW5lCQlIRkEzODR4X0VWU1RBVF9JTkZPCQkoKHUxNilCSVQ3KQorI2RlZmluZQkJSEZBMzg0eF9FVlNUQVRfRFRJTQkJKCh1MTYpQklUNSkKKyNkZWZpbmUJCUhGQTM4NHhfRVZTVEFUX0NNRAkJKCh1MTYpQklUNCkKKyNkZWZpbmUJCUhGQTM4NHhfRVZTVEFUX0FMTE9DCQkoKHUxNilCSVQzKQorI2RlZmluZQkJSEZBMzg0eF9FVlNUQVRfVFhFWEMJCSgodTE2KUJJVDIpCisjZGVmaW5lCQlIRkEzODR4X0VWU1RBVF9UWAkJKCh1MTYpQklUMSkKKyNkZWZpbmUJCUhGQTM4NHhfRVZTVEFUX1JYCQkoKHUxNilCSVQwKQogCi0jZGVmaW5lICAgICAgICAgSEZBMzg0eF9JTlRfQkFQX09QICAgICAgICAgICAoSEZBMzg0eF9FVlNUQVRfSU5GT3xIRkEzODR4X0VWU1RBVF9SWHxIRkEzODR4X0VWU1RBVF9UWHxIRkEzODR4X0VWU1RBVF9UWEVYQykKKyNkZWZpbmUgICAgICAgICBIRkEzODR4X2ludF9CQVBfT1AgICAgICAgICAgIChIRkEzODR4X0VWU1RBVF9JTkZPfEhGQTM4NHhfRVZTVEFUX1JYfEhGQTM4NHhfRVZTVEFUX1RYfEhGQTM4NHhfRVZTVEFUX1RYRVhDKQogCi0jZGVmaW5lICAgICAgICAgSEZBMzg0eF9JTlRfTk9STUFMICAgICAgICAgICAoSEZBMzg0eF9FVlNUQVRfSU5GT3xIRkEzODR4X0VWU1RBVF9SWHxIRkEzODR4X0VWU1RBVF9UWHxIRkEzODR4X0VWU1RBVF9UWEVYQ3xIRkEzODR4X0VWU1RBVF9JTkZEUk9QfEhGQTM4NHhfRVZTVEFUX0FMTE9DfEhGQTM4NHhfRVZTVEFUX0RUSU0pCisjZGVmaW5lICAgICAgICAgSEZBMzg0eF9pbnRfTk9STUFMICAgICAgICAgICAoSEZBMzg0eF9FVlNUQVRfSU5GT3xIRkEzODR4X0VWU1RBVF9SWHxIRkEzODR4X0VWU1RBVF9UWHxIRkEzODR4X0VWU1RBVF9UWEVYQ3xIRkEzODR4X0VWU1RBVF9JTkZEUk9QfEhGQTM4NHhfRVZTVEFUX0FMTE9DfEhGQTM4NHhfRVZTVEFUX0RUSU0pCiAKLSNkZWZpbmUJCUhGQTM4NHhfSU5URU5fVElDSwkJKChVSU5UMTYpQklUMTUpCi0jZGVmaW5lCQlIRkEzODR4X0lOVEVOX1dURVJSCQkoKFVJTlQxNilCSVQxNCkKLSNkZWZpbmUJCUhGQTM4NHhfSU5URU5fSU5GRFJPUAkJKChVSU5UMTYpQklUMTMpCi0jZGVmaW5lCQlIRkEzODR4X0lOVEVOX0lORk8JCSgoVUlOVDE2KUJJVDcpCi0jZGVmaW5lCQlIRkEzODR4X0lOVEVOX0RUSU0JCSgoVUlOVDE2KUJJVDUpCi0jZGVmaW5lCQlIRkEzODR4X0lOVEVOX0NNRAkJKChVSU5UMTYpQklUNCkKLSNkZWZpbmUJCUhGQTM4NHhfSU5URU5fQUxMT0MJCSgoVUlOVDE2KUJJVDMpCi0jZGVmaW5lCQlIRkEzODR4X0lOVEVOX1RYRVhDCQkoKFVJTlQxNilCSVQyKQotI2RlZmluZQkJSEZBMzg0eF9JTlRFTl9UWAkJKChVSU5UMTYpQklUMSkKLSNkZWZpbmUJCUhGQTM4NHhfSU5URU5fUlgJCSgoVUlOVDE2KUJJVDApCisjZGVmaW5lCQlIRkEzODR4X2ludEVOX1RJQ0sJCSgodTE2KUJJVDE1KQorI2RlZmluZQkJSEZBMzg0eF9pbnRFTl9XVEVSUgkJKCh1MTYpQklUMTQpCisjZGVmaW5lCQlIRkEzODR4X2ludEVOX0lORkRST1AJCSgodTE2KUJJVDEzKQorI2RlZmluZQkJSEZBMzg0eF9pbnRFTl9JTkZPCQkoKHUxNilCSVQ3KQorI2RlZmluZQkJSEZBMzg0eF9pbnRFTl9EVElNCQkoKHUxNilCSVQ1KQorI2RlZmluZQkJSEZBMzg0eF9pbnRFTl9DTUQJCSgodTE2KUJJVDQpCisjZGVmaW5lCQlIRkEzODR4X2ludEVOX0FMTE9DCQkoKHUxNilCSVQzKQorI2RlZmluZQkJSEZBMzg0eF9pbnRFTl9UWEVYQwkJKCh1MTYpQklUMikKKyNkZWZpbmUJCUhGQTM4NHhfaW50RU5fVFgJCSgodTE2KUJJVDEpCisjZGVmaW5lCQlIRkEzODR4X2ludEVOX1JYCQkoKHUxNilCSVQwKQogCi0jZGVmaW5lCQlIRkEzODR4X0VWQUNLX1RJQ0sJCSgoVUlOVDE2KUJJVDE1KQotI2RlZmluZQkJSEZBMzg0eF9FVkFDS19XVEVSUgkJKChVSU5UMTYpQklUMTQpCi0jZGVmaW5lCQlIRkEzODR4X0VWQUNLX0lORkRST1AJCSgoVUlOVDE2KUJJVDEzKQotI2RlZmluZQkJSEZBMzg0eF9FVkFDS19JTkZPCQkoKFVJTlQxNilCSVQ3KQotI2RlZmluZQkJSEZBMzg0eF9FVkFDS19EVElNCQkoKFVJTlQxNilCSVQ1KQotI2RlZmluZQkJSEZBMzg0eF9FVkFDS19DTUQJCSgoVUlOVDE2KUJJVDQpCi0jZGVmaW5lCQlIRkEzODR4X0VWQUNLX0FMTE9DCQkoKFVJTlQxNilCSVQzKQotI2RlZmluZQkJSEZBMzg0eF9FVkFDS19UWEVYQwkJKChVSU5UMTYpQklUMikKLSNkZWZpbmUJCUhGQTM4NHhfRVZBQ0tfVFgJCSgoVUlOVDE2KUJJVDEpCi0jZGVmaW5lCQlIRkEzODR4X0VWQUNLX1JYCQkoKFVJTlQxNilCSVQwKQorI2RlZmluZQkJSEZBMzg0eF9FVkFDS19USUNLCQkoKHUxNilCSVQxNSkKKyNkZWZpbmUJCUhGQTM4NHhfRVZBQ0tfV1RFUlIJCSgodTE2KUJJVDE0KQorI2RlZmluZQkJSEZBMzg0eF9FVkFDS19JTkZEUk9QCQkoKHUxNilCSVQxMykKKyNkZWZpbmUJCUhGQTM4NHhfRVZBQ0tfSU5GTwkJKCh1MTYpQklUNykKKyNkZWZpbmUJCUhGQTM4NHhfRVZBQ0tfRFRJTQkJKCh1MTYpQklUNSkKKyNkZWZpbmUJCUhGQTM4NHhfRVZBQ0tfQ01ECQkoKHUxNilCSVQ0KQorI2RlZmluZQkJSEZBMzg0eF9FVkFDS19BTExPQwkJKCh1MTYpQklUMykKKyNkZWZpbmUJCUhGQTM4NHhfRVZBQ0tfVFhFWEMJCSgodTE2KUJJVDIpCisjZGVmaW5lCQlIRkEzODR4X0VWQUNLX1RYCQkoKHUxNilCSVQxKQorI2RlZmluZQkJSEZBMzg0eF9FVkFDS19SWAkJKCh1MTYpQklUMCkKIAotI2RlZmluZQkJSEZBMzg0eF9DT05UUk9MX0FVWEVOCQkoKFVJTlQxNikoQklUMTUgfCBCSVQxNCkpCisjZGVmaW5lCQlIRkEzODR4X0NPTlRST0xfQVVYRU4JCSgodTE2KShCSVQxNSB8IEJJVDE0KSkKIAogCiAvKi0tLSBDb21tYW5kIENvZGUgQ29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qLS0tIENvbnRyb2xsZXIgQ29tbWFuZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2RlZmluZQkJSEZBMzg0eF9DTURDT0RFX0lOSVQJCSgoVUlOVDE2KTB4MDApCi0jZGVmaW5lCQlIRkEzODR4X0NNRENPREVfRU5BQkxFCQkoKFVJTlQxNikweDAxKQotI2RlZmluZQkJSEZBMzg0eF9DTURDT0RFX0RJU0FCTEUJCSgoVUlOVDE2KTB4MDIpCi0jZGVmaW5lCQlIRkEzODR4X0NNRENPREVfRElBRwkJKChVSU5UMTYpMHgwMykKKyNkZWZpbmUJCUhGQTM4NHhfQ01EQ09ERV9JTklUCQkoKHUxNikweDAwKQorI2RlZmluZQkJSEZBMzg0eF9DTURDT0RFX0VOQUJMRQkJKCh1MTYpMHgwMSkKKyNkZWZpbmUJCUhGQTM4NHhfQ01EQ09ERV9ESVNBQkxFCQkoKHUxNikweDAyKQorI2RlZmluZQkJSEZBMzg0eF9DTURDT0RFX0RJQUcJCSgodTE2KTB4MDMpCiAKIC8qLS0tIEJ1ZmZlciBNZ210IENvbW1hbmRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNkZWZpbmUJCUhGQTM4NHhfQ01EQ09ERV9BTExPQwkJKChVSU5UMTYpMHgwQSkKLSNkZWZpbmUJCUhGQTM4NHhfQ01EQ09ERV9UWAkJKChVSU5UMTYpMHgwQikKLSNkZWZpbmUJCUhGQTM4NHhfQ01EQ09ERV9DTFJQUlNUCQkoKFVJTlQxNikweDEyKQorI2RlZmluZQkJSEZBMzg0eF9DTURDT0RFX0FMTE9DCQkoKHUxNikweDBBKQorI2RlZmluZQkJSEZBMzg0eF9DTURDT0RFX1RYCQkoKHUxNikweDBCKQorI2RlZmluZQkJSEZBMzg0eF9DTURDT0RFX0NMUlBSU1QJCSgodTE2KTB4MTIpCiAKIC8qLS0tIFJlZ3VsYXRlIENvbW1hbmRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNkZWZpbmUJCUhGQTM4NHhfQ01EQ09ERV9OT1RJRlkJCSgoVUlOVDE2KTB4MTApCi0jZGVmaW5lCQlIRkEzODR4X0NNRENPREVfSU5RCQkoKFVJTlQxNikweDExKQorI2RlZmluZQkJSEZBMzg0eF9DTURDT0RFX05PVElGWQkJKCh1MTYpMHgxMCkKKyNkZWZpbmUJCUhGQTM4NHhfQ01EQ09ERV9JTlEJCSgodTE2KTB4MTEpCiAKIC8qLS0tIENvbmZpZ3VyZSBDb21tYW5kcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jZGVmaW5lCQlIRkEzODR4X0NNRENPREVfQUNDRVNTCQkoKFVJTlQxNikweDIxKQotI2RlZmluZQkJSEZBMzg0eF9DTURDT0RFX0RPV05MRAkJKChVSU5UMTYpMHgyMikKKyNkZWZpbmUJCUhGQTM4NHhfQ01EQ09ERV9BQ0NFU1MJCSgodTE2KTB4MjEpCisjZGVmaW5lCQlIRkEzODR4X0NNRENPREVfRE9XTkxECQkoKHUxNikweDIyKQogCiAvKi0tLSBEZWJ1Z2dpbmcgQ29tbWFuZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2RlZmluZSAJSEZBMzg0eF9DTURDT0RFX01PTklUT1IJCSgoVUlOVDE2KSgweDM4KSkKLSNkZWZpbmUJCUhGQTM4NHhfTU9OSVRPUl9FTkFCTEUJCSgoVUlOVDE2KSgweDBiKSkKLSNkZWZpbmUJCUhGQTM4NHhfTU9OSVRPUl9ESVNBQkxFCQkoKFVJTlQxNikoMHgwZikpCisjZGVmaW5lIAlIRkEzODR4X0NNRENPREVfTU9OSVRPUgkJKCh1MTYpKDB4MzgpKQorI2RlZmluZQkJSEZBMzg0eF9NT05JVE9SX0VOQUJMRQkJKCh1MTYpKDB4MGIpKQorI2RlZmluZQkJSEZBMzg0eF9NT05JVE9SX0RJU0FCTEUJCSgodTE2KSgweDBmKSkKIAogLyotLS0gUmVzdWx0IENvZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNkZWZpbmUJCUhGQTM4NHhfU1VDQ0VTUwkJCSgoVUlOVDE2KSgweDAwKSkKLSNkZWZpbmUJCUhGQTM4NHhfQ0FSRF9GQUlMCQkoKFVJTlQxNikoMHgwMSkpCi0jZGVmaW5lCQlIRkEzODR4X05PX0JVRkYJCQkoKFVJTlQxNikoMHgwNSkpCi0jZGVmaW5lCQlIRkEzODR4X0NNRF9FUlIJCQkoKFVJTlQxNikoMHg3RikpCisjZGVmaW5lCQlIRkEzODR4X1NVQ0NFU1MJCQkoKHUxNikoMHgwMCkpCisjZGVmaW5lCQlIRkEzODR4X0NBUkRfRkFJTAkJKCh1MTYpKDB4MDEpKQorI2RlZmluZQkJSEZBMzg0eF9OT19CVUZGCQkJKCh1MTYpKDB4MDUpKQorI2RlZmluZQkJSEZBMzg0eF9DTURfRVJSCQkJKCh1MTYpKDB4N0YpKQogCiAvKi0tLSBQcm9ncmFtbWluZyBNb2RlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCU1PREUgMDogRGlzYWJsZSBwcm9ncmFtbWluZwpAQCAtMzc0LDQ4ICszMzgsNDggQEAKIAlNT0RFIDI6IEVuYWJsZSBub24tdm9sYXRpbGUgbWVtb3J5IHByb2dyYW1taW5nCiAJTU9ERSAzOiBQcm9ncmFtIG5vbi12b2xhdGlsZSBtZW1vcnkgc2VjdGlvbgogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2RlZmluZQkJSEZBMzg0eF9QUk9HTU9ERV9ESVNBQkxFCSgoVUlOVDE2KTB4MDApCi0jZGVmaW5lCQlIRkEzODR4X1BST0dNT0RFX1JBTQkJKChVSU5UMTYpMHgwMSkKLSNkZWZpbmUJCUhGQTM4NHhfUFJPR01PREVfTlYJCSgoVUlOVDE2KTB4MDIpCi0jZGVmaW5lCQlIRkEzODR4X1BST0dNT0RFX05WV1JJVEUJKChVSU5UMTYpMHgwMykKKyNkZWZpbmUJCUhGQTM4NHhfUFJPR01PREVfRElTQUJMRQkoKHUxNikweDAwKQorI2RlZmluZQkJSEZBMzg0eF9QUk9HTU9ERV9SQU0JCSgodTE2KTB4MDEpCisjZGVmaW5lCQlIRkEzODR4X1BST0dNT0RFX05WCQkoKHUxNikweDAyKQorI2RlZmluZQkJSEZBMzg0eF9QUk9HTU9ERV9OVldSSVRFCSgodTE2KTB4MDMpCiAKIC8qLS0tIEFVWCByZWdpc3RlciBlbmFibGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2RlZmluZQkJSEZBMzg0eF9BVVhQVzAJCQkoKFVJTlQxNikweGZlMDEpCi0jZGVmaW5lCQlIRkEzODR4X0FVWFBXMQkJCSgoVUlOVDE2KTB4ZGMyMykKLSNkZWZpbmUJCUhGQTM4NHhfQVVYUFcyCQkJKChVSU5UMTYpMHhiYTQ1KQorI2RlZmluZQkJSEZBMzg0eF9BVVhQVzAJCQkoKHUxNikweGZlMDEpCisjZGVmaW5lCQlIRkEzODR4X0FVWFBXMQkJCSgodTE2KTB4ZGMyMykKKyNkZWZpbmUJCUhGQTM4NHhfQVVYUFcyCQkJKCh1MTYpMHhiYTQ1KQogCi0jZGVmaW5lCQlIRkEzODR4X0NPTlRST0xfQVVYX0lTRElTQUJMRUQJKChVSU5UMTYpMHgwMDAwKQotI2RlZmluZQkJSEZBMzg0eF9DT05UUk9MX0FVWF9JU0VOQUJMRUQJKChVSU5UMTYpMHhjMDAwKQotI2RlZmluZQkJSEZBMzg0eF9DT05UUk9MX0FVWF9ET0VOQUJMRQkoKFVJTlQxNikweDgwMDApCi0jZGVmaW5lCQlIRkEzODR4X0NPTlRST0xfQVVYX0RPRElTQUJMRQkoKFVJTlQxNikweDQwMDApCisjZGVmaW5lCQlIRkEzODR4X0NPTlRST0xfQVVYX0lTRElTQUJMRUQJKCh1MTYpMHgwMDAwKQorI2RlZmluZQkJSEZBMzg0eF9DT05UUk9MX0FVWF9JU0VOQUJMRUQJKCh1MTYpMHhjMDAwKQorI2RlZmluZQkJSEZBMzg0eF9DT05UUk9MX0FVWF9ET0VOQUJMRQkoKHUxNikweDgwMDApCisjZGVmaW5lCQlIRkEzODR4X0NPTlRST0xfQVVYX0RPRElTQUJMRQkoKHUxNikweDQwMDApCiAKIC8qLS0tIFJlY29yZCBJRCBDb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogQ29uZmlndXJhdGlvbiBSSURzOiBOZXR3b3JrIFBhcmFtZXRlcnMsIFN0YXRpYyBDb25maWd1cmF0aW9uIEVudGl0aWVzCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZQT1JUVFlQRQkJKChVSU5UMTYpMHhGQzAwKQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GT1dOTUFDQUREUgkoKFVJTlQxNikweEZDMDEpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZERVNJUkVEU1NJRAkoKFVJTlQxNikweEZDMDIpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZPV05DSEFOTkVMCSgoVUlOVDE2KTB4RkMwMykKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NORk9XTlNTSUQJCSgoVUlOVDE2KTB4RkMwNCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NORk9XTkFUSU1XSU4JKChVSU5UMTYpMHhGQzA1KQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GU1lTU0NBTEUJCSgoVUlOVDE2KTB4RkMwNikKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NORk1BWERBVEFMRU4JKChVSU5UMTYpMHhGQzA3KQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GV0RTQUREUgkJKChVSU5UMTYpMHhGQzA4KQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GUE1FTkFCTEVECSgoVUlOVDE2KTB4RkMwOSkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NORlBNRVBTCQkoKFVJTlQxNikweEZDMEEpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZNVUxUSUNBU1RSWAkoKFVJTlQxNikweEZDMEIpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZNQVhTTEVFUERVUgkoKFVJTlQxNikweEZDMEMpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZQTUhPTEREVVIJKChVSU5UMTYpMHhGQzBEKQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GT1dOTkFNRQkJKChVSU5UMTYpMHhGQzBFKQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GT1dORFRJTVBFUgkoKFVJTlQxNikweEZDMTApCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZXRFNBRERSMQkJKChVSU5UMTYpMHhGQzExKQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GV0RTQUREUjIJCSgoVUlOVDE2KTB4RkMxMikKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NORldEU0FERFIzCQkoKFVJTlQxNikweEZDMTMpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZXRFNBRERSNAkJKChVSU5UMTYpMHhGQzE0KQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GV0RTQUREUjUJCSgoVUlOVDE2KTB4RkMxNSkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NORldEU0FERFI2CQkoKFVJTlQxNikweEZDMTYpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZNQ0FTVFBNQlVGRgkoKFVJTlQxNikweEZDMTcpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZQT1JUVFlQRQkJKCh1MTYpMHhGQzAwKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GT1dOTUFDQUREUgkoKHUxNikweEZDMDEpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZERVNJUkVEU1NJRAkoKHUxNikweEZDMDIpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZPV05DSEFOTkVMCSgodTE2KTB4RkMwMykKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORk9XTlNTSUQJCSgodTE2KTB4RkMwNCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORk9XTkFUSU1XSU4JKCh1MTYpMHhGQzA1KQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GU1lTU0NBTEUJCSgodTE2KTB4RkMwNikKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORk1BWERBVEFMRU4JKCh1MTYpMHhGQzA3KQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GV0RTQUREUgkJKCh1MTYpMHhGQzA4KQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GUE1FTkFCTEVECSgodTE2KTB4RkMwOSkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORlBNRVBTCQkoKHUxNikweEZDMEEpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZNVUxUSUNBU1RSWAkoKHUxNikweEZDMEIpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZNQVhTTEVFUERVUgkoKHUxNikweEZDMEMpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZQTUhPTEREVVIJKCh1MTYpMHhGQzBEKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GT1dOTkFNRQkJKCh1MTYpMHhGQzBFKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GT1dORFRJTVBFUgkoKHUxNikweEZDMTApCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZXRFNBRERSMQkJKCh1MTYpMHhGQzExKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GV0RTQUREUjIJCSgodTE2KTB4RkMxMikKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORldEU0FERFIzCQkoKHUxNikweEZDMTMpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZXRFNBRERSNAkJKCh1MTYpMHhGQzE0KQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GV0RTQUREUjUJCSgodTE2KTB4RkMxNSkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORldEU0FERFI2CQkoKHUxNikweEZDMTYpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZNQ0FTVFBNQlVGRgkoKHUxNikweEZDMTcpCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIENvbmZpZ3VyYXRpb24gUklEIGxlbmd0aHM6IE5ldHdvcmsgUGFyYW1zLCBTdGF0aWMgQ29uZmlnIEVudGl0aWVzCkBAIC00MjMsNjIgKzM4Nyw2MiBAQAogICBpbmNsdWRlIHRoZSBsZW4gb3IgY29kZSBmaWVsZHMpCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKiBUT0RPOiBmaWxsIGluIHRoZSByZXN0IG9mIHRoZXNlICovCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZQT1JUVFlQRV9MRU4JKChVSU5UMTYpMikKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NORk9XTk1BQ0FERFJfTEVOCSgoVUlOVDE2KTYpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZERVNJUkVEU1NJRF9MRU4JKChVSU5UMTYpMzQpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZPV05DSEFOTkVMX0xFTgkoKFVJTlQxNikyKQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GT1dOU1NJRF9MRU4JKChVSU5UMTYpMzQpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZPV05BVElNV0lOX0xFTgkoKFVJTlQxNikyKQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GU1lTU0NBTEVfTEVOCSgoVUlOVDE2KTApCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZNQVhEQVRBTEVOX0xFTgkoKFVJTlQxNikwKQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GV0RTQUREUl9MRU4JKChVSU5UMTYpNikKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NORlBNRU5BQkxFRF9MRU4JKChVSU5UMTYpMCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NORlBNRVBTX0xFTgkoKFVJTlQxNikwKQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GTVVMVElDQVNUUlhfTEVOCSgoVUlOVDE2KTApCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZNQVhTTEVFUERVUl9MRU4JKChVSU5UMTYpMCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NORlBNSE9MRERVUl9MRU4JKChVSU5UMTYpMCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NORk9XTk5BTUVfTEVOCSgoVUlOVDE2KTM0KQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GT1dORFRJTVBFUl9MRU4JKChVSU5UMTYpMCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NORldEU0FERFIxX0xFTgkoKFVJTlQxNik2KQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GV0RTQUREUjJfTEVOCSgoVUlOVDE2KTYpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZXRFNBRERSM19MRU4JKChVSU5UMTYpNikKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NORldEU0FERFI0X0xFTgkoKFVJTlQxNik2KQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GV0RTQUREUjVfTEVOCSgoVUlOVDE2KTYpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZXRFNBRERSNl9MRU4JKChVSU5UMTYpNikKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NORk1DQVNUUE1CVUZGX0xFTgkoKFVJTlQxNikwKQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GQVVUSEVOVElDQVRJT05fTEVOICgoVUlOVDE2KXNpemVvZihVSU5UMTYpKQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GTUFYU0xFRVBEVVJfTEVOCSgoVUlOVDE2KTApCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZQT1JUVFlQRV9MRU4JKCh1MTYpMikKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORk9XTk1BQ0FERFJfTEVOCSgodTE2KTYpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZERVNJUkVEU1NJRF9MRU4JKCh1MTYpMzQpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZPV05DSEFOTkVMX0xFTgkoKHUxNikyKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GT1dOU1NJRF9MRU4JKCh1MTYpMzQpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZPV05BVElNV0lOX0xFTgkoKHUxNikyKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GU1lTU0NBTEVfTEVOCSgodTE2KTApCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZNQVhEQVRBTEVOX0xFTgkoKHUxNikwKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GV0RTQUREUl9MRU4JKCh1MTYpNikKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORlBNRU5BQkxFRF9MRU4JKCh1MTYpMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORlBNRVBTX0xFTgkoKHUxNikwKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GTVVMVElDQVNUUlhfTEVOCSgodTE2KTApCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZNQVhTTEVFUERVUl9MRU4JKCh1MTYpMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORlBNSE9MRERVUl9MRU4JKCh1MTYpMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORk9XTk5BTUVfTEVOCSgodTE2KTM0KQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GT1dORFRJTVBFUl9MRU4JKCh1MTYpMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORldEU0FERFIxX0xFTgkoKHUxNik2KQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GV0RTQUREUjJfTEVOCSgodTE2KTYpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZXRFNBRERSM19MRU4JKCh1MTYpNikKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORldEU0FERFI0X0xFTgkoKHUxNik2KQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GV0RTQUREUjVfTEVOCSgodTE2KTYpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZXRFNBRERSNl9MRU4JKCh1MTYpNikKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORk1DQVNUUE1CVUZGX0xFTgkoKHUxNikwKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GQVVUSEVOVElDQVRJT05fTEVOICgodTE2KXNpemVvZih1MTYpKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GTUFYU0xFRVBEVVJfTEVOCSgodTE2KTApCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIENvbmZpZ3VyYXRpb24gUklEczogTmV0d29yayBQYXJhbWV0ZXJzLCBEeW5hbWljIENvbmZpZ3VyYXRpb24gRW50aXRpZXMKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNkZWZpbmUJCUhGQTM4NHhfUklEX0dST1VQQUREUgkJKChVSU5UMTYpMHhGQzgwKQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ1JFQVRFSUJTUwkJKChVSU5UMTYpMHhGQzgxKQotI2RlZmluZQkJSEZBMzg0eF9SSURfRlJBR1RIUkVTSAkJKChVSU5UMTYpMHhGQzgyKQotI2RlZmluZQkJSEZBMzg0eF9SSURfUlRTVEhSRVNICQkoKFVJTlQxNikweEZDODMpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9UWFJBVEVDTlRMCQkoKFVJTlQxNikweEZDODQpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9QUk9NSVNDTU9ERQkJKChVSU5UMTYpMHhGQzg1KQotI2RlZmluZQkJSEZBMzg0eF9SSURfRlJBR1RIUkVTSDAJCSgoVUlOVDE2KTB4RkM5MCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0ZSQUdUSFJFU0gxCQkoKFVJTlQxNikweEZDOTEpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9GUkFHVEhSRVNIMgkJKChVSU5UMTYpMHhGQzkyKQotI2RlZmluZQkJSEZBMzg0eF9SSURfRlJBR1RIUkVTSDMJCSgoVUlOVDE2KTB4RkM5MykKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0ZSQUdUSFJFU0g0CQkoKFVJTlQxNikweEZDOTQpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9GUkFHVEhSRVNINQkJKChVSU5UMTYpMHhGQzk1KQotI2RlZmluZQkJSEZBMzg0eF9SSURfRlJBR1RIUkVTSDYJCSgoVUlOVDE2KTB4RkM5NikKLSNkZWZpbmUJCUhGQTM4NHhfUklEX1JUU1RIUkVTSDAJCSgoVUlOVDE2KTB4RkM5NykKLSNkZWZpbmUJCUhGQTM4NHhfUklEX1JUU1RIUkVTSDEJCSgoVUlOVDE2KTB4RkM5OCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX1JUU1RIUkVTSDIJCSgoVUlOVDE2KTB4RkM5OSkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX1JUU1RIUkVTSDMJCSgoVUlOVDE2KTB4RkM5QSkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX1JUU1RIUkVTSDQJCSgoVUlOVDE2KTB4RkM5QikKLSNkZWZpbmUJCUhGQTM4NHhfUklEX1JUU1RIUkVTSDUJCSgoVUlOVDE2KTB4RkM5QykKLSNkZWZpbmUJCUhGQTM4NHhfUklEX1JUU1RIUkVTSDYJCSgoVUlOVDE2KTB4RkM5RCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX1RYUkFURUNOVEwwCQkoKFVJTlQxNikweEZDOUUpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9UWFJBVEVDTlRMMQkJKChVSU5UMTYpMHhGQzlGKQotI2RlZmluZQkJSEZBMzg0eF9SSURfVFhSQVRFQ05UTDIJCSgoVUlOVDE2KTB4RkNBMCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX1RYUkFURUNOVEwzCQkoKFVJTlQxNikweEZDQTEpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9UWFJBVEVDTlRMNAkJKChVSU5UMTYpMHhGQ0EyKQotI2RlZmluZQkJSEZBMzg0eF9SSURfVFhSQVRFQ05UTDUJCSgoVUlOVDE2KTB4RkNBMykKLSNkZWZpbmUJCUhGQTM4NHhfUklEX1RYUkFURUNOVEw2CQkoKFVJTlQxNikweEZDQTQpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9HUk9VUEFERFIJCSgodTE2KTB4RkM4MCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NSRUFURUlCU1MJCSgodTE2KTB4RkM4MSkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0ZSQUdUSFJFU0gJCSgodTE2KTB4RkM4MikKKyNkZWZpbmUJCUhGQTM4NHhfUklEX1JUU1RIUkVTSAkJKCh1MTYpMHhGQzgzKQorI2RlZmluZQkJSEZBMzg0eF9SSURfVFhSQVRFQ05UTAkJKCh1MTYpMHhGQzg0KQorI2RlZmluZQkJSEZBMzg0eF9SSURfUFJPTUlTQ01PREUJCSgodTE2KTB4RkM4NSkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0ZSQUdUSFJFU0gwCQkoKHUxNikweEZDOTApCisjZGVmaW5lCQlIRkEzODR4X1JJRF9GUkFHVEhSRVNIMQkJKCh1MTYpMHhGQzkxKQorI2RlZmluZQkJSEZBMzg0eF9SSURfRlJBR1RIUkVTSDIJCSgodTE2KTB4RkM5MikKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0ZSQUdUSFJFU0gzCQkoKHUxNikweEZDOTMpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9GUkFHVEhSRVNINAkJKCh1MTYpMHhGQzk0KQorI2RlZmluZQkJSEZBMzg0eF9SSURfRlJBR1RIUkVTSDUJCSgodTE2KTB4RkM5NSkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0ZSQUdUSFJFU0g2CQkoKHUxNikweEZDOTYpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9SVFNUSFJFU0gwCQkoKHUxNikweEZDOTcpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9SVFNUSFJFU0gxCQkoKHUxNikweEZDOTgpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9SVFNUSFJFU0gyCQkoKHUxNikweEZDOTkpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9SVFNUSFJFU0gzCQkoKHUxNikweEZDOUEpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9SVFNUSFJFU0g0CQkoKHUxNikweEZDOUIpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9SVFNUSFJFU0g1CQkoKHUxNikweEZDOUMpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9SVFNUSFJFU0g2CQkoKHUxNikweEZDOUQpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9UWFJBVEVDTlRMMAkJKCh1MTYpMHhGQzlFKQorI2RlZmluZQkJSEZBMzg0eF9SSURfVFhSQVRFQ05UTDEJCSgodTE2KTB4RkM5RikKKyNkZWZpbmUJCUhGQTM4NHhfUklEX1RYUkFURUNOVEwyCQkoKHUxNikweEZDQTApCisjZGVmaW5lCQlIRkEzODR4X1JJRF9UWFJBVEVDTlRMMwkJKCh1MTYpMHhGQ0ExKQorI2RlZmluZQkJSEZBMzg0eF9SSURfVFhSQVRFQ05UTDQJCSgodTE2KTB4RkNBMikKKyNkZWZpbmUJCUhGQTM4NHhfUklEX1RYUkFURUNOVEw1CQkoKHUxNikweEZDQTMpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9UWFJBVEVDTlRMNgkJKCh1MTYpMHhGQ0E0KQogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBDb25maWd1cmF0aW9uIFJJRCBMZW5ndGhzOiBOZXR3b3JrIFBhcmFtLCBEeW5hbWljIENvbmZpZyBFbnRpdGllcwpAQCAtNDg2LDI5NiArNDUwLDI5NiBAQAogICBpbmNsdWRlIHRoZSBsZW4gb3IgY29kZSBmaWVsZHMpCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKiBUT0RPOiBmaWxsIGluIHRoZSByZXN0IG9mIHRoZXNlICovCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9HUk9VUEFERFJfTEVOCSgoVUlOVDE2KTE2ICogV0xBTl9BRERSX0xFTikKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NSRUFURUlCU1NfTEVOCSgoVUlOVDE2KTApCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9GUkFHVEhSRVNIX0xFTgkoKFVJTlQxNikwKQotI2RlZmluZQkJSEZBMzg0eF9SSURfUlRTVEhSRVNIX0xFTgkoKFVJTlQxNikwKQotI2RlZmluZQkJSEZBMzg0eF9SSURfVFhSQVRFQ05UTF9MRU4JKChVSU5UMTYpNCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX1BST01JU0NNT0RFX0xFTgkoKFVJTlQxNikyKQotI2RlZmluZQkJSEZBMzg0eF9SSURfRlJBR1RIUkVTSDBfTEVOCSgoVUlOVDE2KTApCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9GUkFHVEhSRVNIMV9MRU4JKChVSU5UMTYpMCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0ZSQUdUSFJFU0gyX0xFTgkoKFVJTlQxNikwKQotI2RlZmluZQkJSEZBMzg0eF9SSURfRlJBR1RIUkVTSDNfTEVOCSgoVUlOVDE2KTApCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9GUkFHVEhSRVNINF9MRU4JKChVSU5UMTYpMCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0ZSQUdUSFJFU0g1X0xFTgkoKFVJTlQxNikwKQotI2RlZmluZQkJSEZBMzg0eF9SSURfRlJBR1RIUkVTSDZfTEVOCSgoVUlOVDE2KTApCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9SVFNUSFJFU0gwX0xFTgkoKFVJTlQxNikwKQotI2RlZmluZQkJSEZBMzg0eF9SSURfUlRTVEhSRVNIMV9MRU4JKChVSU5UMTYpMCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX1JUU1RIUkVTSDJfTEVOCSgoVUlOVDE2KTApCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9SVFNUSFJFU0gzX0xFTgkoKFVJTlQxNikwKQotI2RlZmluZQkJSEZBMzg0eF9SSURfUlRTVEhSRVNINF9MRU4JKChVSU5UMTYpMCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX1JUU1RIUkVTSDVfTEVOCSgoVUlOVDE2KTApCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9SVFNUSFJFU0g2X0xFTgkoKFVJTlQxNikwKQotI2RlZmluZQkJSEZBMzg0eF9SSURfVFhSQVRFQ05UTDBfTEVOCSgoVUlOVDE2KTApCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9UWFJBVEVDTlRMMV9MRU4JKChVSU5UMTYpMCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX1RYUkFURUNOVEwyX0xFTgkoKFVJTlQxNikwKQotI2RlZmluZQkJSEZBMzg0eF9SSURfVFhSQVRFQ05UTDNfTEVOCSgoVUlOVDE2KTApCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9UWFJBVEVDTlRMNF9MRU4JKChVSU5UMTYpMCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX1RYUkFURUNOVEw1X0xFTgkoKFVJTlQxNikwKQotI2RlZmluZQkJSEZBMzg0eF9SSURfVFhSQVRFQ05UTDZfTEVOCSgoVUlOVDE2KTApCisjZGVmaW5lCQlIRkEzODR4X1JJRF9HUk9VUEFERFJfTEVOCSgodTE2KTE2ICogV0xBTl9BRERSX0xFTikKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NSRUFURUlCU1NfTEVOCSgodTE2KTApCisjZGVmaW5lCQlIRkEzODR4X1JJRF9GUkFHVEhSRVNIX0xFTgkoKHUxNikwKQorI2RlZmluZQkJSEZBMzg0eF9SSURfUlRTVEhSRVNIX0xFTgkoKHUxNikwKQorI2RlZmluZQkJSEZBMzg0eF9SSURfVFhSQVRFQ05UTF9MRU4JKCh1MTYpNCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX1BST01JU0NNT0RFX0xFTgkoKHUxNikyKQorI2RlZmluZQkJSEZBMzg0eF9SSURfRlJBR1RIUkVTSDBfTEVOCSgodTE2KTApCisjZGVmaW5lCQlIRkEzODR4X1JJRF9GUkFHVEhSRVNIMV9MRU4JKCh1MTYpMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0ZSQUdUSFJFU0gyX0xFTgkoKHUxNikwKQorI2RlZmluZQkJSEZBMzg0eF9SSURfRlJBR1RIUkVTSDNfTEVOCSgodTE2KTApCisjZGVmaW5lCQlIRkEzODR4X1JJRF9GUkFHVEhSRVNINF9MRU4JKCh1MTYpMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0ZSQUdUSFJFU0g1X0xFTgkoKHUxNikwKQorI2RlZmluZQkJSEZBMzg0eF9SSURfRlJBR1RIUkVTSDZfTEVOCSgodTE2KTApCisjZGVmaW5lCQlIRkEzODR4X1JJRF9SVFNUSFJFU0gwX0xFTgkoKHUxNikwKQorI2RlZmluZQkJSEZBMzg0eF9SSURfUlRTVEhSRVNIMV9MRU4JKCh1MTYpMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX1JUU1RIUkVTSDJfTEVOCSgodTE2KTApCisjZGVmaW5lCQlIRkEzODR4X1JJRF9SVFNUSFJFU0gzX0xFTgkoKHUxNikwKQorI2RlZmluZQkJSEZBMzg0eF9SSURfUlRTVEhSRVNINF9MRU4JKCh1MTYpMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX1JUU1RIUkVTSDVfTEVOCSgodTE2KTApCisjZGVmaW5lCQlIRkEzODR4X1JJRF9SVFNUSFJFU0g2X0xFTgkoKHUxNikwKQorI2RlZmluZQkJSEZBMzg0eF9SSURfVFhSQVRFQ05UTDBfTEVOCSgodTE2KTApCisjZGVmaW5lCQlIRkEzODR4X1JJRF9UWFJBVEVDTlRMMV9MRU4JKCh1MTYpMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX1RYUkFURUNOVEwyX0xFTgkoKHUxNikwKQorI2RlZmluZQkJSEZBMzg0eF9SSURfVFhSQVRFQ05UTDNfTEVOCSgodTE2KTApCisjZGVmaW5lCQlIRkEzODR4X1JJRF9UWFJBVEVDTlRMNF9MRU4JKCh1MTYpMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX1RYUkFURUNOVEw1X0xFTgkoKHUxNikwKQorI2RlZmluZQkJSEZBMzg0eF9SSURfVFhSQVRFQ05UTDZfTEVOCSgodTE2KTApCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIENvbmZpZ3VyYXRpb24gUklEczogQmVoYXZpb3IgUGFyYW1ldGVycwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2RlZmluZQkJSEZBMzg0eF9SSURfSVRJQ0tUSU1FCQkoKFVJTlQxNikweEZDRTApCisjZGVmaW5lCQlIRkEzODR4X1JJRF9JVElDS1RJTUUJCSgodTE2KTB4RkNFMCkKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogQ29uZmlndXJhdGlvbiBSSUQgTGVuZ3RoczogQmVoYXZpb3IgUGFyYW1ldGVycwogICBUaGlzIGlzIHRoZSBsZW5ndGggb2YgSlVTVCB0aGUgREFUQSBwYXJ0IG9mIHRoZSBSSUQgKGRvZXMgbm90CiAgIGluY2x1ZGUgdGhlIGxlbiBvciBjb2RlIGZpZWxkcykKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNkZWZpbmUJCUhGQTM4NHhfUklEX0lUSUNLVElNRV9MRU4JKChVSU5UMTYpMikKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0lUSUNLVElNRV9MRU4JKCh1MTYpMikKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBJbmZvcm1hdGlvbiBSSURzOiBOSUMgSW5mb3JtYXRpb24KIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNkZWZpbmUJCUhGQTM4NHhfUklEX01BWExPQURUSU1FCQkoKFVJTlQxNikweEZEMDApCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9ET1dOTE9BREJVRkZFUgkoKFVJTlQxNikweEZEMDEpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9QUklJREVOVElUWQkJKChVSU5UMTYpMHhGRDAyKQotI2RlZmluZQkJSEZBMzg0eF9SSURfUFJJU1VQUkFOR0UJCSgoVUlOVDE2KTB4RkQwMykKLSNkZWZpbmUJCUhGQTM4NHhfUklEX1BSSV9DRklBQ1RSQU5HRVMJKChVSU5UMTYpMHhGRDA0KQotI2RlZmluZQkJSEZBMzg0eF9SSURfTklDU0VSSUFMTlVNQkVSCSgoVUlOVDE2KTB4RkQwQSkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX05JQ0lERU5USVRZCQkoKFVJTlQxNikweEZEMEIpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9NRklTVVBSQU5HRQkJKChVSU5UMTYpMHhGRDBDKQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ0ZJU1VQUkFOR0UJCSgoVUlOVDE2KTB4RkQwRCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NIQU5ORUxMSVNUCQkoKFVJTlQxNikweEZEMTApCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9SRUdVTEFUT1JZRE9NQUlOUwkoKFVJTlQxNikweEZEMTEpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9URU1QVFlQRQkJKChVSU5UMTYpMHhGRDEyKQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ0lTCQkJKChVSU5UMTYpMHhGRDEzKQotI2RlZmluZQkJSEZBMzg0eF9SSURfU1RBSURFTlRJVFkJCSgoVUlOVDE2KTB4RkQyMCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX1NUQVNVUFJBTkdFCQkoKFVJTlQxNikweEZEMjEpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9TVEFfTUZJQUNUUkFOR0VTCSgoVUlOVDE2KTB4RkQyMikKLSNkZWZpbmUJCUhGQTM4NHhfUklEX1NUQV9DRklBQ1RSQU5HRVMJKChVSU5UMTYpMHhGRDIzKQotI2RlZmluZQkJSEZBMzg0eF9SSURfQlVJTERTRVEJCSgoVUlOVDE2KTB4RkZGRSkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0ZXSUQJCSgoVUlOVDE2KTB4RkZGRikKKyNkZWZpbmUJCUhGQTM4NHhfUklEX01BWExPQURUSU1FCQkoKHUxNikweEZEMDApCisjZGVmaW5lCQlIRkEzODR4X1JJRF9ET1dOTE9BREJVRkZFUgkoKHUxNikweEZEMDEpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9QUklJREVOVElUWQkJKCh1MTYpMHhGRDAyKQorI2RlZmluZQkJSEZBMzg0eF9SSURfUFJJU1VQUkFOR0UJCSgodTE2KTB4RkQwMykKKyNkZWZpbmUJCUhGQTM4NHhfUklEX1BSSV9DRklBQ1RSQU5HRVMJKCh1MTYpMHhGRDA0KQorI2RlZmluZQkJSEZBMzg0eF9SSURfTklDU0VSSUFMTlVNQkVSCSgodTE2KTB4RkQwQSkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX05JQ0lERU5USVRZCQkoKHUxNikweEZEMEIpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9NRklTVVBSQU5HRQkJKCh1MTYpMHhGRDBDKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ0ZJU1VQUkFOR0UJCSgodTE2KTB4RkQwRCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NIQU5ORUxMSVNUCQkoKHUxNikweEZEMTApCisjZGVmaW5lCQlIRkEzODR4X1JJRF9SRUdVTEFUT1JZRE9NQUlOUwkoKHUxNikweEZEMTEpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9URU1QVFlQRQkJKCh1MTYpMHhGRDEyKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ0lTCQkJKCh1MTYpMHhGRDEzKQorI2RlZmluZQkJSEZBMzg0eF9SSURfU1RBSURFTlRJVFkJCSgodTE2KTB4RkQyMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX1NUQVNVUFJBTkdFCQkoKHUxNikweEZEMjEpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9TVEFfTUZJQUNUUkFOR0VTCSgodTE2KTB4RkQyMikKKyNkZWZpbmUJCUhGQTM4NHhfUklEX1NUQV9DRklBQ1RSQU5HRVMJKCh1MTYpMHhGRDIzKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQlVJTERTRVEJCSgodTE2KTB4RkZGRSkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0ZXSUQJCSgodTE2KTB4RkZGRikKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBJbmZvcm1hdGlvbiBSSUQgTGVuZ3RoczogTklDIEluZm9ybWF0aW9uCiAgIFRoaXMgaXMgdGhlIGxlbmd0aCBvZiBKVVNUIHRoZSBEQVRBIHBhcnQgb2YgdGhlIFJJRCAoZG9lcyBub3QKICAgaW5jbHVkZSB0aGUgbGVuIG9yIGNvZGUgZmllbGRzKQogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2RlZmluZQkJSEZBMzg0eF9SSURfTUFYTE9BRFRJTUVfTEVOCQkoKFVJTlQxNikwKQotI2RlZmluZQkJSEZBMzg0eF9SSURfRE9XTkxPQURCVUZGRVJfTEVOCQkoKFVJTlQxNilzaXplb2YoaGZhMzg0eF9kb3dubG9hZGJ1ZmZlcl90KSkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX1BSSUlERU5USVRZX0xFTgkJKChVSU5UMTYpOCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX1BSSVNVUFJBTkdFX0xFTgkJKChVSU5UMTYpMTApCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DRklBQ1RSQU5HRVNfTEVOCQkoKFVJTlQxNikxMCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX05JQ1NFUklBTE5VTUJFUl9MRU4JCSgoVUlOVDE2KTEyKQotI2RlZmluZQkJSEZBMzg0eF9SSURfTklDSURFTlRJVFlfTEVOCQkoKFVJTlQxNik4KQotI2RlZmluZQkJSEZBMzg0eF9SSURfTUZJU1VQUkFOR0VfTEVOCQkoKFVJTlQxNikxMCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NGSVNVUFJBTkdFX0xFTgkJKChVSU5UMTYpMTApCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DSEFOTkVMTElTVF9MRU4JCSgoVUlOVDE2KTApCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9SRUdVTEFUT1JZRE9NQUlOU19MRU4JKChVSU5UMTYpMTIpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9URU1QVFlQRV9MRU4JCSgoVUlOVDE2KTApCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DSVNfTEVOCQkJKChVSU5UMTYpNDgwKQotI2RlZmluZQkJSEZBMzg0eF9SSURfU1RBSURFTlRJVFlfTEVOCQkoKFVJTlQxNik4KQotI2RlZmluZQkJSEZBMzg0eF9SSURfU1RBU1VQUkFOR0VfTEVOCQkoKFVJTlQxNikxMCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX01GSUFDVFJBTkdFU19MRU4JCSgoVUlOVDE2KTEwKQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ0ZJQUNUUkFOR0VTMl9MRU4JCSgoVUlOVDE2KTEwKQotI2RlZmluZQkJSEZBMzg0eF9SSURfQlVJTERTRVFfTEVOCQkoKFVJTlQxNilzaXplb2YoaGZhMzg0eF9CdWlsZFNlcV90KSkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0ZXSURfTEVOCQkJKChVSU5UMTYpc2l6ZW9mKGhmYTM4NHhfRldJRF90KSkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX01BWExPQURUSU1FX0xFTgkJKCh1MTYpMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0RPV05MT0FEQlVGRkVSX0xFTgkJKCh1MTYpc2l6ZW9mKGhmYTM4NHhfZG93bmxvYWRidWZmZXJfdCkpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9QUklJREVOVElUWV9MRU4JCSgodTE2KTgpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9QUklTVVBSQU5HRV9MRU4JCSgodTE2KTEwKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ0ZJQUNUUkFOR0VTX0xFTgkJKCh1MTYpMTApCisjZGVmaW5lCQlIRkEzODR4X1JJRF9OSUNTRVJJQUxOVU1CRVJfTEVOCQkoKHUxNikxMikKKyNkZWZpbmUJCUhGQTM4NHhfUklEX05JQ0lERU5USVRZX0xFTgkJKCh1MTYpOCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX01GSVNVUFJBTkdFX0xFTgkJKCh1MTYpMTApCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DRklTVVBSQU5HRV9MRU4JCSgodTE2KTEwKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ0hBTk5FTExJU1RfTEVOCQkoKHUxNikwKQorI2RlZmluZQkJSEZBMzg0eF9SSURfUkVHVUxBVE9SWURPTUFJTlNfTEVOCSgodTE2KTEyKQorI2RlZmluZQkJSEZBMzg0eF9SSURfVEVNUFRZUEVfTEVOCQkoKHUxNikwKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ0lTX0xFTgkJCSgodTE2KTQ4MCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX1NUQUlERU5USVRZX0xFTgkJKCh1MTYpOCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX1NUQVNVUFJBTkdFX0xFTgkJKCh1MTYpMTApCisjZGVmaW5lCQlIRkEzODR4X1JJRF9NRklBQ1RSQU5HRVNfTEVOCQkoKHUxNikxMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NGSUFDVFJBTkdFUzJfTEVOCQkoKHUxNikxMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0JVSUxEU0VRX0xFTgkJKCh1MTYpc2l6ZW9mKGhmYTM4NHhfQnVpbGRTZXFfdCkpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9GV0lEX0xFTgkJCSgodTE2KXNpemVvZihoZmEzODR4X0ZXSURfdCkpCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIEluZm9ybWF0aW9uIFJJRHM6ICBNQUMgSW5mb3JtYXRpb24KIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNkZWZpbmUJCUhGQTM4NHhfUklEX1BPUlRTVEFUVVMJCSgoVUlOVDE2KTB4RkQ0MCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NVUlJFTlRTU0lECQkoKFVJTlQxNikweEZENDEpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DVVJSRU5UQlNTSUQJKChVSU5UMTYpMHhGRDQyKQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ09NTVNRVUFMSVRZCSgoVUlOVDE2KTB4RkQ0MykKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NVUlJFTlRUWFJBVEUJKChVSU5UMTYpMHhGRDQ0KQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ1VSUkVOVEJDTklOVAkoKFVJTlQxNikweEZENDUpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DVVJSRU5UU0NBTEVUSFJFU0gJKChVSU5UMTYpMHhGRDQ2KQotI2RlZmluZQkJSEZBMzg0eF9SSURfUFJPVE9DT0xSU1BUSU1FCSgoVUlOVDE2KTB4RkQ0NykKLSNkZWZpbmUJCUhGQTM4NHhfUklEX1NIT1JUUkVUUllMSU1JVAkoKFVJTlQxNikweEZENDgpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9MT05HUkVUUllMSU1JVAkoKFVJTlQxNikweEZENDkpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9NQVhUWExJRkVUSU1FCSgoVUlOVDE2KTB4RkQ0QSkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX01BWFJYTElGRVRJTUUJKChVSU5UMTYpMHhGRDRCKQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ0ZQT0xMQUJMRQkJKChVSU5UMTYpMHhGRDRDKQotI2RlZmluZQkJSEZBMzg0eF9SSURfQVVUSEFMR09SSVRITVMJKChVSU5UMTYpMHhGRDREKQotI2RlZmluZQkJSEZBMzg0eF9SSURfUFJJVkFDWU9QVElNUAkoKFVJTlQxNikweEZENEYpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9EQk1DT01NU1FVQUxJVFkJKChVSU5UMTYpMHhGRDUxKQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ1VSUkVOVFRYUkFURTEJKChVSU5UMTYpMHhGRDgwKQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ1VSUkVOVFRYUkFURTIJKChVSU5UMTYpMHhGRDgxKQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ1VSUkVOVFRYUkFURTMJKChVSU5UMTYpMHhGRDgyKQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ1VSUkVOVFRYUkFURTQJKChVSU5UMTYpMHhGRDgzKQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ1VSUkVOVFRYUkFURTUJKChVSU5UMTYpMHhGRDg0KQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ1VSUkVOVFRYUkFURTYJKChVSU5UMTYpMHhGRDg1KQotI2RlZmluZQkJSEZBMzg0eF9SSURfT1dOTUFDQUREUkVTUwkoKFVJTlQxNikweEZEODYpCi0vLyAjZGVmaW5lCUhGQTM4NHhfUklEX1BDRklORk8JCSgoVUlOVDE2KTB4RkQ4NykKLSNkZWZpbmUJCUhGQTM4NHhfUklEX1NDQU5SRVNVTFRTICAgICAgIAkoKFVJTlQxNikweEZEODgpIC8vIE5FVwotI2RlZmluZQkJSEZBMzg0eF9SSURfSE9TVFNDQU5SRVNVTFRTICAgCSgoVUlOVDE2KTB4RkQ4OSkgLy8gTkVXCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9BVVRIRU5USUNBVElPTlVTRUQJKChVSU5UMTYpMHhGRDhBKSAvLyBORVcKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0FTU09DSUFURUZBSUxVUkUgIAkoKFVJTlQxNikweEZEOEQpIC8vIDEuOC4wCisjZGVmaW5lCQlIRkEzODR4X1JJRF9QT1JUU1RBVFVTCQkoKHUxNikweEZENDApCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DVVJSRU5UU1NJRAkJKCh1MTYpMHhGRDQxKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ1VSUkVOVEJTU0lECSgodTE2KTB4RkQ0MikKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NPTU1TUVVBTElUWQkoKHUxNikweEZENDMpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DVVJSRU5UVFhSQVRFCSgodTE2KTB4RkQ0NCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NVUlJFTlRCQ05pbnQJKCh1MTYpMHhGRDQ1KQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ1VSUkVOVFNDQUxFVEhSRVNICSgodTE2KTB4RkQ0NikKKyNkZWZpbmUJCUhGQTM4NHhfUklEX1BST1RPQ09MUlNQVElNRQkoKHUxNikweEZENDcpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9TSE9SVFJFVFJZTElNSVQJKCh1MTYpMHhGRDQ4KQorI2RlZmluZQkJSEZBMzg0eF9SSURfTE9OR1JFVFJZTElNSVQJKCh1MTYpMHhGRDQ5KQorI2RlZmluZQkJSEZBMzg0eF9SSURfTUFYVFhMSUZFVElNRQkoKHUxNikweEZENEEpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9NQVhSWExJRkVUSU1FCSgodTE2KTB4RkQ0QikKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NGUE9MTEFCTEUJCSgodTE2KTB4RkQ0QykKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0FVVEhBTEdPUklUSE1TCSgodTE2KTB4RkQ0RCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX1BSSVZBQ1lPUFRJTVAJKCh1MTYpMHhGRDRGKQorI2RlZmluZQkJSEZBMzg0eF9SSURfREJNQ09NTVNRVUFMSVRZCSgodTE2KTB4RkQ1MSkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NVUlJFTlRUWFJBVEUxCSgodTE2KTB4RkQ4MCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NVUlJFTlRUWFJBVEUyCSgodTE2KTB4RkQ4MSkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NVUlJFTlRUWFJBVEUzCSgodTE2KTB4RkQ4MikKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NVUlJFTlRUWFJBVEU0CSgodTE2KTB4RkQ4MykKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NVUlJFTlRUWFJBVEU1CSgodTE2KTB4RkQ4NCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NVUlJFTlRUWFJBVEU2CSgodTE2KTB4RkQ4NSkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX09XTk1BQ0FERFJFU1MJKCh1MTYpMHhGRDg2KQorLy8gI2RlZmluZQlIRkEzODR4X1JJRF9QQ0ZJTkZPCQkoKHUxNikweEZEODcpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9TQ0FOUkVTVUxUUyAgICAgICAJKCh1MTYpMHhGRDg4KSAvLyBORVcKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0hPU1RTQ0FOUkVTVUxUUyAgIAkoKHUxNikweEZEODkpIC8vIE5FVworI2RlZmluZQkJSEZBMzg0eF9SSURfQVVUSEVOVElDQVRJT05VU0VECSgodTE2KTB4RkQ4QSkgLy8gTkVXCisjZGVmaW5lCQlIRkEzODR4X1JJRF9BU1NPQ0lBVEVGQUlMVVJFICAJKCh1MTYpMHhGRDhEKSAvLyAxLjguMAogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBJbmZvcm1hdGlvbiBSSUQgTGVuZ3RoczogIE1BQyBJbmZvcm1hdGlvbgogICBUaGlzIGlzIHRoZSBsZW5ndGggb2YgSlVTVCB0aGUgREFUQSBwYXJ0IG9mIHRoZSBSSUQgKGRvZXMgbm90CiAgIGluY2x1ZGUgdGhlIGxlbiBvciBjb2RlIGZpZWxkcykKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNkZWZpbmUJCUhGQTM4NHhfUklEX1BPUlRTVEFUVVNfTEVOCQkoKFVJTlQxNikwKQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ1VSUkVOVFNTSURfTEVOCQkoKFVJTlQxNikzNCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NVUlJFTlRCU1NJRF9MRU4JCSgoVUlOVDE2KVdMQU5fQlNTSURfTEVOKQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ09NTVNRVUFMSVRZX0xFTgkJKChVSU5UMTYpc2l6ZW9mKGhmYTM4NHhfY29tbXNxdWFsaXR5X3QpKQotI2RlZmluZQkJSEZBMzg0eF9SSURfREJNQ09NTVNRVUFMSVRZX0xFTgkJKChVSU5UMTYpc2l6ZW9mKGhmYTM4NHhfZGJtY29tbXNxdWFsaXR5X3QpKQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ1VSUkVOVFRYUkFURV9MRU4JCSgoVUlOVDE2KTApCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DVVJSRU5UQkNOSU5UX0xFTgkJKChVSU5UMTYpMCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX1NUQUNVUlNDQUxFVEhSRVNIX0xFTgkoKFVJTlQxNikxMikKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0FQQ1VSU0NBTEVUSFJFU0hfTEVOCSgoVUlOVDE2KTYpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9QUk9UT0NPTFJTUFRJTUVfTEVOCQkoKFVJTlQxNikwKQotI2RlZmluZQkJSEZBMzg0eF9SSURfU0hPUlRSRVRSWUxJTUlUX0xFTgkJKChVSU5UMTYpMCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0xPTkdSRVRSWUxJTUlUX0xFTgkJKChVSU5UMTYpMCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX01BWFRYTElGRVRJTUVfTEVOCQkoKFVJTlQxNikwKQotI2RlZmluZQkJSEZBMzg0eF9SSURfTUFYUlhMSUZFVElNRV9MRU4JCSgoVUlOVDE2KTApCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DRlBPTExBQkxFX0xFTgkJKChVSU5UMTYpMCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0FVVEhBTEdPUklUSE1TX0xFTgkJKChVSU5UMTYpNCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX1BSSVZBQ1lPUFRJTVBfTEVOCQkoKFVJTlQxNikwKQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ1VSUkVOVFRYUkFURTFfTEVOCQkoKFVJTlQxNikwKQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ1VSUkVOVFRYUkFURTJfTEVOCQkoKFVJTlQxNikwKQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ1VSUkVOVFRYUkFURTNfTEVOCQkoKFVJTlQxNikwKQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ1VSUkVOVFRYUkFURTRfTEVOCQkoKFVJTlQxNikwKQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ1VSUkVOVFRYUkFURTVfTEVOCQkoKFVJTlQxNikwKQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ1VSUkVOVFRYUkFURTZfTEVOCQkoKFVJTlQxNikwKQotI2RlZmluZQkJSEZBMzg0eF9SSURfT1dOTUFDQUREUkVTU19MRU4JCSgoVUlOVDE2KTYpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9QQ0ZJTkZPX0xFTgkJCSgoVUlOVDE2KTYpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZBUFBDRklORk9fTEVOCQkoKFVJTlQxNilzaXplb2YoaGZhMzg0eF9QQ0ZJbmZvX2RhdGFfdCkpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9TQ0FOUkVRVUVTVF9MRU4JCSgoVUlOVDE2KXNpemVvZihoZmEzODR4X1NjYW5SZXF1ZXN0X2RhdGFfdCkpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9KT0lOUkVRVUVTVF9MRU4JCSgoVUlOVDE2KXNpemVvZihoZmEzODR4X0pvaW5SZXF1ZXN0X2RhdGFfdCkpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9BVVRIRU5USUNBVEVTVEFfTEVOCQkoKFVJTlQxNilzaXplb2YoaGZhMzg0eF9hdXRoZW50aWNhdGVTdGF0aW9uX2RhdGFfdCkpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DSEFOTkVMSU5GT1JFUVVFU1RfTEVOCSgoVUlOVDE2KXNpemVvZihoZmEzODR4X0NoYW5uZWxJbmZvUmVxdWVzdF9kYXRhX3QpKQorI2RlZmluZQkJSEZBMzg0eF9SSURfUE9SVFNUQVRVU19MRU4JCSgodTE2KTApCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DVVJSRU5UU1NJRF9MRU4JCSgodTE2KTM0KQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ1VSUkVOVEJTU0lEX0xFTgkJKCh1MTYpV0xBTl9CU1NJRF9MRU4pCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DT01NU1FVQUxJVFlfTEVOCQkoKHUxNilzaXplb2YoaGZhMzg0eF9jb21tc3F1YWxpdHlfdCkpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9EQk1DT01NU1FVQUxJVFlfTEVOCQkoKHUxNilzaXplb2YoaGZhMzg0eF9kYm1jb21tc3F1YWxpdHlfdCkpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DVVJSRU5UVFhSQVRFX0xFTgkJKCh1MTYpMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NVUlJFTlRCQ05pbnRfTEVOCQkoKHUxNikwKQorI2RlZmluZQkJSEZBMzg0eF9SSURfU1RBQ1VSU0NBTEVUSFJFU0hfTEVOCSgodTE2KTEyKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQVBDVVJTQ0FMRVRIUkVTSF9MRU4JKCh1MTYpNikKKyNkZWZpbmUJCUhGQTM4NHhfUklEX1BST1RPQ09MUlNQVElNRV9MRU4JCSgodTE2KTApCisjZGVmaW5lCQlIRkEzODR4X1JJRF9TSE9SVFJFVFJZTElNSVRfTEVOCQkoKHUxNikwKQorI2RlZmluZQkJSEZBMzg0eF9SSURfTE9OR1JFVFJZTElNSVRfTEVOCQkoKHUxNikwKQorI2RlZmluZQkJSEZBMzg0eF9SSURfTUFYVFhMSUZFVElNRV9MRU4JCSgodTE2KTApCisjZGVmaW5lCQlIRkEzODR4X1JJRF9NQVhSWExJRkVUSU1FX0xFTgkJKCh1MTYpMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NGUE9MTEFCTEVfTEVOCQkoKHUxNikwKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQVVUSEFMR09SSVRITVNfTEVOCQkoKHUxNik0KQorI2RlZmluZQkJSEZBMzg0eF9SSURfUFJJVkFDWU9QVElNUF9MRU4JCSgodTE2KTApCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DVVJSRU5UVFhSQVRFMV9MRU4JCSgodTE2KTApCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DVVJSRU5UVFhSQVRFMl9MRU4JCSgodTE2KTApCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DVVJSRU5UVFhSQVRFM19MRU4JCSgodTE2KTApCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DVVJSRU5UVFhSQVRFNF9MRU4JCSgodTE2KTApCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DVVJSRU5UVFhSQVRFNV9MRU4JCSgodTE2KTApCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DVVJSRU5UVFhSQVRFNl9MRU4JCSgodTE2KTApCisjZGVmaW5lCQlIRkEzODR4X1JJRF9PV05NQUNBRERSRVNTX0xFTgkJKCh1MTYpNikKKyNkZWZpbmUJCUhGQTM4NHhfUklEX1BDRklORk9fTEVOCQkJKCh1MTYpNikKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORkFQUENGSU5GT19MRU4JCSgodTE2KXNpemVvZihoZmEzODR4X1BDRkluZm9fZGF0YV90KSkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX1NDQU5SRVFVRVNUX0xFTgkJKCh1MTYpc2l6ZW9mKGhmYTM4NHhfU2NhblJlcXVlc3RfZGF0YV90KSkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0pPSU5SRVFVRVNUX0xFTgkJKCh1MTYpc2l6ZW9mKGhmYTM4NHhfSm9pblJlcXVlc3RfZGF0YV90KSkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0FVVEhFTlRJQ0FURVNUQV9MRU4JCSgodTE2KXNpemVvZihoZmEzODR4X2F1dGhlbnRpY2F0ZVN0YXRpb25fZGF0YV90KSkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NIQU5ORUxJTkZPUkVRVUVTVF9MRU4JKCh1MTYpc2l6ZW9mKGhmYTM4NHhfQ2hhbm5lbEluZm9SZXF1ZXN0X2RhdGFfdCkpCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBJbmZvcm1hdGlvbiBSSURzOiAgTW9kZW0gSW5mb3JtYXRpb24KIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNkZWZpbmUJCUhGQTM4NHhfUklEX1BIWVRZUEUJCSgoVUlOVDE2KTB4RkRDMCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NVUlJFTlRDSEFOTkVMCSgoVUlOVDE2KTB4RkRDMSkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NVUlJFTlRQT1dFUlNUQVRFCSgoVUlOVDE2KTB4RkRDMikKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NDQU1PREUJCSgoVUlOVDE2KTB4RkRDMykKLSNkZWZpbmUJCUhGQTM4NHhfUklEX1NVUFBPUlRFRERBVEFSQVRFUwkoKFVJTlQxNikweEZEQzYpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9MRk9TVEFUVVMgICAgICAgICAgICgoVUlOVDE2KTB4RkRDNykgLy8gMS43LjEKKyNkZWZpbmUJCUhGQTM4NHhfUklEX1BIWVRZUEUJCSgodTE2KTB4RkRDMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NVUlJFTlRDSEFOTkVMCSgodTE2KTB4RkRDMSkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NVUlJFTlRQT1dFUlNUQVRFCSgodTE2KTB4RkRDMikKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NDQU1PREUJCSgodTE2KTB4RkRDMykKKyNkZWZpbmUJCUhGQTM4NHhfUklEX1NVUFBPUlRFRERBVEFSQVRFUwkoKHUxNikweEZEQzYpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9MRk9TVEFUVVMgICAgICAgICAgICgodTE2KTB4RkRDNykgLy8gMS43LjEKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogSW5mb3JtYXRpb24gUklEIExlbmd0aHM6ICBNb2RlbSBJbmZvcm1hdGlvbgogICBUaGlzIGlzIHRoZSBsZW5ndGggb2YgSlVTVCB0aGUgREFUQSBwYXJ0IG9mIHRoZSBSSUQgKGRvZXMgbm90CiAgIGluY2x1ZGUgdGhlIGxlbiBvciBjb2RlIGZpZWxkcykKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNkZWZpbmUJCUhGQTM4NHhfUklEX1BIWVRZUEVfTEVOCQkJKChVSU5UMTYpMCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NVUlJFTlRDSEFOTkVMX0xFTgkJKChVSU5UMTYpMCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NVUlJFTlRQT1dFUlNUQVRFX0xFTgkoKFVJTlQxNikwKQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ0NBTU9ERV9MRU4JCQkoKFVJTlQxNikwKQotI2RlZmluZQkJSEZBMzg0eF9SSURfU1VQUE9SVEVEREFUQVJBVEVTX0xFTgkoKFVJTlQxNikxMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX1BIWVRZUEVfTEVOCQkJKCh1MTYpMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NVUlJFTlRDSEFOTkVMX0xFTgkJKCh1MTYpMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NVUlJFTlRQT1dFUlNUQVRFX0xFTgkoKHUxNikwKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ0NBTU9ERV9MRU4JCQkoKHUxNikwKQorI2RlZmluZQkJSEZBMzg0eF9SSURfU1VQUE9SVEVEREFUQVJBVEVTX0xFTgkoKHUxNikxMCkKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogQVBJIEVOSEFOQ0VNRU5UUyAoTk9UIEFMUkVBRFkgSU1QTEVNRU5URUQpCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZXRVBERUZBVUxUS0VZSUQJKChVSU5UMTYpMHhGQzIzKQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GV0VQREVGQVVMVEtFWTAJKChVSU5UMTYpMHhGQzI0KQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GV0VQREVGQVVMVEtFWTEJKChVSU5UMTYpMHhGQzI1KQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GV0VQREVGQVVMVEtFWTIJKChVSU5UMTYpMHhGQzI2KQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GV0VQREVGQVVMVEtFWTMJKChVSU5UMTYpMHhGQzI3KQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GV0VQRkxBR1MJCSgoVUlOVDE2KTB4RkMyOCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NORldFUEtFWU1BUFRBQkxFCSgoVUlOVDE2KTB4RkMyOSkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NORkFVVEhFTlRJQ0FUSU9OCSgoVUlOVDE2KTB4RkMyQSkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NORk1BWEFTU09DU1RBVElPTlMJKChVSU5UMTYpMHhGQzJCKQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GVFhDT05UUk9MCSgoVUlOVDE2KTB4RkMyQykKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NORlJPQU1JTkdNT0RFCSgoVUlOVDE2KTB4RkMyRCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NORkhPU1RBVVRIQVNTT0MJKChVSU5UMTYpMHhGQzJFKQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GUkNWQ1JDRVJST1IJKChVSU5UMTYpMHhGQzMwKQotLy8gI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GTU1MSUZFCQkoKFVJTlQxNikweEZDMzEpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZBTFRSRVRSWUNOVAkoKFVJTlQxNikweEZDMzIpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZBUEJDTklOVAkJKChVSU5UMTYpMHhGQzMzKQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GQVBQQ0ZJTkZPCSgoVUlOVDE2KTB4RkMzNCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NORlNUQVBDRklORk8JKChVSU5UMTYpMHhGQzM1KQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GUFJJT1JJVFlRVVNBR0UJKChVSU5UMTYpMHhGQzM3KQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GVElNQ1RSTAkJKChVSU5UMTYpMHhGQzQwKQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GVEhJUlRZMlRBTExZCSgoVUlOVDE2KTB4RkM0MikKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NORkVOSFNFQ1VSSVRZCSgoVUlOVDE2KTB4RkM0MykKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NORkRCTUFESlVTVCAgCSgoVUlOVDE2KTB4RkM0NikgLy8gTkVXCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZXUEFEQVRBICAgICAgIAkoKFVJTlQxNikweEZDNDgpIC8vIDEuNy4wCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZQUk9QT0dBVElPTkRFTEFZCSgoVUlOVDE2KTB4RkM0OSkgLy8gMS43LjYKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NORlNIT1JUUFJFQU1CTEUJKChVSU5UMTYpMHhGQ0IwKQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GRVhDTE9OR1BSRUFNQkxFCSgoVUlOVDE2KTB4RkNCMSkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NORkFVVEhSU1BUSU1FT1VUCSgoVUlOVDE2KTB4RkNCMikKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NORkJBU0lDUkFURVMJKChVSU5UMTYpMHhGQ0IzKQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GU1VQUFJBVEVTCSgoVUlOVDE2KTB4RkNCNCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NORkZBTExCQUNLQ1RSTAkoKFVJTlQxNikweEZDQjUpIC8vIE5FVwotI2RlZmluZQkJSEZBMzg0eF9SSURfV0VQS0VZU1RBVFVTICAgCSgoVUlOVDE2KTB4RkNCNikgLy8gTkVXCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9XRVBLRVlNQVBJTkRFWCAJKChVSU5UMTYpMHhGQ0I3KSAvLyBORVcKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0JST0FEQ0FTVEtFWUlEIAkoKFVJTlQxNikweEZDQjgpIC8vIE5FVwotI2RlZmluZQkJSEZBMzg0eF9SSURfRU5UU0VDRkxBR0VZSUQgCSgoVUlOVDE2KTB4RkNCOSkgLy8gTkVXCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZQQVNTSVZFU0NBTkNUUkwJKChVSU5UMTYpMHhGQ0JBKSAvLyBORVcgU1RBCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZXUEFIQU5ETElORwkoKFVJTlQxNikweEZDQkIpIC8vIDEuNy4wCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9NRENDT05UUk9MICAgICAgICAJKChVSU5UMTYpMHhGQ0JDKSAvLyAxLjcuMC8xLjQuMAotI2RlZmluZQkJSEZBMzg0eF9SSURfTURDQ09VTlRSWSAgICAgICAgCSgoVUlOVDE2KTB4RkNCRCkgLy8gMS43LjAvMS40LjAKLSNkZWZpbmUJCUhGQTM4NHhfUklEX1RYUE9XRVJNQVggICAgICAgIAkoKFVJTlQxNikweEZDQkUpIC8vIDEuNy4wLzEuNC4wCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZMRk9FTkJMRUQgICAgICAJKChVSU5UMTYpMHhGQ0JGKSAvLyAxLjYuMwotI2RlZmluZSAgICAgICAgIEhGQTM4NHhfUklEX0NBUElORk8gICAgICAgICAgICAgKChVSU5UMTYpMHhGQ0MwKSAvLyAxLjcuMC8xLjMuNwotI2RlZmluZSAgICAgICAgIEhGQTM4NHhfUklEX0xJU1RFTklOVEVSVkFMICAgICAgKChVSU5UMTYpMHhGQ0MxKSAvLyAxLjcuMC8xLjMuNwotI2RlZmluZSAgICAgICAgIEhGQTM4NHhfUklEX0RJVkVSU0lUWUVOQUJMRUQgICAgKChVSU5UMTYpMHhGQ0MyKSAvLyAxLjcuMC8xLjMuNwotI2RlZmluZSAgICAgICAgIEhGQTM4NHhfUklEX0xFRF9DT05UUk9MICAgICAgICAgKChVSU5UMTYpMHhGQ0M0KSAvLyAxLjcuNgotI2RlZmluZSAgICAgICAgIEhGQTM4NHhfUklEX0hGT19ERUxBWSAgICAgICAgICAgKChVSU5UMTYpMHhGQ0M1KSAvLyAxLjcuNgotI2RlZmluZSAgICAgICAgIEhGQTM4NHhfUklEX0RJU1NBTE9XRURCU1NJRCAgICAgKChVSU5UMTYpMHhGQ0M2KSAvLyAxLjguMAotI2RlZmluZQkJSEZBMzg0eF9SSURfU0NBTlJFUVVFU1QJCSgoVUlOVDE2KTB4RkNFMSkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0pPSU5SRVFVRVNUCQkoKFVJTlQxNikweEZDRTIpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9BVVRIRU5USUNBVEVTVEEJKChVSU5UMTYpMHhGQ0UzKQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ0hBTk5FTElORk9SRVFVRVNUCSgoVUlOVDE2KTB4RkNFNCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0hPU1RTQ0FOICAgICAgICAgIAkoKFVJTlQxNikweEZDRTUpIC8vIE5FVyBTVEEKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0FTU09DSUFURVNUQQkoKFVJTlQxNikweEZDRTYpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZXRVBERUZBVUxUS0VZSUQJKCh1MTYpMHhGQzIzKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GV0VQREVGQVVMVEtFWTAJKCh1MTYpMHhGQzI0KQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GV0VQREVGQVVMVEtFWTEJKCh1MTYpMHhGQzI1KQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GV0VQREVGQVVMVEtFWTIJKCh1MTYpMHhGQzI2KQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GV0VQREVGQVVMVEtFWTMJKCh1MTYpMHhGQzI3KQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GV0VQRkxBR1MJCSgodTE2KTB4RkMyOCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORldFUEtFWU1BUFRBQkxFCSgodTE2KTB4RkMyOSkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORkFVVEhFTlRJQ0FUSU9OCSgodTE2KTB4RkMyQSkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORk1BWEFTU09DU1RBVElPTlMJKCh1MTYpMHhGQzJCKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GVFhDT05UUk9MCSgodTE2KTB4RkMyQykKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORlJPQU1JTkdNT0RFCSgodTE2KTB4RkMyRCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORkhPU1RBVVRIQVNTT0MJKCh1MTYpMHhGQzJFKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GUkNWQ1JDRVJST1IJKCh1MTYpMHhGQzMwKQorLy8gI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GTU1MSUZFCQkoKHUxNikweEZDMzEpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZBTFRSRVRSWUNOVAkoKHUxNikweEZDMzIpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZBUEJDTmludAkJKCh1MTYpMHhGQzMzKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GQVBQQ0ZJTkZPCSgodTE2KTB4RkMzNCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORlNUQVBDRklORk8JKCh1MTYpMHhGQzM1KQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GUFJJT1JJVFlRVVNBR0UJKCh1MTYpMHhGQzM3KQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GVElNQ1RSTAkJKCh1MTYpMHhGQzQwKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GVEhJUlRZMlRBTExZCSgodTE2KTB4RkM0MikKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORkVOSFNFQ1VSSVRZCSgodTE2KTB4RkM0MykKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORkRCTUFESlVTVCAgCSgodTE2KTB4RkM0NikgLy8gTkVXCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZXUEFEQVRBICAgICAgIAkoKHUxNikweEZDNDgpIC8vIDEuNy4wCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZQUk9QT0dBVElPTkRFTEFZCSgodTE2KTB4RkM0OSkgLy8gMS43LjYKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORlNIT1JUUFJFQU1CTEUJKCh1MTYpMHhGQ0IwKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GRVhDTE9OR1BSRUFNQkxFCSgodTE2KTB4RkNCMSkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORkFVVEhSU1BUSU1FT1VUCSgodTE2KTB4RkNCMikKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORkJBU0lDUkFURVMJKCh1MTYpMHhGQ0IzKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GU1VQUFJBVEVTCSgodTE2KTB4RkNCNCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORkZBTExCQUNLQ1RSTAkoKHUxNikweEZDQjUpIC8vIE5FVworI2RlZmluZQkJSEZBMzg0eF9SSURfV0VQS0VZU1RBVFVTICAgCSgodTE2KTB4RkNCNikgLy8gTkVXCisjZGVmaW5lCQlIRkEzODR4X1JJRF9XRVBLRVlNQVBJTkRFWCAJKCh1MTYpMHhGQ0I3KSAvLyBORVcKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0JST0FEQ0FTVEtFWUlEIAkoKHUxNikweEZDQjgpIC8vIE5FVworI2RlZmluZQkJSEZBMzg0eF9SSURfRU5UU0VDRkxBR0VZSUQgCSgodTE2KTB4RkNCOSkgLy8gTkVXCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZQQVNTSVZFU0NBTkNUUkwJKCh1MTYpMHhGQ0JBKSAvLyBORVcgU1RBCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZXUEFIQU5ETElORwkoKHUxNikweEZDQkIpIC8vIDEuNy4wCisjZGVmaW5lCQlIRkEzODR4X1JJRF9NRENDT05UUk9MICAgICAgICAJKCh1MTYpMHhGQ0JDKSAvLyAxLjcuMC8xLjQuMAorI2RlZmluZQkJSEZBMzg0eF9SSURfTURDQ09VTlRSWSAgICAgICAgCSgodTE2KTB4RkNCRCkgLy8gMS43LjAvMS40LjAKKyNkZWZpbmUJCUhGQTM4NHhfUklEX1RYUE9XRVJNQVggICAgICAgIAkoKHUxNikweEZDQkUpIC8vIDEuNy4wLzEuNC4wCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZMRk9FTkJMRUQgICAgICAJKCh1MTYpMHhGQ0JGKSAvLyAxLjYuMworI2RlZmluZSAgICAgICAgIEhGQTM4NHhfUklEX0NBUElORk8gICAgICAgICAgICAgKCh1MTYpMHhGQ0MwKSAvLyAxLjcuMC8xLjMuNworI2RlZmluZSAgICAgICAgIEhGQTM4NHhfUklEX0xJU1RFTmludEVSVkFMICAgICAgKCh1MTYpMHhGQ0MxKSAvLyAxLjcuMC8xLjMuNworI2RlZmluZSAgICAgICAgIEhGQTM4NHhfUklEX0RJVkVSU0lUWUVOQUJMRUQgICAgKCh1MTYpMHhGQ0MyKSAvLyAxLjcuMC8xLjMuNworI2RlZmluZSAgICAgICAgIEhGQTM4NHhfUklEX0xFRF9DT05UUk9MICAgICAgICAgKCh1MTYpMHhGQ0M0KSAvLyAxLjcuNgorI2RlZmluZSAgICAgICAgIEhGQTM4NHhfUklEX0hGT19ERUxBWSAgICAgICAgICAgKCh1MTYpMHhGQ0M1KSAvLyAxLjcuNgorI2RlZmluZSAgICAgICAgIEhGQTM4NHhfUklEX0RJU1NBTE9XRURCU1NJRCAgICAgKCh1MTYpMHhGQ0M2KSAvLyAxLjguMAorI2RlZmluZQkJSEZBMzg0eF9SSURfU0NBTlJFUVVFU1QJCSgodTE2KTB4RkNFMSkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0pPSU5SRVFVRVNUCQkoKHUxNikweEZDRTIpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9BVVRIRU5USUNBVEVTVEEJKCh1MTYpMHhGQ0UzKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ0hBTk5FTElORk9SRVFVRVNUCSgodTE2KTB4RkNFNCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0hPU1RTQ0FOICAgICAgICAgIAkoKHUxNikweEZDRTUpIC8vIE5FVyBTVEEKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0FTU09DSUFURVNUQQkoKHUxNikweEZDRTYpCiAKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NORldFUERFRkFVTFRLRVlfTEVOCSgoVUlOVDE2KTYpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZXRVAxMjhERUZBVUxUS0VZX0xFTgkoKFVJTlQxNikxNCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NORlBSSU9RVVNBR0VfTEVOCQkoKFVJTlQxNik0KQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GV0VQREVGQVVMVEtFWV9MRU4JKCh1MTYpNikKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORldFUDEyOERFRkFVTFRLRVlfTEVOCSgodTE2KTE0KQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GUFJJT1FVU0FHRV9MRU4JCSgodTE2KTQpCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBQRCBSZWNvcmQgY29kZXMKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNkZWZpbmUgSEZBMzg0eF9QRFJfUENCX1BBUlROVU0JCSgoVUlOVDE2KTB4MDAwMSkKLSNkZWZpbmUgSEZBMzg0eF9QRFJfUERBVkVSCQkoKFVJTlQxNikweDAwMDIpCi0jZGVmaW5lIEhGQTM4NHhfUERSX05JQ19TRVJJQUwJCSgoVUlOVDE2KTB4MDAwMykKLSNkZWZpbmUgSEZBMzg0eF9QRFJfTUtLX01FQVNVUkVNRU5UUwkoKFVJTlQxNikweDAwMDQpCi0jZGVmaW5lIEhGQTM4NHhfUERSX05JQ19SQU1TSVpFCQkoKFVJTlQxNikweDAwMDUpCi0jZGVmaW5lIEhGQTM4NHhfUERSX01GSVNVUFJBTkdFCQkoKFVJTlQxNikweDAwMDYpCi0jZGVmaW5lIEhGQTM4NHhfUERSX0NGSVNVUFJBTkdFCQkoKFVJTlQxNikweDAwMDcpCi0jZGVmaW5lIEhGQTM4NHhfUERSX05JQ0lECQkoKFVJTlQxNikweDAwMDgpCi0vLyNkZWZpbmUgSEZBMzg0eF9QRFJfUkVGREFDX01FQVNVUkVNRU5UUwkoKFVJTlQxNikweDAwMTApCi0vLyNkZWZpbmUgSEZBMzg0eF9QRFJfVkdEQUNfTUVBU1VSRU1FTlRTCSgoVUlOVDE2KTB4MDAyMCkKLS8vI2RlZmluZSBIRkEzODR4X1BEUl9MRVZFTF9DT01QX01FQVNVUkVNRU5UUwkoKFVJTlQxNikweDAwMzApCi0vLyNkZWZpbmUgSEZBMzg0eF9QRFJfTU9ERU1fVFJJTURBQ19NRUFTVVJFTUVOVFMJKChVSU5UMTYpMHgwMDQwKQotLy8jZGVmaW5lIEhGQTM4NHhfUERSX0NPUkVHQV9IQUNLCQkoKFVJTlQxNikweDAwZmYpCi0jZGVmaW5lIEhGQTM4NHhfUERSX01BQ19BRERSRVNTCQkoKFVJTlQxNikweDAxMDEpCi0vLyNkZWZpbmUgSEZBMzg0eF9QRFJfTUtLX0NBTExOQU1FCSgoVUlOVDE2KTB4MDEwMikKLSNkZWZpbmUgSEZBMzg0eF9QRFJfUkVHRE9NQUlOCQkoKFVJTlQxNikweDAxMDMpCi0jZGVmaW5lIEhGQTM4NHhfUERSX0FMTE9XRURfQ0hBTk5FTAkoKFVJTlQxNikweDAxMDQpCi0jZGVmaW5lIEhGQTM4NHhfUERSX0RFRkFVTFRfQ0hBTk5FTAkoKFVJTlQxNikweDAxMDUpCi0vLyNkZWZpbmUgSEZBMzg0eF9QRFJfUFJJVkFDWV9PUFRJT04JKChVSU5UMTYpMHgwMTA2KQotI2RlZmluZSBIRkEzODR4X1BEUl9URU1QVFlQRQkJKChVSU5UMTYpMHgwMTA3KQotLy8jZGVmaW5lIEhGQTM4NHhfUERSX1JFRkRBQ19TRVRVUAkoKFVJTlQxNikweDAxMTApCi0vLyNkZWZpbmUgSEZBMzg0eF9QRFJfVkdEQUNfU0VUVVAJCSgoVUlOVDE2KTB4MDEyMCkKLS8vI2RlZmluZSBIRkEzODR4X1BEUl9MRVZFTF9DT01QX1NFVFVQCSgoVUlOVDE2KTB4MDEzMCkKLS8vI2RlZmluZSBIRkEzODR4X1BEUl9UUklNREFDX1NFVFVQCSgoVUlOVDE2KTB4MDE0MCkKLSNkZWZpbmUgSEZBMzg0eF9QRFJfSUZSX1NFVFRJTkcJCSgoVUlOVDE2KTB4MDIwMCkKLSNkZWZpbmUgSEZBMzg0eF9QRFJfUkZSX1NFVFRJTkcJCSgoVUlOVDE2KTB4MDIwMSkKLSNkZWZpbmUgSEZBMzg0eF9QRFJfSEZBMzg2MV9CQVNFTElORQkoKFVJTlQxNikweDAyMDIpCi0jZGVmaW5lIEhGQTM4NHhfUERSX0hGQTM4NjFfU0hBRE9XCSgoVUlOVDE2KTB4MDIwMykKLSNkZWZpbmUgSEZBMzg0eF9QRFJfSEZBMzg2MV9JRlJGCSgoVUlOVDE2KTB4MDIwNCkKLSNkZWZpbmUgSEZBMzg0eF9QRFJfSEZBMzg2MV9DSENBTFNQCSgoVUlOVDE2KTB4MDMwMCkKLSNkZWZpbmUgSEZBMzg0eF9QRFJfSEZBMzg2MV9DSENBTEkJKChVSU5UMTYpMHgwMzAxKQotI2RlZmluZSBIRkEzODR4X1BEUl9NQVhfVFhfUE9XRVIgIAkoKFVJTlQxNikweDAzMDIpCi0jZGVmaW5lIEhGQTM4NHhfUERSX01BU1RFUl9DSEFOX0xJU1QJKChVSU5UMTYpMHgwMzAzKQotI2RlZmluZSBIRkEzODR4X1BEUl8zODQyX05JQ19DT05GSUcJKChVSU5UMTYpMHgwNDAwKQotI2RlZmluZSBIRkEzODR4X1BEUl9VU0JfSUQJCSgoVUlOVDE2KTB4MDQwMSkKLSNkZWZpbmUgSEZBMzg0eF9QRFJfUENJX0lECQkoKFVJTlQxNikweDA0MDIpCi0jZGVmaW5lIEhGQTM4NHhfUERSX1BDSV9JRkNPTkYJCSgoVUlOVDE2KTB4MDQwMykKLSNkZWZpbmUgSEZBMzg0eF9QRFJfUENJX1BNQ09ORgkJKChVSU5UMTYpMHgwNDA0KQotI2RlZmluZSBIRkEzODR4X1BEUl9SRkVOUkdZCQkoKFVJTlQxNikweDA0MDYpCi0jZGVmaW5lIEhGQTM4NHhfUERSX1VTQl9QT1dFUl9UWVBFICAgICAgKChVSU5UMTYpMHgwNDA3KQotLy8jZGVmaW5lIEhGQTM4NHhfUERSX1VOS05PV040MDgJCSgoVUlOVDE2KTB4MDQwOCkKLSNkZWZpbmUgSEZBMzg0eF9QRFJfVVNCX01BWF9QT1dFUgkoKFVJTlQxNikweDA0MDkpCi0jZGVmaW5lIEhGQTM4NHhfUERSX1VTQl9NQU5VRkFDVFVSRVIJKChVSU5UMTYpMHgwNDEwKQotI2RlZmluZSBIRkEzODR4X1BEUl9VU0JfUFJPRFVDVCAgCSgoVUlOVDE2KTB4MDQxMSkKLSNkZWZpbmUgSEZBMzg0eF9QRFJfQU5UX0RJVkVSU0lUWSAgIAkoKFVJTlQxNikweDA0MTIpCi0jZGVmaW5lIEhGQTM4NHhfUERSX0hGT19ERUxBWSAgICAgICAJKChVSU5UMTYpMHgwNDEzKQotI2RlZmluZSBIRkEzODR4X1BEUl9TQ0FMRV9USFJFU0ggCSgoVUlOVDE2KTB4MDQxNCkKKyNkZWZpbmUgSEZBMzg0eF9QRFJfUENCX1BBUlROVU0JCSgodTE2KTB4MDAwMSkKKyNkZWZpbmUgSEZBMzg0eF9QRFJfUERBVkVSCQkoKHUxNikweDAwMDIpCisjZGVmaW5lIEhGQTM4NHhfUERSX05JQ19TRVJJQUwJCSgodTE2KTB4MDAwMykKKyNkZWZpbmUgSEZBMzg0eF9QRFJfTUtLX01FQVNVUkVNRU5UUwkoKHUxNikweDAwMDQpCisjZGVmaW5lIEhGQTM4NHhfUERSX05JQ19SQU1TSVpFCQkoKHUxNikweDAwMDUpCisjZGVmaW5lIEhGQTM4NHhfUERSX01GSVNVUFJBTkdFCQkoKHUxNikweDAwMDYpCisjZGVmaW5lIEhGQTM4NHhfUERSX0NGSVNVUFJBTkdFCQkoKHUxNikweDAwMDcpCisjZGVmaW5lIEhGQTM4NHhfUERSX05JQ0lECQkoKHUxNikweDAwMDgpCisvLyNkZWZpbmUgSEZBMzg0eF9QRFJfUkVGREFDX01FQVNVUkVNRU5UUwkoKHUxNikweDAwMTApCisvLyNkZWZpbmUgSEZBMzg0eF9QRFJfVkdEQUNfTUVBU1VSRU1FTlRTCSgodTE2KTB4MDAyMCkKKy8vI2RlZmluZSBIRkEzODR4X1BEUl9MRVZFTF9DT01QX01FQVNVUkVNRU5UUwkoKHUxNikweDAwMzApCisvLyNkZWZpbmUgSEZBMzg0eF9QRFJfTU9ERU1fVFJJTURBQ19NRUFTVVJFTUVOVFMJKCh1MTYpMHgwMDQwKQorLy8jZGVmaW5lIEhGQTM4NHhfUERSX0NPUkVHQV9IQUNLCQkoKHUxNikweDAwZmYpCisjZGVmaW5lIEhGQTM4NHhfUERSX01BQ19BRERSRVNTCQkoKHUxNikweDAxMDEpCisvLyNkZWZpbmUgSEZBMzg0eF9QRFJfTUtLX0NBTExOQU1FCSgodTE2KTB4MDEwMikKKyNkZWZpbmUgSEZBMzg0eF9QRFJfUkVHRE9NQUlOCQkoKHUxNikweDAxMDMpCisjZGVmaW5lIEhGQTM4NHhfUERSX0FMTE9XRURfQ0hBTk5FTAkoKHUxNikweDAxMDQpCisjZGVmaW5lIEhGQTM4NHhfUERSX0RFRkFVTFRfQ0hBTk5FTAkoKHUxNikweDAxMDUpCisvLyNkZWZpbmUgSEZBMzg0eF9QRFJfUFJJVkFDWV9PUFRJT04JKCh1MTYpMHgwMTA2KQorI2RlZmluZSBIRkEzODR4X1BEUl9URU1QVFlQRQkJKCh1MTYpMHgwMTA3KQorLy8jZGVmaW5lIEhGQTM4NHhfUERSX1JFRkRBQ19TRVRVUAkoKHUxNikweDAxMTApCisvLyNkZWZpbmUgSEZBMzg0eF9QRFJfVkdEQUNfU0VUVVAJCSgodTE2KTB4MDEyMCkKKy8vI2RlZmluZSBIRkEzODR4X1BEUl9MRVZFTF9DT01QX1NFVFVQCSgodTE2KTB4MDEzMCkKKy8vI2RlZmluZSBIRkEzODR4X1BEUl9UUklNREFDX1NFVFVQCSgodTE2KTB4MDE0MCkKKyNkZWZpbmUgSEZBMzg0eF9QRFJfSUZSX1NFVFRJTkcJCSgodTE2KTB4MDIwMCkKKyNkZWZpbmUgSEZBMzg0eF9QRFJfUkZSX1NFVFRJTkcJCSgodTE2KTB4MDIwMSkKKyNkZWZpbmUgSEZBMzg0eF9QRFJfSEZBMzg2MV9CQVNFTElORQkoKHUxNikweDAyMDIpCisjZGVmaW5lIEhGQTM4NHhfUERSX0hGQTM4NjFfU0hBRE9XCSgodTE2KTB4MDIwMykKKyNkZWZpbmUgSEZBMzg0eF9QRFJfSEZBMzg2MV9JRlJGCSgodTE2KTB4MDIwNCkKKyNkZWZpbmUgSEZBMzg0eF9QRFJfSEZBMzg2MV9DSENBTFNQCSgodTE2KTB4MDMwMCkKKyNkZWZpbmUgSEZBMzg0eF9QRFJfSEZBMzg2MV9DSENBTEkJKCh1MTYpMHgwMzAxKQorI2RlZmluZSBIRkEzODR4X1BEUl9NQVhfVFhfUE9XRVIgIAkoKHUxNikweDAzMDIpCisjZGVmaW5lIEhGQTM4NHhfUERSX01BU1RFUl9DSEFOX0xJU1QJKCh1MTYpMHgwMzAzKQorI2RlZmluZSBIRkEzODR4X1BEUl8zODQyX05JQ19DT05GSUcJKCh1MTYpMHgwNDAwKQorI2RlZmluZSBIRkEzODR4X1BEUl9VU0JfSUQJCSgodTE2KTB4MDQwMSkKKyNkZWZpbmUgSEZBMzg0eF9QRFJfUENJX0lECQkoKHUxNikweDA0MDIpCisjZGVmaW5lIEhGQTM4NHhfUERSX1BDSV9JRkNPTkYJCSgodTE2KTB4MDQwMykKKyNkZWZpbmUgSEZBMzg0eF9QRFJfUENJX1BNQ09ORgkJKCh1MTYpMHgwNDA0KQorI2RlZmluZSBIRkEzODR4X1BEUl9SRkVOUkdZCQkoKHUxNikweDA0MDYpCisjZGVmaW5lIEhGQTM4NHhfUERSX1VTQl9QT1dFUl9UWVBFICAgICAgKCh1MTYpMHgwNDA3KQorLy8jZGVmaW5lIEhGQTM4NHhfUERSX1VOS05PV040MDgJCSgodTE2KTB4MDQwOCkKKyNkZWZpbmUgSEZBMzg0eF9QRFJfVVNCX01BWF9QT1dFUgkoKHUxNikweDA0MDkpCisjZGVmaW5lIEhGQTM4NHhfUERSX1VTQl9NQU5VRkFDVFVSRVIJKCh1MTYpMHgwNDEwKQorI2RlZmluZSBIRkEzODR4X1BEUl9VU0JfUFJPRFVDVCAgCSgodTE2KTB4MDQxMSkKKyNkZWZpbmUgSEZBMzg0eF9QRFJfQU5UX0RJVkVSU0lUWSAgIAkoKHUxNikweDA0MTIpCisjZGVmaW5lIEhGQTM4NHhfUERSX0hGT19ERUxBWSAgICAgICAJKCh1MTYpMHgwNDEzKQorI2RlZmluZSBIRkEzODR4X1BEUl9TQ0FMRV9USFJFU0ggCSgodTE2KTB4MDQxNCkKIAotI2RlZmluZSBIRkEzODR4X1BEUl9IRkEzODYxX01BTkZfVEVTVFNQCSgoVUlOVDE2KTB4MDkwMCkKLSNkZWZpbmUgSEZBMzg0eF9QRFJfSEZBMzg2MV9NQU5GX1RFU1RJCSgoVUlOVDE2KTB4MDkwMSkKLSNkZWZpbmUgSEZBMzg0eF9QRFJfRU5EX09GX1BEQQkJKChVSU5UMTYpMHgwMDAwKQorI2RlZmluZSBIRkEzODR4X1BEUl9IRkEzODYxX01BTkZfVEVTVFNQCSgodTE2KTB4MDkwMCkKKyNkZWZpbmUgSEZBMzg0eF9QRFJfSEZBMzg2MV9NQU5GX1RFU1RJCSgodTE2KTB4MDkwMSkKKyNkZWZpbmUgSEZBMzg0eF9QRFJfRU5EX09GX1BEQQkJKCh1MTYpMHgwMDAwKQogCiAKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCkBAIC04MDIsNyArNzY2LDcgQEAKICNkZWZpbmUJCUhGQTM4NHhfT0ZGU0VUMQkJSEZBMzg0eF9PRkZTRVQxX09GRgogI2RlZmluZQkJSEZBMzg0eF9EQVRBMQkJSEZBMzg0eF9EQVRBMV9PRkYKICNkZWZpbmUJCUhGQTM4NHhfRVZTVEFUCQlIRkEzODR4X0VWU1RBVF9PRkYKLSNkZWZpbmUJCUhGQTM4NHhfSU5URU4JCUhGQTM4NHhfSU5URU5fT0ZGCisjZGVmaW5lCQlIRkEzODR4X2ludEVOCQlIRkEzODR4X0lOVEVOX09GRgogI2RlZmluZQkJSEZBMzg0eF9FVkFDSwkJSEZBMzg0eF9FVkFDS19PRkYKICNkZWZpbmUJCUhGQTM4NHhfQ09OVFJPTAkJSEZBMzg0eF9DT05UUk9MX09GRgogI2RlZmluZQkJSEZBMzg0eF9TV1NVUFBPUlQwCUhGQTM4NHhfU1dTVVBQT1JUMF9PRkYKQEAgLTgxNyw5NiArNzgxLDk2IEBACiAKIC8qLS0tIFJlZ2lzdGVyIFRlc3QvR2V0L1NldCBGaWVsZCBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAotI2RlZmluZQkJSEZBMzg0eF9DTURfSVNCVVNZKHZhbHVlKQkJKChVSU5UMTYpKCgoVUlOVDE2KXZhbHVlKSAmIEhGQTM4NHhfQ01EX0JVU1kpKQotI2RlZmluZQkJSEZBMzg0eF9DTURfQUlORk9fR0VUKHZhbHVlKQkJKChVSU5UMTYpKCgoVUlOVDE2KSh2YWx1ZSkgJiBIRkEzODR4X0NNRF9BSU5GTykgPj4gOCkpCi0jZGVmaW5lCQlIRkEzODR4X0NNRF9BSU5GT19TRVQodmFsdWUpCQkoKFVJTlQxNikoKFVJTlQxNikodmFsdWUpIDw8IDgpKQotI2RlZmluZQkJSEZBMzg0eF9DTURfTUFDUE9SVF9HRVQodmFsdWUpCQkoKFVJTlQxNikoSEZBMzg0eF9DTURfQUlORk9fR0VUKChVSU5UMTYpKHZhbHVlKSAmIEhGQTM4NHhfQ01EX01BQ1BPUlQpKSkKLSNkZWZpbmUJCUhGQTM4NHhfQ01EX01BQ1BPUlRfU0VUKHZhbHVlKQkJKChVSU5UMTYpSEZBMzg0eF9DTURfQUlORk9fU0VUKHZhbHVlKSkKLSNkZWZpbmUJCUhGQTM4NHhfQ01EX0lTUkVDTCh2YWx1ZSkJCSgoVUlOVDE2KShIRkEzODR4X0NNRF9BSU5GT19HRVQoKFVJTlQxNikodmFsdWUpICYgSEZBMzg0eF9DTURfUkVDTCkpKQotI2RlZmluZQkJSEZBMzg0eF9DTURfUkVDTF9TRVQodmFsdWUpCQkoKFVJTlQxNilIRkEzODR4X0NNRF9BSU5GT19TRVQodmFsdWUpKQotI2RlZmluZQkJSEZBMzg0eF9DTURfUU9TX0dFVCh2YWx1ZSkJCSgoVUlOVDE2KSgoKChVSU5UMTYpKHZhbHVlKSkmKChVSU5UMTYpMHgzMDAwKSkgPj4gMTIpKQotI2RlZmluZQkJSEZBMzg0eF9DTURfUU9TX1NFVCh2YWx1ZSkJCSgoVUlOVDE2KSgoKChVSU5UMTYpKHZhbHVlKSkgPDwgMTIpICYgMHgzMDAwKSkKLSNkZWZpbmUJCUhGQTM4NHhfQ01EX0lTV1JJVEUodmFsdWUpCQkoKFVJTlQxNikoSEZBMzg0eF9DTURfQUlORk9fR0VUKChVSU5UMTYpKHZhbHVlKSAmIEhGQTM4NHhfQ01EX1dSSVRFKSkpCi0jZGVmaW5lCQlIRkEzODR4X0NNRF9XUklURV9TRVQodmFsdWUpCQkoKFVJTlQxNilIRkEzODR4X0NNRF9BSU5GT19TRVQoKFVJTlQxNil2YWx1ZSkpCi0jZGVmaW5lCQlIRkEzODR4X0NNRF9QUk9HTU9ERV9HRVQodmFsdWUpCQkoKFVJTlQxNikoSEZBMzg0eF9DTURfQUlORk9fR0VUKChVSU5UMTYpKHZhbHVlKSAmIEhGQTM4NHhfQ01EX1BST0dNT0RFKSkpCi0jZGVmaW5lCQlIRkEzODR4X0NNRF9QUk9HTU9ERV9TRVQodmFsdWUpCQkoKFVJTlQxNilIRkEzODR4X0NNRF9BSU5GT19TRVQoKFVJTlQxNil2YWx1ZSkpCi0jZGVmaW5lCQlIRkEzODR4X0NNRF9DTURDT0RFX0dFVCh2YWx1ZSkJCSgoVUlOVDE2KSgoKFVJTlQxNikodmFsdWUpKSAmIEhGQTM4NHhfQ01EX0NNRENPREUpKQotI2RlZmluZQkJSEZBMzg0eF9DTURfQ01EQ09ERV9TRVQodmFsdWUpCQkoKFVJTlQxNikodmFsdWUpKQorI2RlZmluZQkJSEZBMzg0eF9DTURfSVNCVVNZKHZhbHVlKQkJKCh1MTYpKCgodTE2KXZhbHVlKSAmIEhGQTM4NHhfQ01EX0JVU1kpKQorI2RlZmluZQkJSEZBMzg0eF9DTURfQUlORk9fR0VUKHZhbHVlKQkJKCh1MTYpKCgodTE2KSh2YWx1ZSkgJiBIRkEzODR4X0NNRF9BSU5GTykgPj4gOCkpCisjZGVmaW5lCQlIRkEzODR4X0NNRF9BSU5GT19TRVQodmFsdWUpCQkoKHUxNikoKHUxNikodmFsdWUpIDw8IDgpKQorI2RlZmluZQkJSEZBMzg0eF9DTURfTUFDUE9SVF9HRVQodmFsdWUpCQkoKHUxNikoSEZBMzg0eF9DTURfQUlORk9fR0VUKCh1MTYpKHZhbHVlKSAmIEhGQTM4NHhfQ01EX01BQ1BPUlQpKSkKKyNkZWZpbmUJCUhGQTM4NHhfQ01EX01BQ1BPUlRfU0VUKHZhbHVlKQkJKCh1MTYpSEZBMzg0eF9DTURfQUlORk9fU0VUKHZhbHVlKSkKKyNkZWZpbmUJCUhGQTM4NHhfQ01EX0lTUkVDTCh2YWx1ZSkJCSgodTE2KShIRkEzODR4X0NNRF9BSU5GT19HRVQoKHUxNikodmFsdWUpICYgSEZBMzg0eF9DTURfUkVDTCkpKQorI2RlZmluZQkJSEZBMzg0eF9DTURfUkVDTF9TRVQodmFsdWUpCQkoKHUxNilIRkEzODR4X0NNRF9BSU5GT19TRVQodmFsdWUpKQorI2RlZmluZQkJSEZBMzg0eF9DTURfUU9TX0dFVCh2YWx1ZSkJCSgodTE2KSgoKCh1MTYpKHZhbHVlKSkmKCh1MTYpMHgzMDAwKSkgPj4gMTIpKQorI2RlZmluZQkJSEZBMzg0eF9DTURfUU9TX1NFVCh2YWx1ZSkJCSgodTE2KSgoKCh1MTYpKHZhbHVlKSkgPDwgMTIpICYgMHgzMDAwKSkKKyNkZWZpbmUJCUhGQTM4NHhfQ01EX0lTV1JJVEUodmFsdWUpCQkoKHUxNikoSEZBMzg0eF9DTURfQUlORk9fR0VUKCh1MTYpKHZhbHVlKSAmIEhGQTM4NHhfQ01EX1dSSVRFKSkpCisjZGVmaW5lCQlIRkEzODR4X0NNRF9XUklURV9TRVQodmFsdWUpCQkoKHUxNilIRkEzODR4X0NNRF9BSU5GT19TRVQoKHUxNil2YWx1ZSkpCisjZGVmaW5lCQlIRkEzODR4X0NNRF9QUk9HTU9ERV9HRVQodmFsdWUpCQkoKHUxNikoSEZBMzg0eF9DTURfQUlORk9fR0VUKCh1MTYpKHZhbHVlKSAmIEhGQTM4NHhfQ01EX1BST0dNT0RFKSkpCisjZGVmaW5lCQlIRkEzODR4X0NNRF9QUk9HTU9ERV9TRVQodmFsdWUpCQkoKHUxNilIRkEzODR4X0NNRF9BSU5GT19TRVQoKHUxNil2YWx1ZSkpCisjZGVmaW5lCQlIRkEzODR4X0NNRF9DTURDT0RFX0dFVCh2YWx1ZSkJCSgodTE2KSgoKHUxNikodmFsdWUpKSAmIEhGQTM4NHhfQ01EX0NNRENPREUpKQorI2RlZmluZQkJSEZBMzg0eF9DTURfQ01EQ09ERV9TRVQodmFsdWUpCQkoKHUxNikodmFsdWUpKQogCi0jZGVmaW5lCQlIRkEzODR4X1NUQVRVU19SRVNVTFRfR0VUKHZhbHVlKQkoKFVJTlQxNikoKCgoVUlOVDE2KSh2YWx1ZSkpICYgSEZBMzg0eF9TVEFUVVNfUkVTVUxUKSA+PiA4KSkKLSNkZWZpbmUJCUhGQTM4NHhfU1RBVFVTX1JFU1VMVF9TRVQodmFsdWUpCSgoKFVJTlQxNikodmFsdWUpKSA8PCA4KQotI2RlZmluZQkJSEZBMzg0eF9TVEFUVVNfQ01EQ09ERV9HRVQodmFsdWUpCSgoKFVJTlQxNikodmFsdWUpKSAmIEhGQTM4NHhfU1RBVFVTX0NNRENPREUpCi0jZGVmaW5lCQlIRkEzODR4X1NUQVRVU19DTURDT0RFX1NFVCh2YWx1ZSkJKChVSU5UMTYpKHZhbHVlKSkKKyNkZWZpbmUJCUhGQTM4NHhfU1RBVFVTX1JFU1VMVF9HRVQodmFsdWUpCSgodTE2KSgoKCh1MTYpKHZhbHVlKSkgJiBIRkEzODR4X1NUQVRVU19SRVNVTFQpID4+IDgpKQorI2RlZmluZQkJSEZBMzg0eF9TVEFUVVNfUkVTVUxUX1NFVCh2YWx1ZSkJKCgodTE2KSh2YWx1ZSkpIDw8IDgpCisjZGVmaW5lCQlIRkEzODR4X1NUQVRVU19DTURDT0RFX0dFVCh2YWx1ZSkJKCgodTE2KSh2YWx1ZSkpICYgSEZBMzg0eF9TVEFUVVNfQ01EQ09ERSkKKyNkZWZpbmUJCUhGQTM4NHhfU1RBVFVTX0NNRENPREVfU0VUKHZhbHVlKQkoKHUxNikodmFsdWUpKQogCi0jZGVmaW5lCQlIRkEzODR4X09GRlNFVF9JU0JVU1kodmFsdWUpCQkoKFVJTlQxNikoKChVSU5UMTYpKHZhbHVlKSkgJiBIRkEzODR4X09GRlNFVF9CVVNZKSkKLSNkZWZpbmUJCUhGQTM4NHhfT0ZGU0VUX0lTRVJSKHZhbHVlKQkJKChVSU5UMTYpKCgoVUlOVDE2KSh2YWx1ZSkpICYgSEZBMzg0eF9PRkZTRVRfRVJSKSkKLSNkZWZpbmUJCUhGQTM4NHhfT0ZGU0VUX0RBVEFPRkZfR0VUKHZhbHVlKQkoKFVJTlQxNikoKChVSU5UMTYpKHZhbHVlKSkgJiBIRkEzODR4X09GRlNFVF9EQVRBT0ZGKSkKLSNkZWZpbmUJCUhGQTM4NHhfT0ZGU0VUX0RBVEFPRkZfU0VUKHZhbHVlKQkoKFVJTlQxNikodmFsdWUpKQorI2RlZmluZQkJSEZBMzg0eF9PRkZTRVRfSVNCVVNZKHZhbHVlKQkJKCh1MTYpKCgodTE2KSh2YWx1ZSkpICYgSEZBMzg0eF9PRkZTRVRfQlVTWSkpCisjZGVmaW5lCQlIRkEzODR4X09GRlNFVF9JU0VSUih2YWx1ZSkJCSgodTE2KSgoKHUxNikodmFsdWUpKSAmIEhGQTM4NHhfT0ZGU0VUX0VSUikpCisjZGVmaW5lCQlIRkEzODR4X09GRlNFVF9EQVRBT0ZGX0dFVCh2YWx1ZSkJKCh1MTYpKCgodTE2KSh2YWx1ZSkpICYgSEZBMzg0eF9PRkZTRVRfREFUQU9GRikpCisjZGVmaW5lCQlIRkEzODR4X09GRlNFVF9EQVRBT0ZGX1NFVCh2YWx1ZSkJKCh1MTYpKHZhbHVlKSkKIAotI2RlZmluZQkJSEZBMzg0eF9FVlNUQVRfSVNUSUNLKHZhbHVlKQkJKChVSU5UMTYpKCgoVUlOVDE2KSh2YWx1ZSkpICYgSEZBMzg0eF9FVlNUQVRfVElDSykpCi0jZGVmaW5lCQlIRkEzODR4X0VWU1RBVF9JU1dURVJSKHZhbHVlKQkJKChVSU5UMTYpKCgoVUlOVDE2KSh2YWx1ZSkpICYgSEZBMzg0eF9FVlNUQVRfV1RFUlIpKQotI2RlZmluZQkJSEZBMzg0eF9FVlNUQVRfSVNJTkZEUk9QKHZhbHVlKQkJKChVSU5UMTYpKCgoVUlOVDE2KSh2YWx1ZSkpICYgSEZBMzg0eF9FVlNUQVRfSU5GRFJPUCkpCi0jZGVmaW5lCQlIRkEzODR4X0VWU1RBVF9JU0lORk8odmFsdWUpCQkoKFVJTlQxNikoKChVSU5UMTYpKHZhbHVlKSkgJiBIRkEzODR4X0VWU1RBVF9JTkZPKSkKLSNkZWZpbmUJCUhGQTM4NHhfRVZTVEFUX0lTRFRJTSh2YWx1ZSkJCSgoVUlOVDE2KSgoKFVJTlQxNikodmFsdWUpKSAmIEhGQTM4NHhfRVZTVEFUX0RUSU0pKQotI2RlZmluZQkJSEZBMzg0eF9FVlNUQVRfSVNDTUQodmFsdWUpCQkoKFVJTlQxNikoKChVSU5UMTYpKHZhbHVlKSkgJiBIRkEzODR4X0VWU1RBVF9DTUQpKQotI2RlZmluZQkJSEZBMzg0eF9FVlNUQVRfSVNBTExPQyh2YWx1ZSkJCSgoVUlOVDE2KSgoKFVJTlQxNikodmFsdWUpKSAmIEhGQTM4NHhfRVZTVEFUX0FMTE9DKSkKLSNkZWZpbmUJCUhGQTM4NHhfRVZTVEFUX0lTVFhFWEModmFsdWUpCQkoKFVJTlQxNikoKChVSU5UMTYpKHZhbHVlKSkgJiBIRkEzODR4X0VWU1RBVF9UWEVYQykpCi0jZGVmaW5lCQlIRkEzODR4X0VWU1RBVF9JU1RYKHZhbHVlKQkJKChVSU5UMTYpKCgoVUlOVDE2KSh2YWx1ZSkpICYgSEZBMzg0eF9FVlNUQVRfVFgpKQotI2RlZmluZQkJSEZBMzg0eF9FVlNUQVRfSVNSWCh2YWx1ZSkJCSgoVUlOVDE2KSgoKFVJTlQxNikodmFsdWUpKSAmIEhGQTM4NHhfRVZTVEFUX1JYKSkKKyNkZWZpbmUJCUhGQTM4NHhfRVZTVEFUX0lTVElDSyh2YWx1ZSkJCSgodTE2KSgoKHUxNikodmFsdWUpKSAmIEhGQTM4NHhfRVZTVEFUX1RJQ0spKQorI2RlZmluZQkJSEZBMzg0eF9FVlNUQVRfSVNXVEVSUih2YWx1ZSkJCSgodTE2KSgoKHUxNikodmFsdWUpKSAmIEhGQTM4NHhfRVZTVEFUX1dURVJSKSkKKyNkZWZpbmUJCUhGQTM4NHhfRVZTVEFUX0lTSU5GRFJPUCh2YWx1ZSkJCSgodTE2KSgoKHUxNikodmFsdWUpKSAmIEhGQTM4NHhfRVZTVEFUX0lORkRST1ApKQorI2RlZmluZQkJSEZBMzg0eF9FVlNUQVRfSVNJTkZPKHZhbHVlKQkJKCh1MTYpKCgodTE2KSh2YWx1ZSkpICYgSEZBMzg0eF9FVlNUQVRfSU5GTykpCisjZGVmaW5lCQlIRkEzODR4X0VWU1RBVF9JU0RUSU0odmFsdWUpCQkoKHUxNikoKCh1MTYpKHZhbHVlKSkgJiBIRkEzODR4X0VWU1RBVF9EVElNKSkKKyNkZWZpbmUJCUhGQTM4NHhfRVZTVEFUX0lTQ01EKHZhbHVlKQkJKCh1MTYpKCgodTE2KSh2YWx1ZSkpICYgSEZBMzg0eF9FVlNUQVRfQ01EKSkKKyNkZWZpbmUJCUhGQTM4NHhfRVZTVEFUX0lTQUxMT0ModmFsdWUpCQkoKHUxNikoKCh1MTYpKHZhbHVlKSkgJiBIRkEzODR4X0VWU1RBVF9BTExPQykpCisjZGVmaW5lCQlIRkEzODR4X0VWU1RBVF9JU1RYRVhDKHZhbHVlKQkJKCh1MTYpKCgodTE2KSh2YWx1ZSkpICYgSEZBMzg0eF9FVlNUQVRfVFhFWEMpKQorI2RlZmluZQkJSEZBMzg0eF9FVlNUQVRfSVNUWCh2YWx1ZSkJCSgodTE2KSgoKHUxNikodmFsdWUpKSAmIEhGQTM4NHhfRVZTVEFUX1RYKSkKKyNkZWZpbmUJCUhGQTM4NHhfRVZTVEFUX0lTUlgodmFsdWUpCQkoKHUxNikoKCh1MTYpKHZhbHVlKSkgJiBIRkEzODR4X0VWU1RBVF9SWCkpCiAKLSNkZWZpbmUJCUhGQTM4NHhfRVZTVEFUX0lTQkFQX09QKHZhbHVlKQkJKChVSU5UMTYpKCgoVUlOVDE2KSh2YWx1ZSkpICYgSEZBMzg0eF9JTlRfQkFQX09QKSkKKyNkZWZpbmUJCUhGQTM4NHhfRVZTVEFUX0lTQkFQX09QKHZhbHVlKQkJKCh1MTYpKCgodTE2KSh2YWx1ZSkpICYgSEZBMzg0eF9pbnRfQkFQX09QKSkKIAotI2RlZmluZQkJSEZBMzg0eF9JTlRFTl9JU1RJQ0sodmFsdWUpCQkoKFVJTlQxNikoKChVSU5UMTYpKHZhbHVlKSkgJiBIRkEzODR4X0lOVEVOX1RJQ0spKQotI2RlZmluZQkJSEZBMzg0eF9JTlRFTl9USUNLX1NFVCh2YWx1ZSkJCSgoVUlOVDE2KSgoKFVJTlQxNikodmFsdWUpKSA8PCAxNSkpCi0jZGVmaW5lCQlIRkEzODR4X0lOVEVOX0lTV1RFUlIodmFsdWUpCQkoKFVJTlQxNikoKChVSU5UMTYpKHZhbHVlKSkgJiBIRkEzODR4X0lOVEVOX1dURVJSKSkKLSNkZWZpbmUJCUhGQTM4NHhfSU5URU5fV1RFUlJfU0VUKHZhbHVlKQkJKChVSU5UMTYpKCgoVUlOVDE2KSh2YWx1ZSkpIDw8IDE0KSkKLSNkZWZpbmUJCUhGQTM4NHhfSU5URU5fSVNJTkZEUk9QKHZhbHVlKQkJKChVSU5UMTYpKCgoVUlOVDE2KSh2YWx1ZSkpICYgSEZBMzg0eF9JTlRFTl9JTkZEUk9QKSkKLSNkZWZpbmUJCUhGQTM4NHhfSU5URU5fSU5GRFJPUF9TRVQodmFsdWUpCSgoVUlOVDE2KSgoKFVJTlQxNikodmFsdWUpKSA8PCAxMykpCi0jZGVmaW5lCQlIRkEzODR4X0lOVEVOX0lTSU5GTyh2YWx1ZSkJCSgoVUlOVDE2KSgoKFVJTlQxNikodmFsdWUpKSAmIEhGQTM4NHhfSU5URU5fSU5GTykpCi0jZGVmaW5lCQlIRkEzODR4X0lOVEVOX0lORk9fU0VUKHZhbHVlKQkJKChVSU5UMTYpKCgoVUlOVDE2KSh2YWx1ZSkpIDw8IDcpKQotI2RlZmluZQkJSEZBMzg0eF9JTlRFTl9JU0RUSU0odmFsdWUpCQkoKFVJTlQxNikoKChVSU5UMTYpKHZhbHVlKSkgJiBIRkEzODR4X0lOVEVOX0RUSU0pKQotI2RlZmluZQkJSEZBMzg0eF9JTlRFTl9EVElNX1NFVCh2YWx1ZSkJCSgoVUlOVDE2KSgoKFVJTlQxNikodmFsdWUpKSA8PCA1KSkKLSNkZWZpbmUJCUhGQTM4NHhfSU5URU5fSVNDTUQodmFsdWUpCQkoKFVJTlQxNikoKChVSU5UMTYpKHZhbHVlKSkgJiBIRkEzODR4X0lOVEVOX0NNRCkpCi0jZGVmaW5lCQlIRkEzODR4X0lOVEVOX0NNRF9TRVQodmFsdWUpCQkoKFVJTlQxNikoKChVSU5UMTYpKHZhbHVlKSkgPDwgNCkpCi0jZGVmaW5lCQlIRkEzODR4X0lOVEVOX0lTQUxMT0ModmFsdWUpCQkoKFVJTlQxNikoKChVSU5UMTYpKHZhbHVlKSkgJiBIRkEzODR4X0lOVEVOX0FMTE9DKSkKLSNkZWZpbmUJCUhGQTM4NHhfSU5URU5fQUxMT0NfU0VUKHZhbHVlKQkJKChVSU5UMTYpKCgoVUlOVDE2KSh2YWx1ZSkpIDw8IDMpKQotI2RlZmluZQkJSEZBMzg0eF9JTlRFTl9JU1RYRVhDKHZhbHVlKQkJKChVSU5UMTYpKCgoVUlOVDE2KSh2YWx1ZSkpICYgSEZBMzg0eF9JTlRFTl9UWEVYQykpCi0jZGVmaW5lCQlIRkEzODR4X0lOVEVOX1RYRVhDX1NFVCh2YWx1ZSkJCSgoVUlOVDE2KSgoKFVJTlQxNikodmFsdWUpKSA8PCAyKSkKLSNkZWZpbmUJCUhGQTM4NHhfSU5URU5fSVNUWCh2YWx1ZSkJCSgoVUlOVDE2KSgoKFVJTlQxNikodmFsdWUpKSAmIEhGQTM4NHhfSU5URU5fVFgpKQotI2RlZmluZQkJSEZBMzg0eF9JTlRFTl9UWF9TRVQodmFsdWUpCQkoKFVJTlQxNikoKChVSU5UMTYpKHZhbHVlKSkgPDwgMSkpCi0jZGVmaW5lCQlIRkEzODR4X0lOVEVOX0lTUlgodmFsdWUpCQkoKFVJTlQxNikoKChVSU5UMTYpKHZhbHVlKSkgJiBIRkEzODR4X0lOVEVOX1JYKSkKLSNkZWZpbmUJCUhGQTM4NHhfSU5URU5fUlhfU0VUKHZhbHVlKQkJKChVSU5UMTYpKCgoVUlOVDE2KSh2YWx1ZSkpIDw8IDApKQorI2RlZmluZQkJSEZBMzg0eF9pbnRFTl9JU1RJQ0sodmFsdWUpCQkoKHUxNikoKCh1MTYpKHZhbHVlKSkgJiBIRkEzODR4X0lOVEVOX1RJQ0spKQorI2RlZmluZQkJSEZBMzg0eF9pbnRFTl9USUNLX1NFVCh2YWx1ZSkJCSgodTE2KSgoKHUxNikodmFsdWUpKSA8PCAxNSkpCisjZGVmaW5lCQlIRkEzODR4X2ludEVOX0lTV1RFUlIodmFsdWUpCQkoKHUxNikoKCh1MTYpKHZhbHVlKSkgJiBIRkEzODR4X0lOVEVOX1dURVJSKSkKKyNkZWZpbmUJCUhGQTM4NHhfaW50RU5fV1RFUlJfU0VUKHZhbHVlKQkJKCh1MTYpKCgodTE2KSh2YWx1ZSkpIDw8IDE0KSkKKyNkZWZpbmUJCUhGQTM4NHhfaW50RU5fSVNJTkZEUk9QKHZhbHVlKQkJKCh1MTYpKCgodTE2KSh2YWx1ZSkpICYgSEZBMzg0eF9JTlRFTl9JTkZEUk9QKSkKKyNkZWZpbmUJCUhGQTM4NHhfaW50RU5fSU5GRFJPUF9TRVQodmFsdWUpCSgodTE2KSgoKHUxNikodmFsdWUpKSA8PCAxMykpCisjZGVmaW5lCQlIRkEzODR4X2ludEVOX0lTSU5GTyh2YWx1ZSkJCSgodTE2KSgoKHUxNikodmFsdWUpKSAmIEhGQTM4NHhfSU5URU5fSU5GTykpCisjZGVmaW5lCQlIRkEzODR4X2ludEVOX0lORk9fU0VUKHZhbHVlKQkJKCh1MTYpKCgodTE2KSh2YWx1ZSkpIDw8IDcpKQorI2RlZmluZQkJSEZBMzg0eF9pbnRFTl9JU0RUSU0odmFsdWUpCQkoKHUxNikoKCh1MTYpKHZhbHVlKSkgJiBIRkEzODR4X0lOVEVOX0RUSU0pKQorI2RlZmluZQkJSEZBMzg0eF9pbnRFTl9EVElNX1NFVCh2YWx1ZSkJCSgodTE2KSgoKHUxNikodmFsdWUpKSA8PCA1KSkKKyNkZWZpbmUJCUhGQTM4NHhfaW50RU5fSVNDTUQodmFsdWUpCQkoKHUxNikoKCh1MTYpKHZhbHVlKSkgJiBIRkEzODR4X0lOVEVOX0NNRCkpCisjZGVmaW5lCQlIRkEzODR4X2ludEVOX0NNRF9TRVQodmFsdWUpCQkoKHUxNikoKCh1MTYpKHZhbHVlKSkgPDwgNCkpCisjZGVmaW5lCQlIRkEzODR4X2ludEVOX0lTQUxMT0ModmFsdWUpCQkoKHUxNikoKCh1MTYpKHZhbHVlKSkgJiBIRkEzODR4X0lOVEVOX0FMTE9DKSkKKyNkZWZpbmUJCUhGQTM4NHhfaW50RU5fQUxMT0NfU0VUKHZhbHVlKQkJKCh1MTYpKCgodTE2KSh2YWx1ZSkpIDw8IDMpKQorI2RlZmluZQkJSEZBMzg0eF9pbnRFTl9JU1RYRVhDKHZhbHVlKQkJKCh1MTYpKCgodTE2KSh2YWx1ZSkpICYgSEZBMzg0eF9JTlRFTl9UWEVYQykpCisjZGVmaW5lCQlIRkEzODR4X2ludEVOX1RYRVhDX1NFVCh2YWx1ZSkJCSgodTE2KSgoKHUxNikodmFsdWUpKSA8PCAyKSkKKyNkZWZpbmUJCUhGQTM4NHhfaW50RU5fSVNUWCh2YWx1ZSkJCSgodTE2KSgoKHUxNikodmFsdWUpKSAmIEhGQTM4NHhfSU5URU5fVFgpKQorI2RlZmluZQkJSEZBMzg0eF9pbnRFTl9UWF9TRVQodmFsdWUpCQkoKHUxNikoKCh1MTYpKHZhbHVlKSkgPDwgMSkpCisjZGVmaW5lCQlIRkEzODR4X2ludEVOX0lTUlgodmFsdWUpCQkoKHUxNikoKCh1MTYpKHZhbHVlKSkgJiBIRkEzODR4X0lOVEVOX1JYKSkKKyNkZWZpbmUJCUhGQTM4NHhfaW50RU5fUlhfU0VUKHZhbHVlKQkJKCh1MTYpKCgodTE2KSh2YWx1ZSkpIDw8IDApKQogCi0jZGVmaW5lCQlIRkEzODR4X0VWQUNLX0lTVElDSyh2YWx1ZSkJCSgoVUlOVDE2KSgoKFVJTlQxNikodmFsdWUpKSAmIEhGQTM4NHhfRVZBQ0tfVElDSykpCi0jZGVmaW5lCQlIRkEzODR4X0VWQUNLX1RJQ0tfU0VUKHZhbHVlKQkJKChVSU5UMTYpKCgoVUlOVDE2KSh2YWx1ZSkpIDw8IDE1KSkKLSNkZWZpbmUJCUhGQTM4NHhfRVZBQ0tfSVNXVEVSUih2YWx1ZSkJCSgoVUlOVDE2KSgoKFVJTlQxNikodmFsdWUpKSAmIEhGQTM4NHhfRVZBQ0tfV1RFUlIpKQotI2RlZmluZQkJSEZBMzg0eF9FVkFDS19XVEVSUl9TRVQodmFsdWUpCQkoKFVJTlQxNikoKChVSU5UMTYpKHZhbHVlKSkgPDwgMTQpKQotI2RlZmluZQkJSEZBMzg0eF9FVkFDS19JU0lORkRST1AodmFsdWUpCQkoKFVJTlQxNikoKChVSU5UMTYpKHZhbHVlKSkgJiBIRkEzODR4X0VWQUNLX0lORkRST1ApKQotI2RlZmluZQkJSEZBMzg0eF9FVkFDS19JTkZEUk9QX1NFVCh2YWx1ZSkJKChVSU5UMTYpKCgoVUlOVDE2KSh2YWx1ZSkpIDw8IDEzKSkKLSNkZWZpbmUJCUhGQTM4NHhfRVZBQ0tfSVNJTkZPKHZhbHVlKQkJKChVSU5UMTYpKCgoVUlOVDE2KSh2YWx1ZSkpICYgSEZBMzg0eF9FVkFDS19JTkZPKSkKLSNkZWZpbmUJCUhGQTM4NHhfRVZBQ0tfSU5GT19TRVQodmFsdWUpCQkoKFVJTlQxNikoKChVSU5UMTYpKHZhbHVlKSkgPDwgNykpCi0jZGVmaW5lCQlIRkEzODR4X0VWQUNLX0lTRFRJTSh2YWx1ZSkJCSgoVUlOVDE2KSgoKFVJTlQxNikodmFsdWUpKSAmIEhGQTM4NHhfRVZBQ0tfRFRJTSkpCi0jZGVmaW5lCQlIRkEzODR4X0VWQUNLX0RUSU1fU0VUKHZhbHVlKQkJKChVSU5UMTYpKCgoVUlOVDE2KSh2YWx1ZSkpIDw8IDUpKQotI2RlZmluZQkJSEZBMzg0eF9FVkFDS19JU0NNRCh2YWx1ZSkJCSgoVUlOVDE2KSgoKFVJTlQxNikodmFsdWUpKSAmIEhGQTM4NHhfRVZBQ0tfQ01EKSkKLSNkZWZpbmUJCUhGQTM4NHhfRVZBQ0tfQ01EX1NFVCh2YWx1ZSkJCSgoVUlOVDE2KSgoKFVJTlQxNikodmFsdWUpKSA8PCA0KSkKLSNkZWZpbmUJCUhGQTM4NHhfRVZBQ0tfSVNBTExPQyh2YWx1ZSkJCSgoVUlOVDE2KSgoKFVJTlQxNikodmFsdWUpKSAmIEhGQTM4NHhfRVZBQ0tfQUxMT0MpKQotI2RlZmluZQkJSEZBMzg0eF9FVkFDS19BTExPQ19TRVQodmFsdWUpCQkoKFVJTlQxNikoKChVSU5UMTYpKHZhbHVlKSkgPDwgMykpCi0jZGVmaW5lCQlIRkEzODR4X0VWQUNLX0lTVFhFWEModmFsdWUpCQkoKFVJTlQxNikoKChVSU5UMTYpKHZhbHVlKSkgJiBIRkEzODR4X0VWQUNLX1RYRVhDKSkKLSNkZWZpbmUJCUhGQTM4NHhfRVZBQ0tfVFhFWENfU0VUKHZhbHVlKQkJKChVSU5UMTYpKCgoVUlOVDE2KSh2YWx1ZSkpIDw8IDIpKQotI2RlZmluZQkJSEZBMzg0eF9FVkFDS19JU1RYKHZhbHVlKQkJKChVSU5UMTYpKCgoVUlOVDE2KSh2YWx1ZSkpICYgSEZBMzg0eF9FVkFDS19UWCkpCi0jZGVmaW5lCQlIRkEzODR4X0VWQUNLX1RYX1NFVCh2YWx1ZSkJCSgoVUlOVDE2KSgoKFVJTlQxNikodmFsdWUpKSA8PCAxKSkKLSNkZWZpbmUJCUhGQTM4NHhfRVZBQ0tfSVNSWCh2YWx1ZSkJCSgoVUlOVDE2KSgoKFVJTlQxNikodmFsdWUpKSAmIEhGQTM4NHhfRVZBQ0tfUlgpKQotI2RlZmluZQkJSEZBMzg0eF9FVkFDS19SWF9TRVQodmFsdWUpCQkoKFVJTlQxNikoKChVSU5UMTYpKHZhbHVlKSkgPDwgMCkpCisjZGVmaW5lCQlIRkEzODR4X0VWQUNLX0lTVElDSyh2YWx1ZSkJCSgodTE2KSgoKHUxNikodmFsdWUpKSAmIEhGQTM4NHhfRVZBQ0tfVElDSykpCisjZGVmaW5lCQlIRkEzODR4X0VWQUNLX1RJQ0tfU0VUKHZhbHVlKQkJKCh1MTYpKCgodTE2KSh2YWx1ZSkpIDw8IDE1KSkKKyNkZWZpbmUJCUhGQTM4NHhfRVZBQ0tfSVNXVEVSUih2YWx1ZSkJCSgodTE2KSgoKHUxNikodmFsdWUpKSAmIEhGQTM4NHhfRVZBQ0tfV1RFUlIpKQorI2RlZmluZQkJSEZBMzg0eF9FVkFDS19XVEVSUl9TRVQodmFsdWUpCQkoKHUxNikoKCh1MTYpKHZhbHVlKSkgPDwgMTQpKQorI2RlZmluZQkJSEZBMzg0eF9FVkFDS19JU0lORkRST1AodmFsdWUpCQkoKHUxNikoKCh1MTYpKHZhbHVlKSkgJiBIRkEzODR4X0VWQUNLX0lORkRST1ApKQorI2RlZmluZQkJSEZBMzg0eF9FVkFDS19JTkZEUk9QX1NFVCh2YWx1ZSkJKCh1MTYpKCgodTE2KSh2YWx1ZSkpIDw8IDEzKSkKKyNkZWZpbmUJCUhGQTM4NHhfRVZBQ0tfSVNJTkZPKHZhbHVlKQkJKCh1MTYpKCgodTE2KSh2YWx1ZSkpICYgSEZBMzg0eF9FVkFDS19JTkZPKSkKKyNkZWZpbmUJCUhGQTM4NHhfRVZBQ0tfSU5GT19TRVQodmFsdWUpCQkoKHUxNikoKCh1MTYpKHZhbHVlKSkgPDwgNykpCisjZGVmaW5lCQlIRkEzODR4X0VWQUNLX0lTRFRJTSh2YWx1ZSkJCSgodTE2KSgoKHUxNikodmFsdWUpKSAmIEhGQTM4NHhfRVZBQ0tfRFRJTSkpCisjZGVmaW5lCQlIRkEzODR4X0VWQUNLX0RUSU1fU0VUKHZhbHVlKQkJKCh1MTYpKCgodTE2KSh2YWx1ZSkpIDw8IDUpKQorI2RlZmluZQkJSEZBMzg0eF9FVkFDS19JU0NNRCh2YWx1ZSkJCSgodTE2KSgoKHUxNikodmFsdWUpKSAmIEhGQTM4NHhfRVZBQ0tfQ01EKSkKKyNkZWZpbmUJCUhGQTM4NHhfRVZBQ0tfQ01EX1NFVCh2YWx1ZSkJCSgodTE2KSgoKHUxNikodmFsdWUpKSA8PCA0KSkKKyNkZWZpbmUJCUhGQTM4NHhfRVZBQ0tfSVNBTExPQyh2YWx1ZSkJCSgodTE2KSgoKHUxNikodmFsdWUpKSAmIEhGQTM4NHhfRVZBQ0tfQUxMT0MpKQorI2RlZmluZQkJSEZBMzg0eF9FVkFDS19BTExPQ19TRVQodmFsdWUpCQkoKHUxNikoKCh1MTYpKHZhbHVlKSkgPDwgMykpCisjZGVmaW5lCQlIRkEzODR4X0VWQUNLX0lTVFhFWEModmFsdWUpCQkoKHUxNikoKCh1MTYpKHZhbHVlKSkgJiBIRkEzODR4X0VWQUNLX1RYRVhDKSkKKyNkZWZpbmUJCUhGQTM4NHhfRVZBQ0tfVFhFWENfU0VUKHZhbHVlKQkJKCh1MTYpKCgodTE2KSh2YWx1ZSkpIDw8IDIpKQorI2RlZmluZQkJSEZBMzg0eF9FVkFDS19JU1RYKHZhbHVlKQkJKCh1MTYpKCgodTE2KSh2YWx1ZSkpICYgSEZBMzg0eF9FVkFDS19UWCkpCisjZGVmaW5lCQlIRkEzODR4X0VWQUNLX1RYX1NFVCh2YWx1ZSkJCSgodTE2KSgoKHUxNikodmFsdWUpKSA8PCAxKSkKKyNkZWZpbmUJCUhGQTM4NHhfRVZBQ0tfSVNSWCh2YWx1ZSkJCSgodTE2KSgoKHUxNikodmFsdWUpKSAmIEhGQTM4NHhfRVZBQ0tfUlgpKQorI2RlZmluZQkJSEZBMzg0eF9FVkFDS19SWF9TRVQodmFsdWUpCQkoKHUxNikoKCh1MTYpKHZhbHVlKSkgPDwgMCkpCiAKLSNkZWZpbmUJCUhGQTM4NHhfQ09OVFJPTF9BVVhFTl9TRVQodmFsdWUpCSgoVUlOVDE2KSgoKFVJTlQxNikodmFsdWUpKSA8PCAxNCkpCi0jZGVmaW5lCQlIRkEzODR4X0NPTlRST0xfQVVYRU5fR0VUKHZhbHVlKQkoKFVJTlQxNikoKChVSU5UMTYpKHZhbHVlKSkgPj4gMTQpKQorI2RlZmluZQkJSEZBMzg0eF9DT05UUk9MX0FVWEVOX1NFVCh2YWx1ZSkJKCh1MTYpKCgodTE2KSh2YWx1ZSkpIDw8IDE0KSkKKyNkZWZpbmUJCUhGQTM4NHhfQ09OVFJPTF9BVVhFTl9HRVQodmFsdWUpCSgodTE2KSgoKHUxNikodmFsdWUpKSA+PiAxNCkpCiAKIC8qIEJ5dGUgT3JkZXIgKi8KICNpZmRlZiBfX0tFUk5FTF9fCi0jZGVmaW5lIGhmYTM4NHgyaG9zdF8xNihuKQkoX19sZTE2X3RvX2NwdSgoVUlOVDE2KShuKSkpCi0jZGVmaW5lIGhmYTM4NHgyaG9zdF8zMihuKQkoX19sZTMyX3RvX2NwdSgoVUlOVDMyKShuKSkpCi0jZGVmaW5lIGhvc3QyaGZhMzg0eF8xNihuKQkoX19jcHVfdG9fbGUxNigoVUlOVDE2KShuKSkpCi0jZGVmaW5lIGhvc3QyaGZhMzg0eF8zMihuKQkoX19jcHVfdG9fbGUzMigoVUlOVDMyKShuKSkpCisjZGVmaW5lIGhmYTM4NHgyaG9zdF8xNihuKQkoX19sZTE2X3RvX2NwdSgodTE2KShuKSkpCisjZGVmaW5lIGhmYTM4NHgyaG9zdF8zMihuKQkoX19sZTMyX3RvX2NwdSgodTMyKShuKSkpCisjZGVmaW5lIGhvc3QyaGZhMzg0eF8xNihuKQkoX19jcHVfdG9fbGUxNigodTE2KShuKSkpCisjZGVmaW5lIGhvc3QyaGZhMzg0eF8zMihuKQkoX19jcHVfdG9fbGUzMigodTMyKShuKSkpCiAjZW5kaWYKIAogLyogSG9zdCBNYWludGFpbmVkIFN0YXRlIEluZm8gKi8KQEAgLTkyNywxNCArODkxLDE0IEBACiAvKiBDb21tb25seSB1c2VkIGJhc2ljIHR5cGVzICovCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X2J5dGVzdHIKIHsKLQlVSU5UMTYJbGVuOwotCVVJTlQ4CWRhdGFbMF07CisJdTE2CWxlbjsKKwl1OAlkYXRhWzBdOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X2J5dGVzdHJfdDsKIAogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9ieXRlc3RyMzIKIHsKLQlVSU5UMTYJbGVuOwotCVVJTlQ4CWRhdGFbMzJdOworCXUxNglsZW47CisJdTgJZGF0YVszMl07CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfYnl0ZXN0cjMyX3Q7CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTk0NiwxMTIgKzkxMCwxMTIgQEAKIAogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9yZWNvcmQKIHsKLQlVSU5UMTYJcmVjbGVuOwotCVVJTlQxNglyaWQ7CisJdTE2CXJlY2xlbjsKKwl1MTYJcmlkOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X3JlY190OwogCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X3JlY29yZDE2CiB7Ci0JVUlOVDE2CXJlY2xlbjsKLQlVSU5UMTYJcmlkOwotCVVJTlQxNgl2YWw7CisJdTE2CXJlY2xlbjsKKwl1MTYJcmlkOworCXUxNgl2YWw7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfcmVjMTZfdDsKIAogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9yZWNvcmQzMgogewotCVVJTlQxNglyZWNsZW47Ci0JVUlOVDE2CXJpZDsKLQlVSU5UMzIJdmFsOworCXUxNglyZWNsZW47CisJdTE2CXJpZDsKKwl1MzIJdmFsOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X3JlYzMyOwogCiAvKi0tIEhhcmR3YXJlL0Zpcm13YXJlIENvbXBvbmVudCBJbmZvcm1hdGlvbiAtLS0tLS0tLS0tKi8KIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfY29tcGlkZW50CiB7Ci0JVUlOVDE2CWlkOwotCVVJTlQxNgl2YXJpYW50OwotCVVJTlQxNgltYWpvcjsKLQlVSU5UMTYJbWlub3I7CisJdTE2CWlkOworCXUxNgl2YXJpYW50OworCXUxNgltYWpvcjsKKwl1MTYJbWlub3I7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfY29tcGlkZW50X3Q7CiAKIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfY2FwbGV2ZWwKIHsKLQlVSU5UMTYJcm9sZTsKLQlVSU5UMTYJaWQ7Ci0JVUlOVDE2CXZhcmlhbnQ7Ci0JVUlOVDE2CWJvdHRvbTsKLQlVSU5UMTYJdG9wOworCXUxNglyb2xlOworCXUxNglpZDsKKwl1MTYJdmFyaWFudDsKKwl1MTYJYm90dG9tOworCXUxNgl0b3A7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfY2FwbGV2ZWxfdDsKIAogLyotLSBDb25maWd1cmF0aW9uIFJlY29yZDogY25mUG9ydFR5cGUgLS0qLwogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9jbmZQb3J0VHlwZQogewotCVVJTlQxNgljbmZQb3J0VHlwZTsKKwl1MTYJY25mUG9ydFR5cGU7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfY25mUG9ydFR5cGVfdDsKIAogLyotLSBDb25maWd1cmF0aW9uIFJlY29yZDogY25mT3duTUFDQWRkcmVzcyAtLSovCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X2NuZk93bk1BQ0FkZHJlc3MKIHsKLQlVSU5UOAljbmZPd25NQUNBZGRyZXNzWzZdOworCXU4CWNuZk93bk1BQ0FkZHJlc3NbNl07CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfY25mT3duTUFDQWRkcmVzc190OwogCiAvKi0tIENvbmZpZ3VyYXRpb24gUmVjb3JkOiBjbmZEZXNpcmVkU1NJRCAtLSovCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X2NuZkRlc2lyZWRTU0lECiB7Ci0JVUlOVDgJY25mRGVzaXJlZFNTSURbMzRdOworCXU4CWNuZkRlc2lyZWRTU0lEWzM0XTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9jbmZEZXNpcmVkU1NJRF90OwogCiAvKi0tIENvbmZpZ3VyYXRpb24gUmVjb3JkOiBjbmZPd25DaGFubmVsIC0tKi8KIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfY25mT3duQ2hhbm5lbAogewotCVVJTlQxNgljbmZPd25DaGFubmVsOworCXUxNgljbmZPd25DaGFubmVsOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X2NuZk93bkNoYW5uZWxfdDsKIAogLyotLSBDb25maWd1cmF0aW9uIFJlY29yZDogY25mT3duU1NJRCAtLSovCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X2NuZk93blNTSUQKIHsKLQlVSU5UOAljbmZPd25TU0lEWzM0XTsKKwl1OAljbmZPd25TU0lEWzM0XTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9jbmZPd25TU0lEX3Q7CiAKIC8qLS0gQ29uZmlndXJhdGlvbiBSZWNvcmQ6IGNuZk93bkFUSU1XaW5kb3cgLS0qLwogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9jbmZPd25BVElNV2luZG93CiB7Ci0JVUlOVDE2CWNuZk93bkFUSU1XaW5kb3c7CisJdTE2CWNuZk93bkFUSU1XaW5kb3c7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfY25mT3duQVRJTVdpbmRvd190OwogCiAvKi0tIENvbmZpZ3VyYXRpb24gUmVjb3JkOiBjbmZTeXN0ZW1TY2FsZSAtLSovCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X2NuZlN5c3RlbVNjYWxlCiB7Ci0JVUlOVDE2CWNuZlN5c3RlbVNjYWxlOworCXUxNgljbmZTeXN0ZW1TY2FsZTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9jbmZTeXN0ZW1TY2FsZV90OwogCiAvKi0tIENvbmZpZ3VyYXRpb24gUmVjb3JkOiBjbmZNYXhEYXRhTGVuZ3RoIC0tKi8KIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfY25mTWF4RGF0YUxlbmd0aAogewotCVVJTlQxNgljbmZNYXhEYXRhTGVuZ3RoOworCXUxNgljbmZNYXhEYXRhTGVuZ3RoOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X2NuZk1heERhdGFMZW5ndGhfdDsKIAogLyotLSBDb25maWd1cmF0aW9uIFJlY29yZDogY25mV0RTQWRkcmVzcyAtLSovCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X2NuZldEU0FkZHJlc3MKIHsKLQlVSU5UOAljbmZXRFNBZGRyZXNzWzZdOworCXU4CWNuZldEU0FkZHJlc3NbNl07CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfY25mV0RTQWRkcmVzc190OwogCiAvKi0tIENvbmZpZ3VyYXRpb24gUmVjb3JkOiBjbmZQTUVuYWJsZWQgLS0qLwogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9jbmZQTUVuYWJsZWQKIHsKLQlVSU5UMTYJY25mUE1FbmFibGVkOworCXUxNgljbmZQTUVuYWJsZWQ7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfY25mUE1FbmFibGVkX3Q7CiAKIC8qLS0gQ29uZmlndXJhdGlvbiBSZWNvcmQ6IGNuZlBNRVBTIC0tKi8KIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfY25mUE1FUFMKIHsKLQlVSU5UMTYJY25mUE1FUFM7CisJdTE2CWNuZlBNRVBTOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X2NuZlBNRVBTX3Q7CiAKIC8qLS0gQ29uZmlndXJhdGlvbiBSZWNvcmQ6IGNuZk11bHRpY2FzdFJlY2VpdmUgLS0qLwogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9jbmZNdWx0aWNhc3RSZWNlaXZlCiB7Ci0JVUlOVDE2CWNuZk11bHRpY2FzdFJlY2VpdmU7CisJdTE2CWNuZk11bHRpY2FzdFJlY2VpdmU7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfY25mTXVsdGljYXN0UmVjZWl2ZV90OwogCiAvKi0tIENvbmZpZ3VyYXRpb24gUmVjb3JkOiBjbmZBdXRoZW50aWNhdGlvbiAtLSovCkBAIC0xMDYyLDM3ICsxMDI2LDM3IEBACiAvKi0tIENvbmZpZ3VyYXRpb24gUmVjb3JkOiBjbmZNYXhTbGVlcER1cmF0aW9uIC0tKi8KIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfY25mTWF4U2xlZXBEdXJhdGlvbgogewotCVVJTlQxNgljbmZNYXhTbGVlcER1cmF0aW9uOworCXUxNgljbmZNYXhTbGVlcER1cmF0aW9uOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X2NuZk1heFNsZWVwRHVyYXRpb25fdDsKIAogLyotLSBDb25maWd1cmF0aW9uIFJlY29yZDogY25mUE1Ib2xkb3ZlckR1cmF0aW9uIC0tKi8KIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfY25mUE1Ib2xkb3ZlckR1cmF0aW9uCiB7Ci0JVUlOVDE2CWNuZlBNSG9sZG92ZXJEdXJhdGlvbjsKKwl1MTYJY25mUE1Ib2xkb3ZlckR1cmF0aW9uOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X2NuZlBNSG9sZG92ZXJEdXJhdGlvbl90OwogCiAvKi0tIENvbmZpZ3VyYXRpb24gUmVjb3JkOiBjbmZPd25OYW1lIC0tKi8KIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfY25mT3duTmFtZQogewotCVVJTlQ4CWNuZk93bk5hbWVbMzRdOworCXU4CWNuZk93bk5hbWVbMzRdOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X2NuZk93bk5hbWVfdDsKIAogLyotLSBDb25maWd1cmF0aW9uIFJlY29yZDogY25mT3duRFRJTVBlcmlvZCAtLSovCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X2NuZk93bkRUSU1QZXJpb2QKIHsKLQlVSU5UMTYJY25mT3duRFRJTVBlcmlvZDsKKwl1MTYJY25mT3duRFRJTVBlcmlvZDsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9jbmZPd25EVElNUGVyaW9kX3Q7CiAKIC8qLS0gQ29uZmlndXJhdGlvbiBSZWNvcmQ6IGNuZldEU0FkZHJlc3MgLS0qLwogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9jbmZXRFNBZGRyZXNzTgogewotCVVJTlQ4CWNuZldEU0FkZHJlc3NbNl07CisJdTgJY25mV0RTQWRkcmVzc1s2XTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9jbmZXRFNBZGRyZXNzTl90OwogCiAvKi0tIENvbmZpZ3VyYXRpb24gUmVjb3JkOiBjbmZNdWx0aWNhc3RQTUJ1ZmZlcmluZyAtLSovCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X2NuZk11bHRpY2FzdFBNQnVmZmVyaW5nCiB7Ci0JVUlOVDE2CWNuZk11bHRpY2FzdFBNQnVmZmVyaW5nOworCXUxNgljbmZNdWx0aWNhc3RQTUJ1ZmZlcmluZzsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9jbmZNdWx0aWNhc3RQTUJ1ZmZlcmluZ190OwogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0xMTAzLDEzICsxMDY3LDEzIEBACiAvKi0tIENvbmZpZ3VyYXRpb24gUmVjb3JkOiBHcm91cEFkZHJlc3NlcyAtLSovCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X0dyb3VwQWRkcmVzc2VzCiB7Ci0JVUlOVDgJTUFDQWRkcmVzc1sxNl1bNl07CisJdTgJTUFDQWRkcmVzc1sxNl1bNl07CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfR3JvdXBBZGRyZXNzZXNfdDsKIAogLyotLSBDb25maWd1cmF0aW9uIFJlY29yZDogQ3JlYXRlSUJTUyAtLSovCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X0NyZWF0ZUlCU1MKIHsKLQlVSU5UMTYJQ3JlYXRlSUJTUzsKKwl1MTYJQ3JlYXRlSUJTUzsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9DcmVhdGVJQlNTX3Q7CiAKICNkZWZpbmUgSEZBMzg0eF9DUkVBVEVJQlNTX0pPSU5DUkVBVEVJQlNTICAgICAgICAgIDAKQEAgLTExMjAsODcgKzEwODQsODcgQEAKIC8qLS0gQ29uZmlndXJhdGlvbiBSZWNvcmQ6IEZyYWdtZW50YXRpb25UaHJlc2hvbGQgLS0qLwogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9GcmFnbWVudGF0aW9uVGhyZXNob2xkCiB7Ci0JVUlOVDE2CUZyYWdtZW50YXRpb25UaHJlc2hvbGQ7CisJdTE2CUZyYWdtZW50YXRpb25UaHJlc2hvbGQ7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfRnJhZ21lbnRhdGlvblRocmVzaG9sZF90OwogCiAvKi0tIENvbmZpZ3VyYXRpb24gUmVjb3JkOiBSVFNUaHJlc2hvbGQgLS0qLwogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9SVFNUaHJlc2hvbGQKIHsKLQlVSU5UMTYJUlRTVGhyZXNob2xkOworCXUxNglSVFNUaHJlc2hvbGQ7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfUlRTVGhyZXNob2xkX3Q7CiAKIC8qLS0gQ29uZmlndXJhdGlvbiBSZWNvcmQ6IFR4UmF0ZUNvbnRyb2wgLS0qLwogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9UeFJhdGVDb250cm9sCiB7Ci0JVUlOVDE2CVR4UmF0ZUNvbnRyb2w7CisJdTE2CVR4UmF0ZUNvbnRyb2w7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfVHhSYXRlQ29udHJvbF90OwogCiAvKi0tIENvbmZpZ3VyYXRpb24gUmVjb3JkOiBQcm9taXNjdW91c01vZGUgLS0qLwogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9Qcm9taXNjdW91c01vZGUKIHsKLQlVSU5UMTYJUHJvbWlzY3VvdXNNb2RlOworCXUxNglQcm9taXNjdW91c01vZGU7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfUHJvbWlzY3VvdXNNb2RlX3Q7CiAKIC8qLS0gQ29uZmlndXJhdGlvbiBSZWNvcmQ6IFNjYW5SZXF1ZXN0IChkYXRhIHBvcnRpb24gb25seSkgLS0qLwogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9TY2FuUmVxdWVzdF9kYXRhCiB7Ci0JVUlOVDE2CWNoYW5uZWxMaXN0OwotCVVJTlQxNgl0eFJhdGU7CisJdTE2CWNoYW5uZWxMaXN0OworCXUxNgl0eFJhdGU7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfU2NhblJlcXVlc3RfZGF0YV90OwogCiAvKi0tIENvbmZpZ3VyYXRpb24gUmVjb3JkOiBIb3N0U2NhblJlcXVlc3QgKGRhdGEgcG9ydGlvbiBvbmx5KSAtLSovCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X0hvc3RTY2FuUmVxdWVzdF9kYXRhCiB7Ci0JVUlOVDE2CWNoYW5uZWxMaXN0OwotCVVJTlQxNgl0eFJhdGU7CisJdTE2CWNoYW5uZWxMaXN0OworCXUxNgl0eFJhdGU7CiAJaGZhMzg0eF9ieXRlc3RyMzJfdCBzc2lkOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X0hvc3RTY2FuUmVxdWVzdF9kYXRhX3Q7CiAKIC8qLS0gQ29uZmlndXJhdGlvbiBSZWNvcmQ6IEpvaW5SZXF1ZXN0IChkYXRhIHBvcnRpb24gb25seSkgLS0qLwogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9Kb2luUmVxdWVzdF9kYXRhCiB7Ci0JVUlOVDgJYnNzaWRbV0xBTl9CU1NJRF9MRU5dOwotCVVJTlQxNgljaGFubmVsOworCXU4CWJzc2lkW1dMQU5fQlNTSURfTEVOXTsKKwl1MTYJY2hhbm5lbDsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9Kb2luUmVxdWVzdF9kYXRhX3Q7CiAKIC8qLS0gQ29uZmlndXJhdGlvbiBSZWNvcmQ6IGF1dGhlbnRpY2F0ZVN0YXRpb24gKGRhdGEgcG9ydGlvbiBvbmx5KSAtLSovCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X2F1dGhlbnRpY2F0ZVN0YXRpb25fZGF0YQogewotCVVJTlQ4CWFkZHJlc3NbV0xBTl9BRERSX0xFTl07Ci0JVUlOVDE2CXN0YXR1czsKLQlVSU5UMTYJYWxnb3JpdGhtOworCXU4CWFkZHJlc3NbV0xBTl9BRERSX0xFTl07CisJdTE2CXN0YXR1czsKKwl1MTYJYWxnb3JpdGhtOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X2F1dGhlbnRpY2F0ZVN0YXRpb25fZGF0YV90OwogCiAvKi0tIENvbmZpZ3VyYXRpb24gUmVjb3JkOiBhc3NvY2lhdGVTdGF0aW9uIChkYXRhIHBvcnRpb24gb25seSkgLS0qLwogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9hc3NvY2lhdGVTdGF0aW9uX2RhdGEKIHsKLQlVSU5UOAlhZGRyZXNzW1dMQU5fQUREUl9MRU5dOwotCVVJTlQxNglzdGF0dXM7Ci0JVUlOVDE2CXR5cGU7CisJdTgJYWRkcmVzc1tXTEFOX0FERFJfTEVOXTsKKwl1MTYJc3RhdHVzOworCXUxNgl0eXBlOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X2Fzc29jaWF0ZVN0YXRpb25fZGF0YV90OwogCiAvKi0tIENvbmZpZ3VyYXRpb24gUmVjb3JkOiBDaGFubmVsSW5mb1JlcXVlc3QgKGRhdGEgcG9ydGlvbiBvbmx5KSAtLSovCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X0NoYW5uZWxJbmZvUmVxdWVzdF9kYXRhCiB7Ci0JVUlOVDE2CWNoYW5uZWxMaXN0OwotCVVJTlQxNgljaGFubmVsRHdlbGxUaW1lOworCXUxNgljaGFubmVsTGlzdDsKKwl1MTYJY2hhbm5lbER3ZWxsVGltZTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9DaGFubmVsSW5mb1JlcXVlc3RfZGF0YV90OwogCiAvKi0tIENvbmZpZ3VyYXRpb24gUmVjb3JkOiBXRVBLZXlNYXBwaW5nIChkYXRhIHBvcnRpb24gb25seSkgLS0qLwogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9XRVBLZXlNYXBwaW5nCiB7Ci0JVUlOVDgJYWRkcmVzc1tXTEFOX0FERFJfTEVOXTsKLQlVSU5UMTYJa2V5X2luZGV4OwotCVVJTlQ4IAlrZXlbMTZdOwotCVVJTlQ4IAltaWNfdHJhbnNtaXRfa2V5WzRdOwotCVVJTlQ4IAltaWNfcmVjZWl2ZV9rZXlbNF07CisJdTgJYWRkcmVzc1tXTEFOX0FERFJfTEVOXTsKKwl1MTYJa2V5X2luZGV4OworCXU4IAlrZXlbMTZdOworCXU4IAltaWNfdHJhbnNtaXRfa2V5WzRdOworCXU4IAltaWNfcmVjZWl2ZV9rZXlbNF07CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfV0VQS2V5TWFwcGluZ190OwogCiAvKi0tIENvbmZpZ3VyYXRpb24gUmVjb3JkOiBXUEFEYXRhICAgICAgIChkYXRhIHBvcnRpb24gb25seSkgLS0qLwogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9XUEFEYXRhCiB7Ci0JVUlOVDE2CWRhdGFsZW47Ci0gICAgICAgIFVJTlQ4IAlkYXRhWzBdOyAvLyBtYXggODAKKwl1MTYJZGF0YWxlbjsKKyAgICAgICAgdTggCWRhdGFbMF07IC8vIG1heCA4MAogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X1dQQURhdGFfdDsKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMTIxMCw3ICsxMTc0LDcgQEAKIC8qLS0gQ29uZmlndXJhdGlvbiBSZWNvcmQ6IFRpY2tUaW1lIC0tKi8KIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfVGlja1RpbWUKIHsKLQlVSU5UMTYJVGlja1RpbWU7CisJdTE2CVRpY2tUaW1lOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X1RpY2tUaW1lX3Q7CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTEyMjAsMTQ2ICsxMTg0LDE0NiBAQAogLyotLSBJbmZvcm1hdGlvbiBSZWNvcmQ6IE1heExvYWRUaW1lIC0tKi8KIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfTWF4TG9hZFRpbWUKIHsKLQlVSU5UMTYJTWF4TG9hZFRpbWU7CisJdTE2CU1heExvYWRUaW1lOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X01heExvYWRUaW1lX3Q7CiAKIC8qLS0gSW5mb3JtYXRpb24gUmVjb3JkOiBEb3duTG9hZEJ1ZmZlciAtLSovCiAvKiBOT1RFOiBUaGUgcGFnZSBhbmQgb2Zmc2V0IGFyZSBpbiBBVVggZm9ybWF0ICovCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X2Rvd25sb2FkYnVmZmVyCiB7Ci0JVUlOVDE2CXBhZ2U7Ci0JVUlOVDE2CW9mZnNldDsKLQlVSU5UMTYJbGVuOworCXUxNglwYWdlOworCXUxNglvZmZzZXQ7CisJdTE2CWxlbjsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9kb3dubG9hZGJ1ZmZlcl90OwogCiAvKi0tIEluZm9ybWF0aW9uIFJlY29yZDogUFJJSWRlbnRpdHkgLS0qLwogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9QUklJZGVudGl0eQogewotCVVJTlQxNglQUklDb21wSUQ7Ci0JVUlOVDE2CVBSSVZhcmlhbnQ7Ci0JVUlOVDE2CVBSSU1ham9yVmVyc2lvbjsKLQlVSU5UMTYJUFJJTWlub3JWZXJzaW9uOworCXUxNglQUklDb21wSUQ7CisJdTE2CVBSSVZhcmlhbnQ7CisJdTE2CVBSSU1ham9yVmVyc2lvbjsKKwl1MTYJUFJJTWlub3JWZXJzaW9uOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X1BSSUlkZW50aXR5X3Q7CiAKIC8qLS0gSW5mb3JtYXRpb24gUmVjb3JkOiBQUklTdXBSYW5nZSAtLSovCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X1BSSVN1cFJhbmdlCiB7Ci0JVUlOVDE2CVBSSVJvbGU7Ci0JVUlOVDE2CVBSSUlEOwotCVVJTlQxNglQUklWYXJpYW50OwotCVVJTlQxNglQUklCb3R0b207Ci0JVUlOVDE2CVBSSVRvcDsKKwl1MTYJUFJJUm9sZTsKKwl1MTYJUFJJSUQ7CisJdTE2CVBSSVZhcmlhbnQ7CisJdTE2CVBSSUJvdHRvbTsKKwl1MTYJUFJJVG9wOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X1BSSVN1cFJhbmdlX3Q7CiAKIC8qLS0gSW5mb3JtYXRpb24gUmVjb3JkOiBDRklBY3RSYW5nZXMgLS0qLwogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9DRklBY3RSYW5nZXMKIHsKLQlVSU5UMTYJQ0ZJUm9sZTsKLQlVSU5UMTYJQ0ZJSUQ7Ci0JVUlOVDE2CUNGSVZhcmlhbnQ7Ci0JVUlOVDE2CUNGSUJvdHRvbTsKLQlVSU5UMTYJQ0ZJVG9wOworCXUxNglDRklSb2xlOworCXUxNglDRklJRDsKKwl1MTYJQ0ZJVmFyaWFudDsKKwl1MTYJQ0ZJQm90dG9tOworCXUxNglDRklUb3A7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfQ0ZJQWN0UmFuZ2VzX3Q7CiAKIC8qLS0gSW5mb3JtYXRpb24gUmVjb3JkOiBOSUNTZXJpYWxOdW1iZXIgLS0qLwogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9OSUNTZXJpYWxOdW1iZXIKIHsKLQlVSU5UOAlOSUNTZXJpYWxOdW1iZXJbMTJdOworCXU4CU5JQ1NlcmlhbE51bWJlclsxMl07CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfTklDU2VyaWFsTnVtYmVyX3Q7CiAKIC8qLS0gSW5mb3JtYXRpb24gUmVjb3JkOiBOSUNJZGVudGl0eSAtLSovCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X05JQ0lkZW50aXR5CiB7Ci0JVUlOVDE2CU5JQ0NvbXBJRDsKLQlVSU5UMTYJTklDVmFyaWFudDsKLQlVSU5UMTYJTklDTWFqb3JWZXJzaW9uOwotCVVJTlQxNglOSUNNaW5vclZlcnNpb247CisJdTE2CU5JQ0NvbXBJRDsKKwl1MTYJTklDVmFyaWFudDsKKwl1MTYJTklDTWFqb3JWZXJzaW9uOworCXUxNglOSUNNaW5vclZlcnNpb247CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfTklDSWRlbnRpdHlfdDsKIAogLyotLSBJbmZvcm1hdGlvbiBSZWNvcmQ6IE1GSVN1cFJhbmdlIC0tKi8KIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfTUZJU3VwUmFuZ2UKIHsKLQlVSU5UMTYJTUZJUm9sZTsKLQlVSU5UMTYJTUZJSUQ7Ci0JVUlOVDE2CU1GSVZhcmlhbnQ7Ci0JVUlOVDE2CU1GSUJvdHRvbTsKLQlVSU5UMTYJTUZJVG9wOworCXUxNglNRklSb2xlOworCXUxNglNRklJRDsKKwl1MTYJTUZJVmFyaWFudDsKKwl1MTYJTUZJQm90dG9tOworCXUxNglNRklUb3A7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfTUZJU3VwUmFuZ2VfdDsKIAogLyotLSBJbmZvcm1hdGlvbiBSZWNvcmQ6IENGSVN1cFJhbmdlIC0tKi8KIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfQ0ZJU3VwUmFuZ2UKIHsKLQlVSU5UMTYJQ0ZJUm9sZTsKLQlVSU5UMTYJQ0ZJSUQ7Ci0JVUlOVDE2CUNGSVZhcmlhbnQ7Ci0JVUlOVDE2CUNGSUJvdHRvbTsKLQlVSU5UMTYJQ0ZJVG9wOworCXUxNglDRklSb2xlOworCXUxNglDRklJRDsKKwl1MTYJQ0ZJVmFyaWFudDsKKwl1MTYJQ0ZJQm90dG9tOworCXUxNglDRklUb3A7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfQ0ZJU3VwUmFuZ2VfdDsKIAogLyotLSBJbmZvcm1hdGlvbiBSZWNvcmQ6IEJVSUxEU0VROkJ1aWxkU2VxIC0tKi8KIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfQnVpbGRTZXEgewotCVVJTlQxNglwcmltYXJ5OwotCVVJTlQxNglzZWNvbmRhcnk7CisJdTE2CXByaW1hcnk7CisJdTE2CXNlY29uZGFyeTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9CdWlsZFNlcV90OwogCiAvKi0tIEluZm9ybWF0aW9uIFJlY29yZDogRldJRCAtLSovCiAjZGVmaW5lIEhGQTM4NHhfRldJRF9MRU4JMTQKIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfRldJRCB7Ci0JVUlOVDgJcHJpbWFyeVtIRkEzODR4X0ZXSURfTEVOXTsKLQlVSU5UOAlzZWNvbmRhcnlbSEZBMzg0eF9GV0lEX0xFTl07CisJdTgJcHJpbWFyeVtIRkEzODR4X0ZXSURfTEVOXTsKKwl1OAlzZWNvbmRhcnlbSEZBMzg0eF9GV0lEX0xFTl07CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfRldJRF90OwogCiAvKi0tIEluZm9ybWF0aW9uIFJlY29yZDogQ2hhbm5lbExpc3QgLS0qLwogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9DaGFubmVsTGlzdAogewotCVVJTlQxNglDaGFubmVsTGlzdDsKKwl1MTYJQ2hhbm5lbExpc3Q7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfQ2hhbm5lbExpc3RfdDsKIAogLyotLSBJbmZvcm1hdGlvbiBSZWNvcmQ6IFJlZ3VsYXRvcnlEb21haW5zIC0tKi8KIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfUmVndWxhdG9yeURvbWFpbnMKIHsKLQlVSU5UOAlSZWd1bGF0b3J5RG9tYWluc1sxMl07CisJdTgJUmVndWxhdG9yeURvbWFpbnNbMTJdOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X1JlZ3VsYXRvcnlEb21haW5zX3Q7CiAKIC8qLS0gSW5mb3JtYXRpb24gUmVjb3JkOiBUZW1wVHlwZSAtLSovCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X1RlbXBUeXBlCiB7Ci0JVUlOVDE2CVRlbXBUeXBlOworCXUxNglUZW1wVHlwZTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9UZW1wVHlwZV90OwogCiAvKi0tIEluZm9ybWF0aW9uIFJlY29yZDogQ0lTIC0tKi8KIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfQ0lTCiB7Ci0JVUlOVDgJQ0lTWzQ4MF07CisJdTgJQ0lTWzQ4MF07CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfQ0lTX3Q7CiAKIC8qLS0gSW5mb3JtYXRpb24gUmVjb3JkOiBTVEFJZGVudGl0eSAtLSovCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X1NUQUlkZW50aXR5CiB7Ci0JVUlOVDE2CVNUQUNvbXBJRDsKLQlVSU5UMTYJU1RBVmFyaWFudDsKLQlVSU5UMTYJU1RBTWFqb3JWZXJzaW9uOwotCVVJTlQxNglTVEFNaW5vclZlcnNpb247CisJdTE2CVNUQUNvbXBJRDsKKwl1MTYJU1RBVmFyaWFudDsKKwl1MTYJU1RBTWFqb3JWZXJzaW9uOworCXUxNglTVEFNaW5vclZlcnNpb247CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfU1RBSWRlbnRpdHlfdDsKIAogLyotLSBJbmZvcm1hdGlvbiBSZWNvcmQ6IFNUQVN1cFJhbmdlIC0tKi8KIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfU1RBU3VwUmFuZ2UKIHsKLQlVSU5UMTYJU1RBUm9sZTsKLQlVSU5UMTYJU1RBSUQ7Ci0JVUlOVDE2CVNUQVZhcmlhbnQ7Ci0JVUlOVDE2CVNUQUJvdHRvbTsKLQlVSU5UMTYJU1RBVG9wOworCXUxNglTVEFSb2xlOworCXUxNglTVEFJRDsKKwl1MTYJU1RBVmFyaWFudDsKKwl1MTYJU1RBQm90dG9tOworCXUxNglTVEFUb3A7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfU1RBU3VwUmFuZ2VfdDsKIAogLyotLSBJbmZvcm1hdGlvbiBSZWNvcmQ6IE1GSUFjdFJhbmdlcyAtLSovCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X01GSUFjdFJhbmdlcwogewotCVVJTlQxNglNRklSb2xlOwotCVVJTlQxNglNRklJRDsKLQlVSU5UMTYJTUZJVmFyaWFudDsKLQlVSU5UMTYJTUZJQm90dG9tOwotCVVJTlQxNglNRklUb3A7CisJdTE2CU1GSVJvbGU7CisJdTE2CU1GSUlEOworCXUxNglNRklWYXJpYW50OworCXUxNglNRklCb3R0b207CisJdTE2CU1GSVRvcDsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9NRklBY3RSYW5nZXNfdDsKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMTM2OSwxNDUgKzEzMzMsMTQ1IEBACiAvKi0tIEluZm9ybWF0aW9uIFJlY29yZDogUG9ydFN0YXR1cyAtLSovCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X1BvcnRTdGF0dXMKIHsKLQlVSU5UMTYJUG9ydFN0YXR1czsKKwl1MTYJUG9ydFN0YXR1czsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9Qb3J0U3RhdHVzX3Q7CiAKLSNkZWZpbmUgSEZBMzg0eF9QU1RBVFVTX0RJU0FCTEVECSgoVUlOVDE2KTEpCi0jZGVmaW5lIEhGQTM4NHhfUFNUQVRVU19TRUFSQ0hJTkcJKChVSU5UMTYpMikKLSNkZWZpbmUgSEZBMzg0eF9QU1RBVFVTX0NPTk5fSUJTUwkoKFVJTlQxNikzKQotI2RlZmluZSBIRkEzODR4X1BTVEFUVVNfQ09OTl9FU1MJKChVSU5UMTYpNCkKLSNkZWZpbmUgSEZBMzg0eF9QU1RBVFVTX09VVE9GUkFOR0UJKChVSU5UMTYpNSkKLSNkZWZpbmUgSEZBMzg0eF9QU1RBVFVTX0NPTk5fV0RTCSgoVUlOVDE2KTYpCisjZGVmaW5lIEhGQTM4NHhfUFNUQVRVU19ESVNBQkxFRAkoKHUxNikxKQorI2RlZmluZSBIRkEzODR4X1BTVEFUVVNfU0VBUkNISU5HCSgodTE2KTIpCisjZGVmaW5lIEhGQTM4NHhfUFNUQVRVU19DT05OX0lCU1MJKCh1MTYpMykKKyNkZWZpbmUgSEZBMzg0eF9QU1RBVFVTX0NPTk5fRVNTCSgodTE2KTQpCisjZGVmaW5lIEhGQTM4NHhfUFNUQVRVU19PVVRPRlJBTkdFCSgodTE2KTUpCisjZGVmaW5lIEhGQTM4NHhfUFNUQVRVU19DT05OX1dEUwkoKHUxNik2KQogCiAvKi0tIEluZm9ybWF0aW9uIFJlY29yZDogQ3VycmVudFNTSUQgLS0qLwogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9DdXJyZW50U1NJRAogewotCVVJTlQ4CUN1cnJlbnRTU0lEWzM0XTsKKwl1OAlDdXJyZW50U1NJRFszNF07CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfQ3VycmVudFNTSURfdDsKIAogLyotLSBJbmZvcm1hdGlvbiBSZWNvcmQ6IEN1cnJlbnRCU1NJRCAtLSovCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X0N1cnJlbnRCU1NJRAogewotCVVJTlQ4CUN1cnJlbnRCU1NJRFs2XTsKKwl1OAlDdXJyZW50QlNTSURbNl07CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfQ3VycmVudEJTU0lEX3Q7CiAKIC8qLS0gSW5mb3JtYXRpb24gUmVjb3JkOiBjb21tc3F1YWxpdHkgLS0qLwogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9jb21tc3F1YWxpdHkKIHsKLQlVSU5UMTYJQ1FfY3VyckJTUzsKLQlVSU5UMTYJQVNMX2N1cnJCU1M7Ci0JVUlOVDE2CUFOTF9jdXJyRkM7CisJdTE2CUNRX2N1cnJCU1M7CisJdTE2CUFTTF9jdXJyQlNTOworCXUxNglBTkxfY3VyckZDOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X2NvbW1zcXVhbGl0eV90OwogCiAvKi0tIEluZm9ybWF0aW9uIFJlY29yZDogZG1iY29tbXNxdWFsaXR5IC0tKi8KIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfZGJtY29tbXNxdWFsaXR5CiB7Ci0JVUlOVDE2CUNRZGJtX2N1cnJCU1M7Ci0JVUlOVDE2CUFTTGRibV9jdXJyQlNTOwotCVVJTlQxNglBTkxkYm1fY3VyckZDOworCXUxNglDUWRibV9jdXJyQlNTOworCXUxNglBU0xkYm1fY3VyckJTUzsKKwl1MTYJQU5MZGJtX2N1cnJGQzsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9kYm1jb21tc3F1YWxpdHlfdDsKIAogLyotLSBJbmZvcm1hdGlvbiBSZWNvcmQ6IEN1cnJlbnRUeFJhdGUgLS0qLwogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9DdXJyZW50VHhSYXRlCiB7Ci0JVUlOVDE2CUN1cnJlbnRUeFJhdGU7CisJdTE2CUN1cnJlbnRUeFJhdGU7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfQ3VycmVudFR4UmF0ZV90OwogCiAvKi0tIEluZm9ybWF0aW9uIFJlY29yZDogQ3VycmVudEJlYWNvbkludGVydmFsIC0tKi8KIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfQ3VycmVudEJlYWNvbkludGVydmFsCiB7Ci0JVUlOVDE2CUN1cnJlbnRCZWFjb25JbnRlcnZhbDsKKwl1MTYJQ3VycmVudEJlYWNvbkludGVydmFsOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X0N1cnJlbnRCZWFjb25JbnRlcnZhbF90OwogCiAvKi0tIEluZm9ybWF0aW9uIFJlY29yZDogQ3VycmVudFNjYWxlVGhyZXNob2xkcyAtLSovCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X0N1cnJlbnRTY2FsZVRocmVzaG9sZHMKIHsKLQlVSU5UMTYJRW5lcmd5RGV0ZWN0VGhyZXNob2xkOwotCVVJTlQxNglDYXJyaWVyRGV0ZWN0VGhyZXNob2xkOwotCVVJTlQxNglEZWZlckRldGVjdFRocmVzaG9sZDsKLQlVSU5UMTYJQ2VsbFNlYXJjaFRocmVzaG9sZDsgLyogU3RhdGlvbnMgb25seSAqLwotCVVJTlQxNglEZWFkU3BvdFRocmVzaG9sZDsgLyogU3RhdGlvbnMgb25seSAqLworCXUxNglFbmVyZ3lEZXRlY3RUaHJlc2hvbGQ7CisJdTE2CUNhcnJpZXJEZXRlY3RUaHJlc2hvbGQ7CisJdTE2CURlZmVyRGV0ZWN0VGhyZXNob2xkOworCXUxNglDZWxsU2VhcmNoVGhyZXNob2xkOyAvKiBTdGF0aW9ucyBvbmx5ICovCisJdTE2CURlYWRTcG90VGhyZXNob2xkOyAvKiBTdGF0aW9ucyBvbmx5ICovCiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfQ3VycmVudFNjYWxlVGhyZXNob2xkc190OwogCiAvKi0tIEluZm9ybWF0aW9uIFJlY29yZDogUHJvdG9jb2xSc3BUaW1lIC0tKi8KIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfUHJvdG9jb2xSc3BUaW1lCiB7Ci0JVUlOVDE2CVByb3RvY29sUnNwVGltZTsKKwl1MTYJUHJvdG9jb2xSc3BUaW1lOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X1Byb3RvY29sUnNwVGltZV90OwogCiAvKi0tIEluZm9ybWF0aW9uIFJlY29yZDogU2hvcnRSZXRyeUxpbWl0IC0tKi8KIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfU2hvcnRSZXRyeUxpbWl0CiB7Ci0JVUlOVDE2CVNob3J0UmV0cnlMaW1pdDsKKwl1MTYJU2hvcnRSZXRyeUxpbWl0OwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X1Nob3J0UmV0cnlMaW1pdF90OwogCiAvKi0tIEluZm9ybWF0aW9uIFJlY29yZDogTG9uZ1JldHJ5TGltaXQgLS0qLwogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9Mb25nUmV0cnlMaW1pdAogewotCVVJTlQxNglMb25nUmV0cnlMaW1pdDsKKwl1MTYJTG9uZ1JldHJ5TGltaXQ7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfTG9uZ1JldHJ5TGltaXRfdDsKIAogLyotLSBJbmZvcm1hdGlvbiBSZWNvcmQ6IE1heFRyYW5zbWl0TGlmZXRpbWUgLS0qLwogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9NYXhUcmFuc21pdExpZmV0aW1lCiB7Ci0JVUlOVDE2CU1heFRyYW5zbWl0TGlmZXRpbWU7CisJdTE2CU1heFRyYW5zbWl0TGlmZXRpbWU7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfTWF4VHJhbnNtaXRMaWZldGltZV90OwogCiAvKi0tIEluZm9ybWF0aW9uIFJlY29yZDogTWF4UmVjZWl2ZUxpZmV0aW1lIC0tKi8KIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfTWF4UmVjZWl2ZUxpZmV0aW1lCiB7Ci0JVUlOVDE2CU1heFJlY2VpdmVMaWZldGltZTsKKwl1MTYJTWF4UmVjZWl2ZUxpZmV0aW1lOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X01heFJlY2VpdmVMaWZldGltZV90OwogCiAvKi0tIEluZm9ybWF0aW9uIFJlY29yZDogQ0ZQb2xsYWJsZSAtLSovCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X0NGUG9sbGFibGUKIHsKLQlVSU5UMTYJQ0ZQb2xsYWJsZTsKKwl1MTYJQ0ZQb2xsYWJsZTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9DRlBvbGxhYmxlX3Q7CiAKIC8qLS0gSW5mb3JtYXRpb24gUmVjb3JkOiBBdXRoZW50aWNhdGlvbkFsZ29yaXRobXMgLS0qLwogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9BdXRoZW50aWNhdGlvbkFsZ29yaXRobXMKIHsKLQlVSU5UMTYJQXV0aGVudGljYXRpb25UeXBlOwotCVVJTlQxNglUeXBlRW5hYmxlZDsKKwl1MTYJQXV0aGVudGljYXRpb25UeXBlOworCXUxNglUeXBlRW5hYmxlZDsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9BdXRoZW50aWNhdGlvbkFsZ29yaXRobXNfdDsKIAogLyotLSBJbmZvcm1hdGlvbiBSZWNvcmQ6IEF1dGhlbnRpY2F0aW9uQWxnb3JpdGhtcwogKGRhdGEgb25seSAtLSovCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X0F1dGhlbnRpY2F0aW9uQWxnb3JpdGhtc19kYXRhCiB7Ci0JVUlOVDE2CUF1dGhlbnRpY2F0aW9uVHlwZTsKLQlVSU5UMTYJVHlwZUVuYWJsZWQ7CisJdTE2CUF1dGhlbnRpY2F0aW9uVHlwZTsKKwl1MTYJVHlwZUVuYWJsZWQ7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfQXV0aGVudGljYXRpb25BbGdvcml0aG1zX2RhdGFfdDsKIAogLyotLSBJbmZvcm1hdGlvbiBSZWNvcmQ6IFByaXZhY3lPcHRpb25JbXBsZW1lbnRlZCAtLSovCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X1ByaXZhY3lPcHRpb25JbXBsZW1lbnRlZAogewotCVVJTlQxNglQcml2YWN5T3B0aW9uSW1wbGVtZW50ZWQ7CisJdTE2CVByaXZhY3lPcHRpb25JbXBsZW1lbnRlZDsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9Qcml2YWN5T3B0aW9uSW1wbGVtZW50ZWRfdDsKIAogLyotLSBJbmZvcm1hdGlvbiBSZWNvcmQ6IE93bk1BQ0FkZHJlc3MgLS0qLwogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9Pd25NQUNBZGRyZXNzCiB7Ci0JVUlOVDgJT3duTUFDQWRkcmVzc1s2XTsKKwl1OAlPd25NQUNBZGRyZXNzWzZdOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X093bk1BQ0FkZHJlc3NfdDsKIAogLyotLSBJbmZvcm1hdGlvbiBSZWNvcmQ6IFBDRkluZm8gLS0qLwogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9QQ0ZJbmZvCiB7Ci0JVUlOVDE2CU1lZGl1bU9jY3VwYW5jeUxpbWl0OwotCVVJTlQxNglDRlBQZXJpb2Q7Ci0JVUlOVDE2CUNGUE1heER1cmF0aW9uOwotCVVJTlQxNglDRlBGbGFnczsKKwl1MTYJTWVkaXVtT2NjdXBhbmN5TGltaXQ7CisJdTE2CUNGUFBlcmlvZDsKKwl1MTYJQ0ZQTWF4RHVyYXRpb247CisJdTE2CUNGUEZsYWdzOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X1BDRkluZm9fdDsKIAogLyotLSBJbmZvcm1hdGlvbiBSZWNvcmQ6IFBDRkluZm8gKGRhdGEgcG9ydGlvbiBvbmx5KSAtLSovCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X1BDRkluZm9fZGF0YQogewotCVVJTlQxNglNZWRpdW1PY2N1cGFuY3lMaW1pdDsKLQlVSU5UMTYJQ0ZQUGVyaW9kOwotCVVJTlQxNglDRlBNYXhEdXJhdGlvbjsKLQlVSU5UMTYJQ0ZQRmxhZ3M7CisJdTE2CU1lZGl1bU9jY3VwYW5jeUxpbWl0OworCXUxNglDRlBQZXJpb2Q7CisJdTE2CUNGUE1heER1cmF0aW9uOworCXUxNglDRlBGbGFnczsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9QQ0ZJbmZvX2RhdGFfdDsKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMTUxNywzOSArMTQ4MSwzOSBAQAogLyotLSBJbmZvcm1hdGlvbiBSZWNvcmQ6IFBIWVR5cGUgLS0qLwogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9QSFlUeXBlCiB7Ci0JVUlOVDE2CVBIWVR5cGU7CisJdTE2CVBIWVR5cGU7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfUEhZVHlwZV90OwogCiAvKi0tIEluZm9ybWF0aW9uIFJlY29yZDogQ3VycmVudENoYW5uZWwgLS0qLwogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9DdXJyZW50Q2hhbm5lbAogewotCVVJTlQxNglDdXJyZW50Q2hhbm5lbDsKKwl1MTYJQ3VycmVudENoYW5uZWw7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfQ3VycmVudENoYW5uZWxfdDsKIAogLyotLSBJbmZvcm1hdGlvbiBSZWNvcmQ6IEN1cnJlbnRQb3dlclN0YXRlIC0tKi8KIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfQ3VycmVudFBvd2VyU3RhdGUKIHsKLQlVSU5UMTYJQ3VycmVudFBvd2VyU3RhdGU7CisJdTE2CUN1cnJlbnRQb3dlclN0YXRlOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X0N1cnJlbnRQb3dlclN0YXRlX3Q7CiAKIC8qLS0gSW5mb3JtYXRpb24gUmVjb3JkOiBDQ0FNb2RlIC0tKi8KIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfQ0NBTW9kZQogewotCVVJTlQxNglDQ0FNb2RlOworCXUxNglDQ0FNb2RlOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X0NDQU1vZGVfdDsKIAogLyotLSBJbmZvcm1hdGlvbiBSZWNvcmQ6IFN1cHBvcnRlZERhdGFSYXRlcyAtLSovCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X1N1cHBvcnRlZERhdGFSYXRlcwogewotCVVJTlQ4CVN1cHBvcnRlZERhdGFSYXRlc1sxMF07CisJdTgJU3VwcG9ydGVkRGF0YVJhdGVzWzEwXTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9TdXBwb3J0ZWREYXRhUmF0ZXNfdDsKIAogLyotLSBJbmZvcm1hdGlvbiBSZWNvcmQ6IExGT1N0YXR1cyAtLSovCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X0xGT1N0YXR1cwogewotCVVJTlQxNiAgVGVzdFJlc3VsdHM7Ci0JVUlOVDE2ICBMRk9SZXN1bHQ7Ci0JVUlOVDE2ICBWUkhGT1Jlc3VsdDsKKwl1MTYgIFRlc3RSZXN1bHRzOworCXUxNiAgTEZPUmVzdWx0OworCXUxNiAgVlJIRk9SZXN1bHQ7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfTEZPU3RhdHVzX3Q7CiAKICNkZWZpbmUgSEZBMzg0eF9URVNUUkVTVUxUX0FMTFBBU1NFRCAgICBCSVQwCkBAIC0xNTYxLDExICsxNTI1LDExIEBACiAvKi0tIEluZm9ybWF0aW9uIFJlY29yZDogTEVEQ29udHJvbCAtLSovCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X0xFRENvbnRyb2wKIHsKLQlVSU5UMTYgIHNlYXJjaGluZ19vbjsKLQlVSU5UMTYgIHNlYXJjaGluZ19vZmY7Ci0JVUlOVDE2ICBhc3NvY19vbjsKLQlVSU5UMTYgIGFzc29jX29mZjsKLQlVSU5UMTYgIGFjdGl2aXR5OworCXUxNiAgc2VhcmNoaW5nX29uOworCXUxNiAgc2VhcmNoaW5nX29mZjsKKwl1MTYgIGFzc29jX29uOworCXUxNiAgYXNzb2Nfb2ZmOworCXUxNiAgYWN0aXZpdHk7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfTEVEQ29udHJvbF90OwogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0xNTc2LDMyICsxNTQwLDMyIEBACiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBDb250cm9sIEluZm8gKG9mZnNldCA0NC01MSkKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNkZWZpbmUJCUhGQTM4NHhfRkRfU1RBVFVTX09GRgkJCSgoVUlOVDE2KTB4NDQpCi0jZGVmaW5lCQlIRkEzODR4X0ZEX1RJTUVfT0ZGCQkJKChVSU5UMTYpMHg0NikKLSNkZWZpbmUJCUhGQTM4NHhfRkRfU1dTVVBQT1JUX09GRgkJKChVSU5UMTYpMHg0QSkKLSNkZWZpbmUJCUhGQTM4NHhfRkRfU0lMRU5DRV9PRkYJCQkoKFVJTlQxNikweDRBKQotI2RlZmluZQkJSEZBMzg0eF9GRF9TSUdOQUxfT0ZGCQkJKChVSU5UMTYpMHg0QikKLSNkZWZpbmUJCUhGQTM4NHhfRkRfUkFURV9PRkYJCQkoKFVJTlQxNikweDRDKQotI2RlZmluZQkJSEZBMzg0eF9GRF9SWEZMT1dfT0ZGCQkJKChVSU5UMTYpMHg0RCkKLSNkZWZpbmUJCUhGQTM4NHhfRkRfUkVTRVJWRURfT0ZGCQkJKChVSU5UMTYpMHg0RSkKLSNkZWZpbmUJCUhGQTM4NHhfRkRfVFhDT05UUk9MX09GRgkJKChVSU5UMTYpMHg1MCkKKyNkZWZpbmUJCUhGQTM4NHhfRkRfU1RBVFVTX09GRgkJCSgodTE2KTB4NDQpCisjZGVmaW5lCQlIRkEzODR4X0ZEX1RJTUVfT0ZGCQkJKCh1MTYpMHg0NikKKyNkZWZpbmUJCUhGQTM4NHhfRkRfU1dTVVBQT1JUX09GRgkJKCh1MTYpMHg0QSkKKyNkZWZpbmUJCUhGQTM4NHhfRkRfU0lMRU5DRV9PRkYJCQkoKHUxNikweDRBKQorI2RlZmluZQkJSEZBMzg0eF9GRF9TSUdOQUxfT0ZGCQkJKCh1MTYpMHg0QikKKyNkZWZpbmUJCUhGQTM4NHhfRkRfUkFURV9PRkYJCQkoKHUxNikweDRDKQorI2RlZmluZQkJSEZBMzg0eF9GRF9SWEZMT1dfT0ZGCQkJKCh1MTYpMHg0RCkKKyNkZWZpbmUJCUhGQTM4NHhfRkRfUkVTRVJWRURfT0ZGCQkJKCh1MTYpMHg0RSkKKyNkZWZpbmUJCUhGQTM4NHhfRkRfVFhDT05UUk9MX09GRgkJKCh1MTYpMHg1MCkKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIDgwMi4xMSBIZWFkZXIgKG9mZnNldCA1Mi02QikKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNkZWZpbmUJCUhGQTM4NHhfRkRfRlJBTUVDT05UUk9MX09GRgkJKChVSU5UMTYpMHg1MikKLSNkZWZpbmUJCUhGQTM4NHhfRkRfRFVSQVRJT05JRF9PRkYJCSgoVUlOVDE2KTB4NTQpCi0jZGVmaW5lCQlIRkEzODR4X0ZEX0FERFJFU1MxX09GRgkJCSgoVUlOVDE2KTB4NTYpCi0jZGVmaW5lCQlIRkEzODR4X0ZEX0FERFJFU1MyX09GRgkJCSgoVUlOVDE2KTB4NUMpCi0jZGVmaW5lCQlIRkEzODR4X0ZEX0FERFJFU1MzX09GRgkJCSgoVUlOVDE2KTB4NjIpCi0jZGVmaW5lCQlIRkEzODR4X0ZEX1NFUUNPTlRST0xfT0ZGCQkoKFVJTlQxNikweDY4KQotI2RlZmluZQkJSEZBMzg0eF9GRF9BRERSRVNTNF9PRkYJCQkoKFVJTlQxNikweDZBKQotI2RlZmluZQkJSEZBMzg0eF9GRF9EQVRBTEVOX09GRgkJCSgoVUlOVDE2KTB4NzApCisjZGVmaW5lCQlIRkEzODR4X0ZEX0ZSQU1FQ09OVFJPTF9PRkYJCSgodTE2KTB4NTIpCisjZGVmaW5lCQlIRkEzODR4X0ZEX0RVUkFUSU9OSURfT0ZGCQkoKHUxNikweDU0KQorI2RlZmluZQkJSEZBMzg0eF9GRF9BRERSRVNTMV9PRkYJCQkoKHUxNikweDU2KQorI2RlZmluZQkJSEZBMzg0eF9GRF9BRERSRVNTMl9PRkYJCQkoKHUxNikweDVDKQorI2RlZmluZQkJSEZBMzg0eF9GRF9BRERSRVNTM19PRkYJCQkoKHUxNikweDYyKQorI2RlZmluZQkJSEZBMzg0eF9GRF9TRVFDT05UUk9MX09GRgkJKCh1MTYpMHg2OCkKKyNkZWZpbmUJCUhGQTM4NHhfRkRfQUREUkVTUzRfT0ZGCQkJKCh1MTYpMHg2QSkKKyNkZWZpbmUJCUhGQTM4NHhfRkRfREFUQUxFTl9PRkYJCQkoKHUxNikweDcwKQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogODAyLjMgSGVhZGVyIChvZmZzZXQgNzItN0YpCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jZGVmaW5lCQlIRkEzODR4X0ZEX0RFU1RBRERSRVNTX09GRgkJKChVSU5UMTYpMHg3MikKLSNkZWZpbmUJCUhGQTM4NHhfRkRfU1JDQUREUkVTU19PRkYJCSgoVUlOVDE2KTB4NzgpCi0jZGVmaW5lCQlIRkEzODR4X0ZEX0RBVEFMRU5HVEhfT0ZGCQkoKFVJTlQxNikweDdFKQorI2RlZmluZQkJSEZBMzg0eF9GRF9ERVNUQUREUkVTU19PRkYJCSgodTE2KTB4NzIpCisjZGVmaW5lCQlIRkEzODR4X0ZEX1NSQ0FERFJFU1NfT0ZGCQkoKHUxNikweDc4KQorI2RlZmluZQkJSEZBMzg0eF9GRF9EQVRBTEVOR1RIX09GRgkJKCh1MTYpMHg3RSkKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogRlJBTUUgU1RSVUNUVVJFUzogQ29tbXVuaWNhdGlvbiBGcmFtZXMKQEAgLTE2MTEsNjcgKzE1NzUsNjcgQEAKIC8qLS0gQ29tbXVuaWNhdGlvbiBGcmFtZTogVHJhbnNtaXQgRnJhbWUgU3RydWN0dXJlIC0tKi8KIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfdHhfZnJhbWUKIHsKLQlVSU5UMTYJc3RhdHVzOwotCVVJTlQxNglyZXNlcnZlZDE7Ci0JVUlOVDE2CXJlc2VydmVkMjsKLQlVSU5UMzIJc3dfc3VwcG9ydDsKLQlVSU5UOAl0eF9yZXRyeWNvdW50OwotCVVJTlQ4ICAgdHhfcmF0ZTsKLQlVSU5UMTYJdHhfY29udHJvbDsKKwl1MTYJc3RhdHVzOworCXUxNglyZXNlcnZlZDE7CisJdTE2CXJlc2VydmVkMjsKKwl1MzIJc3dfc3VwcG9ydDsKKwl1OAl0eF9yZXRyeWNvdW50OworCXU4ICAgdHhfcmF0ZTsKKwl1MTYJdHhfY29udHJvbDsKIAogCS8qLS0gODAyLjExIEhlYWRlciBJbmZvcm1hdGlvbiAtLSovCiAKLQlVSU5UMTYJZnJhbWVfY29udHJvbDsKLQlVSU5UMTYJZHVyYXRpb25faWQ7Ci0JVUlOVDgJYWRkcmVzczFbNl07Ci0JVUlOVDgJYWRkcmVzczJbNl07Ci0JVUlOVDgJYWRkcmVzczNbNl07Ci0JVUlOVDE2CXNlcXVlbmNlX2NvbnRyb2w7Ci0JVUlOVDgJYWRkcmVzczRbNl07Ci0JVUlOVDE2CWRhdGFfbGVuOyAvKiBsaXR0bGUgZW5kaWFuIGZvcm1hdCAqLworCXUxNglmcmFtZV9jb250cm9sOworCXUxNglkdXJhdGlvbl9pZDsKKwl1OAlhZGRyZXNzMVs2XTsKKwl1OAlhZGRyZXNzMls2XTsKKwl1OAlhZGRyZXNzM1s2XTsKKwl1MTYJc2VxdWVuY2VfY29udHJvbDsKKwl1OAlhZGRyZXNzNFs2XTsKKwl1MTYJZGF0YV9sZW47IC8qIGxpdHRsZSBlbmRpYW4gZm9ybWF0ICovCiAKIAkvKi0tIDgwMi4zIEhlYWRlciBJbmZvcm1hdGlvbiAtLSovCiAKLQlVSU5UOAlkZXN0X2FkZHJbNl07Ci0JVUlOVDgJc3JjX2FkZHJbNl07Ci0JVUlOVDE2CWRhdGFfbGVuZ3RoOyAvKiBiaWcgZW5kaWFuIGZvcm1hdCAqLworCXU4CWRlc3RfYWRkcls2XTsKKwl1OAlzcmNfYWRkcls2XTsKKwl1MTYJZGF0YV9sZW5ndGg7IC8qIGJpZyBlbmRpYW4gZm9ybWF0ICovCiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfdHhfZnJhbWVfdDsKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIENvbW11bmljYXRpb24gRnJhbWVzOiBGaWVsZCBNYXNrcyBmb3IgVHJhbnNtaXQgRnJhbWVzCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKi0tIFN0YXR1cyBGaWVsZCAtLSovCi0jZGVmaW5lCQlIRkEzODR4X1RYU1RBVFVTX0FDS0VSUgkJCSgoVUlOVDE2KUJJVDUpCi0jZGVmaW5lCQlIRkEzODR4X1RYU1RBVFVTX0ZPUk1FUlIJCSgoVUlOVDE2KUJJVDMpCi0jZGVmaW5lCQlIRkEzODR4X1RYU1RBVFVTX0RJU0NPTgkJCSgoVUlOVDE2KUJJVDIpCi0jZGVmaW5lCQlIRkEzODR4X1RYU1RBVFVTX0FHRURFUlIJCSgoVUlOVDE2KUJJVDEpCi0jZGVmaW5lCQlIRkEzODR4X1RYU1RBVFVTX1JFVFJZRVJSCQkoKFVJTlQxNilCSVQwKQorI2RlZmluZQkJSEZBMzg0eF9UWFNUQVRVU19BQ0tFUlIJCQkoKHUxNilCSVQ1KQorI2RlZmluZQkJSEZBMzg0eF9UWFNUQVRVU19GT1JNRVJSCQkoKHUxNilCSVQzKQorI2RlZmluZQkJSEZBMzg0eF9UWFNUQVRVU19ESVNDT04JCQkoKHUxNilCSVQyKQorI2RlZmluZQkJSEZBMzg0eF9UWFNUQVRVU19BR0VERVJSCQkoKHUxNilCSVQxKQorI2RlZmluZQkJSEZBMzg0eF9UWFNUQVRVU19SRVRSWUVSUgkJKCh1MTYpQklUMCkKIC8qLS0gVHJhbnNtaXQgQ29udHJvbCBGaWVsZCAtLSovCi0jZGVmaW5lCQlIRkEzODR4X1RYX0NGUE9MTAkJCSgoVUlOVDE2KUJJVDEyKQotI2RlZmluZQkJSEZBMzg0eF9UWF9QUlNUCQkJCSgoVUlOVDE2KUJJVDExKQotI2RlZmluZQkJSEZBMzg0eF9UWF9NQUNQT1JUCQkJKChVSU5UMTYpKEJJVDEwIHwgQklUOSB8IEJJVDgpKQotI2RlZmluZQkJSEZBMzg0eF9UWF9OT0VOQ1JZUFQJCQkoKFVJTlQxNilCSVQ3KQotI2RlZmluZQkJSEZBMzg0eF9UWF9SRVRSWVNUUkFUCQkJKChVSU5UMTYpKEJJVDYgfCBCSVQ1KSkKLSNkZWZpbmUJCUhGQTM4NHhfVFhfU1RSVUNUWVBFCQkJKChVSU5UMTYpKEJJVDQgfCBCSVQzKSkKLSNkZWZpbmUJCUhGQTM4NHhfVFhfVFhFWAkJCQkoKFVJTlQxNilCSVQyKQotI2RlZmluZQkJSEZBMzg0eF9UWF9UWE9LCQkJCSgoVUlOVDE2KUJJVDEpCisjZGVmaW5lCQlIRkEzODR4X1RYX0NGUE9MTAkJCSgodTE2KUJJVDEyKQorI2RlZmluZQkJSEZBMzg0eF9UWF9QUlNUCQkJCSgodTE2KUJJVDExKQorI2RlZmluZQkJSEZBMzg0eF9UWF9NQUNQT1JUCQkJKCh1MTYpKEJJVDEwIHwgQklUOSB8IEJJVDgpKQorI2RlZmluZQkJSEZBMzg0eF9UWF9OT0VOQ1JZUFQJCQkoKHUxNilCSVQ3KQorI2RlZmluZQkJSEZBMzg0eF9UWF9SRVRSWVNUUkFUCQkJKCh1MTYpKEJJVDYgfCBCSVQ1KSkKKyNkZWZpbmUJCUhGQTM4NHhfVFhfU1RSVUNUWVBFCQkJKCh1MTYpKEJJVDQgfCBCSVQzKSkKKyNkZWZpbmUJCUhGQTM4NHhfVFhfVFhFWAkJCQkoKHUxNilCSVQyKQorI2RlZmluZQkJSEZBMzg0eF9UWF9UWE9LCQkJCSgodTE2KUJJVDEpCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBDb21tdW5pY2F0aW9uIEZyYW1lczogVGVzdC9HZXQvU2V0IEZpZWxkIFZhbHVlcyBmb3IgVHJhbnNtaXQgRnJhbWVzCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKi0tIFN0YXR1cyBGaWVsZCAtLSovCiAjZGVmaW5lIEhGQTM4NHhfVFhTVEFUVVNfSVNFUlJPUih2KQlcCi0JKCgoVUlOVDE2KSh2KSkmXAorCSgoKHUxNikodikpJlwKIAkoSEZBMzg0eF9UWFNUQVRVU19BQ0tFUlJ8SEZBMzg0eF9UWFNUQVRVU19GT1JNRVJSfFwKIAlIRkEzODR4X1RYU1RBVFVTX0RJU0NPTnxIRkEzODR4X1RYU1RBVFVTX0FHRURFUlJ8XAogCUhGQTM4NHhfVFhTVEFUVVNfUkVUUllFUlIpKQogCi0jZGVmaW5lCUhGQTM4NHhfVFhTVEFUVVNfSVNBQ0tFUlIodikJKChVSU5UMTYpKCgoVUlOVDE2KSh2KSkgJiBIRkEzODR4X1RYU1RBVFVTX0FDS0VSUikpCi0jZGVmaW5lCUhGQTM4NHhfVFhTVEFUVVNfSVNGT1JNRVJSKHYpCSgoVUlOVDE2KSgoKFVJTlQxNikodikpICYgSEZBMzg0eF9UWFNUQVRVU19GT1JNRVJSKSkKLSNkZWZpbmUJSEZBMzg0eF9UWFNUQVRVU19JU0RJU0NPTih2KQkoKFVJTlQxNikoKChVSU5UMTYpKHYpKSAmIEhGQTM4NHhfVFhTVEFUVVNfRElTQ09OKSkKLSNkZWZpbmUJSEZBMzg0eF9UWFNUQVRVU19JU0FHRURFUlIodikJKChVSU5UMTYpKCgoVUlOVDE2KSh2KSkgJiBIRkEzODR4X1RYU1RBVFVTX0FHRURFUlIpKQotI2RlZmluZQlIRkEzODR4X1RYU1RBVFVTX0lTUkVUUllFUlIodikJKChVSU5UMTYpKCgoVUlOVDE2KSh2KSkgJiBIRkEzODR4X1RYU1RBVFVTX1JFVFJZRVJSKSkKKyNkZWZpbmUJSEZBMzg0eF9UWFNUQVRVU19JU0FDS0VSUih2KQkoKHUxNikoKCh1MTYpKHYpKSAmIEhGQTM4NHhfVFhTVEFUVVNfQUNLRVJSKSkKKyNkZWZpbmUJSEZBMzg0eF9UWFNUQVRVU19JU0ZPUk1FUlIodikJKCh1MTYpKCgodTE2KSh2KSkgJiBIRkEzODR4X1RYU1RBVFVTX0ZPUk1FUlIpKQorI2RlZmluZQlIRkEzODR4X1RYU1RBVFVTX0lTRElTQ09OKHYpCSgodTE2KSgoKHUxNikodikpICYgSEZBMzg0eF9UWFNUQVRVU19ESVNDT04pKQorI2RlZmluZQlIRkEzODR4X1RYU1RBVFVTX0lTQUdFREVSUih2KQkoKHUxNikoKCh1MTYpKHYpKSAmIEhGQTM4NHhfVFhTVEFUVVNfQUdFREVSUikpCisjZGVmaW5lCUhGQTM4NHhfVFhTVEFUVVNfSVNSRVRSWUVSUih2KQkoKHUxNikoKCh1MTYpKHYpKSAmIEhGQTM4NHhfVFhTVEFUVVNfUkVUUllFUlIpKQogCi0jZGVmaW5lCUhGQTM4NHhfVFhfR0VUKHYsbSxzKQkJKCgoKFVJTlQxNikodikpJigoVUlOVDE2KShtKSkpPj4oKFVJTlQxNikocykpKQotI2RlZmluZQlIRkEzODR4X1RYX1NFVCh2LG0scykJCSgoKChVSU5UMTYpKHYpKTw8KChVSU5UMTYpKHMpKSkmKChVSU5UMTYpKG0pKSkKKyNkZWZpbmUJSEZBMzg0eF9UWF9HRVQodixtLHMpCQkoKCgodTE2KSh2KSkmKCh1MTYpKG0pKSk+PigodTE2KShzKSkpCisjZGVmaW5lCUhGQTM4NHhfVFhfU0VUKHYsbSxzKQkJKCgoKHUxNikodikpPDwoKHUxNikocykpKSYoKHUxNikobSkpKQogCiAjZGVmaW5lCUhGQTM4NHhfVFhfQ0ZQT0xMX0dFVCh2KQlIRkEzODR4X1RYX0dFVCh2LCBIRkEzODR4X1RYX0NGUE9MTCwxMikKICNkZWZpbmUJSEZBMzg0eF9UWF9DRlBPTExfU0VUKHYpCUhGQTM4NHhfVFhfU0VUKHYsIEhGQTM4NHhfVFhfQ0ZQT0xMLDEyKQpAQCAtMTY5Niw3MCArMTY2MCw3MCBAQAogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9yeF9mcmFtZQogewogCS8qLS0gTUFDIHJ4IGRlc2NyaXB0b3IgKGhmYTM4NHggYnl0ZSBvcmRlcikgLS0qLwotCVVJTlQxNglzdGF0dXM7Ci0JVUlOVDMyCXRpbWU7Ci0JVUlOVDgJc2lsZW5jZTsKLQlVSU5UOAlzaWduYWw7Ci0JVUlOVDgJcmF0ZTsKLQlVSU5UOAlyeF9mbG93OwotCVVJTlQxNglyZXNlcnZlZDE7Ci0JVUlOVDE2CXJlc2VydmVkMjsKKwl1MTYJc3RhdHVzOworCXUzMgl0aW1lOworCXU4CXNpbGVuY2U7CisJdTgJc2lnbmFsOworCXU4CXJhdGU7CisJdTgJcnhfZmxvdzsKKwl1MTYJcmVzZXJ2ZWQxOworCXUxNglyZXNlcnZlZDI7CiAKIAkvKi0tIDgwMi4xMSBIZWFkZXIgSW5mb3JtYXRpb24gKDgwMi4xMSBieXRlIG9yZGVyKSAtLSovCi0JVUlOVDE2CWZyYW1lX2NvbnRyb2w7Ci0JVUlOVDE2CWR1cmF0aW9uX2lkOwotCVVJTlQ4CWFkZHJlc3MxWzZdOwotCVVJTlQ4CWFkZHJlc3MyWzZdOwotCVVJTlQ4CWFkZHJlc3MzWzZdOwotCVVJTlQxNglzZXF1ZW5jZV9jb250cm9sOwotCVVJTlQ4CWFkZHJlc3M0WzZdOwotCVVJTlQxNglkYXRhX2xlbjsgLyogaGZhMzg0eCAobGl0dGxlIGVuZGlhbikgZm9ybWF0ICovCisJdTE2CWZyYW1lX2NvbnRyb2w7CisJdTE2CWR1cmF0aW9uX2lkOworCXU4CWFkZHJlc3MxWzZdOworCXU4CWFkZHJlc3MyWzZdOworCXU4CWFkZHJlc3MzWzZdOworCXUxNglzZXF1ZW5jZV9jb250cm9sOworCXU4CWFkZHJlc3M0WzZdOworCXUxNglkYXRhX2xlbjsgLyogaGZhMzg0eCAobGl0dGxlIGVuZGlhbikgZm9ybWF0ICovCiAKIAkvKi0tIDgwMi4zIEhlYWRlciBJbmZvcm1hdGlvbiAtLSovCi0JVUlOVDgJZGVzdF9hZGRyWzZdOwotCVVJTlQ4CXNyY19hZGRyWzZdOwotCVVJTlQxNglkYXRhX2xlbmd0aDsgLyogSUVFRT8gKGJpZyBlbmRpYW4pIGZvcm1hdCAqLworCXU4CWRlc3RfYWRkcls2XTsKKwl1OAlzcmNfYWRkcls2XTsKKwl1MTYJZGF0YV9sZW5ndGg7IC8qIElFRUU/IChiaWcgZW5kaWFuKSBmb3JtYXQgKi8KIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9yeF9mcmFtZV90OwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogQ29tbXVuaWNhdGlvbiBGcmFtZXM6IEZpZWxkIE1hc2tzIGZvciBSZWNlaXZlIEZyYW1lcwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyotLSBPZmZzZXRzIC0tLS0tLS0tKi8KLSNkZWZpbmUJCUhGQTM4NHhfUlhfREFUQV9MRU5fT0ZGCQkJKChVSU5UMTYpNDQpCi0jZGVmaW5lCQlIRkEzODR4X1JYXzgwMjExSERSX09GRgkJCSgoVUlOVDE2KTE0KQotI2RlZmluZQkJSEZBMzg0eF9SWF9EQVRBX09GRgkJCSgoVUlOVDE2KTYwKQorI2RlZmluZQkJSEZBMzg0eF9SWF9EQVRBX0xFTl9PRkYJCQkoKHUxNik0NCkKKyNkZWZpbmUJCUhGQTM4NHhfUlhfODAyMTFIRFJfT0ZGCQkJKCh1MTYpMTQpCisjZGVmaW5lCQlIRkEzODR4X1JYX0RBVEFfT0ZGCQkJKCh1MTYpNjApCiAKIC8qLS0gU3RhdHVzIEZpZWxkcyAtLSovCi0jZGVmaW5lCQlIRkEzODR4X1JYU1RBVFVTX01TR1RZUEUJCSgoVUlOVDE2KShCSVQxNSB8IEJJVDE0IHwgQklUMTMpKQotI2RlZmluZQkJSEZBMzg0eF9SWFNUQVRVU19NQUNQT1JUCQkoKFVJTlQxNikoQklUMTAgfCBCSVQ5IHwgQklUOCkpCi0jZGVmaW5lCQlIRkEzODR4X1JYU1RBVFVTX1VOREVDUgkJCSgoVUlOVDE2KUJJVDEpCi0jZGVmaW5lCQlIRkEzODR4X1JYU1RBVFVTX0ZDU0VSUgkJCSgoVUlOVDE2KUJJVDApCisjZGVmaW5lCQlIRkEzODR4X1JYU1RBVFVTX01TR1RZUEUJCSgodTE2KShCSVQxNSB8IEJJVDE0IHwgQklUMTMpKQorI2RlZmluZQkJSEZBMzg0eF9SWFNUQVRVU19NQUNQT1JUCQkoKHUxNikoQklUMTAgfCBCSVQ5IHwgQklUOCkpCisjZGVmaW5lCQlIRkEzODR4X1JYU1RBVFVTX1VOREVDUgkJCSgodTE2KUJJVDEpCisjZGVmaW5lCQlIRkEzODR4X1JYU1RBVFVTX0ZDU0VSUgkJCSgodTE2KUJJVDApCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBDb21tdW5pY2F0aW9uIEZyYW1lczogVGVzdC9HZXQvU2V0IEZpZWxkIFZhbHVlcyBmb3IgUmVjZWl2ZSBGcmFtZXMKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNkZWZpbmUJCUhGQTM4NHhfUlhTVEFUVVNfTVNHVFlQRV9HRVQodmFsdWUpCSgoVUlOVDE2KSgoKChVSU5UMTYpKHZhbHVlKSkgJiBIRkEzODR4X1JYU1RBVFVTX01TR1RZUEUpID4+IDEzKSkKLSNkZWZpbmUJCUhGQTM4NHhfUlhTVEFUVVNfTVNHVFlQRV9TRVQodmFsdWUpCSgoVUlOVDE2KSgoKFVJTlQxNikodmFsdWUpKSA8PCAxMykpCi0jZGVmaW5lCQlIRkEzODR4X1JYU1RBVFVTX01BQ1BPUlRfR0VUKHZhbHVlKQkoKFVJTlQxNikoKCgoVUlOVDE2KSh2YWx1ZSkpICYgSEZBMzg0eF9SWFNUQVRVU19NQUNQT1JUKSA+PiA4KSkKLSNkZWZpbmUJCUhGQTM4NHhfUlhTVEFUVVNfTUFDUE9SVF9TRVQodmFsdWUpCSgoVUlOVDE2KSgoKFVJTlQxNikodmFsdWUpKSA8PCA4KSkKLSNkZWZpbmUJCUhGQTM4NHhfUlhTVEFUVVNfSVNVTkRFQ1IodmFsdWUpCSgoVUlOVDE2KSgoKFVJTlQxNikodmFsdWUpKSAmIEhGQTM4NHhfUlhTVEFUVVNfVU5ERUNSKSkKLSNkZWZpbmUJCUhGQTM4NHhfUlhTVEFUVVNfSVNGQ1NFUlIodmFsdWUpCSgoVUlOVDE2KSgoKFVJTlQxNikodmFsdWUpKSAmIEhGQTM4NHhfUlhTVEFUVVNfRkNTRVJSKSkKKyNkZWZpbmUJCUhGQTM4NHhfUlhTVEFUVVNfTVNHVFlQRV9HRVQodmFsdWUpCSgodTE2KSgoKCh1MTYpKHZhbHVlKSkgJiBIRkEzODR4X1JYU1RBVFVTX01TR1RZUEUpID4+IDEzKSkKKyNkZWZpbmUJCUhGQTM4NHhfUlhTVEFUVVNfTVNHVFlQRV9TRVQodmFsdWUpCSgodTE2KSgoKHUxNikodmFsdWUpKSA8PCAxMykpCisjZGVmaW5lCQlIRkEzODR4X1JYU1RBVFVTX01BQ1BPUlRfR0VUKHZhbHVlKQkoKHUxNikoKCgodTE2KSh2YWx1ZSkpICYgSEZBMzg0eF9SWFNUQVRVU19NQUNQT1JUKSA+PiA4KSkKKyNkZWZpbmUJCUhGQTM4NHhfUlhTVEFUVVNfTUFDUE9SVF9TRVQodmFsdWUpCSgodTE2KSgoKHUxNikodmFsdWUpKSA8PCA4KSkKKyNkZWZpbmUJCUhGQTM4NHhfUlhTVEFUVVNfSVNVTkRFQ1IodmFsdWUpCSgodTE2KSgoKHUxNikodmFsdWUpKSAmIEhGQTM4NHhfUlhTVEFUVVNfVU5ERUNSKSkKKyNkZWZpbmUJCUhGQTM4NHhfUlhTVEFUVVNfSVNGQ1NFUlIodmFsdWUpCSgodTE2KSgoKHUxNikodmFsdWUpKSAmIEhGQTM4NHhfUlhTVEFUVVNfRkNTRVJSKSkKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICBGUkFNRSBTVFJVQ1RVUkVTOiBJbmZvcm1hdGlvbiBUeXBlcyBhbmQgSW5mb3JtYXRpb24gRnJhbWUgU3RydWN0dXJlcwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogSW5mb3JtYXRpb24gVHlwZXMKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNkZWZpbmUJCUhGQTM4NHhfSVRfSEFORE9WRVJBRERSCQkJKChVSU5UMTYpMHhGMDAwVUwpCi0jZGVmaW5lCQlIRkEzODR4X0lUX0hBTkRPVkVSREVBVVRIQUREUkVTUwkoKFVJTlQxNikweEYwMDFVTCkvL0FQIDEuMy43Ci0jZGVmaW5lCQlIRkEzODR4X0lUX0NPTU1UQUxMSUVTCQkJKChVSU5UMTYpMHhGMTAwVUwpCi0jZGVmaW5lCQlIRkEzODR4X0lUX1NDQU5SRVNVTFRTCQkJKChVSU5UMTYpMHhGMTAxVUwpCi0jZGVmaW5lCQlIRkEzODR4X0lUX0NISU5GT1JFU1VMVFMJCSgoVUlOVDE2KTB4RjEwMlVMKQotI2RlZmluZQkJSEZBMzg0eF9JVF9IT1NUU0NBTlJFU1VMVFMJCSgoVUlOVDE2KTB4RjEwM1VMKQotI2RlZmluZQkJSEZBMzg0eF9JVF9MSU5LU1RBVFVTCQkJKChVSU5UMTYpMHhGMjAwVUwpCi0jZGVmaW5lCQlIRkEzODR4X0lUX0FTU09DU1RBVFVTCQkJKChVSU5UMTYpMHhGMjAxVUwpCi0jZGVmaW5lCQlIRkEzODR4X0lUX0FVVEhSRVEJCQkoKFVJTlQxNikweEYyMDJVTCkKLSNkZWZpbmUJCUhGQTM4NHhfSVRfUFNVU0VSQ05UCQkJKChVSU5UMTYpMHhGMjAzVUwpCi0jZGVmaW5lCQlIRkEzODR4X0lUX0tFWUlEQ0hBTkdFRAkJCSgoVUlOVDE2KTB4RjIwNFVMKQotI2RlZmluZQkJSEZBMzg0eF9JVF9BU1NPQ1JFUSAgICAJCQkoKFVJTlQxNikweEYyMDVVTCkKLSNkZWZpbmUJCUhGQTM4NHhfSVRfTUlDRkFJTFVSRSAgCQkJKChVSU5UMTYpMHhGMjA2VUwpCisjZGVmaW5lCQlIRkEzODR4X0lUX0hBTkRPVkVSQUREUgkJCSgodTE2KTB4RjAwMFVMKQorI2RlZmluZQkJSEZBMzg0eF9JVF9IQU5ET1ZFUkRFQVVUSEFERFJFU1MJKCh1MTYpMHhGMDAxVUwpLy9BUCAxLjMuNworI2RlZmluZQkJSEZBMzg0eF9JVF9DT01NVEFMTElFUwkJCSgodTE2KTB4RjEwMFVMKQorI2RlZmluZQkJSEZBMzg0eF9JVF9TQ0FOUkVTVUxUUwkJCSgodTE2KTB4RjEwMVVMKQorI2RlZmluZQkJSEZBMzg0eF9JVF9DSElORk9SRVNVTFRTCQkoKHUxNikweEYxMDJVTCkKKyNkZWZpbmUJCUhGQTM4NHhfSVRfSE9TVFNDQU5SRVNVTFRTCQkoKHUxNikweEYxMDNVTCkKKyNkZWZpbmUJCUhGQTM4NHhfSVRfTElOS1NUQVRVUwkJCSgodTE2KTB4RjIwMFVMKQorI2RlZmluZQkJSEZBMzg0eF9JVF9BU1NPQ1NUQVRVUwkJCSgodTE2KTB4RjIwMVVMKQorI2RlZmluZQkJSEZBMzg0eF9JVF9BVVRIUkVRCQkJKCh1MTYpMHhGMjAyVUwpCisjZGVmaW5lCQlIRkEzODR4X0lUX1BTVVNFUkNOVAkJCSgodTE2KTB4RjIwM1VMKQorI2RlZmluZQkJSEZBMzg0eF9JVF9LRVlJRENIQU5HRUQJCQkoKHUxNikweEYyMDRVTCkKKyNkZWZpbmUJCUhGQTM4NHhfSVRfQVNTT0NSRVEgICAgCQkJKCh1MTYpMHhGMjA1VUwpCisjZGVmaW5lCQlIRkEzODR4X0lUX01JQ0ZBSUxVUkUgIAkJCSgodTE2KTB4RjIwNlVMKQogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBJbmZvcm1hdGlvbiBGcmFtZXMgU3RydWN0dXJlcwpAQCAtMTc2OSw4MCArMTczMyw4MCBAQAogLyotLSAgTm90aWZpY2F0aW9uIEZyYW1lLE1BQyBNZ210OiBIYW5kb3ZlciBBZGRyZXNzIC0tKi8KIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfSGFuZG92ZXJBZGRyCiB7Ci0JVUlOVDE2CWZyYW1lbGVuOwotCVVJTlQxNglpbmZvdHlwZTsKLQlVSU5UOAloYW5kb3Zlcl9hZGRyW1dMQU5fQlNTSURfTEVOXTsKKwl1MTYJZnJhbWVsZW47CisJdTE2CWluZm90eXBlOworCXU4CWhhbmRvdmVyX2FkZHJbV0xBTl9CU1NJRF9MRU5dOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X0hhbmRvdmVyQWRkcl90OwogCiAvKi0tICBJbnF1aXJ5IEZyYW1lLCBEaWFnbm9zZTogQ29tbXVuaWNhdGlvbiBUYWxsaWVzIC0tKi8KIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfQ29tbVRhbGxpZXMxNgogewotCVVJTlQxNgl0eHVuaWNhc3RmcmFtZXM7Ci0JVUlOVDE2CXR4bXVsdGljYXN0ZnJhbWVzOwotCVVJTlQxNgl0eGZyYWdtZW50czsKLQlVSU5UMTYJdHh1bmljYXN0b2N0ZXRzOwotCVVJTlQxNgl0eG11bHRpY2FzdG9jdGV0czsKLQlVSU5UMTYJdHhkZWZlcnJlZHRyYW5zOwotCVVJTlQxNgl0eHNpbmdsZXJldHJ5ZnJhbWVzOwotCVVJTlQxNgl0eG11bHRpcGxlcmV0cnlmcmFtZXM7Ci0JVUlOVDE2CXR4cmV0cnlsaW1pdGV4Y2VlZGVkOwotCVVJTlQxNgl0eGRpc2NhcmRzOwotCVVJTlQxNglyeHVuaWNhc3RmcmFtZXM7Ci0JVUlOVDE2CXJ4bXVsdGljYXN0ZnJhbWVzOwotCVVJTlQxNglyeGZyYWdtZW50czsKLQlVSU5UMTYJcnh1bmljYXN0b2N0ZXRzOwotCVVJTlQxNglyeG11bHRpY2FzdG9jdGV0czsKLQlVSU5UMTYJcnhmY3NlcnJvcnM7Ci0JVUlOVDE2CXJ4ZGlzY2FyZHNub2J1ZmZlcjsKLQlVSU5UMTYJdHhkaXNjYXJkc3dyb25nc2E7Ci0JVUlOVDE2CXJ4ZGlzY2FyZHN3ZXB1bmRlY3I7Ci0JVUlOVDE2CXJ4bXNnaW5tc2dmcmFnOwotCVVJTlQxNglyeG1zZ2luYmFkbXNnZnJhZzsKKwl1MTYJdHh1bmljYXN0ZnJhbWVzOworCXUxNgl0eG11bHRpY2FzdGZyYW1lczsKKwl1MTYJdHhmcmFnbWVudHM7CisJdTE2CXR4dW5pY2FzdG9jdGV0czsKKwl1MTYJdHhtdWx0aWNhc3RvY3RldHM7CisJdTE2CXR4ZGVmZXJyZWR0cmFuczsKKwl1MTYJdHhzaW5nbGVyZXRyeWZyYW1lczsKKwl1MTYJdHhtdWx0aXBsZXJldHJ5ZnJhbWVzOworCXUxNgl0eHJldHJ5bGltaXRleGNlZWRlZDsKKwl1MTYJdHhkaXNjYXJkczsKKwl1MTYJcnh1bmljYXN0ZnJhbWVzOworCXUxNglyeG11bHRpY2FzdGZyYW1lczsKKwl1MTYJcnhmcmFnbWVudHM7CisJdTE2CXJ4dW5pY2FzdG9jdGV0czsKKwl1MTYJcnhtdWx0aWNhc3RvY3RldHM7CisJdTE2CXJ4ZmNzZXJyb3JzOworCXUxNglyeGRpc2NhcmRzbm9idWZmZXI7CisJdTE2CXR4ZGlzY2FyZHN3cm9uZ3NhOworCXUxNglyeGRpc2NhcmRzd2VwdW5kZWNyOworCXUxNglyeG1zZ2lubXNnZnJhZzsKKwl1MTYJcnhtc2dpbmJhZG1zZ2ZyYWc7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfQ29tbVRhbGxpZXMxNl90OwogCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X0NvbW1UYWxsaWVzMzIKIHsKLQlVSU5UMzIJdHh1bmljYXN0ZnJhbWVzOwotCVVJTlQzMgl0eG11bHRpY2FzdGZyYW1lczsKLQlVSU5UMzIJdHhmcmFnbWVudHM7Ci0JVUlOVDMyCXR4dW5pY2FzdG9jdGV0czsKLQlVSU5UMzIJdHhtdWx0aWNhc3RvY3RldHM7Ci0JVUlOVDMyCXR4ZGVmZXJyZWR0cmFuczsKLQlVSU5UMzIJdHhzaW5nbGVyZXRyeWZyYW1lczsKLQlVSU5UMzIJdHhtdWx0aXBsZXJldHJ5ZnJhbWVzOwotCVVJTlQzMgl0eHJldHJ5bGltaXRleGNlZWRlZDsKLQlVSU5UMzIJdHhkaXNjYXJkczsKLQlVSU5UMzIJcnh1bmljYXN0ZnJhbWVzOwotCVVJTlQzMglyeG11bHRpY2FzdGZyYW1lczsKLQlVSU5UMzIJcnhmcmFnbWVudHM7Ci0JVUlOVDMyCXJ4dW5pY2FzdG9jdGV0czsKLQlVSU5UMzIJcnhtdWx0aWNhc3RvY3RldHM7Ci0JVUlOVDMyCXJ4ZmNzZXJyb3JzOwotCVVJTlQzMglyeGRpc2NhcmRzbm9idWZmZXI7Ci0JVUlOVDMyCXR4ZGlzY2FyZHN3cm9uZ3NhOwotCVVJTlQzMglyeGRpc2NhcmRzd2VwdW5kZWNyOwotCVVJTlQzMglyeG1zZ2lubXNnZnJhZzsKLQlVSU5UMzIJcnhtc2dpbmJhZG1zZ2ZyYWc7CisJdTMyCXR4dW5pY2FzdGZyYW1lczsKKwl1MzIJdHhtdWx0aWNhc3RmcmFtZXM7CisJdTMyCXR4ZnJhZ21lbnRzOworCXUzMgl0eHVuaWNhc3RvY3RldHM7CisJdTMyCXR4bXVsdGljYXN0b2N0ZXRzOworCXUzMgl0eGRlZmVycmVkdHJhbnM7CisJdTMyCXR4c2luZ2xlcmV0cnlmcmFtZXM7CisJdTMyCXR4bXVsdGlwbGVyZXRyeWZyYW1lczsKKwl1MzIJdHhyZXRyeWxpbWl0ZXhjZWVkZWQ7CisJdTMyCXR4ZGlzY2FyZHM7CisJdTMyCXJ4dW5pY2FzdGZyYW1lczsKKwl1MzIJcnhtdWx0aWNhc3RmcmFtZXM7CisJdTMyCXJ4ZnJhZ21lbnRzOworCXUzMglyeHVuaWNhc3RvY3RldHM7CisJdTMyCXJ4bXVsdGljYXN0b2N0ZXRzOworCXUzMglyeGZjc2Vycm9yczsKKwl1MzIJcnhkaXNjYXJkc25vYnVmZmVyOworCXUzMgl0eGRpc2NhcmRzd3JvbmdzYTsKKwl1MzIJcnhkaXNjYXJkc3dlcHVuZGVjcjsKKwl1MzIJcnhtc2dpbm1zZ2ZyYWc7CisJdTMyCXJ4bXNnaW5iYWRtc2dmcmFnOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X0NvbW1UYWxsaWVzMzJfdDsKIAogLyotLSAgSW5xdWlyeSBGcmFtZSwgRGlhZ25vc2U6IFNjYW4gUmVzdWx0cyAmIFN1YmZpZWxkcy0tKi8KIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfU2NhblJlc3VsdFN1YgogewotCVVJTlQxNgljaGlkOwotCVVJTlQxNglhbmw7Ci0JVUlOVDE2CXNsOwotCVVJTlQ4CWJzc2lkW1dMQU5fQlNTSURfTEVOXTsKLQlVSU5UMTYJYmNuaW50OwotCVVJTlQxNgljYXBpbmZvOworCXUxNgljaGlkOworCXUxNglhbmw7CisJdTE2CXNsOworCXU4CWJzc2lkW1dMQU5fQlNTSURfTEVOXTsKKwl1MTYJYmNuaW50OworCXUxNgljYXBpbmZvOwogCWhmYTM4NHhfYnl0ZXN0cjMyX3QJc3NpZDsKLQlVSU5UOAlzdXBwcmF0ZXNbMTBdOyAvKiA4MDIuMTEgaW5mbyBlbGVtZW50ICovCi0JVUlOVDE2CXByb2JlcmVzcF9yYXRlOworCXU4CXN1cHByYXRlc1sxMF07IC8qIDgwMi4xMSBpbmZvIGVsZW1lbnQgKi8KKwl1MTYJcHJvYmVyZXNwX3JhdGU7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfU2NhblJlc3VsdFN1Yl90OwogCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X1NjYW5SZXN1bHQKIHsKLQlVSU5UMTYJcnN2ZDsKLQlVSU5UMTYJc2NhbnJlYXNvbjsKKwl1MTYJcnN2ZDsKKwl1MTYJc2NhbnJlYXNvbjsKIAloZmEzODR4X1NjYW5SZXN1bHRTdWJfdAogCQlyZXN1bHRbSEZBMzg0eF9TQ0FOUkVTVUxUX01BWF07CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfU2NhblJlc3VsdF90OwpAQCAtMTg1MCwxMCArMTgxNCwxMCBAQAogLyotLSAgSW5xdWlyeSBGcmFtZSwgRGlhZ25vc2U6IENoSW5mbyBSZXN1bHRzICYgU3ViZmllbGRzLS0qLwogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9DaEluZm9SZXN1bHRTdWIKIHsKLQlVSU5UMTYJY2hpZDsKLQlVSU5UMTYJYW5sOwotCVVJTlQxNglwbmw7Ci0JVUlOVDE2CWFjdGl2ZTsKKwl1MTYJY2hpZDsKKwl1MTYJYW5sOworCXUxNglwbmw7CisJdTE2CWFjdGl2ZTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9DaEluZm9SZXN1bHRTdWJfdDsKIAogI2RlZmluZSBIRkEzODR4X0NISU5GT1JFU1VMVF9CU1NBQ1RJVkUJQklUMApAQCAtMTg2MSw3ICsxODI1LDcgQEAKIAogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9DaEluZm9SZXN1bHQKIHsKLQlVSU5UMTYJc2NhbmNoYW5uZWxzOworCXUxNglzY2FuY2hhbm5lbHM7CiAJaGZhMzg0eF9DaEluZm9SZXN1bHRTdWJfdAogCQlyZXN1bHRbSEZBMzg0eF9DSElORk9SRVNVTFRfTUFYXTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9DaEluZm9SZXN1bHRfdDsKQEAgLTE4NjksNzUgKzE4MzMsNzUgQEAKIC8qLS0gIElucXVpcnkgRnJhbWUsIERpYWdub3NlOiBIb3N0IFNjYW4gUmVzdWx0cyAmIFN1YmZpZWxkcy0tKi8KIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfSFNjYW5SZXN1bHRTdWIKIHsKLQlVSU5UMTYJY2hpZDsKLQlVSU5UMTYJYW5sOwotCVVJTlQxNglzbDsKLQlVSU5UOAlic3NpZFtXTEFOX0JTU0lEX0xFTl07Ci0JVUlOVDE2CWJjbmludDsKLQlVSU5UMTYJY2FwaW5mbzsKKwl1MTYJY2hpZDsKKwl1MTYJYW5sOworCXUxNglzbDsKKwl1OAlic3NpZFtXTEFOX0JTU0lEX0xFTl07CisJdTE2CWJjbmludDsKKwl1MTYJY2FwaW5mbzsKIAloZmEzODR4X2J5dGVzdHIzMl90CXNzaWQ7Ci0JVUlOVDgJc3VwcHJhdGVzWzEwXTsgLyogODAyLjExIGluZm8gZWxlbWVudCAqLwotCVVJTlQxNglwcm9iZXJlc3BfcmF0ZTsKLQlVSU5UMTYJYXRpbTsKKwl1OAlzdXBwcmF0ZXNbMTBdOyAvKiA4MDIuMTEgaW5mbyBlbGVtZW50ICovCisJdTE2CXByb2JlcmVzcF9yYXRlOworCXUxNglhdGltOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X0hTY2FuUmVzdWx0U3ViX3Q7CiAKIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfSFNjYW5SZXN1bHQKIHsKLQlVSU5UMTYJbnJlc3VsdDsKLQlVSU5UMTYJcnN2ZDsKKwl1MTYJbnJlc3VsdDsKKwl1MTYJcnN2ZDsKIAloZmEzODR4X0hTY2FuUmVzdWx0U3ViX3QKIAkJcmVzdWx0W0hGQTM4NHhfSFNDQU5SRVNVTFRfTUFYXTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9IU2NhblJlc3VsdF90OwogCiAvKi0tICBVbnNvbGljaXRlZCBGcmFtZSwgTUFDIE1nbXQ6IExpbmtTdGF0dXMgLS0qLwogCi0jZGVmaW5lIEhGQTM4NHhfTElOS19OT1RDT05ORUNURUQJKChVSU5UMTYpMCkKLSNkZWZpbmUgSEZBMzg0eF9MSU5LX0NPTk5FQ1RFRAkJKChVSU5UMTYpMSkKLSNkZWZpbmUgSEZBMzg0eF9MSU5LX0RJU0NPTk5FQ1RFRAkoKFVJTlQxNikyKQotI2RlZmluZSBIRkEzODR4X0xJTktfQVBfQ0hBTkdFCQkoKFVJTlQxNikzKQotI2RlZmluZSBIRkEzODR4X0xJTktfQVBfT1VUT0ZSQU5HRQkoKFVJTlQxNik0KQotI2RlZmluZSBIRkEzODR4X0xJTktfQVBfSU5SQU5HRQkJKChVSU5UMTYpNSkKLSNkZWZpbmUgSEZBMzg0eF9MSU5LX0FTU09DRkFJTAkJKChVSU5UMTYpNikKKyNkZWZpbmUgSEZBMzg0eF9MSU5LX05PVENPTk5FQ1RFRAkoKHUxNikwKQorI2RlZmluZSBIRkEzODR4X0xJTktfQ09OTkVDVEVECQkoKHUxNikxKQorI2RlZmluZSBIRkEzODR4X0xJTktfRElTQ09OTkVDVEVECSgodTE2KTIpCisjZGVmaW5lIEhGQTM4NHhfTElOS19BUF9DSEFOR0UJCSgodTE2KTMpCisjZGVmaW5lIEhGQTM4NHhfTElOS19BUF9PVVRPRlJBTkdFCSgodTE2KTQpCisjZGVmaW5lIEhGQTM4NHhfTElOS19BUF9JTlJBTkdFCQkoKHUxNik1KQorI2RlZmluZSBIRkEzODR4X0xJTktfQVNTT0NGQUlMCQkoKHUxNik2KQogCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X0xpbmtTdGF0dXMKIHsKLQlVSU5UMTYJbGlua3N0YXR1czsKKwl1MTYJbGlua3N0YXR1czsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9MaW5rU3RhdHVzX3Q7CiAKIAogLyotLSAgVW5zb2xpY2l0ZWQgRnJhbWUsIE1BQyBNZ210OiBBc3NvY2lhdGlvblN0YXR1cyAoLS0qLwogCi0jZGVmaW5lIEhGQTM4NHhfQVNTT0NTVEFUVVNfU1RBQVNTT0MJKChVSU5UMTYpMSkKLSNkZWZpbmUgSEZBMzg0eF9BU1NPQ1NUQVRVU19SRUFTU09DCSgoVUlOVDE2KTIpCi0jZGVmaW5lIEhGQTM4NHhfQVNTT0NTVEFUVVNfRElTQVNTT0MJKChVSU5UMTYpMykKLSNkZWZpbmUgSEZBMzg0eF9BU1NPQ1NUQVRVU19BU1NPQ0ZBSUwJKChVSU5UMTYpNCkKLSNkZWZpbmUgSEZBMzg0eF9BU1NPQ1NUQVRVU19BVVRIRkFJTAkoKFVJTlQxNik1KQorI2RlZmluZSBIRkEzODR4X0FTU09DU1RBVFVTX1NUQUFTU09DCSgodTE2KTEpCisjZGVmaW5lIEhGQTM4NHhfQVNTT0NTVEFUVVNfUkVBU1NPQwkoKHUxNikyKQorI2RlZmluZSBIRkEzODR4X0FTU09DU1RBVFVTX0RJU0FTU09DCSgodTE2KTMpCisjZGVmaW5lIEhGQTM4NHhfQVNTT0NTVEFUVVNfQVNTT0NGQUlMCSgodTE2KTQpCisjZGVmaW5lIEhGQTM4NHhfQVNTT0NTVEFUVVNfQVVUSEZBSUwJKCh1MTYpNSkKIAogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9Bc3NvY1N0YXR1cwogewotCVVJTlQxNglhc3NvY3N0YXR1czsKLQlVSU5UOAlzdGFfYWRkcltXTEFOX0FERFJfTEVOXTsKKwl1MTYJYXNzb2NzdGF0dXM7CisJdTgJc3RhX2FkZHJbV0xBTl9BRERSX0xFTl07CiAJLyogb2xkX2FwX2FkZHIgaXMgb25seSB2YWxpZCBpZiBhc3NvY3N0YXR1cyA9PSAyICovCi0JVUlOVDgJb2xkX2FwX2FkZHJbV0xBTl9BRERSX0xFTl07Ci0JVUlOVDE2CXJlYXNvbjsKLQlVSU5UMTYJcmVzZXJ2ZWQ7CisJdTgJb2xkX2FwX2FkZHJbV0xBTl9BRERSX0xFTl07CisJdTE2CXJlYXNvbjsKKwl1MTYJcmVzZXJ2ZWQ7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfQXNzb2NTdGF0dXNfdDsKIAogLyotLSAgVW5zb2xpY2l0ZWQgRnJhbWUsIE1BQyBNZ210OiBBdXRoUmVxdWVzdCAoQVAgT25seSkgLS0qLwogCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X0F1dGhSZXF1ZXN0CiB7Ci0JVUlOVDgJc3RhX2FkZHJbV0xBTl9BRERSX0xFTl07Ci0JVUlOVDE2CWFsZ29yaXRobTsKKwl1OAlzdGFfYWRkcltXTEFOX0FERFJfTEVOXTsKKwl1MTYJYWxnb3JpdGhtOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X0F1dGhSZXFfdDsKIAogLyotLSAgVW5zb2xpY2l0ZWQgRnJhbWUsIE1BQyBNZ210OiBBc3NvY1JlcXVlc3QgKEFQIE9ubHkpIC0tKi8KIAogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9Bc3NvY1JlcXVlc3QKIHsKLQlVSU5UOAlzdGFfYWRkcltXTEFOX0FERFJfTEVOXTsKLQlVSU5UMTYJdHlwZTsKLQlVSU5UOCAgIHdwYV9kYXRhWzgwXTsKKwl1OAlzdGFfYWRkcltXTEFOX0FERFJfTEVOXTsKKwl1MTYJdHlwZTsKKwl1OCAgIHdwYV9kYXRhWzgwXTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9Bc3NvY1JlcV90OwogCiAKQEAgLTE5NDgsMjEgKzE5MTIsMjEgQEAKIAogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9NaWNGYWlsdXJlCiB7Ci0JVUlOVDgJc2VuZGVyW1dMQU5fQUREUl9MRU5dOwotCVVJTlQ4CWRlc3RbV0xBTl9BRERSX0xFTl07CisJdTgJc2VuZGVyW1dMQU5fQUREUl9MRU5dOworCXU4CWRlc3RbV0xBTl9BRERSX0xFTl07CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfTWljRmFpbHVyZV90OwogCiAvKi0tICBVbnNvbGljaXRlZCBGcmFtZSwgTUFDIE1nbXQ6IFBTVXNlckNvdW50IChBUCBPbmx5KSAtLSovCiAKIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfUFNVc2VyQ291bnQKIHsKLQlVSU5UMTYJdXNlcmNudDsKKwl1MTYJdXNlcmNudDsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9QU1VzZXJDb3VudF90OwogCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X0tleUlEQ2hhbmdlZAogewotCVVJTlQ4CXN0YV9hZGRyW1dMQU5fQUREUl9MRU5dOwotCVVJTlQxNglrZXlpZDsKKwl1OAlzdGFfYWRkcltXTEFOX0FERFJfTEVOXTsKKwl1MTYJa2V5aWQ7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfS2V5SURDaGFuZ2VkX3Q7CiAKIC8qLS0gIENvbGxlY3Rpb24gb2YgYWxsIEluZiBmcmFtZXMgLS0tLS0tLS0tLS0tLS0tKi8KQEAgLTE5ODEsMTIgKzE5NDUsMTEgQEAKIAogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9JbmZGcmFtZQogewotCVVJTlQxNgkJCWZyYW1lbGVuOwotCVVJTlQxNgkJCWluZm90eXBlOworCXUxNgkJCWZyYW1lbGVuOworCXUxNgkJCWluZm90eXBlOwogCWhmYTM4NHhfaW5mb2RhdGFfdAlpbmZvOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X0luZkZyYW1lX3Q7CiAKLSNpZiAoV0xBTl9IT1NUSUYgPT0gV0xBTl9VU0IpCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBVU0IgUGFja2V0IHN0cnVjdHVyZXMgYW5kIGNvbnN0YW50cy4KIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KQEAgLTIwMjAsNDYgKzE5ODMsNDYgQEAKIAogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF91c2JfdHhmcm0gewogCWhmYTM4NHhfdHhfZnJhbWVfdAlkZXNjOwotCVVJTlQ4CQkJZGF0YVtXTEFOX0RBVEFfTUFYTEVOXTsKKwl1OAkJCWRhdGFbV0xBTl9EQVRBX01BWExFTl07CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfdXNiX3R4ZnJtX3Q7CiAKIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfdXNiX2NtZHJlcSB7Ci0JVUlOVDE2CQl0eXBlOwotCVVJTlQxNgkJY21kOwotCVVJTlQxNgkJcGFybTA7Ci0JVUlOVDE2CQlwYXJtMTsKLQlVSU5UMTYJCXBhcm0yOwotCVVJTlQ4CQlwYWRbNTRdOworCXUxNgkJdHlwZTsKKwl1MTYJCWNtZDsKKwl1MTYJCXBhcm0wOworCXUxNgkJcGFybTE7CisJdTE2CQlwYXJtMjsKKwl1OAkJcGFkWzU0XTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF91c2JfY21kcmVxX3Q7CiAKIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfdXNiX3dyaWRyZXEgewotCVVJTlQxNgkJdHlwZTsKLQlVSU5UMTYJCWZybWxlbjsKLQlVSU5UMTYJCXJpZDsKLQlVSU5UOAkJZGF0YVtIRkEzODR4X1JJRERBVEFfTUFYTEVOXTsKKwl1MTYJCXR5cGU7CisJdTE2CQlmcm1sZW47CisJdTE2CQlyaWQ7CisJdTgJCWRhdGFbSEZBMzg0eF9SSUREQVRBX01BWExFTl07CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfdXNiX3dyaWRyZXFfdDsKIAogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF91c2JfcnJpZHJlcSB7Ci0JVUlOVDE2CQl0eXBlOwotCVVJTlQxNgkJZnJtbGVuOwotCVVJTlQxNgkJcmlkOwotCVVJTlQ4CQlwYWRbNThdOworCXUxNgkJdHlwZTsKKwl1MTYJCWZybWxlbjsKKwl1MTYJCXJpZDsKKwl1OAkJcGFkWzU4XTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF91c2JfcnJpZHJlcV90OwogCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X3VzYl93bWVtcmVxIHsKLQlVSU5UMTYJCXR5cGU7Ci0JVUlOVDE2CQlmcm1sZW47Ci0JVUlOVDE2CQlvZmZzZXQ7Ci0JVUlOVDE2CQlwYWdlOwotCVVJTlQ4CQlkYXRhW0hGQTM4NHhfVVNCX1JXTUVNX01BWExFTl07CisJdTE2CQl0eXBlOworCXUxNgkJZnJtbGVuOworCXUxNgkJb2Zmc2V0OworCXUxNgkJcGFnZTsKKwl1OAkJZGF0YVtIRkEzODR4X1VTQl9SV01FTV9NQVhMRU5dOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X3VzYl93bWVtcmVxX3Q7CiAKIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfdXNiX3JtZW1yZXEgewotCVVJTlQxNgkJdHlwZTsKLQlVSU5UMTYJCWZybWxlbjsKLQlVSU5UMTYJCW9mZnNldDsKLQlVSU5UMTYJCXBhZ2U7Ci0JVUlOVDgJCXBhZFs1Nl07CisJdTE2CQl0eXBlOworCXUxNgkJZnJtbGVuOworCXUxNgkJb2Zmc2V0OworCXUxNgkJcGFnZTsKKwl1OAkJcGFkWzU2XTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF91c2Jfcm1lbXJlcV90OwogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCkBAIC0yMDY3LDU0ICsyMDMwLDU0IEBACiAKIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfdXNiX3J4ZnJtIHsKIAloZmEzODR4X3J4X2ZyYW1lX3QJZGVzYzsKLQlVSU5UOAkJCWRhdGFbV0xBTl9EQVRBX01BWExFTl07CisJdTgJCQlkYXRhW1dMQU5fREFUQV9NQVhMRU5dOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X3VzYl9yeGZybV90OwogCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X3VzYl9pbmZvZnJtIHsKLQlVSU5UMTYJCQl0eXBlOworCXUxNgkJCXR5cGU7CiAJaGZhMzg0eF9JbmZGcmFtZV90CWluZm87CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfdXNiX2luZm9mcm1fdDsKIAogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF91c2Jfc3RhdHVzcmVzcCB7Ci0JVUlOVDE2CQl0eXBlOwotCVVJTlQxNgkJc3RhdHVzOwotCVVJTlQxNgkJcmVzcDA7Ci0JVUlOVDE2CQlyZXNwMTsKLQlVSU5UMTYJCXJlc3AyOworCXUxNgkJdHlwZTsKKwl1MTYJCXN0YXR1czsKKwl1MTYJCXJlc3AwOworCXUxNgkJcmVzcDE7CisJdTE2CQlyZXNwMjsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF91c2JfY21kcmVzcF90OwogCiB0eXBlZGVmIGhmYTM4NHhfdXNiX2NtZHJlc3BfdCBoZmEzODR4X3VzYl93cmlkcmVzcF90OwogCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X3VzYl9ycmlkcmVzcCB7Ci0JVUlOVDE2CQl0eXBlOwotCVVJTlQxNgkJZnJtbGVuOwotCVVJTlQxNgkJcmlkOwotCVVJTlQ4CQlkYXRhW0hGQTM4NHhfUklEREFUQV9NQVhMRU5dOworCXUxNgkJdHlwZTsKKwl1MTYJCWZybWxlbjsKKwl1MTYJCXJpZDsKKwl1OAkJZGF0YVtIRkEzODR4X1JJRERBVEFfTUFYTEVOXTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF91c2JfcnJpZHJlc3BfdDsKIAogdHlwZWRlZiBoZmEzODR4X3VzYl9jbWRyZXNwX3QgaGZhMzg0eF91c2Jfd21lbXJlc3BfdDsKIAogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF91c2Jfcm1lbXJlc3AgewotCVVJTlQxNgkJdHlwZTsKLQlVSU5UMTYJCWZybWxlbjsKLQlVSU5UOAkJZGF0YVtIRkEzODR4X1VTQl9SV01FTV9NQVhMRU5dOworCXUxNgkJdHlwZTsKKwl1MTYJCWZybWxlbjsKKwl1OAkJZGF0YVtIRkEzODR4X1VTQl9SV01FTV9NQVhMRU5dOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X3VzYl9ybWVtcmVzcF90OwogCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X3VzYl9idWZhdmFpbCB7Ci0JVUlOVDE2CQl0eXBlOwotCVVJTlQxNgkJZnJtbGVuOworCXUxNgkJdHlwZTsKKwl1MTYJCWZybWxlbjsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF91c2JfYnVmYXZhaWxfdDsKIAogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF91c2JfZXJyb3IgewotCVVJTlQxNgkJdHlwZTsKLQlVSU5UMTYJCWVycm9ydHlwZTsKKwl1MTYJCXR5cGU7CisJdTE2CQllcnJvcnR5cGU7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfdXNiX2Vycm9yX3Q7CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKiBVbmlvbnMgZm9yIHBhY2thZ2luZyBhbGwgdGhlIGtub3duIHBhY2tldCB0eXBlcyB0b2dldGhlciAqLwogCiB0eXBlZGVmIHVuaW9uIGhmYTM4NHhfdXNib3V0IHsKLQlVSU5UMTYJCQl0eXBlOworCXUxNgkJCXR5cGU7CiAJaGZhMzg0eF91c2JfdHhmcm1fdAl0eGZybTsKIAloZmEzODR4X3VzYl9jbWRyZXFfdAljbWRyZXE7CiAJaGZhMzg0eF91c2Jfd3JpZHJlcV90CXdyaWRyZXE7CkBAIC0yMTI0LDcgKzIwODcsNyBAQAogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X3VzYm91dF90OwogCiB0eXBlZGVmIHVuaW9uIGhmYTM4NHhfdXNiaW4gewotCVVJTlQxNgkJCXR5cGU7CisJdTE2CQkJdHlwZTsKIAloZmEzODR4X3VzYl9yeGZybV90CXJ4ZnJtOwogCWhmYTM4NHhfdXNiX3R4ZnJtX3QJdHhmcm07CiAJaGZhMzg0eF91c2JfaW5mb2ZybV90CWluZm9mcm07CkBAIC0yMTM1LDI4ICsyMDk4LDI2IEBACiAJaGZhMzg0eF91c2Jfcm1lbXJlc3BfdAlybWVtcmVzcDsKIAloZmEzODR4X3VzYl9idWZhdmFpbF90CWJ1ZmF2YWlsOwogCWhmYTM4NHhfdXNiX2Vycm9yX3QJdXNiZXJyb3I7Ci0JVUlOVDgJCQlib2d1c3BhZFszMDAwXTsKKwl1OAkJCWJvZ3VzcGFkWzMwMDBdOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X3VzYmluX3Q7CiAKLSNlbmRpZiAvKiBXTEFOX1VTQiAqLwotCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBQRCByZWNvcmQgc3RydWN0dXJlcy4KIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9wZHJfcGNiX3BhcnRudW0KIHsKLQlVSU5UOAludW1bOF07CisJdTgJbnVtWzhdOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X3Bkcl9wY2JfcGFydG51bV90OwogCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X3Bkcl9wY2JfdHJhY2VudW0KIHsKLQlVSU5UOAludW1bOF07CisJdTgJbnVtWzhdOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X3Bkcl9wY2JfdHJhY2VudW1fdDsKIAogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9wZHJfbmljX3NlcmlhbAogewotCVVJTlQ4CW51bVsxMl07CisJdTgJbnVtWzEyXTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9wZHJfbmljX3NlcmlhbF90OwogCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X3Bkcl9ta2tfbWVhc3VyZW1lbnRzCkBAIC0yMTgwLDE3MCArMjE0MSwxNzAgQEAKIAogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9wZHJfbmljX3JhbXNpemUKIHsKLQlVSU5UOAlzaXplWzEyXTsgLyogdW5pdHMgb2YgS0IgKi8KKwl1OAlzaXplWzEyXTsgLyogdW5pdHMgb2YgS0IgKi8KIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9wZHJfbmljX3JhbXNpemVfdDsKIAogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9wZHJfbWZpc3VwcmFuZ2UKIHsKLQlVSU5UMTYJaWQ7Ci0JVUlOVDE2CXZhcmlhbnQ7Ci0JVUlOVDE2CWJvdHRvbTsKLQlVSU5UMTYJdG9wOworCXUxNglpZDsKKwl1MTYJdmFyaWFudDsKKwl1MTYJYm90dG9tOworCXUxNgl0b3A7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfcGRyX21maXN1cHJhbmdlX3Q7CiAKIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfcGRyX2NmaXN1cHJhbmdlCiB7Ci0JVUlOVDE2CWlkOwotCVVJTlQxNgl2YXJpYW50OwotCVVJTlQxNglib3R0b207Ci0JVUlOVDE2CXRvcDsKKwl1MTYJaWQ7CisJdTE2CXZhcmlhbnQ7CisJdTE2CWJvdHRvbTsKKwl1MTYJdG9wOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X3Bkcl9jZmlzdXByYW5nZV90OwogCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X3Bkcl9uaWNpZAogewotCVVJTlQxNglpZDsKLQlVSU5UMTYJdmFyaWFudDsKLQlVSU5UMTYJbWFqb3I7Ci0JVUlOVDE2CW1pbm9yOworCXUxNglpZDsKKwl1MTYJdmFyaWFudDsKKwl1MTYJbWFqb3I7CisJdTE2CW1pbm9yOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X3Bkcl9uaWNpZF90OwogCiAKIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfcGRyX3JlZmRhY19tZWFzdXJlbWVudHMKIHsKLQlVSU5UMTYJdmFsdWVbMF07CisJdTE2CXZhbHVlWzBdOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X3Bkcl9yZWZkYWNfbWVhc3VyZW1lbnRzX3Q7CiAKIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfcGRyX3ZnZGFjX21lYXN1cmVtZW50cwogewotCVVJTlQxNgl2YWx1ZVswXTsKKwl1MTYJdmFsdWVbMF07CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfcGRyX3ZnZGFjX21lYXN1cmVtZW50c190OwogCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X3Bkcl9sZXZlbF9jb21wX21lYXN1cmVtZW50cwogewotCVVJTlQxNgl2YWx1ZVswXTsKKwl1MTYJdmFsdWVbMF07CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfcGRyX2xldmVsX2NvbXBjX21lYXN1cmVtZW50c190OwogCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X3Bkcl9tYWNfYWRkcmVzcwogewotCVVJTlQ4CWFkZHJbNl07CisJdTgJYWRkcls2XTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9wZHJfbWFjX2FkZHJlc3NfdDsKIAogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9wZHJfbWtrX2NhbGxuYW1lCiB7Ci0JVUlOVDgJY2FsbG5hbWVbOF07CisJdTgJY2FsbG5hbWVbOF07CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfcGRyX21ra19jYWxsbmFtZV90OwogCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X3Bkcl9yZWdkb21haW4KIHsKLQlVSU5UMTYJbnVtZG9tYWluczsKLQlVSU5UMTYJZG9tYWluWzVdOworCXUxNgludW1kb21haW5zOworCXUxNglkb21haW5bNV07CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfcGRyX3JlZ2RvbWFpbl90OwogCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X3Bkcl9hbGxvd2VkX2NoYW5uZWwKIHsKLQlVSU5UMTYJY2hfYml0bWFwOworCXUxNgljaF9iaXRtYXA7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfcGRyX2FsbG93ZWRfY2hhbm5lbF90OwogCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X3Bkcl9kZWZhdWx0X2NoYW5uZWwKIHsKLQlVSU5UMTYJY2hhbm5lbDsKKwl1MTYJY2hhbm5lbDsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9wZHJfZGVmYXVsdF9jaGFubmVsX3Q7CiAKIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfcGRyX3ByaXZhY3lfb3B0aW9uCiB7Ci0JVUlOVDE2CWF2YWlsYWJsZTsKKwl1MTYJYXZhaWxhYmxlOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X3Bkcl9wcml2YWN5X29wdGlvbl90OwogCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X3Bkcl90ZW1wdHlwZQogewotCVVJTlQxNgl0eXBlOworCXUxNgl0eXBlOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X3Bkcl90ZW1wdHlwZV90OwogCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X3Bkcl9yZWZkYWNfc2V0dXAKIHsKLQlVSU5UMTYJY2hfdmFsdWVbMTRdOworCXUxNgljaF92YWx1ZVsxNF07CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfcGRyX3JlZmRhY19zZXR1cF90OwogCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X3Bkcl92Z2RhY19zZXR1cAogewotCVVJTlQxNgljaF92YWx1ZVsxNF07CisJdTE2CWNoX3ZhbHVlWzE0XTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9wZHJfdmdkYWNfc2V0dXBfdDsKIAogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9wZHJfbGV2ZWxfY29tcF9zZXR1cAogewotCVVJTlQxNgljaF92YWx1ZVsxNF07CisJdTE2CWNoX3ZhbHVlWzE0XTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9wZHJfbGV2ZWxfY29tcF9zZXR1cF90OwogCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X3Bkcl90cmltZGFjX3NldHVwCiB7Ci0JVUlOVDE2CXRyaW1pZGFjOwotCVVJTlQxNgl0cmltcWRhYzsKKwl1MTYJdHJpbWlkYWM7CisJdTE2CXRyaW1xZGFjOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X3Bkcl90cmltZGFjX3NldHVwX3Q7CiAKIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfcGRyX2lmcl9zZXR0aW5nCiB7Ci0JVUlOVDE2CXZhbHVlWzNdOworCXUxNgl2YWx1ZVszXTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9wZHJfaWZyX3NldHRpbmdfdDsKIAogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9wZHJfcmZyX3NldHRpbmcKIHsKLQlVSU5UMTYJdmFsdWVbM107CisJdTE2CXZhbHVlWzNdOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X3Bkcl9yZnJfc2V0dGluZ190OwogCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X3Bkcl9oZmEzODYxX2Jhc2VsaW5lCiB7Ci0JVUlOVDE2CXZhbHVlWzUwXTsKKwl1MTYJdmFsdWVbNTBdOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X3Bkcl9oZmEzODYxX2Jhc2VsaW5lX3Q7CiAKIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfcGRyX2hmYTM4NjFfc2hhZG93CiB7Ci0JVUlOVDMyCXZhbHVlWzMyXTsKKwl1MzIJdmFsdWVbMzJdOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X3Bkcl9oZmEzODYxX3NoYWRvd190OwogCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X3Bkcl9oZmEzODYxX2lmcmYKIHsKLQlVSU5UMzIJdmFsdWVbMjBdOworCXUzMgl2YWx1ZVsyMF07CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfcGRyX2hmYTM4NjFfaWZyZl90OwogCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X3Bkcl9oZmEzODYxX2NoY2Fsc3AKIHsKLQlVSU5UMTYJdmFsdWVbMTRdOworCXUxNgl2YWx1ZVsxNF07CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfcGRyX2hmYTM4NjFfY2hjYWxzcF90OwogCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X3Bkcl9oZmEzODYxX2NoY2FsaQogewotCVVJTlQxNgl2YWx1ZVsxN107CisJdTE2CXZhbHVlWzE3XTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9wZHJfaGZhMzg2MV9jaGNhbGlfdDsKIAogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9wZHJfaGZhMzg2MV9uaWNfY29uZmlnCiB7Ci0JVUlOVDE2CWNvbmZpZ19iaXRtYXA7CisJdTE2CWNvbmZpZ19iaXRtYXA7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfcGRyX25pY19jb25maWdfdDsKIAogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9wZHJfaGZvX2RlbGF5CiB7Ci0JVUlOVDggICBoZm9fZGVsYXk7CisJdTggICBoZm9fZGVsYXk7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfaGZvX2RlbGF5X3Q7CiAKIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfcGRyX2hmYTM4NjFfbWFuZl90ZXN0c3AKIHsKLQlVSU5UMTYJdmFsdWVbMzBdOworCXUxNgl2YWx1ZVszMF07CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfcGRyX2hmYTM4NjFfbWFuZl90ZXN0c3BfdDsKIAogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9wZHJfaGZhMzg2MV9tYW5mX3Rlc3RpCiB7Ci0JVUlOVDE2CXZhbHVlWzMwXTsKKwl1MTYJdmFsdWVbMzBdOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X3Bkcl9oZmEzODYxX21hbmZfdGVzdGlfdDsKIAogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9lbmRfb2ZfcGRhCiB7Ci0JVUlOVDE2CWNyYzsKKwl1MTYJY3JjOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X3Bkcl9lbmRfb2ZfcGRhX3Q7CiAKIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfcGRyZWMKIHsKLQlVSU5UMTYJbGVuOyAvKiBpbiB3b3JkcyAqLwotCVVJTlQxNgljb2RlOworCXUxNglsZW47IC8qIGluIHdvcmRzICovCisJdTE2CWNvZGU7CiAJdW5pb24gcGRyIHsKIAloZmEzODR4X3Bkcl9wY2JfcGFydG51bV90CXBjYl9wYXJ0bnVtOwogCWhmYTM4NHhfcGRyX3BjYl90cmFjZW51bV90CXBjYl90cmFjZW51bTsKQEAgLTIzOTEsMTQgKzIzNTIsMTIgQEAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfc3RhdHVzcmVzdWx0CiB7Ci0JVUlOVDE2CXN0YXR1czsKLQlVSU5UMTYJcmVzcDA7Ci0JVUlOVDE2CXJlc3AxOwotCVVJTlQxNglyZXNwMjsKKwl1MTYJc3RhdHVzOworCXUxNglyZXNwMDsKKwl1MTYJcmVzcDE7CisJdTE2CXJlc3AyOwogfSBoZmEzODR4X2NtZHJlc3VsdF90OwogCi0jaWYgKFdMQU5fSE9TVElGID09IFdMQU5fVVNCKQotCiAvKiBVU0IgQ29udHJvbCBFeGNoYW5nZSAoQ1RMWCk6CiAgKiAgQSBxdWV1ZSBvZiB0aGUgc3RydWN0dXJlIGJlbG93IGlzIG1haW50YWluZWQgZm9yIGFsbCBvZiB0aGUKICAqICBSZXF1ZXN0L1Jlc3BvbnNlIHR5cGUgVVNCIHBhY2tldHMgc3VwcG9ydGVkIGJ5IFByaXNtMi4KQEAgLTI0MTEsOSArMjM3MCw5IEBACiAKIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfcnJpZHJlc3VsdAogewotCVVJTlQxNgkJcmlkOworCXUxNgkJcmlkOwogCWNvbnN0IHZvaWQJKnJpZGRhdGE7Ci0JVUlOVAkJcmlkZGF0YV9sZW47CisJdW5zaWduZWQgaW50CQlyaWRkYXRhX2xlbjsKIH0gaGZhMzg0eF9ycmlkcmVzdWx0X3Q7CiAKIGVudW0gY3RseF9zdGF0ZSB7CkBAIC0yNDY3LDIxICsyNDI2LDE0IEBACiAJc3RydWN0IGxpc3RfaGVhZAljb21wbGV0aW5nOwogCXN0cnVjdCBsaXN0X2hlYWQJcmVhcGFibGU7CiB9IGhmYTM4NHhfdXNiY3RseHFfdDsKLSNlbmRpZgogCiB0eXBlZGVmIHN0cnVjdCBoZmE0ODR4X21ldGFjbWQKIHsKLQlVSU5UMTYJCWNtZDsKKwl1MTYJCWNtZDsKIAotCVVJTlQxNiAgICAgICAgICBwYXJtMDsKLQlVSU5UMTYgICAgICAgICAgcGFybTE7Ci0JVUlOVDE2ICAgICAgICAgIHBhcm0yOwotCi0jaWYgMCAvL1hYWCBjbWQgaXJxIHN0dWZmCi0JVUlOVDE2ICAgICAgICAgIGJ1bGtpZDsgICAgICAgICAvKiB3aGF0IFJJRC9GSUQgdG8gY29weSBkb3duLiAqLwotCWludCAgICAgICAgICAgICBidWxrbGVuOyAgICAgICAgLyogaG93IG11Y2ggdG8gY29weSBmcm9tIEJBUCAqLwotICAgICAgICBjaGFyICAgICAgICAgICAgKmJ1bGtkYXRhOyAgICAgIC8qIEFuZCB0byB3aGVyZT8gKi8KLSNlbmRpZgorCXUxNiAgICAgICAgICBwYXJtMDsKKwl1MTYgICAgICAgICAgcGFybTE7CisJdTE2ICAgICAgICAgIHBhcm0yOwogCiAJaGZhMzg0eF9jbWRyZXN1bHRfdCByZXN1bHQ7CiB9IGhmYTM4NHhfbWV0YWNtZF90OwpAQCAtMjUwNywyOCArMjQ1OSwyMiBAQAogLyogWFhYIFRoZXNlIGFyZSBnb2luZyBhd2F5IEFTQVAgKi8KIHR5cGVkZWYgc3RydWN0IHByaXNtMnN0YV9hdXRobGlzdAogewotCVVJTlQJY250OwotCVVJTlQ4CWFkZHJbV0xBTl9BVVRIX01BWF1bV0xBTl9BRERSX0xFTl07Ci0JVUlOVDgJYXNzb2NbV0xBTl9BVVRIX01BWF07CisJdW5zaWduZWQgaW50CWNudDsKKwl1OAlhZGRyW1dMQU5fQVVUSF9NQVhdW1dMQU5fQUREUl9MRU5dOworCXU4CWFzc29jW1dMQU5fQVVUSF9NQVhdOwogfSBwcmlzbTJzdGFfYXV0aGxpc3RfdDsKIAogdHlwZWRlZiBzdHJ1Y3QgcHJpc20yc3RhX2FjY2Vzc2xpc3QKIHsKLQlVSU5UCW1vZGlmeTsKLQlVSU5UCWNudDsKLQlVSU5UOAlhZGRyW1dMQU5fQUNDRVNTX01BWF1bV0xBTl9BRERSX0xFTl07Ci0JVUlOVAljbnQxOwotCVVJTlQ4CWFkZHIxW1dMQU5fQUNDRVNTX01BWF1bV0xBTl9BRERSX0xFTl07CisJdW5zaWduZWQgaW50CW1vZGlmeTsKKwl1bnNpZ25lZCBpbnQJY250OworCXU4CWFkZHJbV0xBTl9BQ0NFU1NfTUFYXVtXTEFOX0FERFJfTEVOXTsKKwl1bnNpZ25lZCBpbnQJY250MTsKKwl1OAlhZGRyMVtXTEFOX0FDQ0VTU19NQVhdW1dMQU5fQUREUl9MRU5dOwogfSBwcmlzbTJzdGFfYWNjZXNzbGlzdF90OwogCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4CiB7Ci0jaWYgKFdMQU5fSE9TVElGICE9IFdMQU5fVVNCKQotCS8qIFJlc291cmNlIGNvbmZpZyAqLwotCVVJTlQzMgkJCWlvYmFzZTsKLQljaGFyCQkJX19pb21lbSAqbWVtYmFzZTsKLQlVSU5UMzIJCQlpcnE7Ci0jZWxzZQogCS8qIFVTQiBzdXBwb3J0IGRhdGEgKi8KIAlzdHJ1Y3QgdXNiX2RldmljZQkqdXNiOwogCXN0cnVjdCB1cmIJCXJ4X3VyYjsKQEAgLTI1NjAsMTYgKzI1MDYsNiBAQAogCiAJaW50ICAgICAgICAgICAgICAgICAgICAgZW5kcF9pbjsKIAlpbnQgICAgICAgICAgICAgICAgICAgICBlbmRwX291dDsKLSNlbmRpZiAvKiAhVVNCICovCi0KLSNpZiAoV0xBTl9IT1NUSUYgPT0gV0xBTl9QQ01DSUEpCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw2LDE2KQotCXN0cnVjdCBwY21jaWFfZGV2aWNlICpwZGV2OwotI2Vsc2UKLQlkZXZfbGlua190CSpsaW5rOwotI2VuZGlmCi0JZGV2X25vZGVfdAlub2RlOwotI2VuZGlmCiAKIAlpbnQgICAgICAgICAgICAgICAgICAgICBzbmlmZl9mY3M7CiAJaW50ICAgICAgICAgICAgICAgICAgICAgc25pZmZfY2hhbm5lbDsKQEAgLTI1NzksMzYgKzI1MTUsMTQgQEAKIAl3YWl0X3F1ZXVlX2hlYWRfdCBjbWRxOwkgICAgICAgIC8qIHdhaXQgcXVldWUgaXRzZWxmICovCiAKIAkvKiBDb250cm9sbGVyIHN0YXRlICovCi0JVUlOVDMyCQlzdGF0ZTsKLQlVSU5UMzIJCWlzYXA7Ci0JVUlOVDgJCXBvcnRfZW5hYmxlZFtIRkEzODR4X05VTVBPUlRTX01BWF07Ci0jaWYgKFdMQU5fSE9TVElGICE9IFdMQU5fVVNCKQotCVVJTlQJCWF1eGVuOwotCVVJTlQgICAgICAgICAgICBpc3JhbTE2OwotI2VuZGlmIC8qICFVU0IgKi8KKwl1MzIJCXN0YXRlOworCXUzMgkJaXNhcDsKKwl1OAkJcG9ydF9lbmFibGVkW0hGQTM4NHhfTlVNUE9SVFNfTUFYXTsKIAogCS8qIERvd25sb2FkIHN1cHBvcnQgKi8KLQlVSU5UCQkJCWRsc3RhdGU7CisJdW5zaWduZWQgaW50CQkJCWRsc3RhdGU7CiAJaGZhMzg0eF9kb3dubG9hZGJ1ZmZlcl90CWJ1ZmluZm87Ci0JVUlOVDE2CQkJCWRsdGltZW91dDsKLQotI2lmIChXTEFOX0hPU1RJRiAhPSBXTEFOX1VTQikKLQlzcGlubG9ja190CWNtZGxvY2s7Ci0Jdm9sYXRpbGUgaW50ICAgIGNtZGZsYWc7ICAgICAgICAvKiB3YWl0IHF1ZXVlIGZsYWcgKi8KLQloZmEzODR4X21ldGFjbWRfdCAqY21kZGF0YTsgICAgICAvKiBmb3Igb3VyIGFzeW5jIGNhbGxiYWNrICovCi0KLQkvKiBCQVAgc3VwcG9ydCAqLwotCXNwaW5sb2NrX3QJYmFwbG9jazsKLQlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgICBiYXBfdGFza2xldDsKLQotCS8qIE1BQyBidWZmZXIgaWRzICovCi0gICAgICAgIFVJTlQxNiAgICAgICAgICB0eGZpZF9oZWFkOwotICAgICAgICBVSU5UMTYgICAgICAgICAgdHhmaWRfdGFpbDsKLSAgICAgICAgVUlOVCAgICAgICAgICAgIHR4ZmlkX047Ci0gICAgICAgIFVJTlQxNiAgICAgICAgICB0eGZpZF9xdWV1ZVtIRkEzODR4X0RSVlJfRklEU1RBQ0tMRU5fTUFYXTsKLQlVSU5UMTYJCQlpbmZvZmlkOwotCXN0cnVjdCBzZW1hcGhvcmUJaW5mb2ZpZF9zZW07Ci0jZW5kaWYgLyogIVVTQiAqLworCXUxNgkJCQlkbHRpbWVvdXQ7CiAKIAlpbnQgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYW5mbGFnOyAgICAvKiB0byBzaWduYWwgc2NhbiBjb21sZXRlICovCiAJaW50ICAgICAgICAgICAgICAgICAgICAgICAgICBqb2luX2FwOyAgICAgICAgLyogYXJlIHdlIGpvaW5lZCB0byBhIHNwZWNpZmljIGFwICovCkBAIC0yNjIzLDMxICsyNTM3LDMwIEBACiAJaGZhMzg0eF9jb21tc3F1YWxpdHlfdCAgcXVhbDsKIAlzdHJ1Y3QgdGltZXJfbGlzdAljb21tc3F1YWxfdGltZXI7CiAKLQlVSU5UMTYgbGlua19zdGF0dXM7Ci0JVUlOVDE2IGxpbmtfc3RhdHVzX25ldzsKKwl1MTYgbGlua19zdGF0dXM7CisJdTE2IGxpbmtfc3RhdHVzX25ldzsKIAlzdHJ1Y3Qgc2tfYnVmZl9oZWFkICAgICAgICBhdXRocTsKIAogCS8qIEFuZCBoZXJlIHdlIGhhdmUgc3R1ZmYgdGhhdCB1c2VkIHRvIGJlIGluIHByaXYgKi8KIAogCS8qIFN0YXRlIHZhcmlhYmxlcyAqLwotCVVJTlQJCXByZXNuaWZmX3BvcnRfdHlwZTsKLQlVSU5UMTYJCXByZXNuaWZmX3dlcGZsYWdzOwotCVVJTlQzMgkJZG90MTFfZGVzaXJlZF9ic3NfdHlwZTsKLQlpbnQJCWFwOwkvKiBBUCBmbGFnOiAwIC0gU3RhdGlvbiwgMSAtIEFjY2VzcyBQb2ludC4gKi8KKwl1bnNpZ25lZCBpbnQJCXByZXNuaWZmX3BvcnRfdHlwZTsKKwl1MTYJCXByZXNuaWZmX3dlcGZsYWdzOworCXUzMgkJZG90MTFfZGVzaXJlZF9ic3NfdHlwZTsKIAogCWludCAgICAgICAgICAgICBkYm1hZGp1c3Q7CiAKIAkvKiBHcm91cCBBZGRyZXNzZXMgLSByaWdodCBub3csIHRoZXJlIGFyZSB1cCB0byBhIHRvdGFsCiAJb2YgTUFYX0dSUF9BRERSIGdyb3VwIGFkZHJlc3NlcyAqLwotCVVJTlQ4CQlkb3QxMV9ncnBfYWRkcltNQVhfR1JQX0FERFJdW1dMQU5fQUREUl9MRU5dOwotCVVJTlQJCWRvdDExX2dycGNudDsKKwl1OAkJZG90MTFfZ3JwX2FkZHJbTUFYX0dSUF9BRERSXVtXTEFOX0FERFJfTEVOXTsKKwl1bnNpZ25lZCBpbnQJCWRvdDExX2dycGNudDsKIAogCS8qIENvbXBvbmVudCBJZGVudGl0aWVzICovCiAJaGZhMzg0eF9jb21waWRlbnRfdAlpZGVudF9uaWM7CiAJaGZhMzg0eF9jb21waWRlbnRfdAlpZGVudF9wcmlfZnc7CiAJaGZhMzg0eF9jb21waWRlbnRfdAlpZGVudF9zdGFfZnc7CiAJaGZhMzg0eF9jb21waWRlbnRfdAlpZGVudF9hcF9mdzsKLQlVSU5UMTYJCQltbV9tb2RzOworCXUxNgkJCW1tX21vZHM7CiAKIAkvKiBTdXBwbGllciBjb21wYXRpYmlsaXR5IHJhbmdlcyAqLwogCWhmYTM4NHhfY2FwbGV2ZWxfdAljYXBfc3VwX21maTsKQEAgLTI2NjMsMTQgKzI1NzYsMTQgQEAKIAloZmEzODR4X2NhcGxldmVsX3QJY2FwX2FjdF9hcF9jZmk7ICAvKiBhcCBmL3cgdG8gY29udHJvbGxlciBpbnRlcmZhY2UgKi8KIAloZmEzODR4X2NhcGxldmVsX3QJY2FwX2FjdF9hcF9tZmk7ICAvKiBhcCBmL3cgdG8gbW9kZW0gaW50ZXJmYWNlICovCiAKLQlVSU5UMzIJCQlwc3VzZXJjb3VudDsgIC8qIFBvd2VyIHNhdmUgdXNlciBjb3VudC4gKi8KKwl1MzIJCQlwc3VzZXJjb3VudDsgIC8qIFBvd2VyIHNhdmUgdXNlciBjb3VudC4gKi8KIAloZmEzODR4X0NvbW1UYWxsaWVzMzJfdAl0YWxsaWVzOyAgICAgIC8qIENvbW11bmljYXRpb24gdGFsbGllcy4gKi8KLQlVSU5UOAkJCWNvbW1lbnRbV0xBTl9DT01NRU5UX01BWCsxXTsgLyogVXNlciBjb21tZW50ICovCisJdTgJCQljb21tZW50W1dMQU5fQ09NTUVOVF9NQVgrMV07IC8qIFVzZXIgY29tbWVudCAqLwogCiAJLyogQ2hhbm5lbCBJbmZvIHJlcXVlc3QgcmVzdWx0cyAoQVAgb25seSkgKi8KIAlzdHJ1Y3QgewogCQlhdG9taWNfdAkJZG9uZTsKLQkJVUlOVDgJCQljb3VudDsKKwkJdTgJCQljb3VudDsKIAkJaGZhMzg0eF9DaEluZm9SZXN1bHRfdAlyZXN1bHRzOwogCX0gY2hhbm5lbF9pbmZvOwogCkBAIC0yNjc4LDcgKzI1OTEsNyBAQAogCiAKICAgICAgICAgcHJpc20yc3RhX2F1dGhsaXN0X3QJYXV0aGxpc3Q7ICAgICAvKiBBdXRoZW50aWNhdGVkIHN0YXRpb24gbGlzdC4gKi8KLQlVSU5UCQkJYWNjZXNzbW9kZTsgICAvKiBBY2Nlc3MgbW9kZS4gKi8KKwl1bnNpZ25lZCBpbnQJCQlhY2Nlc3Ntb2RlOyAgIC8qIEFjY2VzcyBtb2RlLiAqLwogICAgICAgICBwcmlzbTJzdGFfYWNjZXNzbGlzdF90CWFsbG93OyAgICAgICAgLyogQWxsb3dlZCBzdGF0aW9uIGxpc3QuICovCiAgICAgICAgIHByaXNtMnN0YV9hY2Nlc3NsaXN0X3QJZGVueTsgICAgICAgICAvKiBEZW5pZWQgc3RhdGlvbiBsaXN0LiAqLwogCkBAIC0yNjg3LDI0ICsyNjAwLDEzIEBACiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogLyotLS0gRnVuY3Rpb24gRGVjbGFyYXRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0jaWYgKFdMQU5fSE9TVElGID09IFdMQU5fVVNCKQogdm9pZAogaGZhMzg0eF9jcmVhdGUoCiAJaGZhMzg0eF90ICpodywKIAlzdHJ1Y3QgdXNiX2RldmljZSAqdXNiKTsKLSNlbHNlCi12b2lkCi1oZmEzODR4X2NyZWF0ZSgKLQloZmEzODR4X3QgKmh3LAotCVVJTlQgaXJxLAotCVVJTlQzMiBpb2Jhc2UsCi0JVUlOVDggX19pb21lbSAqbWVtYmFzZSk7Ci0jZW5kaWYKIAogdm9pZCBoZmEzODR4X2Rlc3Ryb3koaGZhMzg0eF90ICpodyk7CiAKLWlycXJldHVybl90Ci1oZmEzODR4X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQgUFRfUkVHUyk7CiBpbnQKIGhmYTM4NHhfY29yZXJlc2V0KCBoZmEzODR4X3QgKmh3LCBpbnQgaG9sZHRpbWUsIGludCBzZXR0bGV0aW1lLCBpbnQgZ2VuZXNpcyk7CiBpbnQKQEAgLTI3MTIsMTE2ICsyNjE0LDEwNSBAQAogaW50CiBoZmEzODR4X2RydnJfY29tbXRhbGxpZXMoIGhmYTM4NHhfdCAqaHcpOwogaW50Ci1oZmEzODR4X2RydnJfZGlzYWJsZShoZmEzODR4X3QgKmh3LCBVSU5UMTYgbWFjcG9ydCk7CitoZmEzODR4X2RydnJfZGlzYWJsZShoZmEzODR4X3QgKmh3LCB1MTYgbWFjcG9ydCk7CiBpbnQKLWhmYTM4NHhfZHJ2cl9lbmFibGUoaGZhMzg0eF90ICpodywgVUlOVDE2IG1hY3BvcnQpOworaGZhMzg0eF9kcnZyX2VuYWJsZShoZmEzODR4X3QgKmh3LCB1MTYgbWFjcG9ydCk7CiBpbnQKIGhmYTM4NHhfZHJ2cl9mbGFzaGRsX2VuYWJsZShoZmEzODR4X3QgKmh3KTsKIGludAogaGZhMzg0eF9kcnZyX2ZsYXNoZGxfZGlzYWJsZShoZmEzODR4X3QgKmh3KTsKIGludAotaGZhMzg0eF9kcnZyX2ZsYXNoZGxfd3JpdGUoaGZhMzg0eF90ICpodywgVUlOVDMyIGRhZGRyLCB2b2lkKiBidWYsIFVJTlQzMiBsZW4pOworaGZhMzg0eF9kcnZyX2ZsYXNoZGxfd3JpdGUoaGZhMzg0eF90ICpodywgdTMyIGRhZGRyLCB2b2lkKiBidWYsIHUzMiBsZW4pOwogaW50Ci1oZmEzODR4X2RydnJfZ2V0Y29uZmlnKGhmYTM4NHhfdCAqaHcsIFVJTlQxNiByaWQsIHZvaWQgKmJ1ZiwgVUlOVDE2IGxlbik7CitoZmEzODR4X2RydnJfZ2V0Y29uZmlnKGhmYTM4NHhfdCAqaHcsIHUxNiByaWQsIHZvaWQgKmJ1ZiwgdTE2IGxlbik7CiBpbnQKLWhmYTM4NHhfZHJ2cl9oYW5kb3ZlciggaGZhMzg0eF90ICpodywgVUlOVDggKmFkZHIpOworaGZhMzg0eF9kcnZyX2hhbmRvdmVyKCBoZmEzODR4X3QgKmh3LCB1OCAqYWRkcik7CiBpbnQKIGhmYTM4NHhfZHJ2cl9ob3N0c2NhbnJlc3VsdHMoIGhmYTM4NHhfdCAqaHcpOwogaW50CiBoZmEzODR4X2RydnJfbG93X2xldmVsKGhmYTM4NHhfdCAqaHcsIGhmYTM4NHhfbWV0YWNtZF90ICpjbWQpOwogaW50Ci1oZmEzODR4X2RydnJfbW1pX3JlYWQoaGZhMzg0eF90ICpodywgVUlOVDMyIGFkZHJlc3MsIFVJTlQzMiAqcmVzdWx0KTsKK2hmYTM4NHhfZHJ2cl9tbWlfcmVhZChoZmEzODR4X3QgKmh3LCB1MzIgYWRkcmVzcywgdTMyICpyZXN1bHQpOwogaW50Ci1oZmEzODR4X2RydnJfbW1pX3dyaXRlKGhmYTM4NHhfdCAqaHcsIFVJTlQzMiBhZGRyZXNzLCBVSU5UMzIgZGF0YSk7CitoZmEzODR4X2RydnJfbW1pX3dyaXRlKGhmYTM4NHhfdCAqaHcsIHUzMiBhZGRyZXNzLCB1MzIgZGF0YSk7CiBpbnQKLWhmYTM4NHhfZHJ2cl9yYW1kbF9lbmFibGUoaGZhMzg0eF90ICpodywgVUlOVDMyIGV4ZWFkZHIpOworaGZhMzg0eF9kcnZyX3JhbWRsX2VuYWJsZShoZmEzODR4X3QgKmh3LCB1MzIgZXhlYWRkcik7CiBpbnQKIGhmYTM4NHhfZHJ2cl9yYW1kbF9kaXNhYmxlKGhmYTM4NHhfdCAqaHcpOwogaW50Ci1oZmEzODR4X2RydnJfcmFtZGxfd3JpdGUoaGZhMzg0eF90ICpodywgVUlOVDMyIGRhZGRyLCB2b2lkKiBidWYsIFVJTlQzMiBsZW4pOworaGZhMzg0eF9kcnZyX3JhbWRsX3dyaXRlKGhmYTM4NHhfdCAqaHcsIHUzMiBkYWRkciwgdm9pZCogYnVmLCB1MzIgbGVuKTsKIGludAotaGZhMzg0eF9kcnZyX3JlYWRwZGEoaGZhMzg0eF90ICpodywgdm9pZCAqYnVmLCBVSU5UIGxlbik7CitoZmEzODR4X2RydnJfcmVhZHBkYShoZmEzODR4X3QgKmh3LCB2b2lkICpidWYsIHVuc2lnbmVkIGludCBsZW4pOwogaW50CiBoZmEzODR4X2RydnJfc2NhbnJlc3VsdHMoIGhmYTM4NHhfdCAqaHcpOwogCiBpbnQKLWhmYTM4NHhfZHJ2cl9zZXRjb25maWcoaGZhMzg0eF90ICpodywgVUlOVDE2IHJpZCwgdm9pZCAqYnVmLCBVSU5UMTYgbGVuKTsKK2hmYTM4NHhfZHJ2cl9zZXRjb25maWcoaGZhMzg0eF90ICpodywgdTE2IHJpZCwgdm9pZCAqYnVmLCB1MTYgbGVuKTsKIAogc3RhdGljIGlubGluZSBpbnQKLWhmYTM4NHhfZHJ2cl9nZXRjb25maWcxNihoZmEzODR4X3QgKmh3LCBVSU5UMTYgcmlkLCB2b2lkICp2YWwpCitoZmEzODR4X2RydnJfZ2V0Y29uZmlnMTYoaGZhMzg0eF90ICpodywgdTE2IHJpZCwgdm9pZCAqdmFsKQogewogCWludAkJcmVzdWx0ID0gMDsKLQlyZXN1bHQgPSBoZmEzODR4X2RydnJfZ2V0Y29uZmlnKGh3LCByaWQsIHZhbCwgc2l6ZW9mKFVJTlQxNikpOworCXJlc3VsdCA9IGhmYTM4NHhfZHJ2cl9nZXRjb25maWcoaHcsIHJpZCwgdmFsLCBzaXplb2YodTE2KSk7CiAJaWYgKCByZXN1bHQgPT0gMCApIHsKLQkJKigoVUlOVDE2Kil2YWwpID0gaGZhMzg0eDJob3N0XzE2KCooKFVJTlQxNiopdmFsKSk7CisJCSooKHUxNiopdmFsKSA9IGhmYTM4NHgyaG9zdF8xNigqKCh1MTYqKXZhbCkpOwogCX0KIAlyZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgaW5saW5lIGludAotaGZhMzg0eF9kcnZyX2dldGNvbmZpZzMyKGhmYTM4NHhfdCAqaHcsIFVJTlQxNiByaWQsIHZvaWQgKnZhbCkKK2hmYTM4NHhfZHJ2cl9nZXRjb25maWczMihoZmEzODR4X3QgKmh3LCB1MTYgcmlkLCB2b2lkICp2YWwpCiB7CiAJaW50CQlyZXN1bHQgPSAwOwogCi0JcmVzdWx0ID0gaGZhMzg0eF9kcnZyX2dldGNvbmZpZyhodywgcmlkLCB2YWwsIHNpemVvZihVSU5UMzIpKTsKKwlyZXN1bHQgPSBoZmEzODR4X2RydnJfZ2V0Y29uZmlnKGh3LCByaWQsIHZhbCwgc2l6ZW9mKHUzMikpOwogCWlmICggcmVzdWx0ID09IDAgKSB7Ci0JCSooKFVJTlQzMiopdmFsKSA9IGhmYTM4NHgyaG9zdF8zMigqKChVSU5UMzIqKXZhbCkpOworCQkqKCh1MzIqKXZhbCkgPSBoZmEzODR4Mmhvc3RfMzIoKigodTMyKil2YWwpKTsKIAl9CiAKIAlyZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgaW5saW5lIGludAotaGZhMzg0eF9kcnZyX3NldGNvbmZpZzE2KGhmYTM4NHhfdCAqaHcsIFVJTlQxNiByaWQsIFVJTlQxNiB2YWwpCitoZmEzODR4X2RydnJfc2V0Y29uZmlnMTYoaGZhMzg0eF90ICpodywgdTE2IHJpZCwgdTE2IHZhbCkKIHsKLQlVSU5UMTYgdmFsdWUgPSBob3N0MmhmYTM4NHhfMTYodmFsKTsKKwl1MTYgdmFsdWUgPSBob3N0MmhmYTM4NHhfMTYodmFsKTsKIAlyZXR1cm4gaGZhMzg0eF9kcnZyX3NldGNvbmZpZyhodywgcmlkLCAmdmFsdWUsIHNpemVvZih2YWx1ZSkpOwogfQogCiBzdGF0aWMgaW5saW5lIGludAotaGZhMzg0eF9kcnZyX3NldGNvbmZpZzMyKGhmYTM4NHhfdCAqaHcsIFVJTlQxNiByaWQsIFVJTlQzMiB2YWwpCitoZmEzODR4X2RydnJfc2V0Y29uZmlnMzIoaGZhMzg0eF90ICpodywgdTE2IHJpZCwgdTMyIHZhbCkKIHsKLQlVSU5UMzIgdmFsdWUgPSBob3N0MmhmYTM4NHhfMzIodmFsKTsKKwl1MzIgdmFsdWUgPSBob3N0MmhmYTM4NHhfMzIodmFsKTsKIAlyZXR1cm4gaGZhMzg0eF9kcnZyX3NldGNvbmZpZyhodywgcmlkLCAmdmFsdWUsIHNpemVvZih2YWx1ZSkpOwogfQogCi0jaWYgKFdMQU5fSE9TVElGID09IFdMQU5fVVNCKQogaW50CiBoZmEzODR4X2RydnJfZ2V0Y29uZmlnX2FzeW5jKGhmYTM4NHhfdCAgICAgKmh3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDE2ICAgICAgICByaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MTYgICAgICAgIHJpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0bHhfdXNlcmNiX3QgdXNlcmNiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAqdXNlcmNiX2RhdGEpOwogCiBpbnQKIGhmYTM4NHhfZHJ2cl9zZXRjb25maWdfYXN5bmMoaGZhMzg0eF90ICpodywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQxNiByaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MTYgcmlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDE2IGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxNiBsZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdGx4X3VzZXJjYl90IHVzZXJjYiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJjYl9kYXRhKTsKLSNlbHNlCi1zdGF0aWMgaW5saW5lIGludAotaGZhMzg0eF9kcnZyX3NldGNvbmZpZ19hc3luYyhoZmEzODR4X3QgKmh3LCBVSU5UMTYgcmlkLCB2b2lkICpidWYsIFVJTlQxNiBsZW4sCi0JCQkgICAgIHZvaWQgKnB0cjEsIHZvaWQgKnB0cjIpCi17Ci0gICAgICAgICAodm9pZClwdHIxOwotICAgICAgICAgKHZvaWQpcHRyMjsKLSAgICAgICAgIHJldHVybiBoZmEzODR4X2RydnJfc2V0Y29uZmlnKGh3LCByaWQsIGJ1ZiwgbGVuKTsKLX0KLSNlbmRpZgogCiBzdGF0aWMgaW5saW5lIGludAotaGZhMzg0eF9kcnZyX3NldGNvbmZpZzE2X2FzeW5jKGhmYTM4NHhfdCAqaHcsIFVJTlQxNiByaWQsIFVJTlQxNiB2YWwpCitoZmEzODR4X2RydnJfc2V0Y29uZmlnMTZfYXN5bmMoaGZhMzg0eF90ICpodywgdTE2IHJpZCwgdTE2IHZhbCkKIHsKLQlVSU5UMTYgdmFsdWUgPSBob3N0MmhmYTM4NHhfMTYodmFsKTsKKwl1MTYgdmFsdWUgPSBob3N0MmhmYTM4NHhfMTYodmFsKTsKIAlyZXR1cm4gaGZhMzg0eF9kcnZyX3NldGNvbmZpZ19hc3luYyhodywgcmlkLCAmdmFsdWUsIHNpemVvZih2YWx1ZSksCiAJCQkJCSAgICBOVUxMICwgTlVMTCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50Ci1oZmEzODR4X2RydnJfc2V0Y29uZmlnMzJfYXN5bmMoaGZhMzg0eF90ICpodywgVUlOVDE2IHJpZCwgVUlOVDMyIHZhbCkKK2hmYTM4NHhfZHJ2cl9zZXRjb25maWczMl9hc3luYyhoZmEzODR4X3QgKmh3LCB1MTYgcmlkLCB1MzIgdmFsKQogewotCVVJTlQzMiB2YWx1ZSA9IGhvc3QyaGZhMzg0eF8zMih2YWwpOworCXUzMiB2YWx1ZSA9IGhvc3QyaGZhMzg0eF8zMih2YWwpOwogCXJldHVybiBoZmEzODR4X2RydnJfc2V0Y29uZmlnX2FzeW5jKGh3LCByaWQsICZ2YWx1ZSwgc2l6ZW9mKHZhbHVlKSwKIAkJCQkJICAgIE5VTEwgLCBOVUxMKTsKIH0KQEAgLTI4MzksMzIgKzI3MzAsMjggQEAKIGludAogaGZhMzg0eF9jbWRfaW5pdGlhbGl6ZShoZmEzODR4X3QgKmh3KTsKIGludAotaGZhMzg0eF9jbWRfZW5hYmxlKGhmYTM4NHhfdCAqaHcsIFVJTlQxNiBtYWNwb3J0KTsKK2hmYTM4NHhfY21kX2VuYWJsZShoZmEzODR4X3QgKmh3LCB1MTYgbWFjcG9ydCk7CiBpbnQKLWhmYTM4NHhfY21kX2Rpc2FibGUoaGZhMzg0eF90ICpodywgVUlOVDE2IG1hY3BvcnQpOworaGZhMzg0eF9jbWRfZGlzYWJsZShoZmEzODR4X3QgKmh3LCB1MTYgbWFjcG9ydCk7CiBpbnQKIGhmYTM4NHhfY21kX2RpYWdub3NlKGhmYTM4NHhfdCAqaHcpOwogaW50Ci1oZmEzODR4X2NtZF9hbGxvY2F0ZShoZmEzODR4X3QgKmh3LCBVSU5UMTYgbGVuKTsKK2hmYTM4NHhfY21kX2FsbG9jYXRlKGhmYTM4NHhfdCAqaHcsIHUxNiBsZW4pOwogaW50Ci1oZmEzODR4X2NtZF90cmFuc21pdChoZmEzODR4X3QgKmh3LCBVSU5UMTYgcmVjbGFpbSwgVUlOVDE2IHFvcywgVUlOVDE2IGZpZCk7CitoZmEzODR4X2NtZF90cmFuc21pdChoZmEzODR4X3QgKmh3LCB1MTYgcmVjbGFpbSwgdTE2IHFvcywgdTE2IGZpZCk7CiBpbnQKLWhmYTM4NHhfY21kX2NsZWFycGVyc2lzdChoZmEzODR4X3QgKmh3LCBVSU5UMTYgZmlkKTsKK2hmYTM4NHhfY21kX2NsZWFycGVyc2lzdChoZmEzODR4X3QgKmh3LCB1MTYgZmlkKTsKIGludAotaGZhMzg0eF9jbWRfbm90aWZ5KGhmYTM4NHhfdCAqaHcsIFVJTlQxNiByZWNsYWltLCBVSU5UMTYgZmlkLCB2b2lkICpidWYsIFVJTlQxNiBsZW4pOworaGZhMzg0eF9jbWRfYWNjZXNzKGhmYTM4NHhfdCAqaHcsIHUxNiB3cml0ZSwgdTE2IHJpZCwgdm9pZCAqYnVmLCB1MTYgbGVuKTsKIGludAotaGZhMzg0eF9jbWRfaW5xdWlyZShoZmEzODR4X3QgKmh3LCBVSU5UMTYgZmlkKTsKLWludAotaGZhMzg0eF9jbWRfYWNjZXNzKGhmYTM4NHhfdCAqaHcsIFVJTlQxNiB3cml0ZSwgVUlOVDE2IHJpZCwgdm9pZCAqYnVmLCBVSU5UMTYgbGVuKTsKLWludAotaGZhMzg0eF9jbWRfbW9uaXRvcihoZmEzODR4X3QgKmh3LCBVSU5UMTYgZW5hYmxlKTsKK2hmYTM4NHhfY21kX21vbml0b3IoaGZhMzg0eF90ICpodywgdTE2IGVuYWJsZSk7CiBpbnQKIGhmYTM4NHhfY21kX2Rvd25sb2FkKAogCWhmYTM4NHhfdCAqaHcsCi0JVUlOVDE2IG1vZGUsCi0JVUlOVDE2IGxvd2FkZHIsCi0JVUlOVDE2IGhpZ2hhZGRyLAotCVVJTlQxNiBjb2RlbGVuKTsKKwl1MTYgbW9kZSwKKwl1MTYgbG93YWRkciwKKwl1MTYgaGlnaGFkZHIsCisJdTE2IGNvZGVsZW4pOwogaW50CiBoZmEzODR4X2NtZF9hdXhfZW5hYmxlKGhmYTM4NHhfdCAqaHcsIGludCBmb3JjZSk7CiBpbnQKQEAgLTI4NzIsMTk2ICsyNzU5LDM0IEBACiBpbnQKIGhmYTM4NHhfY29weV9mcm9tX2JhcCgKIAloZmEzODR4X3QgKmh3LAotCVVJTlQxNgliYXAsCi0JVUlOVDE2CWlkLAotCVVJTlQxNglvZmZzZXQsCisJdTE2CWJhcCwKKwl1MTYJaWQsCisJdTE2CW9mZnNldCwKIAl2b2lkCSpidWYsCi0JVUlOVAlsZW4pOworCXVuc2lnbmVkIGludAlsZW4pOwogaW50CiBoZmEzODR4X2NvcHlfdG9fYmFwKAogCWhmYTM4NHhfdCAqaHcsCi0JVUlOVDE2CWJhcCwKLQlVSU5UMTYJaWQsCi0JVUlOVDE2CW9mZnNldCwKKwl1MTYJYmFwLAorCXUxNglpZCwKKwl1MTYJb2Zmc2V0LAogCXZvaWQJKmJ1ZiwKLQlVSU5UCWxlbik7CisJdW5zaWduZWQgaW50CWxlbik7CiB2b2lkCiBoZmEzODR4X2NvcHlfZnJvbV9hdXgoCiAJaGZhMzg0eF90ICpodywKLQlVSU5UMzIJY2FyZGFkZHIsCi0JVUlOVDMyCWF1eGN0bCwKKwl1MzIJY2FyZGFkZHIsCisJdTMyCWF1eGN0bCwKIAl2b2lkCSpidWYsCi0JVUlOVAlsZW4pOworCXVuc2lnbmVkIGludAlsZW4pOwogdm9pZAogaGZhMzg0eF9jb3B5X3RvX2F1eCgKIAloZmEzODR4X3QgKmh3LAotCVVJTlQzMgljYXJkYWRkciwKLQlVSU5UMzIJYXV4Y3RsLAorCXUzMgljYXJkYWRkciwKKwl1MzIJYXV4Y3RsLAogCXZvaWQJKmJ1ZiwKLQlVSU5UCWxlbik7CisJdW5zaWduZWQgaW50CWxlbik7CiAKLSNpZiAoV0xBTl9IT1NUSUYgIT0gV0xBTl9VU0IpCi0KLS8qCi0gICBIRkEzODR4IGlzIGEgTElUVExFIEVORElBTiBwYXJ0LgotCi0gICB0aGUgZ2V0L3NldHJlZyBmdW5jdGlvbnMgaW1wbGljaXRseSBieXRlLXN3YXAgdGhlIGRhdGEgdG8gTEUuCi0gICB0aGUgX25vc3dhcCB2YXJpYW50cyBkbyBub3QgcGVyZm9ybSBhIGJ5dGUtc3dhcCBvbiB0aGUgZGF0YS4KLSovCi0KLXN0YXRpYyBpbmxpbmUgVUlOVDE2Ci1fX2hmYTM4NHhfZ2V0cmVnKGhmYTM4NHhfdCAqaHcsIFVJTlQgcmVnKTsKLQotc3RhdGljIGlubGluZSB2b2lkCi1fX2hmYTM4NHhfc2V0cmVnKGhmYTM4NHhfdCAqaHcsIFVJTlQxNiB2YWwsIFVJTlQgcmVnKTsKLQotc3RhdGljIGlubGluZSBVSU5UMTYKLV9faGZhMzg0eF9nZXRyZWdfbm9zd2FwKGhmYTM4NHhfdCAqaHcsIFVJTlQgcmVnKTsKLQotc3RhdGljIGlubGluZSB2b2lkCi1fX2hmYTM4NHhfc2V0cmVnX25vc3dhcChoZmEzODR4X3QgKmh3LCBVSU5UMTYgdmFsLCBVSU5UIHJlZyk7Ci0KLSNpZmRlZiBSRVZFUlNFX0VORElBTgotI2RlZmluZSBoZmEzODR4X2dldHJlZyBfX2hmYTM4NHhfZ2V0cmVnX25vc3dhcAotI2RlZmluZSBoZmEzODR4X3NldHJlZyBfX2hmYTM4NHhfc2V0cmVnX25vc3dhcAotI2RlZmluZSBoZmEzODR4X2dldHJlZ19ub3N3YXAgX19oZmEzODR4X2dldHJlZwotI2RlZmluZSBoZmEzODR4X3NldHJlZ19ub3N3YXAgX19oZmEzODR4X3NldHJlZwotI2Vsc2UKLSNkZWZpbmUgaGZhMzg0eF9nZXRyZWcgX19oZmEzODR4X2dldHJlZwotI2RlZmluZSBoZmEzODR4X3NldHJlZyBfX2hmYTM4NHhfc2V0cmVnCi0jZGVmaW5lIGhmYTM4NHhfZ2V0cmVnX25vc3dhcCBfX2hmYTM4NHhfZ2V0cmVnX25vc3dhcAotI2RlZmluZSBoZmEzODR4X3NldHJlZ19ub3N3YXAgX19oZmEzODR4X3NldHJlZ19ub3N3YXAKLSNlbmRpZgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogaGZhMzg0eF9nZXRyZWcKLSoKLSogUmV0cmlldmUgdGhlIHZhbHVlIG9mIG9uZSBvZiB0aGUgTUFDIHJlZ2lzdGVycy4gIERvbmUgaGVyZQotKiBiZWNhdXNlIGRpZmZlcmVudCBQUklTTTIgTUFDIHBhcnRzIHVzZSBkaWZmZXJlbnQgYnVzZXMgYW5kIHN1Y2guCi0qIE5PVEU6IFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgdmFsdWUgaW4gSE9TVCBPUkRFUiEhISEhIQotKgotKiBBcmd1bWVudHM6Ci0qICAgICAgIGh3ICAgICAgICAgTUFDIHBhcnQgc3RydWN0dXJlCi0qICAgICAgIHJlZyAgICAgICAgUmVnaXN0ZXIgaWRlbnRpZmllciAob2Zmc2V0IGZvciBJL08gYmFzZWQgaS9mKQotKgotKiBSZXR1cm5zOgotKiAgICAgICBWYWx1ZSBmcm9tIHRoZSByZWdpc3RlciBpbiBIT1NUIE9SREVSISEhIQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1zdGF0aWMgaW5saW5lIFVJTlQxNgotX19oZmEzODR4X2dldHJlZyhoZmEzODR4X3QgKmh3LCBVSU5UIHJlZykKLXsKLS8qCXByaW50ayhLRVJOX0RFQlVHICJSZWFkaW5nIGZyb20gMHglMHhcbiIsIGh3LT5tZW1iYXNlICsgcmVnKTsgKi8KLSNpZiAoKFdMQU5fSE9TVElGID09IFdMQU5fUENNQ0lBKSB8fCAoV0xBTl9IT1NUSUYgPT0gV0xBTl9QTFgpKQotCXJldHVybiB3bGFuX2lud19sZTE2X3RvX2NwdShody0+aW9iYXNlK3JlZyk7Ci0jZWxpZiAoV0xBTl9IT1NUSUYgPT0gV0xBTl9QQ0kpCi0JcmV0dXJuIF9fbGUxNl90b19jcHUocmVhZHcoaHctPm1lbWJhc2UgKyByZWcpKTsKLSNlbmRpZgotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogaGZhMzg0eF9zZXRyZWcKLSoKLSogU2V0IHRoZSB2YWx1ZSBvZiBvbmUgb2YgdGhlIE1BQyByZWdpc3RlcnMuICBEb25lIGhlcmUKLSogYmVjYXVzZSBkaWZmZXJlbnQgUFJJU00yIE1BQyBwYXJ0cyB1c2UgZGlmZmVyZW50IGJ1c2VzIGFuZCBzdWNoLgotKiBOT1RFOiBUaGlzIGZ1bmN0aW9uIGFzc3VtZXMgdGhlIHZhbHVlIGlzIGluIEhPU1QgT1JERVIhISEhISEKLSoKLSogQXJndW1lbnRzOgotKiAgICAgICBodwlNQUMgcGFydCBzdHJ1Y3R1cmUKLSoJdmFsCVZhbHVlLCBpbiBIT1NUIE9SREVSISEsIHRvIHB1dCBpbiB0aGUgcmVnaXN0ZXIKLSogICAgICAgcmVnCVJlZ2lzdGVyIGlkZW50aWZpZXIgKG9mZnNldCBmb3IgSS9PIGJhc2VkIGkvZikKLSoKLSogUmV0dXJuczoKLSogICAgICAgTm90aGluZwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1zdGF0aWMgaW5saW5lIHZvaWQKLV9faGZhMzg0eF9zZXRyZWcoaGZhMzg0eF90ICpodywgVUlOVDE2IHZhbCwgVUlOVCByZWcpCi17Ci0jaWYgKChXTEFOX0hPU1RJRiA9PSBXTEFOX1BDTUNJQSkgfHwgKFdMQU5fSE9TVElGID09IFdMQU5fUExYKSkKLQl3bGFuX291dHdfY3B1X3RvX2xlMTYoIHZhbCwgaHctPmlvYmFzZSArIHJlZyk7Ci0JcmV0dXJuOwotI2VsaWYgKFdMQU5fSE9TVElGID09IFdMQU5fUENJKQotCXdyaXRldyhfX2NwdV90b19sZTE2KHZhbCksIGh3LT5tZW1iYXNlICsgcmVnKTsKLQlyZXR1cm47Ci0jZW5kaWYKLX0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogaGZhMzg0eF9nZXRyZWdfbm9zd2FwCi0qCi0qIFJldHJpZXZlIHRoZSB2YWx1ZSBvZiBvbmUgb2YgdGhlIE1BQyByZWdpc3RlcnMuICBEb25lIGhlcmUKLSogYmVjYXVzZSBkaWZmZXJlbnQgUFJJU00yIE1BQyBwYXJ0cyB1c2UgZGlmZmVyZW50IGJ1c2VzIGFuZCBzdWNoLgotKgotKiBBcmd1bWVudHM6Ci0qICAgICAgIGh3ICAgICAgICAgTUFDIHBhcnQgc3RydWN0dXJlCi0qICAgICAgIHJlZyAgICAgICAgUmVnaXN0ZXIgaWRlbnRpZmllciAob2Zmc2V0IGZvciBJL08gYmFzZWQgaS9mKQotKgotKiBSZXR1cm5zOgotKiAgICAgICBWYWx1ZSBmcm9tIHRoZSByZWdpc3Rlci4KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotc3RhdGljIGlubGluZSBVSU5UMTYKLV9faGZhMzg0eF9nZXRyZWdfbm9zd2FwKGhmYTM4NHhfdCAqaHcsIFVJTlQgcmVnKQotewotI2lmICgoV0xBTl9IT1NUSUYgPT0gV0xBTl9QQ01DSUEpIHx8IChXTEFOX0hPU1RJRiA9PSBXTEFOX1BMWCkpCi0JcmV0dXJuIHdsYW5faW53KGh3LT5pb2Jhc2UrcmVnKTsKLSNlbGlmIChXTEFOX0hPU1RJRiA9PSBXTEFOX1BDSSkKLQlyZXR1cm4gcmVhZHcoaHctPm1lbWJhc2UgKyByZWcpOwotI2VuZGlmCi19Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIGhmYTM4NHhfc2V0cmVnX25vc3dhcAotKgotKiBTZXQgdGhlIHZhbHVlIG9mIG9uZSBvZiB0aGUgTUFDIHJlZ2lzdGVycy4gIERvbmUgaGVyZQotKiBiZWNhdXNlIGRpZmZlcmVudCBQUklTTTIgTUFDIHBhcnRzIHVzZSBkaWZmZXJlbnQgYnVzZXMgYW5kIHN1Y2guCi0qCi0qIEFyZ3VtZW50czoKLSogICAgICAgaHcJTUFDIHBhcnQgc3RydWN0dXJlCi0qCXZhbAlWYWx1ZSB0byBwdXQgaW4gdGhlIHJlZ2lzdGVyCi0qICAgICAgIHJlZwlSZWdpc3RlciBpZGVudGlmaWVyIChvZmZzZXQgZm9yIEkvTyBiYXNlZCBpL2YpCi0qCi0qIFJldHVybnM6Ci0qICAgICAgIE5vdGhpbmcKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotc3RhdGljIGlubGluZSB2b2lkCi1fX2hmYTM4NHhfc2V0cmVnX25vc3dhcChoZmEzODR4X3QgKmh3LCBVSU5UMTYgdmFsLCBVSU5UIHJlZykKLXsKLSNpZiAoKFdMQU5fSE9TVElGID09IFdMQU5fUENNQ0lBKSB8fCAoV0xBTl9IT1NUSUYgPT0gV0xBTl9QTFgpKQotCXdsYW5fb3V0dyggdmFsLCBody0+aW9iYXNlICsgcmVnKTsKLQlyZXR1cm47Ci0jZWxpZiAoV0xBTl9IT1NUSUYgPT0gV0xBTl9QQ0kpCi0Jd3JpdGV3KHZhbCwgaHctPm1lbWJhc2UgKyByZWcpOwotCXJldHVybjsKLSNlbmRpZgotfQotCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCBoZmEzODR4X2V2ZW50c19hbGwoaGZhMzg0eF90ICpodykKLXsKLQloZmEzODR4X3NldHJlZyhodywKLQkJICAgICAgIEhGQTM4NHhfSU5UX05PUk1BTAotI2lmZGVmIENNRF9JUlEKLQkJICAgICAgIHwgSEZBMzg0eF9JTlRFTl9DTURfU0VUKDEpCi0jZW5kaWYKLQkJICAgICAgICwKLQkJICAgICAgIEhGQTM4NHhfSU5URU4pOwotCi19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBoZmEzODR4X2V2ZW50c19ub2JhcChoZmEzODR4X3QgKmh3KQotewotCWhmYTM4NHhfc2V0cmVnKGh3LAotCQkgICAgICAgIChIRkEzODR4X0lOVF9OT1JNQUwgJiB+SEZBMzg0eF9JTlRfQkFQX09QKQotI2lmZGVmIENNRF9JUlEKLQkJICAgICAgIHwgSEZBMzg0eF9JTlRFTl9DTURfU0VUKDEpCi0jZW5kaWYKLQkJICAgICAgICwKLQkJICAgICAgIEhGQTM4NHhfSU5URU4pOwotCi19Ci0KLSNlbmRpZiAvKiBXTEFOX0hPU1RJRiAhPSBXTEFOX1VTQiAqLwogI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KIAogI2VuZGlmICAvKiBfSEZBMzg0eF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9oZmEzODR4X3VzYi5jIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvaGZhMzg0eF91c2IuYwppbmRleCBkYjBjNTAyLi44YTc1YjUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9oZmEzODR4X3VzYi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL2hmYTM4NHhfdXNiLmMKQEAgLTExNCw5ICsxMTQsNiBAQAogLyogU3lzdGVtIEluY2x1ZGVzICovCiAjZGVmaW5lIFdMQU5fREJWQVIJcHJpc20yX2RlYnVnCiAKLSNpbmNsdWRlICJ2ZXJzaW9uLmgiCi0KLQogI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgpAQCAtMTM2LDYzICsxMzMsNyBAQAogCiAjaW5jbHVkZSAid2xhbl9jb21wYXQuaCIKIAotI2lmIChXTEFOX0hPU1RJRiAhPSBXTEFOX1VTQikKLSNlcnJvciAiVGhpcyBmaWxlIGlzIHNwZWNpZmljIHRvIFVTQiIKLSNlbmRpZgotCi0KLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMTApCi1zdGF0aWMgaW50Ci13YWl0X2Zvcl9jb21wbGV0aW9uX2ludGVycnVwdGlibGUoc3RydWN0IGNvbXBsZXRpb24gKngpCi17Ci0gIGludCByZXQgPSAwOwotCi0gIG1pZ2h0X3NsZWVwKCk7Ci0KLSAgc3Bpbl9sb2NrX2lycSgmeC0+d2FpdC5sb2NrKTsKLSAgaWYgKCF4LT5kb25lKSB7Ci0gICAgREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7Ci0KLSAgICB3YWl0LmZsYWdzIHw9IFdRX0ZMQUdfRVhDTFVTSVZFOwotICAgIF9fYWRkX3dhaXRfcXVldWVfdGFpbCgmeC0+d2FpdCwgJndhaXQpOwotICAgIGRvIHsKLSAgICAgIGlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgewotICAgICAgICByZXQgPSAtRVJFU1RBUlRTWVM7Ci0gICAgICAgIF9fcmVtb3ZlX3dhaXRfcXVldWUoJngtPndhaXQsICZ3YWl0KTsKLSAgICAgICAgZ290byBvdXQ7Ci0gICAgICB9Ci0gICAgICBfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7Ci0gICAgICBzcGluX3VubG9ja19pcnEoJngtPndhaXQubG9jayk7Ci0gICAgICBzY2hlZHVsZSgpOwotICAgICAgc3Bpbl9sb2NrX2lycSgmeC0+d2FpdC5sb2NrKTsKLSAgICB9IHdoaWxlICgheC0+ZG9uZSk7Ci0gICAgX19yZW1vdmVfd2FpdF9xdWV1ZSgmeC0+d2FpdCwgJndhaXQpOwotICB9Ci0gIHgtPmRvbmUtLTsKLW91dDoKLSAgc3Bpbl91bmxvY2tfaXJxKCZ4LT53YWl0LmxvY2spOwotCi0gIHJldHVybiByZXQ7Ci19Ci0jZW5kaWYKLQotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNSw2OSkKLXN0YXRpYyB2b2lkCi11c2JfaW5pdF91cmIoc3RydWN0IHVyYiAqdXJiKQotewotCW1lbXNldCh1cmIsIDAsIHNpemVvZigqdXJiKSk7Ci0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNSwwKSAvKiB0dW5lIG1lISAqLwotCXVyYi0+Y291bnQgPSAoYXRvbWljX3QpQVRPTUlDX0lOSVQoMSk7Ci0jZW5kaWYKLQlzcGluX2xvY2tfaW5pdCgmdXJiLT5sb2NrKTsKLX0KLSNlbmRpZgotCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNSwwKSAvKiB0dW5lIG1lISAqLwotIyAgZGVmaW5lIFNVQk1JVF9VUkIodSxmKSAgdXNiX3N1Ym1pdF91cmIodSxmKQotI2Vsc2UKLSMgIGRlZmluZSBTVUJNSVRfVVJCKHUsZikgIHVzYl9zdWJtaXRfdXJiKHUpCi0jZW5kaWYKKyNkZWZpbmUgU1VCTUlUX1VSQih1LGYpICB1c2Jfc3VibWl0X3VyYih1LGYpCiAKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAvKiBQcm9qZWN0IEluY2x1ZGVzICovCkBAIC0yNTcsMjEgKzE5OCwxMiBAQAogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKiBDYWxsYmFja3MgKi8KLSNpZmRlZiBVUkJfT05MWV9DQUxMQkFDSwogc3RhdGljIHZvaWQKIGhmYTM4NHhfdXNib3V0X2NhbGxiYWNrKHN0cnVjdCB1cmIgKnVyYik7CiBzdGF0aWMgdm9pZAogaGZhMzg0eF9jdGx4b3V0X2NhbGxiYWNrKHN0cnVjdCB1cmIgKnVyYik7CiBzdGF0aWMgdm9pZAogaGZhMzg0eF91c2Jpbl9jYWxsYmFjayhzdHJ1Y3QgdXJiICp1cmIpOwotI2Vsc2UKLXN0YXRpYyB2b2lkCi1oZmEzODR4X3VzYm91dF9jYWxsYmFjayhzdHJ1Y3QgdXJiICp1cmIsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKLXN0YXRpYyB2b2lkCi1oZmEzODR4X2N0bHhvdXRfY2FsbGJhY2soc3RydWN0IHVyYiAqdXJiLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7Ci1zdGF0aWMgdm9pZAotaGZhMzg0eF91c2Jpbl9jYWxsYmFjayhzdHJ1Y3QgdXJiICp1cmIsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKLSNlbmRpZgogCiBzdGF0aWMgdm9pZAogaGZhMzg0eF91c2Jpbl90eGNvbXBsKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgaGZhMzg0eF91c2Jpbl90ICp1c2Jpbik7CkBAIC0zNTgsOSArMjkwLDkgQEAKIGhmYTM4NHhfZG9ycmlkKAogCWhmYTM4NHhfdCAqaHcsCiAJQ01EX01PREUgbW9kZSwKLQlVSU5UMTYJcmlkLAorCXUxNglyaWQsCiAJdm9pZAkqcmlkZGF0YSwKLQlVSU5UCXJpZGRhdGFsZW4sCisJdW5zaWduZWQgaW50CXJpZGRhdGFsZW4sCiAJY3RseF9jbWRjYl90IGNtZGNiLAogCWN0bHhfdXNlcmNiX3QgdXNlcmNiLAogCXZvaWQJKnVzZXJjYl9kYXRhKTsKQEAgLTM2OSw5ICszMDEsOSBAQAogaGZhMzg0eF9kb3dyaWQoCiAJaGZhMzg0eF90ICpodywKIAlDTURfTU9ERSBtb2RlLAotCVVJTlQxNglyaWQsCisJdTE2CXJpZCwKIAl2b2lkCSpyaWRkYXRhLAotCVVJTlQJcmlkZGF0YWxlbiwKKwl1bnNpZ25lZCBpbnQJcmlkZGF0YWxlbiwKIAljdGx4X2NtZGNiX3QgY21kY2IsCiAJY3RseF91c2VyY2JfdCB1c2VyY2IsCiAJdm9pZAkqdXNlcmNiX2RhdGEpOwpAQCAtMzgwLDEwICszMTIsMTAgQEAKIGhmYTM4NHhfZG9ybWVtKAogCWhmYTM4NHhfdCAqaHcsCiAJQ01EX01PREUgbW9kZSwKLQlVSU5UMTYJcGFnZSwKLQlVSU5UMTYJb2Zmc2V0LAorCXUxNglwYWdlLAorCXUxNglvZmZzZXQsCiAJdm9pZAkqZGF0YSwKLQlVSU5UCWxlbiwKKwl1bnNpZ25lZCBpbnQJbGVuLAogCWN0bHhfY21kY2JfdCBjbWRjYiwKIAljdGx4X3VzZXJjYl90IHVzZXJjYiwKIAl2b2lkCSp1c2VyY2JfZGF0YSk7CkBAIC0zOTIsMTYgKzMyNCwxNiBAQAogaGZhMzg0eF9kb3dtZW0oCiAJaGZhMzg0eF90ICpodywKIAlDTURfTU9ERSBtb2RlLAotCVVJTlQxNglwYWdlLAotCVVJTlQxNglvZmZzZXQsCisJdTE2CXBhZ2UsCisJdTE2CW9mZnNldCwKIAl2b2lkCSpkYXRhLAotCVVJTlQJbGVuLAorCXVuc2lnbmVkIGludAlsZW4sCiAJY3RseF9jbWRjYl90IGNtZGNiLAogCWN0bHhfdXNlcmNiX3QgdXNlcmNiLAogCXZvaWQJKnVzZXJjYl9kYXRhKTsKIAogc3RhdGljIGludAotaGZhMzg0eF9pc2dvb2RfcGRyY29kZShVSU5UMTYgcGRyY29kZSk7CitoZmEzODR4X2lzZ29vZF9wZHJjb2RlKHUxNiBwZHJjb2RlKTsKIAogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KIC8qIEZ1bmN0aW9uIERlZmluaXRpb25zICovCkBAIC00MzUsMTcgKzM2NywxNyBAQAogCVdMQU5fTE9HX0RFQlVHKDMsInVyYi0+cGlwZT0weCUwOHhcbiIsIHVyYi0+cGlwZSk7CiAJV0xBTl9MT0dfREVCVUcoMywidXJiLT5zdGF0dXM9MHglMDh4XG4iLCB1cmItPnN0YXR1cyk7CiAJV0xBTl9MT0dfREVCVUcoMywidXJiLT50cmFuc2Zlcl9mbGFncz0weCUwOHhcbiIsIHVyYi0+dHJhbnNmZXJfZmxhZ3MpOwotCVdMQU5fTE9HX0RFQlVHKDMsInVyYi0+dHJhbnNmZXJfYnVmZmVyPTB4JTA4eFxuIiwgKFVJTlQpdXJiLT50cmFuc2Zlcl9idWZmZXIpOworCVdMQU5fTE9HX0RFQlVHKDMsInVyYi0+dHJhbnNmZXJfYnVmZmVyPTB4JTA4eFxuIiwgKHVuc2lnbmVkIGludCl1cmItPnRyYW5zZmVyX2J1ZmZlcik7CiAJV0xBTl9MT0dfREVCVUcoMywidXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoPTB4JTA4eFxuIiwgdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoKTsKIAlXTEFOX0xPR19ERUJVRygzLCJ1cmItPmFjdHVhbF9sZW5ndGg9MHglMDh4XG4iLCB1cmItPmFjdHVhbF9sZW5ndGgpOwogCVdMQU5fTE9HX0RFQlVHKDMsInVyYi0+YmFuZHdpZHRoPTB4JTA4eFxuIiwgdXJiLT5iYW5kd2lkdGgpOwotCVdMQU5fTE9HX0RFQlVHKDMsInVyYi0+c2V0dXBfcGFja2V0KGN0bCk9MHglMDh4XG4iLCAoVUlOVCl1cmItPnNldHVwX3BhY2tldCk7CisJV0xBTl9MT0dfREVCVUcoMywidXJiLT5zZXR1cF9wYWNrZXQoY3RsKT0weCUwOHhcbiIsICh1bnNpZ25lZCBpbnQpdXJiLT5zZXR1cF9wYWNrZXQpOwogCVdMQU5fTE9HX0RFQlVHKDMsInVyYi0+c3RhcnRfZnJhbWUoaXNvL2lycSk9MHglMDh4XG4iLCB1cmItPnN0YXJ0X2ZyYW1lKTsKIAlXTEFOX0xPR19ERUJVRygzLCJ1cmItPmludGVydmFsKGlycSk9MHglMDh4XG4iLCB1cmItPmludGVydmFsKTsKIAlXTEFOX0xPR19ERUJVRygzLCJ1cmItPmVycm9yX2NvdW50KGlzbyk9MHglMDh4XG4iLCB1cmItPmVycm9yX2NvdW50KTsKIAlXTEFOX0xPR19ERUJVRygzLCJ1cmItPnRpbWVvdXQ9MHglMDh4XG4iLCB1cmItPnRpbWVvdXQpOwotCVdMQU5fTE9HX0RFQlVHKDMsInVyYi0+Y29udGV4dD0weCUwOHhcbiIsIChVSU5UKXVyYi0+Y29udGV4dCk7Ci0JV0xBTl9MT0dfREVCVUcoMywidXJiLT5jb21wbGV0ZT0weCUwOHhcbiIsIChVSU5UKXVyYi0+Y29tcGxldGUpOworCVdMQU5fTE9HX0RFQlVHKDMsInVyYi0+Y29udGV4dD0weCUwOHhcbiIsICh1bnNpZ25lZCBpbnQpdXJiLT5jb250ZXh0KTsKKwlXTEFOX0xPR19ERUJVRygzLCJ1cmItPmNvbXBsZXRlPTB4JTA4eFxuIiwgKHVuc2lnbmVkIGludCl1cmItPmNvbXBsZXRlKTsKIH0KICNlbmRpZgogCkBAIC02NTIsNyArNTg0LDcgQEAKIAogCS8qIFJlc3VtZSB0cmFuc21pdHRpbmcuICovCiAJaWYgKCB0ZXN0X2FuZF9jbGVhcl9iaXQoV09SS19UWF9SRVNVTUUsICZody0+dXNiX2ZsYWdzKSApIHsKLQkJcDgwMjExbmV0ZGV2X3dha2VfcXVldWUoaHctPndsYW5kZXYpOworCQluZXRpZl93YWtlX3F1ZXVlKGh3LT53bGFuZGV2LT5uZXRkZXYpOwogCX0KIAogCURCRkVYSVQ7CkBAIC03MTEsOCArNjQzLDggQEAKIAl0YXNrbGV0X2luaXQoJmh3LT5jb21wbGV0aW9uX2JoLAogCSAgICAgICAgICAgICBoZmEzODR4X3VzYmN0bHhfY29tcGxldGlvbl90YXNrLAogCSAgICAgICAgICAgICAodW5zaWduZWQgbG9uZylodyk7Ci0JSU5JVF9XT1JLMigmaHctPmxpbmtfYmgsIHByaXNtMnN0YV9wcm9jZXNzaW5nX2RlZmVyKTsKLQlJTklUX1dPUksyKCZody0+dXNiX3dvcmssIGhmYTM4NHhfdXNiX2RlZmVyKTsKKwlJTklUX1dPUksoJmh3LT5saW5rX2JoLCBwcmlzbTJzdGFfcHJvY2Vzc2luZ19kZWZlcik7CisJSU5JVF9XT1JLKCZody0+dXNiX3dvcmssIGhmYTM4NHhfdXNiX2RlZmVyKTsKIAogCWluaXRfdGltZXIoJmh3LT50aHJvdHRsZSk7CiAJaHctPnRocm90dGxlLmZ1bmN0aW9uID0gaGZhMzg0eF91c2JfdGhyb3R0bGVmbjsKQEAgLTczMyw3ICs2NjUsNyBAQAogCWh3LT5saW5rX3N0YXR1cyA9IEhGQTM4NHhfTElOS19OT1RDT05ORUNURUQ7CiAJaHctPnN0YXRlID0gSEZBMzg0eF9TVEFURV9JTklUOwogCi0gICAgICAgIElOSVRfV09SSzIoJmh3LT5jb21tc3F1YWxfYmgsIHByaXNtMnN0YV9jb21tc3F1YWxfZGVmZXIpOworICAgICAgICBJTklUX1dPUksoJmh3LT5jb21tc3F1YWxfYmgsIHByaXNtMnN0YV9jb21tc3F1YWxfZGVmZXIpOwogCWluaXRfdGltZXIoJmh3LT5jb21tc3F1YWxfdGltZXIpOwogCWh3LT5jb21tc3F1YWxfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBodzsKIAlody0+Y29tbXNxdWFsX3RpbWVyLmZ1bmN0aW9uID0gcHJpc20yc3RhX2NvbW1zcXVhbF90aW1lcjsKQEAgLTg4OCw3ICs4MjAsNyBAQAogCiAJY29uc3QgaGZhMzg0eF91c2JfcnJpZHJlc3BfdAkqcnJpZHJlc3A7CiAJdm9pZAkJCSpyaWRkYXRhOwotCVVJTlQJCQlyaWRkYXRhbGVuOworCXVuc2lnbmVkIGludAkJCXJpZGRhdGFsZW47CiB9OwogdHlwZWRlZiBzdHJ1Y3QgdXNiY3RseF9ycmlkX2NvbXBsZXRvciB1c2JjdGx4X3JyaWRfY29tcGxldG9yX3Q7CiAKQEAgLTkxOSw3ICs4NTEsNyBAQAogaW5pdF9ycmlkX2NvbXBsZXRvcih1c2JjdGx4X3JyaWRfY29tcGxldG9yX3QgKmNvbXBsZXRvciwKICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGZhMzg0eF91c2JfcnJpZHJlc3BfdCAqcnJpZHJlc3AsCiAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnJpZGRhdGEsCi0gICAgICAgICAgICAgICAgICAgIFVJTlQgcmlkZGF0YWxlbikKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHJpZGRhdGFsZW4pCiB7CiAJY29tcGxldG9yLT5oZWFkLmNvbXBsZXRlID0gdXNiY3RseF9ycmlkX2NvbXBsZXRvcl9mbjsKIAljb21wbGV0b3ItPnJyaWRyZXNwID0gcnJpZHJlc3A7CkBAIC05NTIsNyArODg0LDcgQEAKIAogICAgICAgICBjb25zdCBoZmEzODR4X3VzYl9ybWVtcmVzcF90ICAqcm1lbXJlc3A7CiAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhOwotICAgICAgICBVSU5UICAgICAgICAgICAgICAgICAgICAgICAgICBsZW47CisgICAgICAgIHVuc2lnbmVkIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuOwogfTsKIHR5cGVkZWYgc3RydWN0IHVzYmN0bHhfcm1lbV9jb21wbGV0b3IgdXNiY3RseF9ybWVtX2NvbXBsZXRvcl90OwogCkBAIC05NjksNyArOTAxLDcgQEAKIGluaXRfcm1lbV9jb21wbGV0b3IodXNiY3RseF9ybWVtX2NvbXBsZXRvcl90ICpjb21wbGV0b3IsCiAgICAgICAgICAgICAgICAgICAgIGhmYTM4NHhfdXNiX3JtZW1yZXNwX3QgKnJtZW1yZXNwLAogICAgICAgICAgICAgICAgICAgICB2b2lkICpkYXRhLAotICAgICAgICAgICAgICAgICAgICBVSU5UIGxlbikKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGxlbikKIHsKIAljb21wbGV0b3ItPmhlYWQuY29tcGxldGUgPSB1c2JjdGx4X3JtZW1fY29tcGxldG9yX2ZuOwogCWNvbXBsZXRvci0+cm1lbXJlc3AgPSBybWVtcmVzcDsKQEAgLTEwODAsNyArMTAxMiw3IEBACiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50Ci1oZmEzODR4X2RvcnJpZF93YWl0KGhmYTM4NHhfdCAqaHcsIFVJTlQxNiByaWQsIHZvaWQgKnJpZGRhdGEsIFVJTlQgcmlkZGF0YWxlbikKK2hmYTM4NHhfZG9ycmlkX3dhaXQoaGZhMzg0eF90ICpodywgdTE2IHJpZCwgdm9pZCAqcmlkZGF0YSwgdW5zaWduZWQgaW50IHJpZGRhdGFsZW4pCiB7CiAJcmV0dXJuIGhmYTM4NHhfZG9ycmlkKGh3LCBET1dBSVQsCiAJICAgICAgICAgICAgICAgICAgICAgIHJpZCwgcmlkZGF0YSwgcmlkZGF0YWxlbiwKQEAgLTEwODksNyArMTAyMSw3IEBACiAKIHN0YXRpYyBpbmxpbmUgaW50CiBoZmEzODR4X2RvcnJpZF9hc3luYyhoZmEzODR4X3QgKmh3LAotICAgICAgICAgICAgICAgICAgICAgVUlOVDE2IHJpZCwgdm9pZCAqcmlkZGF0YSwgVUlOVCByaWRkYXRhbGVuLAorICAgICAgICAgICAgICAgICAgICAgdTE2IHJpZCwgdm9pZCAqcmlkZGF0YSwgdW5zaWduZWQgaW50IHJpZGRhdGFsZW4sCiAgICAgICAgICAgICAgICAgICAgICBjdGx4X2NtZGNiX3QgY21kY2IsCiAgICAgICAgICAgICAgICAgICAgICBjdGx4X3VzZXJjYl90IHVzZXJjYiwKICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJjYl9kYXRhKQpAQCAtMTEwMCw3ICsxMDMyLDcgQEAKIH0KIAogc3RhdGljIGlubGluZSBpbnQKLWhmYTM4NHhfZG93cmlkX3dhaXQoaGZhMzg0eF90ICpodywgVUlOVDE2IHJpZCwgdm9pZCAqcmlkZGF0YSwgVUlOVCByaWRkYXRhbGVuKQoraGZhMzg0eF9kb3dyaWRfd2FpdChoZmEzODR4X3QgKmh3LCB1MTYgcmlkLCB2b2lkICpyaWRkYXRhLCB1bnNpZ25lZCBpbnQgcmlkZGF0YWxlbikKIHsKIAlyZXR1cm4gaGZhMzg0eF9kb3dyaWQoaHcsIERPV0FJVCwKIAkgICAgICAgICAgICAgICAgICAgICAgcmlkLCByaWRkYXRhLCByaWRkYXRhbGVuLApAQCAtMTEwOSw3ICsxMDQxLDcgQEAKIAogc3RhdGljIGlubGluZSBpbnQKIGhmYTM4NHhfZG93cmlkX2FzeW5jKGhmYTM4NHhfdCAqaHcsCi0gICAgICAgICAgICAgICAgICAgICBVSU5UMTYgcmlkLCB2b2lkICpyaWRkYXRhLCBVSU5UIHJpZGRhdGFsZW4sCisgICAgICAgICAgICAgICAgICAgICB1MTYgcmlkLCB2b2lkICpyaWRkYXRhLCB1bnNpZ25lZCBpbnQgcmlkZGF0YWxlbiwKICAgICAgICAgICAgICAgICAgICAgIGN0bHhfY21kY2JfdCBjbWRjYiwKICAgICAgICAgICAgICAgICAgICAgIGN0bHhfdXNlcmNiX3QgdXNlcmNiLAogICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlcmNiX2RhdGEpCkBAIC0xMTIxLDcgKzEwNTMsNyBAQAogCiBzdGF0aWMgaW5saW5lIGludAogaGZhMzg0eF9kb3JtZW1fd2FpdChoZmEzODR4X3QgKmh3LAotICAgICAgICAgICAgICAgICAgICBVSU5UMTYgcGFnZSwgVUlOVDE2IG9mZnNldCwgdm9pZCAqZGF0YSwgVUlOVCBsZW4pCisgICAgICAgICAgICAgICAgICAgIHUxNiBwYWdlLCB1MTYgb2Zmc2V0LCB2b2lkICpkYXRhLCB1bnNpZ25lZCBpbnQgbGVuKQogewogCXJldHVybiBoZmEzODR4X2Rvcm1lbShodywgRE9XQUlULAogCSAgICAgICAgICAgICAgICAgICAgICBwYWdlLCBvZmZzZXQsIGRhdGEsIGxlbiwKQEAgLTExMzAsNyArMTA2Miw3IEBACiAKIHN0YXRpYyBpbmxpbmUgaW50CiBoZmEzODR4X2Rvcm1lbV9hc3luYyhoZmEzODR4X3QgKmh3LAotICAgICAgICAgICAgICAgICAgICAgVUlOVDE2IHBhZ2UsIFVJTlQxNiBvZmZzZXQsIHZvaWQgKmRhdGEsIFVJTlQgbGVuLAorICAgICAgICAgICAgICAgICAgICAgdTE2IHBhZ2UsIHUxNiBvZmZzZXQsIHZvaWQgKmRhdGEsIHVuc2lnbmVkIGludCBsZW4sCiAgICAgICAgICAgICAgICAgICAgICBjdGx4X2NtZGNiX3QgY21kY2IsCiAgICAgICAgICAgICAgICAgICAgICBjdGx4X3VzZXJjYl90IHVzZXJjYiwKICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJjYl9kYXRhKQpAQCAtMTE0MywxMCArMTA3NSwxMCBAQAogc3RhdGljIGlubGluZSBpbnQKIGhmYTM4NHhfZG93bWVtX3dhaXQoCiAgICAgICAgIGhmYTM4NHhfdCAqaHcsCi0gICAgICAgIFVJTlQxNiAgcGFnZSwKLSAgICAgICAgVUlOVDE2ICBvZmZzZXQsCisgICAgICAgIHUxNiAgcGFnZSwKKyAgICAgICAgdTE2ICBvZmZzZXQsCiAgICAgICAgIHZvaWQgICAgKmRhdGEsCi0gICAgICAgIFVJTlQgICAgbGVuKQorICAgICAgICB1bnNpZ25lZCBpbnQgICAgbGVuKQogewogCXJldHVybiBoZmEzODR4X2Rvd21lbShodywgRE9XQUlULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2UsIG9mZnNldCwgZGF0YSwgbGVuLApAQCAtMTE1NiwxMCArMTA4OCwxMCBAQAogc3RhdGljIGlubGluZSBpbnQKIGhmYTM4NHhfZG93bWVtX2FzeW5jKAogICAgICAgICBoZmEzODR4X3QgKmh3LAotICAgICAgICBVSU5UMTYgIHBhZ2UsCi0gICAgICAgIFVJTlQxNiAgb2Zmc2V0LAorICAgICAgICB1MTYgIHBhZ2UsCisgICAgICAgIHUxNiAgb2Zmc2V0LAogICAgICAgICB2b2lkICAgICpkYXRhLAotICAgICAgICBVSU5UICAgIGxlbiwKKyAgICAgICAgdW5zaWduZWQgaW50ICAgIGxlbiwKICAgICAgICAgY3RseF9jbWRjYl90IGNtZGNiLAogICAgICAgICBjdGx4X3VzZXJjYl90IHVzZXJjYiwKICAgICAgICAgdm9pZCAgICAqdXNlcmNiX2RhdGEpCkBAIC0xMjQ2LDcgKzExNzgsNyBAQAogKiBDYWxsIGNvbnRleHQ6CiAqCXByb2Nlc3MKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IGhmYTM4NHhfY21kX2Rpc2FibGUoaGZhMzg0eF90ICpodywgVUlOVDE2IG1hY3BvcnQpCitpbnQgaGZhMzg0eF9jbWRfZGlzYWJsZShoZmEzODR4X3QgKmh3LCB1MTYgbWFjcG9ydCkKIHsKIAlpbnQJcmVzdWx0ID0gMDsKIAloZmEzODR4X21ldGFjbWRfdCBjbWQ7CkBAIC0xMjg2LDcgKzEyMTgsNyBAQAogKiBDYWxsIGNvbnRleHQ6CiAqCXByb2Nlc3MKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IGhmYTM4NHhfY21kX2VuYWJsZShoZmEzODR4X3QgKmh3LCBVSU5UMTYgbWFjcG9ydCkKK2ludCBoZmEzODR4X2NtZF9lbmFibGUoaGZhMzg0eF90ICpodywgdTE2IG1hY3BvcnQpCiB7CiAJaW50CXJlc3VsdCA9IDA7CiAJaGZhMzg0eF9tZXRhY21kX3QgY21kOwpAQCAtMTMwNSw5NSArMTIzNyw2IEBACiAJcmV0dXJuIHJlc3VsdDsKIH0KIAotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogaGZhMzg0eF9jbWRfbm90aWZ5Ci0qCi0qIFNlbmRzIGFuIGluZm8gZnJhbWUgdG8gdGhlIGZpcm13YXJlIHRvIGFsdGVyIHRoZSBiZWhhdmlvcgotKiBvZiB0aGUgZi93IGFzeW5jaCBwcm9jZXNzZXMuICBDYW4gb25seSBiZSBjYWxsZWQgd2hlbiB0aGUgTUFDCi0qIGlzIGluIHRoZSBlbmFibGVkIHN0YXRlLgotKgotKiBBcmd1bWVudHM6Ci0qCWh3CQlkZXZpY2Ugc3RydWN0dXJlCi0qCXJlY2xhaW0JCVswfDFdIGluZGljYXRlcyB3aGV0aGVyIHRoZSBnaXZlbiBGSUQgd2lsbAotKgkJCWJlIGhhbmRlZCBiYWNrICh2aWEgQWxsb2MgZXZlbnQpIGZvciByZXVzZS4KLSoJCQkoaG9zdCBvcmRlcikKLSoJZmlkCQlGSUQgb2YgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIGZyYW1lIHRoYXQgd2FzCi0qCQkJcHJldmlvdXNseSBjb3BpZWQgdG8gTUFDIG1lbW9yeSB2aWEgdGhlIGJhcC4KLSoJCQkoaG9zdCBvcmRlcikKLSoKLSogUmV0dXJuczoKLSoJMAkJc3VjY2VzcwotKgk+MAkJZi93IHJlcG9ydGVkIGZhaWx1cmUgLSBmL3cgc3RhdHVzIGNvZGUKLSoJPDAJCWRyaXZlciByZXBvcnRlZCBlcnJvciAodGltZW91dHxiYWQgYXJnKQotKgotKiBTaWRlIGVmZmVjdHM6Ci0qCWh3LT5yZXNwMCB3aWxsIGNvbnRhaW4gdGhlIEZJRCBiZWluZyB1c2VkIGJ5IGFzeW5jIG5vdGlmeQotKglwcm9jZXNzLiAgSWYgcmVjbGFpbT09MCwgcmVzcDAgd2lsbCBiZSB0aGUgc2FtZSBhcyB0aGUgZmlkCi0qCWFyZ3VtZW50LiAgSWYgcmVjbGFpbT09MSwgcmVzcDAgd2lsbCBiZSB0aGUgZGlmZmVyZW50LgotKgotKiBDYWxsIGNvbnRleHQ6Ci0qCXByb2Nlc3MKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IGhmYTM4NHhfY21kX25vdGlmeShoZmEzODR4X3QgKmh3LCBVSU5UMTYgcmVjbGFpbSwgVUlOVDE2IGZpZCwKLQkJICAgICAgIHZvaWQgKmJ1ZiwgVUlOVDE2IGxlbikKLXsKLSNpZiAwCi0JaW50CXJlc3VsdCA9IDA7Ci0JVUlOVDE2CWNtZDsKLQlEQkZFTlRFUjsKLQljbWQgPQlIRkEzODR4X0NNRF9DTURDT0RFX1NFVChIRkEzODR4X0NNRENPREVfTk9USUZZKSB8Ci0JCUhGQTM4NHhfQ01EX1JFQ0xfU0VUKHJlY2xhaW0pOwotCXJlc3VsdCA9IGhmYTM4NHhfZG9jbWRfd2FpdChodywgY21kKTsKLQotCURCRkVYSVQ7Ci0JcmV0dXJuIHJlc3VsdDsKLSNlbmRpZgotcmV0dXJuIDA7Ci19Ci0KLQotI2lmIDAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBoZmEzODR4X2NtZF9pbnF1aXJ5Ci0qCi0qIFJlcXVlc3RzIGFuIGluZm8gZnJhbWUgZnJvbSB0aGUgZmlybXdhcmUuICBUaGUgaW5mbyBmcmFtZSB3aWxsCi0qIGJlIGRlbGl2ZXJlZCBhc3luY2hyb25vdXNseSB2aWEgdGhlIEluZm8gZXZlbnQuCi0qCi0qIEFyZ3VtZW50czoKLSoJaHcJCWRldmljZSBzdHJ1Y3R1cmUKLSoJZmlkCQlGSUQgb2YgdGhlIGluZm8gZnJhbWUgcmVxdWVzdGVkLiAoaG9zdCBvcmRlcikKLSoKLSogUmV0dXJuczoKLSoJMAkJc3VjY2VzcwotKgk+MAkJZi93IHJlcG9ydGVkIGZhaWx1cmUgLSBmL3cgc3RhdHVzIGNvZGUKLSoJPDAJCWRyaXZlciByZXBvcnRlZCBlcnJvciAodGltZW91dHxiYWQgYXJnKQotKgotKiBTaWRlIGVmZmVjdHM6Ci0qCi0qIENhbGwgY29udGV4dDoKLSoJcHJvY2VzcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgaGZhMzg0eF9jbWRfaW5xdWlyeShoZmEzODR4X3QgKmh3LCBVSU5UMTYgZmlkKQotewotCWludAlyZXN1bHQgPSAwOwotCWhmYTM4NHhfbWV0YWNtZF90IGNtZDsKLQotCURCRkVOVEVSOwotCi0JY21kLmNtZCA9IEhGQTM4NHhfQ01EX0NNRENPREVfU0VUKEhGQTM4NHhfQ01EQ09ERV9JTlEpOwotCWNtZC5wYXJtMCA9IDA7Ci0JY21kLnBhcm0xID0gMDsKLQljbWQucGFybTIgPSAwOwotCi0JcmVzdWx0ID0gaGZhMzg0eF9kb2NtZF93YWl0KGh3LCAmY21kKTsKLQotCURCRkVYSVQ7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLSNlbmRpZgotCi0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiBoZmEzODR4X2NtZF9tb25pdG9yCiAqCkBAIC0xNDIzLDcgKzEyNjYsNyBAQAogKiBDYWxsIGNvbnRleHQ6CiAqCXByb2Nlc3MKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IGhmYTM4NHhfY21kX21vbml0b3IoaGZhMzg0eF90ICpodywgVUlOVDE2IGVuYWJsZSkKK2ludCBoZmEzODR4X2NtZF9tb25pdG9yKGhmYTM4NHhfdCAqaHcsIHUxNiBlbmFibGUpCiB7CiAJaW50CXJlc3VsdCA9IDA7CiAJaGZhMzg0eF9tZXRhY21kX3QgY21kOwpAQCAtMTQ4MSw4ICsxMzI0LDggQEAKICogQ2FsbCBjb250ZXh0OgogKglwcm9jZXNzCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCBoZmEzODR4X2NtZF9kb3dubG9hZChoZmEzODR4X3QgKmh3LCBVSU5UMTYgbW9kZSwgVUlOVDE2IGxvd2FkZHIsCi0JCQkJVUlOVDE2IGhpZ2hhZGRyLCBVSU5UMTYgY29kZWxlbikKK2ludCBoZmEzODR4X2NtZF9kb3dubG9hZChoZmEzODR4X3QgKmh3LCB1MTYgbW9kZSwgdTE2IGxvd2FkZHIsCisJCQkJdTE2IGhpZ2hhZGRyLCB1MTYgY29kZWxlbikKIHsKIAlpbnQJcmVzdWx0ID0gMDsKIAloZmEzODR4X21ldGFjbWRfdCBjbWQ7CkBAIC0xNTMyLDcgKzEzNzUsNyBAQAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiB2b2lkCiBoZmEzODR4X2NvcHlfZnJvbV9hdXgoCi0JaGZhMzg0eF90ICpodywgVUlOVDMyIGNhcmRhZGRyLCBVSU5UMzIgYXV4Y3RsLCB2b2lkICpidWYsIFVJTlQgbGVuKQorCWhmYTM4NHhfdCAqaHcsIHUzMiBjYXJkYWRkciwgdTMyIGF1eGN0bCwgdm9pZCAqYnVmLCB1bnNpZ25lZCBpbnQgbGVuKQogewogCURCRkVOVEVSOwogCVdMQU5fTE9HX0VSUk9SKCJub3QgdXNlZCBpbiBVU0IuXG4iKTsKQEAgLTE1NjYsNyArMTQwOSw3IEBACiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIHZvaWQKIGhmYTM4NHhfY29weV90b19hdXgoCi0JaGZhMzg0eF90ICpodywgVUlOVDMyIGNhcmRhZGRyLCBVSU5UMzIgYXV4Y3RsLCB2b2lkICpidWYsIFVJTlQgbGVuKQorCWhmYTM4NHhfdCAqaHcsIHUzMiBjYXJkYWRkciwgdTMyIGF1eGN0bCwgdm9pZCAqYnVmLCB1bnNpZ25lZCBpbnQgbGVuKQogewogCURCRkVOVEVSOwogCVdMQU5fTE9HX0VSUk9SKCJub3QgdXNlZCBpbiBVU0IuXG4iKTsKQEAgLTE1OTksNzggKzE0NDIsMTAgQEAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogaW50IGhmYTM4NHhfY29yZXJlc2V0KGhmYTM4NHhfdCAqaHcsIGludCBob2xkdGltZSwgaW50IHNldHRsZXRpbWUsIGludCBnZW5lc2lzKQogewotI2lmIDAKLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDApKQotCXN0cnVjdCB1c2JfZGV2aWNlCSpwYXJlbnQgPSBody0+dXNiLT5wYXJlbnQ7Ci0JaW50CQkJaTsKLQlpbnQJCQlwb3J0ID0gLTE7Ci0jZW5kaWYKLSNlbmRpZgogCWludCAJCQlyZXN1bHQgPSAwOwogCi0KLSNkZWZpbmUgUDJfVVNCX1JUX1BPUlQJCShVU0JfVFlQRV9DTEFTUyB8IFVTQl9SRUNJUF9PVEhFUikKLSNkZWZpbmUgUDJfVVNCX0ZFQVRfUkVTRVQJNAotI2RlZmluZSBQMl9VU0JfRkVBVF9DX1JFU0VUCTIwCi0KIAlEQkZFTlRFUjsKIAotI2lmIDAKLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDApKQotCS8qIEZpbmQgdGhlIGh1YiBwb3J0ICovCi0JZm9yICggaSA9IDA7IGkgPCBwYXJlbnQtPm1heGNoaWxkOyBpKyspIHsKLQkJaWYgKHBhcmVudC0+Y2hpbGRyZW5baV0gPT0gaHctPnVzYikgewotCQkJcG9ydCA9IGk7Ci0JCQlicmVhazsKLQkJfQotCX0KLQlpZiAocG9ydCA8IDApIHJldHVybiAtRU5PRU5UOwotCi0JLyogU2V0IGFuZCBjbGVhciB0aGUgcmVzZXQgKi8KLQl1c2JfY29udHJvbF9tc2cocGFyZW50LCB1c2Jfc25kY3RybHBpcGUocGFyZW50LCAwKSwKLQkJVVNCX1JFUV9TRVRfRkVBVFVSRSwgUDJfVVNCX1JUX1BPUlQsIFAyX1VTQl9GRUFUX1JFU0VULAotCQlwb3J0KzEsIE5VTEwsIDAsIDEqSFopOwotCXdhaXRfbXMoaG9sZHRpbWUpOwotCXVzYl9jb250cm9sX21zZyhwYXJlbnQsIHVzYl9zbmRjdHJscGlwZShwYXJlbnQsIDApLAotCQlVU0JfUkVRX0NMRUFSX0ZFQVRVUkUsIFAyX1VTQl9SVF9QT1JULCBQMl9VU0JfRkVBVF9DX1JFU0VULAotCQlwb3J0KzEsIE5VTEwsIDAsIDEqSFopOwotCXdhaXRfbXMoc2V0dGxldGltZSk7Ci0KLQkvKiBTZXQgdGhlIGRldmljZSBhZGRyZXNzICovCi0JcmVzdWx0PXVzYl9zZXRfYWRkcmVzcyhody0+dXNiKTsKLQlpZiAocmVzdWx0IDwgMCkgewotCQlXTEFOX0xPR19FUlJPUigicmVzZXRfdXNiZGV2OiBEZXYgbm90IGFjY2VwdGluZyBhZGRyZXNzLCAiCi0JCQkicmVzdWx0PSVkXG4iLCByZXN1bHQpOwotCQljbGVhcl9iaXQoaHctPnVzYi0+ZGV2bnVtLCAmaHctPnVzYi0+YnVzLT5kZXZtYXAuZGV2aWNlbWFwKTsKLQkJaHctPnVzYi0+ZGV2bnVtID0gLTE7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JLyogTGV0IHRoZSBhZGRyZXNzIHNldHRsZSAqLwotCXdhaXRfbXMoMjApOwotCi0JLyogQXNzdW1lIHdlJ3JlIHJldXNpbmcgdGhlIG9yaWdpbmFsIGRlc2NyaXB0b3IgZGF0YSAqLwotCi0JLyogU2V0IHRoZSBjb25maWd1cmF0aW9uLiAqLwotCVdMQU5fTE9HX0RFQlVHKDMsICJTZXR0aW5nIENvbmZpZ3VyYXRpb24gJWRcbiIsCi0JCWh3LT51c2ItPmNvbmZpZ1swXS5iQ29uZmlndXJhdGlvblZhbHVlKTsKLQlyZXN1bHQ9dXNiX3NldF9jb25maWd1cmF0aW9uKGh3LT51c2IsIGh3LT51c2ItPmNvbmZpZ1swXS5iQ29uZmlndXJhdGlvblZhbHVlKTsKLQlpZiAoIHJlc3VsdCApIHsKLQkJV0xBTl9MT0dfRVJST1IoInVzYl9zZXRfY29uZmlndXJhdGlvbigpIGZhaWxlZCwgcmVzdWx0PSVkLlxuIiwKLQkJCQlyZXN1bHQpOwotCQlnb3RvIGRvbmU7Ci0JfQotCS8qIExldCB0aGUgY29uZmlndXJhdGlvbiBzZXR0bGUgKi8KLQl3YWl0X21zKDIwKTsKLQotIGRvbmU6Ci0jZWxzZQotCXJlc3VsdD11c2JfcmVzZXRfZGV2aWNlKGh3LT51c2IpOwotCWlmKHJlc3VsdDwwKSB7Ci0JCVdMQU5fTE9HX0VSUk9SKCJ1c2JfcmVzZXRfZGV2aWNlKCkgZmFpbGVkLCByZXN1bHQ9JWQuXG4iLHJlc3VsdCk7Ci0JfQotI2VuZGlmCi0jZW5kaWYKLQogCXJlc3VsdD11c2JfcmVzZXRfZGV2aWNlKGh3LT51c2IpOwogCWlmKHJlc3VsdDwwKSB7CiAJCVdMQU5fTE9HX0VSUk9SKCJ1c2JfcmVzZXRfZGV2aWNlKCkgZmFpbGVkLCByZXN1bHQ9JWQuXG4iLHJlc3VsdCk7CkBAIC0xOTI1LDkgKzE3MDAsOSBAQAogaGZhMzg0eF9kb3JyaWQoCiAJaGZhMzg0eF90ICpodywKIAlDTURfTU9ERSBtb2RlLAotCVVJTlQxNglyaWQsCisJdTE2CXJpZCwKIAl2b2lkCSpyaWRkYXRhLAotCVVJTlQJcmlkZGF0YWxlbiwKKwl1bnNpZ25lZCBpbnQJcmlkZGF0YWxlbiwKICAgICAgICAgY3RseF9jbWRjYl90IGNtZGNiLAogCWN0bHhfdXNlcmNiX3QgdXNlcmNiLAogCXZvaWQJKnVzZXJjYl9kYXRhKQpAQCAtMjAxMSw5ICsxNzg2LDkgQEAKIGhmYTM4NHhfZG93cmlkKAogCWhmYTM4NHhfdCAqaHcsCiAJQ01EX01PREUgbW9kZSwKLQlVSU5UMTYJcmlkLAorCXUxNglyaWQsCiAJdm9pZAkqcmlkZGF0YSwKLQlVSU5UCXJpZGRhdGFsZW4sCisJdW5zaWduZWQgaW50CXJpZGRhdGFsZW4sCiAJY3RseF9jbWRjYl90IGNtZGNiLAogCWN0bHhfdXNlcmNiX3QgdXNlcmNiLAogCXZvaWQJKnVzZXJjYl9kYXRhKQpAQCAtMjEwNCwxMCArMTg3OSwxMCBAQAogaGZhMzg0eF9kb3JtZW0oCiAJaGZhMzg0eF90ICpodywKIAlDTURfTU9ERSBtb2RlLAotCVVJTlQxNglwYWdlLAotCVVJTlQxNglvZmZzZXQsCisJdTE2CXBhZ2UsCisJdTE2CW9mZnNldCwKIAl2b2lkCSpkYXRhLAotCVVJTlQJbGVuLAorCXVuc2lnbmVkIGludAlsZW4sCiAJY3RseF9jbWRjYl90IGNtZGNiLAogCWN0bHhfdXNlcmNiX3QgdXNlcmNiLAogCXZvaWQJKnVzZXJjYl9kYXRhKQpAQCAtMjIwNSwxMCArMTk4MCwxMCBAQAogaGZhMzg0eF9kb3dtZW0oCiAJaGZhMzg0eF90ICpodywKIAlDTURfTU9ERSBtb2RlLAotCVVJTlQxNglwYWdlLAotCVVJTlQxNglvZmZzZXQsCisJdTE2CXBhZ2UsCisJdTE2CW9mZnNldCwKIAl2b2lkCSpkYXRhLAotCVVJTlQJbGVuLAorCXVuc2lnbmVkIGludAlsZW4sCiAJY3RseF9jbWRjYl90IGNtZGNiLAogCWN0bHhfdXNlcmNiX3QgdXNlcmNiLAogCXZvaWQJKnVzZXJjYl9kYXRhKQpAQCAtMjMyNSw3ICsyMTAwLDcgQEAKICogQ2FsbCBjb250ZXh0OgogKglwcm9jZXNzCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCBoZmEzODR4X2RydnJfZGlzYWJsZShoZmEzODR4X3QgKmh3LCBVSU5UMTYgbWFjcG9ydCkKK2ludCBoZmEzODR4X2RydnJfZGlzYWJsZShoZmEzODR4X3QgKmh3LCB1MTYgbWFjcG9ydCkKIHsKIAlpbnQJcmVzdWx0ID0gMDsKIApAQCAtMjM2Nyw3ICsyMTQyLDcgQEAKICogQ2FsbCBjb250ZXh0OgogKglwcm9jZXNzCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCBoZmEzODR4X2RydnJfZW5hYmxlKGhmYTM4NHhfdCAqaHcsIFVJTlQxNiBtYWNwb3J0KQoraW50IGhmYTM4NHhfZHJ2cl9lbmFibGUoaGZhMzg0eF90ICpodywgdTE2IG1hY3BvcnQpCiB7CiAJaW50CXJlc3VsdCA9IDA7CiAKQEAgLTI1MjAsMjIgKzIyOTUsMjIgQEAKIGludAogaGZhMzg0eF9kcnZyX2ZsYXNoZGxfd3JpdGUoCiAJaGZhMzg0eF90CSpodywKLQlVSU5UMzIJCWRhZGRyLAorCXUzMgkJZGFkZHIsCiAJdm9pZAkJKmJ1ZiwKLQlVSU5UMzIJCWxlbikKKwl1MzIJCWxlbikKIHsKIAlpbnQJCXJlc3VsdCA9IDA7Ci0JVUlOVDMyCQlkbGJ1ZmFkZHI7CisJdTMyCQlkbGJ1ZmFkZHI7CiAJaW50CQluYnVybnM7Ci0JVUlOVDMyCQlidXJubGVuOwotCVVJTlQzMgkJYnVybmRhZGRyOwotCVVJTlQxNgkJYnVybmxvOwotCVVJTlQxNgkJYnVybmhpOworCXUzMgkJYnVybmxlbjsKKwl1MzIJCWJ1cm5kYWRkcjsKKwl1MTYJCWJ1cm5sbzsKKwl1MTYJCWJ1cm5oaTsKIAlpbnQJCW53cml0ZXM7Ci0JVUlOVDgJCSp3cml0ZWJ1ZjsKLQlVSU5UMTYJCXdyaXRlcGFnZTsKLQlVSU5UMTYJCXdyaXRlb2Zmc2V0OwotCVVJTlQzMgkJd3JpdGVsZW47CisJdTgJCSp3cml0ZWJ1ZjsKKwl1MTYJCXdyaXRlcGFnZTsKKwl1MTYJCXdyaXRlb2Zmc2V0OworCXUzMgkJd3JpdGVsZW47CiAJaW50CQlpOwogCWludAkJajsKIApAQCAtMjY4Niw3ICsyNDYxLDcgQEAKICogQ2FsbCBjb250ZXh0OgogKglwcm9jZXNzCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCBoZmEzODR4X2RydnJfZ2V0Y29uZmlnKGhmYTM4NHhfdCAqaHcsIFVJTlQxNiByaWQsIHZvaWQgKmJ1ZiwgVUlOVDE2IGxlbikKK2ludCBoZmEzODR4X2RydnJfZ2V0Y29uZmlnKGhmYTM4NHhfdCAqaHcsIHUxNiByaWQsIHZvaWQgKmJ1ZiwgdTE2IGxlbikKIHsKIAlpbnQgCQkJcmVzdWx0OwogCURCRkVOVEVSOwpAQCAtMjcyNyw3ICsyNTAyLDcgQEAKIGludAogaGZhMzg0eF9kcnZyX2dldGNvbmZpZ19hc3luYygKICAgICAgICAgIGhmYTM4NHhfdCAgICAgICAgICAgICAgICpodywKLSAgICAgICAgIFVJTlQxNiAgICAgICAgICAgICAgICAgIHJpZCwKKyAgICAgICAgIHUxNiAgICAgICAgICAgICAgICAgIHJpZCwKICAgICAgICAgIGN0bHhfdXNlcmNiX3QgICAgICAgICAgIHVzZXJjYiwKICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICp1c2VyY2JfZGF0YSkKIHsKQEAgLTI3NjEsOSArMjUzNiw5IEBACiBpbnQKIGhmYTM4NHhfZHJ2cl9zZXRjb25maWdfYXN5bmMoCiAgICAgICAgICBoZmEzODR4X3QgICAgICAgKmh3LAotICAgICAgICAgVUlOVDE2ICAgICAgICAgIHJpZCwKKyAgICAgICAgIHUxNiAgICAgICAgICByaWQsCiAgICAgICAgICB2b2lkICAgICAgICAgICAgKmJ1ZiwKLSAgICAgICAgIFVJTlQxNiAgICAgICAgICBsZW4sCisgICAgICAgICB1MTYgICAgICAgICAgbGVuLAogICAgICAgICAgY3RseF91c2VyY2JfdCAgIHVzZXJjYiwKICAgICAgICAgIHZvaWQgICAgICAgICAgICAqdXNlcmNiX2RhdGEpCiB7CkBAIC0yNzkwLDcgKzI1NjUsNyBAQAogKiBDYWxsIGNvbnRleHQ6CiAqCXByb2Nlc3MKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IGhmYTM4NHhfZHJ2cl9oYW5kb3ZlciggaGZhMzg0eF90ICpodywgVUlOVDggKmFkZHIpCitpbnQgaGZhMzg0eF9kcnZyX2hhbmRvdmVyKCBoZmEzODR4X3QgKmh3LCB1OCAqYWRkcikKIHsKICAgICAgICAgREJGRU5URVI7CiAJV0xBTl9MT0dfRVJST1IoIk5vdCBjdXJyZW50bHkgc3VwcG9ydGVkIGluIFVTQiFcbiIpOwpAQCAtMjgyNCw4OCArMjU5OSw2IEBACiB9CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBoZmEzODR4X2RydnJfbW1pX3JlYWQKLSoKLSogUmVhZCBtbWkgcmVnaXN0ZXJzLiAgbW1pIGlzIGludGVyc2lsLXNwZWFrIGZvciB0aGUgYmFzZWJhbmQKLSogcHJvY2Vzc29yIHJlZ2lzdGVycy4KLSoKLSogQXJndW1lbnRzOgotKiAgICAgICBodyAgICAgICAgICAgICAgZGV2aWNlIHN0cnVjdHVyZQotKiAgICAgICByZWdpc3RlciAgICAgICAgVGhlIHRlc3QgcmVnaXN0ZXIgdG8gYmUgYWNjZXNzZWQgKG11c3QgYmUgZXZlbiAjKS4KLSoKLSogUmV0dXJuczoKLSogICAgICAgMCAgICAgICAgICAgICAgIHN1Y2Nlc3MKLSogICAgICAgPjAgICAgICAgICAgICAgIGYvdyByZXBvcnRlZCBlcnJvciAtIGYvdyBzdGF0dXMgY29kZQotKiAgICAgICA8MCAgICAgICAgICAgICAgZHJpdmVyIHJlcG9ydGVkIGVycm9yCi0qCi0qIFNpZGUgZWZmZWN0czoKLSoKLSogQ2FsbCBjb250ZXh0OgotKiAgICAgICBwcm9jZXNzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCBoZmEzODR4X2RydnJfbW1pX3JlYWQoaGZhMzg0eF90ICpodywgVUlOVDMyIGFkZHIsIFVJTlQzMiAqcmVzcCkKLXsKLSNpZiAwCi0gICAgICAgIGludCAgICAgICAgICAgICByZXN1bHQgPSAwOwotICAgICAgICBVSU5UMTYgIGNtZF9jb2RlID0gKFVJTlQxNikgMHgzMDsKLSAgICAgICAgVUlOVDE2IHBhcmFtID0gKFVJTlQxNikgYWRkcjsKLSAgICAgICAgREJGRU5URVI7Ci0KLSAgICAgICAgLyogRG8gaSBuZWVkIGEgaG9zdDJoZmEuLi4gY29udmVyc2lvbiA/ICovCi0gICAgICAgIHJlc3VsdCA9IGhmYTM4NHhfZG9jbWRfd2FpdChodywgY21kX2NvZGUpOwotCi0gICAgICAgIERCRkVYSVQ7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0jZW5kaWYKLXJldHVybiAwOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogaGZhMzg0eF9kcnZyX21taV93cml0ZQotKgotKiBSZWFkIG1taSByZWdpc3RlcnMuICBtbWkgaXMgaW50ZXJzaWwtc3BlYWsgZm9yIHRoZSBiYXNlYmFuZAotKiBwcm9jZXNzb3IgcmVnaXN0ZXJzLgotKgotKiBBcmd1bWVudHM6Ci0qICAgICAgIGh3ICAgICAgICAgICAgICBkZXZpY2Ugc3RydWN0dXJlCi0qICAgICAgIGFkZHIgICAgICAgICAgICBUaGUgdGVzdCByZWdpc3RlciB0byBiZSBhY2Nlc3NlZCAobXVzdCBiZSBldmVuICMpLgotKiAgICAgICBkYXRhICAgICAgICAgICAgVGhlIGRhdGEgdmFsdWUgdG8gd3JpdGUgdG8gdGhlIHJlZ2lzdGVyLgotKgotKiBSZXR1cm5zOgotKiAgICAgICAwICAgICAgICAgICAgICAgc3VjY2VzcwotKiAgICAgICA+MCAgICAgICAgICAgICAgZi93IHJlcG9ydGVkIGVycm9yIC0gZi93IHN0YXR1cyBjb2RlCi0qICAgICAgIDwwICAgICAgICAgICAgICBkcml2ZXIgcmVwb3J0ZWQgZXJyb3IKLSoKLSogU2lkZSBlZmZlY3RzOgotKgotKiBDYWxsIGNvbnRleHQ6Ci0qICAgICAgIHByb2Nlc3MKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1pbnQKLWhmYTM4NHhfZHJ2cl9tbWlfd3JpdGUoaGZhMzg0eF90ICpodywgVUlOVDMyIGFkZHIsIFVJTlQzMiBkYXRhKQotewotI2lmIDAKLSAgICAgICAgaW50ICAgICAgICAgICAgIHJlc3VsdCA9IDA7Ci0gICAgICAgIFVJTlQxNiAgY21kX2NvZGUgPSAoVUlOVDE2KSAweDMxOwotICAgICAgICBVSU5UMTYgcGFyYW0wID0gKFVJTlQxNikgYWRkcjsKLSAgICAgICAgVUlOVDE2IHBhcmFtMSA9IChVSU5UMTYpIGRhdGE7Ci0gICAgICAgIERCRkVOVEVSOwotCi0gICAgICAgIFdMQU5fTE9HX0RFQlVHKDEsIm1taSB3cml0ZSA6IGFkZHIgPSAweCUwOGx4XG4iLCBhZGRyKTsKLSAgICAgICAgV0xBTl9MT0dfREVCVUcoMSwibW1pIHdyaXRlIDogZGF0YSA9IDB4JTA4bHhcbiIsIGRhdGEpOwotCi0gICAgICAgIC8qIERvIGkgbmVlZCBhIGhvc3QyaGZhLi4uIGNvbnZlcnNpb24gPyAqLwotICAgICAgICByZXN1bHQgPSBoZmEzODR4X2RvY21kX3dhaXQoaHcsIGNtZF9jb2RlKTsKLQotICAgICAgICBEQkZFWElUOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotI2VuZGlmCi1yZXR1cm4gMDsKLX0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogaGZhMzg0eF9kcnZyX3JhbWRsX2Rpc2FibGUKICoKICogRW5kcyB0aGUgcmFtIGRvd25sb2FkIHN0YXRlLgpAQCAtMjk2OSwxMSArMjY2MiwxMSBAQAogKglwcm9jZXNzCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIGludAotaGZhMzg0eF9kcnZyX3JhbWRsX2VuYWJsZShoZmEzODR4X3QgKmh3LCBVSU5UMzIgZXhlYWRkcikKK2hmYTM4NHhfZHJ2cl9yYW1kbF9lbmFibGUoaGZhMzg0eF90ICpodywgdTMyIGV4ZWFkZHIpCiB7CiAJaW50CQlyZXN1bHQgPSAwOwotCVVJTlQxNgkJbG93YWRkcjsKLQlVSU5UMTYJCWhpYWRkcjsKKwl1MTYJCWxvd2FkZHI7CisJdTE2CQloaWFkZHI7CiAJaW50CQlpOwogCURCRkVOVEVSOwogCS8qIENoZWNrIHRoYXQgYSBwb3J0IGlzbid0IGFjdGl2ZSAqLwpAQCAtMzA0NCwxNiArMjczNywxNiBAQAogKglwcm9jZXNzCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIGludAotaGZhMzg0eF9kcnZyX3JhbWRsX3dyaXRlKGhmYTM4NHhfdCAqaHcsIFVJTlQzMiBkYWRkciwgdm9pZCogYnVmLCBVSU5UMzIgbGVuKQoraGZhMzg0eF9kcnZyX3JhbWRsX3dyaXRlKGhmYTM4NHhfdCAqaHcsIHUzMiBkYWRkciwgdm9pZCogYnVmLCB1MzIgbGVuKQogewogCWludAkJcmVzdWx0ID0gMDsKIAlpbnQJCW53cml0ZXM7Ci0JVUlOVDgJCSpkYXRhID0gYnVmOworCXU4CQkqZGF0YSA9IGJ1ZjsKIAlpbnQJCWk7Ci0JVUlOVDMyCQljdXJyYWRkcjsKLQlVSU5UMTYJCWN1cnJwYWdlOwotCVVJTlQxNgkJY3Vycm9mZnNldDsKLQlVSU5UMTYJCWN1cnJsZW47CisJdTMyCQljdXJyYWRkcjsKKwl1MTYJCWN1cnJwYWdlOworCXUxNgkJY3Vycm9mZnNldDsKKwl1MTYJCWN1cnJsZW47CiAJREJGRU5URVI7CiAJLyogQ2hlY2sgdGhhdCB3ZSdyZSBpbiB0aGUgcmFtIGRvd25sb2FkIHN0YXRlICovCiAJaWYgKCBody0+ZGxzdGF0ZSAhPSBIRkEzODR4X0RMU1RBVEVfUkFNRU5BQkxFRCApIHsKQEAgLTMxMjUsMjEgKzI4MTgsMjEgQEAKICogQ2FsbCBjb250ZXh0OgogKglwcm9jZXNzIG9yIG5vbi1jYXJkIGludGVycnVwdC4KIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IGhmYTM4NHhfZHJ2cl9yZWFkcGRhKGhmYTM4NHhfdCAqaHcsIHZvaWQgKmJ1ZiwgVUlOVCBsZW4pCitpbnQgaGZhMzg0eF9kcnZyX3JlYWRwZGEoaGZhMzg0eF90ICpodywgdm9pZCAqYnVmLCB1bnNpZ25lZCBpbnQgbGVuKQogewogCWludAkJcmVzdWx0ID0gMDsKLQlVSU5UMTYJCSpwZGEgPSBidWY7CisJdTE2CQkqcGRhID0gYnVmOwogCWludAkJcGRhb2sgPSAwOwogCWludAkJbW9yZXBkcnMgPSAxOwogCWludAkJY3VycnBkciA9IDA7CS8qIHdvcmQgb2Zmc2V0IG9mIHRoZSBjdXJyZW50IHBkciAqLwogCXNpemVfdAkJaTsKLQlVSU5UMTYJCXBkcmxlbjsJCS8qIHBkciBsZW5ndGggaW4gYnl0ZXMsIGhvc3Qgb3JkZXIgKi8KLQlVSU5UMTYJCXBkcmNvZGU7CS8qIHBkciBjb2RlLCBob3N0IG9yZGVyICovCi0JVUlOVDE2CQljdXJycGFnZTsKLQlVSU5UMTYJCWN1cnJvZmZzZXQ7CisJdTE2CQlwZHJsZW47CQkvKiBwZHIgbGVuZ3RoIGluIGJ5dGVzLCBob3N0IG9yZGVyICovCisJdTE2CQlwZHJjb2RlOwkvKiBwZHIgY29kZSwgaG9zdCBvcmRlciAqLworCXUxNgkJY3VycnBhZ2U7CisJdTE2CQljdXJyb2Zmc2V0OwogCXN0cnVjdCBwZGFsb2MgewotCQlVSU5UMzIJY2FyZGFkZHI7Ci0JCVVJTlQxNglhdXhjdGw7CisJCXUzMgljYXJkYWRkcjsKKwkJdTE2CWF1eGN0bDsKIAl9IHBkYWxvY1tdID0KIAl7CiAJCXsgSEZBMzg0Ml9QREFfQkFTRSwJCTB9LApAQCAtMzI0Myw3ICsyOTM2LDcgQEAKICogQ2FsbCBjb250ZXh0OgogKglwcm9jZXNzCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCBoZmEzODR4X2RydnJfc2V0Y29uZmlnKGhmYTM4NHhfdCAqaHcsIFVJTlQxNiByaWQsIHZvaWQgKmJ1ZiwgVUlOVDE2IGxlbikKK2ludCBoZmEzODR4X2RydnJfc2V0Y29uZmlnKGhmYTM4NHhfdCAqaHcsIHUxNiByaWQsIHZvaWQgKmJ1ZiwgdTE2IGxlbikKIHsKIAlyZXR1cm4gaGZhMzg0eF9kb3dyaWRfd2FpdChodywgcmlkLCBidWYsIGxlbik7CiB9CkBAIC0zMjY3LDE5ICsyOTYwLDM4IEBACiAqIENhbGwgY29udGV4dDoKICoJcHJvY2VzcwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKIGludCBoZmEzODR4X2RydnJfc3RhcnQoaGZhMzg0eF90ICpodykKIHsKLQlpbnQJCXJlc3VsdDsKKwlpbnQJCXJlc3VsdCwgcmVzdWx0MSwgcmVzdWx0MjsKKwl1MTYJCXN0YXR1czsKIAlEQkZFTlRFUjsKIAogCW1pZ2h0X3NsZWVwKCk7CiAKLQlpZiAodXNiX2NsZWFyX2hhbHQoaHctPnVzYiwgaHctPmVuZHBfaW4pKSB7CisJLyogQ2xlYXIgZW5kcG9pbnQgc3RhbGxzIC0gYnV0IG9ubHkgZG8gdGhpcyBpZiB0aGUgZW5kcG9pbnQKKwkgKiBpcyBzaG93aW5nIGEgc3RhbGwgc3RhdHVzLiBTb21lIHByaXNtMiBjYXJkcyBzZWVtIHRvIGJlaGF2ZQorCSAqIGJhZGx5IGlmIGEgY2xlYXJfaGFsdCBpcyBjYWxsZWQgd2hlbiB0aGUgZW5kcG9pbnQgaXMgYWxyZWFkeQorCSAqIG9rCisJICovCisJcmVzdWx0ID0gdXNiX2dldF9zdGF0dXMoaHctPnVzYiwgVVNCX1JFQ0lQX0VORFBPSU5ULCBody0+ZW5kcF9pbiwgJnN0YXR1cyk7CisJaWYgKHJlc3VsdCA8IDApIHsKKwkJV0xBTl9MT0dfRVJST1IoCisJCQkiQ2Fubm90IGdldCBidWxrIGluIGVuZHBvaW50IHN0YXR1cy5cbiIpOworCQlnb3RvIGRvbmU7CisJfQorCWlmICgoc3RhdHVzID09IDEpICYmIHVzYl9jbGVhcl9oYWx0KGh3LT51c2IsIGh3LT5lbmRwX2luKSkgewogCQlXTEFOX0xPR19FUlJPUigKIAkJCSJGYWlsZWQgdG8gcmVzZXQgYnVsayBpbiBlbmRwb2ludC5cbiIpOwogCX0KIAotCWlmICh1c2JfY2xlYXJfaGFsdChody0+dXNiLCBody0+ZW5kcF9vdXQpKSB7CisJcmVzdWx0ID0gdXNiX2dldF9zdGF0dXMoaHctPnVzYiwgVVNCX1JFQ0lQX0VORFBPSU5ULCBody0+ZW5kcF9vdXQsICZzdGF0dXMpOworCWlmIChyZXN1bHQgPCAwKSB7CisJCVdMQU5fTE9HX0VSUk9SKAorCQkJIkNhbm5vdCBnZXQgYnVsayBvdXQgZW5kcG9pbnQgc3RhdHVzLlxuIik7CisJCWdvdG8gZG9uZTsKKwl9CisJaWYgKChzdGF0dXMgPT0gMSkgJiYgdXNiX2NsZWFyX2hhbHQoaHctPnVzYiwgaHctPmVuZHBfb3V0KSkgewogCQlXTEFOX0xPR19FUlJPUigKIAkJCSJGYWlsZWQgdG8gcmVzZXQgYnVsayBvdXQgZW5kcG9pbnQuXG4iKTsKIAl9CkBAIC0zMjk2LDE0ICszMDA4LDM3IEBACiAJCWdvdG8gZG9uZTsKIAl9CiAKLQkvKiBjYWxsIGluaXRpYWxpemUgKi8KLQlyZXN1bHQgPSBoZmEzODR4X2NtZF9pbml0aWFsaXplKGh3KTsKLQlpZiAocmVzdWx0ICE9IDApIHsKLQkJdXNiX2tpbGxfdXJiKCZody0+cnhfdXJiKTsKLQkJV0xBTl9MT0dfRVJST1IoCi0JCQkiY21kX2luaXRpYWxpemUoKSBmYWlsZWQsIHJlc3VsdD0lZFxuIiwKLQkJCXJlc3VsdCk7Ci0JCWdvdG8gZG9uZTsKKwkvKiBDYWxsIGluaXRpYWxpemUgdHdpY2UsIHdpdGggYSAxIHNlY29uZCBzbGVlcCBpbiBiZXR3ZWVuLgorCSAqIFRoaXMgaXMgYSBuYXN0eSB3b3JrLWFyb3VuZCBzaW5jZSBtYW55IHByaXNtMiBjYXJkcyBzZWVtIHRvCisJICogbmVlZCB0aW1lIHRvIHNldHRsZSBhZnRlciBhbiBpbml0IGZyb20gY29sZC4gVGhlIHNlY29uZAorCSAqIGNhbGwgdG8gaW5pdGlhbGl6ZSBpbiB0aGVvcnkgaXMgbm90IG5lY2Vzc2FyeSAtIGJ1dCB3ZSBjYWxsCisJICogaXQgYW55d2F5IGFzIGEgZG91YmxlIGluc3VyYW5jZSBwb2xpY3k6CisJICogMSkgSWYgdGhlIGZpcnN0IGluaXQgc2hvdWxkIGZhaWwsIHRoZSBzZWNvbmQgbWF5IHdlbGwgc3VjY2VlZAorCSAqICAgIGFuZCB0aGUgY2FyZCBjYW4gc3RpbGwgYmUgdXNlZAorCSAqIDIpIEl0IGhlbHBzIGVuc3VyZXMgYWxsIGlzIHdlbGwgd2l0aCB0aGUgY2FyZCBhZnRlciB0aGUgZmlyc3QKKwkgKiAgICBpbml0IGFuZCBzZXR0bGUgdGltZS4KKwkgKi8KKwlyZXN1bHQxID0gaGZhMzg0eF9jbWRfaW5pdGlhbGl6ZShodyk7CisJbXNsZWVwKDEwMDApOworCXJlc3VsdCA9IHJlc3VsdDIgPSBoZmEzODR4X2NtZF9pbml0aWFsaXplKGh3KTsKKwlpZiAocmVzdWx0MSAhPSAwKSB7CisJCWlmIChyZXN1bHQyICE9IDApIHsKKwkJCVdMQU5fTE9HX0VSUk9SKAorCQkJCSJjbWRfaW5pdGlhbGl6ZSgpIGZhaWxlZCBvbiB0d28gYXR0ZW1wdHMsIHJlc3VsdHMgJWQgYW5kICVkXG4iLAorCQkJCXJlc3VsdDEsIHJlc3VsdDIpOworCQkJdXNiX2tpbGxfdXJiKCZody0+cnhfdXJiKTsKKwkJCWdvdG8gZG9uZTsKKwkJfSBlbHNlIHsKKwkJCVdMQU5fTE9HX0RFQlVHKDAsICJGaXJzdCBjbWRfaW5pdGlhbGl6ZSgpIGZhaWxlZCAocmVzdWx0ICVkKSxcbiIsCisJCQkJcmVzdWx0MSk7CisJCQlXTEFOX0xPR19ERUJVRygwLCAiYnV0IHNlY29uZCBhdHRlbXB0IHN1Y2NlZWRlZC4gQWxsIHNob3VsZCBiZSBva1xuIik7CisJCX0KKwl9IGVsc2UgaWYgKHJlc3VsdDIgIT0gMCkgeworCQlXTEFOX0xPR19XQVJOSU5HKAorCQkJIkZpcnN0IGNtZF9pbml0aWFsaXplKCkgc3VjY2VlZGVkLCBidXQgc2Vjb25kIGF0dGVtcHQgZmFpbGVkIChyZXN1bHQ9JWQpXG4iLAorCQkJcmVzdWx0Mik7CisJCVdMQU5fTE9HX1dBUk5JTkcoIk1vc3QgbGlrZWx5IHRoZSBjYXJkIHdpbGwgYmUgZnVuY3Rpb25hbFxuIik7CisJCQlnb3RvIGRvbmU7CiAJfQogCiAJaHctPnN0YXRlID0gSEZBMzg0eF9TVEFURV9SVU5OSU5HOwpAQCAtMzg0OSwxMSArMzU4NCw3IEBACiAqIENhbGwgY29udGV4dDoKICoJaW50ZXJydXB0CiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNpZmRlZiBVUkJfT05MWV9DQUxMQkFDSwogc3RhdGljIHZvaWQgaGZhMzg0eF91c2Jpbl9jYWxsYmFjayhzdHJ1Y3QgdXJiICp1cmIpCi0jZWxzZQotc3RhdGljIHZvaWQgaGZhMzg0eF91c2Jpbl9jYWxsYmFjayhzdHJ1Y3QgdXJiICp1cmIsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQotI2VuZGlmCiB7CiAJd2xhbmRldmljZV90CQkqd2xhbmRldiA9IHVyYi0+Y29udGV4dDsKIAloZmEzODR4X3QJCSpodzsKQEAgLTM4NjEsNyArMzU5Miw3IEBACiAJc3RydWN0IHNrX2J1ZmYgICAgICAgICAgKnNrYiA9IE5VTEw7CiAJaW50CQkJcmVzdWx0OwogCWludCAgICAgICAgICAgICAgICAgICAgIHVyYl9zdGF0dXM7Ci0JVUlOVDE2CQkJdHlwZTsKKwl1MTYJCQl0eXBlOwogCiAJZW51bSBVU0JJTl9BQ1RJT04gewogCQlIQU5ETEUsCkBAIC0zODczLDcgKzM2MDQsNyBAQAogCiAJaWYgKCAhd2xhbmRldiB8fAogCSAgICAgIXdsYW5kZXYtPm5ldGRldiB8fAotCSAgICAgIW5ldGlmX2RldmljZV9wcmVzZW50KHdsYW5kZXYtPm5ldGRldikgKQorCSAgICAgd2xhbmRldi0+aHdyZW1vdmVkICkKIAkJZ290byBleGl0OwogCiAJaHcgPSB3bGFuZGV2LT5wcml2OwpAQCAtNDA4OCw3ICszODE5LDcgQEAKIAkJaWYgKHVubG9ja2VkX3VzYmN0bHhfY2FuY2VsX2FzeW5jKGh3LCBjdGx4KSA9PSAwKQogCQkJcnVuX3F1ZXVlID0gMTsKIAl9IGVsc2UgewotCQljb25zdCBVSU5UMTYgaW50eXBlID0gKHVzYmluLT50eXBlJn5ob3N0MmhmYTM4NHhfMTYoMHg4MDAwKSk7CisJCWNvbnN0IHUxNiBpbnR5cGUgPSAodXNiaW4tPnR5cGUmfmhvc3QyaGZhMzg0eF8xNigweDgwMDApKTsKIAogCQkvKgogCQkgKiBDaGVjayB0aGF0IG91ciBtZXNzYWdlIGlzIHdoYXQgd2UncmUgZXhwZWN0aW5nIC4uLgpAQCAtNDE2OCw3ICszODk5LDcgQEAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogc3RhdGljIHZvaWQgaGZhMzg0eF91c2Jpbl90eGNvbXBsKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgaGZhMzg0eF91c2Jpbl90ICp1c2JpbikKIHsKLQlVSU5UMTYJCQlzdGF0dXM7CisJdTE2CQkJc3RhdHVzOwogCURCRkVOVEVSOwogCiAJc3RhdHVzID0gaGZhMzg0eDJob3N0XzE2KHVzYmluLT50eXBlKTsgLyogeWVhaCBJIGtub3cgaXQgc2F5cyB0eXBlLi4uKi8KQEAgLTQyMDgsOCArMzkzOSw4IEBACiAJaGZhMzg0eF90ICAgICAgICAgICAgICAgKmh3ID0gd2xhbmRldi0+cHJpdjsKIAlpbnQgICAgICAgICAgICAgICAgICAgICBoZHJsZW47CiAJcDgwMjExX3J4bWV0YV90ICAgICAgICAgKnJ4bWV0YTsKLQlVSU5UMTYgICAgICAgICAgICAgICAgICBkYXRhX2xlbjsKLQlVSU5UMTYgICAgICAgICAgICAgICAgICBmYzsKKwl1MTYgICAgICAgICAgICAgICAgICBkYXRhX2xlbjsKKwl1MTYgICAgICAgICAgICAgICAgICBmYzsKIAogCURCRkVOVEVSOwogCkBAIC00MzE1LDEyICs0MDQ2LDExIEBACiBzdGF0aWMgdm9pZCBoZmEzODR4X2ludF9yeG1vbml0b3IoIHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgaGZhMzg0eF91c2Jfcnhmcm1fdCAqcnhmcm0pCiB7CiAJaGZhMzg0eF9yeF9mcmFtZV90ICAgICAgICAgICAgICAqcnhkZXNjID0gJihyeGZybS0+ZGVzYyk7Ci0JVUlOVAkJCQloZHJsZW4gPSAwOwotCVVJTlQJCQkJZGF0YWxlbiA9IDA7Ci0JVUlOVAkJCQlza2JsZW4gPSAwOwotCXA4MDIxMW1zZ19sbnhpbmRfd2xhbnNuaWZmcm1fdAkqbXNnOwotCVVJTlQ4CQkJCSpkYXRhcDsKLQlVSU5UMTYJCQkJZmM7CisJdW5zaWduZWQgaW50CQkJCWhkcmxlbiA9IDA7CisJdW5zaWduZWQgaW50CQkJCWRhdGFsZW4gPSAwOworCXVuc2lnbmVkIGludAkJCQlza2JsZW4gPSAwOworCXU4CQkJCSpkYXRhcDsKKwl1MTYJCQkJZmM7CiAJc3RydWN0IHNrX2J1ZmYJCQkqc2tiOwogCWhmYTM4NHhfdAkJICAgICAgICAqaHcgPSB3bGFuZGV2LT5wcml2OwogCkBAIC00MzMzLDE1ICs0MDYzLDE1IEBACiAJZGF0YWxlbiA9IGhmYTM4NHgyaG9zdF8xNihyeGRlc2MtPmRhdGFfbGVuKTsKIAogCS8qIEFsbG9jYXRlIGFuIGluZCBtZXNzYWdlK2ZyYW1lc2l6ZSBza2IgKi8KLQlza2JsZW4gPSBzaXplb2YocDgwMjExbXNnX2xueGluZF93bGFuc25pZmZybV90KSArCisJc2tibGVuID0gc2l6ZW9mKHA4MDIxMV9jYXBoZHJfdCkgKwogCQloZHJsZW4gKyBkYXRhbGVuICsgV0xBTl9DUkNfTEVOOwogCiAJLyogc2FuaXR5IGNoZWNrIHRoZSBsZW5ndGggKi8KIAlpZiAoIHNrYmxlbiA+Ci0JCShzaXplb2YocDgwMjExbXNnX2xueGluZF93bGFuc25pZmZybV90KSArCi0JCVdMQU5fSERSX0E0X0xFTiArIFdMQU5fREFUQV9NQVhMRU4gKyBXTEFOX0NSQ19MRU4pICkgeworCSAgICAgKHNpemVvZihwODAyMTFfY2FwaGRyX3QpICsKKwkgICAgICBXTEFOX0hEUl9BNF9MRU4gKyBXTEFOX0RBVEFfTUFYTEVOICsgV0xBTl9DUkNfTEVOKSApIHsKIAkJV0xBTl9MT0dfREVCVUcoMSwgIm92ZXJsZW4gZnJtOiBsZW49JXpkXG4iLAotCQkJc2tibGVuIC0gc2l6ZW9mKHA4MDIxMW1zZ19sbnhpbmRfd2xhbnNuaWZmcm1fdCkpOworCQkJICAgICAgIHNrYmxlbiAtIHNpemVvZihwODAyMTFfY2FwaGRyX3QpKTsKIAl9CiAKIAlpZiAoIChza2IgPSBkZXZfYWxsb2Nfc2tiKHNrYmxlbikpID09IE5VTEwgKSB7CkBAIC00MzUxLDY2ICs0MDgxLDcgQEAKIAogCS8qIG9ubHkgcHJlcGVuZCB0aGUgcHJpc20gaGVhZGVyIGlmIGluIHRoZSByaWdodCBtb2RlICovCiAJaWYgKCh3bGFuZGV2LT5uZXRkZXYtPnR5cGUgPT0gQVJQSFJEX0lFRUU4MDIxMV9QUklTTSkgJiYKLQkgICAgKGh3LT5zbmlmZmhkciA9PSAwKSkgewotCQlkYXRhcCA9IHNrYl9wdXQoc2tiLCBzaXplb2YocDgwMjExbXNnX2xueGluZF93bGFuc25pZmZybV90KSk7Ci0JCW1zZyA9IChwODAyMTFtc2dfbG54aW5kX3dsYW5zbmlmZnJtX3QqKSBkYXRhcDsKLQotCQkvKiBJbml0aWFsaXplIHRoZSBtZXNzYWdlIG1lbWJlcnMgKi8KLQkJbXNnLT5tc2djb2RlID0gRElEbXNnX2xueGluZF93bGFuc25pZmZybTsKLQkJbXNnLT5tc2dsZW4gPSBzaXplb2YocDgwMjExbXNnX2xueGluZF93bGFuc25pZmZybV90KTsKLQkJc3RyY3B5KG1zZy0+ZGV2bmFtZSwgd2xhbmRldi0+bmFtZSk7Ci0KLQkJbXNnLT5ob3N0dGltZS5kaWQgPSBESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX2hvc3R0aW1lOwotCQltc2ctPmhvc3R0aW1lLnN0YXR1cyA9IDA7Ci0JCW1zZy0+aG9zdHRpbWUubGVuID0gNDsKLQkJbXNnLT5ob3N0dGltZS5kYXRhID0gamlmZmllczsKLQotCQltc2ctPm1hY3RpbWUuZGlkID0gRElEbXNnX2xueGluZF93bGFuc25pZmZybV9tYWN0aW1lOwotCQltc2ctPm1hY3RpbWUuc3RhdHVzID0gMDsKLQkJbXNnLT5tYWN0aW1lLmxlbiA9IDQ7Ci0JCW1zZy0+bWFjdGltZS5kYXRhID0gcnhkZXNjLT50aW1lOwotCi0JCW1zZy0+Y2hhbm5lbC5kaWQgPSBESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX2NoYW5uZWw7Ci0JCW1zZy0+Y2hhbm5lbC5zdGF0dXMgPSAwOwotCQltc2ctPmNoYW5uZWwubGVuID0gNDsKLQkJbXNnLT5jaGFubmVsLmRhdGEgPSBody0+c25pZmZfY2hhbm5lbDsKLQotCQltc2ctPnJzc2kuZGlkID0gRElEbXNnX2xueGluZF93bGFuc25pZmZybV9yc3NpOwotCQltc2ctPnJzc2kuc3RhdHVzID0gUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19ub192YWx1ZTsKLQkJbXNnLT5yc3NpLmxlbiA9IDQ7Ci0JCW1zZy0+cnNzaS5kYXRhID0gMDsKLQotCQltc2ctPnNxLmRpZCA9IERJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm1fc3E7Ci0JCW1zZy0+c3Euc3RhdHVzID0gUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19ub192YWx1ZTsKLQkJbXNnLT5zcS5sZW4gPSA0OwotCQltc2ctPnNxLmRhdGEgPSAwOwotCi0JCW1zZy0+c2lnbmFsLmRpZCA9IERJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm1fc2lnbmFsOwotCQltc2ctPnNpZ25hbC5zdGF0dXMgPSAwOwotCQltc2ctPnNpZ25hbC5sZW4gPSA0OwotCQltc2ctPnNpZ25hbC5kYXRhID0gcnhkZXNjLT5zaWduYWw7Ci0KLQkJbXNnLT5ub2lzZS5kaWQgPSBESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX25vaXNlOwotCQltc2ctPm5vaXNlLnN0YXR1cyA9IDA7Ci0JCW1zZy0+bm9pc2UubGVuID0gNDsKLQkJbXNnLT5ub2lzZS5kYXRhID0gcnhkZXNjLT5zaWxlbmNlOwotCi0JCW1zZy0+cmF0ZS5kaWQgPSBESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX3JhdGU7Ci0JCW1zZy0+cmF0ZS5zdGF0dXMgPSAwOwotCQltc2ctPnJhdGUubGVuID0gNDsKLQkJbXNnLT5yYXRlLmRhdGEgPSByeGRlc2MtPnJhdGUgLyA1OyAvKiBzZXQgdG8gODAyLjExIHVuaXRzICovCi0KLQkJbXNnLT5pc3R4LmRpZCA9IERJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm1faXN0eDsKLQkJbXNnLT5pc3R4LnN0YXR1cyA9IDA7Ci0JCW1zZy0+aXN0eC5sZW4gPSA0OwotCQltc2ctPmlzdHguZGF0YSA9IFA4MDIxMUVOVU1fdHJ1dGhfZmFsc2U7Ci0KLQkJbXNnLT5mcm1sZW4uZGlkID0gRElEbXNnX2xueGluZF93bGFuc25pZmZybV9mcm1sZW47Ci0JCW1zZy0+ZnJtbGVuLnN0YXR1cyA9IDA7Ci0JCW1zZy0+ZnJtbGVuLmxlbiA9IDQ7Ci0JCW1zZy0+ZnJtbGVuLmRhdGEgPSBoZHJsZW4gKyBkYXRhbGVuICsgV0xBTl9DUkNfTEVOOwotCX0gZWxzZSBpZiAoKHdsYW5kZXYtPm5ldGRldi0+dHlwZSA9PSBBUlBIUkRfSUVFRTgwMjExX1BSSVNNKSAmJgotCQkgICAoaHctPnNuaWZmaGRyICE9IDApKSB7CisJICAgIChody0+c25pZmZoZHIgIT0gMCkpIHsKIAkJcDgwMjExX2NhcGhkcl90CQkqY2FwaGRyOwogCQkvKiBUaGUgTkVXIGhlYWRlciBmb3JtYXQhICovCiAJCWRhdGFwID0gc2tiX3B1dChza2IsIHNpemVvZihwODAyMTFfY2FwaGRyX3QpKTsKQEAgLTQ1MDgsMTEgKzQxNzksNyBAQAogKiBDYWxsIGNvbnRleHQ6CiAqCWludGVycnVwdAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jaWZkZWYgVVJCX09OTFlfQ0FMTEJBQ0sKIHN0YXRpYyB2b2lkIGhmYTM4NHhfdXNib3V0X2NhbGxiYWNrKHN0cnVjdCB1cmIgKnVyYikKLSNlbHNlCi1zdGF0aWMgdm9pZCBoZmEzODR4X3VzYm91dF9jYWxsYmFjayhzdHJ1Y3QgdXJiICp1cmIsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQotI2VuZGlmCiB7CiAJd2xhbmRldmljZV90CQkqd2xhbmRldiA9IHVyYi0+Y29udGV4dDsKIAloZmEzODR4X3VzYm91dF90CSp1c2JvdXQgPSB1cmItPnRyYW5zZmVyX2J1ZmZlcjsKQEAgLTQ1ODksMTEgKzQyNTYsNyBAQAogKiBDYWxsIGNvbnRleHQ6CiAqIGludGVycnVwdAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jaWZkZWYgVVJCX09OTFlfQ0FMTEJBQ0sKIHN0YXRpYyB2b2lkIGhmYTM4NHhfY3RseG91dF9jYWxsYmFjayhzdHJ1Y3QgdXJiICp1cmIpCi0jZWxzZQotc3RhdGljIHZvaWQgaGZhMzg0eF9jdGx4b3V0X2NhbGxiYWNrKHN0cnVjdCB1cmIgKnVyYiwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCi0jZW5kaWYKIHsKIAloZmEzODR4X3QJKmh3ID0gdXJiLT5jb250ZXh0OwogCWludCAgICAgICAgICAgICBkZWxldGVfcmVzcHRpbWVyID0gMDsKQEAgLTQ5NjksNyArNDYzMiw3IEBACiAqIENhbGwgY29udGV4dDoKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogc3RhdGljIGludAotaGZhMzg0eF9pc2dvb2RfcGRyY29kZShVSU5UMTYgcGRyY29kZSkKK2hmYTM4NHhfaXNnb29kX3BkcmNvZGUodTE2IHBkcmNvZGUpCiB7CiAJc3dpdGNoKHBkcmNvZGUpIHsKIAljYXNlIEhGQTM4NHhfUERSX0VORF9PRl9QREE6CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFjb252LmMgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFjb252LmMKaW5kZXggNjgxMjFiOS4uZGZjN2IzYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExY29udi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMWNvbnYuYwpAQCAtNTIsMTAgKzUyLDYgQEAKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAvKiBTeXN0ZW0gSW5jbHVkZXMgKi8KIAotI2RlZmluZSBfX05PX1ZFUlNJT05fXwkJLyogcHJldmVudCB0aGUgc3RhdGljIGRlZmluaXRpb24gKi8KLQotCi0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CkBAIC03MCw3ICs2Niw2IEBACiAKICNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CiAKLSNpbmNsdWRlICJ2ZXJzaW9uLmgiCiAjaW5jbHVkZSAid2xhbl9jb21wYXQuaCIKIAogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KQEAgLTEwMCw4ICs5NSw4IEBACiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogLyogTG9jYWwgU3RhdGljIERlZmluaXRpb25zICovCiAKLXN0YXRpYyBVSU5UOAlvdWlfcmZjMTA0MltdID0gezB4MDAsIDB4MDAsIDB4MDB9Owotc3RhdGljIFVJTlQ4CW91aV84MDIxaFtdID0gezB4MDAsIDB4MDAsIDB4Zjh9Oworc3RhdGljIHU4CW91aV9yZmMxMDQyW10gPSB7MHgwMCwgMHgwMCwgMHgwMH07CitzdGF0aWMgdTgJb3VpXzgwMjFoW10gPSB7MHgwMCwgMHgwMCwgMHhmOH07CiAKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAvKiBMb2NhbCBGdW5jdGlvbiBEZWNsYXJhdGlvbnMgKi8KQEAgLTEzNSwxMSArMTMwLDExIEBACiAqIENhbGwgY29udGV4dDoKICoJTWF5IGJlIGNhbGxlZCBpbiBpbnRlcnJ1cHQgb3Igbm9uLWludGVycnVwdCBjb250ZXh0CiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCBza2JfZXRoZXJfdG9fcDgwMjExKCB3bGFuZGV2aWNlX3QgKndsYW5kZXYsIFVJTlQzMiBldGhjb252LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBwODAyMTFfaGRyX3QgKnA4MDIxMV9oZHIsIHA4MDIxMV9tZXRhd2VwX3QgKnA4MDIxMV93ZXApCitpbnQgc2tiX2V0aGVyX3RvX3A4MDIxMSggd2xhbmRldmljZV90ICp3bGFuZGV2LCB1MzIgZXRoY29udiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwgcDgwMjExX2hkcl90ICpwODAyMTFfaGRyLCBwODAyMTFfbWV0YXdlcF90ICpwODAyMTFfd2VwKQogewogCi0JVUlOVDE2ICAgICAgICAgIGZjOwotCVVJTlQxNiAgICAgICAgICBwcm90bzsKKwl1MTYgICAgICAgICAgZmM7CisJdTE2ICAgICAgICAgIHByb3RvOwogCXdsYW5fZXRoaGRyX3QgICBlX2hkcjsKIAl3bGFuX2xsY190ICAgICAgKmVfbGxjOwogCXdsYW5fc25hcF90ICAgICAqZV9zbmFwOwpAQCAtMjk4LDE0ICsyOTMsMTQgQEAKICogQ2FsbCBjb250ZXh0OgogKglNYXkgYmUgY2FsbGVkIGluIGludGVycnVwdCBvciBub24taW50ZXJydXB0IGNvbnRleHQKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IHNrYl9wODAyMTFfdG9fZXRoZXIoIHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgVUlOVDMyIGV0aGNvbnYsIHN0cnVjdCBza19idWZmICpza2IpCitpbnQgc2tiX3A4MDIxMV90b19ldGhlciggd2xhbmRldmljZV90ICp3bGFuZGV2LCB1MzIgZXRoY29udiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAluZXRkZXZpY2VfdCAgICAgKm5ldGRldiA9IHdsYW5kZXYtPm5ldGRldjsKLQlVSU5UMTYgICAgICAgICAgZmM7Ci0JVUlOVCAgICAgICAgICAgIHBheWxvYWRfbGVuZ3RoOwotCVVJTlQgICAgICAgICAgICBwYXlsb2FkX29mZnNldDsKLQlVSU5UOAkJZGFkZHJbV0xBTl9FVEhBRERSX0xFTl07Ci0JVUlOVDgJCXNhZGRyW1dMQU5fRVRIQUREUl9MRU5dOworCXUxNiAgICAgICAgICBmYzsKKwl1bnNpZ25lZCBpbnQgICAgICAgICAgICBwYXlsb2FkX2xlbmd0aDsKKwl1bnNpZ25lZCBpbnQgICAgICAgICAgICBwYXlsb2FkX29mZnNldDsKKwl1OAkJZGFkZHJbV0xBTl9FVEhBRERSX0xFTl07CisJdTgJCXNhZGRyW1dMQU5fRVRIQUREUl9MRU5dOwogCXA4MDIxMV9oZHJfdCAgICAqd19oZHI7CiAJd2xhbl9ldGhoZHJfdCAgICplX2hkcjsKIAl3bGFuX2xsY190ICAgICAgKmVfbGxjOwpAQCAtMzMzLDExICszMjgsMTEgQEAKIAkJbWVtY3B5KHNhZGRyLCB3X2hkci0+YTMuYTIsIFdMQU5fRVRIQUREUl9MRU4pOwogCX0gZWxzZSB7CiAJCXBheWxvYWRfb2Zmc2V0ID0gV0xBTl9IRFJfQTRfTEVOOwotCQlwYXlsb2FkX2xlbmd0aCAtPSAoIFdMQU5fSERSX0E0X0xFTiAtIFdMQU5fSERSX0EzX0xFTiApOwotCQlpZiAocGF5bG9hZF9sZW5ndGggPCAwICkgeworCQlpZiAocGF5bG9hZF9sZW5ndGggPCBXTEFOX0hEUl9BNF9MRU4gLSBXTEFOX0hEUl9BM19MRU4pIHsKIAkJCVdMQU5fTE9HX0VSUk9SKCJBNCBmcmFtZSB0b28gc2hvcnQhXG4iKTsKIAkJCXJldHVybiAxOwogCQl9CisJCXBheWxvYWRfbGVuZ3RoIC09IChXTEFOX0hEUl9BNF9MRU4gLSBXTEFOX0hEUl9BM19MRU4pOwogCQltZW1jcHkoZGFkZHIsIHdfaGRyLT5hNC5hMywgV0xBTl9FVEhBRERSX0xFTik7CiAJCW1lbWNweShzYWRkciwgd19oZHItPmE0LmE0LCBXTEFOX0VUSEFERFJfTEVOKTsKIAl9CkBAIC00OTcsOCArNDkyLDE2IEBACiAKIAl9CiAKKyAgICAgICAgLyoKKyAgICAgICAgICogTm90ZSB0aGF0IGV0aF90eXBlX3RyYW5zKCkgZXhwZWN0cyBhbiBza2Igdy8gc2tiLT5kYXRhIHBvaW50aW5nCisgICAgICAgICAqIGF0IHRoZSBNQUMgaGVhZGVyLCBpdCB0aGVuIHNldHMgdGhlIGZvbGxvd2luZyBza2IgbWVtYmVyczoKKyAgICAgICAgICogc2tiLT5tYWNfaGVhZGVyLAorICAgICAgICAgKiBza2ItPmRhdGEsIGFuZAorICAgICAgICAgKiBza2ItPnBrdF90eXBlLgorICAgICAgICAgKiBJdCB0aGVuIF9yZXR1cm5zXyB0aGUgdmFsdWUgdGhhdCBfd2UncmVfIHN1cHBvc2VkIHRvIHN0dWZmIGluCisgICAgICAgICAqIHNrYi0+cHJvdG9jb2wuICBUaGlzIGlzIG51dHMuCisgICAgICAgICAqLwogCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIG5ldGRldik7Ci0Jc2tiX3Jlc2V0X21hY19oZWFkZXIoc2tiKTsKIAogICAgICAgICAvKiBqa3JpZWdsOiBwcm9jZXNzIHNpZ25hbCBhbmQgbm9pc2UgYXMgc2V0IGluIGhmYTM4NHhfaW50X3J4KCkgKi8KIAkvKiBqa3JpZWdsOiBvbmx5IHByb2Nlc3Mgc2lnbmFsL25vaXNlIGlmIHJlcXVlc3RlZCBieSBpd3NweSAqLwpAQCAtNTI4LDcgKzUzMSw3IEBACiAqIENhbGwgY29udGV4dDoKICoJTWF5IGJlIGNhbGxlZCBpbiBpbnRlcnJ1cHQgb3Igbm9uLWludGVycnVwdCBjb250ZXh0CiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCBwODAyMTFfc3R0X2ZpbmRwcm90byhVSU5UMTYgcHJvdG8pCitpbnQgcDgwMjExX3N0dF9maW5kcHJvdG8odTE2IHByb3RvKQogewogCS8qIEFsd2F5cyByZXR1cm4gZm91bmQgZm9yIG5vdy4gIFRoaXMgaXMgdGhlIGJlaGF2aW9yIHVzZWQgYnkgdGhlICovCiAJLyogIFpvb20gV2luOTUgZHJpdmVyIHdoZW4gODAyLjFoIG1vZGUgaXMgc2VsZWN0ZWQgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMWNvbnYuaCBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMWNvbnYuaAppbmRleCAzZjVhYjU3Yy4uNTM4ZTliZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExY29udi5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMWNvbnYuaApAQCAtODYsMjIgKzg2LDIyIEBACiB7CiAJc3RydWN0IHdsYW5kZXZpY2UJKndsYW5kZXY7CiAKLQlVSU5UNjQJbWFjdGltZTsJLyogSGktcmV6IE1BQy1zdXBwbGllZCB0aW1lIHZhbHVlICovCi0JVUlOVDY0CWhvc3R0aW1lOwkvKiBCZXN0LXJleiBob3N0IHN1cHBsaWVkIHRpbWUgdmFsdWUgKi8KKwl1NjQJbWFjdGltZTsJLyogSGktcmV6IE1BQy1zdXBwbGllZCB0aW1lIHZhbHVlICovCisJdTY0CWhvc3R0aW1lOwkvKiBCZXN0LXJleiBob3N0IHN1cHBsaWVkIHRpbWUgdmFsdWUgKi8KIAotCVVJTlQJcnhyYXRlOwkJLyogUmVjZWl2ZSBkYXRhIHJhdGUgaW4gMTAwa2JwcyAqLwotCVVJTlQJcHJpb3JpdHk7CS8qIDAtMTUsIDA9Y29udGVudGlvbiwgNj1DRiAqLwotCUlOVAlzaWduYWw7CQkvKiBBbiBTU0ksIHNlZSBwODAyMTFuZXRkZXYuaCAqLwotCUlOVAlub2lzZTsJCS8qIEFuIFNTSSwgc2VlIHA4MDIxMW5ldGRldi5oICovCi0JVUlOVAljaGFubmVsOwkvKiBSZWNlaXZlIGNoYW5uZWwgKG1vc3RseSBmb3Igc25pZnMpICovCi0JVUlOVAlwcmVhbWJsZTsJLyogUDgwMjExRU5VTV9wcmVhbWJsZXR5cGVfKiAqLwotCVVJTlQJZW5jb2Rpbmc7CS8qIFA4MDIxMUVOVU1fZW5jb2RpbmdfKiAqLworCXVuc2lnbmVkIGludAlyeHJhdGU7CQkvKiBSZWNlaXZlIGRhdGEgcmF0ZSBpbiAxMDBrYnBzICovCisJdW5zaWduZWQgaW50CXByaW9yaXR5OwkvKiAwLTE1LCAwPWNvbnRlbnRpb24sIDY9Q0YgKi8KKwlpbnQJc2lnbmFsOwkJLyogQW4gU1NJLCBzZWUgcDgwMjExbmV0ZGV2LmggKi8KKwlpbnQJbm9pc2U7CQkvKiBBbiBTU0ksIHNlZSBwODAyMTFuZXRkZXYuaCAqLworCXVuc2lnbmVkIGludAljaGFubmVsOwkvKiBSZWNlaXZlIGNoYW5uZWwgKG1vc3RseSBmb3Igc25pZnMpICovCisJdW5zaWduZWQgaW50CXByZWFtYmxlOwkvKiBQODAyMTFFTlVNX3ByZWFtYmxldHlwZV8qICovCisJdW5zaWduZWQgaW50CWVuY29kaW5nOwkvKiBQODAyMTFFTlVNX2VuY29kaW5nXyogKi8KIAogfSBwODAyMTFfcnhtZXRhX3Q7CiAKIHR5cGVkZWYgc3RydWN0IHA4MDIxMV9mcm1tZXRhCiB7Ci0JVUlOVAkJCW1hZ2ljOworCXVuc2lnbmVkIGludAkJCW1hZ2ljOwogCXA4MDIxMV9yeG1ldGFfdAkJKnJ4OwogfSBwODAyMTFfZnJtbWV0YV90OwogCkBAIC0xMTcsMjAgKzExNywyMCBAQAogICovCiB0eXBlZGVmIHN0cnVjdCBwODAyMTFfY2FwaGRyCiB7Ci0JVUlOVDMyCQl2ZXJzaW9uOwotCVVJTlQzMgkJbGVuZ3RoOwotCVVJTlQ2NAkJbWFjdGltZTsKLQlVSU5UNjQJCWhvc3R0aW1lOwotCVVJTlQzMgkJcGh5dHlwZTsKLQlVSU5UMzIJCWNoYW5uZWw7Ci0JVUlOVDMyCQlkYXRhcmF0ZTsKLQlVSU5UMzIJCWFudGVubmE7Ci0JVUlOVDMyCQlwcmlvcml0eTsKLQlVSU5UMzIJCXNzaV90eXBlOwotCUlOVDMyCQlzc2lfc2lnbmFsOwotCUlOVDMyCQlzc2lfbm9pc2U7Ci0JVUlOVDMyCQlwcmVhbWJsZTsKLQlVSU5UMzIJCWVuY29kaW5nOworCXUzMgkJdmVyc2lvbjsKKwl1MzIJCWxlbmd0aDsKKwl1NjQJCW1hY3RpbWU7CisJdTY0CQlob3N0dGltZTsKKwl1MzIJCXBoeXR5cGU7CisJdTMyCQljaGFubmVsOworCXUzMgkJZGF0YXJhdGU7CisJdTMyCQlhbnRlbm5hOworCXUzMgkJcHJpb3JpdHk7CisJdTMyCQlzc2lfdHlwZTsKKwlzMzIJCXNzaV9zaWduYWw7CisJczMyCQlzc2lfbm9pc2U7CisJdTMyCQlwcmVhbWJsZTsKKwl1MzIJCWVuY29kaW5nOwogfSBwODAyMTFfY2FwaGRyX3Q7CiAKIC8qIGJ1ZmZlciBmcmVlIG1ldGhvZCBwb2ludGVyIHR5cGUgKi8KQEAgLTEzOCwzMSArMTM4LDMxIEBACiAKIHR5cGVkZWYgc3RydWN0IHA4MDIxMV9tZXRhd2VwIHsKIAl2b2lkICAqZGF0YTsKLQlVSU5UOCBpdls0XTsKLQlVSU5UOCBpY3ZbNF07CisJdTggaXZbNF07CisJdTggaWN2WzRdOwogfSBwODAyMTFfbWV0YXdlcF90OwogCiAvKiBsb2NhbCBldGhlciBoZWFkZXIgdHlwZSAqLwogdHlwZWRlZiBzdHJ1Y3Qgd2xhbl9ldGhoZHIKIHsKLQlVSU5UOAlkYWRkcltXTEFOX0VUSEFERFJfTEVOXTsKLQlVSU5UOAlzYWRkcltXTEFOX0VUSEFERFJfTEVOXTsKLQlVSU5UMTYJdHlwZTsKKwl1OAlkYWRkcltXTEFOX0VUSEFERFJfTEVOXTsKKwl1OAlzYWRkcltXTEFOX0VUSEFERFJfTEVOXTsKKwl1MTYJdHlwZTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gd2xhbl9ldGhoZHJfdDsKIAogLyogbG9jYWwgbGxjIGhlYWRlciB0eXBlICovCiB0eXBlZGVmIHN0cnVjdCB3bGFuX2xsYwogewotCVVJTlQ4CWRzYXA7Ci0JVUlOVDgJc3NhcDsKLQlVSU5UOAljdGw7CisJdTgJZHNhcDsKKwl1OAlzc2FwOworCXU4CWN0bDsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gd2xhbl9sbGNfdDsKIAogLyogbG9jYWwgc25hcCBoZWFkZXIgdHlwZSAqLwogdHlwZWRlZiBzdHJ1Y3Qgd2xhbl9zbmFwCiB7Ci0JVUlOVDgJb3VpW1dMQU5fSUVFRV9PVUlfTEVOXTsKLQlVSU5UMTYJdHlwZTsKKwl1OAlvdWlbV0xBTl9JRUVFX09VSV9MRU5dOworCXUxNgl0eXBlOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyB3bGFuX3NuYXBfdDsKIAogLyogQ2lyY3VsYXIgaW5jbHVkZSB0cmljayAqLwpAQCAtMTc0LDEzICsxNzQsMTMgQEAKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAvKkZ1bmN0aW9uIERlY2xhcmF0aW9ucyAqLwogCi1pbnQgc2tiX3A4MDIxMV90b19ldGhlciggc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYsIFVJTlQzMiBldGhjb252LAoraW50IHNrYl9wODAyMTFfdG9fZXRoZXIoIHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2LCB1MzIgZXRoY29udiwKIAkJCSBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKLWludCBza2JfZXRoZXJfdG9fcDgwMjExKCBzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwgVUlOVDMyIGV0aGNvbnYsCitpbnQgc2tiX2V0aGVyX3RvX3A4MDIxMSggc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYsIHUzMiBldGhjb252LAogCQkJIHN0cnVjdCBza19idWZmICpza2IsIHA4MDIxMV9oZHJfdCAqcDgwMjExX2hkciwKIAkJCSBwODAyMTFfbWV0YXdlcF90ICpwODAyMTFfd2VwICk7CiAKLWludCBwODAyMTFfc3R0X2ZpbmRwcm90byhVSU5UMTYgcHJvdG8pOwotaW50IHA4MDIxMV9zdHRfYWRkcHJvdG8oVUlOVDE2IHByb3RvKTsKK2ludCBwODAyMTFfc3R0X2ZpbmRwcm90byh1MTYgcHJvdG8pOworaW50IHA4MDIxMV9zdHRfYWRkcHJvdG8odTE2IHByb3RvKTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFoZHIuaCBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMWhkci5oCmluZGV4IGI3YjA4NzIuLjcyZjEyYWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMWhkci5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMWhkci5oCkBAIC0xNjYsMjkgKzE2NiwyOSBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICBTRVRfRkNfRlNUWVBFKFdMQU5fRlNUWVBFX1JUUykgKTsgICAqLwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCi0jZGVmaW5lIFdMQU5fR0VUX0ZDX1BWRVIobikJICgoKFVJTlQxNikobikpICYgKEJJVDAgfCBCSVQxKSkKLSNkZWZpbmUgV0xBTl9HRVRfRkNfRlRZUEUobikJKCgoKFVJTlQxNikobikpICYgKEJJVDIgfCBCSVQzKSkgPj4gMikKLSNkZWZpbmUgV0xBTl9HRVRfRkNfRlNUWVBFKG4pCSgoKChVSU5UMTYpKG4pKSAmIChCSVQ0fEJJVDV8QklUNnxCSVQ3KSkgPj4gNCkKLSNkZWZpbmUgV0xBTl9HRVRfRkNfVE9EUyhuKSAJKCgoKFVJTlQxNikobikpICYgKEJJVDgpKSA+PiA4KQotI2RlZmluZSBXTEFOX0dFVF9GQ19GUk9NRFMobikJKCgoKFVJTlQxNikobikpICYgKEJJVDkpKSA+PiA5KQotI2RlZmluZSBXTEFOX0dFVF9GQ19NT1JFRlJBRyhuKSAoKCgoVUlOVDE2KShuKSkgJiAoQklUMTApKSA+PiAxMCkKLSNkZWZpbmUgV0xBTl9HRVRfRkNfUkVUUlkobikJKCgoKFVJTlQxNikobikpICYgKEJJVDExKSkgPj4gMTEpCi0jZGVmaW5lIFdMQU5fR0VUX0ZDX1BXUk1HVChuKQkoKCgoVUlOVDE2KShuKSkgJiAoQklUMTIpKSA+PiAxMikKLSNkZWZpbmUgV0xBTl9HRVRfRkNfTU9SRURBVEEobikgKCgoKFVJTlQxNikobikpICYgKEJJVDEzKSkgPj4gMTMpCi0jZGVmaW5lIFdMQU5fR0VUX0ZDX0lTV0VQKG4pCSgoKChVSU5UMTYpKG4pKSAmIChCSVQxNCkpID4+IDE0KQotI2RlZmluZSBXTEFOX0dFVF9GQ19PUkRFUihuKQkoKCgoVUlOVDE2KShuKSkgJiAoQklUMTUpKSA+PiAxNSkKKyNkZWZpbmUgV0xBTl9HRVRfRkNfUFZFUihuKQkgKCgodTE2KShuKSkgJiAoQklUMCB8IEJJVDEpKQorI2RlZmluZSBXTEFOX0dFVF9GQ19GVFlQRShuKQkoKCgodTE2KShuKSkgJiAoQklUMiB8IEJJVDMpKSA+PiAyKQorI2RlZmluZSBXTEFOX0dFVF9GQ19GU1RZUEUobikJKCgoKHUxNikobikpICYgKEJJVDR8QklUNXxCSVQ2fEJJVDcpKSA+PiA0KQorI2RlZmluZSBXTEFOX0dFVF9GQ19UT0RTKG4pIAkoKCgodTE2KShuKSkgJiAoQklUOCkpID4+IDgpCisjZGVmaW5lIFdMQU5fR0VUX0ZDX0ZST01EUyhuKQkoKCgodTE2KShuKSkgJiAoQklUOSkpID4+IDkpCisjZGVmaW5lIFdMQU5fR0VUX0ZDX01PUkVGUkFHKG4pICgoKCh1MTYpKG4pKSAmIChCSVQxMCkpID4+IDEwKQorI2RlZmluZSBXTEFOX0dFVF9GQ19SRVRSWShuKQkoKCgodTE2KShuKSkgJiAoQklUMTEpKSA+PiAxMSkKKyNkZWZpbmUgV0xBTl9HRVRfRkNfUFdSTUdUKG4pCSgoKCh1MTYpKG4pKSAmIChCSVQxMikpID4+IDEyKQorI2RlZmluZSBXTEFOX0dFVF9GQ19NT1JFREFUQShuKSAoKCgodTE2KShuKSkgJiAoQklUMTMpKSA+PiAxMykKKyNkZWZpbmUgV0xBTl9HRVRfRkNfSVNXRVAobikJKCgoKHUxNikobikpICYgKEJJVDE0KSkgPj4gMTQpCisjZGVmaW5lIFdMQU5fR0VUX0ZDX09SREVSKG4pCSgoKCh1MTYpKG4pKSAmIChCSVQxNSkpID4+IDE1KQogCi0jZGVmaW5lIFdMQU5fU0VUX0ZDX1BWRVIobikJKChVSU5UMTYpKG4pKQotI2RlZmluZSBXTEFOX1NFVF9GQ19GVFlQRShuKQkoKChVSU5UMTYpKG4pKSA8PCAyKQotI2RlZmluZSBXTEFOX1NFVF9GQ19GU1RZUEUobikJKCgoVUlOVDE2KShuKSkgPDwgNCkKLSNkZWZpbmUgV0xBTl9TRVRfRkNfVE9EUyhuKSAJKCgoVUlOVDE2KShuKSkgPDwgOCkKLSNkZWZpbmUgV0xBTl9TRVRfRkNfRlJPTURTKG4pCSgoKFVJTlQxNikobikpIDw8IDkpCi0jZGVmaW5lIFdMQU5fU0VUX0ZDX01PUkVGUkFHKG4pICgoKFVJTlQxNikobikpIDw8IDEwKQotI2RlZmluZSBXTEFOX1NFVF9GQ19SRVRSWShuKQkoKChVSU5UMTYpKG4pKSA8PCAxMSkKLSNkZWZpbmUgV0xBTl9TRVRfRkNfUFdSTUdUKG4pCSgoKFVJTlQxNikobikpIDw8IDEyKQotI2RlZmluZSBXTEFOX1NFVF9GQ19NT1JFREFUQShuKSAoKChVSU5UMTYpKG4pKSA8PCAxMykKLSNkZWZpbmUgV0xBTl9TRVRfRkNfSVNXRVAobikJKCgoVUlOVDE2KShuKSkgPDwgMTQpCi0jZGVmaW5lIFdMQU5fU0VUX0ZDX09SREVSKG4pCSgoKFVJTlQxNikobikpIDw8IDE1KQorI2RlZmluZSBXTEFOX1NFVF9GQ19QVkVSKG4pCSgodTE2KShuKSkKKyNkZWZpbmUgV0xBTl9TRVRfRkNfRlRZUEUobikJKCgodTE2KShuKSkgPDwgMikKKyNkZWZpbmUgV0xBTl9TRVRfRkNfRlNUWVBFKG4pCSgoKHUxNikobikpIDw8IDQpCisjZGVmaW5lIFdMQU5fU0VUX0ZDX1RPRFMobikgCSgoKHUxNikobikpIDw8IDgpCisjZGVmaW5lIFdMQU5fU0VUX0ZDX0ZST01EUyhuKQkoKCh1MTYpKG4pKSA8PCA5KQorI2RlZmluZSBXTEFOX1NFVF9GQ19NT1JFRlJBRyhuKSAoKCh1MTYpKG4pKSA8PCAxMCkKKyNkZWZpbmUgV0xBTl9TRVRfRkNfUkVUUlkobikJKCgodTE2KShuKSkgPDwgMTEpCisjZGVmaW5lIFdMQU5fU0VUX0ZDX1BXUk1HVChuKQkoKCh1MTYpKG4pKSA8PCAxMikKKyNkZWZpbmUgV0xBTl9TRVRfRkNfTU9SRURBVEEobikgKCgodTE2KShuKSkgPDwgMTMpCisjZGVmaW5lIFdMQU5fU0VUX0ZDX0lTV0VQKG4pCSgoKHUxNikobikpIDw8IDE0KQorI2RlZmluZSBXTEFOX1NFVF9GQ19PUkRFUihuKQkoKCh1MTYpKG4pKSA8PCAxNSkKIAogLyotLS0gRHVyYXRpb24gTWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyogTWFjcm9zIHRvIGdldC9zZXQgdGhlIGJpdGZpZWxkcyBvZiB0aGUgRHVyYXRpb24gRmllbGQgICAgICAqLwpAQCAtMjAxLDQ1ICsyMDEsNDUgQEAKIC8qIE1hY3JvcyB0byBnZXQvc2V0IHRoZSBiaXRmaWVsZHMgb2YgdGhlIFNlcXVlbmNlIENvbnRyb2wgICAgKi8KIC8qIEZpZWxkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNkZWZpbmUgV0xBTl9HRVRfU0VRX0ZSR05VTShuKSAoKChVSU5UMTYpKG4pKSAmIChCSVQwfEJJVDF8QklUMnxCSVQzKSkKLSNkZWZpbmUgV0xBTl9HRVRfU0VRX1NFUU5VTShuKSAoKCgoVUlOVDE2KShuKSkgJiAofihCSVQwfEJJVDF8QklUMnxCSVQzKSkpID4+IDQpCisjZGVmaW5lIFdMQU5fR0VUX1NFUV9GUkdOVU0obikgKCgodTE2KShuKSkgJiAoQklUMHxCSVQxfEJJVDJ8QklUMykpCisjZGVmaW5lIFdMQU5fR0VUX1NFUV9TRVFOVU0obikgKCgoKHUxNikobikpICYgKH4oQklUMHxCSVQxfEJJVDJ8QklUMykpKSA+PiA0KQogCiAvKi0tLSBEYXRhIHB0ciBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDcmVhdGVzIGEgVUlOVDgqIHRvIHRoZSBkYXRhIHBvcnRpb24gb2YgYSBmcmFtZSAgICAgICAgICAgICovCisvKiBDcmVhdGVzIGEgdTgqIHRvIHRoZSBkYXRhIHBvcnRpb24gb2YgYSBmcmFtZSAgICAgICAgICAgICovCiAvKiBBc3N1bWVzIHlvdSdyZSBwYXNzaW5nIGluIGEgcHRyIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGhkciovCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jZGVmaW5lIFdMQU5fSERSX0EzX0RBVEFQKHApICgoKFVJTlQ4KikocCkpICsgV0xBTl9IRFJfQTNfTEVOKQotI2RlZmluZSBXTEFOX0hEUl9BNF9EQVRBUChwKSAoKChVSU5UOCopKHApKSArIFdMQU5fSERSX0E0X0xFTikKKyNkZWZpbmUgV0xBTl9IRFJfQTNfREFUQVAocCkgKCgodTgqKShwKSkgKyBXTEFOX0hEUl9BM19MRU4pCisjZGVmaW5lIFdMQU5fSERSX0E0X0RBVEFQKHApICgoKHU4KikocCkpICsgV0xBTl9IRFJfQTRfTEVOKQogCi0jZGVmaW5lIERPVDExX1JBVEU1X0lTQkFTSUNfR0VUKHIpICAgICAoKChVSU5UOCkocikpICYgQklUNykKKyNkZWZpbmUgRE9UMTFfUkFURTVfSVNCQVNJQ19HRVQocikgICAgICgoKHU4KShyKSkgJiBCSVQ3KQogCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogLyogVHlwZXMgKi8KIAogLyogQlNTIFRpbWVzdGFtcCAqLwotdHlwZWRlZiBVSU5UOCB3bGFuX2Jzc190c190W1dMQU5fQlNTX1RTX0xFTl07Cit0eXBlZGVmIHU4IHdsYW5fYnNzX3RzX3RbV0xBTl9CU1NfVFNfTEVOXTsKIAogLyogR2VuZXJpYyA4MDIuMTEgSGVhZGVyIHR5cGVzICovCiAKIHR5cGVkZWYgc3RydWN0IHA4MDIxMV9oZHJfYTMKIHsKLQlVSU5UMTYJZmM7Ci0JVUlOVDE2CWR1cjsKLQlVSU5UOAlhMVtXTEFOX0FERFJfTEVOXTsKLQlVSU5UOAlhMltXTEFOX0FERFJfTEVOXTsKLQlVSU5UOAlhM1tXTEFOX0FERFJfTEVOXTsKLQlVSU5UMTYJc2VxOworCXUxNglmYzsKKwl1MTYJZHVyOworCXU4CWExW1dMQU5fQUREUl9MRU5dOworCXU4CWEyW1dMQU5fQUREUl9MRU5dOworCXU4CWEzW1dMQU5fQUREUl9MRU5dOworCXUxNglzZXE7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIHA4MDIxMV9oZHJfYTNfdDsKIAogdHlwZWRlZiBzdHJ1Y3QgcDgwMjExX2hkcl9hNAogewotCVVJTlQxNglmYzsKLQlVSU5UMTYJZHVyOwotCVVJTlQ4CWExW1dMQU5fQUREUl9MRU5dOwotCVVJTlQ4CWEyW1dMQU5fQUREUl9MRU5dOwotCVVJTlQ4CWEzW1dMQU5fQUREUl9MRU5dOwotCVVJTlQxNglzZXE7Ci0JVUlOVDgJYTRbV0xBTl9BRERSX0xFTl07CisJdTE2CWZjOworCXUxNglkdXI7CisJdTgJYTFbV0xBTl9BRERSX0xFTl07CisJdTgJYTJbV0xBTl9BRERSX0xFTl07CisJdTgJYTNbV0xBTl9BRERSX0xFTl07CisJdTE2CXNlcTsKKwl1OAlhNFtXTEFOX0FERFJfTEVOXTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gcDgwMjExX2hkcl9hNF90OwogCiB0eXBlZGVmIHVuaW9uIHA4MDIxMV9oZHIKQEAgLTI3MSw5ICsyNzEsOSBAQAogI2RlZmluZSBXTEFOX0ZDU19MRU4JCQk0CiAKIC8qIGZ0Y2wgaW4gSE9TVCBvcmRlciAqLwotaW5saW5lIHN0YXRpYyBVSU5UMTYgcDgwMjExX2hlYWRlcmxlbihVSU5UMTYgZmN0bCkKK2lubGluZSBzdGF0aWMgdTE2IHA4MDIxMV9oZWFkZXJsZW4odTE2IGZjdGwpCiB7Ci0JVUlOVDE2IGhkcmxlbiA9IDA7CisJdTE2IGhkcmxlbiA9IDA7CiAKIAlzd2l0Y2ggKCBXTEFOX0dFVF9GQ19GVFlQRShmY3RsKSApIHsKIAljYXNlIFdMQU5fRlRZUEVfTUdNVDoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMWlvY3RsLmggYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFpb2N0bC5oCmluZGV4IDI1YjJlYTguLmFkNjdiNjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMWlvY3RsLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExaW9jdGwuaApAQCAtMTA2LDkgKzEwNiw5IEBACiB7CiAJY2hhciAJbmFtZVtXTEFOX0RFVk5BTUVMRU5fTUFYXTsKIAljYWRkcl90IGRhdGE7Ci0JVUlOVDMyCW1hZ2ljOwotCVVJTlQxNglsZW47Ci0JVUlOVDMyCXJlc3VsdDsKKwl1MzIJbWFnaWM7CisJdTE2CWxlbjsKKwl1MzIJcmVzdWx0OwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBwODAyMTFpb2N0bF9yZXFfdDsKIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFtZXRhLmggYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFtZXRhLmgKaW5kZXggNWNiM2Y1YS4uOGI2MWU1ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExbWV0YS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMW1ldGEuaApAQCAtOTAsNyArOTAsNyBAQAogI2RlZmluZSBNS01JQk1FVEFTSVpFKG5hbWUpCQlwODAyMTFtZXRhXyAjIyBtaWIgIyMgXyAjIyBuYW1lICMjIF8gIyMgc2l6ZQogI2RlZmluZSBNS0dSUE1FVEFTSVpFKG5hbWUpCQlwODAyMTFtZXRhXyAjIyBncnAgIyMgXyAjIyBuYW1lICMjIF8gIyMgc2l6ZQogCi0jZGVmaW5lIEdFVE1FVEFTSVpFKGFwdHIpCQkoKiooKFVJTlQzMioqKShhcHRyKSkpCisjZGVmaW5lIEdFVE1FVEFTSVpFKGFwdHIpCQkoKiooKHUzMioqKShhcHRyKSkpCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKiBUaGUgZm9sbG93aW5nIGlmZGVmIGRlcGVuZHMgb24gdGhlIGZvbGxvd2luZyBkZWZpbmVzOiAqLwpAQCAtMTE0LDE0ICsxMTQsMTQgQEAKIHR5cGVkZWYgc3RydWN0IHA4MDIxMW1ldGEKIHsKIAljaGFyCQkJKm5hbWU7CQkvKiBkYXRhIGl0ZW0gbmFtZSAqLwotCVVJTlQzMgkJCWRpZDsJCS8qIHBhcnRpYWwgZGlkICovCi0JVUlOVDMyCQkJZmxhZ3M7CQkvKiBzZXQgb2YgdmFyaW91cyBmbGFnIGJpdHMgKi8KLQlVSU5UMzIJCQltaW47CQkvKiBtaW4gdmFsdWUgb2YgYSBCT1VOREVESU5UICovCi0JVUlOVDMyCQkJbWF4OwkJLyogbWF4IHZhbHVlIG9mIGEgQk9VTkRFRElOVCAqLworCXUzMgkJCWRpZDsJCS8qIHBhcnRpYWwgZGlkICovCisJdTMyCQkJZmxhZ3M7CQkvKiBzZXQgb2YgdmFyaW91cyBmbGFnIGJpdHMgKi8KKwl1MzIJCQltaW47CQkvKiBtaW4gdmFsdWUgb2YgYSBCT1VOREVEaW50ICovCisJdTMyCQkJbWF4OwkJLyogbWF4IHZhbHVlIG9mIGEgQk9VTkRFRGludCAqLwogCi0JVUlOVDMyCQkJbWF4bGVuOwkJLyogbWF4bGVuIG9mIGEgT0NURVRTVFIgb3IgRElTUExBWVNUUiAqLwotCVVJTlQzMgkJCW1pbmxlbjsJCS8qIG1pbmxlbiBvZiBhIE9DVEVUU1RSIG9yIERJU1BMQVlTVFIgKi8KLQlwODAyMTFlbnVtX3QJCSplbnVtcHRyOwkvKiBwdHIgdG8gdGhlIGVudW0gdHlwZSBmb3IgRU5VTUlOVCAqLworCXUzMgkJCW1heGxlbjsJCS8qIG1heGxlbiBvZiBhIE9DVEVUU1RSIG9yIERJU1BMQVlTVFIgKi8KKwl1MzIJCQltaW5sZW47CQkvKiBtaW5sZW4gb2YgYSBPQ1RFVFNUUiBvciBESVNQTEFZU1RSICovCisJcDgwMjExZW51bV90CQkqZW51bXB0cjsJLyogcHRyIHRvIHRoZSBlbnVtIHR5cGUgZm9yIEVOVU1pbnQgKi8KIAlwODAyMTFfdG90ZXh0X3QJCXRvdGV4dHB0cjsJLyogcHRyIHRvIHRvdGV4dCBjb252ZXJzaW9uIGZ1bmN0aW9uICovCiAJcDgwMjExX2Zyb210ZXh0X3QJZnJvbXRleHRwdHI7CS8qIHB0ciB0byB0b3RleHQgY29udmVyc2lvbiBmdW5jdGlvbiAqLwogCXA4MDIxMV92YWxpZF90CQl2YWxpZGZ1bnB0cjsJLyogcHRyIHRvIHRvdGV4dCBjb252ZXJzaW9uIGZ1bmN0aW9uICovCkBAIC0xNTAsMjAgKzE1MCwyMCBAQAogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyogKi8KLVVJTlQzMiBwODAyMTFfdGV4dDJkaWQoY2F0bGlzdGl0ZW1fdCAqY2F0bGlzdCwgY2hhciAqY2F0bmFtZSwgY2hhciAqZ3JwbmFtZSwgY2hhciAqaXRlbW5hbWUpOwotVUlOVDMyIHA4MDIxMV90ZXh0MmNhdGRpZChjYXRsaXN0aXRlbV90ICpsaXN0LCBjaGFyICpuYW1lICk7Ci1VSU5UMzIgcDgwMjExX3RleHQyZ3JwZGlkKGdycGxpc3RpdGVtX3QgKmxpc3QsIGNoYXIgKm5hbWUgKTsKLVVJTlQzMiBwODAyMTFfdGV4dDJpdGVtZGlkKHA4MDIxMW1ldGFfdCAqbGlzdCwgY2hhciAqbmFtZSApOwotVUlOVDMyIHA4MDIxMV9pc3ZhbGlkX2RpZCggY2F0bGlzdGl0ZW1fdCAqY2F0bGlzdCwgVUlOVDMyIGRpZCApOwotVUlOVDMyIHA4MDIxMV9pc3ZhbGlkX2NhdGRpZCggY2F0bGlzdGl0ZW1fdCAqY2F0bGlzdCwgVUlOVDMyIGRpZCApOwotVUlOVDMyIHA4MDIxMV9pc3ZhbGlkX2dycGRpZCggY2F0bGlzdGl0ZW1fdCAqY2F0bGlzdCwgVUlOVDMyIGRpZCApOwotVUlOVDMyIHA4MDIxMV9pc3ZhbGlkX2l0ZW1kaWQoIGNhdGxpc3RpdGVtX3QgKmNhdGxpc3QsIFVJTlQzMiBkaWQgKTsKLWNhdGxpc3RpdGVtX3QgKnA4MDIxMV9kaWQyY2F0KCBjYXRsaXN0aXRlbV90ICpjYXRsaXN0LCBVSU5UMzIgZGlkICk7Ci1ncnBsaXN0aXRlbV90ICpwODAyMTFfZGlkMmdycCggY2F0bGlzdGl0ZW1fdCAqY2F0bGlzdCwgVUlOVDMyIGRpZCApOwotcDgwMjExbWV0YV90ICpwODAyMTFfZGlkMml0ZW0oIGNhdGxpc3RpdGVtX3QgKmNhdGxpc3QsIFVJTlQzMiBkaWQgKTsKLVVJTlQzMiBwODAyMTFpdGVtX21heGRhdGFsZW4oIHN0cnVjdCBjYXRsaXN0aXRlbSAqbWV0YWxpc3QsIFVJTlQzMiBkaWQgKTsKLVVJTlQzMiBwODAyMTFfbWV0YW5hbWUyZGlkKHN0cnVjdCBjYXRsaXN0aXRlbSAqbWV0YWxpc3QsIGNoYXIgKml0ZW1uYW1lKTsKLVVJTlQzMiBwODAyMTFpdGVtX2dldG9mZnNldCggc3RydWN0IGNhdGxpc3RpdGVtICptZXRhbGlzdCwgVUlOVDMyIGRpZCApOwordTMyIHA4MDIxMV90ZXh0MmRpZChjYXRsaXN0aXRlbV90ICpjYXRsaXN0LCBjaGFyICpjYXRuYW1lLCBjaGFyICpncnBuYW1lLCBjaGFyICppdGVtbmFtZSk7Cit1MzIgcDgwMjExX3RleHQyY2F0ZGlkKGNhdGxpc3RpdGVtX3QgKmxpc3QsIGNoYXIgKm5hbWUgKTsKK3UzMiBwODAyMTFfdGV4dDJncnBkaWQoZ3JwbGlzdGl0ZW1fdCAqbGlzdCwgY2hhciAqbmFtZSApOwordTMyIHA4MDIxMV90ZXh0Mml0ZW1kaWQocDgwMjExbWV0YV90ICpsaXN0LCBjaGFyICpuYW1lICk7Cit1MzIgcDgwMjExX2lzdmFsaWRfZGlkKCBjYXRsaXN0aXRlbV90ICpjYXRsaXN0LCB1MzIgZGlkICk7Cit1MzIgcDgwMjExX2lzdmFsaWRfY2F0ZGlkKCBjYXRsaXN0aXRlbV90ICpjYXRsaXN0LCB1MzIgZGlkICk7Cit1MzIgcDgwMjExX2lzdmFsaWRfZ3JwZGlkKCBjYXRsaXN0aXRlbV90ICpjYXRsaXN0LCB1MzIgZGlkICk7Cit1MzIgcDgwMjExX2lzdmFsaWRfaXRlbWRpZCggY2F0bGlzdGl0ZW1fdCAqY2F0bGlzdCwgdTMyIGRpZCApOworY2F0bGlzdGl0ZW1fdCAqcDgwMjExX2RpZDJjYXQoIGNhdGxpc3RpdGVtX3QgKmNhdGxpc3QsIHUzMiBkaWQgKTsKK2dycGxpc3RpdGVtX3QgKnA4MDIxMV9kaWQyZ3JwKCBjYXRsaXN0aXRlbV90ICpjYXRsaXN0LCB1MzIgZGlkICk7CitwODAyMTFtZXRhX3QgKnA4MDIxMV9kaWQyaXRlbSggY2F0bGlzdGl0ZW1fdCAqY2F0bGlzdCwgdTMyIGRpZCApOwordTMyIHA4MDIxMWl0ZW1fbWF4ZGF0YWxlbiggc3RydWN0IGNhdGxpc3RpdGVtICptZXRhbGlzdCwgdTMyIGRpZCApOwordTMyIHA4MDIxMV9tZXRhbmFtZTJkaWQoc3RydWN0IGNhdGxpc3RpdGVtICptZXRhbGlzdCwgY2hhciAqaXRlbW5hbWUpOwordTMyIHA4MDIxMWl0ZW1fZ2V0b2Zmc2V0KCBzdHJ1Y3QgY2F0bGlzdGl0ZW0gKm1ldGFsaXN0LCB1MzIgZGlkICk7CiBpbnQgcDgwMjExaXRlbV9nZXR0eXBlKHA4MDIxMW1ldGFfdCAqbWV0YSk7CiAKICNlbmRpZiAvKiBfUDgwMjExTUVUQV9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFtZXRhZGVmLmggYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFtZXRhZGVmLmgKaW5kZXggMmM3ZjQzNS4uY2U0ZmRkNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExbWV0YWRlZi5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMW1ldGFkZWYuaApAQCAtNzIsMjUgKzcyLDYgQEAKIAkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAogCQkJUDgwMjExRElEX01LR1JPVVAoMikgfCBcCiAJCQlQODAyMTFESURfTUtJVEVNKDIpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX2RvdDExcmVxX3Bvd2VybWdtdCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDMpKQotI2RlZmluZSBESURtc2dfZG90MTFyZXFfcG93ZXJtZ210X3Bvd2VybWdtdG1vZGUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMSkgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfZG90MTFyZXFfcG93ZXJtZ210X3dha2V1cCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDMpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgyKSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19kb3QxMXJlcV9wb3dlcm1nbXRfcmVjZWl2ZWR0aW1zIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDMpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX2RvdDExcmVxX3Bvd2VybWdtdF9yZXN1bHRjb2RlIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDQpIHwgMHgwMDAwMDAwMCkKICNkZWZpbmUgRElEbXNnX2RvdDExcmVxX3NjYW4gXAogCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCiAJCQlQODAyMTFESURfTUtHUk9VUCg0KSkKQEAgLTMwMSwyMTEgKzI4Miw2IEBACiAJCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKIAkJCVA4MDIxMURJRF9NS0dST1VQKDUpIHwgXAogCQkJUDgwMjExRElEX01LSVRFTSg0MCkgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfZG90MTFyZXFfam9pbiBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDYpKQotI2RlZmluZSBESURtc2dfZG90MTFyZXFfam9pbl9ic3NpZCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDYpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxKSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19kb3QxMXJlcV9qb2luX2pvaW5mYWlsdXJldGltZW91dCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDYpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgyKSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19kb3QxMXJlcV9qb2luX2Jhc2ljcmF0ZTEgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg2KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMykgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfZG90MTFyZXFfam9pbl9iYXNpY3JhdGUyIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDQpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX2RvdDExcmVxX2pvaW5fYmFzaWNyYXRlMyBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDYpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg1KSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19kb3QxMXJlcV9qb2luX2Jhc2ljcmF0ZTQgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg2KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNikgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfZG90MTFyZXFfam9pbl9iYXNpY3JhdGU1IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDcpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX2RvdDExcmVxX2pvaW5fYmFzaWNyYXRlNiBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDYpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg4KSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19kb3QxMXJlcV9qb2luX2Jhc2ljcmF0ZTcgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg2KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oOSkgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfZG90MTFyZXFfam9pbl9iYXNpY3JhdGU4IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDEwKSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19kb3QxMXJlcV9qb2luX29wZXJhdGlvbmFscmF0ZTEgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg2KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMTEpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX2RvdDExcmVxX2pvaW5fb3BlcmF0aW9uYWxyYXRlMiBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDYpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxMikgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfZG90MTFyZXFfam9pbl9vcGVyYXRpb25hbHJhdGUzIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDEzKSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19kb3QxMXJlcV9qb2luX29wZXJhdGlvbmFscmF0ZTQgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg2KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMTQpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX2RvdDExcmVxX2pvaW5fb3BlcmF0aW9uYWxyYXRlNSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDYpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxNSkgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfZG90MTFyZXFfam9pbl9vcGVyYXRpb25hbHJhdGU2IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDE2KSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19kb3QxMXJlcV9qb2luX29wZXJhdGlvbmFscmF0ZTcgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg2KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMTcpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX2RvdDExcmVxX2pvaW5fb3BlcmF0aW9uYWxyYXRlOCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDYpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxOCkgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfZG90MTFyZXFfam9pbl9yZXN1bHRjb2RlIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDE5KSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19kb3QxMXJlcV9hdXRoZW50aWNhdGUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg3KSkKLSNkZWZpbmUgRElEbXNnX2RvdDExcmVxX2F1dGhlbnRpY2F0ZV9wZWVyc3RhYWRkcmVzcyBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDcpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxKSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19kb3QxMXJlcV9hdXRoZW50aWNhdGVfYXV0aGVudGljYXRpb250eXBlIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDIpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX2RvdDExcmVxX2F1dGhlbnRpY2F0ZV9hdXRoZW50aWNhdGlvbmZhaWx1cmV0aW1lb3V0IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDMpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX2RvdDExcmVxX2F1dGhlbnRpY2F0ZV9yZXN1bHRjb2RlIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDQpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX2RvdDExcmVxX2RlYXV0aGVudGljYXRlIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoOCkpCi0jZGVmaW5lIERJRG1zZ19kb3QxMXJlcV9kZWF1dGhlbnRpY2F0ZV9wZWVyc3RhYWRkcmVzcyBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDgpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxKSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19kb3QxMXJlcV9kZWF1dGhlbnRpY2F0ZV9yZWFzb25jb2RlIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoOCkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDIpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX2RvdDExcmVxX2RlYXV0aGVudGljYXRlX3Jlc3VsdGNvZGUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg4KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMykgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfZG90MTFyZXFfYXNzb2NpYXRlIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoOSkpCi0jZGVmaW5lIERJRG1zZ19kb3QxMXJlcV9hc3NvY2lhdGVfcGVlcnN0YWFkZHJlc3MgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg5KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMSkgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfZG90MTFyZXFfYXNzb2NpYXRlX2Fzc29jaWF0ZWZhaWx1cmV0aW1lb3V0IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoOSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDIpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX2RvdDExcmVxX2Fzc29jaWF0ZV9jZnBvbGxhYmxlIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoOSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDMpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX2RvdDExcmVxX2Fzc29jaWF0ZV9jZnBvbGxyZXEgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg5KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNCkgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfZG90MTFyZXFfYXNzb2NpYXRlX3ByaXZhY3kgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg5KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNSkgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfZG90MTFyZXFfYXNzb2NpYXRlX2xpc3RlbmludGVydmFsIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoOSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDYpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX2RvdDExcmVxX2Fzc29jaWF0ZV9yZXN1bHRjb2RlIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoOSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDcpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX2RvdDExcmVxX3JlYXNzb2NpYXRlIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMTApKQotI2RlZmluZSBESURtc2dfZG90MTFyZXFfcmVhc3NvY2lhdGVfbmV3YXBhZGRyZXNzIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMTApIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxKSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19kb3QxMXJlcV9yZWFzc29jaWF0ZV9yZWFzc29jaWF0ZWZhaWx1cmV0aW1lb3V0IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMTApIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgyKSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19kb3QxMXJlcV9yZWFzc29jaWF0ZV9jZnBvbGxhYmxlIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMTApIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgzKSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19kb3QxMXJlcV9yZWFzc29jaWF0ZV9jZnBvbGxyZXEgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxMCkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDQpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX2RvdDExcmVxX3JlYXNzb2NpYXRlX3ByaXZhY3kgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxMCkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDUpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX2RvdDExcmVxX3JlYXNzb2NpYXRlX2xpc3RlbmludGVydmFsIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMTApIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg2KSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19kb3QxMXJlcV9yZWFzc29jaWF0ZV9yZXN1bHRjb2RlIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMTApIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg3KSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19kb3QxMXJlcV9kaXNhc3NvY2lhdGUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxMSkpCi0jZGVmaW5lIERJRG1zZ19kb3QxMXJlcV9kaXNhc3NvY2lhdGVfcGVlcnN0YWFkZHJlc3MgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxMSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDEpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX2RvdDExcmVxX2Rpc2Fzc29jaWF0ZV9yZWFzb25jb2RlIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMTEpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgyKSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19kb3QxMXJlcV9kaXNhc3NvY2lhdGVfcmVzdWx0Y29kZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDExKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMykgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfZG90MTFyZXFfcmVzZXQgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxMikpCi0jZGVmaW5lIERJRG1zZ19kb3QxMXJlcV9yZXNldF9zZXRkZWZhdWx0bWliIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMTIpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxKSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19kb3QxMXJlcV9yZXNldF9tYWNhZGRyZXNzIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMTIpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgyKSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19kb3QxMXJlcV9yZXNldF9yZXN1bHRjb2RlIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMTIpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgzKSB8IDB4MDAwMDAwMDApCiAjZGVmaW5lIERJRG1zZ19kb3QxMXJlcV9zdGFydCBcCiAJCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKIAkJCVA4MDIxMURJRF9NS0dST1VQKDEzKSkKQEAgLTc5NSwxNDcgKzU3MSw4IEBACiAJCQkoUDgwMjExRElEX01LU0VDVElPTigzKSB8IFwKIAkJCVA4MDIxMURJRF9NS0dST1VQKDUpIHwgXAogCQkJUDgwMjExRElEX01LSVRFTSgzKSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19jYXRfbG54aW5kIFwKLQkJCVA4MDIxMURJRF9NS1NFQ1RJT04oNCkKLSNkZWZpbmUgRElEbXNnX2xueGluZF93bGFuc25pZmZybSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig0KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDEpKQotI2RlZmluZSBESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX2hvc3R0aW1lIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDQpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDEpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX2xueGluZF93bGFuc25pZmZybV9tYWN0aW1lIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDQpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDIpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX2xueGluZF93bGFuc25pZmZybV9jaGFubmVsIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDQpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDMpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX2xueGluZF93bGFuc25pZmZybV9yc3NpIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDQpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDQpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX2xueGluZF93bGFuc25pZmZybV9zcSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig0KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDEpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg1KSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm1fc2lnbmFsIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDQpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDYpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX2xueGluZF93bGFuc25pZmZybV9ub2lzZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig0KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDEpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg3KSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm1fcmF0ZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig0KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDEpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg4KSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm1faXN0eCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig0KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDEpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg5KSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm1fZnJtbGVuIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDQpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDEwKSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19sbnhpbmRfcm9hbSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig0KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDIpKQotI2RlZmluZSBESURtc2dfbG54aW5kX3JvYW1fcmVhc29uIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDQpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDEpIHwgMHgwMDAwMDAwMCkKICNkZWZpbmUgRElEbXNnX2NhdF9wMnJlcSBcCiAJCQlQODAyMTFESURfTUtTRUNUSU9OKDUpCi0jZGVmaW5lIERJRG1zZ19wMnJlcV9qb2luIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMSkpCi0jZGVmaW5lIERJRG1zZ19wMnJlcV9qb2luX2Jzc2lkIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDEpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX3AycmVxX2pvaW5fYmFzaWNyYXRlMSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDEpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgyKSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19wMnJlcV9qb2luX2Jhc2ljcmF0ZTIgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMykgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfcDJyZXFfam9pbl9iYXNpY3JhdGUzIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDQpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX3AycmVxX2pvaW5fYmFzaWNyYXRlNCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDEpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg1KSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19wMnJlcV9qb2luX2Jhc2ljcmF0ZTUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNikgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfcDJyZXFfam9pbl9iYXNpY3JhdGU2IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDcpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX3AycmVxX2pvaW5fYmFzaWNyYXRlNyBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDEpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg4KSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19wMnJlcV9qb2luX2Jhc2ljcmF0ZTggXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oOSkgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfcDJyZXFfam9pbl9vcGVyYXRpb25hbHJhdGUxIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDEwKSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19wMnJlcV9qb2luX29wZXJhdGlvbmFscmF0ZTIgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMTEpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX3AycmVxX2pvaW5fb3BlcmF0aW9uYWxyYXRlMyBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDEpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxMikgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfcDJyZXFfam9pbl9vcGVyYXRpb25hbHJhdGU0IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDEzKSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19wMnJlcV9qb2luX29wZXJhdGlvbmFscmF0ZTUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMTQpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX3AycmVxX2pvaW5fb3BlcmF0aW9uYWxyYXRlNiBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDEpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxNSkgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfcDJyZXFfam9pbl9vcGVyYXRpb25hbHJhdGU3IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDE2KSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19wMnJlcV9qb2luX29wZXJhdGlvbmFscmF0ZTggXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMTcpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX3AycmVxX2pvaW5fc3NpZCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDEpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxOCkgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfcDJyZXFfam9pbl9jaGFubmVsIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDE5KSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19wMnJlcV9qb2luX2F1dGh0eXBlIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDIwKSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19wMnJlcV9qb2luX3Jlc3VsdGNvZGUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMjEpIHwgMHgwMDAwMDAwMCkKICNkZWZpbmUgRElEbXNnX3AycmVxX3JlYWRwZGEgXAogCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCiAJCQlQODAyMTFESURfTUtHUk9VUCgyKSkKQEAgLTk0NywxNjIgKzU4NCw2IEBACiAJCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKIAkJCVA4MDIxMURJRF9NS0dST1VQKDIpIHwgXAogCQkJUDgwMjExRElEX01LSVRFTSgyKSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19wMnJlcV9yZWFkY2lzIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMykpCi0jZGVmaW5lIERJRG1zZ19wMnJlcV9yZWFkY2lzX2NpcyBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDMpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxKSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19wMnJlcV9yZWFkY2lzX3Jlc3VsdGNvZGUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMikgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfcDJyZXFfYXV4cG9ydF9zdGF0ZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDQpKQotI2RlZmluZSBESURtc2dfcDJyZXFfYXV4cG9ydF9zdGF0ZV9lbmFibGUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg0KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMSkgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfcDJyZXFfYXV4cG9ydF9zdGF0ZV9yZXN1bHRjb2RlIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNCkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDIpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX3AycmVxX2F1eHBvcnRfcmVhZCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDUpKQotI2RlZmluZSBESURtc2dfcDJyZXFfYXV4cG9ydF9yZWFkX2FkZHIgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMSkgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfcDJyZXFfYXV4cG9ydF9yZWFkX2xlbiBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDUpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgyKSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19wMnJlcV9hdXhwb3J0X3JlYWRfZGF0YSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDUpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgzKSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19wMnJlcV9hdXhwb3J0X3JlYWRfcmVzdWx0Y29kZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDUpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg0KSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19wMnJlcV9hdXhwb3J0X3dyaXRlIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNikpCi0jZGVmaW5lIERJRG1zZ19wMnJlcV9hdXhwb3J0X3dyaXRlX2FkZHIgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg2KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMSkgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfcDJyZXFfYXV4cG9ydF93cml0ZV9sZW4gXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg2KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMikgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfcDJyZXFfYXV4cG9ydF93cml0ZV9kYXRhIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDMpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX3AycmVxX2F1eHBvcnRfd3JpdGVfcmVzdWx0Y29kZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDYpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg0KSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19wMnJlcV9sb3dfbGV2ZWwgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg3KSkKLSNkZWZpbmUgRElEbXNnX3AycmVxX2xvd19sZXZlbF9jb21tYW5kIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDEpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX3AycmVxX2xvd19sZXZlbF9wYXJhbTAgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg3KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMikgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfcDJyZXFfbG93X2xldmVsX3BhcmFtMSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDcpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgzKSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19wMnJlcV9sb3dfbGV2ZWxfcGFyYW0yIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDQpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX3AycmVxX2xvd19sZXZlbF9yZXNwMCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDcpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg1KSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19wMnJlcV9sb3dfbGV2ZWxfcmVzcDEgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg3KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNikgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfcDJyZXFfbG93X2xldmVsX3Jlc3AyIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDcpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX3AycmVxX2xvd19sZXZlbF9yZXN1bHRjb2RlIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDgpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX3AycmVxX3Rlc3RfY29tbWFuZCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDgpKQotI2RlZmluZSBESURtc2dfcDJyZXFfdGVzdF9jb21tYW5kX3Rlc3Rjb2RlIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoOCkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDEpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX3AycmVxX3Rlc3RfY29tbWFuZF90ZXN0cGFyYW0gXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg4KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMikgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfcDJyZXFfdGVzdF9jb21tYW5kX3Jlc3VsdGNvZGUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg4KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMykgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfcDJyZXFfdGVzdF9jb21tYW5kX3N0YXR1cyBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDgpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg0KSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19wMnJlcV90ZXN0X2NvbW1hbmRfcmVzcDAgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg4KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNSkgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfcDJyZXFfdGVzdF9jb21tYW5kX3Jlc3AxIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoOCkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDYpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX3AycmVxX3Rlc3RfY29tbWFuZF9yZXNwMiBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDgpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg3KSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19wMnJlcV9tbWlfcmVhZCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDkpKQotI2RlZmluZSBESURtc2dfcDJyZXFfbW1pX3JlYWRfYWRkciBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDkpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxKSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19wMnJlcV9tbWlfcmVhZF92YWx1ZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDkpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgyKSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19wMnJlcV9tbWlfcmVhZF9yZXN1bHRjb2RlIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoOSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDMpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX3AycmVxX21taV93cml0ZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDEwKSkKLSNkZWZpbmUgRElEbXNnX3AycmVxX21taV93cml0ZV9hZGRyIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMTApIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxKSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19wMnJlcV9tbWlfd3JpdGVfZGF0YSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDEwKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMikgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfcDJyZXFfbW1pX3dyaXRlX3Jlc3VsdGNvZGUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxMCkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDMpIHwgMHgwMDAwMDAwMCkKICNkZWZpbmUgRElEbXNnX3AycmVxX3JhbWRsX3N0YXRlIFwKIAkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAogCQkJUDgwMjExRElEX01LR1JPVVAoMTEpKQpAQCAtMTE2NywyMjQgKzY0OCw4IEBACiAJCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKIAkJCVA4MDIxMURJRF9NS0dST1VQKDE0KSB8IFwKIAkJCVA4MDIxMURJRF9NS0lURU0oNCkgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfcDJyZXFfbW1fc3RhdGUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxNSkpCi0jZGVmaW5lIERJRG1zZ19wMnJlcV9tbV9zdGF0ZV9lbmFibGUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxNSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDEpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX3AycmVxX21tX3N0YXRlX3Jlc3VsdGNvZGUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxNSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDIpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX3AycmVxX2R1bXBfc3RhdGUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxNikpCi0jZGVmaW5lIERJRG1zZ19wMnJlcV9kdW1wX3N0YXRlX2xldmVsIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMTYpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxKSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19wMnJlcV9kdW1wX3N0YXRlX3Jlc3VsdGNvZGUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxNikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDIpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX3AycmVxX2NoYW5uZWxfaW5mbyBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDE3KSkKLSNkZWZpbmUgRElEbXNnX3AycmVxX2NoYW5uZWxfaW5mb19jaGFubmVsbGlzdCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDE3KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMSkgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfcDJyZXFfY2hhbm5lbF9pbmZvX2NoYW5uZWxkd2VsbHRpbWUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxNykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDIpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX3AycmVxX2NoYW5uZWxfaW5mb19yZXN1bHRjb2RlIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMTcpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgzKSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19wMnJlcV9jaGFubmVsX2luZm9fbnVtY2hpbmZvIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMTcpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg0KSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19wMnJlcV9jaGFubmVsX2luZm9fcmVzdWx0cyBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDE4KSkKLSNkZWZpbmUgRElEbXNnX3AycmVxX2NoYW5uZWxfaW5mb19yZXN1bHRzX2NoYW5uZWwgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxOCkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDEpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX3AycmVxX2NoYW5uZWxfaW5mb19yZXN1bHRzX3Jlc3VsdGNvZGUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxOCkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDIpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX3AycmVxX2NoYW5uZWxfaW5mb19yZXN1bHRzX2F2Z25vaXNlbGV2ZWwgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxOCkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDMpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX3AycmVxX2NoYW5uZWxfaW5mb19yZXN1bHRzX3BlYWtub2lzZWxldmVsIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMTgpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg0KSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19wMnJlcV9jaGFubmVsX2luZm9fcmVzdWx0c19ic3NhY3RpdmUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxOCkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDUpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX3AycmVxX2NoYW5uZWxfaW5mb19yZXN1bHRzX3BjZmFjdGl2ZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDE4KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNikgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfcDJyZXFfZW5hYmxlIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMTkpKQotI2RlZmluZSBESURtc2dfcDJyZXFfZW5hYmxlX3Jlc3VsdGNvZGUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxOSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDEpIHwgMHgwMDAwMDAwMCkKICNkZWZpbmUgRElEbWliX2NhdF9kb3QxMXNtdCBcCiAJCQlQODAyMTFESURfTUtTRUNUSU9OKDEpCi0jZGVmaW5lIERJRG1pYl9kb3QxMXNtdF9wODAyMTFUYWJsZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDEpKQotI2RlZmluZSBESURtaWJfZG90MTFzbXRfcDgwMjExVGFibGVfcDgwMjExX2lmc3RhdGUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMSkgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFzbXRfZG90MTFTdGF0aW9uQ29uZmlnVGFibGUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgyKSkKLSNkZWZpbmUgRElEbWliX2RvdDExc210X2RvdDExU3RhdGlvbkNvbmZpZ1RhYmxlX2RvdDExU3RhdGlvbklEIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDEpIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExc210X2RvdDExU3RhdGlvbkNvbmZpZ1RhYmxlX2RvdDExTWVkaXVtT2NjdXBhbmN5TGltaXQgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMikgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFzbXRfZG90MTFTdGF0aW9uQ29uZmlnVGFibGVfZG90MTFDRlBvbGxhYmxlIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDMpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExc210X2RvdDExU3RhdGlvbkNvbmZpZ1RhYmxlX2RvdDExQ0ZQUGVyaW9kIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDQpIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExc210X2RvdDExU3RhdGlvbkNvbmZpZ1RhYmxlX2RvdDExQ0ZQTWF4RHVyYXRpb24gXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNSkgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFzbXRfZG90MTFTdGF0aW9uQ29uZmlnVGFibGVfZG90MTFBdXRoZW50aWNhdGlvblJlc3BvbnNlVGltZU91dCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDIpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg2KSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMXNtdF9kb3QxMVN0YXRpb25Db25maWdUYWJsZV9kb3QxMVByaXZhY3lPcHRpb25JbXBsZW1lbnRlZCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDIpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg3KSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMXNtdF9kb3QxMVN0YXRpb25Db25maWdUYWJsZV9kb3QxMVBvd2VyTWFuYWdlbWVudE1vZGUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oOCkgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFzbXRfZG90MTFTdGF0aW9uQ29uZmlnVGFibGVfZG90MTFEZXNpcmVkU1NJRCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDIpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg5KSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMXNtdF9kb3QxMVN0YXRpb25Db25maWdUYWJsZV9kb3QxMURlc2lyZWRCU1NUeXBlIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDEwKSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMXNtdF9kb3QxMVN0YXRpb25Db25maWdUYWJsZV9kb3QxMU9wZXJhdGlvbmFsUmF0ZVNldCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDIpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxMSkgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFzbXRfZG90MTFTdGF0aW9uQ29uZmlnVGFibGVfZG90MTFCZWFjb25QZXJpb2QgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMTIpIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExc210X2RvdDExU3RhdGlvbkNvbmZpZ1RhYmxlX2RvdDExRFRJTVBlcmlvZCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDIpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxMykgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFzbXRfZG90MTFTdGF0aW9uQ29uZmlnVGFibGVfZG90MTFBc3NvY2lhdGlvblJlc3BvbnNlVGltZU91dCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDIpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxNCkgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFzbXRfZG90MTFTdGF0aW9uQ29uZmlnVGFibGVfZG90MTFEaXNhc3NvY2lhdGVSZWFzb24gXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMTUpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExc210X2RvdDExU3RhdGlvbkNvbmZpZ1RhYmxlX2RvdDExRGlzYXNzb2NpYXRlU3RhdGlvbiBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDIpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxNikgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFzbXRfZG90MTFTdGF0aW9uQ29uZmlnVGFibGVfZG90MTFEZWF1dGhlbnRpY2F0ZVJlYXNvbiBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDIpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxNykgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFzbXRfZG90MTFTdGF0aW9uQ29uZmlnVGFibGVfZG90MTFEZWF1dGhlbnRpY2F0ZVN0YXRpb24gXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMTgpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExc210X2RvdDExU3RhdGlvbkNvbmZpZ1RhYmxlX2RvdDExQXV0aGVudGljYXRlRmFpbFN0YXR1cyBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDIpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxOSkgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFzbXRfZG90MTFTdGF0aW9uQ29uZmlnVGFibGVfZG90MTFBdXRoZW50aWNhdGVGYWlsU3RhdGlvbiBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDIpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgyMCkgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFzbXRfZG90MTFBdXRoZW50aWNhdGlvbkFsZ29yaXRobXNUYWJsZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDMpKQotI2RlZmluZSBESURtaWJfZG90MTFzbXRfZG90MTFBdXRoZW50aWNhdGlvbkFsZ29yaXRobXNUYWJsZV9kb3QxMUF1dGhlbnRpY2F0aW9uQWxnb3JpdGhtMSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDMpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxKSB8IDB4MTQwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMXNtdF9kb3QxMUF1dGhlbnRpY2F0aW9uQWxnb3JpdGhtc1RhYmxlX2RvdDExQXV0aGVudGljYXRpb25BbGdvcml0aG1zRW5hYmxlMSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDMpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgyKSB8IDB4MWMwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMXNtdF9kb3QxMUF1dGhlbnRpY2F0aW9uQWxnb3JpdGhtc1RhYmxlX2RvdDExQXV0aGVudGljYXRpb25BbGdvcml0aG0yIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDMpIHwgMHgxNDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExc210X2RvdDExQXV0aGVudGljYXRpb25BbGdvcml0aG1zVGFibGVfZG90MTFBdXRoZW50aWNhdGlvbkFsZ29yaXRobXNFbmFibGUyIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDQpIHwgMHgxYzAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExc210X2RvdDExQXV0aGVudGljYXRpb25BbGdvcml0aG1zVGFibGVfZG90MTFBdXRoZW50aWNhdGlvbkFsZ29yaXRobTMgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNSkgfCAweDE0MDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFzbXRfZG90MTFBdXRoZW50aWNhdGlvbkFsZ29yaXRobXNUYWJsZV9kb3QxMUF1dGhlbnRpY2F0aW9uQWxnb3JpdGhtc0VuYWJsZTMgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNikgfCAweDFjMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFzbXRfZG90MTFBdXRoZW50aWNhdGlvbkFsZ29yaXRobXNUYWJsZV9kb3QxMUF1dGhlbnRpY2F0aW9uQWxnb3JpdGhtNCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDMpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg3KSB8IDB4MTQwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMXNtdF9kb3QxMUF1dGhlbnRpY2F0aW9uQWxnb3JpdGhtc1RhYmxlX2RvdDExQXV0aGVudGljYXRpb25BbGdvcml0aG1zRW5hYmxlNCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDMpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg4KSB8IDB4MWMwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMXNtdF9kb3QxMUF1dGhlbnRpY2F0aW9uQWxnb3JpdGhtc1RhYmxlX2RvdDExQXV0aGVudGljYXRpb25BbGdvcml0aG01IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDkpIHwgMHgxNDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExc210X2RvdDExQXV0aGVudGljYXRpb25BbGdvcml0aG1zVGFibGVfZG90MTFBdXRoZW50aWNhdGlvbkFsZ29yaXRobXNFbmFibGU1IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDEwKSB8IDB4MWMwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMXNtdF9kb3QxMUF1dGhlbnRpY2F0aW9uQWxnb3JpdGhtc1RhYmxlX2RvdDExQXV0aGVudGljYXRpb25BbGdvcml0aG02IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDExKSB8IDB4MTQwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMXNtdF9kb3QxMUF1dGhlbnRpY2F0aW9uQWxnb3JpdGhtc1RhYmxlX2RvdDExQXV0aGVudGljYXRpb25BbGdvcml0aG1zRW5hYmxlNiBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDMpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxMikgfCAweDFjMDAwMDAwKQogI2RlZmluZSBESURtaWJfZG90MTFzbXRfZG90MTFXRVBEZWZhdWx0S2V5c1RhYmxlIFwKIAkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAogCQkJUDgwMjExRElEX01LR1JPVVAoNCkpCkBAIC0xNDA0LDI1ICs2NjksNiBAQAogCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCiAJCQlQODAyMTFESURfTUtHUk9VUCg0KSB8IFwKIAkJCVA4MDIxMURJRF9NS0lURU0oNCkgfCAweDBjMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFzbXRfZG90MTFXRVBLZXlNYXBwaW5nc1RhYmxlIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNSkpCi0jZGVmaW5lIERJRG1pYl9kb3QxMXNtdF9kb3QxMVdFUEtleU1hcHBpbmdzVGFibGVfZG90MTFXRVBLZXlNYXBwaW5nSW5kZXggXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMSkgfCAweDFjMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFzbXRfZG90MTFXRVBLZXlNYXBwaW5nc1RhYmxlX2RvdDExV0VQS2V5TWFwcGluZ0FkZHJlc3MgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMikgfCAweDFjMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFzbXRfZG90MTFXRVBLZXlNYXBwaW5nc1RhYmxlX2RvdDExV0VQS2V5TWFwcGluZ1dFUE9uIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDMpIHwgMHgxYzAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExc210X2RvdDExV0VQS2V5TWFwcGluZ3NUYWJsZV9kb3QxMVdFUEtleU1hcHBpbmdWYWx1ZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDUpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg0KSB8IDB4MWMwMDAwMDApCiAjZGVmaW5lIERJRG1pYl9kb3QxMXNtdF9kb3QxMVByaXZhY3lUYWJsZSBcCiAJCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKIAkJCVA4MDIxMURJRF9NS0dST1VQKDYpKQpAQCAtMTQzNCwzMSArNjgwLDE5IEBACiAJCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKIAkJCVA4MDIxMURJRF9NS0dST1VQKDYpIHwgXAogCQkJUDgwMjExRElEX01LSVRFTSgyKSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMXNtdF9kb3QxMVByaXZhY3lUYWJsZV9kb3QxMVdFUEtleU1hcHBpbmdMZW5ndGggXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg2KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMykgfCAweDE4MDAwMDAwKQogI2RlZmluZSBESURtaWJfZG90MTFzbXRfZG90MTFQcml2YWN5VGFibGVfZG90MTFFeGNsdWRlVW5lbmNyeXB0ZWQgXAogCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCiAJCQlQODAyMTFESURfTUtHUk9VUCg2KSB8IFwKIAkJCVA4MDIxMURJRF9NS0lURU0oNCkgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFzbXRfZG90MTFQcml2YWN5VGFibGVfZG90MTFXRVBJQ1ZFcnJvckNvdW50IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDUpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExc210X2RvdDExUHJpdmFjeVRhYmxlX2RvdDExV0VQRXhjbHVkZWRDb3VudCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDYpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg2KSB8IDB4MTAwMDAwMDApCiAjZGVmaW5lIERJRG1pYl9jYXRfZG90MTFtYWMgXAogCQkJUDgwMjExRElEX01LU0VDVElPTigyKQogI2RlZmluZSBESURtaWJfZG90MTFtYWNfZG90MTFPcGVyYXRpb25UYWJsZSBcCiAJCQkoUDgwMjExRElEX01LU0VDVElPTigyKSB8IFwKIAkJCVA4MDIxMURJRF9NS0dST1VQKDEpKQogI2RlZmluZSBESURtaWJfZG90MTFtYWNfZG90MTFPcGVyYXRpb25UYWJsZV9kb3QxMU1BQ0FkZHJlc3MgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMikgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMSkgfCAweDE4MDAwMDAwKQorICAgICAgICAgICAgICAgICAgICAgICAgKFA4MDIxMURJRF9NS1NFQ1RJT04oMikgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICBQODAyMTFESURfTUtHUk9VUCgxKSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgIFA4MDIxMURJRF9NS0lURU0oMSkgfCAweDE4MDAwMDAwKQogI2RlZmluZSBESURtaWJfZG90MTFtYWNfZG90MTFPcGVyYXRpb25UYWJsZV9kb3QxMVJUU1RocmVzaG9sZCBcCiAJCQkoUDgwMjExRElEX01LU0VDVElPTigyKSB8IFwKIAkJCVA4MDIxMURJRF9NS0dST1VQKDEpIHwgXApAQCAtMTQ3NiwzMjkgKzcxMCwxOCBAQAogCQkJUDgwMjExRElEX01LR1JPVVAoMSkgfCBcCiAJCQlQODAyMTFESURfTUtJVEVNKDUpIHwgMHgxODAwMDAwMCkKICNkZWZpbmUgRElEbWliX2RvdDExbWFjX2RvdDExT3BlcmF0aW9uVGFibGVfZG90MTFNYXhUcmFuc21pdE1TRFVMaWZldGltZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDEpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg2KSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMW1hY19kb3QxMU9wZXJhdGlvblRhYmxlX2RvdDExTWF4UmVjZWl2ZUxpZmV0aW1lIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDIpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDcpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExbWFjX2RvdDExT3BlcmF0aW9uVGFibGVfZG90MTFNYW51ZmFjdHVyZXJJRCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDEpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg4KSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMW1hY19kb3QxMU9wZXJhdGlvblRhYmxlX2RvdDExUHJvZHVjdElEIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDIpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDkpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExbWFjX2RvdDExQ291bnRlcnNUYWJsZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDIpKQotI2RlZmluZSBESURtaWJfZG90MTFtYWNfZG90MTFDb3VudGVyc1RhYmxlX2RvdDExVHJhbnNtaXR0ZWRGcmFnbWVudENvdW50IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDIpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDEpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExbWFjX2RvdDExQ291bnRlcnNUYWJsZV9kb3QxMU11bHRpY2FzdFRyYW5zbWl0dGVkRnJhbWVDb3VudCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDIpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgyKSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMW1hY19kb3QxMUNvdW50ZXJzVGFibGVfZG90MTFGYWlsZWRDb3VudCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDIpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgzKSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMW1hY19kb3QxMUNvdW50ZXJzVGFibGVfZG90MTFSZXRyeUNvdW50IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDIpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDQpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExbWFjX2RvdDExQ291bnRlcnNUYWJsZV9kb3QxMU11bHRpcGxlUmV0cnlDb3VudCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDIpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg1KSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMW1hY19kb3QxMUNvdW50ZXJzVGFibGVfZG90MTFGcmFtZUR1cGxpY2F0ZUNvdW50IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDIpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDYpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExbWFjX2RvdDExQ291bnRlcnNUYWJsZV9kb3QxMVJUU1N1Y2Nlc3NDb3VudCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDIpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg3KSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMW1hY19kb3QxMUNvdW50ZXJzVGFibGVfZG90MTFSVFNGYWlsdXJlQ291bnQgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMikgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oOCkgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFtYWNfZG90MTFDb3VudGVyc1RhYmxlX2RvdDExQUNLRmFpbHVyZUNvdW50IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDIpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDkpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExbWFjX2RvdDExQ291bnRlcnNUYWJsZV9kb3QxMVJlY2VpdmVkRnJhZ21lbnRDb3VudCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDIpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxMCkgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFtYWNfZG90MTFDb3VudGVyc1RhYmxlX2RvdDExTXVsdGljYXN0UmVjZWl2ZWRGcmFtZUNvdW50IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDIpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDExKSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMW1hY19kb3QxMUNvdW50ZXJzVGFibGVfZG90MTFGQ1NFcnJvckNvdW50IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDIpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDEyKSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMW1hY19kb3QxMUNvdW50ZXJzVGFibGVfZG90MTFUcmFuc21pdHRlZEZyYW1lQ291bnQgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMikgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMTMpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExbWFjX2RvdDExQ291bnRlcnNUYWJsZV9kb3QxMVdFUFVuZGVjcnlwdGFibGVDb3VudCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDIpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxNCkgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFtYWNfZG90MTFHcm91cEFkZHJlc3Nlc1RhYmxlIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDIpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMykpCi0jZGVmaW5lIERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzMSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDMpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxKSB8IDB4MWMwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzMiBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDMpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgyKSB8IDB4MWMwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzMyBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDMpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgzKSB8IDB4MWMwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzNCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDMpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg0KSB8IDB4MWMwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzNSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDMpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg1KSB8IDB4MWMwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzNiBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDMpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg2KSB8IDB4MWMwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzNyBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDMpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg3KSB8IDB4MWMwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzOCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDMpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg4KSB8IDB4MWMwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzOSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDMpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg5KSB8IDB4MWMwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzMTAgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMikgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMTApIHwgMHgxYzAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3MxMSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDMpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxMSkgfCAweDFjMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFtYWNfZG90MTFHcm91cEFkZHJlc3Nlc1RhYmxlX2RvdDExQWRkcmVzczEyIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDIpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDEyKSB8IDB4MWMwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzMTMgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMikgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMTMpIHwgMHgxYzAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3MxNCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDMpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxNCkgfCAweDFjMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFtYWNfZG90MTFHcm91cEFkZHJlc3Nlc1RhYmxlX2RvdDExQWRkcmVzczE1IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDIpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDE1KSB8IDB4MWMwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzMTYgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMikgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMTYpIHwgMHgxYzAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3MxNyBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDMpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxNykgfCAweDFjMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFtYWNfZG90MTFHcm91cEFkZHJlc3Nlc1RhYmxlX2RvdDExQWRkcmVzczE4IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDIpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDE4KSB8IDB4MWMwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzMTkgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMikgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMTkpIHwgMHgxYzAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3MyMCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDMpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgyMCkgfCAweDFjMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFtYWNfZG90MTFHcm91cEFkZHJlc3Nlc1RhYmxlX2RvdDExQWRkcmVzczIxIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDIpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDIxKSB8IDB4MWMwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzMjIgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMikgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMjIpIHwgMHgxYzAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3MyMyBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDMpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgyMykgfCAweDFjMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFtYWNfZG90MTFHcm91cEFkZHJlc3Nlc1RhYmxlX2RvdDExQWRkcmVzczI0IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDIpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDI0KSB8IDB4MWMwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzMjUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMikgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMjUpIHwgMHgxYzAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3MyNiBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDMpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgyNikgfCAweDFjMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFtYWNfZG90MTFHcm91cEFkZHJlc3Nlc1RhYmxlX2RvdDExQWRkcmVzczI3IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDIpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDI3KSB8IDB4MWMwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzMjggXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMikgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMjgpIHwgMHgxYzAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3MyOSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDMpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgyOSkgfCAweDFjMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFtYWNfZG90MTFHcm91cEFkZHJlc3Nlc1RhYmxlX2RvdDExQWRkcmVzczMwIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDIpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDMwKSB8IDB4MWMwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzMzEgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMikgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMzEpIHwgMHgxYzAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3MzMiBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDMpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgzMikgfCAweDFjMDAwMDAwKQorICAgICAgICAgICAgICAgICAgICAgICAoUDgwMjExRElEX01LU0VDVElPTigyKSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgUDgwMjExRElEX01LR1JPVVAoMSkgfCBcCisgICAgICAgICAgICAgICAgICAgICAgIFA4MDIxMURJRF9NS0lURU0oNikgfCAweDEwMDAwMDAwKQogI2RlZmluZSBESURtaWJfY2F0X2RvdDExcGh5IFwKIAkJCVA4MDIxMURJRF9NS1NFQ1RJT04oMykKICNkZWZpbmUgRElEbWliX2RvdDExcGh5X2RvdDExUGh5T3BlcmF0aW9uVGFibGUgXAogCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMykgfCBcCiAJCQlQODAyMTFESURfTUtHUk9VUCgxKSkKLSNkZWZpbmUgRElEbWliX2RvdDExcGh5X2RvdDExUGh5T3BlcmF0aW9uVGFibGVfZG90MTFQSFlUeXBlIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDMpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDEpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExcGh5X2RvdDExUGh5T3BlcmF0aW9uVGFibGVfZG90MTFDdXJyZW50UmVnRG9tYWluIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDMpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDIpIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExcGh5X2RvdDExUGh5T3BlcmF0aW9uVGFibGVfZG90MTFUZW1wVHlwZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDEpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgzKSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMXBoeV9kb3QxMVBoeU9wZXJhdGlvblRhYmxlX2RvdDExQ2hhbm5lbEFnaWxpdHlQcmVzZW50IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDMpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDQpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExcGh5X2RvdDExUGh5T3BlcmF0aW9uVGFibGVfZG90MTFDaGFubmVsQWdpbGl0eUVuYWJsZWQgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMykgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNSkgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFwaHlfZG90MTFQaHlPcGVyYXRpb25UYWJsZV9kb3QxMVNob3J0UHJlYW1ibGVFbmFibGVkIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDMpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDYpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExcGh5X2RvdDExUGh5QW50ZW5uYVRhYmxlIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDMpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMikpCi0jZGVmaW5lIERJRG1pYl9kb3QxMXBoeV9kb3QxMVBoeUFudGVubmFUYWJsZV9kb3QxMUN1cnJlbnRUeEFudGVubmEgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMykgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMSkgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFwaHlfZG90MTFQaHlBbnRlbm5hVGFibGVfZG90MTFEaXZlcnNpdHlTdXBwb3J0IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDMpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDIpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExcGh5X2RvdDExUGh5QW50ZW5uYVRhYmxlX2RvdDExQ3VycmVudFJ4QW50ZW5uYSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDIpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgzKSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMXBoeV9kb3QxMVBoeVR4UG93ZXJUYWJsZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDMpKQotI2RlZmluZSBESURtaWJfZG90MTFwaHlfZG90MTFQaHlUeFBvd2VyVGFibGVfZG90MTFOdW1iZXJTdXBwb3J0ZWRQb3dlckxldmVscyBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDMpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxKSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMXBoeV9kb3QxMVBoeVR4UG93ZXJUYWJsZV9kb3QxMVR4UG93ZXJMZXZlbDEgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMykgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMikgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFwaHlfZG90MTFQaHlUeFBvd2VyVGFibGVfZG90MTFUeFBvd2VyTGV2ZWwyIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDMpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDMpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExcGh5X2RvdDExUGh5VHhQb3dlclRhYmxlX2RvdDExVHhQb3dlckxldmVsMyBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDMpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg0KSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMXBoeV9kb3QxMVBoeVR4UG93ZXJUYWJsZV9kb3QxMVR4UG93ZXJMZXZlbDQgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMykgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNSkgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFwaHlfZG90MTFQaHlUeFBvd2VyVGFibGVfZG90MTFUeFBvd2VyTGV2ZWw1IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDMpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDYpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExcGh5X2RvdDExUGh5VHhQb3dlclRhYmxlX2RvdDExVHhQb3dlckxldmVsNiBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDMpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg3KSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMXBoeV9kb3QxMVBoeVR4UG93ZXJUYWJsZV9kb3QxMVR4UG93ZXJMZXZlbDcgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMykgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oOCkgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFwaHlfZG90MTFQaHlUeFBvd2VyVGFibGVfZG90MTFUeFBvd2VyTGV2ZWw4IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDMpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDkpIHwgMHgxMDAwMDAwMCkKICNkZWZpbmUgRElEbWliX2RvdDExcGh5X2RvdDExUGh5VHhQb3dlclRhYmxlX2RvdDExQ3VycmVudFR4UG93ZXJMZXZlbCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDMpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxMCkgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFwaHlfZG90MTFQaHlGSFNTVGFibGUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMykgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg0KSkKLSNkZWZpbmUgRElEbWliX2RvdDExcGh5X2RvdDExUGh5RkhTU1RhYmxlX2RvdDExSG9wVGltZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDQpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxKSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMXBoeV9kb3QxMVBoeUZIU1NUYWJsZV9kb3QxMUN1cnJlbnRDaGFubmVsTnVtYmVyIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDMpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNCkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDIpIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExcGh5X2RvdDExUGh5RkhTU1RhYmxlX2RvdDExTWF4RHdlbGxUaW1lIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDMpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNCkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDMpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExcGh5X2RvdDExUGh5RkhTU1RhYmxlX2RvdDExQ3VycmVudER3ZWxsVGltZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDQpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg0KSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMXBoeV9kb3QxMVBoeUZIU1NUYWJsZV9kb3QxMUN1cnJlbnRTZXQgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMykgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg0KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNSkgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFwaHlfZG90MTFQaHlGSFNTVGFibGVfZG90MTFDdXJyZW50UGF0dGVybiBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDQpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg2KSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMXBoeV9kb3QxMVBoeUZIU1NUYWJsZV9kb3QxMUN1cnJlbnRJbmRleCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDQpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg3KSB8IDB4MTgwMDAwMDApCisgICAgICAgICAgICAgICAgICAgICAgIChQODAyMTFESURfTUtTRUNUSU9OKDMpIHwgXAorICAgICAgICAgICAgICAgICAgICAgICBQODAyMTFESURfTUtHUk9VUCgzKSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgUDgwMjExRElEX01LSVRFTSgxMCkgfCAweDE4MDAwMDAwKQogI2RlZmluZSBESURtaWJfZG90MTFwaHlfZG90MTFQaHlEU1NTVGFibGUgXAogCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMykgfCBcCiAJCQlQODAyMTFESURfTUtHUk9VUCg1KSkKQEAgLTE4MDYsOTcgKzcyOSw2IEBACiAJCQkoUDgwMjExRElEX01LU0VDVElPTigzKSB8IFwKIAkJCVA4MDIxMURJRF9NS0dST1VQKDUpIHwgXAogCQkJUDgwMjExRElEX01LSVRFTSgxKSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMXBoeV9kb3QxMVBoeURTU1NUYWJsZV9kb3QxMUNDQU1vZGVTdXBwb3J0ZWQgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMykgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMikgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFwaHlfZG90MTFQaHlEU1NTVGFibGVfZG90MTFDdXJyZW50Q0NBTW9kZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDUpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgzKSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMXBoeV9kb3QxMVBoeURTU1NUYWJsZV9kb3QxMUVEVGhyZXNob2xkIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDMpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDQpIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExcGh5X2RvdDExUGh5RFNTU1RhYmxlX2RvdDExU2hvcnRQcmVhbWJsZU9wdGlvbkltcGxlbWVudGVkIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDMpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDUpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExcGh5X2RvdDExUGh5RFNTU1RhYmxlX2RvdDExUEJDQ09wdGlvbkltcGxlbWVudGVkIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDMpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDYpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExcGh5X2RvdDExUGh5SVJUYWJsZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDYpKQotI2RlZmluZSBESURtaWJfZG90MTFwaHlfZG90MTFQaHlJUlRhYmxlX2RvdDExQ0NBV2F0Y2hkb2dUaW1lck1heCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDYpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxKSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMXBoeV9kb3QxMVBoeUlSVGFibGVfZG90MTFDQ0FXYXRjaGRvZ0NvdW50TWF4IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDMpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDIpIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExcGh5X2RvdDExUGh5SVJUYWJsZV9kb3QxMUNDQVdhdGNoZG9nVGltZXJNaW4gXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMykgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg2KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMykgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFwaHlfZG90MTFQaHlJUlRhYmxlX2RvdDExQ0NBV2F0Y2hkb2dDb3VudE1pbiBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDYpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg0KSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMXBoeV9kb3QxMVJlZ0RvbWFpbnNTdXBwb3J0ZWRUYWJsZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDcpKQotI2RlZmluZSBESURtaWJfZG90MTFwaHlfZG90MTFSZWdEb21haW5zU3VwcG9ydGVkVGFibGVfZG90MTFSZWdEb21haW5zU3VwcG9ydEluZGV4IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDMpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDEpIHwgMHgxYzAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExcGh5X2RvdDExUmVnRG9tYWluc1N1cHBvcnRlZFRhYmxlX2RvdDExUmVnRG9tYWluc1N1cHBvcnRWYWx1ZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDcpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgyKSB8IDB4MTQwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMXBoeV9kb3QxMUFudGVubmFzTGlzdFRhYmxlIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDMpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoOCkpCi0jZGVmaW5lIERJRG1pYl9kb3QxMXBoeV9kb3QxMUFudGVubmFzTGlzdFRhYmxlX2RvdDExQW50ZW5uYUxpc3RJbmRleCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDgpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxKSB8IDB4MWMwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMXBoeV9kb3QxMUFudGVubmFzTGlzdFRhYmxlX2RvdDExU3VwcG9ydGVkVHhBbnRlbm5hIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDMpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoOCkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDIpIHwgMHgxYzAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExcGh5X2RvdDExQW50ZW5uYXNMaXN0VGFibGVfZG90MTFTdXBwb3J0ZWRSeEFudGVubmEgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMykgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg4KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMykgfCAweDFjMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFwaHlfZG90MTFBbnRlbm5hc0xpc3RUYWJsZV9kb3QxMURpdmVyc2l0eVNlbGVjdGlvblJ4IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDMpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoOCkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDQpIHwgMHgxYzAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExcGh5X2RvdDExU3VwcG9ydGVkRGF0YVJhdGVzVHhUYWJsZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDkpKQotI2RlZmluZSBESURtaWJfZG90MTFwaHlfZG90MTFTdXBwb3J0ZWREYXRhUmF0ZXNUeFRhYmxlX2RvdDExU3VwcG9ydGVkRGF0YVJhdGVzVHhJbmRleCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDkpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxKSB8IDB4MWMwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMXBoeV9kb3QxMVN1cHBvcnRlZERhdGFSYXRlc1R4VGFibGVfZG90MTFTdXBwb3J0ZWREYXRhUmF0ZXNUeFZhbHVlIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDMpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoOSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDIpIHwgMHgxNDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExcGh5X2RvdDExU3VwcG9ydGVkRGF0YVJhdGVzUnhUYWJsZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDEwKSkKLSNkZWZpbmUgRElEbWliX2RvdDExcGh5X2RvdDExU3VwcG9ydGVkRGF0YVJhdGVzUnhUYWJsZV9kb3QxMVN1cHBvcnRlZERhdGFSYXRlc1J4SW5kZXggXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMykgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxMCkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDEpIHwgMHgxYzAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExcGh5X2RvdDExU3VwcG9ydGVkRGF0YVJhdGVzUnhUYWJsZV9kb3QxMVN1cHBvcnRlZERhdGFSYXRlc1J4VmFsdWUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMykgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxMCkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDIpIHwgMHgxNDAwMDAwMCkKICNkZWZpbmUgRElEbWliX2NhdF9sbnggXAogCQkJUDgwMjExRElEX01LU0VDVElPTig0KQogI2RlZmluZSBESURtaWJfbG54X2xueENvbmZpZ1RhYmxlIFwKQEAgLTE5MDgsNTcgKzc0MCw2IEBACiAJCQlQODAyMTFESURfTUtJVEVNKDEpIHwgMHgxODAwMDAwMCkKICNkZWZpbmUgRElEbWliX2NhdF9wMiBcCiAJCQlQODAyMTFESURfTUtTRUNUSU9OKDUpCi0jZGVmaW5lIERJRG1pYl9wMl9wMlRhYmxlIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMSkpCi0jZGVmaW5lIERJRG1pYl9wMl9wMlRhYmxlX3AyTU1UeCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDEpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxKSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMlRhYmxlX3AyRWFybHlCZWFjb24gXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMikgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJUYWJsZV9wMlJlY2VpdmVkRnJhbWVTdGF0aXN0aWNzIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDMpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyVGFibGVfcDJDb21tdW5pY2F0aW9uVGFsbGllcyBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDEpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg0KSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMlRhYmxlX3AyQXV0aGVudGljYXRlZCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDEpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg1KSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMlRhYmxlX3AyQXNzb2NpYXRlZCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDEpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg2KSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMlRhYmxlX3AyUG93ZXJTYXZlVXNlckNvdW50IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDcpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyVGFibGVfcDJDb21tZW50IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDgpIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyVGFibGVfcDJBY2Nlc3NNb2RlIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDkpIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyVGFibGVfcDJBY2Nlc3NBbGxvdyBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDEpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxMCkgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJUYWJsZV9wMkFjY2Vzc0RlbnkgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMTEpIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyVGFibGVfcDJDaGFubmVsSW5mb1Jlc3VsdHMgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMTIpIHwgMHgxMDAwMDAwMCkKICNkZWZpbmUgRElEbWliX3AyX3AyU3RhdGljIFwKIAkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAogCQkJUDgwMjExRElEX01LR1JPVVAoMikpCkBAIC0xOTY2LDU1OSArNzQ3LDExIEBACiAJCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKIAkJCVA4MDIxMURJRF9NS0dST1VQKDIpIHwgXAogCQkJUDgwMjExRElEX01LSVRFTSgxKSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMlN0YXRpY19wMkNuZk93bk1BQ0FkZHJlc3MgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMikgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZEZXNpcmVkU1NJRCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDIpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgzKSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMlN0YXRpY19wMkNuZk93bkNoYW5uZWwgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNCkgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZPd25TU0lEIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDUpIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyU3RhdGljX3AyQ25mT3duQVRJTVdpbmRvdyBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDIpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg2KSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMlN0YXRpY19wMkNuZlN5c3RlbVNjYWxlIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDcpIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyU3RhdGljX3AyQ25mTWF4RGF0YUxlbmd0aCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDIpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg4KSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMlN0YXRpY19wMkNuZldEU0FkZHJlc3MgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oOSkgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZQTUVuYWJsZWQgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMTApIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyU3RhdGljX3AyQ25mUE1FUFMgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMTEpIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyU3RhdGljX3AyQ25mTXVsdGljYXN0UmVjZWl2ZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDIpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxMikgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZNYXhTbGVlcER1cmF0aW9uIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDEzKSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMlN0YXRpY19wMkNuZlBNSG9sZG92ZXJEdXJhdGlvbiBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDIpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxNCkgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZPd25OYW1lIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDE1KSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMlN0YXRpY19wMkNuZk93bkRUSU1QZXJpb2QgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMTYpIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyU3RhdGljX3AyQ25mV0RTQWRkcmVzczEgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMTcpIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyU3RhdGljX3AyQ25mV0RTQWRkcmVzczIgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMTgpIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyU3RhdGljX3AyQ25mV0RTQWRkcmVzczMgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMTkpIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyU3RhdGljX3AyQ25mV0RTQWRkcmVzczQgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMjApIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyU3RhdGljX3AyQ25mV0RTQWRkcmVzczUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMjEpIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyU3RhdGljX3AyQ25mV0RTQWRkcmVzczYgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMjIpIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyU3RhdGljX3AyQ25mTXVsdGljYXN0UE1CdWZmZXJpbmcgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMjMpIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyU3RhdGljX3AyQ25mV0VQRGVmYXVsdEtleUlEIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDI0KSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMlN0YXRpY19wMkNuZldFUERlZmF1bHRLZXkwIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDI1KSB8IDB4MDgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMlN0YXRpY19wMkNuZldFUERlZmF1bHRLZXkxIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDI2KSB8IDB4MDgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMlN0YXRpY19wMkNuZldFUERlZmF1bHRLZXkyIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDI3KSB8IDB4MDgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMlN0YXRpY19wMkNuZldFUERlZmF1bHRLZXkzIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDI4KSB8IDB4MDgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMlN0YXRpY19wMkNuZldFUEZsYWdzIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDI5KSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMlN0YXRpY19wMkNuZkF1dGhlbnRpY2F0aW9uIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDMwKSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMlN0YXRpY19wMkNuZk1heEFzc29jaWF0ZWRTdGF0aW9ucyBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDIpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgzMSkgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZUeENvbnRyb2wgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMzIpIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyU3RhdGljX3AyQ25mUm9hbWluZ01vZGUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMzMpIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyU3RhdGljX3AyQ25mSG9zdEF1dGhlbnRpY2F0aW9uIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDM0KSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMlN0YXRpY19wMkNuZlJjdkNyY0Vycm9yIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDM1KSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMlN0YXRpY19wMkNuZkFsdFJldHJ5Q291bnQgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMzYpIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyU3RhdGljX3AyQ25mQmVhY29uSW50ZXJ2YWwgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMzcpIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyU3RhdGljX3AyQ25mTWVkaXVtT2NjdXBhbmN5TGltaXQgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMzgpIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyU3RhdGljX3AyQ25mQ0ZQUGVyaW9kIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDM5KSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMlN0YXRpY19wMkNuZkNGUE1heER1cmF0aW9uIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDQwKSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMlN0YXRpY19wMkNuZkNGUEZsYWdzIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDQxKSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMlN0YXRpY19wMkNuZlNUQVBDRkluZm8gXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNDIpIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyU3RhdGljX3AyQ25mUHJpb3JpdHlRVXNhZ2UgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNDMpIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyU3RhdGljX3AyQ25mVElNQ3RybCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDIpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg0NCkgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZUaGlydHkyVGFsbHkgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNDUpIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyU3RhdGljX3AyQ25mRW5oU2VjdXJpdHkgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNDYpIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyU3RhdGljX3AyQ25mU2hvcnRQcmVhbWJsZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDIpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg0NykgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZFeGNsdWRlTG9uZ1ByZWFtYmxlIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDQ4KSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMlN0YXRpY19wMkNuZkF1dGhlbnRpY2F0aW9uUnNwVE8gXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNDkpIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyU3RhdGljX3AyQ25mQmFzaWNSYXRlcyBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDIpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg1MCkgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZTdXBwb3J0ZWRSYXRlcyBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDIpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg1MSkgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJEeW5hbWljIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMykpCi0jZGVmaW5lIERJRG1pYl9wMl9wMkR5bmFtaWNfcDJDcmVhdGVJQlNTIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDEpIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyRHluYW1pY19wMkZyYWdtZW50YXRpb25UaHJlc2hvbGQgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMikgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJEeW5hbWljX3AyUlRTVGhyZXNob2xkIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDMpIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyRHluYW1pY19wMlR4UmF0ZUNvbnRyb2wgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNCkgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJEeW5hbWljX3AyUHJvbWlzY3VvdXNNb2RlIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDUpIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyRHluYW1pY19wMkZyYWdtZW50YXRpb25UaHJlc2hvbGQwIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDYpIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyRHluYW1pY19wMkZyYWdtZW50YXRpb25UaHJlc2hvbGQxIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDcpIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyRHluYW1pY19wMkZyYWdtZW50YXRpb25UaHJlc2hvbGQyIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDgpIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyRHluYW1pY19wMkZyYWdtZW50YXRpb25UaHJlc2hvbGQzIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDkpIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyRHluYW1pY19wMkZyYWdtZW50YXRpb25UaHJlc2hvbGQ0IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDEwKSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMkR5bmFtaWNfcDJGcmFnbWVudGF0aW9uVGhyZXNob2xkNSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDMpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxMSkgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJEeW5hbWljX3AyRnJhZ21lbnRhdGlvblRocmVzaG9sZDYgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMTIpIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyRHluYW1pY19wMlJUU1RocmVzaG9sZDAgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMTMpIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyRHluYW1pY19wMlJUU1RocmVzaG9sZDEgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMTQpIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyRHluYW1pY19wMlJUU1RocmVzaG9sZDIgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMTUpIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyRHluYW1pY19wMlJUU1RocmVzaG9sZDMgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMTYpIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyRHluYW1pY19wMlJUU1RocmVzaG9sZDQgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMTcpIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyRHluYW1pY19wMlJUU1RocmVzaG9sZDUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMTgpIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyRHluYW1pY19wMlJUU1RocmVzaG9sZDYgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMTkpIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyRHluYW1pY19wMlR4UmF0ZUNvbnRyb2wwIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDIwKSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMkR5bmFtaWNfcDJUeFJhdGVDb250cm9sMSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDMpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgyMSkgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJEeW5hbWljX3AyVHhSYXRlQ29udHJvbDIgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMjIpIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyRHluYW1pY19wMlR4UmF0ZUNvbnRyb2wzIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDIzKSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMkR5bmFtaWNfcDJUeFJhdGVDb250cm9sNCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDMpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgyNCkgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJEeW5hbWljX3AyVHhSYXRlQ29udHJvbDUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMjUpIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyRHluYW1pY19wMlR4UmF0ZUNvbnRyb2w2IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDI2KSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMkJlaGF2aW9yIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNCkpCi0jZGVmaW5lIERJRG1pYl9wMl9wMkJlaGF2aW9yX3AyVGlja1RpbWUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg0KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMSkgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJOSUMgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg1KSkKLSNkZWZpbmUgRElEbWliX3AyX3AyTklDX3AyTWF4TG9hZFRpbWUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMSkgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJOSUNfcDJETEJ1ZmZlclBhZ2UgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMikgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJOSUNfcDJETEJ1ZmZlck9mZnNldCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDUpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgzKSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMk5JQ19wMkRMQnVmZmVyTGVuZ3RoIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDQpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyTklDX3AyUFJJSWRlbnRpdHkgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNSkgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJOSUNfcDJQUklTdXBSYW5nZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDUpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg2KSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMk5JQ19wMkNGSUFjdFJhbmdlcyBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDUpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg3KSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMk5JQ19wMk5JQ1NlcmlhbE51bWJlciBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDUpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg4KSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMk5JQ19wMk5JQ0lkZW50aXR5IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDkpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyTklDX3AyTUZJU3VwUmFuZ2UgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMTApIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyTklDX3AyQ0ZJU3VwUmFuZ2UgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMTEpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyTklDX3AyQ2hhbm5lbExpc3QgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMTIpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyTklDX3AyUmVndWxhdG9yeURvbWFpbnMgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMTMpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyTklDX3AyVGVtcFR5cGUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMTQpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyTklDX3AyU1RBSWRlbnRpdHkgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMTUpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyTklDX3AyU1RBU3VwUmFuZ2UgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMTYpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyTklDX3AyTUZJQWN0UmFuZ2VzIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDE3KSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMk5JQ19wMlNUQUNGSUFjdFJhbmdlcyBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDUpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxOCkgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJOSUNfcDJCdWlsZFNlcXVlbmNlIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDE5KSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMk5JQ19wMlByaW1hcnlGV0lEIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDIwKSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMk5JQ19wMlNlY29uZGFyeUZXSUQgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMjEpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyTklDX3AyVGVydGlhcnlGV0lEIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDIyKSB8IDB4MTAwMDAwMDApCiAjZGVmaW5lIERJRG1pYl9wMl9wMk1BQyBcCiAJCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKIAkJCVA4MDIxMURJRF9NS0dST1VQKDYpKQotI2RlZmluZSBESURtaWJfcDJfcDJNQUNfcDJQb3J0U3RhdHVzIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDEpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyTUFDX3AyQ3VycmVudFNTSUQgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg2KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMikgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJNQUNfcDJDdXJyZW50QlNTSUQgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg2KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMykgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJNQUNfcDJDb21tc1F1YWxpdHkgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg2KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNCkgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJNQUNfcDJDb21tc1F1YWxpdHlDUSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDYpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg1KSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMk1BQ19wMkNvbW1zUXVhbGl0eUFTTCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDYpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg2KSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMk1BQ19wMkNvbW1zUXVhbGl0eUFOTCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDYpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg3KSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMk1BQ19wMmRibUNvbW1zUXVhbGl0eSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDYpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg4KSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMk1BQ19wMmRibUNvbW1zUXVhbGl0eUNRIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDkpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyTUFDX3AyZGJtQ29tbXNRdWFsaXR5QVNMIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDEwKSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMk1BQ19wMmRibUNvbW1zUXVhbGl0eUFOTCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDYpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxMSkgfCAweDEwMDAwMDAwKQogI2RlZmluZSBESURtaWJfcDJfcDJNQUNfcDJDdXJyZW50VHhSYXRlIFwKIAkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAogCQkJUDgwMjExRElEX01LR1JPVVAoNikgfCBcCiAJCQlQODAyMTFESURfTUtJVEVNKDEyKSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMk1BQ19wMkN1cnJlbnRCZWFjb25JbnRlcnZhbCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDYpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxMykgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJNQUNfcDJTdGFDdXJyZW50U2NhbGVUaHJlc2hvbGRzIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDE0KSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMk1BQ19wMkFQQ3VycmVudFNjYWxlVGhyZXNob2xkcyBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDYpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxNSkgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJNQUNfcDJQcm90b2NvbFJzcFRpbWUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg2KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMTYpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyTUFDX3AyU2hvcnRSZXRyeUxpbWl0IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDE3KSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMk1BQ19wMkxvbmdSZXRyeUxpbWl0IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDE4KSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMk1BQ19wMk1heFRyYW5zbWl0TGlmZXRpbWUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg2KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMTkpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyTUFDX3AyTWF4UmVjZWl2ZUxpZmV0aW1lIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDIwKSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMk1BQ19wMkNGUG9sbGFibGUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg2KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMjEpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyTUFDX3AyQXV0aGVudGljYXRpb25BbGdvcml0aG1zIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDIyKSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMk1BQ19wMlByaXZhY3lPcHRpb25JbXBsZW1lbnRlZCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDYpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgyMykgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJNQUNfcDJDdXJyZW50VHhSYXRlMSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDYpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgyNCkgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJNQUNfcDJDdXJyZW50VHhSYXRlMiBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDYpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgyNSkgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJNQUNfcDJDdXJyZW50VHhSYXRlMyBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDYpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgyNikgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJNQUNfcDJDdXJyZW50VHhSYXRlNCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDYpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgyNykgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJNQUNfcDJDdXJyZW50VHhSYXRlNSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDYpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgyOCkgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJNQUNfcDJDdXJyZW50VHhSYXRlNiBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDYpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgyOSkgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJNQUNfcDJPd25NQUNBZGRyZXNzIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDMwKSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMk1vZGVtIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNykpCi0jZGVmaW5lIERJRG1pYl9wMl9wMk1vZGVtX3AyUEhZVHlwZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDcpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxKSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMk1vZGVtX3AyQ3VycmVudENoYW5uZWwgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg3KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMikgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJNb2RlbV9wMkN1cnJlbnRQb3dlclN0YXRlIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDMpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyTW9kZW1fcDJDQ0FNb2RlIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDQpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyTW9kZW1fcDJTdXBwb3J0ZWREYXRhUmF0ZXMgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg3KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNSkgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJNb2RlbV9wMlR4UG93ZXJNYXggXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg3KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNikgfCAweDE4MDAwMDAwKQogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFtZXRhbWliLmggYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFtZXRhbWliLmgKaW5kZXggMTk4NjdmZC4uOWNkNzJlZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExbWV0YW1pYi5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMW1ldGFtaWIuaApAQCAtOTMsNyArOTMsNyBAQAogLyogY2F0ZWdvcnkgbWV0YWRhdGEgbGlzdCAqLwogCiBleHRlcm4gY2F0bGlzdGl0ZW1fdCBtaWJfY2F0bGlzdFtdOwotZXh0ZXJuIFVJTlQzMiBtaWJfY2F0bGlzdF9zaXplOworZXh0ZXJuIHUzMiBtaWJfY2F0bGlzdF9zaXplOwogCiAKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFtZXRhbXNnLmggYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFtZXRhbXNnLmgKaW5kZXggNGQ2ZGZjYy4uNmU2NTllYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExbWV0YW1zZy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMW1ldGFtc2cuaApAQCAtOTMsNyArOTMsNyBAQAogLyogY2F0ZWdvcnkgbWV0YWRhdGEgbGlzdCAqLwogCiBleHRlcm4gY2F0bGlzdGl0ZW1fdCBtc2dfY2F0bGlzdFtdOwotZXh0ZXJuIFVJTlQzMiBtc2dfY2F0bGlzdF9zaXplOworZXh0ZXJuIHUzMiBtc2dfY2F0bGlzdF9zaXplOwogCiAKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFtZXRhc3RydWN0LmggYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFtZXRhc3RydWN0LmgKaW5kZXggNzE1ZjRiMi4uZDIyNThiMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExbWV0YXN0cnVjdC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMW1ldGFzdHJ1Y3QuaApAQCAtNTAsNDcgKzUwLDM2IEBACiAKIHR5cGVkZWYgc3RydWN0IHA4MDIxMW1zZ19kb3QxMXJlcV9taWJnZXQKIHsKLQlVSU5UMzIJCW1zZ2NvZGUJOwotCVVJTlQzMgkJbXNnbGVuCTsKLQlVSU5UOAkJZGV2bmFtZVtXTEFOX0RFVk5BTUVMRU5fTUFYXQk7CisJdTMyCQltc2djb2RlCTsKKwl1MzIJCW1zZ2xlbgk7CisJdTgJCWRldm5hbWVbV0xBTl9ERVZOQU1FTEVOX01BWF0JOwogCXA4MDIxMWl0ZW1fdW5rMzkyX3QJbWliYXR0cmlidXRlCTsKIAlwODAyMTFpdGVtX3VpbnQzMl90CXJlc3VsdGNvZGUJOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBwODAyMTFtc2dfZG90MTFyZXFfbWliZ2V0X3Q7CiAKIHR5cGVkZWYgc3RydWN0IHA4MDIxMW1zZ19kb3QxMXJlcV9taWJzZXQKIHsKLQlVSU5UMzIJCW1zZ2NvZGUJOwotCVVJTlQzMgkJbXNnbGVuCTsKLQlVSU5UOAkJZGV2bmFtZVtXTEFOX0RFVk5BTUVMRU5fTUFYXQk7CisJdTMyCQltc2djb2RlCTsKKwl1MzIJCW1zZ2xlbgk7CisJdTgJCWRldm5hbWVbV0xBTl9ERVZOQU1FTEVOX01BWF0JOwogCXA4MDIxMWl0ZW1fdW5rMzkyX3QJbWliYXR0cmlidXRlCTsKIAlwODAyMTFpdGVtX3VpbnQzMl90CXJlc3VsdGNvZGUJOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBwODAyMTFtc2dfZG90MTFyZXFfbWlic2V0X3Q7CiAKLXR5cGVkZWYgc3RydWN0IHA4MDIxMW1zZ19kb3QxMXJlcV9wb3dlcm1nbXQKLXsKLQlVSU5UMzIJCW1zZ2NvZGUJOwotCVVJTlQzMgkJbXNnbGVuCTsKLQlVSU5UOAkJZGV2bmFtZVtXTEFOX0RFVk5BTUVMRU5fTUFYXQk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAlwb3dlcm1nbXRtb2RlCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CXdha2V1cAk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAlyZWNlaXZlZHRpbXMJOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJcmVzdWx0Y29kZQk7Ci19IF9fV0xBTl9BVFRSSUJfUEFDS19fIHA4MDIxMW1zZ19kb3QxMXJlcV9wb3dlcm1nbXRfdDsKLQogdHlwZWRlZiBzdHJ1Y3QgcDgwMjExbXNnX2RvdDExcmVxX3NjYW4KIHsKLQlVSU5UMzIJCW1zZ2NvZGUJOwotCVVJTlQzMgkJbXNnbGVuCTsKLQlVSU5UOAkJZGV2bmFtZVtXTEFOX0RFVk5BTUVMRU5fTUFYXQk7CisJdTMyCQltc2djb2RlCTsKKwl1MzIJCW1zZ2xlbgk7CisJdTgJCWRldm5hbWVbV0xBTl9ERVZOQU1FTEVOX01BWF0JOwogCXA4MDIxMWl0ZW1fdWludDMyX3QJYnNzdHlwZQk7CiAJcDgwMjExaXRlbV9wc3RyNl90CWJzc2lkCTsKLQlVSU5UOAlwYWRfMENbMV0JOworCXU4CXBhZF8wQ1sxXQk7CiAJcDgwMjExaXRlbV9wc3RyMzJfdAlzc2lkCTsKLQlVSU5UOAlwYWRfMURbM10JOworCXU4CXBhZF8xRFszXQk7CiAJcDgwMjExaXRlbV91aW50MzJfdAlzY2FudHlwZQk7CiAJcDgwMjExaXRlbV91aW50MzJfdAlwcm9iZWRlbGF5CTsKIAlwODAyMTFpdGVtX3BzdHIxNF90CWNoYW5uZWxsaXN0CTsKLQlVSU5UOAlwYWRfMkNbMV0JOworCXU4CXBhZF8yQ1sxXQk7CiAJcDgwMjExaXRlbV91aW50MzJfdAltaW5jaGFubmVsdGltZQk7CiAJcDgwMjExaXRlbV91aW50MzJfdAltYXhjaGFubmVsdGltZQk7CiAJcDgwMjExaXRlbV91aW50MzJfdAlyZXN1bHRjb2RlCTsKQEAgLTEwMCwxNyArODksMTcgQEAKIAogdHlwZWRlZiBzdHJ1Y3QgcDgwMjExbXNnX2RvdDExcmVxX3NjYW5fcmVzdWx0cwogewotCVVJTlQzMgkJbXNnY29kZQk7Ci0JVUlOVDMyCQltc2dsZW4JOwotCVVJTlQ4CQlkZXZuYW1lW1dMQU5fREVWTkFNRUxFTl9NQVhdCTsKKwl1MzIJCW1zZ2NvZGUJOworCXUzMgkJbXNnbGVuCTsKKwl1OAkJZGV2bmFtZVtXTEFOX0RFVk5BTUVMRU5fTUFYXQk7CiAJcDgwMjExaXRlbV91aW50MzJfdAlic3NpbmRleAk7CiAJcDgwMjExaXRlbV91aW50MzJfdAlyZXN1bHRjb2RlCTsKIAlwODAyMTFpdGVtX3VpbnQzMl90CXNpZ25hbAk7CiAJcDgwMjExaXRlbV91aW50MzJfdAlub2lzZQk7CiAJcDgwMjExaXRlbV9wc3RyNl90CWJzc2lkCTsKLQlVSU5UOAlwYWRfM0NbMV0JOworCXU4CXBhZF8zQ1sxXQk7CiAJcDgwMjExaXRlbV9wc3RyMzJfdAlzc2lkCTsKLQlVSU5UOAlwYWRfNERbM10JOworCXU4CXBhZF80RFszXQk7CiAJcDgwMjExaXRlbV91aW50MzJfdAlic3N0eXBlCTsKIAlwODAyMTFpdGVtX3VpbnQzMl90CWJlYWNvbnBlcmlvZAk7CiAJcDgwMjExaXRlbV91aW50MzJfdAlkdGltcGVyaW9kCTsKQEAgLTE0NywxMTUgKzEzNiwxMyBAQAogCXA4MDIxMWl0ZW1fdWludDMyX3QJc3VwcHJhdGU4CTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gcDgwMjExbXNnX2RvdDExcmVxX3NjYW5fcmVzdWx0c190OwogCi10eXBlZGVmIHN0cnVjdCBwODAyMTFtc2dfZG90MTFyZXFfam9pbgotewotCVVJTlQzMgkJbXNnY29kZQk7Ci0JVUlOVDMyCQltc2dsZW4JOwotCVVJTlQ4CQlkZXZuYW1lW1dMQU5fREVWTkFNRUxFTl9NQVhdCTsKLQlwODAyMTFpdGVtX3BzdHI2X3QJYnNzaWQJOwotCVVJTlQ4CXBhZF81Q1sxXQk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAlqb2luZmFpbHVyZXRpbWVvdXQJOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJYmFzaWNyYXRlMQk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAliYXNpY3JhdGUyCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CWJhc2ljcmF0ZTMJOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJYmFzaWNyYXRlNAk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAliYXNpY3JhdGU1CTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CWJhc2ljcmF0ZTYJOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJYmFzaWNyYXRlNwk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAliYXNpY3JhdGU4CTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CW9wZXJhdGlvbmFscmF0ZTEJOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJb3BlcmF0aW9uYWxyYXRlMgk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAlvcGVyYXRpb25hbHJhdGUzCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CW9wZXJhdGlvbmFscmF0ZTQJOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJb3BlcmF0aW9uYWxyYXRlNQk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAlvcGVyYXRpb25hbHJhdGU2CTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CW9wZXJhdGlvbmFscmF0ZTcJOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJb3BlcmF0aW9uYWxyYXRlOAk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAlyZXN1bHRjb2RlCTsKLX0gX19XTEFOX0FUVFJJQl9QQUNLX18gcDgwMjExbXNnX2RvdDExcmVxX2pvaW5fdDsKLQotdHlwZWRlZiBzdHJ1Y3QgcDgwMjExbXNnX2RvdDExcmVxX2F1dGhlbnRpY2F0ZQotewotCVVJTlQzMgkJbXNnY29kZQk7Ci0JVUlOVDMyCQltc2dsZW4JOwotCVVJTlQ4CQlkZXZuYW1lW1dMQU5fREVWTkFNRUxFTl9NQVhdCTsKLQlwODAyMTFpdGVtX3BzdHI2X3QJcGVlcnN0YWFkZHJlc3MJOwotCVVJTlQ4CXBhZF82Q1sxXQk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAlhdXRoZW50aWNhdGlvbnR5cGUJOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJYXV0aGVudGljYXRpb25mYWlsdXJldGltZW91dAk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAlyZXN1bHRjb2RlCTsKLX0gX19XTEFOX0FUVFJJQl9QQUNLX18gcDgwMjExbXNnX2RvdDExcmVxX2F1dGhlbnRpY2F0ZV90OwotCi10eXBlZGVmIHN0cnVjdCBwODAyMTFtc2dfZG90MTFyZXFfZGVhdXRoZW50aWNhdGUKLXsKLQlVSU5UMzIJCW1zZ2NvZGUJOwotCVVJTlQzMgkJbXNnbGVuCTsKLQlVSU5UOAkJZGV2bmFtZVtXTEFOX0RFVk5BTUVMRU5fTUFYXQk7Ci0JcDgwMjExaXRlbV9wc3RyNl90CXBlZXJzdGFhZGRyZXNzCTsKLQlVSU5UOAlwYWRfN0NbMV0JOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJcmVhc29uY29kZQk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAlyZXN1bHRjb2RlCTsKLX0gX19XTEFOX0FUVFJJQl9QQUNLX18gcDgwMjExbXNnX2RvdDExcmVxX2RlYXV0aGVudGljYXRlX3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHA4MDIxMW1zZ19kb3QxMXJlcV9hc3NvY2lhdGUKLXsKLQlVSU5UMzIJCW1zZ2NvZGUJOwotCVVJTlQzMgkJbXNnbGVuCTsKLQlVSU5UOAkJZGV2bmFtZVtXTEFOX0RFVk5BTUVMRU5fTUFYXQk7Ci0JcDgwMjExaXRlbV9wc3RyNl90CXBlZXJzdGFhZGRyZXNzCTsKLQlVSU5UOAlwYWRfOENbMV0JOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJYXNzb2NpYXRlZmFpbHVyZXRpbWVvdXQJOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJY2Zwb2xsYWJsZQk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAljZnBvbGxyZXEJOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJcHJpdmFjeQk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAlsaXN0ZW5pbnRlcnZhbAk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAlyZXN1bHRjb2RlCTsKLX0gX19XTEFOX0FUVFJJQl9QQUNLX18gcDgwMjExbXNnX2RvdDExcmVxX2Fzc29jaWF0ZV90OwotCi10eXBlZGVmIHN0cnVjdCBwODAyMTFtc2dfZG90MTFyZXFfcmVhc3NvY2lhdGUKLXsKLQlVSU5UMzIJCW1zZ2NvZGUJOwotCVVJTlQzMgkJbXNnbGVuCTsKLQlVSU5UOAkJZGV2bmFtZVtXTEFOX0RFVk5BTUVMRU5fTUFYXQk7Ci0JcDgwMjExaXRlbV9wc3RyNl90CW5ld2FwYWRkcmVzcwk7Ci0JVUlOVDgJcGFkXzlDWzFdCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CXJlYXNzb2NpYXRlZmFpbHVyZXRpbWVvdXQJOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJY2Zwb2xsYWJsZQk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAljZnBvbGxyZXEJOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJcHJpdmFjeQk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAlsaXN0ZW5pbnRlcnZhbAk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAlyZXN1bHRjb2RlCTsKLX0gX19XTEFOX0FUVFJJQl9QQUNLX18gcDgwMjExbXNnX2RvdDExcmVxX3JlYXNzb2NpYXRlX3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHA4MDIxMW1zZ19kb3QxMXJlcV9kaXNhc3NvY2lhdGUKLXsKLQlVSU5UMzIJCW1zZ2NvZGUJOwotCVVJTlQzMgkJbXNnbGVuCTsKLQlVSU5UOAkJZGV2bmFtZVtXTEFOX0RFVk5BTUVMRU5fTUFYXQk7Ci0JcDgwMjExaXRlbV9wc3RyNl90CXBlZXJzdGFhZGRyZXNzCTsKLQlVSU5UOAlwYWRfMTBDWzFdCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CXJlYXNvbmNvZGUJOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJcmVzdWx0Y29kZQk7Ci19IF9fV0xBTl9BVFRSSUJfUEFDS19fIHA4MDIxMW1zZ19kb3QxMXJlcV9kaXNhc3NvY2lhdGVfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgcDgwMjExbXNnX2RvdDExcmVxX3Jlc2V0Ci17Ci0JVUlOVDMyCQltc2djb2RlCTsKLQlVSU5UMzIJCW1zZ2xlbgk7Ci0JVUlOVDgJCWRldm5hbWVbV0xBTl9ERVZOQU1FTEVOX01BWF0JOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJc2V0ZGVmYXVsdG1pYgk7Ci0JcDgwMjExaXRlbV9wc3RyNl90CW1hY2FkZHJlc3MJOwotCVVJTlQ4CXBhZF8xMUNbMV0JOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJcmVzdWx0Y29kZQk7Ci19IF9fV0xBTl9BVFRSSUJfUEFDS19fIHA4MDIxMW1zZ19kb3QxMXJlcV9yZXNldF90OwotCiB0eXBlZGVmIHN0cnVjdCBwODAyMTFtc2dfZG90MTFyZXFfc3RhcnQKIHsKLQlVSU5UMzIJCW1zZ2NvZGUJOwotCVVJTlQzMgkJbXNnbGVuCTsKLQlVSU5UOAkJZGV2bmFtZVtXTEFOX0RFVk5BTUVMRU5fTUFYXQk7CisJdTMyCQltc2djb2RlCTsKKwl1MzIJCW1zZ2xlbgk7CisJdTgJCWRldm5hbWVbV0xBTl9ERVZOQU1FTEVOX01BWF0JOwogCXA4MDIxMWl0ZW1fcHN0cjMyX3QJc3NpZAk7Ci0JVUlOVDgJcGFkXzEyRFszXQk7CisJdTgJcGFkXzEyRFszXQk7CiAJcDgwMjExaXRlbV91aW50MzJfdAlic3N0eXBlCTsKIAlwODAyMTFpdGVtX3VpbnQzMl90CWJlYWNvbnBlcmlvZAk7CiAJcDgwMjExaXRlbV91aW50MzJfdAlkdGltcGVyaW9kCTsKQEAgLTI4OCw3MiArMTc1LDIwIEBACiAJcDgwMjExaXRlbV91aW50MzJfdAlyZXN1bHRjb2RlCTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gcDgwMjExbXNnX2RvdDExcmVxX3N0YXJ0X3Q7CiAKLXR5cGVkZWYgc3RydWN0IHA4MDIxMW1zZ19kb3QxMWluZF9hdXRoZW50aWNhdGUKLXsKLQlVSU5UMzIJCW1zZ2NvZGUJOwotCVVJTlQzMgkJbXNnbGVuCTsKLQlVSU5UOAkJZGV2bmFtZVtXTEFOX0RFVk5BTUVMRU5fTUFYXQk7Ci0JcDgwMjExaXRlbV9wc3RyNl90CXBlZXJzdGFhZGRyZXNzCTsKLQlVSU5UOAlwYWRfMTNDWzFdCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CWF1dGhlbnRpY2F0aW9udHlwZQk7Ci19IF9fV0xBTl9BVFRSSUJfUEFDS19fIHA4MDIxMW1zZ19kb3QxMWluZF9hdXRoZW50aWNhdGVfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgcDgwMjExbXNnX2RvdDExaW5kX2RlYXV0aGVudGljYXRlCi17Ci0JVUlOVDMyCQltc2djb2RlCTsKLQlVSU5UMzIJCW1zZ2xlbgk7Ci0JVUlOVDgJCWRldm5hbWVbV0xBTl9ERVZOQU1FTEVOX01BWF0JOwotCXA4MDIxMWl0ZW1fcHN0cjZfdAlwZWVyc3RhYWRkcmVzcwk7Ci0JVUlOVDgJcGFkXzE0Q1sxXQk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAlyZWFzb25jb2RlCTsKLX0gX19XTEFOX0FUVFJJQl9QQUNLX18gcDgwMjExbXNnX2RvdDExaW5kX2RlYXV0aGVudGljYXRlX3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHA4MDIxMW1zZ19kb3QxMWluZF9hc3NvY2lhdGUKLXsKLQlVSU5UMzIJCW1zZ2NvZGUJOwotCVVJTlQzMgkJbXNnbGVuCTsKLQlVSU5UOAkJZGV2bmFtZVtXTEFOX0RFVk5BTUVMRU5fTUFYXQk7Ci0JcDgwMjExaXRlbV9wc3RyNl90CXBlZXJzdGFhZGRyZXNzCTsKLQlVSU5UOAlwYWRfMTVDWzFdCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CWFpZAk7Ci19IF9fV0xBTl9BVFRSSUJfUEFDS19fIHA4MDIxMW1zZ19kb3QxMWluZF9hc3NvY2lhdGVfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgcDgwMjExbXNnX2RvdDExaW5kX3JlYXNzb2NpYXRlCi17Ci0JVUlOVDMyCQltc2djb2RlCTsKLQlVSU5UMzIJCW1zZ2xlbgk7Ci0JVUlOVDgJCWRldm5hbWVbV0xBTl9ERVZOQU1FTEVOX01BWF0JOwotCXA4MDIxMWl0ZW1fcHN0cjZfdAlwZWVyc3RhYWRkcmVzcwk7Ci0JVUlOVDgJcGFkXzE2Q1sxXQk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAlhaWQJOwotCXA4MDIxMWl0ZW1fcHN0cjZfdAlvbGRhcGFkZHJlc3MJOwotCVVJTlQ4CXBhZF8xN0NbMV0JOwotfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBwODAyMTFtc2dfZG90MTFpbmRfcmVhc3NvY2lhdGVfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgcDgwMjExbXNnX2RvdDExaW5kX2Rpc2Fzc29jaWF0ZQotewotCVVJTlQzMgkJbXNnY29kZQk7Ci0JVUlOVDMyCQltc2dsZW4JOwotCVVJTlQ4CQlkZXZuYW1lW1dMQU5fREVWTkFNRUxFTl9NQVhdCTsKLQlwODAyMTFpdGVtX3BzdHI2X3QJcGVlcnN0YWFkZHJlc3MJOwotCVVJTlQ4CXBhZF8xOENbMV0JOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJcmVhc29uY29kZQk7Ci19IF9fV0xBTl9BVFRSSUJfUEFDS19fIHA4MDIxMW1zZ19kb3QxMWluZF9kaXNhc3NvY2lhdGVfdDsKLQogdHlwZWRlZiBzdHJ1Y3QgcDgwMjExbXNnX2xueHJlcV9pZnN0YXRlCiB7Ci0JVUlOVDMyCQltc2djb2RlCTsKLQlVSU5UMzIJCW1zZ2xlbgk7Ci0JVUlOVDgJCWRldm5hbWVbV0xBTl9ERVZOQU1FTEVOX01BWF0JOworCXUzMgkJbXNnY29kZQk7CisJdTMyCQltc2dsZW4JOworCXU4CQlkZXZuYW1lW1dMQU5fREVWTkFNRUxFTl9NQVhdCTsKIAlwODAyMTFpdGVtX3VpbnQzMl90CWlmc3RhdGUJOwogCXA4MDIxMWl0ZW1fdWludDMyX3QJcmVzdWx0Y29kZQk7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIHA4MDIxMW1zZ19sbnhyZXFfaWZzdGF0ZV90OwogCiB0eXBlZGVmIHN0cnVjdCBwODAyMTFtc2dfbG54cmVxX3dsYW5zbmlmZgogewotCVVJTlQzMgkJbXNnY29kZQk7Ci0JVUlOVDMyCQltc2dsZW4JOwotCVVJTlQ4CQlkZXZuYW1lW1dMQU5fREVWTkFNRUxFTl9NQVhdCTsKKwl1MzIJCW1zZ2NvZGUJOworCXUzMgkJbXNnbGVuCTsKKwl1OAkJZGV2bmFtZVtXTEFOX0RFVk5BTUVMRU5fTUFYXQk7CiAJcDgwMjExaXRlbV91aW50MzJfdAllbmFibGUJOwogCXA4MDIxMWl0ZW1fdWludDMyX3QJY2hhbm5lbAk7CiAJcDgwMjExaXRlbV91aW50MzJfdAlwcmlzbWhlYWRlcgk7CkBAIC0zNjYsOSArMjAxLDkgQEAKIAogdHlwZWRlZiBzdHJ1Y3QgcDgwMjExbXNnX2xueHJlcV9ob3N0d2VwCiB7Ci0JVUlOVDMyCQltc2djb2RlCTsKLQlVSU5UMzIJCW1zZ2xlbgk7Ci0JVUlOVDgJCWRldm5hbWVbV0xBTl9ERVZOQU1FTEVOX01BWF0JOworCXUzMgkJbXNnY29kZQk7CisJdTMyCQltc2dsZW4JOworCXU4CQlkZXZuYW1lW1dMQU5fREVWTkFNRUxFTl9NQVhdCTsKIAlwODAyMTFpdGVtX3VpbnQzMl90CXJlc3VsdGNvZGUJOwogCXA4MDIxMWl0ZW1fdWludDMyX3QJZGVjcnlwdAk7CiAJcDgwMjExaXRlbV91aW50MzJfdAllbmNyeXB0CTsKQEAgLTM3Niw5ICsyMTEsOSBAQAogCiB0eXBlZGVmIHN0cnVjdCBwODAyMTFtc2dfbG54cmVxX2NvbW1zcXVhbGl0eQogewotCVVJTlQzMgkJbXNnY29kZQk7Ci0JVUlOVDMyCQltc2dsZW4JOwotCVVJTlQ4CQlkZXZuYW1lW1dMQU5fREVWTkFNRUxFTl9NQVhdCTsKKwl1MzIJCW1zZ2NvZGUJOworCXUzMgkJbXNnbGVuCTsKKwl1OAkJZGV2bmFtZVtXTEFOX0RFVk5BTUVMRU5fTUFYXQk7CiAJcDgwMjExaXRlbV91aW50MzJfdAlyZXN1bHRjb2RlCTsKIAlwODAyMTFpdGVtX3VpbnQzMl90CWRibQk7CiAJcDgwMjExaXRlbV91aW50MzJfdAlsaW5rCTsKQEAgLTM4OCwxNzMgKzIyMywyOSBAQAogCiB0eXBlZGVmIHN0cnVjdCBwODAyMTFtc2dfbG54cmVxX2F1dG9qb2luCiB7Ci0JVUlOVDMyCQltc2djb2RlCTsKLQlVSU5UMzIJCW1zZ2xlbgk7Ci0JVUlOVDgJCWRldm5hbWVbV0xBTl9ERVZOQU1FTEVOX01BWF0JOworCXUzMgkJbXNnY29kZQk7CisJdTMyCQltc2dsZW4JOworCXU4CQlkZXZuYW1lW1dMQU5fREVWTkFNRUxFTl9NQVhdCTsKIAlwODAyMTFpdGVtX3BzdHIzMl90CXNzaWQJOwotCVVJTlQ4CXBhZF8xOURbM10JOworCXU4CXBhZF8xOURbM10JOwogCXA4MDIxMWl0ZW1fdWludDMyX3QJYXV0aHR5cGUJOwogCXA4MDIxMWl0ZW1fdWludDMyX3QJcmVzdWx0Y29kZQk7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIHA4MDIxMW1zZ19sbnhyZXFfYXV0b2pvaW5fdDsKIAotdHlwZWRlZiBzdHJ1Y3QgcDgwMjExbXNnX2xueGluZF93bGFuc25pZmZybQotewotCVVJTlQzMgkJbXNnY29kZQk7Ci0JVUlOVDMyCQltc2dsZW4JOwotCVVJTlQ4CQlkZXZuYW1lW1dMQU5fREVWTkFNRUxFTl9NQVhdCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CWhvc3R0aW1lCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CW1hY3RpbWUJOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJY2hhbm5lbAk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAlyc3NpCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CXNxCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CXNpZ25hbAk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAlub2lzZQk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAlyYXRlCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CWlzdHgJOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJZnJtbGVuCTsKLX0gX19XTEFOX0FUVFJJQl9QQUNLX18gcDgwMjExbXNnX2xueGluZF93bGFuc25pZmZybV90OwotCi10eXBlZGVmIHN0cnVjdCBwODAyMTFtc2dfbG54aW5kX3JvYW0KLXsKLQlVSU5UMzIJCW1zZ2NvZGUJOwotCVVJTlQzMgkJbXNnbGVuCTsKLQlVSU5UOAkJZGV2bmFtZVtXTEFOX0RFVk5BTUVMRU5fTUFYXQk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAlyZWFzb24JOwotfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBwODAyMTFtc2dfbG54aW5kX3JvYW1fdDsKLQotdHlwZWRlZiBzdHJ1Y3QgcDgwMjExbXNnX3AycmVxX2pvaW4KLXsKLQlVSU5UMzIJCW1zZ2NvZGUJOwotCVVJTlQzMgkJbXNnbGVuCTsKLQlVSU5UOAkJZGV2bmFtZVtXTEFOX0RFVk5BTUVMRU5fTUFYXQk7Ci0JcDgwMjExaXRlbV9wc3RyNl90CWJzc2lkCTsKLQlVSU5UOAlwYWRfMjBDWzFdCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CWJhc2ljcmF0ZTEJOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJYmFzaWNyYXRlMgk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAliYXNpY3JhdGUzCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CWJhc2ljcmF0ZTQJOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJYmFzaWNyYXRlNQk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAliYXNpY3JhdGU2CTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CWJhc2ljcmF0ZTcJOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJYmFzaWNyYXRlOAk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAlvcGVyYXRpb25hbHJhdGUxCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CW9wZXJhdGlvbmFscmF0ZTIJOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJb3BlcmF0aW9uYWxyYXRlMwk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAlvcGVyYXRpb25hbHJhdGU0CTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CW9wZXJhdGlvbmFscmF0ZTUJOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJb3BlcmF0aW9uYWxyYXRlNgk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAlvcGVyYXRpb25hbHJhdGU3CTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CW9wZXJhdGlvbmFscmF0ZTgJOwotCXA4MDIxMWl0ZW1fcHN0cjMyX3QJc3NpZAk7Ci0JVUlOVDgJcGFkXzIxRFszXQk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAljaGFubmVsCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CWF1dGh0eXBlCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CXJlc3VsdGNvZGUJOwotfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBwODAyMTFtc2dfcDJyZXFfam9pbl90OwotCiB0eXBlZGVmIHN0cnVjdCBwODAyMTFtc2dfcDJyZXFfcmVhZHBkYQogewotCVVJTlQzMgkJbXNnY29kZQk7Ci0JVUlOVDMyCQltc2dsZW4JOwotCVVJTlQ4CQlkZXZuYW1lW1dMQU5fREVWTkFNRUxFTl9NQVhdCTsKKwl1MzIJCW1zZ2NvZGUJOworCXUzMgkJbXNnbGVuCTsKKwl1OAkJZGV2bmFtZVtXTEFOX0RFVk5BTUVMRU5fTUFYXQk7CiAJcDgwMjExaXRlbV91bmsxMDI0X3QJcGRhCTsKIAlwODAyMTFpdGVtX3VpbnQzMl90CXJlc3VsdGNvZGUJOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBwODAyMTFtc2dfcDJyZXFfcmVhZHBkYV90OwogCi10eXBlZGVmIHN0cnVjdCBwODAyMTFtc2dfcDJyZXFfcmVhZGNpcwotewotCVVJTlQzMgkJbXNnY29kZQk7Ci0JVUlOVDMyCQltc2dsZW4JOwotCVVJTlQ4CQlkZXZuYW1lW1dMQU5fREVWTkFNRUxFTl9NQVhdCTsKLQlwODAyMTFpdGVtX3VuazEwMjRfdAljaXMJOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJcmVzdWx0Y29kZQk7Ci19IF9fV0xBTl9BVFRSSUJfUEFDS19fIHA4MDIxMW1zZ19wMnJlcV9yZWFkY2lzX3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHA4MDIxMW1zZ19wMnJlcV9hdXhwb3J0X3N0YXRlCi17Ci0JVUlOVDMyCQltc2djb2RlCTsKLQlVSU5UMzIJCW1zZ2xlbgk7Ci0JVUlOVDgJCWRldm5hbWVbV0xBTl9ERVZOQU1FTEVOX01BWF0JOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJZW5hYmxlCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CXJlc3VsdGNvZGUJOwotfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBwODAyMTFtc2dfcDJyZXFfYXV4cG9ydF9zdGF0ZV90OwotCi10eXBlZGVmIHN0cnVjdCBwODAyMTFtc2dfcDJyZXFfYXV4cG9ydF9yZWFkCi17Ci0JVUlOVDMyCQltc2djb2RlCTsKLQlVSU5UMzIJCW1zZ2xlbgk7Ci0JVUlOVDgJCWRldm5hbWVbV0xBTl9ERVZOQU1FTEVOX01BWF0JOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJYWRkcgk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAlsZW4JOwotCXA4MDIxMWl0ZW1fdW5rMTAyNF90CWRhdGEJOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJcmVzdWx0Y29kZQk7Ci19IF9fV0xBTl9BVFRSSUJfUEFDS19fIHA4MDIxMW1zZ19wMnJlcV9hdXhwb3J0X3JlYWRfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgcDgwMjExbXNnX3AycmVxX2F1eHBvcnRfd3JpdGUKLXsKLQlVSU5UMzIJCW1zZ2NvZGUJOwotCVVJTlQzMgkJbXNnbGVuCTsKLQlVSU5UOAkJZGV2bmFtZVtXTEFOX0RFVk5BTUVMRU5fTUFYXQk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAlhZGRyCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CWxlbgk7Ci0JcDgwMjExaXRlbV91bmsxMDI0X3QJZGF0YQk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAlyZXN1bHRjb2RlCTsKLX0gX19XTEFOX0FUVFJJQl9QQUNLX18gcDgwMjExbXNnX3AycmVxX2F1eHBvcnRfd3JpdGVfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgcDgwMjExbXNnX3AycmVxX2xvd19sZXZlbAotewotCVVJTlQzMgkJbXNnY29kZQk7Ci0JVUlOVDMyCQltc2dsZW4JOwotCVVJTlQ4CQlkZXZuYW1lW1dMQU5fREVWTkFNRUxFTl9NQVhdCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CWNvbW1hbmQJOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJcGFyYW0wCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CXBhcmFtMQk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAlwYXJhbTIJOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJcmVzcDAJOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJcmVzcDEJOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJcmVzcDIJOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJcmVzdWx0Y29kZQk7Ci19IF9fV0xBTl9BVFRSSUJfUEFDS19fIHA4MDIxMW1zZ19wMnJlcV9sb3dfbGV2ZWxfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgcDgwMjExbXNnX3AycmVxX3Rlc3RfY29tbWFuZAotewotCVVJTlQzMgkJbXNnY29kZQk7Ci0JVUlOVDMyCQltc2dsZW4JOwotCVVJTlQ4CQlkZXZuYW1lW1dMQU5fREVWTkFNRUxFTl9NQVhdCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CXRlc3Rjb2RlCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CXRlc3RwYXJhbQk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAlyZXN1bHRjb2RlCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CXN0YXR1cwk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAlyZXNwMAk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAlyZXNwMQk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAlyZXNwMgk7Ci19IF9fV0xBTl9BVFRSSUJfUEFDS19fIHA4MDIxMW1zZ19wMnJlcV90ZXN0X2NvbW1hbmRfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgcDgwMjExbXNnX3AycmVxX21taV9yZWFkCi17Ci0JVUlOVDMyCQltc2djb2RlCTsKLQlVSU5UMzIJCW1zZ2xlbgk7Ci0JVUlOVDgJCWRldm5hbWVbV0xBTl9ERVZOQU1FTEVOX01BWF0JOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJYWRkcgk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAl2YWx1ZQk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAlyZXN1bHRjb2RlCTsKLX0gX19XTEFOX0FUVFJJQl9QQUNLX18gcDgwMjExbXNnX3AycmVxX21taV9yZWFkX3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHA4MDIxMW1zZ19wMnJlcV9tbWlfd3JpdGUKLXsKLQlVSU5UMzIJCW1zZ2NvZGUJOwotCVVJTlQzMgkJbXNnbGVuCTsKLQlVSU5UOAkJZGV2bmFtZVtXTEFOX0RFVk5BTUVMRU5fTUFYXQk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAlhZGRyCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CWRhdGEJOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJcmVzdWx0Y29kZQk7Ci19IF9fV0xBTl9BVFRSSUJfUEFDS19fIHA4MDIxMW1zZ19wMnJlcV9tbWlfd3JpdGVfdDsKLQogdHlwZWRlZiBzdHJ1Y3QgcDgwMjExbXNnX3AycmVxX3JhbWRsX3N0YXRlCiB7Ci0JVUlOVDMyCQltc2djb2RlCTsKLQlVSU5UMzIJCW1zZ2xlbgk7Ci0JVUlOVDgJCWRldm5hbWVbV0xBTl9ERVZOQU1FTEVOX01BWF0JOworCXUzMgkJbXNnY29kZQk7CisJdTMyCQltc2dsZW4JOworCXU4CQlkZXZuYW1lW1dMQU5fREVWTkFNRUxFTl9NQVhdCTsKIAlwODAyMTFpdGVtX3VpbnQzMl90CWVuYWJsZQk7CiAJcDgwMjExaXRlbV91aW50MzJfdAlleGVhZGRyCTsKIAlwODAyMTFpdGVtX3VpbnQzMl90CXJlc3VsdGNvZGUJOwpAQCAtNTYyLDkgKzI1Myw5IEBACiAKIHR5cGVkZWYgc3RydWN0IHA4MDIxMW1zZ19wMnJlcV9yYW1kbF93cml0ZQogewotCVVJTlQzMgkJbXNnY29kZQk7Ci0JVUlOVDMyCQltc2dsZW4JOwotCVVJTlQ4CQlkZXZuYW1lW1dMQU5fREVWTkFNRUxFTl9NQVhdCTsKKwl1MzIJCW1zZ2NvZGUJOworCXUzMgkJbXNnbGVuCTsKKwl1OAkJZGV2bmFtZVtXTEFOX0RFVk5BTUVMRU5fTUFYXQk7CiAJcDgwMjExaXRlbV91aW50MzJfdAlhZGRyCTsKIAlwODAyMTFpdGVtX3VpbnQzMl90CWxlbgk7CiAJcDgwMjExaXRlbV91bms0MDk2X3QJZGF0YQk7CkBAIC01NzMsNzIgKzI2NCwyMiBAQAogCiB0eXBlZGVmIHN0cnVjdCBwODAyMTFtc2dfcDJyZXFfZmxhc2hkbF9zdGF0ZQogewotCVVJTlQzMgkJbXNnY29kZQk7Ci0JVUlOVDMyCQltc2dsZW4JOwotCVVJTlQ4CQlkZXZuYW1lW1dMQU5fREVWTkFNRUxFTl9NQVhdCTsKKwl1MzIJCW1zZ2NvZGUJOworCXUzMgkJbXNnbGVuCTsKKwl1OAkJZGV2bmFtZVtXTEFOX0RFVk5BTUVMRU5fTUFYXQk7CiAJcDgwMjExaXRlbV91aW50MzJfdAllbmFibGUJOwogCXA4MDIxMWl0ZW1fdWludDMyX3QJcmVzdWx0Y29kZQk7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIHA4MDIxMW1zZ19wMnJlcV9mbGFzaGRsX3N0YXRlX3Q7CiAKIHR5cGVkZWYgc3RydWN0IHA4MDIxMW1zZ19wMnJlcV9mbGFzaGRsX3dyaXRlCiB7Ci0JVUlOVDMyCQltc2djb2RlCTsKLQlVSU5UMzIJCW1zZ2xlbgk7Ci0JVUlOVDgJCWRldm5hbWVbV0xBTl9ERVZOQU1FTEVOX01BWF0JOworCXUzMgkJbXNnY29kZQk7CisJdTMyCQltc2dsZW4JOworCXU4CQlkZXZuYW1lW1dMQU5fREVWTkFNRUxFTl9NQVhdCTsKIAlwODAyMTFpdGVtX3VpbnQzMl90CWFkZHIJOwogCXA4MDIxMWl0ZW1fdWludDMyX3QJbGVuCTsKIAlwODAyMTFpdGVtX3VuazQwOTZfdAlkYXRhCTsKIAlwODAyMTFpdGVtX3VpbnQzMl90CXJlc3VsdGNvZGUJOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBwODAyMTFtc2dfcDJyZXFfZmxhc2hkbF93cml0ZV90OwogCi10eXBlZGVmIHN0cnVjdCBwODAyMTFtc2dfcDJyZXFfbW1fc3RhdGUKLXsKLQlVSU5UMzIJCW1zZ2NvZGUJOwotCVVJTlQzMgkJbXNnbGVuCTsKLQlVSU5UOAkJZGV2bmFtZVtXTEFOX0RFVk5BTUVMRU5fTUFYXQk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAllbmFibGUJOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJcmVzdWx0Y29kZQk7Ci19IF9fV0xBTl9BVFRSSUJfUEFDS19fIHA4MDIxMW1zZ19wMnJlcV9tbV9zdGF0ZV90OwotCi10eXBlZGVmIHN0cnVjdCBwODAyMTFtc2dfcDJyZXFfZHVtcF9zdGF0ZQotewotCVVJTlQzMgkJbXNnY29kZQk7Ci0JVUlOVDMyCQltc2dsZW4JOwotCVVJTlQ4CQlkZXZuYW1lW1dMQU5fREVWTkFNRUxFTl9NQVhdCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CWxldmVsCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CXJlc3VsdGNvZGUJOwotfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBwODAyMTFtc2dfcDJyZXFfZHVtcF9zdGF0ZV90OwotCi10eXBlZGVmIHN0cnVjdCBwODAyMTFtc2dfcDJyZXFfY2hhbm5lbF9pbmZvCi17Ci0JVUlOVDMyCQltc2djb2RlCTsKLQlVSU5UMzIJCW1zZ2xlbgk7Ci0JVUlOVDgJCWRldm5hbWVbV0xBTl9ERVZOQU1FTEVOX01BWF0JOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJY2hhbm5lbGxpc3QJOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJY2hhbm5lbGR3ZWxsdGltZQk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAlyZXN1bHRjb2RlCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CW51bWNoaW5mbwk7Ci19IF9fV0xBTl9BVFRSSUJfUEFDS19fIHA4MDIxMW1zZ19wMnJlcV9jaGFubmVsX2luZm9fdDsKLQotdHlwZWRlZiBzdHJ1Y3QgcDgwMjExbXNnX3AycmVxX2NoYW5uZWxfaW5mb19yZXN1bHRzCi17Ci0JVUlOVDMyCQltc2djb2RlCTsKLQlVSU5UMzIJCW1zZ2xlbgk7Ci0JVUlOVDgJCWRldm5hbWVbV0xBTl9ERVZOQU1FTEVOX01BWF0JOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJY2hhbm5lbAk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAlyZXN1bHRjb2RlCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CWF2Z25vaXNlbGV2ZWwJOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJcGVha25vaXNlbGV2ZWwJOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJYnNzYWN0aXZlCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CXBjZmFjdGl2ZQk7Ci19IF9fV0xBTl9BVFRSSUJfUEFDS19fIHA4MDIxMW1zZ19wMnJlcV9jaGFubmVsX2luZm9fcmVzdWx0c190OwotCi10eXBlZGVmIHN0cnVjdCBwODAyMTFtc2dfcDJyZXFfZW5hYmxlCi17Ci0JVUlOVDMyCQltc2djb2RlCTsKLQlVSU5UMzIJCW1zZ2xlbgk7Ci0JVUlOVDgJCWRldm5hbWVbV0xBTl9ERVZOQU1FTEVOX01BWF0JOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJcmVzdWx0Y29kZQk7Ci19IF9fV0xBTl9BVFRSSUJfUEFDS19fIHA4MDIxMW1zZ19wMnJlcV9lbmFibGVfdDsKLQogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFtZ210LmggYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFtZ210LmgKaW5kZXggYmQ0YzE2MjkuLjZjYzE2YzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMW1nbXQuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFtZ210LmgKQEAgLTE3MiwxNCArMTcyLDE0IEBACiAvKiBOb3RlOiBUaGVzZSBvZmZzZXRzIGFyZSBmcm9tIHRoZSBzdGFydCBvZiB0aGUgZnJhbWUgZGF0YSAgICAgICAqLwogCiAjZGVmaW5lIFdMQU5fQkVBQ09OX09GRl9UUwkJCTAKLSNkZWZpbmUgV0xBTl9CRUFDT05fT0ZGX0JDTl9JTlQJCQk4CisjZGVmaW5lIFdMQU5fQkVBQ09OX09GRl9CQ05faW50CQkJOAogI2RlZmluZSBXTEFOX0JFQUNPTl9PRkZfQ0FQSU5GTwkJCTEwCiAjZGVmaW5lIFdMQU5fQkVBQ09OX09GRl9TU0lECQkJMTIKIAogI2RlZmluZSBXTEFOX0RJU0FTU09DX09GRl9SRUFTT04JCTAKIAogI2RlZmluZSBXTEFOX0FTU09DUkVRX09GRl9DQVBfSU5GTwkJMAotI2RlZmluZSBXTEFOX0FTU09DUkVRX09GRl9MSVNURU5fSU5UCQkyCisjZGVmaW5lIFdMQU5fQVNTT0NSRVFfT0ZGX0xJU1RFTl9pbnQJCTIKICNkZWZpbmUgV0xBTl9BU1NPQ1JFUV9PRkZfU1NJRAkJCTQKIAogI2RlZmluZSBXTEFOX0FTU09DUkVTUF9PRkZfQ0FQX0lORk8JCTAKQEAgLTE4OCw3ICsxODgsNyBAQAogI2RlZmluZSBXTEFOX0FTU09DUkVTUF9PRkZfU1VQUF9SQVRFUwkJNgogCiAjZGVmaW5lIFdMQU5fUkVBU1NPQ1JFUV9PRkZfQ0FQX0lORk8JCTAKLSNkZWZpbmUgV0xBTl9SRUFTU09DUkVRX09GRl9MSVNURU5fSU5UCQkyCisjZGVmaW5lIFdMQU5fUkVBU1NPQ1JFUV9PRkZfTElTVEVOX2ludAkJMgogI2RlZmluZSBXTEFOX1JFQVNTT0NSRVFfT0ZGX0NVUlJfQVAJCTQKICNkZWZpbmUgV0xBTl9SRUFTU09DUkVRX09GRl9TU0lECQkxMAogCkBAIC0yMDAsNyArMjAwLDcgQEAKICNkZWZpbmUgV0xBTl9QUk9CRVJFUV9PRkZfU1NJRAkJCTAKIAogI2RlZmluZSBXTEFOX1BST0JFUkVTUF9PRkZfVFMJCQkwCi0jZGVmaW5lIFdMQU5fUFJPQkVSRVNQX09GRl9CQ05fSU5UCQk4CisjZGVmaW5lIFdMQU5fUFJPQkVSRVNQX09GRl9CQ05faW50CQk4CiAjZGVmaW5lIFdMQU5fUFJPQkVSRVNQX09GRl9DQVBfSU5GTwkJMTAKICNkZWZpbmUgV0xBTl9QUk9CRVJFU1BfT0ZGX1NTSUQJCQkxMgogCkBAIC0yNDUsODIgKzI0NSw4MiBAQAogCiB0eXBlZGVmIHN0cnVjdCB3bGFuX2llCiB7Ci0JVUlOVDgJZWlkOwotCVVJTlQ4CWxlbjsKKwl1OAllaWQ7CisJdTgJbGVuOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyB3bGFuX2llX3Q7CiAKIC8qLS0gU2VydmljZSBTZXQgSWRlbnRpdHkgKFNTSUQpICAtLS0tLS0tLS0tLS0tLS0tLSovCiB0eXBlZGVmIHN0cnVjdCB3bGFuX2llX3NzaWQKIHsKLQlVSU5UOAllaWQ7Ci0JVUlOVDgJbGVuOwotCVVJTlQ4CXNzaWRbMV07ICAvKiBtYXkgYmUgemVybywgcHRycyBtYXkgb3ZlcmxhcCAqLworCXU4CWVpZDsKKwl1OAlsZW47CisJdTgJc3NpZFsxXTsgIC8qIG1heSBiZSB6ZXJvLCBwdHJzIG1heSBvdmVybGFwICovCiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIHdsYW5faWVfc3NpZF90OwogCiAvKi0tIFN1cHBvcnRlZCBSYXRlcyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogdHlwZWRlZiBzdHJ1Y3Qgd2xhbl9pZV9zdXBwX3JhdGVzCiB7Ci0JVUlOVDgJZWlkOwotCVVJTlQ4CWxlbjsKLQlVSU5UOAlyYXRlc1sxXTsgIC8qIGhhZCBiZXR0ZXIgYmUgYXQgTEVBU1Qgb25lISAqLworCXU4CWVpZDsKKwl1OAlsZW47CisJdTgJcmF0ZXNbMV07ICAvKiBoYWQgYmV0dGVyIGJlIGF0IExFQVNUIG9uZSEgKi8KIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gd2xhbl9pZV9zdXBwX3JhdGVzX3Q7CiAKIC8qLS0gRkggUGFyYW1ldGVyIFNldCAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiB0eXBlZGVmIHN0cnVjdCB3bGFuX2llX2ZoX3Bhcm1zCiB7Ci0JVUlOVDgJZWlkOwotCVVJTlQ4CWxlbjsKLQlVSU5UMTYJZHdlbGw7Ci0JVUlOVDgJaG9wc2V0OwotCVVJTlQ4CWhvcHBhdHRlcm47Ci0JVUlOVDgJaG9waW5kZXg7CisJdTgJZWlkOworCXU4CWxlbjsKKwl1MTYJZHdlbGw7CisJdTgJaG9wc2V0OworCXU4CWhvcHBhdHRlcm47CisJdTgJaG9waW5kZXg7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIHdsYW5faWVfZmhfcGFybXNfdDsKIAogLyotLSBEUyBQYXJhbWV0ZXIgU2V0ICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIHR5cGVkZWYgc3RydWN0IHdsYW5faWVfZHNfcGFybXMKIHsKLQlVSU5UOAllaWQ7Ci0JVUlOVDgJbGVuOwotCVVJTlQ4CWN1cnJfY2g7CisJdTgJZWlkOworCXU4CWxlbjsKKwl1OAljdXJyX2NoOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyB3bGFuX2llX2RzX3Bhcm1zX3Q7CiAKIC8qLS0gQ0YgUGFyYW1ldGVyIFNldCAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKIHR5cGVkZWYgc3RydWN0IHdsYW5faWVfY2ZfcGFybXMKIHsKLQlVSU5UOAllaWQ7Ci0JVUlOVDgJbGVuOwotCVVJTlQ4CWNmcF9jbnQ7Ci0JVUlOVDgJY2ZwX3BlcmlvZDsKLQlVSU5UMTYJY2ZwX21heGR1cjsKLQlVSU5UMTYJY2ZwX2R1cnJlbWFpbmluZzsKKwl1OAllaWQ7CisJdTgJbGVuOworCXU4CWNmcF9jbnQ7CisJdTgJY2ZwX3BlcmlvZDsKKwl1MTYJY2ZwX21heGR1cjsKKwl1MTYJY2ZwX2R1cnJlbWFpbmluZzsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gd2xhbl9pZV9jZl9wYXJtc190OwogCiAvKi0tIFRJTSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogdHlwZWRlZiBzdHJ1Y3Qgd2xhbl9pZV90aW0KIHsKLQlVSU5UOAllaWQ7Ci0JVUlOVDgJbGVuOwotCVVJTlQ4CWR0aW1fY250OwotCVVJTlQ4CWR0aW1fcGVyaW9kOwotCVVJTlQ4CWJpdG1hcF9jdGw7Ci0JVUlOVDgJdmlydF9ibVsxXTsKKwl1OAllaWQ7CisJdTgJbGVuOworCXU4CWR0aW1fY250OworCXU4CWR0aW1fcGVyaW9kOworCXU4CWJpdG1hcF9jdGw7CisJdTgJdmlydF9ibVsxXTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gd2xhbl9pZV90aW1fdDsKIAogLyotLSBJQlNTIFBhcmFtZXRlciBTZXQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIHR5cGVkZWYgc3RydWN0IHdsYW5faWVfaWJzc19wYXJtcwogewotCVVJTlQ4CWVpZDsKLQlVSU5UOAlsZW47Ci0JVUlOVDE2CWF0aW1fd2luOworCXU4CWVpZDsKKwl1OAlsZW47CisJdTE2CWF0aW1fd2luOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyB3bGFuX2llX2lic3NfcGFybXNfdDsKIAogLyotLSBDaGFsbGVuZ2UgVGV4dCAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIHR5cGVkZWYgc3RydWN0IHdsYW5faWVfY2hhbGxlbmdlCiB7Ci0JVUlOVDgJZWlkOwotCVVJTlQ4CWxlbjsKLQlVSU5UOAljaGFsbGVuZ2VbMV07CisJdTgJZWlkOworCXU4CWxlbjsKKwl1OAljaGFsbGVuZ2VbMV07CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIHdsYW5faWVfY2hhbGxlbmdlX3Q7CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCkBAIC0zMjksOSArMzI5LDkgQEAKIC8qIHByb3RvdHlwZSBzdHJ1Y3R1cmUsIGFsbCBtZ210IGZyYW1lIHR5cGVzIHdpbGwgc3RhcnQgd2l0aCB0aGVzZSBtZW1iZXJzICovCiB0eXBlZGVmIHN0cnVjdCB3bGFuX2ZyX21nbXQKIHsKLQlVSU5UMTYJCQl0eXBlOwotCVVJTlQxNgkJCWxlbjsJLyogRE9FUyBOT1QgaW5jbHVkZSBDUkMgISEhISovCi0JVUlOVDgJCQkqYnVmOworCXUxNgkJCXR5cGU7CisJdTE2CQkJbGVuOwkvKiBET0VTIE5PVCBpbmNsdWRlIENSQyAhISEhKi8KKwl1OAkJCSpidWY7CiAJcDgwMjExX2hkcl90CQkqaGRyOwogCS8qIHVzZWQgZm9yIHRhcmdldCBzcGVjaWZpYyBkYXRhLCBza2IgaW4gTGludXggKi8KIAl2b2lkCQkJKnByaXY7CkBAIC0zNDIsMTYgKzM0MiwxNiBAQAogLyotLSBCZWFjb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIHR5cGVkZWYgc3RydWN0IHdsYW5fZnJfYmVhY29uCiB7Ci0JVUlOVDE2CQkJdHlwZTsKLQlVSU5UMTYJCQlsZW47Ci0JVUlOVDgJCQkqYnVmOworCXUxNgkJCXR5cGU7CisJdTE2CQkJbGVuOworCXU4CQkJKmJ1ZjsKIAlwODAyMTFfaGRyX3QJCSpoZHI7CiAJLyogdXNlZCBmb3IgdGFyZ2V0IHNwZWNpZmljIGRhdGEsIHNrYiBpbiBMaW51eCAqLwogCXZvaWQJCQkqcHJpdjsKIAkvKi0tIGZpeGVkIGZpZWxkcyAtLS0tLS0tLS0tLSovCi0JVUlOVDY0CQkJKnRzOwotCVVJTlQxNgkJCSpiY25faW50OwotCVVJTlQxNgkJCSpjYXBfaW5mbzsKKwl1NjQJCQkqdHM7CisJdTE2CQkJKmJjbl9pbnQ7CisJdTE2CQkJKmNhcF9pbmZvOwogCS8qLS0gaW5mbyBlbGVtZW50cyAtLS0tLS0tLS0tKi8KIAl3bGFuX2llX3NzaWRfdAkJKnNzaWQ7CiAJd2xhbl9pZV9zdXBwX3JhdGVzX3QJKnN1cHBfcmF0ZXM7CkBAIC0zNjcsOSArMzY3LDkgQEAKIC8qLS0gSUJTUyBBVElNIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiB0eXBlZGVmIHN0cnVjdCB3bGFuX2ZyX2lic3NhdGltCiB7Ci0JVUlOVDE2CQkJdHlwZTsKLQlVSU5UMTYJCQlsZW47Ci0JVUlOVDgqCQkJYnVmOworCXUxNgkJCXR5cGU7CisJdTE2CQkJbGVuOworCXU4KgkJCWJ1ZjsKIAlwODAyMTFfaGRyX3QJCSpoZHI7CiAJLyogdXNlZCBmb3IgdGFyZ2V0IHNwZWNpZmljIGRhdGEsIHNrYiBpbiBMaW51eCAqLwogCXZvaWQJCQkqcHJpdjsKQEAgLTM4NCwxNCArMzg0LDE0IEBACiAvKi0tIERpc2Fzc29jaWF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogdHlwZWRlZiBzdHJ1Y3Qgd2xhbl9mcl9kaXNhc3NvYwogewotCVVJTlQxNgkJCXR5cGU7Ci0JVUlOVDE2CQkJbGVuOwotCVVJTlQ4CQkJKmJ1ZjsKKwl1MTYJCQl0eXBlOworCXUxNgkJCWxlbjsKKwl1OAkJCSpidWY7CiAJcDgwMjExX2hkcl90CQkqaGRyOwogCS8qIHVzZWQgZm9yIHRhcmdldCBzcGVjaWZpYyBkYXRhLCBza2IgaW4gTGludXggKi8KIAl2b2lkCQkJKnByaXY7CiAJLyotLSBmaXhlZCBmaWVsZHMgLS0tLS0tLS0tLS0qLwotCVVJTlQxNgkJCSpyZWFzb247CisJdTE2CQkJKnJlYXNvbjsKIAogCS8qLS0gaW5mbyBlbGVtZW50cyAtLS0tLS0tLS0tKi8KIApAQCAtNDAwLDE1ICs0MDAsMTUgQEAKIC8qLS0gQXNzb2NpYXRpb24gUmVxdWVzdCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiB0eXBlZGVmIHN0cnVjdCB3bGFuX2ZyX2Fzc29jcmVxCiB7Ci0JVUlOVDE2CQkJdHlwZTsKLQlVSU5UMTYJCQlsZW47Ci0JVUlOVDgqCQkJYnVmOworCXUxNgkJCXR5cGU7CisJdTE2CQkJbGVuOworCXU4KgkJCWJ1ZjsKIAlwODAyMTFfaGRyX3QJCSpoZHI7CiAJLyogdXNlZCBmb3IgdGFyZ2V0IHNwZWNpZmljIGRhdGEsIHNrYiBpbiBMaW51eCAqLwogCXZvaWQJCQkqcHJpdjsKIAkvKi0tIGZpeGVkIGZpZWxkcyAtLS0tLS0tLS0tLSovCi0JVUlOVDE2CQkJKmNhcF9pbmZvOwotCVVJTlQxNgkJCSpsaXN0ZW5faW50OworCXUxNgkJCSpjYXBfaW5mbzsKKwl1MTYJCQkqbGlzdGVuX2ludDsKIAkvKi0tIGluZm8gZWxlbWVudHMgLS0tLS0tLS0tLSovCiAJd2xhbl9pZV9zc2lkX3QJCSpzc2lkOwogCXdsYW5faWVfc3VwcF9yYXRlc190CSpzdXBwX3JhdGVzOwpAQCAtNDE4LDE2ICs0MTgsMTYgQEAKIC8qLS0gQXNzb2NpYXRpb24gUmVzcG9uc2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiB0eXBlZGVmIHN0cnVjdCB3bGFuX2ZyX2Fzc29jcmVzcAogewotCVVJTlQxNgkJCXR5cGU7Ci0JVUlOVDE2CQkJbGVuOwotCVVJTlQ4CQkJKmJ1ZjsKKwl1MTYJCQl0eXBlOworCXUxNgkJCWxlbjsKKwl1OAkJCSpidWY7CiAJcDgwMjExX2hkcl90CQkqaGRyOwogCS8qIHVzZWQgZm9yIHRhcmdldCBzcGVjaWZpYyBkYXRhLCBza2IgaW4gTGludXggKi8KIAl2b2lkCQkJKnByaXY7CiAJLyotLSBmaXhlZCBmaWVsZHMgLS0tLS0tLS0tLS0qLwotCVVJTlQxNgkJCSpjYXBfaW5mbzsKLQlVSU5UMTYJCQkqc3RhdHVzOwotCVVJTlQxNgkJCSphaWQ7CisJdTE2CQkJKmNhcF9pbmZvOworCXUxNgkJCSpzdGF0dXM7CisJdTE2CQkJKmFpZDsKIAkvKi0tIGluZm8gZWxlbWVudHMgLS0tLS0tLS0tLSovCiAJd2xhbl9pZV9zdXBwX3JhdGVzX3QJKnN1cHBfcmF0ZXM7CiAKQEAgLTQzNiwxNiArNDM2LDE2IEBACiAvKi0tIFJlYXNzb2NpYXRpb24gUmVxdWVzdCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogdHlwZWRlZiBzdHJ1Y3Qgd2xhbl9mcl9yZWFzc29jcmVxCiB7Ci0JVUlOVDE2CQkJdHlwZTsKLQlVSU5UMTYJCQlsZW47Ci0JVUlOVDgJCQkqYnVmOworCXUxNgkJCXR5cGU7CisJdTE2CQkJbGVuOworCXU4CQkJKmJ1ZjsKIAlwODAyMTFfaGRyX3QJCSpoZHI7CiAJLyogdXNlZCBmb3IgdGFyZ2V0IHNwZWNpZmljIGRhdGEsIHNrYiBpbiBMaW51eCAqLwogCXZvaWQJCQkqcHJpdjsKIAkvKi0tIGZpeGVkIGZpZWxkcyAtLS0tLS0tLS0tLSovCi0JVUlOVDE2CQkJKmNhcF9pbmZvOwotCVVJTlQxNgkJCSpsaXN0ZW5faW50OwotCVVJTlQ4CQkJKmN1cnJfYXA7CisJdTE2CQkJKmNhcF9pbmZvOworCXUxNgkJCSpsaXN0ZW5faW50OworCXU4CQkJKmN1cnJfYXA7CiAJLyotLSBpbmZvIGVsZW1lbnRzIC0tLS0tLS0tLS0qLwogCXdsYW5faWVfc3NpZF90CQkqc3NpZDsKIAl3bGFuX2llX3N1cHBfcmF0ZXNfdAkqc3VwcF9yYXRlczsKQEAgLTQ1NSwxNiArNDU1LDE2IEBACiAvKi0tIFJlYXNzb2NpYXRpb24gUmVzcG9uc2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogdHlwZWRlZiBzdHJ1Y3Qgd2xhbl9mcl9yZWFzc29jcmVzcAogewotCVVJTlQxNgkJCXR5cGU7Ci0JVUlOVDE2CQkJbGVuOwotCVVJTlQ4CQkJKmJ1ZjsKKwl1MTYJCQl0eXBlOworCXUxNgkJCWxlbjsKKwl1OAkJCSpidWY7CiAJcDgwMjExX2hkcl90CQkqaGRyOwogCS8qIHVzZWQgZm9yIHRhcmdldCBzcGVjaWZpYyBkYXRhLCBza2IgaW4gTGludXggKi8KIAl2b2lkCQkJKnByaXY7CiAJLyotLSBmaXhlZCBmaWVsZHMgLS0tLS0tLS0tLS0qLwotCVVJTlQxNgkJCSpjYXBfaW5mbzsKLQlVSU5UMTYJCQkqc3RhdHVzOwotCVVJTlQxNgkJCSphaWQ7CisJdTE2CQkJKmNhcF9pbmZvOworCXUxNgkJCSpzdGF0dXM7CisJdTE2CQkJKmFpZDsKIAkvKi0tIGluZm8gZWxlbWVudHMgLS0tLS0tLS0tLSovCiAJd2xhbl9pZV9zdXBwX3JhdGVzX3QJKnN1cHBfcmF0ZXM7CiAKQEAgLTQ3Myw5ICs0NzMsOSBAQAogLyotLSBQcm9iZSBSZXF1ZXN0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIHR5cGVkZWYgc3RydWN0IHdsYW5fZnJfcHJvYmVyZXEKIHsKLQlVSU5UMTYJCQl0eXBlOwotCVVJTlQxNgkJCWxlbjsKLQlVSU5UOAkJCSpidWY7CisJdTE2CQkJdHlwZTsKKwl1MTYJCQlsZW47CisJdTgJCQkqYnVmOwogCXA4MDIxMV9oZHJfdAkJKmhkcjsKIAkvKiB1c2VkIGZvciB0YXJnZXQgc3BlY2lmaWMgZGF0YSwgc2tiIGluIExpbnV4ICovCiAJdm9pZAkJCSpwcml2OwpAQCAtNDg5LDE2ICs0ODksMTYgQEAKIC8qLS0gUHJvYmUgUmVzcG9uc2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiB0eXBlZGVmIHN0cnVjdCB3bGFuX2ZyX3Byb2JlcmVzcAogewotCVVJTlQxNgkJCXR5cGU7Ci0JVUlOVDE2CQkJbGVuOwotCVVJTlQ4CQkJKmJ1ZjsKKwl1MTYJCQl0eXBlOworCXUxNgkJCWxlbjsKKwl1OAkJCSpidWY7CiAJcDgwMjExX2hkcl90CQkqaGRyOwogCS8qIHVzZWQgZm9yIHRhcmdldCBzcGVjaWZpYyBkYXRhLCBza2IgaW4gTGludXggKi8KIAl2b2lkCQkJKnByaXY7CiAJLyotLSBmaXhlZCBmaWVsZHMgLS0tLS0tLS0tLS0qLwotCVVJTlQ2NAkJCSp0czsKLQlVSU5UMTYJCQkqYmNuX2ludDsKLQlVSU5UMTYJCQkqY2FwX2luZm87CisJdTY0CQkJKnRzOworCXUxNgkJCSpiY25faW50OworCXUxNgkJCSpjYXBfaW5mbzsKIAkvKi0tIGluZm8gZWxlbWVudHMgLS0tLS0tLS0tLSovCiAJd2xhbl9pZV9zc2lkX3QJCSpzc2lkOwogCXdsYW5faWVfc3VwcF9yYXRlc190CSpzdXBwX3JhdGVzOwpAQCAtNTExLDE2ICs1MTEsMTYgQEAKIC8qLS0gQXV0aGVudGljYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiB0eXBlZGVmIHN0cnVjdCB3bGFuX2ZyX2F1dGhlbgogewotCVVJTlQxNgkJCXR5cGU7Ci0JVUlOVDE2CQkJbGVuOwotCVVJTlQ4CQkJKmJ1ZjsKKwl1MTYJCQl0eXBlOworCXUxNgkJCWxlbjsKKwl1OAkJCSpidWY7CiAJcDgwMjExX2hkcl90CQkqaGRyOwogCS8qIHVzZWQgZm9yIHRhcmdldCBzcGVjaWZpYyBkYXRhLCBza2IgaW4gTGludXggKi8KIAl2b2lkCQkJKnByaXY7CiAJLyotLSBmaXhlZCBmaWVsZHMgLS0tLS0tLS0tLS0qLwotCVVJTlQxNgkJCSphdXRoX2FsZzsKLQlVSU5UMTYJCQkqYXV0aF9zZXE7Ci0JVUlOVDE2CQkJKnN0YXR1czsKKwl1MTYJCQkqYXV0aF9hbGc7CisJdTE2CQkJKmF1dGhfc2VxOworCXUxNgkJCSpzdGF0dXM7CiAJLyotLSBpbmZvIGVsZW1lbnRzIC0tLS0tLS0tLS0qLwogCXdsYW5faWVfY2hhbGxlbmdlX3QJKmNoYWxsZW5nZTsKIApAQCAtNTI5LDE0ICs1MjksMTQgQEAKIC8qLS0gRGVhdXRoZW5pY2F0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIHR5cGVkZWYgc3RydWN0IHdsYW5fZnJfZGVhdXRoZW4KIHsKLQlVSU5UMTYJCQl0eXBlOwotCVVJTlQxNgkJCWxlbjsKLQlVSU5UOAkJCSpidWY7CisJdTE2CQkJdHlwZTsKKwl1MTYJCQlsZW47CisJdTgJCQkqYnVmOwogCXA4MDIxMV9oZHJfdAkJKmhkcjsKIAkvKiB1c2VkIGZvciB0YXJnZXQgc3BlY2lmaWMgZGF0YSwgc2tiIGluIExpbnV4ICovCiAJdm9pZAkJCSpwcml2OwogCS8qLS0gZml4ZWQgZmllbGRzIC0tLS0tLS0tLS0tKi8KLQlVSU5UMTYJCQkqcmVhc29uOworCXUxNgkJCSpyZWFzb247CiAKIAkvKi0tIGluZm8gZWxlbWVudHMgLS0tLS0tLS0tLSovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMW1vZC5jIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExbW9kLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyYzNmNjMuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExbW9kLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMTYgKzAsMCBAQAotLyogc3JjL3A4MDIxMS9wODAyMTFtb2QuYwotKgotKiBNb2R1bGUgZW50cnkgYW5kIGV4aXQgZm9yIHA4MDIxMQotKgotKiBDb3B5cmlnaHQgKEMpIDE5OTkgQWJzb2x1dGVWYWx1ZSBTeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKgotKiBsaW51eC13bGFuCi0qCi0qICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMKLSogICBMaWNlbnNlIFZlcnNpb24gMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwotKgotKiAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUwotKiAgIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlCi0qICAgdGVybXMgb2YgdGhlIEdOVSBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgKHRoZSAiR1BMIiksIGluIHdoaWNoCi0qICAgY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQgb2YgdGhlCi0qICAgYWJvdmUuICBJZiB5b3Ugd2lzaCB0byBhbGxvdyB0aGUgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUKLSogICBvbmx5IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR1BMIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvIHVzZQotKiAgIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIE1QTCwgaW5kaWNhdGUgeW91ciBkZWNpc2lvbgotKiAgIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlCi0qICAgYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTC4gIElmIHlvdSBkbyBub3QgZGVsZXRlCi0qICAgdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMKLSogICBmaWxlIHVuZGVyIGVpdGhlciB0aGUgTVBMIG9yIHRoZSBHUEwuCi0qCi0qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qCi0qIElucXVpcmllcyByZWdhcmRpbmcgdGhlIGxpbnV4LXdsYW4gT3BlbiBTb3VyY2UgcHJvamVjdCBjYW4gYmUKLSogbWFkZSBkaXJlY3RseSB0bzoKLSoKLSogQWJzb2x1dGVWYWx1ZSBTeXN0ZW1zIEluYy4KLSogaW5mb0BsaW51eC13bGFuLmNvbQotKiBodHRwOi8vd3d3LmxpbnV4LXdsYW4uY29tCi0qCi0qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qCi0qIFBvcnRpb25zIG9mIHRoZSBkZXZlbG9wbWVudCBvZiB0aGlzIHNvZnR3YXJlIHdlcmUgZnVuZGVkIGJ5Ci0qIEludGVyc2lsIENvcnBvcmF0aW9uIGFzIHBhcnQgb2YgUFJJU00oUikgY2hpcHNldCBwcm9kdWN0IGRldmVsb3BtZW50LgotKgotKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKgotKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIHA4MDIxMS5vIGVudHJ5IGFuZCBleGl0IHBvaW50cyBkZWZpbmVkIGZvciBsaW51eAotKiBrZXJuZWwgbW9kdWxlcy4KLSoKLSogTm90ZXM6Ci0qIC0gYWxsIG1vZHVsZSBwYXJhbWV0ZXJzIGZvciAgcDgwMjExLm8gc2hvdWxkIGJlIGRlZmluZWQgaGVyZS4KLSoKLSogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSovCi0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0vKiBTeXN0ZW0gSW5jbHVkZXMgKi8KLQotCi0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDQsMjUpKQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgotCi0jaW5jbHVkZSAidmVyc2lvbi5oIgotI2luY2x1ZGUgIndsYW5fY29tcGF0LmgiCi0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0vKiBQcm9qZWN0IEluY2x1ZGVzICovCi0KLSNpbmNsdWRlICJwODAyMTF0eXBlcy5oIgotI2luY2x1ZGUgInA4MDIxMWhkci5oIgotI2luY2x1ZGUgInA4MDIxMW1nbXQuaCIKLSNpbmNsdWRlICJwODAyMTFjb252LmgiCi0jaW5jbHVkZSAicDgwMjExbXNnLmgiCi0jaW5jbHVkZSAicDgwMjExbmV0ZGV2LmgiCi0jaW5jbHVkZSAicDgwMjExcmVxLmgiCi0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0vKiBMb2NhbCBDb25zdGFudHMgKi8KLQotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotLyogTG9jYWwgTWFjcm9zICovCi0KLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLS8qIExvY2FsIFR5cGVzICovCi0KLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLS8qIExvY2FsIFN0YXRpYyBEZWZpbml0aW9ucyAqLwotCi1zdGF0aWMgY2hhciAqdmVyc2lvbiA9ICJwODAyMTEubzogIiBXTEFOX1JFTEVBU0U7Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIC0tTW9kdWxlIFBhcmFtZXRlcnMgKi8KLQotaW50IHdsYW5fd2F0Y2hkb2cgPSA1MDAwOwotbW9kdWxlX3BhcmFtKHdsYW5fd2F0Y2hkb2csIGludCwgMDY0NCk7Ci1NT0RVTEVfUEFSTV9ERVNDKHdsYW5fd2F0Y2hkb2csICJ0cmFuc21pdCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcyIpOwotCi1pbnQgd2xhbl93ZXh0X3dyaXRlID0gMDsKLSNpZiBXSVJFTEVTU19FWFQgPiAxMgotbW9kdWxlX3BhcmFtKHdsYW5fd2V4dF93cml0ZSwgaW50LCAwNjQ0KTsKLU1PRFVMRV9QQVJNX0RFU0Mod2xhbl93ZXh0X3dyaXRlLCAiZW5hYmxlIHdyaXRlIHdpcmVsZXNzIGV4dGVuc2lvbnMiKTsKLSNlbmRpZgotCi0jaWZkZWYgV0xBTl9JTkNMVURFX0RFQlVHCi1pbnQgd2xhbl9kZWJ1Zz0wOwotbW9kdWxlX3BhcmFtKHdsYW5fZGVidWcsIGludCwgMDY0NCk7Ci1NT0RVTEVfUEFSTV9ERVNDKHdsYW5fZGVidWcsICJwODAyMTEgZGVidWcgbGV2ZWwiKTsKLSNlbmRpZgotCi1NT0RVTEVfTElDRU5TRSgiRHVhbCBNUEwvR1BMIik7Ci0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0vKiBMb2NhbCBGdW5jdGlvbiBEZWNsYXJhdGlvbnMgKi8KLQotaW50CWluaXRfbW9kdWxlKHZvaWQpOwotdm9pZAljbGVhbnVwX21vZHVsZSh2b2lkKTsKLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLS8qIEZ1bmN0aW9uIERlZmluaXRpb25zICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBpbml0X21vZHVsZQotKgotKiBNb2R1bGUgaW5pdGlhbGl6YXRpb24gcm91dGluZSwgY2FsbGVkIG9uY2UgYXQgbW9kdWxlIGxvYWQgdGltZS4KLSoKLSogQXJndW1lbnRzOgotKglub25lCi0qCi0qIFJldHVybnM6Ci0qCTAJLSBzdWNjZXNzCi0qCX4wCS0gZmFpbHVyZSwgbW9kdWxlIGlzIHVubG9hZGVkLgotKgotKiBTaWRlIGVmZmVjdHM6Ci0qCVRPRE86IGRlZmluZQotKgotKiBDYWxsIGNvbnRleHQ6Ci0qCXByb2Nlc3MgdGhyZWFkIChpbnNtb2Qgb3IgbW9kcHJvYmUpCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCBpbml0X21vZHVsZSh2b2lkKQotewotICAgICAgICBEQkZFTlRFUjsKLQotI2lmIDAKLSAgICAgICAgcHJpbnRrKEtFUk5fTk9USUNFICIlcyAoJXMpIExvYWRlZFxuIiwgdmVyc2lvbiwgV0xBTl9CVUlMRF9EQVRFKTsKLSNlbmRpZgotCi0JcDgwMjExbmV0ZGV2X3N0YXJ0dXAoKTsKLSNpZmRlZiBDT05GSUdfSE9UUExVRwotCXA4MDIxMV9ydW5fc2Jpbl9ob3RwbHVnKE5VTEwsIFdMQU5fSE9UUExVR19TVEFSVFVQKTsKLSNlbmRpZgotCi0gICAgICAgIERCRkVYSVQ7Ci0gICAgICAgIHJldHVybiAwOwotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBjbGVhbnVwX21vZHVsZQotKgotKiBDYWxsZWQgYXQgbW9kdWxlIHVubG9hZCB0aW1lLiAgVGhpcyBpcyBvdXIgbGFzdCBjaGFuY2UgdG8KLSogY2xlYW4gdXAgYWZ0ZXIgb3Vyc2VsdmVzLgotKgotKiBBcmd1bWVudHM6Ci0qCW5vbmUKLSoKLSogUmV0dXJuczoKLSoJbm90aGluZwotKgotKiBTaWRlIGVmZmVjdHM6Ci0qCVRPRE86IGRlZmluZQotKgotKiBDYWxsIGNvbnRleHQ6Ci0qCXByb2Nlc3MgdGhyZWFkCi0qCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXZvaWQgY2xlYW51cF9tb2R1bGUodm9pZCkKLXsKLSAgICAgICAgREJGRU5URVI7Ci0KLSNpZmRlZiBDT05GSUdfSE9UUExVRwotCXA4MDIxMV9ydW5fc2Jpbl9ob3RwbHVnKE5VTEwsIFdMQU5fSE9UUExVR19TSFVURE9XTik7Ci0jZW5kaWYKLQlwODAyMTFuZXRkZXZfc2h1dGRvd24oKTsKLSAgICAgICAgcHJpbnRrKEtFUk5fTk9USUNFICIlcyBVbmxvYWRlZFxuIiwgdmVyc2lvbik7Ci0KLSAgICAgICAgREJGRVhJVDsKLSAgICAgICAgcmV0dXJuOwotfQotCi1FWFBPUlRfU1lNQk9MKHA4MDIxMW5ldGRldl9od3JlbW92ZWQpOwotRVhQT1JUX1NZTUJPTChyZWdpc3Rlcl93bGFuZGV2KTsKLUVYUE9SVF9TWU1CT0wocDgwMjExbmV0ZGV2X3J4KTsKLUVYUE9SVF9TWU1CT0wodW5yZWdpc3Rlcl93bGFuZGV2KTsKLUVYUE9SVF9TWU1CT0wod2xhbl9zZXR1cCk7Ci1FWFBPUlRfU1lNQk9MKHdsYW5fdW5zZXR1cCk7Ci1FWFBPUlRfU1lNQk9MKHA4MDIxMV9zdXNwZW5kKTsKLUVYUE9SVF9TWU1CT0wocDgwMjExX3Jlc3VtZSk7Ci0KLUVYUE9SVF9TWU1CT0wocDgwMjExc2tiX2ZyZWUpOwotRVhQT1JUX1NZTUJPTChwODAyMTFza2JfcnhtZXRhX2F0dGFjaCk7Ci0KLUVYUE9SVF9TWU1CT0wocDgwMjExd2V4dF9ldmVudF9hc3NvY2lhdGVkKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMW1zZy5oIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExbXNnLmgKaW5kZXggYzE0ZTlmYi4uM2E1NzVkOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExbXNnLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExbXNnLmgKQEAgLTc4LDE3ICs3OCwxNyBAQAogCiB0eXBlZGVmIHN0cnVjdCBwODAyMTFtc2cKIHsKLQlVSU5UMzIJbXNnY29kZTsKLQlVSU5UMzIJbXNnbGVuOwotCVVJTlQ4CWRldm5hbWVbV0xBTl9ERVZOQU1FTEVOX01BWF07CisJdTMyCW1zZ2NvZGU7CisJdTMyCW1zZ2xlbjsKKwl1OAlkZXZuYW1lW1dMQU5fREVWTkFNRUxFTl9NQVhdOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBwODAyMTFtc2dfdDsKIAogdHlwZWRlZiBzdHJ1Y3QgcDgwMjExbXNnZAogewotCVVJTlQzMgltc2djb2RlOwotCVVJTlQzMgltc2dsZW47Ci0JVUlOVDgJZGV2bmFtZVtXTEFOX0RFVk5BTUVMRU5fTUFYXTsKLQlVSU5UOAlhcmdzWzBdOworCXUzMgltc2djb2RlOworCXUzMgltc2dsZW47CisJdTgJZGV2bmFtZVtXTEFOX0RFVk5BTUVMRU5fTUFYXTsKKwl1OAlhcmdzWzBdOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBwODAyMTFtc2dkX3Q7CiAKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFuZXRkZXYuYyBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMW5ldGRldi5jCmluZGV4IDJiNzA1ZWEuLjU5ZTVhZDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMW5ldGRldi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMW5ldGRldi5jCkBAIC03OSwxNSArNzksMTIgQEAKICNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CiAjZW5kaWYKIAotI2lmIFdJUkVMRVNTX0VYVCA+IDEyCiAjaW5jbHVkZSA8bmV0L2l3X2hhbmRsZXIuaD4KLSNlbmRpZgogI2luY2x1ZGUgPG5ldC9uZXRfbmFtZXNwYWNlLmg+CiAKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAvKiBQcm9qZWN0IEluY2x1ZGVzICovCiAKLSNpbmNsdWRlICJ2ZXJzaW9uLmgiCiAjaW5jbHVkZSAid2xhbl9jb21wYXQuaCIKICNpbmNsdWRlICJwODAyMTF0eXBlcy5oIgogI2luY2x1ZGUgInA4MDIxMWhkci5oIgpAQCAtMTExLDE1ICsxMDgsNiBAQAogLyogTG9jYWwgVHlwZXMgKi8KIAogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLS8qIExvY2FsIFN0YXRpYyBEZWZpbml0aW9ucyAqLwotCi0jZGVmaW5lIF9fTk9fVkVSU0lPTl9fCQkvKiBwcmV2ZW50IHRoZSBzdGF0aWMgZGVmaW5pdGlvbiAqLwotCi0jaWZkZWYgQ09ORklHX1BST0NfRlMKLXN0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkJKnByb2NfcDgwMjExOwotI2VuZGlmCi0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAvKiBMb2NhbCBGdW5jdGlvbiBEZWNsYXJhdGlvbnMgKi8KIAogLyogU3VwcG9ydCBmdW5jdGlvbnMgKi8KQEAgLTEzNSw3NSArMTIzLDI2IEBACiBzdGF0aWMgaW50IHA4MDIxMWtuZXRkZXZfZG9faW9jdGwobmV0ZGV2aWNlX3QgKmRldiwgc3RydWN0IGlmcmVxICppZnIsIGludCBjbWQpOwogc3RhdGljIGludCBwODAyMTFrbmV0ZGV2X3NldF9tYWNfYWRkcmVzcyhuZXRkZXZpY2VfdCAqZGV2LCB2b2lkICphZGRyKTsKIHN0YXRpYyB2b2lkIHA4MDIxMWtuZXRkZXZfdHhfdGltZW91dChuZXRkZXZpY2VfdCAqbmV0ZGV2KTsKLXN0YXRpYyBpbnQgcDgwMjExX3J4X3R5cGVkcm9wKCB3bGFuZGV2aWNlX3QgKndsYW5kZXYsIFVJTlQxNiBmYyk7CitzdGF0aWMgaW50IHA4MDIxMV9yeF90eXBlZHJvcCggd2xhbmRldmljZV90ICp3bGFuZGV2LCB1MTYgZmMpOwogCi0jaWZkZWYgQ09ORklHX1BST0NfRlMKLXN0YXRpYyBpbnQKLXA4MDIxMW5ldGRldl9wcm9jX3JlYWQoCi0JY2hhcgkqcGFnZSwKLQljaGFyCSoqc3RhcnQsCi0Jb2ZmX3QJb2Zmc2V0LAotCWludAljb3VudCwKLQlpbnQJKmVvZiwKLQl2b2lkCSpkYXRhKTsKK2ludCB3bGFuX3dhdGNoZG9nID0gNTAwMDsKK21vZHVsZV9wYXJhbSh3bGFuX3dhdGNoZG9nLCBpbnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyh3bGFuX3dhdGNoZG9nLCAidHJhbnNtaXQgdGltZW91dCBpbiBtaWxsaXNlY29uZHMiKTsKKworaW50IHdsYW5fd2V4dF93cml0ZSA9IDE7Cittb2R1bGVfcGFyYW0od2xhbl93ZXh0X3dyaXRlLCBpbnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyh3bGFuX3dleHRfd3JpdGUsICJlbmFibGUgd3JpdGUgd2lyZWxlc3MgZXh0ZW5zaW9ucyIpOworCisjaWZkZWYgV0xBTl9JTkNMVURFX0RFQlVHCitpbnQgd2xhbl9kZWJ1Zz0wOworbW9kdWxlX3BhcmFtKHdsYW5fZGVidWcsIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKHdsYW5fZGVidWcsICJwODAyMTEgZGVidWcgbGV2ZWwiKTsKICNlbmRpZgogCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogLyogRnVuY3Rpb24gRGVmaW5pdGlvbnMgKi8KIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIHA4MDIxMWtuZXRkZXZfc3RhcnR1cAotKgotKiBJbml0aWFsaXplIHRoZSB3bGFuZGV2aWNlL25ldGRldmljZSBwYXJ0IG9mIDgwMi4xMSBzZXJ2aWNlcyBhdAotKiBsb2FkIHRpbWUuCi0qCi0qIEFyZ3VtZW50czoKLSoJbm9uZQotKgotKiBSZXR1cm5zOgotKglub3RoaW5nCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXZvaWQgcDgwMjExbmV0ZGV2X3N0YXJ0dXAodm9pZCkKLXsKLQlEQkZFTlRFUjsKLQotI2lmZGVmIENPTkZJR19QUk9DX0ZTCi0JaWYgKGluaXRfbmV0LnByb2NfbmV0ICE9IE5VTEwpIHsKLQkJcHJvY19wODAyMTEgPSBjcmVhdGVfcHJvY19lbnRyeSgKLQkJCQkicDgwMjExIiwKLQkJCQkoU19JRkRJUnxTX0lSVUdPfFNfSVhVR08pLAotCQkJCWluaXRfbmV0LnByb2NfbmV0KTsKLQl9Ci0jZW5kaWYKLQlEQkZFWElUOwotCXJldHVybjsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIHA4MDIxMWtuZXRkZXZfc2h1dGRvd24KLSoKLSogU2h1dGRvd24gdGhlIHdsYW5kZXZpY2UvbmV0ZGV2aWNlIHBhcnQgb2YgODAyLjExIHNlcnZpY2VzIGF0Ci0qIHVubG9hZCB0aW1lLgotKgotKiBBcmd1bWVudHM6Ci0qCW5vbmUKLSoKLSogUmV0dXJuczoKLSoJbm90aGluZwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi12b2lkCi1wODAyMTFuZXRkZXZfc2h1dGRvd24odm9pZCkKLXsKLQlEQkZFTlRFUjsKLSNpZmRlZiBDT05GSUdfUFJPQ19GUwotCWlmIChwcm9jX3A4MDIxMSAhPSBOVUxMKSB7Ci0JCXJlbW92ZV9wcm9jX2VudHJ5KCJwODAyMTEiLCBpbml0X25ldC5wcm9jX25ldCk7Ci0JfQotI2VuZGlmCi0JREJGRVhJVDsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIHA4MDIxMWtuZXRkZXZfaW5pdAogKgogKiBJbml0IG1ldGhvZCBmb3IgYSBMaW51eCBuZXRkZXZpY2UuICBDYWxsZWQgaW4gcmVzcG9uc2UgdG8KQEAgLTI4NSwxMCArMjI0LDcgQEAKIAlpZiAoIHdsYW5kZXYtPm9wZW4gIT0gTlVMTCkgewogCQlyZXN1bHQgPSB3bGFuZGV2LT5vcGVuKHdsYW5kZXYpOwogCQlpZiAoIHJlc3VsdCA9PSAwICkgewotI2lmICggTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiwzLDQzKSApCi0JCQluZXRkZXYtPmludGVycnVwdCA9IDA7Ci0jZW5kaWYKLQkJCXA4MDIxMW5ldGRldl9zdGFydF9xdWV1ZSh3bGFuZGV2KTsKKwkJCW5ldGlmX3N0YXJ0X3F1ZXVlKHdsYW5kZXYtPm5ldGRldik7CiAJCQl3bGFuZGV2LT5zdGF0ZSA9IFdMQU5fREVWSUNFX09QRU47CiAJCX0KIAl9IGVsc2UgewpAQCAtMzIzLDcgKzI1OSw3IEBACiAJCXJlc3VsdCA9IHdsYW5kZXYtPmNsb3NlKHdsYW5kZXYpOwogCX0KIAotCXA4MDIxMW5ldGRldl9zdG9wX3F1ZXVlKHdsYW5kZXYpOworCW5ldGlmX3N0b3BfcXVldWUod2xhbmRldi0+bmV0ZGV2KTsKIAl3bGFuZGV2LT5zdGF0ZSA9IFdMQU5fREVWSUNFX0NMT1NFRDsKIAogCURCRkVYSVQ7CkBAIC0zNzYsNyArMzEyLDcgQEAKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gTlVMTDsKIAluZXRkZXZpY2VfdCAgICAgKmRldiA9IHdsYW5kZXYtPm5ldGRldjsKIAlwODAyMTFfaGRyX2EzX3QgKmhkcjsKLQlVSU5UMTYgZmM7CisJdTE2IGZjOwogCiAgICAgICAgIERCRkVOVEVSOwogCkBAIC00NzgsMTUgKzQxNCw2IEBACiAJbWVtc2V0KCZwODAyMTFfaGRyLCAwLCBzaXplb2YocDgwMjExX2hkcl90KSk7CiAJbWVtc2V0KCZwODAyMTFfd2VwLCAwLCBzaXplb2YocDgwMjExX21ldGF3ZXBfdCkpOwogCi0jaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsMywzOCkgKQotCWlmICggdGVzdF9hbmRfc2V0X2JpdCgwLCAodm9pZCopJihuZXRkZXYtPnRidXN5KSkgIT0gMCApIHsKLQkJLyogV2UndmUgYmVlbiBjYWxsZWQgdy8gdGJ1c3kgc2V0LCBoYXMgdGhlIHR4ICovCi0JCS8qIHBhdGggc3RhbGxlZD8gICAqLwotCQlXTEFOX0xPR19ERUJVRygxLCAiY2FsbGVkIHdoZW4gdGJ1c3kgc2V0XG4iKTsKLQkJcmVzdWx0ID0gMTsKLQkJZ290byBmYWlsZWQ7Ci0JfQotI2Vsc2UKIAlpZiAoIG5ldGlmX3F1ZXVlX3N0b3BwZWQobmV0ZGV2KSApIHsKIAkJV0xBTl9MT0dfREVCVUcoMSwgImNhbGxlZCB3aGVuIHF1ZXVlIHN0b3BwZWQuXG4iKTsKIAkJcmVzdWx0ID0gMTsKQEAgLTQ5NSwxMiArNDIyLDYgQEAKIAogCW5ldGlmX3N0b3BfcXVldWUobmV0ZGV2KTsKIAotCS8qIE5vIHRpbWVvdXQgaGFuZGxpbmcgaGVyZSwgMi4zLjM4KyBrZXJuZWxzIGNhbGwgdGhlCi0JICogdGltZW91dCBmdW5jdGlvbiBkaXJlY3RseS4KLQkgKiBUT0RPOiBBZGQgdGltZW91dCBoYW5kbGluZy4KLQkqLwotI2VuZGlmCi0KIAkvKiBDaGVjayB0byBzZWUgdGhhdCBhIHZhbGlkIG1vZGUgaXMgc2V0ICovCiAJc3dpdGNoKCB3bGFuZGV2LT5tYWNtb2RlICkgewogCWNhc2UgV0xBTl9NQUNNT0RFX0lCU1NfU1RBOgpAQCAtNTEzLDcgKzQzNCw3IEBACiAJCSAqIFRPRE86IHdlIG5lZWQgYSBzYW5lciB3YXkgdG8gaGFuZGxlIHRoaXMKIAkJICovCiAJCWlmKHNrYi0+cHJvdG9jb2wgIT0gRVRIX1BfODAyMTFfUkFXKSB7Ci0JCQlwODAyMTFuZXRkZXZfc3RhcnRfcXVldWUod2xhbmRldik7CisJCQluZXRpZl9zdGFydF9xdWV1ZSh3bGFuZGV2LT5uZXRkZXYpOwogCQkJV0xBTl9MT0dfTk9USUNFKAogCQkJCSJUeCBhdHRlbXB0IHByaW9yIHRvIGFzc29jaWF0aW9uLCBmcmFtZSBkcm9wcGVkLlxuIik7CiAJCQl3bGFuZGV2LT5saW51eF9zdGF0cy50eF9kcm9wcGVkKys7CkBAIC01NTcsNyArNDc4LDcgQEAKIAlpZiAoIHR4cmVzdWx0ID09IDApIHsKIAkJLyogc3VjY2VzcyBhbmQgbW9yZSBidWYgKi8KIAkJLyogYXZhaWwsIHJlOiBod190eGRhdGEgKi8KLQkJcDgwMjExbmV0ZGV2X3dha2VfcXVldWUod2xhbmRldik7CisJCW5ldGlmX3dha2VfcXVldWUod2xhbmRldi0+bmV0ZGV2KTsKIAkJcmVzdWx0ID0gMDsKIAl9IGVsc2UgaWYgKCB0eHJlc3VsdCA9PSAxICkgewogCQkvKiBzdWNjZXNzLCBubyBtb3JlIGF2YWlsICovCkBAIC02MTksNyArNTQwLDcgQEAKIAogc3RhdGljIGludCBwODAyMTFuZXRkZXZfZXRodG9vbCh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHZvaWQgX191c2VyICp1c2VyYWRkcikKIHsKLQlVSU5UMzIgZXRoY21kOworCXUzMiBldGhjbWQ7CiAJc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyBpbmZvOwogCXN0cnVjdCBldGh0b29sX3ZhbHVlIGVkYXRhOwogCkBAIC02ODYsNyArNjA3LDcgQEAKICoJCS1FRkFVTFQgbWVtb3J5IGZhdWx0IGNvcHlpbmcgbXNnIGZyb20gdXNlciBidWZmZXIKICoJCS1FTk9NRU0gdW5hYmxlIHRvIGFsbG9jYXRlIGtlcm5lbCBtc2cgYnVmZmVyCiAqCQktRU5PU1lTCWJhZCBtYWdpYywgaXQgdGhlIGNtZCByZWFsbHkgZm9yIHVzPwotKgkJLUVJTlRSCXNsZWVwaW5nIG9uIGNtZCwgYXdha2VuZWQgYnkgc2lnbmFsLCBjbWQgY2FuY2VsbGVkLgorKgkJLUVpbnRSCXNsZWVwaW5nIG9uIGNtZCwgYXdha2VuZWQgYnkgc2lnbmFsLCBjbWQgY2FuY2VsbGVkLgogKgogKiBDYWxsIENvbnRleHQ6CiAqCVByb2Nlc3MgdGhyZWFkIChpb2N0bCBjYWxsZXIpLiAgVE9ETzogU01QIHN1cHBvcnQgbWF5IHJlcXVpcmUKQEAgLTY5NywyMSArNjE4LDExIEBACiAJaW50CQkJcmVzdWx0ID0gMDsKIAlwODAyMTFpb2N0bF9yZXFfdAkqcmVxID0gKHA4MDIxMWlvY3RsX3JlcV90KilpZnI7CiAJd2xhbmRldmljZV90CQkqd2xhbmRldiA9IGRldi0+bWxfcHJpdjsKLQlVSU5UOAkJCSptc2didWY7CisJdTgJCQkqbXNnYnVmOwogCURCRkVOVEVSOwogCiAJV0xBTl9MT0dfREVCVUcoMiwgInJ4J2QgaW9jdGwsIGNtZD0lZCwgbGVuPSVkXG4iLCBjbWQsIHJlcS0+bGVuKTsKIAotI2lmIFdJUkVMRVNTX0VYVCA8IDEzCi0JLyogSXMgdGhpcyBhIHdpcmVsZXNzIGV4dGVuc2lvbnMgaW9jdGw/ICovCi0JaWYgKChjbWQgPj0gU0lPQ0lXRklSU1QpICYmIChjbWQgPD0gU0lPQ0lXTEFTVCkpIHsKLQkJaWYgKChyZXN1bHQgPSBwODAyMTF3ZXh0X3N1cHBvcnRfaW9jdGwoZGV2LCBpZnIsIGNtZCkpCi0JCSAgICAhPSAoLUVPUE5PVFNVUFApKSB7Ci0JCQlnb3RvIGJhaWw7Ci0JCX0KLQl9Ci0jZW5kaWYKLQogI2lmZGVmIFNJT0NFVEhUT09MCiAJaWYgKGNtZCA9PSBTSU9DRVRIVE9PTCkgewogCQlyZXN1bHQgPSBwODAyMTFuZXRkZXZfZXRodG9vbCh3bGFuZGV2LCAodm9pZCBfX3VzZXIgKikgaWZyLT5pZnJfZGF0YSk7CkBAIC03OTIsMTUgKzcwMyw5IEBACiAKIAlEQkZFTlRFUjsKIAkvKiBJZiB3ZSdyZSBydW5uaW5nLCB3ZSBkb24ndCBhbGxvdyBNQUMgYWRkcmVzcyBjaGFuZ2VzICovCi0jaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsMywzOCkgKQotCWlmICggZGV2LT5zdGFydCkgewotCQlyZXR1cm4gLUVCVVNZOwotCX0KLSNlbHNlCiAJaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSkgewogCQlyZXR1cm4gLUVCVVNZOwogCX0KLSNlbmRpZgogCiAJLyogU2V0IHVwIHNvbWUgY29udmVuaWVuY2UgcG9pbnRlcnMuICovCiAJbWliYXR0ciA9ICZkb3QxMXJlcS5taWJhdHRyaWJ1dGU7CkBAIC04MzMsNyArNzM4LDcgQEAKIAlyZXN1bHRjb2RlLT5kYXRhID0gMDsKIAogCS8qIG5vdyBmaXJlIHRoZSByZXF1ZXN0ICovCi0JcmVzdWx0ID0gcDgwMjExcmVxX2RvcmVxdWVzdChkZXYtPm1sX3ByaXYsIChVSU5UOCAqKSZkb3QxMXJlcSk7CisJcmVzdWx0ID0gcDgwMjExcmVxX2RvcmVxdWVzdChkZXYtPm1sX3ByaXYsICh1OCAqKSZkb3QxMXJlcSk7CiAKIAkvKiBJZiB0aGUgcmVxdWVzdCB3YXNuJ3Qgc3VjY2Vzc2Z1bCwgcmVwb3J0IGFuIGVycm9yIGFuZCBkb24ndAogCSAqIGNoYW5nZSB0aGUgbmV0ZGV2IGFkZHJlc3MKQEAgLTkwOSwxMyArODE0LDExIEBACiAJCSAgICAgKHVuc2lnbmVkIGxvbmcpd2xhbmRldik7CiAKIAkvKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSB0aGUgc3RydWN0IGRldmljZSAqLwotCWRldiA9IGttYWxsb2Moc2l6ZW9mKG5ldGRldmljZV90KSwgR0ZQX0FUT01JQyk7CisJZGV2ID0gYWxsb2NfbmV0ZGV2KDAsIndsYW4lZCIsZXRoZXJfc2V0dXApOwogCWlmICggZGV2ID09IE5VTEwgKSB7CiAJCVdMQU5fTE9HX0VSUk9SKCJGYWlsZWQgdG8gYWxsb2MgbmV0ZGV2LlxuIik7CiAJCXJlc3VsdCA9IDE7CiAJfSBlbHNlIHsKLQkJbWVtc2V0KCBkZXYsIDAsIHNpemVvZihuZXRkZXZpY2VfdCkpOwotCQlldGhlcl9zZXR1cChkZXYpOwogCQl3bGFuZGV2LT5uZXRkZXYgPSBkZXY7CiAJCWRldi0+bWxfcHJpdiA9IHdsYW5kZXY7CiAJCWRldi0+aGFyZF9zdGFydF94bWl0ID0JcDgwMjExa25ldGRldl9oYXJkX3N0YXJ0X3htaXQ7CkBAIC05MzAsMjEgKzgzMywxMiBAQAogCQlkZXYtPm9wZW4gPQkJcDgwMjExa25ldGRldl9vcGVuOwogCQlkZXYtPnN0b3AgPQkJcDgwMjExa25ldGRldl9zdG9wOwogCi0jaWZkZWYgQ09ORklHX05FVF9XSVJFTEVTUwotI2lmICgoV0lSRUxFU1NfRVhUIDwgMTcpICYmIChXSVJFTEVTU19FWFQgPCAyMSkpCisjaWYgKFdJUkVMRVNTX0VYVCA8IDIxKQogCQlkZXYtPmdldF93aXJlbGVzc19zdGF0cyA9IHA4MDIxMXdleHRfZ2V0X3dpcmVsZXNzX3N0YXRzOwogI2VuZGlmCi0jaWYgV0lSRUxFU1NfRVhUID4gMTIKIAkJZGV2LT53aXJlbGVzc19oYW5kbGVycyA9ICZwODAyMTF3ZXh0X2hhbmRsZXJfZGVmOwotI2VuZGlmCi0jZW5kaWYKIAotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDMsMzgpICkKLQkJZGV2LT50YnVzeSA9IDE7Ci0JCWRldi0+c3RhcnQgPSAwOwotI2Vsc2UKIAkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOwotI2VuZGlmCiAjaWZkZWYgSEFWRV9DSEFOR0VfTVRVCiAJCWRldi0+Y2hhbmdlX210dSA9IHdsYW5fY2hhbmdlX210dTsKICNlbmRpZgpAQCAtMTAyNyw0NCArOTIxLDEyIEBACiBpbnQgcmVnaXN0ZXJfd2xhbmRldih3bGFuZGV2aWNlX3QgKndsYW5kZXYpCiB7CiAJaW50CQlpID0gMDsKLQluZXRkZXZpY2VfdAkqZGV2ID0gd2xhbmRldi0+bmV0ZGV2OwogCiAJREJGRU5URVI7CiAKLQlpID0gZGV2X2FsbG9jX25hbWUod2xhbmRldi0+bmV0ZGV2LCAid2xhbiVkIik7Ci0JaWYgKGkgPj0gMCkgewotCQlpID0gcmVnaXN0ZXJfbmV0ZGV2KHdsYW5kZXYtPm5ldGRldik7Ci0JfQotCWlmIChpICE9IDApIHsKLQkJcmV0dXJuIC1FSU87Ci0JfQotCi0jaWYgKCBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDQsMCkgKQotCWRldi0+bmFtZSA9IHdsYW5kZXYtPm5hbWU7Ci0jZWxzZQotCXN0cmNweSh3bGFuZGV2LT5uYW1lLCBkZXYtPm5hbWUpOwotI2VuZGlmCi0KLSNpZmRlZiBDT05GSUdfUFJPQ19GUwotCWlmIChwcm9jX3A4MDIxMSkgewotCQl3bGFuZGV2LT5wcm9jZGlyID0gcHJvY19ta2Rpcih3bGFuZGV2LT5uYW1lLCBwcm9jX3A4MDIxMSk7Ci0JCWlmICggd2xhbmRldi0+cHJvY2RpciApCi0JCQl3bGFuZGV2LT5wcm9jd2xhbmRldiA9Ci0JCQkJY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSgid2xhbmRldiIsIDAsCi0JCQkJCQkgICAgICAgd2xhbmRldi0+cHJvY2RpciwKLQkJCQkJCSAgICAgICBwODAyMTFuZXRkZXZfcHJvY19yZWFkLAotCQkJCQkJICAgICAgIHdsYW5kZXYpOwotCQlpZiAod2xhbmRldi0+bnNkX3Byb2NfcmVhZCkKLQkJCWNyZWF0ZV9wcm9jX3JlYWRfZW50cnkoIm5zZCIsIDAsCi0JCQkJCSAgICAgICB3bGFuZGV2LT5wcm9jZGlyLAotCQkJCQkgICAgICAgd2xhbmRldi0+bnNkX3Byb2NfcmVhZCwKLQkJCQkJICAgICAgIHdsYW5kZXYpOwotCX0KLSNlbmRpZgotCi0jaWZkZWYgQ09ORklHX0hPVFBMVUcKLQlwODAyMTFfcnVuX3NiaW5faG90cGx1Zyh3bGFuZGV2LCBXTEFOX0hPVFBMVUdfUkVHSVNURVIpOwotI2VuZGlmCisJaSA9IHJlZ2lzdGVyX25ldGRldih3bGFuZGV2LT5uZXRkZXYpOworCWlmIChpKQorCQlyZXR1cm4gaTsKIAogCURCRkVYSVQ7CiAJcmV0dXJuIDA7CkBAIC0xMDk0LDIyICs5NTYsNiBAQAogCiAJREJGRU5URVI7CiAKLSNpZmRlZiBDT05GSUdfSE9UUExVRwotCXA4MDIxMV9ydW5fc2Jpbl9ob3RwbHVnKHdsYW5kZXYsIFdMQU5fSE9UUExVR19SRU1PVkUpOwotI2VuZGlmCi0KLSNpZmRlZiBDT05GSUdfUFJPQ19GUwotCWlmICggd2xhbmRldi0+cHJvY3dsYW5kZXYgKSB7Ci0JCXJlbW92ZV9wcm9jX2VudHJ5KCJ3bGFuZGV2Iiwgd2xhbmRldi0+cHJvY2Rpcik7Ci0JfQotCWlmICggd2xhbmRldi0+bnNkX3Byb2NfcmVhZCApIHsKLQkJcmVtb3ZlX3Byb2NfZW50cnkoIm5zZCIsIHdsYW5kZXYtPnByb2NkaXIpOwotCX0KLQlpZiAod2xhbmRldi0+cHJvY2RpcikgewotCQlyZW1vdmVfcHJvY19lbnRyeSh3bGFuZGV2LT5uYW1lLCBwcm9jX3A4MDIxMSk7Ci0JfQotI2VuZGlmCi0KIAl1bnJlZ2lzdGVyX25ldGRldih3bGFuZGV2LT5uZXRkZXYpOwogCiAJLyogTm93IHRvIGNsZWFuIG91dCB0aGUgcnggcXVldWUgKi8KQEAgLTExMjEsNzYgKzk2Nyw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLSNpZmRlZiBDT05GSUdfUFJPQ19GUwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIHByb2NfcmVhZAotKgotKiBSZWFkIGZ1bmN0aW9uIGZvciAvcHJvYy9uZXQvcDgwMjExLzxkZXZpY2U+L3dsYW5kZXYKLSoKLSogQXJndW1lbnRzOgotKglidWYKLSoJc3RhcnQKLSoJb2Zmc2V0Ci0qCWNvdW50Ci0qCWVvZgotKglkYXRhCi0qIFJldHVybnM6Ci0qCXplcm8gb24gc3VjY2Vzcywgbm9uLXplcm8gb3RoZXJ3aXNlLgotKiBDYWxsIENvbnRleHQ6Ci0qCUNhbiBiZSBlaXRoZXIgaW50ZXJydXB0IG9yIG5vdC4KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotc3RhdGljIGludAotcDgwMjExbmV0ZGV2X3Byb2NfcmVhZCgKLQljaGFyCSpwYWdlLAotCWNoYXIJKipzdGFydCwKLQlvZmZfdAlvZmZzZXQsCi0JaW50CWNvdW50LAotCWludAkqZW9mLAotCXZvaWQJKmRhdGEpCi17Ci0JY2hhcgkgKnAgPSBwYWdlOwotCXdsYW5kZXZpY2VfdCAqd2xhbmRldiA9ICh3bGFuZGV2aWNlX3QgKikgZGF0YTsKLQotCURCRkVOVEVSOwotCWlmIChvZmZzZXQgIT0gMCkgewotCQkqZW9mID0gMTsKLQkJZ290byBleGl0OwotCX0KLQotCXAgKz0gc3ByaW50ZihwLCAicDgwMjExIHZlcnNpb246ICVzICglcylcblxuIiwKLQkJICAgICBXTEFOX1JFTEVBU0UsIFdMQU5fQlVJTERfREFURSk7Ci0JcCArPSBzcHJpbnRmKHAsICJuYW1lICAgICAgIDogJXNcbiIsIHdsYW5kZXYtPm5hbWUpOwotCXAgKz0gc3ByaW50ZihwLCAibnNkIG5hbWUgICA6ICVzXG4iLCB3bGFuZGV2LT5uc2RuYW1lKTsKLQlwICs9IHNwcmludGYocCwgImFkZHJlc3MgICAgOiAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKLQkJICAgICB3bGFuZGV2LT5uZXRkZXYtPmRldl9hZGRyWzBdLCB3bGFuZGV2LT5uZXRkZXYtPmRldl9hZGRyWzFdLCB3bGFuZGV2LT5uZXRkZXYtPmRldl9hZGRyWzJdLAotCQkgICAgIHdsYW5kZXYtPm5ldGRldi0+ZGV2X2FkZHJbM10sIHdsYW5kZXYtPm5ldGRldi0+ZGV2X2FkZHJbNF0sIHdsYW5kZXYtPm5ldGRldi0+ZGV2X2FkZHJbNV0pOwotCXAgKz0gc3ByaW50ZihwLCAibnNkIGNhcHMgICA6ICVzJXMlcyVzJXMlcyVzJXMlcyVzXG4iLAotCQkgICAgICh3bGFuZGV2LT5uc2RjYXBzICYgUDgwMjExX05TRENBUF9IQVJEV0FSRVdFUCkgPyAid2VwX2h3ICIgOiAiIiwKLQkJICAgICAod2xhbmRldi0+bnNkY2FwcyAmIFA4MDIxMV9OU0RDQVBfVElFRFdFUCkgPyAid2VwX3RpZWQgIiA6ICIiLAotCQkgICAgICh3bGFuZGV2LT5uc2RjYXBzICYgUDgwMjExX05TRENBUF9OT0hPU1RXRVApID8gIndlcF9od19vbmx5ICIgOiAiIiwKLQkJICAgICAod2xhbmRldi0+bnNkY2FwcyAmIFA4MDIxMV9OU0RDQVBfUEJDQykgPyAicGJjYyAiIDogIiIsCi0JCSAgICAgKHdsYW5kZXYtPm5zZGNhcHMgJiBQODAyMTFfTlNEQ0FQX1NIT1JUX1BSRUFNQkxFKSA/ICJzaG9ydF9wcmVhbWJsZSAiIDogIiIsCi0JCSAgICAgKHdsYW5kZXYtPm5zZGNhcHMgJiBQODAyMTFfTlNEQ0FQX0FHSUxJVFkpID8gImFnaWxpdHkgIiA6ICIiLAotCQkgICAgICh3bGFuZGV2LT5uc2RjYXBzICYgUDgwMjExX05TRENBUF9BUF9SRVRSQU5TTUlUKSA/ICJhcF9yZXRyYW5zbWl0ICIgOiAiIiwKLQkJICAgICAod2xhbmRldi0+bnNkY2FwcyAmIFA4MDIxMV9OU0RDQVBfSFdGUkFHTUVOVCkgPyAiaHdfZnJhZyAiIDogIiIsCi0JCSAgICAgKHdsYW5kZXYtPm5zZGNhcHMgJiBQODAyMTFfTlNEQ0FQX0FVVE9KT0lOKSA/ICJhdXRvam9pbiAiIDogIiIsCi0JCSAgICAgKHdsYW5kZXYtPm5zZGNhcHMgJiBQODAyMTFfTlNEQ0FQX05PU0NBTikgPyAiIiA6ICJzY2FuICIpOwotCi0KLQlwICs9IHNwcmludGYocCwgImJzc2lkICAgICAgOiAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKLQkJICAgICB3bGFuZGV2LT5ic3NpZFswXSwgd2xhbmRldi0+YnNzaWRbMV0sIHdsYW5kZXYtPmJzc2lkWzJdLAotCQkgICAgIHdsYW5kZXYtPmJzc2lkWzNdLCB3bGFuZGV2LT5ic3NpZFs0XSwgd2xhbmRldi0+YnNzaWRbNV0pOwotCi0JcCArPSBzcHJpbnRmKHAsICJFbmFibGVkICAgIDogJXMlc1xuIiwKLQkJICAgICAod2xhbmRldi0+c2hvcnRwcmVhbWJsZSkgPyAic2hvcnRfcHJlYW1ibGUgIiA6ICIiLAotCQkgICAgICh3bGFuZGV2LT5ob3N0d2VwICYgSE9TVFdFUF9QUklWQUNZSU5WT0tFRCkgPyAicHJpdmFjeSIgOiAiIik7Ci0KLQotIGV4aXQ6Ci0JREJGRVhJVDsKLQlyZXR1cm4gKHAgLSBwYWdlKTsKLX0KLSNlbmRpZgogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogcDgwMjExbmV0ZGV2X2h3cmVtb3ZlZApAQCAtMTIyNyw3ICsxMDAzLDcgQEAKIAlEQkZFTlRFUjsKIAl3bGFuZGV2LT5od3JlbW92ZWQgPSAxOwogCWlmICggd2xhbmRldi0+c3RhdGUgPT0gV0xBTl9ERVZJQ0VfT1BFTikgewotCQlwODAyMTFuZXRkZXZfc3RvcF9xdWV1ZSh3bGFuZGV2KTsKKwkJbmV0aWZfc3RvcF9xdWV1ZSh3bGFuZGV2LT5uZXRkZXYpOwogCX0KIAogCW5ldGlmX2RldmljZV9kZXRhY2god2xhbmRldi0+bmV0ZGV2KTsKQEAgLTEyNTcsMTAgKzEwMzMsMTAgQEAKICogQ2FsbCBjb250ZXh0OgogKglpbnRlcnJ1cHQKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotc3RhdGljIGludCBwODAyMTFfcnhfdHlwZWRyb3AoIHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgVUlOVDE2IGZjKQorc3RhdGljIGludCBwODAyMTFfcnhfdHlwZWRyb3AoIHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdTE2IGZjKQogewotCVVJTlQxNglmdHlwZTsKLQlVSU5UMTYJZnN0eXBlOworCXUxNglmdHlwZTsKKwl1MTYJZnN0eXBlOwogCWludAlkcm9wID0gMDsKIAkvKiBDbGFzc2lmeSBmcmFtZSwgaW5jcmVtZW50IGNvdW50ZXIgKi8KIAlmdHlwZSA9IFdMQU5fR0VUX0ZDX0ZUWVBFKGZjKTsKQEAgLTE0MTYsNzUgKzExOTIsNiBAQAogCXJldHVybiBkcm9wOwogfQogCi0jaWZkZWYgQ09ORklHX0hPVFBMVUcKLS8qIE5vdGlmeSB1c2Vyc3BhY2Ugd2hlbiBhIG5ldGRldmljZSBldmVudCBvY2N1cnMsCi0gKiBieSBydW5uaW5nICcvc2Jpbi9ob3RwbHVnIG5ldCcgd2l0aCBjZXJ0YWluCi0gKiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgc2V0LgotICovCi1pbnQgcDgwMjExX3J1bl9zYmluX2hvdHBsdWcod2xhbmRldmljZV90ICp3bGFuZGV2LCBjaGFyICphY3Rpb24pCi17Ci0gICAgICAgIGNoYXIgKmFyZ3ZbM10sICplbnZwWzddLCBpZm5hbWVbMTIgKyBJRk5BTVNJWl0sIGFjdGlvbl9zdHJbMzJdOwotCWNoYXIgbnNkbmFtZVszMl0sIHdsYW5fd2V4dFszMl07Ci0gICAgICAgIGludCBpOwotCi0JaWYgKHdsYW5kZXYpIHsKLQkJc3ByaW50ZihpZm5hbWUsICJJTlRFUkZBQ0U9JXMiLCB3bGFuZGV2LT5uYW1lKTsKLQkJc3ByaW50Zihuc2RuYW1lLCAiTlNETkFNRT0lcyIsIHdsYW5kZXYtPm5zZG5hbWUpOwotCX0gZWxzZSB7Ci0JCXNwcmludGYoaWZuYW1lLCAiSU5URVJGQUNFPW51bGwiKTsKLQkJc3ByaW50Zihuc2RuYW1lLCAiTlNETkFNRT1udWxsIik7Ci0JfQotCi0Jc3ByaW50Zih3bGFuX3dleHQsICJXTEFOX1dFWFQ9JXMiLCB3bGFuX3dleHRfd3JpdGUgPyAieSIgOiAiIik7Ci0gICAgICAgIHNwcmludGYoYWN0aW9uX3N0ciwgIkFDVElPTj0lcyIsIGFjdGlvbik7Ci0KLSAgICAgICAgaSA9IDA7Ci0gICAgICAgIGFyZ3ZbaSsrXSA9IGhvdHBsdWdfcGF0aDsKLSAgICAgICAgYXJndltpKytdID0gIndsYW4iOwotICAgICAgICBhcmd2W2ldID0gTlVMTDsKLQotICAgICAgICBpID0gMDsKLSAgICAgICAgLyogbWluaW1hbCBjb21tYW5kIGVudmlyb25tZW50ICovCi0gICAgICAgIGVudnAgW2krK10gPSAiSE9NRT0vIjsKLSAgICAgICAgZW52cCBbaSsrXSA9ICJQQVRIPS9zYmluOi9iaW46L3Vzci9zYmluOi91c3IvYmluIjsKLSAgICAgICAgZW52cCBbaSsrXSA9IGlmbmFtZTsKLSAgICAgICAgZW52cCBbaSsrXSA9IGFjdGlvbl9zdHI7Ci0gICAgICAgIGVudnAgW2krK10gPSBuc2RuYW1lOwotICAgICAgICBlbnZwIFtpKytdID0gd2xhbl93ZXh0OwotICAgICAgICBlbnZwIFtpXSA9IE5VTEw7Ci0KLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDYyKSkKLSAgICAgICAgcmV0dXJuIGNhbGxfdXNlcm1vZGVoZWxwZXIoYXJndiBbMF0sIGFyZ3YsIGVudnApOwotI2Vsc2UKLSAgICAgICAgcmV0dXJuIGNhbGxfdXNlcm1vZGVoZWxwZXIoYXJndiBbMF0sIGFyZ3YsIGVudnAsIDApOwotI2VuZGlmCi19Ci0KLSNlbmRpZgotCi0KLXZvaWQgICAgcDgwMjExX3N1c3BlbmQod2xhbmRldmljZV90ICp3bGFuZGV2KQotewotCURCRkVOVEVSOwotCi0jaWZkZWYgQ09ORklHX0hPVFBMVUcKLQlwODAyMTFfcnVuX3NiaW5faG90cGx1Zyh3bGFuZGV2LCBXTEFOX0hPVFBMVUdfU1VTUEVORCk7Ci0jZW5kaWYKLQotCURCRkVYSVQ7Ci19Ci0KLXZvaWQgICAgcDgwMjExX3Jlc3VtZSh3bGFuZGV2aWNlX3QgKndsYW5kZXYpCi17Ci0JREJGRU5URVI7Ci0KLSNpZmRlZiBDT05GSUdfSE9UUExVRwotCXA4MDIxMV9ydW5fc2Jpbl9ob3RwbHVnKHdsYW5kZXYsIFdMQU5fSE9UUExVR19SRVNVTUUpOwotI2VuZGlmCi0KLQlEQkZFWElUOwotfQotCiBzdGF0aWMgdm9pZCBwODAyMTFrbmV0ZGV2X3R4X3RpbWVvdXQoIG5ldGRldmljZV90ICpuZXRkZXYpCiB7CiAJd2xhbmRldmljZV90CSp3bGFuZGV2ID0gbmV0ZGV2LT5tbF9wcml2OwpAQCAtMTQ5NSw3ICsxMjAyLDcgQEAKIAl9IGVsc2UgewogCQlXTEFOX0xPR19XQVJOSU5HKCJJbXBsZW1lbnQgdHhfdGltZW91dCBmb3IgJXNcbiIsCiAJCQkJIHdsYW5kZXYtPm5zZG5hbWUpOwotCQlwODAyMTFuZXRkZXZfd2FrZV9xdWV1ZSh3bGFuZGV2KTsKKwkJbmV0aWZfd2FrZV9xdWV1ZSh3bGFuZGV2LT5uZXRkZXYpOwogCX0KIAogCURCRkVYSVQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFuZXRkZXYuaCBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMW5ldGRldi5oCmluZGV4IDliMmUwY2QuLjk0MDE0NmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMW5ldGRldi5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMW5ldGRldi5oCkBAIC0xMTMsNTQgKzExMyw0OCBAQAogLyogUmVjZWl2ZWQgZnJhbWUgc3RhdGlzdGljcyAqLwogdHlwZWRlZiBzdHJ1Y3QgcDgwMjExX2ZybXJ4X3QKIHsKLQlVSU5UMzIJbWdtdDsKLQlVSU5UMzIJYXNzb2NyZXE7Ci0JVUlOVDMyCWFzc29jcmVzcDsKLQlVSU5UMzIJcmVhc3NvY3JlcTsKLQlVSU5UMzIJcmVhc3NvY3Jlc3A7Ci0JVUlOVDMyCXByb2JlcmVxOwotCVVJTlQzMglwcm9iZXJlc3A7Ci0JVUlOVDMyCWJlYWNvbjsKLQlVSU5UMzIJYXRpbTsKLQlVSU5UMzIJZGlzYXNzb2M7Ci0JVUlOVDMyCWF1dGhlbjsKLQlVSU5UMzIJZGVhdXRoZW47Ci0JVUlOVDMyCW1nbXRfdW5rbm93bjsKLQlVSU5UMzIJY3RsOwotCVVJTlQzMglwc3BvbGw7Ci0JVUlOVDMyCXJ0czsKLQlVSU5UMzIJY3RzOwotCVVJTlQzMglhY2s7Ci0JVUlOVDMyCWNmZW5kOwotCVVJTlQzMgljZmVuZGNmYWNrOwotCVVJTlQzMgljdGxfdW5rbm93bjsKLQlVSU5UMzIJZGF0YTsKLQlVSU5UMzIJZGF0YW9ubHk7Ci0JVUlOVDMyCWRhdGFfY2ZhY2s7Ci0JVUlOVDMyCWRhdGFfY2Zwb2xsOwotCVVJTlQzMglkYXRhX19jZmFja19jZnBvbGw7Ci0JVUlOVDMyCW51bGw7Ci0JVUlOVDMyCWNmYWNrOwotCVVJTlQzMgljZnBvbGw7Ci0JVUlOVDMyCWNmYWNrX2NmcG9sbDsKLQlVSU5UMzIJZGF0YV91bmtub3duOwotCVVJTlQzMiAgZGVjcnlwdDsKLQlVSU5UMzIgIGRlY3J5cHRfZXJyOworCXUzMgltZ210OworCXUzMglhc3NvY3JlcTsKKwl1MzIJYXNzb2NyZXNwOworCXUzMglyZWFzc29jcmVxOworCXUzMglyZWFzc29jcmVzcDsKKwl1MzIJcHJvYmVyZXE7CisJdTMyCXByb2JlcmVzcDsKKwl1MzIJYmVhY29uOworCXUzMglhdGltOworCXUzMglkaXNhc3NvYzsKKwl1MzIJYXV0aGVuOworCXUzMglkZWF1dGhlbjsKKwl1MzIJbWdtdF91bmtub3duOworCXUzMgljdGw7CisJdTMyCXBzcG9sbDsKKwl1MzIJcnRzOworCXUzMgljdHM7CisJdTMyCWFjazsKKwl1MzIJY2ZlbmQ7CisJdTMyCWNmZW5kY2ZhY2s7CisJdTMyCWN0bF91bmtub3duOworCXUzMglkYXRhOworCXUzMglkYXRhb25seTsKKwl1MzIJZGF0YV9jZmFjazsKKwl1MzIJZGF0YV9jZnBvbGw7CisJdTMyCWRhdGFfX2NmYWNrX2NmcG9sbDsKKwl1MzIJbnVsbDsKKwl1MzIJY2ZhY2s7CisJdTMyCWNmcG9sbDsKKwl1MzIJY2ZhY2tfY2Zwb2xsOworCXUzMglkYXRhX3Vua25vd247CisJdTMyICBkZWNyeXB0OworCXUzMiAgZGVjcnlwdF9lcnI7CiB9IHA4MDIxMV9mcm1yeF90OwogCi0jaWZkZWYgV0lSRUxFU1NfRVhUCiAvKiBjYWxsZWQgYnkgL3Byb2MvbmV0L3dpcmVsZXNzICovCiBzdHJ1Y3QgaXdfc3RhdGlzdGljcyogcDgwMjExd2V4dF9nZXRfd2lyZWxlc3Nfc3RhdHMobmV0ZGV2aWNlX3QgKmRldik7CiAvKiB3aXJlbGVzcyBleHRlbnNpb25zJyBpb2N0bHMgKi8KIGludCBwODAyMTF3ZXh0X3N1cHBvcnRfaW9jdGwobmV0ZGV2aWNlX3QgKmRldiwgc3RydWN0IGlmcmVxICppZnIsIGludCBjbWQpOwotI2lmIFdJUkVMRVNTX0VYVCA+IDEyCiBleHRlcm4gc3RydWN0IGl3X2hhbmRsZXJfZGVmIHA4MDIxMXdleHRfaGFuZGxlcl9kZWY7Ci0jZW5kaWYKLQogaW50IHA4MDIxMXdleHRfZXZlbnRfYXNzb2NpYXRlZChzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwgaW50IGFzc29jKTsKIAotI2VuZGlmIC8qIHdpcmVsZXNzIGV4dGVuc2lvbnMgKi8KLQogLyogV0VQIHN0dWZmICovCiAjZGVmaW5lIE5VTV9XRVBLRVlTIDQKICNkZWZpbmUgTUFYX0tFWUxFTiAzMgpAQCAtMTg0LDE4ICsxNzgsMTggQEAKIAljaGFyCQluYW1lW1dMQU5fREVWTkFNRUxFTl9NQVhdOyAvKiBEZXYgbmFtZSwgZnJvbSByZWdpc3Rlcl93bGFuZGV2KCkqLwogCWNoYXIJCSpuc2RuYW1lOwogCi0JVUlOVDMyICAgICAgICAgIHN0YXRlOyAgICAgICAgICAvKiBEZXZpY2UgSS9GIHN0YXRlIChvcGVuL2Nsb3NlZCkgKi8KLQlVSU5UMzIJCW1zZHN0YXRlOwkvKiBzdGF0ZSBvZiB1bmRlcmx5aW5nIGRyaXZlciAqLwotCVVJTlQzMgkJaHdyZW1vdmVkOwkvKiBIYXMgdGhlIGh3IGJlZW4geWFua2VkIG91dD8gKi8KKwl1MzIgICAgICAgICAgc3RhdGU7ICAgICAgICAgIC8qIERldmljZSBJL0Ygc3RhdGUgKG9wZW4vY2xvc2VkKSAqLworCXUzMgkJbXNkc3RhdGU7CS8qIHN0YXRlIG9mIHVuZGVybHlpbmcgZHJpdmVyICovCisJdTMyCQlod3JlbW92ZWQ7CS8qIEhhcyB0aGUgaHcgYmVlbiB5YW5rZWQgb3V0PyAqLwogCiAJLyogSGFyZHdhcmUgY29uZmlnICovCi0JVUlOVAkJaXJxOwotCVVJTlQJCWlvYmFzZTsKLQlVSU5UCQltZW1iYXNlOwotCVVJTlQzMiAgICAgICAgICBuc2RjYXBzOyAgLyogTlNEIENhcGFiaWxpdGllcyBmbGFncyAqLworCXVuc2lnbmVkIGludAkJaXJxOworCXVuc2lnbmVkIGludAkJaW9iYXNlOworCXVuc2lnbmVkIGludAkJbWVtYmFzZTsKKwl1MzIgICAgICAgICAgbnNkY2FwczsgIC8qIE5TRCBDYXBhYmlsaXRpZXMgZmxhZ3MgKi8KIAogCS8qIENvbmZpZyB2YXJzICovCi0JVUlOVAkJZXRoY29udjsKKwl1bnNpZ25lZCBpbnQJCWV0aGNvbnY7CiAKIAkvKiBkZXZpY2UgbWV0aG9kcyAoaW5pdCBieSBNU0QsIHVzZWQgYnkgcDgwMjExICovCiAJaW50CQkoKm9wZW4pKHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2KTsKQEAgLTIwNywyMCArMjAxLDE1IEBACiAJCQkJCSAgICAgIG5ldGRldmljZV90ICpkZXYpOwogCXZvaWQJCSgqdHhfdGltZW91dCkoc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYpOwogCi0jaWZkZWYgQ09ORklHX1BST0NfRlMKLQlpbnQgICAgICAgICAgICAgKCpuc2RfcHJvY19yZWFkKShjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwgaW50IGNvdW50LCBpbnQJKmVvZiwgdm9pZCAqZGF0YSk7Ci0jZW5kaWYKLQogCS8qIDgwMi4xMSBTdGF0ZSAqLwotCVVJTlQ4CQlic3NpZFtXTEFOX0JTU0lEX0xFTl07CisJdTgJCWJzc2lkW1dMQU5fQlNTSURfTEVOXTsKIAlwODAyMTFwc3RyMzJfdAlzc2lkOwotCVVJTlQzMgkJbWFjbW9kZTsKKwl1MzIJCW1hY21vZGU7CiAJaW50ICAgICAgICAgICAgIGxpbmtzdGF0dXM7Ci0JaW50ICAgICAgICAgICAgIHNob3J0cHJlYW1ibGU7ICAvKiBDIGJvb2wgKi8KIAogCS8qIFdFUCBTdGF0ZSAqLwotCVVJTlQ4IHdlcF9rZXlzW05VTV9XRVBLRVlTXVtNQVhfS0VZTEVOXTsKLQlVSU5UOCB3ZXBfa2V5bGVuc1tOVU1fV0VQS0VZU107CisJdTggd2VwX2tleXNbTlVNX1dFUEtFWVNdW01BWF9LRVlMRU5dOworCXU4IHdlcF9rZXlsZW5zW05VTV9XRVBLRVlTXTsKIAlpbnQgICBob3N0d2VwOwogCiAJLyogUmVxdWVzdC9Db25maXJtIGkvZiBzdGF0ZSAodXNlZCBieSBwODAyMTEpICovCkBAIC0yMzIsMTIgKzIyMSw2IEBACiAJbmV0ZGV2aWNlX3QJCSpuZXRkZXY7CS8qIHB0ciB0byBsaW51eCBuZXRkZXZpY2UgKi8KIAlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBsaW51eF9zdGF0czsKIAotI2lmZGVmIENPTkZJR19QUk9DX0ZTCi0JLyogUHJvY2ZzIHN1cHBvcnQgKi8KLQlzdHJ1Y3QgcHJvY19kaXJfZW50cnkJKnByb2NkaXI7Ci0Jc3RydWN0IHByb2NfZGlyX2VudHJ5CSpwcm9jd2xhbmRldjsKLSNlbmRpZgotCiAJLyogUnggYm90dG9tIGhhbGYgKi8KIAlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QJcnhfYmg7CiAKQEAgLTI0NiwyOSArMjI5LDE4IEBACiAJLyogODAyLjExIGRldmljZSBzdGF0aXN0aWNzICovCiAJc3RydWN0IHA4MDIxMV9mcm1yeF90CXJ4OwogCi0vKiBjb21wYXRpYmlsaXR5IHRvIHdpcmVsZXNzIGV4dGVuc2lvbnMgKi8KLSNpZmRlZiBXSVJFTEVTU19FWFQKIAlzdHJ1Y3QgaXdfc3RhdGlzdGljcwl3c3RhdHM7CiAKIAkvKiBqa3JpZWdsOiBpd3NweSBmaWVsZHMgKi8KLSAgICAgICAgVUlOVDgJCQlzcHlfbnVtYmVyOworICAgICAgICB1OAkJCXNweV9udW1iZXI7CiAgICAgICAgIGNoYXIJCQlzcHlfYWRkcmVzc1tJV19NQVhfU1BZXVtFVEhfQUxFTl07CiAgICAgICAgIHN0cnVjdCBpd19xdWFsaXR5ICAgICAgIHNweV9zdGF0W0lXX01BWF9TUFldOwotCi0jZW5kaWYKLQogfSB3bGFuZGV2aWNlX3Q7CiAKIC8qIFdFUCBzdHVmZiAqLwotaW50IHdlcF9jaGFuZ2Vfa2V5KHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgaW50IGtleW51bSwgVUlOVDgqIGtleSwgaW50IGtleWxlbik7Ci1pbnQgd2VwX2RlY3J5cHQod2xhbmRldmljZV90ICp3bGFuZGV2LCBVSU5UOCAqYnVmLCBVSU5UMzIgbGVuLCBpbnQga2V5X292ZXJyaWRlLCBVSU5UOCAqaXYsIFVJTlQ4ICppY3YpOwotaW50IHdlcF9lbmNyeXB0KHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgVUlOVDggKmJ1ZiwgVUlOVDggKmRzdCwgVUlOVDMyIGxlbiwgaW50IGtleW51bSwgVUlOVDggKml2LCBVSU5UOCAqaWN2KTsKLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLS8qIEV4dGVybnMgKi8KLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLS8qIEZ1bmN0aW9uIERlY2xhcmF0aW9ucyAqLworaW50IHdlcF9jaGFuZ2Vfa2V5KHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgaW50IGtleW51bSwgdTgqIGtleSwgaW50IGtleWxlbik7CitpbnQgd2VwX2RlY3J5cHQod2xhbmRldmljZV90ICp3bGFuZGV2LCB1OCAqYnVmLCB1MzIgbGVuLCBpbnQga2V5X292ZXJyaWRlLCB1OCAqaXYsIHU4ICppY3YpOworaW50IHdlcF9lbmNyeXB0KHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdTggKmJ1ZiwgdTggKmRzdCwgdTMyIGxlbiwgaW50IGtleW51bSwgdTggKml2LCB1OCAqaWN2KTsKIAogdm9pZAlwODAyMTFuZXRkZXZfc3RhcnR1cCh2b2lkKTsKIHZvaWQJcDgwMjExbmV0ZGV2X3NodXRkb3duKHZvaWQpOwpAQCAtMjc4LDU5ICsyNTAsNSBAQAogaW50CXVucmVnaXN0ZXJfd2xhbmRldih3bGFuZGV2aWNlX3QgKndsYW5kZXYpOwogdm9pZAlwODAyMTFuZXRkZXZfcngod2xhbmRldmljZV90ICp3bGFuZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIHZvaWQJcDgwMjExbmV0ZGV2X2h3cmVtb3ZlZCh3bGFuZGV2aWNlX3QgKndsYW5kZXYpOwotdm9pZCAgICBwODAyMTFfc3VzcGVuZCh3bGFuZGV2aWNlX3QgKndsYW5kZXYpOwotdm9pZCAgICBwODAyMTFfcmVzdW1lKHdsYW5kZXZpY2VfdCAqd2xhbmRldik7Ci0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0vKiBGdW5jdGlvbiBEZWZpbml0aW9ucyAqLwotCi1zdGF0aWMgaW5saW5lIHZvaWQKLXA4MDIxMW5ldGRldl9zdG9wX3F1ZXVlKHdsYW5kZXZpY2VfdCAqd2xhbmRldikKLXsKLQlpZiAoICF3bGFuZGV2ICkgcmV0dXJuOwotCWlmICggIXdsYW5kZXYtPm5ldGRldiApIHJldHVybjsKLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiwzLDM4KSApCi0Jd2xhbmRldi0+bmV0ZGV2LT50YnVzeSA9IDE7Ci0Jd2xhbmRldi0+bmV0ZGV2LT5zdGFydCA9IDA7Ci0jZWxzZQotCW5ldGlmX3N0b3BfcXVldWUod2xhbmRldi0+bmV0ZGV2KTsKLSNlbmRpZgotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQKLXA4MDIxMW5ldGRldl9zdGFydF9xdWV1ZSh3bGFuZGV2aWNlX3QgKndsYW5kZXYpCi17Ci0JaWYgKCAhd2xhbmRldiApIHJldHVybjsKLQlpZiAoICF3bGFuZGV2LT5uZXRkZXYgKSByZXR1cm47Ci0jaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsMywzOCkgKQotCXdsYW5kZXYtPm5ldGRldi0+dGJ1c3kgPSAwOwotCXdsYW5kZXYtPm5ldGRldi0+c3RhcnQgPSAxOwotI2Vsc2UKLQluZXRpZl9zdGFydF9xdWV1ZSh3bGFuZGV2LT5uZXRkZXYpOwotI2VuZGlmCi19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZAotcDgwMjExbmV0ZGV2X3dha2VfcXVldWUod2xhbmRldmljZV90ICp3bGFuZGV2KQotewotCWlmICggIXdsYW5kZXYgKSByZXR1cm47Ci0JaWYgKCAhd2xhbmRldi0+bmV0ZGV2ICkgcmV0dXJuOwotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDMsMzgpICkKLQl3bGFuZGV2LT5uZXRkZXYtPnRidXN5ID0gMDsKLQltYXJrX2JoKE5FVF9CSCk7Ci0jZWxzZQotCW5ldGlmX3dha2VfcXVldWUod2xhbmRldi0+bmV0ZGV2KTsKLSNlbmRpZgotfQotCi0jaWZkZWYgQ09ORklHX0hPVFBMVUcKLSNkZWZpbmUgV0xBTl9IT1RQTFVHX1JFR0lTVEVSICJyZWdpc3RlciIKLSNkZWZpbmUgV0xBTl9IT1RQTFVHX1JFTU9WRSAgICJyZW1vdmUiCi0jZGVmaW5lIFdMQU5fSE9UUExVR19TVEFSVFVQICAic3RhcnR1cCIKLSNkZWZpbmUgV0xBTl9IT1RQTFVHX1NIVVRET1dOICJzaHV0ZG93biIKLSNkZWZpbmUgV0xBTl9IT1RQTFVHX1NVU1BFTkQgInN1c3BlbmQiCi0jZGVmaW5lIFdMQU5fSE9UUExVR19SRVNVTUUgInJlc3VtZSIKLWludCBwODAyMTFfcnVuX3NiaW5faG90cGx1Zyh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIGNoYXIgKmFjdGlvbik7Ci0jZW5kaWYKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFyZXEuYyBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMXJlcS5jCmluZGV4IDAyMzNhYmUuLjZlMjBiZmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMXJlcS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMXJlcS5jCkBAIC01NCw3ICs1NCw2IEBACiAvKiBTeXN0ZW0gSW5jbHVkZXMgKi8KIAogCi0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CkBAIC02OCw3ICs2Nyw2IEBACiAjaW5jbHVkZSA8bmV0L3NvY2suaD4KICNpbmNsdWRlIDxsaW51eC9uZXRsaW5rLmg+CiAKLSNpbmNsdWRlICJ2ZXJzaW9uLmgiCiAjaW5jbHVkZSAid2xhbl9jb21wYXQuaCIKIAogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KQEAgLTEyNiw3ICsxMjQsNyBAQAogKglQb3RlbnRpYWxseSBibG9ja3MgdGhlIGNhbGxlciwgc28gaXQncyBhIGdvb2QgaWRlYSB0bwogKglub3QgY2FsbCB0aGlzIGZ1bmN0aW9uIGZyb20gYW4gaW50ZXJydXB0IGNvbnRleHQuCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCBwODAyMTFyZXFfZG9yZXF1ZXN0KCB3bGFuZGV2aWNlX3QgKndsYW5kZXYsIFVJTlQ4ICptc2didWYpCitpbnQgcDgwMjExcmVxX2RvcmVxdWVzdCggd2xhbmRldmljZV90ICp3bGFuZGV2LCB1OCAqbXNnYnVmKQogewogCWludAkJcmVzdWx0ID0gMDsKIAlwODAyMTFtc2dfdAkqbXNnID0gKHA4MDIxMW1zZ190Kiltc2didWY7CkBAIC0yMjQsMzggKzIyMiwxMSBAQAogewogCXA4MDIxMWl0ZW1kX3QgICAqbWliaXRlbSA9IChwODAyMTFpdGVtZF90ICopIG1pYl9tc2ctPm1pYmF0dHJpYnV0ZS5kYXRhOwogCXA4MDIxMXBzdHJkX3QgICpwc3RyID0gKHA4MDIxMXBzdHJkX3QqKSBtaWJpdGVtLT5kYXRhOwotCVVJTlQ4ICprZXkgPSBtaWJpdGVtLT5kYXRhICsgc2l6ZW9mKHA4MDIxMXBzdHJkX3QpOworCXU4ICprZXkgPSBtaWJpdGVtLT5kYXRhICsgc2l6ZW9mKHA4MDIxMXBzdHJkX3QpOwogCiAJREJGRU5URVI7CiAKIAlzd2l0Y2ggKG1pYml0ZW0tPmRpZCkgewotCWNhc2UgRElEbWliX2RvdDExc210X3A4MDIxMVRhYmxlX3A4MDIxMV9pZnN0YXRlOiB7Ci0JCVVJTlQzMiAqZGF0YSA9IChVSU5UMzIgKikgbWliaXRlbS0+ZGF0YTsKLQkJaWYgKGlzZ2V0KQotCQkJc3dpdGNoICh3bGFuZGV2LT5tc2RzdGF0ZSkgewotCQkJY2FzZSBXTEFOX01TRF9IV1BSRVNFTlQ6Ci0JCQkJKmRhdGEgPSBQODAyMTFFTlVNX2lmc3RhdGVfZGlzYWJsZTsKLQkJCQlicmVhazsKLQkJCWNhc2UgV0xBTl9NU0RfRldMT0FEOgotCQkJCSpkYXRhID0gUDgwMjExRU5VTV9pZnN0YXRlX2Z3bG9hZDsKLQkJCQlicmVhazsKLQkJCWNhc2UgV0xBTl9NU0RfUlVOTklORzoKLQkJCQkqZGF0YSA9IFA4MDIxMUVOVU1faWZzdGF0ZV9lbmFibGU7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCSpkYXRhID0gUDgwMjExRU5VTV9pZnN0YXRlX2VuYWJsZTsKLQkJCX0KLQkJYnJlYWs7Ci0JfQotCWNhc2UgRElEbWliX2RvdDExcGh5X2RvdDExUGh5T3BlcmF0aW9uVGFibGVfZG90MTFTaG9ydFByZWFtYmxlRW5hYmxlZDogewotCQlVSU5UMzIgKmRhdGEgPSAoVUlOVDMyICopIG1pYml0ZW0tPmRhdGE7Ci0KLQkJaWYgKGlzZ2V0KQotCQkJKmRhdGEgPSB3bGFuZGV2LT5zaG9ydHByZWFtYmxlOwotCQllbHNlCi0JCQl3bGFuZGV2LT5zaG9ydHByZWFtYmxlID0gKmRhdGE7Ci0JCWJyZWFrOwotCX0KIAljYXNlIERJRG1pYl9kb3QxMXNtdF9kb3QxMVdFUERlZmF1bHRLZXlzVGFibGVfZG90MTFXRVBEZWZhdWx0S2V5MDogewogCQlpZiAoIWlzZ2V0KQogCQkJd2VwX2NoYW5nZV9rZXkod2xhbmRldiwgMCwga2V5LCBwc3RyLT5sZW4pOwpAQCAtMjc3LDcgKzI0OCw3IEBACiAJCWJyZWFrOwogCX0KIAljYXNlIERJRG1pYl9kb3QxMXNtdF9kb3QxMVByaXZhY3lUYWJsZV9kb3QxMVdFUERlZmF1bHRLZXlJRDogewotCQlVSU5UMzIgKmRhdGEgPSAoVUlOVDMyICopIG1pYml0ZW0tPmRhdGE7CisJCXUzMiAqZGF0YSA9ICh1MzIgKikgbWliaXRlbS0+ZGF0YTsKIAogCQlpZiAoaXNnZXQpIHsKIAkJCSpkYXRhID0gd2xhbmRldi0+aG9zdHdlcCAmIEhPU1RXRVBfREVGQVVMVEtFWV9NQVNLOwpAQCAtMjg5LDcgKzI2MCw3IEBACiAJCWJyZWFrOwogCX0KIAljYXNlIERJRG1pYl9kb3QxMXNtdF9kb3QxMVByaXZhY3lUYWJsZV9kb3QxMVByaXZhY3lJbnZva2VkOiB7Ci0JCVVJTlQzMiAqZGF0YSA9IChVSU5UMzIgKikgbWliaXRlbS0+ZGF0YTsKKwkJdTMyICpkYXRhID0gKHUzMiAqKSBtaWJpdGVtLT5kYXRhOwogCiAJCWlmIChpc2dldCkgewogCQkJaWYgKHdsYW5kZXYtPmhvc3R3ZXAgJiBIT1NUV0VQX1BSSVZBQ1lJTlZPS0VEKQpAQCAtMzA0LDcgKzI3NSw3IEBACiAJCWJyZWFrOwogCX0KIAljYXNlIERJRG1pYl9kb3QxMXNtdF9kb3QxMVByaXZhY3lUYWJsZV9kb3QxMUV4Y2x1ZGVVbmVuY3J5cHRlZDogewotCQlVSU5UMzIgKmRhdGEgPSAoVUlOVDMyICopIG1pYml0ZW0tPmRhdGE7CisJCXUzMiAqZGF0YSA9ICh1MzIgKikgbWliaXRlbS0+ZGF0YTsKIAogCQlpZiAoaXNnZXQpIHsKIAkJCWlmICh3bGFuZGV2LT5ob3N0d2VwICYgSE9TVFdFUF9FWENMVURFVU5FTkNSWVBURUQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFyZXEuaCBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMXJlcS5oCmluZGV4IDU0YWJkY2UuLjQ5N2E0ZDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMXJlcS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMXJlcS5oCkBAIC02Myw2ICs2Myw2IEBACiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogLyogRnVuY3Rpb24gRGVjbGFyYXRpb25zICovCiAKLWludAlwODAyMTFyZXFfZG9yZXF1ZXN0KHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgVUlOVDggKm1zZ2J1Zik7CitpbnQJcDgwMjExcmVxX2RvcmVxdWVzdCh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHU4ICptc2didWYpOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMXR5cGVzLmggYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTF0eXBlcy5oCmluZGV4IDgxMWIwY2UuLjViZTY3MzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMXR5cGVzLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExdHlwZXMuaApAQCAtODAsMTMgKzgwLDEzIEBACiAKICNkZWZpbmUgUDgwMjExX1RZUEVfT0NURVRTVFIJCTEJLyogcGFzY2FsIGFycmF5IG9mIGJ5dGVzICovCiAjZGVmaW5lIFA4MDIxMV9UWVBFX0RJU1BMQVlTVFIJCTIJLyogcGFzY2FsIGFycmF5IG9mIGJ5dGVzIGNvbnRhaW5pbmcgYXNjaWkgKi8KLSNkZWZpbmUgUDgwMjExX1RZUEVfSU5UCQkJNAkvKiBVSU5UMzIgbWluIGFuZCBtYXggbGltaXRlZCBieSAzMiBiaXRzICovCi0jZGVmaW5lIFA4MDIxMV9UWVBFX0VOVU1JTlQJCTUJLyogVUlOVDMyIGhvbGRpbmcgYSBudW1lcmljCisjZGVmaW5lIFA4MDIxMV9UWVBFX2ludAkJCTQJLyogdTMyIG1pbiBhbmQgbWF4IGxpbWl0ZWQgYnkgMzIgYml0cyAqLworI2RlZmluZSBQODAyMTFfVFlQRV9FTlVNaW50CQk1CS8qIHUzMiBob2xkaW5nIGEgbnVtZXJpYwogCQkJCQkJICAgY29kZSB0aGF0IGNhbiBiZSBtYXBwZWQKIAkJCQkJCSAgIHRvIGEgdGV4dHVhbCBuYW1lICovCiAjZGVmaW5lIFA4MDIxMV9UWVBFX1VOS0RBVEEJCTYJLyogRGF0YSBpdGVtIGNvbnRhaW5pbmcgYW4KIAkJCQkJCSAgIHVua25vd24gZGF0YSB0eXBlICovCi0jZGVmaW5lIFA4MDIxMV9UWVBFX0lOVEFSUkFZCQk3CS8qIEFycmF5IG9mIDMyLWJpdCBpbnRlZ2Vycy4gKi8KKyNkZWZpbmUgUDgwMjExX1RZUEVfaW50QVJSQVkJCTcJLyogQXJyYXkgb2YgMzItYml0IGludGVnZXJzLiAqLwogI2RlZmluZSBQODAyMTFfVFlQRV9CSVRBUlJBWQkJOAkvKiBBcnJheSBvZiBiaXRzLiAqLwogI2RlZmluZSBQODAyMTFfVFlQRV9NQUNBUlJBWQkJOQkvKiBBcnJheSBvZiBNQUMgYWRkcmVzc2VzLiAqLwogCkBAIC0yNDMsNyArMjQzLDcgQEAKIAkJCQkJLyogaXMgYSBESUQtTEVOLURBVEEgdHJpcGxlICovCiAJCQkJCS8qIHdpdGggYSBtYXggc2l6ZSBvZiA0KzQrMzg0ICovCiAKLSNkZWZpbmUgUDgwMjExX1NFVF9JTlQoaXRlbSwgdmFsdWUpIGRvIHsgXAorI2RlZmluZSBQODAyMTFfU0VUX2ludChpdGVtLCB2YWx1ZSkgZG8geyBcCiAJKGl0ZW0pLmRhdGEgICA9ICh2YWx1ZSk7IFwKIAkoaXRlbSkuc3RhdHVzID0gUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19kYXRhX29rOyBcCiAJfSB3aGlsZSgwKQpAQCAtMjc5LDkgKzI3OSw5IEBACiAKICNkZWZpbmUgUDgwMjExSVRFTV9TRVRGTEFHUyhxLCByLCBjKQkoIHEgfCByIHwgYyApCiAKLSNkZWZpbmUgUDgwMjExSVRFTV9JU1JFUVVJUkVEKGZsYWdzKQkoKChVSU5UMzIpKGZsYWdzICYgSVNSRVFVSVJFRCkpID4+IDMxICkKLSNkZWZpbmUgUDgwMjExSVRFTV9JU1JFUVVFU1QoZmxhZ3MpCSgoKFVJTlQzMikoZmxhZ3MgJiBJU1JFUVVFU1QpKSA+PiAzMCApCi0jZGVmaW5lIFA4MDIxMUlURU1fSVNDT05GSVJNKGZsYWdzKQkoKChVSU5UMzIpKGZsYWdzICYgSVNDT05GSVJNKSkgPj4gMjkgKQorI2RlZmluZSBQODAyMTFJVEVNX0lTUkVRVUlSRUQoZmxhZ3MpCSgoKHUzMikoZmxhZ3MgJiBJU1JFUVVJUkVEKSkgPj4gMzEgKQorI2RlZmluZSBQODAyMTFJVEVNX0lTUkVRVUVTVChmbGFncykJKCgodTMyKShmbGFncyAmIElTUkVRVUVTVCkpID4+IDMwICkKKyNkZWZpbmUgUDgwMjExSVRFTV9JU0NPTkZJUk0oZmxhZ3MpCSgoKHUzMikoZmxhZ3MgJiBJU0NPTkZJUk0pKSA+PiAyOSApCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKiBUaGUgZm9sbG93aW5nIG1hY3JvIGNyZWF0ZXMgYSBuYW1lIGZvciBhbiBlbnVtICovCkBAIC0zMjAsNyArMzIwLDcgQEAKICNkZWZpbmUgUDgwMjExRElEX01BU0tfQUNDRVNTIAkJKDB4MDAwMDAwMDNVTCkKIAogCi0jZGVmaW5lIFA4MDIxMURJRF9NSyhhLG0sbCkJKCgoKFVJTlQzMikoYSkpICYgKG0pKSA8PCAobCkpCisjZGVmaW5lIFA4MDIxMURJRF9NSyhhLG0sbCkJKCgoKHUzMikoYSkpICYgKG0pKSA8PCAobCkpCiAKICNkZWZpbmUgUDgwMjExRElEX01LU0VDVElPTihhKQlQODAyMTFESURfTUsoYSwgXAogCQkJCQlQODAyMTFESURfTUFTS19TRUNUSU9OLCBcCkBAIC0zNDcsNyArMzQ3LDcgQEAKIAkJCQkJCShhKSApCiAKIAotI2RlZmluZSBQODAyMTFESURfR0VUKGEsbSxsKQkoKCgoVUlOVDMyKShhKSkgPj4gKGwpKSAmIChtKSkKKyNkZWZpbmUgUDgwMjExRElEX0dFVChhLG0sbCkJKCgoKHUzMikoYSkpID4+IChsKSkgJiAobSkpCiAKICNkZWZpbmUgUDgwMjExRElEX1NFQ1RJT04oYSkJUDgwMjExRElEX0dFVChhLCBcCiAJCQkJCVA4MDIxMURJRF9NQVNLX1NFQ1RJT04sIFwKQEAgLTM3MywxNyArMzczLDE3IEBACiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKiBUaGUgZm9sbG93aW5nIHN0cnVjdHVyZSB0eXBlcyBhcmUgdXNlZCBmb3IgdGhlIHJlcHJlc2VuYXRpb24gKi8KLS8qICBvZiBFTlVNSU5UIHR5cGUgbWV0YWRhdGEuICovCisvKiAgb2YgRU5VTWludCB0eXBlIG1ldGFkYXRhLiAqLwogCiB0eXBlZGVmIHN0cnVjdCBwODAyMTFlbnVtcGFpcgogewotCVVJTlQzMgkJCXZhbDsKKwl1MzIJCQl2YWw7CiAJY2hhcgkJCSpuYW1lOwogfSBwODAyMTFlbnVtcGFpcl90OwogCiB0eXBlZGVmIHN0cnVjdCBwODAyMTFlbnVtCiB7Ci0JSU5UCQkJbml0ZW1zOworCWludAkJCW5pdGVtczsKIAlwODAyMTFlbnVtcGFpcl90CSpsaXN0OwogfSBwODAyMTFlbnVtX3Q7CiAKQEAgLTM5NCwxMzcgKzM5NCwxMzcgQEAKIC8qIFRlbXBsYXRlIHBhc2NhbCBzdHJpbmcgKi8KIHR5cGVkZWYgc3RydWN0IHA4MDIxMXBzdHIKIHsKLQlVSU5UOAkJbGVuOworCXU4CQlsZW47CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIHA4MDIxMXBzdHJfdDsKIAogdHlwZWRlZiBzdHJ1Y3QgcDgwMjExcHN0cmQKIHsKLQlVSU5UOAkJbGVuOwotCVVJTlQ4CQlkYXRhWzBdOworCXU4CQlsZW47CisJdTgJCWRhdGFbMF07CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIHA4MDIxMXBzdHJkX3Q7CiAKIC8qIE1heGltdW0gcGFzY2FsIHN0cmluZyAqLwogdHlwZWRlZiBzdHJ1Y3QgcDgwMjExcHN0cjI1NQogewotCVVJTlQ4CQlsZW47Ci0JVUlOVDgJCWRhdGFbTUFYTEVOX1BTVFIyNTVdOworCXU4CQlsZW47CisJdTgJCWRhdGFbTUFYTEVOX1BTVFIyNTVdOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBwODAyMTFwc3RyMjU1X3Q7CiAKIC8qIHBhc2NhbCBzdHJpbmcgZm9yIG1hY2FkZHJlc3MgYW5kIGJzc2lkICovCiB0eXBlZGVmIHN0cnVjdCBwODAyMTFwc3RyNgogewotCVVJTlQ4CQlsZW47Ci0JVUlOVDgJCWRhdGFbTUFYTEVOX1BTVFI2XTsKKwl1OAkJbGVuOworCXU4CQlkYXRhW01BWExFTl9QU1RSNl07CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIHA4MDIxMXBzdHI2X3Q7CiAKIC8qIHBhc2NhbCBzdHJpbmcgZm9yIGNoYW5uZWwgbGlzdCAqLwogdHlwZWRlZiBzdHJ1Y3QgcDgwMjExcHN0cjE0CiB7Ci0JVUlOVDgJCWxlbjsKLQlVSU5UOAkJZGF0YVtNQVhMRU5fUFNUUjE0XTsKKwl1OAkJbGVuOworCXU4CQlkYXRhW01BWExFTl9QU1RSMTRdOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBwODAyMTFwc3RyMTRfdDsKIAogLyogcGFzY2FsIHN0cmluZyBmb3Igc3NpZCAqLwogdHlwZWRlZiBzdHJ1Y3QgcDgwMjExcHN0cjMyCiB7Ci0JVUlOVDgJCWxlbjsKLQlVSU5UOAkJZGF0YVtNQVhMRU5fUFNUUjMyXTsKKwl1OAkJbGVuOworCXU4CQlkYXRhW01BWExFTl9QU1RSMzJdOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBwODAyMTFwc3RyMzJfdDsKIAogLyogTUFDIGFkZHJlc3MgYXJyYXkgKi8KIHR5cGVkZWYgc3RydWN0IHA4MDIxMW1hY2FycmF5CiB7Ci0JVUlOVDMyCQljbnQ7Ci0JVUlOVDgJCWRhdGFbMV1bTUFYTEVOX1BTVFI2XTsKKwl1MzIJCWNudDsKKwl1OAkJZGF0YVsxXVtNQVhMRU5fUFNUUjZdOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBwODAyMTFtYWNhcnJheV90OwogCiAvKiBwcm90b3R5cGUgdGVtcGxhdGUgKi8KIHR5cGVkZWYgc3RydWN0IHA4MDIxMWl0ZW0KIHsKLQlVSU5UMzIJCWRpZDsKLQlVSU5UMTYJCXN0YXR1czsKLQlVSU5UMTYJCWxlbjsKKwl1MzIJCWRpZDsKKwl1MTYJCXN0YXR1czsKKwl1MTYJCWxlbjsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gcDgwMjExaXRlbV90OwogCiAvKiBwcm90b3R5cGUgdGVtcGxhdGUgdy8gZGF0YSBpdGVtICovCiB0eXBlZGVmIHN0cnVjdCBwODAyMTFpdGVtZAogewotCVVJTlQzMgkJZGlkOwotCVVJTlQxNgkJc3RhdHVzOwotCVVJTlQxNgkJbGVuOwotCVVJTlQ4CQlkYXRhWzBdOworCXUzMgkJZGlkOworCXUxNgkJc3RhdHVzOworCXUxNgkJbGVuOworCXU4CQlkYXRhWzBdOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBwODAyMTFpdGVtZF90OwogCi0vKiBtZXNzYWdlIGRhdGEgaXRlbSBmb3IgSU5ULCBCT1VOREVESU5ULCBFTlVNSU5UICovCisvKiBtZXNzYWdlIGRhdGEgaXRlbSBmb3IgaW50LCBCT1VOREVESU5ULCBFTlVNSU5UICovCiB0eXBlZGVmIHN0cnVjdCBwODAyMTFpdGVtX3VpbnQzMgogewotCVVJTlQzMgkJZGlkOwotCVVJTlQxNgkJc3RhdHVzOwotCVVJTlQxNgkJbGVuOwotCVVJTlQzMgkJZGF0YTsKKwl1MzIJCWRpZDsKKwl1MTYJCXN0YXR1czsKKwl1MTYJCWxlbjsKKwl1MzIJCWRhdGE7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIHA4MDIxMWl0ZW1fdWludDMyX3Q7CiAKIC8qIG1lc3NhZ2UgZGF0YSBpdGVtIGZvciBPQ1RFVFNUUiwgRElTUExBWVNUUiAqLwogdHlwZWRlZiBzdHJ1Y3QgcDgwMjExaXRlbV9wc3RyNgogewotCVVJTlQzMgkJZGlkOwotCVVJTlQxNgkJc3RhdHVzOwotCVVJTlQxNgkJbGVuOworCXUzMgkJZGlkOworCXUxNgkJc3RhdHVzOworCXUxNgkJbGVuOwogCXA4MDIxMXBzdHI2X3QJZGF0YTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gcDgwMjExaXRlbV9wc3RyNl90OwogCiAvKiBtZXNzYWdlIGRhdGEgaXRlbSBmb3IgT0NURVRTVFIsIERJU1BMQVlTVFIgKi8KIHR5cGVkZWYgc3RydWN0IHA4MDIxMWl0ZW1fcHN0cjE0CiB7Ci0JVUlOVDMyCQkJZGlkOwotCVVJTlQxNgkJCXN0YXR1czsKLQlVSU5UMTYJCQlsZW47CisJdTMyCQkJZGlkOworCXUxNgkJCXN0YXR1czsKKwl1MTYJCQlsZW47CiAJcDgwMjExcHN0cjE0X3QJCWRhdGE7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIHA4MDIxMWl0ZW1fcHN0cjE0X3Q7CiAKIC8qIG1lc3NhZ2UgZGF0YSBpdGVtIGZvciBPQ1RFVFNUUiwgRElTUExBWVNUUiAqLwogdHlwZWRlZiBzdHJ1Y3QgcDgwMjExaXRlbV9wc3RyMzIKIHsKLQlVSU5UMzIJCQlkaWQ7Ci0JVUlOVDE2CQkJc3RhdHVzOwotCVVJTlQxNgkJCWxlbjsKKwl1MzIJCQlkaWQ7CisJdTE2CQkJc3RhdHVzOworCXUxNgkJCWxlbjsKIAlwODAyMTFwc3RyMzJfdAkJZGF0YTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gcDgwMjExaXRlbV9wc3RyMzJfdDsKIAogLyogbWVzc2FnZSBkYXRhIGl0ZW0gZm9yIE9DVEVUU1RSLCBESVNQTEFZU1RSICovCiB0eXBlZGVmIHN0cnVjdCBwODAyMTFpdGVtX3BzdHIyNTUKIHsKLQlVSU5UMzIJCQlkaWQ7Ci0JVUlOVDE2CQkJc3RhdHVzOwotCVVJTlQxNgkJCWxlbjsKKwl1MzIJCQlkaWQ7CisJdTE2CQkJc3RhdHVzOworCXUxNgkJCWxlbjsKIAlwODAyMTFwc3RyMjU1X3QJCWRhdGE7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIHA4MDIxMWl0ZW1fcHN0cjI1NV90OwogCiAvKiBtZXNzYWdlIGRhdGEgaXRlbSBmb3IgVU5LIDM5MiwgbmFtZWx5IG1pYiBpdGVtcyAqLwogdHlwZWRlZiBzdHJ1Y3QgIHA4MDIxMWl0ZW1fdW5rMzkyCiB7Ci0JVUlOVDMyCQlkaWQ7Ci0JVUlOVDE2CQlzdGF0dXM7Ci0JVUlOVDE2CQlsZW47Ci0JVUlOVDgJCWRhdGFbTUFYTEVOX01JQkFUVFJJQlVURV07CisJdTMyCQlkaWQ7CisJdTE2CQlzdGF0dXM7CisJdTE2CQlsZW47CisJdTgJCWRhdGFbTUFYTEVOX01JQkFUVFJJQlVURV07CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIHA4MDIxMWl0ZW1fdW5rMzkyX3Q7CiAKIC8qIG1lc3NhZ2UgZGF0YSBpdGVtIGZvciBVTksgMTAyNSwgbmFtZWx5IHAyIHBkYXMgKi8KIHR5cGVkZWYgc3RydWN0ICBwODAyMTFpdGVtX3VuazEwMjQKIHsKLQlVSU5UMzIJCWRpZDsKLQlVSU5UMTYJCXN0YXR1czsKLQlVSU5UMTYJCWxlbjsKLQlVSU5UOAkJZGF0YVsxMDI0XTsKKwl1MzIJCWRpZDsKKwl1MTYJCXN0YXR1czsKKwl1MTYJCWxlbjsKKwl1OAkJZGF0YVsxMDI0XTsKIH0gIF9fV0xBTl9BVFRSSUJfUEFDS19fIHA4MDIxMWl0ZW1fdW5rMTAyNF90OwogCiAvKiBtZXNzYWdlIGRhdGEgaXRlbSBmb3IgVU5LIDQwOTYsIG5hbWVseSBwMiBkb3dubG9hZCBjaHVua3MgKi8KIHR5cGVkZWYgc3RydWN0ICBwODAyMTFpdGVtX3VuazQwOTYKIHsKLQlVSU5UMzIJCWRpZDsKLQlVSU5UMTYJCXN0YXR1czsKLQlVSU5UMTYJCWxlbjsKLQlVSU5UOAkJZGF0YVs0MDk2XTsKKwl1MzIJCWRpZDsKKwl1MTYJCXN0YXR1czsKKwl1MTYJCWxlbjsKKwl1OAkJZGF0YVs0MDk2XTsKIH0gIF9fV0xBTl9BVFRSSUJfUEFDS19fIHA4MDIxMWl0ZW1fdW5rNDA5Nl90OwogCiBzdHJ1Y3QgY2F0bGlzdGl0ZW07CkBAIC01MzQsOSArNTM0LDkgQEAKIC8qICBtZXRhZGF0YSBpdGVtcy4gIFNvbWUgY29tcG9uZW50cyBtYXkgY2hvb3NlIHRvIHVzZSBtb3JlLCAqLwogLyogIGxlc3Mgb3IgZGlmZmVyZW50IG1ldGFkYXRhIGl0ZW1zLiAqLwogCi10eXBlZGVmIHZvaWQgKCpwODAyMTFfdG90ZXh0X3QpKCBzdHJ1Y3QgY2F0bGlzdGl0ZW0gKiwgVUlOVDMyIGRpZCwgVUlOVDgqIGl0ZW1idWYsIGNoYXIgKnRleHRidWYpOwotdHlwZWRlZiB2b2lkICgqcDgwMjExX2Zyb210ZXh0X3QpKCBzdHJ1Y3QgY2F0bGlzdGl0ZW0gKiwgVUlOVDMyIGRpZCwgVUlOVDgqIGl0ZW1idWYsIGNoYXIgKnRleHRidWYpOwotdHlwZWRlZiBVSU5UMzIgKCpwODAyMTFfdmFsaWRfdCkoIHN0cnVjdCBjYXRsaXN0aXRlbSAqLCBVSU5UMzIgZGlkLCBVSU5UOCogaXRlbWJ1Zik7Cit0eXBlZGVmIHZvaWQgKCpwODAyMTFfdG90ZXh0X3QpKCBzdHJ1Y3QgY2F0bGlzdGl0ZW0gKiwgdTMyIGRpZCwgdTgqIGl0ZW1idWYsIGNoYXIgKnRleHRidWYpOwordHlwZWRlZiB2b2lkICgqcDgwMjExX2Zyb210ZXh0X3QpKCBzdHJ1Y3QgY2F0bGlzdGl0ZW0gKiwgdTMyIGRpZCwgdTgqIGl0ZW1idWYsIGNoYXIgKnRleHRidWYpOwordHlwZWRlZiB1MzIgKCpwODAyMTFfdmFsaWRfdCkoIHN0cnVjdCBjYXRsaXN0aXRlbSAqLCB1MzIgZGlkLCB1OCogaXRlbWJ1Zik7CiAKIAogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KQEAgLTU3NSw4ICs1NzUsOCBAQAogLyogVGhlIGZvbGxvd2luZyBkZWNsYXJlIHNvbWUgdXRpbGl0eSBmdW5jdGlvbnMgZm9yIHVzZSB3aXRoIHRoZSAqLwogLyogIHA4MDIxMWVudW1fdCB0eXBlLiAqLwogCi1VSU5UMzIgcDgwMjExZW51bV90ZXh0MmludChwODAyMTFlbnVtX3QgKmVwLCBjaGFyICp0ZXh0KTsKLVVJTlQzMiBwODAyMTFlbnVtX2ludDJ0ZXh0KHA4MDIxMWVudW1fdCAqZXAsIFVJTlQzMiB2YWwsIGNoYXIgKnRleHQpOwordTMyIHA4MDIxMWVudW1fdGV4dDJpbnQocDgwMjExZW51bV90ICplcCwgY2hhciAqdGV4dCk7Cit1MzIgcDgwMjExZW51bV9pbnQydGV4dChwODAyMTFlbnVtX3QgKmVwLCB1MzIgdmFsLCBjaGFyICp0ZXh0KTsKIHZvaWQgcDgwMjExX2Vycm9yMnRleHQoaW50IGVycl9jb2RlLCBjaGFyICplcnJfc3RyKTsKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KQEAgLTU5MSw4NSArNTkxLDg1IEBACiAKIC8qLS0gRElTUExBWVNUUiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyogcHN0ciA9PT4gY3N0ciAqLwotdm9pZCBwODAyMTFfdG90ZXh0X2Rpc3BsYXlzdHIoIHN0cnVjdCBjYXRsaXN0aXRlbSAqbWV0YWxpc3QsIFVJTlQzMiBkaWQsIFVJTlQ4ICppdGVtYnVmLCBjaGFyICp0ZXh0YnVmICk7Cit2b2lkIHA4MDIxMV90b3RleHRfZGlzcGxheXN0ciggc3RydWN0IGNhdGxpc3RpdGVtICptZXRhbGlzdCwgdTMyIGRpZCwgdTggKml0ZW1idWYsIGNoYXIgKnRleHRidWYgKTsKIAogLyogY3N0ciA9PT4gcHN0ciAqLwotdm9pZCBwODAyMTFfZnJvbXRleHRfZGlzcGxheXN0ciggc3RydWN0IGNhdGxpc3RpdGVtICptZXRhbGlzdCwgVUlOVDMyIGRpZCwgVUlOVDggKml0ZW1idWYsIGNoYXIgKnRleHRidWYgKTsKK3ZvaWQgcDgwMjExX2Zyb210ZXh0X2Rpc3BsYXlzdHIoIHN0cnVjdCBjYXRsaXN0aXRlbSAqbWV0YWxpc3QsIHUzMiBkaWQsIHU4ICppdGVtYnVmLCBjaGFyICp0ZXh0YnVmICk7CiAKIC8qIGZ1bmN0aW9uIHRoYXQgY2hlY2tzIHZhbGlkaXR5IG9mIGEgZGlzcGxheXN0ciBiaW5hcnkgdmFsdWUgKi8KLVVJTlQzMiBwODAyMTFfaXN2YWxpZF9kaXNwbGF5c3RyKCBzdHJ1Y3QgY2F0bGlzdGl0ZW0gKm1ldGFsaXN0LCBVSU5UMzIgZGlkLCBVSU5UOCAqaXRlbWJ1ZiApOwordTMyIHA4MDIxMV9pc3ZhbGlkX2Rpc3BsYXlzdHIoIHN0cnVjdCBjYXRsaXN0aXRlbSAqbWV0YWxpc3QsIHUzMiBkaWQsIHU4ICppdGVtYnVmICk7CiAKIC8qLS0gT0NURVRTVFIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyogcHN0ciA9PT4gInh4Onh4Oi4uLi4iICovCi12b2lkIHA4MDIxMV90b3RleHRfb2N0ZXRzdHIoIHN0cnVjdCBjYXRsaXN0aXRlbSAqbWV0YWxpc3QsIFVJTlQzMiBkaWQsIFVJTlQ4ICppdGVtYnVmLCBjaGFyICp0ZXh0YnVmICk7Cit2b2lkIHA4MDIxMV90b3RleHRfb2N0ZXRzdHIoIHN0cnVjdCBjYXRsaXN0aXRlbSAqbWV0YWxpc3QsIHUzMiBkaWQsIHU4ICppdGVtYnVmLCBjaGFyICp0ZXh0YnVmICk7CiAKIC8qICJ4eDp4eDouLi4uIiA9PT4gcHN0ciAqLwotdm9pZCBwODAyMTFfZnJvbXRleHRfb2N0ZXRzdHIoIHN0cnVjdCBjYXRsaXN0aXRlbSAqbWV0YWxpc3QsIFVJTlQzMiBkaWQsIFVJTlQ4ICppdGVtYnVmLCBjaGFyICp0ZXh0YnVmICk7Cit2b2lkIHA4MDIxMV9mcm9tdGV4dF9vY3RldHN0ciggc3RydWN0IGNhdGxpc3RpdGVtICptZXRhbGlzdCwgdTMyIGRpZCwgdTggKml0ZW1idWYsIGNoYXIgKnRleHRidWYgKTsKIAogLyogZnVuY3Rpb24gdGhhdCBjaGVja3MgdmFsaWRpdHkgb2YgYW4gb2N0ZXRzdHIgYmluYXJ5IHZhbHVlICovCi1VSU5UMzIgcDgwMjExX2lzdmFsaWRfb2N0ZXRzdHIoIHN0cnVjdCBjYXRsaXN0aXRlbSAqbWV0YWxpc3QsIFVJTlQzMiBkaWQsIFVJTlQ4ICppdGVtYnVmICk7Cit1MzIgcDgwMjExX2lzdmFsaWRfb2N0ZXRzdHIoIHN0cnVjdCBjYXRsaXN0aXRlbSAqbWV0YWxpc3QsIHUzMiBkaWQsIHU4ICppdGVtYnVmICk7CiAKLS8qLS0gSU5UIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogVUlOVDMyID09PiAlZCAqLwotdm9pZCBwODAyMTFfdG90ZXh0X2ludCggc3RydWN0IGNhdGxpc3RpdGVtICptZXRhbGlzdCwgVUlOVDMyIGRpZCwgVUlOVDggKml0ZW1idWYsIGNoYXIgKnRleHRidWYgKTsKKy8qLS0gaW50IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogdTMyID09PiAlZCAqLwordm9pZCBwODAyMTFfdG90ZXh0X2ludCggc3RydWN0IGNhdGxpc3RpdGVtICptZXRhbGlzdCwgdTMyIGRpZCwgdTggKml0ZW1idWYsIGNoYXIgKnRleHRidWYgKTsKIAotLyogJWQgPT0+IFVJTlQzMiAqLwotdm9pZCBwODAyMTFfZnJvbXRleHRfaW50KCBzdHJ1Y3QgY2F0bGlzdGl0ZW0gKm1ldGFsaXN0LCBVSU5UMzIgZGlkLCBVSU5UOCAqaXRlbWJ1ZiwgY2hhciAqdGV4dGJ1ZiApOworLyogJWQgPT0+IHUzMiAqLwordm9pZCBwODAyMTFfZnJvbXRleHRfaW50KCBzdHJ1Y3QgY2F0bGlzdGl0ZW0gKm1ldGFsaXN0LCB1MzIgZGlkLCB1OCAqaXRlbWJ1ZiwgY2hhciAqdGV4dGJ1ZiApOwogCiAvKiBmdW5jdGlvbiB0aGF0IGNoZWNrcyB2YWxpZGl0eSBvZiBhbiBpbnQncyBiaW5hcnkgdmFsdWUgKGFsd2F5cyBzdWNjZXNzZnVsKSAqLwotVUlOVDMyIHA4MDIxMV9pc3ZhbGlkX2ludCggc3RydWN0IGNhdGxpc3RpdGVtICptZXRhbGlzdCwgVUlOVDMyIGRpZCwgVUlOVDggKml0ZW1idWYgKTsKK3UzMiBwODAyMTFfaXN2YWxpZF9pbnQoIHN0cnVjdCBjYXRsaXN0aXRlbSAqbWV0YWxpc3QsIHUzMiBkaWQsIHU4ICppdGVtYnVmICk7CiAKLS8qLS0gRU5VTUlOVCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogVUlOVDMyID09PiA8dmFsdWVuYW1lPiAqLwotdm9pZCBwODAyMTFfdG90ZXh0X2VudW1pbnQoIHN0cnVjdCBjYXRsaXN0aXRlbSAqbWV0YWxpc3QsIFVJTlQzMiBkaWQsIFVJTlQ4ICppdGVtYnVmLCBjaGFyICp0ZXh0YnVmICk7CisvKi0tIEVOVU1pbnQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIHUzMiA9PT4gPHZhbHVlbmFtZT4gKi8KK3ZvaWQgcDgwMjExX3RvdGV4dF9lbnVtaW50KCBzdHJ1Y3QgY2F0bGlzdGl0ZW0gKm1ldGFsaXN0LCB1MzIgZGlkLCB1OCAqaXRlbWJ1ZiwgY2hhciAqdGV4dGJ1ZiApOwogCi0vKiA8dmFsdWVuYW1lPiA9PT4gVUlOVDMyICovCi12b2lkIHA4MDIxMV9mcm9tdGV4dF9lbnVtaW50KCBzdHJ1Y3QgY2F0bGlzdGl0ZW0gKm1ldGFsaXN0LCBVSU5UMzIgZGlkLCBVSU5UOCAqaXRlbWJ1ZiwgY2hhciAqdGV4dGJ1ZiApOworLyogPHZhbHVlbmFtZT4gPT0+IHUzMiAqLwordm9pZCBwODAyMTFfZnJvbXRleHRfZW51bWludCggc3RydWN0IGNhdGxpc3RpdGVtICptZXRhbGlzdCwgdTMyIGRpZCwgdTggKml0ZW1idWYsIGNoYXIgKnRleHRidWYgKTsKIAogLyogZnVuY3Rpb24gdGhhdCBjaGVja3MgdmFsaWRpdHkgb2YgYW4gZW51bSdzIGJpbmFyeSB2YWx1ZSAqLwotVUlOVDMyIHA4MDIxMV9pc3ZhbGlkX2VudW1pbnQoIHN0cnVjdCBjYXRsaXN0aXRlbSAqbWV0YWxpc3QsIFVJTlQzMiBkaWQsIFVJTlQ4ICppdGVtYnVmICk7Cit1MzIgcDgwMjExX2lzdmFsaWRfZW51bWludCggc3RydWN0IGNhdGxpc3RpdGVtICptZXRhbGlzdCwgdTMyIGRpZCwgdTggKml0ZW1idWYgKTsKIAotLyotLSBJTlRBUlJBWSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBVSU5UMzJbXSA9PiAlZCwlZCwlZCwuLi4gKi8KLXZvaWQgcDgwMjExX3RvdGV4dF9pbnRhcnJheSggc3RydWN0IGNhdGxpc3RpdGVtICptZXRhbGlzdCwgVUlOVDMyIGRpZCwgVUlOVDggKml0ZW1idWYsIGNoYXIgKnRleHRidWYgKTsKKy8qLS0gaW50QVJSQVkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogdTMyW10gPT4gJWQsJWQsJWQsLi4uICovCit2b2lkIHA4MDIxMV90b3RleHRfaW50YXJyYXkoIHN0cnVjdCBjYXRsaXN0aXRlbSAqbWV0YWxpc3QsIHUzMiBkaWQsIHU4ICppdGVtYnVmLCBjaGFyICp0ZXh0YnVmICk7CiAKLS8qICVkLCVkLCVkLC4uLiA9PT4gVUlOVDMyW10gKi8KLXZvaWQgcDgwMjExX2Zyb210ZXh0X2ludGFycmF5KCBzdHJ1Y3QgY2F0bGlzdGl0ZW0gKm1ldGFsaXN0LCBVSU5UMzIgZGlkLCBVSU5UOCAqaXRlbWJ1ZiwgY2hhciAqdGV4dGJ1ZiApOworLyogJWQsJWQsJWQsLi4uID09PiB1MzJbXSAqLwordm9pZCBwODAyMTFfZnJvbXRleHRfaW50YXJyYXkoIHN0cnVjdCBjYXRsaXN0aXRlbSAqbWV0YWxpc3QsIHUzMiBkaWQsIHU4ICppdGVtYnVmLCBjaGFyICp0ZXh0YnVmICk7CiAKIC8qIGZ1bmN0aW9uIHRoYXQgY2hlY2tzIHZhbGlkaXR5IG9mIGFuIGludGVnZXIgYXJyYXkncyB2YWx1ZSAqLwotVUlOVDMyIHA4MDIxMV9pc3ZhbGlkX2ludGFycmF5KCBzdHJ1Y3QgY2F0bGlzdGl0ZW0gKm1ldGFsaXN0LCBVSU5UMzIgZGlkLCBVSU5UOCAqaXRlbWJ1ZiApOwordTMyIHA4MDIxMV9pc3ZhbGlkX2ludGFycmF5KCBzdHJ1Y3QgY2F0bGlzdGl0ZW0gKm1ldGFsaXN0LCB1MzIgZGlkLCB1OCAqaXRlbWJ1ZiApOwogCiAvKi0tIEJJVEFSUkFZIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIFVJTlQzMiA9PT4gJWQsJWQsJWQsLi4uICovCi12b2lkIHA4MDIxMV90b3RleHRfYml0YXJyYXkoIHN0cnVjdCBjYXRsaXN0aXRlbSAqbWV0YWxpc3QsIFVJTlQzMiBkaWQsIFVJTlQ4ICppdGVtYnVmLCBjaGFyICp0ZXh0YnVmICk7CisvKiB1MzIgPT0+ICVkLCVkLCVkLC4uLiAqLwordm9pZCBwODAyMTFfdG90ZXh0X2JpdGFycmF5KCBzdHJ1Y3QgY2F0bGlzdGl0ZW0gKm1ldGFsaXN0LCB1MzIgZGlkLCB1OCAqaXRlbWJ1ZiwgY2hhciAqdGV4dGJ1ZiApOwogCi0vKiAlZCwlZCwlZCwuLi4gPT0+IFVJTlQzMiAqLwotdm9pZCBwODAyMTFfZnJvbXRleHRfYml0YXJyYXkoIHN0cnVjdCBjYXRsaXN0aXRlbSAqbWV0YWxpc3QsIFVJTlQzMiBkaWQsIFVJTlQ4ICppdGVtYnVmLCBjaGFyICp0ZXh0YnVmICk7CisvKiAlZCwlZCwlZCwuLi4gPT0+IHUzMiAqLwordm9pZCBwODAyMTFfZnJvbXRleHRfYml0YXJyYXkoIHN0cnVjdCBjYXRsaXN0aXRlbSAqbWV0YWxpc3QsIHUzMiBkaWQsIHU4ICppdGVtYnVmLCBjaGFyICp0ZXh0YnVmICk7CiAKIC8qIGZ1bmN0aW9uIHRoYXQgY2hlY2tzIHZhbGlkaXR5IG9mIGEgYml0IGFycmF5J3MgdmFsdWUgKi8KLVVJTlQzMiBwODAyMTFfaXN2YWxpZF9iaXRhcnJheSggc3RydWN0IGNhdGxpc3RpdGVtICptZXRhbGlzdCwgVUlOVDMyIGRpZCwgVUlOVDggKml0ZW1idWYgKTsKK3UzMiBwODAyMTFfaXN2YWxpZF9iaXRhcnJheSggc3RydWN0IGNhdGxpc3RpdGVtICptZXRhbGlzdCwgdTMyIGRpZCwgdTggKml0ZW1idWYgKTsKIAogLyotLSBNQUNBUlJBWSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi12b2lkIHA4MDIxMV90b3RleHRfbWFjYXJyYXkoIHN0cnVjdCBjYXRsaXN0aXRlbSAqbWV0YWxpc3QsIFVJTlQzMiBkaWQsIFVJTlQ4ICppdGVtYnVmLCBjaGFyICp0ZXh0YnVmICk7Cit2b2lkIHA4MDIxMV90b3RleHRfbWFjYXJyYXkoIHN0cnVjdCBjYXRsaXN0aXRlbSAqbWV0YWxpc3QsIHUzMiBkaWQsIHU4ICppdGVtYnVmLCBjaGFyICp0ZXh0YnVmICk7CiAKLXZvaWQgcDgwMjExX2Zyb210ZXh0X21hY2FycmF5KCBzdHJ1Y3QgY2F0bGlzdGl0ZW0gKm1ldGFsaXN0LCBVSU5UMzIgZGlkLCBVSU5UOCAqaXRlbWJ1ZiwgY2hhciAqdGV4dGJ1ZiApOwordm9pZCBwODAyMTFfZnJvbXRleHRfbWFjYXJyYXkoIHN0cnVjdCBjYXRsaXN0aXRlbSAqbWV0YWxpc3QsIHUzMiBkaWQsIHU4ICppdGVtYnVmLCBjaGFyICp0ZXh0YnVmICk7CiAKIC8qIGZ1bmN0aW9uIHRoYXQgY2hlY2tzIHZhbGlkaXR5IG9mIGEgTUFDIGFkZHJlc3MgYXJyYXkncyB2YWx1ZSAqLwotVUlOVDMyIHA4MDIxMV9pc3ZhbGlkX21hY2FycmF5KCBzdHJ1Y3QgY2F0bGlzdGl0ZW0gKm1ldGFsaXN0LCBVSU5UMzIgZGlkLCBVSU5UOCAqaXRlbWJ1ZiApOwordTMyIHA4MDIxMV9pc3ZhbGlkX21hY2FycmF5KCBzdHJ1Y3QgY2F0bGlzdGl0ZW0gKm1ldGFsaXN0LCB1MzIgZGlkLCB1OCAqaXRlbWJ1ZiApOwogCiAvKi0tIE1JQkFUVFJJVUJURSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyogPG1pYnZhbHVlPiA9PT4gPHRleHR1YWwgcmVwcmVzZW50YXRpb24gaWRlbnRpZmllZCBpbiBNSUIgbWV0YWRhdGE+ICovCi12b2lkIHA4MDIxMV90b3RleHRfZ2V0bWliYXR0cmlidXRlKCBzdHJ1Y3QgY2F0bGlzdGl0ZW0gKm1ldGFsaXN0LCBVSU5UMzIgZGlkLCBVSU5UOCAqaXRlbWJ1ZiwgY2hhciAqdGV4dGJ1ZiApOwotdm9pZCBwODAyMTFfdG90ZXh0X3NldG1pYmF0dHJpYnV0ZSggc3RydWN0IGNhdGxpc3RpdGVtICptZXRhbGlzdCwgVUlOVDMyIGRpZCwgVUlOVDggKml0ZW1idWYsIGNoYXIgKnRleHRidWYgKTsKK3ZvaWQgcDgwMjExX3RvdGV4dF9nZXRtaWJhdHRyaWJ1dGUoIHN0cnVjdCBjYXRsaXN0aXRlbSAqbWV0YWxpc3QsIHUzMiBkaWQsIHU4ICppdGVtYnVmLCBjaGFyICp0ZXh0YnVmICk7Cit2b2lkIHA4MDIxMV90b3RleHRfc2V0bWliYXR0cmlidXRlKCBzdHJ1Y3QgY2F0bGlzdGl0ZW0gKm1ldGFsaXN0LCB1MzIgZGlkLCB1OCAqaXRlbWJ1ZiwgY2hhciAqdGV4dGJ1ZiApOwogCiAKIC8qIDx0ZXh0dWFsIHJlcHJlc2VudGF0aW9uIGlkZW50aWZpZWQgaW4gTUlCIG1ldGFkYXRhPiA9PT4gPG1pYnZhbHVlPiAqLwotdm9pZCBwODAyMTFfZnJvbXRleHRfZ2V0bWliYXR0cmlidXRlKCBzdHJ1Y3QgY2F0bGlzdGl0ZW0gKm1ldGFsaXN0LCBVSU5UMzIgZGlkLCBVSU5UOCAqaXRlbWJ1ZiwgY2hhciAqdGV4dGJ1ZiApOwotdm9pZCBwODAyMTFfZnJvbXRleHRfc2V0bWliYXR0cmlidXRlKCBzdHJ1Y3QgY2F0bGlzdGl0ZW0gKm1ldGFsaXN0LCBVSU5UMzIgZGlkLCBVSU5UOCAqaXRlbWJ1ZiwgY2hhciAqdGV4dGJ1ZiApOwordm9pZCBwODAyMTFfZnJvbXRleHRfZ2V0bWliYXR0cmlidXRlKCBzdHJ1Y3QgY2F0bGlzdGl0ZW0gKm1ldGFsaXN0LCB1MzIgZGlkLCB1OCAqaXRlbWJ1ZiwgY2hhciAqdGV4dGJ1ZiApOwordm9pZCBwODAyMTFfZnJvbXRleHRfc2V0bWliYXR0cmlidXRlKCBzdHJ1Y3QgY2F0bGlzdGl0ZW0gKm1ldGFsaXN0LCB1MzIgZGlkLCB1OCAqaXRlbWJ1ZiwgY2hhciAqdGV4dGJ1ZiApOwogCiAvKiBmdW5jdGlvbiB0aGF0IGNoZWNrcyB2YWxpZGl0eSBvZiBhIG1pYml0ZW0ncyBiaW5hcnkgdmFsdWUgKi8KLVVJTlQzMiBwODAyMTFfaXN2YWxpZF9nZXRtaWJhdHRyaWJ1dGUoIHN0cnVjdCBjYXRsaXN0aXRlbSAqbWV0YWxpc3QsIFVJTlQzMiBkaWQsIFVJTlQ4ICppdGVtYnVmICk7Ci1VSU5UMzIgcDgwMjExX2lzdmFsaWRfc2V0bWliYXR0cmlidXRlKCBzdHJ1Y3QgY2F0bGlzdGl0ZW0gKm1ldGFsaXN0LCBVSU5UMzIgZGlkLCBVSU5UOCAqaXRlbWJ1ZiApOwordTMyIHA4MDIxMV9pc3ZhbGlkX2dldG1pYmF0dHJpYnV0ZSggc3RydWN0IGNhdGxpc3RpdGVtICptZXRhbGlzdCwgdTMyIGRpZCwgdTggKml0ZW1idWYgKTsKK3UzMiBwODAyMTFfaXN2YWxpZF9zZXRtaWJhdHRyaWJ1dGUoIHN0cnVjdCBjYXRsaXN0aXRlbSAqbWV0YWxpc3QsIHUzMiBkaWQsIHU4ICppdGVtYnVmICk7CiAKICNlbmRpZiAvKiBfUDgwMjExVFlQRVNfSCAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTF3ZXAuYyBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMXdlcC5jCmluZGV4IDExYTUwYzcuLjQ2YTJhNmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMXdlcC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMXdlcC5jCkBAIC01Niw3ICs1Niw2IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgogCi0jaW5jbHVkZSAidmVyc2lvbi5oIgogI2luY2x1ZGUgIndsYW5fY29tcGF0LmgiCiAKIC8vICNkZWZpbmUgV0VQX0RFQlVHCkBAIC03Myw3ICs3Miw3IEBACiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogLyogTG9jYWwgQ29uc3RhbnRzICovCiAKLSNkZWZpbmUgU1NXQVAoYSxiKSB7VUlOVDggdG1wID0gc1thXTsgc1thXSA9IHNbYl07IHNbYl0gPSB0bXA7fQorI2RlZmluZSBTU1dBUChhLGIpIHt1OCB0bXAgPSBzW2FdOyBzW2FdID0gc1tiXTsgc1tiXSA9IHRtcDt9CiAjZGVmaW5lIFdFUF9LRVkoeCkgICAgICAgKCgoeCkgJiAweEMwKSA+PiA2KQogCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpAQCAtODcsNyArODYsNyBAQAogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KIC8qIExvY2FsIFN0YXRpYyBEZWZpbml0aW9ucyAqLwogCi1zdGF0aWMgY29uc3QgVUlOVDMyIHdlcF9jcmMzMl90YWJsZVsyNTZdID0geworc3RhdGljIGNvbnN0IHUzMiB3ZXBfY3JjMzJfdGFibGVbMjU2XSA9IHsKICAgICAgICAgMHgwMDAwMDAwMEwsIDB4NzcwNzMwOTZMLCAweGVlMGU2MTJjTCwgMHg5OTA5NTFiYUwsIDB4MDc2ZGM0MTlMLAogICAgICAgICAweDcwNmFmNDhmTCwgMHhlOTYzYTUzNUwsIDB4OWU2NDk1YTNMLCAweDBlZGI4ODMyTCwgMHg3OWRjYjhhNEwsCiAgICAgICAgIDB4ZTBkNWU5MWVMLCAweDk3ZDJkOTg4TCwgMHgwOWI2NGMyYkwsIDB4N2ViMTdjYmRMLCAweGU3YjgyZDA3TCwKQEAgLTE1MCw3ICsxNDksNyBAQAogCiAvKiBrZXlsZW4gaW4gYnl0ZXMhICovCiAKLWludCB3ZXBfY2hhbmdlX2tleSh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIGludCBrZXludW0sIFVJTlQ4KiBrZXksIGludCBrZXlsZW4pCitpbnQgd2VwX2NoYW5nZV9rZXkod2xhbmRldmljZV90ICp3bGFuZGV2LCBpbnQga2V5bnVtLCB1OCoga2V5LCBpbnQga2V5bGVuKQogewogCWlmIChrZXlsZW4gPCAwKSAgcmV0dXJuIC0xOwogCWlmIChrZXlsZW4gPj0gTUFYX0tFWUxFTikgcmV0dXJuIC0xOwpAQCAtMTczLDExICsxNzIsMTEgQEAKICAgNC1ieXRlIElWIGF0IHN0YXJ0IG9mIGJ1ZmZlciwgNC1ieXRlIElDViBhdCBlbmQgb2YgYnVmZmVyLgogICBpZiBzdWNjZXNzZnVsLCBidWYgc3RhcnQgaXMgcGF5bG9hZCBiZWdpbiwgbGVuZ3RoIC09IDg7CiAgKi8KLWludCB3ZXBfZGVjcnlwdCh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIFVJTlQ4ICpidWYsIFVJTlQzMiBsZW4sIGludCBrZXlfb3ZlcnJpZGUsIFVJTlQ4ICppdiwgVUlOVDggKmljdikKK2ludCB3ZXBfZGVjcnlwdCh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHU4ICpidWYsIHUzMiBsZW4sIGludCBrZXlfb3ZlcnJpZGUsIHU4ICppdiwgdTggKmljdikKIHsKLQlVSU5UMzIgaSwgaiwgaywgY3JjLCBrZXlsZW47Ci0JVUlOVDggc1syNTZdLCBrZXlbNjRdLCBjX2NyY1s0XTsKLQlVSU5UOCBrZXlpZHg7CisJdTMyIGksIGosIGssIGNyYywga2V5bGVuOworCXU4IHNbMjU2XSwga2V5WzY0XSwgY19jcmNbNF07CisJdTgga2V5aWR4OwogCiAJLyogTmVlZHMgdG8gYmUgYXQgbGVhc3QgOCBieXRlcyBvZiBwYXlsb2FkICovCiAJaWYgKGxlbiA8PSAwKSByZXR1cm4gLTE7CkBAIC0yNDUsMTAgKzI0NCwxMCBAQAogfQogCiAvKiBlbmNyeXB0cyBpbi1wbGFjZS4gKi8KLWludCB3ZXBfZW5jcnlwdCh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIFVJTlQ4ICpidWYsIFVJTlQ4ICpkc3QsIFVJTlQzMiBsZW4sIGludCBrZXludW0sIFVJTlQ4ICppdiwgVUlOVDggKmljdikKK2ludCB3ZXBfZW5jcnlwdCh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHU4ICpidWYsIHU4ICpkc3QsIHUzMiBsZW4sIGludCBrZXludW0sIHU4ICppdiwgdTggKmljdikKIHsKLQlVSU5UMzIgaSwgaiwgaywgY3JjLCBrZXlsZW47Ci0JVUlOVDggc1syNTZdLCBrZXlbNjRdOworCXUzMiBpLCBqLCBrLCBjcmMsIGtleWxlbjsKKwl1OCBzWzI1Nl0sIGtleVs2NF07CiAKIAkvKiBubyBwb2ludCBpbiBXRVBwaW5nIGFuIGVtcHR5IGZyYW1lICovCiAJaWYgKGxlbiA8PSAwKSByZXR1cm4gLTE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTF3ZXh0LmMgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTF3ZXh0LmMKaW5kZXggYjJjOWVhMi4uMGQ1NzBmMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExd2V4dC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMXdleHQuYwpAQCAtMzgsNyArMzgsNiBAQAogLyogU3lzdGVtIEluY2x1ZGVzICovCiAKIAotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CkBAIC00Nyw5ICs0Niw3IEBACiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgotI2lmIFdJUkVMRVNTX0VYVCA+IDEyCiAjaW5jbHVkZSA8bmV0L2l3X2hhbmRsZXIuaD4KLSNlbmRpZgogI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgogI2luY2x1ZGUgPGFzbS9iaXRvcHMuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgpAQCAtNTgsNyArNTUsNiBAQAogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KIC8qIFByb2plY3QgSW5jbHVkZXMgKi8KIAotI2luY2x1ZGUgInZlcnNpb24uaCIKICNpbmNsdWRlICJ3bGFuX2NvbXBhdC5oIgogCiAjaW5jbHVkZSAicDgwMjExdHlwZXMuaCIKQEAgLTc4LDEwICs3NCw4IEBACiBzdGF0aWMgaW50IHA4MDIxMXdleHRfZ2l3ZXNzaWQobmV0ZGV2aWNlX3QgKmRldiwKIAkJCSAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAogCQkJICAgICAgIHN0cnVjdCBpd19wb2ludCAqZGF0YSwgY2hhciAqZXNzaWQpOwotLyogY29tcGF0aWJpbGl0eSB0byB3aXJlbGVzcyBleHRlbnNpb25zICovCi0jaWZkZWYgV0lSRUxFU1NfRVhUCiAKLXN0YXRpYyBVSU5UOCBwODAyMTFfbWh6X3RvX2NoYW5uZWwoVUlOVDE2IG1oeikKK3N0YXRpYyB1OCBwODAyMTFfbWh6X3RvX2NoYW5uZWwodTE2IG1oeikKIHsKIAlpZiAobWh6ID49IDUwMDApIHsKIAkJcmV0dXJuICgobWh6IC0gNTAwMCkgLyA1KTsKQEAgLTk3LDcgKzkxLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIFVJTlQxNiBwODAyMTFfY2hhbm5lbF90b19taHooVUlOVDggY2gsIGludCBkb3QxMWEpCitzdGF0aWMgdTE2IHA4MDIxMV9jaGFubmVsX3RvX21oeih1OCBjaCwgaW50IGRvdDExYSkKIHsKIAogCWlmIChjaCA9PSAwKQpAQCAtMTI4LDcgKzEyMiw3IEBACiAJMjQxMiwgMjQxNywgMjQyMiwgMjQyNywgMjQzMiwgMjQzNywgMjQ0MiwKIAkyNDQ3LCAyNDUyLCAyNDU3LCAyNDYyLCAyNDY3LCAyNDcyLCAyNDg0CiB9OwotI2RlZmluZSBOVU1fQ0hBTk5FTFMgKHNpemVvZihwODAyMTF3ZXh0X2NoYW5uZWxfZnJlcSkgLyBzaXplb2YocDgwMjExd2V4dF9jaGFubmVsX2ZyZXFbMF0pKQorI2RlZmluZSBOVU1fQ0hBTk5FTFMgQVJSQVlfU0laRShwODAyMTF3ZXh0X2NoYW5uZWxfZnJlcSkKIAogLyogc3RlYWwgYSBzcGFyZSBiaXQgdG8gc3RvcmUgdGhlIHNoYXJlZC9vcGVuc3lzdGVtcyBzdGF0ZS4gc2hvdWxkIGRlZmF1bHQgdG8gb3BlbiBpZiBub3Qgc2V0ICovCiAjZGVmaW5lIEhPU1RXRVBfU0hBUkVES0VZIEJJVDMKQEAgLTE0Nyw3ICsxNDEsNyBAQAogCiAKIAotc3RhdGljIGludCBwODAyMTF3ZXh0X2RvcmVxdWVzdCh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIFVJTlQzMiBkaWQsIFVJTlQzMiBkYXRhKQorc3RhdGljIGludCBwODAyMTF3ZXh0X2RvcmVxdWVzdCh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHUzMiBkaWQsIHUzMiBkYXRhKQogewogCXA4MDIxMW1zZ19kb3QxMXJlcV9taWJzZXRfdAltc2c7CiAJcDgwMjExaXRlbV91aW50MzJfdAkJbWliaXRlbTsKQEAgLTE1OSw3ICsxNTMsNyBAQAogCW1pYml0ZW0uZGlkID0gZGlkOwogCW1pYml0ZW0uZGF0YSA9IGRhdGE7CiAJbWVtY3B5KCZtc2cubWliYXR0cmlidXRlLmRhdGEsICZtaWJpdGVtLCBzaXplb2YobWliaXRlbSkpOwotCXJlc3VsdCA9IHA4MDIxMXJlcV9kb3JlcXVlc3Qod2xhbmRldiwgKFVJTlQ4KikmbXNnKTsKKwlyZXN1bHQgPSBwODAyMTFyZXFfZG9yZXF1ZXN0KHdsYW5kZXYsICh1OCopJm1zZyk7CiAKIAlEQkZFWElUOwogCXJldHVybiByZXN1bHQ7CkBAIC0yMDAsNyArMTk0LDcgQEAKIAltZW1jcHkobXNnLnNzaWQuZGF0YS5kYXRhLCBzc2lkLCBkYXRhLmxlbmd0aCk7CiAJbXNnLnNzaWQuZGF0YS5sZW4gPSBkYXRhLmxlbmd0aDsKIAotCXJlc3VsdCA9IHA4MDIxMXJlcV9kb3JlcXVlc3Qod2xhbmRldiwgKFVJTlQ4KikmbXNnKTsKKwlyZXN1bHQgPSBwODAyMTFyZXFfZG9yZXF1ZXN0KHdsYW5kZXYsICh1OCopJm1zZyk7CiAKIAlpZiAocmVzdWx0KSB7CiAJCWVyciA9IC1FRkFVTFQ7CkBAIC0yNDUsMjAgKzIzOSwxNCBAQAogCXdzdGF0cy0+cXVhbC5sZXZlbCA9IHF1YWxpdHkubGV2ZWwuZGF0YTsgIC8qIGluc3RhbnQgc2lnbmFsIGxldmVsICovCiAJd3N0YXRzLT5xdWFsLm5vaXNlID0gcXVhbGl0eS5ub2lzZS5kYXRhOyAgLyogaW5zdGFudCBub2lzZSBsZXZlbCAqLwogCi0jaWYgV0lSRUxFU1NfRVhUID4gMTgKIAl3c3RhdHMtPnF1YWwudXBkYXRlZCA9IElXX1FVQUxfQUxMX1VQREFURUQgfCBJV19RVUFMX0RCTTsKLSNlbHNlCi0Jd3N0YXRzLT5xdWFsLnVwZGF0ZWQgPSA3OwotI2VuZGlmCiAJd3N0YXRzLT5kaXNjYXJkLmNvZGUgPSB3bGFuZGV2LT5yeC5kZWNyeXB0X2VycjsKIAl3c3RhdHMtPmRpc2NhcmQubndpZCA9IDA7CiAJd3N0YXRzLT5kaXNjYXJkLm1pc2MgPSAwOwogCi0jaWYgV0lSRUxFU1NfRVhUID4gMTEKIAl3c3RhdHMtPmRpc2NhcmQuZnJhZ21lbnQgPSAwOyAgLy8gaW5jb21wbGV0ZSBmcmFnbWVudHMKIAl3c3RhdHMtPmRpc2NhcmQucmV0cmllcyA9IDA7ICAgLy8gdHggcmV0cmllcy4KIAl3c3RhdHMtPm1pc3MuYmVhY29uID0gMDsKLSNlbmRpZgogCiAJREJGRVhJVDsKIApAQCAtMzEyLDcgKzMwMCw3IEBACiAJbXNnLm1zZ2NvZGUgPSBESURtc2dfZG90MTFyZXFfbWliZ2V0OwogCW1pYml0ZW0uZGlkID0gRElEbWliX2RvdDExcGh5X2RvdDExUGh5RFNTU1RhYmxlX2RvdDExQ3VycmVudENoYW5uZWw7CiAJbWVtY3B5KCZtc2cubWliYXR0cmlidXRlLmRhdGEsICZtaWJpdGVtLCBzaXplb2YobWliaXRlbSkpOwotCXJlc3VsdCA9IHA4MDIxMXJlcV9kb3JlcXVlc3Qod2xhbmRldiwgKFVJTlQ4KikmbXNnKTsKKwlyZXN1bHQgPSBwODAyMTFyZXFfZG9yZXF1ZXN0KHdsYW5kZXYsICh1OCopJm1zZyk7CiAKIAlpZiAocmVzdWx0KSB7CiAJCWVyciA9IC1FRkFVTFQ7CkBAIC0zNjIsNyArMzUwLDcgQEAKIAkJbWliaXRlbS5kYXRhID0gcDgwMjExX21oel90b19jaGFubmVsKGZyZXEtPm0pOwogCiAJbWVtY3B5KCZtc2cubWliYXR0cmlidXRlLmRhdGEsICZtaWJpdGVtLCBzaXplb2YobWliaXRlbSkpOwotCXJlc3VsdCA9IHA4MDIxMXJlcV9kb3JlcXVlc3Qod2xhbmRldiwgKFVJTlQ4KikmbXNnKTsKKwlyZXN1bHQgPSBwODAyMTFyZXFfZG9yZXF1ZXN0KHdsYW5kZXYsICh1OCopJm1zZyk7CiAKIAlpZiAocmVzdWx0KSB7CiAJCWVyciA9IC1FRkFVTFQ7CkBAIC0zNzQsOCArMzYyLDYgQEAKIAlyZXR1cm4gZXJyOwogfQogCi0jaWYgV0lSRUxFU1NfRVhUID4gOAotCiBzdGF0aWMgaW50IHA4MDIxMXdleHRfZ2l3bW9kZShuZXRkZXZpY2VfdCAqZGV2LAogCQkJICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKIAkJCSAgICAgIF9fdTMyICptb2RlLCBjaGFyICpleHRyYSkKQEAgLTQ0NywxNCArNDMzLDExIEBACiAJfQogCiAJLyogU2V0IE9wZXJhdGlvbiBtb2RlIHRvIHRoZSBQT1JUIFRZUEUgUklEICovCi0KLSN3YXJuaW5nICJnZXQgcmlkIG9mIHAybWliIGhlcmUiCi0KIAltc2cubXNnY29kZSA9IERJRG1zZ19kb3QxMXJlcV9taWJzZXQ7CiAJbWliaXRlbS5kaWQgPSBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZQb3J0VHlwZTsKIAltaWJpdGVtLmRhdGEgPSAoKm1vZGUgPT0gSVdfTU9ERV9BREhPQykgPyAwIDogMTsKIAltZW1jcHkoJm1zZy5taWJhdHRyaWJ1dGUuZGF0YSwgJm1pYml0ZW0sIHNpemVvZihtaWJpdGVtKSk7Ci0JcmVzdWx0ID0gcDgwMjExcmVxX2RvcmVxdWVzdCh3bGFuZGV2LCAoVUlOVDgqKSZtc2cpOworCXJlc3VsdCA9IHA4MDIxMXJlcV9kb3JlcXVlc3Qod2xhbmRldiwgKHU4KikmbXNnKTsKIAogCWlmIChyZXN1bHQpCiAJCWVyciA9IC1FRkFVTFQ7CkBAIC00NzksMTIgKzQ2Miw5IEBACiAJZGF0YS0+bGVuZ3RoID0gc2l6ZW9mKCpyYW5nZSk7CiAJbWVtc2V0KHJhbmdlLDAsc2l6ZW9mKCpyYW5nZSkpOwogCi0jaWYgV0lSRUxFU1NfRVhUID4gOQogCXJhbmdlLT50eHBvd2VyX2NhcGEgPSBJV19UWFBPV19EQk07CiAJLy8gWFhYIHdoYXQgYWJvdXQgbWluL21heF9wbXAsIG1pbi9tYXhfcG10LCBldGMuCi0jZW5kaWYKIAotI2lmIFdJUkVMRVNTX0VYVCA+IDEwCiAJcmFuZ2UtPndlX3ZlcnNpb25fY29tcGlsZWQgPSBXSVJFTEVTU19FWFQ7CiAJcmFuZ2UtPndlX3ZlcnNpb25fc291cmNlID0gMTM7CiAKQEAgLTQ5MiwxNiArNDcyLDEzIEBACiAJcmFuZ2UtPnJldHJ5X2ZsYWdzID0gSVdfUkVUUllfTElNSVQ7CiAJcmFuZ2UtPm1pbl9yZXRyeSA9IDA7CiAJcmFuZ2UtPm1heF9yZXRyeSA9IDI1NTsKLSNlbmRpZiAvKiBXSVJFTEVTU19FWFQgPiAxMCAqLwogCi0jaWYgV0lSRUxFU1NfRVhUID4gMTYKICAgICAgICAgcmFuZ2UtPmV2ZW50X2NhcGFbMF0gPSAoSVdfRVZFTlRfQ0FQQV9LXzAgfCAgLy9tb2RlL2ZyZXEvc3NpZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJV19FVkVOVF9DQVBBX01BU0soU0lPQ0dJV0FQKSB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElXX0VWRU5UX0NBUEFfTUFTSyhTSU9DR0lXU0NBTikpOwogICAgICAgICByYW5nZS0+ZXZlbnRfY2FwYVsxXSA9IElXX0VWRU5UX0NBUEFfS18xOyAgLy9lbmNvZGUKICAgICAgICAgcmFuZ2UtPmV2ZW50X2NhcGFbNF0gPSAoSVdfRVZFTlRfQ0FQQV9NQVNLKElXRVZRVUFMKSB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElXX0VWRU5UX0NBUEFfTUFTSyhJV0VWQ1VTVE9NKSApOwotI2VuZGlmCiAKIAlyYW5nZS0+bnVtX2NoYW5uZWxzID0gTlVNX0NIQU5ORUxTOwogCkBAIC01NDMsNyArNTIwLDYgQEAKIAlEQkZFWElUOwogCXJldHVybiAwOwogfQotI2VuZGlmCiAKIHN0YXRpYyBpbnQgcDgwMjExd2V4dF9naXdhcChuZXRkZXZpY2VfdCAqZGV2LAogCQkJICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCkBAIC01NjEsNyArNTM3LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotI2lmIFdJUkVMRVNTX0VYVCA+IDgKIHN0YXRpYyBpbnQgcDgwMjExd2V4dF9naXdlbmNvZGUobmV0ZGV2aWNlX3QgKmRldiwKIAkJCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAogCQkJCXN0cnVjdCBpd19wb2ludCAqZXJxLCBjaGFyICprZXkpCkBAIC01NzIsMTAgKzU0NywxMyBAQAogCiAJREJGRU5URVI7CiAKKwlpID0gKGVycS0+ZmxhZ3MgJiBJV19FTkNPREVfSU5ERVgpIC0gMTsKKwllcnEtPmZsYWdzID0gMDsKKwogCWlmICh3bGFuZGV2LT5ob3N0d2VwICYgSE9TVFdFUF9QUklWQUNZSU5WT0tFRCkKLQkJZXJxLT5mbGFncyA9IElXX0VOQ09ERV9FTkFCTEVEOworCQllcnEtPmZsYWdzIHw9IElXX0VOQ09ERV9FTkFCTEVEOwogCWVsc2UKLQkJZXJxLT5mbGFncyA9IElXX0VOQ09ERV9ESVNBQkxFRDsKKwkJZXJxLT5mbGFncyB8PSBJV19FTkNPREVfRElTQUJMRUQ7CiAKIAlpZiAod2xhbmRldi0+aG9zdHdlcCAmIEhPU1RXRVBfRVhDTFVERVVORU5DUllQVEVEKQogCQllcnEtPmZsYWdzIHw9IElXX0VOQ09ERV9SRVNUUklDVEVEOwpAQCAtNjEzLDcgKzU5MSw2IEBACiAKIAlpbnQgZXJyID0gMDsKIAlpbnQgcmVzdWx0ID0gMDsKLQlpbnQgZW5hYmxlID0gMDsKIAlpbnQgaTsKIAogCURCRkVOVEVSOwpAQCAtNjMyLDIzICs2MDksMjMgQEAKIAkJZWxzZQogCQkJaS0tOwogCi0JCXJlc3VsdCA9IHA4MDIxMXdleHRfZG9yZXF1ZXN0KHdsYW5kZXYsIERJRG1pYl9kb3QxMXNtdF9kb3QxMVByaXZhY3lUYWJsZV9kb3QxMVdFUERlZmF1bHRLZXlJRCwgaSk7CisJCS8qIFNldCBjdXJyZW50IGtleSBudW1iZXIgb25seSBpZiBubyBrZXlzIGFyZSBnaXZlbiAqLworCQlpZiAoZXJxLT5mbGFncyAmIElXX0VOQ09ERV9OT0tFWSkgeworCQkJcmVzdWx0ID0gcDgwMjExd2V4dF9kb3JlcXVlc3Qod2xhbmRldiwgRElEbWliX2RvdDExc210X2RvdDExUHJpdmFjeVRhYmxlX2RvdDExV0VQRGVmYXVsdEtleUlELCBpKTsKIAotCQlpZiAocmVzdWx0KSB7Ci0JCQllcnIgPSAtRUZBVUxUOwotCQkJZ290byBleGl0OwotCQl9Ci0JCWVsc2UgewotCQkJZW5hYmxlID0gMTsKKwkJCWlmIChyZXN1bHQpIHsKKwkJCQllcnIgPSAtRUZBVUxUOworCQkJCWdvdG8gZXhpdDsKKwkJCX0KIAkJfQogCi0JfQotCWVsc2UgewotCQkvLyBEbyBub3QgdGhpbmcgd2hlbiBubyBLZXkgSW5kZXgKKwl9IGVsc2UgeworCQkvLyBVc2UgZGVmYXVsdGtleSBpZiBubyBLZXkgSW5kZXgKKwkJaSA9IHdsYW5kZXYtPmhvc3R3ZXAgJiBIT1NUV0VQX0RFRkFVTFRLRVlfTUFTSzsKIAl9CiAKIAkvKiBDaGVjayBpZiB0aGVyZSBpcyBubyBrZXkgaW5mb3JtYXRpb24gaW4gdGhlIGl3Y29uZmlnIHJlcXVlc3QgKi8KLQlpZigoZXJxLT5mbGFncyAmIElXX0VOQ09ERV9OT0tFWSkgPT0gMCAmJiBlbmFibGUgPT0gMSkgeworCWlmKChlcnEtPmZsYWdzICYgSVdfRU5DT0RFX05PS0VZKSA9PSAwICkgewogCiAJCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAJCSAqIElmIHRoZXJlIGlzIFdFUCBLZXkgZm9yIHNldHRpbmcsIGNoZWNrIHRoZSBLZXkgSW5mb3JtYXRpb24KQEAgLTY5MCw3ICs2NjcsNyBAQAogCiAJCQltc2cubXNnY29kZSA9IERJRG1zZ19kb3QxMXJlcV9taWJzZXQ7CiAJCQltZW1jcHkoJm1zZy5taWJhdHRyaWJ1dGUuZGF0YSwgJnBzdHIsIHNpemVvZihwc3RyKSk7Ci0JCQlyZXN1bHQgPSBwODAyMTFyZXFfZG9yZXF1ZXN0KHdsYW5kZXYsIChVSU5UOCopJm1zZyk7CisJCQlyZXN1bHQgPSBwODAyMTFyZXFfZG9yZXF1ZXN0KHdsYW5kZXYsICh1OCopJm1zZyk7CiAKIAkJCWlmIChyZXN1bHQpIHsKIAkJCQllcnIgPSAtRUZBVUxUOwpAQCAtNzAzLDggKzY4MCw3IEBACiAJLyogQ2hlY2sgdGhlIFByaXZhY3lJbnZva2VkIGZsYWcgKi8KIAlpZiAoZXJxLT5mbGFncyAmIElXX0VOQ09ERV9ESVNBQkxFRCkgewogCQlyZXN1bHQgPSBwODAyMTF3ZXh0X2RvcmVxdWVzdCh3bGFuZGV2LCBESURtaWJfZG90MTFzbXRfZG90MTFQcml2YWN5VGFibGVfZG90MTFQcml2YWN5SW52b2tlZCwgUDgwMjExRU5VTV90cnV0aF9mYWxzZSk7Ci0JfQotCWVsc2UgaWYoKGVycS0+ZmxhZ3MgJiBJV19FTkNPREVfRU5BQkxFRCkgfHwgZW5hYmxlID09IDEpIHsKKwl9IGVsc2UgewogCQlyZXN1bHQgPSBwODAyMTF3ZXh0X2RvcmVxdWVzdCh3bGFuZGV2LCBESURtaWJfZG90MTFzbXRfZG90MTFQcml2YWN5VGFibGVfZG90MTFQcml2YWN5SW52b2tlZCwgUDgwMjExRU5VTV90cnV0aF90cnVlKTsKIAl9CiAKQEAgLTcxMyw3ICs2ODksMTMgQEAKIAkJZ290byBleGl0OwogCX0KIAotCS8qIENoZWNrIHRoZSBFeGNsdWRlVW5lbmNyeXB0ZWQgZmxhZyAqLworCS8qICBUaGUgIHNlY3VyaXR5ICBtb2RlICBtYXkgIGJlIG9wZW4gb3IgcmVzdHJpY3RlZCwgYW5kIGl0cyBtZWFuaW5nCisJICAgIGRlcGVuZHMgb24gdGhlIGNhcmQgdXNlZC4gV2l0aCAgbW9zdCAgY2FyZHMsICBpbiAgb3BlbiAgbW9kZSAgbm8KKwkgICAgYXV0aGVudGljYXRpb24gIGlzICB1c2VkICBhbmQgIHRoZSAgY2FyZCAgbWF5ICBhbHNvICBhY2NlcHQgbm9uLQorCSAgICBlbmNyeXB0ZWQgc2Vzc2lvbnMsIHdoZXJlYXMgaW4gcmVzdHJpY3RlZCAgbW9kZSAgb25seSAgZW5jcnlwdGVkCisJICAgIHNlc3Npb25zICBhcmUgIGFjY2VwdGVkICBhbmQgdGhlIGNhcmQgd2lsbCB1c2UgYXV0aGVudGljYXRpb24gaWYKKwkgICAgYXZhaWxhYmxlLgorCSovCiAJaWYgKGVycS0+ZmxhZ3MgJiBJV19FTkNPREVfUkVTVFJJQ1RFRCkgewogCQlyZXN1bHQgPSBwODAyMTF3ZXh0X2RvcmVxdWVzdCh3bGFuZGV2LCBESURtaWJfZG90MTFzbXRfZG90MTFQcml2YWN5VGFibGVfZG90MTFFeGNsdWRlVW5lbmNyeXB0ZWQsIFA4MDIxMUVOVU1fdHJ1dGhfdHJ1ZSk7CiAJfQpAQCAtNzk4LDcgKzc4MCw3IEBACiAJbXNnLnNzaWQuZGF0YS5sZW4gPSBsZW5ndGg7CiAKIAlXTEFOX0xPR19ERUJVRygxLCJhdXRvam9pbl9zc2lkIGZvciAlcyBcbiIsZXNzaWQpOwotCXJlc3VsdCA9IHA4MDIxMXJlcV9kb3JlcXVlc3Qod2xhbmRldiwgKFVJTlQ4KikmbXNnKTsKKwlyZXN1bHQgPSBwODAyMTFyZXFfZG9yZXF1ZXN0KHdsYW5kZXYsICh1OCopJm1zZyk7CiAgICAgICAgIFdMQU5fTE9HX0RFQlVHKDEsImF1dG9qb2luX3NzaWQgJWRcbiIscmVzdWx0KTsKIAogCWlmIChyZXN1bHQpIHsKQEAgLTg1MCw3ICs4MzIsNyBAQAogCW1zZy5tc2djb2RlID0gRElEbXNnX2RvdDExcmVxX21pYmdldDsKIAltaWJpdGVtLmRpZCA9IERJRG1pYl9wMl9wMk1BQ19wMkN1cnJlbnRUeFJhdGU7CiAJbWVtY3B5KCZtc2cubWliYXR0cmlidXRlLmRhdGEsICZtaWJpdGVtLCBzaXplb2YobWliaXRlbSkpOwotCXJlc3VsdCA9IHA4MDIxMXJlcV9kb3JlcXVlc3Qod2xhbmRldiwgKFVJTlQ4KikmbXNnKTsKKwlyZXN1bHQgPSBwODAyMTFyZXFfZG9yZXF1ZXN0KHdsYW5kZXYsICh1OCopJm1zZyk7CiAKIAlpZiAocmVzdWx0KSB7CiAJCWVyciA9IC1FRkFVTFQ7CkBAIC04NjMsMTAgKzg0NSwxMCBAQAogCXJycS0+ZGlzYWJsZWQgPSAwOwogCXJycS0+dmFsdWUgPSAwOwogCi0jZGVmaW5lCQlIRkEzODR4X1JBVEVCSVRfMQkJCSgoVUlOVDE2KTEpCi0jZGVmaW5lCQlIRkEzODR4X1JBVEVCSVRfMgkJCSgoVUlOVDE2KTIpCi0jZGVmaW5lCQlIRkEzODR4X1JBVEVCSVRfNWRvdDUJCQkoKFVJTlQxNik0KQotI2RlZmluZQkJSEZBMzg0eF9SQVRFQklUXzExCQkJKChVSU5UMTYpOCkKKyNkZWZpbmUJCUhGQTM4NHhfUkFURUJJVF8xCQkJKCh1MTYpMSkKKyNkZWZpbmUJCUhGQTM4NHhfUkFURUJJVF8yCQkJKCh1MTYpMikKKyNkZWZpbmUJCUhGQTM4NHhfUkFURUJJVF81ZG90NQkJCSgodTE2KTQpCisjZGVmaW5lCQlIRkEzODR4X1JBVEVCSVRfMTEJCQkoKHUxNik4KQogCiAJc3dpdGNoIChtaWJpdGVtLmRhdGEpIHsKIAljYXNlIEhGQTM4NHhfUkFURUJJVF8xOgpAQCAtOTA0LDcgKzg4Niw3IEBACiAJbXNnLm1zZ2NvZGUgPSBESURtc2dfZG90MTFyZXFfbWliZ2V0OwogCW1pYml0ZW0uZGlkID0gRElEbWliX2RvdDExbWFjX2RvdDExT3BlcmF0aW9uVGFibGVfZG90MTFSVFNUaHJlc2hvbGQ7CiAJbWVtY3B5KCZtc2cubWliYXR0cmlidXRlLmRhdGEsICZtaWJpdGVtLCBzaXplb2YobWliaXRlbSkpOwotCXJlc3VsdCA9IHA4MDIxMXJlcV9kb3JlcXVlc3Qod2xhbmRldiwgKFVJTlQ4KikmbXNnKTsKKwlyZXN1bHQgPSBwODAyMTFyZXFfZG9yZXF1ZXN0KHdsYW5kZXYsICh1OCopJm1zZyk7CiAKIAlpZiAocmVzdWx0KSB7CiAJCWVyciA9IC1FRkFVTFQ7CkBAIC05NDgsNyArOTMwLDcgQEAKIAkJbWliaXRlbS5kYXRhID0gcnRzLT52YWx1ZTsKIAogCW1lbWNweSgmbXNnLm1pYmF0dHJpYnV0ZS5kYXRhLCAmbWliaXRlbSwgc2l6ZW9mKG1pYml0ZW0pKTsKLQlyZXN1bHQgPSBwODAyMTFyZXFfZG9yZXF1ZXN0KHdsYW5kZXYsIChVSU5UOCopJm1zZyk7CisJcmVzdWx0ID0gcDgwMjExcmVxX2RvcmVxdWVzdCh3bGFuZGV2LCAodTgqKSZtc2cpOwogCiAJaWYgKHJlc3VsdCkgewogCQllcnIgPSAtRUZBVUxUOwpAQCAtOTc1LDcgKzk1Nyw3IEBACiAJbXNnLm1zZ2NvZGUgPSBESURtc2dfZG90MTFyZXFfbWliZ2V0OwogCW1pYml0ZW0uZGlkID0gRElEbWliX2RvdDExbWFjX2RvdDExT3BlcmF0aW9uVGFibGVfZG90MTFGcmFnbWVudGF0aW9uVGhyZXNob2xkOwogCW1lbWNweSgmbXNnLm1pYmF0dHJpYnV0ZS5kYXRhLCAmbWliaXRlbSwgc2l6ZW9mKG1pYml0ZW0pKTsKLQlyZXN1bHQgPSBwODAyMTFyZXFfZG9yZXF1ZXN0KHdsYW5kZXYsIChVSU5UOCopJm1zZyk7CisJcmVzdWx0ID0gcDgwMjExcmVxX2RvcmVxdWVzdCh3bGFuZGV2LCAodTgqKSZtc2cpOwogCiAJaWYgKHJlc3VsdCkgewogCQllcnIgPSAtRUZBVUxUOwpAQCAtMTAxOSw3ICsxMDAxLDcgQEAKIAkJbWliaXRlbS5kYXRhID0gZnJhZy0+dmFsdWU7CiAKIAltZW1jcHkoJm1zZy5taWJhdHRyaWJ1dGUuZGF0YSwgJm1pYml0ZW0sIHNpemVvZihtaWJpdGVtKSk7Ci0JcmVzdWx0ID0gcDgwMjExcmVxX2RvcmVxdWVzdCh3bGFuZGV2LCAoVUlOVDgqKSZtc2cpOworCXJlc3VsdCA9IHA4MDIxMXJlcV9kb3JlcXVlc3Qod2xhbmRldiwgKHU4KikmbXNnKTsKIAogCWlmIChyZXN1bHQpIHsKIAkJZXJyID0gLUVGQVVMVDsKQEAgLTEwMzEsMTAgKzEwMTMsNiBAQAogCXJldHVybiBlcnI7CiB9CiAKLSNlbmRpZiAgLyogV0lSRUxFU1NfRVhUID4gOCAqLwotCi0jaWYgV0lSRUxFU1NfRVhUID4gMTAKLQogI2lmbmRlZiBJV19SRVRSWV9MT05HCiAjZGVmaW5lIElXX1JFVFJZX0xPTkcgSVdfUkVUUllfTUFYCiAjZW5kaWYKQEAgLTEwNTIsNyArMTAzMCw3IEBACiAJcDgwMjExbXNnX2RvdDExcmVxX21pYnNldF90ICAgICBtc2c7CiAJaW50IHJlc3VsdDsKIAlpbnQgZXJyID0gMDsKLQlVSU5UMTYgc2hvcnRyZXRyeSwgbG9uZ3JldHJ5LCBsaWZldGltZTsKKwl1MTYgc2hvcnRyZXRyeSwgbG9uZ3JldHJ5LCBsaWZldGltZTsKIAogCURCRkVOVEVSOwogCkBAIC0xMDYwLDcgKzEwMzgsNyBAQAogCW1pYml0ZW0uZGlkID0gRElEbWliX2RvdDExbWFjX2RvdDExT3BlcmF0aW9uVGFibGVfZG90MTFTaG9ydFJldHJ5TGltaXQ7CiAKIAltZW1jcHkoJm1zZy5taWJhdHRyaWJ1dGUuZGF0YSwgJm1pYml0ZW0sIHNpemVvZihtaWJpdGVtKSk7Ci0JcmVzdWx0ID0gcDgwMjExcmVxX2RvcmVxdWVzdCh3bGFuZGV2LCAoVUlOVDgqKSZtc2cpOworCXJlc3VsdCA9IHA4MDIxMXJlcV9kb3JlcXVlc3Qod2xhbmRldiwgKHU4KikmbXNnKTsKIAogCWlmIChyZXN1bHQpIHsKIAkJZXJyID0gLUVGQVVMVDsKQEAgLTEwNzQsNyArMTA1Miw3IEBACiAJbWliaXRlbS5kaWQgPSBESURtaWJfZG90MTFtYWNfZG90MTFPcGVyYXRpb25UYWJsZV9kb3QxMUxvbmdSZXRyeUxpbWl0OwogCiAJbWVtY3B5KCZtc2cubWliYXR0cmlidXRlLmRhdGEsICZtaWJpdGVtLCBzaXplb2YobWliaXRlbSkpOwotCXJlc3VsdCA9IHA4MDIxMXJlcV9kb3JlcXVlc3Qod2xhbmRldiwgKFVJTlQ4KikmbXNnKTsKKwlyZXN1bHQgPSBwODAyMTFyZXFfZG9yZXF1ZXN0KHdsYW5kZXYsICh1OCopJm1zZyk7CiAKIAlpZiAocmVzdWx0KSB7CiAJCWVyciA9IC1FRkFVTFQ7CkBAIC0xMDg4LDcgKzEwNjYsNyBAQAogCW1pYml0ZW0uZGlkID0gRElEbWliX2RvdDExbWFjX2RvdDExT3BlcmF0aW9uVGFibGVfZG90MTFNYXhUcmFuc21pdE1TRFVMaWZldGltZTsKIAogCW1lbWNweSgmbXNnLm1pYmF0dHJpYnV0ZS5kYXRhLCAmbWliaXRlbSwgc2l6ZW9mKG1pYml0ZW0pKTsKLQlyZXN1bHQgPSBwODAyMTFyZXFfZG9yZXF1ZXN0KHdsYW5kZXYsIChVSU5UOCopJm1zZyk7CisJcmVzdWx0ID0gcDgwMjExcmVxX2RvcmVxdWVzdCh3bGFuZGV2LCAodTgqKSZtc2cpOwogCiAJaWYgKHJlc3VsdCkgewogCQllcnIgPSAtRUZBVUxUOwpAQCAtMTE1MSw3ICsxMTI5LDcgQEAKIAkJbWliaXRlbS5kYXRhID0gIHJycS0+dmFsdWUgLz0gMTAyNDsKIAogCQltZW1jcHkoJm1zZy5taWJhdHRyaWJ1dGUuZGF0YSwgJm1pYml0ZW0sIHNpemVvZihtaWJpdGVtKSk7Ci0JCXJlc3VsdCA9IHA4MDIxMXJlcV9kb3JlcXVlc3Qod2xhbmRldiwgKFVJTlQ4KikmbXNnKTsKKwkJcmVzdWx0ID0gcDgwMjExcmVxX2RvcmVxdWVzdCh3bGFuZGV2LCAodTgqKSZtc2cpOwogCiAJCWlmIChyZXN1bHQpIHsKIAkJCWVyciA9IC1FRkFVTFQ7CkBAIC0xMTYzLDcgKzExNDEsNyBAQAogCQkJbWliaXRlbS5kYXRhID0gcnJxLT52YWx1ZTsKIAogCQkJbWVtY3B5KCZtc2cubWliYXR0cmlidXRlLmRhdGEsICZtaWJpdGVtLCBzaXplb2YobWliaXRlbSkpOwotCQkJcmVzdWx0ID0gcDgwMjExcmVxX2RvcmVxdWVzdCh3bGFuZGV2LCAoVUlOVDgqKSZtc2cpOworCQkJcmVzdWx0ID0gcDgwMjExcmVxX2RvcmVxdWVzdCh3bGFuZGV2LCAodTgqKSZtc2cpOwogCiAJCQlpZiAocmVzdWx0KSB7CiAJCQkJZXJyID0gLUVGQVVMVDsKQEAgLTExNzYsNyArMTE1NCw3IEBACiAJCQltaWJpdGVtLmRhdGEgPSBycnEtPnZhbHVlOwogCiAJCQltZW1jcHkoJm1zZy5taWJhdHRyaWJ1dGUuZGF0YSwgJm1pYml0ZW0sIHNpemVvZihtaWJpdGVtKSk7Ci0JCQlyZXN1bHQgPSBwODAyMTFyZXFfZG9yZXF1ZXN0KHdsYW5kZXYsIChVSU5UOCopJm1zZyk7CisJCQlyZXN1bHQgPSBwODAyMTFyZXFfZG9yZXF1ZXN0KHdsYW5kZXYsICh1OCopJm1zZyk7CiAKIAkJCWlmIChyZXN1bHQpIHsKIAkJCQllcnIgPSAtRUZBVUxUOwpAQCAtMTE5MSw5ICsxMTY5LDYgQEAKIAogfQogCi0jZW5kaWYgLyogV0lSRUxFU1NfRVhUID4gMTAgKi8KLQotI2lmIFdJUkVMRVNTX0VYVCA+IDkKIHN0YXRpYyBpbnQgcDgwMjExd2V4dF9zaXd0eHBvdyhuZXRkZXZpY2VfdCAqZGV2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGl3X3BhcmFtICpycnEsIGNoYXIgKmV4dHJhKQpAQCAtMTIxMiwyMiArMTE4NywxMyBAQAogICAgICAgICB9CiAKICAgICAgICAgbXNnLm1zZ2NvZGUgPSBESURtc2dfZG90MTFyZXFfbWlic2V0OwotCi0gICAgICAgIHN3aXRjaCAocnJxLT52YWx1ZSkgewotCi0gICAgICAgICAgY2FzZSAxIDogbWliaXRlbS5kaWQgPSBESURtaWJfZG90MTFwaHlfZG90MTFQaHlUeFBvd2VyVGFibGVfZG90MTFUeFBvd2VyTGV2ZWwxOyBicmVhazsKLSAgICAgICAgICBjYXNlIDIgOiBtaWJpdGVtLmRpZCA9IERJRG1pYl9kb3QxMXBoeV9kb3QxMVBoeVR4UG93ZXJUYWJsZV9kb3QxMVR4UG93ZXJMZXZlbDI7IGJyZWFrOwotICAgICAgICAgIGNhc2UgMyA6IG1pYml0ZW0uZGlkID0gRElEbWliX2RvdDExcGh5X2RvdDExUGh5VHhQb3dlclRhYmxlX2RvdDExVHhQb3dlckxldmVsMzsgYnJlYWs7Ci0gICAgICAgICAgY2FzZSA0IDogbWliaXRlbS5kaWQgPSBESURtaWJfZG90MTFwaHlfZG90MTFQaHlUeFBvd2VyVGFibGVfZG90MTFUeFBvd2VyTGV2ZWw0OyBicmVhazsKLSAgICAgICAgICBjYXNlIDUgOiBtaWJpdGVtLmRpZCA9IERJRG1pYl9kb3QxMXBoeV9kb3QxMVBoeVR4UG93ZXJUYWJsZV9kb3QxMVR4UG93ZXJMZXZlbDU7IGJyZWFrOwotICAgICAgICAgIGNhc2UgNiA6IG1pYml0ZW0uZGlkID0gRElEbWliX2RvdDExcGh5X2RvdDExUGh5VHhQb3dlclRhYmxlX2RvdDExVHhQb3dlckxldmVsNjsgYnJlYWs7Ci0gICAgICAgICAgY2FzZSA3IDogbWliaXRlbS5kaWQgPSBESURtaWJfZG90MTFwaHlfZG90MTFQaHlUeFBvd2VyVGFibGVfZG90MTFUeFBvd2VyTGV2ZWw3OyBicmVhazsKLSAgICAgICAgICBjYXNlIDggOiBtaWJpdGVtLmRpZCA9IERJRG1pYl9kb3QxMXBoeV9kb3QxMVBoeVR4UG93ZXJUYWJsZV9kb3QxMVR4UG93ZXJMZXZlbDg7IGJyZWFrOwotICAgICAgICAgIGRlZmF1bHQ6IG1pYml0ZW0uZGlkID0gRElEbWliX2RvdDExcGh5X2RvdDExUGh5VHhQb3dlclRhYmxlX2RvdDExVHhQb3dlckxldmVsODsgYnJlYWs7Ci0JfQotCisJbWliaXRlbS5kaWQgPSBESURtaWJfZG90MTFwaHlfZG90MTFQaHlUeFBvd2VyVGFibGVfZG90MTFDdXJyZW50VHhQb3dlckxldmVsOworCWlmIChycnEtPmZpeGVkID09IDApCisJICBtaWJpdGVtLmRhdGEgPSAzMDsKKwllbHNlCisJICBtaWJpdGVtLmRhdGEgPSBycnEtPnZhbHVlOwogICAgICAgICBtZW1jcHkoJm1zZy5taWJhdHRyaWJ1dGUuZGF0YSwgJm1pYml0ZW0sIHNpemVvZihtaWJpdGVtKSk7Ci0gICAgICAgIHJlc3VsdCA9IHA4MDIxMXJlcV9kb3JlcXVlc3Qod2xhbmRldiwgKFVJTlQ4KikmbXNnKTsKKyAgICAgICAgcmVzdWx0ID0gcDgwMjExcmVxX2RvcmVxdWVzdCh3bGFuZGV2LCAodTgqKSZtc2cpOwogCiAgICAgICAgIGlmIChyZXN1bHQpIHsKICAgICAgICAgICAgICAgICBlcnIgPSAtRUZBVUxUOwpAQCAtMTI1NSw3ICsxMjIxLDcgQEAKIAltaWJpdGVtLmRpZCA9IERJRG1pYl9kb3QxMXBoeV9kb3QxMVBoeVR4UG93ZXJUYWJsZV9kb3QxMUN1cnJlbnRUeFBvd2VyTGV2ZWw7CiAKIAltZW1jcHkoJm1zZy5taWJhdHRyaWJ1dGUuZGF0YSwgJm1pYml0ZW0sIHNpemVvZihtaWJpdGVtKSk7Ci0JcmVzdWx0ID0gcDgwMjExcmVxX2RvcmVxdWVzdCh3bGFuZGV2LCAoVUlOVDgqKSZtc2cpOworCXJlc3VsdCA9IHA4MDIxMXJlcV9kb3JlcXVlc3Qod2xhbmRldiwgKHU4KikmbXNnKTsKIAogCWlmIChyZXN1bHQpIHsKIAkJZXJyID0gLUVGQVVMVDsKQEAgLTEyNzUsNyArMTI0MSw2IEBACiAJREJGRVhJVDsKIAlyZXR1cm4gZXJyOwogfQotI2VuZGlmIC8qIFdJUkVMRVNTX0VYVCA+IDkgKi8KIAogc3RhdGljIGludCBwODAyMTF3ZXh0X3Npd3NweShuZXRkZXZpY2VfdCAqZGV2LAogCQkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLApAQCAtMTM3Myw3ICsxMzM4LDYgQEAKIAlyZXR1cm4gZXJyOwogfQogCi0jaWYgV0lSRUxFU1NfRVhUID4gMTMKIHN0YXRpYyBpbnQgcDgwMjExd2V4dF9zaXdzY2FuKG5ldGRldmljZV90ICpkZXYsCiAJCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCiAJCQkgICAgIHN0cnVjdCBpd19wb2ludCAqc3JxLCBjaGFyICpleHRyYSkKQEAgLTE0MDksNyArMTM3Myw3IEBACiAJbXNnLm1heGNoYW5uZWx0aW1lLmRhdGEgPSAyNTA7CiAJbXNnLm1pbmNoYW5uZWx0aW1lLmRhdGEgPSAyMDA7CiAKLQlyZXN1bHQgPSBwODAyMTFyZXFfZG9yZXF1ZXN0KHdsYW5kZXYsIChVSU5UOCopJm1zZyk7CisJcmVzdWx0ID0gcDgwMjExcmVxX2RvcmVxdWVzdCh3bGFuZGV2LCAodTgqKSZtc2cpOwogCWlmIChyZXN1bHQpCiAJCWVyciA9IHByaXNtMl9yZXN1bHQyZXJyIChtc2cucmVzdWx0Y29kZS5kYXRhKTsKIApAQCAtMTUyMCw3ICsxNDg0LDcgQEAKIAkJbXNnLm1zZ2NvZGUgPSBESURtc2dfZG90MTFyZXFfc2Nhbl9yZXN1bHRzOwogCQltc2cuYnNzaW5kZXguZGF0YSA9IGk7CiAKLQkJcmVzdWx0ID0gcDgwMjExcmVxX2RvcmVxdWVzdCh3bGFuZGV2LCAoVUlOVDgqKSZtc2cpOworCQlyZXN1bHQgPSBwODAyMTFyZXFfZG9yZXF1ZXN0KHdsYW5kZXYsICh1OCopJm1zZyk7CiAJCWlmICgocmVzdWx0ICE9IDApIHx8CiAJCSAgICAobXNnLnJlc3VsdGNvZGUuZGF0YSAhPSBQODAyMTFFTlVNX3Jlc3VsdGNvZGVfc3VjY2VzcykpIHsKIAkJCWJyZWFrOwpAQCAtMTU0MCwxMiArMTUwNCwxMCBAQAogCURCRkVYSVQ7CiAJcmV0dXJuIGVycjsKIH0KLSNlbmRpZgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvL2V4dHJhIHdpcmVsZXNzIGV4dGVuc2lvbnMgc3R1ZmYgdG8gc3VwcG9ydCBOZXR3b3JrTWFuYWdlciAoSSBob3BlKQogCi0jaWYgV0lSRUxFU1NfRVhUID4gMTcKIC8qIFNJT0NTSVdFTkNPREVFWFQgKi8KIHN0YXRpYyBpbnQgcDgwMjExd2V4dF9zZXRfZW5jb2RlZXh0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKQEAgLTE1ODAsNyArMTU0Miw3IEBACiAKIAogICBpZiAoIGV4dC0+ZXh0X2ZsYWdzICYgSVdfRU5DT0RFX0VYVF9TRVRfVFhfS0VZICkgewotICAgIGlmICggISBleHQtPmFsZyAmIElXX0VOQ09ERV9BTEdfV0VQKSB7CisgICAgaWYgKCEoZXh0LT5hbGcgJiBJV19FTkNPREVfQUxHX1dFUCkpIHsKICAgICAgIFdMQU5fTE9HX0RFQlVHKDEsImFza2VkIHRvIHNldCBhIG5vbiB3ZXAga2V5IDooIik7CiAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9CkBAIC0xNjE1LDcgKzE1NzcsNyBAQAogICAgICAgYnJlYWs7CiAgICAgfQogICAgIG1zZy5tc2djb2RlID0gRElEbXNnX2RvdDExcmVxX21pYnNldDsKLSAgICByZXN1bHQgPSBwODAyMTFyZXFfZG9yZXF1ZXN0KHdsYW5kZXYsKFVJTlQ4KikmbXNnKTsKKyAgICByZXN1bHQgPSBwODAyMTFyZXFfZG9yZXF1ZXN0KHdsYW5kZXYsKHU4KikmbXNnKTsKICAgICBXTEFOX0xPR19ERUJVRygxLCJyZXN1bHQgKCVkKVxuIixyZXN1bHQpOwogICB9CiAgIHJldHVybiByZXN1bHQ7CkBAIC0xNzYzLDI2ICsxNzI1LDYgQEAKICAgcmV0dXJuIHJlc3VsdDsKIH0KIAotCi0jZW5kaWYKLQotCi0KLQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0KLQotCi0vKgotdHlwZWRlZiBpbnQgKCppd19oYW5kbGVyKShuZXRkZXZpY2VfdCAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSk7Ci0qLwotCi0jaWYgV0lSRUxFU1NfRVhUID4gMTIKIHN0YXRpYyBpd19oYW5kbGVyIHA4MDIxMXdleHRfaGFuZGxlcnNbXSA9ICB7CiAJKGl3X2hhbmRsZXIpIHA4MDIxMXdleHRfc2l3Y29tbWl0LAkJLyogU0lPQ1NJV0NPTU1JVCAqLwogCShpd19oYW5kbGVyKSBwODAyMTF3ZXh0X2dpd25hbWUsCQkvKiBTSU9DR0lXTkFNRSAqLwpAQCAtMTgwOCwxMyArMTc1MCw4IEBACiAJKGl3X2hhbmRsZXIpIHA4MDIxMXdleHRfZ2l3YXAsICAgICAgICAgCQkvKiBTSU9DR0lXQVAgKi8KIAkoaXdfaGFuZGxlcikgTlVMTCwJCQkJLyogLS0gaG9sZSAtLSAqLwogCShpd19oYW5kbGVyKSBOVUxMLCAgICAgICAgICAgICAgICAgIAkJLyogU0lPQ0dJV0FQTElTVCAqLwotI2lmIFdJUkVMRVNTX0VYVCA+IDEzCi0JKGl3X2hhbmRsZXIpIHA4MDIxMXdleHRfc2l3c2NhbiwJCQkvKiBTSU9DU0lXU0NBTiAqLwotCShpd19oYW5kbGVyKSBwODAyMTF3ZXh0X2dpd3NjYW4sCQkJLyogU0lPQ0dJV1NDQU4gKi8KLSNlbHNlIC8qIFdJUkVMRVNTX0VYVCA+IDEzICovCi0JKGl3X2hhbmRsZXIpIE5VTEwsCS8qIG51bGwgKi8JCS8qIFNJT0NTSVdTQ0FOICovCi0JKGl3X2hhbmRsZXIpIE5VTEwsCS8qIG51bGwgKi8JCS8qIFNJT0NHSVdTQ0FOICovCi0jZW5kaWYgLyogV0lSRUxFU1NfRVhUID4gMTMgKi8KKwkoaXdfaGFuZGxlcikgcDgwMjExd2V4dF9zaXdzY2FuLAkJLyogU0lPQ1NJV1NDQU4gKi8KKwkoaXdfaGFuZGxlcikgcDgwMjExd2V4dF9naXdzY2FuLAkJLyogU0lPQ0dJV1NDQU4gKi8KIAkoaXdfaGFuZGxlcikgcDgwMjExd2V4dF9zaXdlc3NpZCwgIAkJLyogU0lPQ1NJV0VTU0lEICovCiAJKGl3X2hhbmRsZXIpIHA4MDIxMXdleHRfZ2l3ZXNzaWQsICAgICAgCQkvKiBTSU9DR0lXRVNTSUQgKi8KIAkoaXdfaGFuZGxlcikgTlVMTCwgICAgICAgICAgICAgICAgIAkJLyogU0lPQ1NJV05JQ0tOICovCkBAIC0xODM1LDkgKzE3NzIsNyBAQAogCShpd19oYW5kbGVyKSBwODAyMTF3ZXh0X2dpd2VuY29kZSwgIAkJLyogU0lPQ0dJV0VOQ09ERSAqLwogCShpd19oYW5kbGVyKSBOVUxMLCAgICAgICAgICAgICAgICAgCQkvKiBTSU9DU0lXUE9XRVIgKi8KIAkoaXdfaGFuZGxlcikgTlVMTCwgICAgICAgICAgICAgICAgICAJCS8qIFNJT0NHSVdQT1dFUiAqLwotI2lmIFdJUkVMRVNTX0VYVCA+IDE3CiAvKiBXUEEgb3BlcmF0aW9ucyAqLwotCiAJKGl3X2hhbmRsZXIpIE5VTEwsCQkJCS8qIC0tIGhvbGUgLS0gKi8KIAkoaXdfaGFuZGxlcikgTlVMTCwJCQkJLyogLS0gaG9sZSAtLSAqLwogCShpd19oYW5kbGVyKSBOVUxMLCAvKiBTSU9DU0lXR0VOSUUJc2V0IGdlbmVyaWMgSUUgKi8KQEAgLTE4NDgsMTcwICsxNzgzLDE4IEBACiAJKGl3X2hhbmRsZXIpIHA4MDIxMXdleHRfc2V0X2VuY29kZWV4dCwgLyogU0lPQ1NJV0VOQ09ERUVYVCAgc2V0IGVuY29kaW5nIHRva2VuICYgbW9kZSAqLwogCShpd19oYW5kbGVyKSBwODAyMTF3ZXh0X2dldF9lbmNvZGVleHQsIC8qIFNJT0NHSVdFTkNPREVFWFQgIGdldCBlbmNvZGluZyB0b2tlbiAmIG1vZGUgKi8KIAkoaXdfaGFuZGxlcikgTlVMTCwgLyogU0lPQ1NJV1BNS1NBCVBNS1NBIGNhY2hlIG9wZXJhdGlvbiAqLwotI2VuZGlmCiB9OwogCiBzdHJ1Y3QgaXdfaGFuZGxlcl9kZWYgcDgwMjExd2V4dF9oYW5kbGVyX2RlZiA9IHsKLQkubnVtX3N0YW5kYXJkID0gc2l6ZW9mKHA4MDIxMXdleHRfaGFuZGxlcnMpIC8gc2l6ZW9mKGl3X2hhbmRsZXIpLAorCS5udW1fc3RhbmRhcmQgPSBBUlJBWV9TSVpFKHA4MDIxMXdleHRfaGFuZGxlcnMpLAogCS5udW1fcHJpdmF0ZSA9IDAsCiAJLm51bV9wcml2YXRlX2FyZ3MgPSAwLAogICAgICAgICAuc3RhbmRhcmQgPSBwODAyMTF3ZXh0X2hhbmRsZXJzLAogCS5wcml2YXRlID0gTlVMTCwKIAkucHJpdmF0ZV9hcmdzID0gTlVMTCwKLSNpZiBXSVJFTEVTU19FWFQgPiAxNgogCS5nZXRfd2lyZWxlc3Nfc3RhdHMgPSBwODAyMTF3ZXh0X2dldF93aXJlbGVzc19zdGF0cwotI2VuZGlmCiB9OwogCi0jZW5kaWYKLQotLyogd2lyZWxlc3MgZXh0ZW5zaW9ucycgaW9jdGxzICovCi1pbnQgcDgwMjExd2V4dF9zdXBwb3J0X2lvY3RsKG5ldGRldmljZV90ICpkZXYsIHN0cnVjdCBpZnJlcSAqaWZyLCBpbnQgY21kKQotewotCXdsYW5kZXZpY2VfdCAqd2xhbmRldiA9IGRldi0+bWxfcHJpdjsKLQotI2lmIFdJUkVMRVNTX0VYVCA8IDEzCi0Jc3RydWN0IGl3cmVxICppd3IgPSAoc3RydWN0IGl3cmVxKilpZnI7Ci0jZW5kaWYKLQotCXA4MDIxMWl0ZW1fdWludDMyX3QgICAgICAgICAgICAgbWliaXRlbTsKLQlpbnQgZXJyID0gMDsKLQotCURCRkVOVEVSOwotCi0JbWliaXRlbS5zdGF0dXMgPSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2s7Ci0KLQlpZiAoIHdsYW5kZXYtPm1zZHN0YXRlICE9IFdMQU5fTVNEX1JVTk5JTkcgKSB7Ci0JCWVyciA9IC1FTk9ERVY7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQlXTEFOX0xPR19ERUJVRygxLCAiUmVjZWl2ZWQgd2lyZWxlc3MgZXh0ZW5zaW9uIGlvY3RsICMlZC5cbiIsIGNtZCk7Ci0KLQlzd2l0Y2ggKGNtZCkgewotI2lmIFdJUkVMRVNTX0VYVCA8IDEzCi0JY2FzZSBTSU9DU0lXTkFNRTogIC8qIHVudXNlZCAgKi8KLQkJZXJyID0gKC1FT1BOT1RTVVBQKTsKLQkJYnJlYWs7Ci0JY2FzZSBTSU9DR0lXTkFNRTogLyogZ2V0IG5hbWUgPT0gd2lyZWxlc3MgcHJvdG9jb2wgKi8KLSAgICAgICAgICAgICAgICBlcnIgPSBwODAyMTF3ZXh0X2dpd25hbWUoZGV2LCBOVUxMLCAoY2hhciAqKSAmaXdyLT51LCBOVUxMKTsKLQkJYnJlYWs7Ci0JY2FzZSBTSU9DU0lXTldJRDoKLQljYXNlIFNJT0NHSVdOV0lEOgotCQllcnIgPSAoLUVPUE5PVFNVUFApOwotCQlicmVhazsKLQljYXNlIFNJT0NTSVdGUkVROiAvKiBzZXQgY2hhbm5lbCAqLwotICAgICAgICAgICAgICAgIGVyciA9IHA4MDIxMXdleHRfc2l3ZnJlcShkZXYsIE5VTEwsICYoaXdyLT51LmZyZXEpLCBOVUxMKTsKLQkJYnJlYWs7Ci0JY2FzZSBTSU9DR0lXRlJFUTogLyogZ2V0IGNoYW5uZWwgKi8KLSAgICAgICAgICAgICAgICBlcnIgPSBwODAyMTF3ZXh0X2dpd2ZyZXEoZGV2LCBOVUxMLCAmKGl3ci0+dS5mcmVxKSwgTlVMTCk7Ci0JCWJyZWFrOwotCWNhc2UgU0lPQ1NJV1JBTkdFOgotCWNhc2UgU0lPQ1NJV1BSSVY6Ci0JY2FzZSBTSU9DU0lXQVA6IC8qIHNldCBhY2Nlc3MgcG9pbnQgTUFDIGFkZHJlc3NlcyAoQlNTSUQpICovCi0JCWVyciA9ICgtRU9QTk9UU1VQUCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBTSU9DR0lXQVA6CS8qIGdldCBhY2Nlc3MgcG9pbnQgTUFDIGFkZHJlc3NlcyAoQlNTSUQpICovCi0gICAgICAgICAgICAgICAgZXJyID0gcDgwMjExd2V4dF9naXdhcChkZXYsIE5VTEwsICYoaXdyLT51LmFwX2FkZHIpLCBOVUxMKTsKLQkJYnJlYWs7Ci0KLSNpZiBXSVJFTEVTU19FWFQgPiA4Ci0JY2FzZSBTSU9DU0lXTU9ERTogLyogc2V0IG9wZXJhdGlvbiBtb2RlICovCi0JY2FzZSBTSU9DU0lXRVNTSUQ6IC8qIHNldCBTU0lEIChuZXR3b3JrIG5hbWUpICovCi0JY2FzZSBTSU9DU0lXUkFURTogLyogc2V0IGRlZmF1bHQgYml0IHJhdGUgKGJwcykgKi8KLQkJZXJyID0gKC1FT1BOT1RTVVBQKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFNJT0NHSVdNT0RFOiAvKiBnZXQgb3BlcmF0aW9uIG1vZGUgKi8KLQkJZXJyID0gcDgwMjExd2V4dF9naXdtb2RlKGRldiwgTlVMTCwgJml3ci0+dS5tb2RlLCBOVUxMKTsKLQotCQlicmVhazsKLQljYXNlIFNJT0NHSVdOSUNLTjogLyogZ2V0IG5vZGUgbmFtZS9uaWNrbmFtZSAqLwotCWNhc2UgU0lPQ0dJV0VTU0lEOiAvKiBnZXQgU1NJRCAqLwotCQlpZihpd3ItPnUuZXNzaWQucG9pbnRlcikgewotICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBzc2lkW0lXX0VTU0lEX01BWF9TSVpFKzFdOwotCQkJbWVtc2V0KHNzaWQsIDAsIHNpemVvZihzc2lkKSk7Ci0KLQkJCWVyciA9IHA4MDIxMXdleHRfZ2l3ZXNzaWQoZGV2LCBOVUxMLCAmaXdyLT51LmVzc2lkLCBzc2lkKTsKLQkJCWlmKGNvcHlfdG9fdXNlcihpd3ItPnUuZXNzaWQucG9pbnRlciwgc3NpZCwgc2l6ZW9mKHNzaWQpKSkKLQkJCQllcnIgPSAoLUVGQVVMVCk7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBTSU9DR0lXUkFURToKLSAgICAgICAgICAgICAgICBlcnIgPSBwODAyMTF3ZXh0X2dpd3JhdGUoZGV2LCBOVUxMLCAmaXdyLT51LmJpdHJhdGUsIE5VTEwpOwotCQlicmVhazsKLQljYXNlIFNJT0NHSVdSVFM6Ci0JCWVyciA9IHA4MDIxMXdleHRfZ2l3cnRzKGRldiwgTlVMTCwgJml3ci0+dS5ydHMsIE5VTEwpOwotCQlicmVhazsKLQljYXNlIFNJT0NHSVdGUkFHOgotCQllcnIgPSBwODAyMTF3ZXh0X2dpd2ZyYWcoZGV2LCBOVUxMLCAmaXdyLT51LnJ0cywgTlVMTCk7Ci0JCWJyZWFrOwotCWNhc2UgU0lPQ0dJV0VOQ09ERToKLQkJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQotCQkJZXJyID0gLUVQRVJNOwotCQllbHNlIGlmIChpd3ItPnUuZW5jb2RpbmcucG9pbnRlcikgewotCQkJY2hhciBrZXlidWZbTUFYX0tFWUxFTl07Ci0JCQllcnIgPSBwODAyMTF3ZXh0X2dpd2VuY29kZShkZXYsIE5VTEwsCi0JCQkJCQkgICAgICZpd3ItPnUuZW5jb2RpbmcsIGtleWJ1Zik7Ci0JCQlpZiAoY29weV90b191c2VyKGl3ci0+dS5lbmNvZGluZy5wb2ludGVyLCBrZXlidWYsCi0JCQkJCSBpd3ItPnUuZW5jb2RpbmcubGVuZ3RoKSkKLQkJCQllcnIgPSAtRUZBVUxUOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgU0lPQ0dJV0FQTElTVDoKLQljYXNlIFNJT0NTSVdSVFM6Ci0JY2FzZSBTSU9DU0lXRlJBRzoKLQljYXNlIFNJT0NTSVdTRU5TOgotCWNhc2UgU0lPQ0dJV1NFTlM6Ci0JY2FzZSBTSU9DU0lXTklDS046IC8qIHNldCBub2RlIG5hbWUvbmlja25hbWUgKi8KLQljYXNlIFNJT0NTSVdFTkNPREU6IC8qIHNldCBlbmNvZGluZyB0b2tlbiAmIG1vZGUgKi8KLQljYXNlIFNJT0NTSVdTUFk6Ci0JY2FzZSBTSU9DR0lXU1BZOgotCWNhc2UgU0lPQ1NJV1BPV0VSOgotCWNhc2UgU0lPQ0dJV1BPV0VSOgotCWNhc2UgU0lPQ0dJV1BSSVY6Ci0JCWVyciA9ICgtRU9QTk9UU1VQUCk7Ci0JCWJyZWFrOwotCWNhc2UgU0lPQ0dJV1JBTkdFOgotCQlpZihpd3ItPnUuZGF0YS5wb2ludGVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpd19yYW5nZSByYW5nZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IHA4MDIxMXdleHRfZ2l3cmFuZ2UoZGV2LCBOVUxMLCAmaXdyLT51LmRhdGEsCi0JCQkJCQkgIChjaGFyICopICZyYW5nZSk7Ci0JCQkvKiBQdXNoIHRoYXQgdXAgdG8gdGhlIGNhbGxlciAqLwotCQkJaWYgKGNvcHlfdG9fdXNlcihpd3ItPnUuZGF0YS5wb2ludGVyLCAmcmFuZ2UsIHNpemVvZihyYW5nZSkpKQotCQkJCWVyciA9IC1FRkFVTFQ7Ci0JCX0KLQkJYnJlYWs7Ci0jZW5kaWYgLyogV0lSRUxFU1NfRVhUID4gOCAqLwotI2lmIFdJUkVMRVNTX0VYVCA+IDkKLQljYXNlIFNJT0NTSVdUWFBPVzoKLQkJZXJyID0gKC1FT1BOT1RTVVBQKTsKLQkJYnJlYWs7Ci0JY2FzZSBTSU9DR0lXVFhQT1c6Ci0JCWVyciA9IHA4MDIxMXdleHRfZ2l3dHhwb3coZGV2LCBOVUxMLCAmaXdyLT51LnR4cG93ZXIsIE5VTEwpOwotCQlicmVhazsKLSNlbmRpZiAvKiBXSVJFTEVTU19FWFQgPiA5ICovCi0jaWYgV0lSRUxFU1NfRVhUID4gMTAKLQljYXNlIFNJT0NTSVdSRVRSWToKLQkJZXJyID0gKC1FT1BOT1RTVVBQKTsKLQkJYnJlYWs7Ci0JY2FzZSBTSU9DR0lXUkVUUlk6Ci0JCWVyciA9IHA4MDIxMXdleHRfZ2l3cmV0cnkoZGV2LCBOVUxMLCAmaXdyLT51LnJldHJ5LCBOVUxMKTsKLQkJYnJlYWs7Ci0jZW5kaWYgLyogV0lSRUxFU1NfRVhUID4gMTAgKi8KLQotI2VuZGlmIC8qIFdJUkVMRVNTX0VYVCA8PSAxMiAqLwotCi0JZGVmYXVsdDoKLQkJZXJyID0gKC1FT1BOT1RTVVBQKTsKLQkJYnJlYWs7Ci0JfQotCi0gZXhpdDoKLQlEQkZFWElUOwotCXJldHVybiAoZXJyKTsKLX0KIAogaW50IHA4MDIxMXdleHRfZXZlbnRfYXNzb2NpYXRlZCh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIGludCBhc3NvYykKIHsKQEAgLTIwMTksNyArMTgwMiw2IEBACiAKICAgICAgICAgREJGRU5URVI7CiAKLSNpZiBXSVJFTEVTU19FWFQgPiAxMwogICAgICAgICAvKiBTZW5kIHRoZSBhc3NvY2lhdGlvbiBzdGF0ZSBmaXJzdCAqLwogICAgICAgICBkYXRhLmFwX2FkZHIuc2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOwogICAgICAgICBpZiAoYXNzb2MpIHsKQEAgLTIwMzQsMTUgKzE4MTYsMTIgQEAKICAgICAgICAgaWYgKCFhc3NvYykgZ290byBkb25lOwogCiAgICAgICAgIC8vIFhYWCBzZW5kIGFzc29jaWF0aW9uIGRhdGEsIGxpa2UgSUVzLCBldGMgZXRjLgotI2VuZGlmCisKICBkb25lOgogICAgICAgICBEQkZFWElUOwogICAgICAgICByZXR1cm4gMDsKIH0KIAogCi0jZW5kaWYgLyogY29tcGF0aWJpbGl0eSB0byB3aXJlbGVzcyBleHRlbnNpb25zICovCi0KLQogCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3ByaXNtMl9jcy5jIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcHJpc20yX2NzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzY2U1NjUuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcHJpc20yX2NzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDg3ICswLDAgQEAKLSNkZWZpbmUgV0xBTl9IT1NUSUYgV0xBTl9QQ01DSUEKLSNpbmNsdWRlICJoZmEzODR4LmMiCi0jaW5jbHVkZSAicHJpc20ybWdtdC5jIgotI2luY2x1ZGUgInByaXNtMm1pYi5jIgotI2luY2x1ZGUgInByaXNtMnN0YS5jIgotCi0jaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8PSBLRVJORUxfVkVSU0lPTigyLDQsMjEpICkKLSNpZiAoV0xBTl9DUFVfRkFNSUxZID09IFdMQU5fSXg4NikKLSNpZm5kZWYgQ09ORklHX0lTQQotI3dhcm5pbmcgIllvdSBtYXkgbmVlZCB0byBlbmFibGUgSVNBIHN1cHBvcnQgaW4geW91ciBrZXJuZWwuIgotI2VuZGlmCi0jZW5kaWYKLSNlbmRpZgotCi0jaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwxMSkgKQotc3RhdGljIHVfaW50CWlycV9tYXNrID0gMHhkZWI4OwkJLyogSW50ZXJydXB0IG1hc2sgKi8KLXN0YXRpYyBpbnQJaXJxX2xpc3RbNF0gPSB7IC0xIH07CQkvKiBJbnRlcnJ1cHQgbGlzdCAqLwotI2VuZGlmCi1zdGF0aWMgdV9pbnQJcHJpc20yX2lnbm9yZXZjYz0xOwkJLyogQm9vbGVhbiwgaWYgc2V0LCB3ZQotCQkJCQkJICogaWdub3JlIHdoYXQgdGhlIFZjYwotCQkJCQkJICogaXMgc2V0IHRvIGFuZCB3aGF0IHRoZSBDSVMKLQkJCQkJCSAqIHNheXMuCi0JCQkJCQkgKi8KLW1vZHVsZV9wYXJhbSggcHJpc20yX2lnbm9yZXZjYywgaW50LCAwNjQ0KTsKLQotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMTEpICkKLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDw9IEtFUk5FTF9WRVJTSU9OKDIsNiw5KSkKLXN0YXRpYyBpbnQgbnVtbGlzdCA9IDQ7Ci1tb2R1bGVfcGFyYW1fYXJyYXkoaXJxX2xpc3QsIGludCwgbnVtbGlzdCwgMDQ0NCk7Ci0jZWxzZQotbW9kdWxlX3BhcmFtX2FycmF5KGlycV9saXN0LCBpbnQsIE5VTEwsIDA0NDQpOwotI2VuZGlmCi1tb2R1bGVfcGFyYW0oIGlycV9tYXNrLCBpbnQsIDA2NDQpOwotI2VuZGlmCi0KLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDYsMTUpCi1zdGF0aWMgaW50IHByaXNtMl9jc19zdXNwZW5kKHN0cnVjdCBwY21jaWFfZGV2aWNlICpwZGV2KTsKLXN0YXRpYyBpbnQgcHJpc20yX2NzX3Jlc3VtZShzdHJ1Y3QgcGNtY2lhX2RldmljZSAqcGRldik7Ci1zdGF0aWMgdm9pZCBwcmlzbTJfY3NfcmVtb3ZlKHN0cnVjdCBwY21jaWFfZGV2aWNlICpwZGV2KTsKLXN0YXRpYyBpbnQgcHJpc20yX2NzX3Byb2JlKHN0cnVjdCBwY21jaWFfZGV2aWNlICpwZGV2KTsKLSNlbHNlCi1kZXZfbGlua190CSpwcmlzbTJzdGFfYXR0YWNoKHZvaWQpOwotc3RhdGljIHZvaWQJcHJpc20yc3RhX2RldGFjaChkZXZfbGlua190ICpsaW5rKTsKLXN0YXRpYyB2b2lkCXByaXNtMnN0YV9jb25maWcoZGV2X2xpbmtfdCAqbGluayk7Ci1zdGF0aWMgdm9pZAlwcmlzbTJzdGFfcmVsZWFzZSh1X2xvbmcgYXJnKTsKLXN0YXRpYyBpbnQgCXByaXNtMnN0YV9ldmVudCAoZXZlbnRfdCBldmVudCwgaW50IHByaW9yaXR5LCBldmVudF9jYWxsYmFja19hcmdzX3QgKmFyZ3MpOwotCi1zdGF0aWMgZGV2X2xpbmtfdAkqZGV2X2xpc3QgPSBOVUxMOwkvKiBoZWFkIG9mIGluc3RhbmNlIGxpc3QgKi8KLSNlbmRpZgotCi0jaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNSw2OCkpCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogY3NfZXJyb3IKLSoKLSogVXRpbGl0eSBmdW5jdGlvbiB0byBwcmludCBjYXJkIHNlcnZpY2VzIGVycm9yIG1lc3NhZ2VzLgotKgotKiBBcmd1bWVudHM6Ci0qCWhhbmRsZQljbGllbnQgaGFuZGxlIGlkZW50aWZ5aW5nIHRoaXMgQ1MgY2xpZW50Ci0qCWZ1bmMJQ1MgZnVuY3Rpb24gbnVtYmVyIHRoYXQgZ2VuZXJhdGVkIHRoZSBlcnJvcgotKglyZXQJQ1MgZnVuY3Rpb24gcmV0dXJuIGNvZGUKLSoKLSogUmV0dXJuczoKLSoJbm90aGluZwotKiBTaWRlIGVmZmVjdHM6Ci0qCi0qIENhbGwgY29udGV4dDoKLSoJcHJvY2VzcyB0aHJlYWQKLSoJaW50ZXJydXB0Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXN0YXRpYyB2b2lkIGNzX2Vycm9yKGNsaWVudF9oYW5kbGVfdCBoYW5kbGUsIGludCBmdW5jLCBpbnQgcmV0KQotewotI2lmIChkZWZpbmVkKENTX1JFTEVBU0VfQ09ERSkgJiYgKENTX1JFTEVBU0VfQ09ERSA8IDB4MjkxMSkpCi0JQ2FyZFNlcnZpY2VzKFJlcG9ydEVycm9yLCBkZXZfaW5mbywgKHZvaWQgKilmdW5jLCAodm9pZCAqKXJldCk7Ci0jZWxzZQotCWVycm9yX2luZm9fdCBlcnIgPSB7IGZ1bmMsIHJldCB9OwotCXBjbWNpYV9yZXBvcnRfZXJyb3IoaGFuZGxlLCAmZXJyKTsKLSNlbmRpZgotfQotI2Vsc2UgLy8ga2VybmVsX3ZlcnNpb24KLQotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNiwxMikKLXN0YXRpYyBzdHJ1Y3QgcGNtY2lhX2RldmljZV9pZCBwcmlzbTJfY3NfaWRzW10gPSB7Ci0JUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIklOVEVSU0lMIiwgICJIRkEzODR4L0lFRUUiLCAweDc0YzVlNDBkLCAweGRiNDcyYTE4KSwgLy8gSW50ZXJzaWwgUFJJU00yIFJlZmVyZW5jZSBEZXNpZ24gMTFNYi9zIDgwMi4xMWIgV0xBTiBDYXJkCi0JUENNQ0lBX0RFVklDRV9NQU5GX0NBUkQoMHgwMTM4LCAweDAwMDIpLCAvLyBDb21wYXEgV0wxMDAvMjAwIDExTWIvcyA4MDIuMTFiIFdMQU4gQ2FyZAotCVBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEKDB4MDI4YSwgMHgwMDAyKSwgLy8gQ29tcGFxIGlQYXEgSE5XLTEwMCAxMU1iL3MgODAyLjExYiBXTEFOIENhcmQKLQlQQ01DSUFfREVWSUNFX01BTkZfQ0FSRCgweDAyNTAsIDB4MDAwMiksIC8vIFNhbXN1bmcgU1dMMjAwMC1OIDExTWIvcyA4MDIuMTFiIFdMQU4gQ2FyZAotCVBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEKDB4ZDYwMSwgMHgwMDAyKSwgLy8gWi1Db20gWEkzMDAgMTFNYi9zIDgwMi4xMWIgV0xBTiBDYXJkCi0JUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIlpvb21BaXIgMTFNYnBzIEhpZ2giLCAgIlJhdGUgd2lyZWxlc3MgTmV0d29ya2luZyIsIDB4MjczZmUzZGIsIDB4MzJhMWVhZWUpLCAvLyBab29tQWlyIDQxMDAgMTFNYi9zIDgwMi4xMWIgV0xBTiBDYXJkCi0JUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIzKCJJbnN0YW50IFdpcmVsZXNzICIsICAiIE5ldHdvcmsgUEMgQ0FSRCIsICAiVmVyc2lvbiAwMS4wMiIsIDB4MTFkOTAxYWYsIDB4NmU5YmQ5MjYsIDB4NGI3NGJhYTApLCAvLyBMaW5rc3lzIFdQQzExIDExTWJwcyA4MDIuMTFiIFdMQU4gQ2FyZAotCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyMygiQWRkdHJvbiIsICAiQVdQLTEwMCBXaXJlbGVzcyBQQ01DSUEiLCAgIlZlcnNpb24gMDEuMDIiLCAweGU2ZWM1MmNlLCAweDg2NDlhZjIsIDB4NGI3NGJhYTApLCAvLyBBZGR0cm9uIEFXUC0xMDAgMTFNYnBzIDgwMi4xMWIgV0xBTiBDYXJkCi0JUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIzKCJEIiwgICJMaW5rIERXTC02NTAgMTFNYnBzIFdMQU4gQ2FyZCIsICAiVmVyc2lvbiAwMS4wMiIsIDB4NzFiMTg1ODksIDB4YjZmMWIwYWIsIDB4NGI3NGJhYTApLCAvLyBELUxpbmsgRFdMLTY1MCAxMU1icHMgODAyLjExYiBXTEFOIENhcmQKLQlQQ01DSUFfREVWSUNFX1BST0RfSUQxMjMoIlNNQyIsICAiU01DMjYzMlciLCAgIlZlcnNpb24gMDEuMDIiLCAweGM0ZjhiMThiLCAweDQ3NGExZjJhLCAweDRiNzRiYWEwKSwgLy8gU01DIDI2MzJXIDExTWJwcyA4MDIuMTFiIFdMQU4gQ2FyZAotCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyMzQoIkludGVyc2lsIiwgICJQUklTTSAyXzUgUENNQ0lBIEFEQVBURVIiLCAgIklTTDM3MzAwUCIsICAiRXZhbC1SZXZBIiwgMHg0YjgwMWExNywgMHg2MzQ1YTBiZiwgMHhjOTA0OWEzOSwgMHhjMjNhZGMwZSksIC8vIEJyb01heCBGcmVlcG9ydCAxMU1icHMgODAyLjExYiBXTEFOIENhcmQgKFByaXNtIDIuNSkKLQlQQ01DSUFfREVWSUNFX1BST0RfSUQxMjMoIlUuUy4gUm9ib3RpY3MiLCAgIklFRUUgODAyLjExYiBQQy1DQVJEIiwgICJWZXJzaW9uIDAxLjAyIiwgMHhjN2I4ZGY5ZCwgMHgxNzAwZDA4NywgMHg0Yjc0YmFhMCksIC8vIFUuUy4gUm9ib3RpY3MgSUVFRSA4MDIuMTFiIFBDLUNBUkQKLQlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiRGlnaXRhbCBEYXRhIENvbW11bmljYXRpb25zIiwgICJXUEMtMDEwMCIsIDB4ZmRkNzM0NzAsIDB4ZTBiNmYxNDYpLCAvLyBMZXZlbC1PbmUgV1BDLTAxMDAKLQlQQ01DSUFfREVWSUNFX01BTkZfQ0FSRCgweDAyNzQsIDB4MTYxMiksIC8vIEJyb21heCBPRU0gMTFNYnBzIDgwMi4xMWIgV0xBTiBDYXJkIChQcmlzbSAyLjUpCi0JUENNQ0lBX0RFVklDRV9NQU5GX0NBUkQoMHgwMjc0LCAweDE2MTMpLCAvLyBCcm9tYXggT0VNIDExTWJwcyA4MDIuMTFiIFdMQU4gQ2FyZCAoUHJpc20gMykKLQlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiY29yZWdhIEsuSy4iLCAgIldpcmVsZXNzIExBTiBQQ0MtMTEiLCAweDUyNjE0NDBmLCAweGE2NDA1NTg0KSwgLy8gY29yZWdhIEsuSy4gV2lyZWxlc3MgTEFOIFBDQy0xMQotCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJjb3JlZ2EgSy5LLiIsICAiV2lyZWxlc3MgTEFOIFBDQ0EtMTEiLCAweDUyNjE0NDBmLCAweGRmNjExNWY5KSwgLy8gY29yZWdhIEsuSy4gV2lyZWxlc3MgTEFOIFBDQ0EtMTEKLQlQQ01DSUFfREVWSUNFX01BTkZfQ0FSRCgweGMwMDEsIDB4MDAwOCksIC8vIENPTlRFQyBGTEVYU0NBTi9GWC1ERFMxMTAtUENDCi0JUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIlBMQU5FWCIsICAiR2VvV2F2ZS9HVy1OUzExMCIsIDB4MjA5ZjQwYWIsIDB4NDYyNjMxNzgpLCAvLyBQTEFORVggR2VvV2F2ZS9HVy1OUzExMAotCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyMygiT0VNIiwgICJQUklTTTIgSUVFRSA4MDIuMTEgUEMtQ2FyZCIsICAiVmVyc2lvbiAwMS4wMiIsIDB4ZmVhNTRjOTAsIDB4NDhmMmJkZDYsIDB4NGI3NGJhYTApLCAvLyBBbWJpY29tIFdMMTEwMCAxMU1icHMgODAyLjExYiBXTEFOIENhcmQKLQlQQ01DSUFfREVWSUNFX1BST0RfSUQxMjMoIkxlQXJ0ZXJ5IiwgICJTWU5DQllBSVIgMTFNYnBzIFdpcmVsZXNzIExBTiBQQyBDYXJkIiwgICJWZXJzaW9uIDAxLjAyIiwgMHg3ZTNiMzI2YSwgMHg0OTg5M2U5MiwgMHg0Yjc0YmFhMCksIC8vIExlQXJ0ZXJ5IFNZTkNCWUFJUiAxMU1icHMgODAyLjExYiBXTEFOIENhcmQKLVBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEKDB4MDFmZiwgMHgwMDA4KSwgLy8gSW50ZXJtZWMgTW9iaWxlTEFOIDExTWJwcyA4MDIuMTFiIFdMQU4gQ2FyZAotCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyMygiTkVUR0VBUiBNQTQwMSBXaXJlbGVzcyBQQyIsICAiQ2FyZCIsICAiVmVyc2lvbiAwMS4wMCIsIDB4YTM3NDM0ZTksIDB4OTc2MmU4ZjEsIDB4YTU3YWRiOGMpLCAvLyBORVRHRUFSIE1BNDAxIDExTWJwcyA4MDIuMTEgV0xBTiBDYXJkCi0JUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIzNCgiSW50ZXJzaWwiLCAgIlBSSVNNIEZyZWVkb20gUENNQ0lBIEFkYXB0ZXIiLCAgIklTTDM3MTAwUCIsICAiRXZhbC1SZXZBIiwgMHg0YjgwMWExNywgMHhmMjIyZWMyZCwgMHg2MzBkNTJiMiwgMHhjMjNhZGMwZSksIC8vIEludGVyc2lsIFBSSVNNIEZyZWVkb20gMTFtYnBzIDgwMi4xMSBXTEFOIENhcmQKLQlQQ01DSUFfREVWSUNFX1BST0RfSUQxMjMoIk9UQyIsICAiV2lyZWxlc3MgQWlyRVpZIDI0MTEtUENDIFdMQU4gQ2FyZCIsICAiVmVyc2lvbiAwMS4wMiIsIDB4NGFjNDQyODcsIDB4MjM1YTZiZWQsIDB4NGI3NGJhYTApLCAvLyBPVEMgV2lyZWxlc3MgQWlyRVpZIDI0MTEtUENDIDExTWJwcyA4MDIuMTEgV0xBTiBDYXJkCi0JUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIzNCgiODAyLjExIiwgICIxMU1icHMgV2lyZWxlc3MgTEFOIENhcmQiLCAgInYwOEMxIiwgICIiICAgLCAweGI2N2E2MTBlLCAweDY1NWFhN2I3LCAweDI2NGI0NTFhLCAweDApLCAvLyBEeW5hbGluayBMMTFIRFQgMTFNYnBzIDgwMi4xMSBXTEFOIENhcmQKLQlQQ01DSUFfREVWSUNFX01BTkZfQ0FSRCgweGMyNTAsIDB4MDAwMiksIC8vIER5bmFsaW5rIEwxMUhEVCAxMU1icHMgODAyLjExIFdMQU4gQ2FyZAotCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJQUk9YSU0iLCAgIlJhbmdlTEFOLURTL0xBTiBQQyBDQVJEIiwgMHhjNjUzNmE1ZSwgMHgzZjM1Nzk3ZCksIC8vIFBST1hJTSBSYW5nZUxBTi1EUy9MQU4gUEMgQ0FSRAotCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyMzQoIkFDVElPTlRFQyIsICAiUFJJU00gV2lyZWxlc3MgTEFOIFBDIENhcmQiLCAgIjAzODEiLCAgIlJldkEiLCAweDM5MzA4OWRhLCAweGE3MWU2OWQ1LCAweDkwNDcxZmE5LCAweDU3YTY2MTk0KSwgLy8gQUNUSU9OVEVDIFBSSVNNIFdpcmVsZXNzIExBTiBQQyBDYXJkCi0JUENNQ0lBX0RFVklDRV9NQU5GX0NBUkQoMHgxNjY4LCAweDAxMDEpLCAvLyBBQ1RJT05URUMgUFJJU00gV2lyZWxlc3MgTEFOIFBDIENhcmQKLQlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiM0NvbSIsICAiM0NSV0U3MzdBIEFpckNvbm5lY3QgV2lyZWxlc3MgTEFOIFBDIENhcmQiLCAweDQxMjQwZTViLCAweDU2MDEwYWYzKSwgLy8gM0NvbSBBaXJDb25uZWN0IDNDUldFNzM3QQotCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCIzQ29tIiwgICIzQ1JXRTc3N0EgQWlyQ29ubmVjdCBXaXJlbGVzcyBMQU4gUENJIENhcmQiICAsIDB4NDEyNDBlNWIsIDB4YWZjN2MzM2UpLCAvLyAzQ29tIEFpckNvbm5lY3QgM0NSV0U3NzdBCi0JUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIkFTVVMiLCAgIjgwMl8xMWJfUENfQ0FSRF8yNSIsIDB4NzhmYzA2ZWUsIDB4ZGI5YWE4NDIpLCAvLyBBU1VTIFdMLTEwMCA4MDIuMTFiIFdMQU4gIFBDIENhcmQKLQlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiQVNVUyIsICAiODAyXzExQl9DRl9DQVJEXzI1IiwgMHg3OGZjMDZlZSwgMHg0NWE1MGMxZSksIC8vIEFTVVMgV0wtMTEwIDgwMi4xMWIgV0xBTiBDRiBDYXJkCi0JUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIkJVRkZBTE8iLCAgIldMSS1DRi1TMTFHIiwgMHgyZGVjZWNlMywgMHg4MjA2N2MxOCksIC8vIEJVRkZBTE8gV0xJLUNGLVMxMUcgODAyLjExYiBXTEFOIENhcmQKLQlQQ01DSUFfREVWSUNFX1BST0RfSUQxMjM0KCJUaGUgTGlua3N5cyBHcm91cCwgSW5jLiIsICJXaXJlbGVzcyBOZXR3b3JrIENGIENhcmQiLCAiSVNMMzczMDBQIiwgIlJldkEiLCAweGE1ZjQ3MmMyLCAweDljMDU1OThkLCAweGM5MDQ5YTM5LCAweDU3YTY2MTk0KSwgLy8gTGlua3N5cyBXQ0YxMSAxMU1icHMgODAyLjExYiBXTEFOIENhcmQgKFByaXNtIDIuNSkKLQlQQ01DSUFfREVWSUNFX1BST0RfSUQxMjM0KCJMaW5rc3lzIiwgICJXaXJlbGVzcyBDb21wYWN0Rmxhc2ggQ2FyZCIsICAiIiwgICIiLCAweDczM2NjODEsIDB4YzUyZjM5NSwgMHgwLCAweDApLCAvLyBMaW5rc3lzIFdDRjEyIDExTWJwcyA4MDIuMTFiIFdMQU4gQ2FyZCAoUHJpc20gMykKLQlQQ01DSUFfREVWSUNFX01BTkZfQ0FSRCgweDAyOGEsIDB4MDY3MyksIC8vIExpbmtzeXMgV0NGMTIgMTFNYnBzIDgwMi4xMWIgV0xBTiBDYXJkIChQcmlzbSAzKQotCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyMzQoIk5FVEdFQVIgTUE0MDFSQSBXaXJlbGVzcyBQQyIsICAiQ2FyZCIsICAiSVNMMzczMDBQIiwgICJFdmFsLVJldkEiLCAweDMwNjQ2N2YsIDB4OTc2MmU4ZjEsIDB4YzkwNDlhMzksIDB4YzIzYWRjMGUpLCAvLyBORVRHRUFSIE1BNDAxUkEgMTFNYnBzIDgwMi4xMSBXTEFOIENhcmQKLQlQQ01DSUFfREVWSUNFX01BTkZfQ0FSRCgweGQ2MDEsIDB4MDAwNSksIC8vIEQtTGluayBEQ0YtNjYwVyAgMTFNYnBzIDgwMi4xMWIgV0xBTiBDYXJkCi0JUENNQ0lBX0RFVklDRV9NQU5GX0NBUkQoMHgwMmQyLCAweDAwMDEpLCAvLyBNaWNyb3NvZnQgV2lyZWxlc3MgTm90ZWJvb2sgQWRhcHRlciBNTi01MjAKLQlQQ01DSUFfREVWSUNFX01BTkZfQ0FSRCgweDAwODksIDB4MDAwMiksIC8vIEFueVBvaW50KFRNKSBXaXJlbGVzcyBJSSBQQyBDYXJkCi0JUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIzNCgiRCIsICAiTGluayBEUkMtNjUwIDExTWJwcyBXTEFOIENhcmQiLCAgIlZlcnNpb24gMDEuMDIiLCAgIiIgLCAweDcxYjE4NTg5LCAweGYxNDRlM2FjLCAweDRiNzRiYWEwLCAweDApLCAvLyBELUxpbmsgRFJDLTY1MCA4MDIuMTFiIFdMQU4gQ2FyZAotCVBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEKDB4OTAwNSwgMHgwMDIxKSwgLy8gQWRhcHRlYyBBV04tODAzMAotCVBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEKDB4MDAwYiwgMHg3MTEwKSwgLy8gRC1MaW5rIERXTC02NTAgcmV2IFAgODAyLjExYiBXTEFOIGNhcmQKLQkvLyBQQ01DSUFfREVWSUNFX1BST0RfSUQxMjM0KCJELUxpbmsiLCAgIkRXTC02NTAgV2lyZWxlc3MgUEMgQ2FyZCBSZXZQIiwgICJJU0wzNzEwMVAtMTAiLCAgIkEzIiwgMHgxYTQyNGExYywgMHg2ZWE1NzYzMiwgMHhkZDk3YTI2YiwgMHg1NmIyMWY1MiksIC8vIEQtTGluayBEV0wtNjUwIHJldiBQIDgwMi4xMWIgV0xBTiBjYXJkCi0JUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIzKCJJTlRFUlNJTCIsICAgIkktR0FURSAxMU0gUEMgQ2FyZCAvIFBDIENhcmQgcGx1cyIsICAiVmVyc2lvbiAwMS4wMiIsIDB4NzRjNWU0MGQsIDB4ODMwNGZmNzcsIDB4NGI3NGJhYTApLCAvLyBJLUdhdGUgMTFNIFBDIENhcmQKLQlQQ01DSUFfREVWSUNFX1BST0RfSUQxMjM0KCJCRU5RIiwgICJBV0wxMDAgUENNQ0lBIEFEQVBURVIiLCAgIklTTDM3MzAwUCIsICAiRXZhbC1SZXZBIiwgMHgzNWRhZGM3NCwgMHgxZjdmZWRiLCAweGM5MDQ5YTM5LCAweGMyM2FkYzBlKSwgLy8gYmVuUSBBV0wxMDAgODAyLjExYiBXTEFOIENhcmQKLQlQQ01DSUFfREVWSUNFX01BTkZfQ0FSRCgweDAwMGIsIDB4NzMwMCksIC8vIGJlblEgQVdMMTAwIDgwMi4xMWIgV0xBTiBDYXJkCi0JLy8gUENNQ0lBX0RFVklDRV9QUk9EX0lEMSgiSU5URVJTSUwiLCAweDc0YzVlNDBkKSwgLy8gSW50ZXJzaWwgUHJpc20gMiBjYXJkCi0JLy8gUENNQ0lBX0RFVklDRV9NQU5GX0NBUkQoMHgwMTU2LCAweDAwMDIpLCAvLyBJbnRlcnNpbCBQcmlzbSAyIGNhcmQKLQotCVBDTUNJQV9ERVZJQ0VfTlVMTAotfTsKLQotTU9EVUxFX0RFVklDRV9UQUJMRShwY21jaWEsIHByaXNtMl9jc19pZHMpOwotI2VuZGlmCi0KLXN0YXRpYyBzdHJ1Y3QgcGNtY2lhX2RyaXZlciBwcmlzbTJfY3NfZHJpdmVyID0gewotCS5kcnYgPSB7Ci0JCS5uYW1lID0gInByaXNtMl9jcyIsCi0JfSwKLQkub3duZXIgPSBUSElTX01PRFVMRSwKLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDYsMTUpCi0JLnN1c3BlbmQgPSBwcmlzbTJfY3Nfc3VzcGVuZCwKLQkucmVzdW1lID0gcHJpc20yX2NzX3Jlc3VtZSwKLQkucmVtb3ZlID0gcHJpc20yX2NzX3JlbW92ZSwKLQkucHJvYmUgPSBwcmlzbTJfY3NfcHJvYmUsCi0JLmlkX3RhYmxlID0gcHJpc20yX2NzX2lkcywKLSNlbHNlCi0JLmF0dGFjaCA9IHByaXNtMnN0YV9hdHRhY2gsCi0JLmRldGFjaCA9IHByaXNtMnN0YV9kZXRhY2gsCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw2LDEyKQotCS5pZF90YWJsZSA9IHByaXNtMl9jc19pZHMsCi0JLmV2ZW50ID0gIHByaXNtMnN0YV9ldmVudCwKLSNlbmRpZiAvLyA+IDIuNi4xMgotI2VuZGlmIC8vIDw9IDIuNi4xNQotfTsKLSNlbmRpZiAvKiBrZXJuZWxfdmVyc2lvbiAqLwotCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw2LDE1KQotI2RlZmluZSBDU19DSEVDSyhmbiwgcmV0KSBcCi1kbyB7IGxhc3RfZm4gPSAoZm4pOyBpZiAoKGxhc3RfcmV0ID0gKHJldCkpICE9IDApIGdvdG8gY3NfZmFpbGVkOyB9IHdoaWxlICgwKQotCi0jZGVmaW5lIENGR19DSEVDSyhmbiwgcmV0ZikgXAotZG8geyBpbnQgcmV0ID0gKHJldGYpOyBcCi1pZiAocmV0ICE9IDApIHsgXAotICAgICAgICBXTEFOX0xPR19ERUJVRygxLCAiQ2FyZFNlcnZpY2VzKCIgI2ZuICIpIHJldHVybmVkICVkXG4iLCByZXQpOyBcCi0gICAgICAgIGNzX2Vycm9yKHBkZXYsIGZuLCByZXQpOyBcCi0gICAgICAgIGdvdG8gbmV4dF9lbnRyeTsgXAotfSBcCi19IHdoaWxlICgwKQotCi1zdGF0aWMgdm9pZCBwcmlzbTJfY3NfcmVtb3ZlKHN0cnVjdCBwY21jaWFfZGV2aWNlICpwZGV2KQotewotCXN0cnVjdCB3bGFuZGV2aWNlICAqd2xhbmRldjsKLQotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwxNykKLSAgICAgICAgZGV2X2xpbmtfdCAqbGluayA9IGRldl90b19pbnN0YW5jZShwZGV2KTsKLSNlbmRpZgotCi0JREJGRU5URVI7Ci0KLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDYsMTYpCi0Jd2xhbmRldiA9IHBkZXYtPnByaXY7Ci0jZWxzZQotCXdsYW5kZXYgPSBsaW5rLT5wcml2OwotI2VuZGlmCi0KLQlpZiAod2xhbmRldikgewotCQlwODAyMTFuZXRkZXZfaHdyZW1vdmVkKHdsYW5kZXYpOwotCQl1bnJlZ2lzdGVyX3dsYW5kZXYod2xhbmRldik7Ci0JCXdsYW5fdW5zZXR1cCh3bGFuZGV2KTsKLQkJaWYgKHdsYW5kZXYtPnByaXYpIHsKLQkJCWhmYTM4NHhfdCAqaHcgPSB3bGFuZGV2LT5wcml2OwotCQkJd2xhbmRldi0+cHJpdiA9IE5VTEw7Ci0JCQlpZiAoaHcpIHsKLQkJCQloZmEzODR4X2Rlc3Ryb3koaHcpOwotCQkJCWtmcmVlKGh3KTsKLQkJCX0KLQkJfQotCQlrZnJlZSh3bGFuZGV2KTsKLQl9Ci0KLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDYsMTYpCi0JcGRldi0+cHJpdiA9IE5VTEw7Ci0gICAgICAgIHBjbWNpYV9kaXNhYmxlX2RldmljZShwZGV2KTsKLSNlbHNlCi0gICAgICAgIGlmIChsaW5rLT5zdGF0ZSAmIERFVl9DT05GSUcpIHsKLQkgICAgICAgIGlmIChsaW5rLT53aW4pCi0JCQlwY21jaWFfcmVsZWFzZV93aW5kb3cobGluay0+d2luKTsKLQkJcGNtY2lhX3JlbGVhc2VfY29uZmlndXJhdGlvbihsaW5rLT5oYW5kbGUpOwotCQlpZiAobGluay0+aW8uTnVtUG9ydHMxKQotCQkJcGNtY2lhX3JlbGVhc2VfaW8obGluay0+aGFuZGxlLCAmbGluay0+aW8pOwotCQlpZiAobGluay0+aXJxLkFzc2lnbmVkSVJRKQotCQkJcGNtY2lhX3JlbGVhc2VfaXJxKGxpbmstPmhhbmRsZSwgJmxpbmstPmlycSk7Ci0KLQkJbGluay0+c3RhdGUgJj0gfkRFVl9DT05GSUc7Ci0JfQotCi0JbGluay0+cHJpdiA9IE5VTEw7Ci0Ja2ZyZWUobGluayk7Ci0jZW5kaWYKLQotCURCRkVYSVQ7Ci0JcmV0dXJuOwotfQotCi1zdGF0aWMgaW50IHByaXNtMl9jc19zdXNwZW5kKHN0cnVjdCBwY21jaWFfZGV2aWNlICpwZGV2KQotewotCXN0cnVjdCB3bGFuZGV2aWNlICAqd2xhbmRldjsKLQotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwxNykKLSAgICAgICAgZGV2X2xpbmtfdCAqbGluayA9IGRldl90b19pbnN0YW5jZShwZGV2KTsKLSNlbmRpZgotCi0JREJGRU5URVI7Ci0KLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDYsMTYpCi0Jd2xhbmRldiA9IHBkZXYtPnByaXY7Ci0JcHJpc20yc3RhX2lmc3RhdGUod2xhbmRldiwgUDgwMjExRU5VTV9pZnN0YXRlX2Rpc2FibGUpOwotI2Vsc2UKLQl3bGFuZGV2ID0gbGluay0+cHJpdjsKLQotICAgICAgICBsaW5rLT5zdGF0ZSB8PSBERVZfU1VTUEVORDsKLSAgICAgICAgaWYgKGxpbmstPnN0YXRlICYgREVWX0NPTkZJRykgewotCQlwcmlzbTJzdGFfaWZzdGF0ZSh3bGFuZGV2LCBQODAyMTFFTlVNX2lmc3RhdGVfZGlzYWJsZSk7Ci0JCXBjbWNpYV9yZWxlYXNlX2NvbmZpZ3VyYXRpb24obGluay0+aGFuZGxlKTsKLQl9Ci0jZW5kaWYKLQotCURCRkVYSVQ7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBwcmlzbTJfY3NfcmVzdW1lKHN0cnVjdCBwY21jaWFfZGV2aWNlICpwZGV2KQotewotCXN0cnVjdCB3bGFuZGV2aWNlICAqd2xhbmRldjsKLQotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwxNykKLSAgICAgICAgZGV2X2xpbmtfdCAqbGluayA9IGRldl90b19pbnN0YW5jZShwZGV2KTsKLSNlbmRpZgotCi0JREJGRU5URVI7Ci0KLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDYsMTYpCi0Jd2xhbmRldiA9IHBkZXYtPnByaXY7Ci0JLy8gWFhYIGRvIHNvbWV0aGluZyBoZXJlPwotI2Vsc2UKLQl3bGFuZGV2ID0gbGluay0+cHJpdjsKLSAgICAgICAgbGluay0+c3RhdGUgJj0gfkRFVl9TVVNQRU5EOwotICAgICAgICBpZiAobGluay0+c3RhdGUgJiBERVZfQ09ORklHKSB7Ci0gICAgICAgICAgICAgICAgcGNtY2lhX3JlcXVlc3RfY29uZmlndXJhdGlvbihsaW5rLT5oYW5kbGUsICZsaW5rLT5jb25mKTsKLQkJLy8gWFhYIGRvIHNvbWV0aGluZyBoZXJlPwotCX0KLSNlbmRpZgotCi0KLQlEQkZFWElUOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgcHJpc20yX2NzX3Byb2JlKHN0cnVjdCBwY21jaWFfZGV2aWNlICpwZGV2KQotewotCWludCBydmFsID0gMDsKLQlzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiA9IE5VTEw7Ci0JaGZhMzg0eF90ICpodyA9IE5VTEw7Ci0KLSAgICAgICAgY29uZmlnX2luZm9fdCBzb2NrZXRjb25mOwotICAgICAgICBjaXNwYXJzZV90ICpwYXJzZSA9IE5VTEw7Ci0JdHVwbGVfdCB0dXBsZTsKLQl1aW50OF90CWJ1Zls2NF07Ci0gICAgICAgIGludCBsYXN0X2ZuLCBsYXN0X3JldDsKLSAgICAgICAgY2lzdHBsX2NmdGFibGVfZW50cnlfdCBkZmx0ID0geyAwIH07Ci0KLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMTcpCi0JZGV2X2xpbmtfdCAqbGluazsKLSNlbmRpZgotCi0JREJGRU5URVI7Ci0KLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDYsMTYpCi0JLyogU2V0IHVwIGludGVycnVwdCB0eXBlICovCi0gICAgICAgIHBkZXYtPmNvbmYuSW50VHlwZSA9IElOVF9NRU1PUllfQU5EX0lPOwotI2Vsc2UKLSAgICAgICAgbGluayA9IGttYWxsb2Moc2l6ZW9mKGRldl9saW5rX3QpLCBHRlBfS0VSTkVMKTsKLSAgICAgICAgaWYgKGxpbmsgPT0gTlVMTCkKLSAgICAgICAgICAgICAgICByZXR1cm4gLUVOT01FTTsKLSAgICAgICAgbWVtc2V0KGxpbmssIDAsIHNpemVvZihkZXZfbGlua190KSk7Ci0KLSAgICAgICAgbGluay0+Y29uZi5WY2MgPSAzMzsKLSAgICAgICAgbGluay0+Y29uZi5JbnRUeXBlID0gSU5UX01FTU9SWV9BTkRfSU87Ci0KLSAgICAgICAgbGluay0+aGFuZGxlID0gcGRldjsKLSAgICAgICAgcGRldi0+aW5zdGFuY2UgPSBsaW5rOwotICAgICAgICBsaW5rLT5zdGF0ZSB8PSBERVZfUFJFU0VOVCB8IERFVl9DT05GSUdfUEVORElORzsKLQotI2VuZGlmCi0KLQkvLyBWQ0MgY3JhcD8KLSAgICAgICAgcGFyc2UgPSBrbWFsbG9jKHNpemVvZihjaXNwYXJzZV90KSwgR0ZQX0tFUk5FTCk7Ci0KLQl3bGFuZGV2ID0gY3JlYXRlX3dsYW4oKTsKLQlpZiAoIXdsYW5kZXYgfHwgIXBhcnNlKSB7Ci0JCVdMQU5fTE9HX0VSUk9SKCIlczogTWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZS5cbiIsIGRldl9pbmZvKTsKLQkJcnZhbCA9IC1FSU87Ci0JCWdvdG8gZmFpbGVkOwotCX0KLQlodyA9IHdsYW5kZXYtPnByaXY7Ci0KLQlpZiAoIHdsYW5fc2V0dXAod2xhbmRldikgIT0gMCApIHsKLQkJV0xBTl9MT0dfRVJST1IoIiVzOiB3bGFuX3NldHVwKCkgZmFpbGVkLlxuIiwgZGV2X2luZm8pOwotCQlydmFsID0gLUVJTzsKLQkJZ290byBmYWlsZWQ7Ci0JfQotCi0JLyogSW5pdGlhbGl6ZSB0aGUgaHcgc3RydWN0IGZvciBub3cgKi8KLQloZmEzODR4X2NyZWF0ZShodywgMCwgMCwgTlVMTCk7Ci0JaHctPndsYW5kZXYgPSB3bGFuZGV2OwotCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw2LDE2KQotCWh3LT5wZGV2ID0gcGRldjsKLQlwZGV2LT5wcml2ID0gd2xhbmRldjsKLSNlbHNlCi0JaHctPmxpbmsgPSBsaW5rOwotCWxpbmstPnByaXYgPSB3bGFuZGV2OwotI2VuZGlmCi0KLSAgICAgICAgdHVwbGUuRGVzaXJlZFR1cGxlID0gQ0lTVFBMX0NPTkZJRzsKLSAgICAgICAgdHVwbGUuQXR0cmlidXRlcyA9IDA7Ci0gICAgICAgIHR1cGxlLlR1cGxlRGF0YSA9IGJ1ZjsKLSAgICAgICAgdHVwbGUuVHVwbGVEYXRhTWF4ID0gc2l6ZW9mKGJ1Zik7Ci0gICAgICAgIHR1cGxlLlR1cGxlT2Zmc2V0ID0gMDsKLSAgICAgICAgQ1NfQ0hFQ0soR2V0Rmlyc3RUdXBsZSwgcGNtY2lhX2dldF9maXJzdF90dXBsZShwZGV2LCAmdHVwbGUpKTsKLSAgICAgICAgQ1NfQ0hFQ0soR2V0VHVwbGVEYXRhLCBwY21jaWFfZ2V0X3R1cGxlX2RhdGEocGRldiwgJnR1cGxlKSk7Ci0gICAgICAgIENTX0NIRUNLKFBhcnNlVHVwbGUsIHBjbWNpYV9wYXJzZV90dXBsZShwZGV2LCAmdHVwbGUsIHBhcnNlKSk7Ci0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw2LDE2KQotICAgICAgICBwZGV2LT5jb25mLkNvbmZpZ0Jhc2UgPSBwYXJzZS0+Y29uZmlnLmJhc2U7Ci0gICAgICAgIHBkZXYtPmNvbmYuUHJlc2VudCA9IHBhcnNlLT5jb25maWcucm1hc2tbMF07Ci0jZWxzZQotICAgICAgICBsaW5rLT5jb25mLkNvbmZpZ0Jhc2UgPSBwYXJzZS0+Y29uZmlnLmJhc2U7Ci0gICAgICAgIGxpbmstPmNvbmYuUHJlc2VudCA9IHBhcnNlLT5jb25maWcucm1hc2tbMF07Ci0KLQlsaW5rLT5jb25mLlZjYyA9IHNvY2tldGNvbmYuVmNjOwotI2VuZGlmCi0gICAgICAgIENTX0NIRUNLKEdldENvbmZpZ3VyYXRpb25JbmZvLAotICAgICAgICAgICAgICAgICBwY21jaWFfZ2V0X2NvbmZpZ3VyYXRpb25faW5mbyhwZGV2LCAmc29ja2V0Y29uZikpOwotCi0JdHVwbGUuRGVzaXJlZFR1cGxlID0gQ0lTVFBMX0NGVEFCTEVfRU5UUlk7Ci0JQ1NfQ0hFQ0soR2V0Rmlyc3RUdXBsZSwgcGNtY2lhX2dldF9maXJzdF90dXBsZShwZGV2LCAmdHVwbGUpKTsKLSAgICAgICAgZm9yICg7OykgewotCQljaXN0cGxfY2Z0YWJsZV9lbnRyeV90ICpjZmcgPSAmKHBhcnNlLT5jZnRhYmxlX2VudHJ5KTsKLSAgICAgICAgICAgICAgICBDRkdfQ0hFQ0soR2V0VHVwbGVEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcGNtY2lhX2dldF90dXBsZV9kYXRhKHBkZXYsICZ0dXBsZSkpOwotICAgICAgICAgICAgICAgIENGR19DSEVDSyhQYXJzZVR1cGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcGNtY2lhX3BhcnNlX3R1cGxlKHBkZXYsICZ0dXBsZSwgcGFyc2UpKTsKLQotICAgICAgICAgICAgICAgIGlmIChjZmctPmZsYWdzICYgQ0lTVFBMX0NGVEFCTEVfREVGQVVMVCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGRmbHQgPSAqY2ZnOwotICAgICAgICAgICAgICAgIGlmIChjZmctPmluZGV4ID09IDApCi0gICAgICAgICAgICAgICAgICAgICAgICBnb3RvIG5leHRfZW50cnk7Ci0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw2LDE2KQotICAgICAgICAgICAgICAgIHBkZXYtPmNvbmYuQ29uZmlnSW5kZXggPSBjZmctPmluZGV4OwotI2Vsc2UKLSAgICAgICAgICAgICAgICBsaW5rLT5jb25mLkNvbmZpZ0luZGV4ID0gY2ZnLT5pbmRleDsKLSNlbmRpZgotCi0gICAgICAgICAgICAgICAgLyogRG9lcyB0aGlzIGNhcmQgbmVlZCBhdWRpbyBvdXRwdXQ/ICovCi0gICAgICAgICAgICAgICAgaWYgKGNmZy0+ZmxhZ3MgJiBDSVNUUExfQ0ZUQUJMRV9BVURJTykgewotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNiwxNikKLSAgICAgICAgICAgICAgICAgICAgICAgIHBkZXYtPmNvbmYuQXR0cmlidXRlcyB8PSBDT05GX0VOQUJMRV9TUEtSOwotICAgICAgICAgICAgICAgICAgICAgICAgcGRldi0+Y29uZi5TdGF0dXMgPSBDQ1NSX0FVRElPX0VOQTsKLSNlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBsaW5rLT5jb25mLkF0dHJpYnV0ZXMgfD0gQ09ORl9FTkFCTEVfU1BLUjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxpbmstPmNvbmYuU3RhdHVzID0gQ0NTUl9BVURJT19FTkE7Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKiBVc2UgcG93ZXIgc2V0dGluZ3MgZm9yIFZjYyBhbmQgVnBwIGlmIHByZXNlbnQgKi8KLSAgICAgICAgICAgICAgICAvKiAgTm90ZSB0aGF0IHRoZSBDSVMgdmFsdWVzIG5lZWQgdG8gYmUgcmVzY2FsZWQgKi8KLSAgICAgICAgICAgICAgICBpZiAoY2ZnLT52Y2MucHJlc2VudCAmICgxIDw8IENJU1RQTF9QT1dFUl9WTk9NKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNvY2tldGNvbmYuVmNjICE9IGNmZy0+dmNjLnBhcmFtW0NJU1RQTF9QT1dFUl9WTk9NXSAvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwMDAgJiYgIXByaXNtMl9pZ25vcmV2Y2MpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0xBTl9MT0dfREVCVUcoMSwgIiAgVmNjIG1pc21hdGNoIC0gc2tpcHBpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHRoaXMgZW50cnlcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIG5leHRfZW50cnk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkZmx0LnZjYy5wcmVzZW50ICYgKDEgPDwgQ0lTVFBMX1BPV0VSX1ZOT00pKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc29ja2V0Y29uZi5WY2MgIT0gZGZsdC52Y2MucGFyYW1bQ0lTVFBMX1BPV0VSX1ZOT01dIC8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDAwMCAmJiAhcHJpc20yX2lnbm9yZXZjYykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXTEFOX0xPR19ERUJVRygxLCAiICBWY2MgKGRlZmF1bHQpIG1pc21hdGNoICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICItIHNraXBwaW5nIHRoaXMgZW50cnlcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIG5leHRfZW50cnk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGNmZy0+dnBwMS5wcmVzZW50ICYgKDEgPDwgQ0lTVFBMX1BPV0VSX1ZOT00pKSB7Ci0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw2LDE2KQotICAgICAgICAgICAgICAgICAgICAgICAgcGRldi0+Y29uZi5WcHAgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZmctPnZwcDEucGFyYW1bQ0lTVFBMX1BPV0VSX1ZOT01dIC8gMTAwMDA7Ci0jZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgbGluay0+Y29uZi5WcHAxID0gbGluay0+Y29uZi5WcHAyID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ZnLT52cHAxLnBhcmFtW0NJU1RQTF9QT1dFUl9WTk9NXSAvIDEwMDAwOwotI2VuZGlmCi0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkZmx0LnZwcDEucHJlc2VudCAmICgxIDw8IENJU1RQTF9QT1dFUl9WTk9NKSkgewotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNiwxNikKLSAgICAgICAgICAgICAgICAgICAgICAgIHBkZXYtPmNvbmYuVnBwID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGZsdC52cHAxLnBhcmFtW0NJU1RQTF9QT1dFUl9WTk9NXSAvIDEwMDAwOwotI2Vsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIGxpbmstPmNvbmYuVnBwMSA9IGxpbmstPmNvbmYuVnBwMiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRmbHQudnBwMS5wYXJhbVtDSVNUUExfUE9XRVJfVk5PTV0gLyAxMDAwMDsKLSNlbmRpZgotCQl9Ci0KLQkJLyogRG8gd2UgbmVlZCB0byBhbGxvY2F0ZSBhbiBpbnRlcnJ1cHQ/ICovCi0JCS8qIEhBQ0s6IGR1ZSB0byBhIGJhZCBDSVMuLi4ud2UgQUxXQVlTIG5lZWQgYW4gaW50ZXJydXB0ICovCi0JCS8qIGlmIChjZmctPmlycS5JUlFJbmZvMSB8fCBkZmx0LmlycS5JUlFJbmZvMSkgKi8KLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDYsMTYpCi0JCXBkZXYtPmNvbmYuQXR0cmlidXRlcyB8PSBDT05GX0VOQUJMRV9JUlE7Ci0jZWxzZQotCQlsaW5rLT5jb25mLkF0dHJpYnV0ZXMgfD0gQ09ORl9FTkFCTEVfSVJROwotI2VuZGlmCi0KLQkJLyogSU8gd2luZG93IHNldHRpbmdzICovCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw2LDE2KQotCQlwZGV2LT5pby5OdW1Qb3J0czEgPSBwZGV2LT5pby5OdW1Qb3J0czIgPSAwOwotCQlpZiAoKGNmZy0+aW8ubndpbiA+IDApIHx8IChkZmx0LmlvLm53aW4gPiAwKSkgewotCQkJY2lzdHBsX2lvX3QgKmlvID0gKGNmZy0+aW8ubndpbikgPyAmY2ZnLT5pbyA6ICZkZmx0LmlvOwotCQkJcGRldi0+aW8uQXR0cmlidXRlczEgPSBJT19EQVRBX1BBVEhfV0lEVEhfQVVUTzsKLQkJCWlmICghKGlvLT5mbGFncyAmIENJU1RQTF9JT184QklUKSkKLQkJCQlwZGV2LT5pby5BdHRyaWJ1dGVzMSA9IElPX0RBVEFfUEFUSF9XSURUSF8xNjsKLQkJCWlmICghKGlvLT5mbGFncyAmIENJU1RQTF9JT18xNkJJVCkpCi0JCQkJcGRldi0+aW8uQXR0cmlidXRlczEgPSBJT19EQVRBX1BBVEhfV0lEVEhfODsKLQkJCXBkZXYtPmlvLkJhc2VQb3J0MSA9IGlvLT53aW5bMF0uYmFzZTsKLQkJCWlmICAoIHBkZXYtPmlvLkJhc2VQb3J0MSAhPSAwICkgewotCQkJCVdMQU5fTE9HX1dBUk5JTkcoCi0JCQkJIkJyYWluIGRhbWFnZWQgQ0lTOiBoYXJkIGNvZGVkIGlvYmFzZT0iCi0JCQkJIjB4JXgsIHRyeSBsZXR0aW5nIHBjbWNpYV9jcyBkZWNpZGUuLi5cbiIsCi0JCQkJcGRldi0+aW8uQmFzZVBvcnQxICk7Ci0JCQkJcGRldi0+aW8uQmFzZVBvcnQxID0gMDsKLQkJCX0KLQkJCXBkZXYtPmlvLk51bVBvcnRzMSA9IGlvLT53aW5bMF0ubGVuOwotCQkJaWYgKGlvLT5ud2luID4gMSkgewotCQkJCXBkZXYtPmlvLkF0dHJpYnV0ZXMyID0gcGRldi0+aW8uQXR0cmlidXRlczE7Ci0JCQkJcGRldi0+aW8uQmFzZVBvcnQyID0gaW8tPndpblsxXS5iYXNlOwotCQkJCXBkZXYtPmlvLk51bVBvcnRzMiA9IGlvLT53aW5bMV0ubGVuOwotCQkJfQotCQl9Ci0JCS8qIFRoaXMgcmVzZXJ2ZXMgSU8gc3BhY2UgYnV0IGRvZXNuJ3QgYWN0dWFsbHkgZW5hYmxlIGl0ICovCi0JCUNGR19DSEVDSyhSZXF1ZXN0SU8sIHBjbWNpYV9yZXF1ZXN0X2lvKHBkZXYsICZwZGV2LT5pbykpOwotI2Vsc2UKLQkJbGluay0+aW8uTnVtUG9ydHMxID0gbGluay0+aW8uTnVtUG9ydHMyID0gMDsKLQkJaWYgKChjZmctPmlvLm53aW4gPiAwKSB8fCAoZGZsdC5pby5ud2luID4gMCkpIHsKLQkJCWNpc3RwbF9pb190ICppbyA9IChjZmctPmlvLm53aW4pID8gJmNmZy0+aW8gOiAmZGZsdC5pbzsKLQkJCWxpbmstPmlvLkF0dHJpYnV0ZXMxID0gSU9fREFUQV9QQVRIX1dJRFRIX0FVVE87Ci0JCQlpZiAoIShpby0+ZmxhZ3MgJiBDSVNUUExfSU9fOEJJVCkpCi0JCQkJbGluay0+aW8uQXR0cmlidXRlczEgPSBJT19EQVRBX1BBVEhfV0lEVEhfMTY7Ci0JCQlpZiAoIShpby0+ZmxhZ3MgJiBDSVNUUExfSU9fMTZCSVQpKQotCQkJCWxpbmstPmlvLkF0dHJpYnV0ZXMxID0gSU9fREFUQV9QQVRIX1dJRFRIXzg7Ci0JCQlsaW5rLT5pby5CYXNlUG9ydDEgPSBpby0+d2luWzBdLmJhc2U7Ci0JCQlpZiAgKCBsaW5rLT5pby5CYXNlUG9ydDEgIT0gMCApIHsKLQkJCQlXTEFOX0xPR19XQVJOSU5HKAotCQkJCSJCcmFpbiBkYW1hZ2VkIENJUzogaGFyZCBjb2RlZCBpb2Jhc2U9IgotCQkJCSIweCV4LCB0cnkgbGV0dGluZyBwY21jaWFfY3MgZGVjaWRlLi4uXG4iLAotCQkJCWxpbmstPmlvLkJhc2VQb3J0MSApOwotCQkJCWxpbmstPmlvLkJhc2VQb3J0MSA9IDA7Ci0JCQl9Ci0JCQlsaW5rLT5pby5OdW1Qb3J0czEgPSBpby0+d2luWzBdLmxlbjsKLQkJCWlmIChpby0+bndpbiA+IDEpIHsKLQkJCQlsaW5rLT5pby5BdHRyaWJ1dGVzMiA9IGxpbmstPmlvLkF0dHJpYnV0ZXMxOwotCQkJCWxpbmstPmlvLkJhc2VQb3J0MiA9IGlvLT53aW5bMV0uYmFzZTsKLQkJCQlsaW5rLT5pby5OdW1Qb3J0czIgPSBpby0+d2luWzFdLmxlbjsKLQkJCX0KLQkJfQotCQkvKiBUaGlzIHJlc2VydmVzIElPIHNwYWNlIGJ1dCBkb2Vzbid0IGFjdHVhbGx5IGVuYWJsZSBpdCAqLwotCQlDRkdfQ0hFQ0soUmVxdWVzdElPLCBwY21jaWFfcmVxdWVzdF9pbyhwZGV2LCAmbGluay0+aW8pKTsKLSNlbmRpZgotCQkvKiBJZiB3ZSBnb3QgdGhpcyBmYXIsIHdlJ3JlIGNvb2whICovCi0JCWJyZWFrOwotCi0JbmV4dF9lbnRyeToKLQkJaWYgKGNmZy0+ZmxhZ3MgJiBDSVNUUExfQ0ZUQUJMRV9ERUZBVUxUKQotCQkJZGZsdCA9ICpjZmc7Ci0JCUNTX0NIRUNLKEdldE5leHRUdXBsZSwgcGNtY2lhX2dldF9uZXh0X3R1cGxlKHBkZXYsICZ0dXBsZSkpOwotCi0JfQotCi0JLyogTGV0IHBjbWNpYSBrbm93IHRoZSBkZXZpY2UgbmFtZSAqLwotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNiwxNikKLQlwZGV2LT5kZXZfbm9kZSA9ICZody0+bm9kZTsKLSNlbHNlCi0JbGluay0+ZGV2ID0gJmh3LT5ub2RlOwotI2VuZGlmCi0KLQkvKiBSZWdpc3RlciB0aGUgbmV0d29yayBkZXZpY2UgYW5kIGdldCBhc3NpZ25lZCBhIG5hbWUgKi8KLQlTRVRfTU9EVUxFX09XTkVSKHdsYW5kZXYtPm5ldGRldik7Ci0JU0VUX05FVERFVl9ERVYod2xhbmRldi0+bmV0ZGV2LCAgJmhhbmRsZV90b19kZXYocGRldikpOwotCWlmIChyZWdpc3Rlcl93bGFuZGV2KHdsYW5kZXYpICE9IDApIHsKLQkJV0xBTl9MT0dfTk9USUNFKCJwcmlzbTJzdGFfY3M6IHJlZ2lzdGVyX3dsYW5kZXYoKSBmYWlsZWQuXG4iKTsKLQkJZ290byBmYWlsZWQ7Ci0JfQotCi0Jc3RyY3B5KGh3LT5ub2RlLmRldl9uYW1lLCB3bGFuZGV2LT5uYW1lKTsKLQotCS8qIEFsbG9jYXRlIGFuIGludGVycnVwdCBsaW5lLiAgTm90ZSB0aGF0IHRoaXMgZG9lcyBub3QgYXNzaWduIGEgKi8KLQkvKiBoYW5kbGVyIHRvIHRoZSBpbnRlcnJ1cHQsIHVubGVzcyB0aGUgJ0hhbmRsZXInIG1lbWJlciBvZiB0aGUgKi8KLQkvKiBpcnEgc3RydWN0dXJlIGlzIGluaXRpYWxpemVkLiAqLwotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNiwxNikKLQlpZiAocGRldi0+Y29uZi5BdHRyaWJ1dGVzICYgQ09ORl9FTkFCTEVfSVJRKSB7Ci0JCXBkZXYtPmlycS5JUlFJbmZvMSA9IElSUV9MRVZFTF9JRDsKLQkJcGRldi0+aXJxLkF0dHJpYnV0ZXMgPSBJUlFfVFlQRV9FWENMVVNJVkUgfCBJUlFfSEFORExFX1BSRVNFTlQ7Ci0JCXBkZXYtPmlycS5IYW5kbGVyID0gaGZhMzg0eF9pbnRlcnJ1cHQ7Ci0JCXBkZXYtPmlycS5JbnN0YW5jZSA9IHdsYW5kZXY7Ci0JCUNTX0NIRUNLKFJlcXVlc3RJUlEsIHBjbWNpYV9yZXF1ZXN0X2lycShwZGV2LCAmcGRldi0+aXJxKSk7Ci0JfQotI2Vsc2UKLQlpZiAobGluay0+Y29uZi5BdHRyaWJ1dGVzICYgQ09ORl9FTkFCTEVfSVJRKSB7Ci0JCWxpbmstPmlycS5JUlFJbmZvMSA9IElSUV9MRVZFTF9JRDsKLQkJbGluay0+aXJxLkF0dHJpYnV0ZXMgPSBJUlFfVFlQRV9FWENMVVNJVkUgfCBJUlFfSEFORExFX1BSRVNFTlQ7Ci0JCWxpbmstPmlycS5IYW5kbGVyID0gaGZhMzg0eF9pbnRlcnJ1cHQ7Ci0JCWxpbmstPmlycS5JbnN0YW5jZSA9IHdsYW5kZXY7Ci0JCUNTX0NIRUNLKFJlcXVlc3RJUlEsIHBjbWNpYV9yZXF1ZXN0X2lycShwZGV2LCAmbGluay0+aXJxKSk7Ci0JfQotI2VuZGlmCi0KLQkvKiBUaGlzIGFjdHVhbGx5IGNvbmZpZ3VyZXMgdGhlIFBDTUNJQSBzb2NrZXQgLS0gc2V0dGluZyB1cCAqLwotCS8qIHRoZSBJL08gd2luZG93cyBhbmQgdGhlIGludGVycnVwdCBtYXBwaW5nLCBhbmQgcHV0dGluZyB0aGUgKi8KLQkvKiBjYXJkIGFuZCBob3N0IGludGVyZmFjZSBpbnRvICJNZW1vcnkgYW5kIElPIiBtb2RlLiAqLwotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNiwxNikKLQlDU19DSEVDSyhSZXF1ZXN0Q29uZmlndXJhdGlvbiwgcGNtY2lhX3JlcXVlc3RfY29uZmlndXJhdGlvbihwZGV2LCAmcGRldi0+Y29uZikpOwotI2Vsc2UKLQlDU19DSEVDSyhSZXF1ZXN0Q29uZmlndXJhdGlvbiwgcGNtY2lhX3JlcXVlc3RfY29uZmlndXJhdGlvbihwZGV2LCAmbGluay0+Y29uZikpOwotI2VuZGlmCi0KLQkvKiBGaWxsIHRoZSBuZXRkZXZpY2Ugd2l0aCB0aGlzIGluZm8gKi8KLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDYsMTYpCi0Jd2xhbmRldi0+bmV0ZGV2LT5pcnEgPSBwZGV2LT5pcnEuQXNzaWduZWRJUlE7Ci0Jd2xhbmRldi0+bmV0ZGV2LT5iYXNlX2FkZHIgPSBwZGV2LT5pby5CYXNlUG9ydDE7Ci0jZWxzZQotCXdsYW5kZXYtPm5ldGRldi0+aXJxID0gbGluay0+aXJxLkFzc2lnbmVkSVJROwotCXdsYW5kZXYtPm5ldGRldi0+YmFzZV9hZGRyID0gbGluay0+aW8uQmFzZVBvcnQxOwotI2VuZGlmCi0KLQkvKiBBbmQgdGhlIHJlc3Qgb2YgdGhlIGh3IHN0cnVjdHVyZSAqLwotCWh3LT5pcnEgPSB3bGFuZGV2LT5uZXRkZXYtPmlycTsKLQlody0+aW9iYXNlID0gd2xhbmRldi0+bmV0ZGV2LT5iYXNlX2FkZHI7Ci0KLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMTcpCi0JbGluay0+c3RhdGUgfD0gREVWX0NPTkZJRzsKLQlsaW5rLT5zdGF0ZSAmPSB+REVWX0NPTkZJR19QRU5ESU5HOwotI2VuZGlmCi0KLQkvKiBBbmQgbm93IHdlJ3JlIGRvbmUhICovCi0Jd2xhbmRldi0+bXNkc3RhdGUgPSBXTEFOX01TRF9IV1BSRVNFTlQ7Ci0KLQlnb3RvIGRvbmU7Ci0KLSBjc19mYWlsZWQ6Ci0gICAgICAgIGNzX2Vycm9yKHBkZXYsIGxhc3RfZm4sIGxhc3RfcmV0KTsKLQotZmFpbGVkOgotCS8vIHdsYW5kZXYsIGh3LCBldGMgZXRjLi4KLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDYsMTYpCi0JcGRldi0+cHJpdiA9IE5VTEw7Ci0jZWxzZQotCXBkZXYtPmluc3RhbmNlID0gTlVMTDsKLQlpZiAobGluaykgewotCQlsaW5rLT5wcml2ID0gTlVMTDsKLQkJa2ZyZWUobGluayk7Ci0JfQotI2VuZGlmCi0JaWYgKHdsYW5kZXYpIHsKLQkJd2xhbl91bnNldHVwKHdsYW5kZXYpOwotCQlpZiAod2xhbmRldi0+cHJpdikgewotCQkJaHcgPSB3bGFuZGV2LT5wcml2OwotCQkJd2xhbmRldi0+cHJpdiA9IE5VTEw7Ci0JCQlpZiAoaHcpIHsKLQkJCQloZmEzODR4X2Rlc3Ryb3koaHcpOwotCQkJCWtmcmVlKGh3KTsKLQkJCX0KLQkJfQotCQlrZnJlZSh3bGFuZGV2KTsKLQl9Ci0KLWRvbmU6Ci0JaWYgKHBhcnNlKSBrZnJlZShwYXJzZSk7Ci0KLQlEQkZFWElUOwotCXJldHVybiBydmFsOwotfQotI2Vsc2UgIC8vIDw9IDIuNi4xNQotI2RlZmluZSBDU19DSEVDSyhmbiwgcmV0KSBcCi1kbyB7IGxhc3RfZm4gPSAoZm4pOyBpZiAoKGxhc3RfcmV0ID0gKHJldCkpICE9IDApIGdvdG8gY3NfZmFpbGVkOyB9IHdoaWxlICgwKQotCi0jZGVmaW5lIENGR19DSEVDSyhmbiwgcmV0ZikgXAotZG8geyBpbnQgcmV0ID0gKHJldGYpOyBcCi1pZiAocmV0ICE9IDApIHsgXAotICAgICAgICBXTEFOX0xPR19ERUJVRygxLCAiQ2FyZFNlcnZpY2VzKCIgI2ZuICIpIHJldHVybmVkICVkXG4iLCByZXQpOyBcCi0gICAgICAgIGNzX2Vycm9yKGxpbmstPmhhbmRsZSwgZm4sIHJldCk7IFwKLSAgICAgICAgZ290byBuZXh0X2VudHJ5OyBcCi19IFwKLX0gd2hpbGUgKDApCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBwcmlzbTJzdGFfYXR0YWNoCi0qCi0qIEhhbGYgb2YgdGhlIGF0dGFjaC9kZXRhY2ggcGFpci4gIENyZWF0ZXMgYW5kIHJlZ2lzdGVycyBhIGRldmljZQotKiBpbnN0YW5jZSB3aXRoIENhcmQgU2VydmljZXMuICBJbiB0aGlzIGNhc2UsIGl0IGFsc28gY3JlYXRlcyB0aGUKLSogd2xhbmRldiBzdHJ1Y3R1cmUgYW5kIGRldmljZSBwcml2YXRlIHN0cnVjdHVyZS4gIFRoZXNlIGFyZQotKiBsaW5rZWQgdG8gdGhlIGRldmljZSBpbnN0YW5jZSB2aWEgaXRzIHByaXYgbWVtYmVyLgotKgotKiBBcmd1bWVudHM6Ci0qCW5vbmUKLSoKLSogUmV0dXJuczoKLSoJQSB2YWxpZCBwdHIgdG8gZGV2X2xpbmtfdCBvbiBzdWNjZXNzLCBOVUxMIG90aGVyd2lzZQotKgotKiBTaWRlIGVmZmVjdHM6Ci0qCi0qCi0qIENhbGwgY29udGV4dDoKLSoJcHJvY2VzcyB0aHJlYWQgKGluc21vZC9pbml0X21vZHVsZS9yZWdpc3Rlcl9wY2NhcmRfZHJpdmVyKQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1kZXZfbGlua190ICpwcmlzbTJzdGFfYXR0YWNoKHZvaWQpCi17Ci0JY2xpZW50X3JlZ190CQljbGllbnRfcmVnOwotCWludAkJCXJlc3VsdDsKLQlkZXZfbGlua190CQkqbGluayA9IE5VTEw7Ci0Jd2xhbmRldmljZV90CQkqd2xhbmRldiA9IE5VTEw7Ci0JaGZhMzg0eF90CQkqaHcgPSBOVUxMOwotCi0JREJGRU5URVI7Ci0KLQkvKiBBbGxvYyBvdXIgc3RydWN0dXJlcyAqLwotCWxpbmsgPQkJa21hbGxvYyhzaXplb2Yoc3RydWN0IGRldl9saW5rX3QpLCBHRlBfS0VSTkVMKTsKLQotCWlmICghbGluayB8fCAoKHdsYW5kZXYgPSBjcmVhdGVfd2xhbigpKSA9PSBOVUxMKSkgewotCQlXTEFOX0xPR19FUlJPUigiJXM6IE1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmUuXG4iLCBkZXZfaW5mbyk7Ci0JCXJlc3VsdCA9IC1FSU87Ci0JCWdvdG8gZmFpbGVkOwotCX0KLQlodyA9IHdsYW5kZXYtPnByaXY7Ci0KLQkvKiBDbGVhciBhbGwgdGhlIHN0cnVjdHMgKi8KLQltZW1zZXQobGluaywgMCwgc2l6ZW9mKHN0cnVjdCBkZXZfbGlua190KSk7Ci0KLQlpZiAoIHdsYW5fc2V0dXAod2xhbmRldikgIT0gMCApIHsKLQkJV0xBTl9MT0dfRVJST1IoIiVzOiB3bGFuX3NldHVwKCkgZmFpbGVkLlxuIiwgZGV2X2luZm8pOwotCQlyZXN1bHQgPSAtRUlPOwotCQlnb3RvIGZhaWxlZDsKLQl9Ci0KLQkvKiBJbml0aWFsaXplIHRoZSBodyBzdHJ1Y3QgZm9yIG5vdyAqLwotCWhmYTM4NHhfY3JlYXRlKGh3LCAwLCAwLCBOVUxMKTsKLQlody0+d2xhbmRldiA9IHdsYW5kZXY7Ci0KLQkvKiBJbml0aWFsaXplIHRoZSBQQyBjYXJkIGRldmljZSBvYmplY3QuICovCi0jaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwwKSkKLQlpbml0X3RpbWVyKCZsaW5rLT5yZWxlYXNlKTsKLQlsaW5rLT5yZWxlYXNlLmZ1bmN0aW9uID0gJnByaXNtMnN0YV9yZWxlYXNlOwotCWxpbmstPnJlbGVhc2UuZGF0YSA9ICh1X2xvbmcpbGluazsKLSNlbmRpZgotCWxpbmstPmNvbmYuSW50VHlwZSA9IElOVF9NRU1PUllfQU5EX0lPOwotCWxpbmstPnByaXYgPSB3bGFuZGV2OwotI2lmIChkZWZpbmVkKENTX1JFTEVBU0VfQ09ERSkgJiYgKENTX1JFTEVBU0VfQ09ERSA8IDB4MjkxMSkpCi0JbGluay0+aXJxLkluc3RhbmNlID0gd2xhbmRldjsKLSNlbmRpZgotCi0JLyogTGluayBpbiB0byB0aGUgbGlzdCBvZiBkZXZpY2VzIG1hbmFnZWQgYnkgdGhpcyBkcml2ZXIgKi8KLQlsaW5rLT5uZXh0ID0gZGV2X2xpc3Q7Ci0JZGV2X2xpc3QgPSBsaW5rOwotCi0JLyogUmVnaXN0ZXIgd2l0aCBDYXJkIFNlcnZpY2VzICovCi0JY2xpZW50X3JlZy5kZXZfaW5mbyA9ICZkZXZfaW5mbzsKLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDExKSApCi0JY2xpZW50X3JlZy5BdHRyaWJ1dGVzID0gSU5GT19JT19DTElFTlQgfCBJTkZPX0NBUkRfU0hBUkU7Ci0jZW5kaWYKLQotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMTMpICkKLQljbGllbnRfcmVnLkV2ZW50TWFzayA9Ci0JCUNTX0VWRU5UX0NBUkRfSU5TRVJUSU9OIHwgQ1NfRVZFTlRfQ0FSRF9SRU1PVkFMIHwKLQkJQ1NfRVZFTlRfUkVTRVRfUkVRVUVTVCB8Ci0JCUNTX0VWRU5UX1JFU0VUX1BIWVNJQ0FMIHwgQ1NfRVZFTlRfQ0FSRF9SRVNFVCB8Ci0JCUNTX0VWRU5UX1BNX1NVU1BFTkQgfCBDU19FVkVOVF9QTV9SRVNVTUU7Ci0JY2xpZW50X3JlZy5ldmVudF9oYW5kbGVyID0gJnByaXNtMnN0YV9ldmVudDsKLSNlbmRpZgotCi0JY2xpZW50X3JlZy5WZXJzaW9uID0gMHgwMjEwOwotCWNsaWVudF9yZWcuZXZlbnRfY2FsbGJhY2tfYXJncy5jbGllbnRfZGF0YSA9IGxpbms7Ci0KLQlyZXN1bHQgPSBwY21jaWFfcmVnaXN0ZXJfY2xpZW50KCZsaW5rLT5oYW5kbGUsICZjbGllbnRfcmVnKTsKLQlpZiAocmVzdWx0ICE9IDApIHsKLQkJY3NfZXJyb3IobGluay0+aGFuZGxlLCBSZWdpc3RlckNsaWVudCwgcmVzdWx0KTsKLQkJcHJpc20yc3RhX2RldGFjaChsaW5rKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JZ290byBkb25lOwotCi0gZmFpbGVkOgotCWlmIChsaW5rKQlrZnJlZShsaW5rKTsKLQlpZiAod2xhbmRldikJa2ZyZWUod2xhbmRldik7Ci0JaWYgKGh3KQkJa2ZyZWUoaHcpOwotCWxpbmsgPSBOVUxMOwotCi0gZG9uZToKLQlEQkZFWElUOwotCXJldHVybiBsaW5rOwotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBwcmlzbTJzdGFfZGV0YWNoCi0qCi0qIFJlbW92ZSBvbmUgb2YgdGhlIGRldmljZSBpbnN0YW5jZXMgbWFuYWdlZCBieSB0aGlzIGRyaXZlci4KLSogICBTZWFyY2ggdGhlIGxpc3QgZm9yIHRoZSBnaXZlbiBpbnN0YW5jZSwKLSogICBjaGVjayBvdXIgZmxhZ3MgZm9yIGEgd2FpdGluZyB0aW1lcidkIHJlbGVhc2UgY2FsbAotKiAgIGNhbGwgcmVsZWFzZQotKiAgIERlcmVnaXN0ZXIgdGhlIGluc3RhbmNlIHdpdGggQ2FyZCBTZXJ2aWNlcwotKiAgIChuZXRkZXZpY2UpIHVucmVnaXN0ZXIgdGhlIG5ldHdvcmsgZGV2aWNlLgotKiAgIHVubGluayB0aGUgaW5zdGFuY2UgZnJvbSB0aGUgbGlzdAotKiAgIGZyZWUgdGhlIGxpbmssIHByaXYsIGFuZCBwcml2LT5wcml2IG1lbW9yeQotKiBOb3RlOiB0aGUgZGV2X2xpc3QgdmFyaWFibGUgaXMgYSBkcml2ZXIgc2NvcGVkIHN0YXRpYyB1c2VkIHRvCi0qCW1haW50YWluIGEgbGlzdCBvZiBkZXZpY2UgaW5zdGFuY2VzIG1hbmFnZWQgYnkgdGhpcwotKglkcml2ZXIuCi0qCi0qIEFyZ3VtZW50czoKLSoJbGluawlwdHIgdG8gdGhlIGluc3RhbmNlIHRvIGRldGFjaAotKgotKiBSZXR1cm5zOgotKglub3RoaW5nCi0qCi0qIFNpZGUgZWZmZWN0czoKLSoJdGhlIGxpbmsgc3RydWN0dXJlIGlzIGdvbmUsIHRoZSBuZXRkZXZpY2UgaXMgZ29uZQotKgotKiBDYWxsIGNvbnRleHQ6Ci0qCU1pZ2h0IGJlIGludGVycnVwdCwgZG9uJ3QgYmxvY2suCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXZvaWQgcHJpc20yc3RhX2RldGFjaChkZXZfbGlua190ICpsaW5rKQotewotCWRldl9saW5rX3QJCSoqbGlua3A7Ci0Jd2xhbmRldmljZV90CQkqd2xhbmRldjsKLQloZmEzODR4X3QJCSpodzsKLQotCURCRkVOVEVSOwotCi0JLyogTG9jYXRlIHByZXYgZGV2aWNlIHN0cnVjdHVyZSAqLwotCWZvciAobGlua3AgPSAmZGV2X2xpc3Q7ICpsaW5rcDsgbGlua3AgPSAmKCpsaW5rcCktPm5leHQpIHsKLQkJaWYgKCpsaW5rcCA9PSBsaW5rKSBicmVhazsKLQl9Ci0KLQlpZiAoKmxpbmtwICE9IE5VTEwpIHsKLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw0LDApKQotCQl1bnNpZ25lZCBsb25nCWZsYWdzOwotCQkvKiBHZXQgcmlkIG9mIGFueSB0aW1lcidkIHJlbGVhc2UgY2FsbCAqLwotCQlzYXZlX2ZsYWdzKGZsYWdzKTsKLQkJY2xpKCk7Ci0jZW5kaWYKLQotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMCkpCi0JCWlmIChsaW5rLT5zdGF0ZSAmIERFVl9SRUxFQVNFX1BFTkRJTkcpIHsKLQkJCWRlbF90aW1lcl9zeW5jKCZsaW5rLT5yZWxlYXNlKTsKLQkJCWxpbmstPnN0YXRlICY9IH5ERVZfUkVMRUFTRV9QRU5ESU5HOwotCQl9Ci0jZW5kaWYKLQotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDQsMCkpCi0JCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOwotI2VuZGlmCi0KLQkJLyogSWYgbGluayBzYXlzIHdlJ3JlIHN0aWxsIGNvbmZpZydkLCBjYWxsIHJlbGVhc2UgKi8KLQkJaWYgKGxpbmstPnN0YXRlICYgREVWX0NPTkZJRykgewotCQkJcHJpc20yc3RhX3JlbGVhc2UoKHVfbG9uZylsaW5rKTsKLQkJCWlmIChsaW5rLT5zdGF0ZSAmIERFVl9TVEFMRV9DT05GSUcpIHsKLQkJCQlsaW5rLT5zdGF0ZSB8PSBERVZfU1RBTEVfTElOSzsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQotCQkvKiBUZWxsIENhcmQgU2VydmljZXMgd2UncmUgbm90IGFyb3VuZCBhbnkgbW9yZSAqLwotCQlpZiAobGluay0+aGFuZGxlKSB7Ci0JCQlwY21jaWFfZGVyZWdpc3Rlcl9jbGllbnQobGluay0+aGFuZGxlKTsKLQkJfQotCi0JCS8qIFVubGluayBkZXZpY2Ugc3RydWN0dXJlLCBmcmVlIGJpdHMgKi8KLQkJKmxpbmtwID0gbGluay0+bmV4dDsKLQkJaWYgKCBsaW5rLT5wcml2ICE9IE5VTEwgKSB7Ci0JCQl3bGFuZGV2ID0gKHdsYW5kZXZpY2VfdCopbGluay0+cHJpdjsKLQkJCXA4MDIxMW5ldGRldl9od3JlbW92ZWQod2xhbmRldik7Ci0JCQlpZiAobGluay0+ZGV2ICE9IE5VTEwpIHsKLQkJCQl1bnJlZ2lzdGVyX3dsYW5kZXYod2xhbmRldik7Ci0JCQl9Ci0JCQl3bGFuX3Vuc2V0dXAod2xhbmRldik7Ci0JCQlpZiAod2xhbmRldi0+cHJpdikgewotCQkJCWh3ID0gd2xhbmRldi0+cHJpdjsKLQkJCQl3bGFuZGV2LT5wcml2ID0gTlVMTDsKLQkJCQlpZiAoaHcpIHsKLQkJCQkJaGZhMzg0eF9kZXN0cm95KGh3KTsKLQkJCQkJa2ZyZWUoaHcpOwotCQkJCX0KLQkJCX0KLQkJCWxpbmstPnByaXYgPSBOVUxMOwotCQkJa2ZyZWUod2xhbmRldik7Ci0JCX0KLQkJa2ZyZWUobGluayk7Ci0JfQotCi0JREJGRVhJVDsKLQlyZXR1cm47Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBwcmlzbTJzdGFfY29uZmlnCi0qCi0qIEhhbGYgb2YgdGhlIGNvbmZpZy9yZWxlYXNlIHBhaXIuICBVc3VhbGx5IGNhbGxlZCBpbiByZXNwb25zZSB0bwotKiBhIGNhcmQgaW5zZXJ0aW9uIGV2ZW50LiAgQXQgdGhpcyBwb2ludCwgd2UgX2tub3dfIHRoZXJlJ3Mgc29tZQotKiBwaHlzaWNhbCBkZXZpY2UgcHJlc2VudC4gIFRoYXQgbWVhbnMgd2UgY2FuIHN0YXJ0IHBva2luZyBhcm91bmQKLSogYXQgdGhlIENJUyBhbmQgYXQgYW55IGRldmljZSBzcGVjaWZpYyBjb25maWcgZGF0YSB3ZSB3YW50LgotKgotKiBOb3RlIHRoZSBnb3RvcyBhbmQgdGhlIG1hY3Jvcy4gIEkgcmVjb2RlZCB0aGlzIG9uY2Ugd2l0aG91dAotKiB0aGVtLCBhbmQgaXQgZ290IGluY3JlZGlibHkgdWdseS4gIEl0J3MgYWN0dWFsbHkgc2ltcGxlciB3aXRoCi0qIHRoZW0uCi0qCi0qIEFyZ3VtZW50czoKLSoJbGluawl0aGUgZGV2X2xpbmtfdCBzdHJ1Y3R1cmUgY3JlYXRlZCBpbiBhdHRhY2ggdGhhdAotKgkJcmVwcmVzZW50cyB0aGlzIGRldmljZSBpbnN0YW5jZS4KLSoKLSogUmV0dXJuczoKLSoJbm90aGluZwotKgotKiBTaWRlIGVmZmVjdHM6Ci0qCVJlc291cmNlcyAoaXJxLCBpbywgbWVtKSBhcmUgYWxsb2NhdGVkCi0qCVRoZSBwY21jaWEgZGV2X2xpbmstPm5vZGUtPm5hbWUgaXMgc2V0Ci0qCShGb3IgbmV0Y2FyZHMpIFRoZSBkZXZpY2Ugc3RydWN0dXJlIGlzIGZpbmlzaGVkIGFuZCwKLSoJICBtb3N0IGltcG9ydGFudGx5LCByZWdpc3RlcmVkLiAgVGhpcyBtZWFucyB0aGF0IHRoZXJlCi0qCSAgaXMgbm93IGEgX25hbWVkXyBkZXZpY2UgdGhhdCBjYW4gYmUgY29uZmlndXJlZCBmcm9tCi0qCSAgdXNlcmxhbmQuCi0qCi0qIENhbGwgY29udGV4dDoKLSoJTWF5IGJlIGNhbGxlZCBmcm9tIGEgdGltZXIuICBEb24ndCBibG9jayEKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2RlZmluZSBDU19DSEVDSyhmbiwgcmV0KSBcCi1kbyB7IGxhc3RfZm4gPSAoZm4pOyBpZiAoKGxhc3RfcmV0ID0gKHJldCkpICE9IDApIGdvdG8gY3NfZmFpbGVkOyB9IHdoaWxlICgwKQotCi0jZGVmaW5lIENGR19DSEVDSyhmbiwgcmV0ZikgXAotZG8geyBpbnQgcmV0ID0gKHJldGYpOyBcCi1pZiAocmV0ICE9IDApIHsgXAotICAgICAgICBXTEFOX0xPR19ERUJVRygxLCAiQ2FyZFNlcnZpY2VzKCIgI2ZuICIpIHJldHVybmVkICVkXG4iLCByZXQpOyBcCi0gICAgICAgIGNzX2Vycm9yKGxpbmstPmhhbmRsZSwgZm4sIHJldCk7IFwKLSAgICAgICAgZ290byBuZXh0X2VudHJ5OyBcCi19IFwKLX0gd2hpbGUgKDApCi0KLXZvaWQgcHJpc20yc3RhX2NvbmZpZyhkZXZfbGlua190ICpsaW5rKQotewotCWNsaWVudF9oYW5kbGVfdAkJaGFuZGxlOwotCXdsYW5kZXZpY2VfdAkJKndsYW5kZXY7Ci0JaGZhMzg0eF90ICAgICAgICAgICAgICAgKmh3OwotCWludAkJCWxhc3RfZm47Ci0JaW50CQkJbGFzdF9yZXQ7Ci0JdHVwbGVfdAkJCXR1cGxlOwotCWNpc3BhcnNlX3QJCXBhcnNlOwotCWNvbmZpZ19pbmZvX3QJCXNvY2tldGNvbmY7Ci0JVUlOVDgJCQlidWZbNjRdOwotCWludAkJCW1pblZjYyA9IDA7Ci0JaW50CQkJbWF4VmNjID0gMDsKLQljaXN0cGxfY2Z0YWJsZV9lbnRyeV90CWRmbHQgPSB7IDAgfTsKLQotCURCRkVOVEVSOwotCi0JaGFuZGxlID0gbGluay0+aGFuZGxlOwotCXdsYW5kZXYgPSAod2xhbmRldmljZV90KilsaW5rLT5wcml2OwotCWh3ID0gd2xhbmRldi0+cHJpdjsKLQotCS8qIENvbGxlY3QgdGhlIGNvbmZpZyByZWdpc3RlciBpbmZvICovCi0JdHVwbGUuRGVzaXJlZFR1cGxlID0gQ0lTVFBMX0NPTkZJRzsKLQl0dXBsZS5BdHRyaWJ1dGVzID0gMDsKLQl0dXBsZS5UdXBsZURhdGEgPSBidWY7Ci0JdHVwbGUuVHVwbGVEYXRhTWF4ID0gc2l6ZW9mKGJ1Zik7Ci0JdHVwbGUuVHVwbGVPZmZzZXQgPSAwOwotCUNTX0NIRUNLKEdldEZpcnN0VHVwbGUsIHBjbWNpYV9nZXRfZmlyc3RfdHVwbGUoaGFuZGxlLCAmdHVwbGUpKTsKLQlDU19DSEVDSyhHZXRUdXBsZURhdGEsIHBjbWNpYV9nZXRfdHVwbGVfZGF0YShoYW5kbGUsICZ0dXBsZSkpOwotCUNTX0NIRUNLKFBhcnNlVHVwbGUsIHBjbWNpYV9wYXJzZV90dXBsZShoYW5kbGUsICZ0dXBsZSwgJnBhcnNlKSk7Ci0KLQlsaW5rLT5jb25mLkNvbmZpZ0Jhc2UgPSBwYXJzZS5jb25maWcuYmFzZTsKLQlsaW5rLT5jb25mLlByZXNlbnQgPSBwYXJzZS5jb25maWcucm1hc2tbMF07Ci0KLQkvKiBDb25maWd1cmUgY2FyZCAqLwotCWxpbmstPnN0YXRlIHw9IERFVl9DT05GSUc7Ci0KLQkvKiBBY3F1aXJlIHRoZSBjdXJyZW50IHNvY2tldCBjb25maWcgKG5lZWQgVmNjIHNldHRpbmcpICovCi0JQ1NfQ0hFQ0soR2V0Q29uZmlndXJhdGlvbkluZm8sIHBjbWNpYV9nZXRfY29uZmlndXJhdGlvbl9pbmZvKGhhbmRsZSwgJnNvY2tldGNvbmYpKTsKLQotCS8qIExvb3AgdGhyb3VnaCB0aGUgY29uZmlnIHRhYmxlIGVudHJpZXMgdW50aWwgd2UgZmluZCBvbmUgdGhhdCB3b3JrcyAqLwotCS8qIEFzc3VtZXMgYSBjb21wbGV0ZSBhbmQgdmFsaWQgQ0lTICovCi0JdHVwbGUuRGVzaXJlZFR1cGxlID0gQ0lTVFBMX0NGVEFCTEVfRU5UUlk7Ci0JQ1NfQ0hFQ0soR2V0Rmlyc3RUdXBsZSwgcGNtY2lhX2dldF9maXJzdF90dXBsZShoYW5kbGUsICZ0dXBsZSkpOwotCXdoaWxlICgxKSB7Ci0JCWNpc3RwbF9jZnRhYmxlX2VudHJ5X3QgKmNmZyA9ICYocGFyc2UuY2Z0YWJsZV9lbnRyeSk7Ci0JCUNGR19DSEVDSyhHZXRUdXBsZURhdGEsIHBjbWNpYV9nZXRfdHVwbGVfZGF0YShoYW5kbGUsICZ0dXBsZSkpOwotCQlDRkdfQ0hFQ0soUGFyc2VUdXBsZSwgcGNtY2lhX3BhcnNlX3R1cGxlKGhhbmRsZSwgJnR1cGxlLCAmcGFyc2UpKTsKLQotCQlpZiAoY2ZnLT5pbmRleCA9PSAwKSBnb3RvIG5leHRfZW50cnk7Ci0JCWxpbmstPmNvbmYuQ29uZmlnSW5kZXggPSBjZmctPmluZGV4OwotCi0JCS8qIExldHMgcHJpbnQgb3V0IHRoZSBWY2MgdGhhdCB0aGUgY29udHJvbGxlcitwY21jaWEtY3Mgc2V0Ci0JCSAqIGZvciB1cywgY2F1c2UgdGhhdCdzIHdoYXQgd2UncmUgZ29pbmcgdG8gdXNlLgotCQkgKi8KLQkJV0xBTl9MT0dfREVCVUcoMSwiSW5pdGlhbCBWY2M9JWQvMTB2XG4iLCBzb2NrZXRjb25mLlZjYyk7Ci0JCWlmIChwcmlzbTJfaWdub3JldmNjKSB7Ci0JCQlsaW5rLT5jb25mLlZjYyA9IHNvY2tldGNvbmYuVmNjOwotCQkJZ290byBza2lwdmNjOwotCQl9Ci0KLQkJLyogVXNlIHBvd2VyIHNldHRpbmdzIGZvciBWY2MgYW5kIFZwcCBpZiBwcmVzZW50ICovCi0JCS8qIE5vdGUgdGhhdCB0aGUgQ0lTIHZhbHVlcyBuZWVkIHRvIGJlIHJlc2NhbGVkICovCi0JCWlmIChjZmctPnZjYy5wcmVzZW50ICYgKDE8PENJU1RQTF9QT1dFUl9WTk9NKSkgewotCQkJV0xBTl9MT0dfREVCVUcoMSwgIlZjYyBvYnRhaW5lZCBmcm9tIGN1cnR1cGwuVk5PTVxuIik7Ci0JCQltaW5WY2MgPSBtYXhWY2MgPQotCQkJCWNmZy0+dmNjLnBhcmFtW0NJU1RQTF9QT1dFUl9WTk9NXS8xMDAwMDsKLQkJfSBlbHNlIGlmIChkZmx0LnZjYy5wcmVzZW50ICYgKDE8PENJU1RQTF9QT1dFUl9WTk9NKSkgewotCQkJV0xBTl9MT0dfREVCVUcoMSwgIlZjYyBzZXQgZnJvbSBkZmx0LlZOT01cbiIpOwotCQkJbWluVmNjID0gbWF4VmNjID0KLQkJCQlkZmx0LnZjYy5wYXJhbVtDSVNUUExfUE9XRVJfVk5PTV0vMTAwMDA7Ci0JCX0gZWxzZSBpZiAoKGNmZy0+dmNjLnByZXNlbnQgJiAoMTw8Q0lTVFBMX1BPV0VSX1ZNQVgpKSAmJgotCQkJICAgKGNmZy0+dmNjLnByZXNlbnQgJiAoMTw8Q0lTVFBMX1BPV0VSX1ZNSU4pKSApIHsKLQkJCVdMQU5fTE9HX0RFQlVHKDEsICJWY2Mgc2V0IGZyb20gY3VydHVwbChWTUlOLFZNQVgpXG4iKTsJCQltaW5WY2MgPSBjZmctPnZjYy5wYXJhbVtDSVNUUExfUE9XRVJfVk1JTl0vMTAwMDA7Ci0JCQltYXhWY2MgPSBjZmctPnZjYy5wYXJhbVtDSVNUUExfUE9XRVJfVk1BWF0vMTAwMDA7Ci0JCX0gZWxzZSBpZiAoKGRmbHQudmNjLnByZXNlbnQgJiAoMTw8Q0lTVFBMX1BPV0VSX1ZNQVgpKSAmJgotCQkJICAgKGRmbHQudmNjLnByZXNlbnQgJiAoMTw8Q0lTVFBMX1BPV0VSX1ZNSU4pKSApIHsKLQkJCVdMQU5fTE9HX0RFQlVHKDEsICJWY2Mgc2V0IGZyb20gZGZsdChWTUlOLFZNQVgpXG4iKTsKLQkJCW1pblZjYyA9IGRmbHQudmNjLnBhcmFtW0NJU1RQTF9QT1dFUl9WTUlOXS8xMDAwMDsKLQkJCW1heFZjYyA9IGRmbHQudmNjLnBhcmFtW0NJU1RQTF9QT1dFUl9WTUFYXS8xMDAwMDsKLQkJfQotCi0JCWlmICggc29ja2V0Y29uZi5WY2MgPj0gbWluVmNjICYmIHNvY2tldGNvbmYuVmNjIDw9IG1heFZjYykgewotCQkJbGluay0+Y29uZi5WY2MgPSBzb2NrZXRjb25mLlZjYzsKLQkJfSBlbHNlIHsKLQkJCS8qIFtNU01dOiBOb3RlIHRoYXQgSSd2ZSBnaXZlbiB1cCB0cnlpbmcgdG8gY2hhbmdlCi0JCQkgKiB0aGUgVmNjIGlmIGEgY2hhbmdlIGlzIGluZGljYXRlZC4gIEl0IHNlZW1zIHRoZQotCQkJICogc3lzdGVtJnNvY2tldGNvbnRyb2xsZXImY2FyZCB2ZW5kb3JzIGNhbid0IHNlZW0KLQkJCSAqIHRvIGdldCBpdCByaWdodCwgc28gSSdtIHRpcmVkIG9mIHRyeWluZyB0byBoYWNrCi0JCQkgKiBteSB3YXkgYXJvdW5kIGl0LiAgcGNtY2lhLWNzIGRvZXMgaXRzIGJlc3QgdXNpbmcKLQkJCSAqIHRoZSB2b2x0YWdlIHNlbnNlIHBpbnMgYnV0IHNvbWV0aW1lcyB0aGUgY29udHJvbGxlcgotCQkJICogbGllcy4gIFRoZW4sIGV2ZW4gaWYgd2UgaGF2ZSBhIGdvb2QgcmVhZCBvbiB0aGUgVlMKLQkJCSAqIHBpbnMsIHNvbWUgc3lzdGVtIGRlc2lnbnMgd2lsbCBzaWxlbnRseSBpZ25vcmUgb3VyCi0JCQkgKiByZXF1ZXN0cyB0byBzZXQgdGhlIHZvbHRhZ2UuICBBZGRpdGlvbmFsbHksIHNvbWUKLQkJCSAqIHZlbmRvcnMgaGF2ZSAzLjN2IGluZGljYXRlZCBvbiB0aGVpciBzZW5zZSBwaW5zLAotCQkJICogYnV0IDV2IHNwZWNpZmllZCBpbiB0aGUgQ0lTIG9yIHZpY2UtdmVyc2EuICBJJ3ZlCi0JCQkgKiBoYWQgaXQuICBNeSBvbmx5IHJlY29tbWVuZGF0aW9uIGlzICJsZXQgdGhlIGJ1eWVyCi0JCQkgKiBiZXdhcmUiLiAgWW91ciBzeXN0ZW0gbWlnaHQgc3VwcGx5IDV2IHRvIGEgM3YgY2FyZAotCQkJICogKHBvc3NpYmx5IGNhdXNpbmcgZGFtYWdlKSBvciBhIDN2IGNhcGFibGUgc3lzdGVtCi0JCQkgKiBtaWdodCBzdXBwbHkgNXYgdG8gYSAzdiBjYXBhYmxlIGNhcmQgKHdhc3RpbmcKLQkJCSAqIHByZWNpb3VzIGJhdHRlcnkgbGlmZSkuCi0JCQkgKiBNeSBvbmx5IHJlY29tbWVuZGF0aW9uIChpZiB5b3UgY2FyZSkgaXMgdG8gZ2V0Ci0JCQkgKiB5b3Vyc2VsZiBhbiBleHRlbmRlciBjYXJkIChJIGRvbid0IGtub3cgd2hlcmUsIEkKLQkJCSAqIGhhdmUgb25seSBvbmUgbXlzZWxmKSBhbmQgYSBtZXRlciBhbmQgdGVzdCBpdCBmb3IKLQkJCSAqIHlvdXJzZWxmLgotCQkJICovCi0JCQlnb3RvIG5leHRfZW50cnk7Ci0JCX0KLXNraXB2Y2M6Ci0JCVdMQU5fTE9HX0RFQlVHKDEsICJsaW5rLT5jb25mLlZjYz0lZFxuIiwgbGluay0+Y29uZi5WY2MpOwotCi0JCS8qIERvIHdlIG5lZWQgdG8gYWxsb2NhdGUgYW4gaW50ZXJydXB0PyAqLwotCQkvKiBIQUNLOiBkdWUgdG8gYSBiYWQgQ0lTLi4uLndlIEFMV0FZUyBuZWVkIGFuIGludGVycnVwdCAqLwotCQkvKiBpZiAoY2ZnLT5pcnEuSVJRSW5mbzEgfHwgZGZsdC5pcnEuSVJRSW5mbzEpICovCi0JCQlsaW5rLT5jb25mLkF0dHJpYnV0ZXMgfD0gQ09ORl9FTkFCTEVfSVJROwotCi0JCS8qIElPIHdpbmRvdyBzZXR0aW5ncyAqLwotCQlsaW5rLT5pby5OdW1Qb3J0czEgPSBsaW5rLT5pby5OdW1Qb3J0czIgPSAwOwotCQlpZiAoKGNmZy0+aW8ubndpbiA+IDApIHx8IChkZmx0LmlvLm53aW4gPiAwKSkgewotCQkJY2lzdHBsX2lvX3QgKmlvID0gKGNmZy0+aW8ubndpbikgPyAmY2ZnLT5pbyA6ICZkZmx0LmlvOwotCQkJbGluay0+aW8uQXR0cmlidXRlczEgPSBJT19EQVRBX1BBVEhfV0lEVEhfQVVUTzsKLQkJCWlmICghKGlvLT5mbGFncyAmIENJU1RQTF9JT184QklUKSkKLQkJCQlsaW5rLT5pby5BdHRyaWJ1dGVzMSA9IElPX0RBVEFfUEFUSF9XSURUSF8xNjsKLQkJCWlmICghKGlvLT5mbGFncyAmIENJU1RQTF9JT18xNkJJVCkpCi0JCQkJbGluay0+aW8uQXR0cmlidXRlczEgPSBJT19EQVRBX1BBVEhfV0lEVEhfODsKLQkJCWxpbmstPmlvLkJhc2VQb3J0MSA9IGlvLT53aW5bMF0uYmFzZTsKLQkJCWlmICAoIGxpbmstPmlvLkJhc2VQb3J0MSAhPSAwICkgewotCQkJCVdMQU5fTE9HX1dBUk5JTkcoCi0JCQkJIkJyYWluIGRhbWFnZWQgQ0lTOiBoYXJkIGNvZGVkIGlvYmFzZT0iCi0JCQkJIjB4JXgsIHRyeSBsZXR0aW5nIHBjbWNpYV9jcyBkZWNpZGUuLi5cbiIsCi0JCQkJbGluay0+aW8uQmFzZVBvcnQxICk7Ci0JCQkJbGluay0+aW8uQmFzZVBvcnQxID0gMDsKLQkJCX0KLQkJCWxpbmstPmlvLk51bVBvcnRzMSA9IGlvLT53aW5bMF0ubGVuOwotCQkJaWYgKGlvLT5ud2luID4gMSkgewotCQkJCWxpbmstPmlvLkF0dHJpYnV0ZXMyID0gbGluay0+aW8uQXR0cmlidXRlczE7Ci0JCQkJbGluay0+aW8uQmFzZVBvcnQyID0gaW8tPndpblsxXS5iYXNlOwotCQkJCWxpbmstPmlvLk51bVBvcnRzMiA9IGlvLT53aW5bMV0ubGVuOwotCQkJfQotCQl9Ci0KLQkJLyogVGhpcyByZXNlcnZlcyBJTyBzcGFjZSBidXQgZG9lc24ndCBhY3R1YWxseSBlbmFibGUgaXQgKi8KLQkJQ0ZHX0NIRUNLKFJlcXVlc3RJTywgcGNtY2lhX3JlcXVlc3RfaW8obGluay0+aGFuZGxlLCAmbGluay0+aW8pKTsKLQotCQkvKiBJZiB3ZSBnb3QgdGhpcyBmYXIsIHdlJ3JlIGNvb2whICovCi0JCWJyZWFrOwotCi1uZXh0X2VudHJ5OgotCQlpZiAoY2ZnLT5mbGFncyAmIENJU1RQTF9DRlRBQkxFX0RFRkFVTFQpCi0JCQlkZmx0ID0gKmNmZzsKLQkJQ1NfQ0hFQ0soR2V0TmV4dFR1cGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgIHBjbWNpYV9nZXRfbmV4dF90dXBsZShoYW5kbGUsICZ0dXBsZSkpOwotCX0KLQotCS8qIEFsbG9jYXRlIGFuIGludGVycnVwdCBsaW5lLiAgTm90ZSB0aGF0IHRoaXMgZG9lcyBub3QgYXNzaWduIGEgKi8KLQkvKiBoYW5kbGVyIHRvIHRoZSBpbnRlcnJ1cHQsIHVubGVzcyB0aGUgJ0hhbmRsZXInIG1lbWJlciBvZiB0aGUgKi8KLQkvKiBpcnEgc3RydWN0dXJlIGlzIGluaXRpYWxpemVkLiAqLwotCWlmIChsaW5rLT5jb25mLkF0dHJpYnV0ZXMgJiBDT05GX0VOQUJMRV9JUlEpCi0JewotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMTEpICkKLQkJaW50CQkJaTsKLQkJbGluay0+aXJxLklSUUluZm8xID0gSVJRX0lORk8yX1ZBTElEIHwgSVJRX0xFVkVMX0lEOwotCQlpZiAoaXJxX2xpc3RbMF0gPT0gLTEpCi0JCQlsaW5rLT5pcnEuSVJRSW5mbzIgPSBpcnFfbWFzazsKLQkJZWxzZQotCQkJZm9yIChpPTA7IGk8NDsgaSsrKQotCQkJCWxpbmstPmlycS5JUlFJbmZvMiB8PSAxIDw8IGlycV9saXN0W2ldOwotI2Vsc2UKLQkJbGluay0+aXJxLklSUUluZm8xID0gSVJRX0xFVkVMX0lEOwotI2VuZGlmCi0JCWxpbmstPmlycS5BdHRyaWJ1dGVzID0gSVJRX1RZUEVfRVhDTFVTSVZFIHwgSVJRX0hBTkRMRV9QUkVTRU5UOwotCQlsaW5rLT5pcnEuSGFuZGxlciA9IGhmYTM4NHhfaW50ZXJydXB0OwotCQlsaW5rLT5pcnEuSW5zdGFuY2UgPSB3bGFuZGV2OwotCQlDU19DSEVDSyhSZXF1ZXN0SVJRLCBwY21jaWFfcmVxdWVzdF9pcnEobGluay0+aGFuZGxlLCAmbGluay0+aXJxKSk7Ci0JfQotCi0JLyogVGhpcyBhY3R1YWxseSBjb25maWd1cmVzIHRoZSBQQ01DSUEgc29ja2V0IC0tIHNldHRpbmcgdXAgKi8KLQkvKiB0aGUgSS9PIHdpbmRvd3MgYW5kIHRoZSBpbnRlcnJ1cHQgbWFwcGluZywgYW5kIHB1dHRpbmcgdGhlICovCi0JLyogY2FyZCBhbmQgaG9zdCBpbnRlcmZhY2UgaW50byAiTWVtb3J5IGFuZCBJTyIgbW9kZS4gKi8KLQlDU19DSEVDSyhSZXF1ZXN0Q29uZmlndXJhdGlvbiwgcGNtY2lhX3JlcXVlc3RfY29uZmlndXJhdGlvbihsaW5rLT5oYW5kbGUsICZsaW5rLT5jb25mKSk7Ci0KLQkvKiBGaWxsIHRoZSBuZXRkZXZpY2Ugd2l0aCB0aGlzIGluZm8gKi8KLQl3bGFuZGV2LT5uZXRkZXYtPmlycSA9IGxpbmstPmlycS5Bc3NpZ25lZElSUTsKLQl3bGFuZGV2LT5uZXRkZXYtPmJhc2VfYWRkciA9IGxpbmstPmlvLkJhc2VQb3J0MTsKLQotCS8qIFJlcG9ydCB3aGF0IHdlJ3ZlIGRvbmUgKi8KLQlXTEFOX0xPR19JTkZPKCIlczogaW5kZXggMHglMDJ4OiBWY2MgJWQuJWQiLAotCQlkZXZfaW5mbywgbGluay0+Y29uZi5Db25maWdJbmRleCwKLQkJbGluay0+Y29uZi5WY2MvMTAsIGxpbmstPmNvbmYuVmNjJTEwKTsKLQlpZiAobGluay0+Y29uZi5WcHAxKQotCQlwcmludGsoIiwgVnBwICVkLiVkIiwgbGluay0+Y29uZi5WcHAxLzEwLCBsaW5rLT5jb25mLlZwcDElMTApOwotCWlmIChsaW5rLT5jb25mLkF0dHJpYnV0ZXMgJiBDT05GX0VOQUJMRV9JUlEpCi0JCXByaW50aygiLCBpcnEgJWQiLCBsaW5rLT5pcnEuQXNzaWduZWRJUlEpOwotCWlmIChsaW5rLT5pby5OdW1Qb3J0czEpCi0JCXByaW50aygiLCBpbyAweCUwNHgtMHglMDR4IiwgbGluay0+aW8uQmFzZVBvcnQxLCBsaW5rLT5pby5CYXNlUG9ydDErbGluay0+aW8uTnVtUG9ydHMxLTEpOwotCWlmIChsaW5rLT5pby5OdW1Qb3J0czIpCi0JCXByaW50aygiICYgMHglMDR4LTB4JTA0eCIsIGxpbmstPmlvLkJhc2VQb3J0MiwgbGluay0+aW8uQmFzZVBvcnQyK2xpbmstPmlvLk51bVBvcnRzMi0xKTsKLQlwcmludGsoIlxuIik7Ci0KLQlsaW5rLT5zdGF0ZSAmPSB+REVWX0NPTkZJR19QRU5ESU5HOwotCi0JLyogTGV0IHBjbWNpYSBrbm93IHRoZSBkZXZpY2UgbmFtZSAqLwotCWxpbmstPmRldiA9ICZody0+bm9kZTsKLQotCS8qIFJlZ2lzdGVyIHRoZSBuZXR3b3JrIGRldmljZSBhbmQgZ2V0IGFzc2lnbmVkIGEgbmFtZSAqLwotCVNFVF9NT0RVTEVfT1dORVIod2xhbmRldi0+bmV0ZGV2KTsKLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwxMSkgKQotCVNFVF9ORVRERVZfREVWKHdsYW5kZXYtPm5ldGRldiwgICZoYW5kbGVfdG9fZGV2KGxpbmstPmhhbmRsZSkpOwotI2VuZGlmCi0JaWYgKHJlZ2lzdGVyX3dsYW5kZXYod2xhbmRldikgIT0gMCkgewotCQlXTEFOX0xPR19OT1RJQ0UoInByaXNtMnN0YV9jczogcmVnaXN0ZXJfd2xhbmRldigpIGZhaWxlZC5cbiIpOwotCQlnb3RvIGZhaWxlZDsKLQl9Ci0KLQlzdHJjcHkoaHctPm5vZGUuZGV2X25hbWUsIHdsYW5kZXYtPm5hbWUpOwotCi0JLyogQW55IGRldmljZSBjdXN0b20gY29uZmlnL3F1ZXJ5IHN0dWZmIHNob3VsZCBiZSBkb25lIGhlcmUgKi8KLQkvKiBGb3IgYSBuZXRkZXZpY2UsIHdlIHNob3VsZCBhdCBsZWFzdCBncmFiIHRoZSBtYWMgYWRkcmVzcyAqLwotCi0JcmV0dXJuOwotY3NfZmFpbGVkOgotCWNzX2Vycm9yKGxpbmstPmhhbmRsZSwgbGFzdF9mbiwgbGFzdF9yZXQpOwotCVdMQU5fTE9HX0VSUk9SKCJOZXh0VHVwbGUgZmFpbHVyZT8gSXQncyBwcm9iYWJseSBhIFZjYyBtaXNtYXRjaC5cbiIpOwotCi1mYWlsZWQ6Ci0JcHJpc20yc3RhX3JlbGVhc2UoKHVfbG9uZylsaW5rKTsKLQlyZXR1cm47Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBwcmlzbTJzdGFfcmVsZWFzZQotKgotKiBIYWxmIG9mIHRoZSBjb25maWcvcmVsZWFzZSBwYWlyLiAgVXN1YWxseSBjYWxsZWQgaW4gcmVzcG9uc2UgdG8KLSogYSBjYXJkIGVqZWN0aW9uIGV2ZW50LiAgQ2hlY2tzIHRvIG1ha2Ugc3VyZSBubyBoaWdoZXIgbGF5ZXJzCi0qIGFyZSBzdGlsbCAob3IgdGhpbmsgdGhleSBhcmUpIHVzaW5nIHRoZSBjYXJkIHZpYSB0aGUgbGluay0+b3BlbgotKiBmaWVsZC4KLSoKLSogTk9URTogRG9uJ3QgZm9yZ2V0IHRvIGluY3JlbWVudCB0aGUgbGluay0+b3BlbiB2YXJpYWJsZSBpbiB0aGUKLSogIGRldmljZV9vcGVuIG1ldGhvZCwgYW5kIGRlY3JlbWVudCBpdCBpbiB0aGUgZGV2aWNlX2Nsb3NlCi0qICBtZXRob2QuCi0qCi0qIEFyZ3VtZW50czoKLSoJYXJnCWEgZ2VuZXJpYyAzMiBiaXQgdmFyaWFibGUuICBJdCdzIHRoZSB2YWx1ZSB0aGF0Ci0qCQl3ZSBhc3NpZ25lZCB0byBsaW5rLT5yZWxlYXNlLmRhdGEgaW4gc3RhX2F0dGFjaCgpLgotKgotKiBSZXR1cm5zOgotKglub3RoaW5nCi0qCi0qIFNpZGUgZWZmZWN0czoKLSoJQWxsIHJlc291cmNlcyBzaG91bGQgYmUgcmVsZWFzZWQgYWZ0ZXIgdGhpcyBmdW5jdGlvbgotKglleGVjdXRlcyBhbmQgZmluZHMgdGhlIGRldmljZSAhb3Blbi4KLSoKLSogQ2FsbCBjb250ZXh0OgotKglQb3NzaWJseSBpbiBhIHRpbWVyIGNvbnRleHQuICBEb24ndCBkbyBhbnl0aGluZyB0aGF0J2xsCi0qCWJsb2NrLgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi12b2lkIHByaXNtMnN0YV9yZWxlYXNlKHVfbG9uZyBhcmcpCi17Ci0gICAgICAgIGRldl9saW5rX3QJKmxpbmsgPSAoZGV2X2xpbmtfdCAqKWFyZzsKLQotCURCRkVOVEVSOwotCi0JLyogRmlyc3QgdGhpbmcgd2Ugc2hvdWxkIGRvIGlzIGdldCB0aGUgTVNEIGJhY2sgdG8gdGhlCi0JICogSFdQUkVTRU5UIHN0YXRlLiAgSS5lLiBldmVyeXRoaW5nIHF1aWVzY2VudC4KLQkgKi8KLQlwcmlzbTJzdGFfaWZzdGF0ZShsaW5rLT5wcml2LCBQODAyMTFFTlVNX2lmc3RhdGVfZGlzYWJsZSk7Ci0KLSAgICAgICAgaWYgKGxpbmstPm9wZW4pIHsKLQkJLyogVE9ETzogSSBkb24ndCB0aGluayB3ZSdyZSBldmVuIHVzaW5nIHRoaXMgYml0IG9mIGNvZGUKLQkJICogYW5kIEkgZG9uJ3QgdGhpbmsgaXQncyBodXJ0aW5nIHVzIGF0IHRoZSBtb21lbnQuCi0JCSAqLwotICAgICAgICAgICAgICAgIFdMQU5fTE9HX0RFQlVHKDEsCi0JCQkicHJpc20yc3RhX2NzOiByZWxlYXNlIHBvc3Rwb25lZCwgJyVzJyBzdGlsbCBvcGVuXG4iLAotCQkJbGluay0+ZGV2LT5kZXZfbmFtZSk7Ci0gICAgICAgICAgICAgICAgbGluay0+c3RhdGUgfD0gREVWX1NUQUxFX0NPTkZJRzsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBwY21jaWFfcmVsZWFzZV9jb25maWd1cmF0aW9uKGxpbmstPmhhbmRsZSk7Ci0gICAgICAgIHBjbWNpYV9yZWxlYXNlX2lvKGxpbmstPmhhbmRsZSwgJmxpbmstPmlvKTsKLSAgICAgICAgcGNtY2lhX3JlbGVhc2VfaXJxKGxpbmstPmhhbmRsZSwgJmxpbmstPmlycSk7Ci0KLSAgICAgICAgbGluay0+c3RhdGUgJj0gfihERVZfQ09ORklHIHwgREVWX1JFTEVBU0VfUEVORElORyk7Ci0KLQlEQkZFWElUOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogcHJpc20yc3RhX2V2ZW50Ci0qCi0qIEhhbmRsZXIgZm9yIGNhcmQgc2VydmljZXMgZXZlbnRzLgotKgotKiBBcmd1bWVudHM6Ci0qCWV2ZW50CQlUaGUgZXZlbnQgY29kZQotKglwcmlvcml0eQloaS9sb3cgLSBSRU1PVkFMIGlzIHRoZSBvbmx5IGhpCi0qCWFyZ3MJCXB0ciB0byBjYXJkIHNlcnZpY2VzIHN0cnVjdCBjb250YWluaW5nIGluZm8gYWJvdXQKLSoJCQlwY21jaWEgc3RhdHVzCi0qCi0qIFJldHVybnM6Ci0qCVplcm8gb24gc3VjY2Vzcywgbm9uLXplcm8gb3RoZXJ3aXNlCi0qCi0qIFNpZGUgZWZmZWN0czoKLSoKLSoKLSogQ2FsbCBjb250ZXh0OgotKglCb3RoIGludGVycnVwdCBhbmQgcHJvY2VzcyB0aHJlYWQsIGRlcGVuZHMgb24gdGhlIGV2ZW50LgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1zdGF0aWMgaW50Ci1wcmlzbTJzdGFfZXZlbnQgKAotCWV2ZW50X3QgZXZlbnQsCi0JaW50IHByaW9yaXR5LAotCWV2ZW50X2NhbGxiYWNrX2FyZ3NfdCAqYXJncykKLXsKLQlpbnQJCQlyZXN1bHQgPSAwOwotCWRldl9saW5rX3QJCSpsaW5rID0gKGRldl9saW5rX3QgKikgYXJncy0+Y2xpZW50X2RhdGE7Ci0Jd2xhbmRldmljZV90CQkqd2xhbmRldiA9ICh3bGFuZGV2aWNlX3QqKWxpbmstPnByaXY7Ci0JaGZhMzg0eF90CQkqaHcgPSBOVUxMOwotCi0JREJGRU5URVI7Ci0KLQlpZiAod2xhbmRldikgaHcgPSB3bGFuZGV2LT5wcml2OwotCi0Jc3dpdGNoIChldmVudCkKLQl7Ci0JY2FzZSBDU19FVkVOVF9DQVJEX0lOU0VSVElPTjoKLQkJV0xBTl9MT0dfREVCVUcoNSwiZXZlbnQgaXMgSU5TRVJUSU9OXG4iKTsKLQkJbGluay0+c3RhdGUgfD0gREVWX1BSRVNFTlQgfCBERVZfQ09ORklHX1BFTkRJTkc7Ci0JCXByaXNtMnN0YV9jb25maWcobGluayk7Ci0JCWlmICghKGxpbmstPnN0YXRlICYgREVWX0NPTkZJRykpIHsKLQkJCXdsYW5kZXYtPm5ldGRldi0+aXJxID0gMDsKLQkJCVdMQU5fTE9HX0VSUk9SKAotCQkJCSIlczogSW5pdGlhbGl6YXRpb24gZmFpbGVkIVxuIiwgZGV2X2luZm8pOwotCQkJd2xhbmRldi0+bXNkc3RhdGUgPSBXTEFOX01TRF9IV0ZBSUw7Ci0JCQlicmVhazsKLQkJfQotCi0JCS8qIEZpbGwgaW4gdGhlIHJlc3Qgb2YgdGhlIGh3IHN0cnVjdCAqLwotCQlody0+aXJxID0gd2xhbmRldi0+bmV0ZGV2LT5pcnE7Ci0JCWh3LT5pb2Jhc2UgPSB3bGFuZGV2LT5uZXRkZXYtPmJhc2VfYWRkcjsKLQkJaHctPmxpbmsgPSBsaW5rOwotCi0JCWlmIChwcmlzbTJfZG9yZXNldCkgewotCQkJcmVzdWx0ID0gaGZhMzg0eF9jb3JlcmVzZXQoaHcsCi0JCQkJCXByaXNtMl9yZXNldF9ob2xkdGltZSwKLQkJCQkJcHJpc20yX3Jlc2V0X3NldHRsZXRpbWUsIDApOwotCQkJaWYgKCByZXN1bHQgKSB7Ci0JCQkJV0xBTl9MT0dfRVJST1IoCi0JCQkJCSJjb3JlcmVzZXQoKSBmYWlsZWQsIHJlc3VsdD0lZC5cbiIsCi0JCQkJCXJlc3VsdCk7Ci0JCQkJd2xhbmRldi0+bXNkc3RhdGUgPSBXTEFOX01TRF9IV0ZBSUw7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotI2lmIDAKLQkJLyoKLQkJICogVE9ETzogdGVzdF9ob3N0aWYoKSBub3QgaW1wbGVtZW50ZWQgeWV0LgotCQkgKi8KLQkJcmVzdWx0ID0gaGZhMzg0eF90ZXN0X2hvc3RpZihodyk7Ci0JCWlmIChyZXN1bHQpIHsKLQkJCVdMQU5fTE9HX0VSUk9SKAotCQkJInRlc3RfaG9zdGlmKCkgZmFpbGVkLCByZXN1bHQ9JWQuXG4iLCByZXN1bHQpOwotCQkJd2xhbmRldi0+bXNkc3RhdGUgPSBXTEFOX01TRF9IV0ZBSUw7Ci0JCQlicmVhazsKLQkJfQotI2VuZGlmCi0JCXdsYW5kZXYtPm1zZHN0YXRlID0gV0xBTl9NU0RfSFdQUkVTRU5UOwotCQlicmVhazsKLQotCWNhc2UgQ1NfRVZFTlRfQ0FSRF9SRU1PVkFMOgotCQlXTEFOX0xPR19ERUJVRyg1LCJldmVudCBpcyBSRU1PVkFMXG4iKTsKLQkJbGluay0+c3RhdGUgJj0gfkRFVl9QUkVTRU5UOwotCi0JCWlmICh3bGFuZGV2KSB7Ci0JCQlwODAyMTFuZXRkZXZfaHdyZW1vdmVkKHdsYW5kZXYpOwotCQl9Ci0KLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDApKQotCQlpZiAobGluay0+c3RhdGUgJiBERVZfQ09ORklHKQotCQl7Ci0JCQlsaW5rLT5yZWxlYXNlLmV4cGlyZXMgPSBqaWZmaWVzICsgKEhaLzIwKTsKLQkJCWFkZF90aW1lcigmbGluay0+cmVsZWFzZSk7Ci0JCX0KLSNlbmRpZgotCQlicmVhazsKLQljYXNlIENTX0VWRU5UX1JFU0VUX1JFUVVFU1Q6Ci0JCVdMQU5fTE9HX0RFQlVHKDUsImV2ZW50IGlzIFJFU0VUX1JFUVVFU1RcbiIpOwotCQlXTEFOX0xPR19OT1RJQ0UoCi0JCQkicHJpc20yIGNhcmQgcmVzZXQgbm90IHN1cHBvcnRlZCAiCi0JCQkiZHVlIHRvIHBvc3QtcmVzZXQgdXNlciBtb2RlIGNvbmZpZ3VyYXRpb24gIgotCQkJInJlcXVpcmVtZW50cy5cbiIpOwotCQlXTEFOX0xPR19OT1RJQ0UoCi0JCQkiICBGcm9tIHVzZXIgbW9kZSwgdXNlICIKLQkJCSInY2FyZGN0bCBzdXNwZW5kO2NhcmRjdGwgcmVzdW1lJyAiCi0JCQkiaW5zdGVhZC5cbiIpOwotCQlicmVhazsKLQljYXNlIENTX0VWRU5UX1JFU0VUX1BIWVNJQ0FMOgotCWNhc2UgQ1NfRVZFTlRfQ0FSRF9SRVNFVDoKLQkJV0xBTl9MT0dfV0FSTklORygiUngnZCBDU19FVkVOVF9SRVNFVF94eHgsIHNob3VsZCBub3QgIgotCQkJImJlIHBvc3NpYmxlIHNpbmNlIFJFU0VUX1JFUVVFU1Qgd2FzIGRlbmllZC5cbiIpOwotCQlicmVhazsKLQotCWNhc2UgQ1NfRVZFTlRfUE1fU1VTUEVORDoKLQkJV0xBTl9MT0dfREVCVUcoNSwiZXZlbnQgaXMgU1VTUEVORFxuIik7Ci0JCWxpbmstPnN0YXRlIHw9IERFVl9TVVNQRU5EOwotCQlpZiAobGluay0+c3RhdGUgJiBERVZfQ09ORklHKQotCQl7Ci0JCQlwcmlzbTJzdGFfaWZzdGF0ZSh3bGFuZGV2LCBQODAyMTFFTlVNX2lmc3RhdGVfZGlzYWJsZSk7Ci0JCQlwY21jaWFfcmVsZWFzZV9jb25maWd1cmF0aW9uKGxpbmstPmhhbmRsZSk7Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIENTX0VWRU5UX1BNX1JFU1VNRToKLQkJV0xBTl9MT0dfREVCVUcoNSwiZXZlbnQgaXMgUkVTVU1FXG4iKTsKLQkJbGluay0+c3RhdGUgJj0gfkRFVl9TVVNQRU5EOwotCQlpZiAobGluay0+c3RhdGUgJiBERVZfQ09ORklHKSB7Ci0JCQlwY21jaWFfcmVxdWVzdF9jb25maWd1cmF0aW9uKGxpbmstPmhhbmRsZSwgJmxpbmstPmNvbmYpOwotCQl9Ci0JCWJyZWFrOwotCX0KLQotCURCRkVYSVQ7Ci0JcmV0dXJuIDA7ICAvKiBub29uZSBlbHNlIGRvZXMgYW50aGluZyB3aXRoIHRoZSByZXR1cm4gdmFsdWUgKi8KLX0KLSNlbmRpZiAvLyA8PSAyLjYuMTUKLQotCi0KLWludCBoZmEzODR4X2NvcmVyZXNldChoZmEzODR4X3QgKmh3LCBpbnQgaG9sZHRpbWUsIGludCBzZXR0bGV0aW1lLCBpbnQgZ2VuZXNpcykKLXsKLQlpbnQJCXJlc3VsdCA9IDA7Ci0JY29uZl9yZWdfdAlyZWc7Ci0JVUlOVDgJCWNvcnNhdmU7Ci0JREJGRU5URVI7Ci0KLQlXTEFOX0xPR19ERUJVRygzLCAiRG9pbmcgcmVzZXQgdmlhIENhcmRTZXJ2aWNlcygpLlxuIik7Ci0KLQkvKiBDb2xsZWN0IENPUiAqLwotCXJlZy5GdW5jdGlvbiA9IDA7Ci0JcmVnLkFjdGlvbiA9IENTX1JFQUQ7Ci0JcmVnLk9mZnNldCA9IENJU1JFR19DT1I7Ci0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw2LDE2KQotCXJlc3VsdCA9IHBjbWNpYV9hY2Nlc3NfY29uZmlndXJhdGlvbl9yZWdpc3Rlcihody0+cGRldiwgJnJlZyk7Ci0jZWxzZQotCXJlc3VsdCA9IHBjbWNpYV9hY2Nlc3NfY29uZmlndXJhdGlvbl9yZWdpc3RlcigKLQkJCWh3LT5saW5rLT5oYW5kbGUsCi0JCQkmcmVnKTsKLSNlbmRpZgotCWlmIChyZXN1bHQgIT0gQ1NfU1VDQ0VTUyApIHsKLQkJV0xBTl9MT0dfRVJST1IoCi0JCQkiOjA6IEFjY2Vzc0NvbmZpZ3VyYXRpb25SZWdpc3RlcihDU19SRUFEKSBmYWlsZWQsIgotCQkJInJlc3VsdD0lZC5cbiIsIHJlc3VsdCk7Ci0JCXJlc3VsdCA9IC1FSU87Ci0JfQotCWNvcnNhdmUgPSByZWcuVmFsdWU7Ci0KLQkvKiBXcml0ZSByZXNldCBiaXQgKEJJVDcpICovCi0JcmVnLlZhbHVlIHw9IEJJVDc7Ci0JcmVnLkFjdGlvbiA9IENTX1dSSVRFOwotCXJlZy5PZmZzZXQgPSBDSVNSRUdfQ09SOwotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNiwxNikKLQlyZXN1bHQgPSBwY21jaWFfYWNjZXNzX2NvbmZpZ3VyYXRpb25fcmVnaXN0ZXIoaHctPnBkZXYsICZyZWcpOwotI2Vsc2UKLQlyZXN1bHQgPSBwY21jaWFfYWNjZXNzX2NvbmZpZ3VyYXRpb25fcmVnaXN0ZXIoCi0JCQlody0+bGluay0+aGFuZGxlLAotCQkJJnJlZyk7Ci0jZW5kaWYKLQlpZiAocmVzdWx0ICE9IENTX1NVQ0NFU1MgKSB7Ci0JCVdMQU5fTE9HX0VSUk9SKAotCQkJIjoxOiBBY2Nlc3NDb25maWd1cmF0aW9uUmVnaXN0ZXIoQ1NfV1JJVEUpIGZhaWxlZCwiCi0JCQkicmVzdWx0PSVkLlxuIiwgcmVzdWx0KTsKLQkJcmVzdWx0ID0gLUVJTzsKLQl9Ci0KLQkvKiBIb2xkIGZvciBob2xkdGltZSAqLwotCW1kZWxheShob2xkdGltZSk7Ci0KLQlpZiAoZ2VuZXNpcykgewotCQlyZWcuVmFsdWUgPSBnZW5lc2lzOwotCQlyZWcuQWN0aW9uID0gQ1NfV1JJVEU7Ci0JCXJlZy5PZmZzZXQgPSBDSVNSRUdfQ0NTUjsKLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDYsMTYpCi0JCXJlc3VsdCA9IHBjbWNpYV9hY2Nlc3NfY29uZmlndXJhdGlvbl9yZWdpc3Rlcihody0+cGRldiwgJnJlZyk7Ci0jZWxzZQotCQlyZXN1bHQgPSBwY21jaWFfYWNjZXNzX2NvbmZpZ3VyYXRpb25fcmVnaXN0ZXIoCi0JCQkJICAgICAgaHctPmxpbmstPmhhbmRsZSwKLQkJCQkgICAgICAmcmVnKTsKLSNlbmRpZgotCQlpZiAocmVzdWx0ICE9IENTX1NVQ0NFU1MgKSB7Ci0JCQlXTEFOX0xPR19FUlJPUigKLQkJCQkiOjE6IEFjY2Vzc0NvbmZpZ3VyYXRpb25SZWdpc3RlcihDU19XUklURSkgZmFpbGVkLCIKLQkJCQkicmVzdWx0PSVkLlxuIiwgcmVzdWx0KTsKLQkJCXJlc3VsdCA9IC1FSU87Ci0JCX0KLQl9Ci0KLQkvKiBIb2xkIGZvciBob2xkdGltZSAqLwotCW1kZWxheShob2xkdGltZSk7Ci0KLQkvKiBDbGVhciByZXNldCBiaXQgKi8KLQlyZWcuVmFsdWUgJj0gfkJJVDc7Ci0JcmVnLkFjdGlvbiA9IENTX1dSSVRFOwotCXJlZy5PZmZzZXQgPSBDSVNSRUdfQ09SOwotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNiwxNikKLQlyZXN1bHQgPSBwY21jaWFfYWNjZXNzX2NvbmZpZ3VyYXRpb25fcmVnaXN0ZXIoaHctPnBkZXYsICZyZWcpOwotI2Vsc2UKLQlyZXN1bHQgPSBwY21jaWFfYWNjZXNzX2NvbmZpZ3VyYXRpb25fcmVnaXN0ZXIoCi0JCQkJICAgICAgaHctPmxpbmstPmhhbmRsZSwKLQkJCQkgICAgICAmcmVnKTsKLSNlbmRpZgotCWlmIChyZXN1bHQgIT0gQ1NfU1VDQ0VTUyApIHsKLQkJV0xBTl9MT0dfRVJST1IoCi0JCQkiOjI6IEFjY2Vzc0NvbmZpZ3VyYXRpb25SZWdpc3RlcihDU19XUklURSkgZmFpbGVkLCIKLQkJCSJyZXN1bHQ9JWQuXG4iLCByZXN1bHQpOwotCQlyZXN1bHQgPSAtRUlPOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JLyogV2FpdCBmb3Igc2V0dGxldGltZSAqLwotCW1kZWxheShzZXR0bGV0aW1lKTsKLQotCS8qIFNldCBub24tcmVzZXQgYml0cyBiYWNrIHdoYXQgdGhleSB3ZXJlICovCi0JcmVnLlZhbHVlID0gY29yc2F2ZTsKLQlyZWcuQWN0aW9uID0gQ1NfV1JJVEU7Ci0JcmVnLk9mZnNldCA9IENJU1JFR19DT1I7Ci0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw2LDE2KQotCXJlc3VsdCA9IHBjbWNpYV9hY2Nlc3NfY29uZmlndXJhdGlvbl9yZWdpc3Rlcihody0+cGRldiwgJnJlZyk7Ci0jZWxzZQotCXJlc3VsdCA9IHBjbWNpYV9hY2Nlc3NfY29uZmlndXJhdGlvbl9yZWdpc3RlcigKLQkJCQkgICAgICBody0+bGluay0+aGFuZGxlLAotCQkJCSAgICAgICZyZWcpOwotI2VuZGlmCi0JaWYgKHJlc3VsdCAhPSBDU19TVUNDRVNTICkgewotCQlXTEFOX0xPR19FUlJPUigKLQkJCSI6MjogQWNjZXNzQ29uZmlndXJhdGlvblJlZ2lzdGVyKENTX1dSSVRFKSBmYWlsZWQsIgotCQkJInJlc3VsdD0lZC5cbiIsIHJlc3VsdCk7Ci0JCXJlc3VsdCA9IC1FSU87Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLWRvbmU6Ci0JREJGRVhJVDsKLQlyZXR1cm4gcmVzdWx0OwotfQotCi0jaWZkZWYgTU9EVUxFCi0KLXN0YXRpYyBpbnQgX19pbml0IHByaXNtMmNzX2luaXQodm9pZCkKLXsKLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDY4KSkKLQlzZXJ2aW5mb190CXNlcnY7Ci0jZW5kaWYKLQotCURCRkVOVEVSOwotCi0gICAgICAgIFdMQU5fTE9HX05PVElDRSgiJXMgTG9hZGVkXG4iLCB2ZXJzaW9uKTsKLSAgICAgICAgV0xBTl9MT0dfTk9USUNFKCJkZXZfaW5mbyBpczogJXNcbiIsIGRldl9pbmZvKTsKLQotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsNjgpKQotCXBjbWNpYV9nZXRfY2FyZF9zZXJ2aWNlc19pbmZvKCZzZXJ2KTsKLQlpZiAoIHNlcnYuUmV2aXNpb24gIT0gQ1NfUkVMRUFTRV9DT0RFICkKLQl7Ci0JCXByaW50ayhLRVJOX05PVElDRSIlczogQ2FyZFNlcnZpY2VzIHJlbGVhc2UgZG9lcyBub3QgbWF0Y2ghXG4iLCBkZXZfaW5mbyk7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKiBUaGlzIGNhbGwgd2lsbCByZXN1bHQgaW4gYSBjYWxsIHRvIHByaXNtMnN0YV9hdHRhY2ggKi8KLQkvKiAgIGFuZCBldmVudHVhbGx5IHByaXNtMnN0YV9kZXRhY2ggKi8KLQlyZWdpc3Rlcl9wY2NhcmRfZHJpdmVyKCAmZGV2X2luZm8sICZwcmlzbTJzdGFfYXR0YWNoLCAmcHJpc20yc3RhX2RldGFjaCk7Ci0jZWxzZQotCXBjbWNpYV9yZWdpc3Rlcl9kcml2ZXIoJnByaXNtMl9jc19kcml2ZXIpOwotI2VuZGlmCi0KLQlEQkZFWElUOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgcHJpc20yY3NfY2xlYW51cCh2b2lkKQotewotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsNjgpKQotICAgICAgICBkZXZfbGlua190ICpsaW5rID0gZGV2X2xpc3Q7Ci0gICAgICAgIGRldl9saW5rX3QgKm5saW5rOwotICAgICAgICBEQkZFTlRFUjsKLQotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMTApICkKLQlmb3IgKGxpbms9ZGV2X2xpc3Q7IGxpbmsgIT0gTlVMTDsgbGluayA9IG5saW5rKSB7Ci0JCW5saW5rID0gbGluay0+bmV4dDsKLQkJaWYgKCBsaW5rLT5zdGF0ZSAmIERFVl9DT05GSUcgKSB7Ci0JCQlwcmlzbTJzdGFfcmVsZWFzZSgodV9sb25nKWxpbmspOwotCQl9Ci0JCXByaXNtMnN0YV9kZXRhY2gobGluayk7IC8qIHJlbWVtYmVyIGRldGFjaCgpIGZyZWVzIGxpbmsgKi8KLQl9Ci0jZW5kaWYKLQotCXVucmVnaXN0ZXJfcGNjYXJkX2RyaXZlciggJmRldl9pbmZvKTsKLSNlbHNlCi0JcGNtY2lhX3VucmVnaXN0ZXJfZHJpdmVyKCZwcmlzbTJfY3NfZHJpdmVyKTsKLSNlbmRpZgotCi0gICAgICAgIHByaW50ayhLRVJOX05PVElDRSAiJXMgVW5sb2FkZWRcbiIsIHZlcnNpb24pOwotCi0gICAgICAgIERCRkVYSVQ7Ci0gICAgICAgIHJldHVybjsKLX0KLQotbW9kdWxlX2luaXQocHJpc20yY3NfaW5pdCk7Ci1tb2R1bGVfZXhpdChwcmlzbTJjc19jbGVhbnVwKTsKLQotI2VuZGlmIC8vIE1PRFVMRQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wcmlzbTJfcGNpLmMgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wcmlzbTJfcGNpLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmZTMyZGYuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcHJpc20yX3BjaS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzMyICswLDAgQEAKLSNkZWZpbmUgV0xBTl9IT1NUSUYgV0xBTl9QQ0kKLSNpbmNsdWRlICJoZmEzODR4LmMiCi0jaW5jbHVkZSAicHJpc20ybWdtdC5jIgotI2luY2x1ZGUgInByaXNtMm1pYi5jIgotI2luY2x1ZGUgInByaXNtMnN0YS5jIgotCi0jZGVmaW5lIFBDSV9TSVpFCQkweDEwMDAJCS8qIE1lbW9yeSBzaXplIC0gNEsgYnl0ZXMgKi8KLQotLyogSVNMMzg3NEEgMTFNYi9zIFdMQU4gY29udHJvbGxlciAqLwotI2RlZmluZSBQQ0lWRU5ET1JfSU5URVJTSUwJMHgxMjYwVUwKLSNkZWZpbmUgUENJREVWSUNFX0lTTDM4NzQJMHgzODczVUwgLyogW01TTV0geWVhaCBJIGtub3cuLi50aGUgSUQgc2F5cwotCQkJCQkgICAgMzg3My4gVHJ1c3QgbWUsIGl0J3MgYSAzODc0LiAqLwotCi0vKiBTYW1zdW5nIFNXTC0yMjEwUCAxMU1iL3MgV0xBTiBjb250cm9sbGVyICh1c2VzIElTTDM4NzRBKSAqLwotI2RlZmluZSBQQ0lWRU5ET1JfU0FNU1VORyAgICAgIDB4MTY3ZFVMCi0jZGVmaW5lIFBDSURFVklDRV9TV0xfMjIxMFAgICAgMHhhMDAwVUwKLQotI2RlZmluZSBQQ0lWRU5ET1JfTkVUR0VBUiAgICAgIDB4MTM4NVVMIC8qIGZvciBNQTMxMSAqLwotCi0vKiBQQ0kgQ2xhc3MgJiBTdWItQ2xhc3MgY29kZSwgTmV0d29yay0nT3RoZXIgY29udHJvbGxlcicgKi8KLSNkZWZpbmUgUENJX0NMQVNTX05FVFdPUktfT1RIRVJTIDB4MjgwCi0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIHByaXNtMnN0YV9wcm9iZV9wY2kKLSoKLSogUHJvYmUgcm91dGluZSBjYWxsZWQgd2hlbiBhIFBDSSBkZXZpY2Ugdy8gbWF0Y2hpbmcgSUQgaXMgZm91bmQuCi0qIFRoZSBJU0wzODc0IGltcGxlbWVudGF0aW9uIHVzZXMgdGhlIGZvbGxvd2luZyBtYXA6Ci0qICAgQkFSMDogUHJpc20yLnggcmVnaXN0ZXJzIG1lbW9yeSBtYXBwZWQsIHNpemU9NGsKLSogSGVyZSdzIHRoZSBzZXF1ZW5jZToKLSogICAtIEFsbG9jYXRlIHRoZSBQQ0kgcmVzb3VyY2VzLgotKiAgIC0gUmVhZCB0aGUgUENNQ0lBIGF0dHJpYnV0ZSBtZW1vcnkgdG8gbWFrZSBzdXJlIHdlIGhhdmUgYSBXTEFOIGNhcmQKLSogICAtIFJlc2V0IHRoZSBNQUMKLSogICAtIEluaXRpYWxpemUgdGhlIG5ldGRldiBhbmQgd2xhbiBkYXRhCi0qICAgLSBJbml0aWFsaXplIHRoZSBNQUMKLSoKLSogQXJndW1lbnRzOgotKglwZGV2CQlwdHIgdG8gcGNpIGRldmljZSBzdHJ1Y3R1cmUgY29udGFpbmluZyBpbmZvIGFib3V0Ci0qCQkJcGNpIGNvbmZpZ3VyYXRpb24uCi0qCWlkCQlwdHIgdG8gdGhlIGRldmljZSBpZCBlbnRyeSB0aGF0IG1hdGNoZWQgdGhpcyBkZXZpY2UuCi0qCi0qIFJldHVybnM6Ci0qCXplcm8JCS0gc3VjY2VzcwotKgluZWdhdGl2ZQktIGZhaWxlZAotKgotKiBTaWRlIGVmZmVjdHM6Ci0qCi0qCi0qIENhbGwgY29udGV4dDoKLSoJcHJvY2VzcyB0aHJlYWQKLSoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotc3RhdGljIGludCBfX2RldmluaXQKLXByaXNtMnN0YV9wcm9iZV9wY2koCi0Jc3RydWN0IHBjaV9kZXYgKnBkZXYsCi0JY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQotewotCWludAkJcmVzdWx0OwotCXBoeXNfdAkJcGh5bWVtID0gMDsKLQl2b2lkCQlfX2lvbWVtICptZW0gPSBOVUxMOwotICAgICAgICB3bGFuZGV2aWNlX3QgICAgKndsYW5kZXYgPSBOVUxMOwotCWhmYTM4NHhfdAkqaHcgPSBOVUxMOwotCi0JREJGRU5URVI7Ci0KLQkvKiBFbmFibGUgdGhlIHBjaSBkZXZpY2UgKi8KLQlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGRldikpIHsKLQkJV0xBTl9MT0dfRVJST1IoIiVzOiBwY2lfZW5hYmxlX2RldmljZSgpIGZhaWxlZC5cbiIsIGRldl9pbmZvKTsKLQkJcmVzdWx0ID0gLUVJTzsKLQkJZ290byBmYWlsOwotCX0KLQotCS8qIEZpZ3VyZSBvdXQgb3VyIHJlc291cmNlcyAqLwotCXBoeW1lbSA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAwKTsKLQotICAgICAgICBpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihwaHltZW0sIHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMCksICJQcmlzbTIiKSkgewotCQlwcmludGsoS0VSTl9FUlIgInByaXNtMjogQ2Fubm90IHJlc2VydmUgUENJIG1lbW9yeSByZWdpb25cbiIpOwotCQlyZXN1bHQgPSAtRUlPOwotCQlnb3RvIGZhaWw7Ci0gICAgICAgIH0KLQotCW1lbSA9IGlvcmVtYXAocGh5bWVtLCBQQ0lfU0laRSk7Ci0JaWYgKCBtZW0gPT0gMCApIHsKLQkJV0xBTl9MT0dfRVJST1IoIiVzOiBpb3JlbWFwKCkgZmFpbGVkLlxuIiwgZGV2X2luZm8pOwotCQlyZXN1bHQgPSAtRUlPOwotCQlnb3RvIGZhaWw7Ci0JfQotCi0JLyogTG9nIHRoZSBkZXZpY2UgKi8KLSAgICAgICAgV0xBTl9MT0dfSU5GTygiQSBQcmlzbTIuNSBQQ0kgZGV2aWNlIGZvdW5kLCAiCi0JCSJwaHltZW06MHglbGx4LCBpcnE6JWQsIG1lbToweCVwXG4iLAotCQkodW5zaWduZWQgbG9uZyBsb25nKXBoeW1lbSwgcGRldi0+aXJxLCBtZW0pOwotCi0JaWYgKCh3bGFuZGV2ID0gY3JlYXRlX3dsYW4oKSkgPT0gTlVMTCkgewotCQlXTEFOX0xPR19FUlJPUigiJXM6IE1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmUuXG4iLCBkZXZfaW5mbyk7Ci0JCXJlc3VsdCA9IC1FSU87Ci0JCWdvdG8gZmFpbDsKLQl9Ci0JaHcgPSB3bGFuZGV2LT5wcml2OwotCi0JaWYgKCB3bGFuX3NldHVwKHdsYW5kZXYpICE9IDAgKSB7Ci0JCVdMQU5fTE9HX0VSUk9SKCIlczogd2xhbl9zZXR1cCgpIGZhaWxlZC5cbiIsIGRldl9pbmZvKTsKLQkJcmVzdWx0ID0gLUVJTzsKLQkJZ290byBmYWlsOwotCX0KLQotCS8qIFNldHVwIG5ldGRldmljZSdzIGFiaWxpdHkgdG8gcmVwb3J0IHJlc291cmNlcwotCSAqIE5vdGU6IHRoZSBuZXRkZXZpY2Ugd2FzIGFsbG9jYXRlZCBieSB3bGFuX3NldHVwKCkKLQkgKi8KLSAgICAgICAgd2xhbmRldi0+bmV0ZGV2LT5pcnEgPSBwZGV2LT5pcnE7Ci0gICAgICAgIHdsYW5kZXYtPm5ldGRldi0+bWVtX3N0YXJ0ID0gKHVuc2lnbmVkIGxvbmcpIG1lbTsKLSAgICAgICAgd2xhbmRldi0+bmV0ZGV2LT5tZW1fZW5kID0gd2xhbmRldi0+bmV0ZGV2LT5tZW1fc3RhcnQgKwotCQlwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDApOwotCi0JLyogSW5pdGlhbGl6ZSB0aGUgaHcgZGF0YSAqLwotICAgICAgICBoZmEzODR4X2NyZWF0ZShodywgd2xhbmRldi0+bmV0ZGV2LT5pcnEsIDAsIG1lbSk7Ci0JaHctPndsYW5kZXYgPSB3bGFuZGV2OwotCi0JLyogUmVnaXN0ZXIgdGhlIHdsYW5kZXYsIHRoaXMgZ2V0cyB1cyBhIG5hbWUgYW5kIHJlZ2lzdGVycyB0aGUKLQkgKiBsaW51eCBuZXRkZXZpY2UuCi0JICovCi0JU0VUX01PRFVMRV9PV05FUih3bGFuZGV2LT5uZXRkZXYpOwotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDApKQotICAgICAgIFNFVF9ORVRERVZfREVWKHdsYW5kZXYtPm5ldGRldiwgJihwZGV2LT5kZXYpKTsKLSNlbmRpZgotICAgICAgICBpZiAoIHJlZ2lzdGVyX3dsYW5kZXYod2xhbmRldikgIT0gMCApIHsKLQkJV0xBTl9MT0dfRVJST1IoIiVzOiByZWdpc3Rlcl93bGFuZGV2KCkgZmFpbGVkLlxuIiwgZGV2X2luZm8pOwotCQlyZXN1bHQgPSAtRUlPOwotCQlnb3RvIGZhaWw7Ci0gICAgICAgIH0KLQotI2lmIDAKLQkvKiBUT0RPOiBNb3ZlIHRoaXMgYW5kIGFuIGlycSB0ZXN0IGludG8gYW4gaGZhMzg0eF90ZXN0aWYoKSByb3V0aW5lLgotCSAqLwotCW91dHcoUFJJU00yU1RBX01BR0lDLCBIRkEzODR4X1NXU1VQUE9SVCh3bGFuZGV2LT5uZXRkZXYtPmJhc2VfYWRkcikpOwotCXJlZz1pbncoIEhGQTM4NHhfU1dTVVBQT1JUKHdsYW5kZXYtPm5ldGRldi0+YmFzZV9hZGRyKSk7Ci0JaWYgKCByZWcgIT0gUFJJU00yU1RBX01BR0lDICkgewotCQlXTEFOX0xPR19FUlJPUigiTUFDIHJlZ2lzdGVyIGFjY2VzcyB0ZXN0IGZhaWxlZCFcbiIpOwotCQlyZXN1bHQgPSAtRUlPOwotCQlnb3RvIGZhaWw7Ci0JfQotI2VuZGlmCi0KLQkvKiBEbyBhIGNoaXAtbGV2ZWwgcmVzZXQgb24gdGhlIE1BQyAqLwotCWlmIChwcmlzbTJfZG9yZXNldCkgewotCQlyZXN1bHQgPSBoZmEzODR4X2NvcmVyZXNldChodywKLQkJCQlwcmlzbTJfcmVzZXRfaG9sZHRpbWUsCi0JCQkJcHJpc20yX3Jlc2V0X3NldHRsZXRpbWUsIDApOwotCQlpZiAocmVzdWx0ICE9IDApIHsKLQkJCVdMQU5fTE9HX0VSUk9SKAotCQkJCSIlczogaGZhMzg0eF9jb3JlcmVzZXQoKSBmYWlsZWQuXG4iLAotCQkJCWRldl9pbmZvKTsKLQkJCXVucmVnaXN0ZXJfd2xhbmRldih3bGFuZGV2KTsKLQkJCWhmYTM4NHhfZGVzdHJveShodyk7Ci0JCQlyZXN1bHQgPSAtRUlPOwotCQkJZ290byBmYWlsOwotCQl9Ci0JfQotCi0gICAgICAgIHBjaV9zZXRfZHJ2ZGF0YShwZGV2LCB3bGFuZGV2KTsKLQotCS8qIFNob3VsZG4ndCBhY3R1YWxseSBob29rIHVwIHRoZSBJUlEgdW50aWwgd2UKLQkgKiBfa25vd18gdGhpbmdzIGFyZSBhbHJpZ2h0LiAgQSB0ZXN0IHJvdXRpbmUgd291bGQgaGVscC4KLQkgKi8KLSAgICAgICAJcmVxdWVzdF9pcnEod2xhbmRldi0+bmV0ZGV2LT5pcnEsIGhmYTM4NHhfaW50ZXJydXB0LAotCQlTQV9TSElSUSwgd2xhbmRldi0+bmFtZSwgd2xhbmRldik7Ci0KLQl3bGFuZGV2LT5tc2RzdGF0ZSA9IFdMQU5fTVNEX0hXUFJFU0VOVDsKLQotCXJlc3VsdCA9IDA7Ci0JZ290byBkb25lOwotCi0gZmFpbDoKLQlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7Ci0JaWYgKHdsYW5kZXYpCWtmcmVlKHdsYW5kZXYpOwotCWlmIChodykJCWtmcmVlKGh3KTsKLSAgICAgICAgaWYgKG1lbSkgICAgICAgIGlvdW5tYXAobWVtKTsKLQlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOwotICAgICAgICBwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7Ci0KLSBkb25lOgotCURCRkVYSVQ7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RhdGljIHZvaWQgX19kZXZleGl0IHByaXNtMnN0YV9yZW1vdmVfcGNpKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQotewotICAgICAgIAl3bGFuZGV2aWNlX3QJCSp3bGFuZGV2OwotCWhmYTM4NHhfdAkqaHc7Ci0KLQl3bGFuZGV2ID0gKHdsYW5kZXZpY2VfdCAqKSBwY2lfZ2V0X2RydmRhdGEocGRldik7Ci0JaHcgPSB3bGFuZGV2LT5wcml2OwotCi0JcDgwMjExbmV0ZGV2X2h3cmVtb3ZlZCh3bGFuZGV2KTsKLQotCS8qIHJlc2V0IGhhcmR3YXJlICovCi0JcHJpc20yc3RhX2lmc3RhdGUod2xhbmRldiwgUDgwMjExRU5VTV9pZnN0YXRlX2Rpc2FibGUpOwotCi0gICAgICAgIGlmIChwZGV2LT5pcnEpCi0JCWZyZWVfaXJxKHBkZXYtPmlycSwgd2xhbmRldik7Ci0KLQl1bnJlZ2lzdGVyX3dsYW5kZXYod2xhbmRldik7Ci0KLQkvKiBmcmVlIGxvY2FsIHN0dWZmICovCi0JaWYgKGh3KSB7Ci0JCWhmYTM4NHhfZGVzdHJveShodyk7Ci0JCWtmcmVlKGh3KTsKLQl9Ci0KLQlpb3VubWFwKCh2b2lkIF9faW9tZW0gKil3bGFuZGV2LT5uZXRkZXYtPm1lbV9zdGFydCk7Ci0Jd2xhbl91bnNldHVwKHdsYW5kZXYpOwotCi0JcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKLSAgICAgICAgcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOwotCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKLQotCWtmcmVlKHdsYW5kZXYpOwotfQotCi0KLXN0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBwY2lfaWRfdGJsW10gPSB7Ci0JewotCQlQQ0lWRU5ET1JfSU5URVJTSUwsIFBDSURFVklDRV9JU0wzODc0LAotCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELAotCQkwLCAwLAotCQkvKiBEcml2ZXIgZGF0YSwgd2UganVzdCBwdXQgdGhlIG5hbWUgaGVyZSAqLwotCQkodW5zaWduZWQgbG9uZykiSW50ZXJzaWwgUHJpc20yLjUgSVNMMzg3NCAxMU1iL3MgV0xBTiBDb250cm9sbGVyIgotCX0sCi0JewotCQlQQ0lWRU5ET1JfSU5URVJTSUwsIDB4Mzg3MiwKLQkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwKLQkJMCwgMCwKLQkJLyogRHJpdmVyIGRhdGEsIHdlIGp1c3QgcHV0IHRoZSBuYW1lIGhlcmUgKi8KLQkJKHVuc2lnbmVkIGxvbmcpIkludGVyc2lsIFByaXNtMi41IElTTDM4NzIgMTFNYi9zIFdMQU4gQ29udHJvbGxlciIKLQl9LAotICAgICAgICB7Ci0gICAgICAgICAgICAgICBQQ0lWRU5ET1JfU0FNU1VORywgUENJREVWSUNFX1NXTF8yMjEwUCwKLSAgICAgICAgICAgICAgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsCi0gICAgICAgICAgICAgICAwLCAwLAotICAgICAgICAgICAgICAgLyogRHJpdmVyIGRhdGEsIHdlIGp1c3QgcHV0IHRoZSBuYW1lIGhlcmUgKi8KLSAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSJTYW1zdW5nIE1hZ2ljTEFOIFNXTC0yMjEwUCAxMU1iL3MgV0xBTiBDb250cm9sbGVyIgotCX0sCi0JeyAvKiBmb3IgTmV0R2VhciBNQTMxMSAqLwotCQlQQ0lWRU5ET1JfTkVUR0VBUiwgMHgzODcyLAotCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELAotCQkwLCAwLAotCQkvKiBEcml2ZXIgZGF0YSwgd2UganVzdCBwdXQgdGhlIG5hbWUgaGVyZSAqLwotCQkodW5zaWduZWQgbG9uZykiTmV0Z2VhciBNQTMxMSBXTEFOIENvbnRyb2xsZXIiCi0JfSwKLQl7Ci0JCTAsIDAsIDAsIDAsIDAsIDAsIDAKLQl9Ci19OwotCi1NT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgcGNpX2lkX3RibCk7Ci0KLS8qIEZ1bmN0aW9uIGRlY2xhcmVkIGhlcmUgYmVjYXVzZSBvZiBwdHIgcmVmZXJlbmNlIGJlbG93ICovCi1zdGF0aWMgaW50ICBfX2RldmluaXQgcHJpc20yc3RhX3Byb2JlX3BjaShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKLQkJCQljb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpOwotc3RhdGljIHZvaWQgIF9fZGV2ZXhpdCBwcmlzbTJzdGFfcmVtb3ZlX3BjaShzdHJ1Y3QgcGNpX2RldiAqcGRldik7Ci0KLXN0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBwcmlzbTJfcGNpX2Rydl9pZCA9IHsKLSAgICAgICAgLm5hbWUgPSAicHJpc20yX3BjaSIsCi0gICAgICAgIC5pZF90YWJsZSA9IHBjaV9pZF90YmwsCi0gICAgICAgIC5wcm9iZSA9IHByaXNtMnN0YV9wcm9iZV9wY2ksCi0gICAgICAgIC5yZW1vdmUgPSBwcmlzbTJzdGFfcmVtb3ZlX3BjaSwKLSNpZmRlZiBDT05GSUdfUE0KLSAgICAgICAgLnN1c3BlbmQgPSBwcmlzbTJzdGFfc3VzcGVuZF9wY2ksCi0gICAgICAgIC5yZXN1bWUgPSBwcmlzbTJzdGFfcmVzdW1lX3BjaSwKLSNlbmRpZgotfTsKLQotI2lmZGVmIE1PRFVMRQotCi1zdGF0aWMgaW50IF9faW5pdCBwcmlzbTJwY2lfaW5pdCh2b2lkKQotewotICAgICAgICBXTEFOX0xPR19OT1RJQ0UoIiVzIExvYWRlZFxuIiwgdmVyc2lvbik7Ci0JcmV0dXJuIHBjaV9tb2R1bGVfaW5pdCgmcHJpc20yX3BjaV9kcnZfaWQpOwotfTsKLQotc3RhdGljIHZvaWQgX19leGl0IHByaXNtMnBjaV9jbGVhbnVwKHZvaWQpCi17Ci0JcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZwcmlzbTJfcGNpX2Rydl9pZCk7Ci19OwotCi1tb2R1bGVfaW5pdChwcmlzbTJwY2lfaW5pdCk7Ci1tb2R1bGVfZXhpdChwcmlzbTJwY2lfY2xlYW51cCk7Ci0KLSNlbmRpZgotCi1pbnQgaGZhMzg0eF9jb3JlcmVzZXQoaGZhMzg0eF90ICpodywgaW50IGhvbGR0aW1lLCBpbnQgc2V0dGxldGltZSwgaW50IGdlbmVzaXMpCi17Ci0JaW50CQlyZXN1bHQgPSAwOwotCXVuc2lnbmVkIGxvbmcJdGltZW91dDsKLQlVSU5UMTYJcmVnOwotCURCRkVOVEVSOwotCi0JLyogQXNzZXJ0IHJlc2V0IGFuZCB3YWl0IGF3aGlsZQotCSAqIChub3RlOiB0aGVzZSBkZWxheXMgYXJlIF9yZWFsbHlfIGxvbmcsIGJ1dCB0aGV5IGFwcGVhciB0byBiZQotCSAqICAgICAgICBuZWNlc3NhcnkuKQotCSAqLwotCWhmYTM4NHhfc2V0cmVnKGh3LCAweGM1LCBIRkEzODR4X1BDSUNPUik7Ci0JdGltZW91dCA9IGppZmZpZXMgKyBIWi80OwotCXdoaWxlKHRpbWVfYmVmb3JlKGppZmZpZXMsIHRpbWVvdXQpKSB1ZGVsYXkoNSk7Ci0KLQlpZiAoZ2VuZXNpcykgewotCQloZmEzODR4X3NldHJlZyhodywgZ2VuZXNpcywgSEZBMzg0eF9QQ0lIQ1IpOwotCQl0aW1lb3V0ID0gamlmZmllcyArIEhaLzQ7Ci0JCXdoaWxlKHRpbWVfYmVmb3JlKGppZmZpZXMsIHRpbWVvdXQpKSB1ZGVsYXkoNSk7Ci0JfQotCi0JLyogQ2xlYXIgdGhlIHJlc2V0IGFuZCB3YWl0IHNvbWUgbW9yZQotCSAqLwotCWhmYTM4NHhfc2V0cmVnKGh3LCAweDQ1LCBIRkEzODR4X1BDSUNPUik7Ci0JdGltZW91dCA9IGppZmZpZXMgKyBIWi8yOwotCXdoaWxlKHRpbWVfYmVmb3JlKGppZmZpZXMsIHRpbWVvdXQpKSB1ZGVsYXkoNSk7Ci0KLQkvKiBXYWl0IGZvciBmL3cgdG8gY29tcGxldGUgaW5pdGlhbGl6YXRpb24gKENNRDpCVVNZID09IDApCi0JICovCi0JdGltZW91dCA9IGppZmZpZXMgKyAyKkhaOwotCXJlZyA9IGhmYTM4NHhfZ2V0cmVnKGh3LCBIRkEzODR4X0NNRCk7Ci0Jd2hpbGUgKCBIRkEzODR4X0NNRF9JU0JVU1kocmVnKSAmJiB0aW1lX2JlZm9yZSggamlmZmllcywgdGltZW91dCkgKSB7Ci0JCXJlZyA9IGhmYTM4NHhfZ2V0cmVnKGh3LCBIRkEzODR4X0NNRCk7Ci0JCXVkZWxheSgxMCk7Ci0JfQotCWlmIChIRkEzODR4X0NNRF9JU0JVU1kocmVnKSkgewotCQlXTEFOX0xPR19XQVJOSU5HKCJjb3JlcmVzZXQ6IFRpbWVkIG91dCB3YWl0aW5nIGZvciBjbWQgcmVnaXN0ZXIuXG4iKTsKLQkJcmVzdWx0PTE7Ci0JfQotCURCRkVYSVQ7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3ByaXNtMl9wbHguYyBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3ByaXNtMl9wbHguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzIwNDQzZi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wcmlzbTJfcGx4LmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NzIgKzAsMCBAQAotI2RlZmluZSBXTEFOX0hPU1RJRiBXTEFOX1BMWAotI2luY2x1ZGUgImhmYTM4NHguYyIKLSNpbmNsdWRlICJwcmlzbTJtZ210LmMiCi0jaW5jbHVkZSAicHJpc20ybWliLmMiCi0jaW5jbHVkZSAicHJpc20yc3RhLmMiCi0KLSNkZWZpbmUgUExYX0FUVFJfU0laRQkweDEwMDAJLyogQXR0cmlidXRlIG1lbW9yeSBzaXplIC0gNEsgYnl0ZXMgKi8KLSNkZWZpbmUgQ09SX09GRlNFVAkweDNlMAkvKiBDT1IgYXR0cmlidXRlIG9mZnNldCBvZiBQcmlzbTIgUEMgY2FyZCAqLwotI2RlZmluZSBDT1JfVkFMVUUJMHg0MQkvKiBFbmFibGUgUEMgY2FyZCB3aXRoIGlycSBpbiBsZXZlbCB0cmlnZ2VyICovCi0jZGVmaW5lIFBMWF9JTlRDU1IJMHg0YwkvKiBJbnRlcnJ1cHQgQ29udHJvbCBhbmQgU3RhdHVzIFJlZ2lzdGVyICovCi0jZGVmaW5lIFBMWF9JTlRDU1JfSU5URU4gKDE8PDYpIC8qIEludGVycnVwdCBFbmFibGUgYml0ICovCi0jZGVmaW5lIFBMWF9NSU5fQVRUUl9MRU4gNTEyICAgIC8qIGF0IGxlYXN0IDIgeCAyNTYgaXMgbmVlZGVkIGZvciBDSVMgKi8KLQotLyogM0NvbSAzQ1JXNzc3QSAoUExYKSBib2FyZCBJRCAqLwotI2RlZmluZSBQQ0lWRU5ET1JfM0NPTSAgICAgICAweDEwQjcKLSNkZWZpbmUgUENJREVWSUNFX0FJUkNPTk5FQ1QgMHg3NzcwCi0KLS8qIEV1bWl0Y29tIFBDSSBXTDExMDAwIFBDSSBBZGFwdGVyIChQTFgpIGJvYXJkIGRldmljZSt2ZW5kb3IgSUQgKi8KLSNkZWZpbmUgUENJVkVORE9SX0VVTUlUQ09NCTB4MTYzOFVMCi0jZGVmaW5lIFBDSURFVklDRV9XTDExMDAwCTB4MTEwMFVMCi0KLS8qIEdsb2JhbCBTdW4gVGVjaCBHTDI0MTEwUCBQQ0kgQWRhcHRlciAoUExYKSBib2FyZCBkZXZpY2UrdmVuZG9yIElEICovCi0jZGVmaW5lIFBDSVZFTkRPUl9HTE9CQUxTVU4JMHgxNmFiVUwKLSNkZWZpbmUgUENJREVWSUNFX0dMMjQxMTBQCTB4MTEwMVVMCi0jZGVmaW5lIFBDSURFVklDRV9HTDI0MTEwUF9BTFQJMHgxMTAyVUwKLQotLyogTmV0Z2VhciBNQTMwMSBQQ0kgQWRhcHRlciAoUExYKSBib2FyZCBkZXZpY2UrdmVuZG9yIElEICovCi0jZGVmaW5lIFBDSVZFTkRPUl9ORVRHRUFSCTB4MTM4NVVMCi0jZGVmaW5lIFBDSURFVklDRV9NQTMwMQkJMHg0MTAwVUwKLQotLyogVVMgUm9ib3RpY3MgVVNSMjQxMCBQQ0kgQWRhcHRlciAoUExYKSBib2FyZCBkZXZpY2UrdmVuZG9yIElEICovCi0jZGVmaW5lCVBDSVZFTkRPUl9VU1JPQk9USUNTICAgIDB4MTZlY1VMCi0jZGVmaW5lIFBDSURFVklDRV9VU1IyNDEwICAgICAgIDB4MzY4NVVMCi0KLS8qIExpbmtzeXMgV1BDMTEgY2FyZCB3aXRoIHRoZSBXRFQxMSBhZGFwdGVyIChQTFgpIGJvYXJkIGRldmljZSt2ZW5kb3IgSUQgKi8KLSNkZWZpbmUJUENJVkVORE9SX0xpbmtzeXMgICAgICAgMHgxNmFiVUwKLSNkZWZpbmUgUENJREVWSUNFX1dwYzExV2R0MTEgICAgMHgxMTAyVUwKLQotLyogTmF0aW9uYWwgRGF0YWNvbW0gQ29ycCBTT0hPd2FyZSBOZXRibGFzdGVyIElJIFBDSSAqLwotI2RlZmluZSBQQ0lWRU5ET1JfTkRDCSAgICAgICAgMHgxNWU4VUwKLSNkZWZpbmUgUENJREVWSUNFX05DUDEzMF9QTFggCTB4MDEzMFVMCi0jZGVmaW5lIFBDSURFVklDRV9OQ1AxMzBfQVNJQwkweDAxMzFVTAotCi0vKiBOREMgTkNQMTMwX1BMWCBpcyBhbHNvIHNvbGQgYnkgQ29yZWdhLiBUaGVpciBuYW1lIGlzIENHV0xQQ0lBMTEgKi8KLSNkZWZpbmUgUENJVkVORE9SX0NPUkVHQSAgICAgICBQQ0lWRU5ET1JfTkRDCi0jZGVmaW5lIFBDSURFVklDRV9DR1dMUENJQTExICAgUENJREVWSUNFX05DUDEzMF9QTFgKLQotLyogUENJIENsYXNzICYgU3ViLUNsYXNzIGNvZGUsIE5ldHdvcmstJ090aGVyIGNvbnRyb2xsZXInICovCi0jZGVmaW5lIFBDSV9DTEFTU19ORVRXT1JLX09USEVSUyAweDI4MAotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogcHJpc20yc3RhX3Byb2JlX3BseAotKgotKiBQcm9iZSByb3V0aW5lIGNhbGxlZCB3aGVuIGEgUENJIGRldmljZSB3LyBtYXRjaGluZyBJRCBpcyBmb3VuZC4KLSogVGhpcyBQTFggaW1wbGVtZW50YXRpb24gdXNlcyB0aGUgZm9sbG93aW5nIG1hcDoKLSogICBCQVIwOiBVbnVzZWQKLSogICBCQVIxOiA/Pz8/Ci0qICAgQkFSMjogUENNQ0lBIGF0dHJpYnV0ZSBtZW1vcnkKLSogICBCQVIzOiBQQ01DSUEgaS9vIHNwYWNlCi0qIEhlcmUncyB0aGUgc2VxdWVuY2U6Ci0qICAgLSBBbGxvY2F0ZSB0aGUgUENJIHJlc291cmNlcy4KLSogICAtIFJlYWQgdGhlIFBDTUNJQSBhdHRyaWJ1dGUgbWVtb3J5IHRvIG1ha2Ugc3VyZSB3ZSBoYXZlIGEgV0xBTiBjYXJkCi0qICAgLSBSZXNldCB0aGUgTUFDIHVzaW5nIHRoZSBQQ01DSUEgQ09SCi0qICAgLSBJbml0aWFsaXplIHRoZSBuZXRkZXYgYW5kIHdsYW4gZGF0YQotKiAgIC0gSW5pdGlhbGl6ZSB0aGUgTUFDCi0qCi0qIEFyZ3VtZW50czoKLSoJcGRldgkJcHRyIHRvIHBjaSBkZXZpY2Ugc3RydWN0dXJlIGNvbnRhaW5pbmcgaW5mbyBhYm91dAotKgkJCXBjaSBjb25maWd1cmF0aW9uLgotKglpZAkJcHRyIHRvIHRoZSBkZXZpY2UgaWQgZW50cnkgdGhhdCBtYXRjaGVkIHRoaXMgZGV2aWNlLgotKgotKiBSZXR1cm5zOgotKgl6ZXJvCQktIHN1Y2Nlc3MKLSoJbmVnYXRpdmUJLSBmYWlsZWQKLSoKLSogU2lkZSBlZmZlY3RzOgotKgotKgotKiBDYWxsIGNvbnRleHQ6Ci0qCXByb2Nlc3MgdGhyZWFkCi0qCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXN0YXRpYyBpbnQgX19kZXZpbml0Ci1wcmlzbTJzdGFfcHJvYmVfcGx4KAotCXN0cnVjdCBwY2lfZGV2CQkJKnBkZXYsCi0JY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQJKmlkKQotewotCWludAkJcmVzdWx0OwotICAgICAgICBwaHlzX3QJcGNjYXJkX2lvYWRkcjsKLQlwaHlzX3QgIHBjY2FyZF9hdHRyX21lbTsKLSAgICAgICAgdW5zaWduZWQgaW50ICAgIHBjY2FyZF9hdHRyX2xlbjsKLQl2b2lkIF9faW9tZW0gKmF0dHJfbWVtID0gTlVMTDsKLQlVSU5UMzIJCXBseF9hZGRyOwotICAgICAgICB3bGFuZGV2aWNlX3QgICAgKndsYW5kZXYgPSBOVUxMOwotCWhmYTM4NHhfdAkqaHcgPSBOVUxMOwotCWludAkJcmVnOwotICAgICAgICB1MzIJCXJlZ2ljOwotCi0JaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpKQotCQlyZXR1cm4gLUVJTzsKLQotCS8qIFRNQzcxNjAgYm9hcmRzIGFyZSBzcGVjaWFsICovCi0JaWYgKChwZGV2LT52ZW5kb3IgPT0gUENJVkVORE9SX05EQykgJiYKLQkgICAgKHBkZXYtPmRldmljZSA9PSBQQ0lERVZJQ0VfTkNQMTMwX0FTSUMpKSB7Ci0JCXVuc2lnbmVkIGxvbmcgZGVsYXk7Ci0KLQkJcGNjYXJkX2F0dHJfbWVtID0gMDsKLQkJcGNjYXJkX2lvYWRkciA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAxKTsKLQotCQlvdXRiKDB4NDUsIHBjY2FyZF9pb2FkZHIpOwotCQlkZWxheSA9IGppZmZpZXMgKyAxKkhaOwotCQl3aGlsZSAodGltZV9iZWZvcmUoamlmZmllcywgZGVsYXkpKTsKLQotCQlpZiAoaW5iKHBjY2FyZF9pb2FkZHIpICE9IDB4NDUpIHsKLQkJCVdMQU5fTE9HX0VSUk9SKCJJbml0aWFsaXplIHRoZSBUTUM3MTYwIGZhaWxlZC4gKDB4JXgpXG4iLCBpbmIocGNjYXJkX2lvYWRkcikpOwotCQkJcmV0dXJuIC1FSU87Ci0JCX0KLQotCQlwY2NhcmRfaW9hZGRyID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDIpOwotCQlwcmlzbTJfZG9yZXNldCA9IDA7Ci0KLQkJV0xBTl9MT0dfSU5GTygiTkRDIE5DUDEzMCB3aXRoIFRNQzcxNihBU0lDKSBQQ0kgaW50ZXJmYWNlIGRldmljZSBmb3VuZCBhdCBpbzoweCV4LCBpcnE6JWRcbiIsIHBjY2FyZF9pb2FkZHIsIHBkZXYtPmlycSk7Ci0JCWdvdG8gaW5pdDsKLQl9Ci0KLQkvKiBDb2xsZWN0IHRoZSByZXNvdXJjZSByZXF1aXJlbWVudHMgKi8KLQlwY2NhcmRfYXR0cl9tZW0gPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMik7Ci0JcGNjYXJkX2F0dHJfbGVuID0gcGNpX3Jlc291cmNlX2xlbihwZGV2LCAyKTsKLSAgICAgICAgaWYgKHBjY2FyZF9hdHRyX2xlbiA8IFBMWF9NSU5fQVRUUl9MRU4pCi0JCXJldHVybiAtRUlPOwotCi0JcGNjYXJkX2lvYWRkciA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAzKTsKLQotCS8qIGJqb2VybjogV2UgbmVlZCB0byB0ZWxsIHRoZSBjYXJkIHRvIGVuYWJsZSBpbnRlcnJ1cHRzLCBpbgotCSAqIGNhc2UgdGhlIHNlcmlhbCBlcHJvbSBkaWRuJ3QgZG8gdGhpcyBhbHJlYWR5LiBTZWUgdGhlCi0JICogUExYOTA1MiBkYXRhIGJvb2ssIHA4LTEgYW5kIDgtMjQgZm9yIHJlZmVyZW5jZS4KLQkgKiBbTVNNXTogVGhpcyBiaXQgb2YgY29kZSBjYW1lIGZyb20gdGhlIG9yaW5vY29fY3MgZHJpdmVyLgotCSAqLwotCXBseF9hZGRyID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDEpOwotCi0JcmVnaWMgPSAwOwotCXJlZ2ljID0gaW5sKHBseF9hZGRyK1BMWF9JTlRDU1IpOwotCWlmKHJlZ2ljICYgUExYX0lOVENTUl9JTlRFTikgewotCQlXTEFOX0xPR19ERUJVRygxLAotCQkJIiVzOiBMb2NhbCBJbnRlcnJ1cHQgYWxyZWFkeSBlbmFibGVkXG4iLCBkZXZfaW5mbyk7Ci0JfSBlbHNlIHsKLQkJcmVnaWMgfD0gUExYX0lOVENTUl9JTlRFTjsKLQkJb3V0bChyZWdpYywgcGx4X2FkZHIrUExYX0lOVENTUik7Ci0JCXJlZ2ljID0gaW5sKHBseF9hZGRyK1BMWF9JTlRDU1IpOwotCQlpZighKHJlZ2ljICYgUExYX0lOVENTUl9JTlRFTikpIHsKLQkJCVdMQU5fTE9HX0VSUk9SKAotCQkJCSIlczogQ291bGRuJ3QgZW5hYmxlIExvY2FsIEludGVycnVwdHNcbiIsCi0JCQkJZGV2X2luZm8pOwotCQkJcmV0dXJuIC1FSU87Ci0JCX0KLQl9Ci0KLQkvKiBUaGVzZSBhc3NpZ25tZW50cyBhcmUgaGVyZSBpbiBjYXNlIG9mIGZ1dHVyZSBtYXBwaW5ncyBmb3IKLQkgKiBpbyBzcGFjZSBhbmQgaXJxIHRoYXQgbWlnaHQgYmUgc2ltaWxhciB0byBpb3JlbWFwCi0JICovCi0gICAgICAgIGlmICghcmVxdWVzdF9tZW1fcmVnaW9uKHBjY2FyZF9hdHRyX21lbSwgcGNpX3Jlc291cmNlX2xlbihwZGV2LCAyKSwgIlByaXNtMiIpKSB7Ci0JCVdMQU5fTE9HX0VSUk9SKCIlczogQ291bGRuJ3QgcmVzZXJ2ZSBQQ0kgbWVtb3J5IHJlZ2lvblxuIiwgZGV2X2luZm8pOwotCQlyZXR1cm4gLUVJTzsKLSAgICAgICAgfQotCi0JYXR0cl9tZW0gPSBpb3JlbWFwKHBjY2FyZF9hdHRyX21lbSwgcGNjYXJkX2F0dHJfbGVuKTsKLQotCVdMQU5fTE9HX0lORk8oIkEgUExYIFBDSS9QQ01DSUEgaW50ZXJmYWNlIGRldmljZSBmb3VuZCwgIgotCQkicGh5bWVtOjB4JWxseCwgcGh5aW89MHgleCwgaXJxOiVkLCAiCi0JCSJtZW06IDB4JWx4XG4iLAotCQkodW5zaWduZWQgbG9uZyBsb25nKXBjY2FyZF9hdHRyX21lbSwgcGNjYXJkX2lvYWRkciwgcGRldi0+aXJxLAotCQkodW5zaWduZWQgbG9uZylhdHRyX21lbSk7Ci0KLQkvKiBWZXJpZnkgd2hldGhlciBQQyBjYXJkIGlzIHByZXNlbnQuCi0JICogW01TTV0gVGhpcyBuZWVkcyBpbXByb3ZlbWVudCwgdGhlIHJpZ2h0IHRoaW5nIHRvIGRvIGlzCi0JICogcHJvYmFibHkgdG8gd2FsayB0aGUgQ0lTIGxvb2tpbmcgZm9yIHRoZSB2ZW5kb3IgYW5kIHByb2R1Y3QKLQkgKiBJRHMuICBJdCB3b3VsZCBiZSBuaWNlIGlmIHRoaXMgY291bGQgYmUgdGllZCBpbiB3aXRoIHRoZQotCSAqIGV0Yy9wY21jaWEvd2xhbi1uZy5jb25mIGZpbGUuICBBbnkgdm9sdW50ZWVycz8gIDstKQotCSAqLwotCWlmICgKLQlyZWFkYihhdHRyX21lbSArIDApICE9IDB4MDEgfHwgcmVhZGIoYXR0cl9tZW0gKyAyKSAhPSAweDAzIHx8Ci0JcmVhZGIoYXR0cl9tZW0gKyA0KSAhPSAweDAwIHx8IHJlYWRiKGF0dHJfbWVtICsgNikgIT0gMHgwMCB8fAotCXJlYWRiKGF0dHJfbWVtICsgOCkgIT0gMHhGRiB8fCByZWFkYihhdHRyX21lbSArIDEwKSAhPSAweDE3IHx8Ci0JcmVhZGIoYXR0cl9tZW0gKyAxMikgIT0gMHgwNCB8fCByZWFkYihhdHRyX21lbSArIDE0KSAhPSAweDY3KSB7Ci0JCVdMQU5fTE9HX0VSUk9SKCJQcmlzbTIgUEMgY2FyZCBDSVMgaXMgaW52YWxpZC5cbiIpOwotCQlyZXR1cm4gLUVJTzsKLSAgICAgICAgfQotICAgICAgICBXTEFOX0xPR19JTkZPKCJBIFBDTUNJQSBXTEFOIGFkYXB0ZXIgd2FzIGZvdW5kLlxuIik7Ci0KLSAgICAgICAgLyogV3JpdGUgQ09SIHRvIGVuYWJsZSBQQyBjYXJkICovCi0Jd3JpdGViKENPUl9WQUxVRSwgYXR0cl9tZW0gKyBDT1JfT0ZGU0VUKTsKLQlyZWcgPSByZWFkYihhdHRyX21lbSArIENPUl9PRkZTRVQpOwotCi0gaW5pdDoKLQotCS8qCi0JICogTm93IGRvIGV2ZXJ5dGhpbmcgdGhlIHNhbWUgYXMgYSBQQ0kgZGV2aWNlCi0JICogW01TTV0gVE9ETzogV2UgY291bGQgcHJvYmFibHkgZmFjdG9yIHRoaXMgb3V0IG9mIHBjbWNpYS9wY2kvcGx4Ci0JICogYW5kIHBlcmhhcHMgdXNiLiAgUGVyaGFwcyBhIHRhc2sgZm9yIGFub3RoZXIgZGF5Li4uLi4uLgotCSAqLwotCi0JaWYgKCh3bGFuZGV2ID0gY3JlYXRlX3dsYW4oKSkgPT0gTlVMTCkgewotCQlXTEFOX0xPR19FUlJPUigiJXM6IE1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmUuXG4iLCBkZXZfaW5mbyk7Ci0JCXJlc3VsdCA9IC1FSU87Ci0JCWdvdG8gZmFpbGVkOwotCX0KLQotCWh3ID0gd2xhbmRldi0+cHJpdjsKLQotCWlmICggd2xhbl9zZXR1cCh3bGFuZGV2KSAhPSAwICkgewotCQlXTEFOX0xPR19FUlJPUigiJXM6IHdsYW5fc2V0dXAoKSBmYWlsZWQuXG4iLCBkZXZfaW5mbyk7Ci0JCXJlc3VsdCA9IC1FSU87Ci0JCWdvdG8gZmFpbGVkOwotCX0KLQotCS8qIFNldHVwIG5ldGRldmljZSdzIGFiaWxpdHkgdG8gcmVwb3J0IHJlc291cmNlcwotCSAqIE5vdGU6IHRoZSBuZXRkZXZpY2Ugd2FzIGFsbG9jYXRlZCBieSB3bGFuX3NldHVwKCkKLQkgKi8KLSAgICAgICAgd2xhbmRldi0+bmV0ZGV2LT5pcnEgPSBwZGV2LT5pcnE7Ci0gICAgICAgIHdsYW5kZXYtPm5ldGRldi0+YmFzZV9hZGRyID0gcGNjYXJkX2lvYWRkcjsKLSAgICAgICAgd2xhbmRldi0+bmV0ZGV2LT5tZW1fc3RhcnQgPSAodW5zaWduZWQgbG9uZylhdHRyX21lbTsKLSAgICAgICAgd2xhbmRldi0+bmV0ZGV2LT5tZW1fZW5kID0gKHVuc2lnbmVkIGxvbmcpYXR0cl9tZW0gKyBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDApOwotCi0JLyogSW5pdGlhbGl6ZSB0aGUgaHcgZGF0YSAqLwotICAgICAgICBoZmEzODR4X2NyZWF0ZShodywgd2xhbmRldi0+bmV0ZGV2LT5pcnEsIHBjY2FyZF9pb2FkZHIsIGF0dHJfbWVtKTsKLQlody0+d2xhbmRldiA9IHdsYW5kZXY7Ci0KLQkvKiBSZWdpc3RlciB0aGUgd2xhbmRldiwgdGhpcyBnZXRzIHVzIGEgbmFtZSBhbmQgcmVnaXN0ZXJzIHRoZQotCSAqIGxpbnV4IG5ldGRldmljZS4KLQkgKi8KLQlTRVRfTU9EVUxFX09XTkVSKHdsYW5kZXYtPm5ldGRldik7Ci0jaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMCkpCi0gICAgICAgU0VUX05FVERFVl9ERVYod2xhbmRldi0+bmV0ZGV2LCAmKHBkZXYtPmRldikpOwotI2VuZGlmCi0gICAgICAgIGlmICggcmVnaXN0ZXJfd2xhbmRldih3bGFuZGV2KSAhPSAwICkgewotCQlXTEFOX0xPR19FUlJPUigiJXM6IHJlZ2lzdGVyX3dsYW5kZXYoKSBmYWlsZWQuXG4iLCBkZXZfaW5mbyk7Ci0JCXJlc3VsdCA9IC1FSU87Ci0JCWdvdG8gZmFpbGVkOwotICAgICAgICB9Ci0KLSNpZiAwCi0JLyogVE9ETzogTW92ZSB0aGlzIGFuZCBhbiBpcnEgdGVzdCBpbnRvIGFuIGhmYTM4NHhfdGVzdGlmKCkgcm91dGluZS4KLQkgKi8KLQlvdXR3KFBSSVNNMlNUQV9NQUdJQywgSEZBMzg0eF9TV1NVUFBPUlQod2xhbmRldi0+bmV0ZGV2LT5iYXNlX2FkZHIpKTsKLQlyZWc9aW53KCBIRkEzODR4X1NXU1VQUE9SVCh3bGFuZGV2LT5uZXRkZXYtPmJhc2VfYWRkcikpOwotCWlmICggcmVnICE9IFBSSVNNMlNUQV9NQUdJQyApIHsKLQkJV0xBTl9MT0dfRVJST1IoIk1BQyByZWdpc3RlciBhY2Nlc3MgdGVzdCBmYWlsZWQhXG4iKTsKLSAJCXJlc3VsdCA9IC1FSU87Ci0JCWdvdG8gZmFpbGVkOwotCX0KLSNlbmRpZgotCi0JLyogRG8gYSBjaGlwLWxldmVsIHJlc2V0IG9uIHRoZSBNQUMgKi8KLQlpZiAocHJpc20yX2RvcmVzZXQpIHsKLQkJcmVzdWx0ID0gaGZhMzg0eF9jb3JlcmVzZXQoaHcsCi0JCQkJcHJpc20yX3Jlc2V0X2hvbGR0aW1lLAotCQkJCXByaXNtMl9yZXNldF9zZXR0bGV0aW1lLCAwKTsKLQkJaWYgKHJlc3VsdCAhPSAwKSB7Ci0JCQl1bnJlZ2lzdGVyX3dsYW5kZXYod2xhbmRldik7Ci0JCQloZmEzODR4X2Rlc3Ryb3koaHcpOwotCQkJV0xBTl9MT0dfRVJST1IoCi0JCQkJIiVzOiBoZmEzODR4X2NvcmVyZXNldCgpIGZhaWxlZC5cbiIsCi0JCQkJZGV2X2luZm8pOwotCQkJcmVzdWx0ID0gLUVJTzsKLQkJCWdvdG8gZmFpbGVkOwotCQl9Ci0JfQotCi0JcGNpX3NldF9kcnZkYXRhKHBkZXYsIHdsYW5kZXYpOwotCi0JLyogU2hvdWxkbid0IGFjdHVhbGx5IGhvb2sgdXAgdGhlIElSUSB1bnRpbCB3ZQotCSAqIF9rbm93XyB0aGluZ3MgYXJlIGFscmlnaHQuICBBIHRlc3Qgcm91dGluZSB3b3VsZCBoZWxwLgotCSAqLwotICAgICAgIAlyZXF1ZXN0X2lycSh3bGFuZGV2LT5uZXRkZXYtPmlycSwgaGZhMzg0eF9pbnRlcnJ1cHQsCi0JCVNBX1NISVJRLCB3bGFuZGV2LT5uYW1lLCB3bGFuZGV2KTsKLQotCXdsYW5kZXYtPm1zZHN0YXRlID0gV0xBTl9NU0RfSFdQUkVTRU5UOwotCi0JcmVzdWx0ID0gMDsKLQotCWdvdG8gZG9uZTsKLQotIGZhaWxlZDoKLQotCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKLQlpZiAod2xhbmRldikJa2ZyZWUod2xhbmRldik7Ci0JaWYgKGh3KQkJa2ZyZWUoaHcpOwotICAgICAgICBpZiAoYXR0cl9tZW0pICAgICAgICBpb3VubWFwKGF0dHJfbWVtKTsKLQlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOwotICAgICAgICBwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7Ci0KLSBkb25lOgotCURCRkVYSVQ7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZGV2ZXhpdCBwcmlzbTJzdGFfcmVtb3ZlX3BseChzdHJ1Y3QgcGNpX2RldiAqcGRldikKLXsKLSAgICAgICAJd2xhbmRldmljZV90CQkqd2xhbmRldjsKLQloZmEzODR4X3QgICAgICAgICAgICAgICAqaHc7Ci0KLQl3bGFuZGV2ID0gKHdsYW5kZXZpY2VfdCAqKSBwY2lfZ2V0X2RydmRhdGEocGRldik7Ci0JaHcgPSB3bGFuZGV2LT5wcml2OwotCi0JcDgwMjExbmV0ZGV2X2h3cmVtb3ZlZCh3bGFuZGV2KTsKLQotCS8qIHJlc2V0IGhhcmR3YXJlICovCi0JcHJpc20yc3RhX2lmc3RhdGUod2xhbmRldiwgUDgwMjExRU5VTV9pZnN0YXRlX2Rpc2FibGUpOwotCi0gICAgICAgIGlmIChwZGV2LT5pcnEpCi0JCWZyZWVfaXJxKHBkZXYtPmlycSwgd2xhbmRldik7Ci0KLQl1bnJlZ2lzdGVyX3dsYW5kZXYod2xhbmRldik7Ci0KLQkvKiBmcmVlIGxvY2FsIHN0dWZmICovCi0JaWYgKGh3KSB7Ci0JCWhmYTM4NHhfZGVzdHJveShodyk7Ci0JCWtmcmVlKGh3KTsKLQl9Ci0KLQlpb3VubWFwKCh2b2lkIF9faW9tZW0gKil3bGFuZGV2LT5uZXRkZXYtPm1lbV9zdGFydCk7Ci0Jd2xhbl91bnNldHVwKHdsYW5kZXYpOwotCi0JcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKLSAgICAgICAgcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOwotCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKLQotCWtmcmVlKHdsYW5kZXYpOwotfQotCi1zdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgcGx4X2lkX3RibFtdID0gewotCXsKLQkJUENJVkVORE9SX0VVTUlUQ09NLCBQQ0lERVZJQ0VfV0wxMTAwMCwKLQkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwKLQkJMCwgMCwKLQkJLyogRHJpdmVyIGRhdGEsIHdlIGp1c3QgcHV0IHRoZSBuYW1lIGhlcmUgKi8KLQkJKHVuc2lnbmVkIGxvbmcpIkV1bWl0Y29tIFdMMTEwMDAgUENJKFBMWCkgY2FyZCIKLQl9LAotCXsKLQkJUENJVkVORE9SX0dMT0JBTFNVTiwgUENJREVWSUNFX0dMMjQxMTBQLAotCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELAotCQkwLCAwLAotCQkvKiBEcml2ZXIgZGF0YSwgd2UganVzdCBwdXQgdGhlIG5hbWUgaGVyZSAqLwotCQkodW5zaWduZWQgbG9uZykiR2xvYmFsIFN1biBUZWNoIEdMMjQxMTBQIFBDSShQTFgpIGNhcmQiCi0JfSwKLQl7Ci0JCVBDSVZFTkRPUl9HTE9CQUxTVU4sIFBDSURFVklDRV9HTDI0MTEwUF9BTFQsCi0JCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsCi0JCTAsIDAsCi0JCS8qIERyaXZlciBkYXRhLCB3ZSBqdXN0IHB1dCB0aGUgbmFtZSBoZXJlICovCi0JCSh1bnNpZ25lZCBsb25nKSJHbG9iYWwgU3VuIFRlY2ggR0wyNDExMFAgUENJKFBMWCkgY2FyZCIKLQl9LAotCXsKLQkJUENJVkVORE9SX05FVEdFQVIsIFBDSURFVklDRV9NQTMwMSwKLQkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwKLQkJMCwgMCwKLQkJLyogRHJpdmVyIGRhdGEsIHdlIGp1c3QgcHV0IHRoZSBuYW1lIGhlcmUgKi8KLQkJKHVuc2lnbmVkIGxvbmcpIkdsb2JhbCBTdW4gVGVjaCBHTDI0MTEwUCBQQ0koUExYKSBjYXJkIgotCX0sCi0JewotCQlQQ0lWRU5ET1JfVVNST0JPVElDUywgUENJREVWSUNFX1VTUjI0MTAsCi0JCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsCi0JCTAsIDAsCi0JCS8qIERyaXZlciBkYXRhLCB3ZSBqdXN0IHB1dCB0aGUgbmFtZSBoZXJlICovCi0JCSh1bnNpZ25lZCBsb25nKSJVUyBSb2JvdGljcyBVU1IyNDEwIFBDSShQTFgpIGNhcmQiCi0JfSwKLQl7Ci0JCVBDSVZFTkRPUl9MaW5rc3lzLCBQQ0lERVZJQ0VfV3BjMTFXZHQxMSwKLQkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwKLQkJMCwgMCwKLQkJLyogRHJpdmVyIGRhdGEsIHdlIGp1c3QgcHV0IHRoZSBuYW1lIGhlcmUgKi8KLQkJKHVuc2lnbmVkIGxvbmcpIkxpbmtzeXMgV1BDMTEgd2l0aCBXRFQxMSBQQ0koUExYKSBhZGFwdGVyIgotCX0sCi0JewotCSAgICAgICAgUENJVkVORE9SX05EQywgUENJREVWSUNFX05DUDEzMF9QTFgsCi0JCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsCi0JCTAsIDAsCi0JCS8qIERyaXZlciBkYXRhLCB3ZSBqdXN0IHB1dCB0aGUgbmFtZSBoZXJlICovCi0JCSh1bnNpZ25lZCBsb25nKSJOREMgTmV0Ymxhc3RlciBJSSBQQ0koUExYKSIKLQl9LAotCXsKLQkgICAgICAgIFBDSVZFTkRPUl9OREMsIFBDSURFVklDRV9OQ1AxMzBfQVNJQywKLQkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwKLQkJMCwgMCwKLQkJLyogRHJpdmVyIGRhdGEsIHdlIGp1c3QgcHV0IHRoZSBuYW1lIGhlcmUgKi8KLQkJKHVuc2lnbmVkIGxvbmcpIk5EQyBOZXRibGFzdGVyIElJIFBDSShUTUM3MTYwKSIKLQl9LAotCXsKLQkJUENJVkVORE9SXzNDT00sIFBDSURFVklDRV9BSVJDT05ORUNULAotCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELAotCQkwLCAwLAotCQkvKiBEcml2ZXIgZGF0YSwgd2UganVzdCBwdXQgdGhlIG5hbWUgaGVyZSAqLwotCQkodW5zaWduZWQgbG9uZykiM0NvbSBBaXJDb25uZWN0IFBDSSA4MDIuMTFiIDExTWIvcyBXTEFOIENvbnRyb2xsZXIiCi0JfSwKLQl7Ci0JCTAsIDAsIDAsIDAsIDAsIDAsIDAKLQl9Ci19OwotCi1NT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgcGx4X2lkX3RibCk7Ci0KLS8qIEZ1bmN0aW9uIGRlY2xhcmVkIGhlcmUgYmVjYXVzZSBvZiBwdHIgcmVmZXJlbmNlIGJlbG93ICovCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBwcmlzbTJzdGFfcHJvYmVfcGx4KHN0cnVjdCBwY2lfZGV2ICpwZGV2LAotCQkJCQkgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKik7Ci1zdGF0aWMgdm9pZCBfX2RldmV4aXQgcHJpc20yc3RhX3JlbW92ZV9wbHgoc3RydWN0IHBjaV9kZXYgKnBkZXYpOwotCi1zdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgcHJpc20yX3BseF9kcnZfaWQgPSB7Ci0gICAgICAgIC5uYW1lID0gInByaXNtMl9wbHgiLAotICAgICAgICAuaWRfdGFibGUgPSBwbHhfaWRfdGJsLAotICAgICAgICAucHJvYmUgPSBwcmlzbTJzdGFfcHJvYmVfcGx4LAotICAgICAgICAucmVtb3ZlID0gcHJpc20yc3RhX3JlbW92ZV9wbHgsCi0jaWZkZWYgQ09ORklHX1BNCi0gICAgICAgIC5zdXNwZW5kID0gcHJpc20yc3RhX3N1c3BlbmRfcGNpLAotICAgICAgICAucmVzdW1lID0gcHJpc20yc3RhX3Jlc3VtZV9wY2ksCi0jZW5kaWYKLX07Ci0KLSNpZmRlZiBNT0RVTEUKLQotc3RhdGljIGludCBfX2luaXQgcHJpc20ycGx4X2luaXQodm9pZCkKLXsKLSAgICAgICAgV0xBTl9MT0dfTk9USUNFKCIlcyBMb2FkZWRcbiIsIHZlcnNpb24pOwotCXJldHVybiBwY2lfbW9kdWxlX2luaXQoJnByaXNtMl9wbHhfZHJ2X2lkKTsKLX07Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBwcmlzbTJwbHhfY2xlYW51cCh2b2lkKQotewotCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmcHJpc20yX3BseF9kcnZfaWQpOwotfTsKLQotbW9kdWxlX2luaXQocHJpc20ycGx4X2luaXQpOwotbW9kdWxlX2V4aXQocHJpc20ycGx4X2NsZWFudXApOwotCi0jZW5kaWYgLy8gTU9EVUxFCi0KLQotaW50IGhmYTM4NHhfY29yZXJlc2V0KGhmYTM4NHhfdCAqaHcsIGludCBob2xkdGltZSwgaW50IHNldHRsZXRpbWUsIGludCBnZW5lc2lzKQotewotCWludAkJcmVzdWx0ID0gMDsKLQotI2RlZmluZSBDT1JfT0ZGU0VUCTB4M2UwCS8qIENPUiBhdHRyaWJ1dGUgb2Zmc2V0IG9mIFByaXNtMiBQQyBjYXJkICovCi0jZGVmaW5lIENPUl9WQUxVRQkweDQxCS8qIEVuYWJsZSBQQyBjYXJkIHdpdGggaXJxIGluIGxldmVsIHRyaWdnZXIgKi8KLQotI2RlZmluZSBIQ1JfT0ZGU0VUCTB4M2UyCS8qIEhDUiBhdHRyaWJ1dGUgb2Zmc2V0IG9mIFByaXNtMiBQQyBjYXJkICovCi0KLQlVSU5UOAkJY29yc2F2ZTsKLQlEQkZFTlRFUjsKLQotCVdMQU5fTE9HX0RFQlVHKDMsICJEb2luZyByZXNldCB2aWEgZGlyZWN0IENPUiBhY2Nlc3MuXG4iKTsKLQotCS8qIENvbGxlY3QgQ09SICovCi0JY29yc2F2ZSA9IHJlYWRiKGh3LT5tZW1iYXNlICsgQ09SX09GRlNFVCk7Ci0JLyogV3JpdGUgcmVzZXQgYml0IChCSVQ3KSAqLwotCXdyaXRlYihjb3JzYXZlIHwgQklUNywgaHctPm1lbWJhc2UgKyBDT1JfT0ZGU0VUKTsKLQkvKiBIb2xkIGZvciBob2xkdGltZSAqLwotCW1kZWxheShob2xkdGltZSk7Ci0KLQlpZiAoZ2VuZXNpcykgewotCQl3cml0ZWIoZ2VuZXNpcywgaHctPm1lbWJhc2UgKyBIQ1JfT0ZGU0VUKTsKLQkJLyogSG9sZCBmb3IgaG9sZHRpbWUgKi8KLQkJbWRlbGF5KGhvbGR0aW1lKTsKLQl9Ci0KLQkvKiBDbGVhciByZXNldCBiaXQgKi8KLQl3cml0ZWIoY29yc2F2ZSAmIH5CSVQ3LCBody0+bWVtYmFzZSArIENPUl9PRkZTRVQpOwotCS8qIFdhaXQgZm9yIHNldHRsZXRpbWUgKi8KLQltZGVsYXkoc2V0dGxldGltZSk7Ci0JLyogU2V0IG5vbi1yZXNldCBiaXRzIGJhY2sgd2hhdCB0aGV5IHdlcmUgKi8KLQl3cml0ZWIoY29yc2F2ZSwgaHctPm1lbWJhc2UgKyBDT1JfT0ZGU0VUKTsKLQlEQkZFWElUOwotCXJldHVybiByZXN1bHQ7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wcmlzbTJfdXNiLmMgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wcmlzbTJfdXNiLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0NWJlMjMuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcHJpc20yX3VzYi5jCisrKyAvZGV2L251bGwKQEAgLTEsMzYxICswLDAgQEAKLSNkZWZpbmUgV0xBTl9IT1NUSUYgV0xBTl9VU0IKLSNpbmNsdWRlICJoZmEzODR4X3VzYi5jIgotI2luY2x1ZGUgInByaXNtMm1nbXQuYyIKLSNpbmNsdWRlICJwcmlzbTJtaWIuYyIKLSNpbmNsdWRlICJwcmlzbTJzdGEuYyIKLQotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDQsMCkpCi0jZXJyb3IgInByaXNtMl91c2IgcmVxdWlyZXMgYXQgbGVhc3QgYSAyLjQueCBrZXJuZWwhIgotI2VuZGlmCi0KLSNkZWZpbmUgUFJJU01fVVNCX0RFVklDRSh2aWQsIHBpZCwgbmFtZSkgXAotICAgICAgICAgICBVU0JfREVWSUNFKHZpZCwgcGlkKSwgIFwKLSAgICAgICAgICAgLmRyaXZlcl9pbmZvID0gKHVuc2lnbmVkIGxvbmcpIG5hbWUKLQotc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2lkIHVzYl9wcmlzbV90YmxbXSA9IHsKLQl7UFJJU01fVVNCX0RFVklDRSgweDA0YmIsIDB4MDkyMiwgIklPRGF0YSBBaXJQb3J0IFdOLUIxMS9VU0JTIil9LAotCXtQUklTTV9VU0JfREVWSUNFKDB4MDdhYSwgMHgwMDEyLCAiQ29yZWdhIFdpcmVsZXNzIExBTiBVU0IgU3RpY2stMTEiKX0sCi0Je1BSSVNNX1VTQl9ERVZJQ0UoMHgwOWFhLCAweDM2NDIsICJQcmlzbTIueCAxMU1icHMgV0xBTiBVU0IgQWRhcHRlciIpfSwKLQl7UFJJU01fVVNCX0RFVklDRSgweDE2NjgsIDB4MDQwOCwgIkFjdGlvbnRlYyBQcmlzbTIuNSAxMU1icHMgV0xBTiBVU0IgQWRhcHRlciIpfSwKLQl7UFJJU01fVVNCX0RFVklDRSgweDE2NjgsIDB4MDQyMSwgIkFjdGlvbnRlYyBQcmlzbTIuNSAxMU1icHMgV0xBTiBVU0IgQWRhcHRlciIpfSwKLQl7UFJJU01fVVNCX0RFVklDRSgweDE5MTUsIDB4MjIzNiwgIkxpbmtzeXMgV1VTQjExdjMuMCAxMU1icHMgV0xBTiBVU0IgQWRhcHRlciIpfSwKLQl7UFJJU01fVVNCX0RFVklDRSgweDA2NmIsIDB4MjIxMiwgIkxpbmtzeXMgV1VTQjExdjIuNSAxMU1icHMgV0xBTiBVU0IgQWRhcHRlciIpfSwKLQl7UFJJU01fVVNCX0RFVklDRSgweDA2NmIsIDB4MjIxMywgIkxpbmtzeXMgV1VTQjEydjEuMSAxMU1icHMgV0xBTiBVU0IgQWRhcHRlciIpfSwKLQl7UFJJU01fVVNCX0RFVklDRSgweDA2N2MsIDB4MTAyMiwgIlNpZW1lbnMgU3BlZWRTdHJlYW0gMTAyMiAxMU1icHMgV0xBTiBVU0IgQWRhcHRlciIpfSwKLQl7UFJJU01fVVNCX0RFVklDRSgweDA0OWYsIDB4MDAzMywgIkNvbXBhcS9JbnRlbCBXMTAwIFBSTy9XaXJlbGVzcyAxMU1icHMgbXVsdGlwb3J0IFdMQU4gQWRhcHRlciIpfSwKLQl7UFJJU01fVVNCX0RFVklDRSgweDA0MTEsIDB4MDAxNiwgIk1lbGNvIFdMSS1VU0ItUzExIDExTWJwcyBXTEFOIEFkYXB0ZXIiKX0sCi0Je1BSSVNNX1VTQl9ERVZJQ0UoMHgwOGRlLCAweDdhMDEsICJQUklTTTI1IElFRUUgODAyLjExIE1pbmkgVVNCIEFkYXB0ZXIiKX0sCi0Je1BSSVNNX1VTQl9ERVZJQ0UoMHg4MDg2LCAweDExMTEsICJJbnRlbCBQUk8vV2lyZWxlc3MgMjAxMUIgTEFOIFVTQiBBZGFwdGVyIil9LAotCXtQUklTTV9VU0JfREVWSUNFKDB4MGQ4ZSwgMHg3YTAxLCAiUFJJU00yNSBJRUVFIDgwMi4xMSBNaW5pIFVTQiBBZGFwdGVyIil9LAotCXtQUklTTV9VU0JfREVWSUNFKDB4MDQ1ZSwgMHgwMDZlLCAiTWljcm9zb2Z0IE1ONTEwIFdpcmVsZXNzIFVTQiBBZGFwdGVyIil9LAotCXtQUklTTV9VU0JfREVWSUNFKDB4MDk2NywgMHgwMjA0LCAiQWNlciBXYXJwbGluayBVU0IgQWRhcHRlciIpfSwKLQl7UFJJU01fVVNCX0RFVklDRSgweDBjZGUsIDB4MDAwMiwgIlotQ29tIDcyNS83MjYgUHJpc20yLjUgVVNCL1VTQiBJbnRlZ3JhdGVkIil9LAotCXtQUklTTV9VU0JfREVWSUNFKDB4MGNkZSwgMHgwMDA1LCAiWi1Db20gWGw3MzUgV2lyZWxlc3MgODAyLjExYiBVU0IgQWRhcHRlciIpfSwKLQl7UFJJU01fVVNCX0RFVklDRSgweDQxM2MsIDB4ODEwMCwgIkRlbGwgVHJ1ZU1vYmlsZSAxMTgwIFdpcmVsZXNzIFVTQiBBZGFwdGVyIil9LAotCXtQUklTTV9VU0JfREVWSUNFKDB4MGIzYiwgMHgxNjAxLCAiQUxMTkVUIDAxOTMgMTFNYnBzIFdMQU4gVVNCIEFkYXB0ZXIiKX0sCi0Je1BSSVNNX1VTQl9ERVZJQ0UoMHgwYjNiLCAweDE2MDIsICJaeVhFTCBaeUFJUiBCMjAwIFdpcmVsZXNzIFVTQiBBZGFwdGVyIil9LAotCXtQUklTTV9VU0JfREVWSUNFKDB4MGJhZiwgMHgwMGViLCAiVVNSb2JvdGljcyBVU1IxMTIwIFdpcmVsZXNzIFVTQiBBZGFwdGVyIil9LAotCXtQUklTTV9VU0JfREVWSUNFKDB4MDQxMSwgMHgwMDI3LCAiTWVsY28gV0xJLVVTQi1LUzExRyAxMU1icHMgV0xBTiBBZGFwdGVyIil9LAotICAgICAgICB7UFJJU01fVVNCX0RFVklDRSgweDA0ZjEsIDB4MzAwOSwgIkpWQyBNUC1YUDcyNTAgQnVpbHRpbiBVU0IgV0xBTiBBZGFwdGVyIil9LAotCXtQUklTTV9VU0JfREVWSUNFKDB4MDg0NiwgMHg0MTEwLCAiTmV0R2VhciBNQTExMSIpfSwKLSAgICAgICAge1BSSVNNX1VTQl9ERVZJQ0UoMHgwM2YzLCAweDAwMjAsICJBZGFwdGVjIEFXTi04MDIwIFVTQiBXTEFOIEFkYXB0ZXIiKX0sCi0vLwl7UFJJU01fVVNCX0RFVklDRSgweDBhY2UsIDB4MTIwMSwgIlp5REFTIFpEMTIwMSBXaXJlbGVzcyBVU0IgQWRhcHRlciIpfSwKLQl7UFJJU01fVVNCX0RFVklDRSgweDI4MjEsIDB4MzMwMCwgIkFTVVMtV0wxNDAgV2lyZWxlc3MgVVNCIEFkYXB0ZXIiKX0sCi0Je1BSSVNNX1VTQl9ERVZJQ0UoMHgyMDAxLCAweDM3MDAsICJEV0wtMTIyIFdpcmVsZXNzIFVTQiBBZGFwdGVyIil9LAotCXtQUklTTV9VU0JfREVWSUNFKDB4MjAwMSwgMHgzNzAyLCAiRFdMLTEyMCBSZXYgRiBXaXJlbGVzcyBVU0IgQWRhcHRlciIpfSwKLQl7UFJJU01fVVNCX0RFVklDRSgweDUwYzIsIDB4NDAxMywgIkF2ZXJhdGVjIFVTQiBXTEFOIEFkYXB0ZXIiKX0sCi0Je1BSSVNNX1VTQl9ERVZJQ0UoMHgyYzAyLCAweDE0ZWEsICJQbGFuZXggR1ctVVMxMUggV0xBTiBVU0IgQWRhcHRlciIpfSwKLQl7UFJJU01fVVNCX0RFVklDRSgweDEyNGEsIDB4MTY4YiwgIkFpcnZhc3QgUFJJU00zIFdMQU4gVVNCIEFkYXB0ZXIiKX0sCi0Je1BSSVNNX1VTQl9ERVZJQ0UoMHgwODNhLCAweDM1MDMsICJULVNpbnVzIDExMSBVU0IgV0xBTiBBZGFwdGVyIil9LAotCXtQUklTTV9VU0JfREVWSUNFKDB4MjgyMSwgMHgzMzAwLCAiSGF3a2luZyBIaWdoREIgVVNCIEFkYXB0ZXIiKX0sCi0Je1BSSVNNX1VTQl9ERVZJQ0UoMHgwNDExLCAweDAwNDQsICJNZWxjbyBXTEktVVNCLUtCMTEgMTFNYnBzIFdMQU4gQWRhcHRlciIpfSwKLQl7UFJJU01fVVNCX0RFVklDRSgweDE2NjgsIDB4NjEwNiwgIlJPUEVYIEZyZWVMYW4gODAyLjExYiBVU0IgQWRhcHRlciIpfSwKLQl7UFJJU01fVVNCX0RFVklDRSgweDEyNGEsIDB4NDAxNywgIlBoZWVuZXQgV0wtNTAzSUEgODAyLjExYiBVU0IgQWRhcHRlciIpfSwKLQl7UFJJU01fVVNCX0RFVklDRSgweDBiYjIsIDB4MDMwMiwgIkFtYml0IE1pY3Jvc3lzdGVtcyBDb3JwLiIpfSwKLQl7UFJJU01fVVNCX0RFVklDRSgweDkwMTYsIDB4MTgyZCwgIlNpdGVjb20gV0wtMDIyIDgwMi4xMWIgVVNCIEFkYXB0ZXIiKX0sCi0Je1BSSVNNX1VTQl9ERVZJQ0UoMHgwNTQzLCAweDBmMDEsICJWaWV3U29uaWMgQWlyc3luYyBVU0IgQWRhcHRlciAxMU1icHMgKFByaXNtMi41KSIpfSwKLQl7IC8qIHRlcm1pbmF0b3IgKi8gfQotfTsKLQotTU9EVUxFX0RFVklDRV9UQUJMRSh1c2IsIHVzYl9wcmlzbV90YmwpOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogcHJpc20yc3RhX3Byb2JlX3VzYgotKgotKiBQcm9iZSByb3V0aW5lIGNhbGxlZCBieSB0aGUgVVNCIHN1YnN5c3RlbS4KLSoKLSogQXJndW1lbnRzOgotKglkZXYJCXB0ciB0byB0aGUgdXNiX2RldmljZSBzdHJ1Y3QKLSoJaWZudW0JCWludGVyZmFjZSBudW1iZXIgYmVpbmcgb2ZmZXJlZAotKgotKiBSZXR1cm5zOgotKglOVUxMCQktIHdlJ3JlIG5vdCBjbGFpbWluZyB0aGUgZGV2aWNlK2ludGVyZmFjZQotKglub24tTlVMTAktIHdlIGFyZSBjbGFpbWluZyB0aGUgZGV2aWNlK2ludGVyZmFjZSBhbmQKLSoJCQkgIHRoaXMgaXMgYSBwdHIgdG8gdGhlIGRhdGEgd2Ugd2FudCBiYWNrCi0qCQkJICB3aGVuIGRpc2Nvbm5lY3QgaXMgY2FsbGVkLgotKgotKiBTaWRlIGVmZmVjdHM6Ci0qCi0qIENhbGwgY29udGV4dDoKLSoJSSdtIG5vdCBzdXJlLCBhc3N1bWUgaXQncyBpbnRlcnJ1cHQuCi0qCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDApKQotc3RhdGljIHZvaWQgX19kZXZpbml0ICpwcmlzbTJzdGFfcHJvYmVfdXNiKAotCXN0cnVjdCB1c2JfZGV2aWNlICpkZXYsCi0JdW5zaWduZWQgaW50IGlmbnVtLAotCWNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKLSNlbHNlCi1zdGF0aWMgaW50IHByaXNtMnN0YV9wcm9iZV91c2IoCi0Jc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGVyZmFjZSwKLQljb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCi0jZW5kaWYKLXsKLQotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkpCi0Jc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGVyZmFjZTsKLSNlbHNlCi0Jc3RydWN0IHVzYl9kZXZpY2UgKmRldjsKLSNlbmRpZgotCi0Jd2xhbmRldmljZV90CSp3bGFuZGV2ID0gTlVMTDsKLQloZmEzODR4X3QJKmh3ID0gTlVMTDsKLQlpbnQgICAgICAgICAgICAgIHJlc3VsdCA9IDA7Ci0KLQlEQkZFTlRFUjsKLQotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkpCi0JaW50ZXJmYWNlID0gJmRldi0+YWN0Y29uZmlnLT5pbnRlcmZhY2VbaWZudW1dOwotI2Vsc2UKLQlkZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KGludGVyZmFjZSk7Ci0jZW5kaWYKLQotCi0JaWYgKCh3bGFuZGV2ID0gY3JlYXRlX3dsYW4oKSkgPT0gTlVMTCkgewotCQlXTEFOX0xPR19FUlJPUigiJXM6IE1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmUuXG4iLCBkZXZfaW5mbyk7Ci0JCXJlc3VsdCA9IC1FSU87Ci0JCWdvdG8gZmFpbGVkOwotCX0KLQlodyA9IHdsYW5kZXYtPnByaXY7Ci0KLQlpZiAoIHdsYW5fc2V0dXAod2xhbmRldikgIT0gMCApIHsKLQkJV0xBTl9MT0dfRVJST1IoIiVzOiB3bGFuX3NldHVwKCkgZmFpbGVkLlxuIiwgZGV2X2luZm8pOwotCQlyZXN1bHQgPSAtRUlPOwotCQlnb3RvIGZhaWxlZDsKLQl9Ci0KLQkvKiBJbml0aWFsaXplIHRoZSBodyBkYXRhICovCi0JaGZhMzg0eF9jcmVhdGUoaHcsIGRldik7Ci0JaHctPndsYW5kZXYgPSB3bGFuZGV2OwotCi0JLyogUmVnaXN0ZXIgdGhlIHdsYW5kZXYsIHRoaXMgZ2V0cyB1cyBhIG5hbWUgYW5kIHJlZ2lzdGVycyB0aGUKLQkgKiBsaW51eCBuZXRkZXZpY2UuCi0JICovCi0jaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMCkpCi0JU0VUX05FVERFVl9ERVYod2xhbmRldi0+bmV0ZGV2LCAmKGludGVyZmFjZS0+ZGV2KSk7Ci0jZW5kaWYKLSAgICAgICAgaWYgKCByZWdpc3Rlcl93bGFuZGV2KHdsYW5kZXYpICE9IDAgKSB7Ci0JCVdMQU5fTE9HX0VSUk9SKCIlczogcmVnaXN0ZXJfd2xhbmRldigpIGZhaWxlZC5cbiIsIGRldl9pbmZvKTsKLQkJcmVzdWx0ID0gLUVJTzsKLQkJZ290byBmYWlsZWQ7Ci0gICAgICAgIH0KLQotCS8qIERvIGEgY2hpcC1sZXZlbCByZXNldCBvbiB0aGUgTUFDICovCi0JaWYgKHByaXNtMl9kb3Jlc2V0KSB7Ci0JCXJlc3VsdCA9IGhmYTM4NHhfY29yZXJlc2V0KGh3LAotCQkJCXByaXNtMl9yZXNldF9ob2xkdGltZSwKLQkJCQlwcmlzbTJfcmVzZXRfc2V0dGxldGltZSwgMCk7Ci0JCWlmIChyZXN1bHQgIT0gMCkgewotCQkJdW5yZWdpc3Rlcl93bGFuZGV2KHdsYW5kZXYpOwotCQkJaGZhMzg0eF9kZXN0cm95KGh3KTsKLQkJCXJlc3VsdCA9IC1FSU87Ci0JCQlXTEFOX0xPR19FUlJPUigKLQkJCQkiJXM6IGhmYTM4NHhfY29yZXJlc2V0KCkgZmFpbGVkLlxuIiwKLQkJCQlkZXZfaW5mbyk7Ci0JCQlnb3RvIGZhaWxlZDsKLQkJfQotCX0KLQotI2lmbmRlZiBORVdfTU9EVUxFX0NPREUKLQl1c2JfaW5jX2Rldl91c2UoZGV2KTsKLSNlbmRpZgotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDE1KSkKLQl1c2JfZ2V0X2RldihkZXYpOwotI2VuZGlmCi0KLQl3bGFuZGV2LT5tc2RzdGF0ZSA9IFdMQU5fTVNEX0hXUFJFU0VOVDsKLQotCWdvdG8gZG9uZTsKLQotIGZhaWxlZDoKLQlpZiAod2xhbmRldikJa2ZyZWUod2xhbmRldik7Ci0JaWYgKGh3KQkJa2ZyZWUoaHcpOwotCXdsYW5kZXYgPSBOVUxMOwotCi0gZG9uZToKLQlEQkZFWElUOwotCi0jaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNSwwKSkKLQlyZXR1cm4gd2xhbmRldjsKLSNlbHNlCi0JdXNiX3NldF9pbnRmZGF0YShpbnRlcmZhY2UsIHdsYW5kZXYpOwotCXJldHVybiByZXN1bHQ7Ci0jZW5kaWYKLX0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogcHJpc20yc3RhX2Rpc2Nvbm5lY3RfdXNiCi0qCi0qIENhbGxlZCB3aGVuIGEgZGV2aWNlIHByZXZpb3VzbHkgY2xhaW1lZCBieSBwcm9iZSBpcyByZW1vdmVkCi0qIGZyb20gdGhlIFVTQi4KLSoKLSogQXJndW1lbnRzOgotKglkZXYJCXB0ciB0byB0aGUgdXNiX2RldmljZSBzdHJ1Y3QKLSoJcHRyCQlwdHIgcmV0dXJuZWQgYnkgcHJvYmUoKSB3aGVuIHRoZSBkZXZpY2UKLSogICAgICAgICAgICAgICAgICAgICAgIHdhcyBjbGFpbWVkLgotKgotKiBSZXR1cm5zOgotKglOb3RoaW5nCi0qCi0qIFNpZGUgZWZmZWN0czoKLSoKLSogQ2FsbCBjb250ZXh0OgotKglwcm9jZXNzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDApKQotc3RhdGljIHZvaWQgX19kZXZleGl0Ci1wcmlzbTJzdGFfZGlzY29ubmVjdF91c2Ioc3RydWN0IHVzYl9kZXZpY2UgKmRldiwgdm9pZCAqcHRyKQotI2Vsc2UKLXN0YXRpYyB2b2lkCi1wcmlzbTJzdGFfZGlzY29ubmVjdF91c2Ioc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGVyZmFjZSkKLSNlbmRpZgotewotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApKQotCXdsYW5kZXZpY2VfdAkJKndsYW5kZXY7Ci0jZWxzZQotCXdsYW5kZXZpY2VfdAkJKndsYW5kZXYgPSAod2xhbmRldmljZV90KilwdHI7Ci0jZW5kaWYKLQotICAgICAgICBEQkZFTlRFUjsKLQotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApKQotCXdsYW5kZXYgPSAod2xhbmRldmljZV90ICopIHVzYl9nZXRfaW50ZmRhdGEoaW50ZXJmYWNlKTsKLSNlbmRpZgotCi0JaWYgKCB3bGFuZGV2ICE9IE5VTEwgKSB7Ci0JCUxJU1RfSEVBRChjbGVhbmxpc3QpOwotCQlzdHJ1Y3QgbGlzdF9oZWFkCSplbnRyeTsKLQkJc3RydWN0IGxpc3RfaGVhZAkqdGVtcDsKLQkJdW5zaWduZWQgbG9uZwkJZmxhZ3M7Ci0KLQkJaGZhMzg0eF90CQkqaHcgPSB3bGFuZGV2LT5wcml2OwotCi0JCWlmICghaHcpCi0JCQlnb3RvIGV4aXQ7Ci0KLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmh3LT5jdGx4cS5sb2NrLCBmbGFncyk7Ci0KLQkJcDgwMjExbmV0ZGV2X2h3cmVtb3ZlZCh3bGFuZGV2KTsKLQkJbGlzdF9zcGxpY2VfaW5pdCgmaHctPmN0bHhxLnJlYXBhYmxlLCAmY2xlYW5saXN0KTsKLQkJbGlzdF9zcGxpY2VfaW5pdCgmaHctPmN0bHhxLmNvbXBsZXRpbmcsICZjbGVhbmxpc3QpOwotCQlsaXN0X3NwbGljZV9pbml0KCZody0+Y3RseHEucGVuZGluZywgJmNsZWFubGlzdCk7Ci0JCWxpc3Rfc3BsaWNlX2luaXQoJmh3LT5jdGx4cS5hY3RpdmUsICZjbGVhbmxpc3QpOwotCi0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmh3LT5jdGx4cS5sb2NrLCBmbGFncyk7Ci0KLQkJLyogVGhlcmUncyBubyBoYXJkd2FyZSB0byBzaHV0ZG93biwgYnV0IHRoZSBkcml2ZXIKLQkJICogbWlnaHQgaGF2ZSBzb21lIHRhc2tzIG9yIHRhc2tsZXRzIHRoYXQgbXVzdCBiZQotCQkgKiBzdG9wcGVkIGJlZm9yZSB3ZSBjYW4gdGVhciBldmVyeXRoaW5nIGRvd24uCi0JCSAqLwotCQlwcmlzbTJzdGFfaWZzdGF0ZSh3bGFuZGV2LCBQODAyMTFFTlVNX2lmc3RhdGVfZGlzYWJsZSk7Ci0KLQkJZGVsX3NpbmdsZXNob3RfdGltZXJfc3luYygmaHctPnRocm90dGxlKTsKLQkJZGVsX3NpbmdsZXNob3RfdGltZXJfc3luYygmaHctPnJlcXRpbWVyKTsKLQkJZGVsX3NpbmdsZXNob3RfdGltZXJfc3luYygmaHctPnJlc3B0aW1lcik7Ci0KLQkJLyogVW5saW5rIGFsbCB0aGUgVVJCcy4gVGhpcyAicmVtb3ZlcyB0aGUgd2hlZWxzIgotCQkgKiBmcm9tIHRoZSBlbnRpcmUgQ1RMWCBoYW5kbGluZyBtZWNoYW5pc20uCi0JCSAqLwotCQl1c2Jfa2lsbF91cmIoJmh3LT5yeF91cmIpOwotCQl1c2Jfa2lsbF91cmIoJmh3LT50eF91cmIpOwotCQl1c2Jfa2lsbF91cmIoJmh3LT5jdGx4X3VyYik7Ci0KLQkJdGFza2xldF9raWxsKCZody0+Y29tcGxldGlvbl9iaCk7Ci0JCXRhc2tsZXRfa2lsbCgmaHctPnJlYXBlcl9iaCk7Ci0KLQkJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKLQotCQkvKiBOb3cgd2UgY29tcGxldGUgYW55IG91dHN0YW5kaW5nIGNvbW1hbmRzCi0JCSAqIGFuZCB0ZWxsIGV2ZXJ5b25lIHdobyBpcyB3YWl0aW5nIGZvciB0aGVpcgotCQkgKiByZXNwb25zZXMgdGhhdCB3ZSBoYXZlIHNodXQgZG93bi4KLQkJICovCi0JCWxpc3RfZm9yX2VhY2goZW50cnksICZjbGVhbmxpc3QpIHsKLQkJCWhmYTM4NHhfdXNiY3RseF90CSpjdGx4OwotCi0JCQljdGx4ID0gbGlzdF9lbnRyeShlbnRyeSwgaGZhMzg0eF91c2JjdGx4X3QsIGxpc3QpOwotCQkJY29tcGxldGUoJmN0bHgtPmRvbmUpOwotCQl9Ci0KLQkJLyogR2l2ZSBhbnkgb3V0c3RhbmRpbmcgc3luY2hyb25vdXMgY29tbWFuZHMKLQkJICogYSBjaGFuY2UgdG8gY29tcGxldGUuIEFsbCB0aGV5IG5lZWQgdG8gZG8KLQkJICogaXMgIndha2UgdXAiLCBzbyB0aGF0J3MgZWFzeS4KLQkJICogKEknZCBsaWtlIGEgYmV0dGVyIHdheSB0byBkbyB0aGlzLCByZWFsbHkuKQotCQkgKi8KLQkJbXNsZWVwKDEwMCk7Ci0KLQkJLyogTm93IGRlbGV0ZSB0aGUgQ1RMWHMsIGJlY2F1c2Ugbm8tb25lIGVsc2UgY2FuIG5vdy4gKi8KLQkJbGlzdF9mb3JfZWFjaF9zYWZlKGVudHJ5LCB0ZW1wLCAmY2xlYW5saXN0KSB7Ci0JCQloZmEzODR4X3VzYmN0bHhfdCAqY3RseDsKLQotCQkJY3RseCA9IGxpc3RfZW50cnkoZW50cnksIGhmYTM4NHhfdXNiY3RseF90LCBsaXN0KTsKLQkJCWtmcmVlKGN0bHgpOwotCQl9Ci0KLQkJLyogVW5ob29rIHRoZSB3bGFuZGV2ICovCi0JCXVucmVnaXN0ZXJfd2xhbmRldih3bGFuZGV2KTsKLQkJd2xhbl91bnNldHVwKHdsYW5kZXYpOwotCi0jaWZuZGVmIE5FV19NT0RVTEVfQ09ERQotCQl1c2JfZGVjX2Rldl91c2UoaHctPnVzYik7Ci0jZW5kaWYKLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwxNSkpCi0JCXVzYl9wdXRfZGV2KGh3LT51c2IpOwotI2VuZGlmCi0KLQkJaGZhMzg0eF9kZXN0cm95KGh3KTsKLQkJa2ZyZWUoaHcpOwotCi0JCWtmcmVlKHdsYW5kZXYpOwotCX0KLQotIGV4aXQ6Ci0KLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNSwwKSkKLQl1c2Jfc2V0X2ludGZkYXRhKGludGVyZmFjZSwgTlVMTCk7Ci0jZW5kaWYKLQlEQkZFWElUOwotfQotCi0KLXN0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciBwcmlzbTJfdXNiX2RyaXZlciA9IHsKLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw0LDE5KSkgJiYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwxNikpCi0JLm93bmVyID0gVEhJU19NT0RVTEUsCi0jZW5kaWYKLQkubmFtZSA9ICJwcmlzbTJfdXNiIiwKLQkucHJvYmUgPSBwcmlzbTJzdGFfcHJvYmVfdXNiLAotCS5kaXNjb25uZWN0ID0gcHJpc20yc3RhX2Rpc2Nvbm5lY3RfdXNiLAotCS5pZF90YWJsZSA9IHVzYl9wcmlzbV90YmwsCi0JLyogZm9wcywgbWlub3I/ICovCi19OwotCi0jaWZkZWYgTU9EVUxFCi0KLXN0YXRpYyBpbnQgX19pbml0IHByaXNtMnVzYl9pbml0KHZvaWQpCi17Ci0gICAgICAgIERCRkVOVEVSOwotCi0gICAgICAgIFdMQU5fTE9HX05PVElDRSgiJXMgTG9hZGVkXG4iLCB2ZXJzaW9uKTsKLSAgICAgICAgV0xBTl9MT0dfTk9USUNFKCJkZXZfaW5mbyBpczogJXNcbiIsIGRldl9pbmZvKTsKLQotCS8qIFRoaXMgY2FsbCB3aWxsIHJlc3VsdCBpbiBjYWxscyB0byBwcmlzbTJzdGFfcHJvYmVfdXNiLiAqLwotCXJldHVybiB1c2JfcmVnaXN0ZXIoJnByaXNtMl91c2JfZHJpdmVyKTsKLQotCURCRkVYSVQ7Ci19OwotCi1zdGF0aWMgdm9pZCBfX2V4aXQgcHJpc20ydXNiX2NsZWFudXAodm9pZCkKLXsKLSAgICAgICAgREJGRU5URVI7Ci0KLQl1c2JfZGVyZWdpc3RlcigmcHJpc20yX3VzYl9kcml2ZXIpOwotCi0gICAgICAgIHByaW50ayhLRVJOX05PVElDRSAiJXMgVW5sb2FkZWRcbiIsIHZlcnNpb24pOwotCi0JREJGRVhJVDsKLX07Ci0KLW1vZHVsZV9pbml0KHByaXNtMnVzYl9pbml0KTsKLW1vZHVsZV9leGl0KHByaXNtMnVzYl9jbGVhbnVwKTsKLQotI2VuZGlmIC8vIG1vZHVsZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcHJpc20ybWdtdC5jIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcHJpc20ybWdtdC5jCmluZGV4IGM5NzUwMjUuLmYxNzI3YmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3ByaXNtMm1nbXQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wcmlzbTJtZ210LmMKQEAgLTYxLDEwICs2MSw2IEBACiAvKiBTeXN0ZW0gSW5jbHVkZXMgKi8KICNkZWZpbmUgV0xBTl9EQlZBUglwcmlzbTJfZGVidWcKIAotI2luY2x1ZGUgInZlcnNpb24uaCIKLQotCi0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogCiAjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CkBAIC03OSwxOSArNzUsNyBAQAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KICNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KLQotI2lmIChXTEFOX0hPU1RJRiA9PSBXTEFOX1VTQikKICNpbmNsdWRlIDxsaW51eC91c2IuaD4KLSNlbmRpZgotCi0jaWYgKFdMQU5fSE9TVElGID09IFdMQU5fUENNQ0lBKQotI2luY2x1ZGUgPHBjbWNpYS92ZXJzaW9uLmg+Ci0jaW5jbHVkZSA8cGNtY2lhL2NzX3R5cGVzLmg+Ci0jaW5jbHVkZSA8cGNtY2lhL2NzLmg+Ci0jaW5jbHVkZSA8cGNtY2lhL2Npc3RwbC5oPgotI2luY2x1ZGUgPHBjbWNpYS9kcy5oPgotI2luY2x1ZGUgPHBjbWNpYS9jaXNyZWcuaD4KLSNlbmRpZgogCiAjaW5jbHVkZSAid2xhbl9jb21wYXQuaCIKIApAQCAtMTA5LDg5ICs5MywxMiBAQAogI2luY2x1ZGUgImhmYTM4NHguaCIKICNpbmNsdWRlICJwcmlzbTJtZ210LmgiCiAKLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0vKiBMb2NhbCBDb25zdGFudHMgKi8KLQotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotLyogTG9jYWwgTWFjcm9zICovCi0KIC8qIENvbnZlcnRzIDgwMi4xMSBmb3JtYXQgcmF0ZSBzcGVjaWZpY2F0aW9ucyB0byBwcmlzbTIgKi8KICNkZWZpbmUgcDgwMjExcmF0ZV90b19wMmJpdChuKQkoKCgobikmfkJJVDcpID09IDIpID8gQklUMCA6IFwKIAkJCQkgKCgobikmfkJJVDcpID09IDQpID8gQklUMSA6IFwKIAkJCQkgKCgobikmfkJJVDcpID09IDExKSA/IEJJVDIgOiBcCiAJCQkJICgoKG4pJn5CSVQ3KSA9PSAyMikgPyBCSVQzIDogMCkKIAotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLS8qIExvY2FsIFR5cGVzICovCi0KLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLS8qIExvY2FsIFN0YXRpYyBEZWZpbml0aW9ucyAqLwotCi0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0vKiBMb2NhbCBGdW5jdGlvbiBEZWNsYXJhdGlvbnMgKi8KLQotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotLyogRnVuY3Rpb24gRGVmaW5pdGlvbnMgKi8KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogcHJpc20ybWdtdF9wb3dlcm1nbXQKLSoKLSogU2V0IHRoZSBwb3dlciBtYW5hZ2VtZW50IHN0YXRlIG9mIHRoaXMgc3RhdGlvbidzIE1BQy4KLSoKLSogQXJndW1lbnRzOgotKgl3bGFuZGV2CQl3bGFuIGRldmljZSBzdHJ1Y3R1cmUKLSoJbXNncAkJcHRyIHRvIG1zZyBidWZmZXIKLSoKLSogUmV0dXJuczoKLSoJMAlzdWNjZXNzIGFuZCBkb25lCi0qCTwwCXN1Y2Nlc3MsIGJ1dCB3ZSdyZSB3YWl0aW5nIGZvciBzb21ldGhpbmcgdG8gZmluaXNoLgotKgk+MAlhbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBoYW5kbGluZyB0aGUgbWVzc2FnZS4KLSogU2lkZSBlZmZlY3RzOgotKgotKiBDYWxsIGNvbnRleHQ6Ci0qCXByb2Nlc3MgdGhyZWFkICAodXN1YWxseSkKLSoJaW50ZXJydXB0Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCBwcmlzbTJtZ210X3Bvd2VybWdtdCh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHZvaWQgKm1zZ3ApCi17Ci0JaW50IAkJCXJlc3VsdCA9IDA7Ci0JaGZhMzg0eF90CQkqaHcgPSB3bGFuZGV2LT5wcml2OwotCXA4MDIxMW1zZ19kb3QxMXJlcV9wb3dlcm1nbXRfdAkqbXNnID0gbXNncDsKLQotCURCRkVOVEVSOwotCi0JaWYgKCFody0+YXApIHsKLQotCQkvKioqIFNUQVRJT04gKioqLwotCi0JCS8qCi0JCSAqIFNldCBDTkZQTUVOQUJMRUQgKG9uIG9yIG9mZikKLQkJICogU2V0IENORk1VTFRJQ0FTVFJYIChpZiBQTSBvbiwgb3RoZXJ3aXNlIGNsZWFyKQotCQkgKiBTcG91dCBhIG5vdGljZSBzdGF0aW5nIHRoYXQgU2xlZXBEdXJhdGlvbiBhbmQKLQkJICogSG9sZG92ZXJEdXJhdGlvbiBhbmQgUE1FUFMgYWxzbyBoYXZlIGFuIGltcGFjdC4KLQkJICovCi0JCS8qIFBvd2VybWdtdCBpcyBjdXJyZW50bHkgdW5zdXBwb3J0ZWQgZm9yIFNUQSAqLwotCQltc2ctPnJlc3VsdGNvZGUuc3RhdHVzID0gUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19kYXRhX29rOwotCQltc2ctPnJlc3VsdGNvZGUuZGF0YSA9IFA4MDIxMUVOVU1fcmVzdWx0Y29kZV9ub3Rfc3VwcG9ydGVkOwotCX0gZWxzZSB7Ci0KLQkJLyoqKiBBQ0NFU1MgUE9JTlQgKioqLwotCi0JCS8qIFBvd2VybWdtdCBpcyBuZXZlciBzdXBwb3J0ZWQgZm9yIEFQICovCi0JCW1zZy0+cmVzdWx0Y29kZS5zdGF0dXMgPSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2s7Ci0JCW1zZy0+cmVzdWx0Y29kZS5kYXRhID0gUDgwMjExRU5VTV9yZXN1bHRjb2RlX25vdF9zdXBwb3J0ZWQ7Ci0JfQotCi0JREJGRVhJVDsKLQlyZXR1cm4gcmVzdWx0OwotfQotCi0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiBwcmlzbTJtZ210X3NjYW4KICoKQEAgLTIyMSw3ICsxMjgsNyBAQAogCWludCAJCQlyZXN1bHQgPSAwOwogCWhmYTM4NHhfdAkJKmh3ID0gd2xhbmRldi0+cHJpdjsKIAlwODAyMTFtc2dfZG90MTFyZXFfc2Nhbl90CSptc2cgPSBtc2dwOwotICAgICAgICBVSU5UMTYgICAgICAgICAgICAgICAgICByb2FtaW5nbW9kZSwgd29yZDsKKyAgICAgICAgdTE2ICAgICAgICAgICAgICAgICAgcm9hbWluZ21vZGUsIHdvcmQ7CiAJaW50ICAgICAgICAgICAgICAgICAgICAgaSwgdGltZW91dDsKIAlpbnQgICAgICAgICAgICAgICAgICAgICBpc3RtcGVuYWJsZSA9IDA7CiAKQEAgLTIyOSwxMyArMTM2LDYgQEAKIAogCURCRkVOVEVSOwogCi0gICAgICAgIGlmIChody0+YXApIHsKLSAgICAgICAgICAgICAgICBXTEFOX0xPR19FUlJPUigiUHJpc20yIGluIEFQIG1vZGUgY2Fubm90IHBlcmZvcm0gc2NhbnMuXG4iKTsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSAxOwotICAgICAgICAgICAgICAgIG1zZy0+cmVzdWx0Y29kZS5kYXRhID0gUDgwMjExRU5VTV9yZXN1bHRjb2RlX25vdF9zdXBwb3J0ZWQ7Ci0gICAgICAgICAgICAgICAgZ290byBleGl0OwotICAgICAgICB9Ci0KICAgICAgICAgLyogZ2F0ZWtlZXBlciBjaGVjayAqLwogICAgICAgICBpZiAoSEZBMzg0eF9GSVJNV0FSRV9WRVJTSU9OKGh3LT5pZGVudF9zdGFfZncubWFqb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHctPmlkZW50X3N0YV9mdy5taW5vciwKQEAgLTI5Niw3ICsxOTYsNyBAQAogICAgICAgICAvKiBzZXQgdXAgdGhlIGNoYW5uZWwgbGlzdCAqLwogICAgICAgICB3b3JkID0gMDsKICAgICAgICAgZm9yIChpID0gMDsgaSA8IG1zZy0+Y2hhbm5lbGxpc3QuZGF0YS5sZW47IGkrKykgewotICAgICAgICAgICAgICAgIFVJTlQ4IGNoYW5uZWwgPSBtc2ctPmNoYW5uZWxsaXN0LmRhdGEuZGF0YVtpXTsKKyAgICAgICAgICAgICAgICB1OCBjaGFubmVsID0gbXNnLT5jaGFubmVsbGlzdC5kYXRhLmRhdGFbaV07CiAgICAgICAgICAgICAgICAgaWYgKGNoYW5uZWwgPiAxNCkgY29udGludWU7CiAgICAgICAgICAgICAgICAgLyogY2hhbm5lbCAxIGlzIEJJVDAgLi4uIGNoYW5uZWwgMTQgaXMgQklUMTMgKi8KICAgICAgICAgICAgICAgICB3b3JkIHw9ICgxIDw8IChjaGFubmVsLTEpKTsKQEAgLTMxNyw3ICsyMTcsNyBAQAogCQlnb3RvIGV4aXQ7CiAJfQogCWlmICh3b3JkID09IEhGQTM4NHhfUE9SVFNUQVRVU19ESVNBQkxFRCkgewotCQlVSU5UMTYgd29yZGJ1ZlsxN107CisJCXUxNiB3b3JkYnVmWzE3XTsKIAogCQlyZXN1bHQgPSBoZmEzODR4X2RydnJfc2V0Y29uZmlnMTYoaHcsCiAJCQlIRkEzODR4X1JJRF9DTkZST0FNSU5HTU9ERSwKQEAgLTQ4MCwxMiArMzgwLDYgQEAKIAogCXJlcS0+cmVzdWx0Y29kZS5zdGF0dXMgPSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2s7CiAKLQlpZiAoaHctPmFwKSB7Ci0JCXJlc3VsdCA9IDE7Ci0JCXJlcS0+cmVzdWx0Y29kZS5kYXRhID0gUDgwMjExRU5VTV9yZXN1bHRjb2RlX25vdF9zdXBwb3J0ZWQ7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KIAlpZiAoISBody0+c2NhbnJlc3VsdHMpIHsKIAkJV0xBTl9MT0dfRVJST1IoImRvdDExcmVxX3NjYW5fcmVzdWx0cyBjYW4gb25seSBiZSB1c2VkIGFmdGVyIGEgc3VjY2Vzc2Z1bCBkb3QxMXJlcV9zY2FuLlxuIik7CiAJCXJlc3VsdCA9IDI7CkBAIC02MTIsNTY3ICs1MDYsNiBAQAogCXJldHVybiByZXN1bHQ7CiB9CiAKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIHByaXNtMm1nbXRfam9pbgotKgotKiBKb2luIGEgQlNTIHdob3NlIEJTUyBkZXNjcmlwdGlvbiB3YXMgcHJldmlvdXNseSBvYnRhaW5lZCB3aXRoCi0qIGEgc2Nhbi4KLSoKLSogQXJndW1lbnRzOgotKgl3bGFuZGV2CQl3bGFuIGRldmljZSBzdHJ1Y3R1cmUKLSoJbXNncAkJcHRyIHRvIG1zZyBidWZmZXIKLSoKLSogUmV0dXJuczoKLSoJMAlzdWNjZXNzIGFuZCBkb25lCi0qCTwwCXN1Y2Nlc3MsIGJ1dCB3ZSdyZSB3YWl0aW5nIGZvciBzb21ldGhpbmcgdG8gZmluaXNoLgotKgk+MAlhbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBoYW5kbGluZyB0aGUgbWVzc2FnZS4KLSogU2lkZSBlZmZlY3RzOgotKgotKiBDYWxsIGNvbnRleHQ6Ci0qCXByb2Nlc3MgdGhyZWFkICAodXN1YWxseSkKLSoJaW50ZXJydXB0Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCBwcmlzbTJtZ210X2pvaW4od2xhbmRldmljZV90ICp3bGFuZGV2LCB2b2lkICptc2dwKQotewotCWludCAJCQlyZXN1bHQgPSAwOwotCWhmYTM4NHhfdAkJKmh3ID0gd2xhbmRldi0+cHJpdjsKLQlwODAyMTFtc2dfZG90MTFyZXFfam9pbl90CSptc2cgPSBtc2dwOwotCURCRkVOVEVSOwotCi0JaWYgKCFody0+YXApIHsKLQotCQkvKioqIFNUQVRJT04gKioqLwotCi0JCS8qIFRPRE86IEltcGxlbWVudCBhZnRlciBzY2FuICovCi0JCW1zZy0+cmVzdWx0Y29kZS5zdGF0dXMgPSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2s7Ci0JCW1zZy0+cmVzdWx0Y29kZS5kYXRhID0gUDgwMjExRU5VTV9yZXN1bHRjb2RlX25vdF9zdXBwb3J0ZWQ7Ci0JfSBlbHNlIHsKLQotCQkvKioqIEFDQ0VTUyBQT0lOVCAqKiovCi0KLQkJLyogTmV2ZXIgc3VwcG9ydGVkIGJ5IEFQcyAqLwotCQltc2ctPnJlc3VsdGNvZGUuc3RhdHVzID0gUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19kYXRhX29rOwotCQltc2ctPnJlc3VsdGNvZGUuZGF0YSA9IFA4MDIxMUVOVU1fcmVzdWx0Y29kZV9ub3Rfc3VwcG9ydGVkOwotCX0KLQotCURCRkVYSVQ7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogcHJpc20ybWdtdF9wMl9qb2luCi0qCi0qIEpvaW4gYSBzcGVjaWZpYyBCU1MKLSoKLSogQXJndW1lbnRzOgotKgl3bGFuZGV2CQl3bGFuIGRldmljZSBzdHJ1Y3R1cmUKLSoJbXNncAkJcHRyIHRvIG1zZyBidWZmZXIKLSoKLSogUmV0dXJuczoKLSoJMAlzdWNjZXNzIGFuZCBkb25lCi0qCTwwCXN1Y2Nlc3MsIGJ1dCB3ZSdyZSB3YWl0aW5nIGZvciBzb21ldGhpbmcgdG8gZmluaXNoLgotKgk+MAlhbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBoYW5kbGluZyB0aGUgbWVzc2FnZS4KLSogU2lkZSBlZmZlY3RzOgotKgotKiBDYWxsIGNvbnRleHQ6Ci0qCXByb2Nlc3MgdGhyZWFkICAodXN1YWxseSkKLSoJaW50ZXJydXB0Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCBwcmlzbTJtZ210X3AyX2pvaW4od2xhbmRldmljZV90ICp3bGFuZGV2LCB2b2lkICptc2dwKQotewotCWludCAJCQlyZXN1bHQgPSAwOwotCWhmYTM4NHhfdAkJKmh3ID0gd2xhbmRldi0+cHJpdjsKLQlwODAyMTFtc2dfcDJyZXFfam9pbl90CSptc2cgPSBtc2dwOwotCVVJTlQxNgkJCXJlZzsKLQlwODAyMTFwc3RyZF90CQkqcHN0cjsKLQlVSU5UOAkJCWJ5dGVidWZbMjU2XTsKLQloZmEzODR4X2J5dGVzdHJfdAkqcDJieXRlc3RyID0gKGhmYTM4NHhfYnl0ZXN0cl90KilieXRlYnVmOwotICAgICAgICBoZmEzODR4X0pvaW5SZXF1ZXN0X2RhdGFfdAlqb2lucmVxOwotCURCRkVOVEVSOwotCi0JaWYgKCFody0+YXApIHsKLQotCQl3bGFuZGV2LT5tYWNtb2RlID0gV0xBTl9NQUNNT0RFX05PTkU7Ci0KLQkJLyoqKiBTVEFUSU9OICoqKi8KLQkJLyogU2V0IHRoZSBQb3J0VHlwZSAqLwotCQltc2ctPnJlc3VsdGNvZGUuc3RhdHVzID0gUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19kYXRhX29rOwotCQltc2ctPnJlc3VsdGNvZGUuZGF0YSA9IFA4MDIxMUVOVU1fcmVzdWx0Y29kZV9zdWNjZXNzOwotCi0JCS8qIGVzcyBwb3J0ICovCi0JCXJlc3VsdCA9IGhmYTM4NHhfZHJ2cl9zZXRjb25maWcxNihodywgSEZBMzg0eF9SSURfQ05GUE9SVFRZUEUsIDEpOwotCQlpZiAoIHJlc3VsdCApIHsKLQkJCVdMQU5fTE9HX0VSUk9SKCJGYWlsZWQgdG8gc2V0IFBvcnQgVHlwZVxuIik7Ci0JCQlnb3RvIGZhaWxlZDsKLQkJfQotCi0JCS8qIFNldCB0aGUgYXV0aCB0eXBlICovCi0JCWlmICggbXNnLT5hdXRodHlwZS5kYXRhID09IFA4MDIxMUVOVU1fYXV0aGFsZ19zaGFyZWRrZXkgKSB7Ci0JCQlyZWcgPSBIRkEzODR4X0NORkFVVEhFTlRJQ0FUSU9OX1NIQVJFREtFWTsKLQkJfSBlbHNlIHsKLQkJCXJlZyA9IEhGQTM4NHhfQ05GQVVUSEVOVElDQVRJT05fT1BFTlNZU1RFTTsKLQkJfQotCQlyZXN1bHQgPSBoZmEzODR4X2RydnJfc2V0Y29uZmlnMTYoaHcsIEhGQTM4NHhfUklEX0NORkFVVEhFTlRJQ0FUSU9OLCByZWcpOwotCQlpZiAoIHJlc3VsdCApIHsKLQkJCVdMQU5fTE9HX0VSUk9SKCJGYWlsZWQgdG8gc2V0IEF1dGhlbnRpY2F0aW9uXG4iKTsKLQkJCWdvdG8gZmFpbGVkOwotCQl9Ci0KLQkJLyogVHVybiBvZmYgYWxsIHJvYW1pbmcgKi8KLQkJaGZhMzg0eF9kcnZyX3NldGNvbmZpZzE2KGh3LCBIRkEzODR4X1JJRF9DTkZST0FNSU5HTU9ERSwgMyk7Ci0JCWlmICggcmVzdWx0ICkgewotCQkJV0xBTl9MT0dfRVJST1IoIkZhaWxlZCB0byBUdXJuIG9mZiBSb2FtaW5nXG4iKTsKLQkJCWdvdG8gZmFpbGVkOwotCQl9Ci0KLQkJLyogQmFzaWMgcmF0ZXMgKi8KLSAgICAgICAgICAgICAgICByZWcgPSAwOwotCQlpZiAoIG1zZy0+YmFzaWNyYXRlMS5zdGF0dXMgPT0gUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19kYXRhX29rICkgewotCQkJcmVnID0gcDgwMjExcmF0ZV90b19wMmJpdChtc2ctPmJhc2ljcmF0ZTEuZGF0YSk7Ci0JCX0KLQkJaWYgKCBtc2ctPmJhc2ljcmF0ZTIuc3RhdHVzID09IFA4MDIxMUVOVU1fbXNnaXRlbV9zdGF0dXNfZGF0YV9vayApIHsKLQkJCXJlZyB8PSBwODAyMTFyYXRlX3RvX3AyYml0KG1zZy0+YmFzaWNyYXRlMi5kYXRhKTsKLQkJfQotCQlpZiAoIG1zZy0+YmFzaWNyYXRlMy5zdGF0dXMgPT0gUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19kYXRhX29rICkgewotCQkJcmVnIHw9IHA4MDIxMXJhdGVfdG9fcDJiaXQobXNnLT5iYXNpY3JhdGUzLmRhdGEpOwotCQl9Ci0JCWlmICggbXNnLT5iYXNpY3JhdGU0LnN0YXR1cyA9PSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2sgKSB7Ci0JCQlyZWcgfD0gcDgwMjExcmF0ZV90b19wMmJpdChtc2ctPmJhc2ljcmF0ZTQuZGF0YSk7Ci0JCX0KLQkJaWYgKCBtc2ctPmJhc2ljcmF0ZTUuc3RhdHVzID09IFA4MDIxMUVOVU1fbXNnaXRlbV9zdGF0dXNfZGF0YV9vayApIHsKLQkJCXJlZyB8PSBwODAyMTFyYXRlX3RvX3AyYml0KG1zZy0+YmFzaWNyYXRlNS5kYXRhKTsKLQkJfQotCQlpZiAoIG1zZy0+YmFzaWNyYXRlNi5zdGF0dXMgPT0gUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19kYXRhX29rICkgewotCQkJcmVnIHw9IHA4MDIxMXJhdGVfdG9fcDJiaXQobXNnLT5iYXNpY3JhdGU2LmRhdGEpOwotCQl9Ci0JCWlmICggbXNnLT5iYXNpY3JhdGU3LnN0YXR1cyA9PSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2sgKSB7Ci0JCQlyZWcgfD0gcDgwMjExcmF0ZV90b19wMmJpdChtc2ctPmJhc2ljcmF0ZTcuZGF0YSk7Ci0JCX0KLQkJaWYgKCBtc2ctPmJhc2ljcmF0ZTguc3RhdHVzID09IFA4MDIxMUVOVU1fbXNnaXRlbV9zdGF0dXNfZGF0YV9vayApIHsKLQkJCXJlZyB8PSBwODAyMTFyYXRlX3RvX3AyYml0KG1zZy0+YmFzaWNyYXRlOC5kYXRhKTsKLQkJfQotCQlpZiggcmVnID09IDApCi0JCQkgcmVnID0gMHgwMzsKLQkJcmVzdWx0ID0gaGZhMzg0eF9kcnZyX3NldGNvbmZpZzE2KGh3LCBIRkEzODR4X1JJRF9DTkZCQVNJQ1JBVEVTLCByZWcpOwotCQlpZiAoIHJlc3VsdCApIHsKLQkJCVdMQU5fTE9HX0VSUk9SKCJGYWlsZWQgdG8gc2V0IGJhc2ljcmF0ZXM9JWQuXG4iLCByZWcpOwotCQkJZ290byBmYWlsZWQ7Ci0JCX0KLQotCQkvKiBPcGVyYXRpb25hbCByYXRlcyAoc3VwcHJhdGVzIGFuZCB0eHJhdGVjb250cm9sKSAqLwotCQlyZWcgPSAwOwotCQlpZiAoIG1zZy0+b3BlcmF0aW9uYWxyYXRlMS5zdGF0dXMgPT0gUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19kYXRhX29rICkgewotCQkJcmVnID0gcDgwMjExcmF0ZV90b19wMmJpdChtc2ctPm9wZXJhdGlvbmFscmF0ZTEuZGF0YSk7Ci0JCX0KLQkJaWYgKCBtc2ctPm9wZXJhdGlvbmFscmF0ZTIuc3RhdHVzID09IFA4MDIxMUVOVU1fbXNnaXRlbV9zdGF0dXNfZGF0YV9vayApIHsKLQkJCXJlZyB8PSBwODAyMTFyYXRlX3RvX3AyYml0KG1zZy0+b3BlcmF0aW9uYWxyYXRlMi5kYXRhKTsKLQkJfQotCQlpZiAoIG1zZy0+b3BlcmF0aW9uYWxyYXRlMy5zdGF0dXMgPT0gUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19kYXRhX29rICkgewotCQkJcmVnIHw9IHA4MDIxMXJhdGVfdG9fcDJiaXQobXNnLT5vcGVyYXRpb25hbHJhdGUzLmRhdGEpOwotCQl9Ci0JCWlmICggbXNnLT5vcGVyYXRpb25hbHJhdGU0LnN0YXR1cyA9PSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2sgKSB7Ci0JCQlyZWcgfD0gcDgwMjExcmF0ZV90b19wMmJpdChtc2ctPm9wZXJhdGlvbmFscmF0ZTQuZGF0YSk7Ci0JCX0KLQkJaWYgKCBtc2ctPm9wZXJhdGlvbmFscmF0ZTUuc3RhdHVzID09IFA4MDIxMUVOVU1fbXNnaXRlbV9zdGF0dXNfZGF0YV9vayApIHsKLQkJCXJlZyB8PSBwODAyMTFyYXRlX3RvX3AyYml0KG1zZy0+b3BlcmF0aW9uYWxyYXRlNS5kYXRhKTsKLQkJfQotCQlpZiAoIG1zZy0+b3BlcmF0aW9uYWxyYXRlNi5zdGF0dXMgPT0gUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19kYXRhX29rICkgewotCQkJcmVnIHw9IHA4MDIxMXJhdGVfdG9fcDJiaXQobXNnLT5vcGVyYXRpb25hbHJhdGU2LmRhdGEpOwotCQl9Ci0JCWlmICggbXNnLT5vcGVyYXRpb25hbHJhdGU3LnN0YXR1cyA9PSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2sgKSB7Ci0JCQlyZWcgfD0gcDgwMjExcmF0ZV90b19wMmJpdChtc2ctPm9wZXJhdGlvbmFscmF0ZTcuZGF0YSk7Ci0JCX0KLQkJaWYgKCBtc2ctPm9wZXJhdGlvbmFscmF0ZTguc3RhdHVzID09IFA4MDIxMUVOVU1fbXNnaXRlbV9zdGF0dXNfZGF0YV9vayApIHsKLQkJCXJlZyB8PSBwODAyMTFyYXRlX3RvX3AyYml0KG1zZy0+b3BlcmF0aW9uYWxyYXRlOC5kYXRhKTsKLQkJfQotCQlpZiggcmVnID09IDApCi0JCQkgcmVnID0gMHgwZjsKLQkJcmVzdWx0ID0gaGZhMzg0eF9kcnZyX3NldGNvbmZpZzE2KGh3LCBIRkEzODR4X1JJRF9DTkZTVVBQUkFURVMsIHJlZyk7Ci0JCWlmICggcmVzdWx0ICkgewotCQkJV0xBTl9MT0dfRVJST1IoIkZhaWxlZCB0byBzZXQgc3VwcHJhdGVzPSVkLlxuIiwgcmVnKTsKLQkJCWdvdG8gZmFpbGVkOwotCQl9Ci0KLSAJCXJlc3VsdCA9IGhmYTM4NHhfZHJ2cl9zZXRjb25maWcxNihodywgSEZBMzg0eF9SSURfVFhSQVRFQ05UTCwgcmVnKTsKLQkJaWYgKCByZXN1bHQgKSB7Ci0JCQlXTEFOX0xPR19FUlJPUigiRmFpbGVkIHRvIHNldCB0eHJhdGVzPSVkLlxuIiwgcmVnKTsKLQkJCWdvdG8gZmFpbGVkOwotCQl9Ci0KLQkJLyogU2V0IHRoZSBzc2lkICovCi0JCW1lbXNldChieXRlYnVmLCAwLCAyNTYpOwotCQlwc3RyID0gKHA4MDIxMXBzdHJkX3QqKSYobXNnLT5zc2lkLmRhdGEpOwotCQlwcmlzbTJtZ210X3BzdHIyYnl0ZXN0cihwMmJ5dGVzdHIsIHBzdHIpOwotCQlyZXN1bHQgPSBoZmEzODR4X2RydnJfc2V0Y29uZmlnKAotCQkJaHcsIEhGQTM4NHhfUklEX0NORkRFU0lSRURTU0lELAotCQkJYnl0ZWJ1ZiwgSEZBMzg0eF9SSURfQ05GREVTSVJFRFNTSURfTEVOKTsKLQkJaWYgKCByZXN1bHQgKSB7Ci0JCQlXTEFOX0xPR19FUlJPUigiRmFpbGVkIHRvIHNldCBTU0lEXG4iKTsKLQkJCWdvdG8gZmFpbGVkOwotCQl9Ci0KLQkJLyogRW5hYmxlIHRoZSBQb3J0ICovCi0JCXJlc3VsdCA9IGhmYTM4NHhfY21kX2VuYWJsZShodywgMCk7Ci0JCWlmICggcmVzdWx0ICkgewotCQkJV0xBTl9MT0dfRVJST1IoIkVuYWJsZSBtYWNwb3J0IGZhaWxlZCwgcmVzdWx0PSVkLlxuIiwgcmVzdWx0KTsKLQkJCWdvdG8gZmFpbGVkOwotCQl9Ci0KLQkJLyogRmlsbCBpbiB0aGUgam9pbiByZXF1ZXN0ICovCi0JCWpvaW5yZXEuY2hhbm5lbCA9IG1zZy0+Y2hhbm5lbC5kYXRhOwotCQltZW1jcHkoIGpvaW5yZXEuYnNzaWQsICgodW5zaWduZWQgY2hhciAqKSAmbXNnLT5ic3NpZC5kYXRhKSArIDEsIFdMQU5fQlNTSURfTEVOKTsKLQkJaHctPmpvaW5yZXEgPSBqb2lucmVxOwotCQlody0+am9pbl9hcCA9IDE7Ci0KLQkJLyogU2VuZCB0aGUgam9pbiByZXF1ZXN0ICovCi0JCXJlc3VsdCA9IGhmYTM4NHhfZHJ2cl9zZXRjb25maWcoIGh3LAotCQkJSEZBMzg0eF9SSURfSk9JTlJFUVVFU1QsCi0JCQkmam9pbnJlcSwgSEZBMzg0eF9SSURfSk9JTlJFUVVFU1RfTEVOKTsKLSAgICAgICAgICAgICAgICBpZihyZXN1bHQgIT0gMCkgewotCQkJV0xBTl9MT0dfRVJST1IoIkpvaW4gcmVxdWVzdCBmYWlsZWQsIHJlc3VsdD0lZC5cbiIsIHJlc3VsdCk7Ci0JCQlnb3RvIGZhaWxlZDsKLQkJfQotCi0JfSBlbHNlIHsKLQotCQkvKioqIEFDQ0VTUyBQT0lOVCAqKiovCi0KLQkJLyogTmV2ZXIgc3VwcG9ydGVkIGJ5IEFQcyAqLwotCQltc2ctPnJlc3VsdGNvZGUuc3RhdHVzID0gUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19kYXRhX29rOwotCQltc2ctPnJlc3VsdGNvZGUuZGF0YSA9IFA4MDIxMUVOVU1fcmVzdWx0Y29kZV9ub3Rfc3VwcG9ydGVkOwotCX0KLQotICAgICAgICBnb3RvIGRvbmU7Ci1mYWlsZWQ6Ci0JV0xBTl9MT0dfREVCVUcoMSwgIkZhaWxlZCB0byBzZXQgYSBjb25maWcgb3B0aW9uLCByZXN1bHQ9JWRcbiIsIHJlc3VsdCk7Ci0JbXNnLT5yZXN1bHRjb2RlLmRhdGEgPSBQODAyMTFFTlVNX3Jlc3VsdGNvZGVfaW52YWxpZF9wYXJhbWV0ZXJzOwotCi1kb25lOgotICAgICAgICByZXN1bHQgPSAwOwotCi0JREJGRVhJVDsKLQlyZXR1cm4gcmVzdWx0OwotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBwcmlzbTJtZ210X2F1dGhlbnRpY2F0ZQotKgotKiBTdGF0aW9uIHNob3VsZCBiZSBiZWdpbiBhbiBhdXRoZW50aWNhdGlvbiBleGNoYW5nZS4KLSoKLSogQXJndW1lbnRzOgotKgl3bGFuZGV2CQl3bGFuIGRldmljZSBzdHJ1Y3R1cmUKLSoJbXNncAkJcHRyIHRvIG1zZyBidWZmZXIKLSoKLSogUmV0dXJuczoKLSoJMAlzdWNjZXNzIGFuZCBkb25lCi0qCTwwCXN1Y2Nlc3MsIGJ1dCB3ZSdyZSB3YWl0aW5nIGZvciBzb21ldGhpbmcgdG8gZmluaXNoLgotKgk+MAlhbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBoYW5kbGluZyB0aGUgbWVzc2FnZS4KLSogU2lkZSBlZmZlY3RzOgotKgotKiBDYWxsIGNvbnRleHQ6Ci0qCXByb2Nlc3MgdGhyZWFkICAodXN1YWxseSkKLSoJaW50ZXJydXB0Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCBwcmlzbTJtZ210X2F1dGhlbnRpY2F0ZSh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHZvaWQgKm1zZ3ApCi17Ci0JaW50IAkJCXJlc3VsdCA9IDA7Ci0JaGZhMzg0eF90CQkqaHcgPSB3bGFuZGV2LT5wcml2OwotCXA4MDIxMW1zZ19kb3QxMXJlcV9hdXRoZW50aWNhdGVfdAkqbXNnID0gbXNncDsKLQlEQkZFTlRFUjsKLQotCWlmICghaHctPmFwKSB7Ci0KLQkJLyoqKiBTVEFUSU9OICoqKi8KLQotCQkvKiBUT0RPOiBEZWNpZGUgaG93IHdlJ3JlIGdvaW5nIHRvIGhhbmRsZSB0aGlzIG9uZSB3LyBQcmlzbTIgKi8KLQkJLyogICAgICAgSXQgY291bGQgYmUgZW50ZXJ0YWluaW5nIHNpbmNlIFByaXNtMiBkb2Vzbid0IGhhdmUgICovCi0JCS8qICAgICAgIGFuIGV4cGxpY2l0IHdheSB0byBjb250cm9sIHRoaXMgKi8KLQkJbXNnLT5yZXN1bHRjb2RlLnN0YXR1cyA9IFA4MDIxMUVOVU1fbXNnaXRlbV9zdGF0dXNfZGF0YV9vazsKLQkJbXNnLT5yZXN1bHRjb2RlLmRhdGEgPSBQODAyMTFFTlVNX3Jlc3VsdGNvZGVfbm90X3N1cHBvcnRlZDsKLQl9IGVsc2UgewotCi0JCS8qKiogQUNDRVNTIFBPSU5UICoqKi8KLQotCQkvKiBOZXZlciBzdXBwb3J0ZWQgYnkgQVBzICovCi0JCW1zZy0+cmVzdWx0Y29kZS5zdGF0dXMgPSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2s7Ci0JCW1zZy0+cmVzdWx0Y29kZS5kYXRhID0gUDgwMjExRU5VTV9yZXN1bHRjb2RlX25vdF9zdXBwb3J0ZWQ7Ci0JfQotCi0JREJGRVhJVDsKLQlyZXR1cm4gcmVzdWx0OwotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBwcmlzbTJtZ210X2RlYXV0aGVudGljYXRlCi0qCi0qIFNlbmQgYSBkZWF1dGhlbnRpY2F0ZSBub3RpZmljYXRpb24uCi0qCi0qIEFyZ3VtZW50czoKLSoJd2xhbmRldgkJd2xhbiBkZXZpY2Ugc3RydWN0dXJlCi0qCW1zZ3AJCXB0ciB0byBtc2cgYnVmZmVyCi0qCi0qIFJldHVybnM6Ci0qCTAJc3VjY2VzcyBhbmQgZG9uZQotKgk8MAlzdWNjZXNzLCBidXQgd2UncmUgd2FpdGluZyBmb3Igc29tZXRoaW5nIHRvIGZpbmlzaC4KLSoJPjAJYW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgaGFuZGxpbmcgdGhlIG1lc3NhZ2UuCi0qIFNpZGUgZWZmZWN0czoKLSoKLSogQ2FsbCBjb250ZXh0OgotKglwcm9jZXNzIHRocmVhZCAgKHVzdWFsbHkpCi0qCWludGVycnVwdAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgcHJpc20ybWdtdF9kZWF1dGhlbnRpY2F0ZSh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHZvaWQgKm1zZ3ApCi17Ci0JaW50IAkJCXJlc3VsdCA9IDA7Ci0JaGZhMzg0eF90CQkqaHcgPSB3bGFuZGV2LT5wcml2OwotCXA4MDIxMW1zZ19kb3QxMXJlcV9kZWF1dGhlbnRpY2F0ZV90CSptc2cgPSBtc2dwOwotCURCRkVOVEVSOwotCi0JaWYgKCFody0+YXApIHsKLQotCQkvKioqIFNUQVRJT04gKioqLwotCi0JCS8qIFRPRE86IERlY2lkZSBob3cgd2UncmUgZ29pbmcgdG8gaGFuZGxlIHRoaXMgb25lIHcvIFByaXNtMiAqLwotCQkvKiAgICAgICBJdCBjb3VsZCBiZSBlbnRlcnRhaW5pbmcgc2luY2UgUHJpc20yIGRvZXNuJ3QgaGF2ZSAgKi8KLQkJLyogICAgICAgYW4gZXhwbGljaXQgd2F5IHRvIGNvbnRyb2wgdGhpcyAqLwotCQltc2ctPnJlc3VsdGNvZGUuc3RhdHVzID0gUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19kYXRhX29rOwotCQltc2ctPnJlc3VsdGNvZGUuZGF0YSA9IFA4MDIxMUVOVU1fcmVzdWx0Y29kZV9ub3Rfc3VwcG9ydGVkOwotCX0gZWxzZSB7Ci0KLQkJLyoqKiBBQ0NFU1MgUE9JTlQgKioqLwotCQloZmEzODR4X2RydnJfaGFuZG92ZXIoaHcsIG1zZy0+cGVlcnN0YWFkZHJlc3MuZGF0YS5kYXRhKTsKLQkJbXNnLT5yZXN1bHRjb2RlLnN0YXR1cyA9IFA4MDIxMUVOVU1fbXNnaXRlbV9zdGF0dXNfZGF0YV9vazsKLQkJbXNnLT5yZXN1bHRjb2RlLmRhdGEgPSBQODAyMTFFTlVNX3Jlc3VsdGNvZGVfc3VjY2VzczsKLQl9Ci0KLQlEQkZFWElUOwotCXJldHVybiByZXN1bHQ7Ci19Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIHByaXNtMm1nbXRfYXNzb2NpYXRlCi0qCi0qIEFzc29jaWF0ZSB3aXRoIGFuIEVTUy4KLSoKLSogQXJndW1lbnRzOgotKgl3bGFuZGV2CQl3bGFuIGRldmljZSBzdHJ1Y3R1cmUKLSoJbXNncAkJcHRyIHRvIG1zZyBidWZmZXIKLSoKLSogUmV0dXJuczoKLSoJMAlzdWNjZXNzIGFuZCBkb25lCi0qCTwwCXN1Y2Nlc3MsIGJ1dCB3ZSdyZSB3YWl0aW5nIGZvciBzb21ldGhpbmcgdG8gZmluaXNoLgotKgk+MAlhbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBoYW5kbGluZyB0aGUgbWVzc2FnZS4KLSogU2lkZSBlZmZlY3RzOgotKgotKiBDYWxsIGNvbnRleHQ6Ci0qCXByb2Nlc3MgdGhyZWFkICAodXN1YWxseSkKLSoJaW50ZXJydXB0Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCBwcmlzbTJtZ210X2Fzc29jaWF0ZSh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHZvaWQgKm1zZ3ApCi17Ci0JaGZhMzg0eF90CQkqaHcgPSB3bGFuZGV2LT5wcml2OwotCWludCAJCQlyZXN1bHQgPSAwOwotCXA4MDIxMW1zZ19kb3QxMXJlcV9hc3NvY2lhdGVfdAkqbXNnID0gbXNncDsKLQlEQkZFTlRFUjsKLQotCWlmICghaHctPmFwKSB7Ci0KLQkJLyoqKiBTVEFUSU9OICoqKi8KLQotI2lmIDAKLQkJLyogU2V0IHRoZSBUeFJhdGVzICovCi0JCXJlZyA9IDB4MDAwZjsKLQkJaGZhMzg0eF9kcnZyX3NldGNvbmZpZzE2KGh3LCBIRkEzODR4X1JJRF9UWFJBVEVDTlRMLCByZWcpOwotI2VuZGlmCi0KLQkJLyogU2V0IHRoZSBQb3J0VHlwZSAqLwotCQkvKiBlc3MgcG9ydCAqLwotCQloZmEzODR4X2RydnJfc2V0Y29uZmlnMTYoaHcsIEhGQTM4NHhfUklEX0NORlBPUlRUWVBFLCAxKTsKLQotCQkvKiBFbmFibGUgdGhlIFBvcnQgKi8KLQkJaGZhMzg0eF9kcnZyX2VuYWJsZShodywgMCk7Ci0KLQkJLyogU2V0IHRoZSByZXN1bHRjb2RlICovCi0JCW1zZy0+cmVzdWx0Y29kZS5zdGF0dXMgPSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2s7Ci0JCW1zZy0+cmVzdWx0Y29kZS5kYXRhID0gUDgwMjExRU5VTV9yZXN1bHRjb2RlX3N1Y2Nlc3M7Ci0KLQl9IGVsc2UgewotCi0JCS8qKiogQUNDRVNTIFBPSU5UICoqKi8KLQotCQkvKiBOZXZlciBzdXBwb3J0ZWQgb24gQVAgKi8KLQkJbXNnLT5yZXN1bHRjb2RlLnN0YXR1cyA9IFA4MDIxMUVOVU1fbXNnaXRlbV9zdGF0dXNfZGF0YV9vazsKLQkJbXNnLT5yZXN1bHRjb2RlLmRhdGEgPSBQODAyMTFFTlVNX3Jlc3VsdGNvZGVfbm90X3N1cHBvcnRlZDsKLQl9Ci0KLQlEQkZFWElUOwotCXJldHVybiByZXN1bHQ7Ci19Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIHByaXNtMm1nbXRfcmVhc3NvY2lhdGUKLSoKLSogUmVuZXcgYXNzb2NpYXRpb24gYmVjYXVzZSBvZiBhIEJTUyBjaGFuZ2UuCi0qCi0qIEFyZ3VtZW50czoKLSoJd2xhbmRldgkJd2xhbiBkZXZpY2Ugc3RydWN0dXJlCi0qCW1zZ3AJCXB0ciB0byBtc2cgYnVmZmVyCi0qCi0qIFJldHVybnM6Ci0qCTAJc3VjY2VzcyBhbmQgZG9uZQotKgk8MAlzdWNjZXNzLCBidXQgd2UncmUgd2FpdGluZyBmb3Igc29tZXRoaW5nIHRvIGZpbmlzaC4KLSoJPjAJYW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgaGFuZGxpbmcgdGhlIG1lc3NhZ2UuCi0qIFNpZGUgZWZmZWN0czoKLSoKLSogQ2FsbCBjb250ZXh0OgotKglwcm9jZXNzIHRocmVhZCAgKHVzdWFsbHkpCi0qCWludGVycnVwdAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgcHJpc20ybWdtdF9yZWFzc29jaWF0ZSh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHZvaWQgKm1zZ3ApCi17Ci0JaW50IAkJCXJlc3VsdCA9IDA7Ci0JaGZhMzg0eF90CQkqaHcgPSB3bGFuZGV2LT5wcml2OwotCXA4MDIxMW1zZ19kb3QxMXJlcV9yZWFzc29jaWF0ZV90CSptc2cgPSBtc2dwOwotCURCRkVOVEVSOwotCi0JaWYgKCFody0+YXApIHsKLQotCQkvKioqIFNUQVRJT04gKioqLwotCi0JCS8qIFRPRE86IE5vdCBzdXBwb3J0ZWQgeWV0Li4ubm90IHN1cmUgaG93IHdlJ3JlIGdvaW5nIHRvIGRvIGl0ICovCi0JCW1zZy0+cmVzdWx0Y29kZS5zdGF0dXMgPSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2s7Ci0JCW1zZy0+cmVzdWx0Y29kZS5kYXRhID0gUDgwMjExRU5VTV9yZXN1bHRjb2RlX25vdF9zdXBwb3J0ZWQ7Ci0JfSBlbHNlIHsKLQotCQkvKioqIEFDQ0VTUyBQT0lOVCAqKiovCi0KLQkJLyogTmV2ZXIgc3VwcG9ydGVkIG9uIEFQICovCi0JCW1zZy0+cmVzdWx0Y29kZS5zdGF0dXMgPSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2s7Ci0JCW1zZy0+cmVzdWx0Y29kZS5kYXRhID0gUDgwMjExRU5VTV9yZXN1bHRjb2RlX25vdF9zdXBwb3J0ZWQ7Ci0JfQotCi0JREJGRVhJVDsKLQlyZXR1cm4gcmVzdWx0OwotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBwcmlzbTJtZ210X2Rpc2Fzc29jaWF0ZQotKgotKiBTZW5kIGEgZGlzYXNzb2NpYXRpb24gbm90aWZpY2F0aW9uLgotKgotKiBBcmd1bWVudHM6Ci0qCXdsYW5kZXYJCXdsYW4gZGV2aWNlIHN0cnVjdHVyZQotKgltc2dwCQlwdHIgdG8gbXNnIGJ1ZmZlcgotKgotKiBSZXR1cm5zOgotKgkwCXN1Y2Nlc3MgYW5kIGRvbmUKLSoJPDAJc3VjY2VzcywgYnV0IHdlJ3JlIHdhaXRpbmcgZm9yIHNvbWV0aGluZyB0byBmaW5pc2guCi0qCT4wCWFuIGVycm9yIG9jY3VycmVkIHdoaWxlIGhhbmRsaW5nIHRoZSBtZXNzYWdlLgotKiBTaWRlIGVmZmVjdHM6Ci0qCi0qIENhbGwgY29udGV4dDoKLSoJcHJvY2VzcyB0aHJlYWQgICh1c3VhbGx5KQotKglpbnRlcnJ1cHQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IHByaXNtMm1nbXRfZGlzYXNzb2NpYXRlKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdm9pZCAqbXNncCkKLXsKLQlpbnQgCQkJcmVzdWx0ID0gMDsKLQloZmEzODR4X3QJCSpodyA9IHdsYW5kZXYtPnByaXY7Ci0JcDgwMjExbXNnX2RvdDExcmVxX2Rpc2Fzc29jaWF0ZV90CSptc2cgPSBtc2dwOwotCURCRkVOVEVSOwotCi0JaWYgKCFody0+YXApIHsKLQotCQkvKioqIFNUQVRJT04gKioqLwotCi0JCS8qIFRPRE86IE5vdCBzdXBwb3J0ZWQgeWV0Li4ubm90IHN1cmUgaG93IHRvIGRvIGl0ICovCi0JCW1zZy0+cmVzdWx0Y29kZS5zdGF0dXMgPSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2s7Ci0JCW1zZy0+cmVzdWx0Y29kZS5kYXRhID0gUDgwMjExRU5VTV9yZXN1bHRjb2RlX25vdF9zdXBwb3J0ZWQ7Ci0JfSBlbHNlIHsKLQotCQkvKioqIEFDQ0VTUyBQT0lOVCAqKiovCi0JCWhmYTM4NHhfZHJ2cl9oYW5kb3ZlcihodywgbXNnLT5wZWVyc3RhYWRkcmVzcy5kYXRhLmRhdGEpOwotCQltc2ctPnJlc3VsdGNvZGUuc3RhdHVzID0gUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19kYXRhX29rOwotCQltc2ctPnJlc3VsdGNvZGUuZGF0YSA9IFA4MDIxMUVOVU1fcmVzdWx0Y29kZV9zdWNjZXNzOwotCX0KLQotCURCRkVYSVQ7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogcHJpc20ybWdtdF9yZXNldAotKgotKiBSZXNldCB0aGUgTUFDIGFuZCBNU0QuICBUaGUgcDgwMjExIGxheWVyIGhhcyBpdCdzIG93biBoYW5kbGluZwotKiB0aGF0IHNob3VsZCBiZSBkb25lIGJlZm9yZSBhbmQgYWZ0ZXIgdGhpcyBmdW5jdGlvbi4KLSogUHJvY2VkdXJlOgotKiAgIC0gZGlzYWJsZSBzeXN0ZW0gaW50ZXJydXB0cyA/PwotKiAgIC0gZGlzYWJsZSBNQUMgaW50ZXJydXB0cwotKiAgIC0gcmVzdG9yZSBzeXN0ZW0gaW50ZXJydXB0cwotKiAgIC0gaXNzdWUgdGhlIE1BQyBpbml0aWFsaXplIGNvbW1hbmQKLSogICAtIGNsZWFyIGFueSBNU0QgbGV2ZWwgc3RhdGUgKGluY2x1ZGluZyB0aW1lcnMsIHF1ZXVlZCBldmVudHMsCi0qICAgICBldGMuKS4gIE5vdGUgdGhhdCBpZiB3ZSdyZSByZW1vdmluZyB0aW1lcidkL3F1ZXVlIGV2ZW50cywgd2UgbWF5Ci0qICAgICBuZWVkIHRvIGhhdmUgcmVtYWluZWQgaW4gdGhlIHN5c3RlbSBpbnRlcnJ1cHQgZGlzYWJsZWQgc3RhdGUuCi0qICAgICBXZSBzaG91bGQgYmUgbGVmdCBpbiB0aGUgc2FtZSBzdGF0ZSB0aGF0IHdlJ3JlIGluIGZvbGxvd2luZwotKiAgICAgZHJpdmVyIGluaXRpYWxpemF0aW9uLgotKgotKiBBcmd1bWVudHM6Ci0qCXdsYW5kZXYJCXdsYW4gZGV2aWNlIHN0cnVjdHVyZQotKgltc2dwCQlwdHIgdG8gbXNnIGJ1ZmZlciwgTUFZIEJFIE5VTEwhIGZvciBhIGRyaXZlciBsb2NhbAotKgkJCWNhbGwuCi0qCi0qIFJldHVybnM6Ci0qCTAJc3VjY2VzcyBhbmQgZG9uZQotKgk8MAlzdWNjZXNzLCBidXQgd2UncmUgd2FpdGluZyBmb3Igc29tZXRoaW5nIHRvIGZpbmlzaC4KLSoJPjAJYW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgaGFuZGxpbmcgdGhlIG1lc3NhZ2UuCi0qIFNpZGUgZWZmZWN0czoKLSoKLSogQ2FsbCBjb250ZXh0OgotKglwcm9jZXNzIHRocmVhZCwgY29tbW9ubHkgd2xhbmN0bCwgYnV0IG1pZ2h0IGJlIHJtbW9kL3BjaV9jbG9zZS4KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IHByaXNtMm1nbXRfcmVzZXQod2xhbmRldmljZV90ICp3bGFuZGV2LCB2b2lkICptc2dwKQotewotCWludCAJCQlyZXN1bHQgPSAwOwotCWhmYTM4NHhfdAkJKmh3ID0gd2xhbmRldi0+cHJpdjsKLQlwODAyMTFtc2dfZG90MTFyZXFfcmVzZXRfdAkqbXNnID0gbXNncDsKLQlEQkZFTlRFUjsKLQotCS8qCi0JICogVGhpcyBpcyBzdXBwb3J0ZWQgb24gYm90aCBBUCBhbmQgU1RBIGFuZCBpdCdzIG5vdCBhbGxvd2VkCi0JICogdG8gZmFpbC4KLQkgKi8KLQlpZiAoIG1zZ3AgKSB7Ci0JCW1zZy0+cmVzdWx0Y29kZS5zdGF0dXMgPSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2s7Ci0JCW1zZy0+cmVzdWx0Y29kZS5kYXRhID0gUDgwMjExRU5VTV9yZXN1bHRjb2RlX3N1Y2Nlc3M7Ci0JCVdMQU5fTE9HX0lORk8oImRvdDExcmVxX3Jlc2V0OiB0aGUgbWFjYWRkcmVzcyBhbmQgIgotCQkJInNldGRlZmF1bHRtaWIgYXJndW1lbnRzIGFyZSBjdXJyZW50bHkgdW5zdXBwb3J0ZWQuXG4iKTsKLQl9Ci0KLQkvKgotCSAqIElmIHdlIGdvdCB0aGlzIGZhciwgdGhlIE1TRCBtdXN0IGJlIGluIHRoZSBNU0RSVU5OSU5HIHN0YXRlCi0JICogdGhlcmVmb3JlLCB3ZSBtdXN0IHN0b3AgYW5kIHRoZW4gcmVzdGFydCB0aGUgaHcvTUFDIGNvbWJvLgotCSAqLwotCWhmYTM4NHhfZHJ2cl9zdG9wKGh3KTsKLQlyZXN1bHQgPSBoZmEzODR4X2RydnJfc3RhcnQoaHcpOwotCWlmIChyZXN1bHQgIT0gMCkgewotCQlXTEFOX0xPR19FUlJPUigiZG90MTFyZXFfcmVzZXQ6IEluaXRpYWxpemUgY29tbWFuZCBmYWlsZWQsIgotCQkJCSIgYmFkIHRoaW5ncyB3aWxsIGhhcHBlbiBmcm9tIGhlcmUuXG4iKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JREJGRVhJVDsKLQlyZXR1cm4gMDsKLX0KLQotCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogcHJpc20ybWdtdF9zdGFydAogKgpAQCAtMTE5OSwxMCArNTMyLDkgQEAKIAlwODAyMTFtc2dfZG90MTFyZXFfc3RhcnRfdAkqbXNnID0gbXNncDsKIAogCXA4MDIxMXBzdHJkX3QJCSpwc3RyOwotCVVJTlQ4CQkJYnl0ZWJ1Zls4MF07CisJdTgJCQlieXRlYnVmWzgwXTsKIAloZmEzODR4X2J5dGVzdHJfdAkqcDJieXRlc3RyID0gKGhmYTM4NHhfYnl0ZXN0cl90KilieXRlYnVmOwotCWhmYTM4NHhfUENGSW5mb19kYXRhX3QJKnBjZmluZm8gPSAoaGZhMzg0eF9QQ0ZJbmZvX2RhdGFfdCopYnl0ZWJ1ZjsKLQlVSU5UMTYJCQl3b3JkOworCXUxNgkJCXdvcmQ7CiAJREJGRU5URVI7CiAKIAl3bGFuZGV2LT5tYWNtb2RlID0gV0xBTl9NQUNNT0RFX05PTkU7CkBAIC0xMjEwLDE3MCArNTQyLDQ1IEBACiAJLyogU2V0IHRoZSBTU0lEICovCiAJbWVtY3B5KCZ3bGFuZGV2LT5zc2lkLCAmbXNnLT5zc2lkLmRhdGEsIHNpemVvZihtc2ctPnNzaWQuZGF0YSkpOwogCi0JaWYgKCFody0+YXApIHsKLQkJLyoqKiBBREhPQyBJQlNTICoqKi8KLQkJLyogc2VlIGlmIGN1cnJlbnQgZi93IGlzIGxlc3MgdGhhbiA4YzMgKi8KLQkJaWYgKEhGQTM4NHhfRklSTVdBUkVfVkVSU0lPTihody0+aWRlbnRfc3RhX2Z3Lm1ham9yLAotCQkJCQkgICAgIGh3LT5pZGVudF9zdGFfZncubWlub3IsCi0JCQkJCSAgICAgaHctPmlkZW50X3N0YV9mdy52YXJpYW50KSA8Ci0JCSAgICBIRkEzODR4X0ZJUk1XQVJFX1ZFUlNJT04oMCw4LDMpKSB7Ci0JCQkvKiBBZC1Ib2Mgbm90IHF1aXRlIHN1cHBvcnRlZCBvbiBQcmlzbTIgKi8KLQkJCW1zZy0+cmVzdWx0Y29kZS5zdGF0dXMgPSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2s7Ci0JCQltc2ctPnJlc3VsdGNvZGUuZGF0YSA9IFA4MDIxMUVOVU1fcmVzdWx0Y29kZV9ub3Rfc3VwcG9ydGVkOwotCQkJZ290byBkb25lOwotCQl9Ci0KLSAgCQltc2ctPnJlc3VsdGNvZGUuc3RhdHVzID0gUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19kYXRhX29rOwotCi0JCS8qKiogU1RBVElPTiAqKiovCi0JCS8qIFNldCB0aGUgUkVRVUlSRUQgY29uZmlnIGl0ZW1zICovCi0JCS8qIFNTSUQgKi8KLQkJcHN0ciA9IChwODAyMTFwc3RyZF90KikmKG1zZy0+c3NpZC5kYXRhKTsKLQkJcHJpc20ybWdtdF9wc3RyMmJ5dGVzdHIocDJieXRlc3RyLCBwc3RyKTsKLQkJcmVzdWx0ID0gaGZhMzg0eF9kcnZyX3NldGNvbmZpZyggaHcsIEhGQTM4NHhfUklEX0NORk9XTlNTSUQsCi0JCQkJYnl0ZWJ1ZiwgSEZBMzg0eF9SSURfQ05GT1dOU1NJRF9MRU4pOwotCQlpZiAoIHJlc3VsdCApIHsKLQkJCVdMQU5fTE9HX0VSUk9SKCJGYWlsZWQgdG8gc2V0IENuZk93blNTSURcbiIpOwotCQkJZ290byBmYWlsZWQ7Ci0JCX0KLQkJcmVzdWx0ID0gaGZhMzg0eF9kcnZyX3NldGNvbmZpZyggaHcsIEhGQTM4NHhfUklEX0NORkRFU0lSRURTU0lELAotCQkJCWJ5dGVidWYsIEhGQTM4NHhfUklEX0NORkRFU0lSRURTU0lEX0xFTik7Ci0JCWlmICggcmVzdWx0ICkgewotCQkJV0xBTl9MT0dfRVJST1IoIkZhaWxlZCB0byBzZXQgQ25mRGVzaXJlZFNTSURcbiIpOwotCQkJZ290byBmYWlsZWQ7Ci0JCX0KLQotCQkvKiBic3N0eXBlIC0gd2UgdXNlIHRoZSBkZWZhdWx0IGluIHRoZSBhcCBmaXJtd2FyZSAqLwotCQkvKiBJQlNTIHBvcnQgKi8KLQkJaGZhMzg0eF9kcnZyX3NldGNvbmZpZzE2KGh3LCBIRkEzODR4X1JJRF9DTkZQT1JUVFlQRSwgMCk7Ci0KLQkJLyogYmVhY29uIHBlcmlvZCAqLwotCQl3b3JkID0gbXNnLT5iZWFjb25wZXJpb2QuZGF0YTsKLQkJcmVzdWx0ID0gaGZhMzg0eF9kcnZyX3NldGNvbmZpZzE2KGh3LCBIRkEzODR4X1JJRF9DTkZBUEJDTklOVCwgd29yZCk7Ci0JCWlmICggcmVzdWx0ICkgewotCQkJV0xBTl9MT0dfRVJST1IoIkZhaWxlZCB0byBzZXQgYmVhY29uIHBlcmlvZD0lZC5cbiIsIHdvcmQpOwotCQkJZ290byBmYWlsZWQ7Ci0JCX0KLQotCQkvKiBkc2NoYW5uZWwgKi8KLQkJd29yZCA9IG1zZy0+ZHNjaGFubmVsLmRhdGE7Ci0JCXJlc3VsdCA9IGhmYTM4NHhfZHJ2cl9zZXRjb25maWcxNihodywgSEZBMzg0eF9SSURfQ05GT1dOQ0hBTk5FTCwgd29yZCk7Ci0JCWlmICggcmVzdWx0ICkgewotCQkJV0xBTl9MT0dfRVJST1IoIkZhaWxlZCB0byBzZXQgY2hhbm5lbD0lZC5cbiIsIHdvcmQpOwotCQkJZ290byBmYWlsZWQ7Ci0JCX0KLQkJLyogQmFzaWMgcmF0ZXMgKi8KLQkJd29yZCA9IHA4MDIxMXJhdGVfdG9fcDJiaXQobXNnLT5iYXNpY3JhdGUxLmRhdGEpOwotCQlpZiAoIG1zZy0+YmFzaWNyYXRlMi5zdGF0dXMgPT0gUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19kYXRhX29rICkgewotCQkJd29yZCB8PSBwODAyMTFyYXRlX3RvX3AyYml0KG1zZy0+YmFzaWNyYXRlMi5kYXRhKTsKLQkJfQotCQlpZiAoIG1zZy0+YmFzaWNyYXRlMy5zdGF0dXMgPT0gUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19kYXRhX29rICkgewotCQkJd29yZCB8PSBwODAyMTFyYXRlX3RvX3AyYml0KG1zZy0+YmFzaWNyYXRlMy5kYXRhKTsKLQkJfQotCQlpZiAoIG1zZy0+YmFzaWNyYXRlNC5zdGF0dXMgPT0gUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19kYXRhX29rICkgewotCQkJd29yZCB8PSBwODAyMTFyYXRlX3RvX3AyYml0KG1zZy0+YmFzaWNyYXRlNC5kYXRhKTsKLQkJfQotCQlpZiAoIG1zZy0+YmFzaWNyYXRlNS5zdGF0dXMgPT0gUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19kYXRhX29rICkgewotCQkJd29yZCB8PSBwODAyMTFyYXRlX3RvX3AyYml0KG1zZy0+YmFzaWNyYXRlNS5kYXRhKTsKLQkJfQotCQlpZiAoIG1zZy0+YmFzaWNyYXRlNi5zdGF0dXMgPT0gUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19kYXRhX29rICkgewotCQkJd29yZCB8PSBwODAyMTFyYXRlX3RvX3AyYml0KG1zZy0+YmFzaWNyYXRlNi5kYXRhKTsKLQkJfQotCQlpZiAoIG1zZy0+YmFzaWNyYXRlNy5zdGF0dXMgPT0gUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19kYXRhX29rICkgewotCQkJd29yZCB8PSBwODAyMTFyYXRlX3RvX3AyYml0KG1zZy0+YmFzaWNyYXRlNy5kYXRhKTsKLQkJfQotCQlpZiAoIG1zZy0+YmFzaWNyYXRlOC5zdGF0dXMgPT0gUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19kYXRhX29rICkgewotCQkJd29yZCB8PSBwODAyMTFyYXRlX3RvX3AyYml0KG1zZy0+YmFzaWNyYXRlOC5kYXRhKTsKLQkJfQotCQlyZXN1bHQgPSBoZmEzODR4X2RydnJfc2V0Y29uZmlnMTYoaHcsIEhGQTM4NHhfUklEX0NORkJBU0lDUkFURVMsIHdvcmQpOwotCQlpZiAoIHJlc3VsdCApIHsKLQkJCVdMQU5fTE9HX0VSUk9SKCJGYWlsZWQgdG8gc2V0IGJhc2ljcmF0ZXM9JWQuXG4iLCB3b3JkKTsKLQkJCWdvdG8gZmFpbGVkOwotCQl9Ci0KLQkJLyogT3BlcmF0aW9uYWwgcmF0ZXMgKHN1cHByYXRlcyBhbmQgdHhyYXRlY29udHJvbCkgKi8KLQkJd29yZCA9IHA4MDIxMXJhdGVfdG9fcDJiaXQobXNnLT5vcGVyYXRpb25hbHJhdGUxLmRhdGEpOwotCQlpZiAoIG1zZy0+b3BlcmF0aW9uYWxyYXRlMi5zdGF0dXMgPT0gUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19kYXRhX29rICkgewotCQkJd29yZCB8PSBwODAyMTFyYXRlX3RvX3AyYml0KG1zZy0+b3BlcmF0aW9uYWxyYXRlMi5kYXRhKTsKLQkJfQotCQlpZiAoIG1zZy0+b3BlcmF0aW9uYWxyYXRlMy5zdGF0dXMgPT0gUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19kYXRhX29rICkgewotCQkJd29yZCB8PSBwODAyMTFyYXRlX3RvX3AyYml0KG1zZy0+b3BlcmF0aW9uYWxyYXRlMy5kYXRhKTsKLQkJfQotCQlpZiAoIG1zZy0+b3BlcmF0aW9uYWxyYXRlNC5zdGF0dXMgPT0gUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19kYXRhX29rICkgewotCQkJd29yZCB8PSBwODAyMTFyYXRlX3RvX3AyYml0KG1zZy0+b3BlcmF0aW9uYWxyYXRlNC5kYXRhKTsKLQkJfQotCQlpZiAoIG1zZy0+b3BlcmF0aW9uYWxyYXRlNS5zdGF0dXMgPT0gUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19kYXRhX29rICkgewotCQkJd29yZCB8PSBwODAyMTFyYXRlX3RvX3AyYml0KG1zZy0+b3BlcmF0aW9uYWxyYXRlNS5kYXRhKTsKLQkJfQotCQlpZiAoIG1zZy0+b3BlcmF0aW9uYWxyYXRlNi5zdGF0dXMgPT0gUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19kYXRhX29rICkgewotCQkJd29yZCB8PSBwODAyMTFyYXRlX3RvX3AyYml0KG1zZy0+b3BlcmF0aW9uYWxyYXRlNi5kYXRhKTsKLQkJfQotCQlpZiAoIG1zZy0+b3BlcmF0aW9uYWxyYXRlNy5zdGF0dXMgPT0gUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19kYXRhX29rICkgewotCQkJd29yZCB8PSBwODAyMTFyYXRlX3RvX3AyYml0KG1zZy0+b3BlcmF0aW9uYWxyYXRlNy5kYXRhKTsKLQkJfQotCQlpZiAoIG1zZy0+b3BlcmF0aW9uYWxyYXRlOC5zdGF0dXMgPT0gUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19kYXRhX29rICkgewotCQkJd29yZCB8PSBwODAyMTFyYXRlX3RvX3AyYml0KG1zZy0+b3BlcmF0aW9uYWxyYXRlOC5kYXRhKTsKLQkJfQotCQlyZXN1bHQgPSBoZmEzODR4X2RydnJfc2V0Y29uZmlnMTYoaHcsIEhGQTM4NHhfUklEX0NORlNVUFBSQVRFUywgd29yZCk7Ci0JCWlmICggcmVzdWx0ICkgewotCQkJV0xBTl9MT0dfRVJST1IoIkZhaWxlZCB0byBzZXQgc3VwcHJhdGVzPSVkLlxuIiwgd29yZCk7Ci0JCQlnb3RvIGZhaWxlZDsKLQkJfQotCi0gCQlyZXN1bHQgPSBoZmEzODR4X2RydnJfc2V0Y29uZmlnMTYoaHcsIEhGQTM4NHhfUklEX1RYUkFURUNOVEwsIHdvcmQpOwotCQlpZiAoIHJlc3VsdCApIHsKLQkJCVdMQU5fTE9HX0VSUk9SKCJGYWlsZWQgdG8gc2V0IHR4cmF0ZXM9JWQuXG4iLCB3b3JkKTsKLQkJCWdvdG8gZmFpbGVkOwotCQl9Ci0KLQkJLyogU2V0IHRoZSBtYWNtb2RlIHNvIHRoZSBmcmFtZSBzZXR1cCBjb2RlIGtub3dzIHdoYXQgdG8gZG8gKi8KLQkJaWYgKCBtc2ctPmJzc3R5cGUuZGF0YSA9PSBQODAyMTFFTlVNX2Jzc3R5cGVfaW5kZXBlbmRlbnQgKSB7Ci0JCQl3bGFuZGV2LT5tYWNtb2RlID0gV0xBTl9NQUNNT0RFX0lCU1NfU1RBOwotCQkJLyogbGV0cyBleHRlbmQgdGhlIGRhdGEgbGVuZ3RoIGEgYml0ICovCi0JCQloZmEzODR4X2RydnJfc2V0Y29uZmlnMTYoaHcsIEhGQTM4NHhfUklEX0NORk1BWERBVEFMRU4sIDIzMDQpOwotCQl9Ci0KLQkJLyogRW5hYmxlIHRoZSBQb3J0ICovCi0JCXJlc3VsdCA9IGhmYTM4NHhfZHJ2cl9lbmFibGUoaHcsIDApOwotCQlpZiAoIHJlc3VsdCApIHsKLQkJCVdMQU5fTE9HX0VSUk9SKCJFbmFibGUgbWFjcG9ydCBmYWlsZWQsIHJlc3VsdD0lZC5cbiIsIHJlc3VsdCk7Ci0JCQlnb3RvIGZhaWxlZDsKLQkJfQotCi0JCW1zZy0+cmVzdWx0Y29kZS5kYXRhID0gUDgwMjExRU5VTV9yZXN1bHRjb2RlX3N1Y2Nlc3M7Ci0KKwkvKioqIEFESE9DIElCU1MgKioqLworCS8qIHNlZSBpZiBjdXJyZW50IGYvdyBpcyBsZXNzIHRoYW4gOGMzICovCisJaWYgKEhGQTM4NHhfRklSTVdBUkVfVkVSU0lPTihody0+aWRlbnRfc3RhX2Z3Lm1ham9yLAorCQkJCSAgICAgaHctPmlkZW50X3N0YV9mdy5taW5vciwKKwkJCQkgICAgIGh3LT5pZGVudF9zdGFfZncudmFyaWFudCkgPAorCSAgICBIRkEzODR4X0ZJUk1XQVJFX1ZFUlNJT04oMCw4LDMpKSB7CisJCS8qIEFkLUhvYyBub3QgcXVpdGUgc3VwcG9ydGVkIG9uIFByaXNtMiAqLworCQltc2ctPnJlc3VsdGNvZGUuc3RhdHVzID0gUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19kYXRhX29rOworCQltc2ctPnJlc3VsdGNvZGUuZGF0YSA9IFA4MDIxMUVOVU1fcmVzdWx0Y29kZV9ub3Rfc3VwcG9ydGVkOwogCQlnb3RvIGRvbmU7CiAJfQogCi0JLyoqKiBBQ0NFU1MgUE9JTlQgKioqLwotCiAJbXNnLT5yZXN1bHRjb2RlLnN0YXR1cyA9IFA4MDIxMUVOVU1fbXNnaXRlbV9zdGF0dXNfZGF0YV9vazsKIAotCS8qIFZhbGlkYXRlIHRoZSBjb21tYW5kLCBpZiBCU1N0eXBlPWluZnJhIGlzIHRoZSB0ZXJ0aWFyeSBsb2FkZWQ/ICovCi0JaWYgKCBtc2ctPmJzc3R5cGUuZGF0YSA9PSBQODAyMTFFTlVNX2Jzc3R5cGVfaW5kZXBlbmRlbnQgKSB7Ci0JCVdMQU5fTE9HX0VSUk9SKCJBUCBkcml2ZXIgY2Fubm90IGNyZWF0ZSBJQlNTLlxuIik7Ci0JCWdvdG8gZmFpbGVkOwotCX0gZWxzZSBpZiAoIGh3LT5jYXBfc3VwX3N0YS5pZCAhPSA1KSB7Ci0JCVdMQU5fTE9HX0VSUk9SKCJBUCBkcml2ZXIgZmFpbGVkIHRvIGRldGVjdCBBUCBmaXJtd2FyZS5cbiIpOwotCQlnb3RvIGZhaWxlZDsKLQl9Ci0KKwkvKioqIFNUQVRJT04gKioqLwogCS8qIFNldCB0aGUgUkVRVUlSRUQgY29uZmlnIGl0ZW1zICovCiAJLyogU1NJRCAqLwogCXBzdHIgPSAocDgwMjExcHN0cmRfdCopJihtc2ctPnNzaWQuZGF0YSk7CiAJcHJpc20ybWdtdF9wc3RyMmJ5dGVzdHIocDJieXRlc3RyLCBwc3RyKTsKIAlyZXN1bHQgPSBoZmEzODR4X2RydnJfc2V0Y29uZmlnKCBodywgSEZBMzg0eF9SSURfQ05GT1dOU1NJRCwKLQkJCQlieXRlYnVmLCBIRkEzODR4X1JJRF9DTkZPV05TU0lEX0xFTik7CisJCQkJCSBieXRlYnVmLCBIRkEzODR4X1JJRF9DTkZPV05TU0lEX0xFTik7CiAJaWYgKCByZXN1bHQgKSB7Ci0JCVdMQU5fTE9HX0VSUk9SKCJGYWlsZWQgdG8gc2V0IFNTSUQsIHJlc3VsdD0weCUwNHhcbiIsIHJlc3VsdCk7CisJCVdMQU5fTE9HX0VSUk9SKCJGYWlsZWQgdG8gc2V0IENuZk93blNTSURcbiIpOworCQlnb3RvIGZhaWxlZDsKKwl9CisJcmVzdWx0ID0gaGZhMzg0eF9kcnZyX3NldGNvbmZpZyggaHcsIEhGQTM4NHhfUklEX0NORkRFU0lSRURTU0lELAorCQkJCQkgYnl0ZWJ1ZiwgSEZBMzg0eF9SSURfQ05GREVTSVJFRFNTSURfTEVOKTsKKwlpZiAoIHJlc3VsdCApIHsKKwkJV0xBTl9MT0dfRVJST1IoIkZhaWxlZCB0byBzZXQgQ25mRGVzaXJlZFNTSURcbiIpOwogCQlnb3RvIGZhaWxlZDsKIAl9CiAKIAkvKiBic3N0eXBlIC0gd2UgdXNlIHRoZSBkZWZhdWx0IGluIHRoZSBhcCBmaXJtd2FyZSAqLworCS8qIElCU1MgcG9ydCAqLworCWhmYTM4NHhfZHJ2cl9zZXRjb25maWcxNihodywgSEZBMzg0eF9SSURfQ05GUE9SVFRZUEUsIDApOwogCiAJLyogYmVhY29uIHBlcmlvZCAqLwogCXdvcmQgPSBtc2ctPmJlYWNvbnBlcmlvZC5kYXRhOwotCXJlc3VsdCA9IGhmYTM4NHhfZHJ2cl9zZXRjb25maWcxNihodywgSEZBMzg0eF9SSURfQ05GQVBCQ05JTlQsIHdvcmQpOworCXJlc3VsdCA9IGhmYTM4NHhfZHJ2cl9zZXRjb25maWcxNihodywgSEZBMzg0eF9SSURfQ05GQVBCQ05pbnQsIHdvcmQpOwogCWlmICggcmVzdWx0ICkgewogCQlXTEFOX0xPR19FUlJPUigiRmFpbGVkIHRvIHNldCBiZWFjb24gcGVyaW9kPSVkLlxuIiwgd29yZCk7CiAJCWdvdG8gZmFpbGVkOwpAQCAtMTQ0Myw5OCArNjUwLDIwIEBACiAJCVdMQU5fTE9HX0VSUk9SKCJGYWlsZWQgdG8gc2V0IHN1cHByYXRlcz0lZC5cbiIsIHdvcmQpOwogCQlnb3RvIGZhaWxlZDsKIAl9Ci0JcmVzdWx0ID0gaGZhMzg0eF9kcnZyX3NldGNvbmZpZzE2KGh3LCBIRkEzODR4X1JJRF9UWFJBVEVDTlRMMCwgd29yZCk7CisKKwlyZXN1bHQgPSBoZmEzODR4X2RydnJfc2V0Y29uZmlnMTYoaHcsIEhGQTM4NHhfUklEX1RYUkFURUNOVEwsIHdvcmQpOwogCWlmICggcmVzdWx0ICkgewogCQlXTEFOX0xPR19FUlJPUigiRmFpbGVkIHRvIHNldCB0eHJhdGVzPSVkLlxuIiwgd29yZCk7CiAJCWdvdG8gZmFpbGVkOwogCX0KIAotCS8qIGlic3NhdGltd2luZG93ICovCi0JaWYgKG1zZy0+aWJzc2F0aW13aW5kb3cuc3RhdHVzID09IFA4MDIxMUVOVU1fbXNnaXRlbV9zdGF0dXNfZGF0YV9vaykgewotCQlXTEFOX0xPR19JTkZPKCJwcmlzbTJtZ210X3N0YXJ0OiBhdGltd2luZG93IG5vdCB1c2VkIGluICIKLQkJCSAgICAgICAiSW5mcmFzdHJ1Y3R1cmUgbW9kZSwgaWdub3JlZC5cbiIpOwotCX0KLQotCS8qIERUSU0gcGVyaW9kICovCi0Jd29yZCA9IG1zZy0+ZHRpbXBlcmlvZC5kYXRhOwotCXJlc3VsdCA9IGhmYTM4NHhfZHJ2cl9zZXRjb25maWcxNihodywgSEZBMzg0eF9SSURfQ05GT1dORFRJTVBFUiwgd29yZCk7Ci0JaWYgKCByZXN1bHQgKSB7Ci0JCVdMQU5fTE9HX0VSUk9SKCJGYWlsZWQgdG8gc2V0IGR0aW0gcGVyaW9kPSVkLlxuIiwgd29yZCk7Ci0JCWdvdG8gZmFpbGVkOwotCX0KLQotCS8qIHByb2JlZGVsYXkgKi8KLQlpZiAobXNnLT5wcm9iZWRlbGF5LnN0YXR1cyA9PSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2spIHsKLQkJV0xBTl9MT0dfSU5GTygicHJpc20ybWdtdF9zdGFydDogcHJvYmVkZWxheSBub3QgIgotCQkJICAgICAgICJzdXBwb3J0ZWQgaW4gcHJpc20yLCBpZ25vcmVkLlxuIik7Ci0JfQotCi0JLyogY2Zwb2xsYWJsZSwgY2Zwb2xscmVxLCBjZnBwZXJpb2QsIGNmcG1heGR1cmF0aW9uICovCi0JaWYgKG1zZy0+Y2Zwb2xsYWJsZS5kYXRhID09IFA4MDIxMUVOVU1fdHJ1dGhfdHJ1ZSAmJgotCSAgICBtc2ctPmNmcG9sbHJlcS5kYXRhID09IFA4MDIxMUVOVU1fdHJ1dGhfdHJ1ZSApIHsKLQkJV0xBTl9MT0dfRVJST1IoImNmcG9sbGFibGU9Y2Zwb2xscmVxPXRydWUgaXMgaWxsZWdhbC5cbiIpOwotCQlyZXN1bHQgPSAtMTsKLQkJZ290byBmYWlsZWQ7Ci0JfQotCi0JLyogcmVhZCB0aGUgUENGSW5mbyBhbmQgdXBkYXRlICovCi0JcmVzdWx0ID0gaGZhMzg0eF9kcnZyX2dldGNvbmZpZyhodywgSEZBMzg0eF9SSURfQ05GQVBQQ0ZJTkZPLAotCQkJCQlwY2ZpbmZvLCBIRkEzODR4X1JJRF9DTkZBUFBDRklORk9fTEVOKTsKLQlpZiAoIHJlc3VsdCApIHsKLQkJV0xBTl9MT0dfSU5GTygicHJpc20ybWdtdF9zdGFydDogcmVhZChwY2ZpbmZvKSBmYWlsZWQsICIKLQkJCQkiYXNzdW1lIGl0J3MgIgotCQkJCSJub3Qgc3VwcG9ydGVkLCBwY2Ygc2V0dGluZ3MgaWdub3JlZC5cbiIpOwotCQlnb3RvIHBjZl9za2lwOwotCX0KLQlpZiAoKG1zZy0+Y2Zwb2xsYWJsZS5kYXRhID09IFA4MDIxMUVOVU1fdHJ1dGhfZmFsc2UgJiYKLQkgICAgIG1zZy0+Y2Zwb2xscmVxLmRhdGEgPT0gUDgwMjExRU5VTV90cnV0aF9mYWxzZSkgKSB7Ci0JICAgIAlwY2ZpbmZvLT5NZWRpdW1PY2N1cGFuY3lMaW1pdCA9IDA7Ci0JCXBjZmluZm8tPkNGUFBlcmlvZCA9IDA7Ci0JCXBjZmluZm8tPkNGUE1heER1cmF0aW9uID0gMDsKLQkJcGNmaW5mby0+Q0ZQRmxhZ3MgJj0gaG9zdDJoZmEzODR4XzE2KChVSU5UMTYpfkJJVDApOwotCi0JCWlmICggbXNnLT5jZnBwZXJpb2Quc3RhdHVzID09IFA4MDIxMUVOVU1fbXNnaXRlbV9zdGF0dXNfZGF0YV9vayB8fAotCQkgICAgIG1zZy0+Y2ZwbWF4ZHVyYXRpb24uc3RhdHVzID09IFA4MDIxMUVOVU1fbXNnaXRlbV9zdGF0dXNfZGF0YV9vayApIHsKLQkJCVdMQU5fTE9HX1dBUk5JTkcoCi0JCQkJIlNldHRpbmcgY2ZwcGVyaW9kIG9yIGNmcG1heGR1cmF0aW9uIHdoZW4gIgotCQkJCSJjZnBvbGxhYmxlIGFuZCBjZnJlcSBhcmUgZmFsc2UgaXMgcG9pbnRsZXNzLlxuIik7Ci0JCX0KLQl9Ci0JaWYgKChtc2ctPmNmcG9sbGFibGUuZGF0YSA9PSBQODAyMTFFTlVNX3RydXRoX3RydWUgfHwKLQkgICAgIG1zZy0+Y2Zwb2xscmVxLmRhdGEgPT0gUDgwMjExRU5VTV90cnV0aF90cnVlKSApIHsKLQkJaWYgKCBtc2ctPmNmcG9sbGFibGUuZGF0YSA9PSBQODAyMTFFTlVNX3RydXRoX3RydWUpIHsKLQkJCXBjZmluZm8tPkNGUEZsYWdzIHw9IGhvc3QyaGZhMzg0eF8xNigoVUlOVDE2KUJJVDApOwotCQl9Ci0KLQkJaWYgKCBtc2ctPmNmcHBlcmlvZC5zdGF0dXMgPT0gUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19kYXRhX29rKSB7Ci0JCQlwY2ZpbmZvLT5DRlBQZXJpb2QgPSBtc2ctPmNmcHBlcmlvZC5kYXRhOwotCQkJcGNmaW5mby0+Q0ZQUGVyaW9kID0gaG9zdDJoZmEzODR4XzE2KHBjZmluZm8tPkNGUFBlcmlvZCk7Ci0JCX0KLQotCQlpZiAoIG1zZy0+Y2ZwbWF4ZHVyYXRpb24uc3RhdHVzID09IFA4MDIxMUVOVU1fbXNnaXRlbV9zdGF0dXNfZGF0YV9vaykgewotCQkJcGNmaW5mby0+Q0ZQTWF4RHVyYXRpb24gPSBtc2ctPmNmcG1heGR1cmF0aW9uLmRhdGE7Ci0JCQlwY2ZpbmZvLT5DRlBNYXhEdXJhdGlvbiA9IGhvc3QyaGZhMzg0eF8xNihwY2ZpbmZvLT5DRlBNYXhEdXJhdGlvbik7Ci0JCQlwY2ZpbmZvLT5NZWRpdW1PY2N1cGFuY3lMaW1pdCA9IHBjZmluZm8tPkNGUE1heER1cmF0aW9uOwotCQl9Ci0JfQotCXJlc3VsdCA9IGhmYTM4NHhfZHJ2cl9zZXRjb25maWcoaHcsIEhGQTM4NHhfUklEX0NORkFQUENGSU5GTywKLQkJCQkJcGNmaW5mbywgSEZBMzg0eF9SSURfQ05GQVBQQ0ZJTkZPX0xFTik7Ci0JaWYgKCByZXN1bHQgKSB7Ci0JCVdMQU5fTE9HX0VSUk9SKCJ3cml0ZShwY2ZpbmZvKSBmYWlsZWQuXG4iKTsKLQkJZ290byBmYWlsZWQ7Ci0JfQotCi1wY2Zfc2tpcDoKIAkvKiBTZXQgdGhlIG1hY21vZGUgc28gdGhlIGZyYW1lIHNldHVwIGNvZGUga25vd3Mgd2hhdCB0byBkbyAqLwotCWlmICggbXNnLT5ic3N0eXBlLmRhdGEgPT0gUDgwMjExRU5VTV9ic3N0eXBlX2luZnJhc3RydWN0dXJlICkgewotCQl3bGFuZGV2LT5tYWNtb2RlID0gV0xBTl9NQUNNT0RFX0VTU19BUDsKKwlpZiAoIG1zZy0+YnNzdHlwZS5kYXRhID09IFA4MDIxMUVOVU1fYnNzdHlwZV9pbmRlcGVuZGVudCApIHsKKwkJd2xhbmRldi0+bWFjbW9kZSA9IFdMQU5fTUFDTU9ERV9JQlNTX1NUQTsKIAkJLyogbGV0cyBleHRlbmQgdGhlIGRhdGEgbGVuZ3RoIGEgYml0ICovCiAJCWhmYTM4NHhfZHJ2cl9zZXRjb25maWcxNihodywgSEZBMzg0eF9SSURfQ05GTUFYREFUQUxFTiwgMjMwNCk7CiAJfQogCi0JLyogU2V0IHRoZSBCU1NJRCB0byB0aGUgc2FtZSBhcyBvdXIgTUFDICovCi0JbWVtY3B5KCB3bGFuZGV2LT5ic3NpZCwgd2xhbmRldi0+bmV0ZGV2LT5kZXZfYWRkciwgV0xBTl9CU1NJRF9MRU4pOwotCiAJLyogRW5hYmxlIHRoZSBQb3J0ICovCiAJcmVzdWx0ID0gaGZhMzg0eF9kcnZyX2VuYWJsZShodywgMCk7CiAJaWYgKCByZXN1bHQgKSB7CkBAIC0xNTU2LDgwICs2ODUsNiBAQAogCXJldHVybiByZXN1bHQ7CiB9CiAKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIHByaXNtMm1nbXRfZW5hYmxlCi0qCi0qIFN0YXJ0IGEgQlNTLiAgQW55IHN0YXRpb24gY2FuIGRvIHRoaXMgZm9yIElCU1MsIG9ubHkgQVAgZm9yIEVTUy4KLSoKLSogQXJndW1lbnRzOgotKgl3bGFuZGV2CQl3bGFuIGRldmljZSBzdHJ1Y3R1cmUKLSoJbXNncAkJcHRyIHRvIG1zZyBidWZmZXIKLSoKLSogUmV0dXJuczoKLSoJMAlzdWNjZXNzIGFuZCBkb25lCi0qCTwwCXN1Y2Nlc3MsIGJ1dCB3ZSdyZSB3YWl0aW5nIGZvciBzb21ldGhpbmcgdG8gZmluaXNoLgotKgk+MAlhbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBoYW5kbGluZyB0aGUgbWVzc2FnZS4KLSogU2lkZSBlZmZlY3RzOgotKgotKiBDYWxsIGNvbnRleHQ6Ci0qCXByb2Nlc3MgdGhyZWFkICAodXN1YWxseSkKLSoJaW50ZXJydXB0Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCBwcmlzbTJtZ210X2VuYWJsZSh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHZvaWQgKm1zZ3ApCi17Ci0JaW50CQkJcmVzdWx0ID0gMDsKLQloZmEzODR4X3QJCSpodyA9IHdsYW5kZXYtPnByaXY7Ci0JcDgwMjExbXNnX3AycmVxX2VuYWJsZV90CSptc2cgPSBtc2dwOwotCURCRkVOVEVSOwotCi0JaWYgKCFody0+YXApIHsKLQotCQkvKioqIFNUQVRJT04gKioqLwotCi0JCS8qIEFkLUhvYyBub3QgcXVpdGUgc3VwcG9ydGVkIG9uIFByaXNtMiAqLwotCQltc2ctPnJlc3VsdGNvZGUuc3RhdHVzID0gUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19kYXRhX29rOwotCQltc2ctPnJlc3VsdGNvZGUuZGF0YSA9IFA4MDIxMUVOVU1fcmVzdWx0Y29kZV9ub3Rfc3VwcG9ydGVkOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JLyoqKiBBQ0NFU1MgUE9JTlQgKioqLwotCi0JbXNnLT5yZXN1bHRjb2RlLnN0YXR1cyA9IFA4MDIxMUVOVU1fbXNnaXRlbV9zdGF0dXNfZGF0YV9vazsKLQotCS8qIElzIHRoZSB0ZXJ0aWFyeSBsb2FkZWQ/ICovCi0JaWYgKCBody0+Y2FwX3N1cF9zdGEuaWQgIT0gNSkgewotCQlXTEFOX0xPR19FUlJPUigiQVAgZHJpdmVyIGZhaWxlZCB0byBkZXRlY3QgQVAgZmlybXdhcmUuXG4iKTsKLQkJZ290byBmYWlsZWQ7Ci0JfQotCi0JLyogU2V0IHRoZSBtYWNtb2RlIHNvIHRoZSBmcmFtZSBzZXR1cCBjb2RlIGtub3dzIHdoYXQgdG8gZG8gKi8KLQl3bGFuZGV2LT5tYWNtb2RlID0gV0xBTl9NQUNNT0RFX0VTU19BUDsKLQotCS8qIFNldCB0aGUgQlNTSUQgdG8gdGhlIHNhbWUgYXMgb3VyIE1BQyAqLwotCW1lbWNweSggd2xhbmRldi0+YnNzaWQsIHdsYW5kZXYtPm5ldGRldi0+ZGV2X2FkZHIsIFdMQU5fQlNTSURfTEVOKTsKLQotCS8qIEVuYWJsZSB0aGUgUG9ydCAqLwotCXJlc3VsdCA9IGhmYTM4NHhfZHJ2cl9lbmFibGUoaHcsIDApOwotCWlmICggcmVzdWx0ICkgewotCQlXTEFOX0xPR19FUlJPUigiRW5hYmxlIG1hY3BvcnQgZmFpbGVkLCByZXN1bHQ9JWQuXG4iLCByZXN1bHQpOwotCQlnb3RvIGZhaWxlZDsKLQl9Ci0KLQltc2ctPnJlc3VsdGNvZGUuZGF0YSA9IFA4MDIxMUVOVU1fcmVzdWx0Y29kZV9zdWNjZXNzOwotCi0JZ290byBkb25lOwotZmFpbGVkOgotCW1zZy0+cmVzdWx0Y29kZS5kYXRhID0gUDgwMjExRU5VTV9yZXN1bHRjb2RlX2ludmFsaWRfcGFyYW1ldGVyczsKLQotZG9uZToKLQlyZXN1bHQgPSAwOwotCi0JREJGRVhJVDsKLQlyZXR1cm4gcmVzdWx0OwotfQotCi0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiBwcmlzbTJtZ210X3JlYWRwZGEKICoKQEAgLTE2OTYsNDAyICs3NTEsNiBAQAogfQogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogcHJpc20ybWdtdF9yZWFkY2lzCi0qCi0qIENvbGxlY3QgdGhlIENJUyBkYXRhIGFuZCBwdXQgaXQgaW4gdGhlIG1lc3NhZ2UuCi0qCi0qIEFyZ3VtZW50czoKLSoJd2xhbmRldgkJd2xhbiBkZXZpY2Ugc3RydWN0dXJlCi0qCW1zZ3AJCXB0ciB0byBtc2cgYnVmZmVyCi0qCi0qIFJldHVybnM6Ci0qCTAJc3VjY2VzcyBhbmQgZG9uZQotKgk8MAlzdWNjZXNzLCBidXQgd2UncmUgd2FpdGluZyBmb3Igc29tZXRoaW5nIHRvIGZpbmlzaC4KLSoJPjAJYW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgaGFuZGxpbmcgdGhlIG1lc3NhZ2UuCi0qIFNpZGUgZWZmZWN0czoKLSoKLSogQ2FsbCBjb250ZXh0OgotKglwcm9jZXNzIHRocmVhZCAgKHVzdWFsbHkpCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCBwcmlzbTJtZ210X3JlYWRjaXMod2xhbmRldmljZV90ICp3bGFuZGV2LCB2b2lkICptc2dwKQotewotCWludAkJCXJlc3VsdDsKLQloZmEzODR4X3QJCSpodyA9IHdsYW5kZXYtPnByaXY7Ci0JcDgwMjExbXNnX3AycmVxX3JlYWRjaXNfdAkqbXNnID0gbXNncDsKLQotCURCRkVOVEVSOwotCi0gICAgICAgIG1lbXNldChtc2ctPmNpcy5kYXRhLCAwLCBzaXplb2YobXNnLT5jaXMuZGF0YSkpOwotCi0JcmVzdWx0ID0gaGZhMzg0eF9kcnZyX2dldGNvbmZpZyhodywgSEZBMzg0eF9SSURfQ0lTLAotCQkJCQltc2ctPmNpcy5kYXRhLCBIRkEzODR4X1JJRF9DSVNfTEVOKTsKLQlpZiAoIHJlc3VsdCApIHsKLQkJV0xBTl9MT0dfSU5GTygicHJpc20ybWdtdF9yZWFkY2lzOiByZWFkKGNpcykgZmFpbGVkLlxuIik7Ci0JCW1zZy0+Y2lzLnN0YXR1cyA9IFA4MDIxMUVOVU1fbXNnaXRlbV9zdGF0dXNfbm9fdmFsdWU7Ci0JCW1zZy0+cmVzdWx0Y29kZS5kYXRhID0gUDgwMjExRU5VTV9yZXN1bHRjb2RlX2ltcGxlbWVudGF0aW9uX2ZhaWx1cmU7Ci0KLQkJfQotCWVsc2UgewotCQltc2ctPmNpcy5zdGF0dXMgPSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2s7Ci0JCW1zZy0+cmVzdWx0Y29kZS5kYXRhID0gUDgwMjExRU5VTV9yZXN1bHRjb2RlX3N1Y2Nlc3M7Ci0JCX0KLQotCW1zZy0+cmVzdWx0Y29kZS5zdGF0dXMgPSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2s7Ci0KLQlEQkZFWElUOwotCXJldHVybiAwOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogcHJpc20ybWdtdF9hdXhwb3J0X3N0YXRlCi0qCi0qIEVuYWJsZXMvRGlzYWJsZXMgdGhlIGNhcmQncyBhdXhpbGlhcnkgcG9ydC4gIFNob3VsZCBiZSBjYWxsZWQKLSogYmVmb3JlIGFuZCBhZnRlciBhIHNlcXVlbmNlIG9mIGF1eHBvcnRfcmVhZCgpL2F1eHBvcnRfd3JpdGUoKQotKiBjYWxscy4KLSoKLSogQXJndW1lbnRzOgotKgl3bGFuZGV2CQl3bGFuIGRldmljZSBzdHJ1Y3R1cmUKLSoJbXNncAkJcHRyIHRvIG1zZyBidWZmZXIKLSoKLSogUmV0dXJuczoKLSoJMAlzdWNjZXNzIGFuZCBkb25lCi0qCTwwCXN1Y2Nlc3MsIGJ1dCB3ZSdyZSB3YWl0aW5nIGZvciBzb21ldGhpbmcgdG8gZmluaXNoLgotKgk+MAlhbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBoYW5kbGluZyB0aGUgbWVzc2FnZS4KLSogU2lkZSBlZmZlY3RzOgotKgotKiBDYWxsIGNvbnRleHQ6Ci0qCXByb2Nlc3MgdGhyZWFkICAodXN1YWxseSkKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IHByaXNtMm1nbXRfYXV4cG9ydF9zdGF0ZSh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHZvaWQgKm1zZ3ApCi17Ci0JcDgwMjExbXNnX3AycmVxX2F1eHBvcnRfc3RhdGVfdAkqbXNnID0gbXNncDsKLQotI2lmIChXTEFOX0hPU1RJRiAhPSBXTEFOX1VTQikKLQloZmEzODR4X3QJCSpodyA9IHdsYW5kZXYtPnByaXY7Ci0JREJGRU5URVI7Ci0KLQltc2ctPnJlc3VsdGNvZGUuc3RhdHVzID0gUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19kYXRhX29rOwotCWlmIChtc2ctPmVuYWJsZS5kYXRhID09IFA4MDIxMUVOVU1fdHJ1dGhfdHJ1ZSkgewotCQlpZiAoIGhmYTM4NHhfY21kX2F1eF9lbmFibGUoaHcsIDApICkgewotCQkJbXNnLT5yZXN1bHRjb2RlLmRhdGEgPSBQODAyMTFFTlVNX3Jlc3VsdGNvZGVfaW1wbGVtZW50YXRpb25fZmFpbHVyZTsKLQkJfSBlbHNlIHsKLQkJCW1zZy0+cmVzdWx0Y29kZS5kYXRhID0gUDgwMjExRU5VTV9yZXN1bHRjb2RlX3N1Y2Nlc3M7Ci0JCX0KLQl9IGVsc2UgewotCQloZmEzODR4X2NtZF9hdXhfZGlzYWJsZShodyk7Ci0JCW1zZy0+cmVzdWx0Y29kZS5kYXRhID0gUDgwMjExRU5VTV9yZXN1bHRjb2RlX3N1Y2Nlc3M7Ci0JfQotCi0jZWxzZSAvKiAhVVNCICovCi0JREJGRU5URVI7Ci0KLQltc2ctPnJlc3VsdGNvZGUuc3RhdHVzID0gUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19kYXRhX29rOwotCW1zZy0+cmVzdWx0Y29kZS5kYXRhID0gUDgwMjExRU5VTV9yZXN1bHRjb2RlX25vdF9zdXBwb3J0ZWQ7Ci0KLSNlbmRpZiAvKiBXTEFOX0hPU1RJRiAhPSBXTEFOX1VTQiAqLwotCi0JREJGRVhJVDsKLQlyZXR1cm4gMDsKLX0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogcHJpc20ybWdtdF9hdXhwb3J0X3JlYWQKLSoKLSogQ29waWVzIGRhdGEgZnJvbSB0aGUgY2FyZCB1c2luZyB0aGUgYXV4cG9ydC4gIFRoZSBhdXhwb3J0IG11c3QKLSogaGF2ZSBwcmV2aW91c2x5IGJlZW4gZW5hYmxlZC4gIE5vdGU6IHRoaXMgaXMgbm90IHRoZSB3YXkgdG8KLSogZG8gZG93bmxvYWRzLCBzZWUgdGhlIFtyYW18Zmxhc2hdZGwgZnVuY3Rpb25zLgotKgotKiBBcmd1bWVudHM6Ci0qCXdsYW5kZXYJCXdsYW4gZGV2aWNlIHN0cnVjdHVyZQotKgltc2dwCQlwdHIgdG8gbXNnIGJ1ZmZlcgotKgotKiBSZXR1cm5zOgotKgkwCXN1Y2Nlc3MgYW5kIGRvbmUKLSoJPDAJc3VjY2VzcywgYnV0IHdlJ3JlIHdhaXRpbmcgZm9yIHNvbWV0aGluZyB0byBmaW5pc2guCi0qCT4wCWFuIGVycm9yIG9jY3VycmVkIHdoaWxlIGhhbmRsaW5nIHRoZSBtZXNzYWdlLgotKiBTaWRlIGVmZmVjdHM6Ci0qCi0qIENhbGwgY29udGV4dDoKLSoJcHJvY2VzcyB0aHJlYWQgICh1c3VhbGx5KQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgcHJpc20ybWdtdF9hdXhwb3J0X3JlYWQod2xhbmRldmljZV90ICp3bGFuZGV2LCB2b2lkICptc2dwKQotewotI2lmIChXTEFOX0hPU1RJRiAhPSBXTEFOX1VTQikKLQloZmEzODR4X3QJCSpodyA9IHdsYW5kZXYtPnByaXY7Ci0JcDgwMjExbXNnX3AycmVxX2F1eHBvcnRfcmVhZF90CSptc2cgPSBtc2dwOwotCVVJTlQzMgkJCWFkZHI7Ci0JVUlOVDMyCQkJbGVuOwotCVVJTlQ4KgkJCWJ1ZjsKLQlVSU5UMzIJCQltYXhsZW4gPSBzaXplb2YobXNnLT5kYXRhLmRhdGEpOwotCURCRkVOVEVSOwotCi0JaWYgKCBody0+YXV4ZW4gKSB7Ci0JCWFkZHIgPSBtc2ctPmFkZHIuZGF0YTsKLQkJbGVuID0gbXNnLT5sZW4uZGF0YTsKLQkJYnVmID0gbXNnLT5kYXRhLmRhdGE7Ci0JCWlmICggbGVuIDw9IG1heGxlbiApIHsgIC8qIG1heCByZWFkL3dyaXRlIHNpemUgKi8KLQkJCWhmYTM4NHhfY29weV9mcm9tX2F1eChodywgYWRkciwgSEZBMzg0eF9BVVhfQ1RMX0VYVERTLCBidWYsIGxlbik7Ci0JCQltc2ctPnJlc3VsdGNvZGUuZGF0YSA9IFA4MDIxMUVOVU1fcmVzdWx0Y29kZV9zdWNjZXNzOwotCQl9IGVsc2UgewotCQkJV0xBTl9MT0dfREVCVUcoMSwiQXR0ZW1wdCB0byByZWFkID4gbWF4bGVuIGZyb20gYXV4cG9ydC5cbiIpOwotCQkJbXNnLT5yZXN1bHRjb2RlLmRhdGEgPSBQODAyMTFFTlVNX3Jlc3VsdGNvZGVfcmVmdXNlZDsKLQkJfQotCi0JfSBlbHNlIHsKLQkJbXNnLT5yZXN1bHRjb2RlLmRhdGEgPSBQODAyMTFFTlVNX3Jlc3VsdGNvZGVfcmVmdXNlZDsKLQl9Ci0JbXNnLT5kYXRhLnN0YXR1cyA9IFA4MDIxMUVOVU1fbXNnaXRlbV9zdGF0dXNfZGF0YV9vazsKLQltc2ctPnJlc3VsdGNvZGUuc3RhdHVzID0gUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19kYXRhX29rOwotCi0JREJGRVhJVDsKLQlyZXR1cm4gMDsKLSNlbHNlCi0JREJGRU5URVI7Ci0KLQlXTEFOX0xPR19FUlJPUigicHJpc20ybWdtdF9hdXhwb3J0X3JlYWQ6IE5vdCBzdXBwb3J0ZWQgb24gVVNCLlxuIik7Ci0KLQlEQkZFWElUOwotCXJldHVybiAwOwotI2VuZGlmCi19Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIHByaXNtMm1nbXRfYXV4cG9ydF93cml0ZQotKgotKiBDb3BpZXMgZGF0YSB0byB0aGUgY2FyZCB1c2luZyB0aGUgYXV4cG9ydC4gIFRoZSBhdXhwb3J0IG11c3QKLSogaGF2ZSBwcmV2aW91c2x5IGJlZW4gZW5hYmxlZC4gIE5vdGU6IHRoaXMgaXMgbm90IHRoZSB3YXkgdG8KLSogZG8gZG93bmxvYWRzLCBzZWUgdGhlIFtyYW18Zmxhc2hdZGwgZnVuY3Rpb25zLgotKgotKiBBcmd1bWVudHM6Ci0qCXdsYW5kZXYJCXdsYW4gZGV2aWNlIHN0cnVjdHVyZQotKgltc2dwCQlwdHIgdG8gbXNnIGJ1ZmZlcgotKgotKiBSZXR1cm5zOgotKgkwCXN1Y2Nlc3MgYW5kIGRvbmUKLSoJPDAJc3VjY2VzcywgYnV0IHdlJ3JlIHdhaXRpbmcgZm9yIHNvbWV0aGluZyB0byBmaW5pc2guCi0qCT4wCWFuIGVycm9yIG9jY3VycmVkIHdoaWxlIGhhbmRsaW5nIHRoZSBtZXNzYWdlLgotKiBTaWRlIGVmZmVjdHM6Ci0qCi0qIENhbGwgY29udGV4dDoKLSoJcHJvY2VzcyB0aHJlYWQgICh1c3VhbGx5KQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgcHJpc20ybWdtdF9hdXhwb3J0X3dyaXRlKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdm9pZCAqbXNncCkKLXsKLSNpZiAoV0xBTl9IT1NUSUYgIT0gV0xBTl9VU0IpCi0JaGZhMzg0eF90CQkqaHcgPSB3bGFuZGV2LT5wcml2OwotCXA4MDIxMW1zZ19wMnJlcV9hdXhwb3J0X3dyaXRlX3QJKm1zZyA9IG1zZ3A7Ci0JVUlOVDMyCQkJYWRkcjsKLQlVSU5UMzIJCQlsZW47Ci0JVUlOVDgqCQkJYnVmOwotCVVJTlQzMgkJCW1heGxlbiA9IHNpemVvZihtc2ctPmRhdGEuZGF0YSk7Ci0JREJGRU5URVI7Ci0KLQlpZiAoIGh3LT5hdXhlbiApIHsKLQkJYWRkciA9IG1zZy0+YWRkci5kYXRhOwotCQlsZW4gPSBtc2ctPmxlbi5kYXRhOwotCQlidWYgPSBtc2ctPmRhdGEuZGF0YTsKLQkJaWYgKCBsZW4gPD0gbWF4bGVuICkgeyAgLyogbWF4IHJlYWQvd3JpdGUgc2l6ZSAqLwotCQkJaGZhMzg0eF9jb3B5X3RvX2F1eChodywgYWRkciwgSEZBMzg0eF9BVVhfQ1RMX0VYVERTLCBidWYsIGxlbik7Ci0JCX0gZWxzZSB7Ci0JCQlXTEFOX0xPR19ERUJVRygxLCJBdHRlbXB0IHRvIHdyaXRlID4gbWF4bGVuIGZyb20gYXV4cG9ydC5cbiIpOwotCQkJbXNnLT5yZXN1bHRjb2RlLmRhdGEgPSBQODAyMTFFTlVNX3Jlc3VsdGNvZGVfcmVmdXNlZDsKLQkJfQotCi0JfSBlbHNlIHsKLQkJbXNnLT5yZXN1bHRjb2RlLmRhdGEgPSBQODAyMTFFTlVNX3Jlc3VsdGNvZGVfcmVmdXNlZDsKLQl9Ci0JbXNnLT5kYXRhLnN0YXR1cyA9IFA4MDIxMUVOVU1fbXNnaXRlbV9zdGF0dXNfZGF0YV9vazsKLQltc2ctPnJlc3VsdGNvZGUuc3RhdHVzID0gUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19kYXRhX29rOwotCi0JREJGRVhJVDsKLQlyZXR1cm4gMDsKLSNlbHNlCi0JREJGRU5URVI7Ci0JV0xBTl9MT0dfRVJST1IoInByaXNtMm1nbXRfYXV4cG9ydF9yZWFkOiBOb3Qgc3VwcG9ydGVkIG9uIFVTQi5cbiIpOwotCURCRkVYSVQ7Ci0JcmV0dXJuIDA7Ci0jZW5kaWYKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIHByaXNtMm1nbXRfbG93X2xldmVsCi0qCi0qIFB1dHMgdGhlIGNhcmQgaW50byB0aGUgZGVzaXJlZCB0ZXN0IG1vZGUuCi0qCi0qIEFyZ3VtZW50czoKLSogICAgICAgd2xhbmRldiAgICAgICAgIHdsYW4gZGV2aWNlIHN0cnVjdHVyZQotKiAgICAgICBtc2dwICAgICAgICAgICAgcHRyIHRvIG1zZyBidWZmZXIKLSoKLSogUmV0dXJuczoKLSogICAgICAgMCAgICAgICBzdWNjZXNzIGFuZCBkb25lCi0qICAgICAgIDwwICAgICAgc3VjY2VzcywgYnV0IHdlJ3JlIHdhaXRpbmcgZm9yIHNvbWV0aGluZyB0byBmaW5pc2guCi0qICAgICAgID4wICAgICAgYW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgaGFuZGxpbmcgdGhlIG1lc3NhZ2UuCi0qIFNpZGUgZWZmZWN0czoKLSoKLSogQ2FsbCBjb250ZXh0OgotKiAgICAgICBwcm9jZXNzIHRocmVhZCAgKHVzdWFsbHkpCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCBwcmlzbTJtZ210X2xvd19sZXZlbCh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHZvaWQgKm1zZ3ApCi17Ci0JaGZhMzg0eF90CQkqaHcgPSB3bGFuZGV2LT5wcml2OwotICAgICAgICBwODAyMTFtc2dfcDJyZXFfbG93X2xldmVsX3QgICAgICptc2cgPSBtc2dwOwotCWhmYTM4NHhfbWV0YWNtZF90IGNtZDsKLSAgICAgICAgREJGRU5URVI7Ci0KLSAgICAgICAgbXNnLT5yZXN1bHRjb2RlLnN0YXR1cyA9IFA4MDIxMUVOVU1fbXNnaXRlbV9zdGF0dXNfZGF0YV9vazsKLQotICAgICAgICAvKiBjYWxsIHNvbWUgcm91dGluZSB0byBleGVjdXRlIHRoZSB0ZXN0IGNvbW1hbmQgKi8KLQljbWQuY21kID0gKFVJTlQxNikgbXNnLT5jb21tYW5kLmRhdGE7Ci0JY21kLnBhcm0wID0gKFVJTlQxNikgbXNnLT5wYXJhbTAuZGF0YTsKLQljbWQucGFybTEgPSAoVUlOVDE2KSBtc2ctPnBhcmFtMS5kYXRhOwotCWNtZC5wYXJtMiA9IChVSU5UMTYpIG1zZy0+cGFyYW0yLmRhdGE7Ci0KLSAgICAgICAgaGZhMzg0eF9kcnZyX2xvd19sZXZlbChodywmY21kKTsKLQotICAgICAgICBtc2ctPnJlc3AwLmRhdGEgPSAoVUlOVDMyKSBjbWQucmVzdWx0LnJlc3AwOwotICAgICAgICBtc2ctPnJlc3AxLmRhdGEgPSAoVUlOVDMyKSBjbWQucmVzdWx0LnJlc3AxOwotICAgICAgICBtc2ctPnJlc3AyLmRhdGEgPSAoVUlOVDMyKSBjbWQucmVzdWx0LnJlc3AyOwotCi0gICAgICAgIG1zZy0+cmVzdWx0Y29kZS5kYXRhID0gUDgwMjExRU5VTV9yZXN1bHRjb2RlX3N1Y2Nlc3M7Ci0KLSAgICAgICAgREJGRVhJVDsKLSAgICAgICAgcmV0dXJuIDA7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBwcmlzbTJtZ210X3Rlc3RfY29tbWFuZAotKgotKiBQdXRzIHRoZSBjYXJkIGludG8gdGhlIGRlc2lyZWQgdGVzdCBtb2RlLgotKgotKiBBcmd1bWVudHM6Ci0qCXdsYW5kZXYJCXdsYW4gZGV2aWNlIHN0cnVjdHVyZQotKgltc2dwCQlwdHIgdG8gbXNnIGJ1ZmZlcgotKgotKiBSZXR1cm5zOgotKgkwCXN1Y2Nlc3MgYW5kIGRvbmUKLSoJPDAJc3VjY2VzcywgYnV0IHdlJ3JlIHdhaXRpbmcgZm9yIHNvbWV0aGluZyB0byBmaW5pc2guCi0qCT4wCWFuIGVycm9yIG9jY3VycmVkIHdoaWxlIGhhbmRsaW5nIHRoZSBtZXNzYWdlLgotKiBTaWRlIGVmZmVjdHM6Ci0qCi0qIENhbGwgY29udGV4dDoKLSoJcHJvY2VzcyB0aHJlYWQgICh1c3VhbGx5KQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgcHJpc20ybWdtdF90ZXN0X2NvbW1hbmQod2xhbmRldmljZV90ICp3bGFuZGV2LCB2b2lkICptc2dwKQotewotCWhmYTM4NHhfdAkJKmh3ID0gd2xhbmRldi0+cHJpdjsKLQlwODAyMTFtc2dfcDJyZXFfdGVzdF9jb21tYW5kX3QJKm1zZyA9IG1zZ3A7Ci0JaGZhMzg0eF9tZXRhY21kX3QgY21kOwotCi0gICAgICAgIERCRkVOVEVSOwotCi0JY21kLmNtZCA9ICgoVUlOVDE2KSBtc2ctPnRlc3Rjb2RlLmRhdGEpIDw8IDggfCAweDM4OwotCWNtZC5wYXJtMCA9IChVSU5UMTYpIG1zZy0+dGVzdHBhcmFtLmRhdGE7Ci0JY21kLnBhcm0xID0gMDsKLQljbWQucGFybTIgPSAwOwotCi0gICAgICAgIC8qIGNhbGwgc29tZSByb3V0aW5lIHRvIGV4ZWN1dGUgdGhlIHRlc3QgY29tbWFuZCAqLwotCi0gICAgICAgIGhmYTM4NHhfZHJ2cl9sb3dfbGV2ZWwoaHcsJmNtZCk7Ci0KLSAgICAgICAgbXNnLT5yZXN1bHRjb2RlLnN0YXR1cyA9IFA4MDIxMUVOVU1fbXNnaXRlbV9zdGF0dXNfZGF0YV9vazsKLSAgICAgICAgbXNnLT5yZXN1bHRjb2RlLmRhdGEgPSBQODAyMTFFTlVNX3Jlc3VsdGNvZGVfc3VjY2VzczsKLQotICAgICAgICBtc2ctPnN0YXR1cy5zdGF0dXMgPSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2s7Ci0gICAgICAgIG1zZy0+c3RhdHVzLmRhdGEgPSBjbWQucmVzdWx0LnN0YXR1czsKLSAgICAgICAgbXNnLT5yZXNwMC5zdGF0dXMgPSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2s7Ci0gICAgICAgIG1zZy0+cmVzcDAuZGF0YSA9IGNtZC5yZXN1bHQucmVzcDA7Ci0gICAgICAgIG1zZy0+cmVzcDEuc3RhdHVzID0gUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19kYXRhX29rOwotICAgICAgICBtc2ctPnJlc3AxLmRhdGEgPSBjbWQucmVzdWx0LnJlc3AxOwotICAgICAgICBtc2ctPnJlc3AyLnN0YXR1cyA9IFA4MDIxMUVOVU1fbXNnaXRlbV9zdGF0dXNfZGF0YV9vazsKLSAgICAgICAgbXNnLT5yZXNwMi5kYXRhID0gY21kLnJlc3VsdC5yZXNwMjsKLQotCURCRkVYSVQ7Ci0JcmV0dXJuIDA7Ci19Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIHByaXNtMm1nbXRfbW1pX3JlYWQKLSoKLSogUmVhZCBmcm9tIG9uZSBvZiB0aGUgTU1JIHJlZ2lzdGVycy4KLSoKLSogQXJndW1lbnRzOgotKgl3bGFuZGV2CQl3bGFuIGRldmljZSBzdHJ1Y3R1cmUKLSoJbXNncAkJcHRyIHRvIG1zZyBidWZmZXIKLSoKLSogUmV0dXJuczoKLSoJMAlzdWNjZXNzIGFuZCBkb25lCi0qCTwwCXN1Y2Nlc3MsIGJ1dCB3ZSdyZSB3YWl0aW5nIGZvciBzb21ldGhpbmcgdG8gZmluaXNoLgotKgk+MAlhbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBoYW5kbGluZyB0aGUgbWVzc2FnZS4KLSogU2lkZSBlZmZlY3RzOgotKgotKiBDYWxsIGNvbnRleHQ6Ci0qCXByb2Nlc3MgdGhyZWFkICAodXN1YWxseSkKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IHByaXNtMm1nbXRfbW1pX3JlYWQod2xhbmRldmljZV90ICp3bGFuZGV2LCB2b2lkICptc2dwKQotewotCWhmYTM4NHhfdAkJKmh3ID0gd2xhbmRldi0+cHJpdjsKLQlwODAyMTFtc2dfcDJyZXFfbW1pX3JlYWRfdAkqbXNnID0gbXNncDsKLQlVSU5UMzIgcmVzcCA9IDA7Ci0KLQlEQkZFTlRFUjsKLQotCW1zZy0+cmVzdWx0Y29kZS5zdGF0dXMgPSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2s7Ci0KLQkvKiBjYWxsIHNvbWUgcm91dGluZSB0byBleGVjdXRlIHRoZSB0ZXN0IGNvbW1hbmQgKi8KLQotCWhmYTM4NHhfZHJ2cl9tbWlfcmVhZChodywgbXNnLT5hZGRyLmRhdGEsICZyZXNwKTsKLQotCS8qIEknbSBub3Qgc3VyZSBpZiB0aGlzIGlzICJhcmNoaXRlY3R1cmFsbHkiIGNvcnJlY3QsIGJ1dCBpdAotICAgICAgICAgICBpcyBleHBlZGllbnQuICovCi0KLQltc2ctPnZhbHVlLnN0YXR1cyA9IFA4MDIxMUVOVU1fbXNnaXRlbV9zdGF0dXNfZGF0YV9vazsKLQltc2ctPnZhbHVlLmRhdGEgPSByZXNwOwotCW1zZy0+cmVzdWx0Y29kZS5kYXRhID0gUDgwMjExRU5VTV9yZXN1bHRjb2RlX3N1Y2Nlc3M7Ci0KLQlEQkZFWElUOwotCXJldHVybiAwOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogcHJpc20ybWdtdF9tbWlfd3JpdGUKLSoKLSogV3JpdGUgYSBkYXRhIHZhbHVlIHRvIG9uZSBvZiB0aGUgTU1JIHJlZ2lzdGVycy4KLSoKLSogQXJndW1lbnRzOgotKgl3bGFuZGV2CQl3bGFuIGRldmljZSBzdHJ1Y3R1cmUKLSoJbXNncAkJcHRyIHRvIG1zZyBidWZmZXIKLSoKLSogUmV0dXJuczoKLSoJMAlzdWNjZXNzIGFuZCBkb25lCi0qCTwwCXN1Y2Nlc3MsIGJ1dCB3ZSdyZSB3YWl0aW5nIGZvciBzb21ldGhpbmcgdG8gZmluaXNoLgotKgk+MAlhbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBoYW5kbGluZyB0aGUgbWVzc2FnZS4KLSogU2lkZSBlZmZlY3RzOgotKgotKiBDYWxsIGNvbnRleHQ6Ci0qCXByb2Nlc3MgdGhyZWFkICAodXN1YWxseSkKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IHByaXNtMm1nbXRfbW1pX3dyaXRlKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdm9pZCAqbXNncCkKLXsKLQloZmEzODR4X3QJCSpodyA9IHdsYW5kZXYtPnByaXY7Ci0JcDgwMjExbXNnX3AycmVxX21taV93cml0ZV90CSptc2cgPSBtc2dwOwotCURCRkVOVEVSOwotCi0JbXNnLT5yZXN1bHRjb2RlLnN0YXR1cyA9IFA4MDIxMUVOVU1fbXNnaXRlbV9zdGF0dXNfZGF0YV9vazsKLQotCS8qIGNhbGwgc29tZSByb3V0aW5lIHRvIGV4ZWN1dGUgdGhlIHRlc3QgY29tbWFuZCAqLwotCi0JaGZhMzg0eF9kcnZyX21taV93cml0ZShodywgbXNnLT5hZGRyLmRhdGEsIG1zZy0+ZGF0YS5kYXRhKTsKLQotCW1zZy0+cmVzdWx0Y29kZS5kYXRhID0gUDgwMjExRU5VTV9yZXN1bHRjb2RlX3N1Y2Nlc3M7Ci0KLQlEQkZFWElUOwotCXJldHVybiAwOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogcHJpc20ybWdtdF9yYW1kbF9zdGF0ZQogKgogKiBFc3RhYmxpc2hlcyB0aGUgYmVnaW5uaW5nL2VuZCBvZiBhIGNhcmQgUkFNIGRvd25sb2FkIHNlc3Npb24uCkBAIC0yMTc5LDkgKzgzOCw5IEBACiB7CiAJaGZhMzg0eF90CQkqaHcgPSB3bGFuZGV2LT5wcml2OwogCXA4MDIxMW1zZ19wMnJlcV9yYW1kbF93cml0ZV90CSptc2cgPSBtc2dwOwotCVVJTlQzMgkJCWFkZHI7Ci0JVUlOVDMyCQkJbGVuOwotCVVJTlQ4CQkJKmJ1ZjsKKwl1MzIJCQlhZGRyOworCXUzMgkJCWxlbjsKKwl1OAkJCSpidWY7CiAJREJGRU5URVI7CiAKIAlpZiAod2xhbmRldi0+bXNkc3RhdGUgIT0gV0xBTl9NU0RfRldMT0FEKSB7CkBAIC0yMzE5LDkgKzk3OCw5IEBACiB7CiAJaGZhMzg0eF90CQkqaHcgPSB3bGFuZGV2LT5wcml2OwogCXA4MDIxMW1zZ19wMnJlcV9mbGFzaGRsX3dyaXRlX3QJKm1zZyA9IG1zZ3A7Ci0JVUlOVDMyCQkJYWRkcjsKLQlVSU5UMzIJCQlsZW47Ci0JVUlOVDgJCQkqYnVmOworCXUzMgkJCWFkZHI7CisJdTMyCQkJbGVuOworCXU4CQkJKmJ1ZjsKIAlEQkZFTlRFUjsKIAogCWlmICh3bGFuZGV2LT5tc2RzdGF0ZSAhPSBXTEFOX01TRF9GV0xPQUQpIHsKQEAgLTIzNjEsMjQ3ICsxMDIwLDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogcHJpc20ybWdtdF9kdW1wX3N0YXRlCi0qCi0qIER1bXBzIHRoZSBkcml2ZXIncyBhbmQgaGFyZHdhcmUncyBjdXJyZW50IHN0YXRlIHZpYSB0aGUga2VybmVsCi0qIGxvZyBhdCBLRVJOX05PVElDRSBsZXZlbC4KLSoKLSogQXJndW1lbnRzOgotKgl3bGFuZGV2CQl3bGFuIGRldmljZSBzdHJ1Y3R1cmUKLSoJbXNncAkJcHRyIHRvIG1zZyBidWZmZXIKLSoKLSogUmV0dXJuczoKLSoJMAlzdWNjZXNzIGFuZCBkb25lCi0qCTwwCXN1Y2Nlc3MsIGJ1dCB3ZSdyZSB3YWl0aW5nIGZvciBzb21ldGhpbmcgdG8gZmluaXNoLgotKgk+MAlhbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBoYW5kbGluZyB0aGUgbWVzc2FnZS4KLSogU2lkZSBlZmZlY3RzOgotKgotKiBDYWxsIGNvbnRleHQ6Ci0qCXByb2Nlc3MgdGhyZWFkICAodXN1YWxseSkKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IHByaXNtMm1nbXRfZHVtcF9zdGF0ZSh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHZvaWQgKm1zZ3ApCi17Ci0JcDgwMjExbXNnX3AycmVxX2R1bXBfc3RhdGVfdAkqbXNnID0gbXNncDsKLQlpbnQJCQkJcmVzdWx0ID0gMDsKLQotI2lmIChXTEFOX0hPU1RJRiAhPSBXTEFOX1VTQikKLQloZmEzODR4X3QJCSpodyA9IHdsYW5kZXYtPnByaXY7Ci0JVUlOVDE2CQkJCWF1eGJ1ZlsxNV07Ci0JREJGRU5URVI7Ci0KLQlXTEFOX0xPR19OT1RJQ0UoInByaXNtMiBkcml2ZXIgYW5kIGhhcmR3YXJlIHN0YXRlOlxuIik7Ci0JaWYgICggKHJlc3VsdCA9IGhmYTM4NHhfY21kX2F1eF9lbmFibGUoaHcsIDApKSApIHsKLQkJV0xBTl9MT0dfRVJST1IoImF1eF9lbmFibGUgZmFpbGVkLCByZXN1bHQ9JWRcbiIsIHJlc3VsdCk7Ci0JCWdvdG8gZmFpbGVkOwotCX0KLQloZmEzODR4X2NvcHlfZnJvbV9hdXgoaHcsCi0JCTB4MDFlMiwKLQkJSEZBMzg0eF9BVVhfQ1RMX0VYVERTLAotCQlhdXhidWYsCi0JCXNpemVvZihhdXhidWYpKTsKLQloZmEzODR4X2NtZF9hdXhfZGlzYWJsZShodyk7Ci0JV0xBTl9MT0dfTk9USUNFKCIgIGNtYWM6IEZyZWVCbG9ja3M9JWRcbiIsIGF1eGJ1Zls1XSk7Ci0JV0xBTl9MT0dfTk9USUNFKCIgIGNtYWM6IEludEVuPTB4JTAyeCBFdlN0YXQ9MHglMDJ4XG4iLAotCQloZmEzODR4X2dldHJlZyhodywgSEZBMzg0eF9JTlRFTiksCi0JCWhmYTM4NHhfZ2V0cmVnKGh3LCBIRkEzODR4X0VWU1RBVCkpOwotCi0JI2lmZGVmIFVTRV9GSURfU1RBQ0sKLQlXTEFOX0xPR19OT1RJQ0UoIiAgZHJ2cjogdHhmaWRfdG9wPSVkIHN0YWNrc2l6ZT0lZFxuIiwKLQkJaHctPnR4ZmlkX3RvcCxIRkEzODR4X0RSVlJfRklEU1RBQ0tMRU5fTUFYKTsKLQkjZWxzZQotCVdMQU5fTE9HX05PVElDRSgiICBkcnZyOiB0eGZpZF9oZWFkPSVkIHR4ZmlkX3RhaWw9JWQgdHhmaWRfTj0lZFxuIiwKLQkJaHctPnR4ZmlkX2hlYWQsIGh3LT50eGZpZF90YWlsLCBody0+dHhmaWRfTik7Ci0JI2VuZGlmCi0KLQltc2ctPnJlc3VsdGNvZGUuc3RhdHVzID0gUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19kYXRhX29rOwotCW1zZy0+cmVzdWx0Y29kZS5kYXRhID0gUDgwMjExRU5VTV9yZXN1bHRjb2RlX3N1Y2Nlc3M7Ci0KLSNlbHNlIC8qIChXTEFOX0hPU1RJRiA9PSBXTEFOX1VTQikgKi8KLQotCURCRkVOVEVSOwotCi0JbXNnLT5yZXN1bHRjb2RlLnN0YXR1cyA9IFA4MDIxMUVOVU1fbXNnaXRlbV9zdGF0dXNfZGF0YV9vazsKLQltc2ctPnJlc3VsdGNvZGUuZGF0YSA9IFA4MDIxMUVOVU1fcmVzdWx0Y29kZV9ub3Rfc3VwcG9ydGVkOwotCWdvdG8gZmFpbGVkOwotCi0jZW5kaWYgLyogKFdMQU5fSE9TVElGICE9IFdMQU5fVVNCKSAqLwotCi1mYWlsZWQ6Ci0JREJGRVhJVDsKLQlyZXR1cm4gcmVzdWx0OwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogcHJpc20ybWdtdF9jaGFubmVsX2luZm8KLSoKLSogSXNzdWVzIGEgQ2hhbm5lbEluZm9SZXF1ZXN0LgotKgotKiBBcmd1bWVudHM6Ci0qCXdsYW5kZXYJCXdsYW4gZGV2aWNlIHN0cnVjdHVyZQotKgltc2dwCQlwdHIgdG8gbXNnIGJ1ZmZlcgotKgotKiBSZXR1cm5zOgotKgkwCXN1Y2Nlc3MgYW5kIGRvbmUKLSoJPDAJc3VjY2VzcywgYnV0IHdlJ3JlIHdhaXRpbmcgZm9yIHNvbWV0aGluZyB0byBmaW5pc2guCi0qCT4wCWFuIGVycm9yIG9jY3VycmVkIHdoaWxlIGhhbmRsaW5nIHRoZSBtZXNzYWdlLgotKiBTaWRlIGVmZmVjdHM6Ci0qCi0qIENhbGwgY29udGV4dDoKLSoJcHJvY2VzcyB0aHJlYWQgICh1c3VhbGx5KQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgcHJpc20ybWdtdF9jaGFubmVsX2luZm8od2xhbmRldmljZV90ICp3bGFuZGV2LCB2b2lkICptc2dwKQotewotCXA4MDIxMW1zZ19wMnJlcV9jaGFubmVsX2luZm9fdAkqbXNnPW1zZ3A7Ci0JaGZhMzg0eF90CQkJKmh3ID0gd2xhbmRldi0+cHJpdjsKLQlpbnQJCQkJcmVzdWx0LCBpLCBuPTA7Ci0JVUlOVDE2CQkJCWNoYW5uZWxfbWFzaz0wOwotCWhmYTM4NHhfQ2hhbm5lbEluZm9SZXF1ZXN0X2RhdGFfdAljaGluZm9yZXE7Ci0JLy8gdW5zaWduZWQgbG9uZyAJCQlub3c7Ci0KLQlEQkZFTlRFUjsKLQotCWlmICghaHctPmFwKSB7Ci0KLQkJLyoqKiBTVEFUSU9OICoqKi8KLQotCQkvKiBOb3Qgc3VwcG9ydGVkIGluIFNUQSBmL3cgKi8KLQkJUDgwMjExX1NFVF9JTlQobXNnLT5yZXN1bHRjb2RlLCBQODAyMTFFTlVNX3Jlc3VsdGNvZGVfbm90X3N1cHBvcnRlZCk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQkvKioqIEFDQ0VTUyBQT0lOVCAqKiovCi0KLSNkZWZpbmUgQ0hJTkZPX1RJTUVPVVQgMgotCi0JUDgwMjExX1NFVF9JTlQobXNnLT5yZXN1bHRjb2RlLCBQODAyMTFFTlVNX3Jlc3VsdGNvZGVfc3VjY2Vzcyk7Ci0KLQkvKiBzZXR0aW5nIGRlZmF1bHQgdmFsdWUgZm9yIGNoYW5uZWxsaXN0ID0gYWxsIGNoYW5uZWxzICovCi0JaWYgKCFtc2ctPmNoYW5uZWxsaXN0LmRhdGEpIHsKLQkJUDgwMjExX1NFVF9JTlQobXNnLT5jaGFubmVsbGlzdCwgMHgwMDAwN0ZGRSk7Ci0JfQotCS8qIHNldHRpbmcgZGVmYXVsdCB2YWx1ZSBmb3IgY2hhbm5lbGR3ZWxsdGltZSA9IDEwMCBtcyAqLwotCWlmICghbXNnLT5jaGFubmVsZHdlbGx0aW1lLmRhdGEpIHsKLQkJUDgwMjExX1NFVF9JTlQobXNnLT5jaGFubmVsZHdlbGx0aW1lLCAxMDApOwotCX0KLQljaGFubmVsX21hc2sgPSAoVUlOVDE2KSAobXNnLT5jaGFubmVsbGlzdC5kYXRhID4+IDEpOwotCWZvciAoaT0wLCBuPTA7IGkgPCAxNDsgaSsrKSB7Ci0JCWlmIChjaGFubmVsX21hc2sgJiAoMTw8aSkpIHsKLQkJCW4rKzsKLQkJfQotCX0KLQlQODAyMTFfU0VUX0lOVChtc2ctPm51bWNoaW5mbywgbik7Ci0JY2hpbmZvcmVxLmNoYW5uZWxMaXN0ID0gaG9zdDJoZmEzODR4XzE2KGNoYW5uZWxfbWFzayk7Ci0JY2hpbmZvcmVxLmNoYW5uZWxEd2VsbFRpbWUgPSBob3N0MmhmYTM4NHhfMTYobXNnLT5jaGFubmVsZHdlbGx0aW1lLmRhdGEpOwotCi0JYXRvbWljX3NldCgmaHctPmNoYW5uZWxfaW5mby5kb25lLCAxKTsKLQotCXJlc3VsdCA9IGhmYTM4NHhfZHJ2cl9zZXRjb25maWcoIGh3LCBIRkEzODR4X1JJRF9DSEFOTkVMSU5GT1JFUVVFU1QsCi0JCQkJCSAmY2hpbmZvcmVxLCBIRkEzODR4X1JJRF9DSEFOTkVMSU5GT1JFUVVFU1RfTEVOKTsKLQlpZiAoIHJlc3VsdCApIHsKLQkJV0xBTl9MT0dfRVJST1IoInNldGNvbmZpZyhDSEFOTkVMSU5GT1JFUVVFU1QpIGZhaWxlZC4gcmVzdWx0PSVkXG4iLAotCQkJCXJlc3VsdCk7Ci0JCW1zZy0+cmVzdWx0Y29kZS5kYXRhID0gUDgwMjExRU5VTV9yZXN1bHRjb2RlX25vdF9zdXBwb3J0ZWQ7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JLyoKLQlub3cgPSBqaWZmaWVzOwotCXdoaWxlIChhdG9taWNfcmVhZCgmaHctPmNoYW5uZWxfaW5mby5kb25lKSAhPSAxKSB7Ci0JCWlmICgoamlmZmllcyAtIG5vdykgPiBDSElORk9fVElNRU9VVCpIWikgewotCQkJV0xBTl9MT0dfTk9USUNFKCJDaGFubmVsSW5mbyByZXN1bHRzIG5vdCByZWNlaXZlZCBpbiAlZCBzZWNvbmRzLCBhYm9ydGluZy5cbiIsCi0JCQkJCUNISU5GT19USU1FT1VUKTsKLQkJCW1zZy0+cmVzdWx0Y29kZS5kYXRhID0gUDgwMjExRU5VTV9yZXN1bHRjb2RlX3RpbWVvdXQ7Ci0JCQlnb3RvIGRvbmU7Ci0JCX0KLQkJY3VycmVudC0+c3RhdGUgPSBUQVNLX0lOVEVSUlVQVElCTEU7Ci0JCXNjaGVkdWxlX3RpbWVvdXQoSFovNCk7Ci0JCWN1cnJlbnQtPnN0YXRlID0gVEFTS19SVU5OSU5HOwotCX0KLQkqLwotCi1kb25lOgotCi0JREJGRVhJVDsKLQlyZXR1cm4gMDsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIHByaXNtMm1nbXRfY2hhbm5lbF9pbmZvX3Jlc3VsdHMKLSoKLSogUmV0dXJucyByZXF1aXJlZCBDaGFubmVsSW5mbyByZXN1bHQuCi0qCi0qIEFyZ3VtZW50czoKLSoJd2xhbmRldgkJd2xhbiBkZXZpY2Ugc3RydWN0dXJlCi0qCW1zZ3AJCXB0ciB0byBtc2cgYnVmZmVyCi0qCi0qIFJldHVybnM6Ci0qCTAJc3VjY2VzcyBhbmQgZG9uZQotKgk8MAlzdWNjZXNzLCBidXQgd2UncmUgd2FpdGluZyBmb3Igc29tZXRoaW5nIHRvIGZpbmlzaC4KLSoJPjAJYW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgaGFuZGxpbmcgdGhlIG1lc3NhZ2UuCi0qIFNpZGUgZWZmZWN0czoKLSoKLSogQ2FsbCBjb250ZXh0OgotKglwcm9jZXNzIHRocmVhZCAgKHVzdWFsbHkpCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCBwcmlzbTJtZ210X2NoYW5uZWxfaW5mb19yZXN1bHRzKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdm9pZCAqbXNncCkKLXsKLQloZmEzODR4X3QJCQkqaHcgPSB3bGFuZGV2LT5wcml2OwotCi0JcDgwMjExbXNnX3AycmVxX2NoYW5uZWxfaW5mb19yZXN1bHRzX3QJKm1zZz1tc2dwOwotCWludAkJCQlyZXN1bHQ9MDsKLQlpbnQJCWNoYW5uZWw7Ci0KLQlEQkZFTlRFUjsKLQotCWlmICghaHctPmFwKSB7Ci0KLQkJLyoqKiBTVEFUSU9OICoqKi8KLQotCQkvKiBOb3Qgc3VwcG9ydGVkIGluIFNUQSBmL3cgKi8KLQkJUDgwMjExX1NFVF9JTlQobXNnLT5yZXN1bHRjb2RlLCBQODAyMTFFTlVNX3Jlc3VsdGNvZGVfbm90X3N1cHBvcnRlZCk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQkvKioqIEFDQ0VTUyBQT0lOVCAqKiovCi0KLQlzd2l0Y2ggKGF0b21pY19yZWFkKCZody0+Y2hhbm5lbF9pbmZvLmRvbmUpKSB7Ci0JY2FzZSAwOiBtc2ctPnJlc3VsdGNvZGUuc3RhdHVzID0gUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19ub192YWx1ZTsKLQkJZ290byBkb25lOwotCWNhc2UgMTogbXNnLT5yZXN1bHRjb2RlLnN0YXR1cyA9IFA4MDIxMUVOVU1fbXNnaXRlbV9zdGF0dXNfaW5jb21wbGV0ZV9pdGVtZGF0YTsKLQkJZ290byBkb25lOwotCX0KLQotCVA4MDIxMV9TRVRfSU5UKG1zZy0+cmVzdWx0Y29kZSwgUDgwMjExRU5VTV9yZXN1bHRjb2RlX3N1Y2Nlc3MpOwotCWNoYW5uZWw9bXNnLT5jaGFubmVsLmRhdGEtMTsKLQotCWlmIChjaGFubmVsIDwgMCB8fCAhIChody0+Y2hhbm5lbF9pbmZvLnJlc3VsdHMuc2NhbmNoYW5uZWxzICYgMTw8Y2hhbm5lbCkgKSB7Ci0JCW1zZy0+cmVzdWx0Y29kZS5kYXRhID0gUDgwMjExRU5VTV9yZXN1bHRjb2RlX2ludmFsaWRfcGFyYW1ldGVyczsKLQkJZ290byBkb25lOwotCX0KLQlXTEFOX0xPR19ERUJVRygyLCAiY2hpbmZvX3Jlc3VsdHM6IGNoYW5uZWwgJWQsIGF2Zy9wZWFrIGxldmVsPSVkLyVkIGRCLCBhY3RpdmU9JWRcbiIsCi0JCQljaGFubmVsKzEsCi0JCQlody0+Y2hhbm5lbF9pbmZvLnJlc3VsdHMucmVzdWx0W2NoYW5uZWxdLmFubCwKLQkJCWh3LT5jaGFubmVsX2luZm8ucmVzdWx0cy5yZXN1bHRbY2hhbm5lbF0ucG5sLAotCQkJaHctPmNoYW5uZWxfaW5mby5yZXN1bHRzLnJlc3VsdFtjaGFubmVsXS5hY3RpdmUKLQkJKTsKLQlQODAyMTFfU0VUX0lOVChtc2ctPmF2Z25vaXNlbGV2ZWwsIGh3LT5jaGFubmVsX2luZm8ucmVzdWx0cy5yZXN1bHRbY2hhbm5lbF0uYW5sKTsKLQlQODAyMTFfU0VUX0lOVChtc2ctPnBlYWtub2lzZWxldmVsLCBody0+Y2hhbm5lbF9pbmZvLnJlc3VsdHMucmVzdWx0W2NoYW5uZWxdLnBubCk7Ci0JUDgwMjExX1NFVF9JTlQobXNnLT5ic3NhY3RpdmUsIGh3LT5jaGFubmVsX2luZm8ucmVzdWx0cy5yZXN1bHRbY2hhbm5lbF0uYWN0aXZlICYKLQkJSEZBMzg0eF9DSElORk9SRVNVTFRfQlNTQUNUSVZFCi0gICAgICAgICAgICAgICAgPyBQODAyMTFFTlVNX3RydXRoX3RydWUKLSAgICAgICAgICAgICAgICA6IFA4MDIxMUVOVU1fdHJ1dGhfZmFsc2UpIDsKLQlQODAyMTFfU0VUX0lOVChtc2ctPnBjZmFjdGl2ZSwgaHctPmNoYW5uZWxfaW5mby5yZXN1bHRzLnJlc3VsdFtjaGFubmVsXS5hY3RpdmUgJgotCQlIRkEzODR4X0NISU5GT1JFU1VMVF9QQ0ZBQ1RJVkUKLSAgICAgICAgICAgICAgICA/IFA4MDIxMUVOVU1fdHJ1dGhfdHJ1ZQotICAgICAgICAgICAgICAgIDogUDgwMjExRU5VTV90cnV0aF9mYWxzZSkgOwotCi1kb25lOgotCURCRkVYSVQ7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogcHJpc20ybWdtdF9hdXRvam9pbgogKgpAQCAtMjYyNSwxMSArMTA0MywxMSBAQAogewogCWhmYTM4NHhfdAkJCSpodyA9IHdsYW5kZXYtPnByaXY7CiAJaW50IAkJCXJlc3VsdCA9IDA7Ci0JVUlOVDE2CQkJcmVnOwotCVVJTlQxNgkJCXBvcnRfdHlwZTsKKwl1MTYJCQlyZWc7CisJdTE2CQkJcG9ydF90eXBlOwogCXA4MDIxMW1zZ19sbnhyZXFfYXV0b2pvaW5fdAkqbXNnID0gbXNncDsKIAlwODAyMTFwc3RyZF90CQkqcHN0cjsKLQlVSU5UOAkJCWJ5dGVidWZbMjU2XTsKKwl1OAkJCWJ5dGVidWZbMjU2XTsKIAloZmEzODR4X2J5dGVzdHJfdAkqcDJieXRlc3RyID0gKGhmYTM4NHhfYnl0ZXN0cl90KilieXRlYnVmOwogCURCRkVOVEVSOwogCkBAIC0yNjM4LDE2ICsxMDU2LDYgQEAKIAkvKiBTZXQgdGhlIFNTSUQgKi8KIAltZW1jcHkoJndsYW5kZXYtPnNzaWQsICZtc2ctPnNzaWQuZGF0YSwgc2l6ZW9mKG1zZy0+c3NpZC5kYXRhKSk7CiAKLQlpZiAoaHctPmFwKSB7Ci0KLQkJLyoqKiBBQ0NFU1MgUE9JTlQgKioqLwotCi0JCS8qIE5ldmVyIHN1cHBvcnRlZCBvbiBBUCAqLwotCQltc2ctPnJlc3VsdGNvZGUuc3RhdHVzID0gUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19kYXRhX29rOwotCQltc2ctPnJlc3VsdGNvZGUuZGF0YSA9IFA4MDIxMUVOVU1fcmVzdWx0Y29kZV9ub3Rfc3VwcG9ydGVkOwotCQlnb3RvIGRvbmU7Ci0JfQotCiAJLyogRGlzYWJsZSB0aGUgUG9ydCAqLwogCWhmYTM4NHhfZHJ2cl9kaXNhYmxlKGh3LCAwKTsKIApAQCAtMjY5OSw3ICsxMTA3LDYgQEAKIAltc2ctPnJlc3VsdGNvZGUuc3RhdHVzID0gUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19kYXRhX29rOwogCW1zZy0+cmVzdWx0Y29kZS5kYXRhID0gUDgwMjExRU5VTV9yZXN1bHRjb2RlX3N1Y2Nlc3M7CiAKLWRvbmU6CiAJREJGRVhJVDsKIAlyZXR1cm4gcmVzdWx0OwogfQpAQCAtMjczMCw3ICsxMTM3LDcgQEAKIAlwODAyMTFtc2dfbG54cmVxX3dsYW5zbmlmZl90CSptc2cgPSBtc2dwOwogCiAJaGZhMzg0eF90CQkJKmh3ID0gd2xhbmRldi0+cHJpdjsKLQlVSU5UMTYJCQl3b3JkOworCXUxNgkJCXdvcmQ7CiAKIAlEQkZFTlRFUjsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcHJpc20ybWdtdC5oIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcHJpc20ybWdtdC5oCmluZGV4IDczM2ZkOTkuLmNhZjgwOGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3ByaXNtMm1nbXQuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wcmlzbTJtZ210LmgKQEAgLTczLDEwICs3Myw2IEBACiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogLyotLS0tLS0gU3RhdGljIHZhcmlhYmxlIGV4dGVybnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAotI2lmIChXTEFOX0hPU1RJRiAhPSBXTEFOX1VTQikKLWV4dGVybiBpbnQgICAgICBwcmlzbTJfYmFwX3RpbWVvdXQ7Ci1leHRlcm4gaW50CXByaXNtMl9pcnFfZXZyZWFkX21heDsKLSNlbmRpZgogZXh0ZXJuIGludAlwcmlzbTJfZGVidWc7CiBleHRlcm4gaW50ICAgICAgcHJpc20yX3Jlc2V0X2hvbGR0aW1lOwogZXh0ZXJuIGludCAgICAgIHByaXNtMl9yZXNldF9zZXR0bGV0aW1lOwpAQCAtODQsOCArODAsOCBAQAogLyotLS0gRnVuY3Rpb24gRGVjbGFyYXRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAKLVVJTlQzMgotcHJpc20yc3RhX2lmc3RhdGUod2xhbmRldmljZV90ICp3bGFuZGV2LCBVSU5UMzIgaWZzdGF0ZSk7Cit1MzIKK3ByaXNtMnN0YV9pZnN0YXRlKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdTMyIGlmc3RhdGUpOwogCiB2b2lkCiBwcmlzbTJzdGFfZXZfZHRpbSh3bGFuZGV2aWNlX3QgKndsYW5kZXYpOwpAQCAtOTQsNDcgKzkwLDI0IEBACiB2b2lkCiBwcmlzbTJzdGFfZXZfaW5mbyh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIGhmYTM4NHhfSW5mRnJhbWVfdCAqaW5mKTsKIHZvaWQKLXByaXNtMnN0YV9ldl90eGV4Yyh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIFVJTlQxNiBzdGF0dXMpOworcHJpc20yc3RhX2V2X3R4ZXhjKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdTE2IHN0YXR1cyk7CiB2b2lkCi1wcmlzbTJzdGFfZXZfdHgod2xhbmRldmljZV90ICp3bGFuZGV2LCBVSU5UMTYgc3RhdHVzKTsKK3ByaXNtMnN0YV9ldl90eCh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHUxNiBzdGF0dXMpOwogdm9pZAogcHJpc20yc3RhX2V2X3J4KHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYik7CiB2b2lkCiBwcmlzbTJzdGFfZXZfYWxsb2Mod2xhbmRldmljZV90ICp3bGFuZGV2KTsKIAotCiBpbnQgcHJpc20ybWdtdF9taWJzZXRfbWliZ2V0KHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdm9pZCAqbXNncCk7Ci1pbnQgcHJpc20ybWdtdF9wb3dlcm1nbXQod2xhbmRldmljZV90ICp3bGFuZGV2LCB2b2lkICptc2dwKTsKIGludCBwcmlzbTJtZ210X3NjYW4od2xhbmRldmljZV90ICp3bGFuZGV2LCB2b2lkICptc2dwKTsKIGludCBwcmlzbTJtZ210X3NjYW5fcmVzdWx0cyh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHZvaWQgKm1zZ3ApOwotaW50IHByaXNtMm1nbXRfam9pbih3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHZvaWQgKm1zZ3ApOwotaW50IHByaXNtMm1nbXRfcDJfam9pbih3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHZvaWQgKm1zZ3ApOwotaW50IHByaXNtMm1nbXRfYXV0aGVudGljYXRlKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdm9pZCAqbXNncCk7Ci1pbnQgcHJpc20ybWdtdF9kZWF1dGhlbnRpY2F0ZSh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHZvaWQgKm1zZ3ApOwotaW50IHByaXNtMm1nbXRfYXNzb2NpYXRlKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdm9pZCAqbXNncCk7Ci1pbnQgcHJpc20ybWdtdF9yZWFzc29jaWF0ZSh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHZvaWQgKm1zZ3ApOwotaW50IHByaXNtMm1nbXRfZGlzYXNzb2NpYXRlKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdm9pZCAqbXNncCk7Ci1pbnQgcHJpc20ybWdtdF9yZXNldCh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHZvaWQgKm1zZ3ApOwogaW50IHByaXNtMm1nbXRfc3RhcnQod2xhbmRldmljZV90ICp3bGFuZGV2LCB2b2lkICptc2dwKTsKIGludCBwcmlzbTJtZ210X3dsYW5zbmlmZih3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHZvaWQgKm1zZ3ApOwogaW50IHByaXNtMm1nbXRfcmVhZHBkYSh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHZvaWQgKm1zZ3ApOwotaW50IHByaXNtMm1nbXRfcmVhZGNpcyh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHZvaWQgKm1zZ3ApOwotaW50IHByaXNtMm1nbXRfYXV4cG9ydF9zdGF0ZSh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHZvaWQgKm1zZ3ApOwotaW50IHByaXNtMm1nbXRfYXV4cG9ydF9yZWFkKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdm9pZCAqbXNncCk7Ci1pbnQgcHJpc20ybWdtdF9hdXhwb3J0X3dyaXRlKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdm9pZCAqbXNncCk7Ci1pbnQgcHJpc20ybWdtdF9sb3dfbGV2ZWwod2xhbmRldmljZV90ICp3bGFuZGV2LCB2b2lkICptc2dwKTsKLWludCBwcmlzbTJtZ210X3Rlc3RfY29tbWFuZCh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHZvaWQgKm1zZ3ApOwotaW50IHByaXNtMm1nbXRfbW1pX3JlYWQod2xhbmRldmljZV90ICp3bGFuZGV2LCB2b2lkICptc2dwKTsKLWludCBwcmlzbTJtZ210X21taV93cml0ZSh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHZvaWQgKm1zZ3ApOwogaW50IHByaXNtMm1nbXRfcmFtZGxfc3RhdGUod2xhbmRldmljZV90ICp3bGFuZGV2LCB2b2lkICptc2dwKTsKIGludCBwcmlzbTJtZ210X3JhbWRsX3dyaXRlKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdm9pZCAqbXNncCk7CiBpbnQgcHJpc20ybWdtdF9mbGFzaGRsX3N0YXRlKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdm9pZCAqbXNncCk7CiBpbnQgcHJpc20ybWdtdF9mbGFzaGRsX3dyaXRlKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdm9pZCAqbXNncCk7Ci1pbnQgcHJpc20ybWdtdF9tbV9zdGF0ZSh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHZvaWQgKm1zZ3ApOwotaW50IHByaXNtMm1nbXRfZHVtcF9zdGF0ZSh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHZvaWQgKm1zZ3ApOwotaW50IHByaXNtMm1nbXRfZW5hYmxlKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdm9pZCAqbXNncCk7Ci1pbnQgcHJpc20ybWdtdF9jaGFubmVsX2luZm8od2xhbmRldmljZV90ICp3bGFuZGV2LCB2b2lkICptc2dwKTsKLWludCBwcmlzbTJtZ210X2NoYW5uZWxfaW5mb19yZXN1bHRzKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdm9pZCAqbXNncCk7CiBpbnQgcHJpc20ybWdtdF9hdXRvam9pbih3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHZvaWQgKm1zZ3ApOwogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMTQyLDMxICsxMTUsMzEgQEAKICogUHJpc20yIGRhdGEgdHlwZXMKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKiBieXRlIGFyZWEgY29udmVyc2lvbiBmdW5jdGlvbnMqLwotdm9pZCBwcmlzbTJtZ210X3BzdHIyYnl0ZWFyZWEoVUlOVDggKmJ5dGVhcmVhLCBwODAyMTFwc3RyZF90ICpwc3RyKTsKLXZvaWQgcHJpc20ybWdtdF9ieXRlYXJlYTJwc3RyKFVJTlQ4ICpieXRlYXJlYSwgcDgwMjExcHN0cmRfdCAqcHN0ciwgaW50IGxlbik7Cit2b2lkIHByaXNtMm1nbXRfcHN0cjJieXRlYXJlYSh1OCAqYnl0ZWFyZWEsIHA4MDIxMXBzdHJkX3QgKnBzdHIpOwordm9pZCBwcmlzbTJtZ210X2J5dGVhcmVhMnBzdHIodTggKmJ5dGVhcmVhLCBwODAyMTFwc3RyZF90ICpwc3RyLCBpbnQgbGVuKTsKIAogLyogYnl0ZSBzdHJpbmcgY29udmVyc2lvbiBmdW5jdGlvbnMqLwogdm9pZCBwcmlzbTJtZ210X3BzdHIyYnl0ZXN0cihoZmEzODR4X2J5dGVzdHJfdCAqYnl0ZXN0ciwgcDgwMjExcHN0cmRfdCAqcHN0cik7CiB2b2lkIHByaXNtMm1nbXRfYnl0ZXN0cjJwc3RyKGhmYTM4NHhfYnl0ZXN0cl90ICpieXRlc3RyLCBwODAyMTFwc3RyZF90ICpwc3RyKTsKIAogLyogaW50ZWdlciBjb252ZXJzaW9uIGZ1bmN0aW9ucyAqLwotdm9pZCBwcmlzbTJtZ210X3ByaXNtMmludDJwODAyMTFpbnQoVUlOVDE2ICpwcmlzbTJpbnQsIFVJTlQzMiAqd2xhbmludCk7Ci12b2lkIHByaXNtMm1nbXRfcDgwMjExaW50MnByaXNtMmludChVSU5UMTYgKnByaXNtMmludCwgVUlOVDMyICp3bGFuaW50KTsKK3ZvaWQgcHJpc20ybWdtdF9wcmlzbTJpbnQycDgwMjExaW50KHUxNiAqcHJpc20yaW50LCB1MzIgKndsYW5pbnQpOwordm9pZCBwcmlzbTJtZ210X3A4MDIxMWludDJwcmlzbTJpbnQodTE2ICpwcmlzbTJpbnQsIHUzMiAqd2xhbmludCk7CiAKIC8qIGVudW1lcmF0ZWQgaW50ZWdlciBjb252ZXJzaW9uIGZ1bmN0aW9ucyAqLwotdm9pZCBwcmlzbTJtZ210X3ByaXNtMmVudW0ycDgwMjExZW51bShVSU5UMTYgKnByaXNtMmVudW0sIFVJTlQzMiAqd2xhbmVudW0sIFVJTlQxNiByaWQpOwotdm9pZCBwcmlzbTJtZ210X3A4MDIxMWVudW0ycHJpc20yZW51bShVSU5UMTYgKnByaXNtMmVudW0sIFVJTlQzMiAqd2xhbmVudW0sIFVJTlQxNiByaWQpOwordm9pZCBwcmlzbTJtZ210X3ByaXNtMmVudW0ycDgwMjExZW51bSh1MTYgKnByaXNtMmVudW0sIHUzMiAqd2xhbmVudW0sIHUxNiByaWQpOwordm9pZCBwcmlzbTJtZ210X3A4MDIxMWVudW0ycHJpc20yZW51bSh1MTYgKnByaXNtMmVudW0sIHUzMiAqd2xhbmVudW0sIHUxNiByaWQpOwogCiAvKiBmdW5jdGlvbnMgdG8gY29udmVydCBhIGJpdCBhcmVhIHRvL2Zyb20gYW4gT3BlcmF0aW9uYWwgUmF0ZSBTZXQgKi8KLXZvaWQgcHJpc20ybWdtdF9nZXRfb3ByYXRlc2V0KFVJTlQxNiAqcmF0ZSwgcDgwMjExcHN0cmRfdCAqcHN0cik7Ci12b2lkIHByaXNtMm1nbXRfc2V0X29wcmF0ZXNldChVSU5UMTYgKnJhdGUsIHA4MDIxMXBzdHJkX3QgKnBzdHIpOwordm9pZCBwcmlzbTJtZ210X2dldF9vcHJhdGVzZXQodTE2ICpyYXRlLCBwODAyMTFwc3RyZF90ICpwc3RyKTsKK3ZvaWQgcHJpc20ybWdtdF9zZXRfb3ByYXRlc2V0KHUxNiAqcmF0ZSwgcDgwMjExcHN0cmRfdCAqcHN0cik7CiAKIC8qIGZ1bmN0aW9ucyB0byBjb252ZXJ0IEdyb3VwIEFkZHJlc3NlcyAqLwotdm9pZCBwcmlzbTJtZ210X2dldF9ncnBhZGRyKFVJTlQzMiBkaWQsCit2b2lkIHByaXNtMm1nbXRfZ2V0X2dycGFkZHIodTMyIGRpZCwKIAlwODAyMTFwc3RyZF90ICpwc3RyLCBoZmEzODR4X3QgKnByaXYgKTsKLWludCBwcmlzbTJtZ210X3NldF9ncnBhZGRyKFVJTlQzMiBkaWQsCi0JVUlOVDggKnByaXNtMmJ1ZiwgcDgwMjExcHN0cmRfdCAqcHN0ciwgaGZhMzg0eF90ICpwcml2ICk7Ci1pbnQgcHJpc20ybWdtdF9nZXRfZ3JwYWRkcl9pbmRleCggVUlOVDMyIGRpZCApOworaW50IHByaXNtMm1nbXRfc2V0X2dycGFkZHIodTMyIGRpZCwKKwl1OCAqcHJpc20yYnVmLCBwODAyMTFwc3RyZF90ICpwc3RyLCBoZmEzODR4X3QgKnByaXYgKTsKK2ludCBwcmlzbTJtZ210X2dldF9ncnBhZGRyX2luZGV4KCB1MzIgZGlkICk7CiAKIHZvaWQgcHJpc20yc3RhX3Byb2Nlc3NpbmdfZGVmZXIoc3RydWN0IHdvcmtfc3RydWN0ICpkYXRhKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcHJpc20ybWliLmMgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wcmlzbTJtaWIuYwppbmRleCBlYWMwNmY3Li41MzljNDQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wcmlzbTJtaWIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wcmlzbTJtaWIuYwpAQCAtNTQsOSArNTQsNiBAQAogLyogU3lzdGVtIEluY2x1ZGVzICovCiAjZGVmaW5lIFdMQU5fREJWQVIJcHJpc20yX2RlYnVnCiAKLSNpbmNsdWRlICJ2ZXJzaW9uLmgiCi0KLQogI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgpAQCAtNjksMjYgKzY2LDcgQEAKICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KLQotI2luY2x1ZGUgIndsYW5fY29tcGF0LmgiCi0KLS8vI2lmIChXTEFOX0hPU1RJRiA9PSBXTEFOX1BDTUNJQSkKLS8vI2luY2x1ZGUgPHBjbWNpYS92ZXJzaW9uLmg+Ci0vLyNpbmNsdWRlIDxwY21jaWEvY3NfdHlwZXMuaD4KLS8vI2luY2x1ZGUgPHBjbWNpYS9jcy5oPgotLy8jaW5jbHVkZSA8cGNtY2lhL2Npc3RwbC5oPgotLy8jaW5jbHVkZSA8cGNtY2lhL2RzLmg+Ci0vLyNpbmNsdWRlIDxwY21jaWEvY2lzcmVnLmg+Ci0vLyNlbmRpZgotLy8KLS8vI2lmICgoV0xBTl9IT1NUSUYgPT0gV0xBTl9QTFgpIHx8IChXTEFOX0hPU1RJRiA9PSBXTEFOX1BDSSkpCi0vLyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KLS8vI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotLy9lbmRpZgotCi0vLyNpZiAoV0xBTl9IT1NUSUYgPT0gV0xBTl9VU0IpCiAjaW5jbHVkZSA8bGludXgvdXNiLmg+Ci0vLyNlbmRpZgogCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogLyogUHJvamVjdCBJbmNsdWRlcyAqLwpAQCAtMTEyLDE4ICs5MCwxNyBAQAogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KIC8qIExvY2FsIFR5cGVzICovCiAKLSNkZWZpbmUgIEZfQVAgICAgICAgICAweDEgICAgICAgIC8qIE1JQiBpcyBzdXBwb3J0ZWQgb24gQWNjZXNzIFBvaW50cy4gKi8KLSNkZWZpbmUgIEZfU1RBICAgICAgICAweDIgICAgICAgIC8qIE1JQiBpcyBzdXBwb3J0ZWQgb24gc3RhdGlvbnMuICovCi0jZGVmaW5lICBGX1JFQUQgICAgICAgMHg0ICAgICAgICAvKiBNSUIgbWF5IGJlIHJlYWQuICovCi0jZGVmaW5lICBGX1dSSVRFICAgICAgMHg4ICAgICAgICAvKiBNSUIgbWF5IGJlIHdyaXR0ZW4uICovCisjZGVmaW5lICBGX1NUQSAgICAgICAgMHgxICAgICAgICAvKiBNSUIgaXMgc3VwcG9ydGVkIG9uIHN0YXRpb25zLiAqLworI2RlZmluZSAgRl9SRUFEICAgICAgIDB4MiAgICAgICAgLyogTUlCIG1heSBiZSByZWFkLiAqLworI2RlZmluZSAgRl9XUklURSAgICAgIDB4NCAgICAgICAgLyogTUlCIG1heSBiZSB3cml0dGVuLiAqLwogCiB0eXBlZGVmIHN0cnVjdCBtaWJyZWMKIHsKLSAgICBVSU5UMzIgICBkaWQ7Ci0gICAgVUlOVDE2ICAgZmxhZzsKLSAgICBVSU5UMTYgICBwYXJtMTsKLSAgICBVSU5UMTYgICBwYXJtMjsKLSAgICBVSU5UMTYgICBwYXJtMzsKKyAgICB1MzIgICBkaWQ7CisgICAgdTE2ICAgZmxhZzsKKyAgICB1MTYgICBwYXJtMTsKKyAgICB1MTYgICBwYXJtMjsKKyAgICB1MTYgICBwYXJtMzsKICAgICBpbnQgICAgICAoKmZ1bmMpKHN0cnVjdCBtaWJyZWMgICAgICAgICAgICAgICAgKm1pYiwKICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgaXNnZXQsCiAgICAgICAgICAgICAgICAgICAgICB3bGFuZGV2aWNlX3QgICAgICAgICAgICAgICAgICp3bGFuZGV2LApAQCAtMTM1LDE0ICsxMTIsNiBAQAogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KIC8qIExvY2FsIEZ1bmN0aW9uIERlY2xhcmF0aW9ucyAqLwogCi1zdGF0aWMgaW50IHByaXNtMm1pYl9ieXRlc3RyMnBzdHIoCi1taWJyZWNfdCAgICAgICAgICAgICAgICAgICAgICptaWIsCi1pbnQgICAgICAgICAgICAgICAgICAgICAgICAgIGlzZ2V0LAotd2xhbmRldmljZV90ICAgICAgICAgICAgICAgICAqd2xhbmRldiwKLWhmYTM4NHhfdCAgICAgICAgICAgICAgICAgICAgKmh3LAotcDgwMjExbXNnX2RvdDExcmVxX21pYnNldF90ICAqbXNnLAotdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YSk7Ci0KIHN0YXRpYyBpbnQgcHJpc20ybWliX2J5dGVhcmVhMnBzdHIoCiBtaWJyZWNfdCAgICAgICAgICAgICAgICAgICAgICptaWIsCiBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgIGlzZ2V0LApAQCAtMTU5LDM4ICsxMjgsNiBAQAogcDgwMjExbXNnX2RvdDExcmVxX21pYnNldF90ICAqbXNnLAogdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YSk7CiAKLXN0YXRpYyBpbnQgcHJpc20ybWliX3VpbnQzMmFycmF5KAotbWlicmVjX3QgICAgICAgICAgICAgICAgICAgICAqbWliLAotaW50ICAgICAgICAgICAgICAgICAgICAgICAgICBpc2dldCwKLXdsYW5kZXZpY2VfdCAgICAgICAgICAgICAgICAgKndsYW5kZXYsCi1oZmEzODR4X3QgICAgICAgICAgICAgICAgICAgICpodywKLXA4MDIxMW1zZ19kb3QxMXJlcV9taWJzZXRfdCAgKm1zZywKLXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGEpOwotCi1zdGF0aWMgaW50IHByaXNtMm1pYl91aW50MzJvZmZzZXQoCi1taWJyZWNfdCAgICAgICAgICAgICAgICAgICAgICptaWIsCi1pbnQgICAgICAgICAgICAgICAgICAgICAgICAgIGlzZ2V0LAotd2xhbmRldmljZV90ICAgICAgICAgICAgICAgICAqd2xhbmRldiwKLWhmYTM4NHhfdCAgICAgICAgICAgICAgICAgICAgKmh3LAotcDgwMjExbXNnX2RvdDExcmVxX21pYnNldF90ICAqbXNnLAotdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YSk7Ci0KLXN0YXRpYyBpbnQgcHJpc20ybWliX3RydXRoKAotbWlicmVjX3QgICAgICAgICAgICAgICAgICAgICAqbWliLAotaW50ICAgICAgICAgICAgICAgICAgICAgICAgICBpc2dldCwKLXdsYW5kZXZpY2VfdCAgICAgICAgICAgICAgICAgKndsYW5kZXYsCi1oZmEzODR4X3QgICAgICAgICAgICAgICAgICAgICpodywKLXA4MDIxMW1zZ19kb3QxMXJlcV9taWJzZXRfdCAgKm1zZywKLXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGEpOwotCi1zdGF0aWMgaW50IHByaXNtMm1pYl9wcmVhbWJsZSgKLW1pYnJlY190ICAgICAgICAgICAgICAgICAgICAgKm1pYiwKLWludCAgICAgICAgICAgICAgICAgICAgICAgICAgaXNnZXQsCi13bGFuZGV2aWNlX3QgICAgICAgICAgICAgICAgICp3bGFuZGV2LAotaGZhMzg0eF90ICAgICAgICAgICAgICAgICAgICAqaHcsCi1wODAyMTFtc2dfZG90MTFyZXFfbWlic2V0X3QgICptc2csCi12b2lkICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhKTsKLQogc3RhdGljIGludCBwcmlzbTJtaWJfZmxhZygKIG1pYnJlY190ICAgICAgICAgICAgICAgICAgICAgKm1pYiwKIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgaXNnZXQsCkBAIC0xOTksMjIgKzEzNiw2IEBACiBwODAyMTFtc2dfZG90MTFyZXFfbWlic2V0X3QgICptc2csCiB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhKTsKIAotc3RhdGljIGludCBwcmlzbTJtaWJfYXBwY2ZpbmZvZmxhZygKLW1pYnJlY190ICAgICAgICAgICAgICAgICAgICAgKm1pYiwKLWludCAgICAgICAgICAgICAgICAgICAgICAgICAgaXNnZXQsCi13bGFuZGV2aWNlX3QgICAgICAgICAgICAgICAgICp3bGFuZGV2LAotaGZhMzg0eF90ICAgICAgICAgICAgICAgICAgICAqaHcsCi1wODAyMTFtc2dfZG90MTFyZXFfbWlic2V0X3QgICptc2csCi12b2lkICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhKTsKLQotc3RhdGljIGludCBwcmlzbTJtaWJfcmVndWxhdG9yeWRvbWFpbnMoCi1taWJyZWNfdCAgICAgICAgICAgICAgICAgICAgICptaWIsCi1pbnQgICAgICAgICAgICAgICAgICAgICAgICAgIGlzZ2V0LAotd2xhbmRldmljZV90ICAgICAgICAgICAgICAgICAqd2xhbmRldiwKLWhmYTM4NHhfdCAgICAgICAgICAgICAgICAgICAgKmh3LAotcDgwMjExbXNnX2RvdDExcmVxX21pYnNldF90ICAqbXNnLAotdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YSk7Ci0KIHN0YXRpYyBpbnQgcHJpc20ybWliX3dlcGRlZmF1bHRrZXkoCiBtaWJyZWNfdCAgICAgICAgICAgICAgICAgICAgICptaWIsCiBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgIGlzZ2V0LApAQCAtMjIzLDE0ICsxNDQsNiBAQAogcDgwMjExbXNnX2RvdDExcmVxX21pYnNldF90ICAqbXNnLAogdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YSk7CiAKLXN0YXRpYyBpbnQgcHJpc20ybWliX3Bvd2VybWFuYWdlbWVudCgKLW1pYnJlY190ICAgICAgICAgICAgICAgICAgICAgKm1pYiwKLWludCAgICAgICAgICAgICAgICAgICAgICAgICAgaXNnZXQsCi13bGFuZGV2aWNlX3QgICAgICAgICAgICAgICAgICp3bGFuZGV2LAotaGZhMzg0eF90ICAgICAgICAgICAgICAgICAgICAqaHcsCi1wODAyMTFtc2dfZG90MTFyZXFfbWlic2V0X3QgICptc2csCi12b2lkICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhKTsKLQogc3RhdGljIGludCBwcmlzbTJtaWJfcHJpdmFjeWludm9rZWQoCiBtaWJyZWNfdCAgICAgICAgICAgICAgICAgICAgICptaWIsCiBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgIGlzZ2V0LApAQCAtMjU1LDQ2ICsxNjgsNiBAQAogcDgwMjExbXNnX2RvdDExcmVxX21pYnNldF90ICAqbXNnLAogdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YSk7CiAKLXN0YXRpYyBpbnQgcHJpc20ybWliX29wZXJhdGlvbmFscmF0ZXNldCgKLW1pYnJlY190ICAgICAgICAgICAgICAgICAgICAgKm1pYiwKLWludCAgICAgICAgICAgICAgICAgICAgICAgICAgaXNnZXQsCi13bGFuZGV2aWNlX3QgICAgICAgICAgICAgICAgICp3bGFuZGV2LAotaGZhMzg0eF90ICAgICAgICAgICAgICAgICAgICAqaHcsCi1wODAyMTFtc2dfZG90MTFyZXFfbWlic2V0X3QgICptc2csCi12b2lkICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhKTsKLQotc3RhdGljIGludCBwcmlzbTJtaWJfZ3JvdXBhZGRyZXNzKAotbWlicmVjX3QgICAgICAgICAgICAgICAgICAgICAqbWliLAotaW50ICAgICAgICAgICAgICAgICAgICAgICAgICBpc2dldCwKLXdsYW5kZXZpY2VfdCAgICAgICAgICAgICAgICAgKndsYW5kZXYsCi1oZmEzODR4X3QgICAgICAgICAgICAgICAgICAgICpodywKLXA4MDIxMW1zZ19kb3QxMXJlcV9taWJzZXRfdCAgKm1zZywKLXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGEpOwotCi1zdGF0aWMgaW50IHByaXNtMm1pYl9md2lkKAotbWlicmVjX3QgICAgICAgICAgICAgICAgICAgICAqbWliLAotaW50ICAgICAgICAgICAgICAgICAgICAgICAgICBpc2dldCwKLXdsYW5kZXZpY2VfdCAgICAgICAgICAgICAgICAgKndsYW5kZXYsCi1oZmEzODR4X3QgICAgICAgICAgICAgICAgICAgICpodywKLXA4MDIxMW1zZ19kb3QxMXJlcV9taWJzZXRfdCAgKm1zZywKLXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGEpOwotCi1zdGF0aWMgaW50IHByaXNtMm1pYl9hdXRoYWxnKAotbWlicmVjX3QgICAgICAgICAgICAgICAgICAgICAqbWliLAotaW50ICAgICAgICAgICAgICAgICAgICAgICAgICBpc2dldCwKLXdsYW5kZXZpY2VfdCAgICAgICAgICAgICAgICAgKndsYW5kZXYsCi1oZmEzODR4X3QgICAgICAgICAgICAgICAgICAgICpodywKLXA4MDIxMW1zZ19kb3QxMXJlcV9taWJzZXRfdCAgKm1zZywKLXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGEpOwotCi1zdGF0aWMgaW50IHByaXNtMm1pYl9hdXRoYWxnZW5hYmxlKAotbWlicmVjX3QgICAgICAgICAgICAgICAgICAgICAqbWliLAotaW50ICAgICAgICAgICAgICAgICAgICAgICAgICBpc2dldCwKLXdsYW5kZXZpY2VfdCAgICAgICAgICAgICAgICAgKndsYW5kZXYsCi1oZmEzODR4X3QgICAgICAgICAgICAgICAgICAgICpodywKLXA4MDIxMW1zZ19kb3QxMXJlcV9taWJzZXRfdCAgKm1zZywKLXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGEpOwotCiBzdGF0aWMgaW50IHByaXNtMm1pYl9wcml2KAogbWlicmVjX3QgICAgICAgICAgICAgICAgICAgICAqbWliLAogaW50ICAgICAgICAgICAgICAgICAgICAgICAgICBpc2dldCwKQEAgLTMwMyw0MTQgKzE3Niw3OCBAQAogcDgwMjExbXNnX2RvdDExcmVxX21pYnNldF90ICAqbXNnLAogdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YSk7CiAKLXN0YXRpYyB2b2lkIHByaXNtMm1pYl9wcml2X2F1dGhsaXN0KAotaGZhMzg0eF90ICAgICAgKmh3LAotcHJpc20yc3RhX2F1dGhsaXN0X3QgICpsaXN0KTsKLQotc3RhdGljIHZvaWQgcHJpc20ybWliX3ByaXZfYWNjZXNzbW9kZSgKLWhmYTM4NHhfdCAgICAgICAgICpodywKLVVJTlQzMiAgICAgICAgICAgIG1vZGUpOwotCi1zdGF0aWMgdm9pZCBwcmlzbTJtaWJfcHJpdl9hY2Nlc3NhbGxvdygKLWhmYTM4NHhfdCAgICAgICAgICpodywKLXA4MDIxMW1hY2FycmF5X3QgICptYWNhcnJheSk7Ci0KLXN0YXRpYyB2b2lkIHByaXNtMm1pYl9wcml2X2FjY2Vzc2RlbnkoCi1oZmEzODR4X3QgICAgICAgICAqaHcsCi1wODAyMTFtYWNhcnJheV90ICAqbWFjYXJyYXkpOwotCi1zdGF0aWMgdm9pZCBwcmlzbTJtaWJfcHJpdl9kZWF1dGhlbnRpY2F0ZSgKLWhmYTM4NHhfdCAgICAgICAgICpodywKLVVJTlQ4ICAgICAgICAgICAgICphZGRyKTsKLQogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KIC8qIExvY2FsIFN0YXRpYyBEZWZpbml0aW9ucyAqLwogCiBzdGF0aWMgbWlicmVjX3QgbWlidGFiW10gPSB7CiAKICAgICAvKiBkb3QxMXNtdCBNSUIncyAqLwotCi0gICAgeyBESURtaWJfZG90MTFzbXRfZG90MTFTdGF0aW9uQ29uZmlnVGFibGVfZG90MTFTdGF0aW9uSUQsCi0gICAgICAgICAgRl9BUCB8IEZfU1RBIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICBIRkEzODR4X1JJRF9DTkZPV05NQUNBRERSLCBIRkEzODR4X1JJRF9DTkZPV05NQUNBRERSX0xFTiwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfYnl0ZWFyZWEycHN0ciB9LAotICAgIHsgRElEbWliX2RvdDExc210X2RvdDExU3RhdGlvbkNvbmZpZ1RhYmxlX2RvdDExTWVkaXVtT2NjdXBhbmN5TGltaXQsCi0gICAgICAgICAgRl9BUCB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgSEZBMzg0eF9SSURfQ05GQVBQQ0ZJTkZPLCBIRkEzODR4X1JJRF9DTkZBUFBDRklORk9fTEVOLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzJvZmZzZXQgfSwKLSAgICB7IERJRG1pYl9kb3QxMXNtdF9kb3QxMVN0YXRpb25Db25maWdUYWJsZV9kb3QxMUNGUG9sbGFibGUsCi0gICAgICAgICAgRl9TVEEgfCBGX1JFQUQsCi0gICAgICAgICAgSEZBMzg0eF9SSURfQ0ZQT0xMQUJMRSwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyIH0sCi0gICAgeyBESURtaWJfZG90MTFzbXRfZG90MTFTdGF0aW9uQ29uZmlnVGFibGVfZG90MTFDRlBQZXJpb2QsCi0gICAgICAgICAgRl9BUCB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgSEZBMzg0eF9SSURfQ05GQVBQQ0ZJTkZPLCBIRkEzODR4X1JJRF9DTkZBUFBDRklORk9fTEVOLCAxLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzJvZmZzZXQgfSwKLSAgICB7IERJRG1pYl9kb3QxMXNtdF9kb3QxMVN0YXRpb25Db25maWdUYWJsZV9kb3QxMUNGUE1heER1cmF0aW9uLAotICAgICAgICAgIEZfQVAgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIEhGQTM4NHhfUklEX0NORkFQUENGSU5GTywgSEZBMzg0eF9SSURfQ05GQVBQQ0ZJTkZPX0xFTiwgMiwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyb2Zmc2V0IH0sCi0gICAgeyBESURtaWJfZG90MTFzbXRfZG90MTFTdGF0aW9uQ29uZmlnVGFibGVfZG90MTFBdXRoZW50aWNhdGlvblJlc3BvbnNlVGltZU91dCwKLSAgICAgICAgICBGX1NUQSB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgSEZBMzg0eF9SSURfQ05GQVVUSFJTUFRJTUVPVVQsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMiB9LAotICAgIHsgRElEbWliX2RvdDExc210X2RvdDExU3RhdGlvbkNvbmZpZ1RhYmxlX2RvdDExUHJpdmFjeU9wdGlvbkltcGxlbWVudGVkLAotICAgICAgICAgIEZfQVAgfCBGX1NUQSB8IEZfUkVBRCwKLSAgICAgICAgICBIRkEzODR4X1JJRF9QUklWQUNZT1BUSU1QLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzIgfSwKLSAgICB7IERJRG1pYl9kb3QxMXNtdF9kb3QxMVN0YXRpb25Db25maWdUYWJsZV9kb3QxMVBvd2VyTWFuYWdlbWVudE1vZGUsCi0gICAgICAgICAgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIEhGQTM4NHhfUklEX0NORlBNRU5BQkxFRCwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfcG93ZXJtYW5hZ2VtZW50IH0sCi0gICAgeyBESURtaWJfZG90MTFzbXRfZG90MTFTdGF0aW9uQ29uZmlnVGFibGVfZG90MTFEZXNpcmVkU1NJRCwKLSAgICAgICAgICBGX1NUQSB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgSEZBMzg0eF9SSURfQ05GREVTSVJFRFNTSUQsIEhGQTM4NHhfUklEX0NORkRFU0lSRURTU0lEX0xFTiwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfYnl0ZXN0cjJwc3RyIH0sCi0gICAgeyBESURtaWJfZG90MTFzbXRfZG90MTFTdGF0aW9uQ29uZmlnVGFibGVfZG90MTFEZXNpcmVkQlNTVHlwZSwKLSAgICAgICAgICBGX1NUQSB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgMCwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfcHJpdiB9LAotICAgIHsgRElEbWliX2RvdDExc210X2RvdDExU3RhdGlvbkNvbmZpZ1RhYmxlX2RvdDExT3BlcmF0aW9uYWxSYXRlU2V0LAotICAgICAgICAgIEZfU1RBIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICBIRkEzODR4X1JJRF9UWFJBVEVDTlRMLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl9vcGVyYXRpb25hbHJhdGVzZXQgfSwKLSAgICB7IERJRG1pYl9kb3QxMXNtdF9kb3QxMVN0YXRpb25Db25maWdUYWJsZV9kb3QxMU9wZXJhdGlvbmFsUmF0ZVNldCwKLSAgICAgICAgICBGX0FQIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICBIRkEzODR4X1JJRF9UWFJBVEVDTlRMMCwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfb3BlcmF0aW9uYWxyYXRlc2V0IH0sCi0gICAgeyBESURtaWJfZG90MTFzbXRfZG90MTFTdGF0aW9uQ29uZmlnVGFibGVfZG90MTFCZWFjb25QZXJpb2QsCi0gICAgICAgICAgRl9BUCB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgSEZBMzg0eF9SSURfQ05GQVBCQ05JTlQsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMiB9LAotICAgIHsgRElEbWliX2RvdDExc210X2RvdDExU3RhdGlvbkNvbmZpZ1RhYmxlX2RvdDExRFRJTVBlcmlvZCwKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIEhGQTM4NHhfUklEX0NORk9XTkRUSU1QRVIsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMiB9LAotICAgIHsgRElEbWliX2RvdDExc210X2RvdDExU3RhdGlvbkNvbmZpZ1RhYmxlX2RvdDExQXNzb2NpYXRpb25SZXNwb25zZVRpbWVPdXQsCi0gICAgICAgICAgRl9BUCB8IEZfU1RBIHwgRl9SRUFELAotICAgICAgICAgIEhGQTM4NHhfUklEX1BST1RPQ09MUlNQVElNRSwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyIH0sCi0gICAgeyBESURtaWJfZG90MTFzbXRfZG90MTFBdXRoZW50aWNhdGlvbkFsZ29yaXRobXNUYWJsZV9kb3QxMUF1dGhlbnRpY2F0aW9uQWxnb3JpdGhtMSwKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1JFQUQsCi0gICAgICAgICAgMSwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfYXV0aGFsZyB9LAotICAgIHsgRElEbWliX2RvdDExc210X2RvdDExQXV0aGVudGljYXRpb25BbGdvcml0aG1zVGFibGVfZG90MTFBdXRoZW50aWNhdGlvbkFsZ29yaXRobTIsCi0gICAgICAgICAgRl9BUCB8IEZfU1RBIHwgRl9SRUFELAotICAgICAgICAgIDIsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX2F1dGhhbGcgfSwKLSAgICB7IERJRG1pYl9kb3QxMXNtdF9kb3QxMUF1dGhlbnRpY2F0aW9uQWxnb3JpdGhtc1RhYmxlX2RvdDExQXV0aGVudGljYXRpb25BbGdvcml0aG0zLAotICAgICAgICAgIEZfQVAgfCBGX1NUQSB8IEZfUkVBRCwKLSAgICAgICAgICAzLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl9hdXRoYWxnIH0sCi0gICAgeyBESURtaWJfZG90MTFzbXRfZG90MTFBdXRoZW50aWNhdGlvbkFsZ29yaXRobXNUYWJsZV9kb3QxMUF1dGhlbnRpY2F0aW9uQWxnb3JpdGhtNCwKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1JFQUQsCi0gICAgICAgICAgNCwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfYXV0aGFsZyB9LAotICAgIHsgRElEbWliX2RvdDExc210X2RvdDExQXV0aGVudGljYXRpb25BbGdvcml0aG1zVGFibGVfZG90MTFBdXRoZW50aWNhdGlvbkFsZ29yaXRobTUsCi0gICAgICAgICAgRl9BUCB8IEZfU1RBIHwgRl9SRUFELAotICAgICAgICAgIDUsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX2F1dGhhbGcgfSwKLSAgICB7IERJRG1pYl9kb3QxMXNtdF9kb3QxMUF1dGhlbnRpY2F0aW9uQWxnb3JpdGhtc1RhYmxlX2RvdDExQXV0aGVudGljYXRpb25BbGdvcml0aG02LAotICAgICAgICAgIEZfQVAgfCBGX1NUQSB8IEZfUkVBRCwKLSAgICAgICAgICA2LCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl9hdXRoYWxnIH0sCi0gICAgeyBESURtaWJfZG90MTFzbXRfZG90MTFBdXRoZW50aWNhdGlvbkFsZ29yaXRobXNUYWJsZV9kb3QxMUF1dGhlbnRpY2F0aW9uQWxnb3JpdGhtc0VuYWJsZTEsCi0gICAgICAgICAgRl9BUCB8IEZfU1RBIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICAxLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl9hdXRoYWxnZW5hYmxlIH0sCi0gICAgeyBESURtaWJfZG90MTFzbXRfZG90MTFBdXRoZW50aWNhdGlvbkFsZ29yaXRobXNUYWJsZV9kb3QxMUF1dGhlbnRpY2F0aW9uQWxnb3JpdGhtc0VuYWJsZTIsCi0gICAgICAgICAgRl9BUCB8IEZfU1RBIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICAyLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl9hdXRoYWxnZW5hYmxlIH0sCi0gICAgeyBESURtaWJfZG90MTFzbXRfZG90MTFBdXRoZW50aWNhdGlvbkFsZ29yaXRobXNUYWJsZV9kb3QxMUF1dGhlbnRpY2F0aW9uQWxnb3JpdGhtc0VuYWJsZTMsCi0gICAgICAgICAgRl9BUCB8IEZfU1RBIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICAzLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl9hdXRoYWxnZW5hYmxlIH0sCi0gICAgeyBESURtaWJfZG90MTFzbXRfZG90MTFBdXRoZW50aWNhdGlvbkFsZ29yaXRobXNUYWJsZV9kb3QxMUF1dGhlbnRpY2F0aW9uQWxnb3JpdGhtc0VuYWJsZTQsCi0gICAgICAgICAgRl9BUCB8IEZfU1RBIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICA0LCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl9hdXRoYWxnZW5hYmxlIH0sCi0gICAgeyBESURtaWJfZG90MTFzbXRfZG90MTFBdXRoZW50aWNhdGlvbkFsZ29yaXRobXNUYWJsZV9kb3QxMUF1dGhlbnRpY2F0aW9uQWxnb3JpdGhtc0VuYWJsZTUsCi0gICAgICAgICAgRl9BUCB8IEZfU1RBIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICA1LCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl9hdXRoYWxnZW5hYmxlIH0sCi0gICAgeyBESURtaWJfZG90MTFzbXRfZG90MTFBdXRoZW50aWNhdGlvbkFsZ29yaXRobXNUYWJsZV9kb3QxMUF1dGhlbnRpY2F0aW9uQWxnb3JpdGhtc0VuYWJsZTYsCi0gICAgICAgICAgRl9BUCB8IEZfU1RBIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICA2LCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl9hdXRoYWxnZW5hYmxlIH0sCiAgICAgeyBESURtaWJfZG90MTFzbXRfZG90MTFXRVBEZWZhdWx0S2V5c1RhYmxlX2RvdDExV0VQRGVmYXVsdEtleTAsCi0gICAgICAgICAgRl9BUCB8IEZfU1RBIHwgRl9XUklURSwKKyAgICAgICAgICBGX1NUQSB8IEZfV1JJVEUsCiAgICAgICAgICAgSEZBMzg0eF9SSURfQ05GV0VQREVGQVVMVEtFWTAsIDAsIDAsCiAgICAgICAgICAgcHJpc20ybWliX3dlcGRlZmF1bHRrZXkgfSwKICAgICB7IERJRG1pYl9kb3QxMXNtdF9kb3QxMVdFUERlZmF1bHRLZXlzVGFibGVfZG90MTFXRVBEZWZhdWx0S2V5MSwKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1dSSVRFLAorICAgICAgICAgIEZfU1RBIHwgRl9XUklURSwKICAgICAgICAgICBIRkEzODR4X1JJRF9DTkZXRVBERUZBVUxUS0VZMSwgMCwgMCwKICAgICAgICAgICBwcmlzbTJtaWJfd2VwZGVmYXVsdGtleSB9LAogICAgIHsgRElEbWliX2RvdDExc210X2RvdDExV0VQRGVmYXVsdEtleXNUYWJsZV9kb3QxMVdFUERlZmF1bHRLZXkyLAotICAgICAgICAgIEZfQVAgfCBGX1NUQSB8IEZfV1JJVEUsCisgICAgICAgICAgRl9TVEEgfCBGX1dSSVRFLAogICAgICAgICAgIEhGQTM4NHhfUklEX0NORldFUERFRkFVTFRLRVkyLCAwLCAwLAogICAgICAgICAgIHByaXNtMm1pYl93ZXBkZWZhdWx0a2V5IH0sCiAgICAgeyBESURtaWJfZG90MTFzbXRfZG90MTFXRVBEZWZhdWx0S2V5c1RhYmxlX2RvdDExV0VQRGVmYXVsdEtleTMsCi0gICAgICAgICAgRl9BUCB8IEZfU1RBIHwgRl9XUklURSwKKyAgICAgICAgICBGX1NUQSB8IEZfV1JJVEUsCiAgICAgICAgICAgSEZBMzg0eF9SSURfQ05GV0VQREVGQVVMVEtFWTMsIDAsIDAsCiAgICAgICAgICAgcHJpc20ybWliX3dlcGRlZmF1bHRrZXkgfSwKICAgICB7IERJRG1pYl9kb3QxMXNtdF9kb3QxMVByaXZhY3lUYWJsZV9kb3QxMVByaXZhY3lJbnZva2VkLAotICAgICAgICAgIEZfQVAgfCBGX1NUQSB8IEZfUkVBRCB8IEZfV1JJVEUsCisgICAgICAgICAgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAogICAgICAgICAgIEhGQTM4NHhfUklEX0NORldFUEZMQUdTLCBIRkEzODR4X1dFUEZMQUdTX1BSSVZJTlZPS0VELCAwLAogICAgICAgICAgIHByaXNtMm1pYl9wcml2YWN5aW52b2tlZCB9LAogICAgIHsgRElEbWliX2RvdDExc210X2RvdDExUHJpdmFjeVRhYmxlX2RvdDExV0VQRGVmYXVsdEtleUlELAotICAgICAgICAgIEZfQVAgfCBGX1NUQSB8IEZfUkVBRCB8IEZfV1JJVEUsCisgICAgICAgICAgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAogICAgICAgICAgIEhGQTM4NHhfUklEX0NORldFUERFRkFVTFRLRVlJRCwgMCwgMCwKICAgICAgICAgICBwcmlzbTJtaWJfdWludDMyIH0sCiAgICAgeyBESURtaWJfZG90MTFzbXRfZG90MTFQcml2YWN5VGFibGVfZG90MTFFeGNsdWRlVW5lbmNyeXB0ZWQsCi0gICAgICAgICAgRl9BUCB8IEZfU1RBIHwgRl9SRUFEIHwgRl9XUklURSwKKyAgICAgICAgICBGX1NUQSB8IEZfUkVBRCB8IEZfV1JJVEUsCiAgICAgICAgICAgSEZBMzg0eF9SSURfQ05GV0VQRkxBR1MsIEhGQTM4NHhfV0VQRkxBR1NfRVhDTFVERSwgMCwKICAgICAgICAgICBwcmlzbTJtaWJfZXhjbHVkZXVuZW5jcnlwdGVkIH0sCi0gICAgeyBESURtaWJfZG90MTFwaHlfZG90MTFQaHlPcGVyYXRpb25UYWJsZV9kb3QxMVNob3J0UHJlYW1ibGVFbmFibGVkLAotICAgICAgICAgIEZfQVAgfCBGX1NUQSB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgSEZBMzg0eF9SSURfQ05GU0hPUlRQUkVBTUJMRSwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfcHJlYW1ibGUgfSwKIAogICAgIC8qIGRvdDExbWFjIE1JQidzICovCiAKICAgICB7IERJRG1pYl9kb3QxMW1hY19kb3QxMU9wZXJhdGlvblRhYmxlX2RvdDExTUFDQWRkcmVzcywKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAorICAgICAgICAgIEZfU1RBIHwgRl9SRUFEIHwgRl9XUklURSwKICAgICAgICAgICBIRkEzODR4X1JJRF9DTkZPV05NQUNBRERSLCBIRkEzODR4X1JJRF9DTkZPV05NQUNBRERSX0xFTiwgMCwKICAgICAgICAgICBwcmlzbTJtaWJfYnl0ZWFyZWEycHN0ciB9LAogICAgIHsgRElEbWliX2RvdDExbWFjX2RvdDExT3BlcmF0aW9uVGFibGVfZG90MTFSVFNUaHJlc2hvbGQsCiAgICAgICAgICAgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAogICAgICAgICAgIEhGQTM4NHhfUklEX1JUU1RIUkVTSCwgMCwgMCwKICAgICAgICAgICBwcmlzbTJtaWJfdWludDMyIH0sCi0gICAgeyBESURtaWJfZG90MTFtYWNfZG90MTFPcGVyYXRpb25UYWJsZV9kb3QxMVJUU1RocmVzaG9sZCwKLSAgICAgICAgICBGX0FQIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICBIRkEzODR4X1JJRF9SVFNUSFJFU0gwLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzIgfSwKICAgICB7IERJRG1pYl9kb3QxMW1hY19kb3QxMU9wZXJhdGlvblRhYmxlX2RvdDExU2hvcnRSZXRyeUxpbWl0LAotICAgICAgICAgIEZfQVAgfCBGX1NUQSB8IEZfUkVBRCwKKyAgICAgICAgICBGX1NUQSB8IEZfUkVBRCwKICAgICAgICAgICBIRkEzODR4X1JJRF9TSE9SVFJFVFJZTElNSVQsIDAsIDAsCiAgICAgICAgICAgcHJpc20ybWliX3VpbnQzMiB9LAogICAgIHsgRElEbWliX2RvdDExbWFjX2RvdDExT3BlcmF0aW9uVGFibGVfZG90MTFMb25nUmV0cnlMaW1pdCwKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1JFQUQsCisgICAgICAgICAgRl9TVEEgfCBGX1JFQUQsCiAgICAgICAgICAgSEZBMzg0eF9SSURfTE9OR1JFVFJZTElNSVQsIDAsIDAsCiAgICAgICAgICAgcHJpc20ybWliX3VpbnQzMiB9LAogICAgIHsgRElEbWliX2RvdDExbWFjX2RvdDExT3BlcmF0aW9uVGFibGVfZG90MTFGcmFnbWVudGF0aW9uVGhyZXNob2xkLAogICAgICAgICAgIEZfU1RBIHwgRl9SRUFEIHwgRl9XUklURSwKICAgICAgICAgICBIRkEzODR4X1JJRF9GUkFHVEhSRVNILCAwLCAwLAogICAgICAgICAgIHByaXNtMm1pYl9mcmFnbWVudGF0aW9udGhyZXNob2xkIH0sCi0gICAgeyBESURtaWJfZG90MTFtYWNfZG90MTFPcGVyYXRpb25UYWJsZV9kb3QxMUZyYWdtZW50YXRpb25UaHJlc2hvbGQsCi0gICAgICAgICAgRl9BUCB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgSEZBMzg0eF9SSURfRlJBR1RIUkVTSDAsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX2ZyYWdtZW50YXRpb250aHJlc2hvbGQgfSwKICAgICB7IERJRG1pYl9kb3QxMW1hY19kb3QxMU9wZXJhdGlvblRhYmxlX2RvdDExTWF4VHJhbnNtaXRNU0RVTGlmZXRpbWUsCi0gICAgICAgICAgRl9BUCB8IEZfU1RBIHwgRl9SRUFELAorICAgICAgICAgIEZfU1RBIHwgRl9SRUFELAogICAgICAgICAgIEhGQTM4NHhfUklEX01BWFRYTElGRVRJTUUsIDAsIDAsCiAgICAgICAgICAgcHJpc20ybWliX3VpbnQzMiB9LAotICAgIHsgRElEbWliX2RvdDExbWFjX2RvdDExT3BlcmF0aW9uVGFibGVfZG90MTFNYXhSZWNlaXZlTGlmZXRpbWUsCi0gICAgICAgICAgRl9BUCB8IEZfU1RBIHwgRl9SRUFELAotICAgICAgICAgIEhGQTM4NHhfUklEX01BWFJYTElGRVRJTUUsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMiB9LAotICAgIHsgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3MxLAotICAgICAgICAgIEZfU1RBIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICAwLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl9ncm91cGFkZHJlc3MgfSwKLSAgICB7IERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzMiwKLSAgICAgICAgICBGX1NUQSB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgMCwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfZ3JvdXBhZGRyZXNzIH0sCi0gICAgeyBESURtaWJfZG90MTFtYWNfZG90MTFHcm91cEFkZHJlc3Nlc1RhYmxlX2RvdDExQWRkcmVzczMsCi0gICAgICAgICAgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIDAsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX2dyb3VwYWRkcmVzcyB9LAotICAgIHsgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3M0LAotICAgICAgICAgIEZfU1RBIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICAwLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl9ncm91cGFkZHJlc3MgfSwKLSAgICB7IERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzNSwKLSAgICAgICAgICBGX1NUQSB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgMCwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfZ3JvdXBhZGRyZXNzIH0sCi0gICAgeyBESURtaWJfZG90MTFtYWNfZG90MTFHcm91cEFkZHJlc3Nlc1RhYmxlX2RvdDExQWRkcmVzczYsCi0gICAgICAgICAgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIDAsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX2dyb3VwYWRkcmVzcyB9LAotICAgIHsgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3M3LAotICAgICAgICAgIEZfU1RBIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICAwLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl9ncm91cGFkZHJlc3MgfSwKLSAgICB7IERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzOCwKLSAgICAgICAgICBGX1NUQSB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgMCwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfZ3JvdXBhZGRyZXNzIH0sCi0gICAgeyBESURtaWJfZG90MTFtYWNfZG90MTFHcm91cEFkZHJlc3Nlc1RhYmxlX2RvdDExQWRkcmVzczksCi0gICAgICAgICAgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIDAsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX2dyb3VwYWRkcmVzcyB9LAotICAgIHsgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3MxMCwKLSAgICAgICAgICBGX1NUQSB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgMCwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfZ3JvdXBhZGRyZXNzIH0sCi0gICAgeyBESURtaWJfZG90MTFtYWNfZG90MTFHcm91cEFkZHJlc3Nlc1RhYmxlX2RvdDExQWRkcmVzczExLAotICAgICAgICAgIEZfU1RBIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICAwLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl9ncm91cGFkZHJlc3MgfSwKLSAgICB7IERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzMTIsCi0gICAgICAgICAgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIDAsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX2dyb3VwYWRkcmVzcyB9LAotICAgIHsgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3MxMywKLSAgICAgICAgICBGX1NUQSB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgMCwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfZ3JvdXBhZGRyZXNzIH0sCi0gICAgeyBESURtaWJfZG90MTFtYWNfZG90MTFHcm91cEFkZHJlc3Nlc1RhYmxlX2RvdDExQWRkcmVzczE0LAotICAgICAgICAgIEZfU1RBIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICAwLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl9ncm91cGFkZHJlc3MgfSwKLSAgICB7IERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzMTUsCi0gICAgICAgICAgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIDAsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX2dyb3VwYWRkcmVzcyB9LAotICAgIHsgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3MxNiwKLSAgICAgICAgICBGX1NUQSB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgMCwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfZ3JvdXBhZGRyZXNzIH0sCi0gICAgeyBESURtaWJfZG90MTFtYWNfZG90MTFHcm91cEFkZHJlc3Nlc1RhYmxlX2RvdDExQWRkcmVzczE3LAotICAgICAgICAgIEZfU1RBIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICAwLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl9ncm91cGFkZHJlc3MgfSwKLSAgICB7IERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzMTgsCi0gICAgICAgICAgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIDAsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX2dyb3VwYWRkcmVzcyB9LAotICAgIHsgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3MxOSwKLSAgICAgICAgICBGX1NUQSB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgMCwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfZ3JvdXBhZGRyZXNzIH0sCi0gICAgeyBESURtaWJfZG90MTFtYWNfZG90MTFHcm91cEFkZHJlc3Nlc1RhYmxlX2RvdDExQWRkcmVzczIwLAotICAgICAgICAgIEZfU1RBIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICAwLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl9ncm91cGFkZHJlc3MgfSwKLSAgICB7IERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzMjEsCi0gICAgICAgICAgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIDAsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX2dyb3VwYWRkcmVzcyB9LAotICAgIHsgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3MyMiwKLSAgICAgICAgICBGX1NUQSB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgMCwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfZ3JvdXBhZGRyZXNzIH0sCi0gICAgeyBESURtaWJfZG90MTFtYWNfZG90MTFHcm91cEFkZHJlc3Nlc1RhYmxlX2RvdDExQWRkcmVzczIzLAotICAgICAgICAgIEZfU1RBIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICAwLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl9ncm91cGFkZHJlc3MgfSwKLSAgICB7IERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzMjQsCi0gICAgICAgICAgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIDAsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX2dyb3VwYWRkcmVzcyB9LAotICAgIHsgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3MyNSwKLSAgICAgICAgICBGX1NUQSB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgMCwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfZ3JvdXBhZGRyZXNzIH0sCi0gICAgeyBESURtaWJfZG90MTFtYWNfZG90MTFHcm91cEFkZHJlc3Nlc1RhYmxlX2RvdDExQWRkcmVzczI2LAotICAgICAgICAgIEZfU1RBIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICAwLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl9ncm91cGFkZHJlc3MgfSwKLSAgICB7IERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzMjcsCi0gICAgICAgICAgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIDAsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX2dyb3VwYWRkcmVzcyB9LAotICAgIHsgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3MyOCwKLSAgICAgICAgICBGX1NUQSB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgMCwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfZ3JvdXBhZGRyZXNzIH0sCi0gICAgeyBESURtaWJfZG90MTFtYWNfZG90MTFHcm91cEFkZHJlc3Nlc1RhYmxlX2RvdDExQWRkcmVzczI5LAotICAgICAgICAgIEZfU1RBIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICAwLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl9ncm91cGFkZHJlc3MgfSwKLSAgICB7IERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzMzAsCi0gICAgICAgICAgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIDAsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX2dyb3VwYWRkcmVzcyB9LAotICAgIHsgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3MzMSwKLSAgICAgICAgICBGX1NUQSB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgMCwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfZ3JvdXBhZGRyZXNzIH0sCi0gICAgeyBESURtaWJfZG90MTFtYWNfZG90MTFHcm91cEFkZHJlc3Nlc1RhYmxlX2RvdDExQWRkcmVzczMyLAotICAgICAgICAgIEZfU1RBIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICAwLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl9ncm91cGFkZHJlc3MgfSwKIAogICAgIC8qIGRvdDExcGh5IE1JQidzICovCiAKLSAgICB7IERJRG1pYl9kb3QxMXBoeV9kb3QxMVBoeU9wZXJhdGlvblRhYmxlX2RvdDExUEhZVHlwZSwKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1JFQUQsCi0gICAgICAgICAgSEZBMzg0eF9SSURfUEhZVFlQRSwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyIH0sCi0gICAgeyBESURtaWJfZG90MTFwaHlfZG90MTFQaHlPcGVyYXRpb25UYWJsZV9kb3QxMVRlbXBUeXBlLAotICAgICAgICAgIEZfQVAgfCBGX1NUQSB8IEZfUkVBRCwKLSAgICAgICAgICBIRkEzODR4X1JJRF9URU1QVFlQRSwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyIH0sCiAgICAgeyBESURtaWJfZG90MTFwaHlfZG90MTFQaHlEU1NTVGFibGVfZG90MTFDdXJyZW50Q2hhbm5lbCwKICAgICAgICAgICBGX1NUQSB8IEZfUkVBRCwKICAgICAgICAgICBIRkEzODR4X1JJRF9DVVJSRU5UQ0hBTk5FTCwgMCwgMCwKICAgICAgICAgICBwcmlzbTJtaWJfdWludDMyIH0sCi0gICAgeyBESURtaWJfZG90MTFwaHlfZG90MTFQaHlEU1NTVGFibGVfZG90MTFDdXJyZW50Q2hhbm5lbCwKLSAgICAgICAgICBGX0FQIHwgRl9SRUFELAotICAgICAgICAgIEhGQTM4NHhfUklEX0NORk9XTkNIQU5ORUwsIDAsIDAsCisgICAgeyBESURtaWJfZG90MTFwaHlfZG90MTFQaHlUeFBvd2VyVGFibGVfZG90MTFDdXJyZW50VHhQb3dlckxldmVsLAorICAgICAgICAgIEZfU1RBIHwgRl9SRUFEIHwgRl9XUklURSwKKyAgICAgICAgICBIRkEzODR4X1JJRF9UWFBPV0VSTUFYLCAwLCAwLAogICAgICAgICAgIHByaXNtMm1pYl91aW50MzIgfSwKLSAgICB7IERJRG1pYl9kb3QxMXBoeV9kb3QxMVBoeURTU1NUYWJsZV9kb3QxMUN1cnJlbnRDQ0FNb2RlLAotICAgICAgICAgIEZfQVAgfCBGX1NUQSB8IEZfUkVBRCwKLSAgICAgICAgICBIRkEzODR4X1JJRF9DQ0FNT0RFLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzIgfSwKLQotICAgIC8qIHAyVGFibGUgTUlCJ3MgKi8KLQotICAgIHsgRElEbWliX3AyX3AyVGFibGVfcDJNTVR4LAotICAgICAgICAgIEZfQVAgfCBGX1NUQSB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgMCwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfcHJpdiB9LAotICAgIHsgRElEbWliX3AyX3AyVGFibGVfcDJFYXJseUJlYWNvbiwKLSAgICAgICAgICBGX0FQIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICBCSVQ3LCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl9hcHBjZmluZm9mbGFnIH0sCi0gICAgeyBESURtaWJfcDJfcDJUYWJsZV9wMlJlY2VpdmVkRnJhbWVTdGF0aXN0aWNzLAotICAgICAgICAgIEZfQVAgfCBGX1NUQSB8IEZfUkVBRCwKLSAgICAgICAgICAwLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl9wcml2IH0sCi0gICAgeyBESURtaWJfcDJfcDJUYWJsZV9wMkNvbW11bmljYXRpb25UYWxsaWVzLAotICAgICAgICAgIEZfQVAgfCBGX1NUQSB8IEZfUkVBRCwKLSAgICAgICAgICAwLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl9wcml2IH0sCi0gICAgeyBESURtaWJfcDJfcDJUYWJsZV9wMkF1dGhlbnRpY2F0ZWQsCi0gICAgICAgICAgRl9BUCB8IEZfUkVBRCwKLSAgICAgICAgICAwLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl9wcml2IH0sCi0gICAgeyBESURtaWJfcDJfcDJUYWJsZV9wMkFzc29jaWF0ZWQsCi0gICAgICAgICAgRl9BUCB8IEZfUkVBRCwKLSAgICAgICAgICAwLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl9wcml2IH0sCi0gICAgeyBESURtaWJfcDJfcDJUYWJsZV9wMlBvd2VyU2F2ZVVzZXJDb3VudCwKLSAgICAgICAgICBGX0FQIHwgRl9SRUFELAotICAgICAgICAgIDAsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3ByaXYgfSwKLSAgICB7IERJRG1pYl9wMl9wMlRhYmxlX3AyQ29tbWVudCwKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIDAsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3ByaXYgfSwKLSAgICB7IERJRG1pYl9wMl9wMlRhYmxlX3AyQWNjZXNzTW9kZSwKLSAgICAgICAgICBGX0FQIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICAwLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl9wcml2IH0sCi0gICAgeyBESURtaWJfcDJfcDJUYWJsZV9wMkFjY2Vzc0FsbG93LAotICAgICAgICAgIEZfQVAgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIDAsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3ByaXYgfSwKLSAgICB7IERJRG1pYl9wMl9wMlRhYmxlX3AyQWNjZXNzRGVueSwKLSAgICAgICAgICBGX0FQIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICAwLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl9wcml2IH0sCi0gICAgeyBESURtaWJfcDJfcDJUYWJsZV9wMkNoYW5uZWxJbmZvUmVzdWx0cywKLSAgICAgICAgICBGX0FQIHwgRl9SRUFELAotICAgICAgICAgIDAsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3ByaXYgfSwKIAogICAgIC8qIHAyU3RhdGljIE1JQidzICovCiAKQEAgLTcxOCw1NjUgKzI1NSwxMyBAQAogICAgICAgICAgIEZfU1RBIHwgRl9SRUFEIHwgRl9XUklURSwKICAgICAgICAgICBIRkEzODR4X1JJRF9DTkZQT1JUVFlQRSwgMCwgMCwKICAgICAgICAgICBwcmlzbTJtaWJfdWludDMyIH0sCi0gICAgeyBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZPd25NQUNBZGRyZXNzLAotICAgICAgICAgIEZfQVAgfCBGX1NUQSB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgSEZBMzg0eF9SSURfQ05GT1dOTUFDQUREUiwgSEZBMzg0eF9SSURfQ05GT1dOTUFDQUREUl9MRU4sIDAsCi0gICAgICAgICAgcHJpc20ybWliX2J5dGVhcmVhMnBzdHIgfSwKLSAgICB7IERJRG1pYl9wMl9wMlN0YXRpY19wMkNuZkRlc2lyZWRTU0lELAotICAgICAgICAgIEZfU1RBIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICBIRkEzODR4X1JJRF9DTkZERVNJUkVEU1NJRCwgSEZBMzg0eF9SSURfQ05GREVTSVJFRFNTSURfTEVOLCAwLAotICAgICAgICAgIHByaXNtMm1pYl9ieXRlc3RyMnBzdHIgfSwKLSAgICB7IERJRG1pYl9wMl9wMlN0YXRpY19wMkNuZk93bkNoYW5uZWwsCi0gICAgICAgICAgRl9BUCB8IEZfU1RBIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICBIRkEzODR4X1JJRF9DTkZPV05DSEFOTkVMLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzIgfSwKLSAgICB7IERJRG1pYl9wMl9wMlN0YXRpY19wMkNuZk93blNTSUQsCi0gICAgICAgICAgRl9BUCB8IEZfU1RBIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICBIRkEzODR4X1JJRF9DTkZPV05TU0lELCBIRkEzODR4X1JJRF9DTkZPV05TU0lEX0xFTiwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfYnl0ZXN0cjJwc3RyIH0sCi0gICAgeyBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZPd25BVElNV2luZG93LAotICAgICAgICAgIEZfU1RBIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICBIRkEzODR4X1JJRF9DTkZPV05BVElNV0lOLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzIgfSwKLSAgICB7IERJRG1pYl9wMl9wMlN0YXRpY19wMkNuZlN5c3RlbVNjYWxlLAotICAgICAgICAgIEZfQVAgfCBGX1NUQSB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgSEZBMzg0eF9SSURfQ05GU1lTU0NBTEUsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMiB9LAotICAgIHsgRElEbWliX3AyX3AyU3RhdGljX3AyQ25mTWF4RGF0YUxlbmd0aCwKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIEhGQTM4NHhfUklEX0NORk1BWERBVEFMRU4sIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMiB9LAotICAgIHsgRElEbWliX3AyX3AyU3RhdGljX3AyQ25mV0RTQWRkcmVzcywKLSAgICAgICAgICBGX1NUQSB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgSEZBMzg0eF9SSURfQ05GV0RTQUREUiwgSEZBMzg0eF9SSURfQ05GV0RTQUREUl9MRU4sIDAsCi0gICAgICAgICAgcHJpc20ybWliX2J5dGVhcmVhMnBzdHIgfSwKLSAgICB7IERJRG1pYl9wMl9wMlN0YXRpY19wMkNuZlBNRW5hYmxlZCwKLSAgICAgICAgICBGX1NUQSB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgSEZBMzg0eF9SSURfQ05GUE1FTkFCTEVELCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl90cnV0aCB9LAotICAgIHsgRElEbWliX3AyX3AyU3RhdGljX3AyQ25mUE1FUFMsCi0gICAgICAgICAgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIEhGQTM4NHhfUklEX0NORlBNRVBTLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl90cnV0aCB9LAotICAgIHsgRElEbWliX3AyX3AyU3RhdGljX3AyQ25mTXVsdGljYXN0UmVjZWl2ZSwKLSAgICAgICAgICBGX1NUQSB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgSEZBMzg0eF9SSURfQ05GTVVMVElDQVNUUlgsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3RydXRoIH0sCi0gICAgeyBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZNYXhTbGVlcER1cmF0aW9uLAotICAgICAgICAgIEZfU1RBIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICBIRkEzODR4X1JJRF9DTkZNQVhTTEVFUERVUiwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyIH0sCi0gICAgeyBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZQTUhvbGRvdmVyRHVyYXRpb24sCi0gICAgICAgICAgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIEhGQTM4NHhfUklEX0NORlBNSE9MRERVUiwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyIH0sCi0gICAgeyBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZPd25OYW1lLAotICAgICAgICAgIEZfQVAgfCBGX1NUQSB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgSEZBMzg0eF9SSURfQ05GT1dOTkFNRSwgSEZBMzg0eF9SSURfQ05GT1dOTkFNRV9MRU4sIDAsCi0gICAgICAgICAgcHJpc20ybWliX2J5dGVzdHIycHN0ciB9LAotICAgIHsgRElEbWliX3AyX3AyU3RhdGljX3AyQ25mT3duRFRJTVBlcmlvZCwKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIEhGQTM4NHhfUklEX0NORk9XTkRUSU1QRVIsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMiB9LAotICAgIHsgRElEbWliX3AyX3AyU3RhdGljX3AyQ25mV0RTQWRkcmVzczEsCi0gICAgICAgICAgRl9BUCB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgSEZBMzg0eF9SSURfQ05GV0RTQUREUjEsIEhGQTM4NHhfUklEX0NORldEU0FERFIxX0xFTiwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfYnl0ZWFyZWEycHN0ciB9LAotICAgIHsgRElEbWliX3AyX3AyU3RhdGljX3AyQ25mV0RTQWRkcmVzczIsCi0gICAgICAgICAgRl9BUCB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgSEZBMzg0eF9SSURfQ05GV0RTQUREUjIsIEhGQTM4NHhfUklEX0NORldEU0FERFIyX0xFTiwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfYnl0ZWFyZWEycHN0ciB9LAotICAgIHsgRElEbWliX3AyX3AyU3RhdGljX3AyQ25mV0RTQWRkcmVzczMsCi0gICAgICAgICAgRl9BUCB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgSEZBMzg0eF9SSURfQ05GV0RTQUREUjMsIEhGQTM4NHhfUklEX0NORldEU0FERFIzX0xFTiwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfYnl0ZWFyZWEycHN0ciB9LAotICAgIHsgRElEbWliX3AyX3AyU3RhdGljX3AyQ25mV0RTQWRkcmVzczQsCi0gICAgICAgICAgRl9BUCB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgSEZBMzg0eF9SSURfQ05GV0RTQUREUjQsIEhGQTM4NHhfUklEX0NORldEU0FERFI0X0xFTiwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfYnl0ZWFyZWEycHN0ciB9LAotICAgIHsgRElEbWliX3AyX3AyU3RhdGljX3AyQ25mV0RTQWRkcmVzczUsCi0gICAgICAgICAgRl9BUCB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgSEZBMzg0eF9SSURfQ05GV0RTQUREUjUsIEhGQTM4NHhfUklEX0NORldEU0FERFI1X0xFTiwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfYnl0ZWFyZWEycHN0ciB9LAotICAgIHsgRElEbWliX3AyX3AyU3RhdGljX3AyQ25mV0RTQWRkcmVzczYsCi0gICAgICAgICAgRl9BUCB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgSEZBMzg0eF9SSURfQ05GV0RTQUREUjYsIEhGQTM4NHhfUklEX0NORldEU0FERFI2X0xFTiwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfYnl0ZWFyZWEycHN0ciB9LAotICAgIHsgRElEbWliX3AyX3AyU3RhdGljX3AyQ25mTXVsdGljYXN0UE1CdWZmZXJpbmcsCi0gICAgICAgICAgRl9BUCB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgSEZBMzg0eF9SSURfQ05GTUNBU1RQTUJVRkYsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3RydXRoIH0sCi0gICAgeyBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZXRVBEZWZhdWx0S2V5SUQsCi0gICAgICAgICAgRl9BUCB8IEZfU1RBIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICBIRkEzODR4X1JJRF9DTkZXRVBERUZBVUxUS0VZSUQsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMiB9LAotICAgIHsgRElEbWliX3AyX3AyU3RhdGljX3AyQ25mV0VQRGVmYXVsdEtleTAsCi0gICAgICAgICAgRl9BUCB8IEZfU1RBIHwgRl9XUklURSwKLSAgICAgICAgICBIRkEzODR4X1JJRF9DTkZXRVBERUZBVUxUS0VZMCwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfd2VwZGVmYXVsdGtleSB9LAotICAgIHsgRElEbWliX3AyX3AyU3RhdGljX3AyQ25mV0VQRGVmYXVsdEtleTEsCi0gICAgICAgICAgRl9BUCB8IEZfU1RBIHwgRl9XUklURSwKLSAgICAgICAgICBIRkEzODR4X1JJRF9DTkZXRVBERUZBVUxUS0VZMSwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfd2VwZGVmYXVsdGtleSB9LAotICAgIHsgRElEbWliX3AyX3AyU3RhdGljX3AyQ25mV0VQRGVmYXVsdEtleTIsCi0gICAgICAgICAgRl9BUCB8IEZfU1RBIHwgRl9XUklURSwKLSAgICAgICAgICBIRkEzODR4X1JJRF9DTkZXRVBERUZBVUxUS0VZMiwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfd2VwZGVmYXVsdGtleSB9LAotICAgIHsgRElEbWliX3AyX3AyU3RhdGljX3AyQ25mV0VQRGVmYXVsdEtleTMsCi0gICAgICAgICAgRl9BUCB8IEZfU1RBIHwgRl9XUklURSwKLSAgICAgICAgICBIRkEzODR4X1JJRF9DTkZXRVBERUZBVUxUS0VZMywgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfd2VwZGVmYXVsdGtleSB9LAotICAgIHsgRElEbWliX3AyX3AyU3RhdGljX3AyQ25mV0VQRmxhZ3MsCi0gICAgICAgICAgRl9BUCB8IEZfU1RBIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICBIRkEzODR4X1JJRF9DTkZXRVBGTEFHUywgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyIH0sCi0gICAgeyBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZBdXRoZW50aWNhdGlvbiwKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIEhGQTM4NHhfUklEX0NORkFVVEhFTlRJQ0FUSU9OLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzIgfSwKLSAgICB7IERJRG1pYl9wMl9wMlN0YXRpY19wMkNuZk1heEFzc29jaWF0ZWRTdGF0aW9ucywKLSAgICAgICAgICBGX0FQIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICBIRkEzODR4X1JJRF9DTkZNQVhBU1NPQ1NUQVRJT05TLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzIgfSwKLSAgICB7IERJRG1pYl9wMl9wMlN0YXRpY19wMkNuZlR4Q29udHJvbCwKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIEhGQTM4NHhfUklEX0NORlRYQ09OVFJPTCwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyIH0sCi0gICAgeyBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZSb2FtaW5nTW9kZSwKLSAgICAgICAgICBGX1NUQSB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgSEZBMzg0eF9SSURfQ05GUk9BTUlOR01PREUsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMiB9LAotICAgIHsgRElEbWliX3AyX3AyU3RhdGljX3AyQ25mSG9zdEF1dGhlbnRpY2F0aW9uLAotICAgICAgICAgIEZfQVAgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIEhGQTM4NHhfUklEX0NORkhPU1RBVVRIQVNTT0MsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3RydXRoIH0sCi0gICAgeyBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZSY3ZDcmNFcnJvciwKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIEhGQTM4NHhfUklEX0NORlJDVkNSQ0VSUk9SLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzIgfSwKLSAgICB7IERJRG1pYl9wMl9wMlN0YXRpY19wMkNuZkFsdFJldHJ5Q291bnQsCi0gICAgICAgICAgRl9BUCB8IEZfU1RBIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICBIRkEzODR4X1JJRF9DTkZBTFRSRVRSWUNOVCwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyIH0sCi0gICAgeyBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZCZWFjb25JbnRlcnZhbCwKLSAgICAgICAgICBGX0FQIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICBIRkEzODR4X1JJRF9DTkZBUEJDTklOVCwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyIH0sCi0gICAgeyBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZNZWRpdW1PY2N1cGFuY3lMaW1pdCwKLSAgICAgICAgICBGX0FQIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICBIRkEzODR4X1JJRF9DTkZBUFBDRklORk8sIEhGQTM4NHhfUklEX0NORkFQUENGSU5GT19MRU4sIDAsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMm9mZnNldCB9LAotICAgIHsgRElEbWliX3AyX3AyU3RhdGljX3AyQ25mQ0ZQUGVyaW9kLAotICAgICAgICAgIEZfQVAgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIEhGQTM4NHhfUklEX0NORkFQUENGSU5GTywgSEZBMzg0eF9SSURfQ05GQVBQQ0ZJTkZPX0xFTiwgMSwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyb2Zmc2V0IH0sCi0gICAgeyBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZDRlBNYXhEdXJhdGlvbiwKLSAgICAgICAgICBGX0FQIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICBIRkEzODR4X1JJRF9DTkZBUFBDRklORk8sIEhGQTM4NHhfUklEX0NORkFQUENGSU5GT19MRU4sIDIsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMm9mZnNldCB9LAotICAgIHsgRElEbWliX3AyX3AyU3RhdGljX3AyQ25mQ0ZQRmxhZ3MsCi0gICAgICAgICAgRl9BUCB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgSEZBMzg0eF9SSURfQ05GQVBQQ0ZJTkZPLCBIRkEzODR4X1JJRF9DTkZBUFBDRklORk9fTEVOLCAzLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzJvZmZzZXQgfSwKLSAgICB7IERJRG1pYl9wMl9wMlN0YXRpY19wMkNuZlNUQVBDRkluZm8sCi0gICAgICAgICAgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIEhGQTM4NHhfUklEX0NORlNUQVBDRklORk8sIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMiB9LAotICAgIHsgRElEbWliX3AyX3AyU3RhdGljX3AyQ25mUHJpb3JpdHlRVXNhZ2UsCi0gICAgICAgICAgRl9BUCB8IEZfU1RBIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICBIRkEzODR4X1JJRF9DTkZQUklPUklUWVFVU0FHRSwgSEZBMzg0eF9SSURfQ05GUFJJT1FVU0FHRV9MRU4sIDAsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMmFycmF5IH0sCi0gICAgeyBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZUSU1DdHJsLAotICAgICAgICAgIEZfQVAgfCBGX1NUQSB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgSEZBMzg0eF9SSURfQ05GVElNQ1RSTCwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyIH0sCi0gICAgeyBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZUaGlydHkyVGFsbHksCi0gICAgICAgICAgRl9BUCB8IEZfU1RBIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICBIRkEzODR4X1JJRF9DTkZUSElSVFkyVEFMTFksIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3RydXRoIH0sCi0gICAgeyBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZFbmhTZWN1cml0eSwKLSAgICAgICAgICBGX0FQIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICBIRkEzODR4X1JJRF9DTkZFTkhTRUNVUklUWSwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyIH0sCi0gICAgeyBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZTaG9ydFByZWFtYmxlLAotICAgICAgICAgIEZfQVAgfCBGX1NUQSB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgSEZBMzg0eF9SSURfQ05GU0hPUlRQUkVBTUJMRSwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfcHJlYW1ibGUgfSwKLSAgICB7IERJRG1pYl9wMl9wMlN0YXRpY19wMkNuZkV4Y2x1ZGVMb25nUHJlYW1ibGUsCi0gICAgICAgICAgRl9BUCB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgSEZBMzg0eF9SSURfQ05GRVhDTE9OR1BSRUFNQkxFLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl90cnV0aCB9LAotICAgIHsgRElEbWliX3AyX3AyU3RhdGljX3AyQ25mQXV0aGVudGljYXRpb25Sc3BUTywKLSAgICAgICAgICBGX1NUQSB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgSEZBMzg0eF9SSURfQ05GQVVUSFJTUFRJTUVPVVQsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMiB9LAotICAgIHsgRElEbWliX3AyX3AyU3RhdGljX3AyQ25mQmFzaWNSYXRlcywKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIEhGQTM4NHhfUklEX0NORkJBU0lDUkFURVMsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMiB9LAotICAgIHsgRElEbWliX3AyX3AyU3RhdGljX3AyQ25mU3VwcG9ydGVkUmF0ZXMsCi0gICAgICAgICAgRl9BUCB8IEZfU1RBIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICBIRkEzODR4X1JJRF9DTkZTVVBQUkFURVMsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMiB9LAotCi0gICAgLyogcDJEeW5hbWljIE1JQidzICovCi0KLSAgICB7IERJRG1pYl9wMl9wMkR5bmFtaWNfcDJDcmVhdGVJQlNTLAotICAgICAgICAgIEZfU1RBIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICBIRkEzODR4X1JJRF9DUkVBVEVJQlNTLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl90cnV0aCB9LAotICAgIHsgRElEbWliX3AyX3AyRHluYW1pY19wMkZyYWdtZW50YXRpb25UaHJlc2hvbGQsCi0gICAgICAgICAgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIEhGQTM4NHhfUklEX0ZSQUdUSFJFU0gsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX2ZyYWdtZW50YXRpb250aHJlc2hvbGQgfSwKLSAgICB7IERJRG1pYl9wMl9wMkR5bmFtaWNfcDJSVFNUaHJlc2hvbGQsCi0gICAgICAgICAgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIEhGQTM4NHhfUklEX1JUU1RIUkVTSCwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyIH0sCi0gICAgeyBESURtaWJfcDJfcDJEeW5hbWljX3AyVHhSYXRlQ29udHJvbCwKLSAgICAgICAgICBGX1NUQSB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgSEZBMzg0eF9SSURfVFhSQVRFQ05UTCwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyIH0sCi0gICAgeyBESURtaWJfcDJfcDJEeW5hbWljX3AyUHJvbWlzY3VvdXNNb2RlLAotICAgICAgICAgIEZfU1RBIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICBIRkEzODR4X1JJRF9QUk9NSVNDTU9ERSwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdHJ1dGggfSwKLSAgICB7IERJRG1pYl9wMl9wMkR5bmFtaWNfcDJGcmFnbWVudGF0aW9uVGhyZXNob2xkMCwKLSAgICAgICAgICBGX0FQIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICBIRkEzODR4X1JJRF9GUkFHVEhSRVNIMCwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfZnJhZ21lbnRhdGlvbnRocmVzaG9sZCB9LAotICAgIHsgRElEbWliX3AyX3AyRHluYW1pY19wMkZyYWdtZW50YXRpb25UaHJlc2hvbGQxLAotICAgICAgICAgIEZfQVAgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIEhGQTM4NHhfUklEX0ZSQUdUSFJFU0gxLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl9mcmFnbWVudGF0aW9udGhyZXNob2xkIH0sCi0gICAgeyBESURtaWJfcDJfcDJEeW5hbWljX3AyRnJhZ21lbnRhdGlvblRocmVzaG9sZDIsCi0gICAgICAgICAgRl9BUCB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgSEZBMzg0eF9SSURfRlJBR1RIUkVTSDIsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX2ZyYWdtZW50YXRpb250aHJlc2hvbGQgfSwKLSAgICB7IERJRG1pYl9wMl9wMkR5bmFtaWNfcDJGcmFnbWVudGF0aW9uVGhyZXNob2xkMywKLSAgICAgICAgICBGX0FQIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICBIRkEzODR4X1JJRF9GUkFHVEhSRVNIMywgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfZnJhZ21lbnRhdGlvbnRocmVzaG9sZCB9LAotICAgIHsgRElEbWliX3AyX3AyRHluYW1pY19wMkZyYWdtZW50YXRpb25UaHJlc2hvbGQ0LAotICAgICAgICAgIEZfQVAgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIEhGQTM4NHhfUklEX0ZSQUdUSFJFU0g0LCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl9mcmFnbWVudGF0aW9udGhyZXNob2xkIH0sCi0gICAgeyBESURtaWJfcDJfcDJEeW5hbWljX3AyRnJhZ21lbnRhdGlvblRocmVzaG9sZDUsCi0gICAgICAgICAgRl9BUCB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgSEZBMzg0eF9SSURfRlJBR1RIUkVTSDUsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX2ZyYWdtZW50YXRpb250aHJlc2hvbGQgfSwKLSAgICB7IERJRG1pYl9wMl9wMkR5bmFtaWNfcDJGcmFnbWVudGF0aW9uVGhyZXNob2xkNiwKLSAgICAgICAgICBGX0FQIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICBIRkEzODR4X1JJRF9GUkFHVEhSRVNINiwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfZnJhZ21lbnRhdGlvbnRocmVzaG9sZCB9LAotICAgIHsgRElEbWliX3AyX3AyRHluYW1pY19wMlJUU1RocmVzaG9sZDAsCi0gICAgICAgICAgRl9BUCB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgSEZBMzg0eF9SSURfUlRTVEhSRVNIMCwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyIH0sCi0gICAgeyBESURtaWJfcDJfcDJEeW5hbWljX3AyUlRTVGhyZXNob2xkMSwKLSAgICAgICAgICBGX0FQIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICBIRkEzODR4X1JJRF9SVFNUSFJFU0gxLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzIgfSwKLSAgICB7IERJRG1pYl9wMl9wMkR5bmFtaWNfcDJSVFNUaHJlc2hvbGQyLAotICAgICAgICAgIEZfQVAgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIEhGQTM4NHhfUklEX1JUU1RIUkVTSDIsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMiB9LAotICAgIHsgRElEbWliX3AyX3AyRHluYW1pY19wMlJUU1RocmVzaG9sZDMsCi0gICAgICAgICAgRl9BUCB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgSEZBMzg0eF9SSURfUlRTVEhSRVNIMywgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyIH0sCi0gICAgeyBESURtaWJfcDJfcDJEeW5hbWljX3AyUlRTVGhyZXNob2xkNCwKLSAgICAgICAgICBGX0FQIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICBIRkEzODR4X1JJRF9SVFNUSFJFU0g0LCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzIgfSwKLSAgICB7IERJRG1pYl9wMl9wMkR5bmFtaWNfcDJSVFNUaHJlc2hvbGQ1LAotICAgICAgICAgIEZfQVAgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIEhGQTM4NHhfUklEX1JUU1RIUkVTSDUsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMiB9LAotICAgIHsgRElEbWliX3AyX3AyRHluYW1pY19wMlJUU1RocmVzaG9sZDYsCi0gICAgICAgICAgRl9BUCB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgSEZBMzg0eF9SSURfUlRTVEhSRVNINiwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyIH0sCi0gICAgeyBESURtaWJfcDJfcDJEeW5hbWljX3AyVHhSYXRlQ29udHJvbDAsCi0gICAgICAgICAgRl9BUCB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgSEZBMzg0eF9SSURfVFhSQVRFQ05UTDAsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMiB9LAotICAgIHsgRElEbWliX3AyX3AyRHluYW1pY19wMlR4UmF0ZUNvbnRyb2wxLAotICAgICAgICAgIEZfQVAgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIEhGQTM4NHhfUklEX1RYUkFURUNOVEwxLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzIgfSwKLSAgICB7IERJRG1pYl9wMl9wMkR5bmFtaWNfcDJUeFJhdGVDb250cm9sMiwKLSAgICAgICAgICBGX0FQIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICBIRkEzODR4X1JJRF9UWFJBVEVDTlRMMiwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyIH0sCi0gICAgeyBESURtaWJfcDJfcDJEeW5hbWljX3AyVHhSYXRlQ29udHJvbDMsCi0gICAgICAgICAgRl9BUCB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgSEZBMzg0eF9SSURfVFhSQVRFQ05UTDMsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMiB9LAotICAgIHsgRElEbWliX3AyX3AyRHluYW1pY19wMlR4UmF0ZUNvbnRyb2w0LAotICAgICAgICAgIEZfQVAgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIEhGQTM4NHhfUklEX1RYUkFURUNOVEw0LCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzIgfSwKLSAgICB7IERJRG1pYl9wMl9wMkR5bmFtaWNfcDJUeFJhdGVDb250cm9sNSwKLSAgICAgICAgICBGX0FQIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICBIRkEzODR4X1JJRF9UWFJBVEVDTlRMNSwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyIH0sCi0gICAgeyBESURtaWJfcDJfcDJEeW5hbWljX3AyVHhSYXRlQ29udHJvbDYsCi0gICAgICAgICAgRl9BUCB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgSEZBMzg0eF9SSURfVFhSQVRFQ05UTDYsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMiB9LAotCi0gICAgLyogcDJCZWhhdmlvciBNSUIncyAqLwotCi0gICAgeyBESURtaWJfcDJfcDJCZWhhdmlvcl9wMlRpY2tUaW1lLAotICAgICAgICAgIEZfQVAgfCBGX1NUQSB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgSEZBMzg0eF9SSURfSVRJQ0tUSU1FLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzIgfSwKLQotICAgIC8qIHAyTklDIE1JQidzICovCi0KLSAgICB7IERJRG1pYl9wMl9wMk5JQ19wMk1heExvYWRUaW1lLAotICAgICAgICAgIEZfQVAgfCBGX1NUQSB8IEZfUkVBRCwKLSAgICAgICAgICBIRkEzODR4X1JJRF9NQVhMT0FEVElNRSwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyIH0sCi0gICAgeyBESURtaWJfcDJfcDJOSUNfcDJETEJ1ZmZlclBhZ2UsCi0gICAgICAgICAgRl9BUCB8IEZfU1RBIHwgRl9SRUFELAotICAgICAgICAgIEhGQTM4NHhfUklEX0RPV05MT0FEQlVGRkVSLCBIRkEzODR4X1JJRF9ET1dOTE9BREJVRkZFUl9MRU4sIDAsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMm9mZnNldCB9LAotICAgIHsgRElEbWliX3AyX3AyTklDX3AyRExCdWZmZXJPZmZzZXQsCi0gICAgICAgICAgRl9BUCB8IEZfU1RBIHwgRl9SRUFELAotICAgICAgICAgIEhGQTM4NHhfUklEX0RPV05MT0FEQlVGRkVSLCBIRkEzODR4X1JJRF9ET1dOTE9BREJVRkZFUl9MRU4sIDEsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMm9mZnNldCB9LAotICAgIHsgRElEbWliX3AyX3AyTklDX3AyRExCdWZmZXJMZW5ndGgsCi0gICAgICAgICAgRl9BUCB8IEZfU1RBIHwgRl9SRUFELAotICAgICAgICAgIEhGQTM4NHhfUklEX0RPV05MT0FEQlVGRkVSLCBIRkEzODR4X1JJRF9ET1dOTE9BREJVRkZFUl9MRU4sIDIsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMm9mZnNldCB9LAotICAgIHsgRElEbWliX3AyX3AyTklDX3AyUFJJSWRlbnRpdHksCi0gICAgICAgICAgRl9BUCB8IEZfU1RBIHwgRl9SRUFELAotICAgICAgICAgIEhGQTM4NHhfUklEX1BSSUlERU5USVRZLCBIRkEzODR4X1JJRF9QUklJREVOVElUWV9MRU4sIDAsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMmFycmF5IH0sCi0gICAgeyBESURtaWJfcDJfcDJOSUNfcDJQUklTdXBSYW5nZSwKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1JFQUQsCi0gICAgICAgICAgSEZBMzg0eF9SSURfUFJJU1VQUkFOR0UsIEhGQTM4NHhfUklEX1BSSVNVUFJBTkdFX0xFTiwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyYXJyYXkgfSwKLSAgICB7IERJRG1pYl9wMl9wMk5JQ19wMkNGSUFjdFJhbmdlcywKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1JFQUQsCi0gICAgICAgICAgSEZBMzg0eF9SSURfUFJJX0NGSUFDVFJBTkdFUywgSEZBMzg0eF9SSURfQ0ZJQUNUUkFOR0VTX0xFTiwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyYXJyYXkgfSwKLSAgICB7IERJRG1pYl9wMl9wMk5JQ19wMkJ1aWxkU2VxdWVuY2UsCi0gICAgICAgICAgRl9BUCB8IEZfU1RBIHwgRl9SRUFELAotICAgICAgICAgIEhGQTM4NHhfUklEX0JVSUxEU0VRLCBIRkEzODR4X1JJRF9CVUlMRFNFUV9MRU4sIDAsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMmFycmF5IH0sCi0gICAgeyBESURtaWJfcDJfcDJOSUNfcDJQcmltYXJ5RldJRCwKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1JFQUQsCi0gICAgICAgICAgMCwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfZndpZCB9LAotICAgIHsgRElEbWliX3AyX3AyTklDX3AyU2Vjb25kYXJ5RldJRCwKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1JFQUQsCi0gICAgICAgICAgMCwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfZndpZCB9LAotICAgIHsgRElEbWliX3AyX3AyTklDX3AyVGVydGlhcnlGV0lELAotICAgICAgICAgIEZfQVAgfCBGX1JFQUQsCi0gICAgICAgICAgMCwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfZndpZCB9LAotICAgIHsgRElEbWliX3AyX3AyTklDX3AyTklDU2VyaWFsTnVtYmVyLAotICAgICAgICAgIEZfQVAgfCBGX1NUQSB8IEZfUkVBRCwKLSAgICAgICAgICBIRkEzODR4X1JJRF9OSUNTRVJJQUxOVU1CRVIsIEhGQTM4NHhfUklEX05JQ1NFUklBTE5VTUJFUl9MRU4sIDAsCi0gICAgICAgICAgcHJpc20ybWliX2J5dGVhcmVhMnBzdHIgfSwKLSAgICB7IERJRG1pYl9wMl9wMk5JQ19wMk5JQ0lkZW50aXR5LAotICAgICAgICAgIEZfQVAgfCBGX1NUQSB8IEZfUkVBRCwKLSAgICAgICAgICBIRkEzODR4X1JJRF9OSUNJREVOVElUWSwgSEZBMzg0eF9SSURfTklDSURFTlRJVFlfTEVOLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzJhcnJheSB9LAotICAgIHsgRElEbWliX3AyX3AyTklDX3AyTUZJU3VwUmFuZ2UsCi0gICAgICAgICAgRl9BUCB8IEZfU1RBIHwgRl9SRUFELAotICAgICAgICAgIEhGQTM4NHhfUklEX01GSVNVUFJBTkdFLCBIRkEzODR4X1JJRF9NRklTVVBSQU5HRV9MRU4sIDAsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMmFycmF5IH0sCi0gICAgeyBESURtaWJfcDJfcDJOSUNfcDJDRklTdXBSYW5nZSwKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1JFQUQsCi0gICAgICAgICAgSEZBMzg0eF9SSURfQ0ZJU1VQUkFOR0UsIEhGQTM4NHhfUklEX0NGSVNVUFJBTkdFX0xFTiwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyYXJyYXkgfSwKLSAgICB7IERJRG1pYl9wMl9wMk5JQ19wMkNoYW5uZWxMaXN0LAotICAgICAgICAgIEZfQVAgfCBGX1NUQSB8IEZfUkVBRCwKLSAgICAgICAgICBIRkEzODR4X1JJRF9DSEFOTkVMTElTVCwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyIH0sCi0gICAgeyBESURtaWJfcDJfcDJOSUNfcDJSZWd1bGF0b3J5RG9tYWlucywKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1JFQUQsCi0gICAgICAgICAgSEZBMzg0eF9SSURfUkVHVUxBVE9SWURPTUFJTlMsIEhGQTM4NHhfUklEX1JFR1VMQVRPUllET01BSU5TX0xFTiwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfcmVndWxhdG9yeWRvbWFpbnMgfSwKLSAgICB7IERJRG1pYl9wMl9wMk5JQ19wMlRlbXBUeXBlLAotICAgICAgICAgIEZfQVAgfCBGX1NUQSB8IEZfUkVBRCwKLSAgICAgICAgICBIRkEzODR4X1JJRF9URU1QVFlQRSwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyIH0sCi0gICAgeyBESURtaWJfcDJfcDJOSUNfcDJTVEFJZGVudGl0eSwKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1JFQUQsCi0gICAgICAgICAgSEZBMzg0eF9SSURfU1RBSURFTlRJVFksIEhGQTM4NHhfUklEX1NUQUlERU5USVRZX0xFTiwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyYXJyYXkgfSwKLSAgICB7IERJRG1pYl9wMl9wMk5JQ19wMlNUQVN1cFJhbmdlLAotICAgICAgICAgIEZfQVAgfCBGX1NUQSB8IEZfUkVBRCwKLSAgICAgICAgICBIRkEzODR4X1JJRF9TVEFTVVBSQU5HRSwgSEZBMzg0eF9SSURfU1RBU1VQUkFOR0VfTEVOLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzJhcnJheSB9LAotICAgIHsgRElEbWliX3AyX3AyTklDX3AyTUZJQWN0UmFuZ2VzLAotICAgICAgICAgIEZfQVAgfCBGX1NUQSB8IEZfUkVBRCwKLSAgICAgICAgICBIRkEzODR4X1JJRF9TVEFfTUZJQUNUUkFOR0VTLCBIRkEzODR4X1JJRF9NRklBQ1RSQU5HRVNfTEVOLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzJhcnJheSB9LAotICAgIHsgRElEbWliX3AyX3AyTklDX3AyU1RBQ0ZJQWN0UmFuZ2VzLAotICAgICAgICAgIEZfQVAgfCBGX1NUQSB8IEZfUkVBRCwKLSAgICAgICAgICBIRkEzODR4X1JJRF9TVEFfQ0ZJQUNUUkFOR0VTLCBIRkEzODR4X1JJRF9DRklBQ1RSQU5HRVMyX0xFTiwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyYXJyYXkgfSwKIAogICAgIC8qIHAyTUFDIE1JQidzICovCiAKLSAgICB7IERJRG1pYl9wMl9wMk1BQ19wMlBvcnRTdGF0dXMsCi0gICAgICAgICAgRl9TVEEgfCBGX1JFQUQsCi0gICAgICAgICAgSEZBMzg0eF9SSURfUE9SVFNUQVRVUywgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyIH0sCi0gICAgeyBESURtaWJfcDJfcDJNQUNfcDJDdXJyZW50U1NJRCwKLSAgICAgICAgICBGX1NUQSB8IEZfUkVBRCwKLSAgICAgICAgICBIRkEzODR4X1JJRF9DVVJSRU5UU1NJRCwgSEZBMzg0eF9SSURfQ1VSUkVOVFNTSURfTEVOLCAwLAotICAgICAgICAgIHByaXNtMm1pYl9ieXRlc3RyMnBzdHIgfSwKLSAgICB7IERJRG1pYl9wMl9wMk1BQ19wMkN1cnJlbnRCU1NJRCwKLSAgICAgICAgICBGX1NUQSB8IEZfUkVBRCwKLSAgICAgICAgICBIRkEzODR4X1JJRF9DVVJSRU5UQlNTSUQsIEhGQTM4NHhfUklEX0NVUlJFTlRCU1NJRF9MRU4sIDAsCi0gICAgICAgICAgcHJpc20ybWliX2J5dGVhcmVhMnBzdHIgfSwKLSAgICB7IERJRG1pYl9wMl9wMk1BQ19wMkNvbW1zUXVhbGl0eSwKLSAgICAgICAgICBGX1NUQSB8IEZfUkVBRCwKLSAgICAgICAgICBIRkEzODR4X1JJRF9DT01NU1FVQUxJVFksIEhGQTM4NHhfUklEX0NPTU1TUVVBTElUWV9MRU4sIDAsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMmFycmF5IH0sCi0gICAgeyBESURtaWJfcDJfcDJNQUNfcDJDb21tc1F1YWxpdHlDUSwKLSAgICAgICAgICBGX1NUQSB8IEZfUkVBRCwKLSAgICAgICAgICBIRkEzODR4X1JJRF9DT01NU1FVQUxJVFksIEhGQTM4NHhfUklEX0NPTU1TUVVBTElUWV9MRU4sIDAsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMm9mZnNldCB9LAotICAgIHsgRElEbWliX3AyX3AyTUFDX3AyQ29tbXNRdWFsaXR5QVNMLAotICAgICAgICAgIEZfU1RBIHwgRl9SRUFELAotICAgICAgICAgIEhGQTM4NHhfUklEX0NPTU1TUVVBTElUWSwgSEZBMzg0eF9SSURfQ09NTVNRVUFMSVRZX0xFTiwgMSwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyb2Zmc2V0IH0sCi0gICAgeyBESURtaWJfcDJfcDJNQUNfcDJDb21tc1F1YWxpdHlBTkwsCi0gICAgICAgICAgRl9TVEEgfCBGX1JFQUQsCi0gICAgICAgICAgSEZBMzg0eF9SSURfQ09NTVNRVUFMSVRZLCBIRkEzODR4X1JJRF9DT01NU1FVQUxJVFlfTEVOLCAyLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzJvZmZzZXQgfSwKLSAgICB7IERJRG1pYl9wMl9wMk1BQ19wMmRibUNvbW1zUXVhbGl0eSwKLSAgICAgICAgICBGX1NUQSB8IEZfUkVBRCwKLSAgICAgICAgICBIRkEzODR4X1JJRF9EQk1DT01NU1FVQUxJVFksIEhGQTM4NHhfUklEX0RCTUNPTU1TUVVBTElUWV9MRU4sIDAsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMmFycmF5IH0sCi0gICAgeyBESURtaWJfcDJfcDJNQUNfcDJkYm1Db21tc1F1YWxpdHlDUSwKLSAgICAgICAgICBGX1NUQSB8IEZfUkVBRCwKLSAgICAgICAgICBIRkEzODR4X1JJRF9DT01NU1FVQUxJVFksIEhGQTM4NHhfUklEX0NPTU1TUVVBTElUWV9MRU4sIDAsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMm9mZnNldCB9LAotICAgIHsgRElEbWliX3AyX3AyTUFDX3AyZGJtQ29tbXNRdWFsaXR5QVNMLAotICAgICAgICAgIEZfU1RBIHwgRl9SRUFELAotICAgICAgICAgIEhGQTM4NHhfUklEX0NPTU1TUVVBTElUWSwgSEZBMzg0eF9SSURfQ09NTVNRVUFMSVRZX0xFTiwgMSwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyb2Zmc2V0IH0sCi0gICAgeyBESURtaWJfcDJfcDJNQUNfcDJkYm1Db21tc1F1YWxpdHlBTkwsCi0gICAgICAgICAgRl9TVEEgfCBGX1JFQUQsCi0gICAgICAgICAgSEZBMzg0eF9SSURfQ09NTVNRVUFMSVRZLCBIRkEzODR4X1JJRF9DT01NU1FVQUxJVFlfTEVOLCAyLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzJvZmZzZXQgfSwKICAgICB7IERJRG1pYl9wMl9wMk1BQ19wMkN1cnJlbnRUeFJhdGUsCiAgICAgICAgICAgRl9TVEEgfCBGX1JFQUQsCiAgICAgICAgICAgSEZBMzg0eF9SSURfQ1VSUkVOVFRYUkFURSwgMCwgMCwKICAgICAgICAgICBwcmlzbTJtaWJfdWludDMyIH0sCi0gICAgeyBESURtaWJfcDJfcDJNQUNfcDJDdXJyZW50QmVhY29uSW50ZXJ2YWwsCi0gICAgICAgICAgRl9BUCB8IEZfU1RBIHwgRl9SRUFELAotICAgICAgICAgIEhGQTM4NHhfUklEX0NVUlJFTlRCQ05JTlQsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMiB9LAotICAgIHsgRElEbWliX3AyX3AyTUFDX3AyU3RhQ3VycmVudFNjYWxlVGhyZXNob2xkcywKLSAgICAgICAgICBGX1NUQSB8IEZfUkVBRCwKLSAgICAgICAgICBIRkEzODR4X1JJRF9DVVJSRU5UU0NBTEVUSFJFU0gsIEhGQTM4NHhfUklEX1NUQUNVUlNDQUxFVEhSRVNIX0xFTiwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyYXJyYXkgfSwKLSAgICB7IERJRG1pYl9wMl9wMk1BQ19wMkFQQ3VycmVudFNjYWxlVGhyZXNob2xkcywKLSAgICAgICAgICBGX0FQIHwgRl9SRUFELAotICAgICAgICAgIEhGQTM4NHhfUklEX0NVUlJFTlRTQ0FMRVRIUkVTSCwgSEZBMzg0eF9SSURfQVBDVVJTQ0FMRVRIUkVTSF9MRU4sIDAsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMmFycmF5IH0sCi0gICAgeyBESURtaWJfcDJfcDJNQUNfcDJQcm90b2NvbFJzcFRpbWUsCi0gICAgICAgICAgRl9BUCB8IEZfU1RBIHwgRl9SRUFELAotICAgICAgICAgIEhGQTM4NHhfUklEX1BST1RPQ09MUlNQVElNRSwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyIH0sCi0gICAgeyBESURtaWJfcDJfcDJNQUNfcDJTaG9ydFJldHJ5TGltaXQsCi0gICAgICAgICAgRl9BUCB8IEZfU1RBIHwgRl9SRUFELAotICAgICAgICAgIEhGQTM4NHhfUklEX1NIT1JUUkVUUllMSU1JVCwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyIH0sCi0gICAgeyBESURtaWJfcDJfcDJNQUNfcDJMb25nUmV0cnlMaW1pdCwKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1JFQUQsCi0gICAgICAgICAgSEZBMzg0eF9SSURfTE9OR1JFVFJZTElNSVQsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMiB9LAotICAgIHsgRElEbWliX3AyX3AyTUFDX3AyTWF4VHJhbnNtaXRMaWZldGltZSwKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1JFQUQsCi0gICAgICAgICAgSEZBMzg0eF9SSURfTUFYVFhMSUZFVElNRSwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyIH0sCi0gICAgeyBESURtaWJfcDJfcDJNQUNfcDJNYXhSZWNlaXZlTGlmZXRpbWUsCi0gICAgICAgICAgRl9BUCB8IEZfU1RBIHwgRl9SRUFELAotICAgICAgICAgIEhGQTM4NHhfUklEX01BWFJYTElGRVRJTUUsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMiB9LAotICAgIHsgRElEbWliX3AyX3AyTUFDX3AyQ0ZQb2xsYWJsZSwKLSAgICAgICAgICBGX1NUQSB8IEZfUkVBRCwKLSAgICAgICAgICBIRkEzODR4X1JJRF9DRlBPTExBQkxFLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzIgfSwKLSAgICB7IERJRG1pYl9wMl9wMk1BQ19wMkF1dGhlbnRpY2F0aW9uQWxnb3JpdGhtcywKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1JFQUQsCi0gICAgICAgICAgSEZBMzg0eF9SSURfQVVUSEFMR09SSVRITVMsIEhGQTM4NHhfUklEX0FVVEhBTEdPUklUSE1TX0xFTiwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyYXJyYXkgfSwKLSAgICB7IERJRG1pYl9wMl9wMk1BQ19wMlByaXZhY3lPcHRpb25JbXBsZW1lbnRlZCwKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1JFQUQsCi0gICAgICAgICAgSEZBMzg0eF9SSURfUFJJVkFDWU9QVElNUCwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyIH0sCi0gICAgeyBESURtaWJfcDJfcDJNQUNfcDJDdXJyZW50VHhSYXRlMSwKLSAgICAgICAgICBGX0FQIHwgRl9SRUFELAotICAgICAgICAgIEhGQTM4NHhfUklEX0NVUlJFTlRUWFJBVEUxLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzIgfSwKLSAgICB7IERJRG1pYl9wMl9wMk1BQ19wMkN1cnJlbnRUeFJhdGUyLAotICAgICAgICAgIEZfQVAgfCBGX1JFQUQsCi0gICAgICAgICAgSEZBMzg0eF9SSURfQ1VSUkVOVFRYUkFURTIsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMiB9LAotICAgIHsgRElEbWliX3AyX3AyTUFDX3AyQ3VycmVudFR4UmF0ZTMsCi0gICAgICAgICAgRl9BUCB8IEZfUkVBRCwKLSAgICAgICAgICBIRkEzODR4X1JJRF9DVVJSRU5UVFhSQVRFMywgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyIH0sCi0gICAgeyBESURtaWJfcDJfcDJNQUNfcDJDdXJyZW50VHhSYXRlNCwKLSAgICAgICAgICBGX0FQIHwgRl9SRUFELAotICAgICAgICAgIEhGQTM4NHhfUklEX0NVUlJFTlRUWFJBVEU0LCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzIgfSwKLSAgICB7IERJRG1pYl9wMl9wMk1BQ19wMkN1cnJlbnRUeFJhdGU1LAotICAgICAgICAgIEZfQVAgfCBGX1JFQUQsCi0gICAgICAgICAgSEZBMzg0eF9SSURfQ1VSUkVOVFRYUkFURTUsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMiB9LAotICAgIHsgRElEbWliX3AyX3AyTUFDX3AyQ3VycmVudFR4UmF0ZTYsCi0gICAgICAgICAgRl9BUCB8IEZfUkVBRCwKLSAgICAgICAgICBIRkEzODR4X1JJRF9DVVJSRU5UVFhSQVRFNiwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyIH0sCi0gICAgeyBESURtaWJfcDJfcDJNQUNfcDJPd25NQUNBZGRyZXNzLAotICAgICAgICAgIEZfQVAgfCBGX1JFQUQsCi0gICAgICAgICAgSEZBMzg0eF9SSURfT1dOTUFDQUREUkVTUywgSEZBMzg0eF9SSURfT1dOTUFDQUREUkVTU19MRU4sIDAsCi0gICAgICAgICAgcHJpc20ybWliX2J5dGVhcmVhMnBzdHIgfSwKLQotICAgIC8qIHAyTW9kZW0gTUlCJ3MgKi8KLQotICAgIHsgRElEbWliX3AyX3AyTW9kZW1fcDJQSFlUeXBlLAotICAgICAgICAgIEZfQVAgfCBGX1NUQSB8IEZfUkVBRCwKLSAgICAgICAgICBIRkEzODR4X1JJRF9QSFlUWVBFLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzIgfSwKLSAgICB7IERJRG1pYl9wMl9wMk1vZGVtX3AyQ3VycmVudENoYW5uZWwsCi0gICAgICAgICAgRl9BUCB8IEZfU1RBIHwgRl9SRUFELAotICAgICAgICAgIEhGQTM4NHhfUklEX0NVUlJFTlRDSEFOTkVMLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzIgfSwKLSAgICB7IERJRG1pYl9wMl9wMk1vZGVtX3AyQ3VycmVudFBvd2VyU3RhdGUsCi0gICAgICAgICAgRl9BUCB8IEZfU1RBIHwgRl9SRUFELAotICAgICAgICAgIEhGQTM4NHhfUklEX0NVUlJFTlRQT1dFUlNUQVRFLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzIgfSwKLSAgICB7IERJRG1pYl9wMl9wMk1vZGVtX3AyQ0NBTW9kZSwKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1JFQUQsCi0gICAgICAgICAgSEZBMzg0eF9SSURfQ0NBTU9ERSwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyIH0sCi0gICAgeyBESURtaWJfcDJfcDJNb2RlbV9wMlR4UG93ZXJNYXgsCi0gICAgICAgICAgRl9BUCB8IEZfU1RBIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICBIRkEzODR4X1JJRF9UWFBPV0VSTUFYLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzIgfSwKLSAgICB7IERJRG1pYl9kb3QxMXBoeV9kb3QxMVBoeVR4UG93ZXJUYWJsZV9kb3QxMUN1cnJlbnRUeFBvd2VyTGV2ZWwsCi0gICAgICAgICAgRl9BUCB8IEZfU1RBIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICBIRkEzODR4X1JJRF9UWFBPV0VSTUFYLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzIgfSwKLSAgICB7IERJRG1pYl9wMl9wMk1vZGVtX3AyU3VwcG9ydGVkRGF0YVJhdGVzLAotICAgICAgICAgIEZfQVAgfCBGX1NUQSB8IEZfUkVBRCwKLSAgICAgICAgICBIRkEzODR4X1JJRF9TVVBQT1JURUREQVRBUkFURVMsIEhGQTM4NHhfUklEX1NVUFBPUlRFRERBVEFSQVRFU19MRU4sIDAsCi0gICAgICAgICAgcHJpc20ybWliX2J5dGVzdHIycHN0ciB9LAogCiAgICAgLyogQW5kIGZpbmFsbHksIGxueCBtaWJzICovCiAgICAgeyBESURtaWJfbG54X2xueENvbmZpZ1RhYmxlX2xueFJTTkFJRSwKQEAgLTEyODUsOTQgKzI3MCw2IEBACiAgICAgICAgICAgcHJpc20ybWliX3ByaXYgfSwKICAgICB7IDAsIDAsIDAsIDAsIDAsIE5VTEx9fTsKIAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1UaGVzZSBNSUIncyBhcmUgbm90IHN1cHBvcnRlZCBhdCB0aGlzIHRpbWU6Ci0KLURJRG1pYl9kb3QxMXBoeV9kb3QxMVBoeU9wZXJhdGlvblRhYmxlX2RvdDExQ2hhbm5lbEFnaWxpdHlQcmVzZW50Ci1ESURtaWJfZG90MTFwaHlfZG90MTFQaHlPcGVyYXRpb25UYWJsZV9kb3QxMUNoYW5uZWxBZ2lsaXR5RW5hYmxlZAotRElEbWliX2RvdDExcGh5X2RvdDExUGh5RFNTU1RhYmxlX2RvdDExUEJDQ09wdGlvbkltcGxlbWVudGVkCi1ESURtaWJfZG90MTFwaHlfZG90MTFSZWdEb21haW5zU3VwcG9ydGVkVGFibGVfZG90MTFSZWdEb21haW5zU3VwcG9ydEluZGV4Ci1ESURtaWJfZG90MTFwaHlfZG90MTFTdXBwb3J0ZWREYXRhUmF0ZXNUeFRhYmxlX2RvdDExU3VwcG9ydGVkRGF0YVJhdGVzVHhJbmRleAotRElEbWliX2RvdDExcGh5X2RvdDExU3VwcG9ydGVkRGF0YVJhdGVzVHhUYWJsZV9kb3QxMVN1cHBvcnRlZERhdGFSYXRlc1R4VmFsdWUKLURJRG1pYl9kb3QxMXBoeV9kb3QxMVN1cHBvcnRlZERhdGFSYXRlc1J4VGFibGVfZG90MTFTdXBwb3J0ZWREYXRhUmF0ZXNSeEluZGV4Ci1ESURtaWJfZG90MTFwaHlfZG90MTFTdXBwb3J0ZWREYXRhUmF0ZXNSeFRhYmxlX2RvdDExU3VwcG9ydGVkRGF0YVJhdGVzUnhWYWx1ZQotCi1ESURtaWJfZG90MTFwaHlfZG90MTFSZWdEb21haW5zU3VwcG9ydGVkVGFibGVfZG90MTFSZWdEb21haW5zU3VwcG9ydFZhbHVlCi1UT0RPOiBuZWVkIHRvIGludmVzdGlnYXRlIHdoeSB3bGFuIGhhcyB0aGlzIGFzIGVudW1lcmF0ZWQgYW5kIFByaXNtMiBoYXMgdGhpcwotICAgICAgYXMgYnR5ZSBzdHIuCi0KLURJRG1pYl9kb3QxMXBoeV9kb3QxMVBoeURTU1NUYWJsZV9kb3QxMVNob3J0UHJlYW1ibGVPcHRpb25JbXBsZW1lbnRlZAotVE9ETzogRmluZCBvdXQgdGhlIGZpcm13YXJlIHZlcnNpb24gbnVtYmVyKHMpIGZvciBpZGVudGlmeWluZwotICAgICAgd2hldGhlciB0aGUgZmlybXdhcmUgaXMgY2FwYWJsZSBvZiBzaG9ydCBwcmVhbWJsZS4gVFJVRSBvciBGQUxTRQotICAgICAgd2lsbCBiZSByZXR1cm5lZCBiYXNlZCBvbiB0aGUgdmVyc2lvbiBvZiB0aGUgZmlybXdhcmUuCi0KLVdFUCBLZXkgbWFwcGluZ3MgYXJlbid0IHN1cHBvcnRlZCBpbiB0aGUgZi93LgotRElEbWliX2RvdDExc210X2RvdDExV0VQS2V5TWFwcGluZ3NUYWJsZV9kb3QxMVdFUEtleU1hcHBpbmdJbmRleAotRElEbWliX2RvdDExc210X2RvdDExV0VQS2V5TWFwcGluZ3NUYWJsZV9kb3QxMVdFUEtleU1hcHBpbmdBZGRyZXNzCi1ESURtaWJfZG90MTFzbXRfZG90MTFXRVBLZXlNYXBwaW5nc1RhYmxlX2RvdDExV0VQS2V5TWFwcGluZ1dFUE9uCi1ESURtaWJfZG90MTFzbXRfZG90MTFXRVBLZXlNYXBwaW5nc1RhYmxlX2RvdDExV0VQS2V5TWFwcGluZ1ZhbHVlCi1ESURtaWJfZG90MTFzbXRfZG90MTFQcml2YWN5VGFibGVfZG90MTFXRVBLZXlNYXBwaW5nTGVuZ3RoCi0KLVRPRE86IGltcGxlbWVudCBjb3VudGVycy4KLURJRG1pYl9kb3QxMXNtdF9kb3QxMVByaXZhY3lUYWJsZV9kb3QxMVdFUElDVkVycm9yQ291bnQKLURJRG1pYl9kb3QxMXNtdF9kb3QxMVByaXZhY3lUYWJsZV9kb3QxMVdFUEV4Y2x1ZGVkQ291bnQKLURJRG1pYl9kb3QxMW1hY19kb3QxMUNvdW50ZXJzVGFibGVfZG90MTFUcmFuc21pdHRlZEZyYWdtZW50Q291bnQKLURJRG1pYl9kb3QxMW1hY19kb3QxMUNvdW50ZXJzVGFibGVfZG90MTFNdWx0aWNhc3RUcmFuc21pdHRlZEZyYW1lQ291bnQKLURJRG1pYl9kb3QxMW1hY19kb3QxMUNvdW50ZXJzVGFibGVfZG90MTFGYWlsZWRDb3VudAotRElEbWliX2RvdDExbWFjX2RvdDExQ291bnRlcnNUYWJsZV9kb3QxMVJldHJ5Q291bnQKLURJRG1pYl9kb3QxMW1hY19kb3QxMUNvdW50ZXJzVGFibGVfZG90MTFNdWx0aXBsZVJldHJ5Q291bnQKLURJRG1pYl9kb3QxMW1hY19kb3QxMUNvdW50ZXJzVGFibGVfZG90MTFGcmFtZUR1cGxpY2F0ZUNvdW50Ci1ESURtaWJfZG90MTFtYWNfZG90MTFDb3VudGVyc1RhYmxlX2RvdDExUlRTU3VjY2Vzc0NvdW50Ci1ESURtaWJfZG90MTFtYWNfZG90MTFDb3VudGVyc1RhYmxlX2RvdDExUlRTRmFpbHVyZUNvdW50Ci1ESURtaWJfZG90MTFtYWNfZG90MTFDb3VudGVyc1RhYmxlX2RvdDExQUNLRmFpbHVyZUNvdW50Ci1ESURtaWJfZG90MTFtYWNfZG90MTFDb3VudGVyc1RhYmxlX2RvdDExUmVjZWl2ZWRGcmFnbWVudENvdW50Ci1ESURtaWJfZG90MTFtYWNfZG90MTFDb3VudGVyc1RhYmxlX2RvdDExTXVsdGljYXN0UmVjZWl2ZWRGcmFtZUNvdW50Ci1ESURtaWJfZG90MTFtYWNfZG90MTFDb3VudGVyc1RhYmxlX2RvdDExRkNTRXJyb3JDb3VudAotRElEbWliX2RvdDExbWFjX2RvdDExQ291bnRlcnNUYWJsZV9kb3QxMVRyYW5zbWl0dGVkRnJhbWVDb3VudAotRElEbWliX2RvdDExbWFjX2RvdDExQ291bnRlcnNUYWJsZV9kb3QxMVdFUFVuZGVjcnlwdGFibGVDb3VudAotCi1UT0RPOiBpbXBsZW1lbnQgc2FuZSB2YWx1ZXMgZm9yIHRoZXNlLgotRElEbWliX2RvdDExbWFjX2RvdDExT3BlcmF0aW9uVGFibGVfZG90MTFNYW51ZmFjdHVyZXJJRAotRElEbWliX2RvdDExbWFjX2RvdDExT3BlcmF0aW9uVGFibGVfZG90MTFQcm9kdWN0SUQKLQotTm90IHRvbyB3b3JyaWVkIGFib3V0IHRoZXNlIGF0IHRoZSBtb21lbnQuCi1ESURtaWJfZG90MTFwaHlfZG90MTFQaHlBbnRlbm5hVGFibGVfZG90MTFDdXJyZW50VHhBbnRlbm5hCi1ESURtaWJfZG90MTFwaHlfZG90MTFQaHlBbnRlbm5hVGFibGVfZG90MTFEaXZlcnNpdHlTdXBwb3J0Ci1ESURtaWJfZG90MTFwaHlfZG90MTFQaHlBbnRlbm5hVGFibGVfZG90MTFDdXJyZW50UnhBbnRlbm5hCi1ESURtaWJfZG90MTFwaHlfZG90MTFQaHlUeFBvd2VyVGFibGVfZG90MTFOdW1iZXJTdXBwb3J0ZWRQb3dlckxldmVscwotRElEbWliX2RvdDExcGh5X2RvdDExUGh5VHhQb3dlclRhYmxlX2RvdDExVHhQb3dlckxldmVsMQotRElEbWliX2RvdDExcGh5X2RvdDExUGh5VHhQb3dlclRhYmxlX2RvdDExVHhQb3dlckxldmVsMgotRElEbWliX2RvdDExcGh5X2RvdDExUGh5VHhQb3dlclRhYmxlX2RvdDExVHhQb3dlckxldmVsMwotRElEbWliX2RvdDExcGh5X2RvdDExUGh5VHhQb3dlclRhYmxlX2RvdDExVHhQb3dlckxldmVsNAotRElEbWliX2RvdDExcGh5X2RvdDExUGh5VHhQb3dlclRhYmxlX2RvdDExVHhQb3dlckxldmVsNQotRElEbWliX2RvdDExcGh5X2RvdDExUGh5VHhQb3dlclRhYmxlX2RvdDExVHhQb3dlckxldmVsNgotRElEbWliX2RvdDExcGh5X2RvdDExUGh5VHhQb3dlclRhYmxlX2RvdDExVHhQb3dlckxldmVsNwotRElEbWliX2RvdDExcGh5X2RvdDExUGh5VHhQb3dlclRhYmxlX2RvdDExVHhQb3dlckxldmVsOAotRElEbWliX2RvdDExcGh5X2RvdDExUGh5VHhQb3dlclRhYmxlX2RvdDExQ3VycmVudFR4UG93ZXJMZXZlbAotCi1VbW1tLCBGSCBhbmQgSVIgZG9uJ3QgYXBwbHkKLURJRG1pYl9kb3QxMXBoeV9kb3QxMVBoeUZIU1NUYWJsZV9kb3QxMUhvcFRpbWUKLURJRG1pYl9kb3QxMXBoeV9kb3QxMVBoeUZIU1NUYWJsZV9kb3QxMUN1cnJlbnRDaGFubmVsTnVtYmVyCi1ESURtaWJfZG90MTFwaHlfZG90MTFQaHlGSFNTVGFibGVfZG90MTFNYXhEd2VsbFRpbWUKLURJRG1pYl9kb3QxMXBoeV9kb3QxMVBoeUZIU1NUYWJsZV9kb3QxMUN1cnJlbnREd2VsbFRpbWUKLURJRG1pYl9kb3QxMXBoeV9kb3QxMVBoeUZIU1NUYWJsZV9kb3QxMUN1cnJlbnRTZXQKLURJRG1pYl9kb3QxMXBoeV9kb3QxMVBoeUZIU1NUYWJsZV9kb3QxMUN1cnJlbnRQYXR0ZXJuCi1ESURtaWJfZG90MTFwaHlfZG90MTFQaHlGSFNTVGFibGVfZG90MTFDdXJyZW50SW5kZXgKLURJRG1pYl9kb3QxMXBoeV9kb3QxMVBoeURTU1NUYWJsZV9kb3QxMUNDQU1vZGVTdXBwb3J0ZWQKLURJRG1pYl9kb3QxMXBoeV9kb3QxMVBoeURTU1NUYWJsZV9kb3QxMUVEVGhyZXNob2xkCi1ESURtaWJfZG90MTFwaHlfZG90MTFQaHlJUlRhYmxlX2RvdDExQ0NBV2F0Y2hkb2dUaW1lck1heAotRElEbWliX2RvdDExcGh5X2RvdDExUGh5SVJUYWJsZV9kb3QxMUNDQVdhdGNoZG9nQ291bnRNYXgKLURJRG1pYl9kb3QxMXBoeV9kb3QxMVBoeUlSVGFibGVfZG90MTFDQ0FXYXRjaGRvZ1RpbWVyTWluCi1ESURtaWJfZG90MTFwaHlfZG90MTFQaHlJUlRhYmxlX2RvdDExQ0NBV2F0Y2hkb2dDb3VudE1pbgotCi1XZSBqdXN0IGRvbid0IGhhdmUgZW5vdWdoIGFudGVubmFzIHJpZ2h0IG5vdyB0byB3b3JyeSBhYm91dCB0aGlzLgotRElEbWliX2RvdDExcGh5X2RvdDExQW50ZW5uYXNMaXN0VGFibGVfZG90MTFBbnRlbm5hTGlzdEluZGV4Ci1ESURtaWJfZG90MTFwaHlfZG90MTFBbnRlbm5hc0xpc3RUYWJsZV9kb3QxMVN1cHBvcnRlZFR4QW50ZW5uYQotRElEbWliX2RvdDExcGh5X2RvdDExQW50ZW5uYXNMaXN0VGFibGVfZG90MTFTdXBwb3J0ZWRSeEFudGVubmEKLURJRG1pYl9kb3QxMXBoeV9kb3QxMUFudGVubmFzTGlzdFRhYmxlX2RvdDExRGl2ZXJzaXR5U2VsZWN0aW9uUngKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KIC8qIEZ1bmN0aW9uIERlZmluaXRpb25zICovCiAKQEAgLTE0MDEsNyArMjk4LDggQEAKIAloZmEzODR4X3QJCSpodyA9IHdsYW5kZXYtPnByaXY7CiAJaW50CQkJcmVzdWx0LCBpc2dldDsKIAltaWJyZWNfdAkJKm1pYjsKLQlVSU5UMTYJCQl3aGljaDsKKworCXUxNgkJCXdoaWNoOwogCiAJcDgwMjExbXNnX2RvdDExcmVxX21pYnNldF90CSptc2cgPSBtc2dwOwogCXA4MDIxMWl0ZW1kX3QJCQkqbWliaXRlbTsKQEAgLTE0MTUsNyArMzEzLDcgQEAKIAkqKiBEZXRlcm1pbmUgaWYgdGhpcyBpcyBhbiBBY2Nlc3MgUG9pbnQgb3IgYSBzdGF0aW9uLgogCSovCiAKLQl3aGljaCA9IGh3LT5hcCA/IEZfQVAgOiBGX1NUQTsKKwl3aGljaCA9IEZfU1RBOwogCiAJLyoKIAkqKiBGaW5kIHRoZSBNSUIgaW4gdGhlIE1JQiB0YWJsZS4gIE5vdGUgdGhhdCBhIE1JQiBtYXkgYmUgaW4gdGhlCkBAIC0xNDkxLDU5ICszODksNiBAQAogfQogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogcHJpc20ybWliX2J5dGVzdHIycHN0cgotKgotKiBHZXQvc2V0IHBzdHIgZGF0YSB0by9mcm9tIGEgYnl0ZSBzdHJpbmcuCi0qCi0qIE1JQiByZWNvcmQgcGFyYW1ldGVyczoKLSogICAgICAgcGFybTEgICAgUHJpc20yIFJJRCB2YWx1ZS4KLSogICAgICAgcGFybTIgICAgTnVtYmVyIG9mIGJ5dGVzIG9mIFJJRCBkYXRhLgotKiAgICAgICBwYXJtMyAgICBOb3QgdXNlZC4KLSoKLSogQXJndW1lbnRzOgotKiAgICAgICBtaWIgICAgICBNSUIgcmVjb3JkLgotKiAgICAgICBpc2dldCAgICBNSUJHRVQvTUlCU0VUIGZsYWcuCi0qICAgICAgIHdsYW5kZXYgIHdsYW4gZGV2aWNlIHN0cnVjdHVyZS4KLSogICAgICAgcHJpdiAgICAgInByaXYiIHN0cnVjdHVyZS4KLSogICAgICAgaHcgICAgICAgImh3IiBzdHJ1Y3R1cmUuCi0qICAgICAgIG1zZyAgICAgIE1lc3NhZ2Ugc3RydWN0dXJlLgotKiAgICAgICBkYXRhICAgICBEYXRhIGJ1ZmZlci4KLSoKLSogUmV0dXJuczoKLSogICAgICAgMCAgIC0gU3VjY2Vzcy4KLSogICAgICAgfjAgIC0gRXJyb3IuCi0qCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIGludCBwcmlzbTJtaWJfYnl0ZXN0cjJwc3RyKAotbWlicmVjX3QgICAgICAgICAgICAgICAgICAgICAqbWliLAotaW50ICAgICAgICAgICAgICAgICAgICAgICAgICBpc2dldCwKLXdsYW5kZXZpY2VfdCAgICAgICAgICAgICAgICAgKndsYW5kZXYsCi1oZmEzODR4X3QgICAgICAgICAgICAgICAgICAgICpodywKLXA4MDIxMW1zZ19kb3QxMXJlcV9taWJzZXRfdCAgKm1zZywKLXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGEpCi17Ci0JaW50ICAgICAgICAgICAgICAgIHJlc3VsdDsKLQlwODAyMTFwc3RyZF90ICAgICAgKnBzdHIgPSAocDgwMjExcHN0cmRfdCopIGRhdGE7Ci0JVUlOVDggICAgICAgICAgICAgIGJ5dGVidWZbTUlCX1RNUF9NQVhMRU5dOwotCWhmYTM4NHhfYnl0ZXN0cl90ICAqcDJieXRlc3RyID0gKGhmYTM4NHhfYnl0ZXN0cl90KikgYnl0ZWJ1ZjsKLQotCURCRkVOVEVSOwotCi0JaWYgKGlzZ2V0KSB7Ci0JCXJlc3VsdCA9IGhmYTM4NHhfZHJ2cl9nZXRjb25maWcoaHcsIG1pYi0+cGFybTEsIGJ5dGVidWYsIG1pYi0+cGFybTIpOwotCQlwcmlzbTJtZ210X2J5dGVzdHIycHN0cihwMmJ5dGVzdHIsIHBzdHIpOwotCX0gZWxzZSB7Ci0JCW1lbXNldChieXRlYnVmLCAwLCBtaWItPnBhcm0yKTsKLQkJcHJpc20ybWdtdF9wc3RyMmJ5dGVzdHIocDJieXRlc3RyLCBwc3RyKTsKLQkJcmVzdWx0ID0gaGZhMzg0eF9kcnZyX3NldGNvbmZpZyhodywgbWliLT5wYXJtMSwgYnl0ZWJ1ZiwgbWliLT5wYXJtMik7Ci0JfQotCi0JREJGRVhJVDsKLQlyZXR1cm4ocmVzdWx0KTsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIHByaXNtMm1pYl9ieXRlYXJlYTJwc3RyCiAqCiAqIEdldC9zZXQgcHN0ciBkYXRhIHRvL2Zyb20gYSBieXRlIGFyZWEuCkBAIC0xNTc4LDEzICs0MjMsMTMgQEAKIHsKIAlpbnQgICAgICAgICAgICByZXN1bHQ7CiAJcDgwMjExcHN0cmRfdCAgKnBzdHIgPSAocDgwMjExcHN0cmRfdCopIGRhdGE7Ci0JVUlOVDggICAgICAgICAgYnl0ZWJ1ZltNSUJfVE1QX01BWExFTl07CisJdTggICAgICAgICAgYnl0ZWJ1ZltNSUJfVE1QX01BWExFTl07CiAKIAlEQkZFTlRFUjsKIAogCWlmIChpc2dldCkgewogCQlyZXN1bHQgPSBoZmEzODR4X2RydnJfZ2V0Y29uZmlnKGh3LCBtaWItPnBhcm0xLCBieXRlYnVmLCBtaWItPnBhcm0yKTsKLQkJcHJpc20ybWdtdF9ieXRlYXJlYTJwc3RyKGJ5dGVidWYsIHBzdHIsCW1pYi0+cGFybTIpOworCQlwcmlzbTJtZ210X2J5dGVhcmVhMnBzdHIoYnl0ZWJ1ZiwgcHN0ciwgbWliLT5wYXJtMik7CiAJfSBlbHNlIHsKIAkJbWVtc2V0KGJ5dGVidWYsIDAsIG1pYi0+cGFybTIpOwogCQlwcmlzbTJtZ210X3BzdHIyYnl0ZWFyZWEoYnl0ZWJ1ZiwgcHN0cik7CkBAIC0xNjI5LDkgKzQ3NCw5IEBACiB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhKQogewogCWludCAgICAgcmVzdWx0OwotCVVJTlQzMiAgKnVpbnQzMiA9IChVSU5UMzIqKSBkYXRhOwotCVVJTlQ4ICAgYnl0ZWJ1ZltNSUJfVE1QX01BWExFTl07Ci0JVUlOVDE2ICAqd29yZGJ1ZiA9IChVSU5UMTYqKSBieXRlYnVmOworCXUzMiAgKnVpbnQzMiA9ICh1MzIqKSBkYXRhOworCXU4ICAgYnl0ZWJ1ZltNSUJfVE1QX01BWExFTl07CisJdTE2ICAqd29yZGJ1ZiA9ICh1MTYqKSBieXRlYnVmOwogCiAJREJGRU5URVI7CiAKQEAgLTE2NTQsMTc4ICs0OTksNiBAQAogfQogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogcHJpc20ybWliX3VpbnQzMmFycmF5Ci0qCi0qIEdldC9zZXQgYW4gYXJyYXkgb2YgdWludDMyIGRhdGEuCi0qCi0qIE1JQiByZWNvcmQgcGFyYW1ldGVyczoKLSogICAgICAgcGFybTEgICAgUHJpc20yIFJJRCB2YWx1ZS4KLSogICAgICAgcGFybTIgICAgTnVtYmVyIG9mIGJ5dGVzIG9mIFJJRCBkYXRhLgotKiAgICAgICBwYXJtMyAgICBOb3QgdXNlZC4KLSoKLSogQXJndW1lbnRzOgotKiAgICAgICBtaWIgICAgICBNSUIgcmVjb3JkLgotKiAgICAgICBpc2dldCAgICBNSUJHRVQvTUlCU0VUIGZsYWcuCi0qICAgICAgIHdsYW5kZXYgIHdsYW4gZGV2aWNlIHN0cnVjdHVyZS4KLSogICAgICAgcHJpdiAgICAgInByaXYiIHN0cnVjdHVyZS4KLSogICAgICAgaHcgICAgICAgImh3IiBzdHJ1Y3R1cmUuCi0qICAgICAgIG1zZyAgICAgIE1lc3NhZ2Ugc3RydWN0dXJlLgotKiAgICAgICBkYXRhICAgICBEYXRhIGJ1ZmZlci4KLSoKLSogUmV0dXJuczoKLSogICAgICAgMCAgIC0gU3VjY2Vzcy4KLSogICAgICAgfjAgIC0gRXJyb3IuCi0qCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIGludCBwcmlzbTJtaWJfdWludDMyYXJyYXkoCi1taWJyZWNfdCAgICAgICAgICAgICAgICAgICAgICptaWIsCi1pbnQgICAgICAgICAgICAgICAgICAgICAgICAgIGlzZ2V0LAotd2xhbmRldmljZV90ICAgICAgICAgICAgICAgICAqd2xhbmRldiwKLWhmYTM4NHhfdCAgICAgICAgICAgICAgICAgICAgKmh3LAotcDgwMjExbXNnX2RvdDExcmVxX21pYnNldF90ICAqbXNnLAotdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YSkKLXsKLQlpbnQgICAgIHJlc3VsdDsKLQlVSU5UMzIgICp1aW50MzIgPSAoVUlOVDMyICopIGRhdGE7Ci0JVUlOVDggICBieXRlYnVmW01JQl9UTVBfTUFYTEVOXTsKLQlVSU5UMTYgICp3b3JkYnVmID0gKFVJTlQxNiopIGJ5dGVidWY7Ci0JaW50ICAgICBpLCBjbnQ7Ci0KLQlEQkZFTlRFUjsKLQotCWNudCA9IG1pYi0+cGFybTIgLyBzaXplb2YoVUlOVDE2KTsKLQotCWlmIChpc2dldCkgewotCQlyZXN1bHQgPSBoZmEzODR4X2RydnJfZ2V0Y29uZmlnKGh3LCBtaWItPnBhcm0xLCB3b3JkYnVmLCBtaWItPnBhcm0yKTsKLQkJZm9yIChpID0gMDsgaSA8IGNudDsgaSsrKQotCQkJcHJpc20ybWdtdF9wcmlzbTJpbnQycDgwMjExaW50KHdvcmRidWYraSwgdWludDMyK2kpOwotCX0gZWxzZSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBjbnQ7IGkrKykKLQkJCXByaXNtMm1nbXRfcDgwMjExaW50MnByaXNtMmludCh3b3JkYnVmK2ksIHVpbnQzMitpKTsKLQkJcmVzdWx0ID0gaGZhMzg0eF9kcnZyX3NldGNvbmZpZyhodywgbWliLT5wYXJtMSwgd29yZGJ1ZiwgbWliLT5wYXJtMik7Ci0JCX0KLQotCURCRkVYSVQ7Ci0JcmV0dXJuKHJlc3VsdCk7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBwcmlzbTJtaWJfdWludDMyb2Zmc2V0Ci0qCi0qIEdldC9zZXQgYSBzaW5nbGUgZWxlbWVudCBpbiBhbiBhcnJheSBvZiB1aW50MzIgZGF0YS4KLSoKLSogTUlCIHJlY29yZCBwYXJhbWV0ZXJzOgotKiAgICAgICBwYXJtMSAgICBQcmlzbTIgUklEIHZhbHVlLgotKiAgICAgICBwYXJtMiAgICBOdW1iZXIgb2YgYnl0ZXMgb2YgUklEIGRhdGEuCi0qICAgICAgIHBhcm0zICAgIEVsZW1lbnQgaW5kZXguCi0qCi0qIEFyZ3VtZW50czoKLSogICAgICAgbWliICAgICAgTUlCIHJlY29yZC4KLSogICAgICAgaXNnZXQgICAgTUlCR0VUL01JQlNFVCBmbGFnLgotKiAgICAgICB3bGFuZGV2ICB3bGFuIGRldmljZSBzdHJ1Y3R1cmUuCi0qICAgICAgIHByaXYgICAgICJwcml2IiBzdHJ1Y3R1cmUuCi0qICAgICAgIGh3ICAgICAgICJodyIgc3RydWN0dXJlLgotKiAgICAgICBtc2cgICAgICBNZXNzYWdlIHN0cnVjdHVyZS4KLSogICAgICAgZGF0YSAgICAgRGF0YSBidWZmZXIuCi0qCi0qIFJldHVybnM6Ci0qICAgICAgIDAgICAtIFN1Y2Nlc3MuCi0qICAgICAgIH4wICAtIEVycm9yLgotKgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyBpbnQgcHJpc20ybWliX3VpbnQzMm9mZnNldCgKLW1pYnJlY190ICAgICAgICAgICAgICAgICAgICAgKm1pYiwKLWludCAgICAgICAgICAgICAgICAgICAgICAgICAgaXNnZXQsCi13bGFuZGV2aWNlX3QgICAgICAgICAgICAgICAgICp3bGFuZGV2LAotaGZhMzg0eF90ICAgICAgICAgICAgICAgICAgICAqaHcsCi1wODAyMTFtc2dfZG90MTFyZXFfbWlic2V0X3QgICptc2csCi12b2lkICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhKQotewotCWludCAgICAgcmVzdWx0OwotCVVJTlQzMiAgKnVpbnQzMiA9IChVSU5UMzIqKSBkYXRhOwotCVVJTlQ4ICAgYnl0ZWJ1ZltNSUJfVE1QX01BWExFTl07Ci0JVUlOVDE2ICAqd29yZGJ1ZiA9IChVSU5UMTYqKSBieXRlYnVmOwotCVVJTlQxNiAgY250OwotCi0JREJGRU5URVI7Ci0KLQljbnQgPSBtaWItPnBhcm0yIC8gc2l6ZW9mKFVJTlQxNik7Ci0KLQlyZXN1bHQgPSBoZmEzODR4X2RydnJfZ2V0Y29uZmlnKGh3LCBtaWItPnBhcm0xLCB3b3JkYnVmLCBtaWItPnBhcm0yKTsKLQlpZiAocmVzdWx0ID09IDApIHsKLQkJaWYgKGlzZ2V0KSB7Ci0JCQlpZiAobWliLT5wYXJtMyA8IGNudCkKLQkJCQlwcmlzbTJtZ210X3ByaXNtMmludDJwODAyMTFpbnQod29yZGJ1ZittaWItPnBhcm0zLCB1aW50MzIpOwotCQkJZWxzZQotCQkJCSp1aW50MzIgPSAwOwotCQl9IGVsc2UgewotCQkJaWYgKG1pYi0+cGFybTMgPCBjbnQpIHsKLQkJCQlwcmlzbTJtZ210X3A4MDIxMWludDJwcmlzbTJpbnQod29yZGJ1ZittaWItPnBhcm0zLCB1aW50MzIpOwotCQkJCXJlc3VsdCA9IGhmYTM4NHhfZHJ2cl9zZXRjb25maWcoaHcsIG1pYi0+cGFybTEsIHdvcmRidWYsIG1pYi0+cGFybTIpOwotCQkJfQotCQl9Ci0JfQotCi0JREJGRVhJVDsKLQlyZXR1cm4ocmVzdWx0KTsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIHByaXNtMm1pYl90cnV0aAotKgotKiBHZXQvc2V0IHRydXRoIGRhdGEuCi0qCi0qIE1JQiByZWNvcmQgcGFyYW1ldGVyczoKLSogICAgICAgcGFybTEgICAgUHJpc20yIFJJRCB2YWx1ZS4KLSogICAgICAgcGFybTIgICAgTm90IHVzZWQuCi0qICAgICAgIHBhcm0zICAgIE5vdCB1c2VkLgotKgotKiBBcmd1bWVudHM6Ci0qICAgICAgIG1pYiAgICAgIE1JQiByZWNvcmQuCi0qICAgICAgIGlzZ2V0ICAgIE1JQkdFVC9NSUJTRVQgZmxhZy4KLSogICAgICAgd2xhbmRldiAgd2xhbiBkZXZpY2Ugc3RydWN0dXJlLgotKiAgICAgICBwcml2ICAgICAicHJpdiIgc3RydWN0dXJlLgotKiAgICAgICBodyAgICAgICAiaHciIHN0cnVjdHVyZS4KLSogICAgICAgbXNnICAgICAgTWVzc2FnZSBzdHJ1Y3R1cmUuCi0qICAgICAgIGRhdGEgICAgIERhdGEgYnVmZmVyLgotKgotKiBSZXR1cm5zOgotKiAgICAgICAwICAgLSBTdWNjZXNzLgotKiAgICAgICB+MCAgLSBFcnJvci4KLSoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgaW50IHByaXNtMm1pYl90cnV0aCgKLW1pYnJlY190ICAgICAgICAgICAgICAgICAgICAgKm1pYiwKLWludCAgICAgICAgICAgICAgICAgICAgICAgICAgaXNnZXQsCi13bGFuZGV2aWNlX3QgICAgICAgICAgICAgICAgICp3bGFuZGV2LAotaGZhMzg0eF90ICAgICAgICAgICAgICAgICAgICAqaHcsCi1wODAyMTFtc2dfZG90MTFyZXFfbWlic2V0X3QgICptc2csCi12b2lkICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhKQotewotCWludCAgICAgcmVzdWx0OwotCVVJTlQzMiAgKnVpbnQzMiA9IChVSU5UMzIqKSBkYXRhOwotCVVJTlQ4ICAgYnl0ZWJ1ZltNSUJfVE1QX01BWExFTl07Ci0JVUlOVDE2ICAqd29yZGJ1ZiA9IChVSU5UMTYqKSBieXRlYnVmOwotCi0JREJGRU5URVI7Ci0KLQlpZiAoaXNnZXQpIHsKLQkJcmVzdWx0ID0gaGZhMzg0eF9kcnZyX2dldGNvbmZpZzE2KGh3LCBtaWItPnBhcm0xLCB3b3JkYnVmKTsKLQkJKnVpbnQzMiA9ICgqd29yZGJ1ZikgPwotCQkJCVA4MDIxMUVOVU1fdHJ1dGhfdHJ1ZSA6IFA4MDIxMUVOVU1fdHJ1dGhfZmFsc2U7Ci0JfSBlbHNlIHsKLQkJKndvcmRidWYgPSAoKCp1aW50MzIpID09IFA4MDIxMUVOVU1fdHJ1dGhfdHJ1ZSkgPyAxIDogMDsKLQkJcmVzdWx0ID0gaGZhMzg0eF9kcnZyX3NldGNvbmZpZzE2KGh3LCBtaWItPnBhcm0xLCAqd29yZGJ1Zik7Ci0JfQotCi0JREJGRVhJVDsKLQlyZXR1cm4ocmVzdWx0KTsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIHByaXNtMm1pYl9mbGFnCiAqCiAqIEdldC9zZXQgYSBmbGFnLgpAQCAtMTg1OSwxMCArNTMyLDEwIEBACiB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhKQogewogCWludCAgICAgcmVzdWx0OwotCVVJTlQzMiAgKnVpbnQzMiA9IChVSU5UMzIqKSBkYXRhOwotCVVJTlQ4ICAgYnl0ZWJ1ZltNSUJfVE1QX01BWExFTl07Ci0JVUlOVDE2ICAqd29yZGJ1ZiA9IChVSU5UMTYqKSBieXRlYnVmOwotCVVJTlQzMiAgZmxhZ3M7CisJdTMyICAqdWludDMyID0gKHUzMiopIGRhdGE7CisJdTggICBieXRlYnVmW01JQl9UTVBfTUFYTEVOXTsKKwl1MTYgICp3b3JkYnVmID0gKHUxNiopIGJ5dGVidWY7CisJdTMyICBmbGFnczsKIAogCURCRkVOVEVSOwogCkBAIC0xODkzLDEyMSArNTY2LDYgQEAKIH0KIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIHByaXNtMm1pYl9hcHBjZmluZm9mbGFnCi0qCi0qIEdldC9zZXQgYSBzaW5nbGUgZmxhZyBpbiB0aGUgQVBQQ0ZJTkZPIHJlY29yZC4KLSoKLSogTUlCIHJlY29yZCBwYXJhbWV0ZXJzOgotKiAgICAgICBwYXJtMSAgICBCaXQgdG8gZ2V0L3NldC4KLSogICAgICAgcGFybTIgICAgTm90IHVzZWQuCi0qICAgICAgIHBhcm0zICAgIE5vdCB1c2VkLgotKgotKiBBcmd1bWVudHM6Ci0qICAgICAgIG1pYiAgICAgIE1JQiByZWNvcmQuCi0qICAgICAgIGlzZ2V0ICAgIE1JQkdFVC9NSUJTRVQgZmxhZy4KLSogICAgICAgd2xhbmRldiAgd2xhbiBkZXZpY2Ugc3RydWN0dXJlLgotKiAgICAgICBwcml2ICAgICAicHJpdiIgc3RydWN0dXJlLgotKiAgICAgICBodyAgICAgICAiaHciIHN0cnVjdHVyZS4KLSogICAgICAgbXNnICAgICAgTWVzc2FnZSBzdHJ1Y3R1cmUuCi0qICAgICAgIGRhdGEgICAgIERhdGEgYnVmZmVyLgotKgotKiBSZXR1cm5zOgotKiAgICAgICAwICAgLSBTdWNjZXNzLgotKiAgICAgICB+MCAgLSBFcnJvci4KLSoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgaW50IHByaXNtMm1pYl9hcHBjZmluZm9mbGFnKAotbWlicmVjX3QgICAgICAgICAgICAgICAgICAgICAqbWliLAotaW50ICAgICAgICAgICAgICAgICAgICAgICAgICBpc2dldCwKLXdsYW5kZXZpY2VfdCAgICAgICAgICAgICAgICAgKndsYW5kZXYsCi1oZmEzODR4X3QgICAgICAgICAgICAgICAgICAgICpodywKLXA4MDIxMW1zZ19kb3QxMXJlcV9taWJzZXRfdCAgKm1zZywKLXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGEpCi17Ci0JaW50ICAgICByZXN1bHQ7Ci0JVUlOVDMyICAqdWludDMyID0gKFVJTlQzMiopIGRhdGE7Ci0JVUlOVDggICBieXRlYnVmW01JQl9UTVBfTUFYTEVOXTsKLQlVSU5UMTYgICp3b3JkYnVmID0gKFVJTlQxNiopIGJ5dGVidWY7Ci0JVUlOVDE2ICB3b3JkOwotCi0JREJGRU5URVI7Ci0KLQlyZXN1bHQgPSBoZmEzODR4X2RydnJfZ2V0Y29uZmlnKGh3LCBIRkEzODR4X1JJRF9DTkZBUFBDRklORk8sCi0JCQkJCWJ5dGVidWYsIEhGQTM4NHhfUklEX0NORkFQUENGSU5GT19MRU4pOwotCWlmIChyZXN1bHQgPT0gMCkgewotCQlpZiAoaXNnZXQpIHsKLQkJCSp1aW50MzIgPSAoaGZhMzg0eDJob3N0XzE2KHdvcmRidWZbM10pICYgbWliLT5wYXJtMSkgPwotCQkJCVA4MDIxMUVOVU1fdHJ1dGhfdHJ1ZSA6IFA4MDIxMUVOVU1fdHJ1dGhfZmFsc2U7Ci0JCX0gZWxzZSB7Ci0JCQl3b3JkID0gaGZhMzg0eDJob3N0XzE2KHdvcmRidWZbM10pOwotCQkJd29yZCA9ICgoKnVpbnQzMikgPT0gUDgwMjExRU5VTV90cnV0aF90cnVlKSA/Ci0JCQkJKHdvcmQgfCBtaWItPnBhcm0xKSA6ICh3b3JkICYgfm1pYi0+cGFybTEpOwotCQkJd29yZGJ1ZlszXSA9IGhvc3QyaGZhMzg0eF8xNih3b3JkKTsKLQkJCXJlc3VsdCA9IGhmYTM4NHhfZHJ2cl9zZXRjb25maWcoaHcsIEhGQTM4NHhfUklEX0NORkFQUENGSU5GTywKLQkJCQkJYnl0ZWJ1ZiwgSEZBMzg0eF9SSURfQ05GQVBQQ0ZJTkZPX0xFTik7Ci0JCX0KLQl9Ci0KLQlEQkZFWElUOwotCXJldHVybihyZXN1bHQpOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogcHJpc20ybWliX3JlZ3VsYXRvcnlkb21haW5zCi0qCi0qIEdldCByZWd1bGF0b3J5IGRvbWFpbiBkYXRhLgotKgotKiBNSUIgcmVjb3JkIHBhcmFtZXRlcnM6Ci0qICAgICAgIHBhcm0xICAgIFByaXNtMiBSSUQgdmFsdWUuCi0qICAgICAgIHBhcm0yICAgIE51bWJlciBvZiBieXRlcyBvZiBSSUQgZGF0YS4KLSogICAgICAgcGFybTMgICAgTm90IHVzZWQuCi0qCi0qIEFyZ3VtZW50czoKLSogICAgICAgbWliICAgICAgTUlCIHJlY29yZC4KLSogICAgICAgaXNnZXQgICAgTUlCR0VUL01JQlNFVCBmbGFnLgotKiAgICAgICB3bGFuZGV2ICB3bGFuIGRldmljZSBzdHJ1Y3R1cmUuCi0qICAgICAgIHByaXYgICAgICJwcml2IiBzdHJ1Y3R1cmUuCi0qICAgICAgIGh3ICAgICAgICJodyIgc3RydWN0dXJlLgotKiAgICAgICBtc2cgICAgICBNZXNzYWdlIHN0cnVjdHVyZS4KLSogICAgICAgZGF0YSAgICAgRGF0YSBidWZmZXIuCi0qCi0qIFJldHVybnM6Ci0qICAgICAgIDAgICAtIFN1Y2Nlc3MuCi0qICAgICAgIH4wICAtIEVycm9yLgotKgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyBpbnQgcHJpc20ybWliX3JlZ3VsYXRvcnlkb21haW5zKAotbWlicmVjX3QgICAgICAgICAgICAgICAgICAgICAqbWliLAotaW50ICAgICAgICAgICAgICAgICAgICAgICAgICBpc2dldCwKLXdsYW5kZXZpY2VfdCAgICAgICAgICAgICAgICAgKndsYW5kZXYsCi1oZmEzODR4X3QgICAgICAgICAgICAgICAgICAgICpodywKLXA4MDIxMW1zZ19kb3QxMXJlcV9taWJzZXRfdCAgKm1zZywKLXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGEpCi17Ci0JaW50ICAgICAgICAgICAgcmVzdWx0OwotCVVJTlQzMiAgICAgICAgIGNudDsKLQlwODAyMTFwc3RyZF90ICAqcHN0ciA9IChwODAyMTFwc3RyZF90KikgZGF0YTsKLQlVSU5UOCAgICAgICAgICBieXRlYnVmW01JQl9UTVBfTUFYTEVOXTsKLQlVSU5UMTYgICAgICAgICAqd29yZGJ1ZiA9IChVSU5UMTYqKSBieXRlYnVmOwotCi0JREJGRU5URVI7Ci0KLQlyZXN1bHQgPSAwOwotCi0JaWYgKGlzZ2V0KSB7Ci0JCXJlc3VsdCA9IGhmYTM4NHhfZHJ2cl9nZXRjb25maWcoaHcsIG1pYi0+cGFybTEsIHdvcmRidWYsIG1pYi0+cGFybTIpOwotCQlwcmlzbTJtZ210X3ByaXNtMmludDJwODAyMTFpbnQod29yZGJ1ZiwgJmNudCk7Ci0JCXBzdHItPmxlbiA9IChVSU5UOCkgY250OwotCQltZW1jcHkocHN0ci0+ZGF0YSwgJndvcmRidWZbMV0sIHBzdHItPmxlbik7Ci0JfQotCi0JREJGRVhJVDsKLQlyZXR1cm4ocmVzdWx0KTsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIHByaXNtMm1pYl93ZXBkZWZhdWx0a2V5CiAqCiAqIEdldC9zZXQgV0VQIGRlZmF1bHQga2V5cy4KQEAgLTIwNDIsOCArNjAwLDggQEAKIHsKIAlpbnQgICAgICAgICAgICByZXN1bHQ7CiAJcDgwMjExcHN0cmRfdCAgKnBzdHIgPSAocDgwMjExcHN0cmRfdCopIGRhdGE7Ci0JVUlOVDggICAgICAgICAgYnl0ZWJ1ZltNSUJfVE1QX01BWExFTl07Ci0JVUlOVDE2ICAgICAgICAgbGVuOworCXU4ICAgICAgICAgIGJ5dGVidWZbTUlCX1RNUF9NQVhMRU5dOworCXUxNiAgICAgICAgIGxlbjsKIAogCURCRkVOVEVSOwogCkBAIC0yMDYyLDExNCArNjIwLDYgQEAKIH0KIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIHByaXNtMm1pYl9wb3dlcm1hbmFnZW1lbnQKLSoKLSogR2V0L3NldCA4MDIuMTEgcG93ZXIgbWFuYWdlbWVudCB2YWx1ZS4gIE5vdGUgdGhhdCB0aGlzIGlzIGRlZmluZWQgZGlmZmVyZW50bHkKLSogYnkgODAyLjExIGFuZCBQcmlzbTI6Ci0qCi0qICAgICAgIE1lYW5pbmcgICAgIDgwMi4xMSAgICAgICBQcmlzbTIKLSogICAgICAgIGFjdGl2ZSAgICAgICAxICAgICAgICAgICBmYWxzZQotKiAgICAgIHBvd2Vyc2F2ZSAgICAgIDIgICAgICAgICAgIHRydWUKLSoKLSogTUlCIHJlY29yZCBwYXJhbWV0ZXJzOgotKiAgICAgICBwYXJtMSAgICBQcmlzbTIgUklEIHZhbHVlLgotKiAgICAgICBwYXJtMiAgICBOb3QgdXNlZC4KLSogICAgICAgcGFybTMgICAgTm90IHVzZWQuCi0qCi0qIEFyZ3VtZW50czoKLSogICAgICAgbWliICAgICAgTUlCIHJlY29yZC4KLSogICAgICAgaXNnZXQgICAgTUlCR0VUL01JQlNFVCBmbGFnLgotKiAgICAgICB3bGFuZGV2ICB3bGFuIGRldmljZSBzdHJ1Y3R1cmUuCi0qICAgICAgIHByaXYgICAgICJwcml2IiBzdHJ1Y3R1cmUuCi0qICAgICAgIGh3ICAgICAgICJodyIgc3RydWN0dXJlLgotKiAgICAgICBtc2cgICAgICBNZXNzYWdlIHN0cnVjdHVyZS4KLSogICAgICAgZGF0YSAgICAgRGF0YSBidWZmZXIuCi0qCi0qIFJldHVybnM6Ci0qICAgICAgIDAgICAtIFN1Y2Nlc3MuCi0qICAgICAgIH4wICAtIEVycm9yLgotKgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyBpbnQgcHJpc20ybWliX3Bvd2VybWFuYWdlbWVudCgKLW1pYnJlY190ICAgICAgICAgICAgICAgICAgICAgKm1pYiwKLWludCAgICAgICAgICAgICAgICAgICAgICAgICAgaXNnZXQsCi13bGFuZGV2aWNlX3QgICAgICAgICAgICAgICAgICp3bGFuZGV2LAotaGZhMzg0eF90ICAgICAgICAgICAgICAgICAgICAqaHcsCi1wODAyMTFtc2dfZG90MTFyZXFfbWlic2V0X3QgICptc2csCi12b2lkICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhKQotewotCWludCAgICAgcmVzdWx0OwotCVVJTlQzMiAgKnVpbnQzMiA9IChVSU5UMzIqKSBkYXRhOwotCVVJTlQzMiAgdmFsdWU7Ci0KLQlEQkZFTlRFUjsKLQotCWlmIChpc2dldCkgewotCQlyZXN1bHQgPSBwcmlzbTJtaWJfdWludDMyKG1pYiwgaXNnZXQsIHdsYW5kZXYsIGh3LCBtc2csICZ2YWx1ZSk7Ci0JCSp1aW50MzIgPSAodmFsdWUgPT0gMCkgPyAxIDogMjsKLQl9IGVsc2UgewotCQl2YWx1ZSA9ICgoKnVpbnQzMikgPT0gMSkgPyAwIDogMTsKLQkJcmVzdWx0ID0gcHJpc20ybWliX3VpbnQzMihtaWIsIGlzZ2V0LCB3bGFuZGV2LCBodywgbXNnLCAmdmFsdWUpOwotCX0KLQotCURCRkVYSVQ7Ci0JcmV0dXJuKHJlc3VsdCk7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBwcmlzbTJtaWJfcHJlYW1ibGUKLSoKLSogR2V0L3NldCBQcmlzbTIgc2hvcnQgcHJlYW1ibGUKLSoKLSogTUlCIHJlY29yZCBwYXJhbWV0ZXJzOgotKiAgICAgICBwYXJtMSAgICBQcmlzbTIgUklEIHZhbHVlLgotKiAgICAgICBwYXJtMiAgICBOb3QgdXNlZC4KLSogICAgICAgcGFybTMgICAgTm90IHVzZWQuCi0qCi0qIEFyZ3VtZW50czoKLSogICAgICAgbWliICAgICAgTUlCIHJlY29yZC4KLSogICAgICAgaXNnZXQgICAgTUlCR0VUL01JQlNFVCBmbGFnLgotKiAgICAgICB3bGFuZGV2ICB3bGFuIGRldmljZSBzdHJ1Y3R1cmUuCi0qICAgICAgIHByaXYgICAgICJwcml2IiBzdHJ1Y3R1cmUuCi0qICAgICAgIGh3ICAgICAgICJodyIgc3RydWN0dXJlLgotKiAgICAgICBtc2cgICAgICBNZXNzYWdlIHN0cnVjdHVyZS4KLSogICAgICAgZGF0YSAgICAgRGF0YSBidWZmZXIuCi0qCi0qIFJldHVybnM6Ci0qICAgICAgIDAgICAtIFN1Y2Nlc3MuCi0qICAgICAgIH4wICAtIEVycm9yLgotKgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyBpbnQgcHJpc20ybWliX3ByZWFtYmxlKAotbWlicmVjX3QgICAgICAgICAgICAgICAgICAgICAqbWliLAotaW50ICAgICAgICAgICAgICAgICAgICAgICAgICBpc2dldCwKLXdsYW5kZXZpY2VfdCAgICAgICAgICAgICAgICAgKndsYW5kZXYsCi1oZmEzODR4X3QgICAgICAgICAgICAgICAgICAgICpodywKLXA4MDIxMW1zZ19kb3QxMXJlcV9taWJzZXRfdCAgKm1zZywKLXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGEpCi17Ci0JaW50ICAgICByZXN1bHQ7Ci0JVUlOVDMyICAqdWludDMyID0gKFVJTlQzMiopIGRhdGE7Ci0JVUlOVDggICBieXRlYnVmW01JQl9UTVBfTUFYTEVOXTsKLQlVSU5UMTYgICp3b3JkYnVmID0gKFVJTlQxNiopIGJ5dGVidWY7Ci0KLQlEQkZFTlRFUjsKLQotCWlmIChpc2dldCkgewotCQlyZXN1bHQgPSBoZmEzODR4X2RydnJfZ2V0Y29uZmlnMTYoaHcsIG1pYi0+cGFybTEsIHdvcmRidWYpOwotCQkqdWludDMyID0gKndvcmRidWY7Ci0JfSBlbHNlIHsKLQkJKndvcmRidWYgPSAqdWludDMyOwotCQlyZXN1bHQgPSBoZmEzODR4X2RydnJfc2V0Y29uZmlnMTYoaHcsIG1pYi0+cGFybTEsICp3b3JkYnVmKTsKLQl9Ci0KLQlEQkZFWElUOwotCXJldHVybihyZXN1bHQpOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogcHJpc20ybWliX3ByaXZhY3lpbnZva2VkCiAqCiAqIEdldC9zZXQgdGhlIGRvdDExUHJpdmFjeUludm9rZWQgdmFsdWUuCkBAIC0yMjk2LDcgKzc0Niw3IEBACiB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhKQogewogCWludCAgICAgcmVzdWx0OwotCVVJTlQzMiAgKnVpbnQzMiA9IChVSU5UMzIqKSBkYXRhOworCXUzMiAgKnVpbnQzMiA9ICh1MzIqKSBkYXRhOwogCiAJREJGRU5URVI7CiAKQEAgLTIzMTUsMzQ5ICs3NjUsNiBAQAogfQogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogcHJpc20ybWliX29wZXJhdGlvbmFscmF0ZXNldAotKgotKiBHZXQvc2V0IHRoZSBvcGVyYXRpb25hbCByYXRlIHNldC4KLSoKLSogTUlCIHJlY29yZCBwYXJhbWV0ZXJzOgotKiAgICAgICBwYXJtMSAgICBQcmlzbTIgUklEIHZhbHVlLgotKiAgICAgICBwYXJtMiAgICBOb3QgdXNlZC4KLSogICAgICAgcGFybTMgICAgTm90IHVzZWQuCi0qCi0qIEFyZ3VtZW50czoKLSogICAgICAgbWliICAgICAgTUlCIHJlY29yZC4KLSogICAgICAgaXNnZXQgICAgTUlCR0VUL01JQlNFVCBmbGFnLgotKiAgICAgICB3bGFuZGV2ICB3bGFuIGRldmljZSBzdHJ1Y3R1cmUuCi0qICAgICAgIHByaXYgICAgICJwcml2IiBzdHJ1Y3R1cmUuCi0qICAgICAgIGh3ICAgICAgICJodyIgc3RydWN0dXJlLgotKiAgICAgICBtc2cgICAgICBNZXNzYWdlIHN0cnVjdHVyZS4KLSogICAgICAgZGF0YSAgICAgRGF0YSBidWZmZXIuCi0qCi0qIFJldHVybnM6Ci0qICAgICAgIDAgICAtIFN1Y2Nlc3MuCi0qICAgICAgIH4wICAtIEVycm9yLgotKgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyBpbnQgcHJpc20ybWliX29wZXJhdGlvbmFscmF0ZXNldCgKLW1pYnJlY190ICAgICAgICAgICAgICAgICAgICAgKm1pYiwKLWludCAgICAgICAgICAgICAgICAgICAgICAgICAgaXNnZXQsCi13bGFuZGV2aWNlX3QgICAgICAgICAgICAgICAgICp3bGFuZGV2LAotaGZhMzg0eF90ICAgICAgICAgICAgICAgICAgICAqaHcsCi1wODAyMTFtc2dfZG90MTFyZXFfbWlic2V0X3QgICptc2csCi12b2lkICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhKQotewotCWludCAgICAgICAgICAgIHJlc3VsdDsKLQlwODAyMTFwc3RyZF90ICAqcHN0ciA9IChwODAyMTFwc3RyZF90ICopIGRhdGE7Ci0JVUlOVDggICAgICAgICAgYnl0ZWJ1ZltNSUJfVE1QX01BWExFTl07Ci0JVUlOVDE2ICAgICAgICAgKndvcmRidWYgPSAoVUlOVDE2KikgYnl0ZWJ1ZjsKLQotCURCRkVOVEVSOwotCi0JaWYgKGlzZ2V0KSB7Ci0JCXJlc3VsdCA9IGhmYTM4NHhfZHJ2cl9nZXRjb25maWcxNihodywgbWliLT5wYXJtMSwgd29yZGJ1Zik7Ci0JCXByaXNtMm1nbXRfZ2V0X29wcmF0ZXNldCh3b3JkYnVmLCBwc3RyKTsKLQl9IGVsc2UgewotCQlwcmlzbTJtZ210X3NldF9vcHJhdGVzZXQod29yZGJ1ZiwgcHN0cik7Ci0JCXJlc3VsdCA9IGhmYTM4NHhfZHJ2cl9zZXRjb25maWcxNihodywgbWliLT5wYXJtMSwgKndvcmRidWYpOwotCQlyZXN1bHQgPSBoZmEzODR4X2RydnJfc2V0Y29uZmlnMTYoaHcsIEhGQTM4NHhfUklEX0NORlNVUFBSQVRFUywgKndvcmRidWYpOwotCX0KLQotCURCRkVYSVQ7Ci0JcmV0dXJuKHJlc3VsdCk7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBwcmlzbTJtaWJfZ3JvdXBhZGRyZXNzCi0qCi0qIEdldC9zZXQgdGhlIGRvdDExR3JvdXBBZGRyZXNzZXNUYWJsZS4KLSoKLSogTUlCIHJlY29yZCBwYXJhbWV0ZXJzOgotKiAgICAgICBwYXJtMSAgICBOb3QgdXNlZC4KLSogICAgICAgcGFybTIgICAgTm90IHVzZWQuCi0qICAgICAgIHBhcm0zICAgIE5vdCB1c2VkLgotKgotKiBBcmd1bWVudHM6Ci0qICAgICAgIG1pYiAgICAgIE1JQiByZWNvcmQuCi0qICAgICAgIGlzZ2V0ICAgIE1JQkdFVC9NSUJTRVQgZmxhZy4KLSogICAgICAgd2xhbmRldiAgd2xhbiBkZXZpY2Ugc3RydWN0dXJlLgotKiAgICAgICBwcml2ICAgICAicHJpdiIgc3RydWN0dXJlLgotKiAgICAgICBodyAgICAgICAiaHciIHN0cnVjdHVyZS4KLSogICAgICAgbXNnICAgICAgTWVzc2FnZSBzdHJ1Y3R1cmUuCi0qICAgICAgIGRhdGEgICAgIERhdGEgYnVmZmVyLgotKgotKiBSZXR1cm5zOgotKiAgICAgICAwICAgLSBTdWNjZXNzLgotKiAgICAgICB+MCAgLSBFcnJvci4KLSoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgaW50IHByaXNtMm1pYl9ncm91cGFkZHJlc3MoCi1taWJyZWNfdCAgICAgICAgICAgICAgICAgICAgICptaWIsCi1pbnQgICAgICAgICAgICAgICAgICAgICAgICAgIGlzZ2V0LAotd2xhbmRldmljZV90ICAgICAgICAgICAgICAgICAqd2xhbmRldiwKLWhmYTM4NHhfdCAgICAgICAgICAgICAgICAgICAgKmh3LAotcDgwMjExbXNnX2RvdDExcmVxX21pYnNldF90ICAqbXNnLAotdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YSkKLXsKLQlpbnQgICAgICAgICAgICByZXN1bHQ7Ci0JcDgwMjExcHN0cmRfdCAgKnBzdHIgPSAocDgwMjExcHN0cmRfdCAqKSBkYXRhOwotCVVJTlQ4ICAgICAgICAgIGJ5dGVidWZbTUlCX1RNUF9NQVhMRU5dOwotCVVJTlQxNiAgICAgICAgIGxlbjsKLQotCURCRkVOVEVSOwotCi0JLyogVE9ETzogZml4IHRoaXMuICBmL3cgZG9lc24ndCBzdXBwb3J0IG1jYXN0IGZpbHRlcnMgKi8KLQotCWlmIChpc2dldCkgewotCQlwcmlzbTJtZ210X2dldF9ncnBhZGRyKG1pYi0+ZGlkLCBwc3RyLCBodyk7Ci0JCXJldHVybigwKTsKLQl9Ci0KLQlyZXN1bHQgPSBwcmlzbTJtZ210X3NldF9ncnBhZGRyKG1pYi0+ZGlkLCBieXRlYnVmLCBwc3RyLCBodyk7Ci0JaWYgKHJlc3VsdCAhPSAwKSB7Ci0JCW1zZy0+cmVzdWx0Y29kZS5kYXRhID0gUDgwMjExRU5VTV9yZXN1bHRjb2RlX25vdF9zdXBwb3J0ZWQ7Ci0JCXJldHVybihyZXN1bHQpOwotCX0KLQotCWlmIChody0+ZG90MTFfZ3JwY250IDw9IE1BWF9QUklTTTJfR1JQX0FERFIpIHsKLQkJbGVuID0gaHctPmRvdDExX2dycGNudCAqIFdMQU5fQUREUl9MRU47Ci0JCW1lbWNweShieXRlYnVmLCBody0+ZG90MTFfZ3JwX2FkZHJbMF0sIGxlbik7Ci0JCXJlc3VsdCA9IGhmYTM4NHhfZHJ2cl9zZXRjb25maWcoaHcsIEhGQTM4NHhfUklEX0dST1VQQUREUiwgYnl0ZWJ1ZiwgbGVuKTsKLQotCQkvKgotCQkqKiBUdXJuIG9mZiBwcm9taXNjdW91cyBtb2RlIGlmIGNvdW50IGlzIGVxdWFsIHRvIE1BWC4gIFdlIG1heQotCQkqKiBoYXZlIGJlZW4gYXQgYSBoaWdoZXIgY291bnQgaW4gcHJvbWlzY3VvdXMgbW9kZSBhbmQgbmVlZCB0bwotCQkqKiB0dXJuIGl0IG9mZi4KLQkJKi8KLQotCQkvKiBidXQgb25seSBpZiB3ZSdyZSBub3QgYWxyZWFkeSBpbiBwcm9taXNjIG1vZGUuIDopICovCi0JCWlmICgoaHctPmRvdDExX2dycGNudCA9PSBNQVhfUFJJU00yX0dSUF9BRERSKSAmJgotCQkgICAgISggd2xhbmRldi0+bmV0ZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSkgewotCQkJcmVzdWx0ID0gaGZhMzg0eF9kcnZyX3NldGNvbmZpZzE2KGh3LAotCQkJCQkgICAgIEhGQTM4NHhfUklEX1BST01JU0NNT0RFLCAwKTsKLQkJfQotCX0gZWxzZSB7Ci0KLQkJLyoKLQkJKiogQ2xlYXIgZ3JvdXAgYWRkcmVzc2VzIGluIGNhcmQgYW5kIHNldCB0byBwcm9taXNjdW91cyBtb2RlLgotCQkqLwotCi0JCW1lbXNldChieXRlYnVmLCAwLCBzaXplb2YoYnl0ZWJ1ZikpOwotCQlyZXN1bHQgPSBoZmEzODR4X2RydnJfc2V0Y29uZmlnKGh3LCBIRkEzODR4X1JJRF9HUk9VUEFERFIsCi0JCQkJCQlieXRlYnVmLCAwKTsKLQkJaWYgKHJlc3VsdCA9PSAwKSB7Ci0JCQlyZXN1bHQgPSBoZmEzODR4X2RydnJfc2V0Y29uZmlnMTYoaHcsCi0JCQkJCUhGQTM4NHhfUklEX1BST01JU0NNT0RFLCAxKTsKLQkJfQotCX0KLQotCURCRkVYSVQ7Ci0JcmV0dXJuKHJlc3VsdCk7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBwcmlzbTJtaWJfZndpZAotKgotKiBHZXQgdGhlIGZpcm13YXJlIElELgotKgotKiBNSUIgcmVjb3JkIHBhcmFtZXRlcnM6Ci0qICAgICAgIHBhcm0xICAgIE5vdCB1c2VkLgotKiAgICAgICBwYXJtMiAgICBOb3QgdXNlZC4KLSogICAgICAgcGFybTMgICAgTm90IHVzZWQuCi0qCi0qIEFyZ3VtZW50czoKLSogICAgICAgbWliICAgICAgTUlCIHJlY29yZC4KLSogICAgICAgaXNnZXQgICAgTUlCR0VUL01JQlNFVCBmbGFnLgotKiAgICAgICB3bGFuZGV2ICB3bGFuIGRldmljZSBzdHJ1Y3R1cmUuCi0qICAgICAgIHByaXYgICAgICJwcml2IiBzdHJ1Y3R1cmUuCi0qICAgICAgIGh3ICAgICAgICJodyIgc3RydWN0dXJlLgotKiAgICAgICBtc2cgICAgICBNZXNzYWdlIHN0cnVjdHVyZS4KLSogICAgICAgZGF0YSAgICAgRGF0YSBidWZmZXIuCi0qCi0qIFJldHVybnM6Ci0qICAgICAgIDAgICAtIFN1Y2Nlc3MuCi0qICAgICAgIH4wICAtIEVycm9yLgotKgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyBpbnQgcHJpc20ybWliX2Z3aWQoCi1taWJyZWNfdCAgICAgICAgICAgICAgICAgICAgICptaWIsCi1pbnQgICAgICAgICAgICAgICAgICAgICAgICAgIGlzZ2V0LAotd2xhbmRldmljZV90ICAgICAgICAgICAgICAgICAqd2xhbmRldiwKLWhmYTM4NHhfdCAgICAgICAgICAgICAgICAgICAgKmh3LAotcDgwMjExbXNnX2RvdDExcmVxX21pYnNldF90ICAqbXNnLAotdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YSkKLXsKLQlpbnQgICAgICAgICAgICAgcmVzdWx0OwotCXA4MDIxMXBzdHJkX3QgICAqcHN0ciA9IChwODAyMTFwc3RyZF90ICopIGRhdGE7Ci0JaGZhMzg0eF9GV0lEX3QgIGZ3aWQ7Ci0KLQlEQkZFTlRFUjsKLQotCWlmIChpc2dldCkgewotCQlyZXN1bHQgPSBoZmEzODR4X2RydnJfZ2V0Y29uZmlnKGh3LCBIRkEzODR4X1JJRF9GV0lELAotCQkJCQkJJmZ3aWQsIEhGQTM4NHhfUklEX0ZXSURfTEVOKTsKLQkJaWYgKG1pYi0+ZGlkID09IERJRG1pYl9wMl9wMk5JQ19wMlByaW1hcnlGV0lEKSB7Ci0JCQlmd2lkLnByaW1hcnlbSEZBMzg0eF9GV0lEX0xFTiAtIDFdID0gJ1wwJzsKLQkJCXBzdHItPmxlbiA9IHN0cmxlbihmd2lkLnByaW1hcnkpOwotCQkJbWVtY3B5KHBzdHItPmRhdGEsIGZ3aWQucHJpbWFyeSwgcHN0ci0+bGVuKTsKLQkJfSBlbHNlIHsKLQkJCWZ3aWQuc2Vjb25kYXJ5W0hGQTM4NHhfRldJRF9MRU4gLSAxXSA9ICdcMCc7Ci0JCQlwc3RyLT5sZW4gPSBzdHJsZW4oZndpZC5zZWNvbmRhcnkpOwotCQkJbWVtY3B5KHBzdHItPmRhdGEsIGZ3aWQuc2Vjb25kYXJ5LCBwc3RyLT5sZW4pOwotCQl9Ci0JfSBlbHNlCi0JCXJlc3VsdCA9IDA7ICAgICAvKiBTaG91bGQgbmV2ZXIgaGFwcGVuLiAqLwotCi0JREJGRVhJVDsKLQlyZXR1cm4ocmVzdWx0KTsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIHByaXNtMm1pYl9hdXRoYWxnCi0qCi0qIEdldCB2YWx1ZXMgZnJvbSB0aGUgQXVodGVudGljYXRpb25BbGdvcml0aG1zVGFibGUuCi0qCi0qIE1JQiByZWNvcmQgcGFyYW1ldGVyczoKLSogICAgICAgcGFybTEgICAgVGFibGUgaW5kZXggKDEtNikuCi0qICAgICAgIHBhcm0yICAgIE5vdCB1c2VkLgotKiAgICAgICBwYXJtMyAgICBOb3QgdXNlZC4KLSoKLSogQXJndW1lbnRzOgotKiAgICAgICBtaWIgICAgICBNSUIgcmVjb3JkLgotKiAgICAgICBpc2dldCAgICBNSUJHRVQvTUlCU0VUIGZsYWcuCi0qICAgICAgIHdsYW5kZXYgIHdsYW4gZGV2aWNlIHN0cnVjdHVyZS4KLSogICAgICAgcHJpdiAgICAgInByaXYiIHN0cnVjdHVyZS4KLSogICAgICAgaHcgICAgICAgImh3IiBzdHJ1Y3R1cmUuCi0qICAgICAgIG1zZyAgICAgIE1lc3NhZ2Ugc3RydWN0dXJlLgotKiAgICAgICBkYXRhICAgICBEYXRhIGJ1ZmZlci4KLSoKLSogUmV0dXJuczoKLSogICAgICAgMCAgIC0gU3VjY2Vzcy4KLSogICAgICAgfjAgIC0gRXJyb3IuCi0qCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIGludCBwcmlzbTJtaWJfYXV0aGFsZygKLW1pYnJlY190ICAgICAgICAgICAgICAgICAgICAgKm1pYiwKLWludCAgICAgICAgICAgICAgICAgICAgICAgICAgaXNnZXQsCi13bGFuZGV2aWNlX3QgICAgICAgICAgICAgICAgICp3bGFuZGV2LAotaGZhMzg0eF90ICAgICAgICAgICAgICAgICAgICAqaHcsCi1wODAyMTFtc2dfZG90MTFyZXFfbWlic2V0X3QgICptc2csCi12b2lkICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhKQotewotCVVJTlQzMiAgKnVpbnQzMiA9IChVSU5UMzIqKSBkYXRhOwotCi0JREJGRU5URVI7Ci0KLQkvKiBNU006IHBreCBzdXBwbGllZCBjb2RlIHRoYXQgIGNvZGUgcXVlcmllcyBSSUQgRkQ0RC4uLi5idXQgdGhlIGYvdydzCi0gICAgICAgICAqICByZXN1bHRzIGFyZSBib2d1cy4gVGhlcmVmb3JlLCB3ZSBoYXZlIHRvIHNpbXVsYXRlIHRoZSBhcHByb3ByaWF0ZQotICAgICAgICAgKiAgcmVzdWx0cyBoZXJlIGluIHRoZSBkcml2ZXIgYmFzZWQgb24gb3VyIGtub3dsZWRnZSBvZiBleGlzdGluZyBNQUMKLSAgICAgICAgICogIGZlYXR1cmVzLiAgVGhhdCdzIHRoZSB3aG9sZSBwb2ludCBiZWhpbmQgdGhpcyB1Z2x5IGZ1bmN0aW9uLgotICAgICAgICAgKi8KLQotCWlmIChpc2dldCkgewotCQltc2ctPnJlc3VsdGNvZGUuZGF0YSA9IFA4MDIxMUVOVU1fcmVzdWx0Y29kZV9zdWNjZXNzOwotCQlzd2l0Y2ggKG1pYi0+cGFybTEpIHsKLQkJCWNhc2UgMTogLyogT3BlbiBTeXN0ZW0gKi8KLQkJCQkqdWludDMyID0gUDgwMjExRU5VTV9hdXRoYWxnX29wZW5zeXN0ZW07Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDI6IC8qIFNoYXJlZEtleSAqLwotCQkJCSp1aW50MzIgPSBQODAyMTFFTlVNX2F1dGhhbGdfc2hhcmVka2V5OwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQkqdWludDMyID0gMDsKLQkJCQltc2ctPnJlc3VsdGNvZGUuZGF0YSA9IFA4MDIxMUVOVU1fcmVzdWx0Y29kZV9ub3Rfc3VwcG9ydGVkOwotCQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JREJGRVhJVDsKLQlyZXR1cm4oMCk7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBwcmlzbTJtaWJfYXV0aGFsZ2VuYWJsZQotKgotKiBHZXQvc2V0IHRoZSBlbmFibGUgdmFsdWVzIGZyb20gdGhlIEF1aHRlbnRpY2F0aW9uQWxnb3JpdGhtc1RhYmxlLgotKgotKiBNSUIgcmVjb3JkIHBhcmFtZXRlcnM6Ci0qICAgICAgIHBhcm0xICAgIFRhYmxlIGluZGV4ICgxLTYpLgotKiAgICAgICBwYXJtMiAgICBOb3QgdXNlZC4KLSogICAgICAgcGFybTMgICAgTm90IHVzZWQuCi0qCi0qIEFyZ3VtZW50czoKLSogICAgICAgbWliICAgICAgTUlCIHJlY29yZC4KLSogICAgICAgaXNnZXQgICAgTUlCR0VUL01JQlNFVCBmbGFnLgotKiAgICAgICB3bGFuZGV2ICB3bGFuIGRldmljZSBzdHJ1Y3R1cmUuCi0qICAgICAgIHByaXYgICAgICJwcml2IiBzdHJ1Y3R1cmUuCi0qICAgICAgIGh3ICAgICAgICJodyIgc3RydWN0dXJlLgotKiAgICAgICBtc2cgICAgICBNZXNzYWdlIHN0cnVjdHVyZS4KLSogICAgICAgZGF0YSAgICAgRGF0YSBidWZmZXIuCi0qCi0qIFJldHVybnM6Ci0qICAgICAgIDAgICAtIFN1Y2Nlc3MuCi0qICAgICAgIH4wICAtIEVycm9yLgotKgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyBpbnQgcHJpc20ybWliX2F1dGhhbGdlbmFibGUoCi1taWJyZWNfdCAgICAgICAgICAgICAgICAgICAgICptaWIsCi1pbnQgICAgICAgICAgICAgICAgICAgICAgICAgIGlzZ2V0LAotd2xhbmRldmljZV90ICAgICAgICAgICAgICAgICAqd2xhbmRldiwKLWhmYTM4NHhfdCAgICAgICAgICAgICAgICAgICAgKmh3LAotcDgwMjExbXNnX2RvdDExcmVxX21pYnNldF90ICAqbXNnLAotdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YSkKLXsKLQlpbnQgICAgIHJlc3VsdDsKLQlVSU5UMzIgICp1aW50MzIgPSAoVUlOVDMyKikgZGF0YTsKLQotCWludCAgICAgaW5kZXg7Ci0JVUlOVDE2ICBjbmZfYXV0aDsKLQlVSU5UMTYJbWFzazsKLQotCURCRkVOVEVSOwotCi0JaW5kZXggPSBtaWItPnBhcm0xIC0gMTsKLQotCXJlc3VsdCA9IGhmYTM4NHhfZHJ2cl9nZXRjb25maWcxNiggaHcsCi0JCQlIRkEzODR4X1JJRF9DTkZBVVRIRU5USUNBVElPTiwgJmNuZl9hdXRoKTsKLQlXTEFOX0xPR19ERUJVRygyLCJjbmZBdXRoZW50aWNhdGlvbjA9JWQsIGluZGV4PSVkXG4iLCBjbmZfYXV0aCwgaW5kZXgpOwotCi0JaWYgKGlzZ2V0KSB7Ci0JCWlmICggaW5kZXggPT0gMCB8fCBpbmRleCA9PSAxICkgewotCQkJKnVpbnQzMiA9IChjbmZfYXV0aCAmICgxPDxpbmRleCkpID8KLQkJCQlQODAyMTFFTlVNX3RydXRoX3RydWU6IFA4MDIxMUVOVU1fdHJ1dGhfZmFsc2U7Ci0JCX0gZWxzZSB7Ci0JCQkqdWludDMyID0gUDgwMjExRU5VTV90cnV0aF9mYWxzZTsKLQkJCW1zZy0+cmVzdWx0Y29kZS5kYXRhID0gUDgwMjExRU5VTV9yZXN1bHRjb2RlX25vdF9zdXBwb3J0ZWQ7Ci0JCX0KLQl9IGVsc2UgewotCQlpZiAoIGluZGV4ID09IDAgfHwgaW5kZXggPT0gMSApIHsKLQkJCW1hc2sgPSAxIDw8IGluZGV4OwotCQkJaWYgKCp1aW50MzI9PVA4MDIxMUVOVU1fdHJ1dGhfdHJ1ZSApIHsKLQkJCQljbmZfYXV0aCB8PSBtYXNrOwotCQkJfSBlbHNlIHsKLQkJCQljbmZfYXV0aCAmPSB+bWFzazsKLQkJCX0KLQkJCXJlc3VsdCA9IGhmYTM4NHhfZHJ2cl9zZXRjb25maWcxNiggaHcsCi0JCQkJCUhGQTM4NHhfUklEX0NORkFVVEhFTlRJQ0FUSU9OLCBjbmZfYXV0aCk7Ci0JCQlXTEFOX0xPR19ERUJVRygyLCJjbmZBdXRoZW50aWNhdGlvbjo9JWRcbiIsIGNuZl9hdXRoKTsKLQkJCWlmICggcmVzdWx0ICkgewotCQkJCVdMQU5fTE9HX0RFQlVHKDEsIlVuYWJsZSB0byBzZXQgcDJjbmZBdXRoZW50aWNhdGlvbiB0byAlZFxuIiwgY25mX2F1dGgpOwotCQkJCW1zZy0+cmVzdWx0Y29kZS5kYXRhID0gUDgwMjExRU5VTV9yZXN1bHRjb2RlX2ltcGxlbWVudGF0aW9uX2ZhaWx1cmU7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQltc2ctPnJlc3VsdGNvZGUuZGF0YSA9IFA4MDIxMUVOVU1fcmVzdWx0Y29kZV9ub3Rfc3VwcG9ydGVkOwotCQl9Ci0JfQotCi0JREJGRVhJVDsKLQlyZXR1cm4ocmVzdWx0KTsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIHByaXNtMm1pYl9wcml2CiAqCiAqIEdldC9zZXQgdmFsdWVzIGluIHRoZSAicHJpdiIgZGF0YSBzdHJ1Y3R1cmUuCkBAIC0yNjkwLDIxOCArNzk3LDE4IEBACiBwODAyMTFtc2dfZG90MTFyZXFfbWlic2V0X3QgICptc2csCiB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhKQogewotCVVJTlQzMiAgICAgICAgICAgICp1aW50MzIgPSAoVUlOVDMyKikgZGF0YTsKIAlwODAyMTFwc3RyZF90ICAgICAqcHN0ciA9IChwODAyMTFwc3RyZF90KikgZGF0YTsKLQlwODAyMTFtYWNhcnJheV90ICAqbWFjYXJyYXkgPSAocDgwMjExbWFjYXJyYXlfdCAqKSBkYXRhOwogCi0JaW50ICBpLCBjbnQsIHJlc3VsdCwgZG9uZTsKLQotCXByaXNtMnN0YV9hdXRobGlzdF90ICBvbGQ7Ci0KLQkvKgotCSoqICJ0ZXN0IiBpcyBhIGxvdCBsb25nZXIgdGhhbiBuZWNlc3NhcnkgYnV0IHdobyBjYXJlcz8gIC4uLmFzIGxvbmcgYXMKLQkqKiBpdCBpcyBsb25nIGVub3VnaCEKLQkqLwotCi0JVUlOVDggIHRlc3Rbc2l6ZW9mKHdsYW5kZXYtPnJ4KSArIHNpemVvZihody0+dGFsbGllcyldOworCWludCAgcmVzdWx0OwogCiAJREJGRU5URVI7CiAKIAlzd2l0Y2ggKG1pYi0+ZGlkKSB7Ci0JY2FzZSBESURtaWJfcDJfcDJUYWJsZV9wMlJlY2VpdmVkRnJhbWVTdGF0aXN0aWNzOgotCi0JCS8qCi0JCSoqIE5vdGU6IFRoZSB2YWx1ZXMgaW4gdGhpcyByZWNvcmQgYXJlIGNoYW5nZWQgYnkgdGhlCi0JCSoqIGludGVycnVwdCBoYW5kbGVyIGFuZCB0aGVyZWZvcmUgY2Fubm90IGJlIGd1YXJhbnRlZWQKLQkJKiogdG8gYmUgc3RhYmxlIHdoaWxlIHRoZXkgYXJlIGJlaW5nIGNvcGllZC4gIEhvd2V2ZXIsCi0JCSoqIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciB3aWxsIHRha2UgcHJpb3JpdHkgb3ZlciB0aGlzCi0JCSoqIGNvZGUuICBIZW5jZSwgaWYgdGhlIHNhbWUgdmFsdWVzIGFyZSBjb3BpZWQgdHdpY2UsCi0JCSoqIHRoZW4gd2UgYXJlIGVuc3VyZWQgdGhhdCB0aGUgdmFsdWVzIGhhdmUgbm90IGJlZW4KLQkJKiogY2hhbmdlZC4gIElmIHRoZXkgaGF2ZSwgdGhlbiBqdXN0IHRyeSBhZ2Fpbi4gIERvbid0Ci0JCSoqIHRyeSBtb3JlIHRoYW4gMTAgdGltZXMuLi5pZiB3ZSBzdGlsbCBoYXZlbid0IGdvdCBpdCwKLQkJKiogdGhlbiB0aGUgdmFsdWVzIHdlIGRvIGhhdmUgYXJlIHByb2JhYmx5IGdvb2QgZW5vdWdoLgotCQkqKiBUaGlzIHNjaGVtZSBmb3IgY29weWluZyB2YWx1ZXMgaXMgdXNlZCBpbiBvcmRlciB0bwotCQkqKiBwcmV2ZW50IGhhdmluZyB0byBibG9jayB0aGUgaW50ZXJydXB0IGhhbmRsZXIgd2hpbGUKLQkJKiogd2UgY29weSB0aGUgdmFsdWVzLgotCQkqLwotCi0JCWlmIChpc2dldCkKLQkJCWZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKSB7Ci0JCQkJbWVtY3B5KGRhdGEsICZ3bGFuZGV2LT5yeCwgc2l6ZW9mKHdsYW5kZXYtPnJ4KSk7Ci0JCQkJbWVtY3B5KHRlc3QsICZ3bGFuZGV2LT5yeCwgc2l6ZW9mKHdsYW5kZXYtPnJ4KSk7Ci0JCQkJaWYgKG1lbWNtcChkYXRhLCB0ZXN0LCBzaXplb2Yod2xhbmRldi0+cngpKSA9PSAwKSBicmVhazsKLQkJCX0KLQotCQlicmVhazsKLQotCWNhc2UgRElEbWliX3AyX3AyVGFibGVfcDJDb21tdW5pY2F0aW9uVGFsbGllczoKLQotCQkvKgotCQkqKiBOb3RlOiBUaGUgdmFsdWVzIGluIHRoaXMgcmVjb3JkIGFyZSBjaGFuZ2VkIGJ5IHRoZQotCQkqKiBpbnRlcnJ1cHQgaGFuZGxlciBhbmQgdGhlcmVmb3JlIGNhbm5vdCBiZSBndWFyYW50ZWVkCi0JCSoqIHRvIGJlIHN0YWJsZSB3aGlsZSB0aGV5IGFyZSBiZWluZyBjb3BpZWQuICBTZWUgdGhlCi0JCSoqIG5vdGUgYWJvdmUgYWJvdXQgY29weWluZyB2YWx1ZXMuCi0JCSovCi0KLQkJaWYgKGlzZ2V0KSB7Ci0JCQlyZXN1bHQgPSBoZmEzODR4X2RydnJfY29tbXRhbGxpZXMoaHcpOwotCi0JCQkvKiA/Pz8/Pz8gV2UgbmVlZCB0byB3YWl0IGEgYml0IGhlcmUgZm9yIHRoZSAqLwotCQkJLyogICB0YWxsaWVzIHRvIGdldCB1cGRhdGVkLiA/Pz8/Pz8gKi8KLQkJCS8qIE1TTTogVE9ETzogVGhlIHJpZ2h0IHdheSB0byBkbyB0aGlzIGlzIHRvCi0JCQkgKiAgICAgIGFkZCBhICJjb21tdGFsbGllIiB3YWl0IHF1ZXVlIHRvIHRoZQotCQkJICogICAgICBwcml2IHN0cnVjdHVyZSB0aGF0IGdldHMgcnVuIGV2ZXJ5IHRpbWUKLQkJCSAqICAgICAgd2UgcmVjZWl2ZSBhIGNvbW10YWxseSBpbmZvIGZyYW1lLgotCQkJICogICAgICBUaGlzIHByb2Nlc3Mgd291bGQgc2xlZXAgb24gdGhhdAotCQkJICogICAgICBxdWV1ZSBhbmQgZ2V0IGF3YWtlbmVkIHdoZW4gdGhlCi0JCQkgKiAgICAgIHRoZSByZXF1ZXN0ZWQgaW5mbyBmcmFtZSBhcnJpdmVzLgotCQkJICogICAgICBEb24ndCBoYXZlIHRpbWUgdG8gZG8gYW5kIHRlc3QgdGhpcwotCQkJICogICAgICByaWdodCBub3cuCi0JCQkgKi8KLQotCQkJLyogVWdoLCB0aGlzIGlzIG5hc3R5LiAqLwotCQkJZm9yIChpID0gMDsgaSA8IDEwOyBpKyspIHsKLQkJCQltZW1jcHkoZGF0YSwKLQkJCQkgICAgICAgJmh3LT50YWxsaWVzLAotCQkJCSAgICAgICBzaXplb2YoaHctPnRhbGxpZXMpKTsKLQkJCQltZW1jcHkodGVzdCwKLQkJCQkgICAgICAgJmh3LT50YWxsaWVzLAotCQkJCSAgICAgICBzaXplb2YoaHctPnRhbGxpZXMpKTsKLQkJCQlpZiAoIG1lbWNtcChkYXRhLAotCQkJCQkgICAgdGVzdCwKLQkJCQkJICAgIHNpemVvZihody0+dGFsbGllcykpID09IDApCi0JCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJYnJlYWs7Ci0KLQljYXNlIERJRG1pYl9wMl9wMlRhYmxlX3AyQXV0aGVudGljYXRlZDoKLQotCQlpZiAoaXNnZXQpIHsKLQkJCXByaXNtMm1pYl9wcml2X2F1dGhsaXN0KGh3LCAmb2xkKTsKLQotCQkJbWFjYXJyYXktPmNudCA9IDA7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgb2xkLmNudDsgaSsrKSB7Ci0JCQkJaWYgKCFvbGQuYXNzb2NbaV0pIHsKLQkJCQkJbWVtY3B5KG1hY2FycmF5LT5kYXRhW21hY2FycmF5LT5jbnRdLCBvbGQuYWRkcltpXSwgV0xBTl9BRERSX0xFTik7Ci0JCQkJCW1hY2FycmF5LT5jbnQrKzsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlicmVhazsKLQotCWNhc2UgRElEbWliX3AyX3AyVGFibGVfcDJBc3NvY2lhdGVkOgotCi0JCWlmIChpc2dldCkgewotCQkJcHJpc20ybWliX3ByaXZfYXV0aGxpc3QoaHcsICZvbGQpOwotCi0JCQltYWNhcnJheS0+Y250ID0gMDsKLQkJCWZvciAoaSA9IDA7IGkgPCBvbGQuY250OyBpKyspIHsKLQkJCQlpZiAob2xkLmFzc29jW2ldKSB7Ci0JCQkJCW1lbWNweShtYWNhcnJheS0+ZGF0YVttYWNhcnJheS0+Y250XSwgb2xkLmFkZHJbaV0sIFdMQU5fQUREUl9MRU4pOwotCQkJCQltYWNhcnJheS0+Y250Kys7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJYnJlYWs7Ci0KLQljYXNlIERJRG1pYl9wMl9wMlRhYmxlX3AyUG93ZXJTYXZlVXNlckNvdW50OgotCi0JCWlmIChpc2dldCkKLQkJCSp1aW50MzIgPSBody0+cHN1c2VyY291bnQ7Ci0KLQkJYnJlYWs7Ci0KLQljYXNlIERJRG1pYl9wMl9wMlRhYmxlX3AyQ29tbWVudDoKLQotCQlpZiAoaXNnZXQpIHsKLQkJCXBzdHItPmxlbiA9IHN0cmxlbihody0+Y29tbWVudCk7Ci0JCQltZW1jcHkocHN0ci0+ZGF0YSwgaHctPmNvbW1lbnQsIHBzdHItPmxlbik7Ci0JCX0gZWxzZSB7Ci0JCQljbnQgPSBwc3RyLT5sZW47Ci0JCQlpZiAoY250IDwgMCkgY250ID0gMDsKLQkJCWlmIChjbnQgPj0gc2l6ZW9mKGh3LT5jb21tZW50KSkKLQkJCQljbnQgPSBzaXplb2YoaHctPmNvbW1lbnQpLTE7Ci0JCQltZW1jcHkoaHctPmNvbW1lbnQsIHBzdHItPmRhdGEsIGNudCk7Ci0JCQlwc3RyLT5kYXRhW2NudF0gPSAnXDAnOwotCQl9Ci0KLQkJYnJlYWs7Ci0KLQljYXNlIERJRG1pYl9wMl9wMlRhYmxlX3AyQWNjZXNzTW9kZToKLQotCQlpZiAoaXNnZXQpCi0JCQkqdWludDMyID0gaHctPmFjY2Vzc21vZGU7Ci0JCWVsc2UKLQkJCXByaXNtMm1pYl9wcml2X2FjY2Vzc21vZGUoaHcsICp1aW50MzIpOwotCi0JCWJyZWFrOwotCi0JY2FzZSBESURtaWJfcDJfcDJUYWJsZV9wMkFjY2Vzc0FsbG93OgotCi0JCWlmIChpc2dldCkgewotCQkJbWFjYXJyYXktPmNudCA9IGh3LT5hbGxvdy5jbnQ7Ci0JCQltZW1jcHkobWFjYXJyYXktPmRhdGEsIGh3LT5hbGxvdy5hZGRyLAotCQkJICAgICAgIG1hY2FycmF5LT5jbnQqV0xBTl9BRERSX0xFTik7Ci0JCX0gZWxzZSB7Ci0JCQlwcmlzbTJtaWJfcHJpdl9hY2Nlc3NhbGxvdyhodywgbWFjYXJyYXkpOwotCQl9Ci0KLQkJYnJlYWs7Ci0KLQljYXNlIERJRG1pYl9wMl9wMlRhYmxlX3AyQWNjZXNzRGVueToKLQotCQlpZiAoaXNnZXQpIHsKLQkJCW1hY2FycmF5LT5jbnQgPSBody0+ZGVueS5jbnQ7Ci0JCQltZW1jcHkobWFjYXJyYXktPmRhdGEsIGh3LT5kZW55LmFkZHIsCi0JCQkgICAgICAgbWFjYXJyYXktPmNudCpXTEFOX0FERFJfTEVOKTsKLQkJfSBlbHNlIHsKLQkJCXByaXNtMm1pYl9wcml2X2FjY2Vzc2RlbnkoaHcsIG1hY2FycmF5KTsKLQkJfQotCi0JCWJyZWFrOwotCi0JY2FzZSBESURtaWJfcDJfcDJUYWJsZV9wMkNoYW5uZWxJbmZvUmVzdWx0czoKLQotCQlpZiAoaXNnZXQpIHsKLQkJCWRvbmUgPSBhdG9taWNfcmVhZCgmaHctPmNoYW5uZWxfaW5mby5kb25lKTsKLQkJCWlmIChkb25lID09IDApIHsKLQkJCQltc2ctPnJlc3VsdGNvZGUuc3RhdHVzID0gUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19ub192YWx1ZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWlmIChkb25lID09IDEpIHsKLQkJCQltc2ctPnJlc3VsdGNvZGUuc3RhdHVzID0gUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19pbmNvbXBsZXRlX2l0ZW1kYXRhOwotCQkJCWJyZWFrOwotCQkJfQotCi0JCQlmb3IgKGkgPSAwOyBpIDwgMTQ7IGkrKywgdWludDMyICs9IDUpIHsKLQkJCQl1aW50MzJbMF0gPSBpKzE7Ci0JCQkJdWludDMyWzFdID0gaHctPmNoYW5uZWxfaW5mby5yZXN1bHRzLnJlc3VsdFtpXS5hbmw7Ci0JCQkJdWludDMyWzJdID0gaHctPmNoYW5uZWxfaW5mby5yZXN1bHRzLnJlc3VsdFtpXS5wbmw7Ci0JCQkJdWludDMyWzNdID0gKGh3LT5jaGFubmVsX2luZm8ucmVzdWx0cy5yZXN1bHRbaV0uYWN0aXZlICYgSEZBMzg0eF9DSElORk9SRVNVTFRfQlNTQUNUSVZFKSA/IDEgOiAwOwotCQkJCXVpbnQzMls0XSA9IChody0+Y2hhbm5lbF9pbmZvLnJlc3VsdHMucmVzdWx0W2ldLmFjdGl2ZSAmIEhGQTM4NHhfQ0hJTkZPUkVTVUxUX1BDRkFDVElWRSkgPyAxIDogMDsKLQkJCX0KLQkJfQotCi0JCWJyZWFrOwotCi0JY2FzZSBESURtaWJfZG90MTFzbXRfZG90MTFTdGF0aW9uQ29uZmlnVGFibGVfZG90MTFEZXNpcmVkQlNTVHlwZToKLQotCQlpZiAoaXNnZXQpCi0JCQkqdWludDMyID0gaHctPmRvdDExX2Rlc2lyZWRfYnNzX3R5cGU7Ci0JCWVsc2UKLQkJCWh3LT5kb3QxMV9kZXNpcmVkX2Jzc190eXBlID0gKnVpbnQzMjsKLQotCQlicmVhazsKLQogCWNhc2UgRElEbWliX2xueF9sbnhDb25maWdUYWJsZV9sbnhSU05BSUU6IHsKIAkJaGZhMzg0eF9XUEFEYXRhX3Qgd3BhOwogCQlpZiAoaXNnZXQpIHsKIAkJCWhmYTM4NHhfZHJ2cl9nZXRjb25maWcoIGh3LCBIRkEzODR4X1JJRF9DTkZXUEFEQVRBLAotCQkJCQkJKFVJTlQ4ICopICZ3cGEsIHNpemVvZih3cGEpKTsKKwkJCQkJCSh1OCAqKSAmd3BhLCBzaXplb2Yod3BhKSk7CiAJCQlwc3RyLT5sZW4gPSBoZmEzODR4Mmhvc3RfMTYod3BhLmRhdGFsZW4pOwogCQkJbWVtY3B5KHBzdHItPmRhdGEsIHdwYS5kYXRhLCBwc3RyLT5sZW4pOwogCQl9IGVsc2UgewpAQCAtMjkwOSw3ICs4MTYsNyBAQAogCQkJbWVtY3B5KHdwYS5kYXRhLCBwc3RyLT5kYXRhLCBwc3RyLT5sZW4pOwogCiAJCQlyZXN1bHQgPSBoZmEzODR4X2RydnJfc2V0Y29uZmlnKGh3LCBIRkEzODR4X1JJRF9DTkZXUEFEQVRBLAotCQkJCShVSU5UOCAqKSAmd3BhLCBzaXplb2Yod3BhKSk7CisJCQkJKHU4ICopICZ3cGEsIHNpemVvZih3cGEpKTsKIAkJfQogCQlicmVhazsKIAl9CkBAIC0yOTIyLDM0NSArODI5LDYgQEAKIH0KIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIHByaXNtMm1pYl9wcml2X2F1dGhsaXN0Ci0qCi0qIEdldCBhIGNvcHkgb2YgdGhlIGxpc3Qgb2YgYXV0aGVudGljYXRlZCBzdGF0aW9ucy4KLSoKLSogQXJndW1lbnRzOgotKiAgICAgICBwcml2ICAgICAicHJpdiIgc3RydWN0dXJlLgotKiAgICAgICBsaXN0ICAgICBMaXN0IG9mIGF1dGhlbnRpY2F0ZWQgc3RhdGlvbnMuCi0qCi0qIFJldHVybnM6Ci0qCU5vdGhpbmcKLSoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgdm9pZCBwcmlzbTJtaWJfcHJpdl9hdXRobGlzdCgKLWhmYTM4NHhfdCAgICAgICAgICAgICAqaHcsCi1wcmlzbTJzdGFfYXV0aGxpc3RfdCAgKmxpc3QpCi17Ci0JcHJpc20yc3RhX2F1dGhsaXN0X3QgIHRlc3Q7Ci0JaW50ICAgICAgICAgICAgICAgICAgIGk7Ci0KLQlEQkZFTlRFUjsKLQotCS8qCi0JKiogTm90ZTogVGhlIHZhbHVlcyBpbiB0aGlzIHJlY29yZCBhcmUgY2hhbmdlZCBieSB0aGUgaW50ZXJydXB0Ci0JKiogaGFuZGxlciBhbmQgdGhlcmVmb3JlIGNhbm5vdCBiZSBndWFyYW50ZWVkIHRvIGJlIHN0YWJsZSB3aGlsZQotCSoqIHRoZXkgYXJlIGJlaW5nIGNvcGllZC4gIEhvd2V2ZXIsIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciB3aWxsCi0JKiogdGFrZSBwcmlvcml0eSBvdmVyIHRoaXMgY29kZS4gIEhlbmNlLCBpZiB0aGUgc2FtZSB2YWx1ZXMgYXJlCi0JKiogY29waWVkIHR3aWNlLCB0aGVuIHdlIGFyZSBlbnN1cmVkIHRoYXQgdGhlIHZhbHVlcyBoYXZlIG5vdAotCSoqIGJlZW4gY2hhbmdlZC4gIElmIHRoZXkgaGF2ZSwgdGhlbiBqdXN0IHRyeSBhZ2Fpbi4gIERvbid0IHRyeQotCSoqIG1vcmUgdGhhbiAxMCB0aW1lcy4uLnRoZSBsaXN0IG9mIGF1dGhlbnRpY2F0ZWQgc3RhdGlvbnMgaXMKLQkqKiB1bmxpa2VseSB0byBiZSBjaGFuZ2luZyBmcmVxdWVudGx5IGVub3VnaCB0aGF0IHdlIGNhbid0IGdldAotCSoqIGEgc25hcHNob3QgaW4gMTAgdHJpZXMuICBEb24ndCB0cnkgbW9yZSB0aGFuIHRoaXMgc28gdGhhdCB3ZQotCSoqIGRvbid0IHJpc2sgbG9ja2luZy11cCBmb3IgbG9uZyBwZXJpb2RzIG9mIHRpbWUuICBJZiB3ZSBzdGlsbAotCSoqIGhhdmVuJ3QgZ290IHRoZSBzbmFwc2hvdCwgdGhlbiBnZW5lcmF0ZSBhbiBlcnJvciBtZXNzYWdlIGFuZAotCSoqIHJldHVybiBhbiBlbXB0eSBsaXN0IChzaW5jZSB0aGlzIGlzIHRoZSBvbmx5IHZhbGlkIGxpc3QgdGhhdAotCSoqIHdlIGNhbiBndWFyZW50ZWUpLiAgVGhpcyBzY2hlbWUgZm9yIGNvcHlpbmcgdmFsdWVzIGlzIHVzZWQgaW4KLQkqKiBvcmRlciB0byBwcmV2ZW50IGhhdmluZyB0byBibG9jayB0aGUgaW50ZXJydXB0IGhhbmRsZXIgd2hpbGUKLQkqKiB3ZSBjb3B5IHRoZSB2YWx1ZXMuCi0JKi8KLQotCWZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKSB7Ci0JCW1lbWNweShsaXN0LCAmaHctPmF1dGhsaXN0LCBzaXplb2YocHJpc20yc3RhX2F1dGhsaXN0X3QpKTsKLQkJbWVtY3B5KCZ0ZXN0LCAmaHctPmF1dGhsaXN0LCBzaXplb2YocHJpc20yc3RhX2F1dGhsaXN0X3QpKTsKLQkJaWYgKG1lbWNtcChsaXN0LCAmdGVzdCwgc2l6ZW9mKHByaXNtMnN0YV9hdXRobGlzdF90KSkgPT0gMCkKLQkJCWJyZWFrOwotCX0KLQotCWlmIChpID49IDEwKSB7Ci0JCWxpc3QtPmNudCA9IDA7Ci0JCVdMQU5fTE9HX0VSUk9SKCJDb3VsZCBub3Qgb2J0YWluIHNuYXBzaG90IG9mIGF1dGhlbnRpY2F0ZWQgc3RhdGlvbnMuXG4iKTsKLQkJfQotCi0JREJGRVhJVDsKLQlyZXR1cm47Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBwcmlzbTJtaWJfcHJpdl9hY2Nlc3Ntb2RlCi0qCi0qIFNldCB0aGUgQWNjZXNzIE1vZGUuCi0qCi0qIEFyZ3VtZW50czoKLSogICAgICAgcHJpdiAgICAgInByaXYiIHN0cnVjdHVyZS4KLSogICAgICAgaHcgICAgICAgImh3IiBzdHJ1Y3R1cmUuCi0qICAgICAgIG1vZGUgICAgIE5ldyBhY2Nlc3MgbW9kZS4KLSoKLSogUmV0dXJuczoKLSoJTm90aGluZwotKgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyB2b2lkIHByaXNtMm1pYl9wcml2X2FjY2Vzc21vZGUoCi1oZmEzODR4X3QgICAgICAgICAqaHcsCi1VSU5UMzIgICAgICAgICAgICBtb2RlKQotewotCXByaXNtMnN0YV9hdXRobGlzdF90ICBvbGQ7Ci0JaW50ICAgICAgICAgICAgICAgICAgIGksIGosIGRlYXV0aDsKLQlVSU5UOCAgICAgICAgICAgICAgICAgKmFkZHI7Ci0KLQlEQkZFTlRFUjsKLQotCS8qCi0JKiogSWYgdGhlIG1vZGUgaXMgbm90IGNoYW5naW5nIG9yIGl0IGlzIGNoYW5naW5nIHRvICJBbGwiLCB0aGVuIGl0J3MKLQkqKiBva2F5IHRvIGdvIGFoZWFkIHdpdGhvdXQgYSBsb3Qgb2YgbWVzc2luZyBhcm91bmQuICBPdGhlcndpc2UsIHRoZQotCSoqIGFjY2VzcyBtb2RlIGlzIGNoYW5naW5nIGluIGEgd2F5IHRoYXQgbWF5IGxlYXZlIHNvbWUgc3RhdGlvbnMKLQkqKiBhdXRoZW50aWNhdGVkIHdoaWNoIHNob3VsZCBub3QgYmUgYXV0aGVudGljYXRlZC4gIEl0IHdpbGwgYmUKLQkqKiBuZWNlc3NhcnkgdG8gZGUtYXV0aGVudGljYXRlIHRoZXNlIHN0YXRpb25zLgotCSovCi0KLQlpZiAobW9kZSA9PSBXTEFOX0FDQ0VTU19BTEwgfHwgbW9kZSA9PSBody0+YWNjZXNzbW9kZSkgewotCQlody0+YWNjZXNzbW9kZSA9IG1vZGU7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKgotCSoqIFN3aXRjaCB0byB0aGUgbmV3IGFjY2VzcyBtb2RlLiAgT25jZSB0aGlzIGlzIGRvbmUsIHRoZW4gdGhlIGludGVycnVwdAotCSoqIGhhbmRsZXIgKHdoaWNoIHVzZXMgdGhpcyB2YWx1ZSkgd2lsbCBiZSBwcmV2ZW50ZWQgZnJvbSBhdXRoZW50aWNhdGluZwotCSoqIEFERElUSU9OQUwgc3RhdGlvbnMgd2hpY2ggc2hvdWxkIG5vdCBiZSBhdXRoZW50aWNhdGVkLiAgVGhlbiBnZXQgYQotCSoqIGNvcHkgb2YgdGhlIGN1cnJlbnQgbGlzdCBvZiBhdXRoZW50aWNhdGVkIHN0YXRpb25zLgotCSovCi0KLQlody0+YWNjZXNzbW9kZSA9IG1vZGU7Ci0KLQlwcmlzbTJtaWJfcHJpdl9hdXRobGlzdChodywgJm9sZCk7Ci0KLQkvKgotCSoqIE5vdyBnbyB0aHJvdWdoIHRoZSBsaXN0IG9mIHByZXZpb3VzbHkgYXV0aGVudGljYXRlZCBzdGF0aW9ucyAoc29tZQotCSoqIG9mIHdoaWNoIG1pZ2h0IGRlLWF1dGhlbnRpY2F0ZSB0aGVtc2VsdmVzIHdoaWxlIHdlIGFyZSBwcm9jZXNzaW5nIGl0Ci0JKiogYnV0IHRoYXQgaXMgb2theSkuICBBbnkgc3RhdGlvbiB3aGljaCBubyBsb25nZXIgbWF0Y2hlcyB0aGUgYWNjZXNzCi0JKiogbW9kZSwgbXVzdCBiZSBkZS1hdXRoZW50aWNhdGVkLgotCSovCi0KLQlmb3IgKGkgPSAwOyBpIDwgb2xkLmNudDsgaSsrKSB7Ci0JCWFkZHIgPSBvbGQuYWRkcltpXTsKLQotCQlpZiAobW9kZSA9PSBXTEFOX0FDQ0VTU19OT05FKQotCQkJZGVhdXRoID0gMTsKLQkJZWxzZSB7Ci0JCQlpZiAobW9kZSA9PSBXTEFOX0FDQ0VTU19BTExPVykgewotCQkJCWZvciAoaiA9IDA7IGogPCBody0+YWxsb3cuY250OyBqKyspCi0JCQkJCWlmIChtZW1jbXAoYWRkciwgaHctPmFsbG93LmFkZHJbal0sCi0JCQkJCQkJV0xBTl9BRERSX0xFTikgPT0gMCkKLQkJCQkJCWJyZWFrOwotCQkJCWRlYXV0aCA9IChqID49IGh3LT5hbGxvdy5jbnQpOwotCQkJfSBlbHNlIHsKLQkJCQlmb3IgKGogPSAwOyBqIDwgaHctPmRlbnkuY250OyBqKyspCi0JCQkJCWlmIChtZW1jbXAoYWRkciwgaHctPmRlbnkuYWRkcltqXSwKLQkJCQkJCQlXTEFOX0FERFJfTEVOKSA9PSAwKQotCQkJCQkJYnJlYWs7Ci0JCQkJZGVhdXRoID0gKGogPCBody0+ZGVueS5jbnQpOwotCQkJfQotCQl9Ci0KLQkJaWYgKGRlYXV0aCkgcHJpc20ybWliX3ByaXZfZGVhdXRoZW50aWNhdGUoaHcsIGFkZHIpOwotCX0KLQotCURCRkVYSVQ7Ci0JcmV0dXJuOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogcHJpc20ybWliX3ByaXZfYWNjZXNzYWxsb3cKLSoKLSogQ2hhbmdlIHRoZSBsaXN0IG9mIGFsbG93ZWQgTUFDIGFkZHJlc3Nlcy4KLSoKLSogQXJndW1lbnRzOgotKiAgICAgICBwcml2ICAgICAgInByaXYiIHN0cnVjdHVyZS4KLSogICAgICAgaHcgICAgICAgICJodyIgc3RydWN0dXJlLgotKiAgICAgICBtYWNhcnJheSAgTmV3IGFycmF5IG9mIE1BQyBhZGRyZXNzZXMuCi0qCi0qIFJldHVybnM6Ci0qCU5vdGhpbmcKLSoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgdm9pZCBwcmlzbTJtaWJfcHJpdl9hY2Nlc3NhbGxvdygKLWhmYTM4NHhfdCAgICAgICAgICpodywKLXA4MDIxMW1hY2FycmF5X3QgICptYWNhcnJheSkKLXsKLQlwcmlzbTJzdGFfYXV0aGxpc3RfdCAgb2xkOwotCWludCAgICAgICAgICAgICAgICAgICBpLCBqOwotCi0JREJGRU5URVI7Ci0KLQkvKgotCSoqIENoYW5nZSB0aGUgYWNjZXNzIGxpc3QuICBOb3RlIHRoYXQgdGhlIGludGVycnVwdCBoYW5kbGVyIG1heSBiZSBpbgotCSoqIHRoZSBtaWRkbGUgb2YgdXNpbmcgdGhlIGFjY2VzcyBsaXN0ISEhICBTaW5jZSB0aGUgaW50ZXJydXB0IGhhbmRsZXIKLQkqKiB3aWxsCWFsd2F5cyBoYXZlIHByaW9yaXR5IG92ZXIgdGhpcyBwcm9jZXNzIGFuZCB0aGlzIGlzIHRoZSBvbmx5Ci0JKiogcHJvY2VzcyB0aGF0IHdpbGwgbW9kaWZ5IHRoZSBsaXN0LCB0aGlzIHByb2JsZW0gY2FuIGJlIGhhbmRsZWQgYXMKLQkqKiBmb2xsb3dzOgotCSoqCi0JKiogICAgMS4gU2V0IHRoZSAibW9kaWZ5IiBmbGFnLgotCSoqICAgIDIuIENoYW5nZSB0aGUgZmlyc3QgY29weSBvZiB0aGUgbGlzdC4KLQkqKiAgICAzLiBDbGVhciB0aGUgIm1vZGlmeSIgZmxhZy4KLQkqKiAgICA0LiBDaGFuZ2UgdGhlIGJhY2t1cCBjb3B5IG9mIHRoZSBsaXN0LgotCSoqCi0JKiogVGhlIGludGVycnVwdCBoYW5kbGVyIHdpbGwgY2hlY2sgdGhlICJtb2RpZnkiIGZsYWcuICBJZiBOT1Qgc2V0LCB0aGVuCi0JKiogdGhlIGZpcnN0IGNvcHkgb2YgdGhlIGxpc3QgaXMgdmFsaWQgYW5kIG1heSBiZSB1c2VkLiAgT3RoZXJ3aXNlLCB0aGUKLQkqKiBmaXJzdCBjb3B5IGlzIGJlaW5nIGNoYW5nZWQgYnV0IHRoZSBiYWNrdXAgY29weSBpcyB2YWxpZCBhbmQgbWF5IGJlCi0JKiogdXNlZC4gIERvaW5nIHRoaW5ncyB0aGlzIHdheSBwcmV2ZW50cyBoYXZpbmcgdG8gaGF2ZSB0aGUgaW50ZXJydXB0Ci0JKiogaGFuZGxlciBibG9jayB3aGlsZSB0aGUgbGlzdCBpcyBiZWluZyB1cGRhdGVkLgotCSovCi0KLQlody0+YWxsb3cubW9kaWZ5ID0gMTsKLQotCWh3LT5hbGxvdy5jbnQgPSBtYWNhcnJheS0+Y250OwotCW1lbWNweShody0+YWxsb3cuYWRkciwgbWFjYXJyYXktPmRhdGEsIG1hY2FycmF5LT5jbnQqV0xBTl9BRERSX0xFTik7Ci0KLQlody0+YWxsb3cubW9kaWZ5ID0gMDsKLQotCWh3LT5hbGxvdy5jbnQxID0gbWFjYXJyYXktPmNudDsKLQltZW1jcHkoaHctPmFsbG93LmFkZHIxLCBtYWNhcnJheS0+ZGF0YSwgbWFjYXJyYXktPmNudCpXTEFOX0FERFJfTEVOKTsKLQotCS8qCi0JKiogSWYgdGhlIGN1cnJlbnQgYWNjZXNzIG1vZGUgaXMgIkFsbG93IiwgdGhlbiBjaGFuZ2luZyB0aGUgYWNjZXNzCi0JKiogbGlzdCBtYXkgbGVhdmUgc29tZSBzdGF0aW9ucyBhdXRoZW50aWNhdGVkIHdoaWNoIHNob3VsZCBub3QgYmUKLQkqKiBhdXRoZW50aWNhdGVkLiAgSXQgd2lsbCBiZSBuZWNlc3NhcnkgdG8gZGUtYXV0aGVudGljYXRlIHRoZXNlCi0JKiogc3RhdGlvbnMuICBPdGhlcndpc2UsIHRoZSBsaXN0IGNhbiBiZSBjaGFuZ2VkIHdpdGhvdXQgYSBsb3Qgb2YgZnVzcy4KLQkqLwotCi0JaWYgKGh3LT5hY2Nlc3Ntb2RlID09IFdMQU5fQUNDRVNTX0FMTE9XKSB7Ci0KLQkJLyoKLQkJKiogR28gdGhyb3VnaCB0aGUgbGlzdCBvZiBhdXRoZW50aWNhdGVkIHN0YXRpb25zIChzb21lIG9mCi0JCSoqIHdoaWNoIG1pZ2h0IGRlLWF1dGhlbnRpY2F0ZSB0aGVtc2VsdmVzIHdoaWxlIHdlIGFyZQotCQkqKiBwcm9jZXNzaW5nIGl0IGJ1dCB0aGF0IGlzIG9rYXkpLiAgQW55IHN0YXRpb24gd2hpY2ggaXMKLQkJKiogbm8gbG9uZ2VyIGluIHRoZSBsaXN0IG9mIGFsbG93ZWQgc3RhdGlvbnMsIG11c3QgYmUKLQkJKiogZGUtYXV0aGVudGljYXRlZC4KLQkJKi8KLQotCQlwcmlzbTJtaWJfcHJpdl9hdXRobGlzdChodywgJm9sZCk7Ci0KLQkJZm9yIChpID0gMDsgaSA8IG9sZC5jbnQ7IGkrKykgewotCQkJZm9yIChqID0gMDsgaiA8IGh3LT5hbGxvdy5jbnQ7IGorKykKLQkJCQlpZiAobWVtY21wKG9sZC5hZGRyW2ldLCBody0+YWxsb3cuYWRkcltqXSwKLQkJCQkJCQlXTEFOX0FERFJfTEVOKSA9PSAwKQotCQkJCQlicmVhazsKLQkJCWlmIChqID49IGh3LT5hbGxvdy5jbnQpCi0JCQkJcHJpc20ybWliX3ByaXZfZGVhdXRoZW50aWNhdGUoaHcsIG9sZC5hZGRyW2ldKTsKLQkJfQotCX0KLQotCURCRkVYSVQ7Ci0JcmV0dXJuOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogcHJpc20ybWliX3ByaXZfYWNjZXNzZGVueQotKgotKiBDaGFuZ2UgdGhlIGxpc3Qgb2YgZGVuaWVkIE1BQyBhZGRyZXNzZXMuCi0qCi0qIEFyZ3VtZW50czoKLSogICAgICAgcHJpdiAgICAgICJwcml2IiBzdHJ1Y3R1cmUuCi0qICAgICAgIGh3ICAgICAgICAiaHciIHN0cnVjdHVyZS4KLSogICAgICAgbWFjYXJyYXkgIE5ldyBhcnJheSBvZiBNQUMgYWRkcmVzc2VzLgotKgotKiBSZXR1cm5zOgotKglOb3RoaW5nCi0qCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIHZvaWQgcHJpc20ybWliX3ByaXZfYWNjZXNzZGVueSgKLWhmYTM4NHhfdCAgICAgICAgICpodywKLXA4MDIxMW1hY2FycmF5X3QgICptYWNhcnJheSkKLXsKLQlwcmlzbTJzdGFfYXV0aGxpc3RfdCAgb2xkOwotCWludCAgICAgICAgICAgICAgICAgICBpLCBqOwotCi0JREJGRU5URVI7Ci0KLQkvKgotCSoqIENoYW5nZSB0aGUgYWNjZXNzIGxpc3QuICBOb3RlIHRoYXQgdGhlIGludGVycnVwdCBoYW5kbGVyIG1heSBiZSBpbgotCSoqIHRoZSBtaWRkbGUgb2YgdXNpbmcgdGhlIGFjY2VzcyBsaXN0ISEhICBTaW5jZSB0aGUgaW50ZXJydXB0IGhhbmRsZXIKLQkqKiB3aWxsIGFsd2F5cyBoYXZlIHByaW9yaXR5IG92ZXIgdGhpcyBwcm9jZXNzIGFuZCB0aGlzIGlzIHRoZSBvbmx5Ci0JKiogcHJvY2VzcyB0aGF0IHdpbGwgbW9kaWZ5IHRoZSBsaXN0LCB0aGlzIHByb2JsZW0gY2FuIGJlIGhhbmRsZWQgYXMKLQkqKiBmb2xsb3dzOgotCSoqCi0JKiogICAgMS4gU2V0IHRoZSAibW9kaWZ5IiBmbGFnLgotCSoqICAgIDIuIENoYW5nZSB0aGUgZmlyc3QgY29weSBvZiB0aGUgbGlzdC4KLQkqKiAgICAzLiBDbGVhciB0aGUgIm1vZGlmeSIgZmxhZy4KLQkqKiAgICA0LiBDaGFuZ2UgdGhlIGJhY2t1cCBjb3B5IG9mIHRoZSBsaXN0LgotCSoqCi0JKiogVGhlIGludGVycnVwdCBoYW5kbGVyIHdpbGwgY2hlY2sgdGhlICJtb2RpZnkiIGZsYWcuICBJZiBOT1Qgc2V0LCB0aGVuCi0JKiogdGhlIGZpcnN0IGNvcHkgb2YgdGhlIGxpc3QgaXMgdmFsaWQgYW5kIG1heSBiZSB1c2VkLiAgT3RoZXJ3aXNlLCB0aGUKLQkqKiBmaXJzdCBjb3B5IGlzIGJlaW5nIGNoYW5nZWQgYnV0IHRoZSBiYWNrdXAgY29weSBpcyB2YWxpZCBhbmQgbWF5IGJlCi0JKiogdXNlZC4gIERvaW5nIHRoaW5ncyB0aGlzIHdheSBwcmV2ZW50cyBoYXZpbmcgdG8gaGF2ZSB0aGUgaW50ZXJydXB0Ci0JKiogaGFuZGxlciBibG9jayB3aGlsZSB0aGUgbGlzdCBpcyBiZWluZyB1cGRhdGVkLgotCSovCi0KLQlody0+ZGVueS5tb2RpZnkgPSAxOwotCi0JaHctPmRlbnkuY250ID0gbWFjYXJyYXktPmNudDsKLQltZW1jcHkoaHctPmRlbnkuYWRkciwgbWFjYXJyYXktPmRhdGEsIG1hY2FycmF5LT5jbnQqV0xBTl9BRERSX0xFTik7Ci0KLQlody0+ZGVueS5tb2RpZnkgPSAwOwotCi0JaHctPmRlbnkuY250MSA9IG1hY2FycmF5LT5jbnQ7Ci0JbWVtY3B5KGh3LT5kZW55LmFkZHIxLCBtYWNhcnJheS0+ZGF0YSwgbWFjYXJyYXktPmNudCpXTEFOX0FERFJfTEVOKTsKLQotCS8qCi0JKiogSWYgdGhlIGN1cnJlbnQgYWNjZXNzIG1vZGUgaXMgIkRlbnkiLCB0aGVuIGNoYW5naW5nIHRoZSBhY2Nlc3MKLQkqKiBsaXN0IG1heSBsZWF2ZSBzb21lIHN0YXRpb25zIGF1dGhlbnRpY2F0ZWQgd2hpY2ggc2hvdWxkIG5vdCBiZQotCSoqIGF1dGhlbnRpY2F0ZWQuICBJdCB3aWxsIGJlIG5lY2Vzc2FyeSB0byBkZS1hdXRoZW50aWNhdGUgdGhlc2UKLQkqKiBzdGF0aW9ucy4gIE90aGVyd2lzZSwgdGhlIGxpc3QgY2FuIGJlIGNoYW5nZWQgd2l0aG91dCBhIGxvdCBvZiBmdXNzLgotCSovCi0KLQlpZiAoaHctPmFjY2Vzc21vZGUgPT0gV0xBTl9BQ0NFU1NfREVOWSkgewotCi0JCS8qCi0JCSoqIEdvIHRocm91Z2ggdGhlIGxpc3Qgb2YgYXV0aGVudGljYXRlZCBzdGF0aW9ucyAoc29tZSBvZgotCQkqKiB3aGljaCBtaWdodCBkZS1hdXRoZW50aWNhdGUgdGhlbXNlbHZlcyB3aGlsZSB3ZSBhcmUKLQkJKiogcHJvY2Vzc2luZyBpdCBidXQgdGhhdCBpcyBva2F5KS4gIEFueSBzdGF0aW9uIHdoaWNoIGlzCi0JCSoqIG5vdyBpbiB0aGUgbGlzdCBvZiBkZW5pZWQgc3RhdGlvbnMsIG11c3QgYmUgZGUtYXV0aGVudGljYXRlZC4KLQkJKi8KLQotCQlwcmlzbTJtaWJfcHJpdl9hdXRobGlzdChodywgJm9sZCk7Ci0KLQkJZm9yIChpID0gMDsgaSA8IG9sZC5jbnQ7IGkrKykKLQkJCWZvciAoaiA9IDA7IGogPCBody0+ZGVueS5jbnQ7IGorKykKLQkJCQlpZiAobWVtY21wKG9sZC5hZGRyW2ldLCBody0+ZGVueS5hZGRyW2pdLAotCQkJCQkJCSBXTEFOX0FERFJfTEVOKSA9PSAwKSB7Ci0JCQkJCXByaXNtMm1pYl9wcml2X2RlYXV0aGVudGljYXRlKGh3LCBvbGQuYWRkcltpXSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQl9Ci0KLQlEQkZFWElUOwotCXJldHVybjsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIHByaXNtMm1pYl9wcml2X2RlYXV0aGVudGljYXRlCi0qCi0qIERlLWF1dGhlbnRpY2F0ZSBhIHN0YXRpb24uICBUaGlzIGlzIGRvbmUgYnkgc2VuZGluZyBhIEhhbmRvdmVyQWRkcmVzcwotKiBpbmZvcm1hdGlvbiBmcmFtZSB0byB0aGUgZmlybXdhcmUuICBUaGlzIHNob3VsZCB3b3JrLCBhY2NvcmRpbmcgdG8KLSogSW50ZXJzaWwuCi0qCi0qIEFyZ3VtZW50czoKLSogICAgICAgcHJpdiAgICAgInByaXYiIHN0cnVjdHVyZS4KLSogICAgICAgaHcgICAgICAgImh3IiBzdHJ1Y3R1cmUuCi0qICAgICAgIGFkZHIgICAgIE1BQyBhZGRyZXNzIG9mIHN0YXRpb24gdG8gYmUgZGUtYXV0aGVudGljYXRlZC4KLSoKLSogUmV0dXJuczoKLSoJTm90aGluZwotKgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyB2b2lkIHByaXNtMm1pYl9wcml2X2RlYXV0aGVudGljYXRlKAotaGZhMzg0eF90ICAgICAgICAgKmh3LAotVUlOVDggICAgICAgICAgICAgKmFkZHIpCi17Ci0JREJGRU5URVI7Ci0JaGZhMzg0eF9kcnZyX2hhbmRvdmVyKGh3LCBhZGRyKTsKLQlEQkZFWElUOwotCXJldHVybjsKLX0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogcHJpc20ybWdtdF9wc3RyMmJ5dGVzdHIKICoKICogQ29udmVydCB0aGUgcHN0ciBkYXRhIGluIHRoZSBXTEFOIG1lc3NhZ2Ugc3RydWN0dXJlIGludG8gYW4gaGZhMzg0eApAQCAtMzI3OSw3ICs4NDcsNyBAQAogewogCURCRkVOVEVSOwogCi0JYnl0ZXN0ci0+bGVuID0gaG9zdDJoZmEzODR4XzE2KChVSU5UMTYpKHBzdHItPmxlbikpOworCWJ5dGVzdHItPmxlbiA9IGhvc3QyaGZhMzg0eF8xNigodTE2KShwc3RyLT5sZW4pKTsKIAltZW1jcHkoYnl0ZXN0ci0+ZGF0YSwgcHN0ci0+ZGF0YSwgcHN0ci0+bGVuKTsKIAlEQkZFWElUOwogfQpAQCAtMzMwMCw3ICs4NjgsNyBAQAogKgogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKLXZvaWQgcHJpc20ybWdtdF9wc3RyMmJ5dGVhcmVhKFVJTlQ4ICpieXRlYXJlYSwgcDgwMjExcHN0cmRfdCAqcHN0cikKK3ZvaWQgcHJpc20ybWdtdF9wc3RyMmJ5dGVhcmVhKHU4ICpieXRlYXJlYSwgcDgwMjExcHN0cmRfdCAqcHN0cikKIHsKIAlEQkZFTlRFUjsKIApAQCAtMzMyOCw3ICs4OTYsNyBAQAogewogCURCRkVOVEVSOwogCi0JcHN0ci0+bGVuID0gKFVJTlQ4KShoZmEzODR4Mmhvc3RfMTYoKFVJTlQxNikoYnl0ZXN0ci0+bGVuKSkpOworCXBzdHItPmxlbiA9ICh1OCkoaGZhMzg0eDJob3N0XzE2KCh1MTYpKGJ5dGVzdHItPmxlbikpKTsKIAltZW1jcHkocHN0ci0+ZGF0YSwgYnl0ZXN0ci0+ZGF0YSwgcHN0ci0+bGVuKTsKIAlEQkZFWElUOwogfQpAQCAtMzM0OSwxMSArOTE3LDExIEBACiAqCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAotdm9pZCBwcmlzbTJtZ210X2J5dGVhcmVhMnBzdHIoVUlOVDggKmJ5dGVhcmVhLCBwODAyMTFwc3RyZF90ICpwc3RyLCBpbnQgbGVuKQordm9pZCBwcmlzbTJtZ210X2J5dGVhcmVhMnBzdHIodTggKmJ5dGVhcmVhLCBwODAyMTFwc3RyZF90ICpwc3RyLCBpbnQgbGVuKQogewogCURCRkVOVEVSOwogCi0JcHN0ci0+bGVuID0gKFVJTlQ4KWxlbjsKKwlwc3RyLT5sZW4gPSAodTgpbGVuOwogCW1lbWNweShwc3RyLT5kYXRhLCBieXRlYXJlYSwgbGVuKTsKIAlEQkZFWElUOwogfQpAQCAtMzM3MywxMSArOTQxLDExIEBACiAqCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAotdm9pZCBwcmlzbTJtZ210X3ByaXNtMmludDJwODAyMTFpbnQoVUlOVDE2ICpwcmlzbTJpbnQsIFVJTlQzMiAqd2xhbmludCkKK3ZvaWQgcHJpc20ybWdtdF9wcmlzbTJpbnQycDgwMjExaW50KHUxNiAqcHJpc20yaW50LCB1MzIgKndsYW5pbnQpCiB7CiAJREJGRU5URVI7CiAKLQkqd2xhbmludCA9IChVSU5UMzIpaGZhMzg0eDJob3N0XzE2KCpwcmlzbTJpbnQpOworCSp3bGFuaW50ID0gKHUzMiloZmEzODR4Mmhvc3RfMTYoKnByaXNtMmludCk7CiAJREJGRVhJVDsKIH0KIApAQCAtMzM5NiwxMSArOTY0LDExIEBACiAqCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAotdm9pZCBwcmlzbTJtZ210X3A4MDIxMWludDJwcmlzbTJpbnQoVUlOVDE2ICpwcmlzbTJpbnQsIFVJTlQzMiAqd2xhbmludCkKK3ZvaWQgcHJpc20ybWdtdF9wODAyMTFpbnQycHJpc20yaW50KHUxNiAqcHJpc20yaW50LCB1MzIgKndsYW5pbnQpCiB7CiAJREJGRU5URVI7CiAKLQkqcHJpc20yaW50ID0gaG9zdDJoZmEzODR4XzE2KChVSU5UMTYpKCp3bGFuaW50KSk7CisJKnByaXNtMmludCA9IGhvc3QyaGZhMzg0eF8xNigodTE2KSgqd2xhbmludCkpOwogCURCRkVYSVQ7CiB9CiAKQEAgLTM0MTksNyArOTg3LDcgQEAKICoJTm90aGluZwogKgogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi12b2lkIHByaXNtMm1nbXRfcHJpc20yZW51bTJwODAyMTFlbnVtKFVJTlQxNiAqcHJpc20yZW51bSwgVUlOVDMyICp3bGFuZW51bSwgVUlOVDE2IHJpZCkKK3ZvaWQgcHJpc20ybWdtdF9wcmlzbTJlbnVtMnA4MDIxMWVudW0odTE2ICpwcmlzbTJlbnVtLCB1MzIgKndsYW5lbnVtLCB1MTYgcmlkKQogewogCURCRkVOVEVSOwogCkBAIC0zNDQ1LDcgKzEwMTMsNyBAQAogKglOb3RoaW5nCiAqCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXZvaWQgcHJpc20ybWdtdF9wODAyMTFlbnVtMnByaXNtMmVudW0oVUlOVDE2ICpwcmlzbTJlbnVtLCBVSU5UMzIgKndsYW5lbnVtLCBVSU5UMTYgcmlkKQordm9pZCBwcmlzbTJtZ210X3A4MDIxMWVudW0ycHJpc20yZW51bSh1MTYgKnByaXNtMmVudW0sIHUzMiAqd2xhbmVudW0sIHUxNiByaWQpCiB7CiAJREJGRU5URVI7CiAKQEAgLTM0NzEsMTAgKzEwMzksMTAgQEAKICoJTm90aGluZwogKgogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi12b2lkIHByaXNtMm1nbXRfZ2V0X29wcmF0ZXNldChVSU5UMTYgKnJhdGUsIHA4MDIxMXBzdHJkX3QgKnBzdHIpCit2b2lkIHByaXNtMm1nbXRfZ2V0X29wcmF0ZXNldCh1MTYgKnJhdGUsIHA4MDIxMXBzdHJkX3QgKnBzdHIpCiB7Ci0JVUlOVDgJbGVuOwotCVVJTlQ4CSpkYXRhcmF0ZTsKKwl1OAlsZW47CisJdTgJKmRhdGFyYXRlOwogCiAJREJGRU5URVI7CiAKQEAgLTM0ODMsMjkgKzEwNTEsMjkgQEAKIAogIAkvKiAxIE1icHMgKi8KIAlpZiAoIEJJVDAgJiAoKnJhdGUpICkgewotCQlsZW4gKz0gKFVJTlQ4KTE7Ci0JCSpkYXRhcmF0ZSA9IChVSU5UOCkyOworCQlsZW4gKz0gKHU4KTE7CisJCSpkYXRhcmF0ZSA9ICh1OCkyOwogCQlkYXRhcmF0ZSsrOwogCX0KIAogIAkvKiAyIE1icHMgKi8KIAlpZiAoIEJJVDEgJiAoKnJhdGUpICkgewotCQlsZW4gKz0gKFVJTlQ4KTE7Ci0JCSpkYXRhcmF0ZSA9IChVSU5UOCk0OworCQlsZW4gKz0gKHU4KTE7CisJCSpkYXRhcmF0ZSA9ICh1OCk0OwogCQlkYXRhcmF0ZSsrOwogCX0KIAogIAkvKiA1LjUgTWJwcyAqLwogCWlmICggQklUMiAmICgqcmF0ZSkgKSB7Ci0JCWxlbiArPSAoVUlOVDgpMTsKLQkJKmRhdGFyYXRlID0gKFVJTlQ4KTExOworCQlsZW4gKz0gKHU4KTE7CisJCSpkYXRhcmF0ZSA9ICh1OCkxMTsKIAkJZGF0YXJhdGUrKzsKIAl9CiAKICAJLyogMTEgTWJwcyAqLwogCWlmICggQklUMyAmICgqcmF0ZSkgKSB7Ci0JCWxlbiArPSAoVUlOVDgpMTsKLQkJKmRhdGFyYXRlID0gKFVJTlQ4KTIyOworCQlsZW4gKz0gKHU4KTE7CisJCSpkYXRhcmF0ZSA9ICh1OCkyMjsKIAkJZGF0YXJhdGUrKzsKIAl9CiAKQEAgLTM1MzAsOSArMTA5OCw5IEBACiAqCU5vdGhpbmcKICoKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdm9pZCBwcmlzbTJtZ210X3NldF9vcHJhdGVzZXQoVUlOVDE2ICpyYXRlLCBwODAyMTFwc3RyZF90ICpwc3RyKQordm9pZCBwcmlzbTJtZ210X3NldF9vcHJhdGVzZXQodTE2ICpyYXRlLCBwODAyMTFwc3RyZF90ICpwc3RyKQogewotCVVJTlQ4CSpkYXRhcmF0ZTsKKwl1OAkqZGF0YXJhdGU7CiAJaW50CWk7CiAKIAlEQkZFTlRFUjsKQEAgLTM1NjUsMjMzICsxMTMzLDMgQEAKIAlEQkZFWElUOwogCXJldHVybjsKIH0KLQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBwcmlzbTJtZ210X2dldF9ncnBhZGRyCi0qCi0qIFJldHJpZXZlcyBhIHBhcnRpY3VsYXIgZ3JvdXAgYWRkcmVzcyBmcm9tIHRoZSBsaXN0IG9mCi0qIGdyb3VwIGFkZHJlc3Nlcy4KLSoKLSogQXJndW1lbnRzOgotKglkaWQJCW1pYml0ZW0gZGlkCi0qCXBzdHIJCXdsYW4gb2N0ZXQgc3RyaW5nCi0qCXByaXYJCXByaXNtMiBkcml2ZXIgcHJpdmF0ZSBkYXRhIHN0cnVjdHVyZQotKgotKiBSZXR1cm5zOgotKglOb3RoaW5nCi0qCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXZvaWQgcHJpc20ybWdtdF9nZXRfZ3JwYWRkcihVSU5UMzIgZGlkLCBwODAyMTFwc3RyZF90ICpwc3RyLAotCWhmYTM4NHhfdCAqaHcgKQotewotCWludAlpbmRleDsKLQotCURCRkVOVEVSOwotCi0JaW5kZXggPSBwcmlzbTJtZ210X2dldF9ncnBhZGRyX2luZGV4KGRpZCk7Ci0KLQlpZiAoIGluZGV4ID49IDAgKSB7Ci0JCXBzdHItPmxlbiA9IFdMQU5fQUREUl9MRU47Ci0JCW1lbWNweShwc3RyLT5kYXRhLCBody0+ZG90MTFfZ3JwX2FkZHJbaW5kZXhdLAotCQkJV0xBTl9BRERSX0xFTik7Ci0JfQotCi0JREJGRVhJVDsKLQlyZXR1cm47Ci19Ci0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogcHJpc20ybWdtdF9zZXRfZ3JwYWRkcgotKgotKiBDb252ZXJ0IHRoZSB3bGFuIG9jdGV0IHN0cmluZyBpbnRvIGFuIGhmYTM4NHggYml0IGFyZWEuCi0qCi0qIEFyZ3VtZW50czoKLSoJZGlkCQltaWJpdGVtIGRpZAotKglidWYKLSoJZ3JvdXBzCi0qCi0qIFJldHVybnM6Ci0qCTAJU3VjY2VzcwotKgkhMAlFcnJvcgotKgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgcHJpc20ybWdtdF9zZXRfZ3JwYWRkcihVSU5UMzIgZGlkLCBVSU5UOCAqcHJpc20yYnVmLAotCXA4MDIxMXBzdHJkX3QgKnBzdHIsIGhmYTM4NHhfdCAqaHcgKQotewotCVVJTlQ4CW5vX2FkZHJbV0xBTl9BRERSX0xFTl07Ci0JaW50CWluZGV4OwotCi0JREJGRU5URVI7Ci0KLQltZW1zZXQobm9fYWRkciwgMCwgV0xBTl9BRERSX0xFTik7Ci0JaWYgKG1lbWNtcChub19hZGRyLCBwc3RyLT5kYXRhLCBXTEFOX0FERFJfTEVOKSAhPSAwKSB7Ci0KLQkJLyoKLQkJKiogVGhlIGFkZHJlc3MgaXMgTk9UIDAgc28gd2UgYXJlICJhZGRpbmciIGFuIGFkZHJlc3MgdG8gdGhlCi0JCSoqIGdyb3VwIGFkZHJlc3MgbGlzdC4gIENoZWNrIHRvIG1ha2Ugc3VyZSB3ZSBhcmVuJ3QgdHJ5aW5nCi0JCSoqIHRvIGFkZCBtb3JlIHRoYW4gdGhlIG1heGltdW0gYWxsb3dlZCBudW1iZXIgb2YgZ3JvdXAKLQkJKiogYWRkcmVzc2VzIGluIHRoZSBsaXN0LiAgVGhlIG5ldyBhZGRyZXNzIGlzIGFkZGVkIHRvIHRoZQotCQkqKiBlbmQgb2YgdGhlIGxpc3QgcmVnYXJkbGVzcyBvZiB0aGUgRElEIHVzZWQgdG8gYWRkIHRoZQotCQkqKiBhZGRyZXNzLgotCQkqLwotCi0JCWlmIChody0+ZG90MTFfZ3JwY250ID49IE1BWF9HUlBfQUREUikgcmV0dXJuKC0xKTsKLQotCQltZW1jcHkoaHctPmRvdDExX2dycF9hZGRyW2h3LT5kb3QxMV9ncnBjbnRdLCBwc3RyLT5kYXRhLAotCQkJCQkJCQkgV0xBTl9BRERSX0xFTik7Ci0JCWh3LT5kb3QxMV9ncnBjbnQgKz0gMTsKLQl9IGVsc2UgewotCi0JCS8qCi0JCSoqIFRoZSBhZGRyZXNzIGlzIDAuICBJbnRlcnByZXQgdGhpcyBhcyAiZGVsZXRpbmciIGFuIGFkZHJlc3MKLQkJKiogZnJvbSB0aGUgZ3JvdXAgYWRkcmVzcyBsaXN0LiAgR2V0IHRoZSBhZGRyZXNzIGluZGV4IGZyb20KLQkJKiogdGhlIERJRC4gIElmIHRoaXMgaXMgd2l0aGluIHRoZSByYW5nZSBvZiB1c2VkIGFkZHJlc3NlcywKLQkJKiogdGhlbiBkZWxldGUgdGhlIHNwZWNpZmllZCBhZGRyZXNzIGJ5IHNoaWZ0aW5nIGFsbCBmb2xsb3dpbmcKLQkJKiogYWRkcmVzc2VzIGRvd24uICBUaGVuIGNsZWFyIHRoZSBsYXN0IGFkZHJlc3MgKHdoaWNoIHNob3VsZAotCQkqKiBub3cgYmUgdW51c2VkKS4gIElmIHRoZSBhZGRyZXNzIGluZGV4IGlzIE5PVCB3aXRoaW4gdGhlCi0JCSoqIHJhbmdlIG9mIHVzZWQgYWRkcmVzc2VzLCB0aGVuIGp1c3QgaWdub3JlIHRoZSBhZGRyZXNzLgotCQkqLwotCi0JCWluZGV4ID0gcHJpc20ybWdtdF9nZXRfZ3JwYWRkcl9pbmRleChkaWQpOwotCQlpZiAoaW5kZXggPj0gMCAmJiBpbmRleCA8IGh3LT5kb3QxMV9ncnBjbnQpIHsKLQkJCWh3LT5kb3QxMV9ncnBjbnQgLT0gMTsKLQkJCW1lbW1vdmUoaHctPmRvdDExX2dycF9hZGRyW2luZGV4XSwKLQkJCQlody0+ZG90MTFfZ3JwX2FkZHJbaW5kZXggKyAxXSwKLQkJCQkoKGh3LT5kb3QxMV9ncnBjbnQpLWluZGV4KSAqIFdMQU5fQUREUl9MRU4pOwotCQkJbWVtc2V0KGh3LT5kb3QxMV9ncnBfYWRkcltody0+ZG90MTFfZ3JwY250XSwgMCwKLQkJCQkJCQkJIFdMQU5fQUREUl9MRU4pOwotCQl9Ci0JfQotCi0JREJGRVhJVDsKLQlyZXR1cm4oMCk7Ci19Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIHByaXNtMm1nbXRfZ2V0X2dycGFkZHJfaW5kZXgKLSoKLSogR2V0cyB0aGUgaW5kZXggaW4gdGhlIGdyb3VwIGFkZHJlc3MgbGlzdCBiYXNlZCBvbiB0aGUgZGlkLgotKgotKiBBcmd1bWVudHM6Ci0qCWRpZAkJbWliaXRlbSBkaWQKLSoKLSogUmV0dXJuczoKLSoJPj0gMAlJZiB2YWxpZCBkaWQKLSoJPCAwCUlmIG5vdCB2YWxpZCBkaWQKLSoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IHByaXNtMm1nbXRfZ2V0X2dycGFkZHJfaW5kZXgoIFVJTlQzMiBkaWQgKQotewotCWludAlpbmRleDsKLQotCURCRkVOVEVSOwotCi0JaW5kZXggPSAtMTsKLQotCXN3aXRjaCAoZGlkKSB7Ci0JY2FzZSBESURtaWJfZG90MTFtYWNfZG90MTFHcm91cEFkZHJlc3Nlc1RhYmxlX2RvdDExQWRkcmVzczE6Ci0JCWluZGV4ID0gMDsKLQkJYnJlYWs7Ci0JY2FzZSBESURtaWJfZG90MTFtYWNfZG90MTFHcm91cEFkZHJlc3Nlc1RhYmxlX2RvdDExQWRkcmVzczI6Ci0JCWluZGV4ID0gMTsKLQkJYnJlYWs7Ci0JY2FzZSBESURtaWJfZG90MTFtYWNfZG90MTFHcm91cEFkZHJlc3Nlc1RhYmxlX2RvdDExQWRkcmVzczM6Ci0JCWluZGV4ID0gMjsKLQkJYnJlYWs7Ci0JY2FzZSBESURtaWJfZG90MTFtYWNfZG90MTFHcm91cEFkZHJlc3Nlc1RhYmxlX2RvdDExQWRkcmVzczQ6Ci0JCWluZGV4ID0gMzsKLQkJYnJlYWs7Ci0JY2FzZSBESURtaWJfZG90MTFtYWNfZG90MTFHcm91cEFkZHJlc3Nlc1RhYmxlX2RvdDExQWRkcmVzczU6Ci0JCWluZGV4ID0gNDsKLQkJYnJlYWs7Ci0JY2FzZSBESURtaWJfZG90MTFtYWNfZG90MTFHcm91cEFkZHJlc3Nlc1RhYmxlX2RvdDExQWRkcmVzczY6Ci0JCWluZGV4ID0gNTsKLQkJYnJlYWs7Ci0JY2FzZSBESURtaWJfZG90MTFtYWNfZG90MTFHcm91cEFkZHJlc3Nlc1RhYmxlX2RvdDExQWRkcmVzczc6Ci0JCWluZGV4ID0gNjsKLQkJYnJlYWs7Ci0JY2FzZSBESURtaWJfZG90MTFtYWNfZG90MTFHcm91cEFkZHJlc3Nlc1RhYmxlX2RvdDExQWRkcmVzczg6Ci0JCWluZGV4ID0gNzsKLQkJYnJlYWs7Ci0JY2FzZSBESURtaWJfZG90MTFtYWNfZG90MTFHcm91cEFkZHJlc3Nlc1RhYmxlX2RvdDExQWRkcmVzczk6Ci0JCWluZGV4ID0gODsKLQkJYnJlYWs7Ci0JY2FzZSBESURtaWJfZG90MTFtYWNfZG90MTFHcm91cEFkZHJlc3Nlc1RhYmxlX2RvdDExQWRkcmVzczEwOgotCQlpbmRleCA9IDk7Ci0JCWJyZWFrOwotCWNhc2UgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3MxMToKLQkJaW5kZXggPSAxMDsKLQkJYnJlYWs7Ci0JY2FzZSBESURtaWJfZG90MTFtYWNfZG90MTFHcm91cEFkZHJlc3Nlc1RhYmxlX2RvdDExQWRkcmVzczEyOgotCQlpbmRleCA9IDExOwotCQlicmVhazsKLQljYXNlIERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzMTM6Ci0JCWluZGV4ID0gMTI7Ci0JCWJyZWFrOwotCWNhc2UgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3MxNDoKLQkJaW5kZXggPSAxMzsKLQkJYnJlYWs7Ci0JY2FzZSBESURtaWJfZG90MTFtYWNfZG90MTFHcm91cEFkZHJlc3Nlc1RhYmxlX2RvdDExQWRkcmVzczE1OgotCQlpbmRleCA9IDE0OwotCQlicmVhazsKLQljYXNlIERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzMTY6Ci0JCWluZGV4ID0gMTU7Ci0JCWJyZWFrOwotCWNhc2UgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3MxNzoKLQkJaW5kZXggPSAxNjsKLQkJYnJlYWs7Ci0JY2FzZSBESURtaWJfZG90MTFtYWNfZG90MTFHcm91cEFkZHJlc3Nlc1RhYmxlX2RvdDExQWRkcmVzczE4OgotCQlpbmRleCA9IDE3OwotCQlicmVhazsKLQljYXNlIERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzMTk6Ci0JCWluZGV4ID0gMTg7Ci0JCWJyZWFrOwotCWNhc2UgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3MyMDoKLQkJaW5kZXggPSAxOTsKLQkJYnJlYWs7Ci0JY2FzZSBESURtaWJfZG90MTFtYWNfZG90MTFHcm91cEFkZHJlc3Nlc1RhYmxlX2RvdDExQWRkcmVzczIxOgotCQlpbmRleCA9IDIwOwotCQlicmVhazsKLQljYXNlIERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzMjI6Ci0JCWluZGV4ID0gMjE7Ci0JCWJyZWFrOwotCWNhc2UgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3MyMzoKLQkJaW5kZXggPSAyMjsKLQkJYnJlYWs7Ci0JY2FzZSBESURtaWJfZG90MTFtYWNfZG90MTFHcm91cEFkZHJlc3Nlc1RhYmxlX2RvdDExQWRkcmVzczI0OgotCQlpbmRleCA9IDIzOwotCQlicmVhazsKLQljYXNlIERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzMjU6Ci0JCWluZGV4ID0gMjQ7Ci0JCWJyZWFrOwotCWNhc2UgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3MyNjoKLQkJaW5kZXggPSAyNTsKLQkJYnJlYWs7Ci0JY2FzZSBESURtaWJfZG90MTFtYWNfZG90MTFHcm91cEFkZHJlc3Nlc1RhYmxlX2RvdDExQWRkcmVzczI3OgotCQlpbmRleCA9IDI2OwotCQlicmVhazsKLQljYXNlIERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzMjg6Ci0JCWluZGV4ID0gMjc7Ci0JCWJyZWFrOwotCWNhc2UgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3MyOToKLQkJaW5kZXggPSAyODsKLQkJYnJlYWs7Ci0JY2FzZSBESURtaWJfZG90MTFtYWNfZG90MTFHcm91cEFkZHJlc3Nlc1RhYmxlX2RvdDExQWRkcmVzczMwOgotCQlpbmRleCA9IDI5OwotCQlicmVhazsKLQljYXNlIERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzMzE6Ci0JCWluZGV4ID0gMzA7Ci0JCWJyZWFrOwotCWNhc2UgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3MzMjoKLQkJaW5kZXggPSAzMTsKLQkJYnJlYWs7Ci0JfQotCi0JREJGRVhJVDsKLQlyZXR1cm4gaW5kZXg7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wcmlzbTJzdGEuYyBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3ByaXNtMnN0YS5jCmluZGV4IDE4YWExNWYuLmIyNzljOTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3ByaXNtMnN0YS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3ByaXNtMnN0YS5jCkBAIC01NCwxNiArNTQsOSBAQAogLyogU3lzdGVtIEluY2x1ZGVzICovCiAjZGVmaW5lIFdMQU5fREJWQVIJcHJpc20yX2RlYnVnCiAKLSNpbmNsdWRlICJ2ZXJzaW9uLmgiCi0KLQogI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KLQogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw0LDI1KSkKICNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgotI2VuZGlmCi0KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CkBAIC03MSwzNCArNjQsMTUgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KLQotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkpCi0jaW5jbHVkZSA8bGludXgvdHF1ZXVlLmg+Ci0jZWxzZQogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgotI2VuZGlmCiAKICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KICNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KIAotI2lmIChXTEFOX0hPU1RJRiA9PSBXTEFOX1BDTUNJQSkKLSNpbmNsdWRlIDxwY21jaWEvdmVyc2lvbi5oPgotI2luY2x1ZGUgPHBjbWNpYS9jc190eXBlcy5oPgotI2luY2x1ZGUgPHBjbWNpYS9jcy5oPgotI2luY2x1ZGUgPHBjbWNpYS9jaXN0cGwuaD4KLSNpbmNsdWRlIDxwY21jaWEvZHMuaD4KLSNpbmNsdWRlIDxwY21jaWEvY2lzcmVnLmg+Ci0jZW5kaWYKLQogI2luY2x1ZGUgIndsYW5fY29tcGF0LmgiCiAKLSNpZiAoKFdMQU5fSE9TVElGID09IFdMQU5fUExYKSB8fCAoV0xBTl9IT1NUSUYgPT0gV0xBTl9QQ0kpKQotI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2VuZGlmCi0KIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAvKiBQcm9qZWN0IEluY2x1ZGVzICovCiAKQEAgLTEyNiwzNCArMTAwLDcgQEAKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAvKiBMb2NhbCBTdGF0aWMgRGVmaW5pdGlvbnMgKi8KIAotI2lmIChXTEFOX0hPU1RJRiA9PSBXTEFOX1BDTUNJQSkKLSNkZWZpbmUgRFJJVkVSX1NVRkZJWAkiX2NzIgotI2VsaWYgKFdMQU5fSE9TVElGID09IFdMQU5fUExYKQotI2RlZmluZSBEUklWRVJfU1VGRklYCSJfcGx4IgotdHlwZWRlZiBjaGFyKiBkZXZfaW5mb190OwotI2VsaWYgKFdMQU5fSE9TVElGID09IFdMQU5fUENJKQotI2RlZmluZSBEUklWRVJfU1VGRklYCSJfcGNpIgotdHlwZWRlZiBjaGFyKiBkZXZfaW5mb190OwotI2VsaWYgKFdMQU5fSE9TVElGID09IFdMQU5fVVNCKQotI2RlZmluZSBEUklWRVJfU1VGRklYCSJfdXNiIgotdHlwZWRlZiBjaGFyKiBkZXZfaW5mb190OwotI2Vsc2UKLSNlcnJvciAiSE9TVElGIHVuc3VwcG9ydGVkIG9yIHVuZGVmaW5lZCEiCi0jZW5kaWYKLQotc3RhdGljIGNoYXIJCSp2ZXJzaW9uID0gInByaXNtMiIgRFJJVkVSX1NVRkZJWCAiLm86ICIgV0xBTl9SRUxFQVNFOwotc3RhdGljIGRldl9pbmZvX3QJZGV2X2luZm8gPSAicHJpc20yIiBEUklWRVJfU1VGRklYOwotCi0jaWYgKFdMQU5fSE9TVElGID09IFdMQU5fUExYIHx8IFdMQU5fSE9TVElGID09IFdMQU5fUENJKQotI2lmZGVmIENPTkZJR19QTQotc3RhdGljIGludCBwcmlzbTJzdGFfc3VzcGVuZF9wY2koc3RydWN0IHBjaV9kZXYgKnBkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSk7Ci1zdGF0aWMgaW50IHByaXNtMnN0YV9yZXN1bWVfcGNpKHN0cnVjdCBwY2lfZGV2ICpwZGV2KTsKLSNlbmRpZgotI2VuZGlmCi0KLSNpZiAoV0xBTl9IT1NUSUYgPT0gV0xBTl9QQ0kpCi0KLSNlbmRpZiAvKiBXTEFOX1BDSSAqLworc3RhdGljIGNoYXIgKmRldl9pbmZvID0gInByaXNtMl91c2IiOwogCiBzdGF0aWMgd2xhbmRldmljZV90ICpjcmVhdGVfd2xhbih2b2lkKTsKIApAQCAtMTYzLDE2ICsxMTAsNyBAQAogaW50ICAgICAgcHJpc20yX3Jlc2V0X2hvbGR0aW1lPTMwOwkvKiBSZXNldCBob2xkIHRpbWUgaW4gbXMgKi8KIGludAkgcHJpc20yX3Jlc2V0X3NldHRsZXRpbWU9MTAwOwkvKiBSZXNldCBzZXR0bGUgdGltZSBpbiBtcyAqLwogCi0jaWYgKFdMQU5fSE9TVElGID09IFdMQU5fVVNCKQogc3RhdGljIGludAlwcmlzbTJfZG9yZXNldD0wOwkJLyogRG8gYSByZXNldCBhdCBpbml0PyAqLwotI2Vsc2UKLXN0YXRpYyBpbnQgICAgICBwcmlzbTJfZG9yZXNldD0xOwkJLyogRG8gYSByZXNldCBhdCBpbml0PyAqLwotaW50ICAgICAgICAgICAgIHByaXNtMl9iYXBfdGltZW91dD0xMDAwOyAgICAgICAgLyogQkFQIHRpbWVvdXQgKi8KLWludAkJcHJpc20yX2lycV9ldnJlYWRfbWF4PTIwOwkvKiBNYXhpbXVtIG51bWJlciBvZgotCQkJCQkJICogZXZfcmVhZHMgKGxvb3BzKQotCQkJCQkJICogaW4gaXJxIGhhbmRsZXIKLQkJCQkJCSAqLwotI2VuZGlmCiAKICNpZmRlZiBXTEFOX0lOQ0xVREVfREVCVUcKIGludCBwcmlzbTJfZGVidWc9MDsKQEAgLTE4OCwxMyArMTI2LDYgQEAKIG1vZHVsZV9wYXJhbSggcHJpc20yX3Jlc2V0X3NldHRsZXRpbWUsIGludCwgMDY0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKCBwcmlzbTJfcmVzZXRfc2V0dGxldGltZSwgInJlc2V0IHNldHRsZSB0aW1lIGluIG1zIik7CiAKLSNpZiAoV0xBTl9IT1NUSUYgIT0gV0xBTl9VU0IpCi1tb2R1bGVfcGFyYW0oIHByaXNtMl9iYXBfdGltZW91dCwgaW50LCAwNjQ0KTsKLU1PRFVMRV9QQVJNX0RFU0MocHJpc20yX2JhcF90aW1lb3V0LCAiQnVmZmVyQWNjZXNzUGF0aCBUaW1lb3V0IGluIDEwKm4gdXMiKTsKLW1vZHVsZV9wYXJhbSggcHJpc20yX2lycV9ldnJlYWRfbWF4LCBpbnQsIDA2NDQpOwotTU9EVUxFX1BBUk1fREVTQyggcHJpc20yX2lycV9ldnJlYWRfbWF4LCAiTWF4aW1pbSBudW1iZXIgb2YgZXZlbnQgcmVhZHMgaW4gaW50ZXJydXB0IGhhbmRsZXIiKTsKLSNlbmRpZgotCiBNT0RVTEVfTElDRU5TRSgiRHVhbCBNUEwvR1BMIik7CiAKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCkBAIC0yMzEsMTcgKzE2Miw2IEBACiBzdGF0aWMgdm9pZAlwcmlzbTJzdGFfaW5mX3BzdXNlcmNudCgKIAkJCXdsYW5kZXZpY2VfdCAqd2xhbmRldiwgaGZhMzg0eF9JbmZGcmFtZV90ICppbmYpOwogCi0jaWZkZWYgQ09ORklHX1BST0NfRlMKLXN0YXRpYyBpbnQKLXByaXNtMnN0YV9wcm9jX3JlYWQoCi0JY2hhcgkqcGFnZSwKLQljaGFyCSoqc3RhcnQsCi0Jb2ZmX3QJb2Zmc2V0LAotCWludAljb3VudCwKLQlpbnQJKmVvZiwKLQl2b2lkCSpkYXRhKTsKLSNlbmRpZgotCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogLyogRnVuY3Rpb24gRGVmaW5pdGlvbnMgKi8KIApAQCAtMjY3LDcgKzE4Nyw3IEBACiAJaW50IGM7CiAJZm9yICggYz0gMDsgYyA8IG47IGMrKykgewogCQlpZiAoIChjICUgMTYpID09IDAgKSBwcmludGsoS0VSTl9ERUJVRyJkbXBbJWRdOiAiLCBjKTsKLQkJcHJpbnRrKCIlMDJ4ICIsICgoVUlOVDgqKWJ1ZilbY10pOworCQlwcmludGsoIiUwMnggIiwgKCh1OCopYnVmKVtjXSk7CiAJCWlmICggKGMgJSAxNikgPT0gMTUgKSBwcmludGsoIlxuIik7CiAJfQogCWlmICggKGMgJSAxNikgIT0gMCApIHByaW50aygiXG4iKTsKQEAgLTI5OSwxMCArMjE5LDYgQEAKIHsKIAlEQkZFTlRFUjsKIAotI2lmZGVmIEFOQ0lFTlRfTU9EVUxFX0NPREUKLQlNT0RfSU5DX1VTRV9DT1VOVDsKLSNlbmRpZgotCiAJLyogV2UgZG9uJ3QgY3VycmVudGx5IGhhdmUgdG8gZG8gYW55dGhpbmcgZWxzZS4KIAkgKiBUaGUgc2V0dXAgb2YgdGhlIE1BQyBzaG91bGQgYmUgc3Vic2VxdWVudGx5IGNvbXBsZXRlZCB2aWEKIAkgKiB0aGUgbWxtZSBjb21tYW5kcy4KQEAgLTM0MSwxMCArMjU3LDYgQEAKIHsKIAlEQkZFTlRFUjsKIAotI2lmZGVmIEFOQ0lFTlRfTU9EVUxFX0NPREUKLQlNT0RfREVDX1VTRV9DT1VOVDsKLSNlbmRpZgotCiAJLyogV2UgZG9uJ3QgY3VycmVudGx5IGhhdmUgdG8gZG8gYW55dGhpbmcgZWxzZS4KIAkgKiBIaWdoZXIgbGF5ZXJzIGtub3cgd2UncmUgbm90IHJlYWR5IGZyb20gZGV2LT5zdGFydD09MCBhbmQKIAkgKiBkZXYtPnRidXN5PT0xLiAgT3VyIHJ4IHBhdGgga25vd3MgdG8gbm90IHBhc3MgdXAgcmVjZWl2ZWQKQEAgLTQ2MywxMCArMzc1LDYgQEAKIAkJV0xBTl9MT0dfREVCVUcoMiwiUmVjZWl2ZWQgbWlic2V0IHJlcXVlc3RcbiIpOwogCQlyZXN1bHQgPSBwcmlzbTJtZ210X21pYnNldF9taWJnZXQod2xhbmRldiwgbXNnKTsKIAkJYnJlYWs7Ci0JY2FzZSBESURtc2dfZG90MTFyZXFfcG93ZXJtZ210IDoKLQkJV0xBTl9MT0dfREVCVUcoMiwiUmVjZWl2ZWQgcG93ZXJtZ210IHJlcXVlc3RcbiIpOwotCQlyZXN1bHQgPSBwcmlzbTJtZ210X3Bvd2VybWdtdCh3bGFuZGV2LCBtc2cpOwotCQlicmVhazsKIAljYXNlIERJRG1zZ19kb3QxMXJlcV9zY2FuIDoKIAkJV0xBTl9MT0dfREVCVUcoMiwiUmVjZWl2ZWQgc2NhbiByZXF1ZXN0XG4iKTsKIAkJcmVzdWx0ID0gcHJpc20ybWdtdF9zY2FuKHdsYW5kZXYsIG1zZyk7CkBAIC00NzUsMzQgKzM4Myw2IEBACiAJCVdMQU5fTE9HX0RFQlVHKDIsIlJlY2VpdmVkIHNjYW5fcmVzdWx0cyByZXF1ZXN0XG4iKTsKIAkJcmVzdWx0ID0gcHJpc20ybWdtdF9zY2FuX3Jlc3VsdHMod2xhbmRldiwgbXNnKTsKIAkJYnJlYWs7Ci0JY2FzZSBESURtc2dfZG90MTFyZXFfam9pbiA6Ci0JCVdMQU5fTE9HX0RFQlVHKDIsIlJlY2VpdmVkIGpvaW4gcmVxdWVzdFxuIik7Ci0JCXJlc3VsdCA9IHByaXNtMm1nbXRfam9pbih3bGFuZGV2LCBtc2cpOwotCQlicmVhazsKLQljYXNlIERJRG1zZ19kb3QxMXJlcV9hdXRoZW50aWNhdGUgOgotCQlXTEFOX0xPR19ERUJVRygyLCJSZWNlaXZlZCBhdXRoZW50aWNhdGUgcmVxdWVzdFxuIik7Ci0JCXJlc3VsdCA9IHByaXNtMm1nbXRfYXV0aGVudGljYXRlKHdsYW5kZXYsIG1zZyk7Ci0JCWJyZWFrOwotCWNhc2UgRElEbXNnX2RvdDExcmVxX2RlYXV0aGVudGljYXRlIDoKLQkJV0xBTl9MT0dfREVCVUcoMiwiUmVjZWl2ZWQgbWxtZSBkZWF1dGhlbnRpY2F0ZSByZXF1ZXN0XG4iKTsKLQkJcmVzdWx0ID0gcHJpc20ybWdtdF9kZWF1dGhlbnRpY2F0ZSh3bGFuZGV2LCBtc2cpOwotCQlicmVhazsKLQljYXNlIERJRG1zZ19kb3QxMXJlcV9hc3NvY2lhdGUgOgotCQlXTEFOX0xPR19ERUJVRygyLCJSZWNlaXZlZCBtbG1lIGFzc29jaWF0ZSByZXF1ZXN0XG4iKTsKLQkJcmVzdWx0ID0gcHJpc20ybWdtdF9hc3NvY2lhdGUod2xhbmRldiwgbXNnKTsKLQkJYnJlYWs7Ci0JY2FzZSBESURtc2dfZG90MTFyZXFfcmVhc3NvY2lhdGUgOgotCQlXTEFOX0xPR19ERUJVRygyLCJSZWNlaXZlZCBtbG1lIHJlYXNzb2NpYXRlIHJlcXVlc3RcbiIpOwotCQlyZXN1bHQgPSBwcmlzbTJtZ210X3JlYXNzb2NpYXRlKHdsYW5kZXYsIG1zZyk7Ci0JCWJyZWFrOwotCWNhc2UgRElEbXNnX2RvdDExcmVxX2Rpc2Fzc29jaWF0ZSA6Ci0JCVdMQU5fTE9HX0RFQlVHKDIsIlJlY2VpdmVkIG1sbWUgZGlzYXNzb2NpYXRlIHJlcXVlc3RcbiIpOwotCQlyZXN1bHQgPSBwcmlzbTJtZ210X2Rpc2Fzc29jaWF0ZSh3bGFuZGV2LCBtc2cpOwotCQlicmVhazsKLQljYXNlIERJRG1zZ19kb3QxMXJlcV9yZXNldCA6Ci0JCVdMQU5fTE9HX0RFQlVHKDIsIlJlY2VpdmVkIG1sbWUgcmVzZXQgcmVxdWVzdFxuIik7Ci0JCXJlc3VsdCA9IHByaXNtMm1nbXRfcmVzZXQod2xhbmRldiwgbXNnKTsKLQkJYnJlYWs7CiAJY2FzZSBESURtc2dfZG90MTFyZXFfc3RhcnQgOgogCQlXTEFOX0xPR19ERUJVRygyLCJSZWNlaXZlZCBtbG1lIHN0YXJ0IHJlcXVlc3RcbiIpOwogCQlyZXN1bHQgPSBwcmlzbTJtZ210X3N0YXJ0KHdsYW5kZXYsIG1zZyk7CkBAIC01MTAsNDYgKzM5MCwxMCBAQAogCS8qCiAJICogUHJpc20yIHNwZWNpZmljIG1lc3NhZ2VzCiAJICovCi0JY2FzZSBESURtc2dfcDJyZXFfam9pbiA6Ci0JCVdMQU5fTE9HX0RFQlVHKDIsIlJlY2VpdmVkIHAyIGpvaW4gcmVxdWVzdFxuIik7Ci0JCXJlc3VsdCA9IHByaXNtMm1nbXRfcDJfam9pbih3bGFuZGV2LCBtc2cpOwotCQlicmVhazsKICAgICAgICAJY2FzZSBESURtc2dfcDJyZXFfcmVhZHBkYSA6CiAJCVdMQU5fTE9HX0RFQlVHKDIsIlJlY2VpdmVkIG1sbWUgcmVhZHBkYSByZXF1ZXN0XG4iKTsKIAkJcmVzdWx0ID0gcHJpc20ybWdtdF9yZWFkcGRhKHdsYW5kZXYsIG1zZyk7CiAJCWJyZWFrOwotCWNhc2UgRElEbXNnX3AycmVxX3JlYWRjaXMgOgotCQlXTEFOX0xPR19ERUJVRygyLCJSZWNlaXZlZCBtbG1lIHJlYWRjaXMgcmVxdWVzdFxuIik7Ci0JCXJlc3VsdCA9IHByaXNtMm1nbXRfcmVhZGNpcyh3bGFuZGV2LCBtc2cpOwotCQlicmVhazsKLQljYXNlIERJRG1zZ19wMnJlcV9hdXhwb3J0X3N0YXRlIDoKLQkJV0xBTl9MT0dfREVCVUcoMiwiUmVjZWl2ZWQgbWxtZSBhdXhwb3J0X3N0YXRlIHJlcXVlc3RcbiIpOwotCQlyZXN1bHQgPSBwcmlzbTJtZ210X2F1eHBvcnRfc3RhdGUod2xhbmRldiwgbXNnKTsKLQkJYnJlYWs7Ci0JY2FzZSBESURtc2dfcDJyZXFfYXV4cG9ydF9yZWFkIDoKLQkJV0xBTl9MT0dfREVCVUcoMiwiUmVjZWl2ZWQgbWxtZSBhdXhwb3J0X3JlYWQgcmVxdWVzdFxuIik7Ci0JCXJlc3VsdCA9IHByaXNtMm1nbXRfYXV4cG9ydF9yZWFkKHdsYW5kZXYsIG1zZyk7Ci0JCWJyZWFrOwotCWNhc2UgRElEbXNnX3AycmVxX2F1eHBvcnRfd3JpdGUgOgotCQlXTEFOX0xPR19ERUJVRygyLCJSZWNlaXZlZCBtbG1lIGF1eHBvcnRfd3JpdGUgcmVxdWVzdFxuIik7Ci0JCXJlc3VsdCA9IHByaXNtMm1nbXRfYXV4cG9ydF93cml0ZSh3bGFuZGV2LCBtc2cpOwotCQlicmVhazsKLQljYXNlIERJRG1zZ19wMnJlcV9sb3dfbGV2ZWwgOgotCQlXTEFOX0xPR19ERUJVRygyLCJSZWNlaXZlZCBtbG1lIGxvd19sZXZlbCByZXF1ZXN0XG4iKTsKLQkJcmVzdWx0ID0gcHJpc20ybWdtdF9sb3dfbGV2ZWwod2xhbmRldiwgbXNnKTsKLQkJYnJlYWs7Ci0gICAgICAgIGNhc2UgRElEbXNnX3AycmVxX3Rlc3RfY29tbWFuZCA6Ci0gICAgICAgICAgICAgICAgV0xBTl9MT0dfREVCVUcoMiwiUmVjZWl2ZWQgbWxtZSB0ZXN0X2NvbW1hbmQgcmVxdWVzdFxuIik7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gcHJpc20ybWdtdF90ZXN0X2NvbW1hbmQod2xhbmRldiwgbXNnKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBESURtc2dfcDJyZXFfbW1pX3JlYWQgOgotICAgICAgICAgICAgICAgIFdMQU5fTE9HX0RFQlVHKDIsIlJlY2VpdmVkIG1sbWUgbW1pX3JlYWQgcmVxdWVzdFxuIik7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gcHJpc20ybWdtdF9tbWlfcmVhZCh3bGFuZGV2LCBtc2cpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIERJRG1zZ19wMnJlcV9tbWlfd3JpdGUgOgotICAgICAgICAgICAgICAgIFdMQU5fTE9HX0RFQlVHKDIsIlJlY2VpdmVkIG1sbWUgbW1pX3dyaXRlIHJlcXVlc3RcbiIpOwotICAgICAgICAgICAgICAgIHJlc3VsdCA9IHByaXNtMm1nbXRfbW1pX3dyaXRlKHdsYW5kZXYsIG1zZyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7CiAJY2FzZSBESURtc2dfcDJyZXFfcmFtZGxfc3RhdGUgOgogCQlXTEFOX0xPR19ERUJVRygyLCJSZWNlaXZlZCBtbG1lIHJhbWRsX3N0YXRlIHJlcXVlc3RcbiIpOwogCQlyZXN1bHQgPSBwcmlzbTJtZ210X3JhbWRsX3N0YXRlKHdsYW5kZXYsIG1zZyk7CkBAIC01NjYsMTggKzQxMCw2IEBACiAJCVdMQU5fTE9HX0RFQlVHKDIsIlJlY2VpdmVkIG1sbWUgZmxhc2hkbF93cml0ZSByZXF1ZXN0XG4iKTsKIAkJcmVzdWx0ID0gcHJpc20ybWdtdF9mbGFzaGRsX3dyaXRlKHdsYW5kZXYsIG1zZyk7CiAJCWJyZWFrOwotCWNhc2UgRElEbXNnX3AycmVxX2R1bXBfc3RhdGUgOgotCQlXTEFOX0xPR19ERUJVRygyLCJSZWNlaXZlZCBtbG1lIGR1bXBfc3RhdGUgcmVxdWVzdFxuIik7Ci0JCXJlc3VsdCA9IHByaXNtMm1nbXRfZHVtcF9zdGF0ZSh3bGFuZGV2LCBtc2cpOwotCQlicmVhazsKLQljYXNlIERJRG1zZ19wMnJlcV9jaGFubmVsX2luZm8gOgotCQlXTEFOX0xPR19ERUJVRygyLCJSZWNlaXZlZCBtbG1lIGNoYW5uZWxfaW5mbyByZXF1ZXN0XG4iKTsKLQkJcmVzdWx0ID0gcHJpc20ybWdtdF9jaGFubmVsX2luZm8od2xhbmRldiwgbXNnKTsKLQkJYnJlYWs7Ci0JY2FzZSBESURtc2dfcDJyZXFfY2hhbm5lbF9pbmZvX3Jlc3VsdHMgOgotCQlXTEFOX0xPR19ERUJVRygyLCJSZWNlaXZlZCBtbG1lIGNoYW5uZWxfaW5mb19yZXN1bHRzIHJlcXVlc3RcbiIpOwotCQlyZXN1bHQgPSBwcmlzbTJtZ210X2NoYW5uZWxfaW5mb19yZXN1bHRzKHdsYW5kZXYsIG1zZyk7Ci0JCWJyZWFrOwogCS8qCiAJICogTGludXggc3BlY2lmaWMgbWVzc2FnZXMKIAkgKi8KQEAgLTYwMywxOCArNDM1LDExIEBACiAJCVdMQU5fTE9HX0RFQlVHKDIsIlJlY2VpdmVkIG1sbWUgYXV0b2pvaW4gcmVxdWVzdFxuIik7CiAJCXJlc3VsdCA9IHByaXNtMm1nbXRfYXV0b2pvaW4od2xhbmRldiwgbXNnKTsKIAkJYnJlYWs7Ci0JY2FzZSBESURtc2dfcDJyZXFfZW5hYmxlIDoKLQkJV0xBTl9MT0dfREVCVUcoMiwiUmVjZWl2ZWQgbWxtZSBlbmFibGUgcmVxdWVzdFxuIik7Ci0JCXJlc3VsdCA9IHByaXNtMm1nbXRfZW5hYmxlKHdsYW5kZXYsIG1zZyk7Ci0JCWJyZWFrOwogCWNhc2UgRElEbXNnX2xueHJlcV9jb21tc3F1YWxpdHk6IHsKIAkJcDgwMjExbXNnX2xueHJlcV9jb21tc3F1YWxpdHlfdCAqcXVhbG1zZzsKIAogCQlXTEFOX0xPR19ERUJVRygyLCJSZWNlaXZlZCBjb21tc3F1YWxpdHkgcmVxdWVzdFxuIik7CiAKLQkJaWYgKGh3LT5hcCkKLQkJCWJyZWFrOwotCiAJCXF1YWxtc2cgPSAocDgwMjExbXNnX2xueHJlcV9jb21tc3F1YWxpdHlfdCopIG1zZzsKIAogCQlxdWFsbXNnLT5saW5rLnN0YXR1cyA9IFA4MDIxMUVOVU1fbXNnaXRlbV9zdGF0dXNfZGF0YV9vazsKQEAgLTY1OSwxMCArNDg0LDEwIEBACiAqCXByb2Nlc3MgdGhyZWFkICAodXN1YWxseSkKICoJaW50ZXJydXB0CiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLVVJTlQzMiBwcmlzbTJzdGFfaWZzdGF0ZSh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIFVJTlQzMiBpZnN0YXRlKQordTMyIHByaXNtMnN0YV9pZnN0YXRlKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdTMyIGlmc3RhdGUpCiB7CiAgICAgICAgIGhmYTM4NHhfdCAgICAgICAgICAgICAgICpodyA9IChoZmEzODR4X3QgKil3bGFuZGV2LT5wcml2OwotCVVJTlQzMiAJCQlyZXN1bHQ7CisJdTMyIAkJCXJlc3VsdDsKIAlEQkZFTlRFUjsKIAogCXJlc3VsdCA9IFA4MDIxMUVOVU1fcmVzdWx0Y29kZV9pbXBsZW1lbnRhdGlvbl9mYWlsdXJlOwpAQCAtNjc5LDkgKzUwNCw2IEBACiAJCQkgKiBJbml0aWFsaXplIHRoZSBkZXZpY2UrZHJpdmVyIHN1ZmZpY2llbnRseQogCQkJICogZm9yIGZpcm13YXJlIGxvYWRpbmcuCiAJCQkgKi8KLSNpZiAoV0xBTl9IT1NUSUYgIT0gV0xBTl9VU0IpCi0JCQlyZXN1bHQ9aGZhMzg0eF9jbWRfaW5pdGlhbGl6ZShodyk7Ci0jZWxzZQogCQkJaWYgKChyZXN1bHQ9aGZhMzg0eF9kcnZyX3N0YXJ0KGh3KSkpIHsKIAkJCQlXTEFOX0xPR19FUlJPUigKIAkJCQkJImhmYTM4NHhfZHJ2cl9zdGFydCgpIGZhaWxlZCwiCkBAIC02OTEsNyArNTEzLDYgQEAKIAkJCQl3bGFuZGV2LT5tc2RzdGF0ZSA9IFdMQU5fTVNEX0hXUFJFU0VOVDsKIAkJCQlicmVhazsKIAkJCX0KLSNlbmRpZgogCQkJd2xhbmRldi0+bXNkc3RhdGUgPSBXTEFOX01TRF9GV0xPQUQ7CiAJCQlyZXN1bHQgPSBQODAyMTFFTlVNX3Jlc3VsdGNvZGVfc3VjY2VzczsKIAkJCWJyZWFrOwpAQCAtODQxLDggKzY2Miw4IEBACiB7CiAJaW50IAkJCXJlc3VsdCA9IDA7CiAgICAgICAgIGhmYTM4NHhfdCAgICAgICAgICAgICAgICpodyA9IChoZmEzODR4X3QgKil3bGFuZGV2LT5wcml2OwotCVVJTlQxNiAgICAgICAgICAgICAgICAgIHRlbXA7Ci0JVUlOVDgJCQlzbnVtW0hGQTM4NHhfUklEX05JQ1NFUklBTE5VTUJFUl9MRU5dOworCXUxNiAgICAgICAgICAgICAgICAgIHRlbXA7CisJdTgJCQlzbnVtW0hGQTM4NHhfUklEX05JQ1NFUklBTE5VTUJFUl9MRU5dOwogCWNoYXIJCQlwc3RyWyhIRkEzODR4X1JJRF9OSUNTRVJJQUxOVU1CRVJfTEVOICogNCkgKyAxXTsKIAogCURCRkVOVEVSOwpAQCAtOTA3LDIwICs3MjgsMjAgQEAKIAogCS8qIHN0cmlwIG91dCB0aGUgJ3NwZWNpYWwnIHZhcmlhbnQgYml0cyAqLwogCWh3LT5tbV9tb2RzID0gaHctPmlkZW50X3N0YV9mdy52YXJpYW50ICYgKEJJVDE0IHwgQklUMTUpOwotCWh3LT5pZGVudF9zdGFfZncudmFyaWFudCAmPSB+KChVSU5UMTYpKEJJVDE0IHwgQklUMTUpKTsKKwlody0+aWRlbnRfc3RhX2Z3LnZhcmlhbnQgJj0gfigodTE2KShCSVQxNCB8IEJJVDE1KSk7CiAKIAlpZiAgKCBody0+aWRlbnRfc3RhX2Z3LmlkID09IDB4MWYgKSB7Ci0JCWh3LT5hcCA9IDA7CiAJCVdMQU5fTE9HX0lORk8oCiAJCQkiaWRlbnQ6IHN0YSBmL3c6IGlkPTB4JTAyeCAlZC4lZC4lZFxuIiwKIAkJCWh3LT5pZGVudF9zdGFfZncuaWQsIGh3LT5pZGVudF9zdGFfZncubWFqb3IsCiAJCQlody0+aWRlbnRfc3RhX2Z3Lm1pbm9yLCBody0+aWRlbnRfc3RhX2Z3LnZhcmlhbnQpOwogCX0gZWxzZSB7Ci0JCWh3LT5hcCA9IDE7CiAJCVdMQU5fTE9HX0lORk8oCiAJCQkiaWRlbnQ6ICBhcCBmL3c6IGlkPTB4JTAyeCAlZC4lZC4lZFxuIiwKIAkJCWh3LT5pZGVudF9zdGFfZncuaWQsIGh3LT5pZGVudF9zdGFfZncubWFqb3IsCiAJCQlody0+aWRlbnRfc3RhX2Z3Lm1pbm9yLCBody0+aWRlbnRfc3RhX2Z3LnZhcmlhbnQpOworCQlXTEFOX0xPR19FUlJPUigiVW5zdXBwb3J0ZWQgVGVydGlhcnkgQVAgZmlybWVhcmUgbG9hZGVkIVxuIik7CisJCWdvdG8gZmFpbGVkOwogCX0KIAogCS8qIENvbXBhdGliaWxpdHkgcmFuZ2UsIE1vZGVtIHN1cHBsaWVyICovCkBAIC0xMTY4LDcgKzk4OSw3IEBACiAJaW50IHJlc3VsdCA9IDA7CiAJaGZhMzg0eF90ICAgICAgICAgICAgICAgKmh3ID0gKGhmYTM4NHhfdCAqKXdsYW5kZXYtPnByaXY7CiAKLQlVSU5UMTYgIHByb21pc2M7CisJdTE2ICBwcm9taXNjOwogCiAJREJGRU5URVI7CiAKQEAgLTExNzYsMTAgKzk5Nyw2IEBACiAJaWYgKCBody0+c3RhdGUgIT0gSEZBMzg0eF9TVEFURV9SVU5OSU5HICkKIAkJZ290byBleGl0OwogCi0JLyogSWYgd2UncmUgYW4gQVAsIGRvIG5vdGhpbmcgaGVyZSAqLwotCWlmIChody0+YXApCi0JCWdvdG8gZXhpdDsKLQogCWlmICggKGRldi0+ZmxhZ3MgJiAoSUZGX1BST01JU0MgfCBJRkZfQUxMTVVMVEkpKSAhPSAwICkKIAkJcHJvbWlzYyA9IFA4MDIxMUVOVU1fdHJ1dGhfdHJ1ZTsKIAllbHNlCkBAIC0xMjQ3LDkgKzEwNjQsOSBAQAogc3RhdGljIHZvaWQgcHJpc20yc3RhX2luZl90YWxsaWVzKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgaGZhMzg0eF9JbmZGcmFtZV90ICppbmYpCiB7CiAgICAgICAgIGhmYTM4NHhfdCAgICAgICAgICAgICAgICpodyA9IChoZmEzODR4X3QgKil3bGFuZGV2LT5wcml2OwotCVVJTlQxNgkJCSpzcmMxNjsKLQlVSU5UMzIJCQkqZHN0OwotCVVJTlQzMgkJCSpzcmMzMjsKKwl1MTYJCQkqc3JjMTY7CisJdTMyCQkJKmRzdDsKKwl1MzIJCQkqc3JjMzI7CiAJaW50CQkJaTsKIAlpbnQJCQljbnQ7CiAKQEAgLTEyNjAsMTUgKzEwNzcsMTUgQEAKIAkqKiByZWNvcmQgbGVuZ3RoIG9mIHRoZSBpbmZvIHJlY29yZC4KIAkqLwogCi0JY250ID0gc2l6ZW9mKGhmYTM4NHhfQ29tbVRhbGxpZXMzMl90KSAvIHNpemVvZihVSU5UMzIpOworCWNudCA9IHNpemVvZihoZmEzODR4X0NvbW1UYWxsaWVzMzJfdCkgLyBzaXplb2YodTMyKTsKIAlpZiAoaW5mLT5mcmFtZWxlbiA+IDIyKSB7Ci0JCWRzdCAgID0gKFVJTlQzMiAqKSAmaHctPnRhbGxpZXM7Ci0JCXNyYzMyID0gKFVJTlQzMiAqKSAmaW5mLT5pbmZvLmNvbW10YWxsaWVzMzI7CisJCWRzdCAgID0gKHUzMiAqKSAmaHctPnRhbGxpZXM7CisJCXNyYzMyID0gKHUzMiAqKSAmaW5mLT5pbmZvLmNvbW10YWxsaWVzMzI7CiAJCWZvciAoaSA9IDA7IGkgPCBjbnQ7IGkrKywgZHN0KyssIHNyYzMyKyspCiAJCQkqZHN0ICs9IGhmYTM4NHgyaG9zdF8zMigqc3JjMzIpOwogCX0gZWxzZSB7Ci0JCWRzdCAgID0gKFVJTlQzMiAqKSAmaHctPnRhbGxpZXM7Ci0JCXNyYzE2ID0gKFVJTlQxNiAqKSAmaW5mLT5pbmZvLmNvbW10YWxsaWVzMTY7CisJCWRzdCAgID0gKHUzMiAqKSAmaHctPnRhbGxpZXM7CisJCXNyYzE2ID0gKHUxNiAqKSAmaW5mLT5pbmZvLmNvbW10YWxsaWVzMTY7CiAJCWZvciAoaSA9IDA7IGkgPCBjbnQ7IGkrKywgZHN0KyssIHNyYzE2KyspCiAJCQkqZHN0ICs9IGhmYTM4NHgyaG9zdF8xNigqc3JjMTYpOwogCX0KQEAgLTEzMDgsNyArMTEyNSw3IEBACiAJREJGRU5URVI7CiAKIAkvKiBHZXQgdGhlIG51bWJlciBvZiByZXN1bHRzLCBmaXJzdCBpbiBieXRlcywgdGhlbiBpbiByZXN1bHRzICovCi0JbmJzcyA9IChpbmYtPmZyYW1lbGVuICogc2l6ZW9mKFVJTlQxNikpIC0KKwluYnNzID0gKGluZi0+ZnJhbWVsZW4gKiBzaXplb2YodTE2KSkgLQogCQlzaXplb2YoaW5mLT5pbmZvdHlwZSkgLQogCQlzaXplb2YoaW5mLT5pbmZvLnNjYW5yZXN1bHQuc2NhbnJlYXNvbik7CiAJbmJzcyAvPSBzaXplb2YoaGZhMzg0eF9TY2FuUmVzdWx0U3ViX3QpOwpAQCAtMTUwMCw3ICsxMzE3LDcgQEAKIAogCQkvKiBEb24ndCBjYWxsIHRoaXMgaW4gbW9uaXRvciBtb2RlICovCiAJCWlmICggd2xhbmRldi0+bmV0ZGV2LT50eXBlID09IEFSUEhSRF9FVEhFUiApIHsKLQkJCVVJTlQxNgkJCXBvcnRzdGF0dXM7CisJCQl1MTYJCQlwb3J0c3RhdHVzOwogCiAJCQlXTEFOX0xPR19JTkZPKCJsaW5rc3RhdHVzPUNPTk5FQ1RFRFxuIik7CiAKQEAgLTE4MzYsNyArMTY1Myw3IEBACiAJaGZhMzg0eF9hdXRoZW50aWNhdGVTdGF0aW9uX2RhdGFfdCAgcmVjOwogCiAJaW50ICAgIGksIGFkZGVkLCByZXN1bHQsIGNudDsKLQlVSU5UOCAgKmFkZHI7CisJdTggICphZGRyOwogCiAJREJGRU5URVI7CiAKQEAgLTIxNjMsNyArMTk4MCw3IEBACiAqIENhbGwgY29udGV4dDoKICoJaW50ZXJydXB0CiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXZvaWQgcHJpc20yc3RhX2V2X3R4ZXhjKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgVUlOVDE2IHN0YXR1cykKK3ZvaWQgcHJpc20yc3RhX2V2X3R4ZXhjKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdTE2IHN0YXR1cykKIHsKIAlEQkZFTlRFUjsKIApAQCAtMjE5MCw3ICsyMDA3LDcgQEAKICogQ2FsbCBjb250ZXh0OgogKglpbnRlcnJ1cHQKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdm9pZCBwcmlzbTJzdGFfZXZfdHgod2xhbmRldmljZV90ICp3bGFuZGV2LCBVSU5UMTYgc3RhdHVzKQordm9pZCBwcmlzbTJzdGFfZXZfdHgod2xhbmRldmljZV90ICp3bGFuZGV2LCB1MTYgc3RhdHVzKQogewogCURCRkVOVEVSOwogCVdMQU5fTE9HX0RFQlVHKDQsICJUeCBDb21wbGV0ZSwgc3RhdHVzPTB4JTA0eFxuIiwgc3RhdHVzKTsKQEAgLTIyNDcsNDcgKzIwNjQsMTIgQEAKIHsKIAlEQkZFTlRFUjsKIAotCXA4MDIxMW5ldGRldl93YWtlX3F1ZXVlKHdsYW5kZXYpOworCW5ldGlmX3dha2VfcXVldWUod2xhbmRldi0+bmV0ZGV2KTsKIAogCURCRkVYSVQ7CiAJcmV0dXJuOwogfQogCi0jaWYgKFdMQU5fSE9TVElGID09IFdMQU5fUExYIHx8IFdMQU5fSE9TVElGID09IFdMQU5fUENJKQotI2lmZGVmIENPTkZJR19QTQotc3RhdGljIGludCBwcmlzbTJzdGFfc3VzcGVuZF9wY2koc3RydWN0IHBjaV9kZXYgKnBkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKLXsKLSAgICAgICAJd2xhbmRldmljZV90CQkqd2xhbmRldjsKLQotCXdsYW5kZXYgPSAod2xhbmRldmljZV90ICopIHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQotCS8qIHJlc2V0IGhhcmR3YXJlICovCi0JaWYgKHdsYW5kZXYpIHsKLQkJcHJpc20yc3RhX2lmc3RhdGUod2xhbmRldiwgUDgwMjExRU5VTV9pZnN0YXRlX2Rpc2FibGUpOwotCQlwODAyMTFfc3VzcGVuZCh3bGFuZGV2KTsKLQl9Ci0KLQkvLyBjYWxsIGEgbmV0aWZfZGV2aWNlX2RldGFjaCh3bGFuZGV2LT5uZXRkZXYpID8KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHByaXNtMnN0YV9yZXN1bWVfcGNpIChzdHJ1Y3QgcGNpX2RldiAqcGRldikKLXsKLSAgICAgICAJd2xhbmRldmljZV90CQkqd2xhbmRldjsKLQotCXdsYW5kZXYgPSAod2xhbmRldmljZV90ICopIHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQotCWlmICh3bGFuZGV2KSB7Ci0JCXByaXNtMnN0YV9pZnN0YXRlKHdsYW5kZXYsIFA4MDIxMUVOVU1faWZzdGF0ZV9kaXNhYmxlKTsKLQkJcDgwMjExX3Jlc3VtZSh3bGFuZGV2KTsKLQl9Ci0KLSAgICAgICAgcmV0dXJuIDA7Ci19Ci0jZW5kaWYKLSNlbmRpZgotCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogY3JlYXRlX3dsYW4KICoKQEAgLTIzMzQsOSArMjExNiw2IEBACiAJd2xhbmRldi0+b3BlbiA9IHByaXNtMnN0YV9vcGVuOwogCXdsYW5kZXYtPmNsb3NlID0gcHJpc20yc3RhX2Nsb3NlOwogCXdsYW5kZXYtPnJlc2V0ID0gcHJpc20yc3RhX3Jlc2V0OwotI2lmZGVmIENPTkZJR19QUk9DX0ZTCi0Jd2xhbmRldi0+bnNkX3Byb2NfcmVhZCA9IHByaXNtMnN0YV9wcm9jX3JlYWQ7Ci0jZW5kaWYKIAl3bGFuZGV2LT50eGZyYW1lID0gcHJpc20yc3RhX3R4ZnJhbWU7CiAJd2xhbmRldi0+bWxtZXJlcXVlc3QgPSBwcmlzbTJzdGFfbWxtZXJlcXVlc3Q7CiAJd2xhbmRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gcHJpc20yc3RhX3NldG11bHRpY2FzdDsKQEAgLTIzNTEsNzUgKzIxMzAsNiBAQAogCXJldHVybiB3bGFuZGV2OwogfQogCi0jaWZkZWYgQ09ORklHX1BST0NfRlMKLXN0YXRpYyBpbnQKLXByaXNtMnN0YV9wcm9jX3JlYWQoCi0JY2hhcgkqcGFnZSwKLQljaGFyCSoqc3RhcnQsCi0Jb2ZmX3QJb2Zmc2V0LAotCWludAljb3VudCwKLQlpbnQJKmVvZiwKLQl2b2lkCSpkYXRhKQotewotCWNoYXIJICpwID0gcGFnZTsKLQl3bGFuZGV2aWNlX3QgKndsYW5kZXYgPSAod2xhbmRldmljZV90ICopIGRhdGE7Ci0JaGZhMzg0eF90ICpodyA9IChoZmEzODR4X3QgKikgd2xhbmRldi0+cHJpdjsKLQotCVVJTlQxNiBod3R5cGUgPSAwOwotCi0JREJGRU5URVI7Ci0JaWYgKG9mZnNldCAhPSAwKSB7Ci0JCSplb2YgPSAxOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JLy8gWFhYIDB4MDAwMSBmb3IgcHJpc20yLjUvMywgMHgwMDAwIGZvciBwcmlzbTIuCi0JaHd0eXBlID0gQklUMDsKLQotI2lmIChXTEFOX0hPU1RJRiAhPSBXTEFOX1VTQikKLQlpZiAoaHctPmlzcmFtMTYpCi0JCWh3dHlwZSB8PSBCSVQxOwotI2VuZGlmCi0KLSNpZiAoV0xBTl9IT1NUSUYgPT0gV0xBTl9QQ0kpCi0JaHd0eXBlIHw9IEJJVDI7Ci0jZW5kaWYKLQotI2RlZmluZSBQUklTTTJfQ1ZTX0lEICIkSWQ6IHByaXNtMnN0YS5jIDE4MjYgMjAwNy0wMy0xOSAxNTozNzowMFogcGl6emEgJCIKLQotCXAgKz0gc3ByaW50ZihwLCAiIyAlcyB2ZXJzaW9uICVzICglcykgJyVzJ1xuXG4iLAotCQkgICAgIGRldl9pbmZvLAotCQkgICAgIFdMQU5fUkVMRUFTRSwgV0xBTl9CVUlMRF9EQVRFLCBQUklTTTJfQ1ZTX0lEKTsKLQotCXAgKz0gc3ByaW50ZihwLCAiIyBuaWMgaC93OiBpZD0weCUwMnggJWQuJWQuJWRcbiIsCi0JCSAgICAgaHctPmlkZW50X25pYy5pZCwgaHctPmlkZW50X25pYy5tYWpvciwKLQkJICAgICBody0+aWRlbnRfbmljLm1pbm9yLCBody0+aWRlbnRfbmljLnZhcmlhbnQpOwotCi0JcCArPSBzcHJpbnRmKHAsICIjIHByaSBmL3c6IGlkPTB4JTAyeCAlZC4lZC4lZFxuIiwKLQkJICAgICBody0+aWRlbnRfcHJpX2Z3LmlkLCBody0+aWRlbnRfcHJpX2Z3Lm1ham9yLAotCQkgICAgIGh3LT5pZGVudF9wcmlfZncubWlub3IsIGh3LT5pZGVudF9wcmlfZncudmFyaWFudCk7Ci0KLQlpZiAoaHctPmlkZW50X3N0YV9mdy5pZCA9PSAweDFmKSB7Ci0JCXAgKz0gc3ByaW50ZihwLCAiIyBzdGEgZi93OiBpZD0weCUwMnggJWQuJWQuJWRcbiIsCi0JCQkgICAgIGh3LT5pZGVudF9zdGFfZncuaWQsIGh3LT5pZGVudF9zdGFfZncubWFqb3IsCi0JCQkgICAgIGh3LT5pZGVudF9zdGFfZncubWlub3IsIGh3LT5pZGVudF9zdGFfZncudmFyaWFudCk7Ci0JfSBlbHNlIHsKLQkJcCArPSBzcHJpbnRmKHAsICIjIGFwIGYvdzogaWQ9MHglMDJ4ICVkLiVkLiVkXG4iLAotCQkJICAgICBody0+aWRlbnRfc3RhX2Z3LmlkLCBody0+aWRlbnRfc3RhX2Z3Lm1ham9yLAotCQkJICAgICBody0+aWRlbnRfc3RhX2Z3Lm1pbm9yLCBody0+aWRlbnRfc3RhX2Z3LnZhcmlhbnQpOwotCX0KLQotI2lmIChXTEFOX0hPU1RJRiAhPSBXTEFOX1VTQikKLQlwICs9IHNwcmludGYocCwgIiMgaW5pdGlhbCBuaWMgaHcgdHlwZSwgbmVlZGVkIGZvciBTU0YgcmFtZGxcbiIpOwotCXAgKz0gc3ByaW50ZihwLCAiaW5pdG5pY2h3PSUwNHhcbiIsIGh3dHlwZSk7Ci0jZW5kaWYKLQotIGV4aXQ6Ci0JREJGRVhJVDsKLQlyZXR1cm4gKHAgLSBwYWdlKTsKLX0KLSNlbmRpZgotCiB2b2lkIHByaXNtMnN0YV9jb21tc3F1YWxfZGVmZXIoc3RydWN0IHdvcmtfc3RydWN0ICpkYXRhKQogewogCWhmYTM4NHhfdAkJKmh3ID0gY29udGFpbmVyX29mKGRhdGEsIHN0cnVjdCBoZmEzODR4LCBjb21tc3F1YWxfYmgpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcHJpc20ydXNiLmMgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wcmlzbTJ1c2IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjdiMWYyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcHJpc20ydXNiLmMKQEAgLTAsMCArMSwzMDIgQEAKKyNpbmNsdWRlICJoZmEzODR4X3VzYi5jIgorI2luY2x1ZGUgInByaXNtMm1nbXQuYyIKKyNpbmNsdWRlICJwcmlzbTJtaWIuYyIKKyNpbmNsdWRlICJwcmlzbTJzdGEuYyIKKworI2RlZmluZSBQUklTTV9VU0JfREVWSUNFKHZpZCwgcGlkLCBuYW1lKSBcCisgICAgICAgICAgIFVTQl9ERVZJQ0UodmlkLCBwaWQpLCAgXAorICAgICAgICAgICAuZHJpdmVyX2luZm8gPSAodW5zaWduZWQgbG9uZykgbmFtZQorCitzdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgdXNiX3ByaXNtX3RibFtdID0geworCXtQUklTTV9VU0JfREVWSUNFKDB4MDRiYiwgMHgwOTIyLCAiSU9EYXRhIEFpclBvcnQgV04tQjExL1VTQlMiKX0sCisJe1BSSVNNX1VTQl9ERVZJQ0UoMHgwN2FhLCAweDAwMTIsICJDb3JlZ2EgV2lyZWxlc3MgTEFOIFVTQiBTdGljay0xMSIpfSwKKwl7UFJJU01fVVNCX0RFVklDRSgweDA5YWEsIDB4MzY0MiwgIlByaXNtMi54IDExTWJwcyBXTEFOIFVTQiBBZGFwdGVyIil9LAorCXtQUklTTV9VU0JfREVWSUNFKDB4MTY2OCwgMHgwNDA4LCAiQWN0aW9udGVjIFByaXNtMi41IDExTWJwcyBXTEFOIFVTQiBBZGFwdGVyIil9LAorCXtQUklTTV9VU0JfREVWSUNFKDB4MTY2OCwgMHgwNDIxLCAiQWN0aW9udGVjIFByaXNtMi41IDExTWJwcyBXTEFOIFVTQiBBZGFwdGVyIil9LAorCXtQUklTTV9VU0JfREVWSUNFKDB4MTkxNSwgMHgyMjM2LCAiTGlua3N5cyBXVVNCMTF2My4wIDExTWJwcyBXTEFOIFVTQiBBZGFwdGVyIil9LAorCXtQUklTTV9VU0JfREVWSUNFKDB4MDY2YiwgMHgyMjEyLCAiTGlua3N5cyBXVVNCMTF2Mi41IDExTWJwcyBXTEFOIFVTQiBBZGFwdGVyIil9LAorCXtQUklTTV9VU0JfREVWSUNFKDB4MDY2YiwgMHgyMjEzLCAiTGlua3N5cyBXVVNCMTJ2MS4xIDExTWJwcyBXTEFOIFVTQiBBZGFwdGVyIil9LAorCXtQUklTTV9VU0JfREVWSUNFKDB4MDY3YywgMHgxMDIyLCAiU2llbWVucyBTcGVlZFN0cmVhbSAxMDIyIDExTWJwcyBXTEFOIFVTQiBBZGFwdGVyIil9LAorCXtQUklTTV9VU0JfREVWSUNFKDB4MDQ5ZiwgMHgwMDMzLCAiQ29tcGFxL0ludGVsIFcxMDAgUFJPL1dpcmVsZXNzIDExTWJwcyBtdWx0aXBvcnQgV0xBTiBBZGFwdGVyIil9LAorCXtQUklTTV9VU0JfREVWSUNFKDB4MDQxMSwgMHgwMDE2LCAiTWVsY28gV0xJLVVTQi1TMTEgMTFNYnBzIFdMQU4gQWRhcHRlciIpfSwKKwl7UFJJU01fVVNCX0RFVklDRSgweDA4ZGUsIDB4N2EwMSwgIlBSSVNNMjUgSUVFRSA4MDIuMTEgTWluaSBVU0IgQWRhcHRlciIpfSwKKwl7UFJJU01fVVNCX0RFVklDRSgweDgwODYsIDB4MTExMSwgIkludGVsIFBSTy9XaXJlbGVzcyAyMDExQiBMQU4gVVNCIEFkYXB0ZXIiKX0sCisJe1BSSVNNX1VTQl9ERVZJQ0UoMHgwZDhlLCAweDdhMDEsICJQUklTTTI1IElFRUUgODAyLjExIE1pbmkgVVNCIEFkYXB0ZXIiKX0sCisJe1BSSVNNX1VTQl9ERVZJQ0UoMHgwNDVlLCAweDAwNmUsICJNaWNyb3NvZnQgTU41MTAgV2lyZWxlc3MgVVNCIEFkYXB0ZXIiKX0sCisJe1BSSVNNX1VTQl9ERVZJQ0UoMHgwOTY3LCAweDAyMDQsICJBY2VyIFdhcnBsaW5rIFVTQiBBZGFwdGVyIil9LAorCXtQUklTTV9VU0JfREVWSUNFKDB4MGNkZSwgMHgwMDAyLCAiWi1Db20gNzI1LzcyNiBQcmlzbTIuNSBVU0IvVVNCIEludGVncmF0ZWQiKX0sCisJe1BSSVNNX1VTQl9ERVZJQ0UoMHgwY2RlLCAweDAwMDUsICJaLUNvbSBYbDczNSBXaXJlbGVzcyA4MDIuMTFiIFVTQiBBZGFwdGVyIil9LAorCXtQUklTTV9VU0JfREVWSUNFKDB4NDEzYywgMHg4MTAwLCAiRGVsbCBUcnVlTW9iaWxlIDExODAgV2lyZWxlc3MgVVNCIEFkYXB0ZXIiKX0sCisJe1BSSVNNX1VTQl9ERVZJQ0UoMHgwYjNiLCAweDE2MDEsICJBTExORVQgMDE5MyAxMU1icHMgV0xBTiBVU0IgQWRhcHRlciIpfSwKKwl7UFJJU01fVVNCX0RFVklDRSgweDBiM2IsIDB4MTYwMiwgIlp5WEVMIFp5QUlSIEIyMDAgV2lyZWxlc3MgVVNCIEFkYXB0ZXIiKX0sCisJe1BSSVNNX1VTQl9ERVZJQ0UoMHgwYmFmLCAweDAwZWIsICJVU1JvYm90aWNzIFVTUjExMjAgV2lyZWxlc3MgVVNCIEFkYXB0ZXIiKX0sCisJe1BSSVNNX1VTQl9ERVZJQ0UoMHgwNDExLCAweDAwMjcsICJNZWxjbyBXTEktVVNCLUtTMTFHIDExTWJwcyBXTEFOIEFkYXB0ZXIiKX0sCisgICAgICAgIHtQUklTTV9VU0JfREVWSUNFKDB4MDRmMSwgMHgzMDA5LCAiSlZDIE1QLVhQNzI1MCBCdWlsdGluIFVTQiBXTEFOIEFkYXB0ZXIiKX0sCisJe1BSSVNNX1VTQl9ERVZJQ0UoMHgwODQ2LCAweDQxMTAsICJOZXRHZWFyIE1BMTExIil9LAorICAgICAgICB7UFJJU01fVVNCX0RFVklDRSgweDAzZjMsIDB4MDAyMCwgIkFkYXB0ZWMgQVdOLTgwMjAgVVNCIFdMQU4gQWRhcHRlciIpfSwKKy8vCXtQUklTTV9VU0JfREVWSUNFKDB4MGFjZSwgMHgxMjAxLCAiWnlEQVMgWkQxMjAxIFdpcmVsZXNzIFVTQiBBZGFwdGVyIil9LAorCXtQUklTTV9VU0JfREVWSUNFKDB4MjgyMSwgMHgzMzAwLCAiQVNVUy1XTDE0MCBXaXJlbGVzcyBVU0IgQWRhcHRlciIpfSwKKwl7UFJJU01fVVNCX0RFVklDRSgweDIwMDEsIDB4MzcwMCwgIkRXTC0xMjIgV2lyZWxlc3MgVVNCIEFkYXB0ZXIiKX0sCisJe1BSSVNNX1VTQl9ERVZJQ0UoMHgyMDAxLCAweDM3MDIsICJEV0wtMTIwIFJldiBGIFdpcmVsZXNzIFVTQiBBZGFwdGVyIil9LAorCXtQUklTTV9VU0JfREVWSUNFKDB4NTBjMiwgMHg0MDEzLCAiQXZlcmF0ZWMgVVNCIFdMQU4gQWRhcHRlciIpfSwKKwl7UFJJU01fVVNCX0RFVklDRSgweDJjMDIsIDB4MTRlYSwgIlBsYW5leCBHVy1VUzExSCBXTEFOIFVTQiBBZGFwdGVyIil9LAorCXtQUklTTV9VU0JfREVWSUNFKDB4MTI0YSwgMHgxNjhiLCAiQWlydmFzdCBQUklTTTMgV0xBTiBVU0IgQWRhcHRlciIpfSwKKwl7UFJJU01fVVNCX0RFVklDRSgweDA4M2EsIDB4MzUwMywgIlQtU2ludXMgMTExIFVTQiBXTEFOIEFkYXB0ZXIiKX0sCisJe1BSSVNNX1VTQl9ERVZJQ0UoMHgyODIxLCAweDMzMDAsICJIYXdraW5nIEhpZ2hEQiBVU0IgQWRhcHRlciIpfSwKKwl7UFJJU01fVVNCX0RFVklDRSgweDA0MTEsIDB4MDA0NCwgIk1lbGNvIFdMSS1VU0ItS0IxMSAxMU1icHMgV0xBTiBBZGFwdGVyIil9LAorCXtQUklTTV9VU0JfREVWSUNFKDB4MTY2OCwgMHg2MTA2LCAiUk9QRVggRnJlZUxhbiA4MDIuMTFiIFVTQiBBZGFwdGVyIil9LAorCXtQUklTTV9VU0JfREVWSUNFKDB4MTI0YSwgMHg0MDE3LCAiUGhlZW5ldCBXTC01MDNJQSA4MDIuMTFiIFVTQiBBZGFwdGVyIil9LAorCXtQUklTTV9VU0JfREVWSUNFKDB4MGJiMiwgMHgwMzAyLCAiQW1iaXQgTWljcm9zeXN0ZW1zIENvcnAuIil9LAorCXtQUklTTV9VU0JfREVWSUNFKDB4OTAxNiwgMHgxODJkLCAiU2l0ZWNvbSBXTC0wMjIgODAyLjExYiBVU0IgQWRhcHRlciIpfSwKKwl7UFJJU01fVVNCX0RFVklDRSgweDA1NDMsIDB4MGYwMSwgIlZpZXdTb25pYyBBaXJzeW5jIFVTQiBBZGFwdGVyIDExTWJwcyAoUHJpc20yLjUpIil9LAorCXsgLyogdGVybWluYXRvciAqLyB9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHVzYiwgdXNiX3ByaXNtX3RibCk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKiBwcmlzbTJzdGFfcHJvYmVfdXNiCisqCisqIFByb2JlIHJvdXRpbmUgY2FsbGVkIGJ5IHRoZSBVU0Igc3Vic3lzdGVtLgorKgorKiBBcmd1bWVudHM6CisqCWRldgkJcHRyIHRvIHRoZSB1c2JfZGV2aWNlIHN0cnVjdAorKglpZm51bQkJaW50ZXJmYWNlIG51bWJlciBiZWluZyBvZmZlcmVkCisqCisqIFJldHVybnM6CisqCU5VTEwJCS0gd2UncmUgbm90IGNsYWltaW5nIHRoZSBkZXZpY2UraW50ZXJmYWNlCisqCW5vbi1OVUxMCS0gd2UgYXJlIGNsYWltaW5nIHRoZSBkZXZpY2UraW50ZXJmYWNlIGFuZAorKgkJCSAgdGhpcyBpcyBhIHB0ciB0byB0aGUgZGF0YSB3ZSB3YW50IGJhY2sKKyoJCQkgIHdoZW4gZGlzY29ubmVjdCBpcyBjYWxsZWQuCisqCisqIFNpZGUgZWZmZWN0czoKKyoKKyogQ2FsbCBjb250ZXh0OgorKglJJ20gbm90IHN1cmUsIGFzc3VtZSBpdCdzIGludGVycnVwdC4KKyoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIGludCBwcmlzbTJzdGFfcHJvYmVfdXNiKAorCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2UsCisJY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKQoreworCXN0cnVjdCB1c2JfZGV2aWNlICpkZXY7CisKKwl3bGFuZGV2aWNlX3QJKndsYW5kZXYgPSBOVUxMOworCWhmYTM4NHhfdAkqaHcgPSBOVUxMOworCWludCAgICAgICAgICAgICAgcmVzdWx0ID0gMDsKKworCURCRkVOVEVSOworCisJZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldihpbnRlcmZhY2UpOworCisJaWYgKCh3bGFuZGV2ID0gY3JlYXRlX3dsYW4oKSkgPT0gTlVMTCkgeworCQlXTEFOX0xPR19FUlJPUigiJXM6IE1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmUuXG4iLCBkZXZfaW5mbyk7CisJCXJlc3VsdCA9IC1FSU87CisJCWdvdG8gZmFpbGVkOworCX0KKwlodyA9IHdsYW5kZXYtPnByaXY7CisKKwlpZiAoIHdsYW5fc2V0dXAod2xhbmRldikgIT0gMCApIHsKKwkJV0xBTl9MT0dfRVJST1IoIiVzOiB3bGFuX3NldHVwKCkgZmFpbGVkLlxuIiwgZGV2X2luZm8pOworCQlyZXN1bHQgPSAtRUlPOworCQlnb3RvIGZhaWxlZDsKKwl9CisKKwkvKiBJbml0aWFsaXplIHRoZSBodyBkYXRhICovCisJaGZhMzg0eF9jcmVhdGUoaHcsIGRldik7CisJaHctPndsYW5kZXYgPSB3bGFuZGV2OworCisJLyogUmVnaXN0ZXIgdGhlIHdsYW5kZXYsIHRoaXMgZ2V0cyB1cyBhIG5hbWUgYW5kIHJlZ2lzdGVycyB0aGUKKwkgKiBsaW51eCBuZXRkZXZpY2UuCisJICovCisJU0VUX05FVERFVl9ERVYod2xhbmRldi0+bmV0ZGV2LCAmKGludGVyZmFjZS0+ZGV2KSk7CisKKwkvKiBEbyBhIGNoaXAtbGV2ZWwgcmVzZXQgb24gdGhlIE1BQyAqLworCWlmIChwcmlzbTJfZG9yZXNldCkgeworCQlyZXN1bHQgPSBoZmEzODR4X2NvcmVyZXNldChodywKKwkJCQlwcmlzbTJfcmVzZXRfaG9sZHRpbWUsCisJCQkJcHJpc20yX3Jlc2V0X3NldHRsZXRpbWUsIDApOworCQlpZiAocmVzdWx0ICE9IDApIHsKKwkJCXVucmVnaXN0ZXJfd2xhbmRldih3bGFuZGV2KTsKKwkJCWhmYTM4NHhfZGVzdHJveShodyk7CisJCQlyZXN1bHQgPSAtRUlPOworCQkJV0xBTl9MT0dfRVJST1IoCisJCQkJIiVzOiBoZmEzODR4X2NvcmVyZXNldCgpIGZhaWxlZC5cbiIsCisJCQkJZGV2X2luZm8pOworCQkJZ290byBmYWlsZWQ7CisJCX0KKwl9CisKKwl1c2JfZ2V0X2RldihkZXYpOworCisJd2xhbmRldi0+bXNkc3RhdGUgPSBXTEFOX01TRF9IV1BSRVNFTlQ7CisKKyAgICAgICAgaWYgKCByZWdpc3Rlcl93bGFuZGV2KHdsYW5kZXYpICE9IDAgKSB7CisJCVdMQU5fTE9HX0VSUk9SKCIlczogcmVnaXN0ZXJfd2xhbmRldigpIGZhaWxlZC5cbiIsIGRldl9pbmZvKTsKKwkJcmVzdWx0ID0gLUVJTzsKKwkJZ290byBmYWlsZWQ7CisgICAgICAgIH0KKworLyogZW5hYmxlIHRoZSBjYXJkICovCisJcHJpc20yc3RhX2lmc3RhdGUod2xhbmRldiwgUDgwMjExRU5VTV9pZnN0YXRlX2VuYWJsZSk7CisKKwlnb3RvIGRvbmU7CisKKyBmYWlsZWQ6CisJaWYgKHdsYW5kZXYpCWtmcmVlKHdsYW5kZXYpOworCWlmIChodykJCWtmcmVlKGh3KTsKKwl3bGFuZGV2ID0gTlVMTDsKKworIGRvbmU6CisJREJGRVhJVDsKKworCXVzYl9zZXRfaW50ZmRhdGEoaW50ZXJmYWNlLCB3bGFuZGV2KTsKKwlyZXR1cm4gcmVzdWx0OworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKiBwcmlzbTJzdGFfZGlzY29ubmVjdF91c2IKKyoKKyogQ2FsbGVkIHdoZW4gYSBkZXZpY2UgcHJldmlvdXNseSBjbGFpbWVkIGJ5IHByb2JlIGlzIHJlbW92ZWQKKyogZnJvbSB0aGUgVVNCLgorKgorKiBBcmd1bWVudHM6CisqCWRldgkJcHRyIHRvIHRoZSB1c2JfZGV2aWNlIHN0cnVjdAorKglwdHIJCXB0ciByZXR1cm5lZCBieSBwcm9iZSgpIHdoZW4gdGhlIGRldmljZQorKiAgICAgICAgICAgICAgICAgICAgICAgd2FzIGNsYWltZWQuCisqCisqIFJldHVybnM6CisqCU5vdGhpbmcKKyoKKyogU2lkZSBlZmZlY3RzOgorKgorKiBDYWxsIGNvbnRleHQ6CisqCXByb2Nlc3MKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIHZvaWQKK3ByaXNtMnN0YV9kaXNjb25uZWN0X3VzYihzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZXJmYWNlKQoreworCXdsYW5kZXZpY2VfdAkJKndsYW5kZXY7CisKKyAgICAgICAgREJGRU5URVI7CisKKwl3bGFuZGV2ID0gKHdsYW5kZXZpY2VfdCAqKSB1c2JfZ2V0X2ludGZkYXRhKGludGVyZmFjZSk7CisKKwlpZiAoIHdsYW5kZXYgIT0gTlVMTCApIHsKKwkJTElTVF9IRUFEKGNsZWFubGlzdCk7CisJCXN0cnVjdCBsaXN0X2hlYWQJKmVudHJ5OworCQlzdHJ1Y3QgbGlzdF9oZWFkCSp0ZW1wOworCQl1bnNpZ25lZCBsb25nCQlmbGFnczsKKworCQloZmEzODR4X3QJCSpodyA9IHdsYW5kZXYtPnByaXY7CisKKwkJaWYgKCFodykKKwkJCWdvdG8gZXhpdDsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaHctPmN0bHhxLmxvY2ssIGZsYWdzKTsKKworCQlwODAyMTFuZXRkZXZfaHdyZW1vdmVkKHdsYW5kZXYpOworCQlsaXN0X3NwbGljZV9pbml0KCZody0+Y3RseHEucmVhcGFibGUsICZjbGVhbmxpc3QpOworCQlsaXN0X3NwbGljZV9pbml0KCZody0+Y3RseHEuY29tcGxldGluZywgJmNsZWFubGlzdCk7CisJCWxpc3Rfc3BsaWNlX2luaXQoJmh3LT5jdGx4cS5wZW5kaW5nLCAmY2xlYW5saXN0KTsKKwkJbGlzdF9zcGxpY2VfaW5pdCgmaHctPmN0bHhxLmFjdGl2ZSwgJmNsZWFubGlzdCk7CisKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHctPmN0bHhxLmxvY2ssIGZsYWdzKTsKKworCQkvKiBUaGVyZSdzIG5vIGhhcmR3YXJlIHRvIHNodXRkb3duLCBidXQgdGhlIGRyaXZlcgorCQkgKiBtaWdodCBoYXZlIHNvbWUgdGFza3Mgb3IgdGFza2xldHMgdGhhdCBtdXN0IGJlCisJCSAqIHN0b3BwZWQgYmVmb3JlIHdlIGNhbiB0ZWFyIGV2ZXJ5dGhpbmcgZG93bi4KKwkJICovCisJCXByaXNtMnN0YV9pZnN0YXRlKHdsYW5kZXYsIFA4MDIxMUVOVU1faWZzdGF0ZV9kaXNhYmxlKTsKKworCQlkZWxfc2luZ2xlc2hvdF90aW1lcl9zeW5jKCZody0+dGhyb3R0bGUpOworCQlkZWxfc2luZ2xlc2hvdF90aW1lcl9zeW5jKCZody0+cmVxdGltZXIpOworCQlkZWxfc2luZ2xlc2hvdF90aW1lcl9zeW5jKCZody0+cmVzcHRpbWVyKTsKKworCQkvKiBVbmxpbmsgYWxsIHRoZSBVUkJzLiBUaGlzICJyZW1vdmVzIHRoZSB3aGVlbHMiCisJCSAqIGZyb20gdGhlIGVudGlyZSBDVExYIGhhbmRsaW5nIG1lY2hhbmlzbS4KKwkJICovCisJCXVzYl9raWxsX3VyYigmaHctPnJ4X3VyYik7CisJCXVzYl9raWxsX3VyYigmaHctPnR4X3VyYik7CisJCXVzYl9raWxsX3VyYigmaHctPmN0bHhfdXJiKTsKKworCQl0YXNrbGV0X2tpbGwoJmh3LT5jb21wbGV0aW9uX2JoKTsKKwkJdGFza2xldF9raWxsKCZody0+cmVhcGVyX2JoKTsKKworCQlmbHVzaF9zY2hlZHVsZWRfd29yaygpOworCisJCS8qIE5vdyB3ZSBjb21wbGV0ZSBhbnkgb3V0c3RhbmRpbmcgY29tbWFuZHMKKwkJICogYW5kIHRlbGwgZXZlcnlvbmUgd2hvIGlzIHdhaXRpbmcgZm9yIHRoZWlyCisJCSAqIHJlc3BvbnNlcyB0aGF0IHdlIGhhdmUgc2h1dCBkb3duLgorCQkgKi8KKwkJbGlzdF9mb3JfZWFjaChlbnRyeSwgJmNsZWFubGlzdCkgeworCQkJaGZhMzg0eF91c2JjdGx4X3QJKmN0bHg7CisKKwkJCWN0bHggPSBsaXN0X2VudHJ5KGVudHJ5LCBoZmEzODR4X3VzYmN0bHhfdCwgbGlzdCk7CisJCQljb21wbGV0ZSgmY3RseC0+ZG9uZSk7CisJCX0KKworCQkvKiBHaXZlIGFueSBvdXRzdGFuZGluZyBzeW5jaHJvbm91cyBjb21tYW5kcworCQkgKiBhIGNoYW5jZSB0byBjb21wbGV0ZS4gQWxsIHRoZXkgbmVlZCB0byBkbworCQkgKiBpcyAid2FrZSB1cCIsIHNvIHRoYXQncyBlYXN5LgorCQkgKiAoSSdkIGxpa2UgYSBiZXR0ZXIgd2F5IHRvIGRvIHRoaXMsIHJlYWxseS4pCisJCSAqLworCQltc2xlZXAoMTAwKTsKKworCQkvKiBOb3cgZGVsZXRlIHRoZSBDVExYcywgYmVjYXVzZSBuby1vbmUgZWxzZSBjYW4gbm93LiAqLworCQlsaXN0X2Zvcl9lYWNoX3NhZmUoZW50cnksIHRlbXAsICZjbGVhbmxpc3QpIHsKKwkJCWhmYTM4NHhfdXNiY3RseF90ICpjdGx4OworCisJCQljdGx4ID0gbGlzdF9lbnRyeShlbnRyeSwgaGZhMzg0eF91c2JjdGx4X3QsIGxpc3QpOworCQkJa2ZyZWUoY3RseCk7CisJCX0KKworCQkvKiBVbmhvb2sgdGhlIHdsYW5kZXYgKi8KKwkJdW5yZWdpc3Rlcl93bGFuZGV2KHdsYW5kZXYpOworCQl3bGFuX3Vuc2V0dXAod2xhbmRldik7CisKKwkJdXNiX3B1dF9kZXYoaHctPnVzYik7CisKKwkJaGZhMzg0eF9kZXN0cm95KGh3KTsKKwkJa2ZyZWUoaHcpOworCisJCWtmcmVlKHdsYW5kZXYpOworCX0KKworIGV4aXQ6CisKKwl1c2Jfc2V0X2ludGZkYXRhKGludGVyZmFjZSwgTlVMTCk7CisJREJGRVhJVDsKK30KKworCitzdGF0aWMgc3RydWN0IHVzYl9kcml2ZXIgcHJpc20yX3VzYl9kcml2ZXIgPSB7CisJLm5hbWUgPSAicHJpc20yX3VzYiIsCisJLnByb2JlID0gcHJpc20yc3RhX3Byb2JlX3VzYiwKKwkuZGlzY29ubmVjdCA9IHByaXNtMnN0YV9kaXNjb25uZWN0X3VzYiwKKwkuaWRfdGFibGUgPSB1c2JfcHJpc21fdGJsLAorCS8qIGZvcHMsIG1pbm9yPyAqLworfTsKKworc3RhdGljIGludCBfX2luaXQgcHJpc20ydXNiX2luaXQodm9pZCkKK3sKKyAgICAgICAgREJGRU5URVI7CisKKwkvKiBUaGlzIGNhbGwgd2lsbCByZXN1bHQgaW4gY2FsbHMgdG8gcHJpc20yc3RhX3Byb2JlX3VzYi4gKi8KKwlyZXR1cm4gdXNiX3JlZ2lzdGVyKCZwcmlzbTJfdXNiX2RyaXZlcik7CisKKwlEQkZFWElUOworfTsKKworc3RhdGljIHZvaWQgX19leGl0IHByaXNtMnVzYl9jbGVhbnVwKHZvaWQpCit7CisgICAgICAgIERCRkVOVEVSOworCisJdXNiX2RlcmVnaXN0ZXIoJnByaXNtMl91c2JfZHJpdmVyKTsKKworCURCRkVYSVQ7Cit9OworCittb2R1bGVfaW5pdChwcmlzbTJ1c2JfaW5pdCk7Cittb2R1bGVfZXhpdChwcmlzbTJ1c2JfY2xlYW51cCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy92ZXJzaW9uLmggYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy92ZXJzaW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwNWY4ODIuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvdmVyc2lvbi5oCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyogc3JjL2luY2x1ZGUvd2xhbi92ZXJzaW9uLmgKLSoKLSoKLSogQ29weXJpZ2h0IChDKSAxOTk5IEFic29sdXRlVmFsdWUgU3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSoKLSogbGludXgtd2xhbgotKgotKiAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljCi0qICAgTGljZW5zZSBWZXJzaW9uIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8KLSoKLSogICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMKLSogICBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZQotKiAgIHRlcm1zIG9mIHRoZSBHTlUgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyICh0aGUgIkdQTCIpLCBpbiB3aGljaAotKiAgIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkIG9mIHRoZQotKiAgIGFib3ZlLiAgSWYgeW91IHdpc2ggdG8gYWxsb3cgdGhlIHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlCi0qICAgb25seSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdQTCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0byB1c2UKLSogICB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSBNUEwsIGluZGljYXRlIHlvdXIgZGVjaXNpb24KLSogICBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQotKiAgIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwuICBJZiB5b3UgZG8gbm90IGRlbGV0ZQotKiAgIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzCi0qICAgZmlsZSB1bmRlciBlaXRoZXIgdGhlIE1QTCBvciB0aGUgR1BMLgotKgotKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKgotKiBJbnF1aXJpZXMgcmVnYXJkaW5nIHRoZSBsaW51eC13bGFuIE9wZW4gU291cmNlIHByb2plY3QgY2FuIGJlCi0qIG1hZGUgZGlyZWN0bHkgdG86Ci0qCi0qIEFic29sdXRlVmFsdWUgU3lzdGVtcyBJbmMuCi0qIGluZm9AbGludXgtd2xhbi5jb20KLSogaHR0cDovL3d3dy5saW51eC13bGFuLmNvbQotKgotKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKgotKiBQb3J0aW9ucyBvZiB0aGUgZGV2ZWxvcG1lbnQgb2YgdGhpcyBzb2Z0d2FyZSB3ZXJlIGZ1bmRlZCBieQotKiBJbnRlcnNpbCBDb3Jwb3JhdGlvbiBhcyBwYXJ0IG9mIFBSSVNNKFIpIGNoaXBzZXQgcHJvZHVjdCBkZXZlbG9wbWVudC4KLSoKLSogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSovCi0jaWZuZGVmIF9XTEFOX1ZFUlNJT05fSAotI2RlZmluZSBfV0xBTl9WRVJTSU9OX0gKLSNpZm5kZWYgS0VSTkVMX1ZFUlNJT04KLSNkZWZpbmUgS0VSTkVMX1ZFUlNJT04oYSxiLGMpICgoKGEpIDw8IDE2KSArICgoYikgPDwgOCkgKyAoYykpCi0jZW5kaWYKLQotLyogV0xBTl9IT1NUSUYgKGdlbmVyYWxseSBzZXQgb24gdGhlIGNvbW1hbmQgbGluZSwgbm90IGRldGVjdGVkKSAqLwotI2RlZmluZSBXTEFOX05PTkUgICAgICAgICAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgV0xBTl9QQ01DSUEgICAgICAgICAgICAgICAgICAgICAxCi0jZGVmaW5lIFdMQU5fSVNBICAgICAgICAgICAgICAgICAgICAgICAgMgotI2RlZmluZSBXTEFOX1BDSSAgICAgICAgICAgICAgICAgICAgICAgIDMKLSNkZWZpbmUgV0xBTl9VU0IgICAgICAgICAgICAgICAgICAgICAgICA0Ci0jZGVmaW5lIFdMQU5fUExYICAgICAgICAgICAgICAgICAgICAgICAgNQotI2RlZmluZSBXTEFOX1NMQVZFICAgICAgICAgICAgICAgICAgICAgIDYKLSNkZWZpbmUgV0xBTl9SRUxFQVNFCSIwLjIuOCIKLSNkZWZpbmUgV0xBTl9SRUxFQVNFX0NPREUgMHgwMDAyMDgKLSNkZWZpbmUgV0xBTl9CVUlMRF9EQVRFICJUaHUgT2N0ICAyIDExOjA0OjQyIFBEVCAyMDA4IgotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3dsYW5fY29tcGF0LmggYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy93bGFuX2NvbXBhdC5oCmluZGV4IDU5ZGZhOGYuLjhiOGE1MTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3dsYW5fY29tcGF0LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvd2xhbl9jb21wYXQuaApAQCAtNDksMTE0ICs0OSw2IEBACiAjZGVmaW5lIF9XTEFOX0NPTVBBVF9ICiAKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0vKi0tLS0tLSBFc3RhYmxpc2ggUGxhdGZvcm0gSWRlbnRpdHkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLS8qIEtleSBtYWNyb3M6ICovCi0vKiBXTEFOX0NQVV9GQU1JTFkgKi8KLQkjZGVmaW5lIFdMQU5fSXg4NgkJCTEKLQkjZGVmaW5lIFdMQU5fUFBDCQkJMgotCSNkZWZpbmUgV0xBTl9JeDk2CQkJMwotCSNkZWZpbmUgV0xBTl9BUk0JCQk0Ci0JI2RlZmluZSBXTEFOX0FMUEhBCQkJNQotCSNkZWZpbmUgV0xBTl9NSVBTCQkJNgotCSNkZWZpbmUgV0xBTl9IUFBBCQkJNwotCSNkZWZpbmUgV0xBTl9TUEFSQwkJCTgKLQkjZGVmaW5lIFdMQU5fU0ggICAgCQkJOQotCSNkZWZpbmUgV0xBTl94ODZfNjQgICAgICAgICAgICAgICAgICAgICAxMAotLyogV0xBTl9TWVNBUkNIICovCi0JI2RlZmluZSBXTEFOX1BDQVQJCQkxCi0JI2RlZmluZSBXTEFOX01CWAkJCTIKLQkjZGVmaW5lIFdMQU5fUlBYCQkJMwotCSNkZWZpbmUgV0xBTl9MV0FSQ0gJCQk0Ci0JI2RlZmluZSBXTEFOX1BNQUMJCQk1Ci0JI2RlZmluZSBXTEFOX1NLSUZGCQkJNgotCSNkZWZpbmUgV0xBTl9CSVRTWQkJCTcKLQkjZGVmaW5lIFdMQU5fQUxQSEFBUkNICQkJNwotCSNkZWZpbmUgV0xBTl9NSVBTQVJDSAkJCTkKLQkjZGVmaW5lIFdMQU5fSFBQQUFSQ0gJCQkxMAotCSNkZWZpbmUgV0xBTl9TUEFSQ0FSQ0gJCQkxMQotCSNkZWZpbmUgV0xBTl9TSEFSQ0ggICAJCQkxMgotCi0vKiBOb3RlOiB0aGUgUExYIEhPU1RJRiBhYm92ZSByZWZlcnMgdG8gc29tZSB2ZW5kb3JzIGltcGxlbWVudGF0aW9ucyBmb3IgKi8KLS8qICAgICAgIFBDSS4gIEl0J3MgYSBQTFggY2hpcCB0aGF0IGlzIGEgUENJIHRvIFBDTUNJQSBhZGFwdGVyLCBidXQgaXQgICAqLwotLyogICAgICAgaXNuJ3QgYSByZWFsIFBDTUNJQSBob3N0IGludGVyZmFjZSBhZGFwdGVyIHByb3ZpZGluZyBhbGwgdGhlICAgICovCi0vKiAgICAgICBjYXJkJnNvY2tldCBzZXJ2aWNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotI2lmIChkZWZpbmVkKENPTkZJR19QUEMpIHx8IGRlZmluZWQoQ09ORklHXzh4eCkgfHwgZGVmaW5lZChfX3Bvd2VycGNfXykpCi0jaWZuZGVmIF9fcHBjX18KLSNkZWZpbmUgX19wcGNfXwotI2VuZGlmCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoX19LRVJORUxfXykKLQotI2lmbmRlZiBBVVRPQ09ORl9JTkNMVURFRAotI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKF9feDg2XzY0X18pCi0JI2RlZmluZSBXTEFOX0NQVV9GQU1JTFkJCVdMQU5feDg2XzY0Ci0JI2RlZmluZSBXTEFOX1NZU0FSQ0gJCVdMQU5fUENBVAotI2VsaWYgZGVmaW5lZChfX2kzODZfXykgfHwgZGVmaW5lZChfX2k0ODZfXykgfHwgZGVmaW5lZChfX2k1ODZfXykgfHwgZGVmaW5lZChfX2k2ODZfXykKLQkjZGVmaW5lIFdMQU5fQ1BVX0ZBTUlMWQkJV0xBTl9JeDg2Ci0JI2RlZmluZSBXTEFOX1NZU0FSQ0gJCVdMQU5fUENBVAotI2VsaWYgZGVmaW5lZChfX3BwY19fKQotCSNkZWZpbmUgV0xBTl9DUFVfRkFNSUxZCQlXTEFOX1BQQwotCSNpZiBkZWZpbmVkKENPTkZJR19NQlgpCi0JCSNkZWZpbmUgV0xBTl9TWVNBUkNICVdMQU5fTUJYCi0JI2VsaWYgZGVmaW5lZChDT05GSUdfUlBYTElURSkKLQkJI2RlZmluZSBXTEFOX1NZU0FSQ0gJV0xBTl9SUFgKLQkjZWxpZiBkZWZpbmVkKENPTkZJR19SUFhDTEFTU0lDKQotCQkjZGVmaW5lIFdMQU5fU1lTQVJDSAlXTEFOX1JQWAotCSNlbHNlCi0JCSNkZWZpbmUgV0xBTl9TWVNBUkNICVdMQU5fUE1BQwotCSNlbmRpZgotI2VsaWYgZGVmaW5lZChfX2FybV9fKQotCSNkZWZpbmUgV0xBTl9DUFVfRkFNSUxZCQlXTEFOX0FSTQotCSNkZWZpbmUgV0xBTl9TWVNBUkNICQlXTEFOX1NLSUZGCi0jZWxpZiBkZWZpbmVkKF9fYWxwaGFfXykKLQkjZGVmaW5lIFdMQU5fQ1BVX0ZBTUlMWQkJV0xBTl9BTFBIQQotCSNkZWZpbmUgV0xBTl9TWVNBUkNICQlXTEFOX0FMUEhBQVJDSAotI2VsaWYgZGVmaW5lZChfX21pcHNfXykKLQkjZGVmaW5lIFdMQU5fQ1BVX0ZBTUlMWQkJV0xBTl9NSVBTCi0JI2RlZmluZSBXTEFOX1NZU0FSQ0gJCVdMQU5fTUlQU0FSQ0gKLSNlbGlmIGRlZmluZWQoX19ocHBhX18pCi0JI2RlZmluZSBXTEFOX0NQVV9GQU1JTFkJCVdMQU5fSFBQQQotCSNkZWZpbmUgV0xBTl9TWVNBUkNICQlXTEFOX0hQUEFBUkNICi0jZWxpZiBkZWZpbmVkKF9fc3BhcmNfXykKLSAgICAgICAgI2RlZmluZSBXTEFOX0NQVV9GQU1JTFkgICAgICAgICBXTEFOX1NQQVJDCi0gICAgICAgICNkZWZpbmUgV0xBTl9TWVNBUkNIICAgICAgICAgICAgV0xBTl9TUEFSQwotI2VsaWYgZGVmaW5lZChfX3NoX18pCi0gICAgICAgICNkZWZpbmUgV0xBTl9DUFVfRkFNSUxZICAgICAgICAgV0xBTl9TSAotICAgICAgICAjZGVmaW5lIFdMQU5fU1lTQVJDSCAgICAgICAgICAgIFdMQU5fU0hBUkNICi0gICAgICAgICNpZm5kZWYgX19MSVRUTEVfRU5ESUFOX18KLSAgICAgICAgI2RlZmluZSBfX0xJVFRMRV9FTkRJQU5fXwotICAgICAgICAjZW5kaWYKLSNlbHNlCi0JI2Vycm9yICJObyBDUFUgaWRlbnRpZmllZCEiCi0jZW5kaWYKLSNlbmRpZiAvKiBfX0tFUk5FTF9fICovCi0KLS8qCi0gICBTb21lIGJpZyBlbmRpYW4gbWFjaGluZXMgaW1wbGljaXRseSBkbyBhbGwgSS9PIGluIGxpdHRsZSBlbmRpYW4gbW9kZS4KLQotICAgSW4gcGFydGljdWxhcjoKLSAgICAgICAgICBMaW51eC9QUEMgb24gUG93ZXJNYWNzIChQQ0kpCi0JICBBcm0vSW50ZWwgWHNjYWxlIChQQ0kpCi0KLSAgIFRoaXMgbWF5IGFsc28gYWZmZWN0IFBMWCBib2FyZHMgYW5kIG90aGVyIEJFICZ8IFBQQyBwbGF0Zm9ybXM7Ci0gICBhcyBuZXcgb25lcyBhcmUgZGlzY292ZXJlZCwgYWRkIHRoZW0gYmVsb3cuCi0qLwotCi0jaWYgZGVmaW5lZChXTEFOX0hPU1RJRikKLSNpZiAoKFdMQU5fSE9TVElGID09IFdMQU5fUENJKSB8fCAoV0xBTl9IT1NUSUYgPT0gV0xBTl9QTFgpKQotI2lmICgoV0xBTl9TWVNBUkNIID09IFdMQU5fU0tJRkYpIHx8IChXTEFOX1NZU0FSQ0ggPT0gV0xBTl9QTUFDKSB8fCAoV0xBTl9TWVNBUkNIID09IFdMQU5fU1BBUkMpKQotI2RlZmluZSBSRVZFUlNFX0VORElBTgotI2VuZGlmCi0jZW5kaWYKLSNlbmRpZgotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogLyotLS0tLS0gQml0IHNldHRpbmdzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAKQEAgLTE5MywzMCArODUsNiBAQAogI2RlZmluZSBCSVQzMAkweDQwMDAwMDAwCiAjZGVmaW5lIEJJVDMxCTB4ODAwMDAwMDAKIAotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0KLXR5cGVkZWYgdV9pbnQ4X3QJVUlOVDg7Ci10eXBlZGVmIHVfaW50MTZfdAlVSU5UMTY7Ci10eXBlZGVmIHVfaW50MzJfdAlVSU5UMzI7Ci0KLXR5cGVkZWYgaW50OF90CQlJTlQ4OwotdHlwZWRlZiBpbnQxNl90CQlJTlQxNjsKLXR5cGVkZWYgaW50MzJfdAkJSU5UMzI7Ci0KLXR5cGVkZWYgdW5zaWduZWQgaW50ICAgIFVJTlQ7Ci10eXBlZGVmIHNpZ25lZCBpbnQgICAgICBJTlQ7Ci0KLXR5cGVkZWYgdV9pbnQ2NF90CVVJTlQ2NDsKLXR5cGVkZWYgaW50NjRfdAkJSU5UNjQ7Ci0KLSNkZWZpbmUgVUlOVDhfTUFYCSgweGZmVUwpCi0jZGVmaW5lIFVJTlQxNl9NQVgJKDB4ZmZmZlVMKQotI2RlZmluZSBVSU5UMzJfTUFYCSgweGZmZmZmZmZmVUwpCi0KLSNkZWZpbmUgSU5UOF9NQVgJKDB4N2ZMKQotI2RlZmluZSBJTlQxNl9NQVgJKDB4N2ZmZkwpCi0jZGVmaW5lIElOVDMyX01BWAkoMHg3ZmZmZmZmZkwpCi0KIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAvKi0tLS0tLSBDb21waWxlciBQb3J0YWJpbGl0eSBNYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KQEAgLTIzMCwyMCArOTgsOSBAQAogI2RlZmluZSBXTEFOX0RCVkFSCXdsYW5fZGVidWcKICNlbmRpZgogCi0jaWZuZGVmIEtFUk5FTF9WRVJTSU9OCi0jZGVmaW5lIEtFUk5FTF9WRVJTSU9OKGEsYixjKSAoKChhKSA8PCAxNikgKyAoKGIpIDw8IDgpICsgKGMpKQotI2VuZGlmCisjZGVmaW5lIFdMQU5fUkVMRUFTRQkiMC4zLjAtbGttbCIKIAotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDApKQotIyAgaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNiw4KSkKLSMgICAgaW5jbHVkZSA8bGludXgvaGFyZGlycS5oPgotIyAgZWxzZQotIyAgICBpbmNsdWRlIDxhc20vaGFyZGlycS5oPgotIyAgZW5kaWYKLSNlbGlmIGRlZmluZWQoX19LRVJORUxfXykKLSMgIGRlZmluZSBQUkVFTVBUX01BU0sgICgweDAwMDAwMEZGVUwpCi0jICBkZWZpbmUgcHJlZW1wdF9jb3VudCgpICgwVUwpCi0jZW5kaWYKKyNpbmNsdWRlIDxsaW51eC9oYXJkaXJxLmg+CiAKICNkZWZpbmUgV0xBTl9MT0dfRVJST1IoeCxhcmdzLi4uKSBwcmludGsoS0VSTl9FUlIgIiVzOiAiIHggLCBfX2Z1bmNfXyAsICMjYXJncyk7CiAKQEAgLTI1NCwyMCArMTExLDE3IEBACiAjZGVmaW5lIFdMQU5fTE9HX0lORk8oYXJncy4uLiApIHByaW50ayhLRVJOX0lORk8gYXJncykKIAogI2lmIGRlZmluZWQoV0xBTl9JTkNMVURFX0RFQlVHKQotCSNkZWZpbmUgV0xBTl9BU1NFUlQoYykgaWYgKCghKGMpKSAmJiBXTEFOX0RCVkFSID49IDEpIHsgXAotCQlXTEFOX0xPR19ERUJVRygxLCAiQXNzZXJ0aW9uIGZhaWx1cmUhXG4iKTsgfQogCSNkZWZpbmUgV0xBTl9IRVhfRFVNUCggbCwgeCwgcCwgbikJaWYoIFdMQU5fREJWQVIgPj0gKGwpICl7IFwKIAkJaW50IF9faV9fOyBcCiAJCXByaW50ayhLRVJOX0RFQlVHIHggIjoiKTsgXAogCQlmb3IoIF9faV9fPTA7IF9faV9fIDwgKG4pOyBfX2lfXysrKSBcCi0JCQlwcmludGsoICIgJTAyeCIsICgoVUlOVDgqKShwKSlbX19pX19dKTsgXAorCQkJcHJpbnRrKCAiICUwMngiLCAoKHU4KikocCkpW19faV9fXSk7IFwKIAkJcHJpbnRrKCJcbiIpOyB9CiAJI2RlZmluZSBEQkZFTlRFUiB7IGlmICggV0xBTl9EQlZBUiA+PSA1ICl7IFdMQU5fTE9HX0RFQlVHKDMsIi0tLS0+XG4iKTsgfSB9CiAJI2RlZmluZSBEQkZFWElUICB7IGlmICggV0xBTl9EQlZBUiA+PSA1ICl7IFdMQU5fTE9HX0RFQlVHKDMsIjwtLS0tXG4iKTsgfSB9CiAKIAkjZGVmaW5lIFdMQU5fTE9HX0RFQlVHKGwseCxhcmdzLi4uKSBpZiAoIFdMQU5fREJWQVIgPj0gKGwpKSBwcmludGsoS0VSTl9ERUJVRyAiJXMoJWx1KTogIiB4ICwgIF9fZnVuY19fLCAocHJlZW1wdF9jb3VudCgpICYgUFJFRU1QVF9NQVNLKSwgIyNhcmdzICk7CiAjZWxzZQotCSNkZWZpbmUgV0xBTl9BU1NFUlQoYykKIAkjZGVmaW5lIFdMQU5fSEVYX0RVTVAoIGwsIHMsIHAsIG4pCiAJI2RlZmluZSBEQkZFTlRFUgogCSNkZWZpbmUgREJGRVhJVApAQCAtMjc1LDQxMyArMTI5LDExIEBACiAJI2RlZmluZSBXTEFOX0xPR19ERUJVRyhsLCBzLCBhcmdzLi4uKQogI2VuZGlmCiAKLSNpZmRlZiBDT05GSUdfU01QCi0jZGVmaW5lIF9fU01QX18JCQkxCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoX19LRVJORUxfXykKLQotI2lmICgoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDApKSB8fCAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwxOSkpKQotI2RlZmluZSBVUkJfT05MWV9DQUxMQkFDSwotI2VuZGlmCi0KLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDE5KSkKLSNkZWZpbmUgUFRfUkVHUyAgICAsIHN0cnVjdCBwdF9yZWdzICpyZWdzCi0jZWxzZQotI2RlZmluZSBQVF9SRUdTCi0jZW5kaWYKLQotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsNykpCi0jICBkZWZpbmUgZGVsX3NpbmdsZXNob3RfdGltZXJfc3luYyhhKSAgZGVsX3RpbWVyX3N5bmMoYSkKLSNlbmRpZgotCi0jaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDQsMTcpKQotI2RlZmluZSBDT05GSUdfTkVUTElOSwkJMQotI2VuZGlmCi0KLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNCwwKSkKLSNkZWZpbmUga2ZyZWVfcyhhLCBiKQlrZnJlZSgoYSkpCi0jZW5kaWYKLQotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDIsMTgpKQotI2lmbmRlZiBpbml0X3dhaXRxdWV1ZV9oZWFkCi0jaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsMCwxNikpCi0jZGVmaW5lIGluaXRfd2FpdHF1ZXVlX2hlYWQocCkgICgqKHApID0gTlVMTCkKLSNlbHNlCi0jZGVmaW5lIGluaXRfd2FpdHF1ZXVlX2hlYWQocCkgIGluaXRfd2FpdHF1ZXVlKHApCi0jZW5kaWYKLXR5cGVkZWYgc3RydWN0IHdhaXRfcXVldWUgKndhaXRfcXVldWVfaGVhZF90OwotdHlwZWRlZiBzdHJ1Y3Qgd2FpdF9xdWV1ZSB3YWl0X3F1ZXVlX3Q7Ci0jZGVmaW5lIHNldF9jdXJyZW50X3N0YXRlKGIpICB7IGN1cnJlbnQtPnN0YXRlID0gKGIpOyBtYigpOyB9Ci0jZGVmaW5lIGluaXRfd2FpdHF1ZXVlX2VudHJ5KGEsIGIpIHsgKGEpLT50YXNrID0gY3VycmVudDsgfQotI2VuZGlmCi0jZW5kaWYKLQotI2lmbmRlZiB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dAotLy8gcmV0dmFsID09IDA7IHNpZ25hbCBtZXQ7IHdlJ3JlIGdvb2QuCi0vLyByZXR2YWwgPCAwOyBpbnRlcnJ1cHRlZCBieSBzaWduYWwuCi0vLyByZXR2YWwgPiAwOyB0aW1lZCBvdXQuCi0KLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNCwwKSkgIC8vIGZpeG1lPwotCi0jZGVmaW5lIF9fd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQod3EsIGNvbmRpdGlvbiwgcmV0KSAgICAgICAgICAgIFwKLWRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIHdhaXRfcXVldWVfdCBfX3dhaXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgaW5pdF93YWl0cXVldWVfZW50cnkoJl9fd2FpdCwgY3VycmVudCk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgYWRkX3dhaXRfcXVldWUoJndxLCAmX193YWl0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBmb3IgKDs7KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICBpZiAoY29uZGl0aW9uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgaWYgKCFzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeyAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IHNjaGVkdWxlX3RpbWVvdXQocmV0KSAgICA7ICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgcmV0ID0gLUVSRVNUQVJUU1lTOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIHNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgcmVtb3ZlX3dhaXRfcXVldWUoJndxLCAmX193YWl0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0gd2hpbGUgKDApCi0KLSNlbHNlIC8vIDIuMgotCi0KLSNkZWZpbmUgX193YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dCh3cSwgY29uZGl0aW9uLCByZXQpICAgICAgICAgIFwKLWRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgc3RydWN0IHdhaXRfcXVldWUgX193YWl0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgX193YWl0LnRhc2sgPSBjdXJyZW50OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgYWRkX3dhaXRfcXVldWUoJndxLCAmX193YWl0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgZm9yICg7OykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICBjdXJyZW50LT5zdGF0ZSA9IFRBU0tfSU5URVJSVVBUSUJMRTsgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICBpZiAoY29uZGl0aW9uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICBpZiAoIXNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IHNjaGVkdWxlX3RpbWVvdXQocmV0KTsgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmV0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICByZXQgPSAtRVJFU1RBUlRTWVM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgY3VycmVudC0+c3RhdGUgPSBUQVNLX1JVTk5JTkc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgcmVtb3ZlX3dhaXRfcXVldWUoJndxLCAmX193YWl0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0gd2hpbGUgKDApCi0KLSNlbmRpZiAgLy8gdmVyc2lvbiA+PSAyLjQKLQotI2RlZmluZSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dCh3cSwgY29uZGl0aW9uLCB0aW1lb3V0KQkgIFwKLSh7CQkJCQkJCQkJICBcCi0JbG9uZyBfX3JldCA9IHRpbWVvdXQ7CQkJCQkJICBcCi0JaWYgKCEoY29uZGl0aW9uKSkJCQkJCQkgIFwKLQkJX193YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dCh3cSwgY29uZGl0aW9uLCBfX3JldCk7IFwKLQlfX3JldDsJCQkJCQkJCSAgXAotfSkKLQotI2VuZGlmCi0KLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw0LDIwKSkKLSNpZmRlZiBfTElOVVhfTElTVF9ICi0KLXN0YXRpYyBpbmxpbmUgdm9pZCBsaXN0X21vdmVfdGFpbChzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LAotICAgICAgICAgIHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpCi17Ci0gICAgICAgIF9fbGlzdF9kZWwobGlzdC0+cHJldiwgbGlzdC0+bmV4dCk7Ci0gICAgICAgIGxpc3RfYWRkX3RhaWwobGlzdCwgaGVhZCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBfX2xpc3Rfc3BsaWNlKHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsCi0JCQkJIHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpCi17Ci0gICAgICBzdHJ1Y3QgbGlzdF9oZWFkICpmaXJzdCA9IGxpc3QtPm5leHQ7Ci0gICAgICBzdHJ1Y3QgbGlzdF9oZWFkICpsYXN0ID0gbGlzdC0+cHJldjsKLSAgICAgIHN0cnVjdCBsaXN0X2hlYWQgKmF0ID0gaGVhZC0+bmV4dDsKLQotICAgICAgZmlyc3QtPnByZXYgPSBoZWFkOwotICAgICAgaGVhZC0+bmV4dCA9IGZpcnN0OwotCi0gICAgICBsYXN0LT5uZXh0ID0gYXQ7Ci0gICAgICBhdC0+cHJldiA9IGxhc3Q7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBsaXN0X21vdmUoc3RydWN0IGxpc3RfaGVhZCAqbGlzdCwgc3RydWN0IGxpc3RfaGVhZCAqaGVhZCkKLXsKLSAgICAgIF9fbGlzdF9kZWwobGlzdC0+cHJldiwgbGlzdC0+bmV4dCk7Ci0gICAgICBsaXN0X2FkZChsaXN0LCBoZWFkKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGxpc3Rfc3BsaWNlX2luaXQoc3RydWN0IGxpc3RfaGVhZCAqbGlzdCwKLSAgICAgICAgICAgIHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpCi17Ci0JaWYgKCFsaXN0X2VtcHR5KGxpc3QpKSB7Ci0JCV9fbGlzdF9zcGxpY2UobGlzdCwgaGVhZCk7Ci0JCUlOSVRfTElTVF9IRUFEKGxpc3QpOwotCX0KLX0KLQotCi0jZW5kaWYgIC8vIExJU1RfSAotI2VuZGlmCi0KLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiwxLDkwKSkKLSNkZWZpbmUgc3Bpbl9sb2NrKGwpICAgICAgICAgICAgZG8geyB9IHdoaWxlICgwKQotI2RlZmluZSBzcGluX3VubG9jayhsKSAgICAgICAgICBkbyB7IH0gd2hpbGUgKDApCi0jZGVmaW5lIHNwaW5fbG9ja19pcnFzYXZlKGwsZikgIGRvIHsgc2F2ZV9mbGFncyhmKTsgY2xpKCk7IH0gd2hpbGUgKDApCi0jZGVmaW5lIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUobCxmKSBkbyB7IHJlc3RvcmVfZmxhZ3MoZik7IH0gd2hpbGUgKDApCi0jZGVmaW5lIHNwaW5fbG9ja19pbml0KHMpICAgICAgIGRvIHsgfSB3aGlsZSAoMCkKLSNkZWZpbmUgc3Bpbl90cnlsb2NrKGwpICAgICAgICAgKDEpCi10eXBlZGVmIGludCBzcGlubG9ja190OwotI2VuZGlmCi0KLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw0LDApKSAvLyBYWFggPz8/Ci0jZGVmaW5lIHNwaW5fbG9ja19iaCAgICAgICAgIHNwaW5fbG9jawotI2VuZGlmCi0KLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw0LDApKQotI2lmZGVmIENPTkZJR19TTVAKLSNkZWZpbmUgc3Bpbl9pc19sb2NrZWQoeCkgICAgICAgKCoodm9sYXRpbGUgY2hhciAqKSgmKHgpLT5sb2NrKSA8PSAwKQotI2Vsc2UKLSNkZWZpbmUgc3Bpbl9pc19sb2NrZWQobCkgICAgICAgKDApCi0jZW5kaWYKLSNlbmRpZgotCi0jaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNCwyOCkpCi0jZGVmaW5lIF9fdXNlcgotI2RlZmluZSBfX2lvbWVtCi0jZW5kaWYKLQotI2lmZGVmIF9MSU5VWF9QUk9DX0ZTX0gKLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiwzLDI1KSkKLQotZXh0ZXJuIGlubGluZSBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKgotY3JlYXRlX3Byb2NfcmVhZF9lbnRyeShjb25zdCBjaGFyICpuYW1lLCBtb2RlX3QgbW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpiYXNlLAotICAgICAgICAgICAgICAgICAgICAgICByZWFkX3Byb2NfdCAqcmVhZF9wcm9jLCB2b2lkICpkYXRhKQotewotICAgIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcmVzID0gY3JlYXRlX3Byb2NfZW50cnkobmFtZSwgbW9kZSwgYmFzZSk7Ci0gICAgaWYgKHJlcykgewotICAgICAgICByZXMtPnJlYWRfcHJvYyA9IHJlYWRfcHJvYzsKLSAgICAgICAgcmVzLT5kYXRhID0gZGF0YTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlczsKLX0KLSNlbmRpZgotCi0jaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsMywyOSkpCi0jaWZuZGVmIHByb2NfbWtkaXIKLSNkZWZpbmUgcHJvY19ta2RpcihuYW1lLCByb290KSBjcmVhdGVfcHJvY19lbnRyeShuYW1lLCBTX0lGRElSLCByb290KQotI2VuZGlmCi0jZW5kaWYKLSNlbmRpZiAvKiBfTElOVVhfUFJPQ19GU19IICovCi0KLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDApKQotI2lmbmRlZiBJTklUX1RRVUVVRQotI2RlZmluZSBQUkVQQVJFX1RRVUVVRShfdHEsIF9yb3V0aW5lLCBfZGF0YSkgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgKF90cSktPnJvdXRpbmUgPSBfcm91dGluZTsgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgIChfdHEpLT5kYXRhID0gX2RhdGE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgfSB3aGlsZSAoMCkKLSNkZWZpbmUgSU5JVF9UUVVFVUUoX3RxLCBfcm91dGluZSwgX2RhdGEpICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgIElOSVRfTElTVF9IRUFEKCYoX3RxKS0+bGlzdCk7ICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAoX3RxKS0+c3luYyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgUFJFUEFSRV9UUVVFVUUoKF90cSksIChfcm91dGluZSksIChfZGF0YSkpOyAgICAgXAotICAgICAgICB9IHdoaWxlICgwKQotI2VuZGlmCi0KLSNpZm5kZWYgY29udGFpbmVyX29mCi0jZGVmaW5lIGNvbnRhaW5lcl9vZihwdHIsIHR5cGUsIG1lbWJlcikgKHsJCQlcCi0gICAgICAgIGNvbnN0IHR5cGVvZiggKCh0eXBlICopMCktPm1lbWJlciApICpfX21wdHIgPSAocHRyKTsJXAotICAgICAgICAodHlwZSAqKSggKGNoYXIgKilfX21wdHIgLSBvZmZzZXRvZih0eXBlLG1lbWJlcikgKTt9KQotI2VuZGlmCi0KLSNpZm5kZWYgSU5JVF9XT1JLCi0jZGVmaW5lIHdvcmtfc3RydWN0IHRxX3N0cnVjdAotCi0jaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNCwwKSkKLSNkZWZpbmUgc2NoZWR1bGVfd29yayhhKSAgIHF1ZXVlX3Rhc2soYSwgJnRxX3NjaGVkdWxlcikKLSNlbHNlCi0jZGVmaW5lIHNjaGVkdWxlX3dvcmsoYSkgIHNjaGVkdWxlX3Rhc2soYSkKLSNlbmRpZgotCi0jZGVmaW5lIGZsdXNoX3NjaGVkdWxlZF93b3JrICBmbHVzaF9zY2hlZHVsZWRfdGFza3MKLSNkZWZpbmUgSU5JVF9XT1JLMihfd3EsIF9yb3V0aW5lKSAgSU5JVF9UUVVFVUUoX3dxLCAodm9pZCAoKikodm9pZCAqKSlfcm91dGluZSwgX3dxKQotI2VuZGlmCi0KLSNlbHNlIC8vID49IDIuNSBrZXJuZWwKLQotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwyMCkKLSNkZWZpbmUgSU5JVF9XT1JLMihfd3EsIF9yb3V0aW5lKQlJTklUX1dPUksoX3dxLCAodm9pZCAoKikodm9pZCAqKSlfcm91dGluZSwgX3dxKQotI2Vsc2UKLSNkZWZpbmUgSU5JVF9XT1JLMihfd3EsIF9yb3V0aW5lKQlJTklUX1dPUksoX3dxLCBfcm91dGluZSkKLSNlbmRpZgotCi0jZW5kaWYgLy8gPj0gMi41IGtlcm5lbAotCi0jaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsMywzOCkpCi10eXBlZGVmIHN0cnVjdCBkZXZpY2UgbmV0ZGV2aWNlX3Q7Ci0jZWxpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw0LDQpKQotdHlwZWRlZiBzdHJ1Y3QgbmV0X2RldmljZSBuZXRkZXZpY2VfdDsKLSNlbHNlCiAjdW5kZWYgbmV0ZGV2aWNlX3QKIHR5cGVkZWYgc3RydWN0IG5ldF9kZXZpY2UgbmV0ZGV2aWNlX3Q7Ci0jZW5kaWYKIAotI2lmZGVmIFdJUkVMRVNTX0VYVAotI2lmIChXSVJFTEVTU19FWFQgPCAxMykKLXN0cnVjdCBpd19yZXF1ZXN0X2luZm8KLXsKLSAgICAgICAgX191MTYgICAgICAgICAgIGNtZDsgICAgICAgICAgICAvKiBXaXJlbGVzcyBFeHRlbnNpb24gY29tbWFuZCAqLwotICAgICAgICBfX3UxNiAgICAgICAgICAgZmxhZ3M7ICAgICAgICAgIC8qIE1vcmUgdG8gY29tZSA7LSkgKi8KLX07Ci0jZW5kaWYKLSNlbmRpZgotCi0KLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiwxLDE4KSkKLSNkZWZpbmUgTU9EVUxFX1BBUk0oYSxiKSAgICAgICAgZXh0ZXJuIGludCBfX2JvZ3VzX2RlY2wKLSNkZWZpbmUgTU9EVUxFX0FVVEhPUihhKSAgICAgICAgZXh0ZXJuIGludCBfX2JvZ3VzX2RlY2wKLSNkZWZpbmUgTU9EVUxFX0RFU0NSSVBUSU9OKGEpICAgZXh0ZXJuIGludCBfX2JvZ3VzX2RlY2wKLSNkZWZpbmUgTU9EVUxFX1NVUFBPUlRFRF9ERVZJQ0UoYSkgZXh0ZXJuIGludCBfX2JvZ3VzX2RlY2wKLSN1bmRlZiAgR0VUX1VTRV9DT1VOVAotI2RlZmluZSBHRVRfVVNFX0NPVU5UKG0pICAgICAgICBtb2RfdXNlX2NvdW50XwotI2VuZGlmCi0KLSNpZm5kZWYgTU9EVUxFX09XTkVSCi0jZGVmaW5lIE1PRFVMRV9PV05FUihhKSAgICAgICAgIGV4dGVybiBpbnQgX19ib2d1c19kZWNsCi0jZGVmaW5lIEFOQ0lFTlRfTU9EVUxFX0NPREUKLSNlbmRpZgotCi0jaWZuZGVmIE1PRFVMRV9MSUNFTlNFCi0jZGVmaW5lIE1PRFVMRV9MSUNFTlNFKG0pICAgICAgIGV4dGVybiBpbnQgX19ib2d1c19kZWNsCi0jZW5kaWYKLQotLyogVE9ETzogIERvIHdlIGNhcmUgYWJvdXQgdGhpcz8gKi8KLSNpZm5kZWYgTU9EVUxFX0RFVklDRV9UQUJMRQotI2RlZmluZSBNT0RVTEVfREVWSUNFX1RBQkxFKGZvbyxiYXIpCi0jZW5kaWYKLQotI2RlZmluZSB3bGFuX21pbnV0ZXMydGlja3MoYSkgKChhKSood2xhbl90aWNrc19wZXJfc2VjICogIDYwKSkKLSNkZWZpbmUgd2xhbl9zZWNvbmRzMnRpY2tzKGEpICgoYSkqKHdsYW5fdGlja3NfcGVyX3NlYykpCi0KLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw1LDQ3KSkKLSNkZWZpbmUgTkVXX01PRFVMRV9DT0RFCi0jaWZkZWYgQU5DSUVOVF9NT0RVTEVfQ09ERQotI3VuZGVmIEFOQ0lFTlRfTU9EVUxFX0NPREUKLSNlbmRpZgotI2VsaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNCwyNSkpCi0jZGVmaW5lIG1vZHVsZV9wYXJhbShuYW1lLCB0eXBlLCBwZXJtKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgc3RhdGljIGlubGluZSB2b2lkICpfX2NoZWNrX2V4aXN0ZW5jZV8jI25hbWUodm9pZCkgeyByZXR1cm4gJm5hbWU7IH0gXAotICAgICAgICBNT0RVTEVfUEFSTShuYW1lLCBfTU9EVUxFX1BBUk1fU1RSSU5HXyAjIyB0eXBlKQotCi0jZGVmaW5lIF9NT0RVTEVfUEFSTV9TVFJJTkdfYnl0ZSAiYiIKLSNkZWZpbmUgX01PRFVMRV9QQVJNX1NUUklOR19zaG9ydCAiaCIKLSNkZWZpbmUgX01PRFVMRV9QQVJNX1NUUklOR191c2hvcnQgImgiCi0jZGVmaW5lIF9NT0RVTEVfUEFSTV9TVFJJTkdfaW50ICJpIgotI2RlZmluZSBfTU9EVUxFX1BBUk1fU1RSSU5HX3VpbnQgImkiCi0jZGVmaW5lIF9NT0RVTEVfUEFSTV9TVFJJTkdfbG9uZyAibCIKLSNkZWZpbmUgX01PRFVMRV9QQVJNX1NUUklOR191bG9uZyAibCIKLSNkZWZpbmUgX01PRFVMRV9QQVJNX1NUUklOR19ib29sICJpIgotI2VuZGlmCi0KLS8qIGxpbnV4IDwgMi41LjY5ICovCi0jaWZuZGVmIElSUV9OT05FCi10eXBlZGVmIHZvaWQgaXJxcmV0dXJuX3Q7Ci0jZGVmaW5lIElSUV9OT05FCi0jZGVmaW5lIElSUV9IQU5ETEVECi0jZGVmaW5lIElSUV9SRVRWQUwoeCkKLSNlbmRpZgotCi0jaWZuZGVmIGluX2F0b21pYwotI2RlZmluZSBpbl9hdG9taWMoKSAgMAotI2VuZGlmCi0KLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw2LDEzKSkKICNkZWZpbmUgVVJCX0FTWU5DX1VOTElOSyAwCi0jZW5kaWYKLQotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsNykpCi0jZGVmaW5lIFVSQl9BU1lOQ19VTkxJTksgIFVTQl9BU1lOQ19VTkxJTksKLSNkZWZpbmUgdXNiX2ZpbGxfYnVsa191cmIgIEZJTExfQlVMS19VUkIKLSNkZWZpbmUgdXNiX2tpbGxfdXJiICB1c2JfdW5saW5rX3VyYgotI2Vsc2UKICNkZWZpbmUgVVNCX1FVRVVFX0JVTEsgMAotI2VuZGlmCi0KLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDExKSkKLXR5cGVkZWYgdTMyIHBtX21lc3NhZ2VfdDsKLSNlbmRpZgotCi0jaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNiw5KSkKLSNkZWZpbmUgaG90cGx1Z19wYXRoICAiL2V0Yy9ob3RwbHVnL3dsYW4uYWdlbnQiCi0jZW5kaWYKLQotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMCkpCi0jZGVmaW5lIGZyZWVfbmV0ZGV2KHgpICAgICAgIGtmcmVlKHgpCi0jZW5kaWYKLQotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsOSkpCi0jZGVmaW5lIGV0aF9oZHIoeCkgICAgICAgICAgICh4KS0+bWFjLmV0aGVybmV0Ci0jZW5kaWYKLQotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDQsMCkpCi0jZGVmaW5lIGRlbF90aW1lcl9zeW5jKGEpICAgICAgIGRlbF90aW1lcihhKQotI2VuZGlmCi0KLSNpZm5kZWYgbWlnaHRfc2xlZXAKLSNkZWZpbmUgbWlnaHRfc2xlZXAoYSkgICBkbyB7IH0gd2hpbGUgKDApCi0jZW5kaWYKLQotLyogQXBwYXJlbnRseSAyLjQuMiBldGh0b29sIGlzIHF1aXRlIGRpZmZlcmVudCwgbWF5YmUgbmV3ZXIgdG9vPyAqLwotI2lmIChkZWZpbmVkKFNJT0VUSFRPT0wpICYmICFkZWZpbmVkKEVUSFRPT0xfR0RSVklORk8pKQotI3VuZGVmIFNJT0VUSFRPT0wKLSNlbmRpZgotCi0vLyBwY21jaWEtY3Mgc3R1ZmYKLSNpZiAoKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNSw2OCkpICYmIFwKLSAgICAgIWRlZmluZWQocGNtY2lhX2FjY2Vzc19jb25maWd1cmF0aW9uX3JlZ2lzdGVyKSkKLSNkZWZpbmUgcGNtY2lhX2FjY2Vzc19jb25maWd1cmF0aW9uX3JlZ2lzdGVyKGhhbmRsZSwgcmVnKSBcCi0gICAgICAgIENhcmRTZXJ2aWNlcyhBY2Nlc3NDb25maWd1cmF0aW9uUmVnaXN0ZXIsIGhhbmRsZSwgcmVnKQotI2RlZmluZSBwY21jaWFfcmVnaXN0ZXJfY2xpZW50KGhhbmRsZSwgcmVnKSBcCi0gICAgICAgIENhcmRTZXJ2aWNlcyhSZWdpc3RlckNsaWVudCwgaGFuZGxlLCByZWcpCi0jZGVmaW5lIHBjbWNpYV9kZXJlZ2lzdGVyX2NsaWVudChoYW5kbGUpIFwKLSAgICAgICAgQ2FyZFNlcnZpY2VzKERlcmVnaXN0ZXJDbGllbnQsIGhhbmRsZSkKLSNkZWZpbmUgcGNtY2lhX2dldF9maXJzdF90dXBsZShoYW5kbGUsIHR1cGxlKSBcCi0gICAgICAgIENhcmRTZXJ2aWNlcyhHZXRGaXJzdFR1cGxlLCBoYW5kbGUsIHR1cGxlKQotI2RlZmluZSBwY21jaWFfZ2V0X25leHRfdHVwbGUoaGFuZGxlLCB0dXBsZSkgXAotICAgICAgICBDYXJkU2VydmljZXMoR2V0TmV4dFR1cGxlLCBoYW5kbGUsIHR1cGxlKQotI2RlZmluZSBwY21jaWFfZ2V0X3R1cGxlX2RhdGEoaGFuZGxlLCB0dXBsZSkgXAotICAgICAgICBDYXJkU2VydmljZXMoR2V0VHVwbGVEYXRhLCBoYW5kbGUsIHR1cGxlKQotI2RlZmluZSBwY21jaWFfcGFyc2VfdHVwbGUoaGFuZGxlLCB0dXBsZSwgcGFyc2UpIFwKLSAgICAgICAgQ2FyZFNlcnZpY2VzKFBhcnNlVHVwbGUsIGhhbmRsZSwgdHVwbGUsIHBhcnNlKQotI2RlZmluZSBwY21jaWFfZ2V0X2NvbmZpZ3VyYXRpb25faW5mbyhoYW5kbGUsIGNvbmZpZykgXAotICAgICAgICBDYXJkU2VydmljZXMoR2V0Q29uZmlndXJhdGlvbkluZm8sIGhhbmRsZSwgY29uZmlnKQotI2RlZmluZSBwY21jaWFfcmVxdWVzdF9pbyhoYW5kbGUsIHJlcSkgXAotICAgICAgICBDYXJkU2VydmljZXMoUmVxdWVzdElPLCBoYW5kbGUsIHJlcSkKLSNkZWZpbmUgcGNtY2lhX3JlcXVlc3RfaXJxKGhhbmRsZSwgcmVxKSBcCi0gICAgICAgIENhcmRTZXJ2aWNlcyhSZXF1ZXN0SVJRLCBoYW5kbGUsIHJlcSkKLSNkZWZpbmUgcGNtY2lhX3JlcXVlc3RfY29uZmlndXJhdGlvbihoYW5kbGUsIHJlcSkgXAotICAgICAgICBDYXJkU2VydmljZXMoUmVxdWVzdENvbmZpZ3VyYXRpb24sIGhhbmRsZSwgcmVxKQotI2RlZmluZSBwY21jaWFfcmVsZWFzZV9jb25maWd1cmF0aW9uKGhhbmRsZSkgXAotICAgICAgICBDYXJkU2VydmljZXMoUmVsZWFzZUNvbmZpZ3VyYXRpb24sIGhhbmRsZSkKLSNkZWZpbmUgcGNtY2lhX3JlbGVhc2VfaW8oaGFuZGxlLCByZXEpIFwKLSAgICAgICAgQ2FyZFNlcnZpY2VzKFJlbGVhc2VJTywgaGFuZGxlLCByZXEpCi0jZGVmaW5lIHBjbWNpYV9yZWxlYXNlX2lycShoYW5kbGUsIHJlcSkgXAotICAgICAgICBDYXJkU2VydmljZXMoUmVsZWFzZUlSUSwgaGFuZGxlLCByZXEpCi0jZGVmaW5lIHBjbWNpYV9yZWxlYXNlX3dpbmRvdyh3aW4pIFwKLSAgICAgICAgQ2FyZFNlcnZpY2VzKFJlbGVhc2VXaW5kb3csIHdpbikKLSNkZWZpbmUgcGNtY2lhX2dldF9jYXJkX3NlcnZpY2VzX2luZm8oaW5mbykgXAotICAgICAgICBDYXJkU2VydmljZXMoR2V0Q2FyZFNlcnZpY2VzSW5mbywgaW5mbykKLSNkZWZpbmUgcGNtY2lhX3JlcG9ydF9lcnJvcihoYW5kbGUsIGVycikgXAotICAgICAgICBDYXJkU2VydmljZXMoUmVwb3J0RXJyb3IsIGhhbmRsZSwgZXJyKQotI2VuZGlmCi0KLSNlbmRpZiAvKiBfX0tFUk5FTF9fICovCiAKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAvKi0tLS0tLSBIYXJkd2FyZSBQb3J0YWJpbGl0eSBNYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpAQCAtNjkyLDIyICsxNDQsNiBAQAogI2RlZmluZSBob3N0MmllZWUxNihuKQlfX2NwdV90b19sZTE2KG4pCiAjZGVmaW5lIGhvc3QyaWVlZTMyKG4pCV9fY3B1X3RvX2xlMzIobikKIAotI2lmIChXTEFOX0NQVV9GQU1JTFkgIT0gV0xBTl9NSVBTKQotdHlwZWRlZiBVSU5UMzIgcGh5c190OwotI2VuZGlmCi0KLSNpZiAoV0xBTl9DUFVfRkFNSUxZID09IFdMQU5fUFBDKQotICAgICAgICNkZWZpbmUgd2xhbl9pbncoYSkgICAgICAgICAgICAgICAgICAgICBpbl9iZTE2KCh1bnNpZ25lZCBzaG9ydCAqKSgoYSkrX0lPX0JBU0UpKQotICAgICAgICNkZWZpbmUgd2xhbl9pbndfbGUxNl90b19jcHUoYSkgICAgICAgICBpbncoKGEpKQotICAgICAgICNkZWZpbmUgd2xhbl9vdXR3KHYsYSkgICAgICAgICAgICAgICAgICBvdXRfYmUxNigodW5zaWduZWQgc2hvcnQgKikoKGEpK19JT19CQVNFKSwgKHYpKQotICAgICAgICNkZWZpbmUgd2xhbl9vdXR3X2NwdV90b19sZTE2KHYsYSkgICAgICBvdXR3KCh2KSwoYSkpCi0jZWxzZQotICAgICAgICNkZWZpbmUgd2xhbl9pbncoYSkgICAgICAgICAgICAgICAgICAgICBpbncoKGEpKQotICAgICAgICNkZWZpbmUgd2xhbl9pbndfbGUxNl90b19jcHUoYSkgICAgICAgICBfX2NwdV90b19sZTE2KGludygoYSkpKQotICAgICAgICNkZWZpbmUgd2xhbl9vdXR3KHYsYSkgICAgICAgICAgICAgICAgICBvdXR3KCh2KSwoYSkpCi0gICAgICAgI2RlZmluZSB3bGFuX291dHdfY3B1X3RvX2xlMTYodixhKSAgICAgIG91dHcoX19jcHVfdG9fbGUxNigodikpLChhKSkKLSNlbmRpZgotCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogLyotLS0gR2VuZXJhbCBNYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3RoZXJtYWwvdGhlcm1hbF9zeXMuYyBiL2RyaXZlcnMvdGhlcm1hbC90aGVybWFsX3N5cy5jCmluZGV4IGZlMDc0NjIuLjgxNzFjYTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdGhlcm1hbC90aGVybWFsX3N5cy5jCisrKyBiL2RyaXZlcnMvdGhlcm1hbC90aGVybWFsX3N5cy5jCkBAIC01NzksNyArNTc5LDcgQEAKIAlzdHJ1Y3QgdGhlcm1hbF96b25lX2RldmljZSAqdHo7CiAJc3RydWN0IHRoZXJtYWxfY29vbGluZ19kZXZpY2UgKmNkZXY7CiAKLQlpZiAoIXN0cm5jbXAoZGV2LT5idXNfaWQsICJ0aGVybWFsX3pvbmUiLCBzaXplb2YgInRoZXJtYWxfem9uZSIgLSAxKSkgeworCWlmICghc3RybmNtcChkZXZfbmFtZShkZXYpLCAidGhlcm1hbF96b25lIiwgc2l6ZW9mICJ0aGVybWFsX3pvbmUiIC0gMSkpIHsKIAkJdHogPSB0b190aGVybWFsX3pvbmUoZGV2KTsKIAkJa2ZyZWUodHopOwogCX0gZWxzZSB7CkBAIC02MzAsNyArNjMwLDcgQEAKIAljZGV2LT5vcHMgPSBvcHM7CiAJY2Rldi0+ZGV2aWNlLmNsYXNzID0gJnRoZXJtYWxfY2xhc3M7CiAJY2Rldi0+ZGV2ZGF0YSA9IGRldmRhdGE7Ci0Jc3ByaW50ZihjZGV2LT5kZXZpY2UuYnVzX2lkLCAiY29vbGluZ19kZXZpY2UlZCIsIGNkZXYtPmlkKTsKKwlkZXZfc2V0X25hbWUoJmNkZXYtPmRldmljZSwgImNvb2xpbmdfZGV2aWNlJWQiLCBjZGV2LT5pZCk7CiAJcmVzdWx0ID0gZGV2aWNlX3JlZ2lzdGVyKCZjZGV2LT5kZXZpY2UpOwogCWlmIChyZXN1bHQpIHsKIAkJcmVsZWFzZV9pZHIoJnRoZXJtYWxfY2Rldl9pZHIsICZ0aGVybWFsX2lkcl9sb2NrLCBjZGV2LT5pZCk7CkBAIC03NjksNyArNzY5LDcgQEAKIAl0ei0+ZGV2aWNlLmNsYXNzID0gJnRoZXJtYWxfY2xhc3M7CiAJdHotPmRldmRhdGEgPSBkZXZkYXRhOwogCXR6LT50cmlwcyA9IHRyaXBzOwotCXNwcmludGYodHotPmRldmljZS5idXNfaWQsICJ0aGVybWFsX3pvbmUlZCIsIHR6LT5pZCk7CisJZGV2X3NldF9uYW1lKCZ0ei0+ZGV2aWNlLCAidGhlcm1hbF96b25lJWQiLCB0ei0+aWQpOwogCXJlc3VsdCA9IGRldmljZV9yZWdpc3RlcigmdHotPmRldmljZSk7CiAJaWYgKHJlc3VsdCkgewogCQlyZWxlYXNlX2lkcigmdGhlcm1hbF90el9pZHIsICZ0aGVybWFsX2lkcl9sb2NrLCB0ei0+aWQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91aW8vdWlvLmMgYi9kcml2ZXJzL3Vpby91aW8uYwppbmRleCAyZDI0NDBjLi40Y2E4NWExIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Vpby91aW8uYworKysgYi9kcml2ZXJzL3Vpby91aW8uYwpAQCAtMzUsNiArMzUsNyBAQAogCWludAkJCXZtYV9jb3VudDsKIAlzdHJ1Y3QgdWlvX2luZm8JCSppbmZvOwogCXN0cnVjdCBrb2JqZWN0CQkqbWFwX2RpcjsKKwlzdHJ1Y3Qga29iamVjdAkJKnBvcnRpb19kaXI7CiB9OwogCiBzdGF0aWMgaW50IHVpb19tYWpvcjsKQEAgLTc1LDE3ICs3NiwxNyBAQAogCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjB4JWx4XG4iLCBtZW0tPmFkZHIgJiB+UEFHRV9NQVNLKTsKIH0KIAotc3RydWN0IHVpb19zeXNmc19lbnRyeSB7CitzdHJ1Y3QgbWFwX3N5c2ZzX2VudHJ5IHsKIAlzdHJ1Y3QgYXR0cmlidXRlIGF0dHI7CiAJc3NpemVfdCAoKnNob3cpKHN0cnVjdCB1aW9fbWVtICosIGNoYXIgKik7CiAJc3NpemVfdCAoKnN0b3JlKShzdHJ1Y3QgdWlvX21lbSAqLCBjb25zdCBjaGFyICosIHNpemVfdCk7CiB9OwogCi1zdGF0aWMgc3RydWN0IHVpb19zeXNmc19lbnRyeSBhZGRyX2F0dHJpYnV0ZSA9CitzdGF0aWMgc3RydWN0IG1hcF9zeXNmc19lbnRyeSBhZGRyX2F0dHJpYnV0ZSA9CiAJX19BVFRSKGFkZHIsIFNfSVJVR08sIG1hcF9hZGRyX3Nob3csIE5VTEwpOwotc3RhdGljIHN0cnVjdCB1aW9fc3lzZnNfZW50cnkgc2l6ZV9hdHRyaWJ1dGUgPQorc3RhdGljIHN0cnVjdCBtYXBfc3lzZnNfZW50cnkgc2l6ZV9hdHRyaWJ1dGUgPQogCV9fQVRUUihzaXplLCBTX0lSVUdPLCBtYXBfc2l6ZV9zaG93LCBOVUxMKTsKLXN0YXRpYyBzdHJ1Y3QgdWlvX3N5c2ZzX2VudHJ5IG9mZnNldF9hdHRyaWJ1dGUgPQorc3RhdGljIHN0cnVjdCBtYXBfc3lzZnNfZW50cnkgb2Zmc2V0X2F0dHJpYnV0ZSA9CiAJX19BVFRSKG9mZnNldCwgU19JUlVHTywgbWFwX29mZnNldF9zaG93LCBOVUxMKTsKIAogc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHJzW10gPSB7CkBAIC0xMDYsOSArMTA3LDkgQEAKIHsKIAlzdHJ1Y3QgdWlvX21hcCAqbWFwID0gdG9fbWFwKGtvYmopOwogCXN0cnVjdCB1aW9fbWVtICptZW0gPSBtYXAtPm1lbTsKLQlzdHJ1Y3QgdWlvX3N5c2ZzX2VudHJ5ICplbnRyeTsKKwlzdHJ1Y3QgbWFwX3N5c2ZzX2VudHJ5ICplbnRyeTsKIAotCWVudHJ5ID0gY29udGFpbmVyX29mKGF0dHIsIHN0cnVjdCB1aW9fc3lzZnNfZW50cnksIGF0dHIpOworCWVudHJ5ID0gY29udGFpbmVyX29mKGF0dHIsIHN0cnVjdCBtYXBfc3lzZnNfZW50cnksIGF0dHIpOwogCiAJaWYgKCFlbnRyeS0+c2hvdykKIAkJcmV0dXJuIC1FSU87CkBAIC0xMTYsMTYgKzExNyw5MyBAQAogCXJldHVybiBlbnRyeS0+c2hvdyhtZW0sIGJ1Zik7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc3lzZnNfb3BzIHVpb19zeXNmc19vcHMgPSB7CitzdGF0aWMgc3RydWN0IHN5c2ZzX29wcyBtYXBfc3lzZnNfb3BzID0gewogCS5zaG93ID0gbWFwX3R5cGVfc2hvdywKIH07CiAKIHN0YXRpYyBzdHJ1Y3Qga29ial90eXBlIG1hcF9hdHRyX3R5cGUgPSB7CiAJLnJlbGVhc2UJPSBtYXBfcmVsZWFzZSwKLQkuc3lzZnNfb3BzCT0gJnVpb19zeXNmc19vcHMsCisJLnN5c2ZzX29wcwk9ICZtYXBfc3lzZnNfb3BzLAogCS5kZWZhdWx0X2F0dHJzCT0gYXR0cnMsCiB9OwogCitzdHJ1Y3QgdWlvX3BvcnRpbyB7CisJc3RydWN0IGtvYmplY3Qga29iajsKKwlzdHJ1Y3QgdWlvX3BvcnQgKnBvcnQ7Cit9OworI2RlZmluZSB0b19wb3J0aW8ocG9ydGlvKSBjb250YWluZXJfb2YocG9ydGlvLCBzdHJ1Y3QgdWlvX3BvcnRpbywga29iaikKKworc3RhdGljIHNzaXplX3QgcG9ydGlvX3N0YXJ0X3Nob3coc3RydWN0IHVpb19wb3J0ICpwb3J0LCBjaGFyICpidWYpCit7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiMHglbHhcbiIsIHBvcnQtPnN0YXJ0KTsKK30KKworc3RhdGljIHNzaXplX3QgcG9ydGlvX3NpemVfc2hvdyhzdHJ1Y3QgdWlvX3BvcnQgKnBvcnQsIGNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gc3ByaW50ZihidWYsICIweCVseFxuIiwgcG9ydC0+c2l6ZSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHBvcnRpb19wb3J0dHlwZV9zaG93KHN0cnVjdCB1aW9fcG9ydCAqcG9ydCwgY2hhciAqYnVmKQoreworCWNvbnN0IGNoYXIgKnBvcnR0eXBlc1tdID0geyJub25lIiwgIng4NiIsICJncGlvIiwgIm90aGVyIn07CisKKwlpZiAoKHBvcnQtPnBvcnR0eXBlIDwgMCkgfHwgKHBvcnQtPnBvcnR0eXBlID4gVUlPX1BPUlRfT1RIRVIpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgInBvcnRfJXNcbiIsIHBvcnR0eXBlc1twb3J0LT5wb3J0dHlwZV0pOworfQorCitzdHJ1Y3QgcG9ydGlvX3N5c2ZzX2VudHJ5IHsKKwlzdHJ1Y3QgYXR0cmlidXRlIGF0dHI7CisJc3NpemVfdCAoKnNob3cpKHN0cnVjdCB1aW9fcG9ydCAqLCBjaGFyICopOworCXNzaXplX3QgKCpzdG9yZSkoc3RydWN0IHVpb19wb3J0ICosIGNvbnN0IGNoYXIgKiwgc2l6ZV90KTsKK307CisKK3N0YXRpYyBzdHJ1Y3QgcG9ydGlvX3N5c2ZzX2VudHJ5IHBvcnRpb19zdGFydF9hdHRyaWJ1dGUgPQorCV9fQVRUUihzdGFydCwgU19JUlVHTywgcG9ydGlvX3N0YXJ0X3Nob3csIE5VTEwpOworc3RhdGljIHN0cnVjdCBwb3J0aW9fc3lzZnNfZW50cnkgcG9ydGlvX3NpemVfYXR0cmlidXRlID0KKwlfX0FUVFIoc2l6ZSwgU19JUlVHTywgcG9ydGlvX3NpemVfc2hvdywgTlVMTCk7CitzdGF0aWMgc3RydWN0IHBvcnRpb19zeXNmc19lbnRyeSBwb3J0aW9fcG9ydHR5cGVfYXR0cmlidXRlID0KKwlfX0FUVFIocG9ydHR5cGUsIFNfSVJVR08sIHBvcnRpb19wb3J0dHlwZV9zaG93LCBOVUxMKTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKnBvcnRpb19hdHRyc1tdID0geworCSZwb3J0aW9fc3RhcnRfYXR0cmlidXRlLmF0dHIsCisJJnBvcnRpb19zaXplX2F0dHJpYnV0ZS5hdHRyLAorCSZwb3J0aW9fcG9ydHR5cGVfYXR0cmlidXRlLmF0dHIsCisJTlVMTCwKK307CisKK3N0YXRpYyB2b2lkIHBvcnRpb19yZWxlYXNlKHN0cnVjdCBrb2JqZWN0ICprb2JqKQoreworCXN0cnVjdCB1aW9fcG9ydGlvICpwb3J0aW8gPSB0b19wb3J0aW8oa29iaik7CisJa2ZyZWUocG9ydGlvKTsKK30KKworc3RhdGljIHNzaXplX3QgcG9ydGlvX3R5cGVfc2hvdyhzdHJ1Y3Qga29iamVjdCAqa29iaiwgc3RydWN0IGF0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgICAgY2hhciAqYnVmKQoreworCXN0cnVjdCB1aW9fcG9ydGlvICpwb3J0aW8gPSB0b19wb3J0aW8oa29iaik7CisJc3RydWN0IHVpb19wb3J0ICpwb3J0ID0gcG9ydGlvLT5wb3J0OworCXN0cnVjdCBwb3J0aW9fc3lzZnNfZW50cnkgKmVudHJ5OworCisJZW50cnkgPSBjb250YWluZXJfb2YoYXR0ciwgc3RydWN0IHBvcnRpb19zeXNmc19lbnRyeSwgYXR0cik7CisKKwlpZiAoIWVudHJ5LT5zaG93KQorCQlyZXR1cm4gLUVJTzsKKworCXJldHVybiBlbnRyeS0+c2hvdyhwb3J0LCBidWYpOworfQorCitzdGF0aWMgc3RydWN0IHN5c2ZzX29wcyBwb3J0aW9fc3lzZnNfb3BzID0geworCS5zaG93ID0gcG9ydGlvX3R5cGVfc2hvdywKK307CisKK3N0YXRpYyBzdHJ1Y3Qga29ial90eXBlIHBvcnRpb19hdHRyX3R5cGUgPSB7CisJLnJlbGVhc2UJPSBwb3J0aW9fcmVsZWFzZSwKKwkuc3lzZnNfb3BzCT0gJnBvcnRpb19zeXNmc19vcHMsCisJLmRlZmF1bHRfYXR0cnMJPSBwb3J0aW9fYXR0cnMsCit9OworCiBzdGF0aWMgc3NpemVfdCBzaG93X25hbWUoc3RydWN0IGRldmljZSAqZGV2LAogCQkJIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7CkBAIC0xNzcsMTAgKzI1NSwxMyBAQAogc3RhdGljIGludCB1aW9fZGV2X2FkZF9hdHRyaWJ1dGVzKHN0cnVjdCB1aW9fZGV2aWNlICppZGV2KQogewogCWludCByZXQ7Ci0JaW50IG1pOworCWludCBtaSwgcGk7CiAJaW50IG1hcF9mb3VuZCA9IDA7CisJaW50IHBvcnRpb19mb3VuZCA9IDA7CiAJc3RydWN0IHVpb19tZW0gKm1lbTsKIAlzdHJ1Y3QgdWlvX21hcCAqbWFwOworCXN0cnVjdCB1aW9fcG9ydCAqcG9ydDsKKwlzdHJ1Y3QgdWlvX3BvcnRpbyAqcG9ydGlvOwogCiAJcmV0ID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZpZGV2LT5kZXYtPmtvYmosICZ1aW9fYXR0cl9ncnApOwogCWlmIChyZXQpCkBAIC0xOTUsMjUgKzI3Niw1OCBAQAogCQkJaWRldi0+bWFwX2RpciA9IGtvYmplY3RfY3JlYXRlX2FuZF9hZGQoIm1hcHMiLAogCQkJCQkJCSZpZGV2LT5kZXYtPmtvYmopOwogCQkJaWYgKCFpZGV2LT5tYXBfZGlyKQotCQkJCWdvdG8gZXJyOworCQkJCWdvdG8gZXJyX21hcDsKIAkJfQogCQltYXAgPSBremFsbG9jKHNpemVvZigqbWFwKSwgR0ZQX0tFUk5FTCk7CiAJCWlmICghbWFwKQotCQkJZ290byBlcnI7CisJCQlnb3RvIGVycl9tYXA7CiAJCWtvYmplY3RfaW5pdCgmbWFwLT5rb2JqLCAmbWFwX2F0dHJfdHlwZSk7CiAJCW1hcC0+bWVtID0gbWVtOwogCQltZW0tPm1hcCA9IG1hcDsKIAkJcmV0ID0ga29iamVjdF9hZGQoJm1hcC0+a29iaiwgaWRldi0+bWFwX2RpciwgIm1hcCVkIiwgbWkpOwogCQlpZiAocmV0KQotCQkJZ290byBlcnI7CisJCQlnb3RvIGVycl9tYXA7CiAJCXJldCA9IGtvYmplY3RfdWV2ZW50KCZtYXAtPmtvYmosIEtPQkpfQUREKTsKIAkJaWYgKHJldCkKLQkJCWdvdG8gZXJyOworCQkJZ290byBlcnJfbWFwOworCX0KKworCWZvciAocGkgPSAwOyBwaSA8IE1BWF9VSU9fUE9SVF9SRUdJT05TOyBwaSsrKSB7CisJCXBvcnQgPSAmaWRldi0+aW5mby0+cG9ydFtwaV07CisJCWlmIChwb3J0LT5zaXplID09IDApCisJCQlicmVhazsKKwkJaWYgKCFwb3J0aW9fZm91bmQpIHsKKwkJCXBvcnRpb19mb3VuZCA9IDE7CisJCQlpZGV2LT5wb3J0aW9fZGlyID0ga29iamVjdF9jcmVhdGVfYW5kX2FkZCgicG9ydGlvIiwKKwkJCQkJCQkmaWRldi0+ZGV2LT5rb2JqKTsKKwkJCWlmICghaWRldi0+cG9ydGlvX2RpcikKKwkJCQlnb3RvIGVycl9wb3J0aW87CisJCX0KKwkJcG9ydGlvID0ga3phbGxvYyhzaXplb2YoKnBvcnRpbyksIEdGUF9LRVJORUwpOworCQlpZiAoIXBvcnRpbykKKwkJCWdvdG8gZXJyX3BvcnRpbzsKKwkJa29iamVjdF9pbml0KCZwb3J0aW8tPmtvYmosICZwb3J0aW9fYXR0cl90eXBlKTsKKwkJcG9ydGlvLT5wb3J0ID0gcG9ydDsKKwkJcG9ydC0+cG9ydGlvID0gcG9ydGlvOworCQlyZXQgPSBrb2JqZWN0X2FkZCgmcG9ydGlvLT5rb2JqLCBpZGV2LT5wb3J0aW9fZGlyLAorCQkJCQkJCSJwb3J0JWQiLCBwaSk7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycl9wb3J0aW87CisJCXJldCA9IGtvYmplY3RfdWV2ZW50KCZwb3J0aW8tPmtvYmosIEtPQkpfQUREKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyX3BvcnRpbzsKIAl9CiAKIAlyZXR1cm4gMDsKIAotZXJyOgorZXJyX3BvcnRpbzoKKwlmb3IgKHBpLS07IHBpID49IDA7IHBpLS0pIHsKKwkJcG9ydCA9ICZpZGV2LT5pbmZvLT5wb3J0W3BpXTsKKwkJcG9ydGlvID0gcG9ydC0+cG9ydGlvOworCQlrb2JqZWN0X3B1dCgmcG9ydGlvLT5rb2JqKTsKKwl9CisJa29iamVjdF9wdXQoaWRldi0+cG9ydGlvX2Rpcik7CitlcnJfbWFwOgogCWZvciAobWktLTsgbWk+PTA7IG1pLS0pIHsKIAkJbWVtID0gJmlkZXYtPmluZm8tPm1lbVttaV07CiAJCW1hcCA9IG1lbS0+bWFwOwpAQCAtMjI4LDE1ICszNDIsMjYgQEAKIAogc3RhdGljIHZvaWQgdWlvX2Rldl9kZWxfYXR0cmlidXRlcyhzdHJ1Y3QgdWlvX2RldmljZSAqaWRldikKIHsKLQlpbnQgbWk7CisJaW50IGk7CiAJc3RydWN0IHVpb19tZW0gKm1lbTsKLQlmb3IgKG1pID0gMDsgbWkgPCBNQVhfVUlPX01BUFM7IG1pKyspIHsKLQkJbWVtID0gJmlkZXYtPmluZm8tPm1lbVttaV07CisJc3RydWN0IHVpb19wb3J0ICpwb3J0OworCisJZm9yIChpID0gMDsgaSA8IE1BWF9VSU9fTUFQUzsgaSsrKSB7CisJCW1lbSA9ICZpZGV2LT5pbmZvLT5tZW1baV07CiAJCWlmIChtZW0tPnNpemUgPT0gMCkKIAkJCWJyZWFrOwogCQlrb2JqZWN0X3B1dCgmbWVtLT5tYXAtPmtvYmopOwogCX0KIAlrb2JqZWN0X3B1dChpZGV2LT5tYXBfZGlyKTsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhfVUlPX1BPUlRfUkVHSU9OUzsgaSsrKSB7CisJCXBvcnQgPSAmaWRldi0+aW5mby0+cG9ydFtpXTsKKwkJaWYgKHBvcnQtPnNpemUgPT0gMCkKKwkJCWJyZWFrOworCQlrb2JqZWN0X3B1dCgmcG9ydC0+cG9ydGlvLT5rb2JqKTsKKwl9CisJa29iamVjdF9wdXQoaWRldi0+cG9ydGlvX2Rpcik7CisKIAlzeXNmc19yZW1vdmVfZ3JvdXAoJmlkZXYtPmRldi0+a29iaiwgJnVpb19hdHRyX2dycCk7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdWlvL3Vpb19jaWYuYyBiL2RyaXZlcnMvdWlvL3Vpb19jaWYuYwppbmRleCA1NzM3NjA2Li5jNjBiOGZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Vpby91aW9fY2lmLmMKKysrIGIvZHJpdmVycy91aW8vdWlvX2NpZi5jCkBAIC01Nyw4ICs1Nyw3IEBACiAJaW5mby0+bWVtWzBdLmFkZHIgPSBwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2LCAwKTsKIAlpZiAoIWluZm8tPm1lbVswXS5hZGRyKQogCQlnb3RvIG91dF9yZWxlYXNlOwotCWluZm8tPm1lbVswXS5pbnRlcm5hbF9hZGRyID0gaW9yZW1hcChwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2LCAwKSwKLQkJCQkJICAgICBwY2lfcmVzb3VyY2VfbGVuKGRldiwgMCkpOworCWluZm8tPm1lbVswXS5pbnRlcm5hbF9hZGRyID0gcGNpX2lvcmVtYXBfYmFyKGRldiwgMCk7CiAJaWYgKCFpbmZvLT5tZW1bMF0uaW50ZXJuYWxfYWRkcikKIAkJZ290byBvdXRfcmVsZWFzZTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91aW8vdWlvX3BkcnZfZ2VuaXJxLmMgYi9kcml2ZXJzL3Vpby91aW9fcGRydl9nZW5pcnEuYwppbmRleCAxZjgyYzgzLi4zZjA2ODE4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Vpby91aW9fcGRydl9nZW5pcnEuYworKysgYi9kcml2ZXJzL3Vpby91aW9fcGRydl9nZW5pcnEuYwpAQCAtODEsNyArODEsOCBAQAogCQlnb3RvIGJhZDA7CiAJfQogCi0JaWYgKHVpb2luZm8tPmhhbmRsZXIgfHwgdWlvaW5mby0+aXJxY29udHJvbCB8fCB1aW9pbmZvLT5pcnFfZmxhZ3MpIHsKKwlpZiAodWlvaW5mby0+aGFuZGxlciB8fCB1aW9pbmZvLT5pcnFjb250cm9sIHx8CisJICAgIHVpb2luZm8tPmlycV9mbGFncyAmIElSUUZfU0hBUkVEKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgImludGVycnVwdCBjb25maWd1cmF0aW9uIGVycm9yXG4iKTsKIAkJZ290byBiYWQwOwogCX0KQEAgLTEzMiw3ICsxMzMsNyBAQAogCSAqIEludGVycnVwdCBzaGFyaW5nIGlzIG5vdCBzdXBwb3J0ZWQuCiAJICovCiAKLQl1aW9pbmZvLT5pcnFfZmxhZ3MgPSBJUlFGX0RJU0FCTEVEOworCXVpb2luZm8tPmlycV9mbGFncyB8PSBJUlFGX0RJU0FCTEVEOwogCXVpb2luZm8tPmhhbmRsZXIgPSB1aW9fcGRydl9nZW5pcnFfaGFuZGxlcjsKIAl1aW9pbmZvLT5pcnFjb250cm9sID0gdWlvX3BkcnZfZ2VuaXJxX2lycWNvbnRyb2w7CiAJdWlvaW5mby0+cHJpdiA9IHByaXY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9LY29uZmlnIGIvZHJpdmVycy91c2IvS2NvbmZpZwppbmRleCAyODlkODFhLi44M2JhYmIwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9LY29uZmlnCisrKyBiL2RyaXZlcnMvdXNiL0tjb25maWcKQEAgLTE1MCw0ICsxNTAsNiBAQAogCiBzb3VyY2UgImRyaXZlcnMvdXNiL2dhZGdldC9LY29uZmlnIgogCitzb3VyY2UgImRyaXZlcnMvdXNiL290Zy9LY29uZmlnIgorCiBlbmRpZiAjIFVTQl9TVVBQT1JUCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jbGFzcy9jZGMtYWNtLmMgYi9kcml2ZXJzL3VzYi9jbGFzcy9jZGMtYWNtLmMKaW5kZXggZDUwYTk5Zi4uMDBiNDdlYSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY2xhc3MvY2RjLWFjbS5jCisrKyBiL2RyaXZlcnMvdXNiL2NsYXNzL2NkYy1hY20uYwpAQCAtMTI3NSw3ICsxMjc1LDcgQEAKIAlzdHJ1Y3QgYWNtICphY20gPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOwogCWludCBjbnQ7CiAKLQlpZiAoYWNtLT5kZXYtPmF1dG9fcG0pIHsKKwlpZiAobWVzc2FnZS5ldmVudCAmIFBNX0VWRU5UX0FVVE8pIHsKIAkJaW50IGI7CiAKIAkJc3Bpbl9sb2NrX2lycSgmYWNtLT5yZWFkX2xvY2spOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY2xhc3MvY2RjLXdkbS5jIGIvZHJpdmVycy91c2IvY2xhc3MvY2RjLXdkbS5jCmluZGV4IDVhOGVjYzAuLjM3NzFkNmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NsYXNzL2NkYy13ZG0uYworKysgYi9kcml2ZXJzL3VzYi9jbGFzcy9jZGMtd2RtLmMKQEAgLTc2NCw3ICs3NjQsOCBAQAogCiAJbXV0ZXhfbG9jaygmZGVzYy0+cGxvY2spOwogI2lmZGVmIENPTkZJR19QTQotCWlmIChpbnRlcmZhY2VfdG9fdXNiZGV2KGRlc2MtPmludGYpLT5hdXRvX3BtICYmIHRlc3RfYml0KFdETV9JTl9VU0UsICZkZXNjLT5mbGFncykpIHsKKwlpZiAoKG1lc3NhZ2UuZXZlbnQgJiBQTV9FVkVOVF9BVVRPKSAmJgorCQkJdGVzdF9iaXQoV0RNX0lOX1VTRSwgJmRlc2MtPmZsYWdzKSkgewogCQlydiA9IC1FQlVTWTsKIAl9IGVsc2UgewogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jbGFzcy91c2J0bWMuYyBiL2RyaXZlcnMvdXNiL2NsYXNzL3VzYnRtYy5jCmluZGV4IDQzYTg2M2MuLjBmNWMwNWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NsYXNzL3VzYnRtYy5jCisrKyBiL2RyaXZlcnMvdXNiL2NsYXNzL3VzYnRtYy5jCkBAIC0yMSw2ICsyMSw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CiAjaW5jbHVkZSA8bGludXgva3JlZi5oPgpAQCAtNDgyLDcgKzQ4Myw2IEBACiAJaW50IHJldHZhbDsKIAlpbnQgYWN0dWFsOwogCXVuc2lnbmVkIGxvbmcgaW50IG5fYnl0ZXM7Ci0JaW50IG47CiAJaW50IHJlbWFpbmluZzsKIAlpbnQgZG9uZTsKIAlpbnQgdGhpc19wYXJ0OwpAQCAtNTI2LDExICs1MjYsOCBAQAogCQkJZ290byBleGl0OwogCQl9CiAKLQkJbl9ieXRlcyA9IDEyICsgdGhpc19wYXJ0OwotCQlpZiAodGhpc19wYXJ0ICUgNCkKLQkJCW5fYnl0ZXMgKz0gNCAtIHRoaXNfcGFydCAlIDQ7Ci0JCQlmb3IgKG4gPSAxMiArIHRoaXNfcGFydDsgbiA8IG5fYnl0ZXM7IG4rKykKLQkJCQlidWZmZXJbbl0gPSAwOworCQluX2J5dGVzID0gcm91bmR1cCgxMiArIHRoaXNfcGFydCwgNCk7CisJCW1lbXNldChidWZmZXIgKyAxMiArIHRoaXNfcGFydCwgMCwgbl9ieXRlcyAtICgxMiArIHRoaXNfcGFydCkpOwogCiAJCXJldHZhbCA9IHVzYl9idWxrX21zZyhkYXRhLT51c2JfZGV2LAogCQkJCSAgICAgIHVzYl9zbmRidWxrcGlwZShkYXRhLT51c2JfZGV2LApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY29yZS9kZXZpby5jIGIvZHJpdmVycy91c2IvY29yZS9kZXZpby5jCmluZGV4IGFhNzkyODAuLjI2ZmVjZTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NvcmUvZGV2aW8uYworKysgYi9kcml2ZXJzL3VzYi9jb3JlL2RldmlvLmMKQEAgLTk4MSw5ICs5ODEsNiBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAlpZiAoIXV1cmItPmJ1ZmZlcikKIAkJcmV0dXJuIC1FSU5WQUw7Ci0JaWYgKHV1cmItPnNpZ25yICE9IDAgJiYgKHV1cmItPnNpZ25yIDwgU0lHUlRNSU4gfHwKLQkJCQkgdXVyYi0+c2lnbnIgPiBTSUdSVE1BWCkpCi0JCXJldHVybiAtRUlOVkFMOwogCWlmICghKHV1cmItPnR5cGUgPT0gVVNCREVWRlNfVVJCX1RZUEVfQ09OVFJPTCAmJgogCSAgICAodXVyYi0+ZW5kcG9pbnQgJiB+VVNCX0VORFBPSU5UX0RJUl9NQVNLKSA9PSAwKSkgewogCQlpZm51bSA9IGZpbmRpbnRmZXAocHMtPmRldiwgdXVyYi0+ZW5kcG9pbnQpOwpAQCAtMTMyMCw3ICsxMzE3LDcgQEAKIAlpZiAoX19nZXRfdXNlcih1cHRyLCAmdXVyYi0+YnVmZmVyKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJa3VyYi0+YnVmZmVyID0gY29tcGF0X3B0cih1cHRyKTsKLQlpZiAoX19nZXRfdXNlcih1cHRyLCAmdXVyYi0+YnVmZmVyKSkKKwlpZiAoX19nZXRfdXNlcih1cHRyLCAmdXVyYi0+dXNlcmNvbnRleHQpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAlrdXJiLT51c2VyY29udGV4dCA9IGNvbXBhdF9wdHIodXB0cik7CiAKQEAgLTE0MDEsOCArMTM5OCw2IEBACiAKIAlpZiAoY29weV9mcm9tX3VzZXIoJmRzLCBhcmcsIHNpemVvZihkcykpKQogCQlyZXR1cm4gLUVGQVVMVDsKLQlpZiAoZHMuc2lnbnIgIT0gMCAmJiAoZHMuc2lnbnIgPCBTSUdSVE1JTiB8fCBkcy5zaWduciA+IFNJR1JUTUFYKSkKLQkJcmV0dXJuIC1FSU5WQUw7CiAJcHMtPmRpc2NzaWduciA9IGRzLnNpZ25yOwogCXBzLT5kaXNjY29udGV4dCA9IGRzLmNvbnRleHQ7CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jb3JlL2RyaXZlci5jIGIvZHJpdmVycy91c2IvY29yZS9kcml2ZXIuYwppbmRleCA4YzA4MTMwLi45ODc2MDU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jb3JlL2RyaXZlci5jCisrKyBiL2RyaXZlcnMvdXNiL2NvcmUvZHJpdmVyLmMKQEAgLTE4NCw2ICsxODQsMjAgQEAKIAlyZXR1cm4gMDsKIH0KIAorLyoKKyAqIENhbmNlbCBhbnkgcGVuZGluZyBzY2hlZHVsZWQgcmVzZXRzCisgKgorICogW3NlZSB1c2JfcXVldWVfcmVzZXRfZGV2aWNlKCldCisgKgorICogQ2FsbGVkIGFmdGVyIHVuY29uZmlndXJpbmcgLyB3aGVuIHJlbGVhc2luZyBpbnRlcmZhY2VzLiBTZWUKKyAqIGNvbW1lbnRzIGluIF9fdXNiX3F1ZXVlX3Jlc2V0X2RldmljZSgpIHJlZ2FyZGluZworICogdWRldi0+cmVzZXRfcnVubmluZy4KKyAqLworc3RhdGljIHZvaWQgdXNiX2NhbmNlbF9xdWV1ZWRfcmVzZXQoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmlmYWNlKQoreworCWlmIChpZmFjZS0+cmVzZXRfcnVubmluZyA9PSAwKQorCQljYW5jZWxfd29ya19zeW5jKCZpZmFjZS0+cmVzZXRfd3MpOworfQogCiAvKiBjYWxsZWQgZnJvbSBkcml2ZXIgY29yZSB3aXRoIGRldiBsb2NrZWQgKi8KIHN0YXRpYyBpbnQgdXNiX3Byb2JlX2ludGVyZmFjZShzdHJ1Y3QgZGV2aWNlICpkZXYpCkBAIC0yNDIsNiArMjU2LDcgQEAKIAkJCW1hcmtfcXVpZXNjZWQoaW50Zik7CiAJCQlpbnRmLT5uZWVkc19yZW1vdGVfd2FrZXVwID0gMDsKIAkJCWludGYtPmNvbmRpdGlvbiA9IFVTQl9JTlRFUkZBQ0VfVU5CT1VORDsKKwkJCXVzYl9jYW5jZWxfcXVldWVkX3Jlc2V0KGludGYpOwogCQl9IGVsc2UKIAkJCWludGYtPmNvbmRpdGlvbiA9IFVTQl9JTlRFUkZBQ0VfQk9VTkQ7CiAKQEAgLTI3Miw2ICsyODcsNyBAQAogCQl1c2JfZGlzYWJsZV9pbnRlcmZhY2UodWRldiwgaW50Zik7CiAKIAlkcml2ZXItPmRpc2Nvbm5lY3QoaW50Zik7CisJdXNiX2NhbmNlbF9xdWV1ZWRfcmVzZXQoaW50Zik7CiAKIAkvKiBSZXNldCBvdGhlciBpbnRlcmZhY2Ugc3RhdGUuCiAJICogV2UgY2Fubm90IGRvIGEgU2V0LUludGVyZmFjZSBpZiB0aGUgZGV2aWNlIGlzIHN1c3BlbmRlZCBvcgpAQCAtMjc5LDkgKzI5NSwxMiBAQAogCSAqIGFsdHNldHRpbmcgbWVhbnMgY3JlYXRpbmcgbmV3IGVuZHBvaW50IGRldmljZSBlbnRyaWVzKS4KIAkgKiBXaGVuIGVpdGhlciBvZiB0aGVzZSBoYXBwZW5zLCBkZWZlciB0aGUgU2V0LUludGVyZmFjZS4KIAkgKi8KLQlpZiAoaW50Zi0+Y3VyX2FsdHNldHRpbmctPmRlc2MuYkFsdGVybmF0ZVNldHRpbmcgPT0gMCkKLQkJOwkvKiBBbHJlYWR5IGluIGFsdHNldHRpbmcgMCBzbyBza2lwIFNldC1JbnRlcmZhY2UgKi8KLQllbHNlIGlmICghZXJyb3IgJiYgaW50Zi0+ZGV2LnBvd2VyLnN0YXR1cyA9PSBEUE1fT04pCisJaWYgKGludGYtPmN1cl9hbHRzZXR0aW5nLT5kZXNjLmJBbHRlcm5hdGVTZXR0aW5nID09IDApIHsKKwkJLyogQWxyZWFkeSBpbiBhbHRzZXR0aW5nIDAgc28gc2tpcCBTZXQtSW50ZXJmYWNlLgorCQkgKiBKdXN0IHJlLWVuYWJsZSBpdCB3aXRob3V0IGFmZmVjdGluZyB0aGUgZW5kcG9pbnQgdG9nZ2xlcy4KKwkJICovCisJCXVzYl9lbmFibGVfaW50ZXJmYWNlKHVkZXYsIGludGYsIGZhbHNlKTsKKwl9IGVsc2UgaWYgKCFlcnJvciAmJiBpbnRmLT5kZXYucG93ZXIuc3RhdHVzID09IERQTV9PTikKIAkJdXNiX3NldF9pbnRlcmZhY2UodWRldiwgaW50Zi0+YWx0c2V0dGluZ1swXS4KIAkJCQlkZXNjLmJJbnRlcmZhY2VOdW1iZXIsIDApOwogCWVsc2UKQEAgLTM4MCw4ICszOTksMTAgQEAKIAlpZiAoZGV2aWNlX2lzX3JlZ2lzdGVyZWQoZGV2KSkgewogCQlpZmFjZS0+Y29uZGl0aW9uID0gVVNCX0lOVEVSRkFDRV9VTkJJTkRJTkc7CiAJCWRldmljZV9yZWxlYXNlX2RyaXZlcihkZXYpOworCX0gZWxzZSB7CisJCWlmYWNlLT5jb25kaXRpb24gPSBVU0JfSU5URVJGQUNFX1VOQk9VTkQ7CisJCXVzYl9jYW5jZWxfcXVldWVkX3Jlc2V0KGlmYWNlKTsKIAl9Ci0KIAlkZXYtPmRyaXZlciA9IE5VTEw7CiAJdXNiX3NldF9pbnRmZGF0YShpZmFjZSwgTlVMTCk7CiAKQEAgLTkwNCw3ICs5MjUsNyBAQAogfQogCiAvKiBDYWxsZXIgaGFzIGxvY2tlZCB1ZGV2J3MgcG1fbXV0ZXggKi8KLXN0YXRpYyBpbnQgdXNiX3Jlc3VtZV9kZXZpY2Uoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYpCitzdGF0aWMgaW50IHVzYl9yZXN1bWVfZGV2aWNlKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2LCBwbV9tZXNzYWdlX3QgbXNnKQogewogCXN0cnVjdCB1c2JfZGV2aWNlX2RyaXZlcgkqdWRyaXZlcjsKIAlpbnQJCQkJc3RhdHVzID0gMDsKQEAgLTkyMiw3ICs5NDMsNyBAQAogCQl1ZGV2LT5yZXNldF9yZXN1bWUgPSAxOwogCiAJdWRyaXZlciA9IHRvX3VzYl9kZXZpY2VfZHJpdmVyKHVkZXYtPmRldi5kcml2ZXIpOwotCXN0YXR1cyA9IHVkcml2ZXItPnJlc3VtZSh1ZGV2KTsKKwlzdGF0dXMgPSB1ZHJpdmVyLT5yZXN1bWUodWRldiwgbXNnKTsKIAogIGRvbmU6CiAJZGV2X3ZkYmcoJnVkZXYtPmRldiwgIiVzOiBzdGF0dXMgJWRcbiIsIF9fZnVuY19fLCBzdGF0dXMpOwpAQCAtOTQyLDcgKzk2Myw4IEBACiAJaWYgKHVkZXYtPnN0YXRlID09IFVTQl9TVEFURV9OT1RBVFRBQ0hFRCB8fCAhaXNfYWN0aXZlKGludGYpKQogCQlnb3RvIGRvbmU7CiAKLQlpZiAoaW50Zi0+Y29uZGl0aW9uID09IFVTQl9JTlRFUkZBQ0VfVU5CT1VORCkJLyogVGhpcyBjYW4ndCBoYXBwZW4gKi8KKwkvKiBUaGlzIGNhbiBoYXBwZW47IHNlZSB1c2JfZHJpdmVyX3JlbGVhc2VfaW50ZXJmYWNlKCkgKi8KKwlpZiAoaW50Zi0+Y29uZGl0aW9uID09IFVTQl9JTlRFUkZBQ0VfVU5CT1VORCkKIAkJZ290byBkb25lOwogCWRyaXZlciA9IHRvX3VzYl9kcml2ZXIoaW50Zi0+ZGV2LmRyaXZlcik7CiAKQEAgLTk1MCw3ICs5NzIsNyBAQAogCQlzdGF0dXMgPSBkcml2ZXItPnN1c3BlbmQoaW50ZiwgbXNnKTsKIAkJaWYgKHN0YXR1cyA9PSAwKQogCQkJbWFya19xdWllc2NlZChpbnRmKTsKLQkJZWxzZSBpZiAoIXVkZXYtPmF1dG9fcG0pCisJCWVsc2UgaWYgKCEobXNnLmV2ZW50ICYgUE1fRVZFTlRfQVVUTykpCiAJCQlkZXZfZXJyKCZpbnRmLT5kZXYsICIlcyBlcnJvciAlZFxuIiwKIAkJCQkJInN1c3BlbmQiLCBzdGF0dXMpOwogCX0gZWxzZSB7CkBAIC05NjgsNyArOTkwLDcgQEAKIAogLyogQ2FsbGVyIGhhcyBsb2NrZWQgaW50ZidzIHVzYl9kZXZpY2UncyBwbV9tdXRleCAqLwogc3RhdGljIGludCB1c2JfcmVzdW1lX2ludGVyZmFjZShzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiwKLQkJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsIGludCByZXNldF9yZXN1bWUpCisJCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLCBwbV9tZXNzYWdlX3QgbXNnLCBpbnQgcmVzZXRfcmVzdW1lKQogewogCXN0cnVjdCB1c2JfZHJpdmVyCSpkcml2ZXI7CiAJaW50CQkJc3RhdHVzID0gMDsKQEAgLTEwOTIsNyArMTExNCw3IEBACiAJaWYgKHJlc2NoZWR1bGUpIHsKIAkJaWYgKCF0aW1lcl9wZW5kaW5nKCZ1ZGV2LT5hdXRvc3VzcGVuZC50aW1lcikpIHsKIAkJCXF1ZXVlX2RlbGF5ZWRfd29yayhrc3VzcGVuZF91c2Jfd3EsICZ1ZGV2LT5hdXRvc3VzcGVuZCwKLQkJCQlyb3VuZF9qaWZmaWVzX3JlbGF0aXZlKHN1c3BlbmRfdGltZSAtIGopKTsKKwkJCQlyb3VuZF9qaWZmaWVzX3VwX3JlbGF0aXZlKHN1c3BlbmRfdGltZSAtIGopKTsKIAkJfQogCQlyZXR1cm4gLUVBR0FJTjsKIAl9CkBAIC0xMTE5LDEwICsxMTQxLDkgQEAKICAqIGFsbCB0aGUgaW50ZXJmYWNlcyB3aGljaCB3ZXJlIHN1c3BlbmRlZCBhcmUgcmVzdW1lZCBzbyB0aGF0IHRoZXkgcmVtYWluCiAgKiBpbiB0aGUgc2FtZSBzdGF0ZSBhcyB0aGUgZGV2aWNlLgogICoKLSAqIElmIGFuIGF1dG9zdXNwZW5kIGlzIGluIHByb2dyZXNzIChAdWRldi0+YXV0b19wbSBpcyBzZXQpLCB0aGUgcm91dGluZQotICogY2hlY2tzIGZpcnN0IHRvIG1ha2Ugc3VyZSB0aGF0IG5laXRoZXIgdGhlIGRldmljZSBpdHNlbGYgb3IgYW55IG9mIGl0cwotICogYWN0aXZlIGludGVyZmFjZXMgaXMgaW4gdXNlIChwbV91c2FnZV9jbnQgaXMgZ3JlYXRlciB0aGFuIDApLiAgSWYgdGhleQotICogYXJlLCB0aGUgYXV0b3N1c3BlbmQgZmFpbHMuCisgKiBJZiBhbiBhdXRvc3VzcGVuZCBpcyBpbiBwcm9ncmVzcyB0aGUgcm91dGluZSBjaGVja3MgZmlyc3QgdG8gbWFrZSBzdXJlCisgKiB0aGF0IG5laXRoZXIgdGhlIGRldmljZSBpdHNlbGYgb3IgYW55IG9mIGl0cyBhY3RpdmUgaW50ZXJmYWNlcyBpcyBpbiB1c2UKKyAqIChwbV91c2FnZV9jbnQgaXMgZ3JlYXRlciB0aGFuIDApLiAgSWYgdGhleSBhcmUsIHRoZSBhdXRvc3VzcGVuZCBmYWlscy4KICAqCiAgKiBJZiB0aGUgc3VzcGVuZCBzdWNjZWVkcywgdGhlIHJvdXRpbmUgcmVjdXJzaXZlbHkgcXVldWVzIGFuIGF1dG9zdXNwZW5kCiAgKiByZXF1ZXN0IGZvciBAdWRldidzIHBhcmVudCBkZXZpY2UsIHRoZXJlYnkgcHJvcGFnYXRpbmcgdGhlIGNoYW5nZSB1cApAQCAtMTE1Nyw3ICsxMTc4LDcgQEAKIAogCXVkZXYtPmRvX3JlbW90ZV93YWtldXAgPSBkZXZpY2VfbWF5X3dha2V1cCgmdWRldi0+ZGV2KTsKIAotCWlmICh1ZGV2LT5hdXRvX3BtKSB7CisJaWYgKG1zZy5ldmVudCAmIFBNX0VWRU5UX0FVVE8pIHsKIAkJc3RhdHVzID0gYXV0b3N1c3BlbmRfY2hlY2sodWRldiwgMCk7CiAJCWlmIChzdGF0dXMgPCAwKQogCQkJZ290byBkb25lOwpAQCAtMTE3NywxMyArMTE5OCwxNiBAQAogCiAJLyogSWYgdGhlIHN1c3BlbmQgZmFpbGVkLCByZXN1bWUgaW50ZXJmYWNlcyB0aGF0IGRpZCBnZXQgc3VzcGVuZGVkICovCiAJaWYgKHN0YXR1cyAhPSAwKSB7CisJCXBtX21lc3NhZ2VfdCBtc2cyOworCisJCW1zZzIuZXZlbnQgPSBtc2cuZXZlbnQgXiAoUE1fRVZFTlRfU1VTUEVORCB8IFBNX0VWRU5UX1JFU1VNRSk7CiAJCXdoaWxlICgtLWkgPj0gMCkgewogCQkJaW50ZiA9IHVkZXYtPmFjdGNvbmZpZy0+aW50ZXJmYWNlW2ldOwotCQkJdXNiX3Jlc3VtZV9pbnRlcmZhY2UodWRldiwgaW50ZiwgMCk7CisJCQl1c2JfcmVzdW1lX2ludGVyZmFjZSh1ZGV2LCBpbnRmLCBtc2cyLCAwKTsKIAkJfQogCiAJCS8qIFRyeSBhbm90aGVyIGF1dG9zdXNwZW5kIHdoZW4gdGhlIGludGVyZmFjZXMgYXJlbid0IGJ1c3kgKi8KLQkJaWYgKHVkZXYtPmF1dG9fcG0pCisJCWlmIChtc2cuZXZlbnQgJiBQTV9FVkVOVF9BVVRPKQogCQkJYXV0b3N1c3BlbmRfY2hlY2sodWRldiwgc3RhdHVzID09IC1FQlVTWSk7CiAKIAkvKiBJZiB0aGUgc3VzcGVuZCBzdWNjZWVkZWQgdGhlbiBwcmV2ZW50IGFueSBtb3JlIFVSQiBzdWJtaXNzaW9ucywKQEAgLTEyMTMsNiArMTIzNyw3IEBACiAvKioKICAqIHVzYl9yZXN1bWVfYm90aCAtIHJlc3VtZSBhIFVTQiBkZXZpY2UgYW5kIGl0cyBpbnRlcmZhY2VzCiAgKiBAdWRldjogdGhlIHVzYl9kZXZpY2UgdG8gcmVzdW1lCisgKiBAbXNnOiBQb3dlciBNYW5hZ2VtZW50IG1lc3NhZ2UgZGVzY3JpYmluZyB0aGlzIHN0YXRlIHRyYW5zaXRpb24KICAqCiAgKiBUaGlzIGlzIHRoZSBjZW50cmFsIHJvdXRpbmUgZm9yIHJlc3VtaW5nIFVTQiBkZXZpY2VzLiAgSXQgY2FsbHMgdGhlCiAgKiB0aGUgcmVzdW1lIG1ldGhvZCBmb3IgQHVkZXYgYW5kIHRoZW4gY2FsbHMgdGhlIHJlc3VtZSBtZXRob2RzIGZvciBhbGwKQEAgLTEyMzgsNyArMTI2Myw3IEBACiAgKgogICogVGhpcyByb3V0aW5lIGNhbiBydW4gb25seSBpbiBwcm9jZXNzIGNvbnRleHQuCiAgKi8KLXN0YXRpYyBpbnQgdXNiX3Jlc3VtZV9ib3RoKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2KQorc3RhdGljIGludCB1c2JfcmVzdW1lX2JvdGgoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYsIHBtX21lc3NhZ2VfdCBtc2cpCiB7CiAJaW50CQkJc3RhdHVzID0gMDsKIAlpbnQJCQlpOwpAQCAtMTI1NCwxNCArMTI3OSwxNSBAQAogCiAJLyogUHJvcGFnYXRlIHRoZSByZXN1bWUgdXAgdGhlIHRyZWUsIGlmIG5lY2Vzc2FyeSAqLwogCWlmICh1ZGV2LT5zdGF0ZSA9PSBVU0JfU1RBVEVfU1VTUEVOREVEKSB7Ci0JCWlmICh1ZGV2LT5hdXRvX3BtICYmIHVkZXYtPmF1dG9yZXN1bWVfZGlzYWJsZWQpIHsKKwkJaWYgKChtc2cuZXZlbnQgJiBQTV9FVkVOVF9BVVRPKSAmJgorCQkJCXVkZXYtPmF1dG9yZXN1bWVfZGlzYWJsZWQpIHsKIAkJCXN0YXR1cyA9IC1FUEVSTTsKIAkJCWdvdG8gZG9uZTsKIAkJfQogCQlpZiAocGFyZW50KSB7CiAJCQlzdGF0dXMgPSB1c2JfYXV0b3Jlc3VtZV9kZXZpY2UocGFyZW50KTsKIAkJCWlmIChzdGF0dXMgPT0gMCkgewotCQkJCXN0YXR1cyA9IHVzYl9yZXN1bWVfZGV2aWNlKHVkZXYpOworCQkJCXN0YXR1cyA9IHVzYl9yZXN1bWVfZGV2aWNlKHVkZXYsIG1zZyk7CiAJCQkJaWYgKHN0YXR1cyB8fCB1ZGV2LT5zdGF0ZSA9PQogCQkJCQkJVVNCX1NUQVRFX05PVEFUVEFDSEVEKSB7CiAJCQkJCXVzYl9hdXRvc3VzcGVuZF9kZXZpY2UocGFyZW50KTsKQEAgLTEyODQsMTUgKzEzMTAsMTYgQEAKIAkJCS8qIFdlIGNhbid0IHByb2dhZ2F0ZSBiZXlvbmQgdGhlIFVTQiBzdWJzeXN0ZW0sCiAJCQkgKiBzbyBpZiBhIHJvb3QgaHViJ3MgY29udHJvbGxlciBpcyBzdXNwZW5kZWQKIAkJCSAqIHRoZW4gd2UncmUgc3R1Y2suICovCi0JCQlzdGF0dXMgPSB1c2JfcmVzdW1lX2RldmljZSh1ZGV2KTsKKwkJCXN0YXR1cyA9IHVzYl9yZXN1bWVfZGV2aWNlKHVkZXYsIG1zZyk7CiAJCX0KIAl9IGVsc2UgaWYgKHVkZXYtPnJlc2V0X3Jlc3VtZSkKLQkJc3RhdHVzID0gdXNiX3Jlc3VtZV9kZXZpY2UodWRldik7CisJCXN0YXR1cyA9IHVzYl9yZXN1bWVfZGV2aWNlKHVkZXYsIG1zZyk7CiAKIAlpZiAoc3RhdHVzID09IDAgJiYgdWRldi0+YWN0Y29uZmlnKSB7CiAJCWZvciAoaSA9IDA7IGkgPCB1ZGV2LT5hY3Rjb25maWctPmRlc2MuYk51bUludGVyZmFjZXM7IGkrKykgewogCQkJaW50ZiA9IHVkZXYtPmFjdGNvbmZpZy0+aW50ZXJmYWNlW2ldOwotCQkJdXNiX3Jlc3VtZV9pbnRlcmZhY2UodWRldiwgaW50ZiwgdWRldi0+cmVzZXRfcmVzdW1lKTsKKwkJCXVzYl9yZXN1bWVfaW50ZXJmYWNlKHVkZXYsIGludGYsIG1zZywKKwkJCQkJdWRldi0+cmVzZXRfcmVzdW1lKTsKIAkJfQogCX0KIApAQCAtMTMyMCwxMyArMTM0NywxMyBAQAogCQl1ZGV2LT5sYXN0X2J1c3kgPSBqaWZmaWVzOwogCWlmIChpbmNfdXNhZ2VfY250ID49IDAgJiYgdWRldi0+cG1fdXNhZ2VfY250ID4gMCkgewogCQlpZiAodWRldi0+c3RhdGUgPT0gVVNCX1NUQVRFX1NVU1BFTkRFRCkKLQkJCXN0YXR1cyA9IHVzYl9yZXN1bWVfYm90aCh1ZGV2KTsKKwkJCXN0YXR1cyA9IHVzYl9yZXN1bWVfYm90aCh1ZGV2LCBQTVNHX0FVVE9fUkVTVU1FKTsKIAkJaWYgKHN0YXR1cyAhPSAwKQogCQkJdWRldi0+cG1fdXNhZ2VfY250IC09IGluY191c2FnZV9jbnQ7CiAJCWVsc2UgaWYgKGluY191c2FnZV9jbnQpCiAJCQl1ZGV2LT5sYXN0X2J1c3kgPSBqaWZmaWVzOwogCX0gZWxzZSBpZiAoaW5jX3VzYWdlX2NudCA8PSAwICYmIHVkZXYtPnBtX3VzYWdlX2NudCA8PSAwKSB7Ci0JCXN0YXR1cyA9IHVzYl9zdXNwZW5kX2JvdGgodWRldiwgUE1TR19TVVNQRU5EKTsKKwkJc3RhdHVzID0gdXNiX3N1c3BlbmRfYm90aCh1ZGV2LCBQTVNHX0FVVE9fU1VTUEVORCk7CiAJfQogCXVzYl9wbV91bmxvY2sodWRldik7CiAJcmV0dXJuIHN0YXR1czsKQEAgLTEzNDEsNiArMTM2OCwxOSBAQAogCXVzYl9hdXRvcG1fZG9fZGV2aWNlKHVkZXYsIDApOwogfQogCisvKiB1c2JfYXV0b3Jlc3VtZV93b3JrIC0gY2FsbGJhY2sgcm91dGluZSB0byBhdXRvcmVzdW1lIGEgVVNCIGRldmljZSAqLwordm9pZCB1c2JfYXV0b3Jlc3VtZV93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgdXNiX2RldmljZSwgYXV0b3Jlc3VtZSk7CisKKwkvKiBXYWtlIGl0IHVwLCBsZXQgdGhlIGRyaXZlcnMgZG8gdGhlaXIgdGhpbmcsIGFuZCB0aGVuIHB1dCBpdAorCSAqIGJhY2sgdG8gc2xlZXAuCisJICovCisJaWYgKHVzYl9hdXRvcG1fZG9fZGV2aWNlKHVkZXYsIDEpID09IDApCisJCXVzYl9hdXRvcG1fZG9fZGV2aWNlKHVkZXYsIC0xKTsKK30KKwogLyoqCiAgKiB1c2JfYXV0b3N1c3BlbmRfZGV2aWNlIC0gZGVsYXllZCBhdXRvc3VzcGVuZCBvZiBhIFVTQiBkZXZpY2UgYW5kIGl0cyBpbnRlcmZhY2VzCiAgKiBAdWRldjogdGhlIHVzYl9kZXZpY2UgdG8gYXV0b3N1c3BlbmQKQEAgLTE0MzcsMTMgKzE0NzcsMTQgQEAKIAkJdWRldi0+bGFzdF9idXN5ID0gamlmZmllczsKIAkJaWYgKGluY191c2FnZV9jbnQgPj0gMCAmJiBpbnRmLT5wbV91c2FnZV9jbnQgPiAwKSB7CiAJCQlpZiAodWRldi0+c3RhdGUgPT0gVVNCX1NUQVRFX1NVU1BFTkRFRCkKLQkJCQlzdGF0dXMgPSB1c2JfcmVzdW1lX2JvdGgodWRldik7CisJCQkJc3RhdHVzID0gdXNiX3Jlc3VtZV9ib3RoKHVkZXYsCisJCQkJCQlQTVNHX0FVVE9fUkVTVU1FKTsKIAkJCWlmIChzdGF0dXMgIT0gMCkKIAkJCQlpbnRmLT5wbV91c2FnZV9jbnQgLT0gaW5jX3VzYWdlX2NudDsKIAkJCWVsc2UKIAkJCQl1ZGV2LT5sYXN0X2J1c3kgPSBqaWZmaWVzOwogCQl9IGVsc2UgaWYgKGluY191c2FnZV9jbnQgPD0gMCAmJiBpbnRmLT5wbV91c2FnZV9jbnQgPD0gMCkgewotCQkJc3RhdHVzID0gdXNiX3N1c3BlbmRfYm90aCh1ZGV2LCBQTVNHX1NVU1BFTkQpOworCQkJc3RhdHVzID0gdXNiX3N1c3BlbmRfYm90aCh1ZGV2LCBQTVNHX0FVVE9fU1VTUEVORCk7CiAJCX0KIAl9CiAJdXNiX3BtX3VubG9jayh1ZGV2KTsKQEAgLTE0OTIsNiArMTUzMyw0NSBAQAogRVhQT1JUX1NZTUJPTF9HUEwodXNiX2F1dG9wbV9wdXRfaW50ZXJmYWNlKTsKIAogLyoqCisgKiB1c2JfYXV0b3BtX3B1dF9pbnRlcmZhY2VfYXN5bmMgLSBkZWNyZW1lbnQgYSBVU0IgaW50ZXJmYWNlJ3MgUE0tdXNhZ2UgY291bnRlcgorICogQGludGY6IHRoZSB1c2JfaW50ZXJmYWNlIHdob3NlIGNvdW50ZXIgc2hvdWxkIGJlIGRlY3JlbWVudGVkCisgKgorICogVGhpcyByb3V0aW5lIGRvZXMgZXNzZW50aWFsbHkgdGhlIHNhbWUgdGhpbmcgYXMKKyAqIHVzYl9hdXRvcG1fcHV0X2ludGVyZmFjZSgpOiBpdCBkZWNyZW1lbnRzIEBpbnRmJ3MgdXNhZ2UgY291bnRlciBhbmQKKyAqIHF1ZXVlcyBhIGRlbGF5ZWQgYXV0b3N1c3BlbmQgcmVxdWVzdCBpZiB0aGUgY291bnRlciBpcyA8PSAwLiAgVGhlCisgKiBkaWZmZXJlbmNlIGlzIHRoYXQgaXQgZG9lcyBub3QgYWNxdWlyZSB0aGUgZGV2aWNlJ3MgcG1fbXV0ZXg7CisgKiBjYWxsZXJzIG11c3QgaGFuZGxlIGFsbCBzeW5jaHJvbml6YXRpb24gaXNzdWVzIHRoZW1zZWx2ZXMuCisgKgorICogVHlwaWNhbGx5IGEgZHJpdmVyIHdvdWxkIGNhbGwgdGhpcyByb3V0aW5lIGR1cmluZyBhbiBVUkIncyBjb21wbGV0aW9uCisgKiBoYW5kbGVyLCBpZiBubyBtb3JlIFVSQnMgd2VyZSBwZW5kaW5nLgorICoKKyAqIFRoaXMgcm91dGluZSBjYW4gcnVuIGluIGF0b21pYyBjb250ZXh0LgorICovCit2b2lkIHVzYl9hdXRvcG1fcHV0X2ludGVyZmFjZV9hc3luYyhzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKK3sKKwlzdHJ1Y3QgdXNiX2RldmljZQkqdWRldiA9IGludGVyZmFjZV90b191c2JkZXYoaW50Zik7CisJaW50CQkJc3RhdHVzID0gMDsKKworCWlmIChpbnRmLT5jb25kaXRpb24gPT0gVVNCX0lOVEVSRkFDRV9VTkJPVU5EKSB7CisJCXN0YXR1cyA9IC1FTk9ERVY7CisJfSBlbHNlIHsKKwkJdWRldi0+bGFzdF9idXN5ID0gamlmZmllczsKKwkJLS1pbnRmLT5wbV91c2FnZV9jbnQ7CisJCWlmICh1ZGV2LT5hdXRvc3VzcGVuZF9kaXNhYmxlZCB8fCB1ZGV2LT5hdXRvc3VzcGVuZF9kZWxheSA8IDApCisJCQlzdGF0dXMgPSAtRVBFUk07CisJCWVsc2UgaWYgKGludGYtPnBtX3VzYWdlX2NudCA8PSAwICYmCisJCQkJIXRpbWVyX3BlbmRpbmcoJnVkZXYtPmF1dG9zdXNwZW5kLnRpbWVyKSkgeworCQkJcXVldWVfZGVsYXllZF93b3JrKGtzdXNwZW5kX3VzYl93cSwgJnVkZXYtPmF1dG9zdXNwZW5kLAorCQkJCQlyb3VuZF9qaWZmaWVzX3VwX3JlbGF0aXZlKAorCQkJCQkJdWRldi0+YXV0b3N1c3BlbmRfZGVsYXkpKTsKKwkJfQorCX0KKwlkZXZfdmRiZygmaW50Zi0+ZGV2LCAiJXM6IHN0YXR1cyAlZCBjbnQgJWRcbiIsCisJCQlfX2Z1bmNfXywgc3RhdHVzLCBpbnRmLT5wbV91c2FnZV9jbnQpOworfQorRVhQT1JUX1NZTUJPTF9HUEwodXNiX2F1dG9wbV9wdXRfaW50ZXJmYWNlX2FzeW5jKTsKKworLyoqCiAgKiB1c2JfYXV0b3BtX2dldF9pbnRlcmZhY2UgLSBpbmNyZW1lbnQgYSBVU0IgaW50ZXJmYWNlJ3MgUE0tdXNhZ2UgY291bnRlcgogICogQGludGY6IHRoZSB1c2JfaW50ZXJmYWNlIHdob3NlIGNvdW50ZXIgc2hvdWxkIGJlIGluY3JlbWVudGVkCiAgKgpAQCAtMTUzNyw2ICsxNjE3LDM3IEBACiBFWFBPUlRfU1lNQk9MX0dQTCh1c2JfYXV0b3BtX2dldF9pbnRlcmZhY2UpOwogCiAvKioKKyAqIHVzYl9hdXRvcG1fZ2V0X2ludGVyZmFjZV9hc3luYyAtIGluY3JlbWVudCBhIFVTQiBpbnRlcmZhY2UncyBQTS11c2FnZSBjb3VudGVyCisgKiBAaW50ZjogdGhlIHVzYl9pbnRlcmZhY2Ugd2hvc2UgY291bnRlciBzaG91bGQgYmUgaW5jcmVtZW50ZWQKKyAqCisgKiBUaGlzIHJvdXRpbmUgZG9lcyBtdWNoIHRoZSBzYW1lIHRoaW5nIGFzCisgKiB1c2JfYXV0b3BtX2dldF9pbnRlcmZhY2UoKTogaXQgaW5jcmVtZW50cyBAaW50ZidzIHVzYWdlIGNvdW50ZXIgYW5kCisgKiBxdWV1ZXMgYW4gYXV0b3Jlc3VtZSByZXF1ZXN0IGlmIHRoZSByZXN1bHQgaXMgPiAwLiAgVGhlIGRpZmZlcmVuY2VzCisgKiBhcmUgdGhhdCBpdCBkb2VzIG5vdCBhY3F1aXJlIHRoZSBkZXZpY2UncyBwbV9tdXRleCAoY2FsbGVycyBtdXN0CisgKiBoYW5kbGUgYWxsIHN5bmNocm9uaXphdGlvbiBpc3N1ZXMgdGhlbXNlbHZlcyksIGFuZCBpdCBkb2VzIG5vdAorICogYXV0b3Jlc3VtZSB0aGUgZGV2aWNlIGRpcmVjdGx5IChpdCBvbmx5IHF1ZXVlcyBhIHJlcXVlc3QpLiAgQWZ0ZXIgYQorICogc3VjY2Vzc2Z1bCBjYWxsLCB0aGUgZGV2aWNlIHdpbGwgZ2VuZXJhbGx5IG5vdCB5ZXQgYmUgcmVzdW1lZC4KKyAqCisgKiBUaGlzIHJvdXRpbmUgY2FuIHJ1biBpbiBhdG9taWMgY29udGV4dC4KKyAqLworaW50IHVzYl9hdXRvcG1fZ2V0X2ludGVyZmFjZV9hc3luYyhzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKK3sKKwlzdHJ1Y3QgdXNiX2RldmljZQkqdWRldiA9IGludGVyZmFjZV90b191c2JkZXYoaW50Zik7CisJaW50CQkJc3RhdHVzID0gMDsKKworCWlmIChpbnRmLT5jb25kaXRpb24gPT0gVVNCX0lOVEVSRkFDRV9VTkJPVU5EKQorCQlzdGF0dXMgPSAtRU5PREVWOworCWVsc2UgaWYgKHVkZXYtPmF1dG9yZXN1bWVfZGlzYWJsZWQpCisJCXN0YXR1cyA9IC1FUEVSTTsKKwllbHNlIGlmICgrK2ludGYtPnBtX3VzYWdlX2NudCA+IDAgJiYgdWRldi0+c3RhdGUgPT0gVVNCX1NUQVRFX1NVU1BFTkRFRCkKKwkJcXVldWVfd29yayhrc3VzcGVuZF91c2Jfd3EsICZ1ZGV2LT5hdXRvcmVzdW1lKTsKKwlkZXZfdmRiZygmaW50Zi0+ZGV2LCAiJXM6IHN0YXR1cyAlZCBjbnQgJWRcbiIsCisJCQlfX2Z1bmNfXywgc3RhdHVzLCBpbnRmLT5wbV91c2FnZV9jbnQpOworCXJldHVybiBzdGF0dXM7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh1c2JfYXV0b3BtX2dldF9pbnRlcmZhY2VfYXN5bmMpOworCisvKioKICAqIHVzYl9hdXRvcG1fc2V0X2ludGVyZmFjZSAtIHNldCBhIFVTQiBpbnRlcmZhY2UncyBhdXRvc3VzcGVuZCBzdGF0ZQogICogQGludGY6IHRoZSB1c2JfaW50ZXJmYWNlIHdob3NlIHN0YXRlIHNob3VsZCBiZSBzZXQKICAqCkBAIC0xNTYzLDYgKzE2NzQsOSBAQAogdm9pZCB1c2JfYXV0b3N1c3BlbmRfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7fQogCit2b2lkIHVzYl9hdXRvcmVzdW1lX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQore30KKwogI2VuZGlmIC8qIENPTkZJR19VU0JfU1VTUEVORCAqLwogCiAvKioKQEAgLTE1OTUsNiArMTcwOSw3IEBACiAvKioKICAqIHVzYl9leHRlcm5hbF9yZXN1bWVfZGV2aWNlIC0gZXh0ZXJuYWwgcmVzdW1lIG9mIGEgVVNCIGRldmljZSBhbmQgaXRzIGludGVyZmFjZXMKICAqIEB1ZGV2OiB0aGUgdXNiX2RldmljZSB0byByZXN1bWUKKyAqIEBtc2c6IFBvd2VyIE1hbmFnZW1lbnQgbWVzc2FnZSBkZXNjcmliaW5nIHRoaXMgc3RhdGUgdHJhbnNpdGlvbgogICoKICAqIFRoaXMgcm91dGluZSBoYW5kbGVzIGV4dGVybmFsIHJlc3VtZSByZXF1ZXN0czogb25lcyBub3QgZ2VuZXJhdGVkCiAgKiBpbnRlcm5hbGx5IGJ5IGEgVVNCIGRyaXZlciAoYXV0b3Jlc3VtZSkgYnV0IHJhdGhlciBjb21pbmcgZnJvbSB0aGUgdXNlcgpAQCAtMTYwMywxMyArMTcxOCwxMyBAQAogICoKICAqIFRoZSBjYWxsZXIgbXVzdCBob2xkIEB1ZGV2J3MgZGV2aWNlIGxvY2suCiAgKi8KLWludCB1c2JfZXh0ZXJuYWxfcmVzdW1lX2RldmljZShzdHJ1Y3QgdXNiX2RldmljZSAqdWRldikKK2ludCB1c2JfZXh0ZXJuYWxfcmVzdW1lX2RldmljZShzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiwgcG1fbWVzc2FnZV90IG1zZykKIHsKIAlpbnQJc3RhdHVzOwogCiAJdXNiX3BtX2xvY2sodWRldik7CiAJdWRldi0+YXV0b19wbSA9IDA7Ci0Jc3RhdHVzID0gdXNiX3Jlc3VtZV9ib3RoKHVkZXYpOworCXN0YXR1cyA9IHVzYl9yZXN1bWVfYm90aCh1ZGV2LCBtc2cpOwogCXVkZXYtPmxhc3RfYnVzeSA9IGppZmZpZXM7CiAJdXNiX3BtX3VubG9jayh1ZGV2KTsKIAlpZiAoc3RhdHVzID09IDApCkBAIC0xNjIyLDcgKzE3MzcsNyBAQAogCXJldHVybiBzdGF0dXM7CiB9CiAKLWludCB1c2Jfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHBtX21lc3NhZ2VfdCBtZXNzYWdlKQoraW50IHVzYl9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IG1zZykKIHsKIAlzdHJ1Y3QgdXNiX2RldmljZQkqdWRldjsKIApAQCAtMTY0MSwxMCArMTc1NiwxMCBAQAogCX0KIAogCXVkZXYtPnNraXBfc3lzX3Jlc3VtZSA9IDA7Ci0JcmV0dXJuIHVzYl9leHRlcm5hbF9zdXNwZW5kX2RldmljZSh1ZGV2LCBtZXNzYWdlKTsKKwlyZXR1cm4gdXNiX2V4dGVybmFsX3N1c3BlbmRfZGV2aWNlKHVkZXYsIG1zZyk7CiB9CiAKLWludCB1c2JfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKK2ludCB1c2JfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IG1zZykKIHsKIAlzdHJ1Y3QgdXNiX2RldmljZQkqdWRldjsKIApAQCAtMTY1Niw3ICsxNzcxLDcgQEAKIAkgKi8KIAlpZiAodWRldi0+c2tpcF9zeXNfcmVzdW1lKQogCQlyZXR1cm4gMDsKLQlyZXR1cm4gdXNiX2V4dGVybmFsX3Jlc3VtZV9kZXZpY2UodWRldik7CisJcmV0dXJuIHVzYl9leHRlcm5hbF9yZXN1bWVfZGV2aWNlKHVkZXYsIG1zZyk7CiB9CiAKICNlbmRpZiAvKiBDT05GSUdfUE0gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NvcmUvZW5kcG9pbnQuYyBiL2RyaXZlcnMvdXNiL2NvcmUvZW5kcG9pbnQuYwppbmRleCA5NDZmYWU0Li5lMTcxMGYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jb3JlL2VuZHBvaW50LmMKKysrIGIvZHJpdmVycy91c2IvY29yZS9lbmRwb2ludC5jCkBAIC0yNzYsNyArMjc2LDcgQEAKIAlrZnJlZShlcF9kZXYpOwogfQogCi1pbnQgdXNiX2NyZWF0ZV9lcF9maWxlcyhzdHJ1Y3QgZGV2aWNlICpwYXJlbnQsCitpbnQgdXNiX2NyZWF0ZV9lcF9kZXZzKHN0cnVjdCBkZXZpY2UgKnBhcmVudCwKIAkJCXN0cnVjdCB1c2JfaG9zdF9lbmRwb2ludCAqZW5kcG9pbnQsCiAJCQlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldikKIHsKQEAgLTM0MCw3ICszNDAsNyBAQAogCXJldHVybiByZXR2YWw7CiB9CiAKLXZvaWQgdXNiX3JlbW92ZV9lcF9maWxlcyhzdHJ1Y3QgdXNiX2hvc3RfZW5kcG9pbnQgKmVuZHBvaW50KQordm9pZCB1c2JfcmVtb3ZlX2VwX2RldnMoc3RydWN0IHVzYl9ob3N0X2VuZHBvaW50ICplbmRwb2ludCkKIHsKIAlzdHJ1Y3QgZXBfZGV2aWNlICplcF9kZXYgPSBlbmRwb2ludC0+ZXBfZGV2OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jb3JlL2dlbmVyaWMuYyBiL2RyaXZlcnMvdXNiL2NvcmUvZ2VuZXJpYy5jCmluZGV4IDdlOTEyZjIuLjMwZWNhYzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NvcmUvZ2VuZXJpYy5jCisrKyBiL2RyaXZlcnMvdXNiL2NvcmUvZ2VuZXJpYy5jCkBAIC0yMDAsMTggKzIwMCwxOCBAQAogCSAqIGludGVyZmFjZXMgbWFudWFsbHkgYnkgZG9pbmcgYSBidXMgKG9yICJnbG9iYWwiKSBzdXNwZW5kLgogCSAqLwogCWlmICghdWRldi0+cGFyZW50KQotCQlyYyA9IGhjZF9idXNfc3VzcGVuZCh1ZGV2KTsKKwkJcmMgPSBoY2RfYnVzX3N1c3BlbmQodWRldiwgbXNnKTsKIAogCS8qIE5vbi1yb290IGRldmljZXMgZG9uJ3QgbmVlZCB0byBkbyBhbnl0aGluZyBmb3IgRlJFRVpFIG9yIFBSRVRIQVcgKi8KIAllbHNlIGlmIChtc2cuZXZlbnQgPT0gUE1fRVZFTlRfRlJFRVpFIHx8IG1zZy5ldmVudCA9PSBQTV9FVkVOVF9QUkVUSEFXKQogCQlyYyA9IDA7CiAJZWxzZQotCQlyYyA9IHVzYl9wb3J0X3N1c3BlbmQodWRldik7CisJCXJjID0gdXNiX3BvcnRfc3VzcGVuZCh1ZGV2LCBtc2cpOwogCiAJcmV0dXJuIHJjOwogfQogCi1zdGF0aWMgaW50IGdlbmVyaWNfcmVzdW1lKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2KQorc3RhdGljIGludCBnZW5lcmljX3Jlc3VtZShzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiwgcG1fbWVzc2FnZV90IG1zZykKIHsKIAlpbnQgcmM7CiAKQEAgLTIyMSw5ICsyMjEsOSBAQAogCSAqIGludGVyZmFjZXMgbWFudWFsbHkgYnkgZG9pbmcgYSBidXMgKG9yICJnbG9iYWwiKSByZXN1bWUuCiAJICovCiAJaWYgKCF1ZGV2LT5wYXJlbnQpCi0JCXJjID0gaGNkX2J1c19yZXN1bWUodWRldik7CisJCXJjID0gaGNkX2J1c19yZXN1bWUodWRldiwgbXNnKTsKIAllbHNlCi0JCXJjID0gdXNiX3BvcnRfcmVzdW1lKHVkZXYpOworCQlyYyA9IHVzYl9wb3J0X3Jlc3VtZSh1ZGV2LCBtc2cpOwogCXJldHVybiByYzsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY29yZS9oY2QtcGNpLmMgYi9kcml2ZXJzL3VzYi9jb3JlL2hjZC1wY2kuYwppbmRleCA1Yjg3YWU3Li41MDc3NDFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jb3JlL2hjZC1wY2kuYworKysgYi9kcml2ZXJzL3VzYi9jb3JlL2hjZC1wY2kuYwpAQCAtMTI4LDYgKzEyOCw3IEBACiAJfQogCiAJcGNpX3NldF9tYXN0ZXIoZGV2KTsKKwlkZXZpY2Vfc2V0X3dha2V1cF9lbmFibGUoJmRldi0+ZGV2LCAxKTsKIAogCXJldHZhbCA9IHVzYl9hZGRfaGNkKGhjZCwgZGV2LT5pcnEsIElSUUZfRElTQUJMRUQgfCBJUlFGX1NIQVJFRCk7CiAJaWYgKHJldHZhbCAhPSAwKQpAQCAtMTkxLDE3ICsxOTIsMTUgQEAKIC8qKgogICogdXNiX2hjZF9wY2lfc3VzcGVuZCAtIHBvd2VyIG1hbmFnZW1lbnQgc3VzcGVuZCBvZiBhIFBDSS1iYXNlZCBIQ0QKICAqIEBkZXY6IFVTQiBIb3N0IENvbnRyb2xsZXIgYmVpbmcgc3VzcGVuZGVkCi0gKiBAbWVzc2FnZTogc2VtYW50aWNzIGluIGZsdXgKKyAqIEBtZXNzYWdlOiBQb3dlciBNYW5hZ2VtZW50IG1lc3NhZ2UgZGVzY3JpYmluZyB0aGlzIHN0YXRlIHRyYW5zaXRpb24KICAqCi0gKiBTdG9yZSB0aGlzIGZ1bmN0aW9uIGluIHRoZSBIQ0QncyBzdHJ1Y3QgcGNpX2RyaXZlciBhcyBzdXNwZW5kKCkuCisgKiBTdG9yZSB0aGlzIGZ1bmN0aW9uIGluIHRoZSBIQ0QncyBzdHJ1Y3QgcGNpX2RyaXZlciBhcyAuc3VzcGVuZC4KICAqLwogaW50IHVzYl9oY2RfcGNpX3N1c3BlbmQoc3RydWN0IHBjaV9kZXYgKmRldiwgcG1fbWVzc2FnZV90IG1lc3NhZ2UpCiB7Ci0Jc3RydWN0IHVzYl9oY2QJCSpoY2Q7CisJc3RydWN0IHVzYl9oY2QJCSpoY2QgPSBwY2lfZ2V0X2RydmRhdGEoZGV2KTsKIAlpbnQJCQlyZXR2YWwgPSAwOwotCWludAkJCWhhc19wY2lfcG07Ci0KLQloY2QgPSBwY2lfZ2V0X2RydmRhdGEoZGV2KTsKKwlpbnQJCQl3YWtlLCB3OwogCiAJLyogUm9vdCBodWIgc3VzcGVuZCBzaG91bGQgaGF2ZSBzdG9wcGVkIGFsbCBkb3duc3RyZWFtIHRyYWZmaWMsCiAJICogYW5kIGFsbCBidXMgbWFzdGVyIHRyYWZmaWMuICBBbmQgZG9uZSBzbyBmb3IgYm90aCB0aGUgaW50ZXJmYWNlCkBAIC0yMTIsOCArMjExLDE1IEBACiAJICogb3RoZXJ3aXNlIHRoZSBzd3N1c3Agd2lsbCBzYXZlIChhbmQgcmVzdG9yZSkgZ2FyYmFnZSBzdGF0ZS4KIAkgKi8KIAlpZiAoIShoY2QtPnN0YXRlID09IEhDX1NUQVRFX1NVU1BFTkRFRCB8fAotCQkJaGNkLT5zdGF0ZSA9PSBIQ19TVEFURV9IQUxUKSkKLQkJcmV0dXJuIC1FQlVTWTsKKwkJCWhjZC0+c3RhdGUgPT0gSENfU1RBVEVfSEFMVCkpIHsKKwkJZGV2X3dhcm4oJmRldi0+ZGV2LCAiUm9vdCBodWIgaXMgbm90IHN1c3BlbmRlZFxuIik7CisJCXJldHZhbCA9IC1FQlVTWTsKKwkJZ290byBkb25lOworCX0KKworCS8qIFdlIG1pZ2h0IGFscmVhZHkgYmUgc3VzcGVuZGVkIChydW50aW1lIFBNIC0tIG5vdCB5ZXQgd3JpdHRlbikgKi8KKwlpZiAoZGV2LT5jdXJyZW50X3N0YXRlICE9IFBDSV9EMCkKKwkJZ290byBkb25lOwogCiAJaWYgKGhjZC0+ZHJpdmVyLT5wY2lfc3VzcGVuZCkgewogCQlyZXR2YWwgPSBoY2QtPmRyaXZlci0+cGNpX3N1c3BlbmQoaGNkLCBtZXNzYWdlKTsKQEAgLTIyMSw0OSArMjI3LDYwIEBACiAJCWlmIChyZXR2YWwpCiAJCQlnb3RvIGRvbmU7CiAJfQorCiAJc3luY2hyb25pemVfaXJxKGRldi0+aXJxKTsKIAotCS8qIEZJWE1FIHVudGlsIHRoZSBnZW5lcmljIFBNIGludGVyZmFjZXMgY2hhbmdlIGEgbG90IG1vcmUsIHRoaXMKLQkgKiBjYW4ndCB1c2UgUENJIEQxIGFuZCBEMiBzdGF0ZXMuICBGb3IgZXhhbXBsZSwgdGhlIGNvbmZ1c2lvbgotCSAqIGJldHdlZW4gbWVzc2FnZXMgYW5kIHN0YXRlcyB3aWxsIG5lZWQgdG8gdmFuaXNoLCBhbmQgbWVzc2FnZXMKLQkgKiB3aWxsIG5lZWQgdG8gcHJvdmlkZSBhIHRhcmdldCBzeXN0ZW0gc3RhdGUgYWdhaW4uCi0JICoKLQkgKiBJdCdsbCBiZSBpbXBvcnRhbnQgdG8gbGVhcm4gY2hhcmFjdGVyaXN0aWNzIG9mIHRoZSB0YXJnZXQgc3RhdGUsCi0JICogZXNwZWNpYWxseSBvbiBlbWJlZGRlZCBoYXJkd2FyZSB3aGVyZSB0aGUgSENEIHdpbGwgb2Z0ZW4gYmUgaW4KLQkgKiBjaGFyZ2Ugb2YgYW4gZXh0ZXJuYWwgVkJVUyBwb3dlciBzdXBwbHkgYW5kIG9uZSBvciBtb3JlIGNsb2Nrcy4KLQkgKiBTb21lIHRhcmdldCBzeXN0ZW0gc3RhdGVzIHdpbGwgbGVhdmUgdGhlbSBhY3RpdmU7IG90aGVycyB3b24ndC4KLQkgKiAoV2l0aCBQQ0ksIHRoYXQncyBvZnRlbiBoYW5kbGVkIGJ5IHBsYXRmb3JtIEJJT1MgY29kZS4pCisJLyogRG9uJ3QgZmFpbCBvbiBlcnJvciB0byBlbmFibGUgd2FrZXVwLiAgV2UgcmVseSBvbiBwY2kgY29kZQorCSAqIHRvIHJlamVjdCByZXF1ZXN0cyB0aGUgaGFyZHdhcmUgY2FuJ3QgaW1wbGVtZW50LCByYXRoZXIKKwkgKiB0aGFuIGNvZGluZyB0aGUgc2FtZSB0aGluZy4KIAkgKi8KLQotCS8qIGV2ZW4gd2hlbiB0aGUgUENJIGxheWVyIHJlamVjdHMgc29tZSBvZiB0aGUgUENJIGNhbGxzCi0JICogYmVsb3csIEhDcyBjYW4gdHJ5IGdsb2JhbCBzdXNwZW5kIGFuZCByZWR1Y2UgRE1BIHRyYWZmaWMuCi0JICogUE0tc2Vuc2l0aXZlIEhDRHMgbWF5IGFscmVhZHkgaGF2ZSBkb25lIHRoaXMuCi0JICovCi0JaGFzX3BjaV9wbSA9IHBjaV9maW5kX2NhcGFiaWxpdHkoZGV2LCBQQ0lfQ0FQX0lEX1BNKTsKKwl3YWtlID0gKGhjZC0+c3RhdGUgPT0gSENfU1RBVEVfU1VTUEVOREVEICYmCisJCQlkZXZpY2VfbWF5X3dha2V1cCgmZGV2LT5kZXYpKTsKKwl3ID0gcGNpX3dha2VfZnJvbV9kMyhkZXYsIHdha2UpOworCWlmICh3IDwgMCkKKwkJd2FrZSA9IHc7CisJZGV2X2RiZygmZGV2LT5kZXYsICJ3YWtldXA6ICVkXG4iLCB3YWtlKTsKIAogCS8qIERvd25zdHJlYW0gcG9ydHMgZnJvbSB0aGlzIHJvb3QgaHViIHNob3VsZCBhbHJlYWR5IGJlIHF1aWVzY2VkLCBzbwogCSAqIHRoZXJlIHdpbGwgYmUgbm8gRE1BIGFjdGl2aXR5LiAgTm93IHdlIGNhbiBzaHV0IGRvd24gdGhlIHVwc3RyZWFtCiAJICogbGluayAoZXhjZXB0IG1heWJlIGZvciBQTUUjIHJlc3VtZSBzaWduYWxpbmcpIGFuZCBlbnRlciBzb21lIFBDSQogCSAqIGxvdyBwb3dlciBzdGF0ZSwgaWYgdGhlIGhhcmR3YXJlIGFsbG93cy4KIAkgKi8KLQlpZiAoaGNkLT5zdGF0ZSA9PSBIQ19TVEFURV9TVVNQRU5ERUQpIHsKKwlwY2lfZGlzYWJsZV9kZXZpY2UoZGV2KTsKKyBkb25lOgorCXJldHVybiByZXR2YWw7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh1c2JfaGNkX3BjaV9zdXNwZW5kKTsKIAotCQkvKiBubyBETUEgb3IgSVJRcyBleGNlcHQgd2hlbiBIQyBpcyBhY3RpdmUgKi8KLQkJaWYgKGRldi0+Y3VycmVudF9zdGF0ZSA9PSBQQ0lfRDApIHsKLQkJCXBjaV9zYXZlX3N0YXRlKGRldik7Ci0JCQlwY2lfZGlzYWJsZV9kZXZpY2UoZGV2KTsKLQkJfQorLyoqCisgKiB1c2JfaGNkX3BjaV9zdXNwZW5kX2xhdGUgLSBzdXNwZW5kIGEgUENJLWJhc2VkIEhDRCBhZnRlciBJUlFzIGFyZSBkaXNhYmxlZAorICogQGRldjogVVNCIEhvc3QgQ29udHJvbGxlciBiZWluZyBzdXNwZW5kZWQKKyAqIEBtZXNzYWdlOiBQb3dlciBNYW5hZ2VtZW50IG1lc3NhZ2UgZGVzY3JpYmluZyB0aGlzIHN0YXRlIHRyYW5zaXRpb24KKyAqCisgKiBTdG9yZSB0aGlzIGZ1bmN0aW9uIGluIHRoZSBIQ0QncyBzdHJ1Y3QgcGNpX2RyaXZlciBhcyAuc3VzcGVuZF9sYXRlLgorICovCitpbnQgdXNiX2hjZF9wY2lfc3VzcGVuZF9sYXRlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHBtX21lc3NhZ2VfdCBtZXNzYWdlKQoreworCWludAkJCXJldHZhbCA9IDA7CisJaW50CQkJaGFzX3BjaV9wbTsKIAotCQlpZiAobWVzc2FnZS5ldmVudCA9PSBQTV9FVkVOVF9GUkVFWkUgfHwKLQkJCQltZXNzYWdlLmV2ZW50ID09IFBNX0VWRU5UX1BSRVRIQVcpIHsKLQkJCWRldl9kYmcoaGNkLT5zZWxmLmNvbnRyb2xsZXIsICItLT4gbm8gc3RhdGUgY2hhbmdlXG4iKTsKLQkJCWdvdG8gZG9uZTsKLQkJfQorCS8qIFdlIG1pZ2h0IGFscmVhZHkgYmUgc3VzcGVuZGVkIChydW50aW1lIFBNIC0tIG5vdCB5ZXQgd3JpdHRlbikgKi8KKwlpZiAoZGV2LT5jdXJyZW50X3N0YXRlICE9IFBDSV9EMCkKKwkJZ290byBkb25lOwogCi0JCWlmICghaGFzX3BjaV9wbSkgewotCQkJZGV2X2RiZyhoY2QtPnNlbGYuY29udHJvbGxlciwgIi0tPiBQQ0kgRDAvbGVnYWN5XG4iKTsKLQkJCWdvdG8gZG9uZTsKLQkJfQorCXBjaV9zYXZlX3N0YXRlKGRldik7CisKKwkvKiBEb24ndCBjaGFuZ2Ugc3RhdGUgaWYgd2UgZG9uJ3QgbmVlZCB0byAqLworCWlmIChtZXNzYWdlLmV2ZW50ID09IFBNX0VWRU5UX0ZSRUVaRSB8fAorCQkJbWVzc2FnZS5ldmVudCA9PSBQTV9FVkVOVF9QUkVUSEFXKSB7CisJCWRldl9kYmcoJmRldi0+ZGV2LCAiLS0+IG5vIHN0YXRlIGNoYW5nZVxuIik7CisJCWdvdG8gZG9uZTsKKwl9CisKKwloYXNfcGNpX3BtID0gcGNpX2ZpbmRfY2FwYWJpbGl0eShkZXYsIFBDSV9DQVBfSURfUE0pOworCWlmICghaGFzX3BjaV9wbSkgeworCQlkZXZfZGJnKCZkZXYtPmRldiwgIi0tPiBQQ0kgRDAgbGVnYWN5XG4iKTsKKwl9IGVsc2UgewogCiAJCS8qIE5PVEU6ICBkZXYtPmN1cnJlbnRfc3RhdGUgYmVjb21lcyBub256ZXJvIG9ubHkgaGVyZSwgYW5kCiAJCSAqIG9ubHkgZm9yIGRldmljZXMgdGhhdCBzdXBwb3J0IFBDSSBQTS4gIEFsc28sIGV4aXRpbmcKQEAgLTI3MywzNSArMjkwLDE2IEBACiAJCXJldHZhbCA9IHBjaV9zZXRfcG93ZXJfc3RhdGUoZGV2LCBQQ0lfRDNob3QpOwogCQlzdXNwZW5kX3JlcG9ydF9yZXN1bHQocGNpX3NldF9wb3dlcl9zdGF0ZSwgcmV0dmFsKTsKIAkJaWYgKHJldHZhbCA9PSAwKSB7Ci0JCQlpbnQgd2FrZSA9IGRldmljZV9jYW5fd2FrZXVwKCZoY2QtPnNlbGYucm9vdF9odWItPmRldik7Ci0KLQkJCXdha2UgPSB3YWtlICYmIGRldmljZV9tYXlfd2FrZXVwKGhjZC0+c2VsZi5jb250cm9sbGVyKTsKLQotCQkJZGV2X2RiZyhoY2QtPnNlbGYuY29udHJvbGxlciwgIi0tPiBQQ0kgRDMlc1xuIiwKLQkJCQkJd2FrZSA/ICIvd2FrZXVwIiA6ICIiKTsKLQotCQkJLyogSWdub3JlIHRoZXNlIHJldHVybiB2YWx1ZXMuICBXZSByZWx5IG9uIHBjaSBjb2RlIHRvCi0JCQkgKiByZWplY3QgcmVxdWVzdHMgdGhlIGhhcmR3YXJlIGNhbid0IGltcGxlbWVudCwgcmF0aGVyCi0JCQkgKiB0aGFuIGNvZGluZyB0aGUgc2FtZSB0aGluZy4KLQkJCSAqLwotCQkJKHZvaWQpIHBjaV9lbmFibGVfd2FrZShkZXYsIFBDSV9EM2hvdCwgd2FrZSk7Ci0JCQkodm9pZCkgcGNpX2VuYWJsZV93YWtlKGRldiwgUENJX0QzY29sZCwgd2FrZSk7CisJCQlkZXZfZGJnKCZkZXYtPmRldiwgIi0tPiBQQ0kgRDNcbiIpOwogCQl9IGVsc2UgewogCQkJZGV2X2RiZygmZGV2LT5kZXYsICJQQ0kgRDMgc3VzcGVuZCBmYWlsLCAlZFxuIiwKIAkJCQkJcmV0dmFsKTsKLQkJCSh2b2lkKSB1c2JfaGNkX3BjaV9yZXN1bWUoZGV2KTsKKwkJCXBjaV9yZXN0b3JlX3N0YXRlKGRldik7CiAJCX0KLQotCX0gZWxzZSBpZiAoaGNkLT5zdGF0ZSAhPSBIQ19TVEFURV9IQUxUKSB7Ci0JCWRldl9kYmcoaGNkLT5zZWxmLmNvbnRyb2xsZXIsICJoY2Qgc3RhdGUgJWQ7IG5vdCBzdXNwZW5kZWRcbiIsCi0JCQloY2QtPnN0YXRlKTsKLQkJV0FSTl9PTigxKTsKLQkJcmV0dmFsID0gLUVJTlZBTDsKIAl9CiAKLWRvbmU6Ci0JaWYgKHJldHZhbCA9PSAwKSB7CiAjaWZkZWYgQ09ORklHX1BQQ19QTUFDCisJaWYgKHJldHZhbCA9PSAwKSB7CiAJCS8qIERpc2FibGUgQVNJQyBjbG9ja3MgZm9yIFVTQiAqLwogCQlpZiAobWFjaGluZV9pcyhwb3dlcm1hYykpIHsKIAkJCXN0cnVjdCBkZXZpY2Vfbm9kZQkqb2Zfbm9kZTsKQEAgLTMxMSwzMCArMzA5LDI0IEBACiAJCQkJcG1hY19jYWxsX2ZlYXR1cmUoUE1BQ19GVFJfVVNCX0VOQUJMRSwKIAkJCQkJCQlvZl9ub2RlLCAwLCAwKTsKIAkJfQotI2VuZGlmCiAJfQorI2VuZGlmCiAKKyBkb25lOgogCXJldHVybiByZXR2YWw7CiB9Ci1FWFBPUlRfU1lNQk9MX0dQTCh1c2JfaGNkX3BjaV9zdXNwZW5kKTsKK0VYUE9SVF9TWU1CT0xfR1BMKHVzYl9oY2RfcGNpX3N1c3BlbmRfbGF0ZSk7CiAKIC8qKgotICogdXNiX2hjZF9wY2lfcmVzdW1lIC0gcG93ZXIgbWFuYWdlbWVudCByZXN1bWUgb2YgYSBQQ0ktYmFzZWQgSENECisgKiB1c2JfaGNkX3BjaV9yZXN1bWVfZWFybHkgLSByZXN1bWUgYSBQQ0ktYmFzZWQgSENEIGJlZm9yZSBJUlFzIGFyZSBlbmFibGVkCiAgKiBAZGV2OiBVU0IgSG9zdCBDb250cm9sbGVyIGJlaW5nIHJlc3VtZWQKICAqCi0gKiBTdG9yZSB0aGlzIGZ1bmN0aW9uIGluIHRoZSBIQ0QncyBzdHJ1Y3QgcGNpX2RyaXZlciBhcyByZXN1bWUoKS4KKyAqIFN0b3JlIHRoaXMgZnVuY3Rpb24gaW4gdGhlIEhDRCdzIHN0cnVjdCBwY2lfZHJpdmVyIGFzIC5yZXN1bWVfZWFybHkuCiAgKi8KLWludCB1c2JfaGNkX3BjaV9yZXN1bWUoc3RydWN0IHBjaV9kZXYgKmRldikKK2ludCB1c2JfaGNkX3BjaV9yZXN1bWVfZWFybHkoc3RydWN0IHBjaV9kZXYgKmRldikKIHsKLQlzdHJ1Y3QgdXNiX2hjZAkJKmhjZDsKLQlpbnQJCQlyZXR2YWw7Ci0KLQloY2QgPSBwY2lfZ2V0X2RydmRhdGEoZGV2KTsKLQlpZiAoaGNkLT5zdGF0ZSAhPSBIQ19TVEFURV9TVVNQRU5ERUQpIHsKLQkJZGV2X2RiZyhoY2QtPnNlbGYuY29udHJvbGxlciwKLQkJCQkiY2FuJ3QgcmVzdW1lLCBub3Qgc3VzcGVuZGVkIVxuIik7Ci0JCXJldHVybiAwOwotCX0KKwlpbnQJCXJldHZhbCA9IDA7CisJcGNpX3Bvd2VyX3QJc3RhdGUgPSBkZXYtPmN1cnJlbnRfc3RhdGU7CiAKICNpZmRlZiBDT05GSUdfUFBDX1BNQUMKIAkvKiBSZWVuYWJsZSBBU0lDIGNsb2NrcyBmb3IgVVNCICovCkBAIC0zNTIsNyArMzQ0LDcgQEAKIAkgKiBjYWxscyAic3RhbmRieSIsICJzdXNwZW5kIHRvIFJBTSIsIGFuZCBzbyBvbikuICBUaGVyZSBhcmUgYWxzbwogCSAqIGRpcnR5IGNhc2VzIHdoZW4gc3dzdXNwIGZha2VzIGEgc3VzcGVuZCBpbiAic2h1dGRvd24iIG1vZGUuCiAJICovCi0JaWYgKGRldi0+Y3VycmVudF9zdGF0ZSAhPSBQQ0lfRDApIHsKKwlpZiAoc3RhdGUgIT0gUENJX0QwKSB7CiAjaWZkZWYJREVCVUcKIAkJaW50CXBjaV9wbTsKIAkJdTE2CXBtY3I7CkBAIC0zNjQsOCArMzU2LDcgQEAKIAkJCS8qIENsZWFuIGNhc2U6ICBwb3dlciB0byBVU0IgYW5kIHRvIEhDIHJlZ2lzdGVycyB3YXMKIAkJCSAqIG1haW50YWluZWQ7IHJlbW90ZSB3YWtldXAgaXMgZWFzeS4KIAkJCSAqLwotCQkJZGV2X2RiZyhoY2QtPnNlbGYuY29udHJvbGxlciwgInJlc3VtZSBmcm9tIFBDSSBEJWRcbiIsCi0JCQkJCXBtY3IpOworCQkJZGV2X2RiZygmZGV2LT5kZXYsICJyZXN1bWUgZnJvbSBQQ0kgRCVkXG4iLCBwbWNyKTsKIAkJfSBlbHNlIHsKIAkJCS8qIENsZWFuOiAgSEMgbG9zdCBWY2MgcG93ZXIsIEQwIHVuaW5pdGlhbGl6ZWQKIAkJCSAqICAgKyBWYXV4IG1heSBoYXZlIHByZXNlcnZlZCBwb3J0IGFuZCB0cmFuc2NlaXZlcgpAQCAtMzc2LDMyICszNjcsNTUgQEAKIAkJCSAqICAgKyBhZnRlciBCSU9TIGluaXQKIAkJCSAqICAgKyBhZnRlciBMaW51eCBpbml0IChIQ0Qgc3RhdGljYWxseSBsaW5rZWQpCiAJCQkgKi8KLQkJCWRldl9kYmcoaGNkLT5zZWxmLmNvbnRyb2xsZXIsCi0JCQkJIlBDSSBEMCwgZnJvbSBwcmV2aW91cyBQQ0kgRCVkXG4iLAotCQkJCWRldi0+Y3VycmVudF9zdGF0ZSk7CisJCQlkZXZfZGJnKCZkZXYtPmRldiwgInJlc3VtZSBmcm9tIHByZXZpb3VzIFBDSSBEJWRcbiIsCisJCQkJCXN0YXRlKTsKIAkJfQogI2VuZGlmCi0JCS8qIHllcywgaWdub3JlIHRoZXNlIHJlc3VsdHMgdG9vLi4uICovCi0JCSh2b2lkKSBwY2lfZW5hYmxlX3dha2UoZGV2LCBkZXYtPmN1cnJlbnRfc3RhdGUsIDApOwotCQkodm9pZCkgcGNpX2VuYWJsZV93YWtlKGRldiwgUENJX0QzY29sZCwgMCk7CisKKwkJcmV0dmFsID0gcGNpX3NldF9wb3dlcl9zdGF0ZShkZXYsIFBDSV9EMCk7CiAJfSBlbHNlIHsKIAkJLyogU2FtZSBiYXNpYyBjYXNlczogY2xlYW4gKHBvd2VyZWQvbm90KSwgZGlydHkgKi8KLQkJZGV2X2RiZyhoY2QtPnNlbGYuY29udHJvbGxlciwgIlBDSSBsZWdhY3kgcmVzdW1lXG4iKTsKKwkJZGV2X2RiZygmZGV2LT5kZXYsICJQQ0kgbGVnYWN5IHJlc3VtZVxuIik7CiAJfQogCi0JLyogTk9URTogIHRoZSBQQ0kgQVBJIGl0c2VsZiBpcyBhc3ltbWV0cmljIGhlcmUuICBXZSBkb24ndCBuZWVkIHRvCi0JICogcGNpX3NldF9wb3dlcl9zdGF0ZShQQ0lfRDApIHNpbmNlIHRoYXQncyBwYXJ0IG9mIHJlLWVuYWJsaW5nOwotCSAqIGJ1dCB0aGF0IHdvbid0IHJlLWVuYWJsZSBidXMgbWFzdGVyaW5nLiAgWWV0IHBjaV9kaXNhYmxlX2RldmljZSgpCi0JICogZXhwbGljaXRseSBkaXNhYmxlcyBidXMgbWFzdGVyaW5nLi4uCi0JICovCisJaWYgKHJldHZhbCA8IDApCisJCWRldl9lcnIoJmRldi0+ZGV2LCAiY2FuJ3QgcmVzdW1lOiAlZFxuIiwgcmV0dmFsKTsKKwllbHNlCisJCXBjaV9yZXN0b3JlX3N0YXRlKGRldik7CisKKwlyZXR1cm4gcmV0dmFsOworfQorRVhQT1JUX1NZTUJPTF9HUEwodXNiX2hjZF9wY2lfcmVzdW1lX2Vhcmx5KTsKKworLyoqCisgKiB1c2JfaGNkX3BjaV9yZXN1bWUgLSBwb3dlciBtYW5hZ2VtZW50IHJlc3VtZSBvZiBhIFBDSS1iYXNlZCBIQ0QKKyAqIEBkZXY6IFVTQiBIb3N0IENvbnRyb2xsZXIgYmVpbmcgcmVzdW1lZAorICoKKyAqIFN0b3JlIHRoaXMgZnVuY3Rpb24gaW4gdGhlIEhDRCdzIHN0cnVjdCBwY2lfZHJpdmVyIGFzIC5yZXN1bWUuCisgKi8KK2ludCB1c2JfaGNkX3BjaV9yZXN1bWUoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwlzdHJ1Y3QgdXNiX2hjZAkJKmhjZDsKKwlpbnQJCQlyZXR2YWw7CisKKwloY2QgPSBwY2lfZ2V0X2RydmRhdGEoZGV2KTsKKwlpZiAoaGNkLT5zdGF0ZSAhPSBIQ19TVEFURV9TVVNQRU5ERUQpIHsKKwkJZGV2X2RiZyhoY2QtPnNlbGYuY29udHJvbGxlciwKKwkJCQkiY2FuJ3QgcmVzdW1lLCBub3Qgc3VzcGVuZGVkIVxuIik7CisJCXJldHVybiAwOworCX0KKwogCXJldHZhbCA9IHBjaV9lbmFibGVfZGV2aWNlKGRldik7CiAJaWYgKHJldHZhbCA8IDApIHsKLQkJZGV2X2VycihoY2QtPnNlbGYuY29udHJvbGxlciwKLQkJCSJjYW4ndCByZS1lbmFibGUgYWZ0ZXIgcmVzdW1lLCAlZCFcbiIsIHJldHZhbCk7CisJCWRldl9lcnIoJmRldi0+ZGV2LCAiY2FuJ3QgcmUtZW5hYmxlIGFmdGVyIHJlc3VtZSwgJWQhXG4iLAorCQkJCXJldHZhbCk7CiAJCXJldHVybiByZXR2YWw7CiAJfQorCiAJcGNpX3NldF9tYXN0ZXIoZGV2KTsKLQlwY2lfcmVzdG9yZV9zdGF0ZShkZXYpOworCisJLyogeWVzLCBpZ25vcmUgdGhpcyByZXN1bHQgdG9vLi4uICovCisJKHZvaWQpIHBjaV93YWtlX2Zyb21fZDMoZGV2LCAwKTsKIAogCWNsZWFyX2JpdChIQ0RfRkxBR19TQVdfSVJRLCAmaGNkLT5mbGFncyk7CiAKQEAgLTQxMyw3ICs0MjcsNiBAQAogCQkJdXNiX2hjX2RpZWQoaGNkKTsKIAkJfQogCX0KLQogCXJldHVybiByZXR2YWw7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTCh1c2JfaGNkX3BjaV9yZXN1bWUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY29yZS9oY2QuYyBiL2RyaXZlcnMvdXNiL2NvcmUvaGNkLmMKaW5kZXggZTFiNDI2Mi4uM2M3MTFkYiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY29yZS9oY2QuYworKysgYi9kcml2ZXJzL3VzYi9jb3JlL2hjZC5jCkBAIC0xMDEwLDcgKzEwMTAsNyBAQAogCXNwaW5fbG9jaygmaGNkX3VyYl9saXN0X2xvY2spOwogCiAJLyogQ2hlY2sgdGhhdCB0aGUgVVJCIGlzbid0IGJlaW5nIGtpbGxlZCAqLwotCWlmICh1bmxpa2VseSh1cmItPnJlamVjdCkpIHsKKwlpZiAodW5saWtlbHkoYXRvbWljX3JlYWQoJnVyYi0+cmVqZWN0KSkpIHsKIAkJcmMgPSAtRVBFUk07CiAJCWdvdG8gZG9uZTsKIAl9CkBAIC0xMzQwLDcgKzEzNDAsNyBAQAogCQlJTklUX0xJU1RfSEVBRCgmdXJiLT51cmJfbGlzdCk7CiAJCWF0b21pY19kZWMoJnVyYi0+dXNlX2NvdW50KTsKIAkJYXRvbWljX2RlYygmdXJiLT5kZXYtPnVyYm51bSk7Ci0JCWlmICh1cmItPnJlamVjdCkKKwkJaWYgKGF0b21pY19yZWFkKCZ1cmItPnJlamVjdCkpCiAJCQl3YWtlX3VwKCZ1c2Jfa2lsbF91cmJfcXVldWUpOwogCQl1c2JfcHV0X3VyYih1cmIpOwogCX0KQEAgLTE0NDQsNyArMTQ0NCw3IEBACiAJdXJiLT5zdGF0dXMgPSBzdGF0dXM7CiAJdXJiLT5jb21wbGV0ZSAodXJiKTsKIAlhdG9taWNfZGVjICgmdXJiLT51c2VfY291bnQpOwotCWlmICh1bmxpa2VseSAodXJiLT5yZWplY3QpKQorCWlmICh1bmxpa2VseShhdG9taWNfcmVhZCgmdXJiLT5yZWplY3QpKSkKIAkJd2FrZV91cCAoJnVzYl9raWxsX3VyYl9xdWV1ZSk7CiAJdXNiX3B1dF91cmIgKHVyYik7CiB9CkBAIC0xNTczLDE0ICsxNTczLDE0IEBACiAKICNpZmRlZglDT05GSUdfUE0KIAotaW50IGhjZF9idXNfc3VzcGVuZChzdHJ1Y3QgdXNiX2RldmljZSAqcmhkZXYpCitpbnQgaGNkX2J1c19zdXNwZW5kKHN0cnVjdCB1c2JfZGV2aWNlICpyaGRldiwgcG1fbWVzc2FnZV90IG1zZykKIHsKIAlzdHJ1Y3QgdXNiX2hjZAkqaGNkID0gY29udGFpbmVyX29mKHJoZGV2LT5idXMsIHN0cnVjdCB1c2JfaGNkLCBzZWxmKTsKIAlpbnQJCXN0YXR1czsKIAlpbnQJCW9sZF9zdGF0ZSA9IGhjZC0+c3RhdGU7CiAKIAlkZXZfZGJnKCZyaGRldi0+ZGV2LCAiYnVzICVzJXNcbiIsCi0JCQlyaGRldi0+YXV0b19wbSA/ICJhdXRvLSIgOiAiIiwgInN1c3BlbmQiKTsKKwkJCShtc2cuZXZlbnQgJiBQTV9FVkVOVF9BVVRPID8gImF1dG8tIiA6ICIiKSwgInN1c3BlbmQiKTsKIAlpZiAoIWhjZC0+ZHJpdmVyLT5idXNfc3VzcGVuZCkgewogCQlzdGF0dXMgPSAtRU5PRU5UOwogCX0gZWxzZSB7CkBAIC0xNTk4LDE0ICsxNTk4LDE0IEBACiAJcmV0dXJuIHN0YXR1czsKIH0KIAotaW50IGhjZF9idXNfcmVzdW1lKHN0cnVjdCB1c2JfZGV2aWNlICpyaGRldikKK2ludCBoY2RfYnVzX3Jlc3VtZShzdHJ1Y3QgdXNiX2RldmljZSAqcmhkZXYsIHBtX21lc3NhZ2VfdCBtc2cpCiB7CiAJc3RydWN0IHVzYl9oY2QJKmhjZCA9IGNvbnRhaW5lcl9vZihyaGRldi0+YnVzLCBzdHJ1Y3QgdXNiX2hjZCwgc2VsZik7CiAJaW50CQlzdGF0dXM7CiAJaW50CQlvbGRfc3RhdGUgPSBoY2QtPnN0YXRlOwogCiAJZGV2X2RiZygmcmhkZXYtPmRldiwgInVzYiAlcyVzXG4iLAotCQkJcmhkZXYtPmF1dG9fcG0gPyAiYXV0by0iIDogIiIsICJyZXN1bWUiKTsKKwkJCShtc2cuZXZlbnQgJiBQTV9FVkVOVF9BVVRPID8gImF1dG8tIiA6ICIiKSwgInJlc3VtZSIpOwogCWlmICghaGNkLT5kcml2ZXItPmJ1c19yZXN1bWUpCiAJCXJldHVybiAtRU5PRU5UOwogCWlmIChoY2QtPnN0YXRlID09IEhDX1NUQVRFX1JVTk5JTkcpCkBAIC0xNjM4LDcgKzE2MzgsNyBAQAogCiAJdXNiX2xvY2tfZGV2aWNlKHVkZXYpOwogCXVzYl9tYXJrX2xhc3RfYnVzeSh1ZGV2KTsKLQl1c2JfZXh0ZXJuYWxfcmVzdW1lX2RldmljZSh1ZGV2KTsKKwl1c2JfZXh0ZXJuYWxfcmVzdW1lX2RldmljZSh1ZGV2LCBQTVNHX1JFTU9URV9SRVNVTUUpOwogCXVzYl91bmxvY2tfZGV2aWNlKHVkZXYpOwogfQogCkBAIC0yMDI4LDcgKzIwMjgsNyBAQAogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCi0jaWYgZGVmaW5lZChDT05GSUdfVVNCX01PTikKKyNpZiBkZWZpbmVkKENPTkZJR19VU0JfTU9OKSB8fCBkZWZpbmVkKENPTkZJR19VU0JfTU9OX01PRFVMRSkKIAogc3RydWN0IHVzYl9tb25fb3BlcmF0aW9ucyAqbW9uX29wczsKIApAQCAtMjA2NCw0ICsyMDY0LDQgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMICh1c2JfbW9uX2RlcmVnaXN0ZXIpOwogCi0jZW5kaWYgLyogQ09ORklHX1VTQl9NT04gKi8KKyNlbmRpZiAvKiBDT05GSUdfVVNCX01PTiB8fCBDT05GSUdfVVNCX01PTl9NT0RVTEUgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NvcmUvaGNkLmggYi9kcml2ZXJzL3VzYi9jb3JlL2hjZC5oCmluZGV4IDk0NjVlNzAuLjU3MmQyY2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NvcmUvaGNkLmgKKysrIGIvZHJpdmVycy91c2IvY29yZS9oY2QuaApAQCAtMTYsNiArMTYsOCBAQAogICogSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCiAgKi8KIAorI2lmbmRlZiBfX1VTQl9DT1JFX0hDRF9ICisjZGVmaW5lIF9fVVNCX0NPUkVfSENEX0gKIAogI2lmZGVmIF9fS0VSTkVMX18KIApAQCAtMjU0LDcgKzI1Niw5IEBACiBleHRlcm4gdm9pZCB1c2JfaGNkX3BjaV9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKmRldik7CiAKICNpZmRlZiBDT05GSUdfUE0KLWV4dGVybiBpbnQgdXNiX2hjZF9wY2lfc3VzcGVuZChzdHJ1Y3QgcGNpX2RldiAqZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpOworZXh0ZXJuIGludCB1c2JfaGNkX3BjaV9zdXNwZW5kKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHBtX21lc3NhZ2VfdCBtc2cpOworZXh0ZXJuIGludCB1c2JfaGNkX3BjaV9zdXNwZW5kX2xhdGUoc3RydWN0IHBjaV9kZXYgKmRldiwgcG1fbWVzc2FnZV90IG1zZyk7CitleHRlcm4gaW50IHVzYl9oY2RfcGNpX3Jlc3VtZV9lYXJseShzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKIGV4dGVybiBpbnQgdXNiX2hjZF9wY2lfcmVzdW1lKHN0cnVjdCBwY2lfZGV2ICpkZXYpOwogI2VuZGlmIC8qIENPTkZJR19QTSAqLwogCkBAIC0zODYsOCArMzkwLDggQEAKICNpZmRlZiBDT05GSUdfUE0KIGV4dGVybiB2b2lkIHVzYl9oY2RfcmVzdW1lX3Jvb3RfaHViKHN0cnVjdCB1c2JfaGNkICpoY2QpOwogZXh0ZXJuIHZvaWQgdXNiX3Jvb3RfaHViX2xvc3RfcG93ZXIoc3RydWN0IHVzYl9kZXZpY2UgKnJoZGV2KTsKLWV4dGVybiBpbnQgaGNkX2J1c19zdXNwZW5kKHN0cnVjdCB1c2JfZGV2aWNlICpyaGRldik7Ci1leHRlcm4gaW50IGhjZF9idXNfcmVzdW1lKHN0cnVjdCB1c2JfZGV2aWNlICpyaGRldik7CitleHRlcm4gaW50IGhjZF9idXNfc3VzcGVuZChzdHJ1Y3QgdXNiX2RldmljZSAqcmhkZXYsIHBtX21lc3NhZ2VfdCBtc2cpOworZXh0ZXJuIGludCBoY2RfYnVzX3Jlc3VtZShzdHJ1Y3QgdXNiX2RldmljZSAqcmhkZXYsIHBtX21lc3NhZ2VfdCBtc2cpOwogI2Vsc2UKIHN0YXRpYyBpbmxpbmUgdm9pZCB1c2JfaGNkX3Jlc3VtZV9yb290X2h1YihzdHJ1Y3QgdXNiX2hjZCAqaGNkKQogewpAQCAtNDE5LDcgKzQyMyw3IEBACiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKLSNpZiBkZWZpbmVkKENPTkZJR19VU0JfTU9OKQorI2lmIGRlZmluZWQoQ09ORklHX1VTQl9NT04pIHx8IGRlZmluZWQoQ09ORklHX1VTQl9NT05fTU9EVUxFKQogCiBzdHJ1Y3QgdXNiX21vbl9vcGVyYXRpb25zIHsKIAl2b2lkICgqdXJiX3N1Ym1pdCkoc3RydWN0IHVzYl9idXMgKmJ1cywgc3RydWN0IHVyYiAqdXJiKTsKQEAgLTQ2MSw3ICs0NjUsNyBAQAogc3RhdGljIGlubGluZSB2b2lkIHVzYm1vbl91cmJfY29tcGxldGUoc3RydWN0IHVzYl9idXMgKmJ1cywgc3RydWN0IHVyYiAqdXJiLAogCQlpbnQgc3RhdHVzKSB7fQogCi0jZW5kaWYgLyogQ09ORklHX1VTQl9NT04gKi8KKyNlbmRpZiAvKiBDT05GSUdfVVNCX01PTiB8fCBDT05GSUdfVVNCX01PTl9NT0RVTEUgKi8KIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIApAQCAtNDkwLDMgKzQ5NCw1IEBACiBleHRlcm4gdW5zaWduZWQgbG9uZyB1c2JfaGNkc19sb2FkZWQ7CiAKICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCisKKyNlbmRpZiAvKiBfX1VTQl9DT1JFX0hDRF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jb3JlL2h1Yi5jIGIvZHJpdmVycy91c2IvY29yZS9odWIuYwppbmRleCBiMTljYmZjLi5kNWQwZTQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jb3JlL2h1Yi5jCisrKyBiL2RyaXZlcnMvdXNiL2NvcmUvaHViLmMKQEAgLTEwNyw3ICsxMDcsOSBAQAogLyogZGVmaW5lIGluaXRpYWwgNjQtYnl0ZSBkZXNjcmlwdG9yIHJlcXVlc3QgdGltZW91dCBpbiBtaWxsaXNlY29uZHMgKi8KIHN0YXRpYyBpbnQgaW5pdGlhbF9kZXNjcmlwdG9yX3RpbWVvdXQgPSBVU0JfQ1RSTF9HRVRfVElNRU9VVDsKIG1vZHVsZV9wYXJhbShpbml0aWFsX2Rlc2NyaXB0b3JfdGltZW91dCwgaW50LCBTX0lSVUdPfFNfSVdVU1IpOwotTU9EVUxFX1BBUk1fREVTQyhpbml0aWFsX2Rlc2NyaXB0b3JfdGltZW91dCwgImluaXRpYWwgNjQtYnl0ZSBkZXNjcmlwdG9yIHJlcXVlc3QgdGltZW91dCBpbiBtaWxsaXNlY29uZHMgKGRlZmF1bHQgNTAwMCAtIDUuMCBzZWNvbmRzKSIpOworTU9EVUxFX1BBUk1fREVTQyhpbml0aWFsX2Rlc2NyaXB0b3JfdGltZW91dCwKKwkJImluaXRpYWwgNjQtYnl0ZSBkZXNjcmlwdG9yIHJlcXVlc3QgdGltZW91dCBpbiBtaWxsaXNlY29uZHMgIgorCQkiKGRlZmF1bHQgNTAwMCAtIDUuMCBzZWNvbmRzKSIpOwogCiAvKgogICogQXMgb2YgMi42LjEwIHdlIGludHJvZHVjZSBhIG5ldyBVU0IgZGV2aWNlIGluaXRpYWxpemF0aW9uIHNjaGVtZSB3aGljaApAQCAtMTEzNiw4ICsxMTM4LDggQEAKIAloZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldihpbnRmKTsKIAogCWlmIChoZGV2LT5sZXZlbCA9PSBNQVhfVE9QT19MRVZFTCkgewotCQlkZXZfZXJyKCZpbnRmLT5kZXYsICJVbnN1cHBvcnRlZCBidXMgdG9wb2xvZ3k6ICIKLQkJCQkiaHViIG5lc3RlZCB0b28gZGVlcFxuIik7CisJCWRldl9lcnIoJmludGYtPmRldiwKKwkJCSJVbnN1cHBvcnRlZCBidXMgdG9wb2xvZ3k6IGh1YiBuZXN0ZWQgdG9vIGRlZXBcbiIpOwogCQlyZXR1cm4gLUUyQklHOwogCX0KIApAQCAtMTM3NCw4ICsxMzc2LDkgQEAKIAkJdXNiX2F1dG9zdXNwZW5kX2RldmljZSh1ZGV2LT5wYXJlbnQpOwogCXVzYl9wbV91bmxvY2sodWRldik7CiAKLQkvKiBTdG9wIGFueSBhdXRvc3VzcGVuZCByZXF1ZXN0cyBhbHJlYWR5IHN1Ym1pdHRlZCAqLwotCWNhbmNlbF9yZWFybWluZ19kZWxheWVkX3dvcmsoJnVkZXYtPmF1dG9zdXNwZW5kKTsKKwkvKiBTdG9wIGFueSBhdXRvc3VzcGVuZCBvciBhdXRvcmVzdW1lIHJlcXVlc3RzIGFscmVhZHkgc3VibWl0dGVkICovCisJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZ1ZGV2LT5hdXRvc3VzcGVuZCk7CisJY2FuY2VsX3dvcmtfc3luYygmdWRldi0+YXV0b3Jlc3VtZSk7CiB9CiAKICNlbHNlCkBAIC0xNDM0LDE3ICsxNDM3LDEyIEBACiAJdXNiX2Rpc2FibGVfZGV2aWNlKHVkZXYsIDApOwogCXVzYl9oY2Rfc3luY2hyb25pemVfdW5saW5rcyh1ZGV2KTsKIAorCXVzYl9yZW1vdmVfZXBfZGV2cygmdWRldi0+ZXAwKTsKIAl1c2JfdW5sb2NrX2RldmljZSh1ZGV2KTsKIAotCS8qIFJlbW92ZSB0aGUgZGV2aWNlLXNwZWNpZmljIGZpbGVzIGZyb20gc3lzZnMuICBUaGlzIG11c3QgYmUKLQkgKiBkb25lIHdpdGggdWRldiB1bmxvY2tlZCwgYmVjYXVzZSBzb21lIG9mIHRoZSBhdHRyaWJ1dGUKLQkgKiByb3V0aW5lcyB0cnkgdG8gYWNxdWlyZSB0aGUgZGV2aWNlIGxvY2suCi0JICovCi0JdXNiX3JlbW92ZV9zeXNmc19kZXZfZmlsZXModWRldik7Ci0KIAkvKiBVbnJlZ2lzdGVyIHRoZSBkZXZpY2UuICBUaGUgZGV2aWNlIGRyaXZlciBpcyByZXNwb25zaWJsZQotCSAqIGZvciByZW1vdmluZyB0aGUgZGV2aWNlIGZpbGVzIGZyb20gdXNiZnMgYW5kIHN5c2ZzIGFuZCBmb3IKLQkgKiBkZS1jb25maWd1cmluZyB0aGUgZGV2aWNlLgorCSAqIGZvciBkZS1jb25maWd1cmluZyB0aGUgZGV2aWNlIGFuZCBpbnZva2luZyB0aGUgcmVtb3ZlLWRldmljZQorCSAqIG5vdGlmaWVyIGNoYWluICh1c2VkIGJ5IHVzYmZzIGFuZCBwb3NzaWJseSBvdGhlcnMpLgogCSAqLwogCWRldmljZV9kZWwoJnVkZXYtPmRldik7CiAKQEAgLTE0NzYsOCArMTQ3NCw4IEBACiAJZGV2X2luZm8oJnVkZXYtPmRldiwgIk5ldyBVU0IgZGV2aWNlIGZvdW5kLCBpZFZlbmRvcj0lMDR4LCBpZFByb2R1Y3Q9JTA0eFxuIiwKIAkJbGUxNl90b19jcHUodWRldi0+ZGVzY3JpcHRvci5pZFZlbmRvciksCiAJCWxlMTZfdG9fY3B1KHVkZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0KSk7Ci0JZGV2X2luZm8oJnVkZXYtPmRldiwgIk5ldyBVU0IgZGV2aWNlIHN0cmluZ3M6IE1mcj0lZCwgUHJvZHVjdD0lZCwgIgotCQkiU2VyaWFsTnVtYmVyPSVkXG4iLAorCWRldl9pbmZvKCZ1ZGV2LT5kZXYsCisJCSJOZXcgVVNCIGRldmljZSBzdHJpbmdzOiBNZnI9JWQsIFByb2R1Y3Q9JWQsIFNlcmlhbE51bWJlcj0lZFxuIiwKIAkJdWRldi0+ZGVzY3JpcHRvci5pTWFudWZhY3R1cmVyLAogCQl1ZGV2LT5kZXNjcmlwdG9yLmlQcm9kdWN0LAogCQl1ZGV2LT5kZXNjcmlwdG9yLmlTZXJpYWxOdW1iZXIpOwpAQCAtMTU0Miw3ICsxNTQwLDcgQEAKIAkJCQkJICogY3VzdG9taXplIHRvIG1hdGNoIHlvdXIgcHJvZHVjdC4KIAkJCQkJICovCiAJCQkJCWRldl9pbmZvKCZ1ZGV2LT5kZXYsCi0JCQkJCQkiY2FuJ3Qgc2V0IEhOUCBtb2RlOyAlZFxuIiwKKwkJCQkJCSJjYW4ndCBzZXQgSE5QIG1vZGU6ICVkXG4iLAogCQkJCQkJZXJyKTsKIAkJCQkJYnVzLT5iX2hucF9lbmFibGUgPSAwOwogCQkJCX0KQEAgLTE2MzUsNiArMTYzMywxMCBAQAogewogCWludCBlcnI7CiAKKwkvKiBJbmNyZW1lbnQgdGhlIHBhcmVudCdzIGNvdW50IG9mIHVuc3VzcGVuZGVkIGNoaWxkcmVuICovCisJaWYgKHVkZXYtPnBhcmVudCkKKwkJdXNiX2F1dG9yZXN1bWVfZGV2aWNlKHVkZXYtPnBhcmVudCk7CisKIAl1c2JfZGV0ZWN0X3F1aXJrcyh1ZGV2KTsJCS8qIERldGVybWluZSBxdWlya3MgKi8KIAllcnIgPSB1c2JfY29uZmlndXJlX2RldmljZSh1ZGV2KTsJLyogZGV0ZWN0ICYgcHJvYmUgZGV2L2ludGZzICovCiAJaWYgKGVyciA8IDApCkBAIC0xNjQzLDEzICsxNjQ1LDEyIEBACiAJdWRldi0+ZGV2LmRldnQgPSBNS0RFVihVU0JfREVWSUNFX01BSk9SLAogCQkJKCgodWRldi0+YnVzLT5idXNudW0tMSkgKiAxMjgpICsgKHVkZXYtPmRldm51bS0xKSkpOwogCi0JLyogSW5jcmVtZW50IHRoZSBwYXJlbnQncyBjb3VudCBvZiB1bnN1c3BlbmRlZCBjaGlsZHJlbiAqLwotCWlmICh1ZGV2LT5wYXJlbnQpCi0JCXVzYl9hdXRvcmVzdW1lX2RldmljZSh1ZGV2LT5wYXJlbnQpOworCS8qIFRlbGwgdGhlIHdvcmxkISAqLworCWFubm91bmNlX2RldmljZSh1ZGV2KTsKIAogCS8qIFJlZ2lzdGVyIHRoZSBkZXZpY2UuICBUaGUgZGV2aWNlIGRyaXZlciBpcyByZXNwb25zaWJsZQotCSAqIGZvciBhZGRpbmcgdGhlIGRldmljZSBmaWxlcyB0byBzeXNmcyBhbmQgZm9yIGNvbmZpZ3VyaW5nCi0JICogdGhlIGRldmljZS4KKwkgKiBmb3IgY29uZmlndXJpbmcgdGhlIGRldmljZSBhbmQgaW52b2tpbmcgdGhlIGFkZC1kZXZpY2UKKwkgKiBub3RpZmllciBjaGFpbiAodXNlZCBieSB1c2JmcyBhbmQgcG9zc2libHkgb3RoZXJzKS4KIAkgKi8KIAllcnIgPSBkZXZpY2VfYWRkKCZ1ZGV2LT5kZXYpOwogCWlmIChlcnIpIHsKQEAgLTE2NTcsMTUgKzE2NTgsMTIgQEAKIAkJZ290byBmYWlsOwogCX0KIAotCS8qIHB1dCBkZXZpY2Utc3BlY2lmaWMgZmlsZXMgaW50byBzeXNmcyAqLwotCXVzYl9jcmVhdGVfc3lzZnNfZGV2X2ZpbGVzKHVkZXYpOwotCi0JLyogVGVsbCB0aGUgd29ybGQhICovCi0JYW5ub3VuY2VfZGV2aWNlKHVkZXYpOworCSh2b2lkKSB1c2JfY3JlYXRlX2VwX2RldnMoJnVkZXYtPmRldiwgJnVkZXYtPmVwMCwgdWRldik7CiAJcmV0dXJuIGVycjsKIAogZmFpbDoKIAl1c2Jfc2V0X2RldmljZV9zdGF0ZSh1ZGV2LCBVU0JfU1RBVEVfTk9UQVRUQUNIRUQpOworCXVzYl9zdG9wX3BtKHVkZXYpOwogCXJldHVybiBlcnI7CiB9CiAKQEAgLTE5ODIsNyArMTk4MCw3IEBACiAgKgogICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIGVsc2UgbmVnYXRpdmUgZXJybm8uCiAgKi8KLWludCB1c2JfcG9ydF9zdXNwZW5kKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2KQoraW50IHVzYl9wb3J0X3N1c3BlbmQoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYsIHBtX21lc3NhZ2VfdCBtc2cpCiB7CiAJc3RydWN0IHVzYl9odWIJKmh1YiA9IGhkZXZfdG9faHViKHVkZXYtPnBhcmVudCk7CiAJaW50CQlwb3J0MSA9IHVkZXYtPnBvcnRudW07CkBAIC0yMDIxLDcgKzIwMTksNyBAQAogCX0gZWxzZSB7CiAJCS8qIGRldmljZSBoYXMgdXAgdG8gMTAgbXNlYyB0byBmdWxseSBzdXNwZW5kICovCiAJCWRldl9kYmcoJnVkZXYtPmRldiwgInVzYiAlc3N1c3BlbmRcbiIsCi0JCQkJdWRldi0+YXV0b19wbSA/ICJhdXRvLSIgOiAiIik7CisJCQkJKG1zZy5ldmVudCAmIFBNX0VWRU5UX0FVVE8gPyAiYXV0by0iIDogIiIpKTsKIAkJdXNiX3NldF9kZXZpY2Vfc3RhdGUodWRldiwgVVNCX1NUQVRFX1NVU1BFTkRFRCk7CiAJCW1zbGVlcCgxMCk7CiAJfQpAQCAtMjA0NSw4ICsyMDQzLDggQEAKIAl1MTYJZGV2c3RhdHVzOwogCiAJLyogY2FsbGVyIG93bnMgdGhlIHVkZXYgZGV2aWNlIGxvY2sgKi8KLQlkZXZfZGJnKCZ1ZGV2LT5kZXYsICJmaW5pc2ggJXNyZXN1bWVcbiIsCi0JCQl1ZGV2LT5yZXNldF9yZXN1bWUgPyAicmVzZXQtIiA6ICIiKTsKKwlkZXZfZGJnKCZ1ZGV2LT5kZXYsICIlc1xuIiwKKwkJdWRldi0+cmVzZXRfcmVzdW1lID8gImZpbmlzaCByZXNldC1yZXN1bWUiIDogImZpbmlzaCByZXN1bWUiKTsKIAogCS8qIHVzYiBjaDkgaWRlbnRpZmllcyBmb3VyIHZhcmlhbnRzIG9mIFNVU1BFTkRFRCwgYmFzZWQgb24gd2hhdAogCSAqIHN0YXRlIHRoZSBkZXZpY2UgcmVzdW1lcyB0by4gIExpbnV4IGN1cnJlbnRseSB3b24ndCBzZWUgdGhlCkBAIC0yMDk4LDggKzIwOTYsOSBAQAogCQkJCQlOVUxMLCAwLAogCQkJCQlVU0JfQ1RSTF9TRVRfVElNRU9VVCk7CiAJCQlpZiAoc3RhdHVzKQotCQkJCWRldl9kYmcoJnVkZXYtPmRldiwgImRpc2FibGUgcmVtb3RlICIKLQkJCQkJIndha2V1cCwgc3RhdHVzICVkXG4iLCBzdGF0dXMpOworCQkJCWRldl9kYmcoJnVkZXYtPmRldiwKKwkJCQkJImRpc2FibGUgcmVtb3RlIHdha2V1cCwgc3RhdHVzICVkXG4iLAorCQkJCQlzdGF0dXMpOwogCQl9CiAJCXN0YXR1cyA9IDA7CiAJfQpAQCAtMjE0MCw3ICsyMTM5LDcgQEAKICAqCiAgKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgZWxzZSBuZWdhdGl2ZSBlcnJuby4KICAqLwotaW50IHVzYl9wb3J0X3Jlc3VtZShzdHJ1Y3QgdXNiX2RldmljZSAqdWRldikKK2ludCB1c2JfcG9ydF9yZXN1bWUoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYsIHBtX21lc3NhZ2VfdCBtc2cpCiB7CiAJc3RydWN0IHVzYl9odWIJKmh1YiA9IGhkZXZfdG9faHViKHVkZXYtPnBhcmVudCk7CiAJaW50CQlwb3J0MSA9IHVkZXYtPnBvcnRudW07CkBAIC0yMTY1LDcgKzIxNjQsNyBAQAogCX0gZWxzZSB7CiAJCS8qIGRyaXZlIHJlc3VtZSBmb3IgYXQgbGVhc3QgMjAgbXNlYyAqLwogCQlkZXZfZGJnKCZ1ZGV2LT5kZXYsICJ1c2IgJXNyZXN1bWVcbiIsCi0JCQkJdWRldi0+YXV0b19wbSA/ICJhdXRvLSIgOiAiIik7CisJCQkJKG1zZy5ldmVudCAmIFBNX0VWRU5UX0FVVE8gPyAiYXV0by0iIDogIiIpKTsKIAkJbXNsZWVwKDI1KTsKIAogCQkvKiBWaXJ0dWFsIHJvb3QgaHVicyBjYW4gdHJpZ2dlciBvbiBHRVRfUE9SVF9TVEFUVVMgdG8KQEAgLTIyMDYsNyArMjIwNSw3IEBACiAJaWYgKHVkZXYtPnN0YXRlID09IFVTQl9TVEFURV9TVVNQRU5ERUQpIHsKIAkJZGV2X2RiZygmdWRldi0+ZGV2LCAidXNiICVzcmVzdW1lXG4iLCAid2FrZXVwLSIpOwogCQl1c2JfbWFya19sYXN0X2J1c3kodWRldik7Ci0JCXN0YXR1cyA9IHVzYl9leHRlcm5hbF9yZXN1bWVfZGV2aWNlKHVkZXYpOworCQlzdGF0dXMgPSB1c2JfZXh0ZXJuYWxfcmVzdW1lX2RldmljZSh1ZGV2LCBQTVNHX1JFTU9URV9SRVNVTUUpOwogCX0KIAlyZXR1cm4gc3RhdHVzOwogfQpAQCAtMjIxNSwxNCArMjIxNCwxNCBAQAogCiAvKiBXaGVuIENPTkZJR19VU0JfU1VTUEVORCBpc24ndCBzZXQsIHdlIG5ldmVyIHN1c3BlbmQgb3IgcmVzdW1lIGFueSBwb3J0cy4gKi8KIAotaW50IHVzYl9wb3J0X3N1c3BlbmQoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYpCitpbnQgdXNiX3BvcnRfc3VzcGVuZChzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiwgcG1fbWVzc2FnZV90IG1zZykKIHsKIAlyZXR1cm4gMDsKIH0KIAogLyogSG93ZXZlciB3ZSBtYXkgbmVlZCB0byBkbyBhIHJlc2V0LXJlc3VtZSAqLwogCi1pbnQgdXNiX3BvcnRfcmVzdW1lKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2KQoraW50IHVzYl9wb3J0X3Jlc3VtZShzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiwgcG1fbWVzc2FnZV90IG1zZykKIHsKIAlzdHJ1Y3QgdXNiX2h1YgkqaHViID0gaGRldl90b19odWIodWRldi0+cGFyZW50KTsKIAlpbnQJCXBvcnQxID0gdWRldi0+cG9ydG51bTsKQEAgLTIyNjIsNyArMjI2MSw3IEBACiAKIAkJdWRldiA9IGhkZXYtPmNoaWxkcmVuIFtwb3J0MS0xXTsKIAkJaWYgKHVkZXYgJiYgdWRldi0+Y2FuX3N1Ym1pdCkgewotCQkJaWYgKCFoZGV2LT5hdXRvX3BtKQorCQkJaWYgKCEobXNnLmV2ZW50ICYgUE1fRVZFTlRfQVVUTykpCiAJCQkJZGV2X2RiZygmaW50Zi0+ZGV2LCAicG9ydCAlZCBueWV0IHN1c3BlbmRlZFxuIiwKIAkJCQkJCXBvcnQxKTsKIAkJCXJldHVybiAtRUJVU1k7CkBAIC0yMzg1LDcgKzIzODQsNyBAQAogewogCXVzYl9kaXNhYmxlX2VuZHBvaW50KHVkZXYsIDAgKyBVU0JfRElSX0lOKTsKIAl1c2JfZGlzYWJsZV9lbmRwb2ludCh1ZGV2LCAwICsgVVNCX0RJUl9PVVQpOwotCXVzYl9lbmFibGVfZW5kcG9pbnQodWRldiwgJnVkZXYtPmVwMCk7CisJdXNiX2VuYWJsZV9lbmRwb2ludCh1ZGV2LCAmdWRldi0+ZXAwLCB0cnVlKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHVzYl9lcDBfcmVpbml0KTsKIApAQCAtMjU4Miw5ICsyNTgxLDkgQEAKIAkJCQlnb3RvIGZhaWw7CiAJCQl9CiAJCQlpZiAocikgewotCQkJCWRldl9lcnIoJnVkZXYtPmRldiwgImRldmljZSBkZXNjcmlwdG9yICIKLQkJCQkJCSJyZWFkLyVzLCBlcnJvciAlZFxuIiwKLQkJCQkJCSI2NCIsIHIpOworCQkJCWRldl9lcnIoJnVkZXYtPmRldiwKKwkJCQkJImRldmljZSBkZXNjcmlwdG9yIHJlYWQvNjQsIGVycm9yICVkXG4iLAorCQkJCQlyKTsKIAkJCQlyZXR2YWwgPSAtRU1TR1NJWkU7CiAJCQkJY29udGludWU7CiAJCQl9CkBAIC0yNjIxLDkgKzI2MjAsOSBAQAogCiAJCXJldHZhbCA9IHVzYl9nZXRfZGV2aWNlX2Rlc2NyaXB0b3IodWRldiwgOCk7CiAJCWlmIChyZXR2YWwgPCA4KSB7Ci0JCQlkZXZfZXJyKCZ1ZGV2LT5kZXYsICJkZXZpY2UgZGVzY3JpcHRvciAiCi0JCQkJCSJyZWFkLyVzLCBlcnJvciAlZFxuIiwKLQkJCQkJIjgiLCByZXR2YWwpOworCQkJZGV2X2VycigmdWRldi0+ZGV2LAorCQkJCQkiZGV2aWNlIGRlc2NyaXB0b3IgcmVhZC84LCBlcnJvciAlZFxuIiwKKwkJCQkJcmV0dmFsKTsKIAkJCWlmIChyZXR2YWwgPj0gMCkKIAkJCQlyZXR2YWwgPSAtRU1TR1NJWkU7CiAJCX0gZWxzZSB7CkBAIC0yNjUwLDggKzI2NDksOCBAQAogICAKIAlyZXR2YWwgPSB1c2JfZ2V0X2RldmljZV9kZXNjcmlwdG9yKHVkZXYsIFVTQl9EVF9ERVZJQ0VfU0laRSk7CiAJaWYgKHJldHZhbCA8IChzaWduZWQpc2l6ZW9mKHVkZXYtPmRlc2NyaXB0b3IpKSB7Ci0JCWRldl9lcnIoJnVkZXYtPmRldiwgImRldmljZSBkZXNjcmlwdG9yIHJlYWQvJXMsIGVycm9yICVkXG4iLAotCQkJImFsbCIsIHJldHZhbCk7CisJCWRldl9lcnIoJnVkZXYtPmRldiwgImRldmljZSBkZXNjcmlwdG9yIHJlYWQvYWxsLCBlcnJvciAlZFxuIiwKKwkJCXJldHZhbCk7CiAJCWlmIChyZXR2YWwgPj0gMCkKIAkJCXJldHZhbCA9IC1FTk9NU0c7CiAJCWdvdG8gZmFpbDsKQEAgLTI3MTksOSArMjcxOCw5IEBACiAJCWVsc2UKIAkJCWRlbHRhID0gODsKIAkJaWYgKGRlbHRhID4gaHViLT5tQV9wZXJfcG9ydCkKLQkJCWRldl93YXJuKCZ1ZGV2LT5kZXYsICIlZG1BIGlzIG92ZXIgJXVtQSBidWRnZXQgIgotCQkJCQkiZm9yIHBvcnQgJWQhXG4iLAotCQkJCQlkZWx0YSwgaHViLT5tQV9wZXJfcG9ydCwgcG9ydDEpOworCQkJZGV2X3dhcm4oJnVkZXYtPmRldiwKKwkJCQkgIiVkbUEgaXMgb3ZlciAldW1BIGJ1ZGdldCBmb3IgcG9ydCAlZCFcbiIsCisJCQkJIGRlbHRhLCBodWItPm1BX3Blcl9wb3J0LCBwb3J0MSk7CiAJCXJlbWFpbmluZyAtPSBkZWx0YTsKIAl9CiAJaWYgKHJlbWFpbmluZyA8IDApIHsKQEAgLTM1MTcsMyArMzUxNiw0NiBAQAogCXJldHVybiByZXQ7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTCh1c2JfcmVzZXRfZGV2aWNlKTsKKworCisvKioKKyAqIHVzYl9xdWV1ZV9yZXNldF9kZXZpY2UgLSBSZXNldCBhIFVTQiBkZXZpY2UgZnJvbSBhbiBhdG9taWMgY29udGV4dAorICogQGlmYWNlOiBVU0IgaW50ZXJmYWNlIGJlbG9uZ2luZyB0byB0aGUgZGV2aWNlIHRvIHJlc2V0CisgKgorICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byByZXNldCBhIFVTQiBkZXZpY2UgZnJvbSBhbiBhdG9taWMKKyAqIGNvbnRleHQsIHdoZXJlIHVzYl9yZXNldF9kZXZpY2UoKSB3b24ndCB3b3JrIChhcyBpdCBibG9ja3MpLgorICoKKyAqIERvaW5nIGEgcmVzZXQgdmlhIHRoaXMgbWV0aG9kIGlzIGZ1bmN0aW9uYWxseSBlcXVpdmFsZW50IHRvIGNhbGxpbmcKKyAqIHVzYl9yZXNldF9kZXZpY2UoKSwgZXhjZXB0IGZvciB0aGUgZmFjdCB0aGF0IGl0IGlzIGRlbGF5ZWQgdG8gYQorICogd29ya3F1ZXVlLiBUaGlzIG1lYW5zIHRoYXQgYW55IGRyaXZlcnMgYm91bmQgdG8gb3RoZXIgaW50ZXJmYWNlcworICogbWlnaHQgYmUgdW5ib3VuZCwgYXMgd2VsbCBhcyB1c2VycyBmcm9tIHVzYmZzIGluIHVzZXIgc3BhY2UuCisgKgorICogQ29ybmVyIGNhc2VzOgorICoKKyAqIC0gU2NoZWR1bGluZyB0d28gcmVzZXRzIGF0IHRoZSBzYW1lIHRpbWUgZnJvbSB0d28gZGlmZmVyZW50IGRyaXZlcnMKKyAqICAgYXR0YWNoZWQgdG8gdHdvIGRpZmZlcmVudCBpbnRlcmZhY2VzIG9mIHRoZSBzYW1lIGRldmljZSBpcworICogICBwb3NzaWJsZTsgZGVwZW5kaW5nIG9uIGhvdyB0aGUgZHJpdmVyIGF0dGFjaGVkIHRvIGVhY2ggaW50ZXJmYWNlCisgKiAgIGhhbmRsZXMgLT5wcmVfcmVzZXQoKSwgdGhlIHNlY29uZCByZXNldCBtaWdodCBoYXBwZW4gb3Igbm90LgorICoKKyAqIC0gSWYgYSBkcml2ZXIgaXMgdW5ib3VuZCBhbmQgaXQgaGFkIGEgcGVuZGluZyByZXNldCwgdGhlIHJlc2V0IHdpbGwKKyAqICAgYmUgY2FuY2VsbGVkLgorICoKKyAqIC0gVGhpcyBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkIGR1cmluZyAucHJvYmUoKSBvciAuZGlzY29ubmVjdCgpCisgKiAgIHRpbWVzLiBPbiByZXR1cm4gZnJvbSAuZGlzY29ubmVjdCgpLCBhbnkgcGVuZGluZyByZXNldHMgd2lsbCBiZQorICogICBjYW5jZWxsZWQuCisgKgorICogVGhlcmUgaXMgbm8gbm8gbmVlZCB0byBsb2NrL3VubG9jayB0aGUgQHJlc2V0X3dzIGFzIHNjaGVkdWxlX3dvcmsoKQorICogZG9lcyBpdHMgb3duLgorICoKKyAqIE5PVEU6IFdlIGRvbid0IGRvIGFueSByZWZlcmVuY2UgY291bnQgdHJhY2tpbmcgYmVjYXVzZSBpdCBpcyBub3QKKyAqICAgICBuZWVkZWQuIFRoZSBsaWZlY3ljbGUgb2YgdGhlIHdvcmtfc3RydWN0IGlzIHRpZWQgdG8gdGhlCisgKiAgICAgdXNiX2ludGVyZmFjZS4gQmVmb3JlIGRlc3Ryb3lpbmcgdGhlIGludGVyZmFjZSB3ZSBjYW5jZWwgdGhlCisgKiAgICAgd29ya19zdHJ1Y3QsIHNvIHRoZSBmYWN0IHRoYXQgd29ya19zdHJ1Y3QgaXMgcXVldWVkIGFuZCBvcgorICogICAgIHJ1bm5pbmcgbWVhbnMgdGhlIGludGVyZmFjZSAoYW5kIHRodXMsIHRoZSBkZXZpY2UpIGV4aXN0IGFuZAorICogICAgIGFyZSByZWZlcmVuY2VkLgorICovCit2b2lkIHVzYl9xdWV1ZV9yZXNldF9kZXZpY2Uoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmlmYWNlKQoreworCXNjaGVkdWxlX3dvcmsoJmlmYWNlLT5yZXNldF93cyk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh1c2JfcXVldWVfcmVzZXRfZGV2aWNlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NvcmUvaW5vZGUuYyBiL2RyaXZlcnMvdXNiL2NvcmUvaW5vZGUuYwppbmRleCAxODViZTc2Li4yYTEyOWNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jb3JlL2lub2RlLmMKKysrIGIvZHJpdmVycy91c2IvY29yZS9pbm9kZS5jCkBAIC0yNzksNyArMjc5LDYgQEAKIAkJaW5vZGUtPmlfbW9kZSA9IG1vZGU7CiAJCWlub2RlLT5pX3VpZCA9IGN1cnJlbnRfZnN1aWQoKTsKIAkJaW5vZGUtPmlfZ2lkID0gY3VycmVudF9mc2dpZCgpOwotCQlpbm9kZS0+aV9ibG9ja3MgPSAwOwogCQlpbm9kZS0+aV9hdGltZSA9IGlub2RlLT5pX210aW1lID0gaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUU7CiAJCXN3aXRjaCAobW9kZSAmIFNfSUZNVCkgewogCQlkZWZhdWx0OgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY29yZS9tZXNzYWdlLmMgYi9kcml2ZXJzL3VzYi9jb3JlL21lc3NhZ2UuYwppbmRleCA2ZDEwNDhmLi5kZTUxNjY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jb3JlL21lc3NhZ2UuYworKysgYi9kcml2ZXJzL3VzYi9jb3JlL21lc3NhZ2UuYwpAQCAtMTgsNiArMTgsOCBAQAogI2luY2x1ZGUgImhjZC5oIgkvKiBmb3IgdXNiY29yZSBpbnRlcm5hbHMgKi8KICNpbmNsdWRlICJ1c2IuaCIKIAorc3RhdGljIHZvaWQgY2FuY2VsX2FzeW5jX3NldF9jb25maWcoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYpOworCiBzdHJ1Y3QgYXBpX2NvbnRleHQgewogCXN0cnVjdCBjb21wbGV0aW9uCWRvbmU7CiAJaW50CQkJc3RhdHVzOwpAQCAtMTM5LDkgKzE0MSw5IEBACiAKIAlkci0+YlJlcXVlc3RUeXBlID0gcmVxdWVzdHR5cGU7CiAJZHItPmJSZXF1ZXN0ID0gcmVxdWVzdDsKLQlkci0+d1ZhbHVlID0gY3B1X3RvX2xlMTZwKCZ2YWx1ZSk7Ci0JZHItPndJbmRleCA9IGNwdV90b19sZTE2cCgmaW5kZXgpOwotCWRyLT53TGVuZ3RoID0gY3B1X3RvX2xlMTZwKCZzaXplKTsKKwlkci0+d1ZhbHVlID0gY3B1X3RvX2xlMTYodmFsdWUpOworCWRyLT53SW5kZXggPSBjcHVfdG9fbGUxNihpbmRleCk7CisJZHItPndMZW5ndGggPSBjcHVfdG9fbGUxNihzaXplKTsKIAogCS8qIGRiZygidXNiX2NvbnRyb2xfbXNnIik7ICovCiAKQEAgLTEwMDQsNiArMTAwNiwzNCBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwodXNiX2NsZWFyX2hhbHQpOwogCitzdGF0aWMgaW50IGNyZWF0ZV9pbnRmX2VwX2RldnMoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCit7CisJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpOworCXN0cnVjdCB1c2JfaG9zdF9pbnRlcmZhY2UgKmFsdCA9IGludGYtPmN1cl9hbHRzZXR0aW5nOworCWludCBpOworCisJaWYgKGludGYtPmVwX2RldnNfY3JlYXRlZCB8fCBpbnRmLT51bnJlZ2lzdGVyaW5nKQorCQlyZXR1cm4gMDsKKworCWZvciAoaSA9IDA7IGkgPCBhbHQtPmRlc2MuYk51bUVuZHBvaW50czsgKytpKQorCQkodm9pZCkgdXNiX2NyZWF0ZV9lcF9kZXZzKCZpbnRmLT5kZXYsICZhbHQtPmVuZHBvaW50W2ldLCB1ZGV2KTsKKwlpbnRmLT5lcF9kZXZzX2NyZWF0ZWQgPSAxOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCByZW1vdmVfaW50Zl9lcF9kZXZzKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQoreworCXN0cnVjdCB1c2JfaG9zdF9pbnRlcmZhY2UgKmFsdCA9IGludGYtPmN1cl9hbHRzZXR0aW5nOworCWludCBpOworCisJaWYgKCFpbnRmLT5lcF9kZXZzX2NyZWF0ZWQpCisJCXJldHVybjsKKworCWZvciAoaSA9IDA7IGkgPCBhbHQtPmRlc2MuYk51bUVuZHBvaW50czsgKytpKQorCQl1c2JfcmVtb3ZlX2VwX2RldnMoJmFsdC0+ZW5kcG9pbnRbaV0pOworCWludGYtPmVwX2RldnNfY3JlYXRlZCA9IDA7Cit9CisKIC8qKgogICogdXNiX2Rpc2FibGVfZW5kcG9pbnQgLS0gRGlzYWJsZSBhbiBlbmRwb2ludCBieSBhZGRyZXNzCiAgKiBAZGV2OiB0aGUgZGV2aWNlIHdob3NlIGVuZHBvaW50IGlzIGJlaW5nIGRpc2FibGVkCkBAIC0xMDkyLDcgKzExMjIsNyBAQAogCQkJZGV2X2RiZygmZGV2LT5kZXYsICJ1bnJlZ2lzdGVyaW5nIGludGVyZmFjZSAlc1xuIiwKIAkJCQlkZXZfbmFtZSgmaW50ZXJmYWNlLT5kZXYpKTsKIAkJCWludGVyZmFjZS0+dW5yZWdpc3RlcmluZyA9IDE7Ci0JCQl1c2JfcmVtb3ZlX3N5c2ZzX2ludGZfZmlsZXMoaW50ZXJmYWNlKTsKKwkJCXJlbW92ZV9pbnRmX2VwX2RldnMoaW50ZXJmYWNlKTsKIAkJCWRldmljZV9kZWwoJmludGVyZmFjZS0+ZGV2KTsKIAkJfQogCkBAIC0xMTEzLDIyICsxMTQzLDI2IEBACiAgKiB1c2JfZW5hYmxlX2VuZHBvaW50IC0gRW5hYmxlIGFuIGVuZHBvaW50IGZvciBVU0IgY29tbXVuaWNhdGlvbnMKICAqIEBkZXY6IHRoZSBkZXZpY2Ugd2hvc2UgaW50ZXJmYWNlIGlzIGJlaW5nIGVuYWJsZWQKICAqIEBlcDogdGhlIGVuZHBvaW50CisgKiBAcmVzZXRfdG9nZ2xlOiBmbGFnIHRvIHNldCB0aGUgZW5kcG9pbnQncyB0b2dnbGUgYmFjayB0byAwCiAgKgotICogUmVzZXRzIHRoZSBlbmRwb2ludCB0b2dnbGUsIGFuZCBzZXRzIGRldi0+ZXBfe2luLG91dH0gcG9pbnRlcnMuCisgKiBSZXNldHMgdGhlIGVuZHBvaW50IHRvZ2dsZSBpZiBhc2tlZCwgYW5kIHNldHMgZGV2LT5lcF97aW4sb3V0fSBwb2ludGVycy4KICAqIEZvciBjb250cm9sIGVuZHBvaW50cywgYm90aCB0aGUgaW5wdXQgYW5kIG91dHB1dCBzaWRlcyBhcmUgaGFuZGxlZC4KICAqLwotdm9pZCB1c2JfZW5hYmxlX2VuZHBvaW50KHN0cnVjdCB1c2JfZGV2aWNlICpkZXYsIHN0cnVjdCB1c2JfaG9zdF9lbmRwb2ludCAqZXApCit2b2lkIHVzYl9lbmFibGVfZW5kcG9pbnQoc3RydWN0IHVzYl9kZXZpY2UgKmRldiwgc3RydWN0IHVzYl9ob3N0X2VuZHBvaW50ICplcCwKKwkJYm9vbCByZXNldF90b2dnbGUpCiB7CiAJaW50IGVwbnVtID0gdXNiX2VuZHBvaW50X251bSgmZXAtPmRlc2MpOwogCWludCBpc19vdXQgPSB1c2JfZW5kcG9pbnRfZGlyX291dCgmZXAtPmRlc2MpOwogCWludCBpc19jb250cm9sID0gdXNiX2VuZHBvaW50X3hmZXJfY29udHJvbCgmZXAtPmRlc2MpOwogCiAJaWYgKGlzX291dCB8fCBpc19jb250cm9sKSB7Ci0JCXVzYl9zZXR0b2dnbGUoZGV2LCBlcG51bSwgMSwgMCk7CisJCWlmIChyZXNldF90b2dnbGUpCisJCQl1c2Jfc2V0dG9nZ2xlKGRldiwgZXBudW0sIDEsIDApOwogCQlkZXYtPmVwX291dFtlcG51bV0gPSBlcDsKIAl9CiAJaWYgKCFpc19vdXQgfHwgaXNfY29udHJvbCkgewotCQl1c2Jfc2V0dG9nZ2xlKGRldiwgZXBudW0sIDAsIDApOworCQlpZiAocmVzZXRfdG9nZ2xlKQorCQkJdXNiX3NldHRvZ2dsZShkZXYsIGVwbnVtLCAwLCAwKTsKIAkJZGV2LT5lcF9pbltlcG51bV0gPSBlcDsKIAl9CiAJZXAtPmVuYWJsZWQgPSAxOwpAQCAtMTEzOCwxNyArMTE3MiwxOCBAQAogICogdXNiX2VuYWJsZV9pbnRlcmZhY2UgLSBFbmFibGUgYWxsIHRoZSBlbmRwb2ludHMgZm9yIGFuIGludGVyZmFjZQogICogQGRldjogdGhlIGRldmljZSB3aG9zZSBpbnRlcmZhY2UgaXMgYmVpbmcgZW5hYmxlZAogICogQGludGY6IHBvaW50ZXIgdG8gdGhlIGludGVyZmFjZSBkZXNjcmlwdG9yCisgKiBAcmVzZXRfdG9nZ2xlczogZmxhZyB0byBzZXQgdGhlIGVuZHBvaW50cycgdG9nZ2xlcyBiYWNrIHRvIDAKICAqCiAgKiBFbmFibGVzIGFsbCB0aGUgZW5kcG9pbnRzIGZvciB0aGUgaW50ZXJmYWNlJ3MgY3VycmVudCBhbHRzZXR0aW5nLgogICovCi1zdGF0aWMgdm9pZCB1c2JfZW5hYmxlX2ludGVyZmFjZShzdHJ1Y3QgdXNiX2RldmljZSAqZGV2LAotCQkJCSBzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKK3ZvaWQgdXNiX2VuYWJsZV9pbnRlcmZhY2Uoc3RydWN0IHVzYl9kZXZpY2UgKmRldiwKKwkJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsIGJvb2wgcmVzZXRfdG9nZ2xlcykKIHsKIAlzdHJ1Y3QgdXNiX2hvc3RfaW50ZXJmYWNlICphbHQgPSBpbnRmLT5jdXJfYWx0c2V0dGluZzsKIAlpbnQgaTsKIAogCWZvciAoaSA9IDA7IGkgPCBhbHQtPmRlc2MuYk51bUVuZHBvaW50czsgKytpKQotCQl1c2JfZW5hYmxlX2VuZHBvaW50KGRldiwgJmFsdC0+ZW5kcG9pbnRbaV0pOworCQl1c2JfZW5hYmxlX2VuZHBvaW50KGRldiwgJmFsdC0+ZW5kcG9pbnRbaV0sIHJlc2V0X3RvZ2dsZXMpOwogfQogCiAvKioKQEAgLTEyMzUsOCArMTI3MCwxMCBAQAogCSAqLwogCiAJLyogcHJldmVudCBzdWJtaXNzaW9ucyB1c2luZyBwcmV2aW91cyBlbmRwb2ludCBzZXR0aW5ncyAqLwotCWlmIChpZmFjZS0+Y3VyX2FsdHNldHRpbmcgIT0gYWx0KQorCWlmIChpZmFjZS0+Y3VyX2FsdHNldHRpbmcgIT0gYWx0KSB7CisJCXJlbW92ZV9pbnRmX2VwX2RldnMoaWZhY2UpOwogCQl1c2JfcmVtb3ZlX3N5c2ZzX2ludGZfZmlsZXMoaWZhY2UpOworCX0KIAl1c2JfZGlzYWJsZV9pbnRlcmZhY2UoZGV2LCBpZmFjZSk7CiAKIAlpZmFjZS0+Y3VyX2FsdHNldHRpbmcgPSBhbHQ7CkBAIC0xMjcxLDEwICsxMzA4LDExIEBACiAJICogZHVyaW5nIHRoZSBTRVRVUCBzdGFnZSAtIGhlbmNlIEVQMCB0b2dnbGVzIGFyZSAiZG9uJ3QgY2FyZSIgaGVyZS4KIAkgKiAoTGlrZXdpc2UsIEVQMCBuZXZlciAiaGFsdHMiIG9uIHdlbGwgZGVzaWduZWQgZGV2aWNlcy4pCiAJICovCi0JdXNiX2VuYWJsZV9pbnRlcmZhY2UoZGV2LCBpZmFjZSk7Ci0JaWYgKGRldmljZV9pc19yZWdpc3RlcmVkKCZpZmFjZS0+ZGV2KSkKKwl1c2JfZW5hYmxlX2ludGVyZmFjZShkZXYsIGlmYWNlLCB0cnVlKTsKKwlpZiAoZGV2aWNlX2lzX3JlZ2lzdGVyZWQoJmlmYWNlLT5kZXYpKSB7CiAJCXVzYl9jcmVhdGVfc3lzZnNfaW50Zl9maWxlcyhpZmFjZSk7Ci0KKwkJY3JlYXRlX2ludGZfZXBfZGV2cyhpZmFjZSk7CisJfQogCXJldHVybiAwOwogfQogRVhQT1JUX1NZTUJPTF9HUEwodXNiX3NldF9pbnRlcmZhY2UpOwpAQCAtMTMzNCw3ICsxMzcyLDYgQEAKIAkJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYgPSBjb25maWctPmludGVyZmFjZVtpXTsKIAkJc3RydWN0IHVzYl9ob3N0X2ludGVyZmFjZSAqYWx0OwogCi0JCXVzYl9yZW1vdmVfc3lzZnNfaW50Zl9maWxlcyhpbnRmKTsKIAkJYWx0ID0gdXNiX2FsdG51bV90b19hbHRzZXR0aW5nKGludGYsIDApOwogCiAJCS8qIE5vIGFsdHNldHRpbmcgMD8gIFdlJ2xsIGFzc3VtZSB0aGUgZmlyc3QgYWx0c2V0dGluZy4KQEAgLTEzNDUsMTAgKzEzODIsMTYgQEAKIAkJaWYgKCFhbHQpCiAJCQlhbHQgPSAmaW50Zi0+YWx0c2V0dGluZ1swXTsKIAorCQlpZiAoYWx0ICE9IGludGYtPmN1cl9hbHRzZXR0aW5nKSB7CisJCQlyZW1vdmVfaW50Zl9lcF9kZXZzKGludGYpOworCQkJdXNiX3JlbW92ZV9zeXNmc19pbnRmX2ZpbGVzKGludGYpOworCQl9CiAJCWludGYtPmN1cl9hbHRzZXR0aW5nID0gYWx0OwotCQl1c2JfZW5hYmxlX2ludGVyZmFjZShkZXYsIGludGYpOwotCQlpZiAoZGV2aWNlX2lzX3JlZ2lzdGVyZWQoJmludGYtPmRldikpCisJCXVzYl9lbmFibGVfaW50ZXJmYWNlKGRldiwgaW50ZiwgdHJ1ZSk7CisJCWlmIChkZXZpY2VfaXNfcmVnaXN0ZXJlZCgmaW50Zi0+ZGV2KSkgewogCQkJdXNiX2NyZWF0ZV9zeXNmc19pbnRmX2ZpbGVzKGludGYpOworCQkJY3JlYXRlX2ludGZfZXBfZGV2cyhpbnRmKTsKKwkJfQogCX0KIAlyZXR1cm4gMDsKIH0KQEAgLTE0NDEsNiArMTQ4NCw0NiBAQAogCXJldHVybiByZXR2YWw7CiB9CiAKKworLyoKKyAqIEludGVybmFsIGZ1bmN0aW9uIHRvIHF1ZXVlIGEgZGV2aWNlIHJlc2V0CisgKgorICogVGhpcyBpcyBpbml0aWFsaXplZCBpbnRvIHRoZSB3b3Jrc3RydWN0IGluICdzdHJ1Y3QKKyAqIHVzYl9kZXZpY2UtPnJlc2V0X3dzJyB0aGF0IGlzIGxhdW5jaGVkIGJ5CisgKiBtZXNzYWdlLmM6dXNiX3NldF9jb25maWd1cmF0aW9uKCkgd2hlbiBpbml0aWFsaXppbmcgZWFjaCAnc3RydWN0CisgKiB1c2JfaW50ZXJmYWNlJy4KKyAqCisgKiBJdCBpcyBzYWZlIHRvIGdldCB0aGUgVVNCIGRldmljZSB3aXRob3V0IHJlZmVyZW5jZSBjb3VudHMgYmVjYXVzZQorICogdGhlIGxpZmUgY3ljbGUgb2YgQGlmYWNlIGlzIGJvdW5kIHRvIHRoZSBsaWZlIGN5Y2xlIG9mIEB1ZGV2LiBUaGVuLAorICogdGhpcyBmdW5jdGlvbiB3aWxsIGJlIHJhbiBvbmx5IGlmIEBpZmFjZSBpcyBhbGl2ZSAoYW5kIGJlZm9yZQorICogZnJlZWluZyBpdCBhbnkgc2NoZWR1bGVkIGluc3RhbmNlcyBvZiBpdCB3aWxsIGhhdmUgYmVlbiBjYW5jZWxsZWQpLgorICoKKyAqIFdlIG5lZWQgdG8gc2V0IGEgZmxhZyAodXNiX2Rldi0+cmVzZXRfcnVubmluZykgYmVjYXVzZSB3aGVuIHdlIGNhbGwKKyAqIHRoZSByZXNldCwgdGhlIGludGVyZmFjZXMgbWlnaHQgYmUgdW5ib3VuZC4gVGhlIGN1cnJlbnQgaW50ZXJmYWNlCisgKiBjYW5ub3QgdHJ5IHRvIHJlbW92ZSB0aGUgcXVldWVkIHdvcmsgYXMgaXQgd291bGQgY2F1c2UgYSBkZWFkbG9jaworICogKHlvdSBjYW5ub3QgcmVtb3ZlIHlvdXIgd29yayBmcm9tIHdpdGhpbiB5b3VyIGV4ZWN1dGluZworICogd29ya3F1ZXVlKS4gVGhpcyBmbGFnIGxldHMgaXQga25vdywgc28gdGhhdAorICogdXNiX2NhbmNlbF9xdWV1ZWRfcmVzZXQoKSBkb2Vzbid0IHRyeSB0byBkbyBpdC4KKyAqCisgKiBTZWUgdXNiX3F1ZXVlX3Jlc2V0X2RldmljZSgpIGZvciBtb3JlIGRldGFpbHMKKyAqLwordm9pZCBfX3VzYl9xdWV1ZV9yZXNldF9kZXZpY2Uoc3RydWN0IHdvcmtfc3RydWN0ICp3cykKK3sKKwlpbnQgcmM7CisJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmlmYWNlID0KKwkJY29udGFpbmVyX29mKHdzLCBzdHJ1Y3QgdXNiX2ludGVyZmFjZSwgcmVzZXRfd3MpOworCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldihpZmFjZSk7CisKKwlyYyA9IHVzYl9sb2NrX2RldmljZV9mb3JfcmVzZXQodWRldiwgaWZhY2UpOworCWlmIChyYyA+PSAwKSB7CisJCWlmYWNlLT5yZXNldF9ydW5uaW5nID0gMTsKKwkJdXNiX3Jlc2V0X2RldmljZSh1ZGV2KTsKKwkJaWZhY2UtPnJlc2V0X3J1bm5pbmcgPSAwOworCQl1c2JfdW5sb2NrX2RldmljZSh1ZGV2KTsKKwl9Cit9CisKKwogLyoKICAqIHVzYl9zZXRfY29uZmlndXJhdGlvbiAtIE1ha2VzIGEgcGFydGljdWxhciBkZXZpY2Ugc2V0dGluZyBiZSBjdXJyZW50CiAgKiBAZGV2OiB0aGUgZGV2aWNlIHdob3NlIGNvbmZpZ3VyYXRpb24gaXMgYmVpbmcgdXBkYXRlZApAQCAtMTU2MCw2ICsxNjQzLDkgQEAKIAlpZiAoZGV2LT5zdGF0ZSAhPSBVU0JfU1RBVEVfQUREUkVTUykKIAkJdXNiX2Rpc2FibGVfZGV2aWNlKGRldiwgMSk7CS8qIFNraXAgZXAwICovCiAKKwkvKiBHZXQgcmlkIG9mIHBlbmRpbmcgYXN5bmMgU2V0LUNvbmZpZyByZXF1ZXN0cyBmb3IgdGhpcyBkZXZpY2UgKi8KKwljYW5jZWxfYXN5bmNfc2V0X2NvbmZpZyhkZXYpOworCiAJcmV0ID0gdXNiX2NvbnRyb2xfbXNnKGRldiwgdXNiX3NuZGN0cmxwaXBlKGRldiwgMCksCiAJCQkgICAgICBVU0JfUkVRX1NFVF9DT05GSUdVUkFUSU9OLCAwLCBjb25maWd1cmF0aW9uLCAwLAogCQkJICAgICAgTlVMTCwgMCwgVVNCX0NUUkxfU0VUX1RJTUVPVVQpOwpAQCAtMTYwNCwxMyArMTY5MCwxNCBAQAogCQkJYWx0ID0gJmludGYtPmFsdHNldHRpbmdbMF07CiAKIAkJaW50Zi0+Y3VyX2FsdHNldHRpbmcgPSBhbHQ7Ci0JCXVzYl9lbmFibGVfaW50ZXJmYWNlKGRldiwgaW50Zik7CisJCXVzYl9lbmFibGVfaW50ZXJmYWNlKGRldiwgaW50ZiwgdHJ1ZSk7CiAJCWludGYtPmRldi5wYXJlbnQgPSAmZGV2LT5kZXY7CiAJCWludGYtPmRldi5kcml2ZXIgPSBOVUxMOwogCQlpbnRmLT5kZXYuYnVzID0gJnVzYl9idXNfdHlwZTsKIAkJaW50Zi0+ZGV2LnR5cGUgPSAmdXNiX2lmX2RldmljZV90eXBlOwogCQlpbnRmLT5kZXYuZ3JvdXBzID0gdXNiX2ludGVyZmFjZV9ncm91cHM7CiAJCWludGYtPmRldi5kbWFfbWFzayA9IGRldi0+ZGV2LmRtYV9tYXNrOworCQlJTklUX1dPUksoJmludGYtPnJlc2V0X3dzLCBfX3VzYl9xdWV1ZV9yZXNldF9kZXZpY2UpOwogCQlkZXZpY2VfaW5pdGlhbGl6ZSgmaW50Zi0+ZGV2KTsKIAkJbWFya19xdWllc2NlZChpbnRmKTsKIAkJZGV2X3NldF9uYW1lKCZpbnRmLT5kZXYsICIlZC0lczolZC4lZCIsCkBAIC0xNjQxLDE3ICsxNzI4LDIxIEBACiAJCQkJZGV2X25hbWUoJmludGYtPmRldiksIHJldCk7CiAJCQljb250aW51ZTsKIAkJfQotCQl1c2JfY3JlYXRlX3N5c2ZzX2ludGZfZmlsZXMoaW50Zik7CisJCWNyZWF0ZV9pbnRmX2VwX2RldnMoaW50Zik7CiAJfQogCiAJdXNiX2F1dG9zdXNwZW5kX2RldmljZShkZXYpOwogCXJldHVybiAwOwogfQogCitzdGF0aWMgTElTVF9IRUFEKHNldF9jb25maWdfbGlzdCk7CitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHNldF9jb25maWdfbG9jayk7CisKIHN0cnVjdCBzZXRfY29uZmlnX3JlcXVlc3QgewogCXN0cnVjdCB1c2JfZGV2aWNlCSp1ZGV2OwogCWludAkJCWNvbmZpZzsKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3QJd29yazsKKwlzdHJ1Y3QgbGlzdF9oZWFkCW5vZGU7CiB9OwogCiAvKiBXb3JrZXIgcm91dGluZSBmb3IgdXNiX2RyaXZlcl9zZXRfY29uZmlndXJhdGlvbigpICovCkBAIC0xNjU5LDE0ICsxNzUwLDM1IEBACiB7CiAJc3RydWN0IHNldF9jb25maWdfcmVxdWVzdCAqcmVxID0KIAkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBzZXRfY29uZmlnX3JlcXVlc3QsIHdvcmspOworCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2ID0gcmVxLT51ZGV2OwogCi0JdXNiX2xvY2tfZGV2aWNlKHJlcS0+dWRldik7Ci0JdXNiX3NldF9jb25maWd1cmF0aW9uKHJlcS0+dWRldiwgcmVxLT5jb25maWcpOwotCXVzYl91bmxvY2tfZGV2aWNlKHJlcS0+dWRldik7Ci0JdXNiX3B1dF9kZXYocmVxLT51ZGV2KTsKKwl1c2JfbG9ja19kZXZpY2UodWRldik7CisJc3Bpbl9sb2NrKCZzZXRfY29uZmlnX2xvY2spOworCWxpc3RfZGVsKCZyZXEtPm5vZGUpOworCXNwaW5fdW5sb2NrKCZzZXRfY29uZmlnX2xvY2spOworCisJaWYgKHJlcS0+Y29uZmlnID49IC0xKQkJLyogSXMgcmVxIHN0aWxsIHZhbGlkPyAqLworCQl1c2Jfc2V0X2NvbmZpZ3VyYXRpb24odWRldiwgcmVxLT5jb25maWcpOworCXVzYl91bmxvY2tfZGV2aWNlKHVkZXYpOworCXVzYl9wdXRfZGV2KHVkZXYpOwogCWtmcmVlKHJlcSk7CiB9CiAKKy8qIENhbmNlbCBwZW5kaW5nIFNldC1Db25maWcgcmVxdWVzdHMgZm9yIGEgZGV2aWNlIHdob3NlIGNvbmZpZ3VyYXRpb24KKyAqIHdhcyBqdXN0IGNoYW5nZWQKKyAqLworc3RhdGljIHZvaWQgY2FuY2VsX2FzeW5jX3NldF9jb25maWcoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYpCit7CisJc3RydWN0IHNldF9jb25maWdfcmVxdWVzdCAqcmVxOworCisJc3Bpbl9sb2NrKCZzZXRfY29uZmlnX2xvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnkocmVxLCAmc2V0X2NvbmZpZ19saXN0LCBub2RlKSB7CisJCWlmIChyZXEtPnVkZXYgPT0gdWRldikKKwkJCXJlcS0+Y29uZmlnID0gLTk5OTsJLyogTWFyayBhcyBjYW5jZWxsZWQgKi8KKwl9CisJc3Bpbl91bmxvY2soJnNldF9jb25maWdfbG9jayk7Cit9CisKIC8qKgogICogdXNiX2RyaXZlcl9zZXRfY29uZmlndXJhdGlvbiAtIFByb3ZpZGUgYSB3YXkgZm9yIGRyaXZlcnMgdG8gY2hhbmdlIGRldmljZSBjb25maWd1cmF0aW9ucwogICogQHVkZXY6IHRoZSBkZXZpY2Ugd2hvc2UgY29uZmlndXJhdGlvbiBpcyBiZWluZyB1cGRhdGVkCkBAIC0xNjk4LDYgKzE4MTAsMTAgQEAKIAlyZXEtPmNvbmZpZyA9IGNvbmZpZzsKIAlJTklUX1dPUksoJnJlcS0+d29yaywgZHJpdmVyX3NldF9jb25maWdfd29yayk7CiAKKwlzcGluX2xvY2soJnNldF9jb25maWdfbG9jayk7CisJbGlzdF9hZGQoJnJlcS0+bm9kZSwgJnNldF9jb25maWdfbGlzdCk7CisJc3Bpbl91bmxvY2soJnNldF9jb25maWdfbG9jayk7CisKIAl1c2JfZ2V0X2Rldih1ZGV2KTsKIAlzY2hlZHVsZV93b3JrKCZyZXEtPndvcmspOwogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY29yZS9zeXNmcy5jIGIvZHJpdmVycy91c2IvY29yZS9zeXNmcy5jCmluZGV4IDRmYjY1ZmQuLjRjYzI0NTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NvcmUvc3lzZnMuYworKysgYi9kcml2ZXJzL3VzYi9jb3JlL3N5c2ZzLmMKQEAgLTM1OSwxOSArMzU5LDE5IEBACiAJCQlzdHJuY21wKGJ1Ziwgb25fc3RyaW5nLCBsZW4pID09IDApIHsKIAkJdWRldi0+YXV0b3N1c3BlbmRfZGlzYWJsZWQgPSAxOwogCQl1ZGV2LT5hdXRvcmVzdW1lX2Rpc2FibGVkID0gMDsKLQkJcmMgPSB1c2JfZXh0ZXJuYWxfcmVzdW1lX2RldmljZSh1ZGV2KTsKKwkJcmMgPSB1c2JfZXh0ZXJuYWxfcmVzdW1lX2RldmljZSh1ZGV2LCBQTVNHX1VTRVJfUkVTVU1FKTsKIAogCX0gZWxzZSBpZiAobGVuID09IHNpemVvZiBhdXRvX3N0cmluZyAtIDEgJiYKIAkJCXN0cm5jbXAoYnVmLCBhdXRvX3N0cmluZywgbGVuKSA9PSAwKSB7CiAJCXVkZXYtPmF1dG9zdXNwZW5kX2Rpc2FibGVkID0gMDsKIAkJdWRldi0+YXV0b3Jlc3VtZV9kaXNhYmxlZCA9IDA7Ci0JCXJjID0gdXNiX2V4dGVybmFsX3Jlc3VtZV9kZXZpY2UodWRldik7CisJCXJjID0gdXNiX2V4dGVybmFsX3Jlc3VtZV9kZXZpY2UodWRldiwgUE1TR19VU0VSX1JFU1VNRSk7CiAKIAl9IGVsc2UgaWYgKGxlbiA9PSBzaXplb2Ygc3VzcGVuZF9zdHJpbmcgLSAxICYmCiAJCQlzdHJuY21wKGJ1Ziwgc3VzcGVuZF9zdHJpbmcsIGxlbikgPT0gMCkgewogCQl1ZGV2LT5hdXRvc3VzcGVuZF9kaXNhYmxlZCA9IDA7CiAJCXVkZXYtPmF1dG9yZXN1bWVfZGlzYWJsZWQgPSAxOwotCQlyYyA9IHVzYl9leHRlcm5hbF9zdXNwZW5kX2RldmljZSh1ZGV2LCBQTVNHX1NVU1BFTkQpOworCQlyYyA9IHVzYl9leHRlcm5hbF9zdXNwZW5kX2RldmljZSh1ZGV2LCBQTVNHX1VTRVJfU1VTUEVORCk7CiAKIAl9IGVsc2UKIAkJcmMgPSAtRUlOVkFMOwpAQCAtNjI5LDkgKzYyOSw2IEBACiAJc3RydWN0IGRldmljZSAqZGV2ID0gJnVkZXYtPmRldjsKIAlpbnQgcmV0dmFsOwogCi0JLyogVW5mb3J1bmF0ZWx5IHRoZXNlIGF0dHJpYnV0ZXMgY2Fubm90IGJlIGNyZWF0ZWQgYmVmb3JlCi0JICogdGhlIHVldmVudCBpcyBicm9hZGNhc3QuCi0JICovCiAJcmV0dmFsID0gZGV2aWNlX2NyZWF0ZV9iaW5fZmlsZShkZXYsICZkZXZfYmluX2F0dHJfZGVzY3JpcHRvcnMpOwogCWlmIChyZXR2YWwpCiAJCWdvdG8gZXJyb3I7CkBAIC02NDMsMTEgKzY0MCw3IEBACiAJcmV0dmFsID0gYWRkX3Bvd2VyX2F0dHJpYnV0ZXMoZGV2KTsKIAlpZiAocmV0dmFsKQogCQlnb3RvIGVycm9yOwotCi0JcmV0dmFsID0gdXNiX2NyZWF0ZV9lcF9maWxlcyhkZXYsICZ1ZGV2LT5lcDAsIHVkZXYpOwotCWlmIChyZXR2YWwpCi0JCWdvdG8gZXJyb3I7Ci0JcmV0dXJuIDA7CisJcmV0dXJuIHJldHZhbDsKIGVycm9yOgogCXVzYl9yZW1vdmVfc3lzZnNfZGV2X2ZpbGVzKHVkZXYpOwogCXJldHVybiByZXR2YWw7CkBAIC02NTcsNyArNjUwLDYgQEAKIHsKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmdWRldi0+ZGV2OwogCi0JdXNiX3JlbW92ZV9lcF9maWxlcygmdWRldi0+ZXAwKTsKIAlyZW1vdmVfcG93ZXJfYXR0cmlidXRlcyhkZXYpOwogCXJlbW92ZV9wZXJzaXN0X2F0dHJpYnV0ZXMoZGV2KTsKIAlkZXZpY2VfcmVtb3ZlX2Jpbl9maWxlKGRldiwgJmRldl9iaW5fYXR0cl9kZXNjcmlwdG9ycyk7CkBAIC04MTIsMjggKzgwNCw2IEBACiAJTlVMTAogfTsKIAotc3RhdGljIGlubGluZSB2b2lkIHVzYl9jcmVhdGVfaW50Zl9lcF9maWxlcyhzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwKLQkJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYpCi17Ci0Jc3RydWN0IHVzYl9ob3N0X2ludGVyZmFjZSAqaWZhY2VfZGVzYzsKLQlpbnQgaTsKLQotCWlmYWNlX2Rlc2MgPSBpbnRmLT5jdXJfYWx0c2V0dGluZzsKLQlmb3IgKGkgPSAwOyBpIDwgaWZhY2VfZGVzYy0+ZGVzYy5iTnVtRW5kcG9pbnRzOyArK2kpCi0JCXVzYl9jcmVhdGVfZXBfZmlsZXMoJmludGYtPmRldiwgJmlmYWNlX2Rlc2MtPmVuZHBvaW50W2ldLAotCQkJCXVkZXYpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgdXNiX3JlbW92ZV9pbnRmX2VwX2ZpbGVzKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQotewotCXN0cnVjdCB1c2JfaG9zdF9pbnRlcmZhY2UgKmlmYWNlX2Rlc2M7Ci0JaW50IGk7Ci0KLQlpZmFjZV9kZXNjID0gaW50Zi0+Y3VyX2FsdHNldHRpbmc7Ci0JZm9yIChpID0gMDsgaSA8IGlmYWNlX2Rlc2MtPmRlc2MuYk51bUVuZHBvaW50czsgKytpKQotCQl1c2JfcmVtb3ZlX2VwX2ZpbGVzKCZpZmFjZV9kZXNjLT5lbmRwb2ludFtpXSk7Ci19Ci0KIGludCB1c2JfY3JlYXRlX3N5c2ZzX2ludGZfZmlsZXMoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCiB7CiAJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpOwpAQCAtODQzLDI2ICs4MTMsMTkgQEAKIAlpZiAoaW50Zi0+c3lzZnNfZmlsZXNfY3JlYXRlZCB8fCBpbnRmLT51bnJlZ2lzdGVyaW5nKQogCQlyZXR1cm4gMDsKIAotCS8qIFRoZSBpbnRlcmZhY2Ugc3RyaW5nIG1heSBiZSBwcmVzZW50IGluIHNvbWUgYWx0c2V0dGluZ3MKLQkgKiBhbmQgbWlzc2luZyBpbiBvdGhlcnMuICBIZW5jZSBpdHMgYXR0cmlidXRlIGNhbm5vdCBiZSBjcmVhdGVkCi0JICogYmVmb3JlIHRoZSB1ZXZlbnQgaXMgYnJvYWRjYXN0LgotCSAqLwogCWlmIChhbHQtPnN0cmluZyA9PSBOVUxMKQogCQlhbHQtPnN0cmluZyA9IHVzYl9jYWNoZV9zdHJpbmcodWRldiwgYWx0LT5kZXNjLmlJbnRlcmZhY2UpOwogCWlmIChhbHQtPnN0cmluZykKIAkJcmV0dmFsID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZpbnRmLT5kZXYsICZkZXZfYXR0cl9pbnRlcmZhY2UpOwotCXVzYl9jcmVhdGVfaW50Zl9lcF9maWxlcyhpbnRmLCB1ZGV2KTsKIAlpbnRmLT5zeXNmc19maWxlc19jcmVhdGVkID0gMTsKIAlyZXR1cm4gMDsKIH0KIAogdm9pZCB1c2JfcmVtb3ZlX3N5c2ZzX2ludGZfZmlsZXMoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCiB7Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gJmludGYtPmRldjsKLQogCWlmICghaW50Zi0+c3lzZnNfZmlsZXNfY3JlYXRlZCkKIAkJcmV0dXJuOwotCXVzYl9yZW1vdmVfaW50Zl9lcF9maWxlcyhpbnRmKTsKLQlkZXZpY2VfcmVtb3ZlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfaW50ZXJmYWNlKTsKKworCWRldmljZV9yZW1vdmVfZmlsZSgmaW50Zi0+ZGV2LCAmZGV2X2F0dHJfaW50ZXJmYWNlKTsKIAlpbnRmLT5zeXNmc19maWxlc19jcmVhdGVkID0gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NvcmUvdXJiLmMgYi9kcml2ZXJzL3VzYi9jb3JlL3VyYi5jCmluZGV4IDFmNjhhZjkuLjU4YmM1ZTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NvcmUvdXJiLmMKKysrIGIvZHJpdmVycy91c2IvY29yZS91cmIuYwpAQCAtMTAsNyArMTAsNiBAQAogCiAjZGVmaW5lIHRvX3VyYihkKSBjb250YWluZXJfb2YoZCwgc3RydWN0IHVyYiwga3JlZikKIAotc3RhdGljIERFRklORV9TUElOTE9DSyh1c2JfcmVqZWN0X2xvY2spOwogCiBzdGF0aWMgdm9pZCB1cmJfZGVzdHJveShzdHJ1Y3Qga3JlZiAqa3JlZikKIHsKQEAgLTEzMSw5ICsxMzAsNyBAQAogCXVyYi0+YW5jaG9yID0gYW5jaG9yOwogCiAJaWYgKHVubGlrZWx5KGFuY2hvci0+cG9pc29uZWQpKSB7Ci0JCXNwaW5fbG9jaygmdXNiX3JlamVjdF9sb2NrKTsKLQkJdXJiLT5yZWplY3QrKzsKLQkJc3Bpbl91bmxvY2soJnVzYl9yZWplY3RfbG9jayk7CisJCWF0b21pY19pbmMoJnVyYi0+cmVqZWN0KTsKIAl9CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhbmNob3ItPmxvY2ssIGZsYWdzKTsKQEAgLTU2NSwxNiArNTYyLDEyIEBACiAJbWlnaHRfc2xlZXAoKTsKIAlpZiAoISh1cmIgJiYgdXJiLT5kZXYgJiYgdXJiLT5lcCkpCiAJCXJldHVybjsKLQlzcGluX2xvY2tfaXJxKCZ1c2JfcmVqZWN0X2xvY2spOwotCSsrdXJiLT5yZWplY3Q7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZ1c2JfcmVqZWN0X2xvY2spOworCWF0b21pY19pbmMoJnVyYi0+cmVqZWN0KTsKIAogCXVzYl9oY2RfdW5saW5rX3VyYih1cmIsIC1FTk9FTlQpOwogCXdhaXRfZXZlbnQodXNiX2tpbGxfdXJiX3F1ZXVlLCBhdG9taWNfcmVhZCgmdXJiLT51c2VfY291bnQpID09IDApOwogCi0Jc3Bpbl9sb2NrX2lycSgmdXNiX3JlamVjdF9sb2NrKTsKLQktLXVyYi0+cmVqZWN0OwotCXNwaW5fdW5sb2NrX2lycSgmdXNiX3JlamVjdF9sb2NrKTsKKwlhdG9taWNfZGVjKCZ1cmItPnJlamVjdCk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTCh1c2Jfa2lsbF91cmIpOwogCkBAIC02MDYsOSArNTk5LDcgQEAKIAltaWdodF9zbGVlcCgpOwogCWlmICghKHVyYiAmJiB1cmItPmRldiAmJiB1cmItPmVwKSkKIAkJcmV0dXJuOwotCXNwaW5fbG9ja19pcnEoJnVzYl9yZWplY3RfbG9jayk7Ci0JKyt1cmItPnJlamVjdDsKLQlzcGluX3VubG9ja19pcnEoJnVzYl9yZWplY3RfbG9jayk7CisJYXRvbWljX2luYygmdXJiLT5yZWplY3QpOwogCiAJdXNiX2hjZF91bmxpbmtfdXJiKHVyYiwgLUVOT0VOVCk7CiAJd2FpdF9ldmVudCh1c2Jfa2lsbF91cmJfcXVldWUsIGF0b21pY19yZWFkKCZ1cmItPnVzZV9jb3VudCkgPT0gMCk7CkBAIC02MTcsMTQgKzYwOCwxMCBAQAogCiB2b2lkIHVzYl91bnBvaXNvbl91cmIoc3RydWN0IHVyYiAqdXJiKQogewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KIAlpZiAoIXVyYikKIAkJcmV0dXJuOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnVzYl9yZWplY3RfbG9jaywgZmxhZ3MpOwotCS0tdXJiLT5yZWplY3Q7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdXNiX3JlamVjdF9sb2NrLCBmbGFncyk7CisJYXRvbWljX2RlYygmdXJiLT5yZWplY3QpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwodXNiX3VucG9pc29uX3VyYik7CiAKQEAgLTY5Miw2ICs2NzksMjYgQEAKIEVYUE9SVF9TWU1CT0xfR1BMKHVzYl9wb2lzb25fYW5jaG9yZWRfdXJicyk7CiAKIC8qKgorICogdXNiX3VucG9pc29uX2FuY2hvcmVkX3VyYnMgLSBsZXQgYW4gYW5jaG9yIGJlIHVzZWQgc3VjY2Vzc2Z1bGx5IGFnYWluCisgKiBAYW5jaG9yOiBhbmNob3IgdGhlIHJlcXVlc3RzIGFyZSBib3VuZCB0bworICoKKyAqIFJldmVyc2VzIHRoZSBlZmZlY3Qgb2YgdXNiX3BvaXNvbl9hbmNob3JlZF91cmJzCisgKiB0aGUgYW5jaG9yIGNhbiBiZSB1c2VkIG5vcm1hbGx5IGFmdGVyIGl0IHJldHVybnMKKyAqLwordm9pZCB1c2JfdW5wb2lzb25fYW5jaG9yZWRfdXJicyhzdHJ1Y3QgdXNiX2FuY2hvciAqYW5jaG9yKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHVyYiAqbGF6YXJ1czsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZhbmNob3ItPmxvY2ssIGZsYWdzKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGxhemFydXMsICZhbmNob3ItPnVyYl9saXN0LCBhbmNob3JfbGlzdCkgeworCQl1c2JfdW5wb2lzb25fdXJiKGxhemFydXMpOworCX0KKwlhbmNob3ItPnBvaXNvbmVkID0gMDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhbmNob3ItPmxvY2ssIGZsYWdzKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHVzYl91bnBvaXNvbl9hbmNob3JlZF91cmJzKTsKKy8qKgogICogdXNiX3VubGlua19hbmNob3JlZF91cmJzIC0gYXN5bmNocm9ub3VzbHkgY2FuY2VsIHRyYW5zZmVyIHJlcXVlc3RzIGVuIG1hc3NlCiAgKiBAYW5jaG9yOiBhbmNob3IgdGhlIHJlcXVlc3RzIGFyZSBib3VuZCB0bwogICoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NvcmUvdXNiLmMgYi9kcml2ZXJzL3VzYi9jb3JlL3VzYi5jCmluZGV4IGJlMWZhMDcuLmRjZmMwNzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NvcmUvdXNiLmMKKysrIGIvZHJpdmVycy91c2IvY29yZS91c2IuYwpAQCAtMjUzLDcgKzI1Myw3IEBACiBzdGF0aWMgdm9pZCB1c2JfZGV2X2NvbXBsZXRlKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAkvKiBDdXJyZW50bHkgdXNlZCBvbmx5IGZvciByZWJpbmRpbmcgaW50ZXJmYWNlcyAqLwotCXVzYl9yZXN1bWUoZGV2KTsJLyogSW1wbGVtZW50IGV2ZW50dWFsbHk/ICovCisJdXNiX3Jlc3VtZShkZXYsIFBNU0dfUkVTVU1FKTsJLyogTWVzc2FnZSBldmVudCBpcyBtZWFuaW5nbGVzcyAqLwogfQogCiBzdGF0aWMgaW50IHVzYl9kZXZfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCkBAIC0yNjMsNyArMjYzLDcgQEAKIAogc3RhdGljIGludCB1c2JfZGV2X3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7Ci0JcmV0dXJuIHVzYl9yZXN1bWUoZGV2KTsKKwlyZXR1cm4gdXNiX3Jlc3VtZShkZXYsIFBNU0dfUkVTVU1FKTsKIH0KIAogc3RhdGljIGludCB1c2JfZGV2X2ZyZWV6ZShzdHJ1Y3QgZGV2aWNlICpkZXYpCkBAIC0yNzMsNyArMjczLDcgQEAKIAogc3RhdGljIGludCB1c2JfZGV2X3RoYXcoc3RydWN0IGRldmljZSAqZGV2KQogewotCXJldHVybiB1c2JfcmVzdW1lKGRldik7CisJcmV0dXJuIHVzYl9yZXN1bWUoZGV2LCBQTVNHX1RIQVcpOwogfQogCiBzdGF0aWMgaW50IHVzYl9kZXZfcG93ZXJvZmYoc3RydWN0IGRldmljZSAqZGV2KQpAQCAtMjgzLDEwICsyODMsMTAgQEAKIAogc3RhdGljIGludCB1c2JfZGV2X3Jlc3RvcmUoc3RydWN0IGRldmljZSAqZGV2KQogewotCXJldHVybiB1c2JfcmVzdW1lKGRldik7CisJcmV0dXJuIHVzYl9yZXN1bWUoZGV2LCBQTVNHX1JFU1RPUkUpOwogfQogCi1zdGF0aWMgc3RydWN0IHBtX29wcyB1c2JfZGV2aWNlX3BtX29wcyA9IHsKK3N0YXRpYyBzdHJ1Y3QgZGV2X3BtX29wcyB1c2JfZGV2aWNlX3BtX29wcyA9IHsKIAkucHJlcGFyZSA9CXVzYl9kZXZfcHJlcGFyZSwKIAkuY29tcGxldGUgPQl1c2JfZGV2X2NvbXBsZXRlLAogCS5zdXNwZW5kID0JdXNiX2Rldl9zdXNwZW5kLApAQCAtMzAxLDcgKzMwMSw3IEBACiAKICNkZWZpbmUga3N1c3BlbmRfdXNiX2luaXQoKQkwCiAjZGVmaW5lIGtzdXNwZW5kX3VzYl9jbGVhbnVwKCkJZG8ge30gd2hpbGUgKDApCi0jZGVmaW5lIHVzYl9kZXZpY2VfcG1fb3BzCSgqKHN0cnVjdCBwbV9vcHMgKikwKQorI2RlZmluZSB1c2JfZGV2aWNlX3BtX29wcwkoKihzdHJ1Y3QgZGV2X3BtX29wcyAqKTApCiAKICNlbmRpZgkvKiBDT05GSUdfUE0gKi8KIApAQCAtMzYyLDcgKzM2Miw3IEBACiAJZGV2LT5lcDAuZGVzYy5iTGVuZ3RoID0gVVNCX0RUX0VORFBPSU5UX1NJWkU7CiAJZGV2LT5lcDAuZGVzYy5iRGVzY3JpcHRvclR5cGUgPSBVU0JfRFRfRU5EUE9JTlQ7CiAJLyogZXAwIG1heHBhY2tldCBjb21lcyBsYXRlciwgZnJvbSBkZXZpY2UgZGVzY3JpcHRvciAqLwotCXVzYl9lbmFibGVfZW5kcG9pbnQoZGV2LCAmZGV2LT5lcDApOworCXVzYl9lbmFibGVfZW5kcG9pbnQoZGV2LCAmZGV2LT5lcDAsIHRydWUpOwogCWRldi0+Y2FuX3N1Ym1pdCA9IDE7CiAKIAkvKiBTYXZlIHJlYWRhYmxlIGFuZCBzdGFibGUgdG9wb2xvZ3kgaWQsIGRpc3Rpbmd1aXNoaW5nIGRldmljZXMKQEAgLTQwMiw2ICs0MDIsNyBAQAogI2lmZGVmCUNPTkZJR19QTQogCW11dGV4X2luaXQoJmRldi0+cG1fbXV0ZXgpOwogCUlOSVRfREVMQVlFRF9XT1JLKCZkZXYtPmF1dG9zdXNwZW5kLCB1c2JfYXV0b3N1c3BlbmRfd29yayk7CisJSU5JVF9XT1JLKCZkZXYtPmF1dG9yZXN1bWUsIHVzYl9hdXRvcmVzdW1lX3dvcmspOwogCWRldi0+YXV0b3N1c3BlbmRfZGVsYXkgPSB1c2JfYXV0b3N1c3BlbmRfZGVsYXkgKiBIWjsKIAlkZXYtPmNvbm5lY3RfdGltZSA9IGppZmZpZXM7CiAJZGV2LT5hY3RpdmVfZHVyYXRpb24gPSAtamlmZmllczsKQEAgLTUxMywxMCArNTE0LDcgQEAKICAqIGRpc2Nvbm5lY3Q7IGluIHNvbWUgZHJpdmVycyAoc3VjaCBhcyB1c2Itc3RvcmFnZSkgdGhlIGRpc2Nvbm5lY3QoKQogICogb3Igc3VzcGVuZCgpIG1ldGhvZCB3aWxsIGJsb2NrIHdhaXRpbmcgZm9yIGEgZGV2aWNlIHJlc2V0IHRvIGNvbXBsZXRlLgogICoKLSAqIFJldHVybnMgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIGZvciBmYWlsdXJlLCBvdGhlcndpc2UgMSBvciAwIHRvIGluZGljYXRlCi0gKiB0aGF0IHRoZSBkZXZpY2Ugd2lsbCBvciB3aWxsIG5vdCBoYXZlIHRvIGJlIHVubG9ja2VkLiAgKDAgY2FuIGJlCi0gKiByZXR1cm5lZCB3aGVuIGFuIGludGVyZmFjZSBpcyBnaXZlbiBhbmQgaXMgQklORElORywgYmVjYXVzZSBpbiB0aGF0Ci0gKiBjYXNlIHRoZSBkcml2ZXIgYWxyZWFkeSBvd25zIHRoZSBkZXZpY2UgbG9jay4pCisgKiBSZXR1cm5zIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBmb3IgZmFpbHVyZSwgb3RoZXJ3aXNlIDAuCiAgKi8KIGludCB1c2JfbG9ja19kZXZpY2VfZm9yX3Jlc2V0KHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2LAogCQkJICAgICAgY29uc3Qgc3RydWN0IHVzYl9pbnRlcmZhY2UgKmlmYWNlKQpAQCAtNTI3LDE2ICs1MjUsOSBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAlpZiAodWRldi0+c3RhdGUgPT0gVVNCX1NUQVRFX1NVU1BFTkRFRCkKIAkJcmV0dXJuIC1FSE9TVFVOUkVBQ0g7Ci0JaWYgKGlmYWNlKSB7Ci0JCXN3aXRjaCAoaWZhY2UtPmNvbmRpdGlvbikgewotCQljYXNlIFVTQl9JTlRFUkZBQ0VfQklORElORzoKLQkJCXJldHVybiAwOwotCQljYXNlIFVTQl9JTlRFUkZBQ0VfQk9VTkQ6Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXJldHVybiAtRUlOVFI7Ci0JCX0KLQl9CisJaWYgKGlmYWNlICYmIChpZmFjZS0+Y29uZGl0aW9uID09IFVTQl9JTlRFUkZBQ0VfVU5CSU5ESU5HIHx8CisJCQlpZmFjZS0+Y29uZGl0aW9uID09IFVTQl9JTlRFUkZBQ0VfVU5CT1VORCkpCisJCXJldHVybiAtRUlOVFI7CiAKIAl3aGlsZSAodXNiX3RyeWxvY2tfZGV2aWNlKHVkZXYpICE9IDApIHsKIApAQCAtNTUwLDEwICs1NDEsMTEgQEAKIAkJCXJldHVybiAtRU5PREVWOwogCQlpZiAodWRldi0+c3RhdGUgPT0gVVNCX1NUQVRFX1NVU1BFTkRFRCkKIAkJCXJldHVybiAtRUhPU1RVTlJFQUNIOwotCQlpZiAoaWZhY2UgJiYgaWZhY2UtPmNvbmRpdGlvbiAhPSBVU0JfSU5URVJGQUNFX0JPVU5EKQorCQlpZiAoaWZhY2UgJiYgKGlmYWNlLT5jb25kaXRpb24gPT0gVVNCX0lOVEVSRkFDRV9VTkJJTkRJTkcgfHwKKwkJCQlpZmFjZS0+Y29uZGl0aW9uID09IFVTQl9JTlRFUkZBQ0VfVU5CT1VORCkpCiAJCQlyZXR1cm4gLUVJTlRSOwogCX0KLQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHVzYl9sb2NrX2RldmljZV9mb3JfcmVzZXQpOwogCkBAIC05NjIsOCArOTU0LDEyIEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTCh1c2JfYnVmZmVyX3VubWFwX3NnKTsKIAotLyogZm9ybWF0IHRvIGRpc2FibGUgVVNCIG9uIGtlcm5lbCBjb21tYW5kIGxpbmUgaXM6IG5vdXNiICovCi1fX21vZHVsZV9wYXJhbV9jYWxsKCIiLCBub3VzYiwgcGFyYW1fc2V0X2Jvb2wsIHBhcmFtX2dldF9ib29sLCAmbm91c2IsIDA0NDQpOworLyogVG8gZGlzYWJsZSBVU0IsIGtlcm5lbCBjb21tYW5kIGxpbmUgaXMgJ25vdXNiJyBub3QgJ3VzYmNvcmUubm91c2InICovCisjaWZkZWYgTU9EVUxFCittb2R1bGVfcGFyYW0obm91c2IsIGJvb2wsIDA0NDQpOworI2Vsc2UKK2NvcmVfcGFyYW0obm91c2IsIG5vdXNiLCBib29sLCAwNDQ0KTsKKyNlbmRpZgogCiAvKgogICogZm9yIGV4dGVybmFsIHJlYWQgYWNjZXNzIHRvIDxub3VzYj4KQEAgLTk3NSw2ICs5NzEsMzcgQEAKIEVYUE9SVF9TWU1CT0xfR1BMKHVzYl9kaXNhYmxlZCk7CiAKIC8qCisgKiBOb3RpZmljYXRpb25zIG9mIGRldmljZSBhbmQgaW50ZXJmYWNlIHJlZ2lzdHJhdGlvbgorICovCitzdGF0aWMgaW50IHVzYl9idXNfbm90aWZ5KHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIsIHVuc2lnbmVkIGxvbmcgYWN0aW9uLAorCQl2b2lkICpkYXRhKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGRhdGE7CisKKwlzd2l0Y2ggKGFjdGlvbikgeworCWNhc2UgQlVTX05PVElGWV9BRERfREVWSUNFOgorCQlpZiAoZGV2LT50eXBlID09ICZ1c2JfZGV2aWNlX3R5cGUpCisJCQkodm9pZCkgdXNiX2NyZWF0ZV9zeXNmc19kZXZfZmlsZXModG9fdXNiX2RldmljZShkZXYpKTsKKwkJZWxzZSBpZiAoZGV2LT50eXBlID09ICZ1c2JfaWZfZGV2aWNlX3R5cGUpCisJCQkodm9pZCkgdXNiX2NyZWF0ZV9zeXNmc19pbnRmX2ZpbGVzKAorCQkJCQl0b191c2JfaW50ZXJmYWNlKGRldikpOworCQlicmVhazsKKworCWNhc2UgQlVTX05PVElGWV9ERUxfREVWSUNFOgorCQlpZiAoZGV2LT50eXBlID09ICZ1c2JfZGV2aWNlX3R5cGUpCisJCQl1c2JfcmVtb3ZlX3N5c2ZzX2Rldl9maWxlcyh0b191c2JfZGV2aWNlKGRldikpOworCQllbHNlIGlmIChkZXYtPnR5cGUgPT0gJnVzYl9pZl9kZXZpY2VfdHlwZSkKKwkJCXVzYl9yZW1vdmVfc3lzZnNfaW50Zl9maWxlcyh0b191c2JfaW50ZXJmYWNlKGRldikpOworCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgdXNiX2J1c19uYiA9IHsKKwkubm90aWZpZXJfY2FsbCA9IHVzYl9idXNfbm90aWZ5LAorfTsKKworLyoKICAqIEluaXQKICAqLwogc3RhdGljIGludCBfX2luaXQgdXNiX2luaXQodm9pZCkKQEAgLTk5MSw2ICsxMDE4LDkgQEAKIAlyZXR2YWwgPSBidXNfcmVnaXN0ZXIoJnVzYl9idXNfdHlwZSk7CiAJaWYgKHJldHZhbCkKIAkJZ290byBidXNfcmVnaXN0ZXJfZmFpbGVkOworCXJldHZhbCA9IGJ1c19yZWdpc3Rlcl9ub3RpZmllcigmdXNiX2J1c190eXBlLCAmdXNiX2J1c19uYik7CisJaWYgKHJldHZhbCkKKwkJZ290byBidXNfbm90aWZpZXJfZmFpbGVkOwogCXJldHZhbCA9IHVzYl9ob3N0X2luaXQoKTsKIAlpZiAocmV0dmFsKQogCQlnb3RvIGhvc3RfaW5pdF9mYWlsZWQ7CkBAIC0xMDI1LDYgKzEwNTUsOCBAQAogbWFqb3JfaW5pdF9mYWlsZWQ6CiAJdXNiX2hvc3RfY2xlYW51cCgpOwogaG9zdF9pbml0X2ZhaWxlZDoKKwlidXNfdW5yZWdpc3Rlcl9ub3RpZmllcigmdXNiX2J1c190eXBlLCAmdXNiX2J1c19uYik7CitidXNfbm90aWZpZXJfZmFpbGVkOgogCWJ1c191bnJlZ2lzdGVyKCZ1c2JfYnVzX3R5cGUpOwogYnVzX3JlZ2lzdGVyX2ZhaWxlZDoKIAlrc3VzcGVuZF91c2JfY2xlYW51cCgpOwpAQCAtMTA0OCw2ICsxMDgwLDcgQEAKIAl1c2JfZGV2aW9fY2xlYW51cCgpOwogCXVzYl9odWJfY2xlYW51cCgpOwogCXVzYl9ob3N0X2NsZWFudXAoKTsKKwlidXNfdW5yZWdpc3Rlcl9ub3RpZmllcigmdXNiX2J1c190eXBlLCAmdXNiX2J1c19uYik7CiAJYnVzX3VucmVnaXN0ZXIoJnVzYl9idXNfdHlwZSk7CiAJa3N1c3BlbmRfdXNiX2NsZWFudXAoKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NvcmUvdXNiLmggYi9kcml2ZXJzL3VzYi9jb3JlL3VzYi5oCmluZGV4IDlhMWE0NWEuLjM4NjE3NzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NvcmUvdXNiLmgKKysrIGIvZHJpdmVycy91c2IvY29yZS91c2IuaApAQCAtMSwxNiArMSwyMCBAQAorI2luY2x1ZGUgPGxpbnV4L3BtLmg+CisKIC8qIEZ1bmN0aW9ucyBsb2NhbCB0byBkcml2ZXJzL3VzYi9jb3JlLyAqLwogCiBleHRlcm4gaW50IHVzYl9jcmVhdGVfc3lzZnNfZGV2X2ZpbGVzKHN0cnVjdCB1c2JfZGV2aWNlICpkZXYpOwogZXh0ZXJuIHZvaWQgdXNiX3JlbW92ZV9zeXNmc19kZXZfZmlsZXMoc3RydWN0IHVzYl9kZXZpY2UgKmRldik7CiBleHRlcm4gaW50IHVzYl9jcmVhdGVfc3lzZnNfaW50Zl9maWxlcyhzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50Zik7CiBleHRlcm4gdm9pZCB1c2JfcmVtb3ZlX3N5c2ZzX2ludGZfZmlsZXMoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpOwotZXh0ZXJuIGludCB1c2JfY3JlYXRlX2VwX2ZpbGVzKHN0cnVjdCBkZXZpY2UgKnBhcmVudCwKK2V4dGVybiBpbnQgdXNiX2NyZWF0ZV9lcF9kZXZzKHN0cnVjdCBkZXZpY2UgKnBhcmVudCwKIAkJCQlzdHJ1Y3QgdXNiX2hvc3RfZW5kcG9pbnQgKmVuZHBvaW50LAogCQkJCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2KTsKLWV4dGVybiB2b2lkIHVzYl9yZW1vdmVfZXBfZmlsZXMoc3RydWN0IHVzYl9ob3N0X2VuZHBvaW50ICplbmRwb2ludCk7CitleHRlcm4gdm9pZCB1c2JfcmVtb3ZlX2VwX2RldnMoc3RydWN0IHVzYl9ob3N0X2VuZHBvaW50ICplbmRwb2ludCk7CiAKIGV4dGVybiB2b2lkIHVzYl9lbmFibGVfZW5kcG9pbnQoc3RydWN0IHVzYl9kZXZpY2UgKmRldiwKLQkJc3RydWN0IHVzYl9ob3N0X2VuZHBvaW50ICplcCk7CisJCXN0cnVjdCB1c2JfaG9zdF9lbmRwb2ludCAqZXAsIGJvb2wgcmVzZXRfdG9nZ2xlKTsKK2V4dGVybiB2b2lkIHVzYl9lbmFibGVfaW50ZXJmYWNlKHN0cnVjdCB1c2JfZGV2aWNlICpkZXYsCisJCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLCBib29sIHJlc2V0X3RvZ2dsZXMpOwogZXh0ZXJuIHZvaWQgdXNiX2Rpc2FibGVfZW5kcG9pbnQoc3RydWN0IHVzYl9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IGVwYWRkcik7CiBleHRlcm4gdm9pZCB1c2JfZGlzYWJsZV9pbnRlcmZhY2Uoc3RydWN0IHVzYl9kZXZpY2UgKmRldiwKIAkJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpOwpAQCAtNDIsMTQgKzQ2LDE2IEBACiAjaWZkZWYJQ09ORklHX1BNCiAKIGV4dGVybiBpbnQgdXNiX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2LCBwbV9tZXNzYWdlX3QgbXNnKTsKLWV4dGVybiBpbnQgdXNiX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpOworZXh0ZXJuIGludCB1c2JfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IG1zZyk7CiAKIGV4dGVybiB2b2lkIHVzYl9hdXRvc3VzcGVuZF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7Ci1leHRlcm4gaW50IHVzYl9wb3J0X3N1c3BlbmQoc3RydWN0IHVzYl9kZXZpY2UgKmRldik7Ci1leHRlcm4gaW50IHVzYl9wb3J0X3Jlc3VtZShzdHJ1Y3QgdXNiX2RldmljZSAqZGV2KTsKK2V4dGVybiB2b2lkIHVzYl9hdXRvcmVzdW1lX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKK2V4dGVybiBpbnQgdXNiX3BvcnRfc3VzcGVuZChzdHJ1Y3QgdXNiX2RldmljZSAqZGV2LCBwbV9tZXNzYWdlX3QgbXNnKTsKK2V4dGVybiBpbnQgdXNiX3BvcnRfcmVzdW1lKHN0cnVjdCB1c2JfZGV2aWNlICpkZXYsIHBtX21lc3NhZ2VfdCBtc2cpOwogZXh0ZXJuIGludCB1c2JfZXh0ZXJuYWxfc3VzcGVuZF9kZXZpY2Uoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYsCiAJCXBtX21lc3NhZ2VfdCBtc2cpOwotZXh0ZXJuIGludCB1c2JfZXh0ZXJuYWxfcmVzdW1lX2RldmljZShzdHJ1Y3QgdXNiX2RldmljZSAqdWRldik7CitleHRlcm4gaW50IHVzYl9leHRlcm5hbF9yZXN1bWVfZGV2aWNlKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2LAorCQlwbV9tZXNzYWdlX3QgbXNnKTsKIAogc3RhdGljIGlubGluZSB2b2lkIHVzYl9wbV9sb2NrKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2KQogewpAQCAtNjMsMTIgKzY5LDEyIEBACiAKICNlbHNlCiAKLXN0YXRpYyBpbmxpbmUgaW50IHVzYl9wb3J0X3N1c3BlbmQoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYpCitzdGF0aWMgaW5saW5lIGludCB1c2JfcG9ydF9zdXNwZW5kKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2LCBwbV9tZXNzYWdlX3QgbXNnKQogewogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW5saW5lIGludCB1c2JfcG9ydF9yZXN1bWUoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYpCitzdGF0aWMgaW5saW5lIGludCB1c2JfcG9ydF9yZXN1bWUoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYsIHBtX21lc3NhZ2VfdCBtc2cpCiB7CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvS2NvbmZpZyBiL2RyaXZlcnMvdXNiL2dhZGdldC9LY29uZmlnCmluZGV4IGRkNGNkNWEuLjMyMTlkMTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9LY29uZmlnCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9LY29uZmlnCkBAIC0yOTcsMTMgKzI5NywzNCBAQAogCiAjIG11c2IgYnVpbGRzIGluIC4uL211c2IgYWxvbmcgd2l0aCBob3N0IHN1cHBvcnQKIGNvbmZpZyBVU0JfR0FER0VUX01VU0JfSERSQwotCWJvb2xlYW4gIkludmVudHJhIEhEUkMgVVNCIFBlcmlwaGVyYWwgKFRJLCAuLi4pIgorCWJvb2xlYW4gIkludmVudHJhIEhEUkMgVVNCIFBlcmlwaGVyYWwgKFRJLCBBREksIC4uLikiCiAJZGVwZW5kcyBvbiBVU0JfTVVTQl9IRFJDICYmIChVU0JfTVVTQl9QRVJJUEhFUkFMIHx8IFVTQl9NVVNCX09URykKIAlzZWxlY3QgVVNCX0dBREdFVF9EVUFMU1BFRUQKIAlzZWxlY3QgVVNCX0dBREdFVF9TRUxFQ1RFRAogCWhlbHAKIAkgIFRoaXMgT1RHLWNhcGFibGUgc2lsaWNvbiBJUCBpcyB1c2VkIGluIGR1YWwgZGVzaWducyBpbmNsdWRpbmcKLQkgIHRoZSBUSSBEYVZpbmNpLCBPTUFQIDI0M3gsIE9NQVAgMzQzeCwgYW5kIFRVU0IgNjAxMC4KKwkgIHRoZSBUSSBEYVZpbmNpLCBPTUFQIDI0M3gsIE9NQVAgMzQzeCwgVFVTQiA2MDEwLCBhbmQgQURJIEJsYWNrZmluCisKK2NvbmZpZyBVU0JfR0FER0VUX0lNWAorCWJvb2xlYW4gIkZyZWVzY2FsZSBJTVggVVNCIFBlcmlwaGVyYWwgQ29udHJvbGxlciIKKwlkZXBlbmRzIG9uIEFSQ0hfTVgxCisJaGVscAorCSAgIEZyZWVzY2FsZSdzIElNWCBzZXJpZXMgaW5jbHVkZSBhbiBpbnRlZ3JhdGVkIGZ1bGwgc3BlZWQKKwkgICBVU0IgMS4xIGRldmljZSBjb250cm9sbGVyLiAgVGhlIGNvbnRyb2xsZXIgaW4gdGhlIElNWCBzZXJpZXMKKwkgICBpcyByZWdpc3Rlci1jb21wYXRpYmxlLgorCisJICAgSXQgaGFzIFNpeCBmaXhlZC1mdW5jdGlvbiBlbmRwb2ludHMsIGFzIHdlbGwgYXMgZW5kcG9pbnQKKwkgICB6ZXJvIChmb3IgY29udHJvbCB0cmFuc2ZlcnMpLgorCisJICAgU2F5ICJ5IiB0byBsaW5rIHRoZSBkcml2ZXIgc3RhdGljYWxseSwgb3IgIm0iIHRvIGJ1aWxkIGEKKwkgICBkeW5hbWljYWxseSBsaW5rZWQgbW9kdWxlIGNhbGxlZCAiaW14X3VkYyIgYW5kIGZvcmNlIGFsbAorCSAgIGdhZGdldCBkcml2ZXJzIHRvIGFsc28gYmUgZHluYW1pY2FsbHkgbGlua2VkLgorCitjb25maWcgVVNCX0lNWAorCXRyaXN0YXRlCisJZGVwZW5kcyBvbiBVU0JfR0FER0VUX0lNWAorCWRlZmF1bHQgVVNCX0dBREdFVAorCXNlbGVjdCBVU0JfR0FER0VUX1NFTEVDVEVECiAKIGNvbmZpZyBVU0JfR0FER0VUX002NjU5MgogCWJvb2xlYW4gIlJlbmVzYXMgTTY2NTkyIFVTQiBQZXJpcGhlcmFsIENvbnRyb2xsZXIiCkBAIC0zNzcsNiArMzk4LDI0IEBACiAJZGVmYXVsdCBVU0JfR0FER0VUCiAJc2VsZWN0IFVTQl9HQURHRVRfU0VMRUNURUQKIAorY29uZmlnIFVTQl9HQURHRVRfQ0kxM1hYWAorCWJvb2xlYW4gIk1JUFMgVVNCIENJMTN4eHgiCisJZGVwZW5kcyBvbiBQQ0kKKwlzZWxlY3QgVVNCX0dBREdFVF9EVUFMU1BFRUQKKwloZWxwCisJICBNSVBTIFVTQiBJUCBjb3JlIGZhbWlseSBkZXZpY2UgY29udHJvbGxlcgorCSAgQ3VycmVudGx5IGl0IG9ubHkgc3VwcG9ydHMgSVAgcGFydCBudW1iZXIgQ0kxMzQxMgorCisJICBTYXkgInkiIHRvIGxpbmsgdGhlIGRyaXZlciBzdGF0aWNhbGx5LCBvciAibSIgdG8gYnVpbGQgYQorCSAgZHluYW1pY2FsbHkgbGlua2VkIG1vZHVsZSBjYWxsZWQgImNpMTN4eHhfdWRjIiBhbmQgZm9yY2UgYWxsCisJICBnYWRnZXQgZHJpdmVycyB0byBhbHNvIGJlIGR5bmFtaWNhbGx5IGxpbmtlZC4KKworY29uZmlnIFVTQl9DSTEzWFhYCisJdHJpc3RhdGUKKwlkZXBlbmRzIG9uIFVTQl9HQURHRVRfQ0kxM1hYWAorCWRlZmF1bHQgVVNCX0dBREdFVAorCXNlbGVjdCBVU0JfR0FER0VUX1NFTEVDVEVECisKIGNvbmZpZyBVU0JfR0FER0VUX05FVDIyODAKIAlib29sZWFuICJOZXRDaGlwIDIyOHgiCiAJZGVwZW5kcyBvbiBQQ0kKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9NYWtlZmlsZSBiL2RyaXZlcnMvdXNiL2dhZGdldC9NYWtlZmlsZQppbmRleCBiZDQwNDFiLi4zOWE1MWQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvTWFrZWZpbGUKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L01ha2VmaWxlCkBAIC0xMCw2ICsxMCw3IEBACiBvYmotJChDT05GSUdfVVNCX0FNRDU1MzZVREMpCSs9IGFtZDU1MzZ1ZGMubwogb2JqLSQoQ09ORklHX1VTQl9QWEEyNVgpCSs9IHB4YTI1eF91ZGMubwogb2JqLSQoQ09ORklHX1VTQl9QWEEyN1gpCSs9IHB4YTI3eF91ZGMubworb2JqLSQoQ09ORklHX1VTQl9JTVgpCQkrPSBpbXhfdWRjLm8KIG9iai0kKENPTkZJR19VU0JfR09LVSkJCSs9IGdva3VfdWRjLm8KIG9iai0kKENPTkZJR19VU0JfT01BUCkJCSs9IG9tYXBfdWRjLm8KIG9iai0kKENPTkZJR19VU0JfTEg3QTQwWCkJKz0gbGg3YTQweF91ZGMubwpAQCAtMTksNiArMjAsNyBAQAogb2JqLSQoQ09ORklHX1VTQl9GU0xfVVNCMikJKz0gZnNsX3VzYjJfdWRjLm8KIG9iai0kKENPTkZJR19VU0JfTTY2NTkyKQkrPSBtNjY1OTItdWRjLm8KIG9iai0kKENPTkZJR19VU0JfRlNMX1FFKQkrPSBmc2xfcWVfdWRjLm8KK29iai0kKENPTkZJR19VU0JfQ0kxM1hYWCkJKz0gY2kxM3h4eF91ZGMubwogCiAjCiAjIFVTQiBnYWRnZXQgZHJpdmVycwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L2F0OTFfdWRjLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvYXQ5MV91ZGMuYwppbmRleCBhOGExZGU0Li4wYjJiYjhmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvYXQ5MV91ZGMuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvYXQ5MV91ZGMuYwpAQCAtMTQ3NCw3ICsxNDc0LDcgQEAKIAkJLmVwMAk9ICZjb250cm9sbGVyLmVwWzBdLmVwLAogCQkubmFtZQk9IGRyaXZlcl9uYW1lLAogCQkuZGV2CT0gewotCQkJLmJ1c19pZCA9ICJnYWRnZXQiLAorCQkJLmluaXRfbmFtZSA9ICJnYWRnZXQiLAogCQkJLnJlbGVhc2UgPSBub3BfcmVsZWFzZSwKIAkJfQogCX0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvYXRtZWxfdXNiYV91ZGMuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9hdG1lbF91c2JhX3VkYy5jCmluZGV4IGFlMzBhYjEuLjY1YjAzZTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9hdG1lbF91c2JhX3VkYy5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9hdG1lbF91c2JhX3VkYy5jCkBAIC0xMDM0LDcgKzEwMzQsNyBAQAogCQkuaXNfZHVhbHNwZWVkCT0gMSwKIAkJLm5hbWUJCT0gImF0bWVsX3VzYmFfdWRjIiwKIAkJLmRldgk9IHsKLQkJCS5idXNfaWQJCT0gImdhZGdldCIsCisJCQkuaW5pdF9uYW1lCT0gImdhZGdldCIsCiAJCQkucmVsZWFzZQk9IG5vcF9yZWxlYXNlLAogCQl9LAogCX0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvY2kxM3h4eF91ZGMuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9jaTEzeHh4X3VkYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlYmY5MTEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvY2kxM3h4eF91ZGMuYwpAQCAtMCwwICsxLDI4MzAgQEAKKy8qCisgKiBjaTEzeHh4X3VkYy5jIC0gTUlQUyBVU0IgSVAgY29yZSBmYW1pbHkgZGV2aWNlIGNvbnRyb2xsZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggQ2hpcGlkZWEgLSBNSVBTIFRlY2hub2xvZ2llcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIEF1dGhvcjogRGF2aWQgTG9wbworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworLyoKKyAqIERlc2NyaXB0aW9uOiBNSVBTIFVTQiBJUCBjb3JlIGZhbWlseSBkZXZpY2UgY29udHJvbGxlcgorICogICAgICAgICAgICAgIEN1cnJlbnRseSBpdCBvbmx5IHN1cHBvcnRzIElQIHBhcnQgbnVtYmVyIENJMTM0MTIKKyAqCisgKiBUaGlzIGRyaXZlciBpcyBjb21wb3NlZCBvZiBzZXZlcmFsIGJsb2NrczoKKyAqIC0gSFc6ICAgICBoYXJkd2FyZSBpbnRlcmZhY2UKKyAqIC0gREJHOiAgICBkZWJ1ZyBmYWNpbGl0aWVzIChvcHRpb25hbCkKKyAqIC0gVVRJTDogICB1dGlsaXRpZXMKKyAqIC0gSVNSOiAgICBpbnRlcnJ1cHRzIGhhbmRsaW5nCisgKiAtIEVORFBUOiAgZW5kcG9pbnQgb3BlcmF0aW9ucyAoR2FkZ2V0IEFQSSkKKyAqIC0gR0FER0VUOiBnYWRnZXQgb3BlcmF0aW9ucyAoR2FkZ2V0IEFQSSkKKyAqIC0gQlVTOiAgICBidXMgZ2x1ZSBjb2RlLCBidXMgYWJzdHJhY3Rpb24gbGF5ZXIKKyAqIC0gUENJOiAgICBQQ0kgY29yZSBpbnRlcmZhY2UgYW5kIFBDSSByZXNvdXJjZXMgKGludGVycnVwdHMsIG1lbW9yeS4uLikKKyAqCisgKiBDb21waWxlIE9wdGlvbnMKKyAqIC0gQ09ORklHX1VTQl9HQURHRVRfREVCVUdfRklMRVM6IGVuYWJsZSBkZWJ1ZyBmYWNpbGl0aWVzCisgKiAtIFNUQUxMX0lOOiAgbm9uLWVtcHR5IGJ1bGstaW4gcGlwZXMgY2Fubm90IGJlIGhhbHRlZAorICogICAgICAgICAgICAgIGlmIGRlZmluZWQgbWFzcyBzdG9yYWdlIGNvbXBsaWFuY2Ugc3VjY2VlZHMgYnV0IHdpdGggd2FybmluZ3MKKyAqICAgICAgICAgICAgICA9PiBjYXNlIDQ6IEhpID4gIERuCisgKiAgICAgICAgICAgICAgPT4gY2FzZSA1OiBIaSA+ICBEaQorICogICAgICAgICAgICAgID0+IGNhc2UgODogSGkgPD4gRG8KKyAqICAgICAgICAgICAgICBpZiB1bmRlZmluZWQgdXNidGVzdCAxMyBmYWlscworICogLSBUUkFDRTogICAgIGVuYWJsZSBmdW5jdGlvbiB0cmFjaW5nIChkZXBlbmRzIG9uIERFQlVHKQorICoKKyAqIE1haW4gRmVhdHVyZXMKKyAqIC0gQ2hhcHRlciA5ICYgTWFzcyBTdG9yYWdlIENvbXBsaWFuY2Ugd2l0aCBHYWRnZXQgRmlsZSBTdG9yYWdlCisgKiAtIENoYXB0ZXIgOSBDb21wbGlhbmNlIHdpdGggR2FkZ2V0IFplcm8gKFNUQUxMX0lOIHVuZGVmaW5lZCkKKyAqIC0gTm9ybWFsICYgTFBNIHN1cHBvcnQKKyAqCisgKiBVU0JURVNUIFJlcG9ydAorICogLSBPSzogMC0xMiwgMTMgKFNUQUxMX0lOIGRlZmluZWQpICYgMTQKKyAqIC0gTm90IFN1cHBvcnRlZDogMTUgJiAxNiAoSVNPKQorICoKKyAqIFRPRE8gTGlzdAorICogLSBPVEcKKyAqIC0gSXNvY2hyb25vdXMgJiBJbnRlcnJ1cHQgVHJhZmZpYworICogLSBIYW5kbGUgcmVxdWVzdHMgd2hpY2ggc3Bhd25zIGludG8gc2V2ZXJhbCBURHMKKyAqIC0gR0VUX1NUQVRVUyhkZXZpY2UpIC0gYWx3YXlzIHJlcG9ydHMgMAorICogLSBHYWRnZXQgQVBJIChtYWpvcml0eSBvZiBvcHRpb25hbCBmZWF0dXJlcykKKyAqIC0gU3VzcGVuZCAmIFJlbW90ZSBXYWtldXAKKyAqLworI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYXBvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi9jaDkuaD4KKyNpbmNsdWRlIDxsaW51eC91c2IvZ2FkZ2V0Lmg+CisKKyNpbmNsdWRlICJjaTEzeHh4X3VkYy5oIgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIERFRklORQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogY3RybCByZWdpc3RlciBiYW5rIGFjY2VzcyAqLworc3RhdGljIERFRklORV9TUElOTE9DSyh1ZGNfbG9jayk7CisKKy8qIGRyaXZlciBuYW1lICovCisjZGVmaW5lIFVEQ19EUklWRVJfTkFNRSAgICJjaTEzeHh4X3VkYyIKKworLyogY29udHJvbCBlbmRwb2ludCBkZXNjcmlwdGlvbiAqLworc3RhdGljIGNvbnN0IHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvcgorY3RybF9lbmRwdF9kZXNjID0geworCS5iTGVuZ3RoICAgICAgICAgPSBVU0JfRFRfRU5EUE9JTlRfU0laRSwKKwkuYkRlc2NyaXB0b3JUeXBlID0gVVNCX0RUX0VORFBPSU5ULAorCisJLmJtQXR0cmlidXRlcyAgICA9IFVTQl9FTkRQT0lOVF9YRkVSX0NPTlRST0wsCisJLndNYXhQYWNrZXRTaXplICA9IGNwdV90b19sZTE2KENUUkxfUEFZTE9BRF9NQVgpLAorfTsKKworLyogVURDIGRlc2NyaXB0b3IgKi8KK3N0YXRpYyBzdHJ1Y3QgY2kxM3h4eCAqX3VkYzsKKworLyogSW50ZXJydXB0IHN0YXRpc3RpY3MgKi8KKyNkZWZpbmUgSVNSX01BU0sgICAweDFGCitzdGF0aWMgc3RydWN0IHsKKwl1MzIgdGVzdDsKKwl1MzIgdWk7CisJdTMyIHVlaTsKKwl1MzIgcGNpOworCXUzMiB1cmk7CisJdTMyIHNsaTsKKwl1MzIgbm9uZTsKKwlzdHJ1Y3QgeworCQl1MzIgY250OworCQl1MzIgYnVmW0lTUl9NQVNLKzFdOworCQl1MzIgaWR4OworCX0gaG5kbDsKK30gaXNyX3N0YXRpc3RpY3M7CisKKy8qKgorICogZmZzX25yOiBmaW5kIGZpcnN0IChsZWFzdCBzaWduaWZpY2FudCkgYml0IHNldAorICogQHg6IHRoZSB3b3JkIHRvIHNlYXJjaAorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBiaXQgbnVtYmVyIChpbnN0ZWFkIG9mIHBvc2l0aW9uKQorICovCitzdGF0aWMgaW50IGZmc19ucih1MzIgeCkKK3sKKwlpbnQgbiA9IGZmcyh4KTsKKworCXJldHVybiBuID8gbi0xIDogMzI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEhXIGJsb2NrCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiByZWdpc3RlciBiYW5rIGRlc2NyaXB0b3IgKi8KK3N0YXRpYyBzdHJ1Y3QgeworCXVuc2lnbmVkICAgICAgbHBtOyAgICAvKiBpcyBMUE0/ICovCisJdm9pZCBfX2lvbWVtICphYnM7ICAgIC8qIGJ1cyBtYXAgb2Zmc2V0ICovCisJdm9pZCBfX2lvbWVtICpjYXA7ICAgIC8qIGJ1cyBtYXAgb2Zmc2V0ICsgQ0FQIG9mZnNldCArIENBUCBkYXRhICovCisJc2l6ZV90ICAgICAgICBzaXplOyAgIC8qIGJhbmsgc2l6ZSAqLworfSBod19iYW5rOworCisvKiBVREMgcmVnaXN0ZXIgbWFwICovCisjZGVmaW5lIEFCU19DQVBMRU5HVEggICAgICAgKDB4MTAwVUwpCisjZGVmaW5lIEFCU19IQ0NQQVJBTVMgICAgICAgKDB4MTA4VUwpCisjZGVmaW5lIEFCU19EQ0NQQVJBTVMgICAgICAgKDB4MTI0VUwpCisjZGVmaW5lIEFCU19URVNUTU9ERSAgICAgICAgKGh3X2JhbmsubHBtID8gMHgwRkNVTCA6IDB4MTM4VUwpCisvKiBvZmZzZXQgdG8gQ0FQTEVOVEdIIChhZGRyICsgZGF0YSkgKi8KKyNkZWZpbmUgQ0FQX1VTQkNNRCAgICAgICAgICAoMHgwMDBVTCkKKyNkZWZpbmUgQ0FQX1VTQlNUUyAgICAgICAgICAoMHgwMDRVTCkKKyNkZWZpbmUgQ0FQX1VTQklOVFIgICAgICAgICAoMHgwMDhVTCkKKyNkZWZpbmUgQ0FQX0RFVklDRUFERFIgICAgICAoMHgwMTRVTCkKKyNkZWZpbmUgQ0FQX0VORFBUTElTVEFERFIgICAoMHgwMThVTCkKKyNkZWZpbmUgQ0FQX1BPUlRTQyAgICAgICAgICAoMHgwNDRVTCkKKyNkZWZpbmUgQ0FQX0RFVkxDICAgICAgICAgICAoMHgwQjRVTCkKKyNkZWZpbmUgQ0FQX1VTQk1PREUgICAgICAgICAoaHdfYmFuay5scG0gPyAweDBDOFVMIDogMHgwNjhVTCkKKyNkZWZpbmUgQ0FQX0VORFBUU0VUVVBTVEFUICAoaHdfYmFuay5scG0gPyAweDBEOFVMIDogMHgwNkNVTCkKKyNkZWZpbmUgQ0FQX0VORFBUUFJJTUUgICAgICAoaHdfYmFuay5scG0gPyAweDBEQ1VMIDogMHgwNzBVTCkKKyNkZWZpbmUgQ0FQX0VORFBURkxVU0ggICAgICAoaHdfYmFuay5scG0gPyAweDBFMFVMIDogMHgwNzRVTCkKKyNkZWZpbmUgQ0FQX0VORFBUU1RBVCAgICAgICAoaHdfYmFuay5scG0gPyAweDBFNFVMIDogMHgwNzhVTCkKKyNkZWZpbmUgQ0FQX0VORFBUQ09NUExFVEUgICAoaHdfYmFuay5scG0gPyAweDBFOFVMIDogMHgwN0NVTCkKKyNkZWZpbmUgQ0FQX0VORFBUQ1RSTCAgICAgICAoaHdfYmFuay5scG0gPyAweDBFQ1VMIDogMHgwODBVTCkKKyNkZWZpbmUgQ0FQX0xBU1QgICAgICAgICAgICAoaHdfYmFuay5scG0gPyAweDEyQ1VMIDogMHgwQzBVTCkKKworLyogbWF4aW11bSBudW1iZXIgb2YgZW5wb2ludHM6IHZhbGlkIG9ubHkgYWZ0ZXIgaHdfZGV2aWNlX3Jlc2V0KCkgKi8KK3N0YXRpYyB1bnNpZ25lZCBod19lcF9tYXg7CisKKy8qKgorICogaHdfZXBfYml0OiBjYWxjdWxhdGVzIHRoZSBiaXQgbnVtYmVyCisgKiBAbnVtOiBlbmRwb2ludCBudW1iZXIKKyAqIEBkaXI6IGVuZHBvaW50IGRpcmVjdGlvbgorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBiaXQgbnVtYmVyCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGh3X2VwX2JpdChpbnQgbnVtLCBpbnQgZGlyKQoreworCXJldHVybiBudW0gKyAoZGlyID8gMTYgOiAwKTsKK30KKworLyoqCisgKiBod19hcmVhZDogcmVhZHMgZnJvbSByZWdpc3RlciBiaXRmaWVsZAorICogQGFkZHI6IGFkZHJlc3MgcmVsYXRpdmUgdG8gYnVzIG1hcAorICogQG1hc2s6IGJpdGZpZWxkIG1hc2sKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgcmVnaXN0ZXIgYml0ZmllbGQgZGF0YQorICovCitzdGF0aWMgdTMyIGh3X2FyZWFkKHUzMiBhZGRyLCB1MzIgbWFzaykKK3sKKwlyZXR1cm4gaW9yZWFkMzIoYWRkciArIGh3X2JhbmsuYWJzKSAmIG1hc2s7Cit9CisKKy8qKgorICogaHdfYXdyaXRlOiB3cml0ZXMgdG8gcmVnaXN0ZXIgYml0ZmllbGQKKyAqIEBhZGRyOiBhZGRyZXNzIHJlbGF0aXZlIHRvIGJ1cyBtYXAKKyAqIEBtYXNrOiBiaXRmaWVsZCBtYXNrCisgKiBAZGF0YTogbmV3IGRhdGEKKyAqLworc3RhdGljIHZvaWQgaHdfYXdyaXRlKHUzMiBhZGRyLCB1MzIgbWFzaywgdTMyIGRhdGEpCit7CisJaW93cml0ZTMyKGh3X2FyZWFkKGFkZHIsIH5tYXNrKSB8IChkYXRhICYgbWFzayksCisJCSAgYWRkciArIGh3X2JhbmsuYWJzKTsKK30KKworLyoqCisgKiBod19jcmVhZDogcmVhZHMgZnJvbSByZWdpc3RlciBiaXRmaWVsZAorICogQGFkZHI6IGFkZHJlc3MgcmVsYXRpdmUgdG8gQ0FQIG9mZnNldCBwbHVzIGNvbnRlbnQKKyAqIEBtYXNrOiBiaXRmaWVsZCBtYXNrCisgKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHJlZ2lzdGVyIGJpdGZpZWxkIGRhdGEKKyAqLworc3RhdGljIHUzMiBod19jcmVhZCh1MzIgYWRkciwgdTMyIG1hc2spCit7CisJcmV0dXJuIGlvcmVhZDMyKGFkZHIgKyBod19iYW5rLmNhcCkgJiBtYXNrOworfQorCisvKioKKyAqIGh3X2N3cml0ZTogd3JpdGVzIHRvIHJlZ2lzdGVyIGJpdGZpZWxkCisgKiBAYWRkcjogYWRkcmVzcyByZWxhdGl2ZSB0byBDQVAgb2Zmc2V0IHBsdXMgY29udGVudAorICogQG1hc2s6IGJpdGZpZWxkIG1hc2sKKyAqIEBkYXRhOiBuZXcgZGF0YQorICovCitzdGF0aWMgdm9pZCBod19jd3JpdGUodTMyIGFkZHIsIHUzMiBtYXNrLCB1MzIgZGF0YSkKK3sKKwlpb3dyaXRlMzIoaHdfY3JlYWQoYWRkciwgfm1hc2spIHwgKGRhdGEgJiBtYXNrKSwKKwkJICBhZGRyICsgaHdfYmFuay5jYXApOworfQorCisvKioKKyAqIGh3X2N0ZXN0X2FuZF9jbGVhcjogdGVzdHMgJiBjbGVhcnMgcmVnaXN0ZXIgYml0ZmllbGQKKyAqIEBhZGRyOiBhZGRyZXNzIHJlbGF0aXZlIHRvIENBUCBvZmZzZXQgcGx1cyBjb250ZW50CisgKiBAbWFzazogYml0ZmllbGQgbWFzaworICoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyByZWdpc3RlciBiaXRmaWVsZCBkYXRhCisgKi8KK3N0YXRpYyB1MzIgaHdfY3Rlc3RfYW5kX2NsZWFyKHUzMiBhZGRyLCB1MzIgbWFzaykKK3sKKwl1MzIgcmVnID0gaHdfY3JlYWQoYWRkciwgbWFzayk7CisKKwlpb3dyaXRlMzIocmVnLCBhZGRyICsgaHdfYmFuay5jYXApOworCXJldHVybiByZWc7Cit9CisKKy8qKgorICogaHdfY3Rlc3RfYW5kX3dyaXRlOiB0ZXN0cyAmIHdyaXRlcyByZWdpc3RlciBiaXRmaWVsZAorICogQGFkZHI6IGFkZHJlc3MgcmVsYXRpdmUgdG8gQ0FQIG9mZnNldCBwbHVzIGNvbnRlbnQKKyAqIEBtYXNrOiBiaXRmaWVsZCBtYXNrCisgKiBAZGF0YTogbmV3IGRhdGEKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgcmVnaXN0ZXIgYml0ZmllbGQgZGF0YQorICovCitzdGF0aWMgdTMyIGh3X2N0ZXN0X2FuZF93cml0ZSh1MzIgYWRkciwgdTMyIG1hc2ssIHUzMiBkYXRhKQoreworCXUzMiByZWcgPSBod19jcmVhZChhZGRyLCB+MCk7CisKKwlpb3dyaXRlMzIoKHJlZyAmIH5tYXNrKSB8IChkYXRhICYgbWFzayksIGFkZHIgKyBod19iYW5rLmNhcCk7CisJcmV0dXJuIChyZWcgJiBtYXNrKSA+PiBmZnNfbnIobWFzayk7Cit9CisKKy8qKgorICogaHdfZGV2aWNlX3Jlc2V0OiByZXNldHMgY2hpcCAoZXhlY3V0ZSB3aXRob3V0IGludGVycnVwdGlvbikKKyAqIEBiYXNlOiByZWdpc3RlciBiYXNlIGFkZHJlc3MKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYW4gZXJyb3IgY29kZQorICovCitzdGF0aWMgaW50IGh3X2RldmljZV9yZXNldCh2b2lkIF9faW9tZW0gKmJhc2UpCit7CisJdTMyIHJlZzsKKworCS8qIGJhbmsgaXMgYSBtb2R1bGUgdmFyaWFibGUgKi8KKwlod19iYW5rLmFicyA9IGJhc2U7CisKKwlod19iYW5rLmNhcCA9IGh3X2JhbmsuYWJzOworCWh3X2JhbmsuY2FwICs9IEFCU19DQVBMRU5HVEg7CisJaHdfYmFuay5jYXAgKz0gaW9yZWFkOChod19iYW5rLmNhcCk7CisKKwlyZWcgPSBod19hcmVhZChBQlNfSENDUEFSQU1TLCBIQ0NQQVJBTVNfTEVOKSA+PiBmZnNfbnIoSENDUEFSQU1TX0xFTik7CisJaHdfYmFuay5scG0gID0gcmVnOworCWh3X2Jhbmsuc2l6ZSA9IGh3X2JhbmsuY2FwIC0gaHdfYmFuay5hYnM7CisJaHdfYmFuay5zaXplICs9IENBUF9MQVNUOworCWh3X2Jhbmsuc2l6ZSAvPSBzaXplb2YodTMyKTsKKworCS8qIHNob3VsZCBmbHVzaCAmIHN0b3AgYmVmb3JlIHJlc2V0ICovCisJaHdfY3dyaXRlKENBUF9FTkRQVEZMVVNILCB+MCwgfjApOworCWh3X2N3cml0ZShDQVBfVVNCQ01ELCBVU0JDTURfUlMsIDApOworCisJaHdfY3dyaXRlKENBUF9VU0JDTUQsIFVTQkNNRF9SU1QsIFVTQkNNRF9SU1QpOworCXdoaWxlIChod19jcmVhZChDQVBfVVNCQ01ELCBVU0JDTURfUlNUKSkKKwkJdWRlbGF5KDEwKTsgICAgICAgICAgICAgLyogbm90IFJUT1MgZnJpZW5kbHkgKi8KKworCS8qIFVTQk1PREUgc2hvdWxkIGJlIGNvbmZpZ3VyZWQgc3RlcCBieSBzdGVwICovCisJaHdfY3dyaXRlKENBUF9VU0JNT0RFLCBVU0JNT0RFX0NNLCBVU0JNT0RFX0NNX0lETEUpOworCWh3X2N3cml0ZShDQVBfVVNCTU9ERSwgVVNCTU9ERV9DTSwgVVNCTU9ERV9DTV9ERVZJQ0UpOworCWh3X2N3cml0ZShDQVBfVVNCTU9ERSwgVVNCTU9ERV9TTE9NLCBVU0JNT0RFX1NMT00pOyAgLyogSFcgPj0gMi4zICovCisKKwlpZiAoaHdfY3JlYWQoQ0FQX1VTQk1PREUsIFVTQk1PREVfQ00pICE9IFVTQk1PREVfQ01fREVWSUNFKSB7CisJCXByX2VycigiY2Fubm90IGVudGVyIGluIGRldmljZSBtb2RlIik7CisJCXByX2VycigibHBtID0gJWkiLCBod19iYW5rLmxwbSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXJlZyA9IGh3X2FyZWFkKEFCU19EQ0NQQVJBTVMsIERDQ1BBUkFNU19ERU4pID4+IGZmc19ucihEQ0NQQVJBTVNfREVOKTsKKwlpZiAocmVnID09IDAgfHwgcmVnID4gRU5EUFRfTUFYKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWh3X2VwX21heCA9IHJlZzsgICAvKiBjYWNoZSBodyBFTkRQVF9NQVggKi8KKworCS8qIHNldHVwIGxvY2sgbW9kZSA/ICovCisKKwkvKiBFTkRQVFNFVFVQU1RBVCBpcyAnMCcgYnkgZGVmYXVsdCAqLworCisJLyogSENTUEFSQU1TLmJmLnBwYyBTSE9VTEQgQkUgemVybyBmb3IgZGV2aWNlICovCisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBod19kZXZpY2Vfc3RhdGU6IGVuYWJsZXMvZGlzYWJsZXMgaW50ZXJydXB0cyAmIHN0YXJ0cy9zdG9wcyBkZXZpY2UgKGV4ZWN1dGUKKyAqICAgICAgICAgICAgICAgICAgd2l0aG91dCBpbnRlcnJ1cHRpb24pCisgKiBAZG1hOiAwID0+IGRpc2FibGUsICEwID0+IGVuYWJsZSBhbmQgc2V0IGRtYSBlbmdpbmUKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYW4gZXJyb3IgY29kZQorICovCitzdGF0aWMgaW50IGh3X2RldmljZV9zdGF0ZSh1MzIgZG1hKQoreworCWlmIChkbWEpIHsKKwkJaHdfY3dyaXRlKENBUF9FTkRQVExJU1RBRERSLCB+MCwgZG1hKTsKKwkJLyogaW50ZXJydXB0LCBlcnJvciwgcG9ydCBjaGFuZ2UsIHJlc2V0LCBzbGVlcC9zdXNwZW5kICovCisJCWh3X2N3cml0ZShDQVBfVVNCSU5UUiwgfjAsCisJCQkgICAgIFVTQmlfVUl8VVNCaV9VRUl8VVNCaV9QQ0l8VVNCaV9VUkl8VVNCaV9TTEkpOworCQlod19jd3JpdGUoQ0FQX1VTQkNNRCwgVVNCQ01EX1JTLCBVU0JDTURfUlMpOworCX0gZWxzZSB7CisJCWh3X2N3cml0ZShDQVBfVVNCQ01ELCBVU0JDTURfUlMsIDApOworCQlod19jd3JpdGUoQ0FQX1VTQklOVFIsIH4wLCAwKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogaHdfZXBfZmx1c2g6IGZsdXNoIGVuZHBvaW50IGZpZm8gKGV4ZWN1dGUgd2l0aG91dCBpbnRlcnJ1cHRpb24pCisgKiBAbnVtOiBlbmRwb2ludCBudW1iZXIKKyAqIEBkaXI6IGVuZHBvaW50IGRpcmVjdGlvbgorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhbiBlcnJvciBjb2RlCisgKi8KK3N0YXRpYyBpbnQgaHdfZXBfZmx1c2goaW50IG51bSwgaW50IGRpcikKK3sKKwlpbnQgbiA9IGh3X2VwX2JpdChudW0sIGRpcik7CisKKwlkbyB7CisJCS8qIGZsdXNoIGFueSBwZW5kaW5nIHRyYW5zZmVyICovCisJCWh3X2N3cml0ZShDQVBfRU5EUFRGTFVTSCwgQklUKG4pLCBCSVQobikpOworCQl3aGlsZSAoaHdfY3JlYWQoQ0FQX0VORFBURkxVU0gsIEJJVChuKSkpCisJCQljcHVfcmVsYXgoKTsKKwl9IHdoaWxlIChod19jcmVhZChDQVBfRU5EUFRTVEFULCBCSVQobikpKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIGh3X2VwX2Rpc2FibGU6IGRpc2FibGVzIGVuZHBvaW50IChleGVjdXRlIHdpdGhvdXQgaW50ZXJydXB0aW9uKQorICogQG51bTogZW5kcG9pbnQgbnVtYmVyCisgKiBAZGlyOiBlbmRwb2ludCBkaXJlY3Rpb24KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYW4gZXJyb3IgY29kZQorICovCitzdGF0aWMgaW50IGh3X2VwX2Rpc2FibGUoaW50IG51bSwgaW50IGRpcikKK3sKKwlod19lcF9mbHVzaChudW0sIGRpcik7CisJaHdfY3dyaXRlKENBUF9FTkRQVENUUkwgKyBudW0gKiBzaXplb2YodTMyKSwKKwkJICBkaXIgPyBFTkRQVENUUkxfVFhFIDogRU5EUFRDVFJMX1JYRSwgMCk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogaHdfZXBfZW5hYmxlOiBlbmFibGVzIGVuZHBvaW50IChleGVjdXRlIHdpdGhvdXQgaW50ZXJydXB0aW9uKQorICogQG51bTogIGVuZHBvaW50IG51bWJlcgorICogQGRpcjogIGVuZHBvaW50IGRpcmVjdGlvbgorICogQHR5cGU6IGVuZHBvaW50IHR5cGUKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYW4gZXJyb3IgY29kZQorICovCitzdGF0aWMgaW50IGh3X2VwX2VuYWJsZShpbnQgbnVtLCBpbnQgZGlyLCBpbnQgdHlwZSkKK3sKKwl1MzIgbWFzaywgZGF0YTsKKworCWlmIChkaXIpIHsKKwkJbWFzayAgPSBFTkRQVENUUkxfVFhUOyAgLyogdHlwZSAgICAqLworCQlkYXRhICA9IHR5cGUgPDwgZmZzX25yKG1hc2spOworCisJCW1hc2sgfD0gRU5EUFRDVFJMX1RYUzsgIC8qIHVuc3RhbGwgKi8KKwkJbWFzayB8PSBFTkRQVENUUkxfVFhSOyAgLyogcmVzZXQgZGF0YSB0b2dnbGUgKi8KKwkJZGF0YSB8PSBFTkRQVENUUkxfVFhSOworCQltYXNrIHw9IEVORFBUQ1RSTF9UWEU7ICAvKiBlbmFibGUgICovCisJCWRhdGEgfD0gRU5EUFRDVFJMX1RYRTsKKwl9IGVsc2UgeworCQltYXNrICA9IEVORFBUQ1RSTF9SWFQ7ICAvKiB0eXBlICAgICovCisJCWRhdGEgID0gdHlwZSA8PCBmZnNfbnIobWFzayk7CisKKwkJbWFzayB8PSBFTkRQVENUUkxfUlhTOyAgLyogdW5zdGFsbCAqLworCQltYXNrIHw9IEVORFBUQ1RSTF9SWFI7ICAvKiByZXNldCBkYXRhIHRvZ2dsZSAqLworCQlkYXRhIHw9IEVORFBUQ1RSTF9SWFI7CisJCW1hc2sgfD0gRU5EUFRDVFJMX1JYRTsgIC8qIGVuYWJsZSAgKi8KKwkJZGF0YSB8PSBFTkRQVENUUkxfUlhFOworCX0KKwlod19jd3JpdGUoQ0FQX0VORFBUQ1RSTCArIG51bSAqIHNpemVvZih1MzIpLCBtYXNrLCBkYXRhKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBod19lcF9nZXRfaGFsdDogcmV0dXJuIGVuZHBvaW50IGhhbHQgc3RhdHVzCisgKiBAbnVtOiBlbmRwb2ludCBudW1iZXIKKyAqIEBkaXI6IGVuZHBvaW50IGRpcmVjdGlvbgorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyAxIGlmIGVuZHBvaW50IGhhbHRlZAorICovCitzdGF0aWMgaW50IGh3X2VwX2dldF9oYWx0KGludCBudW0sIGludCBkaXIpCit7CisJdTMyIG1hc2sgPSBkaXIgPyBFTkRQVENUUkxfVFhTIDogRU5EUFRDVFJMX1JYUzsKKworCXJldHVybiBod19jcmVhZChDQVBfRU5EUFRDVFJMICsgbnVtICogc2l6ZW9mKHUzMiksIG1hc2spID8gMSA6IDA7Cit9CisKKy8qKgorICogaHdfZXBfaXNfcHJpbWVkOiB0ZXN0IGlmIGVuZHBvaW50IGlzIHByaW1lZCAoZXhlY3V0ZSB3aXRob3V0IGludGVycnVwdGlvbikKKyAqIEBudW06ICAgZW5kcG9pbnQgbnVtYmVyCisgKiBAZGlyOiAgIGVuZHBvaW50IGRpcmVjdGlvbgorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0cnVlIGlmIGVuZHBvaW50IHByaW1lZAorICovCitzdGF0aWMgaW50IGh3X2VwX2lzX3ByaW1lZChpbnQgbnVtLCBpbnQgZGlyKQoreworCXUzMiByZWcgPSBod19jcmVhZChDQVBfRU5EUFRQUklNRSwgfjApIHwgaHdfY3JlYWQoQ0FQX0VORFBUU1RBVCwgfjApOworCisJcmV0dXJuIHRlc3RfYml0KGh3X2VwX2JpdChudW0sIGRpciksICh2b2lkICopJnJlZyk7Cit9CisKKy8qKgorICogaHdfdGVzdF9hbmRfY2xlYXJfc2V0dXBfc3RhdHVzOiB0ZXN0ICYgY2xlYXIgc2V0dXAgc3RhdHVzIChleGVjdXRlIHdpdGhvdXQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJydXB0aW9uKQorICogQG46IGJpdCBudW1iZXIgKGVuZHBvaW50KQorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBzZXR1cCBzdGF0dXMKKyAqLworc3RhdGljIGludCBod190ZXN0X2FuZF9jbGVhcl9zZXR1cF9zdGF0dXMoaW50IG4pCit7CisJcmV0dXJuIGh3X2N0ZXN0X2FuZF9jbGVhcihDQVBfRU5EUFRTRVRVUFNUQVQsIEJJVChuKSk7Cit9CisKKy8qKgorICogaHdfZXBfcHJpbWU6IHByaW1lcyBlbmRwb2ludCAoZXhlY3V0ZSB3aXRob3V0IGludGVycnVwdGlvbikKKyAqIEBudW06ICAgICBlbmRwb2ludCBudW1iZXIKKyAqIEBkaXI6ICAgICBlbmRwb2ludCBkaXJlY3Rpb24KKyAqIEBpc19jdHJsOiB0cnVlIGlmIGNvbnRyb2wgZW5kcG9pbnQKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYW4gZXJyb3IgY29kZQorICovCitzdGF0aWMgaW50IGh3X2VwX3ByaW1lKGludCBudW0sIGludCBkaXIsIGludCBpc19jdHJsKQoreworCWludCBuID0gaHdfZXBfYml0KG51bSwgZGlyKTsKKworCS8qIHRoZSBjYWxsZXIgc2hvdWxkIGZsdXNoIGZpcnN0ICovCisJaWYgKGh3X2VwX2lzX3ByaW1lZChudW0sIGRpcikpCisJCXJldHVybiAtRUJVU1k7CisKKwlpZiAoaXNfY3RybCAmJiBkaXIgPT0gUlggJiYgaHdfY3JlYWQoQ0FQX0VORFBUU0VUVVBTVEFULCBCSVQobnVtKSkpCisJCXJldHVybiAtRUFHQUlOOworCisJaHdfY3dyaXRlKENBUF9FTkRQVFBSSU1FLCBCSVQobiksIEJJVChuKSk7CisKKwl3aGlsZSAoaHdfY3JlYWQoQ0FQX0VORFBUUFJJTUUsIEJJVChuKSkpCisJCWNwdV9yZWxheCgpOworCWlmIChpc19jdHJsICYmIGRpciA9PSBSWCAgJiYgaHdfY3JlYWQoQ0FQX0VORFBUU0VUVVBTVEFULCBCSVQobnVtKSkpCisJCXJldHVybiAtRUFHQUlOOworCisJLyogc3RhdHVzIHNob3VsdCBiZSB0ZXN0ZWQgYWNjb3JkaW5nIHdpdGggbWFudWFsIGJ1dCBpdCBkb2Vzbid0IHdvcmsgKi8KKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBod19lcF9zZXRfaGFsdDogY29uZmlndXJlcyBlcCBoYWx0ICYgcmVzZXRzIGRhdGEgdG9nZ2xlIGFmdGVyIGNsZWFyIChleGVjdXRlCisgKiAgICAgICAgICAgICAgICAgd2l0aG91dCBpbnRlcnJ1cHRpb24pCisgKiBAbnVtOiAgIGVuZHBvaW50IG51bWJlcgorICogQGRpcjogICBlbmRwb2ludCBkaXJlY3Rpb24KKyAqIEB2YWx1ZTogdHJ1ZSA9PiBzdGFsbCwgZmFsc2UgPT4gdW5zdGFsbAorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhbiBlcnJvciBjb2RlCisgKi8KK3N0YXRpYyBpbnQgaHdfZXBfc2V0X2hhbHQoaW50IG51bSwgaW50IGRpciwgaW50IHZhbHVlKQoreworCWlmICh2YWx1ZSAhPSAwICYmIHZhbHVlICE9IDEpCisJCXJldHVybiAtRUlOVkFMOworCisJZG8geworCQl1MzIgYWRkciA9IENBUF9FTkRQVENUUkwgKyBudW0gKiBzaXplb2YodTMyKTsKKwkJdTMyIG1hc2tfeHMgPSBkaXIgPyBFTkRQVENUUkxfVFhTIDogRU5EUFRDVFJMX1JYUzsKKwkJdTMyIG1hc2tfeHIgPSBkaXIgPyBFTkRQVENUUkxfVFhSIDogRU5EUFRDVFJMX1JYUjsKKworCQkvKiBkYXRhIHRvZ2dsZSAtIHJlc2VydmVkIGZvciBFUDAgYnV0IGl0J3MgaW4gRVNTICovCisJCWh3X2N3cml0ZShhZGRyLCBtYXNrX3hzfG1hc2tfeHIsIHZhbHVlID8gbWFza194cyA6IG1hc2tfeHIpOworCisJfSB3aGlsZSAodmFsdWUgIT0gaHdfZXBfZ2V0X2hhbHQobnVtLCBkaXIpKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIGh3X2ludHJfY2xlYXI6IGRpc2FibGVzIGludGVycnVwdCAmIGNsZWFycyBpbnRlcnJ1cHQgc3RhdHVzIChleGVjdXRlIHdpdGhvdXQKKyAqICAgICAgICAgICAgICAgIGludGVycnVwdGlvbikKKyAqIEBuOiBpbnRlcnJ1cHQgYml0CisgKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGFuIGVycm9yIGNvZGUKKyAqLworc3RhdGljIGludCBod19pbnRyX2NsZWFyKGludCBuKQoreworCWlmIChuID49IFJFR19CSVRTKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWh3X2N3cml0ZShDQVBfVVNCSU5UUiwgQklUKG4pLCAwKTsKKwlod19jd3JpdGUoQ0FQX1VTQlNUUywgIEJJVChuKSwgQklUKG4pKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBod19pbnRyX2ZvcmNlOiBlbmFibGVzIGludGVycnVwdCAmIGZvcmNlcyBpbnRlcnJ1cHQgc3RhdHVzIChleGVjdXRlIHdpdGhvdXQKKyAqICAgICAgICAgICAgICAgIGludGVycnVwdGlvbikKKyAqIEBuOiBpbnRlcnJ1cHQgYml0CisgKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGFuIGVycm9yIGNvZGUKKyAqLworc3RhdGljIGludCBod19pbnRyX2ZvcmNlKGludCBuKQoreworCWlmIChuID49IFJFR19CSVRTKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWh3X2F3cml0ZShBQlNfVEVTVE1PREUsIFRFU1RNT0RFX0ZPUkNFLCBURVNUTU9ERV9GT1JDRSk7CisJaHdfY3dyaXRlKENBUF9VU0JJTlRSLCAgQklUKG4pLCBCSVQobikpOworCWh3X2N3cml0ZShDQVBfVVNCU1RTLCAgIEJJVChuKSwgQklUKG4pKTsKKwlod19hd3JpdGUoQUJTX1RFU1RNT0RFLCBURVNUTU9ERV9GT1JDRSwgMCk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogaHdfaXNfcG9ydF9oaWdoX3NwZWVkOiB0ZXN0IGlmIHBvcnQgaXMgaGlnaCBzcGVlZAorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0cnVlIGlmIGhpZ2ggc3BlZWQgcG9ydAorICovCitzdGF0aWMgaW50IGh3X3BvcnRfaXNfaGlnaF9zcGVlZCh2b2lkKQoreworCXJldHVybiBod19iYW5rLmxwbSA/IGh3X2NyZWFkKENBUF9ERVZMQywgREVWTENfUFNQRCkgOgorCQlod19jcmVhZChDQVBfUE9SVFNDLCBQT1JUU0NfSFNQKTsKK30KKworLyoqCisgKiBod19wb3J0X3Rlc3RfZ2V0OiByZWFkcyBwb3J0IHRlc3QgbW9kZSB2YWx1ZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBwb3J0IHRlc3QgbW9kZSB2YWx1ZQorICovCitzdGF0aWMgdTggaHdfcG9ydF90ZXN0X2dldCh2b2lkKQoreworCXJldHVybiBod19jcmVhZChDQVBfUE9SVFNDLCBQT1JUU0NfUFRDKSA+PiBmZnNfbnIoUE9SVFNDX1BUQyk7Cit9CisKKy8qKgorICogaHdfcG9ydF90ZXN0X3NldDogd3JpdGVzIHBvcnQgdGVzdCBtb2RlIChleGVjdXRlIHdpdGhvdXQgaW50ZXJydXB0aW9uKQorICogQG1vZGU6IG5ldyB2YWx1ZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhbiBlcnJvciBjb2RlCisgKi8KK3N0YXRpYyBpbnQgaHdfcG9ydF90ZXN0X3NldCh1OCBtb2RlKQoreworCWNvbnN0IHU4IFRFU1RfTU9ERV9NQVggPSA3OworCisJaWYgKG1vZGUgPiBURVNUX01PREVfTUFYKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWh3X2N3cml0ZShDQVBfUE9SVFNDLCBQT1JUU0NfUFRDLCBtb2RlIDw8IGZmc19ucihQT1JUU0NfUFRDKSk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogaHdfcmVhZF9pbnRyX2VuYWJsZTogcmV0dXJucyBpbnRlcnJ1cHQgZW5hYmxlIHJlZ2lzdGVyCisgKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHJlZ2lzdGVyIGRhdGEKKyAqLworc3RhdGljIHUzMiBod19yZWFkX2ludHJfZW5hYmxlKHZvaWQpCit7CisJcmV0dXJuIGh3X2NyZWFkKENBUF9VU0JJTlRSLCB+MCk7Cit9CisKKy8qKgorICogaHdfcmVhZF9pbnRyX3N0YXR1czogcmV0dXJucyBpbnRlcnJ1cHQgc3RhdHVzIHJlZ2lzdGVyCisgKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHJlZ2lzdGVyIGRhdGEKKyAqLworc3RhdGljIHUzMiBod19yZWFkX2ludHJfc3RhdHVzKHZvaWQpCit7CisJcmV0dXJuIGh3X2NyZWFkKENBUF9VU0JTVFMsIH4wKTsKK30KKworLyoqCisgKiBod19yZWdpc3Rlcl9yZWFkOiByZWFkcyBhbGwgZGV2aWNlIHJlZ2lzdGVycyAoZXhlY3V0ZSB3aXRob3V0IGludGVycnVwdGlvbikKKyAqIEBidWY6ICBkZXN0aW5hdGlvbiBidWZmZXIKKyAqIEBzaXplOiBidWZmZXIgc2l6ZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBudW1iZXIgb2YgcmVnaXN0ZXJzIHJlYWQKKyAqLworc3RhdGljIHNpemVfdCBod19yZWdpc3Rlcl9yZWFkKHUzMiAqYnVmLCBzaXplX3Qgc2l6ZSkKK3sKKwl1bnNpZ25lZCBpOworCisJaWYgKHNpemUgPiBod19iYW5rLnNpemUpCisJCXNpemUgPSBod19iYW5rLnNpemU7CisKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQorCQlidWZbaV0gPSBod19hcmVhZChpICogc2l6ZW9mKHUzMiksIH4wKTsKKworCXJldHVybiBzaXplOworfQorCisvKioKKyAqIGh3X3JlZ2lzdGVyX3dyaXRlOiB3cml0ZXMgdG8gcmVnaXN0ZXIKKyAqIEBhZGRyOiByZWdpc3RlciBhZGRyZXNzCisgKiBAZGF0YTogcmVnaXN0ZXIgdmFsdWUKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYW4gZXJyb3IgY29kZQorICovCitzdGF0aWMgaW50IGh3X3JlZ2lzdGVyX3dyaXRlKHUxNiBhZGRyLCB1MzIgZGF0YSkKK3sKKwkvKiBhbGlnbiAqLworCWFkZHIgLz0gc2l6ZW9mKHUzMik7CisKKwlpZiAoYWRkciA+PSBod19iYW5rLnNpemUpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogYWxpZ24gKi8KKwlhZGRyICo9IHNpemVvZih1MzIpOworCisJaHdfYXdyaXRlKGFkZHIsIH4wLCBkYXRhKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBod190ZXN0X2FuZF9jbGVhcl9jb21wbGV0ZTogdGVzdCAmIGNsZWFyIGNvbXBsZXRlIHN0YXR1cyAoZXhlY3V0ZSB3aXRob3V0CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJydXB0aW9uKQorICogQG46IGJpdCBudW1iZXIgKGVuZHBvaW50KQorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBjb21wbGV0ZSBzdGF0dXMKKyAqLworc3RhdGljIGludCBod190ZXN0X2FuZF9jbGVhcl9jb21wbGV0ZShpbnQgbikKK3sKKwlyZXR1cm4gaHdfY3Rlc3RfYW5kX2NsZWFyKENBUF9FTkRQVENPTVBMRVRFLCBCSVQobikpOworfQorCisvKioKKyAqIGh3X3Rlc3RfYW5kX2NsZWFyX2ludHJfYWN0aXZlOiB0ZXN0ICYgY2xlYXIgYWN0aXZlIGludGVycnVwdHMgKGV4ZWN1dGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRob3V0IGludGVycnVwdGlvbikKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYWN0aXZlIGludGVycnV0cHMKKyAqLworc3RhdGljIHUzMiBod190ZXN0X2FuZF9jbGVhcl9pbnRyX2FjdGl2ZSh2b2lkKQoreworCXUzMiByZWcgPSBod19yZWFkX2ludHJfc3RhdHVzKCkgJiBod19yZWFkX2ludHJfZW5hYmxlKCk7CisKKwlod19jd3JpdGUoQ0FQX1VTQlNUUywgfjAsIHJlZyk7CisJcmV0dXJuIHJlZzsKK30KKworLyoqCisgKiBod190ZXN0X2FuZF9jbGVhcl9zZXR1cF9ndWFyZDogdGVzdCAmIGNsZWFyIHNldHVwIGd1YXJkIChleGVjdXRlIHdpdGhvdXQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnJ1cHRpb24pCisgKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGd1YXJkIHZhbHVlCisgKi8KK3N0YXRpYyBpbnQgaHdfdGVzdF9hbmRfY2xlYXJfc2V0dXBfZ3VhcmQodm9pZCkKK3sKKwlyZXR1cm4gaHdfY3Rlc3RfYW5kX3dyaXRlKENBUF9VU0JDTUQsIFVTQkNNRF9TVVRXLCAwKTsKK30KKworLyoqCisgKiBod190ZXN0X2FuZF9zZXRfc2V0dXBfZ3VhcmQ6IHRlc3QgJiBzZXQgc2V0dXAgZ3VhcmQgKGV4ZWN1dGUgd2l0aG91dAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnJ1cHRpb24pCisgKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGd1YXJkIHZhbHVlCisgKi8KK3N0YXRpYyBpbnQgaHdfdGVzdF9hbmRfc2V0X3NldHVwX2d1YXJkKHZvaWQpCit7CisJcmV0dXJuIGh3X2N0ZXN0X2FuZF93cml0ZShDQVBfVVNCQ01ELCBVU0JDTURfU1VUVywgVVNCQ01EX1NVVFcpOworfQorCisvKioKKyAqIGh3X3VzYl9zZXRfYWRkcmVzczogY29uZmlndXJlcyBVU0IgYWRkcmVzcyAoZXhlY3V0ZSB3aXRob3V0IGludGVycnVwdGlvbikKKyAqIEB2YWx1ZTogbmV3IFVTQiBhZGRyZXNzCisgKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGFuIGVycm9yIGNvZGUKKyAqLworc3RhdGljIGludCBod191c2Jfc2V0X2FkZHJlc3ModTggdmFsdWUpCit7CisJLyogYWR2YW5jZSAqLworCWh3X2N3cml0ZShDQVBfREVWSUNFQUREUiwgREVWSUNFQUREUl9VU0JBRFIgfCBERVZJQ0VBRERSX1VTQkFEUkEsCisJCSAgdmFsdWUgPDwgZmZzX25yKERFVklDRUFERFJfVVNCQURSKSB8IERFVklDRUFERFJfVVNCQURSQSk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogaHdfdXNiX3Jlc2V0OiByZXN0YXJ0IGRldmljZSBhZnRlciBhIGJ1cyByZXNldCAoZXhlY3V0ZSB3aXRob3V0CisgKiAgICAgICAgICAgICAgIGludGVycnVwdGlvbikKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYW4gZXJyb3IgY29kZQorICovCitzdGF0aWMgaW50IGh3X3VzYl9yZXNldCh2b2lkKQoreworCWh3X3VzYl9zZXRfYWRkcmVzcygwKTsKKworCS8qIEVTUyBmbHVzaGVzIG9ubHkgYXQgZW5kPyE/ICovCisJaHdfY3dyaXRlKENBUF9FTkRQVEZMVVNILCAgICB+MCwgfjApOyAgIC8qIGZsdXNoIGFsbCBFUHMgKi8KKworCS8qIGNsZWFyIHNldHVwIHRva2VuIHNlbWFwaG9yZXMgKi8KKwlod19jd3JpdGUoQ0FQX0VORFBUU0VUVVBTVEFULCAwLCAgMCk7ICAgLyogd3JpdGVzIGl0cyBjb250ZW50ICovCisKKwkvKiBjbGVhciBjb21wbGV0ZSBzdGF0dXMgKi8KKwlod19jd3JpdGUoQ0FQX0VORFBUQ09NUExFVEUsICAwLCAgMCk7ICAgLyogd3JpdGVzIGl0cyBjb250ZW50ICovCisKKwkvKiB3YWl0IHVudGlsIGFsbCBiaXRzIGNsZWFyZWQgKi8KKwl3aGlsZSAoaHdfY3JlYWQoQ0FQX0VORFBUUFJJTUUsIH4wKSkKKwkJdWRlbGF5KDEwKTsgICAgICAgICAgICAgLyogbm90IFJUT1MgZnJpZW5kbHkgKi8KKworCS8qIHJlc2V0IGFsbCBlbmRwb2ludHMgPyAqLworCisJLyogcmVzZXQgaW50ZXJuYWwgc3RhdHVzIGFuZCB3YWl0IGZvciBmdXJ0aGVyIGluc3RydWN0aW9ucworCSAgIG5vIG5lZWQgdG8gdmVyaWZ5IHRoZSBwb3J0IHJlc2V0IHN0YXR1cyAoRVNTIGRvZXMgaXQpICovCisKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogREJHIGJsb2NrCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAqIHNob3dfZGV2aWNlOiBwcmludHMgaW5mb3JtYXRpb24gYWJvdXQgZGV2aWNlIGNhcGFiaWxpdGllcyBhbmQgc3RhdHVzCisgKgorICogQ2hlY2sgImRldmljZS5oIiBmb3IgZGV0YWlscworICovCitzdGF0aWMgc3NpemVfdCBzaG93X2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJICAgY2hhciAqYnVmKQoreworCXN0cnVjdCBjaTEzeHh4ICp1ZGMgPSBjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3QgY2kxM3h4eCwgZ2FkZ2V0LmRldik7CisJc3RydWN0IHVzYl9nYWRnZXQgKmdhZGdldCA9ICZ1ZGMtPmdhZGdldDsKKwlpbnQgbiA9IDA7CisKKwlkYmdfdHJhY2UoIlslc10gJXBcbiIsIF9fZnVuY19fLCBidWYpOworCWlmIChhdHRyID09IE5VTEwgfHwgYnVmID09IE5VTEwpIHsKKwkJZGV2X2VycihkZXYsICJbJXNdIEVJTlZBTFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gMDsKKwl9CisKKwluICs9IHNjbnByaW50ZihidWYgKyBuLCBQQUdFX1NJWkUgLSBuLCAic3BlZWQgICAgICAgICAgICAgPSAlZFxuIiwKKwkJICAgICAgIGdhZGdldC0+c3BlZWQpOworCW4gKz0gc2NucHJpbnRmKGJ1ZiArIG4sIFBBR0VfU0laRSAtIG4sICJpc19kdWFsc3BlZWQgICAgICA9ICVkXG4iLAorCQkgICAgICAgZ2FkZ2V0LT5pc19kdWFsc3BlZWQpOworCW4gKz0gc2NucHJpbnRmKGJ1ZiArIG4sIFBBR0VfU0laRSAtIG4sICJpc19vdGcgICAgICAgICAgICA9ICVkXG4iLAorCQkgICAgICAgZ2FkZ2V0LT5pc19vdGcpOworCW4gKz0gc2NucHJpbnRmKGJ1ZiArIG4sIFBBR0VfU0laRSAtIG4sICJpc19hX3BlcmlwaGVyYWwgICA9ICVkXG4iLAorCQkgICAgICAgZ2FkZ2V0LT5pc19hX3BlcmlwaGVyYWwpOworCW4gKz0gc2NucHJpbnRmKGJ1ZiArIG4sIFBBR0VfU0laRSAtIG4sICJiX2hucF9lbmFibGUgICAgICA9ICVkXG4iLAorCQkgICAgICAgZ2FkZ2V0LT5iX2hucF9lbmFibGUpOworCW4gKz0gc2NucHJpbnRmKGJ1ZiArIG4sIFBBR0VfU0laRSAtIG4sICJhX2hucF9zdXBwb3J0ICAgICA9ICVkXG4iLAorCQkgICAgICAgZ2FkZ2V0LT5hX2hucF9zdXBwb3J0KTsKKwluICs9IHNjbnByaW50ZihidWYgKyBuLCBQQUdFX1NJWkUgLSBuLCAiYV9hbHRfaG5wX3N1cHBvcnQgPSAlZFxuIiwKKwkJICAgICAgIGdhZGdldC0+YV9hbHRfaG5wX3N1cHBvcnQpOworCW4gKz0gc2NucHJpbnRmKGJ1ZiArIG4sIFBBR0VfU0laRSAtIG4sICJuYW1lICAgICAgICAgICAgICA9ICVzXG4iLAorCQkgICAgICAgKGdhZGdldC0+bmFtZSA/IGdhZGdldC0+bmFtZSA6ICIiKSk7CisKKwlyZXR1cm4gbjsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUihkZXZpY2UsIFNfSVJVU1IsIHNob3dfZGV2aWNlLCBOVUxMKTsKKworLyoqCisgKiBzaG93X2RyaXZlcjogcHJpbnRzIGluZm9ybWF0aW9uIGFib3V0IGF0dGFjaGVkIGdhZGdldCAoaWYgYW55KQorICoKKyAqIENoZWNrICJkZXZpY2UuaCIgZm9yIGRldGFpbHMKKyAqLworc3RhdGljIHNzaXplX3Qgc2hvd19kcml2ZXIoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgY2kxM3h4eCAqdWRjID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IGNpMTN4eHgsIGdhZGdldC5kZXYpOworCXN0cnVjdCB1c2JfZ2FkZ2V0X2RyaXZlciAqZHJpdmVyID0gdWRjLT5kcml2ZXI7CisJaW50IG4gPSAwOworCisJZGJnX3RyYWNlKCJbJXNdICVwXG4iLCBfX2Z1bmNfXywgYnVmKTsKKwlpZiAoYXR0ciA9PSBOVUxMIHx8IGJ1ZiA9PSBOVUxMKSB7CisJCWRldl9lcnIoZGV2LCAiWyVzXSBFSU5WQUxcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGRyaXZlciA9PSBOVUxMKQorCQlyZXR1cm4gc2NucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLAorCQkJCSAiVGhlcmUgaXMgbm8gZ2FkZ2V0IGF0dGFjaGVkIVxuIik7CisKKwluICs9IHNjbnByaW50ZihidWYgKyBuLCBQQUdFX1NJWkUgLSBuLCAiZnVuY3Rpb24gID0gJXNcbiIsCisJCSAgICAgICAoZHJpdmVyLT5mdW5jdGlvbiA/IGRyaXZlci0+ZnVuY3Rpb24gOiAiIikpOworCW4gKz0gc2NucHJpbnRmKGJ1ZiArIG4sIFBBR0VfU0laRSAtIG4sICJtYXggc3BlZWQgPSAlZFxuIiwKKwkJICAgICAgIGRyaXZlci0+c3BlZWQpOworCisJcmV0dXJuIG47Cit9CitzdGF0aWMgREVWSUNFX0FUVFIoZHJpdmVyLCBTX0lSVVNSLCBzaG93X2RyaXZlciwgTlVMTCk7CisKKy8qIE1heGltdW0gZXZlbnQgbWVzc2FnZSBsZW5ndGggKi8KKyNkZWZpbmUgREJHX0RBVEFfTVNHICAgNjRVTAorCisvKiBNYXhpbXVtIGV2ZW50IG1lc3NhZ2VzICovCisjZGVmaW5lIERCR19EQVRBX01BWCAgIDEyOFVMCisKKy8qIEV2ZW50IGJ1ZmZlciBkZXNjcmlwdG9yICovCitzdGF0aWMgc3RydWN0IHsKKwljaGFyICAgICAoYnVmW0RCR19EQVRBX01BWF0pW0RCR19EQVRBX01TR107ICAgLyogYnVmZmVyICovCisJdW5zaWduZWQgaWR4OyAgIC8qIGluZGV4ICovCisJdW5zaWduZWQgdHR5OyAgIC8qIHByaW50IHRvIGNvbnNvbGU/ICovCisJcndsb2NrX3QgbGNrOyAgIC8qIGxvY2sgKi8KK30gZGJnX2RhdGEgPSB7CisJLmlkeCA9IDAsCisJLnR0eSA9IDAsCisJLmxjayA9IF9fUldfTE9DS19VTkxPQ0tFRChsY2spCit9OworCisvKioKKyAqIGRiZ19kZWM6IGRlY3JlbWVudHMgZGVidWcgZXZlbnQgaW5kZXgKKyAqIEBpZHg6IGJ1ZmZlciBpbmRleAorICovCitzdGF0aWMgdm9pZCBkYmdfZGVjKHVuc2lnbmVkICppZHgpCit7CisJKmlkeCA9ICgqaWR4IC0gMSkgJiAoREJHX0RBVEFfTUFYLTEpOworfQorCisvKioKKyAqIGRiZ19pbmM6IGluY3JlbWVudHMgZGVidWcgZXZlbnQgaW5kZXgKKyAqIEBpZHg6IGJ1ZmZlciBpbmRleAorICovCitzdGF0aWMgdm9pZCBkYmdfaW5jKHVuc2lnbmVkICppZHgpCit7CisJKmlkeCA9ICgqaWR4ICsgMSkgJiAoREJHX0RBVEFfTUFYLTEpOworfQorCisvKioKKyAqIGRiZ19wcmludDogIHByaW50cyB0aGUgY29tbW9uIHBhcnQgb2YgdGhlIGV2ZW50CisgKiBAYWRkcjogICBlbmRwb2ludCBhZGRyZXNzCisgKiBAbmFtZTogICBldmVudCBuYW1lCisgKiBAc3RhdHVzOiBzdGF0dXMKKyAqIEBleHRyYTogIGV4dHJhIGluZm9ybWF0aW9uCisgKi8KK3N0YXRpYyB2b2lkIGRiZ19wcmludCh1OCBhZGRyLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgc3RhdHVzLCBjb25zdCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgdGltZXZhbCB0dmFsOworCXVuc2lnbmVkIGludCBzdGFtcDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJd3JpdGVfbG9ja19pcnFzYXZlKCZkYmdfZGF0YS5sY2ssIGZsYWdzKTsKKworCWRvX2dldHRpbWVvZmRheSgmdHZhbCk7CisJc3RhbXAgPSB0dmFsLnR2X3NlYyAmIDB4RkZGRjsJLyogMl4zMiA9IDQyOTQ5NjcyOTYuIExpbWl0IHRvIDQwOTZzICovCisJc3RhbXAgPSBzdGFtcCAqIDEwMDAwMDAgKyB0dmFsLnR2X3VzZWM7CisKKwlzY25wcmludGYoZGJnX2RhdGEuYnVmW2RiZ19kYXRhLmlkeF0sIERCR19EQVRBX01TRywKKwkJICAiJTA0WFx0uyAlMDJYICUtNy43cyAlNGkgq1x0JXNcbiIsCisJCSAgc3RhbXAsIGFkZHIsIG5hbWUsIHN0YXR1cywgZXh0cmEpOworCisJZGJnX2luYygmZGJnX2RhdGEuaWR4KTsKKworCXdyaXRlX3VubG9ja19pcnFyZXN0b3JlKCZkYmdfZGF0YS5sY2ssIGZsYWdzKTsKKworCWlmIChkYmdfZGF0YS50dHkgIT0gMCkKKwkJcHJfbm90aWNlKCIlMDRYXHS7ICUwMlggJS03LjdzICU0aSCrXHQlc1xuIiwKKwkJCSAgc3RhbXAsIGFkZHIsIG5hbWUsIHN0YXR1cywgZXh0cmEpOworfQorCisvKioKKyAqIGRiZ19kb25lOiBwcmludHMgYSBET05FIGV2ZW50CisgKiBAYWRkcjogICBlbmRwb2ludCBhZGRyZXNzCisgKiBAdGQ6ICAgICB0cmFuc2ZlciBkZXNjcmlwdG9yCisgKiBAc3RhdHVzOiBzdGF0dXMKKyAqLworc3RhdGljIHZvaWQgZGJnX2RvbmUodTggYWRkciwgY29uc3QgdTMyIHRva2VuLCBpbnQgc3RhdHVzKQoreworCWNoYXIgbXNnW0RCR19EQVRBX01TR107CisKKwlzY25wcmludGYobXNnLCBzaXplb2YobXNnKSwgIiVkICUwMlgiLAorCQkgIChpbnQpKHRva2VuICYgVERfVE9UQUxfQllURVMpID4+IGZmc19ucihURF9UT1RBTF9CWVRFUyksCisJCSAgKGludCkodG9rZW4gJiBURF9TVEFUVVMpICAgICAgPj4gZmZzX25yKFREX1NUQVRVUykpOworCWRiZ19wcmludChhZGRyLCAiRE9ORSIsIHN0YXR1cywgbXNnKTsKK30KKworLyoqCisgKiBkYmdfZXZlbnQ6IHByaW50cyBhIGdlbmVyaWMgZXZlbnQKKyAqIEBhZGRyOiAgIGVuZHBvaW50IGFkZHJlc3MKKyAqIEBuYW1lOiAgIGV2ZW50IG5hbWUKKyAqIEBzdGF0dXM6IHN0YXR1cworICovCitzdGF0aWMgdm9pZCBkYmdfZXZlbnQodTggYWRkciwgY29uc3QgY2hhciAqbmFtZSwgaW50IHN0YXR1cykKK3sKKwlpZiAobmFtZSAhPSBOVUxMKQorCQlkYmdfcHJpbnQoYWRkciwgbmFtZSwgc3RhdHVzLCAiIik7Cit9CisKKy8qCisgKiBkYmdfcXVldWU6IHByaW50cyBhIFFVRVVFIGV2ZW50CisgKiBAYWRkcjogICBlbmRwb2ludCBhZGRyZXNzCisgKiBAcmVxOiAgICBVU0IgcmVxdWVzdAorICogQHN0YXR1czogc3RhdHVzCisgKi8KK3N0YXRpYyB2b2lkIGRiZ19xdWV1ZSh1OCBhZGRyLCBjb25zdCBzdHJ1Y3QgdXNiX3JlcXVlc3QgKnJlcSwgaW50IHN0YXR1cykKK3sKKwljaGFyIG1zZ1tEQkdfREFUQV9NU0ddOworCisJaWYgKHJlcSAhPSBOVUxMKSB7CisJCXNjbnByaW50Zihtc2csIHNpemVvZihtc2cpLAorCQkJICAiJWQgJWQiLCAhcmVxLT5ub19pbnRlcnJ1cHQsIHJlcS0+bGVuZ3RoKTsKKwkJZGJnX3ByaW50KGFkZHIsICJRVUVVRSIsIHN0YXR1cywgbXNnKTsKKwl9Cit9CisKKy8qKgorICogZGJnX3NldHVwOiBwcmludHMgYSBTRVRVUCBldmVudAorICogQGFkZHI6IGVuZHBvaW50IGFkZHJlc3MKKyAqIEByZXE6ICBzZXR1cCByZXF1ZXN0CisgKi8KK3N0YXRpYyB2b2lkIGRiZ19zZXR1cCh1OCBhZGRyLCBjb25zdCBzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0ICpyZXEpCit7CisJY2hhciBtc2dbREJHX0RBVEFfTVNHXTsKKworCWlmIChyZXEgIT0gTlVMTCkgeworCQlzY25wcmludGYobXNnLCBzaXplb2YobXNnKSwKKwkJCSAgIiUwMlggJTAyWCAlMDRYICUwNFggJWQiLCByZXEtPmJSZXF1ZXN0VHlwZSwKKwkJCSAgcmVxLT5iUmVxdWVzdCwgbGUxNl90b19jcHUocmVxLT53VmFsdWUpLAorCQkJICBsZTE2X3RvX2NwdShyZXEtPndJbmRleCksIGxlMTZfdG9fY3B1KHJlcS0+d0xlbmd0aCkpOworCQlkYmdfcHJpbnQoYWRkciwgIlNFVFVQIiwgMCwgbXNnKTsKKwl9Cit9CisKKy8qKgorICogc2hvd19ldmVudHM6IGRpc3BsYXlzIHRoZSBldmVudCBidWZmZXIKKyAqCisgKiBDaGVjayAiZGV2aWNlLmgiIGZvciBkZXRhaWxzCisgKi8KK3N0YXRpYyBzc2l6ZV90IHNob3dfZXZlbnRzKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICBjaGFyICpidWYpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBpLCBqLCBuID0gMDsKKworCWRiZ190cmFjZSgiWyVzXSAlcFxuIiwgX19mdW5jX18sIGJ1Zik7CisJaWYgKGF0dHIgPT0gTlVMTCB8fCBidWYgPT0gTlVMTCkgeworCQlkZXZfZXJyKGRldiwgIlslc10gRUlOVkFMXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAwOworCX0KKworCXJlYWRfbG9ja19pcnFzYXZlKCZkYmdfZGF0YS5sY2ssIGZsYWdzKTsKKworCWkgPSBkYmdfZGF0YS5pZHg7CisJZm9yIChkYmdfZGVjKCZpKTsgaSAhPSBkYmdfZGF0YS5pZHg7IGRiZ19kZWMoJmkpKSB7CisJCW4gKz0gc3RybGVuKGRiZ19kYXRhLmJ1ZltpXSk7CisJCWlmIChuID49IFBBR0VfU0laRSkgeworCQkJbiAtPSBzdHJsZW4oZGJnX2RhdGEuYnVmW2ldKTsKKwkJCWJyZWFrOworCQl9CisJfQorCWZvciAoaiA9IDAsIGRiZ19pbmMoJmkpOyBqIDwgbjsgZGJnX2luYygmaSkpCisJCWogKz0gc2NucHJpbnRmKGJ1ZiArIGosIFBBR0VfU0laRSAtIGosCisJCQkgICAgICAgIiVzIiwgZGJnX2RhdGEuYnVmW2ldKTsKKworCXJlYWRfdW5sb2NrX2lycXJlc3RvcmUoJmRiZ19kYXRhLmxjaywgZmxhZ3MpOworCisJcmV0dXJuIG47Cit9CisKKy8qKgorICogc3RvcmVfZXZlbnRzOiBjb25maWd1cmUgaWYgZXZlbnRzIGFyZSBnb2luZyB0byBiZSBhbHNvIHByaW50ZWQgdG8gY29uc29sZQorICoKKyAqIENoZWNrICJkZXZpY2UuaCIgZm9yIGRldGFpbHMKKyAqLworc3RhdGljIHNzaXplX3Qgc3RvcmVfZXZlbnRzKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJdW5zaWduZWQgdHR5OworCisJZGJnX3RyYWNlKCJbJXNdICVwLCAlZFxuIiwgX19mdW5jX18sIGJ1ZiwgY291bnQpOworCWlmIChhdHRyID09IE5VTEwgfHwgYnVmID09IE5VTEwpIHsKKwkJZGV2X2VycihkZXYsICJbJXNdIEVJTlZBTFxuIiwgX19mdW5jX18pOworCQlnb3RvIGRvbmU7CisJfQorCisJaWYgKHNzY2FuZihidWYsICIldSIsICZ0dHkpICE9IDEgfHwgdHR5ID4gMSkgeworCQlkZXZfZXJyKGRldiwgIjwxfDA+OiBlbmFibGV8ZGlzYWJsZSBjb25zb2xlIGxvZ1xuIik7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlkYmdfZGF0YS50dHkgPSB0dHk7CisJZGV2X2luZm8oZGV2LCAidHR5ID0gJXUiLCBkYmdfZGF0YS50dHkpOworCisgZG9uZToKKwlyZXR1cm4gY291bnQ7Cit9CitzdGF0aWMgREVWSUNFX0FUVFIoZXZlbnRzLCBTX0lSVVNSIHwgU19JV1VTUiwgc2hvd19ldmVudHMsIHN0b3JlX2V2ZW50cyk7CisKKy8qKgorICogc2hvd19pbnRlcnM6IGludGVycnVwdCBzdGF0dXMsIGVuYWJsZSBzdGF0dXMgYW5kIGhpc3RvcmljCisgKgorICogQ2hlY2sgImRldmljZS5oIiBmb3IgZGV0YWlscworICovCitzdGF0aWMgc3NpemVfdCBzaG93X2ludGVycyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJICAgY2hhciAqYnVmKQoreworCXN0cnVjdCBjaTEzeHh4ICp1ZGMgPSBjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3QgY2kxM3h4eCwgZ2FkZ2V0LmRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1MzIgaW50cjsKKwl1bnNpZ25lZCBpLCBqLCBuID0gMDsKKworCWRiZ190cmFjZSgiWyVzXSAlcFxuIiwgX19mdW5jX18sIGJ1Zik7CisJaWYgKGF0dHIgPT0gTlVMTCB8fCBidWYgPT0gTlVMTCkgeworCQlkZXZfZXJyKGRldiwgIlslc10gRUlOVkFMXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAwOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKHVkYy0+bG9jaywgZmxhZ3MpOworCisJbiArPSBzY25wcmludGYoYnVmICsgbiwgUEFHRV9TSVpFIC0gbiwKKwkJICAgICAgICJzdGF0dXMgPSAlMDh4XG4iLCBod19yZWFkX2ludHJfc3RhdHVzKCkpOworCW4gKz0gc2NucHJpbnRmKGJ1ZiArIG4sIFBBR0VfU0laRSAtIG4sCisJCSAgICAgICAiZW5hYmxlID0gJTA4eFxuIiwgaHdfcmVhZF9pbnRyX2VuYWJsZSgpKTsKKworCW4gKz0gc2NucHJpbnRmKGJ1ZiArIG4sIFBBR0VfU0laRSAtIG4sICIqdGVzdCA9ICVkXG4iLAorCQkgICAgICAgaXNyX3N0YXRpc3RpY3MudGVzdCk7CisJbiArPSBzY25wcmludGYoYnVmICsgbiwgUEFHRV9TSVpFIC0gbiwgIrsgdWkgID0gJWRcbiIsCisJCSAgICAgICBpc3Jfc3RhdGlzdGljcy51aSk7CisJbiArPSBzY25wcmludGYoYnVmICsgbiwgUEFHRV9TSVpFIC0gbiwgIrsgdWVpID0gJWRcbiIsCisJCSAgICAgICBpc3Jfc3RhdGlzdGljcy51ZWkpOworCW4gKz0gc2NucHJpbnRmKGJ1ZiArIG4sIFBBR0VfU0laRSAtIG4sICK7IHBjaSA9ICVkXG4iLAorCQkgICAgICAgaXNyX3N0YXRpc3RpY3MucGNpKTsKKwluICs9IHNjbnByaW50ZihidWYgKyBuLCBQQUdFX1NJWkUgLSBuLCAiuyB1cmkgPSAlZFxuIiwKKwkJICAgICAgIGlzcl9zdGF0aXN0aWNzLnVyaSk7CisJbiArPSBzY25wcmludGYoYnVmICsgbiwgUEFHRV9TSVpFIC0gbiwgIrsgc2xpID0gJWRcbiIsCisJCSAgICAgICBpc3Jfc3RhdGlzdGljcy5zbGkpOworCW4gKz0gc2NucHJpbnRmKGJ1ZiArIG4sIFBBR0VfU0laRSAtIG4sICIqbm9uZSA9ICVkXG4iLAorCQkgICAgICAgaXNyX3N0YXRpc3RpY3Mubm9uZSk7CisJbiArPSBzY25wcmludGYoYnVmICsgbiwgUEFHRV9TSVpFIC0gbiwgIipobmRsID0gJWRcbiIsCisJCSAgICAgICBpc3Jfc3RhdGlzdGljcy5obmRsLmNudCk7CisKKwlmb3IgKGkgPSBpc3Jfc3RhdGlzdGljcy5obmRsLmlkeCwgaiA9IDA7IGogPD0gSVNSX01BU0s7IGorKywgaSsrKSB7CisJCWkgICAmPSBJU1JfTUFTSzsKKwkJaW50ciA9IGlzcl9zdGF0aXN0aWNzLmhuZGwuYnVmW2ldOworCisJCWlmIChVU0JpX1VJICAmIGludHIpCisJCQluICs9IHNjbnByaW50ZihidWYgKyBuLCBQQUdFX1NJWkUgLSBuLCAidWkgICIpOworCQlpbnRyICY9IH5VU0JpX1VJOworCQlpZiAoVVNCaV9VRUkgJiBpbnRyKQorCQkJbiArPSBzY25wcmludGYoYnVmICsgbiwgUEFHRV9TSVpFIC0gbiwgInVlaSAiKTsKKwkJaW50ciAmPSB+VVNCaV9VRUk7CisJCWlmIChVU0JpX1BDSSAmIGludHIpCisJCQluICs9IHNjbnByaW50ZihidWYgKyBuLCBQQUdFX1NJWkUgLSBuLCAicGNpICIpOworCQlpbnRyICY9IH5VU0JpX1BDSTsKKwkJaWYgKFVTQmlfVVJJICYgaW50cikKKwkJCW4gKz0gc2NucHJpbnRmKGJ1ZiArIG4sIFBBR0VfU0laRSAtIG4sICJ1cmkgIik7CisJCWludHIgJj0gflVTQmlfVVJJOworCQlpZiAoVVNCaV9TTEkgJiBpbnRyKQorCQkJbiArPSBzY25wcmludGYoYnVmICsgbiwgUEFHRV9TSVpFIC0gbiwgInNsaSAiKTsKKwkJaW50ciAmPSB+VVNCaV9TTEk7CisJCWlmIChpbnRyKQorCQkJbiArPSBzY25wcmludGYoYnVmICsgbiwgUEFHRV9TSVpFIC0gbiwgIj8/PyAiKTsKKwkJaWYgKGlzcl9zdGF0aXN0aWNzLmhuZGwuYnVmW2ldKQorCQkJbiArPSBzY25wcmludGYoYnVmICsgbiwgUEFHRV9TSVpFIC0gbiwgIlxuIik7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSh1ZGMtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiBuOworfQorCisvKioKKyAqIHN0b3JlX2ludGVyczogZW5hYmxlICYgZm9yY2Ugb3IgZGlzYWJsZSBhbiBpbmRpdmlkdWFsIGludGVycnV0cHMKKyAqICAgICAgICAgICAgICAgICAgICh0byBiZSB1c2VkIGZvciB0ZXN0IHB1cnBvc2VzIG9ubHkpCisgKgorICogQ2hlY2sgImRldmljZS5oIiBmb3IgZGV0YWlscworICovCitzdGF0aWMgc3NpemVfdCBzdG9yZV9pbnRlcnMoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgY2kxM3h4eCAqdWRjID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IGNpMTN4eHgsIGdhZGdldC5kZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgZW4sIGJpdDsKKworCWRiZ190cmFjZSgiWyVzXSAlcCwgJWRcbiIsIF9fZnVuY19fLCBidWYsIGNvdW50KTsKKwlpZiAoYXR0ciA9PSBOVUxMIHx8IGJ1ZiA9PSBOVUxMKSB7CisJCWRldl9lcnIoZGV2LCAiWyVzXSBFSU5WQUxcbiIsIF9fZnVuY19fKTsKKwkJZ290byBkb25lOworCX0KKworCWlmIChzc2NhbmYoYnVmLCAiJXUgJXUiLCAmZW4sICZiaXQpICE9IDIgfHwgZW4gPiAxKSB7CisJCWRldl9lcnIoZGV2LCAiPDF8MD4gPGJpdD46IGVuYWJsZXxkaXNhYmxlIGludGVycnVwdCIpOworCQlnb3RvIGRvbmU7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUodWRjLT5sb2NrLCBmbGFncyk7CisJaWYgKGVuKSB7CisJCWlmIChod19pbnRyX2ZvcmNlKGJpdCkpCisJCQlkZXZfZXJyKGRldiwgImludmFsaWQgYml0IG51bWJlclxuIik7CisJCWVsc2UKKwkJCWlzcl9zdGF0aXN0aWNzLnRlc3QrKzsKKwl9IGVsc2UgeworCQlpZiAoaHdfaW50cl9jbGVhcihiaXQpKQorCQkJZGV2X2VycihkZXYsICJpbnZhbGlkIGJpdCBudW1iZXJcbiIpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKHVkYy0+bG9jaywgZmxhZ3MpOworCisgZG9uZToKKwlyZXR1cm4gY291bnQ7Cit9CitzdGF0aWMgREVWSUNFX0FUVFIoaW50ZXJzLCBTX0lSVVNSIHwgU19JV1VTUiwgc2hvd19pbnRlcnMsIHN0b3JlX2ludGVycyk7CisKKy8qKgorICogc2hvd19wb3J0X3Rlc3Q6IHJlYWRzIHBvcnQgdGVzdCBtb2RlCisgKgorICogQ2hlY2sgImRldmljZS5oIiBmb3IgZGV0YWlscworICovCitzdGF0aWMgc3NpemVfdCBzaG93X3BvcnRfdGVzdChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBjaTEzeHh4ICp1ZGMgPSBjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3QgY2kxM3h4eCwgZ2FkZ2V0LmRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBtb2RlOworCisJZGJnX3RyYWNlKCJbJXNdICVwXG4iLCBfX2Z1bmNfXywgYnVmKTsKKwlpZiAoYXR0ciA9PSBOVUxMIHx8IGJ1ZiA9PSBOVUxMKSB7CisJCWRldl9lcnIoZGV2LCAiWyVzXSBFSU5WQUxcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIDA7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUodWRjLT5sb2NrLCBmbGFncyk7CisJbW9kZSA9IGh3X3BvcnRfdGVzdF9nZXQoKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKHVkYy0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHNjbnByaW50ZihidWYsIFBBR0VfU0laRSwgIm1vZGUgPSAldVxuIiwgbW9kZSk7Cit9CisKKy8qKgorICogc3RvcmVfcG9ydF90ZXN0OiB3cml0ZXMgcG9ydCB0ZXN0IG1vZGUKKyAqCisgKiBDaGVjayAiZGV2aWNlLmgiIGZvciBkZXRhaWxzCisgKi8KK3N0YXRpYyBzc2l6ZV90IHN0b3JlX3BvcnRfdGVzdChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGNpMTN4eHggKnVkYyA9IGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCBjaTEzeHh4LCBnYWRnZXQuZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIG1vZGU7CisKKwlkYmdfdHJhY2UoIlslc10gJXAsICVkXG4iLCBfX2Z1bmNfXywgYnVmLCBjb3VudCk7CisJaWYgKGF0dHIgPT0gTlVMTCB8fCBidWYgPT0gTlVMTCkgeworCQlkZXZfZXJyKGRldiwgIlslc10gRUlOVkFMXG4iLCBfX2Z1bmNfXyk7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlpZiAoc3NjYW5mKGJ1ZiwgIiV1IiwgJm1vZGUpICE9IDEpIHsKKwkJZGV2X2VycihkZXYsICI8bW9kZT46IHNldCBwb3J0IHRlc3QgbW9kZSIpOworCQlnb3RvIGRvbmU7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUodWRjLT5sb2NrLCBmbGFncyk7CisJaWYgKGh3X3BvcnRfdGVzdF9zZXQobW9kZSkpCisJCWRldl9lcnIoZGV2LCAiaW52YWxpZCBtb2RlXG4iKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKHVkYy0+bG9jaywgZmxhZ3MpOworCisgZG9uZToKKwlyZXR1cm4gY291bnQ7Cit9CitzdGF0aWMgREVWSUNFX0FUVFIocG9ydF90ZXN0LCBTX0lSVVNSIHwgU19JV1VTUiwKKwkJICAgc2hvd19wb3J0X3Rlc3QsIHN0b3JlX3BvcnRfdGVzdCk7CisKKy8qKgorICogc2hvd19xaGVhZHM6IERNQSBjb250ZW50cyBvZiBhbGwgcXVldWUgaGVhZHMKKyAqCisgKiBDaGVjayAiZGV2aWNlLmgiIGZvciBkZXRhaWxzCisgKi8KK3N0YXRpYyBzc2l6ZV90IHNob3dfcWhlYWRzKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICBjaGFyICpidWYpCit7CisJc3RydWN0IGNpMTN4eHggKnVkYyA9IGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCBjaTEzeHh4LCBnYWRnZXQuZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGksIGosIG4gPSAwOworCisJZGJnX3RyYWNlKCJbJXNdICVwXG4iLCBfX2Z1bmNfXywgYnVmKTsKKwlpZiAoYXR0ciA9PSBOVUxMIHx8IGJ1ZiA9PSBOVUxMKSB7CisJCWRldl9lcnIoZGV2LCAiWyVzXSBFSU5WQUxcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIDA7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUodWRjLT5sb2NrLCBmbGFncyk7CisJZm9yIChpID0gMDsgaSA8IGh3X2VwX21heDsgaSsrKSB7CisJCXN0cnVjdCBjaTEzeHh4X2VwICptRXAgPSAmdWRjLT5jaTEzeHh4X2VwW2ldOworCQluICs9IHNjbnByaW50ZihidWYgKyBuLCBQQUdFX1NJWkUgLSBuLAorCQkJICAgICAgICJFUD0lMDJpOiBSWD0lMDhYIFRYPSUwOFhcbiIsCisJCQkgICAgICAgaSwgKHUzMiltRXAtPnFoW1JYXS5kbWEsICh1MzIpbUVwLT5xaFtUWF0uZG1hKTsKKwkJZm9yIChqID0gMDsgaiA8IChzaXplb2Yoc3RydWN0IGNpMTN4eHhfcWgpL3NpemVvZih1MzIpKTsgaisrKSB7CisJCQluICs9IHNjbnByaW50ZihidWYgKyBuLCBQQUdFX1NJWkUgLSBuLAorCQkJCSAgICAgICAiICUwNFg6ICAgICUwOFggICAgJTA4WFxuIiwgaiwKKwkJCQkgICAgICAgKigodTMyICopbUVwLT5xaFtSWF0ucHRyICsgaiksCisJCQkJICAgICAgICooKHUzMiAqKW1FcC0+cWhbVFhdLnB0ciArIGopKTsKKwkJfQorCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKHVkYy0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIG47Cit9CitzdGF0aWMgREVWSUNFX0FUVFIocWhlYWRzLCBTX0lSVVNSLCBzaG93X3FoZWFkcywgTlVMTCk7CisKKy8qKgorICogc2hvd19yZWdpc3RlcnM6IGR1bXBzIGFsbCByZWdpc3RlcnMKKyAqCisgKiBDaGVjayAiZGV2aWNlLmgiIGZvciBkZXRhaWxzCisgKi8KK3N0YXRpYyBzc2l6ZV90IHNob3dfcmVnaXN0ZXJzKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCSAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IGNpMTN4eHggKnVkYyA9IGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCBjaTEzeHh4LCBnYWRnZXQuZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUzMiBkdW1wWzUxMl07CisJdW5zaWduZWQgaSwgaywgbiA9IDA7CisKKwlkYmdfdHJhY2UoIlslc10gJXBcbiIsIF9fZnVuY19fLCBidWYpOworCWlmIChhdHRyID09IE5VTEwgfHwgYnVmID09IE5VTEwpIHsKKwkJZGV2X2VycihkZXYsICJbJXNdIEVJTlZBTFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gMDsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSh1ZGMtPmxvY2ssIGZsYWdzKTsKKwlrID0gaHdfcmVnaXN0ZXJfcmVhZChkdW1wLCBzaXplb2YoZHVtcCkvc2l6ZW9mKHUzMikpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUodWRjLT5sb2NrLCBmbGFncyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgazsgaSsrKSB7CisJCW4gKz0gc2NucHJpbnRmKGJ1ZiArIG4sIFBBR0VfU0laRSAtIG4sCisJCQkgICAgICAgInJlZ1sweCUwNFhdID0gMHglMDhYXG4iLAorCQkJICAgICAgIGkgKiAodW5zaWduZWQpc2l6ZW9mKHUzMiksIGR1bXBbaV0pOworCX0KKworCXJldHVybiBuOworfQorCisvKioKKyAqIHN0b3JlX3JlZ2lzdGVyczogd3JpdGVzIHZhbHVlIHRvIHJlZ2lzdGVyIGFkZHJlc3MKKyAqCisgKiBDaGVjayAiZGV2aWNlLmgiIGZvciBkZXRhaWxzCisgKi8KK3N0YXRpYyBzc2l6ZV90IHN0b3JlX3JlZ2lzdGVycyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGNpMTN4eHggKnVkYyA9IGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCBjaTEzeHh4LCBnYWRnZXQuZGV2KTsKKwl1bnNpZ25lZCBsb25nIGFkZHIsIGRhdGEsIGZsYWdzOworCisJZGJnX3RyYWNlKCJbJXNdICVwLCAlZFxuIiwgX19mdW5jX18sIGJ1ZiwgY291bnQpOworCWlmIChhdHRyID09IE5VTEwgfHwgYnVmID09IE5VTEwpIHsKKwkJZGV2X2VycihkZXYsICJbJXNdIEVJTlZBTFxuIiwgX19mdW5jX18pOworCQlnb3RvIGRvbmU7CisJfQorCisJaWYgKHNzY2FuZihidWYsICIlbGkgJWxpIiwgJmFkZHIsICZkYXRhKSAhPSAyKSB7CisJCWRldl9lcnIoZGV2LCAiPGFkZHI+IDxkYXRhPjogd3JpdGUgZGF0YSB0byByZWdpc3RlciBhZGRyZXNzIik7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSh1ZGMtPmxvY2ssIGZsYWdzKTsKKwlpZiAoaHdfcmVnaXN0ZXJfd3JpdGUoYWRkciwgZGF0YSkpCisJCWRldl9lcnIoZGV2LCAiaW52YWxpZCBhZGRyZXNzIHJhbmdlXG4iKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKHVkYy0+bG9jaywgZmxhZ3MpOworCisgZG9uZToKKwlyZXR1cm4gY291bnQ7Cit9CitzdGF0aWMgREVWSUNFX0FUVFIocmVnaXN0ZXJzLCBTX0lSVVNSIHwgU19JV1VTUiwKKwkJICAgc2hvd19yZWdpc3RlcnMsIHN0b3JlX3JlZ2lzdGVycyk7CisKKy8qKgorICogc2hvd19yZXF1ZXN0czogRE1BIGNvbnRlbnRzIG9mIGFsbCByZXF1ZXN0cyBjdXJyZW50bHkgcXVldWVkIChhbGwgZW5kcHRzKQorICoKKyAqIENoZWNrICJkZXZpY2UuaCIgZm9yIGRldGFpbHMKKyAqLworc3RhdGljIHNzaXplX3Qgc2hvd19yZXF1ZXN0cyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJICAgICBjaGFyICpidWYpCit7CisJc3RydWN0IGNpMTN4eHggKnVkYyA9IGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCBjaTEzeHh4LCBnYWRnZXQuZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBsaXN0X2hlYWQgICAqcHRyID0gTlVMTDsKKwlzdHJ1Y3QgY2kxM3h4eF9yZXEgKnJlcSA9IE5VTEw7CisJdW5zaWduZWQgaSwgaiwgaywgbiA9IDAsIHFTaXplID0gc2l6ZW9mKHN0cnVjdCBjaTEzeHh4X3RkKS9zaXplb2YodTMyKTsKKworCWRiZ190cmFjZSgiWyVzXSAlcFxuIiwgX19mdW5jX18sIGJ1Zik7CisJaWYgKGF0dHIgPT0gTlVMTCB8fCBidWYgPT0gTlVMTCkgeworCQlkZXZfZXJyKGRldiwgIlslc10gRUlOVkFMXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAwOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKHVkYy0+bG9jaywgZmxhZ3MpOworCWZvciAoaSA9IDA7IGkgPCBod19lcF9tYXg7IGkrKykKKwkJZm9yIChrID0gUlg7IGsgPD0gVFg7IGsrKykKKwkJCWxpc3RfZm9yX2VhY2gocHRyLCAmdWRjLT5jaTEzeHh4X2VwW2ldLnFoW2tdLnF1ZXVlKQorCQkJeworCQkJCXJlcSA9IGxpc3RfZW50cnkocHRyLAorCQkJCQkJIHN0cnVjdCBjaTEzeHh4X3JlcSwgcXVldWUpOworCisJCQkJbiArPSBzY25wcmludGYoYnVmICsgbiwgUEFHRV9TSVpFIC0gbiwKKwkJCQkJICAgICAgICJFUD0lMDJpOiBURD0lMDhYICVzXG4iLAorCQkJCQkgICAgICAgaSwgKHUzMilyZXEtPmRtYSwKKwkJCQkJICAgICAgICgoayA9PSBSWCkgPyAiUlgiIDogIlRYIikpOworCisJCQkJZm9yIChqID0gMDsgaiA8IHFTaXplOyBqKyspCisJCQkJCW4gKz0gc2NucHJpbnRmKGJ1ZiArIG4sIFBBR0VfU0laRSAtIG4sCisJCQkJCQkgICAgICAgIiAlMDRYOiAgICAlMDhYXG4iLCBqLAorCQkJCQkJICAgICAgICooKHUzMiAqKXJlcS0+cHRyICsgaikpOworCQkJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUodWRjLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gbjsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUihyZXF1ZXN0cywgU19JUlVTUiwgc2hvd19yZXF1ZXN0cywgTlVMTCk7CisKKy8qKgorICogZGJnX2NyZWF0ZV9maWxlczogaW5pdGlhbGl6ZXMgdGhlIGF0dHJpYnV0ZSBpbnRlcmZhY2UKKyAqIEBkZXY6IGRldmljZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhbiBlcnJvciBjb2RlCisgKi8KK19fbWF5YmVfdW51c2VkIHN0YXRpYyBpbnQgZGJnX2NyZWF0ZV9maWxlcyhzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJaW50IHJldHZhbCA9IDA7CisKKwlpZiAoZGV2ID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCXJldHZhbCA9IGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9kZXZpY2UpOworCWlmIChyZXR2YWwpCisJCWdvdG8gZG9uZTsKKwlyZXR2YWwgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfZHJpdmVyKTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIHJtX2RldmljZTsKKwlyZXR2YWwgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfZXZlbnRzKTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIHJtX2RyaXZlcjsKKwlyZXR2YWwgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfaW50ZXJzKTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIHJtX2V2ZW50czsKKwlyZXR2YWwgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfcG9ydF90ZXN0KTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIHJtX2ludGVyczsKKwlyZXR2YWwgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfcWhlYWRzKTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIHJtX3BvcnRfdGVzdDsKKwlyZXR2YWwgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfcmVnaXN0ZXJzKTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIHJtX3FoZWFkczsKKwlyZXR2YWwgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfcmVxdWVzdHMpOworCWlmIChyZXR2YWwpCisJCWdvdG8gcm1fcmVnaXN0ZXJzOworCXJldHVybiAwOworCisgcm1fcmVnaXN0ZXJzOgorCWRldmljZV9yZW1vdmVfZmlsZShkZXYsICZkZXZfYXR0cl9yZWdpc3RlcnMpOworIHJtX3FoZWFkczoKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfcWhlYWRzKTsKKyBybV9wb3J0X3Rlc3Q6CisJZGV2aWNlX3JlbW92ZV9maWxlKGRldiwgJmRldl9hdHRyX3BvcnRfdGVzdCk7Cisgcm1faW50ZXJzOgorCWRldmljZV9yZW1vdmVfZmlsZShkZXYsICZkZXZfYXR0cl9pbnRlcnMpOworIHJtX2V2ZW50czoKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfZXZlbnRzKTsKKyBybV9kcml2ZXI6CisJZGV2aWNlX3JlbW92ZV9maWxlKGRldiwgJmRldl9hdHRyX2RyaXZlcik7Cisgcm1fZGV2aWNlOgorCWRldmljZV9yZW1vdmVfZmlsZShkZXYsICZkZXZfYXR0cl9kZXZpY2UpOworIGRvbmU6CisJcmV0dXJuIHJldHZhbDsKK30KKworLyoqCisgKiBkYmdfcmVtb3ZlX2ZpbGVzOiBkZXN0cm95cyB0aGUgYXR0cmlidXRlIGludGVyZmFjZQorICogQGRldjogZGV2aWNlCisgKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGFuIGVycm9yIGNvZGUKKyAqLworX19tYXliZV91bnVzZWQgc3RhdGljIGludCBkYmdfcmVtb3ZlX2ZpbGVzKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlpZiAoZGV2ID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCWRldmljZV9yZW1vdmVfZmlsZShkZXYsICZkZXZfYXR0cl9yZXF1ZXN0cyk7CisJZGV2aWNlX3JlbW92ZV9maWxlKGRldiwgJmRldl9hdHRyX3JlZ2lzdGVycyk7CisJZGV2aWNlX3JlbW92ZV9maWxlKGRldiwgJmRldl9hdHRyX3FoZWFkcyk7CisJZGV2aWNlX3JlbW92ZV9maWxlKGRldiwgJmRldl9hdHRyX3BvcnRfdGVzdCk7CisJZGV2aWNlX3JlbW92ZV9maWxlKGRldiwgJmRldl9hdHRyX2ludGVycyk7CisJZGV2aWNlX3JlbW92ZV9maWxlKGRldiwgJmRldl9hdHRyX2V2ZW50cyk7CisJZGV2aWNlX3JlbW92ZV9maWxlKGRldiwgJmRldl9hdHRyX2RyaXZlcik7CisJZGV2aWNlX3JlbW92ZV9maWxlKGRldiwgJmRldl9hdHRyX2RldmljZSk7CisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFVUSUwgYmxvY2sKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogX3VzYl9hZGRyOiBjYWxjdWxhdGVzIGVuZHBvaW50IGFkZHJlc3MgZnJvbSBkaXJlY3Rpb24gJiBudW1iZXIKKyAqIEBlcDogIGVuZHBvaW50CisgKi8KK3N0YXRpYyBpbmxpbmUgdTggX3VzYl9hZGRyKHN0cnVjdCBjaTEzeHh4X2VwICplcCkKK3sKKwlyZXR1cm4gKChlcC0+ZGlyID09IFRYKSA/IFVTQl9FTkRQT0lOVF9ESVJfTUFTSyA6IDApIHwgZXAtPm51bTsKK30KKworLyoqCisgKiBfaGFyZHdhcmVfcXVldWU6IGNvbmZpZ3VyZXMgYSByZXF1ZXN0IGF0IGhhcmR3YXJlIGxldmVsCisgKiBAZ2FkZ2V0OiBnYWRnZXQKKyAqIEBtRXA6ICAgIGVuZHBvaW50CisgKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGFuIGVycm9yIGNvZGUKKyAqLworc3RhdGljIGludCBfaGFyZHdhcmVfZW5xdWV1ZShzdHJ1Y3QgY2kxM3h4eF9lcCAqbUVwLCBzdHJ1Y3QgY2kxM3h4eF9yZXEgKm1SZXEpCit7CisJdW5zaWduZWQgaTsKKworCXRyYWNlKCIlcCwgJXAiLCBtRXAsIG1SZXEpOworCisJLyogZG9uJ3QgcXVldWUgdHdpY2UgKi8KKwlpZiAobVJlcS0+cmVxLnN0YXR1cyA9PSAtRUFMUkVBRFkpCisJCXJldHVybiAtRUFMUkVBRFk7CisKKwlpZiAoaHdfZXBfaXNfcHJpbWVkKG1FcC0+bnVtLCBtRXAtPmRpcikpCisJCXJldHVybiAtRUJVU1k7CisKKwltUmVxLT5yZXEuc3RhdHVzID0gLUVBTFJFQURZOworCisJaWYgKG1SZXEtPnJlcS5sZW5ndGggJiYgIW1SZXEtPnJlcS5kbWEpIHsKKwkJbVJlcS0+cmVxLmRtYSA9IFwKKwkJCWRtYV9tYXBfc2luZ2xlKG1FcC0+ZGV2aWNlLCBtUmVxLT5yZXEuYnVmLAorCQkJCSAgICAgICBtUmVxLT5yZXEubGVuZ3RoLCBtRXAtPmRpciA/CisJCQkJICAgICAgIERNQV9UT19ERVZJQ0UgOiBETUFfRlJPTV9ERVZJQ0UpOworCQlpZiAobVJlcS0+cmVxLmRtYSA9PSAwKQorCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJbVJlcS0+bWFwID0gMTsKKwl9CisKKwkvKgorCSAqIFREIGNvbmZpZ3VyYXRpb24KKwkgKiBUT0RPIC0gaGFuZGxlIHJlcXVlc3RzIHdoaWNoIHNwYXducyBpbnRvIHNldmVyYWwgVERzCisJICovCisJbWVtc2V0KG1SZXEtPnB0ciwgMCwgc2l6ZW9mKCptUmVxLT5wdHIpKTsKKwltUmVxLT5wdHItPm5leHQgICAgfD0gVERfVEVSTUlOQVRFOworCW1SZXEtPnB0ci0+dG9rZW4gICAgPSBtUmVxLT5yZXEubGVuZ3RoIDw8IGZmc19ucihURF9UT1RBTF9CWVRFUyk7CisJbVJlcS0+cHRyLT50b2tlbiAgICY9IFREX1RPVEFMX0JZVEVTOworCW1SZXEtPnB0ci0+dG9rZW4gICB8PSBURF9JT0M7CisJbVJlcS0+cHRyLT50b2tlbiAgIHw9IFREX1NUQVRVU19BQ1RJVkU7CisJbVJlcS0+cHRyLT5wYWdlWzBdICA9IG1SZXEtPnJlcS5kbWE7CisJZm9yIChpID0gMTsgaSA8IDU7IGkrKykKKwkJbVJlcS0+cHRyLT5wYWdlW2ldID0KKwkJCShtUmVxLT5yZXEuZG1hICsgaSAqIFBBR0VfU0laRSkgJiB+VERfUkVTRVJWRURfTUFTSzsKKworCS8qCisJICogIFFIIGNvbmZpZ3VyYXRpb24KKwkgKiAgQXQgdGhpcyBwb2ludCBpdCdzIGd1YXJhbnRlZWQgZXhjbHVzaXZlIGFjY2VzcyB0byBxaGVhZAorCSAqICAoZW5kcHQgaXMgbm90IHByaW1lZCkgc28gaXQncyBubyBuZWVkIHRvIHVzZSB0cmlwd2lyZQorCSAqLworCW1FcC0+cWhbbUVwLT5kaXJdLnB0ci0+dGQubmV4dCAgID0gbVJlcS0+ZG1hOyAgICAvKiBURVJNSU5BVEUgPSAwICovCisJbUVwLT5xaFttRXAtPmRpcl0ucHRyLT50ZC50b2tlbiAmPSB+VERfU1RBVFVTOyAgIC8qIGNsZWFyIHN0YXR1cyAqLworCWlmIChtUmVxLT5yZXEuemVybyA9PSAwKQorCQltRXAtPnFoW21FcC0+ZGlyXS5wdHItPmNhcCB8PSAgUUhfWkxUOworCWVsc2UKKwkJbUVwLT5xaFttRXAtPmRpcl0ucHRyLT5jYXAgJj0gflFIX1pMVDsKKworCXdtYigpOyAgIC8qIHN5bmNocm9uaXplIGJlZm9yZSBlcCBwcmltZSAqLworCisJcmV0dXJuIGh3X2VwX3ByaW1lKG1FcC0+bnVtLCBtRXAtPmRpciwKKwkJCSAgIG1FcC0+dHlwZSA9PSBVU0JfRU5EUE9JTlRfWEZFUl9DT05UUk9MKTsKK30KKworLyoqCisgKiBfaGFyZHdhcmVfZGVxdWV1ZTogaGFuZGxlcyBhIHJlcXVlc3QgYXQgaGFyZHdhcmUgbGV2ZWwKKyAqIEBnYWRnZXQ6IGdhZGdldAorICogQG1FcDogICAgZW5kcG9pbnQKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYW4gZXJyb3IgY29kZQorICovCitzdGF0aWMgaW50IF9oYXJkd2FyZV9kZXF1ZXVlKHN0cnVjdCBjaTEzeHh4X2VwICptRXAsIHN0cnVjdCBjaTEzeHh4X3JlcSAqbVJlcSkKK3sKKwl0cmFjZSgiJXAsICVwIiwgbUVwLCBtUmVxKTsKKworCWlmIChtUmVxLT5yZXEuc3RhdHVzICE9IC1FQUxSRUFEWSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoaHdfZXBfaXNfcHJpbWVkKG1FcC0+bnVtLCBtRXAtPmRpcikpCisJCWh3X2VwX2ZsdXNoKG1FcC0+bnVtLCBtRXAtPmRpcik7CisKKwltUmVxLT5yZXEuc3RhdHVzID0gMDsKKworCWlmIChtUmVxLT5tYXApIHsKKwkJZG1hX3VubWFwX3NpbmdsZShtRXAtPmRldmljZSwgbVJlcS0+cmVxLmRtYSwgbVJlcS0+cmVxLmxlbmd0aCwKKwkJCQkgbUVwLT5kaXIgPyBETUFfVE9fREVWSUNFIDogRE1BX0ZST01fREVWSUNFKTsKKwkJbVJlcS0+cmVxLmRtYSA9IDA7CisJCW1SZXEtPm1hcCAgICAgPSAwOworCX0KKworCW1SZXEtPnJlcS5zdGF0dXMgPSBtUmVxLT5wdHItPnRva2VuICYgVERfU1RBVFVTOworCWlmICAgICAgKChURF9TVEFUVVNfQUNUSVZFICYgbVJlcS0+cmVxLnN0YXR1cykgIT0gMCkKKwkJbVJlcS0+cmVxLnN0YXR1cyA9IC1FQ09OTlJFU0VUOworCWVsc2UgaWYgKChURF9TVEFUVVNfSEFMVEVEICYgbVJlcS0+cmVxLnN0YXR1cykgIT0gMCkKKwkJbVJlcS0+cmVxLnN0YXR1cyA9IC0xOworCWVsc2UgaWYgKChURF9TVEFUVVNfRFRfRVJSICYgbVJlcS0+cmVxLnN0YXR1cykgIT0gMCkKKwkJbVJlcS0+cmVxLnN0YXR1cyA9IC0xOworCWVsc2UgaWYgKChURF9TVEFUVVNfVFJfRVJSICYgbVJlcS0+cmVxLnN0YXR1cykgIT0gMCkKKwkJbVJlcS0+cmVxLnN0YXR1cyA9IC0xOworCisJbVJlcS0+cmVxLmFjdHVhbCAgID0gbVJlcS0+cHRyLT50b2tlbiAmIFREX1RPVEFMX0JZVEVTOworCW1SZXEtPnJlcS5hY3R1YWwgPj49IGZmc19ucihURF9UT1RBTF9CWVRFUyk7CisJbVJlcS0+cmVxLmFjdHVhbCAgID0gbVJlcS0+cmVxLmxlbmd0aCAtIG1SZXEtPnJlcS5hY3R1YWw7CisJbVJlcS0+cmVxLmFjdHVhbCAgID0gbVJlcS0+cmVxLnN0YXR1cyA/IDAgOiBtUmVxLT5yZXEuYWN0dWFsOworCisJcmV0dXJuIG1SZXEtPnJlcS5hY3R1YWw7Cit9CisKKy8qKgorICogX2VwX251a2U6IGRlcXVldWVzIGFsbCBlbmRwb2ludCByZXF1ZXN0cworICogQG1FcDogZW5kcG9pbnQKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYW4gZXJyb3IgY29kZQorICogQ2FsbGVyIG11c3QgaG9sZCBsb2NrCisgKi8KK3N0YXRpYyBpbnQgX2VwX251a2Uoc3RydWN0IGNpMTN4eHhfZXAgKm1FcCkKK19fcmVsZWFzZXMobUVwLT5sb2NrKQorX19hY3F1aXJlcyhtRXAtPmxvY2spCit7CisJdHJhY2UoIiVwIiwgbUVwKTsKKworCWlmIChtRXAgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlod19lcF9mbHVzaChtRXAtPm51bSwgbUVwLT5kaXIpOworCisJd2hpbGUgKCFsaXN0X2VtcHR5KCZtRXAtPnFoW21FcC0+ZGlyXS5xdWV1ZSkpIHsKKworCQkvKiBwb3Agb2xkZXN0IHJlcXVlc3QgKi8KKwkJc3RydWN0IGNpMTN4eHhfcmVxICptUmVxID0gXAorCQkJbGlzdF9lbnRyeShtRXAtPnFoW21FcC0+ZGlyXS5xdWV1ZS5uZXh0LAorCQkJCSAgIHN0cnVjdCBjaTEzeHh4X3JlcSwgcXVldWUpOworCQlsaXN0X2RlbF9pbml0KCZtUmVxLT5xdWV1ZSk7CisJCW1SZXEtPnJlcS5zdGF0dXMgPSAtRVNIVVRET1dOOworCisJCWlmICghbVJlcS0+cmVxLm5vX2ludGVycnVwdCAmJiBtUmVxLT5yZXEuY29tcGxldGUgIT0gTlVMTCkgeworCQkJc3Bpbl91bmxvY2sobUVwLT5sb2NrKTsKKwkJCW1SZXEtPnJlcS5jb21wbGV0ZSgmbUVwLT5lcCwgJm1SZXEtPnJlcSk7CisJCQlzcGluX2xvY2sobUVwLT5sb2NrKTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBfZ2FkZ2V0X3N0b3BfYWN0aXZpdHk6IHN0b3BzIGFsbCBVU0IgYWN0aXZpdHksIGZsdXNoZXMgJiBkaXNhYmxlcyBhbGwgZW5kcHRzCisgKiBAZ2FkZ2V0OiBnYWRnZXQKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYW4gZXJyb3IgY29kZQorICogQ2FsbGVyIG11c3QgaG9sZCBsb2NrCisgKi8KK3N0YXRpYyBpbnQgX2dhZGdldF9zdG9wX2FjdGl2aXR5KHN0cnVjdCB1c2JfZ2FkZ2V0ICpnYWRnZXQpCitfX3JlbGVhc2VzKHVkYy0+bG9jaykKK19fYWNxdWlyZXModWRjLT5sb2NrKQoreworCXN0cnVjdCB1c2JfZXAgKmVwOworCXN0cnVjdCBjaTEzeHh4ICAgICp1ZGMgPSBjb250YWluZXJfb2YoZ2FkZ2V0LCBzdHJ1Y3QgY2kxM3h4eCwgZ2FkZ2V0KTsKKwlzdHJ1Y3QgY2kxM3h4eF9lcCAqbUVwID0gY29udGFpbmVyX29mKGdhZGdldC0+ZXAwLAorCQkJCQkgICAgICBzdHJ1Y3QgY2kxM3h4eF9lcCwgZXApOworCisJdHJhY2UoIiVwIiwgZ2FkZ2V0KTsKKworCWlmIChnYWRnZXQgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzcGluX3VubG9jayh1ZGMtPmxvY2spOworCisJLyogZmx1c2ggYWxsIGVuZHBvaW50cyAqLworCWdhZGdldF9mb3JfZWFjaF9lcChlcCwgZ2FkZ2V0KSB7CisJCXVzYl9lcF9maWZvX2ZsdXNoKGVwKTsKKwl9CisJdXNiX2VwX2ZpZm9fZmx1c2goZ2FkZ2V0LT5lcDApOworCisJdWRjLT5kcml2ZXItPmRpc2Nvbm5lY3QoZ2FkZ2V0KTsKKworCS8qIG1ha2Ugc3VyZSB0byBkaXNhYmxlIGFsbCBlbmRwb2ludHMgKi8KKwlnYWRnZXRfZm9yX2VhY2hfZXAoZXAsIGdhZGdldCkgeworCQl1c2JfZXBfZGlzYWJsZShlcCk7CisJfQorCXVzYl9lcF9kaXNhYmxlKGdhZGdldC0+ZXAwKTsKKworCWlmIChtRXAtPnN0YXR1cyAhPSBOVUxMKSB7CisJCXVzYl9lcF9mcmVlX3JlcXVlc3QoZ2FkZ2V0LT5lcDAsIG1FcC0+c3RhdHVzKTsKKwkJbUVwLT5zdGF0dXMgPSBOVUxMOworCX0KKworCXNwaW5fbG9jayh1ZGMtPmxvY2spOworCisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElTUiBibG9jaworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBpc3JfcmVzZXRfaGFuZGxlcjogVVNCIHJlc2V0IGludGVycnVwdCBoYW5kbGVyCisgKiBAdWRjOiBVREMgZGV2aWNlCisgKgorICogVGhpcyBmdW5jdGlvbiByZXNldHMgVVNCIGVuZ2luZSBhZnRlciBhIGJ1cyByZXNldCBvY2N1cnJlZAorICovCitzdGF0aWMgdm9pZCBpc3JfcmVzZXRfaGFuZGxlcihzdHJ1Y3QgY2kxM3h4eCAqdWRjKQorX19yZWxlYXNlcyh1ZGMtPmxvY2spCitfX2FjcXVpcmVzKHVkYy0+bG9jaykKK3sKKwlzdHJ1Y3QgY2kxM3h4eF9lcCAqbUVwID0gJnVkYy0+Y2kxM3h4eF9lcFswXTsKKwlpbnQgcmV0dmFsOworCisJdHJhY2UoIiVwIiwgdWRjKTsKKworCWlmICh1ZGMgPT0gTlVMTCkgeworCQllcnIoIkVJTlZBTCIpOworCQlyZXR1cm47CisJfQorCisJZGJnX2V2ZW50KDB4RkYsICJCVVMgUlNUIiwgMCk7CisKKwlyZXR2YWwgPSBfZ2FkZ2V0X3N0b3BfYWN0aXZpdHkoJnVkYy0+Z2FkZ2V0KTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIGRvbmU7CisKKwlyZXR2YWwgPSBod191c2JfcmVzZXQoKTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIGRvbmU7CisKKwlzcGluX3VubG9jayh1ZGMtPmxvY2spOworCXJldHZhbCA9IHVzYl9lcF9lbmFibGUoJm1FcC0+ZXAsICZjdHJsX2VuZHB0X2Rlc2MpOworCWlmICghcmV0dmFsKSB7CisJCW1FcC0+c3RhdHVzID0gdXNiX2VwX2FsbG9jX3JlcXVlc3QoJm1FcC0+ZXAsIEdGUF9LRVJORUwpOworCQlpZiAobUVwLT5zdGF0dXMgPT0gTlVMTCkgeworCQkJdXNiX2VwX2Rpc2FibGUoJm1FcC0+ZXApOworCQkJcmV0dmFsID0gLUVOT01FTTsKKwkJfQorCX0KKwlzcGluX2xvY2sodWRjLT5sb2NrKTsKKworIGRvbmU6CisJaWYgKHJldHZhbCkKKwkJZXJyKCJlcnJvcjogJWkiLCByZXR2YWwpOworfQorCisvKioKKyAqIGlzcl9nZXRfc3RhdHVzX2NvbXBsZXRlOiBnZXRfc3RhdHVzIHJlcXVlc3QgY29tcGxldGUgZnVuY3Rpb24KKyAqIEBlcDogIGVuZHBvaW50CisgKiBAcmVxOiByZXF1ZXN0IGhhbmRsZWQKKyAqCisgKiBDYWxsZXIgbXVzdCByZWxlYXNlIGxvY2sKKyAqLworc3RhdGljIHZvaWQgaXNyX2dldF9zdGF0dXNfY29tcGxldGUoc3RydWN0IHVzYl9lcCAqZXAsIHN0cnVjdCB1c2JfcmVxdWVzdCAqcmVxKQoreworCXRyYWNlKCIlcCwgJXAiLCBlcCwgcmVxKTsKKworCWlmIChlcCA9PSBOVUxMIHx8IHJlcSA9PSBOVUxMKSB7CisJCWVycigiRUlOVkFMIik7CisJCXJldHVybjsKKwl9CisKKwlrZnJlZShyZXEtPmJ1Zik7CisJdXNiX2VwX2ZyZWVfcmVxdWVzdChlcCwgcmVxKTsKK30KKworLyoqCisgKiBpc3JfZ2V0X3N0YXR1c19yZXNwb25zZTogZ2V0X3N0YXR1cyByZXF1ZXN0IHJlc3BvbnNlCisgKiBAZXA6ICAgIGVuZHBvaW50CisgKiBAc2V0dXA6IHNldHVwIHJlcXVlc3QgcGFja2V0CisgKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGFuIGVycm9yIGNvZGUKKyAqLworc3RhdGljIGludCBpc3JfZ2V0X3N0YXR1c19yZXNwb25zZShzdHJ1Y3QgY2kxM3h4eF9lcCAqbUVwLAorCQkJCSAgIHN0cnVjdCB1c2JfY3RybHJlcXVlc3QgKnNldHVwKQorX19yZWxlYXNlcyhtRXAtPmxvY2spCitfX2FjcXVpcmVzKG1FcC0+bG9jaykKK3sKKwlzdHJ1Y3QgdXNiX3JlcXVlc3QgKnJlcSA9IE5VTEw7CisJZ2ZwX3QgZ2ZwX2ZsYWdzID0gR0ZQX0FUT01JQzsKKwlpbnQgZGlyLCBudW0sIHJldHZhbDsKKworCXRyYWNlKCIlcCwgJXAiLCBtRXAsIHNldHVwKTsKKworCWlmIChtRXAgPT0gTlVMTCB8fCBzZXR1cCA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNwaW5fdW5sb2NrKG1FcC0+bG9jayk7CisJcmVxID0gdXNiX2VwX2FsbG9jX3JlcXVlc3QoJm1FcC0+ZXAsIGdmcF9mbGFncyk7CisJc3Bpbl9sb2NrKG1FcC0+bG9jayk7CisJaWYgKHJlcSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJlcS0+Y29tcGxldGUgPSBpc3JfZ2V0X3N0YXR1c19jb21wbGV0ZTsKKwlyZXEtPmxlbmd0aCAgID0gMjsKKwlyZXEtPmJ1ZiAgICAgID0ga3phbGxvYyhyZXEtPmxlbmd0aCwgZ2ZwX2ZsYWdzKTsKKwlpZiAocmVxLT5idWYgPT0gTlVMTCkgeworCQlyZXR2YWwgPSAtRU5PTUVNOworCQlnb3RvIGVycl9mcmVlX3JlcTsKKwl9CisKKwlpZiAoKHNldHVwLT5iUmVxdWVzdFR5cGUgJiBVU0JfUkVDSVBfTUFTSykgPT0gVVNCX1JFQ0lQX0RFVklDRSkgeworCQkvKiBUT0RPOiBEMSAtIFJlbW90ZSBXYWtldXA7IEQwIC0gU2VsZiBQb3dlcmVkICovCisJCXJldHZhbCA9IDA7CisJfSBlbHNlIGlmICgoc2V0dXAtPmJSZXF1ZXN0VHlwZSAmIFVTQl9SRUNJUF9NQVNLKSBcCisJCSAgID09IFVTQl9SRUNJUF9FTkRQT0lOVCkgeworCQlkaXIgPSAobGUxNl90b19jcHUoc2V0dXAtPndJbmRleCkgJiBVU0JfRU5EUE9JTlRfRElSX01BU0spID8KKwkJCVRYIDogUlg7CisJCW51bSA9ICBsZTE2X3RvX2NwdShzZXR1cC0+d0luZGV4KSAmIFVTQl9FTkRQT0lOVF9OVU1CRVJfTUFTSzsKKwkJKigodTE2ICopcmVxLT5idWYpID0gaHdfZXBfZ2V0X2hhbHQobnVtLCBkaXIpOworCX0KKwkvKiBlbHNlIGRvIG5vdGhpbmc7IHJlc2VydmVkIGZvciBmdXR1cmUgdXNlICovCisKKwlzcGluX3VubG9jayhtRXAtPmxvY2spOworCXJldHZhbCA9IHVzYl9lcF9xdWV1ZSgmbUVwLT5lcCwgcmVxLCBnZnBfZmxhZ3MpOworCXNwaW5fbG9jayhtRXAtPmxvY2spOworCWlmIChyZXR2YWwpCisJCWdvdG8gZXJyX2ZyZWVfYnVmOworCisJcmV0dXJuIDA7CisKKyBlcnJfZnJlZV9idWY6CisJa2ZyZWUocmVxLT5idWYpOworIGVycl9mcmVlX3JlcToKKwlzcGluX3VubG9jayhtRXAtPmxvY2spOworCXVzYl9lcF9mcmVlX3JlcXVlc3QoJm1FcC0+ZXAsIHJlcSk7CisJc3Bpbl9sb2NrKG1FcC0+bG9jayk7CisJcmV0dXJuIHJldHZhbDsKK30KKworLyoqCisgKiBpc3Jfc2V0dXBfc3RhdHVzX3BoYXNlOiBxdWV1ZXMgdGhlIHN0YXR1cyBwaGFzZSBvZiBhIHNldHVwIHRyYW5zYXRpb24KKyAqIEBtRXA6IGVuZHBvaW50CisgKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGFuIGVycm9yIGNvZGUKKyAqLworc3RhdGljIGludCBpc3Jfc2V0dXBfc3RhdHVzX3BoYXNlKHN0cnVjdCBjaTEzeHh4X2VwICptRXApCitfX3JlbGVhc2VzKG1FcC0+bG9jaykKK19fYWNxdWlyZXMobUVwLT5sb2NrKQoreworCWludCByZXR2YWw7CisKKwl0cmFjZSgiJXAiLCBtRXApOworCisJLyogbUVwIGlzIGFsd2F5cyB2YWxpZCAmIGNvbmZpZ3VyZWQgKi8KKworCWlmIChtRXAtPnR5cGUgPT0gVVNCX0VORFBPSU5UX1hGRVJfQ09OVFJPTCkKKwkJbUVwLT5kaXIgPSAobUVwLT5kaXIgPT0gVFgpID8gUlggOiBUWDsKKworCW1FcC0+c3RhdHVzLT5ub19pbnRlcnJ1cHQgPSAxOworCisJc3Bpbl91bmxvY2sobUVwLT5sb2NrKTsKKwlyZXR2YWwgPSB1c2JfZXBfcXVldWUoJm1FcC0+ZXAsIG1FcC0+c3RhdHVzLCBHRlBfQVRPTUlDKTsKKwlzcGluX2xvY2sobUVwLT5sb2NrKTsKKworCXJldHVybiByZXR2YWw7Cit9CisKKy8qKgorICogaXNyX3RyX2NvbXBsZXRlX2xvdzogdHJhbnNhY3Rpb24gY29tcGxldGUgbG93IGxldmVsIGhhbmRsZXIKKyAqIEBtRXA6IGVuZHBvaW50CisgKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGFuIGVycm9yIGNvZGUKKyAqIENhbGxlciBtdXN0IGhvbGQgbG9jaworICovCitzdGF0aWMgaW50IGlzcl90cl9jb21wbGV0ZV9sb3coc3RydWN0IGNpMTN4eHhfZXAgKm1FcCkKK19fcmVsZWFzZXMobUVwLT5sb2NrKQorX19hY3F1aXJlcyhtRXAtPmxvY2spCit7CisJc3RydWN0IGNpMTN4eHhfcmVxICptUmVxOworCWludCByZXR2YWw7CisKKwl0cmFjZSgiJXAiLCBtRXApOworCisJaWYgKGxpc3RfZW1wdHkoJm1FcC0+cWhbbUVwLT5kaXJdLnF1ZXVlKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBwb3Agb2xkZXN0IHJlcXVlc3QgKi8KKwltUmVxID0gbGlzdF9lbnRyeShtRXAtPnFoW21FcC0+ZGlyXS5xdWV1ZS5uZXh0LAorCQkJICBzdHJ1Y3QgY2kxM3h4eF9yZXEsIHF1ZXVlKTsKKwlsaXN0X2RlbF9pbml0KCZtUmVxLT5xdWV1ZSk7CisKKwlyZXR2YWwgPSBfaGFyZHdhcmVfZGVxdWV1ZShtRXAsIG1SZXEpOworCWlmIChyZXR2YWwgPCAwKSB7CisJCWRiZ19ldmVudChfdXNiX2FkZHIobUVwKSwgIkRPTkUiLCByZXR2YWwpOworCQlnb3RvIGRvbmU7CisJfQorCisJZGJnX2RvbmUoX3VzYl9hZGRyKG1FcCksIG1SZXEtPnB0ci0+dG9rZW4sIHJldHZhbCk7CisKKwlpZiAoIW1SZXEtPnJlcS5ub19pbnRlcnJ1cHQgJiYgbVJlcS0+cmVxLmNvbXBsZXRlICE9IE5VTEwpIHsKKwkJc3Bpbl91bmxvY2sobUVwLT5sb2NrKTsKKwkJbVJlcS0+cmVxLmNvbXBsZXRlKCZtRXAtPmVwLCAmbVJlcS0+cmVxKTsKKwkJc3Bpbl9sb2NrKG1FcC0+bG9jayk7CisJfQorCisJaWYgKCFsaXN0X2VtcHR5KCZtRXAtPnFoW21FcC0+ZGlyXS5xdWV1ZSkpIHsKKwkJbVJlcSA9IGxpc3RfZW50cnkobUVwLT5xaFttRXAtPmRpcl0ucXVldWUubmV4dCwKKwkJCQkgIHN0cnVjdCBjaTEzeHh4X3JlcSwgcXVldWUpOworCQlfaGFyZHdhcmVfZW5xdWV1ZShtRXAsIG1SZXEpOworCX0KKworIGRvbmU6CisJcmV0dXJuIHJldHZhbDsKK30KKworLyoqCisgKiBpc3JfdHJfY29tcGxldGVfaGFuZGxlcjogdHJhbnNhY3Rpb24gY29tcGxldGUgaW50ZXJydXB0IGhhbmRsZXIKKyAqIEB1ZGM6IFVEQyBkZXNjcmlwdG9yCisgKgorICogVGhpcyBmdW5jdGlvbiBoYW5kbGVzIHRyYWZmaWMgZXZlbnRzCisgKi8KK3N0YXRpYyB2b2lkIGlzcl90cl9jb21wbGV0ZV9oYW5kbGVyKHN0cnVjdCBjaTEzeHh4ICp1ZGMpCitfX3JlbGVhc2VzKHVkYy0+bG9jaykKK19fYWNxdWlyZXModWRjLT5sb2NrKQoreworCXVuc2lnbmVkIGk7CisKKwl0cmFjZSgiJXAiLCB1ZGMpOworCisJaWYgKHVkYyA9PSBOVUxMKSB7CisJCWVycigiRUlOVkFMIik7CisJCXJldHVybjsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgaHdfZXBfbWF4OyBpKyspIHsKKwkJc3RydWN0IGNpMTN4eHhfZXAgKm1FcCAgPSAmdWRjLT5jaTEzeHh4X2VwW2ldOworCQlpbnQgdHlwZSwgbnVtLCBlcnIgPSAtRUlOVkFMOworCQlzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0IHJlcTsKKworCisJCWlmIChtRXAtPmRlc2MgPT0gTlVMTCkKKwkJCWNvbnRpbnVlOyAgIC8qIG5vdCBjb25maWd1cmVkICovCisKKwkJaWYgKChtRXAtPmRpciA9PSBSWCAmJiBod190ZXN0X2FuZF9jbGVhcl9jb21wbGV0ZShpKSkgfHwKKwkJICAgIChtRXAtPmRpciA9PSBUWCAmJiBod190ZXN0X2FuZF9jbGVhcl9jb21wbGV0ZShpICsgMTYpKSkgeworCQkJZXJyID0gaXNyX3RyX2NvbXBsZXRlX2xvdyhtRXApOworCQkJaWYgKG1FcC0+dHlwZSA9PSBVU0JfRU5EUE9JTlRfWEZFUl9DT05UUk9MKSB7CisJCQkJaWYgKGVyciA+IDApICAgLyogbmVlZHMgc3RhdHVzIHBoYXNlICovCisJCQkJCWVyciA9IGlzcl9zZXR1cF9zdGF0dXNfcGhhc2UobUVwKTsKKwkJCQlpZiAoZXJyIDwgMCkgeworCQkJCQlkYmdfZXZlbnQoX3VzYl9hZGRyKG1FcCksCisJCQkJCQkgICJFUlJPUiIsIGVycik7CisJCQkJCXNwaW5fdW5sb2NrKHVkYy0+bG9jayk7CisJCQkJCWlmICh1c2JfZXBfc2V0X2hhbHQoJm1FcC0+ZXApKQorCQkJCQkJZXJyKCJlcnJvcjogZXBfc2V0X2hhbHQiKTsKKwkJCQkJc3Bpbl9sb2NrKHVkYy0+bG9jayk7CisJCQkJfQorCQkJfQorCQl9CisKKwkJaWYgKG1FcC0+dHlwZSAhPSBVU0JfRU5EUE9JTlRfWEZFUl9DT05UUk9MIHx8CisJCSAgICAhaHdfdGVzdF9hbmRfY2xlYXJfc2V0dXBfc3RhdHVzKGkpKQorCQkJY29udGludWU7CisKKwkJaWYgKGkgIT0gMCkgeworCQkJd2FybigiY3RybCB0cmFmZmljIHJlY2VpdmVkIGF0IGVuZHBvaW50Iik7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIHJlYWRfc2V0dXBfcGFja2V0ICovCisJCWRvIHsKKwkJCWh3X3Rlc3RfYW5kX3NldF9zZXR1cF9ndWFyZCgpOworCQkJbWVtY3B5KCZyZXEsICZtRXAtPnFoW1JYXS5wdHItPnNldHVwLCBzaXplb2YocmVxKSk7CisJCX0gd2hpbGUgKCFod190ZXN0X2FuZF9jbGVhcl9zZXR1cF9ndWFyZCgpKTsKKworCQl0eXBlID0gcmVxLmJSZXF1ZXN0VHlwZTsKKworCQltRXAtPmRpciA9ICh0eXBlICYgVVNCX0RJUl9JTikgPyBUWCA6IFJYOworCisJCWRiZ19zZXR1cChfdXNiX2FkZHIobUVwKSwgJnJlcSk7CisKKwkJc3dpdGNoIChyZXEuYlJlcXVlc3QpIHsKKwkJY2FzZSBVU0JfUkVRX0NMRUFSX0ZFQVRVUkU6CisJCQlpZiAodHlwZSAhPSAoVVNCX0RJUl9PVVR8VVNCX1JFQ0lQX0VORFBPSU5UKSAmJgorCQkJICAgIGxlMTZfdG9fY3B1KHJlcS53VmFsdWUpICE9IFVTQl9FTkRQT0lOVF9IQUxUKQorCQkJCWdvdG8gZGVsZWdhdGU7CisJCQlpZiAocmVxLndMZW5ndGggIT0gMCkKKwkJCQlicmVhazsKKwkJCW51bSAgPSBsZTE2X3RvX2NwdShyZXEud0luZGV4KTsKKwkJCW51bSAmPSBVU0JfRU5EUE9JTlRfTlVNQkVSX01BU0s7CisJCQlpZiAoIXVkYy0+Y2kxM3h4eF9lcFtudW1dLndlZGdlKSB7CisJCQkJc3Bpbl91bmxvY2sodWRjLT5sb2NrKTsKKwkJCQllcnIgPSB1c2JfZXBfY2xlYXJfaGFsdCgKKwkJCQkJJnVkYy0+Y2kxM3h4eF9lcFtudW1dLmVwKTsKKwkJCQlzcGluX2xvY2sodWRjLT5sb2NrKTsKKwkJCQlpZiAoZXJyKQorCQkJCQlicmVhazsKKwkJCX0KKwkJCWVyciA9IGlzcl9zZXR1cF9zdGF0dXNfcGhhc2UobUVwKTsKKwkJCWJyZWFrOworCQljYXNlIFVTQl9SRVFfR0VUX1NUQVRVUzoKKwkJCWlmICh0eXBlICE9IChVU0JfRElSX0lOfFVTQl9SRUNJUF9ERVZJQ0UpICAgJiYKKwkJCSAgICB0eXBlICE9IChVU0JfRElSX0lOfFVTQl9SRUNJUF9FTkRQT0lOVCkgJiYKKwkJCSAgICB0eXBlICE9IChVU0JfRElSX0lOfFVTQl9SRUNJUF9JTlRFUkZBQ0UpKQorCQkJCWdvdG8gZGVsZWdhdGU7CisJCQlpZiAobGUxNl90b19jcHUocmVxLndMZW5ndGgpICE9IDIgfHwKKwkJCSAgICBsZTE2X3RvX2NwdShyZXEud1ZhbHVlKSAgIT0gMCkKKwkJCQlicmVhazsKKwkJCWVyciA9IGlzcl9nZXRfc3RhdHVzX3Jlc3BvbnNlKG1FcCwgJnJlcSk7CisJCQlicmVhazsKKwkJY2FzZSBVU0JfUkVRX1NFVF9BRERSRVNTOgorCQkJaWYgKHR5cGUgIT0gKFVTQl9ESVJfT1VUfFVTQl9SRUNJUF9ERVZJQ0UpKQorCQkJCWdvdG8gZGVsZWdhdGU7CisJCQlpZiAobGUxNl90b19jcHUocmVxLndMZW5ndGgpICE9IDAgfHwKKwkJCSAgICBsZTE2X3RvX2NwdShyZXEud0luZGV4KSAgIT0gMCkKKwkJCQlicmVhazsKKwkJCWVyciA9IGh3X3VzYl9zZXRfYWRkcmVzcygodTgpbGUxNl90b19jcHUocmVxLndWYWx1ZSkpOworCQkJaWYgKGVycikKKwkJCQlicmVhazsKKwkJCWVyciA9IGlzcl9zZXR1cF9zdGF0dXNfcGhhc2UobUVwKTsKKwkJCWJyZWFrOworCQljYXNlIFVTQl9SRVFfU0VUX0ZFQVRVUkU6CisJCQlpZiAodHlwZSAhPSAoVVNCX0RJUl9PVVR8VVNCX1JFQ0lQX0VORFBPSU5UKSAmJgorCQkJICAgIGxlMTZfdG9fY3B1KHJlcS53VmFsdWUpICE9IFVTQl9FTkRQT0lOVF9IQUxUKQorCQkJCWdvdG8gZGVsZWdhdGU7CisJCQlpZiAocmVxLndMZW5ndGggIT0gMCkKKwkJCQlicmVhazsKKwkJCW51bSAgPSBsZTE2X3RvX2NwdShyZXEud0luZGV4KTsKKwkJCW51bSAmPSBVU0JfRU5EUE9JTlRfTlVNQkVSX01BU0s7CisKKwkJCXNwaW5fdW5sb2NrKHVkYy0+bG9jayk7CisJCQllcnIgPSB1c2JfZXBfc2V0X2hhbHQoJnVkYy0+Y2kxM3h4eF9lcFtudW1dLmVwKTsKKwkJCXNwaW5fbG9jayh1ZGMtPmxvY2spOworCQkJaWYgKGVycikKKwkJCQlicmVhazsKKwkJCWVyciA9IGlzcl9zZXR1cF9zdGF0dXNfcGhhc2UobUVwKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorZGVsZWdhdGU6CisJCQlpZiAocmVxLndMZW5ndGggPT0gMCkgICAvKiBubyBkYXRhIHBoYXNlICovCisJCQkJbUVwLT5kaXIgPSBUWDsKKworCQkJc3Bpbl91bmxvY2sodWRjLT5sb2NrKTsKKwkJCWVyciA9IHVkYy0+ZHJpdmVyLT5zZXR1cCgmdWRjLT5nYWRnZXQsICZyZXEpOworCQkJc3Bpbl9sb2NrKHVkYy0+bG9jayk7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChlcnIgPCAwKSB7CisJCQlkYmdfZXZlbnQoX3VzYl9hZGRyKG1FcCksICJFUlJPUiIsIGVycik7CisKKwkJCXNwaW5fdW5sb2NrKHVkYy0+bG9jayk7CisJCQlpZiAodXNiX2VwX3NldF9oYWx0KCZtRXAtPmVwKSkKKwkJCQllcnIoImVycm9yOiBlcF9zZXRfaGFsdCIpOworCQkJc3Bpbl9sb2NrKHVkYy0+bG9jayk7CisJCX0KKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEVORFBUIGJsb2NrCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAqIGVwX2VuYWJsZTogY29uZmlndXJlIGVuZHBvaW50LCBtYWtpbmcgaXQgdXNhYmxlCisgKgorICogQ2hlY2sgdXNiX2VwX2VuYWJsZSgpIGF0ICJ1c2JfZ2FkZ2V0LmgiIGZvciBkZXRhaWxzCisgKi8KK3N0YXRpYyBpbnQgZXBfZW5hYmxlKHN0cnVjdCB1c2JfZXAgKmVwLAorCQkgICAgIGNvbnN0IHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZGVzYykKK3sKKwlzdHJ1Y3QgY2kxM3h4eF9lcCAqbUVwID0gY29udGFpbmVyX29mKGVwLCBzdHJ1Y3QgY2kxM3h4eF9lcCwgZXApOworCWludCBkaXJlY3Rpb24sIHJldHZhbCA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXRyYWNlKCIlcCwgJXAiLCBlcCwgZGVzYyk7CisKKwlpZiAoZXAgPT0gTlVMTCB8fCBkZXNjID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJc3Bpbl9sb2NrX2lycXNhdmUobUVwLT5sb2NrLCBmbGFncyk7CisKKwkvKiBvbmx5IGludGVybmFsIFNXIHNob3VsZCBlbmFibGUgY3RybCBlbmRwdHMgKi8KKworCW1FcC0+ZGVzYyA9IGRlc2M7CisKKwlpZiAoIWxpc3RfZW1wdHkoJm1FcC0+cWhbbUVwLT5kaXJdLnF1ZXVlKSkKKwkJd2FybigiZW5hYmxpbmcgYSBub24tZW1wdHkgZW5kcG9pbnQhIik7CisKKwltRXAtPmRpciAgPSAoZGVzYy0+YkVuZHBvaW50QWRkcmVzcyAmIFVTQl9FTkRQT0lOVF9ESVJfTUFTSykgPyBUWCA6IFJYOworCW1FcC0+bnVtICA9ICBkZXNjLT5iRW5kcG9pbnRBZGRyZXNzICYgVVNCX0VORFBPSU5UX05VTUJFUl9NQVNLOworCW1FcC0+dHlwZSA9ICBkZXNjLT5ibUF0dHJpYnV0ZXMgJiBVU0JfRU5EUE9JTlRfWEZFUlRZUEVfTUFTSzsKKworCW1FcC0+ZXAubWF4cGFja2V0ID0gX19jb25zdGFudF9sZTE2X3RvX2NwdShkZXNjLT53TWF4UGFja2V0U2l6ZSk7CisKKwlkaXJlY3Rpb24gPSBtRXAtPmRpcjsKKwlkbyB7CisJCWRiZ19ldmVudChfdXNiX2FkZHIobUVwKSwgIkVOQUJMRSIsIDApOworCisJCWlmIChtRXAtPnR5cGUgPT0gVVNCX0VORFBPSU5UX1hGRVJfQ09OVFJPTCkKKwkJCW1FcC0+cWhbbUVwLT5kaXJdLnB0ci0+Y2FwIHw9ICBRSF9JT1M7CisJCWVsc2UgaWYgKG1FcC0+dHlwZSA9PSBVU0JfRU5EUE9JTlRfWEZFUl9JU09DKQorCQkJbUVwLT5xaFttRXAtPmRpcl0ucHRyLT5jYXAgJj0gflFIX01VTFQ7CisJCWVsc2UKKwkJCW1FcC0+cWhbbUVwLT5kaXJdLnB0ci0+Y2FwICY9IH5RSF9aTFQ7CisKKwkJbUVwLT5xaFttRXAtPmRpcl0ucHRyLT5jYXAgfD0KKwkJCShtRXAtPmVwLm1heHBhY2tldCA8PCBmZnNfbnIoUUhfTUFYX1BLVCkpICYgUUhfTUFYX1BLVDsKKwkJbUVwLT5xaFttRXAtPmRpcl0ucHRyLT50ZC5uZXh0IHw9IFREX1RFUk1JTkFURTsgICAvKiBuZWVkZWQ/ICovCisKKwkJcmV0dmFsIHw9IGh3X2VwX2VuYWJsZShtRXAtPm51bSwgbUVwLT5kaXIsIG1FcC0+dHlwZSk7CisKKwkJaWYgKG1FcC0+dHlwZSA9PSBVU0JfRU5EUE9JTlRfWEZFUl9DT05UUk9MKQorCQkJbUVwLT5kaXIgPSAobUVwLT5kaXIgPT0gVFgpID8gUlggOiBUWDsKKworCX0gd2hpbGUgKG1FcC0+ZGlyICE9IGRpcmVjdGlvbik7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKG1FcC0+bG9jaywgZmxhZ3MpOworCXJldHVybiByZXR2YWw7Cit9CisKKy8qKgorICogZXBfZGlzYWJsZTogZW5kcG9pbnQgaXMgbm8gbG9uZ2VyIHVzYWJsZQorICoKKyAqIENoZWNrIHVzYl9lcF9kaXNhYmxlKCkgYXQgInVzYl9nYWRnZXQuaCIgZm9yIGRldGFpbHMKKyAqLworc3RhdGljIGludCBlcF9kaXNhYmxlKHN0cnVjdCB1c2JfZXAgKmVwKQoreworCXN0cnVjdCBjaTEzeHh4X2VwICptRXAgPSBjb250YWluZXJfb2YoZXAsIHN0cnVjdCBjaTEzeHh4X2VwLCBlcCk7CisJaW50IGRpcmVjdGlvbiwgcmV0dmFsID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJdHJhY2UoIiVwIiwgZXApOworCisJaWYgKGVwID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCWVsc2UgaWYgKG1FcC0+ZGVzYyA9PSBOVUxMKQorCQlyZXR1cm4gLUVCVVNZOworCisJc3Bpbl9sb2NrX2lycXNhdmUobUVwLT5sb2NrLCBmbGFncyk7CisKKwkvKiBvbmx5IGludGVybmFsIFNXIHNob3VsZCBkaXNhYmxlIGN0cmwgZW5kcHRzICovCisKKwlkaXJlY3Rpb24gPSBtRXAtPmRpcjsKKwlkbyB7CisJCWRiZ19ldmVudChfdXNiX2FkZHIobUVwKSwgIkRJU0FCTEUiLCAwKTsKKworCQlyZXR2YWwgfD0gX2VwX251a2UobUVwKTsKKwkJcmV0dmFsIHw9IGh3X2VwX2Rpc2FibGUobUVwLT5udW0sIG1FcC0+ZGlyKTsKKworCQlpZiAobUVwLT50eXBlID09IFVTQl9FTkRQT0lOVF9YRkVSX0NPTlRST0wpCisJCQltRXAtPmRpciA9IChtRXAtPmRpciA9PSBUWCkgPyBSWCA6IFRYOworCisJfSB3aGlsZSAobUVwLT5kaXIgIT0gZGlyZWN0aW9uKTsKKworCW1FcC0+ZGVzYyA9IE5VTEw7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKG1FcC0+bG9jaywgZmxhZ3MpOworCXJldHVybiByZXR2YWw7Cit9CisKKy8qKgorICogZXBfYWxsb2NfcmVxdWVzdDogYWxsb2NhdGUgYSByZXF1ZXN0IG9iamVjdCB0byB1c2Ugd2l0aCB0aGlzIGVuZHBvaW50CisgKgorICogQ2hlY2sgdXNiX2VwX2FsbG9jX3JlcXVlc3QoKSBhdCAidXNiX2dhZGdldC5oIiBmb3IgZGV0YWlscworICovCitzdGF0aWMgc3RydWN0IHVzYl9yZXF1ZXN0ICplcF9hbGxvY19yZXF1ZXN0KHN0cnVjdCB1c2JfZXAgKmVwLCBnZnBfdCBnZnBfZmxhZ3MpCit7CisJc3RydWN0IGNpMTN4eHhfZXAgICptRXAgID0gY29udGFpbmVyX29mKGVwLCBzdHJ1Y3QgY2kxM3h4eF9lcCwgZXApOworCXN0cnVjdCBjaTEzeHh4X3JlcSAqbVJlcSA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXRyYWNlKCIlcCwgJWkiLCBlcCwgZ2ZwX2ZsYWdzKTsKKworCWlmIChlcCA9PSBOVUxMKSB7CisJCWVycigiRUlOVkFMIik7CisJCXJldHVybiBOVUxMOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKG1FcC0+bG9jaywgZmxhZ3MpOworCisJbVJlcSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBjaTEzeHh4X3JlcSksIGdmcF9mbGFncyk7CisJaWYgKG1SZXEgIT0gTlVMTCkgeworCQlJTklUX0xJU1RfSEVBRCgmbVJlcS0+cXVldWUpOworCisJCW1SZXEtPnB0ciA9IGRtYV9wb29sX2FsbG9jKG1FcC0+dGRfcG9vbCwgZ2ZwX2ZsYWdzLAorCQkJCQkgICAmbVJlcS0+ZG1hKTsKKwkJaWYgKG1SZXEtPnB0ciA9PSBOVUxMKSB7CisJCQlrZnJlZShtUmVxKTsKKwkJCW1SZXEgPSBOVUxMOworCQl9CisJfQorCisJZGJnX2V2ZW50KF91c2JfYWRkcihtRXApLCAiQUxMT0MiLCBtUmVxID09IE5VTEwpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShtRXAtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiAobVJlcSA9PSBOVUxMKSA/IE5VTEwgOiAmbVJlcS0+cmVxOworfQorCisvKioKKyAqIGVwX2ZyZWVfcmVxdWVzdDogZnJlZXMgYSByZXF1ZXN0IG9iamVjdAorICoKKyAqIENoZWNrIHVzYl9lcF9mcmVlX3JlcXVlc3QoKSBhdCAidXNiX2dhZGdldC5oIiBmb3IgZGV0YWlscworICovCitzdGF0aWMgdm9pZCBlcF9mcmVlX3JlcXVlc3Qoc3RydWN0IHVzYl9lcCAqZXAsIHN0cnVjdCB1c2JfcmVxdWVzdCAqcmVxKQoreworCXN0cnVjdCBjaTEzeHh4X2VwICAqbUVwICA9IGNvbnRhaW5lcl9vZihlcCwgIHN0cnVjdCBjaTEzeHh4X2VwLCBlcCk7CisJc3RydWN0IGNpMTN4eHhfcmVxICptUmVxID0gY29udGFpbmVyX29mKHJlcSwgc3RydWN0IGNpMTN4eHhfcmVxLCByZXEpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwl0cmFjZSgiJXAsICVwIiwgZXAsIHJlcSk7CisKKwlpZiAoZXAgPT0gTlVMTCB8fCByZXEgPT0gTlVMTCkgeworCQllcnIoIkVJTlZBTCIpOworCQlyZXR1cm47CisJfSBlbHNlIGlmICghbGlzdF9lbXB0eSgmbVJlcS0+cXVldWUpKSB7CisJCWVycigiRUJVU1kiKTsKKwkJcmV0dXJuOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKG1FcC0+bG9jaywgZmxhZ3MpOworCisJaWYgKG1SZXEtPnB0cikKKwkJZG1hX3Bvb2xfZnJlZShtRXAtPnRkX3Bvb2wsIG1SZXEtPnB0ciwgbVJlcS0+ZG1hKTsKKwlrZnJlZShtUmVxKTsKKworCWRiZ19ldmVudChfdXNiX2FkZHIobUVwKSwgIkZSRUUiLCAwKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUobUVwLT5sb2NrLCBmbGFncyk7Cit9CisKKy8qKgorICogZXBfcXVldWU6IHF1ZXVlcyAoc3VibWl0cykgYW4gSS9PIHJlcXVlc3QgdG8gYW4gZW5kcG9pbnQKKyAqCisgKiBDaGVjayB1c2JfZXBfcXVldWUoKSogYXQgdXNiX2dhZGdldC5oIiBmb3IgZGV0YWlscworICovCitzdGF0aWMgaW50IGVwX3F1ZXVlKHN0cnVjdCB1c2JfZXAgKmVwLCBzdHJ1Y3QgdXNiX3JlcXVlc3QgKnJlcSwKKwkJICAgIGdmcF90IF9fbWF5YmVfdW51c2VkIGdmcF9mbGFncykKK3sKKwlzdHJ1Y3QgY2kxM3h4eF9lcCAgKm1FcCAgPSBjb250YWluZXJfb2YoZXAsICBzdHJ1Y3QgY2kxM3h4eF9lcCwgZXApOworCXN0cnVjdCBjaTEzeHh4X3JlcSAqbVJlcSA9IGNvbnRhaW5lcl9vZihyZXEsIHN0cnVjdCBjaTEzeHh4X3JlcSwgcmVxKTsKKwlpbnQgcmV0dmFsID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJdHJhY2UoIiVwLCAlcCwgJVgiLCBlcCwgcmVxLCBnZnBfZmxhZ3MpOworCisJaWYgKGVwID09IE5VTEwgfHwgcmVxID09IE5VTEwgfHwgbUVwLT5kZXNjID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJc3Bpbl9sb2NrX2lycXNhdmUobUVwLT5sb2NrLCBmbGFncyk7CisKKwlpZiAobUVwLT50eXBlID09IFVTQl9FTkRQT0lOVF9YRkVSX0NPTlRST0wgJiYKKwkgICAgIWxpc3RfZW1wdHkoJm1FcC0+cWhbbUVwLT5kaXJdLnF1ZXVlKSkgeworCQlfZXBfbnVrZShtRXApOworCQlyZXR2YWwgPSAtRU9WRVJGTE9XOworCQl3YXJuKCJlbmRwb2ludCBjdHJsICVYIG51a2VkIiwgX3VzYl9hZGRyKG1FcCkpOworCX0KKworCS8qIGZpcnN0IG51a2UgdGhlbiB0ZXN0IGxpbmssIGUuZy4gcHJldmlvdXMgc3RhdHVzIGhhcyBub3Qgc2VudCAqLworCWlmICghbGlzdF9lbXB0eSgmbVJlcS0+cXVldWUpKSB7CisJCXJldHZhbCA9IC1FQlVTWTsKKwkJZXJyKCJyZXF1ZXN0IGFscmVhZHkgaW4gcXVldWUiKTsKKwkJZ290byBkb25lOworCX0KKworCWlmIChyZXEtPmxlbmd0aCA+ICg0ICogUEFHRV9TSVpFKSkgeworCQlyZXEtPmxlbmd0aCA9ICg0ICogUEFHRV9TSVpFKTsKKwkJcmV0dmFsID0gLUVNU0dTSVpFOworCQl3YXJuKCJyZXF1ZXN0IGxlbmd0aCB0cnVuY2F0ZWQiKTsKKwl9CisKKwlkYmdfcXVldWUoX3VzYl9hZGRyKG1FcCksIHJlcSwgcmV0dmFsKTsKKworCS8qIHB1c2ggcmVxdWVzdCAqLworCW1SZXEtPnJlcS5zdGF0dXMgPSAtRUlOUFJPR1JFU1M7CisJbVJlcS0+cmVxLmFjdHVhbCA9IDA7CisJbGlzdF9hZGRfdGFpbCgmbVJlcS0+cXVldWUsICZtRXAtPnFoW21FcC0+ZGlyXS5xdWV1ZSk7CisKKwlyZXR2YWwgPSBfaGFyZHdhcmVfZW5xdWV1ZShtRXAsIG1SZXEpOworCWlmIChyZXR2YWwgPT0gLUVBTFJFQURZIHx8IHJldHZhbCA9PSAtRUJVU1kpIHsKKwkJZGJnX2V2ZW50KF91c2JfYWRkcihtRXApLCAiUVVFVUUiLCByZXR2YWwpOworCQlyZXR2YWwgPSAwOworCX0KKworIGRvbmU6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShtRXAtPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKioKKyAqIGVwX2RlcXVldWU6IGRlcXVldWVzIChjYW5jZWxzLCB1bmxpbmtzKSBhbiBJL08gcmVxdWVzdCBmcm9tIGFuIGVuZHBvaW50CisgKgorICogQ2hlY2sgdXNiX2VwX2RlcXVldWUoKSBhdCAidXNiX2dhZGdldC5oIiBmb3IgZGV0YWlscworICovCitzdGF0aWMgaW50IGVwX2RlcXVldWUoc3RydWN0IHVzYl9lcCAqZXAsIHN0cnVjdCB1c2JfcmVxdWVzdCAqcmVxKQoreworCXN0cnVjdCBjaTEzeHh4X2VwICAqbUVwICA9IGNvbnRhaW5lcl9vZihlcCwgIHN0cnVjdCBjaTEzeHh4X2VwLCBlcCk7CisJc3RydWN0IGNpMTN4eHhfcmVxICptUmVxID0gY29udGFpbmVyX29mKHJlcSwgc3RydWN0IGNpMTN4eHhfcmVxLCByZXEpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwl0cmFjZSgiJXAsICVwIiwgZXAsIHJlcSk7CisKKwlpZiAoZXAgPT0gTlVMTCB8fCByZXEgPT0gTlVMTCB8fCBtRXAtPmRlc2MgPT0gTlVMTCB8fAorCSAgICBsaXN0X2VtcHR5KCZtUmVxLT5xdWV1ZSkgIHx8IGxpc3RfZW1wdHkoJm1FcC0+cWhbbUVwLT5kaXJdLnF1ZXVlKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzcGluX2xvY2tfaXJxc2F2ZShtRXAtPmxvY2ssIGZsYWdzKTsKKworCWRiZ19ldmVudChfdXNiX2FkZHIobUVwKSwgIkRFUVVFVUUiLCAwKTsKKworCWlmIChtUmVxLT5yZXEuc3RhdHVzID09IC1FQUxSRUFEWSkKKwkJX2hhcmR3YXJlX2RlcXVldWUobUVwLCBtUmVxKTsKKworCS8qIHBvcCByZXF1ZXN0ICovCisJbGlzdF9kZWxfaW5pdCgmbVJlcS0+cXVldWUpOworCXJlcS0+c3RhdHVzID0gLUVDT05OUkVTRVQ7CisKKwlpZiAoIW1SZXEtPnJlcS5ub19pbnRlcnJ1cHQgJiYgbVJlcS0+cmVxLmNvbXBsZXRlICE9IE5VTEwpIHsKKwkJc3Bpbl91bmxvY2sobUVwLT5sb2NrKTsKKwkJbVJlcS0+cmVxLmNvbXBsZXRlKCZtRXAtPmVwLCAmbVJlcS0+cmVxKTsKKwkJc3Bpbl9sb2NrKG1FcC0+bG9jayk7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShtRXAtPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBlcF9zZXRfaGFsdDogc2V0cyB0aGUgZW5kcG9pbnQgaGFsdCBmZWF0dXJlCisgKgorICogQ2hlY2sgdXNiX2VwX3NldF9oYWx0KCkgYXQgInVzYl9nYWRnZXQuaCIgZm9yIGRldGFpbHMKKyAqLworc3RhdGljIGludCBlcF9zZXRfaGFsdChzdHJ1Y3QgdXNiX2VwICplcCwgaW50IHZhbHVlKQoreworCXN0cnVjdCBjaTEzeHh4X2VwICptRXAgPSBjb250YWluZXJfb2YoZXAsIHN0cnVjdCBjaTEzeHh4X2VwLCBlcCk7CisJaW50IGRpcmVjdGlvbiwgcmV0dmFsID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJdHJhY2UoIiVwLCAlaSIsIGVwLCB2YWx1ZSk7CisKKwlpZiAoZXAgPT0gTlVMTCB8fCBtRXAtPmRlc2MgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzcGluX2xvY2tfaXJxc2F2ZShtRXAtPmxvY2ssIGZsYWdzKTsKKworI2lmbmRlZiBTVEFMTF9JTgorCS8qIGdfZmlsZV9zdG9yYWdlIE1TIGNvbXBsaWFudCBidXQgZ196ZXJvIGZhaWxzIGNoYXB0ZXIgOSBjb21wbGlhbmNlICovCisJaWYgKHZhbHVlICYmIG1FcC0+dHlwZSA9PSBVU0JfRU5EUE9JTlRfWEZFUl9CVUxLICYmIG1FcC0+ZGlyID09IFRYICYmCisJICAgICFsaXN0X2VtcHR5KCZtRXAtPnFoW21FcC0+ZGlyXS5xdWV1ZSkpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShtRXAtPmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIC1FQUdBSU47CisJfQorI2VuZGlmCisKKwlkaXJlY3Rpb24gPSBtRXAtPmRpcjsKKwlkbyB7CisJCWRiZ19ldmVudChfdXNiX2FkZHIobUVwKSwgIkhBTFQiLCB2YWx1ZSk7CisJCXJldHZhbCB8PSBod19lcF9zZXRfaGFsdChtRXAtPm51bSwgbUVwLT5kaXIsIHZhbHVlKTsKKworCQlpZiAoIXZhbHVlKQorCQkJbUVwLT53ZWRnZSA9IDA7CisKKwkJaWYgKG1FcC0+dHlwZSA9PSBVU0JfRU5EUE9JTlRfWEZFUl9DT05UUk9MKQorCQkJbUVwLT5kaXIgPSAobUVwLT5kaXIgPT0gVFgpID8gUlggOiBUWDsKKworCX0gd2hpbGUgKG1FcC0+ZGlyICE9IGRpcmVjdGlvbik7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKG1FcC0+bG9jaywgZmxhZ3MpOworCXJldHVybiByZXR2YWw7Cit9CisKKy8qKgorICogZXBfc2V0X3dlZGdlOiBzZXRzIHRoZSBoYWx0IGZlYXR1cmUgYW5kIGlnbm9yZXMgY2xlYXIgcmVxdWVzdHMKKyAqCisgKiBDaGVjayB1c2JfZXBfc2V0X3dlZGdlKCkgYXQgInVzYl9nYWRnZXQuaCIgZm9yIGRldGFpbHMKKyAqLworc3RhdGljIGludCBlcF9zZXRfd2VkZ2Uoc3RydWN0IHVzYl9lcCAqZXApCit7CisJc3RydWN0IGNpMTN4eHhfZXAgKm1FcCA9IGNvbnRhaW5lcl9vZihlcCwgc3RydWN0IGNpMTN4eHhfZXAsIGVwKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJdHJhY2UoIiVwIiwgZXApOworCisJaWYgKGVwID09IE5VTEwgfHwgbUVwLT5kZXNjID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJc3Bpbl9sb2NrX2lycXNhdmUobUVwLT5sb2NrLCBmbGFncyk7CisKKwlkYmdfZXZlbnQoX3VzYl9hZGRyKG1FcCksICJXRURHRSIsIDApOworCW1FcC0+d2VkZ2UgPSAxOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShtRXAtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiB1c2JfZXBfc2V0X2hhbHQoZXApOworfQorCisvKioKKyAqIGVwX2ZpZm9fZmx1c2g6IGZsdXNoZXMgY29udGVudHMgb2YgYSBmaWZvCisgKgorICogQ2hlY2sgdXNiX2VwX2ZpZm9fZmx1c2goKSBhdCAidXNiX2dhZGdldC5oIiBmb3IgZGV0YWlscworICovCitzdGF0aWMgdm9pZCBlcF9maWZvX2ZsdXNoKHN0cnVjdCB1c2JfZXAgKmVwKQoreworCXN0cnVjdCBjaTEzeHh4X2VwICptRXAgPSBjb250YWluZXJfb2YoZXAsIHN0cnVjdCBjaTEzeHh4X2VwLCBlcCk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXRyYWNlKCIlcCIsIGVwKTsKKworCWlmIChlcCA9PSBOVUxMKSB7CisJCWVycigiJTAyWDogLUVJTlZBTCIsIF91c2JfYWRkcihtRXApKTsKKwkJcmV0dXJuOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKG1FcC0+bG9jaywgZmxhZ3MpOworCisJZGJnX2V2ZW50KF91c2JfYWRkcihtRXApLCAiRkZMVVNIIiwgMCk7CisJaHdfZXBfZmx1c2gobUVwLT5udW0sIG1FcC0+ZGlyKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUobUVwLT5sb2NrLCBmbGFncyk7Cit9CisKKy8qKgorICogRW5kcG9pbnQtc3BlY2lmaWMgcGFydCBvZiB0aGUgQVBJIHRvIHRoZSBVU0IgY29udHJvbGxlciBoYXJkd2FyZQorICogQ2hlY2sgInVzYl9nYWRnZXQuaCIgZm9yIGRldGFpbHMKKyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCB1c2JfZXBfb3BzIHVzYl9lcF9vcHMgPSB7CisJLmVuYWJsZQkgICAgICAgPSBlcF9lbmFibGUsCisJLmRpc2FibGUgICAgICAgPSBlcF9kaXNhYmxlLAorCS5hbGxvY19yZXF1ZXN0ID0gZXBfYWxsb2NfcmVxdWVzdCwKKwkuZnJlZV9yZXF1ZXN0ICA9IGVwX2ZyZWVfcmVxdWVzdCwKKwkucXVldWUJICAgICAgID0gZXBfcXVldWUsCisJLmRlcXVldWUgICAgICAgPSBlcF9kZXF1ZXVlLAorCS5zZXRfaGFsdCAgICAgID0gZXBfc2V0X2hhbHQsCisJLnNldF93ZWRnZSAgICAgPSBlcF9zZXRfd2VkZ2UsCisJLmZpZm9fZmx1c2ggICAgPSBlcF9maWZvX2ZsdXNoLAorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogR0FER0VUIGJsb2NrCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAqIERldmljZSBvcGVyYXRpb25zIHBhcnQgb2YgdGhlIEFQSSB0byB0aGUgVVNCIGNvbnRyb2xsZXIgaGFyZHdhcmUsCisgKiB3aGljaCBkb24ndCBpbnZvbHZlIGVuZHBvaW50cyAob3IgaS9vKQorICogQ2hlY2sgICJ1c2JfZ2FkZ2V0LmgiIGZvciBkZXRhaWxzCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdXNiX2dhZGdldF9vcHMgdXNiX2dhZGdldF9vcHM7CisKKy8qKgorICogdXNiX2dhZGdldF9yZWdpc3Rlcl9kcml2ZXI6IHJlZ2lzdGVyIGEgZ2FkZ2V0IGRyaXZlcgorICoKKyAqIENoZWNrIHVzYl9nYWRnZXRfcmVnaXN0ZXJfZHJpdmVyKCkgYXQgInVzYl9nYWRnZXQuaCIgZm9yIGRldGFpbHMKKyAqIEludGVycnVwdHMgYXJlIGVuYWJsZWQgaGVyZQorICovCitpbnQgdXNiX2dhZGdldF9yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IHVzYl9nYWRnZXRfZHJpdmVyICpkcml2ZXIpCit7CisJc3RydWN0IGNpMTN4eHggKnVkYyA9IF91ZGM7CisJdW5zaWduZWQgbG9uZyBpLCBrLCBmbGFnczsKKwlpbnQgcmV0dmFsID0gLUVOT01FTTsKKworCXRyYWNlKCIlcCIsIGRyaXZlcik7CisKKwlpZiAoZHJpdmVyICAgICAgICAgICAgID09IE5VTEwgfHwKKwkgICAgZHJpdmVyLT5iaW5kICAgICAgID09IE5VTEwgfHwKKwkgICAgZHJpdmVyLT51bmJpbmQgICAgID09IE5VTEwgfHwKKwkgICAgZHJpdmVyLT5zZXR1cCAgICAgID09IE5VTEwgfHwKKwkgICAgZHJpdmVyLT5kaXNjb25uZWN0ID09IE5VTEwgfHwKKwkgICAgZHJpdmVyLT5zdXNwZW5kICAgID09IE5VTEwgfHwKKwkgICAgZHJpdmVyLT5yZXN1bWUgICAgID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCWVsc2UgaWYgKHVkYyAgICAgICAgID09IE5VTEwpCisJCXJldHVybiAtRU5PREVWOworCWVsc2UgaWYgKHVkYy0+ZHJpdmVyICE9IE5VTEwpCisJCXJldHVybiAtRUJVU1k7CisKKwkvKiBhbGxvYyByZXNvdXJjZXMgKi8KKwl1ZGMtPnFoX3Bvb2wgPSBkbWFfcG9vbF9jcmVhdGUoImNpMTN4eHhfcWgiLCAmdWRjLT5nYWRnZXQuZGV2LAorCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IGNpMTN4eHhfcWgpLAorCQkJCSAgICAgICA2NCwgUEFHRV9TSVpFKTsKKwlpZiAodWRjLT5xaF9wb29sID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJdWRjLT50ZF9wb29sID0gZG1hX3Bvb2xfY3JlYXRlKCJjaTEzeHh4X3RkIiwgJnVkYy0+Z2FkZ2V0LmRldiwKKwkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBjaTEzeHh4X3RkKSwKKwkJCQkgICAgICAgNjQsIFBBR0VfU0laRSk7CisJaWYgKHVkYy0+dGRfcG9vbCA9PSBOVUxMKSB7CisJCWRtYV9wb29sX2Rlc3Ryb3kodWRjLT5xaF9wb29sKTsKKwkJdWRjLT5xaF9wb29sID0gTlVMTDsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUodWRjLT5sb2NrLCBmbGFncyk7CisKKwlpbmZvKCJod19lcF9tYXggPSAlZCIsIGh3X2VwX21heCk7CisKKwl1ZGMtPmRyaXZlciA9IGRyaXZlcjsKKwl1ZGMtPmdhZGdldC5vcHMgICAgICAgID0gTlVMTDsKKwl1ZGMtPmdhZGdldC5kZXYuZHJpdmVyID0gTlVMTDsKKworCXJldHZhbCA9IDA7CisJZm9yIChpID0gMDsgaSA8IGh3X2VwX21heDsgaSsrKSB7CisJCXN0cnVjdCBjaTEzeHh4X2VwICptRXAgPSAmdWRjLT5jaTEzeHh4X2VwW2ldOworCisJCXNjbnByaW50ZihtRXAtPm5hbWUsIHNpemVvZihtRXAtPm5hbWUpLCAiZXAlaSIsIChpbnQpaSk7CisKKwkJbUVwLT5sb2NrICAgICAgICAgPSB1ZGMtPmxvY2s7CisJCW1FcC0+ZGV2aWNlICAgICAgID0gJnVkYy0+Z2FkZ2V0LmRldjsKKwkJbUVwLT50ZF9wb29sICAgICAgPSB1ZGMtPnRkX3Bvb2w7CisKKwkJbUVwLT5lcC5uYW1lICAgICAgPSBtRXAtPm5hbWU7CisJCW1FcC0+ZXAub3BzICAgICAgID0gJnVzYl9lcF9vcHM7CisJCW1FcC0+ZXAubWF4cGFja2V0ID0gQ1RSTF9QQVlMT0FEX01BWDsKKworCQkvKiB0aGlzIGFsbG9jYXRpb24gY2Fubm90IGJlIHJhbmRvbSAqLworCQlmb3IgKGsgPSBSWDsgayA8PSBUWDsgaysrKSB7CisJCQlJTklUX0xJU1RfSEVBRCgmbUVwLT5xaFtrXS5xdWV1ZSk7CisJCQltRXAtPnFoW2tdLnB0ciA9IGRtYV9wb29sX2FsbG9jKHVkYy0+cWhfcG9vbCwKKwkJCQkJCQlHRlBfS0VSTkVMLAorCQkJCQkJCSZtRXAtPnFoW2tdLmRtYSk7CisJCQlpZiAobUVwLT5xaFtrXS5wdHIgPT0gTlVMTCkKKwkJCQlyZXR2YWwgPSAtRU5PTUVNOworCQkJZWxzZQorCQkJCW1lbXNldChtRXAtPnFoW2tdLnB0ciwgMCwKKwkJCQkgICAgICAgc2l6ZW9mKCptRXAtPnFoW2tdLnB0cikpOworCQl9CisJCWlmIChpID09IDApCisJCQl1ZGMtPmdhZGdldC5lcDAgPSAmbUVwLT5lcDsKKwkJZWxzZQorCQkJbGlzdF9hZGRfdGFpbCgmbUVwLT5lcC5lcF9saXN0LCAmdWRjLT5nYWRnZXQuZXBfbGlzdCk7CisJfQorCWlmIChyZXR2YWwpCisJCWdvdG8gZG9uZTsKKworCS8qIGJpbmQgZ2FkZ2V0ICovCisJZHJpdmVyLT5kcml2ZXIuYnVzICAgICA9IE5VTEw7CisJdWRjLT5nYWRnZXQub3BzICAgICAgICA9ICZ1c2JfZ2FkZ2V0X29wczsKKwl1ZGMtPmdhZGdldC5kZXYuZHJpdmVyID0gJmRyaXZlci0+ZHJpdmVyOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSh1ZGMtPmxvY2ssIGZsYWdzKTsKKwlyZXR2YWwgPSBkcml2ZXItPmJpbmQoJnVkYy0+Z2FkZ2V0KTsgICAgICAgICAgICAgICAgLyogTUFZIFNMRUVQICovCisJc3Bpbl9sb2NrX2lycXNhdmUodWRjLT5sb2NrLCBmbGFncyk7CisKKwlpZiAocmV0dmFsKSB7CisJCXVkYy0+Z2FkZ2V0Lm9wcyAgICAgICAgPSBOVUxMOworCQl1ZGMtPmdhZGdldC5kZXYuZHJpdmVyID0gTlVMTDsKKwkJZ290byBkb25lOworCX0KKworCXJldHZhbCA9IGh3X2RldmljZV9zdGF0ZSh1ZGMtPmNpMTN4eHhfZXBbMF0ucWhbUlhdLmRtYSk7CisKKyBkb25lOgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUodWRjLT5sb2NrLCBmbGFncyk7CisJaWYgKHJldHZhbCkKKwkJdXNiX2dhZGdldF91bnJlZ2lzdGVyX2RyaXZlcihkcml2ZXIpOworCXJldHVybiByZXR2YWw7Cit9CitFWFBPUlRfU1lNQk9MKHVzYl9nYWRnZXRfcmVnaXN0ZXJfZHJpdmVyKTsKKworLyoqCisgKiB1c2JfZ2FkZ2V0X3VucmVnaXN0ZXJfZHJpdmVyOiB1bnJlZ2lzdGVyIGEgZ2FkZ2V0IGRyaXZlcgorICoKKyAqIENoZWNrIHVzYl9nYWRnZXRfdW5yZWdpc3Rlcl9kcml2ZXIoKSBhdCAidXNiX2dhZGdldC5oIiBmb3IgZGV0YWlscworICovCitpbnQgdXNiX2dhZGdldF91bnJlZ2lzdGVyX2RyaXZlcihzdHJ1Y3QgdXNiX2dhZGdldF9kcml2ZXIgKmRyaXZlcikKK3sKKwlzdHJ1Y3QgY2kxM3h4eCAqdWRjID0gX3VkYzsKKwl1bnNpZ25lZCBsb25nIGksIGssIGZsYWdzOworCisJdHJhY2UoIiVwIiwgZHJpdmVyKTsKKworCWlmIChkcml2ZXIgICAgICAgICAgICAgPT0gTlVMTCB8fAorCSAgICBkcml2ZXItPmJpbmQgICAgICAgPT0gTlVMTCB8fAorCSAgICBkcml2ZXItPnVuYmluZCAgICAgPT0gTlVMTCB8fAorCSAgICBkcml2ZXItPnNldHVwICAgICAgPT0gTlVMTCB8fAorCSAgICBkcml2ZXItPmRpc2Nvbm5lY3QgPT0gTlVMTCB8fAorCSAgICBkcml2ZXItPnN1c3BlbmQgICAgPT0gTlVMTCB8fAorCSAgICBkcml2ZXItPnJlc3VtZSAgICAgPT0gTlVMTCB8fAorCSAgICBkcml2ZXIgICAgICAgICAgICAgIT0gdWRjLT5kcml2ZXIpCisJCXJldHVybiAtRUlOVkFMOworCisJc3Bpbl9sb2NrX2lycXNhdmUodWRjLT5sb2NrLCBmbGFncyk7CisKKwlod19kZXZpY2Vfc3RhdGUoMCk7CisKKwkvKiB1bmJpbmQgZ2FkZ2V0ICovCisJaWYgKHVkYy0+Z2FkZ2V0Lm9wcyAhPSBOVUxMKSB7CisJCV9nYWRnZXRfc3RvcF9hY3Rpdml0eSgmdWRjLT5nYWRnZXQpOworCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUodWRjLT5sb2NrLCBmbGFncyk7CisJCWRyaXZlci0+dW5iaW5kKCZ1ZGMtPmdhZGdldCk7ICAgICAgICAgICAgICAgLyogTUFZIFNMRUVQICovCisJCXNwaW5fbG9ja19pcnFzYXZlKHVkYy0+bG9jaywgZmxhZ3MpOworCisJCXVkYy0+Z2FkZ2V0Lm9wcyAgICAgICAgPSBOVUxMOworCQl1ZGMtPmdhZGdldC5kZXYuZHJpdmVyID0gTlVMTDsKKwl9CisKKwkvKiBmcmVlIHJlc291cmNlcyAqLworCWZvciAoaSA9IDA7IGkgPCBod19lcF9tYXg7IGkrKykgeworCQlzdHJ1Y3QgY2kxM3h4eF9lcCAqbUVwID0gJnVkYy0+Y2kxM3h4eF9lcFtpXTsKKworCQlpZiAoaSA9PSAwKQorCQkJdWRjLT5nYWRnZXQuZXAwID0gTlVMTDsKKwkJZWxzZSBpZiAoIWxpc3RfZW1wdHkoJm1FcC0+ZXAuZXBfbGlzdCkpCisJCQlsaXN0X2RlbF9pbml0KCZtRXAtPmVwLmVwX2xpc3QpOworCisJCWZvciAoayA9IFJYOyBrIDw9IFRYOyBrKyspCisJCQlpZiAobUVwLT5xaFtrXS5wdHIgIT0gTlVMTCkKKwkJCQlkbWFfcG9vbF9mcmVlKHVkYy0+cWhfcG9vbCwKKwkJCQkJICAgICAgbUVwLT5xaFtrXS5wdHIsIG1FcC0+cWhba10uZG1hKTsKKwl9CisKKwl1ZGMtPmRyaXZlciA9IE5VTEw7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKHVkYy0+bG9jaywgZmxhZ3MpOworCisJaWYgKHVkYy0+dGRfcG9vbCAhPSBOVUxMKSB7CisJCWRtYV9wb29sX2Rlc3Ryb3kodWRjLT50ZF9wb29sKTsKKwkJdWRjLT50ZF9wb29sID0gTlVMTDsKKwl9CisJaWYgKHVkYy0+cWhfcG9vbCAhPSBOVUxMKSB7CisJCWRtYV9wb29sX2Rlc3Ryb3kodWRjLT5xaF9wb29sKTsKKwkJdWRjLT5xaF9wb29sID0gTlVMTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0wodXNiX2dhZGdldF91bnJlZ2lzdGVyX2RyaXZlcik7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEJVUyBibG9jaworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiB1ZGNfaXJxOiBnbG9iYWwgaW50ZXJydXB0IGhhbmRsZXIKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgSVJRX0hBTkRMRUQgaWYgdGhlIElSUSBoYXMgYmVlbiBoYW5kbGVkCisgKiBJdCBsb2NrcyBhY2Nlc3MgdG8gcmVnaXN0ZXJzCisgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCB1ZGNfaXJxKHZvaWQpCit7CisJc3RydWN0IGNpMTN4eHggKnVkYyA9IF91ZGM7CisJaXJxcmV0dXJuX3QgcmV0dmFsOworCXUzMiBpbnRyOworCisJdHJhY2UoKTsKKworCWlmICh1ZGMgPT0gTlVMTCkgeworCQllcnIoIkVOT0RFViIpOworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQorCisJc3Bpbl9sb2NrKHVkYy0+bG9jayk7CisJaW50ciA9IGh3X3Rlc3RfYW5kX2NsZWFyX2ludHJfYWN0aXZlKCk7CisJaWYgKGludHIpIHsKKwkJaXNyX3N0YXRpc3RpY3MuaG5kbC5idWZbaXNyX3N0YXRpc3RpY3MuaG5kbC5pZHgrK10gPSBpbnRyOworCQlpc3Jfc3RhdGlzdGljcy5obmRsLmlkeCAmPSBJU1JfTUFTSzsKKwkJaXNyX3N0YXRpc3RpY3MuaG5kbC5jbnQrKzsKKworCQkvKiBvcmRlciBkZWZpbmVzIHByaW9yaXR5IC0gZG8gTk9UIGNoYW5nZSBpdCAqLworCQlpZiAoVVNCaV9VUkkgJiBpbnRyKSB7CisJCQlpc3Jfc3RhdGlzdGljcy51cmkrKzsKKwkJCWlzcl9yZXNldF9oYW5kbGVyKHVkYyk7CisJCX0KKwkJaWYgKFVTQmlfUENJICYgaW50cikgeworCQkJaXNyX3N0YXRpc3RpY3MucGNpKys7CisJCQl1ZGMtPmdhZGdldC5zcGVlZCA9IGh3X3BvcnRfaXNfaGlnaF9zcGVlZCgpID8KKwkJCQlVU0JfU1BFRURfSElHSCA6IFVTQl9TUEVFRF9GVUxMOworCQl9CisJCWlmIChVU0JpX1VFSSAmIGludHIpCisJCQlpc3Jfc3RhdGlzdGljcy51ZWkrKzsKKwkJaWYgKFVTQmlfVUkgICYgaW50cikgeworCQkJaXNyX3N0YXRpc3RpY3MudWkrKzsKKwkJCWlzcl90cl9jb21wbGV0ZV9oYW5kbGVyKHVkYyk7CisJCX0KKwkJaWYgKFVTQmlfU0xJICYgaW50cikKKwkJCWlzcl9zdGF0aXN0aWNzLnNsaSsrOworCQlyZXR2YWwgPSBJUlFfSEFORExFRDsKKwl9IGVsc2UgeworCQlpc3Jfc3RhdGlzdGljcy5ub25lKys7CisJCXJldHZhbCA9IElSUV9OT05FOworCX0KKwlzcGluX3VubG9jayh1ZGMtPmxvY2spOworCisJcmV0dXJuIHJldHZhbDsKK30KKworLyoqCisgKiB1ZGNfcmVsZWFzZTogZHJpdmVyIHJlbGVhc2UgZnVuY3Rpb24KKyAqIEBkZXY6IGRldmljZQorICoKKyAqIEN1cnJlbnRseSBkb2VzIG5vdGhpbmcKKyAqLworc3RhdGljIHZvaWQgdWRjX3JlbGVhc2Uoc3RydWN0IGRldmljZSAqZGV2KQoreworCXRyYWNlKCIlcCIsIGRldik7CisKKwlpZiAoZGV2ID09IE5VTEwpCisJCWVycigiRUlOVkFMIik7Cit9CisKKy8qKgorICogdWRjX3Byb2JlOiBwYXJlbnQgcHJvYmUgbXVzdCBjYWxsIHRoaXMgdG8gaW5pdGlhbGl6ZSBVREMKKyAqIEBkZXY6ICBwYXJlbnQgZGV2aWNlCisgKiBAcmVnczogcmVnaXN0ZXJzIGJhc2UgYWRkcmVzcworICogQG5hbWU6IGRyaXZlciBuYW1lCisgKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGFuIGVycm9yIGNvZGUKKyAqIE5vIGludGVycnVwdHMgYWN0aXZlLCB0aGUgSVJRIGhhcyBub3QgYmVlbiByZXF1ZXN0ZWQgeWV0CisgKiBLZXJuZWwgYXNzdW1lcyAzMi1iaXQgRE1BIG9wZXJhdGlvbnMgYnkgZGVmYXVsdCwgbm8gbmVlZCB0byBkbWFfc2V0X21hc2sKKyAqLworc3RhdGljIGludCB1ZGNfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkIF9faW9tZW0gKnJlZ3MsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IGNpMTN4eHggKnVkYzsKKwlpbnQgcmV0dmFsID0gMDsKKworCXRyYWNlKCIlcCwgJXAsICVwIiwgZGV2LCByZWdzLCBuYW1lKTsKKworCWlmIChkZXYgPT0gTlVMTCB8fCByZWdzID09IE5VTEwgfHwgbmFtZSA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXVkYyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBjaTEzeHh4KSwgR0ZQX0tFUk5FTCk7CisJaWYgKHVkYyA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXVkYy0+bG9jayA9ICZ1ZGNfbG9jazsKKworCXJldHZhbCA9IGh3X2RldmljZV9yZXNldChyZWdzKTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIGRvbmU7CisKKwl1ZGMtPmdhZGdldC5vcHMgICAgICAgICAgPSBOVUxMOworCXVkYy0+Z2FkZ2V0LnNwZWVkICAgICAgICA9IFVTQl9TUEVFRF9VTktOT1dOOworCXVkYy0+Z2FkZ2V0LmlzX2R1YWxzcGVlZCA9IDE7CisJdWRjLT5nYWRnZXQuaXNfb3RnICAgICAgID0gMDsKKwl1ZGMtPmdhZGdldC5uYW1lICAgICAgICAgPSBuYW1lOworCisJSU5JVF9MSVNUX0hFQUQoJnVkYy0+Z2FkZ2V0LmVwX2xpc3QpOworCXVkYy0+Z2FkZ2V0LmVwMCA9IE5VTEw7CisKKwlzdHJjcHkodWRjLT5nYWRnZXQuZGV2LmJ1c19pZCwgImdhZGdldCIpOworCXVkYy0+Z2FkZ2V0LmRldi5kbWFfbWFzayA9IGRldi0+ZG1hX21hc2s7CisJdWRjLT5nYWRnZXQuZGV2LnBhcmVudCAgID0gZGV2OworCXVkYy0+Z2FkZ2V0LmRldi5yZWxlYXNlICA9IHVkY19yZWxlYXNlOworCisJcmV0dmFsID0gZGV2aWNlX3JlZ2lzdGVyKCZ1ZGMtPmdhZGdldC5kZXYpOworCWlmIChyZXR2YWwpCisJCWdvdG8gZG9uZTsKKworI2lmZGVmIENPTkZJR19VU0JfR0FER0VUX0RFQlVHX0ZJTEVTCisJcmV0dmFsID0gZGJnX2NyZWF0ZV9maWxlcygmdWRjLT5nYWRnZXQuZGV2KTsKKyNlbmRpZgorCWlmIChyZXR2YWwpIHsKKwkJZGV2aWNlX3VucmVnaXN0ZXIoJnVkYy0+Z2FkZ2V0LmRldik7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlfdWRjID0gdWRjOworCXJldHVybiByZXR2YWw7CisKKyBkb25lOgorCWVycigiZXJyb3IgPSAlaSIsIHJldHZhbCk7CisJa2ZyZWUodWRjKTsKKwlfdWRjID0gTlVMTDsKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKioKKyAqIHVkY19yZW1vdmU6IHBhcmVudCByZW1vdmUgbXVzdCBjYWxsIHRoaXMgdG8gcmVtb3ZlIFVEQworICoKKyAqIE5vIGludGVycnVwdHMgYWN0aXZlLCB0aGUgSVJRIGhhcyBiZWVuIHJlbGVhc2VkCisgKi8KK3N0YXRpYyB2b2lkIHVkY19yZW1vdmUodm9pZCkKK3sKKwlzdHJ1Y3QgY2kxM3h4eCAqdWRjID0gX3VkYzsKKworCWlmICh1ZGMgPT0gTlVMTCkgeworCQllcnIoIkVJTlZBTCIpOworCQlyZXR1cm47CisJfQorCisjaWZkZWYgQ09ORklHX1VTQl9HQURHRVRfREVCVUdfRklMRVMKKwlkYmdfcmVtb3ZlX2ZpbGVzKCZ1ZGMtPmdhZGdldC5kZXYpOworI2VuZGlmCisJZGV2aWNlX3VucmVnaXN0ZXIoJnVkYy0+Z2FkZ2V0LmRldik7CisKKwlrZnJlZSh1ZGMpOworCV91ZGMgPSBOVUxMOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBQQ0kgYmxvY2sKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogY2kxM3h4eF9wY2lfaXJxOiBpbnRlcnJ1dCBoYW5kbGVyCisgKiBAaXJxOiAgaXJxIG51bWJlcgorICogQHBkZXY6IFVTQiBEZXZpY2UgQ29udHJvbGxlciBpbnRlcnJ1cHQgc291cmNlCisgKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIElSUV9IQU5ETEVEIGlmIHRoZSBJUlEgaGFzIGJlZW4gaGFuZGxlZAorICogVGhpcyBpcyBhbiBJU1IgZG9uJ3QgdHJhY2UsIHVzZSBhdHRyaWJ1dGUgaW50ZXJmYWNlIGluc3RlYWQKKyAqLworc3RhdGljIGlycXJldHVybl90IGNpMTN4eHhfcGNpX2lycShpbnQgaXJxLCB2b2lkICpwZGV2KQoreworCWlmIChpcnEgPT0gMCkgeworCQlkZXZfZXJyKCYoKHN0cnVjdCBwY2lfZGV2ICopcGRldiktPmRldiwgIkludmFsaWQgSVJRMCB1c2FnZSEiKTsKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KKwlyZXR1cm4gdWRjX2lycSgpOworfQorCisvKioKKyAqIGNpMTN4eHhfcGNpX3Byb2JlOiBQQ0kgcHJvYmUKKyAqIEBwZGV2OiBVU0IgZGV2aWNlIGNvbnRyb2xsZXIgYmVpbmcgcHJvYmVkCisgKiBAaWQ6ICAgUENJIGhvdHBsdWcgSUQgY29ubmVjdGluZyBjb250cm9sbGVyIHRvIFVEQyBmcmFtZXdvcmsKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYW4gZXJyb3IgY29kZQorICogQWxsb2NhdGVzIGJhc2ljIFBDSSByZXNvdXJjZXMgZm9yIHRoaXMgVVNCIGRldmljZSBjb250cm9sbGVyLCBhbmQgdGhlbgorICogaW52b2tlcyB0aGUgdWRjX3Byb2JlKCkgbWV0aG9kIHRvIHN0YXJ0IHRoZSBVREMgYXNzb2NpYXRlZCB3aXRoIGl0CisgKi8KK3N0YXRpYyBpbnQgX19kZXZpbml0IGNpMTN4eHhfcGNpX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCit7CisJdm9pZCBfX2lvbWVtICpyZWdzID0gTlVMTDsKKwlpbnQgcmV0dmFsID0gMDsKKworCWlmIChpZCA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHZhbCA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOworCWlmIChyZXR2YWwpCisJCWdvdG8gZG9uZTsKKworCWlmICghcGRldi0+aXJxKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIk5vIElSUSwgY2hlY2sgQklPUy9QQ0kgc2V0dXAhIik7CisJCXJldHZhbCA9IC1FTk9ERVY7CisJCWdvdG8gZGlzYWJsZV9kZXZpY2U7CisJfQorCisJcmV0dmFsID0gcGNpX3JlcXVlc3RfcmVnaW9ucyhwZGV2LCBVRENfRFJJVkVSX05BTUUpOworCWlmIChyZXR2YWwpCisJCWdvdG8gZGlzYWJsZV9kZXZpY2U7CisKKwkvKiBCQVIgMCBob2xkcyBhbGwgdGhlIHJlZ2lzdGVycyAqLworCXJlZ3MgPSBwY2lfaW9tYXAocGRldiwgMCwgMCk7CisJaWYgKCFyZWdzKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkVycm9yIG1hcHBpbmcgbWVtb3J5ISIpOworCQlyZXR2YWwgPSAtRUZBVUxUOworCQlnb3RvIHJlbGVhc2VfcmVnaW9uczsKKwl9CisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIChfX2ZvcmNlIHZvaWQgKilyZWdzKTsKKworCXBjaV9zZXRfbWFzdGVyKHBkZXYpOworCXBjaV90cnlfc2V0X213aShwZGV2KTsKKworCXJldHZhbCA9IHVkY19wcm9iZSgmcGRldi0+ZGV2LCByZWdzLCBVRENfRFJJVkVSX05BTUUpOworCWlmIChyZXR2YWwpCisJCWdvdG8gaW91bm1hcDsKKworCS8qIG91ciBkZXZpY2UgZG9lcyBub3QgaGF2ZSBNU0kgY2FwYWJpbGl0eSAqLworCisJcmV0dmFsID0gcmVxdWVzdF9pcnEocGRldi0+aXJxLCBjaTEzeHh4X3BjaV9pcnEsIElSUUZfU0hBUkVELAorCQkJICAgICBVRENfRFJJVkVSX05BTUUsIHBkZXYpOworCWlmIChyZXR2YWwpCisJCWdvdG8gZ2FkZ2V0X3JlbW92ZTsKKworCXJldHVybiAwOworCisgZ2FkZ2V0X3JlbW92ZToKKwl1ZGNfcmVtb3ZlKCk7CisgaW91bm1hcDoKKwlwY2lfaW91bm1hcChwZGV2LCByZWdzKTsKKyByZWxlYXNlX3JlZ2lvbnM6CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKKyBkaXNhYmxlX2RldmljZToKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisgZG9uZToKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKioKKyAqIGNpMTN4eHhfcGNpX3JlbW92ZTogUENJIHJlbW92ZQorICogQHBkZXY6IFVTQiBEZXZpY2UgQ29udHJvbGxlciBiZWluZyByZW1vdmVkCisgKgorICogUmV2ZXJzZXMgdGhlIGVmZmVjdCBvZiBjaTEzeHh4X3BjaV9wcm9iZSgpLAorICogZmlyc3QgaW52b2tpbmcgdGhlIHVkY19yZW1vdmUoKSBhbmQgdGhlbiByZWxlYXNlcworICogYWxsIFBDSSByZXNvdXJjZXMgYWxsb2NhdGVkIGZvciB0aGlzIFVTQiBkZXZpY2UgY29udHJvbGxlcgorICovCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgY2kxM3h4eF9wY2lfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCWZyZWVfaXJxKHBkZXYtPmlycSwgcGRldik7CisJdWRjX3JlbW92ZSgpOworCXBjaV9pb3VubWFwKHBkZXYsIChfX2ZvcmNlIHZvaWQgX19pb21lbSAqKXBjaV9nZXRfZHJ2ZGF0YShwZGV2KSk7CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7Cit9CisKKy8qKgorICogUENJIGRldmljZSB0YWJsZQorICogUENJIGRldmljZSBzdHJ1Y3R1cmUKKyAqCisgKiBDaGVjayAicGNpLmgiIGZvciBkZXRhaWxzCisgKi8KK3N0YXRpYyBERUZJTkVfUENJX0RFVklDRV9UQUJMRShjaTEzeHh4X3BjaV9pZF90YWJsZSkgPSB7CisJeyBQQ0lfREVWSUNFKDB4MTUzRiwgMHgxMDA0KSB9LAorCXsgUENJX0RFVklDRSgweDE1M0YsIDB4MTAwNikgfSwKKwl7IDAsIDAsIDAsIDAsIDAsIDAsIDAgLyogZW5kOiBhbGwgemVyb2VzICovIH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgY2kxM3h4eF9wY2lfaWRfdGFibGUpOworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgY2kxM3h4eF9wY2lfZHJpdmVyID0geworCS5uYW1lICAgICAgICAgPQlVRENfRFJJVkVSX05BTUUsCisJLmlkX3RhYmxlICAgICA9CWNpMTN4eHhfcGNpX2lkX3RhYmxlLAorCS5wcm9iZSAgICAgICAgPQljaTEzeHh4X3BjaV9wcm9iZSwKKwkucmVtb3ZlICAgICAgID0JX19kZXZleGl0X3AoY2kxM3h4eF9wY2lfcmVtb3ZlKSwKK307CisKKy8qKgorICogY2kxM3h4eF9wY2lfaW5pdDogbW9kdWxlIGluaXQKKyAqCisgKiBEcml2ZXIgbG9hZAorICovCitzdGF0aWMgaW50IF9faW5pdCBjaTEzeHh4X3BjaV9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJmNpMTN4eHhfcGNpX2RyaXZlcik7Cit9Cittb2R1bGVfaW5pdChjaTEzeHh4X3BjaV9pbml0KTsKKworLyoqCisgKiBjaTEzeHh4X3BjaV9leGl0OiBtb2R1bGUgZXhpdAorICoKKyAqIERyaXZlciB1bmxvYWQKKyAqLworc3RhdGljIHZvaWQgX19leGl0IGNpMTN4eHhfcGNpX2V4aXQodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmNpMTN4eHhfcGNpX2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdChjaTEzeHh4X3BjaV9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiTUlQUyAtIERhdmlkIExvcG8gPGRsb3BvQGNoaXBpZGVhLm1pcHMuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJNSVBTIENJMTNYWFggVVNCIFBlcmlwaGVyYWwgQ29udHJvbGxlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX1ZFUlNJT04oIkp1bmUgMjAwOCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L2NpMTN4eHhfdWRjLmggYi9kcml2ZXJzL3VzYi9nYWRnZXQvY2kxM3h4eF91ZGMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDI2ZTljCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2NpMTN4eHhfdWRjLmgKQEAgLTAsMCArMSwxOTUgQEAKKy8qCisgKiBjaTEzeHh4X3VkYy5oIC0gc3RydWN0dXJlcywgcmVnaXN0ZXJzLCBhbmQgbWFjcm9zIE1JUFMgVVNCIElQIGNvcmUKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggQ2hpcGlkZWEgLSBNSVBTIFRlY2hub2xvZ2llcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIEF1dGhvcjogRGF2aWQgTG9wbworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogRGVzY3JpcHRpb246IE1JUFMgVVNCIElQIGNvcmUgZmFtaWx5IGRldmljZSBjb250cm9sbGVyCisgKiAgICAgICAgICAgICAgU3RydWN0dXJlcywgcmVnaXN0ZXJzIGFuZCBsb2dnaW5nIG1hY3JvcworICovCisKKyNpZm5kZWYgX0NJMTNYWFhfaF8KKyNkZWZpbmUgX0NJMTNYWFhfaF8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogREVGSU5FCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIEVORFBUX01BWCAgICAgICAgICAoMTYpCisjZGVmaW5lIENUUkxfUEFZTE9BRF9NQVggICAoNjQpCisjZGVmaW5lIFJYICAgICAgICAoMCkgIC8qIHNpbWlsYXIgdG8gVVNCX0RJUl9PVVQgYnV0IGNhbiBiZSB1c2VkIGFzIGFuIGluZGV4ICovCisjZGVmaW5lIFRYICAgICAgICAoMSkgIC8qIHNpbWlsYXIgdG8gVVNCX0RJUl9JTiAgYnV0IGNhbiBiZSB1c2VkIGFzIGFuIGluZGV4ICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFNUUlVDVFVSRVMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIERNQSBsYXlvdXQgb2YgdHJhbnNmZXIgZGVzY3JpcHRvcnMgKi8KK3N0cnVjdCBjaTEzeHh4X3RkIHsKKwkvKiAwICovCisJdTMyIG5leHQ7CisjZGVmaW5lIFREX1RFUk1JTkFURSAgICAgICAgICBCSVQoMCkKKwkvKiAxICovCisJdTMyIHRva2VuOworI2RlZmluZSBURF9TVEFUVVMgICAgICAgICAgICAgKDB4MDBGRlVMIDw8ICAwKQorI2RlZmluZSBURF9TVEFUVVNfVFJfRVJSICAgICAgQklUKDMpCisjZGVmaW5lIFREX1NUQVRVU19EVF9FUlIgICAgICBCSVQoNSkKKyNkZWZpbmUgVERfU1RBVFVTX0hBTFRFRCAgICAgIEJJVCg2KQorI2RlZmluZSBURF9TVEFUVVNfQUNUSVZFICAgICAgQklUKDcpCisjZGVmaW5lIFREX01VTFRPICAgICAgICAgICAgICAoMHgwMDAzVUwgPDwgMTApCisjZGVmaW5lIFREX0lPQyAgICAgICAgICAgICAgICBCSVQoMTUpCisjZGVmaW5lIFREX1RPVEFMX0JZVEVTICAgICAgICAoMHg3RkZGVUwgPDwgMTYpCisJLyogMiAqLworCXUzMiBwYWdlWzVdOworI2RlZmluZSBURF9DVVJSX09GRlNFVCAgICAgICAgKDB4MEZGRlVMIDw8ICAwKQorI2RlZmluZSBURF9GUkFNRV9OVU0gICAgICAgICAgKDB4MDdGRlVMIDw8ICAwKQorI2RlZmluZSBURF9SRVNFUlZFRF9NQVNLICAgICAgKDB4MEZGRlVMIDw8ICAwKQorfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qIERNQSBsYXlvdXQgb2YgcXVldWUgaGVhZHMgKi8KK3N0cnVjdCBjaTEzeHh4X3FoIHsKKwkvKiAwICovCisJdTMyIGNhcDsKKyNkZWZpbmUgUUhfSU9TICAgICAgICAgICAgICAgIEJJVCgxNSkKKyNkZWZpbmUgUUhfTUFYX1BLVCAgICAgICAgICAgICgweDA3RkZVTCA8PCAxNikKKyNkZWZpbmUgUUhfWkxUICAgICAgICAgICAgICAgIEJJVCgyOSkKKyNkZWZpbmUgUUhfTVVMVCAgICAgICAgICAgICAgICgweDAwMDNVTCA8PCAzMCkKKwkvKiAxICovCisJdTMyIGN1cnI7CisJLyogMiAtIDggKi8KKwlzdHJ1Y3QgY2kxM3h4eF90ZCAgICAgICAgdGQ7CisJLyogOSAqLworCXUzMiBSRVNFUlZFRDsKKwlzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0ICAgc2V0dXA7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyogRXh0ZW5zaW9uIG9mIHVzYl9yZXF1ZXN0ICovCitzdHJ1Y3QgY2kxM3h4eF9yZXEgeworCXN0cnVjdCB1c2JfcmVxdWVzdCAgIHJlcTsKKwl1bnNpZ25lZCAgICAgICAgICAgICBtYXA7CisJc3RydWN0IGxpc3RfaGVhZCAgICAgcXVldWU7CisJc3RydWN0IGNpMTN4eHhfdGQgICAqcHRyOworCWRtYV9hZGRyX3QgICAgICAgICAgIGRtYTsKK307CisKKy8qIEV4dGVuc2lvbiBvZiB1c2JfZXAgKi8KK3N0cnVjdCBjaTEzeHh4X2VwIHsKKwlzdHJ1Y3QgdXNiX2VwICAgICAgICAgICAgICAgICAgICAgICAgICBlcDsKKwljb25zdCBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgICpkZXNjOworCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcjsKKwl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW07CisJdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTsKKwljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lWzE2XTsKKwlzdHJ1Y3QgeworCQlzdHJ1Y3QgbGlzdF9oZWFkICAgcXVldWU7CisJCXN0cnVjdCBjaTEzeHh4X3FoICpwdHI7CisJCWRtYV9hZGRyX3QgICAgICAgICBkbWE7CisJfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWhbMl07CisJc3RydWN0IHVzYl9yZXF1ZXN0ICAgICAgICAgICAgICAgICAgICAqc3RhdHVzOworCWludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlZGdlOworCisJLyogZ2xvYmFsIHJlc291cmNlcyAqLworCXNwaW5sb2NrX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmxvY2s7CisJc3RydWN0IGRldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAqZGV2aWNlOworCXN0cnVjdCBkbWFfcG9vbCAgICAgICAgICAgICAgICAgICAgICAgKnRkX3Bvb2w7Cit9OworCisvKiBDSTEzWFhYIFVEQyBkZXNjcmlwdG9yICYgZ2xvYmFsIHJlc291cmNlcyAqLworc3RydWN0IGNpMTN4eHggeworCXNwaW5sb2NrX3QJCSAgKmxvY2s7ICAgICAgLyogY3RybCByZWdpc3RlciBiYW5rIGFjY2VzcyAqLworCisJc3RydWN0IGRtYV9wb29sICAgICAgICAgICAqcWhfcG9vbDsgICAvKiBETUEgcG9vbCBmb3IgcXVldWUgaGVhZHMgKi8KKwlzdHJ1Y3QgZG1hX3Bvb2wgICAgICAgICAgICp0ZF9wb29sOyAgIC8qIERNQSBwb29sIGZvciB0cmFuc2ZlciBkZXNjcyAqLworCisJc3RydWN0IHVzYl9nYWRnZXQgICAgICAgICAgZ2FkZ2V0OyAgICAgLyogVVNCIHNsYXZlIGRldmljZSAqLworCXN0cnVjdCBjaTEzeHh4X2VwICAgICAgICAgIGNpMTN4eHhfZXBbRU5EUFRfTUFYXTsgLyogZXh0ZW5kZWQgZW5kcHRzICovCisKKwlzdHJ1Y3QgdXNiX2dhZGdldF9kcml2ZXIgICpkcml2ZXI7ICAgICAvKiAzcmQgcGFydHkgZ2FkZ2V0IGRyaXZlciAqLworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUkVHSVNURVJTCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiByZWdpc3RlciBzaXplICovCisjZGVmaW5lIFJFR19CSVRTICAgKDMyKQorCisvKiBIQ0NQQVJBTVMgKi8KKyNkZWZpbmUgSENDUEFSQU1TX0xFTiAgICAgICAgIEJJVCgxNykKKworLyogRENDUEFSQU1TICovCisjZGVmaW5lIERDQ1BBUkFNU19ERU4gICAgICAgICAoMHgxRiA8PCAwKQorI2RlZmluZSBEQ0NQQVJBTVNfREMgICAgICAgICAgQklUKDcpCisKKy8qIFRFU1RNT0RFICovCisjZGVmaW5lIFRFU1RNT0RFX0ZPUkNFICAgICAgICBCSVQoMCkKKworLyogVVNCQ01EICovCisjZGVmaW5lIFVTQkNNRF9SUyAgICAgICAgICAgICBCSVQoMCkKKyNkZWZpbmUgVVNCQ01EX1JTVCAgICAgICAgICAgIEJJVCgxKQorI2RlZmluZSBVU0JDTURfU1VUVyAgICAgICAgICAgQklUKDEzKQorCisvKiBVU0JTVFMgJiBVU0JJTlRSICovCisjZGVmaW5lIFVTQmlfVUkgICAgICAgICAgICAgICBCSVQoMCkKKyNkZWZpbmUgVVNCaV9VRUkgICAgICAgICAgICAgIEJJVCgxKQorI2RlZmluZSBVU0JpX1BDSSAgICAgICAgICAgICAgQklUKDIpCisjZGVmaW5lIFVTQmlfVVJJICAgICAgICAgICAgICBCSVQoNikKKyNkZWZpbmUgVVNCaV9TTEkgICAgICAgICAgICAgIEJJVCg4KQorCisvKiBERVZJQ0VBRERSICovCisjZGVmaW5lIERFVklDRUFERFJfVVNCQURSQSAgICBCSVQoMjQpCisjZGVmaW5lIERFVklDRUFERFJfVVNCQURSICAgICAoMHg3RlVMIDw8IDI1KQorCisvKiBQT1JUU0MgKi8KKyNkZWZpbmUgUE9SVFNDX1NVU1AgICAgICAgICAgIEJJVCg3KQorI2RlZmluZSBQT1JUU0NfSFNQICAgICAgICAgICAgQklUKDkpCisjZGVmaW5lIFBPUlRTQ19QVEMgICAgICAgICAgICAoMHgwRlVMIDw8IDE2KQorCisvKiBERVZMQyAqLworI2RlZmluZSBERVZMQ19QU1BEICAgICAgICAgICAgKDB4MDNVTCA8PCAyNSkKKyNkZWZpbmUgICAgREVWTENfUFNQRF9IUyAgICAgICgweDAyVUwgPDwgMjUpCisKKy8qIFVTQk1PREUgKi8KKyNkZWZpbmUgVVNCTU9ERV9DTSAgICAgICAgICAgICgweDAzVUwgPDwgIDApCisjZGVmaW5lICAgIFVTQk1PREVfQ01fSURMRSAgICAoMHgwMFVMIDw8ICAwKQorI2RlZmluZSAgICBVU0JNT0RFX0NNX0RFVklDRSAgKDB4MDJVTCA8PCAgMCkKKyNkZWZpbmUgICAgVVNCTU9ERV9DTV9IT1NUICAgICgweDAzVUwgPDwgIDApCisjZGVmaW5lIFVTQk1PREVfU0xPTSAgICAgICAgICBCSVQoMykKKworLyogRU5EUFRDVFJMICovCisjZGVmaW5lIEVORFBUQ1RSTF9SWFMgICAgICAgICBCSVQoMCkKKyNkZWZpbmUgRU5EUFRDVFJMX1JYVCAgICAgICAgICgweDAzVUwgPDwgIDIpCisjZGVmaW5lIEVORFBUQ1RSTF9SWFIgICAgICAgICBCSVQoNikgICAgICAgICAvKiByZXNlcnZlZCBmb3IgcG9ydCAwICovCisjZGVmaW5lIEVORFBUQ1RSTF9SWEUgICAgICAgICBCSVQoNykKKyNkZWZpbmUgRU5EUFRDVFJMX1RYUyAgICAgICAgIEJJVCgxNikKKyNkZWZpbmUgRU5EUFRDVFJMX1RYVCAgICAgICAgICgweDAzVUwgPDwgMTgpCisjZGVmaW5lIEVORFBUQ1RSTF9UWFIgICAgICAgICBCSVQoMjIpICAgICAgICAvKiByZXNlcnZlZCBmb3IgcG9ydCAwICovCisjZGVmaW5lIEVORFBUQ1RSTF9UWEUgICAgICAgICBCSVQoMjMpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIExPR0dJTkcKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgY2kxM3h4eF9wcmludGsobGV2ZWwsIGZvcm1hdCwgYXJncy4uLikgXAorZG8geyBcCisJaWYgKF91ZGMgPT0gTlVMTCkgXAorCQlwcmludGsobGV2ZWwgIlslc10gIiBmb3JtYXQgIlxuIiwgX19mdW5jX18sICMjIGFyZ3MpOyBcCisJZWxzZSBcCisJCWRldl9wcmludGsobGV2ZWwsIF91ZGMtPmdhZGdldC5kZXYucGFyZW50LCBcCisJCQkgICAiWyVzXSAiIGZvcm1hdCAiXG4iLCBfX2Z1bmNfXywgIyMgYXJncyk7IFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgZXJyKGZvcm1hdCwgYXJncy4uLikgICAgY2kxM3h4eF9wcmludGsoS0VSTl9FUlIsIGZvcm1hdCwgIyMgYXJncykKKyNkZWZpbmUgd2Fybihmb3JtYXQsIGFyZ3MuLi4pICAgY2kxM3h4eF9wcmludGsoS0VSTl9XQVJOSU5HLCBmb3JtYXQsICMjIGFyZ3MpCisjZGVmaW5lIGluZm8oZm9ybWF0LCBhcmdzLi4uKSAgIGNpMTN4eHhfcHJpbnRrKEtFUk5fSU5GTywgZm9ybWF0LCAjIyBhcmdzKQorCisjaWZkZWYgVFJBQ0UKKyNkZWZpbmUgdHJhY2UoZm9ybWF0LCBhcmdzLi4uKSAgICAgIGNpMTN4eHhfcHJpbnRrKEtFUk5fREVCVUcsIGZvcm1hdCwgIyMgYXJncykKKyNkZWZpbmUgZGJnX3RyYWNlKGZvcm1hdCwgYXJncy4uLikgIGRldl9kYmcoZGV2LCBmb3JtYXQsICMjYXJncykKKyNlbHNlCisjZGVmaW5lIHRyYWNlKGZvcm1hdCwgYXJncy4uLikgICAgICBkbyB7fSB3aGlsZSAoMCkKKyNkZWZpbmUgZGJnX3RyYWNlKGZvcm1hdCwgYXJncy4uLikgIGRvIHt9IHdoaWxlICgwKQorI2VuZGlmCisKKyNlbmRpZgkvKiBfQ0kxM1hYWF9oXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L2VwYXV0b2NvbmYuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9lcGF1dG9jb25mLmMKaW5kZXggOTQ2MmUzMC4uYTM2YjExNyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L2VwYXV0b2NvbmYuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZXBhdXRvY29uZi5jCkBAIC0xNjEsNyArMTYxLDcgQEAKIAkvKiByZXBvcnQgYWRkcmVzcyAqLwogCWRlc2MtPmJFbmRwb2ludEFkZHJlc3MgJj0gVVNCX0RJUl9JTjsKIAlpZiAoaXNkaWdpdCAoZXAtPm5hbWUgWzJdKSkgewotCQl1OAludW0gPSBzaW1wbGVfc3RydG9sICgmZXAtPm5hbWUgWzJdLCBOVUxMLCAxMCk7CisJCXU4CW51bSA9IHNpbXBsZV9zdHJ0b3VsICgmZXAtPm5hbWUgWzJdLCBOVUxMLCAxMCk7CiAJCWRlc2MtPmJFbmRwb2ludEFkZHJlc3MgfD0gbnVtOwogI2lmZGVmCU1BTllfRU5EUE9JTlRTCiAJfSBlbHNlIGlmIChkZXNjLT5iRW5kcG9pbnRBZGRyZXNzICYgVVNCX0RJUl9JTikgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L2ZfcGhvbmV0LmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZl9waG9uZXQuYwppbmRleCBkOGZjOWIzLi5jMDkxNmM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvZl9waG9uZXQuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZl9waG9uZXQuYwpAQCAtMjc5LDYgKzI3OSwxMyBAQAogCXJldHVybiBlcnI7CiB9CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgcG5fbmV0ZGV2X29wcyA9IHsKKwkubmRvX29wZW4JPSBwbl9uZXRfb3BlbiwKKwkubmRvX3N0b3AJPSBwbl9uZXRfY2xvc2UsCisJLm5kb19zdGFydF94bWl0CT0gcG5fbmV0X3htaXQsCisJLm5kb19jaGFuZ2VfbXR1CT0gcG5fbmV0X210dSwKK307CisKIHN0YXRpYyB2b2lkIHBuX25ldF9zZXR1cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCWRldi0+ZmVhdHVyZXMJCT0gMDsKQEAgLTI5MCwxMiArMjk3LDkgQEAKIAlkZXYtPmFkZHJfbGVuCQk9IDE7CiAJZGV2LT50eF9xdWV1ZV9sZW4JPSAxOwogCisJZGV2LT5uZXRkZXZfb3BzCQk9ICZwbl9uZXRkZXZfb3BzOwogCWRldi0+ZGVzdHJ1Y3RvcgkJPSBmcmVlX25ldGRldjsKIAlkZXYtPmhlYWRlcl9vcHMJCT0gJnBob25ldF9oZWFkZXJfb3BzOwotCWRldi0+b3BlbgkJPSBwbl9uZXRfb3BlbjsKLQlkZXYtPnN0b3AJCT0gcG5fbmV0X2Nsb3NlOwotCWRldi0+aGFyZF9zdGFydF94bWl0CT0gcG5fbmV0X3htaXQ7IC8qIG1hbmRhdG9yeSAqLwotCWRldi0+Y2hhbmdlX210dQkJPSBwbl9uZXRfbXR1OwogfQogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L2ZpbGVfc3RvcmFnZS5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2ZpbGVfc3RvcmFnZS5jCmluZGV4IGM0ZTYyYTYuLmIxMGZhMzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9maWxlX3N0b3JhZ2UuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZmlsZV9zdG9yYWdlLmMKQEAgLTEsNyArMSw3IEBACiAvKgogICogZmlsZV9zdG9yYWdlLmMgLS0gRmlsZS1iYWNrZWQgVVNCIFN0b3JhZ2UgR2FkZ2V0LCBmb3IgVVNCIGRldmVsb3BtZW50CiAgKgotICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDcgQWxhbiBTdGVybgorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDggQWxhbiBTdGVybgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKQEAgLTM4LDE2ICszOCwxNyBAQAogCiAvKgogICogVGhlIEZpbGUtYmFja2VkIFN0b3JhZ2UgR2FkZ2V0IGFjdHMgYXMgYSBVU0IgTWFzcyBTdG9yYWdlIGRldmljZSwKLSAqIGFwcGVhcmluZyB0byB0aGUgaG9zdCBhcyBhIGRpc2sgZHJpdmUuICBJbiBhZGRpdGlvbiB0byBwcm92aWRpbmcgYW4KLSAqIGV4YW1wbGUgb2YgYSBnZW51aW5lbHkgdXNlZnVsIGdhZGdldCBkcml2ZXIgZm9yIGEgVVNCIGRldmljZSwgaXQgYWxzbwotICogaWxsdXN0cmF0ZXMgYSB0ZWNobmlxdWUgb2YgZG91YmxlLWJ1ZmZlcmluZyBmb3IgaW5jcmVhc2VkIHRocm91Z2hwdXQuCi0gKiBMYXN0IGJ1dCBub3QgbGVhc3QsIGl0IGdpdmVzIGFuIGVhc3kgd2F5IHRvIHByb2JlIHRoZSBiZWhhdmlvciBvZiB0aGUKLSAqIE1hc3MgU3RvcmFnZSBkcml2ZXJzIGluIGEgVVNCIGhvc3QuCisgKiBhcHBlYXJpbmcgdG8gdGhlIGhvc3QgYXMgYSBkaXNrIGRyaXZlIG9yIGFzIGEgQ0QtUk9NIGRyaXZlLiAgSW4gYWRkaXRpb24KKyAqIHRvIHByb3ZpZGluZyBhbiBleGFtcGxlIG9mIGEgZ2VudWluZWx5IHVzZWZ1bCBnYWRnZXQgZHJpdmVyIGZvciBhIFVTQgorICogZGV2aWNlLCBpdCBhbHNvIGlsbHVzdHJhdGVzIGEgdGVjaG5pcXVlIG9mIGRvdWJsZS1idWZmZXJpbmcgZm9yIGluY3JlYXNlZAorICogdGhyb3VnaHB1dC4gIExhc3QgYnV0IG5vdCBsZWFzdCwgaXQgZ2l2ZXMgYW4gZWFzeSB3YXkgdG8gcHJvYmUgdGhlCisgKiBiZWhhdmlvciBvZiB0aGUgTWFzcyBTdG9yYWdlIGRyaXZlcnMgaW4gYSBVU0IgaG9zdC4KICAqCiAgKiBCYWNraW5nIHN0b3JhZ2UgaXMgcHJvdmlkZWQgYnkgYSByZWd1bGFyIGZpbGUgb3IgYSBibG9jayBkZXZpY2UsIHNwZWNpZmllZAogICogYnkgdGhlICJmaWxlIiBtb2R1bGUgcGFyYW1ldGVyLiAgQWNjZXNzIGNhbiBiZSBsaW1pdGVkIHRvIHJlYWQtb25seSBieQotICogc2V0dGluZyB0aGUgb3B0aW9uYWwgInJvIiBtb2R1bGUgcGFyYW1ldGVyLiAgVGhlIGdhZGdldCB3aWxsIGluZGljYXRlIHRoYXQKLSAqIGl0IGhhcyByZW1vdmFibGUgbWVkaWEgaWYgdGhlIG9wdGlvbmFsICJyZW1vdmFibGUiIG1vZHVsZSBwYXJhbWV0ZXIgaXMgc2V0LgorICogc2V0dGluZyB0aGUgb3B0aW9uYWwgInJvIiBtb2R1bGUgcGFyYW1ldGVyLiAgKEZvciBDRC1ST00gZW11bGF0aW9uLAorICogYWNjZXNzIGlzIGFsd2F5cyByZWFkLW9ubHkuKSAgVGhlIGdhZGdldCB3aWxsIGluZGljYXRlIHRoYXQgaXQgaGFzCisgKiByZW1vdmFibGUgbWVkaWEgaWYgdGhlIG9wdGlvbmFsICJyZW1vdmFibGUiIG1vZHVsZSBwYXJhbWV0ZXIgaXMgc2V0LgogICoKICAqIFRoZSBnYWRnZXQgc3VwcG9ydHMgdGhlIENvbnRyb2wtQnVsayAoQ0IpLCBDb250cm9sLUJ1bGstSW50ZXJydXB0IChDQkkpLAogICogYW5kIEJ1bGstT25seSAoYWxzbyBrbm93biBhcyBCdWxrLUJ1bGstQnVsayBvciBCQkIpIHRyYW5zcG9ydHMsIHNlbGVjdGVkCkBAIC02NCw3ICs2NSwxMiBAQAogICogVGhlIGRlZmF1bHQgbnVtYmVyIG9mIExVTnMgaXMgdGFrZW4gZnJvbSB0aGUgbnVtYmVyIG9mICJmaWxlIiBlbGVtZW50czsKICAqIGl0IGlzIDEgaWYgImZpbGUiIGlzIG5vdCBnaXZlbi4gIElmICJyZW1vdmFibGUiIGlzIG5vdCBzZXQgdGhlbiBhIGJhY2tpbmcKICAqIGZpbGUgbXVzdCBiZSBzcGVjaWZpZWQgZm9yIGVhY2ggTFVOLiAgSWYgaXQgaXMgc2V0LCB0aGVuIGFuIHVuc3BlY2lmaWVkCi0gKiBvciBlbXB0eSBiYWNraW5nIGZpbGVuYW1lIG1lYW5zIHRoZSBMVU4ncyBtZWRpdW0gaXMgbm90IGxvYWRlZC4KKyAqIG9yIGVtcHR5IGJhY2tpbmcgZmlsZW5hbWUgbWVhbnMgdGhlIExVTidzIG1lZGl1bSBpcyBub3QgbG9hZGVkLiAgSWRlYWxseQorICogZWFjaCBMVU4gd291bGQgYmUgc2V0dGFibGUgaW5kZXBlbmRlbnRseSBhcyBhIGRpc2sgZHJpdmUgb3IgYSBDRC1ST00KKyAqIGRyaXZlLCBidXQgY3VycmVudGx5IGFsbCBMVU5zIGhhdmUgdG8gYmUgdGhlIHNhbWUgdHlwZS4gIFRoZSBDRC1ST00KKyAqIGVtdWxhdGlvbiBpbmNsdWRlcyBhIHNpbmdsZSBkYXRhIHRyYWNrIGFuZCBubyBhdWRpbyB0cmFja3M7IGhlbmNlIHRoZXJlCisgKiBuZWVkIGJlIG9ubHkgb25lIGJhY2tpbmcgZmlsZSBwZXIgTFVOLiAgTm90ZSBhbHNvIHRoYXQgdGhlIENELVJPTSBibG9jaworICogbGVuZ3RoIGlzIHNldCB0byA1MTIgcmF0aGVyIHRoYW4gdGhlIG1vcmUgY29tbW9uIHZhbHVlIDIwNDguCiAgKgogICogUmVxdWlyZW1lbnRzIGFyZSBtb2Rlc3Q7IG9ubHkgYSBidWxrLWluIGFuZCBhIGJ1bGstb3V0IGVuZHBvaW50IGFyZQogICogbmVlZGVkIChhbiBpbnRlcnJ1cHQtb3V0IGVuZHBvaW50IGlzIGFsc28gbmVlZGVkIGZvciBDQkkpLiAgVGhlIG1lbW9yeQpAQCAtOTEsNiArOTcsOCBAQAogICoJCQkJCVVTQiBkZXZpY2UgY29udHJvbGxlciAodXN1YWxseSB0cnVlKSwKICAqCQkJCQlib29sZWFuIHRvIHBlcm1pdCB0aGUgZHJpdmVyIHRvIGhhbHQKICAqCQkJCQlidWxrIGVuZHBvaW50cworICoJY2Ryb20JCQlEZWZhdWx0IGZhbHNlLCBib29sZWFuIGZvciB3aGV0aGVyIHRvIGVtdWxhdGUKKyAqCQkJCQlhIENELVJPTSBkcml2ZQogICoJdHJhbnNwb3J0PVhYWAkJRGVmYXVsdCBCQkIsIHRyYW5zcG9ydCBuYW1lIChDQiwgQ0JJLCBvciBCQkIpCiAgKglwcm90b2NvbD1ZWVkJCURlZmF1bHQgU0NTSSwgcHJvdG9jb2wgbmFtZSAoUkJDLCA4MDIwIG9yCiAgKgkJCQkJQVRBUEksIFFJQywgVUZJLCA4MDcwLCBvciBTQ1NJOwpAQCAtMTAzLDE1ICsxMTEsMTYgQEAKICAqCQkJCQlQQUdFX0NBQ0hFX1NJWkUpCiAgKgogICogSWYgQ09ORklHX1VTQl9GSUxFX1NUT1JBR0VfVEVTVCBpcyBub3Qgc2V0LCBvbmx5IHRoZSAiZmlsZSIsICJybyIsCi0gKiAicmVtb3ZhYmxlIiwgImx1bnMiLCBhbmQgInN0YWxsIiBvcHRpb25zIGFyZSBhdmFpbGFibGU7IGRlZmF1bHQgdmFsdWVzCi0gKiBhcmUgdXNlZCBmb3IgZXZlcnl0aGluZyBlbHNlLgorICogInJlbW92YWJsZSIsICJsdW5zIiwgInN0YWxsIiwgYW5kICJjZHJvbSIgb3B0aW9ucyBhcmUgYXZhaWxhYmxlOyBkZWZhdWx0CisgKiB2YWx1ZXMgYXJlIHVzZWQgZm9yIGV2ZXJ5dGhpbmcgZWxzZS4KICAqCiAgKiBUaGUgcGF0aG5hbWVzIG9mIHRoZSBiYWNraW5nIGZpbGVzIGFuZCB0aGUgcm8gc2V0dGluZ3MgYXJlIGF2YWlsYWJsZSBpbgogICogdGhlIGF0dHJpYnV0ZSBmaWxlcyAiZmlsZSIgYW5kICJybyIgaW4gdGhlIGx1bjxuPiBzdWJkaXJlY3Rvcnkgb2YgdGhlCiAgKiBnYWRnZXQncyBzeXNmcyBkaXJlY3RvcnkuICBJZiB0aGUgInJlbW92YWJsZSIgb3B0aW9uIGlzIHNldCwgd3JpdGluZyB0bwogICogdGhlc2UgZmlsZXMgd2lsbCBzaW11bGF0ZSBlamVjdGluZy9sb2FkaW5nIHRoZSBtZWRpdW0gKHdyaXRpbmcgYW4gZW1wdHkKICAqIGxpbmUgbWVhbnMgZWplY3QpIGFuZCBhZGp1c3RpbmcgYSB3cml0ZS1lbmFibGUgdGFiLiAgQ2hhbmdlcyB0byB0aGUgcm8KLSAqIHNldHRpbmcgYXJlIG5vdCBhbGxvd2VkIHdoZW4gdGhlIG1lZGl1bSBpcyBsb2FkZWQuCisgKiBzZXR0aW5nIGFyZSBub3QgYWxsb3dlZCB3aGVuIHRoZSBtZWRpdW0gaXMgbG9hZGVkIG9yIGlmIENELVJPTSBlbXVsYXRpb24KKyAqIGlzIGJlaW5nIHVzZWQuCiAgKgogICogVGhpcyBnYWRnZXQgZHJpdmVyIGlzIGhlYXZpbHkgYmFzZWQgb24gIkdhZGdldCBaZXJvIiBieSBEYXZpZCBCcm93bmVsbC4KICAqIFRoZSBkcml2ZXIncyBTQ1NJIGNvbW1hbmQgaW50ZXJmYWNlIHdhcyBiYXNlZCBvbiB0aGUgIkluZm9ybWF0aW9uCkBAIC0yNjEsNyArMjcwLDcgQEAKIAogI2RlZmluZSBEUklWRVJfREVTQwkJIkZpbGUtYmFja2VkIFN0b3JhZ2UgR2FkZ2V0IgogI2RlZmluZSBEUklWRVJfTkFNRQkJImdfZmlsZV9zdG9yYWdlIgotI2RlZmluZSBEUklWRVJfVkVSU0lPTgkJIjcgQXVndXN0IDIwMDciCisjZGVmaW5lIERSSVZFUl9WRVJTSU9OCQkiMjAgTm92ZW1iZXIgMjAwOCIKIAogc3RhdGljIGNvbnN0IGNoYXIgbG9uZ25hbWVbXSA9IERSSVZFUl9ERVNDOwogc3RhdGljIGNvbnN0IGNoYXIgc2hvcnRuYW1lW10gPSBEUklWRVJfTkFNRTsKQEAgLTM0MSw2ICszNTAsNyBAQAogCiAJaW50CQlyZW1vdmFibGU7CiAJaW50CQljYW5fc3RhbGw7CisJaW50CQljZHJvbTsKIAogCWNoYXIJCSp0cmFuc3BvcnRfcGFybTsKIAljaGFyCQkqcHJvdG9jb2xfcGFybTsKQEAgLTM1OSw2ICszNjksNyBAQAogCS5wcm90b2NvbF9wYXJtCQk9ICJTQ1NJIiwKIAkucmVtb3ZhYmxlCQk9IDAsCiAJLmNhbl9zdGFsbAkJPSAxLAorCS5jZHJvbQkJCT0gMCwKIAkudmVuZG9yCQkJPSBEUklWRVJfVkVORE9SX0lELAogCS5wcm9kdWN0CQk9IERSSVZFUl9QUk9EVUNUX0lELAogCS5yZWxlYXNlCQk9IDB4ZmZmZiwJLy8gVXNlIGNvbnRyb2xsZXIgY2hpcCB0eXBlCkBAIC0zODIsNiArMzkzLDkgQEAKIG1vZHVsZV9wYXJhbV9uYW1lZChzdGFsbCwgbW9kX2RhdGEuY2FuX3N0YWxsLCBib29sLCBTX0lSVUdPKTsKIE1PRFVMRV9QQVJNX0RFU0Moc3RhbGwsICJmYWxzZSB0byBwcmV2ZW50IGJ1bGsgc3RhbGxzIik7CiAKK21vZHVsZV9wYXJhbV9uYW1lZChjZHJvbSwgbW9kX2RhdGEuY2Ryb20sIGJvb2wsIFNfSVJVR08pOworTU9EVUxFX1BBUk1fREVTQyhjZHJvbSwgInRydWUgdG8gZW11bGF0ZSBjZHJvbSBpbnN0ZWFkIG9mIGRpc2siKTsKKwogCiAvKiBJbiB0aGUgbm9uLVRFU1QgdmVyc2lvbiwgb25seSB0aGUgbW9kdWxlIHBhcmFtZXRlcnMgbGlzdGVkIGFib3ZlCiAgKiBhcmUgYXZhaWxhYmxlLiAqLwpAQCAtNDExLDYgKzQyNSwxMCBAQAogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCisvKiBTQ1NJIGRldmljZSB0eXBlcyAqLworI2RlZmluZSBUWVBFX0RJU0sJMHgwMAorI2RlZmluZSBUWVBFX0NEUk9NCTB4MDUKKwogLyogVVNCIHByb3RvY29sIHZhbHVlID0gdGhlIHRyYW5zcG9ydCBtZXRob2QgKi8KICNkZWZpbmUgVVNCX1BSX0NCSQkweDAwCQkvLyBDb250cm9sL0J1bGsvSW50ZXJydXB0CiAjZGVmaW5lIFVTQl9QUl9DQgkweDAxCQkvLyBDb250cm9sL0J1bGsgdy9vIGludGVycnVwdApAQCAtNDg3LDYgKzUwNSw4IEBACiAjZGVmaW5lIFNDX1JFQURfMTIJCQkweGE4CiAjZGVmaW5lIFNDX1JFQURfQ0FQQUNJVFkJCTB4MjUKICNkZWZpbmUgU0NfUkVBRF9GT1JNQVRfQ0FQQUNJVElFUwkweDIzCisjZGVmaW5lIFNDX1JFQURfSEVBREVSCQkJMHg0NAorI2RlZmluZSBTQ19SRUFEX1RPQwkJCTB4NDMKICNkZWZpbmUgU0NfUkVMRUFTRQkJCTB4MTcKICNkZWZpbmUgU0NfUkVRVUVTVF9TRU5TRQkJMHgwMwogI2RlZmluZSBTQ19SRVNFUlZFCQkJMHgxNgpAQCAtMTg2MywyNiArMTg4MywxMCBAQAogc3RhdGljIGludCBmc3luY19zdWIoc3RydWN0IGx1biAqY3VybHVuKQogewogCXN0cnVjdCBmaWxlCSpmaWxwID0gY3VybHVuLT5maWxwOwotCXN0cnVjdCBpbm9kZQkqaW5vZGU7Ci0JaW50CQlyYywgZXJyOwogCiAJaWYgKGN1cmx1bi0+cm8gfHwgIWZpbHApCiAJCXJldHVybiAwOwotCWlmICghZmlscC0+Zl9vcC0+ZnN5bmMpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaW5vZGUgPSBmaWxwLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwotCW11dGV4X2xvY2soJmlub2RlLT5pX211dGV4KTsKLQlyYyA9IGZpbGVtYXBfZmRhdGF3cml0ZShpbm9kZS0+aV9tYXBwaW5nKTsKLQllcnIgPSBmaWxwLT5mX29wLT5mc3luYyhmaWxwLCBmaWxwLT5mX3BhdGguZGVudHJ5LCAxKTsKLQlpZiAoIXJjKQotCQlyYyA9IGVycjsKLQllcnIgPSBmaWxlbWFwX2ZkYXRhd2FpdChpbm9kZS0+aV9tYXBwaW5nKTsKLQlpZiAoIXJjKQotCQlyYyA9IGVycjsKLQltdXRleF91bmxvY2soJmlub2RlLT5pX211dGV4KTsKLQlWTERCRyhjdXJsdW4sICJmZGF0YXN5bmMgLT4gJWRcbiIsIHJjKTsKLQlyZXR1cm4gcmM7CisJcmV0dXJuIHZmc19mc3luYyhmaWxwLCBmaWxwLT5mX3BhdGguZGVudHJ5LCAxKTsKIH0KIAogc3RhdGljIHZvaWQgZnN5bmNfYWxsKHN0cnVjdCBmc2dfZGV2ICpmc2cpCkBAIC0yMDIyLDIzICsyMDI2LDI4IEBACiAJdTgJKmJ1ZiA9ICh1OCAqKSBiaC0+YnVmOwogCiAJc3RhdGljIGNoYXIgdmVuZG9yX2lkW10gPSAiTGludXggICAiOwotCXN0YXRpYyBjaGFyIHByb2R1Y3RfaWRbXSA9ICJGaWxlLVN0b3IgR2FkZ2V0IjsKKwlzdGF0aWMgY2hhciBwcm9kdWN0X2Rpc2tfaWRbXSA9ICJGaWxlLVN0b3IgR2FkZ2V0IjsKKwlzdGF0aWMgY2hhciBwcm9kdWN0X2Nkcm9tX2lkW10gPSAiRmlsZS1DRCBHYWRnZXQgICI7CiAKIAlpZiAoIWZzZy0+Y3VybHVuKSB7CQkvLyBVbnN1cHBvcnRlZCBMVU5zIGFyZSBva2F5CiAJCWZzZy0+YmFkX2x1bl9va2F5ID0gMTsKIAkJbWVtc2V0KGJ1ZiwgMCwgMzYpOwogCQlidWZbMF0gPSAweDdmOwkJLy8gVW5zdXBwb3J0ZWQsIG5vIGRldmljZS10eXBlCisJCWJ1Zls0XSA9IDMxOwkJLy8gQWRkaXRpb25hbCBsZW5ndGgKIAkJcmV0dXJuIDM2OwogCX0KIAotCW1lbXNldChidWYsIDAsIDgpOwkvLyBOb24tcmVtb3ZhYmxlLCBkaXJlY3QtYWNjZXNzIGRldmljZQorCW1lbXNldChidWYsIDAsIDgpOworCWJ1ZlswXSA9IChtb2RfZGF0YS5jZHJvbSA/IFRZUEVfQ0RST00gOiBUWVBFX0RJU0spOwogCWlmIChtb2RfZGF0YS5yZW1vdmFibGUpCiAJCWJ1ZlsxXSA9IDB4ODA7CiAJYnVmWzJdID0gMjsJCS8vIEFOU0kgU0NTSSBsZXZlbCAyCiAJYnVmWzNdID0gMjsJCS8vIFNDU0ktMiBJTlFVSVJZIGRhdGEgZm9ybWF0CiAJYnVmWzRdID0gMzE7CQkvLyBBZGRpdGlvbmFsIGxlbmd0aAogCQkJCS8vIE5vIHNwZWNpYWwgb3B0aW9ucwotCXNwcmludGYoYnVmICsgOCwgIiUtOHMlLTE2cyUwNHgiLCB2ZW5kb3JfaWQsIHByb2R1Y3RfaWQsCisJc3ByaW50ZihidWYgKyA4LCAiJS04cyUtMTZzJTA0eCIsIHZlbmRvcl9pZCwKKwkJCShtb2RfZGF0YS5jZHJvbSA/IHByb2R1Y3RfY2Ryb21faWQgOgorCQkJCXByb2R1Y3RfZGlza19pZCksCiAJCQltb2RfZGF0YS5yZWxlYXNlKTsKIAlyZXR1cm4gMzY7CiB9CkBAIC0yMTE3LDYgKzIxMjYsNzUgQEAKIH0KIAogCitzdGF0aWMgdm9pZCBzdG9yZV9jZHJvbV9hZGRyZXNzKHU4ICpkZXN0LCBpbnQgbXNmLCB1MzIgYWRkcikKK3sKKwlpZiAobXNmKSB7CisJCS8qIENvbnZlcnQgdG8gTWludXRlcy1TZWNvbmRzLUZyYW1lcyAqLworCQlhZGRyID4+PSAyOwkJLyogQ29udmVydCB0byAyMDQ4LWJ5dGUgZnJhbWVzICovCisJCWFkZHIgKz0gMio3NTsJCS8qIExlYWQtaW4gb2NjdXBpZXMgMiBzZWNvbmRzICovCisJCWRlc3RbM10gPSBhZGRyICUgNzU7CS8qIEZyYW1lcyAqLworCQlhZGRyIC89IDc1OworCQlkZXN0WzJdID0gYWRkciAlIDYwOwkvKiBTZWNvbmRzICovCisJCWFkZHIgLz0gNjA7CisJCWRlc3RbMV0gPSBhZGRyOwkJLyogTWludXRlcyAqLworCQlkZXN0WzBdID0gMDsJCS8qIFJlc2VydmVkICovCisJfSBlbHNlIHsKKwkJLyogQWJzb2x1dGUgc2VjdG9yICovCisJCXB1dF9iZTMyKGRlc3QsIGFkZHIpOworCX0KK30KKworc3RhdGljIGludCBkb19yZWFkX2hlYWRlcihzdHJ1Y3QgZnNnX2RldiAqZnNnLCBzdHJ1Y3QgZnNnX2J1ZmZoZCAqYmgpCit7CisJc3RydWN0IGx1bgkqY3VybHVuID0gZnNnLT5jdXJsdW47CisJaW50CQltc2YgPSBmc2ctPmNtbmRbMV0gJiAweDAyOworCXUzMgkJbGJhID0gZ2V0X2JlMzIoJmZzZy0+Y21uZFsyXSk7CisJdTgJCSpidWYgPSAodTggKikgYmgtPmJ1ZjsKKworCWlmICgoZnNnLT5jbW5kWzFdICYgfjB4MDIpICE9IDApIHsJCS8qIE1hc2sgYXdheSBNU0YgKi8KKwkJY3VybHVuLT5zZW5zZV9kYXRhID0gU1NfSU5WQUxJRF9GSUVMRF9JTl9DREI7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAobGJhID49IGN1cmx1bi0+bnVtX3NlY3RvcnMpIHsKKwkJY3VybHVuLT5zZW5zZV9kYXRhID0gU1NfTE9HSUNBTF9CTE9DS19BRERSRVNTX09VVF9PRl9SQU5HRTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbWVtc2V0KGJ1ZiwgMCwgOCk7CisJYnVmWzBdID0gMHgwMTsJCS8qIDIwNDggYnl0ZXMgb2YgdXNlciBkYXRhLCByZXN0IGlzIEVDICovCisJc3RvcmVfY2Ryb21fYWRkcmVzcygmYnVmWzRdLCBtc2YsIGxiYSk7CisJcmV0dXJuIDg7Cit9CisKKworc3RhdGljIGludCBkb19yZWFkX3RvYyhzdHJ1Y3QgZnNnX2RldiAqZnNnLCBzdHJ1Y3QgZnNnX2J1ZmZoZCAqYmgpCit7CisJc3RydWN0IGx1bgkqY3VybHVuID0gZnNnLT5jdXJsdW47CisJaW50CQltc2YgPSBmc2ctPmNtbmRbMV0gJiAweDAyOworCWludAkJc3RhcnRfdHJhY2sgPSBmc2ctPmNtbmRbNl07CisJdTgJCSpidWYgPSAodTggKikgYmgtPmJ1ZjsKKworCWlmICgoZnNnLT5jbW5kWzFdICYgfjB4MDIpICE9IDAgfHwJCS8qIE1hc2sgYXdheSBNU0YgKi8KKwkJCXN0YXJ0X3RyYWNrID4gMSkgeworCQljdXJsdW4tPnNlbnNlX2RhdGEgPSBTU19JTlZBTElEX0ZJRUxEX0lOX0NEQjsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbWVtc2V0KGJ1ZiwgMCwgMjApOworCWJ1ZlsxXSA9ICgyMC0yKTsJCS8qIFRPQyBkYXRhIGxlbmd0aCAqLworCWJ1ZlsyXSA9IDE7CQkJLyogRmlyc3QgdHJhY2sgbnVtYmVyICovCisJYnVmWzNdID0gMTsJCQkvKiBMYXN0IHRyYWNrIG51bWJlciAqLworCWJ1Zls1XSA9IDB4MTY7CQkJLyogRGF0YSB0cmFjaywgY29weWluZyBhbGxvd2VkICovCisJYnVmWzZdID0gMHgwMTsJCQkvKiBPbmx5IHRyYWNrIGlzIG51bWJlciAxICovCisJc3RvcmVfY2Ryb21fYWRkcmVzcygmYnVmWzhdLCBtc2YsIDApOworCisJYnVmWzEzXSA9IDB4MTY7CQkJLyogTGVhZC1vdXQgdHJhY2sgaXMgZGF0YSAqLworCWJ1ZlsxNF0gPSAweEFBOwkJCS8qIExlYWQtb3V0IHRyYWNrIG51bWJlciAqLworCXN0b3JlX2Nkcm9tX2FkZHJlc3MoJmJ1ZlsxNl0sIG1zZiwgY3VybHVuLT5udW1fc2VjdG9ycyk7CisJcmV0dXJuIDIwOworfQorCisKIHN0YXRpYyBpbnQgZG9fbW9kZV9zZW5zZShzdHJ1Y3QgZnNnX2RldiAqZnNnLCBzdHJ1Y3QgZnNnX2J1ZmZoZCAqYmgpCiB7CiAJc3RydWN0IGx1bgkqY3VybHVuID0gZnNnLT5jdXJsdW47CkBAIC0yODY0LDYgKzI5NDIsMjYgQEAKIAkJCXJlcGx5ID0gZG9fcmVhZF9jYXBhY2l0eShmc2csIGJoKTsKIAkJYnJlYWs7CiAKKwljYXNlIFNDX1JFQURfSEVBREVSOgorCQlpZiAoIW1vZF9kYXRhLmNkcm9tKQorCQkJZ290byB1bmtub3duX2NtbmQ7CisJCWZzZy0+ZGF0YV9zaXplX2Zyb21fY21uZCA9IGdldF9iZTE2KCZmc2ctPmNtbmRbN10pOworCQlpZiAoKHJlcGx5ID0gY2hlY2tfY29tbWFuZChmc2csIDEwLCBEQVRBX0RJUl9UT19IT1NULAorCQkJCSgzPDw3KSB8ICgweDFmPDwxKSwgMSwKKwkJCQkiUkVBRCBIRUFERVIiKSkgPT0gMCkKKwkJCXJlcGx5ID0gZG9fcmVhZF9oZWFkZXIoZnNnLCBiaCk7CisJCWJyZWFrOworCisJY2FzZSBTQ19SRUFEX1RPQzoKKwkJaWYgKCFtb2RfZGF0YS5jZHJvbSkKKwkJCWdvdG8gdW5rbm93bl9jbW5kOworCQlmc2ctPmRhdGFfc2l6ZV9mcm9tX2NtbmQgPSBnZXRfYmUxNigmZnNnLT5jbW5kWzddKTsKKwkJaWYgKChyZXBseSA9IGNoZWNrX2NvbW1hbmQoZnNnLCAxMCwgREFUQV9ESVJfVE9fSE9TVCwKKwkJCQkoNzw8NikgfCAoMTw8MSksIDEsCisJCQkJIlJFQUQgVE9DIikpID09IDApCisJCQlyZXBseSA9IGRvX3JlYWRfdG9jKGZzZywgYmgpOworCQlicmVhazsKKwogCWNhc2UgU0NfUkVBRF9GT1JNQVRfQ0FQQUNJVElFUzoKIAkJZnNnLT5kYXRhX3NpemVfZnJvbV9jbW5kID0gZ2V0X2JlMTYoJmZzZy0+Y21uZFs3XSk7CiAJCWlmICgocmVwbHkgPSBjaGVja19jb21tYW5kKGZzZywgMTAsIERBVEFfRElSX1RPX0hPU1QsCkBAIC0yOTQ5LDYgKzMwNDcsNyBAQAogCQkvLyBGYWxsIHRocm91Z2gKIAogCWRlZmF1bHQ6CisgdW5rbm93bl9jbW5kOgogCQlmc2ctPmRhdGFfc2l6ZV9mcm9tX2NtbmQgPSAwOwogCQlzcHJpbnRmKHVua25vd24sICJVbmtub3duIHglMDJ4IiwgZnNnLT5jbW5kWzBdKTsKIAkJaWYgKChyZXBseSA9IGNoZWNrX2NvbW1hbmQoZnNnLCBmc2ctPmNtbmRfc2l6ZSwKQEAgLTM1MTQsNiArMzYxMyw3IEBACiAJc3RydWN0IGlub2RlCQkJKmlub2RlID0gTlVMTDsKIAlsb2ZmX3QJCQkJc2l6ZTsKIAlsb2ZmX3QJCQkJbnVtX3NlY3RvcnM7CisJbG9mZl90CQkJCW1pbl9zZWN0b3JzOwogCiAJLyogUi9XIGlmIHdlIGNhbiwgUi9PIGlmIHdlIG11c3QgKi8KIAlybyA9IGN1cmx1bi0+cm87CkBAIC0zNTU3LDggKzM2NTcsMTkgQEAKIAkJcmMgPSAoaW50KSBzaXplOwogCQlnb3RvIG91dDsKIAl9Ci0JbnVtX3NlY3RvcnMgPSBzaXplID4+IDk7CS8vIEZpbGUgc2l6ZSBpbiA1MTItYnl0ZSBzZWN0b3JzCi0JaWYgKG51bV9zZWN0b3JzID09IDApIHsKKwludW1fc2VjdG9ycyA9IHNpemUgPj4gOTsJLy8gRmlsZSBzaXplIGluIDUxMi1ieXRlIGJsb2NrcworCW1pbl9zZWN0b3JzID0gMTsKKwlpZiAobW9kX2RhdGEuY2Ryb20pIHsKKwkJbnVtX3NlY3RvcnMgJj0gfjM7CS8vIFJlZHVjZSB0byBhIG11bHRpcGxlIG9mIDIwNDgKKwkJbWluX3NlY3RvcnMgPSAzMDAqNDsJLy8gU21hbGxlc3QgdHJhY2sgaXMgMzAwIGZyYW1lcworCQlpZiAobnVtX3NlY3RvcnMgPj0gMjU2KjYwKjc1KjQpIHsKKwkJCW51bV9zZWN0b3JzID0gKDI1Nio2MCo3NSAtIDEpICogNDsKKwkJCUxJTkZPKGN1cmx1biwgImZpbGUgdG9vIGJpZzogJXNcbiIsIGZpbGVuYW1lKTsKKwkJCUxJTkZPKGN1cmx1biwgInVzaW5nIG9ubHkgZmlyc3QgJWQgYmxvY2tzXG4iLAorCQkJCQkoaW50KSBudW1fc2VjdG9ycyk7CisJCX0KKwl9CisJaWYgKG51bV9zZWN0b3JzIDwgbWluX3NlY3RvcnMpIHsKIAkJTElORk8oY3VybHVuLCAiZmlsZSB0b28gc21hbGw6ICVzXG4iLCBmaWxlbmFtZSk7CiAJCXJjID0gLUVUT09TTUFMTDsKIAkJZ290byBvdXQ7CkBAIC0zODYxLDkgKzM5NzIsMTIgQEAKIAkJZ290byBvdXQ7CiAKIAlpZiAobW9kX2RhdGEucmVtb3ZhYmxlKSB7CS8vIEVuYWJsZSB0aGUgc3RvcmVfeHh4IGF0dHJpYnV0ZXMKLQkJZGV2X2F0dHJfcm8uYXR0ci5tb2RlID0gZGV2X2F0dHJfZmlsZS5hdHRyLm1vZGUgPSAwNjQ0OwotCQlkZXZfYXR0cl9yby5zdG9yZSA9IHN0b3JlX3JvOworCQlkZXZfYXR0cl9maWxlLmF0dHIubW9kZSA9IDA2NDQ7CiAJCWRldl9hdHRyX2ZpbGUuc3RvcmUgPSBzdG9yZV9maWxlOworCQlpZiAoIW1vZF9kYXRhLmNkcm9tKSB7CisJCQlkZXZfYXR0cl9yby5hdHRyLm1vZGUgPSAwNjQ0OworCQkJZGV2X2F0dHJfcm8uc3RvcmUgPSBzdG9yZV9ybzsKKwkJfQogCX0KIAogCS8qIEZpbmQgb3V0IGhvdyBtYW55IExVTnMgdGhlcmUgc2hvdWxkIGJlICovCkBAIC0zODg4LDYgKzQwMDIsOCBAQAogCWZvciAoaSA9IDA7IGkgPCBmc2ctPm5sdW5zOyArK2kpIHsKIAkJY3VybHVuID0gJmZzZy0+bHVuc1tpXTsKIAkJY3VybHVuLT5ybyA9IG1vZF9kYXRhLnJvW2ldOworCQlpZiAobW9kX2RhdGEuY2Ryb20pCisJCQljdXJsdW4tPnJvID0gMTsKIAkJY3VybHVuLT5kZXYucmVsZWFzZSA9IGx1bl9yZWxlYXNlOwogCQljdXJsdW4tPmRldi5wYXJlbnQgPSAmZ2FkZ2V0LT5kZXY7CiAJCWN1cmx1bi0+ZGV2LmRyaXZlciA9ICZmc2dfZHJpdmVyLmRyaXZlcjsKQEAgLTQwNDcsOSArNDE2Myw5IEBACiAJCQltb2RfZGF0YS5wcm90b2NvbF9uYW1lLCBtb2RfZGF0YS5wcm90b2NvbF90eXBlKTsKIAlEQkcoZnNnLCAiVmVuZG9ySUQ9eCUwNHgsIFByb2R1Y3RJRD14JTA0eCwgUmVsZWFzZT14JTA0eFxuIiwKIAkJCW1vZF9kYXRhLnZlbmRvciwgbW9kX2RhdGEucHJvZHVjdCwgbW9kX2RhdGEucmVsZWFzZSk7Ci0JREJHKGZzZywgInJlbW92YWJsZT0lZCwgc3RhbGw9JWQsIGJ1Zmxlbj0ldVxuIiwKKwlEQkcoZnNnLCAicmVtb3ZhYmxlPSVkLCBzdGFsbD0lZCwgY2Ryb209JWQsIGJ1Zmxlbj0ldVxuIiwKIAkJCW1vZF9kYXRhLnJlbW92YWJsZSwgbW9kX2RhdGEuY2FuX3N0YWxsLAotCQkJbW9kX2RhdGEuYnVmbGVuKTsKKwkJCW1vZF9kYXRhLmNkcm9tLCBtb2RfZGF0YS5idWZsZW4pOwogCURCRyhmc2csICJJL08gdGhyZWFkIHBpZDogJWRcbiIsIHRhc2tfcGlkX25yKGZzZy0+dGhyZWFkX3Rhc2spKTsKIAogCXNldF9iaXQoUkVHSVNURVJFRCwgJmZzZy0+YXRvbWljX2JpdGZsYWdzKTsKQEAgLTQwNjYsNiArNDE4Miw3IEBACiAJZnNnLT5zdGF0ZSA9IEZTR19TVEFURV9URVJNSU5BVEVEOwkvLyBUaGUgdGhyZWFkIGlzIGRlYWQKIAlmc2dfdW5iaW5kKGdhZGdldCk7CiAJY2xvc2VfYWxsX2JhY2tpbmdfZmlsZXMoZnNnKTsKKwljb21wbGV0ZSgmZnNnLT50aHJlYWRfbm90aWZpZXIpOwogCXJldHVybiByYzsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L2ZzbF9xZV91ZGMuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9mc2xfcWVfdWRjLmMKaW5kZXggYjM0MDhmZi4uZDZjNWJjZCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L2ZzbF9xZV91ZGMuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZnNsX3FlX3VkYy5jCkBAIC0yNiw2ICsyNiw3IEBACiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CkBAIC0zNzAsNiArMzcxLDkgQEAKIAkvKiBhbGxvYyBtdWx0aS1yYW0gZm9yIEJEIHJpbmdzIGFuZCBzZXQgdGhlIGVwIHBhcmFtZXRlcnMgKi8KIAl0bXBfYWRkciA9IGNwbV9tdXJhbV9hbGxvYyhzaXplb2Yoc3RydWN0IHFlX2JkKSAqIChiZHJpbmdfbGVuICsKIAkJCQlVU0JfQkRSSU5HX0xFTl9UWCksIFFFX0FMSUdOTUVOVF9PRl9CRCk7CisJaWYgKElTX0VSUl9WQUxVRSh0bXBfYWRkcikpCisJCXJldHVybiAtRU5PTUVNOworCiAJb3V0X2JlMTYoJmVwcGFyYW0tPnJiYXNlLCAodTE2KXRtcF9hZGRyKTsKIAlvdXRfYmUxNigmZXBwYXJhbS0+dGJhc2UsICh1MTYpKHRtcF9hZGRyICsKIAkJCQkoc2l6ZW9mKHN0cnVjdCBxZV9iZCkgKiBiZHJpbmdfbGVuKSkpOwpAQCAtNjg5LDcgKzY5Myw3IEBACiBlbl9kb25lMToKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ1ZGMtPmxvY2ssIGZsYWdzKTsKIGVuX2RvbmU6Ci0JZGV2X2RiZyh1ZGMtPmRldiwgImZhaWxlZCB0byBpbml0aWFsaXplICVzXG4iLCBlcC0+ZXAubmFtZSk7CisJZGV2X2Vycih1ZGMtPmRldiwgImZhaWxlZCB0byBpbml0aWFsaXplICVzXG4iLCBlcC0+ZXAubmFtZSk7CiAJcmV0dXJuIC1FTk9ERVY7CiB9CiAKQEAgLTI0MDgsNiArMjQxMiw4IEBACiAJdG1wX2FkZHIgPSBjcG1fbXVyYW1fYWxsb2MoKFVTQl9NQVhfRU5EUE9JTlRTICoKIAkJCQkJc2l6ZW9mKHN0cnVjdCB1c2JfZXBfcGFyYSkpLAogCQkJCQkgICBVU0JfRVBfUEFSQV9BTElHTk1FTlQpOworCWlmIChJU19FUlJfVkFMVUUodG1wX2FkZHIpKQorCQlnb3RvIGNsZWFudXA7CiAKIAlmb3IgKGkgPSAwOyBpIDwgVVNCX01BWF9FTkRQT0lOVFM7IGkrKykgewogCQlvdXRfYmUxNigmdXNicHJhbS0+ZXBwdHJbaV0sICh1MTYpdG1wX2FkZHIpOwpAQCAtMjUxMyw3ICsyNTE5LDcgQEAKIAkvKiBJbml0aWFsaXplIHRoZSB1ZGMgc3RydWN0dXJlIGluY2x1ZGluZyBRSCBtZW1iZXIgYW5kIG90aGVyIG1lbWJlciAqLwogCXVkY19jb250cm9sbGVyID0gcWVfdWRjX2NvbmZpZyhvZmRldik7CiAJaWYgKCF1ZGNfY29udHJvbGxlcikgewotCQlkZXZfZGJnKCZvZmRldi0+ZGV2LCAidWRjX2NvbnRyb2xsIGlzIE5VTExcbiIpOworCQlkZXZfZXJyKCZvZmRldi0+ZGV2LCAiZmFpbGVkIHRvIGluaXRpYWxpemVcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKQEAgLTI1NDUsNyArMjU1MSw3IEBACiAKIAlkZXZpY2VfaW5pdGlhbGl6ZSgmdWRjX2NvbnRyb2xsZXItPmdhZGdldC5kZXYpOwogCi0Jc3RyY3B5KHVkY19jb250cm9sbGVyLT5nYWRnZXQuZGV2LmJ1c19pZCwgImdhZGdldCIpOworCWRldl9zZXRfbmFtZSgmdWRjX2NvbnRyb2xsZXItPmdhZGdldC5kZXYsICJnYWRnZXQiKTsKIAogCXVkY19jb250cm9sbGVyLT5nYWRnZXQuZGV2LnJlbGVhc2UgPSBxZV91ZGNfcmVsZWFzZTsKIAl1ZGNfY29udHJvbGxlci0+Z2FkZ2V0LmRldi5wYXJlbnQgPSAmb2ZkZXYtPmRldjsKQEAgLTI1NjgsNyArMjU3NCw3IEBACiAJLyogY3JlYXRlIGEgYnVmIGZvciBaTFAgc2VuZCwgbmVlZCB0byByZW1haW4gemVyb2VkICovCiAJdWRjX2NvbnRyb2xsZXItPm51bGxidWYgPSBremFsbG9jKDI1NiwgR0ZQX0tFUk5FTCk7CiAJaWYgKHVkY19jb250cm9sbGVyLT5udWxsYnVmID09IE5VTEwpIHsKLQkJZGV2X2RiZyh1ZGNfY29udHJvbGxlci0+ZGV2LCAiY2Fubm90IGFsbG9jIG51bGxidWZcbiIpOworCQlkZXZfZXJyKHVkY19jb250cm9sbGVyLT5kZXYsICJjYW5ub3QgYWxsb2MgbnVsbGJ1ZlxuIik7CiAJCXJldCA9IC1FTk9NRU07CiAJCWdvdG8gZXJyMzsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvZ2FkZ2V0X2NoaXBzLmggYi9kcml2ZXJzL3VzYi9nYWRnZXQvZ2FkZ2V0X2NoaXBzLmgKaW5kZXggNGUzMTA3ZC4uZWM2ZDQzOSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L2dhZGdldF9jaGlwcy5oCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9nYWRnZXRfY2hpcHMuaApAQCAtMTEwLDcgKzExMCw2IEBACiAjZGVmaW5lIGdhZGdldF9pc19hdDkxKGcpCTAKICNlbmRpZgogCi0vKiBzdGF0dXMgdW5jbGVhciAqLwogI2lmZGVmIENPTkZJR19VU0JfR0FER0VUX0lNWAogI2RlZmluZSBnYWRnZXRfaXNfaW14KGcpCSFzdHJjbXAoImlteF91ZGMiLCAoZyktPm5hbWUpCiAjZWxzZQpAQCAtMTU4LDYgKzE1NywxMSBAQAogI2RlZmluZSBnYWRnZXRfaXNfZnNsX3FlKGcpCTAKICNlbmRpZgogCisjaWZkZWYgQ09ORklHX1VTQl9HQURHRVRfQ0kxM1hYWAorI2RlZmluZSBnYWRnZXRfaXNfY2kxM3h4eChnKQkoIXN0cmNtcCgiY2kxM3h4eF91ZGMiLCAoZyktPm5hbWUpKQorI2Vsc2UKKyNkZWZpbmUgZ2FkZ2V0X2lzX2NpMTN4eHgoZykJMAorI2VuZGlmCiAKIC8vIENPTkZJR19VU0JfR0FER0VUX1NYMgogLy8gQ09ORklHX1VTQl9HQURHRVRfQVUxWDAwCkBAIC0yMjUsNiArMjI5LDggQEAKIAkJcmV0dXJuIDB4MjE7CiAJZWxzZSBpZiAoZ2FkZ2V0X2lzX2ZzbF9xZShnYWRnZXQpKQogCQlyZXR1cm4gMHgyMjsKKwllbHNlIGlmIChnYWRnZXRfaXNfY2kxM3h4eChnYWRnZXQpKQorCQlyZXR1cm4gMHgyMzsKIAlyZXR1cm4gLUVOT0VOVDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L2dva3VfdWRjLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZ29rdV91ZGMuYwppbmRleCA2MGFhMDQ4Li42MzQxOWM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvZ29rdV91ZGMuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZ29rdV91ZGMuYwpAQCAtMTM0OSw3ICsxMzQ5LDcgQEAKIAlpbnQJCQlyZXR2YWw7CiAKIAlpZiAoIWRyaXZlcgotCQkJfHwgZHJpdmVyLT5zcGVlZCAhPSBVU0JfU1BFRURfRlVMTAorCQkJfHwgZHJpdmVyLT5zcGVlZCA8IFVTQl9TUEVFRF9GVUxMCiAJCQl8fCAhZHJpdmVyLT5iaW5kCiAJCQl8fCAhZHJpdmVyLT5kaXNjb25uZWN0CiAJCQl8fCAhZHJpdmVyLT5zZXR1cCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9pbXhfdWRjLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvaW14X3VkYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkZThmZGYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvaW14X3VkYy5jCkBAIC0wLDAgKzEsMTUxNiBAQAorLyoKKyAqCWRyaXZlci91c2IvZ2FkZ2V0L2lteF91ZGMuYworICoKKyAqCUNvcHlyaWdodCAoQykgMjAwNSBNaWtlIExlZShlZW1pa2VAZ21haWwuY29tKQorICoJQ29weXJpZ2h0IChDKSAyMDA4IERhcml1cyBBdWd1bGlzIDxhdWd1bGlzLmRhcml1c0BnbWFpbC5jb20+CisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKgl0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICoJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqCWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKglNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKglHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisKKyNpbmNsdWRlIDxsaW51eC91c2IvY2g5Lmg+CisjaW5jbHVkZSA8bGludXgvdXNiL2dhZGdldC5oPgorCisjaW5jbHVkZSA8bWFjaC91c2IuaD4KKyNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CisKKyNpbmNsdWRlICJpbXhfdWRjLmgiCisKK3N0YXRpYyBjb25zdCBjaGFyIGRyaXZlcl9uYW1lW10gPSAiaW14X3VkYyI7CitzdGF0aWMgY29uc3QgY2hhciBlcDBuYW1lW10gPSAiZXAwIjsKKwordm9pZCBlcDBfY2hnX3N0YXQoY29uc3QgY2hhciAqbGFiZWwsIHN0cnVjdCBpbXhfdWRjX3N0cnVjdCAqaW14X3VzYiwKKwkJCQkJCQllbnVtIGVwMF9zdGF0ZSBzdGF0KTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElNWCBVREMgaGFyZHdhcmUgcmVsYXRlZCBmdW5jdGlvbnMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKwordm9pZCBpbXhfdWRjX2VuYWJsZShzdHJ1Y3QgaW14X3VkY19zdHJ1Y3QgKmlteF91c2IpCit7CisJaW50IHRlbXAgPSBfX3Jhd19yZWFkbChpbXhfdXNiLT5iYXNlICsgVVNCX0NUUkwpOworCV9fcmF3X3dyaXRlbCh0ZW1wIHwgQ1RSTF9GRV9FTkEgfCBDVFJMX0FGRV9FTkEsIGlteF91c2ItPmJhc2UgKyBVU0JfQ1RSTCk7CisJaW14X3VzYi0+Z2FkZ2V0LnNwZWVkID0gVVNCX1NQRUVEX0ZVTEw7Cit9CisKK3ZvaWQgaW14X3VkY19kaXNhYmxlKHN0cnVjdCBpbXhfdWRjX3N0cnVjdCAqaW14X3VzYikKK3sKKwlpbnQgdGVtcCA9IF9fcmF3X3JlYWRsKGlteF91c2ItPmJhc2UgKyBVU0JfQ1RSTCk7CisKKwlfX3Jhd193cml0ZWwodGVtcCAmIH4oQ1RSTF9GRV9FTkEgfCBDVFJMX0FGRV9FTkEpLAorCQkgaW14X3VzYi0+YmFzZSArIFVTQl9DVFJMKTsKKworCWVwMF9jaGdfc3RhdChfX2Z1bmNfXywgaW14X3VzYiwgRVAwX0lETEUpOworCWlteF91c2ItPmdhZGdldC5zcGVlZCA9IFVTQl9TUEVFRF9VTktOT1dOOworfQorCit2b2lkIGlteF91ZGNfcmVzZXQoc3RydWN0IGlteF91ZGNfc3RydWN0ICppbXhfdXNiKQoreworCWludCB0ZW1wID0gX19yYXdfcmVhZGwoaW14X3VzYi0+YmFzZSArIFVTQl9FTkFCKTsKKworCS8qIHNldCBSU1QgYml0ICovCisJX19yYXdfd3JpdGVsKHRlbXAgfCBFTkFCX1JTVCwgaW14X3VzYi0+YmFzZSArIFVTQl9FTkFCKTsKKworCS8qIHdhaXQgUlNUIGJpdCB0byBjbGVhciAqLworCWRvIHt9IHdoaWxlIChfX3Jhd19yZWFkbChpbXhfdXNiLT5iYXNlICsgVVNCX0VOQUIpICYgRU5BQl9SU1QpOworCisJLyogd2FpdCBDRkcgYml0IHRvIGFzc2VydCAqLworCWRvIHt9IHdoaWxlICghKF9fcmF3X3JlYWRsKGlteF91c2ItPmJhc2UgKyBVU0JfREFEUikgJiBEQURSX0NGRykpOworCisJLyogdWRjIG1vZHVsZSBpcyBub3cgcmVhZHkgKi8KK30KKwordm9pZCBpbXhfdWRjX2NvbmZpZyhzdHJ1Y3QgaW14X3VkY19zdHJ1Y3QgKmlteF91c2IpCit7CisJdTggZXBfY29uZls1XTsKKwl1OCBpLCBqLCBjZmc7CisJc3RydWN0IGlteF9lcF9zdHJ1Y3QgKmlteF9lcDsKKworCS8qIHdhaXQgQ0ZHIGJpdCB0byBhc3NlcnQgKi8KKwlkbyB7fSB3aGlsZSAoIShfX3Jhd19yZWFkbChpbXhfdXNiLT5iYXNlICsgVVNCX0RBRFIpICYgREFEUl9DRkcpKTsKKworCS8qIERvd25sb2FkIHRoZSBlbmRwb2ludCBidWZmZXIgZm9yIGVuZHBvaW50IDAuICovCisJZm9yIChqID0gMDsgaiA8IDU7IGorKykgeworCQlpID0gKGogPT0gMiA/IGlteF91c2ItPmlteF9lcFswXS5maWZvc2l6ZSA6IDB4MDApOworCQlfX3Jhd193cml0ZWIoaSwgaW14X3VzYi0+YmFzZSArIFVTQl9EREFUKTsKKwkJZG8ge30gd2hpbGUgKF9fcmF3X3JlYWRsKGlteF91c2ItPmJhc2UgKyBVU0JfREFEUikgJiBEQURSX0JTWSk7CisJfQorCisJLyogRG93bmxvYWQgdGhlIGVuZHBvaW50IGJ1ZmZlcnMgZm9yIGVuZHBvaW50cyAxLTUuCisJICogV2Ugc3BlY2lmeSB0d28gY29uZmlndXJhdGlvbnMsIG9uZSBpbnRlcmZhY2UKKwkgKi8KKwlmb3IgKGNmZyA9IDE7IGNmZyA8IDM7IGNmZysrKSB7CisJCWZvciAoaSA9IDE7IGkgPCBJTVhfVVNCX05CX0VQOyBpKyspIHsKKwkJCWlteF9lcCA9ICZpbXhfdXNiLT5pbXhfZXBbaV07CisJCQkvKiBFUCBubyB8IENvbmZpZyBubyAqLworCQkJZXBfY29uZlswXSA9IChpIDw8IDQpIHwgKGNmZyA8PCAyKTsKKwkJCS8qIFR5cGUgfCBEaXJlY3Rpb24gKi8KKwkJCWVwX2NvbmZbMV0gPSAoaW14X2VwLT5ibUF0dHJpYnV0ZXMgPDwgMykgfAorCQkJCQkoRVBfRElSKGlteF9lcCkgPDwgMik7CisJCQkvKiBNYXggcGFja2V0IHNpemUgKi8KKwkJCWVwX2NvbmZbMl0gPSBpbXhfZXAtPmZpZm9zaXplOworCQkJLyogVFJYVFlQICovCisJCQllcF9jb25mWzNdID0gMHhDMDsKKwkJCS8qIEZJRk8gbm8gKi8KKwkJCWVwX2NvbmZbNF0gPSBpOworCisJCQlEX0lOSShpbXhfdXNiLT5kZXYsCisJCQkJIjwlcz4gZXAlZF9jb25mWyVkXToiCisJCQkJIlslMDJ4LSUwMngtJTAyeC0lMDJ4LSUwMnhdXG4iLAorCQkJCV9fZnVuY19fLCBpLCBjZmcsCisJCQkJZXBfY29uZlswXSwgZXBfY29uZlsxXSwgZXBfY29uZlsyXSwKKwkJCQllcF9jb25mWzNdLCBlcF9jb25mWzRdKTsKKworCQkJZm9yIChqID0gMDsgaiA8IDU7IGorKykgeworCQkJCV9fcmF3X3dyaXRlYihlcF9jb25mW2pdLAorCQkJCQlpbXhfdXNiLT5iYXNlICsgVVNCX0REQVQpOworCQkJCWRvIHt9IHdoaWxlIChfX3Jhd19yZWFkbChpbXhfdXNiLT5iYXNlICsgVVNCX0RBRFIpCisJCQkJCSYgREFEUl9CU1kpOworCQkJfQorCQl9CisJfQorCisJLyogd2FpdCBDRkcgYml0IHRvIGNsZWFyICovCisJZG8ge30gd2hpbGUgKF9fcmF3X3JlYWRsKGlteF91c2ItPmJhc2UgKyBVU0JfREFEUikgJiBEQURSX0NGRyk7Cit9CisKK3ZvaWQgaW14X3VkY19pbml0X2lycShzdHJ1Y3QgaW14X3VkY19zdHJ1Y3QgKmlteF91c2IpCit7CisJaW50IGk7CisKKwkvKiBNYXNrIGFuZCBjbGVhciBhbGwgaXJxcyAqLworCV9fcmF3X3dyaXRlbCgweEZGRkZGRkZGLCBpbXhfdXNiLT5iYXNlICsgVVNCX01BU0spOworCV9fcmF3X3dyaXRlbCgweEZGRkZGRkZGLCBpbXhfdXNiLT5iYXNlICsgVVNCX0lOVFIpOworCWZvciAoaSA9IDA7IGkgPCBJTVhfVVNCX05CX0VQOyBpKyspIHsKKwkJX19yYXdfd3JpdGVsKDB4MUZGLCBpbXhfdXNiLT5iYXNlICsgVVNCX0VQX01BU0soaSkpOworCQlfX3Jhd193cml0ZWwoMHgxRkYsIGlteF91c2ItPmJhc2UgKyBVU0JfRVBfSU5UUihpKSk7CisJfQorCisJLyogRW5hYmxlIFVTQiBpcnFzICovCisJX19yYXdfd3JpdGVsKElOVFJfTVNPRiB8IElOVFJfRlJBTUVfTUFUQ0gsIGlteF91c2ItPmJhc2UgKyBVU0JfTUFTSyk7CisKKwkvKiBFbmFibGUgRVAwIGlycXMgKi8KKwlfX3Jhd193cml0ZWwoMHgxRkYgJiB+KEVQSU5UUl9ERVZSRVEgfCBFUElOVFJfTURFVlJFUSB8IEVQSU5UUl9FT1QKKwkJfCBFUElOVFJfRU9GIHwgRVBJTlRSX0ZJRk9fRU1QVFkgfCBFUElOVFJfRklGT19GVUxMKSwKKwkJaW14X3VzYi0+YmFzZSArIFVTQl9FUF9NQVNLKDApKTsKK30KKwordm9pZCBpbXhfdWRjX2luaXRfZXAoc3RydWN0IGlteF91ZGNfc3RydWN0ICppbXhfdXNiKQoreworCWludCBpLCBtYXgsIHRlbXA7CisJc3RydWN0IGlteF9lcF9zdHJ1Y3QgKmlteF9lcDsKKwlmb3IgKGkgPSAwOyBpIDwgSU1YX1VTQl9OQl9FUDsgaSsrKSB7CisJCWlteF9lcCA9ICZpbXhfdXNiLT5pbXhfZXBbaV07CisJCXN3aXRjaCAoaW14X2VwLT5maWZvc2l6ZSkgeworCQljYXNlIDg6CisJCQltYXggPSAwOworCQkJYnJlYWs7CisJCWNhc2UgMTY6CisJCQltYXggPSAxOworCQkJYnJlYWs7CisJCWNhc2UgMzI6CisJCQltYXggPSAyOworCQkJYnJlYWs7CisJCWNhc2UgNjQ6CisJCQltYXggPSAzOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQltYXggPSAxOworCQkJYnJlYWs7CisJCX0KKwkJdGVtcCA9IChFUF9ESVIoaW14X2VwKSA8PCA3KSB8IChtYXggPDwgNSkKKwkJCXwgKGlteF9lcC0+Ym1BdHRyaWJ1dGVzIDw8IDMpOworCQlfX3Jhd193cml0ZWwodGVtcCwgaW14X3VzYi0+YmFzZSArIFVTQl9FUF9TVEFUKGkpKTsKKwkJX19yYXdfd3JpdGVsKHRlbXAgfCBFUFNUQVRfRkxVU0gsIGlteF91c2ItPmJhc2UgKyBVU0JfRVBfU1RBVChpKSk7CisJCURfSU5JKGlteF91c2ItPmRldiwgIjwlcz4gZXAlZF9zdGF0ICUwOHhcbiIsIF9fZnVuY19fLCBpLAorCQkJX19yYXdfcmVhZGwoaW14X3VzYi0+YmFzZSArIFVTQl9FUF9TVEFUKGkpKSk7CisJfQorfQorCit2b2lkIGlteF91ZGNfaW5pdF9maWZvKHN0cnVjdCBpbXhfdWRjX3N0cnVjdCAqaW14X3VzYikKK3sKKwlpbnQgaSwgdGVtcDsKKwlzdHJ1Y3QgaW14X2VwX3N0cnVjdCAqaW14X2VwOworCWZvciAoaSA9IDA7IGkgPCBJTVhfVVNCX05CX0VQOyBpKyspIHsKKwkJaW14X2VwID0gJmlteF91c2ItPmlteF9lcFtpXTsKKworCQkvKiBGaWZvIGNvbnRyb2wgKi8KKwkJdGVtcCA9IEVQX0RJUihpbXhfZXApID8gMHgwQjAwMDAwMCA6IDB4MEYwMDAwMDA7CisJCV9fcmF3X3dyaXRlbCh0ZW1wLCBpbXhfdXNiLT5iYXNlICsgVVNCX0VQX0ZDVFJMKGkpKTsKKwkJRF9JTkkoaW14X3VzYi0+ZGV2LCAiPCVzPiBlcCVkX2ZjdHJsICUwOHhcbiIsIF9fZnVuY19fLCBpLAorCQkJX19yYXdfcmVhZGwoaW14X3VzYi0+YmFzZSArIFVTQl9FUF9GQ1RSTChpKSkpOworCisJCS8qIEZpZm8gYWxhcm0gKi8KKwkJdGVtcCA9IChpID8gaW14X2VwLT5maWZvc2l6ZSAvIDIgOiAwKTsKKwkJX19yYXdfd3JpdGVsKHRlbXAsIGlteF91c2ItPmJhc2UgKyBVU0JfRVBfRkFMUk0oaSkpOworCQlEX0lOSShpbXhfdXNiLT5kZXYsICI8JXM+IGVwJWRfZmFscm0gJTA4eFxuIiwgX19mdW5jX18sIGksCisJCQlfX3Jhd19yZWFkbChpbXhfdXNiLT5iYXNlICsgVVNCX0VQX0ZBTFJNKGkpKSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBpbXhfdWRjX2luaXQoc3RydWN0IGlteF91ZGNfc3RydWN0ICppbXhfdXNiKQoreworCS8qIFJlc2V0IFVEQyAqLworCWlteF91ZGNfcmVzZXQoaW14X3VzYik7CisKKwkvKiBEb3dubG9hZCBjb25maWcgdG8gZW5wb2ludCBidWZmZXIgKi8KKwlpbXhfdWRjX2NvbmZpZyhpbXhfdXNiKTsKKworCS8qIFNldHVwIGludGVycnVwcyAqLworCWlteF91ZGNfaW5pdF9pcnEoaW14X3VzYik7CisKKwkvKiBTZXR1cCBlbmRwb2ludHMgKi8KKwlpbXhfdWRjX2luaXRfZXAoaW14X3VzYik7CisKKwkvKiBTZXR1cCBmaWZvcyAqLworCWlteF91ZGNfaW5pdF9maWZvKGlteF91c2IpOworfQorCit2b2lkIGlteF9lcF9pcnFfZW5hYmxlKHN0cnVjdCBpbXhfZXBfc3RydWN0ICppbXhfZXApCit7CisKKwlpbnQgaSA9IEVQX05PKGlteF9lcCk7CisKKwlfX3Jhd193cml0ZWwoMHgxRkYsIGlteF9lcC0+aW14X3VzYi0+YmFzZSArIFVTQl9FUF9NQVNLKGkpKTsKKwlfX3Jhd193cml0ZWwoMHgxRkYsIGlteF9lcC0+aW14X3VzYi0+YmFzZSArIFVTQl9FUF9JTlRSKGkpKTsKKwlfX3Jhd193cml0ZWwoMHgxRkYgJiB+KEVQSU5UUl9FT1QgfCBFUElOVFJfRU9GKSwKKwkJaW14X2VwLT5pbXhfdXNiLT5iYXNlICsgVVNCX0VQX01BU0soaSkpOworfQorCit2b2lkIGlteF9lcF9pcnFfZGlzYWJsZShzdHJ1Y3QgaW14X2VwX3N0cnVjdCAqaW14X2VwKQoreworCisJaW50IGkgPSBFUF9OTyhpbXhfZXApOworCisJX19yYXdfd3JpdGVsKDB4MUZGLCBpbXhfZXAtPmlteF91c2ItPmJhc2UgKyBVU0JfRVBfTUFTSyhpKSk7CisJX19yYXdfd3JpdGVsKDB4MUZGLCBpbXhfZXAtPmlteF91c2ItPmJhc2UgKyBVU0JfRVBfSU5UUihpKSk7Cit9CisKK2ludCBpbXhfZXBfZW1wdHkoc3RydWN0IGlteF9lcF9zdHJ1Y3QgKmlteF9lcCkKK3sKKwlzdHJ1Y3QgaW14X3VkY19zdHJ1Y3QgKmlteF91c2IgPSBpbXhfZXAtPmlteF91c2I7CisKKwlyZXR1cm4gX19yYXdfcmVhZGwoaW14X3VzYi0+YmFzZSArIFVTQl9FUF9GU1RBVChFUF9OTyhpbXhfZXApKSkKKwkJCSYgRlNUQVRfRU1QVFk7Cit9CisKK3Vuc2lnbmVkIGlteF9maWZvX2Jjb3VudChzdHJ1Y3QgaW14X2VwX3N0cnVjdCAqaW14X2VwKQoreworCXN0cnVjdCBpbXhfdWRjX3N0cnVjdCAqaW14X3VzYiA9IGlteF9lcC0+aW14X3VzYjsKKworCXJldHVybiAoX19yYXdfcmVhZGwoaW14X3VzYi0+YmFzZSArIFVTQl9FUF9TVEFUKEVQX05PKGlteF9lcCkpKQorCQkJJiBFUFNUQVRfQkNPVU5UKSA+PiAxNjsKK30KKwordm9pZCBpbXhfZmx1c2goc3RydWN0IGlteF9lcF9zdHJ1Y3QgKmlteF9lcCkKK3sKKwlzdHJ1Y3QgaW14X3VkY19zdHJ1Y3QgKmlteF91c2IgPSBpbXhfZXAtPmlteF91c2I7CisKKwlpbnQgdGVtcCA9IF9fcmF3X3JlYWRsKGlteF91c2ItPmJhc2UgKyBVU0JfRVBfU1RBVChFUF9OTyhpbXhfZXApKSk7CisJX19yYXdfd3JpdGVsKHRlbXAgfCBFUFNUQVRfRkxVU0gsCisJCWlteF91c2ItPmJhc2UgKyBVU0JfRVBfU1RBVChFUF9OTyhpbXhfZXApKSk7Cit9CisKK3ZvaWQgaW14X2VwX3N0YWxsKHN0cnVjdCBpbXhfZXBfc3RydWN0ICppbXhfZXApCit7CisJc3RydWN0IGlteF91ZGNfc3RydWN0ICppbXhfdXNiID0gaW14X2VwLT5pbXhfdXNiOworCWludCB0ZW1wLCBpOworCisJRF9FUlIoaW14X3VzYi0+ZGV2LCAiPCVzPiBGb3JjZWQgc3RhbGwgb24gJXNcbiIsIF9fZnVuY19fLCBpbXhfZXAtPmVwLm5hbWUpOworCisJaW14X2ZsdXNoKGlteF9lcCk7CisKKwkvKiBTcGVjaWFsIGNhcmUgZm9yIGVwMCAqLworCWlmIChFUF9OTyhpbXhfZXApKSB7CisJCXRlbXAgPSBfX3Jhd19yZWFkbChpbXhfdXNiLT5iYXNlICsgVVNCX0NUUkwpOworCQlfX3Jhd193cml0ZWwodGVtcCB8IENUUkxfQ01ET1ZFUiB8IENUUkxfQ01ERVJST1IsIGlteF91c2ItPmJhc2UgKyBVU0JfQ1RSTCk7CisJCWRvIHsgfSB3aGlsZSAoX19yYXdfcmVhZGwoaW14X3VzYi0+YmFzZSArIFVTQl9DVFJMKSAmIENUUkxfQ01ET1ZFUik7CisJCXRlbXAgPSBfX3Jhd19yZWFkbChpbXhfdXNiLT5iYXNlICsgVVNCX0NUUkwpOworCQlfX3Jhd193cml0ZWwodGVtcCAmIH5DVFJMX0NNREVSUk9SLCBpbXhfdXNiLT5iYXNlICsgVVNCX0NUUkwpOworCX0KKwllbHNlIHsKKwkJdGVtcCA9IF9fcmF3X3JlYWRsKGlteF91c2ItPmJhc2UgKyBVU0JfRVBfU1RBVChFUF9OTyhpbXhfZXApKSk7CisJCV9fcmF3X3dyaXRlbCh0ZW1wIHwgRVBTVEFUX1NUQUxMLAorCQkJaW14X3VzYi0+YmFzZSArIFVTQl9FUF9TVEFUKEVQX05PKGlteF9lcCkpKTsKKworCQlmb3IgKGkgPSAwOyBpIDwgMTAwOyBpICsrKSB7CisJCQl0ZW1wID0gX19yYXdfcmVhZGwoaW14X3VzYi0+YmFzZSArIFVTQl9FUF9TVEFUKEVQX05PKGlteF9lcCkpKTsKKwkgCQlpZiAoIXRlbXAgJiBFUFNUQVRfU1RBTEwpCisJIAkJCWJyZWFrOworCSAJCXVkZWxheSgyMCk7CisJIAl9CisJCWlmIChpID09IDUwKQorCQkJRF9FUlIoaW14X3VzYi0+ZGV2LCAiPCVzPiBOb24gZmluaXNoZWQgc3RhbGwgb24gJXNcbiIsCisJCQkJX19mdW5jX18sIGlteF9lcC0+ZXAubmFtZSk7CisJfQorfQorCitzdGF0aWMgaW50IGlteF91ZGNfZ2V0X2ZyYW1lKHN0cnVjdCB1c2JfZ2FkZ2V0ICpfZ2FkZ2V0KQoreworCXN0cnVjdCBpbXhfdWRjX3N0cnVjdCAqaW14X3VzYiA9IGNvbnRhaW5lcl9vZihfZ2FkZ2V0LAorCQkJc3RydWN0IGlteF91ZGNfc3RydWN0LCBnYWRnZXQpOworCisJcmV0dXJuIF9fcmF3X3JlYWRsKGlteF91c2ItPmJhc2UgKyBVU0JfRlJBTUUpICYgMHg3RkY7Cit9CisKK3N0YXRpYyBpbnQgaW14X3VkY193YWtldXAoc3RydWN0IHVzYl9nYWRnZXQgKl9nYWRnZXQpCit7CisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBVU0IgcmVxdWVzdCBjb250cm9sIGZ1bmN0aW9ucworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCitzdGF0aWMgdm9pZCBlcF9hZGRfcmVxdWVzdChzdHJ1Y3QgaW14X2VwX3N0cnVjdCAqaW14X2VwLCBzdHJ1Y3QgaW14X3JlcXVlc3QgKnJlcSkKK3sKKwlpZiAodW5saWtlbHkoIXJlcSkpCisJCXJldHVybjsKKworCXJlcS0+aW5fdXNlID0gMTsKKwlsaXN0X2FkZF90YWlsKCZyZXEtPnF1ZXVlLCAmaW14X2VwLT5xdWV1ZSk7Cit9CisKK3N0YXRpYyB2b2lkIGVwX2RlbF9yZXF1ZXN0KHN0cnVjdCBpbXhfZXBfc3RydWN0ICppbXhfZXAsIHN0cnVjdCBpbXhfcmVxdWVzdCAqcmVxKQoreworCWlmICh1bmxpa2VseSghcmVxKSkKKwkJcmV0dXJuOworCisJbGlzdF9kZWxfaW5pdCgmcmVxLT5xdWV1ZSk7CisJcmVxLT5pbl91c2UgPSAwOworfQorCitzdGF0aWMgdm9pZCBkb25lKHN0cnVjdCBpbXhfZXBfc3RydWN0ICppbXhfZXAsIHN0cnVjdCBpbXhfcmVxdWVzdCAqcmVxLCBpbnQgc3RhdHVzKQoreworCWVwX2RlbF9yZXF1ZXN0KGlteF9lcCwgcmVxKTsKKworCWlmIChsaWtlbHkocmVxLT5yZXEuc3RhdHVzID09IC1FSU5QUk9HUkVTUykpCisJCXJlcS0+cmVxLnN0YXR1cyA9IHN0YXR1czsKKwllbHNlCisJCXN0YXR1cyA9IHJlcS0+cmVxLnN0YXR1czsKKworCWlmIChzdGF0dXMgJiYgc3RhdHVzICE9IC1FU0hVVERPV04pCisJCURfRVJSKGlteF9lcC0+aW14X3VzYi0+ZGV2LAorCQkJIjwlcz4gY29tcGxldGUgJXMgcmVxICVwIHN0YXQgJWQgbGVuICV1LyV1XG4iLCBfX2Z1bmNfXywKKwkJCWlteF9lcC0+ZXAubmFtZSwgJnJlcS0+cmVxLCBzdGF0dXMsCisJCQlyZXEtPnJlcS5hY3R1YWwsIHJlcS0+cmVxLmxlbmd0aCk7CisKKwlyZXEtPnJlcS5jb21wbGV0ZSgmaW14X2VwLT5lcCwgJnJlcS0+cmVxKTsKK30KKworc3RhdGljIHZvaWQgbnVrZShzdHJ1Y3QgaW14X2VwX3N0cnVjdCAqaW14X2VwLCBpbnQgc3RhdHVzKQoreworCXN0cnVjdCBpbXhfcmVxdWVzdCAqcmVxOworCisJd2hpbGUgKCFsaXN0X2VtcHR5KCZpbXhfZXAtPnF1ZXVlKSkgeworCQlyZXEgPSBsaXN0X2VudHJ5KGlteF9lcC0+cXVldWUubmV4dCwgc3RydWN0IGlteF9yZXF1ZXN0LCBxdWV1ZSk7CisJCWRvbmUoaW14X2VwLCByZXEsIHN0YXR1cyk7CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRGF0YSB0YW5zZmVyIG92ZXIgVVNCIGZ1bmN0aW9ucworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworc3RhdGljIGludCByZWFkX3BhY2tldChzdHJ1Y3QgaW14X2VwX3N0cnVjdCAqaW14X2VwLCBzdHJ1Y3QgaW14X3JlcXVlc3QgKnJlcSkKK3sKKwl1OAkqYnVmOworCWludAlieXRlc19lcCwgYnVmZmVyc3BhY2UsIGNvdW50LCBpOworCisJYnl0ZXNfZXAgPSBpbXhfZmlmb19iY291bnQoaW14X2VwKTsKKwlidWZmZXJzcGFjZSA9IHJlcS0+cmVxLmxlbmd0aCAtIHJlcS0+cmVxLmFjdHVhbDsKKworCWJ1ZiA9IHJlcS0+cmVxLmJ1ZiArIHJlcS0+cmVxLmFjdHVhbDsKKwlwcmVmZXRjaHcoYnVmKTsKKworCWlmICh1bmxpa2VseShpbXhfZXBfZW1wdHkoaW14X2VwKSkpCisJCWNvdW50ID0gMDsJLyogemxwICovCisJZWxzZQorCQljb3VudCA9IG1pbihieXRlc19lcCwgYnVmZmVyc3BhY2UpOworCisJZm9yIChpID0gY291bnQ7IGkgPiAwOyBpLS0pCisJCSpidWYrKyA9IF9fcmF3X3JlYWRiKGlteF9lcC0+aW14X3VzYi0+YmFzZQorCQkJCQkJKyBVU0JfRVBfRkRBVDAoRVBfTk8oaW14X2VwKSkpOworCXJlcS0+cmVxLmFjdHVhbCArPSBjb3VudDsKKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIGludCB3cml0ZV9wYWNrZXQoc3RydWN0IGlteF9lcF9zdHJ1Y3QgKmlteF9lcCwgc3RydWN0IGlteF9yZXF1ZXN0ICpyZXEpCit7CisJdTgJKmJ1ZjsKKwlpbnQJbGVuZ3RoLCBjb3VudCwgdGVtcDsKKworCWJ1ZiA9IHJlcS0+cmVxLmJ1ZiArIHJlcS0+cmVxLmFjdHVhbDsKKwlwcmVmZXRjaChidWYpOworCisJbGVuZ3RoID0gbWluKHJlcS0+cmVxLmxlbmd0aCAtIHJlcS0+cmVxLmFjdHVhbCwgKHUzMilpbXhfZXAtPmZpZm9zaXplKTsKKworCWlmIChpbXhfZmlmb19iY291bnQoaW14X2VwKSArIGxlbmd0aCA+IGlteF9lcC0+Zmlmb3NpemUpIHsKKwkJRF9UUlgoaW14X2VwLT5pbXhfdXNiLT5kZXYsICI8JXM+IHBhY2tldCBvdmVyZmlsbCAlcyBmaWZvXG4iLAorCQkJX19mdW5jX18sIGlteF9lcC0+ZXAubmFtZSk7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXEtPnJlcS5hY3R1YWwgKz0gbGVuZ3RoOworCWNvdW50ID0gbGVuZ3RoOworCisJaWYgKCFjb3VudCAmJiByZXEtPnJlcS56ZXJvKSB7CS8qIHpscCAqLworCQl0ZW1wID0gX19yYXdfcmVhZGwoaW14X2VwLT5pbXhfdXNiLT5iYXNlCisJCQkrIFVTQl9FUF9TVEFUKEVQX05PKGlteF9lcCkpKTsKKwkJX19yYXdfd3JpdGVsKHRlbXAgfCBFUFNUQVRfWkxQUywgaW14X2VwLT5pbXhfdXNiLT5iYXNlCisJCQkrIFVTQl9FUF9TVEFUKEVQX05PKGlteF9lcCkpKTsKKwkJRF9UUlgoaW14X2VwLT5pbXhfdXNiLT5kZXYsICI8JXM+IHplcm8gcGFja2V0XG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAwOworCX0KKworCXdoaWxlIChjb3VudC0tKSB7CisJCWlmIChjb3VudCA9PSAwKSB7CS8qIGxhc3QgYnl0ZSAqLworCQkJdGVtcCA9IF9fcmF3X3JlYWRsKGlteF9lcC0+aW14X3VzYi0+YmFzZQorCQkJCSsgVVNCX0VQX0ZDVFJMKEVQX05PKGlteF9lcCkpKTsKKwkJCV9fcmF3X3dyaXRlbCh0ZW1wIHwgRkNUUkxfV0ZSLCBpbXhfZXAtPmlteF91c2ItPmJhc2UKKwkJCQkrIFVTQl9FUF9GQ1RSTChFUF9OTyhpbXhfZXApKSk7CisJCX0KKwkJX19yYXdfd3JpdGViKCpidWYrKywKKwkJCWlteF9lcC0+aW14X3VzYi0+YmFzZSArIFVTQl9FUF9GREFUMChFUF9OTyhpbXhfZXApKSk7CisJfQorCisJcmV0dXJuIGxlbmd0aDsKK30KKworc3RhdGljIGludCByZWFkX2ZpZm8oc3RydWN0IGlteF9lcF9zdHJ1Y3QgKmlteF9lcCwgc3RydWN0IGlteF9yZXF1ZXN0ICpyZXEpCit7CisJaW50IAlieXRlcyA9IDAsCisJCWNvdW50LAorCQljb21wbGV0ZWQgPSAwOworCisJd2hpbGUgKF9fcmF3X3JlYWRsKGlteF9lcC0+aW14X3VzYi0+YmFzZSArIFVTQl9FUF9GU1RBVChFUF9OTyhpbXhfZXApKSkKKwkJJiBGU1RBVF9GUikgeworCQkJY291bnQgPSByZWFkX3BhY2tldChpbXhfZXAsIHJlcSk7CisJCQlieXRlcyArPSBjb3VudDsKKworCQkJY29tcGxldGVkID0gKGNvdW50ICE9IGlteF9lcC0+Zmlmb3NpemUpOworCQkJaWYgKGNvbXBsZXRlZCB8fCByZXEtPnJlcS5hY3R1YWwgPT0gcmVxLT5yZXEubGVuZ3RoKSB7CisJCQkJY29tcGxldGVkID0gMTsKKwkJCQlicmVhazsKKwkJCX0KKwl9CisKKwlpZiAoY29tcGxldGVkIHx8ICFyZXEtPnJlcS5sZW5ndGgpIHsKKwkJZG9uZShpbXhfZXAsIHJlcSwgMCk7CisJCURfUkVRKGlteF9lcC0+aW14X3VzYi0+ZGV2LCAiPCVzPiAlcyByZXE8JXA+ICVzXG4iLAorCQkJX19mdW5jX18sIGlteF9lcC0+ZXAubmFtZSwgcmVxLAorCQkJY29tcGxldGVkID8gImNvbXBsZXRlZCIgOiAibm90IGNvbXBsZXRlZCIpOworCQlpZiAoIUVQX05PKGlteF9lcCkpCisJCQllcDBfY2hnX3N0YXQoX19mdW5jX18sIGlteF9lcC0+aW14X3VzYiwgRVAwX0lETEUpOworCX0KKworCURfVFJYKGlteF9lcC0+aW14X3VzYi0+ZGV2LCAiPCVzPiBieXRlcyByZWFkOiAlZFxuIiwgX19mdW5jX18sIGJ5dGVzKTsKKworCXJldHVybiBjb21wbGV0ZWQ7Cit9CisKK3N0YXRpYyBpbnQgd3JpdGVfZmlmbyhzdHJ1Y3QgaW14X2VwX3N0cnVjdCAqaW14X2VwLCBzdHJ1Y3QgaW14X3JlcXVlc3QgKnJlcSkKK3sKKwlpbnQJYnl0ZXMgPSAwLAorCQljb3VudCwKKwkJY29tcGxldGVkID0gMDsKKworCXdoaWxlICghY29tcGxldGVkKSB7CisJCWNvdW50ID0gd3JpdGVfcGFja2V0KGlteF9lcCwgcmVxKTsKKwkJaWYgKGNvdW50IDwgMCkKKwkJCWJyZWFrOyAvKiBidXN5ICovCisJCWJ5dGVzICs9IGNvdW50OworCisJCS8qIGxhc3QgcGFja2V0ICJtdXN0IGJlIiBzaG9ydCAob3IgYSB6bHApICovCisJCWNvbXBsZXRlZCA9IChjb3VudCAhPSBpbXhfZXAtPmZpZm9zaXplKTsKKworCQlpZiAodW5saWtlbHkoY29tcGxldGVkKSkgeworCQkJZG9uZShpbXhfZXAsIHJlcSwgMCk7CisJCQlEX1JFUShpbXhfZXAtPmlteF91c2ItPmRldiwgIjwlcz4gJXMgcmVxPCVwPiAlc1xuIiwKKwkJCQlfX2Z1bmNfXywgaW14X2VwLT5lcC5uYW1lLCByZXEsCisJCQkJY29tcGxldGVkID8gImNvbXBsZXRlZCIgOiAibm90IGNvbXBsZXRlZCIpOworCQkJaWYgKCFFUF9OTyhpbXhfZXApKQorCQkJCWVwMF9jaGdfc3RhdChfX2Z1bmNfXywgaW14X2VwLT5pbXhfdXNiLCBFUDBfSURMRSk7CisJCX0KKwl9CisKKwlEX1RSWChpbXhfZXAtPmlteF91c2ItPmRldiwgIjwlcz4gYnl0ZXMgc2VudDogJWRcbiIsIF9fZnVuY19fLCBieXRlcyk7CisKKwlyZXR1cm4gY29tcGxldGVkOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRW5kcG9pbnQgaGFuZGxlcnMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KK3N0YXRpYyBpbnQgaGFuZGxlX2VwKHN0cnVjdCBpbXhfZXBfc3RydWN0ICppbXhfZXApCit7CisJc3RydWN0IGlteF9yZXF1ZXN0ICpyZXE7CisJaW50IGNvbXBsZXRlZCA9IDA7CisKKwlkbyB7CisJCWlmICghbGlzdF9lbXB0eSgmaW14X2VwLT5xdWV1ZSkpCisJCQlyZXEgPSBsaXN0X2VudHJ5KGlteF9lcC0+cXVldWUubmV4dCwKKwkJCQlzdHJ1Y3QgaW14X3JlcXVlc3QsIHF1ZXVlKTsKKwkJZWxzZSB7CisJCQlEX1JFUShpbXhfZXAtPmlteF91c2ItPmRldiwgIjwlcz4gbm8gcmVxdWVzdCBvbiAlc1xuIiwKKwkJCQlfX2Z1bmNfXywgaW14X2VwLT5lcC5uYW1lKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJaWYgKEVQX0RJUihpbXhfZXApKQkvKiB0byBob3N0ICovCisJCQljb21wbGV0ZWQgPSB3cml0ZV9maWZvKGlteF9lcCwgcmVxKTsKKwkJZWxzZQkJCS8qIHRvIGRldmljZSAqLworCQkJY29tcGxldGVkID0gcmVhZF9maWZvKGlteF9lcCwgcmVxKTsKKworCQlkdW1wX2VwX3N0YXQoX19mdW5jX18sIGlteF9lcCk7CisKKwl9IHdoaWxlIChjb21wbGV0ZWQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaGFuZGxlX2VwMChzdHJ1Y3QgaW14X2VwX3N0cnVjdCAqaW14X2VwKQoreworCXN0cnVjdCBpbXhfcmVxdWVzdCAqcmVxID0gTlVMTDsKKwlpbnQgcmV0ID0gMDsKKworCWlmICghbGlzdF9lbXB0eSgmaW14X2VwLT5xdWV1ZSkpCisJCXJlcSA9IGxpc3RfZW50cnkoaW14X2VwLT5xdWV1ZS5uZXh0LCBzdHJ1Y3QgaW14X3JlcXVlc3QsIHF1ZXVlKTsKKworCWlmIChyZXEpIHsKKwkJc3dpdGNoIChpbXhfZXAtPmlteF91c2ItPmVwMHN0YXRlKSB7CisKKwkJY2FzZSBFUDBfSU5fREFUQV9QSEFTRToJCQkvKiBHRVRfREVTQ1JJUFRPUiAqLworCQkJd3JpdGVfZmlmbyhpbXhfZXAsIHJlcSk7CisJCQlicmVhazsKKwkJY2FzZSBFUDBfT1VUX0RBVEFfUEhBU0U6CQkvKiBTRVRfREVTQ1JJUFRPUiAqLworCQkJcmVhZF9maWZvKGlteF9lcCwgcmVxKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJRF9FUDAoaW14X2VwLT5pbXhfdXNiLT5kZXYsCisJCQkJIjwlcz4gZXAwIGkvbywgb2RkIHN0YXRlICVkXG4iLAorCQkJCV9fZnVuY19fLCBpbXhfZXAtPmlteF91c2ItPmVwMHN0YXRlKTsKKwkJCWVwX2RlbF9yZXF1ZXN0KGlteF9lcCwgcmVxKTsKKwkJCXJldCA9IC1FTDJITFQ7CisJCQlicmVhazsKKwkJfQorCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGhhbmRsZV9lcDBfZGV2cmVxKHN0cnVjdCBpbXhfdWRjX3N0cnVjdCAqaW14X3VzYikKK3sKKwlzdHJ1Y3QgaW14X2VwX3N0cnVjdCAqaW14X2VwID0gJmlteF91c2ItPmlteF9lcFswXTsKKwl1bmlvbiB7CisJCXN0cnVjdCB1c2JfY3RybHJlcXVlc3QJcjsKKwkJdTgJCQlyYXdbOF07CisJCXUzMgkJCXdvcmRbMl07CisJfSB1OworCWludCB0ZW1wLCBpOworCisJbnVrZShpbXhfZXAsIC1FUFJPVE8pOworCisJLyogcmVhZCBTRVRVUCBwYWNrZXQgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisJCWlmIChpbXhfZXBfZW1wdHkoaW14X2VwKSkgeworCQkJRF9FUlIoaW14X3VzYi0+ZGV2LAorCQkJCSI8JXM+IG5vIHNldHVwIHBhY2tldCByZWNlaXZlZFxuIiwgX19mdW5jX18pOworCQkJZ290byBzdGFsbDsKKwkJfQorCQl1LndvcmRbaV0gPSBfX3Jhd19yZWFkbChpbXhfdXNiLT5iYXNlICsJVVNCX0VQX0ZEQVQoRVBfTk8oaW14X2VwKSkpOworCX0KKworCXRlbXAgPSBpbXhfZXBfZW1wdHkoaW14X2VwKTsKKwl3aGlsZSAoIWlteF9lcF9lbXB0eShpbXhfZXApKSB7CisJCWkgPSBfX3Jhd19yZWFkbChpbXhfdXNiLT5iYXNlICsJVVNCX0VQX0ZEQVQoRVBfTk8oaW14X2VwKSkpOworCQlEX0VSUihpbXhfdXNiLT5kZXYsCisJCQkiPCVzPiB3cm9uZyB0byBoYXZlIGV4dHJhIGJ5dGVzIGZvciBzZXR1cCA6IDB4JTA4eFxuIiwKKwkJCV9fZnVuY19fLCBpKTsKKwl9CisJaWYgKCF0ZW1wKQorCQlnb3RvIHN0YWxsOworCisJbGUxNl90b19jcHVzKCZ1LnIud1ZhbHVlKTsKKwlsZTE2X3RvX2NwdXMoJnUuci53SW5kZXgpOworCWxlMTZfdG9fY3B1cygmdS5yLndMZW5ndGgpOworCisJRF9SRVEoaW14X3VzYi0+ZGV2LCAiPCVzPiBTRVRVUCAlMDJ4LiUwMnggdiUwNHggaSUwNHggbCUwNHhcbiIsCisJCV9fZnVuY19fLCB1LnIuYlJlcXVlc3RUeXBlLCB1LnIuYlJlcXVlc3QsCisJCXUuci53VmFsdWUsIHUuci53SW5kZXgsIHUuci53TGVuZ3RoKTsKKworCWlmIChpbXhfdXNiLT5zZXRfY29uZmlnKSB7CisJCS8qIE5BQ0sgdGhlIGhvc3QgYnkgdXNpbmcgQ01ET1ZFUiAqLworCQl0ZW1wID0gX19yYXdfcmVhZGwoaW14X3VzYi0+YmFzZSArIFVTQl9DVFJMKTsKKwkJX19yYXdfd3JpdGVsKHRlbXAgfCBDVFJMX0NNRE9WRVIsIGlteF91c2ItPmJhc2UgKyBVU0JfQ1RSTCk7CisKKwkJRF9FUlIoaW14X3VzYi0+ZGV2LAorCQkJIjwlcz4gc2V0IGNvbmZpZyByZXEgaXMgcGVuZGluZywgTkFDSyB0aGUgaG9zdFxuIiwKKwkJCV9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKworCWlmICh1LnIuYlJlcXVlc3RUeXBlICYgVVNCX0RJUl9JTikKKwkJZXAwX2NoZ19zdGF0KF9fZnVuY19fLCBpbXhfdXNiLCBFUDBfSU5fREFUQV9QSEFTRSk7CisJZWxzZQorCQllcDBfY2hnX3N0YXQoX19mdW5jX18sIGlteF91c2IsIEVQMF9PVVRfREFUQV9QSEFTRSk7CisKKwlpID0gaW14X3VzYi0+ZHJpdmVyLT5zZXR1cCgmaW14X3VzYi0+Z2FkZ2V0LCAmdS5yKTsKKwlpZiAoaSA8IDApIHsKKwkJRF9FUlIoaW14X3VzYi0+ZGV2LCAiPCVzPiBkZXZpY2Ugc2V0dXAgZXJyb3IgJWRcbiIsCisJCQlfX2Z1bmNfXywgaSk7CisJCWdvdG8gc3RhbGw7CisJfQorCisJcmV0dXJuOworc3RhbGw6CisJRF9FUlIoaW14X3VzYi0+ZGV2LCAiPCVzPiBwcm90b2NvbCBTVEFMTFxuIiwgX19mdW5jX18pOworCWlteF9lcF9zdGFsbChpbXhfZXApOworCWVwMF9jaGdfc3RhdChfX2Z1bmNfXywgaW14X3VzYiwgRVAwX1NUQUxMKTsKKwlyZXR1cm47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBVU0IgZ2FkZ2V0IGNhbGxiYWNrIGZ1bmN0aW9ucworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCitzdGF0aWMgaW50IGlteF9lcF9lbmFibGUoc3RydWN0IHVzYl9lcCAqdXNiX2VwLAorCQkJCWNvbnN0IHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZGVzYykKK3sKKwlzdHJ1Y3QgaW14X2VwX3N0cnVjdCAqaW14X2VwID0gY29udGFpbmVyX29mKHVzYl9lcCwKKwkJCQkJCXN0cnVjdCBpbXhfZXBfc3RydWN0LCBlcCk7CisJc3RydWN0IGlteF91ZGNfc3RydWN0ICppbXhfdXNiID0gaW14X2VwLT5pbXhfdXNiOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoIXVzYl9lcAorCQl8fCAhZGVzYworCQl8fCAhRVBfTk8oaW14X2VwKQorCQl8fCBkZXNjLT5iRGVzY3JpcHRvclR5cGUgIT0gVVNCX0RUX0VORFBPSU5UCisJCXx8IGlteF9lcC0+YkVuZHBvaW50QWRkcmVzcyAhPSBkZXNjLT5iRW5kcG9pbnRBZGRyZXNzKSB7CisJCQlEX0VSUihpbXhfdXNiLT5kZXYsCisJCQkJIjwlcz4gYmFkIGVwIG9yIGRlc2NyaXB0b3JcbiIsIF9fZnVuY19fKTsKKwkJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChpbXhfZXAtPmJtQXR0cmlidXRlcyAhPSBkZXNjLT5ibUF0dHJpYnV0ZXMpIHsKKwkJRF9FUlIoaW14X3VzYi0+ZGV2LAorCQkJIjwlcz4gJXMgdHlwZSBtaXNtYXRjaFxuIiwgX19mdW5jX18sIHVzYl9lcC0+bmFtZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChpbXhfZXAtPmZpZm9zaXplIDwgbGUxNl90b19jcHUoZGVzYy0+d01heFBhY2tldFNpemUpKSB7CisJCURfRVJSKGlteF91c2ItPmRldiwKKwkJCSI8JXM+IGJhZCAlcyBtYXhwYWNrZXRcbiIsIF9fZnVuY19fLCB1c2JfZXAtPm5hbWUpOworCQlyZXR1cm4gLUVSQU5HRTsKKwl9CisKKwlpZiAoIWlteF91c2ItPmRyaXZlciB8fCBpbXhfdXNiLT5nYWRnZXQuc3BlZWQgPT0gVVNCX1NQRUVEX1VOS05PV04pIHsKKwkJRF9FUlIoaW14X3VzYi0+ZGV2LCAiPCVzPiBib2d1cyBkZXZpY2Ugc3RhdGVcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FU0hVVERPV047CisJfQorCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCisJaW14X2VwLT5zdG9wcGVkID0gMDsKKwlpbXhfZmx1c2goaW14X2VwKTsKKwlpbXhfZXBfaXJxX2VuYWJsZShpbXhfZXApOworCisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCisJRF9FUFgoaW14X3VzYi0+ZGV2LCAiPCVzPiBFTkFCTEVEICVzXG4iLCBfX2Z1bmNfXywgdXNiX2VwLT5uYW1lKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpbXhfZXBfZGlzYWJsZShzdHJ1Y3QgdXNiX2VwICp1c2JfZXApCit7CisJc3RydWN0IGlteF9lcF9zdHJ1Y3QgKmlteF9lcCA9IGNvbnRhaW5lcl9vZih1c2JfZXAsCisJCQkJCQlzdHJ1Y3QgaW14X2VwX3N0cnVjdCwgZXApOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoIXVzYl9lcCB8fCAhRVBfTk8oaW14X2VwKSB8fCAhbGlzdF9lbXB0eSgmaW14X2VwLT5xdWV1ZSkpIHsKKwkJRF9FUlIoaW14X2VwLT5pbXhfdXNiLT5kZXYsICI8JXM+ICVzIGNhbiBub3QgYmUgZGlzYWJsZWRcbiIsCisJCQlfX2Z1bmNfXywgdXNiX2VwID8gaW14X2VwLT5lcC5uYW1lIDogTlVMTCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKworCWlteF9lcC0+c3RvcHBlZCA9IDE7CisJbnVrZShpbXhfZXAsIC1FU0hVVERPV04pOworCWlteF9mbHVzaChpbXhfZXApOworCWlteF9lcF9pcnFfZGlzYWJsZShpbXhfZXApOworCisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCisJRF9FUFgoaW14X2VwLT5pbXhfdXNiLT5kZXYsCisJCSI8JXM+IERJU0FCTEVEICVzXG4iLCBfX2Z1bmNfXywgdXNiX2VwLT5uYW1lKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCB1c2JfcmVxdWVzdCAqaW14X2VwX2FsbG9jX3JlcXVlc3QKKwkJCQkJKHN0cnVjdCB1c2JfZXAgKnVzYl9lcCwgZ2ZwX3QgZ2ZwX2ZsYWdzKQoreworCXN0cnVjdCBpbXhfcmVxdWVzdCAqcmVxOworCisJcmVxID0ga3phbGxvYyhzaXplb2YgKnJlcSwgZ2ZwX2ZsYWdzKTsKKwlpZiAoIXJlcSB8fCAhdXNiX2VwKQorCQlyZXR1cm4gMDsKKworCUlOSVRfTElTVF9IRUFEKCZyZXEtPnF1ZXVlKTsKKwlyZXEtPmluX3VzZSA9IDA7CisKKwlyZXR1cm4gJnJlcS0+cmVxOworfQorCitzdGF0aWMgdm9pZCBpbXhfZXBfZnJlZV9yZXF1ZXN0CisJCQkoc3RydWN0IHVzYl9lcCAqdXNiX2VwLCBzdHJ1Y3QgdXNiX3JlcXVlc3QgKnVzYl9yZXEpCit7CisJc3RydWN0IGlteF9yZXF1ZXN0ICpyZXE7CisKKwlyZXEgPSBjb250YWluZXJfb2YodXNiX3JlcSwgc3RydWN0IGlteF9yZXF1ZXN0LCByZXEpOworCVdBUk5fT04oIWxpc3RfZW1wdHkoJnJlcS0+cXVldWUpKTsKKwlrZnJlZShyZXEpOworfQorCitzdGF0aWMgaW50IGlteF9lcF9xdWV1ZQorCShzdHJ1Y3QgdXNiX2VwICp1c2JfZXAsIHN0cnVjdCB1c2JfcmVxdWVzdCAqdXNiX3JlcSwgZ2ZwX3QgZ2ZwX2ZsYWdzKQoreworCXN0cnVjdCBpbXhfZXBfc3RydWN0CSppbXhfZXA7CisJc3RydWN0IGlteF91ZGNfc3RydWN0CSppbXhfdXNiOworCXN0cnVjdCBpbXhfcmVxdWVzdAkqcmVxOworCXVuc2lnbmVkIGxvbmcJCWZsYWdzOworCWludAkJCXJldCA9IDA7CisKKwlpbXhfZXAgPSBjb250YWluZXJfb2YodXNiX2VwLCBzdHJ1Y3QgaW14X2VwX3N0cnVjdCwgZXApOworCWlteF91c2IgPSBpbXhfZXAtPmlteF91c2I7CisJcmVxID0gY29udGFpbmVyX29mKHVzYl9yZXEsIHN0cnVjdCBpbXhfcmVxdWVzdCwgcmVxKTsKKworCS8qCisJICBTcGVjaWFsIGNhcmUgb24gSU1YIHVkYy4KKwkgIElnbm9yZSBlbnF1ZXVlIHdoZW4gYWZ0ZXIgc2V0IGNvbmZpZ3VyYXRpb24gZnJvbSB0aGUKKwkgIGhvc3QuIFRoaXMgYXNzdW1lIGFsbCBnYWRnZXQgZHJpdmVycyByZXBseSBzZXQKKwkgIGNvbmZpZ3VyYXRpb24gd2l0aCB0aGUgbmV4dCBlcDAgcmVxIGVucXVldWUuCisJKi8KKwlpZiAoaW14X3VzYi0+c2V0X2NvbmZpZyAmJiAhRVBfTk8oaW14X2VwKSkgeworCQlpbXhfdXNiLT5zZXRfY29uZmlnID0gMDsKKwkJRF9FUFgoaW14X3VzYi0+ZGV2LAorCQkJIjwlcz4gZ2FkZ2V0IHJlcGx5IHNldCBjb25maWdcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKHVubGlrZWx5KCF1c2JfcmVxIHx8ICFyZXEgfHwgIXVzYl9yZXEtPmNvbXBsZXRlIHx8ICF1c2JfcmVxLT5idWYpKSB7CisJCURfRVJSKGlteF91c2ItPmRldiwgIjwlcz4gYmFkIHBhcmFtc1xuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAodW5saWtlbHkoIXVzYl9lcCB8fCAhaW14X2VwKSkgeworCQlEX0VSUihpbXhfdXNiLT5kZXYsICI8JXM+IGJhZCBlcFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoIWlteF91c2ItPmRyaXZlciB8fCBpbXhfdXNiLT5nYWRnZXQuc3BlZWQgPT0gVVNCX1NQRUVEX1VOS05PV04pIHsKKwkJRF9FUlIoaW14X3VzYi0+ZGV2LCAiPCVzPiBib2d1cyBkZXZpY2Ugc3RhdGVcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FU0hVVERPV047CisJfQorCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCisJLyogRGVidWcgKi8KKwlEX1JFUShpbXhfdXNiLT5kZXYsICI8JXM+IGVwJWQgJXMgcmVxdWVzdCBmb3IgWyVkXSBieXRlc1xuIiwKKwkJX19mdW5jX18sIEVQX05PKGlteF9lcCksCisJCSgoIUVQX05PKGlteF9lcCkgJiYgaW14X2VwLT5pbXhfdXNiLT5lcDBzdGF0ZSA9PSBFUDBfSU5fREFUQV9QSEFTRSkKKwkJfHwgKEVQX05PKGlteF9lcCkgJiYgRVBfRElSKGlteF9lcCkpKSA/ICJJTiIgOiAiT1VUIiwgdXNiX3JlcS0+bGVuZ3RoKTsKKwlkdW1wX3JlcShfX2Z1bmNfXywgaW14X2VwLCB1c2JfcmVxKTsKKworCWlmIChpbXhfZXAtPnN0b3BwZWQpIHsKKwkJdXNiX3JlcS0+c3RhdHVzID0gLUVTSFVURE9XTjsKKwkJcmV0ID0gLUVTSFVURE9XTjsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKHJlcS0+aW5fdXNlKSB7CisJCURfRVJSKGlteF91c2ItPmRldiwKKwkJCSI8JXM+IHJlZnVzaW5nIHRvIHF1ZXVlIHJlcSAlcCAoYWxyZWFkeSBxdWV1ZWQpXG4iLAorCQkJX19mdW5jX18sIHJlcSk7CisJCWdvdG8gb3V0OworCX0KKworCXVzYl9yZXEtPnN0YXR1cyA9IC1FSU5QUk9HUkVTUzsKKwl1c2JfcmVxLT5hY3R1YWwgPSAwOworCisJZXBfYWRkX3JlcXVlc3QoaW14X2VwLCByZXEpOworCisJaWYgKCFFUF9OTyhpbXhfZXApKQorCQlyZXQgPSBoYW5kbGVfZXAwKGlteF9lcCk7CisJZWxzZQorCQlyZXQgPSBoYW5kbGVfZXAoaW14X2VwKTsKK291dDoKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBpbXhfZXBfZGVxdWV1ZShzdHJ1Y3QgdXNiX2VwICp1c2JfZXAsIHN0cnVjdCB1c2JfcmVxdWVzdCAqdXNiX3JlcSkKK3sKKworCXN0cnVjdCBpbXhfZXBfc3RydWN0ICppbXhfZXAgPSBjb250YWluZXJfb2YKKwkJCQkJKHVzYl9lcCwgc3RydWN0IGlteF9lcF9zdHJ1Y3QsIGVwKTsKKwlzdHJ1Y3QgaW14X3JlcXVlc3QgKnJlcTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKHVubGlrZWx5KCF1c2JfZXAgfHwgIUVQX05PKGlteF9lcCkpKSB7CisJCURfRVJSKGlteF9lcC0+aW14X3VzYi0+ZGV2LCAiPCVzPiBiYWQgZXBcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCisJLyogbWFrZSBzdXJlIGl0J3MgYWN0dWFsbHkgcXVldWVkIG9uIHRoaXMgZW5kcG9pbnQgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJlcSwgJmlteF9lcC0+cXVldWUsIHF1ZXVlKSB7CisJCWlmICgmcmVxLT5yZXEgPT0gdXNiX3JlcSkKKwkJCWJyZWFrOworCX0KKwlpZiAoJnJlcS0+cmVxICE9IHVzYl9yZXEpIHsKKwkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlkb25lKGlteF9lcCwgcmVxLCAtRUNPTk5SRVNFVCk7CisKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaW14X2VwX3NldF9oYWx0KHN0cnVjdCB1c2JfZXAgKnVzYl9lcCwgaW50IHZhbHVlKQoreworCXN0cnVjdCBpbXhfZXBfc3RydWN0ICppbXhfZXAgPSBjb250YWluZXJfb2YKKwkJCQkJKHVzYl9lcCwgc3RydWN0IGlteF9lcF9zdHJ1Y3QsIGVwKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKHVubGlrZWx5KCF1c2JfZXAgfHwgIUVQX05PKGlteF9lcCkpKSB7CisJCURfRVJSKGlteF9lcC0+aW14X3VzYi0+ZGV2LCAiPCVzPiBiYWQgZXBcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCisJaWYgKChpbXhfZXAtPmJFbmRwb2ludEFkZHJlc3MgJiBVU0JfRElSX0lOKQorCQkmJiAhbGlzdF9lbXB0eSgmaW14X2VwLT5xdWV1ZSkpIHsKKwkJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwkJCXJldHVybiAtRUFHQUlOOworCX0KKworCWlteF9lcF9zdGFsbChpbXhfZXApOworCisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCisJRF9FUFgoaW14X2VwLT5pbXhfdXNiLT5kZXYsICI8JXM+ICVzIGhhbHRcbiIsIF9fZnVuY19fLCB1c2JfZXAtPm5hbWUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlteF9lcF9maWZvX3N0YXR1cyhzdHJ1Y3QgdXNiX2VwICp1c2JfZXApCit7CisJc3RydWN0IGlteF9lcF9zdHJ1Y3QgKmlteF9lcCA9IGNvbnRhaW5lcl9vZgorCQkJCQkodXNiX2VwLCBzdHJ1Y3QgaW14X2VwX3N0cnVjdCwgZXApOworCisJaWYgKCF1c2JfZXApIHsKKwkJRF9FUlIoaW14X2VwLT5pbXhfdXNiLT5kZXYsICI8JXM+IGJhZCBlcFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlpZiAoaW14X2VwLT5pbXhfdXNiLT5nYWRnZXQuc3BlZWQgPT0gVVNCX1NQRUVEX1VOS05PV04pCisJCXJldHVybiAwOworCWVsc2UKKwkJcmV0dXJuIGlteF9maWZvX2Jjb3VudChpbXhfZXApOworfQorCitzdGF0aWMgdm9pZCBpbXhfZXBfZmlmb19mbHVzaChzdHJ1Y3QgdXNiX2VwICp1c2JfZXApCit7CisJc3RydWN0IGlteF9lcF9zdHJ1Y3QgKmlteF9lcCA9IGNvbnRhaW5lcl9vZgorCQkJCQkodXNiX2VwLCBzdHJ1Y3QgaW14X2VwX3N0cnVjdCwgZXApOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwlpZiAoIXVzYl9lcCB8fCAhRVBfTk8oaW14X2VwKSB8fCAhbGlzdF9lbXB0eSgmaW14X2VwLT5xdWV1ZSkpIHsKKwkJRF9FUlIoaW14X2VwLT5pbXhfdXNiLT5kZXYsICI8JXM+IGJhZCBlcFxuIiwgX19mdW5jX18pOworCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJCXJldHVybjsKKwl9CisKKwkvKiB0b2dnbGUgYW5kIGhhbHQgYml0cyBzdGF5IHVuY2hhbmdlZCAqLworCWlteF9mbHVzaChpbXhfZXApOworCisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworfQorCitzdGF0aWMgc3RydWN0IHVzYl9lcF9vcHMgaW14X2VwX29wcyA9IHsKKwkuZW5hYmxlCQk9IGlteF9lcF9lbmFibGUsCisJLmRpc2FibGUJPSBpbXhfZXBfZGlzYWJsZSwKKworCS5hbGxvY19yZXF1ZXN0CT0gaW14X2VwX2FsbG9jX3JlcXVlc3QsCisJLmZyZWVfcmVxdWVzdAk9IGlteF9lcF9mcmVlX3JlcXVlc3QsCisKKwkucXVldWUJCT0gaW14X2VwX3F1ZXVlLAorCS5kZXF1ZXVlCT0gaW14X2VwX2RlcXVldWUsCisKKwkuc2V0X2hhbHQJPSBpbXhfZXBfc2V0X2hhbHQsCisJLmZpZm9fc3RhdHVzCT0gaW14X2VwX2ZpZm9fc3RhdHVzLAorCS5maWZvX2ZsdXNoCT0gaW14X2VwX2ZpZm9fZmx1c2gsCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVVNCIGVuZHBvaW50IGNvbnRyb2wgZnVuY3Rpb25zCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKK3ZvaWQgZXAwX2NoZ19zdGF0KGNvbnN0IGNoYXIgKmxhYmVsLAorCQkJc3RydWN0IGlteF91ZGNfc3RydWN0ICppbXhfdXNiLCBlbnVtIGVwMF9zdGF0ZSBzdGF0KQoreworCURfRVAwKGlteF91c2ItPmRldiwgIjwlcz4gZnJvbSAlMTVzIHRvICUxNXNcbiIsCisJCWxhYmVsLCBzdGF0ZV9uYW1lW2lteF91c2ItPmVwMHN0YXRlXSwgc3RhdGVfbmFtZVtzdGF0XSk7CisKKwlpZiAoaW14X3VzYi0+ZXAwc3RhdGUgPT0gc3RhdCkKKwkJcmV0dXJuOworCisJaW14X3VzYi0+ZXAwc3RhdGUgPSBzdGF0OworfQorCitzdGF0aWMgdm9pZCB1c2JfaW5pdF9kYXRhKHN0cnVjdCBpbXhfdWRjX3N0cnVjdCAqaW14X3VzYikKK3sKKwlzdHJ1Y3QgaW14X2VwX3N0cnVjdCAqaW14X2VwOworCXU4IGk7CisKKwkvKiBkZXZpY2UvZXAwIHJlY29yZHMgaW5pdCAqLworCUlOSVRfTElTVF9IRUFEKCZpbXhfdXNiLT5nYWRnZXQuZXBfbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJmlteF91c2ItPmdhZGdldC5lcDAtPmVwX2xpc3QpOworCWVwMF9jaGdfc3RhdChfX2Z1bmNfXywgaW14X3VzYiwgRVAwX0lETEUpOworCisJLyogYmFzaWMgZW5kcG9pbnQgcmVjb3JkcyBpbml0ICovCisJZm9yIChpID0gMDsgaSA8IElNWF9VU0JfTkJfRVA7IGkrKykgeworCQlpbXhfZXAgPSAmaW14X3VzYi0+aW14X2VwW2ldOworCisJCWlmIChpKSB7CisJCQlsaXN0X2FkZF90YWlsKCZpbXhfZXAtPmVwLmVwX2xpc3QsCisJCQkJJmlteF91c2ItPmdhZGdldC5lcF9saXN0KTsKKwkJCWlteF9lcC0+c3RvcHBlZCA9IDE7CisJCX0gZWxzZQorCQkJaW14X2VwLT5zdG9wcGVkID0gMDsKKworCQlJTklUX0xJU1RfSEVBRCgmaW14X2VwLT5xdWV1ZSk7CisJfQorfQorCitzdGF0aWMgdm9pZCB1ZGNfc3RvcF9hY3Rpdml0eShzdHJ1Y3QgaW14X3VkY19zdHJ1Y3QgKmlteF91c2IsCisJCQkJCXN0cnVjdCB1c2JfZ2FkZ2V0X2RyaXZlciAqZHJpdmVyKQoreworCXN0cnVjdCBpbXhfZXBfc3RydWN0ICppbXhfZXA7CisJaW50IGk7CisKKwlpZiAoaW14X3VzYi0+Z2FkZ2V0LnNwZWVkID09IFVTQl9TUEVFRF9VTktOT1dOKQorCQlkcml2ZXIgPSBOVUxMOworCisJLyogcHJldmVudCBuZXcgcmVxdWVzdCBzdWJtaXNzaW9ucywga2lsbCBhbnkgb3V0c3RhbmRpbmcgcmVxdWVzdHMgICovCisJZm9yIChpID0gMTsgaSA8IElNWF9VU0JfTkJfRVA7IGkrKykgeworCQlpbXhfZXAgPSAmaW14X3VzYi0+aW14X2VwW2ldOworCQlpbXhfZmx1c2goaW14X2VwKTsKKwkJaW14X2VwLT5zdG9wcGVkID0gMTsKKwkJaW14X2VwX2lycV9kaXNhYmxlKGlteF9lcCk7CisJCW51a2UoaW14X2VwLCAtRVNIVVRET1dOKTsKKwl9CisKKwlpbXhfdXNiLT5jZmcgPSAwOworCWlteF91c2ItPmludGYgPSAwOworCWlteF91c2ItPmFsdCA9IDA7CisKKwlpZiAoZHJpdmVyKQorCQlkcml2ZXItPmRpc2Nvbm5lY3QoJmlteF91c2ItPmdhZGdldCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJbnRlcnJ1cHQgaGFuZGxlcnMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworc3RhdGljIGlycXJldHVybl90IGlteF91ZGNfaXJxKGludCBpcnEsIHZvaWQgKmRldikKK3sKKwlzdHJ1Y3QgaW14X3VkY19zdHJ1Y3QgKmlteF91c2IgPSBkZXY7CisJc3RydWN0IHVzYl9jdHJscmVxdWVzdCB1OworCWludCB0ZW1wLCBjZmcsIGludGYsIGFsdDsKKwlpbnQgaW50ciA9IF9fcmF3X3JlYWRsKGlteF91c2ItPmJhc2UgKyBVU0JfSU5UUik7CisKKwlpZiAoaW50ciAmIChJTlRSX1dBS0VVUCB8IElOVFJfU1VTUEVORCB8IElOVFJfUkVTVU1FIHwgSU5UUl9SRVNFVF9TVEFSVAorCQkJfCBJTlRSX1JFU0VUX1NUT1AgfCBJTlRSX0NGR19DSEcpKSB7CisJCQkJZHVtcF9pbnRyKF9fZnVuY19fLCBpbnRyLCBpbXhfdXNiLT5kZXYpOworCQkJCWR1bXBfdXNiX3N0YXQoX19mdW5jX18sIGlteF91c2IpOworCX0KKworCWlmICghaW14X3VzYi0+ZHJpdmVyKSB7CisJCS8qaW14X3VkY19kaXNhYmxlKGlteF91c2IpOyovCisJCWdvdG8gZW5kX2lycTsKKwl9CisKKwlpZiAoaW50ciAmIElOVFJfV0FLRVVQKSB7CisJCWlmIChpbXhfdXNiLT5nYWRnZXQuc3BlZWQgPT0gVVNCX1NQRUVEX1VOS05PV04KKwkJCSYmIGlteF91c2ItPmRyaXZlciAmJiBpbXhfdXNiLT5kcml2ZXItPnJlc3VtZSkKKwkJCQlpbXhfdXNiLT5kcml2ZXItPnJlc3VtZSgmaW14X3VzYi0+Z2FkZ2V0KTsKKwkJaW14X3VzYi0+c2V0X2NvbmZpZyA9IDA7CisJCWlteF91c2ItPmdhZGdldC5zcGVlZCA9IFVTQl9TUEVFRF9GVUxMOworCX0KKworCWlmIChpbnRyICYgSU5UUl9TVVNQRU5EKSB7CisJCWlmIChpbXhfdXNiLT5nYWRnZXQuc3BlZWQgIT0gVVNCX1NQRUVEX1VOS05PV04KKwkJCSYmIGlteF91c2ItPmRyaXZlciAmJiBpbXhfdXNiLT5kcml2ZXItPnN1c3BlbmQpCisJCQkJaW14X3VzYi0+ZHJpdmVyLT5zdXNwZW5kKCZpbXhfdXNiLT5nYWRnZXQpOworCQlpbXhfdXNiLT5zZXRfY29uZmlnID0gMDsKKwkJaW14X3VzYi0+Z2FkZ2V0LnNwZWVkID0gVVNCX1NQRUVEX1VOS05PV047CisJfQorCisJaWYgKGludHIgJiBJTlRSX1JFU0VUX1NUQVJUKSB7CisJCV9fcmF3X3dyaXRlbChpbnRyLCBpbXhfdXNiLT5iYXNlICsgVVNCX0lOVFIpOworCQl1ZGNfc3RvcF9hY3Rpdml0eShpbXhfdXNiLCBpbXhfdXNiLT5kcml2ZXIpOworCQlpbXhfdXNiLT5zZXRfY29uZmlnID0gMDsKKwkJaW14X3VzYi0+Z2FkZ2V0LnNwZWVkID0gVVNCX1NQRUVEX1VOS05PV047CisJfQorCisJaWYgKGludHIgJiBJTlRSX1JFU0VUX1NUT1ApCisJCWlteF91c2ItPmdhZGdldC5zcGVlZCA9IFVTQl9TUEVFRF9GVUxMOworCisJaWYgKGludHIgJiBJTlRSX0NGR19DSEcpIHsKKwkJX19yYXdfd3JpdGVsKElOVFJfQ0ZHX0NIRywgaW14X3VzYi0+YmFzZSArIFVTQl9JTlRSKTsKKwkJdGVtcCA9IF9fcmF3X3JlYWRsKGlteF91c2ItPmJhc2UgKyBVU0JfU1RBVCk7CisJCWNmZyAgPSAodGVtcCAmIFNUQVRfQ0ZHKSA+PiA1OworCQlpbnRmID0gKHRlbXAgJiBTVEFUX0lOVEYpID4+IDM7CisJCWFsdCAgPSAgdGVtcCAmIFNUQVRfQUxUU0VUOworCisJCURfUkVRKGlteF91c2ItPmRldiwKKwkJCSI8JXM+IG9yaWcgY29uZmlnIEM9JWQsIEk9JWQsIEE9JWQgLyAiCisJCQkicmVxIGNvbmZpZyBDPSVkLCBJPSVkLCBBPSVkXG4iLAorCQkJX19mdW5jX18sIGlteF91c2ItPmNmZywgaW14X3VzYi0+aW50ZiwgaW14X3VzYi0+YWx0LAorCQkJY2ZnLCBpbnRmLCBhbHQpOworCisJCWlmIChjZmcgIT0gMSAmJiBjZmcgIT0gMikKKwkJCWdvdG8gZW5kX2lycTsKKworCQlpbXhfdXNiLT5zZXRfY29uZmlnID0gMDsKKworCQkvKiBDb25maWcgc2V0dXAgKi8KKwkJaWYgKGlteF91c2ItPmNmZyAhPSBjZmcpIHsKKwkJCURfUkVRKGlteF91c2ItPmRldiwgIjwlcz4gQ2hhbmdlIGNvbmZpZyBzdGFydFxuIixfX2Z1bmNfXyk7CisJCQl1LmJSZXF1ZXN0ID0gVVNCX1JFUV9TRVRfQ09ORklHVVJBVElPTjsKKwkJCXUuYlJlcXVlc3RUeXBlID0gVVNCX0RJUl9PVVQgfAorCQkJCQlVU0JfVFlQRV9TVEFOREFSRCB8CisJCQkJCVVTQl9SRUNJUF9ERVZJQ0U7CisJCQl1LndWYWx1ZSA9IGNmZzsKKwkJCXUud0luZGV4ID0gMDsKKwkJCXUud0xlbmd0aCA9IDA7CisJCQlpbXhfdXNiLT5jZmcgPSBjZmc7CisJCQlpbXhfdXNiLT5zZXRfY29uZmlnID0gMTsKKwkJCWlteF91c2ItPmRyaXZlci0+c2V0dXAoJmlteF91c2ItPmdhZGdldCwgJnUpOworCQkJaW14X3VzYi0+c2V0X2NvbmZpZyA9IDA7CisJCQlEX1JFUShpbXhfdXNiLT5kZXYsICI8JXM+IENoYW5nZSBjb25maWcgZG9uZVxuIixfX2Z1bmNfXyk7CisKKwkJfQorCQlpZiAoaW14X3VzYi0+aW50ZiAhPSBpbnRmIHx8IGlteF91c2ItPmFsdCAhPSBhbHQpIHsKKwkJCURfUkVRKGlteF91c2ItPmRldiwgIjwlcz4gQ2hhbmdlIGludGVyZmFjZSBzdGFydFxuIixfX2Z1bmNfXyk7CisJCQl1LmJSZXF1ZXN0ID0gVVNCX1JFUV9TRVRfSU5URVJGQUNFOworCQkJdS5iUmVxdWVzdFR5cGUgPSBVU0JfRElSX09VVCB8CisJCQkJCSAgVVNCX1RZUEVfU1RBTkRBUkQgfAorCQkJCQkgIFVTQl9SRUNJUF9JTlRFUkZBQ0U7CisJCQl1LndWYWx1ZSA9IGFsdDsKKwkJCXUud0luZGV4ID0gaW50ZjsKKwkJCXUud0xlbmd0aCA9IDA7CisJCQlpbXhfdXNiLT5pbnRmID0gaW50ZjsKKwkJCWlteF91c2ItPmFsdCA9IGFsdDsKKwkJCWlteF91c2ItPnNldF9jb25maWcgPSAxOworCQkJaW14X3VzYi0+ZHJpdmVyLT5zZXR1cCgmaW14X3VzYi0+Z2FkZ2V0LCAmdSk7CisJCQlpbXhfdXNiLT5zZXRfY29uZmlnID0gMDsKKwkJCURfUkVRKGlteF91c2ItPmRldiwgIjwlcz4gQ2hhbmdlIGludGVyZmFjZSBkb25lXG4iLF9fZnVuY19fKTsKKwkJfQorCX0KKworCWlmIChpbnRyICYgSU5UUl9TT0YpIHsKKwkJaWYgKGlteF91c2ItPmVwMHN0YXRlID09IEVQMF9JRExFKSB7CisJCQl0ZW1wID0gX19yYXdfcmVhZGwoaW14X3VzYi0+YmFzZSArIFVTQl9DVFJMKTsKKwkJCV9fcmF3X3dyaXRlbCh0ZW1wIHwgQ1RSTF9DTURPVkVSLCBpbXhfdXNiLT5iYXNlICsgVVNCX0NUUkwpOworCQl9CisJfQorCitlbmRfaXJxOgorCV9fcmF3X3dyaXRlbChpbnRyLCBpbXhfdXNiLT5iYXNlICsgVVNCX0lOVFIpOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGlycXJldHVybl90IGlteF91ZGNfY3RybF9pcnEoaW50IGlycSwgdm9pZCAqZGV2KQoreworCXN0cnVjdCBpbXhfdWRjX3N0cnVjdCAqaW14X3VzYiA9IGRldjsKKwlpbnQgaW50ciA9IF9fcmF3X3JlYWRsKGlteF91c2ItPmJhc2UgKyBVU0JfRVBfSU5UUigwKSk7CisKKwlkdW1wX2VwX2ludHIoX19mdW5jX18sIDAsIGludHIsIGlteF91c2ItPmRldik7CisKKwlpZiAoIWlteF91c2ItPmRyaXZlcikgeworCQlfX3Jhd193cml0ZWwoaW50ciwgaW14X3VzYi0+YmFzZSArIFVTQl9FUF9JTlRSKDApKTsKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KKworCS8qIERFVlJFUSBJUlEgaGFzIGhpZ2hlc3QgcHJpb3JpdHkgKi8KKwlpZiAoaW50ciAmIChFUElOVFJfREVWUkVRIHwgRVBJTlRSX01ERVZSRVEpKQorCQloYW5kbGVfZXAwX2RldnJlcShpbXhfdXNiKTsKKwkvKiBTZWVtIGkuTVggaXMgbWlzc2luZyBFT0YgaW50ZXJydXB0IHNvbWV0aW1lcy4KKwkgKiBUaGVyZWZvcmUgd2UgbW9uaXRvciBib3RoIEVPRiBhbmQgRklGT19FTVBUWSBpbnRlcnJ1cHMKKwkgKiB3aGVuIHRyYW5zbWl0aW5nLCBhbmQgYm90aCBFT0YgYW5kIEZJRk9fRlVMTCB3aGVuCisJICogcmVjZWl2aW5nIGRhdGEuCisJICovCisJZWxzZSBpZiAoaW50ciAmIChFUElOVFJfRU9GIHwgRVBJTlRSX0ZJRk9fRU1QVFkgfCBFUElOVFJfRklGT19GVUxMKSkKKwkJaGFuZGxlX2VwMCgmaW14X3VzYi0+aW14X2VwWzBdKTsKKworCV9fcmF3X3dyaXRlbChpbnRyLCBpbXhfdXNiLT5iYXNlICsgVVNCX0VQX0lOVFIoMCkpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgaW14X3VkY19idWxrX2lycShpbnQgaXJxLCB2b2lkICpkZXYpCit7CisJc3RydWN0IGlteF91ZGNfc3RydWN0ICppbXhfdXNiID0gZGV2OworCXN0cnVjdCBpbXhfZXBfc3RydWN0ICppbXhfZXAgPSAmaW14X3VzYi0+aW14X2VwW2lycSAtIFVTQkRfSU5UMF07CisJaW50IGludHIgPSBfX3Jhd19yZWFkbChpbXhfdXNiLT5iYXNlICsgVVNCX0VQX0lOVFIoRVBfTk8oaW14X2VwKSkpOworCisJZHVtcF9lcF9pbnRyKF9fZnVuY19fLCBpcnEgLSBVU0JEX0lOVDAsIGludHIsIGlteF91c2ItPmRldik7CisKKwlpZiAoIWlteF91c2ItPmRyaXZlcikgeworCQlfX3Jhd193cml0ZWwoaW50ciwgaW14X3VzYi0+YmFzZSArIFVTQl9FUF9JTlRSKEVQX05PKGlteF9lcCkpKTsKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KKworCWhhbmRsZV9lcChpbXhfZXApOworCisJX19yYXdfd3JpdGVsKGludHIsIGlteF91c2ItPmJhc2UgKyBVU0JfRVBfSU5UUihFUF9OTyhpbXhfZXApKSk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK2lycV9oYW5kbGVyX3QgaW50cl9oYW5kbGVyKGludCBpKQoreworCXN3aXRjaCAoaSkgeworCWNhc2UgMDoKKwkJcmV0dXJuIGlteF91ZGNfY3RybF9pcnE7CisJY2FzZSAxOgorCWNhc2UgMjoKKwljYXNlIDM6CisJY2FzZSA0OgorCWNhc2UgNToKKwkJcmV0dXJuIGlteF91ZGNfYnVsa19pcnE7CisJZGVmYXVsdDoKKwkJcmV0dXJuIGlteF91ZGNfaXJxOworCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFN0YXRpYyBkZWZpbmVkIElNWCBVREMgc3RydWN0dXJlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdXNiX2dhZGdldF9vcHMgaW14X3VkY19vcHMgPSB7CisJLmdldF9mcmFtZQkgPSBpbXhfdWRjX2dldF9mcmFtZSwKKwkud2FrZXVwCQkgPSBpbXhfdWRjX3dha2V1cCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaW14X3VkY19zdHJ1Y3QgY29udHJvbGxlciA9IHsKKwkuZ2FkZ2V0ID0geworCQkub3BzCQk9ICZpbXhfdWRjX29wcywKKwkJLmVwMAkJPSAmY29udHJvbGxlci5pbXhfZXBbMF0uZXAsCisJCS5uYW1lCQk9IGRyaXZlcl9uYW1lLAorCQkuZGV2ID0geworCQkJIC5idXNfaWQJPSAiZ2FkZ2V0IiwKKwkJIH0sCisJfSwKKworCS5pbXhfZXBbMF0gPSB7CisJCS5lcCA9IHsKKwkJCS5uYW1lCQk9IGVwMG5hbWUsCisJCQkub3BzCQk9ICZpbXhfZXBfb3BzLAorCQkJLm1heHBhY2tldAk9IDMyLAorCQl9LAorCQkuaW14X3VzYgkJPSAmY29udHJvbGxlciwKKwkJLmZpZm9zaXplCQk9IDMyLAorCQkuYkVuZHBvaW50QWRkcmVzcwk9IDAsCisJCS5ibUF0dHJpYnV0ZXMJCT0gVVNCX0VORFBPSU5UX1hGRVJfQ09OVFJPTCwKKwkgfSwKKwkuaW14X2VwWzFdID0geworCQkuZXAgPSB7CisJCQkubmFtZQkJPSAiZXAxaW4tYnVsayIsCisJCQkub3BzCQk9ICZpbXhfZXBfb3BzLAorCQkJLm1heHBhY2tldAk9IDY0LAorCQl9LAorCQkuaW14X3VzYgkJPSAmY29udHJvbGxlciwKKwkJLmZpZm9zaXplCQk9IDY0LAorCQkuYkVuZHBvaW50QWRkcmVzcwk9IFVTQl9ESVJfSU4gfCAxLAorCQkuYm1BdHRyaWJ1dGVzCQk9IFVTQl9FTkRQT0lOVF9YRkVSX0JVTEssCisJIH0sCisJLmlteF9lcFsyXSA9IHsKKwkJLmVwID0geworCQkJLm5hbWUJCT0gImVwMm91dC1idWxrIiwKKwkJCS5vcHMJCT0gJmlteF9lcF9vcHMsCisJCQkubWF4cGFja2V0CT0gNjQsCisJCX0sCisJCS5pbXhfdXNiCQk9ICZjb250cm9sbGVyLAorCQkuZmlmb3NpemUJCT0gNjQsCisJCS5iRW5kcG9pbnRBZGRyZXNzCT0gVVNCX0RJUl9PVVQgfCAyLAorCQkuYm1BdHRyaWJ1dGVzCQk9IFVTQl9FTkRQT0lOVF9YRkVSX0JVTEssCisJIH0sCisJLmlteF9lcFszXSA9IHsKKwkJLmVwID0geworCQkJLm5hbWUJCT0gImVwM291dC1idWxrIiwKKwkJCS5vcHMJCT0gJmlteF9lcF9vcHMsCisJCQkubWF4cGFja2V0CT0gMzIsCisJCX0sCisJCS5pbXhfdXNiCQk9ICZjb250cm9sbGVyLAorCQkuZmlmb3NpemUJCT0gMzIsCisJCS5iRW5kcG9pbnRBZGRyZXNzIAk9IFVTQl9ESVJfT1VUIHwgMywKKwkJLmJtQXR0cmlidXRlcwkJPSBVU0JfRU5EUE9JTlRfWEZFUl9CVUxLLAorCSB9LAorCS5pbXhfZXBbNF0gPSB7CisJCS5lcCA9IHsKKwkJCS5uYW1lCQk9ICJlcDRpbi1pbnQiLAorCQkJLm9wcwkJPSAmaW14X2VwX29wcywKKwkJCS5tYXhwYWNrZXQJPSAzMiwKKwkJIH0sCisJCS5pbXhfdXNiCQk9ICZjb250cm9sbGVyLAorCQkuZmlmb3NpemUJCT0gMzIsCisJCS5iRW5kcG9pbnRBZGRyZXNzIAk9IFVTQl9ESVJfSU4gfCA0LAorCQkuYm1BdHRyaWJ1dGVzCQk9IFVTQl9FTkRQT0lOVF9YRkVSX0lOVCwKKwkgfSwKKwkuaW14X2VwWzVdID0geworCQkuZXAgPSB7CisJCQkubmFtZQkJPSAiZXA1b3V0LWludCIsCisJCQkub3BzCQk9ICZpbXhfZXBfb3BzLAorCQkJLm1heHBhY2tldAk9IDMyLAorCQl9LAorCQkuaW14X3VzYgkJPSAmY29udHJvbGxlciwKKwkJLmZpZm9zaXplCQk9IDMyLAorCQkuYkVuZHBvaW50QWRkcmVzcyAJPSBVU0JfRElSX09VVCB8IDUsCisJCS5ibUF0dHJpYnV0ZXMJCT0gVVNCX0VORFBPSU5UX1hGRVJfSU5ULAorCSB9LAorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFVTQiBnYWRnZWQgZHJpdmVyIGZ1bmN0aW9ucworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworaW50IHVzYl9nYWRnZXRfcmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCB1c2JfZ2FkZ2V0X2RyaXZlciAqZHJpdmVyKQoreworCXN0cnVjdCBpbXhfdWRjX3N0cnVjdCAqaW14X3VzYiA9ICZjb250cm9sbGVyOworCWludCByZXR2YWw7CisKKwlpZiAoIWRyaXZlcgorCQl8fCBkcml2ZXItPnNwZWVkIDwgVVNCX1NQRUVEX0ZVTEwKKwkJfHwgIWRyaXZlci0+YmluZAorCQl8fCAhZHJpdmVyLT5kaXNjb25uZWN0CisJCXx8ICFkcml2ZXItPnNldHVwKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKCFpbXhfdXNiKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlpZiAoaW14X3VzYi0+ZHJpdmVyKQorCQlyZXR1cm4gLUVCVVNZOworCisJLyogZmlyc3QgaG9vayB1cCB0aGUgZHJpdmVyIC4uLiAqLworCWlteF91c2ItPmRyaXZlciA9IGRyaXZlcjsKKwlpbXhfdXNiLT5nYWRnZXQuZGV2LmRyaXZlciA9ICZkcml2ZXItPmRyaXZlcjsKKworCXJldHZhbCA9IGRldmljZV9hZGQoJmlteF91c2ItPmdhZGdldC5kZXYpOworCWlmIChyZXR2YWwpCisJCWdvdG8gZmFpbDsKKwlyZXR2YWwgPSBkcml2ZXItPmJpbmQoJmlteF91c2ItPmdhZGdldCk7CisJaWYgKHJldHZhbCkgeworCQlEX0VSUihpbXhfdXNiLT5kZXYsICI8JXM+IGJpbmQgdG8gZHJpdmVyICVzIC0tPiBlcnJvciAlZFxuIiwKKwkJCV9fZnVuY19fLCBkcml2ZXItPmRyaXZlci5uYW1lLCByZXR2YWwpOworCQlkZXZpY2VfZGVsKCZpbXhfdXNiLT5nYWRnZXQuZGV2KTsKKworCQlnb3RvIGZhaWw7CisJfQorCisJRF9JTkkoaW14X3VzYi0+ZGV2LCAiPCVzPiByZWdpc3RlcmVkIGdhZGdldCBkcml2ZXIgJyVzJ1xuIiwKKwkJX19mdW5jX18sIGRyaXZlci0+ZHJpdmVyLm5hbWUpOworCisJaW14X3VkY19lbmFibGUoaW14X3VzYik7CisKKwlyZXR1cm4gMDsKK2ZhaWw6CisJaW14X3VzYi0+ZHJpdmVyID0gTlVMTDsKKwlpbXhfdXNiLT5nYWRnZXQuZGV2LmRyaXZlciA9IE5VTEw7CisJcmV0dXJuIHJldHZhbDsKK30KK0VYUE9SVF9TWU1CT0wodXNiX2dhZGdldF9yZWdpc3Rlcl9kcml2ZXIpOworCitpbnQgdXNiX2dhZGdldF91bnJlZ2lzdGVyX2RyaXZlcihzdHJ1Y3QgdXNiX2dhZGdldF9kcml2ZXIgKmRyaXZlcikKK3sKKwlzdHJ1Y3QgaW14X3VkY19zdHJ1Y3QgKmlteF91c2IgPSAmY29udHJvbGxlcjsKKworCWlmICghaW14X3VzYikKKwkJcmV0dXJuIC1FTk9ERVY7CisJaWYgKCFkcml2ZXIgfHwgZHJpdmVyICE9IGlteF91c2ItPmRyaXZlciB8fCAhZHJpdmVyLT51bmJpbmQpCisJCXJldHVybiAtRUlOVkFMOworCisJdWRjX3N0b3BfYWN0aXZpdHkoaW14X3VzYiwgZHJpdmVyKTsKKwlpbXhfdWRjX2Rpc2FibGUoaW14X3VzYik7CisKKwlkcml2ZXItPnVuYmluZCgmaW14X3VzYi0+Z2FkZ2V0KTsKKwlpbXhfdXNiLT5nYWRnZXQuZGV2LmRyaXZlciA9IE5VTEw7CisJaW14X3VzYi0+ZHJpdmVyID0gTlVMTDsKKworCWRldmljZV9kZWwoJmlteF91c2ItPmdhZGdldC5kZXYpOworCisJRF9JTkkoaW14X3VzYi0+ZGV2LCAiPCVzPiB1bnJlZ2lzdGVyZWQgZ2FkZ2V0IGRyaXZlciAnJXMnXG4iLAorCQlfX2Z1bmNfXywgZHJpdmVyLT5kcml2ZXIubmFtZSk7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0wodXNiX2dhZGdldF91bnJlZ2lzdGVyX2RyaXZlcik7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNb2R1bGUgZnVuY3Rpb25zCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKK3N0YXRpYyBpbnQgX19pbml0IGlteF91ZGNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgaW14X3VkY19zdHJ1Y3QgKmlteF91c2IgPSAmY29udHJvbGxlcjsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwlzdHJ1Y3QgaW14dXNiX3BsYXRmb3JtX2RhdGEgKnBkYXRhOworCXN0cnVjdCBjbGsgKmNsazsKKwl2b2lkIF9faW9tZW0gKmJhc2U7CisJaW50IHJldCA9IDA7CisJaW50IGksIHJlc19zaXplOworCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlpZiAoIXJlcykgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjYW4ndCBnZXQgZGV2aWNlIHJlc291cmNlc1xuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJaWYgKCFwZGF0YSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJkcml2ZXIgbmVlZHMgcGxhdGZvcm0gZGF0YVxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXJlc19zaXplID0gcmVzLT5lbmQgLSByZXMtPnN0YXJ0ICsgMTsKKwlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihyZXMtPnN0YXJ0LCByZXNfc2l6ZSwgcmVzLT5uYW1lKSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjYW4ndCBhbGxvY2F0ZSAlZCBieXRlcyBhdCAlZCBhZGRyZXNzXG4iLAorCQkJcmVzX3NpemUsIHJlcy0+c3RhcnQpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlpZiAocGRhdGEtPmluaXQpIHsKKwkJcmV0ID0gcGRhdGEtPmluaXQoJnBkZXYtPmRldik7CisJCWlmIChyZXQpCisJCQlnb3RvIGZhaWwwOworCX0KKworCWJhc2UgPSBpb3JlbWFwKHJlcy0+c3RhcnQsIHJlc19zaXplKTsKKwlpZiAoIWJhc2UpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiaW9yZW1hcCBmYWlsZWRcbiIpOworCQlyZXQgPSAtRUlPOworCQlnb3RvIGZhaWwxOworCX0KKworCWNsayA9IGNsa19nZXQoTlVMTCwgInVzYmRfY2xrIik7CisJaWYgKElTX0VSUihjbGspKSB7CisJCXJldCA9IFBUUl9FUlIoY2xrKTsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiY2FuJ3QgZ2V0IFVTQiBjbG9ja1xuIik7CisJCWdvdG8gZmFpbDI7CisJfQorCWNsa19lbmFibGUoY2xrKTsKKworCWlmIChjbGtfZ2V0X3JhdGUoY2xrKSAhPSA0ODAwMDAwMCkgeworCQlEX0lOSSgmcGRldi0+ZGV2LAorCQkJIkJhZCBVU0IgY2xvY2sgKCVkIEh6KSwgY2hhbmdpbmcgdG8gNDgwMDAwMDAgSHpcbiIsCisJCQkoaW50KWNsa19nZXRfcmF0ZShjbGspKTsKKwkJaWYgKGNsa19zZXRfcmF0ZShjbGssIDQ4MDAwMDAwKSkgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LAorCQkJCSJVbmFibGUgdG8gc2V0IGNvcnJlY3QgVVNCIGNsb2NrICg0OE1IeilcbiIpOworCQkJcmV0ID0gLUVJTzsKKwkJCWdvdG8gZmFpbDM7CisJCX0KKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgSU1YX1VTQl9OQl9FUCArIDE7IGkrKykgeworCQlpbXhfdXNiLT51c2JkX2ludFtpXSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgaSk7CisJCWlmIChpbXhfdXNiLT51c2JkX2ludFtpXSA8IDApIHsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwgImNhbid0IGdldCBpcnEgbnVtYmVyXG4iKTsKKwkJCXJldCA9IC1FTk9ERVY7CisJCQlnb3RvIGZhaWwzOworCQl9CisJfQorCisJZm9yIChpID0gMDsgaSA8IElNWF9VU0JfTkJfRVAgKyAxOyBpKyspIHsKKwkJcmV0ID0gcmVxdWVzdF9pcnEoaW14X3VzYi0+dXNiZF9pbnRbaV0sIGludHJfaGFuZGxlcihpKSwKKwkJCQkgICAgIElSUUZfRElTQUJMRUQsIGRyaXZlcl9uYW1lLCBpbXhfdXNiKTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiY2FuJ3QgZ2V0IGlycSAlaSwgZXJyICVkXG4iLAorCQkJCWlteF91c2ItPnVzYmRfaW50W2ldLCByZXQpOworCQkJZm9yICgtLWk7IGkgPj0gMDsgaS0tKQorCQkJCWZyZWVfaXJxKGlteF91c2ItPnVzYmRfaW50W2ldLCBpbXhfdXNiKTsKKwkJCWdvdG8gZmFpbDM7CisJCX0KKwl9CisKKwlpbXhfdXNiLT5yZXMgPSByZXM7CisJaW14X3VzYi0+YmFzZSA9IGJhc2U7CisJaW14X3VzYi0+Y2xrID0gY2xrOworCWlteF91c2ItPmRldiA9ICZwZGV2LT5kZXY7CisKKwlkZXZpY2VfaW5pdGlhbGl6ZSgmaW14X3VzYi0+Z2FkZ2V0LmRldik7CisKKwlpbXhfdXNiLT5nYWRnZXQuZGV2LnBhcmVudCA9ICZwZGV2LT5kZXY7CisJaW14X3VzYi0+Z2FkZ2V0LmRldi5kbWFfbWFzayA9IHBkZXYtPmRldi5kbWFfbWFzazsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGlteF91c2IpOworCisJdXNiX2luaXRfZGF0YShpbXhfdXNiKTsKKwlpbXhfdWRjX2luaXQoaW14X3VzYik7CisKKwlyZXR1cm4gMDsKKworZmFpbDM6CisJY2xrX3B1dChjbGspOworCWNsa19kaXNhYmxlKGNsayk7CitmYWlsMjoKKwlpb3VubWFwKGJhc2UpOworZmFpbDE6CisJaWYgKHBkYXRhLT5leGl0KQorCQlwZGF0YS0+ZXhpdCgmcGRldi0+ZGV2KTsKK2ZhaWwwOgorCXJlbGVhc2VfbWVtX3JlZ2lvbihyZXMtPnN0YXJ0LCByZXNfc2l6ZSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2V4aXQgaW14X3VkY19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgaW14X3VkY19zdHJ1Y3QgKmlteF91c2IgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgaW14dXNiX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJaW50IGk7CisKKwlpbXhfdWRjX2Rpc2FibGUoaW14X3VzYik7CisKKwlmb3IgKGkgPSAwOyBpIDwgSU1YX1VTQl9OQl9FUCArIDE7IGkrKykKKwkJZnJlZV9pcnEoaW14X3VzYi0+dXNiZF9pbnRbaV0sIGlteF91c2IpOworCisJY2xrX3B1dChpbXhfdXNiLT5jbGspOworCWNsa19kaXNhYmxlKGlteF91c2ItPmNsayk7CisJaW91bm1hcChpbXhfdXNiLT5iYXNlKTsKKworCXJlbGVhc2VfbWVtX3JlZ2lvbihpbXhfdXNiLT5yZXMtPnN0YXJ0LAorCQlpbXhfdXNiLT5yZXMtPmVuZCAtIGlteF91c2ItPnJlcy0+c3RhcnQgKyAxKTsKKworCWlmIChwZGF0YS0+ZXhpdCkKKwkJcGRhdGEtPmV4aXQoJnBkZXYtPmRldik7CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKworCXJldHVybiAwOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZkZWYJQ09ORklHX1BNCisjZGVmaW5lCWlteF91ZGNfc3VzcGVuZAlOVUxMCisjZGVmaW5lCWlteF91ZGNfcmVzdW1lCU5VTEwKKyNlbHNlCisjZGVmaW5lCWlteF91ZGNfc3VzcGVuZAlOVUxMCisjZGVmaW5lCWlteF91ZGNfcmVzdW1lCU5VTEwKKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciB1ZGNfZHJpdmVyID0geworCS5kcml2ZXIJCT0geworCQkubmFtZQk9IGRyaXZlcl9uYW1lLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9LAorCS5yZW1vdmUJCT0gX19leGl0X3AoaW14X3VkY19yZW1vdmUpLAorCS5zdXNwZW5kCT0gaW14X3VkY19zdXNwZW5kLAorCS5yZXN1bWUJCT0gaW14X3VkY19yZXN1bWUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCB1ZGNfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcHJvYmUoJnVkY19kcml2ZXIsIGlteF91ZGNfcHJvYmUpOworfQorbW9kdWxlX2luaXQodWRjX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgdWRjX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmdWRjX2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdCh1ZGNfZXhpdCk7CisKK01PRFVMRV9ERVNDUklQVElPTigiSU1YIFVTQiBEZXZpY2UgQ29udHJvbGxlciBkcml2ZXIiKTsKK01PRFVMRV9BVVRIT1IoIkRhcml1cyBBdWd1bGlzIDxhdWd1bGlzLmRhcml1c0BnbWFpbC5jb20+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOmlteF91ZGMiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9pbXhfdWRjLmggYi9kcml2ZXJzL3VzYi9nYWRnZXQvaW14X3VkYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1MDA3NjkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvaW14X3VkYy5oCkBAIC0wLDAgKzEsMzQ0IEBACisvKgorICoJQ29weXJpZ2h0IChDKSAyMDA1IE1pa2UgTGVlKGVlbWlrZUBnbWFpbC5jb20pCisgKgorICoJVGhpcyB1ZGMgZHJpdmVyIGlzIG5vdyB1bmRlciB0ZXN0aW5nIGFuZCBjb2RlIGlzIGJhc2VkIG9uIHB4YTJ4eF91ZGMuaAorICoJUGxlYXNlIHVzZSBpdCB3aXRoIHlvdXIgb3duIHJpc2shCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKgl0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICoJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqCWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKglNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKglHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgX19MSU5VWF9VU0JfR0FER0VUX0lNWF9ICisjZGVmaW5lIF9fTElOVVhfVVNCX0dBREdFVF9JTVhfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworLyogSGVscGVyIG1hY3JvcyAqLworI2RlZmluZSBFUF9OTyhlcCkJKChlcC0+YkVuZHBvaW50QWRkcmVzcykgJiB+VVNCX0RJUl9JTikgLyogSU46MSwgT1VUOjAgKi8KKyNkZWZpbmUgRVBfRElSKGVwKQkoKGVwLT5iRW5kcG9pbnRBZGRyZXNzKSAmIFVTQl9ESVJfSU4gPyAxIDogMCkKKyNkZWZpbmUgaXJxX3RvX2VwKGlycSkJKCgoaXJxKSA+PSBVU0JEX0lOVDApIHx8ICgoaXJxKSA8PSBVU0JEX0lOVDYpID8gKChpcnEpIC0gVVNCRF9JTlQwKSA6IChVU0JEX0lOVDYpKSAvKnNob3VsZCBub3QgaGFwcGVuKi8KKyNkZWZpbmUgZXBfdG9faXJxKGVwKQkoRVBfTk8oKGVwKSkgKyBVU0JEX0lOVDApCisjZGVmaW5lIElNWF9VU0JfTkJfRVAJNgorCisvKiBEcml2ZXIgc3RydWN0dXJlcyAqLworc3RydWN0IGlteF9yZXF1ZXN0IHsKKwlzdHJ1Y3QgdXNiX3JlcXVlc3QJCQlyZXE7CisJc3RydWN0IGxpc3RfaGVhZAkJCXF1ZXVlOworCXVuc2lnbmVkIGludAkJCQlpbl91c2U7Cit9OworCitlbnVtIGVwMF9zdGF0ZSB7CisJRVAwX0lETEUsCisJRVAwX0lOX0RBVEFfUEhBU0UsCisJRVAwX09VVF9EQVRBX1BIQVNFLAorCUVQMF9DT05GSUcsCisJRVAwX1NUQUxMLAorfTsKKworc3RydWN0IGlteF9lcF9zdHJ1Y3QgeworCXN0cnVjdCB1c2JfZXAJCQkJZXA7CisJc3RydWN0IGlteF91ZGNfc3RydWN0CQkJKmlteF91c2I7CisJc3RydWN0IGxpc3RfaGVhZAkJCXF1ZXVlOworCXVuc2lnbmVkIGNoYXIJCQkJc3RvcHBlZDsKKwl1bnNpZ25lZCBjaGFyCQkJCWZpZm9zaXplOworCXVuc2lnbmVkIGNoYXIJCQkJYkVuZHBvaW50QWRkcmVzczsKKwl1bnNpZ25lZCBjaGFyCQkJCWJtQXR0cmlidXRlczsKK307CisKK3N0cnVjdCBpbXhfdWRjX3N0cnVjdCB7CisJc3RydWN0IHVzYl9nYWRnZXQJCQlnYWRnZXQ7CisJc3RydWN0IHVzYl9nYWRnZXRfZHJpdmVyCQkqZHJpdmVyOworCXN0cnVjdCBkZXZpY2UJCQkJKmRldjsKKwlzdHJ1Y3QgaW14X2VwX3N0cnVjdAkJCWlteF9lcFtJTVhfVVNCX05CX0VQXTsKKwlzdHJ1Y3QgY2xrCQkJCSpjbGs7CisJZW51bSBlcDBfc3RhdGUJCQkJZXAwc3RhdGU7CisJc3RydWN0IHJlc291cmNlCQkJCSpyZXM7CisJdm9pZCBfX2lvbWVtCQkJCSpiYXNlOworCXVuc2lnbmVkIGNoYXIJCQkJc2V0X2NvbmZpZzsKKwlpbnQJCQkJCWNmZywKKwkJCQkJCWludGYsCisJCQkJCQlhbHQsCisJCQkJCQl1c2JkX2ludFs3XTsKK307CisKKy8qIFVTQiByZWdpc3RlcnMgKi8KKyNkZWZpbmUgIFVTQl9GUkFNRQkJKDB4MDApCS8qIFVTQiBmcmFtZSAqLworI2RlZmluZSAgVVNCX1NQRUMJCSgweDA0KQkvKiBVU0IgU3BlYyAqLworI2RlZmluZSAgVVNCX1NUQVQJCSgweDA4KQkvKiBVU0IgU3RhdHVzICovCisjZGVmaW5lICBVU0JfQ1RSTAkJKDB4MEMpCS8qIFVTQiBDb250cm9sICovCisjZGVmaW5lICBVU0JfREFEUgkJKDB4MTApCS8qIFVTQiBEZXNjIFJBTSBhZGRyICovCisjZGVmaW5lICBVU0JfRERBVAkJKDB4MTQpCS8qIFVTQiBEZXNjIFJBTS9FUCBidWZmZXIgZGF0YSAqLworI2RlZmluZSAgVVNCX0lOVFIJCSgweDE4KQkvKiBVU0IgaW50ZXJydXB0ICovCisjZGVmaW5lICBVU0JfTUFTSwkJKDB4MUMpCS8qIFVTQiBNYXNrICovCisjZGVmaW5lICBVU0JfRU5BQgkJKDB4MjQpCS8qIFVTQiBFbmFibGUgKi8KKyNkZWZpbmUgIFVTQl9FUF9TVEFUKHgpCQkoMHgzMCArICh4KjB4MzApKSAvKiBVU0Igc3RhdHVzL2NvbnRyb2wgKi8KKyNkZWZpbmUgIFVTQl9FUF9JTlRSKHgpCQkoMHgzNCArICh4KjB4MzApKSAvKiBVU0IgaW50ZXJydXB0ICovCisjZGVmaW5lICBVU0JfRVBfTUFTSyh4KQkJKDB4MzggKyAoeCoweDMwKSkgLyogVVNCIG1hc2sgKi8KKyNkZWZpbmUgIFVTQl9FUF9GREFUKHgpCQkoMHgzQyArICh4KjB4MzApKSAvKiBVU0IgRklGTyBkYXRhICovCisjZGVmaW5lICBVU0JfRVBfRkRBVDAoeCkJKDB4M0MgKyAoeCoweDMwKSkgLyogVVNCIEZJRk8gZGF0YSAqLworI2RlZmluZSAgVVNCX0VQX0ZEQVQxKHgpCSgweDNEICsgKHgqMHgzMCkpIC8qIFVTQiBGSUZPIGRhdGEgKi8KKyNkZWZpbmUgIFVTQl9FUF9GREFUMih4KQkoMHgzRSArICh4KjB4MzApKSAvKiBVU0IgRklGTyBkYXRhICovCisjZGVmaW5lICBVU0JfRVBfRkRBVDMoeCkJKDB4M0YgKyAoeCoweDMwKSkgLyogVVNCIEZJRk8gZGF0YSAqLworI2RlZmluZSAgVVNCX0VQX0ZTVEFUKHgpCSgweDQwICsgKHgqMHgzMCkpIC8qIFVTQiBGSUZPIHN0YXR1cyAqLworI2RlZmluZSAgVVNCX0VQX0ZDVFJMKHgpCSgweDQ0ICsgKHgqMHgzMCkpIC8qIFVTQiBGSUZPIGNvbnRyb2wgKi8KKyNkZWZpbmUgIFVTQl9FUF9MUkZQKHgpCQkoMHg0OCArICh4KjB4MzApKSAvKiBVU0IgbGFzdCByZWFkIGZyYW1lIHBvaW50ZXIgKi8KKyNkZWZpbmUgIFVTQl9FUF9MV0ZQKHgpCQkoMHg0QyArICh4KjB4MzApKSAvKiBVU0IgbGFzdCB3cml0ZSBmcmFtZSBwb2ludGVyICovCisjZGVmaW5lICBVU0JfRVBfRkFMUk0oeCkJKDB4NTAgKyAoeCoweDMwKSkgLyogVVNCIEZJRk8gYWxhcm0gKi8KKyNkZWZpbmUgIFVTQl9FUF9GUkRQKHgpCQkoMHg1NCArICh4KjB4MzApKSAvKiBVU0IgRklGTyByZWFkIHBvaW50ZXIgKi8KKyNkZWZpbmUgIFVTQl9FUF9GV1JQKHgpCQkoMHg1OCArICh4KjB4MzApKSAvKiBVU0IgRklGTyB3cml0ZSBwb2ludGVyICovCisvKiBVU0IgQ29udHJvbCBSZWdpc3RlciBCaXQgRmllbGRzLiovCisjZGVmaW5lIENUUkxfQ01ET1ZFUgkJKDE8PDYpCS8qIFVEQyBzdGF0dXMgKi8KKyNkZWZpbmUgQ1RSTF9DTURFUlJPUgkJKDE8PDUpCS8qIFVEQyBzdGF0dXMgKi8KKyNkZWZpbmUgQ1RSTF9GRV9FTkEJCSgxPDwzKQkvKiBFbmFibGUgRm9udCBFbmQgbG9naWMgKi8KKyNkZWZpbmUgQ1RSTF9VRENfUlNUCQkoMTw8MikJLyogVURDIHJlc2V0ICovCisjZGVmaW5lIENUUkxfQUZFX0VOQQkJKDE8PDEpCS8qIEFuYWxvZyBGb250IGVuZCBlbmFibGUgKi8KKyNkZWZpbmUgQ1RSTF9SRVNVTUUJCSgxPDwwKQkvKiBVREMgcmVzdW1lICovCisvKiBVU0IgU3RhdHVzIFJlZ2lzdGVyIEJpdCBGaWVsZHMuKi8KKyNkZWZpbmUgU1RBVF9SU1QJCSgxPDw4KQorI2RlZmluZSBTVEFUX1NVU1AJCSgxPDw3KQorI2RlZmluZSBTVEFUX0NGRwkJKDM8PDUpCisjZGVmaW5lIFNUQVRfSU5URgkJKDM8PDMpCisjZGVmaW5lIFNUQVRfQUxUU0VUCQkoNzw8MCkKKy8qIFVTQiBJbnRlcnJ1cHQgU3RhdHVzL01hc2sgUmVnaXN0ZXJzIEJpdCBmaWVsZHMgKi8KKyNkZWZpbmUgSU5UUl9XQUtFVVAJCSgxPDwzMSkJLyogV2FrZSB1cCBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUgSU5UUl9NU09GCQkoMTw8NykJLyogTWlzc2VkIFN0YXJ0IG9mIEZyYW1lICovCisjZGVmaW5lIElOVFJfU09GCQkoMTw8NikJLyogU3RhcnQgb2YgRnJhbWUgKi8KKyNkZWZpbmUgSU5UUl9SRVNFVF9TVE9QCQkoMTw8NSkJLyogUmVzZXQgU2lnbmFsaW5nIHN0b3AgKi8KKyNkZWZpbmUgSU5UUl9SRVNFVF9TVEFSVAkoMTw8NCkJLyogUmVzZXQgU2lnbmFsaW5nIHN0YXJ0ICovCisjZGVmaW5lIElOVFJfUkVTVU1FCQkoMTw8MykJLyogU3VzcGVuZCB0byByZXN1bWUgKi8KKyNkZWZpbmUgSU5UUl9TVVNQRU5ECQkoMTw8MikJLyogQWN0aXZlIHRvIHN1c3BlbmQgKi8KKyNkZWZpbmUgSU5UUl9GUkFNRV9NQVRDSAkoMTw8MSkJLyogRnJhbWUgbWF0Y2hlZCAqLworI2RlZmluZSBJTlRSX0NGR19DSEcJCSgxPDwwKQkvKiBDb25maWd1cmF0aW9uIGNoYW5nZSBvY2N1cnJlZCAqLworLyogVVNCIEVuYWJsZSBSZWdpc3RlciBCaXQgRmllbGRzLiovCisjZGVmaW5lIEVOQUJfUlNUCQkoMTw8MzEpCS8qIFJlc2V0IFVTQiBtb2R1bGVzICovCisjZGVmaW5lIEVOQUJfRU5BQgkJKDE8PDMwKQkvKiBFbmFibGUgVVNCIG1vZHVsZXMqLworI2RlZmluZSBFTkFCX1NVU1BFTkQJCSgxPDwyOSkJLyogU3VzcGVuZCBVU0IgbW9kdWxlcyAqLworI2RlZmluZSBFTkFCX0VORElBTgkJKDE8PDI4KQkvKiBFbmRpYW4gb2YgVVNCIG1vZHVsZXMgKi8KKyNkZWZpbmUgRU5BQl9QV1JNRAkJKDE8PDApCS8qIFBvd2VyIG1vZGUgb2YgVVNCIG1vZHVsZXMgKi8KKy8qIFVTQiBEZXNjcmlwdG9yIFJhbSBBZGRyZXNzIFJlZ2lzdGVyIGJpdCBmaWVsZHMgKi8KKyNkZWZpbmUgREFEUl9DRkcJCSgxPDwzMSkJLyogQ29uZmlndXJhdGlvbiAqLworI2RlZmluZSBEQURSX0JTWQkJKDE8PDMwKQkvKiBCdXN5IHN0YXR1cyAqLworI2RlZmluZSBEQURSX0RBRFIJCSgweDFGRikJLyogRGVzY3JpcHRvciBSYW0gQWRkcmVzcyAqLworLyogVVNCIERlc2NyaXB0b3IgUkFNL0VuZHBvaW50IEJ1ZmZlciBEYXRhIFJlZ2lzdGVyIGJpdCBmaWVsZHMgKi8KKyNkZWZpbmUgRERBVF9EREFUCQkoMHhGRikJLyogRGVzY3JpcHRvciBFbmRwb2ludCBCdWZmZXIgKi8KKy8qIFVTQiBFbmRwb2ludCBTdGF0dXMgUmVnaXN0ZXIgYml0IGZpZWxkcyAqLworI2RlZmluZSBFUFNUQVRfQkNPVU5UCQkoMHg3Rjw8MTYpCS8qIEVuZHBvaW50IEZJRk8gYnl0ZSBjb3VudCAqLworI2RlZmluZSBFUFNUQVRfU0lQCQkoMTw8OCkJLyogRW5kcG9pbnQgc2V0dXAgaW4gcHJvZ3Jlc3MgKi8KKyNkZWZpbmUgRVBTVEFUX0RJUgkJKDE8PDcpCS8qIEVuZHBvaW50IHRyYW5zZmVyIGRpcmVjdGlvbiAqLworI2RlZmluZSBFUFNUQVRfTUFYCQkoMzw8NSkJLyogRW5kcG9pbnQgTWF4IHBhY2tldCBzaXplICovCisjZGVmaW5lIEVQU1RBVF9UWVAJCSgzPDwzKQkvKiBFbmRwb2ludCB0eXBlICovCisjZGVmaW5lIEVQU1RBVF9aTFBTCQkoMTw8MikJLyogU2VuZCB6ZXJvIGxlbmd0aCBwYWNrZXQgKi8KKyNkZWZpbmUgRVBTVEFUX0ZMVVNICQkoMTw8MSkJLyogRW5kcG9pbnQgRklGTyBGbHVzaCAqLworI2RlZmluZSBFUFNUQVRfU1RBTEwJCSgxPDwwKQkvKiBGb3JjZSBzdGFsbCAqLworLyogVVNCIEVuZHBvaW50IEZJRk8gU3RhdHVzIFJlZ2lzdGVyIGJpdCBmaWVsZHMgKi8KKyNkZWZpbmUgRlNUQVRfRlJBTUVfU1RBVAkoMHhGPDwyNCkJLyogRnJhbWUgc3RhdHVzIGJpdCBbMC0zXSAqLworI2RlZmluZSBGU1RBVF9FUlIJCSgxPDwyMikJLyogRklGTyBlcnJvciAqLworI2RlZmluZSBGU1RBVF9VRgkJKDE8PDIxKQkvKiBGSUZPIHVuZGVyZmxvdyAqLworI2RlZmluZSBGU1RBVF9PRgkJKDE8PDIwKQkvKiBGSUZPIG92ZXJmbG93ICovCisjZGVmaW5lIEZTVEFUX0ZSCQkoMTw8MTkpCS8qIEZJRk8gZnJhbWUgcmVhZHkgKi8KKyNkZWZpbmUgRlNUQVRfRlVMTAkJKDE8PDE4KQkvKiBGSUZPIGZ1bGwgKi8KKyNkZWZpbmUgRlNUQVRfQUxSTQkJKDE8PDE3KQkvKiBGSUZPIGFsYXJtICovCisjZGVmaW5lIEZTVEFUX0VNUFRZCQkoMTw8MTYpCS8qIEZJRk8gZW1wdHkgKi8KKy8qIFVTQiBFbmRwb2ludCBGSUZPIENvbnRyb2wgUmVnaXN0ZXIgYml0IGZpZWxkcyAqLworI2RlZmluZSBGQ1RSTF9XRlIJCSgxPDwyOSkJLyogV3JpdGUgZnJhbWUgZW5kICovCisvKiBVU0IgRW5kcG9pbnQgSW50ZXJydXB0IFN0YXR1cyBSZWdzaXRlciBiaXQgZmllbGRzICovCisjZGVmaW5lIEVQSU5UUl9GSUZPX0ZVTEwJKDE8PDgpCS8qIGZpZm8gZnVsbCAqLworI2RlZmluZSBFUElOVFJfRklGT19FTVBUWQkoMTw8NykJLyogZmlmbyBlbXB0eSAqLworI2RlZmluZSBFUElOVFJfRklGT19FUlJPUgkoMTw8NikJLyogZmlmbyBlcnJvciAqLworI2RlZmluZSBFUElOVFJfRklGT19ISUdICSgxPDw1KQkvKiBmaWZvIGhpZ2ggKi8KKyNkZWZpbmUgRVBJTlRSX0ZJRk9fTE9XCQkoMTw8NCkJLyogZmlmbyBsb3cgKi8KKyNkZWZpbmUgRVBJTlRSX01ERVZSRVEJCSgxPDwzKQkvKiBtdWx0aSBEZXZpY2UgcmVxdWVzdCAqLworI2RlZmluZSBFUElOVFJfRU9UCQkoMTw8MikJLyogZmlmbyBlbmQgb2YgdHJhbnNmZXIgKi8KKyNkZWZpbmUgRVBJTlRSX0RFVlJFUQkJKDE8PDEpCS8qIERldmljZSByZXF1ZXN0ICovCisjZGVmaW5lIEVQSU5UUl9FT0YJCSgxPDwwKQkvKiBmaWZvIGVuZCBvZiBmcmFtZSAqLworCisvKiBEZWJ1ZyBtYWNyb3MgKi8KKyNpZmRlZiBERUJVRworCisvKiAjZGVmaW5lIERFQlVHX1JFUSAqLworLyogI2RlZmluZSBERUJVR19UUlggKi8KKy8qICNkZWZpbmUgREVCVUdfSU5JVCAqLworLyogI2RlZmluZSBERUJVR19FUDAgKi8KKy8qICNkZWZpbmUgREVCVUdfRVBYICovCisvKiAjZGVmaW5lIERFQlVHX0lSUSAqLworLyogI2RlZmluZSBERUJVR19FUElSUSAqLworLyogI2RlZmluZSBERUJVR19EVU1QICovCisjZGVmaW5lIERFQlVHX0VSUgorCisjaWZkZWYgREVCVUdfUkVRCisJI2RlZmluZSBEX1JFUShkZXYsIGFyZ3MuLi4pCWRldl9kYmcoZGV2LCAjIyBhcmdzKQorI2Vsc2UKKwkjZGVmaW5lIERfUkVRKGRldiwgYXJncy4uLikJZG8ge30gd2hpbGUgKDApCisjZW5kaWYgLyogREVCVUdfUkVRICovCisKKyNpZmRlZiBERUJVR19UUlgKKwkjZGVmaW5lIERfVFJYKGRldiwgYXJncy4uLikJZGV2X2RiZyhkZXYsICMjIGFyZ3MpCisjZWxzZQorCSNkZWZpbmUgRF9UUlgoZGV2LCBhcmdzLi4uKQlkbyB7fSB3aGlsZSAoMCkKKyNlbmRpZiAvKiBERUJVR19UUlggKi8KKworI2lmZGVmIERFQlVHX0lOSVQKKwkjZGVmaW5lIERfSU5JKGRldiwgYXJncy4uLikJZGV2X2RiZyhkZXYsICMjIGFyZ3MpCisjZWxzZQorCSNkZWZpbmUgRF9JTkkoZGV2LCBhcmdzLi4uKQlkbyB7fSB3aGlsZSAoMCkKKyNlbmRpZiAvKiBERUJVR19JTklUICovCisKKyNpZmRlZiBERUJVR19FUDAKKwlzdGF0aWMgY29uc3QgY2hhciAqc3RhdGVfbmFtZVtdID0geworCQkiRVAwX0lETEUiLAorCQkiRVAwX0lOX0RBVEFfUEhBU0UiLAorCQkiRVAwX09VVF9EQVRBX1BIQVNFIiwKKwkJIkVQMF9DT05GSUciLAorCQkiRVAwX1NUQUxMIgorCX07CisJI2RlZmluZSBEX0VQMChkZXYsIGFyZ3MuLi4pCWRldl9kYmcoZGV2LCAjIyBhcmdzKQorI2Vsc2UKKwkjZGVmaW5lIERfRVAwKGRldiwgYXJncy4uLikJZG8ge30gd2hpbGUgKDApCisjZW5kaWYgLyogREVCVUdfRVAwICovCisKKyNpZmRlZiBERUJVR19FUFgKKwkjZGVmaW5lIERfRVBYKGRldiwgYXJncy4uLikJZGV2X2RiZyhkZXYsICMjIGFyZ3MpCisjZWxzZQorCSNkZWZpbmUgRF9FUFgoZGV2LCBhcmdzLi4uKQlkbyB7fSB3aGlsZSAoMCkKKyNlbmRpZiAvKiBERUJVR19FUDAgKi8KKworI2lmZGVmIERFQlVHX0lSUQorCXN0YXRpYyB2b2lkIGR1bXBfaW50cihjb25zdCBjaGFyICpsYWJlbCwgaW50IGlycXJlZywgc3RydWN0IGRldmljZSAqZGV2KQorCXsKKwkJZGV2X2RiZyhkZXYsICI8JXM+IFVTQl9JTlRSPVslcyVzJXMlcyVzJXMlcyVzJXNdXG4iLCBsYWJlbCwKKwkJCShpcnFyZWcgJiBJTlRSX1dBS0VVUCkgPyAiIHdha2UiIDogIiIsCisJCQkoaXJxcmVnICYgSU5UUl9NU09GKSA/ICIgbXNvZiIgOiAiIiwKKwkJCShpcnFyZWcgJiBJTlRSX1NPRikgPyAiIHNvZiIgOiAiIiwKKwkJCShpcnFyZWcgJiBJTlRSX1JFU1VNRSkgPyAiIHJlc3VtZSIgOiAiIiwKKwkJCShpcnFyZWcgJiBJTlRSX1NVU1BFTkQpID8gIiBzdXNwZW5kIiA6ICIiLAorCQkJKGlycXJlZyAmIElOVFJfUkVTRVRfU1RPUCkgPyAiIG5vcmVzZXQiIDogIiIsCisJCQkoaXJxcmVnICYgSU5UUl9SRVNFVF9TVEFSVCkgPyAiIHJlc2V0IiA6ICIiLAorCQkJKGlycXJlZyAmIElOVFJfRlJBTUVfTUFUQ0gpID8gIiBmbWF0Y2giIDogIiIsCisJCQkoaXJxcmVnICYgSU5UUl9DRkdfQ0hHKSA/ICIgY29uZmlnIiA6ICIiKTsKKwl9CisjZWxzZQorCSNkZWZpbmUgZHVtcF9pbnRyKHgsIHksIHopCQlkbyB7fSB3aGlsZSAoMCkKKyNlbmRpZiAvKiBERUJVR19JUlEgKi8KKworI2lmZGVmIERFQlVHX0VQSVJRCisJc3RhdGljIHZvaWQgZHVtcF9lcF9pbnRyKGNvbnN0IGNoYXIgKmxhYmVsLCBpbnQgbnIsIGludCBpcnFyZWcsIHN0cnVjdCBkZXZpY2UgKmRldikKKwl7CisJCWRldl9kYmcoZGV2LCAiPCVzPiBFUCVkX0lOVFI9WyVzJXMlcyVzJXMlcyVzJXMlc11cbiIsIGxhYmVsLCBuciwKKwkJCShpcnFyZWcgJiBFUElOVFJfRklGT19GVUxMKSA/ICIgZnVsbCIgOiAiIiwKKwkJCShpcnFyZWcgJiBFUElOVFJfRklGT19FTVBUWSkgPyAiIGZlbXB0eSIgOiAiIiwKKwkJCShpcnFyZWcgJiBFUElOVFJfRklGT19FUlJPUikgPyAiIGZlcnIiIDogIiIsCisJCQkoaXJxcmVnICYgRVBJTlRSX0ZJRk9fSElHSCkgPyAiIGZoaWdoIiA6ICIiLAorCQkJKGlycXJlZyAmIEVQSU5UUl9GSUZPX0xPVykgPyAiIGZsb3ciIDogIiIsCisJCQkoaXJxcmVnICYgRVBJTlRSX01ERVZSRVEpID8gIiBtcmVxIiA6ICIiLAorCQkJKGlycXJlZyAmIEVQSU5UUl9FT0YpID8gIiBlb2YiIDogIiIsCisJCQkoaXJxcmVnICYgRVBJTlRSX0RFVlJFUSkgPyAiIGRldnJlcSIgOiAiIiwKKwkJCShpcnFyZWcgJiBFUElOVFJfRU9UKSA/ICIgZW90IiA6ICIiKTsKKwl9CisjZWxzZQorCSNkZWZpbmUgZHVtcF9lcF9pbnRyKHgsIHksIHosIGkpCWRvIHt9IHdoaWxlICgwKQorI2VuZGlmIC8qIERFQlVHX0lSUSAqLworCisjaWZkZWYgREVCVUdfRFVNUAorCXN0YXRpYyB2b2lkIGR1bXBfdXNiX3N0YXQoY29uc3QgY2hhciAqbGFiZWwsIHN0cnVjdCBpbXhfdWRjX3N0cnVjdCAqaW14X3VzYikKKwl7CisJCWludCB0ZW1wID0gX19yYXdfcmVhZGwoaW14X3VzYi0+YmFzZSArIFVTQl9TVEFUKTsKKworCQlkZXZfZGJnKGlteF91c2ItPmRldiwKKwkJCSI8JXM+IFVTQl9TVEFUPVslcyVzIENGRz0lZCwgSU5URj0lZCwgQUxUUj0lZF1cbiIsIGxhYmVsLAorCQkJKHRlbXAgJiBTVEFUX1JTVCkgPyAiIHJlc2V0IiA6ICIiLAorCQkJKHRlbXAgJiBTVEFUX1NVU1ApID8gIiBzdXNwZW5kIiA6ICIiLAorCQkJKHRlbXAgJiBTVEFUX0NGRykgPj4gNSwKKwkJCSh0ZW1wICYgU1RBVF9JTlRGKSA+PiAzLAorCQkJKHRlbXAgJiBTVEFUX0FMVFNFVCkpOworCX0KKworCXN0YXRpYyB2b2lkIGR1bXBfZXBfc3RhdChjb25zdCBjaGFyICpsYWJlbCwgc3RydWN0IGlteF9lcF9zdHJ1Y3QgKmlteF9lcCkKKwl7CisJCWludCB0ZW1wID0gX19yYXdfcmVhZGwoaW14X2VwLT5pbXhfdXNiLT5iYXNlICsgVVNCX0VQX0lOVFIoRVBfTk8oaW14X2VwKSkpOworCisJCWRldl9kYmcoaW14X2VwLT5pbXhfdXNiLT5kZXYsCisJCQkiPCVzPiBFUCVkX0lOVFI9WyVzJXMlcyVzJXMlcyVzJXMlc11cbiIsIGxhYmVsLCBFUF9OTyhpbXhfZXApLAorCQkJKHRlbXAgJiBFUElOVFJfRklGT19GVUxMKSA/ICIgZnVsbCIgOiAiIiwKKwkJCSh0ZW1wICYgRVBJTlRSX0ZJRk9fRU1QVFkpID8gIiBmZW1wdHkiIDogIiIsCisJCQkodGVtcCAmIEVQSU5UUl9GSUZPX0VSUk9SKSA/ICIgZmVyciIgOiAiIiwKKwkJCSh0ZW1wICYgRVBJTlRSX0ZJRk9fSElHSCkgPyAiIGZoaWdoIiA6ICIiLAorCQkJKHRlbXAgJiBFUElOVFJfRklGT19MT1cpID8gIiBmbG93IiA6ICIiLAorCQkJKHRlbXAgJiBFUElOVFJfTURFVlJFUSkgPyAiIG1yZXEiIDogIiIsCisJCQkodGVtcCAmIEVQSU5UUl9FT0YpID8gIiBlb2YiIDogIiIsCisJCQkodGVtcCAmIEVQSU5UUl9ERVZSRVEpID8gIiBkZXZyZXEiIDogIiIsCisJCQkodGVtcCAmIEVQSU5UUl9FT1QpID8gIiBlb3QiIDogIiIpOworCisJCXRlbXAgPSBfX3Jhd19yZWFkbChpbXhfZXAtPmlteF91c2ItPmJhc2UgKyBVU0JfRVBfU1RBVChFUF9OTyhpbXhfZXApKSk7CisKKwkJZGV2X2RiZyhpbXhfZXAtPmlteF91c2ItPmRldiwKKwkJCSI8JXM+IEVQJWRfU1RBVD1bJXMlcyBiY291bnQ9JWRdXG4iLCBsYWJlbCwgRVBfTk8oaW14X2VwKSwKKwkJCSh0ZW1wICYgRVBTVEFUX1NJUCkgPyAiIHNpcCIgOiAiIiwKKwkJCSh0ZW1wICYgRVBTVEFUX1NUQUxMKSA/ICIgc3RhbGwiIDogIiIsCisJCQkodGVtcCAmIEVQU1RBVF9CQ09VTlQpID4+IDE2KTsKKworCQl0ZW1wID0gX19yYXdfcmVhZGwoaW14X2VwLT5pbXhfdXNiLT5iYXNlICsgVVNCX0VQX0ZTVEFUKEVQX05PKGlteF9lcCkpKTsKKworCQlkZXZfZGJnKGlteF9lcC0+aW14X3VzYi0+ZGV2LAorCQkJIjwlcz4gRVAlZF9GU1RBVD1bJXMlcyVzJXMlcyVzJXNdXG4iLCBsYWJlbCwgRVBfTk8oaW14X2VwKSwKKwkJCSh0ZW1wICYgRlNUQVRfRVJSKSA/ICIgZmVyciIgOiAiIiwKKwkJCSh0ZW1wICYgRlNUQVRfVUYpID8gIiBmdW5kZXIiIDogIiIsCisJCQkodGVtcCAmIEZTVEFUX09GKSA/ICIgZm92ZXIiIDogIiIsCisJCQkodGVtcCAmIEZTVEFUX0ZSKSA/ICIgZnJlYWR5IiA6ICIiLAorCQkJKHRlbXAgJiBGU1RBVF9GVUxMKSA/ICIgZmZ1bGwiIDogIiIsCisJCQkodGVtcCAmIEZTVEFUX0FMUk0pID8gIiBmYWxhcm0iIDogIiIsCisJCQkodGVtcCAmIEZTVEFUX0VNUFRZKSA/ICIgZmVtcHR5IiA6ICIiKTsKKwl9CisKKwlzdGF0aWMgdm9pZCBkdW1wX3JlcShjb25zdCBjaGFyICpsYWJlbCwgc3RydWN0IGlteF9lcF9zdHJ1Y3QgKmlteF9lcCwgc3RydWN0IHVzYl9yZXF1ZXN0ICpyZXEpCisJeworCQlpbnQgaTsKKworCQlpZiAoIXJlcSB8fCAhcmVxLT5idWYpIHsKKwkJCWRldl9kYmcoaW14X2VwLT5pbXhfdXNiLT5kZXYsICI8JXM+IHJlcSBvciByZXEgYnVmIGlzIGZyZWVcbiIsIGxhYmVsKTsKKwkJCXJldHVybjsKKwkJfQorCisJCWlmICgoIUVQX05PKGlteF9lcCkgJiYgaW14X2VwLT5pbXhfdXNiLT5lcDBzdGF0ZSA9PSBFUDBfSU5fREFUQV9QSEFTRSkKKwkJCXx8IChFUF9OTyhpbXhfZXApICYmIEVQX0RJUihpbXhfZXApKSkgeworCisJCQlkZXZfZGJnKGlteF9lcC0+aW14X3VzYi0+ZGV2LCAiPCVzPiByZXF1ZXN0IGR1bXAgPCIsIGxhYmVsKTsKKwkJCWZvciAoaSA9IDA7IGkgPCByZXEtPmxlbmd0aDsgaSsrKQorCQkJCXByaW50aygiJTAyeC0iLCAqKCh1OCAqKXJlcS0+YnVmICsgaSkpOworCQkJcHJpbnRrKCI+XG4iKTsKKwkJfQorCX0KKworI2Vsc2UKKwkjZGVmaW5lIGR1bXBfZXBfc3RhdCh4LCB5KQkJZG8ge30gd2hpbGUgKDApCisJI2RlZmluZSBkdW1wX3VzYl9zdGF0KHgsIHkpCQlkbyB7fSB3aGlsZSAoMCkKKwkjZGVmaW5lIGR1bXBfcmVxKHgsIHksIHopCQlkbyB7fSB3aGlsZSAoMCkKKyNlbmRpZiAvKiBERUJVR19EVU1QICovCisKKyNpZmRlZiBERUJVR19FUlIKKwkjZGVmaW5lIERfRVJSKGRldiwgYXJncy4uLikJZGV2X2RiZyhkZXYsICMjIGFyZ3MpCisjZWxzZQorCSNkZWZpbmUgRF9FUlIoZGV2LCBhcmdzLi4uKQlkbyB7fSB3aGlsZSAoMCkKKyNlbmRpZgorCisjZWxzZQorCSNkZWZpbmUgRF9SRVEoZGV2LCBhcmdzLi4uKQkJZG8ge30gd2hpbGUgKDApCisJI2RlZmluZSBEX1RSWChkZXYsIGFyZ3MuLi4pCQlkbyB7fSB3aGlsZSAoMCkKKwkjZGVmaW5lIERfSU5JKGRldiwgYXJncy4uLikJCWRvIHt9IHdoaWxlICgwKQorCSNkZWZpbmUgRF9FUDAoZGV2LCBhcmdzLi4uKQkJZG8ge30gd2hpbGUgKDApCisJI2RlZmluZSBEX0VQWChkZXYsIGFyZ3MuLi4pCQlkbyB7fSB3aGlsZSAoMCkKKwkjZGVmaW5lIGR1bXBfZXBfaW50cih4LCB5LCB6LCBpKQlkbyB7fSB3aGlsZSAoMCkKKwkjZGVmaW5lIGR1bXBfaW50cih4LCB5LCB6KQkJZG8ge30gd2hpbGUgKDApCisJI2RlZmluZSBkdW1wX2VwX3N0YXQoeCwgeSkJCWRvIHt9IHdoaWxlICgwKQorCSNkZWZpbmUgZHVtcF91c2Jfc3RhdCh4LCB5KQkJZG8ge30gd2hpbGUgKDApCisJI2RlZmluZSBkdW1wX3JlcSh4LCB5LCB6KQkJZG8ge30gd2hpbGUgKDApCisJI2RlZmluZSBEX0VSUihkZXYsIGFyZ3MuLi4pCQlkbyB7fSB3aGlsZSAoMCkKKyNlbmRpZiAvKiBERUJVRyAqLworCisjZW5kaWYgLyogX19MSU5VWF9VU0JfR0FER0VUX0lNWF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvaW5vZGUuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9pbm9kZS5jCmluZGV4IGVlYjI2YzAuLjMxN2I0OGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9pbm9kZS5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9pbm9kZS5jCkBAIC0yMDAxLDcgKzIwMDEsNiBAQAogCQlpbm9kZS0+aV9tb2RlID0gbW9kZTsKIAkJaW5vZGUtPmlfdWlkID0gZGVmYXVsdF91aWQ7CiAJCWlub2RlLT5pX2dpZCA9IGRlZmF1bHRfZ2lkOwotCQlpbm9kZS0+aV9ibG9ja3MgPSAwOwogCQlpbm9kZS0+aV9hdGltZSA9IGlub2RlLT5pX210aW1lID0gaW5vZGUtPmlfY3RpbWUKIAkJCQk9IENVUlJFTlRfVElNRTsKIAkJaW5vZGUtPmlfcHJpdmF0ZSA9IGRhdGE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvbGg3YTQweF91ZGMuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9saDdhNDB4X3VkYy5jCmluZGV4IGM2ZTdkZjAuLmQ1NTRiMDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9saDdhNDB4X3VkYy5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9saDdhNDB4X3VkYy5jCkBAIC0xOTgxLDcgKzE5ODEsNyBAQAogCQkgICAuZXAwID0gJm1lbW9yeS5lcFswXS5lcCwKIAkJICAgLm5hbWUgPSBkcml2ZXJfbmFtZSwKIAkJICAgLmRldiA9IHsKLQkJCSAgIC5idXNfaWQgPSAiZ2FkZ2V0IiwKKwkJCSAgIC5pbml0X25hbWUgPSAiZ2FkZ2V0IiwKIAkJCSAgIC5yZWxlYXNlID0gbm9wX3JlbGVhc2UsCiAJCQkgICB9LAogCQkgICB9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L202NjU5Mi11ZGMuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9tNjY1OTItdWRjLmMKaW5kZXggM2E4ODc5ZS4uNDNkY2Y5ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L202NjU5Mi11ZGMuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvbTY2NTkyLXVkYy5jCkBAIC0xNTQ2LDggKzE1NDYsNiBAQAogewogfQogCi0jZGVmaW5lIHJlc291cmNlX2xlbihyKSAoKChyKS0+ZW5kIC0gKHIpLT5zdGFydCkgKyAxKQotCiBzdGF0aWMgaW50IF9faW5pdCBtNjY1OTJfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKQEAgLTE1NjAsMTEgKzE1NTgsMTAgQEAKIAlpbnQgcmV0ID0gMDsKIAlpbnQgaTsKIAotCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZV9ieW5hbWUocGRldiwgSU9SRVNPVVJDRV9NRU0sCi0JCQkoY2hhciAqKXVkY19uYW1lKTsKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOwogCWlmICghcmVzKSB7CiAJCXJldCA9IC1FTk9ERVY7Ci0JCXByX2VycigicGxhdGZvcm1fZ2V0X3Jlc291cmNlX2J5bmFtZSBlcnJvci5cbiIpOworCQlwcl9lcnIoInBsYXRmb3JtX2dldF9yZXNvdXJjZSBlcnJvci5cbiIpOwogCQlnb3RvIGNsZWFuX3VwOwogCX0KIApAQCAtMTU3NSw3ICsxNTcyLDcgQEAKIAkJZ290byBjbGVhbl91cDsKIAl9CiAKLQlyZWcgPSBpb3JlbWFwKHJlcy0+c3RhcnQsIHJlc291cmNlX2xlbihyZXMpKTsKKwlyZWcgPSBpb3JlbWFwKHJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzKSk7CiAJaWYgKHJlZyA9PSBOVUxMKSB7CiAJCXJldCA9IC1FTk9NRU07CiAJCXByX2VycigiaW9yZW1hcCBlcnJvci5cbiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L25ldDIyODAuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9uZXQyMjgwLmMKaW5kZXggOGFlNzBkZS4uMTJjNmQ4MyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L25ldDIyODAuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvbmV0MjI4MC5jCkBAIC02NjksNyArNjY5LDcgQEAKIAogCS8qIDIyODAgbWF5IGJlIHBvbGxpbmcgVkFMSURfQklUIHRocm91Z2ggZXAtPmRtYS0+ZG1hZGVzYyAqLwogCXdtYiAoKTsKLQl0ZC0+ZG1hY291bnQgPSBjcHVfdG9fbGUzMnAgKCZkbWFjb3VudCk7CisJdGQtPmRtYWNvdW50ID0gY3B1X3RvX2xlMzIoZG1hY291bnQpOwogfQogCiBzdGF0aWMgY29uc3QgdTMyIGRtYWN0bF9kZWZhdWx0ID0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9vbWFwX3VkYy5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L29tYXBfdWRjLmMKaW5kZXggMzRlOWUzOS4uNTdkOTY0MSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L29tYXBfdWRjLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L29tYXBfdWRjLmMKQEAgLTMwMDYsNyArMzAwNiw3IEBACiAKIGNsZWFudXAwOgogCWlmICh4Y2VpdikKLQkJcHV0X2RldmljZSh4Y2Vpdi0+ZGV2KTsKKwkJb3RnX3B1dF90cmFuc2NlaXZlcih4Y2Vpdik7CiAKIAlpZiAoY3B1X2lzX29tYXAxNnh4KCkgfHwgY3B1X2lzX29tYXAyNHh4KCkpIHsKIAkJY2xrX2Rpc2FibGUoaGhjX2Nsayk7CkBAIC0zMDM0LDcgKzMwMzQsNyBAQAogCiAJcHVsbHVwX2Rpc2FibGUodWRjKTsKIAlpZiAodWRjLT50cmFuc2NlaXZlcikgewotCQlwdXRfZGV2aWNlKHVkYy0+dHJhbnNjZWl2ZXItPmRldik7CisJCW90Z19wdXRfdHJhbnNjZWl2ZXIodWRjLT50cmFuc2NlaXZlcik7CiAJCXVkYy0+dHJhbnNjZWl2ZXIgPSBOVUxMOwogCX0KIAlvbWFwX3dyaXRldygwLCBVRENfU1lTQ09OMSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvcHhhMjV4X3VkYy5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3B4YTI1eF91ZGMuYwppbmRleCA4YzUwMjZiLi45YjM2MjA1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvcHhhMjV4X3VkYy5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9weGEyNXhfdWRjLmMKQEAgLTE4MzMsNyArMTgzMyw3IEBACiAJCS5lcDAJCT0gJm1lbW9yeS5lcFswXS5lcCwKIAkJLm5hbWUJCT0gZHJpdmVyX25hbWUsCiAJCS5kZXYgPSB7Ci0JCQkuYnVzX2lkCQk9ICJnYWRnZXQiLAorCQkJLmluaXRfbmFtZQk9ICJnYWRnZXQiLAogCQkJLnJlbGVhc2UJPSBub3BfcmVsZWFzZSwKIAkJfSwKIAl9LApAQCAtMjE5OCw3ICsyMTk4LDcgQEAKIAl1ZGNfZGlzYWJsZShkZXYpOwogCXVkY19yZWluaXQoZGV2KTsKIAotCWRldi0+dmJ1cyA9IGlzX3ZidXNfcHJlc2VudCgpOworCWRldi0+dmJ1cyA9ICEhaXNfdmJ1c19wcmVzZW50KCk7CiAKIAkvKiBpcnEgc2V0dXAgYWZ0ZXIgb2xkIGhhcmR3YXJlIHN0YXRlIGlzIGNsZWFuZWQgdXAgKi8KIAlyZXR2YWwgPSByZXF1ZXN0X2lycShpcnEsIHB4YTI1eF91ZGNfaXJxLApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L3B4YTI3eF91ZGMuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9weGEyN3hfdWRjLmMKaW5kZXggOTQ0ZTRmZi4uOTkwZjQwZiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L3B4YTI3eF91ZGMuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvcHhhMjd4X3VkYy5jCkBAIC00MzAsNyArNDMwLDYgQEAKIC8qKgogICogcGlvX2lycV9kaXNhYmxlIC0gRGlzYWJsZXMgaXJxIGdlbmVyYXRpb24gZm9yIG9uZSBlbmRwb2ludAogICogQGVwOiB1ZGMgZW5kcG9pbnQKLSAqIEBpbmRleDogZW5kcG9pbnQgbnVtYmVyCiAgKi8KIHN0YXRpYyB2b2lkIHBpb19pcnFfZGlzYWJsZShzdHJ1Y3QgcHhhX2VwICplcCkKIHsKQEAgLTU4Niw3ICs1ODUsNiBAQAogICogaW5jX2VwX3N0YXRzX2J5dGVzIC0gVXBkYXRlIGVwIHN0YXRzIGNvdW50cwogICogQGVwOiBwaHlzaWNhbCBlbmRwb2ludAogICogQGNvdW50OiBieXRlcyB0cmFuc2ZlcmVkIG9uIGVuZHBvaW50Ci0gKiBAcmVxOiB1c2IgcmVxdWVzdAogICogQGlzX2luOiBlcCBkaXJlY3Rpb24gKFVTQl9ESVJfSU4gb3IgMCkKICAqLwogc3RhdGljIHZvaWQgaW5jX2VwX3N0YXRzX2J5dGVzKHN0cnVjdCBweGFfZXAgKmVwLCBpbnQgY291bnQsIGludCBpc19pbikKQEAgLTIxNjIsNyArMjE2MCw3IEBACiAJCS5lcDAJCT0gJm1lbW9yeS51ZGNfdXNiX2VwWzBdLnVzYl9lcCwKIAkJLm5hbWUJCT0gZHJpdmVyX25hbWUsCiAJCS5kZXYgPSB7Ci0JCQkuYnVzX2lkCQk9ICJnYWRnZXQiLAorCQkJLmluaXRfbmFtZQk9ICJnYWRnZXQiLAogCQl9LAogCX0sCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9zM2MyNDEwX3VkYy5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3MzYzI0MTBfdWRjLmMKaW5kZXggOGQ4ZDY1MS4uOWEyYjg5MiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L3MzYzI0MTBfdWRjLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3MzYzI0MTBfdWRjLmMKQEAgLTM2LDYgKzM2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAKICNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KQEAgLTUxLDcgKzUyLDYgQEAKICNpbmNsdWRlIDxtYWNoL2lycXMuaD4KIAogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KLSNpbmNsdWRlIDxtYWNoL3JlZ3MtZ3Bpby5oPgogCiAjaW5jbHVkZSA8cGxhdC9yZWdzLXVkYy5oPgogI2luY2x1ZGUgPHBsYXQvdWRjLmg+CkBAIC0xNTEwLDExICsxNTEwLDcgQEAKIAogCWRwcmludGsoREVCVUdfTk9STUFMLCAiJXMoKVxuIiwgX19mdW5jX18pOwogCi0JLyogc29tZSBjcHVzIGNhbm5vdCByZWFkIGZyb20gYW4gbGluZSBjb25maWd1cmVkIHRvIElSUSEgKi8KLQlzM2MyNDEwX2dwaW9fY2ZncGluKHVkY19pbmZvLT52YnVzX3BpbiwgUzNDMjQxMF9HUElPX0lOUFVUKTsKLQl2YWx1ZSA9IHMzYzI0MTBfZ3Bpb19nZXRwaW4odWRjX2luZm8tPnZidXNfcGluKTsKLQlzM2MyNDEwX2dwaW9fY2ZncGluKHVkY19pbmZvLT52YnVzX3BpbiwgUzNDMjQxMF9HUElPX1NGTjIpOwotCisJdmFsdWUgPSBncGlvX2dldF92YWx1ZSh1ZGNfaW5mby0+dmJ1c19waW4pID8gMSA6IDA7CiAJaWYgKHVkY19pbmZvLT52YnVzX3Bpbl9pbnZlcnRlZCkKIAkJdmFsdWUgPSAhdmFsdWU7CiAKQEAgLTE3MjcsNyArMTcyMyw3IEBACiAJCS5lcDAJCT0gJm1lbW9yeS5lcFswXS5lcCwKIAkJLm5hbWUJCT0gZ2FkZ2V0X25hbWUsCiAJCS5kZXYgPSB7Ci0JCQkuYnVzX2lkCQk9ICJnYWRnZXQiLAorCQkJLmluaXRfbmFtZQk9ICJnYWRnZXQiLAogCQl9LAogCX0sCiAKQEAgLTE4MDIsNyArMTc5OCw3IEBACiAJc3RydWN0IHMzYzI0MTBfdWRjICp1ZGMgPSAmbWVtb3J5OwogCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7CiAJaW50IHJldHZhbDsKLQl1bnNpZ25lZCBpbnQgaXJxOworCWludCBpcnE7CiAKIAlkZXZfZGJnKGRldiwgIiVzKClcbiIsIF9fZnVuY19fKTsKIApAQCAtMTg2MSw3ICsxODU3LDcgQEAKIAogCS8qIGlycSBzZXR1cCBhZnRlciBvbGQgaGFyZHdhcmUgc3RhdGUgaXMgY2xlYW5lZCB1cCAqLwogCXJldHZhbCA9IHJlcXVlc3RfaXJxKElSUV9VU0JELCBzM2MyNDEwX3VkY19pcnEsCi0JCQlJUlFGX0RJU0FCTEVELCBnYWRnZXRfbmFtZSwgdWRjKTsKKwkJCSAgICAgSVJRRl9ESVNBQkxFRCwgZ2FkZ2V0X25hbWUsIHVkYyk7CiAKIAlpZiAocmV0dmFsICE9IDApIHsKIAkJZGV2X2VycihkZXYsICJjYW5ub3QgZ2V0IGlycSAlaSwgZXJyICVkXG4iLCBJUlFfVVNCRCwgcmV0dmFsKTsKQEAgLTE4NzIsMTcgKzE4NjgsMjggQEAKIAlkZXZfZGJnKGRldiwgImdvdCBpcnEgJWlcbiIsIElSUV9VU0JEKTsKIAogCWlmICh1ZGNfaW5mbyAmJiB1ZGNfaW5mby0+dmJ1c19waW4gPiAwKSB7Ci0JCWlycSA9IHMzYzI0MTBfZ3Bpb19nZXRpcnEodWRjX2luZm8tPnZidXNfcGluKTsKKwkJcmV0dmFsID0gZ3Bpb19yZXF1ZXN0KHVkY19pbmZvLT52YnVzX3BpbiwgInVkYyB2YnVzIik7CisJCWlmIChyZXR2YWwgPCAwKSB7CisJCQlkZXZfZXJyKGRldiwgImNhbm5vdCBjbGFpbSB2YnVzIHBpblxuIik7CisJCQlnb3RvIGVycl9pbnQ7CisJCX0KKworCQlpcnEgPSBncGlvX3RvX2lycSh1ZGNfaW5mby0+dmJ1c19waW4pOworCQlpZiAoaXJxIDwgMCkgeworCQkJZGV2X2VycihkZXYsICJubyBpcnEgZm9yIGdwaW8gdmJ1cyBwaW5cbiIpOworCQkJZ290byBlcnJfZ3Bpb19jbGFpbTsKKwkJfQorCiAJCXJldHZhbCA9IHJlcXVlc3RfaXJxKGlycSwgczNjMjQxMF91ZGNfdmJ1c19pcnEsCiAJCQkJICAgICBJUlFGX0RJU0FCTEVEIHwgSVJRRl9UUklHR0VSX1JJU0lORwogCQkJCSAgICAgfCBJUlFGX1RSSUdHRVJfRkFMTElORyB8IElSUUZfU0hBUkVELAogCQkJCSAgICAgZ2FkZ2V0X25hbWUsIHVkYyk7CiAKIAkJaWYgKHJldHZhbCAhPSAwKSB7Ci0JCQlkZXZfZXJyKGRldiwgImNhbid0IGdldCB2YnVzIGlycSAlaSwgZXJyICVkXG4iLAorCQkJZGV2X2VycihkZXYsICJjYW4ndCBnZXQgdmJ1cyBpcnEgJWQsIGVyciAlZFxuIiwKIAkJCQlpcnEsIHJldHZhbCk7CiAJCQlyZXR2YWwgPSAtRUJVU1k7Ci0JCQlnb3RvIGVycl9pbnQ7CisJCQlnb3RvIGVycl9ncGlvX2NsYWltOwogCQl9CiAKIAkJZGV2X2RiZyhkZXYsICJnb3QgaXJxICVpXG4iLCBpcnEpOwpAQCAtMTkwMiw2ICsxOTA5LDkgQEAKIAogCXJldHVybiAwOwogCitlcnJfZ3Bpb19jbGFpbToKKwlpZiAodWRjX2luZm8gJiYgdWRjX2luZm8tPnZidXNfcGluID4gMCkKKwkJZ3Bpb19mcmVlKHVkY19pbmZvLT52YnVzX3Bpbik7CiBlcnJfaW50OgogCWZyZWVfaXJxKElSUV9VU0JELCB1ZGMpOwogZXJyX21hcDoKQEAgLTE5MjcsNyArMTkzNyw3IEBACiAJZGVidWdmc19yZW1vdmUodWRjLT5yZWdzX2luZm8pOwogCiAJaWYgKHVkY19pbmZvICYmIHVkY19pbmZvLT52YnVzX3BpbiA+IDApIHsKLQkJaXJxID0gczNjMjQxMF9ncGlvX2dldGlycSh1ZGNfaW5mby0+dmJ1c19waW4pOworCQlpcnEgPSBncGlvX3RvX2lycSh1ZGNfaW5mby0+dmJ1c19waW4pOwogCQlmcmVlX2lycShpcnEsIHVkYyk7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvdV9ldGhlci5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3VfZXRoZXIuYwppbmRleCBkOTczOWQ1Li45NmQ2NWNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvdV9ldGhlci5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC91X2V0aGVyLmMKQEAgLTcxNiw2ICs3MTYsMTQgQEAKIAogc3RhdGljIHN0cnVjdCBldGhfZGV2ICp0aGVfZGV2OwogCitzdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIGV0aF9uZXRkZXZfb3BzID0geworCS5uZG9fb3BlbgkJPSBldGhfb3BlbiwKKwkubmRvX3N0b3AJCT0gZXRoX3N0b3AsCisJLm5kb19zdGFydF94bWl0CQk9IGV0aF9zdGFydF94bWl0LAorCS5uZG9fY2hhbmdlX210dQkJPSB1ZXRoX2NoYW5nZV9tdHUsCisJLm5kb19zZXRfbWFjX2FkZHJlc3MgCT0gZXRoX21hY19hZGRyLAorCS5uZG9fdmFsaWRhdGVfYWRkcgk9IGV0aF92YWxpZGF0ZV9hZGRyLAorfTsKIAogLyoqCiAgKiBnZXRoZXJfc2V0dXAgLSBpbml0aWFsaXplIG9uZSBldGhlcm5ldC1vdmVyLXVzYiBsaW5rCkBAIC03NjQsMTIgKzc3Miw4IEBACiAJaWYgKGV0aGFkZHIpCiAJCW1lbWNweShldGhhZGRyLCBkZXYtPmhvc3RfbWFjLCBFVEhfQUxFTik7CiAKLQluZXQtPmNoYW5nZV9tdHUgPSB1ZXRoX2NoYW5nZV9tdHU7Ci0JbmV0LT5oYXJkX3N0YXJ0X3htaXQgPSBldGhfc3RhcnRfeG1pdDsKLQluZXQtPm9wZW4gPSBldGhfb3BlbjsKLQluZXQtPnN0b3AgPSBldGhfc3RvcDsKLQkvKiB3YXRjaGRvZ190aW1lbywgdHhfdGltZW91dCAuLi4gKi8KLQkvKiBzZXRfbXVsdGljYXN0X2xpc3QgKi8KKwluZXQtPm5ldGRldl9vcHMgPSAmZXRoX25ldGRldl9vcHM7CisKIAlTRVRfRVRIVE9PTF9PUFMobmV0LCAmb3BzKTsKIAogCS8qIHR3byBraW5kcyBvZiBob3N0LWluaXRpYXRlZCBzdGF0ZSBjaGFuZ2VzOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9LY29uZmlnIGIvZHJpdmVycy91c2IvaG9zdC9LY29uZmlnCmluZGV4IGYzYTc1YTkuLjJiNDc2YjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QvS2NvbmZpZworKysgYi9kcml2ZXJzL3VzYi9ob3N0L0tjb25maWcKQEAgLTk2LDYgKzk2LDE5IEBACiAJICBFbmFibGVzIHN1cHBvcnQgZm9yIHRoZSBVU0IgY29udHJvbGxlciBwcmVzZW50IG9uIHRoZSBQb3dlclBDCiAJICBPcGVuRmlybXdhcmUgcGxhdGZvcm0gYnVzLgogCitjb25maWcgVVNCX09YVTIxMEhQX0hDRAorCXRyaXN0YXRlICJPWFUyMTBIUCBIQ0Qgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFVTQgorCS0tLWhlbHAtLS0KKwkgIFRoZSBPWFUyMTBIUCBpcyBhbiBVU0IgaG9zdC9PVEcvZGV2aWNlIGNvbnRyb2xsZXIuIEVuYWJsZSB0aGlzCisJICBvcHRpb24gaWYgeW91ciBib2FyZCBoYXMgdGhpcyBjaGlwLiBJZiB1bnN1cmUsIHNheSBOLgorCisJICBUaGlzIGRyaXZlciBkb2VzIG5vdCBzdXBwb3J0IGlzb2Nocm9ub3VzIHRyYW5zZmVycyBhbmQgZG9lc24ndAorCSAgaW1wbGVtZW50IE9URyBub3IgVVNCIGRldmljZSBjb250cm9sbGVycy4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgb3h1MjEwaHAtaGNkLgorCiBjb25maWcgVVNCX0lTUDExNlhfSENECiAJdHJpc3RhdGUgIklTUDExNlggSENEIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBVU0IKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QvTWFrZWZpbGUgYi9kcml2ZXJzL3VzYi9ob3N0L01ha2VmaWxlCmluZGV4IDIzYmUyMjIuLmU1ZjNmMjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QvTWFrZWZpbGUKKysrIGIvZHJpdmVycy91c2IvaG9zdC9NYWtlZmlsZQpAQCAtMTMsNiArMTMsNyBAQAogb2JqLSQoQ09ORklHX1BDSSkJCSs9IHBjaS1xdWlya3MubwogCiBvYmotJChDT05GSUdfVVNCX0VIQ0lfSENEKQkrPSBlaGNpLWhjZC5vCitvYmotJChDT05GSUdfVVNCX09YVTIxMEhQX0hDRCkJKz0gb3h1MjEwaHAtaGNkLm8KIG9iai0kKENPTkZJR19VU0JfSVNQMTE2WF9IQ0QpCSs9IGlzcDExNngtaGNkLm8KIG9iai0kKENPTkZJR19VU0JfT0hDSV9IQ0QpCSs9IG9oY2ktaGNkLm8KIG9iai0kKENPTkZJR19VU0JfVUhDSV9IQ0QpCSs9IHVoY2ktaGNkLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1kYmcuYyBiL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1kYmcuYwppbmRleCAwY2I1M2NhLi43ZjRhY2U3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktZGJnLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9laGNpLWRiZy5jCkBAIC00NTUsOSArNDU1LDcgQEAKIAkJCQkoc2NyYXRjaCA+PiAxNikgJiAweDdmZmYsCiAJCQkJc2NyYXRjaCwKIAkJCQl0ZC0+dXJiKTsKLQkJaWYgKHRlbXAgPCAwKQotCQkJdGVtcCA9IDA7Ci0JCWVsc2UgaWYgKHNpemUgPCB0ZW1wKQorCQlpZiAoc2l6ZSA8IHRlbXApCiAJCQl0ZW1wID0gc2l6ZTsKIAkJc2l6ZSAtPSB0ZW1wOwogCQluZXh0ICs9IHRlbXA7CkBAIC00NjYsOSArNDY0LDcgQEAKIAl9CiAKIAl0ZW1wID0gc25wcmludGYgKG5leHQsIHNpemUsICJcbiIpOwotCWlmICh0ZW1wIDwgMCkKLQkJdGVtcCA9IDA7Ci0JZWxzZSBpZiAoc2l6ZSA8IHRlbXApCisJaWYgKHNpemUgPCB0ZW1wKQogCQl0ZW1wID0gc2l6ZTsKIAlzaXplIC09IHRlbXA7CiAJbmV4dCArPSB0ZW1wOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9laGNpLWh1Yi5jIGIvZHJpdmVycy91c2IvaG9zdC9laGNpLWh1Yi5jCmluZGV4IDIxOGY5NjYuLjk3YTUzYTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1odWIuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktaHViLmMKQEAgLTE5NCw2ICsxOTQsNyBAQAogCXUzMgkJCXRlbXA7CiAJdTMyCQkJcG93ZXJfb2theTsKIAlpbnQJCQlpOworCXU4CQkJcmVzdW1lX25lZWRlZCA9IDA7CiAKIAlpZiAodGltZV9iZWZvcmUgKGppZmZpZXMsIGVoY2ktPm5leHRfc3RhdGVjaGFuZ2UpKQogCQltc2xlZXAoNSk7CkBAIC0yMjgsNyArMjI5LDkgQEAKIAogCS8qIFNvbWUgY29udHJvbGxlci9maXJtd2FyZSBjb21iaW5hdGlvbnMgbmVlZCBhIGRlbGF5IGR1cmluZyB3aGljaAogCSAqIHRoZXkgc2V0IHVwIHRoZSBwb3J0IHN0YXR1c2VzLiAgU2VlIEJ1Z3ppbGxhICM4MTkwLiAqLwotCW1kZWxheSg4KTsKKwlzcGluX3VubG9ja19pcnEoJmVoY2ktPmxvY2spOworCW1zbGVlcCg4KTsKKwlzcGluX2xvY2tfaXJxKCZlaGNpLT5sb2NrKTsKIAogCS8qIG1hbnVhbGx5IHJlc3VtZSB0aGUgcG9ydHMgd2Ugc3VzcGVuZGVkIGR1cmluZyBidXNfc3VzcGVuZCgpICovCiAJaSA9IEhDU19OX1BPUlRTIChlaGNpLT5oY3NfcGFyYW1zKTsKQEAgLTIzNiwxMiArMjM5LDIxIEBACiAJCXRlbXAgPSBlaGNpX3JlYWRsKGVoY2ksICZlaGNpLT5yZWdzLT5wb3J0X3N0YXR1cyBbaV0pOwogCQl0ZW1wICY9IH4oUE9SVF9SV0NfQklUUyB8IFBPUlRfV0FLRV9CSVRTKTsKIAkJaWYgKHRlc3RfYml0KGksICZlaGNpLT5idXNfc3VzcGVuZGVkKSAmJgotCQkJCSh0ZW1wICYgUE9SVF9TVVNQRU5EKSkKKwkJCQkodGVtcCAmIFBPUlRfU1VTUEVORCkpIHsKIAkJCXRlbXAgfD0gUE9SVF9SRVNVTUU7CisJCQlyZXN1bWVfbmVlZGVkID0gMTsKKwkJfQogCQllaGNpX3dyaXRlbChlaGNpLCB0ZW1wLCAmZWhjaS0+cmVncy0+cG9ydF9zdGF0dXMgW2ldKTsKIAl9CisKKwkvKiBtc2xlZXAgZm9yIDIwbXMgb25seSBpZiBjb2RlIGlzIHRyeWluZyB0byByZXN1bWUgcG9ydCAqLworCWlmIChyZXN1bWVfbmVlZGVkKSB7CisJCXNwaW5fdW5sb2NrX2lycSgmZWhjaS0+bG9jayk7CisJCW1zbGVlcCgyMCk7CisJCXNwaW5fbG9ja19pcnEoJmVoY2ktPmxvY2spOworCX0KKwogCWkgPSBIQ1NfTl9QT1JUUyAoZWhjaS0+aGNzX3BhcmFtcyk7Ci0JbWRlbGF5ICgyMCk7CiAJd2hpbGUgKGktLSkgewogCQl0ZW1wID0gZWhjaV9yZWFkbChlaGNpLCAmZWhjaS0+cmVncy0+cG9ydF9zdGF0dXMgW2ldKTsKIAkJaWYgKHRlc3RfYml0KGksICZlaGNpLT5idXNfc3VzcGVuZGVkKSAmJgpAQCAtNDIyLDggKzQzNCwxNSBAQAogCQlwb3J0X3N0YXR1cyAmPSB+UE9SVF9SV0NfQklUUzsKIAkJZWhjaV93cml0ZWwoZWhjaSwgcG9ydF9zdGF0dXMsIHN0YXR1c19yZWcpOwogCi0JfSBlbHNlCisJCS8qIGVuc3VyZSA0NDBFUFggb2hjaSBjb250cm9sbGVyIHN0YXRlIGlzIG9wZXJhdGlvbmFsICovCisJCWlmIChlaGNpLT5oYXNfYW1jY191c2IyMykKKwkJCXNldF9vaGNpX2hjZnMoZWhjaSwgMSk7CisJfSBlbHNlIHsKIAkJZWhjaV9kYmcgKGVoY2ksICJwb3J0ICVkIGhpZ2ggc3BlZWRcbiIsIGluZGV4ICsgMSk7CisJCS8qIGVuc3VyZSA0NDBFUHggb2hjaSBjb250cm9sbGVyIHN0YXRlIGlzIHN1c3BlbmRlZCAqLworCQlpZiAoZWhjaS0+aGFzX2FtY2NfdXNiMjMpCisJCQlzZXRfb2hjaV9oY2ZzKGVoY2ksIDApOworCX0KIAogCXJldHVybiBwb3J0X3N0YXR1czsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1wY2kuYyBiL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1wY2kuYwppbmRleCAzNjg2NGY5Li5iZGM2ZTg2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktcGNpLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9laGNpLXBjaS5jCkBAIC0yMTksMTUgKzIxOSwxOSBAQAogCS8qIFNlcmlhbCBCdXMgUmVsZWFzZSBOdW1iZXIgaXMgYXQgUENJIDB4NjAgb2Zmc2V0ICovCiAJcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgMHg2MCwgJmVoY2ktPnNicm4pOwogCi0JLyogV29ya2Fyb3VuZCBjdXJyZW50IFBDSSBpbml0IGdsaXRjaDogIHdha2V1cCBiaXRzIGFyZW4ndAotCSAqIGJlaW5nIHNldCBmcm9tIFBDSSBQTSBjYXBhYmlsaXR5LgorCS8qIEtlZXAgdGhpcyBhcm91bmQgZm9yIGEgd2hpbGUganVzdCBpbiBjYXNlIHNvbWUgRUhDSQorCSAqIGltcGxlbWVudGF0aW9uIHVzZXMgbGVnYWN5IFBDSSBQTSBzdXBwb3J0LiAgVGhpcyB0ZXN0CisJICogY2FuIGJlIHJlbW92ZWQgb24gMTcgRGVjIDIwMDkgaWYgdGhlIGRldl93YXJuKCkgaGFzbid0CisJICogYmVlbiB0cmlnZ2VyZWQgYnkgdGhlbi4KIAkgKi8KIAlpZiAoIWRldmljZV9jYW5fd2FrZXVwKCZwZGV2LT5kZXYpKSB7CiAJCXUxNglwb3J0X3dha2U7CiAKIAkJcGNpX3JlYWRfY29uZmlnX3dvcmQocGRldiwgMHg2MiwgJnBvcnRfd2FrZSk7Ci0JCWlmIChwb3J0X3dha2UgJiAweDAwMDEpCisJCWlmIChwb3J0X3dha2UgJiAweDAwMDEpIHsKKwkJCWRldl93YXJuKCZwZGV2LT5kZXYsICJFbmFibGluZyBsZWdhY3kgUENJIFBNXG4iKTsKIAkJCWRldmljZV9pbml0X3dha2V1cCgmcGRldi0+ZGV2LCAxKTsKKwkJfQogCX0KIAogI2lmZGVmCUNPTkZJR19VU0JfU1VTUEVORApAQCAtNDI4LDYgKzQzMiw4IEBACiAKICNpZmRlZglDT05GSUdfUE0KIAkuc3VzcGVuZCA9CXVzYl9oY2RfcGNpX3N1c3BlbmQsCisJLnN1c3BlbmRfbGF0ZSA9CXVzYl9oY2RfcGNpX3N1c3BlbmRfbGF0ZSwKKwkucmVzdW1lX2Vhcmx5ID0JdXNiX2hjZF9wY2lfcmVzdW1lX2Vhcmx5LAogCS5yZXN1bWUgPQl1c2JfaGNkX3BjaV9yZXN1bWUsCiAjZW5kaWYKIAkuc2h1dGRvd24gPSAJdXNiX2hjZF9wY2lfc2h1dGRvd24sCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktcHBjLW9mLmMgYi9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktcHBjLW9mLmMKaW5kZXggYjAxOGRlZS4uZWY3MzJiNyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9laGNpLXBwYy1vZi5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1wcGMtb2YuYwpAQCAtMTA3LDExICsxMDcsMTMgQEAKIHsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuID0gb3AtPm5vZGU7CiAJc3RydWN0IHVzYl9oY2QgKmhjZDsKLQlzdHJ1Y3QgZWhjaV9oY2QJKmVoY2k7CisJc3RydWN0IGVoY2lfaGNkCSplaGNpID0gTlVMTDsKIAlzdHJ1Y3QgcmVzb3VyY2UgcmVzOwogCWludCBpcnE7CiAJaW50IHJ2OwogCisJc3RydWN0IGRldmljZV9ub2RlICpucDsKKwogCWlmICh1c2JfZGlzYWJsZWQoKSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKQEAgLTE0OSw2ICsxNTEsMjAgQEAKIAl9CiAKIAllaGNpID0gaGNkX3RvX2VoY2koaGNkKTsKKwlucCA9IG9mX2ZpbmRfY29tcGF0aWJsZV9ub2RlKE5VTEwsIE5VTEwsICJpYm0sdXNiLW9oY2ktNDQwZXB4Iik7CisJaWYgKG5wICE9IE5VTEwpIHsKKwkJLyogY2xhaW0gd2UgcmVhbGx5IGFmZmVjdGVkIGJ5IHVzYjIzIGVycmF0dW0gKi8KKwkJaWYgKCFvZl9hZGRyZXNzX3RvX3Jlc291cmNlKG5wLCAwLCAmcmVzKSkKKwkJCWVoY2ktPm9oY2lfaGNjdHJsX3JlZyA9IGlvcmVtYXAocmVzLnN0YXJ0ICsKKwkJCQkJT0hDSV9IQ0NUUkxfT0ZGU0VULCBPSENJX0hDQ1RSTF9MRU4pOworCQllbHNlCisJCQlwcl9kZWJ1ZyhfX0ZJTEVfXyAiOiBubyBvaGNpIG9mZnNldCBpbiBmZHRcbiIpOworCQlpZiAoIWVoY2ktPm9oY2lfaGNjdHJsX3JlZykgeworCQkJcHJfZGVidWcoX19GSUxFX18gIjogaW9yZW1hcCBmb3Igb2hjaSBoY2N0cmwgZmFpbGVkXG4iKTsKKwkJfSBlbHNlIHsKKwkJCWVoY2ktPmhhc19hbWNjX3VzYjIzID0gMTsKKwkJfQorCX0KIAogCWlmIChvZl9nZXRfcHJvcGVydHkoZG4sICJiaWctZW5kaWFuIiwgTlVMTCkpIHsKIAkJZWhjaS0+YmlnX2VuZGlhbl9tbWlvID0gMTsKQEAgLTE4MSw2ICsxOTcsOSBAQAogCWlycV9kaXNwb3NlX21hcHBpbmcoaXJxKTsKIGVycl9pcnE6CiAJcmVsZWFzZV9tZW1fcmVnaW9uKGhjZC0+cnNyY19zdGFydCwgaGNkLT5yc3JjX2xlbik7CisKKwlpZiAoZWhjaS0+aGFzX2FtY2NfdXNiMjMpCisJCWlvdW5tYXAoZWhjaS0+b2hjaV9oY2N0cmxfcmVnKTsKIGVycl9ybXI6CiAJdXNiX3B1dF9oY2QoaGNkKTsKIApAQCAtMTkxLDYgKzIxMCwxMSBAQAogc3RhdGljIGludCBlaGNpX2hjZF9wcGNfb2ZfcmVtb3ZlKHN0cnVjdCBvZl9kZXZpY2UgKm9wKQogewogCXN0cnVjdCB1c2JfaGNkICpoY2QgPSBkZXZfZ2V0X2RydmRhdGEoJm9wLT5kZXYpOworCXN0cnVjdCBlaGNpX2hjZCAqZWhjaSA9IGhjZF90b19laGNpKGhjZCk7CisKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOworCXN0cnVjdCByZXNvdXJjZSByZXM7CisKIAlkZXZfc2V0X2RydmRhdGEoJm9wLT5kZXYsIE5VTEwpOwogCiAJZGV2X2RiZygmb3AtPmRldiwgInN0b3BwaW5nIFBQQy1PRiBVU0IgQ29udHJvbGxlclxuIik7CkBAIC0yMDEsNiArMjI1LDI1IEBACiAJaXJxX2Rpc3Bvc2VfbWFwcGluZyhoY2QtPmlycSk7CiAJcmVsZWFzZV9tZW1fcmVnaW9uKGhjZC0+cnNyY19zdGFydCwgaGNkLT5yc3JjX2xlbik7CiAKKwkvKiB1c2UgcmVxdWVzdF9tZW1fcmVnaW9uIHRvIHRlc3QgaWYgdGhlIG9oY2kgZHJpdmVyIGlzIGxvYWRlZC4gIGlmIHNvCisJICogZW5zdXJlIHRoZSBvaGNpIGNvcmUgaXMgb3BlcmF0aW9uYWwuCisJICovCisJaWYgKGVoY2ktPmhhc19hbWNjX3VzYjIzKSB7CisJCW5wID0gb2ZfZmluZF9jb21wYXRpYmxlX25vZGUoTlVMTCwgTlVMTCwgImlibSx1c2Itb2hjaS00NDBlcHgiKTsKKwkJaWYgKG5wICE9IE5VTEwpIHsKKwkJCWlmICghb2ZfYWRkcmVzc190b19yZXNvdXJjZShucCwgMCwgJnJlcykpCisJCQkJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24ocmVzLnN0YXJ0LAorCQkJCQkJCSAgICAweDQsIGhjZF9uYW1lKSkKKwkJCQkJc2V0X29oY2lfaGNmcyhlaGNpLCAxKTsKKwkJCQllbHNlCisJCQkJCXJlbGVhc2VfbWVtX3JlZ2lvbihyZXMuc3RhcnQsIDB4NCk7CisJCQllbHNlCisJCQkJcHJfZGVidWcoX19GSUxFX18gIjogbm8gb2hjaSBvZmZzZXQgaW4gZmR0XG4iKTsKKwkJCW9mX25vZGVfcHV0KG5wKTsKKwkJfQorCisJCWlvdW5tYXAoZWhjaS0+b2hjaV9oY2N0cmxfcmVnKTsKKwl9CiAJdXNiX3B1dF9oY2QoaGNkKTsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9laGNpLmggYi9kcml2ZXJzL3VzYi9ob3N0L2VoY2kuaAppbmRleCBjN2Q0YjVhLi5mYjcwNTRjYyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9laGNpLmgKKysrIGIvZHJpdmVycy91c2IvaG9zdC9laGNpLmgKQEAgLTEyMCw2ICsxMjAsMTYgQEAKIAl1bnNpZ25lZAkJaGFzX2ZzbF9wb3J0X2J1ZzoxOyAvKiBGcmVlU2NhbGUgKi8KIAl1bnNpZ25lZAkJYmlnX2VuZGlhbl9tbWlvOjE7CiAJdW5zaWduZWQJCWJpZ19lbmRpYW5fZGVzYzoxOworCXVuc2lnbmVkCQloYXNfYW1jY191c2IyMzoxOworCisJLyogcmVxdWlyZWQgZm9yIHVzYjMyIHF1aXJrICovCisJI2RlZmluZSBPSENJX0NUUkxfSENGUyAgICAgICAgICAoMyA8PCA2KQorCSNkZWZpbmUgT0hDSV9VU0JfT1BFUiAgICAgICAgICAgKDIgPDwgNikKKwkjZGVmaW5lIE9IQ0lfVVNCX1NVU1BFTkQgICAgICAgICgzIDw8IDYpCisKKwkjZGVmaW5lIE9IQ0lfSENDVFJMX09GRlNFVCAgICAgIDB4NAorCSNkZWZpbmUgT0hDSV9IQ0NUUkxfTEVOICAgICAgICAgMHg0CisJX19oYzMyCQkJKm9oY2lfaGNjdHJsX3JlZzsKIAogCXU4CQkJc2JybjsJCS8qIHBhY2tlZCByZWxlYXNlIG51bWJlciAqLwogCkBAIC02MzYsNiArNjQ2LDMwIEBACiAjZW5kaWYKIH0KIAorLyoKKyAqIE9uIGNlcnRhaW4gcHBjLTQ0eCBTb0MgdGhlcmUgaXMgYSBIVyBpc3N1ZSwgdGhhdCBjb3VsZCBvbmx5IHdvcmtlZCBhcm91bmQgd2l0aAorICogZXhwbGljaXQgc3VzcGVuZC9vcGVyYXRlIG9mIE9IQ0kuIFRoaXMgZnVuY3Rpb24gaGVyZWJ5IG1ha2VzIHNlbnNlIG9ubHkgb24gdGhhdCBhcmNoLgorICogT3RoZXIgY29tbW9uIGJpdHMgYXJlIGRlcGVuZGFudCBvbiBoYXNfYW1jY191c2IyMyBxdWlyayBmbGFnLgorICovCisjaWZkZWYgQ09ORklHXzQ0eAorc3RhdGljIGlubGluZSB2b2lkIHNldF9vaGNpX2hjZnMoc3RydWN0IGVoY2lfaGNkICplaGNpLCBpbnQgb3BlcmF0aW9uYWwpCit7CisJdTMyIGhjX2NvbnRyb2w7CisKKwloY19jb250cm9sID0gKHJlYWRsX2JlKGVoY2ktPm9oY2lfaGNjdHJsX3JlZykgJiB+T0hDSV9DVFJMX0hDRlMpOworCWlmIChvcGVyYXRpb25hbCkKKwkJaGNfY29udHJvbCB8PSBPSENJX1VTQl9PUEVSOworCWVsc2UKKwkJaGNfY29udHJvbCB8PSBPSENJX1VTQl9TVVNQRU5EOworCisJd3JpdGVsX2JlKGhjX2NvbnRyb2wsIGVoY2ktPm9oY2lfaGNjdHJsX3JlZyk7CisJKHZvaWQpIHJlYWRsX2JlKGVoY2ktPm9oY2lfaGNjdHJsX3JlZyk7Cit9CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIHNldF9vaGNpX2hjZnMoc3RydWN0IGVoY2lfaGNkICplaGNpLCBpbnQgb3BlcmF0aW9uYWwpCit7IH0KKyNlbmRpZgorCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCiAvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9pc3AxNzYwLWhjZC5jIGIvZHJpdmVycy91c2IvaG9zdC9pc3AxNzYwLWhjZC5jCmluZGV4IDgwMTdmMWMuLmI4OTlmMWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QvaXNwMTc2MC1oY2QuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L2lzcDE3NjAtaGNkLmMKQEAgLTQzNSwxNCArNDM1LDEzIEBACiAKIAkvKgogCSAqIFBPUlQgMSBDb250cm9sIHJlZ2lzdGVyIG9mIHRoZSBJU1AxNzYwIGlzIHRoZSBPVEcgY29udHJvbAotCSAqIHJlZ2lzdGVyIG9uIElTUDE3NjEuCisJICogcmVnaXN0ZXIgb24gSVNQMTc2MS4gU2luY2UgdGhlcmUgaXMgbm8gT1RHIG9yIGRldmljZSBjb250cm9sbGVyCisJICogc3VwcG9ydCBpbiB0aGlzIGRyaXZlciwgd2UgdXNlIHBvcnQgMSBhcyBhICJub3JtYWwiIFVTQiBob3N0IHBvcnQgb24KKwkgKiBib3RoIGNoaXBzLgogCSAqLwotCWlmICghKHByaXYtPmRldmZsYWdzICYgSVNQMTc2MF9GTEFHX0lTUDE3NjEpICYmCi0JICAgICEocHJpdi0+ZGV2ZmxhZ3MgJiBJU1AxNzYwX0ZMQUdfUE9SVDFfRElTKSkgewotCQlpc3AxNzYwX3dyaXRlbChQT1JUMV9QT1dFUiB8IFBPUlQxX0lOSVQyLAotCQkJICAgICAgIGhjZC0+cmVncyArIEhDX1BPUlQxX0NUUkwpOwotCQltZGVsYXkoMTApOwotCX0KKwlpc3AxNzYwX3dyaXRlbChQT1JUMV9QT1dFUiB8IFBPUlQxX0lOSVQyLAorCQkgICAgICAgaGNkLT5yZWdzICsgSENfUE9SVDFfQ1RSTCk7CisJbWRlbGF5KDEwKTsKIAogCXByaXYtPmhjc19wYXJhbXMgPSBpc3AxNzYwX3JlYWRsKGhjZC0+cmVncyArIEhDX0hDU1BBUkFNUyk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QvaXNwMTc2MC1oY2QuaCBiL2RyaXZlcnMvdXNiL2hvc3QvaXNwMTc2MC1oY2QuaAppbmRleCA0Mzc3Mjc3Li5hOWRhZWE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L2lzcDE3NjAtaGNkLmgKKysrIGIvZHJpdmVycy91c2IvaG9zdC9pc3AxNzYwLWhjZC5oCkBAIC0xMzUsNyArMTM1LDYgQEAKICAqIGluZGljYXRlIHRoZSBtb3N0ICJhdHlwaWNhbCIgY2FzZSwgc28gdGhhdCBhIGRldmZsYWdzIG9mIDAgaXMKICAqIGEgc2FuZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24uCiAgKi8KLSNkZWZpbmUgSVNQMTc2MF9GTEFHX1BPUlQxX0RJUwkJMHgwMDAwMDAwMSAvKiBQb3J0IDEgZGlzYWJsZWQgKi8KICNkZWZpbmUgSVNQMTc2MF9GTEFHX0JVU19XSURUSF8xNgkweDAwMDAwMDAyIC8qIDE2LWJpdCBkYXRhIGJ1cyB3aWR0aCAqLwogI2RlZmluZSBJU1AxNzYwX0ZMQUdfT1RHX0VOCQkweDAwMDAwMDA0IC8qIFBvcnQgMSBzdXBwb3J0cyBPVEcgKi8KICNkZWZpbmUgSVNQMTc2MF9GTEFHX0FOQUxPR19PQwkJMHgwMDAwMDAwOCAvKiBBbmFsb2cgb3ZlcmN1cnJlbnQgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QvaXNwMTc2MC1pZi5jIGIvZHJpdmVycy91c2IvaG9zdC9pc3AxNzYwLWlmLmMKaW5kZXggYjg3Y2E3Yy4uNGNmN2NhNCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9pc3AxNzYwLWlmLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9pc3AxNzYwLWlmLmMKQEAgLTYwLDkgKzYwLDYgQEAKIAlpZiAob2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUoZHAsICJueHAsdXNiLWlzcDE3NjEiKSkKIAkJZGV2ZmxhZ3MgfD0gSVNQMTc2MF9GTEFHX0lTUDE3NjE7CiAKLQlpZiAob2ZfZ2V0X3Byb3BlcnR5KGRwLCAicG9ydDEtZGlzYWJsZSIsIE5VTEwpICE9IE5VTEwpCi0JCWRldmZsYWdzIHw9IElTUDE3NjBfRkxBR19QT1JUMV9ESVM7Ci0KIAkvKiBTb21lIHN5c3RlbXMgd2lyZSB1cCBvbmx5IDE2IG9mIHRoZSAzMiBkYXRhIGxpbmVzICovCiAJcHJvcCA9IG9mX2dldF9wcm9wZXJ0eShkcCwgImJ1cy13aWR0aCIsIE5VTEwpOwogCWlmIChwcm9wICYmICpwcm9wID09IDE2KQpAQCAtMTI5LDIzICsxMjYsMjMgQEAKICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX1BDSQotc3RhdGljIHUzMiBueHBfcGNpX2lvX2Jhc2U7Ci1zdGF0aWMgdTMyIGlvbGVuZ3RoOwotc3RhdGljIHUzMiBwY2lfbWVtX3BoeTA7Ci1zdGF0aWMgdTMyIGxlbmd0aDsKLXN0YXRpYyB1OCBfX2lvbWVtICpjaGlwX2FkZHI7Ci1zdGF0aWMgdTggX19pb21lbSAqaW9iYXNlOwotCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBpc3AxNzYxX3BjaV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqZGV2LAogCQljb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCiB7CiAJdTggbGF0ZW5jeSwgbGltaXQ7CiAJX191MzIgcmVnX2RhdGE7CiAJaW50IHJldHJ5X2NvdW50OwotCWludCBsZW5ndGg7Ci0JaW50IHN0YXR1cyA9IDE7CiAJc3RydWN0IHVzYl9oY2QgKmhjZDsKIAl1bnNpZ25lZCBpbnQgZGV2ZmxhZ3MgPSAwOworCWludCByZXRfc3RhdHVzID0gMDsKKworCXJlc291cmNlX3NpemVfdCBwY2lfbWVtX3BoeTA7CisJcmVzb3VyY2Vfc2l6ZV90IG1lbWxlbmd0aDsKKworCXU4IF9faW9tZW0gKmNoaXBfYWRkcjsKKwl1OCBfX2lvbWVtICppb2Jhc2U7CisJcmVzb3VyY2Vfc2l6ZV90IG54cF9wY2lfaW9fYmFzZTsKKwlyZXNvdXJjZV9zaXplX3QgaW9sZW5ndGg7CiAKIAlpZiAodXNiX2Rpc2FibGVkKCkpCiAJCXJldHVybiAtRU5PREVWOwpAQCAtMTY4LDI2ICsxNjUsMzAgQEAKIAlpb2Jhc2UgPSBpb3JlbWFwX25vY2FjaGUobnhwX3BjaV9pb19iYXNlLCBpb2xlbmd0aCk7CiAJaWYgKCFpb2Jhc2UpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJpb3JlbWFwICMxXG4iKTsKLQkJcmVsZWFzZV9tZW1fcmVnaW9uKG54cF9wY2lfaW9fYmFzZSwgaW9sZW5ndGgpOwotCQlyZXR1cm4gLUVOT01FTTsKKwkJcmV0X3N0YXR1cyA9IC1FTk9NRU07CisJCWdvdG8gY2xlYW51cDE7CiAJfQogCS8qIEdyYWIgdGhlIFBMWCBQQ0kgc2hhcmVkIG1lbW9yeSBvZiB0aGUgSVNQIDE3NjEgd2UgbmVlZCAgKi8KIAlwY2lfbWVtX3BoeTAgPSBwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2LCAzKTsKLQlsZW5ndGggPSBwY2lfcmVzb3VyY2VfbGVuKGRldiwgMyk7Ci0KLQlpZiAobGVuZ3RoIDwgMHhmZmZmKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAibWVtb3J5IGxlbmd0aCBmb3IgdGhpcyByZXNvdXJjZSBpcyBsZXNzIHRoYW4gIgotCQkJCSJyZXF1aXJlZFxuIik7Ci0JCXJlbGVhc2VfbWVtX3JlZ2lvbihueHBfcGNpX2lvX2Jhc2UsIGlvbGVuZ3RoKTsKLQkJaW91bm1hcChpb2Jhc2UpOwotCQlyZXR1cm4gIC1FTk9NRU07CisJbWVtbGVuZ3RoID0gcGNpX3Jlc291cmNlX2xlbihkZXYsIDMpOworCWlmIChtZW1sZW5ndGggPCAweGZmZmYpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJtZW1vcnkgbGVuZ3RoIGZvciB0aGlzIHJlc291cmNlIGlzIHdyb25nXG4iKTsKKwkJcmV0X3N0YXR1cyA9IC1FTk9NRU07CisJCWdvdG8gY2xlYW51cDI7CiAJfQogCi0JaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24ocGNpX21lbV9waHkwLCBsZW5ndGgsICJJU1AtUENJIikpIHsKKwlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihwY2lfbWVtX3BoeTAsIG1lbWxlbmd0aCwgIklTUC1QQ0kiKSkgewogCQlwcmludGsoS0VSTl9FUlIgImhvc3QgY29udHJvbGxlciBhbHJlYWR5IGluIHVzZVxuIik7Ci0JCXJlbGVhc2VfbWVtX3JlZ2lvbihueHBfcGNpX2lvX2Jhc2UsIGlvbGVuZ3RoKTsKLQkJaW91bm1hcChpb2Jhc2UpOwotCQlyZXR1cm4gLUVCVVNZOworCQlyZXRfc3RhdHVzID0gLUVCVVNZOworCQlnb3RvIGNsZWFudXAyOworCX0KKworCS8qIG1hcCBhdmFpbGFibGUgbWVtb3J5ICovCisJY2hpcF9hZGRyID0gaW9yZW1hcF9ub2NhY2hlKHBjaV9tZW1fcGh5MCxtZW1sZW5ndGgpOworCWlmICghY2hpcF9hZGRyKSB7CisJCXByaW50ayhLRVJOX0VSUiAiRXJyb3IgaW9yZW1hcCBmYWlsZWRcbiIpOworCQlyZXRfc3RhdHVzID0gLUVOT01FTTsKKwkJZ290byBjbGVhbnVwMzsKIAl9CiAKIAkvKiBiYWQgcGNpIGxhdGVuY2llcyBjYW4gY29udHJpYnV0ZSB0byBvdmVycnVucyAqLwpAQCAtMjEwLDM5ICsyMTEsNTQgQEAKIAkJICogKi8KIAkJd3JpdGVsKDB4ZmFjZSwgY2hpcF9hZGRyICsgSENfU0NSQVRDSF9SRUcpOwogCQl1ZGVsYXkoMTAwKTsKLQkJcmVnX2RhdGEgPSByZWFkbChjaGlwX2FkZHIgKyBIQ19TQ1JBVENIX1JFRyk7CisJCXJlZ19kYXRhID0gcmVhZGwoY2hpcF9hZGRyICsgSENfU0NSQVRDSF9SRUcpICYgMHgwMDAwZmZmZjsKIAkJcmV0cnlfY291bnQtLTsKIAl9CiAKKwlpb3VubWFwKGNoaXBfYWRkcik7CisKIAkvKiBIb3N0IENvbnRyb2xsZXIgcHJlc2VuY2UgaXMgZGV0ZWN0ZWQgYnkgd3JpdGluZyB0byBzY3JhdGNoIHJlZ2lzdGVyCiAJICogYW5kIHJlYWRpbmcgYmFjayBhbmQgY2hlY2tpbmcgdGhlIGNvbnRlbnRzIGFyZSBzYW1lIG9yIG5vdAogCSAqLwogCWlmIChyZWdfZGF0YSAhPSAweEZBQ0UpIHsKIAkJZGV2X2VycigmZGV2LT5kZXYsICJzY3JhdGNoIHJlZ2lzdGVyIG1pc21hdGNoICV4XG4iLCByZWdfZGF0YSk7Ci0JCWdvdG8gY2xlYW47CisJCXJldF9zdGF0dXMgPSAtRU5PTUVNOworCQlnb3RvIGNsZWFudXAzOwogCX0KIAogCXBjaV9zZXRfbWFzdGVyKGRldik7CiAKLQlzdGF0dXMgPSByZWFkbChpb2Jhc2UgKyAweDY4KTsKLQlzdGF0dXMgfD0gMHg5MDA7Ci0Jd3JpdGVsKHN0YXR1cywgaW9iYXNlICsgMHg2OCk7CisJLyogY29uZmlndXJlIFBMWCBQQ0kgY2hpcCB0byBwYXNzIGludGVycnVwdHMgKi8KKyNkZWZpbmUgUExYX0lOVF9DU1JfUkVHIDB4NjgKKwlyZWdfZGF0YSA9IHJlYWRsKGlvYmFzZSArIFBMWF9JTlRfQ1NSX1JFRyk7CisJcmVnX2RhdGEgfD0gMHg5MDA7CisJd3JpdGVsKHJlZ19kYXRhLCBpb2Jhc2UgKyBQTFhfSU5UX0NTUl9SRUcpOwogCiAJZGV2LT5kZXYuZG1hX21hc2sgPSBOVUxMOwotCWhjZCA9IGlzcDE3NjBfcmVnaXN0ZXIocGNpX21lbV9waHkwLCBsZW5ndGgsIGRldi0+aXJxLAorCWhjZCA9IGlzcDE3NjBfcmVnaXN0ZXIocGNpX21lbV9waHkwLCBtZW1sZW5ndGgsIGRldi0+aXJxLAogCQlJUlFGX1NIQVJFRCB8IElSUUZfRElTQUJMRUQsICZkZXYtPmRldiwgZGV2X25hbWUoJmRldi0+ZGV2KSwKIAkJZGV2ZmxhZ3MpOwotCWlmICghSVNfRVJSKGhjZCkpIHsKLQkJcGNpX3NldF9kcnZkYXRhKGRldiwgaGNkKTsKLQkJcmV0dXJuIDA7CisJaWYgKElTX0VSUihoY2QpKSB7CisJCXJldF9zdGF0dXMgPSAtRU5PREVWOworCQlnb3RvIGNsZWFudXAzOwogCX0KLWNsZWFuOgotCXN0YXR1cyA9IC1FTk9ERVY7CisKKwkvKiBkb25lIHdpdGggUExYIElPIGFjY2VzcyAqLwogCWlvdW5tYXAoaW9iYXNlKTsKLQlyZWxlYXNlX21lbV9yZWdpb24ocGNpX21lbV9waHkwLCBsZW5ndGgpOwogCXJlbGVhc2VfbWVtX3JlZ2lvbihueHBfcGNpX2lvX2Jhc2UsIGlvbGVuZ3RoKTsKLQlyZXR1cm4gc3RhdHVzOworCisJcGNpX3NldF9kcnZkYXRhKGRldiwgaGNkKTsKKwlyZXR1cm4gMDsKKworY2xlYW51cDM6CisJcmVsZWFzZV9tZW1fcmVnaW9uKHBjaV9tZW1fcGh5MCwgbWVtbGVuZ3RoKTsKK2NsZWFudXAyOgorCWlvdW5tYXAoaW9iYXNlKTsKK2NsZWFudXAxOgorCXJlbGVhc2VfbWVtX3JlZ2lvbihueHBfcGNpX2lvX2Jhc2UsIGlvbGVuZ3RoKTsKKwlyZXR1cm4gcmV0X3N0YXR1czsKIH0KKwogc3RhdGljIHZvaWQgaXNwMTc2MV9wY2lfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpkZXYpCiB7CiAJc3RydWN0IHVzYl9oY2QgKmhjZDsKQEAgLTI1NSwxMiArMjcxLDYgQEAKIAl1c2JfcHV0X2hjZChoY2QpOwogCiAJcGNpX2Rpc2FibGVfZGV2aWNlKGRldik7Ci0KLQlpb3VubWFwKGlvYmFzZSk7Ci0JaW91bm1hcChjaGlwX2FkZHIpOwotCi0JcmVsZWFzZV9tZW1fcmVnaW9uKG54cF9wY2lfaW9fYmFzZSwgaW9sZW5ndGgpOwotCXJlbGVhc2VfbWVtX3JlZ2lvbihwY2lfbWVtX3BoeTAsIGxlbmd0aCk7CiB9CiAKIHN0YXRpYyB2b2lkIGlzcDE3NjFfcGNpX3NodXRkb3duKHN0cnVjdCBwY2lfZGV2ICpkZXYpCkBAIC0yNjgsMTIgKzI3OCwxNiBAQAogCXByaW50ayhLRVJOX0VSUiAiaXBzMTc2MV9wY2lfc2h1dGRvd25cbiIpOwogfQogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgaXNwMTc2MF9wbHggW10gPSB7IHsKLQkvKiBoYW5kbGUgYW55IFVTQiAyLjAgRUhDSSBjb250cm9sbGVyICovCi0JUENJX0RFVklDRV9DTEFTUygoKFBDSV9DTEFTU19CUklER0VfT1RIRVIgPDwgOCkgfCAoMHgwNiA8PCAxNikpLCB+MCksCi0JCS5kcml2ZXJfZGF0YSA9IDAsCi19LAoteyAvKiBlbmQ6IGFsbCB6ZXJvZXMgKi8gfQorc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkIGlzcDE3NjBfcGx4IFtdID0geworCXsKKwkJLmNsYXNzICAgICAgICAgID0gUENJX0NMQVNTX0JSSURHRV9PVEhFUiA8PCA4LAorCQkuY2xhc3NfbWFzayAgICAgPSB+MCwKKwkJLnZlbmRvcgkJPSBQQ0lfVkVORE9SX0lEX1BMWCwKKwkJLmRldmljZQkJPSAweDU0MDYsCisJCS5zdWJ2ZW5kb3IJPSBQQ0lfVkVORE9SX0lEX1BMWCwKKwkJLnN1YmRldmljZQk9IDB4OTA1NCwKKwl9LAorCXsgfQogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBpc3AxNzYwX3BseCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1oY2QuYyBiL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1oY2QuYwppbmRleCA4YWEzZjQ1Li42NWE5NjA5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L29oY2ktaGNkLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9vaGNpLWhjZC5jCkBAIC01ODksMTMgKzU4OSwxNSBAQAogCQkvKiBhbHNvOiBwb3dlci9vdmVyY3VycmVudCBmbGFncyBpbiByb290aHViLmEgKi8KIAl9CiAKLQkvKiBSZXNldCBVU0IgbmVhcmx5ICJieSB0aGUgYm9vayIuICBSZW1vdGVXYWtldXBDb25uZWN0ZWQgd2FzCi0JICogc2F2ZWQgaWYgYm9vdCBmaXJtd2FyZSAoQklPUy9TTU0vLi4uKSB0b2xkIHVzIGl0J3MgY29ubmVjdGVkLAotCSAqIG9yIGlmIGJ1cyBnbHVlIGRpZCB0aGUgc2FtZSAoZS5nLiBmb3IgUENJIGFkZC1pbiBjYXJkcyB3aXRoCi0JICogUENJIFBNIHN1cHBvcnQpLgorCS8qIFJlc2V0IFVTQiBuZWFybHkgImJ5IHRoZSBib29rIi4gIFJlbW90ZVdha2V1cENvbm5lY3RlZCBoYXMKKwkgKiB0byBiZSBjaGVja2VkIGluIGNhc2UgYm9vdCBmaXJtd2FyZSAoQklPUy9TTU0vLi4uKSBoYXMgc2V0IHVwCisJICogd2FrZXVwIGluIGEgd2F5IHRoZSBidXMgaXNuJ3QgYXdhcmUgb2YgKGUuZy4sIGxlZ2FjeSBQQ0kgUE0pLgorCSAqIElmIHRoZSBidXMgZ2x1ZSBkZXRlY3RlZCB3YWtldXAgY2FwYWJpbGl0eSB0aGVuIGl0IHNob3VsZAorCSAqIGFscmVhZHkgYmUgZW5hYmxlZC4gIEVpdGhlciB3YXksIGlmIHdha2V1cCBzaG91bGQgYmUgZW5hYmxlZAorCSAqIGJ1dCBpc24ndCwgd2UnbGwgZW5hYmxlIGl0IG5vdy4KIAkgKi8KIAlpZiAoKG9oY2ktPmhjX2NvbnRyb2wgJiBPSENJX0NUUkxfUldDKSAhPSAwCi0JCQkmJiAhZGV2aWNlX21heV93YWtldXAoaGNkLT5zZWxmLmNvbnRyb2xsZXIpKQorCQkJJiYgIWRldmljZV9jYW5fd2FrZXVwKGhjZC0+c2VsZi5jb250cm9sbGVyKSkKIAkJZGV2aWNlX2luaXRfd2FrZXVwKGhjZC0+c2VsZi5jb250cm9sbGVyLCAxKTsKIAogCXN3aXRjaCAob2hjaS0+aGNfY29udHJvbCAmIE9IQ0lfQ1RSTF9IQ0ZTKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L29oY2ktcGNpLmMgYi9kcml2ZXJzL3VzYi9ob3N0L29oY2ktcGNpLmMKaW5kZXggYTljMmFlMy4uOGIyOGFlNyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9vaGNpLXBjaS5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1wY2kuYwpAQCAtMzU1LDkgKzM1NSw5IEBACiAKIAkJLyogUldDIG1heSBub3QgYmUgc2V0IGZvciBhZGQtaW4gUENJIGNhcmRzLCBzaW5jZSBib290CiAJCSAqIGZpcm13YXJlIHByb2JhYmx5IGlnbm9yZWQgdGhlbS4gIFRoaXMgdHJhbnNmZXJzIFBDSQotCQkgKiBQTSB3YWtldXAgY2FwYWJpbGl0aWVzIChvbmNlIHRoZSBQQ0kgbGF5ZXIgaXMgZml4ZWQpLgorCQkgKiBQTSB3YWtldXAgY2FwYWJpbGl0aWVzLgogCQkgKi8KLQkJaWYgKGRldmljZV9tYXlfd2FrZXVwKCZwZGV2LT5kZXYpKQorCQlpZiAoZGV2aWNlX2Nhbl93YWtldXAoJnBkZXYtPmRldikpCiAJCQlvaGNpLT5oY19jb250cm9sIHw9IE9IQ0lfQ1RSTF9SV0M7CiAJfQogI2VuZGlmIC8qIENPTkZJR19QTSAqLwpAQCAtNDg3LDYgKzQ4Nyw4IEBACiAKICNpZmRlZglDT05GSUdfUE0KIAkuc3VzcGVuZCA9CXVzYl9oY2RfcGNpX3N1c3BlbmQsCisJLnN1c3BlbmRfbGF0ZSA9CXVzYl9oY2RfcGNpX3N1c3BlbmRfbGF0ZSwKKwkucmVzdW1lX2Vhcmx5ID0JdXNiX2hjZF9wY2lfcmVzdW1lX2Vhcmx5LAogCS5yZXN1bWUgPQl1c2JfaGNkX3BjaV9yZXN1bWUsCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9vaGNpLXBueDQwMDguYyBiL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1wbng0MDA4LmMKaW5kZXggZTMwNmNhNi4uMTAwYmYzZCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9vaGNpLXBueDQwMDguYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L29oY2ktcG54NDAwOC5jCkBAIC0xMDYsNjUgKzEwNiwzNCBAQAogCiBzdGF0aWMgc3RydWN0IGNsayAqdXNiX2NsazsKIAotc3RhdGljIGludCBpc3AxMzAxX3Byb2JlKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCk7Ci1zdGF0aWMgaW50IGlzcDEzMDFfZGV0YWNoKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpOwotCiBzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgbm9ybWFsX2kyY1tdID0KICAgICB7IElTUDEzMDFfSTJDX0FERFIsIElTUDEzMDFfSTJDX0FERFIgKyAxLCBJMkNfQ0xJRU5UX0VORCB9Owotc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IGR1bW15X2kyY19hZGRybGlzdFtdID0geyBJMkNfQ0xJRU5UX0VORCB9OwogCi1zdGF0aWMgc3RydWN0IGkyY19jbGllbnRfYWRkcmVzc19kYXRhIGFkZHJfZGF0YSA9IHsKLQkubm9ybWFsX2kyYyA9IG5vcm1hbF9pMmMsCi0JLnByb2JlID0gZHVtbXlfaTJjX2FkZHJsaXN0LAotCS5pZ25vcmUgPSBkdW1teV9pMmNfYWRkcmxpc3QsCitzdGF0aWMgaW50IGlzcDEzMDFfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwkJCSBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaXNwMTMwMV9yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlyZXR1cm4gMDsKK30KKworY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgaXNwMTMwMV9pZFtdID0geworCXsgImlzcDEzMDFfcG54IiwgMCB9LAorCXsgfQogfTsKIAogc3RydWN0IGkyY19kcml2ZXIgaXNwMTMwMV9kcml2ZXIgPSB7CiAJLmRyaXZlciA9IHsKIAkJLm5hbWUgPSAiaXNwMTMwMV9wbngiLAogCX0sCi0JLmF0dGFjaF9hZGFwdGVyID0gaXNwMTMwMV9wcm9iZSwKLQkuZGV0YWNoX2NsaWVudCA9IGlzcDEzMDFfZGV0YWNoLAorCS5wcm9iZSA9IGlzcDEzMDFfcHJvYmUsCisJLnJlbW92ZSA9IGlzcDEzMDFfcmVtb3ZlLAorCS5pZF90YWJsZSA9IGlzcDEzMDFfaWQsCiB9OwogCi1zdGF0aWMgaW50IGlzcDEzMDFfYXR0YWNoKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCwgaW50IGFkZHIsIGludCBraW5kKQotewotCXN0cnVjdCBpMmNfY2xpZW50ICpjOwotCWludCBlcnI7Ci0KLQljID0ga3phbGxvYyhzaXplb2YoKmMpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWMpCi0JCXJldHVybiAtRU5PTUVNOwotCi0Jc3RybGNweShjLT5uYW1lLCAiaXNwMTMwMV9wbngiLCBJMkNfTkFNRV9TSVpFKTsKLQljLT5mbGFncyA9IDA7Ci0JYy0+YWRkciA9IGFkZHI7Ci0JYy0+YWRhcHRlciA9IGFkYXA7Ci0JYy0+ZHJpdmVyID0gJmlzcDEzMDFfZHJpdmVyOwotCi0JZXJyID0gaTJjX2F0dGFjaF9jbGllbnQoYyk7Ci0JaWYgKGVycikgewotCQlrZnJlZShjKTsKLQkJcmV0dXJuIGVycjsKLQl9Ci0KLQlpc3AxMzAxX2kyY19jbGllbnQgPSBjOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgaXNwMTMwMV9wcm9iZShzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXApCi17Ci0JcmV0dXJuIGkyY19wcm9iZShhZGFwLCAmYWRkcl9kYXRhLCBpc3AxMzAxX2F0dGFjaCk7Ci19Ci0KLXN0YXRpYyBpbnQgaXNwMTMwMV9kZXRhY2goc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKLXsKLQlpMmNfZGV0YWNoX2NsaWVudChjbGllbnQpOwotCWtmcmVlKGlzcDEzMDFfaTJjX2NsaWVudCk7Ci0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyB2b2lkIGkyY193cml0ZSh1OCBidWYsIHU4IHN1YmFkZHIpCiB7CiAJY2hhciB0bXBidWZbMl07CkBAIC0zMjgsNiArMjk3LDggQEAKIAlzdHJ1Y3QgdXNiX2hjZCAqaGNkID0gMDsKIAlzdHJ1Y3Qgb2hjaV9oY2QgKm9oY2k7CiAJY29uc3Qgc3RydWN0IGhjX2RyaXZlciAqZHJpdmVyID0gJm9oY2lfcG54NDAwOF9oY19kcml2ZXI7CisJc3RydWN0IGkyY19hZGFwdGVyICppMmNfYWRhcDsKKwlzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gaTJjX2luZm87CiAKIAlpbnQgcmV0ID0gMCwgaXJxOwogCkBAIC0zNTEsOSArMzIyLDIwIEBACiAKIAlyZXQgPSBpMmNfYWRkX2RyaXZlcigmaXNwMTMwMV9kcml2ZXIpOwogCWlmIChyZXQgPCAwKSB7Ci0JCWVycigiZmFpbGVkIHRvIGNvbm5lY3QgSTJDIHRvIElTUDEzMDEgVVNCIFRyYW5zY2VpdmVyIik7CisJCWVycigiZmFpbGVkIHRvIGFkZCBJU1AxMzAxIGRyaXZlciIpOwogCQlnb3RvIG91dDsKIAl9CisJaTJjX2FkYXAgPSBpMmNfZ2V0X2FkYXB0ZXIoMik7CisJbWVtc2V0KCZpMmNfaW5mbywgMCwgc2l6ZW9mKHN0cnVjdCBpMmNfYm9hcmRfaW5mbykpOworCXN0cmxjcHkoaTJjX2luZm8ubmFtZSwgImlzcDEzMDFfcG54IiwgSTJDX05BTUVfU0laRSk7CisJaXNwMTMwMV9pMmNfY2xpZW50ID0gaTJjX25ld19wcm9iZWRfZGV2aWNlKGkyY19hZGFwLCAmaTJjX2luZm8sCisJCQkJCQkgICBub3JtYWxfaTJjKTsKKwlpMmNfcHV0X2FkYXB0ZXIoaTJjX2FkYXApOworCWlmICghaXNwMTMwMV9pMmNfY2xpZW50KSB7CisJCWVycigiZmFpbGVkIHRvIGNvbm5lY3QgSTJDIHRvIElTUDEzMDEgVVNCIFRyYW5zY2VpdmVyIik7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gb3V0X2kyY19kcml2ZXI7CisJfQogCiAJaXNwMTMwMV9jb25maWd1cmUoKTsKIApAQCAtNDI5LDYgKzQxMSw5IEBACiBvdXQyOgogCWNsa19wdXQodXNiX2Nsayk7CiBvdXQxOgorCWkyY191bnJlZ2lzdGVyX2NsaWVudChpc3AxMzAxX2kyY19jbGllbnQpOworCWlzcDEzMDFfaTJjX2NsaWVudCA9IE5VTEw7CitvdXRfaTJjX2RyaXZlcjoKIAlpMmNfZGVsX2RyaXZlcigmaXNwMTMwMV9kcml2ZXIpOwogb3V0OgogCXJldHVybiByZXQ7CkBAIC00NDUsNiArNDMwLDggQEAKIAlwbng0MDA4X3Vuc2V0X3VzYl9iaXRzKCk7CiAJY2xrX2Rpc2FibGUodXNiX2Nsayk7CiAJY2xrX3B1dCh1c2JfY2xrKTsKKwlpMmNfdW5yZWdpc3Rlcl9jbGllbnQoaXNwMTMwMV9pMmNfY2xpZW50KTsKKwlpc3AxMzAxX2kyY19jbGllbnQgPSBOVUxMOwogCWkyY19kZWxfZHJpdmVyKCZpc3AxMzAxX2RyaXZlcik7CiAKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1wcGMtb2YuYyBiL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1wcGMtb2YuYwppbmRleCA3YWM1MzI2Li42OGEzMDE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L29oY2ktcHBjLW9mLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9vaGNpLXBwYy1vZi5jCkBAIC05MSw2ICs5MSw3IEBACiAKIAlpbnQgcnY7CiAJaW50IGlzX2JpZ2VuZGlhbjsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOwogCiAJaWYgKHVzYl9kaXNhYmxlZCgpKQogCQlyZXR1cm4gLUVOT0RFVjsKQEAgLTE0Nyw2ICsxNDgsMzAgQEAKIAlpZiAocnYgPT0gMCkKIAkJcmV0dXJuIDA7CiAKKwkvKiBieSBub3csIDQ0MGVweCBpcyBrbm93biB0byBzaG93IHVzYl8yMyBlcnJhdHVtICovCisJbnAgPSBvZl9maW5kX2NvbXBhdGlibGVfbm9kZShOVUxMLCBOVUxMLCAiaWJtLHVzYi1laGNpLTQ0MGVweCIpOworCisJLyogV29yayBhcm91bmQgLSBBdCB0aGlzIHBvaW50IG9oY2lfcnVuIGhhcyBleGVjdXRlZCwgdGhlCisJKiBjb250cm9sbGVyIGlzIHJ1bm5pbmcsIGV2ZXJ5dGhpbmcsIHRoZSByb290IHBvcnRzLCBldGMuLCBpcworCSogc2V0IHVwLiAgSWYgdGhlIGVoY2kgZHJpdmVyIGlzIGxvYWRlZCwgcHV0IHRoZSBvaGNpIGNvcmUgaW4KKwkqIHRoZSBzdXNwZW5kZWQgc3RhdGUuICBUaGUgZWhjaSBkcml2ZXIgd2lsbCBicmluZyBpdCBvdXQgb2YKKwkqIHN1c3BlbmRlZCBzdGF0ZSB3aGVuIC8gaWYgYSBub24taGlnaCBzcGVlZCBVU0IgZGV2aWNlIGlzCisJKiBhdHRhY2hlZCB0byB0aGUgVVNCIEhvc3QgcG9ydC4gIElmIHRoZSBlaGNpIGRyaXZlciBpcyBub3QKKwkqIGxvYWRlZCwgZG8gbm90aGluZy4gcmVxdWVzdF9tZW1fcmVnaW9uIGlzIHVzZWQgdG8gdGVzdCBpZgorCSogdGhlIGVoY2kgZHJpdmVyIGlzIGxvYWRlZC4KKwkqLworCWlmIChucCAhPSAgTlVMTCkgeworCQlpZiAoIW9mX2FkZHJlc3NfdG9fcmVzb3VyY2UobnAsIDAsICZyZXMpKSB7CisJCQlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihyZXMuc3RhcnQsIDB4NCwgaGNkX25hbWUpKSB7CisJCQkJd3JpdGVsX2JlKChyZWFkbF9iZSgmb2hjaS0+cmVncy0+Y29udHJvbCkgfAorCQkJCQlPSENJX1VTQl9TVVNQRU5EKSwgJm9oY2ktPnJlZ3MtPmNvbnRyb2wpOworCQkJCQkodm9pZCkgcmVhZGxfYmUoJm9oY2ktPnJlZ3MtPmNvbnRyb2wpOworCQkJfSBlbHNlCisJCQkJcmVsZWFzZV9tZW1fcmVnaW9uKHJlcy5zdGFydCwgMHg0KTsKKwkJfSBlbHNlCisJCSAgICBwcl9kZWJ1ZyhfX0ZJTEVfXyAiOiBjYW5ub3QgZ2V0IGVoY2kgb2Zmc2V0IGZyb20gZmR0XG4iKTsKKwl9CisKIAlpb3VubWFwKGhjZC0+cmVncyk7CiBlcnJfaW9yZW1hcDoKIAlpcnFfZGlzcG9zZV9tYXBwaW5nKGlycSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L29oY2ktdG1pby5jIGIvZHJpdmVycy91c2IvaG9zdC9vaGNpLXRtaW8uYwppbmRleCBmOWYxMzRhLi44ZGFiZThlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L29oY2ktdG1pby5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS10bWlvLmMKQEAgLTIwMSw3ICsyMDEsNyBAQAogCWlmICghY2VsbCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQloY2QgPSB1c2JfY3JlYXRlX2hjZCgmb2hjaV90bWlvX2hjX2RyaXZlciwgJmRldi0+ZGV2LCBkZXYtPmRldi5idXNfaWQpOworCWhjZCA9IHVzYl9jcmVhdGVfaGNkKCZvaGNpX3RtaW9faGNfZHJpdmVyLCAmZGV2LT5kZXYsIGRldl9uYW1lKCZkZXYtPmRldikpOwogCWlmICghaGNkKSB7CiAJCXJldCA9IC1FTk9NRU07CiAJCWdvdG8gZXJyX3VzYl9jcmVhdGVfaGNkOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9veHUyMTBocC1oY2QuYyBiL2RyaXZlcnMvdXNiL2hvc3Qvb3h1MjEwaHAtaGNkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzU1NDhmNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNiL2hvc3Qvb3h1MjEwaHAtaGNkLmMKQEAgLTAsMCArMSwzOTg1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA4IFJvZG9sZm8gR2lvbWV0dGkgPGdpb21ldHRpQGxpbnV4Lml0PgorICogQ29weXJpZ2h0IChjKSAyMDA4IEV1cm90ZWNoIFMucC5BLiA8aW5mb0BldXJ0ZWNoLml0PgorICoKKyAqIFRoaXMgY29kZSBpcyAqc3Ryb25nbHkqIGJhc2VkIG9uIEVIQ0ktSENEIGNvZGUgYnkgRGF2aWQgQnJvd25lbGwgc2luY2UKKyAqIHRoZSBjaGlwIGlzIGEgcXVhc2ktRUhDSSBjb21wYXRpYmxlLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKKyAqIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWFwb29sLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KKyNpbmNsdWRlIDxsaW51eC91c2IuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKworI2luY2x1ZGUgIi4uL2NvcmUvaGNkLmgiCisKKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KKworI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorCisjaW5jbHVkZSAib3h1MjEwaHAuaCIKKworI2RlZmluZSBEUklWRVJfVkVSU0lPTiAiMC4wLjUwIgorCisvKgorICogTWFpbiBkZWZpbmVzCisgKi8KKworI2RlZmluZSBveHVfZGJnKG94dSwgZm10LCBhcmdzLi4uKSBcCisJCWRldl9kYmcob3h1X3RvX2hjZChveHUpLT5zZWxmLmNvbnRyb2xsZXIgLCBmbXQgLCAjIyBhcmdzKQorI2RlZmluZSBveHVfZXJyKG94dSwgZm10LCBhcmdzLi4uKSBcCisJCWRldl9lcnIob3h1X3RvX2hjZChveHUpLT5zZWxmLmNvbnRyb2xsZXIgLCBmbXQgLCAjIyBhcmdzKQorI2RlZmluZSBveHVfaW5mbyhveHUsIGZtdCwgYXJncy4uLikgXAorCQlkZXZfaW5mbyhveHVfdG9faGNkKG94dSktPnNlbGYuY29udHJvbGxlciAsIGZtdCAsICMjIGFyZ3MpCisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHVzYl9oY2QgKm94dV90b19oY2Qoc3RydWN0IG94dV9oY2QgKm94dSkKK3sKKwlyZXR1cm4gY29udGFpbmVyX29mKCh2b2lkICopIG94dSwgc3RydWN0IHVzYl9oY2QsIGhjZF9wcml2KTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3Qgb3h1X2hjZCAqaGNkX3RvX294dShzdHJ1Y3QgdXNiX2hjZCAqaGNkKQoreworCXJldHVybiAoc3RydWN0IG94dV9oY2QgKikgKGhjZC0+aGNkX3ByaXYpOworfQorCisvKgorICogRGVidWcgc3R1ZmYKKyAqLworCisjdW5kZWYgT1hVX1VSQl9UUkFDRQorI3VuZGVmIE9YVV9WRVJCT1NFX0RFQlVHCisKKyNpZmRlZiBPWFVfVkVSQk9TRV9ERUJVRworI2RlZmluZSBveHVfdmRiZwkJCW94dV9kYmcKKyNlbHNlCisjZGVmaW5lIG94dV92ZGJnKG94dSwgZm10LCBhcmdzLi4uKQkvKiBOb3AgKi8KKyNlbmRpZgorCisjaWZkZWYgREVCVUcKKworc3RhdGljIGludCBfX2F0dHJpYnV0ZV9fKChfX3VudXNlZF9fKSkKK2RiZ19zdGF0dXNfYnVmKGNoYXIgKmJ1ZiwgdW5zaWduZWQgbGVuLCBjb25zdCBjaGFyICpsYWJlbCwgdTMyIHN0YXR1cykKK3sKKwlyZXR1cm4gc2NucHJpbnRmKGJ1ZiwgbGVuLCAiJXMlc3N0YXR1cyAlMDR4JXMlcyVzJXMlcyVzJXMlcyVzJXMiLAorCQlsYWJlbCwgbGFiZWxbMF0gPyAiICIgOiAiIiwgc3RhdHVzLAorCQkoc3RhdHVzICYgU1RTX0FTUykgPyAiIEFzeW5jIiA6ICIiLAorCQkoc3RhdHVzICYgU1RTX1BTUykgPyAiIFBlcmlvZGljIiA6ICIiLAorCQkoc3RhdHVzICYgU1RTX1JFQ0wpID8gIiBSZWNsIiA6ICIiLAorCQkoc3RhdHVzICYgU1RTX0hBTFQpID8gIiBIYWx0IiA6ICIiLAorCQkoc3RhdHVzICYgU1RTX0lBQSkgPyAiIElBQSIgOiAiIiwKKwkJKHN0YXR1cyAmIFNUU19GQVRBTCkgPyAiIEZBVEFMIiA6ICIiLAorCQkoc3RhdHVzICYgU1RTX0ZMUikgPyAiIEZMUiIgOiAiIiwKKwkJKHN0YXR1cyAmIFNUU19QQ0QpID8gIiBQQ0QiIDogIiIsCisJCShzdGF0dXMgJiBTVFNfRVJSKSA/ICIgRVJSIiA6ICIiLAorCQkoc3RhdHVzICYgU1RTX0lOVCkgPyAiIElOVCIgOiAiIgorCQkpOworfQorCitzdGF0aWMgaW50IF9fYXR0cmlidXRlX18oKF9fdW51c2VkX18pKQorZGJnX2ludHJfYnVmKGNoYXIgKmJ1ZiwgdW5zaWduZWQgbGVuLCBjb25zdCBjaGFyICpsYWJlbCwgdTMyIGVuYWJsZSkKK3sKKwlyZXR1cm4gc2NucHJpbnRmKGJ1ZiwgbGVuLCAiJXMlc2ludHJlbmFibGUgJTAyeCVzJXMlcyVzJXMlcyIsCisJCWxhYmVsLCBsYWJlbFswXSA/ICIgIiA6ICIiLCBlbmFibGUsCisJCShlbmFibGUgJiBTVFNfSUFBKSA/ICIgSUFBIiA6ICIiLAorCQkoZW5hYmxlICYgU1RTX0ZBVEFMKSA/ICIgRkFUQUwiIDogIiIsCisJCShlbmFibGUgJiBTVFNfRkxSKSA/ICIgRkxSIiA6ICIiLAorCQkoZW5hYmxlICYgU1RTX1BDRCkgPyAiIFBDRCIgOiAiIiwKKwkJKGVuYWJsZSAmIFNUU19FUlIpID8gIiBFUlIiIDogIiIsCisJCShlbmFibGUgJiBTVFNfSU5UKSA/ICIgSU5UIiA6ICIiCisJCSk7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCBmbHNfc3RyaW5nc1tdID0KKyAgICB7ICIxMDI0IiwgIjUxMiIsICIyNTYiLCAiPz8iIH07CisKK3N0YXRpYyBpbnQgZGJnX2NvbW1hbmRfYnVmKGNoYXIgKmJ1ZiwgdW5zaWduZWQgbGVuLAorCQkJCWNvbnN0IGNoYXIgKmxhYmVsLCB1MzIgY29tbWFuZCkKK3sKKwlyZXR1cm4gc2NucHJpbnRmKGJ1ZiwgbGVuLAorCQkiJXMlc2NvbW1hbmQgJTA2eCAlcz0lZCBpdGhyZXNoPSVkJXMlcyVzJXMgcGVyaW9kPSVzJXMgJXMiLAorCQlsYWJlbCwgbGFiZWxbMF0gPyAiICIgOiAiIiwgY29tbWFuZCwKKwkJKGNvbW1hbmQgJiBDTURfUEFSSykgPyAicGFyayIgOiAiKHBhcmspIiwKKwkJQ01EX1BBUktfQ05UKGNvbW1hbmQpLAorCQkoY29tbWFuZCA+PiAxNikgJiAweDNmLAorCQkoY29tbWFuZCAmIENNRF9MUkVTRVQpID8gIiBMUmVzZXQiIDogIiIsCisJCShjb21tYW5kICYgQ01EX0lBQUQpID8gIiBJQUFEIiA6ICIiLAorCQkoY29tbWFuZCAmIENNRF9BU0UpID8gIiBBc3luYyIgOiAiIiwKKwkJKGNvbW1hbmQgJiBDTURfUFNFKSA/ICIgUGVyaW9kaWMiIDogIiIsCisJCWZsc19zdHJpbmdzWyhjb21tYW5kID4+IDIpICYgMHgzXSwKKwkJKGNvbW1hbmQgJiBDTURfUkVTRVQpID8gIiBSZXNldCIgOiAiIiwKKwkJKGNvbW1hbmQgJiBDTURfUlVOKSA/ICJSVU4iIDogIkhBTFQiCisJCSk7Cit9CisKK3N0YXRpYyBpbnQgZGJnX3BvcnRfYnVmKGNoYXIgKmJ1ZiwgdW5zaWduZWQgbGVuLCBjb25zdCBjaGFyICpsYWJlbCwKKwkJCQlpbnQgcG9ydCwgdTMyIHN0YXR1cykKK3sKKwljaGFyCSpzaWc7CisKKwkvKiBzaWduYWxpbmcgc3RhdGUgKi8KKwlzd2l0Y2ggKHN0YXR1cyAmICgzIDw8IDEwKSkgeworCWNhc2UgMCA8PCAxMDoKKwkJc2lnID0gInNlMCI7CisJCWJyZWFrOworCWNhc2UgMSA8PCAxMDoKKwkJc2lnID0gImsiOwkvKiBsb3cgc3BlZWQgKi8KKwkJYnJlYWs7CisJY2FzZSAyIDw8IDEwOgorCQlzaWcgPSAiaiI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXNpZyA9ICI/IjsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHNjbnByaW50ZihidWYsIGxlbiwKKwkJIiVzJXNwb3J0ICVkIHN0YXR1cyAlMDZ4JXMlcyBzaWc9JXMlcyVzJXMlcyVzJXMlcyVzJXMiLAorCQlsYWJlbCwgbGFiZWxbMF0gPyAiICIgOiAiIiwgcG9ydCwgc3RhdHVzLAorCQkoc3RhdHVzICYgUE9SVF9QT1dFUikgPyAiIFBPV0VSIiA6ICIiLAorCQkoc3RhdHVzICYgUE9SVF9PV05FUikgPyAiIE9XTkVSIiA6ICIiLAorCQlzaWcsCisJCShzdGF0dXMgJiBQT1JUX1JFU0VUKSA/ICIgUkVTRVQiIDogIiIsCisJCShzdGF0dXMgJiBQT1JUX1NVU1BFTkQpID8gIiBTVVNQRU5EIiA6ICIiLAorCQkoc3RhdHVzICYgUE9SVF9SRVNVTUUpID8gIiBSRVNVTUUiIDogIiIsCisJCShzdGF0dXMgJiBQT1JUX09DQykgPyAiIE9DQyIgOiAiIiwKKwkJKHN0YXR1cyAmIFBPUlRfT0MpID8gIiBPQyIgOiAiIiwKKwkJKHN0YXR1cyAmIFBPUlRfUEVDKSA/ICIgUEVDIiA6ICIiLAorCQkoc3RhdHVzICYgUE9SVF9QRSkgPyAiIFBFIiA6ICIiLAorCQkoc3RhdHVzICYgUE9SVF9DU0MpID8gIiBDU0MiIDogIiIsCisJCShzdGF0dXMgJiBQT1JUX0NPTk5FQ1QpID8gIiBDT05ORUNUIiA6ICIiCisJICAgICk7Cit9CisKKyNlbHNlCisKK3N0YXRpYyBpbmxpbmUgaW50IF9fYXR0cmlidXRlX18oKF9fdW51c2VkX18pKQorZGJnX3N0YXR1c19idWYoY2hhciAqYnVmLCB1bnNpZ25lZCBsZW4sIGNvbnN0IGNoYXIgKmxhYmVsLCB1MzIgc3RhdHVzKQoreyByZXR1cm4gMDsgfQorCitzdGF0aWMgaW5saW5lIGludCBfX2F0dHJpYnV0ZV9fKChfX3VudXNlZF9fKSkKK2RiZ19jb21tYW5kX2J1ZihjaGFyICpidWYsIHVuc2lnbmVkIGxlbiwgY29uc3QgY2hhciAqbGFiZWwsIHUzMiBjb21tYW5kKQoreyByZXR1cm4gMDsgfQorCitzdGF0aWMgaW5saW5lIGludCBfX2F0dHJpYnV0ZV9fKChfX3VudXNlZF9fKSkKK2RiZ19pbnRyX2J1ZihjaGFyICpidWYsIHVuc2lnbmVkIGxlbiwgY29uc3QgY2hhciAqbGFiZWwsIHUzMiBlbmFibGUpCit7IHJldHVybiAwOyB9CisKK3N0YXRpYyBpbmxpbmUgaW50IF9fYXR0cmlidXRlX18oKF9fdW51c2VkX18pKQorZGJnX3BvcnRfYnVmKGNoYXIgKmJ1ZiwgdW5zaWduZWQgbGVuLCBjb25zdCBjaGFyICpsYWJlbCwgaW50IHBvcnQsIHUzMiBzdGF0dXMpCit7IHJldHVybiAwOyB9CisKKyNlbmRpZiAvKiBERUJVRyAqLworCisvKiBmdW5jdGlvbnMgaGF2ZSB0aGUgIndyb25nIiBmaWxlbmFtZSB3aGVuIHRoZXkncmUgb3V0cHV0Li4uICovCisjZGVmaW5lIGRiZ19zdGF0dXMob3h1LCBsYWJlbCwgc3RhdHVzKSB7IFwKKwljaGFyIF9idWZbODBdOyBcCisJZGJnX3N0YXR1c19idWYoX2J1Ziwgc2l6ZW9mIF9idWYsIGxhYmVsLCBzdGF0dXMpOyBcCisJb3h1X2RiZyhveHUsICIlc1xuIiwgX2J1Zik7IFwKK30KKworI2RlZmluZSBkYmdfY21kKG94dSwgbGFiZWwsIGNvbW1hbmQpIHsgXAorCWNoYXIgX2J1Zls4MF07IFwKKwlkYmdfY29tbWFuZF9idWYoX2J1Ziwgc2l6ZW9mIF9idWYsIGxhYmVsLCBjb21tYW5kKTsgXAorCW94dV9kYmcob3h1LCAiJXNcbiIsIF9idWYpOyBcCit9CisKKyNkZWZpbmUgZGJnX3BvcnQob3h1LCBsYWJlbCwgcG9ydCwgc3RhdHVzKSB7IFwKKwljaGFyIF9idWZbODBdOyBcCisJZGJnX3BvcnRfYnVmKF9idWYsIHNpemVvZiBfYnVmLCBsYWJlbCwgcG9ydCwgc3RhdHVzKTsgXAorCW94dV9kYmcob3h1LCAiJXNcbiIsIF9idWYpOyBcCit9CisKKy8qCisgKiBNb2R1bGUgcGFyYW1ldGVycworICovCisKKy8qIEluaXRpYWwgSVJRIGxhdGVuY3k6IGZhc3RlciB0aGFuIGh3IGRlZmF1bHQgKi8KK3N0YXRpYyBpbnQgbG9nMl9pcnFfdGhyZXNoOwkJCS8qIDAgdG8gNiAqLworbW9kdWxlX3BhcmFtKGxvZzJfaXJxX3RocmVzaCwgaW50LCBTX0lSVUdPKTsKK01PRFVMRV9QQVJNX0RFU0MobG9nMl9pcnFfdGhyZXNoLCAibG9nMiBJUlEgbGF0ZW5jeSwgMS02NCBtaWNyb2ZyYW1lcyIpOworCisvKiBJbml0aWFsIHBhcmsgc2V0dGluZzogc2xvd2VyIHRoYW4gaHcgZGVmYXVsdCAqLworc3RhdGljIHVuc2lnbmVkIHBhcms7Cittb2R1bGVfcGFyYW0ocGFyaywgdWludCwgU19JUlVHTyk7CitNT0RVTEVfUEFSTV9ERVNDKHBhcmssICJwYXJrIHNldHRpbmc7IDEtMyBiYWNrLXRvLWJhY2sgYXN5bmMgcGFja2V0cyIpOworCisvKiBGb3IgZmxha2V5IGhhcmR3YXJlLCBpZ25vcmUgb3ZlcmN1cnJlbnQgaW5kaWNhdG9ycyAqLworc3RhdGljIGludCBpZ25vcmVfb2M7Cittb2R1bGVfcGFyYW0oaWdub3JlX29jLCBib29sLCBTX0lSVUdPKTsKK01PRFVMRV9QQVJNX0RFU0MoaWdub3JlX29jLCAiaWdub3JlIGJvZ3VzIGhhcmR3YXJlIG92ZXJjdXJyZW50IGluZGljYXRpb25zIik7CisKKworc3RhdGljIHZvaWQgZWhjaV93b3JrKHN0cnVjdCBveHVfaGNkICpveHUpOworc3RhdGljIGludCBveHVfaHViX2NvbnRyb2woc3RydWN0IHVzYl9oY2QgKmhjZCwKKwkJCQl1MTYgdHlwZVJlcSwgdTE2IHdWYWx1ZSwgdTE2IHdJbmRleCwKKwkJCQljaGFyICpidWYsIHUxNiB3TGVuZ3RoKTsKKworLyoKKyAqIExvY2FsIGZ1bmN0aW9ucworICovCisKKy8qIExvdyBsZXZlbCByZWFkL3dyaXRlIHJlZ2lzdGVycyBmdW5jdGlvbnMgKi8KK3N0YXRpYyBpbmxpbmUgdTMyIG94dV9yZWFkbCh2b2lkICpiYXNlLCB1MzIgcmVnKQoreworCXJldHVybiByZWFkbChiYXNlICsgcmVnKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG94dV93cml0ZWwodm9pZCAqYmFzZSwgdTMyIHJlZywgdTMyIHZhbCkKK3sKKwl3cml0ZWwodmFsLCBiYXNlICsgcmVnKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHRpbWVyX2FjdGlvbl9kb25lKHN0cnVjdCBveHVfaGNkICpveHUsCisJCQkJCWVudW0gZWhjaV90aW1lcl9hY3Rpb24gYWN0aW9uKQoreworCWNsZWFyX2JpdChhY3Rpb24sICZveHUtPmFjdGlvbnMpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGltZXJfYWN0aW9uKHN0cnVjdCBveHVfaGNkICpveHUsCisJCQkJCWVudW0gZWhjaV90aW1lcl9hY3Rpb24gYWN0aW9uKQoreworCWlmICghdGVzdF9hbmRfc2V0X2JpdChhY3Rpb24sICZveHUtPmFjdGlvbnMpKSB7CisJCXVuc2lnbmVkIGxvbmcgdDsKKworCQlzd2l0Y2ggKGFjdGlvbikgeworCQljYXNlIFRJTUVSX0lBQV9XQVRDSERPRzoKKwkJCXQgPSBFSENJX0lBQV9KSUZGSUVTOworCQkJYnJlYWs7CisJCWNhc2UgVElNRVJfSU9fV0FUQ0hET0c6CisJCQl0ID0gRUhDSV9JT19KSUZGSUVTOworCQkJYnJlYWs7CisJCWNhc2UgVElNRVJfQVNZTkNfT0ZGOgorCQkJdCA9IEVIQ0lfQVNZTkNfSklGRklFUzsKKwkJCWJyZWFrOworCQljYXNlIFRJTUVSX0FTWU5DX1NIUklOSzoKKwkJZGVmYXVsdDoKKwkJCXQgPSBFSENJX1NIUklOS19KSUZGSUVTOworCQkJYnJlYWs7CisJCX0KKwkJdCArPSBqaWZmaWVzOworCQkvKiBhbGwgdGltaW5ncyBleGNlcHQgSUFBIHdhdGNoZG9nIGNhbiBiZSBvdmVycmlkZGVuLgorCQkgKiBhc3luYyBxdWV1ZSBTSFJJTksgb2Z0ZW4gcHJlY2VkZXMgSUFBLiAgd2hpbGUgaXQncyByZWFkeQorCQkgKiB0byBnbyBPRkYgbmVpdGhlciBjYW4gbWF0dGVyLCBhbmQgYWZ0ZXJ3YXJkcyB0aGUgSU8KKwkJICogd2F0Y2hkb2cgc3RvcHMgdW5sZXNzIHRoZXJlJ3Mgc3RpbGwgcGVyaW9kaWMgdHJhZmZpYy4KKwkJICovCisJCWlmIChhY3Rpb24gIT0gVElNRVJfSUFBX1dBVENIRE9HCisJCQkJJiYgdCA+IG94dS0+d2F0Y2hkb2cuZXhwaXJlcworCQkJCSYmIHRpbWVyX3BlbmRpbmcoJm94dS0+d2F0Y2hkb2cpKQorCQkJcmV0dXJuOworCQltb2RfdGltZXIoJm94dS0+d2F0Y2hkb2csIHQpOworCX0KK30KKworLyoKKyAqIGhhbmRzaGFrZSAtIHNwaW4gcmVhZGluZyBoYyB1bnRpbCBoYW5kc2hha2UgY29tcGxldGVzIG9yIGZhaWxzCisgKiBAcHRyOiBhZGRyZXNzIG9mIGhjIHJlZ2lzdGVyIHRvIGJlIHJlYWQKKyAqIEBtYXNrOiBiaXRzIHRvIGxvb2sgYXQgaW4gcmVzdWx0IG9mIHJlYWQKKyAqIEBkb25lOiB2YWx1ZSBvZiB0aG9zZSBiaXRzIHdoZW4gaGFuZHNoYWtlIHN1Y2NlZWRzCisgKiBAdXNlYzogdGltZW91dCBpbiBtaWNyb3NlY29uZHMKKyAqCisgKiBSZXR1cm5zIG5lZ2F0aXZlIGVycm5vLCBvciB6ZXJvIG9uIHN1Y2Nlc3MKKyAqCisgKiBTdWNjZXNzIGhhcHBlbnMgd2hlbiB0aGUgIm1hc2siIGJpdHMgaGF2ZSB0aGUgc3BlY2lmaWVkIHZhbHVlIChoYXJkd2FyZQorICogaGFuZHNoYWtlIGRvbmUpLiAgVGhlcmUgYXJlIHR3byBmYWlsdXJlIG1vZGVzOiAgInVzZWMiIGhhdmUgcGFzc2VkIChtYWpvcgorICogaGFyZHdhcmUgZmxha2VvdXQpLCBvciB0aGUgcmVnaXN0ZXIgcmVhZHMgYXMgYWxsLW9uZXMgKGhhcmR3YXJlIHJlbW92ZWQpLgorICoKKyAqIFRoYXQgbGFzdCBmYWlsdXJlIHNob3VsZF9vbmx5IGhhcHBlbiBpbiBjYXNlcyBsaWtlIHBoeXNpY2FsIGNhcmRidXMgZWplY3QKKyAqIGJlZm9yZSBkcml2ZXIgc2h1dGRvd24uIEJ1dCBpdCBhbHNvIHNlZW1zIHRvIGJlIGNhdXNlZCBieSBidWdzIGluIGNhcmRidXMKKyAqIGJyaWRnZSBzaHV0ZG93bjogIHNodXR0aW5nIGRvd24gdGhlIGJyaWRnZSBiZWZvcmUgdGhlIGRldmljZXMgdXNpbmcgaXQuCisgKi8KK3N0YXRpYyBpbnQgaGFuZHNoYWtlKHN0cnVjdCBveHVfaGNkICpveHUsIHZvaWQgX19pb21lbSAqcHRyLAorCQkJCQl1MzIgbWFzaywgdTMyIGRvbmUsIGludCB1c2VjKQoreworCXUzMiByZXN1bHQ7CisKKwlkbyB7CisJCXJlc3VsdCA9IHJlYWRsKHB0cik7CisJCWlmIChyZXN1bHQgPT0gfih1MzIpMCkJCS8qIGNhcmQgcmVtb3ZlZCAqLworCQkJcmV0dXJuIC1FTk9ERVY7CisJCXJlc3VsdCAmPSBtYXNrOworCQlpZiAocmVzdWx0ID09IGRvbmUpCisJCQlyZXR1cm4gMDsKKwkJdWRlbGF5KDEpOworCQl1c2VjLS07CisJfSB3aGlsZSAodXNlYyA+IDApOworCXJldHVybiAtRVRJTUVET1VUOworfQorCisvKiBGb3JjZSBIQyB0byBoYWx0IHN0YXRlIGZyb20gdW5rbm93biAoRUhDSSBzcGVjIHNlY3Rpb24gMi4zKSAqLworc3RhdGljIGludCBlaGNpX2hhbHQoc3RydWN0IG94dV9oY2QgKm94dSkKK3sKKwl1MzIJdGVtcCA9IHJlYWRsKCZveHUtPnJlZ3MtPnN0YXR1cyk7CisKKwkvKiBkaXNhYmxlIGFueSBpcnFzIGxlZnQgZW5hYmxlZCBieSBwcmV2aW91cyBjb2RlICovCisJd3JpdGVsKDAsICZveHUtPnJlZ3MtPmludHJfZW5hYmxlKTsKKworCWlmICgodGVtcCAmIFNUU19IQUxUKSAhPSAwKQorCQlyZXR1cm4gMDsKKworCXRlbXAgPSByZWFkbCgmb3h1LT5yZWdzLT5jb21tYW5kKTsKKwl0ZW1wICY9IH5DTURfUlVOOworCXdyaXRlbCh0ZW1wLCAmb3h1LT5yZWdzLT5jb21tYW5kKTsKKwlyZXR1cm4gaGFuZHNoYWtlKG94dSwgJm94dS0+cmVncy0+c3RhdHVzLAorCQkJICBTVFNfSEFMVCwgU1RTX0hBTFQsIDE2ICogMTI1KTsKK30KKworLyogUHV0IFRESS9BUkMgc2lsaWNvbiBpbnRvIEVIQ0kgbW9kZSAqLworc3RhdGljIHZvaWQgdGRpX3Jlc2V0KHN0cnVjdCBveHVfaGNkICpveHUpCit7CisJdTMyIF9faW9tZW0gKnJlZ19wdHI7CisJdTMyIHRtcDsKKworCXJlZ19wdHIgPSAodTMyIF9faW9tZW0gKikoKCh1OCBfX2lvbWVtICopb3h1LT5yZWdzKSArIDB4NjgpOworCXRtcCA9IHJlYWRsKHJlZ19wdHIpOworCXRtcCB8PSAweDM7CisJd3JpdGVsKHRtcCwgcmVnX3B0cik7Cit9CisKKy8qIFJlc2V0IGEgbm9uLXJ1bm5pbmcgKFNUU19IQUxUID09IDEpIGNvbnRyb2xsZXIgKi8KK3N0YXRpYyBpbnQgZWhjaV9yZXNldChzdHJ1Y3Qgb3h1X2hjZCAqb3h1KQoreworCWludAlyZXR2YWw7CisJdTMyCWNvbW1hbmQgPSByZWFkbCgmb3h1LT5yZWdzLT5jb21tYW5kKTsKKworCWNvbW1hbmQgfD0gQ01EX1JFU0VUOworCWRiZ19jbWQob3h1LCAicmVzZXQiLCBjb21tYW5kKTsKKwl3cml0ZWwoY29tbWFuZCwgJm94dS0+cmVncy0+Y29tbWFuZCk7CisJb3h1X3RvX2hjZChveHUpLT5zdGF0ZSA9IEhDX1NUQVRFX0hBTFQ7CisJb3h1LT5uZXh0X3N0YXRlY2hhbmdlID0gamlmZmllczsKKwlyZXR2YWwgPSBoYW5kc2hha2Uob3h1LCAmb3h1LT5yZWdzLT5jb21tYW5kLAorCQkJICAgIENNRF9SRVNFVCwgMCwgMjUwICogMTAwMCk7CisKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCisJdGRpX3Jlc2V0KG94dSk7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKiBJZGxlIHRoZSBjb250cm9sbGVyIChmcm9tIHJ1bm5pbmcpICovCitzdGF0aWMgdm9pZCBlaGNpX3F1aWVzY2Uoc3RydWN0IG94dV9oY2QgKm94dSkKK3sKKwl1MzIJdGVtcDsKKworI2lmZGVmIERFQlVHCisJaWYgKCFIQ19JU19SVU5OSU5HKG94dV90b19oY2Qob3h1KS0+c3RhdGUpKQorCQlCVUcoKTsKKyNlbmRpZgorCisJLyogd2FpdCBmb3IgYW55IHNjaGVkdWxlIGVuYWJsZXMvZGlzYWJsZXMgdG8gdGFrZSBlZmZlY3QgKi8KKwl0ZW1wID0gcmVhZGwoJm94dS0+cmVncy0+Y29tbWFuZCkgPDwgMTA7CisJdGVtcCAmPSBTVFNfQVNTIHwgU1RTX1BTUzsKKwlpZiAoaGFuZHNoYWtlKG94dSwgJm94dS0+cmVncy0+c3RhdHVzLCBTVFNfQVNTIHwgU1RTX1BTUywKKwkJCQl0ZW1wLCAxNiAqIDEyNSkgIT0gMCkgeworCQlveHVfdG9faGNkKG94dSktPnN0YXRlID0gSENfU1RBVEVfSEFMVDsKKwkJcmV0dXJuOworCX0KKworCS8qIHRoZW4gZGlzYWJsZSBhbnl0aGluZyB0aGF0J3Mgc3RpbGwgYWN0aXZlICovCisJdGVtcCA9IHJlYWRsKCZveHUtPnJlZ3MtPmNvbW1hbmQpOworCXRlbXAgJj0gfihDTURfQVNFIHwgQ01EX0lBQUQgfCBDTURfUFNFKTsKKwl3cml0ZWwodGVtcCwgJm94dS0+cmVncy0+Y29tbWFuZCk7CisKKwkvKiBoYXJkd2FyZSBjYW4gdGFrZSAxNiBtaWNyb2ZyYW1lcyB0byB0dXJuIG9mZiAuLi4gKi8KKwlpZiAoaGFuZHNoYWtlKG94dSwgJm94dS0+cmVncy0+c3RhdHVzLCBTVFNfQVNTIHwgU1RTX1BTUywKKwkJCQkwLCAxNiAqIDEyNSkgIT0gMCkgeworCQlveHVfdG9faGNkKG94dSktPnN0YXRlID0gSENfU1RBVEVfSEFMVDsKKwkJcmV0dXJuOworCX0KK30KKworc3RhdGljIGludCBjaGVja19yZXNldF9jb21wbGV0ZShzdHJ1Y3Qgb3h1X2hjZCAqb3h1LCBpbnQgaW5kZXgsCisJCQkJdTMyIF9faW9tZW0gKnN0YXR1c19yZWcsIGludCBwb3J0X3N0YXR1cykKK3sKKwlpZiAoIShwb3J0X3N0YXR1cyAmIFBPUlRfQ09OTkVDVCkpIHsKKwkJb3h1LT5yZXNldF9kb25lW2luZGV4XSA9IDA7CisJCXJldHVybiBwb3J0X3N0YXR1czsKKwl9CisKKwkvKiBpZiByZXNldCBmaW5pc2hlZCBhbmQgaXQncyBzdGlsbCBub3QgZW5hYmxlZCAtLSBoYW5kb2ZmICovCisJaWYgKCEocG9ydF9zdGF0dXMgJiBQT1JUX1BFKSkgeworCQlveHVfZGJnKG94dSwgIkZhaWxlZCB0byBlbmFibGUgcG9ydCAlZCBvbiByb290IGh1YiBUVFxuIiwKKwkJCQlpbmRleCsxKTsKKwkJcmV0dXJuIHBvcnRfc3RhdHVzOworCX0gZWxzZQorCQlveHVfZGJnKG94dSwgInBvcnQgJWQgaGlnaCBzcGVlZFxuIiwgaW5kZXggKyAxKTsKKworCXJldHVybiBwb3J0X3N0YXR1czsKK30KKworc3RhdGljIHZvaWQgZWhjaV9odWJfZGVzY3JpcHRvcihzdHJ1Y3Qgb3h1X2hjZCAqb3h1LAorCQkJCXN0cnVjdCB1c2JfaHViX2Rlc2NyaXB0b3IgKmRlc2MpCit7CisJaW50IHBvcnRzID0gSENTX05fUE9SVFMob3h1LT5oY3NfcGFyYW1zKTsKKwl1MTYgdGVtcDsKKworCWRlc2MtPmJEZXNjcmlwdG9yVHlwZSA9IDB4Mjk7CisJZGVzYy0+YlB3ck9uMlB3ckdvb2QgPSAxMDsJLyogb3h1IDEuMCwgMi4zLjkgc2F5cyAyMG1zIG1heCAqLworCWRlc2MtPmJIdWJDb250ckN1cnJlbnQgPSAwOworCisJZGVzYy0+Yk5iclBvcnRzID0gcG9ydHM7CisJdGVtcCA9IDEgKyAocG9ydHMgLyA4KTsKKwlkZXNjLT5iRGVzY0xlbmd0aCA9IDcgKyAyICogdGVtcDsKKworCS8qIHR3byBiaXRtYXBzOiAgcG9ydHMgcmVtb3ZhYmxlLCBhbmQgdXNiIDEuMCBsZWdhY3kgUG9ydFB3ckN0cmxNYXNrICovCisJbWVtc2V0KCZkZXNjLT5iaXRtYXBbMF0sIDAsIHRlbXApOworCW1lbXNldCgmZGVzYy0+Yml0bWFwW3RlbXBdLCAweGZmLCB0ZW1wKTsKKworCXRlbXAgPSAweDAwMDg7CQkJLyogcGVyLXBvcnQgb3ZlcmN1cnJlbnQgcmVwb3J0aW5nICovCisJaWYgKEhDU19QUEMob3h1LT5oY3NfcGFyYW1zKSkKKwkJdGVtcCB8PSAweDAwMDE7CQkvKiBwZXItcG9ydCBwb3dlciBjb250cm9sICovCisJZWxzZQorCQl0ZW1wIHw9IDB4MDAwMjsJCS8qIG5vIHBvd2VyIHN3aXRjaGluZyAqLworCWRlc2MtPndIdWJDaGFyYWN0ZXJpc3RpY3MgPSAoX19mb3JjZSBfX3UxNiljcHVfdG9fbGUxNih0ZW1wKTsKK30KKworCisvKiBBbGxvY2F0ZSBhbiBPWFUyMTBIUCBvbi1jaGlwIG1lbW9yeSBkYXRhIGJ1ZmZlcgorICoKKyAqIEFuIG9uLWNoaXAgbWVtb3J5IGRhdGEgYnVmZmVyIGlzIHJlcXVpcmVkIGZvciBlYWNoIE9YVTIxMEhQIFVTQiB0cmFuc2Zlci4KKyAqIEVhY2ggdHJhbnNmZXIgZGVzY3JpcHRvciBoYXMgb25lIG9yIG1vcmUgb24tY2hpcCBtZW1vcnkgZGF0YSBidWZmZXJzLgorICoKKyAqIERhdGEgYnVmZmVycyBhcmUgYWxsb2NhdGVkIGZyb20gYSBmaXggc2l6ZWQgcG9vbCBvZiBkYXRhIGJsb2Nrcy4KKyAqIFRvIG1pbmltaXNlIGZyYWdtZW50YXRpb24gYW5kIGdpdmUgcmVhc29uYWJsZSBtZW1vcnkgdXRsaXNhdGlvbiwKKyAqIGRhdGEgYnVmZmVycyBhcmUgYWxsb2NhdGVkIHdpdGggc2l6ZXMgdGhlIHBvd2VyIG9mIDIgbXVsdGlwbGVzIG9mCisgKiB0aGUgYmxvY2sgc2l6ZSwgc3RhcnRpbmcgb24gYW4gYWRkcmVzcyBhIG11bHRpcGxlIG9mIHRoZSBhbGxvY2F0ZWQgc2l6ZS4KKyAqCisgKiBGSVhNRTogY2FsbGVycyBvZiB0aGlzIGZ1bmN0aW9uIHJlcXVpcmUgYSBidWZmZXIgdG8gYmUgYWxsb2NhdGVkIGZvcgorICogbGVuPTAuIFRoaXMgaXMgYSB3YXN0ZSBvZiBvbi1jaGlwIG1lbW9yeSBhbmQgc2hvdWxkIGJlIGZpeC4gVGhlbiB0aGlzCisgKiBmdW5jdGlvbiBzaG91bGQgYmUgY2hhbmdlZCB0byBub3QgYWxsb2NhdGUgYSBidWZmZXIgZm9yIGxlbj0wLgorICovCitzdGF0aWMgaW50IG94dV9idWZfYWxsb2Moc3RydWN0IG94dV9oY2QgKm94dSwgc3RydWN0IGVoY2lfcXRkICpxdGQsIGludCBsZW4pCit7CisJaW50IG5fYmxvY2tzOwkvKiBtaW5pdW0gYmxvY2tzIG5lZWRlZCB0byBob2xkIGxlbiAqLworCWludCBhX2Jsb2NrczsJLyogYmxvY2tzIGFsbG9jYXRlZCAqLworCWludCBpLCBqOworCisJLyogRG9uJ3QgYWxsb2N0ZSBiaWdnZXIgdGhhbiBzdXBwb3J0ZWQgKi8KKwlpZiAobGVuID4gQlVGRkVSX1NJWkUgKiBCVUZGRVJfTlVNKSB7CisJCW94dV9lcnIob3h1LCAiYnVmZmVyIHRvbyBiaWcgKCVkKVxuIiwgbGVuKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJc3Bpbl9sb2NrKCZveHUtPm1lbV9sb2NrKTsKKworCS8qIE51bWJlciBvZiBibG9ja3MgbmVlZGVkIHRvIGhvbGQgbGVuICovCisJbl9ibG9ja3MgPSAobGVuICsgQlVGRkVSX1NJWkUgLSAxKSAvIEJVRkZFUl9TSVpFOworCisJLyogUm91bmQgdGhlIG51bWJlciBvZiBibG9ja3MgdXAgdG8gdGhlIHBvd2VyIG9mIDIgKi8KKwlmb3IgKGFfYmxvY2tzID0gMTsgYV9ibG9ja3MgPCBuX2Jsb2NrczsgYV9ibG9ja3MgPDw9IDEpCisJCTsKKworCS8qIEZpbmQgYSBzdWl0YWJsZSBhdmFpbGFibGUgZGF0YSBidWZmZXIgKi8KKwlmb3IgKGkgPSAwOyBpIDwgQlVGRkVSX05VTTsKKwkJCWkgKz0gbWF4KGFfYmxvY2tzLCAoaW50KW94dS0+ZGJfdXNlZFtpXSkpIHsKKworCQkvKiBDaGVjayBhbGwgdGhlIHJlcXVpcmVkIGJsb2NrcyBhcmUgYXZhaWxhYmxlICovCisJCWZvciAoaiA9IDA7IGogPCBhX2Jsb2NrczsgaisrKQorCQkJaWYgKG94dS0+ZGJfdXNlZFtpICsgal0pCisJCQkJYnJlYWs7CisKKwkJaWYgKGogIT0gYV9ibG9ja3MpCisJCQljb250aW51ZTsKKworCQkvKiBBbGxvY2F0ZSBibG9ja3MgZm91bmQhICovCisJCXF0ZC0+YnVmZmVyID0gKHZvaWQgKikgJm94dS0+bWVtLT5kYl9wb29sW2ldOworCQlxdGQtPmJ1ZmZlcl9kbWEgPSB2aXJ0X3RvX3BoeXMocXRkLT5idWZmZXIpOworCisJCXF0ZC0+cXRkX2J1ZmZlcl9sZW4gPSBCVUZGRVJfU0laRSAqIGFfYmxvY2tzOworCQlveHUtPmRiX3VzZWRbaV0gPSBhX2Jsb2NrczsKKworCQlzcGluX3VubG9jaygmb3h1LT5tZW1fbG9jayk7CisKKwkJcmV0dXJuIDA7CisJfQorCisJLyogRmFpbGVkICovCisKKwlzcGluX3VubG9jaygmb3h1LT5tZW1fbG9jayk7CisKKwlyZXR1cm4gLUVOT01FTTsKK30KKworc3RhdGljIHZvaWQgb3h1X2J1Zl9mcmVlKHN0cnVjdCBveHVfaGNkICpveHUsIHN0cnVjdCBlaGNpX3F0ZCAqcXRkKQoreworCWludCBpbmRleDsKKworCXNwaW5fbG9jaygmb3h1LT5tZW1fbG9jayk7CisKKwlpbmRleCA9IChxdGQtPmJ1ZmZlciAtICh2b2lkICopICZveHUtPm1lbS0+ZGJfcG9vbFswXSkKKwkJCQkJCQkgLyBCVUZGRVJfU0laRTsKKwlveHUtPmRiX3VzZWRbaW5kZXhdID0gMDsKKwlxdGQtPnF0ZF9idWZmZXJfbGVuID0gMDsKKwlxdGQtPmJ1ZmZlcl9kbWEgPSAwOworCXF0ZC0+YnVmZmVyID0gTlVMTDsKKworCXNwaW5fdW5sb2NrKCZveHUtPm1lbV9sb2NrKTsKKworCXJldHVybjsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGVoY2lfcXRkX2luaXQoc3RydWN0IGVoY2lfcXRkICpxdGQsIGRtYV9hZGRyX3QgZG1hKQoreworCW1lbXNldChxdGQsIDAsIHNpemVvZiAqcXRkKTsKKwlxdGQtPnF0ZF9kbWEgPSBkbWE7CisJcXRkLT5od190b2tlbiA9IGNwdV90b19sZTMyKFFURF9TVFNfSEFMVCk7CisJcXRkLT5od19uZXh0ID0gRUhDSV9MSVNUX0VORDsKKwlxdGQtPmh3X2FsdF9uZXh0ID0gRUhDSV9MSVNUX0VORDsKKwlJTklUX0xJU1RfSEVBRCgmcXRkLT5xdGRfbGlzdCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBveHVfcXRkX2ZyZWUoc3RydWN0IG94dV9oY2QgKm94dSwgc3RydWN0IGVoY2lfcXRkICpxdGQpCit7CisJaW50IGluZGV4OworCisJaWYgKHF0ZC0+YnVmZmVyKQorCQlveHVfYnVmX2ZyZWUob3h1LCBxdGQpOworCisJc3Bpbl9sb2NrKCZveHUtPm1lbV9sb2NrKTsKKworCWluZGV4ID0gcXRkIC0gJm94dS0+bWVtLT5xdGRfcG9vbFswXTsKKwlveHUtPnF0ZF91c2VkW2luZGV4XSA9IDA7CisKKwlzcGluX3VubG9jaygmb3h1LT5tZW1fbG9jayk7CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZWhjaV9xdGQgKmVoY2lfcXRkX2FsbG9jKHN0cnVjdCBveHVfaGNkICpveHUpCit7CisJaW50IGk7CisJc3RydWN0IGVoY2lfcXRkICpxdGQgPSBOVUxMOworCisJc3Bpbl9sb2NrKCZveHUtPm1lbV9sb2NrKTsKKworCWZvciAoaSA9IDA7IGkgPCBRVERfTlVNOyBpKyspCisJCWlmICghb3h1LT5xdGRfdXNlZFtpXSkKKwkJCWJyZWFrOworCisJaWYgKGkgPCBRVERfTlVNKSB7CisJCXF0ZCA9IChzdHJ1Y3QgZWhjaV9xdGQgKikgJm94dS0+bWVtLT5xdGRfcG9vbFtpXTsKKwkJbWVtc2V0KHF0ZCwgMCwgc2l6ZW9mICpxdGQpOworCisJCXF0ZC0+aHdfdG9rZW4gPSBjcHVfdG9fbGUzMihRVERfU1RTX0hBTFQpOworCQlxdGQtPmh3X25leHQgPSBFSENJX0xJU1RfRU5EOworCQlxdGQtPmh3X2FsdF9uZXh0ID0gRUhDSV9MSVNUX0VORDsKKwkJSU5JVF9MSVNUX0hFQUQoJnF0ZC0+cXRkX2xpc3QpOworCisJCXF0ZC0+cXRkX2RtYSA9IHZpcnRfdG9fcGh5cyhxdGQpOworCisJCW94dS0+cXRkX3VzZWRbaV0gPSAxOworCX0KKworCXNwaW5fdW5sb2NrKCZveHUtPm1lbV9sb2NrKTsKKworCXJldHVybiBxdGQ7Cit9CisKK3N0YXRpYyB2b2lkIG94dV9xaF9mcmVlKHN0cnVjdCBveHVfaGNkICpveHUsIHN0cnVjdCBlaGNpX3FoICpxaCkKK3sKKwlpbnQgaW5kZXg7CisKKwlzcGluX2xvY2soJm94dS0+bWVtX2xvY2spOworCisJaW5kZXggPSBxaCAtICZveHUtPm1lbS0+cWhfcG9vbFswXTsKKwlveHUtPnFoX3VzZWRbaW5kZXhdID0gMDsKKworCXNwaW5fdW5sb2NrKCZveHUtPm1lbV9sb2NrKTsKKworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgcWhfZGVzdHJveShzdHJ1Y3Qga3JlZiAqa3JlZikKK3sKKwlzdHJ1Y3QgZWhjaV9xaCAqcWggPSBjb250YWluZXJfb2Yoa3JlZiwgc3RydWN0IGVoY2lfcWgsIGtyZWYpOworCXN0cnVjdCBveHVfaGNkICpveHUgPSBxaC0+b3h1OworCisJLyogY2xlYW4gcXRkcyBmaXJzdCwgYW5kIGtub3cgdGhpcyBpcyBub3QgbGlua2VkICovCisJaWYgKCFsaXN0X2VtcHR5KCZxaC0+cXRkX2xpc3QpIHx8IHFoLT5xaF9uZXh0LnB0cikgeworCQlveHVfZGJnKG94dSwgInVudXNlZCBxaCBub3QgZW1wdHkhXG4iKTsKKwkJQlVHKCk7CisJfQorCWlmIChxaC0+ZHVtbXkpCisJCW94dV9xdGRfZnJlZShveHUsIHFoLT5kdW1teSk7CisJb3h1X3FoX2ZyZWUob3h1LCBxaCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZWhjaV9xaCAqb3h1X3FoX2FsbG9jKHN0cnVjdCBveHVfaGNkICpveHUpCit7CisJaW50IGk7CisJc3RydWN0IGVoY2lfcWggKnFoID0gTlVMTDsKKworCXNwaW5fbG9jaygmb3h1LT5tZW1fbG9jayk7CisKKwlmb3IgKGkgPSAwOyBpIDwgUUhFQURfTlVNOyBpKyspCisJCWlmICghb3h1LT5xaF91c2VkW2ldKQorCQkJYnJlYWs7CisKKwlpZiAoaSA8IFFIRUFEX05VTSkgeworCQlxaCA9IChzdHJ1Y3QgZWhjaV9xaCAqKSAmb3h1LT5tZW0tPnFoX3Bvb2xbaV07CisJCW1lbXNldChxaCwgMCwgc2l6ZW9mICpxaCk7CisKKwkJa3JlZl9pbml0KCZxaC0+a3JlZik7CisJCXFoLT5veHUgPSBveHU7CisJCXFoLT5xaF9kbWEgPSB2aXJ0X3RvX3BoeXMocWgpOworCQlJTklUX0xJU1RfSEVBRCgmcWgtPnF0ZF9saXN0KTsKKworCQkvKiBkdW1teSB0ZCBlbmFibGVzIHNhZmUgdXJiIHF1ZXVpbmcgKi8KKwkJcWgtPmR1bW15ID0gZWhjaV9xdGRfYWxsb2Mob3h1KTsKKwkJaWYgKHFoLT5kdW1teSA9PSBOVUxMKSB7CisJCQlveHVfZGJnKG94dSwgIm5vIGR1bW15IHRkXG4iKTsKKwkJCW94dS0+cWhfdXNlZFtpXSA9IDA7CisKKwkJCXJldHVybiBOVUxMOworCQl9CisKKwkJb3h1LT5xaF91c2VkW2ldID0gMTsKKwl9CisKKwlzcGluX3VubG9jaygmb3h1LT5tZW1fbG9jayk7CisKKwlyZXR1cm4gcWg7Cit9CisKKy8qIHRvIHNoYXJlIGEgcWggKGNwdSB0aHJlYWRzLCBvciBoYykgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IGVoY2lfcWggKnFoX2dldChzdHJ1Y3QgZWhjaV9xaCAqcWgpCit7CisJa3JlZl9nZXQoJnFoLT5rcmVmKTsKKwlyZXR1cm4gcWg7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBxaF9wdXQoc3RydWN0IGVoY2lfcWggKnFoKQoreworCWtyZWZfcHV0KCZxaC0+a3JlZiwgcWhfZGVzdHJveSk7Cit9CisKK3N0YXRpYyB2b2lkIG94dV9tdXJiX2ZyZWUoc3RydWN0IG94dV9oY2QgKm94dSwgc3RydWN0IG94dV9tdXJiICptdXJiKQoreworCWludCBpbmRleDsKKworCXNwaW5fbG9jaygmb3h1LT5tZW1fbG9jayk7CisKKwlpbmRleCA9IG11cmIgLSAmb3h1LT5tdXJiX3Bvb2xbMF07CisJb3h1LT5tdXJiX3VzZWRbaW5kZXhdID0gMDsKKworCXNwaW5fdW5sb2NrKCZveHUtPm1lbV9sb2NrKTsKKworCXJldHVybjsKK30KKworc3RhdGljIHN0cnVjdCBveHVfbXVyYiAqb3h1X211cmJfYWxsb2Moc3RydWN0IG94dV9oY2QgKm94dSkKKworeworCWludCBpOworCXN0cnVjdCBveHVfbXVyYiAqbXVyYiA9IE5VTEw7CisKKwlzcGluX2xvY2soJm94dS0+bWVtX2xvY2spOworCisJZm9yIChpID0gMDsgaSA8IE1VUkJfTlVNOyBpKyspCisJCWlmICghb3h1LT5tdXJiX3VzZWRbaV0pCisJCQlicmVhazsKKworCWlmIChpIDwgTVVSQl9OVU0pIHsKKwkJbXVyYiA9ICYob3h1LT5tdXJiX3Bvb2wpW2ldOworCisJCW94dS0+bXVyYl91c2VkW2ldID0gMTsKKwl9CisKKwlzcGluX3VubG9jaygmb3h1LT5tZW1fbG9jayk7CisKKwlyZXR1cm4gbXVyYjsKK30KKworLyogVGhlIHF1ZXVlIGhlYWRzIGFuZCB0cmFuc2ZlciBkZXNjcmlwdG9ycyBhcmUgbWFuYWdlZCBmcm9tIHBvb2xzIHRpZWQKKyAqIHRvIGVhY2ggb2YgdGhlICJwZXIgZGV2aWNlIiBzdHJ1Y3R1cmVzLgorICogVGhpcyBpcyB0aGUgaW5pdGlhbGlzYXRpb24gYW5kIGNsZWFudXAgY29kZS4KKyAqLworc3RhdGljIHZvaWQgZWhjaV9tZW1fY2xlYW51cChzdHJ1Y3Qgb3h1X2hjZCAqb3h1KQoreworCWtmcmVlKG94dS0+bXVyYl9wb29sKTsKKwlveHUtPm11cmJfcG9vbCA9IE5VTEw7CisKKwlpZiAob3h1LT5hc3luYykKKwkJcWhfcHV0KG94dS0+YXN5bmMpOworCW94dS0+YXN5bmMgPSBOVUxMOworCisJZGVsX3RpbWVyKCZveHUtPnVyYl90aW1lcik7CisKKwlveHUtPnBlcmlvZGljID0gTlVMTDsKKworCS8qIHNoYWRvdyBwZXJpb2RpYyB0YWJsZSAqLworCWtmcmVlKG94dS0+cHNoYWRvdyk7CisJb3h1LT5wc2hhZG93ID0gTlVMTDsKK30KKworLyogUmVtZW1iZXIgdG8gYWRkIGNsZWFudXAgY29kZSAoYWJvdmUpIGlmIHlvdSBhZGQgYW55dGhpbmcgaGVyZS4KKyAqLworc3RhdGljIGludCBlaGNpX21lbV9pbml0KHN0cnVjdCBveHVfaGNkICpveHUsIGdmcF90IGZsYWdzKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IG94dS0+cGVyaW9kaWNfc2l6ZTsgaSsrKQorCQlveHUtPm1lbS0+ZnJhbWVfbGlzdFtpXSA9IEVIQ0lfTElTVF9FTkQ7CisJZm9yIChpID0gMDsgaSA8IFFIRUFEX05VTTsgaSsrKQorCQlveHUtPnFoX3VzZWRbaV0gPSAwOworCWZvciAoaSA9IDA7IGkgPCBRVERfTlVNOyBpKyspCisJCW94dS0+cXRkX3VzZWRbaV0gPSAwOworCisJb3h1LT5tdXJiX3Bvb2wgPSBrY2FsbG9jKE1VUkJfTlVNLCBzaXplb2Yoc3RydWN0IG94dV9tdXJiKSwgZmxhZ3MpOworCWlmICghb3h1LT5tdXJiX3Bvb2wpCisJCWdvdG8gZmFpbDsKKworCWZvciAoaSA9IDA7IGkgPCBNVVJCX05VTTsgaSsrKQorCQlveHUtPm11cmJfdXNlZFtpXSA9IDA7CisKKwlveHUtPmFzeW5jID0gb3h1X3FoX2FsbG9jKG94dSk7CisJaWYgKCFveHUtPmFzeW5jKQorCQlnb3RvIGZhaWw7CisKKwlveHUtPnBlcmlvZGljID0gKF9fbGUzMiAqKSAmb3h1LT5tZW0tPmZyYW1lX2xpc3Q7CisJb3h1LT5wZXJpb2RpY19kbWEgPSB2aXJ0X3RvX3BoeXMob3h1LT5wZXJpb2RpYyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgb3h1LT5wZXJpb2RpY19zaXplOyBpKyspCisJCW94dS0+cGVyaW9kaWNbaV0gPSBFSENJX0xJU1RfRU5EOworCisJLyogc29mdHdhcmUgc2hhZG93IG9mIGhhcmR3YXJlIHRhYmxlICovCisJb3h1LT5wc2hhZG93ID0ga2NhbGxvYyhveHUtPnBlcmlvZGljX3NpemUsIHNpemVvZih2b2lkICopLCBmbGFncyk7CisJaWYgKG94dS0+cHNoYWRvdyAhPSBOVUxMKQorCQlyZXR1cm4gMDsKKworZmFpbDoKKwlveHVfZGJnKG94dSwgImNvdWxkbid0IGluaXQgbWVtb3J5XG4iKTsKKwllaGNpX21lbV9jbGVhbnVwKG94dSk7CisJcmV0dXJuIC1FTk9NRU07Cit9CisKKy8qIEZpbGwgYSBxdGQsIHJldHVybmluZyBob3cgbXVjaCBvZiB0aGUgYnVmZmVyIHdlIHdlcmUgYWJsZSB0byBxdWV1ZSB1cC4KKyAqLworc3RhdGljIGludCBxdGRfZmlsbChzdHJ1Y3QgZWhjaV9xdGQgKnF0ZCwgZG1hX2FkZHJfdCBidWYsIHNpemVfdCBsZW4sCisJCQkJaW50IHRva2VuLCBpbnQgbWF4cGFja2V0KQoreworCWludCBpLCBjb3VudDsKKwl1NjQgYWRkciA9IGJ1ZjsKKworCS8qIG9uZSBidWZmZXIgZW50cnkgcGVyIDRLIC4uLiBmaXJzdCBtaWdodCBiZSBzaG9ydCBvciB1bmFsaWduZWQgKi8KKwlxdGQtPmh3X2J1ZlswXSA9IGNwdV90b19sZTMyKCh1MzIpYWRkcik7CisJcXRkLT5od19idWZfaGlbMF0gPSBjcHVfdG9fbGUzMigodTMyKShhZGRyID4+IDMyKSk7CisJY291bnQgPSAweDEwMDAgLSAoYnVmICYgMHgwZmZmKTsJLyogcmVzdCBvZiB0aGF0IHBhZ2UgKi8KKwlpZiAobGlrZWx5KGxlbiA8IGNvdW50KSkJCS8qIC4uLiBpZmYgbmVlZGVkICovCisJCWNvdW50ID0gbGVuOworCWVsc2UgeworCQlidWYgKz0gIDB4MTAwMDsKKwkJYnVmICY9IH4weDBmZmY7CisKKwkJLyogcGVyLXF0ZCBsaW1pdDogZnJvbSAxNksgdG8gMjBLIChiZXN0IGFsaWdubWVudCkgKi8KKwkJZm9yIChpID0gMTsgY291bnQgPCBsZW4gJiYgaSA8IDU7IGkrKykgeworCQkJYWRkciA9IGJ1ZjsKKwkJCXF0ZC0+aHdfYnVmW2ldID0gY3B1X3RvX2xlMzIoKHUzMilhZGRyKTsKKwkJCXF0ZC0+aHdfYnVmX2hpW2ldID0gY3B1X3RvX2xlMzIoKHUzMikoYWRkciA+PiAzMikpOworCQkJYnVmICs9IDB4MTAwMDsKKwkJCWlmICgoY291bnQgKyAweDEwMDApIDwgbGVuKQorCQkJCWNvdW50ICs9IDB4MTAwMDsKKwkJCWVsc2UKKwkJCQljb3VudCA9IGxlbjsKKwkJfQorCisJCS8qIHNob3J0IHBhY2tldHMgbWF5IG9ubHkgdGVybWluYXRlIHRyYW5zZmVycyAqLworCQlpZiAoY291bnQgIT0gbGVuKQorCQkJY291bnQgLT0gKGNvdW50ICUgbWF4cGFja2V0KTsKKwl9CisJcXRkLT5od190b2tlbiA9IGNwdV90b19sZTMyKChjb3VudCA8PCAxNikgfCB0b2tlbik7CisJcXRkLT5sZW5ndGggPSBjb3VudDsKKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHFoX3VwZGF0ZShzdHJ1Y3Qgb3h1X2hjZCAqb3h1LAorCQkJCXN0cnVjdCBlaGNpX3FoICpxaCwgc3RydWN0IGVoY2lfcXRkICpxdGQpCit7CisJLyogd3JpdGVzIHRvIGFuIGFjdGl2ZSBvdmVybGF5IGFyZSB1bnNhZmUgKi8KKwlCVUdfT04ocWgtPnFoX3N0YXRlICE9IFFIX1NUQVRFX0lETEUpOworCisJcWgtPmh3X3F0ZF9uZXh0ID0gUVREX05FWFQocXRkLT5xdGRfZG1hKTsKKwlxaC0+aHdfYWx0X25leHQgPSBFSENJX0xJU1RfRU5EOworCisJLyogRXhjZXB0IGZvciBjb250cm9sIGVuZHBvaW50cywgd2UgbWFrZSBoYXJkd2FyZSBtYWludGFpbiBkYXRhCisJICogdG9nZ2xlIChsaWtlIE9IQ0kpIC4uLiBoZXJlIChyZSlpbml0aWFsaXplIHRoZSB0b2dnbGUgaW4gdGhlIFFILAorCSAqIGFuZCBzZXQgdGhlIHBzZXVkby10b2dnbGUgaW4gdWRldi4gT25seSB1c2JfY2xlYXJfaGFsdCgpIHdpbGwKKwkgKiBldmVyIGNsZWFyIGl0LgorCSAqLworCWlmICghKHFoLT5od19pbmZvMSAmIGNwdV90b19sZTMyKDEgPDwgMTQpKSkgeworCQl1bnNpZ25lZAlpc19vdXQsIGVwbnVtOworCisJCWlzX291dCA9ICEocXRkLT5od190b2tlbiAmIGNwdV90b19sZTMyKDEgPDwgOCkpOworCQllcG51bSA9IChsZTMyX3RvX2NwdXAoJnFoLT5od19pbmZvMSkgPj4gOCkgJiAweDBmOworCQlpZiAodW5saWtlbHkoIXVzYl9nZXR0b2dnbGUocWgtPmRldiwgZXBudW0sIGlzX291dCkpKSB7CisJCQlxaC0+aHdfdG9rZW4gJj0gfl9fY29uc3RhbnRfY3B1X3RvX2xlMzIoUVREX1RPR0dMRSk7CisJCQl1c2Jfc2V0dG9nZ2xlKHFoLT5kZXYsIGVwbnVtLCBpc19vdXQsIDEpOworCQl9CisJfQorCisJLyogSEMgbXVzdCBzZWUgbGF0ZXN0IHF0ZCBhbmQgcWggZGF0YSBiZWZvcmUgd2UgY2xlYXIgQUNUSVZFK0hBTFQgKi8KKwl3bWIoKTsKKwlxaC0+aHdfdG9rZW4gJj0gX19jb25zdGFudF9jcHVfdG9fbGUzMihRVERfVE9HR0xFIHwgUVREX1NUU19QSU5HKTsKK30KKworLyogSWYgaXQgd2VyZW4ndCBmb3IgYSBjb21tb24gc2lsaWNvbiBxdWlyayAod3JpdGluZyB0aGUgZHVtbXkgaW50byB0aGUgcWgKKyAqIG92ZXJsYXksIHNvIHFoLT5od190b2tlbiB3cm9uZ2x5IGJlY29tZXMgaW5hY3RpdmUvaGFsdGVkKSwgb25seSBmYXVsdAorICogcmVjb3ZlcnkgKGluY2x1ZGluZyB1cmIgZGVxdWV1ZSkgd291bGQgbmVlZCBzb2Z0d2FyZSBjaGFuZ2VzIHRvIGEgUUguLi4KKyAqLworc3RhdGljIHZvaWQgcWhfcmVmcmVzaChzdHJ1Y3Qgb3h1X2hjZCAqb3h1LCBzdHJ1Y3QgZWhjaV9xaCAqcWgpCit7CisJc3RydWN0IGVoY2lfcXRkICpxdGQ7CisKKwlpZiAobGlzdF9lbXB0eSgmcWgtPnF0ZF9saXN0KSkKKwkJcXRkID0gcWgtPmR1bW15OworCWVsc2UgeworCQlxdGQgPSBsaXN0X2VudHJ5KHFoLT5xdGRfbGlzdC5uZXh0LAorCQkJCXN0cnVjdCBlaGNpX3F0ZCwgcXRkX2xpc3QpOworCQkvKiBmaXJzdCBxdGQgbWF5IGFscmVhZHkgYmUgcGFydGlhbGx5IHByb2Nlc3NlZCAqLworCQlpZiAoY3B1X3RvX2xlMzIocXRkLT5xdGRfZG1hKSA9PSBxaC0+aHdfY3VycmVudCkKKwkJCXF0ZCA9IE5VTEw7CisJfQorCisJaWYgKHF0ZCkKKwkJcWhfdXBkYXRlKG94dSwgcWgsIHF0ZCk7Cit9CisKK3N0YXRpYyB2b2lkIHF0ZF9jb3B5X3N0YXR1cyhzdHJ1Y3Qgb3h1X2hjZCAqb3h1LCBzdHJ1Y3QgdXJiICp1cmIsCisJCQkJc2l6ZV90IGxlbmd0aCwgdTMyIHRva2VuKQoreworCS8qIGNvdW50IElOL09VVCBieXRlcywgbm90IFNFVFVQIChldmVuIHNob3J0IHBhY2tldHMpICovCisJaWYgKGxpa2VseShRVERfUElEKHRva2VuKSAhPSAyKSkKKwkJdXJiLT5hY3R1YWxfbGVuZ3RoICs9IGxlbmd0aCAtIFFURF9MRU5HVEgodG9rZW4pOworCisJLyogZG9uJ3QgbW9kaWZ5IGVycm9yIGNvZGVzICovCisJaWYgKHVubGlrZWx5KHVyYi0+c3RhdHVzICE9IC1FSU5QUk9HUkVTUykpCisJCXJldHVybjsKKworCS8qIGZvcmNlIGNsZWFudXAgYWZ0ZXIgc2hvcnQgcmVhZDsgbm90IGFsd2F5cyBhbiBlcnJvciAqLworCWlmICh1bmxpa2VseShJU19TSE9SVF9SRUFEKHRva2VuKSkpCisJCXVyYi0+c3RhdHVzID0gLUVSRU1PVEVJTzsKKworCS8qIHNlcmlvdXMgImNhbid0IHByb2NlZWQiIGZhdWx0cyByZXBvcnRlZCBieSB0aGUgaGFyZHdhcmUgKi8KKwlpZiAodG9rZW4gJiBRVERfU1RTX0hBTFQpIHsKKwkJaWYgKHRva2VuICYgUVREX1NUU19CQUJCTEUpIHsKKwkJCS8qIEZJWE1FICJtdXN0IiBkaXNhYmxlIGJhYmJsaW5nIGRldmljZSdzIHBvcnQgdG9vICovCisJCQl1cmItPnN0YXR1cyA9IC1FT1ZFUkZMT1c7CisJCX0gZWxzZSBpZiAodG9rZW4gJiBRVERfU1RTX01NRikgeworCQkJLyogZnMvbHMgaW50ZXJydXB0IHhmZXIgbWlzc2VkIHRoZSBjb21wbGV0ZS1zcGxpdCAqLworCQkJdXJiLT5zdGF0dXMgPSAtRVBST1RPOworCQl9IGVsc2UgaWYgKHRva2VuICYgUVREX1NUU19EQkUpIHsKKwkJCXVyYi0+c3RhdHVzID0gKFFURF9QSUQodG9rZW4pID09IDEpIC8qIElOID8gKi8KKwkJCQk/IC1FTk9TUiAgLyogaGMgY291bGRuJ3QgcmVhZCBkYXRhICovCisJCQkJOiAtRUNPTU07IC8qIGhjIGNvdWxkbid0IHdyaXRlIGRhdGEgKi8KKwkJfSBlbHNlIGlmICh0b2tlbiAmIFFURF9TVFNfWEFDVCkgeworCQkJLyogdGltZW91dCwgYmFkIGNyYywgd3JvbmcgUElELCBldGM7IHJldHJpZWQgKi8KKwkJCWlmIChRVERfQ0VSUih0b2tlbikpCisJCQkJdXJiLT5zdGF0dXMgPSAtRVBJUEU7CisJCQllbHNlIHsKKwkJCQlveHVfZGJnKG94dSwgImRldnBhdGggJXMgZXAlZCVzIDNzdHJpa2VzXG4iLAorCQkJCQl1cmItPmRldi0+ZGV2cGF0aCwKKwkJCQkJdXNiX3BpcGVlbmRwb2ludCh1cmItPnBpcGUpLAorCQkJCQl1c2JfcGlwZWluKHVyYi0+cGlwZSkgPyAiaW4iIDogIm91dCIpOworCQkJCXVyYi0+c3RhdHVzID0gLUVQUk9UTzsKKwkJCX0KKwkJLyogQ0VSUiBub256ZXJvICsgbm8gZXJyb3JzICsgaGFsdCAtLT4gc3RhbGwgKi8KKwkJfSBlbHNlIGlmIChRVERfQ0VSUih0b2tlbikpCisJCQl1cmItPnN0YXR1cyA9IC1FUElQRTsKKwkJZWxzZQkvKiB1bmtub3duICovCisJCQl1cmItPnN0YXR1cyA9IC1FUFJPVE87CisKKwkJb3h1X3ZkYmcob3h1LCAiZGV2JWQgZXAlZCVzIHF0ZCB0b2tlbiAlMDh4IC0tPiBzdGF0dXMgJWRcbiIsCisJCQl1c2JfcGlwZWRldmljZSh1cmItPnBpcGUpLAorCQkJdXNiX3BpcGVlbmRwb2ludCh1cmItPnBpcGUpLAorCQkJdXNiX3BpcGVpbih1cmItPnBpcGUpID8gImluIiA6ICJvdXQiLAorCQkJdG9rZW4sIHVyYi0+c3RhdHVzKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGVoY2lfdXJiX2RvbmUoc3RydWN0IG94dV9oY2QgKm94dSwgc3RydWN0IHVyYiAqdXJiKQorX19yZWxlYXNlcyhveHUtPmxvY2spCitfX2FjcXVpcmVzKG94dS0+bG9jaykKK3sKKwlpZiAobGlrZWx5KHVyYi0+aGNwcml2ICE9IE5VTEwpKSB7CisJCXN0cnVjdCBlaGNpX3FoCSpxaCA9IChzdHJ1Y3QgZWhjaV9xaCAqKSB1cmItPmhjcHJpdjsKKworCQkvKiBTLW1hc2sgaW4gYSBRSCBtZWFucyBpdCdzIGFuIGludGVycnVwdCB1cmIgKi8KKwkJaWYgKChxaC0+aHdfaW5mbzIgJiBfX2NvbnN0YW50X2NwdV90b19sZTMyKFFIX1NNQVNLKSkgIT0gMCkgeworCisJCQkvKiAuLi4gdXBkYXRlIGhjLXdpZGUgcGVyaW9kaWMgc3RhdHMgKGZvciB1c2JmcykgKi8KKwkJCW94dV90b19oY2Qob3h1KS0+c2VsZi5iYW5kd2lkdGhfaW50X3JlcXMtLTsKKwkJfQorCQlxaF9wdXQocWgpOworCX0KKworCXVyYi0+aGNwcml2ID0gTlVMTDsKKwlzd2l0Y2ggKHVyYi0+c3RhdHVzKSB7CisJY2FzZSAtRUlOUFJPR1JFU1M6CQkvKiBzdWNjZXNzICovCisJCXVyYi0+c3RhdHVzID0gMDsKKwlkZWZhdWx0OgkJCS8qIGZhdWx0ICovCisJCWJyZWFrOworCWNhc2UgLUVSRU1PVEVJTzoJCS8qIGZhdWx0IG9yIG5vcm1hbCAqLworCQlpZiAoISh1cmItPnRyYW5zZmVyX2ZsYWdzICYgVVJCX1NIT1JUX05PVF9PSykpCisJCQl1cmItPnN0YXR1cyA9IDA7CisJCWJyZWFrOworCWNhc2UgLUVDT05OUkVTRVQ6CQkvKiBjYW5jZWxlZCAqLworCWNhc2UgLUVOT0VOVDoKKwkJYnJlYWs7CisJfQorCisjaWZkZWYgT1hVX1VSQl9UUkFDRQorCW94dV9kYmcob3h1LCAiJXMgJXMgdXJiICVwIGVwJWQlcyBzdGF0dXMgJWQgbGVuICVkLyVkXG4iLAorCQlfX2Z1bmNfXywgdXJiLT5kZXYtPmRldnBhdGgsIHVyYiwKKwkJdXNiX3BpcGVlbmRwb2ludCh1cmItPnBpcGUpLAorCQl1c2JfcGlwZWluKHVyYi0+cGlwZSkgPyAiaW4iIDogIm91dCIsCisJCXVyYi0+c3RhdHVzLAorCQl1cmItPmFjdHVhbF9sZW5ndGgsIHVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCk7CisjZW5kaWYKKworCS8qIGNvbXBsZXRlKCkgY2FuIHJlZW50ZXIgdGhpcyBIQ0QgKi8KKwlzcGluX3VubG9jaygmb3h1LT5sb2NrKTsKKwl1c2JfaGNkX2dpdmViYWNrX3VyYihveHVfdG9faGNkKG94dSksIHVyYiwgdXJiLT5zdGF0dXMpOworCXNwaW5fbG9jaygmb3h1LT5sb2NrKTsKK30KKworc3RhdGljIHZvaWQgc3RhcnRfdW5saW5rX2FzeW5jKHN0cnVjdCBveHVfaGNkICpveHUsIHN0cnVjdCBlaGNpX3FoICpxaCk7CitzdGF0aWMgdm9pZCB1bmxpbmtfYXN5bmMoc3RydWN0IG94dV9oY2QgKm94dSwgc3RydWN0IGVoY2lfcWggKnFoKTsKKworc3RhdGljIHZvaWQgaW50cl9kZXNjaGVkdWxlKHN0cnVjdCBveHVfaGNkICpveHUsIHN0cnVjdCBlaGNpX3FoICpxaCk7CitzdGF0aWMgaW50IHFoX3NjaGVkdWxlKHN0cnVjdCBveHVfaGNkICpveHUsIHN0cnVjdCBlaGNpX3FoICpxaCk7CisKKyNkZWZpbmUgSEFMVF9CSVQgX19jb25zdGFudF9jcHVfdG9fbGUzMihRVERfU1RTX0hBTFQpCisKKy8qIFByb2Nlc3MgYW5kIGZyZWUgY29tcGxldGVkIHF0ZHMgZm9yIGEgcWgsIHJldHVybmluZyBVUkJzIHRvIGRyaXZlcnMuCisgKiBDaGFzZXMgdXAgdG8gcWgtPmh3X2N1cnJlbnQuICBSZXR1cm5zIG51bWJlciBvZiBjb21wbGV0aW9ucyBjYWxsZWQsCisgKiBpbmRpY2F0aW5nIGhvdyBtdWNoICJyZWFsIiB3b3JrIHdlIGRpZC4KKyAqLworc3RhdGljIHVuc2lnbmVkIHFoX2NvbXBsZXRpb25zKHN0cnVjdCBveHVfaGNkICpveHUsIHN0cnVjdCBlaGNpX3FoICpxaCkKK3sKKwlzdHJ1Y3QgZWhjaV9xdGQgKmxhc3QgPSBOVUxMLCAqZW5kID0gcWgtPmR1bW15OworCXN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5LCAqdG1wOworCWludCBzdG9wcGVkOworCXVuc2lnbmVkIGNvdW50ID0gMDsKKwlpbnQgZG9fc3RhdHVzID0gMDsKKwl1OCBzdGF0ZTsKKwlzdHJ1Y3Qgb3h1X211cmIgKm11cmIgPSBOVUxMOworCisJaWYgKHVubGlrZWx5KGxpc3RfZW1wdHkoJnFoLT5xdGRfbGlzdCkpKQorCQlyZXR1cm4gY291bnQ7CisKKwkvKiBjb21wbGV0aW9ucyAob3IgdGFza3Mgb24gb3RoZXIgY3B1cykgbXVzdCBuZXZlciBjbG9iYmVyIEhBTFQKKwkgKiB0aWxsIHdlJ3ZlIGdvbmUgdGhyb3VnaCBhbmQgY2xlYW5lZCBldmVyeXRoaW5nIHVwLCBldmVuIHdoZW4KKwkgKiB0aGV5IGFkZCB1cmJzIHRvIHRoaXMgcWgncyBxdWV1ZSBvciBtYXJrIHRoZW0gZm9yIHVubGlua2luZy4KKwkgKgorCSAqIE5PVEU6ICB1bmxpbmtpbmcgZXhwZWN0cyB0byBiZSBkb25lIGluIHF1ZXVlIG9yZGVyLgorCSAqLworCXN0YXRlID0gcWgtPnFoX3N0YXRlOworCXFoLT5xaF9zdGF0ZSA9IFFIX1NUQVRFX0NPTVBMRVRJTkc7CisJc3RvcHBlZCA9IChzdGF0ZSA9PSBRSF9TVEFURV9JRExFKTsKKworCS8qIHJlbW92ZSBkZS1hY3RpdmF0ZWQgUVREcyBmcm9tIGZyb250IG9mIHF1ZXVlLgorCSAqIGFmdGVyIGZhdWx0cyAoaW5jbHVkaW5nIHNob3J0IHJlYWRzKSwgY2xlYW51cCB0aGlzIHVyYgorCSAqIHRoZW4gbGV0IHRoZSBxdWV1ZSBhZHZhbmNlLgorCSAqIGlmIHF1ZXVlIGlzIHN0b3BwZWQsIGhhbmRsZXMgdW5saW5rcy4KKwkgKi8KKwlsaXN0X2Zvcl9lYWNoX3NhZmUoZW50cnksIHRtcCwgJnFoLT5xdGRfbGlzdCkgeworCQlzdHJ1Y3QgZWhjaV9xdGQJKnF0ZDsKKwkJc3RydWN0IHVyYiAqdXJiOworCQl1MzIgdG9rZW4gPSAwOworCisJCXF0ZCA9IGxpc3RfZW50cnkoZW50cnksIHN0cnVjdCBlaGNpX3F0ZCwgcXRkX2xpc3QpOworCQl1cmIgPSBxdGQtPnVyYjsKKworCQkvKiBDbGVhbiB1cCBhbnkgc3RhdGUgZnJvbSBwcmV2aW91cyBRVEQgLi4uKi8KKwkJaWYgKGxhc3QpIHsKKwkJCWlmIChsaWtlbHkobGFzdC0+dXJiICE9IHVyYikpIHsKKwkJCQlpZiAobGFzdC0+dXJiLT5jb21wbGV0ZSA9PSBOVUxMKSB7CisJCQkJCW11cmIgPSAoc3RydWN0IG94dV9tdXJiICopIGxhc3QtPnVyYjsKKwkJCQkJbGFzdC0+dXJiID0gbXVyYi0+bWFpbjsKKwkJCQkJaWYgKG11cmItPmxhc3QpIHsKKwkJCQkJCWVoY2lfdXJiX2RvbmUob3h1LCBsYXN0LT51cmIpOworCQkJCQkJY291bnQrKzsKKwkJCQkJfQorCQkJCQlveHVfbXVyYl9mcmVlKG94dSwgbXVyYik7CisJCQkJfSBlbHNlIHsKKwkJCQkJZWhjaV91cmJfZG9uZShveHUsIGxhc3QtPnVyYik7CisJCQkJCWNvdW50Kys7CisJCQkJfQorCQkJfQorCQkJb3h1X3F0ZF9mcmVlKG94dSwgbGFzdCk7CisJCQlsYXN0ID0gTlVMTDsKKwkJfQorCisJCS8qIGlnbm9yZSB1cmJzIHN1Ym1pdHRlZCBkdXJpbmcgY29tcGxldGlvbnMgd2UgcmVwb3J0ZWQgKi8KKwkJaWYgKHF0ZCA9PSBlbmQpCisJCQlicmVhazsKKworCQkvKiBoYXJkd2FyZSBjb3BpZXMgcXRkIG91dCBvZiBxaCBvdmVybGF5ICovCisJCXJtYigpOworCQl0b2tlbiA9IGxlMzJfdG9fY3B1KHF0ZC0+aHdfdG9rZW4pOworCisJCS8qIGFsd2F5cyBjbGVhbiB1cCBxdGRzIHRoZSBoYyBkZS1hY3RpdmF0ZWQgKi8KKwkJaWYgKCh0b2tlbiAmIFFURF9TVFNfQUNUSVZFKSA9PSAwKSB7CisKKwkJCWlmICgodG9rZW4gJiBRVERfU1RTX0hBTFQpICE9IDApIHsKKwkJCQlzdG9wcGVkID0gMTsKKworCQkJLyogbWFnaWMgZHVtbXkgZm9yIHNvbWUgc2hvcnQgcmVhZHM7IHFoIHdvbid0IGFkdmFuY2UuCisJCQkgKiB0aGF0IHNpbGljb24gcXVpcmsgY2FuIGtpY2sgaW4gd2l0aCB0aGlzIGR1bW15IHRvby4KKwkJCSAqLworCQkJfSBlbHNlIGlmIChJU19TSE9SVF9SRUFEKHRva2VuKSAmJgorCQkJCQkhKHF0ZC0+aHdfYWx0X25leHQgJiBFSENJX0xJU1RfRU5EKSkgeworCQkJCXN0b3BwZWQgPSAxOworCQkJCWdvdG8gaGFsdDsKKwkJCX0KKworCQkvKiBzdG9wIHNjYW5uaW5nIHdoZW4gd2UgcmVhY2ggcXRkcyB0aGUgaGMgaXMgdXNpbmcgKi8KKwkJfSBlbHNlIGlmIChsaWtlbHkoIXN0b3BwZWQgJiYKKwkJCQlIQ19JU19SVU5OSU5HKG94dV90b19oY2Qob3h1KS0+c3RhdGUpKSkgeworCQkJYnJlYWs7CisKKwkJfSBlbHNlIHsKKwkJCXN0b3BwZWQgPSAxOworCisJCQlpZiAodW5saWtlbHkoIUhDX0lTX1JVTk5JTkcob3h1X3RvX2hjZChveHUpLT5zdGF0ZSkpKQorCQkJCXVyYi0+c3RhdHVzID0gLUVTSFVURE9XTjsKKworCQkJLyogaWdub3JlIGFjdGl2ZSB1cmJzIHVubGVzcyBzb21lIHByZXZpb3VzIHF0ZAorCQkJICogZm9yIHRoZSB1cmIgZmF1bHRlZCAoaW5jbHVkaW5nIHNob3J0IHJlYWQpIG9yCisJCQkgKiBpdHMgdXJiIHdhcyBjYW5jZWxlZC4gIHdlIG1heSBwYXRjaCBxaCBvciBxdGRzLgorCQkJICovCisJCQlpZiAobGlrZWx5KHVyYi0+c3RhdHVzID09IC1FSU5QUk9HUkVTUykpCisJCQkJY29udGludWU7CisKKwkJCS8qIGlzc3VlIHN0YXR1cyBhZnRlciBzaG9ydCBjb250cm9sIHJlYWRzICovCisJCQlpZiAodW5saWtlbHkoZG9fc3RhdHVzICE9IDApCisJCQkJCSYmIFFURF9QSUQodG9rZW4pID09IDAgLyogT1VUICovKSB7CisJCQkJZG9fc3RhdHVzID0gMDsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJLyogdG9rZW4gaW4gb3ZlcmxheSBtYXkgYmUgbW9zdCBjdXJyZW50ICovCisJCQlpZiAoc3RhdGUgPT0gUUhfU1RBVEVfSURMRQorCQkJCQkmJiBjcHVfdG9fbGUzMihxdGQtPnF0ZF9kbWEpCisJCQkJCQk9PSBxaC0+aHdfY3VycmVudCkKKwkJCQl0b2tlbiA9IGxlMzJfdG9fY3B1KHFoLT5od190b2tlbik7CisKKwkJCS8qIGZvcmNlIGhhbHQgZm9yIHVubGlua2VkIG9yIGJsb2NrZWQgcWgsIHNvIHdlJ2xsCisJCQkgKiBwYXRjaCB0aGUgcWggbGF0ZXIgYW5kIHNvIHRoYXQgY29tcGxldGlvbnMgY2FuJ3QKKwkJCSAqIGFjdGl2YXRlIGl0IHdoaWxlIHdlICJrbm93IiBpdCdzIHN0b3BwZWQuCisJCQkgKi8KKwkJCWlmICgoSEFMVF9CSVQgJiBxaC0+aHdfdG9rZW4pID09IDApIHsKK2hhbHQ6CisJCQkJcWgtPmh3X3Rva2VuIHw9IEhBTFRfQklUOworCQkJCXdtYigpOworCQkJfQorCQl9CisKKwkJLyogUmVtb3ZlIGl0IGZyb20gdGhlIHF1ZXVlICovCisJCXF0ZF9jb3B5X3N0YXR1cyhveHUsIHVyYi0+Y29tcGxldGUgPworCQkJCQl1cmIgOiAoKHN0cnVjdCBveHVfbXVyYiAqKSB1cmIpLT5tYWluLAorCQkJCXF0ZC0+bGVuZ3RoLCB0b2tlbik7CisJCWlmICgodXNiX3BpcGVpbihxdGQtPnVyYi0+cGlwZSkpICYmCisJCQkJKE5VTEwgIT0gcXRkLT50cmFuc2Zlcl9idWZmZXIpKQorCQkJbWVtY3B5KHF0ZC0+dHJhbnNmZXJfYnVmZmVyLCBxdGQtPmJ1ZmZlciwgcXRkLT5sZW5ndGgpOworCQlkb19zdGF0dXMgPSAodXJiLT5zdGF0dXMgPT0gLUVSRU1PVEVJTykKKwkJCQkmJiB1c2JfcGlwZWNvbnRyb2wodXJiLT5waXBlKTsKKworCQlpZiAoc3RvcHBlZCAmJiBxdGQtPnF0ZF9saXN0LnByZXYgIT0gJnFoLT5xdGRfbGlzdCkgeworCQkJbGFzdCA9IGxpc3RfZW50cnkocXRkLT5xdGRfbGlzdC5wcmV2LAorCQkJCQlzdHJ1Y3QgZWhjaV9xdGQsIHF0ZF9saXN0KTsKKwkJCWxhc3QtPmh3X25leHQgPSBxdGQtPmh3X25leHQ7CisJCX0KKwkJbGlzdF9kZWwoJnF0ZC0+cXRkX2xpc3QpOworCQlsYXN0ID0gcXRkOworCX0KKworCS8qIGxhc3QgdXJiJ3MgY29tcGxldGlvbiBtaWdodCBzdGlsbCBuZWVkIGNhbGxpbmcgKi8KKwlpZiAobGlrZWx5KGxhc3QgIT0gTlVMTCkpIHsKKwkJaWYgKGxhc3QtPnVyYi0+Y29tcGxldGUgPT0gTlVMTCkgeworCQkJbXVyYiA9IChzdHJ1Y3Qgb3h1X211cmIgKikgbGFzdC0+dXJiOworCQkJbGFzdC0+dXJiID0gbXVyYi0+bWFpbjsKKwkJCWlmIChtdXJiLT5sYXN0KSB7CisJCQkJZWhjaV91cmJfZG9uZShveHUsIGxhc3QtPnVyYik7CisJCQkJY291bnQrKzsKKwkJCX0KKwkJCW94dV9tdXJiX2ZyZWUob3h1LCBtdXJiKTsKKwkJfSBlbHNlIHsKKwkJCWVoY2lfdXJiX2RvbmUob3h1LCBsYXN0LT51cmIpOworCQkJY291bnQrKzsKKwkJfQorCQlveHVfcXRkX2ZyZWUob3h1LCBsYXN0KTsKKwl9CisKKwkvKiByZXN0b3JlIG9yaWdpbmFsIHN0YXRlOyBjYWxsZXIgbXVzdCB1bmxpbmsgb3IgcmVsaW5rICovCisJcWgtPnFoX3N0YXRlID0gc3RhdGU7CisKKwkvKiBiZSBzdXJlIHRoZSBoYXJkd2FyZSdzIGRvbmUgd2l0aCB0aGUgcWggYmVmb3JlIHJlZnJlc2hpbmcKKwkgKiBpdCBhZnRlciBmYXVsdCBjbGVhbnVwLCBvciByZWNvdmVyaW5nIGZyb20gc2lsaWNvbiB3cm9uZ2x5CisJICogb3ZlcmxheWluZyB0aGUgZHVtbXkgcXRkICh3aGljaCByZWR1Y2VzIERNQSBjaGF0dGVyKS4KKwkgKi8KKwlpZiAoc3RvcHBlZCAhPSAwIHx8IHFoLT5od19xdGRfbmV4dCA9PSBFSENJX0xJU1RfRU5EKSB7CisJCXN3aXRjaCAoc3RhdGUpIHsKKwkJY2FzZSBRSF9TVEFURV9JRExFOgorCQkJcWhfcmVmcmVzaChveHUsIHFoKTsKKwkJCWJyZWFrOworCQljYXNlIFFIX1NUQVRFX0xJTktFRDoKKwkJCS8qIHNob3VsZCBiZSByYXJlIGZvciBwZXJpb2RpYyB0cmFuc2ZlcnMsCisJCQkgKiBleGNlcHQgbWF5YmUgaGlnaCBiYW5kd2lkdGggLi4uCisJCQkgKi8KKwkJCWlmICgoX19jb25zdGFudF9jcHVfdG9fbGUzMihRSF9TTUFTSykKKwkJCQkJJiBxaC0+aHdfaW5mbzIpICE9IDApIHsKKwkJCQlpbnRyX2Rlc2NoZWR1bGUob3h1LCBxaCk7CisJCQkJKHZvaWQpIHFoX3NjaGVkdWxlKG94dSwgcWgpOworCQkJfSBlbHNlCisJCQkJdW5saW5rX2FzeW5jKG94dSwgcWgpOworCQkJYnJlYWs7CisJCS8qIG90aGVyd2lzZSwgdW5saW5rIGFscmVhZHkgc3RhcnRlZCAqLworCQl9CisJfQorCisJcmV0dXJuIGNvdW50OworfQorCisvKiBIaWdoIGJhbmR3aWR0aCBtdWx0aXBsaWVyLCBhcyBlbmNvZGVkIGluIGhpZ2hzcGVlZCBlbmRwb2ludCBkZXNjcmlwdG9ycyAqLworI2RlZmluZSBoYl9tdWx0KHdNYXhQYWNrZXRTaXplKQkJKDEgKyAoKCh3TWF4UGFja2V0U2l6ZSkgPj4gMTEpICYgMHgwMykpCisvKiAuLi4gYW5kIHBhY2tldCBzaXplLCBmb3IgYW55IGtpbmQgb2YgZW5kcG9pbnQgZGVzY3JpcHRvciAqLworI2RlZmluZSBtYXhfcGFja2V0KHdNYXhQYWNrZXRTaXplKQkoKHdNYXhQYWNrZXRTaXplKSAmIDB4MDdmZikKKworLyogUmV2ZXJzZSBvZiBxaF91cmJfdHJhbnNhY3Rpb246IGZyZWUgYSBsaXN0IG9mIFREcy4KKyAqIHVzZWQgZm9yIGNsZWFudXAgYWZ0ZXIgZXJyb3JzLCBiZWZvcmUgSEMgc2VlcyBhbiBVUkIncyBURHMuCisgKi8KK3N0YXRpYyB2b2lkIHF0ZF9saXN0X2ZyZWUoc3RydWN0IG94dV9oY2QgKm94dSwKKwkJCQlzdHJ1Y3QgdXJiICp1cmIsIHN0cnVjdCBsaXN0X2hlYWQgKnF0ZF9saXN0KQoreworCXN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5LCAqdGVtcDsKKworCWxpc3RfZm9yX2VhY2hfc2FmZShlbnRyeSwgdGVtcCwgcXRkX2xpc3QpIHsKKwkJc3RydWN0IGVoY2lfcXRkCSpxdGQ7CisKKwkJcXRkID0gbGlzdF9lbnRyeShlbnRyeSwgc3RydWN0IGVoY2lfcXRkLCBxdGRfbGlzdCk7CisJCWxpc3RfZGVsKCZxdGQtPnF0ZF9saXN0KTsKKwkJb3h1X3F0ZF9mcmVlKG94dSwgcXRkKTsKKwl9Cit9CisKKy8qIENyZWF0ZSBhIGxpc3Qgb2YgZmlsbGVkIHF0ZHMgZm9yIHRoaXMgVVJCOyB3b24ndCBsaW5rIGludG8gcWguCisgKi8KK3N0YXRpYyBzdHJ1Y3QgbGlzdF9oZWFkICpxaF91cmJfdHJhbnNhY3Rpb24oc3RydWN0IG94dV9oY2QgKm94dSwKKwkJCQkJCXN0cnVjdCB1cmIgKnVyYiwKKwkJCQkJCXN0cnVjdCBsaXN0X2hlYWQgKmhlYWQsCisJCQkJCQlnZnBfdCBmbGFncykKK3sKKwlzdHJ1Y3QgZWhjaV9xdGQJKnF0ZCwgKnF0ZF9wcmV2OworCWRtYV9hZGRyX3QgYnVmOworCWludCBsZW4sIG1heHBhY2tldDsKKwlpbnQgaXNfaW5wdXQ7CisJdTMyIHRva2VuOworCXZvaWQgKnRyYW5zZmVyX2J1ZiA9IE5VTEw7CisJaW50IHJldDsKKworCS8qCisJICogVVJCcyBtYXAgdG8gc2VxdWVuY2VzIG9mIFFURHM6IG9uZSBsb2dpY2FsIHRyYW5zYWN0aW9uCisJICovCisJcXRkID0gZWhjaV9xdGRfYWxsb2Mob3h1KTsKKwlpZiAodW5saWtlbHkoIXF0ZCkpCisJCXJldHVybiBOVUxMOworCWxpc3RfYWRkX3RhaWwoJnF0ZC0+cXRkX2xpc3QsIGhlYWQpOworCXF0ZC0+dXJiID0gdXJiOworCisJdG9rZW4gPSBRVERfU1RTX0FDVElWRTsKKwl0b2tlbiB8PSAoRUhDSV9UVU5FX0NFUlIgPDwgMTApOworCS8qIGZvciBzcGxpdCB0cmFuc2FjdGlvbnMsIFNwbGl0WFN0YXRlIGluaXRpYWxpemVkIHRvIHplcm8gKi8KKworCWxlbiA9IHVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aDsKKwlpc19pbnB1dCA9IHVzYl9waXBlaW4odXJiLT5waXBlKTsKKwlpZiAoIXVyYi0+dHJhbnNmZXJfYnVmZmVyICYmIHVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCAmJiBpc19pbnB1dCkKKwkJdXJiLT50cmFuc2Zlcl9idWZmZXIgPSBwaHlzX3RvX3ZpcnQodXJiLT50cmFuc2Zlcl9kbWEpOworCisJaWYgKHVzYl9waXBlY29udHJvbCh1cmItPnBpcGUpKSB7CisJCS8qIFNFVFVQIHBpZCAqLworCQlyZXQgPSBveHVfYnVmX2FsbG9jKG94dSwgcXRkLCBzaXplb2Yoc3RydWN0IHVzYl9jdHJscmVxdWVzdCkpOworCQlpZiAocmV0KQorCQkJZ290byBjbGVhbnVwOworCisJCXF0ZF9maWxsKHF0ZCwgcXRkLT5idWZmZXJfZG1hLCBzaXplb2Yoc3RydWN0IHVzYl9jdHJscmVxdWVzdCksCisJCQkJdG9rZW4gfCAoMiAvKiAic2V0dXAiICovIDw8IDgpLCA4KTsKKwkJbWVtY3B5KHF0ZC0+YnVmZmVyLCBxdGQtPnVyYi0+c2V0dXBfcGFja2V0LAorCQkJCXNpemVvZihzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0KSk7CisKKwkJLyogLi4uIGFuZCBhbHdheXMgYXQgbGVhc3Qgb25lIG1vcmUgcGlkICovCisJCXRva2VuIF49IFFURF9UT0dHTEU7CisJCXF0ZF9wcmV2ID0gcXRkOworCQlxdGQgPSBlaGNpX3F0ZF9hbGxvYyhveHUpOworCQlpZiAodW5saWtlbHkoIXF0ZCkpCisJCQlnb3RvIGNsZWFudXA7CisJCXF0ZC0+dXJiID0gdXJiOworCQlxdGRfcHJldi0+aHdfbmV4dCA9IFFURF9ORVhUKHF0ZC0+cXRkX2RtYSk7CisJCWxpc3RfYWRkX3RhaWwoJnF0ZC0+cXRkX2xpc3QsIGhlYWQpOworCisJCS8qIGZvciB6ZXJvIGxlbmd0aCBEQVRBIHN0YWdlcywgU1RBVFVTIGlzIGFsd2F5cyBJTiAqLworCQlpZiAobGVuID09IDApCisJCQl0b2tlbiB8PSAoMSAvKiAiaW4iICovIDw8IDgpOworCX0KKworCS8qCisJICogRGF0YSB0cmFuc2ZlciBzdGFnZTogYnVmZmVyIHNldHVwCisJICovCisKKwlyZXQgPSBveHVfYnVmX2FsbG9jKG94dSwgcXRkLCBsZW4pOworCWlmIChyZXQpCisJCWdvdG8gY2xlYW51cDsKKworCWJ1ZiA9IHF0ZC0+YnVmZmVyX2RtYTsKKwl0cmFuc2Zlcl9idWYgPSB1cmItPnRyYW5zZmVyX2J1ZmZlcjsKKworCWlmICghaXNfaW5wdXQpCisJCW1lbWNweShxdGQtPmJ1ZmZlciwgcXRkLT51cmItPnRyYW5zZmVyX2J1ZmZlciwgbGVuKTsKKworCWlmIChpc19pbnB1dCkKKwkJdG9rZW4gfD0gKDEgLyogImluIiAqLyA8PCA4KTsKKwkvKiBlbHNlIGl0J3MgYWxyZWFkeSBpbml0dGVkIHRvICJvdXQiIHBpZCAoMCA8PCA4KSAqLworCisJbWF4cGFja2V0ID0gbWF4X3BhY2tldCh1c2JfbWF4cGFja2V0KHVyYi0+ZGV2LCB1cmItPnBpcGUsICFpc19pbnB1dCkpOworCisJLyoKKwkgKiBidWZmZXIgZ2V0cyB3cmFwcGVkIGluIG9uZSBvciBtb3JlIHF0ZHM7CisJICogbGFzdCBvbmUgbWF5IGJlICJzaG9ydCIgKGluY2x1ZGluZyB6ZXJvIGxlbikKKwkgKiBhbmQgbWF5IHNlcnZlIGFzIGEgY29udHJvbCBzdGF0dXMgYWNrCisJICovCisJZm9yICg7OykgeworCQlpbnQgdGhpc19xdGRfbGVuOworCisJCXRoaXNfcXRkX2xlbiA9IHF0ZF9maWxsKHF0ZCwgYnVmLCBsZW4sIHRva2VuLCBtYXhwYWNrZXQpOworCQlxdGQtPnRyYW5zZmVyX2J1ZmZlciA9IHRyYW5zZmVyX2J1ZjsKKwkJbGVuIC09IHRoaXNfcXRkX2xlbjsKKwkJYnVmICs9IHRoaXNfcXRkX2xlbjsKKwkJdHJhbnNmZXJfYnVmICs9IHRoaXNfcXRkX2xlbjsKKwkJaWYgKGlzX2lucHV0KQorCQkJcXRkLT5od19hbHRfbmV4dCA9IG94dS0+YXN5bmMtPmh3X2FsdF9uZXh0OworCisJCS8qIHFoIG1ha2VzIGNvbnRyb2wgcGFja2V0cyB1c2UgcXRkIHRvZ2dsZTsgbWF5YmUgc3dpdGNoIGl0ICovCisJCWlmICgobWF4cGFja2V0ICYgKHRoaXNfcXRkX2xlbiArIChtYXhwYWNrZXQgLSAxKSkpID09IDApCisJCQl0b2tlbiBePSBRVERfVE9HR0xFOworCisJCWlmIChsaWtlbHkobGVuIDw9IDApKQorCQkJYnJlYWs7CisKKwkJcXRkX3ByZXYgPSBxdGQ7CisJCXF0ZCA9IGVoY2lfcXRkX2FsbG9jKG94dSk7CisJCWlmICh1bmxpa2VseSghcXRkKSkKKwkJCWdvdG8gY2xlYW51cDsKKwkJaWYgKGxpa2VseShsZW4gPiAwKSkgeworCQkJcmV0ID0gb3h1X2J1Zl9hbGxvYyhveHUsIHF0ZCwgbGVuKTsKKwkJCWlmIChyZXQpCisJCQkJZ290byBjbGVhbnVwOworCQl9CisJCXF0ZC0+dXJiID0gdXJiOworCQlxdGRfcHJldi0+aHdfbmV4dCA9IFFURF9ORVhUKHF0ZC0+cXRkX2RtYSk7CisJCWxpc3RfYWRkX3RhaWwoJnF0ZC0+cXRkX2xpc3QsIGhlYWQpOworCX0KKworCS8qIHVubGVzcyB0aGUgYnVsay9pbnRlcnJ1cHQgY2FsbGVyIHdhbnRzIGEgY2hhbmNlIHRvIGNsZWFuCisJICogdXAgYWZ0ZXIgc2hvcnQgcmVhZHMsIGhjIHNob3VsZCBhZHZhbmNlIHFoIHBhc3QgdGhpcyB1cmIKKwkgKi8KKwlpZiAobGlrZWx5KCh1cmItPnRyYW5zZmVyX2ZsYWdzICYgVVJCX1NIT1JUX05PVF9PSykgPT0gMAorCQkJCXx8IHVzYl9waXBlY29udHJvbCh1cmItPnBpcGUpKSkKKwkJcXRkLT5od19hbHRfbmV4dCA9IEVIQ0lfTElTVF9FTkQ7CisKKwkvKgorCSAqIGNvbnRyb2wgcmVxdWVzdHMgbWF5IG5lZWQgYSB0ZXJtaW5hdGluZyBkYXRhICJzdGF0dXMiIGFjazsKKwkgKiBidWxrIG9uZXMgbWF5IG5lZWQgYSB0ZXJtaW5hdGluZyBzaG9ydCBwYWNrZXQgKHplcm8gbGVuZ3RoKS4KKwkgKi8KKwlpZiAobGlrZWx5KHVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCAhPSAwKSkgeworCQlpbnQJb25lX21vcmUgPSAwOworCisJCWlmICh1c2JfcGlwZWNvbnRyb2wodXJiLT5waXBlKSkgeworCQkJb25lX21vcmUgPSAxOworCQkJdG9rZW4gXj0gMHgwMTAwOwkvKiAiaW4iIDwtLT4gIm91dCIgICovCisJCQl0b2tlbiB8PSBRVERfVE9HR0xFOwkvKiBmb3JjZSBEQVRBMSAqLworCQl9IGVsc2UgaWYgKHVzYl9waXBlYnVsayh1cmItPnBpcGUpCisJCQkJJiYgKHVyYi0+dHJhbnNmZXJfZmxhZ3MgJiBVUkJfWkVST19QQUNLRVQpCisJCQkJJiYgISh1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggJSBtYXhwYWNrZXQpKSB7CisJCQlvbmVfbW9yZSA9IDE7CisJCX0KKwkJaWYgKG9uZV9tb3JlKSB7CisJCQlxdGRfcHJldiA9IHF0ZDsKKwkJCXF0ZCA9IGVoY2lfcXRkX2FsbG9jKG94dSk7CisJCQlpZiAodW5saWtlbHkoIXF0ZCkpCisJCQkJZ290byBjbGVhbnVwOworCQkJcXRkLT51cmIgPSB1cmI7CisJCQlxdGRfcHJldi0+aHdfbmV4dCA9IFFURF9ORVhUKHF0ZC0+cXRkX2RtYSk7CisJCQlsaXN0X2FkZF90YWlsKCZxdGQtPnF0ZF9saXN0LCBoZWFkKTsKKworCQkJLyogbmV2ZXIgYW55IGRhdGEgaW4gc3VjaCBwYWNrZXRzICovCisJCQlxdGRfZmlsbChxdGQsIDAsIDAsIHRva2VuLCAwKTsKKwkJfQorCX0KKworCS8qIGJ5IGRlZmF1bHQsIGVuYWJsZSBpbnRlcnJ1cHQgb24gdXJiIGNvbXBsZXRpb24gKi8KKwkJcXRkLT5od190b2tlbiB8PSBfX2NvbnN0YW50X2NwdV90b19sZTMyKFFURF9JT0MpOworCXJldHVybiBoZWFkOworCitjbGVhbnVwOgorCXF0ZF9saXN0X2ZyZWUob3h1LCB1cmIsIGhlYWQpOworCXJldHVybiBOVUxMOworfQorCisvKiBFYWNoIFFIIGhvbGRzIGEgcXRkIGxpc3Q7IGEgUUggaXMgdXNlZCBmb3IgZXZlcnl0aGluZyBleGNlcHQgaXNvLgorICoKKyAqIEZvciBpbnRlcnJ1cHQgdXJicywgdGhlIHNjaGVkdWxlciBtdXN0IHNldCB0aGUgbWljcm9mcmFtZSBzY2hlZHVsaW5nCisgKiBtYXNrKHMpIGVhY2ggdGltZSB0aGUgUUggZ2V0cyBzY2hlZHVsZWQuICBGb3IgaGlnaHNwZWVkLCB0aGF0J3MKKyAqIGp1c3Qgb25lIG1pY3JvZnJhbWUgaW4gdGhlIHMtbWFzay4gIEZvciBzcGxpdCBpbnRlcnJ1cHQgdHJhbnNhY3Rpb25zCisgKiB0aGVyZSBhcmUgYWRkaXRpb25hbCBjb21wbGljYXRpb25zOiBjLW1hc2ssIG1heWJlIEZTVE5zLgorICovCitzdGF0aWMgc3RydWN0IGVoY2lfcWggKnFoX21ha2Uoc3RydWN0IG94dV9oY2QgKm94dSwKKwkJCQlzdHJ1Y3QgdXJiICp1cmIsIGdmcF90IGZsYWdzKQoreworCXN0cnVjdCBlaGNpX3FoICpxaCA9IG94dV9xaF9hbGxvYyhveHUpOworCXUzMiBpbmZvMSA9IDAsIGluZm8yID0gMDsKKwlpbnQgaXNfaW5wdXQsIHR5cGU7CisJaW50IG1heHAgPSAwOworCisJaWYgKCFxaCkKKwkJcmV0dXJuIHFoOworCisJLyoKKwkgKiBpbml0IGVuZHBvaW50L2RldmljZSBkYXRhIGZvciB0aGlzIFFICisJICovCisJaW5mbzEgfD0gdXNiX3BpcGVlbmRwb2ludCh1cmItPnBpcGUpIDw8IDg7CisJaW5mbzEgfD0gdXNiX3BpcGVkZXZpY2UodXJiLT5waXBlKSA8PCAwOworCisJaXNfaW5wdXQgPSB1c2JfcGlwZWluKHVyYi0+cGlwZSk7CisJdHlwZSA9IHVzYl9waXBldHlwZSh1cmItPnBpcGUpOworCW1heHAgPSB1c2JfbWF4cGFja2V0KHVyYi0+ZGV2LCB1cmItPnBpcGUsICFpc19pbnB1dCk7CisKKwkvKiBDb21wdXRlIGludGVycnVwdCBzY2hlZHVsaW5nIHBhcmFtZXRlcnMganVzdCBvbmNlLCBhbmQgc2F2ZS4KKwkgKiAtIGFsbG93aW5nIGZvciBoaWdoIGJhbmR3aWR0aCwgaG93IG1hbnkgbnNlYy91ZnJhbWUgYXJlIHVzZWQ/CisJICogLSBzcGxpdCB0cmFuc2FjdGlvbnMgbmVlZCBhIHNlY29uZCBDU1BMSVQgdWZyYW1lOyBzYW1lIHF1ZXN0aW9uCisJICogLSBzcGxpdHMgYWxzbyBuZWVkIGEgc2NoZWR1bGUgZ2FwIChmb3IgZnVsbC9sb3cgc3BlZWQgSS9PKQorCSAqIC0gcWggaGFzIGEgcG9sbGluZyBpbnRlcnZhbAorCSAqCisJICogRm9yIGNvbnRyb2wvYnVsayByZXF1ZXN0cywgdGhlIEhDIG9yIFRUIGhhbmRsZXMgdGhlc2UuCisJICovCisJaWYgKHR5cGUgPT0gUElQRV9JTlRFUlJVUFQpIHsKKwkJcWgtPnVzZWNzID0gTlNfVE9fVVModXNiX2NhbGNfYnVzX3RpbWUoVVNCX1NQRUVEX0hJR0gsCisJCQkJCQkJCWlzX2lucHV0LCAwLAorCQkJCWhiX211bHQobWF4cCkgKiBtYXhfcGFja2V0KG1heHApKSk7CisJCXFoLT5zdGFydCA9IE5PX0ZSQU1FOworCisJCWlmICh1cmItPmRldi0+c3BlZWQgPT0gVVNCX1NQRUVEX0hJR0gpIHsKKwkJCXFoLT5jX3VzZWNzID0gMDsKKwkJCXFoLT5nYXBfdWYgPSAwOworCisJCQlxaC0+cGVyaW9kID0gdXJiLT5pbnRlcnZhbCA+PiAzOworCQkJaWYgKHFoLT5wZXJpb2QgPT0gMCAmJiB1cmItPmludGVydmFsICE9IDEpIHsKKwkJCQkvKiBOT1RFIGludGVydmFsIDIgb3IgNCB1ZnJhbWVzIGNvdWxkIHdvcmsuCisJCQkJICogQnV0IGludGVydmFsIDEgc2NoZWR1bGluZyBpcyBzaW1wbGVyLCBhbmQKKwkJCQkgKiBpbmNsdWRlcyBoaWdoIGJhbmR3aWR0aC4KKwkJCQkgKi8KKwkJCQlkYmcoImludHIgcGVyaW9kICVkIHVmcmFtZXMsIE5ZRVQhIiwKKwkJCQkJCXVyYi0+aW50ZXJ2YWwpOworCQkJCWdvdG8gZG9uZTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXN0cnVjdCB1c2JfdHQJKnR0ID0gdXJiLT5kZXYtPnR0OworCQkJaW50CQl0aGlua190aW1lOworCisJCQkvKiBnYXAgaXMgZihGUy9MUyB0cmFuc2ZlciB0aW1lcykgKi8KKwkJCXFoLT5nYXBfdWYgPSAxICsgdXNiX2NhbGNfYnVzX3RpbWUodXJiLT5kZXYtPnNwZWVkLAorCQkJCQlpc19pbnB1dCwgMCwgbWF4cCkgLyAoMTI1ICogMTAwMCk7CisKKwkJCS8qIEZJWE1FIHRoaXMganVzdCBhcHByb3hpbWF0ZXMgU1BMSVQvQ1NQTElUIHRpbWVzICovCisJCQlpZiAoaXNfaW5wdXQpIHsJCS8qIFNQTElULCBnYXAsIENTUExJVCtEQVRBICovCisJCQkJcWgtPmNfdXNlY3MgPSBxaC0+dXNlY3MgKyBIU19VU0VDUygwKTsKKwkJCQlxaC0+dXNlY3MgPSBIU19VU0VDUygxKTsKKwkJCX0gZWxzZSB7CQkvKiBTUExJVCtEQVRBLCBnYXAsIENTUExJVCAqLworCQkJCXFoLT51c2VjcyArPSBIU19VU0VDUygxKTsKKwkJCQlxaC0+Y191c2VjcyA9IEhTX1VTRUNTKDApOworCQkJfQorCisJCQl0aGlua190aW1lID0gdHQgPyB0dC0+dGhpbmtfdGltZSA6IDA7CisJCQlxaC0+dHRfdXNlY3MgPSBOU19UT19VUyh0aGlua190aW1lICsKKwkJCQkJdXNiX2NhbGNfYnVzX3RpbWUodXJiLT5kZXYtPnNwZWVkLAorCQkJCQlpc19pbnB1dCwgMCwgbWF4X3BhY2tldChtYXhwKSkpOworCQkJcWgtPnBlcmlvZCA9IHVyYi0+aW50ZXJ2YWw7CisJCX0KKwl9CisKKwkvKiBzdXBwb3J0IGZvciB0dCBzY2hlZHVsaW5nLCBhbmQgYWNjZXNzIHRvIHRvZ2dsZXMgKi8KKwlxaC0+ZGV2ID0gdXJiLT5kZXY7CisKKwkvKiB1c2luZyBUVD8gKi8KKwlzd2l0Y2ggKHVyYi0+ZGV2LT5zcGVlZCkgeworCWNhc2UgVVNCX1NQRUVEX0xPVzoKKwkJaW5mbzEgfD0gKDEgPDwgMTIpOwkvKiBFUFMgImxvdyIgKi8KKwkJLyogRkFMTCBUSFJPVUdIICovCisKKwljYXNlIFVTQl9TUEVFRF9GVUxMOgorCQkvKiBFUFMgMCBtZWFucyAiZnVsbCIgKi8KKwkJaWYgKHR5cGUgIT0gUElQRV9JTlRFUlJVUFQpCisJCQlpbmZvMSB8PSAoRUhDSV9UVU5FX1JMX1RUIDw8IDI4KTsKKwkJaWYgKHR5cGUgPT0gUElQRV9DT05UUk9MKSB7CisJCQlpbmZvMSB8PSAoMSA8PCAyNyk7CS8qIGZvciBUVCAqLworCQkJaW5mbzEgfD0gMSA8PCAxNDsJLyogdG9nZ2xlIGZyb20gcXRkICovCisJCX0KKwkJaW5mbzEgfD0gbWF4cCA8PCAxNjsKKworCQlpbmZvMiB8PSAoRUhDSV9UVU5FX01VTFRfVFQgPDwgMzApOworCQlpbmZvMiB8PSB1cmItPmRldi0+dHRwb3J0IDw8IDIzOworCisJCS8qIE5PVEU6ICBpZiAoUElQRV9JTlRFUlJVUFQpIHsgc2NoZWR1bGVyIHNldHMgYy1tYXNrIH0gKi8KKworCQlicmVhazsKKworCWNhc2UgVVNCX1NQRUVEX0hJR0g6CQkvKiBubyBUVCBpbnZvbHZlZCAqLworCQlpbmZvMSB8PSAoMiA8PCAxMik7CS8qIEVQUyAiaGlnaCIgKi8KKwkJaWYgKHR5cGUgPT0gUElQRV9DT05UUk9MKSB7CisJCQlpbmZvMSB8PSAoRUhDSV9UVU5FX1JMX0hTIDw8IDI4KTsKKwkJCWluZm8xIHw9IDY0IDw8IDE2OwkvKiB1c2IyIGZpeGVkIG1heHBhY2tldCAqLworCQkJaW5mbzEgfD0gMSA8PCAxNDsJLyogdG9nZ2xlIGZyb20gcXRkICovCisJCQlpbmZvMiB8PSAoRUhDSV9UVU5FX01VTFRfSFMgPDwgMzApOworCQl9IGVsc2UgaWYgKHR5cGUgPT0gUElQRV9CVUxLKSB7CisJCQlpbmZvMSB8PSAoRUhDSV9UVU5FX1JMX0hTIDw8IDI4KTsKKwkJCWluZm8xIHw9IDUxMiA8PCAxNjsJLyogdXNiMiBmaXhlZCBtYXhwYWNrZXQgKi8KKwkJCWluZm8yIHw9IChFSENJX1RVTkVfTVVMVF9IUyA8PCAzMCk7CisJCX0gZWxzZSB7CQkvKiBQSVBFX0lOVEVSUlVQVCAqLworCQkJaW5mbzEgfD0gbWF4X3BhY2tldChtYXhwKSA8PCAxNjsKKwkJCWluZm8yIHw9IGhiX211bHQobWF4cCkgPDwgMzA7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGJnKCJib2d1cyBkZXYgJXAgc3BlZWQgJWQiLCB1cmItPmRldiwgdXJiLT5kZXYtPnNwZWVkKTsKK2RvbmU6CisJCXFoX3B1dChxaCk7CisJCXJldHVybiBOVUxMOworCX0KKworCS8qIE5PVEU6ICBpZiAoUElQRV9JTlRFUlJVUFQpIHsgc2NoZWR1bGVyIHNldHMgcy1tYXNrIH0gKi8KKworCS8qIGluaXQgYXMgbGl2ZSwgdG9nZ2xlIGNsZWFyLCBhZHZhbmNlIHRvIGR1bW15ICovCisJcWgtPnFoX3N0YXRlID0gUUhfU1RBVEVfSURMRTsKKwlxaC0+aHdfaW5mbzEgPSBjcHVfdG9fbGUzMihpbmZvMSk7CisJcWgtPmh3X2luZm8yID0gY3B1X3RvX2xlMzIoaW5mbzIpOworCXVzYl9zZXR0b2dnbGUodXJiLT5kZXYsIHVzYl9waXBlZW5kcG9pbnQodXJiLT5waXBlKSwgIWlzX2lucHV0LCAxKTsKKwlxaF9yZWZyZXNoKG94dSwgcWgpOworCXJldHVybiBxaDsKK30KKworLyogTW92ZSBxaCAoYW5kIGl0cyBxdGRzKSBvbnRvIGFzeW5jIHF1ZXVlOyBtYXliZSBlbmFibGUgcXVldWUuCisgKi8KK3N0YXRpYyB2b2lkIHFoX2xpbmtfYXN5bmMoc3RydWN0IG94dV9oY2QgKm94dSwgc3RydWN0IGVoY2lfcWggKnFoKQoreworCV9fbGUzMiBkbWEgPSBRSF9ORVhUKHFoLT5xaF9kbWEpOworCXN0cnVjdCBlaGNpX3FoICpoZWFkOworCisJLyogKHJlKXN0YXJ0IHRoZSBhc3luYyBzY2hlZHVsZT8gKi8KKwloZWFkID0gb3h1LT5hc3luYzsKKwl0aW1lcl9hY3Rpb25fZG9uZShveHUsIFRJTUVSX0FTWU5DX09GRik7CisJaWYgKCFoZWFkLT5xaF9uZXh0LnFoKSB7CisJCXUzMgljbWQgPSByZWFkbCgmb3h1LT5yZWdzLT5jb21tYW5kKTsKKworCQlpZiAoIShjbWQgJiBDTURfQVNFKSkgeworCQkJLyogaW4gY2FzZSBhIGNsZWFyIG9mIENNRF9BU0UgZGlkbid0IHRha2UgeWV0ICovCisJCQkodm9pZCloYW5kc2hha2Uob3h1LCAmb3h1LT5yZWdzLT5zdGF0dXMsCisJCQkJCVNUU19BU1MsIDAsIDE1MCk7CisJCQljbWQgfD0gQ01EX0FTRSB8IENNRF9SVU47CisJCQl3cml0ZWwoY21kLCAmb3h1LT5yZWdzLT5jb21tYW5kKTsKKwkJCW94dV90b19oY2Qob3h1KS0+c3RhdGUgPSBIQ19TVEFURV9SVU5OSU5HOworCQkJLyogcG9zdGVkIHdyaXRlIG5lZWQgbm90IGJlIGtub3duIHRvIEhDIHlldCAuLi4gKi8KKwkJfQorCX0KKworCS8qIGNsZWFyIGhhbHQgYW5kL29yIHRvZ2dsZTsgYW5kIG1heWJlIHJlY292ZXIgZnJvbSBzaWxpY29uIHF1aXJrICovCisJaWYgKHFoLT5xaF9zdGF0ZSA9PSBRSF9TVEFURV9JRExFKQorCQlxaF9yZWZyZXNoKG94dSwgcWgpOworCisJLyogc3BsaWNlIHJpZ2h0IGFmdGVyIHN0YXJ0ICovCisJcWgtPnFoX25leHQgPSBoZWFkLT5xaF9uZXh0OworCXFoLT5od19uZXh0ID0gaGVhZC0+aHdfbmV4dDsKKwl3bWIoKTsKKworCWhlYWQtPnFoX25leHQucWggPSBxaDsKKwloZWFkLT5od19uZXh0ID0gZG1hOworCisJcWgtPnFoX3N0YXRlID0gUUhfU1RBVEVfTElOS0VEOworCS8qIHF0ZCBjb21wbGV0aW9ucyByZXBvcnRlZCBsYXRlciBieSBpbnRlcnJ1cHQgKi8KK30KKworI2RlZmluZQlRSF9BRERSX01BU0sJX19jb25zdGFudF9jcHVfdG9fbGUzMigweDdmKQorCisvKgorICogRm9yIGNvbnRyb2wvYnVsay9pbnRlcnJ1cHQsIHJldHVybiBRSCB3aXRoIHRoZXNlIFREcyBhcHBlbmRlZC4KKyAqIEFsbG9jYXRlcyBhbmQgaW5pdGlhbGl6ZXMgdGhlIFFIIGlmIG5lY2Vzc2FyeS4KKyAqIFJldHVybnMgbnVsbCBpZiBpdCBjYW4ndCBhbGxvY2F0ZSBhIFFIIGl0IG5lZWRzIHRvLgorICogSWYgdGhlIFFIIGhhcyBURHMgKHVyYnMpIGFscmVhZHksIHRoYXQncyBncmVhdC4KKyAqLworc3RhdGljIHN0cnVjdCBlaGNpX3FoICpxaF9hcHBlbmRfdGRzKHN0cnVjdCBveHVfaGNkICpveHUsCisJCQkJc3RydWN0IHVyYiAqdXJiLCBzdHJ1Y3QgbGlzdF9oZWFkICpxdGRfbGlzdCwKKwkJCQlpbnQgZXBudW0sIHZvaWQJKipwdHIpCit7CisJc3RydWN0IGVoY2lfcWggKnFoID0gTlVMTDsKKworCXFoID0gKHN0cnVjdCBlaGNpX3FoICopICpwdHI7CisJaWYgKHVubGlrZWx5KHFoID09IE5VTEwpKSB7CisJCS8qIGNhbid0IHNsZWVwIGhlcmUsIHdlIGhhdmUgb3h1LT5sb2NrLi4uICovCisJCXFoID0gcWhfbWFrZShveHUsIHVyYiwgR0ZQX0FUT01JQyk7CisJCSpwdHIgPSBxaDsKKwl9CisJaWYgKGxpa2VseShxaCAhPSBOVUxMKSkgeworCQlzdHJ1Y3QgZWhjaV9xdGQJKnF0ZDsKKworCQlpZiAodW5saWtlbHkobGlzdF9lbXB0eShxdGRfbGlzdCkpKQorCQkJcXRkID0gTlVMTDsKKwkJZWxzZQorCQkJcXRkID0gbGlzdF9lbnRyeShxdGRfbGlzdC0+bmV4dCwgc3RydWN0IGVoY2lfcXRkLAorCQkJCQlxdGRfbGlzdCk7CisKKwkJLyogY29udHJvbCBxaCBtYXkgbmVlZCBwYXRjaGluZyAuLi4gKi8KKwkJaWYgKHVubGlrZWx5KGVwbnVtID09IDApKSB7CisKKwkJCS8qIHVzYl9yZXNldF9kZXZpY2UoKSBicmllZmx5IHJldmVydHMgdG8gYWRkcmVzcyAwICovCisJCQlpZiAodXNiX3BpcGVkZXZpY2UodXJiLT5waXBlKSA9PSAwKQorCQkJCXFoLT5od19pbmZvMSAmPSB+UUhfQUREUl9NQVNLOworCQl9CisKKwkJLyoganVzdCBvbmUgd2F5IHRvIHF1ZXVlIHJlcXVlc3RzOiBzd2FwIHdpdGggdGhlIGR1bW15IHF0ZC4KKwkJICogb25seSBoYyBvciBxaF9yZWZyZXNoKCkgZXZlciBtb2RpZnkgdGhlIG92ZXJsYXkuCisJCSAqLworCQlpZiAobGlrZWx5KHF0ZCAhPSBOVUxMKSkgeworCQkJc3RydWN0IGVoY2lfcXRkCSpkdW1teTsKKwkJCWRtYV9hZGRyX3QgZG1hOworCQkJX19sZTMyIHRva2VuOworCisJCQkvKiB0byBhdm9pZCByYWNpbmcgdGhlIEhDLCB1c2UgdGhlIGR1bW15IHRkIGluc3RlYWQgb2YKKwkJCSAqIHRoZSBmaXJzdCB0ZCBvZiBvdXIgbGlzdCAoYmVjb21lcyBuZXcgZHVtbXkpLiAgYm90aAorCQkJICogdGRzIHN0YXkgZGVhY3RpdmF0ZWQgdW50aWwgd2UncmUgZG9uZSwgd2hlbiB0aGUKKwkJCSAqIEhDIGlzIGFsbG93ZWQgdG8gZmV0Y2ggdGhlIG9sZCBkdW1teSAoNC4xMC4yKS4KKwkJCSAqLworCQkJdG9rZW4gPSBxdGQtPmh3X3Rva2VuOworCQkJcXRkLT5od190b2tlbiA9IEhBTFRfQklUOworCQkJd21iKCk7CisJCQlkdW1teSA9IHFoLT5kdW1teTsKKworCQkJZG1hID0gZHVtbXktPnF0ZF9kbWE7CisJCQkqZHVtbXkgPSAqcXRkOworCQkJZHVtbXktPnF0ZF9kbWEgPSBkbWE7CisKKwkJCWxpc3RfZGVsKCZxdGQtPnF0ZF9saXN0KTsKKwkJCWxpc3RfYWRkKCZkdW1teS0+cXRkX2xpc3QsIHF0ZF9saXN0KTsKKwkJCWxpc3Rfc3BsaWNlKHF0ZF9saXN0LCBxaC0+cXRkX2xpc3QucHJldik7CisKKwkJCWVoY2lfcXRkX2luaXQocXRkLCBxdGQtPnF0ZF9kbWEpOworCQkJcWgtPmR1bW15ID0gcXRkOworCisJCQkvKiBoYyBtdXN0IHNlZSB0aGUgbmV3IGR1bW15IGF0IGxpc3QgZW5kICovCisJCQlkbWEgPSBxdGQtPnF0ZF9kbWE7CisJCQlxdGQgPSBsaXN0X2VudHJ5KHFoLT5xdGRfbGlzdC5wcmV2LAorCQkJCQlzdHJ1Y3QgZWhjaV9xdGQsIHF0ZF9saXN0KTsKKwkJCXF0ZC0+aHdfbmV4dCA9IFFURF9ORVhUKGRtYSk7CisKKwkJCS8qIGxldCB0aGUgaGMgcHJvY2VzcyB0aGVzZSBuZXh0IHF0ZHMgKi8KKwkJCWR1bW15LT5od190b2tlbiA9ICh0b2tlbiAmIH4oMHg4MCkpOworCQkJd21iKCk7CisJCQlkdW1teS0+aHdfdG9rZW4gPSB0b2tlbjsKKworCQkJdXJiLT5oY3ByaXYgPSBxaF9nZXQocWgpOworCQl9CisJfQorCXJldHVybiBxaDsKK30KKworc3RhdGljIGludCBzdWJtaXRfYXN5bmMoc3RydWN0IG94dV9oY2QJKm94dSwgc3RydWN0IHVyYiAqdXJiLAorCQkJc3RydWN0IGxpc3RfaGVhZCAqcXRkX2xpc3QsIGdmcF90IG1lbV9mbGFncykKK3sKKwlzdHJ1Y3QgZWhjaV9xdGQJKnF0ZDsKKwlpbnQgZXBudW07CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgZWhjaV9xaCAqcWggPSBOVUxMOworCWludCByYyA9IDA7CisKKwlxdGQgPSBsaXN0X2VudHJ5KHF0ZF9saXN0LT5uZXh0LCBzdHJ1Y3QgZWhjaV9xdGQsIHF0ZF9saXN0KTsKKwllcG51bSA9IHVyYi0+ZXAtPmRlc2MuYkVuZHBvaW50QWRkcmVzczsKKworI2lmZGVmIE9YVV9VUkJfVFJBQ0UKKwlveHVfZGJnKG94dSwgIiVzICVzIHVyYiAlcCBlcCVkJXMgbGVuICVkLCBxdGQgJXAgW3FoICVwXVxuIiwKKwkJX19mdW5jX18sIHVyYi0+ZGV2LT5kZXZwYXRoLCB1cmIsCisJCWVwbnVtICYgMHgwZiwgKGVwbnVtICYgVVNCX0RJUl9JTikgPyAiaW4iIDogIm91dCIsCisJCXVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCwKKwkJcXRkLCB1cmItPmVwLT5oY3ByaXYpOworI2VuZGlmCisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmb3h1LT5sb2NrLCBmbGFncyk7CisJaWYgKHVubGlrZWx5KCF0ZXN0X2JpdChIQ0RfRkxBR19IV19BQ0NFU1NJQkxFLAorCQkJICAgICAgICZveHVfdG9faGNkKG94dSktPmZsYWdzKSkpIHsKKwkJcmMgPSAtRVNIVVRET1dOOworCQlnb3RvIGRvbmU7CisJfQorCisJcWggPSBxaF9hcHBlbmRfdGRzKG94dSwgdXJiLCBxdGRfbGlzdCwgZXBudW0sICZ1cmItPmVwLT5oY3ByaXYpOworCWlmICh1bmxpa2VseShxaCA9PSBOVUxMKSkgeworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gZG9uZTsKKwl9CisKKwkvKiBDb250cm9sL2J1bGsgb3BlcmF0aW9ucyB0aHJvdWdoIFRUcyBkb24ndCBuZWVkIHNjaGVkdWxpbmcsCisJICogdGhlIEhDIGFuZCBUVCBoYW5kbGUgaXQgd2hlbiB0aGUgVFQgaGFzIGEgYnVmZmVyIHJlYWR5LgorCSAqLworCWlmIChsaWtlbHkocWgtPnFoX3N0YXRlID09IFFIX1NUQVRFX0lETEUpKQorCQlxaF9saW5rX2FzeW5jKG94dSwgcWhfZ2V0KHFoKSk7Citkb25lOgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm94dS0+bG9jaywgZmxhZ3MpOworCWlmICh1bmxpa2VseShxaCA9PSBOVUxMKSkKKwkJcXRkX2xpc3RfZnJlZShveHUsIHVyYiwgcXRkX2xpc3QpOworCXJldHVybiByYzsKK30KKworLyogVGhlIGFzeW5jIHFoIGZvciB0aGUgcXRkcyBiZWluZyByZWNsYWltZWQgYXJlIG5vdyB1bmxpbmtlZCBmcm9tIHRoZSBIQyAqLworCitzdGF0aWMgdm9pZCBlbmRfdW5saW5rX2FzeW5jKHN0cnVjdCBveHVfaGNkICpveHUpCit7CisJc3RydWN0IGVoY2lfcWggKnFoID0gb3h1LT5yZWNsYWltOworCXN0cnVjdCBlaGNpX3FoICpuZXh0OworCisJdGltZXJfYWN0aW9uX2RvbmUob3h1LCBUSU1FUl9JQUFfV0FUQ0hET0cpOworCisJcWgtPnFoX3N0YXRlID0gUUhfU1RBVEVfSURMRTsKKwlxaC0+cWhfbmV4dC5xaCA9IE5VTEw7CisJcWhfcHV0KHFoKTsJCQkvKiByZWZjb3VudCBmcm9tIHJlY2xhaW0gKi8KKworCS8qIG90aGVyIHVubGluayhzKSBtYXkgYmUgcGVuZGluZyAoaW4gUUhfU1RBVEVfVU5MSU5LX1dBSVQpICovCisJbmV4dCA9IHFoLT5yZWNsYWltOworCW94dS0+cmVjbGFpbSA9IG5leHQ7CisJb3h1LT5yZWNsYWltX3JlYWR5ID0gMDsKKwlxaC0+cmVjbGFpbSA9IE5VTEw7CisKKwlxaF9jb21wbGV0aW9ucyhveHUsIHFoKTsKKworCWlmICghbGlzdF9lbXB0eSgmcWgtPnF0ZF9saXN0KQorCQkJJiYgSENfSVNfUlVOTklORyhveHVfdG9faGNkKG94dSktPnN0YXRlKSkKKwkJcWhfbGlua19hc3luYyhveHUsIHFoKTsKKwllbHNlIHsKKwkJcWhfcHV0KHFoKTsJCS8qIHJlZmNvdW50IGZyb20gYXN5bmMgbGlzdCAqLworCisJCS8qIGl0J3Mgbm90IGZyZWUgdG8gdHVybiB0aGUgYXN5bmMgc2NoZWR1bGUgb24vb2ZmOyBsZWF2ZSBpdAorCQkgKiBhY3RpdmUgYnV0IGlkbGUgZm9yIGEgd2hpbGUgb25jZSBpdCBlbXB0aWVzLgorCQkgKi8KKwkJaWYgKEhDX0lTX1JVTk5JTkcob3h1X3RvX2hjZChveHUpLT5zdGF0ZSkKKwkJCQkmJiBveHUtPmFzeW5jLT5xaF9uZXh0LnFoID09IE5VTEwpCisJCQl0aW1lcl9hY3Rpb24ob3h1LCBUSU1FUl9BU1lOQ19PRkYpOworCX0KKworCWlmIChuZXh0KSB7CisJCW94dS0+cmVjbGFpbSA9IE5VTEw7CisJCXN0YXJ0X3VubGlua19hc3luYyhveHUsIG5leHQpOworCX0KK30KKworLyogbWFrZXMgc3VyZSB0aGUgYXN5bmMgcWggd2lsbCBiZWNvbWUgaWRsZSAqLworLyogY2FsbGVyIG11c3Qgb3duIG94dS0+bG9jayAqLworCitzdGF0aWMgdm9pZCBzdGFydF91bmxpbmtfYXN5bmMoc3RydWN0IG94dV9oY2QgKm94dSwgc3RydWN0IGVoY2lfcWggKnFoKQoreworCWludCBjbWQgPSByZWFkbCgmb3h1LT5yZWdzLT5jb21tYW5kKTsKKwlzdHJ1Y3QgZWhjaV9xaCAqcHJldjsKKworI2lmZGVmIERFQlVHCisJYXNzZXJ0X3NwaW5fbG9ja2VkKCZveHUtPmxvY2spOworCWlmIChveHUtPnJlY2xhaW0gfHwgKHFoLT5xaF9zdGF0ZSAhPSBRSF9TVEFURV9MSU5LRUQKKwkJCQkmJiBxaC0+cWhfc3RhdGUgIT0gUUhfU1RBVEVfVU5MSU5LX1dBSVQpKQorCQlCVUcoKTsKKyNlbmRpZgorCisJLyogc3RvcCBhc3luYyBzY2hlZHVsZSByaWdodCBub3c/ICovCisJaWYgKHVubGlrZWx5KHFoID09IG94dS0+YXN5bmMpKSB7CisJCS8qIGNhbid0IGdldCBoZXJlIHdpdGhvdXQgU1RTX0FTUyBzZXQgKi8KKwkJaWYgKG94dV90b19oY2Qob3h1KS0+c3RhdGUgIT0gSENfU1RBVEVfSEFMVAorCQkJCSYmICFveHUtPnJlY2xhaW0pIHsKKwkJCS8qIC4uLiBhbmQgQ01EX0lBQUQgY2xlYXIgKi8KKwkJCXdyaXRlbChjbWQgJiB+Q01EX0FTRSwgJm94dS0+cmVncy0+Y29tbWFuZCk7CisJCQl3bWIoKTsKKwkJCS8qIGhhbmRzaGFrZSBsYXRlciwgaWYgd2UgbmVlZCB0byAqLworCQkJdGltZXJfYWN0aW9uX2RvbmUob3h1LCBUSU1FUl9BU1lOQ19PRkYpOworCQl9CisJCXJldHVybjsKKwl9CisKKwlxaC0+cWhfc3RhdGUgPSBRSF9TVEFURV9VTkxJTks7CisJb3h1LT5yZWNsYWltID0gcWggPSBxaF9nZXQocWgpOworCisJcHJldiA9IG94dS0+YXN5bmM7CisJd2hpbGUgKHByZXYtPnFoX25leHQucWggIT0gcWgpCisJCXByZXYgPSBwcmV2LT5xaF9uZXh0LnFoOworCisJcHJldi0+aHdfbmV4dCA9IHFoLT5od19uZXh0OworCXByZXYtPnFoX25leHQgPSBxaC0+cWhfbmV4dDsKKwl3bWIoKTsKKworCWlmICh1bmxpa2VseShveHVfdG9faGNkKG94dSktPnN0YXRlID09IEhDX1NUQVRFX0hBTFQpKSB7CisJCS8qIGlmICh1bmxpa2VseShxaC0+cmVjbGFpbSAhPSAwKSkKKwkJICoJdGhpcyB3aWxsIHJlY3Vyc2UsIHByb2JhYmx5IG5vdCBtdWNoCisJCSAqLworCQllbmRfdW5saW5rX2FzeW5jKG94dSk7CisJCXJldHVybjsKKwl9CisKKwlveHUtPnJlY2xhaW1fcmVhZHkgPSAwOworCWNtZCB8PSBDTURfSUFBRDsKKwl3cml0ZWwoY21kLCAmb3h1LT5yZWdzLT5jb21tYW5kKTsKKwkodm9pZCkgcmVhZGwoJm94dS0+cmVncy0+Y29tbWFuZCk7CisJdGltZXJfYWN0aW9uKG94dSwgVElNRVJfSUFBX1dBVENIRE9HKTsKK30KKworc3RhdGljIHZvaWQgc2Nhbl9hc3luYyhzdHJ1Y3Qgb3h1X2hjZCAqb3h1KQoreworCXN0cnVjdCBlaGNpX3FoICpxaDsKKwllbnVtIGVoY2lfdGltZXJfYWN0aW9uIGFjdGlvbiA9IFRJTUVSX0lPX1dBVENIRE9HOworCisJaWYgKCErKyhveHUtPnN0YW1wKSkKKwkJb3h1LT5zdGFtcCsrOworCXRpbWVyX2FjdGlvbl9kb25lKG94dSwgVElNRVJfQVNZTkNfU0hSSU5LKTsKK3Jlc2NhbjoKKwlxaCA9IG94dS0+YXN5bmMtPnFoX25leHQucWg7CisJaWYgKGxpa2VseShxaCAhPSBOVUxMKSkgeworCQlkbyB7CisJCQkvKiBjbGVhbiBhbnkgZmluaXNoZWQgd29yayBmb3IgdGhpcyBxaCAqLworCQkJaWYgKCFsaXN0X2VtcHR5KCZxaC0+cXRkX2xpc3QpCisJCQkJCSYmIHFoLT5zdGFtcCAhPSBveHUtPnN0YW1wKSB7CisJCQkJaW50IHRlbXA7CisKKwkJCQkvKiB1bmxpbmtzIGNvdWxkIGhhcHBlbiBoZXJlOyBjb21wbGV0aW9uCisJCQkJICogcmVwb3J0aW5nIGRyb3BzIHRoZSBsb2NrLiAgcmVzY2FuIHVzaW5nCisJCQkJICogdGhlIGxhdGVzdCBzY2hlZHVsZSwgYnV0IGRvbid0IHJlc2NhbgorCQkJCSAqIHFocyB3ZSBhbHJlYWR5IGZpbmlzaGVkIChubyBsb29waW5nKS4KKwkJCQkgKi8KKwkJCQlxaCA9IHFoX2dldChxaCk7CisJCQkJcWgtPnN0YW1wID0gb3h1LT5zdGFtcDsKKwkJCQl0ZW1wID0gcWhfY29tcGxldGlvbnMob3h1LCBxaCk7CisJCQkJcWhfcHV0KHFoKTsKKwkJCQlpZiAodGVtcCAhPSAwKQorCQkJCQlnb3RvIHJlc2NhbjsKKwkJCX0KKworCQkJLyogdW5saW5rIGlkbGUgZW50cmllcywgcmVkdWNpbmcgSEMgUENJIHVzYWdlIGFzIHdlbGwKKwkJCSAqIGFzIEhDRCBzY2hlZHVsZS1zY2FubmluZyBjb3N0cy4gIGRlbGF5IGZvciBhbnkgcWgKKwkJCSAqIHdlIGp1c3Qgc2Nhbm5lZCwgdGhlcmUncyBhIG5vdC11bnVzdWFsIGNhc2UgdGhhdCBpdAorCQkJICogZG9lc24ndCBzdGF5IGlkbGUgZm9yIGxvbmcuCisJCQkgKiAocGx1cywgYXZvaWRzIHNvbWUga2luZCBvZiByZS1hY3RpdmF0aW9uIHJhY2UuKQorCQkJICovCisJCQlpZiAobGlzdF9lbXB0eSgmcWgtPnF0ZF9saXN0KSkgeworCQkJCWlmIChxaC0+c3RhbXAgPT0gb3h1LT5zdGFtcCkKKwkJCQkJYWN0aW9uID0gVElNRVJfQVNZTkNfU0hSSU5LOworCQkJCWVsc2UgaWYgKCFveHUtPnJlY2xhaW0KKwkJCQkJICAgICYmIHFoLT5xaF9zdGF0ZSA9PSBRSF9TVEFURV9MSU5LRUQpCisJCQkJCXN0YXJ0X3VubGlua19hc3luYyhveHUsIHFoKTsKKwkJCX0KKworCQkJcWggPSBxaC0+cWhfbmV4dC5xaDsKKwkJfSB3aGlsZSAocWgpOworCX0KKwlpZiAoYWN0aW9uID09IFRJTUVSX0FTWU5DX1NIUklOSykKKwkJdGltZXJfYWN0aW9uKG94dSwgVElNRVJfQVNZTkNfU0hSSU5LKTsKK30KKworLyoKKyAqIHBlcmlvZGljX25leHRfc2hhZG93IC0gcmV0dXJuICJuZXh0IiBwb2ludGVyIG9uIHNoYWRvdyBsaXN0CisgKiBAcGVyaW9kaWM6IGhvc3QgcG9pbnRlciB0byBxaC9pdGQvc2l0ZAorICogQHRhZzogaGFyZHdhcmUgdGFnIGZvciB0eXBlIG9mIHRoaXMgcmVjb3JkCisgKi8KK3N0YXRpYyB1bmlvbiBlaGNpX3NoYWRvdyAqcGVyaW9kaWNfbmV4dF9zaGFkb3codW5pb24gZWhjaV9zaGFkb3cgKnBlcmlvZGljLAorCQkJCQkJX19sZTMyIHRhZykKK3sKKwlzd2l0Y2ggKHRhZykgeworCWRlZmF1bHQ6CisJY2FzZSBRX1RZUEVfUUg6CisJCXJldHVybiAmcGVyaW9kaWMtPnFoLT5xaF9uZXh0OworCX0KK30KKworLyogY2FsbGVyIG11c3QgaG9sZCBveHUtPmxvY2sgKi8KK3N0YXRpYyB2b2lkIHBlcmlvZGljX3VubGluayhzdHJ1Y3Qgb3h1X2hjZCAqb3h1LCB1bnNpZ25lZCBmcmFtZSwgdm9pZCAqcHRyKQoreworCXVuaW9uIGVoY2lfc2hhZG93ICpwcmV2X3AgPSAmb3h1LT5wc2hhZG93W2ZyYW1lXTsKKwlfX2xlMzIgKmh3X3AgPSAmb3h1LT5wZXJpb2RpY1tmcmFtZV07CisJdW5pb24gZWhjaV9zaGFkb3cgaGVyZSA9ICpwcmV2X3A7CisKKwkvKiBmaW5kIHByZWRlY2Vzc29yIG9mICJwdHIiOyBodyBhbmQgc2hhZG93IGxpc3RzIGFyZSBpbiBzeW5jICovCisJd2hpbGUgKGhlcmUucHRyICYmIGhlcmUucHRyICE9IHB0cikgeworCQlwcmV2X3AgPSBwZXJpb2RpY19uZXh0X3NoYWRvdyhwcmV2X3AsIFFfTkVYVF9UWVBFKCpod19wKSk7CisJCWh3X3AgPSBoZXJlLmh3X25leHQ7CisJCWhlcmUgPSAqcHJldl9wOworCX0KKwkvKiBhbiBpbnRlcnJ1cHQgZW50cnkgKGF0IGxpc3QgZW5kKSBjb3VsZCBoYXZlIGJlZW4gc2hhcmVkICovCisJaWYgKCFoZXJlLnB0cikKKwkJcmV0dXJuOworCisJLyogdXBkYXRlIHNoYWRvdyBhbmQgaGFyZHdhcmUgbGlzdHMgLi4uIHRoZSBvbGQgIm5leHQiIHBvaW50ZXJzCisJICogZnJvbSBwdHIgbWF5IHN0aWxsIGJlIGluIHVzZSwgdGhlIGNhbGxlciB1cGRhdGVzIHRoZW0uCisJICovCisJKnByZXZfcCA9ICpwZXJpb2RpY19uZXh0X3NoYWRvdygmaGVyZSwgUV9ORVhUX1RZUEUoKmh3X3ApKTsKKwkqaHdfcCA9ICpoZXJlLmh3X25leHQ7Cit9CisKKy8qIGhvdyBtYW55IG9mIHRoZSB1ZnJhbWUncyAxMjUgdXNlY3MgYXJlIGFsbG9jYXRlZD8gKi8KK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBwZXJpb2RpY191c2VjcyhzdHJ1Y3Qgb3h1X2hjZCAqb3h1LAorCQkJCQl1bnNpZ25lZCBmcmFtZSwgdW5zaWduZWQgdWZyYW1lKQoreworCV9fbGUzMiAqaHdfcCA9ICZveHUtPnBlcmlvZGljW2ZyYW1lXTsKKwl1bmlvbiBlaGNpX3NoYWRvdyAqcSA9ICZveHUtPnBzaGFkb3dbZnJhbWVdOworCXVuc2lnbmVkIHVzZWNzID0gMDsKKworCXdoaWxlIChxLT5wdHIpIHsKKwkJc3dpdGNoIChRX05FWFRfVFlQRSgqaHdfcCkpIHsKKwkJY2FzZSBRX1RZUEVfUUg6CisJCWRlZmF1bHQ6CisJCQkvKiBpcyBpdCBpbiB0aGUgUy1tYXNrPyAqLworCQkJaWYgKHEtPnFoLT5od19pbmZvMiAmIGNwdV90b19sZTMyKDEgPDwgdWZyYW1lKSkKKwkJCQl1c2VjcyArPSBxLT5xaC0+dXNlY3M7CisJCQkvKiAuLi4gb3IgQy1tYXNrPyAqLworCQkJaWYgKHEtPnFoLT5od19pbmZvMiAmIGNwdV90b19sZTMyKDEgPDwgKDggKyB1ZnJhbWUpKSkKKwkJCQl1c2VjcyArPSBxLT5xaC0+Y191c2VjczsKKwkJCWh3X3AgPSAmcS0+cWgtPmh3X25leHQ7CisJCQlxID0gJnEtPnFoLT5xaF9uZXh0OworCQkJYnJlYWs7CisJCX0KKwl9CisjaWZkZWYgREVCVUcKKwlpZiAodXNlY3MgPiAxMDApCisJCW94dV9lcnIob3h1LCAidWZyYW1lICVkIHNjaGVkIG92ZXJydW46ICVkIHVzZWNzXG4iLAorCQkJCQkJZnJhbWUgKiA4ICsgdWZyYW1lLCB1c2Vjcyk7CisjZW5kaWYKKwlyZXR1cm4gdXNlY3M7Cit9CisKK3N0YXRpYyBpbnQgZW5hYmxlX3BlcmlvZGljKHN0cnVjdCBveHVfaGNkICpveHUpCit7CisJdTMyIGNtZDsKKwlpbnQgc3RhdHVzOworCisJLyogZGlkIGNsZWFyaW5nIFBTRSBkaWQgdGFrZSBlZmZlY3QgeWV0PworCSAqIHRha2VzIGVmZmVjdCBvbmx5IGF0IGZyYW1lIGJvdW5kYXJpZXMuLi4KKwkgKi8KKwlzdGF0dXMgPSBoYW5kc2hha2Uob3h1LCAmb3h1LT5yZWdzLT5zdGF0dXMsIFNUU19QU1MsIDAsIDkgKiAxMjUpOworCWlmIChzdGF0dXMgIT0gMCkgeworCQlveHVfdG9faGNkKG94dSktPnN0YXRlID0gSENfU1RBVEVfSEFMVDsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisKKwljbWQgPSByZWFkbCgmb3h1LT5yZWdzLT5jb21tYW5kKSB8IENNRF9QU0U7CisJd3JpdGVsKGNtZCwgJm94dS0+cmVncy0+Y29tbWFuZCk7CisJLyogcG9zdGVkIHdyaXRlIC4uLiBQU1MgaGFwcGVucyBsYXRlciAqLworCW94dV90b19oY2Qob3h1KS0+c3RhdGUgPSBIQ19TVEFURV9SVU5OSU5HOworCisJLyogbWFrZSBzdXJlIGVoY2lfd29yayBzY2FucyB0aGVzZSAqLworCW94dS0+bmV4dF91ZnJhbWUgPSByZWFkbCgmb3h1LT5yZWdzLT5mcmFtZV9pbmRleCkKKwkJJSAob3h1LT5wZXJpb2RpY19zaXplIDw8IDMpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRpc2FibGVfcGVyaW9kaWMoc3RydWN0IG94dV9oY2QgKm94dSkKK3sKKwl1MzIgY21kOworCWludCBzdGF0dXM7CisKKwkvKiBkaWQgc2V0dGluZyBQU0Ugbm90IHRha2UgZWZmZWN0IHlldD8KKwkgKiB0YWtlcyBlZmZlY3Qgb25seSBhdCBmcmFtZSBib3VuZGFyaWVzLi4uCisJICovCisJc3RhdHVzID0gaGFuZHNoYWtlKG94dSwgJm94dS0+cmVncy0+c3RhdHVzLCBTVFNfUFNTLCBTVFNfUFNTLCA5ICogMTI1KTsKKwlpZiAoc3RhdHVzICE9IDApIHsKKwkJb3h1X3RvX2hjZChveHUpLT5zdGF0ZSA9IEhDX1NUQVRFX0hBTFQ7CisJCXJldHVybiBzdGF0dXM7CisJfQorCisJY21kID0gcmVhZGwoJm94dS0+cmVncy0+Y29tbWFuZCkgJiB+Q01EX1BTRTsKKwl3cml0ZWwoY21kLCAmb3h1LT5yZWdzLT5jb21tYW5kKTsKKwkvKiBwb3N0ZWQgd3JpdGUgLi4uICovCisKKwlveHUtPm5leHRfdWZyYW1lID0gLTE7CisJcmV0dXJuIDA7Cit9CisKKy8qIHBlcmlvZGljIHNjaGVkdWxlIHNsb3RzIGhhdmUgaXNvIHRkcyAobm9ybWFsIG9yIHNwbGl0KSBmaXJzdCwgdGhlbiBhCisgKiBzcGFyc2UgdHJlZSBmb3IgYWN0aXZlIGludGVycnVwdCB0cmFuc2ZlcnMuCisgKgorICogdGhpcyBqdXN0IGxpbmtzIGluIGEgcWg7IGNhbGxlciBndWFyYW50ZWVzIHVmcmFtZSBtYXNrcyBhcmUgc2V0IHJpZ2h0LgorICogbm8gRlNUTiBzdXBwb3J0ICh5ZXQ7IG94dSAwLjk2KykKKyAqLworc3RhdGljIGludCBxaF9saW5rX3BlcmlvZGljKHN0cnVjdCBveHVfaGNkICpveHUsIHN0cnVjdCBlaGNpX3FoICpxaCkKK3sKKwl1bnNpZ25lZCBpOworCXVuc2lnbmVkIHBlcmlvZCA9IHFoLT5wZXJpb2Q7CisKKwlkZXZfZGJnKCZxaC0+ZGV2LT5kZXYsCisJCSJsaW5rIHFoJWQtJTA0eC8lcCBzdGFydCAlZCBbJWQvJWQgdXNdXG4iLAorCQlwZXJpb2QsIGxlMzJfdG9fY3B1cCgmcWgtPmh3X2luZm8yKSAmIChRSF9DTUFTSyB8IFFIX1NNQVNLKSwKKwkJcWgsIHFoLT5zdGFydCwgcWgtPnVzZWNzLCBxaC0+Y191c2Vjcyk7CisKKwkvKiBoaWdoIGJhbmR3aWR0aCwgb3Igb3RoZXJ3aXNlIGV2ZXJ5IG1pY3JvZnJhbWUgKi8KKwlpZiAocGVyaW9kID09IDApCisJCXBlcmlvZCA9IDE7CisKKwlmb3IgKGkgPSBxaC0+c3RhcnQ7IGkgPCBveHUtPnBlcmlvZGljX3NpemU7IGkgKz0gcGVyaW9kKSB7CisJCXVuaW9uIGVoY2lfc2hhZG93CSpwcmV2ID0gJm94dS0+cHNoYWRvd1tpXTsKKwkJX19sZTMyCQkJKmh3X3AgPSAmb3h1LT5wZXJpb2RpY1tpXTsKKwkJdW5pb24gZWhjaV9zaGFkb3cJaGVyZSA9ICpwcmV2OworCQlfX2xlMzIJCQl0eXBlID0gMDsKKworCQkvKiBza2lwIHRoZSBpc28gbm9kZXMgYXQgbGlzdCBoZWFkICovCisJCXdoaWxlIChoZXJlLnB0cikgeworCQkJdHlwZSA9IFFfTkVYVF9UWVBFKCpod19wKTsKKwkJCWlmICh0eXBlID09IFFfVFlQRV9RSCkKKwkJCQlicmVhazsKKwkJCXByZXYgPSBwZXJpb2RpY19uZXh0X3NoYWRvdyhwcmV2LCB0eXBlKTsKKwkJCWh3X3AgPSAmaGVyZS5xaC0+aHdfbmV4dDsKKwkJCWhlcmUgPSAqcHJldjsKKwkJfQorCisJCS8qIHNvcnRpbmcgZWFjaCBicmFuY2ggYnkgcGVyaW9kIChzbG93LS0+ZmFzdCkKKwkJICogZW5hYmxlcyBzaGFyaW5nIGludGVyaW9yIHRyZWUgbm9kZXMKKwkJICovCisJCXdoaWxlIChoZXJlLnB0ciAmJiBxaCAhPSBoZXJlLnFoKSB7CisJCQlpZiAocWgtPnBlcmlvZCA+IGhlcmUucWgtPnBlcmlvZCkKKwkJCQlicmVhazsKKwkJCXByZXYgPSAmaGVyZS5xaC0+cWhfbmV4dDsKKwkJCWh3X3AgPSAmaGVyZS5xaC0+aHdfbmV4dDsKKwkJCWhlcmUgPSAqcHJldjsKKwkJfQorCQkvKiBsaW5rIGluIHRoaXMgcWgsIHVubGVzcyBzb21lIGVhcmxpZXIgcGFzcyBkaWQgdGhhdCAqLworCQlpZiAocWggIT0gaGVyZS5xaCkgeworCQkJcWgtPnFoX25leHQgPSBoZXJlOworCQkJaWYgKGhlcmUucWgpCisJCQkJcWgtPmh3X25leHQgPSAqaHdfcDsKKwkJCXdtYigpOworCQkJcHJldi0+cWggPSBxaDsKKwkJCSpod19wID0gUUhfTkVYVChxaC0+cWhfZG1hKTsKKwkJfQorCX0KKwlxaC0+cWhfc3RhdGUgPSBRSF9TVEFURV9MSU5LRUQ7CisJcWhfZ2V0KHFoKTsKKworCS8qIHVwZGF0ZSBwZXItcWggYmFuZHdpZHRoIGZvciB1c2JmcyAqLworCW94dV90b19oY2Qob3h1KS0+c2VsZi5iYW5kd2lkdGhfYWxsb2NhdGVkICs9IHFoLT5wZXJpb2QKKwkJPyAoKHFoLT51c2VjcyArIHFoLT5jX3VzZWNzKSAvIHFoLT5wZXJpb2QpCisJCTogKHFoLT51c2VjcyAqIDgpOworCisJLyogbWF5YmUgZW5hYmxlIHBlcmlvZGljIHNjaGVkdWxlIHByb2Nlc3NpbmcgKi8KKwlpZiAoIW94dS0+cGVyaW9kaWNfc2NoZWQrKykKKwkJcmV0dXJuIGVuYWJsZV9wZXJpb2RpYyhveHUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHFoX3VubGlua19wZXJpb2RpYyhzdHJ1Y3Qgb3h1X2hjZCAqb3h1LCBzdHJ1Y3QgZWhjaV9xaCAqcWgpCit7CisJdW5zaWduZWQgaTsKKwl1bnNpZ25lZCBwZXJpb2Q7CisKKwkvKiBGSVhNRToKKwkgKiAgIElGIHRoaXMgaXNuJ3QgaGlnaCBzcGVlZAorCSAqICAgYW5kIHRoaXMgcWggaXMgYWN0aXZlIGluIHRoZSBjdXJyZW50IHVmcmFtZQorCSAqICAgKGFuZCBvdmVybGF5IHRva2VuIFNwbGl0WHN0YXRlIGlzIGZhbHNlPykKKwkgKiBUSEVOCisJICogICBxaC0+aHdfaW5mbzEgfD0gX19jb25zdGFudF9jcHVfdG9fbGUzMigxIDw8IDcgImlnbm9yZSIpOworCSAqLworCisJLyogaGlnaCBiYW5kd2lkdGgsIG9yIG90aGVyd2lzZSBwYXJ0IG9mIGV2ZXJ5IG1pY3JvZnJhbWUgKi8KKwlwZXJpb2QgPSBxaC0+cGVyaW9kOworCWlmIChwZXJpb2QgPT0gMCkKKwkJcGVyaW9kID0gMTsKKworCWZvciAoaSA9IHFoLT5zdGFydDsgaSA8IG94dS0+cGVyaW9kaWNfc2l6ZTsgaSArPSBwZXJpb2QpCisJCXBlcmlvZGljX3VubGluayhveHUsIGksIHFoKTsKKworCS8qIHVwZGF0ZSBwZXItcWggYmFuZHdpZHRoIGZvciB1c2JmcyAqLworCW94dV90b19oY2Qob3h1KS0+c2VsZi5iYW5kd2lkdGhfYWxsb2NhdGVkIC09IHFoLT5wZXJpb2QKKwkJPyAoKHFoLT51c2VjcyArIHFoLT5jX3VzZWNzKSAvIHFoLT5wZXJpb2QpCisJCTogKHFoLT51c2VjcyAqIDgpOworCisJZGV2X2RiZygmcWgtPmRldi0+ZGV2LAorCQkidW5saW5rIHFoJWQtJTA0eC8lcCBzdGFydCAlZCBbJWQvJWQgdXNdXG4iLAorCQlxaC0+cGVyaW9kLAorCQlsZTMyX3RvX2NwdXAoJnFoLT5od19pbmZvMikgJiAoUUhfQ01BU0sgfCBRSF9TTUFTSyksCisJCXFoLCBxaC0+c3RhcnQsIHFoLT51c2VjcywgcWgtPmNfdXNlY3MpOworCisJLyogcWgtPnFoX25leHQgc3RpbGwgImxpdmUiIHRvIEhDICovCisJcWgtPnFoX3N0YXRlID0gUUhfU1RBVEVfVU5MSU5LOworCXFoLT5xaF9uZXh0LnB0ciA9IE5VTEw7CisJcWhfcHV0KHFoKTsKKworCS8qIG1heWJlIHR1cm4gb2ZmIHBlcmlvZGljIHNjaGVkdWxlICovCisJb3h1LT5wZXJpb2RpY19zY2hlZC0tOworCWlmICghb3h1LT5wZXJpb2RpY19zY2hlZCkKKwkJKHZvaWQpIGRpc2FibGVfcGVyaW9kaWMob3h1KTsKK30KKworc3RhdGljIHZvaWQgaW50cl9kZXNjaGVkdWxlKHN0cnVjdCBveHVfaGNkICpveHUsIHN0cnVjdCBlaGNpX3FoICpxaCkKK3sKKwl1bnNpZ25lZCB3YWl0OworCisJcWhfdW5saW5rX3BlcmlvZGljKG94dSwgcWgpOworCisJLyogc2ltcGxlL3BhcmFub2lkOiAgYWx3YXlzIGRlbGF5LCBleHBlY3RpbmcgdGhlIEhDIG5lZWRzIHRvIHJlYWQKKwkgKiBxaC0+aHdfbmV4dCBvciBmaW5pc2ggYSB3cml0ZWJhY2sgYWZ0ZXIgU1BMSVQvQ1NQTElUIC4uLiBhbmQKKwkgKiBleHBlY3Qga2h1YmQgdG8gY2xlYW4gdXAgYWZ0ZXIgYW55IENTUExJVHMgd2Ugd29uJ3QgaXNzdWUuCisJICogYWN0aXZlIGhpZ2ggc3BlZWQgcXVldWVzIG1heSBuZWVkIGJpZ2dlciBkZWxheXMuLi4KKwkgKi8KKwlpZiAobGlzdF9lbXB0eSgmcWgtPnF0ZF9saXN0KQorCQl8fCAoX19jb25zdGFudF9jcHVfdG9fbGUzMihRSF9DTUFTSykgJiBxaC0+aHdfaW5mbzIpICE9IDApCisJCXdhaXQgPSAyOworCWVsc2UKKwkJd2FpdCA9IDU1OwkvKiB3b3JzdCBjYXNlOiAzICogMTAyNCAqLworCisJdWRlbGF5KHdhaXQpOworCXFoLT5xaF9zdGF0ZSA9IFFIX1NUQVRFX0lETEU7CisJcWgtPmh3X25leHQgPSBFSENJX0xJU1RfRU5EOworCXdtYigpOworfQorCitzdGF0aWMgaW50IGNoZWNrX3BlcmlvZChzdHJ1Y3Qgb3h1X2hjZCAqb3h1LAorCQkJdW5zaWduZWQgZnJhbWUsIHVuc2lnbmVkIHVmcmFtZSwKKwkJCXVuc2lnbmVkIHBlcmlvZCwgdW5zaWduZWQgdXNlY3MpCit7CisJaW50IGNsYWltZWQ7CisKKwkvKiBjb21wbGV0ZSBzcGxpdCBydW5uaW5nIGludG8gbmV4dCBmcmFtZT8KKwkgKiBnaXZlbiBGU1ROIHN1cHBvcnQsIHdlIGNvdWxkIHNvbWV0aW1lcyBjaGVjay4uLgorCSAqLworCWlmICh1ZnJhbWUgPj0gOCkKKwkJcmV0dXJuIDA7CisKKwkvKgorCSAqIDgwJSBwZXJpb2RpYyA9PSAxMDAgdXNlYy91ZnJhbWUgYXZhaWxhYmxlCisJICogY29udmVydCAidXNlY3Mgd2UgbmVlZCIgdG8gIm1heCBhbHJlYWR5IGNsYWltZWQiCisJICovCisJdXNlY3MgPSAxMDAgLSB1c2VjczsKKworCS8qIHdlICJrbm93IiAyIGFuZCA0IHVmcmFtZSBpbnRlcnZhbHMgd2VyZSByZWplY3RlZDsgc28KKwkgKiBmb3IgcGVyaW9kIDAsIGNoZWNrIF9ldmVyeV8gbWljcm9mcmFtZSBpbiB0aGUgc2NoZWR1bGUuCisJICovCisJaWYgKHVubGlrZWx5KHBlcmlvZCA9PSAwKSkgeworCQlkbyB7CisJCQlmb3IgKHVmcmFtZSA9IDA7IHVmcmFtZSA8IDc7IHVmcmFtZSsrKSB7CisJCQkJY2xhaW1lZCA9IHBlcmlvZGljX3VzZWNzKG94dSwgZnJhbWUsIHVmcmFtZSk7CisJCQkJaWYgKGNsYWltZWQgPiB1c2VjcykKKwkJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0gd2hpbGUgKChmcmFtZSArPSAxKSA8IG94dS0+cGVyaW9kaWNfc2l6ZSk7CisKKwkvKiBqdXN0IGNoZWNrIHRoZSBzcGVjaWZpZWQgdWZyYW1lLCBhdCB0aGF0IHBlcmlvZCAqLworCX0gZWxzZSB7CisJCWRvIHsKKwkJCWNsYWltZWQgPSBwZXJpb2RpY191c2VjcyhveHUsIGZyYW1lLCB1ZnJhbWUpOworCQkJaWYgKGNsYWltZWQgPiB1c2VjcykKKwkJCQlyZXR1cm4gMDsKKwkJfSB3aGlsZSAoKGZyYW1lICs9IHBlcmlvZCkgPCBveHUtPnBlcmlvZGljX3NpemUpOworCX0KKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IGNoZWNrX2ludHJfc2NoZWR1bGUoc3RydWN0IG94dV9oY2QJKm94dSwKKwkJCQl1bnNpZ25lZCBmcmFtZSwgdW5zaWduZWQgdWZyYW1lLAorCQkJCWNvbnN0IHN0cnVjdCBlaGNpX3FoICpxaCwgX19sZTMyICpjX21hc2twKQoreworCWludCByZXR2YWwgPSAtRU5PU1BDOworCisJaWYgKHFoLT5jX3VzZWNzICYmIHVmcmFtZSA+PSA2KQkJLyogRlNUTiB0ZXJyaXRvcnk/ICovCisJCWdvdG8gZG9uZTsKKworCWlmICghY2hlY2tfcGVyaW9kKG94dSwgZnJhbWUsIHVmcmFtZSwgcWgtPnBlcmlvZCwgcWgtPnVzZWNzKSkKKwkJZ290byBkb25lOworCWlmICghcWgtPmNfdXNlY3MpIHsKKwkJcmV0dmFsID0gMDsKKwkJKmNfbWFza3AgPSAwOworCQlnb3RvIGRvbmU7CisJfQorCitkb25lOgorCXJldHVybiByZXR2YWw7Cit9CisKKy8qICJmaXJzdCBmaXQiIHNjaGVkdWxpbmcgcG9saWN5IHVzZWQgdGhlIGZpcnN0IHRpbWUgdGhyb3VnaCwKKyAqIG9yIHdoZW4gdGhlIHByZXZpb3VzIHNjaGVkdWxlIHNsb3QgY2FuJ3QgYmUgcmUtdXNlZC4KKyAqLworc3RhdGljIGludCBxaF9zY2hlZHVsZShzdHJ1Y3Qgb3h1X2hjZCAqb3h1LCBzdHJ1Y3QgZWhjaV9xaCAqcWgpCit7CisJaW50CQlzdGF0dXM7CisJdW5zaWduZWQJdWZyYW1lOworCV9fbGUzMgkJY19tYXNrOworCXVuc2lnbmVkCWZyYW1lOwkJLyogMC4uKHFoLT5wZXJpb2QgLSAxKSwgb3IgTk9fRlJBTUUgKi8KKworCXFoX3JlZnJlc2gob3h1LCBxaCk7CisJcWgtPmh3X25leHQgPSBFSENJX0xJU1RfRU5EOworCWZyYW1lID0gcWgtPnN0YXJ0OworCisJLyogcmV1c2UgdGhlIHByZXZpb3VzIHNjaGVkdWxlIHNsb3RzLCBpZiB3ZSBjYW4gKi8KKwlpZiAoZnJhbWUgPCBxaC0+cGVyaW9kKSB7CisJCXVmcmFtZSA9IGZmcyhsZTMyX3RvX2NwdXAoJnFoLT5od19pbmZvMikgJiBRSF9TTUFTSyk7CisJCXN0YXR1cyA9IGNoZWNrX2ludHJfc2NoZWR1bGUob3h1LCBmcmFtZSwgLS11ZnJhbWUsCisJCQkJcWgsICZjX21hc2spOworCX0gZWxzZSB7CisJCXVmcmFtZSA9IDA7CisJCWNfbWFzayA9IDA7CisJCXN0YXR1cyA9IC1FTk9TUEM7CisJfQorCisJLyogZWxzZSBzY2FuIHRoZSBzY2hlZHVsZSB0byBmaW5kIGEgZ3JvdXAgb2Ygc2xvdHMgc3VjaCB0aGF0IGFsbAorCSAqIHVmcmFtZXMgaGF2ZSBlbm91Z2ggcGVyaW9kaWMgYmFuZHdpZHRoIGF2YWlsYWJsZS4KKwkgKi8KKwlpZiAoc3RhdHVzKSB7CisJCS8qICJub3JtYWwiIGNhc2UsIHVmcmFtaW5nIGZsZXhpYmxlIGV4Y2VwdCB3aXRoIHNwbGl0cyAqLworCQlpZiAocWgtPnBlcmlvZCkgeworCQkJZnJhbWUgPSBxaC0+cGVyaW9kIC0gMTsKKwkJCWRvIHsKKwkJCQlmb3IgKHVmcmFtZSA9IDA7IHVmcmFtZSA8IDg7IHVmcmFtZSsrKSB7CisJCQkJCXN0YXR1cyA9IGNoZWNrX2ludHJfc2NoZWR1bGUob3h1LAorCQkJCQkJCWZyYW1lLCB1ZnJhbWUsIHFoLAorCQkJCQkJCSZjX21hc2spOworCQkJCQlpZiAoc3RhdHVzID09IDApCisJCQkJCQlicmVhazsKKwkJCQl9CisJCQl9IHdoaWxlIChzdGF0dXMgJiYgZnJhbWUtLSk7CisKKwkJLyogcWgtPnBlcmlvZCA9PSAwIG1lYW5zIGV2ZXJ5IHVmcmFtZSAqLworCQl9IGVsc2UgeworCQkJZnJhbWUgPSAwOworCQkJc3RhdHVzID0gY2hlY2tfaW50cl9zY2hlZHVsZShveHUsIDAsIDAsIHFoLCAmY19tYXNrKTsKKwkJfQorCQlpZiAoc3RhdHVzKQorCQkJZ290byBkb25lOworCQlxaC0+c3RhcnQgPSBmcmFtZTsKKworCQkvKiByZXNldCBTLWZyYW1lIGFuZCAobWF5YmUpIEMtZnJhbWUgbWFza3MgKi8KKwkJcWgtPmh3X2luZm8yICY9IF9fY29uc3RhbnRfY3B1X3RvX2xlMzIofihRSF9DTUFTSyB8IFFIX1NNQVNLKSk7CisJCXFoLT5od19pbmZvMiB8PSBxaC0+cGVyaW9kCisJCQk/IGNwdV90b19sZTMyKDEgPDwgdWZyYW1lKQorCQkJOiBfX2NvbnN0YW50X2NwdV90b19sZTMyKFFIX1NNQVNLKTsKKwkJcWgtPmh3X2luZm8yIHw9IGNfbWFzazsKKwl9IGVsc2UKKwkJb3h1X2RiZyhveHUsICJyZXVzZWQgcWggJXAgc2NoZWR1bGVcbiIsIHFoKTsKKworCS8qIHN0dWZmIGludG8gdGhlIHBlcmlvZGljIHNjaGVkdWxlICovCisJc3RhdHVzID0gcWhfbGlua19wZXJpb2RpYyhveHUsIHFoKTsKK2RvbmU6CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBpbnRyX3N1Ym1pdChzdHJ1Y3Qgb3h1X2hjZCAqb3h1LCBzdHJ1Y3QgdXJiICp1cmIsCisJCQlzdHJ1Y3QgbGlzdF9oZWFkICpxdGRfbGlzdCwgZ2ZwX3QgbWVtX2ZsYWdzKQoreworCXVuc2lnbmVkIGVwbnVtOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGVoY2lfcWggKnFoOworCWludCBzdGF0dXMgPSAwOworCXN0cnVjdCBsaXN0X2hlYWQJZW1wdHk7CisKKwkvKiBnZXQgZW5kcG9pbnQgYW5kIHRyYW5zZmVyL3NjaGVkdWxlIGRhdGEgKi8KKwllcG51bSA9IHVyYi0+ZXAtPmRlc2MuYkVuZHBvaW50QWRkcmVzczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZveHUtPmxvY2ssIGZsYWdzKTsKKworCWlmICh1bmxpa2VseSghdGVzdF9iaXQoSENEX0ZMQUdfSFdfQUNDRVNTSUJMRSwKKwkJCSAgICAgICAmb3h1X3RvX2hjZChveHUpLT5mbGFncykpKSB7CisJCXN0YXR1cyA9IC1FU0hVVERPV047CisJCWdvdG8gZG9uZTsKKwl9CisKKwkvKiBnZXQgcWggYW5kIGZvcmNlIGFueSBzY2hlZHVsaW5nIGVycm9ycyAqLworCUlOSVRfTElTVF9IRUFEKCZlbXB0eSk7CisJcWggPSBxaF9hcHBlbmRfdGRzKG94dSwgdXJiLCAmZW1wdHksIGVwbnVtLCAmdXJiLT5lcC0+aGNwcml2KTsKKwlpZiAocWggPT0gTlVMTCkgeworCQlzdGF0dXMgPSAtRU5PTUVNOworCQlnb3RvIGRvbmU7CisJfQorCWlmIChxaC0+cWhfc3RhdGUgPT0gUUhfU1RBVEVfSURMRSkgeworCQlzdGF0dXMgPSBxaF9zY2hlZHVsZShveHUsIHFoKTsKKwkJaWYgKHN0YXR1cyAhPSAwKQorCQkJZ290byBkb25lOworCX0KKworCS8qIHRoZW4gcXVldWUgdGhlIHVyYidzIHRkcyB0byB0aGUgcWggKi8KKwlxaCA9IHFoX2FwcGVuZF90ZHMob3h1LCB1cmIsIHF0ZF9saXN0LCBlcG51bSwgJnVyYi0+ZXAtPmhjcHJpdik7CisJQlVHX09OKHFoID09IE5VTEwpOworCisJLyogLi4uIHVwZGF0ZSB1c2JmcyBwZXJpb2RpYyBzdGF0cyAqLworCW94dV90b19oY2Qob3h1KS0+c2VsZi5iYW5kd2lkdGhfaW50X3JlcXMrKzsKKworZG9uZToKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZveHUtPmxvY2ssIGZsYWdzKTsKKwlpZiAoc3RhdHVzKQorCQlxdGRfbGlzdF9mcmVlKG94dSwgdXJiLCBxdGRfbGlzdCk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW5saW5lIGludCBpdGRfc3VibWl0KHN0cnVjdCBveHVfaGNkICpveHUsIHN0cnVjdCB1cmIgKnVyYiwKKwkJCQkJCWdmcF90IG1lbV9mbGFncykKK3sKKwlveHVfZGJnKG94dSwgImlzbyBzdXBwb3J0IGlzIG1pc3NpbmchXG4iKTsKKwlyZXR1cm4gLUVOT1NZUzsKK30KKworc3RhdGljIGlubGluZSBpbnQgc2l0ZF9zdWJtaXQoc3RydWN0IG94dV9oY2QgKm94dSwgc3RydWN0IHVyYiAqdXJiLAorCQkJCQkJZ2ZwX3QgbWVtX2ZsYWdzKQoreworCW94dV9kYmcob3h1LCAic3BsaXQgaXNvIHN1cHBvcnQgaXMgbWlzc2luZyFcbiIpOworCXJldHVybiAtRU5PU1lTOworfQorCitzdGF0aWMgdm9pZCBzY2FuX3BlcmlvZGljKHN0cnVjdCBveHVfaGNkICpveHUpCit7CisJdW5zaWduZWQgZnJhbWUsIGNsb2NrLCBub3dfdWZyYW1lLCBtb2Q7CisJdW5zaWduZWQgbW9kaWZpZWQ7CisKKwltb2QgPSBveHUtPnBlcmlvZGljX3NpemUgPDwgMzsKKworCS8qCisJICogV2hlbiBydW5uaW5nLCBzY2FuIGZyb20gbGFzdCBzY2FuIHBvaW50IHVwIHRvICJub3ciCisJICogZWxzZSBjbGVhbiB1cCBieSBzY2FubmluZyBldmVyeXRoaW5nIHRoYXQncyBsZWZ0LgorCSAqIFRvdWNoZXMgYXMgZmV3IHBhZ2VzIGFzIHBvc3NpYmxlOiAgY2FjaGUtZnJpZW5kbHkuCisJICovCisJbm93X3VmcmFtZSA9IG94dS0+bmV4dF91ZnJhbWU7CisJaWYgKEhDX0lTX1JVTk5JTkcob3h1X3RvX2hjZChveHUpLT5zdGF0ZSkpCisJCWNsb2NrID0gcmVhZGwoJm94dS0+cmVncy0+ZnJhbWVfaW5kZXgpOworCWVsc2UKKwkJY2xvY2sgPSBub3dfdWZyYW1lICsgbW9kIC0gMTsKKwljbG9jayAlPSBtb2Q7CisKKwlmb3IgKDs7KSB7CisJCXVuaW9uIGVoY2lfc2hhZG93CXEsICpxX3A7CisJCV9fbGUzMgkJCXR5cGUsICpod19wOworCQl1bnNpZ25lZAkJdWZyYW1lczsKKworCQkvKiBkb24ndCBzY2FuIHBhc3QgdGhlIGxpdmUgdWZyYW1lICovCisJCWZyYW1lID0gbm93X3VmcmFtZSA+PiAzOworCQlpZiAoZnJhbWUgPT0gKGNsb2NrID4+IDMpKQorCQkJdWZyYW1lcyA9IG5vd191ZnJhbWUgJiAweDA3OworCQllbHNlIHsKKwkJCS8qIHNhZmUgdG8gc2NhbiB0aGUgd2hvbGUgZnJhbWUgYXQgb25jZSAqLworCQkJbm93X3VmcmFtZSB8PSAweDA3OworCQkJdWZyYW1lcyA9IDg7CisJCX0KKworcmVzdGFydDoKKwkJLyogc2NhbiBlYWNoIGVsZW1lbnQgaW4gZnJhbWUncyBxdWV1ZSBmb3IgY29tcGxldGlvbnMgKi8KKwkJcV9wID0gJm94dS0+cHNoYWRvd1tmcmFtZV07CisJCWh3X3AgPSAmb3h1LT5wZXJpb2RpY1tmcmFtZV07CisJCXEucHRyID0gcV9wLT5wdHI7CisJCXR5cGUgPSBRX05FWFRfVFlQRSgqaHdfcCk7CisJCW1vZGlmaWVkID0gMDsKKworCQl3aGlsZSAocS5wdHIgIT0gTlVMTCkgeworCQkJdW5pb24gZWhjaV9zaGFkb3cgdGVtcDsKKwkJCWludCBsaXZlOworCisJCQlsaXZlID0gSENfSVNfUlVOTklORyhveHVfdG9faGNkKG94dSktPnN0YXRlKTsKKwkJCXN3aXRjaCAodHlwZSkgeworCQkJY2FzZSBRX1RZUEVfUUg6CisJCQkJLyogaGFuZGxlIGFueSBjb21wbGV0aW9ucyAqLworCQkJCXRlbXAucWggPSBxaF9nZXQocS5xaCk7CisJCQkJdHlwZSA9IFFfTkVYVF9UWVBFKHEucWgtPmh3X25leHQpOworCQkJCXEgPSBxLnFoLT5xaF9uZXh0OworCQkJCW1vZGlmaWVkID0gcWhfY29tcGxldGlvbnMob3h1LCB0ZW1wLnFoKTsKKwkJCQlpZiAodW5saWtlbHkobGlzdF9lbXB0eSgmdGVtcC5xaC0+cXRkX2xpc3QpKSkKKwkJCQkJaW50cl9kZXNjaGVkdWxlKG94dSwgdGVtcC5xaCk7CisJCQkJcWhfcHV0KHRlbXAucWgpOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlkYmcoImNvcnJ1cHQgdHlwZSAlZCBmcmFtZSAlZCBzaGFkb3cgJXAiLAorCQkJCQl0eXBlLCBmcmFtZSwgcS5wdHIpOworCQkJCXEucHRyID0gTlVMTDsKKwkJCX0KKworCQkJLyogYXNzdW1lIGNvbXBsZXRpb24gY2FsbGJhY2tzIG1vZGlmeSB0aGUgcXVldWUgKi8KKwkJCWlmICh1bmxpa2VseShtb2RpZmllZCkpCisJCQkJZ290byByZXN0YXJ0OworCQl9CisKKwkJLyogU3RvcCB3aGVuIHdlIGNhdGNoIHVwIHRvIHRoZSBIQyAqLworCisJCS8qIEZJWE1FOiAgdGhpcyBhc3N1bWVzIHdlIHdvbid0IGdldCBsYXBwZWQgd2hlbgorCQkgKiBsYXRlbmNpZXMgY2xpbWI7IHRoYXQgc2hvdWxkIGJlIHJhcmUsIGJ1dC4uLgorCQkgKiBkZXRlY3QgaXQsIGFuZCBqdXN0IGdvIGFsbCB0aGUgd2F5IGFyb3VuZC4KKwkJICogRkxSIG1pZ2h0IGhlbHAgZGV0ZWN0IHRoaXMgY2FzZSwgc28gbG9uZyBhcyBsYXRlbmNpZXMKKwkJICogZG9uJ3QgZXhjZWVkIHBlcmlvZGljX3NpemUgbXNlYyAoZGVmYXVsdCAxLjAyNCBzZWMpLgorCQkgKi8KKworCQkvKiBGSVhNRTogbGlrZXdpc2UgYXNzdW1lcyBIQyBkb2Vzbid0IGhhbHQgbWlkLXNjYW4gKi8KKworCQlpZiAobm93X3VmcmFtZSA9PSBjbG9jaykgeworCQkJdW5zaWduZWQJbm93OworCisJCQlpZiAoIUhDX0lTX1JVTk5JTkcob3h1X3RvX2hjZChveHUpLT5zdGF0ZSkpCisJCQkJYnJlYWs7CisJCQlveHUtPm5leHRfdWZyYW1lID0gbm93X3VmcmFtZTsKKwkJCW5vdyA9IHJlYWRsKCZveHUtPnJlZ3MtPmZyYW1lX2luZGV4KSAlIG1vZDsKKwkJCWlmIChub3dfdWZyYW1lID09IG5vdykKKwkJCQlicmVhazsKKworCQkJLyogcmVzY2FuIHRoZSByZXN0IG9mIHRoaXMgZnJhbWUsIHRoZW4gLi4uICovCisJCQljbG9jayA9IG5vdzsKKwkJfSBlbHNlIHsKKwkJCW5vd191ZnJhbWUrKzsKKwkJCW5vd191ZnJhbWUgJT0gbW9kOworCQl9CisJfQorfQorCisvKiBPbiBzb21lIHN5c3RlbXMsIGxlYXZpbmcgcmVtb3RlIHdha2V1cCBlbmFibGVkIHByZXZlbnRzIHN5c3RlbSBzaHV0ZG93bi4KKyAqIFRoZSBmaXJtd2FyZSBzZWVtcyB0byB0aGluayB0aGF0IHBvd2VyaW5nIG9mZiBpcyBhIHdha2V1cCBldmVudCEKKyAqIFRoaXMgcm91dGluZSB0dXJucyBvZmYgcmVtb3RlIHdha2V1cCBhbmQgZXZlcnl0aGluZyBlbHNlLCBvbiBhbGwgcG9ydHMuCisgKi8KK3N0YXRpYyB2b2lkIGVoY2lfdHVybl9vZmZfYWxsX3BvcnRzKHN0cnVjdCBveHVfaGNkICpveHUpCit7CisJaW50IHBvcnQgPSBIQ1NfTl9QT1JUUyhveHUtPmhjc19wYXJhbXMpOworCisJd2hpbGUgKHBvcnQtLSkKKwkJd3JpdGVsKFBPUlRfUldDX0JJVFMsICZveHUtPnJlZ3MtPnBvcnRfc3RhdHVzW3BvcnRdKTsKK30KKworc3RhdGljIHZvaWQgZWhjaV9wb3J0X3Bvd2VyKHN0cnVjdCBveHVfaGNkICpveHUsIGludCBpc19vbikKK3sKKwl1bnNpZ25lZCBwb3J0OworCisJaWYgKCFIQ1NfUFBDKG94dS0+aGNzX3BhcmFtcykpCisJCXJldHVybjsKKworCW94dV9kYmcob3h1LCAiLi4ucG93ZXIlcyBwb3J0cy4uLlxuIiwgaXNfb24gPyAidXAiIDogImRvd24iKTsKKwlmb3IgKHBvcnQgPSBIQ1NfTl9QT1JUUyhveHUtPmhjc19wYXJhbXMpOyBwb3J0ID4gMDsgKQorCQkodm9pZCkgb3h1X2h1Yl9jb250cm9sKG94dV90b19oY2Qob3h1KSwKKwkJCQlpc19vbiA/IFNldFBvcnRGZWF0dXJlIDogQ2xlYXJQb3J0RmVhdHVyZSwKKwkJCQlVU0JfUE9SVF9GRUFUX1BPV0VSLAorCQkJCXBvcnQtLSwgTlVMTCwgMCk7CisJbXNsZWVwKDIwKTsKK30KKworLyogQ2FsbGVkIGZyb20gc29tZSBpbnRlcnJ1cHRzLCB0aW1lcnMsIGFuZCBzbyBvbi4KKyAqIEl0IGNhbGxzIGRyaXZlciBjb21wbGV0aW9uIGZ1bmN0aW9ucywgYWZ0ZXIgZHJvcHBpbmcgb3h1LT5sb2NrLgorICovCitzdGF0aWMgdm9pZCBlaGNpX3dvcmsoc3RydWN0IG94dV9oY2QgKm94dSkKK3sKKwl0aW1lcl9hY3Rpb25fZG9uZShveHUsIFRJTUVSX0lPX1dBVENIRE9HKTsKKwlpZiAob3h1LT5yZWNsYWltX3JlYWR5KQorCQllbmRfdW5saW5rX2FzeW5jKG94dSk7CisKKwkvKiBhbm90aGVyIENQVSBtYXkgZHJvcCBveHUtPmxvY2sgZHVyaW5nIGEgc2NoZWR1bGUgc2NhbiB3aGlsZQorCSAqIGl0IHJlcG9ydHMgdXJiIGNvbXBsZXRpb25zLiAgdGhpcyBmbGFnIGd1YXJkcyBhZ2FpbnN0IGJvZ3VzCisJICogYXR0ZW1wdHMgYXQgcmUtZW50cmFudCBzY2hlZHVsZSBzY2FubmluZy4KKwkgKi8KKwlpZiAob3h1LT5zY2FubmluZykKKwkJcmV0dXJuOworCW94dS0+c2Nhbm5pbmcgPSAxOworCXNjYW5fYXN5bmMob3h1KTsKKwlpZiAob3h1LT5uZXh0X3VmcmFtZSAhPSAtMSkKKwkJc2Nhbl9wZXJpb2RpYyhveHUpOworCW94dS0+c2Nhbm5pbmcgPSAwOworCisJLyogdGhlIElPIHdhdGNoZG9nIGd1YXJkcyBhZ2FpbnN0IGhhcmR3YXJlIG9yIGRyaXZlciBidWdzIHRoYXQKKwkgKiBtaXNwbGFjZSBJUlFzLCBhbmQgc2hvdWxkIGxldCB1cyBydW4gY29tcGxldGVseSB3aXRob3V0IElSUXMuCisJICogc3VjaCBsb3NzYWdlIGhhcyBiZWVuIG9ic2VydmVkIG9uIGJvdGggVlQ2MjAyIGFuZCBWVDgyMzUuCisJICovCisJaWYgKEhDX0lTX1JVTk5JTkcob3h1X3RvX2hjZChveHUpLT5zdGF0ZSkgJiYKKwkJCShveHUtPmFzeW5jLT5xaF9uZXh0LnB0ciAhPSBOVUxMIHx8CisJCQkgb3h1LT5wZXJpb2RpY19zY2hlZCAhPSAwKSkKKwkJdGltZXJfYWN0aW9uKG94dSwgVElNRVJfSU9fV0FUQ0hET0cpOworfQorCitzdGF0aWMgdm9pZCB1bmxpbmtfYXN5bmMoc3RydWN0IG94dV9oY2QgKm94dSwgc3RydWN0IGVoY2lfcWggKnFoKQoreworCS8qIGlmIHdlIG5lZWQgdG8gdXNlIElBQSBhbmQgaXQncyBidXN5LCBkZWZlciAqLworCWlmIChxaC0+cWhfc3RhdGUgPT0gUUhfU1RBVEVfTElOS0VECisJCQkmJiBveHUtPnJlY2xhaW0KKwkJCSYmIEhDX0lTX1JVTk5JTkcob3h1X3RvX2hjZChveHUpLT5zdGF0ZSkpIHsKKwkJc3RydWN0IGVoY2lfcWgJCSpsYXN0OworCisJCWZvciAobGFzdCA9IG94dS0+cmVjbGFpbTsKKwkJCQlsYXN0LT5yZWNsYWltOworCQkJCWxhc3QgPSBsYXN0LT5yZWNsYWltKQorCQkJY29udGludWU7CisJCXFoLT5xaF9zdGF0ZSA9IFFIX1NUQVRFX1VOTElOS19XQUlUOworCQlsYXN0LT5yZWNsYWltID0gcWg7CisKKwkvKiBieXBhc3MgSUFBIGlmIHRoZSBoYyBjYW4ndCBjYXJlICovCisJfSBlbHNlIGlmICghSENfSVNfUlVOTklORyhveHVfdG9faGNkKG94dSktPnN0YXRlKSAmJiBveHUtPnJlY2xhaW0pCisJCWVuZF91bmxpbmtfYXN5bmMob3h1KTsKKworCS8qIHNvbWV0aGluZyBlbHNlIG1pZ2h0IGhhdmUgdW5saW5rZWQgdGhlIHFoIGJ5IG5vdyAqLworCWlmIChxaC0+cWhfc3RhdGUgPT0gUUhfU1RBVEVfTElOS0VEKQorCQlzdGFydF91bmxpbmtfYXN5bmMob3h1LCBxaCk7Cit9CisKKy8qCisgKiBVU0IgaG9zdCBjb250cm9sbGVyIG1ldGhvZHMKKyAqLworCitzdGF0aWMgaXJxcmV0dXJuX3Qgb3h1MjEwX2hjZF9pcnEoc3RydWN0IHVzYl9oY2QgKmhjZCkKK3sKKwlzdHJ1Y3Qgb3h1X2hjZCAqb3h1ID0gaGNkX3RvX294dShoY2QpOworCXUzMiBzdGF0dXMsIHBjZF9zdGF0dXMgPSAwOworCWludCBiaDsKKworCXNwaW5fbG9jaygmb3h1LT5sb2NrKTsKKworCXN0YXR1cyA9IHJlYWRsKCZveHUtPnJlZ3MtPnN0YXR1cyk7CisKKwkvKiBlLmcuIGNhcmRidXMgcGh5c2ljYWwgZWplY3QgKi8KKwlpZiAoc3RhdHVzID09IH4odTMyKSAwKSB7CisJCW94dV9kYmcob3h1LCAiZGV2aWNlIHJlbW92ZWRcbiIpOworCQlnb3RvIGRlYWQ7CisJfQorCisJc3RhdHVzICY9IElOVFJfTUFTSzsKKwlpZiAoIXN0YXR1cykgewkJCS8qIGlycSBzaGFyaW5nPyAqLworCQlzcGluX3VubG9jaygmb3h1LT5sb2NrKTsKKwkJcmV0dXJuIElSUV9OT05FOworCX0KKworCS8qIGNsZWFyIChqdXN0KSBpbnRlcnJ1cHRzICovCisJd3JpdGVsKHN0YXR1cywgJm94dS0+cmVncy0+c3RhdHVzKTsKKwlyZWFkbCgmb3h1LT5yZWdzLT5jb21tYW5kKTsJLyogdW5ibG9jayBwb3N0ZWQgd3JpdGUgKi8KKwliaCA9IDA7CisKKyNpZmRlZiBPWFVfVkVSQk9TRV9ERUJVRworCS8qIHVucmVxdWVzdGVkL2lnbm9yZWQ6IEZyYW1lIExpc3QgUm9sbG92ZXIgKi8KKwlkYmdfc3RhdHVzKG94dSwgImlycSIsIHN0YXR1cyk7CisjZW5kaWYKKworCS8qIElOVCwgRVJSLCBhbmQgSUFBIGludGVycnVwdCByYXRlcyBjYW4gYmUgdGhyb3R0bGVkICovCisKKwkvKiBub3JtYWwgWzQuMTUuMS4yXSBvciBlcnJvciBbNC4xNS4xLjFdIGNvbXBsZXRpb24gKi8KKwlpZiAobGlrZWx5KChzdGF0dXMgJiAoU1RTX0lOVHxTVFNfRVJSKSkgIT0gMCkpCisJCWJoID0gMTsKKworCS8qIGNvbXBsZXRlIHRoZSB1bmxpbmtpbmcgb2Ygc29tZSBxaCBbNC4xNS4yLjNdICovCisJaWYgKHN0YXR1cyAmIFNUU19JQUEpIHsKKwkJb3h1LT5yZWNsYWltX3JlYWR5ID0gMTsKKwkJYmggPSAxOworCX0KKworCS8qIHJlbW90ZSB3YWtldXAgWzQuMy4xXSAqLworCWlmIChzdGF0dXMgJiBTVFNfUENEKSB7CisJCXVuc2lnbmVkIGkgPSBIQ1NfTl9QT1JUUyhveHUtPmhjc19wYXJhbXMpOworCQlwY2Rfc3RhdHVzID0gc3RhdHVzOworCisJCS8qIHJlc3VtZSByb290IGh1Yj8gKi8KKwkJaWYgKCEocmVhZGwoJm94dS0+cmVncy0+Y29tbWFuZCkgJiBDTURfUlVOKSkKKwkJCXVzYl9oY2RfcmVzdW1lX3Jvb3RfaHViKGhjZCk7CisKKwkJd2hpbGUgKGktLSkgeworCQkJaW50IHBzdGF0dXMgPSByZWFkbCgmb3h1LT5yZWdzLT5wb3J0X3N0YXR1c1tpXSk7CisKKwkJCWlmIChwc3RhdHVzICYgUE9SVF9PV05FUikKKwkJCQljb250aW51ZTsKKwkJCWlmICghKHBzdGF0dXMgJiBQT1JUX1JFU1VNRSkKKwkJCQkJfHwgb3h1LT5yZXNldF9kb25lW2ldICE9IDApCisJCQkJY29udGludWU7CisKKwkJCS8qIHN0YXJ0IDIwIG1zZWMgcmVzdW1lIHNpZ25hbGluZyBmcm9tIHRoaXMgcG9ydCwKKwkJCSAqIGFuZCBtYWtlIGtodWJkIGNvbGxlY3QgUE9SVF9TVEFUX0NfU1VTUEVORCB0bworCQkJICogc3RvcCB0aGF0IHNpZ25hbGluZy4KKwkJCSAqLworCQkJb3h1LT5yZXNldF9kb25lW2ldID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMjApOworCQkJb3h1X2RiZyhveHUsICJwb3J0ICVkIHJlbW90ZSB3YWtldXBcbiIsIGkgKyAxKTsKKwkJCW1vZF90aW1lcigmaGNkLT5yaF90aW1lciwgb3h1LT5yZXNldF9kb25lW2ldKTsKKwkJfQorCX0KKworCS8qIFBDSSBlcnJvcnMgWzQuMTUuMi40XSAqLworCWlmICh1bmxpa2VseSgoc3RhdHVzICYgU1RTX0ZBVEFMKSAhPSAwKSkgeworCQkvKiBib2d1cyAiZmF0YWwiIElSUXMgYXBwZWFyIG9uIHNvbWUgY2hpcHMuLi4gd2h5PyAgKi8KKwkJc3RhdHVzID0gcmVhZGwoJm94dS0+cmVncy0+c3RhdHVzKTsKKwkJZGJnX2NtZChveHUsICJmYXRhbCIsIHJlYWRsKCZveHUtPnJlZ3MtPmNvbW1hbmQpKTsKKwkJZGJnX3N0YXR1cyhveHUsICJmYXRhbCIsIHN0YXR1cyk7CisJCWlmIChzdGF0dXMgJiBTVFNfSEFMVCkgeworCQkJb3h1X2VycihveHUsICJmYXRhbCBlcnJvclxuIik7CitkZWFkOgorCQkJZWhjaV9yZXNldChveHUpOworCQkJd3JpdGVsKDAsICZveHUtPnJlZ3MtPmNvbmZpZ3VyZWRfZmxhZyk7CisJCQkvKiBnZW5lcmljIGxheWVyIGtpbGxzL3VubGlua3MgYWxsIHVyYnMsIHRoZW4KKwkJCSAqIHVzZXMgb3h1X3N0b3AgdG8gY2xlYW4gdXAgdGhlIHJlc3QKKwkJCSAqLworCQkJYmggPSAxOworCQl9CisJfQorCisJaWYgKGJoKQorCQllaGNpX3dvcmsob3h1KTsKKwlzcGluX3VubG9jaygmb3h1LT5sb2NrKTsKKwlpZiAocGNkX3N0YXR1cyAmIFNUU19QQ0QpCisJCXVzYl9oY2RfcG9sbF9yaF9zdGF0dXMoaGNkKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBveHVfaXJxKHN0cnVjdCB1c2JfaGNkICpoY2QpCit7CisJc3RydWN0IG94dV9oY2QgKm94dSA9IGhjZF90b19veHUoaGNkKTsKKwlpbnQgcmV0ID0gSVJRX0hBTkRMRUQ7CisKKwl1MzIgc3RhdHVzID0gb3h1X3JlYWRsKGhjZC0+cmVncywgT1hVX0NISVBJUlFTVEFUVVMpOworCXUzMiBlbmFibGUgPSBveHVfcmVhZGwoaGNkLT5yZWdzLCBPWFVfQ0hJUElSUUVOX1NFVCk7CisKKwkvKiBEaXNhYmxlIGFsbCBpbnRlcnJ1cHQgKi8KKwlveHVfd3JpdGVsKGhjZC0+cmVncywgT1hVX0NISVBJUlFFTl9DTFIsIGVuYWJsZSk7CisKKwlpZiAoKG94dS0+aXNfb3RnICYmIChzdGF0dXMgJiBPWFVfVVNCT1RHSSkpIHx8CisJCSghb3h1LT5pc19vdGcgJiYgKHN0YXR1cyAmIE9YVV9VU0JTUEhJKSkpCisJCW94dTIxMF9oY2RfaXJxKGhjZCk7CisJZWxzZQorCQlyZXQgPSBJUlFfTk9ORTsKKworCS8qIEVuYWJsZSBhbGwgaW50ZXJydXB0IGJhY2sgKi8KKwlveHVfd3JpdGVsKGhjZC0+cmVncywgT1hVX0NISVBJUlFFTl9TRVQsIGVuYWJsZSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBveHVfd2F0Y2hkb2codW5zaWduZWQgbG9uZyBwYXJhbSkKK3sKKwlzdHJ1Y3Qgb3h1X2hjZAkqb3h1ID0gKHN0cnVjdCBveHVfaGNkICopIHBhcmFtOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmb3h1LT5sb2NrLCBmbGFncyk7CisKKwkvKiBsb3N0IElBQSBpcnFzIHdlZGdlIHRoaW5ncyBiYWRseTsgc2VlbiB3aXRoIGEgdnQ4MjM1ICovCisJaWYgKG94dS0+cmVjbGFpbSkgeworCQl1MzIgc3RhdHVzID0gcmVhZGwoJm94dS0+cmVncy0+c3RhdHVzKTsKKwkJaWYgKHN0YXR1cyAmIFNUU19JQUEpIHsKKwkJCW94dV92ZGJnKG94dSwgImxvc3QgSUFBXG4iKTsKKwkJCXdyaXRlbChTVFNfSUFBLCAmb3h1LT5yZWdzLT5zdGF0dXMpOworCQkJb3h1LT5yZWNsYWltX3JlYWR5ID0gMTsKKwkJfQorCX0KKworCS8qIHN0b3AgYXN5bmMgcHJvY2Vzc2luZyBhZnRlciBpdCdzIGlkbGVkIGEgYml0ICovCisJaWYgKHRlc3RfYml0KFRJTUVSX0FTWU5DX09GRiwgJm94dS0+YWN0aW9ucykpCisJCXN0YXJ0X3VubGlua19hc3luYyhveHUsIG94dS0+YXN5bmMpOworCisJLyogb3h1IGNvdWxkIHJ1biBieSB0aW1lciwgd2l0aG91dCBJUlFzIC4uLiAqLworCWVoY2lfd29yayhveHUpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmb3h1LT5sb2NrLCBmbGFncyk7Cit9CisKKy8qIE9uZS10aW1lIGluaXQsIG9ubHkgZm9yIG1lbW9yeSBzdGF0ZS4KKyAqLworc3RhdGljIGludCBveHVfaGNkX2luaXQoc3RydWN0IHVzYl9oY2QgKmhjZCkKK3sKKwlzdHJ1Y3Qgb3h1X2hjZCAqb3h1ID0gaGNkX3RvX294dShoY2QpOworCXUzMiB0ZW1wOworCWludCByZXR2YWw7CisJdTMyIGhjY19wYXJhbXM7CisKKwlzcGluX2xvY2tfaW5pdCgmb3h1LT5sb2NrKTsKKworCWluaXRfdGltZXIoJm94dS0+d2F0Y2hkb2cpOworCW94dS0+d2F0Y2hkb2cuZnVuY3Rpb24gPSBveHVfd2F0Y2hkb2c7CisJb3h1LT53YXRjaGRvZy5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIG94dTsKKworCS8qCisJICogaHcgZGVmYXVsdDogMUsgcGVyaW9kaWMgbGlzdCBoZWFkcywgb25lIHBlciBmcmFtZS4KKwkgKiBwZXJpb2RpY19zaXplIGNhbiBzaHJpbmsgYnkgVVNCQ01EIHVwZGF0ZSBpZiBoY2NfcGFyYW1zIGFsbG93cy4KKwkgKi8KKwlveHUtPnBlcmlvZGljX3NpemUgPSBERUZBVUxUX0lfVERQUzsKKwlyZXR2YWwgPSBlaGNpX21lbV9pbml0KG94dSwgR0ZQX0tFUk5FTCk7CisJaWYgKHJldHZhbCA8IDApCisJCXJldHVybiByZXR2YWw7CisKKwkvKiBjb250cm9sbGVycyBtYXkgY2FjaGUgc29tZSBvZiB0aGUgcGVyaW9kaWMgc2NoZWR1bGUgLi4uICovCisJaGNjX3BhcmFtcyA9IHJlYWRsKCZveHUtPmNhcHMtPmhjY19wYXJhbXMpOworCWlmIChIQ0NfSVNPQ19DQUNIRShoY2NfcGFyYW1zKSkJCS8qIGZ1bGwgZnJhbWUgY2FjaGUgKi8KKwkJb3h1LT5pX3RocmVzaCA9IDg7CisJZWxzZQkJCQkJLyogTiBtaWNyb2ZyYW1lcyBjYWNoZWQgKi8KKwkJb3h1LT5pX3RocmVzaCA9IDIgKyBIQ0NfSVNPQ19USFJFUyhoY2NfcGFyYW1zKTsKKworCW94dS0+cmVjbGFpbSA9IE5VTEw7CisJb3h1LT5yZWNsYWltX3JlYWR5ID0gMDsKKwlveHUtPm5leHRfdWZyYW1lID0gLTE7CisKKwkvKgorCSAqIGRlZGljYXRlIGEgcWggZm9yIHRoZSBhc3luYyByaW5nIGhlYWQsIHNpbmNlIHdlIGNvdWxkbid0IHVubGluaworCSAqIGEgJ3JlYWwnIHFoIHdpdGhvdXQgc3RvcHBpbmcgdGhlIGFzeW5jIHNjaGVkdWxlIFs0LjhdLiAgdXNlIGl0CisJICogYXMgdGhlICdyZWNsYW1hdGlvbiBsaXN0IGhlYWQnIHRvby4KKwkgKiBpdHMgZHVtbXkgaXMgdXNlZCBpbiBod19hbHRfbmV4dCBvZiBtYW55IHRkcywgdG8gcHJldmVudCB0aGUgcWgKKwkgKiBmcm9tIGF1dG9tYXRpY2FsbHkgYWR2YW5jaW5nIHRvIHRoZSBuZXh0IHRkIGFmdGVyIHNob3J0IHJlYWRzLgorCSAqLworCW94dS0+YXN5bmMtPnFoX25leHQucWggPSBOVUxMOworCW94dS0+YXN5bmMtPmh3X25leHQgPSBRSF9ORVhUKG94dS0+YXN5bmMtPnFoX2RtYSk7CisJb3h1LT5hc3luYy0+aHdfaW5mbzEgPSBjcHVfdG9fbGUzMihRSF9IRUFEKTsKKwlveHUtPmFzeW5jLT5od190b2tlbiA9IGNwdV90b19sZTMyKFFURF9TVFNfSEFMVCk7CisJb3h1LT5hc3luYy0+aHdfcXRkX25leHQgPSBFSENJX0xJU1RfRU5EOworCW94dS0+YXN5bmMtPnFoX3N0YXRlID0gUUhfU1RBVEVfTElOS0VEOworCW94dS0+YXN5bmMtPmh3X2FsdF9uZXh0ID0gUVREX05FWFQob3h1LT5hc3luYy0+ZHVtbXktPnF0ZF9kbWEpOworCisJLyogY2xlYXIgaW50ZXJydXB0IGVuYWJsZXMsIHNldCBpcnEgbGF0ZW5jeSAqLworCWlmIChsb2cyX2lycV90aHJlc2ggPCAwIHx8IGxvZzJfaXJxX3RocmVzaCA+IDYpCisJCWxvZzJfaXJxX3RocmVzaCA9IDA7CisJdGVtcCA9IDEgPDwgKDE2ICsgbG9nMl9pcnFfdGhyZXNoKTsKKwlpZiAoSENDX0NBTlBBUksoaGNjX3BhcmFtcykpIHsKKwkJLyogSFcgZGVmYXVsdCBwYXJrID09IDMsIG9uIGhhcmR3YXJlIHRoYXQgc3VwcG9ydHMgaXQgKGxpa2UKKwkJICogTlZpZGlhIGFuZCBBTEkgc2lsaWNvbiksIG1heGltaXplcyB0aHJvdWdocHV0IG9uIHRoZSBhc3luYworCQkgKiBzY2hlZHVsZSBieSBhdm9pZGluZyBRSCBmZXRjaGVzIGJldHdlZW4gdHJhbnNmZXJzLgorCQkgKgorCQkgKiBXaXRoIGZhc3QgdXNiIHN0b3JhZ2UgZGV2aWNlcyBhbmQgTkZvcmNlMiwgInBhcmsiIHNlZW1zIHRvCisJCSAqIG1ha2UgcHJvYmxlbXM6ICB0aHJvdWdocHV0IHJlZHVjdGlvbiAoISksIGRhdGEgZXJyb3JzLi4uCisJCSAqLworCQlpZiAocGFyaykgeworCQkJcGFyayA9IG1pbihwYXJrLCAodW5zaWduZWQpIDMpOworCQkJdGVtcCB8PSBDTURfUEFSSzsKKwkJCXRlbXAgfD0gcGFyayA8PCA4OworCQl9CisJCW94dV9kYmcob3h1LCAicGFyayAlZFxuIiwgcGFyayk7CisJfQorCWlmIChIQ0NfUEdNX0ZSQU1FTElTVExFTihoY2NfcGFyYW1zKSkgeworCQkvKiBwZXJpb2RpYyBzY2hlZHVsZSBzaXplIGNhbiBiZSBzbWFsbGVyIHRoYW4gZGVmYXVsdCAqLworCQl0ZW1wICY9IH4oMyA8PCAyKTsKKwkJdGVtcCB8PSAoRUhDSV9UVU5FX0ZMUyA8PCAyKTsKKwl9CisJb3h1LT5jb21tYW5kID0gdGVtcDsKKworCXJldHVybiAwOworfQorCisvKiBDYWxsZWQgZHVyaW5nIHByb2JlKCkgYWZ0ZXIgY2hpcCByZXNldCBjb21wbGV0ZXMuCisgKi8KK3N0YXRpYyBpbnQgb3h1X3Jlc2V0KHN0cnVjdCB1c2JfaGNkICpoY2QpCit7CisJc3RydWN0IG94dV9oY2QgKm94dSA9IGhjZF90b19veHUoaGNkKTsKKwlpbnQgcmV0OworCisJc3Bpbl9sb2NrX2luaXQoJm94dS0+bWVtX2xvY2spOworCUlOSVRfTElTVF9IRUFEKCZveHUtPnVyYl9saXN0KTsKKwlveHUtPnVyYl9sZW4gPSAwOworCisJLyogRklNWEUgKi8KKwloY2QtPnNlbGYuY29udHJvbGxlci0+ZG1hX21hc2sgPSAwVUw7CisKKwlpZiAob3h1LT5pc19vdGcpIHsKKwkJb3h1LT5jYXBzID0gaGNkLT5yZWdzICsgT1hVX09UR19DQVBfT0ZGU0VUOworCQlveHUtPnJlZ3MgPSBoY2QtPnJlZ3MgKyBPWFVfT1RHX0NBUF9PRkZTRVQgKyBcCisJCQlIQ19MRU5HVEgocmVhZGwoJm94dS0+Y2Fwcy0+aGNfY2FwYmFzZSkpOworCisJCW94dS0+bWVtID0gaGNkLT5yZWdzICsgT1hVX1NQSF9NRU07CisJfSBlbHNlIHsKKwkJb3h1LT5jYXBzID0gaGNkLT5yZWdzICsgT1hVX1NQSF9DQVBfT0ZGU0VUOworCQlveHUtPnJlZ3MgPSBoY2QtPnJlZ3MgKyBPWFVfU1BIX0NBUF9PRkZTRVQgKyBcCisJCQlIQ19MRU5HVEgocmVhZGwoJm94dS0+Y2Fwcy0+aGNfY2FwYmFzZSkpOworCisJCW94dS0+bWVtID0gaGNkLT5yZWdzICsgT1hVX09UR19NRU07CisJfQorCisJb3h1LT5oY3NfcGFyYW1zID0gcmVhZGwoJm94dS0+Y2Fwcy0+aGNzX3BhcmFtcyk7CisJb3h1LT5zYnJuID0gMHgyMDsKKworCXJldCA9IG94dV9oY2RfaW5pdChoY2QpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBveHVfcnVuKHN0cnVjdCB1c2JfaGNkICpoY2QpCit7CisJc3RydWN0IG94dV9oY2QgKm94dSA9IGhjZF90b19veHUoaGNkKTsKKwlpbnQgcmV0dmFsOworCXUzMiB0ZW1wLCBoY2NfcGFyYW1zOworCisJaGNkLT51c2VzX25ld19wb2xsaW5nID0gMTsKKwloY2QtPnBvbGxfcmggPSAwOworCisJLyogRUhDSSBzcGVjIHNlY3Rpb24gNC4xICovCisJcmV0dmFsID0gZWhjaV9yZXNldChveHUpOworCWlmIChyZXR2YWwgIT0gMCkgeworCQllaGNpX21lbV9jbGVhbnVwKG94dSk7CisJCXJldHVybiByZXR2YWw7CisJfQorCXdyaXRlbChveHUtPnBlcmlvZGljX2RtYSwgJm94dS0+cmVncy0+ZnJhbWVfbGlzdCk7CisJd3JpdGVsKCh1MzIpIG94dS0+YXN5bmMtPnFoX2RtYSwgJm94dS0+cmVncy0+YXN5bmNfbmV4dCk7CisKKwkvKiBoY2NfcGFyYW1zIGNvbnRyb2xzIHdoZXRoZXIgb3h1LT5yZWdzLT5zZWdtZW50IG11c3QgKCEhISkKKwkgKiBiZSB1c2VkOyBpdCBjb25zdHJhaW5zIFFIL0lURC9TSVREIGFuZCBRVEQgbG9jYXRpb25zLgorCSAqIHBjaV9wb29sIGNvbnNpc3RlbnQgbWVtb3J5IGFsd2F5cyB1c2VzIHNlZ21lbnQgemVyby4KKwkgKiBzdHJlYW1pbmcgbWFwcGluZ3MgZm9yIEkvTyBidWZmZXJzLCBsaWtlIHBjaV9tYXBfc2luZ2xlKCksCisJICogY2FuIHJldHVybiBzZWdtZW50cyBhYm92ZSA0R0IsIGlmIHRoZSBkZXZpY2UgYWxsb3dzLgorCSAqCisJICogTk9URTogIHRoZSBkbWEgbWFzayBpcyB2aXNpYmxlIHRocm91Z2ggZG1hX3N1cHBvcnRlZCgpLCBzbworCSAqIGRyaXZlcnMgY2FuIHBhc3MgdGhpcyBpbmZvIGFsb25nIC4uLiBsaWtlIE5FVElGX0ZfSElHSERNQSwKKwkgKiBTY3NpX0hvc3QuaGlnaG1lbV9pbywgYW5kIHNvIGZvcnRoLiAgSXQncyByZWFkb25seSB0byBhbGwKKwkgKiBob3N0IHNpZGUgZHJpdmVycyB0aG91Z2guCisJICovCisJaGNjX3BhcmFtcyA9IHJlYWRsKCZveHUtPmNhcHMtPmhjY19wYXJhbXMpOworCWlmIChIQ0NfNjRCSVRfQUREUihoY2NfcGFyYW1zKSkKKwkJd3JpdGVsKDAsICZveHUtPnJlZ3MtPnNlZ21lbnQpOworCisJb3h1LT5jb21tYW5kICY9IH4oQ01EX0xSRVNFVCB8IENNRF9JQUFEIHwgQ01EX1BTRSB8CisJCQkJQ01EX0FTRSB8IENNRF9SRVNFVCk7CisJb3h1LT5jb21tYW5kIHw9IENNRF9SVU47CisJd3JpdGVsKG94dS0+Y29tbWFuZCwgJm94dS0+cmVncy0+Y29tbWFuZCk7CisJZGJnX2NtZChveHUsICJpbml0Iiwgb3h1LT5jb21tYW5kKTsKKworCS8qCisJICogU3RhcnQsIGVuYWJsaW5nIGZ1bGwgVVNCIDIuMCBmdW5jdGlvbmFsaXR5IC4uLiB1c2IgMS4xIGRldmljZXMKKwkgKiBhcmUgZXhwbGljaXRseSBoYW5kZWQgdG8gY29tcGFuaW9uIGNvbnRyb2xsZXIocyksIHNvIG5vIFRUIGlzCisJICogaW52b2x2ZWQgd2l0aCB0aGUgcm9vdCBodWIuICAoRXhjZXB0IHdoZXJlIG9uZSBpcyBpbnRlZ3JhdGVkLAorCSAqIGFuZCB0aGVyZSdzIG5vIGNvbXBhbmlvbiBjb250cm9sbGVyIHVubGVzcyBtYXliZSBmb3IgVVNCIE9URy4pCisJICovCisJaGNkLT5zdGF0ZSA9IEhDX1NUQVRFX1JVTk5JTkc7CisJd3JpdGVsKEZMQUdfQ0YsICZveHUtPnJlZ3MtPmNvbmZpZ3VyZWRfZmxhZyk7CisJcmVhZGwoJm94dS0+cmVncy0+Y29tbWFuZCk7CS8qIHVuYmxvY2sgcG9zdGVkIHdyaXRlcyAqLworCisJdGVtcCA9IEhDX1ZFUlNJT04ocmVhZGwoJm94dS0+Y2Fwcy0+aGNfY2FwYmFzZSkpOworCW94dV9pbmZvKG94dSwgIlVTQiAleC4leCBzdGFydGVkLCBxdWFzaS1FSENJICV4LiUwMngsIGRyaXZlciAlcyVzXG4iLAorCQkoKG94dS0+c2JybiAmIDB4ZjApPj40KSwgKG94dS0+c2JybiAmIDB4MGYpLAorCQl0ZW1wID4+IDgsIHRlbXAgJiAweGZmLCBEUklWRVJfVkVSU0lPTiwKKwkJaWdub3JlX29jID8gIiwgb3ZlcmN1cnJlbnQgaWdub3JlZCIgOiAiIik7CisKKwl3cml0ZWwoSU5UUl9NQVNLLCAmb3h1LT5yZWdzLT5pbnRyX2VuYWJsZSk7IC8qIFR1cm4gT24gSW50ZXJydXB0cyAqLworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG94dV9zdG9wKHN0cnVjdCB1c2JfaGNkICpoY2QpCit7CisJc3RydWN0IG94dV9oY2QgKm94dSA9IGhjZF90b19veHUoaGNkKTsKKworCS8qIFR1cm4gb2ZmIHBvcnQgcG93ZXIgb24gYWxsIHJvb3QgaHViIHBvcnRzLiAqLworCWVoY2lfcG9ydF9wb3dlcihveHUsIDApOworCisJLyogbm8gbW9yZSBpbnRlcnJ1cHRzIC4uLiAqLworCWRlbF90aW1lcl9zeW5jKCZveHUtPndhdGNoZG9nKTsKKworCXNwaW5fbG9ja19pcnEoJm94dS0+bG9jayk7CisJaWYgKEhDX0lTX1JVTk5JTkcoaGNkLT5zdGF0ZSkpCisJCWVoY2lfcXVpZXNjZShveHUpOworCisJZWhjaV9yZXNldChveHUpOworCXdyaXRlbCgwLCAmb3h1LT5yZWdzLT5pbnRyX2VuYWJsZSk7CisJc3Bpbl91bmxvY2tfaXJxKCZveHUtPmxvY2spOworCisJLyogbGV0IGNvbXBhbmlvbiBjb250cm9sbGVycyB3b3JrIHdoZW4gd2UgYXJlbid0ICovCisJd3JpdGVsKDAsICZveHUtPnJlZ3MtPmNvbmZpZ3VyZWRfZmxhZyk7CisKKwkvKiByb290IGh1YiBpcyBzaHV0IGRvd24gc2VwYXJhdGVseSAoZmlyc3QsIHdoZW4gcG9zc2libGUpICovCisJc3Bpbl9sb2NrX2lycSgmb3h1LT5sb2NrKTsKKwlpZiAob3h1LT5hc3luYykKKwkJZWhjaV93b3JrKG94dSk7CisJc3Bpbl91bmxvY2tfaXJxKCZveHUtPmxvY2spOworCWVoY2lfbWVtX2NsZWFudXAob3h1KTsKKworCWRiZ19zdGF0dXMob3h1LCAib3h1X3N0b3AgY29tcGxldGVkIiwgcmVhZGwoJm94dS0+cmVncy0+c3RhdHVzKSk7Cit9CisKKy8qIEtpY2sgaW4gZm9yIHNpbGljb24gb24gYW55IGJ1cyAobm90IGp1c3QgcGNpLCBldGMpLgorICogVGhpcyBmb3JjaWJseSBkaXNhYmxlcyBkbWEgYW5kIElSUXMsIGhlbHBpbmcga2V4ZWMgYW5kIG90aGVyIGNhc2VzCisgKiB3aGVyZSB0aGUgbmV4dCBzeXN0ZW0gc29mdHdhcmUgbWF5IGV4cGVjdCBjbGVhbiBzdGF0ZS4KKyAqLworc3RhdGljIHZvaWQgb3h1X3NodXRkb3duKHN0cnVjdCB1c2JfaGNkICpoY2QpCit7CisJc3RydWN0IG94dV9oY2QgKm94dSA9IGhjZF90b19veHUoaGNkKTsKKworCSh2b2lkKSBlaGNpX2hhbHQob3h1KTsKKwllaGNpX3R1cm5fb2ZmX2FsbF9wb3J0cyhveHUpOworCisJLyogbWFrZSBCSU9TL2V0YyB1c2UgY29tcGFuaW9uIGNvbnRyb2xsZXIgZHVyaW5nIHJlYm9vdCAqLworCXdyaXRlbCgwLCAmb3h1LT5yZWdzLT5jb25maWd1cmVkX2ZsYWcpOworCisJLyogdW5ibG9jayBwb3N0ZWQgd3JpdGVzICovCisJcmVhZGwoJm94dS0+cmVncy0+Y29uZmlndXJlZF9mbGFnKTsKK30KKworLyogTm9uLWVycm9yIHJldHVybnMgYXJlIGEgcHJvbWlzZSB0byBnaXZlYmFjaygpIHRoZSB1cmIgbGF0ZXIKKyAqIHdlIGRyb3Agb3duZXJzaGlwIHNvIG5leHQgb3duZXIgKG9yIHVyYiB1bmxpbmspIGNhbiBnZXQgaXQKKyAqCisgKiB1cmIgKyBkZXYgaXMgaW4gaGNkLnNlbGYuY29udHJvbGxlci51cmJfbGlzdAorICogd2UncmUgcXVldWVpbmcgVERzIG9udG8gc29mdHdhcmUgYW5kIGhhcmR3YXJlIGxpc3RzCisgKgorICogaGNkLXNwZWNpZmljIGluaXQgZm9yIGhjcHJpdiBoYXNuJ3QgYmVlbiBkb25lIHlldAorICoKKyAqIE5PVEU6ICBjb250cm9sLCBidWxrLCBhbmQgaW50ZXJydXB0IHNoYXJlIHRoZSBzYW1lIGNvZGUgdG8gYXBwZW5kIFREcworICogdG8gYSAocG9zc2libHkgYWN0aXZlKSBRSCwgYW5kIHRoZSBzYW1lIFFIIHNjYW5uaW5nIGNvZGUuCisgKi8KK3N0YXRpYyBpbnQgX19veHVfdXJiX2VucXVldWUoc3RydWN0IHVzYl9oY2QgKmhjZCwgc3RydWN0IHVyYiAqdXJiLAorCQkJCWdmcF90IG1lbV9mbGFncykKK3sKKwlzdHJ1Y3Qgb3h1X2hjZCAqb3h1ID0gaGNkX3RvX294dShoY2QpOworCXN0cnVjdCBsaXN0X2hlYWQgcXRkX2xpc3Q7CisKKwlJTklUX0xJU1RfSEVBRCgmcXRkX2xpc3QpOworCisJc3dpdGNoICh1c2JfcGlwZXR5cGUodXJiLT5waXBlKSkgeworCWNhc2UgUElQRV9DT05UUk9MOgorCWNhc2UgUElQRV9CVUxLOgorCWRlZmF1bHQ6CisJCWlmICghcWhfdXJiX3RyYW5zYWN0aW9uKG94dSwgdXJiLCAmcXRkX2xpc3QsIG1lbV9mbGFncykpCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJcmV0dXJuIHN1Ym1pdF9hc3luYyhveHUsIHVyYiwgJnF0ZF9saXN0LCBtZW1fZmxhZ3MpOworCisJY2FzZSBQSVBFX0lOVEVSUlVQVDoKKwkJaWYgKCFxaF91cmJfdHJhbnNhY3Rpb24ob3h1LCB1cmIsICZxdGRfbGlzdCwgbWVtX2ZsYWdzKSkKKwkJCXJldHVybiAtRU5PTUVNOworCQlyZXR1cm4gaW50cl9zdWJtaXQob3h1LCB1cmIsICZxdGRfbGlzdCwgbWVtX2ZsYWdzKTsKKworCWNhc2UgUElQRV9JU09DSFJPTk9VUzoKKwkJaWYgKHVyYi0+ZGV2LT5zcGVlZCA9PSBVU0JfU1BFRURfSElHSCkKKwkJCXJldHVybiBpdGRfc3VibWl0KG94dSwgdXJiLCBtZW1fZmxhZ3MpOworCQllbHNlCisJCQlyZXR1cm4gc2l0ZF9zdWJtaXQob3h1LCB1cmIsIG1lbV9mbGFncyk7CisJfQorfQorCisvKiBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBicmVha2luZyBVUkJzIHdpdGggYmlnIGRhdGEgc2l6ZQorICogaW50byBzbWFsbGVyIHNpemUgYW5kIHByb2Nlc3Npbmcgc21hbGwgdXJicyBpbiBzZXF1ZW5jZS4KKyAqLworc3RhdGljIGludCBveHVfdXJiX2VucXVldWUoc3RydWN0IHVzYl9oY2QgKmhjZCwgc3RydWN0IHVyYiAqdXJiLAorCQkJCWdmcF90IG1lbV9mbGFncykKK3sKKwlzdHJ1Y3Qgb3h1X2hjZCAqb3h1ID0gaGNkX3RvX294dShoY2QpOworCWludCBudW0sIHJlbTsKKwlpbnQgdHJhbnNmZXJfYnVmZmVyX2xlbmd0aDsKKwl2b2lkICp0cmFuc2Zlcl9idWZmZXI7CisJc3RydWN0IHVyYiAqbXVyYjsKKwlpbnQgaSwgcmV0OworCisJLyogSWYgbm90IGJ1bGsgcGlwZSBqdXN0IGVucXVldWUgdGhlIFVSQiAqLworCWlmICghdXNiX3BpcGVidWxrKHVyYi0+cGlwZSkpCisJCXJldHVybiBfX294dV91cmJfZW5xdWV1ZShoY2QsIHVyYiwgbWVtX2ZsYWdzKTsKKworCS8qIE90aGVyd2lzZSB3ZSBzaG91bGQgdmVyaWZ5IHRoZSBVU0IgdHJhbnNmZXIgYnVmZmVyIHNpemUhICovCisJdHJhbnNmZXJfYnVmZmVyID0gdXJiLT50cmFuc2Zlcl9idWZmZXI7CisJdHJhbnNmZXJfYnVmZmVyX2xlbmd0aCA9IHVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aDsKKworCW51bSA9IHVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCAvIDQwOTY7CisJcmVtID0gdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoICUgNDA5NjsKKwlpZiAocmVtICE9IDApCisJCW51bSsrOworCisJLyogSWYgVVJCIGlzIHNtYWxsZXIgdGhhbiA0MDk2IGJ5dGVzIGp1c3QgZW5xdWV1ZSBpdCEgKi8KKwlpZiAobnVtID09IDEpCisJCXJldHVybiBfX294dV91cmJfZW5xdWV1ZShoY2QsIHVyYiwgbWVtX2ZsYWdzKTsKKworCS8qIE9rLCB3ZSBoYXZlIG1vcmUgam9iIHRvIGRvISA6KSAqLworCisJZm9yIChpID0gMDsgaSA8IG51bSAtIDE7IGkrKykgeworCQkvKiBHZXQgZnJlZSBtaWNybyBVUkIgcG9sbCB0aWxsIGEgZnJlZSB1cmIgaXMgcmVjaWV2ZWQgKi8KKworCQlkbyB7CisJCQltdXJiID0gKHN0cnVjdCB1cmIgKikgb3h1X211cmJfYWxsb2Mob3h1KTsKKwkJCWlmICghbXVyYikKKwkJCQlzY2hlZHVsZSgpOworCQl9IHdoaWxlICghbXVyYik7CisKKwkJLyogQ29waW5nIHRoZSB1cmIgKi8KKwkJbWVtY3B5KG11cmIsIHVyYiwgc2l6ZW9mKHN0cnVjdCB1cmIpKTsKKworCQltdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID0gNDA5NjsKKwkJbXVyYi0+dHJhbnNmZXJfYnVmZmVyID0gdHJhbnNmZXJfYnVmZmVyICsgaSAqIDQwOTY7CisKKwkJLyogTnVsbCBwb2ludGVyIGZvciB0aGUgZW5jb2RlcyB0aGF0IHRoaXMgaXMgYSBtaWNybyB1cmIgKi8KKwkJbXVyYi0+Y29tcGxldGUgPSBOVUxMOworCisJCSgoc3RydWN0IG94dV9tdXJiICopIG11cmIpLT5tYWluID0gdXJiOworCQkoKHN0cnVjdCBveHVfbXVyYiAqKSBtdXJiKS0+bGFzdCA9IDA7CisKKwkJLyogVGhpcyBsb29wIGlzIHRvIGd1YXJhbnRlZSB1cmIgdG8gYmUgcHJvY2Vzc2VkIHdoZW4gdGhlcmUncworCQkgKiBub3QgZW5vdWdoIHJlc291cmNlcyBhdCBhIHBhcnRpY3VsYXIgdGltZSBieSByZXRyeWluZy4KKwkJICovCisJCWRvIHsKKwkJCXJldCAgPSBfX294dV91cmJfZW5xdWV1ZShoY2QsIG11cmIsIG1lbV9mbGFncyk7CisJCQlpZiAocmV0KQorCQkJCXNjaGVkdWxlKCk7CisJCX0gd2hpbGUgKHJldCk7CisJfQorCisJLyogTGFzdCB1cmIgcmVxdWlyZXMgc3BlY2lhbCBoYW5kbGluZyAgKi8KKworCS8qIEdldCBmcmVlIG1pY3JvIFVSQiBwb2xsIHRpbGwgYSBmcmVlIHVyYiBpcyByZWNpZXZlZCAqLworCWRvIHsKKwkJbXVyYiA9IChzdHJ1Y3QgdXJiICopIG94dV9tdXJiX2FsbG9jKG94dSk7CisJCWlmICghbXVyYikKKwkJCXNjaGVkdWxlKCk7CisJfSB3aGlsZSAoIW11cmIpOworCisJLyogQ29waW5nIHRoZSB1cmIgKi8KKwltZW1jcHkobXVyYiwgdXJiLCBzaXplb2Yoc3RydWN0IHVyYikpOworCisJbXVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCA9IHJlbSA+IDAgPyByZW0gOiA0MDk2OworCW11cmItPnRyYW5zZmVyX2J1ZmZlciA9IHRyYW5zZmVyX2J1ZmZlciArIChudW0gLSAxKSAqIDQwOTY7CisKKwkvKiBOdWxsIHBvaW50ZXIgZm9yIHRoZSBlbmNvZGVzIHRoYXQgdGhpcyBpcyBhIG1pY3JvIHVyYiAqLworCW11cmItPmNvbXBsZXRlID0gTlVMTDsKKworCSgoc3RydWN0IG94dV9tdXJiICopIG11cmIpLT5tYWluID0gdXJiOworCSgoc3RydWN0IG94dV9tdXJiICopIG11cmIpLT5sYXN0ID0gMTsKKworCWRvIHsKKwkJcmV0ID0gX19veHVfdXJiX2VucXVldWUoaGNkLCBtdXJiLCBtZW1fZmxhZ3MpOworCQlpZiAocmV0KQorCQkJc2NoZWR1bGUoKTsKKwl9IHdoaWxlIChyZXQpOworCisJcmV0dXJuIHJldDsKK30KKworLyogUmVtb3ZlIGZyb20gaGFyZHdhcmUgbGlzdHMuCisgKiBDb21wbGV0aW9ucyBub3JtYWxseSBoYXBwZW4gYXN5bmNocm9ub3VzbHkKKyAqLworc3RhdGljIGludCBveHVfdXJiX2RlcXVldWUoc3RydWN0IHVzYl9oY2QgKmhjZCwgc3RydWN0IHVyYiAqdXJiLCBpbnQgc3RhdHVzKQoreworCXN0cnVjdCBveHVfaGNkICpveHUgPSBoY2RfdG9fb3h1KGhjZCk7CisJc3RydWN0IGVoY2lfcWggKnFoOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmb3h1LT5sb2NrLCBmbGFncyk7CisJc3dpdGNoICh1c2JfcGlwZXR5cGUodXJiLT5waXBlKSkgeworCWNhc2UgUElQRV9DT05UUk9MOgorCWNhc2UgUElQRV9CVUxLOgorCWRlZmF1bHQ6CisJCXFoID0gKHN0cnVjdCBlaGNpX3FoICopIHVyYi0+aGNwcml2OworCQlpZiAoIXFoKQorCQkJYnJlYWs7CisJCXVubGlua19hc3luYyhveHUsIHFoKTsKKwkJYnJlYWs7CisKKwljYXNlIFBJUEVfSU5URVJSVVBUOgorCQlxaCA9IChzdHJ1Y3QgZWhjaV9xaCAqKSB1cmItPmhjcHJpdjsKKwkJaWYgKCFxaCkKKwkJCWJyZWFrOworCQlzd2l0Y2ggKHFoLT5xaF9zdGF0ZSkgeworCQljYXNlIFFIX1NUQVRFX0xJTktFRDoKKwkJCWludHJfZGVzY2hlZHVsZShveHUsIHFoKTsKKwkJCS8qIEZBTEwgVEhST1VHSCAqLworCQljYXNlIFFIX1NUQVRFX0lETEU6CisJCQlxaF9jb21wbGV0aW9ucyhveHUsIHFoKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJb3h1X2RiZyhveHUsICJib2d1cyBxaCAlcCBzdGF0ZSAlZFxuIiwKKwkJCQkJcWgsIHFoLT5xaF9zdGF0ZSk7CisJCQlnb3RvIGRvbmU7CisJCX0KKworCQkvKiByZXNjaGVkdWxlIFFIIGlmZiBhbm90aGVyIHJlcXVlc3QgaXMgcXVldWVkICovCisJCWlmICghbGlzdF9lbXB0eSgmcWgtPnF0ZF9saXN0KQorCQkJCSYmIEhDX0lTX1JVTk5JTkcoaGNkLT5zdGF0ZSkpIHsKKwkJCWludCBzdGF0dXM7CisKKwkJCXN0YXR1cyA9IHFoX3NjaGVkdWxlKG94dSwgcWgpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmb3h1LT5sb2NrLCBmbGFncyk7CisKKwkJCWlmIChzdGF0dXMgIT0gMCkgeworCQkJCS8qIHNob3VsZG4ndCBoYXBwZW4gb2Z0ZW4sIGJ1dCAuLi4KKwkJCQkgKiBGSVhNRSBraWxsIHRob3NlIHRkcycgdXJicworCQkJCSAqLworCQkJCWVycigiY2FuJ3QgcmVzY2hlZHVsZSBxaCAlcCwgZXJyICVkIiwKKwkJCQkJcWgsIHN0YXR1cyk7CisJCQl9CisJCQlyZXR1cm4gc3RhdHVzOworCQl9CisJCWJyZWFrOworCX0KK2RvbmU6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmb3h1LT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIDA7Cit9CisKKy8qIEJ1bGsgcWggaG9sZHMgdGhlIGRhdGEgdG9nZ2xlICovCitzdGF0aWMgdm9pZCBveHVfZW5kcG9pbnRfZGlzYWJsZShzdHJ1Y3QgdXNiX2hjZCAqaGNkLAorCQkJCQlzdHJ1Y3QgdXNiX2hvc3RfZW5kcG9pbnQgKmVwKQoreworCXN0cnVjdCBveHVfaGNkICpveHUgPSBoY2RfdG9fb3h1KGhjZCk7CisJdW5zaWduZWQgbG9uZwkJZmxhZ3M7CisJc3RydWN0IGVoY2lfcWgJCSpxaCwgKnRtcDsKKworCS8qIEFTU0VSVDogIGFueSByZXF1ZXN0cy91cmJzIGFyZSBiZWluZyB1bmxpbmtlZCAqLworCS8qIEFTU0VSVDogIG5vYm9keSBjYW4gYmUgc3VibWl0dGluZyB1cmJzIGZvciB0aGlzIGFueSBtb3JlICovCisKK3Jlc2NhbjoKKwlzcGluX2xvY2tfaXJxc2F2ZSgmb3h1LT5sb2NrLCBmbGFncyk7CisJcWggPSBlcC0+aGNwcml2OworCWlmICghcWgpCisJCWdvdG8gZG9uZTsKKworCS8qIGVuZHBvaW50cyBjYW4gYmUgaXNvIHN0cmVhbXMuICBmb3Igbm93LCB3ZSBkb24ndAorCSAqIGFjY2VsZXJhdGUgaXNvIGNvbXBsZXRpb25zIC4uLiBzbyBzcGluIGEgd2hpbGUuCisJICovCisJaWYgKHFoLT5od19pbmZvMSA9PSAwKSB7CisJCW94dV92ZGJnKG94dSwgImlzbyBkZWxheVxuIik7CisJCWdvdG8gaWRsZV90aW1lb3V0OworCX0KKworCWlmICghSENfSVNfUlVOTklORyhoY2QtPnN0YXRlKSkKKwkJcWgtPnFoX3N0YXRlID0gUUhfU1RBVEVfSURMRTsKKwlzd2l0Y2ggKHFoLT5xaF9zdGF0ZSkgeworCWNhc2UgUUhfU1RBVEVfTElOS0VEOgorCQlmb3IgKHRtcCA9IG94dS0+YXN5bmMtPnFoX25leHQucWg7CisJCQkJdG1wICYmIHRtcCAhPSBxaDsKKwkJCQl0bXAgPSB0bXAtPnFoX25leHQucWgpCisJCQljb250aW51ZTsKKwkJLyogcGVyaW9kaWMgcWggc2VsZi11bmxpbmtzIG9uIGVtcHR5ICovCisJCWlmICghdG1wKQorCQkJZ290byBub2dvb2Q7CisJCXVubGlua19hc3luYyhveHUsIHFoKTsKKwkJLyogRkFMTCBUSFJPVUdIICovCisJY2FzZSBRSF9TVEFURV9VTkxJTks6CQkvKiB3YWl0IGZvciBodyB0byBmaW5pc2g/ICovCitpZGxlX3RpbWVvdXQ6CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm94dS0+bG9jaywgZmxhZ3MpOworCQlzY2hlZHVsZV90aW1lb3V0X3VuaW50ZXJydXB0aWJsZSgxKTsKKwkJZ290byByZXNjYW47CisJY2FzZSBRSF9TVEFURV9JRExFOgkJLyogZnVsbHkgdW5saW5rZWQgKi8KKwkJaWYgKGxpc3RfZW1wdHkoJnFoLT5xdGRfbGlzdCkpIHsKKwkJCXFoX3B1dChxaCk7CisJCQlicmVhazsKKwkJfQorCQkvKiBlbHNlIEZBTEwgVEhST1VHSCAqLworCWRlZmF1bHQ6Citub2dvb2Q6CisJCS8qIGNhbGxlciB3YXMgc3VwcG9zZWQgdG8gaGF2ZSB1bmxpbmtlZCBhbnkgcmVxdWVzdHM7CisJCSAqIHRoYXQncyBub3Qgb3VyIGpvYi4gIGp1c3QgbGVhayB0aGlzIG1lbW9yeS4KKwkJICovCisJCW94dV9lcnIob3h1LCAicWggJXAgKCMlMDJ4KSBzdGF0ZSAlZCVzXG4iLAorCQkJcWgsIGVwLT5kZXNjLmJFbmRwb2ludEFkZHJlc3MsIHFoLT5xaF9zdGF0ZSwKKwkJCWxpc3RfZW1wdHkoJnFoLT5xdGRfbGlzdCkgPyAiIiA6ICIoaGFzIHRkcykiKTsKKwkJYnJlYWs7CisJfQorCWVwLT5oY3ByaXYgPSBOVUxMOworZG9uZToKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZveHUtPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBpbnQgb3h1X2dldF9mcmFtZShzdHJ1Y3QgdXNiX2hjZCAqaGNkKQoreworCXN0cnVjdCBveHVfaGNkICpveHUgPSBoY2RfdG9fb3h1KGhjZCk7CisKKwlyZXR1cm4gKHJlYWRsKCZveHUtPnJlZ3MtPmZyYW1lX2luZGV4KSA+PiAzKSAlCisJCW94dS0+cGVyaW9kaWNfc2l6ZTsKK30KKworLyogQnVpbGQgInN0YXR1cyBjaGFuZ2UiIHBhY2tldCAob25lIG9yIHR3byBieXRlcykgZnJvbSBIQyByZWdpc3RlcnMgKi8KK3N0YXRpYyBpbnQgb3h1X2h1Yl9zdGF0dXNfZGF0YShzdHJ1Y3QgdXNiX2hjZCAqaGNkLCBjaGFyICpidWYpCit7CisJc3RydWN0IG94dV9oY2QgKm94dSA9IGhjZF90b19veHUoaGNkKTsKKwl1MzIgdGVtcCwgbWFzaywgc3RhdHVzID0gMDsKKwlpbnQgcG9ydHMsIGksIHJldHZhbCA9IDE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qIGlmICFVU0JfU1VTUEVORCwgcm9vdCBodWIgdGltZXJzIHdvbid0IGdldCBzaHV0IGRvd24gLi4uICovCisJaWYgKCFIQ19JU19SVU5OSU5HKGhjZC0+c3RhdGUpKQorCQlyZXR1cm4gMDsKKworCS8qIGluaXQgc3RhdHVzIHRvIG5vLWNoYW5nZXMgKi8KKwlidWZbMF0gPSAwOworCXBvcnRzID0gSENTX05fUE9SVFMob3h1LT5oY3NfcGFyYW1zKTsKKwlpZiAocG9ydHMgPiA3KSB7CisJCWJ1ZlsxXSA9IDA7CisJCXJldHZhbCsrOworCX0KKworCS8qIFNvbWUgYm9hcmRzIChtb3N0bHkgVklBPykgcmVwb3J0IGJvZ3VzIG92ZXJjdXJyZW50IGluZGljYXRpb25zLAorCSAqIGNhdXNpbmcgbWFzc2l2ZSBsb2cgc3BhbSB1bmxlc3Mgd2UgY29tcGxldGVseSBpZ25vcmUgdGhlbS4gIEl0CisJICogbWF5IGJlIHJlbGV2YW50IHRoYXQgVklBIFZUODIzNSBjb250cm9sZXJzLCB3aGVyZSBQT1JUX1BPV0VSIGlzCisJICogYWx3YXlzIHNldCwgc2VlbSB0byBjbGVhciBQT1JUX09DQyBhbmQgUE9SVF9DU0Mgd2hlbiB3cml0aW5nIHRvCisJICogUE9SVF9QT1dFUjsgdGhhdCdzIHN1cnByaXNpbmcsIGJ1dCBtYXliZSB3aXRoaW4tc3BlYy4KKwkgKi8KKwlpZiAoIWlnbm9yZV9vYykKKwkJbWFzayA9IFBPUlRfQ1NDIHwgUE9SVF9QRUMgfCBQT1JUX09DQzsKKwllbHNlCisJCW1hc2sgPSBQT1JUX0NTQyB8IFBPUlRfUEVDOworCisJLyogbm8gaHViIGNoYW5nZSByZXBvcnRzIChiaXQgMCkgZm9yIG5vdyAocG93ZXIsIC4uLikgKi8KKworCS8qIHBvcnQgTiBjaGFuZ2VzIChiaXQgTik/ICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJm94dS0+bG9jaywgZmxhZ3MpOworCWZvciAoaSA9IDA7IGkgPCBwb3J0czsgaSsrKSB7CisJCXRlbXAgPSByZWFkbCgmb3h1LT5yZWdzLT5wb3J0X3N0YXR1c1tpXSk7CisKKwkJLyoKKwkJICogUmV0dXJuIHN0YXR1cyBpbmZvcm1hdGlvbiBldmVuIGZvciBwb3J0cyB3aXRoIE9XTkVSIHNldC4KKwkJICogT3RoZXJ3aXNlIGtodWJkIHdvdWxkbid0IHNlZSB0aGUgZGlzY29ubmVjdCBldmVudCB3aGVuIGEKKwkJICogaGlnaC1zcGVlZCBkZXZpY2UgaXMgc3dpdGNoZWQgb3ZlciB0byB0aGUgY29tcGFuaW9uCisJCSAqIGNvbnRyb2xsZXIgYnkgdGhlIHVzZXIuCisJCSAqLworCisJCWlmICghKHRlbXAgJiBQT1JUX0NPTk5FQ1QpKQorCQkJb3h1LT5yZXNldF9kb25lW2ldID0gMDsKKwkJaWYgKCh0ZW1wICYgbWFzaykgIT0gMCB8fCAoKHRlbXAgJiBQT1JUX1JFU1VNRSkgIT0gMCAmJgorCQkJCXRpbWVfYWZ0ZXJfZXEoamlmZmllcywgb3h1LT5yZXNldF9kb25lW2ldKSkpIHsKKwkJCWlmIChpIDwgNykKKwkJCQlidWZbMF0gfD0gMSA8PCAoaSArIDEpOworCQkJZWxzZQorCQkJCWJ1ZlsxXSB8PSAxIDw8IChpIC0gNyk7CisJCQlzdGF0dXMgPSBTVFNfUENEOworCQl9CisJfQorCS8qIEZJWE1FIGF1dG9zdXNwZW5kIGlkbGUgcm9vdCBodWJzICovCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmb3h1LT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIHN0YXR1cyA/IHJldHZhbCA6IDA7Cit9CisKKy8qIFJldHVybnMgdGhlIHNwZWVkIG9mIGEgZGV2aWNlIGF0dGFjaGVkIHRvIGEgcG9ydCBvbiB0aGUgcm9vdCBodWIuICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBveHVfcG9ydF9zcGVlZChzdHJ1Y3Qgb3h1X2hjZCAqb3h1LAorCQkJCQkJdW5zaWduZWQgaW50IHBvcnRzYykKK3sKKwlzd2l0Y2ggKChwb3J0c2MgPj4gMjYpICYgMykgeworCWNhc2UgMDoKKwkJcmV0dXJuIDA7CisJY2FzZSAxOgorCQlyZXR1cm4gMSA8PCBVU0JfUE9SVF9GRUFUX0xPV1NQRUVEOworCWNhc2UgMjoKKwlkZWZhdWx0OgorCQlyZXR1cm4gMSA8PCBVU0JfUE9SVF9GRUFUX0hJR0hTUEVFRDsKKwl9Cit9CisKKyNkZWZpbmUJUE9SVF9XQUtFX0JJVFMJKFBPUlRfV0tPQ19FfFBPUlRfV0tESVNDX0V8UE9SVF9XS0NPTk5fRSkKK3N0YXRpYyBpbnQgb3h1X2h1Yl9jb250cm9sKHN0cnVjdCB1c2JfaGNkICpoY2QsIHUxNiB0eXBlUmVxLAorCQkJCXUxNiB3VmFsdWUsIHUxNiB3SW5kZXgsIGNoYXIgKmJ1ZiwgdTE2IHdMZW5ndGgpCit7CisJc3RydWN0IG94dV9oY2QgKm94dSA9IGhjZF90b19veHUoaGNkKTsKKwlpbnQgcG9ydHMgPSBIQ1NfTl9QT1JUUyhveHUtPmhjc19wYXJhbXMpOworCXUzMiBfX2lvbWVtICpzdGF0dXNfcmVnID0gJm94dS0+cmVncy0+cG9ydF9zdGF0dXNbd0luZGV4IC0gMV07CisJdTMyIHRlbXAsIHN0YXR1czsKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCWludCByZXR2YWwgPSAwOworCXVuc2lnbmVkIHNlbGVjdG9yOworCisJLyoKKwkgKiBGSVhNRTogIHN1cHBvcnQgU2V0UG9ydEZlYXR1cmVzIFVTQl9QT1JUX0ZFQVRfSU5ESUNBVE9SLgorCSAqIEhDU19JTkRJQ0FUT1IgbWF5IHNheSB3ZSBjYW4gY2hhbmdlIExFRHMgdG8gb2ZmL2FtYmVyL2dyZWVuLgorCSAqICh0cmFjayBjdXJyZW50IHN0YXRlIG91cnNlbHZlcykgLi4uIGJsaW5rIGZvciBkaWFnbm9zdGljcywKKwkgKiBwb3dlciwgInRoaXMgaXMgdGhlIG9uZSIsIGV0Yy4gIEVIQ0kgc3BlYyBzdXBwb3J0cyB0aGlzLgorCSAqLworCisJc3Bpbl9sb2NrX2lycXNhdmUoJm94dS0+bG9jaywgZmxhZ3MpOworCXN3aXRjaCAodHlwZVJlcSkgeworCWNhc2UgQ2xlYXJIdWJGZWF0dXJlOgorCQlzd2l0Y2ggKHdWYWx1ZSkgeworCQljYXNlIENfSFVCX0xPQ0FMX1BPV0VSOgorCQljYXNlIENfSFVCX09WRVJfQ1VSUkVOVDoKKwkJCS8qIG5vIGh1Yi13aWRlIGZlYXR1cmUvc3RhdHVzIGZsYWdzICovCisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWdvdG8gZXJyb3I7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBDbGVhclBvcnRGZWF0dXJlOgorCQlpZiAoIXdJbmRleCB8fCB3SW5kZXggPiBwb3J0cykKKwkJCWdvdG8gZXJyb3I7CisJCXdJbmRleC0tOworCQl0ZW1wID0gcmVhZGwoc3RhdHVzX3JlZyk7CisKKwkJLyoKKwkJICogRXZlbiBpZiBPV05FUiBpcyBzZXQsIHNvIHRoZSBwb3J0IGlzIG93bmVkIGJ5IHRoZQorCQkgKiBjb21wYW5pb24gY29udHJvbGxlciwga2h1YmQgbmVlZHMgdG8gYmUgYWJsZSB0byBjbGVhcgorCQkgKiB0aGUgcG9ydC1jaGFuZ2Ugc3RhdHVzIGJpdHMgKGVzcGVjaWFsbHkKKwkJICogVVNCX1BPUlRfRkVBVF9DX0NPTk5FQ1RJT04pLgorCQkgKi8KKworCQlzd2l0Y2ggKHdWYWx1ZSkgeworCQljYXNlIFVTQl9QT1JUX0ZFQVRfRU5BQkxFOgorCQkJd3JpdGVsKHRlbXAgJiB+UE9SVF9QRSwgc3RhdHVzX3JlZyk7CisJCQlicmVhazsKKwkJY2FzZSBVU0JfUE9SVF9GRUFUX0NfRU5BQkxFOgorCQkJd3JpdGVsKCh0ZW1wICYgflBPUlRfUldDX0JJVFMpIHwgUE9SVF9QRUMsIHN0YXR1c19yZWcpOworCQkJYnJlYWs7CisJCWNhc2UgVVNCX1BPUlRfRkVBVF9TVVNQRU5EOgorCQkJaWYgKHRlbXAgJiBQT1JUX1JFU0VUKQorCQkJCWdvdG8gZXJyb3I7CisJCQlpZiAodGVtcCAmIFBPUlRfU1VTUEVORCkgeworCQkJCWlmICgodGVtcCAmIFBPUlRfUEUpID09IDApCisJCQkJCWdvdG8gZXJyb3I7CisJCQkJLyogcmVzdW1lIHNpZ25hbGluZyBmb3IgMjAgbXNlYyAqLworCQkJCXRlbXAgJj0gfihQT1JUX1JXQ19CSVRTIHwgUE9SVF9XQUtFX0JJVFMpOworCQkJCXdyaXRlbCh0ZW1wIHwgUE9SVF9SRVNVTUUsIHN0YXR1c19yZWcpOworCQkJCW94dS0+cmVzZXRfZG9uZVt3SW5kZXhdID0gamlmZmllcworCQkJCQkJKyBtc2Vjc190b19qaWZmaWVzKDIwKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFVTQl9QT1JUX0ZFQVRfQ19TVVNQRU5EOgorCQkJLyogd2UgYXV0by1jbGVhciB0aGlzIGZlYXR1cmUgKi8KKwkJCWJyZWFrOworCQljYXNlIFVTQl9QT1JUX0ZFQVRfUE9XRVI6CisJCQlpZiAoSENTX1BQQyhveHUtPmhjc19wYXJhbXMpKQorCQkJCXdyaXRlbCh0ZW1wICYgfihQT1JUX1JXQ19CSVRTIHwgUE9SVF9QT1dFUiksCisJCQkJCSAgc3RhdHVzX3JlZyk7CisJCQlicmVhazsKKwkJY2FzZSBVU0JfUE9SVF9GRUFUX0NfQ09OTkVDVElPTjoKKwkJCXdyaXRlbCgodGVtcCAmIH5QT1JUX1JXQ19CSVRTKSB8IFBPUlRfQ1NDLCBzdGF0dXNfcmVnKTsKKwkJCWJyZWFrOworCQljYXNlIFVTQl9QT1JUX0ZFQVRfQ19PVkVSX0NVUlJFTlQ6CisJCQl3cml0ZWwoKHRlbXAgJiB+UE9SVF9SV0NfQklUUykgfCBQT1JUX09DQywgc3RhdHVzX3JlZyk7CisJCQlicmVhazsKKwkJY2FzZSBVU0JfUE9SVF9GRUFUX0NfUkVTRVQ6CisJCQkvKiBHZXRQb3J0U3RhdHVzIGNsZWFycyByZXNldCAqLworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlnb3RvIGVycm9yOworCQl9CisJCXJlYWRsKCZveHUtPnJlZ3MtPmNvbW1hbmQpOwkvKiB1bmJsb2NrIHBvc3RlZCB3cml0ZSAqLworCQlicmVhazsKKwljYXNlIEdldEh1YkRlc2NyaXB0b3I6CisJCWVoY2lfaHViX2Rlc2NyaXB0b3Iob3h1LCAoc3RydWN0IHVzYl9odWJfZGVzY3JpcHRvciAqKQorCQkJYnVmKTsKKwkJYnJlYWs7CisJY2FzZSBHZXRIdWJTdGF0dXM6CisJCS8qIG5vIGh1Yi13aWRlIGZlYXR1cmUvc3RhdHVzIGZsYWdzICovCisJCW1lbXNldChidWYsIDAsIDQpOworCQlicmVhazsKKwljYXNlIEdldFBvcnRTdGF0dXM6CisJCWlmICghd0luZGV4IHx8IHdJbmRleCA+IHBvcnRzKQorCQkJZ290byBlcnJvcjsKKwkJd0luZGV4LS07CisJCXN0YXR1cyA9IDA7CisJCXRlbXAgPSByZWFkbChzdGF0dXNfcmVnKTsKKworCQkvKiB3UG9ydENoYW5nZSBiaXRzICovCisJCWlmICh0ZW1wICYgUE9SVF9DU0MpCisJCQlzdGF0dXMgfD0gMSA8PCBVU0JfUE9SVF9GRUFUX0NfQ09OTkVDVElPTjsKKwkJaWYgKHRlbXAgJiBQT1JUX1BFQykKKwkJCXN0YXR1cyB8PSAxIDw8IFVTQl9QT1JUX0ZFQVRfQ19FTkFCTEU7CisJCWlmICgodGVtcCAmIFBPUlRfT0NDKSAmJiAhaWdub3JlX29jKQorCQkJc3RhdHVzIHw9IDEgPDwgVVNCX1BPUlRfRkVBVF9DX09WRVJfQ1VSUkVOVDsKKworCQkvKiB3aG9ldmVyIHJlc3VtZXMgbXVzdCBHZXRQb3J0U3RhdHVzIHRvIGNvbXBsZXRlIGl0ISEgKi8KKwkJaWYgKHRlbXAgJiBQT1JUX1JFU1VNRSkgeworCisJCQkvKiBSZW1vdGUgV2FrZXVwIHJlY2VpdmVkPyAqLworCQkJaWYgKCFveHUtPnJlc2V0X2RvbmVbd0luZGV4XSkgeworCQkJCS8qIHJlc3VtZSBzaWduYWxpbmcgZm9yIDIwIG1zZWMgKi8KKwkJCQlveHUtPnJlc2V0X2RvbmVbd0luZGV4XSA9IGppZmZpZXMKKwkJCQkJCSsgbXNlY3NfdG9famlmZmllcygyMCk7CisJCQkJLyogY2hlY2sgdGhlIHBvcnQgYWdhaW4gKi8KKwkJCQltb2RfdGltZXIoJm94dV90b19oY2Qob3h1KS0+cmhfdGltZXIsCisJCQkJCQlveHUtPnJlc2V0X2RvbmVbd0luZGV4XSk7CisJCQl9CisKKwkJCS8qIHJlc3VtZSBjb21wbGV0ZWQ/ICovCisJCQllbHNlIGlmICh0aW1lX2FmdGVyX2VxKGppZmZpZXMsCisJCQkJCW94dS0+cmVzZXRfZG9uZVt3SW5kZXhdKSkgeworCQkJCXN0YXR1cyB8PSAxIDw8IFVTQl9QT1JUX0ZFQVRfQ19TVVNQRU5EOworCQkJCW94dS0+cmVzZXRfZG9uZVt3SW5kZXhdID0gMDsKKworCQkJCS8qIHN0b3AgcmVzdW1lIHNpZ25hbGluZyAqLworCQkJCXRlbXAgPSByZWFkbChzdGF0dXNfcmVnKTsKKwkJCQl3cml0ZWwodGVtcCAmIH4oUE9SVF9SV0NfQklUUyB8IFBPUlRfUkVTVU1FKSwKKwkJCQkJc3RhdHVzX3JlZyk7CisJCQkJcmV0dmFsID0gaGFuZHNoYWtlKG94dSwgc3RhdHVzX3JlZywKKwkJCQkJICAgUE9SVF9SRVNVTUUsIDAsIDIwMDAgLyogMm1zZWMgKi8pOworCQkJCWlmIChyZXR2YWwgIT0gMCkgeworCQkJCQlveHVfZXJyKG94dSwKKwkJCQkJCSJwb3J0ICVkIHJlc3VtZSBlcnJvciAlZFxuIiwKKwkJCQkJCXdJbmRleCArIDEsIHJldHZhbCk7CisJCQkJCWdvdG8gZXJyb3I7CisJCQkJfQorCQkJCXRlbXAgJj0gfihQT1JUX1NVU1BFTkR8UE9SVF9SRVNVTUV8KDM8PDEwKSk7CisJCQl9CisJCX0KKworCQkvKiB3aG9ldmVyIHJlc2V0cyBtdXN0IEdldFBvcnRTdGF0dXMgdG8gY29tcGxldGUgaXQhISAqLworCQlpZiAoKHRlbXAgJiBQT1JUX1JFU0VUKQorCQkJCSYmIHRpbWVfYWZ0ZXJfZXEoamlmZmllcywKKwkJCQkJb3h1LT5yZXNldF9kb25lW3dJbmRleF0pKSB7CisJCQlzdGF0dXMgfD0gMSA8PCBVU0JfUE9SVF9GRUFUX0NfUkVTRVQ7CisJCQlveHUtPnJlc2V0X2RvbmVbd0luZGV4XSA9IDA7CisKKwkJCS8qIGZvcmNlIHJlc2V0IHRvIGNvbXBsZXRlICovCisJCQl3cml0ZWwodGVtcCAmIH4oUE9SVF9SV0NfQklUUyB8IFBPUlRfUkVTRVQpLAorCQkJCQlzdGF0dXNfcmVnKTsKKwkJCS8qIFJFVklTSVQ6ICBzb21lIGhhcmR3YXJlIG5lZWRzIDU1MCsgdXNlYyB0byBjbGVhcgorCQkJICogdGhpcyBiaXQ7IHNlZW1zIHRvbyBsb25nIHRvIHNwaW4gcm91dGluZWx5Li4uCisJCQkgKi8KKwkJCXJldHZhbCA9IGhhbmRzaGFrZShveHUsIHN0YXR1c19yZWcsCisJCQkJCVBPUlRfUkVTRVQsIDAsIDc1MCk7CisJCQlpZiAocmV0dmFsICE9IDApIHsKKwkJCQlveHVfZXJyKG94dSwgInBvcnQgJWQgcmVzZXQgZXJyb3IgJWRcbiIsCisJCQkJCXdJbmRleCArIDEsIHJldHZhbCk7CisJCQkJZ290byBlcnJvcjsKKwkJCX0KKworCQkJLyogc2VlIHdoYXQgd2UgZm91bmQgb3V0ICovCisJCQl0ZW1wID0gY2hlY2tfcmVzZXRfY29tcGxldGUob3h1LCB3SW5kZXgsIHN0YXR1c19yZWcsCisJCQkJCXJlYWRsKHN0YXR1c19yZWcpKTsKKwkJfQorCisJCS8qIHRyYW5zZmVyIGRlZGljYXRlZCBwb3J0cyB0byB0aGUgY29tcGFuaW9uIGhjICovCisJCWlmICgodGVtcCAmIFBPUlRfQ09OTkVDVCkgJiYKKwkJCQl0ZXN0X2JpdCh3SW5kZXgsICZveHUtPmNvbXBhbmlvbl9wb3J0cykpIHsKKwkJCXRlbXAgJj0gflBPUlRfUldDX0JJVFM7CisJCQl0ZW1wIHw9IFBPUlRfT1dORVI7CisJCQl3cml0ZWwodGVtcCwgc3RhdHVzX3JlZyk7CisJCQlveHVfZGJnKG94dSwgInBvcnQgJWQgLS0+IGNvbXBhbmlvblxuIiwgd0luZGV4ICsgMSk7CisJCQl0ZW1wID0gcmVhZGwoc3RhdHVzX3JlZyk7CisJCX0KKworCQkvKgorCQkgKiBFdmVuIGlmIE9XTkVSIGlzIHNldCwgdGhlcmUncyBubyBoYXJtIGxldHRpbmcga2h1YmQKKwkJICogc2VlIHRoZSB3UG9ydFN0YXR1cyB2YWx1ZXMgKHRoZXkgc2hvdWxkIGFsbCBiZSAwIGV4Y2VwdAorCQkgKiBmb3IgUE9SVF9QT1dFUiBhbnl3YXkpLgorCQkgKi8KKworCQlpZiAodGVtcCAmIFBPUlRfQ09OTkVDVCkgeworCQkJc3RhdHVzIHw9IDEgPDwgVVNCX1BPUlRfRkVBVF9DT05ORUNUSU9OOworCQkJLyogc3RhdHVzIG1heSBiZSBmcm9tIGludGVncmF0ZWQgVFQgKi8KKwkJCXN0YXR1cyB8PSBveHVfcG9ydF9zcGVlZChveHUsIHRlbXApOworCQl9CisJCWlmICh0ZW1wICYgUE9SVF9QRSkKKwkJCXN0YXR1cyB8PSAxIDw8IFVTQl9QT1JUX0ZFQVRfRU5BQkxFOworCQlpZiAodGVtcCAmIChQT1JUX1NVU1BFTkR8UE9SVF9SRVNVTUUpKQorCQkJc3RhdHVzIHw9IDEgPDwgVVNCX1BPUlRfRkVBVF9TVVNQRU5EOworCQlpZiAodGVtcCAmIFBPUlRfT0MpCisJCQlzdGF0dXMgfD0gMSA8PCBVU0JfUE9SVF9GRUFUX09WRVJfQ1VSUkVOVDsKKwkJaWYgKHRlbXAgJiBQT1JUX1JFU0VUKQorCQkJc3RhdHVzIHw9IDEgPDwgVVNCX1BPUlRfRkVBVF9SRVNFVDsKKwkJaWYgKHRlbXAgJiBQT1JUX1BPV0VSKQorCQkJc3RhdHVzIHw9IDEgPDwgVVNCX1BPUlRfRkVBVF9QT1dFUjsKKworI2lmbmRlZglPWFVfVkVSQk9TRV9ERUJVRworCWlmIChzdGF0dXMgJiB+MHhmZmZmKQkvKiBvbmx5IGlmIHdQb3J0Q2hhbmdlIGlzIGludGVyZXN0aW5nICovCisjZW5kaWYKKwkJZGJnX3BvcnQob3h1LCAiR2V0U3RhdHVzIiwgd0luZGV4ICsgMSwgdGVtcCk7CisJCXB1dF91bmFsaWduZWQoY3B1X3RvX2xlMzIoc3RhdHVzKSwgKF9fbGUzMiAqKSBidWYpOworCQlicmVhazsKKwljYXNlIFNldEh1YkZlYXR1cmU6CisJCXN3aXRjaCAod1ZhbHVlKSB7CisJCWNhc2UgQ19IVUJfTE9DQUxfUE9XRVI6CisJCWNhc2UgQ19IVUJfT1ZFUl9DVVJSRU5UOgorCQkJLyogbm8gaHViLXdpZGUgZmVhdHVyZS9zdGF0dXMgZmxhZ3MgKi8KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZ290byBlcnJvcjsKKwkJfQorCQlicmVhazsKKwljYXNlIFNldFBvcnRGZWF0dXJlOgorCQlzZWxlY3RvciA9IHdJbmRleCA+PiA4OworCQl3SW5kZXggJj0gMHhmZjsKKwkJaWYgKCF3SW5kZXggfHwgd0luZGV4ID4gcG9ydHMpCisJCQlnb3RvIGVycm9yOworCQl3SW5kZXgtLTsKKwkJdGVtcCA9IHJlYWRsKHN0YXR1c19yZWcpOworCQlpZiAodGVtcCAmIFBPUlRfT1dORVIpCisJCQlicmVhazsKKworCQl0ZW1wICY9IH5QT1JUX1JXQ19CSVRTOworCQlzd2l0Y2ggKHdWYWx1ZSkgeworCQljYXNlIFVTQl9QT1JUX0ZFQVRfU1VTUEVORDoKKwkJCWlmICgodGVtcCAmIFBPUlRfUEUpID09IDAKKwkJCQkJfHwgKHRlbXAgJiBQT1JUX1JFU0VUKSAhPSAwKQorCQkJCWdvdG8gZXJyb3I7CisJCQlpZiAoZGV2aWNlX21heV93YWtldXAoJmhjZC0+c2VsZi5yb290X2h1Yi0+ZGV2KSkKKwkJCQl0ZW1wIHw9IFBPUlRfV0FLRV9CSVRTOworCQkJd3JpdGVsKHRlbXAgfCBQT1JUX1NVU1BFTkQsIHN0YXR1c19yZWcpOworCQkJYnJlYWs7CisJCWNhc2UgVVNCX1BPUlRfRkVBVF9QT1dFUjoKKwkJCWlmIChIQ1NfUFBDKG94dS0+aGNzX3BhcmFtcykpCisJCQkJd3JpdGVsKHRlbXAgfCBQT1JUX1BPV0VSLCBzdGF0dXNfcmVnKTsKKwkJCWJyZWFrOworCQljYXNlIFVTQl9QT1JUX0ZFQVRfUkVTRVQ6CisJCQlpZiAodGVtcCAmIFBPUlRfUkVTVU1FKQorCQkJCWdvdG8gZXJyb3I7CisJCQkvKiBsaW5lIHN0YXR1cyBiaXRzIG1heSByZXBvcnQgdGhpcyBhcyBsb3cgc3BlZWQsCisJCQkgKiB3aGljaCBjYW4gYmUgZmluZSBpZiB0aGlzIHJvb3QgaHViIGhhcyBhCisJCQkgKiB0cmFuc2FjdGlvbiB0cmFuc2xhdG9yIGJ1aWx0IGluLgorCQkJICovCisJCQlveHVfdmRiZyhveHUsICJwb3J0ICVkIHJlc2V0XG4iLCB3SW5kZXggKyAxKTsKKwkJCXRlbXAgfD0gUE9SVF9SRVNFVDsKKwkJCXRlbXAgJj0gflBPUlRfUEU7CisKKwkJCS8qCisJCQkgKiBjYWxsZXIgbXVzdCB3YWl0LCB0aGVuIGNhbGwgR2V0UG9ydFN0YXR1cworCQkJICogdXNiIDIuMCBzcGVjIHNheXMgNTAgbXMgcmVzZXRzIG9uIHJvb3QKKwkJCSAqLworCQkJb3h1LT5yZXNldF9kb25lW3dJbmRleF0gPSBqaWZmaWVzCisJCQkJCSsgbXNlY3NfdG9famlmZmllcyg1MCk7CisJCQl3cml0ZWwodGVtcCwgc3RhdHVzX3JlZyk7CisJCQlicmVhazsKKworCQkvKiBGb3IgZG93bnN0cmVhbSBmYWNpbmcgcG9ydHMgKHRoZXNlKTogIG9uZSBodWIgcG9ydCBpcyBwdXQKKwkJICogaW50byB0ZXN0IG1vZGUgYWNjb3JkaW5nIHRvIFVTQjIgMTEuMjQuMi4xMywgdGhlbiB0aGUgaHViCisJCSAqIG11c3QgYmUgcmVzZXQgKHdoaWNoIGZvciByb290IGh1YiBub3cgbWVhbnMgcm1tb2QrbW9kcHJvYmUsCisJCSAqIG9yIGVsc2Ugc3lzdGVtIHJlYm9vdCkuICBTZWUgRUhDSSAyLjMuOSBhbmQgNC4xNCBmb3IgaW5mbworCQkgKiBhYm91dCB0aGUgRUhDSS1zcGVjaWZpYyBzdHVmZi4KKwkJICovCisJCWNhc2UgVVNCX1BPUlRfRkVBVF9URVNUOgorCQkJaWYgKCFzZWxlY3RvciB8fCBzZWxlY3RvciA+IDUpCisJCQkJZ290byBlcnJvcjsKKwkJCWVoY2lfcXVpZXNjZShveHUpOworCQkJZWhjaV9oYWx0KG94dSk7CisJCQl0ZW1wIHw9IHNlbGVjdG9yIDw8IDE2OworCQkJd3JpdGVsKHRlbXAsIHN0YXR1c19yZWcpOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWdvdG8gZXJyb3I7CisJCX0KKwkJcmVhZGwoJm94dS0+cmVncy0+Y29tbWFuZCk7CS8qIHVuYmxvY2sgcG9zdGVkIHdyaXRlcyAqLworCQlicmVhazsKKworCWRlZmF1bHQ6CitlcnJvcjoKKwkJLyogInN0YWxsIiBvbiBlcnJvciAqLworCQlyZXR2YWwgPSAtRVBJUEU7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm94dS0+bG9jaywgZmxhZ3MpOworCXJldHVybiByZXR2YWw7Cit9CisKKyNpZmRlZiBDT05GSUdfUE0KKworc3RhdGljIGludCBveHVfYnVzX3N1c3BlbmQoc3RydWN0IHVzYl9oY2QgKmhjZCkKK3sKKwlzdHJ1Y3Qgb3h1X2hjZCAqb3h1ID0gaGNkX3RvX294dShoY2QpOworCWludCBwb3J0OworCWludCBtYXNrOworCisJb3h1X2RiZyhveHUsICJzdXNwZW5kIHJvb3QgaHViXG4iKTsKKworCWlmICh0aW1lX2JlZm9yZShqaWZmaWVzLCBveHUtPm5leHRfc3RhdGVjaGFuZ2UpKQorCQltc2xlZXAoNSk7CisKKwlwb3J0ID0gSENTX05fUE9SVFMob3h1LT5oY3NfcGFyYW1zKTsKKwlzcGluX2xvY2tfaXJxKCZveHUtPmxvY2spOworCisJLyogc3RvcCBzY2hlZHVsZXMsIGNsZWFuIGFueSBjb21wbGV0ZWQgd29yayAqLworCWlmIChIQ19JU19SVU5OSU5HKGhjZC0+c3RhdGUpKSB7CisJCWVoY2lfcXVpZXNjZShveHUpOworCQloY2QtPnN0YXRlID0gSENfU1RBVEVfUVVJRVNDSU5HOworCX0KKwlveHUtPmNvbW1hbmQgPSByZWFkbCgmb3h1LT5yZWdzLT5jb21tYW5kKTsKKwlpZiAob3h1LT5yZWNsYWltKQorCQlveHUtPnJlY2xhaW1fcmVhZHkgPSAxOworCWVoY2lfd29yayhveHUpOworCisJLyogVW5saWtlIG90aGVyIFVTQiBob3N0IGNvbnRyb2xsZXIgdHlwZXMsIEVIQ0kgZG9lc24ndCBoYXZlCisJICogYW55IG5vdGlvbiBvZiAiZ2xvYmFsIiBvciBidXMtd2lkZSBzdXNwZW5kLiAgVGhlIGRyaXZlciBoYXMKKwkgKiB0byBtYW51YWxseSBzdXNwZW5kIGFsbCB0aGUgYWN0aXZlIHVuc3VzcGVuZGVkIHBvcnRzLCBhbmQKKwkgKiB0aGVuIG1hbnVhbGx5IHJlc3VtZSB0aGVtIGluIHRoZSBidXNfcmVzdW1lKCkgcm91dGluZS4KKwkgKi8KKwlveHUtPmJ1c19zdXNwZW5kZWQgPSAwOworCXdoaWxlIChwb3J0LS0pIHsKKwkJdTMyIF9faW9tZW0gKnJlZyA9ICZveHUtPnJlZ3MtPnBvcnRfc3RhdHVzW3BvcnRdOworCQl1MzIgdDEgPSByZWFkbChyZWcpICYgflBPUlRfUldDX0JJVFM7CisJCXUzMiB0MiA9IHQxOworCisJCS8qIGtlZXAgdHJhY2sgb2Ygd2hpY2ggcG9ydHMgd2Ugc3VzcGVuZCAqLworCQlpZiAoKHQxICYgUE9SVF9QRSkgJiYgISh0MSAmIFBPUlRfT1dORVIpICYmCisJCQkJISh0MSAmIFBPUlRfU1VTUEVORCkpIHsKKwkJCXQyIHw9IFBPUlRfU1VTUEVORDsKKwkJCXNldF9iaXQocG9ydCwgJm94dS0+YnVzX3N1c3BlbmRlZCk7CisJCX0KKworCQkvKiBlbmFibGUgcmVtb3RlIHdha2V1cCBvbiBhbGwgcG9ydHMgKi8KKwkJaWYgKGRldmljZV9tYXlfd2FrZXVwKCZoY2QtPnNlbGYucm9vdF9odWItPmRldikpCisJCQl0MiB8PSBQT1JUX1dLT0NfRXxQT1JUX1dLRElTQ19FfFBPUlRfV0tDT05OX0U7CisJCWVsc2UKKwkJCXQyICY9IH4oUE9SVF9XS09DX0V8UE9SVF9XS0RJU0NfRXxQT1JUX1dLQ09OTl9FKTsKKworCQlpZiAodDEgIT0gdDIpIHsKKwkJCW94dV92ZGJnKG94dSwgInBvcnQgJWQsICUwOHggLT4gJTA4eFxuIiwKKwkJCQlwb3J0ICsgMSwgdDEsIHQyKTsKKwkJCXdyaXRlbCh0MiwgcmVnKTsKKwkJfQorCX0KKworCS8qIHR1cm4gb2ZmIG5vdy1pZGxlIEhDICovCisJZGVsX3RpbWVyX3N5bmMoJm94dS0+d2F0Y2hkb2cpOworCWVoY2lfaGFsdChveHUpOworCWhjZC0+c3RhdGUgPSBIQ19TVEFURV9TVVNQRU5ERUQ7CisKKwkvKiBhbGxvdyByZW1vdGUgd2FrZXVwICovCisJbWFzayA9IElOVFJfTUFTSzsKKwlpZiAoIWRldmljZV9tYXlfd2FrZXVwKCZoY2QtPnNlbGYucm9vdF9odWItPmRldikpCisJCW1hc2sgJj0gflNUU19QQ0Q7CisJd3JpdGVsKG1hc2ssICZveHUtPnJlZ3MtPmludHJfZW5hYmxlKTsKKwlyZWFkbCgmb3h1LT5yZWdzLT5pbnRyX2VuYWJsZSk7CisKKwlveHUtPm5leHRfc3RhdGVjaGFuZ2UgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygxMCk7CisJc3Bpbl91bmxvY2tfaXJxKCZveHUtPmxvY2spOworCXJldHVybiAwOworfQorCisvKiBDYWxsZXIgaGFzIGxvY2tlZCB0aGUgcm9vdCBodWIsIGFuZCBzaG91bGQgcmVzZXQvcmVpbml0IG9uIGVycm9yICovCitzdGF0aWMgaW50IG94dV9idXNfcmVzdW1lKHN0cnVjdCB1c2JfaGNkICpoY2QpCit7CisJc3RydWN0IG94dV9oY2QgKm94dSA9IGhjZF90b19veHUoaGNkKTsKKwl1MzIgdGVtcDsKKwlpbnQgaTsKKworCWlmICh0aW1lX2JlZm9yZShqaWZmaWVzLCBveHUtPm5leHRfc3RhdGVjaGFuZ2UpKQorCQltc2xlZXAoNSk7CisJc3Bpbl9sb2NrX2lycSgmb3h1LT5sb2NrKTsKKworCS8qIElkZWFsbHkgYW5kIHdlJ3ZlIGdvdCBhIHJlYWwgcmVzdW1lIGhlcmUsIGFuZCBubyBwb3J0J3MgcG93ZXIKKwkgKiB3YXMgbG9zdC4gIChGb3IgUENJLCB0aGF0IG1lYW5zIFZhdXggd2FzIG1haW50YWluZWQuKSAgQnV0IHdlCisJICogY291bGQgaW5zdGVhZCBiZSByZXN0b3JpbmcgYSBzd3N1c3Agc25hcHNob3QgLS0gc28gdGhhdCBCSU9TIHdhcworCSAqIHRoZSBsYXN0IHVzZXIgb2YgdGhlIGNvbnRyb2xsZXIsIG5vdCByZXNldC9wbSBoYXJkd2FyZSBrZWVwaW5nCisJICogc3RhdGUgd2UgZ2F2ZSB0byBpdC4KKwkgKi8KKwl0ZW1wID0gcmVhZGwoJm94dS0+cmVncy0+aW50cl9lbmFibGUpOworCW94dV9kYmcob3h1LCAicmVzdW1lIHJvb3QgaHViJXNcbiIsIHRlbXAgPyAiIiA6ICIgYWZ0ZXIgcG93ZXIgbG9zcyIpOworCisJLyogYXQgbGVhc3Qgc29tZSBBUE0gaW1wbGVtZW50YXRpb25zIHdpbGwgdHJ5IHRvIGRlbGl2ZXIKKwkgKiBJUlFzIHJpZ2h0IGF3YXksIHNvIGRlbGF5IHRoZW0gdW50aWwgd2UncmUgcmVhZHkuCisJICovCisJd3JpdGVsKDAsICZveHUtPnJlZ3MtPmludHJfZW5hYmxlKTsKKworCS8qIHJlLWluaXQgb3BlcmF0aW9uYWwgcmVnaXN0ZXJzICovCisJd3JpdGVsKDAsICZveHUtPnJlZ3MtPnNlZ21lbnQpOworCXdyaXRlbChveHUtPnBlcmlvZGljX2RtYSwgJm94dS0+cmVncy0+ZnJhbWVfbGlzdCk7CisJd3JpdGVsKCh1MzIpIG94dS0+YXN5bmMtPnFoX2RtYSwgJm94dS0+cmVncy0+YXN5bmNfbmV4dCk7CisKKwkvKiByZXN0b3JlIENNRF9SVU4sIGZyYW1lbGlzdCBzaXplLCBhbmQgaXJxIHRocmVzaG9sZCAqLworCXdyaXRlbChveHUtPmNvbW1hbmQsICZveHUtPnJlZ3MtPmNvbW1hbmQpOworCisJLyogU29tZSBjb250cm9sbGVyL2Zpcm13YXJlIGNvbWJpbmF0aW9ucyBuZWVkIGEgZGVsYXkgZHVyaW5nIHdoaWNoCisJICogdGhleSBzZXQgdXAgdGhlIHBvcnQgc3RhdHVzZXMuICBTZWUgQnVnemlsbGEgIzgxOTAuICovCisJbWRlbGF5KDgpOworCisJLyogbWFudWFsbHkgcmVzdW1lIHRoZSBwb3J0cyB3ZSBzdXNwZW5kZWQgZHVyaW5nIGJ1c19zdXNwZW5kKCkgKi8KKwlpID0gSENTX05fUE9SVFMob3h1LT5oY3NfcGFyYW1zKTsKKwl3aGlsZSAoaS0tKSB7CisJCXRlbXAgPSByZWFkbCgmb3h1LT5yZWdzLT5wb3J0X3N0YXR1c1tpXSk7CisJCXRlbXAgJj0gfihQT1JUX1JXQ19CSVRTCisJCQl8IFBPUlRfV0tPQ19FIHwgUE9SVF9XS0RJU0NfRSB8IFBPUlRfV0tDT05OX0UpOworCQlpZiAodGVzdF9iaXQoaSwgJm94dS0+YnVzX3N1c3BlbmRlZCkgJiYgKHRlbXAgJiBQT1JUX1NVU1BFTkQpKSB7CisJCQlveHUtPnJlc2V0X2RvbmVbaV0gPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygyMCk7CisJCQl0ZW1wIHw9IFBPUlRfUkVTVU1FOworCQl9CisJCXdyaXRlbCh0ZW1wLCAmb3h1LT5yZWdzLT5wb3J0X3N0YXR1c1tpXSk7CisJfQorCWkgPSBIQ1NfTl9QT1JUUyhveHUtPmhjc19wYXJhbXMpOworCW1kZWxheSgyMCk7CisJd2hpbGUgKGktLSkgeworCQl0ZW1wID0gcmVhZGwoJm94dS0+cmVncy0+cG9ydF9zdGF0dXNbaV0pOworCQlpZiAodGVzdF9iaXQoaSwgJm94dS0+YnVzX3N1c3BlbmRlZCkgJiYgKHRlbXAgJiBQT1JUX1NVU1BFTkQpKSB7CisJCQl0ZW1wICY9IH4oUE9SVF9SV0NfQklUUyB8IFBPUlRfUkVTVU1FKTsKKwkJCXdyaXRlbCh0ZW1wLCAmb3h1LT5yZWdzLT5wb3J0X3N0YXR1c1tpXSk7CisJCQlveHVfdmRiZyhveHUsICJyZXN1bWVkIHBvcnQgJWRcbiIsIGkgKyAxKTsKKwkJfQorCX0KKwkodm9pZCkgcmVhZGwoJm94dS0+cmVncy0+Y29tbWFuZCk7CisKKwkvKiBtYXliZSByZS1hY3RpdmF0ZSB0aGUgc2NoZWR1bGUocykgKi8KKwl0ZW1wID0gMDsKKwlpZiAob3h1LT5hc3luYy0+cWhfbmV4dC5xaCkKKwkJdGVtcCB8PSBDTURfQVNFOworCWlmIChveHUtPnBlcmlvZGljX3NjaGVkKQorCQl0ZW1wIHw9IENNRF9QU0U7CisJaWYgKHRlbXApIHsKKwkJb3h1LT5jb21tYW5kIHw9IHRlbXA7CisJCXdyaXRlbChveHUtPmNvbW1hbmQsICZveHUtPnJlZ3MtPmNvbW1hbmQpOworCX0KKworCW94dS0+bmV4dF9zdGF0ZWNoYW5nZSA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDUpOworCWhjZC0+c3RhdGUgPSBIQ19TVEFURV9SVU5OSU5HOworCisJLyogTm93IHdlIGNhbiBzYWZlbHkgcmUtZW5hYmxlIGlycXMgKi8KKwl3cml0ZWwoSU5UUl9NQVNLLCAmb3h1LT5yZWdzLT5pbnRyX2VuYWJsZSk7CisKKwlzcGluX3VubG9ja19pcnEoJm94dS0+bG9jayk7CisJcmV0dXJuIDA7Cit9CisKKyNlbHNlCisKK3N0YXRpYyBpbnQgb3h1X2J1c19zdXNwZW5kKHN0cnVjdCB1c2JfaGNkICpoY2QpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb3h1X2J1c19yZXN1bWUoc3RydWN0IHVzYl9oY2QgKmhjZCkKK3sKKwlyZXR1cm4gMDsKK30KKworI2VuZGlmCS8qIENPTkZJR19QTSAqLworCitzdGF0aWMgY29uc3Qgc3RydWN0IGhjX2RyaXZlciBveHVfaGNfZHJpdmVyID0geworCS5kZXNjcmlwdGlvbiA9CQkib3h1MjEwaHBfaGNkIiwKKwkucHJvZHVjdF9kZXNjID0JCSJveHUyMTBocCBIQ0QiLAorCS5oY2RfcHJpdl9zaXplID0Jc2l6ZW9mKHN0cnVjdCBveHVfaGNkKSwKKworCS8qCisJICogR2VuZXJpYyBoYXJkd2FyZSBsaW5rYWdlCisJICovCisJLmlycSA9CQkJb3h1X2lycSwKKwkuZmxhZ3MgPQkJSENEX01FTU9SWSB8IEhDRF9VU0IyLAorCisJLyoKKwkgKiBCYXNpYyBsaWZlY3ljbGUgb3BlcmF0aW9ucworCSAqLworCS5yZXNldCA9CQlveHVfcmVzZXQsCisJLnN0YXJ0ID0JCW94dV9ydW4sCisJLnN0b3AgPQkJCW94dV9zdG9wLAorCS5zaHV0ZG93biA9CQlveHVfc2h1dGRvd24sCisKKwkvKgorCSAqIE1hbmFnaW5nIGkvbyByZXF1ZXN0cyBhbmQgYXNzb2NpYXRlZCBkZXZpY2UgcmVzb3VyY2VzCisJICovCisJLnVyYl9lbnF1ZXVlID0JCW94dV91cmJfZW5xdWV1ZSwKKwkudXJiX2RlcXVldWUgPQkJb3h1X3VyYl9kZXF1ZXVlLAorCS5lbmRwb2ludF9kaXNhYmxlID0Jb3h1X2VuZHBvaW50X2Rpc2FibGUsCisKKwkvKgorCSAqIFNjaGVkdWxpbmcgc3VwcG9ydAorCSAqLworCS5nZXRfZnJhbWVfbnVtYmVyID0Jb3h1X2dldF9mcmFtZSwKKworCS8qCisJICogUm9vdCBodWIgc3VwcG9ydAorCSAqLworCS5odWJfc3RhdHVzX2RhdGEgPQlveHVfaHViX3N0YXR1c19kYXRhLAorCS5odWJfY29udHJvbCA9CQlveHVfaHViX2NvbnRyb2wsCisJLmJ1c19zdXNwZW5kID0JCW94dV9idXNfc3VzcGVuZCwKKwkuYnVzX3Jlc3VtZSA9CQlveHVfYnVzX3Jlc3VtZSwKK307CisKKy8qCisgKiBNb2R1bGUgc3R1ZmYKKyAqLworCitzdGF0aWMgdm9pZCBveHVfY29uZmlndXJhdGlvbihzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LCB2b2lkICpiYXNlKQoreworCXUzMiB0bXA7CisKKwkvKiBJbml0aWFsaXplIHRvcCBsZXZlbCByZWdpc3RlcnMuCisJICogRmlyc3Qgd3JpdGUgZXZlcgorCSAqLworCW94dV93cml0ZWwoYmFzZSwgT1hVX0hPU1RJRkNPTkZJRywgMHgwMDAwMDM3RCk7CisJb3h1X3dyaXRlbChiYXNlLCBPWFVfU09GVFJFU0VULCBPWFVfU1JFU0VUKTsKKwlveHVfd3JpdGVsKGJhc2UsIE9YVV9IT1NUSUZDT05GSUcsIDB4MDAwMDAzN0QpOworCisJdG1wID0gb3h1X3JlYWRsKGJhc2UsIE9YVV9QSU9CVVJTVFJFQURDVFJMKTsKKwlveHVfd3JpdGVsKGJhc2UsIE9YVV9QSU9CVVJTVFJFQURDVFJMLCB0bXAgfCAweDAwNDApOworCisJb3h1X3dyaXRlbChiYXNlLCBPWFVfQVNPLCBPWFVfU1BIUE9FTiB8IE9YVV9PVlJDQ1VSUFVQREVOIHwKKwkJCQkJT1hVX0NPTVBBUkFUT1IgfCBPWFVfQVNPX09QKTsKKworCXRtcCA9IG94dV9yZWFkbChiYXNlLCBPWFVfQ0xLQ1RSTF9TRVQpOworCW94dV93cml0ZWwoYmFzZSwgT1hVX0NMS0NUUkxfU0VULCB0bXAgfCBPWFVfU1lTQ0xLRU4gfCBPWFVfVVNCT1RHQ0xLRU4pOworCisJLyogQ2xlYXIgYWxsIHRvcCBpbnRlcnJ1cHQgZW5hYmxlICovCisJb3h1X3dyaXRlbChiYXNlLCBPWFVfQ0hJUElSUUVOX0NMUiwgMHhmZik7CisKKwkvKiBDbGVhciBhbGwgdG9wIGludGVycnVwdCBzdGF0dXMgKi8KKwlveHVfd3JpdGVsKGJhc2UsIE9YVV9DSElQSVJRU1RBVFVTLCAweGZmKTsKKworCS8qIEVuYWJsZSBhbGwgbmVlZGVkIHRvcCBpbnRlcnJ1cHQgZXhjZXB0IE9URyBTUEggY29yZSAqLworCW94dV93cml0ZWwoYmFzZSwgT1hVX0NISVBJUlFFTl9TRVQsIE9YVV9VU0JTUEhMUFdVSSB8IE9YVV9VU0JPVEdMUFdVSSk7Cit9CisKK3N0YXRpYyBpbnQgb3h1X3ZlcmlmeV9pZChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LCB2b2lkICpiYXNlKQoreworCXUzMiBpZDsKKwljaGFyICpib1tdID0geworCQkicmVzZXJ2ZWQiLAorCQkiMTI4LXBpbiBMUUZQIiwKKwkJIjg0LXBpbiBURkJHQSIsCisJCSJyZXNlcnZlZCIsCisJfTsKKworCS8qIFJlYWQgY29udHJvbGxlciBzaWduYXR1cmUgcmVnaXN0ZXIgdG8gZmluZCBhIG1hdGNoICovCisJaWQgPSBveHVfcmVhZGwoYmFzZSwgT1hVX0RFVklDRUlEKTsKKwlkZXZfaW5mbygmcGRldi0+ZGV2LCAiZGV2aWNlIElEICV4XG4iLCBpZCk7CisJaWYgKChpZCAmIE9YVV9SRVZfTUFTSykgIT0gKE9YVV9SRVZfMjEwMCA8PCBPWFVfUkVWX1NISUZUKSkKKwkJcmV0dXJuIC0xOworCisJZGV2X2luZm8oJnBkZXYtPmRldiwgImZvdW5kIGRldmljZSAleCAlcyAoJTA0eDolMDR4KVxuIiwKKwkJaWQgPj4gT1hVX1JFVl9TSElGVCwKKwkJYm9bKGlkICYgT1hVX0JPX01BU0spID4+IE9YVV9CT19TSElGVF0sCisJCShpZCAmIE9YVV9NQUpfUkVWX01BU0spID4+IE9YVV9NQUpfUkVWX1NISUZULAorCQkoaWQgJiBPWFVfTUlOX1JFVl9NQVNLKSA+PiBPWFVfTUlOX1JFVl9TSElGVCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBoY19kcml2ZXIgb3h1X2hjX2RyaXZlcjsKK3N0YXRpYyBzdHJ1Y3QgdXNiX2hjZCAqb3h1X2NyZWF0ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAorCQkJCXVuc2lnbmVkIGxvbmcgbWVtc3RhcnQsIHVuc2lnbmVkIGxvbmcgbWVtbGVuLAorCQkJCXZvaWQgKmJhc2UsIGludCBpcnEsIGludCBvdGcpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKKworCXN0cnVjdCB1c2JfaGNkICpoY2Q7CisJc3RydWN0IG94dV9oY2QgKm94dTsKKwlpbnQgcmV0OworCisJLyogU2V0IGVuZGlhbiBtb2RlIGFuZCBob3N0IG1vZGUgKi8KKwlveHVfd3JpdGVsKGJhc2UgKyAob3RnID8gT1hVX09UR19DT1JFX09GRlNFVCA6IE9YVV9TUEhfQ09SRV9PRkZTRVQpLAorCQkJCU9YVV9VU0JNT0RFLAorCQkJCU9YVV9DTV9IT1NUX09OTFkgfCBPWFVfRVNfTElUVExFIHwgT1hVX1ZCUFMpOworCisJaGNkID0gdXNiX2NyZWF0ZV9oY2QoJm94dV9oY19kcml2ZXIsIGRldiwKKwkJCQlvdGcgPyAib3h1MjEwaHBfb3RnIiA6ICJveHUyMTBocF9zcGgiKTsKKwlpZiAoIWhjZCkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwloY2QtPnJzcmNfc3RhcnQgPSBtZW1zdGFydDsKKwloY2QtPnJzcmNfbGVuID0gbWVtbGVuOworCWhjZC0+cmVncyA9IGJhc2U7CisJaGNkLT5pcnEgPSBpcnE7CisJaGNkLT5zdGF0ZSA9IEhDX1NUQVRFX0hBTFQ7CisKKwlveHUgPSBoY2RfdG9fb3h1KGhjZCk7CisJb3h1LT5pc19vdGcgPSBvdGc7CisKKwlyZXQgPSB1c2JfYWRkX2hjZChoY2QsIGlycSwgSVJRRl9TSEFSRUQpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gRVJSX1BUUihyZXQpOworCisJcmV0dXJuIGhjZDsKK30KKworc3RhdGljIGludCBveHVfaW5pdChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAorCQkJCXVuc2lnbmVkIGxvbmcgbWVtc3RhcnQsIHVuc2lnbmVkIGxvbmcgbWVtbGVuLAorCQkJCXZvaWQgKmJhc2UsIGludCBpcnEpCit7CisJc3RydWN0IG94dV9pbmZvICppbmZvID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IHVzYl9oY2QgKmhjZDsKKwlpbnQgcmV0OworCisJLyogRmlyc3QgdGltZSBjb25maWd1cmF0aW9uIGF0IHN0YXJ0IHVwICovCisJb3h1X2NvbmZpZ3VyYXRpb24ocGRldiwgYmFzZSk7CisKKwlyZXQgPSBveHVfdmVyaWZ5X2lkKHBkZXYsIGJhc2UpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAibm8gZGV2aWNlcyBmb3VuZCFcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwkvKiBDcmVhdGUgdGhlIE9URyBjb250cm9sbGVyICovCisJaGNkID0gb3h1X2NyZWF0ZShwZGV2LCBtZW1zdGFydCwgbWVtbGVuLCBiYXNlLCBpcnEsIDEpOworCWlmIChJU19FUlIoaGNkKSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjYW5ub3QgY3JlYXRlIE9URyBjb250cm9sbGVyIVxuIik7CisJCXJldCA9IFBUUl9FUlIoaGNkKTsKKwkJZ290byBlcnJvcl9jcmVhdGVfb3RnOworCX0KKwlpbmZvLT5oY2RbMF0gPSBoY2Q7CisKKwkvKiBDcmVhdGUgdGhlIFNQSCBob3N0IGNvbnRyb2xsZXIgKi8KKwloY2QgPSBveHVfY3JlYXRlKHBkZXYsIG1lbXN0YXJ0LCBtZW1sZW4sIGJhc2UsIGlycSwgMCk7CisJaWYgKElTX0VSUihoY2QpKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImNhbm5vdCBjcmVhdGUgU1BIIGNvbnRyb2xsZXIhXG4iKTsKKwkJcmV0ID0gUFRSX0VSUihoY2QpOworCQlnb3RvIGVycm9yX2NyZWF0ZV9zcGg7CisJfQorCWluZm8tPmhjZFsxXSA9IGhjZDsKKworCW94dV93cml0ZWwoYmFzZSwgT1hVX0NISVBJUlFFTl9TRVQsCisJCW94dV9yZWFkbChiYXNlLCBPWFVfQ0hJUElSUUVOX1NFVCkgfCAzKTsKKworCXJldHVybiAwOworCitlcnJvcl9jcmVhdGVfc3BoOgorCXVzYl9yZW1vdmVfaGNkKGluZm8tPmhjZFswXSk7CisJdXNiX3B1dF9oY2QoaW5mby0+aGNkWzBdKTsKKworZXJyb3JfY3JlYXRlX290ZzoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG94dV9kcnZfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwl2b2lkICpiYXNlOworCXVuc2lnbmVkIGxvbmcgbWVtc3RhcnQsIG1lbWxlbjsKKwlpbnQgaXJxLCByZXQ7CisJc3RydWN0IG94dV9pbmZvICppbmZvOworCisJaWYgKHVzYl9kaXNhYmxlZCgpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCS8qCisJICogR2V0IHRoZSBwbGF0Zm9ybSByZXNvdXJjZXMKKwkgKi8KKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9JUlEsIDApOworCWlmICghcmVzKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwKKwkJCSJubyBJUlEhIENoZWNrICVzIHNldHVwIVxuIiwgZGV2X25hbWUoJnBkZXYtPmRldikpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJaXJxID0gcmVzLT5zdGFydDsKKwlkZXZfZGJnKCZwZGV2LT5kZXYsICJJUlEgcmVzb3VyY2UgJWRcbiIsIGlycSk7CisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWlmICghcmVzKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIm5vIHJlZ2lzdGVycyBhZGRyZXNzISBDaGVjayAlcyBzZXR1cCFcbiIsCisJCQlkZXZfbmFtZSgmcGRldi0+ZGV2KSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKwltZW1zdGFydCA9IHJlcy0+c3RhcnQ7CisJbWVtbGVuID0gcmVzLT5lbmQgLSByZXMtPnN0YXJ0ICsgMTsKKwlkZXZfZGJnKCZwZGV2LT5kZXYsICJNRU0gcmVzb3VyY2UgJWx4LSVseFxuIiwgbWVtc3RhcnQsIG1lbWxlbik7CisJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24obWVtc3RhcnQsIG1lbWxlbiwKKwkJCQlveHVfaGNfZHJpdmVyLmRlc2NyaXB0aW9uKSkgeworCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJtZW1vcnkgYXJlYSBhbHJlYWR5IGluIHVzZVxuIik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJcmV0ID0gc2V0X2lycV90eXBlKGlycSwgSVJRRl9UUklHR0VSX0ZBTExJTkcpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZXJyb3Igc2V0dGluZyBpcnEgdHlwZVxuIik7CisJCXJldCA9IC1FRkFVTFQ7CisJCWdvdG8gZXJyb3Jfc2V0X2lycV90eXBlOworCX0KKworCWJhc2UgPSBpb3JlbWFwKG1lbXN0YXJ0LCBtZW1sZW4pOworCWlmICghYmFzZSkgeworCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJlcnJvciBtYXBwaW5nIG1lbW9yeVxuIik7CisJCXJldCA9IC1FRkFVTFQ7CisJCWdvdG8gZXJyb3JfaW9yZW1hcDsKKwl9CisKKwkvKiBBbGxvY2F0ZSBhIGRyaXZlciBkYXRhIHN0cnVjdCB0byBob2xkIHVzZWZ1bCBpbmZvIGZvciBib3RoCisJICogU1BIICYgT1RHIGRldmljZXMKKwkgKi8KKwlpbmZvID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG94dV9pbmZvKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFpbmZvKSB7CisJCWRldl9kYmcoJnBkZXYtPmRldiwgImVycm9yIGFsbG9jYXRpbmcgbWVtb3J5XG4iKTsKKwkJcmV0ID0gLUVGQVVMVDsKKwkJZ290byBlcnJvcl9hbGxvYzsKKwl9CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgaW5mbyk7CisKKwlyZXQgPSBveHVfaW5pdChwZGV2LCBtZW1zdGFydCwgbWVtbGVuLCBiYXNlLCBpcnEpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9kYmcoJnBkZXYtPmRldiwgImNhbm5vdCBpbml0IFVTQiBkZXZpY2VzXG4iKTsKKwkJZ290byBlcnJvcl9pbml0OworCX0KKworCWRldl9pbmZvKCZwZGV2LT5kZXYsICJkZXZpY2VzIGVuYWJsZWQgYW5kIHJ1bm5pbmdcbiIpOworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGluZm8pOworCisJcmV0dXJuIDA7CisKK2Vycm9yX2luaXQ6CisJa2ZyZWUoaW5mbyk7CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisKK2Vycm9yX2FsbG9jOgorCWlvdW5tYXAoYmFzZSk7CisKK2Vycm9yX3NldF9pcnFfdHlwZToKK2Vycm9yX2lvcmVtYXA6CisJcmVsZWFzZV9tZW1fcmVnaW9uKG1lbXN0YXJ0LCBtZW1sZW4pOworCisJZGV2X2VycigmcGRldi0+ZGV2LCAiaW5pdCAlcyBmYWlsLCAlZFxuIiwgZGV2X25hbWUoJnBkZXYtPmRldiksIHJldCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgb3h1X3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LCBzdHJ1Y3QgdXNiX2hjZCAqaGNkKQoreworCXVzYl9yZW1vdmVfaGNkKGhjZCk7CisJdXNiX3B1dF9oY2QoaGNkKTsKK30KKworc3RhdGljIGludCBveHVfZHJ2X3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBveHVfaW5mbyAqaW5mbyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXVuc2lnbmVkIGxvbmcgbWVtc3RhcnQgPSBpbmZvLT5oY2RbMF0tPnJzcmNfc3RhcnQsCisJCQltZW1sZW4gPSBpbmZvLT5oY2RbMF0tPnJzcmNfbGVuOworCXZvaWQgKmJhc2UgPSBpbmZvLT5oY2RbMF0tPnJlZ3M7CisKKwlveHVfcmVtb3ZlKHBkZXYsIGluZm8tPmhjZFswXSk7CisJb3h1X3JlbW92ZShwZGV2LCBpbmZvLT5oY2RbMV0pOworCisJaW91bm1hcChiYXNlKTsKKwlyZWxlYXNlX21lbV9yZWdpb24obWVtc3RhcnQsIG1lbWxlbik7CisKKwlrZnJlZShpbmZvKTsKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBveHVfZHJ2X3NodXRkb3duKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJb3h1X2Rydl9yZW1vdmUocGRldik7Cit9CisKKyNpZiAwCisvKiBGSVhNRTogVE9ETyAqLworc3RhdGljIGludCBveHVfZHJ2X3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3QgdXNiX2hjZCAqaGNkID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBveHVfZHJ2X3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCB1c2JfaGNkICpoY2QgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCXJldHVybiAwOworfQorI2Vsc2UKKyNkZWZpbmUgb3h1X2Rydl9zdXNwZW5kCU5VTEwKKyNkZWZpbmUgb3h1X2Rydl9yZXN1bWUJTlVMTAorI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG94dV9kcml2ZXIgPSB7CisJLnByb2JlCQk9IG94dV9kcnZfcHJvYmUsCisJLnJlbW92ZQkJPSBveHVfZHJ2X3JlbW92ZSwKKwkuc2h1dGRvd24JPSBveHVfZHJ2X3NodXRkb3duLAorCS5zdXNwZW5kCT0gb3h1X2Rydl9zdXNwZW5kLAorCS5yZXN1bWUJCT0gb3h1X2Rydl9yZXN1bWUsCisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAib3h1MjEwaHAtaGNkIiwKKwkJLmJ1cyA9ICZwbGF0Zm9ybV9idXNfdHlwZQorCX0KK307CisKK3N0YXRpYyBpbnQgX19pbml0IG94dV9tb2R1bGVfaW5pdCh2b2lkKQoreworCWludCByZXR2YWwgPSAwOworCisJcmV0dmFsID0gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZveHVfZHJpdmVyKTsKKwlpZiAocmV0dmFsIDwgMCkKKwkJcmV0dXJuIHJldHZhbDsKKworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBveHVfbW9kdWxlX2NsZWFudXAodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3Rlcigmb3h1X2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KG94dV9tb2R1bGVfaW5pdCk7Cittb2R1bGVfZXhpdChveHVfbW9kdWxlX2NsZWFudXApOworCitNT0RVTEVfREVTQ1JJUFRJT04oIk94Zm9yZCBPWFUyMTBIUCBIQ0QgZHJpdmVyIC0gdmVyLiAiIERSSVZFUl9WRVJTSU9OKTsKK01PRFVMRV9BVVRIT1IoIlJvZG9sZm8gR2lvbWV0dGkgPGdpb21ldHRpQGxpbnV4Lml0PiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9veHUyMTBocC5oIGIvZHJpdmVycy91c2IvaG9zdC9veHUyMTBocC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5MTBlMjcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3VzYi9ob3N0L294dTIxMGhwLmgKQEAgLTAsMCArMSw0NDcgQEAKKy8qCisgKiBIb3N0IGludGVyZmFjZSByZWdpc3RlcnMKKyAqLworCisjZGVmaW5lIE9YVV9ERVZJQ0VJRAkJCTB4MDAKKwkjZGVmaW5lIE9YVV9SRVZfTUFTSwkJMHhmZmZmMDAwMAorCSNkZWZpbmUgT1hVX1JFVl9TSElGVAkJMTYKKwkjZGVmaW5lIE9YVV9SRVZfMjEwMAkJMHgyMTAwCisJI2RlZmluZSBPWFVfQk9fU0hJRlQJCTgKKwkjZGVmaW5lIE9YVV9CT19NQVNLCQkoMHgzIDw8IE9YVV9CT19TSElGVCkKKwkjZGVmaW5lIE9YVV9NQUpfUkVWX1NISUZUCTQKKwkjZGVmaW5lIE9YVV9NQUpfUkVWX01BU0sJKDB4ZiA8PCBPWFVfTUFKX1JFVl9TSElGVCkKKwkjZGVmaW5lIE9YVV9NSU5fUkVWX1NISUZUCTAKKwkjZGVmaW5lIE9YVV9NSU5fUkVWX01BU0sJKDB4ZiA8PCBPWFVfTUlOX1JFVl9TSElGVCkKKyNkZWZpbmUgT1hVX0hPU1RJRkNPTkZJRwkJMHgwNAorI2RlZmluZSBPWFVfU09GVFJFU0VUCQkJMHgwOAorCSNkZWZpbmUgT1hVX1NSRVNFVAkJKDEgPDwgMCkKKworI2RlZmluZSBPWFVfUElPQlVSU1RSRUFEQ1RSTAkJMHgwQworCisjZGVmaW5lIE9YVV9DSElQSVJRU1RBVFVTCQkweDEwCisjZGVmaW5lIE9YVV9DSElQSVJRRU5fU0VUCQkweDE0CisjZGVmaW5lIE9YVV9DSElQSVJRRU5fQ0xSCQkweDE4CisJI2RlZmluZSBPWFVfVVNCU1BITFBXVUkJCTB4MDAwMDAwODAKKwkjZGVmaW5lIE9YVV9VU0JPVEdMUFdVSQkJMHgwMDAwMDA0MAorCSNkZWZpbmUgT1hVX1VTQlNQSEkJCTB4MDAwMDAwMDIKKwkjZGVmaW5lIE9YVV9VU0JPVEdJCQkweDAwMDAwMDAxCisKKyNkZWZpbmUgT1hVX0NMS0NUUkxfU0VUCQkJMHgxQworCSNkZWZpbmUgT1hVX1NZU0NMS0VOCQkweDAwMDAwMDA4CisJI2RlZmluZSBPWFVfVVNCU1BIQ0xLRU4JCTB4MDAwMDAwMDIKKwkjZGVmaW5lIE9YVV9VU0JPVEdDTEtFTgkJMHgwMDAwMDAwMQorCisjZGVmaW5lIE9YVV9BU08JCQkJMHg2OAorCSNkZWZpbmUgT1hVX1NQSFBPRU4JCTB4MDAwMDAxMDAKKwkjZGVmaW5lIE9YVV9PVlJDQ1VSUFVQREVOCTB4MDAwMDA4MDAKKwkjZGVmaW5lIE9YVV9BU09fT1AJCSgxIDw8IDEwKQorCSNkZWZpbmUgT1hVX0NPTVBBUkFUT1IJCTB4MDAwMDA0MDAwCisKKyNkZWZpbmUgT1hVX1VTQk1PREUJCQkweDFBOAorCSNkZWZpbmUgT1hVX1ZCUFMJCTB4MDAwMDAwMjAKKwkjZGVmaW5lIE9YVV9FU19MSVRUTEUJCTB4MDAwMDAwMDAKKwkjZGVmaW5lIE9YVV9DTV9IT1NUX09OTFkJMHgwMDAwMDAwMworCisvKgorICogUHJvcGVyIEVIQ0kgc3RydWN0cyAmIGRlZmluZXMKKyAqLworCisvKiBNYWdpYyBudW1iZXJzIHRoYXQgY2FuIGFmZmVjdCBzeXN0ZW0gcGVyZm9ybWFuY2UgKi8KKyNkZWZpbmUgRUhDSV9UVU5FX0NFUlIJCTMJLyogMC0zIHF0ZCByZXRyaWVzOyAwID09IGRvbid0IHN0b3AgKi8KKyNkZWZpbmUgRUhDSV9UVU5FX1JMX0hTCQk0CS8qIG5hayB0aHJvdHRsZTsgc2VlIDQuOSAqLworI2RlZmluZSBFSENJX1RVTkVfUkxfVFQJCTAKKyNkZWZpbmUgRUhDSV9UVU5FX01VTFRfSFMJMQkvKiAxLTMgdHJhbnNhY3Rpb25zL3VmcmFtZTsgNC4xMC4zICovCisjZGVmaW5lIEVIQ0lfVFVORV9NVUxUX1RUCTEKKyNkZWZpbmUgRUhDSV9UVU5FX0ZMUwkJMgkvKiAoc21hbGwpIDI1NiBmcmFtZSBzY2hlZHVsZSAqLworCitzdHJ1Y3Qgb3h1X2hjZDsKKworLyogRUhDSSByZWdpc3RlciBpbnRlcmZhY2UsIGNvcnJlc3BvbmRzIHRvIEVIQ0kgUmV2aXNpb24gMC45NSBzcGVjaWZpY2F0aW9uICovCisKKy8qIFNlY3Rpb24gMi4yIEhvc3QgQ29udHJvbGxlciBDYXBhYmlsaXR5IFJlZ2lzdGVycyAqLworc3RydWN0IGVoY2lfY2FwcyB7CisJLyogdGhlc2UgZmllbGRzIGFyZSBzcGVjaWZpZWQgYXMgOCBhbmQgMTYgYml0IHJlZ2lzdGVycywKKwkgKiBidXQgc29tZSBob3N0cyBjYW4ndCBwZXJmb3JtIDggb3IgMTYgYml0IFBDSSBhY2Nlc3Nlcy4KKwkgKi8KKwl1MzIJCWhjX2NhcGJhc2U7CisjZGVmaW5lIEhDX0xFTkdUSChwKQkJKCgocCk+PjAwKSYweDAwZmYpCS8qIGJpdHMgNzowICovCisjZGVmaW5lIEhDX1ZFUlNJT04ocCkJCSgoKHApPj4xNikmMHhmZmZmKQkvKiBiaXRzIDMxOjE2ICovCisJdTMyCQloY3NfcGFyYW1zOyAgICAgLyogSENTUEFSQU1TIC0gb2Zmc2V0IDB4NCAqLworI2RlZmluZSBIQ1NfREVCVUdfUE9SVChwKQkoKChwKT4+MjApJjB4ZikJLyogYml0cyAyMzoyMCwgZGVidWcgcG9ydD8gKi8KKyNkZWZpbmUgSENTX0lORElDQVRPUihwKQkoKHApJigxIDw8IDE2KSkJLyogdHJ1ZTogaGFzIHBvcnQgaW5kaWNhdG9ycyAqLworI2RlZmluZSBIQ1NfTl9DQyhwKQkJKCgocCk+PjEyKSYweGYpCS8qIGJpdHMgMTU6MTIsICNjb21wYW5pb24gSENzICovCisjZGVmaW5lIEhDU19OX1BDQyhwKQkJKCgocCk+PjgpJjB4ZikJLyogYml0cyAxMTo4LCBwb3J0cyBwZXIgQ0MgKi8KKyNkZWZpbmUgSENTX1BPUlRST1VURUQocCkJKChwKSYoMSA8PCA3KSkJLyogdHJ1ZTogcG9ydCByb3V0aW5nICovCisjZGVmaW5lIEhDU19QUEMocCkJCSgocCkmKDEgPDwgNCkpCS8qIHRydWU6IHBvcnQgcG93ZXIgY29udHJvbCAqLworI2RlZmluZSBIQ1NfTl9QT1JUUyhwKQkJKCgocCk+PjApJjB4ZikJLyogYml0cyAzOjAsIHBvcnRzIG9uIEhDICovCisKKwl1MzIJCWhjY19wYXJhbXM7ICAgICAgLyogSENDUEFSQU1TIC0gb2Zmc2V0IDB4OCAqLworI2RlZmluZSBIQ0NfRVhUX0NBUFMocCkJCSgoKHApPj44KSYweGZmKQkvKiBmb3IgcGNpIGV4dGVuZGVkIGNhcHMgKi8KKyNkZWZpbmUgSENDX0lTT0NfQ0FDSEUocCkgICAgICAgKChwKSYoMSA8PCA3KSkgIC8qIHRydWU6IGNhbiBjYWNoZSBpc29jIGZyYW1lICovCisjZGVmaW5lIEhDQ19JU09DX1RIUkVTKHApICAgICAgICgoKHApPj40KSYweDcpICAvKiBiaXRzIDY6NCwgdWZyYW1lcyBjYWNoZWQgKi8KKyNkZWZpbmUgSENDX0NBTlBBUksocCkJCSgocCkmKDEgPDwgMikpICAvKiB0cnVlOiBjYW4gcGFyayBvbiBhc3luYyBxaCAqLworI2RlZmluZSBIQ0NfUEdNX0ZSQU1FTElTVExFTihwKSAoKHApJigxIDw8IDEpKSAgLyogdHJ1ZTogcGVyaW9kaWNfc2l6ZSBjaGFuZ2VzKi8KKyNkZWZpbmUgSENDXzY0QklUX0FERFIocCkgICAgICAgKChwKSYoMSkpICAgICAgIC8qIHRydWU6IGNhbiB1c2UgNjQtYml0IGFkZHIgKi8KKwl1OAkJcG9ydHJvdXRlWzhdOwkgLyogbmliYmxlcyBmb3Igcm91dGluZyAtIG9mZnNldCAweEMgKi8KK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisKKy8qIFNlY3Rpb24gMi4zIEhvc3QgQ29udHJvbGxlciBPcGVyYXRpb25hbCBSZWdpc3RlcnMgKi8KK3N0cnVjdCBlaGNpX3JlZ3MgeworCS8qIFVTQkNNRDogb2Zmc2V0IDB4MDAgKi8KKwl1MzIJCWNvbW1hbmQ7CisvKiAyMzoxNiBpcyByL3cgaW50ciByYXRlLCBpbiBtaWNyb2ZyYW1lczsgZGVmYXVsdCAiOCIgPT0gMS9tc2VjICovCisjZGVmaW5lIENNRF9QQVJLCSgxPDwxMSkJCS8qIGVuYWJsZSAicGFyayIgb24gYXN5bmMgcWggKi8KKyNkZWZpbmUgQ01EX1BBUktfQ05UKGMpCSgoKGMpPj44KSYzKQkvKiBob3cgbWFueSB0cmFuc2ZlcnMgdG8gcGFyayBmb3IgKi8KKyNkZWZpbmUgQ01EX0xSRVNFVAkoMTw8NykJCS8qIHBhcnRpYWwgcmVzZXQgKG5vIHBvcnRzLCBldGMpICovCisjZGVmaW5lIENNRF9JQUFECSgxPDw2KQkJLyogImRvb3JiZWxsIiBpbnRlcnJ1cHQgYXN5bmMgYWR2YW5jZSAqLworI2RlZmluZSBDTURfQVNFCQkoMTw8NSkJCS8qIGFzeW5jIHNjaGVkdWxlIGVuYWJsZSAqLworI2RlZmluZSBDTURfUFNFCQkoMTw8NCkJCS8qIHBlcmlvZGljIHNjaGVkdWxlIGVuYWJsZSAqLworLyogMzoyIGlzIHBlcmlvZGljIGZyYW1lIGxpc3Qgc2l6ZSAqLworI2RlZmluZSBDTURfUkVTRVQJKDE8PDEpCQkvKiByZXNldCBIQyBub3QgYnVzICovCisjZGVmaW5lIENNRF9SVU4JCSgxPDwwKQkJLyogc3RhcnQvc3RvcCBIQyAqLworCisJLyogVVNCU1RTOiBvZmZzZXQgMHgwNCAqLworCXUzMgkJc3RhdHVzOworI2RlZmluZSBTVFNfQVNTCQkoMTw8MTUpCQkvKiBBc3luYyBTY2hlZHVsZSBTdGF0dXMgKi8KKyNkZWZpbmUgU1RTX1BTUwkJKDE8PDE0KQkJLyogUGVyaW9kaWMgU2NoZWR1bGUgU3RhdHVzICovCisjZGVmaW5lIFNUU19SRUNMCSgxPDwxMykJCS8qIFJlY2xhbWF0aW9uICovCisjZGVmaW5lIFNUU19IQUxUCSgxPDwxMikJCS8qIE5vdCBydW5uaW5nIChhbnkgcmVhc29uKSAqLworLyogc29tZSBiaXRzIHJlc2VydmVkICovCisJLyogdGhlc2UgU1RTXyogZmxhZ3MgYXJlIGFsc28gaW50cl9lbmFibGUgYml0cyAoVVNCSU5UUikgKi8KKyNkZWZpbmUgU1RTX0lBQQkJKDE8PDUpCQkvKiBJbnRlcnJ1cHRlZCBvbiBhc3luYyBhZHZhbmNlICovCisjZGVmaW5lIFNUU19GQVRBTAkoMTw8NCkJCS8qIHN1Y2ggYXMgc29tZSBQQ0kgYWNjZXNzIGVycm9ycyAqLworI2RlZmluZSBTVFNfRkxSCQkoMTw8MykJCS8qIGZyYW1lIGxpc3Qgcm9sbGVkIG92ZXIgKi8KKyNkZWZpbmUgU1RTX1BDRAkJKDE8PDIpCQkvKiBwb3J0IGNoYW5nZSBkZXRlY3QgKi8KKyNkZWZpbmUgU1RTX0VSUgkJKDE8PDEpCQkvKiAiZXJyb3IiIGNvbXBsZXRpb24gKG92ZXJmbG93LCAuLi4pICovCisjZGVmaW5lIFNUU19JTlQJCSgxPDwwKQkJLyogIm5vcm1hbCIgY29tcGxldGlvbiAoc2hvcnQsIC4uLikgKi8KKworI2RlZmluZSBJTlRSX01BU0sgKFNUU19JQUEgfCBTVFNfRkFUQUwgfCBTVFNfUENEIHwgU1RTX0VSUiB8IFNUU19JTlQpCisKKwkvKiBVU0JJTlRSOiBvZmZzZXQgMHgwOCAqLworCXUzMgkJaW50cl9lbmFibGU7CisKKwkvKiBGUklOREVYOiBvZmZzZXQgMHgwQyAqLworCXUzMgkJZnJhbWVfaW5kZXg7CS8qIGN1cnJlbnQgbWljcm9mcmFtZSBudW1iZXIgKi8KKwkvKiBDVFJMRFNTRUdNRU5UOiBvZmZzZXQgMHgxMCAqLworCXUzMgkJc2VnbWVudDsJLyogYWRkcmVzcyBiaXRzIDYzOjMyIGlmIG5lZWRlZCAqLworCS8qIFBFUklPRElDTElTVEJBU0U6IG9mZnNldCAweDE0ICovCisJdTMyCQlmcmFtZV9saXN0OwkvKiBwb2ludHMgdG8gcGVyaW9kaWMgbGlzdCAqLworCS8qIEFTWU5DTElTVEFERFI6IG9mZnNldCAweDE4ICovCisJdTMyCQlhc3luY19uZXh0OwkvKiBhZGRyZXNzIG9mIG5leHQgYXN5bmMgcXVldWUgaGVhZCAqLworCisJdTMyCQlyZXNlcnZlZFs5XTsKKworCS8qIENPTkZJR0ZMQUc6IG9mZnNldCAweDQwICovCisJdTMyCQljb25maWd1cmVkX2ZsYWc7CisjZGVmaW5lIEZMQUdfQ0YJCSgxPDwwKQkJLyogdHJ1ZTogd2UnbGwgc3VwcG9ydCAiaGlnaCBzcGVlZCIgKi8KKworCS8qIFBPUlRTQzogb2Zmc2V0IDB4NDQgKi8KKwl1MzIJCXBvcnRfc3RhdHVzWzBdOwkvKiB1cCB0byBOX1BPUlRTICovCisvKiAzMToyMyByZXNlcnZlZCAqLworI2RlZmluZSBQT1JUX1dLT0NfRQkoMTw8MjIpCQkvKiB3YWtlIG9uIG92ZXJjdXJyZW50IChlbmFibGUpICovCisjZGVmaW5lIFBPUlRfV0tESVNDX0UJKDE8PDIxKQkJLyogd2FrZSBvbiBkaXNjb25uZWN0IChlbmFibGUpICovCisjZGVmaW5lIFBPUlRfV0tDT05OX0UJKDE8PDIwKQkJLyogd2FrZSBvbiBjb25uZWN0IChlbmFibGUpICovCisvKiAxOToxNiBmb3IgcG9ydCB0ZXN0aW5nICovCisjZGVmaW5lIFBPUlRfTEVEX09GRgkoMDw8MTQpCisjZGVmaW5lIFBPUlRfTEVEX0FNQkVSCSgxPDwxNCkKKyNkZWZpbmUgUE9SVF9MRURfR1JFRU4JKDI8PDE0KQorI2RlZmluZSBQT1JUX0xFRF9NQVNLCSgzPDwxNCkKKyNkZWZpbmUgUE9SVF9PV05FUgkoMTw8MTMpCQkvKiB0cnVlOiBjb21wYW5pb24gaGMgb3ducyB0aGlzIHBvcnQgKi8KKyNkZWZpbmUgUE9SVF9QT1dFUgkoMTw8MTIpCQkvKiB0cnVlOiBoYXMgcG93ZXIgKHNlZSBQUEMpICovCisjZGVmaW5lIFBPUlRfVVNCMTEoeCkgKCgoeCkmKDM8PDEwKSkgPT0gKDE8PDEwKSkJLyogVVNCIDEuMSBkZXZpY2UgKi8KKy8qIDExOjEwIGZvciBkZXRlY3RpbmcgbG93c3BlZWQgZGV2aWNlcyAocmVzZXQgdnMgcmVsZWFzZSBvd25lcnNoaXApICovCisvKiA5IHJlc2VydmVkICovCisjZGVmaW5lIFBPUlRfUkVTRVQJKDE8PDgpCQkvKiByZXNldCBwb3J0ICovCisjZGVmaW5lIFBPUlRfU1VTUEVORAkoMTw8NykJCS8qIHN1c3BlbmQgcG9ydCAqLworI2RlZmluZSBQT1JUX1JFU1VNRQkoMTw8NikJCS8qIHJlc3VtZSBpdCAqLworI2RlZmluZSBQT1JUX09DQwkoMTw8NSkJCS8qIG92ZXIgY3VycmVudCBjaGFuZ2UgKi8KKyNkZWZpbmUgUE9SVF9PQwkJKDE8PDQpCQkvKiBvdmVyIGN1cnJlbnQgYWN0aXZlICovCisjZGVmaW5lIFBPUlRfUEVDCSgxPDwzKQkJLyogcG9ydCBlbmFibGUgY2hhbmdlICovCisjZGVmaW5lIFBPUlRfUEUJCSgxPDwyKQkJLyogcG9ydCBlbmFibGUgKi8KKyNkZWZpbmUgUE9SVF9DU0MJKDE8PDEpCQkvKiBjb25uZWN0IHN0YXR1cyBjaGFuZ2UgKi8KKyNkZWZpbmUgUE9SVF9DT05ORUNUCSgxPDwwKQkJLyogZGV2aWNlIGNvbm5lY3RlZCAqLworI2RlZmluZSBQT1JUX1JXQ19CSVRTICAgKFBPUlRfQ1NDIHwgUE9SVF9QRUMgfCBQT1JUX09DQykKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiBBcHBlbmRpeCBDLCBEZWJ1ZyBwb3J0IC4uLiBpbnRlbmRlZCBmb3IgdXNlIHdpdGggc3BlY2lhbCAiZGVidWcgZGV2aWNlcyIKKyAqIHRoYXQgY2FuIGhlbHAgaWYgdGhlcmUncyBubyBzZXJpYWwgY29uc29sZS4gIChub25zdGFuZGFyZCBlbnVtZXJhdGlvbi4pCisgKi8KK3N0cnVjdCBlaGNpX2RiZ19wb3J0IHsKKwl1MzIJY29udHJvbDsKKyNkZWZpbmUgREJHUF9PV05FUgkoMTw8MzApCisjZGVmaW5lIERCR1BfRU5BQkxFRAkoMTw8MjgpCisjZGVmaW5lIERCR1BfRE9ORQkoMTw8MTYpCisjZGVmaW5lIERCR1BfSU5VU0UJKDE8PDEwKQorI2RlZmluZSBEQkdQX0VSUkNPREUoeCkJKCgoeCk+PjcpJjB4MDcpCisjCWRlZmluZSBEQkdQX0VSUl9CQUQJMQorIwlkZWZpbmUgREJHUF9FUlJfU0lHTkFMCTIKKyNkZWZpbmUgREJHUF9FUlJPUgkoMTw8NikKKyNkZWZpbmUgREJHUF9HTwkJKDE8PDUpCisjZGVmaW5lIERCR1BfT1VUCSgxPDw0KQorI2RlZmluZSBEQkdQX0xFTih4KQkoKCh4KT4+MCkmMHgwZikKKwl1MzIJcGlkczsKKyNkZWZpbmUgREJHUF9QSURfR0VUKHgpCQkoKCh4KT4+MTYpJjB4ZmYpCisjZGVmaW5lIERCR1BfUElEX1NFVChkYXRhLCB0b2spCSgoKGRhdGEpPDw4KXwodG9rKSkKKwl1MzIJZGF0YTAzOworCXUzMglkYXRhNDc7CisJdTMyCWFkZHJlc3M7CisjZGVmaW5lIERCR1BfRVBBRERSKGRldiwgZXApCSgoKGRldik8PDgpfChlcCkpCit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworCisjZGVmaW5lCVFURF9ORVhUKGRtYSkJY3B1X3RvX2xlMzIoKHUzMilkbWEpCisKKy8qCisgKiBFSENJIFNwZWNpZmljYXRpb24gMC45NSBTZWN0aW9uIDMuNQorICogUVREOiBkZXNjcmliZSBkYXRhIHRyYW5zZmVyIGNvbXBvbmVudHMgKGJ1ZmZlciwgZGlyZWN0aW9uLCAuLi4pCisgKiBTZWUgRmlnIDMtNiAiUXVldWUgRWxlbWVudCBUcmFuc2ZlciBEZXNjcmlwdG9yIEJsb2NrIERpYWdyYW0iLgorICoKKyAqIFRoZXNlIGFyZSBhc3NvY2lhdGVkIG9ubHkgd2l0aCAiUUgiIChRdWV1ZSBIZWFkKSBzdHJ1Y3R1cmVzLAorICogdXNlZCB3aXRoIGNvbnRyb2wsIGJ1bGssIGFuZCBpbnRlcnJ1cHQgdHJhbnNmZXJzLgorICovCitzdHJ1Y3QgZWhjaV9xdGQgeworCS8qIGZpcnN0IHBhcnQgZGVmaW5lZCBieSBFSENJIHNwZWMgKi8KKwlfX2xlMzIJCQlod19uZXh0OwkJLyogc2VlIEVIQ0kgMy41LjEgKi8KKwlfX2xlMzIJCQlod19hbHRfbmV4dDsJCS8qIHNlZSBFSENJIDMuNS4yICovCisJX19sZTMyCQkJaHdfdG9rZW47CQkvKiBzZWUgRUhDSSAzLjUuMyAqLworI2RlZmluZQlRVERfVE9HR0xFCSgxIDw8IDMxKQkvKiBkYXRhIHRvZ2dsZSAqLworI2RlZmluZQlRVERfTEVOR1RIKHRvaykJKCgodG9rKT4+MTYpICYgMHg3ZmZmKQorI2RlZmluZQlRVERfSU9DCQkoMSA8PCAxNSkJLyogaW50ZXJydXB0IG9uIGNvbXBsZXRlICovCisjZGVmaW5lCVFURF9DRVJSKHRvaykJKCgodG9rKT4+MTApICYgMHgzKQorI2RlZmluZQlRVERfUElEKHRvaykJKCgodG9rKT4+OCkgJiAweDMpCisjZGVmaW5lCVFURF9TVFNfQUNUSVZFCSgxIDw8IDcpCS8qIEhDIG1heSBleGVjdXRlIHRoaXMgKi8KKyNkZWZpbmUJUVREX1NUU19IQUxUCSgxIDw8IDYpCS8qIGhhbHRlZCBvbiBlcnJvciAqLworI2RlZmluZQlRVERfU1RTX0RCRQkoMSA8PCA1KQkvKiBkYXRhIGJ1ZmZlciBlcnJvciAoaW4gSEMpICovCisjZGVmaW5lCVFURF9TVFNfQkFCQkxFCSgxIDw8IDQpCS8qIGRldmljZSB3YXMgYmFiYmxpbmcgKHF0ZCBoYWx0ZWQpICovCisjZGVmaW5lCVFURF9TVFNfWEFDVAkoMSA8PCAzKQkvKiBkZXZpY2UgZ2F2ZSBpbGxlZ2FsIHJlc3BvbnNlICovCisjZGVmaW5lCVFURF9TVFNfTU1GCSgxIDw8IDIpCS8qIGluY29tcGxldGUgc3BsaXQgdHJhbnNhY3Rpb24gKi8KKyNkZWZpbmUJUVREX1NUU19TVFMJKDEgPDwgMSkJLyogc3BsaXQgdHJhbnNhY3Rpb24gc3RhdGUgKi8KKyNkZWZpbmUJUVREX1NUU19QSU5HCSgxIDw8IDApCS8qIGlzc3VlIFBJTkc/ICovCisJX19sZTMyCQkJaHdfYnVmWzVdOwkJLyogc2VlIEVIQ0kgMy41LjQgKi8KKwlfX2xlMzIJCQlod19idWZfaGlbNV07CQkvKiBBcHBlbmRpeCBCICovCisKKwkvKiB0aGUgcmVzdCBpcyBIQ0QtcHJpdmF0ZSAqLworCWRtYV9hZGRyX3QJCXF0ZF9kbWE7CQkvKiBxdGQgYWRkcmVzcyAqLworCXN0cnVjdCBsaXN0X2hlYWQJcXRkX2xpc3Q7CQkvKiBzdyBxdGQgbGlzdCAqLworCXN0cnVjdCB1cmIJCSp1cmI7CQkJLyogcXRkJ3MgdXJiICovCisJc2l6ZV90CQkJbGVuZ3RoOwkJCS8qIGxlbmd0aCBvZiBidWZmZXIgKi8KKworCXUzMgkJCXF0ZF9idWZmZXJfbGVuOworCXZvaWQJCQkqYnVmZmVyOworCWRtYV9hZGRyX3QJCWJ1ZmZlcl9kbWE7CisJdm9pZAkJCSp0cmFuc2Zlcl9idWZmZXI7CisJdm9pZAkJCSp0cmFuc2Zlcl9kbWE7Cit9IF9fYXR0cmlidXRlX18gKChhbGlnbmVkKDMyKSkpOworCisvKiBtYXNrIE5ha0NudCtUIGluIHFoLT5od19hbHRfbmV4dCAqLworI2RlZmluZSBRVERfTUFTSyBfX2NvbnN0YW50X2NwdV90b19sZTMyICh+MHgxZikKKworI2RlZmluZSBJU19TSE9SVF9SRUFEKHRva2VuKSAoUVREX0xFTkdUSCh0b2tlbikgIT0gMCAmJiBRVERfUElEKHRva2VuKSA9PSAxKQorCisvKiBUeXBlIHRhZyBmcm9tIHtxaCwgaXRkLCBzaXRkLCBmc3RufS0+aHdfbmV4dCAqLworI2RlZmluZSBRX05FWFRfVFlQRShkbWEpICgoZG1hKSAmIF9fY29uc3RhbnRfY3B1X3RvX2xlMzIgKDMgPDwgMSkpCisKKy8qIHZhbHVlcyBmb3IgdGhhdCB0eXBlIHRhZyAqLworI2RlZmluZSBRX1RZUEVfUUgJX19jb25zdGFudF9jcHVfdG9fbGUzMiAoMSA8PCAxKQorCisvKiBuZXh0IGFzeW5jIHF1ZXVlIGVudHJ5LCBvciBwb2ludGVyIHRvIGludGVycnVwdC9wZXJpb2RpYyBRSCAqLworI2RlZmluZQlRSF9ORVhUKGRtYSkJKGNwdV90b19sZTMyKCgodTMyKWRtYSkmfjB4MDFmKXxRX1RZUEVfUUgpCisKKy8qIGZvciBwZXJpb2RpYy9hc3luYyBzY2hlZHVsZXMgYW5kIHF0ZCBsaXN0cywgbWFyayBlbmQgb2YgbGlzdCAqLworI2RlZmluZQlFSENJX0xJU1RfRU5ECV9fY29uc3RhbnRfY3B1X3RvX2xlMzIoMSkgLyogIm51bGwgcG9pbnRlciIgdG8gaHcgKi8KKworLyoKKyAqIEVudHJpZXMgaW4gcGVyaW9kaWMgc2hhZG93IHRhYmxlIGFyZSBwb2ludGVycyB0byBvbmUgb2YgZm91ciBraW5kcworICogb2YgZGF0YSBzdHJ1Y3R1cmUuICBUaGF0J3MgZGljdGF0ZWQgYnkgdGhlIGhhcmR3YXJlOyBhIHR5cGUgdGFnIGlzCisgKiBlbmNvZGVkIGluIHRoZSBsb3cgYml0cyBvZiB0aGUgaGFyZHdhcmUncyBwZXJpb2RpYyBzY2hlZHVsZS4gIFVzZQorICogUV9ORVhUX1RZUEUgdG8gZ2V0IHRoZSB0YWcuCisgKgorICogRm9yIGVudHJpZXMgaW4gdGhlIGFzeW5jIHNjaGVkdWxlLCB0aGUgdHlwZSB0YWcgYWx3YXlzIHNheXMgInFoIi4KKyAqLwordW5pb24gZWhjaV9zaGFkb3cgeworCXN0cnVjdCBlaGNpX3FoCQkqcWg7CQkvKiBRX1RZUEVfUUggKi8KKwlfX2xlMzIJCQkqaHdfbmV4dDsJLyogKGFsbCB0eXBlcykgKi8KKwl2b2lkCQkJKnB0cjsKK307CisKKy8qCisgKiBFSENJIFNwZWNpZmljYXRpb24gMC45NSBTZWN0aW9uIDMuNgorICogUUg6IGRlc2NyaWJlcyBjb250cm9sL2J1bGsvaW50ZXJydXB0IGVuZHBvaW50cworICogU2VlIEZpZyAzLTcgIlF1ZXVlIEhlYWQgU3RydWN0dXJlIExheW91dCIuCisgKgorICogVGhlc2UgYXBwZWFyIGluIGJvdGggdGhlIGFzeW5jIGFuZCAoZm9yIGludGVycnVwdCkgcGVyaW9kaWMgc2NoZWR1bGVzLgorICovCisKK3N0cnVjdCBlaGNpX3FoIHsKKwkvKiBmaXJzdCBwYXJ0IGRlZmluZWQgYnkgRUhDSSBzcGVjICovCisJX19sZTMyCQkJaHdfbmV4dDsJIC8qIHNlZSBFSENJIDMuNi4xICovCisJX19sZTMyCQkJaHdfaW5mbzE7CS8qIHNlZSBFSENJIDMuNi4yICovCisjZGVmaW5lCVFIX0hFQUQJCTB4MDAwMDgwMDAKKwlfX2xlMzIJCQlod19pbmZvMjsJLyogc2VlIEVIQ0kgMy42LjIgKi8KKyNkZWZpbmUJUUhfU01BU0sJMHgwMDAwMDBmZgorI2RlZmluZQlRSF9DTUFTSwkweDAwMDBmZjAwCisjZGVmaW5lCVFIX0hVQkFERFIJMHgwMDdmMDAwMAorI2RlZmluZQlRSF9IVUJQT1JUCTB4M2Y4MDAwMDAKKyNkZWZpbmUJUUhfTVVMVAkJMHhjMDAwMDAwMAorCV9fbGUzMgkJCWh3X2N1cnJlbnQ7CSAvKiBxdGQgbGlzdCAtIHNlZSBFSENJIDMuNi40ICovCisKKwkvKiBxdGQgb3ZlcmxheSAoaGFyZHdhcmUgcGFydHMgb2YgYSBzdHJ1Y3QgZWhjaV9xdGQpICovCisJX19sZTMyCQkJaHdfcXRkX25leHQ7CisJX19sZTMyCQkJaHdfYWx0X25leHQ7CisJX19sZTMyCQkJaHdfdG9rZW47CisJX19sZTMyCQkJaHdfYnVmWzVdOworCV9fbGUzMgkJCWh3X2J1Zl9oaVs1XTsKKworCS8qIHRoZSByZXN0IGlzIEhDRC1wcml2YXRlICovCisJZG1hX2FkZHJfdAkJcWhfZG1hOwkJLyogYWRkcmVzcyBvZiBxaCAqLworCXVuaW9uIGVoY2lfc2hhZG93CXFoX25leHQ7CS8qIHB0ciB0byBxaDsgb3IgcGVyaW9kaWMgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkCXF0ZF9saXN0OwkvKiBzdyBxdGQgbGlzdCAqLworCXN0cnVjdCBlaGNpX3F0ZAkJKmR1bW15OworCXN0cnVjdCBlaGNpX3FoCQkqcmVjbGFpbTsJLyogbmV4dCB0byByZWNsYWltICovCisKKwlzdHJ1Y3Qgb3h1X2hjZAkJKm94dTsKKwlzdHJ1Y3Qga3JlZgkJa3JlZjsKKwl1bnNpZ25lZAkJc3RhbXA7CisKKwl1OAkJCXFoX3N0YXRlOworI2RlZmluZQlRSF9TVEFURV9MSU5LRUQJCTEJCS8qIEhDIHNlZXMgdGhpcyAqLworI2RlZmluZQlRSF9TVEFURV9VTkxJTksJCTIJCS8qIEhDIG1heSBzdGlsbCBzZWUgdGhpcyAqLworI2RlZmluZQlRSF9TVEFURV9JRExFCQkzCQkvKiBIQyBkb2Vzbid0IHNlZSB0aGlzICovCisjZGVmaW5lCVFIX1NUQVRFX1VOTElOS19XQUlUCTQJCS8qIExJTktFRCBhbmQgb24gcmVjbGFpbSBxICovCisjZGVmaW5lCVFIX1NUQVRFX0NPTVBMRVRJTkcJNQkJLyogZG9uJ3QgdG91Y2ggdG9rZW4uSEFMVCAqLworCisJLyogcGVyaW9kaWMgc2NoZWR1bGUgaW5mbyAqLworCXU4CQkJdXNlY3M7CQkvKiBpbnRyIGJhbmR3aWR0aCAqLworCXU4CQkJZ2FwX3VmOwkJLyogdWZyYW1lcyBzcGxpdC9jc3BsaXQgZ2FwICovCisJdTgJCQljX3VzZWNzOwkvKiAuLi4gc3BsaXQgY29tcGxldGlvbiBidyAqLworCXUxNgkJCXR0X3VzZWNzOwkvKiB0dCBkb3duc3RyZWFtIGJhbmR3aWR0aCAqLworCXVuc2lnbmVkIHNob3J0CQlwZXJpb2Q7CQkvKiBwb2xsaW5nIGludGVydmFsICovCisJdW5zaWduZWQgc2hvcnQJCXN0YXJ0OwkJLyogd2hlcmUgcG9sbGluZyBzdGFydHMgKi8KKyNkZWZpbmUgTk9fRlJBTUUgKCh1bnNpZ25lZCBzaG9ydCl+MCkJCQkvKiBwaWNrIG5ldyBzdGFydCAqLworCXN0cnVjdCB1c2JfZGV2aWNlCSpkZXY7CQkvKiBhY2Nlc3MgdG8gVFQgKi8KK30gX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQoMzIpKSk7CisKKy8qCisgKiBQcm9wZXIgT1hVMjEwSFAgc3RydWN0cworICovCisKKyNkZWZpbmUgT1hVX09UR19DT1JFX09GRlNFVAkweDAwNDAwCisjZGVmaW5lIE9YVV9PVEdfQ0FQX09GRlNFVAkoT1hVX09UR19DT1JFX09GRlNFVCArIDB4MTAwKQorI2RlZmluZSBPWFVfU1BIX0NPUkVfT0ZGU0VUCTB4MDA4MDAKKyNkZWZpbmUgT1hVX1NQSF9DQVBfT0ZGU0VUCShPWFVfU1BIX0NPUkVfT0ZGU0VUICsgMHgxMDApCisKKyNkZWZpbmUgT1hVX09UR19NRU0JCTB4RTAwMAorI2RlZmluZSBPWFVfU1BIX01FTQkJMHgxNjAwMAorCisvKiBPbmx5IGhvdyBtYW55IGVsZW1lbnRzICYgZWxlbWVudCBzdHJ1Y3R1cmUgYXJlIHNwZWNpZmllcyBoZXJlLiAqLworLyogMiBob3N0IGNvbnRyb2xsZXJzIGFyZSBlbmFibGVkIC0gdG90YWwgc2l6ZSA8PSAyOCBrYnl0ZXMgKi8KKyNkZWZpbmUJREVGQVVMVF9JX1REUFMJCTEwMjQKKyNkZWZpbmUgUUhFQURfTlVNCQkxNgorI2RlZmluZSBRVERfTlVNCQkJMzIKKyNkZWZpbmUgU0lURF9OVU0JCTgKKyNkZWZpbmUgTVVSQl9OVU0JCTgKKworI2RlZmluZSBCVUZGRVJfTlVNCQk4CisjZGVmaW5lIEJVRkZFUl9TSVpFCQk1MTIKKworc3RydWN0IG94dV9pbmZvIHsKKwlzdHJ1Y3QgdXNiX2hjZCAqaGNkWzJdOworfTsKKworc3RydWN0IG94dV9idWYgeworCXU4CQkJYnVmZmVyW0JVRkZFUl9TSVpFXTsKK30gX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQoQlVGRkVSX1NJWkUpKSk7CisKK3N0cnVjdCBveHVfb25jaGlwX21lbSB7CisJc3RydWN0IG94dV9idWYJCWRiX3Bvb2xbQlVGRkVSX05VTV07CisKKwl1MzIJCQlmcmFtZV9saXN0W0RFRkFVTFRfSV9URFBTXTsKKwlzdHJ1Y3QgZWhjaV9xaAkJcWhfcG9vbFtRSEVBRF9OVU1dOworCXN0cnVjdCBlaGNpX3F0ZAkJcXRkX3Bvb2xbUVREX05VTV07Cit9IF9fYXR0cmlidXRlX18gKChhbGlnbmVkKDQgPDwgMTApKSk7CisKKyNkZWZpbmUJRUhDSV9NQVhfUk9PVF9QT1JUUwkxNQkJLyogc2VlIEhDU19OX1BPUlRTICovCisKK3N0cnVjdCBveHVfbXVyYiB7CisJc3RydWN0IHVyYgkJdXJiOworCXN0cnVjdCB1cmIJCSptYWluOworCXU4CQkJbGFzdDsKK307CisKK3N0cnVjdCBveHVfaGNkIHsJCQkJLyogb25lIHBlciBjb250cm9sbGVyICovCisJdW5zaWduZWQgaW50CQlpc19vdGc6MTsKKworCXU4CQkJcWhfdXNlZFtRSEVBRF9OVU1dOworCXU4CQkJcXRkX3VzZWRbUVREX05VTV07CisJdTgJCQlkYl91c2VkW0JVRkZFUl9OVU1dOworCXU4CQkJbXVyYl91c2VkW01VUkJfTlVNXTsKKworCXN0cnVjdCBveHVfb25jaGlwX21lbQlfX2lvbWVtICptZW07CisJc3BpbmxvY2tfdAkJbWVtX2xvY2s7CisKKwlzdHJ1Y3QgdGltZXJfbGlzdAl1cmJfdGltZXI7CisKKwlzdHJ1Y3QgZWhjaV9jYXBzIF9faW9tZW0gKmNhcHM7CisJc3RydWN0IGVoY2lfcmVncyBfX2lvbWVtICpyZWdzOworCisJX191MzIJCQloY3NfcGFyYW1zOwkvKiBjYWNoZWQgcmVnaXN0ZXIgY29weSAqLworCXNwaW5sb2NrX3QJCWxvY2s7CisKKwkvKiBhc3luYyBzY2hlZHVsZSBzdXBwb3J0ICovCisJc3RydWN0IGVoY2lfcWgJCSphc3luYzsKKwlzdHJ1Y3QgZWhjaV9xaAkJKnJlY2xhaW07CisJdW5zaWduZWQJCXJlY2xhaW1fcmVhZHk6MTsKKwl1bnNpZ25lZAkJc2Nhbm5pbmc6MTsKKworCS8qIHBlcmlvZGljIHNjaGVkdWxlIHN1cHBvcnQgKi8KKwl1bnNpZ25lZAkJcGVyaW9kaWNfc2l6ZTsKKwlfX2xlMzIJCQkqcGVyaW9kaWM7CS8qIGh3IHBlcmlvZGljIHRhYmxlICovCisJZG1hX2FkZHJfdAkJcGVyaW9kaWNfZG1hOworCXVuc2lnbmVkCQlpX3RocmVzaDsJLyogdWZyYW1lcyBIQyBtaWdodCBjYWNoZSAqLworCisJdW5pb24gZWhjaV9zaGFkb3cJKnBzaGFkb3c7CS8qIG1pcnJvciBodyBwZXJpb2RpYyB0YWJsZSAqLworCWludAkJCW5leHRfdWZyYW1lOwkvKiBzY2FuIHBlcmlvZGljLCBzdGFydCBoZXJlICovCisJdW5zaWduZWQJCXBlcmlvZGljX3NjaGVkOwkvKiBwZXJpb2RpYyBhY3Rpdml0eSBjb3VudCAqLworCisJLyogcGVyIHJvb3QgaHViIHBvcnQgKi8KKwl1bnNpZ25lZCBsb25nCQlyZXNldF9kb25lW0VIQ0lfTUFYX1JPT1RfUE9SVFNdOworCS8qIGJpdCB2ZWN0b3JzIChvbmUgYml0IHBlciBwb3J0KSAqLworCXVuc2lnbmVkIGxvbmcJCWJ1c19zdXNwZW5kZWQ7CS8qIHdoaWNoIHBvcnRzIHdlcmUKKwkJCQkJCSAqIGFscmVhZHkgc3VzcGVuZGVkIGF0IHRoZQorCQkJCQkJICogc3RhcnQgb2YgYSBidXMgc3VzcGVuZAorCQkJCQkJICovCisJdW5zaWduZWQgbG9uZwkJY29tcGFuaW9uX3BvcnRzOy8qIHdoaWNoIHBvcnRzIGFyZSBkZWRpY2F0ZWQKKwkJCQkJCSAqIHRvIHRoZSBjb21wYW5pb24gY29udHJvbGxlcgorCQkJCQkJICovCisKKwlzdHJ1Y3QgdGltZXJfbGlzdAl3YXRjaGRvZzsKKwl1bnNpZ25lZCBsb25nCQlhY3Rpb25zOworCXVuc2lnbmVkCQlzdGFtcDsKKwl1bnNpZ25lZCBsb25nCQluZXh0X3N0YXRlY2hhbmdlOworCXUzMgkJCWNvbW1hbmQ7CisKKwkvKiBTSUxJQ09OIFFVSVJLUyAqLworCXN0cnVjdCBsaXN0X2hlYWQJdXJiX2xpc3Q7CS8qIHRoaXMgaXMgdGhlIGhlYWQgdG8gdXJiCisJCQkJCQkgKiBxdWV1ZSB0aGF0IGRpZG4ndCBnZXQgZW5vdWdoCisJCQkJCQkgKiByZXNvdXJjZXMKKwkJCQkJCSAqLworCXN0cnVjdCBveHVfbXVyYgkJKm11cmJfcG9vbDsJLyogbXVyYiBwZXIgc3BsaXQgYmlnIHVyYiAqLworCXVuc2lnbmVkIHVyYl9sZW47CisKKwl1OAkJCXNicm47CQkvKiBwYWNrZWQgcmVsZWFzZSBudW1iZXIgKi8KK307CisKKyNkZWZpbmUgRUhDSV9JQUFfSklGRklFUwkoSFovMTAwKQkvKiBhcmJpdHJhcnk7IH4xMCBtc2VjICovCisjZGVmaW5lIEVIQ0lfSU9fSklGRklFUwkgCShIWi8xMCkJCS8qIGlvIHdhdGNoZG9nID4gaXJxX3RocmVzaCAqLworI2RlZmluZSBFSENJX0FTWU5DX0pJRkZJRVMgICAgICAoSFovMjApCQkvKiBhc3luYyBpZGxlIHRpbWVvdXQgKi8KKyNkZWZpbmUgRUhDSV9TSFJJTktfSklGRklFUyAgICAgKEhaLzIwMCkJLyogYXN5bmMgcWggdW5saW5rIGRlbGF5ICovCisKK2VudW0gZWhjaV90aW1lcl9hY3Rpb24geworCVRJTUVSX0lPX1dBVENIRE9HLAorCVRJTUVSX0lBQV9XQVRDSERPRywKKwlUSU1FUl9BU1lOQ19TSFJJTkssCisJVElNRVJfQVNZTkNfT0ZGLAorfTsKKworI2luY2x1ZGUgPGxpbnV4L294dTIxMGhwLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L3BjaS1xdWlya3MuYyBiL2RyaXZlcnMvdXNiL2hvc3QvcGNpLXF1aXJrcy5jCmluZGV4IGFlNmU3MGUuLjc1YjY5ODQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QvcGNpLXF1aXJrcy5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QvcGNpLXF1aXJrcy5jCkBAIC0xNzIsOSArMTcyLDkgQEAKIAlpZiAoIW1taW9fcmVzb3VyY2VfZW5hYmxlZChwZGV2LCAwKSkKIAkJcmV0dXJuOwogCi0JYmFzZSA9IGlvcmVtYXBfbm9jYWNoZShwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMCksCi0JCQkJICAgICBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDApKTsKLQlpZiAoYmFzZSA9PSBOVUxMKSByZXR1cm47CisJYmFzZSA9IHBjaV9pb3JlbWFwX2JhcihwZGV2LCAwKTsKKwlpZiAoYmFzZSA9PSBOVUxMKQorCQlyZXR1cm47CiAKIC8qIE9uIFBBLVJJU0MsIFBEQyBjYW4gbGVhdmUgSVIgc2V0IGluY29ycmVjdGx5OyBpZ25vcmUgaXQgdGhlcmUuICovCiAjaWZuZGVmIF9faHBwYV9fCkBAIC0yMjEsOSArMjIxLDkgQEAKIAlpZiAoIW1taW9fcmVzb3VyY2VfZW5hYmxlZChwZGV2LCAwKSkKIAkJcmV0dXJuOwogCi0JYmFzZSA9IGlvcmVtYXBfbm9jYWNoZShwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMCksCi0JCQkJcGNpX3Jlc291cmNlX2xlbihwZGV2LCAwKSk7Ci0JaWYgKGJhc2UgPT0gTlVMTCkgcmV0dXJuOworCWJhc2UgPSBwY2lfaW9yZW1hcF9iYXIocGRldiwgMCk7CisJaWYgKGJhc2UgPT0gTlVMTCkKKwkJcmV0dXJuOwogCiAJY2FwX2xlbmd0aCA9IHJlYWRiKGJhc2UpOwogCW9wX3JlZ19iYXNlID0gYmFzZSArIGNhcF9sZW5ndGg7CkBAIC0yNzEsNyArMjcxLDcgQEAKIAkJCS8qIGlmIGJvb3QgZmlybXdhcmUgbm93IG93bnMgRUhDSSwgc3BpbiB0aWxsCiAJCQkgKiBpdCBoYW5kcyBpdCBvdmVyLgogCQkJICovCi0JCQltc2VjID0gNTAwMDsKKwkJCW1zZWMgPSAxMDAwOwogCQkJd2hpbGUgKChjYXAgJiBFSENJX1VTQkxFR1NVUF9CSU9TKSAmJiAobXNlYyA+IDApKSB7CiAJCQkJdHJpZWRfaGFuZG9mZiA9IDE7CiAJCQkJbXNsZWVwKDEwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QvcjhhNjY1OTctaGNkLmMgYi9kcml2ZXJzL3VzYi9ob3N0L3I4YTY2NTk3LWhjZC5jCmluZGV4IGMyMWYxNGUuLjMxOTA0MTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QvcjhhNjY1OTctaGNkLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9yOGE2NjU5Ny1oY2QuYwpAQCAtMjI3NSw3ICsyMjc1LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotI2RlZmluZSByZXNvdXJjZV9sZW4ocikgKCgociktPmVuZCAtIChyKS0+c3RhcnQpICsgMSkKIHN0YXRpYyBpbnQgX19pbml0IHI4YTY2NTk3X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAjaWYgZGVmaW5lZChDT05GSUdfU1VQRVJIX09OX0NISVBfUjhBNjY1OTcpICYmIGRlZmluZWQoQ09ORklHX0hBVkVfQ0xLKQpAQCAtMjI5NiwxMSArMjI5NSwxMCBAQAogCQlnb3RvIGNsZWFuX3VwOwogCX0KIAotCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZV9ieW5hbWUocGRldiwgSU9SRVNPVVJDRV9NRU0sCi0JCQkJCSAgIChjaGFyICopaGNkX25hbWUpOworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CiAJaWYgKCFyZXMpIHsKIAkJcmV0ID0gLUVOT0RFVjsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAicGxhdGZvcm1fZ2V0X3Jlc291cmNlX2J5bmFtZSBlcnJvci5cbiIpOworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJwbGF0Zm9ybV9nZXRfcmVzb3VyY2UgZXJyb3IuXG4iKTsKIAkJZ290byBjbGVhbl91cDsKIAl9CiAKQEAgLTIzMTUsNyArMjMxMyw3IEBACiAJaXJxID0gaXJlcy0+c3RhcnQ7CiAJaXJxX3RyaWdnZXIgPSBpcmVzLT5mbGFncyAmIElSUUZfVFJJR0dFUl9NQVNLOwogCi0JcmVnID0gaW9yZW1hcChyZXMtPnN0YXJ0LCByZXNvdXJjZV9sZW4ocmVzKSk7CisJcmVnID0gaW9yZW1hcChyZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlcykpOwogCWlmIChyZWcgPT0gTlVMTCkgewogCQlyZXQgPSAtRU5PTUVNOwogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJpb3JlbWFwIGVycm9yLlxuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L3VoY2ktaGNkLmMgYi9kcml2ZXJzL3VzYi9ob3N0L3VoY2ktaGNkLmMKaW5kZXggY2Y1ZTRjZi4uNGUyMjEwNiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC91aGNpLWhjZC5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QvdWhjaS1oY2QuYwpAQCAtOTQyLDYgKzk0Miw4IEBACiAKICNpZmRlZglDT05GSUdfUE0KIAkuc3VzcGVuZCA9CXVzYl9oY2RfcGNpX3N1c3BlbmQsCisJLnN1c3BlbmRfbGF0ZSA9CXVzYl9oY2RfcGNpX3N1c3BlbmRfbGF0ZSwKKwkucmVzdW1lX2Vhcmx5ID0JdXNiX2hjZF9wY2lfcmVzdW1lX2Vhcmx5LAogCS5yZXN1bWUgPQl1c2JfaGNkX3BjaV9yZXN1bWUsCiAjZW5kaWYJLyogUE0gKi8KIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9pbWFnZS9taWNyb3Rlay5jIGIvZHJpdmVycy91c2IvaW1hZ2UvbWljcm90ZWsuYwppbmRleCA4ODU4NjdhLi40NTQxZGZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9pbWFnZS9taWNyb3Rlay5jCisrKyBiL2RyaXZlcnMvdXNiL2ltYWdlL21pY3JvdGVrLmMKQEAgLTM1MCwxNyArMzUwLDE2IEBACiBzdGF0aWMgaW50IG10c19zY3NpX2hvc3RfcmVzZXQoc3RydWN0IHNjc2lfY21uZCAqc3JiKQogewogCXN0cnVjdCBtdHNfZGVzYyogZGVzYyA9IChzdHJ1Y3QgbXRzX2Rlc2MqKShzcmItPmRldmljZS0+aG9zdC0+aG9zdGRhdGFbMF0pOwotCWludCByZXN1bHQsIHJjOworCWludCByZXN1bHQ7CiAKIAlNVFNfREVCVUdfR09UX0hFUkUoKTsKIAltdHNfZGVidWdfZHVtcChkZXNjKTsKIAotCXJjID0gdXNiX2xvY2tfZGV2aWNlX2Zvcl9yZXNldChkZXNjLT51c2JfZGV2LCBkZXNjLT51c2JfaW50Zik7Ci0JaWYgKHJjIDwgMCkKLQkJcmV0dXJuIEZBSUxFRDsKLQlyZXN1bHQgPSB1c2JfcmVzZXRfZGV2aWNlKGRlc2MtPnVzYl9kZXYpOwotCWlmIChyYykKKwlyZXN1bHQgPSB1c2JfbG9ja19kZXZpY2VfZm9yX3Jlc2V0KGRlc2MtPnVzYl9kZXYsIGRlc2MtPnVzYl9pbnRmKTsKKwlpZiAocmVzdWx0ID09IDApIHsKKwkJcmVzdWx0ID0gdXNiX3Jlc2V0X2RldmljZShkZXNjLT51c2JfZGV2KTsKIAkJdXNiX3VubG9ja19kZXZpY2UoZGVzYy0+dXNiX2Rldik7CisJfQogCXJldHVybiByZXN1bHQgPyBGQUlMRUQgOiBTVUNDRVNTOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9taXNjL2JlcnJ5X2NoYXJnZS5jIGIvZHJpdmVycy91c2IvbWlzYy9iZXJyeV9jaGFyZ2UuYwppbmRleCAyNGUyZGMzLi5jMDVhODViIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9taXNjL2JlcnJ5X2NoYXJnZS5jCisrKyBiL2RyaXZlcnMvdXNiL21pc2MvYmVycnlfY2hhcmdlLmMKQEAgLTEyMyw2ICsxMjMsMTEgQEAKIHsKIAlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IGludGVyZmFjZV90b191c2JkZXYoaW50Zik7CiAKKwlpZiAodWRldi0+YnVzX21BIDwgNTAwKSB7CisJCWRiZygmdWRldi0+ZGV2LCAiTm90IGVub3VnaCBwb3dlciB0byBjaGFyZ2UgYXZhaWxhYmxlXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCiAJZGJnKCZ1ZGV2LT5kZXYsICJQb3dlciBpcyBzZXQgdG8gJWRtQVxuIiwKIAkgICAgdWRldi0+YWN0Y29uZmlnLT5kZXNjLmJNYXhQb3dlciAqIDIpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9taXNjL2VtaTI2LmMgYi9kcml2ZXJzL3VzYi9taXNjL2VtaTI2LmMKaW5kZXggZTc2MmJlYi4uODc5YTk4MCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbWlzYy9lbWkyNi5jCisrKyBiL2RyaXZlcnMvdXNiL21pc2MvZW1pMjYuYwpAQCAtMTYwLDcgKzE2MCw3IEBACiAJCQllcnIoIiVzIC0gZXJyb3IgbG9hZGluZyBmaXJtd2FyZTogZXJyb3IgPSAlZCIsIF9fZnVuY19fLCBlcnIpOwogCQkJZ290byB3cmFwZXJyOwogCQl9Ci0JfSB3aGlsZSAoaSA+IDApOworCX0gd2hpbGUgKHJlYyk7CiAKIAkvKiBBc3NlcnQgcmVzZXQgKHN0b3AgdGhlIENQVSBpbiB0aGUgRU1JKSAqLwogCWVyciA9IGVtaTI2X3NldF9yZXNldChkZXYsMSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9taXNjL3VzYnRlc3QuYyBiL2RyaXZlcnMvdXNiL21pc2MvdXNidGVzdC5jCmluZGV4IDQ0NGM2OWMuLjVmMWExOWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL21pc2MvdXNidGVzdC5jCisrKyBiL2RyaXZlcnMvdXNiL21pc2MvdXNidGVzdC5jCkBAIC0xOTIsOCArMTkyLDYgQEAKIHsKIAlzdHJ1Y3QgdXJiCQkqdXJiOwogCi0JaWYgKGJ5dGVzIDwgMCkKLQkJcmV0dXJuIE5VTEw7CiAJdXJiID0gdXNiX2FsbG9jX3VyYiAoMCwgR0ZQX0tFUk5FTCk7CiAJaWYgKCF1cmIpCiAJCXJldHVybiB1cmI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tb24vS2NvbmZpZyBiL2RyaXZlcnMvdXNiL21vbi9LY29uZmlnCmluZGV4IGRlYjlkZGYuLmYyOGYzNTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL21vbi9LY29uZmlnCisrKyBiL2RyaXZlcnMvdXNiL21vbi9LY29uZmlnCkBAIC0zLDE0ICszLDEzIEBACiAjCiAKIGNvbmZpZyBVU0JfTU9OCi0JYm9vbCAiVVNCIE1vbml0b3IiCi0JZGVwZW5kcyBvbiBVU0IhPW4KLQlkZWZhdWx0IHkKKwl0cmlzdGF0ZSAiVVNCIE1vbml0b3IiCisJZGVwZW5kcyBvbiBVU0IKKwlkZWZhdWx0IHkgaWYgVVNCPXkKKwlkZWZhdWx0IG0gaWYgVVNCPW0KIAloZWxwCi0JICBJZiB5b3Ugc2F5IFkgaGVyZSwgYSBjb21wb25lbnQgd2hpY2ggY2FwdHVyZXMgdGhlIFVTQiB0cmFmZmljCisJICBJZiB5b3Ugc2VsZWN0IHRoaXMgb3B0aW9uLCBhIGNvbXBvbmVudCB3aGljaCBjYXB0dXJlcyB0aGUgVVNCIHRyYWZmaWMKIAkgIGJldHdlZW4gcGVyaXBoZXJhbC1zcGVjaWZpYyBkcml2ZXJzIGFuZCBIQyBkcml2ZXJzIHdpbGwgYmUgYnVpbHQuCiAJICBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIDxmaWxlOkRvY3VtZW50YXRpb24vdXNiL3VzYm1vbi50eHQ+LgogCi0JICBUaGlzIGlzIHNvbWV3aGF0IGV4cGVyaW1lbnRhbCBhdCB0aGlzIHRpbWUsIGJ1dCBpdCBzaG91bGQgYmUgc2FmZS4KLQotCSAgSWYgdW5zdXJlLCBzYXkgWS4KKwkgIElmIHVuc3VyZSwgc2F5IFkgKGlmIGFsbG93ZWQpLCBvdGhlcndpc2UgTS4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21vbi9NYWtlZmlsZSBiL2RyaXZlcnMvdXNiL21vbi9NYWtlZmlsZQppbmRleCAwZjc2ZWQ1Li5jNjUxNmI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9tb24vTWFrZWZpbGUKKysrIGIvZHJpdmVycy91c2IvbW9uL01ha2VmaWxlCkBAIC00LDUgKzQsNCBAQAogCiB1c2Jtb24tb2Jqcwk6PSBtb25fbWFpbi5vIG1vbl9zdGF0Lm8gbW9uX3RleHQubyBtb25fYmluLm8gbW9uX2RtYS5vCiAKLSMgVGhpcyBkb2VzIG5vdCB1c2UgQ09ORklHX1VTQl9NT04gYmVjYXVzZSB3ZSB3YW50IHRoaXMgdG8gdXNlIGEgdHJpc3RhdGUuCi1vYmotJChDT05GSUdfVVNCKQkrPSB1c2Jtb24ubworb2JqLSQoQ09ORklHX1VTQl9NT04pCSs9IHVzYm1vbi5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tdXNiL0tjb25maWcgYi9kcml2ZXJzL3VzYi9tdXNiL0tjb25maWcKaW5kZXggNGI5NTQyYi4uNWFmNzM3OSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbXVzYi9LY29uZmlnCisrKyBiL2RyaXZlcnMvdXNiL211c2IvS2NvbmZpZwpAQCAtMTEsNyArMTEsNyBAQAogCWRlcGVuZHMgb24gKFVTQiB8fCBVU0JfR0FER0VUKSAmJiBIQVZFX0NMSwogCWRlcGVuZHMgb24gIVNVUEVSSAogCXNlbGVjdCBUV0w0MDMwX1VTQiBpZiBNQUNIX09NQVBfMzQzMFNEUAotCXRyaXN0YXRlICdJbnZlbnRyYSBIaWdoc3BlZWQgRHVhbCBSb2xlIENvbnRyb2xsZXIgKFRJLCAuLi4pJworCXRyaXN0YXRlICdJbnZlbnRyYSBIaWdoc3BlZWQgRHVhbCBSb2xlIENvbnRyb2xsZXIgKFRJLCBBREksIC4uLiknCiAJaGVscAogCSAgU2F5IFkgaGVyZSBpZiB5b3VyIHN5c3RlbSBoYXMgYSBkdWFsIHJvbGUgaGlnaCBzcGVlZCBVU0IKIAkgIGNvbnRyb2xsZXIgYmFzZWQgb24gdGhlIE1lbnRvciBHcmFwaGljcyBzaWxpY29uIElQLiAgVGhlbgpAQCAtMjIsNiArMjIsOSBAQAogCSAgVGV4YXMgSW5zdHJ1bWVudHMgcGFydHMgdXNpbmcgdGhpcyBJUCBpbmNsdWRlIERhVmluY2kgNjQ0eCwKIAkgIE9NQVAgMjQzeCwgT01BUCAzNDN4LCBhbmQgVFVTQiA2MDEwLgogCisJICBBbmFsb2cgRGV2aWNlcyBwYXJ0cyB1c2luZyB0aGlzIElQIGluY2x1ZGUgQmxhY2tmaW4gQkY1NHgsCisJICBCRjUyNSBhbmQgQkY1MjcuCisKIAkgIElmIHlvdSBkbyBub3Qga25vdyB3aGF0IHRoaXMgaXMsIHBsZWFzZSBzYXkgTi4KIAogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTsgdGhlCkBAIC0zMyw2ICszNiw4IEBACiAJZGVmYXVsdCB5IGlmIEFSQ0hfREFWSU5DSQogCWRlZmF1bHQgeSBpZiBBUkNIX09NQVAyNDMwCiAJZGVmYXVsdCB5IGlmIEFSQ0hfT01BUDM0WFgKKwlkZWZhdWx0IHkgaWYgKEJGNTR4ICYmICFCRjU0NCkKKwlkZWZhdWx0IHkgaWYgKEJGNTJ4ICYmICFCRjUyMiAmJiAhQkY1MjMpCiAKIGNvbW1lbnQgIkRhVmluY2kgNjQ0eCBVU0Igc3VwcG9ydCIKIAlkZXBlbmRzIG9uIFVTQl9NVVNCX0hEUkMgJiYgQVJDSF9EQVZJTkNJCkBAIC00Myw2ICs0OCw5IEBACiBjb21tZW50ICJPTUFQIDM0M3ggaGlnaCBzcGVlZCBVU0Igc3VwcG9ydCIKIAlkZXBlbmRzIG9uIFVTQl9NVVNCX0hEUkMgJiYgQVJDSF9PTUFQMzRYWAogCitjb21tZW50ICJCbGFja2ZpbiBoaWdoIHNwZWVkIFVTQiBTdXBwb3J0IgorCWRlcGVuZHMgb24gVVNCX01VU0JfSERSQyAmJiAoQkY1NHggJiYgIUJGNTQ0KSB8fCAoQkY1MnggJiYgIUJGNTIyICYmICFCRjUyMykKKwogY29uZmlnIFVTQl9UVVNCNjAxMAogCWJvb2xlYW4gIlRVU0IgNjAxMCBzdXBwb3J0IgogCWRlcGVuZHMgb24gVVNCX01VU0JfSERSQyAmJiAhVVNCX01VU0JfU09DCkBAIC0xNDIsNyArMTUwLDcgQEAKIGNvbmZpZyBVU0JfSU5WRU5UUkFfRE1BCiAJYm9vbAogCWRlcGVuZHMgb24gVVNCX01VU0JfSERSQyAmJiAhTVVTQl9QSU9fT05MWQotCWRlZmF1bHQgQVJDSF9PTUFQMjQzMCB8fCBBUkNIX09NQVAzNFhYCisJZGVmYXVsdCBBUkNIX09NQVAyNDMwIHx8IEFSQ0hfT01BUDM0WFggfHwgQkxBQ0tGSU4KIAloZWxwCiAJICBFbmFibGUgRE1BIHRyYW5zZmVycyB1c2luZyBNZW50b3IncyBlbmdpbmUuCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL211c2IvTWFrZWZpbGUgYi9kcml2ZXJzL3VzYi9tdXNiL01ha2VmaWxlCmluZGV4IGI2YWYwZDYuLjg1NzEwY2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL211c2IvTWFrZWZpbGUKKysrIGIvZHJpdmVycy91c2IvbXVzYi9NYWtlZmlsZQpAQCAtMjIsNiArMjIsMTQgQEAKIAltdXNiX2hkcmMtb2JqcwkrPSBvbWFwMjQzMC5vCiBlbmRpZgogCitpZmVxICgkKENPTkZJR19CRjU0eCkseSkKKwltdXNiX2hkcmMtb2JqcwkrPSBibGFja2Zpbi5vCitlbmRpZgorCitpZmVxICgkKENPTkZJR19CRjUyeCkseSkKKwltdXNiX2hkcmMtb2JqcwkrPSBibGFja2Zpbi5vCitlbmRpZgorCiBpZmVxICgkKENPTkZJR19VU0JfR0FER0VUX01VU0JfSERSQykseSkKIAltdXNiX2hkcmMtb2JqcwkJKz0gbXVzYl9nYWRnZXRfZXAwLm8gbXVzYl9nYWRnZXQubwogZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL211c2IvYmxhY2tmaW4uYyBiL2RyaXZlcnMvdXNiL211c2IvYmxhY2tmaW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODYxMzQ4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2IvbXVzYi9ibGFja2Zpbi5jCkBAIC0wLDAgKzEsMzIwIEBACisvKgorICogTVVTQiBPVEcgY29udHJvbGxlciBkcml2ZXIgZm9yIEJsYWNrZmluIFByb2Nlc3NvcnMKKyAqCisgKiBDb3B5cmlnaHQgMjAwNi0yMDA4IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisKKyNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgorCisjaW5jbHVkZSAibXVzYl9jb3JlLmgiCisjaW5jbHVkZSAiYmxhY2tmaW4uaCIKKworLyoKKyAqIExvYWQgYW4gZW5kcG9pbnQncyBGSUZPCisgKi8KK3ZvaWQgbXVzYl93cml0ZV9maWZvKHN0cnVjdCBtdXNiX2h3X2VwICpod19lcCwgdTE2IGxlbiwgY29uc3QgdTggKnNyYykKK3sKKwl2b2lkIF9faW9tZW0gKmZpZm8gPSBod19lcC0+ZmlmbzsKKwl2b2lkIF9faW9tZW0gKmVwaW8gPSBod19lcC0+cmVnczsKKworCXByZWZldGNoKCh1OCAqKXNyYyk7CisKKwltdXNiX3dyaXRldyhlcGlvLCBNVVNCX1RYQ09VTlQsIGxlbik7CisKKwlEQkcoNCwgIlRYIGVwJWQgZmlmbyAlcCBjb3VudCAlZCBidWYgJXAsIGVwaW8gJXBcbiIsCisJCQlod19lcC0+ZXBudW0sIGZpZm8sIGxlbiwgc3JjLCBlcGlvKTsKKworCWR1bXBfZmlmb19kYXRhKHNyYywgbGVuKTsKKworCWlmICh1bmxpa2VseSgodW5zaWduZWQgbG9uZylzcmMgJiAweDAxKSkKKwkJb3V0c3dfOCgodW5zaWduZWQgbG9uZylmaWZvLCBzcmMsCisJCQlsZW4gJiAweDAxID8gKGxlbiA+PiAxKSArIDEgOiBsZW4gPj4gMSk7CisJZWxzZQorCQlvdXRzdygodW5zaWduZWQgbG9uZylmaWZvLCBzcmMsCisJCQlsZW4gJiAweDAxID8gKGxlbiA+PiAxKSArIDEgOiBsZW4gPj4gMSk7Cit9CisKKy8qCisgKiBVbmxvYWQgYW4gZW5kcG9pbnQncyBGSUZPCisgKi8KK3ZvaWQgbXVzYl9yZWFkX2ZpZm8oc3RydWN0IG11c2JfaHdfZXAgKmh3X2VwLCB1MTYgbGVuLCB1OCAqZHN0KQoreworCXZvaWQgX19pb21lbSAqZmlmbyA9IGh3X2VwLT5maWZvOworCXU4IGVwbnVtID0gaHdfZXAtPmVwbnVtOworCXUxNiBkbWFfcmVnID0gMDsKKworCURCRyg0LCAiJWNYIGVwJWQgZmlmbyAlcCBjb3VudCAlZCBidWYgJXBcbiIsCisJCQknUicsIGh3X2VwLT5lcG51bSwgZmlmbywgbGVuLCBkc3QpOworCisjaWZkZWYgQ09ORklHX0JGNTJ4CisJaW52YWxpZGF0ZV9kY2FjaGVfcmFuZ2UoKHVuc2lnbmVkIGludClkc3QsCisJCSh1bnNpZ25lZCBpbnQpKGRzdCArIGxlbikpOworCisJLyogU2V0dXAgRE1BIGFkZHJlc3MgcmVnaXN0ZXIgKi8KKwlkbWFfcmVnID0gKHUxNikgKCh1MzIpIGRzdCAmIDB4RkZGRik7CisJYmZpbl93cml0ZTE2KFVTQl9ETUFfUkVHKGVwbnVtLCBVU0JfRE1BeF9BRERSX0xPVyksIGRtYV9yZWcpOworCVNTWU5DKCk7CisKKwlkbWFfcmVnID0gKHUxNikgKCgodTMyKSBkc3QgPj4gMTYpICYgMHhGRkZGKTsKKwliZmluX3dyaXRlMTYoVVNCX0RNQV9SRUcoZXBudW0sIFVTQl9ETUF4X0FERFJfSElHSCksIGRtYV9yZWcpOworCVNTWU5DKCk7CisKKwkvKiBTZXR1cCBETUEgY291bnQgcmVnaXN0ZXIgKi8KKwliZmluX3dyaXRlMTYoVVNCX0RNQV9SRUcoZXBudW0sIFVTQl9ETUF4X0NPVU5UX0xPVyksIGxlbik7CisJYmZpbl93cml0ZTE2KFVTQl9ETUFfUkVHKGVwbnVtLCBVU0JfRE1BeF9DT1VOVF9ISUdIKSwgMCk7CisJU1NZTkMoKTsKKworCS8qIEVuYWJsZSB0aGUgRE1BICovCisJZG1hX3JlZyA9IChlcG51bSA8PCA0KSB8IERNQV9FTkEgfCBJTlRfRU5BOworCWJmaW5fd3JpdGUxNihVU0JfRE1BX1JFRyhlcG51bSwgVVNCX0RNQXhfQ1RSTCksIGRtYV9yZWcpOworCVNTWU5DKCk7CisKKwkvKiBXYWl0IGZvciBjb21wZWxldGUgKi8KKwl3aGlsZSAoIShiZmluX3JlYWRfVVNCX0RNQV9JTlRFUlJVUFQoKSAmICgxIDw8IGVwbnVtKSkpCisJCWNwdV9yZWxheCgpOworCisJLyogYWNrbm93bGVkZ2UgZG1hIGludGVycnVwdCAqLworCWJmaW5fd3JpdGVfVVNCX0RNQV9JTlRFUlJVUFQoMSA8PCBlcG51bSk7CisJU1NZTkMoKTsKKworCS8qIFJlc2V0IERNQSAqLworCWJmaW5fd3JpdGUxNihVU0JfRE1BX1JFRyhlcG51bSwgVVNCX0RNQXhfQ1RSTCksIDApOworCVNTWU5DKCk7CisjZWxzZQorCWlmICh1bmxpa2VseSgodW5zaWduZWQgbG9uZylkc3QgJiAweDAxKSkKKwkJaW5zd184KCh1bnNpZ25lZCBsb25nKWZpZm8sIGRzdCwKKwkJCWxlbiAmIDB4MDEgPyAobGVuID4+IDEpICsgMSA6IGxlbiA+PiAxKTsKKwllbHNlCisJCWluc3coKHVuc2lnbmVkIGxvbmcpZmlmbywgZHN0LAorCQkJbGVuICYgMHgwMSA/IChsZW4gPj4gMSkgKyAxIDogbGVuID4+IDEpOworI2VuZGlmCisKKwlkdW1wX2ZpZm9fZGF0YShkc3QsIGxlbik7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBibGFja2Zpbl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqX19oY2kpCit7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKwlpcnFyZXR1cm5fdAlyZXR2YWwgPSBJUlFfTk9ORTsKKwlzdHJ1Y3QgbXVzYgkqbXVzYiA9IF9faGNpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJm11c2ItPmxvY2ssIGZsYWdzKTsKKworCW11c2ItPmludF91c2IgPSBtdXNiX3JlYWRiKG11c2ItPm1yZWdzLCBNVVNCX0lOVFJVU0IpOworCW11c2ItPmludF90eCA9IG11c2JfcmVhZHcobXVzYi0+bXJlZ3MsIE1VU0JfSU5UUlRYKTsKKwltdXNiLT5pbnRfcnggPSBtdXNiX3JlYWR3KG11c2ItPm1yZWdzLCBNVVNCX0lOVFJSWCk7CisKKwlpZiAobXVzYi0+aW50X3VzYiB8fCBtdXNiLT5pbnRfdHggfHwgbXVzYi0+aW50X3J4KSB7CisJCW11c2Jfd3JpdGViKG11c2ItPm1yZWdzLCBNVVNCX0lOVFJVU0IsIG11c2ItPmludF91c2IpOworCQltdXNiX3dyaXRldyhtdXNiLT5tcmVncywgTVVTQl9JTlRSVFgsIG11c2ItPmludF90eCk7CisJCW11c2Jfd3JpdGV3KG11c2ItPm1yZWdzLCBNVVNCX0lOVFJSWCwgbXVzYi0+aW50X3J4KTsKKwkJcmV0dmFsID0gbXVzYl9pbnRlcnJ1cHQobXVzYik7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbXVzYi0+bG9jaywgZmxhZ3MpOworCisJLyogUkVWSVNJVCB3ZSBzb21ldGltZXMgZ2V0IHNwdXJpb3VzIElSUXMgb24gZ19lcDAKKwkgKiBub3QgY2xlYXIgd2h5Li4uIGZhbGwgaW4gQkY1NHggdG9vLgorCSAqLworCWlmIChyZXR2YWwgIT0gSVJRX0hBTkRMRUQpCisJCURCRyg1LCAic3B1cmlvdXM/XG4iKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIHZvaWQgbXVzYl9jb25uX3RpbWVyX2hhbmRsZXIodW5zaWduZWQgbG9uZyBfbXVzYikKK3sKKwlzdHJ1Y3QgbXVzYiAqbXVzYiA9ICh2b2lkICopX211c2I7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1MTYgdmFsOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJm11c2ItPmxvY2ssIGZsYWdzKTsKKwlzd2l0Y2ggKG11c2ItPnhjZWl2LnN0YXRlKSB7CisJY2FzZSBPVEdfU1RBVEVfQV9JRExFOgorCWNhc2UgT1RHX1NUQVRFX0FfV0FJVF9CQ09OOgorCQkvKiBTdGFydCBhIG5ldyBzZXNzaW9uICovCisJCXZhbCA9IG11c2JfcmVhZHcobXVzYi0+bXJlZ3MsIE1VU0JfREVWQ1RMKTsKKwkJdmFsIHw9IE1VU0JfREVWQ1RMX1NFU1NJT047CisJCW11c2Jfd3JpdGV3KG11c2ItPm1yZWdzLCBNVVNCX0RFVkNUTCwgdmFsKTsKKworCQl2YWwgPSBtdXNiX3JlYWR3KG11c2ItPm1yZWdzLCBNVVNCX0RFVkNUTCk7CisJCWlmICghKHZhbCAmIE1VU0JfREVWQ1RMX0JERVZJQ0UpKSB7CisJCQlncGlvX3NldF92YWx1ZShtdXNiLT5jb25maWctPmdwaW9fdnJzZWwsIDEpOworCQkJbXVzYi0+eGNlaXYuc3RhdGUgPSBPVEdfU1RBVEVfQV9XQUlUX0JDT047CisJCX0gZWxzZSB7CisJCQlncGlvX3NldF92YWx1ZShtdXNiLT5jb25maWctPmdwaW9fdnJzZWwsIDApOworCisJCQkvKiBJZ25vcmUgVkJVU0VSUk9SIGFuZCBTVVNQRU5EIElSUSAqLworCQkJdmFsID0gbXVzYl9yZWFkYihtdXNiLT5tcmVncywgTVVTQl9JTlRSVVNCRSk7CisJCQl2YWwgJj0gfk1VU0JfSU5UUl9WQlVTRVJST1I7CisJCQltdXNiX3dyaXRlYihtdXNiLT5tcmVncywgTVVTQl9JTlRSVVNCRSwgdmFsKTsKKworCQkJdmFsID0gTVVTQl9JTlRSX1NVU1BFTkQgfCBNVVNCX0lOVFJfVkJVU0VSUk9SOworCQkJbXVzYl93cml0ZWIobXVzYi0+bXJlZ3MsIE1VU0JfSU5UUlVTQiwgdmFsKTsKKworCQkJdmFsID0gTVVTQl9QT1dFUl9IU0VOQUI7CisJCQltdXNiX3dyaXRlYihtdXNiLT5tcmVncywgTVVTQl9QT1dFUiwgdmFsKTsKKwkJfQorCQltb2RfdGltZXIoJm11c2JfY29ubl90aW1lciwgamlmZmllcyArIFRJTUVSX0RFTEFZKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlEQkcoMSwgIiVzIHN0YXRlIG5vdCBoYW5kbGVkXG4iLCBvdGdfc3RhdGVfc3RyaW5nKG11c2IpKTsKKwkJYnJlYWs7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm11c2ItPmxvY2ssIGZsYWdzKTsKKworCURCRyg0LCAic3RhdGUgaXMgJXNcbiIsIG90Z19zdGF0ZV9zdHJpbmcobXVzYikpOworfQorCit2b2lkIG11c2JfcGxhdGZvcm1fZW5hYmxlKHN0cnVjdCBtdXNiICptdXNiKQoreworCWlmIChpc19ob3N0X2VuYWJsZWQobXVzYikpIHsKKwkJbW9kX3RpbWVyKCZtdXNiX2Nvbm5fdGltZXIsIGppZmZpZXMgKyBUSU1FUl9ERUxBWSk7CisJCW11c2ItPmFfd2FpdF9iY29uID0gVElNRVJfREVMQVk7CisJfQorfQorCit2b2lkIG11c2JfcGxhdGZvcm1fZGlzYWJsZShzdHJ1Y3QgbXVzYiAqbXVzYikKK3sKK30KKworc3RhdGljIHZvaWQgYmZpbl92YnVzX3Bvd2VyKHN0cnVjdCBtdXNiICptdXNiLCBpbnQgaXNfb24sIGludCBzbGVlcGluZykKK3sKK30KKworc3RhdGljIHZvaWQgYmZpbl9zZXRfdmJ1cyhzdHJ1Y3QgbXVzYiAqbXVzYiwgaW50IGlzX29uKQoreworCWlmIChpc19vbikKKwkJZ3Bpb19zZXRfdmFsdWUobXVzYi0+Y29uZmlnLT5ncGlvX3Zyc2VsLCAxKTsKKwllbHNlCisJCWdwaW9fc2V0X3ZhbHVlKG11c2ItPmNvbmZpZy0+Z3Bpb192cnNlbCwgMCk7CisKKwlEQkcoMSwgIlZCVVMgJXMsIGRldmN0bCAlMDJ4ICIKKwkJLyogb3RnICUzeCBjb25mICUwOHggcHJjbSAlMDh4ICovICJcbiIsCisJCW90Z19zdGF0ZV9zdHJpbmcobXVzYiksCisJCW11c2JfcmVhZGIobXVzYi0+bXJlZ3MsIE1VU0JfREVWQ1RMKSk7Cit9CisKK3N0YXRpYyBpbnQgYmZpbl9zZXRfcG93ZXIoc3RydWN0IG90Z190cmFuc2NlaXZlciAqeCwgdW5zaWduZWQgbUEpCit7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgbXVzYl9wbGF0Zm9ybV90cnlfaWRsZShzdHJ1Y3QgbXVzYiAqbXVzYiwgdW5zaWduZWQgbG9uZyB0aW1lb3V0KQoreworCWlmIChpc19ob3N0X2VuYWJsZWQobXVzYikpCisJCW1vZF90aW1lcigmbXVzYl9jb25uX3RpbWVyLCBqaWZmaWVzICsgVElNRVJfREVMQVkpOworfQorCitpbnQgbXVzYl9wbGF0Zm9ybV9nZXRfdmJ1c19zdGF0dXMoc3RydWN0IG11c2IgKm11c2IpCit7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgbXVzYl9wbGF0Zm9ybV9zZXRfbW9kZShzdHJ1Y3QgbXVzYiAqbXVzYiwgdTggbXVzYl9tb2RlKQoreworfQorCitpbnQgX19pbml0IG11c2JfcGxhdGZvcm1faW5pdChzdHJ1Y3QgbXVzYiAqbXVzYikKK3sKKworCS8qCisJICogUmV2IDEuMCBCRjU0OSBFWi1LSVRzIHJlcXVpcmUgUEU3IHRvIGJlIGhpZ2ggZm9yIGJvdGggREVWSUNFCisJICogYW5kIE9URyBIT1NUIG1vZGVzLCB3aGlsZSByZXYgMS4xIGFuZCBncmVhdGVyIHJlcXVpcmUgUEU3IHRvCisJICogYmUgbG93IGZvciBERVZJQ0UgbW9kZSBhbmQgaGlnaCBmb3IgSE9TVCBtb2RlLiBXZSBzZXQgaXQgaGlnaAorCSAqIGhlcmUgYmVjYXVzZSB3ZSBhcmUgaW4gaG9zdCBtb2RlCisJICovCisKKwlpZiAoZ3Bpb19yZXF1ZXN0KG11c2ItPmNvbmZpZy0+Z3Bpb192cnNlbCwgIlVTQl9WUlNFTCIpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiRmFpbGVkIHJvIHJlcXVlc3QgVVNCX1ZSU0VMIEdQSU9fJWQgXG4iLAorCQkJbXVzYi0+Y29uZmlnLT5ncGlvX3Zyc2VsKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCWdwaW9fZGlyZWN0aW9uX291dHB1dChtdXNiLT5jb25maWctPmdwaW9fdnJzZWwsIDApOworCisJaWYgKEFOT01BTFlfMDUwMDAzNDYpIHsKKwkJYmZpbl93cml0ZV9VU0JfQVBIWV9DQUxJQihBTk9NQUxZXzA1MDAwMzQ2X3ZhbHVlKTsKKwkJU1NZTkMoKTsKKwl9CisKKwlpZiAoQU5PTUFMWV8wNTAwMDM0NykgeworCQliZmluX3dyaXRlX1VTQl9BUEhZX0NOVFJMKDB4MCk7CisJCVNTWU5DKCk7CisJfQorCisJLyogVE9ETworCSAqIFNldCBTSUMtSVZHIHJlZ2lzdGVyCisJICovCisKKwkvKiBDb25maWd1cmUgUExMIG9zY2lsbGF0b3IgcmVnaXN0ZXIgKi8KKwliZmluX3dyaXRlX1VTQl9QTExPU0NfQ1RSTCgweDMwYTgpOworCVNTWU5DKCk7CisKKwliZmluX3dyaXRlX1VTQl9TUlBfQ0xLRElWKChnZXRfc2NsaygpLzEwMDApIC8gMzIgLSAxKTsKKwlTU1lOQygpOworCisJYmZpbl93cml0ZV9VU0JfRVBfTkkwX1JYTUFYUCg2NCk7CisJU1NZTkMoKTsKKworCWJmaW5fd3JpdGVfVVNCX0VQX05JMF9UWE1BWFAoNjQpOworCVNTWU5DKCk7CisKKwkvKiBSb3V0ZSBJTlRSVVNCL0lOVFJfUlgvSU5UUl9UWCB0byBVU0JfSU5UMCovCisJYmZpbl93cml0ZV9VU0JfR0xPQklOVFIoMHg3KTsKKwlTU1lOQygpOworCisJYmZpbl93cml0ZV9VU0JfR0xPQkFMX0NUTChHTE9CQUxfRU5BIHwgRVAxX1RYX0VOQSB8IEVQMl9UWF9FTkEgfAorCQkJCUVQM19UWF9FTkEgfCBFUDRfVFhfRU5BIHwgRVA1X1RYX0VOQSB8CisJCQkJRVA2X1RYX0VOQSB8IEVQN19UWF9FTkEgfCBFUDFfUlhfRU5BIHwKKwkJCQlFUDJfUlhfRU5BIHwgRVAzX1JYX0VOQSB8IEVQNF9SWF9FTkEgfAorCQkJCUVQNV9SWF9FTkEgfCBFUDZfUlhfRU5BIHwgRVA3X1JYX0VOQSk7CisJU1NZTkMoKTsKKworCWlmIChpc19ob3N0X2VuYWJsZWQobXVzYikpIHsKKwkJbXVzYi0+Ym9hcmRfc2V0X3ZidXMgPSBiZmluX3NldF92YnVzOworCQlzZXR1cF90aW1lcigmbXVzYl9jb25uX3RpbWVyLAorCQkJbXVzYl9jb25uX3RpbWVyX2hhbmRsZXIsICh1bnNpZ25lZCBsb25nKSBtdXNiKTsKKwl9CisJaWYgKGlzX3BlcmlwaGVyYWxfZW5hYmxlZChtdXNiKSkKKwkJbXVzYi0+eGNlaXYuc2V0X3Bvd2VyID0gYmZpbl9zZXRfcG93ZXI7CisKKwltdXNiLT5pc3IgPSBibGFja2Zpbl9pbnRlcnJ1cHQ7CisKKwlyZXR1cm4gMDsKK30KKworaW50IG11c2JfcGxhdGZvcm1fc3VzcGVuZChzdHJ1Y3QgbXVzYiAqbXVzYikKK3sKKwlyZXR1cm4gMDsKK30KKworaW50IG11c2JfcGxhdGZvcm1fcmVzdW1lKHN0cnVjdCBtdXNiICptdXNiKQoreworCXJldHVybiAwOworfQorCisKK2ludCBtdXNiX3BsYXRmb3JtX2V4aXQoc3RydWN0IG11c2IgKm11c2IpCit7CisKKwliZmluX3ZidXNfcG93ZXIobXVzYiwgMCAvKm9mZiovLCAxKTsKKwlncGlvX2ZyZWUobXVzYi0+Y29uZmlnLT5ncGlvX3Zyc2VsKTsKKwltdXNiX3BsYXRmb3JtX3N1c3BlbmQobXVzYik7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL211c2IvYmxhY2tmaW4uaCBiL2RyaXZlcnMvdXNiL211c2IvYmxhY2tmaW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjQwYzFlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2IvbXVzYi9ibGFja2Zpbi5oCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgYnkgQW5hbG9nIERldmljZXMsIEluYy4KKyAqCisgKiBUaGUgSW52ZW50cmEgQ29udHJvbGxlciBEcml2ZXIgZm9yIExpbnV4IGlzIGZyZWUgc29mdHdhcmU7IHlvdQorICogY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24uCisgKi8KKworI2lmbmRlZiBfX01VU0JfQkxBQ0tGSU5fSF9fCisjZGVmaW5lIF9fTVVTQl9CTEFDS0ZJTl9IX18KKworLyoKKyAqIEJsYWNrZmluIHNwZWNpZmljIGRlZmluaXRpb25zCisgKi8KKworI3VuZGVmIERVTVBfRklGT19EQVRBCisjaWZkZWYgRFVNUF9GSUZPX0RBVEEKK3N0YXRpYyB2b2lkIGR1bXBfZmlmb19kYXRhKHU4ICpidWYsIHUxNiBsZW4pCit7CisJdTggKnRtcCA9IGJ1ZjsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworCQlpZiAoIShpICUgMTYpICYmIGkpCisJCQlwcl9kZWJ1ZygiXG4iKTsKKwkJcHJfZGVidWcoIiUwMnggIiwgKnRtcCsrKTsKKwl9CisJcHJfZGVidWcoIlxuIik7Cit9CisjZWxzZQorI2RlZmluZSBkdW1wX2ZpZm9fZGF0YShidWYsIGxlbikJZG8ge30gd2hpbGUgKDApCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19CRjUyeAorCisjZGVmaW5lIFVTQl9ETUFfQkFTRQkJVVNCX0RNQV9JTlRFUlJVUFQKKyNkZWZpbmUgVVNCX0RNQXhfQ1RSTAkJMHgwNAorI2RlZmluZSBVU0JfRE1BeF9BRERSX0xPVwkweDA4CisjZGVmaW5lIFVTQl9ETUF4X0FERFJfSElHSAkweDBDCisjZGVmaW5lIFVTQl9ETUF4X0NPVU5UX0xPVwkweDEwCisjZGVmaW5lIFVTQl9ETUF4X0NPVU5UX0hJR0gJMHgxNAorCisjZGVmaW5lIFVTQl9ETUFfUkVHKGVwLCByZWcpCShVU0JfRE1BX0JBU0UgKyAweDIwICogZXAgKyByZWcpCisjZW5kaWYKKworLyogQWxtb3N0IDEgc2Vjb25kICovCisjZGVmaW5lIFRJTUVSX0RFTEFZCSgxICogSFopCisKK3N0YXRpYyBzdHJ1Y3QgdGltZXJfbGlzdCBtdXNiX2Nvbm5fdGltZXI7CisKKyNlbmRpZgkvKiBfX01VU0JfQkxBQ0tGSU5fSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tdXNiL2RhdmluY2kuYyBiL2RyaXZlcnMvdXNiL211c2IvZGF2aW5jaS5jCmluZGV4IGRmYjNiY2IuLjBkNTY2ZGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL211c2IvZGF2aW5jaS5jCisrKyBiL2RyaXZlcnMvdXNiL211c2IvZGF2aW5jaS5jCkBAIC0zMiw5ICszMiw5IEBACiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAKLSNpbmNsdWRlIDxhc20vYXJjaC9oYXJkd2FyZS5oPgotI2luY2x1ZGUgPGFzbS9hcmNoL21lbW9yeS5oPgotI2luY2x1ZGUgPGFzbS9hcmNoL2dwaW8uaD4KKyNpbmNsdWRlIDxtYWNoL2FyY2gvaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxtYWNoL2FyY2gvbWVtb3J5Lmg+CisjaW5jbHVkZSA8bWFjaC9hcmNoL2dwaW8uaD4KICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogCiAjaW5jbHVkZSAibXVzYl9jb3JlLmgiCkBAIC0zNjQsNiArMzY0LDE4IEBACiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCitpbnQgbXVzYl9wbGF0Zm9ybV9zZXRfbW9kZShzdHJ1Y3QgbXVzYiAqbXVzYiwgdTggbW9kZSkKK3sKKwkvKiBFVk0gY2FuJ3QgZG8gdGhpcyAocmlnaHQ/KSAqLworCXJldHVybiAtRUlPOworfQorCitpbnQgbXVzYl9wbGF0Zm9ybV9zZXRfbW9kZShzdHJ1Y3QgbXVzYiAqbXVzYiwgdTggbW9kZSkKK3sKKyAgICAgICAvKiBFVk0gY2FuJ3QgZG8gdGhpcyAocmlnaHQ/KSAqLworICAgICAgIHJldHVybiAtRUlPOworfQorCiBpbnQgX19pbml0IG11c2JfcGxhdGZvcm1faW5pdChzdHJ1Y3QgbXVzYiAqbXVzYikKIHsKIAl2b2lkIF9faW9tZW0JKnRpYmFzZSA9IG11c2ItPmN0cmxfYmFzZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL211c2IvbXVzYl9jb3JlLmMgYi9kcml2ZXJzL3VzYi9tdXNiL211c2JfY29yZS5jCmluZGV4IDUyODBkYmEuLjZjN2ZhYWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL211c2IvbXVzYl9jb3JlLmMKKysrIGIvZHJpdmVycy91c2IvbXVzYi9tdXNiX2NvcmUuYwpAQCAtMTQ4LDcgKzE0OCw4IEBACiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKLSNpZm5kZWYgQ09ORklHX1VTQl9UVVNCNjAxMAorI2lmICFkZWZpbmVkKENPTkZJR19VU0JfVFVTQjYwMTApICYmICFkZWZpbmVkKENPTkZJR19CTEFDS0ZJTikKKwogLyoKICAqIExvYWQgYW4gZW5kcG9pbnQncyBGSUZPCiAgKi8KQEAgLTExMjQsMjUgKzExMjUsMjUgQEAKICNlbmRpZgogCXN3aXRjaCAoY2ZnLT5zdHlsZSkgewogCWNhc2UgRklGT19UWDoKLQkJbXVzYl93cml0ZWIobWJhc2UsIE1VU0JfVFhGSUZPU1osIGNfc2l6ZSk7Ci0JCW11c2Jfd3JpdGV3KG1iYXNlLCBNVVNCX1RYRklGT0FERCwgY19vZmYpOworCQltdXNiX3dyaXRlX3R4Zmlmb3N6KG1iYXNlLCBjX3NpemUpOworCQltdXNiX3dyaXRlX3R4Zmlmb2FkZChtYmFzZSwgY19vZmYpOwogCQlod19lcC0+dHhfZG91YmxlX2J1ZmZlcmVkID0gISEoY19zaXplICYgTVVTQl9GSUZPU1pfRFBCKTsKIAkJaHdfZXAtPm1heF9wYWNrZXRfc3pfdHggPSBtYXhwYWNrZXQ7CiAJCWJyZWFrOwogCWNhc2UgRklGT19SWDoKLQkJbXVzYl93cml0ZWIobWJhc2UsIE1VU0JfUlhGSUZPU1osIGNfc2l6ZSk7Ci0JCW11c2Jfd3JpdGV3KG1iYXNlLCBNVVNCX1JYRklGT0FERCwgY19vZmYpOworCQltdXNiX3dyaXRlX3J4Zmlmb3N6KG1iYXNlLCBjX3NpemUpOworCQltdXNiX3dyaXRlX3J4Zmlmb2FkZChtYmFzZSwgY19vZmYpOwogCQlod19lcC0+cnhfZG91YmxlX2J1ZmZlcmVkID0gISEoY19zaXplICYgTVVTQl9GSUZPU1pfRFBCKTsKIAkJaHdfZXAtPm1heF9wYWNrZXRfc3pfcnggPSBtYXhwYWNrZXQ7CiAJCWJyZWFrOwogCWNhc2UgRklGT19SWFRYOgotCQltdXNiX3dyaXRlYihtYmFzZSwgTVVTQl9UWEZJRk9TWiwgY19zaXplKTsKLQkJbXVzYl93cml0ZXcobWJhc2UsIE1VU0JfVFhGSUZPQURELCBjX29mZik7CisJCW11c2Jfd3JpdGVfdHhmaWZvc3oobWJhc2UsIGNfc2l6ZSk7CisJCW11c2Jfd3JpdGVfdHhmaWZvYWRkKG1iYXNlLCBjX29mZik7CiAJCWh3X2VwLT5yeF9kb3VibGVfYnVmZmVyZWQgPSAhIShjX3NpemUgJiBNVVNCX0ZJRk9TWl9EUEIpOwogCQlod19lcC0+bWF4X3BhY2tldF9zel9yeCA9IG1heHBhY2tldDsKIAotCQltdXNiX3dyaXRlYihtYmFzZSwgTVVTQl9SWEZJRk9TWiwgY19zaXplKTsKLQkJbXVzYl93cml0ZXcobWJhc2UsIE1VU0JfUlhGSUZPQURELCBjX29mZik7CisJCW11c2Jfd3JpdGVfcnhmaWZvc3oobWJhc2UsIGNfc2l6ZSk7CisJCW11c2Jfd3JpdGVfcnhmaWZvYWRkKG1iYXNlLCBjX29mZik7CiAJCWh3X2VwLT50eF9kb3VibGVfYnVmZmVyZWQgPSBod19lcC0+cnhfZG91YmxlX2J1ZmZlcmVkOwogCQlod19lcC0+bWF4X3BhY2tldF9zel90eCA9IG1heHBhY2tldDsKIApAQCAtMTIxMiw3ICsxMjEzLDcgQEAKIAkJaWYgKGVwbiA+PSBtdXNiLT5jb25maWctPm51bV9lcHMpIHsKIAkJCXByX2RlYnVnKCIlczogaW52YWxpZCBlcCAlZFxuIiwKIAkJCQkJbXVzYl9kcml2ZXJfbmFtZSwgZXBuKTsKLQkJCWNvbnRpbnVlOworCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAkJb2Zmc2V0ID0gZmlmb19zZXR1cChtdXNiLCBod19lcCArIGVwbiwgY2ZnKyssIG9mZnNldCk7CiAJCWlmIChvZmZzZXQgPCAwKSB7CkBAIC0xMjQ2LDkgKzEyNDcsMTAgQEAKICAqLwogc3RhdGljIGludCBfX2luaXQgZXBfY29uZmlnX2Zyb21faHcoc3RydWN0IG11c2IgKm11c2IpCiB7Ci0JdTggZXBudW0gPSAwLCByZWc7CisJdTggZXBudW0gPSAwOwogCXN0cnVjdCBtdXNiX2h3X2VwICpod19lcDsKIAl2b2lkICptYmFzZSA9IG11c2ItPm1yZWdzOworCWludCByZXQgPSAwOwogCiAJREJHKDIsICI8PT0gc3RhdGljIHNpbGljb24gZXAgY29uZmlnXG4iKTsKIApAQCAtMTI1OCwyNiArMTI2MCw5IEBACiAJCW11c2JfZXBfc2VsZWN0KG1iYXNlLCBlcG51bSk7CiAJCWh3X2VwID0gbXVzYi0+ZW5kcG9pbnRzICsgZXBudW07CiAKLQkJLyogcmVhZCBmcm9tIGNvcmUgdXNpbmcgaW5kZXhlZCBtb2RlbCAqLwotCQlyZWcgPSBtdXNiX3JlYWRiKGh3X2VwLT5yZWdzLCAweDEwICsgTVVTQl9GSUZPU0laRSk7Ci0JCWlmICghcmVnKSB7Ci0JCQkvKiAwJ3MgcmV0dXJuZWQgd2hlbiBubyBtb3JlIGVuZHBvaW50cyAqLworCQlyZXQgPSBtdXNiX3JlYWRfZmlmb3NpemUobXVzYiwgaHdfZXAsIGVwbnVtKTsKKwkJaWYgKHJldCA8IDApCiAJCQlicmVhazsKLQkJfQotCQltdXNiLT5ucl9lbmRwb2ludHMrKzsKLQkJbXVzYi0+ZXBtYXNrIHw9ICgxIDw8IGVwbnVtKTsKLQotCQlod19lcC0+bWF4X3BhY2tldF9zel90eCA9IDEgPDwgKHJlZyAmIDB4MGYpOwotCi0JCS8qIHNoYXJlZCBUWC9SWCBGSUZPPyAqLwotCQlpZiAoKHJlZyAmIDB4ZjApID09IDB4ZjApIHsKLQkJCWh3X2VwLT5tYXhfcGFja2V0X3N6X3J4ID0gaHdfZXAtPm1heF9wYWNrZXRfc3pfdHg7Ci0JCQlod19lcC0+aXNfc2hhcmVkX2ZpZm8gPSB0cnVlOwotCQkJY29udGludWU7Ci0JCX0gZWxzZSB7Ci0JCQlod19lcC0+bWF4X3BhY2tldF9zel9yeCA9IDEgPDwgKChyZWcgJiAweGYwKSA+PiA0KTsKLQkJCWh3X2VwLT5pc19zaGFyZWRfZmlmbyA9IGZhbHNlOwotCQl9CiAKIAkJLyogRklYTUUgc2V0IHVwIGh3X2VwLT57cngsdHh9X2RvdWJsZV9idWZmZXJlZCAqLwogCkBAIC0xMzI2LDcgKzEzMTEsNyBAQAogCiAJLyogbG9nIGNvcmUgb3B0aW9ucyAocmVhZCB1c2luZyBpbmRleGVkIG1vZGVsKSAqLwogCW11c2JfZXBfc2VsZWN0KG1iYXNlLCAwKTsKLQlyZWcgPSBtdXNiX3JlYWRiKG1iYXNlLCAweDEwICsgTVVTQl9DT05GSUdEQVRBKTsKKwlyZWcgPSBtdXNiX3JlYWRfY29uZmlnZGF0YShtYmFzZSk7CiAKIAlzdHJjcHkoYUluZm8sIChyZWcgJiBNVVNCX0NPTkZJR0RBVEFfVVRNSURXKSA/ICJVVE1JLTE2IiA6ICJVVE1JLTgiKTsKIAlpZiAocmVnICYgTVVTQl9DT05GSUdEQVRBX0RZTkZJRk8pCkBAIC0xMzkxLDcgKzEzNzYsNyBAQAogCX0KIAogCS8qIGxvZyByZWxlYXNlIGluZm8gKi8KLQlod3ZlcnMgPSBtdXNiX3JlYWR3KG1iYXNlLCBNVVNCX0hXVkVSUyk7CisJaHd2ZXJzID0gbXVzYl9yZWFkX2h3dmVycyhtYmFzZSk7CiAJcmV2X21ham9yID0gKGh3dmVycyA+PiAxMCkgJiAweDFmOwogCXJldl9taW5vciA9IGh3dmVycyAmIDB4M2ZmOwogCXNucHJpbnRmKGFSZXZpc2lvbiwgMzIsICIlZC4lZCVzIiwgcmV2X21ham9yLApAQCAtMTQwMCw4ICsxMzg1LDcgQEAKIAkJCW11c2JfZHJpdmVyX25hbWUsIHR5cGUsIGFSZXZpc2lvbiwgYURhdGUpOwogCiAJLyogY29uZmlndXJlIGVwMCAqLwotCW11c2ItPmVuZHBvaW50c1swXS5tYXhfcGFja2V0X3N6X3R4ID0gTVVTQl9FUDBfRklGT1NJWkU7Ci0JbXVzYi0+ZW5kcG9pbnRzWzBdLm1heF9wYWNrZXRfc3pfcnggPSBNVVNCX0VQMF9GSUZPU0laRTsKKwltdXNiX2NvbmZpZ3VyZV9lcDAobXVzYik7CiAKIAkvKiBkaXNjb3ZlciBlbmRwb2ludCBjb25maWd1cmF0aW9uICovCiAJbXVzYi0+bnJfZW5kcG9pbnRzID0gMTsKQEAgLTE0NDUsNyArMTQyOSw3IEBACiAKIAkJaHdfZXAtPnJlZ3MgPSBNVVNCX0VQX09GRlNFVChpLCAwKSArIG1iYXNlOwogI2lmZGVmIENPTkZJR19VU0JfTVVTQl9IRFJDX0hDRAotCQlod19lcC0+dGFyZ2V0X3JlZ3MgPSBNVVNCX0JVU0NUTF9PRkZTRVQoaSwgMCkgKyBtYmFzZTsKKwkJaHdfZXAtPnRhcmdldF9yZWdzID0gbXVzYl9yZWFkX3RhcmdldF9yZWdfYmFzZShpLCBtYmFzZSk7CiAJCWh3X2VwLT5yeF9yZWluaXQgPSAxOwogCQlod19lcC0+dHhfcmVpbml0ID0gMTsKICNlbmRpZgpAQCAtMTY3MSwxNyArMTY1NSwyMCBAQAogewogCXN0cnVjdCBtdXNiCSptdXNiID0gZGV2X3RvX211c2IoZGV2KTsKIAl1bnNpZ25lZCBsb25nCWZsYWdzOworCWludAkJc3RhdHVzOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJm11c2ItPmxvY2ssIGZsYWdzKTsKLQlpZiAoIXN0cm5jbXAoYnVmLCAiaG9zdCIsIDQpKQotCQltdXNiX3BsYXRmb3JtX3NldF9tb2RlKG11c2IsIE1VU0JfSE9TVCk7Ci0JaWYgKCFzdHJuY21wKGJ1ZiwgInBlcmlwaGVyYWwiLCAxMCkpCi0JCW11c2JfcGxhdGZvcm1fc2V0X21vZGUobXVzYiwgTVVTQl9QRVJJUEhFUkFMKTsKLQlpZiAoIXN0cm5jbXAoYnVmLCAib3RnIiwgMykpCi0JCW11c2JfcGxhdGZvcm1fc2V0X21vZGUobXVzYiwgTVVTQl9PVEcpOworCWlmIChzeXNmc19zdHJlcShidWYsICJob3N0IikpCisJCXN0YXR1cyA9IG11c2JfcGxhdGZvcm1fc2V0X21vZGUobXVzYiwgTVVTQl9IT1NUKTsKKwllbHNlIGlmIChzeXNmc19zdHJlcShidWYsICJwZXJpcGhlcmFsIikpCisJCXN0YXR1cyA9IG11c2JfcGxhdGZvcm1fc2V0X21vZGUobXVzYiwgTVVTQl9QRVJJUEhFUkFMKTsKKwllbHNlIGlmIChzeXNmc19zdHJlcShidWYsICJvdGciKSkKKwkJc3RhdHVzID0gbXVzYl9wbGF0Zm9ybV9zZXRfbW9kZShtdXNiLCBNVVNCX09URyk7CisJZWxzZQorCQlzdGF0dXMgPSAtRUlOVkFMOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm11c2ItPmxvY2ssIGZsYWdzKTsKIAotCXJldHVybiBuOworCXJldHVybiAoc3RhdHVzID09IDApID8gbiA6IHN0YXR1czsKIH0KIHN0YXRpYyBERVZJQ0VfQVRUUihtb2RlLCAwNjQ0LCBtdXNiX21vZGVfc2hvdywgbXVzYl9tb2RlX3N0b3JlKTsKIApAQCAtMTc4MSw3ICsxNzY4LDcgQEAKICNpZmRlZiBDT05GSUdfVVNCX01VU0JfSERSQ19IQ0QKIAlzdHJ1Y3QgdXNiX2hjZAkqaGNkOwogCi0JaGNkID0gdXNiX2NyZWF0ZV9oY2QoJm11c2JfaGNfZHJpdmVyLCBkZXYsIGRldi0+YnVzX2lkKTsKKwloY2QgPSB1c2JfY3JlYXRlX2hjZCgmbXVzYl9oY19kcml2ZXIsIGRldiwgZGV2X25hbWUoZGV2KSk7CiAJaWYgKCFoY2QpCiAJCXJldHVybiBOVUxMOwogCS8qIHVzYmNvcmUgc2V0cyBkZXYtPmRyaXZlcl9kYXRhIHRvIGhjZCwgYW5kIHNvbWV0aW1lcyB1c2VzIHRoYXQuLi4gKi8KQEAgLTE4MTAsNyArMTc5Nyw2IEBACiAJZm9yIChlcG51bSA9IDAsIGVwID0gbXVzYi0+ZW5kcG9pbnRzOwogCQkJZXBudW0gPCBtdXNiLT5jb25maWctPm51bV9lcHM7CiAJCQllcG51bSsrLCBlcCsrKSB7Ci0KIAkJZXAtPm11c2IgPSBtdXNiOwogCQllcC0+ZXBudW0gPSBlcG51bTsKIAl9CkBAIC0xODM4LDcgKzE4MjQsNyBAQAogCW11c2JfZ2FkZ2V0X2NsZWFudXAobXVzYik7CiAjZW5kaWYKIAotCWlmIChtdXNiLT5uSXJxID49IDApIHsKKwlpZiAobXVzYi0+bklycSA+PSAwICYmIG11c2ItPmlycV93YWtlKSB7CiAJCWRpc2FibGVfaXJxX3dha2UobXVzYi0+bklycSk7CiAJCWZyZWVfaXJxKG11c2ItPm5JcnEsIG11c2IpOwogCX0KQEAgLTE5ODQsMTUgKzE5NzAsMTkgQEAKIAlJTklUX1dPUksoJm11c2ItPmlycV93b3JrLCBtdXNiX2lycV93b3JrKTsKIAogCS8qIGF0dGFjaCB0byB0aGUgSVJRICovCi0JaWYgKHJlcXVlc3RfaXJxKG5JcnEsIG11c2ItPmlzciwgMCwgZGV2LT5idXNfaWQsIG11c2IpKSB7CisJaWYgKHJlcXVlc3RfaXJxKG5JcnEsIG11c2ItPmlzciwgMCwgZGV2X25hbWUoZGV2KSwgbXVzYikpIHsKIAkJZGV2X2VycihkZXYsICJyZXF1ZXN0X2lycSAlZCBmYWlsZWQhXG4iLCBuSXJxKTsKIAkJc3RhdHVzID0gLUVOT0RFVjsKIAkJZ290byBmYWlsMjsKIAl9CiAJbXVzYi0+bklycSA9IG5JcnE7CiAvKiBGSVhNRSB0aGlzIGhhbmRsZXMgd2FrZXVwIGlycXMgd3JvbmcgKi8KLQlpZiAoZW5hYmxlX2lycV93YWtlKG5JcnEpID09IDApCisJaWYgKGVuYWJsZV9pcnFfd2FrZShuSXJxKSA9PSAwKSB7CisJCW11c2ItPmlycV93YWtlID0gMTsKIAkJZGV2aWNlX2luaXRfd2FrZXVwKGRldiwgMSk7CisJfSBlbHNlIHsKKwkJbXVzYi0+aXJxX3dha2UgPSAwOworCX0KIAogCXByX2luZm8oIiVzOiBVU0IgJXMgbW9kZSBjb250cm9sbGVyIGF0ICVwIHVzaW5nICVzLCBJUlEgJWRcbiIsCiAJCQltdXNiX2RyaXZlcl9uYW1lLApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbXVzYi9tdXNiX2NvcmUuaCBiL2RyaXZlcnMvdXNiL211c2IvbXVzYl9jb3JlLmgKaW5kZXggODIyMjcyNS4uNjMwOTQ2YSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbXVzYi9tdXNiX2NvcmUuaAorKysgYi9kcml2ZXJzL3VzYi9tdXNiL211c2JfY29yZS5oCkBAIC0xOTEsNyArMTkxLDcgQEAKICAqLwogCiAjaWYgZGVmaW5lZChDT05GSUdfQVJDSF9EQVZJTkNJKSB8fCBkZWZpbmVkKENPTkZJR19BUkNIX09NQVAyNDMwKSBcCi0JCXx8IGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDM0MzApCisJCXx8IGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDM0MzApIHx8IGRlZmluZWQoQ09ORklHX0JMQUNLRklOKQogLyogUkVWSVNJVCBpbmRleGVkIGFjY2VzcyBzZWVtZWQgdG8KICAqIG1pc2JlaGF2ZSAob24gRGFWaW5jaSkgZm9yIGF0IGxlYXN0IHBlcmlwaGVyYWwgSU4gLi4uCiAgKi8KQEAgLTM1OSw2ICszNTksNyBAQAogCXN0cnVjdCBvdGdfdHJhbnNjZWl2ZXIJeGNlaXY7CiAKIAlpbnQgbklycTsKKwl1bnNpZ25lZAkJaXJxX3dha2U6MTsKIAogCXN0cnVjdCBtdXNiX2h3X2VwCSBlbmRwb2ludHNbTVVTQl9DX05VTV9FUFNdOwogI2RlZmluZSBjb250cm9sX2VwCQllbmRwb2ludHMKQEAgLTQ0Nyw2ICs0NDgsNzAgQEAKIH0KICNlbmRpZgogCisjaWZkZWYgQ09ORklHX0JMQUNLRklOCitzdGF0aWMgaW5saW5lIGludCBtdXNiX3JlYWRfZmlmb3NpemUoc3RydWN0IG11c2IgKm11c2IsCisJCXN0cnVjdCBtdXNiX2h3X2VwICpod19lcCwgdTggZXBudW0pCit7CisJbXVzYi0+bnJfZW5kcG9pbnRzKys7CisJbXVzYi0+ZXBtYXNrIHw9ICgxIDw8IGVwbnVtKTsKKworCWlmIChlcG51bSA8IDUpIHsKKwkJaHdfZXAtPm1heF9wYWNrZXRfc3pfdHggPSAxMjg7CisJCWh3X2VwLT5tYXhfcGFja2V0X3N6X3J4ID0gMTI4OworCX0gZWxzZSB7CisJCWh3X2VwLT5tYXhfcGFja2V0X3N6X3R4ID0gMTAyNDsKKwkJaHdfZXAtPm1heF9wYWNrZXRfc3pfcnggPSAxMDI0OworCX0KKwlod19lcC0+aXNfc2hhcmVkX2ZpZm8gPSBmYWxzZTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbXVzYl9jb25maWd1cmVfZXAwKHN0cnVjdCBtdXNiICptdXNiKQoreworCW11c2ItPmVuZHBvaW50c1swXS5tYXhfcGFja2V0X3N6X3R4ID0gTVVTQl9FUDBfRklGT1NJWkU7CisJbXVzYi0+ZW5kcG9pbnRzWzBdLm1heF9wYWNrZXRfc3pfcnggPSBNVVNCX0VQMF9GSUZPU0laRTsKKwltdXNiLT5lbmRwb2ludHNbMF0uaXNfc2hhcmVkX2ZpZm8gPSB0cnVlOworfQorCisjZWxzZQorCitzdGF0aWMgaW5saW5lIGludCBtdXNiX3JlYWRfZmlmb3NpemUoc3RydWN0IG11c2IgKm11c2IsCisJCXN0cnVjdCBtdXNiX2h3X2VwICpod19lcCwgdTggZXBudW0pCit7CisJdTggcmVnID0gMDsKKworCS8qIHJlYWQgZnJvbSBjb3JlIHVzaW5nIGluZGV4ZWQgbW9kZWwgKi8KKwlyZWcgPSBtdXNiX3JlYWRiKGh3X2VwLT5yZWdzLCAweDEwICsgTVVTQl9GSUZPU0laRSk7CisJLyogMCdzIHJldHVybmVkIHdoZW4gbm8gbW9yZSBlbmRwb2ludHMgKi8KKwlpZiAoIXJlZykKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwltdXNiLT5ucl9lbmRwb2ludHMrKzsKKwltdXNiLT5lcG1hc2sgfD0gKDEgPDwgZXBudW0pOworCisJaHdfZXAtPm1heF9wYWNrZXRfc3pfdHggPSAxIDw8IChyZWcgJiAweDBmKTsKKworCS8qIHNoYXJlZCBUWC9SWCBGSUZPPyAqLworCWlmICgocmVnICYgMHhmMCkgPT0gMHhmMCkgeworCQlod19lcC0+bWF4X3BhY2tldF9zel9yeCA9IGh3X2VwLT5tYXhfcGFja2V0X3N6X3R4OworCQlod19lcC0+aXNfc2hhcmVkX2ZpZm8gPSB0cnVlOworCQlyZXR1cm4gMDsKKwl9IGVsc2UgeworCQlod19lcC0+bWF4X3BhY2tldF9zel9yeCA9IDEgPDwgKChyZWcgJiAweGYwKSA+PiA0KTsKKwkJaHdfZXAtPmlzX3NoYXJlZF9maWZvID0gZmFsc2U7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtdXNiX2NvbmZpZ3VyZV9lcDAoc3RydWN0IG11c2IgKm11c2IpCit7CisJbXVzYi0+ZW5kcG9pbnRzWzBdLm1heF9wYWNrZXRfc3pfdHggPSBNVVNCX0VQMF9GSUZPU0laRTsKKwltdXNiLT5lbmRwb2ludHNbMF0ubWF4X3BhY2tldF9zel9yeCA9IE1VU0JfRVAwX0ZJRk9TSVpFOworfQorI2VuZGlmIC8qIENPTkZJR19CTEFDS0ZJTiAqLworCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBHbHVlIGl0IHRvZ2V0aGVyICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCkBAIC00NjcsMTYgKzUzMiwxNiBAQAogCiBleHRlcm4gdm9pZCBtdXNiX2hucF9zdG9wKHN0cnVjdCBtdXNiICptdXNiKTsKIAotZXh0ZXJuIHZvaWQgbXVzYl9wbGF0Zm9ybV9zZXRfbW9kZShzdHJ1Y3QgbXVzYiAqbXVzYiwgdTggbXVzYl9tb2RlKTsKK2V4dGVybiBpbnQgbXVzYl9wbGF0Zm9ybV9zZXRfbW9kZShzdHJ1Y3QgbXVzYiAqbXVzYiwgdTggbXVzYl9tb2RlKTsKIAotI2lmIGRlZmluZWQoQ09ORklHX1VTQl9UVVNCNjAxMCkgfHwgXAorI2lmIGRlZmluZWQoQ09ORklHX1VTQl9UVVNCNjAxMCkgfHwgZGVmaW5lZChDT05GSUdfQkxBQ0tGSU4pIHx8IFwKIAlkZWZpbmVkKENPTkZJR19BUkNIX09NQVAyNDMwKSB8fCBkZWZpbmVkKENPTkZJR19BUkNIX09NQVAzNFhYKQogZXh0ZXJuIHZvaWQgbXVzYl9wbGF0Zm9ybV90cnlfaWRsZShzdHJ1Y3QgbXVzYiAqbXVzYiwgdW5zaWduZWQgbG9uZyB0aW1lb3V0KTsKICNlbHNlCiAjZGVmaW5lIG11c2JfcGxhdGZvcm1fdHJ5X2lkbGUoeCwgeSkJCWRvIHt9IHdoaWxlICgwKQogI2VuZGlmCiAKLSNpZmRlZiBDT05GSUdfVVNCX1RVU0I2MDEwCisjaWYgZGVmaW5lZChDT05GSUdfVVNCX1RVU0I2MDEwKSB8fCBkZWZpbmVkKENPTkZJR19CTEFDS0ZJTikKIGV4dGVybiBpbnQgbXVzYl9wbGF0Zm9ybV9nZXRfdmJ1c19zdGF0dXMoc3RydWN0IG11c2IgKm11c2IpOwogI2Vsc2UKICNkZWZpbmUgbXVzYl9wbGF0Zm9ybV9nZXRfdmJ1c19zdGF0dXMoeCkJMApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbXVzYi9tdXNiX2dhZGdldC5jIGIvZHJpdmVycy91c2IvbXVzYi9tdXNiX2dhZGdldC5jCmluZGV4IGQ2YTgwMmMuLjYxOTdkYWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL211c2IvbXVzYl9nYWRnZXQuYworKysgYi9kcml2ZXJzL3VzYi9tdXNiL211c2JfZ2FkZ2V0LmMKQEAgLTE2MzMsNyArMTYzMyw3IEBACiAJbXVzYi0+Zy5zcGVlZCA9IFVTQl9TUEVFRF9VTktOT1dOOwogCiAJLyogdGhpcyAiZ2FkZ2V0IiBhYnN0cmFjdHMvdmlydHVhbGl6ZXMgdGhlIGNvbnRyb2xsZXIgKi8KLQlzdHJjcHkobXVzYi0+Zy5kZXYuYnVzX2lkLCAiZ2FkZ2V0Iik7CisJZGV2X3NldF9uYW1lKCZtdXNiLT5nLmRldiwgImdhZGdldCIpOwogCW11c2ItPmcuZGV2LnBhcmVudCA9IG11c2ItPmNvbnRyb2xsZXI7CiAJbXVzYi0+Zy5kZXYuZG1hX21hc2sgPSBtdXNiLT5jb250cm9sbGVyLT5kbWFfbWFzazsKIAltdXNiLT5nLmRldi5yZWxlYXNlID0gbXVzYl9nYWRnZXRfcmVsZWFzZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL211c2IvbXVzYl9ob3N0LmMgYi9kcml2ZXJzL3VzYi9tdXNiL211c2JfaG9zdC5jCmluZGV4IGNjNjQ0NjIuLjk5ZmE2MTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL211c2IvbXVzYl9ob3N0LmMKKysrIGIvZHJpdmVycy91c2IvbXVzYi9tdXNiX2hvc3QuYwpAQCAtMTEyLDE4ICsxMTIsMjEgQEAKIHsKIAl2b2lkIF9faW9tZW0JKmVwaW8gPSBlcC0+cmVnczsKIAl1MTYJCWNzcjsKKwl1MTYJCWxhc3Rjc3IgPSAwOwogCWludAkJcmV0cmllcyA9IDEwMDA7CiAKIAljc3IgPSBtdXNiX3JlYWR3KGVwaW8sIE1VU0JfVFhDU1IpOwogCXdoaWxlIChjc3IgJiBNVVNCX1RYQ1NSX0ZJRk9OT1RFTVBUWSkgewotCQlEQkcoNSwgIkhvc3QgVFggRklGT05PVEVNUFRZIGNzcjogJTAyeFxuIiwgY3NyKTsKKwkJaWYgKGNzciAhPSBsYXN0Y3NyKQorCQkJREJHKDMsICJIb3N0IFRYIEZJRk9OT1RFTVBUWSBjc3I6ICUwMnhcbiIsIGNzcik7CisJCWxhc3Rjc3IgPSBjc3I7CiAJCWNzciB8PSBNVVNCX1RYQ1NSX0ZMVVNIRklGTzsKIAkJbXVzYl93cml0ZXcoZXBpbywgTVVTQl9UWENTUiwgY3NyKTsKIAkJY3NyID0gbXVzYl9yZWFkdyhlcGlvLCBNVVNCX1RYQ1NSKTsKLQkJaWYgKHJldHJpZXMtLSA8IDEpIHsKLQkJCUVSUigiQ291bGQgbm90IGZsdXNoIGhvc3QgVFggZmlmbzogY3NyOiAlMDR4XG4iLCBjc3IpOworCQlpZiAoV0FSTihyZXRyaWVzLS0gPCAxLAorCQkJCSJDb3VsZCBub3QgZmx1c2ggaG9zdCBUWCVkIGZpZm86IGNzcjogJTA0eFxuIiwKKwkJCQllcC0+ZXBudW0sIGNzcikpCiAJCQlyZXR1cm47Ci0JCX0KIAkJbWRlbGF5KDEpOwogCX0KIH0KQEAgLTI2OCw3ICsyNzEsNyBAQAogX19yZWxlYXNlcyhtdXNiLT5sb2NrKQogX19hY3F1aXJlcyhtdXNiLT5sb2NrKQogewotCURCRygoeyBpbnQgbGV2ZWw7IHN3aXRjaCAodXJiLT5zdGF0dXMpIHsKKwlEQkcoKHsgaW50IGxldmVsOyBzd2l0Y2ggKHN0YXR1cykgewogCQkJCWNhc2UgMDoKIAkJCQkJbGV2ZWwgPSA0OwogCQkJCQlicmVhazsKQEAgLTI4Myw4ICsyODYsOCBAQAogCQkJCQlsZXZlbCA9IDI7CiAJCQkJCWJyZWFrOwogCQkJCX07IGxldmVsOyB9KSwKLQkJCSJjb21wbGV0ZSAlcCAoJWQpLCBkZXYlZCBlcCVkJXMsICVkLyVkXG4iLAotCQkJdXJiLCB1cmItPnN0YXR1cywKKwkJCSJjb21wbGV0ZSAlcCAlcEYgKCVkKSwgZGV2JWQgZXAlZCVzLCAlZC8lZFxuIiwKKwkJCXVyYiwgdXJiLT5jb21wbGV0ZSwgc3RhdHVzLAogCQkJdXNiX3BpcGVkZXZpY2UodXJiLT5waXBlKSwKIAkJCXVzYl9waXBlZW5kcG9pbnQodXJiLT5waXBlKSwKIAkJCXVzYl9waXBlaW4odXJiLT5waXBlKSA/ICJpbiIgOiAib3V0IiwKQEAgLTU5MywxMiArNTk2LDEwIEBACiAKIAkvKiB0YXJnZXQgYWRkciBhbmQgKGZvciBtdWx0aXBvaW50KSBodWIgYWRkci9wb3J0ICovCiAJaWYgKG11c2ItPmlzX211bHRpcG9pbnQpIHsKLQkJbXVzYl93cml0ZWIoZXAtPnRhcmdldF9yZWdzLCBNVVNCX1JYRlVOQ0FERFIsCi0JCQlxaC0+YWRkcl9yZWcpOwotCQltdXNiX3dyaXRlYihlcC0+dGFyZ2V0X3JlZ3MsIE1VU0JfUlhIVUJBRERSLAotCQkJcWgtPmhfYWRkcl9yZWcpOwotCQltdXNiX3dyaXRlYihlcC0+dGFyZ2V0X3JlZ3MsIE1VU0JfUlhIVUJQT1JULAotCQkJcWgtPmhfcG9ydF9yZWcpOworCQltdXNiX3dyaXRlX3J4ZnVuYWRkcihlcC0+dGFyZ2V0X3JlZ3MsIHFoLT5hZGRyX3JlZyk7CisJCW11c2Jfd3JpdGVfcnhodWJhZGRyKGVwLT50YXJnZXRfcmVncywgcWgtPmhfYWRkcl9yZWcpOworCQltdXNiX3dyaXRlX3J4aHVicG9ydChlcC0+dGFyZ2V0X3JlZ3MsIHFoLT5oX3BvcnRfcmVnKTsKKwogCX0gZWxzZQogCQltdXNiX3dyaXRlYihtdXNiLT5tcmVncywgTVVTQl9GQUREUiwgcWgtPmFkZHJfcmVnKTsKIApAQCAtNzEyLDE1ICs3MTMsOSBAQAogCiAJCS8qIHRhcmdldCBhZGRyIGFuZCAoZm9yIG11bHRpcG9pbnQpIGh1YiBhZGRyL3BvcnQgKi8KIAkJaWYgKG11c2ItPmlzX211bHRpcG9pbnQpIHsKLQkJCW11c2Jfd3JpdGViKG1iYXNlLAotCQkJCU1VU0JfQlVTQ1RMX09GRlNFVChlcG51bSwgTVVTQl9UWEZVTkNBRERSKSwKLQkJCQlxaC0+YWRkcl9yZWcpOwotCQkJbXVzYl93cml0ZWIobWJhc2UsCi0JCQkJTVVTQl9CVVNDVExfT0ZGU0VUKGVwbnVtLCBNVVNCX1RYSFVCQUREUiksCi0JCQkJcWgtPmhfYWRkcl9yZWcpOwotCQkJbXVzYl93cml0ZWIobWJhc2UsCi0JCQkJTVVTQl9CVVNDVExfT0ZGU0VUKGVwbnVtLCBNVVNCX1RYSFVCUE9SVCksCi0JCQkJcWgtPmhfcG9ydF9yZWcpOworCQkJbXVzYl93cml0ZV90eGZ1bmFkZHIobWJhc2UsIGVwbnVtLCBxaC0+YWRkcl9yZWcpOworCQkJbXVzYl93cml0ZV90eGh1YmFkZHIobWJhc2UsIGVwbnVtLCBxaC0+aF9hZGRyX3JlZyk7CisJCQltdXNiX3dyaXRlX3R4aHVicG9ydChtYmFzZSwgZXBudW0sIHFoLT5oX3BvcnRfcmVnKTsKIC8qIEZJWE1FIGlmICFlcG51bSwgZG8gdGhlIHNhbWUgZm9yIFJYIC4uLiAqLwogCQl9IGVsc2UKIAkJCW11c2Jfd3JpdGViKG1iYXNlLCBNVVNCX0ZBRERSLCBxaC0+YWRkcl9yZWcpOwpAQCAtOTg4LDggKzk4MywxMCBAQAogCQlpZiAoZmlmb19jb3VudCkgewogCQkJZmlmb19kZXN0ID0gKHU4ICopICh1cmItPnRyYW5zZmVyX2J1ZmZlcgogCQkJCQkrIHVyYi0+YWN0dWFsX2xlbmd0aCk7Ci0JCQlEQkcoMywgIlNlbmRpbmcgJWQgYnl0ZXMgdG8gJXBcbiIsCi0JCQkJCWZpZm9fY291bnQsIGZpZm9fZGVzdCk7CisJCQlEQkcoMywgIlNlbmRpbmcgJWQgYnl0ZSVzIHRvIGVwMCBmaWZvICVwXG4iLAorCQkJCQlmaWZvX2NvdW50LAorCQkJCQkoZmlmb19jb3VudCA9PSAxKSA/ICIiIDogInMiLAorCQkJCQlmaWZvX2Rlc3QpOwogCQkJbXVzYl93cml0ZV9maWZvKGh3X2VwLCBmaWZvX2NvdW50LCBmaWZvX2Rlc3QpOwogCiAJCQl1cmItPmFjdHVhbF9sZW5ndGggKz0gZmlmb19jb3VudDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL211c2IvbXVzYl9pby5oIGIvZHJpdmVycy91c2IvbXVzYi9tdXNiX2lvLmgKaW5kZXggMjIzZjBhNS4uYjA2ZTllZiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbXVzYi9tdXNiX2lvLmgKKysrIGIvZHJpdmVycy91c2IvbXVzYi9tdXNiX2lvLmgKQEAgLTM5LDcgKzM5LDcgQEAKIAogI2lmICFkZWZpbmVkKENPTkZJR19BUk0pICYmICFkZWZpbmVkKENPTkZJR19TVVBFUkgpIFwKIAkmJiAhZGVmaW5lZChDT05GSUdfQVZSMzIpICYmICFkZWZpbmVkKENPTkZJR19QUEMzMikgXAotCSYmICFkZWZpbmVkKENPTkZJR19QUEM2NCkKKwkmJiAhZGVmaW5lZChDT05GSUdfUFBDNjQpICYmICFkZWZpbmVkKENPTkZJR19CTEFDS0ZJTikKIHN0YXRpYyBpbmxpbmUgdm9pZCByZWFkc2woY29uc3Qgdm9pZCBfX2lvbWVtICphZGRyLCB2b2lkICpidWYsIGludCBsZW4pCiAJeyBpbnNsKCh1bnNpZ25lZCBsb25nKWFkZHIsIGJ1ZiwgbGVuKTsgfQogc3RhdGljIGlubGluZSB2b2lkIHJlYWRzdyhjb25zdCB2b2lkIF9faW9tZW0gKmFkZHIsIHZvaWQgKmJ1ZiwgaW50IGxlbikKQEAgLTU2LDYgKzU2LDggQEAKIAogI2VuZGlmCiAKKyNpZm5kZWYgQ09ORklHX0JMQUNLRklOCisKIC8qIE5PVEU6ICB0aGVzZSBvZmZzZXRzIGFyZSBhbGwgaW4gYnl0ZXMgKi8KIAogc3RhdGljIGlubGluZSB1MTYgbXVzYl9yZWFkdyhjb25zdCB2b2lkIF9faW9tZW0gKmFkZHIsIHVuc2lnbmVkIG9mZnNldCkKQEAgLTExNCw0ICsxMTYsMjYgQEAKIAogI2VuZGlmCS8qIENPTkZJR19VU0JfVFVTQjYwMTAgKi8KIAorI2Vsc2UKKworc3RhdGljIGlubGluZSB1OCBtdXNiX3JlYWRiKGNvbnN0IHZvaWQgX19pb21lbSAqYWRkciwgdW5zaWduZWQgb2Zmc2V0KQorCXsgcmV0dXJuICh1OCkgKGJmaW5fcmVhZDE2KGFkZHIgKyBvZmZzZXQpKTsgfQorCitzdGF0aWMgaW5saW5lIHUxNiBtdXNiX3JlYWR3KGNvbnN0IHZvaWQgX19pb21lbSAqYWRkciwgdW5zaWduZWQgb2Zmc2V0KQorCXsgcmV0dXJuIGJmaW5fcmVhZDE2KGFkZHIgKyBvZmZzZXQpOyB9CisKK3N0YXRpYyBpbmxpbmUgdTMyIG11c2JfcmVhZGwoY29uc3Qgdm9pZCBfX2lvbWVtICphZGRyLCB1bnNpZ25lZCBvZmZzZXQpCisJeyByZXR1cm4gKHUzMikgKGJmaW5fcmVhZDE2KGFkZHIgKyBvZmZzZXQpKTsgfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbXVzYl93cml0ZWIodm9pZCBfX2lvbWVtICphZGRyLCB1bnNpZ25lZCBvZmZzZXQsIHU4IGRhdGEpCisJeyBiZmluX3dyaXRlMTYoYWRkciArIG9mZnNldCwgKHUxNikgZGF0YSk7IH0KKworc3RhdGljIGlubGluZSB2b2lkIG11c2Jfd3JpdGV3KHZvaWQgX19pb21lbSAqYWRkciwgdW5zaWduZWQgb2Zmc2V0LCB1MTYgZGF0YSkKKwl7IGJmaW5fd3JpdGUxNihhZGRyICsgb2Zmc2V0LCBkYXRhKTsgfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbXVzYl93cml0ZWwodm9pZCBfX2lvbWVtICphZGRyLCB1bnNpZ25lZCBvZmZzZXQsIHUzMiBkYXRhKQorCXsgYmZpbl93cml0ZTE2KGFkZHIgKyBvZmZzZXQsICh1MTYpIGRhdGEpOyB9CisKKyNlbmRpZiAvKiBDT05GSUdfQkxBQ0tGSU4gKi8KKwogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tdXNiL211c2JfcmVncy5oIGIvZHJpdmVycy91c2IvbXVzYi9tdXNiX3JlZ3MuaAppbmRleCA5YzIyODY2Li5kZTNiMmYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9tdXNiL211c2JfcmVncy5oCisrKyBiL2RyaXZlcnMvdXNiL211c2IvbXVzYl9yZWdzLmgKQEAgLTM4LDk3ICszOCw2IEBACiAjZGVmaW5lIE1VU0JfRVAwX0ZJRk9TSVpFCTY0CS8qIFRoaXMgaXMgbm9uLWNvbmZpZ3VyYWJsZSAqLwogCiAvKgotICogQ29tbW9uIFVTQiByZWdpc3RlcnMKLSAqLwotCi0jZGVmaW5lIE1VU0JfRkFERFIJCTB4MDAJLyogOC1iaXQgKi8KLSNkZWZpbmUgTVVTQl9QT1dFUgkJMHgwMQkvKiA4LWJpdCAqLwotCi0jZGVmaW5lIE1VU0JfSU5UUlRYCQkweDAyCS8qIDE2LWJpdCAqLwotI2RlZmluZSBNVVNCX0lOVFJSWAkJMHgwNAotI2RlZmluZSBNVVNCX0lOVFJUWEUJCTB4MDYKLSNkZWZpbmUgTVVTQl9JTlRSUlhFCQkweDA4Ci0jZGVmaW5lIE1VU0JfSU5UUlVTQgkJMHgwQQkvKiA4IGJpdCAqLwotI2RlZmluZSBNVVNCX0lOVFJVU0JFCQkweDBCCS8qIDggYml0ICovCi0jZGVmaW5lIE1VU0JfRlJBTUUJCTB4MEMKLSNkZWZpbmUgTVVTQl9JTkRFWAkJMHgwRQkvKiA4IGJpdCAqLwotI2RlZmluZSBNVVNCX1RFU1RNT0RFCQkweDBGCS8qIDggYml0ICovCi0KLS8qIEdldCBvZmZzZXQgZm9yIGEgZ2l2ZW4gRklGTyBmcm9tIG11c2ItPm1yZWdzICovCi0jaWZkZWYJQ09ORklHX1VTQl9UVVNCNjAxMAotI2RlZmluZSBNVVNCX0ZJRk9fT0ZGU0VUKGVwbnVtKQkoMHgyMDAgKyAoKGVwbnVtKSAqIDB4MjApKQotI2Vsc2UKLSNkZWZpbmUgTVVTQl9GSUZPX09GRlNFVChlcG51bSkJKDB4MjAgKyAoKGVwbnVtKSAqIDQpKQotI2VuZGlmCi0KLS8qCi0gKiBBZGRpdGlvbmFsIENvbnRyb2wgUmVnaXN0ZXJzCi0gKi8KLQotI2RlZmluZSBNVVNCX0RFVkNUTAkJMHg2MAkvKiA4IGJpdCAqLwotCi0vKiBUaGVzZSBhcmUgYWx3YXlzIGNvbnRyb2xsZWQgdGhyb3VnaCB0aGUgSU5ERVggcmVnaXN0ZXIgKi8KLSNkZWZpbmUgTVVTQl9UWEZJRk9TWgkJMHg2MgkvKiA4LWJpdCAoc2VlIG1hc2tzKSAqLwotI2RlZmluZSBNVVNCX1JYRklGT1NaCQkweDYzCS8qIDgtYml0IChzZWUgbWFza3MpICovCi0jZGVmaW5lIE1VU0JfVFhGSUZPQURECQkweDY0CS8qIDE2LWJpdCBvZmZzZXQgc2hpZnRlZCByaWdodCAzICovCi0jZGVmaW5lIE1VU0JfUlhGSUZPQURECQkweDY2CS8qIDE2LWJpdCBvZmZzZXQgc2hpZnRlZCByaWdodCAzICovCi0KLS8qIFJFVklTSVQ6IHZjdHJsL3ZzdGF0dXM6IG9wdGlvbmFsIHZlbmRvciB1dG1pK3BoeSByZWdpc3RlciBhdCAweDY4ICovCi0jZGVmaW5lIE1VU0JfSFdWRVJTCQkweDZDCS8qIDggYml0ICovCi0KLSNkZWZpbmUgTVVTQl9FUElORk8JCTB4NzgJLyogOCBiaXQgKi8KLSNkZWZpbmUgTVVTQl9SQU1JTkZPCQkweDc5CS8qIDggYml0ICovCi0jZGVmaW5lIE1VU0JfTElOS0lORk8JCTB4N2EJLyogOCBiaXQgKi8KLSNkZWZpbmUgTVVTQl9WUExFTgkJMHg3YgkvKiA4IGJpdCAqLwotI2RlZmluZSBNVVNCX0hTX0VPRjEJCTB4N2MJLyogOCBiaXQgKi8KLSNkZWZpbmUgTVVTQl9GU19FT0YxCQkweDdkCS8qIDggYml0ICovCi0jZGVmaW5lIE1VU0JfTFNfRU9GMQkJMHg3ZQkvKiA4IGJpdCAqLwotCi0vKiBPZmZzZXRzIHRvIGVuZHBvaW50IHJlZ2lzdGVycyAqLwotI2RlZmluZSBNVVNCX1RYTUFYUAkJMHgwMAotI2RlZmluZSBNVVNCX1RYQ1NSCQkweDAyCi0jZGVmaW5lIE1VU0JfQ1NSMAkJTVVTQl9UWENTUgkvKiBSZS11c2VkIGZvciBFUDAgKi8KLSNkZWZpbmUgTVVTQl9SWE1BWFAJCTB4MDQKLSNkZWZpbmUgTVVTQl9SWENTUgkJMHgwNgotI2RlZmluZSBNVVNCX1JYQ09VTlQJCTB4MDgKLSNkZWZpbmUgTVVTQl9DT1VOVDAJCU1VU0JfUlhDT1VOVAkvKiBSZS11c2VkIGZvciBFUDAgKi8KLSNkZWZpbmUgTVVTQl9UWFRZUEUJCTB4MEEKLSNkZWZpbmUgTVVTQl9UWVBFMAkJTVVTQl9UWFRZUEUJLyogUmUtdXNlZCBmb3IgRVAwICovCi0jZGVmaW5lIE1VU0JfVFhJTlRFUlZBTAkJMHgwQgotI2RlZmluZSBNVVNCX05BS0xJTUlUMAkJTVVTQl9UWElOVEVSVkFMCS8qIFJlLXVzZWQgZm9yIEVQMCAqLwotI2RlZmluZSBNVVNCX1JYVFlQRQkJMHgwQwotI2RlZmluZSBNVVNCX1JYSU5URVJWQUwJCTB4MEQKLSNkZWZpbmUgTVVTQl9GSUZPU0laRQkJMHgwRgotI2RlZmluZSBNVVNCX0NPTkZJR0RBVEEJCU1VU0JfRklGT1NJWkUJLyogUmUtdXNlZCBmb3IgRVAwICovCi0KLS8qIE9mZnNldHMgdG8gZW5kcG9pbnQgcmVnaXN0ZXJzIGluIGluZGV4ZWQgbW9kZWwgKHVzaW5nIElOREVYIHJlZ2lzdGVyKSAqLwotI2RlZmluZSBNVVNCX0lOREVYRURfT0ZGU0VUKF9lcG51bSwgX29mZnNldCkJXAotCSgweDEwICsgKF9vZmZzZXQpKQotCi0vKiBPZmZzZXRzIHRvIGVuZHBvaW50IHJlZ2lzdGVycyBpbiBmbGF0IG1vZGVscyAqLwotI2RlZmluZSBNVVNCX0ZMQVRfT0ZGU0VUKF9lcG51bSwgX29mZnNldCkJXAotCSgweDEwMCArICgweDEwKihfZXBudW0pKSArIChfb2Zmc2V0KSkKLQotI2lmZGVmIENPTkZJR19VU0JfVFVTQjYwMTAKLS8qIFRVU0I2MDEwIEVQMCBjb25maWd1cmF0aW9uIHJlZ2lzdGVyIGlzIHNwZWNpYWwgKi8KLSNkZWZpbmUgTVVTQl9UVVNCX09GRlNFVChfZXBudW0sIF9vZmZzZXQpCVwKLQkoMHgxMCArIF9vZmZzZXQpCi0jaW5jbHVkZSAidHVzYjYwMTAuaCIJCS8qIE5lZWRlZCAib25seSIgZm9yIFRVU0JfRVAwX0NPTkYgKi8KLSNlbmRpZgotCi0vKiAiYnVzIGNvbnRyb2wiL3RhcmdldCByZWdpc3RlcnMsIGZvciBob3N0IHNpZGUgbXVsdGlwb2ludCAoZXh0ZXJuYWwgaHVicykgKi8KLSNkZWZpbmUgTVVTQl9UWEZVTkNBRERSCQkweDAwCi0jZGVmaW5lIE1VU0JfVFhIVUJBRERSCQkweDAyCi0jZGVmaW5lIE1VU0JfVFhIVUJQT1JUCQkweDAzCi0KLSNkZWZpbmUgTVVTQl9SWEZVTkNBRERSCQkweDA0Ci0jZGVmaW5lIE1VU0JfUlhIVUJBRERSCQkweDA2Ci0jZGVmaW5lIE1VU0JfUlhIVUJQT1JUCQkweDA3Ci0KLSNkZWZpbmUgTVVTQl9CVVNDVExfT0ZGU0VUKF9lcG51bSwgX29mZnNldCkgXAotCSgweDgwICsgKDgqKF9lcG51bSkpICsgKF9vZmZzZXQpKQotCi0vKgogICogTVVTQiBSZWdpc3RlciBiaXRzCiAgKi8KIApAQCAtMjI4LDcgKzEzNyw2IEBACiAKIC8qIFRYQ1NSIGluIFBlcmlwaGVyYWwgYW5kIEhvc3QgbW9kZSAqLwogI2RlZmluZSBNVVNCX1RYQ1NSX0FVVE9TRVQJCTB4ODAwMAotI2RlZmluZSBNVVNCX1RYQ1NSX01PREUJCQkweDIwMDAKICNkZWZpbmUgTVVTQl9UWENTUl9ETUFFTkFCCQkweDEwMDAKICNkZWZpbmUgTVVTQl9UWENTUl9GUkNEQVRBVE9HCQkweDA4MDAKICNkZWZpbmUgTVVTQl9UWENTUl9ETUFNT0RFCQkweDA0MDAKQEAgLTI5Nyw0ICsyMDUsMzA5IEBACiAvKiBIVUJBRERSICovCiAjZGVmaW5lIE1VU0JfSFVCQUREUl9NVUxUSV9UVAkJMHg4MAogCisKKyNpZm5kZWYgQ09ORklHX0JMQUNLRklOCisKKy8qCisgKiBDb21tb24gVVNCIHJlZ2lzdGVycworICovCisKKyNkZWZpbmUgTVVTQl9GQUREUgkJMHgwMAkvKiA4LWJpdCAqLworI2RlZmluZSBNVVNCX1BPV0VSCQkweDAxCS8qIDgtYml0ICovCisKKyNkZWZpbmUgTVVTQl9JTlRSVFgJCTB4MDIJLyogMTYtYml0ICovCisjZGVmaW5lIE1VU0JfSU5UUlJYCQkweDA0CisjZGVmaW5lIE1VU0JfSU5UUlRYRQkJMHgwNgorI2RlZmluZSBNVVNCX0lOVFJSWEUJCTB4MDgKKyNkZWZpbmUgTVVTQl9JTlRSVVNCCQkweDBBCS8qIDggYml0ICovCisjZGVmaW5lIE1VU0JfSU5UUlVTQkUJCTB4MEIJLyogOCBiaXQgKi8KKyNkZWZpbmUgTVVTQl9GUkFNRQkJMHgwQworI2RlZmluZSBNVVNCX0lOREVYCQkweDBFCS8qIDggYml0ICovCisjZGVmaW5lIE1VU0JfVEVTVE1PREUJCTB4MEYJLyogOCBiaXQgKi8KKworLyogR2V0IG9mZnNldCBmb3IgYSBnaXZlbiBGSUZPIGZyb20gbXVzYi0+bXJlZ3MgKi8KKyNpZmRlZglDT05GSUdfVVNCX1RVU0I2MDEwCisjZGVmaW5lIE1VU0JfRklGT19PRkZTRVQoZXBudW0pCSgweDIwMCArICgoZXBudW0pICogMHgyMCkpCisjZWxzZQorI2RlZmluZSBNVVNCX0ZJRk9fT0ZGU0VUKGVwbnVtKQkoMHgyMCArICgoZXBudW0pICogNCkpCisjZW5kaWYKKworLyoKKyAqIEFkZGl0aW9uYWwgQ29udHJvbCBSZWdpc3RlcnMKKyAqLworCisjZGVmaW5lIE1VU0JfREVWQ1RMCQkweDYwCS8qIDggYml0ICovCisKKy8qIFRoZXNlIGFyZSBhbHdheXMgY29udHJvbGxlZCB0aHJvdWdoIHRoZSBJTkRFWCByZWdpc3RlciAqLworI2RlZmluZSBNVVNCX1RYRklGT1NaCQkweDYyCS8qIDgtYml0IChzZWUgbWFza3MpICovCisjZGVmaW5lIE1VU0JfUlhGSUZPU1oJCTB4NjMJLyogOC1iaXQgKHNlZSBtYXNrcykgKi8KKyNkZWZpbmUgTVVTQl9UWEZJRk9BREQJCTB4NjQJLyogMTYtYml0IG9mZnNldCBzaGlmdGVkIHJpZ2h0IDMgKi8KKyNkZWZpbmUgTVVTQl9SWEZJRk9BREQJCTB4NjYJLyogMTYtYml0IG9mZnNldCBzaGlmdGVkIHJpZ2h0IDMgKi8KKworLyogUkVWSVNJVDogdmN0cmwvdnN0YXR1czogb3B0aW9uYWwgdmVuZG9yIHV0bWkrcGh5IHJlZ2lzdGVyIGF0IDB4NjggKi8KKyNkZWZpbmUgTVVTQl9IV1ZFUlMJCTB4NkMJLyogOCBiaXQgKi8KKworI2RlZmluZSBNVVNCX0VQSU5GTwkJMHg3OAkvKiA4IGJpdCAqLworI2RlZmluZSBNVVNCX1JBTUlORk8JCTB4NzkJLyogOCBiaXQgKi8KKyNkZWZpbmUgTVVTQl9MSU5LSU5GTwkJMHg3YQkvKiA4IGJpdCAqLworI2RlZmluZSBNVVNCX1ZQTEVOCQkweDdiCS8qIDggYml0ICovCisjZGVmaW5lIE1VU0JfSFNfRU9GMQkJMHg3YwkvKiA4IGJpdCAqLworI2RlZmluZSBNVVNCX0ZTX0VPRjEJCTB4N2QJLyogOCBiaXQgKi8KKyNkZWZpbmUgTVVTQl9MU19FT0YxCQkweDdlCS8qIDggYml0ICovCisKKy8qIE9mZnNldHMgdG8gZW5kcG9pbnQgcmVnaXN0ZXJzICovCisjZGVmaW5lIE1VU0JfVFhNQVhQCQkweDAwCisjZGVmaW5lIE1VU0JfVFhDU1IJCTB4MDIKKyNkZWZpbmUgTVVTQl9DU1IwCQlNVVNCX1RYQ1NSCS8qIFJlLXVzZWQgZm9yIEVQMCAqLworI2RlZmluZSBNVVNCX1JYTUFYUAkJMHgwNAorI2RlZmluZSBNVVNCX1JYQ1NSCQkweDA2CisjZGVmaW5lIE1VU0JfUlhDT1VOVAkJMHgwOAorI2RlZmluZSBNVVNCX0NPVU5UMAkJTVVTQl9SWENPVU5UCS8qIFJlLXVzZWQgZm9yIEVQMCAqLworI2RlZmluZSBNVVNCX1RYVFlQRQkJMHgwQQorI2RlZmluZSBNVVNCX1RZUEUwCQlNVVNCX1RYVFlQRQkvKiBSZS11c2VkIGZvciBFUDAgKi8KKyNkZWZpbmUgTVVTQl9UWElOVEVSVkFMCQkweDBCCisjZGVmaW5lIE1VU0JfTkFLTElNSVQwCQlNVVNCX1RYSU5URVJWQUwJLyogUmUtdXNlZCBmb3IgRVAwICovCisjZGVmaW5lIE1VU0JfUlhUWVBFCQkweDBDCisjZGVmaW5lIE1VU0JfUlhJTlRFUlZBTAkJMHgwRAorI2RlZmluZSBNVVNCX0ZJRk9TSVpFCQkweDBGCisjZGVmaW5lIE1VU0JfQ09ORklHREFUQQkJTVVTQl9GSUZPU0laRQkvKiBSZS11c2VkIGZvciBFUDAgKi8KKworLyogT2Zmc2V0cyB0byBlbmRwb2ludCByZWdpc3RlcnMgaW4gaW5kZXhlZCBtb2RlbCAodXNpbmcgSU5ERVggcmVnaXN0ZXIpICovCisjZGVmaW5lIE1VU0JfSU5ERVhFRF9PRkZTRVQoX2VwbnVtLCBfb2Zmc2V0KQlcCisJKDB4MTAgKyAoX29mZnNldCkpCisKKy8qIE9mZnNldHMgdG8gZW5kcG9pbnQgcmVnaXN0ZXJzIGluIGZsYXQgbW9kZWxzICovCisjZGVmaW5lIE1VU0JfRkxBVF9PRkZTRVQoX2VwbnVtLCBfb2Zmc2V0KQlcCisJKDB4MTAwICsgKDB4MTAqKF9lcG51bSkpICsgKF9vZmZzZXQpKQorCisjaWZkZWYgQ09ORklHX1VTQl9UVVNCNjAxMAorLyogVFVTQjYwMTAgRVAwIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgaXMgc3BlY2lhbCAqLworI2RlZmluZSBNVVNCX1RVU0JfT0ZGU0VUKF9lcG51bSwgX29mZnNldCkJXAorCSgweDEwICsgX29mZnNldCkKKyNpbmNsdWRlICJ0dXNiNjAxMC5oIgkJLyogTmVlZGVkICJvbmx5IiBmb3IgVFVTQl9FUDBfQ09ORiAqLworI2VuZGlmCisKKyNkZWZpbmUgTVVTQl9UWENTUl9NT0RFCQkJMHgyMDAwCisKKy8qICJidXMgY29udHJvbCIvdGFyZ2V0IHJlZ2lzdGVycywgZm9yIGhvc3Qgc2lkZSBtdWx0aXBvaW50IChleHRlcm5hbCBodWJzKSAqLworI2RlZmluZSBNVVNCX1RYRlVOQ0FERFIJCTB4MDAKKyNkZWZpbmUgTVVTQl9UWEhVQkFERFIJCTB4MDIKKyNkZWZpbmUgTVVTQl9UWEhVQlBPUlQJCTB4MDMKKworI2RlZmluZSBNVVNCX1JYRlVOQ0FERFIJCTB4MDQKKyNkZWZpbmUgTVVTQl9SWEhVQkFERFIJCTB4MDYKKyNkZWZpbmUgTVVTQl9SWEhVQlBPUlQJCTB4MDcKKworI2RlZmluZSBNVVNCX0JVU0NUTF9PRkZTRVQoX2VwbnVtLCBfb2Zmc2V0KSBcCisJKDB4ODAgKyAoOCooX2VwbnVtKSkgKyAoX29mZnNldCkpCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtdXNiX3dyaXRlX3R4Zmlmb3N6KHZvaWQgX19pb21lbSAqbWJhc2UsIHU4IGNfc2l6ZSkKK3sKKwltdXNiX3dyaXRlYihtYmFzZSwgTVVTQl9UWEZJRk9TWiwgY19zaXplKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG11c2Jfd3JpdGVfdHhmaWZvYWRkKHZvaWQgX19pb21lbSAqbWJhc2UsIHUxNiBjX29mZikKK3sKKwltdXNiX3dyaXRldyhtYmFzZSwgTVVTQl9UWEZJRk9BREQsIGNfb2ZmKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG11c2Jfd3JpdGVfcnhmaWZvc3oodm9pZCBfX2lvbWVtICptYmFzZSwgdTggY19zaXplKQoreworCW11c2Jfd3JpdGViKG1iYXNlLCBNVVNCX1JYRklGT1NaLCBjX3NpemUpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgIG11c2Jfd3JpdGVfcnhmaWZvYWRkKHZvaWQgX19pb21lbSAqbWJhc2UsIHUxNiBjX29mZikKK3sKKwltdXNiX3dyaXRldyhtYmFzZSwgTVVTQl9SWEZJRk9BREQsIGNfb2ZmKTsKK30KKworc3RhdGljIGlubGluZSB1OCBtdXNiX3JlYWRfY29uZmlnZGF0YSh2b2lkIF9faW9tZW0gKm1iYXNlKQoreworCXJldHVybiBtdXNiX3JlYWRiKG1iYXNlLCAweDEwICsgTVVTQl9DT05GSUdEQVRBKTsKK30KKworc3RhdGljIGlubGluZSB1MTYgbXVzYl9yZWFkX2h3dmVycyh2b2lkIF9faW9tZW0gKm1iYXNlKQoreworCXJldHVybiBtdXNiX3JlYWR3KG1iYXNlLCBNVVNCX0hXVkVSUyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2lvbWVtICptdXNiX3JlYWRfdGFyZ2V0X3JlZ19iYXNlKHU4IGksIHZvaWQgX19pb21lbSAqbWJhc2UpCit7CisJcmV0dXJuIChNVVNCX0JVU0NUTF9PRkZTRVQoaSwgMCkgKyBtYmFzZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtdXNiX3dyaXRlX3J4ZnVuYWRkcih2b2lkIF9faW9tZW0gKmVwX3RhcmdldF9yZWdzLAorCQl1OCBxaF9hZGRyX3JlZykKK3sKKwltdXNiX3dyaXRlYihlcF90YXJnZXRfcmVncywgTVVTQl9SWEZVTkNBRERSLCBxaF9hZGRyX3JlZyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtdXNiX3dyaXRlX3J4aHViYWRkcih2b2lkIF9faW9tZW0gKmVwX3RhcmdldF9yZWdzLAorCQl1OCBxaF9oX2FkZHJfcmVnKQoreworCW11c2Jfd3JpdGViKGVwX3RhcmdldF9yZWdzLCBNVVNCX1JYSFVCQUREUiwgcWhfaF9hZGRyX3JlZyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtdXNiX3dyaXRlX3J4aHVicG9ydCh2b2lkIF9faW9tZW0gKmVwX3RhcmdldF9yZWdzLAorCQl1OCBxaF9oX3BvcnRfcmVnKQoreworCW11c2Jfd3JpdGViKGVwX3RhcmdldF9yZWdzLCBNVVNCX1JYSFVCUE9SVCwgcWhfaF9wb3J0X3JlZyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCAgbXVzYl93cml0ZV90eGZ1bmFkZHIodm9pZCBfX2lvbWVtICptYmFzZSwgdTggZXBudW0sCisJCXU4IHFoX2FkZHJfcmVnKQoreworCW11c2Jfd3JpdGViKG1iYXNlLCBNVVNCX0JVU0NUTF9PRkZTRVQoZXBudW0sIE1VU0JfVFhGVU5DQUREUiksCisJCQlxaF9hZGRyX3JlZyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCAgbXVzYl93cml0ZV90eGh1YmFkZHIodm9pZCBfX2lvbWVtICptYmFzZSwgdTggZXBudW0sCisJCXU4IHFoX2FkZHJfcmVnKQoreworCW11c2Jfd3JpdGViKG1iYXNlLCBNVVNCX0JVU0NUTF9PRkZTRVQoZXBudW0sIE1VU0JfVFhIVUJBRERSKSwKKwkJCXFoX2FkZHJfcmVnKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkICBtdXNiX3dyaXRlX3R4aHVicG9ydCh2b2lkIF9faW9tZW0gKm1iYXNlLCB1OCBlcG51bSwKKwkJdTggcWhfaF9wb3J0X3JlZykKK3sKKwltdXNiX3dyaXRlYihtYmFzZSwgTVVTQl9CVVNDVExfT0ZGU0VUKGVwbnVtLCBNVVNCX1RYSFVCUE9SVCksCisJCQlxaF9oX3BvcnRfcmVnKTsKK30KKworI2Vsc2UgLyogQ09ORklHX0JMQUNLRklOICovCisKKyNkZWZpbmUgVVNCX0JBU0UJCVVTQl9GQUREUgorI2RlZmluZSBVU0JfT0ZGU0VUKHJlZykJCShyZWcgLSBVU0JfQkFTRSkKKworLyoKKyAqIENvbW1vbiBVU0IgcmVnaXN0ZXJzCisgKi8KKyNkZWZpbmUgTVVTQl9GQUREUgkJVVNCX09GRlNFVChVU0JfRkFERFIpCS8qIDgtYml0ICovCisjZGVmaW5lIE1VU0JfUE9XRVIJCVVTQl9PRkZTRVQoVVNCX1BPV0VSKQkvKiA4LWJpdCAqLworI2RlZmluZSBNVVNCX0lOVFJUWAkJVVNCX09GRlNFVChVU0JfSU5UUlRYKQkvKiAxNi1iaXQgKi8KKyNkZWZpbmUgTVVTQl9JTlRSUlgJCVVTQl9PRkZTRVQoVVNCX0lOVFJSWCkKKyNkZWZpbmUgTVVTQl9JTlRSVFhFCQlVU0JfT0ZGU0VUKFVTQl9JTlRSVFhFKQorI2RlZmluZSBNVVNCX0lOVFJSWEUJCVVTQl9PRkZTRVQoVVNCX0lOVFJSWEUpCisjZGVmaW5lIE1VU0JfSU5UUlVTQgkJVVNCX09GRlNFVChVU0JfSU5UUlVTQikJLyogOCBiaXQgKi8KKyNkZWZpbmUgTVVTQl9JTlRSVVNCRQkJVVNCX09GRlNFVChVU0JfSU5UUlVTQkUpLyogOCBiaXQgKi8KKyNkZWZpbmUgTVVTQl9GUkFNRQkJVVNCX09GRlNFVChVU0JfRlJBTUUpCisjZGVmaW5lIE1VU0JfSU5ERVgJCVVTQl9PRkZTRVQoVVNCX0lOREVYKQkvKiA4IGJpdCAqLworI2RlZmluZSBNVVNCX1RFU1RNT0RFCQlVU0JfT0ZGU0VUKFVTQl9URVNUTU9ERSkvKiA4IGJpdCAqLworCisvKiBHZXQgb2Zmc2V0IGZvciBhIGdpdmVuIEZJRk8gZnJvbSBtdXNiLT5tcmVncyAqLworI2RlZmluZSBNVVNCX0ZJRk9fT0ZGU0VUKGVwbnVtKQlcCisJKFVTQl9PRkZTRVQoVVNCX0VQMF9GSUZPKSArICgoZXBudW0pICogOCkpCisKKy8qCisgKiBBZGRpdGlvbmFsIENvbnRyb2wgUmVnaXN0ZXJzCisgKi8KKworI2RlZmluZSBNVVNCX0RFVkNUTAkJVVNCX09GRlNFVChVU0JfT1RHX0RFVl9DVEwpCS8qIDggYml0ICovCisKKyNkZWZpbmUgTVVTQl9MSU5LSU5GTwkJVVNCX09GRlNFVChVU0JfTElOS0lORk8pLyogOCBiaXQgKi8KKyNkZWZpbmUgTVVTQl9WUExFTgkJVVNCX09GRlNFVChVU0JfVlBMRU4pCS8qIDggYml0ICovCisjZGVmaW5lIE1VU0JfSFNfRU9GMQkJVVNCX09GRlNFVChVU0JfSFNfRU9GMSkJLyogOCBiaXQgKi8KKyNkZWZpbmUgTVVTQl9GU19FT0YxCQlVU0JfT0ZGU0VUKFVTQl9GU19FT0YxKQkvKiA4IGJpdCAqLworI2RlZmluZSBNVVNCX0xTX0VPRjEJCVVTQl9PRkZTRVQoVVNCX0xTX0VPRjEpCS8qIDggYml0ICovCisKKy8qIE9mZnNldHMgdG8gZW5kcG9pbnQgcmVnaXN0ZXJzICovCisjZGVmaW5lIE1VU0JfVFhNQVhQCQkweDAwCisjZGVmaW5lIE1VU0JfVFhDU1IJCTB4MDQKKyNkZWZpbmUgTVVTQl9DU1IwCQlNVVNCX1RYQ1NSCS8qIFJlLXVzZWQgZm9yIEVQMCAqLworI2RlZmluZSBNVVNCX1JYTUFYUAkJMHgwOAorI2RlZmluZSBNVVNCX1JYQ1NSCQkweDBDCisjZGVmaW5lIE1VU0JfUlhDT1VOVAkJMHgxMAorI2RlZmluZSBNVVNCX0NPVU5UMAkJTVVTQl9SWENPVU5UCS8qIFJlLXVzZWQgZm9yIEVQMCAqLworI2RlZmluZSBNVVNCX1RYVFlQRQkJMHgxNAorI2RlZmluZSBNVVNCX1RZUEUwCQlNVVNCX1RYVFlQRQkvKiBSZS11c2VkIGZvciBFUDAgKi8KKyNkZWZpbmUgTVVTQl9UWElOVEVSVkFMCQkweDE4CisjZGVmaW5lIE1VU0JfTkFLTElNSVQwCQlNVVNCX1RYSU5URVJWQUwJLyogUmUtdXNlZCBmb3IgRVAwICovCisjZGVmaW5lIE1VU0JfUlhUWVBFCQkweDFDCisjZGVmaW5lIE1VU0JfUlhJTlRFUlZBTAkJMHgyMAorI2RlZmluZSBNVVNCX1RYQ09VTlQJCTB4MjgKKworLyogT2Zmc2V0cyB0byBlbmRwb2ludCByZWdpc3RlcnMgaW4gaW5kZXhlZCBtb2RlbCAodXNpbmcgSU5ERVggcmVnaXN0ZXIpICovCisjZGVmaW5lIE1VU0JfSU5ERVhFRF9PRkZTRVQoX2VwbnVtLCBfb2Zmc2V0KQlcCisJKDB4NDAgKyAoX29mZnNldCkpCisKKy8qIE9mZnNldHMgdG8gZW5kcG9pbnQgcmVnaXN0ZXJzIGluIGZsYXQgbW9kZWxzICovCisjZGVmaW5lIE1VU0JfRkxBVF9PRkZTRVQoX2VwbnVtLCBfb2Zmc2V0KQlcCisJKFVTQl9PRkZTRVQoVVNCX0VQX05JMF9UWE1BWFApICsgKDB4NDAgKiAoX2VwbnVtKSkgKyAoX29mZnNldCkpCisKKy8qIE5vdCBpbXBsZW1lbnRlZCAtIEhXIGhhcyBzZXBlcmF0ZSBUeC9SeCBGSUZPICovCisjZGVmaW5lIE1VU0JfVFhDU1JfTU9ERQkJCTB4MDAwMAorCisvKgorICogRHVtbXkgc3R1YiBmb3IgY2xrIGZyYW1ld29yaywgaXQgd2lsbCBiZSByZW1vdmVkCisgKiB1bnRpbCBCbGFja2ZpbiBzdXBwb3J0cyBjbGsgZnJhbWV3b3JrCisgKi8KKyNkZWZpbmUgY2xrX2dldChkZXYsIGlkKQlOVUxMCisjZGVmaW5lIGNsa19wdXQoY2xvY2spCQlkbyB7fSB3aGlsZSAoMCkKKyNkZWZpbmUgY2xrX2VuYWJsZShjbG9jaykJZG8ge30gd2hpbGUgKDApCisjZGVmaW5lIGNsa19kaXNhYmxlKGNsb2NrKQlkbyB7fSB3aGlsZSAoMCkKKworc3RhdGljIGlubGluZSB2b2lkIG11c2Jfd3JpdGVfdHhmaWZvc3oodm9pZCBfX2lvbWVtICptYmFzZSwgdTggY19zaXplKQoreworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbXVzYl93cml0ZV90eGZpZm9hZGQodm9pZCBfX2lvbWVtICptYmFzZSwgdTE2IGNfb2ZmKQoreworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbXVzYl93cml0ZV9yeGZpZm9zeih2b2lkIF9faW9tZW0gKm1iYXNlLCB1OCBjX3NpemUpCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCAgbXVzYl93cml0ZV9yeGZpZm9hZGQodm9pZCBfX2lvbWVtICptYmFzZSwgdTE2IGNfb2ZmKQoreworfQorCitzdGF0aWMgaW5saW5lIHU4IG11c2JfcmVhZF9jb25maWdkYXRhKHZvaWQgX19pb21lbSAqbWJhc2UpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTE2IG11c2JfcmVhZF9od3ZlcnModm9pZCBfX2lvbWVtICptYmFzZSkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB1MTYgbXVzYl9yZWFkX3RhcmdldF9yZWdfYmFzZSh1OCBpLCB2b2lkIF9faW9tZW0gKm1iYXNlKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbXVzYl93cml0ZV9yeGZ1bmFkZHIodm9pZCBfX2lvbWVtICplcF90YXJnZXRfcmVncywKKwkJdTggcWhfYWRkcl9yZXEpCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtdXNiX3dyaXRlX3J4aHViYWRkcih2b2lkIF9faW9tZW0gKmVwX3RhcmdldF9yZWdzLAorCQl1OCBxaF9oX2FkZHJfcmVnKQoreworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbXVzYl93cml0ZV9yeGh1YnBvcnQodm9pZCBfX2lvbWVtICplcF90YXJnZXRfcmVncywKKwkJdTggcWhfaF9wb3J0X3JlZykKK3sKK30KKworc3RhdGljIGlubGluZSB2b2lkICBtdXNiX3dyaXRlX3R4ZnVuYWRkcih2b2lkIF9faW9tZW0gKm1iYXNlLCB1OCBlcG51bSwKKwkJdTggcWhfYWRkcl9yZWcpCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCAgbXVzYl93cml0ZV90eGh1YmFkZHIodm9pZCBfX2lvbWVtICptYmFzZSwgdTggZXBudW0sCisJCXU4IHFoX2FkZHJfcmVnKQoreworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgIG11c2Jfd3JpdGVfdHhodWJwb3J0KHZvaWQgX19pb21lbSAqbWJhc2UsIHU4IGVwbnVtLAorCQl1OCBxaF9oX3BvcnRfcmVnKQoreworfQorCisjZW5kaWYgLyogQ09ORklHX0JMQUNLRklOICovCisKICNlbmRpZgkvKiBfX01VU0JfUkVHU19IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL211c2IvbXVzYmhzZG1hLmMgYi9kcml2ZXJzL3VzYi9tdXNiL211c2Joc2RtYS5jCmluZGV4IDhjNzM0ZWYuLjg2NjJlOWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL211c2IvbXVzYmhzZG1hLmMKKysrIGIvZHJpdmVycy91c2IvbXVzYi9tdXNiaHNkbWEuYwpAQCAtMzQsNTggKzM0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlICJtdXNiX2NvcmUuaCIKLQotI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDI0MzApIHx8IGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDM0MzApCi0jaW5jbHVkZSAib21hcDI0MzAuaCIKLSNlbmRpZgotCi0jZGVmaW5lIE1VU0JfSFNETUFfQkFTRQkJMHgyMDAKLSNkZWZpbmUgTVVTQl9IU0RNQV9JTlRSCQkoTVVTQl9IU0RNQV9CQVNFICsgMCkKLSNkZWZpbmUgTVVTQl9IU0RNQV9DT05UUk9MCQkweDQKLSNkZWZpbmUgTVVTQl9IU0RNQV9BRERSRVNTCQkweDgKLSNkZWZpbmUgTVVTQl9IU0RNQV9DT1VOVAkJMHhjCi0KLSNkZWZpbmUgTVVTQl9IU0RNQV9DSEFOTkVMX09GRlNFVChfYmNoYW5uZWwsIF9vZmZzZXQpCQlcCi0JCShNVVNCX0hTRE1BX0JBU0UgKyAoX2JjaGFubmVsIDw8IDQpICsgX29mZnNldCkKLQotLyogY29udHJvbCByZWdpc3RlciAoMTYtYml0KTogKi8KLSNkZWZpbmUgTVVTQl9IU0RNQV9FTkFCTEVfU0hJRlQJCTAKLSNkZWZpbmUgTVVTQl9IU0RNQV9UUkFOU01JVF9TSElGVAkJMQotI2RlZmluZSBNVVNCX0hTRE1BX01PREUxX1NISUZUCQkyCi0jZGVmaW5lIE1VU0JfSFNETUFfSVJRRU5BQkxFX1NISUZUCQkzCi0jZGVmaW5lIE1VU0JfSFNETUFfRU5EUE9JTlRfU0hJRlQJCTQKLSNkZWZpbmUgTVVTQl9IU0RNQV9CVVNFUlJPUl9TSElGVAkJOAotI2RlZmluZSBNVVNCX0hTRE1BX0JVUlNUTU9ERV9TSElGVAkJOQotI2RlZmluZSBNVVNCX0hTRE1BX0JVUlNUTU9ERQkJKDMgPDwgTVVTQl9IU0RNQV9CVVJTVE1PREVfU0hJRlQpCi0jZGVmaW5lIE1VU0JfSFNETUFfQlVSU1RNT0RFX1VOU1BFQwkwCi0jZGVmaW5lIE1VU0JfSFNETUFfQlVSU1RNT0RFX0lOQ1I0CTEKLSNkZWZpbmUgTVVTQl9IU0RNQV9CVVJTVE1PREVfSU5DUjgJMgotI2RlZmluZSBNVVNCX0hTRE1BX0JVUlNUTU9ERV9JTkNSMTYJMwotCi0jZGVmaW5lIE1VU0JfSFNETUFfQ0hBTk5FTFMJCTgKLQotc3RydWN0IG11c2JfZG1hX2NvbnRyb2xsZXI7Ci0KLXN0cnVjdCBtdXNiX2RtYV9jaGFubmVsIHsKLQlzdHJ1Y3QgZG1hX2NoYW5uZWwJCWNoYW5uZWw7Ci0Jc3RydWN0IG11c2JfZG1hX2NvbnRyb2xsZXIJKmNvbnRyb2xsZXI7Ci0JdTMyCQkJCXN0YXJ0X2FkZHI7Ci0JdTMyCQkJCWxlbjsKLQl1MTYJCQkJbWF4X3BhY2tldF9zejsKLQl1OAkJCQlpZHg7Ci0JdTgJCQkJZXBudW07Ci0JdTgJCQkJdHJhbnNtaXQ7Ci19OwotCi1zdHJ1Y3QgbXVzYl9kbWFfY29udHJvbGxlciB7Ci0Jc3RydWN0IGRtYV9jb250cm9sbGVyCQljb250cm9sbGVyOwotCXN0cnVjdCBtdXNiX2RtYV9jaGFubmVsCQljaGFubmVsW01VU0JfSFNETUFfQ0hBTk5FTFNdOwotCXZvaWQJCQkJKnByaXZhdGVfZGF0YTsKLQl2b2lkIF9faW9tZW0JCQkqYmFzZTsKLQl1OAkJCQljaGFubmVsX2NvdW50OwotCXU4CQkJCXVzZWRfY2hhbm5lbHM7Ci0JdTgJCQkJaXJxOwotfTsKKyNpbmNsdWRlICJtdXNiaHNkbWEuaCIKIAogc3RhdGljIGludCBkbWFfY29udHJvbGxlcl9zdGFydChzdHJ1Y3QgZG1hX2NvbnRyb2xsZXIgKmMpCiB7CkBAIC0yMDMsMTIgKzE1Miw4IEBACiAJCQkJOiAwKTsKIAogCS8qIGFkZHJlc3MvY291bnQgKi8KLQltdXNiX3dyaXRlbChtYmFzZSwKLQkJTVVTQl9IU0RNQV9DSEFOTkVMX09GRlNFVChiY2hhbm5lbCwgTVVTQl9IU0RNQV9BRERSRVNTKSwKLQkJZG1hX2FkZHIpOwotCW11c2Jfd3JpdGVsKG1iYXNlLAotCQlNVVNCX0hTRE1BX0NIQU5ORUxfT0ZGU0VUKGJjaGFubmVsLCBNVVNCX0hTRE1BX0NPVU5UKSwKLQkJbGVuKTsKKwltdXNiX3dyaXRlX2hzZG1hX2FkZHIobWJhc2UsIGJjaGFubmVsLCBkbWFfYWRkcik7CisJbXVzYl93cml0ZV9oc2RtYV9jb3VudChtYmFzZSwgYmNoYW5uZWwsIGxlbik7CiAKIAkvKiBjb250cm9sICh0aGlzIHNob3VsZCBzdGFydCB0aGluZ3MpICovCiAJbXVzYl93cml0ZXcobWJhc2UsCkBAIC0yNzksMTMgKzIyNCw4IEBACiAJCW11c2Jfd3JpdGV3KG1iYXNlLAogCQkJTVVTQl9IU0RNQV9DSEFOTkVMX09GRlNFVChiY2hhbm5lbCwgTVVTQl9IU0RNQV9DT05UUk9MKSwKIAkJCTApOwotCQltdXNiX3dyaXRlbChtYmFzZSwKLQkJCU1VU0JfSFNETUFfQ0hBTk5FTF9PRkZTRVQoYmNoYW5uZWwsIE1VU0JfSFNETUFfQUREUkVTUyksCi0JCQkwKTsKLQkJbXVzYl93cml0ZWwobWJhc2UsCi0JCQlNVVNCX0hTRE1BX0NIQU5ORUxfT0ZGU0VUKGJjaGFubmVsLCBNVVNCX0hTRE1BX0NPVU5UKSwKLQkJCTApOwotCisJCW11c2Jfd3JpdGVfaHNkbWFfYWRkcihtYmFzZSwgYmNoYW5uZWwsIDApOworCQltdXNiX3dyaXRlX2hzZG1hX2NvdW50KG1iYXNlLCBiY2hhbm5lbCwgMCk7CiAJCWNoYW5uZWwtPnN0YXR1cyA9IE1VU0JfRE1BX1NUQVRVU19GUkVFOwogCX0KIApAQCAtMzMzLDEwICsyNzMsOCBAQAogCQkJfSBlbHNlIHsKIAkJCQl1OCBkZXZjdGw7CiAKLQkJCQlhZGRyID0gbXVzYl9yZWFkbChtYmFzZSwKLQkJCQkJCU1VU0JfSFNETUFfQ0hBTk5FTF9PRkZTRVQoCi0JCQkJCQkJYmNoYW5uZWwsCi0JCQkJCQkJTVVTQl9IU0RNQV9BRERSRVNTKSk7CisJCQkJYWRkciA9IG11c2JfcmVhZF9oc2RtYV9hZGRyKG1iYXNlLAorCQkJCQkJYmNoYW5uZWwpOwogCQkJCWNoYW5uZWwtPmFjdHVhbF9sZW4gPSBhZGRyCiAJCQkJCS0gbXVzYl9jaGFubmVsLT5zdGFydF9hZGRyOwogCkBAIC0zNzUsNiArMzEzLDEyIEBACiAJCQl9CiAJCX0KIAl9CisKKyNpZmRlZiBDT05GSUdfQkxBQ0tGSU4KKwkvKiBDbGVhciBETUEgaW50ZXJydXAgZmxhZ3MgKi8KKwltdXNiX3dyaXRlYihtYmFzZSwgTVVTQl9IU0RNQV9JTlRSLCBpbnRfaHNkbWEpOworI2VuZGlmCisKIAlyZXR2YWwgPSBJUlFfSEFORExFRDsKIGRvbmU6CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbXVzYi0+bG9jaywgZmxhZ3MpOwpAQCAtNDI0LDcgKzM2OCw3IEBACiAJY29udHJvbGxlci0+Y29udHJvbGxlci5jaGFubmVsX2Fib3J0ID0gZG1hX2NoYW5uZWxfYWJvcnQ7CiAKIAlpZiAocmVxdWVzdF9pcnEoaXJxLCBkbWFfY29udHJvbGxlcl9pcnEsIElSUUZfRElTQUJMRUQsCi0JCQltdXNiLT5jb250cm9sbGVyLT5idXNfaWQsICZjb250cm9sbGVyLT5jb250cm9sbGVyKSkgeworCQkJZGV2X25hbWUobXVzYi0+Y29udHJvbGxlciksICZjb250cm9sbGVyLT5jb250cm9sbGVyKSkgewogCQlkZXZfZXJyKGRldiwgInJlcXVlc3RfaXJxICVkIGZhaWxlZCFcbiIsIGlycSk7CiAJCWRtYV9jb250cm9sbGVyX2Rlc3Ryb3koJmNvbnRyb2xsZXItPmNvbnRyb2xsZXIpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tdXNiL211c2Joc2RtYS5oIGIvZHJpdmVycy91c2IvbXVzYi9tdXNiaHNkbWEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjk5ZDkyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2IvbXVzYi9tdXNiaHNkbWEuaApAQCAtMCwwICsxLDE0OSBAQAorLyoKKyAqIE1VU0IgT1RHIGRyaXZlciAtIHN1cHBvcnQgZm9yIE1lbnRvcidzIERNQSBjb250cm9sbGVyCisgKgorICogQ29weXJpZ2h0IDIwMDUgTWVudG9yIEdyYXBoaWNzIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwNyBieSBUZXhhcyBJbnN0cnVtZW50cworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSBVU0EKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4KKyAqIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCisgKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OCisgKiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaWYgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQMjQzMCkgfHwgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQMzQzMCkKKyNpbmNsdWRlICJvbWFwMjQzMC5oIgorI2VuZGlmCisKKyNpZm5kZWYgQ09ORklHX0JMQUNLRklOCisKKyNkZWZpbmUgTVVTQl9IU0RNQV9CQVNFCQkweDIwMAorI2RlZmluZSBNVVNCX0hTRE1BX0lOVFIJCShNVVNCX0hTRE1BX0JBU0UgKyAwKQorI2RlZmluZSBNVVNCX0hTRE1BX0NPTlRST0wJCTB4NAorI2RlZmluZSBNVVNCX0hTRE1BX0FERFJFU1MJCTB4OAorI2RlZmluZSBNVVNCX0hTRE1BX0NPVU5UCQkweGMKKworI2RlZmluZSBNVVNCX0hTRE1BX0NIQU5ORUxfT0ZGU0VUKF9iY2hhbm5lbCwgX29mZnNldCkJCVwKKwkJKE1VU0JfSFNETUFfQkFTRSArIChfYmNoYW5uZWwgPDwgNCkgKyBfb2Zmc2V0KQorCisjZGVmaW5lIG11c2JfcmVhZF9oc2RtYV9hZGRyKG1iYXNlLCBiY2hhbm5lbCkJXAorCW11c2JfcmVhZGwobWJhc2UsCVwKKwkJICAgTVVTQl9IU0RNQV9DSEFOTkVMX09GRlNFVChiY2hhbm5lbCwgTVVTQl9IU0RNQV9BRERSRVNTKSkKKworI2RlZmluZSBtdXNiX3dyaXRlX2hzZG1hX2FkZHIobWJhc2UsIGJjaGFubmVsLCBhZGRyKSBcCisJbXVzYl93cml0ZWwobWJhc2UsIFwKKwkJICAgIE1VU0JfSFNETUFfQ0hBTk5FTF9PRkZTRVQoYmNoYW5uZWwsIE1VU0JfSFNETUFfQUREUkVTUyksIFwKKwkJICAgIGFkZHIpCisKKyNkZWZpbmUgbXVzYl93cml0ZV9oc2RtYV9jb3VudChtYmFzZSwgYmNoYW5uZWwsIGxlbikgXAorCW11c2Jfd3JpdGVsKG1iYXNlLCBcCisJCSAgICBNVVNCX0hTRE1BX0NIQU5ORUxfT0ZGU0VUKGJjaGFubmVsLCBNVVNCX0hTRE1BX0NPVU5UKSwgXAorCQkgICAgbGVuKQorI2Vsc2UKKworI2RlZmluZSBNVVNCX0hTRE1BX0JBU0UJCTB4NDAwCisjZGVmaW5lIE1VU0JfSFNETUFfSU5UUgkJKE1VU0JfSFNETUFfQkFTRSArIDApCisjZGVmaW5lIE1VU0JfSFNETUFfQ09OVFJPTAkJMHgwNAorI2RlZmluZSBNVVNCX0hTRE1BX0FERFJfTE9XCQkweDA4CisjZGVmaW5lIE1VU0JfSFNETUFfQUREUl9ISUdICQkweDBDCisjZGVmaW5lIE1VU0JfSFNETUFfQ09VTlRfTE9XCQkweDEwCisjZGVmaW5lIE1VU0JfSFNETUFfQ09VTlRfSElHSAkJMHgxNAorCisjZGVmaW5lIE1VU0JfSFNETUFfQ0hBTk5FTF9PRkZTRVQoX2JjaGFubmVsLCBfb2Zmc2V0KQkJXAorCQkoTVVTQl9IU0RNQV9CQVNFICsgKF9iY2hhbm5lbCAqIDB4MjApICsgX29mZnNldCkKKworc3RhdGljIGlubGluZSB1MzIgbXVzYl9yZWFkX2hzZG1hX2FkZHIodm9pZCBfX2lvbWVtICptYmFzZSwgdTggYmNoYW5uZWwpCit7CisJdTMyIGFkZHIgPSBtdXNiX3JlYWR3KG1iYXNlLAorCQlNVVNCX0hTRE1BX0NIQU5ORUxfT0ZGU0VUKGJjaGFubmVsLCBNVVNCX0hTRE1BX0FERFJfSElHSCkpOworCisJYWRkciA9IGFkZHIgPDwgMTY7CisKKwlhZGRyIHw9IG11c2JfcmVhZHcobWJhc2UsCisJCU1VU0JfSFNETUFfQ0hBTk5FTF9PRkZTRVQoYmNoYW5uZWwsIE1VU0JfSFNETUFfQUREUl9MT1cpKTsKKworCXJldHVybiBhZGRyOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbXVzYl93cml0ZV9oc2RtYV9hZGRyKHZvaWQgX19pb21lbSAqbWJhc2UsCisJCQkJdTggYmNoYW5uZWwsIGRtYV9hZGRyX3QgZG1hX2FkZHIpCit7CisJbXVzYl93cml0ZXcobWJhc2UsCisJCU1VU0JfSFNETUFfQ0hBTk5FTF9PRkZTRVQoYmNoYW5uZWwsIE1VU0JfSFNETUFfQUREUl9MT1cpLAorCQkoKHUxNikoKHUzMikgZG1hX2FkZHIgJiAweEZGRkYpKSk7CisJbXVzYl93cml0ZXcobWJhc2UsCisJCU1VU0JfSFNETUFfQ0hBTk5FTF9PRkZTRVQoYmNoYW5uZWwsIE1VU0JfSFNETUFfQUREUl9ISUdIKSwKKwkJKCh1MTYpKCgodTMyKSBkbWFfYWRkciA+PiAxNikgJiAweEZGRkYpKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtdXNiX3dyaXRlX2hzZG1hX2NvdW50KHZvaWQgX19pb21lbSAqbWJhc2UsCisJCQkJdTggYmNoYW5uZWwsIHUzMiBsZW4pCit7CisJbXVzYl93cml0ZXcobWJhc2UsCisJCU1VU0JfSFNETUFfQ0hBTk5FTF9PRkZTRVQoYmNoYW5uZWwsIE1VU0JfSFNETUFfQ09VTlRfTE9XKSwKKwkJKCh1MTYpKCh1MzIpIGxlbiAmIDB4RkZGRikpKTsKKwltdXNiX3dyaXRldyhtYmFzZSwKKwkJTVVTQl9IU0RNQV9DSEFOTkVMX09GRlNFVChiY2hhbm5lbCwgTVVTQl9IU0RNQV9DT1VOVF9ISUdIKSwKKwkJKCh1MTYpKCgodTMyKSBsZW4gPj4gMTYpICYgMHhGRkZGKSkpOworfQorCisjZW5kaWYgLyogQ09ORklHX0JMQUNLRklOICovCisKKy8qIGNvbnRyb2wgcmVnaXN0ZXIgKDE2LWJpdCk6ICovCisjZGVmaW5lIE1VU0JfSFNETUFfRU5BQkxFX1NISUZUCQkwCisjZGVmaW5lIE1VU0JfSFNETUFfVFJBTlNNSVRfU0hJRlQJMQorI2RlZmluZSBNVVNCX0hTRE1BX01PREUxX1NISUZUCQkyCisjZGVmaW5lIE1VU0JfSFNETUFfSVJRRU5BQkxFX1NISUZUCTMKKyNkZWZpbmUgTVVTQl9IU0RNQV9FTkRQT0lOVF9TSElGVAk0CisjZGVmaW5lIE1VU0JfSFNETUFfQlVTRVJST1JfU0hJRlQJOAorI2RlZmluZSBNVVNCX0hTRE1BX0JVUlNUTU9ERV9TSElGVAk5CisjZGVmaW5lIE1VU0JfSFNETUFfQlVSU1RNT0RFCQkoMyA8PCBNVVNCX0hTRE1BX0JVUlNUTU9ERV9TSElGVCkKKyNkZWZpbmUgTVVTQl9IU0RNQV9CVVJTVE1PREVfVU5TUEVDCTAKKyNkZWZpbmUgTVVTQl9IU0RNQV9CVVJTVE1PREVfSU5DUjQJMQorI2RlZmluZSBNVVNCX0hTRE1BX0JVUlNUTU9ERV9JTkNSOAkyCisjZGVmaW5lIE1VU0JfSFNETUFfQlVSU1RNT0RFX0lOQ1IxNgkzCisKKyNkZWZpbmUgTVVTQl9IU0RNQV9DSEFOTkVMUwkJOAorCitzdHJ1Y3QgbXVzYl9kbWFfY29udHJvbGxlcjsKKworc3RydWN0IG11c2JfZG1hX2NoYW5uZWwgeworCXN0cnVjdCBkbWFfY2hhbm5lbAkJY2hhbm5lbDsKKwlzdHJ1Y3QgbXVzYl9kbWFfY29udHJvbGxlcgkqY29udHJvbGxlcjsKKwl1MzIJCQkJc3RhcnRfYWRkcjsKKwl1MzIJCQkJbGVuOworCXUxNgkJCQltYXhfcGFja2V0X3N6OworCXU4CQkJCWlkeDsKKwl1OAkJCQllcG51bTsKKwl1OAkJCQl0cmFuc21pdDsKK307CisKK3N0cnVjdCBtdXNiX2RtYV9jb250cm9sbGVyIHsKKwlzdHJ1Y3QgZG1hX2NvbnRyb2xsZXIJCWNvbnRyb2xsZXI7CisJc3RydWN0IG11c2JfZG1hX2NoYW5uZWwJCWNoYW5uZWxbTVVTQl9IU0RNQV9DSEFOTkVMU107CisJdm9pZAkJCQkqcHJpdmF0ZV9kYXRhOworCXZvaWQgX19pb21lbQkJCSpiYXNlOworCXU4CQkJCWNoYW5uZWxfY291bnQ7CisJdTgJCQkJdXNlZF9jaGFubmVsczsKKwl1OAkJCQlpcnE7Cit9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbXVzYi9vbWFwMjQzMC5jIGIvZHJpdmVycy91c2IvbXVzYi9vbWFwMjQzMC5jCmluZGV4IGNlNmMxNjIuLjkwMWRmZmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL211c2Ivb21hcDI0MzAuYworKysgYi9kcml2ZXJzL3VzYi9tdXNiL29tYXAyNDMwLmMKQEAgLTU4LDEwICs1OCwxMCBAQAogI2VuZGlmCiAJdTgJZGV2Y3RsOwogCi0JZGV2Y3RsID0gbXVzYl9yZWFkYihtdXNiLT5tcmVncywgTVVTQl9ERVZDVEwpOwotCiAJc3Bpbl9sb2NrX2lycXNhdmUoJm11c2ItPmxvY2ssIGZsYWdzKTsKIAorCWRldmN0bCA9IG11c2JfcmVhZGIobXVzYi0+bXJlZ3MsIE1VU0JfREVWQ1RMKTsKKwogCXN3aXRjaCAobXVzYi0+eGNlaXYuc3RhdGUpIHsKIAljYXNlIE9UR19TVEFURV9BX1dBSVRfQkNPTjoKIAkJZGV2Y3RsICY9IH5NVVNCX0RFVkNUTF9TRVNTSU9OOwpAQCAtMTk2LDcgKzE5Niw3IEBACiAKIHN0YXRpYyBpbnQgbXVzYl9wbGF0Zm9ybV9yZXN1bWUoc3RydWN0IG11c2IgKm11c2IpOwogCi12b2lkIG11c2JfcGxhdGZvcm1fc2V0X21vZGUoc3RydWN0IG11c2IgKm11c2IsIHU4IG11c2JfbW9kZSkKK2ludCBtdXNiX3BsYXRmb3JtX3NldF9tb2RlKHN0cnVjdCBtdXNiICptdXNiLCB1OCBtdXNiX21vZGUpCiB7CiAJdTgJZGV2Y3RsID0gbXVzYl9yZWFkYihtdXNiLT5tcmVncywgTVVTQl9ERVZDVEwpOwogCkBAIC0yMDQsMTUgKzIwNCwyNCBAQAogCW11c2Jfd3JpdGViKG11c2ItPm1yZWdzLCBNVVNCX0RFVkNUTCwgZGV2Y3RsKTsKIAogCXN3aXRjaCAobXVzYl9tb2RlKSB7CisjaWZkZWYgQ09ORklHX1VTQl9NVVNCX0hEUkNfSENECiAJY2FzZSBNVVNCX0hPU1Q6CiAJCW90Z19zZXRfaG9zdCgmbXVzYi0+eGNlaXYsIG11c2ItPnhjZWl2Lmhvc3QpOwogCQlicmVhazsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19VU0JfR0FER0VUX01VU0JfSERSQwogCWNhc2UgTVVTQl9QRVJJUEhFUkFMOgogCQlvdGdfc2V0X3BlcmlwaGVyYWwoJm11c2ItPnhjZWl2LCBtdXNiLT54Y2Vpdi5nYWRnZXQpOwogCQlicmVhazsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19VU0JfTVVTQl9PVEcKIAljYXNlIE1VU0JfT1RHOgogCQlicmVhazsKKyNlbmRpZgorCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOwogCX0KKwlyZXR1cm4gMDsKIH0KIAogaW50IF9faW5pdCBtdXNiX3BsYXRmb3JtX2luaXQoc3RydWN0IG11c2IgKm11c2IpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tdXNiL3R1c2I2MDEwLmMgYi9kcml2ZXJzL3VzYi9tdXNiL3R1c2I2MDEwLmMKaW5kZXggZWU4ZmNhOS4uOWUyMGZkMCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbXVzYi90dXNiNjAxMC5jCisrKyBiL2RyaXZlcnMvdXNiL211c2IvdHVzYjYwMTAuYwpAQCAtNTk4LDcgKzU5OCw3IEBACiAgKiBhbmQgcGVyaXBoZXJhbCBtb2RlcyBpbiBub24tT1RHIGNvbmZpZ3VyYXRpb25zIGJ5IHJlY29uZmlndXJpbmcgaGFyZHdhcmUKICAqIGFuZCB0aGVuIHNldHRpbmcgbXVzYi0+Ym9hcmRfbW9kZS4gRm9yIG5vdywgb25seSBzdXBwb3J0IE9URyBtb2RlLgogICovCi12b2lkIG11c2JfcGxhdGZvcm1fc2V0X21vZGUoc3RydWN0IG11c2IgKm11c2IsIHU4IG11c2JfbW9kZSkKK2ludCBtdXNiX3BsYXRmb3JtX3NldF9tb2RlKHN0cnVjdCBtdXNiICptdXNiLCB1OCBtdXNiX21vZGUpCiB7CiAJdm9pZCBfX2lvbWVtCSp0YmFzZSA9IG11c2ItPmN0cmxfYmFzZTsKIAl1MzIJCW90Z19zdGF0LCBwaHlfb3RnX2N0cmwsIHBoeV9vdGdfZW5hLCBkZXZfY29uZjsKQEAgLTY0MSw3ICs2NDEsOCBAQAogI2VuZGlmCiAKIAlkZWZhdWx0OgotCQlEQkcoMiwgIlRyeWluZyB0byBzZXQgdW5rbm93biBtb2RlICVpXG4iLCBtdXNiX21vZGUpOworCQlEQkcoMiwgIlRyeWluZyB0byBzZXQgbW9kZSAlaVxuIiwgbXVzYl9tb2RlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJbXVzYl93cml0ZWwodGJhc2UsIFRVU0JfUEhZX09UR19DVFJMLApAQCAtNjU1LDYgKzY1Niw4IEBACiAJCSEob3RnX3N0YXQgJiBUVVNCX0RFVl9PVEdfU1RBVF9JRF9TVEFUVVMpKQogCQkJSU5GTygiQ2Fubm90IGJlIHBlcmlwaGVyYWwgd2l0aCBtaW5pLUEgY2FibGUgIgogCQkJIm90Z19zdGF0OiAlMDh4XG4iLCBvdGdfc3RhdCk7CisKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9vdGcvS2NvbmZpZyBiL2RyaXZlcnMvdXNiL290Zy9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlOGRiZGIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3VzYi9vdGcvS2NvbmZpZwpAQCAtMCwwICsxLDU0IEBACisjCisjIFVTQiBPVEcgaW5mcmFzdHJ1Y3R1cmUgbWF5IGJlIG5lZWRlZCBmb3IgcGVyaXBoZXJhbC1vbmx5LCBob3N0LW9ubHksCisjIG9yIE9URy1jYXBhYmxlIGNvbmZpZ3VyYXRpb25zIHdoZW4gT1RHIHRyYW5zY2VpdmVycyBvciBjb250cm9sbGVycworIyBhcmUgdXNlZC4KKyMKKworY29tbWVudCAiT1RHIGFuZCByZWxhdGVkIGluZnJhc3RydWN0dXJlIgorCitpZiBVU0IgfHwgVVNCX0dBREdFVAorCitjb25maWcgVVNCX09UR19VVElMUworCWJvb2wKKwloZWxwCisJICBTZWxlY3QgdGhpcyB0byBtYWtlIHN1cmUgdGhlIGJ1aWxkIGluY2x1ZGVzIG9iamVjdHMgZnJvbQorCSAgdGhlIE9URyBpbmZyYXN0cnVjdHVyZSBkaXJlY3RvcnkuCisKKyMKKyMgVVNCIFRyYW5zY2VpdmVyIERyaXZlcnMKKyMKK2NvbmZpZyBVU0JfR1BJT19WQlVTCisJdHJpc3RhdGUgIkdQSU8gYmFzZWQgcGVyaXBoZXJhbC1vbmx5IFZCVVMgc2Vuc2luZyAndHJhbnNjZWl2ZXInIgorCWRlcGVuZHMgb24gR0VORVJJQ19HUElPCisJc2VsZWN0IFVTQl9PVEdfVVRJTFMKKwloZWxwCisJICBQcm92aWRlcyBzaW1wbGUgR1BJTyBWQlVTIHNlbnNpbmcgZm9yIGNvbnRyb2xsZXJzIHdpdGggYW4KKwkgIGludGVybmFsIHRyYW5zY2VpdmVyIHZpYSB0aGUgb3RnX3RyYW5zY2VpdmVyIGludGVyZmFjZSwgYW5kCisJICBvcHRpb25hbGx5IGNvbnRyb2wgb2YgYSBEKyBwdWxsdXAgR1BJTyBhcyB3ZWxsIGFzIGEgVkJVUworCSAgY3VycmVudCBsaW1pdCByZWd1bGF0b3IuCisKK2NvbmZpZyBJU1AxMzAxX09NQVAKKwl0cmlzdGF0ZSAiUGhpbGlwcyBJU1AxMzAxIHdpdGggT01BUCBPVEciCisJZGVwZW5kcyBvbiBJMkMgJiYgQVJDSF9PTUFQX09URworCXNlbGVjdCBVU0JfT1RHX1VUSUxTCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZSBQaGlsaXBzIElTUDEzMDEKKwkgIFVTQi1Pbi1UaGUtR28gdHJhbnNjZWl2ZXIgd29ya2luZyB3aXRoIHRoZSBPTUFQIE9URyBjb250cm9sbGVyLgorCSAgVGhlIElTUDEzMDEgaXMgYSBmdWxsIHNwZWVkIFVTQiAgdHJhbnNjZWl2ZXIgd2hpY2ggaXMgdXNlZCBpbgorCSAgcHJvZHVjdHMgaW5jbHVkaW5nIEgyLCBIMywgYW5kIEg0IGRldmVsb3BtZW50IGJvYXJkcyBmb3IgVGV4YXMKKwkgIEluc3RydW1lbnRzIE9NQVAgcHJvY2Vzc29ycy4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgaXNwMTMwMV9vbWFwLgorCitjb25maWcgVFdMNDAzMF9VU0IKKwl0cmlzdGF0ZSAiVFdMNDAzMCBVU0IgVHJhbnNjZWl2ZXIgRHJpdmVyIgorCWRlcGVuZHMgb24gVFdMNDAzMF9DT1JFCisJc2VsZWN0IFVTQl9PVEdfVVRJTFMKKwloZWxwCisJICBFbmFibGUgdGhpcyB0byBzdXBwb3J0IHRoZSBVU0IgT1RHIHRyYW5zY2VpdmVyIG9uIFRXTDQwMzAKKwkgIGZhbWlseSBjaGlwcyAoaW5jbHVkaW5nIHRoZSBUV0w1MDMwIGFuZCBUUFM2NTl4MCBkZXZpY2VzKS4KKwkgIFRoaXMgdHJhbnNjZWl2ZXIgc3VwcG9ydHMgaGlnaCBhbmQgZnVsbCBzcGVlZCBkZXZpY2VzIHBsdXMsCisJICBpbiBob3N0IG1vZGUsIGxvdyBzcGVlZC4KKworZW5kaWYgIyBVU0IgfHwgT1RHCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9vdGcvTWFrZWZpbGUgYi9kcml2ZXJzL3VzYi9vdGcvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDczYzdjZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNiL290Zy9NYWtlZmlsZQpAQCAtMCwwICsxLDE1IEBACisjCisjIE9URyBpbmZyYXN0cnVjdHVyZSBhbmQgdHJhbnNjZWl2ZXIgZHJpdmVycworIworCisjIGluZnJhc3RydWN0dXJlCitvYmotJChDT05GSUdfVVNCX09UR19VVElMUykJKz0gb3RnLm8KKworIyB0cmFuc2NlaXZlciBkcml2ZXJzCitvYmotJChDT05GSUdfVVNCX0dQSU9fVkJVUykJKz0gZ3Bpb192YnVzLm8KK29iai0kKENPTkZJR19JU1AxMzAxX09NQVApCSs9IGlzcDEzMDFfb21hcC5vCitvYmotJChDT05GSUdfVFdMNDAzMF9VU0IpCSs9IHR3bDQwMzAtdXNiLm8KKworY2NmbGFncy0kKENPTkZJR19VU0JfREVCVUcpCSs9IC1EREVCVUcKK2NjZmxhZ3MtJChDT05GSUdfVVNCX0dBREdFVF9ERUJVRykgKz0gLURERUJVRworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9vdGcvZ3Bpb192YnVzLmMgYi9kcml2ZXJzL3VzYi9vdGcvZ3Bpb192YnVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjNhNjAzNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNiL290Zy9ncGlvX3ZidXMuYwpAQCAtMCwwICsxLDMzNSBAQAorLyoKKyAqIGdwaW8tdmJ1cy5jIC0gc2ltcGxlIEdQSU8gVkJVUyBzZW5zaW5nIGRyaXZlciBmb3IgQiBwZXJpcGhlcmFsIGRldmljZXMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggUGhpbGlwcCBaYWJlbCA8cGhpbGlwcC56YWJlbEBnbWFpbC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorCisjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2NvbnN1bWVyLmg+CisKKyNpbmNsdWRlIDxsaW51eC91c2IvZ2FkZ2V0Lmg+CisjaW5jbHVkZSA8bGludXgvdXNiL2dwaW9fdmJ1cy5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi9vdGcuaD4KKworCisvKgorICogQSBzaW1wbGUgR1BJTyBWQlVTIHNlbnNpbmcgZHJpdmVyIGZvciBCIHBlcmlwaGVyYWwgb25seSBkZXZpY2VzCisgKiB3aXRoIGludGVybmFsIHRyYW5zY2VpdmVycy4gSXQgY2FuIGNvbnRyb2wgYSBEKyBwdWxsdXAgR1BJTyBhbmQKKyAqIGEgcmVndWxhdG9yIHRvIGxpbWl0IHRoZSBjdXJyZW50IGRyYXduIGZyb20gVkJVUy4KKyAqCisgKiBOZWVkcyB0byBiZSBsb2FkZWQgYmVmb3JlIHRoZSBVREMgZHJpdmVyIHRoYXQgd2lsbCB1c2UgaXQuCisgKi8KK3N0cnVjdCBncGlvX3ZidXNfZGF0YSB7CisJc3RydWN0IG90Z190cmFuc2NlaXZlciBvdGc7CisJc3RydWN0IGRldmljZSAgICAgICAgICAqZGV2OworCXN0cnVjdCByZWd1bGF0b3IgICAgICAgKnZidXNfZHJhdzsKKwlpbnQJCQl2YnVzX2RyYXdfZW5hYmxlZDsKKwl1bnNpZ25lZAkJbUE7Cit9OworCisKKy8qCisgKiBUaGlzIGRyaXZlciByZWxpZXMgb24gImJvdGggZWRnZXMiIHRyaWdnZXJpbmcuICBWQlVTIGhhcyAxMDAgbXNlYyB0bworICogc3RhYmlsaXplLCBzbyB0aGUgcGVyaXBoZXJhbCBjb250cm9sbGVyIGRyaXZlciBtYXkgbmVlZCB0byBjb3BlIHdpdGgKKyAqIHNvbWUgYm91bmNpbmcgZHVlIHRvIGN1cnJlbnQgc3VyZ2VzIChlLmcuIGNoYXJnaW5nIGxvY2FsIGNhcGFjaXRhbmNlKQorICogYW5kIGNvbnRhY3QgY2hhdHRlci4KKyAqCisgKiBSRVZJU0lUIGluIGRlc3BlcmF0ZSBzdHJhaXRzLCB0b2dnbGluZyBiZXR3ZWVuIHJpc2luZyBhbmQgZmFsbGluZworICogZWRnZXMgbWlnaHQgYmUgd29ya2FibGUuCisgKi8KKyNkZWZpbmUgVkJVU19JUlFfRkxBR1MgXAorCSggSVJRRl9TQU1QTEVfUkFORE9NIHwgSVJRRl9TSEFSRUQgXAorCXwgSVJRRl9UUklHR0VSX1JJU0lORyB8IElSUUZfVFJJR0dFUl9GQUxMSU5HICkKKworCisvKiBpbnRlcmZhY2UgdG8gcmVndWxhdG9yIGZyYW1ld29yayAqLworc3RhdGljIHZvaWQgc2V0X3ZidXNfZHJhdyhzdHJ1Y3QgZ3Bpb192YnVzX2RhdGEgKmdwaW9fdmJ1cywgdW5zaWduZWQgbUEpCit7CisJc3RydWN0IHJlZ3VsYXRvciAqdmJ1c19kcmF3ID0gZ3Bpb192YnVzLT52YnVzX2RyYXc7CisJaW50IGVuYWJsZWQ7CisKKwlpZiAoIXZidXNfZHJhdykKKwkJcmV0dXJuOworCisJZW5hYmxlZCA9IGdwaW9fdmJ1cy0+dmJ1c19kcmF3X2VuYWJsZWQ7CisJaWYgKG1BKSB7CisJCXJlZ3VsYXRvcl9zZXRfY3VycmVudF9saW1pdCh2YnVzX2RyYXcsIDAsIDEwMDAgKiBtQSk7CisJCWlmICghZW5hYmxlZCkgeworCQkJcmVndWxhdG9yX2VuYWJsZSh2YnVzX2RyYXcpOworCQkJZ3Bpb192YnVzLT52YnVzX2RyYXdfZW5hYmxlZCA9IDE7CisJCX0KKwl9IGVsc2UgeworCQlpZiAoZW5hYmxlZCkgeworCQkJcmVndWxhdG9yX2Rpc2FibGUodmJ1c19kcmF3KTsKKwkJCWdwaW9fdmJ1cy0+dmJ1c19kcmF3X2VuYWJsZWQgPSAwOworCQl9CisJfQorCWdwaW9fdmJ1cy0+bUEgPSBtQTsKK30KKworLyogVkJVUyBjaGFuZ2UgSVJRIGhhbmRsZXIgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBncGlvX3ZidXNfaXJxKGludCBpcnEsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IGRhdGE7CisJc3RydWN0IGdwaW9fdmJ1c19tYWNoX2luZm8gKnBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJc3RydWN0IGdwaW9fdmJ1c19kYXRhICpncGlvX3ZidXMgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlpbnQgZ3BpbywgdmJ1czsKKworCXZidXMgPSBncGlvX2dldF92YWx1ZShwZGF0YS0+Z3Bpb192YnVzKTsKKwlpZiAocGRhdGEtPmdwaW9fdmJ1c19pbnZlcnRlZCkKKwkJdmJ1cyA9ICF2YnVzOworCisJZGV2X2RiZygmcGRldi0+ZGV2LCAiVkJVUyAlcyAoZ2FkZ2V0OiAlcylcbiIsCisJCXZidXMgPyAic3VwcGxpZWQiIDogImluYWN0aXZlIiwKKwkJZ3Bpb192YnVzLT5vdGcuZ2FkZ2V0ID8gZ3Bpb192YnVzLT5vdGcuZ2FkZ2V0LT5uYW1lIDogIm5vbmUiKTsKKworCWlmICghZ3Bpb192YnVzLT5vdGcuZ2FkZ2V0KQorCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisKKwkvKiBQZXJpcGhlcmFsIGNvbnRyb2xsZXJzIHdoaWNoIG1hbmFnZSB0aGUgcHVsbHVwIHRoZW1zZWx2ZXMgd29uJ3QgaGF2ZQorCSAqIGdwaW9fcHVsbHVwIGNvbmZpZ3VyZWQgaGVyZS4gIElmIGl0J3MgY29uZmlndXJlZCBoZXJlLCB3ZSdsbCBkbyB3aGF0CisJICogaXNwMTMwMV9vbWFwOjpiX3BlcmlwaGVyYWwoKSBkb2VzIGFuZCBlbmFibGUgdGhlIHB1bGx1cCBoZXJlLi4uIGFsdGhvdWdoCisJICogdGhhdCBtYXkgY29tcGxpY2F0ZSB1c2JfZ2FkZ2V0X3ssZGlzfWNvbm5lY3QoKSBzdXBwb3J0LgorCSAqLworCWdwaW8gPSBwZGF0YS0+Z3Bpb19wdWxsdXA7CisJaWYgKHZidXMpIHsKKwkJZ3Bpb192YnVzLT5vdGcuc3RhdGUgPSBPVEdfU1RBVEVfQl9QRVJJUEhFUkFMOworCQl1c2JfZ2FkZ2V0X3ZidXNfY29ubmVjdChncGlvX3ZidXMtPm90Zy5nYWRnZXQpOworCisJCS8qIGRyYXdpbmcgYSAidW5pdCBsb2FkIiBpcyAqYWx3YXlzKiBPSywgZXhjZXB0IGZvciBPVEcgKi8KKwkJc2V0X3ZidXNfZHJhdyhncGlvX3ZidXMsIDEwMCk7CisKKwkJLyogb3B0aW9uYWxseSBlbmFibGUgRCsgcHVsbHVwICovCisJCWlmIChncGlvX2lzX3ZhbGlkKGdwaW8pKQorCQkJZ3Bpb19zZXRfdmFsdWUoZ3BpbywgIXBkYXRhLT5ncGlvX3B1bGx1cF9pbnZlcnRlZCk7CisJfSBlbHNlIHsKKwkJLyogb3B0aW9uYWxseSBkaXNhYmxlIEQrIHB1bGx1cCAqLworCQlpZiAoZ3Bpb19pc192YWxpZChncGlvKSkKKwkJCWdwaW9fc2V0X3ZhbHVlKGdwaW8sIHBkYXRhLT5ncGlvX3B1bGx1cF9pbnZlcnRlZCk7CisKKwkJc2V0X3ZidXNfZHJhdyhncGlvX3ZidXMsIDApOworCisJCXVzYl9nYWRnZXRfdmJ1c19kaXNjb25uZWN0KGdwaW9fdmJ1cy0+b3RnLmdhZGdldCk7CisJCWdwaW9fdmJ1cy0+b3RnLnN0YXRlID0gT1RHX1NUQVRFX0JfSURMRTsKKwl9CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qIE9URyB0cmFuc2NlaXZlciBpbnRlcmZhY2UgKi8KKworLyogYmluZC91bmJpbmQgdGhlIHBlcmlwaGVyYWwgY29udHJvbGxlciAqLworc3RhdGljIGludCBncGlvX3ZidXNfc2V0X3BlcmlwaGVyYWwoc3RydWN0IG90Z190cmFuc2NlaXZlciAqb3RnLAorCQkJCXN0cnVjdCB1c2JfZ2FkZ2V0ICpnYWRnZXQpCit7CisJc3RydWN0IGdwaW9fdmJ1c19kYXRhICpncGlvX3ZidXM7CisJc3RydWN0IGdwaW9fdmJ1c19tYWNoX2luZm8gKnBkYXRhOworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7CisJaW50IGdwaW8sIGlycTsKKworCWdwaW9fdmJ1cyA9IGNvbnRhaW5lcl9vZihvdGcsIHN0cnVjdCBncGlvX3ZidXNfZGF0YSwgb3RnKTsKKwlwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGdwaW9fdmJ1cy0+ZGV2KTsKKwlwZGF0YSA9IGdwaW9fdmJ1cy0+ZGV2LT5wbGF0Zm9ybV9kYXRhOworCWlycSA9IGdwaW9fdG9faXJxKHBkYXRhLT5ncGlvX3ZidXMpOworCWdwaW8gPSBwZGF0YS0+Z3Bpb19wdWxsdXA7CisKKwlpZiAoIWdhZGdldCkgeworCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJ1bnJlZ2lzdGVyaW5nIGdhZGdldCAnJXMnXG4iLAorCQkJb3RnLT5nYWRnZXQtPm5hbWUpOworCisJCS8qIG9wdGlvbmFsbHkgZGlzYWJsZSBEKyBwdWxsdXAgKi8KKwkJaWYgKGdwaW9faXNfdmFsaWQoZ3BpbykpCisJCQlncGlvX3NldF92YWx1ZShncGlvLCBwZGF0YS0+Z3Bpb19wdWxsdXBfaW52ZXJ0ZWQpOworCisJCXNldF92YnVzX2RyYXcoZ3Bpb192YnVzLCAwKTsKKworCQl1c2JfZ2FkZ2V0X3ZidXNfZGlzY29ubmVjdChvdGctPmdhZGdldCk7CisJCW90Zy0+c3RhdGUgPSBPVEdfU1RBVEVfVU5ERUZJTkVEOworCisJCW90Zy0+Z2FkZ2V0ID0gTlVMTDsKKwkJcmV0dXJuIDA7CisJfQorCisJb3RnLT5nYWRnZXQgPSBnYWRnZXQ7CisJZGV2X2RiZygmcGRldi0+ZGV2LCAicmVnaXN0ZXJlZCBnYWRnZXQgJyVzJ1xuIiwgZ2FkZ2V0LT5uYW1lKTsKKworCS8qIGluaXRpYWxpemUgY29ubmVjdGlvbiBzdGF0ZSAqLworCWdwaW9fdmJ1c19pcnEoaXJxLCBwZGV2KTsKKwlyZXR1cm4gMDsKK30KKworLyogZWZmZWN0aXZlIGZvciBCIGRldmljZXMsIGlnbm9yZWQgZm9yIEEtcGVyaXBoZXJhbCAqLworc3RhdGljIGludCBncGlvX3ZidXNfc2V0X3Bvd2VyKHN0cnVjdCBvdGdfdHJhbnNjZWl2ZXIgKm90ZywgdW5zaWduZWQgbUEpCit7CisJc3RydWN0IGdwaW9fdmJ1c19kYXRhICpncGlvX3ZidXM7CisKKwlncGlvX3ZidXMgPSBjb250YWluZXJfb2Yob3RnLCBzdHJ1Y3QgZ3Bpb192YnVzX2RhdGEsIG90Zyk7CisKKwlpZiAob3RnLT5zdGF0ZSA9PSBPVEdfU1RBVEVfQl9QRVJJUEhFUkFMKQorCQlzZXRfdmJ1c19kcmF3KGdwaW9fdmJ1cywgbUEpOworCXJldHVybiAwOworfQorCisvKiBmb3Igbm9uLU9URyBCIGRldmljZXM6IHNldC9jbGVhciB0cmFuc2NlaXZlciBzdXNwZW5kIG1vZGUgKi8KK3N0YXRpYyBpbnQgZ3Bpb192YnVzX3NldF9zdXNwZW5kKHN0cnVjdCBvdGdfdHJhbnNjZWl2ZXIgKm90ZywgaW50IHN1c3BlbmQpCit7CisJc3RydWN0IGdwaW9fdmJ1c19kYXRhICpncGlvX3ZidXM7CisKKwlncGlvX3ZidXMgPSBjb250YWluZXJfb2Yob3RnLCBzdHJ1Y3QgZ3Bpb192YnVzX2RhdGEsIG90Zyk7CisKKwkvKiBkcmF3IG1heCAwIG1BIGZyb20gdmJ1cyBpbiBzdXNwZW5kIG1vZGU7IG9yIHRoZSBwcmV2aW91c2x5CisJICogcmVjb3JkZWQgYW1vdW50IG9mIGN1cnJlbnQgaWYgbm90IHN1c3BlbmRlZAorCSAqCisJICogTk9URTogaGlnaCBwb3dlcmVkIGNvbmZpZ3MgKG1BID4gMTAwKSBtYXkgZHJhdyB1cCB0byAyLjUgbUEKKwkgKiBpZiB0aGV5J3JlIHdha2UtZW5hYmxlZCAuLi4gd2UgZG9uJ3QgaGFuZGxlIHRoYXQgeWV0LgorCSAqLworCXJldHVybiBncGlvX3ZidXNfc2V0X3Bvd2VyKG90Zywgc3VzcGVuZCA/IDAgOiBncGlvX3ZidXMtPm1BKTsKK30KKworLyogcGxhdGZvcm0gZHJpdmVyIGludGVyZmFjZSAqLworCitzdGF0aWMgaW50IF9faW5pdCBncGlvX3ZidXNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgZ3Bpb192YnVzX21hY2hfaW5mbyAqcGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlzdHJ1Y3QgZ3Bpb192YnVzX2RhdGEgKmdwaW9fdmJ1czsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwlpbnQgZXJyLCBncGlvLCBpcnE7CisKKwlpZiAoIXBkYXRhIHx8ICFncGlvX2lzX3ZhbGlkKHBkYXRhLT5ncGlvX3ZidXMpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlncGlvID0gcGRhdGEtPmdwaW9fdmJ1czsKKworCWdwaW9fdmJ1cyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBncGlvX3ZidXNfZGF0YSksIEdGUF9LRVJORUwpOworCWlmICghZ3Bpb192YnVzKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGdwaW9fdmJ1cyk7CisJZ3Bpb192YnVzLT5kZXYgPSAmcGRldi0+ZGV2OworCWdwaW9fdmJ1cy0+b3RnLmxhYmVsID0gImdwaW8tdmJ1cyI7CisJZ3Bpb192YnVzLT5vdGcuc3RhdGUgPSBPVEdfU1RBVEVfVU5ERUZJTkVEOworCWdwaW9fdmJ1cy0+b3RnLnNldF9wZXJpcGhlcmFsID0gZ3Bpb192YnVzX3NldF9wZXJpcGhlcmFsOworCWdwaW9fdmJ1cy0+b3RnLnNldF9wb3dlciA9IGdwaW9fdmJ1c19zZXRfcG93ZXI7CisJZ3Bpb192YnVzLT5vdGcuc2V0X3N1c3BlbmQgPSBncGlvX3ZidXNfc2V0X3N1c3BlbmQ7CisKKwllcnIgPSBncGlvX3JlcXVlc3QoZ3BpbywgInZidXNfZGV0ZWN0Iik7CisJaWYgKGVycikgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjYW4ndCByZXF1ZXN0IHZidXMgZ3BpbyAlZCwgZXJyOiAlZFxuIiwKKwkJCWdwaW8sIGVycik7CisJCWdvdG8gZXJyX2dwaW87CisJfQorCWdwaW9fZGlyZWN0aW9uX2lucHV0KGdwaW8pOworCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfSVJRLCAwKTsKKwlpZiAocmVzKSB7CisJCWlycSA9IHJlcy0+c3RhcnQ7CisJCXJlcy0+ZmxhZ3MgJj0gSVJRRl9UUklHR0VSX01BU0s7CisJCXJlcy0+ZmxhZ3MgfD0gSVJRRl9TQU1QTEVfUkFORE9NIHwgSVJRRl9TSEFSRUQ7CisJfSBlbHNlCisJCWlycSA9IGdwaW9fdG9faXJxKGdwaW8pOworCisJLyogaWYgZGF0YSBsaW5lIHB1bGx1cCBpcyBpbiB1c2UsIGluaXRpYWxpemUgaXQgdG8gIm5vdCBwdWxsaW5nIHVwIiAqLworCWdwaW8gPSBwZGF0YS0+Z3Bpb19wdWxsdXA7CisJaWYgKGdwaW9faXNfdmFsaWQoZ3BpbykpIHsKKwkJZXJyID0gZ3Bpb19yZXF1ZXN0KGdwaW8sICJ1ZGNfcHVsbHVwIik7CisJCWlmIChlcnIpIHsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwKKwkJCQkiY2FuJ3QgcmVxdWVzdCBwdWxsdXAgZ3BpbyAlZCwgZXJyOiAlZFxuIiwKKwkJCQlncGlvLCBlcnIpOworCQkJZ3Bpb19mcmVlKHBkYXRhLT5ncGlvX3ZidXMpOworCQkJZ290byBlcnJfZ3BpbzsKKwkJfQorCQlncGlvX2RpcmVjdGlvbl9vdXRwdXQoZ3BpbywgcGRhdGEtPmdwaW9fcHVsbHVwX2ludmVydGVkKTsKKwl9CisKKwllcnIgPSByZXF1ZXN0X2lycShpcnEsIGdwaW9fdmJ1c19pcnEsIFZCVVNfSVJRX0ZMQUdTLAorCQkidmJ1c19kZXRlY3QiLCBwZGV2KTsKKwlpZiAoZXJyKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImNhbid0IHJlcXVlc3QgaXJxICVpLCBlcnI6ICVkXG4iLAorCQkJaXJxLCBlcnIpOworCQlnb3RvIGVycl9pcnE7CisJfQorCisJLyogb25seSBhY3RpdmUgd2hlbiBhIGdhZGdldCBpcyByZWdpc3RlcmVkICovCisJZXJyID0gb3RnX3NldF90cmFuc2NlaXZlcigmZ3Bpb192YnVzLT5vdGcpOworCWlmIChlcnIpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiY2FuJ3QgcmVnaXN0ZXIgdHJhbnNjZWl2ZXIsIGVycjogJWRcbiIsCisJCQllcnIpOworCQlnb3RvIGVycl9vdGc7CisJfQorCisJZ3Bpb192YnVzLT52YnVzX2RyYXcgPSByZWd1bGF0b3JfZ2V0KCZwZGV2LT5kZXYsICJ2YnVzX2RyYXciKTsKKwlpZiAoSVNfRVJSKGdwaW9fdmJ1cy0+dmJ1c19kcmF3KSkgeworCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJjYW4ndCBnZXQgdmJ1c19kcmF3IHJlZ3VsYXRvciwgZXJyOiAlbGRcbiIsCisJCQlQVFJfRVJSKGdwaW9fdmJ1cy0+dmJ1c19kcmF3KSk7CisJCWdwaW9fdmJ1cy0+dmJ1c19kcmF3ID0gTlVMTDsKKwl9CisKKwlyZXR1cm4gMDsKK2Vycl9vdGc6CisJZnJlZV9pcnEoaXJxLCAmcGRldi0+ZGV2KTsKK2Vycl9pcnE6CisJaWYgKGdwaW9faXNfdmFsaWQocGRhdGEtPmdwaW9fcHVsbHVwKSkKKwkJZ3Bpb19mcmVlKHBkYXRhLT5ncGlvX3B1bGx1cCk7CisJZ3Bpb19mcmVlKHBkYXRhLT5ncGlvX3ZidXMpOworZXJyX2dwaW86CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisJa2ZyZWUoZ3Bpb192YnVzKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IF9fZXhpdCBncGlvX3ZidXNfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGdwaW9fdmJ1c19kYXRhICpncGlvX3ZidXMgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgZ3Bpb192YnVzX21hY2hfaW5mbyAqcGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlpbnQgZ3BpbyA9IHBkYXRhLT5ncGlvX3ZidXM7CisKKwlyZWd1bGF0b3JfcHV0KGdwaW9fdmJ1cy0+dmJ1c19kcmF3KTsKKworCW90Z19zZXRfdHJhbnNjZWl2ZXIoTlVMTCk7CisKKwlmcmVlX2lycShncGlvX3RvX2lycShncGlvKSwgJnBkZXYtPmRldik7CisJaWYgKGdwaW9faXNfdmFsaWQocGRhdGEtPmdwaW9fcHVsbHVwKSkKKwkJZ3Bpb19mcmVlKHBkYXRhLT5ncGlvX3B1bGx1cCk7CisJZ3Bpb19mcmVlKGdwaW8pOworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCWtmcmVlKGdwaW9fdmJ1cyk7CisKKwlyZXR1cm4gMDsKK30KKworLyogTk9URTogIHRoZSBncGlvLXZidXMgZGV2aWNlIG1heSAqTk9UKiBiZSBob3RwbHVnZ2VkICovCisKK01PRFVMRV9BTElBUygicGxhdGZvcm06Z3Bpby12YnVzIik7CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGdwaW9fdmJ1c19kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgID0gImdwaW8tdmJ1cyIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCX0sCisJLnJlbW92ZSAgPSBfX2V4aXRfcChncGlvX3ZidXNfcmVtb3ZlKSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGdwaW9fdmJ1c19pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9wcm9iZSgmZ3Bpb192YnVzX2RyaXZlciwgZ3Bpb192YnVzX3Byb2JlKTsKK30KK21vZHVsZV9pbml0KGdwaW9fdmJ1c19pbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IGdwaW9fdmJ1c19leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmdwaW9fdmJ1c19kcml2ZXIpOworfQorbW9kdWxlX2V4aXQoZ3Bpb192YnVzX2V4aXQpOworCitNT0RVTEVfREVTQ1JJUFRJT04oInNpbXBsZSBHUElPIGNvbnRyb2xsZWQgT1RHIHRyYW5zY2VpdmVyIGRyaXZlciIpOworTU9EVUxFX0FVVEhPUigiUGhpbGlwcCBaYWJlbCIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvY2hpcHMvaXNwMTMwMV9vbWFwLmMgYi9kcml2ZXJzL3VzYi9vdGcvaXNwMTMwMV9vbWFwLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvaTJjL2NoaXBzL2lzcDEzMDFfb21hcC5jCnJlbmFtZSB0byBkcml2ZXJzL3VzYi9vdGcvaXNwMTMwMV9vbWFwLmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL290Zy9vdGcuYyBiL2RyaXZlcnMvdXNiL290Zy9vdGcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjMxOGZhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2Ivb3RnL290Zy5jCkBAIC0wLDAgKzEsNjUgQEAKKy8qCisgKiBvdGcuYyAtLSBVU0IgT1RHIHV0aWxpdHkgY29kZQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNCBUZXhhcyBJbnN0cnVtZW50cworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorCisjaW5jbHVkZSA8bGludXgvdXNiL290Zy5oPgorCitzdGF0aWMgc3RydWN0IG90Z190cmFuc2NlaXZlciAqeGNlaXY7CisKKy8qKgorICogb3RnX2dldF90cmFuc2NlaXZlciAtIGZpbmQgdGhlIChzaW5nbGUpIE9URyB0cmFuc2NlaXZlcgorICoKKyAqIFJldHVybnMgdGhlIHRyYW5zY2VpdmVyIGRyaXZlciwgYWZ0ZXIgZ2V0dGluZyBhIHJlZmNvdW50IHRvIGl0OyBvcgorICogbnVsbCBpZiB0aGVyZSBpcyBubyBzdWNoIHRyYW5zY2VpdmVyLiAgVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IKKyAqIGNhbGxpbmcgb3RnX3B1dF90cmFuc2NlaXZlcigpIHRvIHJlbGVhc2UgdGhhdCBjb3VudC4KKyAqCisgKiBGb3IgdXNlIGJ5IFVTQiBob3N0IGFuZCBwZXJpcGhlcmFsIGRyaXZlcnMuCisgKi8KK3N0cnVjdCBvdGdfdHJhbnNjZWl2ZXIgKm90Z19nZXRfdHJhbnNjZWl2ZXIodm9pZCkKK3sKKwlpZiAoeGNlaXYpCisJCWdldF9kZXZpY2UoeGNlaXYtPmRldik7CisJcmV0dXJuIHhjZWl2OworfQorRVhQT1JUX1NZTUJPTChvdGdfZ2V0X3RyYW5zY2VpdmVyKTsKKworLyoqCisgKiBvdGdfcHV0X3RyYW5zY2VpdmVyIC0gcmVsZWFzZSB0aGUgKHNpbmdsZSkgT1RHIHRyYW5zY2VpdmVyCisgKiBAeDogdGhlIHRyYW5zY2VpdmVyIHJldHVybmVkIGJ5IG90Z19nZXRfdHJhbnNjZWl2ZXIoKQorICoKKyAqIFJlbGVhc2VzIGEgcmVmY291bnQgdGhlIGNhbGxlciByZWNlaXZlZCBmcm9tIG90Z19nZXRfdHJhbnNjZWl2ZXIoKS4KKyAqCisgKiBGb3IgdXNlIGJ5IFVTQiBob3N0IGFuZCBwZXJpcGhlcmFsIGRyaXZlcnMuCisgKi8KK3ZvaWQgb3RnX3B1dF90cmFuc2NlaXZlcihzdHJ1Y3Qgb3RnX3RyYW5zY2VpdmVyICp4KQoreworCXB1dF9kZXZpY2UoeC0+ZGV2KTsKK30KK0VYUE9SVF9TWU1CT0wob3RnX3B1dF90cmFuc2NlaXZlcik7CisKKy8qKgorICogb3RnX3NldF90cmFuc2NlaXZlciAtIGRlY2xhcmUgdGhlIChzaW5nbGUpIE9URyB0cmFuc2NlaXZlcgorICogQHg6IHRoZSBVU0IgT1RHIHRyYW5zY2VpdmVyIHRvIGJlIHVzZWQ7IG9yIE5VTEwKKyAqCisgKiBUaGlzIGNhbGwgaXMgZXhjbHVzaXZlbHkgZm9yIHVzZSBieSB0cmFuc2NlaXZlciBkcml2ZXJzLCB3aGljaAorICogY29vcmRpbmF0ZSB0aGUgYWN0aXZpdGllcyBvZiBkcml2ZXJzIGZvciBob3N0IGFuZCBwZXJpcGhlcmFsCisgKiBjb250cm9sbGVycywgYW5kIGluIHNvbWUgY2FzZXMgZm9yIFZCVVMgY3VycmVudCByZWd1bGF0aW9uLgorICovCitpbnQgb3RnX3NldF90cmFuc2NlaXZlcihzdHJ1Y3Qgb3RnX3RyYW5zY2VpdmVyICp4KQoreworCWlmICh4Y2VpdiAmJiB4KQorCQlyZXR1cm4gLUVCVVNZOworCXhjZWl2ID0geDsKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0wob3RnX3NldF90cmFuc2NlaXZlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9vdGcvdHdsNDAzMC11c2IuYyBiL2RyaXZlcnMvdXNiL290Zy90d2w0MDMwLXVzYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxNmU0NDEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3VzYi9vdGcvdHdsNDAzMC11c2IuYwpAQCAtMCwwICsxLDcyMSBAQAorLyoKKyAqIHR3bDQwMzBfdXNiIC0gVFdMNDAzMCBVU0IgdHJhbnNjZWl2ZXIsIHRhbGtpbmcgdG8gT01BUCBPVEcgY29udHJvbGxlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA3IFRleGFzIEluc3RydW1lbnRzCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggTm9raWEgQ29ycG9yYXRpb24KKyAqIENvbnRhY3Q6IEZlbGlwZSBCYWxiaSA8ZmVsaXBlLmJhbGJpQG5va2lhLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqCisgKiBDdXJyZW50IHN0YXR1czoKKyAqCS0gSFMgVVNCIFVMUEkgbW9kZSB3b3Jrcy4KKyAqCS0gMy1waW4gbW9kZSBzdXBwb3J0IG1heSBiZSBhZGRlZCBpbiBmdXR1cmUuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC91c2Ivb3RnLmg+CisjaW5jbHVkZSA8bGludXgvaTJjL3R3bDQwMzAuaD4KKworCisvKiBSZWdpc3RlciBkZWZpbmVzICovCisKKyNkZWZpbmUgVkVORE9SX0lEX0xPCQkJMHgwMAorI2RlZmluZSBWRU5ET1JfSURfSEkJCQkweDAxCisjZGVmaW5lIFBST0RVQ1RfSURfTE8JCQkweDAyCisjZGVmaW5lIFBST0RVQ1RfSURfSEkJCQkweDAzCisKKyNkZWZpbmUgRlVOQ19DVFJMCQkJMHgwNAorI2RlZmluZSBGVU5DX0NUUkxfU0VUCQkJMHgwNQorI2RlZmluZSBGVU5DX0NUUkxfQ0xSCQkJMHgwNgorI2RlZmluZSBGVU5DX0NUUkxfU1VTUEVORE0JCSgxIDw8IDYpCisjZGVmaW5lIEZVTkNfQ1RSTF9SRVNFVAkJCSgxIDw8IDUpCisjZGVmaW5lIEZVTkNfQ1RSTF9PUE1PREVfTUFTSwkJKDMgPDwgMykgLyogYml0cyAzIGFuZCA0ICovCisjZGVmaW5lIEZVTkNfQ1RSTF9PUE1PREVfTk9STUFMCQkoMCA8PCAzKQorI2RlZmluZSBGVU5DX0NUUkxfT1BNT0RFX05PTkRSSVZJTkcJKDEgPDwgMykKKyNkZWZpbmUgRlVOQ19DVFJMX09QTU9ERV9ESVNBQkxFX0JJVF9OUlpJCSgyIDw8IDMpCisjZGVmaW5lIEZVTkNfQ1RSTF9URVJNU0VMRUNUCQkoMSA8PCAyKQorI2RlZmluZSBGVU5DX0NUUkxfWENWUlNFTEVDVF9NQVNLCSgzIDw8IDApIC8qIGJpdHMgMCBhbmQgMSAqLworI2RlZmluZSBGVU5DX0NUUkxfWENWUlNFTEVDVF9IUwkJKDAgPDwgMCkKKyNkZWZpbmUgRlVOQ19DVFJMX1hDVlJTRUxFQ1RfRlMJCSgxIDw8IDApCisjZGVmaW5lIEZVTkNfQ1RSTF9YQ1ZSU0VMRUNUX0xTCQkoMiA8PCAwKQorI2RlZmluZSBGVU5DX0NUUkxfWENWUlNFTEVDVF9GUzRMUwkoMyA8PCAwKQorCisjZGVmaW5lIElGQ19DVFJMCQkJMHgwNworI2RlZmluZSBJRkNfQ1RSTF9TRVQJCQkweDA4CisjZGVmaW5lIElGQ19DVFJMX0NMUgkJCTB4MDkKKyNkZWZpbmUgSUZDX0NUUkxfSU5URVJGQUNFX1BST1RFQ1RfRElTQUJMRQkoMSA8PCA3KQorI2RlZmluZSBJRkNfQ1RSTF9BVVRPUkVTVU1FCQkoMSA8PCA0KQorI2RlZmluZSBJRkNfQ1RSTF9DTE9DS1NVU1BFTkRNCQkoMSA8PCAzKQorI2RlZmluZSBJRkNfQ1RSTF9DQVJLSVRNT0RFCQkoMSA8PCAyKQorI2RlZmluZSBJRkNfQ1RSTF9GU0xTU0VSSUFMTU9ERV8zUElOCSgxIDw8IDEpCisKKyNkZWZpbmUgVFdMNDAzMF9PVEdfQ1RSTAkJMHgwQQorI2RlZmluZSBUV0w0MDMwX09UR19DVFJMX1NFVAkJMHgwQgorI2RlZmluZSBUV0w0MDMwX09UR19DVFJMX0NMUgkJMHgwQworI2RlZmluZSBUV0w0MDMwX09UR19DVFJMX0RSVlZCVVMJKDEgPDwgNSkKKyNkZWZpbmUgVFdMNDAzMF9PVEdfQ1RSTF9DSFJHVkJVUwkoMSA8PCA0KQorI2RlZmluZSBUV0w0MDMwX09UR19DVFJMX0RJU0NIUkdWQlVTCSgxIDw8IDMpCisjZGVmaW5lIFRXTDQwMzBfT1RHX0NUUkxfRE1QVUxMRE9XTgkoMSA8PCAyKQorI2RlZmluZSBUV0w0MDMwX09UR19DVFJMX0RQUFVMTERPV04JKDEgPDwgMSkKKyNkZWZpbmUgVFdMNDAzMF9PVEdfQ1RSTF9JRFBVTExVUAkoMSA8PCAwKQorCisjZGVmaW5lIFVTQl9JTlRfRU5fUklTRQkJCTB4MEQKKyNkZWZpbmUgVVNCX0lOVF9FTl9SSVNFX1NFVAkJMHgwRQorI2RlZmluZSBVU0JfSU5UX0VOX1JJU0VfQ0xSCQkweDBGCisjZGVmaW5lIFVTQl9JTlRfRU5fRkFMTAkJCTB4MTAKKyNkZWZpbmUgVVNCX0lOVF9FTl9GQUxMX1NFVAkJMHgxMQorI2RlZmluZSBVU0JfSU5UX0VOX0ZBTExfQ0xSCQkweDEyCisjZGVmaW5lIFVTQl9JTlRfU1RTCQkJMHgxMworI2RlZmluZSBVU0JfSU5UX0xBVENICQkJMHgxNAorI2RlZmluZSBVU0JfSU5UX0lER05ECQkJKDEgPDwgNCkKKyNkZWZpbmUgVVNCX0lOVF9TRVNTRU5ECQkJKDEgPDwgMykKKyNkZWZpbmUgVVNCX0lOVF9TRVNTVkFMSUQJCSgxIDw8IDIpCisjZGVmaW5lIFVTQl9JTlRfVkJVU1ZBTElECQkoMSA8PCAxKQorI2RlZmluZSBVU0JfSU5UX0hPU1RESVNDT05ORUNUCQkoMSA8PCAwKQorCisjZGVmaW5lIENBUktJVF9DVFJMCQkJMHgxOQorI2RlZmluZSBDQVJLSVRfQ1RSTF9TRVQJCQkweDFBCisjZGVmaW5lIENBUktJVF9DVFJMX0NMUgkJCTB4MUIKKyNkZWZpbmUgQ0FSS0lUX0NUUkxfTUlDRU4JCSgxIDw8IDYpCisjZGVmaW5lIENBUktJVF9DVFJMX1NQS1JJR0hURU4JCSgxIDw8IDUpCisjZGVmaW5lIENBUktJVF9DVFJMX1NQS0xFRlRFTgkJKDEgPDwgNCkKKyNkZWZpbmUgQ0FSS0lUX0NUUkxfUlhERU4JCSgxIDw8IDMpCisjZGVmaW5lIENBUktJVF9DVFJMX1RYREVOCQkoMSA8PCAyKQorI2RlZmluZSBDQVJLSVRfQ1RSTF9JREdORERSVgkJKDEgPDwgMSkKKyNkZWZpbmUgQ0FSS0lUX0NUUkxfQ0FSS0lUUFdSCQkoMSA8PCAwKQorI2RlZmluZSBDQVJLSVRfUExTX0NUUkwJCQkweDIyCisjZGVmaW5lIENBUktJVF9QTFNfQ1RSTF9TRVQJCTB4MjMKKyNkZWZpbmUgQ0FSS0lUX1BMU19DVFJMX0NMUgkJMHgyNAorI2RlZmluZSBDQVJLSVRfUExTX0NUUkxfU1BLUlJJR0hUX0JJQVNFTgkoMSA8PCAzKQorI2RlZmluZSBDQVJLSVRfUExTX0NUUkxfU1BLUkxFRlRfQklBU0VOCSgxIDw8IDIpCisjZGVmaW5lIENBUktJVF9QTFNfQ1RSTF9SWFBMU0VOCQkoMSA8PCAxKQorI2RlZmluZSBDQVJLSVRfUExTX0NUUkxfVFhQTFNFTgkJKDEgPDwgMCkKKworI2RlZmluZSBNQ1BDX0NUUkwJCQkweDMwCisjZGVmaW5lIE1DUENfQ1RSTF9TRVQJCQkweDMxCisjZGVmaW5lIE1DUENfQ1RSTF9DTFIJCQkweDMyCisjZGVmaW5lIE1DUENfQ1RSTF9SVFNPTAkJCSgxIDw8IDcpCisjZGVmaW5lIE1DUENfQ1RSTF9FWFRTV1IJCSgxIDw8IDYpCisjZGVmaW5lIE1DUENfQ1RSTF9FWFRTV0MJCSgxIDw8IDUpCisjZGVmaW5lIE1DUENfQ1RSTF9WT0lDRVNXCQkoMSA8PCA0KQorI2RlZmluZSBNQ1BDX0NUUkxfT1VUNjRLCQkoMSA8PCAzKQorI2RlZmluZSBNQ1BDX0NUUkxfUlRTQ1RTU1cJCSgxIDw8IDIpCisjZGVmaW5lIE1DUENfQ1RSTF9IU19VQVJUCQkoMSA8PCAwKQorCisjZGVmaW5lIE1DUENfSU9fQ1RSTAkJCTB4MzMKKyNkZWZpbmUgTUNQQ19JT19DVFJMX1NFVAkJMHgzNAorI2RlZmluZSBNQ1BDX0lPX0NUUkxfQ0xSCQkweDM1CisjZGVmaW5lIE1DUENfSU9fQ1RSTF9NSUNCSUFTRU4JCSgxIDw8IDUpCisjZGVmaW5lIE1DUENfSU9fQ1RSTF9DVFNfTlBVCQkoMSA8PCA0KQorI2RlZmluZSBNQ1BDX0lPX0NUUkxfUlhEX1BVCQkoMSA8PCAzKQorI2RlZmluZSBNQ1BDX0lPX0NUUkxfVFhEVFlQCQkoMSA8PCAyKQorI2RlZmluZSBNQ1BDX0lPX0NUUkxfQ1RTVFlQCQkoMSA8PCAxKQorI2RlZmluZSBNQ1BDX0lPX0NUUkxfUlRTVFlQCQkoMSA8PCAwKQorCisjZGVmaW5lIE1DUENfQ1RSTDIJCQkweDM2CisjZGVmaW5lIE1DUENfQ1RSTDJfU0VUCQkJMHgzNworI2RlZmluZSBNQ1BDX0NUUkwyX0NMUgkJCTB4MzgKKyNkZWZpbmUgTUNQQ19DVFJMMl9NQ1BDX0NLX0VOCQkoMSA8PCAwKQorCisjZGVmaW5lIE9USEVSX0ZVTkNfQ1RSTAkJCTB4ODAKKyNkZWZpbmUgT1RIRVJfRlVOQ19DVFJMX1NFVAkJMHg4MQorI2RlZmluZSBPVEhFUl9GVU5DX0NUUkxfQ0xSCQkweDgyCisjZGVmaW5lIE9USEVSX0ZVTkNfQ1RSTF9CRElTX0FDT05fRU4JKDEgPDwgNCkKKyNkZWZpbmUgT1RIRVJfRlVOQ19DVFJMX0ZJVkVXSVJFX01PREUJKDEgPDwgMikKKworI2RlZmluZSBPVEhFUl9JRkNfQ1RSTAkJCTB4ODMKKyNkZWZpbmUgT1RIRVJfSUZDX0NUUkxfU0VUCQkweDg0CisjZGVmaW5lIE9USEVSX0lGQ19DVFJMX0NMUgkJMHg4NQorI2RlZmluZSBPVEhFUl9JRkNfQ1RSTF9PRV9JTlRfRU4JKDEgPDwgNikKKyNkZWZpbmUgT1RIRVJfSUZDX0NUUkxfQ0VBMjAxMV9NT0RFCSgxIDw8IDUpCisjZGVmaW5lIE9USEVSX0lGQ19DVFJMX0ZTTFNTRVJJQUxNT0RFXzRQSU4JKDEgPDwgNCkKKyNkZWZpbmUgT1RIRVJfSUZDX0NUUkxfSElaX1VMUElfNjBNSFpfT1VUCSgxIDw8IDMpCisjZGVmaW5lIE9USEVSX0lGQ19DVFJMX0hJWl9VTFBJCQkoMSA8PCAyKQorI2RlZmluZSBPVEhFUl9JRkNfQ1RSTF9BTFRfSU5UX1JFUk9VVEUJKDEgPDwgMCkKKworI2RlZmluZSBPVEhFUl9JTlRfRU5fUklTRQkJMHg4NgorI2RlZmluZSBPVEhFUl9JTlRfRU5fUklTRV9TRVQJCTB4ODcKKyNkZWZpbmUgT1RIRVJfSU5UX0VOX1JJU0VfQ0xSCQkweDg4CisjZGVmaW5lIE9USEVSX0lOVF9FTl9GQUxMCQkweDg5CisjZGVmaW5lIE9USEVSX0lOVF9FTl9GQUxMX1NFVAkJMHg4QQorI2RlZmluZSBPVEhFUl9JTlRfRU5fRkFMTF9DTFIJCTB4OEIKKyNkZWZpbmUgT1RIRVJfSU5UX1NUUwkJCTB4OEMKKyNkZWZpbmUgT1RIRVJfSU5UX0xBVENICQkJMHg4RAorI2RlZmluZSBPVEhFUl9JTlRfVkJfU0VTU19WTEQJCSgxIDw8IDcpCisjZGVmaW5lIE9USEVSX0lOVF9ETV9ISQkJCSgxIDw8IDYpIC8qIG5vdCB2YWxpZCBmb3IgImxhdGNoIiByZWcgKi8KKyNkZWZpbmUgT1RIRVJfSU5UX0RQX0hJCQkJKDEgPDwgNSkgLyogbm90IHZhbGlkIGZvciAibGF0Y2giIHJlZyAqLworI2RlZmluZSBPVEhFUl9JTlRfQkRJU19BQ09OCQkoMSA8PCAzKSAvKiBub3QgdmFsaWQgZm9yICJmYWxsIiByZWdzICovCisjZGVmaW5lIE9USEVSX0lOVF9NQU5VCQkJKDEgPDwgMSkKKyNkZWZpbmUgT1RIRVJfSU5UX0FCTk9STUFMX1NUUkVTUwkoMSA8PCAwKQorCisjZGVmaW5lIElEX1NUQVRVUwkJCTB4OTYKKyNkZWZpbmUgSURfUkVTX0ZMT0FUCQkJKDEgPDwgNCkKKyNkZWZpbmUgSURfUkVTXzQ0MEsJCQkoMSA8PCAzKQorI2RlZmluZSBJRF9SRVNfMjAwSwkJCSgxIDw8IDIpCisjZGVmaW5lIElEX1JFU18xMDJLCQkJKDEgPDwgMSkKKyNkZWZpbmUgSURfUkVTX0dORAkJCSgxIDw8IDApCisKKyNkZWZpbmUgUE9XRVJfQ1RSTAkJCTB4QUMKKyNkZWZpbmUgUE9XRVJfQ1RSTF9TRVQJCQkweEFECisjZGVmaW5lIFBPV0VSX0NUUkxfQ0xSCQkJMHhBRQorI2RlZmluZSBQT1dFUl9DVFJMX09UR19FTkFCCQkoMSA8PCA1KQorCisjZGVmaW5lIE9USEVSX0lGQ19DVFJMMgkJCTB4QUYKKyNkZWZpbmUgT1RIRVJfSUZDX0NUUkwyX1NFVAkJMHhCMAorI2RlZmluZSBPVEhFUl9JRkNfQ1RSTDJfQ0xSCQkweEIxCisjZGVmaW5lIE9USEVSX0lGQ19DVFJMMl9VTFBJX1NUUF9MT1cJKDEgPDwgNCkKKyNkZWZpbmUgT1RIRVJfSUZDX0NUUkwyX1VMUElfVFhFTl9QT0wJKDEgPDwgMykKKyNkZWZpbmUgT1RIRVJfSUZDX0NUUkwyX1VMUElfNFBJTl8yNDMwCSgxIDw8IDIpCisjZGVmaW5lIE9USEVSX0lGQ19DVFJMMl9VU0JfSU5UX09VVFNFTF9NQVNLCSgzIDw8IDApIC8qIGJpdHMgMCBhbmQgMSAqLworI2RlZmluZSBPVEhFUl9JRkNfQ1RSTDJfVVNCX0lOVF9PVVRTRUxfSU5UMU4JKDAgPDwgMCkKKyNkZWZpbmUgT1RIRVJfSUZDX0NUUkwyX1VTQl9JTlRfT1VUU0VMX0lOVDJOCSgxIDw8IDApCisKKyNkZWZpbmUgUkVHX0NUUkxfRU4JCQkweEIyCisjZGVmaW5lIFJFR19DVFJMX0VOX1NFVAkJCTB4QjMKKyNkZWZpbmUgUkVHX0NUUkxfRU5fQ0xSCQkJMHhCNAorI2RlZmluZSBSRUdfQ1RSTF9FUlJPUgkJCTB4QjUKKyNkZWZpbmUgVUxQSV9JMkNfQ09ORkxJQ1RfSU5URU4JCSgxIDw8IDApCisKKyNkZWZpbmUgT1RIRVJfRlVOQ19DVFJMMgkJMHhCOAorI2RlZmluZSBPVEhFUl9GVU5DX0NUUkwyX1NFVAkJMHhCOQorI2RlZmluZSBPVEhFUl9GVU5DX0NUUkwyX0NMUgkJMHhCQQorI2RlZmluZSBPVEhFUl9GVU5DX0NUUkwyX1ZCQVRfVElNRVJfRU4JKDEgPDwgMCkKKworLyogZm9sbG93aW5nIHJlZ2lzdGVycyBkbyBub3QgaGF2ZSBzZXBhcmF0ZSBfY2xyIGFuZCBfc2V0IHJlZ2lzdGVycyAqLworI2RlZmluZSBWQlVTX0RFQk9VTkNFCQkJMHhDMAorI2RlZmluZSBJRF9ERUJPVU5DRQkJCTB4QzEKKyNkZWZpbmUgVkJBVF9USU1FUgkJCTB4RDMKKyNkZWZpbmUgUEhZX1BXUl9DVFJMCQkJMHhGRAorI2RlZmluZSBQSFlfUFdSX1BIWVBXRAkJCSgxIDw8IDApCisjZGVmaW5lIFBIWV9DTEtfQ1RSTAkJCTB4RkUKKyNkZWZpbmUgUEhZX0NMS19DVFJMX0NMT0NLR0FUSU5HX0VOCSgxIDw8IDIpCisjZGVmaW5lIFBIWV9DTEtfQ1RSTF9DTEszMktfRU4JCSgxIDw8IDEpCisjZGVmaW5lIFJFUV9QSFlfRFBMTF9DTEsJCSgxIDw8IDApCisjZGVmaW5lIFBIWV9DTEtfQ1RSTF9TVFMJCTB4RkYKKyNkZWZpbmUgUEhZX0RQTExfQ0xLCQkJKDEgPDwgMCkKKworLyogSW4gbW9kdWxlIFRXTDQwMzBfTU9EVUxFX1BNX01BU1RFUiAqLworI2RlZmluZSBQUk9URUNUX0tFWQkJCTB4MEUKKworLyogSW4gbW9kdWxlIFRXTDQwMzBfTU9EVUxFX1BNX1JFQ0VJVkVSICovCisjZGVmaW5lIFZVU0JfREVESUNBVEVEMQkJCTB4N0QKKyNkZWZpbmUgVlVTQl9ERURJQ0FURUQyCQkJMHg3RQorI2RlZmluZSBWVVNCMVY1X0RFVl9HUlAJCQkweDcxCisjZGVmaW5lIFZVU0IxVjVfVFlQRQkJCTB4NzIKKyNkZWZpbmUgVlVTQjFWNV9SRU1BUAkJCTB4NzMKKyNkZWZpbmUgVlVTQjFWOF9ERVZfR1JQCQkJMHg3NAorI2RlZmluZSBWVVNCMVY4X1RZUEUJCQkweDc1CisjZGVmaW5lIFZVU0IxVjhfUkVNQVAJCQkweDc2CisjZGVmaW5lIFZVU0IzVjFfREVWX0dSUAkJCTB4NzcKKyNkZWZpbmUgVlVTQjNWMV9UWVBFCQkJMHg3OAorI2RlZmluZSBWVVNCM1YxX1JFTUFQCQkJMHg3OQorCisvKiBJbiBtb2R1bGUgVFdMNDAzMF9NT0RVTEVfSU5UQlIgKi8KKyNkZWZpbmUgUE1CUjEJCQkJMHgwRAorI2RlZmluZSBHUElPX1VTQl80UElOX1VMUElfMjQzMEMJKDMgPDwgMCkKKworCisKK2VudW0gbGlua3N0YXQgeworCVVTQl9MSU5LX1VOS05PV04gPSAwLAorCVVTQl9MSU5LX05PTkUsCisJVVNCX0xJTktfVkJVUywKKwlVU0JfTElOS19JRCwKK307CisKK3N0cnVjdCB0d2w0MDMwX3VzYiB7CisJc3RydWN0IG90Z190cmFuc2NlaXZlcglvdGc7CisJc3RydWN0IGRldmljZQkJKmRldjsKKworCS8qIGZvciB2YnVzIHJlcG9ydGluZyB3aXRoIGlycXMgZGlzYWJsZWQgKi8KKwlzcGlubG9ja190CQlsb2NrOworCisJLyogcGluIGNvbmZpZ3VyYXRpb24gKi8KKwllbnVtIHR3bDQwMzBfdXNiX21vZGUJdXNiX21vZGU7CisKKwlpbnQJCQlpcnE7CisJdTgJCQlsaW5rc3RhdDsKKwl1OAkJCWFzbGVlcDsKKwlib29sCQkJaXJxX2VuYWJsZWQ7Cit9OworCisvKiBpbnRlcm5hbCBkZWZpbmUgb24gdG9wIG9mIGNvbnRhaW5lcl9vZiAqLworI2RlZmluZSB4Y2Vpdl90b190d2woeCkJCWNvbnRhaW5lcl9vZigoeCksIHN0cnVjdCB0d2w0MDMwX3VzYiwgb3RnKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGludCB0d2w0MDMwX2kyY193cml0ZV91OF92ZXJpZnkoc3RydWN0IHR3bDQwMzBfdXNiICp0d2wsCisJCXU4IG1vZHVsZSwgdTggZGF0YSwgdTggYWRkcmVzcykKK3sKKwl1OCBjaGVjazsKKworCWlmICgodHdsNDAzMF9pMmNfd3JpdGVfdTgobW9kdWxlLCBkYXRhLCBhZGRyZXNzKSA+PSAwKSAmJgorCSAgICAodHdsNDAzMF9pMmNfcmVhZF91OChtb2R1bGUsICZjaGVjaywgYWRkcmVzcykgPj0gMCkgJiYKKwkJCQkJCShjaGVjayA9PSBkYXRhKSkKKwkJcmV0dXJuIDA7CisJZGV2X2RiZyh0d2wtPmRldiwgIldyaXRlJWRbJWQsMHgleF0gd3JvdGUgJTAyeCBidXQgcmVhZCAlMDJ4XG4iLAorCQkJMSwgbW9kdWxlLCBhZGRyZXNzLCBjaGVjaywgZGF0YSk7CisKKwkvKiBGYWlsZWQgb25jZTogVHJ5IGFnYWluICovCisJaWYgKCh0d2w0MDMwX2kyY193cml0ZV91OChtb2R1bGUsIGRhdGEsIGFkZHJlc3MpID49IDApICYmCisJICAgICh0d2w0MDMwX2kyY19yZWFkX3U4KG1vZHVsZSwgJmNoZWNrLCBhZGRyZXNzKSA+PSAwKSAmJgorCQkJCQkJKGNoZWNrID09IGRhdGEpKQorCQlyZXR1cm4gMDsKKwlkZXZfZGJnKHR3bC0+ZGV2LCAiV3JpdGUlZFslZCwweCV4XSB3cm90ZSAlMDJ4IGJ1dCByZWFkICUwMnhcbiIsCisJCQkyLCBtb2R1bGUsIGFkZHJlc3MsIGNoZWNrLCBkYXRhKTsKKworCS8qIEZhaWxlZCBhZ2FpbjogUmV0dXJuIGVycm9yICovCisJcmV0dXJuIC1FQlVTWTsKK30KKworI2RlZmluZSB0d2w0MDMwX3VzYl93cml0ZV92ZXJpZnkodHdsLCBhZGRyZXNzLCBkYXRhKQlcCisJdHdsNDAzMF9pMmNfd3JpdGVfdThfdmVyaWZ5KHR3bCwgVFdMNDAzMF9NT0RVTEVfVVNCLCAoZGF0YSksIChhZGRyZXNzKSkKKworc3RhdGljIGlubGluZSBpbnQgdHdsNDAzMF91c2Jfd3JpdGUoc3RydWN0IHR3bDQwMzBfdXNiICp0d2wsCisJCXU4IGFkZHJlc3MsIHU4IGRhdGEpCit7CisJaW50IHJldCA9IDA7CisKKwlyZXQgPSB0d2w0MDMwX2kyY193cml0ZV91OChUV0w0MDMwX01PRFVMRV9VU0IsIGRhdGEsIGFkZHJlc3MpOworCWlmIChyZXQgPCAwKQorCQlkZXZfZGJnKHR3bC0+ZGV2LAorCQkJIlRXTDQwMzA6VVNCOldyaXRlWzB4JXhdIEVycm9yICVkXG4iLCBhZGRyZXNzLCByZXQpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHR3bDQwMzBfcmVhZGIoc3RydWN0IHR3bDQwMzBfdXNiICp0d2wsIHU4IG1vZHVsZSwgdTggYWRkcmVzcykKK3sKKwl1OCBkYXRhOworCWludCByZXQgPSAwOworCisJcmV0ID0gdHdsNDAzMF9pMmNfcmVhZF91OChtb2R1bGUsICZkYXRhLCBhZGRyZXNzKTsKKwlpZiAocmV0ID49IDApCisJCXJldCA9IGRhdGE7CisJZWxzZQorCQlkZXZfZGJnKHR3bC0+ZGV2LAorCQkJIlRXTDQwMzA6cmVhZGJbMHgleCwweCV4XSBFcnJvciAlZFxuIiwKKwkJCQkJbW9kdWxlLCBhZGRyZXNzLCByZXQpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSBpbnQgdHdsNDAzMF91c2JfcmVhZChzdHJ1Y3QgdHdsNDAzMF91c2IgKnR3bCwgdTggYWRkcmVzcykKK3sKKwlyZXR1cm4gdHdsNDAzMF9yZWFkYih0d2wsIFRXTDQwMzBfTU9EVUxFX1VTQiwgYWRkcmVzcyk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbmxpbmUgaW50Cit0d2w0MDMwX3VzYl9zZXRfYml0cyhzdHJ1Y3QgdHdsNDAzMF91c2IgKnR3bCwgdTggcmVnLCB1OCBiaXRzKQoreworCXJldHVybiB0d2w0MDMwX3VzYl93cml0ZSh0d2wsIHJlZyArIDEsIGJpdHMpOworfQorCitzdGF0aWMgaW5saW5lIGludAordHdsNDAzMF91c2JfY2xlYXJfYml0cyhzdHJ1Y3QgdHdsNDAzMF91c2IgKnR3bCwgdTggcmVnLCB1OCBiaXRzKQoreworCXJldHVybiB0d2w0MDMwX3VzYl93cml0ZSh0d2wsIHJlZyArIDIsIGJpdHMpOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgZW51bSBsaW5rc3RhdCB0d2w0MDMwX3VzYl9saW5rc3RhdChzdHJ1Y3QgdHdsNDAzMF91c2IgKnR3bCkKK3sKKwlpbnQJc3RhdHVzOworCWludAlsaW5rc3RhdCA9IFVTQl9MSU5LX1VOS05PV047CisKKwkvKiBTVFNfSFdfQ09ORElUSU9OUyAqLworCXN0YXR1cyA9IHR3bDQwMzBfcmVhZGIodHdsLCBUV0w0MDMwX01PRFVMRV9QTV9NQVNURVIsIDB4MGYpOworCWlmIChzdGF0dXMgPCAwKQorCQlkZXZfZXJyKHR3bC0+ZGV2LCAiVVNCIGxpbmsgc3RhdHVzIGVyciAlZFxuIiwgc3RhdHVzKTsKKwllbHNlIGlmIChzdGF0dXMgJiBCSVQoNykpCisJCWxpbmtzdGF0ID0gVVNCX0xJTktfVkJVUzsKKwllbHNlIGlmIChzdGF0dXMgJiBCSVQoMikpCisJCWxpbmtzdGF0ID0gVVNCX0xJTktfSUQ7CisJZWxzZQorCQlsaW5rc3RhdCA9IFVTQl9MSU5LX05PTkU7CisKKwlkZXZfZGJnKHR3bC0+ZGV2LCAiSFdfQ09ORElUSU9OUyAweCUwMngvJWQ7IGxpbmsgJWRcbiIsCisJCQlzdGF0dXMsIHN0YXR1cywgbGlua3N0YXQpOworCisJLyogUkVWSVNJVCB0aGlzIGFzc3VtZXMgaG9zdCBhbmQgcGVyaXBoZXJhbCBjb250cm9sbGVycworCSAqIGFyZSByZWdpc3RlcmVkLCBhbmQgdGhhdCBib3RoIGFyZSBhY3RpdmUuLi4KKwkgKi8KKworCXNwaW5fbG9ja19pcnEoJnR3bC0+bG9jayk7CisJdHdsLT5saW5rc3RhdCA9IGxpbmtzdGF0OworCWlmIChsaW5rc3RhdCA9PSBVU0JfTElOS19JRCkgeworCQl0d2wtPm90Zy5kZWZhdWx0X2EgPSB0cnVlOworCQl0d2wtPm90Zy5zdGF0ZSA9IE9UR19TVEFURV9BX0lETEU7CisJfSBlbHNlIHsKKwkJdHdsLT5vdGcuZGVmYXVsdF9hID0gZmFsc2U7CisJCXR3bC0+b3RnLnN0YXRlID0gT1RHX1NUQVRFX0JfSURMRTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxKCZ0d2wtPmxvY2spOworCisJcmV0dXJuIGxpbmtzdGF0OworfQorCitzdGF0aWMgdm9pZCB0d2w0MDMwX3VzYl9zZXRfbW9kZShzdHJ1Y3QgdHdsNDAzMF91c2IgKnR3bCwgaW50IG1vZGUpCit7CisJdHdsLT51c2JfbW9kZSA9IG1vZGU7CisKKwlzd2l0Y2ggKG1vZGUpIHsKKwljYXNlIFQyX1VTQl9NT0RFX1VMUEk6CisJCXR3bDQwMzBfdXNiX2NsZWFyX2JpdHModHdsLCBJRkNfQ1RSTCwgSUZDX0NUUkxfQ0FSS0lUTU9ERSk7CisJCXR3bDQwMzBfdXNiX3NldF9iaXRzKHR3bCwgUE9XRVJfQ1RSTCwgUE9XRVJfQ1RSTF9PVEdfRU5BQik7CisJCXR3bDQwMzBfdXNiX2NsZWFyX2JpdHModHdsLCBGVU5DX0NUUkwsCisJCQkJCUZVTkNfQ1RSTF9YQ1ZSU0VMRUNUX01BU0sgfAorCQkJCQlGVU5DX0NUUkxfT1BNT0RFX01BU0spOworCQlicmVhazsKKwljYXNlIC0xOgorCQkvKiBGSVhNRTogcG93ZXIgb24gZGVmYXVsdHMgKi8KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2Vycih0d2wtPmRldiwgInVuc3VwcG9ydGVkIFQyIHRyYW5zY2VpdmVyIG1vZGUgJWRcbiIsCisJCQkJbW9kZSk7CisJCWJyZWFrOworCX07Cit9CisKK3N0YXRpYyB2b2lkIHR3bDQwMzBfaTJjX2FjY2VzcyhzdHJ1Y3QgdHdsNDAzMF91c2IgKnR3bCwgaW50IG9uKQoreworCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKKwlpbnQgdmFsID0gdHdsNDAzMF91c2JfcmVhZCh0d2wsIFBIWV9DTEtfQ1RSTCk7CisKKwlpZiAodmFsID49IDApIHsKKwkJaWYgKG9uKSB7CisJCQkvKiBlbmFibGUgRFBMTCB0byBhY2Nlc3MgUEhZIHJlZ2lzdGVycyBvdmVyIEkyQyAqLworCQkJdmFsIHw9IFJFUV9QSFlfRFBMTF9DTEs7CisJCQlXQVJOX09OKHR3bDQwMzBfdXNiX3dyaXRlX3ZlcmlmeSh0d2wsIFBIWV9DTEtfQ1RSTCwKKwkJCQkJCSh1OCl2YWwpIDwgMCk7CisKKwkJCXRpbWVvdXQgPSBqaWZmaWVzICsgSFo7CisJCQl3aGlsZSAoISh0d2w0MDMwX3VzYl9yZWFkKHR3bCwgUEhZX0NMS19DVFJMX1NUUykgJgorCQkJCQkJCVBIWV9EUExMX0NMSykKKwkJCQkmJiB0aW1lX2JlZm9yZShqaWZmaWVzLCB0aW1lb3V0KSkKKwkJCQkJdWRlbGF5KDEwKTsKKwkJCWlmICghKHR3bDQwMzBfdXNiX3JlYWQodHdsLCBQSFlfQ0xLX0NUUkxfU1RTKSAmCisJCQkJCQkJUEhZX0RQTExfQ0xLKSkKKwkJCQlkZXZfZXJyKHR3bC0+ZGV2LCAiVGltZW91dCBzZXR0aW5nIFQyIEhTVVNCICIKKwkJCQkJCSJQSFkgRFBMTCBjbG9ja1xuIik7CisJCX0gZWxzZSB7CisJCQkvKiBsZXQgVUxQSSBjb250cm9sIHRoZSBEUExMIGNsb2NrICovCisJCQl2YWwgJj0gflJFUV9QSFlfRFBMTF9DTEs7CisJCQlXQVJOX09OKHR3bDQwMzBfdXNiX3dyaXRlX3ZlcmlmeSh0d2wsIFBIWV9DTEtfQ1RSTCwKKwkJCQkJCSh1OCl2YWwpIDwgMCk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIHR3bDQwMzBfcGh5X3Bvd2VyKHN0cnVjdCB0d2w0MDMwX3VzYiAqdHdsLCBpbnQgb24pCit7CisJdTggcHdyOworCisJcHdyID0gdHdsNDAzMF91c2JfcmVhZCh0d2wsIFBIWV9QV1JfQ1RSTCk7CisJaWYgKG9uKSB7CisJCXB3ciAmPSB+UEhZX1BXUl9QSFlQV0Q7CisJCVdBUk5fT04odHdsNDAzMF91c2Jfd3JpdGVfdmVyaWZ5KHR3bCwgUEhZX1BXUl9DVFJMLCBwd3IpIDwgMCk7CisJCXR3bDQwMzBfdXNiX3dyaXRlKHR3bCwgUEhZX0NMS19DVFJMLAorCQkJCSAgdHdsNDAzMF91c2JfcmVhZCh0d2wsIFBIWV9DTEtfQ1RSTCkgfAorCQkJCQkoUEhZX0NMS19DVFJMX0NMT0NLR0FUSU5HX0VOIHwKKwkJCQkJCVBIWV9DTEtfQ1RSTF9DTEszMktfRU4pKTsKKwl9IGVsc2UgIHsKKwkJcHdyIHw9IFBIWV9QV1JfUEhZUFdEOworCQlXQVJOX09OKHR3bDQwMzBfdXNiX3dyaXRlX3ZlcmlmeSh0d2wsIFBIWV9QV1JfQ1RSTCwgcHdyKSA8IDApOworCX0KK30KKworc3RhdGljIHZvaWQgdHdsNDAzMF9waHlfc3VzcGVuZChzdHJ1Y3QgdHdsNDAzMF91c2IgKnR3bCwgaW50IGNvbnRyb2xsZXJfb2ZmKQoreworCWlmICh0d2wtPmFzbGVlcCkKKwkJcmV0dXJuOworCisJdHdsNDAzMF9waHlfcG93ZXIodHdsLCAwKTsKKwl0d2wtPmFzbGVlcCA9IDE7Cit9CisKK3N0YXRpYyB2b2lkIHR3bDQwMzBfcGh5X3Jlc3VtZShzdHJ1Y3QgdHdsNDAzMF91c2IgKnR3bCkKK3sKKwlpZiAoIXR3bC0+YXNsZWVwKQorCQlyZXR1cm47CisKKwl0d2w0MDMwX3BoeV9wb3dlcih0d2wsIDEpOworCXR3bDQwMzBfaTJjX2FjY2Vzcyh0d2wsIDEpOworCXR3bDQwMzBfdXNiX3NldF9tb2RlKHR3bCwgdHdsLT51c2JfbW9kZSk7CisJaWYgKHR3bC0+dXNiX21vZGUgPT0gVDJfVVNCX01PREVfVUxQSSkKKwkJdHdsNDAzMF9pMmNfYWNjZXNzKHR3bCwgMCk7CisJdHdsLT5hc2xlZXAgPSAwOworfQorCitzdGF0aWMgdm9pZCB0d2w0MDMwX3VzYl9sZG9faW5pdChzdHJ1Y3QgdHdsNDAzMF91c2IgKnR3bCkKK3sKKwkvKiBFbmFibGUgd3JpdGluZyB0byBwb3dlciBjb25maWd1cmF0aW9uIHJlZ2lzdGVycyAqLworCXR3bDQwMzBfaTJjX3dyaXRlX3U4KFRXTDQwMzBfTU9EVUxFX1BNX01BU1RFUiwgMHhDMCwgUFJPVEVDVF9LRVkpOworCXR3bDQwMzBfaTJjX3dyaXRlX3U4KFRXTDQwMzBfTU9EVUxFX1BNX01BU1RFUiwgMHgwQywgUFJPVEVDVF9LRVkpOworCisJLyogcHV0IFZVU0IzVjEgTERPIGluIGFjdGl2ZSBzdGF0ZSAqLworCXR3bDQwMzBfaTJjX3dyaXRlX3U4KFRXTDQwMzBfTU9EVUxFX1BNX1JFQ0VJVkVSLCAwLCBWVVNCX0RFRElDQVRFRDIpOworCisJLyogaW5wdXQgdG8gVlVTQjNWMSBMRE8gaXMgZnJvbSBWQkFULCBub3QgVkJVUyAqLworCXR3bDQwMzBfaTJjX3dyaXRlX3U4KFRXTDQwMzBfTU9EVUxFX1BNX1JFQ0VJVkVSLCAweDE0LCBWVVNCX0RFRElDQVRFRDEpOworCisJLyogdHVybiBvbiAzLjFWIHJlZ3VsYXRvciAqLworCXR3bDQwMzBfaTJjX3dyaXRlX3U4KFRXTDQwMzBfTU9EVUxFX1BNX1JFQ0VJVkVSLCAweDIwLCBWVVNCM1YxX0RFVl9HUlApOworCXR3bDQwMzBfaTJjX3dyaXRlX3U4KFRXTDQwMzBfTU9EVUxFX1BNX1JFQ0VJVkVSLCAwLCBWVVNCM1YxX1RZUEUpOworCisJLyogdHVybiBvbiAxLjVWIHJlZ3VsYXRvciAqLworCXR3bDQwMzBfaTJjX3dyaXRlX3U4KFRXTDQwMzBfTU9EVUxFX1BNX1JFQ0VJVkVSLCAweDIwLCBWVVNCMVY1X0RFVl9HUlApOworCXR3bDQwMzBfaTJjX3dyaXRlX3U4KFRXTDQwMzBfTU9EVUxFX1BNX1JFQ0VJVkVSLCAwLCBWVVNCMVY1X1RZUEUpOworCisJLyogdHVybiBvbiAxLjhWIHJlZ3VsYXRvciAqLworCXR3bDQwMzBfaTJjX3dyaXRlX3U4KFRXTDQwMzBfTU9EVUxFX1BNX1JFQ0VJVkVSLCAweDIwLCBWVVNCMVY4X0RFVl9HUlApOworCXR3bDQwMzBfaTJjX3dyaXRlX3U4KFRXTDQwMzBfTU9EVUxFX1BNX1JFQ0VJVkVSLCAwLCBWVVNCMVY4X1RZUEUpOworCisJLyogZGlzYWJsZSBhY2Nlc3MgdG8gcG93ZXIgY29uZmlndXJhdGlvbiByZWdpc3RlcnMgKi8KKwl0d2w0MDMwX2kyY193cml0ZV91OChUV0w0MDMwX01PRFVMRV9QTV9NQVNURVIsIDAsIFBST1RFQ1RfS0VZKTsKK30KKworc3RhdGljIHNzaXplX3QgdHdsNDAzMF91c2JfdmJ1c19zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgdHdsNDAzMF91c2IgKnR3bCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldCA9IC1FSU5WQUw7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdHdsLT5sb2NrLCBmbGFncyk7CisJcmV0ID0gc3ByaW50ZihidWYsICIlc1xuIiwKKwkJCSh0d2wtPmxpbmtzdGF0ID09IFVTQl9MSU5LX1ZCVVMpID8gIm9uIiA6ICJvZmYiKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0d2wtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiByZXQ7Cit9CitzdGF0aWMgREVWSUNFX0FUVFIodmJ1cywgMDQ0NCwgdHdsNDAzMF91c2JfdmJ1c19zaG93LCBOVUxMKTsKKworc3RhdGljIGlycXJldHVybl90IHR3bDQwMzBfdXNiX2lycShpbnQgaXJxLCB2b2lkICpfdHdsKQoreworCXN0cnVjdCB0d2w0MDMwX3VzYiAqdHdsID0gX3R3bDsKKwlpbnQgc3RhdHVzOworCisjaWZkZWYgQ09ORklHX0xPQ0tERVAKKwkvKiBXT1JLQVJPVU5EIGZvciBsb2NrZGVwIGZvcmNpbmcgSVJRRl9ESVNBQkxFRCBvbiB1cywgd2hpY2gKKwkgKiB3ZSBkb24ndCB3YW50IGFuZCBjYW4ndCB0b2xlcmF0ZS4gIEFsdGhvdWdoIGl0IG1pZ2h0IGJlCisJICogZnJpZW5kbGllciBub3QgdG8gYm9ycm93IHRoaXMgdGhyZWFkIGNvbnRleHQuLi4KKwkgKi8KKwlsb2NhbF9pcnFfZW5hYmxlKCk7CisjZW5kaWYKKworCXN0YXR1cyA9IHR3bDQwMzBfdXNiX2xpbmtzdGF0KHR3bCk7CisJaWYgKHN0YXR1cyAhPSBVU0JfTElOS19VTktOT1dOKSB7CisKKwkJLyogRklYTUUgYWRkIGEgc2V0X3Bvd2VyKCkgbWV0aG9kIHNvIHRoYXQgQi1kZXZpY2VzIGNhbgorCQkgKiBjb25maWd1cmUgdGhlIGNoYXJnZXIgYXBwcm9wcmlhdGVseS4gIEl0J3Mgbm90IGFsd2F5cworCQkgKiBjb3JyZWN0IHRvIGNvbnN1bWUgVkJVUyBwb3dlciwgYW5kIGhvdyBtdWNoIGN1cnJlbnQgdG8KKwkJICogY29uc3VtZSBpcyBhIGZ1bmN0aW9uIG9mIHRoZSBVU0IgY29uZmlndXJhdGlvbiBjaG9zZW4KKwkJICogYnkgdGhlIGhvc3QuCisJCSAqCisJCSAqIFJFVklTSVQgdXNiX2dhZGdldF92YnVzX2Nvbm5lY3QoLi4uKSBhcyBuZWVkZWQsIGRpdHRvCisJCSAqIGl0cyBkaXNjb25uZWN0KCkgc2libGluZywgd2hlbiBjaGFuZ2luZyB0by9mcm9tIHRoZQorCQkgKiBVU0JfTElOS19WQlVTIHN0YXRlLiAgbXVzYl9oZHJjIHdvbid0IGNhcmUgdW50aWwgaXQKKwkJICogc3RhcnRzIHRvIGhhbmRsZSBzb2Z0Y29ubmVjdCByaWdodC4KKwkJICovCisJCXR3bDQwMzBjaGFyZ2VyX3VzYl9lbihzdGF0dXMgPT0gVVNCX0xJTktfVkJVUyk7CisKKwkJaWYgKHN0YXR1cyA9PSBVU0JfTElOS19OT05FKQorCQkJdHdsNDAzMF9waHlfc3VzcGVuZCh0d2wsIDApOworCQllbHNlCisJCQl0d2w0MDMwX3BoeV9yZXN1bWUodHdsKTsKKwl9CisJc3lzZnNfbm90aWZ5KCZ0d2wtPmRldi0+a29iaiwgTlVMTCwgInZidXMiKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludCB0d2w0MDMwX3NldF9zdXNwZW5kKHN0cnVjdCBvdGdfdHJhbnNjZWl2ZXIgKngsIGludCBzdXNwZW5kKQoreworCXN0cnVjdCB0d2w0MDMwX3VzYiAqdHdsID0geGNlaXZfdG9fdHdsKHgpOworCisJaWYgKHN1c3BlbmQpCisJCXR3bDQwMzBfcGh5X3N1c3BlbmQodHdsLCAxKTsKKwllbHNlCisJCXR3bDQwMzBfcGh5X3Jlc3VtZSh0d2wpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdHdsNDAzMF9zZXRfcGVyaXBoZXJhbChzdHJ1Y3Qgb3RnX3RyYW5zY2VpdmVyICp4LAorCQlzdHJ1Y3QgdXNiX2dhZGdldCAqZ2FkZ2V0KQoreworCXN0cnVjdCB0d2w0MDMwX3VzYiAqdHdsOworCisJaWYgKCF4KQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXR3bCA9IHhjZWl2X3RvX3R3bCh4KTsKKwl0d2wtPm90Zy5nYWRnZXQgPSBnYWRnZXQ7CisJaWYgKCFnYWRnZXQpCisJCXR3bC0+b3RnLnN0YXRlID0gT1RHX1NUQVRFX1VOREVGSU5FRDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHR3bDQwMzBfc2V0X2hvc3Qoc3RydWN0IG90Z190cmFuc2NlaXZlciAqeCwgc3RydWN0IHVzYl9idXMgKmhvc3QpCit7CisJc3RydWN0IHR3bDQwMzBfdXNiICp0d2w7CisKKwlpZiAoIXgpCisJCXJldHVybiAtRU5PREVWOworCisJdHdsID0geGNlaXZfdG9fdHdsKHgpOworCXR3bC0+b3RnLmhvc3QgPSBob3N0OworCWlmICghaG9zdCkKKwkJdHdsLT5vdGcuc3RhdGUgPSBPVEdfU1RBVEVfVU5ERUZJTkVEOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHR3bDQwMzBfdXNiX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHR3bDQwMzBfdXNiX2RhdGEgKnBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJc3RydWN0IHR3bDQwMzBfdXNiCSp0d2w7CisJaW50CQkJc3RhdHVzOworCisJaWYgKCFwZGF0YSkgeworCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJwbGF0Zm9ybV9kYXRhIG5vdCBhdmFpbGFibGVcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwl0d2wgPSBremFsbG9jKHNpemVvZiAqdHdsLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXR3bCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwl0d2wtPmRldgkJPSAmcGRldi0+ZGV2OworCXR3bC0+aXJxCQk9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7CisJdHdsLT5vdGcuZGV2CQk9IHR3bC0+ZGV2OworCXR3bC0+b3RnLmxhYmVsCQk9ICJ0d2w0MDMwIjsKKwl0d2wtPm90Zy5zZXRfaG9zdAk9IHR3bDQwMzBfc2V0X2hvc3Q7CisJdHdsLT5vdGcuc2V0X3BlcmlwaGVyYWwJPSB0d2w0MDMwX3NldF9wZXJpcGhlcmFsOworCXR3bC0+b3RnLnNldF9zdXNwZW5kCT0gdHdsNDAzMF9zZXRfc3VzcGVuZDsKKwl0d2wtPnVzYl9tb2RlCQk9IHBkYXRhLT51c2JfbW9kZTsKKwl0d2wtPmFzbGVlcAkJPSAxOworCisJLyogaW5pdCBzcGlubG9jayBmb3Igd29ya3F1ZXVlICovCisJc3Bpbl9sb2NrX2luaXQoJnR3bC0+bG9jayk7CisKKwl0d2w0MDMwX3VzYl9sZG9faW5pdCh0d2wpOworCW90Z19zZXRfdHJhbnNjZWl2ZXIoJnR3bC0+b3RnKTsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHR3bCk7CisJaWYgKGRldmljZV9jcmVhdGVfZmlsZSgmcGRldi0+ZGV2LCAmZGV2X2F0dHJfdmJ1cykpCisJCWRldl93YXJuKCZwZGV2LT5kZXYsICJjb3VsZCBub3QgY3JlYXRlIHN5c2ZzIGZpbGVcbiIpOworCisJLyogT3VyIGpvYiBpcyB0byB1c2UgaXJxcyBhbmQgc3RhdHVzIGZyb20gdGhlIHBvd2VyIG1vZHVsZQorCSAqIHRvIGtlZXAgdGhlIHRyYW5zY2VpdmVyIGRpc2FibGVkIHdoZW4gbm90aGluZydzIGNvbm5lY3RlZC4KKwkgKgorCSAqIEZJWE1FIHdlIGFjdHVhbGx5IHNob3VsZG4ndCBzdGFydCBlbmFibGluZyBpdCB1bnRpbCB0aGUKKwkgKiBVU0IgY29udHJvbGxlciBkcml2ZXJzIGhhdmUgc2FpZCB0aGV5J3JlIHJlYWR5LCBieSBjYWxsaW5nCisJICogc2V0X2hvc3QoKSBhbmQvb3Igc2V0X3BlcmlwaGVyYWwoKSAuLi4gT1RHX2NhcGFibGUgYm9hcmRzCisJICogbmVlZCBib3RoIGhhbmRsZXMsIG90aGVyd2lzZSBqdXN0IG9uZSBzdWZmaWNlcy4KKwkgKi8KKwl0d2wtPmlycV9lbmFibGVkID0gdHJ1ZTsKKwlzdGF0dXMgPSByZXF1ZXN0X2lycSh0d2wtPmlycSwgdHdsNDAzMF91c2JfaXJxLAorCQkJSVJRRl9UUklHR0VSX0ZBTExJTkcgfCBJUlFGX1RSSUdHRVJfUklTSU5HLAorCQkJInR3bDQwMzBfdXNiIiwgdHdsKTsKKwlpZiAoc3RhdHVzIDwgMCkgeworCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJjYW4ndCBnZXQgSVJRICVkLCBlcnIgJWRcbiIsCisJCQl0d2wtPmlycSwgc3RhdHVzKTsKKwkJa2ZyZWUodHdsKTsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisKKwkvKiBUaGUgSVJRIGhhbmRsZXIganVzdCBoYW5kbGVzIGNoYW5nZXMgZnJvbSB0aGUgcHJldmlvdXMgc3RhdGVzCisJICogb2YgdGhlIElEIGFuZCBWQlVTIHBpbnMgLi4uIGluIHByb2JlKCkgd2UgbXVzdCBpbml0aWFsaXplIHRoYXQKKwkgKiBwcmV2aW91cyBzdGF0ZS4gIFRoZSBlYXN5IHdheTogIGZha2UgYW4gSVJRLgorCSAqCisJICogUkVWSVNJVDogIGEgcmVhbCBJUlEgbWlnaHQgaGF2ZSBoYXBwZW5lZCBhbHJlYWR5LCBpZiBQUkVFTVBUIGlzCisJICogZW5hYmxlZC4gIEVsc2UgdGhlIElSUSBtYXkgbm90IHlldCBiZSBjb25maWd1cmVkIG9yIGVuYWJsZWQsCisJICogYmVjYXVzZSBvZiBzY2hlZHVsaW5nIGRlbGF5cy4KKwkgKi8KKwl0d2w0MDMwX3VzYl9pcnEodHdsLT5pcnEsIHR3bCk7CisKKwlkZXZfaW5mbygmcGRldi0+ZGV2LCAiSW5pdGlhbGl6ZWQgVFdMNDAzMCBVU0IgbW9kdWxlXG4iKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2V4aXQgdHdsNDAzMF91c2JfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHR3bDQwMzBfdXNiICp0d2wgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlpbnQgdmFsOworCisJZnJlZV9pcnEodHdsLT5pcnEsIHR3bCk7CisJZGV2aWNlX3JlbW92ZV9maWxlKHR3bC0+ZGV2LCAmZGV2X2F0dHJfdmJ1cyk7CisKKwkvKiBzZXQgdHJhbnNjZWl2ZXIgbW9kZSB0byBwb3dlciBvbiBkZWZhdWx0cyAqLworCXR3bDQwMzBfdXNiX3NldF9tb2RlKHR3bCwgLTEpOworCisJLyogYXV0b2dhdGUgNjBNSHogVUxQSSBjbG9jaywKKwkgKiBjbGVhciBkcGxsIGNsb2NrIHJlcXVlc3QgZm9yIGkyYyBhY2Nlc3MsCisJICogZGlzYWJsZSAzMktIegorCSAqLworCXZhbCA9IHR3bDQwMzBfdXNiX3JlYWQodHdsLCBQSFlfQ0xLX0NUUkwpOworCWlmICh2YWwgPj0gMCkgeworCQl2YWwgfD0gUEhZX0NMS19DVFJMX0NMT0NLR0FUSU5HX0VOOworCQl2YWwgJj0gfihQSFlfQ0xLX0NUUkxfQ0xLMzJLX0VOIHwgUkVRX1BIWV9EUExMX0NMSyk7CisJCXR3bDQwMzBfdXNiX3dyaXRlKHR3bCwgUEhZX0NMS19DVFJMLCAodTgpdmFsKTsKKwl9CisKKwkvKiBkaXNhYmxlIGNvbXBsZXRlIE9URyBibG9jayAqLworCXR3bDQwMzBfdXNiX2NsZWFyX2JpdHModHdsLCBQT1dFUl9DVFJMLCBQT1dFUl9DVFJMX09UR19FTkFCKTsKKworCXR3bDQwMzBfcGh5X3Bvd2VyKHR3bCwgMCk7CisKKwlrZnJlZSh0d2wpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHR3bDQwMzBfdXNiX2RyaXZlciA9IHsKKwkucHJvYmUJCT0gdHdsNDAzMF91c2JfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2V4aXRfcCh0d2w0MDMwX3VzYl9yZW1vdmUpLAorCS5kcml2ZXIJCT0geworCQkubmFtZQk9ICJ0d2w0MDMwX3VzYiIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCX0sCit9OworCitzdGF0aWMgaW50IF9faW5pdCB0d2w0MDMwX3VzYl9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmdHdsNDAzMF91c2JfZHJpdmVyKTsKK30KK3N1YnN5c19pbml0Y2FsbCh0d2w0MDMwX3VzYl9pbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IHR3bDQwMzBfdXNiX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmdHdsNDAzMF91c2JfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KHR3bDQwMzBfdXNiX2V4aXQpOworCitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOnR3bDQwMzBfdXNiIik7CitNT0RVTEVfQVVUSE9SKCJUZXhhcyBJbnN0cnVtZW50cywgSW5jLCBOb2tpYSBDb3Jwb3JhdGlvbiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJUV0w0MDMwIFVTQiB0cmFuc2NlaXZlciBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9LY29uZmlnIGIvZHJpdmVycy91c2Ivc2VyaWFsL0tjb25maWcKaW5kZXggNzAzMzhmNC4uYjM2MWYwNSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL0tjb25maWcKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL0tjb25maWcKQEAgLTQ5Niw2ICs0OTYsMTQgQEAKIAlib29sICJVU0IgU2VjdXJlIEVuY2Fwc3VsYXRlZCBEcml2ZXIgLSBQYWRkZWQiCiAJZGVwZW5kcyBvbiBVU0JfU0VSSUFMX1NBRkUKIAorY29uZmlnIFVTQl9TRVJJQUxfU0lFTUVOU19NUEkKKwl0cmlzdGF0ZSAiVVNCIFNpZW1lbnMgTVBJIGRyaXZlciIKKwloZWxwCisJICBTYXkgTSBoZXJlIGlmIHlvdSB3YW50IHRvIHVzZSBhIFNpZW1lbnMgVVNCL01QSSBhZGFwdGVyLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBzaWVtZW5zX21waS4KKwogY29uZmlnIFVTQl9TRVJJQUxfU0lFUlJBV0lSRUxFU1MKIAl0cmlzdGF0ZSAiVVNCIFNpZXJyYSBXaXJlbGVzcyBEcml2ZXIiCiAJaGVscApAQCAtNTY1LDYgKzU3MywxNSBAQAogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCiAJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgb21uaW5ldC4KIAorY29uZmlnIFVTQl9TRVJJQUxfT1BUSUNPTgorCXRyaXN0YXRlICJVU0IgT3B0aWNvbiBCYXJjb2RlIGRyaXZlciAoc2VyaWFsIG1vZGUpIgorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gdXNlIGEgT3B0aWNvbiBVU0IgQmFyY29kZSBkZXZpY2UKKwkgIGluIHNlcmlhbCBlbXVsYXRpb24gbW9kZS4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgb3B0aWNvbi4KKwogY29uZmlnIFVTQl9TRVJJQUxfREVCVUcKIAl0cmlzdGF0ZSAiVVNCIERlYnVnZ2luZyBEZXZpY2UiCiAJaGVscApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL01ha2VmaWxlIGIvZHJpdmVycy91c2Ivc2VyaWFsL01ha2VmaWxlCmluZGV4IDYwNDdmODEuLmI3NWJlOTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvTWFrZWZpbGUKQEAgLTQxLDEwICs0MSwxMiBAQAogb2JqLSQoQ09ORklHX1VTQl9TRVJJQUxfTU9UT1JPTEEpCQkrPSBtb3RvX21vZGVtLm8KIG9iai0kKENPTkZJR19VU0JfU0VSSUFMX05BVk1BTikJCQkrPSBuYXZtYW4ubwogb2JqLSQoQ09ORklHX1VTQl9TRVJJQUxfT01OSU5FVCkJCSs9IG9tbmluZXQubworb2JqLSQoQ09ORklHX1VTQl9TRVJJQUxfT1BUSUNPTikJCSs9IG9wdGljb24ubwogb2JqLSQoQ09ORklHX1VTQl9TRVJJQUxfT1BUSU9OKQkJCSs9IG9wdGlvbi5vCiBvYmotJChDT05GSUdfVVNCX1NFUklBTF9PVEk2ODU4KQkJKz0gb3RpNjg1OC5vCiBvYmotJChDT05GSUdfVVNCX1NFUklBTF9QTDIzMDMpCQkJKz0gcGwyMzAzLm8KIG9iai0kKENPTkZJR19VU0JfU0VSSUFMX1NBRkUpCQkJKz0gc2FmZV9zZXJpYWwubworb2JqLSQoQ09ORklHX1VTQl9TRVJJQUxfU0lFTUVOU19NUEkpCQkrPSBzaWVtZW5zX21waS5vCiBvYmotJChDT05GSUdfVVNCX1NFUklBTF9TSUVSUkFXSVJFTEVTUykJCSs9IHNpZXJyYS5vCiBvYmotJChDT05GSUdfVVNCX1NFUklBTF9TUENQOFg1KQkJKz0gc3BjcDh4NS5vCiBvYmotJChDT05GSUdfVVNCX1NFUklBTF9USSkJCQkrPSB0aV91c2JfMzQxMF81MDUyLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9kaWdpX2FjY2VsZXBvcnQuYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9kaWdpX2FjY2VsZXBvcnQuYwppbmRleCA2OWY4NGYwLi4zOGJhNGVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvZGlnaV9hY2NlbGVwb3J0LmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL2RpZ2lfYWNjZWxlcG9ydC5jCkBAIC02MzUsOCArNjM1LDcgQEAKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZvb2JfcHJpdi0+ZHBfcG9ydF9sb2NrLCBmbGFncyk7CiAJd2hpbGUgKGNvdW50ID4gMCkgewotCQl3aGlsZSAob29iX3BvcnQtPndyaXRlX3VyYi0+c3RhdHVzID09IC1FSU5QUk9HUkVTUwotCQkJfHwgb29iX3ByaXYtPmRwX3dyaXRlX3VyYl9pbl91c2UpIHsKKwkJd2hpbGUgKG9vYl9wcml2LT5kcF93cml0ZV91cmJfaW5fdXNlKSB7CiAJCQljb25kX3dhaXRfaW50ZXJydXB0aWJsZV90aW1lb3V0X2lycXJlc3RvcmUoCiAJCQkJJm9vYl9wb3J0LT53cml0ZV93YWl0LCBESUdJX1JFVFJZX1RJTUVPVVQsCiAJCQkJJm9vYl9wcml2LT5kcF9wb3J0X2xvY2ssIGZsYWdzKTsKQEAgLTY5OSw5ICs2OTgsOCBAQAogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmRwX3BvcnRfbG9jaywgZmxhZ3MpOwogCXdoaWxlIChjb3VudCA+IDAgJiYgcmV0ID09IDApIHsKLQkJd2hpbGUgKChwb3J0LT53cml0ZV91cmItPnN0YXR1cyA9PSAtRUlOUFJPR1JFU1MKLQkJCQl8fCBwcml2LT5kcF93cml0ZV91cmJfaW5fdXNlKQotCQkJCQkmJiB0aW1lX2JlZm9yZShqaWZmaWVzLCB0aW1lb3V0KSkgeworCQl3aGlsZSAocHJpdi0+ZHBfd3JpdGVfdXJiX2luX3VzZSAmJgorCQkgICAgICAgdGltZV9iZWZvcmUoamlmZmllcywgdGltZW91dCkpIHsKIAkJCWNvbmRfd2FpdF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXRfaXJxcmVzdG9yZSgKIAkJCQkmcG9ydC0+d3JpdGVfd2FpdCwgRElHSV9SRVRSWV9USU1FT1VULAogCQkJCSZwcml2LT5kcF9wb3J0X2xvY2ssIGZsYWdzKTsKQEAgLTc3OSw4ICs3NzcsNyBAQAogCXNwaW5fbG9ja19pcnFzYXZlKCZvb2JfcHJpdi0+ZHBfcG9ydF9sb2NrLCBmbGFncyk7CiAJc3Bpbl9sb2NrKCZwb3J0X3ByaXYtPmRwX3BvcnRfbG9jayk7CiAKLQl3aGlsZSAob29iX3BvcnQtPndyaXRlX3VyYi0+c3RhdHVzID09IC1FSU5QUk9HUkVTUyB8fAotCQkJCQlvb2JfcHJpdi0+ZHBfd3JpdGVfdXJiX2luX3VzZSkgeworCXdoaWxlIChvb2JfcHJpdi0+ZHBfd3JpdGVfdXJiX2luX3VzZSkgewogCQlzcGluX3VubG9jaygmcG9ydF9wcml2LT5kcF9wb3J0X2xvY2spOwogCQljb25kX3dhaXRfaW50ZXJydXB0aWJsZV90aW1lb3V0X2lycXJlc3RvcmUoCiAJCQkmb29iX3BvcnQtPndyaXRlX3dhaXQsIERJR0lfUkVUUllfVElNRU9VVCwKQEAgLTExNjgsMTIgKzExNjUsMTAgQEAKIAogCS8qIGJlIHN1cmUgb25seSBvbmUgd3JpdGUgcHJvY2VlZHMgYXQgYSB0aW1lICovCiAJLyogdGhlcmUgYXJlIHJhY2VzIG9uIHRoZSBwb3J0IHByaXZhdGUgYnVmZmVyICovCi0JLyogYW5kIHJhY2VzIHRvIGNoZWNrIHdyaXRlX3VyYi0+c3RhdHVzICovCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmRwX3BvcnRfbG9jaywgZmxhZ3MpOwogCiAJLyogd2FpdCBmb3IgdXJiIHN0YXR1cyBjbGVhciB0byBzdWJtaXQgYW5vdGhlciB1cmIgKi8KLQlpZiAocG9ydC0+d3JpdGVfdXJiLT5zdGF0dXMgPT0gLUVJTlBST0dSRVNTIHx8Ci0JCQkJCXByaXYtPmRwX3dyaXRlX3VyYl9pbl91c2UpIHsKKwlpZiAocHJpdi0+ZHBfd3JpdGVfdXJiX2luX3VzZSkgewogCQkvKiBidWZmZXIgZGF0YSBpZiBjb3VudCBpcyAxIChwcm9iYWJseSBwdXRfY2hhcikgaWYgcG9zc2libGUgKi8KIAkJaWYgKGNvdW50ID09IDEgJiYgcHJpdi0+ZHBfb3V0X2J1Zl9sZW4gPCBESUdJX09VVF9CVUZfU0laRSkgewogCQkJcHJpdi0+ZHBfb3V0X2J1Zltwcml2LT5kcF9vdXRfYnVmX2xlbisrXSA9ICpidWY7CkBAIC0xMjM2LDcgKzEyMzEsNyBAQAogCWludCByZXQgPSAwOwogCWludCBzdGF0dXMgPSB1cmItPnN0YXR1czsKIAotCWRiZygiZGlnaV93cml0ZV9idWxrX2NhbGxiYWNrOiBUT1AsIHVyYi0+c3RhdHVzPSVkIiwgc3RhdHVzKTsKKwlkYmcoImRpZ2lfd3JpdGVfYnVsa19jYWxsYmFjazogVE9QLCBzdGF0dXM9JWQiLCBzdGF0dXMpOwogCiAJLyogcG9ydCBhbmQgc2VyaWFsIHNhbml0eSBjaGVjayAqLwogCWlmIChwb3J0ID09IE5VTEwgfHwgKHByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCkpID09IE5VTEwpIHsKQEAgLTEyNjYsOCArMTI2MSw3IEBACiAJLyogdHJ5IHRvIHNlbmQgYW55IGJ1ZmZlcmVkIGRhdGEgb24gdGhpcyBwb3J0LCBpZiBpdCBpcyBvcGVuICovCiAJc3Bpbl9sb2NrKCZwcml2LT5kcF9wb3J0X2xvY2spOwogCXByaXYtPmRwX3dyaXRlX3VyYl9pbl91c2UgPSAwOwotCWlmIChwb3J0LT5wb3J0LmNvdW50ICYmIHBvcnQtPndyaXRlX3VyYi0+c3RhdHVzICE9IC1FSU5QUk9HUkVTUwotCSAgICAmJiBwcml2LT5kcF9vdXRfYnVmX2xlbiA+IDApIHsKKwlpZiAocG9ydC0+cG9ydC5jb3VudCAmJiBwcml2LT5kcF9vdXRfYnVmX2xlbiA+IDApIHsKIAkJKigodW5zaWduZWQgY2hhciAqKShwb3J0LT53cml0ZV91cmItPnRyYW5zZmVyX2J1ZmZlcikpCiAJCQk9ICh1bnNpZ25lZCBjaGFyKURJR0lfQ01EX1NFTkRfREFUQTsKIAkJKigodW5zaWduZWQgY2hhciAqKShwb3J0LT53cml0ZV91cmItPnRyYW5zZmVyX2J1ZmZlcikgKyAxKQpAQCAtMTMwNSw4ICsxMjk5LDcgQEAKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5kcF9wb3J0X2xvY2ssIGZsYWdzKTsKIAotCWlmIChwb3J0LT53cml0ZV91cmItPnN0YXR1cyA9PSAtRUlOUFJPR1JFU1MgfHwKLQkJCQkJcHJpdi0+ZHBfd3JpdGVfdXJiX2luX3VzZSkKKwlpZiAocHJpdi0+ZHBfd3JpdGVfdXJiX2luX3VzZSkKIAkJcm9vbSA9IDA7CiAJZWxzZQogCQlyb29tID0gcG9ydC0+YnVsa19vdXRfc2l6ZSAtIDIgLSBwcml2LT5kcF9vdXRfYnVmX2xlbjsKQEAgLTEzMjIsOCArMTMxNSw3IEBACiAJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IHR0eS0+ZHJpdmVyX2RhdGE7CiAJc3RydWN0IGRpZ2lfcG9ydCAqcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKIAotCWlmIChwb3J0LT53cml0ZV91cmItPnN0YXR1cyA9PSAtRUlOUFJPR1JFU1MKLQkgICAgfHwgcHJpdi0+ZHBfd3JpdGVfdXJiX2luX3VzZSkgeworCWlmIChwcml2LT5kcF93cml0ZV91cmJfaW5fdXNlKSB7CiAJCWRiZygiZGlnaV9jaGFyc19pbl9idWZmZXI6IHBvcnQ9JWQsIGNoYXJzPSVkIiwKIAkJCXByaXYtPmRwX3BvcnRfbnVtLCBwb3J0LT5idWxrX291dF9zaXplIC0gMik7CiAJCS8qIHJldHVybihwb3J0LT5idWxrX291dF9zaXplIC0gMik7ICovCkBAIC0xNzAyLDcgKzE2OTQsNyBAQAogCS8qIHNob3J0L211bHRpcGxlIHBhY2tldCBjaGVjayAqLwogCWlmICh1cmItPmFjdHVhbF9sZW5ndGggIT0gbGVuICsgMikgewogCQlkZXZfZXJyKCZwb3J0LT5kZXYsICIlczogSU5DT01QTEVURSBPUiBNVUxUSVBMRSBQQUNLRVQsICIKLQkJCSJ1cmItPnN0YXR1cz0lZCwgcG9ydD0lZCwgb3Bjb2RlPSVkLCBsZW49JWQsICIKKwkJCSJzdGF0dXM9JWQsIHBvcnQ9JWQsIG9wY29kZT0lZCwgbGVuPSVkLCAiCiAJCQkiYWN0dWFsX2xlbmd0aD0lZCwgc3RhdHVzPSVkXG4iLCBfX2Z1bmNfXywgc3RhdHVzLAogCQkJcHJpdi0+ZHBfcG9ydF9udW0sIG9wY29kZSwgbGVuLCB1cmItPmFjdHVhbF9sZW5ndGgsCiAJCQlwb3J0X3N0YXR1cyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvZ2FybWluX2dwcy5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL2dhcm1pbl9ncHMuYwppbmRleCA4ZTZhNjZlLi5hMjZhMGUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvZ2FybWluX2dwcy5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9nYXJtaW5fZ3BzLmMKQEAgLTEwNTYsNyArMTA1Niw3IEBACiAKIAkJaWYgKHN0YXR1cykgewogCQkJZGJnKCIlcyAtIG5vbnplcm8gd3JpdGUgYnVsayBzdGF0dXMgcmVjZWl2ZWQ6ICVkIiwKLQkJCSAgICBfX2Z1bmNfXywgdXJiLT5zdGF0dXMpOworCQkJICAgIF9fZnVuY19fLCBzdGF0dXMpOwogCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmdhcm1pbl9kYXRhX3AtPmxvY2ssIGZsYWdzKTsKIAkJCWdhcm1pbl9kYXRhX3AtPmZsYWdzIHw9IENMRUFSX0hBTFRfUkVRVUlSRUQ7CiAJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZnYXJtaW5fZGF0YV9wLT5sb2NrLCBmbGFncyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvaXB3LmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvaXB3LmMKaW5kZXggM2FjNTlhOC4uZjUzMDAzMiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL2lwdy5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9pcHcuYwpAQCAtNDczLDcgKzQ3Myw3IEBACiAKIAogCi1zdGF0aWMgaW50IHVzYl9pcHdfaW5pdCh2b2lkKQorc3RhdGljIGludCBfX2luaXQgdXNiX2lwd19pbml0KHZvaWQpCiB7CiAJaW50IHJldHZhbDsKIApAQCAtNDkwLDcgKzQ5MCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIHVzYl9pcHdfZXhpdCh2b2lkKQorc3RhdGljIHZvaWQgX19leGl0IHVzYl9pcHdfZXhpdCh2b2lkKQogewogCXVzYl9kZXJlZ2lzdGVyKCZ1c2JfaXB3X2RyaXZlcik7CiAJdXNiX3NlcmlhbF9kZXJlZ2lzdGVyKCZpcHdfZGV2aWNlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9pdXVfcGhvZW5peC5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL2l1dV9waG9lbml4LmMKaW5kZXggZTMyMDk3Mi4uMjMxNGM2YSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL2l1dV9waG9lbml4LmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL2l1dV9waG9lbml4LmMKQEAgLTE5MCwxMCArMTkwLDEyIEBACiB7CiAJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IHVyYi0+Y29udGV4dDsKIAlpbnQgcmVzdWx0OworCWludCBzdGF0dXMgPSB1cmItPnN0YXR1czsKKwogCWRiZygiJXMgLSBlbnRlciIsIF9fZnVuY19fKTsKIAotCWlmICh1cmItPnN0YXR1cykgewotCQlkYmcoIiVzIC0gdXJiLT5zdGF0dXMgPSAlZCIsIF9fZnVuY19fLCB1cmItPnN0YXR1cyk7CisJaWYgKHN0YXR1cykgeworCQlkYmcoIiVzIC0gc3RhdHVzID0gJWQiLCBfX2Z1bmNfXywgc3RhdHVzKTsKIAkJLyogZXJyb3Igc3RvcCBhbGwgKi8KIAkJcmV0dXJuOwogCX0KQEAgLTI0NSwxMCArMjQ3LDEyIEBACiAJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IHVyYi0+Y29udGV4dDsKIAlzdHJ1Y3QgaXV1X3ByaXZhdGUgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CiAJdTggKnN0OworCWludCBzdGF0dXMgPSB1cmItPnN0YXR1czsKKwogCWRiZygiJXMgLSBlbnRlciIsIF9fZnVuY19fKTsKIAotCWlmICh1cmItPnN0YXR1cykgewotCQlkYmcoIiVzIC0gdXJiLT5zdGF0dXMgPSAlZCIsIF9fZnVuY19fLCB1cmItPnN0YXR1cyk7CisJaWYgKHN0YXR1cykgeworCQlkYmcoIiVzIC0gc3RhdHVzID0gJWQiLCBfX2Z1bmNfXywgc3RhdHVzKTsKIAkJLyogZXJyb3Igc3RvcCBhbGwgKi8KIAkJcmV0dXJuOwogCX0KQEAgLTI3NCw5ICsyNzgsOSBAQAogewogCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSB1cmItPmNvbnRleHQ7CiAJaW50IHJlc3VsdDsKLQlkYmcoIiVzIC0gZW50ZXIiLCBfX2Z1bmNfXyk7CisJaW50IHN0YXR1cyA9IHVyYi0+c3RhdHVzOwogCi0JZGJnKCIlcyAtIHVyYi0+c3RhdHVzID0gJWQiLCBfX2Z1bmNfXywgdXJiLT5zdGF0dXMpOworCWRiZygiJXMgLSBzdGF0dXMgPSAlZCIsIF9fZnVuY19fLCBzdGF0dXMpOwogCXVzYl9maWxsX2J1bGtfdXJiKHBvcnQtPnJlYWRfdXJiLCBwb3J0LT5zZXJpYWwtPmRldiwKIAkJCSAgdXNiX3JjdmJ1bGtwaXBlKHBvcnQtPnNlcmlhbC0+ZGV2LAogCQkJCQkgIHBvcnQtPmJ1bGtfaW5fZW5kcG9pbnRBZGRyZXNzKSwKQEAgLTYxOCwxMSArNjIyLDEyIEBACiAJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IHVyYi0+Y29udGV4dDsKIAl1bnNpZ25lZCBjaGFyICpkYXRhID0gdXJiLT50cmFuc2Zlcl9idWZmZXI7CiAJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKLQlkYmcoIiVzIC0gdXJiLT5zdGF0dXMgPSAlZCIsIF9fZnVuY19fLCB1cmItPnN0YXR1cyk7CisJaW50IHN0YXR1cyA9IHVyYi0+c3RhdHVzOwogCi0JaWYgKHVyYi0+c3RhdHVzKSB7Ci0JCWRiZygiJXMgLSB1cmItPnN0YXR1cyA9ICVkIiwgX19mdW5jX18sIHVyYi0+c3RhdHVzKTsKLQkJaWYgKHVyYi0+c3RhdHVzID09IC1FUFJPVE8pIHsKKwlkYmcoIiVzIC0gc3RhdHVzID0gJWQiLCBfX2Z1bmNfXywgc3RhdHVzKTsKKworCWlmIChzdGF0dXMpIHsKKwkJaWYgKHN0YXR1cyA9PSAtRVBST1RPKSB7CiAJCQkvKiByZXNjaGVkdWxlIG5lZWRlZCAqLwogCQl9CiAJCXJldHVybjsKQEAgLTY5NSw3ICs3MDAsNyBAQAogCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSB1cmItPmNvbnRleHQ7CiAJc3RydWN0IGl1dV9wcml2YXRlICpwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IHN0YXR1czsKKwlpbnQgc3RhdHVzID0gdXJiLT5zdGF0dXM7CiAJaW50IGVycm9yID0gMDsKIAlpbnQgbGVuID0gMDsKIAl1bnNpZ25lZCBjaGFyICpkYXRhID0gdXJiLT50cmFuc2Zlcl9idWZmZXI7CkBAIC03MDMsOCArNzA4LDggQEAKIAogCWRiZygiJXMgLSBlbnRlciIsIF9fZnVuY19fKTsKIAotCWlmICh1cmItPnN0YXR1cykgewotCQlkYmcoIiVzIC0gdXJiLT5zdGF0dXMgPSAlZCIsIF9fZnVuY19fLCB1cmItPnN0YXR1cyk7CisJaWYgKHN0YXR1cykgeworCQlkYmcoIiVzIC0gc3RhdHVzID0gJWQiLCBfX2Z1bmNfXywgc3RhdHVzKTsKIAkJLyogZXJyb3Igc3RvcCBhbGwgKi8KIAkJcmV0dXJuOwogCX0KQEAgLTc4MiwxMiArNzg3LDExIEBACiB7CiAJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IHVyYi0+Y29udGV4dDsKIAlpbnQgcmVzdWx0OwotCWRiZygiJXMgLSBlbnRlciIsIF9fZnVuY19fKTsKKwlpbnQgc3RhdHVzID0gdXJiLT5zdGF0dXM7CiAKLQlkYmcoIiVzIC0gdXJiLT5zdGF0dXMgPSAlZCIsIF9fZnVuY19fLCB1cmItPnN0YXR1cyk7CisJZGJnKCIlcyAtIHN0YXR1cyA9ICVkIiwgX19mdW5jX18sIHN0YXR1cyk7CiAKLQlpZiAodXJiLT5zdGF0dXMpIHsKLQkJZGJnKCIlcyAtIHVyYi0+c3RhdHVzID0gJWQiLCBfX2Z1bmNfXywgdXJiLT5zdGF0dXMpOworCWlmIChzdGF0dXMpIHsKIAkJLyogZXJyb3Igc3RvcCBhbGwgKi8KIAkJcmV0dXJuOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9tb3M3ODQwLmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvbW9zNzg0MC5jCmluZGV4IDk2YThjNzcuLjJjMjBlODggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9tb3M3ODQwLmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL21vczc4NDAuYwpAQCAtMjE0LDYgKzIxNCw3IEBACiAJc3BpbmxvY2tfdCBwb29sX2xvY2s7CiAJc3RydWN0IHVyYiAqd3JpdGVfdXJiX3Bvb2xbTlVNX1VSQlNdOwogCWNoYXIgYnVzeVtOVU1fVVJCU107CisJYm9vbCByZWFkX3VyYl9idXN5OwogfTsKIAogCkBAIC02NzksMjYgKzY4MCwzMCBAQAogCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CiAJaW50IHN0YXR1cyA9IHVyYi0+c3RhdHVzOwogCi0JaWYgKHN0YXR1cykgewotCQlkYmcoIm5vbnplcm8gcmVhZCBidWxrIHN0YXR1cyByZWNlaXZlZDogJWQiLCBzdGF0dXMpOwotCQlyZXR1cm47Ci0JfQotCiAJbW9zNzg0MF9wb3J0ID0gdXJiLT5jb250ZXh0OwogCWlmICghbW9zNzg0MF9wb3J0KSB7CiAJCWRiZygiJXMiLCAiTlVMTCBtb3M3ODQwX3BvcnQgcG9pbnRlciBcbiIpOworCQltb3M3ODQwX3BvcnQtPnJlYWRfdXJiX2J1c3kgPSBmYWxzZTsKKwkJcmV0dXJuOworCX0KKworCWlmIChzdGF0dXMpIHsKKwkJZGJnKCJub256ZXJvIHJlYWQgYnVsayBzdGF0dXMgcmVjZWl2ZWQ6ICVkIiwgc3RhdHVzKTsKKwkJbW9zNzg0MF9wb3J0LT5yZWFkX3VyYl9idXN5ID0gZmFsc2U7CiAJCXJldHVybjsKIAl9CiAKIAlwb3J0ID0gKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKiltb3M3ODQwX3BvcnQtPnBvcnQ7CiAJaWYgKG1vczc4NDBfcG9ydF9wYXJhbm9pYV9jaGVjayhwb3J0LCBfX2Z1bmNfXykpIHsKIAkJZGJnKCIlcyIsICJQb3J0IFBhcmFub2lhIGZhaWxlZCBcbiIpOworCQltb3M3ODQwX3BvcnQtPnJlYWRfdXJiX2J1c3kgPSBmYWxzZTsKIAkJcmV0dXJuOwogCX0KIAogCXNlcmlhbCA9IG1vczc4NDBfZ2V0X3VzYl9zZXJpYWwocG9ydCwgX19mdW5jX18pOwogCWlmICghc2VyaWFsKSB7CiAJCWRiZygiJXNcbiIsICJCYWQgc2VyaWFsIHBvaW50ZXIgIik7CisJCW1vczc4NDBfcG9ydC0+cmVhZF91cmJfYnVzeSA9IGZhbHNlOwogCQlyZXR1cm47CiAJfQogCkBAIC03MjUsMTcgKzczMCwxOSBAQAogCiAJaWYgKCFtb3M3ODQwX3BvcnQtPnJlYWRfdXJiKSB7CiAJCWRiZygiJXMiLCAiVVJCIEtJTExFRCAhISFcbiIpOworCQltb3M3ODQwX3BvcnQtPnJlYWRfdXJiX2J1c3kgPSBmYWxzZTsKIAkJcmV0dXJuOwogCX0KIAogCiAJbW9zNzg0MF9wb3J0LT5yZWFkX3VyYi0+ZGV2ID0gc2VyaWFsLT5kZXY7CiAKKwltb3M3ODQwX3BvcnQtPnJlYWRfdXJiX2J1c3kgPSB0cnVlOwogCXJldHZhbCA9IHVzYl9zdWJtaXRfdXJiKG1vczc4NDBfcG9ydC0+cmVhZF91cmIsIEdGUF9BVE9NSUMpOwogCiAJaWYgKHJldHZhbCkgewotCQlkYmcoIiB1c2Jfc3VibWl0X3VyYihyZWFkIGJ1bGspIGZhaWxlZCwgcmV0dmFsID0gJWQiLAotCQkgcmV0dmFsKTsKKwkJZGJnKCJ1c2Jfc3VibWl0X3VyYihyZWFkIGJ1bGspIGZhaWxlZCwgcmV0dmFsID0gJWQiLCByZXR2YWwpOworCQltb3M3ODQwX3BvcnQtPnJlYWRfdXJiX2J1c3kgPSBmYWxzZTsKIAl9CiB9CiAKQEAgLTEwNTUsMTAgKzEwNjIsMTIgQEAKIAogCWRiZygibW9zNzg0MF9vcGVuOiBidWxraW4gZW5kcG9pbnQgaXMgJWRcbiIsCiAJICAgIHBvcnQtPmJ1bGtfaW5fZW5kcG9pbnRBZGRyZXNzKTsKKwltb3M3ODQwX3BvcnQtPnJlYWRfdXJiX2J1c3kgPSB0cnVlOwogCXJlc3BvbnNlID0gdXNiX3N1Ym1pdF91cmIobW9zNzg0MF9wb3J0LT5yZWFkX3VyYiwgR0ZQX0tFUk5FTCk7CiAJaWYgKHJlc3BvbnNlKSB7CiAJCWRldl9lcnIoJnBvcnQtPmRldiwgIiVzIC0gRXJyb3IgJWQgc3VibWl0dGluZyBjb250cm9sIHVyYlxuIiwKIAkJCV9fZnVuY19fLCByZXNwb25zZSk7CisJCW1vczc4NDBfcG9ydC0+cmVhZF91cmJfYnVzeSA9IGZhbHNlOwogCX0KIAogCS8qIGluaXRpYWxpemUgb3VyIHdhaXQgcXVldWVzICovCkBAIC0xMjI3LDYgKzEyMzYsNyBAQAogCQlpZiAobW9zNzg0MF9wb3J0LT5yZWFkX3VyYikgewogCQkJZGJnKCIlcyIsICJTaHV0ZG93biBidWxrIHJlYWRcbiIpOwogCQkJdXNiX2tpbGxfdXJiKG1vczc4NDBfcG9ydC0+cmVhZF91cmIpOworCQkJbW9zNzg0MF9wb3J0LT5yZWFkX3VyYl9idXN5ID0gZmFsc2U7CiAJCX0KIAkJaWYgKCgmbW9zNzg0MF9wb3J0LT5jb250cm9sX3VyYikpIHsKIAkJCWRiZygiJXMiLCAiU2h1dGRvd24gY29udHJvbCByZWFkXG4iKTsKQEAgLTIwNDMsMTQgKzIwNTMsMTQgQEAKIAlEYXRhID0gMHgwYzsKIAltb3M3ODQwX3NldF91YXJ0X3JlZyhwb3J0LCBJTlRFUlJVUFRfRU5BQkxFX1JFR0lTVEVSLCBEYXRhKTsKIAotCWlmIChtb3M3ODQwX3BvcnQtPnJlYWRfdXJiLT5zdGF0dXMgIT0gLUVJTlBST0dSRVNTKSB7CisJaWYgKG1vczc4NDBfcG9ydC0+cmVhZF91cmJfYnVzeSA9PSBmYWxzZSkgewogCQltb3M3ODQwX3BvcnQtPnJlYWRfdXJiLT5kZXYgPSBzZXJpYWwtPmRldjsKLQorCQltb3M3ODQwX3BvcnQtPnJlYWRfdXJiX2J1c3kgPSB0cnVlOwogCQlzdGF0dXMgPSB1c2Jfc3VibWl0X3VyYihtb3M3ODQwX3BvcnQtPnJlYWRfdXJiLCBHRlBfQVRPTUlDKTsKLQogCQlpZiAoc3RhdHVzKSB7Ci0JCQlkYmcoIiB1c2Jfc3VibWl0X3VyYihyZWFkIGJ1bGspIGZhaWxlZCwgc3RhdHVzID0gJWQiLAorCQkJZGJnKCJ1c2Jfc3VibWl0X3VyYihyZWFkIGJ1bGspIGZhaWxlZCwgc3RhdHVzID0gJWQiLAogCQkJICAgIHN0YXR1cyk7CisJCQltb3M3ODQwX3BvcnQtPnJlYWRfdXJiX2J1c3kgPSBmYWxzZTsKIAkJfQogCX0KIAl3YWtlX3VwKCZtb3M3ODQwX3BvcnQtPmRlbHRhX21zcl93YWl0KTsKQEAgLTIxMTcsMTIgKzIxMjcsMTQgQEAKIAkJcmV0dXJuOwogCX0KIAotCWlmIChtb3M3ODQwX3BvcnQtPnJlYWRfdXJiLT5zdGF0dXMgIT0gLUVJTlBST0dSRVNTKSB7CisJaWYgKG1vczc4NDBfcG9ydC0+cmVhZF91cmJfYnVzeSA9PSBmYWxzZSkgewogCQltb3M3ODQwX3BvcnQtPnJlYWRfdXJiLT5kZXYgPSBzZXJpYWwtPmRldjsKKwkJbW9zNzg0MF9wb3J0LT5yZWFkX3VyYl9idXN5ID0gdHJ1ZTsKIAkJc3RhdHVzID0gdXNiX3N1Ym1pdF91cmIobW9zNzg0MF9wb3J0LT5yZWFkX3VyYiwgR0ZQX0FUT01JQyk7CiAJCWlmIChzdGF0dXMpIHsKLQkJCWRiZygiIHVzYl9zdWJtaXRfdXJiKHJlYWQgYnVsaykgZmFpbGVkLCBzdGF0dXMgPSAlZCIsCisJCQlkYmcoInVzYl9zdWJtaXRfdXJiKHJlYWQgYnVsaykgZmFpbGVkLCBzdGF0dXMgPSAlZCIsCiAJCQkgICAgc3RhdHVzKTsKKwkJCW1vczc4NDBfcG9ydC0+cmVhZF91cmJfYnVzeSA9IGZhbHNlOwogCQl9CiAJfQogCXJldHVybjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9vcHRpY29uLmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvb3B0aWNvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlYTMyNmYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvb3B0aWNvbi5jCkBAIC0wLDAgKzEsMzU4IEBACisvKgorICogT3B0aWNvbiBVU0IgYmFyY29kZSB0byBzZXJpYWwgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4IEdyZWcgS3JvYWgtSGFydG1hbiA8Z3JlZ2toQHN1c2UuZGU+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDggTm92ZWxsIEluYy4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKgkyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvdHR5Lmg+CisjaW5jbHVkZSA8bGludXgvdHR5X2RyaXZlci5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eV9mbGlwLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdXNiLmg+CisjaW5jbHVkZSA8bGludXgvdXNiL3NlcmlhbC5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKworc3RhdGljIGludCBkZWJ1ZzsKKworc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2lkIGlkX3RhYmxlW10gPSB7CisJeyBVU0JfREVWSUNFKDB4MDY1YSwgMHgwMDA5KSB9LAorCXsgfSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHVzYiwgaWRfdGFibGUpOworCisvKiBUaGlzIHN0cnVjdHVyZSBob2xkcyBhbGwgb2YgdGhlIGluZGl2aWR1YWwgZGV2aWNlIGluZm9ybWF0aW9uICovCitzdHJ1Y3Qgb3B0aWNvbl9wcml2YXRlIHsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldjsKKwlzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsOworCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQ7CisJdW5zaWduZWQgY2hhciAqYnVsa19pbl9idWZmZXI7CisJc3RydWN0IHVyYiAqYnVsa19yZWFkX3VyYjsKKwlpbnQgYnVmZmVyX3NpemU7CisJdTggYnVsa19hZGRyZXNzOworCXNwaW5sb2NrX3QgbG9jazsJLyogcHJvdGVjdHMgdGhlIGZvbGxvd2luZyBmbGFncyAqLworCWJvb2wgdGhyb3R0bGVkOworCWJvb2wgYWN0dWFsbHlfdGhyb3R0bGVkOworCWJvb2wgcnRzOworfTsKKworc3RhdGljIHZvaWQgb3B0aWNvbl9idWxrX2NhbGxiYWNrKHN0cnVjdCB1cmIgKnVyYikKK3sKKwlzdHJ1Y3Qgb3B0aWNvbl9wcml2YXRlICpwcml2ID0gdXJiLT5jb250ZXh0OworCXVuc2lnbmVkIGNoYXIgKmRhdGEgPSB1cmItPnRyYW5zZmVyX2J1ZmZlcjsKKwlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gcHJpdi0+cG9ydDsKKwlpbnQgc3RhdHVzID0gdXJiLT5zdGF0dXM7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKKwlpbnQgcmVzdWx0OworCWludCBhdmFpbGFibGVfcm9vbSA9IDA7CisJaW50IGRhdGFfbGVuZ3RoOworCisJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKKworCXN3aXRjaCAoc3RhdHVzKSB7CisJY2FzZSAwOgorCQkvKiBzdWNjZXNzICovCisJCWJyZWFrOworCWNhc2UgLUVDT05OUkVTRVQ6CisJY2FzZSAtRU5PRU5UOgorCWNhc2UgLUVTSFVURE9XTjoKKwkJLyogdGhpcyB1cmIgaXMgdGVybWluYXRlZCwgY2xlYW4gdXAgKi8KKwkJZGJnKCIlcyAtIHVyYiBzaHV0dGluZyBkb3duIHdpdGggc3RhdHVzOiAlZCIsCisJCSAgICBfX2Z1bmNfXywgc3RhdHVzKTsKKwkJcmV0dXJuOworCWRlZmF1bHQ6CisJCWRiZygiJXMgLSBub256ZXJvIHVyYiBzdGF0dXMgcmVjZWl2ZWQ6ICVkIiwKKwkJICAgIF9fZnVuY19fLCBzdGF0dXMpOworCQlnb3RvIGV4aXQ7CisJfQorCisJdXNiX3NlcmlhbF9kZWJ1Z19kYXRhKGRlYnVnLCAmcG9ydC0+ZGV2LCBfX2Z1bmNfXywgdXJiLT5hY3R1YWxfbGVuZ3RoLAorCQkJICAgICAgZGF0YSk7CisKKwlpZiAodXJiLT5hY3R1YWxfbGVuZ3RoID4gMikgeworCQlkYXRhX2xlbmd0aCA9IHVyYi0+YWN0dWFsX2xlbmd0aCAtIDI7CisKKwkJLyoKKwkJICogRGF0YSBmcm9tIHRoZSBkZXZpY2UgY29tZXMgd2l0aCBhIDIgYnl0ZSBoZWFkZXI6CisJCSAqCisJCSAqIDwweDAwPjwweDAwPmRhdGEuLi4KKwkJICogCVRoaXMgaXMgcmVhbCBkYXRhIHRvIGJlIHNlbnQgdG8gdGhlIHR0eSBsYXllcgorCQkgKiA8MHgwMD48MHgwMSlsZXZlbAorCQkgKiAJVGhpcyBpcyBhIFJUUyBsZXZlbCBjaGFuZ2UsIHRoZSB0aGlyZCBieXRlIGlzIHRoZSBSVFMKKwkJICogCXZhbHVlICgwIGZvciBsb3csIDEgZm9yIGhpZ2gpLgorCQkgKi8KKwkJaWYgKChkYXRhWzBdID09IDB4MDApICYmIChkYXRhWzFdID09IDB4MDApKSB7CisJCQkvKiByZWFsIGRhdGEsIHNlbmQgaXQgdG8gdGhlIHR0eSBsYXllciAqLworCQkJdHR5ID0gdHR5X3BvcnRfdHR5X2dldCgmcG9ydC0+cG9ydCk7CisJCQlpZiAodHR5KSB7CisJCQkJYXZhaWxhYmxlX3Jvb20gPSB0dHlfYnVmZmVyX3JlcXVlc3Rfcm9vbSh0dHksCisJCQkJCQkJCWRhdGFfbGVuZ3RoKTsKKwkJCQlpZiAoYXZhaWxhYmxlX3Jvb20pIHsKKwkJCQkJdHR5X2luc2VydF9mbGlwX3N0cmluZyh0dHksIGRhdGEsCisJCQkJCQkJICAgICAgIGF2YWlsYWJsZV9yb29tKTsKKwkJCQkJdHR5X2ZsaXBfYnVmZmVyX3B1c2godHR5KTsKKwkJCQl9CisJCQkJdHR5X2tyZWZfcHV0KHR0eSk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAoKGRhdGFbMF0gPT0gMHgwMCkgJiYgKGRhdGFbMV0gPT0gMHgwMSkpIHsKKwkJCQlpZiAoZGF0YVsyXSA9PSAweDAwKQorCQkJCQlwcml2LT5ydHMgPSBmYWxzZTsKKwkJCQllbHNlCisJCQkJCXByaXYtPnJ0cyA9IHRydWU7CisJCQkJLyogRklYTUUgY2hhbmdlIHRoZSBSVFMgbGV2ZWwgKi8KKwkJCX0gZWxzZSB7CisJCQlkZXZfZGJnKCZwcml2LT51ZGV2LT5kZXYsCisJCQkJIlVua25vd24gZGF0YSBwYWNrZXQgcmVjZWl2ZWQgZnJvbSB0aGUgZGV2aWNlOiIKKwkJCQkiICUyeCAlMnhcbiIsCisJCQkJZGF0YVswXSwgZGF0YVsxXSk7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlkZXZfZGJnKCZwcml2LT51ZGV2LT5kZXYsCisJCQkiSW1wcm9wZXIgYW1tb3VudCBvZiBkYXRhIHJlY2VpdmVkIGZyb20gdGhlIGRldmljZSwgIgorCQkJIiVkIGJ5dGVzIiwgdXJiLT5hY3R1YWxfbGVuZ3RoKTsKKwl9CisKK2V4aXQ6CisJc3Bpbl9sb2NrKCZwcml2LT5sb2NrKTsKKworCS8qIENvbnRpbnVlIHRyeWluZyB0byBhbHdheXMgcmVhZCBpZiB3ZSBzaG91bGQgKi8KKwlpZiAoIXByaXYtPnRocm90dGxlZCkgeworCQl1c2JfZmlsbF9idWxrX3VyYihwcml2LT5idWxrX3JlYWRfdXJiLCBwcml2LT51ZGV2LAorCQkJCSAgdXNiX3JjdmJ1bGtwaXBlKHByaXYtPnVkZXYsCisJCQkJCQkgIHByaXYtPmJ1bGtfYWRkcmVzcyksCisJCQkJICBwcml2LT5idWxrX2luX2J1ZmZlciwgcHJpdi0+YnVmZmVyX3NpemUsCisJCQkJICBvcHRpY29uX2J1bGtfY2FsbGJhY2ssIHByaXYpOworCQlyZXN1bHQgPSB1c2Jfc3VibWl0X3VyYihwb3J0LT5yZWFkX3VyYiwgR0ZQX0FUT01JQyk7CisJCWlmIChyZXN1bHQpCisJCQlkZXZfZXJyKCZwb3J0LT5kZXYsCisJCQkgICAgIiVzIC0gZmFpbGVkIHJlc3VibWl0dGluZyByZWFkIHVyYiwgZXJyb3IgJWRcbiIsCisJCQkJCQkJX19mdW5jX18sIHJlc3VsdCk7CisJfSBlbHNlCisJCXByaXYtPmFjdHVhbGx5X3Rocm90dGxlZCA9IHRydWU7CisJc3Bpbl91bmxvY2soJnByaXYtPmxvY2spOworfQorCitzdGF0aWMgaW50IG9wdGljb25fb3BlbihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LAorCQkJc3RydWN0IGZpbGUgKmZpbHApCit7CisJc3RydWN0IG9wdGljb25fcHJpdmF0ZSAqcHJpdiA9IHVzYl9nZXRfc2VyaWFsX2RhdGEocG9ydC0+c2VyaWFsKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXN1bHQgPSAwOworCisJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CisJcHJpdi0+dGhyb3R0bGVkID0gZmFsc2U7CisJcHJpdi0+YWN0dWFsbHlfdGhyb3R0bGVkID0gZmFsc2U7CisJcHJpdi0+cG9ydCA9IHBvcnQ7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCisJLyoKKwkgKiBGb3JjZSBsb3dfbGF0ZW5jeSBvbiBzbyB0aGF0IG91ciB0dHlfcHVzaCBhY3R1YWxseSBmb3JjZXMgdGhlIGRhdGEKKwkgKiB0aHJvdWdoLCBvdGhlcndpc2UgaXQgaXMgc2NoZWR1bGVkLCBhbmQgd2l0aCBoaWdoIGRhdGEgcmF0ZXMgKGxpa2UKKwkgKiB3aXRoIE9IQ0kpIGRhdGEgY2FuIGdldCBsb3N0LgorCSAqLworCWlmICh0dHkpCisJCXR0eS0+bG93X2xhdGVuY3kgPSAxOworCisJLyogU3RhcnQgcmVhZGluZyBmcm9tIHRoZSBkZXZpY2UgKi8KKwl1c2JfZmlsbF9idWxrX3VyYihwcml2LT5idWxrX3JlYWRfdXJiLCBwcml2LT51ZGV2LAorCQkJICB1c2JfcmN2YnVsa3BpcGUocHJpdi0+dWRldiwKKwkJCQkJICBwcml2LT5idWxrX2FkZHJlc3MpLAorCQkJICBwcml2LT5idWxrX2luX2J1ZmZlciwgcHJpdi0+YnVmZmVyX3NpemUsCisJCQkgIG9wdGljb25fYnVsa19jYWxsYmFjaywgcHJpdik7CisJcmVzdWx0ID0gdXNiX3N1Ym1pdF91cmIocHJpdi0+YnVsa19yZWFkX3VyYiwgR0ZQX0tFUk5FTCk7CisJaWYgKHJlc3VsdCkKKwkJZGV2X2VycigmcG9ydC0+ZGV2LAorCQkJIiVzIC0gZmFpbGVkIHJlc3VibWl0dGluZyByZWFkIHVyYiwgZXJyb3IgJWRcbiIsCisJCQlfX2Z1bmNfXywgcmVzdWx0KTsKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgdm9pZCBvcHRpY29uX2Nsb3NlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsCisJCQkgIHN0cnVjdCBmaWxlICpmaWxwKQoreworCXN0cnVjdCBvcHRpY29uX3ByaXZhdGUgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9kYXRhKHBvcnQtPnNlcmlhbCk7CisKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOworCisJLyogc2h1dGRvd24gb3VyIHVyYnMgKi8KKwl1c2Jfa2lsbF91cmIocHJpdi0+YnVsa19yZWFkX3VyYik7Cit9CisKK3N0YXRpYyB2b2lkIG9wdGljb25fdGhyb3R0bGUoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gdHR5LT5kcml2ZXJfZGF0YTsKKwlzdHJ1Y3Qgb3B0aWNvbl9wcml2YXRlICpwcml2ID0gdXNiX2dldF9zZXJpYWxfZGF0YShwb3J0LT5zZXJpYWwpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOworCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CisJcHJpdi0+dGhyb3R0bGVkID0gdHJ1ZTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7Cit9CisKKworc3RhdGljIHZvaWQgb3B0aWNvbl91bnRocm90dGxlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IHR0eS0+ZHJpdmVyX2RhdGE7CisJc3RydWN0IG9wdGljb25fcHJpdmF0ZSAqcHJpdiA9IHVzYl9nZXRfc2VyaWFsX2RhdGEocG9ydC0+c2VyaWFsKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXN1bHQ7CisKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKwlwcml2LT50aHJvdHRsZWQgPSBmYWxzZTsKKwlwcml2LT5hY3R1YWxseV90aHJvdHRsZWQgPSBmYWxzZTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CisKKwlwcml2LT5idWxrX3JlYWRfdXJiLT5kZXYgPSBwb3J0LT5zZXJpYWwtPmRldjsKKwlyZXN1bHQgPSB1c2Jfc3VibWl0X3VyYihwcml2LT5idWxrX3JlYWRfdXJiLCBHRlBfQVRPTUlDKTsKKwlpZiAocmVzdWx0KQorCQlkZXZfZXJyKCZwb3J0LT5kZXYsCisJCQkiJXMgLSBmYWlsZWQgc3VibWl0dGluZyByZWFkIHVyYiwgZXJyb3IgJWRcbiIsCisJCQkJCQkJX19mdW5jX18sIHJlc3VsdCk7Cit9CisKK3N0YXRpYyBpbnQgb3B0aWNvbl9zdGFydHVwKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwpCit7CisJc3RydWN0IG9wdGljb25fcHJpdmF0ZSAqcHJpdjsKKwlzdHJ1Y3QgdXNiX2hvc3RfaW50ZXJmYWNlICppbnRmOworCWludCBpOworCWludCByZXR2YWwgPSAtRU5PTUVNOworCWJvb2wgYnVsa19pbl9mb3VuZCA9IGZhbHNlOworCisJLyogY3JlYXRlIG91ciBwcml2YXRlIHNlcmlhbCBzdHJ1Y3R1cmUgKi8KKwlwcml2ID0ga3phbGxvYyhzaXplb2YoKnByaXYpLCBHRlBfS0VSTkVMKTsKKwlpZiAocHJpdiA9PSBOVUxMKSB7CisJCWRldl9lcnIoJnNlcmlhbC0+ZGV2LT5kZXYsICIlcyAtIE91dCBvZiBtZW1vcnlcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCXNwaW5fbG9ja19pbml0KCZwcml2LT5sb2NrKTsKKwlwcml2LT5zZXJpYWwgPSBzZXJpYWw7CisJcHJpdi0+cG9ydCA9IHNlcmlhbC0+cG9ydFswXTsKKwlwcml2LT51ZGV2ID0gc2VyaWFsLT5kZXY7CisKKwkvKiBmaW5kIG91ciBidWxrIGVuZHBvaW50ICovCisJaW50ZiA9IHNlcmlhbC0+aW50ZXJmYWNlLT5hbHRzZXR0aW5nOworCWZvciAoaSA9IDA7IGkgPCBpbnRmLT5kZXNjLmJOdW1FbmRwb2ludHM7ICsraSkgeworCQlzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVuZHBvaW50OworCisJCWVuZHBvaW50ID0gJmludGYtPmVuZHBvaW50W2ldLmRlc2M7CisJCWlmICghdXNiX2VuZHBvaW50X2lzX2J1bGtfaW4oZW5kcG9pbnQpKQorCQkJY29udGludWU7CisKKwkJcHJpdi0+YnVsa19yZWFkX3VyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7CisJCWlmICghcHJpdi0+YnVsa19yZWFkX3VyYikgeworCQkJZGV2X2VycigmcHJpdi0+dWRldi0+ZGV2LCAib3V0IG9mIG1lbW9yeVxuIik7CisJCQlnb3RvIGVycm9yOworCQl9CisKKwkJcHJpdi0+YnVmZmVyX3NpemUgPSBsZTE2X3RvX2NwdShlbmRwb2ludC0+d01heFBhY2tldFNpemUpICogMjsKKwkJcHJpdi0+YnVsa19pbl9idWZmZXIgPSBrbWFsbG9jKHByaXYtPmJ1ZmZlcl9zaXplLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFwcml2LT5idWxrX2luX2J1ZmZlcikgeworCQkJZGV2X2VycigmcHJpdi0+dWRldi0+ZGV2LCAib3V0IG9mIG1lbW9yeVxuIik7CisJCQlnb3RvIGVycm9yOworCQl9CisKKwkJcHJpdi0+YnVsa19hZGRyZXNzID0gZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3M7CisKKwkJLyogc2V0IHVwIG91ciBidWxrIHVyYiAqLworCQl1c2JfZmlsbF9idWxrX3VyYihwcml2LT5idWxrX3JlYWRfdXJiLCBwcml2LT51ZGV2LAorCQkJCSAgdXNiX3JjdmJ1bGtwaXBlKHByaXYtPnVkZXYsCisJCQkJCQkgIGVuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzKSwKKwkJCQkgIHByaXYtPmJ1bGtfaW5fYnVmZmVyLCBwcml2LT5idWZmZXJfc2l6ZSwKKwkJCQkgIG9wdGljb25fYnVsa19jYWxsYmFjaywgcHJpdik7CisKKwkJYnVsa19pbl9mb3VuZCA9IHRydWU7CisJCWJyZWFrOworCQl9CisKKwlpZiAoIWJ1bGtfaW5fZm91bmQpIHsKKwkJZGV2X2VycigmcHJpdi0+dWRldi0+ZGV2LAorCQkJIkVycm9yIC0gdGhlIHByb3BlciBlbmRwb2ludHMgd2VyZSBub3QgZm91bmQhXG4iKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwl1c2Jfc2V0X3NlcmlhbF9kYXRhKHNlcmlhbCwgcHJpdik7CisJcmV0dXJuIDA7CisKK2Vycm9yOgorCXVzYl9mcmVlX3VyYihwcml2LT5idWxrX3JlYWRfdXJiKTsKKwlrZnJlZShwcml2LT5idWxrX2luX2J1ZmZlcik7CisJa2ZyZWUocHJpdik7CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIHZvaWQgb3B0aWNvbl9zaHV0ZG93bihzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsKQoreworCXN0cnVjdCBvcHRpY29uX3ByaXZhdGUgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9kYXRhKHNlcmlhbCk7CisKKwlkYmcoIiVzIiwgX19mdW5jX18pOworCisJdXNiX2tpbGxfdXJiKHByaXYtPmJ1bGtfcmVhZF91cmIpOworCXVzYl9mcmVlX3VyYihwcml2LT5idWxrX3JlYWRfdXJiKTsKKwlrZnJlZShwcml2LT5idWxrX2luX2J1ZmZlcik7CisJa2ZyZWUocHJpdik7CisJdXNiX3NldF9zZXJpYWxfZGF0YShzZXJpYWwsIE5VTEwpOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciBvcHRpY29uX2RyaXZlciA9IHsKKwkubmFtZSA9CQkib3B0aWNvbiIsCisJLnByb2JlID0JdXNiX3NlcmlhbF9wcm9iZSwKKwkuZGlzY29ubmVjdCA9CXVzYl9zZXJpYWxfZGlzY29ubmVjdCwKKwkuaWRfdGFibGUgPQlpZF90YWJsZSwKKwkubm9fZHluYW1pY19pZCA9IAkxLAorfTsKKworc3RhdGljIHN0cnVjdCB1c2Jfc2VyaWFsX2RyaXZlciBvcHRpY29uX2RldmljZSA9IHsKKwkuZHJpdmVyID0geworCQkub3duZXIgPQlUSElTX01PRFVMRSwKKwkJLm5hbWUgPQkJIm9wdGljb24iLAorCX0sCisJLmlkX3RhYmxlID0JCWlkX3RhYmxlLAorCS51c2JfZHJpdmVyID0gCQkmb3B0aWNvbl9kcml2ZXIsCisJLm51bV9wb3J0cyA9CQkxLAorCS5hdHRhY2ggPQkJb3B0aWNvbl9zdGFydHVwLAorCS5vcGVuID0JCQlvcHRpY29uX29wZW4sCisJLmNsb3NlID0JCW9wdGljb25fY2xvc2UsCisJLnNodXRkb3duID0JCW9wdGljb25fc2h1dGRvd24sCisJLnRocm90dGxlID0gCQlvcHRpY29uX3Rocm90dGxlLAorCS51bnRocm90dGxlID0JCW9wdGljb25fdW50aHJvdHRsZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IG9wdGljb25faW5pdCh2b2lkKQoreworCWludCByZXR2YWw7CisKKwlyZXR2YWwgPSB1c2Jfc2VyaWFsX3JlZ2lzdGVyKCZvcHRpY29uX2RldmljZSk7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKwlyZXR2YWwgPSB1c2JfcmVnaXN0ZXIoJm9wdGljb25fZHJpdmVyKTsKKwlpZiAocmV0dmFsKQorCQl1c2Jfc2VyaWFsX2RlcmVnaXN0ZXIoJm9wdGljb25fZGV2aWNlKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgb3B0aWNvbl9leGl0KHZvaWQpCit7CisJdXNiX2RlcmVnaXN0ZXIoJm9wdGljb25fZHJpdmVyKTsKKwl1c2Jfc2VyaWFsX2RlcmVnaXN0ZXIoJm9wdGljb25fZGV2aWNlKTsKK30KKworbW9kdWxlX2luaXQob3B0aWNvbl9pbml0KTsKK21vZHVsZV9leGl0KG9wdGljb25fZXhpdCk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK21vZHVsZV9wYXJhbShkZWJ1ZywgYm9vbCwgU19JUlVHTyB8IFNfSVdVU1IpOworTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgIkRlYnVnIGVuYWJsZWQgb3Igbm90Iik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvb3B0aW9uLmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvb3B0aW9uLmMKaW5kZXggODA5Njk3Yi4uNWVkMTgzNCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL29wdGlvbi5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9vcHRpb24uYwpAQCAtNTIyLDkgKzUyMiw5IEBACiAvKiBwZXIgcG9ydCBwcml2YXRlIGRhdGEgKi8KIAogI2RlZmluZSBOX0lOX1VSQiA0Ci0jZGVmaW5lIE5fT1VUX1VSQiAxCisjZGVmaW5lIE5fT1VUX1VSQiA0CiAjZGVmaW5lIElOX0JVRkxFTiA0MDk2Ci0jZGVmaW5lIE9VVF9CVUZMRU4gMTI4CisjZGVmaW5lIE9VVF9CVUZMRU4gNDA5NgogCiBzdHJ1Y3Qgb3B0aW9uX3BvcnRfcHJpdmF0ZSB7CiAJLyogSW5wdXQgZW5kcG9pbnRzIGFuZCBidWZmZXIgZm9yIHRoaXMgcG9ydCAqLwpAQCAtNjU0LDEwICs2NTQsNiBAQAogCQkJdXNiX3VubGlua191cmIodGhpc191cmIpOwogCQkJY29udGludWU7CiAJCX0KLQkJaWYgKHRoaXNfdXJiLT5zdGF0dXMgIT0gMCkKLQkJCWRiZygidXNiX3dyaXRlICVwIGZhaWxlZCAoZXJyPSVkKSIsCi0JCQkJdGhpc191cmIsIHRoaXNfdXJiLT5zdGF0dXMpOwotCiAJCWRiZygiJXM6IGVuZHBvaW50ICVkIGJ1ZiAlZCIsIF9fZnVuY19fLAogCQkJdXNiX3BpcGVlbmRwb2ludCh0aGlzX3VyYi0+cGlwZSksIGkpOwogCkBAIC02NjksOCArNjY1LDcgQEAKIAkJZXJyID0gdXNiX3N1Ym1pdF91cmIodGhpc191cmIsIEdGUF9BVE9NSUMpOwogCQlpZiAoZXJyKSB7CiAJCQlkYmcoInVzYl9zdWJtaXRfdXJiICVwICh3cml0ZSBidWxrKSBmYWlsZWQgIgotCQkJCSIoJWQsIGhhcyAlZCkiLCB0aGlzX3VyYiwKLQkJCQllcnIsIHRoaXNfdXJiLT5zdGF0dXMpOworCQkJCSIoJWQpIiwgdGhpc191cmIsIGVycik7CiAJCQljbGVhcl9iaXQoaSwgJnBvcnRkYXRhLT5vdXRfYnVzeSk7CiAJCQljb250aW51ZTsKIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL3NpZW1lbnNfbXBpLmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvc2llbWVuc19tcGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTFlYTBjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL3NpZW1lbnNfbXBpLmMKQEAgLTAsMCArMSw3NyBAQAorLyoKKyAqIFNpZW1lbnMgVVNCLU1QSSBTZXJpYWwgVVNCIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBUaG9tYXMgSGVyZ2VuaGFobiA8dGhvbWFzLmhlcmdlbmhhaG5Ac3VzZS5kZT4KKyAqIENvcHlyaWdodCAoQykgMjAwNSwyMDA4IEdyZWcgS3JvYWgtSGFydG1hbiA8Z3JlZ2toQHN1c2UuZGU+CisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICoJMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi9zZXJpYWwuaD4KKworLyogVmVyc2lvbiBJbmZvcm1hdGlvbiAqLworI2RlZmluZSBEUklWRVJfVkVSU0lPTiAiVmVyc2lvbiAwLjEgMDkvMjYvMjAwNSIKKyNkZWZpbmUgRFJJVkVSX0FVVEhPUiAiVGhvbWFzIEhlcmdlbmhhaG5Ad2ViLmRlIGh0dHA6Ly9saWJub2RhdmUuc2YubmV0IgorI2RlZmluZSBEUklWRVJfREVTQyAiRHJpdmVyIGZvciBTaWVtZW5zIFVTQi9NUEkgYWRhcHRlciIKKworCitzdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgaWRfdGFibGVbXSA9IHsKKwkvKiBWZW5kb3IgYW5kIHByb2R1Y3QgaWQgZm9yIDZFUzctOTcyLTBDQjIwLTBYQTAgKi8KKwl7IFVTQl9ERVZJQ0UoMHg5MDgsIDB4MDAwNCkgfSwKKwl7IH0sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRSh1c2IsIGlkX3RhYmxlKTsKKworc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIHNpZW1lbnNfdXNiX21waV9kcml2ZXIgPSB7CisJLm5hbWUgPQkJInNpZW1lbnNfbXBpIiwKKwkucHJvYmUgPQl1c2Jfc2VyaWFsX3Byb2JlLAorCS5kaXNjb25uZWN0ID0JdXNiX3NlcmlhbF9kaXNjb25uZWN0LAorCS5pZF90YWJsZSA9CWlkX3RhYmxlLAorfTsKKworc3RhdGljIHN0cnVjdCB1c2Jfc2VyaWFsX2RyaXZlciBzaWVtZW5zX3VzYl9tcGlfZGV2aWNlID0geworCS5kcml2ZXIgPSB7CisJCS5vd25lciA9CVRISVNfTU9EVUxFLAorCQkubmFtZSA9CQkic2llbWVuc19tcGkiLAorCX0sCisJLmlkX3RhYmxlID0JCWlkX3RhYmxlLAorCS5udW1fcG9ydHMgPQkJMSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHNpZW1lbnNfdXNiX21waV9pbml0KHZvaWQpCit7CisJaW50IHJldHZhbDsKKworCXJldHZhbCA9IHVzYl9zZXJpYWxfcmVnaXN0ZXIoJnNpZW1lbnNfdXNiX21waV9kZXZpY2UpOworCWlmIChyZXR2YWwpCisJCWdvdG8gZmFpbGVkX3VzYl9zZXJpYWxfcmVnaXN0ZXI7CisJcmV0dmFsID0gdXNiX3JlZ2lzdGVyKCZzaWVtZW5zX3VzYl9tcGlfZHJpdmVyKTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIGZhaWxlZF91c2JfcmVnaXN0ZXI7CisJcHJpbnRrKEtFUk5fSU5GTyBEUklWRVJfREVTQyAiXG4iKTsKKwlwcmludGsoS0VSTl9JTkZPIERSSVZFUl9WRVJTSU9OICIgIiBEUklWRVJfQVVUSE9SICJcbiIpOworCXJldHVybiByZXR2YWw7CitmYWlsZWRfdXNiX3JlZ2lzdGVyOgorCXVzYl9zZXJpYWxfZGVyZWdpc3Rlcigmc2llbWVuc191c2JfbXBpX2RldmljZSk7CitmYWlsZWRfdXNiX3NlcmlhbF9yZWdpc3RlcjoKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgc2llbWVuc191c2JfbXBpX2V4aXQodm9pZCkKK3sKKwl1c2JfZGVyZWdpc3Rlcigmc2llbWVuc191c2JfbXBpX2RyaXZlcik7CisJdXNiX3NlcmlhbF9kZXJlZ2lzdGVyKCZzaWVtZW5zX3VzYl9tcGlfZGV2aWNlKTsKK30KKworbW9kdWxlX2luaXQoc2llbWVuc191c2JfbXBpX2luaXQpOworbW9kdWxlX2V4aXQoc2llbWVuc191c2JfbXBpX2V4aXQpOworTU9EVUxFX0FVVEhPUihEUklWRVJfQVVUSE9SKTsKK01PRFVMRV9ERVNDUklQVElPTihEUklWRVJfREVTQyk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvc3BjcDh4NS5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL3NwY3A4eDUuYwppbmRleCBhNjViYzJiZC4uNWU3NTI4YyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL3NwY3A4eDUuYworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvc3BjcDh4NS5jCkBAIC03MDksMjEgKzcwOSwyMCBAQAogCXVuc2lnbmVkIGNoYXIgKmRhdGEgPSB1cmItPnRyYW5zZmVyX2J1ZmZlcjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBpOwotCWludCByZXN1bHQ7Ci0JdTggc3RhdHVzID0gMDsKKwlpbnQgcmVzdWx0ID0gdXJiLT5zdGF0dXM7CisJdTggc3RhdHVzOwogCWNoYXIgdHR5X2ZsYWc7CiAKLQlkZXZfZGJnKCZwb3J0LT5kZXYsICJzdGFydCwgdXJiLT5zdGF0dXMgPSAlZCwgIgotCQkidXJiLT5hY3R1YWxfbGVuZ3RoID0gJWRcbiwiLCB1cmItPnN0YXR1cywgdXJiLT5hY3R1YWxfbGVuZ3RoKTsKKwlkZXZfZGJnKCZwb3J0LT5kZXYsICJzdGFydCwgcmVzdWx0ID0gJWQsIHVyYi0+YWN0dWFsX2xlbmd0aCA9ICVkXG4sIiwKKwkJcmVzdWx0LCB1cmItPmFjdHVhbF9sZW5ndGgpOwogCiAJLyogY2hlY2sgdGhlIHVyYiBzdGF0dXMgKi8KLQlpZiAodXJiLT5zdGF0dXMpIHsKKwlpZiAocmVzdWx0KSB7CiAJCWlmICghcG9ydC0+cG9ydC5jb3VudCkKIAkJCXJldHVybjsKLQkJaWYgKHVyYi0+c3RhdHVzID09IC1FUFJPVE8pIHsKKwkJaWYgKHJlc3VsdCA9PSAtRVBST1RPKSB7CiAJCQkvKiBzcGNwOHg1IG15c3RlcmlvdXNseSBmYWlscyB3aXRoIC1FUFJPVE8gKi8KIAkJCS8qIHJlc2NoZWR1bGUgdGhlIHJlYWQgKi8KLQkJCXVyYi0+c3RhdHVzID0gMDsKIAkJCXVyYi0+ZGV2ID0gcG9ydC0+c2VyaWFsLT5kZXY7CiAJCQlyZXN1bHQgPSB1c2Jfc3VibWl0X3VyYih1cmIgLCBHRlBfQVRPTUlDKTsKIAkJCWlmIChyZXN1bHQpCkBAIC04MzMsOCArODMyLDkgQEAKIAlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gdXJiLT5jb250ZXh0OwogCXN0cnVjdCBzcGNwOHg1X3ByaXZhdGUgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CiAJaW50IHJlc3VsdDsKKwlpbnQgc3RhdHVzID0gdXJiLT5zdGF0dXM7CiAKLQlzd2l0Y2ggKHVyYi0+c3RhdHVzKSB7CisJc3dpdGNoIChzdGF0dXMpIHsKIAljYXNlIDA6CiAJCS8qIHN1Y2Nlc3MgKi8KIAkJYnJlYWs7CkBAIC04NDMsMTQgKzg0MywxNCBAQAogCWNhc2UgLUVTSFVURE9XTjoKIAkJLyogdGhpcyB1cmIgaXMgdGVybWluYXRlZCwgY2xlYW4gdXAgKi8KIAkJZGV2X2RiZygmcG9ydC0+ZGV2LCAidXJiIHNodXR0aW5nIGRvd24gd2l0aCBzdGF0dXM6ICVkXG4iLAotCQkJdXJiLT5zdGF0dXMpOworCQkJc3RhdHVzKTsKIAkJcHJpdi0+d3JpdGVfdXJiX2luX3VzZSA9IDA7CiAJCXJldHVybjsKIAlkZWZhdWx0OgogCQkvKiBlcnJvciBpbiB0aGUgdXJiLCBzbyB3ZSBoYXZlIHRvIHJlc3VibWl0IGl0ICovCiAJCWRiZygiJXMgLSBPdmVyZmxvdyBpbiB3cml0ZSIsIF9fZnVuY19fKTsKIAkJZGJnKCIlcyAtIG5vbnplcm8gd3JpdGUgYnVsayBzdGF0dXMgcmVjZWl2ZWQ6ICVkIiwKLQkJCV9fZnVuY19fLCB1cmItPnN0YXR1cyk7CisJCQlfX2Z1bmNfXywgc3RhdHVzKTsKIAkJcG9ydC0+d3JpdGVfdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID0gMTsKIAkJcG9ydC0+d3JpdGVfdXJiLT5kZXYgPSBwb3J0LT5zZXJpYWwtPmRldjsKIAkJcmVzdWx0ID0gdXNiX3N1Ym1pdF91cmIocG9ydC0+d3JpdGVfdXJiLCBHRlBfQVRPTUlDKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC91c2JfZGVidWcuYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC91c2JfZGVidWcuYwppbmRleCBmYzVkOTk1Li42YzljYmI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvdXNiX2RlYnVnLmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL3VzYl9kZWJ1Zy5jCkBAIC0zMSw3ICszMSw3IEBACiAJLm5vX2R5bmFtaWNfaWQgPSAJMSwKIH07CiAKLWludCB1c2JfZGVidWdfb3BlbihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LAorc3RhdGljIGludCB1c2JfZGVidWdfb3BlbihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LAogCQkJCQkJCXN0cnVjdCBmaWxlICpmaWxwKQogewogCXBvcnQtPmJ1bGtfb3V0X3NpemUgPSBVU0JfREVCVUdfTUFYX1BBQ0tFVF9TSVpFOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc3RvcmFnZS9LY29uZmlnIGIvZHJpdmVycy91c2Ivc3RvcmFnZS9LY29uZmlnCmluZGV4IGM2OGI3MzguLjlkZjY4ODcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3N0b3JhZ2UvS2NvbmZpZworKysgYi9kcml2ZXJzL3VzYi9zdG9yYWdlL0tjb25maWcKQEAgLTYxLDEzICs2MSw2IEBACiAJICAtIEN5USd2ZSBDUTgwNjBBIENEUlcgZHJpdmUKIAkgIC0gUGxhbmV4IGVYdHJlbWUgRHJpdmUgUlgtMjVIVSBVU0ItSURFIGNhYmxlIChub3QgbW9kZWwgUlgtMjVVKQogCi1jb25maWcgVVNCX1NUT1JBR0VfRFBDTQotCWJvb2wgIk1pY3JvdGVjaC9aaU8hIENvbXBhY3RGbGFzaC9TbWFydE1lZGlhIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBVU0JfU1RPUkFHRQotCWhlbHAKLQkgIFNheSBZIGhlcmUgdG8gc3VwcG9ydCB0aGUgTWljcm90ZWNoL1ppTyEgQ29tcGFjdEZsYXNoIHJlYWRlci4KLQkgIFRoZXJlIGlzIGEgd2ViIHBhZ2UgYXQgPGh0dHA6Ly93d3cuemlvY29ycC5jb20vcHJvZHVjdHMvPi4KLQogY29uZmlnIFVTQl9TVE9SQUdFX1VTQkFUCiAJYm9vbCAiVVNCQVQvVVNCQVQwMi1iYXNlZCBzdG9yYWdlIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBVU0JfU1RPUkFHRQpAQCAtOTAsMTIgKzgzLDEyIEBACiAJICAtIFNhbmRpc2sgSW1hZ2VNYXRlIFNERFItMDViCiAKIGNvbmZpZyBVU0JfU1RPUkFHRV9TRERSMDkKLQlib29sICJTYW5EaXNrIFNERFItMDkgKGFuZCBvdGhlciBTbWFydE1lZGlhKSBzdXBwb3J0IgorCWJvb2wgIlNhbkRpc2sgU0REUi0wOSAoYW5kIG90aGVyIFNtYXJ0TWVkaWEsIGluY2x1ZGluZyBEUENNKSBzdXBwb3J0IgogCWRlcGVuZHMgb24gVVNCX1NUT1JBR0UKIAloZWxwCiAJICBTYXkgWSBoZXJlIHRvIGluY2x1ZGUgYWRkaXRpb25hbCBjb2RlIHRvIHN1cHBvcnQgdGhlIFNhbmRpc2sgU0REUi0wOQogCSAgU21hcnRNZWRpYSByZWFkZXIgaW4gdGhlIFVTQiBNYXNzIFN0b3JhZ2UgZHJpdmVyLgotCSAgQWxzbyB3b3JrcyBmb3IgdGhlIE1pY3JvdGVjaCBaaW8hIFNtYXJ0TWVkaWEgcmVhZGVyLgorCSAgQWxzbyB3b3JrcyBmb3IgdGhlIE1pY3JvdGVjaCBaaW8hIENvbXBhY3RGbGFzaC9TbWFydE1lZGlhIHJlYWRlci4KIAogY29uZmlnIFVTQl9TVE9SQUdFX1NERFI1NQogCWJvb2wgIlNhbkRpc2sgU0REUi01NSBTbWFydE1lZGlhIHN1cHBvcnQiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zdG9yYWdlL01ha2VmaWxlIGIvZHJpdmVycy91c2Ivc3RvcmFnZS9NYWtlZmlsZQppbmRleCA3ZjhiZWI1Li5iMzIwNjkzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zdG9yYWdlL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvdXNiL3N0b3JhZ2UvTWFrZWZpbGUKQEAgLTE0LDcgKzE0LDYgQEAKIHVzYi1zdG9yYWdlLW9iai0kKENPTkZJR19VU0JfU1RPUkFHRV9TRERSMDkpCSs9IHNkZHIwOS5vCiB1c2Itc3RvcmFnZS1vYmotJChDT05GSUdfVVNCX1NUT1JBR0VfU0REUjU1KQkrPSBzZGRyNTUubwogdXNiLXN0b3JhZ2Utb2JqLSQoQ09ORklHX1VTQl9TVE9SQUdFX0ZSRUVDT00pCSs9IGZyZWVjb20ubwotdXNiLXN0b3JhZ2Utb2JqLSQoQ09ORklHX1VTQl9TVE9SQUdFX0RQQ00pCSs9IGRwY20ubwogdXNiLXN0b3JhZ2Utb2JqLSQoQ09ORklHX1VTQl9TVE9SQUdFX0lTRDIwMCkJKz0gaXNkMjAwLm8KIHVzYi1zdG9yYWdlLW9iai0kKENPTkZJR19VU0JfU1RPUkFHRV9EQVRBRkFCKQkrPSBkYXRhZmFiLm8KIHVzYi1zdG9yYWdlLW9iai0kKENPTkZJR19VU0JfU1RPUkFHRV9KVU1QU0hPVCkJKz0ganVtcHNob3QubwpAQCAtMjQsNyArMjMsNyBAQAogdXNiLXN0b3JhZ2Utb2JqLSQoQ09ORklHX1VTQl9TVE9SQUdFX0NZUFJFU1NfQVRBQ0IpICs9IGN5cHJlc3NfYXRhY2IubwogCiB1c2Itc3RvcmFnZS1vYmpzIDo9CXNjc2lnbHVlLm8gcHJvdG9jb2wubyB0cmFuc3BvcnQubyB1c2IubyBcCi0JCQlpbml0aWFsaXplcnMubyBzaWVycmFfbXMubyAkKHVzYi1zdG9yYWdlLW9iai15KQorCQkJaW5pdGlhbGl6ZXJzLm8gc2llcnJhX21zLm8gb3B0aW9uX21zLm8gJCh1c2Itc3RvcmFnZS1vYmoteSkKIAogaWZuZXEgKCQoQ09ORklHX1VTQl9MSUJVU1VBTCksKQogCW9iai0kKENPTkZJR19VU0IpCSs9IGxpYnVzdWFsLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3N0b3JhZ2UvZHBjbS5jIGIvZHJpdmVycy91c2Ivc3RvcmFnZS9kcGNtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzOTkyMzQuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy91c2Ivc3RvcmFnZS9kcGNtLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKiBEcml2ZXIgZm9yIE1pY3JvdGVjaCBEUENNLVVTQiBDb21wYWN0Rmxhc2gvU21hcnRNZWRpYSByZWFkZXIKLSAqCi0gKiBEUENNIGRyaXZlciB2MC4xOgotICoKLSAqIEZpcnN0IHJlbGVhc2UKLSAqCi0gKiBDdXJyZW50IGRldmVsb3BtZW50IGFuZCBtYWludGVuYW5jZSBieToKLSAqICAgKGMpIDIwMDAgQnJpYW4gV2ViYiAod2ViYmJAZWFydGhsaW5rLm5ldCkKLSAqCi0gKiBUaGlzIGRldmljZSBjb250YWlucyBib3RoIGEgQ29tcGFjdEZsYXNoIGNhcmQgcmVhZGVyLCB3aGljaAotICogdXNlcyB0aGUgQ29udHJvbC9CdWxrIHcvbyBJbnRlcnJ1cHQgcHJvdG9jb2wgYW5kCi0gKiBhIFNtYXJ0TWVkaWEgY2FyZCByZWFkZXIgdGhhdCB1c2VzIHRoZSBzYW1lIHByb3RvY29sCi0gKiBhcyB0aGUgU0REUjA5LgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKLSAqIGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotICovCi0KLSNpbmNsdWRlIDxzY3NpL3Njc2kuaD4KLSNpbmNsdWRlIDxzY3NpL3Njc2lfY21uZC5oPgotI2luY2x1ZGUgPHNjc2kvc2NzaV9kZXZpY2UuaD4KLQotI2luY2x1ZGUgInVzYi5oIgotI2luY2x1ZGUgInRyYW5zcG9ydC5oIgotI2luY2x1ZGUgInByb3RvY29sLmgiCi0jaW5jbHVkZSAiZGVidWcuaCIKLSNpbmNsdWRlICJkcGNtLmgiCi0jaW5jbHVkZSAic2RkcjA5LmgiCi0KLS8qCi0gKiBUcmFuc3BvcnQgZm9yIHRoZSBNaWNyb3RlY2ggRFBDTS1VU0IKLSAqCi0gKi8KLWludCBkcGNtX3RyYW5zcG9ydChzdHJ1Y3Qgc2NzaV9jbW5kICpzcmIsIHN0cnVjdCB1c19kYXRhICp1cykKLXsKLQlpbnQgcmV0OwotCi0JaWYgKHNyYiA9PSBOVUxMKQotCQlyZXR1cm4gVVNCX1NUT1JfVFJBTlNQT1JUX0VSUk9SOwotCi0JVVNfREVCVUdQKCJkcGNtX3RyYW5zcG9ydDogTFVOPSVkXG4iLCBzcmItPmRldmljZS0+bHVuKTsKLQotCXN3aXRjaCAoc3JiLT5kZXZpY2UtPmx1bikgewotCQljYXNlIDA6Ci0KLQkJCS8qCi0JCQkgKiBMVU4gMCBjb3JyZXNwb25kcyB0byB0aGUgQ29tcGFjdEZsYXNoIGNhcmQgcmVhZGVyLgotCQkJICovCi0JCQlyZXQgPSB1c2Jfc3Rvcl9DQl90cmFuc3BvcnQoc3JiLCB1cyk7Ci0JCQlicmVhazsKLQotI2lmZGVmIENPTkZJR19VU0JfU1RPUkFHRV9TRERSMDkKLQkJY2FzZSAxOgotCi0JCQkvKgotCQkJICogTFVOIDEgY29ycmVzcG9uZHMgdG8gdGhlIFNtYXJ0TWVkaWEgY2FyZCByZWFkZXIuCi0JCQkgKi8KLQotCQkJLyoKLQkJCSAqIFNldCB0aGUgTFVOIHRvIDAgKGp1c3QgaW4gY2FzZSkuCi0JCQkgKi8KLQkJCXNyYi0+ZGV2aWNlLT5sdW4gPSAwOyB1cy0+c3JiLT5kZXZpY2UtPmx1biA9IDA7Ci0JCQlyZXQgPSBzZGRyMDlfdHJhbnNwb3J0KHNyYiwgdXMpOwotCQkJc3JiLT5kZXZpY2UtPmx1biA9IDE7IHVzLT5zcmItPmRldmljZS0+bHVuID0gMTsKLQkJCWJyZWFrOwotCi0jZW5kaWYKLQotCQlkZWZhdWx0OgotCQkJVVNfREVCVUdQKCJkcGNtX3RyYW5zcG9ydDogSW52YWxpZCBMVU4gJWRcbiIsIHNyYi0+ZGV2aWNlLT5sdW4pOwotCQkJcmV0ID0gVVNCX1NUT1JfVFJBTlNQT1JUX0VSUk9SOwotCQkJYnJlYWs7Ci0JfQotCXJldHVybiByZXQ7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zdG9yYWdlL2RwY20uaCBiL2RyaXZlcnMvdXNiL3N0b3JhZ2UvZHBjbS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlN2I3YjBmLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvdXNiL3N0b3JhZ2UvZHBjbS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyogRHJpdmVyIGZvciBNaWNyb3RlY2ggRFBDTS1VU0IgQ29tcGFjdEZsYXNoL1NtYXJ0TWVkaWEgcmVhZGVyCi0gKgotICogRFBDTSBkcml2ZXIgdjAuMToKLSAqCi0gKiBGaXJzdCByZWxlYXNlCi0gKgotICogQ3VycmVudCBkZXZlbG9wbWVudCBhbmQgbWFpbnRlbmFuY2UgYnk6Ci0gKiAgIChjKSAyMDAwIEJyaWFuIFdlYmIgKHdlYmJiQGVhcnRobGluay5uZXQpCi0gKgotICogU2VlIGRwY20uYyBmb3IgbW9yZSBleHBsYW5hdGlvbgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKLSAqIGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotICovCi0KLSNpZm5kZWYgX01JQ1JPVEVDSF9EUENNX1VTQl9ICi0jZGVmaW5lIF9NSUNST1RFQ0hfRFBDTV9VU0JfSAotCi1leHRlcm4gaW50IGRwY21fdHJhbnNwb3J0KHN0cnVjdCBzY3NpX2NtbmQgKnNyYiwgc3RydWN0IHVzX2RhdGEgKnVzKTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zdG9yYWdlL2xpYnVzdWFsLmMgYi9kcml2ZXJzL3VzYi9zdG9yYWdlL2xpYnVzdWFsLmMKaW5kZXggZDYxN2U4YS4uZjk3MGIyNyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc3RvcmFnZS9saWJ1c3VhbC5jCisrKyBiL2RyaXZlcnMvdXNiL3N0b3JhZ2UvbGlidXN1YWwuYwpAQCAtNDYsNiArNDYsMTIgQEAKIHsgVVNCX0RFVklDRV9WRVIoaWRfdmVuZG9yLCBpZF9wcm9kdWN0LCBiY2REZXZpY2VNaW4sYmNkRGV2aWNlTWF4KSwgXAogICAuZHJpdmVyX2luZm8gPSAoZmxhZ3MpfChVU0JfVVNfVFlQRV9TVE9SPDwyNCkgfQogCisjZGVmaW5lIENPTVBMSUFOVF9ERVYoaWRfdmVuZG9yLCBpZF9wcm9kdWN0LCBiY2REZXZpY2VNaW4sIGJjZERldmljZU1heCwgXAorCQkgICAgdmVuZG9yTmFtZSwgcHJvZHVjdE5hbWUsIHVzZVByb3RvY29sLCB1c2VUcmFuc3BvcnQsIFwKKwkJICAgIGluaXRGdW5jdGlvbiwgZmxhZ3MpIFwKK3sgVVNCX0RFVklDRV9WRVIoaWRfdmVuZG9yLCBpZF9wcm9kdWN0LCBiY2REZXZpY2VNaW4sIGJjZERldmljZU1heCksIFwKKyAgLmRyaXZlcl9pbmZvID0gKGZsYWdzKSB9CisKICNkZWZpbmUgVVNVQUxfREVWKHVzZVByb3RvLCB1c2VUcmFucywgdXNlVHlwZSkgXAogeyBVU0JfSU5URVJGQUNFX0lORk8oVVNCX0NMQVNTX01BU1NfU1RPUkFHRSwgdXNlUHJvdG8sIHVzZVRyYW5zKSwgXAogICAuZHJpdmVyX2luZm8gPSAoKHVzZVR5cGUpPDwyNCkgfQpAQCAtNTcsNiArNjMsNyBAQAogCiAjdW5kZWYgVVNVQUxfREVWCiAjdW5kZWYgVU5VU1VBTF9ERVYKKyN1bmRlZiBDT01QTElBTlRfREVWCiAKIE1PRFVMRV9ERVZJQ0VfVEFCTEUodXNiLCBzdG9yYWdlX3VzYl9pZHMpOwogRVhQT1JUX1NZTUJPTF9HUEwoc3RvcmFnZV91c2JfaWRzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3N0b3JhZ2Uvb3B0aW9uX21zLmMgYi9kcml2ZXJzL3VzYi9zdG9yYWdlL29wdGlvbl9tcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1M2Y5MjIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3VzYi9zdG9yYWdlL29wdGlvbl9tcy5jCkBAIC0wLDAgKzEsMTQ3IEBACisvKgorICogRHJpdmVyIGZvciBPcHRpb24gSGlnaCBTcGVlZCBNb2JpbGUgRGV2aWNlcy4KKyAqCisgKiAgIChjKSAyMDA4IERhbiBXaWxsaWFtcyA8ZGNid0ByZWRoYXQuY29tPgorICoKKyAqIEluc3BpcmF0aW9uIHRha2VuIGZyb20gc2llcnJhX21zLmMgYnkgS2V2aW4gTGxveWQgPGtsbG95ZEBzaWVycmF3aXJlbGVzcy5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorCisjaW5jbHVkZSAidXNiLmgiCisjaW5jbHVkZSAidHJhbnNwb3J0LmgiCisjaW5jbHVkZSAib3B0aW9uX21zLmgiCisjaW5jbHVkZSAiZGVidWcuaCIKKworI2RlZmluZSBaQ0RfRk9SQ0VfTU9ERU0JCQkweDAxCisjZGVmaW5lIFpDRF9BTExPV19NUyAJCQkweDAyCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgb3B0aW9uX3plcm9fY2QgPSBaQ0RfRk9SQ0VfTU9ERU07Cittb2R1bGVfcGFyYW0ob3B0aW9uX3plcm9fY2QsIHVpbnQsIFNfSVJVR08gfCBTX0lXVVNSKTsKK01PRFVMRV9QQVJNX0RFU0Mob3B0aW9uX3plcm9fY2QsICJaZXJvQ0QgbW9kZSAoMT1Gb3JjZSBNb2RlbSAoZGVmYXVsdCksIgorCQkgIiAyPUFsbG93IENELVJvbSIpOworCisjZGVmaW5lIFJFU1BPTlNFX0xFTiAxMDI0CisKK3N0YXRpYyBpbnQgb3B0aW9uX3JlemVybyhzdHJ1Y3QgdXNfZGF0YSAqdXMsIGludCBlcF9pbiwgaW50IGVwX291dCkKK3sKKwljb25zdCB1bnNpZ25lZCBjaGFyIHJlemVyb19tc2dbXSA9IHsKKwkgIDB4NTUsIDB4NTMsIDB4NDIsIDB4NDMsIDB4NzgsIDB4NTYsIDB4MzQsIDB4MTIsCisJICAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDgwLCAweDAwLCAweDA2LCAweDAxLAorCSAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAKKwl9OworCWNoYXIgKmJ1ZmZlcjsKKwlpbnQgcmVzdWx0OworCisJVVNfREVCVUdQKCJPcHRpb24gTVM6ICVzIiwgIkRFVklDRSBNT0RFIFNXSVRDSFxuIik7CisKKwlidWZmZXIgPSBremFsbG9jKFJFU1BPTlNFX0xFTiwgR0ZQX0tFUk5FTCk7CisJaWYgKGJ1ZmZlciA9PSBOVUxMKQorCQlyZXR1cm4gVVNCX1NUT1JfVFJBTlNQT1JUX0VSUk9SOworCisJbWVtY3B5KGJ1ZmZlciwgcmV6ZXJvX21zZywgc2l6ZW9mIChyZXplcm9fbXNnKSk7CisJcmVzdWx0ID0gdXNiX3N0b3JfYnVsa190cmFuc2Zlcl9idWYodXMsCisJCQl1c2Jfc25kYnVsa3BpcGUodXMtPnB1c2JfZGV2LCBlcF9vdXQpLAorCQkJYnVmZmVyLCBzaXplb2YgKHJlemVyb19tc2cpLCBOVUxMKTsKKwlpZiAocmVzdWx0ICE9IFVTQl9TVE9SX1hGRVJfR09PRCkgeworCQlyZXN1bHQgPSBVU0JfU1RPUl9YRkVSX0VSUk9SOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBTb21lIG9mIHRoZSBkZXZpY2VzIG5lZWQgdG8gYmUgYXNrZWQgZm9yIGEgcmVzcG9uc2UsIGJ1dCB3ZSBkb24ndAorCSAqIGNhcmUgd2hhdCB0aGF0IHJlc3BvbnNlIGlzLgorCSAqLworCXJlc3VsdCA9IHVzYl9zdG9yX2J1bGtfdHJhbnNmZXJfYnVmKHVzLAorCQkJdXNiX3NuZGJ1bGtwaXBlKHVzLT5wdXNiX2RldiwgZXBfb3V0KSwKKwkJCWJ1ZmZlciwgUkVTUE9OU0VfTEVOLCBOVUxMKTsKKwlyZXN1bHQgPSBVU0JfU1RPUl9YRkVSX0dPT0Q7CisKK291dDoKKwlrZnJlZShidWZmZXIpOworCXJldHVybiByZXN1bHQ7Cit9CisKK2ludCBvcHRpb25fbXNfaW5pdChzdHJ1Y3QgdXNfZGF0YSAqdXMpCit7CisJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXY7CisJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGY7CisJc3RydWN0IHVzYl9ob3N0X2ludGVyZmFjZSAqaWZhY2VfZGVzYzsKKwlzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVuZHBvaW50ID0gTlVMTDsKKwl1OCBlcF9pbiA9IDAsIGVwX291dCA9IDA7CisJaW50IGVwX2luX3NpemUgPSAwLCBlcF9vdXRfc2l6ZSA9IDA7CisJaW50IGksIHJlc3VsdDsKKworCXVkZXYgPSB1cy0+cHVzYl9kZXY7CisJaW50ZiA9IHVzLT5wdXNiX2ludGY7CisKKwkvKiBFbnN1cmUgaXQncyByZWFsbHkgYSBaZXJvQ0QgZGV2aWNlOyBkZXZpY2VzIHRoYXQgYXJlIGFscmVhZHkKKwkgKiBpbiBtb2RlbSBtb2RlIHJldHVybiAweEZGIGZvciBjbGFzcywgc3ViY2xhc3MsIGFuZCBwcm90b2NvbC4KKwkgKi8KKwlpZiAodWRldi0+ZGVzY3JpcHRvci5iRGV2aWNlQ2xhc3MgIT0gMCB8fAorCSAgICB1ZGV2LT5kZXNjcmlwdG9yLmJEZXZpY2VTdWJDbGFzcyAhPSAwIHx8CisJICAgIHVkZXYtPmRlc2NyaXB0b3IuYkRldmljZVByb3RvY29sICE9IDApCisJCXJldHVybiBVU0JfU1RPUl9UUkFOU1BPUlRfR09PRDsKKworCVVTX0RFQlVHUCgiT3B0aW9uIE1TOiBvcHRpb25fbXNfaW5pdCBjYWxsZWRcbiIpOworCisJLyogRmluZCB0aGUgcmlnaHQgbWFzcyBzdG9yYWdlIGludGVyZmFjZSAqLworCWlmYWNlX2Rlc2MgPSBpbnRmLT5jdXJfYWx0c2V0dGluZzsKKwlpZiAoaWZhY2VfZGVzYy0+ZGVzYy5iSW50ZXJmYWNlQ2xhc3MgIT0gMHg4IHx8CisJICAgIGlmYWNlX2Rlc2MtPmRlc2MuYkludGVyZmFjZVN1YkNsYXNzICE9IDB4NiB8fAorCSAgICBpZmFjZV9kZXNjLT5kZXNjLmJJbnRlcmZhY2VQcm90b2NvbCAhPSAweDUwKSB7CisJCVVTX0RFQlVHUCgiT3B0aW9uIE1TOiBtYXNzIHN0b3JhZ2UgaW50ZXJmYWNlIG5vdCBmb3VuZCwgbm8gYWN0aW9uICIKKwkJICAgICAgICAgICJyZXF1aXJlZFxuIik7CisJCXJldHVybiBVU0JfU1RPUl9UUkFOU1BPUlRfR09PRDsKKwl9CisKKwkvKiBGaW5kIHRoZSBtYXNzIHN0b3JhZ2UgYnVsayBlbmRwb2ludHMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgaWZhY2VfZGVzYy0+ZGVzYy5iTnVtRW5kcG9pbnRzICYmICghZXBfaW5fc2l6ZSB8fCAhZXBfb3V0X3NpemUpOyArK2kpIHsKKwkJZW5kcG9pbnQgPSAmaWZhY2VfZGVzYy0+ZW5kcG9pbnRbaV0uZGVzYzsKKworCQlpZiAodXNiX2VuZHBvaW50X2lzX2J1bGtfaW4oZW5kcG9pbnQpKSB7CisJCQllcF9pbiA9IHVzYl9lbmRwb2ludF9udW0oZW5kcG9pbnQpOworCQkJZXBfaW5fc2l6ZSA9IGxlMTZfdG9fY3B1KGVuZHBvaW50LT53TWF4UGFja2V0U2l6ZSk7CisJCX0gZWxzZSBpZiAodXNiX2VuZHBvaW50X2lzX2J1bGtfb3V0KGVuZHBvaW50KSkgeworCQkJZXBfb3V0ID0gdXNiX2VuZHBvaW50X251bShlbmRwb2ludCk7CisJCQllcF9vdXRfc2l6ZSA9IGxlMTZfdG9fY3B1KGVuZHBvaW50LT53TWF4UGFja2V0U2l6ZSk7CisJCX0KKwl9CisKKwkvKiBDYW4ndCBmaW5kIHRoZSBtYXNzIHN0b3JhZ2UgZW5kcG9pbnRzICovCisJaWYgKCFlcF9pbl9zaXplIHx8ICFlcF9vdXRfc2l6ZSkgeworCQlVU19ERUJVR1AoIk9wdGlvbiBNUzogbWFzcyBzdG9yYWdlIGVuZHBvaW50cyBub3QgZm91bmQsIG5vIGFjdGlvbiAiCisJCSAgICAgICAgICAicmVxdWlyZWRcbiIpOworCQlyZXR1cm4gVVNCX1NUT1JfVFJBTlNQT1JUX0dPT0Q7CisJfQorCisJLyogRm9yY2UgTW9kZW0gbW9kZSAqLworCWlmIChvcHRpb25femVyb19jZCA9PSBaQ0RfRk9SQ0VfTU9ERU0pIHsKKwkJVVNfREVCVUdQKCJPcHRpb24gTVM6ICVzIiwgIkZvcmNpbmcgTW9kZW0gTW9kZVxuIik7CisJCXJlc3VsdCA9IG9wdGlvbl9yZXplcm8odXMsIGVwX2luLCBlcF9vdXQpOworCQlpZiAocmVzdWx0ICE9IFVTQl9TVE9SX1hGRVJfR09PRCkKKwkJCVVTX0RFQlVHUCgiT3B0aW9uIE1TOiBGYWlsZWQgdG8gc3dpdGNoIHRvIG1vZGVtIG1vZGUuXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfSBlbHNlIGlmIChvcHRpb25femVyb19jZCA9PSBaQ0RfQUxMT1dfTVMpIHsKKwkJLyogQWxsb3cgTWFzcyBTdG9yYWdlIG1vZGUgKGtlZXAgQ0QtUm9tKSAqLworCQlVU19ERUJVR1AoIk9wdGlvbiBNUzogJXMiLCAiQWxsb3dpbmcgTWFzcyBTdG9yYWdlIE1vZGUgaWYgZGV2aWNlIgorCQkgICAgICAgICAgIiByZXF1ZXN0cyBpdFxuIik7CisJfQorCisJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9HT09EOworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zdG9yYWdlL29wdGlvbl9tcy5oIGIvZHJpdmVycy91c2Ivc3RvcmFnZS9vcHRpb25fbXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNmU0NDhjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2Ivc3RvcmFnZS9vcHRpb25fbXMuaApAQCAtMCwwICsxLDQgQEAKKyNpZm5kZWYgX09QVElPTl9NU19IXworI2RlZmluZSBfT1BUSU9OX01TX0hfCitleHRlcm4gaW50IG9wdGlvbl9tc19pbml0KHN0cnVjdCB1c19kYXRhICp1cyk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3N0b3JhZ2UvcHJvdG9jb2wuYyBiL2RyaXZlcnMvdXNiL3N0b3JhZ2UvcHJvdG9jb2wuYwppbmRleCAzYjMzNTdlLi5iZTQ0MWQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zdG9yYWdlL3Byb3RvY29sLmMKKysrIGIvZHJpdmVycy91c2Ivc3RvcmFnZS9wcm90b2NvbC5jCkBAIC01Niw5ICs1Niw5IEBACiAgKiBQcm90b2NvbCByb3V0aW5lcwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi12b2lkIHVzYl9zdG9yX3FpYzE1N19jb21tYW5kKHN0cnVjdCBzY3NpX2NtbmQgKnNyYiwgc3RydWN0IHVzX2RhdGEgKnVzKQordm9pZCB1c2Jfc3Rvcl9wYWQxMl9jb21tYW5kKHN0cnVjdCBzY3NpX2NtbmQgKnNyYiwgc3RydWN0IHVzX2RhdGEgKnVzKQogewotCS8qIFBhZCB0aGUgQVRBUEkgY29tbWFuZCB3aXRoIHplcm9zIAorCS8qIFBhZCB0aGUgU0NTSSBjb21tYW5kIHdpdGggemVyb3Mgb3V0IHRvIDEyIGJ5dGVzCiAJICoKIAkgKiBOT1RFOiBUaGlzIG9ubHkgd29ya3MgYmVjYXVzZSBhIHNjc2lfY21uZCBzdHJ1Y3QgZmllbGQgY29udGFpbnMKIAkgKiBhIHVuc2lnbmVkIGNoYXIgY21uZFsxNl0sIHNvIHdlIGtub3cgd2UgaGF2ZSBzdG9yYWdlIGF2YWlsYWJsZQpAQCAtNzMsMjYgKzczLDYgQEAKIAl1c2Jfc3Rvcl9pbnZva2VfdHJhbnNwb3J0KHNyYiwgdXMpOwogfQogCi12b2lkIHVzYl9zdG9yX0FUQVBJX2NvbW1hbmQoc3RydWN0IHNjc2lfY21uZCAqc3JiLCBzdHJ1Y3QgdXNfZGF0YSAqdXMpCi17Ci0JLyogUGFkIHRoZSBBVEFQSSBjb21tYW5kIHdpdGggemVyb3MgCi0JICoKLQkgKiBOT1RFOiBUaGlzIG9ubHkgd29ya3MgYmVjYXVzZSBhIHNjc2lfY21uZCBzdHJ1Y3QgZmllbGQgY29udGFpbnMKLQkgKiBhIHVuc2lnbmVkIGNoYXIgY21uZFsxNl0sIHNvIHdlIGtub3cgd2UgaGF2ZSBzdG9yYWdlIGF2YWlsYWJsZQotCSAqLwotCi0JLyogUGFkIHRoZSBBVEFQSSBjb21tYW5kIHdpdGggemVyb3MgKi8KLQlmb3IgKDsgc3JiLT5jbWRfbGVuPDEyOyBzcmItPmNtZF9sZW4rKykKLQkJc3JiLT5jbW5kW3NyYi0+Y21kX2xlbl0gPSAwOwotCi0JLyogc2V0IGNvbW1hbmQgbGVuZ3RoIHRvIDEyIGJ5dGVzICovCi0Jc3JiLT5jbWRfbGVuID0gMTI7Ci0KLQkvKiBzZW5kIHRoZSBjb21tYW5kIHRvIHRoZSB0cmFuc3BvcnQgbGF5ZXIgKi8KLQl1c2Jfc3Rvcl9pbnZva2VfdHJhbnNwb3J0KHNyYiwgdXMpOwotfQotCi0KIHZvaWQgdXNiX3N0b3JfdWZpX2NvbW1hbmQoc3RydWN0IHNjc2lfY21uZCAqc3JiLCBzdHJ1Y3QgdXNfZGF0YSAqdXMpCiB7CiAJLyogZml4IHNvbWUgY29tbWFuZHMgLS0gdGhpcyBpcyBhIGZvcm0gb2YgbW9kZSB0cmFuc2xhdGlvbgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc3RvcmFnZS9wcm90b2NvbC5oIGIvZHJpdmVycy91c2Ivc3RvcmFnZS9wcm90b2NvbC5oCmluZGV4IDQ4NzA1NmYuLmZmYzNlMmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3N0b3JhZ2UvcHJvdG9jb2wuaAorKysgYi9kcml2ZXJzL3VzYi9zdG9yYWdlL3Byb3RvY29sLmgKQEAgLTQwLDggKzQwLDcgQEAKICNkZWZpbmUgX1BST1RPQ09MX0hfCiAKIC8qIFByb3RvY29sIGhhbmRsaW5nIHJvdXRpbmVzICovCi1leHRlcm4gdm9pZCB1c2Jfc3Rvcl9BVEFQSV9jb21tYW5kKHN0cnVjdCBzY3NpX2NtbmQqLCBzdHJ1Y3QgdXNfZGF0YSopOwotZXh0ZXJuIHZvaWQgdXNiX3N0b3JfcWljMTU3X2NvbW1hbmQoc3RydWN0IHNjc2lfY21uZCosIHN0cnVjdCB1c19kYXRhKik7CitleHRlcm4gdm9pZCB1c2Jfc3Rvcl9wYWQxMl9jb21tYW5kKHN0cnVjdCBzY3NpX2NtbmQqLCBzdHJ1Y3QgdXNfZGF0YSopOwogZXh0ZXJuIHZvaWQgdXNiX3N0b3JfdWZpX2NvbW1hbmQoc3RydWN0IHNjc2lfY21uZCosIHN0cnVjdCB1c19kYXRhKik7CiBleHRlcm4gdm9pZCB1c2Jfc3Rvcl90cmFuc3BhcmVudF9zY3NpX2NvbW1hbmQoc3RydWN0IHNjc2lfY21uZCosCiAJCXN0cnVjdCB1c19kYXRhKik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zdG9yYWdlL3Njc2lnbHVlLmMgYi9kcml2ZXJzL3VzYi9zdG9yYWdlL3Njc2lnbHVlLmMKaW5kZXggMDk3NzlmNi4uMmE0MmI4NiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc3RvcmFnZS9zY3NpZ2x1ZS5jCisrKyBiL2RyaXZlcnMvdXNiL3N0b3JhZ2Uvc2NzaWdsdWUuYwpAQCAtNTksNiArNTksMTMgQEAKICNpbmNsdWRlICJ0cmFuc3BvcnQuaCIKICNpbmNsdWRlICJwcm90b2NvbC5oIgogCisvKiBWZW5kb3IgSURzIGZvciBjb21wYW5pZXMgdGhhdCBzZWVtIHRvIGluY2x1ZGUgdGhlIFJFQUQgQ0FQQUNJVFkgYnVnCisgKiBpbiBhbGwgdGhlaXIgZGV2aWNlcworICovCisjZGVmaW5lIFZFTkRPUl9JRF9OT0tJQQkJMHgwNDIxCisjZGVmaW5lIFZFTkRPUl9JRF9OSUtPTgkJMHgwNGIwCisjZGVmaW5lIFZFTkRPUl9JRF9NT1RPUk9MQQkweDIyYjgKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBIb3N0IGZ1bmN0aW9ucyAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTEyOSwxMSArMTM2LDM1IEBACiAJCQkJCSAgICAgIG1heF9zZWN0b3JzKTsKIAl9CiAKKwkvKiBTb21lIFVTQiBob3N0IGNvbnRyb2xsZXJzIGNhbid0IGRvIERNQTsgdGhleSBoYXZlIHRvIHVzZSBQSU8uCisJICogVGhleSBpbmRpY2F0ZSB0aGlzIGJ5IHNldHRpbmcgdGhlaXIgZG1hX21hc2sgdG8gTlVMTC4gIEZvcgorCSAqIHN1Y2ggY29udHJvbGxlcnMgd2UgbmVlZCB0byBtYWtlIHN1cmUgdGhlIGJsb2NrIGxheWVyIHNldHMKKwkgKiB1cCBib3VuY2UgYnVmZmVycyBpbiBhZGRyZXNzYWJsZSBtZW1vcnkuCisJICovCisJaWYgKCF1cy0+cHVzYl9kZXYtPmJ1cy0+Y29udHJvbGxlci0+ZG1hX21hc2spCisJCWJsa19xdWV1ZV9ib3VuY2VfbGltaXQoc2Rldi0+cmVxdWVzdF9xdWV1ZSwgQkxLX0JPVU5DRV9ISUdIKTsKKwogCS8qIFdlIGNhbid0IHB1dCB0aGVzZSBzZXR0aW5ncyBpbiBzbGF2ZV9hbGxvYygpIGJlY2F1c2UgdGhhdCBnZXRzCiAJICogY2FsbGVkIGJlZm9yZSB0aGUgZGV2aWNlIHR5cGUgaXMga25vd24uICBDb25zZXF1ZW50bHkgdGhlc2UKIAkgKiBzZXR0aW5ncyBjYW4ndCBiZSBvdmVycmlkZGVuIHZpYSB0aGUgc2NzaSBkZXZpbmZvIG1lY2hhbmlzbS4gKi8KIAlpZiAoc2Rldi0+dHlwZSA9PSBUWVBFX0RJU0spIHsKIAorCQkvKiBTb21lIHZlbmRvcnMgc2VlbSB0byBwdXQgdGhlIFJFQUQgQ0FQQUNJVFkgYnVnIGludG8KKwkJICogYWxsIHRoZWlyIGRldmljZXMgLS0gcHJpbWFyaWx5IG1ha2VycyBvZiBjZWxsIHBob25lcworCQkgKiBhbmQgZGlnaXRhbCBjYW1lcmFzLiAgU2luY2UgdGhlc2UgZGV2aWNlcyBhbHdheXMgdXNlCisJCSAqIGZsYXNoIG1lZGlhIGFuZCBjYW4gYmUgZXhwZWN0ZWQgdG8gaGF2ZSBhbiBldmVuIG51bWJlcgorCQkgKiBvZiBzZWN0b3JzLCB3ZSB3aWxsIGFsd2F5cyBlbmFibGUgdGhlIENBUEFDSVRZX0hFVVJJU1RJQ1MKKwkJICogZmxhZyB1bmxlc3MgdG9sZCBvdGhlcndpc2UuICovCisJCXN3aXRjaCAobGUxNl90b19jcHUodXMtPnB1c2JfZGV2LT5kZXNjcmlwdG9yLmlkVmVuZG9yKSkgeworCQljYXNlIFZFTkRPUl9JRF9OT0tJQToKKwkJY2FzZSBWRU5ET1JfSURfTklLT046CisJCWNhc2UgVkVORE9SX0lEX01PVE9ST0xBOgorCQkJaWYgKCEodXMtPmZmbGFncyAmIChVU19GTF9GSVhfQ0FQQUNJVFkgfAorCQkJCQlVU19GTF9DQVBBQ0lUWV9PSykpKQorCQkJCXVzLT5mZmxhZ3MgfD0gVVNfRkxfQ0FQQUNJVFlfSEVVUklTVElDUzsKKwkJCWJyZWFrOworCQl9CisKIAkJLyogRGlzay10eXBlIGRldmljZXMgdXNlIE1PREUgU0VOU0UoNikgaWYgdGhlIHByb3RvY29sCiAJCSAqIChTdWJDbGFzcykgaXMgVHJhbnNwYXJlbnQgU0NTSSwgb3RoZXJ3aXNlIHRoZXkgdXNlCiAJCSAqIE1PREUgU0VOU0UoMTApLiAqLwpAQCAtMTcwLDYgKzIwMSwxMCBAQAogCQlpZiAodXMtPmZmbGFncyAmIFVTX0ZMX0NBUEFDSVRZX0hFVVJJU1RJQ1MpCiAJCQlzZGV2LT5ndWVzc19jYXBhY2l0eSA9IDE7CiAKKwkJLyogYXNzdW1lIFNQQzMgb3IgbGF0dGVyIGRldmljZXMgc3VwcG9ydCBzZW5zZSBzaXplID4gMTggKi8KKwkJaWYgKHNkZXYtPnNjc2lfbGV2ZWwgPiBTQ1NJX1NQQ18yKQorCQkJdXMtPmZmbGFncyB8PSBVU19GTF9TQU5FX1NFTlNFOworCiAJCS8qIFNvbWUgZGV2aWNlcyByZXBvcnQgYSBTQ1NJIHJldmlzaW9uIGxldmVsIGFib3ZlIDIgYnV0IGFyZQogCQkgKiB1bmFibGUgdG8gaGFuZGxlIHRoZSBSRVBPUlQgTFVOUyBjb21tYW5kIChmb3Igd2hpY2gKIAkJICogc3VwcG9ydCBpcyBtYW5kYXRvcnkgYXQgbGV2ZWwgMykuICBTaW5jZSB3ZSBhbHJlYWR5IGhhdmUKQEAgLTE5Niw2ICsyMzEsMTQgQEAKIAkJICogc2VjdG9yIGluIGEgbGFyZ2VyIHRoZW4gMSBzZWN0b3IgcmVhZCwgc2luY2UgdGhlIHBlcmZvcm1hbmNlCiAJCSAqIGltcGFjdCBpcyBuZWdpYmxlIHdlIHNldCB0aGlzIGZsYWcgZm9yIGFsbCBVU0IgZGlza3MgKi8KIAkJc2Rldi0+bGFzdF9zZWN0b3JfYnVnID0gMTsKKworCQkvKiBFbmFibGUgbGFzdC1zZWN0b3IgaGFja3MgZm9yIHNpbmdsZS10YXJnZXQgZGV2aWNlcyB1c2luZworCQkgKiB0aGUgQnVsay1vbmx5IHRyYW5zcG9ydCwgdW5sZXNzIHdlIGFscmVhZHkga25vdyB0aGUKKwkJICogY2FwYWNpdHkgd2lsbCBiZSBkZWNyZW1lbnRlZCBvciBpcyBjb3JyZWN0LiAqLworCQlpZiAoISh1cy0+ZmZsYWdzICYgKFVTX0ZMX0ZJWF9DQVBBQ0lUWSB8IFVTX0ZMX0NBUEFDSVRZX09LIHwKKwkJCQkJVVNfRkxfU0NNX01VTFRfVEFSRykpICYmCisJCQkJdXMtPnByb3RvY29sID09IFVTX1BSX0JVTEspCisJCQl1cy0+dXNlX2xhc3Rfc2VjdG9yX2hhY2tzID0gMTsKIAl9IGVsc2UgewogCiAJCS8qIE5vbi1kaXNrLXR5cGUgZGV2aWNlcyBkb24ndCBuZWVkIHRvIGJsYWNrbGlzdCBhbnkgcGFnZXMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3N0b3JhZ2Uvc2RkcjA5LmMgYi9kcml2ZXJzL3VzYi9zdG9yYWdlL3NkZHIwOS5jCmluZGV4IGM1YTU0YjguLjUzMWFlNWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3N0b3JhZ2Uvc2RkcjA5LmMKKysrIGIvZHJpdmVycy91c2Ivc3RvcmFnZS9zZGRyMDkuYwpAQCAtNDUsNiArNDUsNyBAQAogCiAjaW5jbHVkZSA8c2NzaS9zY3NpLmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpX2NtbmQuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfZGV2aWNlLmg+CiAKICNpbmNsdWRlICJ1c2IuaCIKICNpbmNsdWRlICJ0cmFuc3BvcnQuaCIKQEAgLTE0NDYsNiArMTQ0Nyw0OCBAQAogfQogCiAvKgorICogVHJhbnNwb3J0IGZvciB0aGUgTWljcm90ZWNoIERQQ00tVVNCCisgKi8KK2ludCBkcGNtX3RyYW5zcG9ydChzdHJ1Y3Qgc2NzaV9jbW5kICpzcmIsIHN0cnVjdCB1c19kYXRhICp1cykKK3sKKwlpbnQgcmV0OworCisJVVNfREVCVUdQKCJkcGNtX3RyYW5zcG9ydDogTFVOPSVkXG4iLCBzcmItPmRldmljZS0+bHVuKTsKKworCXN3aXRjaCAoc3JiLT5kZXZpY2UtPmx1bikgeworCWNhc2UgMDoKKworCQkvKgorCQkgKiBMVU4gMCBjb3JyZXNwb25kcyB0byB0aGUgQ29tcGFjdEZsYXNoIGNhcmQgcmVhZGVyLgorCQkgKi8KKwkJcmV0ID0gdXNiX3N0b3JfQ0JfdHJhbnNwb3J0KHNyYiwgdXMpOworCQlicmVhazsKKworCWNhc2UgMToKKworCQkvKgorCQkgKiBMVU4gMSBjb3JyZXNwb25kcyB0byB0aGUgU21hcnRNZWRpYSBjYXJkIHJlYWRlci4KKwkJICovCisKKwkJLyoKKwkJICogU2V0IHRoZSBMVU4gdG8gMCAoanVzdCBpbiBjYXNlKS4KKwkJICovCisJCXNyYi0+ZGV2aWNlLT5sdW4gPSAwOworCQlyZXQgPSBzZGRyMDlfdHJhbnNwb3J0KHNyYiwgdXMpOworCQlzcmItPmRldmljZS0+bHVuID0gMTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlVU19ERUJVR1AoImRwY21fdHJhbnNwb3J0OiBJbnZhbGlkIExVTiAlZFxuIiwKKwkJCQlzcmItPmRldmljZS0+bHVuKTsKKwkJcmV0ID0gVVNCX1NUT1JfVFJBTlNQT1JUX0VSUk9SOworCQlicmVhazsKKwl9CisJcmV0dXJuIHJldDsKK30KKworCisvKgogICogVHJhbnNwb3J0IGZvciB0aGUgU2FuZGlzayBTRERSLTA5CiAgKi8KIGludCBzZGRyMDlfdHJhbnNwb3J0KHN0cnVjdCBzY3NpX2NtbmQgKnNyYiwgc3RydWN0IHVzX2RhdGEgKnVzKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc3RvcmFnZS9zZGRyMDkuaCBiL2RyaXZlcnMvdXNiL3N0b3JhZ2Uvc2RkcjA5LmgKaW5kZXggZTUwMDMzYS4uYjcwMTE3MiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc3RvcmFnZS9zZGRyMDkuaAorKysgYi9kcml2ZXJzL3VzYi9zdG9yYWdlL3NkZHIwOS5oCkBAIC0yOCw4ICsyOCwxMSBAQAogLyogU2FuZGlzayBTRERSLTA5IHN0dWZmICovCiAKIGV4dGVybiBpbnQgc2RkcjA5X3RyYW5zcG9ydChzdHJ1Y3Qgc2NzaV9jbW5kICpzcmIsIHN0cnVjdCB1c19kYXRhICp1cyk7Ci0KLWV4dGVybiBpbnQgdXNiX3N0b3Jfc2RkcjA5X2RwY21faW5pdChzdHJ1Y3QgdXNfZGF0YSAqdXMpOwogZXh0ZXJuIGludCB1c2Jfc3Rvcl9zZGRyMDlfaW5pdChzdHJ1Y3QgdXNfZGF0YSAqdXMpOwogCisvKiBNaWNyb3RlY2ggRFBDTS1VU0Igc3R1ZmYgKi8KKworZXh0ZXJuIGludCBkcGNtX3RyYW5zcG9ydChzdHJ1Y3Qgc2NzaV9jbW5kICpzcmIsIHN0cnVjdCB1c19kYXRhICp1cyk7CitleHRlcm4gaW50IHVzYl9zdG9yX3NkZHIwOV9kcGNtX2luaXQoc3RydWN0IHVzX2RhdGEgKnVzKTsKKwogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zdG9yYWdlL3RyYW5zcG9ydC5jIGIvZHJpdmVycy91c2Ivc3RvcmFnZS90cmFuc3BvcnQuYwppbmRleCA3OTEwOGQ1Li4xZDU0MzhlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zdG9yYWdlL3RyYW5zcG9ydC5jCisrKyBiL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdHJhbnNwb3J0LmMKQEAgLTU3LDYgKzU3LDkgQEAKICNpbmNsdWRlICJzY3NpZ2x1ZS5oIgogI2luY2x1ZGUgImRlYnVnLmgiCiAKKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlICIuLi8uLi9zY3NpL3NkLmgiCisKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBEYXRhIHRyYW5zZmVyIHJvdXRpbmVzCkBAIC01MTEsNiArNTE0LDExMCBAQAogICogVHJhbnNwb3J0IHJvdXRpbmVzCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKKy8qIFRoZXJlIGFyZSBzbyBtYW55IGRldmljZXMgdGhhdCByZXBvcnQgdGhlIGNhcGFjaXR5IGluY29ycmVjdGx5LAorICogdGhpcyByb3V0aW5lIHdhcyB3cml0dGVuIHRvIGNvdW50ZXJhY3Qgc29tZSBvZiB0aGUgcmVzdWx0aW5nCisgKiBwcm9ibGVtcy4KKyAqLworc3RhdGljIHZvaWQgbGFzdF9zZWN0b3JfaGFja3Moc3RydWN0IHVzX2RhdGEgKnVzLCBzdHJ1Y3Qgc2NzaV9jbW5kICpzcmIpCit7CisJc3RydWN0IGdlbmRpc2sgKmRpc2s7CisJc3RydWN0IHNjc2lfZGlzayAqc2RrcDsKKwl1MzIgc2VjdG9yOworCisJLyogVG8gUmVwb3J0ICJNZWRpdW0gRXJyb3I6IFJlY29yZCBOb3QgRm91bmQgKi8KKwlzdGF0aWMgdW5zaWduZWQgY2hhciByZWNvcmRfbm90X2ZvdW5kWzE4XSA9IHsKKwkJWzBdCT0gMHg3MCwJCQkvKiBjdXJyZW50IGVycm9yICovCisJCVsyXQk9IE1FRElVTV9FUlJPUiwJCS8qID0gMHgwMyAqLworCQlbN10JPSAweDBhLAkJCS8qIGFkZGl0aW9uYWwgbGVuZ3RoICovCisJCVsxMl0JPSAweDE0CQkJLyogUmVjb3JkIE5vdCBGb3VuZCAqLworCX07CisKKwkvKiBJZiBsYXN0LXNlY3RvciBwcm9ibGVtcyBjYW4ndCBvY2N1ciwgd2hldGhlciBiZWNhdXNlIHRoZQorCSAqIGNhcGFjaXR5IHdhcyBhbHJlYWR5IGRlY3JlbWVudGVkIG9yIGJlY2F1c2UgdGhlIGRldmljZSBpcworCSAqIGtub3duIHRvIHJlcG9ydCB0aGUgY29ycmVjdCBjYXBhY2l0eSwgdGhlbiB3ZSBkb24ndCBuZWVkCisJICogdG8gZG8gYW55dGhpbmcuCisJICovCisJaWYgKCF1cy0+dXNlX2xhc3Rfc2VjdG9yX2hhY2tzKQorCQlyZXR1cm47CisKKwkvKiBXYXMgdGhpcyBjb21tYW5kIGEgUkVBRCgxMCkgb3IgYSBXUklURSgxMCk/ICovCisJaWYgKHNyYi0+Y21uZFswXSAhPSBSRUFEXzEwICYmIHNyYi0+Y21uZFswXSAhPSBXUklURV8xMCkKKwkJZ290byBkb25lOworCisJLyogRGlkIHRoaXMgY29tbWFuZCBhY2Nlc3MgdGhlIGxhc3Qgc2VjdG9yPyAqLworCXNlY3RvciA9IChzcmItPmNtbmRbMl0gPDwgMjQpIHwgKHNyYi0+Y21uZFszXSA8PCAxNikgfAorCQkJKHNyYi0+Y21uZFs0XSA8PCA4KSB8IChzcmItPmNtbmRbNV0pOworCWRpc2sgPSBzcmItPnJlcXVlc3QtPnJxX2Rpc2s7CisJaWYgKCFkaXNrKQorCQlnb3RvIGRvbmU7CisJc2RrcCA9IHNjc2lfZGlzayhkaXNrKTsKKwlpZiAoIXNka3ApCisJCWdvdG8gZG9uZTsKKwlpZiAoc2VjdG9yICsgMSAhPSBzZGtwLT5jYXBhY2l0eSkKKwkJZ290byBkb25lOworCisJaWYgKHNyYi0+cmVzdWx0ID09IFNBTV9TVEFUX0dPT0QgJiYgc2NzaV9nZXRfcmVzaWQoc3JiKSA9PSAwKSB7CisKKwkJLyogVGhlIGNvbW1hbmQgc3VjY2VlZGVkLiAgSWYgdGhlIGNhcGFjaXR5IGlzIG9kZAorCQkgKiAoaS5lLiwgaWYgdGhlIHNlY3RvciBudW1iZXIgaXMgZXZlbikgdGhlbiB0aGUKKwkJICogImFsd2F5cy1ldmVuIiBoZXVyaXN0aWMgd291bGQgYmUgd3JvbmcgZm9yIHRoaXMKKwkJICogZGV2aWNlLiAgSXNzdWUgYSBXQVJOKCkgc28gdGhhdCB0aGUga2VybmVsb29wcy5vcmcKKwkJICogcHJvamVjdCB3aWxsIGJlIG5vdGlmaWVkIGFuZCB3ZSB3aWxsIHRoZW4ga25vdyB0bworCQkgKiBtYXJrIHRoZSBkZXZpY2Ugd2l0aCBhIENBUEFDSVRZX09LIGZsYWcuICBIb3BlZnVsbHkKKwkJICogdGhpcyB3aWxsIG9jY3VyIGZvciBvbmx5IGEgZmV3IGRldmljZXMuCisJCSAqCisJCSAqIFVzZSB0aGUgc2lnbiBvZiB1cy0+bGFzdF9zZWN0b3JfaGFja3MgdG8gdGVsbCB3aGV0aGVyCisJCSAqIHRoZSB3YXJuaW5nIGhhcyBhbHJlYWR5IGJlZW4gaXNzdWVkOyB3ZSBkb24ndCBuZWVkCisJCSAqIG1vcmUgdGhhbiBvbmUgd2FybmluZyBwZXIgZGV2aWNlLgorCQkgKi8KKwkJaWYgKCEoc2VjdG9yICYgMSkgJiYgdXMtPnVzZV9sYXN0X3NlY3Rvcl9oYWNrcyA+IDApIHsKKwkJCXVuc2lnbmVkIHZpZCA9IGxlMTZfdG9fY3B1KAorCQkJCQl1cy0+cHVzYl9kZXYtPmRlc2NyaXB0b3IuaWRWZW5kb3IpOworCQkJdW5zaWduZWQgcGlkID0gbGUxNl90b19jcHUoCisJCQkJCXVzLT5wdXNiX2Rldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QpOworCQkJdW5zaWduZWQgcmV2ID0gbGUxNl90b19jcHUoCisJCQkJCXVzLT5wdXNiX2Rldi0+ZGVzY3JpcHRvci5iY2REZXZpY2UpOworCisJCQlXQVJOKDEsICIlczogU3VjY2Vzc2Z1bCBsYXN0IHNlY3RvciBzdWNjZXNzIGF0ICV1LCAiCisJCQkJCSJkZXZpY2UgJTA0eDolMDR4OiUwNHhcbiIsCisJCQkJCXNka3AtPmRpc2stPmRpc2tfbmFtZSwgc2VjdG9yLAorCQkJCQl2aWQsIHBpZCwgcmV2KTsKKwkJCXVzLT51c2VfbGFzdF9zZWN0b3JfaGFja3MgPSAtMTsKKwkJfQorCisJfSBlbHNlIHsKKwkJLyogVGhlIGNvbW1hbmQgZmFpbGVkLiAgQWxsb3cgdXAgdG8gMyByZXRyaWVzIGluIGNhc2UgdGhpcworCQkgKiBpcyBzb21lIG5vcm1hbCBzb3J0IG9mIGZhaWx1cmUuICBBZnRlciB0aGF0LCBhc3N1bWUgdGhlCisJCSAqIGNhcGFjaXR5IGlzIHdyb25nIGFuZCB3ZSdyZSB0cnlpbmcgdG8gYWNjZXNzIHRoZSBzZWN0b3IKKwkJICogYmV5b25kIHRoZSBlbmQuICBSZXBsYWNlIHRoZSByZXN1bHQgY29kZSBhbmQgc2Vuc2UgZGF0YQorCQkgKiB3aXRoIHZhbHVlcyB0aGF0IHdpbGwgY2F1c2UgdGhlIFNDU0kgY29yZSB0byBmYWlsIHRoZQorCQkgKiBjb21tYW5kIGltbWVkaWF0ZWx5LCBpbnN0ZWFkIG9mIGdvaW5nIGludG8gYW4gaW5maW5pdGUKKwkJICogKG9yIGV2ZW4ganVzdCBhIHZlcnkgbG9uZykgcmV0cnkgbG9vcC4KKwkJICovCisJCWlmICgrK3VzLT5sYXN0X3NlY3Rvcl9yZXRyaWVzIDwgMykKKwkJCXJldHVybjsKKwkJc3JiLT5yZXN1bHQgPSBTQU1fU1RBVF9DSEVDS19DT05ESVRJT047CisJCW1lbWNweShzcmItPnNlbnNlX2J1ZmZlciwgcmVjb3JkX25vdF9mb3VuZCwKKwkJCQlzaXplb2YocmVjb3JkX25vdF9mb3VuZCkpOworCisJCS8qIEluIHRoZW9yeSB3ZSBtaWdodCB3YW50IHRvIGlzc3VlIGEgV0FSTigpIGhlcmUgaWYgdGhlCisJCSAqIGNhcGFjaXR5IGlzIGV2ZW4sIHNpbmNlIGl0IGNvdWxkIGluZGljYXRlIHRoZSBkZXZpY2UKKwkJICogaGFzIHRoZSBSRUFEIENBUEFDSVRZIGJ1ZyBfYW5kXyB0aGUgcmVhbCBjYXBhY2l0eSBpcworCQkgKiBvZGQuICBCdXQgaXQgY291bGQgYWxzbyBpbmRpY2F0ZSB0aGF0IHRoZSBkZXZpY2UKKwkJICogc2ltcGx5IGNhbid0IGFjY2VzcyBpdHMgbGFzdCBzZWN0b3IsIGEgZmFpbHVyZSBtb2RlCisJCSAqIHdoaWNoIGlzIHN1cnByaXNpbmdseSBjb21tb24uICBTbyBubyB3YXJuaW5nLgorCQkgKi8KKwl9CisKKyBkb25lOgorCS8qIERvbid0IHJlc2V0IHRoZSByZXRyeSBjb3VudGVyIGZvciBURVNUIFVOSVQgUkVBRFkgY29tbWFuZHMsCisJICogYmVjYXVzZSB0aGV5IGdldCBpc3N1ZWQgYWZ0ZXIgZGV2aWNlIHJlc2V0cyB3aGljaCBtaWdodCBiZQorCSAqIGNhdXNlZCBieSBhIGZhaWxlZCBsYXN0LXNlY3RvciBhY2Nlc3MuCisJICovCisJaWYgKHNyYi0+Y21uZFswXSAhPSBURVNUX1VOSVRfUkVBRFkpCisJCXVzLT5sYXN0X3NlY3Rvcl9yZXRyaWVzID0gMDsKK30KKwogLyogSW52b2tlIHRoZSB0cmFuc3BvcnQgYW5kIGJhc2ljIGVycm9yLWhhbmRsaW5nL3JlY292ZXJ5IG1ldGhvZHMKICAqCiAgKiBUaGlzIGlzIHVzZWQgYnkgdGhlIHByb3RvY29sIGxheWVycyB0byBhY3R1YWxseSBzZW5kIHRoZSBtZXNzYWdlIHRvCkBAIC01NDQsNiArNjUxLDcgQEAKIAkvKiBpZiB0aGUgdHJhbnNwb3J0IHByb3ZpZGVkIGl0cyBvd24gc2Vuc2UgZGF0YSwgZG9uJ3QgYXV0by1zZW5zZSAqLwogCWlmIChyZXN1bHQgPT0gVVNCX1NUT1JfVFJBTlNQT1JUX05PX1NFTlNFKSB7CiAJCXNyYi0+cmVzdWx0ID0gU0FNX1NUQVRfQ0hFQ0tfQ09ORElUSU9OOworCQlsYXN0X3NlY3Rvcl9oYWNrcyh1cywgc3JiKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtNTc5LDYgKzY4NywyMCBAQAogCX0KIAogCS8qCisJICogRGV0ZXJtaW5lIGlmIHRoaXMgZGV2aWNlIGlzIFNBVCBieSBzZWVpbmcgaWYgdGhlCisJICogY29tbWFuZCBleGVjdXRlZCBzdWNjZXNzZnVsbHkuICBPdGhlcndpc2Ugd2UnbGwgaGF2ZQorCSAqIHRvIHdhaXQgZm9yIGF0IGxlYXN0IG9uZSBDSEVDS19DT05ESVRJT04gdG8gZGV0ZXJtaW5lCisJICogU0FORV9TRU5TRSBzdXBwb3J0CisJICovCisJaWYgKChzcmItPmNtbmRbMF0gPT0gQVRBXzE2IHx8IHNyYi0+Y21uZFswXSA9PSBBVEFfMTIpICYmCisJICAgIHJlc3VsdCA9PSBVU0JfU1RPUl9UUkFOU1BPUlRfR09PRCAmJgorCSAgICAhKHVzLT5mZmxhZ3MgJiBVU19GTF9TQU5FX1NFTlNFKSAmJgorCSAgICAhKHNyYi0+Y21uZFsyXSAmIDB4MjApKSB7CisJCVVTX0RFQlVHUCgiLS0gU0FUIHN1cHBvcnRlZCwgaW5jcmVhc2luZyBhdXRvLXNlbnNlXG4iKTsKKwkJdXMtPmZmbGFncyB8PSBVU19GTF9TQU5FX1NFTlNFOworCX0KKworCS8qCiAJICogQSBzaG9ydCB0cmFuc2ZlciBvbiBhIGNvbW1hbmQgd2hlcmUgd2UgZG9uJ3QgZXhwZWN0IGl0CiAJICogaXMgdW51c3VhbCwgYnV0IGl0IGRvZXNuJ3QgbWVhbiB3ZSBuZWVkIHRvIGF1dG8tc2Vuc2UuCiAJICovCkBAIC01OTUsMTAgKzcxNywxNSBAQAogCWlmIChuZWVkX2F1dG9fc2Vuc2UpIHsKIAkJaW50IHRlbXBfcmVzdWx0OwogCQlzdHJ1Y3Qgc2NzaV9laF9zYXZlIHNlczsKKwkJaW50IHNlbnNlX3NpemUgPSBVU19TRU5TRV9TSVpFOworCisJCS8qIGRldmljZSBzdXBwb3J0cyBhbmQgbmVlZHMgYmlnZ2VyIHNlbnNlIGJ1ZmZlciAqLworCQlpZiAodXMtPmZmbGFncyAmIFVTX0ZMX1NBTkVfU0VOU0UpCisJCQlzZW5zZV9zaXplID0gfjA7CiAKIAkJVVNfREVCVUdQKCJJc3N1aW5nIGF1dG8tUkVRVUVTVF9TRU5TRVxuIik7CiAKLQkJc2NzaV9laF9wcmVwX2NtbmQoc3JiLCAmc2VzLCBOVUxMLCAwLCBVU19TRU5TRV9TSVpFKTsKKwkJc2NzaV9laF9wcmVwX2NtbmQoc3JiLCAmc2VzLCBOVUxMLCAwLCBzZW5zZV9zaXplKTsKIAogCQkvKiBGSVhNRTogd2UgbXVzdCBkbyB0aGUgcHJvdG9jb2wgdHJhbnNsYXRpb24gaGVyZSAqLwogCQlpZiAodXMtPnN1YmNsYXNzID09IFVTX1NDX1JCQyB8fCB1cy0+c3ViY2xhc3MgPT0gVVNfU0NfU0NTSSB8fApAQCAtNjMyLDYgKzc1OSwyNSBAQAogCQkJcmV0dXJuOwogCQl9CiAKKwkJLyogSWYgdGhlIHNlbnNlIGRhdGEgcmV0dXJuZWQgaXMgbGFyZ2VyIHRoYW4gMTgtYnl0ZXMgdGhlbiB3ZQorCQkgKiBhc3N1bWUgdGhpcyBkZXZpY2Ugc3VwcG9ydHMgcmVxdWVzdGluZyBtb3JlIGluIHRoZSBmdXR1cmUuCisJCSAqIFRoZSByZXNwb25zZSBjb2RlIG11c3QgYmUgNzBoIHRocm91Z2ggNzNoIGluY2x1c2l2ZS4KKwkJICovCisJCWlmIChzcmItPnNlbnNlX2J1ZmZlcls3XSA+IChVU19TRU5TRV9TSVpFIC0gOCkgJiYKKwkJICAgICEodXMtPmZmbGFncyAmIFVTX0ZMX1NBTkVfU0VOU0UpICYmCisJCSAgICAoc3JiLT5zZW5zZV9idWZmZXJbMF0gJiAweDdDKSA9PSAweDcwKSB7CisJCQlVU19ERUJVR1AoIi0tIFNBTkVfU0VOU0Ugc3VwcG9ydCBlbmFibGVkXG4iKTsKKwkJCXVzLT5mZmxhZ3MgfD0gVVNfRkxfU0FORV9TRU5TRTsKKworCQkJLyogSW5kaWNhdGUgdG8gdGhlIHVzZXIgdGhhdCB3ZSB0cnVuY2F0ZWQgdGhlaXIgc2Vuc2UKKwkJCSAqIGJlY2F1c2Ugd2UgZGlkbid0IGtub3cgaXQgc3VwcG9ydGVkIGxhcmdlciBzZW5zZS4KKwkJCSAqLworCQkJVVNfREVCVUdQKCItLSBTZW5zZSBkYXRhIHRydW5jYXRlZCB0byAlaSBmcm9tICVpXG4iLAorCQkJICAgICAgICAgIFVTX1NFTlNFX1NJWkUsCisJCQkgICAgICAgICAgc3JiLT5zZW5zZV9idWZmZXJbN10gKyA4KTsKKwkJCXNyYi0+c2Vuc2VfYnVmZmVyWzddID0gKFVTX1NFTlNFX1NJWkUgLSA4KTsKKwkJfQorCiAJCVVTX0RFQlVHUCgiLS0gUmVzdWx0IGZyb20gYXV0by1zZW5zZSBpcyAlZFxuIiwgdGVtcF9yZXN1bHQpOwogCQlVU19ERUJVR1AoIi0tIGNvZGU6IDB4JXgsIGtleTogMHgleCwgQVNDOiAweCV4LCBBU0NROiAweCV4XG4iLAogCQkJICBzcmItPnNlbnNlX2J1ZmZlclswXSwKQEAgLTY2Nyw2ICs4MTMsNyBAQAogCQkJc2NzaV9idWZmbGVuKHNyYikgLSBzY3NpX2dldF9yZXNpZChzcmIpIDwgc3JiLT51bmRlcmZsb3cpCiAJCXNyYi0+cmVzdWx0ID0gKERJRF9FUlJPUiA8PCAxNikgfCAoU1VHR0VTVF9SRVRSWSA8PCAyNCk7CiAKKwlsYXN0X3NlY3Rvcl9oYWNrcyh1cywgc3JiKTsKIAlyZXR1cm47CiAKIAkvKiBFcnJvciBhbmQgYWJvcnQgcHJvY2Vzc2luZzogdHJ5IHRvIHJlc3luY2hyb25pemUgd2l0aCB0aGUgZGV2aWNlCkBAIC02OTQsNiArODQxLDcgQEAKIAkJdXMtPnRyYW5zcG9ydF9yZXNldCh1cyk7CiAJfQogCWNsZWFyX2JpdChVU19GTElEWF9SRVNFVFRJTkcsICZ1cy0+ZGZsYWdzKTsKKwlsYXN0X3NlY3Rvcl9oYWNrcyh1cywgc3JiKTsKIH0KIAogLyogU3RvcCB0aGUgY3VycmVudCBVUkIgdHJhbnNmZXIgKi8KQEAgLTcxOCwxMCArODY2LDEwIEBACiB9CiAKIC8qCi0gKiBDb250cm9sL0J1bGsvSW50ZXJydXB0IHRyYW5zcG9ydAorICogQ29udHJvbC9CdWxrIGFuZCBDb250cm9sL0J1bGsvSW50ZXJydXB0IHRyYW5zcG9ydAogICovCiAKLWludCB1c2Jfc3Rvcl9DQklfdHJhbnNwb3J0KHN0cnVjdCBzY3NpX2NtbmQgKnNyYiwgc3RydWN0IHVzX2RhdGEgKnVzKQoraW50IHVzYl9zdG9yX0NCX3RyYW5zcG9ydChzdHJ1Y3Qgc2NzaV9jbW5kICpzcmIsIHN0cnVjdCB1c19kYXRhICp1cykKIHsKIAl1bnNpZ25lZCBpbnQgdHJhbnNmZXJfbGVuZ3RoID0gc2NzaV9idWZmbGVuKHNyYik7CiAJdW5zaWduZWQgaW50IHBpcGUgPSAwOwpAQCAtNzYzLDYgKzkxMSwxMyBAQAogCX0KIAogCS8qIFNUQVRVUyBTVEFHRSAqLworCisJLyogTk9URTogQ0IgZG9lcyBub3QgaGF2ZSBhIHN0YXR1cyBzdGFnZS4gIFNpbGx5LCBJIGtub3cuICBTbworCSAqIHdlIGhhdmUgdG8gY2F0Y2ggdGhpcyBhdCBhIGhpZ2hlciBsZXZlbC4KKwkgKi8KKwlpZiAodXMtPnByb3RvY29sICE9IFVTX1BSX0NCSSkKKwkJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9HT09EOworCiAJcmVzdWx0ID0gdXNiX3N0b3JfaW50cl90cmFuc2Zlcih1cywgdXMtPmlvYnVmLCAyKTsKIAlVU19ERUJVR1AoIkdvdCBpbnRlcnJ1cHQgZGF0YSAoMHgleCwgMHgleClcbiIsIAogCQkJdXMtPmlvYnVmWzBdLCB1cy0+aW9idWZbMV0pOwpAQCAtODE3LDU2ICs5NzIsNiBAQAogfQogCiAvKgotICogQ29udHJvbC9CdWxrIHRyYW5zcG9ydAotICovCi1pbnQgdXNiX3N0b3JfQ0JfdHJhbnNwb3J0KHN0cnVjdCBzY3NpX2NtbmQgKnNyYiwgc3RydWN0IHVzX2RhdGEgKnVzKQotewotCXVuc2lnbmVkIGludCB0cmFuc2Zlcl9sZW5ndGggPSBzY3NpX2J1ZmZsZW4oc3JiKTsKLQlpbnQgcmVzdWx0OwotCi0JLyogQ09NTUFORCBTVEFHRSAqLwotCS8qIGxldCdzIHNlbmQgdGhlIGNvbW1hbmQgdmlhIHRoZSBjb250cm9sIHBpcGUgKi8KLQlyZXN1bHQgPSB1c2Jfc3Rvcl9jdHJsX3RyYW5zZmVyKHVzLCB1cy0+c2VuZF9jdHJsX3BpcGUsCi0JCQkJICAgICAgVVNfQ0JJX0FEU0MsIAotCQkJCSAgICAgIFVTQl9UWVBFX0NMQVNTIHwgVVNCX1JFQ0lQX0lOVEVSRkFDRSwgMCwgCi0JCQkJICAgICAgdXMtPmlmbnVtLCBzcmItPmNtbmQsIHNyYi0+Y21kX2xlbik7Ci0KLQkvKiBjaGVjayB0aGUgcmV0dXJuIGNvZGUgZm9yIHRoZSBjb21tYW5kICovCi0JVVNfREVCVUdQKCJDYWxsIHRvIHVzYl9zdG9yX2N0cmxfdHJhbnNmZXIoKSByZXR1cm5lZCAlZFxuIiwgcmVzdWx0KTsKLQotCS8qIGlmIHdlIHN0YWxsZWQgdGhlIGNvbW1hbmQsIGl0IG1lYW5zIGNvbW1hbmQgZmFpbGVkICovCi0JaWYgKHJlc3VsdCA9PSBVU0JfU1RPUl9YRkVSX1NUQUxMRUQpIHsKLQkJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9GQUlMRUQ7Ci0JfQotCi0JLyogVWggb2guLi4gc2VyaW91cyBwcm9ibGVtIGhlcmUgKi8KLQlpZiAocmVzdWx0ICE9IFVTQl9TVE9SX1hGRVJfR09PRCkgewotCQlyZXR1cm4gVVNCX1NUT1JfVFJBTlNQT1JUX0VSUk9SOwotCX0KLQotCS8qIERBVEEgU1RBR0UgKi8KLQkvKiB0cmFuc2ZlciB0aGUgZGF0YSBwYXlsb2FkIGZvciB0aGlzIGNvbW1hbmQsIGlmIG9uZSBleGlzdHMqLwotCWlmICh0cmFuc2Zlcl9sZW5ndGgpIHsKLQkJdW5zaWduZWQgaW50IHBpcGUgPSBzcmItPnNjX2RhdGFfZGlyZWN0aW9uID09IERNQV9GUk9NX0RFVklDRSA/IAotCQkJCXVzLT5yZWN2X2J1bGtfcGlwZSA6IHVzLT5zZW5kX2J1bGtfcGlwZTsKLQkJcmVzdWx0ID0gdXNiX3N0b3JfYnVsa19zcmIodXMsIHBpcGUsIHNyYik7Ci0JCVVTX0RFQlVHUCgiQ0IgZGF0YSBzdGFnZSByZXN1bHQgaXMgMHgleFxuIiwgcmVzdWx0KTsKLQotCQkvKiBpZiB3ZSBzdGFsbGVkIHRoZSBkYXRhIHRyYW5zZmVyIGl0IG1lYW5zIGNvbW1hbmQgZmFpbGVkICovCi0JCWlmIChyZXN1bHQgPT0gVVNCX1NUT1JfWEZFUl9TVEFMTEVEKQotCQkJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9GQUlMRUQ7Ci0JCWlmIChyZXN1bHQgPiBVU0JfU1RPUl9YRkVSX1NUQUxMRUQpCi0JCQlyZXR1cm4gVVNCX1NUT1JfVFJBTlNQT1JUX0VSUk9SOwotCX0KLQotCS8qIFNUQVRVUyBTVEFHRSAqLwotCS8qIE5PVEU6IENCIGRvZXMgbm90IGhhdmUgYSBzdGF0dXMgc3RhZ2UuICBTaWxseSwgSSBrbm93LiAgU28KLQkgKiB3ZSBoYXZlIHRvIGNhdGNoIHRoaXMgYXQgYSBoaWdoZXIgbGV2ZWwuCi0JICovCi0JcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9HT09EOwotfQotCi0vKgogICogQnVsayBvbmx5IHRyYW5zcG9ydAogICovCiAKQEAgLTExNzMsMTAgKzEyNzgsOSBAQAogICovCiBpbnQgdXNiX3N0b3JfcG9ydF9yZXNldChzdHJ1Y3QgdXNfZGF0YSAqdXMpCiB7Ci0JaW50IHJlc3VsdCwgcmNfbG9jazsKKwlpbnQgcmVzdWx0OwogCi0JcmVzdWx0ID0gcmNfbG9jayA9Ci0JCXVzYl9sb2NrX2RldmljZV9mb3JfcmVzZXQodXMtPnB1c2JfZGV2LCB1cy0+cHVzYl9pbnRmKTsKKwlyZXN1bHQgPSB1c2JfbG9ja19kZXZpY2VfZm9yX3Jlc2V0KHVzLT5wdXNiX2RldiwgdXMtPnB1c2JfaW50Zik7CiAJaWYgKHJlc3VsdCA8IDApCiAJCVVTX0RFQlVHUCgidW5hYmxlIHRvIGxvY2sgZGV2aWNlIGZvciByZXNldDogJWRcbiIsIHJlc3VsdCk7CiAJZWxzZSB7CkBAIC0xMTg5LDggKzEyOTMsNyBAQAogCQkJVVNfREVCVUdQKCJ1c2JfcmVzZXRfZGV2aWNlIHJldHVybnMgJWRcbiIsCiAJCQkJCXJlc3VsdCk7CiAJCX0KLQkJaWYgKHJjX2xvY2spCi0JCQl1c2JfdW5sb2NrX2RldmljZSh1cy0+cHVzYl9kZXYpOworCQl1c2JfdW5sb2NrX2RldmljZSh1cy0+cHVzYl9kZXYpOwogCX0KIAlyZXR1cm4gcmVzdWx0OwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc3RvcmFnZS90cmFuc3BvcnQuaCBiL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdHJhbnNwb3J0LmgKaW5kZXggZTcwYjg4MS4uMjQyZmY1ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc3RvcmFnZS90cmFuc3BvcnQuaAorKysgYi9kcml2ZXJzL3VzYi9zdG9yYWdlL3RyYW5zcG9ydC5oCkBAIC0xMTMsOCArMTEzLDYgQEAKIAogI2RlZmluZSBVU19DQklfQURTQwkJMAogCi1leHRlcm4gaW50IHVzYl9zdG9yX0NCSV90cmFuc3BvcnQoc3RydWN0IHNjc2lfY21uZCAqLCBzdHJ1Y3QgdXNfZGF0YSopOwotCiBleHRlcm4gaW50IHVzYl9zdG9yX0NCX3RyYW5zcG9ydChzdHJ1Y3Qgc2NzaV9jbW5kICosIHN0cnVjdCB1c19kYXRhKik7CiBleHRlcm4gaW50IHVzYl9zdG9yX0NCX3Jlc2V0KHN0cnVjdCB1c19kYXRhKik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdW51c3VhbF9kZXZzLmggYi9kcml2ZXJzL3VzYi9zdG9yYWdlL3VudXN1YWxfZGV2cy5oCmluZGV4IGJmY2MxZmUuLmE3Zjk1MTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdW51c3VhbF9kZXZzLmgKKysrIGIvZHJpdmVycy91c2Ivc3RvcmFnZS91bnVzdWFsX2RldnMuaApAQCAtMjcsNyArMjcsOCBAQAogCiAvKiBJTVBPUlRBTlQgTk9URTogVGhpcyBmaWxlIG11c3QgYmUgaW5jbHVkZWQgaW4gYW5vdGhlciBmaWxlIHdoaWNoIGRvZXMKICAqIHRoZSBmb2xsb3dpbmcgdGhpbmcgZm9yIGl0IHRvIHdvcms6Ci0gKiBUaGUgbWFjcm8gVU5VU1VBTF9ERVYoKSBtdXN0IGJlIGRlZmluZWQgYmVmb3JlIHRoaXMgZmlsZSBpcyBpbmNsdWRlZAorICogVGhlIFVOVVNVQUxfREVWLCBDT01QTElBTlRfREVWLCBhbmQgVVNVQUxfREVWIG1hY3JvcyBtdXN0IGJlIGRlZmluZWQKKyAqIGJlZm9yZSB0aGlzIGZpbGUgaXMgaW5jbHVkZWQuCiAgKi8KIAogLyogSWYgeW91IGVkaXQgdGhpcyBmaWxlLCBwbGVhc2UgdHJ5IHRvIGtlZXAgaXQgc29ydGVkIGZpcnN0IGJ5IFZlbmRvcklELApAQCAtNDYsNiArNDcsMTIgQEAKICAqIDx1c2Itc3RvcmFnZUBsaXN0cy5vbmUtZXllZC1hbGllbi5uZXQ+CiAgKi8KIAorLyogTm90ZTogSWYgeW91IGFkZCBhbiBlbnRyeSBvbmx5IGluIG9yZGVyIHRvIHNldCB0aGUgQ0FQQUNJVFlfT0sgZmxhZywKKyAqIHVzZSB0aGUgQ09NUExJQU5UX0RFViBtYWNybyBpbnN0ZWFkIG9mIFVOVVNVQUxfREVWLiAgVGhpcyBpcworICogYmVjYXVzZSBzdWNoIGVudHJpZXMgbWFyayBkZXZpY2VzIHdoaWNoIGFjdHVhbGx5IHdvcmsgY29ycmVjdGx5LAorICogYXMgb3Bwb3NlZCB0byBkZXZpY2VzIHRoYXQgZG8gc29tZXRoaW5nIHN0cmFuZ2VseSBvciB3cm9uZ2x5LgorICovCisKIC8qIHBhdGNoIHN1Ym1pdHRlZCBieSBWaXZpYW4gQnJlZ2llciA8Vml2aWFuLkJyZWdpZXJAaW1hZy5mcj4KICAqLwogVU5VU1VBTF9ERVYoICAweDAzZWIsIDB4MjAwMiwgMHgwMTAwLCAweDAxMDAsCkBAIC04NSw2ICs5MiwxMyBAQAogCQlVU19TQ184MDcwLCBVU19QUl9VU0JBVCwgaW5pdF91c2JhdF9jZCwgMCksCiAjZW5kaWYKIAorLyogUmVwb3J0ZWQgYnkgQmVuIEVmcm9zIDxiZW5AcGMtZG9jdG9yLmNvbT4gKi8KK1VOVVNVQUxfREVWKCAgMHgwM2YwLCAweDA3MGMsIDB4MDAwMCwgMHgwMDAwLAorCQkiSFAiLAorCQkiUGVyc29uYWwgTWVkaWEgRHJpdmUiLAorCQlVU19TQ19ERVZJQ0UsIFVTX1BSX0RFVklDRSwgTlVMTCwKKwkJVVNfRkxfU0FORV9TRU5TRSApLAorCiAvKiBSZXBvcnRlZCBieSBHcmFudCBHcnVuZGxlciA8Z3J1bmRsZXJAcGFyaXNjLWxpbnV4Lm9yZz4KICAqIEhQIHI3MDcgY2FtZXJhIGluICJEaXNrIiBtb2RlIHdpdGggMi4wMC4yMyBvciAyLjAwLjI0IGZpcm13YXJlLgogICovCkBAIC0xNjAsMzQgKzE3NCw2IEBACiAJCVVTX1NDX0RFVklDRSwgVVNfUFJfREVWSUNFLCBOVUxMLAogCQlVU19GTF9NQVhfU0VDVE9SU182NCApLAogCi0vKiBSZXBvcnRlZCBieSBGaWxpcCBKb2Vsc3NvbiA8ZmlsaXBAYmx1ZXR1cnRsZS5udT4gKi8KLVVOVVNVQUxfREVWKCAgMHgwNDIxLCAweDAwNWQsIDB4MDAwMSwgMHgwNjAwLAotCQkiTm9raWEiLAotCQkiTm9raWEgMzExMGMiLAotCQlVU19TQ19ERVZJQ0UsIFVTX1BSX0RFVklDRSwgTlVMTCwKLQkJVVNfRkxfRklYX0NBUEFDSVRZICksCi0KLS8qIFJlcG9ydGVkIGJ5IE96YW4gU2VuZXIgPHRoZW1nenp5QGdtYWlsLmNvbT4gKi8KLVVOVVNVQUxfREVWKCAgMHgwNDIxLCAweDAwNjAsIDB4MDU1MSwgMHgwNTUxLAotCQkiTm9raWEiLAotCQkiMzUwMGMiLAotCQlVU19TQ19ERVZJQ0UsIFVTX1BSX0RFVklDRSwgTlVMTCwKLQkJVVNfRkxfRklYX0NBUEFDSVRZICksCi0KLS8qIFJlcG9ydGVkIGJ5IENTRUNTWSBMYXN6bG8gPGJvb2JhYUBmcnVnYWx3YXJlLm9yZz4gKi8KLVVOVVNVQUxfREVWKCAgMHgwNDIxLCAweDAwNjMsIDB4MDAwMSwgMHgwNjAxLAotCQkiTm9raWEiLAotCQkiTm9raWEgMzEwOWMiLAotCQlVU19TQ19ERVZJQ0UsIFVTX1BSX0RFVklDRSwgTlVMTCwKLQkJVVNfRkxfRklYX0NBUEFDSVRZICksCi0KLS8qIFBhdGNoIGZvciBOb2tpYSA1MzEwIGNhcGFjaXR5ICovCi1VTlVTVUFMX0RFViggIDB4MDQyMSwgMHgwMDZhLCAweDAwMDAsIDB4MDcwMSwKLQkJIk5va2lhIiwKLQkJIjUzMTAiLAotCQlVU19TQ19ERVZJQ0UsIFVTX1BSX0RFVklDRSwgTlVMTCwKLQkJVVNfRkxfRklYX0NBUEFDSVRZICksCi0KIC8qIFJlcG9ydGVkIGJ5IE1hcmlvIFJldHRpZyA8bWFyaW9yZXR0aWdAd2ViLmRlPiAqLwogVU5VU1VBTF9ERVYoICAweDA0MjEsIDB4MDQyZSwgMHgwMTAwLCAweDAxMDAsCiAJCSJOb2tpYSIsCkBAIC0yNTMsMzUgKzIzOSw2IEBACiAJCVVTX1NDX0RFVklDRSwgVVNfUFJfREVWSUNFLCBOVUxMLAogCQlVU19GTF9NQVhfU0VDVE9SU182NCApLAogCi0vKiBSZXBvcnRlZCBieSBDZWRyaWMgR29kaW4gPGNlZHJpY0BiZWxib25lLmJlPiAqLwotVU5VU1VBTF9ERVYoICAweDA0MjEsIDB4MDRiOSwgMHgwNTAwLCAweDA1NTEsCi0JCSJOb2tpYSIsCi0JCSI1MzAwIiwKLQkJVVNfU0NfREVWSUNFLCBVU19QUl9ERVZJQ0UsIE5VTEwsCi0JCVVTX0ZMX0ZJWF9DQVBBQ0lUWSApLAotCi0vKiBSZXBvcnRlZCBieSBSaWNoYXJkIE5hdWJlciA8UmljaGFyZE5hdWJlckB3ZWIuZGU+ICovCi1VTlVTVUFMX0RFViggIDB4MDQyMSwgMHgwNGZhLCAweDA1NTAsIDB4MDY2MCwKLQkJIk5va2lhIiwKLQkJIjYzMDAiLAotCQlVU19TQ19ERVZJQ0UsIFVTX1BSX0RFVklDRSwgTlVMTCwKLQkJVVNfRkxfRklYX0NBUEFDSVRZICksCi0KLS8qIFBhdGNoIGZvciBOb2tpYSA1MzEwIGNhcGFjaXR5ICovCi1VTlVTVUFMX0RFViggIDB4MDQyMSwgMHgwMDZhLCAweDAwMDAsIDB4MDU5MSwKLQkiTm9raWEiLAotCSI1MzEwIiwKLQlVU19TQ19ERVZJQ0UsIFVTX1BSX0RFVklDRSwgTlVMTCwKLQlVU19GTF9GSVhfQ0FQQUNJVFkgKSwKLQotLyogU3VibWl0dGVkIGJ5IFJpY2t5IFdvbmcgWXVuZyBGZWkgPGV2aWxibGFkZXdhcnJpb3JAZ21haWwuY29tPiAqLwotLyogTm9raWEgNzYxMCBTdXBlcm5vdmEgLSBUb28gbWFueSBzZWN0b3JzIHJlcG9ydGVkIGluIHVzYiBzdG9yYWdlIG1vZGUgKi8KLVVOVVNVQUxfREVWKCAgMHgwNDIxLCAweDAwZjUsIDB4MDAwMCwgMHgwNDcwLAotCSJOb2tpYSIsCi0JIjc2MTAgU3VwZXJub3ZhIiwKLQlVU19TQ19ERVZJQ0UsIFVTX1BSX0RFVklDRSwgTlVMTCwKLQlVU19GTF9GSVhfQ0FQQUNJVFkgKSwKLQogLyogUmVwb3J0ZWQgYnkgT2xhZiBIZXJpbmcgPG9saEBzdXNlLmRlPiBmcm9tIG5vdmVsbCBidWcgIzEwNTg3OCAqLwogVU5VU1VBTF9ERVYoICAweDA0MjQsIDB4MGZkYywgMHgwMjEwLCAweDAyMTAsCiAJCSJTTVNDIiwKQEAgLTI4OSwxMSArMjQ2LDE3IEBACiAJCVVTX1NDX0RFVklDRSwgVVNfUFJfREVWSUNFLCBOVUxMLAogCQlVU19GTF9TSU5HTEVfTFVOICksCiAKLSNpZmRlZiBDT05GSUdfVVNCX1NUT1JBR0VfRFBDTQorI2lmZGVmIENPTkZJR19VU0JfU1RPUkFHRV9TRERSMDkKIFVOVVNVQUxfREVWKCAgMHgwNDM2LCAweDAwMDUsIDB4MDEwMCwgMHgwMTAwLAogCQkiTWljcm90ZWNoIiwKIAkJIkNhbWVyYU1hdGUgKERQQ01fVVNCKSIsCiAgCQlVU19TQ19TQ1NJLCBVU19QUl9EUENNX1VTQiwgTlVMTCwgMCApLAorI2Vsc2UKK1VOVVNVQUxfREVWKCAgMHgwNDM2LCAweDAwMDUsIDB4MDEwMCwgMHgwMTAwLAorCQkiTWljcm90ZWNoIiwKKwkJIkNhbWVyYU1hdGUiLAorCQlVU19TQ19TQ1NJLCBVU19QUl9DQiwgTlVMTCwKKwkJVVNfRkxfU0lOR0xFX0xVTiApLAogI2VuZGlmCiAKIC8qIFBhdGNoIHN1Ym1pdHRlZCBieSBEYW5pZWwgRHJha2UgPGRzZEBnZW50b28ub3JnPgpAQCAtMzg4LDk4ICszNTEsNiBAQAogCQkiRFZELUNBTSBEWi1NVjEwMEEgQ2FtY29yZGVyIiwKIAkJVVNfU0NfU0NTSSwgVVNfUFJfQ0IsIE5VTEwsIFVTX0ZMX1NJTkdMRV9MVU4pLAogCi0vKiBQYXRjaCBmb3IgTmlrb24gY29vbHBpeCAyMDAwCi0gKiBTdWJtaXR0ZWQgYnkgRmFiaWVuIENvc3NlIDxmYWJpZW4uY29zc2VAd2FuYWRvby5mcj4qLwotVU5VU1VBTF9ERVYoICAweDA0YjAsIDB4MDMwMSwgMHgwMDEwLCAweDAwMTAsCi0JCSJOSUtPTiIsCi0JCSJOSUtPTiBEU0MgRTIwMDAiLAotCQlVU19TQ19ERVZJQ0UsIFVTX1BSX0RFVklDRSxOVUxMLAotCQlVU19GTF9OT1RfTE9DS0FCTEUgKSwKLQotLyogUmVwb3J0ZWQgYnkgU3RlZmFuIGRlIEtvbmluayA8c2tpbmtpZUB4czRhbGwubmw+ICovCi1VTlVTVUFMX0RFViggIDB4MDRiMCwgMHgwNDAxLCAweDAyMDAsIDB4MDIwMCwKLQkJIk5JS09OIiwKLQkJIk5JS09OIERTQyBEMTAwIiwKLQkJVVNfU0NfREVWSUNFLCBVU19QUl9ERVZJQ0UsIE5VTEwsCi0JCVVTX0ZMX0ZJWF9DQVBBQ0lUWSksCi0KLS8qIFJlcG9ydGVkIGJ5IFRvYmlhcyBLdW56ZSBCcmlzZW5vIDx0LWxpbnV4QGZpY3RpdmUuY29tPiAqLwotVU5VU1VBTF9ERVYoICAweDA0YjAsIDB4MDQwMywgMHgwMjAwLCAweDAyMDAsCi0JCSJOSUtPTiIsCi0JCSJOSUtPTiBEU0MgRDJIIiwKLQkJVVNfU0NfREVWSUNFLCBVU19QUl9ERVZJQ0UsIE5VTEwsCi0JCVVTX0ZMX0ZJWF9DQVBBQ0lUWSksCi0KLS8qIFJlcG9ydGVkIGJ5IE1pbGluZXZza3kgRG1pdHJ5IDxuaWFtLm5pYW1AZ21haWwuY29tPiAqLwotVU5VU1VBTF9ERVYoICAweDA0YjAsIDB4MDQwOSwgMHgwMTAwLCAweDAxMDAsCi0JCSJOSUtPTiIsCi0JCSJOSUtPTiBEU0MgRDUwIiwKLQkJVVNfU0NfREVWSUNFLCBVU19QUl9ERVZJQ0UsIE5VTEwsCi0JCVVTX0ZMX0ZJWF9DQVBBQ0lUWSksCi0KLS8qIFJlcG9ydGVkIGJ5IEFuZHJlYXMgQm9ja2hvbGQgPGFuZHJlYXNAYm9ja2lvbmxpbmUuZGU+ICovCi1VTlVTVUFMX0RFViggIDB4MDRiMCwgMHgwNDA1LCAweDAxMDAsIDB4MDEwMCwKLQkJIk5JS09OIiwKLQkJIk5JS09OIERTQyBENzAiLAotCQlVU19TQ19ERVZJQ0UsIFVTX1BSX0RFVklDRSwgTlVMTCwKLQkJVVNfRkxfRklYX0NBUEFDSVRZKSwKLQotLyogUmVwb3J0ZWQgYnkgSmFtaWUgS2l0c29uIDxqYW1pZUBzdGFiZXJpbmRlLmZzbmV0LmNvLnVrPiAqLwotVU5VU1VBTF9ERVYoICAweDA0YjAsIDB4MDQwZCwgMHgwMTAwLCAweDAxMDAsCi0JCSJOSUtPTiIsCi0JCSJOSUtPTiBEU0MgRDcwcyIsCi0JCVVTX1NDX0RFVklDRSwgVVNfUFJfREVWSUNFLCBOVUxMLAotCQlVU19GTF9GSVhfQ0FQQUNJVFkpLAotCi0vKiBSZXBvcnRlZCBieSBHcmFiZXIgYW5kIE1pa2UgUGFnYW5vIDxtcGFnYW5vLWtlcm5lbEBtcGFnYW5vLmNvbT4gKi8KLVVOVVNVQUxfREVWKCAgMHgwNGIwLCAweDA0MGYsIDB4MDEwMCwgMHgwMjAwLAotCQkiTklLT04iLAotCQkiTklLT04gRFNDIEQyMDAiLAotCQlVU19TQ19ERVZJQ0UsIFVTX1BSX0RFVklDRSwgTlVMTCwKLQkJVVNfRkxfRklYX0NBUEFDSVRZKSwKLQotLyogUmVwb3J0ZWQgYnkgRW1pbCBMYXJzc29uIDxlbWlsQHN3aXAubmV0PiAqLwotVU5VU1VBTF9ERVYoICAweDA0YjAsIDB4MDQxMSwgMHgwMTAwLCAweDAxMTEsCi0JCSJOSUtPTiIsCi0JCSJOSUtPTiBEU0MgRDgwIiwKLQkJVVNfU0NfREVWSUNFLCBVU19QUl9ERVZJQ0UsIE5VTEwsCi0JCVVTX0ZMX0ZJWF9DQVBBQ0lUWSksCi0KLS8qIFJlcG9ydGVkIGJ5IE9ydHdpbiBHbHVlY2sgPG9kaUBvZGkuY2g+ICovCi1VTlVTVUFMX0RFViggIDB4MDRiMCwgMHgwNDEzLCAweDAxMTAsIDB4MDExMSwKLQkJIk5JS09OIiwKLQkJIk5JS09OIERTQyBENDAiLAotCQlVU19TQ19ERVZJQ0UsIFVTX1BSX0RFVklDRSwgTlVMTCwKLQkJVVNfRkxfRklYX0NBUEFDSVRZKSwKLQotLyogUmVwb3J0ZWQgYnkgUGF1bCBDaGVjayA8cGF1bEBvcGVuc3RyZWV0LmNvbT4gKi8KLVVOVVNVQUxfREVWKCAgMHgwNGIwLCAweDA0MTUsIDB4MDEwMCwgMHgwMTAwLAotCQkiTklLT04iLAotCQkiTklLT04gRFNDIEQyWHMiLAotCQlVU19TQ19ERVZJQ0UsIFVTX1BSX0RFVklDRSwgTlVMTCwKLQkJVVNfRkxfRklYX0NBUEFDSVRZKSwKLQotLyogUmVwb3J0ZWQgYnkgU2hhbiBEZXN0cm9tcCAoc2hhbnNhbkBnbWFpbC5jb20pICovCi1VTlVTVUFMX0RFViggIDB4MDRiMCwgMHgwNDE3LCAweDAxMDAsIDB4MDEwMCwKLQkJIk5JS09OIiwKLQkJIk5JS09OIERTQyBENDBYIiwKLQkJVVNfU0NfREVWSUNFLCBVU19QUl9ERVZJQ0UsIE5VTEwsCi0JCVVTX0ZMX0ZJWF9DQVBBQ0lUWSksCi0KLS8qIFJlcG9ydGVkIGJ5IHBhdWwgcmVhZHkgPGx4dHdpbkBob21lY2FsbC5jby51az4gKi8KLVVOVVNVQUxfREVWKCAgMHgwNGIwLCAweDA0MTksIDB4MDEwMCwgMHgwMjAwLAotCQkiTklLT04iLAotCQkiTklLT04gRFNDIEQzMDAiLAotCQlVU19TQ19ERVZJQ0UsIFVTX1BSX0RFVklDRSwgTlVMTCwKLQkJVVNfRkxfRklYX0NBUEFDSVRZKSwKLQotLyogUmVwb3J0ZWQgYnkgRG91ZyBNYXhleSAoZHdtQGF1c3Rpbi5pYm0uY29tKSAqLwotVU5VU1VBTF9ERVYoICAweDA0YjMsIDB4NDAwMSwgMHgwMTEwLCAweDAxMTAsCi0JCSJJQk0iLAotCQkiSUJNIFJTQTIiLAotCQlVU19TQ19ERVZJQ0UsIFVTX1BSX0NCLCBOVUxMLAotCQlVU19GTF9NQVhfU0VDVE9SU19NSU4pLAotCiAvKiBCRU5RIERDNTMzMAogICogUmVwb3J0ZWQgYnkgTWFudWVsIEZvbWJ1ZW5hIDxtZm9tYnVlbmFAeWEuY29tPiBhbmQKICAqIEZyYW5rIENvcGVsYW5kIDxmamNAdGhpbmd5LmFwYW5hLm9yZy5hdT4gKi8KQEAgLTQ4OSw2ICszNjAsMjEgQEAKIAkJVVNfU0NfREVWSUNFLCBVU19QUl9ERVZJQ0UsIE5VTEwsCiAJCVVTX0ZMX0lHTk9SRV9SRVNJRFVFICksCiAKKy8qIFBhdGNoIGZvciBOaWtvbiBjb29scGl4IDIwMDAKKyAqIFN1Ym1pdHRlZCBieSBGYWJpZW4gQ29zc2UgPGZhYmllbi5jb3NzZUB3YW5hZG9vLmZyPiovCitVTlVTVUFMX0RFViggIDB4MDRiMCwgMHgwMzAxLCAweDAwMTAsIDB4MDAxMCwKKwkJIk5JS09OIiwKKwkJIk5JS09OIERTQyBFMjAwMCIsCisJCVVTX1NDX0RFVklDRSwgVVNfUFJfREVWSUNFLE5VTEwsCisJCVVTX0ZMX05PVF9MT0NLQUJMRSApLAorCisvKiBSZXBvcnRlZCBieSBEb3VnIE1heGV5IChkd21AYXVzdGluLmlibS5jb20pICovCitVTlVTVUFMX0RFViggIDB4MDRiMywgMHg0MDAxLCAweDAxMTAsIDB4MDExMCwKKwkJIklCTSIsCisJCSJJQk0gUlNBMiIsCisJCVVTX1NDX0RFVklDRSwgVVNfUFJfQ0IsIE5VTEwsCisJCVVTX0ZMX01BWF9TRUNUT1JTX01JTiksCisKICNpZmRlZiBDT05GSUdfVVNCX1NUT1JBR0VfQ1lQUkVTU19BVEFDQgogLyogQ1k3QzY4MzAwIDogc3VwcG9ydCBhdGFjYiAqLwogVU5VU1VBTF9ERVYoICAweDA0YjQsIDB4NjgzMCwgMHgwMDAwLCAweDk5OTksCkBAIC01OTQsNiArNDgwLDEyIEBACiAJCSJlVVNCIFNtYXJ0TWVkaWEgLyBDb21wYWN0Rmxhc2ggQWRhcHRlciIsCiAJCVVTX1NDX1NDU0ksIFVTX1BSX0RQQ01fVVNCLCB1c2Jfc3Rvcl9zZGRyMDlfZHBjbV9pbml0LAogCQkwKSwKKyNlbHNlCitVTlVTVUFMX0RFViggIDB4MDRlNiwgMHgwMDA1LCAweDAxMDAsIDB4MDIwOCwKKwkJIlNDTSBNaWNyb3N5c3RlbXMiLAorCQkiZVVTQiBDb21wYWN0Rmxhc2ggQWRhcHRlciIsCisJCVVTX1NDX1NDU0ksIFVTX1BSX0NCLCBOVUxMLAorCQlVU19GTF9TSU5HTEVfTFVOKSwKICNlbmRpZgogCiAvKiBSZXBvcnRlZCBieSBNYXJrdXMgRGVtbGVpdG5lciA8bXNkZW1sZWlAY2wudW5pLWhlaWRlbGJlcmcuZGU+ICovCkBAIC02ODUsNiArNTc3LDEzIEBACiAJCVVTX1NDXzgwNzAsIFVTX1BSX0RFVklDRSwgTlVMTCwKIAkJVVNfRkxfRklYX0lOUVVJUlkgKSwKIAorLyogQWRkZWQgYnkgQWxhbiBTdGVybiA8c3Rlcm5Acm93bGFuZC5oYXJ2YXJkLmVkdT4gKi8KK0NPTVBMSUFOVF9ERVYoMHgwNTI1LCAweGE0YTUsIDB4MDAwMCwgMHg5OTk5LAorCQkiTGludXgiLAorCQkiRmlsZS1iYWNrZWQgU3RvcmFnZSBHYWRnZXQiLAorCQlVU19TQ19ERVZJQ0UsIFVTX1BSX0RFVklDRSwgTlVMTCwKKwkJVVNfRkxfQ0FQQUNJVFlfT0sgKSwKKwogLyogWWFrdW1vIE1lZ2EgSW1hZ2UgMzcKICAqIFN1Ym1pdHRlZCBieSBTdGVwaGFuIEZ1aHJtYW5uIDxhdG9tZW5lcmdpZUB0LW9ubGluZS5kZT4gKi8KIFVOVVNVQUxfREVWKCAgMHgwNTJiLCAweDE4MDEsIDB4MDEwMCwgMHgwMTAwLApAQCAtODA3LDE1ICs3MDYsMTUgQEAKIAkJVVNfU0NfREVWSUNFLCBVU19QUl9ERVZJQ0UsIE5VTEwsCiAJCVVTX0ZMX0ZJWF9JTlFVSVJZICksCiAKLS8qIFN1Ym1pdHRlZCBieSBNaWtlIEFsYm9ybiA8bWFsYm9ybkBkZWFuZHJhLmhvbWVpcC5uZXQ+ICovCi1VTlVTVUFMX0RFViggIDB4MDU0YywgMHgwMTZhLCAweDAwMDAsIDB4OTk5OSwKKy8qIFN1Ym1pdHRlZCBieSBGcmFuayBFbmdlbCA8ZnJhbmtpZUBjc2UudW5zdy5lZHUuYXU+ICovCitVTlVTVUFMX0RFViggIDB4MDU0YywgMHgwMDk5LCAweDAwMDAsIDB4OTk5OSwKIAkJIlNvbnkiLAogCQkiUEVHIE1hc3MgU3RvcmFnZSIsCiAJCVVTX1NDX0RFVklDRSwgVVNfUFJfREVWSUNFLCBOVUxMLAogCQlVU19GTF9GSVhfSU5RVUlSWSApLAotCQkKLS8qIFN1Ym1pdHRlZCBieSBGcmFuayBFbmdlbCA8ZnJhbmtpZUBjc2UudW5zdy5lZHUuYXU+ICovCi1VTlVTVUFMX0RFViggIDB4MDU0YywgMHgwMDk5LCAweDAwMDAsIDB4OTk5OSwKKworLyogU3VibWl0dGVkIGJ5IE1pa2UgQWxib3JuIDxtYWxib3JuQGRlYW5kcmEuaG9tZWlwLm5ldD4gKi8KK1VOVVNVQUxfREVWKCAgMHgwNTRjLCAweDAxNmEsIDB4MDAwMCwgMHg5OTk5LAogCQkiU29ueSIsCiAJCSJQRUcgTWFzcyBTdG9yYWdlIiwKIAkJVVNfU0NfREVWSUNFLCBVU19QUl9ERVZJQ0UsIE5VTEwsCkBAIC05NjYsNiArODY1LDE4IEBACiAJCVVTX1NDX0RFVklDRSwgVVNfUFJfREVWSUNFLCBOVUxMLAogCQlVU19GTF9GSVhfQ0FQQUNJVFkgKSwKIAorLyogUmVwb3J0ZWQgYnkgRGFuIFdpbGxpYW1zIDxkY2J3QHJlZGhhdC5jb20+CisgKiBPcHRpb24gTi5WLiBtb2JpbGUgYnJvYWRiYW5kIG1vZGVtcworICogSWdub3JlIGRyaXZlciBDRCBtb2RlIGFuZCBmb3JjZSBpbnRvIG1vZGVtIG1vZGUgYnkgZGVmYXVsdC4KKyAqLworCisvKiBHbG9iZXRyb3R0ZXIgSFNEUEE7IG1hc3Mgc3RvcmFnZSBzaG93cyB1cCBhcyBRdWFsY29tbSBmb3IgdmVuZG9yICovCitVTlVTVUFMX0RFViggIDB4MDVjNiwgMHgxMDAwLCAweDAwMDAsIDB4OTk5OSwKKwkJIk9wdGlvbiBOLlYuIiwKKwkJIk1hc3MgU3RvcmFnZSIsCisJCVVTX1NDX0RFVklDRSwgVVNfUFJfREVWSUNFLCBvcHRpb25fbXNfaW5pdCwKKwkJMCksCisKICNpZmRlZiBDT05GSUdfVVNCX1NUT1JBR0VfSlVNUFNIT1QKIFVOVVNVQUxfREVWKCAgMHgwNWRjLCAweDAwMDEsIDB4MDAwMCwgMHgwMDAxLAogCQkiTGV4YXIiLApAQCAtMTAwNCw2ICs5MTUsMTMgQEAKIAkJVVNfU0NfREVWSUNFLCBVU19QUl9ERVZJQ0UsIE5VTEwsCiAJCVVTX0ZMX0dPX1NMT1cgfCBVU19GTF9NQVhfU0VDVE9SU182NCApLAogCisvKiBSZXBvcnRlZCBieSBCZW4gRWZyb3MgPGJlbkBwYy1kb2N0b3IuY29tPiAqLworVU5VU1VBTF9ERVYoICAweDA1ZTMsIDB4MDcyMywgMHg5NDUxLCAweDk0NTEsCisJCSJHZW5lc3lzIExvZ2ljIiwKKwkJIlVTQiB0byBTQVRBIiwKKwkJVVNfU0NfREVWSUNFLCBVU19QUl9ERVZJQ0UsIE5VTEwsCisJCVVTX0ZMX1NBTkVfU0VOU0UgKSwKKwogLyogUmVwb3J0ZWQgYnkgSGFubm8gQm9lY2sgPGhhbm5vQGdteC5kZT4KICAqIFRha2VuIGZyb20gdGhlIEx5Y29yaXMgS2VybmVsICovCiBVTlVTVUFMX0RFViggIDB4MDYzNiwgMHgwMDAzLCAweDAwMDAsIDB4OTk5OSwKQEAgLTEwNDAsNyArOTU4LDcgQEAKIAkJVVNfRkxfRklYX0NBUEFDSVRZIHwgVVNfRkxfR09fU0xPVyApLAogCiAvKiBSZXBvcnRlZCBieSBBbGV4IEJ1dGNoZXIgPGFsZXguYnV0Y2hlckBhc3N1cnN5cy5jby51az4gKi8KLVVOVVNVQUxfREVWKCAweDA2N2IsIDB4MzUwNywgMHgwMDAxLCAweDAwMDEsCitVTlVTVUFMX0RFViggMHgwNjdiLCAweDM1MDcsIDB4MDAwMSwgMHgwMTAxLAogCQkiUHJvbGlmaWMgVGVjaG5vbG9neSBJbmMuIiwKIAkJIkFUQVBJLTYgQnJpZGdlIENvbnRyb2xsZXIiLAogCQlVU19TQ19ERVZJQ0UsIFVTX1BSX0RFVklDRSwgTlVMTCwKQEAgLTExNjEsMTEgKzEwNzksMTcgQEAKIAkJVVNfU0NfREVWSUNFLCBVU19QUl9ERVZJQ0UsIHVzYl9zdG9yX2V1c2NzaV9pbml0LAogCQlVU19GTF9TQ01fTVVMVF9UQVJHICksCiAKLSNpZmRlZiBDT05GSUdfVVNCX1NUT1JBR0VfRFBDTQorI2lmZGVmIENPTkZJR19VU0JfU1RPUkFHRV9TRERSMDkKIFVOVVNVQUxfREVWKCAgMHgwN2FmLCAweDAwMDYsIDB4MDEwMCwgMHgwMTAwLAogCQkiTWljcm90ZWNoIiwKIAkJIkNhbWVyYU1hdGUgKERQQ01fVVNCKSIsCiAgCQlVU19TQ19TQ1NJLCBVU19QUl9EUENNX1VTQiwgTlVMTCwgMCApLAorI2Vsc2UKK1VOVVNVQUxfREVWKCAgMHgwN2FmLCAweDAwMDYsIDB4MDEwMCwgMHgwMTAwLAorCQkiTWljcm90ZWNoIiwKKwkJIkNhbWVyYU1hdGUiLAorCQlVU19TQ19TQ1NJLCBVU19QUl9DQiwgTlVMTCwKKwkJVVNfRkxfU0lOR0xFX0xVTiApLAogI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfVVNCX1NUT1JBR0VfQUxBVURBCkBAIC0xMzIwLDYgKzEyNDQsMTMgQEAKIAkJVVNfU0NfREVWSUNFLCBVU19QUl9ERVZJQ0UsIE5VTEwsCiAJCVVTX0ZMX0ZJWF9DQVBBQ0lUWSksCiAKKy8qIFJlcG9ydGVkIGFuZCBwYXRjaGVkIGJ5IE5ndXllbiBBbmggUXV5bmggPGFxdXluaEBnbWFpbC5jb20+ICovCitVTlVTVUFMX0RFViggMHgwODQwLCAweDAwODQsIDB4MDAwMSwgMHgwMDAxLAorCQkiQXJnb3N5IiwKKwkJIlN0b3JhZ2UiLAorCQlVU19TQ19ERVZJQ0UsIFVTX1BSX0RFVklDRSwgTlVMTCwKKwkJVVNfRkxfRklYX0NBUEFDSVRZKSwKKwogLyogRW50cnkgYW5kIHN1cHBvcnRpbmcgcGF0Y2ggYnkgVGhlb2RvcmUgS2lsZ29yZSA8a2lsZ290YUBhdWJ1cm4uZWR1Pi4KICAqIEZsYWcgd2lsbCBzdXBwb3J0IEJ1bGsgZGV2aWNlcyB3aGljaCB1c2UgYSBzdGFuZGFyZHMtdmlvbGF0aW5nIDMyLWJ5dGUKICAqIENvbW1hbmQgQmxvY2sgV3JhcHBlci4gSGVyZSwgdGhlICJEQzJNRUdBIiBjYW1lcmFzIChzZXZlcmFsIGJyYW5kcykgd2l0aApAQCAtMTM0MywxNyArMTI3NCw2IEBACiAJCVVTX1NDX0RFVklDRSwgVVNfUFJfREVWSUNFLCBOVUxMLAogCQlVU19GTF9OT1RfTE9DS0FCTEUpLAogCi0vKiBBbmRyZXcgTHVubiA8YW5kcmV3QGx1bm4uY2g+Ci0gKiBQYW5EaWdpdGFsIERpZ2l0YWwgUGljdHVyZSBGcmFtZS4gRG9lcyBub3QgbGlrZSBBTExPV19NRURJVU1fUkVNT1ZBTAotICogb24gTFVOIDQuCi0gKiBOb3RlOiBWZW5kOlByb2QgY2xhc2ggd2l0aCAiTHRkIE1heGVsbCBXUzMwIFNsaW0gRGlnaXRhbCBDYW1lcmEiCi0qLwotVU5VU1VBTF9ERVYoICAweDA4NTEsIDB4MTU0MywgMHgwMjAwLCAweDAyMDAsCi0JCSJQYW5EaWdpdGFsIiwKLQkJIlBob3RvIEZyYW1lIiwKLQkJVVNfU0NfREVWSUNFLCBVU19QUl9ERVZJQ0UsIE5VTEwsCi0JCVVTX0ZMX05PVF9MT0NLQUJMRSksCi0KIC8qIFN1Ym1pdHRlZCBieSBKYW4gRGUgTHV5Y2sgPGxrbWxAa2NvcmUub3JnPiAqLwogVU5VU1VBTF9ERVYoICAweDA4YmQsIDB4MTEwMCwgMHgwMDAwLCAweDAwMDAsCiAJCSJDSVRJWkVOIiwKQEAgLTE0MjUsNiArMTM0NSwxMyBAQAogCQlVU19TQ19ERVZJQ0UsIFVTX1BSX0RFVklDRSwgTlVMTCwKIAkJVVNfRkxfRklYX0lOUVVJUlkgKSwKIAorLyogUmVwb3J0ZWQgYnkgSmFhayBSaXN0aW9qYSA8UmlzdGlvamFAZ21haWwuY29tPiAqLworVU5VU1VBTF9ERVYoIDB4MGExNywgMHgwMDZlLCAweDAxMDAsIDB4MDEwMCwKKwkJIlBlbnRheCIsCisJCSJLMTBEIiwKKwkJVVNfU0NfREVWSUNFLCBVU19QUl9ERVZJQ0UsIE5VTEwsCisJCVVTX0ZMX0ZJWF9DQVBBQ0lUWSApLAorCiAvKiBUaGVzZSBhcmUgdmlydHVhbCB3aW5kb3dzIGRyaXZlciBDRHMsIHdoaWNoIHRoZSB6ZDEyMTFydyBkcml2ZXIKICAqIGF1dG9tYXRpY2FsbHkgY29udmVydHMgaW50byBXTEFOIGRldmljZXMuICovCiBVTlVTVUFMX0RFViggMHgwYWNlLCAweDIwMTEsIDB4MDEwMSwgMHgwMTAxLApAQCAtMTQzOSw2ICsxMzY2LDE4IEBACiAJCVVTX1NDX0RFVklDRSwgVVNfUFJfREVWSUNFLCBOVUxMLAogCQlVU19GTF9JR05PUkVfREVWSUNFICksCiAKKy8qIFJlcG9ydGVkIGJ5IERhbiBXaWxsaWFtcyA8ZGNid0ByZWRoYXQuY29tPgorICogT3B0aW9uIE4uVi4gbW9iaWxlIGJyb2FkYmFuZCBtb2RlbXMKKyAqIElnbm9yZSBkcml2ZXIgQ0QgbW9kZSBhbmQgZm9yY2UgaW50byBtb2RlbSBtb2RlIGJ5IGRlZmF1bHQuCisgKi8KKworLyogaUNPTiAyMjUgKi8KK1VOVVNVQUxfREVWKCAgMHgwYWYwLCAweDY5NzEsIDB4MDAwMCwgMHg5OTk5LAorCQkiT3B0aW9uIE4uVi4iLAorCQkiTWFzcyBTdG9yYWdlIiwKKwkJVVNfU0NfREVWSUNFLCBVU19QUl9ERVZJQ0UsIG9wdGlvbl9tc19pbml0LAorCQkwKSwKKwogLyogUmVwb3J0ZWQgYnkgRi4gQWJlbiA8Zi5hYmVuQG9wdGlvbi5jb20+CiAgKiBUaGlzIGRldmljZSAod3JvbmdseSkgaGFzIGEgdmVuZG9yLXNwZWNpZmljIGRldmljZSBkZXNjcmlwdG9yLgogICogVGhlIGVudHJ5IGlzIG5lZWRlZCBzbyB1c2Itc3RvcmFnZSBjYW4gYmluZCB0byBpdCdzIG1hc3Mtc3RvcmFnZQpAQCAtMTQ0OSw2ICsxMzg4LDEzIEBACiAJCVVTX1NDX0RFVklDRSwgVVNfUFJfREVWSUNFLCBOVUxMLAogCQkwICksCiAKKy8qIFJlcG9ydGVkIGJ5IEJlbiBFZnJvcyA8YmVuQHBjLWRvY3Rvci5jb20+ICovCitVTlVTVUFMX0RFViggMHgwYmMyLCAweDMwMTAsIDB4MDAwMCwgMHgwMDAwLAorCQkiU2VhZ2F0ZSIsCisJCSJGcmVlQWdlbnQgUHJvIiwKKwkJVVNfU0NfREVWSUNFLCBVU19QUl9ERVZJQ0UsIE5VTEwsCisJCVVTX0ZMX1NBTkVfU0VOU0UgKSwKKwogI2lmZGVmIENPTkZJR19VU0JfU1RPUkFHRV9JU0QyMDAKIFVOVVNVQUxfREVWKCAgMHgwYmY2LCAweGEwMDEsIDB4MDEwMCwgMHgwMTEwLAogCQkiQVRJIiwKQEAgLTE0NzIsNiArMTQxOCwyMiBAQAogCQlVU19GTF9TSU5HTEVfTFVOICksCiAjZW5kaWYKIAorVU5VU1VBTF9ERVYoICAweDBkNDksIDB4NzMxMCwgMHgwMDAwLCAweDk5OTksCisJCSJNYXh0b3IiLAorCQkiVVNCIHRvIFNBVEEiLAorCQlVU19TQ19ERVZJQ0UsIFVTX1BSX0RFVklDRSwgTlVMTCwKKwkJVVNfRkxfU0FORV9TRU5TRSksCisKKy8qCisgKiBQZXRlIFphaXRjZXYgPHphaXRjZXZAeWFob28uY29tPiwgYnojMTY0Njg4LgorICogVGhlIGRldmljZSBibGF0YW50bHkgaWdub3JlcyBMVU4gYW5kIHJldHVybnMgMSBpbiBHZXRNYXhMVU4uCisgKi8KK1VOVVNVQUxfREVWKCAweDBjNDUsIDB4MTA2MCwgMHgwMTAwLCAweDAxMDAsCisJCSJVbmtub3duIiwKKwkJIlVua25vd24iLAorCQlVU19TQ19ERVZJQ0UsIFVTX1BSX0RFVklDRSwgTlVMTCwKKwkJVVNfRkxfU0lOR0xFX0xVTiApLAorCiAvKiBTdWJtaXR0ZWQgYnk6IE5pY2sgU2lsbGlrIDxuLnNpbGxpa0B0ZW1wbGUuZWR1PgogICogTmVlZGVkIGZvciBPbmVUb3VjaCBleHRlbnNpb24gdG8gdXNiLXN0b3JhZ2UKICAqCkBAIC0xNDg5LDE2ICsxNDUxLDYgQEAKIAkJCTApLAogI2VuZGlmCiAKLS8qCi0gKiBQZXRlIFphaXRjZXYgPHphaXRjZXZAeWFob28uY29tPiwgYnojMTY0Njg4LgotICogVGhlIGRldmljZSBibGF0YW50bHkgaWdub3JlcyBMVU4gYW5kIHJldHVybnMgMSBpbiBHZXRNYXhMVU4uCi0gKi8KLVVOVVNVQUxfREVWKCAweDBjNDUsIDB4MTA2MCwgMHgwMTAwLCAweDAxMDAsCi0JCSJVbmtub3duIiwKLQkJIlVua25vd24iLAotCQlVU19TQ19ERVZJQ0UsIFVTX1BSX0RFVklDRSwgTlVMTCwKLQkJVVNfRkxfU0lOR0xFX0xVTiApLAotCiAvKiBTdWJtaXR0ZWQgYnkgSm9yaXMgU3RydXl2ZSA8am9yaXNAc3RydXl2ZS5iZT4gKi8KIFVOVVNVQUxfREVWKCAweDBkOTYsIDB4NDEwYSwgMHgwMDAxLCAweGZmZmYsCiAJCSJNZWRpb24iLApAQCAtMTUxNiw2ICsxNDY4LDEzIEBACiAJCSJKRCA1MjAwIHozIiwKIAkJVVNfU0NfREVWSUNFLCBVU19QUl9ERVZJQ0UsIE5VTEwsIFVTX0ZMX0ZJWF9JTlFVSVJZKSwKIAorLyogUmVwb3J0ZWQgYnkgIEphc29uIEpvaG5zdG9uIDxraWxsZWFuQHNoYXcuY2E+ICovCitVTlVTVUFMX0RFViggIDB4MGRjNCwgMHgwMDczLCAweDAwMDAsIDB4MDAwMCwKKwkJIk1hY3Bvd2VyIFRlY2hub2xvZ3kgQ28uTFRELiIsCisJCSJVU0IgMi4wIDMuNVwiIERFVklDRSIsCisJCVVTX1NDX0RFVklDRSwgVVNfUFJfREVWSUNFLCBOVUxMLAorCQlVU19GTF9GSVhfQ0FQQUNJVFkpLAorCiAvKiBSZXBvcnRlZCBieSBMdWJvbWlyIEJsYWhhIDx0cml0b2xAdHJpbG9naWMuY3o+CiAgKiBJIF9SRUFMTFlfIGRvbid0IGtub3cgd2hhdCAzcmQsIDR0aCBudW1iZXIgYW5kIGFsbCBkZWZpbmVzIG1lYW4sIGJ1dCB0aGlzCiAgKiB3b3JrcyBmb3IgbWUuIENhbiBhbnlib2R5IGNvcnJlY3QgdGhlc2UgdmFsdWVzPyAoSSBhYmxlIHRvIHRlc3QgY29ycmVjdGVkCkBAIC0xNjM4LDEzICsxNTk3LDYgQEAKIAkJVVNfU0NfREVWSUNFLCBVU19QUl9ERVZJQ0UsIE5VTEwsCiAJCVVTX0ZMX0ZJWF9DQVBBQ0lUWSB8IFVTX0ZMX0lHTk9SRV9SRVNJRFVFICksCiAKLS8qIFJlcG9ydGVkIGJ5IFJpY2FyZG8gQmFyYmVyaXMgPHJpY2FyZG9AZGF0dGF0ZWMuY29tPiAqLwotVU5VU1VBTF9ERVYoICAweDBmY2UsIDB4ZTA5MiwgMHgwMDAwLCAweDAwMDAsCi0JCSJTb255IEVyaWNzc29uIiwKLQkJIlAxaSIsCi0JCVVTX1NDX0RFVklDRSwgVVNfUFJfREVWSUNFLCBOVUxMLAotCQlVU19GTF9JR05PUkVfUkVTSURVRSApLAotCiAvKiBSZXBvcnRlZCBieSBFbW1hbnVlbCBWYXNpbGFraXMgPGV2YXNAZm9ydGhuZXQuZ3I+ICovCiBVTlVTVUFMX0RFViggIDB4MGZjZSwgMHhlMDMxLCAweDAwMDAsIDB4MDAwMCwKIAkJIlNvbnkgRXJpY3Nzb24iLApAQCAtMTY1Miw2ICsxNjA0LDEzIEBACiAJCVVTX1NDX0RFVklDRSwgVVNfUFJfREVWSUNFLCBOVUxMLAogCQlVU19GTF9JR05PUkVfUkVTSURVRSB8IFVTX0ZMX0ZJWF9DQVBBQ0lUWSApLAogCisvKiBSZXBvcnRlZCBieSBSaWNhcmRvIEJhcmJlcmlzIDxyaWNhcmRvQGRhdHRhdGVjLmNvbT4gKi8KK1VOVVNVQUxfREVWKCAgMHgwZmNlLCAweGUwOTIsIDB4MDAwMCwgMHgwMDAwLAorCQkiU29ueSBFcmljc3NvbiIsCisJCSJQMWkiLAorCQlVU19TQ19ERVZJQ0UsIFVTX1BSX0RFVklDRSwgTlVMTCwKKwkJVVNfRkxfSUdOT1JFX1JFU0lEVUUgKSwKKwogLyogUmVwb3J0ZWQgYnkgS2V2aW4gQ2VybmVrZWUgPGtwYy11c2JkZXZAZ2VsYXRvLnVpdWMuZWR1PgogICogVGVzdGVkIG9uIGhhcmR3YXJlIHZlcnNpb24gMS4xMC4KICAqIEVudHJ5IGlzIG5lZWRlZCBvbmx5IGZvciB0aGUgaW5pdGlhbGl6ZXIgZnVuY3Rpb24gb3ZlcnJpZGUuCkBAIC0xNjY0LDYgKzE2MjMsMTIgQEAKIAkJVVNfU0NfREVWSUNFLCBVU19QUl9ERVZJQ0UsIHVzYl9zdG9yX3VjcjYxczJiX2luaXQsCiAJCTAgKSwKIAorVU5VU1VBTF9ERVYoICAweDEwNTgsIDB4MDcwNCwgMHgwMDAwLCAweDk5OTksCisJCSJXZXN0ZXJuIERpZ2l0YWwiLAorCQkiRXh0ZXJuYWwgSEREIiwKKwkJVVNfU0NfREVWSUNFLCBVU19QUl9ERVZJQ0UsIE5VTEwsCisJCVVTX0ZMX1NBTkVfU0VOU0UpLAorCiAvKiBSZXBvcnRlZCBieSBGYWJpbyBWZW50dXJpIDxmLnZlbnR1cmlAdGRuZXQuaXQ+CiAgKiBUaGUgZGV2aWNlIHJlcG9ydHMgYSB2ZW5kb3Itc3BlY2lmaWMgYkRldmljZUNsYXNzLgogICovCkBAIC0yMDUzLDEwICsyMDE4LDEwIEBACiAgKiBKTWljcm9uIHJlc3BvbmRzIHRvIFVTTiBhbmQgc2V2ZXJhbCBvdGhlciBTQ1NJIGlvY3RscyB3aXRoIGEKICAqIHJlc2lkdWUgdGhhdCBjYXVzZXMgc3Vic2VxdWVudCBJL08gcmVxdWVzdHMgdG8gZmFpbC4gICovCiBVTlVTVUFMX0RFViggIDB4MTUyZCwgMHgyMzI5LCAweDAxMDAsIDB4MDEwMCwKLQkgICAgICAgICJKTWljcm9uIiwKLQkgICAgICAgICJVU0IgdG8gQVRBL0FUQVBJIEJyaWRnZSIsCi0JICAgICAgICBVU19TQ19ERVZJQ0UsIFVTX1BSX0RFVklDRSwgTlVMTCwKLQkgICAgICAgIFVTX0ZMX0lHTk9SRV9SRVNJRFVFICksCisJCSJKTWljcm9uIiwKKwkJIlVTQiB0byBBVEEvQVRBUEkgQnJpZGdlIiwKKwkJVVNfU0NfREVWSUNFLCBVU19QUl9ERVZJQ0UsIE5VTEwsCisJCVVTX0ZMX0lHTk9SRV9SRVNJRFVFIHwgVVNfRkxfU0FORV9TRU5TRSApLAogCiAvKiBSZXBvcnRlZCBieSBSb2JlcnQgU2NoZWRlbCA8ci5zY2hlZGVsQHlhaG9vLmRlPgogICogTm90ZTogdGhpcyBpcyBhICdzdXBlciB0b3AnIGRldmljZSBsaWtlIHRoZSBhYm92ZSAxNGNkLzY2MDAgZGV2aWNlICovCkBAIC0yMDg2LDI3ICsyMDUxLDYgQEAKIAkJVVNfRkxfRklYX0NBUEFDSVRZIHwgVVNfRkxfSUdOT1JFX1JFU0lEVUUgKSwKIAogLyoKLSAqIFBhdGNoIGJ5IFBldGUgWmFpdGNldiA8emFpdGNldkByZWRoYXQuY29tPgotICogUmVwb3J0IGJ5IE1hcmsgUGF0dG9uLiBSZWQgSGF0IGJ6IzIwODkyOC4KLSAqIEFkZGVkIHN1cHBvcnQgZm9yIHJldiAweDAwMDIgKE1vdG9yb2xhIFJPS1IgVzUpCi0gKiBieSBKYXZpZXIgU21hbGRvbmUgPGphdmllckBzbWFsZG9uZS5jb20uYXI+Ci0gKi8KLVVOVVNVQUxfREVWKCAgMHgyMmI4LCAweDQ4MTAsIDB4MDAwMSwgMHgwMDAyLAotCQkiTW90b3JvbGEiLAotCQkiUkFaUiBWM2kvUk9LUiBXNSIsCi0JCVVTX1NDX0RFVklDRSwgVVNfUFJfREVWSUNFLCBOVUxMLAotCQlVU19GTF9GSVhfQ0FQQUNJVFkpLAotCi0vKgotICogUGF0Y2ggYnkgSm9zdCBEaWVkZXJpY2hzIDxqb3N0QHFkdXNhLmNvbT4KLSAqLwotVU5VU1VBTF9ERVYoMHgyMmI4LCAweDY0MTAsIDB4MDAwMSwgMHg5OTk5LAotCQkiTW90b3JvbGEgSW5jLiIsCi0JCSJNb3Rvcm9sYSBQaG9uZSAoUkFaUlYzeHgpIiwKLQkJVVNfU0NfREVWSUNFLCBVU19QUl9ERVZJQ0UsIE5VTEwsCi0JCVVTX0ZMX0ZJWF9DQVBBQ0lUWSksCi0KLS8qCiAgKiBQYXRjaCBieSBDb25zdGFudGluIEJhcmFub3YgPGNvbnN0QHRsdHN1LnJ1PgogICogUmVwb3J0IGJ5IEFuZHJlYXMgS29lbmVja2UuCiAgKiBNb3Rvcm9sYSBST0tSIFo2LgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc3RvcmFnZS91c2IuYyBiL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdXNiLmMKaW5kZXggMjcwMTZmZC4uNGJlY2Y0OSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc3RvcmFnZS91c2IuYworKysgYi9kcml2ZXJzL3VzYi9zdG9yYWdlL3VzYi5jCkBAIC03NSw5ICs3NSw2IEBACiAjaWZkZWYgQ09ORklHX1VTQl9TVE9SQUdFX1NERFI1NQogI2luY2x1ZGUgInNkZHI1NS5oIgogI2VuZGlmCi0jaWZkZWYgQ09ORklHX1VTQl9TVE9SQUdFX0RQQ00KLSNpbmNsdWRlICJkcGNtLmgiCi0jZW5kaWYKICNpZmRlZiBDT05GSUdfVVNCX1NUT1JBR0VfRlJFRUNPTQogI2luY2x1ZGUgImZyZWVjb20uaCIKICNlbmRpZgpAQCAtMTAzLDYgKzEwMCw3IEBACiAjaW5jbHVkZSAiY3lwcmVzc19hdGFjYi5oIgogI2VuZGlmCiAjaW5jbHVkZSAic2llcnJhX21zLmgiCisjaW5jbHVkZSAib3B0aW9uX21zLmgiCiAKIC8qIFNvbWUgaW5mb3JtYXRpb25hbCBkYXRhICovCiBNT0RVTEVfQVVUSE9SKCJNYXR0aGV3IERoYXJtIDxtZGhhcm0tdXNiQG9uZS1leWVkLWFsaWVuLm5ldD4iKTsKQEAgLTExMyw2ICsxMTEsMTAgQEAKIG1vZHVsZV9wYXJhbShkZWxheV91c2UsIHVpbnQsIFNfSVJVR08gfCBTX0lXVVNSKTsKIE1PRFVMRV9QQVJNX0RFU0MoZGVsYXlfdXNlLCAic2Vjb25kcyB0byBkZWxheSBiZWZvcmUgdXNpbmcgYSBuZXcgZGV2aWNlIik7CiAKK3N0YXRpYyBjaGFyIHF1aXJrc1sxMjhdOworbW9kdWxlX3BhcmFtX3N0cmluZyhxdWlya3MsIHF1aXJrcywgc2l6ZW9mKHF1aXJrcyksIFNfSVJVR08gfCBTX0lXVVNSKTsKK01PRFVMRV9QQVJNX0RFU0MocXVpcmtzLCAic3VwcGxlbWVudGFsIGxpc3Qgb2YgZGV2aWNlIElEcyBhbmQgdGhlaXIgcXVpcmtzIik7CisKIAogLyoKICAqIFRoZSBlbnRyaWVzIGluIHRoaXMgdGFibGUgY29ycmVzcG9uZCwgbGluZSBmb3IgbGluZSwKQEAgLTEyNiw2ICsxMjgsOCBAQAogeyBVU0JfREVWSUNFX1ZFUihpZF92ZW5kb3IsIGlkX3Byb2R1Y3QsIGJjZERldmljZU1pbixiY2REZXZpY2VNYXgpLCBcCiAgIC5kcml2ZXJfaW5mbyA9IChmbGFncyl8KFVTQl9VU19UWVBFX1NUT1I8PDI0KSB9CiAKKyNkZWZpbmUgQ09NUExJQU5UX0RFVglVTlVTVUFMX0RFVgorCiAjZGVmaW5lIFVTVUFMX0RFVih1c2VQcm90bywgdXNlVHJhbnMsIHVzZVR5cGUpIFwKIHsgVVNCX0lOVEVSRkFDRV9JTkZPKFVTQl9DTEFTU19NQVNTX1NUT1JBR0UsIHVzZVByb3RvLCB1c2VUcmFucyksIFwKICAgLmRyaXZlcl9pbmZvID0gKFVTQl9VU19UWVBFX1NUT1I8PDI0KSB9CkBAIC0xMzQsNiArMTM4LDcgQEAKIAogIwlpbmNsdWRlICJ1bnVzdWFsX2RldnMuaCIKICN1bmRlZiBVTlVTVUFMX0RFVgorI3VuZGVmIENPTVBMSUFOVF9ERVYKICN1bmRlZiBVU1VBTF9ERVYKIAkvKiBUZXJtaW5hdGluZyBlbnRyeSAqLwogCXsgfQpAQCAtMTY0LDYgKzE2OSw4IEBACiAJLmluaXRGdW5jdGlvbiA9IGluaXRfZnVuY3Rpb24sCVwKIH0KIAorI2RlZmluZSBDT01QTElBTlRfREVWCVVOVVNVQUxfREVWCisKICNkZWZpbmUgVVNVQUxfREVWKHVzZV9wcm90b2NvbCwgdXNlX3RyYW5zcG9ydCwgdXNlX3R5cGUpIFwKIHsgXAogCS51c2VQcm90b2NvbCA9IHVzZV9wcm90b2NvbCwJXApAQCAtMTczLDYgKzE4MCw3IEBACiBzdGF0aWMgc3RydWN0IHVzX3VudXN1YWxfZGV2IHVzX3VudXN1YWxfZGV2X2xpc3RbXSA9IHsKICMJaW5jbHVkZSAidW51c3VhbF9kZXZzLmgiIAogIwl1bmRlZiBVTlVTVUFMX0RFVgorIwl1bmRlZiBDT01QTElBTlRfREVWCiAjCXVuZGVmIFVTVUFMX0RFVgogCiAJLyogVGVybWluYXRpbmcgZW50cnkgKi8KQEAgLTQ2NCwxNSArNDcyLDg1IEBACiAJCVVTX0RFQlVHUCgiSS9PIGJ1ZmZlciBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KLQotCXVzLT5zZW5zZWJ1ZiA9IGttYWxsb2MoVVNfU0VOU0VfU0laRSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCF1cy0+c2Vuc2VidWYpIHsKLQkJVVNfREVCVUdQKCJTZW5zZSBidWZmZXIgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9CiAJcmV0dXJuIDA7CiB9CiAKKy8qIFdvcmtzIG9ubHkgZm9yIGRpZ2l0cyBhbmQgbGV0dGVycywgYnV0IHNtYWxsIGFuZCBmYXN0ICovCisjZGVmaW5lIFRPTE9XRVIoeCkgKCh4KSB8IDB4MjApCisKKy8qIEFkanVzdCBkZXZpY2UgZmxhZ3MgYmFzZWQgb24gdGhlICJxdWlya3M9IiBtb2R1bGUgcGFyYW1ldGVyICovCitzdGF0aWMgdm9pZCBhZGp1c3RfcXVpcmtzKHN0cnVjdCB1c19kYXRhICp1cykKK3sKKwljaGFyICpwOworCXUxNiB2aWQgPSBsZTE2X3RvX2NwdSh1cy0+cHVzYl9kZXYtPmRlc2NyaXB0b3IuaWRWZW5kb3IpOworCXUxNiBwaWQgPSBsZTE2X3RvX2NwdSh1cy0+cHVzYl9kZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0KTsKKwl1bnNpZ25lZCBmID0gMDsKKwl1bnNpZ25lZCBpbnQgbWFzayA9IChVU19GTF9TQU5FX1NFTlNFIHwgVVNfRkxfRklYX0NBUEFDSVRZIHwKKwkJCVVTX0ZMX0NBUEFDSVRZX0hFVVJJU1RJQ1MgfCBVU19GTF9JR05PUkVfREVWSUNFIHwKKwkJCVVTX0ZMX05PVF9MT0NLQUJMRSB8IFVTX0ZMX01BWF9TRUNUT1JTXzY0IHwKKwkJCVVTX0ZMX0NBUEFDSVRZX09LIHwgVVNfRkxfSUdOT1JFX1JFU0lEVUUgfAorCQkJVVNfRkxfU0lOR0xFX0xVTiB8IFVTX0ZMX05PX1dQX0RFVEVDVCk7CisKKwlwID0gcXVpcmtzOworCXdoaWxlICgqcCkgeworCQkvKiBFYWNoIGVudHJ5IGNvbnNpc3RzIG9mIFZJRDpQSUQ6ZmxhZ3MgKi8KKwkJaWYgKHZpZCA9PSBzaW1wbGVfc3RydG91bChwLCAmcCwgMTYpICYmCisJCQkJKnAgPT0gJzonICYmCisJCQkJcGlkID09IHNpbXBsZV9zdHJ0b3VsKHArMSwgJnAsIDE2KSAmJgorCQkJCSpwID09ICc6JykKKwkJCWJyZWFrOworCisJCS8qIE1vdmUgZm9yd2FyZCB0byB0aGUgbmV4dCBlbnRyeSAqLworCQl3aGlsZSAoKnApIHsKKwkJCWlmICgqcCsrID09ICcsJykKKwkJCQlicmVhazsKKwkJfQorCX0KKwlpZiAoISpwKQkvKiBObyBtYXRjaCAqLworCQlyZXR1cm47CisKKwkvKiBDb2xsZWN0IHRoZSBmbGFncyAqLworCXdoaWxlICgqKytwICYmICpwICE9ICcsJykgeworCQlzd2l0Y2ggKFRPTE9XRVIoKnApKSB7CisJCWNhc2UgJ2EnOgorCQkJZiB8PSBVU19GTF9TQU5FX1NFTlNFOworCQkJYnJlYWs7CisJCWNhc2UgJ2MnOgorCQkJZiB8PSBVU19GTF9GSVhfQ0FQQUNJVFk7CisJCQlicmVhazsKKwkJY2FzZSAnaCc6CisJCQlmIHw9IFVTX0ZMX0NBUEFDSVRZX0hFVVJJU1RJQ1M7CisJCQlicmVhazsKKwkJY2FzZSAnaSc6CisJCQlmIHw9IFVTX0ZMX0lHTk9SRV9ERVZJQ0U7CisJCQlicmVhazsKKwkJY2FzZSAnbCc6CisJCQlmIHw9IFVTX0ZMX05PVF9MT0NLQUJMRTsKKwkJCWJyZWFrOworCQljYXNlICdtJzoKKwkJCWYgfD0gVVNfRkxfTUFYX1NFQ1RPUlNfNjQ7CisJCQlicmVhazsKKwkJY2FzZSAnbyc6CisJCQlmIHw9IFVTX0ZMX0NBUEFDSVRZX09LOworCQkJYnJlYWs7CisJCWNhc2UgJ3InOgorCQkJZiB8PSBVU19GTF9JR05PUkVfUkVTSURVRTsKKwkJCWJyZWFrOworCQljYXNlICdzJzoKKwkJCWYgfD0gVVNfRkxfU0lOR0xFX0xVTjsKKwkJCWJyZWFrOworCQljYXNlICd3JzoKKwkJCWYgfD0gVVNfRkxfTk9fV1BfREVURUNUOworCQkJYnJlYWs7CisJCS8qIElnbm9yZSB1bnJlY29nbml6ZWQgZmxhZyBjaGFyYWN0ZXJzICovCisJCX0KKwl9CisJdXMtPmZmbGFncyA9ICh1cy0+ZmZsYWdzICYgfm1hc2spIHwgZjsKKwlkZXZfaW5mbygmdXMtPnB1c2JfaW50Zi0+ZGV2LCAiUXVpcmtzIG1hdGNoIGZvciAiCisJCQkidmlkICUwNHggcGlkICUwNHg6ICV4XG4iLAorCQkJdmlkLCBwaWQsIGYpOworfQorCiAvKiBGaW5kIGFuIHVudXN1YWxfZGV2IGRlc2NyaXB0b3IgKGFsd2F5cyBzdWNjZWVkcyBpbiB0aGUgY3VycmVudCBjb2RlKSAqLwogc3RhdGljIHN0cnVjdCB1c191bnVzdWFsX2RldiAqZmluZF91bnVzdWFsKGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKIHsKQEAgLTQ5Nyw2ICs1NzUsNyBAQAogCQkJaWRlc2MtPmJJbnRlcmZhY2VQcm90b2NvbCA6CiAJCQl1bnVzdWFsX2Rldi0+dXNlVHJhbnNwb3J0OwogCXVzLT5mZmxhZ3MgPSBVU0JfVVNfT1JJR19GTEFHUyhpZC0+ZHJpdmVyX2luZm8pOworCWFkanVzdF9xdWlya3ModXMpOwogCiAJaWYgKHVzLT5mZmxhZ3MgJiBVU19GTF9JR05PUkVfREVWSUNFKSB7CiAJCXByaW50ayhLRVJOX0lORk8gVVNCX1NUT1JBR0UgImRldmljZSBpZ25vcmVkXG4iKTsKQEAgLTU2Miw3ICs2NDEsNyBAQAogCiAJY2FzZSBVU19QUl9DQkk6CiAJCXVzLT50cmFuc3BvcnRfbmFtZSA9ICJDb250cm9sL0J1bGsvSW50ZXJydXB0IjsKLQkJdXMtPnRyYW5zcG9ydCA9IHVzYl9zdG9yX0NCSV90cmFuc3BvcnQ7CisJCXVzLT50cmFuc3BvcnQgPSB1c2Jfc3Rvcl9DQl90cmFuc3BvcnQ7CiAJCXVzLT50cmFuc3BvcnRfcmVzZXQgPSB1c2Jfc3Rvcl9DQl9yZXNldDsKIAkJdXMtPm1heF9sdW4gPSA3OwogCQlicmVhazsKQEAgLTY3NSwxOSArNzU0LDE5IEBACiAKIAljYXNlIFVTX1NDXzgwMjA6CiAJCXVzLT5wcm90b2NvbF9uYW1lID0gIjgwMjBpIjsKLQkJdXMtPnByb3RvX2hhbmRsZXIgPSB1c2Jfc3Rvcl9BVEFQSV9jb21tYW5kOworCQl1cy0+cHJvdG9faGFuZGxlciA9IHVzYl9zdG9yX3BhZDEyX2NvbW1hbmQ7CiAJCXVzLT5tYXhfbHVuID0gMDsKIAkJYnJlYWs7CiAKIAljYXNlIFVTX1NDX1FJQzoKIAkJdXMtPnByb3RvY29sX25hbWUgPSAiUUlDLTE1NyI7Ci0JCXVzLT5wcm90b19oYW5kbGVyID0gdXNiX3N0b3JfcWljMTU3X2NvbW1hbmQ7CisJCXVzLT5wcm90b19oYW5kbGVyID0gdXNiX3N0b3JfcGFkMTJfY29tbWFuZDsKIAkJdXMtPm1heF9sdW4gPSAwOwogCQlicmVhazsKIAogCWNhc2UgVVNfU0NfODA3MDoKIAkJdXMtPnByb3RvY29sX25hbWUgPSAiODA3MGkiOwotCQl1cy0+cHJvdG9faGFuZGxlciA9IHVzYl9zdG9yX0FUQVBJX2NvbW1hbmQ7CisJCXVzLT5wcm90b19oYW5kbGVyID0gdXNiX3N0b3JfcGFkMTJfY29tbWFuZDsKIAkJdXMtPm1heF9sdW4gPSAwOwogCQlicmVhazsKIApAQCAtODQwLDggKzkxOSw2IEBACiB7CiAJVVNfREVCVUdQKCItLSAlc1xuIiwgX19mdW5jX18pOwogCi0Ja2ZyZWUodXMtPnNlbnNlYnVmKTsKLQogCS8qIEZyZWUgdGhlIGRldmljZS1yZWxhdGVkIERNQS1tYXBwZWQgYnVmZmVycyAqLwogCWlmICh1cy0+Y3IpCiAJCXVzYl9idWZmZXJfZnJlZSh1cy0+cHVzYl9kZXYsIHNpemVvZigqdXMtPmNyKSwgdXMtPmNyLApAQCAtMTA2NCw2ICsxMTQxLDcgQEAKIHN0YXRpYyBpbnQgX19pbml0IHVzYl9zdG9yX2luaXQodm9pZCkKIHsKIAlpbnQgcmV0dmFsOworCiAJcHJpbnRrKEtFUk5fSU5GTyAiSW5pdGlhbGl6aW5nIFVTQiBNYXNzIFN0b3JhZ2UgZHJpdmVyLi4uXG4iKTsKIAogCS8qIHJlZ2lzdGVyIHRoZSBkcml2ZXIsIHJldHVybiB1c2JfcmVnaXN0ZXIgcmV0dXJuIGNvZGUgaWYgZXJyb3IgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdXNiLmggYi9kcml2ZXJzL3VzYi9zdG9yYWdlL3VzYi5oCmluZGV4IGE0YWQ3M2IuLjY1ZTY3NGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdXNiLmgKKysrIGIvZHJpdmVycy91c2Ivc3RvcmFnZS91c2IuaApAQCAtMTM4LDcgKzEzOCw2IEBACiAJc3RydWN0IHVzYl9jdHJscmVxdWVzdAkqY3I7CQkgLyogY29udHJvbCByZXF1ZXN0cwkgKi8KIAlzdHJ1Y3QgdXNiX3NnX3JlcXVlc3QJY3VycmVudF9zZzsJIC8qIHNjYXR0ZXItZ2F0aGVyIHJlcS4gICovCiAJdW5zaWduZWQgY2hhcgkJKmlvYnVmOwkJIC8qIEkvTyBidWZmZXIJCSAqLwotCXVuc2lnbmVkIGNoYXIJCSpzZW5zZWJ1ZjsJIC8qIHNlbnNlIGRhdGEgYnVmZmVyCSAqLwogCWRtYV9hZGRyX3QJCWNyX2RtYTsJCSAvKiBidWZmZXIgRE1BIGFkZHJlc3NlcyAqLwogCWRtYV9hZGRyX3QJCWlvYnVmX2RtYTsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QJKmN0bF90aHJlYWQ7CSAvKiB0aGUgY29udHJvbCB0aHJlYWQgICAqLwpAQCAtMTU1LDYgKzE1NCwxMCBAQAogI2lmZGVmIENPTkZJR19QTQogCXBtX2hvb2sJCQlzdXNwZW5kX3Jlc3VtZV9ob29rOwogI2VuZGlmCisKKwkvKiBoYWNrcyBmb3IgUkVBRCBDQVBBQ0lUWSBidWcgaGFuZGxpbmcgKi8KKwlpbnQJCQl1c2VfbGFzdF9zZWN0b3JfaGFja3M7CisJaW50CQkJbGFzdF9zZWN0b3JfcmV0cmllczsKIH07CiAKIC8qIENvbnZlcnQgYmV0d2VlbiB1c19kYXRhIGFuZCB0aGUgY29ycmVzcG9uZGluZyBTY3NpX0hvc3QgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3d1c2Jjb3JlL3JoLmMgYi9kcml2ZXJzL3VzYi93dXNiY29yZS9yaC5jCmluZGV4IDk1YzZmYTMuLjM5MzdiZjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3d1c2Jjb3JlL3JoLmMKKysrIGIvZHJpdmVycy91c2Ivd3VzYmNvcmUvcmguYwpAQCAtMzI2LDcgKzMyNiw3IEBACiBzdGF0aWMgaW50IHd1c2JoY19yaF9nZXRfcG9ydF9zdGF0dXMoc3RydWN0IHd1c2JoYyAqd3VzYmhjLCB1MTYgcG9ydF9pZHgsCiAJCQkJICAgICB1MzIgKl9idWYsIHUxNiB3TGVuZ3RoKQogewotCXUxNiAqYnVmID0gKHUxNiAqKSBfYnVmOworCV9fbGUxNiAqYnVmID0gKF9fbGUxNiAqKV9idWY7CiAKIAlpZiAocG9ydF9pZHggPiB3dXNiaGMtPnBvcnRzX21heCkKIAkJcmV0dXJuIC1FSU5WQUw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3V3Yi9pMTQ4MC9kZnUvdXNiLmMgYi9kcml2ZXJzL3V3Yi9pMTQ4MC9kZnUvdXNiLmMKaW5kZXggNjg2Nzk1ZS4uYzcwODBkNCAxMDA2NDQKLS0tIGEvZHJpdmVycy91d2IvaTE0ODAvZGZ1L3VzYi5jCisrKyBiL2RyaXZlcnMvdXdiL2kxNDgwL2RmdS91c2IuYwpAQCAtMzg3LDcgKzM4Nyw3IEBACiAJCWdvdG8gZXJyb3JfY3JlYXRlOwogCX0KIAotCS8qIHNldHVwIHRoZSBmb3BzIGFuZCB1cGxvYWQgdGhlIGZpcm1hcmUgKi8KKwkvKiBzZXR1cCB0aGUgZm9wcyBhbmQgdXBsb2FkIHRoZSBmaXJtd2FyZSAqLwogCWkxNDgwLT5wcmVfZndfbmFtZSA9ICJpMTQ4MC1wcmUtcGh5LTAuMC5iaW4iOwogCWkxNDgwLT5tYWNfZndfbmFtZSA9ICJpMTQ4MC11c2ItMC4wLmJpbiI7CiAJaTE0ODAtPm1hY19md19uYW1lX2RlcHJlY2F0ZSA9ICJwdGMtMC4wLmJpbiI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3V3Yi9pMTQ4MC9pMTQ4MHUtd2xwL2kxNDgwdS13bHAuaCBiL2RyaXZlcnMvdXdiL2kxNDgwL2kxNDgwdS13bHAvaTE0ODB1LXdscC5oCmluZGV4IDVmMWIyOTUuLjM0MjFkMzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXdiL2kxNDgwL2kxNDgwdS13bHAvaTE0ODB1LXdscC5oCisrKyBiL2RyaXZlcnMvdXdiL2kxNDgwL2kxNDgwdS13bHAvaTE0ODB1LXdscC5oCkBAIC0yMjEsNyArMjIxLDYgQEAKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldjsKIAogCXNwaW5sb2NrX3QgbG9jazsKLQlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKIAogCS8qIFJYIGNvbnRleHQgaGFuZGxpbmcgKi8KIAlzdHJ1Y3Qgc2tfYnVmZiAqcnhfc2tiOwpAQCAtMjcxLDcgKzI3MCw2IEBACiBleHRlcm4gaW50IGkxNDgwdV9oYXJkX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKiwgc3RydWN0IG5ldF9kZXZpY2UgKik7CiBleHRlcm4gdm9pZCBpMTQ4MHVfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqKTsKIGV4dGVybiBpbnQgaTE0ODB1X3NldF9jb25maWcoc3RydWN0IG5ldF9kZXZpY2UgKiwgc3RydWN0IGlmbWFwICopOwotZXh0ZXJuIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICppMTQ4MHVfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICopOwogZXh0ZXJuIGludCBpMTQ4MHVfY2hhbmdlX210dShzdHJ1Y3QgbmV0X2RldmljZSAqLCBpbnQpOwogZXh0ZXJuIHZvaWQgaTE0ODB1X3V3Yl9ub3RpZnNfY2Iodm9pZCAqLCBzdHJ1Y3QgdXdiX2RldiAqLCBlbnVtIHV3Yl9ub3RpZnMpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3V3Yi9pMTQ4MC9pMTQ4MHUtd2xwL2xjLmMgYi9kcml2ZXJzL3V3Yi9pMTQ4MC9pMTQ4MHUtd2xwL2xjLmMKaW5kZXggMDQ5YzA1ZC4uZjI3MmRmZSAxMDA2NDQKLS0tIGEvZHJpdmVycy91d2IvaTE0ODAvaTE0ODB1LXdscC9sYy5jCisrKyBiL2RyaXZlcnMvdXdiL2kxNDgwL2kxNDgwdS13bHAvbGMuYwpAQCAtMTgxLDYgKzE4MSwxNSBAQAogfQogI2VuZGlmCiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgaTE0ODB1X25ldGRldl9vcHMgPSB7CisJLm5kb19vcGVuCT0gaTE0ODB1X29wZW4sCisJLm5kb19zdG9wIAk9IGkxNDgwdV9zdG9wLAorCS5uZG9fc3RhcnRfeG1pdCA9IGkxNDgwdV9oYXJkX3N0YXJ0X3htaXQsCisJLm5kb190eF90aW1lb3V0ID0gaTE0ODB1X3R4X3RpbWVvdXQsCisJLm5kb19zZXRfY29uZmlnID0gaTE0ODB1X3NldF9jb25maWcsCisJLm5kb19jaGFuZ2VfbXR1ID0gaTE0ODB1X2NoYW5nZV9tdHUsCit9OworCiBzdGF0aWMKIGludCBpMTQ4MHVfYWRkKHN0cnVjdCBpMTQ4MHUgKmkxNDgwdSwgc3RydWN0IHVzYl9pbnRlcmZhY2UgKmlmYWNlKQogewpAQCAtMjM1LDEzICsyNDQsNyBAQAogCW5ldF9kZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfSElHSERNQTsKIAluZXRfZGV2LT53YXRjaGRvZ190aW1lbyA9IDUqSFo7CQkvKiBGSVhNRTogYSBiZXR0ZXIgZGVmYXVsdD8gKi8KIAotCW5ldF9kZXYtPm9wZW4gPSBpMTQ4MHVfb3BlbjsKLQluZXRfZGV2LT5zdG9wID0gaTE0ODB1X3N0b3A7Ci0JbmV0X2Rldi0+aGFyZF9zdGFydF94bWl0ID0gaTE0ODB1X2hhcmRfc3RhcnRfeG1pdDsKLQluZXRfZGV2LT50eF90aW1lb3V0ID0gaTE0ODB1X3R4X3RpbWVvdXQ7Ci0JbmV0X2Rldi0+Z2V0X3N0YXRzID0gaTE0ODB1X2dldF9zdGF0czsKLQluZXRfZGV2LT5zZXRfY29uZmlnID0gaTE0ODB1X3NldF9jb25maWc7Ci0JbmV0X2Rldi0+Y2hhbmdlX210dSA9IGkxNDgwdV9jaGFuZ2VfbXR1OworCW5ldF9kZXYtPm5ldGRldl9vcHMgPSAmaTE0ODB1X25ldGRldl9vcHM7CiAKICNpZmRlZiBpMTQ4MHVfRkxPV19DT05UUk9MCiAJLyogTm90aWZpY2F0aW9uIGVuZHBvaW50IHNldHVwIChzdWJtaXR0ZWQgd2hlbiB3ZSBvcGVuIHRoZSBkZXZpY2UpICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3V3Yi9pMTQ4MC9pMTQ4MHUtd2xwL25ldGRldi5jIGIvZHJpdmVycy91d2IvaTE0ODAvaTE0ODB1LXdscC9uZXRkZXYuYwppbmRleCBlMzg3M2ZmLi43MzA1NTUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3V3Yi9pMTQ4MC9pMTQ4MHUtd2xwL25ldGRldi5jCisrKyBiL2RyaXZlcnMvdXdiL2kxNDgwL2kxNDgwdS13bHAvbmV0ZGV2LmMKQEAgLTI2MiwxNSArMjYyLDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotCi0vKiogUmVwb3J0IHN0YXRpc3RpY3MgKi8KLXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICppMTQ4MHVfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2KQotewotCXN0cnVjdCBpMTQ4MHUgKmkxNDgwdSA9IG5ldGRldl9wcml2KG5ldF9kZXYpOwotCXJldHVybiAmaTE0ODB1LT5zdGF0czsKLX0KLQotCiAvKioKICAqCiAgKiBDaGFuZ2UgdGhlIGludGVyZmFjZSBjb25maWctLXdlIHByb2JhYmx5IGRvbid0IGhhdmUgdG8gZG8gYW55dGhpbmcuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3V3Yi9pMTQ4MC9pMTQ4MHUtd2xwL3J4LmMgYi9kcml2ZXJzL3V3Yi9pMTQ4MC9pMTQ4MHUtd2xwL3J4LmMKaW5kZXggMzRmNGNmOS4uMjVhMjc1OCAxMDA2NDQKLS0tIGEvZHJpdmVycy91d2IvaTE0ODAvaTE0ODB1LXdscC9yeC5jCisrKyBiL2RyaXZlcnMvdXdiL2kxNDgwL2kxNDgwdS13bHAvcnguYwpAQCAtMTY3LDcgKzE2Nyw3IEBACiBkbyB7CQkJCQkJCVwKIAlpZiAocHJpbnRrX3JhdGVsaW1pdCgpKQkJCQlcCiAJCWRldl9lcnIoJmkxNDgwdS0+dXNiX2lmYWNlLT5kZXYsIG1zZyk7CVwKLQlpMTQ4MHUtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsJCQlcCisJaTE0ODB1LT5uZXRfZGV2LT5zdGF0cy5yeF9kcm9wcGVkKys7CQkJXAogfSB3aGlsZSAoMCkKIAogCkBAIC0xOTMsMTAgKzE5Myw4IEBACiAJaWYgKCFzaG91bGRfcGFyc2UpCiAJCWdvdG8gb3V0OwogCWkxNDgwdS0+cnhfc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKGkxNDgwdS0+cnhfc2tiLCBuZXRfZGV2KTsKLQlpMTQ4MHUtPnN0YXRzLnJ4X3BhY2tldHMrKzsKLQlpMTQ4MHUtPnN0YXRzLnJ4X2J5dGVzICs9IGkxNDgwdS0+cnhfdW50ZF9wa3Rfc2l6ZTsKLQluZXRfZGV2LT5sYXN0X3J4ID0gamlmZmllczsKLQkvKiBGSVhNRTogZmxvdyBjb250cm9sOiBjaGVjayBuZXRpZl9yeCgpIHJldHZhbCAqLworCW5ldF9kZXYtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwluZXRfZGV2LT5zdGF0cy5yeF9ieXRlcyArPSBpMTQ4MHUtPnJ4X3VudGRfcGt0X3NpemU7CiAKIAluZXRpZl9yeChpMTQ4MHUtPnJ4X3NrYik7CQkvKiBkZWxpdmVyICovCiBvdXQ6CmRpZmYgLS1naXQgYS9kcml2ZXJzL3V3Yi9pMTQ4MC9pMTQ4MHUtd2xwL3R4LmMgYi9kcml2ZXJzL3V3Yi9pMTQ4MC9pMTQ4MHUtd2xwL3R4LmMKaW5kZXggMzkwMzJjYy4uMjZiYWNjMCAxMDA2NDQKLS0tIGEvZHJpdmVycy91d2IvaTE0ODAvaTE0ODB1LXdscC90eC5jCisrKyBiL2RyaXZlcnMvdXdiL2kxNDgwL2kxNDgwdS13bHAvdHguYwpAQCAtMTE3LDggKzExNyw4IEBACiAJc3dpdGNoICh1cmItPnN0YXR1cykgewogCWNhc2UgMDoKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJmkxNDgwdS0+bG9jaywgZmxhZ3MpOwotCQlpMTQ4MHUtPnN0YXRzLnR4X3BhY2tldHMrKzsKLQkJaTE0ODB1LT5zdGF0cy50eF9ieXRlcyArPSB1cmItPmFjdHVhbF9sZW5ndGg7CisJCW5ldF9kZXYtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwkJbmV0X2Rldi0+c3RhdHMudHhfYnl0ZXMgKz0gdXJiLT5hY3R1YWxfbGVuZ3RoOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpMTQ4MHUtPmxvY2ssIGZsYWdzKTsKIAkJYnJlYWs7CiAJY2FzZSAtRUNPTk5SRVNFVDoJLyogTm90IGFuIGVycm9yLCBidXQgYSBjb250cm9sbGVkIHNpdHVhdGlvbjsgKi8KQEAgLTUzMCw3ICs1MzAsNyBAQAogCXJldHVybiBORVRERVZfVFhfT0s7CiBlcnJvcjoKIAlkZXZfa2ZyZWVfc2tiX2FueShza2IpOwotCWkxNDgwdS0+c3RhdHMudHhfZHJvcHBlZCsrOworCW5ldF9kZXYtPnN0YXRzLnR4X2Ryb3BwZWQrKzsKIG91dDoKIAlyZXR1cm4gTkVUREVWX1RYX09LOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9hbWJhLWNsY2QuYyBiL2RyaXZlcnMvdmlkZW8vYW1iYS1jbGNkLmMKaW5kZXggMmFjNTJmZC4uNGUwNDZmZSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9hbWJhLWNsY2QuYworKysgYi9kcml2ZXJzL3ZpZGVvL2FtYmEtY2xjZC5jCkBAIC0yNCw2ICsyNCw3IEBACiAjaW5jbHVkZSA8bGludXgvYW1iYS9idXMuaD4KICNpbmNsdWRlIDxsaW51eC9hbWJhL2NsY2QuaD4KICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9oYXJkaXJxLmg+CiAKICNpbmNsdWRlIDxhc20vc2l6ZXMuaD4KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9hdHkvYXR5MTI4ZmIuYyBiL2RyaXZlcnMvdmlkZW8vYXR5L2F0eTEyOGZiLmMKaW5kZXggMjQzZWE0YS4uZGIxNjExMiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9hdHkvYXR5MTI4ZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL2F0eS9hdHkxMjhmYi5jCkBAIC0yMDUxLDcgKzIwNTEsNyBAQAogCiAJLyogVmlydHVhbGl6ZSBtbWlvIHJlZ2lvbiAqLwogCWluZm8tPmZpeC5tbWlvX3N0YXJ0ID0gcmVnX2FkZHI7Ci0JcGFyLT5yZWdiYXNlID0gaW9yZW1hcChyZWdfYWRkciwgcGNpX3Jlc291cmNlX2xlbihwZGV2LCAyKSk7CisJcGFyLT5yZWdiYXNlID0gcGNpX2lvcmVtYXBfYmFyKHBkZXYsIDIpOwogCWlmICghcGFyLT5yZWdiYXNlKQogCQlnb3RvIGVycl9mcmVlX2luZm87CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L2JhY2tsaWdodC5jIGIvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvYmFja2xpZ2h0LmMKaW5kZXggZmFiMGJjOC4uMDY2NGZjMCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvYmFja2xpZ2h0LmMKKysrIGIvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvYmFja2xpZ2h0LmMKQEAgLTIxNyw3ICsyMTcsNyBAQAogCW5ld19iZC0+ZGV2LmNsYXNzID0gYmFja2xpZ2h0X2NsYXNzOwogCW5ld19iZC0+ZGV2LnBhcmVudCA9IHBhcmVudDsKIAluZXdfYmQtPmRldi5yZWxlYXNlID0gYmxfZGV2aWNlX3JlbGVhc2U7Ci0Jc3RybGNweShuZXdfYmQtPmRldi5idXNfaWQsIG5hbWUsIEJVU19JRF9TSVpFKTsKKwlkZXZfc2V0X25hbWUoJm5ld19iZC0+ZGV2LCBuYW1lKTsKIAlkZXZfc2V0X2RydmRhdGEoJm5ld19iZC0+ZGV2LCBkZXZkYXRhKTsKIAogCXJjID0gZGV2aWNlX3JlZ2lzdGVyKCZuZXdfYmQtPmRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9sY2QuYyBiL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L2xjZC5jCmluZGV4IDY4MGU1N2IuLmI2NDQ5NDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L2xjZC5jCisrKyBiL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L2xjZC5jCkBAIC0yMDgsNyArMjA4LDcgQEAKIAluZXdfbGQtPmRldi5jbGFzcyA9IGxjZF9jbGFzczsKIAluZXdfbGQtPmRldi5wYXJlbnQgPSBwYXJlbnQ7CiAJbmV3X2xkLT5kZXYucmVsZWFzZSA9IGxjZF9kZXZpY2VfcmVsZWFzZTsKLQlzdHJsY3B5KG5ld19sZC0+ZGV2LmJ1c19pZCwgbmFtZSwgQlVTX0lEX1NJWkUpOworCWRldl9zZXRfbmFtZSgmbmV3X2xkLT5kZXYsIG5hbWUpOwogCWRldl9zZXRfZHJ2ZGF0YSgmbmV3X2xkLT5kZXYsIGRldmRhdGEpOwogCiAJcmMgPSBkZXZpY2VfcmVnaXN0ZXIoJm5ld19sZC0+ZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vYmZpbi10MzUwbWNxYi1mYi5jIGIvZHJpdmVycy92aWRlby9iZmluLXQzNTBtY3FiLWZiLmMKaW5kZXggN2QxYjgxOS4uYTliM2FkYSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9iZmluLXQzNTBtY3FiLWZiLmMKKysrIGIvZHJpdmVycy92aWRlby9iZmluLXQzNTBtY3FiLWZiLmMKQEAgLTI1NSw3ICsyNTUsNyBAQAogewogCiAJaWYgKHZhci0+Yml0c19wZXJfcGl4ZWwgIT0gTENEX0JQUCkgewotCQlwcl9kZWJ1ZygiJXM6IGRlcHRoIG5vdCBzdXBwb3J0ZWQ6ICV1IEJQUFxuIiwgX19GVU5DVElPTl9fLAorCQlwcl9kZWJ1ZygiJXM6IGRlcHRoIG5vdCBzdXBwb3J0ZWQ6ICV1IEJQUFxuIiwgX19mdW5jX18sCiAJCQkgdmFyLT5iaXRzX3Blcl9waXhlbCk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTI2NCw3ICsyNjQsNyBAQAogCSAgICBpbmZvLT52YXIueHJlc192aXJ0dWFsICE9IHZhci0+eHJlc192aXJ0dWFsIHx8CiAJICAgIGluZm8tPnZhci55cmVzX3ZpcnR1YWwgIT0gdmFyLT55cmVzX3ZpcnR1YWwpIHsKIAkJcHJfZGVidWcoIiVzOiBSZXNvbHV0aW9uIG5vdCBzdXBwb3J0ZWQ6IFgldSB4IFkldSBcbiIsCi0JCQkgX19GVU5DVElPTl9fLCB2YXItPnhyZXMsIHZhci0+eXJlcyk7CisJCQkgX19mdW5jX18sIHZhci0+eHJlcywgdmFyLT55cmVzKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0yNzQsNyArMjc0LDcgQEAKIAogCWlmICgoaW5mby0+Zml4LmxpbmVfbGVuZ3RoICogdmFyLT55cmVzX3ZpcnR1YWwpID4gaW5mby0+Zml4LnNtZW1fbGVuKSB7CiAJCXByX2RlYnVnKCIlczogTWVtb3J5IExpbWl0IHJlcXVlc3RlZCB5cmVzX3ZpcnR1YWwgPSAldVxuIiwKLQkJCSBfX0ZVTkNUSU9OX18sIHZhci0+eXJlc192aXJ0dWFsKTsKKwkJCSBfX2Z1bmNfXywgdmFyLT55cmVzX3ZpcnR1YWwpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vY2FybWluZWZiLmMgYi9kcml2ZXJzL3ZpZGVvL2Nhcm1pbmVmYi5jCmluZGV4IGM5YjE5MTMuLmM3ZmYzYzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vY2FybWluZWZiLmMKKysrIGIvZHJpdmVycy92aWRlby9jYXJtaW5lZmIuYwpAQCAtMTY4LDcgKzE2OCw3IEBACiAJYmx1ZSA+Pj0gODsKIAl0cmFuc3AgPj49IDg7CiAKLQkoKHUzMiAqKWluZm8tPnBzZXVkb19wYWxldHRlKVtyZWdub10gPSBiZTMyX3RvX2NwdSh0cmFuc3AgPDwgMjQgfAorCSgoX19iZTMyICopaW5mby0+cHNldWRvX3BhbGV0dGUpW3JlZ25vXSA9IGNwdV90b19iZTMyKHRyYW5zcCA8PCAyNCB8CiAJCXJlZCA8PCAwIHwgZ3JlZW4gPDwgOCB8IGJsdWUgPDwgMTYpOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9jb25zb2xlL3ZnYWNvbi5jIGIvZHJpdmVycy92aWRlby9jb25zb2xlL3ZnYWNvbi5jCmluZGV4IGU2MjEwNzIuLmQwMTJlZGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vY29uc29sZS92Z2Fjb24uYworKysgYi9kcml2ZXJzL3ZpZGVvL2NvbnNvbGUvdmdhY29uLmMKQEAgLTEzMzIsNyArMTMzMiw3IEBACiAJCWMtPnZjX3kgPSBzY3JlZW5faW5mby5vcmlnX3k7CiAJfQogCi0JLyogV2UgY2FuJ3QgY29weSBpbiBtb3JlIHRoZW4gdGhlIHNpemUgb2YgdGhlIHZpZGVvIGJ1ZmZlciwKKwkvKiBXZSBjYW4ndCBjb3B5IGluIG1vcmUgdGhhbiB0aGUgc2l6ZSBvZiB0aGUgdmlkZW8gYnVmZmVyLAogCSAqIG9yIHdlJ2xsIGJlIGNvcHlpbmcgaW4gVkdBIEJJT1MgKi8KIAogCWlmICghdmdhX2lzX2dmeCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vY3liZXIyMDAwZmIuYyBiL2RyaXZlcnMvdmlkZW8vY3liZXIyMDAwZmIuYwppbmRleCAzOWQ1ZDY0Li43YTllNDJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2N5YmVyMjAwMGZiLmMKKysrIGIvZHJpdmVycy92aWRlby9jeWJlcjIwMDBmYi5jCkBAIC0xNTgzLDggKzE1ODMsNyBAQAogCQlnb3RvIGZhaWxlZF9yZWxlYXNlOwogCiAJY2ZiLT5kZXYgPSBkZXY7Ci0JY2ZiLT5yZWdpb24gPSBpb3JlbWFwKHBjaV9yZXNvdXJjZV9zdGFydChkZXYsIDApLAotCQkJICAgICAgcGNpX3Jlc291cmNlX2xlbihkZXYsIDApKTsKKwljZmItPnJlZ2lvbiA9IHBjaV9pb3JlbWFwX2JhcihkZXYsIDApOwogCWlmICghY2ZiLT5yZWdpb24pCiAJCWdvdG8gZmFpbGVkX2lvcmVtYXA7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vZmJtZW0uYyBiL2RyaXZlcnMvdmlkZW8vZmJtZW0uYwppbmRleCAzYzY1YjBkLi43NTZlZmViIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2ZibWVtLmMKKysrIGIvZHJpdmVycy92aWRlby9mYm1lbS5jCkBAIC01MTAsNiArNTEwLDEwIEBACiAJCWZiX2xvZ29fZXhfbnVtID0gMDsKIAogCWZvciAoaSA9IDA7IGkgPCBmYl9sb2dvX2V4X251bTsgaSsrKSB7CisJCWlmIChmYl9sb2dvX2V4W2ldLmxvZ28tPnR5cGUgIT0gZmJfbG9nby5sb2dvLT50eXBlKSB7CisJCQlmYl9sb2dvX2V4W2ldLmxvZ28gPSBOVUxMOworCQkJY29udGludWU7CisJCX0KIAkJaGVpZ2h0ICs9IGZiX2xvZ29fZXhbaV0ubG9nby0+aGVpZ2h0OwogCQlpZiAoaGVpZ2h0ID4geXJlcykgewogCQkJaGVpZ2h0IC09IGZiX2xvZ29fZXhbaV0ubG9nby0+aGVpZ2h0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9nYmVmYi5jIGIvZHJpdmVycy92aWRlby9nYmVmYi5jCmluZGV4IGY4OWMzY2MuLmZlNWI1MTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vZ2JlZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL2diZWZiLmMKQEAgLTkxMiw2ICs5MTIsNyBAQAogewogCXVuc2lnbmVkIGludCBsaW5lX2xlbmd0aDsKIAlzdHJ1Y3QgZ2JlX3RpbWluZ19pbmZvIHRpbWluZzsKKwlpbnQgcmV0OwogCiAJLyogTGltaXQgYnBwIHRvIDgsIDE2LCBhbmQgMzIgKi8KIAlpZiAodmFyLT5iaXRzX3Blcl9waXhlbCA8PSA4KQpAQCAtOTMwLDggKzkzMSwxMCBAQAogCiAJdmFyLT5ncmF5c2NhbGUgPSAwOwkvKiBObyBncmF5c2NhbGUgZm9yIG5vdyAqLwogCi0JaWYgKCh2YXItPnBpeGNsb2NrID0gY29tcHV0ZV9nYmVfdGltaW5nKHZhciwgJnRpbWluZykpIDwgMCkKLQkJcmV0dXJuKC1FSU5WQUwpOworCXJldCA9IGNvbXB1dGVfZ2JlX3RpbWluZyh2YXIsICZ0aW1pbmcpOworCXZhci0+cGl4Y2xvY2sgPSByZXQ7CisJaWYgKHJldCA8IDApCisJCXJldHVybiAtRUlOVkFMOwogCiAJLyogQWRqdXN0IHZpcnR1YWwgcmVzb2x1dGlvbiwgaWYgbmVjZXNzYXJ5ICovCiAJaWYgKHZhci0+eHJlcyA+IHZhci0+eHJlc192aXJ0dWFsIHx8ICgheXdyYXAgJiYgIXlwYW4pKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9nZW9kZS9neDFmYl9jb3JlLmMgYi9kcml2ZXJzL3ZpZGVvL2dlb2RlL2d4MWZiX2NvcmUuYwppbmRleCBiYjIwYTIyLi43NTFlNDkxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2dlb2RlL2d4MWZiX2NvcmUuYworKysgYi9kcml2ZXJzL3ZpZGVvL2dlb2RlL2d4MWZiX2NvcmUuYwpAQCAtMjE3LDggKzIxNyw3IEBACiAJcmV0ID0gcGNpX3JlcXVlc3RfcmVnaW9uKGRldiwgMCwgImd4MWZiICh2aWRlbykiKTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKLQlwYXItPnZpZF9yZWdzID0gaW9yZW1hcChwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2LCAwKSwKLQkJCQlwY2lfcmVzb3VyY2VfbGVuKGRldiwgMCkpOworCXBhci0+dmlkX3JlZ3MgPSBwY2lfaW9yZW1hcF9iYXIoZGV2LCAwKTsKIAlpZiAoIXBhci0+dmlkX3JlZ3MpCiAJCXJldHVybiAtRU5PTUVNOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2dlb2RlL2d4ZmJfY29yZS5jIGIvZHJpdmVycy92aWRlby9nZW9kZS9neGZiX2NvcmUuYwppbmRleCBkZTJiOGY5Li40ODQxMTg5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2dlb2RlL2d4ZmJfY29yZS5jCisrKyBiL2RyaXZlcnMvdmlkZW8vZ2VvZGUvZ3hmYl9jb3JlLmMKQEAgLTI0MiwyMyArMjQyLDIxIEBACiAJcmV0ID0gcGNpX3JlcXVlc3RfcmVnaW9uKGRldiwgMywgImd4ZmIgKHZpZGVvIHByb2Nlc3NvcikiKTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKLQlwYXItPnZpZF9yZWdzID0gaW9yZW1hcChwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2LCAzKSwKLQkJCQlwY2lfcmVzb3VyY2VfbGVuKGRldiwgMykpOworCXBhci0+dmlkX3JlZ3MgPSBwY2lfaW9yZW1hcF9iYXIoZGV2LCAzKTsKIAlpZiAoIXBhci0+dmlkX3JlZ3MpCiAJCXJldHVybiAtRU5PTUVNOwogCiAJcmV0ID0gcGNpX3JlcXVlc3RfcmVnaW9uKGRldiwgMiwgImd4ZmIgKGRpc3BsYXkgY29udHJvbGxlcikiKTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKLQlwYXItPmRjX3JlZ3MgPSBpb3JlbWFwKHBjaV9yZXNvdXJjZV9zdGFydChkZXYsIDIpLCBwY2lfcmVzb3VyY2VfbGVuKGRldiwgMikpOworCXBhci0+ZGNfcmVncyA9IHBjaV9pb3JlbWFwX2JhcihkZXYsIDIpOwogCWlmICghcGFyLT5kY19yZWdzKQogCQlyZXR1cm4gLUVOT01FTTsKIAogCXJldCA9IHBjaV9yZXF1ZXN0X3JlZ2lvbihkZXYsIDEsICJneGZiIChncmFwaGljcyBwcm9jZXNzb3IpIik7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7Ci0JcGFyLT5ncF9yZWdzID0gaW9yZW1hcChwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2LCAxKSwKLQlwY2lfcmVzb3VyY2VfbGVuKGRldiwgMSkpOworCXBhci0+Z3BfcmVncyA9IHBjaV9pb3JlbWFwX2JhcihkZXYsIDEpOwogCiAJaWYgKCFwYXItPmdwX3JlZ3MpCiAJCXJldHVybiAtRU5PTUVNOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9nZW9kZS9seGZiX2NvcmUuYyBiL2RyaXZlcnMvdmlkZW8vZ2VvZGUvbHhmYl9jb3JlLmMKaW5kZXggMmNkOWI3NC4uYjk2NWVjZCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9nZW9kZS9seGZiX2NvcmUuYworKysgYi9kcml2ZXJzL3ZpZGVvL2dlb2RlL2x4ZmJfY29yZS5jCkBAIC0zNzksMjAgKzM3OSwxNyBAQAogCWlmIChpbmZvLT5zY3JlZW5fYmFzZSA9PSBOVUxMKQogCQlyZXR1cm4gcmV0OwogCi0JcGFyLT5ncF9yZWdzID0gaW9yZW1hcChwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2LCAxKSwKLQkJCQlwY2lfcmVzb3VyY2VfbGVuKGRldiwgMSkpOworCXBhci0+Z3BfcmVncyA9IHBjaV9pb3JlbWFwX2JhcihkZXYsIDEpOwogCiAJaWYgKHBhci0+Z3BfcmVncyA9PSBOVUxMKQogCQlyZXR1cm4gcmV0OwogCi0JcGFyLT5kY19yZWdzID0gaW9yZW1hcChwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2LCAyKSwKLQkJCSAgICAgICBwY2lfcmVzb3VyY2VfbGVuKGRldiwgMikpOworCXBhci0+ZGNfcmVncyA9IHBjaV9pb3JlbWFwX2JhcihkZXYsIDIpOwogCiAJaWYgKHBhci0+ZGNfcmVncyA9PSBOVUxMKQogCQlyZXR1cm4gcmV0OwogCi0JcGFyLT52cF9yZWdzID0gaW9yZW1hcChwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2LCAzKSwKLQkJCSAgICAgICBwY2lfcmVzb3VyY2VfbGVuKGRldiwgMykpOworCXBhci0+dnBfcmVncyA9IHBjaV9pb3JlbWFwX2JhcihkZXYsIDMpOwogCiAJaWYgKHBhci0+dnBfcmVncyA9PSBOVUxMKQogCQlyZXR1cm4gcmV0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9neHQ0NTAwLmMgYi9kcml2ZXJzL3ZpZGVvL2d4dDQ1MDAuYwppbmRleCA1NjQ1NTc3Li44OTZlNTNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2d4dDQ1MDAuYworKysgYi9kcml2ZXJzL3ZpZGVvL2d4dDQ1MDAuYwpAQCAtNjQ4LDcgKzY0OCw3IEBACiAJaW5mby0+cHNldWRvX3BhbGV0dGUgPSBwYXItPnBzZXVkb19wYWxldHRlOwogCiAJaW5mby0+Zml4Lm1taW9fc3RhcnQgPSByZWdfcGh5czsKLQlwYXItPnJlZ3MgPSBpb3JlbWFwKHJlZ19waHlzLCBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDApKTsKKwlwYXItPnJlZ3MgPSBwY2lfaW9yZW1hcF9iYXIocGRldiwgMCk7CiAJaWYgKCFwYXItPnJlZ3MpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiZ3h0NDUwMDogY2Fubm90IG1hcCByZWdpc3RlcnNcbiIpOwogCQlnb3RvIGVycl9mcmVlX2FsbDsKQEAgLTY1Niw3ICs2NTYsNyBAQAogCiAJaW5mby0+Zml4LnNtZW1fc3RhcnQgPSBmYl9waHlzOwogCWluZm8tPmZpeC5zbWVtX2xlbiA9IHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMSk7Ci0JaW5mby0+c2NyZWVuX2Jhc2UgPSBpb3JlbWFwKGZiX3BoeXMsIHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMSkpOworCWluZm8tPnNjcmVlbl9iYXNlID0gcGNpX2lvcmVtYXBfYmFyKHBkZXYsIDEpOwogCWlmICghaW5mby0+c2NyZWVuX2Jhc2UpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiZ3h0NDUwMDogY2Fubm90IG1hcCBmcmFtZWJ1ZmZlclxuIik7CiAJCWdvdG8gZXJyX3VubWFwX3JlZ3M7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2k4MTAvaTgxMF9hY2NlbC5jIGIvZHJpdmVycy92aWRlby9pODEwL2k4MTBfYWNjZWwuYwppbmRleCA3Njc2NGVhLi5mNWJlZGVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2k4MTAvaTgxMF9hY2NlbC5jCisrKyBiL2RyaXZlcnMvdmlkZW8vaTgxMC9pODEwX2FjY2VsLmMKQEAgLTMwMSw4ICszMDEsMTAgQEAKIAl1MzIgZHgsIGR5LCB3aWR0aCwgaGVpZ2h0LCBkZXN0LCByb3AgPSAwLCBjb2xvciA9IDA7CiAKIAlpZiAoIWluZm8tPnZhci5hY2NlbF9mbGFncyB8fCBwYXItPmRldl9mbGFncyAmIExPQ0tVUCB8fAotCSAgICBwYXItPmRlcHRoID09IDQpIAotCQlyZXR1cm4gY2ZiX2ZpbGxyZWN0KGluZm8sIHJlY3QpOworCSAgICBwYXItPmRlcHRoID09IDQpIHsKKwkJY2ZiX2ZpbGxyZWN0KGluZm8sIHJlY3QpOworCQlyZXR1cm47CisJfQogCiAJaWYgKHBhci0+ZGVwdGggPT0gMSkgCiAJCWNvbG9yID0gcmVjdC0+Y29sb3I7CkBAIC0zMjcsOCArMzI5LDEwIEBACiAJdTMyIHN4LCBzeSwgZHgsIGR5LCBwaXRjaCwgd2lkdGgsIGhlaWdodCwgc3JjLCBkZXN0LCB4ZGlyOwogCiAJaWYgKCFpbmZvLT52YXIuYWNjZWxfZmxhZ3MgfHwgcGFyLT5kZXZfZmxhZ3MgJiBMT0NLVVAgfHwKLQkgICAgcGFyLT5kZXB0aCA9PSA0KQotCQlyZXR1cm4gY2ZiX2NvcHlhcmVhKGluZm8sIHJlZ2lvbik7CisJICAgIHBhci0+ZGVwdGggPT0gNCkgeworCQljZmJfY29weWFyZWEoaW5mbywgcmVnaW9uKTsKKwkJcmV0dXJuOworCX0KIAogCWR4ID0gcmVnaW9uLT5keCAqIHBhci0+ZGVwdGg7CiAJc3ggPSByZWdpb24tPnN4ICogcGFyLT5kZXB0aDsKQEAgLTM2Niw4ICszNzAsMTAgQEAKIAl1MzIgZmcgPSAwLCBiZyA9IDAsIHNpemUsIGRzdDsKIAkKIAlpZiAoIWluZm8tPnZhci5hY2NlbF9mbGFncyB8fCBwYXItPmRldl9mbGFncyAmIExPQ0tVUCB8fAotCSAgICBwYXItPmRlcHRoID09IDQgfHwgaW1hZ2UtPmRlcHRoICE9IDEpIAotCQlyZXR1cm4gY2ZiX2ltYWdlYmxpdChpbmZvLCBpbWFnZSk7CisJICAgIHBhci0+ZGVwdGggPT0gNCB8fCBpbWFnZS0+ZGVwdGggIT0gMSkgeworCQljZmJfaW1hZ2VibGl0KGluZm8sIGltYWdlKTsKKwkJcmV0dXJuOworCX0KIAogCXN3aXRjaCAoaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsKSB7CiAJY2FzZSA4OgpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9pbnRlbGZiL2ludGVsZmJkcnYuYyBiL2RyaXZlcnMvdmlkZW8vaW50ZWxmYi9pbnRlbGZiZHJ2LmMKaW5kZXggYTA5ZTIzNi4uNmQ4ZTU0MSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9pbnRlbGZiL2ludGVsZmJkcnYuYworKysgYi9kcml2ZXJzL3ZpZGVvL2ludGVsZmIvaW50ZWxmYmRydi5jCkBAIC0xNDkzLDggKzE0OTMsMTAgQEAKIAlEQkdfTVNHKCJpbnRlbGZiX2ZpbGxyZWN0XG4iKTsKICNlbmRpZgogCi0JaWYgKCFBQ0NFTChkaW5mbywgaW5mbykgfHwgZGluZm8tPmRlcHRoID09IDQpCi0JCXJldHVybiBjZmJfZmlsbHJlY3QoaW5mbywgcmVjdCk7CisJaWYgKCFBQ0NFTChkaW5mbywgaW5mbykgfHwgZGluZm8tPmRlcHRoID09IDQpIHsKKwkJY2ZiX2ZpbGxyZWN0KGluZm8sIHJlY3QpOworCQlyZXR1cm47CisJfQogCiAJaWYgKHJlY3QtPnJvcCA9PSBST1BfQ09QWSkKIAkJcm9wID0gUEFUX1JPUF9HWENPUFk7CkBAIC0xNTIxLDggKzE1MjMsMTAgQEAKIAlEQkdfTVNHKCJpbnRlbGZiX2NvcHlhcmVhXG4iKTsKICNlbmRpZgogCi0JaWYgKCFBQ0NFTChkaW5mbywgaW5mbykgfHwgZGluZm8tPmRlcHRoID09IDQpCi0JCXJldHVybiBjZmJfY29weWFyZWEoaW5mbywgcmVnaW9uKTsKKwlpZiAoIUFDQ0VMKGRpbmZvLCBpbmZvKSB8fCBkaW5mby0+ZGVwdGggPT0gNCkgeworCQljZmJfY29weWFyZWEoaW5mbywgcmVnaW9uKTsKKwkJcmV0dXJuOworCX0KIAogCWludGVsZmJod19kb19iaXRibHQoZGluZm8sIHJlZ2lvbi0+c3gsIHJlZ2lvbi0+c3ksIHJlZ2lvbi0+ZHgsCiAJCQkgICAgcmVnaW9uLT5keSwgcmVnaW9uLT53aWR0aCwgcmVnaW9uLT5oZWlnaHQsCkBAIC0xNTQwLDggKzE1NDQsMTAgQEAKICNlbmRpZgogCiAJaWYgKCFBQ0NFTChkaW5mbywgaW5mbykgfHwgZGluZm8tPmRlcHRoID09IDQKLQkgICAgfHwgaW1hZ2UtPmRlcHRoICE9IDEpCi0JCXJldHVybiBjZmJfaW1hZ2VibGl0KGluZm8sIGltYWdlKTsKKwkgICAgfHwgaW1hZ2UtPmRlcHRoICE9IDEpIHsKKwkJY2ZiX2ltYWdlYmxpdChpbmZvLCBpbWFnZSk7CisJCXJldHVybjsKKwl9CiAKIAlpZiAoZGluZm8tPmRlcHRoICE9IDgpIHsKIAkJZmdjb2xvciA9IGRpbmZvLT5wc2V1ZG9fcGFsZXR0ZVtpbWFnZS0+ZmdfY29sb3JdOwpAQCAtMTU1NCw4ICsxNTYwLDEwIEBACiAJaWYgKCFpbnRlbGZiaHdfZG9fZHJhd2dseXBoKGRpbmZvLCBmZ2NvbG9yLCBiZ2NvbG9yLCBpbWFnZS0+d2lkdGgsCiAJCQkJICAgIGltYWdlLT5oZWlnaHQsIGltYWdlLT5kYXRhLAogCQkJCSAgICBpbWFnZS0+ZHgsIGltYWdlLT5keSwKLQkJCQkgICAgZGluZm8tPnBpdGNoLCBpbmZvLT52YXIuYml0c19wZXJfcGl4ZWwpKQotCQlyZXR1cm4gY2ZiX2ltYWdlYmxpdChpbmZvLCBpbWFnZSk7CisJCQkJICAgIGRpbmZvLT5waXRjaCwgaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsKSkgeworCQljZmJfaW1hZ2VibGl0KGluZm8sIGltYWdlKTsKKwkJcmV0dXJuOworCX0KIH0KIAogc3RhdGljIGludCBpbnRlbGZiX2N1cnNvcihzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgc3RydWN0IGZiX2N1cnNvciAqY3Vyc29yKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9tb2RlZGIuYyBiL2RyaXZlcnMvdmlkZW8vbW9kZWRiLmMKaW5kZXggZDNjM2FmNS4uMTYxODYyNCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9tb2RlZGIuYworKysgYi9kcml2ZXJzL3ZpZGVvL21vZGVkYi5jCkBAIC0zMjksNyArMzI5LDcgQEAKIAkgIEZCX1NZTkNfSE9SX0hJR0hfQUNUIHwgRkJfU1lOQ19WRVJUX0hJR0hfQUNULAogCSAgRkJfVk1PREVfTk9OSU5URVJMQUNFRCwgRkJfTU9ERV9JU19WRVNBIH0sCiAJLyogMTcgMTE1Mng4NjQtNzUgVkVTQSAqLwotCXsgTlVMTCwgNzUsIDExNTMsIDg2NCwgOTI1OSwgMjU2LCA2NCwgMzIsIDEsIDEyOCwgMywKKwl7IE5VTEwsIDc1LCAxMTUyLCA4NjQsIDkyNTksIDI1NiwgNjQsIDMyLCAxLCAxMjgsIDMsCiAJICBGQl9TWU5DX0hPUl9ISUdIX0FDVCB8IEZCX1NZTkNfVkVSVF9ISUdIX0FDVCwKIAkgIEZCX1ZNT0RFX05PTklOVEVSTEFDRUQsIEZCX01PREVfSVNfVkVTQSB9LAogCS8qIDE4IDEyODB4OTYwLTYwIFZFU0EgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vbmVvZmIuYyBiL2RyaXZlcnMvdmlkZW8vbmVvZmIuYwppbmRleCBiZmI4MDJkLi41ODg1MjdhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL25lb2ZiLmMKKysrIGIvZHJpdmVycy92aWRlby9uZW9mYi5jCkBAIC0xNDUzLDcgKzE0NTMsOCBAQAogCQkJICogaXMgbGVzcyB0aGFuIDE2IGJpdHMgd2lkZS4gVGhpcyBpcyBkdWUgdG8gaW5zdWZmaWNpZW50CiAJCQkgKiBwYWRkaW5nIHdoZW4gd3JpdGluZyB0aGUgaW1hZ2UuIFdlIG5lZWQgdG8gYWRqdXN0CiAJCQkgKiBzdHJ1Y3QgZmJfcGl4bWFwLiBOb3QgeWV0IGRvbmUuICovCi0JCQlyZXR1cm4gY2ZiX2ltYWdlYmxpdChpbmZvLCBpbWFnZSk7CisJCQljZmJfaW1hZ2VibGl0KGluZm8sIGltYWdlKTsKKwkJCXJldHVybjsKIAkJfQogCQlibHRDbnRsX2ZsYWdzID0gTkVPX0JDMF9TUkNfTU9OTzsKIAl9IGVsc2UgaWYgKGltYWdlLT5kZXB0aCA9PSBpbmZvLT52YXIuYml0c19wZXJfcGl4ZWwpIHsKQEAgLTE0NjEsNyArMTQ2Miw4IEBACiAJfSBlbHNlIHsKIAkJLyogV2UgZG9uJ3QgY3VycmVudGx5IHN1cHBvcnQgaGFyZHdhcmUgYWNjZWxlcmF0aW9uIGlmIGltYWdlCiAJCSAqIGRlcHRoIGlzIGRpZmZlcmVudCBmcm9tIGRpc3BsYXkgKi8KLQkJcmV0dXJuIGNmYl9pbWFnZWJsaXQoaW5mbywgaW1hZ2UpOworCQljZmJfaW1hZ2VibGl0KGluZm8sIGltYWdlKTsKKwkJcmV0dXJuOwogCX0KIAogCXN3aXRjaCAoaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL252aWRpYS9udl9hY2NlbC5jIGIvZHJpdmVycy92aWRlby9udmlkaWEvbnZfYWNjZWwuYwppbmRleCBmYTQ4MjFjLi5hZDY0NzJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL252aWRpYS9udl9hY2NlbC5jCisrKyBiL2RyaXZlcnMvdmlkZW8vbnZpZGlhL252X2FjY2VsLmMKQEAgLTMwMCw4ICszMDAsMTAgQEAKIAlpZiAoaW5mby0+c3RhdGUgIT0gRkJJTkZPX1NUQVRFX1JVTk5JTkcpCiAJCXJldHVybjsKIAotCWlmIChwYXItPmxvY2t1cCkKLQkJcmV0dXJuIGNmYl9jb3B5YXJlYShpbmZvLCByZWdpb24pOworCWlmIChwYXItPmxvY2t1cCkgeworCQljZmJfY29weWFyZWEoaW5mbywgcmVnaW9uKTsKKwkJcmV0dXJuOworCX0KIAogCU5WRG1hU3RhcnQoaW5mbywgcGFyLCBCTElUX1BPSU5UX1NSQywgMyk7CiAJTlZEbWFOZXh0KHBhciwgKHJlZ2lvbi0+c3kgPDwgMTYpIHwgcmVnaW9uLT5zeCk7CkBAIC0zMTksOCArMzIxLDEwIEBACiAJaWYgKGluZm8tPnN0YXRlICE9IEZCSU5GT19TVEFURV9SVU5OSU5HKQogCQlyZXR1cm47CiAKLQlpZiAocGFyLT5sb2NrdXApCi0JCXJldHVybiBjZmJfZmlsbHJlY3QoaW5mbywgcmVjdCk7CisJaWYgKHBhci0+bG9ja3VwKSB7CisJCWNmYl9maWxscmVjdChpbmZvLCByZWN0KTsKKwkJcmV0dXJuOworCX0KIAogCWlmIChpbmZvLT52YXIuYml0c19wZXJfcGl4ZWwgPT0gOCkKIAkJY29sb3IgPSByZWN0LT5jb2xvcjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vb3V0cHV0LmMgYi9kcml2ZXJzL3ZpZGVvL291dHB1dC5jCmluZGV4IGYyZGY1NTEuLjVlNjQzOWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vb3V0cHV0LmMKKysrIGIvZHJpdmVycy92aWRlby9vdXRwdXQuYwpAQCAtOTYsNyArOTYsNyBAQAogCW5ld19kZXYtPnByb3BzID0gb3A7CiAJbmV3X2Rldi0+ZGV2LmNsYXNzID0gJnZpZGVvX291dHB1dF9jbGFzczsKIAluZXdfZGV2LT5kZXYucGFyZW50ID0gZGV2OwotCXN0cmxjcHkobmV3X2Rldi0+ZGV2LmJ1c19pZCxuYW1lLCBCVVNfSURfU0laRSk7CisJZGV2X3NldF9uYW1lKCZuZXdfZGV2LT5kZXYsIG5hbWUpOwogCWRldl9zZXRfZHJ2ZGF0YSgmbmV3X2Rldi0+ZGV2LCBkZXZkYXRhKTsKIAlyZXRfY29kZSA9IGRldmljZV9yZWdpc3RlcigmbmV3X2Rldi0+ZGV2KTsKIAlpZiAocmV0X2NvZGUpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vcG0zZmIuYyBiL2RyaXZlcnMvdmlkZW8vcG0zZmIuYwppbmRleCA2ODA4OWQxLi42NjY2ZjQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3BtM2ZiLmMKKysrIGIvZHJpdmVycy92aWRlby9wbTNmYi5jCkBAIC01MzksOCArNTM5LDEwIEBACiAJCWJneCA9IHBhci0+cGFsZXR0ZVtpbWFnZS0+YmdfY29sb3JdOwogCQlicmVhazsKIAl9Ci0JaWYgKGltYWdlLT5kZXB0aCAhPSAxKQotCQlyZXR1cm4gY2ZiX2ltYWdlYmxpdChpbmZvLCBpbWFnZSk7CisJaWYgKGltYWdlLT5kZXB0aCAhPSAxKSB7CisJCWNmYl9pbWFnZWJsaXQoaW5mbywgaW1hZ2UpOworCQlyZXR1cm47CisJfQogCiAJaWYgKGluZm8tPnZhci5iaXRzX3Blcl9waXhlbCA9PSA4KSB7CiAJCWZneCB8PSBmZ3ggPDwgODsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vc201MDFmYi5jIGIvZHJpdmVycy92aWRlby9zbTUwMWZiLmMKaW5kZXggZjk0YWU4NC4uZGNkOTg3OSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9zbTUwMWZiLmMKKysrIGIvZHJpdmVycy92aWRlby9zbTUwMWZiLmMKQEAgLTE1OSw2ICsxNTksOSBAQAogCQlicmVhazsKIAogCWNhc2UgU001MDFfTUVNRl9QQU5FTDoKKwkJaWYgKHNpemUgPiBpbmYtPmZibWVtX2xlbikKKwkJCXJldHVybiAtRU5PTUVNOworCiAJCXB0ciA9IGluZi0+ZmJtZW1fbGVuIC0gc2l6ZTsKIAkJZmJpID0gaW5mLT5mYltIRUFEX0NSVF07CiAKQEAgLTE3Miw5ICsxNzUsNiBAQAogCQlpZiAoZmJpICYmIHB0ciA8IGZiaS0+Zml4LnNtZW1fbGVuKQogCQkJcmV0dXJuIC1FTk9NRU07CiAKLQkJaWYgKHB0ciA8IDApCi0JCQlyZXR1cm4gLUVOT01FTTsKLQogCQlicmVhazsKIAogCWNhc2UgU001MDFfTUVNRl9DUlQ6CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3ZpYS92aWFmYmRldi5jIGIvZHJpdmVycy92aWRlby92aWEvdmlhZmJkZXYuYwppbmRleCBlMjFmZTViLi4zN2I0MzNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3ZpYS92aWFmYmRldi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vdmlhL3ZpYWZiZGV2LmMKQEAgLTg3MCw4ICs4NzAsMTAgQEAKIAl1MzIgY29sID0gMCwgcm9wID0gMDsKIAlpbnQgcGl0Y2g7CiAKLQlpZiAoIXZpYWZiX2FjY2VsKQotCQlyZXR1cm4gY2ZiX2ZpbGxyZWN0KGluZm8sIHJlY3QpOworCWlmICghdmlhZmJfYWNjZWwpIHsKKwkJY2ZiX2ZpbGxyZWN0KGluZm8sIHJlY3QpOworCQlyZXR1cm47CisJfQogCiAJaWYgKCFyZWN0LT53aWR0aCB8fCAhcmVjdC0+aGVpZ2h0KQogCQlyZXR1cm47CkBAIC05MzcsOCArOTM5LDEwIEBACiAKIAlERUJVR19NU0coS0VSTl9JTkZPICJ2aWFmYl9jb3B5YXJlYSEhXG4iKTsKIAotCWlmICghdmlhZmJfYWNjZWwpCi0JCXJldHVybiBjZmJfY29weWFyZWEoaW5mbywgYXJlYSk7CisJaWYgKCF2aWFmYl9hY2NlbCkgeworCQljZmJfY29weWFyZWEoaW5mbywgYXJlYSk7CisJCXJldHVybjsKKwl9CiAKIAlpZiAoIWFyZWEtPndpZHRoIHx8ICFhcmVhLT5oZWlnaHQpCiAJCXJldHVybjsKQEAgLTk5NCw4ICs5OTgsMTAgQEAKIAlpbnQgaTsKIAlpbnQgcGl0Y2g7CiAKLQlpZiAoIXZpYWZiX2FjY2VsKQotCQlyZXR1cm4gY2ZiX2ltYWdlYmxpdChpbmZvLCBpbWFnZSk7CisJaWYgKCF2aWFmYl9hY2NlbCkgeworCQljZmJfaW1hZ2VibGl0KGluZm8sIGltYWdlKTsKKwkJcmV0dXJuOworCX0KIAogCXVkYXRhID0gKHUzMiAqKSBpbWFnZS0+ZGF0YTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aXJ0aW8vdmlydGlvX3BjaS5jIGIvZHJpdmVycy92aXJ0aW8vdmlydGlvX3BjaS5jCmluZGV4IDI2NWZkZjIuLmJlZjZiNDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlydGlvL3ZpcnRpb19wY2kuYworKysgYi9kcml2ZXJzL3ZpcnRpby92aXJ0aW9fcGNpLmMKQEAgLTczLDEwICs3Myw3IEBACiAvKiBBIFBDSSBkZXZpY2UgaGFzIGl0J3Mgb3duIHN0cnVjdCBkZXZpY2UgYW5kIHNvIGRvZXMgYSB2aXJ0aW8gZGV2aWNlIHNvCiAgKiB3ZSBjcmVhdGUgYSBwbGFjZSBmb3IgdGhlIHZpcnRpbyBkZXZpY2VzIHRvIHNob3cgdXAgaW4gc3lzZnMuICBJIHRoaW5rIGl0CiAgKiB3b3VsZCBtYWtlIG1vcmUgc2Vuc2UgZm9yIHZpcnRpbyB0byBub3QgaW5zaXN0IG9uIGhhdmluZyBpdCdzIG93biBkZXZpY2UuICovCi1zdGF0aWMgc3RydWN0IGRldmljZSB2aXJ0aW9fcGNpX3Jvb3QgPSB7Ci0JLnBhcmVudAkJPSBOVUxMLAotCS5pbml0X25hbWUJPSAidmlydGlvLXBjaSIsCi19Oworc3RhdGljIHN0cnVjdCBkZXZpY2UgKnZpcnRpb19wY2lfcm9vdDsKIAogLyogQ29udmVydCBhIGdlbmVyaWMgdmlydGlvIGRldmljZSB0byBvdXIgc3RydWN0dXJlICovCiBzdGF0aWMgc3RydWN0IHZpcnRpb19wY2lfZGV2aWNlICp0b192cF9kZXZpY2Uoc3RydWN0IHZpcnRpb19kZXZpY2UgKnZkZXYpCkBAIC0zNDMsNyArMzQwLDcgQEAKIAlpZiAodnBfZGV2ID09IE5VTEwpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JdnBfZGV2LT52ZGV2LmRldi5wYXJlbnQgPSAmdmlydGlvX3BjaV9yb290OworCXZwX2Rldi0+dmRldi5kZXYucGFyZW50ID0gdmlydGlvX3BjaV9yb290OwogCXZwX2Rldi0+dmRldi5kZXYucmVsZWFzZSA9IHZpcnRpb19wY2lfcmVsZWFzZV9kZXY7CiAJdnBfZGV2LT52ZGV2LmNvbmZpZyA9ICZ2aXJ0aW9fcGNpX2NvbmZpZ19vcHM7CiAJdnBfZGV2LT5wY2lfZGV2ID0gcGNpX2RldjsKQEAgLTQzNywxMyArNDM0LDEzIEBACiB7CiAJaW50IGVycjsKIAotCWVyciA9IGRldmljZV9yZWdpc3RlcigmdmlydGlvX3BjaV9yb290KTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOworCXZpcnRpb19wY2lfcm9vdCA9IHJvb3RfZGV2aWNlX3JlZ2lzdGVyKCJ2aXJ0aW8tcGNpIik7CisJaWYgKElTX0VSUih2aXJ0aW9fcGNpX3Jvb3QpKQorCQlyZXR1cm4gUFRSX0VSUih2aXJ0aW9fcGNpX3Jvb3QpOwogCiAJZXJyID0gcGNpX3JlZ2lzdGVyX2RyaXZlcigmdmlydGlvX3BjaV9kcml2ZXIpOwogCWlmIChlcnIpCi0JCWRldmljZV91bnJlZ2lzdGVyKCZ2aXJ0aW9fcGNpX3Jvb3QpOworCQlkZXZpY2VfdW5yZWdpc3Rlcih2aXJ0aW9fcGNpX3Jvb3QpOwogCiAJcmV0dXJuIGVycjsKIH0KQEAgLTQ1Miw4ICs0NDksOCBAQAogCiBzdGF0aWMgdm9pZCBfX2V4aXQgdmlydGlvX3BjaV9leGl0KHZvaWQpCiB7Ci0JZGV2aWNlX3VucmVnaXN0ZXIoJnZpcnRpb19wY2lfcm9vdCk7CiAJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZ2aXJ0aW9fcGNpX2RyaXZlcik7CisJcm9vdF9kZXZpY2VfdW5yZWdpc3Rlcih2aXJ0aW9fcGNpX3Jvb3QpOwogfQogCiBtb2R1bGVfZXhpdCh2aXJ0aW9fcGNpX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy93MS9tYXN0ZXJzL0tjb25maWcgYi9kcml2ZXJzL3cxL21hc3RlcnMvS2NvbmZpZwppbmRleCA5MDYxNjgyLi45NmQyZjhlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3cxL21hc3RlcnMvS2NvbmZpZworKysgYi9kcml2ZXJzL3cxL21hc3RlcnMvS2NvbmZpZwpAQCAtMzQsNiArMzQsMTIgQEAKIAkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKIAkgIHdpbGwgYmUgY2FsbGVkIGRzMjQ4Mi4KIAorY29uZmlnIFcxX01BU1RFUl9NWEMKKwl0cmlzdGF0ZSAiRnJlZXNjYWxlIE1YQyAxLXdpcmUgYnVzbWFzdGVyIgorCWRlcGVuZHMgb24gVzEgJiYgQVJDSF9NWEMKKwloZWxwCisJICBTYXkgWSBoZXJlIHRvIGVuYWJsZSBNWEMgMS13aXJlIGhvc3QKKwogY29uZmlnIFcxX01BU1RFUl9EUzFXTQogCXRyaXN0YXRlICJNYXhpbSBEUzFXTSAxLXdpcmUgYnVzbWFzdGVyIgogCWRlcGVuZHMgb24gVzEgJiYgQVJNICYmIEhBVkVfQ0xLCmRpZmYgLS1naXQgYS9kcml2ZXJzL3cxL21hc3RlcnMvTWFrZWZpbGUgYi9kcml2ZXJzL3cxL21hc3RlcnMvTWFrZWZpbGUKaW5kZXggYmM0NzE0YS4uYzVhM2U5NiAxMDA2NDQKLS0tIGEvZHJpdmVycy93MS9tYXN0ZXJzL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvdzEvbWFzdGVycy9NYWtlZmlsZQpAQCAtNSw2ICs1LDggQEAKIG9iai0kKENPTkZJR19XMV9NQVNURVJfTUFUUk9YKQkJKz0gbWF0cm94X3cxLm8KIG9iai0kKENPTkZJR19XMV9NQVNURVJfRFMyNDkwKQkJKz0gZHMyNDkwLm8KIG9iai0kKENPTkZJR19XMV9NQVNURVJfRFMyNDgyKQkJKz0gZHMyNDgyLm8KK29iai0kKENPTkZJR19XMV9NQVNURVJfTVhDKQkJKz0gbXhjX3cxLm8KKwogb2JqLSQoQ09ORklHX1cxX01BU1RFUl9EUzFXTSkJCSs9IGRzMXdtLm8KIG9iai0kKENPTkZJR19XMV9NQVNURVJfR1BJTykJCSs9IHcxLWdwaW8ubwogb2JqLSQoQ09ORklHX0hEUV9NQVNURVJfT01BUCkJCSs9IG9tYXBfaGRxLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdzEvbWFzdGVycy9teGNfdzEuYyBiL2RyaXZlcnMvdzEvbWFzdGVycy9teGNfdzEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOWQ3NGQwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy93MS9tYXN0ZXJzL214Y193MS5jCkBAIC0wLDAgKzEsMjExIEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwOCBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDggTHVvdGFvIEZ1LCBrZXJuZWxAcGVuZ3V0cm9uaXguZGUKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKKyAqIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEsIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKworI2luY2x1ZGUgIi4uL3cxLmgiCisjaW5jbHVkZSAiLi4vdzFfaW50LmgiCisjaW5jbHVkZSAiLi4vdzFfbG9nLmgiCisKKy8qIEFjY29yZGluZyB0byB0aGUgbXgyNyBEYXRhc2hlZXQgdGhlIHJlc2V0IHByb2NlZHVyZSBzaG91bGQgdGFrZSB1cCB0byBhYm91dAorICogMTM1MHVzLiBXZSBzZXQgdGhlIHRpbWVvdXQgdG8gNTAwKjEwMHVzID0gNTBtcyBmb3Igc3VyZSAqLworI2RlZmluZSBNWENfVzFfUkVTRVRfVElNRU9VVCA1MDAKKworLyoKKyAqIE1YQyBXMSBSZWdpc3RlciBvZmZzZXRzCisgKi8KKyNkZWZpbmUgTVhDX1cxX0NPTlRST0wgICAgICAgICAgMHgwMAorI2RlZmluZSBNWENfVzFfVElNRV9ESVZJREVSICAgICAweDAyCisjZGVmaW5lIE1YQ19XMV9SRVNFVCAgICAgICAgICAgIDB4MDQKKyNkZWZpbmUgTVhDX1cxX0NPTU1BTkQgICAgICAgICAgMHgwNgorI2RlZmluZSBNWENfVzFfVFhSWCAgICAgICAgICAgICAweDA4CisjZGVmaW5lIE1YQ19XMV9JTlRFUlJVUFQgICAgICAgIDB4MEEKKyNkZWZpbmUgTVhDX1cxX0lOVEVSUlVQVF9FTiAgICAgMHgwQworCitzdHJ1Y3QgbXhjX3cxX2RldmljZSB7CisJdm9pZCBfX2lvbWVtICpyZWdzOworCXVuc2lnbmVkIGludCBjbGtkaXY7CisJc3RydWN0IGNsayAqY2xrOworCXN0cnVjdCB3MV9idXNfbWFzdGVyIGJ1c19tYXN0ZXI7Cit9OworCisvKgorICogdGhpcyBpcyB0aGUgbG93IGxldmVsIHJvdXRpbmUgdG8KKyAqIHJlc2V0IHRoZSBkZXZpY2Ugb24gdGhlIE9uZSBXaXJlIGludGVyZmFjZQorICogb24gdGhlIGhhcmR3YXJlCisgKi8KK3N0YXRpYyB1OCBteGNfdzFfZHMyX3Jlc2V0X2J1cyh2b2lkICpkYXRhKQoreworCXU4IHJlZ192YWw7CisJdW5zaWduZWQgaW50IHRpbWVvdXRfY250ID0gMDsKKwlzdHJ1Y3QgbXhjX3cxX2RldmljZSAqZGV2ID0gZGF0YTsKKworCV9fcmF3X3dyaXRlYigweDgwLCAoZGV2LT5yZWdzICsgTVhDX1cxX0NPTlRST0wpKTsKKworCXdoaWxlICgxKSB7CisJCXJlZ192YWwgPSBfX3Jhd19yZWFkYihkZXYtPnJlZ3MgKyBNWENfVzFfQ09OVFJPTCk7CisKKwkJaWYgKCgocmVnX3ZhbCA+PiA3KSAmIDB4MSkgPT0gMCB8fAorCQkgICAgdGltZW91dF9jbnQgPiBNWENfVzFfUkVTRVRfVElNRU9VVCkKKwkJCWJyZWFrOworCQllbHNlCisJCQl0aW1lb3V0X2NudCsrOworCisJCXVkZWxheSgxMDApOworCX0KKwlyZXR1cm4gKHJlZ192YWwgPj4gNykgJiAweDE7Cit9CisKKy8qCisgKiB0aGlzIGlzIHRoZSBsb3cgbGV2ZWwgcm91dGluZSB0byByZWFkL3dyaXRlIGEgYml0IG9uIHRoZSBPbmUgV2lyZQorICogaW50ZXJmYWNlIG9uIHRoZSBoYXJkd2FyZS4gSXQgZG9lcyB3cml0ZSAwIGlmIHBhcmFtZXRlciBiaXQgaXMgc2V0CisgKiB0byAwLCBvdGhlcndpc2UgYSB3cml0ZSAxL3JlYWQuCisgKi8KK3N0YXRpYyB1OCBteGNfdzFfZHMyX3RvdWNoX2JpdCh2b2lkICpkYXRhLCB1OCBiaXQpCit7CisJc3RydWN0IG14Y193MV9kZXZpY2UgKm1kZXYgPSBkYXRhOworCXZvaWQgX19pb21lbSAqY3RybF9hZGRyID0gbWRldi0+cmVncyArIE1YQ19XMV9DT05UUk9MOworCXVuc2lnbmVkIGludCB0aW1lb3V0X2NudCA9IDQwMDsgLyogVGFrZXMgbWF4LiAxMjB1cyBhY2NvcmRpbmcgdG8KKwkJCQkJICogZGF0YXNoZWV0LgorCQkJCQkgKi8KKworCV9fcmF3X3dyaXRlYigoMSA8PCAoNSAtIGJpdCkpLCBjdHJsX2FkZHIpOworCisJd2hpbGUgKHRpbWVvdXRfY250LS0pIHsKKwkJaWYgKCEoKF9fcmF3X3JlYWRiKGN0cmxfYWRkcikgPj4gKDUgLSBiaXQpKSAmIDB4MSkpCisJCQlicmVhazsKKworCQl1ZGVsYXkoMSk7CisJfQorCisJcmV0dXJuICgoX19yYXdfcmVhZGIoY3RybF9hZGRyKSkgPj4gMykgJiAweDE7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IG14Y193MV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBteGNfdzFfZGV2aWNlICptZGV2OworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCWludCBlcnIgPSAwOworCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlpZiAoIXJlcykKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwltZGV2ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG14Y193MV9kZXZpY2UpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW1kZXYpCisJCXJldHVybiAtRU5PTUVNOworCisJbWRldi0+Y2xrID0gY2xrX2dldCgmcGRldi0+ZGV2LCAib3dpcmVfY2xrIik7CisJaWYgKCFtZGV2LT5jbGspIHsKKwkJZXJyID0gLUVOT0RFVjsKKwkJZ290byBmYWlsZWRfY2xrOworCX0KKworCW1kZXYtPmNsa2RpdiA9IChjbGtfZ2V0X3JhdGUobWRldi0+Y2xrKSAvIDEwMDAwMDApIC0gMTsKKworCXJlcyA9IHJlcXVlc3RfbWVtX3JlZ2lvbihyZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlcyksCisJCQkJIm14Y193MSIpOworCWlmICghcmVzKSB7CisJCWVyciA9IC1FQlVTWTsKKwkJZ290byBmYWlsZWRfcmVxOworCX0KKworCW1kZXYtPnJlZ3MgPSBpb3JlbWFwKHJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzKSk7CisJaWYgKCFtZGV2LT5yZWdzKSB7CisJCXByaW50ayhLRVJOX0VSUiAiQ2Fubm90IG1hcCBmcmFtZSBidWZmZXIgcmVnaXN0ZXJzXG4iKTsKKwkJZ290byBmYWlsZWRfaW9yZW1hcDsKKwl9CisKKwljbGtfZW5hYmxlKG1kZXYtPmNsayk7CisJX19yYXdfd3JpdGViKG1kZXYtPmNsa2RpdiwgbWRldi0+cmVncyArIE1YQ19XMV9USU1FX0RJVklERVIpOworCisJbWRldi0+YnVzX21hc3Rlci5kYXRhID0gbWRldjsKKwltZGV2LT5idXNfbWFzdGVyLnJlc2V0X2J1cyA9IG14Y193MV9kczJfcmVzZXRfYnVzOworCW1kZXYtPmJ1c19tYXN0ZXIudG91Y2hfYml0ID0gbXhjX3cxX2RzMl90b3VjaF9iaXQ7CisKKwllcnIgPSB3MV9hZGRfbWFzdGVyX2RldmljZSgmbWRldi0+YnVzX21hc3Rlcik7CisKKwlpZiAoZXJyKQorCQlnb3RvIGZhaWxlZF9hZGQ7CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBtZGV2KTsKKwlyZXR1cm4gMDsKKworZmFpbGVkX2FkZDoKKwlpb3VubWFwKG1kZXYtPnJlZ3MpOworZmFpbGVkX2lvcmVtYXA6CisJcmVsZWFzZV9tZW1fcmVnaW9uKHJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzKSk7CitmYWlsZWRfcmVxOgorCWNsa19wdXQobWRldi0+Y2xrKTsKK2ZhaWxlZF9jbGs6CisJa2ZyZWUobWRldik7CisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqIGRpc2Fzc29jaWF0ZSB0aGUgdzEgZGV2aWNlIGZyb20gdGhlIGRyaXZlcgorICovCitzdGF0aWMgaW50IG14Y193MV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgbXhjX3cxX2RldmljZSAqbWRldiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKworCXcxX3JlbW92ZV9tYXN0ZXJfZGV2aWNlKCZtZGV2LT5idXNfbWFzdGVyKTsKKworCWlvdW5tYXAobWRldi0+cmVncyk7CisJcmVsZWFzZV9tZW1fcmVnaW9uKHJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzKSk7CisJY2xrX2Rpc2FibGUobWRldi0+Y2xrKTsKKwljbGtfcHV0KG1kZXYtPmNsayk7CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBteGNfdzFfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCSAgIC5uYW1lID0gIm14Y193MSIsCisJfSwKKwkucHJvYmUgPSBteGNfdzFfcHJvYmUsCisJLnJlbW92ZSA9IG14Y193MV9yZW1vdmUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBteGNfdzFfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJm14Y193MV9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBteGNfdzFfZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZteGNfdzFfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQobXhjX3cxX2luaXQpOworbW9kdWxlX2V4aXQobXhjX3cxX2V4aXQpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvcnMgSW5jIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkRyaXZlciBmb3IgT25lLVdpcmUgb24gTVhDIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3cxL3cxLmMgYi9kcml2ZXJzL3cxL3cxLmMKaW5kZXggM2I2MTVkNC4uYWNjN2UzYiAxMDA2NDQKLS0tIGEvZHJpdmVycy93MS93MS5jCisrKyBiL2RyaXZlcnMvdzEvdzEuYwpAQCAtMTk3LDcgKzE5Nyw3IEBACiBzdHJ1Y3QgZGV2aWNlIHcxX21hc3Rlcl9kZXZpY2UgPSB7CiAJLnBhcmVudCA9IE5VTEwsCiAJLmJ1cyA9ICZ3MV9idXNfdHlwZSwKLQkuYnVzX2lkID0gIncxIGJ1cyBtYXN0ZXIiLAorCS5pbml0X25hbWUgPSAidzEgYnVzIG1hc3RlciIsCiAJLmRyaXZlciA9ICZ3MV9tYXN0ZXJfZHJpdmVyLAogCS5yZWxlYXNlID0gJncxX21hc3Rlcl9yZWxlYXNlCiB9OwpAQCAtMjExLDcgKzIxMSw3IEBACiBzdHJ1Y3QgZGV2aWNlIHcxX3NsYXZlX2RldmljZSA9IHsKIAkucGFyZW50ID0gTlVMTCwKIAkuYnVzID0gJncxX2J1c190eXBlLAotCS5idXNfaWQgPSAidzEgYnVzIHNsYXZlIiwKKwkuaW5pdF9uYW1lID0gIncxIGJ1cyBzbGF2ZSIsCiAJLmRyaXZlciA9ICZ3MV9zbGF2ZV9kcml2ZXIsCiAJLnJlbGVhc2UgPSAmdzFfc2xhdmVfcmVsZWFzZQogfTsKQEAgLTU3Myw3ICs1NzMsNyBAQAogCX0KIAogCWRldl9kYmcoZGV2LCAiSG90cGx1ZyBldmVudCBmb3IgJXMgJXMsIGJ1c19pZD0lcy5cbiIsCi0JCQlldmVudF9vd25lciwgbmFtZSwgZGV2LT5idXNfaWQpOworCQkJZXZlbnRfb3duZXIsIG5hbWUsIGRldl9uYW1lKGRldikpOwogCiAJaWYgKGRldi0+ZHJpdmVyICE9ICZ3MV9zbGF2ZV9kcml2ZXIgfHwgIXNsKQogCQlyZXR1cm4gMDsKQEAgLTYwNSw4ICs2MDUsNyBAQAogCXNsLT5kZXYuYnVzID0gJncxX2J1c190eXBlOwogCXNsLT5kZXYucmVsZWFzZSA9ICZ3MV9zbGF2ZV9yZWxlYXNlOwogCi0Jc25wcmludGYoJnNsLT5kZXYuYnVzX2lkWzBdLCBzaXplb2Yoc2wtPmRldi5idXNfaWQpLAotCQkgIiUwMngtJTAxMmxseCIsCisJZGV2X3NldF9uYW1lKCZzbC0+ZGV2LCAiJTAyeC0lMDEybGx4IiwKIAkJICh1bnNpZ25lZCBpbnQpIHNsLT5yZWdfbnVtLmZhbWlseSwKIAkJICh1bnNpZ25lZCBsb25nIGxvbmcpIHNsLT5yZWdfbnVtLmlkKTsKIAlzbnByaW50Zigmc2wtPm5hbWVbMF0sIHNpemVvZihzbC0+bmFtZSksCkBAIC02MTUsMTMgKzYxNCwxMyBAQAogCQkgKHVuc2lnbmVkIGxvbmcgbG9uZykgc2wtPnJlZ19udW0uaWQpOwogCiAJZGV2X2RiZygmc2wtPmRldiwgIiVzOiByZWdpc3RlcmluZyAlcyBhcyAlcC5cbiIsIF9fZnVuY19fLAotCQkmc2wtPmRldi5idXNfaWRbMF0sIHNsKTsKKwkJZGV2X25hbWUoJnNsLT5kZXYpLCBzbCk7CiAKIAllcnIgPSBkZXZpY2VfcmVnaXN0ZXIoJnNsLT5kZXYpOwogCWlmIChlcnIgPCAwKSB7CiAJCWRldl9lcnIoJnNsLT5kZXYsCiAJCQkiRGV2aWNlIHJlZ2lzdHJhdGlvbiBbJXNdIGZhaWxlZC4gZXJyPSVkXG4iLAotCQkJc2wtPmRldi5idXNfaWQsIGVycik7CisJCQlkZXZfbmFtZSgmc2wtPmRldiksIGVycik7CiAJCXJldHVybiBlcnI7CiAJfQogCkBAIC02MzAsNyArNjI5LDcgQEAKIAlpZiAoZXJyIDwgMCkgewogCQlkZXZfZXJyKCZzbC0+ZGV2LAogCQkJInN5c2ZzIGZpbGUgY3JlYXRpb24gZm9yIFslc10gZmFpbGVkLiBlcnI9JWRcbiIsCi0JCQlzbC0+ZGV2LmJ1c19pZCwgZXJyKTsKKwkJCWRldl9uYW1lKCZzbC0+ZGV2KSwgZXJyKTsKIAkJZ290byBvdXRfdW5yZWc7CiAJfQogCkBAIC02MzksNyArNjM4LDcgQEAKIAlpZiAoZXJyIDwgMCkgewogCQlkZXZfZXJyKCZzbC0+ZGV2LAogCQkJInN5c2ZzIGZpbGUgY3JlYXRpb24gZm9yIFslc10gZmFpbGVkLiBlcnI9JWRcbiIsCi0JCQlzbC0+ZGV2LmJ1c19pZCwgZXJyKTsKKwkJCWRldl9uYW1lKCZzbC0+ZGV2KSwgZXJyKTsKIAkJZ290byBvdXRfcmVtMTsKIAl9CiAKQEAgLTY0OCw3ICs2NDcsNyBAQAogCSAgICAoKGVyciA9IHNsLT5mYW1pbHktPmZvcHMtPmFkZF9zbGF2ZShzbCkpIDwgMCkpIHsKIAkJZGV2X2Vycigmc2wtPmRldiwKIAkJCSJzeXNmcyBmaWxlIGNyZWF0aW9uIGZvciBbJXNdIGZhaWxlZC4gZXJyPSVkXG4iLAotCQkJc2wtPmRldi5idXNfaWQsIGVycik7CisJCQlkZXZfbmFtZSgmc2wtPmRldiksIGVycik7CiAJCWdvdG8gb3V0X3JlbTI7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3cxL3cxLmggYi9kcml2ZXJzL3cxL3cxLmgKaW5kZXggOTczMDRiZC4uZDhhOTcwOSAxMDA2NDQKLS0tIGEvZHJpdmVycy93MS93MS5oCisrKyBiL2RyaXZlcnMvdzEvdzEuaApAQCAtMjEwLDYgKzIxMCw3IEBACiBpbnQgdzFfcmVzZXRfYnVzKHN0cnVjdCB3MV9tYXN0ZXIgKik7CiB1OCB3MV9jYWxjX2NyYzgodTggKiwgaW50KTsKIHZvaWQgdzFfd3JpdGVfYmxvY2soc3RydWN0IHcxX21hc3RlciAqLCBjb25zdCB1OCAqLCBpbnQpOwordm9pZCB3MV90b3VjaF9ibG9jayhzdHJ1Y3QgdzFfbWFzdGVyICosIHU4ICosIGludCk7CiB1OCB3MV9yZWFkX2Jsb2NrKHN0cnVjdCB3MV9tYXN0ZXIgKiwgdTggKiwgaW50KTsKIGludCB3MV9yZXNldF9zZWxlY3Rfc2xhdmUoc3RydWN0IHcxX3NsYXZlICpzbCk7CiB2b2lkIHcxX25leHRfcHVsbHVwKHN0cnVjdCB3MV9tYXN0ZXIgKiwgaW50KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdzEvdzFfaW50LmMgYi9kcml2ZXJzL3cxL3cxX2ludC5jCmluZGV4IGEzYTU0NTYuLjRhNDZlZDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdzEvdzFfaW50LmMKKysrIGIvZHJpdmVycy93MS93MV9pbnQuYwpAQCAtNzUsOCArNzUsNyBAQAogCW11dGV4X2luaXQoJmRldi0+bXV0ZXgpOwogCiAJbWVtY3B5KCZkZXYtPmRldiwgZGV2aWNlLCBzaXplb2Yoc3RydWN0IGRldmljZSkpOwotCXNucHJpbnRmKGRldi0+ZGV2LmJ1c19pZCwgc2l6ZW9mKGRldi0+ZGV2LmJ1c19pZCksCi0JCSAgIncxX2J1c19tYXN0ZXIldSIsIGRldi0+aWQpOworCWRldl9zZXRfbmFtZSgmZGV2LT5kZXYsICJ3MV9idXNfbWFzdGVyJXUiLCBkZXYtPmlkKTsKIAlzbnByaW50ZihkZXYtPm5hbWUsIHNpemVvZihkZXYtPm5hbWUpLCAidzFfYnVzX21hc3RlciV1IiwgZGV2LT5pZCk7CiAKIAlkZXYtPmRyaXZlciA9IGRyaXZlcjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdzEvdzFfaW8uYyBiL2RyaXZlcnMvdzEvdzFfaW8uYwppbmRleCA1MTM5YzI1Li40NDJiZDhiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3cxL3cxX2lvLmMKKysrIGIvZHJpdmVycy93MS93MV9pby5jCkBAIC0yMzgsNyArMjM4LDYgQEAKICAqIEBwYXJhbSBkZXYgICAgIHRoZSBtYXN0ZXIgZGV2aWNlCiAgKiBAcGFyYW0gYnVmICAgICBwb2ludGVyIHRvIHRoZSBkYXRhIHRvIHdyaXRlCiAgKiBAcGFyYW0gbGVuICAgICB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHdyaXRlCi0gKiBAcmV0dXJuICAgICAgICB0aGUgYnl0ZSByZWFkCiAgKi8KIHZvaWQgdzFfd3JpdGVfYmxvY2soc3RydWN0IHcxX21hc3RlciAqZGV2LCBjb25zdCB1OCAqYnVmLCBpbnQgbGVuKQogewpAQCAtMjU2LDYgKzI1NSwzMSBAQAogRVhQT1JUX1NZTUJPTF9HUEwodzFfd3JpdGVfYmxvY2spOwogCiAvKioKKyAqIFRvdWNoZXMgYSBzZXJpZXMgb2YgYnl0ZXMuCisgKgorICogQHBhcmFtIGRldiAgICAgdGhlIG1hc3RlciBkZXZpY2UKKyAqIEBwYXJhbSBidWYgICAgIHBvaW50ZXIgdG8gdGhlIGRhdGEgdG8gd3JpdGUKKyAqIEBwYXJhbSBsZW4gICAgIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gd3JpdGUKKyAqLwordm9pZCB3MV90b3VjaF9ibG9jayhzdHJ1Y3QgdzFfbWFzdGVyICpkZXYsIHU4ICpidWYsIGludCBsZW4pCit7CisJaW50IGksIGo7CisJdTggdG1wOworCisJZm9yIChpID0gMDsgaSA8IGxlbjsgKytpKSB7CisJCXRtcCA9IDA7CisJCWZvciAoaiA9IDA7IGogPCA4OyArK2opIHsKKwkJCWlmIChqID09IDcpCisJCQkJdzFfcHJlX3dyaXRlKGRldik7CisJCQl0bXAgfD0gdzFfdG91Y2hfYml0KGRldiwgKGJ1ZltpXSA+PiBqKSAmIDB4MSkgPDwgajsKKwkJfQorCisJCWJ1ZltpXSA9IHRtcDsKKwl9Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh3MV90b3VjaF9ibG9jayk7CisKKy8qKgogICogUmVhZHMgYSBzZXJpZXMgb2YgYnl0ZXMuCiAgKgogICogQHBhcmFtIGRldiAgICAgdGhlIG1hc3RlciBkZXZpY2UKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdzEvdzFfbmV0bGluay5jIGIvZHJpdmVycy93MS93MV9uZXRsaW5rLmMKaW5kZXggNjVjNWViZC4uZmRmNzI4NSAxMDA2NDQKLS0tIGEvZHJpdmVycy93MS93MV9uZXRsaW5rLmMKKysrIGIvZHJpdmVycy93MS93MV9uZXRsaW5rLmMKQEAgLTQ3LDIxICs0Nyw1NiBAQAogCWNuX25ldGxpbmtfc2VuZChtLCAwLCBHRlBfS0VSTkVMKTsKIH0KIAotc3RhdGljIGludCB3MV9wcm9jZXNzX2NvbW1hbmRfbWFzdGVyKHN0cnVjdCB3MV9tYXN0ZXIgKmRldiwgc3RydWN0IGNuX21zZyAqbXNnLAotCQlzdHJ1Y3QgdzFfbmV0bGlua19tc2cgKmhkciwgc3RydWN0IHcxX25ldGxpbmtfY21kICpjbWQpCitzdGF0aWMgdm9pZCB3MV9zZW5kX3NsYXZlKHN0cnVjdCB3MV9tYXN0ZXIgKmRldiwgdTY0IHJuKQogewotCWRldl9kYmcoJmRldi0+ZGV2LCAiJXM6ICVzOiBjbWQ9JTAyeCwgbGVuPSV1LlxuIiwKLQkJX19mdW5jX18sIGRldi0+bmFtZSwgY21kLT5jbWQsIGNtZC0+bGVuKTsKKwlzdHJ1Y3QgY25fbXNnICptc2cgPSBkZXYtPnByaXY7CisJc3RydWN0IHcxX25ldGxpbmtfbXNnICpoZHIgPSAoc3RydWN0IHcxX25ldGxpbmtfbXNnICopKG1zZyArIDEpOworCXN0cnVjdCB3MV9uZXRsaW5rX2NtZCAqY21kID0gKHN0cnVjdCB3MV9uZXRsaW5rX2NtZCAqKShoZHIgKyAxKTsKKwlpbnQgYXZhaWw7CiAKLQlpZiAoY21kLT5jbWQgIT0gVzFfQ01EX1NFQVJDSCAmJiBjbWQtPmNtZCAhPSBXMV9DTURfQUxBUk1fU0VBUkNIKQotCQlyZXR1cm4gLUVJTlZBTDsKKwlhdmFpbCA9IGRldi0+cHJpdl9zaXplIC0gY21kLT5sZW47CiAKLQl3MV9zZWFyY2hfcHJvY2VzcyhkZXYsIChjbWQtPmNtZCA9PSBXMV9DTURfQUxBUk1fU0VBUkNIKT9XMV9BTEFSTV9TRUFSQ0g6VzFfU0VBUkNIKTsKKwlpZiAoYXZhaWwgPiA4KSB7CisJCXU2NCAqZGF0YSA9ICh2b2lkICopKGNtZCArIDEpICsgY21kLT5sZW47CisKKwkJKmRhdGEgPSBybjsKKwkJY21kLT5sZW4gKz0gODsKKwkJaGRyLT5sZW4gKz0gODsKKwkJbXNnLT5sZW4gKz0gODsKKwkJcmV0dXJuOworCX0KKworCW1zZy0+YWNrKys7CisJY25fbmV0bGlua19zZW5kKG1zZywgMCwgR0ZQX0tFUk5FTCk7CisKKwltc2ctPmxlbiA9IHNpemVvZihzdHJ1Y3QgdzFfbmV0bGlua19tc2cpICsgc2l6ZW9mKHN0cnVjdCB3MV9uZXRsaW5rX2NtZCk7CisJaGRyLT5sZW4gPSBzaXplb2Yoc3RydWN0IHcxX25ldGxpbmtfY21kKTsKKwljbWQtPmxlbiA9IDA7Cit9CisKK3N0YXRpYyBpbnQgdzFfcHJvY2Vzc19zZWFyY2hfY29tbWFuZChzdHJ1Y3QgdzFfbWFzdGVyICpkZXYsIHN0cnVjdCBjbl9tc2cgKm1zZywKKwkJdW5zaWduZWQgaW50IGF2YWlsKQoreworCXN0cnVjdCB3MV9uZXRsaW5rX21zZyAqaGRyID0gKHN0cnVjdCB3MV9uZXRsaW5rX21zZyAqKShtc2cgKyAxKTsKKwlzdHJ1Y3QgdzFfbmV0bGlua19jbWQgKmNtZCA9IChzdHJ1Y3QgdzFfbmV0bGlua19jbWQgKikoaGRyICsgMSk7CisJaW50IHNlYXJjaF90eXBlID0gKGNtZC0+Y21kID09IFcxX0NNRF9BTEFSTV9TRUFSQ0gpP1cxX0FMQVJNX1NFQVJDSDpXMV9TRUFSQ0g7CisKKwlkZXYtPnByaXYgPSBtc2c7CisJZGV2LT5wcml2X3NpemUgPSBhdmFpbDsKKworCXcxX3NlYXJjaF9kZXZpY2VzKGRldiwgc2VhcmNoX3R5cGUsIHcxX3NlbmRfc2xhdmUpOworCisJbXNnLT5hY2sgPSAwOworCWNuX25ldGxpbmtfc2VuZChtc2csIDAsIEdGUF9LRVJORUwpOworCisJZGV2LT5wcml2ID0gTlVMTDsKKwlkZXYtPnByaXZfc2l6ZSA9IDA7CisKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCB3MV9zZW5kX3JlYWRfcmVwbHkoc3RydWN0IHcxX3NsYXZlICpzbCwgc3RydWN0IGNuX21zZyAqbXNnLAotCQlzdHJ1Y3QgdzFfbmV0bGlua19tc2cgKmhkciwgc3RydWN0IHcxX25ldGxpbmtfY21kICpjbWQpCitzdGF0aWMgaW50IHcxX3NlbmRfcmVhZF9yZXBseShzdHJ1Y3QgY25fbXNnICptc2csIHN0cnVjdCB3MV9uZXRsaW5rX21zZyAqaGRyLAorCQlzdHJ1Y3QgdzFfbmV0bGlua19jbWQgKmNtZCkKIHsKIAl2b2lkICpkYXRhOwogCXN0cnVjdCB3MV9uZXRsaW5rX21zZyAqaDsKQEAgLTg1LDcgKzEyMCw4IEBACiAJbWVtY3B5KGMsIGNtZCwgc2l6ZW9mKHN0cnVjdCB3MV9uZXRsaW5rX2NtZCkpOwogCiAJY20tPmFjayA9IG1zZy0+c2VxKzE7Ci0JY20tPmxlbiA9IHNpemVvZihzdHJ1Y3QgdzFfbmV0bGlua19tc2cpICsgc2l6ZW9mKHN0cnVjdCB3MV9uZXRsaW5rX2NtZCkgKyBjbWQtPmxlbjsKKwljbS0+bGVuID0gc2l6ZW9mKHN0cnVjdCB3MV9uZXRsaW5rX21zZykgKworCQlzaXplb2Yoc3RydWN0IHcxX25ldGxpbmtfY21kKSArIGNtZC0+bGVuOwogCiAJaC0+bGVuID0gc2l6ZW9mKHN0cnVjdCB3MV9uZXRsaW5rX2NtZCkgKyBjbWQtPmxlbjsKIApAQCAtOTgsMzYgKzEzNCwxNzggQEAKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgaW50IHcxX3Byb2Nlc3NfY29tbWFuZF9zbGF2ZShzdHJ1Y3QgdzFfc2xhdmUgKnNsLCBzdHJ1Y3QgY25fbXNnICptc2csCitzdGF0aWMgaW50IHcxX3Byb2Nlc3NfY29tbWFuZF9pbyhzdHJ1Y3QgdzFfbWFzdGVyICpkZXYsIHN0cnVjdCBjbl9tc2cgKm1zZywKIAkJc3RydWN0IHcxX25ldGxpbmtfbXNnICpoZHIsIHN0cnVjdCB3MV9uZXRsaW5rX2NtZCAqY21kKQogewogCWludCBlcnIgPSAwOwogCi0JZGV2X2RiZygmc2wtPm1hc3Rlci0+ZGV2LCAiJXM6ICUwMnguJTAxMmxseC4lMDJ4OiBjbWQ9JTAyeCwgbGVuPSV1LlxuIiwKLQkJX19mdW5jX18sIHNsLT5yZWdfbnVtLmZhbWlseSwgKHVuc2lnbmVkIGxvbmcgbG9uZylzbC0+cmVnX251bS5pZCwgc2wtPnJlZ19udW0uY3JjLAotCQljbWQtPmNtZCwgY21kLT5sZW4pOwotCiAJc3dpdGNoIChjbWQtPmNtZCkgewotCQljYXNlIFcxX0NNRF9SRUFEOgotCQkJdzFfcmVhZF9ibG9jayhzbC0+bWFzdGVyLCBjbWQtPmRhdGEsIGNtZC0+bGVuKTsKLQkJCXcxX3NlbmRfcmVhZF9yZXBseShzbCwgbXNnLCBoZHIsIGNtZCk7Ci0JCQlicmVhazsKLQkJY2FzZSBXMV9DTURfV1JJVEU6Ci0JCQl3MV93cml0ZV9ibG9jayhzbC0+bWFzdGVyLCBjbWQtPmRhdGEsIGNtZC0+bGVuKTsKLQkJCWJyZWFrOwotCQljYXNlIFcxX0NNRF9TRUFSQ0g6Ci0JCWNhc2UgVzFfQ01EX0FMQVJNX1NFQVJDSDoKLQkJCXcxX3NlYXJjaF9wcm9jZXNzKHNsLT5tYXN0ZXIsCi0JCQkJCShjbWQtPmNtZCA9PSBXMV9DTURfQUxBUk1fU0VBUkNIKT9XMV9BTEFSTV9TRUFSQ0g6VzFfU0VBUkNIKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJZXJyID0gLTE7Ci0JCQlicmVhazsKKwljYXNlIFcxX0NNRF9UT1VDSDoKKwkJdzFfdG91Y2hfYmxvY2soZGV2LCBjbWQtPmRhdGEsIGNtZC0+bGVuKTsKKwkJdzFfc2VuZF9yZWFkX3JlcGx5KG1zZywgaGRyLCBjbWQpOworCQlicmVhazsKKwljYXNlIFcxX0NNRF9SRUFEOgorCQl3MV9yZWFkX2Jsb2NrKGRldiwgY21kLT5kYXRhLCBjbWQtPmxlbik7CisJCXcxX3NlbmRfcmVhZF9yZXBseShtc2csIGhkciwgY21kKTsKKwkJYnJlYWs7CisJY2FzZSBXMV9DTURfV1JJVEU6CisJCXcxX3dyaXRlX2Jsb2NrKGRldiwgY21kLT5kYXRhLCBjbWQtPmxlbik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWVyciA9IC1FSU5WQUw7CisJCWJyZWFrOwogCX0KIAogCXJldHVybiBlcnI7CiB9CiAKK3N0YXRpYyBpbnQgdzFfcHJvY2Vzc19jb21tYW5kX21hc3RlcihzdHJ1Y3QgdzFfbWFzdGVyICpkZXYsIHN0cnVjdCBjbl9tc2cgKnJlcV9tc2csCisJCXN0cnVjdCB3MV9uZXRsaW5rX21zZyAqcmVxX2hkciwgc3RydWN0IHcxX25ldGxpbmtfY21kICpyZXFfY21kKQoreworCWludCBlcnIgPSAtRUlOVkFMOworCXN0cnVjdCBjbl9tc2cgKm1zZzsKKwlzdHJ1Y3QgdzFfbmV0bGlua19tc2cgKmhkcjsKKwlzdHJ1Y3QgdzFfbmV0bGlua19jbWQgKmNtZDsKKworCW1zZyA9IGt6YWxsb2MoUEFHRV9TSVpFLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW1zZykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwltc2ctPmlkID0gcmVxX21zZy0+aWQ7CisJbXNnLT5zZXEgPSByZXFfbXNnLT5zZXE7CisJbXNnLT5hY2sgPSAwOworCW1zZy0+bGVuID0gc2l6ZW9mKHN0cnVjdCB3MV9uZXRsaW5rX21zZykgKyBzaXplb2Yoc3RydWN0IHcxX25ldGxpbmtfY21kKTsKKworCWhkciA9IChzdHJ1Y3QgdzFfbmV0bGlua19tc2cgKikobXNnICsgMSk7CisJY21kID0gKHN0cnVjdCB3MV9uZXRsaW5rX2NtZCAqKShoZHIgKyAxKTsKKworCWhkci0+dHlwZSA9IFcxX01BU1RFUl9DTUQ7CisJaGRyLT5pZCA9IHJlcV9oZHItPmlkOworCWhkci0+bGVuID0gc2l6ZW9mKHN0cnVjdCB3MV9uZXRsaW5rX2NtZCk7CisKKwljbWQtPmNtZCA9IHJlcV9jbWQtPmNtZDsKKwljbWQtPmxlbiA9IDA7CisKKwlzd2l0Y2ggKGNtZC0+Y21kKSB7CisJY2FzZSBXMV9DTURfU0VBUkNIOgorCWNhc2UgVzFfQ01EX0FMQVJNX1NFQVJDSDoKKwkJZXJyID0gdzFfcHJvY2Vzc19zZWFyY2hfY29tbWFuZChkZXYsIG1zZywKKwkJCQlQQUdFX1NJWkUgLSBtc2ctPmxlbiAtIHNpemVvZihzdHJ1Y3QgY25fbXNnKSk7CisJCWJyZWFrOworCWNhc2UgVzFfQ01EX1JFQUQ6CisJY2FzZSBXMV9DTURfV1JJVEU6CisJY2FzZSBXMV9DTURfVE9VQ0g6CisJCWVyciA9IHcxX3Byb2Nlc3NfY29tbWFuZF9pbyhkZXYsIHJlcV9tc2csIHJlcV9oZHIsIHJlcV9jbWQpOworCQlicmVhazsKKwljYXNlIFcxX0NNRF9SRVNFVDoKKwkJZXJyID0gdzFfcmVzZXRfYnVzKGRldik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWVyciA9IC1FSU5WQUw7CisJCWJyZWFrOworCX0KKworCWtmcmVlKG1zZyk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCB3MV9wcm9jZXNzX2NvbW1hbmRfc2xhdmUoc3RydWN0IHcxX3NsYXZlICpzbCwgc3RydWN0IGNuX21zZyAqbXNnLAorCQlzdHJ1Y3QgdzFfbmV0bGlua19tc2cgKmhkciwgc3RydWN0IHcxX25ldGxpbmtfY21kICpjbWQpCit7CisJZGV2X2RiZygmc2wtPm1hc3Rlci0+ZGV2LCAiJXM6ICUwMnguJTAxMmxseC4lMDJ4OiBjbWQ9JTAyeCwgbGVuPSV1LlxuIiwKKwkJX19mdW5jX18sIHNsLT5yZWdfbnVtLmZhbWlseSwgKHVuc2lnbmVkIGxvbmcgbG9uZylzbC0+cmVnX251bS5pZCwKKwkJc2wtPnJlZ19udW0uY3JjLCBjbWQtPmNtZCwgY21kLT5sZW4pOworCisJcmV0dXJuIHcxX3Byb2Nlc3NfY29tbWFuZF9pbyhzbC0+bWFzdGVyLCBtc2csIGhkciwgY21kKTsKK30KKworc3RhdGljIGludCB3MV9wcm9jZXNzX2NvbW1hbmRfcm9vdChzdHJ1Y3QgY25fbXNnICptc2csIHN0cnVjdCB3MV9uZXRsaW5rX21zZyAqbWNtZCkKK3sKKwlzdHJ1Y3QgdzFfbWFzdGVyICptOworCXN0cnVjdCBjbl9tc2cgKmNuOworCXN0cnVjdCB3MV9uZXRsaW5rX21zZyAqdzsKKwl1MzIgKmlkOworCisJaWYgKG1jbWQtPnR5cGUgIT0gVzFfTElTVF9NQVNURVJTKSB7CisJCXByaW50ayhLRVJOX05PVElDRSAiJXM6IG1zZzogJXguJXgsIHdyb25nIHR5cGU6ICV1LCBsZW46ICV1LlxuIiwKKwkJCV9fZnVuY19fLCBtc2ctPmlkLmlkeCwgbXNnLT5pZC52YWwsIG1jbWQtPnR5cGUsIG1jbWQtPmxlbik7CisJCXJldHVybiAtRVBST1RPOworCX0KKworCWNuID0ga21hbGxvYyhQQUdFX1NJWkUsIEdGUF9LRVJORUwpOworCWlmICghY24pCisJCXJldHVybiAtRU5PTUVNOworCisJY24tPmlkLmlkeCA9IENOX1cxX0lEWDsKKwljbi0+aWQudmFsID0gQ05fVzFfVkFMOworCisJY24tPnNlcSA9IG1zZy0+c2VxOworCWNuLT5hY2sgPSAxOworCWNuLT5sZW4gPSBzaXplb2Yoc3RydWN0IHcxX25ldGxpbmtfbXNnKTsKKwl3ID0gKHN0cnVjdCB3MV9uZXRsaW5rX21zZyAqKShjbiArIDEpOworCisJdy0+dHlwZSA9IFcxX0xJU1RfTUFTVEVSUzsKKwl3LT5zdGF0dXMgPSAwOworCXctPmxlbiA9IDA7CisJaWQgPSAodTMyICopKHcgKyAxKTsKKworCW11dGV4X2xvY2soJncxX21sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KG0sICZ3MV9tYXN0ZXJzLCB3MV9tYXN0ZXJfZW50cnkpIHsKKwkJaWYgKGNuLT5sZW4gKyBzaXplb2YoKmlkKSA+IFBBR0VfU0laRSAtIHNpemVvZihzdHJ1Y3QgY25fbXNnKSkgeworCQkJY25fbmV0bGlua19zZW5kKGNuLCAwLCBHRlBfS0VSTkVMKTsKKwkJCWNuLT5hY2srKzsKKwkJCWNuLT5sZW4gPSBzaXplb2Yoc3RydWN0IHcxX25ldGxpbmtfbXNnKTsKKwkJCXctPmxlbiA9IDA7CisJCQlpZCA9ICh1MzIgKikodyArIDEpOworCQl9CisKKwkJKmlkID0gbS0+aWQ7CisJCXctPmxlbiArPSBzaXplb2YoKmlkKTsKKwkJY24tPmxlbiArPSBzaXplb2YoKmlkKTsKKwkJaWQrKzsKKwl9CisJY24tPmFjayA9IDA7CisJY25fbmV0bGlua19zZW5kKGNuLCAwLCBHRlBfS0VSTkVMKTsKKwltdXRleF91bmxvY2soJncxX21sb2NrKTsKKworCWtmcmVlKGNuKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3MV9uZXRsaW5rX3NlbmRfZXJyb3Ioc3RydWN0IGNuX21zZyAqcmNtc2csIHN0cnVjdCB3MV9uZXRsaW5rX21zZyAqcm1zZywKKwkJc3RydWN0IHcxX25ldGxpbmtfY21kICpyY21kLCBpbnQgZXJyb3IpCit7CisJc3RydWN0IGNuX21zZyAqY21zZzsKKwlzdHJ1Y3QgdzFfbmV0bGlua19tc2cgKm1zZzsKKwlzdHJ1Y3QgdzFfbmV0bGlua19jbWQgKmNtZDsKKworCWNtc2cgPSBremFsbG9jKHNpemVvZigqbXNnKSArIHNpemVvZigqY21kKSArIHNpemVvZigqY21zZyksIEdGUF9LRVJORUwpOworCWlmICghY21zZykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwltc2cgPSAoc3RydWN0IHcxX25ldGxpbmtfbXNnICopKGNtc2cgKyAxKTsKKwljbWQgPSAoc3RydWN0IHcxX25ldGxpbmtfY21kICopKG1zZyArIDEpOworCisJbWVtY3B5KGNtc2csIHJjbXNnLCBzaXplb2YoKmNtc2cpKTsKKwljbXNnLT5sZW4gPSBzaXplb2YoKm1zZyk7CisKKwltZW1jcHkobXNnLCBybXNnLCBzaXplb2YoKm1zZykpOworCW1zZy0+bGVuID0gMDsKKwltc2ctPnN0YXR1cyA9IChzaG9ydCktZXJyb3I7CisKKwlpZiAocmNtZCkgeworCQltZW1jcHkoY21kLCByY21kLCBzaXplb2YoKmNtZCkpOworCQljbWQtPmxlbiA9IDA7CisJCW1zZy0+bGVuICs9IHNpemVvZigqY21kKTsKKwkJY21zZy0+bGVuICs9IHNpemVvZigqY21kKTsKKwl9CisKKwllcnJvciA9IGNuX25ldGxpbmtfc2VuZChjbXNnLCAwLCBHRlBfS0VSTkVMKTsKKwlrZnJlZShjbXNnKTsKKworCXJldHVybiBlcnJvcjsKK30KKwogc3RhdGljIHZvaWQgdzFfY25fY2FsbGJhY2sodm9pZCAqZGF0YSkKIHsKIAlzdHJ1Y3QgY25fbXNnICptc2cgPSBkYXRhOwpAQCAtMTQ0LDYgKzMyMiw3IEBACiAKIAkJZGV2ID0gTlVMTDsKIAkJc2wgPSBOVUxMOworCQljbWQgPSBOVUxMOwogCiAJCW1lbWNweSgmaWQsIG0tPmlkLmlkLCBzaXplb2YoaWQpKTsKICNpZiAwCkBAIC0xNTUsMTUgKzMzNCwxNSBAQAogCQkJYnJlYWs7CiAJCX0KIAotCQlpZiAoIW1sZW4pCi0JCQlnb3RvIG91dF9jb250OwotCiAJCWlmIChtLT50eXBlID09IFcxX01BU1RFUl9DTUQpIHsKIAkJCWRldiA9IHcxX3NlYXJjaF9tYXN0ZXJfaWQobS0+aWQubXN0LmlkKTsKIAkJfSBlbHNlIGlmIChtLT50eXBlID09IFcxX1NMQVZFX0NNRCkgewogCQkJc2wgPSB3MV9zZWFyY2hfc2xhdmUoJmlkKTsKIAkJCWlmIChzbCkKIAkJCQlkZXYgPSBzbC0+bWFzdGVyOworCQl9IGVsc2UgeworCQkJZXJyID0gdzFfcHJvY2Vzc19jb21tYW5kX3Jvb3QobXNnLCBtKTsKKwkJCWdvdG8gb3V0X2NvbnQ7CiAJCX0KIAogCQlpZiAoIWRldikgewpAQCAtMTcxLDYgKzM1MCwxMCBAQAogCQkJZ290byBvdXRfY29udDsKIAkJfQogCisJCWVyciA9IDA7CisJCWlmICghbWxlbikKKwkJCWdvdG8gb3V0X2NvbnQ7CisKIAkJbXV0ZXhfbG9jaygmZGV2LT5tdXRleCk7CiAKIAkJaWYgKHNsICYmIHcxX3Jlc2V0X3NlbGVjdF9zbGF2ZShzbCkpIHsKQEAgLTE4Nyw5ICszNzAsMTIgQEAKIAkJCX0KIAogCQkJaWYgKHNsKQotCQkJCXcxX3Byb2Nlc3NfY29tbWFuZF9zbGF2ZShzbCwgbXNnLCBtLCBjbWQpOworCQkJCWVyciA9IHcxX3Byb2Nlc3NfY29tbWFuZF9zbGF2ZShzbCwgbXNnLCBtLCBjbWQpOwogCQkJZWxzZQotCQkJCXcxX3Byb2Nlc3NfY29tbWFuZF9tYXN0ZXIoZGV2LCBtc2csIG0sIGNtZCk7CisJCQkJZXJyID0gdzFfcHJvY2Vzc19jb21tYW5kX21hc3RlcihkZXYsIG1zZywgbSwgY21kKTsKKworCQkJdzFfbmV0bGlua19zZW5kX2Vycm9yKG1zZywgbSwgY21kLCBlcnIpOworCQkJZXJyID0gMDsKIAogCQkJY21kX2RhdGEgKz0gY21kLT5sZW4gKyBzaXplb2Yoc3RydWN0IHcxX25ldGxpbmtfY21kKTsKIAkJCW1sZW4gLT0gY21kLT5sZW4gKyBzaXplb2Yoc3RydWN0IHcxX25ldGxpbmtfY21kKTsKQEAgLTIwMCw2ICszODYsOCBAQAogCQkJYXRvbWljX2RlYygmc2wtPnJlZmNudCk7CiAJCW11dGV4X3VubG9jaygmZGV2LT5tdXRleCk7CiBvdXRfY29udDoKKwkJaWYgKCFjbWQgfHwgZXJyKQorCQkJdzFfbmV0bGlua19zZW5kX2Vycm9yKG1zZywgbSwgY21kLCBlcnIpOwogCQltc2ctPmxlbiAtPSBzaXplb2Yoc3RydWN0IHcxX25ldGxpbmtfbXNnKSArIG0tPmxlbjsKIAkJbSA9IChzdHJ1Y3QgdzFfbmV0bGlua19tc2cgKikoKCh1OCAqKW0pICsgc2l6ZW9mKHN0cnVjdCB3MV9uZXRsaW5rX21zZykgKyBtLT5sZW4pOwogCkBAIC0yMDksMTEgKzM5Nyw2IEBACiAJCWlmIChlcnIgPT0gLUVOT0RFVikKIAkJCWVyciA9IDA7CiAJfQotI2lmIDAKLQlpZiAoZXJyKSB7Ci0JCXByaW50aygiJXM6IG1hbGZvcm1lZCBtZXNzYWdlLiBEcm9wcGluZy5cbiIsIF9fZnVuY19fKTsKLQl9Ci0jZW5kaWYKIH0KIAogaW50IHcxX2luaXRfbmV0bGluayh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy93MS93MV9uZXRsaW5rLmggYi9kcml2ZXJzL3cxL3cxX25ldGxpbmsuaAppbmRleCA1NjEyMmI5Li4yN2U5NTBmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3cxL3cxX25ldGxpbmsuaAorKysgYi9kcml2ZXJzL3cxL3cxX25ldGxpbmsuaApAQCAtMzQsMTIgKzM0LDEzIEBACiAJVzFfTUFTVEVSX1JFTU9WRSwKIAlXMV9NQVNURVJfQ01ELAogCVcxX1NMQVZFX0NNRCwKKwlXMV9MSVNUX01BU1RFUlMsCiB9OwogCiBzdHJ1Y3QgdzFfbmV0bGlua19tc2cKIHsKIAlfX3U4CQkJCXR5cGU7Ci0JX191OAkJCQlyZXNlcnZlZDsKKwlfX3U4CQkJCXN0YXR1czsKIAlfX3UxNgkJCQlsZW47CiAJdW5pb24gewogCQlfX3U4CQkJaWRbOF07CkBAIC01MSwxMCArNTIsMTUgQEAKIAlfX3U4CQkJCWRhdGFbMF07CiB9OwogCi0jZGVmaW5lIFcxX0NNRF9SRUFECQkweDAKLSNkZWZpbmUgVzFfQ01EX1dSSVRFCQkweDEKLSNkZWZpbmUgVzFfQ01EX1NFQVJDSAkJMHgyCi0jZGVmaW5lIFcxX0NNRF9BTEFSTV9TRUFSQ0gJMHgzCitlbnVtIHcxX2NvbW1hbmRzIHsKKwlXMV9DTURfUkVBRCA9IDAsCisJVzFfQ01EX1dSSVRFLAorCVcxX0NNRF9TRUFSQ0gsCisJVzFfQ01EX0FMQVJNX1NFQVJDSCwKKwlXMV9DTURfVE9VQ0gsCisJVzFfQ01EX1JFU0VULAorCVcxX0NNRF9NQVgsCit9OwogCiBzdHJ1Y3QgdzFfbmV0bGlua19jbWQKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMveGVuL0tjb25maWcgYi9kcml2ZXJzL3hlbi9LY29uZmlnCmluZGV4IDRiNzVhMTYuLjUyNjE4N2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMveGVuL0tjb25maWcKKysrIGIvZHJpdmVycy94ZW4vS2NvbmZpZwpAQCAtMTcsMyArMTcsMjcgQEAKIAkgIGlzIG5vdCBhY2NpZGVudGFsbHkgdmlzaWJsZSB0byBvdGhlciBkb21haW5zLiAgSXMgaXQgbW9yZQogCSAgc2VjdXJlLCBidXQgc2xpZ2h0bHkgbGVzcyBlZmZpY2llbnQuCiAJICBJZiBpbiBkb3VidCwgc2F5IHllcy4KKworY29uZmlnIFhFTkZTCisJdHJpc3RhdGUgIlhlbiBmaWxlc3lzdGVtIgorCWRlcGVuZHMgb24gWEVOCisJZGVmYXVsdCB5CisJaGVscAorCSAgVGhlIHhlbiBmaWxlc3lzdGVtIHByb3ZpZGVzIGEgd2F5IGZvciBkb21haW5zIHRvIHNoYXJlCisJICBpbmZvcm1hdGlvbiB3aXRoIGVhY2ggb3RoZXIgYW5kIHdpdGggdGhlIGh5cGVydmlzb3IuCisJICBGb3IgZXhhbXBsZSwgYnkgcmVhZGluZyBhbmQgd3JpdGluZyB0aGUgInhlbmJ1cyIgZmlsZSwgZ3Vlc3RzCisJICBtYXkgcGFzcyBhcmJpdHJhcnkgaW5mb3JtYXRpb24gdG8gdGhlIGluaXRpYWwgZG9tYWluLgorCSAgSWYgaW4gZG91YnQsIHNheSB5ZXMuCisKK2NvbmZpZyBYRU5fQ09NUEFUX1hFTkZTCisgICAgICAgYm9vbCAiQ3JlYXRlIGNvbXBhdGliaWxpdHkgbW91bnQgcG9pbnQgL3Byb2MveGVuIgorICAgICAgIGRlcGVuZHMgb24gWEVORlMKKyAgICAgICBkZWZhdWx0IHkKKyAgICAgICBoZWxwCisgICAgICAgICBUaGUgb2xkIHhlbnN0b3JlIHVzZXJzcGFjZSB0b29scyBleHBlY3QgdG8gZmluZCAieGVuYnVzIgorICAgICAgICAgdW5kZXIgL3Byb2MveGVuLCBidXQgInhlbmJ1cyIgaXMgbm93IGZvdW5kIGF0IHRoZSByb290IG9mIHRoZQorICAgICAgICAgeGVuZnMgZmlsZXN5c3RlbS4gIFNlbGVjdGluZyB0aGlzIGNhdXNlcyB0aGUga2VybmVsIHRvIGNyZWF0ZQorICAgICAgICAgdGhlIGNvbXBhdGliaWx0eSBtb3VudCBwb2ludCAvcHJvYy94ZW4gaWYgaXQgaXMgcnVubmluZyBvbgorICAgICAgICAgYSB4ZW4gcGxhdGZvcm0uCisgICAgICAgICBJZiBpbiBkb3VidCwgc2F5IHllcy4KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy94ZW4vTWFrZWZpbGUgYi9kcml2ZXJzL3hlbi9NYWtlZmlsZQppbmRleCBkMmE4ZmRmLi5mZjhhY2NjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3hlbi9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3hlbi9NYWtlZmlsZQpAQCAtMSw1ICsxLDcgQEAKIG9iai15CSs9IGdyYW50LXRhYmxlLm8gZmVhdHVyZXMubyBldmVudHMubyBtYW5hZ2Uubwogb2JqLXkJKz0geGVuYnVzLworCiBvYmotJChDT05GSUdfSE9UUExVR19DUFUpCSs9IGNwdV9ob3RwbHVnLm8KIG9iai0kKENPTkZJR19YRU5fWEVOQ09NTSkJKz0geGVuY29tbS5vCiBvYmotJChDT05GSUdfWEVOX0JBTExPT04pCSs9IGJhbGxvb24ubworb2JqLSQoQ09ORklHX1hFTkZTKQkJKz0geGVuZnMvClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy94ZW4veGVuYnVzL3hlbmJ1c19jbGllbnQuYyBiL2RyaXZlcnMveGVuL3hlbmJ1cy94ZW5idXNfY2xpZW50LmMKaW5kZXggOTY3OGIzZS4uOTJhMWVmOCAxMDA2NDQKLS0tIGEvZHJpdmVycy94ZW4veGVuYnVzL3hlbmJ1c19jbGllbnQuYworKysgYi9kcml2ZXJzL3hlbi94ZW5idXMveGVuYnVzX2NsaWVudC5jCkBAIC0xMzYsNyArMTM2LDYgQEAKIC8qKgogICogeGVuYnVzX3N3aXRjaF9zdGF0ZQogICogQGRldjogeGVuYnVzIGRldmljZQotICogQHhidDogdHJhbnNhY3Rpb24gaGFuZGxlCiAgKiBAc3RhdGU6IG5ldyBzdGF0ZQogICoKICAqIEFkdmVydGlzZSBpbiB0aGUgc3RvcmUgYSBjaGFuZ2Ugb2YgdGhlIGdpdmVuIGRyaXZlciB0byB0aGUgZ2l2ZW4gbmV3X3N0YXRlLgpAQCAtMjY3LDcgKzI2Niw3IEBACiAgKiBAZm10OiBlcnJvciBtZXNzYWdlIGZvcm1hdAogICoKICAqIEVxdWl2YWxlbnQgdG8geGVuYnVzX2Rldl9lcnJvcihkZXYsIGVyciwgZm10LCBhcmdzKSwgZm9sbG93ZWQgYnkKLSAqIHhlbmJ1c19zd2l0Y2hfc3RhdGUoZGV2LCBOVUxMLCBYZW5idXNTdGF0ZUNsb3NpbmcpIHRvIHNjaGVkdWxlIGFuIG9yZGVybHkKKyAqIHhlbmJ1c19zd2l0Y2hfc3RhdGUoZGV2LCBYZW5idXNTdGF0ZUNsb3NpbmcpIHRvIHNjaGVkdWxlIGFuIG9yZGVybHkKICAqIGNsb3NlZG93biBvZiB0aGlzIGRyaXZlciBhbmQgaXRzIHBlZXIuCiAgKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy94ZW4veGVuYnVzL3hlbmJ1c19wcm9iZS5jIGIvZHJpdmVycy94ZW4veGVuYnVzL3hlbmJ1c19wcm9iZS5jCmluZGV4IDdmMjRhOTguLjc3M2QxY2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMveGVuL3hlbmJ1cy94ZW5idXNfcHJvYmUuYworKysgYi9kcml2ZXJzL3hlbi94ZW5idXMveGVuYnVzX3Byb2JlLmMKQEAgLTQwLDYgKzQwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KICNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KQEAgLTU1LDcgKzU2LDEwIEBACiAjaW5jbHVkZSAieGVuYnVzX2NvbW1zLmgiCiAjaW5jbHVkZSAieGVuYnVzX3Byb2JlLmgiCiAKKwogaW50IHhlbl9zdG9yZV9ldnRjaG47CitFWFBPUlRfU1lNQk9MKHhlbl9zdG9yZV9ldnRjaG4pOworCiBzdHJ1Y3QgeGVuc3RvcmVfZG9tYWluX2ludGVyZmFjZSAqeGVuX3N0b3JlX2ludGVyZmFjZTsKIHN0YXRpYyB1bnNpZ25lZCBsb25nIHhlbl9zdG9yZV9tZm47CiAKQEAgLTk5LDE1ICsxMDMsMTUgQEAKIH0KIAogLyogZGV2aWNlLzx0eXBlPi88aWQ+ID0+IDx0eXBlPi08aWQ+ICovCi1zdGF0aWMgaW50IGZyb250ZW5kX2J1c19pZChjaGFyIGJ1c19pZFtCVVNfSURfU0laRV0sIGNvbnN0IGNoYXIgKm5vZGVuYW1lKQorc3RhdGljIGludCBmcm9udGVuZF9idXNfaWQoY2hhciBidXNfaWRbWEVOX0JVU19JRF9TSVpFXSwgY29uc3QgY2hhciAqbm9kZW5hbWUpCiB7CiAJbm9kZW5hbWUgPSBzdHJjaHIobm9kZW5hbWUsICcvJyk7Ci0JaWYgKCFub2RlbmFtZSB8fCBzdHJsZW4obm9kZW5hbWUgKyAxKSA+PSBCVVNfSURfU0laRSkgeworCWlmICghbm9kZW5hbWUgfHwgc3RybGVuKG5vZGVuYW1lICsgMSkgPj0gWEVOX0JVU19JRF9TSVpFKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIlhFTkJVUzogYmFkIGZyb250ZW5kICVzXG4iLCBub2RlbmFtZSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCXN0cmxjcHkoYnVzX2lkLCBub2RlbmFtZSArIDEsIEJVU19JRF9TSVpFKTsKKwlzdHJsY3B5KGJ1c19pZCwgbm9kZW5hbWUgKyAxLCBYRU5fQlVTX0lEX1NJWkUpOwogCWlmICghc3RyY2hyKGJ1c19pZCwgJy8nKSkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICJYRU5CVVM6IGJ1c19pZCAlcyBubyBzbGFzaFxuIiwgYnVzX2lkKTsKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xNjYsNiArMTcwLDkgQEAKIAlyZXR1cm4gcmVhZF9vdGhlcmVuZF9kZXRhaWxzKHhlbmRldiwgImJhY2tlbmQtaWQiLCAiYmFja2VuZCIpOwogfQogCitzdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgeGVuYnVzX2Rldl9hdHRyc1tdID0geworCV9fQVRUUl9OVUxMCit9OwogCiAvKiBCdXMgdHlwZSBmb3IgZnJvbnRlbmQgZHJpdmVycy4gKi8KIHN0YXRpYyBzdHJ1Y3QgeGVuX2J1c190eXBlIHhlbmJ1c19mcm9udGVuZCA9IHsKQEAgLTE3NCwxMiArMTgxLDEzIEBACiAJLmdldF9idXNfaWQgPSBmcm9udGVuZF9idXNfaWQsCiAJLnByb2JlID0geGVuYnVzX3Byb2JlX2Zyb250ZW5kLAogCS5idXMgPSB7Ci0JCS5uYW1lICAgICA9ICJ4ZW4iLAotCQkubWF0Y2ggICAgPSB4ZW5idXNfbWF0Y2gsCi0JCS51ZXZlbnQgICA9IHhlbmJ1c191ZXZlbnQsCi0JCS5wcm9iZSAgICA9IHhlbmJ1c19kZXZfcHJvYmUsCi0JCS5yZW1vdmUgICA9IHhlbmJ1c19kZXZfcmVtb3ZlLAotCQkuc2h1dGRvd24gPSB4ZW5idXNfZGV2X3NodXRkb3duLAorCQkubmFtZSAgICAgID0gInhlbiIsCisJCS5tYXRjaCAgICAgPSB4ZW5idXNfbWF0Y2gsCisJCS51ZXZlbnQgICAgPSB4ZW5idXNfdWV2ZW50LAorCQkucHJvYmUgICAgID0geGVuYnVzX2Rldl9wcm9iZSwKKwkJLnJlbW92ZSAgICA9IHhlbmJ1c19kZXZfcmVtb3ZlLAorCQkuc2h1dGRvd24gID0geGVuYnVzX2Rldl9zaHV0ZG93biwKKwkJLmRldl9hdHRycyA9IHhlbmJ1c19kZXZfYXR0cnMsCiAJfSwKIH07CiAKQEAgLTQ2MCw2ICs0NjgsNyBAQAogCQkgICAgICBjb25zdCBjaGFyICp0eXBlLAogCQkgICAgICBjb25zdCBjaGFyICpub2RlbmFtZSkKIHsKKwljaGFyIGRldm5hbWVbWEVOX0JVU19JRF9TSVpFXTsKIAlpbnQgZXJyOwogCXN0cnVjdCB4ZW5idXNfZGV2aWNlICp4ZW5kZXY7CiAJc2l6ZV90IHN0cmluZ2xlbjsKQEAgLTQ5NCwxMCArNTAzLDEyIEBACiAJeGVuZGV2LT5kZXYuYnVzID0gJmJ1cy0+YnVzOwogCXhlbmRldi0+ZGV2LnJlbGVhc2UgPSB4ZW5idXNfZGV2X3JlbGVhc2U7CiAKLQllcnIgPSBidXMtPmdldF9idXNfaWQoeGVuZGV2LT5kZXYuYnVzX2lkLCB4ZW5kZXYtPm5vZGVuYW1lKTsKKwllcnIgPSBidXMtPmdldF9idXNfaWQoZGV2bmFtZSwgeGVuZGV2LT5ub2RlbmFtZSk7CiAJaWYgKGVycikKIAkJZ290byBmYWlsOwogCisJZGV2X3NldF9uYW1lKCZ4ZW5kZXYtPmRldiwgZGV2bmFtZSk7CisKIAkvKiBSZWdpc3RlciB3aXRoIGdlbmVyaWMgZGV2aWNlIGZyYW1ld29yay4gKi8KIAllcnIgPSBkZXZpY2VfcmVnaXN0ZXIoJnhlbmRldi0+ZGV2KTsKIAlpZiAoZXJyKQpAQCAtNjExLDcgKzYyMiw3IEBACiB7CiAJaW50IGV4aXN0cywgcm9vdGxlbjsKIAlzdHJ1Y3QgeGVuYnVzX2RldmljZSAqZGV2OwotCWNoYXIgdHlwZVtCVVNfSURfU0laRV07CisJY2hhciB0eXBlW1hFTl9CVVNfSURfU0laRV07CiAJY29uc3QgY2hhciAqcCwgKnJvb3Q7CiAKIAlpZiAoY2hhcl9jb3VudChub2RlLCAnLycpIDwgMikKQEAgLTYyNSw4ICs2MzYsOCBAQAogCiAJLyogYmFja2VuZC88dHlwZT4vLi4uIG9yIGRldmljZS88dHlwZT4vLi4uICovCiAJcCA9IHN0cmNocihub2RlLCAnLycpICsgMTsKLQlzbnByaW50Zih0eXBlLCBCVVNfSURfU0laRSwgIiUuKnMiLCAoaW50KXN0cmNzcG4ocCwgIi8iKSwgcCk7Ci0JdHlwZVtCVVNfSURfU0laRS0xXSA9ICdcMCc7CisJc25wcmludGYodHlwZSwgWEVOX0JVU19JRF9TSVpFLCAiJS4qcyIsIChpbnQpc3RyY3NwbihwLCAiLyIpLCBwKTsKKwl0eXBlW1hFTl9CVVNfSURfU0laRS0xXSA9ICdcMCc7CiAKIAlyb290bGVuID0gc3Ryc2VwX2xlbihub2RlLCAnLycsIGJ1cy0+bGV2ZWxzKTsKIAlpZiAocm9vdGxlbiA8IDApCkBAIC02NzQsNyArNjg1LDcgQEAKIAkJZXJyID0gZHJ2LT5zdXNwZW5kKHhkZXYpOwogCWlmIChlcnIpCiAJCXByaW50ayhLRVJOX1dBUk5JTkcKLQkJICAgICAgICJ4ZW5idXM6IHN1c3BlbmQgJXMgZmFpbGVkOiAlaVxuIiwgZGV2LT5idXNfaWQsIGVycik7CisJCSAgICAgICAieGVuYnVzOiBzdXNwZW5kICVzIGZhaWxlZDogJWlcbiIsIGRldl9uYW1lKGRldiksIGVycik7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTY5NSw3ICs3MDYsNyBAQAogCWlmIChlcnIpCiAJCXByaW50ayhLRVJOX1dBUk5JTkcKIAkJICAgICAgICJ4ZW5idXM6IHN1c3BlbmRfY2FuY2VsICVzIGZhaWxlZDogJWlcbiIsCi0JCSAgICAgICBkZXYtPmJ1c19pZCwgZXJyKTsKKwkJICAgICAgIGRldl9uYW1lKGRldiksIGVycik7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTcxNyw3ICs3MjgsNyBAQAogCWlmIChlcnIpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORwogCQkgICAgICAgInhlbmJ1czogcmVzdW1lICh0YWxrX3RvX290aGVyZW5kKSAlcyBmYWlsZWQ6ICVpXG4iLAotCQkgICAgICAgZGV2LT5idXNfaWQsIGVycik7CisJCSAgICAgICBkZXZfbmFtZShkZXYpLCBlcnIpOwogCQlyZXR1cm4gZXJyOwogCX0KIApAQCAtNzI4LDcgKzczOSw3IEBACiAJCWlmIChlcnIpIHsKIAkJCXByaW50ayhLRVJOX1dBUk5JTkcKIAkJCSAgICAgICAieGVuYnVzOiByZXN1bWUgJXMgZmFpbGVkOiAlaVxuIiwKLQkJCSAgICAgICBkZXYtPmJ1c19pZCwgZXJyKTsKKwkJCSAgICAgICBkZXZfbmFtZShkZXYpLCBlcnIpOwogCQkJcmV0dXJuIGVycjsKIAkJfQogCX0KQEAgLTczNyw3ICs3NDgsNyBAQAogCWlmIChlcnIpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORwogCQkgICAgICAgInhlbmJ1c19wcm9iZTogcmVzdW1lICh3YXRjaF9vdGhlcmVuZCkgJXMgZmFpbGVkOiAiCi0JCSAgICAgICAiJWQuXG4iLCBkZXYtPmJ1c19pZCwgZXJyKTsKKwkJICAgICAgICIlZC5cbiIsIGRldl9uYW1lKGRldiksIGVycik7CiAJCXJldHVybiBlcnI7CiAJfQogCkBAIC04NDksNiArODYwLDE0IEBACiAJaWYgKCF4ZW5faW5pdGlhbF9kb21haW4oKSkKIAkJeGVuYnVzX3Byb2JlKE5VTEwpOwogCisjaWZkZWYgQ09ORklHX1hFTl9DT01QQVRfWEVORlMKKwkvKgorCSAqIENyZWF0ZSB4ZW5mcyBtb3VudHBvaW50IGluIC9wcm9jIGZvciBjb21wYXRpYmlsaXR5IHdpdGgKKwkgKiB1dGlsaXRpZXMgdGhhdCBleHBlY3QgdG8gZmluZCAieGVuYnVzIiB1bmRlciAiL3Byb2MveGVuIi4KKwkgKi8KKwlwcm9jX21rZGlyKCJ4ZW4iLCBOVUxMKTsKKyNlbmRpZgorCiAJcmV0dXJuIDA7CiAKICAgb3V0X3VucmVnX2JhY2s6CmRpZmYgLS1naXQgYS9kcml2ZXJzL3hlbi94ZW5idXMveGVuYnVzX3Byb2JlLmggYi9kcml2ZXJzL3hlbi94ZW5idXMveGVuYnVzX3Byb2JlLmgKaW5kZXggZTA5YjE5NC4uNmM1ZTMxOCAxMDA2NDQKLS0tIGEvZHJpdmVycy94ZW4veGVuYnVzL3hlbmJ1c19wcm9iZS5oCisrKyBiL2RyaXZlcnMveGVuL3hlbmJ1cy94ZW5idXNfcHJvYmUuaApAQCAtMzQsNiArMzQsOCBAQAogI2lmbmRlZiBfWEVOQlVTX1BST0JFX0gKICNkZWZpbmUgX1hFTkJVU19QUk9CRV9ICiAKKyNkZWZpbmUgWEVOX0JVU19JRF9TSVpFCQkJMjAKKwogI2lmZGVmIENPTkZJR19YRU5fQkFDS0VORAogZXh0ZXJuIHZvaWQgeGVuYnVzX2JhY2tlbmRfc3VzcGVuZChpbnQgKCpmbikoc3RydWN0IGRldmljZSAqLCB2b2lkICopKTsKIGV4dGVybiB2b2lkIHhlbmJ1c19iYWNrZW5kX3Jlc3VtZShpbnQgKCpmbikoc3RydWN0IGRldmljZSAqLCB2b2lkICopKTsKQEAgLTUyLDcgKzU0LDcgQEAKIHsKIAljaGFyICpyb290OwogCXVuc2lnbmVkIGludCBsZXZlbHM7Ci0JaW50ICgqZ2V0X2J1c19pZCkoY2hhciBidXNfaWRbQlVTX0lEX1NJWkVdLCBjb25zdCBjaGFyICpub2RlbmFtZSk7CisJaW50ICgqZ2V0X2J1c19pZCkoY2hhciBidXNfaWRbWEVOX0JVU19JRF9TSVpFXSwgY29uc3QgY2hhciAqbm9kZW5hbWUpOwogCWludCAoKnByb2JlKShjb25zdCBjaGFyICp0eXBlLCBjb25zdCBjaGFyICpkaXIpOwogCXN0cnVjdCBidXNfdHlwZSBidXM7CiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy94ZW4veGVuYnVzL3hlbmJ1c194cy5jIGIvZHJpdmVycy94ZW4veGVuYnVzL3hlbmJ1c194cy5jCmluZGV4IDdmMmY5MWMuLmUzMjVlYWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMveGVuL3hlbmJ1cy94ZW5idXNfeHMuYworKysgYi9kcml2ZXJzL3hlbi94ZW5idXMveGVuYnVzX3hzLmMKQEAgLTE4NCw2ICsxODQsNyBAQAogCiAJcmV0dXJuIHJldDsKIH0KK0VYUE9SVF9TWU1CT0woeGVuYnVzX2Rldl9yZXF1ZXN0X2FuZF9yZXBseSk7CiAKIC8qIFNlbmQgbWVzc2FnZSB0byB4cywgZ2V0IGttYWxsb2MnZWQgcmVwbHkuICBFUlJfUFRSKCkgb24gZXJyb3IuICovCiBzdGF0aWMgdm9pZCAqeHNfdGFsa3Yoc3RydWN0IHhlbmJ1c190cmFuc2FjdGlvbiB0LApkaWZmIC0tZ2l0IGEvZHJpdmVycy94ZW4veGVuZnMvTWFrZWZpbGUgYi9kcml2ZXJzL3hlbi94ZW5mcy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTI3NWMzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy94ZW4veGVuZnMvTWFrZWZpbGUKQEAgLTAsMCArMSwzIEBACitvYmotJChDT05GSUdfWEVORlMpICs9IHhlbmZzLm8KKworeGVuZnMtb2JqcyA9IHN1cGVyLm8geGVuYnVzLm8KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kcml2ZXJzL3hlbi94ZW5mcy9zdXBlci5jIGIvZHJpdmVycy94ZW4veGVuZnMvc3VwZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTU3NDFhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy94ZW4veGVuZnMvc3VwZXIuYwpAQCAtMCwwICsxLDY0IEBACisvKgorICogIHhlbmZzLmMgLSBhIGZpbGVzeXN0ZW0gZm9yIHBhc3NpbmcgaW5mbyBiZXR3ZWVuIHRoZSBhIGRvbWFpbiBhbmQKKyAqICB0aGUgaHlwZXJ2aXNvci4KKyAqCisgKiAyMDA4LTEwLTA3ICBBbGV4IFplZmZlcnR0ICAgIFJlcGxhY2VkIC9wcm9jL3hlbi94ZW5idXMgd2l0aCB4ZW5mcyBmaWxlc3lzdGVtCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCAvcHJvYy94ZW4gY29tcGF0aWJpbGl0eSBtb3VudCBwb2ludC4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHVybmVkIHhlbmZzIGludG8gYSBsb2FkYWJsZSBtb2R1bGUuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9tYWdpYy5oPgorCisjaW5jbHVkZSAieGVuZnMuaCIKKworI2luY2x1ZGUgPGFzbS94ZW4vaHlwZXJ2aXNvci5oPgorCitNT0RVTEVfREVTQ1JJUFRJT04oIlhlbiBmaWxlc3lzdGVtIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK3N0YXRpYyBpbnQgeGVuZnNfZmlsbF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB2b2lkICpkYXRhLCBpbnQgc2lsZW50KQoreworCXN0YXRpYyBzdHJ1Y3QgdHJlZV9kZXNjciB4ZW5mc19maWxlc1tdID0geworCQlbMl0gPSB7InhlbmJ1cyIsICZ4ZW5idXNfZmlsZV9vcHMsIFNfSVJVU1J8U19JV1VTUn0sCisJCXsiIn0sCisJfTsKKworCXJldHVybiBzaW1wbGVfZmlsbF9zdXBlcihzYiwgWEVORlNfU1VQRVJfTUFHSUMsIHhlbmZzX2ZpbGVzKTsKK30KKworc3RhdGljIGludCB4ZW5mc19nZXRfc2Ioc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsCisJCQlpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldl9uYW1lLAorCQkJdm9pZCAqZGF0YSwgc3RydWN0IHZmc21vdW50ICptbnQpCit7CisJcmV0dXJuIGdldF9zYl9zaW5nbGUoZnNfdHlwZSwgZmxhZ3MsIGRhdGEsIHhlbmZzX2ZpbGxfc3VwZXIsIG1udCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSB4ZW5mc190eXBlID0geworCS5vd25lciA9CVRISVNfTU9EVUxFLAorCS5uYW1lID0JCSJ4ZW5mcyIsCisJLmdldF9zYiA9CXhlbmZzX2dldF9zYiwKKwkua2lsbF9zYiA9CWtpbGxfbGl0dGVyX3N1cGVyLAorfTsKKworc3RhdGljIGludCBfX2luaXQgeGVuZnNfaW5pdCh2b2lkKQoreworCWlmICh4ZW5fcHZfZG9tYWluKCkpCisJCXJldHVybiByZWdpc3Rlcl9maWxlc3lzdGVtKCZ4ZW5mc190eXBlKTsKKworCXByaW50ayhLRVJOX0lORk8gIlhFTkZTOiBub3QgcmVnaXN0ZXJpbmcgZmlsZXN5c3RlbSBvbiBub24teGVuIHBsYXRmb3JtXG4iKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHhlbmZzX2V4aXQodm9pZCkKK3sKKwlpZiAoeGVuX3B2X2RvbWFpbigpKQorCQl1bnJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJnhlbmZzX3R5cGUpOworfQorCittb2R1bGVfaW5pdCh4ZW5mc19pbml0KTsKK21vZHVsZV9leGl0KHhlbmZzX2V4aXQpOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3hlbi94ZW5mcy94ZW5idXMuYyBiL2RyaXZlcnMveGVuL3hlbmZzL3hlbmJ1cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3NWE0YzUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3hlbi94ZW5mcy94ZW5idXMuYwpAQCAtMCwwICsxLDU5MyBAQAorLyoKKyAqIERyaXZlciBnaXZpbmcgdXNlci1zcGFjZSBhY2Nlc3MgdG8gdGhlIGtlcm5lbCdzIHhlbmJ1cyBjb25uZWN0aW9uCisgKiB0byB4ZW5zdG9yZS4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIENocmlzdGlhbiBMaW1wYWNoCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIFJ1c3R5IFJ1c3NlbGwsIElCTSBDb3Jwb3JhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IG9yLCB3aGVuIGRpc3RyaWJ1dGVkCisgKiBzZXBhcmF0ZWx5IGZyb20gdGhlIExpbnV4IGtlcm5lbCBvciBpbmNvcnBvcmF0ZWQgaW50byBvdGhlcgorICogc29mdHdhcmUgcGFja2FnZXMsIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBsaWNlbnNlOgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKKyAqIG9mIHRoaXMgc291cmNlIGZpbGUgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICogcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwKKyAqIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLAorICogYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTCisgKiBJTiBUSEUgU09GVFdBUkUuCisgKgorICogQ2hhbmdlczoKKyAqIDIwMDgtMTAtMDcgIEFsZXggWmVmZmVydHQgICAgUmVwbGFjZWQgL3Byb2MveGVuL3hlbmJ1cyB3aXRoIHhlbmZzIGZpbGVzeXN0ZW0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIC9wcm9jL3hlbiBjb21wYXRpYmlsaXR5IG1vdW50IHBvaW50LgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUdXJuZWQgeGVuZnMgaW50byBhIGxvYWRhYmxlIG1vZHVsZS4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC91aW8uaD4KKyNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvbW91bnQuaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9uYW1laS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorCisjaW5jbHVkZSAieGVuZnMuaCIKKyNpbmNsdWRlICIuLi94ZW5idXMveGVuYnVzX2NvbW1zLmgiCisKKyNpbmNsdWRlIDx4ZW4veGVuYnVzLmg+CisjaW5jbHVkZSA8YXNtL3hlbi9oeXBlcnZpc29yLmg+CisKKy8qCisgKiBBbiBlbGVtZW50IG9mIGEgbGlzdCBvZiBvdXRzdGFuZGluZyB0cmFuc2FjdGlvbnMsIGZvciB3aGljaCB3ZSdyZQorICogc3RpbGwgd2FpdGluZyBhIHJlcGx5LgorICovCitzdHJ1Y3QgeGVuYnVzX3RyYW5zYWN0aW9uX2hvbGRlciB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXN0cnVjdCB4ZW5idXNfdHJhbnNhY3Rpb24gaGFuZGxlOworfTsKKworLyoKKyAqIEEgYnVmZmVyIG9mIGRhdGEgb24gdGhlIHF1ZXVlLgorICovCitzdHJ1Y3QgcmVhZF9idWZmZXIgeworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwl1bnNpZ25lZCBpbnQgY29uczsKKwl1bnNpZ25lZCBpbnQgbGVuOworCWNoYXIgbXNnW107Cit9OworCitzdHJ1Y3QgeGVuYnVzX2ZpbGVfcHJpdiB7CisJLyoKKwkgKiBtc2didWZmZXJfbXV0ZXggaXMgaGVsZCB3aGlsZSBwYXJ0aWFsIHJlcXVlc3RzIGFyZSBidWlsdCB1cAorCSAqIGFuZCBjb21wbGV0ZSByZXF1ZXN0cyBhcmUgYWN0ZWQgb24uICBJdCB0aGVyZWZvcmUgcHJvdGVjdHMKKwkgKiB0aGUgInRyYW5zYWN0aW9ucyIgYW5kICJ3YXRjaGVzIiBsaXN0cywgYW5kIHRoZSBwYXJ0aWFsCisJICogcmVxdWVzdCBsZW5ndGggYW5kIGJ1ZmZlci4KKwkgKgorCSAqIHJlcGx5X211dGV4IHByb3RlY3RzIHRoZSByZXBseSBiZWluZyBidWlsdCB1cCB0byByZXR1cm4gdG8KKwkgKiB1c2VybW9kZS4gIEl0IG5lc3RzIGluc2lkZSBtc2didWZmZXJfbXV0ZXggYnV0IG1heSBiZSBoZWxkCisJICogYWxvbmUgZHVyaW5nIGEgd2F0Y2ggY2FsbGJhY2suCisJICovCisJc3RydWN0IG11dGV4IG1zZ2J1ZmZlcl9tdXRleDsKKworCS8qIEluLXByb2dyZXNzIHRyYW5zYWN0aW9ucyAqLworCXN0cnVjdCBsaXN0X2hlYWQgdHJhbnNhY3Rpb25zOworCisJLyogQWN0aXZlIHdhdGNoZXMuICovCisJc3RydWN0IGxpc3RfaGVhZCB3YXRjaGVzOworCisJLyogUGFydGlhbCByZXF1ZXN0LiAqLworCXVuc2lnbmVkIGludCBsZW47CisJdW5pb24geworCQlzdHJ1Y3QgeHNkX3NvY2ttc2cgbXNnOworCQljaGFyIGJ1ZmZlcltQQUdFX1NJWkVdOworCX0gdTsKKworCS8qIFJlc3BvbnNlIHF1ZXVlLiAqLworCXN0cnVjdCBtdXRleCByZXBseV9tdXRleDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHJlYWRfYnVmZmVyczsKKwl3YWl0X3F1ZXVlX2hlYWRfdCByZWFkX3dhaXRxOworCit9OworCisvKiBSZWFkIG91dCBhbnkgcmF3IHhlbmJ1cyBtZXNzYWdlcyBxdWV1ZWQgdXAuICovCitzdGF0aWMgc3NpemVfdCB4ZW5idXNfZmlsZV9yZWFkKHN0cnVjdCBmaWxlICpmaWxwLAorCQkJICAgICAgIGNoYXIgX191c2VyICp1YnVmLAorCQkJICAgICAgIHNpemVfdCBsZW4sIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgeGVuYnVzX2ZpbGVfcHJpdiAqdSA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgcmVhZF9idWZmZXIgKnJiOworCXVuc2lnbmVkIGk7CisJaW50IHJldDsKKworCW11dGV4X2xvY2soJnUtPnJlcGx5X211dGV4KTsKKwl3aGlsZSAobGlzdF9lbXB0eSgmdS0+cmVhZF9idWZmZXJzKSkgeworCQltdXRleF91bmxvY2soJnUtPnJlcGx5X211dGV4KTsKKwkJcmV0ID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKHUtPnJlYWRfd2FpdHEsCisJCQkJCSAgICAgICAhbGlzdF9lbXB0eSgmdS0+cmVhZF9idWZmZXJzKSk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCQltdXRleF9sb2NrKCZ1LT5yZXBseV9tdXRleCk7CisJfQorCisJcmIgPSBsaXN0X2VudHJ5KHUtPnJlYWRfYnVmZmVycy5uZXh0LCBzdHJ1Y3QgcmVhZF9idWZmZXIsIGxpc3QpOworCWkgPSAwOworCXdoaWxlIChpIDwgbGVuKSB7CisJCXVuc2lnbmVkIHN6ID0gbWluKCh1bnNpZ25lZClsZW4gLSBpLCByYi0+bGVuIC0gcmItPmNvbnMpOworCisJCXJldCA9IGNvcHlfdG9fdXNlcih1YnVmICsgaSwgJnJiLT5tc2dbcmItPmNvbnNdLCBzeik7CisKKwkJaSArPSBzeiAtIHJldDsKKwkJcmItPmNvbnMgKz0gc3ogLSByZXQ7CisKKwkJaWYgKHJldCAhPSBzeikgeworCQkJaWYgKGkgPT0gMCkKKwkJCQlpID0gLUVGQVVMVDsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJLyogQ2xlYXIgb3V0IGJ1ZmZlciBpZiBpdCBoYXMgYmVlbiBjb25zdW1lZCAqLworCQlpZiAocmItPmNvbnMgPT0gcmItPmxlbikgeworCQkJbGlzdF9kZWwoJnJiLT5saXN0KTsKKwkJCWtmcmVlKHJiKTsKKwkJCWlmIChsaXN0X2VtcHR5KCZ1LT5yZWFkX2J1ZmZlcnMpKQorCQkJCWJyZWFrOworCQkJcmIgPSBsaXN0X2VudHJ5KHUtPnJlYWRfYnVmZmVycy5uZXh0LAorCQkJCQlzdHJ1Y3QgcmVhZF9idWZmZXIsIGxpc3QpOworCQl9CisJfQorCitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZ1LT5yZXBseV9tdXRleCk7CisJcmV0dXJuIGk7Cit9CisKKy8qCisgKiBBZGQgYSBidWZmZXIgdG8gdGhlIHF1ZXVlLiAgQ2FsbGVyIG11c3QgaG9sZCB0aGUgYXBwcm9wcmlhdGUgbG9jaworICogaWYgdGhlIHF1ZXVlIGlzIG5vdCBsb2NhbC4gIChDb21tb25seSB0aGUgY2FsbGVyIHdpbGwgYnVpbGQgdXAKKyAqIG11bHRpcGxlIHF1ZXVlZCBidWZmZXJzIG9uIGEgdGVtcG9yYXJ5IGxvY2FsIGxpc3QsIGFuZCB0aGVuIGFkZCBpdAorICogdG8gdGhlIGFwcHJvcHJpYXRlIGxpc3QgdW5kZXIgbG9jayBvbmNlIGFsbCB0aGUgYnVmZmVycyBoYXZlIGVlbgorICogc3VjY2Vzc2Z1bGx5IGFsbG9jYXRlZC4pCisgKi8KK3N0YXRpYyBpbnQgcXVldWVfcmVwbHkoc3RydWN0IGxpc3RfaGVhZCAqcXVldWUsIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBsZW4pCit7CisJc3RydWN0IHJlYWRfYnVmZmVyICpyYjsKKworCWlmIChsZW4gPT0gMCkKKwkJcmV0dXJuIDA7CisKKwlyYiA9IGttYWxsb2Moc2l6ZW9mKCpyYikgKyBsZW4sIEdGUF9LRVJORUwpOworCWlmIChyYiA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJiLT5jb25zID0gMDsKKwlyYi0+bGVuID0gbGVuOworCisJbWVtY3B5KHJiLT5tc2csIGRhdGEsIGxlbik7CisKKwlsaXN0X2FkZF90YWlsKCZyYi0+bGlzdCwgcXVldWUpOworCXJldHVybiAwOworfQorCisvKgorICogRnJlZSBhbGwgdGhlIHJlYWRfYnVmZmVyIHMgb24gYSBsaXN0LgorICogQ2FsbGVyIG11c3QgaGF2ZSBzb2xlIHJlZmVyZW5jZSB0byBsaXN0LgorICovCitzdGF0aWMgdm9pZCBxdWV1ZV9jbGVhbnVwKHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QpCit7CisJc3RydWN0IHJlYWRfYnVmZmVyICpyYjsKKworCXdoaWxlICghbGlzdF9lbXB0eShsaXN0KSkgeworCQlyYiA9IGxpc3RfZW50cnkobGlzdC0+bmV4dCwgc3RydWN0IHJlYWRfYnVmZmVyLCBsaXN0KTsKKwkJbGlzdF9kZWwobGlzdC0+bmV4dCk7CisJCWtmcmVlKHJiKTsKKwl9Cit9CisKK3N0cnVjdCB3YXRjaF9hZGFwdGVyIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJc3RydWN0IHhlbmJ1c193YXRjaCB3YXRjaDsKKwlzdHJ1Y3QgeGVuYnVzX2ZpbGVfcHJpdiAqZGV2X2RhdGE7CisJY2hhciAqdG9rZW47Cit9OworCitzdGF0aWMgdm9pZCBmcmVlX3dhdGNoX2FkYXB0ZXIoc3RydWN0IHdhdGNoX2FkYXB0ZXIgKndhdGNoKQoreworCWtmcmVlKHdhdGNoLT53YXRjaC5ub2RlKTsKKwlrZnJlZSh3YXRjaC0+dG9rZW4pOworCWtmcmVlKHdhdGNoKTsKK30KKworc3RhdGljIHN0cnVjdCB3YXRjaF9hZGFwdGVyICphbGxvY193YXRjaF9hZGFwdGVyKGNvbnN0IGNoYXIgKnBhdGgsCisJCQkJCQkgY29uc3QgY2hhciAqdG9rZW4pCit7CisJc3RydWN0IHdhdGNoX2FkYXB0ZXIgKndhdGNoOworCisJd2F0Y2ggPSBremFsbG9jKHNpemVvZigqd2F0Y2gpLCBHRlBfS0VSTkVMKTsKKwlpZiAod2F0Y2ggPT0gTlVMTCkKKwkJZ290byBvdXRfZmFpbDsKKworCXdhdGNoLT53YXRjaC5ub2RlID0ga3N0cmR1cChwYXRoLCBHRlBfS0VSTkVMKTsKKwlpZiAod2F0Y2gtPndhdGNoLm5vZGUgPT0gTlVMTCkKKwkJZ290byBvdXRfZnJlZTsKKworCXdhdGNoLT50b2tlbiA9IGtzdHJkdXAodG9rZW4sIEdGUF9LRVJORUwpOworCWlmICh3YXRjaC0+dG9rZW4gPT0gTlVMTCkKKwkJZ290byBvdXRfZnJlZTsKKworCXJldHVybiB3YXRjaDsKKworb3V0X2ZyZWU6CisJZnJlZV93YXRjaF9hZGFwdGVyKHdhdGNoKTsKKworb3V0X2ZhaWw6CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIHdhdGNoX2ZpcmVkKHN0cnVjdCB4ZW5idXNfd2F0Y2ggKndhdGNoLAorCQkJY29uc3QgY2hhciAqKnZlYywKKwkJCXVuc2lnbmVkIGludCBsZW4pCit7CisJc3RydWN0IHdhdGNoX2FkYXB0ZXIgKmFkYXA7CisJc3RydWN0IHhzZF9zb2NrbXNnIGhkcjsKKwljb25zdCBjaGFyICpwYXRoLCAqdG9rZW47CisJaW50IHBhdGhfbGVuLCB0b2tfbGVuLCBib2R5X2xlbiwgZGF0YV9sZW4gPSAwOworCWludCByZXQ7CisJTElTVF9IRUFEKHN0YWdpbmdfcSk7CisKKwlhZGFwID0gY29udGFpbmVyX29mKHdhdGNoLCBzdHJ1Y3Qgd2F0Y2hfYWRhcHRlciwgd2F0Y2gpOworCisJcGF0aCA9IHZlY1tYU19XQVRDSF9QQVRIXTsKKwl0b2tlbiA9IGFkYXAtPnRva2VuOworCisJcGF0aF9sZW4gPSBzdHJsZW4ocGF0aCkgKyAxOworCXRva19sZW4gPSBzdHJsZW4odG9rZW4pICsgMTsKKwlpZiAobGVuID4gMikKKwkJZGF0YV9sZW4gPSB2ZWNbbGVuXSAtIHZlY1syXSArIDE7CisJYm9keV9sZW4gPSBwYXRoX2xlbiArIHRva19sZW4gKyBkYXRhX2xlbjsKKworCWhkci50eXBlID0gWFNfV0FUQ0hfRVZFTlQ7CisJaGRyLmxlbiA9IGJvZHlfbGVuOworCisJbXV0ZXhfbG9jaygmYWRhcC0+ZGV2X2RhdGEtPnJlcGx5X211dGV4KTsKKworCXJldCA9IHF1ZXVlX3JlcGx5KCZzdGFnaW5nX3EsICZoZHIsIHNpemVvZihoZHIpKTsKKwlpZiAoIXJldCkKKwkJcmV0ID0gcXVldWVfcmVwbHkoJnN0YWdpbmdfcSwgcGF0aCwgcGF0aF9sZW4pOworCWlmICghcmV0KQorCQlyZXQgPSBxdWV1ZV9yZXBseSgmc3RhZ2luZ19xLCB0b2tlbiwgdG9rX2xlbik7CisJaWYgKCFyZXQgJiYgbGVuID4gMikKKwkJcmV0ID0gcXVldWVfcmVwbHkoJnN0YWdpbmdfcSwgdmVjWzJdLCBkYXRhX2xlbik7CisKKwlpZiAoIXJldCkgeworCQkvKiBzdWNjZXNzOiBwYXNzIHJlcGx5IGxpc3Qgb250byB3YXRjaGVyICovCisJCWxpc3Rfc3BsaWNlX3RhaWwoJnN0YWdpbmdfcSwgJmFkYXAtPmRldl9kYXRhLT5yZWFkX2J1ZmZlcnMpOworCQl3YWtlX3VwKCZhZGFwLT5kZXZfZGF0YS0+cmVhZF93YWl0cSk7CisJfSBlbHNlCisJCXF1ZXVlX2NsZWFudXAoJnN0YWdpbmdfcSk7CisKKwltdXRleF91bmxvY2soJmFkYXAtPmRldl9kYXRhLT5yZXBseV9tdXRleCk7Cit9CisKK3N0YXRpYyBpbnQgeGVuYnVzX3dyaXRlX3RyYW5zYWN0aW9uKHVuc2lnbmVkIG1zZ190eXBlLAorCQkJCSAgICBzdHJ1Y3QgeGVuYnVzX2ZpbGVfcHJpdiAqdSkKK3sKKwlpbnQgcmMsIHJldDsKKwl2b2lkICpyZXBseTsKKwlzdHJ1Y3QgeGVuYnVzX3RyYW5zYWN0aW9uX2hvbGRlciAqdHJhbnMgPSBOVUxMOworCUxJU1RfSEVBRChzdGFnaW5nX3EpOworCisJaWYgKG1zZ190eXBlID09IFhTX1RSQU5TQUNUSU9OX1NUQVJUKSB7CisJCXRyYW5zID0ga21hbGxvYyhzaXplb2YoKnRyYW5zKSwgR0ZQX0tFUk5FTCk7CisJCWlmICghdHJhbnMpIHsKKwkJCXJjID0gLUVOT01FTTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJcmVwbHkgPSB4ZW5idXNfZGV2X3JlcXVlc3RfYW5kX3JlcGx5KCZ1LT51Lm1zZyk7CisJaWYgKElTX0VSUihyZXBseSkpIHsKKwkJa2ZyZWUodHJhbnMpOworCQlyYyA9IFBUUl9FUlIocmVwbHkpOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAobXNnX3R5cGUgPT0gWFNfVFJBTlNBQ1RJT05fU1RBUlQpIHsKKwkJdHJhbnMtPmhhbmRsZS5pZCA9IHNpbXBsZV9zdHJ0b3VsKHJlcGx5LCBOVUxMLCAwKTsKKworCQlsaXN0X2FkZCgmdHJhbnMtPmxpc3QsICZ1LT50cmFuc2FjdGlvbnMpOworCX0gZWxzZSBpZiAobXNnX3R5cGUgPT0gWFNfVFJBTlNBQ1RJT05fRU5EKSB7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkodHJhbnMsICZ1LT50cmFuc2FjdGlvbnMsIGxpc3QpCisJCQlpZiAodHJhbnMtPmhhbmRsZS5pZCA9PSB1LT51Lm1zZy50eF9pZCkKKwkJCQlicmVhazsKKwkJQlVHX09OKCZ0cmFucy0+bGlzdCA9PSAmdS0+dHJhbnNhY3Rpb25zKTsKKwkJbGlzdF9kZWwoJnRyYW5zLT5saXN0KTsKKworCQlrZnJlZSh0cmFucyk7CisJfQorCisJbXV0ZXhfbG9jaygmdS0+cmVwbHlfbXV0ZXgpOworCXJldCA9IHF1ZXVlX3JlcGx5KCZzdGFnaW5nX3EsICZ1LT51Lm1zZywgc2l6ZW9mKHUtPnUubXNnKSk7CisJaWYgKCFyZXQpCisJCXJldCA9IHF1ZXVlX3JlcGx5KCZzdGFnaW5nX3EsIHJlcGx5LCB1LT51Lm1zZy5sZW4pOworCWlmICghcmV0KSB7CisJCWxpc3Rfc3BsaWNlX3RhaWwoJnN0YWdpbmdfcSwgJnUtPnJlYWRfYnVmZmVycyk7CisJCXdha2VfdXAoJnUtPnJlYWRfd2FpdHEpOworCX0gZWxzZSB7CisJCXF1ZXVlX2NsZWFudXAoJnN0YWdpbmdfcSk7CisJCXJjID0gcmV0OworCX0KKwltdXRleF91bmxvY2soJnUtPnJlcGx5X211dGV4KTsKKworCWtmcmVlKHJlcGx5KTsKKworb3V0OgorCXJldHVybiByYzsKK30KKworc3RhdGljIGludCB4ZW5idXNfd3JpdGVfd2F0Y2godW5zaWduZWQgbXNnX3R5cGUsIHN0cnVjdCB4ZW5idXNfZmlsZV9wcml2ICp1KQoreworCXN0cnVjdCB3YXRjaF9hZGFwdGVyICp3YXRjaCwgKnRtcF93YXRjaDsKKwljaGFyICpwYXRoLCAqdG9rZW47CisJaW50IGVyciwgcmM7CisJTElTVF9IRUFEKHN0YWdpbmdfcSk7CisKKwlwYXRoID0gdS0+dS5idWZmZXIgKyBzaXplb2YodS0+dS5tc2cpOworCXRva2VuID0gbWVtY2hyKHBhdGgsIDAsIHUtPnUubXNnLmxlbik7CisJaWYgKHRva2VuID09IE5VTEwpIHsKKwkJcmMgPSAtRUlMU0VROworCQlnb3RvIG91dDsKKwl9CisJdG9rZW4rKzsKKworCWlmIChtc2dfdHlwZSA9PSBYU19XQVRDSCkgeworCQl3YXRjaCA9IGFsbG9jX3dhdGNoX2FkYXB0ZXIocGF0aCwgdG9rZW4pOworCQlpZiAod2F0Y2ggPT0gTlVMTCkgeworCQkJcmMgPSAtRU5PTUVNOworCQkJZ290byBvdXQ7CisJCX0KKworCQl3YXRjaC0+d2F0Y2guY2FsbGJhY2sgPSB3YXRjaF9maXJlZDsKKwkJd2F0Y2gtPmRldl9kYXRhID0gdTsKKworCQllcnIgPSByZWdpc3Rlcl94ZW5idXNfd2F0Y2goJndhdGNoLT53YXRjaCk7CisJCWlmIChlcnIpIHsKKwkJCWZyZWVfd2F0Y2hfYWRhcHRlcih3YXRjaCk7CisJCQlyYyA9IGVycjsKKwkJCWdvdG8gb3V0OworCQl9CisJCWxpc3RfYWRkKCZ3YXRjaC0+bGlzdCwgJnUtPndhdGNoZXMpOworCX0gZWxzZSB7CisJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh3YXRjaCwgdG1wX3dhdGNoLCAmdS0+d2F0Y2hlcywgbGlzdCkgeworCQkJaWYgKCFzdHJjbXAod2F0Y2gtPnRva2VuLCB0b2tlbikgJiYKKwkJCSAgICAhc3RyY21wKHdhdGNoLT53YXRjaC5ub2RlLCBwYXRoKSkgeworCQkJCXVucmVnaXN0ZXJfeGVuYnVzX3dhdGNoKCZ3YXRjaC0+d2F0Y2gpOworCQkJCWxpc3RfZGVsKCZ3YXRjaC0+bGlzdCk7CisJCQkJZnJlZV93YXRjaF9hZGFwdGVyKHdhdGNoKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCS8qIFN1Y2Nlc3MuICBTeW50aGVzaXplIGEgcmVwbHkgdG8gc2F5IGFsbCBpcyBPSy4gKi8KKwl7CisJCXN0cnVjdCB7CisJCQlzdHJ1Y3QgeHNkX3NvY2ttc2cgaGRyOworCQkJY2hhciBib2R5WzNdOworCQl9IF9fcGFja2VkIHJlcGx5ID0geworCQkJeworCQkJCS50eXBlID0gbXNnX3R5cGUsCisJCQkJLmxlbiA9IHNpemVvZihyZXBseS5ib2R5KQorCQkJfSwKKwkJCSJPSyIKKwkJfTsKKworCQltdXRleF9sb2NrKCZ1LT5yZXBseV9tdXRleCk7CisJCXJjID0gcXVldWVfcmVwbHkoJnUtPnJlYWRfYnVmZmVycywgJnJlcGx5LCBzaXplb2YocmVwbHkpKTsKKwkJbXV0ZXhfdW5sb2NrKCZ1LT5yZXBseV9tdXRleCk7CisJfQorCitvdXQ6CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgc3NpemVfdCB4ZW5idXNfZmlsZV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJCQljb25zdCBjaGFyIF9fdXNlciAqdWJ1ZiwKKwkJCQlzaXplX3QgbGVuLCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IHhlbmJ1c19maWxlX3ByaXYgKnUgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJdWludDMyX3QgbXNnX3R5cGU7CisJaW50IHJjID0gbGVuOworCWludCByZXQ7CisJTElTVF9IRUFEKHN0YWdpbmdfcSk7CisKKwkvKgorCSAqIFdlJ3JlIGV4cGVjdGluZyB1c2VybW9kZSB0byBiZSB3cml0aW5nIHByb3Blcmx5IGZvcm1lZAorCSAqIHhlbmJ1cyBtZXNzYWdlcy4gIElmIHRoZXkgd3JpdGUgYW4gaW5jb21wbGV0ZSBtZXNzYWdlIHdlCisJICogYnVmZmVyIGl0IHVwLiAgT25jZSBpdCBpcyBjb21wbGV0ZSwgd2UgYWN0IG9uIGl0LgorCSAqLworCisJLyoKKwkgKiBNYWtlIHN1cmUgY29uY3VycmVudCB3cml0ZXJzIGNhbid0IHN0b21wIGFsbCBvdmVyIGVhY2gKKwkgKiBvdGhlcidzIG1lc3NhZ2VzIGFuZCBtYWtlIGEgbWVzcyBvZiBvdXIgcGFydGlhbCBtZXNzYWdlCisJICogYnVmZmVyLiAgV2UgZG9uJ3QgbWFrZSBhbnkgYXR0ZW1wcHQgdG8gc3RvcCBtdWx0aXBsZQorCSAqIHdyaXRlcnMgZnJvbSBtYWtpbmcgYSBtZXNzIG9mIGVhY2ggb3RoZXIncyBpbmNvbXBsZXRlCisJICogbWVzc2FnZXM7IHdlJ3JlIGp1c3QgdHJ5aW5nIHRvIGd1YXJhbnRlZSBvdXIgb3duIGludGVybmFsCisJICogY29uc2lzdGVuY3kgYW5kIG1ha2Ugc3VyZSB0aGF0IHNpbmdsZSB3cml0ZXMgYXJlIGhhbmRsZWQKKwkgKiBhdG9taWNhbGx5LgorCSAqLworCW11dGV4X2xvY2soJnUtPm1zZ2J1ZmZlcl9tdXRleCk7CisKKwkvKiBHZXQgdGhpcyBvdXQgb2YgdGhlIHdheSBlYXJseSB0byBhdm9pZCBjb25mdXNpb24gKi8KKwlpZiAobGVuID09IDApCisJCWdvdG8gb3V0OworCisJLyogQ2FuJ3Qgd3JpdGUgYSB4ZW5idXMgbWVzc2FnZSBsYXJnZXIgd2UgY2FuIGJ1ZmZlciAqLworCWlmICgobGVuICsgdS0+bGVuKSA+IHNpemVvZih1LT51LmJ1ZmZlcikpIHsKKwkJLyogT24gZXJyb3IsIGR1bXAgZXhpc3RpbmcgYnVmZmVyICovCisJCXUtPmxlbiA9IDA7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCisJcmV0ID0gY29weV9mcm9tX3VzZXIodS0+dS5idWZmZXIgKyB1LT5sZW4sIHVidWYsIGxlbik7CisKKwlpZiAocmV0ID09IGxlbikgeworCQlyYyA9IC1FRkFVTFQ7CisJCWdvdG8gb3V0OworCX0KKworCS8qIERlYWwgd2l0aCBhIHBhcnRpYWwgY29weS4gKi8KKwlsZW4gLT0gcmV0OworCXJjID0gbGVuOworCisJdS0+bGVuICs9IGxlbjsKKworCS8qIFJldHVybiBpZiB3ZSBoYXZlbid0IGdvdCBhIGZ1bGwgbWVzc2FnZSB5ZXQgKi8KKwlpZiAodS0+bGVuIDwgc2l6ZW9mKHUtPnUubXNnKSkKKwkJZ290byBvdXQ7CS8qIG5vdCBldmVuIHRoZSBoZWFkZXIgeWV0ICovCisKKwkvKiBJZiB3ZSdyZSBleHBlY3RpbmcgYSBtZXNzYWdlIHRoYXQncyBsYXJnZXIgdGhhbiB3ZSBjYW4KKwkgICBwb3NzaWJseSBzZW5kLCBkdW1wIHdoYXQgd2UgaGF2ZSBhbmQgcmV0dXJuIGFuIGVycm9yLiAqLworCWlmICgoc2l6ZW9mKHUtPnUubXNnKSArIHUtPnUubXNnLmxlbikgPiBzaXplb2YodS0+dS5idWZmZXIpKSB7CisJCXJjID0gLUUyQklHOworCQl1LT5sZW4gPSAwOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAodS0+bGVuIDwgKHNpemVvZih1LT51Lm1zZykgKyB1LT51Lm1zZy5sZW4pKQorCQlnb3RvIG91dDsJLyogaW5jb21wbGV0ZSBkYXRhIHBvcnRpb24gKi8KKworCS8qCisJICogT0ssIG5vdyB3ZSBoYXZlIGEgY29tcGxldGUgbWVzc2FnZS4gIERvIHNvbWV0aGluZyB3aXRoIGl0LgorCSAqLworCisJbXNnX3R5cGUgPSB1LT51Lm1zZy50eXBlOworCisJc3dpdGNoIChtc2dfdHlwZSkgeworCWNhc2UgWFNfVFJBTlNBQ1RJT05fU1RBUlQ6CisJY2FzZSBYU19UUkFOU0FDVElPTl9FTkQ6CisJY2FzZSBYU19ESVJFQ1RPUlk6CisJY2FzZSBYU19SRUFEOgorCWNhc2UgWFNfR0VUX1BFUk1TOgorCWNhc2UgWFNfUkVMRUFTRToKKwljYXNlIFhTX0dFVF9ET01BSU5fUEFUSDoKKwljYXNlIFhTX1dSSVRFOgorCWNhc2UgWFNfTUtESVI6CisJY2FzZSBYU19STToKKwljYXNlIFhTX1NFVF9QRVJNUzoKKwkJLyogU2VuZCBvdXQgYSB0cmFuc2FjdGlvbiAqLworCQlyZXQgPSB4ZW5idXNfd3JpdGVfdHJhbnNhY3Rpb24obXNnX3R5cGUsIHUpOworCQlicmVhazsKKworCWNhc2UgWFNfV0FUQ0g6CisJY2FzZSBYU19VTldBVENIOgorCQkvKiAoVW4pQXNrIGZvciBzb21lIHBhdGggdG8gYmUgd2F0Y2hlZCBmb3IgY2hhbmdlcyAqLworCQlyZXQgPSB4ZW5idXNfd3JpdGVfd2F0Y2gobXNnX3R5cGUsIHUpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldCA9IC1FSU5WQUw7CisJCWJyZWFrOworCX0KKwlpZiAocmV0ICE9IDApCisJCXJjID0gcmV0OworCisJLyogQnVmZmVyZWQgbWVzc2FnZSBjb25zdW1lZCAqLworCXUtPmxlbiA9IDA7CisKKyBvdXQ6CisJbXV0ZXhfdW5sb2NrKCZ1LT5tc2didWZmZXJfbXV0ZXgpOworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCB4ZW5idXNfZmlsZV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQoreworCXN0cnVjdCB4ZW5idXNfZmlsZV9wcml2ICp1OworCisJaWYgKHhlbl9zdG9yZV9ldnRjaG4gPT0gMCkKKwkJcmV0dXJuIC1FTk9FTlQ7CisKKwlub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxwKTsKKworCXUgPSBremFsbG9jKHNpemVvZigqdSksIEdGUF9LRVJORUwpOworCWlmICh1ID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJSU5JVF9MSVNUX0hFQUQoJnUtPnRyYW5zYWN0aW9ucyk7CisJSU5JVF9MSVNUX0hFQUQoJnUtPndhdGNoZXMpOworCUlOSVRfTElTVF9IRUFEKCZ1LT5yZWFkX2J1ZmZlcnMpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnUtPnJlYWRfd2FpdHEpOworCisJbXV0ZXhfaW5pdCgmdS0+cmVwbHlfbXV0ZXgpOworCW11dGV4X2luaXQoJnUtPm1zZ2J1ZmZlcl9tdXRleCk7CisKKwlmaWxwLT5wcml2YXRlX2RhdGEgPSB1OworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgeGVuYnVzX2ZpbGVfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlzdHJ1Y3QgeGVuYnVzX2ZpbGVfcHJpdiAqdSA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgeGVuYnVzX3RyYW5zYWN0aW9uX2hvbGRlciAqdHJhbnMsICp0bXA7CisJc3RydWN0IHdhdGNoX2FkYXB0ZXIgKndhdGNoLCAqdG1wX3dhdGNoOworCisJLyoKKwkgKiBObyBuZWVkIGZvciBsb2NraW5nIGhlcmUgYmVjYXVzZSB0aGVyZSBhcmUgbm8gb3RoZXIgdXNlcnMsCisJICogYnkgZGVmaW5pdGlvbi4KKwkgKi8KKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh0cmFucywgdG1wLCAmdS0+dHJhbnNhY3Rpb25zLCBsaXN0KSB7CisJCXhlbmJ1c190cmFuc2FjdGlvbl9lbmQodHJhbnMtPmhhbmRsZSwgMSk7CisJCWxpc3RfZGVsKCZ0cmFucy0+bGlzdCk7CisJCWtmcmVlKHRyYW5zKTsKKwl9CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUod2F0Y2gsIHRtcF93YXRjaCwgJnUtPndhdGNoZXMsIGxpc3QpIHsKKwkJdW5yZWdpc3Rlcl94ZW5idXNfd2F0Y2goJndhdGNoLT53YXRjaCk7CisJCWxpc3RfZGVsKCZ3YXRjaC0+bGlzdCk7CisJCWZyZWVfd2F0Y2hfYWRhcHRlcih3YXRjaCk7CisJfQorCisJa2ZyZWUodSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCB4ZW5idXNfZmlsZV9wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBwb2xsX3RhYmxlICp3YWl0KQoreworCXN0cnVjdCB4ZW5idXNfZmlsZV9wcml2ICp1ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCisJcG9sbF93YWl0KGZpbGUsICZ1LT5yZWFkX3dhaXRxLCB3YWl0KTsKKwlpZiAoIWxpc3RfZW1wdHkoJnUtPnJlYWRfYnVmZmVycykpCisJCXJldHVybiBQT0xMSU4gfCBQT0xMUkROT1JNOworCXJldHVybiAwOworfQorCitjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHhlbmJ1c19maWxlX29wcyA9IHsKKwkucmVhZCA9IHhlbmJ1c19maWxlX3JlYWQsCisJLndyaXRlID0geGVuYnVzX2ZpbGVfd3JpdGUsCisJLm9wZW4gPSB4ZW5idXNfZmlsZV9vcGVuLAorCS5yZWxlYXNlID0geGVuYnVzX2ZpbGVfcmVsZWFzZSwKKwkucG9sbCA9IHhlbmJ1c19maWxlX3BvbGwsCit9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy94ZW4veGVuZnMveGVuZnMuaCBiL2RyaXZlcnMveGVuL3hlbmZzL3hlbmZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFmMDhiMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMveGVuL3hlbmZzL3hlbmZzLmgKQEAgLTAsMCArMSw2IEBACisjaWZuZGVmIF9YRU5GU19YRU5CVVNfSAorI2RlZmluZSBfWEVORlNfWEVOQlVTX0gKKworZXh0ZXJuIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgeGVuYnVzX2ZpbGVfb3BzOworCisjZW5kaWYJLyogX1hFTkZTX1hFTkJVU19IICovCmRpZmYgLS1naXQgYS9maXJtd2FyZS8uZ2l0aWdub3JlIGIvZmlybXdhcmUvLmdpdGlnbm9yZQppbmRleCBkOWM2OTAxLi5mODlhMjFmIDEwMDY0NAotLS0gYS9maXJtd2FyZS8uZ2l0aWdub3JlCisrKyBiL2Zpcm13YXJlLy5naXRpZ25vcmUKQEAgLTMsNCArMywzIEBACiAqLmJpbgogKi5jc3AKICouZHNwCi1paGV4MmZ3CmRpZmYgLS1naXQgYS9maXJtd2FyZS9NYWtlZmlsZSBiL2Zpcm13YXJlL01ha2VmaWxlCmluZGV4IDY5NjgzODguLmVhMWQyOGYgMTAwNjQ0Ci0tLSBhL2Zpcm13YXJlL01ha2VmaWxlCisrKyBiL2Zpcm13YXJlL01ha2VmaWxlCkBAIC0yMCw2ICsyMCwxNSBAQAogIyBhY2N1cmF0ZS4gSW4gdGhlIGxhdHRlciBjYXNlIGl0IGRvZXNuJ3QgbWF0dGVyIC0tIGl0J2xsIHVzZSAkKGZ3LXNoaXBwZWQtYWxsKS4KICMgQnV0IGJlIGF3YXJlIHRoYXQgdGhlIGNvbmZpZyBmaWxlIG1pZ2h0IG5vdCBiZSBpbmNsdWRlZCBhdCBhbGwuCiAKK2lmZGVmIENPTkZJR19BQ0VOSUNfT01JVF9USUdPTl9JCithY2VuaWMtb2JqcyA6PSBhY2VuaWMvdGcyLmJpbgorZnctc2hpcHBlZC0gKz0gYWNlbmljL3RnMS5iaW4KK2Vsc2UKK2FjZW5pYy1vYmpzIDo9IGFjZW5pYy90ZzEuYmluIGFjZW5pYy90ZzIuYmluCitlbmRpZgorZnctc2hpcHBlZC0kKENPTkZJR19BQ0VOSUMpICs9ICQoYWNlbmljLW9ianMpCitmdy1zaGlwcGVkLSQoQ09ORklHX0FEQVBURUNfU1RBUkZJUkUpICs9IGFkYXB0ZWMvc3RhcmZpcmVfcnguYmluIFwKKwkJCQkJIGFkYXB0ZWMvc3RhcmZpcmVfdHguYmluCiBmdy1zaGlwcGVkLSQoQ09ORklHX0FUQVJJX0RTUDU2SykgKz0gZHNwNTZrL2Jvb3RzdHJhcC5iaW4KIGZ3LXNoaXBwZWQtJChDT05GSUdfQVRNX0FNQkFTU0FET1IpICs9IGF0bXNhcjExLmZ3CiBmdy1zaGlwcGVkLSQoQ09ORklHX0NBU1NJTkkpICs9IHN1bi9jYXNzaW5pLmJpbgpAQCAtMjgsNiArMzcsOCBAQAogCQkJCSAgIGN4Z2IzL3QzY19wc3JhbS0xLjEuMC5iaW4gXAogCQkJCSAgIGN4Z2IzL3QzZnctNy4wLjAuYmluCiBmdy1zaGlwcGVkLSQoQ09ORklHX0RWQl9UVFVTQl9CVURHRVQpICs9IHR0dXNiLWJ1ZGdldC9kc3Bib290Y29kZS5iaW4KK2Z3LXNoaXBwZWQtJChDT05GSUdfRTEwMCkgKz0gZTEwMC9kMTAxbV91Y29kZS5iaW4gZTEwMC9kMTAxc191Y29kZS5iaW4gXAorCQkJICAgICBlMTAwL2QxMDJlX3Vjb2RlLmJpbgogZnctc2hpcHBlZC0kKENPTkZJR19TTUNUUikgKz0gdHJfc21jdHIuYmluCiBmdy1zaGlwcGVkLSQoQ09ORklHX1NORF9LT1JHMTIxMikgKz0ga29yZy9rMTIxMi5kc3AKIGZ3LXNoaXBwZWQtJChDT05GSUdfU05EX01BRVNUUk8zKSArPSBlc3MvbWFlc3RybzNfYXNzcF9rZXJuZWwuZncgXApAQCAtMzgsNiArNDksOCBAQAogCQkJCSAgICAgc2IxNi9pbWFfYWRwY21fY2FwdHVyZS5jc3AKIGZ3LXNoaXBwZWQtJChDT05GSUdfU05EX1lNRlBDSSkgKz0geWFtYWhhL2RzMV9jdHJsLmZ3IHlhbWFoYS9kczFfZHNwLmZ3IFwKIAkJCQkgICB5YW1haGEvZHMxZV9jdHJsLmZ3Citmdy1zaGlwcGVkLSQoQ09ORklHX1RJR09OMykgKz0gdGlnb24vdGczLmJpbiB0aWdvbi90ZzNfdHNvLmJpbiBcCisJCQkgICAgICAgdGlnb24vdGczX3RzbzUuYmluCiBmdy1zaGlwcGVkLSQoQ09ORklHX1VTQl9EQUJVU0IpICs9IGRhYnVzYi9maXJtd2FyZS5mdyBkYWJ1c2IvYml0c3RyZWFtLmJpbgogZnctc2hpcHBlZC0kKENPTkZJR19VU0JfRU1JMjYpICs9IGVtaTI2L2xvYWRlci5mdyBlbWkyNi9maXJtd2FyZS5mdyBcCiAJCQkJICBlbWkyNi9iaXRzdHJlYW0uZncKQEAgLTg4LDEwICsxMDEsMTAgQEAKICAgICAgIGNtZF9paGV4ICA9ICQoT0JKQ09QWSkgLUlpaGV4IC1PYmluYXJ5ICQ8ICRACiAKIHF1aWV0X2NtZF9paGV4MmZ3ICA9IElIRVgyRlcgJEAKLSAgICAgIGNtZF9paGV4MmZ3ICA9ICQob2JqdHJlZSkvJChvYmopL2loZXgyZncgJDwgJEAKKyAgICAgIGNtZF9paGV4MmZ3ICA9ICQob2JqdHJlZSkvc2NyaXB0cy9paGV4MmZ3ICQ8ICRACiAKIHF1aWV0X2NtZF9oMTZ0b2Z3ICA9IEgxNlRPRlcgJEAKLSAgICAgIGNtZF9oMTZ0b2Z3ICA9ICQob2JqdHJlZSkvJChvYmopL2loZXgyZncgLXcgJDwgJEAKKyAgICAgIGNtZF9oMTZ0b2Z3ICA9ICQob2JqdHJlZSkvc2NyaXB0cy9paGV4MmZ3IC13ICQ8ICRACiAKIHF1aWV0X2NtZF9md2JpbiA9IE1LX0ZXICAgJEAKICAgICAgIGNtZF9md2JpbiA9IEZXTkFNRT0iJChwYXRzdWJzdCBmaXJtd2FyZS8lLmdlbi5TLCUsJEApIjsJCSAgICAgXApAQCAtMTU0LDExICsxNjcsMTEgQEAKICMgaXMgYWN0dWFsbHkgbWVhbmluZ2Z1bCwgYmVjYXVzZSB0aGUgZmlybXdhcmUgaGFzIHRvIGJlIGxvYWRlZCBpbiBhIGNlcnRhaW4KICMgb3JkZXIgcmF0aGVyIHRoYW4gYXMgYSBzaW5nbGUgYmluYXJ5IGJsb2IuIFRodXMsIHdlIGNvbnZlcnQgdGhlbSBpbnRvIG91cgogIyBtb3JlIGNvbXBhY3QgYmluYXJ5IHJlcHJlc2VudGF0aW9uIG9mIGloZXggcmVjb3JkcyAoPGxpbnV4L2loZXguaD4pCi0kKG9iaikvJS5mdzogJChvYmopLyUuSEVYICQob2JqKS9paGV4MmZ3IHwgJChvYmp0cmVlKS8kKG9iaikvJCQoZGlyICUpCiskKG9iaikvJS5mdzogJChvYmopLyUuSEVYICB8ICQob2JqdHJlZSkvJChvYmopLyQkKGRpciAlKQogCSQoY2FsbCBjbWQsaWhleDJmdykKIAogIyAuSDE2IGlzIG91ciBvd24gbW9kaWZpZWQgZm9ybSBvZiBJbnRlbCBIRVgsIHdpdGggMTYtYml0IGxlbmd0aCBmb3IgcmVjb3Jkcy4KLSQob2JqKS8lLmZ3OiAkKG9iaikvJS5IMTYgJChvYmopL2loZXgyZncgfCAkKG9ianRyZWUpLyQob2JqKS8kJChkaXIgJSkKKyQob2JqKS8lLmZ3OiAkKG9iaikvJS5IMTYgfCAkKG9ianRyZWUpLyQob2JqKS8kJChkaXIgJSkKIAkkKGNhbGwgY21kLGgxNnRvZncpCiAKICQoZmlybXdhcmUtZGlycyk6CkBAIC0xNzUsNSArMTg4LDMgQEAKICMgV2l0aG91dCB0aGlzLCBidWlsdC1pbi5vIHdvbid0IGJlIGNyZWF0ZWQgd2hlbiBpdCdzIGVtcHR5LCBhbmQgdGhlCiAjIGZpbmFsIHZtbGludXggbGluayB3aWxsIGZhaWwuCiBvYmotbiA6PSBkdW1teQotCi1ob3N0cHJvZ3MteSA6PSBpaGV4MmZ3CmRpZmYgLS1naXQgYS9maXJtd2FyZS9XSEVOQ0UgYi9maXJtd2FyZS9XSEVOQ0UKaW5kZXggOGYwNjYzOS4uOGI1NjUxMyAxMDA2NDQKLS0tIGEvZmlybXdhcmUvV0hFTkNFCisrKyBiL2Zpcm13YXJlL1dIRU5DRQpAQCAtMzYwLDMgKzM2MCw2NCBAQAogCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCitEcml2ZXI6IGUxMDAgLS0gSW50ZWwgUFJPLzEwMCBFdGhlcm5ldCBOSUMKKworRmlsZTogZTEwMC9kMTAxbV91Y29kZS5iaW4KK0ZpbGU6IGUxMDAvZDEwMXNfdWNvZGUuYmluCitGaWxlOiBlMTAwL2QxMDJlX3Vjb2RlLmJpbgorCitMaWNlbmNlOiBVbmtub3duCisKK0ZvdW5kIGluIGhleCBmb3JtIGluIGtlcm5lbCBzb3VyY2UuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0RyaXZlcjogYWNlbmljIC0tIEFsdGVvbiBBY2VOSUMgR2lnYWJpdCBFdGhlcm5ldCBjYXJkCisKK0ZpbGU6IGFjZW5pYy90ZzEuYmluCitGaWxlOiBhY2VuaWMvdGcyLmJpbgorCitMaWNlbmNlOiBVbmtub3duCisKK0ZvdW5kIGluIGhleCBmb3JtIGluIGtlcm5lbCBzb3VyY2UsIGJ1dCBzb3VyY2UgYWxsZWdlZGx5IGF2YWlsYWJsZSBhdAoraHR0cDovL2FsdGVvbi5zaGFyZWFibGUub3JnLworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitEcml2ZXI6IHRpZ29uMyAtLSBCcm9hZGNvbSBUaWdvbjMgYmFzZWQgZ2lnYWJpdCBFdGhlcm5ldCBjYXJkcworCitGaWxlOiB0aWdvbi90ZzMuYmluCitGaWxlOiB0aWdvbi90ZzNfdHNvLmJpbgorRmlsZTogdGlnb24vdGczX3RzbzUuYmluCisKK0xpY2VuY2U6CisgKiBGaXJtd2FyZSBpczoKKyAqCURlcml2ZWQgZnJvbSBwcm9wcmlldGFyeSB1bnB1Ymxpc2hlZCBzb3VyY2UgY29kZSwKKyAqCUNvcHlyaWdodCAoQykgMjAwMC0yMDAzIEJyb2FkY29tIENvcnBvcmF0aW9uLgorICoKKyAqCVBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQgZm9yIHRoZSBkaXN0cmlidXRpb24gb2YgdGhpcyBmaXJtd2FyZQorICoJZGF0YSBpbiBoZXhhZGVjaW1hbCBvciBlcXVpdmFsZW50IGZvcm1hdCwgcHJvdmlkZWQgdGhpcyBjb3B5cmlnaHQKKyAqCW5vdGljZSBpcyBhY2NvbXBhbnlpbmcgaXQuCisKK0ZvdW5kIGluIGhleCBmb3JtIGluIGtlcm5lbCBzb3VyY2UuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0RyaXZlcjogQURBUFRFQ19TVEFSRklSRSAtIEFkYXB0ZWMgU3RhcmZpcmUvRHVyYUxBTiBzdXBwb3J0CisKK0ZpbGU6IGFkYXB0ZWMvc3RhcmZpcmVfcnguYmluCitGaWxlOiBhZGFwdGVjL3N0YXJmaXJlX3R4LmJpbgorCitMaWNlbmNlOiBBbGxlZ2VkbHkgR1BMdjIsIGJ1dCBubyBzb3VyY2UgdmlzaWJsZS4KKworRm91bmQgaW4gaGV4IGZvcm0gaW4ga2VybmVsIHNvdXJjZSwgd2l0aCB0aGUgZm9sbG93aW5nIG5vdGljZToKKworIEJFQ0FVU0UgVEhFIFBST0dSQU0gSVMgTElDRU5TRUQgRlJFRSBPRiBDSEFSR0UgSVQgSVMgTElDRU5TRUQgIkFTIElTIiBBTkQKKyBUSEVSRSBJUyBOTyBXQVJSQU5UWSBGT1IgVEhFIFBST0dSQU0sIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFCisgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorIChUTyBUSEUgRVhURU5UIFBFUk1JVFRFRCBCWSBBUFBMSUNBQkxFIExBVykuIFVTRSBPRiBUSEUgUFJPR1JBTSBJUyBBVCBZT1VSCisgT1dOIFJJU0suIElOIE5PIEVWRU5UIFdJTEwgQURBUFRFQyBPUiBJVFMgTElDRU5TT1JTIEJFIExJQUJMRSBUTyBZT1UgRk9SCisgREFNQUdFUywgSU5DTFVESU5HIEFOWSBHRU5FUkFMLCBTUEVDSUFMLCBJTkNJREVOVEFMIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworIEFSSVNJTkcgT1VUIE9GIFRIRSBVU0UgT1IgSU5BQklMSVRZIFRPIFVTRSBUSEUgUFJPR1JBTS4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL2Zpcm13YXJlL2FjZW5pYy90ZzEuYmluLmloZXggYi9maXJtd2FyZS9hY2VuaWMvdGcxLmJpbi5paGV4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlZjI2NTkKLS0tIC9kZXYvbnVsbAorKysgYi9maXJtd2FyZS9hY2VuaWMvdGcxLmJpbi5paGV4CkBAIC0wLDAgKzEsNDU3MyBAQAorOjEwMDAwMDAwMEMwNDBCMDAwMDAwNDAwMDAwMDA0MDAwMTAwMDAwMDM0MgorOjEwMDAxMDAwMDAwMDAwMDAwMDAwMDAwRDAwMDAwMDBEM0MxRDAwMDE2QworOjEwMDAyMDAwOEZCRDVDNTQwM0EwRjAyMTNDMTAwMDAwMjYxMDQwMDA1RQorOjEwMDAzMDAwMEMwMDEwMEMwMDAwMDAwMDAwMDAwMDBEMjdCREZGRDhEMAorOjEwMDA0MDAwM0MxQ0MwMDAzQzFCMDAxMzM3N0JEODAwMDAwMEQwMjFCMworOjEwMDA1MDAwM0MxNzAwMTMzNkY3NTQxODAyRTAyMDIxMzQwNTgzRThEQQorOjEwMDA2MDAwQUZCRjAwMjQwQzAwMjQ4OEFGQjAwMDIwMEMwMDIzRThCMAorOjEwMDA3MDAwMDAwMDAwMDAzQzA0MDAwMTI0ODQ1MUE0MjQwNTAwMDE3OAorOjEwMDA4MDAwMDJFMDMwMjEwMDAwMzgyMTNDMTAwMDAxMjYxMDdFNTA5MworOjEwMDA5MDAwQUZCMDAwMTAwQzAwMjQwM0FGQkIwMDE0M0MwMjAwMEZGMworOjEwMDBBMDAwMzQ0MkZGRkYwMjAyMTAyNDAzNjIxMDJCMTA0MDAwMDlBQgorOjEwMDBCMDAwMjQwNTAwMDMzQzA0MDAwMTI0ODQ1MUIwMDIwMDMwMjFENworOjEwMDBDMDAwMDM2MDM4MjEzQzAyMDAxMEFGQTIwMDEwMEMwMDI0MDM5MgorOjEwMDBEMDAwQUZBMDAwMTQwMDAwMjAyMTM0MDVDMDAwM0MwMTAwMDE0NQorOjEwMDBFMDAwMDAzNzA4MjFBMDIwODNCMDNDMDEwMDAxMDAzNzA4MjExRgorOjEwMDBGMDAwQTAyMDgzQjIzQzAxMDAwMTAwMzcwODIxQTAyMDgzQjM3NworOjEwMDEwMDAwM0MwMTAwMDEwMDM3MDgyMUFDMjA4M0I0QTJFMDA0RDhGMAorOjEwMDExMDAwMDAwNDE4QzAyNDg0MDAwMTAwNzcxMDIxQUM0MDcyN0NEOAorOjEwMDEyMDAwMDA3NzEwMjFBQzQwNzI4MDAyRTMxMDIxQTQ0NTcyN0M1QworOjEwMDEzMDAwMkM4MjAwMjAxNDQwRkZGNzAwMDQxOEMwMDAwMDIwMjE4QQorOjEwMDE0MDAwMzQwNUMwMDAwMDA0MThDMDI0ODQwMDAxMDA3NzEwMjE4OQorOjEwMDE1MDAwQUM0MDczN0MwMDc3MTAyMUFDNDA3MzgwMDJFMzEwMjEyNworOjEwMDE2MDAwQTQ0NTczN0MyQzgyMDA4MDU0NDBGRkY3MDAwNDE4QzAyMworOjEwMDE3MDAwQUY4MDAwNTRBRjgwMDExQzhGODIwMDQ0MzQ0MjAwNDBBNQorOjEwMDE4MDAwQUY4MjAwNDQ4RjgyMDA0NDM0NDIwMDIwQUY4MjAwNDQ5QQorOjEwMDE5MDAwOEY0MjAyMTgzMDQyMDAwMjEwNDAwMDA5MDAwMDAwMDBBNworOjEwMDFBMDAwOEY0MjAyMjAzQzAzMDAwMjM0NjMwMDA0MDA0MzEwMjUwOAorOjEwMDFCMDAwQUVFMjA0QzQ4RjQyMDIxQzA4MDAxMDc0MzQ0MjAwMDRGMgorOjEwMDFDMDAwOEY0MjAyMjAzQzAzMDAwMjM0NjMwMDA2MDA0MzEwMjVFNgorOjEwMDFEMDAwQUVFMjA0QzQ4RjQyMDIxQzM0NDIwMDA2QUVFMjA0Q0NGQworOjEwMDFFMDAwOEY0MjAyMTgzMDQyMDAxMDEwNDAwMDBBMDAwMDAwMDA0OAorOjEwMDFGMDAwOEY0MjAyMUMzNDQyMDAwNEFFRTIwNEM4OEY0MjAyMjA0NworOjEwMDIwMDAwM0MwMzAwMEEzNDYzMDAwNDAwNDMxMDI1MDgwMDEwOEFGMAorOjEwMDIxMDAwQUVFMjA0QzA4RjQyMDIyMDNDMDMwMDBBMzQ2MzAwMDZCMQorOjEwMDIyMDAwMDA0MzEwMjVBRUUyMDRDMDhGNDIwMjFDMzQ0MjAwMDY5NworOjEwMDIzMDAwQUVFMjA0Qzg4RjQyMDIxODMwNDIwMjAwMTA0MDAwMDNCMAorOjEwMDI0MDAwMjQwMjAwMDEwODAwMTA5MUEyRTI3MjQ4QTJFMDcyNDg2NAorOjEwMDI1MDAwMjQwMjAwMDFBRjgyMDBBMEFGODIwMEIwOEY4MzAwNTQ1RgorOjEwMDI2MDAwOEY4MjAwNTQwODAwMTA5OTI0NjMwMDY0OEY4MjAwNTQyOAorOjEwMDI3MDAwMDA2MjEwMjMyQzQyMDA2NTE0NDBGRkZDMDAwMDAwMDBDNworOjEwMDI4MDAwQUY4MDAwNDQ4RjQyMDIwODhGNDMwMjBDQUVFMjAwMTBBMAorOjEwMDI5MDAwQUVFMzAwMTQ4RUU0MDAxMDhFRTUwMDE0MjZFMjAwMzA3OAorOjEwMDJBMDAwQUVFMjAwMjgyNDAyMDQ5MEFFRTIwMDE4QUY4NDAwOTA3MQorOjEwMDJCMDAwQUY4NTAwOTQ4RUUyMDAyOEFGODIwMEI0OTZFMjAwMUE2NworOjEwMDJDMDAwQUY4MjAwOUM4RjgyMDBCMDhFRTMwNENDMDA0MzEwMjVFNworOjEwMDJEMDAwQUY4MjAwQjA4RjgyMDBCMDMwNDIwMDA0MTQ0MEZGRkRCNgorOjEwMDJFMDAwMDAwMDAwMDA4RUUyMDQ1MDhFRTMwNDU0QUVFMzA0RkNGMAorOjEwMDJGMDAwOEVFMjA0RkMyNDQyRTAwMDJDNDIyMDAxMTQ0MDAwMEQ1OAorOjEwMDMwMDAwMjZFNDAwMzA4RUUyMDQ1MDhFRTMwNDU0M0MwNDAwMDFFNQorOjEwMDMxMDAwMjQ4NDUxQkMzQzA1MDAwMUFGQTAwMDEwQUZBMDAwMTQyNAorOjEwMDMyMDAwOEVFNzA0RkMzNEE1RjAwMDBDMDAyNDAzMDA2MDMwMjFBQgorOjEwMDMzMDAwMjZFNDAwMzAwQzAwMjQ4ODI0MDUwNDAwMjc0NDAwODBCMworOjEwMDM0MDAwMEMwMDI0ODgyNDA1MDA4MDI2RTQ3NzdDMEMwMDI0ODg5NworOjEwMDM1MDAwMjQwNTA0MDA4RjQyMDI1QzI2RTQwMDk0QUVFMjAwNjBCMworOjEwMDM2MDAwOEY0MjAyNjAyNzQ1MDIwMDI0MDYwMDA4QUVFMjAwNjhDMgorOjEwMDM3MDAwMjQwMjAwMDYwQzAwMjQ5QUFFRTIwMDY0M0MwMjNCOUE4MAorOjEwMDM4MDAwMzQ0MkNBMDAwMDAwMjAyMTI0MDMwMDAyQUVFMzAwNzRCRQorOjEwMDM5MDAwQUVFMzAwNzBBRUUyMDA2QzI0MDIwM0U4QUVFMjAxMDRCQQorOjEwMDNBMDAwMjQwMjAwMDFBRUUzMDEwMEFFRTIwMTBDM0MwMzAwMDFCNworOjEwMDNCMDAwMDA2NDE4MjE5MDYzNUMyMDAyRTQxMDIxMjQ4NDAwMDE3MQorOjEwMDNDMDAwQTA0MzAwOUMyQzgyMDAwRjE0NDBGRkY4MDAwMDAwMDBBNgorOjEwMDNEMDAwOEY4MjAwNDAwMkU0MTgyMTI0ODQwMDAxMDAwMjE3MDJFOQorOjEwMDNFMDAwMjQ0MjAwMzBBMDYyMDA5QzAyRTQxMDIxQTA0MDAwOUM0NgorOjEwMDNGMDAwOTZFMjA0NkEzMDQyMDAwMzE0NDAwMDA5MDAwMDAwMDA0NQorOjEwMDQwMDAwOTZFMjA0N0EzMDQyMDAwMzUwNDAwMTMxM0MwMzA4MDA3OAorOjEwMDQxMDAwOTZFMjA0NkEzMDQyMDAwMzEwNDAwMDJBM0MwMjA3MDBDMgorOjEwMDQyMDAwOTZFMjA0N0EzMDQyMDAwMzEwNDAwMDI2M0MwMjA3MDBBNgorOjEwMDQzMDAwOTZFMzA0N0E5NkUyMDQ2QTE0NjIwMDIyM0MwMjA3MDAwMgorOjEwMDQ0MDAwOEVFMjA0QzAyNDAzMDAwMUEyRTM0RTIwMzQ0MjBFMDBEOQorOjEwMDQ1MDAwQUVFMjA0QzA4RjQyMDIxODMwNDIwMTAwMTA0MDAwMDU5NQorOjEwMDQ2MDAwMDAwMDAwMDAzQzAyMDAwMTI0NDJFMTY4MDgwMDExMUQ2OAorOjEwMDQ3MDAwMDAwMjExMDAzQzAyMDAwMTI0NDJEMzVDMDAwMjExMDA4MgorOjEwMDQ4MDAwMDAwMjExODIzQzAzMDgwMDAwNDMxMDI1M0MwMTAwMDFEQQorOjEwMDQ5MDAwQUMyMjEyMzgzQzAyMDAwMTI0NDJGNjgwMDAwMjExMDAxNgorOjEwMDRBMDAwMDAwMjExODIzQzAzMDgwMDAwNDMxMDI1M0MwMTAwMDFCQQorOjEwMDRCMDAwQUMyMjEyNzg4RUUyMDAwMDM0NDI0MDAwMDgwMDEyMzg2QworOjEwMDRDMDAwQUVFMjAwMDAzNDQyMzAwMEFGQTIwMDE4OEVFMjA2MDgwRgorOjEwMDREMDAwOEY0MzAyMjgyNDQyMDAwMTMwNDkwMEZGNTEyMzAwRTJFQgorOjEwMDRFMDAwQUZBMDAwMTA4RUUyMDYwODAwMDIxMEMwMDA1NzEwMjFENQorOjEwMDRGMDAwOEZBMzAwMTg4RkE0MDAxQ0FDNDMwNjBDQUM0NDA2MTA1QworOjEwMDUwMDAwOEY4NzAxMjAyNzYyMzgwMDI0RTgwMDIwMDEwMjEwMkI4OQorOjEwMDUxMDAwNTA0MDAwMDEyNzY4MzAwMDhGODIwMTI4MTEwMjAwMDQzQQorOjEwMDUyMDAwMDAwMDAwMDA4RjgyMDEyNDE1MDIwMDA3MDAwMDEwMjE0NgorOjEwMDUzMDAwOEVFMjAxQTQwMDAwMzAyMTI0NDIwMDAxQUVFMjAxQTRCOQorOjEwMDU0MDAwMDgwMDExQTA4RUUyMDFBNDhFRTQwNjA4MDAwNDIwQzA3OQorOjEwMDU1MDAwMDA4MDE4MjE4RUU0MDQzMDhFRTUwNDM0MDBBMzI4MjFBNQorOjEwMDU2MDAwMDBBMzMwMkIwMDgyMjAyMTAwODYyMDIxQUNFNDAwMDA3MworOjEwMDU3MDAwQUNFNTAwMDQ4RUUzMDYwODI0MDIwMDA4QTRFMjAwMEVBNQorOjEwMDU4MDAwMjQwMjAwMERBQ0UyMDAxOEFDRTkwMDFDMDAwMzE4QzAwNgorOjEwMDU5MDAwMjQ2MzA2MEMwMkUzMTAyMUFDRTIwMDA4OEVFMjA0QzRERQorOjEwMDVBMDAwQUNFMjAwMTBBRjg4MDEyMDkyRTI0RTIwMTQ0MDAwMzdFOAorOjEwMDVCMDAwMjQwNjAwMDE4RUUyNEUzMDAwMDIxMEMwMjQ0MjUwMzg2MgorOjEwMDVDMDAwMDJFMjIwMjE4QzgzMDAwMDI0MDIwMDA3MTQ2MjAwMUYzNQorOjEwMDVEMDAwMDAwMDAwMDA4RUUzNEUzMDhFRTI0RTM0MTA2MjAwMUJBRAorOjEwMDVFMDAwMjQwMzAwNDA4QzgyMDAwNDI0NDIwMDAxQUM4MjAwMDRGOQorOjEwMDVGMDAwOEVFMjRFMzQ4RUU1NEUzMDI0NDIwMDAxMTA0MzAwMDc1NworOjEwMDYwMDAwMDAwMDAwMDA4RUUyNEUzNDI0NDIwMDAxMTBBMjAwMDVEQQorOjEwMDYxMDAwMDAwMDAwMDAwODAwMTE4QTAwMDAwMDAwMTRBMDAwMDU3RQorOjEwMDYyMDAwMDAwMDAwMDA4RjgyMDEyODI0NDIwMDIwQUY4MjAxMjhCMAorOjEwMDYzMDAwOEY4MjAxMjg4QzgyMDAwNDJDNDIwMDExNTA0MDAwMTM0QworOjEwMDY0MDAwQUM4MDAwMDAwODAwMTFBMDAwMDAwMDAwOEVFMjRFMzBENworOjEwMDY1MDAwMjQwMzAwNDAyNDQyMDAwMTUwNDMwMDAzMDAwMDEwMjEwNQorOjEwMDY2MDAwOEVFMjRFMzAyNDQyMDAwMUFFRTI0RTMwOEVFMjRFMzAzOQorOjEwMDY3MDAwMDAwMjEwQzAyNDQyNTAzODAyRTIyMDIxMjQwMjAwMDc2OAorOjEwMDY4MDAwQUM4MjAwMDAyNDAyMDAwMUFDODIwMDA0NTRDMDAwMENDMworOjEwMDY5MDAwQUVFOTA2MDgzQzA0MDAwMTI0ODQ1MUM4QUZBMDAwMTA1NAorOjEwMDZBMDAwQUZBMDAwMTQ4RUU2MDYwODhGNDcwMjI4M0MwNTAwMDkxQgorOjEwMDZCMDAwMEMwMDI0MDMzNEE1RjAwMDA4MDAxMjIzMDAwMDAwMDAwMQorOjEwMDZDMDAwOEY4MzAxMjAyNzYyMzgwMDI0NjYwMDIwMDBDMjEwMkI4RgorOjEwMDZEMDAwNTA0MDAwMDEyNzY2MzAwMDhGODIwMTI4MTBDMjAwMDRCQworOjEwMDZFMDAwMDAwMDAwMDA4RjgyMDEyNDE0QzIwMDA3MDAwMDAwMDBGNworOjEwMDZGMDAwOEVFMjAxQTQwMDAwMzAyMTI0NDIwMDAxQUVFMjAxQTRGOAorOjEwMDcwMDAwMDgwMDEyMDc4RUUyMDFBNDhFRTIwNjA4QUM2MjAwMUMwQgorOjEwMDcxMDAwOEVFNDA0QTA4RUU1MDRBNDI0NjIwMDFDQUM2MjAwMDhGMAorOjEwMDcyMDAwMjQwMjAwMDhBNDYyMDAwRTI0MDIwMDExQUM2MjAwMTgyQQorOjEwMDczMDAwQUM2NDAwMDBBQzY1MDAwNDhFRTIwNEM0QUM2MjAwMTAzRQorOjEwMDc0MDAwQUY4NjAxMjA5MkUyNEUyMDE0NDAwMDM3MjQwNjAwMDFCQgorOjEwMDc1MDAwOEVFMjRFMzAwMDAyMTBDMDI0NDI1MDM4MDJFMjIwMjFDNgorOjEwMDc2MDAwOEM4MzAwMDAyNDAyMDAxMjE0NjIwMDFGMDAwMDAwMDBBRAorOjEwMDc3MDAwOEVFMzRFMzA4RUUyNEUzNDEwNjIwMDFCMjQwMzAwNDBBNAorOjEwMDc4MDAwOEM4MjAwMDQyNDQyMDAwMUFDODIwMDA0OEVFMjRFMzRDQworOjEwMDc5MDAwOEVFNTRFMzAyNDQyMDAwMTEwNDMwMDA3MDAwMDAwMDBBNworOjEwMDdBMDAwOEVFMjRFMzQyNDQyMDAwMTEwQTIwMDA1MDAwMDAwMDAzOQorOjEwMDdCMDAwMDgwMDExRjEwMDAwMDAwMDE0QTAwMDA1MDAwMDAwMDA3NgorOjEwMDdDMDAwOEY4MjAxMjgyNDQyMDAyMEFGODIwMTI4OEY4MjAxMjhENQorOjEwMDdEMDAwOEM4MjAwMDQyQzQyMDAxMTUwNDAwMDEzQUM4MDAwMDBCOQorOjEwMDdFMDAwMDgwMDEyMDcwMDAwMDAwMDhFRTI0RTMwMjQwMzAwNDA5MworOjEwMDdGMDAwMjQ0MjAwMDE1MDQzMDAwMzAwMDAxMDIxOEVFMjRFMzBERAorOjEwMDgwMDAwMjQ0MjAwMDFBRUUyNEUzMDhFRTI0RTMwMDAwMjEwQzBCMworOjEwMDgxMDAwMjQ0MjUwMzgwMkUyMjAyMTI0MDIwMDEyQUM4MjAwMDA1RgorOjEwMDgyMDAwMjQwMjAwMDFBQzgyMDAwNDE0QzAwMDFCMDAwMDAwMDA4MAorOjEwMDgzMDAwM0MwNDAwMDEyNDg0NTFEMEFGQTAwMDEwQUZBMDAwMTRFQworOjEwMDg0MDAwOEVFNjA2MDg4RjQ3MDIyODNDMDUwMDA5MEMwMDI0MDNBOQorOjEwMDg1MDAwMzRBNUYwMDE4RUUyMDFCMDI0NDIwMDAxQUVFMjAxQjAwNQorOjEwMDg2MDAwMDgwMDEyMjM4RUUyMDFCMDNDMDQwMDAxMjQ4NDUxREMxNAorOjEwMDg3MDAwQUZBMDAwMTQ4RUU2MDYwODhGNDcwMjI4M0MwNTAwMDk0OQorOjEwMDg4MDAwMEMwMDI0MDMzNEE1RjAwNThFRTIwMUFDMjQ0MjAwMDFFMworOjEwMDg5MDAwQUVFMjAxQUM4RUUyMDFBQzhFRTIwMTYwM0MwNDAwMDFFQworOjEwMDhBMDAwMjQ4NDUxRTgzNDA1RjAwMTI0NDIwMDAxQUVFMjAxNjBFNQorOjEwMDhCMDAwOEVFMjAxNjAwMDAwMzAyMTAwMDAzODIxQUZBMDAwMTA1RQorOjEwMDhDMDAwMEMwMDI0MDNBRkEwMDAxNDA4MDAxMjM4MDAwMDAwMDA0MAorOjEwMDhEMDAwM0MwMjAwMDEyNDQyRjVBODAwMDIxMTAwMDAwMjExODIyRQorOjEwMDhFMDAwMDA0MzEwMjUzQzAxMDAwMUFDMjIxMjc4OTZFMjA0NUEyNAorOjEwMDhGMDAwMzA0MjAwMDMxMDQwMDAyNTNDMDUwRkZGOEVFMjA0Qzg4MworOjEwMDkwMDAwMzRBNUZGRkYzNDQyMEEwMEFFRTIwNEM4OEVFMzA0QzhGNworOjEwMDkxMDAwM0MwNDAwMDEyNDg0NTFGNDI0MDIwMDAxQTJFMjA0RUMwRQorOjEwMDkyMDAwQTJFMjA0RUQzQzAyMDAwMjAwNjIxODI1M0MwMjAwMDEzNAorOjEwMDkzMDAwMjQ0MkEzOTAwMDQ1MTAyNDAwMDIxMDgyQUVFMzA0QzhCNAorOjEwMDk0MDAwM0MwMzA4MDAwMDQzMTAyNTNDMDEwMDAxQUMyMjEyMjBBQQorOjEwMDk1MDAwM0MwMjAwMDEyNDQyQURENDAwNDUxMDI0MDAwMjEwODI2NAorOjEwMDk2MDAwMDA0MzEwMjUzQzAxMDAwMUFDMjIxMjgwOTZFNjA0NUE5NworOjEwMDk3MDAwMDAwMDM4MjEyNDA1MDAxMUFGQTAwMDEwMEMwMDI0MDM1MgorOjEwMDk4MDAwQUZBMDAwMTQwODAwMTI2ODAwMDAwMDAwM0MwMjAwMDE0MworOjEwMDk5MDAwMjQ0MkE5RDQwMDAyMTEwMDAwMDIxMTgyM0MwMzA4MDA4NQorOjEwMDlBMDAwMDA0MzEwMjUzQzAxMDAwMUFDMjIxMjgwOTZFMjA0NkE0QgorOjEwMDlCMDAwMzA0MjAwMTAxNDQwMDAwOTAwMDAwMDAwOTZFMjA0N0E2MgorOjEwMDlDMDAwMzA0MjAwMTAxMDQwMDExMjAwMDAwMDAwOTZFMjA0NkE1QworOjEwMDlEMDAwMzA0MjAwMTAxMDQwMDAwNTNDMDIwNzAwOTZFMjA0N0EwNQorOjEwMDlFMDAwMzA0MjAwMTAxNDQwMDEwMjNDMDIwNzAwMzQ0MjMwMDA0MworOjEwMDlGMDAwQUZBMjAwMTg4RUUyMDYwODhGNDMwMjI4MjQ0MjAwMDFBRAorOjEwMEEwMDAwMzA0OTAwRkY1MTIzMDBFMkFGQTAwMDEwOEVFMjA2MDgzQgorOjEwMEExMDAwMDAwMjEwQzAwMDU3MTAyMThGQTMwMDE4OEZBNDAwMUNFMworOjEwMEEyMDAwQUM0MzA2MENBQzQ0MDYxMDhGODcwMTIwMjc2MjM4MDBDNworOjEwMEEzMDAwMjRFODAwMjAwMTAyMTAyQjUwNDAwMDAxMjc2ODMwMDBGQworOjEwMEE0MDAwOEY4MjAxMjgxMTAyMDAwNDAwMDAwMDAwOEY4MjAxMjQxRgorOjEwMEE1MDAwMTUwMjAwMDcwMDAwMTAyMThFRTIwMUE0MDAwMDMwMjFFMQorOjEwMEE2MDAwMjQ0MjAwMDFBRUUyMDFBNDA4MDAxMkVBOEVFMjAxQTREMQorOjEwMEE3MDAwOEVFNDA2MDgwMDA0MjBDMDAwODAxODIxOEVFNDA0MzBCMworOjEwMEE4MDAwOEVFNTA0MzQwMEEzMjgyMTAwQTMzMDJCMDA4MjIwMjEwRQorOjEwMEE5MDAwMDA4NjIwMjFBQ0U0MDAwMEFDRTUwMDA0OEVFMzA2MDhFQgorOjEwMEFBMDAwMjQwMjAwMDhBNEUyMDAwRTI0MDIwMDBEQUNFMjAwMThBQgorOjEwMEFCMDAwQUNFOTAwMUMwMDAzMThDMDI0NjMwNjBDMDJFMzEwMjFGQgorOjEwMEFDMDAwQUNFMjAwMDg4RUUyMDRDNEFDRTIwMDEwQUY4ODAxMjA2MgorOjEwMEFEMDAwOTJFMjRFMjAxNDQwMDAzNzI0MDYwMDAxOEVFMjRFMzA5MAorOjEwMEFFMDAwMDAwMjEwQzAyNDQyNTAzODAyRTIyMDIxOEM4MzAwMDAxMgorOjEwMEFGMDAwMjQwMjAwMDcxNDYyMDAxRjAwMDAwMDAwOEVFMzRFMzA0NQorOjEwMEIwMDAwOEVFMjRFMzQxMDYyMDAxQjI0MDMwMDQwOEM4MjAwMDRFRAorOjEwMEIxMDAwMjQ0MjAwMDFBQzgyMDAwNDhFRTI0RTM0OEVFNTRFMzA1OQorOjEwMEIyMDAwMjQ0MjAwMDExMDQzMDAwNzAwMDAwMDAwOEVFMjRFMzQxMgorOjEwMEIzMDAwMjQ0MjAwMDExMEEyMDAwNTAwMDAwMDAwMDgwMDEyRDRBOQorOjEwMEI0MDAwMDAwMDAwMDAxNEEwMDAwNTAwMDAwMDAwOEY4MjAxMjhCMgorOjEwMEI1MDAwMjQ0MjAwMjBBRjgyMDEyODhGODIwMTI4OEM4MjAwMDQ2OQorOjEwMEI2MDAwMkM0MjAwMTE1MDQwMDAxM0FDODAwMDAwMDgwMDEyRUEzMworOjEwMEI3MDAwMDAwMDAwMDA4RUUyNEUzMDI0MDMwMDQwMjQ0MjAwMDFCOQorOjEwMEI4MDAwNTA0MzAwMDMwMDAwMTAyMThFRTI0RTMwMjQ0MjAwMDE0OQorOjEwMEI5MDAwQUVFMjRFMzA4RUUyNEUzMDAwMDIxMEMwMjQ0MjUwMzg5OQorOjEwMEJBMDAwMDJFMjIwMjEyNDAyMDAwN0FDODIwMDAwMjQwMjAwMDE5RQorOjEwMEJCMDAwQUM4MjAwMDQ1NEMwMDAwQ0FFRTkwNjA4M0MwNDAwMDFGRAorOjEwMEJDMDAwMjQ4NDUxQzhBRkEwMDAxMEFGQTAwMDE0OEVFNjA2MDgyMAorOjEwMEJEMDAwOEY0NzAyMjgzQzA1MDAwOTBDMDAyNDAzMzRBNUYwMDBDRgorOjEwMEJFMDAwMDgwMDEzNkQwMDAwMDAwMDhGODMwMTIwMjc2MjM4MDA4OQorOjEwMEJGMDAwMjQ2NjAwMjAwMEMyMTAyQjUwNDAwMDAxMjc2NjMwMDAwMAorOjEwMEMwMDAwOEY4MjAxMjgxMEMyMDAwNDAwMDAwMDAwOEY4MjAxMjQ5RQorOjEwMEMxMDAwMTRDMjAwMDcwMDAwMDAwMDhFRTIwMUE0MDAwMDMwMjE5MQorOjEwMEMyMDAwMjQ0MjAwMDFBRUUyMDFBNDA4MDAxMzUxOEVFMjAxQTRBNworOjEwMEMzMDAwOEVFMjA2MDhBQzYyMDAxQzhFRTQwNEEwOEVFNTA0QTREQgorOjEwMEM0MDAwMjQ2MjAwMUNBQzYyMDAwODI0MDIwMDA4QTQ2MjAwMEVBQQorOjEwMEM1MDAwMjQwMjAwMTFBQzYyMDAxOEFDNjQwMDAwQUM2NTAwMDQxMgorOjEwMEM2MDAwOEVFMjA0QzRBQzYyMDAxMEFGODYwMTIwOTJFMjRFMjBGNgorOjEwMEM3MDAwMTQ0MDAwMzcyNDA2MDAwMThFRTI0RTMwMDAwMjEwQzBGRQorOjEwMEM4MDAwMjQ0MjUwMzgwMkUyMjAyMThDODMwMDAwMjQwMjAwMTIwQQorOjEwMEM5MDAwMTQ2MjAwMUYwMDAwMDAwMDhFRTM0RTMwOEVFMjRFMzRERQorOjEwMENBMDAwMTA2MjAwMUIyNDAzMDA0MDhDODIwMDA0MjQ0MjAwMDFENworOjEwMENCMDAwQUM4MjAwMDQ4RUUyNEUzNDhFRTU0RTMwMjQ0MjAwMDFCOAorOjEwMENDMDAwMTA0MzAwMDcwMDAwMDAwMDhFRTI0RTM0MjQ0MjAwMDE3MQorOjEwMENEMDAwMTBBMjAwMDUwMDAwMDAwMDA4MDAxMzNCMDAwMDAwMDAwNworOjEwMENFMDAwMTRBMDAwMDUwMDAwMDAwMDhGODIwMTI4MjQ0MjAwMjA4QgorOjEwMENGMDAwQUY4MjAxMjg4RjgyMDEyODhDODIwMDA0MkM0MjAwMTFDRgorOjEwMEQwMDAwNTA0MDAwMTNBQzgwMDAwMDA4MDAxMzUxMDAwMDAwMDBBOAorOjEwMEQxMDAwOEVFMjRFMzAyNDAzMDA0MDI0NDIwMDAxNTA0MzAwMDM4MQorOjEwMEQyMDAwMDAwMDEwMjE4RUUyNEUzMDI0NDIwMDAxQUVFMjRFMzAyRgorOjEwMEQzMDAwOEVFMjRFMzAwMDAyMTBDMDI0NDI1MDM4MDJFMjIwMjFFMAorOjEwMEQ0MDAwMjQwMjAwMTJBQzgyMDAwMDI0MDIwMDAxQUM4MjAwMDRFNAorOjEwMEQ1MDAwMTRDMDAwMUIwMDAwMDAwMDNDMDQwMDAxMjQ4NDUxRDA5QQorOjEwMEQ2MDAwQUZBMDAwMTBBRkEwMDAxNDhFRTYwNjA4OEY0NzAyMjgzRgorOjEwMEQ3MDAwM0MwNTAwMDkwQzAwMjQwMzM0QTVGMDAxOEVFMjAxQjAwQgorOjEwMEQ4MDAwMjQ0MjAwMDFBRUUyMDFCMDA4MDAxMzZEOEVFMjAxQjAxMgorOjEwMEQ5MDAwM0MwNDAwMDEyNDg0NTFEQ0FGQTAwMDE0OEVFNjA2MDg1OAorOjEwMERBMDAwOEY0NzAyMjgzQzA1MDAwOTBDMDAyNDAzMzRBNUYwMDVGOAorOjEwMERCMDAwOEVFMjAxQUMyNDQyMDAwMUFFRTIwMUFDOEVFMjAxQUM1NQorOjEwMERDMDAwOEVFMjAxNjAzQzA0MDAwMTI0ODQ1MUU4MzQwNUYwMDIwNQorOjEwMEREMDAwMjQ0MjAwMDFBRUUyMDE2MDhFRTIwMTYwMDAwMDMwMjE5OQorOjEwMERFMDAwMDAwMDM4MjFBRkEwMDAxMDBDMDAyNDAzQUZBMDAwMTRCNQorOjEwMERGMDAwOTZFNjA0N0E5NkU3MDQ2QTNDMDQwMDAxMjQ4NDUyMDBEMworOjEwMEUwMDAwMjQwNTAwMTJBRkEwMDAxMDBDMDAyNDAzQUZBMDAwMTRCMgorOjEwMEUxMDAwMEMwMDQ1MDAwMDAwMDAwMDBDMDAyMzE4MDAwMDAwMDAzQQorOjEwMEUyMDAwM0MwNjAwMDEzNEM2MzgwMEFFRTAwNjA4QUY0MDAyMjg5OAorOjEwMEUzMDAwQUY0MDAyMkM5NkUzMDQ1ODhFRTQwMDAwM0MwNTEyRDgyMworOjEwMEU0MDAwMzRBNUMzNTgyNzYyMzgwMEFFRTI3MjU4Mjc2MjM4MDBEMgorOjEwMEU1MDAwQUVFMjcyNjAyNzYyMzgwMEFFRTI3MjY0MDM2NjEwMjE2RgorOjEwMEU2MDAwQUVFMjcyNzAyNDAyRkZGRkFFRTAwNEQ0QUVFMDA0RTAxNAorOjEwMEU3MDAwQUVFMDA0RTRBRUUwMDRGMEEyRTAwNEY0QUVFMDBFMEM1OAorOjEwMEU4MDAwQUVFMDBFMThBRUUwMEUxMEFFRTAwRTE0QUVFMDBFMUM5QQorOjEwMEU5MDAwQUVFMDcyNENBRUUwNTI0NEFFRTA1MjQwQUVFMDUyM0NBNgorOjEwMEVBMDAwQUVFMDcyNTBBRUUwNzI1NEFFRTA3MjVDQUVFMDcyNjhEQQorOjEwMEVCMDAwQUVFMDA0RDAyNDYzRkZGRjAwODUyMDI1QUVFMzA0RjhGNAorOjEwMEVDMDAwQUVFNDAwMDBBRjgwMDA2MEFGODIwMDY0M0MwMjAxMDAyRAorOjEwMEVEMDAwQUZBMjAwMTg4RUUyMDYwODhGNDMwMjI4MjQ0MjAwMDFDOAorOjEwMEVFMDAwMzA0OTAwRkY1MTIzMDBFMkFGQTAwMDEwOEVFMjA2MDg1NworOjEwMEVGMDAwMDAwMjEwQzAwMDU3MTAyMThGQTMwMDE4OEZBNDAwMUNGRgorOjEwMEYwMDAwQUM0MzA2MENBQzQ0MDYxMDhGODcwMTIwMjc2MjM4MDBFMgorOjEwMEYxMDAwMjRFODAwMjAwMTAyMTAyQjUwNDAwMDAxMjc2ODMwMDAxNworOjEwMEYyMDAwOEY4MjAxMjgxMTAyMDAwNDAwMDAwMDAwOEY4MjAxMjQzQQorOjEwMEYzMDAwMTUwMjAwMDcwMDAwMTAyMThFRTIwMUE0MDAwMDMwMjFGQworOjEwMEY0MDAwMjQ0MjAwMDFBRUUyMDFBNDA4MDAxNDIyOEVFMjAxQTRCMgorOjEwMEY1MDAwOEVFNDA2MDgwMDA0MjBDMDAwODAxODIxOEVFNDA0MzBDRQorOjEwMEY2MDAwOEVFNTA0MzQwMEEzMjgyMTAwQTMzMDJCMDA4MjIwMjEyOQorOjEwMEY3MDAwMDA4NjIwMjFBQ0U0MDAwMEFDRTUwMDA0OEVFMzA2MDgwNgorOjEwMEY4MDAwMjQwMjAwMDhBNEUyMDAwRTI0MDIwMDBEQUNFMjAwMThDNgorOjEwMEY5MDAwQUNFOTAwMUMwMDAzMThDMDI0NjMwNjBDMDJFMzEwMjExNgorOjEwMEZBMDAwQUNFMjAwMDg4RUUyMDRDNEFDRTIwMDEwQUY4ODAxMjA3RAorOjEwMEZCMDAwOTJFMjRFMjAxNDQwMDAzNzI0MDYwMDAxOEVFMjRFMzBBQgorOjEwMEZDMDAwMDAwMjEwQzAyNDQyNTAzODAyRTIyMDIxOEM4MzAwMDAyRAorOjEwMEZEMDAwMjQwMjAwMDcxNDYyMDAxRjAwMDAwMDAwOEVFMzRFMzA2MAorOjEwMEZFMDAwOEVFMjRFMzQxMDYyMDAxQjI0MDMwMDQwOEM4MjAwMDQwOQorOjEwMEZGMDAwMjQ0MjAwMDFBQzgyMDAwNDhFRTI0RTM0OEVFNTRFMzA3NQorOjEwMTAwMDAwMjQ0MjAwMDExMDQzMDAwNzAwMDAwMDAwOEVFMjRFMzQyRAorOjEwMTAxMDAwMjQ0MjAwMDExMEEyMDAwNTAwMDAwMDAwMDgwMDE0MEM4QQorOjEwMTAyMDAwMDAwMDAwMDAxNEEwMDAwNTAwMDAwMDAwOEY4MjAxMjhDRAorOjEwMTAzMDAwMjQ0MjAwMjBBRjgyMDEyODhGODIwMTI4OEM4MjAwMDQ4NAorOjEwMTA0MDAwMkM0MjAwMTE1MDQwMDAxM0FDODAwMDAwMDgwMDE0MjIxNAorOjEwMTA1MDAwMDAwMDAwMDA4RUUyNEUzMDI0MDMwMDQwMjQ0MjAwMDFENAorOjEwMTA2MDAwNTA0MzAwMDMwMDAwMTAyMThFRTI0RTMwMjQ0MjAwMDE2NAorOjEwMTA3MDAwQUVFMjRFMzA4RUUyNEUzMDAwMDIxMEMwMjQ0MjUwMzhCNAorOjEwMTA4MDAwMDJFMjIwMjEyNDAyMDAwN0FDODIwMDAwMjQwMjAwMDFCOQorOjEwMTA5MDAwQUM4MjAwMDQ1NEMwMDAwQ0FFRTkwNjA4M0MwNDAwMDExOAorOjEwMTBBMDAwMjQ4NDUxQzhBRkEwMDAxMEFGQTAwMDE0OEVFNjA2MDgzQgorOjEwMTBCMDAwOEY0NzAyMjgzQzA1MDAwOTBDMDAyNDAzMzRBNUYwMDBFQQorOjEwMTBDMDAwMDgwMDE0QTUwMDAwMDAwMDhGODMwMTIwMjc2MjM4MDA2QgorOjEwMTBEMDAwMjQ2NjAwMjAwMEMyMTAyQjUwNDAwMDAxMjc2NjMwMDAxQgorOjEwMTBFMDAwOEY4MjAxMjgxMEMyMDAwNDAwMDAwMDAwOEY4MjAxMjRCQQorOjEwMTBGMDAwMTRDMjAwMDcwMDAwMDAwMDhFRTIwMUE0MDAwMDMwMjFBRAorOjEwMTEwMDAwMjQ0MjAwMDFBRUUyMDFBNDA4MDAxNDg5OEVFMjAxQTQ4OQorOjEwMTExMDAwOEVFMjA2MDhBQzYyMDAxQzhFRTQwNEEwOEVFNTA0QTRGNgorOjEwMTEyMDAwMjQ2MjAwMUNBQzYyMDAwODI0MDIwMDA4QTQ2MjAwMEVDNQorOjEwMTEzMDAwMjQwMjAwMTFBQzYyMDAxOEFDNjQwMDAwQUM2NTAwMDQyRAorOjEwMTE0MDAwOEVFMjA0QzRBQzYyMDAxMEFGODYwMTIwOTJFMjRFMjAxMQorOjEwMTE1MDAwMTQ0MDAwMzcyNDA2MDAwMThFRTI0RTMwMDAwMjEwQzAxOQorOjEwMTE2MDAwMjQ0MjUwMzgwMkUyMjAyMThDODMwMDAwMjQwMjAwMTIyNQorOjEwMTE3MDAwMTQ2MjAwMUYwMDAwMDAwMDhFRTM0RTMwOEVFMjRFMzRGOQorOjEwMTE4MDAwMTA2MjAwMUIyNDAzMDA0MDhDODIwMDA0MjQ0MjAwMDFGMgorOjEwMTE5MDAwQUM4MjAwMDQ4RUUyNEUzNDhFRTU0RTMwMjQ0MjAwMDFEMworOjEwMTFBMDAwMTA0MzAwMDcwMDAwMDAwMDhFRTI0RTM0MjQ0MjAwMDE4QworOjEwMTFCMDAwMTBBMjAwMDUwMDAwMDAwMDA4MDAxNDczMDAwMDAwMDBFOQorOjEwMTFDMDAwMTRBMDAwMDUwMDAwMDAwMDhGODIwMTI4MjQ0MjAwMjBBNgorOjEwMTFEMDAwQUY4MjAxMjg4RjgyMDEyODhDODIwMDA0MkM0MjAwMTFFQQorOjEwMTFFMDAwNTA0MDAwMTNBQzgwMDAwMDA4MDAxNDg5MDAwMDAwMDA4QgorOjEwMTFGMDAwOEVFMjRFMzAyNDAzMDA0MDI0NDIwMDAxNTA0MzAwMDM5RAorOjEwMTIwMDAwMDAwMDEwMjE4RUUyNEUzMDI0NDIwMDAxQUVFMjRFMzA0QQorOjEwMTIxMDAwOEVFMjRFMzAwMDAyMTBDMDI0NDI1MDM4MDJFMjIwMjFGQgorOjEwMTIyMDAwMjQwMjAwMTJBQzgyMDAwMDI0MDIwMDAxQUM4MjAwMDRGRgorOjEwMTIzMDAwMTRDMDAwMUIwMDAwMDAwMDNDMDQwMDAxMjQ4NDUxRDBCNQorOjEwMTI0MDAwQUZBMDAwMTBBRkEwMDAxNDhFRTYwNjA4OEY0NzAyMjg1QQorOjEwMTI1MDAwM0MwNTAwMDkwQzAwMjQwMzM0QTVGMDAxOEVFMjAxQjAyNgorOjEwMTI2MDAwMjQ0MjAwMDFBRUUyMDFCMDA4MDAxNEE1OEVFMjAxQjBGNAorOjEwMTI3MDAwM0MwNDAwMDEyNDg0NTFEQ0FGQTAwMDE0OEVFNjA2MDg3MworOjEwMTI4MDAwOEY0NzAyMjgzQzA1MDAwOTBDMDAyNDAzMzRBNUYwMDUxMworOjEwMTI5MDAwOEVFMjAxQUMyNDQyMDAwMUFFRTIwMUFDOEVFMjAxQUM3MAorOjEwMTJBMDAwOEVFMjAxNTQyNDQyMDAwMUFFRTIwMTU0MEMwMDE0REMzMQorOjEwMTJCMDAwOEVFMjAxNTQ4RjgyMDBBMDMwNDIwMDA0MTQ0MEZGRkRGMgorOjEwMTJDMDAwMDAwMDAwMDA4RjgyMDA0MDMwNDIwMDAxMTQ0MDAwMDhGRQorOjEwMTJEMDAwMDAwMDAwMDA4RjQzMDEwNDI0MDIwMDAxMTA2MjAwMDQ5QQorOjEwMTJFMDAwMDAwMDAwMDA4RjQyMDI2NDEwNDAwMDA2MDAwMDAwMDA3MQorOjEwMTJGMDAwOEVFMjAxN0MyNDQyMDAwMUFFRTIwMTdDMDgwMDE0QzVBQworOjEwMTMwMDAwOEVFMjAxN0M4RjgyMDA0NDM0NDIwMDA0QUY4MjAwNDRBQworOjEwMTMxMDAwOEVFMjAxNzgyNDQyMDAwMUFFRTIwMTc4OEVFMjAxNzg4QgorOjEwMTMyMDAwOEY4MjAwRDg4RjgzMDBENDAwNDMxMDIzQUVFMjcyNkMwQQorOjEwMTMzMDAwOEVFMjcyNkMxQzQwMDAwMzNDMDMwMDAxMDA0MzEwMjE0QworOjEwMTM0MDAwQUVFMjcyNkMwQzAwNDA2NDAwMDAwMDAwMEMwMDQ0NDBFRgorOjEwMTM1MDAwQUY4MDAyMjg4RkJGMDAyNDhGQjAwMDIwMDNFMDAwMDg3OAorOjEwMTM2MDAwMjdCRDAwMjgwM0UwMDAwODAwMDAwMDAwMDNFMDAwMDg5QgorOjEwMTM3MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMjQwMjAwMkMxQgorOjEwMTM4MDAwQUY4MjAwNTBBRUUwNzI3NDhGNDIwMjM4QUVFMjcyNzhFMworOjEwMTM5MDAwOEY4MjAwNTQyNDQyMDA2N0FGODIwMDU4QUVFMDdCODgwMQorOjEwMTNBMDAwQUVFMDdCOENBRUUwN0I4NDNDMDEwMDAxMDAzNzA4MjE3RAorOjEwMTNCMDAwQUMyMDgzQkMzQzAxMDAwMTAwMzcwODIxMDNFMDAwMDg5OQorOjEwMTNDMDAwQTAyMDgzQjkyN0JERkZEOEFGQkYwMDI0QUZCMDAwMjA1NQorOjEwMTNEMDAwOEY4MjAwNTQzQzAzMDAwMThDNjM1Q0Q4MjQ0MjAwNjc3OAorOjEwMTNFMDAwMTA2MDAwMERBRjgyMDA1ODNDMDIwMDAxMDA1NzEwMjEzMAorOjEwMTNGMDAwOTA0MjgzQjgxMDQwMDAwNTNDMDMwMjAwM0MwMTAwMDEwQworOjEwMTQwMDAwMDAzNzA4MjEwODAwMTUwM0EwMjA4M0I4OEVFMjAwMDBGMQorOjEwMTQxMDAwMDA0MzEwMjVBRUUyMDAwMDhGNDIwMjE4MzA0MjAxMDA2NgorOjEwMTQyMDAwMTA0MDAwQzYwMDAwMDAwMDhGODIwMEIwMzA0MjAwMDQ2RgorOjEwMTQzMDAwMTA0MDAwQzIwMDAwMDAwMDNDMDMwMDAxMDA3NzE4MjFBQQorOjEwMTQ0MDAwOEM2MzgzRDA4RjgyMDEwNDE0NjIwMEI0MDAwMDAwMDAxQQorOjEwMTQ1MDAwM0MwMzAwMDEwMDc3MTgyMThDNjM4M0Q0OEY4MjAwQjQ5MQorOjEwMTQ2MDAwMTQ2MjAwQUUwMDAwMDAwMDhGODIwMEIwM0MwMzAwODBEOAorOjEwMTQ3MDAwMDA0MzEwMjQxMDQwMDAwRDAwMDAwMDAwOEY4MjAxMUM2QQorOjEwMTQ4MDAwMzQ0MjAwMDJBRjgyMDExQzhGODIwMEIwMjQwM0ZGRkJCNAorOjEwMTQ5MDAwMDA0MzEwMjRBRjgyMDBCMDhGODIwMTFDMjQwM0ZGRkRBMworOjEwMTRBMDAwMDA0MzEwMjQwODAwMTVDQ0FGODIwMTFDM0MwMzAwMDE0RQorOjEwMTRCMDAwMDA3NzE4MjE4QzYzODNEMDhGODIwMTA0MTQ2MjAwODIyQworOjEwMTRDMDAwMDAwMDAwMDAzQzAzMDAwMTAwNzcxODIxOEM2MzgzRDRFNgorOjEwMTREMDAwOEY4MjAwQjQxNDYyMDA3QzAwMDAwMDAwM0MwNzAwMDExMQorOjEwMTRFMDAwMDBGNzM4MjE4Q0U3ODNEMDhGODIwMEIwM0MwNDAwMDFFNAorOjEwMTRGMDAwMjQ4NDUyNzBBRkEwMDAxNEFGQTIwMDEwOEY4NjAwQjBGOQorOjEwMTUwMDAwM0MwNTAwMDUwQzAwMjQwMzM0QTUwOTAwOEY4MjAxMUM1MgorOjEwMTUxMDAwMzQ0MjAwMDJBRjgyMDExQzhGODMwMTA0OEY4MjAwQjAyRAorOjEwMTUyMDAwMzQ0MjAwMDFBRjgyMDBCMEFGODMwMTA0OEY4MzAxMjBGOQorOjEwMTUzMDAwMjc2MjM4MDAyNDY2MDAyMDAwQzIxMDJCNTA0MDAwMDFCMgorOjEwMTU0MDAwMjc2NjMwMDA4RjgyMDEyODEwQzIwMDA0MDAwMDAwMDBDRQorOjEwMTU1MDAwOEY4MjAxMjQxNEMyMDAwNjAwMDAwMDAwOEVFMjAxQTQ2NAorOjEwMTU2MDAwMjQ0MjAwMDFBRUUyMDFBNDA4MDAxNUEwOEVFMjAxQTQwRAorOjEwMTU3MDAwOEY0NDAyMDg4RjQ1MDIwQzI2RTIwMDMwQUM2MjAwMDg1RQorOjEwMTU4MDAwMjQwMjA0MDBBNDYyMDAwRTI0MDIwMDBGQUM2MjAwMThDMgorOjEwMTU5MDAwQUM2MDAwMUNBQzY0MDAwMEFDNjUwMDA0OEVFMjA0QzRDNgorOjEwMTVBMDAwQUM2MjAwMTBBRjg2MDEyMDkyRTI0RTIwMTQ0MDAwMzc1QQorOjEwMTVCMDAwMDAwMDAwMDA4RUUyNEUzMDAwMDIxMEMwMjQ0MjUwMzg3RAorOjEwMTVDMDAwMDJFMjIwMjE4QzgzMDAwMDI0MDIwMDA3MTQ2MjAwMUYyNQorOjEwMTVEMDAwMDAwMDAwMDA4RUUzNEUzMDhFRTI0RTM0MTA2MjAwMUI5RAorOjEwMTVFMDAwMjQwMzAwNDA4QzgyMDAwNDI0NDIwMDAxQUM4MjAwMDRFOQorOjEwMTVGMDAwOEVFMjRFMzQ4RUU1NEUzMDI0NDIwMDAxMTA0MzAwMDc0NworOjEwMTYwMDAwMDAwMDAwMDA4RUUyNEUzNDI0NDIwMDAxMTBBMjAwMDVDQQorOjEwMTYxMDAwMDAwMDAwMDAwODAwMTU4QTAwMDAwMDAwMTRBMDAwMDU2QQorOjEwMTYyMDAwMDAwMDAwMDA4RjgyMDEyODI0NDIwMDIwQUY4MjAxMjhBMAorOjEwMTYzMDAwOEY4MjAxMjg4QzgyMDAwNDJDNDIwMDExNTA0MDAwMTMzQworOjEwMTY0MDAwQUM4MDAwMDAwODAwMTVBMDAwMDAwMDAwOEVFMjRFMzBDMworOjEwMTY1MDAwMjQwMzAwNDAyNDQyMDAwMTUwNDMwMDAzMDAwMDEwMjFGNQorOjEwMTY2MDAwOEVFMjRFMzAyNDQyMDAwMUFFRTI0RTMwOEVFMjRFMzAyOQorOjEwMTY3MDAwMDAwMjEwQzAyNDQyNTAzODAyRTIyMDIxMjQwMjAwMDc1OAorOjEwMTY4MDAwQUM4MjAwMDAyNDAyMDAwMUFDODIwMDA0OEY4MjAxMUNBNQorOjEwMTY5MDAwMjQwM0ZGRkQwMDQzMTAyNEFGODIwMTFDOEVFMjAxRTQwRAorOjEwMTZBMDAwM0MwNzAwMDEwMEY3MzgyMThDRTc4M0QwMjQ0MjAwMDE3OQorOjEwMTZCMDAwQUVFMjAxRTQ4RUUyMDFFNDNDMDQwMDAxMjQ4NDUyN0NBOQorOjEwMTZDMDAwMDgwMDE1QkRBRkEwMDAxMDhGODIwMTA0M0MwMTAwMDE4RAorOjEwMTZEMDAwMDAzNzA4MjFBQzIyODNEMDhGODIwMEI0M0MwNzAwMDE4MAorOjEwMTZFMDAwMDBGNzM4MjE4Q0U3ODNEMDNDMDQwMDAxMjQ4NDUyODQyNQorOjEwMTZGMDAwM0MwMTAwMDEwMDM3MDgyMUFDMjI4M0Q0QUZBMDAwMTBDOAorOjEwMTcwMDAwQUZBMDAwMTQ4Rjg2MDBCMDNDMDUwMDA1MEMwMDI0MDMzOAorOjEwMTcxMDAwMzRBNTA5MDAwODAwMTVDQzAwMDAwMDAwOEY4MjAxMDRFOAorOjEwMTcyMDAwM0MwMTAwMDEwMDM3MDgyMUFDMjI4M0QwOEY4MjAwQjQzNQorOjEwMTczMDAwM0MwMTAwMDEwMDM3MDgyMUFDMjI4M0Q0OEVFMjcyNzQ5MAorOjEwMTc0MDAwOTJFMzA0RjQyNDQyMDA2NzE0NjAwMDA2QUVFMjcyNzQ2RgorOjEwMTc1MDAwOEVFMjcyNzQ4RjQzMDIzNDAwNDMxMDJCMTQ0MDAwN0JERQorOjEwMTc2MDAwMDAwMDAwMDA4RUUzMDRFNDhFRTIwNEY4MTQ2MjAwMDQzQQorOjEwMTc3MDAwMDAwMDAwMDA5MkUyMDRGNDUwNDAwMDc0QTJFMDA0RjQ3RgorOjEwMTc4MDAwOEY4MzAxMjAyNzYyMzgwMDI0NjYwMDIwMDBDMjEwMkJCRQorOjEwMTc5MDAwNTA0MDAwMDEyNzY2MzAwMDhGODIwMTI4MTBDMjAwMDRFQgorOjEwMTdBMDAwMDAwMDAwMDA4RjgyMDEyNDE0QzIwMDA3MDAwMDAwMDAyNgorOjEwMTdCMDAwOEVFMjAxQTQwMDAwODAyMTI0NDIwMDAxQUVFMjAxQTRENworOjEwMTdDMDAwMDgwMDE2Mzc4RUUyMDFBNDhFRTIwNEU0QUM2MjAwMUMyRAorOjEwMTdEMDAwOEVFNDA0QjA4RUU1MDRCNDI0NjIwMDFDQUM2MjAwMDgwMAorOjEwMTdFMDAwMjQwMjAwMDhBNDYyMDAwRTI0MDIwMDExQUM2MjAwMTg1QQorOjEwMTdGMDAwQUM2NDAwMDBBQzY1MDAwNDhFRTIwNEM0QUM2MjAwMTA2RQorOjEwMTgwMDAwQUY4NjAxMjA5MkUyNEUyMDE0NDAwMDM3MjQxMDAwMDFFMAorOjEwMTgxMDAwOEVFMjRFMzAwMDAyMTBDMDI0NDI1MDM4MDJFMjIwMjFGNQorOjEwMTgyMDAwOEM4MzAwMDAyNDAyMDAxMjE0NjIwMDFGMDAwMDAwMDBEQworOjEwMTgzMDAwOEVFMzRFMzA4RUUyNEUzNDEwNjIwMDFCMjQwMzAwNDBEMworOjEwMTg0MDAwOEM4MjAwMDQyNDQyMDAwMUFDODIwMDA0OEVFMjRFMzRGQgorOjEwMTg1MDAwOEVFNTRFMzAyNDQyMDAwMTEwNDMwMDA3MDAwMDAwMDBENgorOjEwMTg2MDAwOEVFMjRFMzQyNDQyMDAwMTEwQTIwMDA1MDAwMDAwMDA2OAorOjEwMTg3MDAwMDgwMDE2MjEwMDAwMDAwMDE0QTAwMDA1MDAwMDAwMDA3MAorOjEwMTg4MDAwOEY4MjAxMjgyNDQyMDAyMEFGODIwMTI4OEY4MjAxMjgwNAorOjEwMTg5MDAwOEM4MjAwMDQyQzQyMDAxMTUwNDAwMDEzQUM4MDAwMDBFOAorOjEwMThBMDAwMDgwMDE2MzcwMDAwMDAwMDhFRTI0RTMwMjQwMzAwNDA4RQorOjEwMThCMDAwMjQ0MjAwMDE1MDQzMDAwMzAwMDAxMDIxOEVFMjRFMzAwQworOjEwMThDMDAwMjQ0MjAwMDFBRUUyNEUzMDhFRTI0RTMwMDAwMjEwQzBFMworOjEwMThEMDAwMjQ0MjUwMzgwMkUyMjAyMTI0MDIwMDEyQUM4MjAwMDA4RgorOjEwMThFMDAwMjQwMjAwMDFBQzgyMDAwNDU2MDAwMDBCMjQxMDAwMDEwOQorOjEwMThGMDAwOEVFMjA0RTQzQzA0MDAwMTI0ODQ1MjhDQUZBMDAwMTQ2NgorOjEwMTkwMDAwQUZBMjAwMTA4RUU2MDYwODhGNDcwMjI4M0MwNTAwMDlBQQorOjEwMTkxMDAwMEMwMDI0MDMzNEE1RjAwNjE2MDAwMDAzMjQwMjAwMDE4NQorOjEwMTkyMDAwMDgwMDE2NTBBMkUyMDRGNDhFRTIwMTcwMjQ0MjAwMDE4NQorOjEwMTkzMDAwQUVFMjAxNzA4RUUyMDE3MDhFRTIwNEU0QTJFMDA0RjRGMworOjEwMTk0MDAwQUVFMDA0RjBBRUUwNzI3NEFFRTIwNEY4OEVFMjBFMUM3QgorOjEwMTk1MDAwMTA0MDAwNkQwMDAwMDAwMDhGODMwMTIwMjc2MjM4MDBENgorOjEwMTk2MDAwMjQ2NjAwMjAwMEMyMTAyQjUwNDAwMDAxMjc2NjMwMDA4MgorOjEwMTk3MDAwOEY4MjAxMjgxMEMyMDAwNDAwMDAwMDAwOEY4MjAxMjQyMQorOjEwMTk4MDAwMTRDMjAwMDcwMDAwMDAwMDhFRTIwMUE0MDAwMDgwMjFDNAorOjEwMTk5MDAwMjQ0MjAwMDFBRUUyMDFBNDA4MDAxNkFEOEVFMjAxQTRDQgorOjEwMTlBMDAwOEVFMjcyNENBQzYyMDAxQzhFRTQwNEE4OEVFNTA0QUM5RQorOjEwMTlCMDAwMjQ2MjAwMUNBQzYyMDAwODI0MDIwMDA4QTQ2MjAwMEUyRAorOjEwMTlDMDAwMjQwMjAwMTFBQzYyMDAxOEFDNjQwMDAwQUM2NTAwMDQ5NQorOjEwMTlEMDAwOEVFMjA0QzRBQzYyMDAxMEFGODYwMTIwOTJFMjRFMjA3OQorOjEwMTlFMDAwMTQ0MDAwMzcyNDEwMDAwMThFRTI0RTMwMDAwMjEwQzA3NworOjEwMTlGMDAwMjQ0MjUwMzgwMkUyMjAyMThDODMwMDAwMjQwMjAwMTI4RAorOjEwMUEwMDAwMTQ2MjAwMUYwMDAwMDAwMDhFRTM0RTMwOEVFMjRFMzQ2MAorOjEwMUExMDAwMTA2MjAwMUIyNDAzMDA0MDhDODIwMDA0MjQ0MjAwMDE1OQorOjEwMUEyMDAwQUM4MjAwMDQ4RUUyNEUzNDhFRTU0RTMwMjQ0MjAwMDEzQQorOjEwMUEzMDAwMTA0MzAwMDcwMDAwMDAwMDhFRTI0RTM0MjQ0MjAwMDFGMworOjEwMUE0MDAwMTBBMjAwMDUwMDAwMDAwMDA4MDAxNjk3MDAwMDAwMDAyQQorOjEwMUE1MDAwMTRBMDAwMDUwMDAwMDAwMDhGODIwMTI4MjQ0MjAwMjAwRAorOjEwMUE2MDAwQUY4MjAxMjg4RjgyMDEyODhDODIwMDA0MkM0MjAwMTE1MQorOjEwMUE3MDAwNTA0MDAwMTNBQzgwMDAwMDA4MDAxNkFEMDAwMDAwMDBDQworOjEwMUE4MDAwOEVFMjRFMzAyNDAzMDA0MDI0NDIwMDAxNTA0MzAwMDMwNAorOjEwMUE5MDAwMDAwMDEwMjE4RUUyNEUzMDI0NDIwMDAxQUVFMjRFMzBCMgorOjEwMUFBMDAwOEVFMjRFMzAwMDAyMTBDMDI0NDI1MDM4MDJFMjIwMjE2MworOjEwMUFCMDAwMjQwMjAwMTJBQzgyMDAwMDI0MDIwMDAxQUM4MjAwMDQ2NworOjEwMUFDMDAwNTYwMDAwMEIyNDEwMDAwMThFRTI3MjRDM0MwNDAwMDExMQorOjEwMUFEMDAwMjQ4NDUyOThBRkEwMDAxNEFGQTIwMDEwOEVFNjcyNEM3RQorOjEwMUFFMDAwOEY0NzAyODAzQzA1MDAwOTBDMDAyNDAzMzRBNUYwMDg1MAorOjEwMUFGMDAwNTYwMDAwMDFBRUUwMEUxQzhFRTIwMTc0MjQ0MjAwMDE4QgorOjEwMUIwMDAwQUVFMjAxNzQ4RUUyMDE3NDhFRTI0RTI0MTA0MDAwMTlBMAorOjEwMUIxMDAwMDAwMDAwMDBBRUUwNEUyNDhGODIwMDQwMzA0MjAwMDEwMQorOjEwMUIyMDAwMTQ0MDAwMDgwMDAwMDAwMDhGNDMwMTA0MjQwMjAwMDE1QgorOjEwMUIzMDAwMTA2MjAwMDQwMDAwMDAwMDhGNDIwMjY0MTA0MDAwMDZBMgorOjEwMUI0MDAwMDAwMDAwMDA4RUUyMDE3QzI0NDIwMDAxQUVFMjAxN0MzNAorOjEwMUI1MDAwMDgwMDE2REE4RUUyMDE3QzhGODIwMDQ0MzQ0MjAwMDREMQorOjEwMUI2MDAwQUY4MjAwNDQ4RUUyMDE3ODI0NDIwMDAxQUVFMjAxNzhBNworOjEwMUI3MDAwOEVFMjAxNzg4RUUyNzI3ODI0NDJGRjk5QUVFMjcyNzhBQQorOjEwMUI4MDAwOEVFMjcyNzgxQzQwMDJBRDAwMDAwMDAwOEY0MjAyMzhFNQorOjEwMUI5MDAwMTA0MDAyQUEwMDAwMDAwMDNDMDIwMDAxMDA1NzEwMjE4MgorOjEwMUJBMDAwOTA0MjgzRTAxNDQwMDJBNTAwMDAwMDAwOEY0MjAwODBCNAorOjEwMUJCMDAwQUVFMjAwNEM4RjQyMDBDMEFFRTIwMDQ4OEY0MjAwODQ4QgorOjEwMUJDMDAwQUVFMjAwMzg4RjQyMDA4NEFFRTIwMjQ0OEY0MjAwODhDOQorOjEwMUJEMDAwQUVFMjAyNDg4RjQyMDA4Q0FFRTIwMjRDOEY0MjAwOTA4RgorOjEwMUJFMDAwQUVFMjAyNTA4RjQyMDA5NEFFRTIwMjU0OEY0MjAwOTg1RgorOjEwMUJGMDAwQUVFMjAyNTg4RjQyMDA5Q0FFRTIwMjVDOEY0MjAwQTAyRgorOjEwMUMwMDAwQUVFMjAyNjA4RjQyMDBBNEFFRTIwMjY0OEY0MjAwQThGRQorOjEwMUMxMDAwQUVFMjAyNjg4RjQyMDBBQ0FFRTIwMjZDOEY0MjAwQjBDRQorOjEwMUMyMDAwQUVFMjAyNzA4RjQyMDBCNEFFRTIwMjc0OEY0MjAwQjg5RQorOjEwMUMzMDAwQUVFMjAyNzg4RjQyMDBCQzI0MDQwMDAxQUVFMjAyN0NENgorOjEwMUM0MDAwQUVFMDAwM0MwMDA0MTA4MDAwNTcxMDIxOEVFMzAwM0MwMQorOjEwMUM1MDAwOEM0MjAyNDQyNDg0MDAwMTAwNjIxODIxMkM4MjAwMEY2RgorOjEwMUM2MDAwQUVFMzAwM0MxNDQwRkZGODAwMDQxMDgwOEY0MjAwQ0MyQgorOjEwMUM3MDAwQUVFMjAwNTA4RjQyMDBEMEFFRTIwMDU0OEY4MzAxMjBDQworOjEwMUM4MDAwMjc2MjM4MDAyNDY2MDAyMDAwQzIxMDJCNTA0MDAwMDE1QgorOjEwMUM5MDAwMjc2NjMwMDA4RjgyMDEyODEwQzIwMDA0MDAwMDAwMDA3NworOjEwMUNBMDAwOEY4MjAxMjQxNEMyMDAwNzAwMDAwMDAwOEVFMjAxQTQwQworOjEwMUNCMDAwMDAwMDgwMjEyNDQyMDAwMUFFRTIwMUE0MDgwMDE3NzU1MworOjEwMUNDMDAwOEVFMjAxQTQ4RjQ0MDIwODhGNDUwMjBDMjZFMjAwMzAwOAorOjEwMUNEMDAwQUM2MjAwMDgyNDAyMDQwMEE0NjIwMDBFMjQwMjAwMEY3QgorOjEwMUNFMDAwQUM2MjAwMThBQzYwMDAxQ0FDNjQwMDAwQUM2NTAwMDQ4MQorOjEwMUNGMDAwOEVFMjA0QzRBQzYyMDAxMEFGODYwMTIwOTJFMjRFMjA1NgorOjEwMUQwMDAwMTQ0MDAwMzcyNDEwMDAwMThFRTI0RTMwMDAwMjEwQzA1MworOjEwMUQxMDAwMjQ0MjUwMzgwMkUyMjAyMThDODMwMDAwMjQwMjAwMDc3NAorOjEwMUQyMDAwMTQ2MjAwMUYwMDAwMDAwMDhFRTM0RTMwOEVFMjRFMzQzRAorOjEwMUQzMDAwMTA2MjAwMUIyNDAzMDA0MDhDODIwMDA0MjQ0MjAwMDEzNgorOjEwMUQ0MDAwQUM4MjAwMDQ4RUUyNEUzNDhFRTU0RTMwMjQ0MjAwMDExNworOjEwMUQ1MDAwMTA0MzAwMDcwMDAwMDAwMDhFRTI0RTM0MjQ0MjAwMDFEMAorOjEwMUQ2MDAwMTBBMjAwMDUwMDAwMDAwMDA4MDAxNzVGMDAwMDAwMDAzRQorOjEwMUQ3MDAwMTRBMDAwMDUwMDAwMDAwMDhGODIwMTI4MjQ0MjAwMjBFQQorOjEwMUQ4MDAwQUY4MjAxMjg4RjgyMDEyODhDODIwMDA0MkM0MjAwMTEyRQorOjEwMUQ5MDAwNTA0MDAwMTNBQzgwMDAwMDA4MDAxNzc1MDAwMDAwMDBFMAorOjEwMURBMDAwOEVFMjRFMzAyNDAzMDA0MDI0NDIwMDAxNTA0MzAwMDNFMQorOjEwMURCMDAwMDAwMDEwMjE4RUUyNEUzMDI0NDIwMDAxQUVFMjRFMzA4RgorOjEwMURDMDAwOEVFMjRFMzAwMDAyMTBDMDI0NDI1MDM4MDJFMjIwMjE0MAorOjEwMUREMDAwMjQwMjAwMDdBQzgyMDAwMDI0MDIwMDAxQUM4MjAwMDQ0RgorOjEwMURFMDAwMTIwMDAyMTIzQzAyMDQwMEFGQTIwMDE4M0MwMjAwMDFFMworOjEwMURGMDAwMDA1NzEwMjE5MDQyODNCMDEwNDAwMTBCMDAwMDAwMDBGQQorOjEwMUUwMDAwOEVFMjA2MDg4RjQzMDIyODI0NDIwMDAxMzA0QTAwRkY3OAorOjEwMUUxMDAwNTE0MzAwRkRBRkEwMDAxMDhFRTIwNjA4MDAwMjEwQzA4MgorOjEwMUUyMDAwMDA1NzEwMjE4RkEzMDAxODhGQTQwMDFDQUM0MzA2MEM5MAorOjEwMUUzMDAwQUM0NDA2MTA4RjgzMDA1NDhGODIwMDU0MjQ2OTAwMzIxMgorOjEwMUU0MDAwMDEyMjEwMjMyQzQyMDAzMzEwNDAwMDZBMDAwMDU4MjE2OAorOjEwMUU1MDAwMjQxODAwMDgyNDBGMDAwRDI0MEQwMDA3MjQwQzAwNDA1NgorOjEwMUU2MDAwMjQwRTAwMDE4Rjg3MDEyMDI3NjIzODAwMjRFODAwMjAxQgorOjEwMUU3MDAwMDEwMjEwMkI1MDQwMDAwMTI3NjgzMDAwOEY4MjAxMjg5QQorOjEwMUU4MDAwMTEwMjAwMDQwMDAwMDAwMDhGODIwMTI0MTUwMjAwMDdFNworOjEwMUU5MDAwMDAwMDEwMjE4RUUyMDFBNDAwMDA4MDIxMjQ0MjAwMDFGNAorOjEwMUVBMDAwQUVFMjAxQTQwODAwMTdGMzhFRTIwMUE0OEVFNDA2MDg1NgorOjEwMUVCMDAwMDAwNDIwQzAwMDgwMTgyMThFRTQwNDMwOEVFNTA0MzQzNAorOjEwMUVDMDAwMDBBMzI4MjEwMEEzMzAyQjAwODIyMDIxMDA4NjIwMjE5RQorOjEwMUVEMDAwQUNFNDAwMDBBQ0U1MDAwNDhFRTIwNjA4QTRGODAwMEVCNQorOjEwMUVFMDAwQUNFRjAwMThBQ0VBMDAxQzAwMDIxMEMwMjQ0MjA2MEM0MworOjEwMUVGMDAwMDJFMjEwMjFBQ0UyMDAwODhFRTIwNEM0QUNFMjAwMTA2MQorOjEwMUYwMDAwQUY4ODAxMjA5MkUyNEUyMDE0NDAwMDMzMjQxMDAwMDFEQgorOjEwMUYxMDAwOEVFMjRFMzAwMDAyMTBDMDI0NDI1MDM4MDJFMjIwMjFFRQorOjEwMUYyMDAwOEM4MjAwMDAxNDREMDAxRjAwMDAwMDAwOEVFMzRFMzAzNAorOjEwMUYzMDAwOEVFMjRFMzQxMDYyMDAxQjAwMDAwMDAwOEM4MjAwMDQxMAorOjEwMUY0MDAwMjQ0MjAwMDFBQzgyMDAwNDhFRTI0RTM0OEVFMzRFMzAxNworOjEwMUY1MDAwMjQ0MjAwMDExMDRDMDAwNzAwMDAwMDAwOEVFMjRFMzRDNQorOjEwMUY2MDAwMjQ0MjAwMDExMDYyMDAwNTAwMDAwMDAwMDgwMDE3RTA5NAorOjEwMUY3MDAwMDAwMDAwMDAxNDYwMDAwNTAwMDAwMDAwOEY4MjAxMjhBRQorOjEwMUY4MDAwMjQ0MjAwMjBBRjgyMDEyODhGODIwMTI4OEM4MjAwMDQyNQorOjEwMUY5MDAwMkM0MjAwMTE1MDQwMDAxMEFDODAwMDAwMDgwMDE3RjNFNAorOjEwMUZBMDAwMDAwMDAwMDA4RUUyNEUzMDI0NDIwMDAxNTA0QzAwMDMzRAorOjEwMUZCMDAwMDAwMDEwMjE4RUUyNEUzMDI0NDIwMDAxQUVFMjRFMzA4RAorOjEwMUZDMDAwOEVFMjRFMzAwMDAyMTBDMDI0NDI1MDM4MDJFMjIwMjEzRQorOjEwMUZEMDAwQUM4RDAwMDBBQzhFMDAwNDU2MDAwMDA2MjQwQjAwMDFGRQorOjEwMUZFMDAwOEY4MjAwNTQwMTIyMTAyMzJDNDIwMDMzMTQ0MEZGOURBNQorOjEwMUZGMDAwMDAwMDAwMDAzMTYzMDBGRjI0MDIwMDAxMTQ2MjAwNzczQQorOjEwMjAwMDAwM0MwNTAwMDlBRUVBMDYwODhGODMwMDU0OEY4MjAwNTQxNQorOjEwMjAxMDAwMjQ2OTAwMzIwMTIyMTAyMzJDNDIwMDMzMTA0MDAwNjE1OQorOjEwMjAyMDAwMDAwMDU4MjEyNDBEMDAwODI0MEMwMDExMjQwODAwMTI3RgorOjEwMjAzMDAwMjQwNzAwNDAyNDBBMDAwMThGODMwMTIwMjc2MjM4MDAxMgorOjEwMjA0MDAwMjQ2NjAwMjAwMEMyMTAyQjUwNDAwMDAxMjc2NjMwMDA5QgorOjEwMjA1MDAwOEY4MjAxMjgxMEMyMDAwNDAwMDAwMDAwOEY4MjAxMjQzQQorOjEwMjA2MDAwMTRDMjAwMDcwMDAwMDAwMDhFRTIwMUE0MDAwMDgwMjFERAorOjEwMjA3MDAwMjQ0MjAwMDFBRUUyMDFBNDA4MDAxODVGOEVFMjAxQTQzMAorOjEwMjA4MDAwOEVFMjA2MDhBQzYyMDAxQzhFRTQwNEEwOEVFNTA0QTQ3NworOjEwMjA5MDAwMjQ2MjAwMUNBQzYyMDAwOEE0NkQwMDBFQUM2QzAwMTgzOQorOjEwMjBBMDAwQUM2NDAwMDBBQzY1MDAwNDhFRTIwNEM0QUM2MjAwMTBCNQorOjEwMjBCMDAwQUY4NjAxMjA5MkUyNEUyMDE0NDAwMDMzMjQxMDAwMDEyQworOjEwMjBDMDAwOEVFMjRFMzAwMDAyMTBDMDI0NDI1MDM4MDJFMjIwMjEzRAorOjEwMjBEMDAwOEM4MjAwMDAxNDQ4MDAxRjAwMDAwMDAwOEVFMzRFMzA4OAorOjEwMjBFMDAwOEVFMjRFMzQxMDYyMDAxQjAwMDAwMDAwOEM4MjAwMDQ1RgorOjEwMjBGMDAwMjQ0MjAwMDFBQzgyMDAwNDhFRTI0RTM0OEVFMzRFMzA2NgorOjEwMjEwMDAwMjQ0MjAwMDExMDQ3MDAwNzAwMDAwMDAwOEVFMjRFMzQxOAorOjEwMjExMDAwMjQ0MjAwMDExMDYyMDAwNTAwMDAwMDAwMDgwMDE4NEM3NQorOjEwMjEyMDAwMDAwMDAwMDAxNDYwMDAwNTAwMDAwMDAwOEY4MjAxMjhGQworOjEwMjEzMDAwMjQ0MjAwMjBBRjgyMDEyODhGODIwMTI4OEM4MjAwMDQ3MworOjEwMjE0MDAwMkM0MjAwMTE1MDQwMDAxMEFDODAwMDAwMDgwMDE4NUZDNQorOjEwMjE1MDAwMDAwMDAwMDA4RUUyNEUzMDI0NDIwMDAxNTA0NzAwMDM5MAorOjEwMjE2MDAwMDAwMDEwMjE4RUUyNEUzMDI0NDIwMDAxQUVFMjRFMzBEQgorOjEwMjE3MDAwOEVFMjRFMzAwMDAyMTBDMDI0NDI1MDM4MDJFMjIwMjE4QworOjEwMjE4MDAwQUM4ODAwMDBBQzhBMDAwNDU2MDAwMDA2MjQwQjAwMDE1NQorOjEwMjE5MDAwOEY4MjAwNTQwMTIyMTAyMzJDNDIwMDMzMTQ0MEZGQTZFQQorOjEwMjFBMDAwMDAwMDAwMDAzMTYzMDBGRjI0MDIwMDAxMTQ2MjAwMDNGQworOjEwMjFCMDAwM0MwNTAwMDkwODAwMTk3QzI0MTAwMDAxM0MwNDAwMDFDMgorOjEwMjFDMDAwMjQ4NDUyQTRBRkEwMDAxMEFGQTAwMDE0OEY4NjAxMjA3OQorOjEwMjFEMDAwOEY4NzAxMjQwODAwMTg3QjM0QTVGMDExM0MwNDAwMDEwRQorOjEwMjFFMDAwMjQ4NDUyQjBBRkEwMDAxMEFGQTAwMDE0OEY4NjAxMjA0RAorOjEwMjFGMDAwOEY4NzAxMjQzNEE1RjAxMDBDMDAyNDAzMDAwMDgwMjFGNworOjEwMjIwMDAwMDgwMDE5N0MwMDAwMDAwMDNDMDQwMDAxMjQ4NDUyQkMzQQorOjEwMjIxMDAwQUZBMDAwMTQ4RUU2MDYwODhGNDcwMjI4M0MwNTAwMDk4RgorOjEwMjIyMDAwMDgwMDE5NzUzNEE1RjAwRjhFRTIwNjA4OEY0MzAyMjhDNgorOjEwMjIzMDAwMjQ0MjAwMDEzMDQ5MDBGRjUxMjMwMEUyQUZBMDAwMTAwQQorOjEwMjI0MDAwOEVFMjA2MDgwMDAyMTBDMDAwNTcxMDIxOEZBMzAwMTg2QworOjEwMjI1MDAwOEZBNDAwMUNBQzQzMDYwQ0FDNDQwNjEwOEY4NzAxMjBGMQorOjEwMjI2MDAwMjc2MjM4MDAyNEU4MDAyMDAxMDIxMDJCNTA0MDAwMDFCMgorOjEwMjI3MDAwMjc2ODMwMDA4RjgyMDEyODExMDIwMDA0MDAwMDAwMDA0RQorOjEwMjI4MDAwOEY4MjAxMjQxNTAyMDAwNzAwMDAxMDIxOEVFMjAxQTRCNAorOjEwMjI5MDAwMDAwMDgwMjEyNDQyMDAwMUFFRTIwMUE0MDgwMDE4RjdFQQorOjEwMjJBMDAwOEVFMjAxQTQ4RUU0MDYwODAwMDQyMEMwMDA4MDE4MjFGQworOjEwMjJCMDAwOEVFNDA0MzA4RUU1MDQzNDAwQTMyODIxMDBBMzMwMkJFMworOjEwMjJDMDAwMDA4MjIwMjEwMDg2MjAyMUFDRTQwMDAwQUNFNTAwMDQ1RgorOjEwMjJEMDAwOEVFMzA2MDgyNDAyMDAwOEE0RTIwMDBFMjQwMjAwMEQ4QQorOjEwMjJFMDAwQUNFMjAwMThBQ0U5MDAxQzAwMDMxOEMwMjQ2MzA2MEMyMworOjEwMjJGMDAwMDJFMzEwMjFBQ0UyMDAwODhFRTIwNEM0QUNFMjAwMTA1QworOjEwMjMwMDAwQUY4ODAxMjA5MkUyNEUyMDE0NDAwMDM3MjQxMDAwMDFEMworOjEwMjMxMDAwOEVFMjRFMzAwMDAyMTBDMDI0NDI1MDM4MDJFMjIwMjFFQQorOjEwMjMyMDAwOEM4MzAwMDAyNDAyMDAwNzE0NjIwMDFGMDAwMDAwMDBEQworOjEwMjMzMDAwOEVFMzRFMzA4RUUyNEUzNDEwNjIwMDFCMjQwMzAwNDBDOAorOjEwMjM0MDAwOEM4MjAwMDQyNDQyMDAwMUFDODIwMDA0OEVFMjRFMzRGMAorOjEwMjM1MDAwOEVFNTRFMzAyNDQyMDAwMTEwNDMwMDA3MDAwMDAwMDBDQgorOjEwMjM2MDAwOEVFMjRFMzQyNDQyMDAwMTEwQTIwMDA1MDAwMDAwMDA1RAorOjEwMjM3MDAwMDgwMDE4RTEwMDAwMDAwMDE0QTAwMDA1MDAwMDAwMDBBMworOjEwMjM4MDAwOEY4MjAxMjgyNDQyMDAyMEFGODIwMTI4OEY4MjAxMjhGOQorOjEwMjM5MDAwOEM4MjAwMDQyQzQyMDAxMTUwNDAwMDEzQUM4MDAwMDBERAorOjEwMjNBMDAwMDgwMDE4RjcwMDAwMDAwMDhFRTI0RTMwMjQwMzAwNDBDMQorOjEwMjNCMDAwMjQ0MjAwMDE1MDQzMDAwMzAwMDAxMDIxOEVFMjRFMzAwMQorOjEwMjNDMDAwMjQ0MjAwMDFBRUUyNEUzMDhFRTI0RTMwMDAwMjEwQzBEOAorOjEwMjNEMDAwMjQ0MjUwMzgwMkUyMjAyMTI0MDIwMDA3QUM4MjAwMDA4RgorOjEwMjNFMDAwMjQwMjAwMDFBQzgyMDAwNDU2MDAwMDBDQUVFOTA2MDg4RAorOjEwMjNGMDAwM0MwNDAwMDEyNDg0NTJDOEFGQTAwMDEwQUZBMDAwMTQxOAorOjEwMjQwMDAwOEVFNjA2MDg4RjQ3MDIyODNDMDUwMDA5MEMwMDI0MDNDRAorOjEwMjQxMDAwMzRBNUYwMDAwODAwMTk3QzAwMDAwMDAwOEY4MzAxMjAyMworOjEwMjQyMDAwMjc2MjM4MDAyNDY2MDAyMDAwQzIxMDJCNTA0MDAwMDFCMworOjEwMjQzMDAwMjc2NjMwMDA4RjgyMDEyODEwQzIwMDA0MDAwMDAwMDBDRgorOjEwMjQ0MDAwOEY4MjAxMjQxNEMyMDAwNzAwMDAwMDAwOEVFMjAxQTQ2NAorOjEwMjQ1MDAwMDAwMDgwMjEyNDQyMDAwMUFFRTIwMUE0MDgwMDE5NUVDMAorOjEwMjQ2MDAwOEVFMjAxQTQ4RUUyMDYwOEFDNjIwMDFDOEVFNDA0QTA5OQorOjEwMjQ3MDAwOEVFNTA0QTQyNDYyMDAxQ0FDNjIwMDA4MjQwMjAwMDg1QgorOjEwMjQ4MDAwQTQ2MjAwMEUyNDAyMDAxMUFDNjIwMDE4QUM2NDAwMDBDQgorOjEwMjQ5MDAwQUM2NTAwMDQ4RUUyMDRDNEFDNjIwMDEwQUY4NjAxMjA3QgorOjEwMjRBMDAwOTJFMjRFMjAxNDQwMDAzNzI0MTAwMDAxOEVFMjRFMzA5QworOjEwMjRCMDAwMDAwMjEwQzAyNDQyNTAzODAyRTIyMDIxOEM4MzAwMDAyOAorOjEwMjRDMDAwMjQwMjAwMTIxNDYyMDAxRjAwMDAwMDAwOEVFMzRFMzA1MAorOjEwMjREMDAwOEVFMjRFMzQxMDYyMDAxQjI0MDMwMDQwOEM4MjAwMDQwNAorOjEwMjRFMDAwMjQ0MjAwMDFBQzgyMDAwNDhFRTI0RTM0OEVFNTRFMzA3MAorOjEwMjRGMDAwMjQ0MjAwMDExMDQzMDAwNzAwMDAwMDAwOEVFMjRFMzQyOQorOjEwMjUwMDAwMjQ0MjAwMDExMEEyMDAwNTAwMDAwMDAwMDgwMDE5NDg0NAorOjEwMjUxMDAwMDAwMDAwMDAxNEEwMDAwNTAwMDAwMDAwOEY4MjAxMjhDOAorOjEwMjUyMDAwMjQ0MjAwMjBBRjgyMDEyODhGODIwMTI4OEM4MjAwMDQ3RgorOjEwMjUzMDAwMkM0MjAwMTE1MDQwMDAxM0FDODAwMDAwMDgwMDE5NUVDRQorOjEwMjU0MDAwMDAwMDAwMDA4RUUyNEUzMDI0MDMwMDQwMjQ0MjAwMDFDRgorOjEwMjU1MDAwNTA0MzAwMDMwMDAwMTAyMThFRTI0RTMwMjQ0MjAwMDE1RgorOjEwMjU2MDAwQUVFMjRFMzA4RUUyNEUzMDAwMDIxMEMwMjQ0MjUwMzhBRgorOjEwMjU3MDAwMDJFMjIwMjEyNDAyMDAxMkFDODIwMDAwMjQwMjAwMDFBOQorOjEwMjU4MDAwQUM4MjAwMDQ1NjAwMDAxRDI0MTAwMDAxM0MwNDAwMDEzMAorOjEwMjU5MDAwMjQ4NDUyRDBBRkEwMDAxMEFGQTAwMDE0OEVFNjA2MDgyRAorOjEwMjVBMDAwOEY0NzAyMjgzQzA1MDAwOTBDMDAyNDAzMzRBNUYwMDFFNAorOjEwMjVCMDAwOEVFMjAxQjAyNDQyMDAwMUFFRTIwMUIwMDgwMDE5N0NCNQorOjEwMjVDMDAwOEVFMjAxQjAzQzA0MDAwMTI0ODQ1MkRDQUZBMDAwMTQ3MAorOjEwMjVEMDAwOEVFNjA2MDg4RjQ3MDIyODNDMDUwMDA5MzRBNUYwMDU2MQorOjEwMjVFMDAwMEMwMDI0MDMwMDAwMDAwMDhFRTIwMUFDMDAwMDgwMjFGQQorOjEwMjVGMDAwMjQ0MjAwMDFBRUUyMDFBQzhFRTIwMUFDMTIwMDAwMENGQworOjEwMjYwMDAwMjQwMjAwMDEzQzAxMDAwMTAwMzcwODIxQTAyMDgzQjAxMgorOjEwMjYxMDAwOEY0MjAyMzg4RUUzMDE1ODI0NjMwMDAxQUVFMzAxNTg3MworOjEwMjYyMDAwOEVFMzAxNTgwODAwMTk4Q0FFRTI3Mjc4MjQwMjAwMDE5MgorOjEwMjYzMDAwM0MwMTAwMDEwMDM3MDgyMUEwMjI4M0IwM0MwMjAwMDFDOAorOjEwMjY0MDAwOEM0MjVDRDgxMDQwMDE4NzAwMDAwMDAwOEVFMjdCODQ0MQorOjEwMjY1MDAwMjQ0MzAwMDEyODQyMDBDOTE0NDAwMUE0QUVFMzdCODQ1NgorOjEwMjY2MDAwOEVFMjA0RDQzMDQyMDAwMjE0NDAwMTE5QUVFMDdCODRCMworOjEwMjY3MDAwOEVFMjA0RDQzQzAzMDYwMDM0NjMxMDAwMzQ0MjAwMDJBRQorOjEwMjY4MDAwQUVFMjA0RDRBRkEzMDAxODhFRTIwNjA4OEY0MzAyMjhGRQorOjEwMjY5MDAwMjQ0MjAwMDEzMDRBMDBGRjUxNDMwMEZEQUZBMDAwMTA2QQorOjEwMjZBMDAwOEVFMjA2MDgwMDAyMTBDMDAwNTcxMDIxOEZBMzAwMTgwOAorOjEwMjZCMDAwOEZBNDAwMUNBQzQzMDYwQ0FDNDQwNjEwOEY4MzAwNTQ1RQorOjEwMjZDMDAwOEY4MjAwNTQyNDY5MDAzMjAxMjIxMDIzMkM0MjAwMzNFRgorOjEwMjZEMDAwMTA0MDAwNkEwMDAwNTgyMTI0MTgwMDA4MjQwRjAwMEQ0MworOjEwMjZFMDAwMjQwRDAwMDcyNDBDMDA0MDI0MEUwMDAxOEY4NzAxMjBEOAorOjEwMjZGMDAwMjc2MjM4MDAyNEU4MDAyMDAxMDIxMDJCNTA0MDAwMDExRQorOjEwMjcwMDAwMjc2ODMwMDA4RjgyMDEyODExMDIwMDA0MDAwMDAwMDBCOQorOjEwMjcxMDAwOEY4MjAxMjQxNTAyMDAwNzAwMDAxMDIxOEVFMjAxQTQxRgorOjEwMjcyMDAwMDAwMDgwMjEyNDQyMDAwMUFFRTIwMUE0MDgwMDFBMTUzNQorOjEwMjczMDAwOEVFMjAxQTQ4RUU0MDYwODAwMDQyMEMwMDA4MDE4MjE2NworOjEwMjc0MDAwOEVFNDA0MzA4RUU1MDQzNDAwQTMyODIxMDBBMzMwMkI0RQorOjEwMjc1MDAwMDA4MjIwMjEwMDg2MjAyMUFDRTQwMDAwQUNFNTAwMDRDQQorOjEwMjc2MDAwOEVFMjA2MDhBNEY4MDAwRUFDRUYwMDE4QUNFQTAwMUNEQworOjEwMjc3MDAwMDAwMjEwQzAyNDQyMDYwQzAyRTIxMDIxQUNFMjAwMDg2NAorOjEwMjc4MDAwOEVFMjA0QzRBQ0UyMDAxMEFGODgwMTIwOTJFMjRFMjAzOQorOjEwMjc5MDAwMTQ0MDAwMzMyNDEwMDAwMThFRTI0RTMwMDAwMjEwQzBCRAorOjEwMjdBMDAwMjQ0MjUwMzgwMkUyMjAyMThDODIwMDAwMTQ0RDAwMUY4OAorOjEwMjdCMDAwMDAwMDAwMDA4RUUzNEUzMDhFRTI0RTM0MTA2MjAwMUJBQgorOjEwMjdDMDAwMDAwMDAwMDA4QzgyMDAwNDI0NDIwMDAxQUM4MjAwMDQ1RQorOjEwMjdEMDAwOEVFMjRFMzQ4RUUzNEUzMDI0NDIwMDAxMTA0QzAwMDc0RQorOjEwMjdFMDAwMDAwMDAwMDA4RUUyNEUzNDI0NDIwMDAxMTA2MjAwMDUxOQorOjEwMjdGMDAwMDAwMDAwMDAwODAwMUEwMjAwMDAwMDAwMTQ2MDAwMDUzQworOjEwMjgwMDAwMDAwMDAwMDA4RjgyMDEyODI0NDIwMDIwQUY4MjAxMjhBRQorOjEwMjgxMDAwOEY4MjAxMjg4QzgyMDAwNDJDNDIwMDExNTA0MDAwMTA0RAorOjEwMjgyMDAwQUM4MDAwMDAwODAwMUExNTAwMDAwMDAwOEVFMjRFMzA1NworOjEwMjgzMDAwMjQ0MjAwMDE1MDRDMDAwMzAwMDAxMDIxOEVFMjRFMzA3MworOjEwMjg0MDAwMjQ0MjAwMDFBRUUyNEUzMDhFRTI0RTMwMDAwMjEwQzA1MworOjEwMjg1MDAwMjQ0MjUwMzgwMkUyMjAyMUFDOEQwMDAwQUM4RTAwMDRFRQorOjEwMjg2MDAwNTYwMDAwMDYyNDBCMDAwMThGODIwMDU0MDEyMjEwMjMyMQorOjEwMjg3MDAwMkM0MjAwMzMxNDQwRkY5RDAwMDAwMDAwMzE2MzAwRkYzNAorOjEwMjg4MDAwMjQwMjAwMDE1NDYyMDA3OEFGQTAwMDEwQUVFQTA2MDhFRQorOjEwMjg5MDAwOEY4MzAwNTQ4RjgyMDA1NDI0NjkwMDMyMDEyMjEwMjM1OAorOjEwMjhBMDAwMkM0MjAwMzMxMDQwMDA2MTAwMDA1ODIxMjQwRDAwMDgyNAorOjEwMjhCMDAwMjQwQzAwMTEyNDA4MDAxMjI0MDcwMDQwMjQwQTAwMDFGRgorOjEwMjhDMDAwOEY4MzAxMjAyNzYyMzgwMDI0NjYwMDIwMDBDMjEwMkI2RAorOjEwMjhEMDAwNTA0MDAwMDEyNzY2MzAwMDhGODIwMTI4MTBDMjAwMDQ5QQorOjEwMjhFMDAwMDAwMDAwMDA4RjgyMDEyNDE0QzIwMDA3MDAwMDAwMDBENQorOjEwMjhGMDAwOEVFMjAxQTQwMDAwODAyMTI0NDIwMDAxQUVFMjAxQTQ4NgorOjEwMjkwMDAwMDgwMDFBODE4RUUyMDFBNDhFRTIwNjA4QUM2MjAwMUM2NworOjEwMjkxMDAwOEVFNDA0QTA4RUU1MDRBNDI0NjIwMDFDQUM2MjAwMDhDRQorOjEwMjkyMDAwQTQ2RDAwMEVBQzZDMDAxOEFDNjQwMDAwQUM2NTAwMDQzMworOjEwMjkzMDAwOEVFMjA0QzRBQzYyMDAxMEFGODYwMTIwOTJFMjRFMjAwOQorOjEwMjk0MDAwMTQ0MDAwMzMyNDEwMDAwMThFRTI0RTMwMDAwMjEwQzAwQgorOjEwMjk1MDAwMjQ0MjUwMzgwMkUyMjAyMThDODIwMDAwMTQ0ODAwMUZEQgorOjEwMjk2MDAwMDAwMDAwMDA4RUUzNEUzMDhFRTI0RTM0MTA2MjAwMUJGOQorOjEwMjk3MDAwMDAwMDAwMDA4QzgyMDAwNDI0NDIwMDAxQUM4MjAwMDRBQworOjEwMjk4MDAwOEVFMjRFMzQ4RUUzNEUzMDI0NDIwMDAxMTA0NzAwMDdBMQorOjEwMjk5MDAwMDAwMDAwMDA4RUUyNEUzNDI0NDIwMDAxMTA2MjAwMDU2NworOjEwMjlBMDAwMDAwMDAwMDAwODAwMUE2RTAwMDAwMDAwMTQ2MDAwMDUxRQorOjEwMjlCMDAwMDAwMDAwMDA4RjgyMDEyODI0NDIwMDIwQUY4MjAxMjhGRAorOjEwMjlDMDAwOEY4MjAxMjg4QzgyMDAwNDJDNDIwMDExNTA0MDAwMTA5QworOjEwMjlEMDAwQUM4MDAwMDAwODAwMUE4MTAwMDAwMDAwOEVFMjRFMzAzQQorOjEwMjlFMDAwMjQ0MjAwMDE1MDQ3MDAwMzAwMDAxMDIxOEVFMjRFMzBDNworOjEwMjlGMDAwMjQ0MjAwMDFBRUUyNEUzMDhFRTI0RTMwMDAwMjEwQzBBMgorOjEwMkEwMDAwMjQ0MjUwMzgwMkUyMjAyMUFDODgwMDAwQUM4QTAwMDQ0NQorOjEwMkExMDAwNTYwMDAwMDYyNDBCMDAwMThGODIwMDU0MDEyMjEwMjM2RgorOjEwMkEyMDAwMkM0MjAwMzMxNDQwRkZBNjAwMDAwMDAwMzE2MzAwRkY3OQorOjEwMkEzMDAwMjQwMjAwMDExMDYyMDAyMjAwMDAwMDAwM0MwNDAwMDE5QQorOjEwMkE0MDAwMjQ4NDUyQTRBRkEwMDAxMEFGQTAwMDE0OEY4NjAxMjBGMAorOjEwMkE1MDAwOEY4NzAxMjQzQzA1MDAwOTBDMDAyNDAzMzRBNUYwMTFFNAorOjEwMkE2MDAwMDgwMDFBQUQwMDAwMDAwMDNDMDQwMDAxMjQ4NDUyQjBBQworOjEwMkE3MDAwQUZBMDAwMTQ4Rjg2MDEyMDhGODcwMTI0M0MwNTAwMDkzOAorOjEwMkE4MDAwMEMwMDI0MDMzNEE1RjAxMDA4MDAxQUFEMDAwMDAwMDA2QgorOjEwMkE5MDAwM0MwNDAwMDEyNDg0NTJCQ0FGQTAwMDE0OEVFNjA2MDg1QQorOjEwMkFBMDAwOEY0NzAyMjgzQzA1MDAwOTBDMDAyNDAzMzRBNUYwMEZEMQorOjEwMkFCMDAwOEVFMjAxQUMyNDQyMDAwMUFFRTIwMUFDOEVFMjAxQUMzOAorOjEwMkFDMDAwOEVFMjAxNUMyNDQyMDAwMUFFRTIwMTVDOEVFMjAxNUMxOAorOjEwMkFEMDAwOEVFMjA0RDQzMDQyMDAwMTEwNDAwMDU1MDAwMDAwMDA5NgorOjEwMkFFMDAwOEY0MjAyMTgzMDQyMDA4MDEwNDAwMDI5MDAwMDAwMDA5MAorOjEwMkFGMDAwOEY4MjAwNDQzNDQyMDA0MEFGODIwMDQ0OEVFMjdCN0NFRgorOjEwMkIwMDAwMDA0MDI4MjE4RUUyMDBDMDhFRTMwMEM0MjQwNjAwMDBBRAorOjEwMkIxMDAwMjQwN0ZGRkYwMDAwMjAyMTAwNDYxMDI0MTQ0NDAwMEQ2QworOjEwMkIyMDAwMDA2NzE4MjQxNDY1MDAwQjAwMDAwMDAwOEVFMjdCODAxMworOjEwMkIzMDAwMDA0MDI4MjE4RUUyMDBFMDhFRTMwMEU0MDAwMDIwMjEyNgorOjEwMkI0MDAwMDA0NjEwMjQxNDQ0MDAwMzAwNjcxODI0MTA2NTAwMEI4RAorOjEwMkI1MDAwMDAwMDAwMDA4RUUyMDBDMDhFRTMwMEM0OEVFNDAwRTBCRQorOjEwMkI2MDAwOEVFNTAwRTRBRUUzN0I3Q0FFRTU3QjgwOEY4MjAwNDRBMworOjEwMkI3MDAwMzg0MjAwMjAwODAwMUIzOEFGODIwMDQ0OEY4MjAwNDQ5NgorOjEwMkI4MDAwMjQwM0ZGREYwMDQzMTAyNDA4MDAxQjM4QUY4MjAwNDRGOQorOjEwMkI5MDAwOEY4MjAwNDQyNDAzRkZERjAwNDMxMDI0QUY4MjAwNDRFRgorOjEwMkJBMDAwOEVFMjdCN0MwMDQwMjgyMThFRTIwMEMwOEVFMzAwQzREMAorOjEwMkJCMDAwMjQwNjAwMDAyNDA3RkZGRjAwMDAyMDIxMDA0NjEwMjQwNworOjEwMkJDMDAwMTQ0NDAwMEQwMDY3MTgyNDE0NjUwMDBCMDAwMDAwMDA3OQorOjEwMkJEMDAwOEVFMjdCODAwMDQwMjgyMThFRTIwMEUwOEVFMzAwRTQ1QworOjEwMkJFMDAwMDAwMDIwMjEwMDQ2MTAyNDE0NDQwMDAzMDA2NzE4MjQyQworOjEwMkJGMDAwMTA2NTAwMEIwMDAwMDAwMDhFRTIwMEMwOEVFMzAwQzRGMAorOjEwMkMwMDAwOEVFNDAwRTA4RUU1MDBFNEFFRTM3QjdDQUVFNTdCODAwNQorOjEwMkMxMDAwOEY4MjAwNDQzODQyMDA0MDA4MDAxQjM4QUY4MjAwNDRENQorOjEwMkMyMDAwOEY4MjAwNDQzNDQyMDA0MDA4MDAxQjM4QUY4MjAwNDRDOQorOjEwMkMzMDAwOEY4MjAwNDQzNDQyMDA0MEFGODIwMDQ0OEVFMjdCOEM5RAorOjEwMkM0MDAwMjQ0MzAwMDEyODQyMDAxNTE0NDAwMDI4QUVFMzdCOEM4OQorOjEwMkM1MDAwOEY4MjAwNDQzODQyMDAyMEFGODIwMDQ0MDgwMDFCMzhCNQorOjEwMkM2MDAwQUVFMDdCOEM4RUUyMDRENDMwNDIwMDAxMTA0MDAwMTFCMworOjEwMkM3MDAwMDAwMDAwMDA4RjQyMDIxODMwNDIwMDgwMTA0MDAwMDkxRQorOjEwMkM4MDAwMDAwMDAwMDA4RjgyMDA0NDM0NDIwMDIwQUY4MjAwNDRFNAorOjEwMkM5MDAwOEY4MjAwNDQyNDAzRkZCRjAwNDMxMDI0MDgwMDFCMzYyQQorOjEwMkNBMDAwQUY4MjAwNDQ4RjgyMDA0NDM0NDIwMDYwMDgwMDFCMzYyQgorOjEwMkNCMDAwQUY4MjAwNDQ4RjgyMDA0NDM0NDIwMDQwQUY4MjAwNDQxRgorOjEwMkNDMDAwOEVFMjdCODgyNDQzMDAwMTI4NDIxMzg5MTQ0MDAwMDVDQQorOjEwMkNEMDAwQUVFMzdCODg4RjgyMDA0NDM4NDIwMDIwQUY4MjAwNDRGQworOjEwMkNFMDAwQUVFMDdCODgwQzAwNDYwMzAwMDAwMDAwOEZCRjAwMjQ4QworOjEwMkNGMDAwOEZCMDAwMjAwM0UwMDAwODI3QkQwMDI4MjdCREZGQjhFMworOjEwMkQwMDAwQUZCRjAwNDRBRkI2MDA0MEFGQjUwMDNDQUZCNDAwMzgzMQorOjEwMkQxMDAwQUZCMzAwMzRBRkIyMDAzMEFGQjEwMDJDQUZCMDAwMjg3OQorOjEwMkQyMDAwOEY5NjAwNjQzMkMyMDAwNDEwNDAwMDBDMjQwMjAwMDQ5QworOjEwMkQzMDAwQUY4MjAwNjQ4RjQyMDExNEFFRTIwNEUwOEY4MjAwNjAzMworOjEwMkQ0MDAwMzQ0MjAwMDhBRjgyMDA2MDhFRTIwMTZDMjQ0MjAwMDEzMAorOjEwMkQ1MDAwQUVFMjAxNkMwODAwMjJGNDhFRTIwMTZDMzJDMjAwMDE4NgorOjEwMkQ2MDAwMTA0MDAwMDQyNDAyMDAwMUFGODIwMDY0MDgwMDIyRjQzNQorOjEwMkQ3MDAwMDAwMDAwMDAzMkMyMDAwMjE0NDAwMDBDM0MwNTAwMDNCOQorOjEwMkQ4MDAwM0MwNDAwMDEyNDg0NTM1NDM0QTUwMDAxMDJDMDMwMjFDNgorOjEwMkQ5MDAwMDAwMDM4MjFBRkEwMDAxMDBDMDAyNDAzQUZBMDAwMTRFNQorOjEwMkRBMDAwMjQwMkZGRjgwODAwMjJGNEFGODIwMDY0OEY0MzAyMkM1MworOjEwMkRCMDAwOEY0MjAxMEM1MDYyMDAwQ0FGQTAwMDEwOEY0MjAyMkMxOQorOjEwMkRDMDAwMDAwMjEwODAwMDVBMTAyMThDNDIwMzAwQUZBMjAwMjBBNAorOjEwMkREMDAwOEY0MjAyMkMyNDA3MDAwMTI0NDIwMDAxMzA0MjAwM0ZCMAorOjEwMkRFMDAwMDgwMDFCODBBRjQyMDIyQzNDMDQwMDAxMjQ4NDUzNjA4NQorOjEwMkRGMDAwQUZBMDAwMTQ4RjQ2MDIyQzhGNDcwMTBDM0MwNTAwMDM0NgorOjEwMkUwMDAwMEMwMDI0MDMzNEE1RjAxRjAwMDAzODIxMTRFMDAwMDM1NworOjEwMkUxMDAwMDAwMDAwMDAwODAwMjJFREFGOTYwMDY0OTNBMjAwMjA5RAorOjEwMkUyMDAwMjQ0M0ZGRkYyQzYyMDAxMTEwNDAwNjU4MDAwMzEwODA1RAorOjEwMkUzMDAwM0MwMTAwMDEwMDIyMDgyMThDMjI1NDE4MDA0MDAwMDhBNworOjEwMkU0MDAwMDAwMDAwMDA4RkEyMDAyMDMwNDIwRkZGQUVFMjBFMEMwNworOjEwMkU1MDAwOEY4MjAwNjAzNDQyMDIwMEFGODIwMDYwOEVFMjAxMTg2RgorOjEwMkU2MDAwMjQ0MjAwMDFBRUUyMDExODA4MDAyMkU4OEVFMjAxMThCNworOjEwMkU3MDAwOEZBMjAwMjAyNDAzMDAwMTNDMDEwMDAxMDAzNzA4MjEzQgorOjEwMkU4MDAwQTAyMzgzQjEzMDQyMEZGRkFFRTI1MjM4OEY4MjAwNjA0MAorOjEwMkU5MDAwMzQ0MjAxMDBBRjgyMDA2MDhFRTIwMTQ0MjQ0MjAwMDEwRQorOjEwMkVBMDAwQUVFMjAxNDQwODAwMjJFODhFRTIwMTQ0OEZBMjAwMjAzNQorOjEwMkVCMDAwMDAwMjEyMDAwMDAyMjUwMjI0MDIwMDAxMTA4MjAwMDUxNworOjEwMkVDMDAwMjQwMjAwMDIxMDgyMDAwOTI0MDJGRkZFMDgwMDFCQzkzMAorOjEwMkVEMDAwQUZBMDAwMTA4RUUyMDRENEFFRTQwMDcwQUVFNDAwNzQ0MworOjEwMkVFMDAwMzQ0MjAwMDEwODAwMUJCREFFRTIwNEQ0OEVFMzA0RDREQQorOjEwMkVGMDAwQUVFNDAwNzBBRUU0MDA3NDAwNjIxODI0QUVFMzA0RDRDMworOjEwMkYwMDAwOEY4NDAwNTQwMDA0MTQ0MjAwMDQxQzgyMDA0MzEwMjFFQQorOjEwMkYxMDAwMDAwNDFDQzIwMDQzMTAyMzAwMDQxRDAyMDA0MzEwMjFDMgorOjEwMkYyMDAwMDAwNDFENDIwMDQzMTAyMzA4MDAxQkQwQUVFMjAwNzhDRAorOjEwMkYzMDAwM0MwNDAwMDEyNDg0NTM2Q0FGQTAwMDE0OEZBNjAwMjAzMQorOjEwMkY0MDAwM0MwNTAwMDMwQzAwMjQwMzM0QTUwMDA0OEVFMjAxMTBBQworOjEwMkY1MDAwMjQ0MjAwMDFBRUUyMDExMDA4MDAyMkU4OEVFMjAxMTBENgorOjEwMkY2MDAwMjc0NDAyMTIwQzAwMjJGRTI0MDUwMDA2MzA0OTAwMUZFRgorOjEwMkY3MDAwMDAwOTIwQzAwMkU0MTAyMTk0NDI3MjdDMzA0MjQwMDBEQgorOjEwMkY4MDAwMTA0MDAwMEEwMDk3MTAyMTk3NDMwMjEyQTQ0MzcyN0U1QQorOjEwMkY5MDAwOEY0MzAyMTQwMDk3MTAyMUFDNDM3MjgwMDJFNDE4MjE4MQorOjEwMkZBMDAwMzQwMjgwMDAwODAwMUM3OUE0NjI3MjdDOTQ0MzcyN0UxMworOjEwMkZCMDAwOTc0MjAyMTIxNDYyMDAwNjAyRTQxMDIxMDA5NzEwMjFDOQorOjEwMkZDMDAwOEM0MzcyODA4RjQyMDIxNDEwNjIwMDlGMDJFNDEwMjEzMQorOjEwMkZEMDAwOTQ0MjcyN0MzMDQyODAwMDEwNDAwMDJBMjQwNkZGRkY5OQorOjEwMkZFMDAwMDAwMDIwMjEwMDA0MTBDMDAyRTIxMDIxOTQ0MjczN0NGMgorOjEwMkZGMDAwMzA0MjQwMDA1NDQwMDAwNTAwODAzMDIxMjQ4NDAwMDEwQworOjEwMzAwMDAwMkM4MjAwODAxNDQwRkZGODAwMDQxMEMwMDRDMTAwMTA5RQorOjEwMzAxMDAwMDAwNjE4QzAwMDA2MTBDMDAwNTcxODIxOEM2MzczN0M4RQorOjEwMzAyMDAwMDA1NzEwMjFBRkEzMDAxMDhDNDI3MzgwM0MwNDAwMDFCNAorOjEwMzAzMDAwMjQ4NDUzNzhBRkEyMDAxNDhGNDcwMjE0M0MwNTAwMDM4OAorOjEwMzA0MDAwMEMwMDI0MDMzNEE1MDAxMzA4MDAxQzkwM0MwMjA4MDA2NworOjEwMzA1MDAwOTc0NDAyMTIwMDc3MTAyMUE0NDQ3MzdFOEY0NDAyMTQxNworOjEwMzA2MDAwMDA3NzEwMjEwMkUzMTgyMUFDNDQ3MzgwMzQwMjgwMDAwMQorOjEwMzA3MDAwQTQ2MjczN0MwMDA5MTBDMDAyRTIxMDIxMDgwMDFDNzlEMAorOjEwMzA4MDAwQTQ0NjcyN0MwMkU0MTAyMTk0NDU3MjdDMDgwMDFDMkUzOAorOjEwMzA5MDAwMDAwNTEwQzA5NDQzNzM3RTk3NDIwMjEyMTQ2MjAwMDYyQQorOjEwMzBBMDAwMDAwNTEwQzAwMDk3MTAyMThDNDM3MzgwOEY0MjAyMTREQQorOjEwMzBCMDAwMTA2MjAwNjUwMDA1MTBDMDAyRTIxMDIxOTQ0NTczN0M4NworOjEwMzBDMDAwMDAwNTEwQzAwMkUyMTAyMTk0NDI3MzdDMzA0MjgwMDA1RgorOjEwMzBEMDAwMTA0MEZGRjAwMDk3MTAyMTAwMDUyMEMwMDA5NzEwMjEzQworOjEwMzBFMDAwOTQ0MzczN0U5NzQyMDIxMjE0NjIwMDA2MjQwNkZGRkY4NworOjEwMzBGMDAwMDA5NzEwMjE4QzQzNzM4MDhGNDIwMjE0MTA2MjAwNTM5QQorOjEwMzEwMDAwM0MwMjA4MDAwMDAwMjAyMTAwMDQxMEMwMDJFMjEwMjE0RgorOjEwMzExMDAwOTQ0MjczN0MzMDQyNDAwMDU0NDAwMDA1MDA4MDMwMjFDRQorOjEwMzEyMDAwMjQ4NDAwMDEyQzgyMDA4MDE0NDBGRkY4MDAwNDEwQzBBOQorOjEwMzEzMDAwMDRDMTAwMjMwMDA2MThDMDAwMDkxMEMwMDA1NzE4MjE2MAorOjEwMzE0MDAwOEM2MzcyN0MwMDU3MTAyMUFGQTMwMDEwOEM0MjcyODBGOAorOjEwMzE1MDAwM0MwNDAwMDEyNDg0NTM4NEFGQTIwMDE0OEY0NzAyMTQ1RQorOjEwMzE2MDAwM0MwNTAwMDMwQzAwMjQwMzM0QTVGMDE3MDgwMDFDOTA1NAorOjEwMzE3MDAwM0MwMjA4MDA4RjQzMDIxMDAwQjcxMDIxQUM0Mzc3N0M1QgorOjEwMzE4MDAwOEY0MzAyMTQwMEI3MTAyMUFDNDM3NzgwM0MwMjAwMDE0QQorOjEwMzE5MDAwMDA1NzEwMjE4QzQyODNCNDI0NDIwMDAxM0MwMTAwMDFGRAorOjEwMzFBMDAwMDAzNzA4MjFBQzIyODNCNDNDMDMwMDAxMDA3NzE4MjFDQQorOjEwMzFCMDAwOEM2MzgzQjQwMkU1MTAyMTA4MDAxQzgyQTQ0Mzc3N0M1MQorOjEwMzFDMDAwOTc0NDAyMTIwMDc3MTAyMUE0NDQ3MzdFOEY0NDAyMTRBNgorOjEwMzFEMDAwMDA3NzEwMjEwMkUzMTgyMUFDNDQ3MzgwMzQwMjgwMDA5MAorOjEwMzFFMDAwQTQ2MjczN0MwMDA1MTBDMDAyRTIxMDIxQTQ0NjczN0MyNworOjEwMzFGMDAwMDAwMDIwMjEwMDA0MjhDMDAyRTUxMDIxOTQ0Mjc3N0NDMQorOjEwMzIwMDAwMTA0MEZGREMyNDg0MDAwMTJDODIwMDgwNTQ0MEZGRkEyRgorOjEwMzIxMDAwMDAwNDI4QzA5MkUyMDREODEwNDAwMDA2MjQwMjAwMDFGNQorOjEwMzIyMDAwOEVFMzA0REMwMTIyMTAwNDAwNjIxODI1MDgwMDFDOEZDNAorOjEwMzIzMDAwQUVFMzA0REM4RjgzMDIyODI0MDIwMDAxMDEyMjEwMDQ4MworOjEwMzI0MDAwMDA2MjE4MjVBRjgzMDIyODNDMDIwODAwMzQ0MjEwMDBCNworOjEwMzI1MDAwQUZBMjAwMTg4RUUyMDYwODhGNDMwMjI4MjQ0MjAwMDEyNAorOjEwMzI2MDAwMzA0QTAwRkY1MTQzMDBGREFGQTAwMDEwOEVFMjA2MDg3NworOjEwMzI3MDAwMDAwMjEwQzAwMDU3MTAyMThGQTMwMDE4OEZBNDAwMUM1QgorOjEwMzI4MDAwQUM0MzA2MENBQzQ0MDYxMDhGODMwMDU0OEY4MjAwNTQ2QworOjEwMzI5MDAwMjQ2OTAwMzIwMTIyMTAyMzJDNDIwMDMzMTA0MDAwNkFCRQorOjEwMzJBMDAwMDAwMDU4MjEyNDEwMDAwODI0MEYwMDBEMjQwRDAwMDdGMQorOjEwMzJCMDAwMjQwQzAwNDAyNDBFMDAwMThGODcwMTIwMjc2MjM4MDA3MworOjEwMzJDMDAwMjRFODAwMjAwMTAyMTAyQjUwNDAwMDAxMjc2ODMwMDA0NAorOjEwMzJEMDAwOEY4MjAxMjgxMTAyMDAwNDAwMDAwMDAwOEY4MjAxMjQ2NworOjEwMzJFMDAwMTUwMjAwMDcwMDAwMTAyMThFRTIwMUE0MDAwMDM4MjEyMQorOjEwMzJGMDAwMjQ0MjAwMDFBRUUyMDFBNDA4MDAxRDA4OEVFMjAxQTRGMAorOjEwMzMwMDAwOEVFNDA2MDgwMDA0MjBDMDAwODAxODIxOEVFNDA0MzBGQQorOjEwMzMxMDAwOEVFNTA0MzQwMEEzMjgyMTAwQTMzMDJCMDA4MjIwMjE1NQorOjEwMzMyMDAwMDA4NjIwMjFBQ0U0MDAwMEFDRTUwMDA0OEVFMjA2MDgzMworOjEwMzMzMDAwQTRGMDAwMEVBQ0VGMDAxOEFDRUEwMDFDMDAwMjEwQzBCNAorOjEwMzM0MDAwMjQ0MjA2MEMwMkUyMTAyMUFDRTIwMDA4OEVFMjA0QzQyMgorOjEwMzM1MDAwQUNFMjAwMTBBRjg4MDEyMDkyRTI0RTIwMTQ0MDAwMzMwRQorOjEwMzM2MDAwMjQwNzAwMDE4RUUyNEUzMDAwMDIxMEMwMjQ0MjUwMzg4MworOjEwMzM3MDAwMDJFMjIwMjE4QzgyMDAwMDE0NEQwMDFGMDAwMDAwMDA5QQorOjEwMzM4MDAwOEVFMzRFMzA4RUUyNEUzNDEwNjIwMDFCMDAwMDAwMDBDRgorOjEwMzM5MDAwOEM4MjAwMDQyNDQyMDAwMUFDODIwMDA0OEVFMjRFMzQ5MAorOjEwMzNBMDAwOEVFMzRFMzAyNDQyMDAwMTEwNEMwMDA3MDAwMDAwMDA2NAorOjEwMzNCMDAwOEVFMjRFMzQyNDQyMDAwMTEwNjIwMDA1MDAwMDAwMDAzRAorOjEwMzNDMDAwMDgwMDFDRjUwMDAwMDAwMDE0NjAwMDA1MDAwMDAwMDA2QgorOjEwMzNEMDAwOEY4MjAxMjgyNDQyMDAyMEFGODIwMTI4OEY4MjAxMjg5OQorOjEwMzNFMDAwOEM4MjAwMDQyQzQyMDAxMTUwNDAwMDEwQUM4MDAwMDA4MAorOjEwMzNGMDAwMDgwMDFEMDgwMDAwMDAwMDhFRTI0RTMwMjQ0MjAwMDE0QgorOjEwMzQwMDAwNTA0QzAwMDMwMDAwMTAyMThFRTI0RTMwMjQ0MjAwMDE5NworOjEwMzQxMDAwQUVFMjRFMzA4RUUyNEUzMDAwMDIxMEMwMjQ0MjUwMzhGMAorOjEwMzQyMDAwMDJFMjIwMjFBQzhEMDAwMEFDOEUwMDA0NTRFMDAwMDZDNgorOjEwMzQzMDAwMjQwQjAwMDE4RjgyMDA1NDAxMjIxMDIzMkM0MjAwMzMwMAorOjEwMzQ0MDAwMTQ0MEZGOUQwMDAwMDAwMDMxNjMwMEZGMjQwMjAwMDFEMgorOjEwMzQ1MDAwNTQ2MjAwNzhBRkEwMDAxMEFFRUEwNjA4OEY4MzAwNTREMworOjEwMzQ2MDAwOEY4MjAwNTQyNDY5MDAzMjAxMjIxMDIzMkM0MjAwMzM0MQorOjEwMzQ3MDAwMTA0MDAwNjEwMDAwNTgyMTI0MEUwMDA4MjQwRDAwMTFBNgorOjEwMzQ4MDAwMjQwQTAwMTIyNDA4MDA0MDI0MEMwMDAxOEY4MzAxMjAyQworOjEwMzQ5MDAwMjc2MjM4MDAyNDY2MDAyMDAwQzIxMDJCNTA0MDAwMDEzMworOjEwMzRBMDAwMjc2NjMwMDA4RjgyMDEyODEwQzIwMDA0MDAwMDAwMDA0RgorOjEwMzRCMDAwOEY4MjAxMjQxNEMyMDAwNzAwMDAwMDAwOEVFMjAxQTRFNAorOjEwMzRDMDAwMDAwMDM4MjEyNDQyMDAwMUFFRTIwMUE0MDgwMDFENzQ2RQorOjEwMzREMDAwOEVFMjAxQTQ4RUUyMDYwOEFDNjIwMDFDOEVFNDA0QTAxOQorOjEwMzRFMDAwOEVFNTA0QTQyNDYyMDAxQ0FDNjIwMDA4QTQ2RTAwMEVFOQorOjEwMzRGMDAwQUM2RDAwMThBQzY0MDAwMEFDNjUwMDA0OEVFMjA0QzQzRQorOjEwMzUwMDAwQUM2MjAwMTBBRjg2MDEyMDkyRTI0RTIwMTQ0MDAwMzNERQorOjEwMzUxMDAwMjQwNzAwMDE4RUUyNEUzMDAwMDIxMEMwMjQ0MjUwMzhEMQorOjEwMzUyMDAwMDJFMjIwMjE4QzgyMDAwMDE0NEEwMDFGMDAwMDAwMDBFQgorOjEwMzUzMDAwOEVFMzRFMzA4RUUyNEUzNDEwNjIwMDFCMDAwMDAwMDAxRAorOjEwMzU0MDAwOEM4MjAwMDQyNDQyMDAwMUFDODIwMDA0OEVFMjRFMzRERQorOjEwMzU1MDAwOEVFMzRFMzAyNDQyMDAwMTEwNDgwMDA3MDAwMDAwMDBCNgorOjEwMzU2MDAwOEVFMjRFMzQyNDQyMDAwMTEwNjIwMDA1MDAwMDAwMDA4QgorOjEwMzU3MDAwMDgwMDFENjEwMDAwMDAwMDE0NjAwMDA1MDAwMDAwMDA0QworOjEwMzU4MDAwOEY4MjAxMjgyNDQyMDAyMEFGODIwMTI4OEY4MjAxMjhFNworOjEwMzU5MDAwOEM4MjAwMDQyQzQyMDAxMTUwNDAwMDEwQUM4MDAwMDBDRQorOjEwMzVBMDAwMDgwMDFENzQwMDAwMDAwMDhFRTI0RTMwMjQ0MjAwMDEyRAorOjEwMzVCMDAwNTA0ODAwMDMwMDAwMTAyMThFRTI0RTMwMjQ0MjAwMDFFQQorOjEwMzVDMDAwQUVFMjRFMzA4RUUyNEUzMDAwMDIxMEMwMjQ0MjUwMzgzRgorOjEwMzVEMDAwMDJFMjIwMjFBQzhBMDAwMEFDOEMwMDA0NTRFMDAwMDYxQQorOjEwMzVFMDAwMjQwQjAwMDE4RjgyMDA1NDAxMjIxMDIzMkM0MjAwMzM0RgorOjEwMzVGMDAwMTQ0MEZGQTYwMDAwMDAwMDMxNjMwMEZGMjQwMjAwMDExOAorOjEwMzYwMDAwMTA2MjAwMjIwMDAwMDAwMDNDMDQwMDAxMjQ4NDUzOTA1QQorOjEwMzYxMDAwQUZBMDAwMTBBRkEwMDAxNDhGODYwMTIwOEY4NzAxMjQ3NworOjEwMzYyMDAwM0MwNTAwMDkwQzAwMjQwMzM0QTVGMDExMDgwMDFEQTA3RQorOjEwMzYzMDAwMDAwMDAwMDAzQzA0MDAwMTI0ODQ1MzlDQUZBMDAwMTQ0RgorOjEwMzY0MDAwOEY4NjAxMjA4Rjg3MDEyNDNDMDUwMDA5MEMwMDI0MDM4QworOjEwMzY1MDAwMzRBNUYwMTAwODAwMURBMDAwMDAwMDAwM0MwNDAwMDE4QgorOjEwMzY2MDAwMjQ4NDUzQThBRkEwMDAxNDhFRTYwNjA4OEY0NzAyMjhEMgorOjEwMzY3MDAwM0MwNTAwMDkwQzAwMjQwMzM0QTVGMDBGOEVFMjAxQUNEOAorOjEwMzY4MDAwMjQ0MjAwMDFBRUUyMDFBQzhFRTIwMUFDOEVFMjAxMjRFNAorOjEwMzY5MDAwMjQ0MjAwMDFBRUUyMDEyNDA4MDAxRjk3OEVFMjAxMjRCQgorOjEwMzZBMDAwMjc0NDAyMTIwQzAwMjJGRTI0MDUwMDA2MzA0OTAwMUZBOAorOjEwMzZCMDAwMDAwOTI4QzAwMkU1MTAyMTk0NDI3MjdDMzA0MjgwMDA0QgorOjEwMzZDMDAwMTA0MDAwMkYwMkU1MTAyMTk0NDI3MjdDMzA0MjQwMDBFRAorOjEwMzZEMDAwMTQ0MDAwMUMwMEI3MTAyMTk0NDM3MjdFOTc0MjAyMTJERQorOjEwMzZFMDAwMTQ2MjAwMTgwMEI3MTAyMThDNDM3MjgwOEY0MjAyMTRCQworOjEwMzZGMDAwNTQ2MjAwMTZBRkEyMDAxMDkyRTIwNEQ4MTA0MDAwMDdGNgorOjEwMzcwMDAwMjQwMjAwMDE4RUUzMDREQzAxMjIxMDA0MDAwMjEwMjdEMQorOjEwMzcxMDAwMDA2MjE4MjQwODAwMURDOUFFRTMwNERDOEY4MzAyMjg3MAorOjEwMzcyMDAwMDEyMjEwMDQwMDAyMTAyNzAwNjIxODI0QUY4MzAyMjgyRgorOjEwMzczMDAwMDAwOTEwQzAwMkUyMTgyMTM0MDJDMDAwMDgwMDFFNEUyOQorOjEwMzc0MDAwQTQ2MjcyN0M4RjQyMDIxNEFGQTIwMDEwMDAwOTEwQzA2NAorOjEwMzc1MDAwMDA1NzEwMjE4QzQyNzI3QzNDMDQwMDAxMjQ4NDUzQjQzNQorOjEwMzc2MDAwM0MwNTAwMDNBRkEyMDAxNDhGNDcwMjEwMzRBNUYwMUNFMworOjEwMzc3MDAwMEMwMDI0MDMwMTIwMzAyMTA4MDAxRTgzM0MwMjA4MDBCNQorOjEwMzc4MDAwMDBCNzEwMjE5NDQzNzI3RTk3NDIwMjEyMTQ2MjAwMTkwRQorOjEwMzc5MDAwMDAwOTE4QzAwMEI3MTAyMThDNDM3MjgwOEY0MjAyMTRCOAorOjEwMzdBMDAwMTQ2MjAwMTQwMDA5MThDMDAyRTUxMDIxOTQ0NzcyN0NDRAorOjEwMzdCMDAwMDAwNzIwQzAwMDk3MTAyMTk0NDM3MzdFMDBCNzEwMjFBQQorOjEwMzdDMDAwQTQ0MzcyN0UwMDk3MTAyMThDNDM3MzgwMDBCNzEwMjFCMAorOjEwMzdEMDAwQUM0MzcyODAwMkU0MTAyMTk0NDM3MzdDMDJFNTEwMjExMworOjEwMzdFMDAwQTQ0MzcyN0MwMkU0MTgyMTM0MDJDMDAwMDgwMDFFNEU3QgorOjEwMzdGMDAwQTQ2MjczN0MwMkUzMTAyMTk0NDc3MjdDMDAwMDMwMjFBNAorOjEwMzgwMDAwMDAwNzIwQzAwMkU0MTAyMTk0NDI3MzdDMDAwMDQwMjE5NAorOjEwMzgxMDAwMzA0MjgwMDAxNDQwMDAyNTAwRTAyODIxMDA2MDUwMjE0MworOjEwMzgyMDAwMzQwQkMwMDAwMDk3MTAyMTk0NDM3MzdFOTc0MjAyMTIxQworOjEwMzgzMDAwNTQ2MjAwMTUwMEUwMjgyMTAwOTcxMDIxOEM0MzczODAwQQorOjEwMzg0MDAwOEY0MjAyMTQ1NDYyMDAxMDAwRTAyODIxMTEwMDAwMDY4QgorOjEwMzg1MDAwMDJFNDEwMjE5NDQzNzM3QzAwMDUxMEMwMDJFMjEwMjFBMQorOjEwMzg2MDAwMDgwMDFFMUFBNDQzNzM3Qzk0NDM3MzdDMDJFQTEwMjE1RgorOjEwMzg3MDAwQTQ0MzcyN0MwMDA3MTBDMDAyRTIxMDIxQTQ0QjczN0NBOQorOjEwMzg4MDAwMDgwMDFFMjgyNDA2MDAwMTAwMDUxMEMwMDJFMjEwMjFENQorOjEwMzg5MDAwOTQ0NzczN0MwMDA3MjBDMDAyRTQxMDIxOTQ0MjczN0M5QgorOjEwMzhBMDAwMzA0MjgwMDAxMDQwRkZERjI1MDgwMDAxMzBDMjAwRkZEOQorOjEwMzhCMDAwMTQ0MDAwMjUwMDAwMjAyMTAwMDcyMEMwMDA5NzEwMjE5RgorOjEwMzhDMDAwOTQ0MzczN0U5NzQyMDIxMjE0NjIwMDBGMDAwOTEwQzBFNQorOjEwMzhEMDAwMDA5NzEwMjE4QzQzNzM4MDhGNDIwMjE0MTQ2MjAwMEFGNworOjEwMzhFMDAwMDAwOTEwQzAwMkU0MTgyMTM0MDJDMDAwMTUwMDAwMTVDMAorOjEwMzhGMDAwQTQ2MjczN0MwMDA5MTBDMDAyRTIxODIxMzQwMjgwMDAyNworOjEwMzkwMDAwMDgwMDFFNEVBNDYyNzI3QzAwNTcxMDIxOEM0MjcyN0MwQgorOjEwMzkxMDAwM0MwNDAwMDEyNDg0NTNDMDNDMDUwMDAzQUZBMjAwMTAwNgorOjEwMzkyMDAwMDAwNzEwQzAwMDU3MTAyMThDNDI3MzdDMzRBNTAwMUU4NAorOjEwMzkzMDAwMDEyMDMwMjEwQzAwMjQwM0FGQTIwMDE0MDgwMDFFODNENAorOjEwMzk0MDAwM0MwMjA4MDAwMDAwMjAyMTAwMDQyOEMwMDBCNzEwMjExQworOjEwMzk1MDAwOTQ0Mzc3N0U5NzQyMDIxMjU0NjIwMDJCMjQ4NDAwMDEyNAorOjEwMzk2MDAwMDBCNzEwMjE4QzQzNzc4MDhGNDIwMjE0NTQ2MjAwMjZFNgorOjEwMzk3MDAwMjQ4NDAwMDEzQzAyMDAwMTAwNTcxMDIxOEM0MjgzQjREMgorOjEwMzk4MDAwMjQ0MkZGRkYzQzAxMDAwMTAwMzcwODIxQUMyMjgzQjQzMAorOjEwMzk5MDAwM0MwMjAwMDEwMDU3MTAyMThDNDI4M0I0MDA4MDkwMjEyQQorOjEwMzlBMDAwMDI0MjEwMkIxMDQwMDAwRTI0QjE3NzdDMjRCMDc3ODRBMworOjEwMzlCMDAwMDJGMDIwMjEwMkYxMjgyMTBDMDAyNDkwMjQwNjAwMDhBNgorOjEwMzlDMDAwMjYzMTAwMDgzQzAyMDAwMTAwNTcxMDIxOEM0MjgzQjRDQworOjEwMzlEMDAwMjY1MjAwMDEwMjQyMTAyQjE0NDBGRkY1MjYxMDAwMDg2OQorOjEwMzlFMDAwM0MwNDAwMDEwMDk3MjAyMThDODQ4M0I0MjQwNTAwMDg0NgorOjEwMzlGMDAwMDAwNDIwQzAyNDg0Nzc3QzBDMDAyNDg4MDJFNDIwMjE2OQorOjEwM0EwMDAwMDgwMDFFODMzQzAyMDgwMDJDODIwMDgwMTQ0MEZGQ0Y3NworOjEwM0ExMDAwMDAwNDI4QzAzQzAyMDgwMDM0NDIyMDAwQUZBMjAwMTg3NQorOjEwM0EyMDAwOEVFMjA2MDg4RjQzMDIyODI0NDIwMDAxMzA0QTAwRkYzQworOjEwM0EzMDAwNTE0MzAwRkRBRkEwMDAxMDhFRTIwNjA4MDAwMjEwQzA0NgorOjEwM0E0MDAwMDA1NzEwMjE4RkEzMDAxODhGQTQwMDFDQUM0MzA2MEM1NAorOjEwM0E1MDAwQUM0NDA2MTA4RjgzMDA1NDhGODIwMDU0MjQ2OTAwMzJENgorOjEwM0E2MDAwMDEyMjEwMjMyQzQyMDAzMzEwNDAwMDZBMDAwMDU4MjEyQworOjEwM0E3MDAwMjQxMDAwMDgyNDBGMDAwRDI0MEQwMDA3MjQwQzAwNDAyMgorOjEwM0E4MDAwMjQwRTAwMDE4Rjg3MDEyMDI3NjIzODAwMjRFODAwMjBERgorOjEwM0E5MDAwMDEwMjEwMkI1MDQwMDAwMTI3NjgzMDAwOEY4MjAxMjg1RQorOjEwM0FBMDAwMTEwMjAwMDQwMDAwMDAwMDhGODIwMTI0MTUwMjAwMDdBQgorOjEwM0FCMDAwMDAwMDEwMjE4RUUyMDFBNDAwMDAzODIxMjQ0MjAwMDEwMAorOjEwM0FDMDAwQUVFMjAxQTQwODAwMUVGQjhFRTIwMUE0OEVFNDA2MDgwQgorOjEwM0FEMDAwMDAwNDIwQzAwMDgwMTgyMThFRTQwNDMwOEVFNTA0MzRGOAorOjEwM0FFMDAwMDBBMzI4MjEwMEEzMzAyQjAwODIyMDIxMDA4NjIwMjE2MgorOjEwM0FGMDAwQUNFNDAwMDBBQ0U1MDAwNDhFRTIwNjA4QTRGMDAwMEU4MQorOjEwM0IwMDAwQUNFRjAwMThBQ0VBMDAxQzAwMDIxMEMwMjQ0MjA2MEMwNgorOjEwM0IxMDAwMDJFMjEwMjFBQ0UyMDAwODhFRTIwNEM0QUNFMjAwMTAyNAorOjEwM0IyMDAwQUY4ODAxMjA5MkUyNEUyMDE0NDAwMDMzMjQwNzAwMDFBOAorOjEwM0IzMDAwOEVFMjRFMzAwMDAyMTBDMDI0NDI1MDM4MDJFMjIwMjFCMgorOjEwM0I0MDAwOEM4MjAwMDAxNDREMDAxRjAwMDAwMDAwOEVFMzRFMzBGOAorOjEwM0I1MDAwOEVFMjRFMzQxMDYyMDAxQjAwMDAwMDAwOEM4MjAwMDRENAorOjEwM0I2MDAwMjQ0MjAwMDFBQzgyMDAwNDhFRTI0RTM0OEVFMzRFMzBEQgorOjEwM0I3MDAwMjQ0MjAwMDExMDRDMDAwNzAwMDAwMDAwOEVFMjRFMzQ4OQorOjEwM0I4MDAwMjQ0MjAwMDExMDYyMDAwNTAwMDAwMDAwMDgwMDFFRTg0OQorOjEwM0I5MDAwMDAwMDAwMDAxNDYwMDAwNTAwMDAwMDAwOEY4MjAxMjg3MgorOjEwM0JBMDAwMjQ0MjAwMjBBRjgyMDEyODhGODIwMTI4OEM4MjAwMDRFOQorOjEwM0JCMDAwMkM0MjAwMTE1MDQwMDAxMEFDODAwMDAwMDgwMDFFRkI5OQorOjEwM0JDMDAwMDAwMDAwMDA4RUUyNEUzMDI0NDIwMDAxNTA0QzAwMDMwMQorOjEwM0JEMDAwMDAwMDEwMjE4RUUyNEUzMDI0NDIwMDAxQUVFMjRFMzA1MQorOjEwM0JFMDAwOEVFMjRFMzAwMDAyMTBDMDI0NDI1MDM4MDJFMjIwMjEwMgorOjEwM0JGMDAwQUM4RDAwMDBBQzhFMDAwNDU0RTAwMDA2MjQwQjAwMDFFNAorOjEwM0MwMDAwOEY4MjAwNTQwMTIyMTAyMzJDNDIwMDMzMTQ0MEZGOUQ2OAorOjEwM0MxMDAwMDAwMDAwMDAzMTYzMDBGRjI0MDIwMDAxNTQ2MjAwNzhCQworOjEwM0MyMDAwQUZBMDAwMTBBRUVBMDYwODhGODMwMDU0OEY4MjAwNTRDNAorOjEwM0MzMDAwMjQ2OTAwMzIwMTIyMTAyMzJDNDIwMDMzMTA0MDAwNjExRAorOjEwM0M0MDAwMDAwMDU4MjEyNDBFMDAwODI0MEQwMDExMjQwQTAwMTIzRgorOjEwM0M1MDAwMjQwODAwNDAyNDBDMDAwMThGODMwMTIwMjc2MjM4MDBEMworOjEwM0M2MDAwMjQ2NjAwMjAwMEMyMTAyQjUwNDAwMDAxMjc2NjMwMDA1RgorOjEwM0M3MDAwOEY4MjAxMjgxMEMyMDAwNDAwMDAwMDAwOEY4MjAxMjRGRQorOjEwM0M4MDAwMTRDMjAwMDcwMDAwMDAwMDhFRTIwMUE0MDAwMDM4MjFFOQorOjEwM0M5MDAwMjQ0MjAwMDFBRUUyMDFBNDA4MDAxRjY3OEVFMjAxQTRFNQorOjEwM0NBMDAwOEVFMjA2MDhBQzYyMDAxQzhFRTQwNEEwOEVFNTA0QTQzQgorOjEwM0NCMDAwMjQ2MjAwMUNBQzYyMDAwOEE0NkUwMDBFQUM2RDAwMThGQgorOjEwM0NDMDAwQUM2NDAwMDBBQzY1MDAwNDhFRTIwNEM0QUM2MjAwMTA3OQorOjEwM0NEMDAwQUY4NjAxMjA5MkUyNEUyMDE0NDAwMDMzMjQwNzAwMDFGOQorOjEwM0NFMDAwOEVFMjRFMzAwMDAyMTBDMDI0NDI1MDM4MDJFMjIwMjEwMQorOjEwM0NGMDAwOEM4MjAwMDAxNDRBMDAxRjAwMDAwMDAwOEVFMzRFMzA0QQorOjEwM0QwMDAwOEVFMjRFMzQxMDYyMDAxQjAwMDAwMDAwOEM4MjAwMDQyMgorOjEwM0QxMDAwMjQ0MjAwMDFBQzgyMDAwNDhFRTI0RTM0OEVFMzRFMzAyOQorOjEwM0QyMDAwMjQ0MjAwMDExMDQ4MDAwNzAwMDAwMDAwOEVFMjRFMzREQgorOjEwM0QzMDAwMjQ0MjAwMDExMDYyMDAwNTAwMDAwMDAwMDgwMDFGNTQyQQorOjEwM0Q0MDAwMDAwMDAwMDAxNDYwMDAwNTAwMDAwMDAwOEY4MjAxMjhDMAorOjEwM0Q1MDAwMjQ0MjAwMjBBRjgyMDEyODhGODIwMTI4OEM4MjAwMDQzNworOjEwM0Q2MDAwMkM0MjAwMTE1MDQwMDAxMEFDODAwMDAwMDgwMDFGNjc3QQorOjEwM0Q3MDAwMDAwMDAwMDA4RUUyNEUzMDI0NDIwMDAxNTA0ODAwMDM1MworOjEwM0Q4MDAwMDAwMDEwMjE4RUUyNEUzMDI0NDIwMDAxQUVFMjRFMzA5RgorOjEwM0Q5MDAwOEVFMjRFMzAwMDAyMTBDMDI0NDI1MDM4MDJFMjIwMjE1MAorOjEwM0RBMDAwQUM4QTAwMDBBQzhDMDAwNDU0RTAwMDA2MjQwQjAwMDEzNworOjEwM0RCMDAwOEY4MjAwNTQwMTIyMTAyMzJDNDIwMDMzMTQ0MEZGQTZBRQorOjEwM0RDMDAwMDAwMDAwMDAzMTYzMDBGRjI0MDIwMDAxMTA2MjAwMjJBNQorOjEwM0REMDAwMDAwMDAwMDAzQzA0MDAwMTI0ODQ1MzkwQUZBMDAwMTBCOAorOjEwM0RFMDAwQUZBMDAwMTQ4Rjg2MDEyMDhGODcwMTI0M0MwNTAwMDlCNQorOjEwM0RGMDAwMEMwMDI0MDMzNEE1RjAxMTA4MDAxRjkzMDAwMDAwMDBGQworOjEwM0UwMDAwM0MwNDAwMDEyNDg0NTM5Q0FGQTAwMDE0OEY4NjAxMjA0MQorOjEwM0UxMDAwOEY4NzAxMjQzQzA1MDAwOTBDMDAyNDAzMzRBNUYwMTAxMQorOjEwM0UyMDAwMDgwMDFGOTMwMDAwMDAwMDNDMDQwMDAxMjQ4NDUzQThGNAorOjEwM0UzMDAwQUZBMDAwMTQ4RUU2MDYwODhGNDcwMjI4M0MwNTAwMDk1MworOjEwM0U0MDAwMEMwMDI0MDMzNEE1RjAwRjhFRTIwMUFDMjQ0MjAwMDFFMworOjEwM0U1MDAwQUVFMjAxQUM4RUUyMDFBQzhFRTIwMTI4MjQ0MjAwMDEwOAorOjEwM0U2MDAwQUVFMjAxMjg4RUUyMDEyODhFRTIwMTY0MjQ0MjAwMDFDNAorOjEwM0U3MDAwQUVFMjAxNjQwODAwMjJFODhFRTIwMTY0OEZBMjAwMjAxNQorOjEwM0U4MDAwMDAwMjEyMDAwMDAyMUQwMjI0MDIwMDAxMTA2MjAwMDU1RgorOjEwM0U5MDAwMjQwMjAwMDIxMDYyMDAwRDAwMDAwMDAwMDgwMDFGQjc5RAorOjEwM0VBMDAwQUZBMDAwMTA5MkUyMDREODE0NDAwMDA2MjQwMjAwMDFFMgorOjEwM0VCMDAwOEY4MjAyMjhBRUUyMDREQzI0MDJGRkZGQUY4MjAyMjhEOAorOjEwM0VDMDAwMjQwMjAwMDEwODAwMUZCRUEyRTIwNEQ4OTJFMjA0RDgzNgorOjEwM0VEMDAwNTA0MDAwMENBMkUwMDREODhFRTIwNERDQUY4MjAyMjgzRAorOjEwM0VFMDAwMDgwMDFGQkVBMkUwMDREODNDMDQwMDAxMjQ4NDUzQzg4QgorOjEwM0VGMDAwQUZBMDAwMTQ4RkE2MDAyMDNDMDUwMDAzMEMwMDI0MDM5MworOjEwM0YwMDAwMzRBNUYwMDk4RUUyMDEzQzI0NDIwMDAxQUVFMjAxM0NGRQorOjEwM0YxMDAwMDgwMDIyRTg4RUUyMDEzQzhGQTIwMDIwMDAwMjEyMDA3RAorOjEwM0YyMDAwMDAwMjI1MDIyNDAyMDAwMTEwODIwMDA1MjQwMjAwMDI4MgorOjEwM0YzMDAwMTA4MjAwMEYwMDAwMDAwMDA4MDAxRkUzQUZBMDAwMTA3NworOjEwM0Y0MDAwOEY4MjAyMjAzQzAzMDhGRjM0NjNGRkZGMDA0MzEwMjRFQworOjEwM0Y1MDAwMzQ0MjAwMDhBRjgyMDIyMDI0MDIwMDAxM0MwMTAwMDEyQgorOjEwM0Y2MDAwMDAzNzA4MjFBMDIyODNCMjA4MDAxRkVBQUVFNDAxMDg0RQorOjEwM0Y3MDAwOEY4MjAyMjAzQzAzMDhGRjM0NjNGRkY3MDA0MzEwMjRDNAorOjEwM0Y4MDAwQUY4MjAyMjAzQzAxMDAwMTAwMzcwODIxQTAyMDgzQjI0QgorOjEwM0Y5MDAwMDgwMDFGRUFBRUU0MDEwODNDMDQwMDAxMjQ4NDUzRDQ2NQorOjEwM0ZBMDAwQUZBMDAwMTQ4RkE2MDAyMDNDMDUwMDAzMEMwMDI0MDNFMgorOjEwM0ZCMDAwMzRBNUYwMEE4RUUyMDEyQzI0NDIwMDAxQUVFMjAxMkM2RAorOjEwM0ZDMDAwMDgwMDIyRTg4RUUyMDEyQzhGQTIwMDIwMDAwMjEyMDBERAorOjEwM0ZEMDAwMDAwMjFEMDIyNDAyMDAwMTEwNjIwMDA1MjQwMjAwMDJGQQorOjEwM0ZFMDAwMTA2MjAwMEUwMDAwMDAwMDA4MDAyMDExQUZBMDAwMTBCOQorOjEwM0ZGMDAwOEY4MjAyMjAzQzAzMDhGRjM0NjNGRkZGMDA0MzEwMjQzQworOjEwNDAwMDAwMzQ0MjAwMDhBRjgyMDIyMDI0MDIwMDAxM0MwMTAwMDE3QQorOjEwNDAxMDAwMDAzNzA4MjEwODAwMjAxOEEwMjI4M0IzM0MwMjAwMDFDOQorOjEwNDAyMDAwMDA1NzEwMjE5MDQyODNCMjNDMDEwMDAxMDAzNzA4MjE2MworOjEwNDAzMDAwMTQ0MDAwMEVBMDIwODNCMzhGODIwMjIwM0MwMzA4RkZBRgorOjEwNDA0MDAwMzQ2M0ZGRjcwMDQzMTAyNDA4MDAyMDE4QUY4MjAyMjBEOQorOjEwNDA1MDAwM0MwNDAwMDEyNDg0NTNFMEFGQTAwMDE0OEZBNjAwMjA4QworOjEwNDA2MDAwM0MwNTAwMDMwQzAwMjQwMzM0QTVGMDBCOEVFMjAxMTQ4MAorOjEwNDA3MDAwMjQ0MjAwMDFBRUUyMDExNDA4MDAyMkU4OEVFMjAxMTQ5RAorOjEwNDA4MDAwMjc4NDAyMDgyNzQ1MDIwMDBDMDAyNDlBMjQwNjAwMDgxMQorOjEwNDA5MDAwMjZFNDAwOTQyNzQ1MDIwMDBDMDAyNDlBMjQwNjAwMDgxOAorOjEwNDBBMDAwOEVFMjAxMzQyNDQyMDAwMUFFRTIwMTM0MDgwMDIyRTgyRAorOjEwNDBCMDAwOEVFMjAxMzQ4RjQ2MDI0ODAwMDAyMDIxMEMwMDUxMDg5NgorOjEwNDBDMDAwMjQwNTAwMDQ4RUUyMDEzMDI0NDIwMDAxQUVFMjAxMzBGQQorOjEwNDBEMDAwMDgwMDIyRTg4RUUyMDEzMDhFRjMwMUNDOEVGNDAxRDA4QworOjEwNDBFMDAwOEVGNTAxRDg4RUUyMDE0MDI2RTQwMDMwMjQ0MjAwMDEyMgorOjEwNDBGMDAwQUVFMjAxNDA4RUYwMDE0MDhFRjEwMDc0OEVGMjAwNzA0RAorOjEwNDEwMDAwMEMwMDI0ODgyNDA1MDQwMEFFRjMwMUNDQUVGNDAxRDBFOQorOjEwNDExMDAwQUVGNTAxRDhBRUYwMDE0MEFFRjEwMDc0QUVGMjAwNzAyMQorOjEwNDEyMDAwOEY0MjAyNUMyNkU0MDA5NEFFRTIwMDYwOEY0MjAyNjA5RgorOjEwNDEzMDAwMjc0NTAyMDAyNDA2MDAwOEFFRTIwMDY4MjQwMjAwMDZCQgorOjEwNDE0MDAwMEMwMDI0OUFBRUUyMDA2NDNDMDIzQjlBMzQ0MkNBMDA1RQorOjEwNDE1MDAwQUVFMjAwNkMyNDAyMDNFODI0MDQwMDAyMjQwMzAwMDEwMAorOjEwNDE2MDAwQUVFMjAxMDRBRUU0MDEwMEFFRTMwMTBDOEY4MjAyMjA1NgorOjEwNDE3MDAwMzA0MjAwMDgxMDQwMDAwNDAwMDAwMDAwQUVFMzAxMDhENworOjEwNDE4MDAwMDgwMDIwNjEwMDAwMjAyMUFFRTQwMTA4MDAwMDIwMjE4OQorOjEwNDE5MDAwM0MwMzAwMDEwMDY0MTgyMTkwNjM1QzMwMDJFNDEwMjFBQworOjEwNDFBMDAwMjQ4NDAwMDFBMDQzMDA5QzJDODIwMDBGMTQ0MEZGRjhERgorOjEwNDFCMDAwMDAwMDAwMDA4RjgyMDA0MDAyRTQxODIxMjQ4NDAwMDFFNgorOjEwNDFDMDAwMDAwMjE3MDIyNDQyMDAzMEEwNjIwMDlDMDJFNDEwMjE4OQorOjEwNDFEMDAwMDgwMDIyRThBMDQwMDA5QzI0MDIwMDAxM0MwMTAwMDFFQworOjEwNDFFMDAwMDAzNzA4MjFBMDIyODNFMDI0MEIwNDAwMjQwODAwMTRENworOjEwNDFGMDAwMjQwQTAwNDAyNDA5MDAwMThGODMwMTAwMjc2MjMwMDA1NworOjEwNDIwMDAwMjQ2NjAwMjAwMEMyMTAyQjUwNDAwMDAxMjc2NjI4MDBDMQorOjEwNDIxMDAwOEY4MjAxMDgxMEMyMDAwNDAwMDAwMDAwOEY4MjAxMDQ5OAorOjEwNDIyMDAwMTRDMjAwMDcyNkUyMDAzMDhFRTIwMUE4MDAwMDM4MjEwNworOjEwNDIzMDAwMjQ0MjAwMDFBRUUyMDFBODA4MDAyMEE4OEVFMjAxQThGNQorOjEwNDI0MDAwOEVFNDA0Qjg4RUU1MDRCQ0FDNjIwMDA4QTQ2QjAwMEVEQQorOjEwNDI1MDAwQUM2ODAwMThBQzYwMDAxQ0FDNjQwMDAwQUM2NTAwMDRFNQorOjEwNDI2MDAwOEVFMjA0Q0NBQzYyMDAxMEFGODYwMTAwOTJFMjA0RUM1NgorOjEwNDI3MDAwMTQ0MDAwMEUyNDA3MDAwMThFRTI0RTI4MjQ0MjAwMDE2MworOjEwNDI4MDAwNTA0QTAwMDMwMDAwMTAyMThFRTI0RTI4MjQ0MjAwMDExMworOjEwNDI5MDAwQUVFMjRFMjg4RUUyNEUyODAwMDIxMEMwMjQ0MjRFMzg3NAorOjEwNDJBMDAwMDJFMjEwMjFBQzQ4MDAwMEFDNDkwMDA0MTBFMEZGRDI0QgorOjEwNDJCMDAwMDAwMDAwMDAwODAwMjJFODAwMDAwMDAwM0MwMjA5MDBBNQorOjEwNDJDMDAwQUVFMDUyMzhBRUUwNTIzQ0FFRTA1MjQwQUVFMDUyNDQ3NgorOjEwNDJEMDAwQUVFMDAxRDAzQzAxMDAwMTAwMzcwODIxQTAyMDgzQjFFRAorOjEwNDJFMDAwQUZBMjAwMTg4RUUyMDYwODhGNDMwMjI4MjQ0MjAwMDE4NAorOjEwNDJGMDAwMzA0QTAwRkY1MTQzMDBGREFGQTAwMDEwOEVFMjA2MDhENworOjEwNDMwMDAwMDAwMjEwQzAwMDU3MTAyMThGQTMwMDE4OEZBNDAwMUNCQQorOjEwNDMxMDAwQUM0MzA2MENBQzQ0MDYxMDhGODMwMDU0OEY4MjAwNTRDQgorOjEwNDMyMDAwMjQ2OTAwMzIwMTIyMTAyMzJDNDIwMDMzMTA0MDAwNkExRAorOjEwNDMzMDAwMDAwMDU4MjEyNDEwMDAwODI0MEYwMDBEMjQwRDAwMDc1MAorOjEwNDM0MDAwMjQwQzAwNDAyNDBFMDAwMThGODcwMTIwMjc2MjM4MDBEMgorOjEwNDM1MDAwMjRFODAwMjAwMTAyMTAyQjUwNDAwMDAxMjc2ODMwMDBBMworOjEwNDM2MDAwOEY4MjAxMjgxMTAyMDAwNDAwMDAwMDAwOEY4MjAxMjRDNgorOjEwNDM3MDAwMTUwMjAwMDcwMDAwMTAyMThFRTIwMUE0MDAwMDM4MjE4MAorOjEwNDM4MDAwMjQ0MjAwMDFBRUUyMDFBNDA4MDAyMTJDOEVFMjAxQTQyNworOjEwNDM5MDAwOEVFNDA2MDgwMDA0MjBDMDAwODAxODIxOEVFNDA0MzA1QQorOjEwNDNBMDAwOEVFNTA0MzQwMEEzMjgyMTAwQTMzMDJCMDA4MjIwMjFCNQorOjEwNDNCMDAwMDA4NjIwMjFBQ0U0MDAwMEFDRTUwMDA0OEVFMjA2MDg5MworOjEwNDNDMDAwQTRGMDAwMEVBQ0VGMDAxOEFDRUEwMDFDMDAwMjEwQzAxNAorOjEwNDNEMDAwMjQ0MjA2MEMwMkUyMTAyMUFDRTIwMDA4OEVFMjA0QzQ4MgorOjEwNDNFMDAwQUNFMjAwMTBBRjg4MDEyMDkyRTI0RTIwMTQ0MDAwMzM2RQorOjEwNDNGMDAwMjQwNzAwMDE4RUUyNEUzMDAwMDIxMEMwMjQ0MjUwMzhFMworOjEwNDQwMDAwMDJFMjIwMjE4QzgyMDAwMDE0NEQwMDFGMDAwMDAwMDBGOQorOjEwNDQxMDAwOEVFMzRFMzA4RUUyNEUzNDEwNjIwMDFCMDAwMDAwMDAyRQorOjEwNDQyMDAwOEM4MjAwMDQyNDQyMDAwMUFDODIwMDA0OEVFMjRFMzRFRgorOjEwNDQzMDAwOEVFMzRFMzAyNDQyMDAwMTEwNEMwMDA3MDAwMDAwMDBDMworOjEwNDQ0MDAwOEVFMjRFMzQyNDQyMDAwMTEwNjIwMDA1MDAwMDAwMDA5QworOjEwNDQ1MDAwMDgwMDIxMTkwMDAwMDAwMDE0NjAwMDA1MDAwMDAwMDBBMQorOjEwNDQ2MDAwOEY4MjAxMjgyNDQyMDAyMEFGODIwMTI4OEY4MjAxMjhGOAorOjEwNDQ3MDAwOEM4MjAwMDQyQzQyMDAxMTUwNDAwMDEwQUM4MDAwMDBERgorOjEwNDQ4MDAwMDgwMDIxMkMwMDAwMDAwMDhFRTI0RTMwMjQ0MjAwMDE4MgorOjEwNDQ5MDAwNTA0QzAwMDMwMDAwMTAyMThFRTI0RTMwMjQ0MjAwMDFGNworOjEwNDRBMDAwQUVFMjRFMzA4RUUyNEUzMDAwMDIxMEMwMjQ0MjUwMzg1MAorOjEwNDRCMDAwMDJFMjIwMjFBQzhEMDAwMEFDOEUwMDA0NTRFMDAwMDYyNgorOjEwNDRDMDAwMjQwQjAwMDE4RjgyMDA1NDAxMjIxMDIzMkM0MjAwMzM2MAorOjEwNDREMDAwMTQ0MEZGOUQwMDAwMDAwMDMxNjMwMEZGMjQwMjAwMDEzMgorOjEwNDRFMDAwNTQ2MjAwNzhBRkEwMDAxMEFFRUEwNjA4OEY4MzAwNTQzMworOjEwNDRGMDAwOEY4MjAwNTQyNDY5MDAzMjAxMjIxMDIzMkM0MjAwMzNBMQorOjEwNDUwMDAwMTA0MDAwNjEwMDAwNTgyMTI0MEUwMDA4MjQwRDAwMTEwNQorOjEwNDUxMDAwMjQwQTAwMTIyNDA4MDA0MDI0MEMwMDAxOEY4MzAxMjA4QgorOjEwNDUyMDAwMjc2MjM4MDAyNDY2MDAyMDAwQzIxMDJCNTA0MDAwMDE5MgorOjEwNDUzMDAwMjc2NjMwMDA4RjgyMDEyODEwQzIwMDA0MDAwMDAwMDBBRQorOjEwNDU0MDAwOEY4MjAxMjQxNEMyMDAwNzAwMDAwMDAwOEVFMjAxQTQ0MworOjEwNDU1MDAwMDAwMDM4MjEyNDQyMDAwMUFFRTIwMUE0MDgwMDIxOThBNQorOjEwNDU2MDAwOEVFMjAxQTQ4RUUyMDYwOEFDNjIwMDFDOEVFNDA0QTA3OAorOjEwNDU3MDAwOEVFNTA0QTQyNDYyMDAxQ0FDNjIwMDA4QTQ2RTAwMEU0OAorOjEwNDU4MDAwQUM2RDAwMThBQzY0MDAwMEFDNjUwMDA0OEVFMjA0QzQ5RAorOjEwNDU5MDAwQUM2MjAwMTBBRjg2MDEyMDkyRTI0RTIwMTQ0MDAwMzMzRQorOjEwNDVBMDAwMjQwNzAwMDE4RUUyNEUzMDAwMDIxMEMwMjQ0MjUwMzgzMQorOjEwNDVCMDAwMDJFMjIwMjE4QzgyMDAwMDE0NEEwMDFGMDAwMDAwMDA0QgorOjEwNDVDMDAwOEVFMzRFMzA4RUUyNEUzNDEwNjIwMDFCMDAwMDAwMDA3RAorOjEwNDVEMDAwOEM4MjAwMDQyNDQyMDAwMUFDODIwMDA0OEVFMjRFMzQzRQorOjEwNDVFMDAwOEVFMzRFMzAyNDQyMDAwMTEwNDgwMDA3MDAwMDAwMDAxNgorOjEwNDVGMDAwOEVFMjRFMzQyNDQyMDAwMTEwNjIwMDA1MDAwMDAwMDBFQgorOjEwNDYwMDAwMDgwMDIxODUwMDAwMDAwMDE0NjAwMDA1MDAwMDAwMDA4MworOjEwNDYxMDAwOEY4MjAxMjgyNDQyMDAyMEFGODIwMTI4OEY4MjAxMjg0NgorOjEwNDYyMDAwOEM4MjAwMDQyQzQyMDAxMTUwNDAwMDEwQUM4MDAwMDAyRAorOjEwNDYzMDAwMDgwMDIxOTgwMDAwMDAwMDhFRTI0RTMwMjQ0MjAwMDE2NAorOjEwNDY0MDAwNTA0ODAwMDMwMDAwMTAyMThFRTI0RTMwMjQ0MjAwMDE0OQorOjEwNDY1MDAwQUVFMjRFMzA4RUUyNEUzMDAwMDIxMEMwMjQ0MjUwMzg5RQorOjEwNDY2MDAwMDJFMjIwMjFBQzhBMDAwMEFDOEMwMDA0NTRFMDAwMDY3OQorOjEwNDY3MDAwMjQwQjAwMDE4RjgyMDA1NDAxMjIxMDIzMkM0MjAwMzNBRQorOjEwNDY4MDAwMTQ0MEZGQTYwMDAwMDAwMDMxNjMwMEZGMjQwMjAwMDE3NworOjEwNDY5MDAwMTA2MjAwMjIwMDAwMDAwMDNDMDQwMDAxMjQ4NDUzOTBCQQorOjEwNDZBMDAwQUZBMDAwMTBBRkEwMDAxNDhGODYwMTIwOEY4NzAxMjRENworOjEwNDZCMDAwM0MwNTAwMDkwQzAwMjQwMzM0QTVGMDExMDgwMDIxQzRCNgorOjEwNDZDMDAwMDAwMDAwMDAzQzA0MDAwMTI0ODQ1MzlDQUZBMDAwMTRBRgorOjEwNDZEMDAwOEY4NjAxMjA4Rjg3MDEyNDNDMDUwMDA5MEMwMDI0MDNFQworOjEwNDZFMDAwMzRBNUYwMTAwODAwMjFDNDAwMDAwMDAwM0MwNDAwMDFDMworOjEwNDZGMDAwMjQ4NDUzQThBRkEwMDAxNDhFRTYwNjA4OEY0NzAyMjgzMgorOjEwNDcwMDAwM0MwNTAwMDkwQzAwMjQwMzM0QTVGMDBGOEVFMjAxQUMzNworOjEwNDcxMDAwMjQ0MjAwMDFBRUUyMDFBQzhFRTIwMUFDOEVFMjAxMjA0NworOjEwNDcyMDAwMjQ0MjAwMDFBRUUyMDEyMDhFRTIwMTIwOEVFMjAxNjgwNworOjEwNDczMDAwMjQ0MjAwMDFBRUUyMDE2ODA4MDAyMkU4OEVFMjAxNjgyRQorOjEwNDc0MDAwOEY0MjAyNUMyNkU0MDA5NEFFRTIwMDYwOEY0MjAyNjA3OQorOjEwNDc1MDAwMjc0NTAyMDAyNDA2MDAwODBDMDAyNDlBQUVFMjAwNjhGNworOjEwNDc2MDAwOEY4MjAyMjAzMDQyMDAwODE0NDAwMDAyMjQwMjAwMDExRgorOjEwNDc3MDAwMjQwMjAwMDJBRUUyMDEwODhFRTIwMTFDMjQ0MjAwMDE4NAorOjEwNDc4MDAwQUVFMjAxMUMwODAwMjJFODhFRTIwMTFDM0MwNDAwMDE5QworOjEwNDc5MDAwMjQ4NDUzRUNBRkEwMDAxMEFGQTAwMDE0OEZBNjAwMjAxQgorOjEwNDdBMDAwM0MwNTAwMDMwQzAwMjQwMzM0QTVGMDBGOTNBMjAwMjA2NQorOjEwNDdCMDAwM0MwMzA3MDAzNDYzMTAwMDAwNDMxMDI1QUZBMjAwMTgyQgorOjEwNDdDMDAwOEVFMjA2MDg4RjQzMDIyODI0NDIwMDAxMzA0OTAwRkY5MAorOjEwNDdEMDAwNTEyMzAwRTJBRkEwMDAxMDhFRTIwNjA4MDAwMjEwQzBENAorOjEwNDdFMDAwMDA1NzEwMjE4RkEzMDAxODhGQTQwMDFDQUM0MzA2MENBNworOjEwNDdGMDAwQUM0NDA2MTA4Rjg3MDEyMDI3NjIzODAwMjRFODAwMjA4RgorOjEwNDgwMDAwMDEwMjEwMkI1MDQwMDAwMTI3NjgzMDAwOEY4MjAxMjhFMAorOjEwNDgxMDAwMTEwMjAwMDQwMDAwMDAwMDhGODIwMTI0MTUwMjAwMDcyRAorOjEwNDgyMDAwMDAwMDEwMjE4RUUyMDFBNDAwMDAzODIxMjQ0MjAwMDE4MgorOjEwNDgzMDAwQUVFMjAxQTQwODAwMjI1RDhFRTIwMUE0OEVFNDA2MDgyNworOjEwNDg0MDAwMDAwNDIwQzAwMDgwMTgyMThFRTQwNDMwOEVFNTA0MzQ3QQorOjEwNDg1MDAwMDBBMzI4MjEwMEEzMzAyQjAwODIyMDIxMDA4NjIwMjFFNAorOjEwNDg2MDAwQUNFNDAwMDBBQ0U1MDAwNDhFRTMwNjA4MjQwMjAwMDg3NgorOjEwNDg3MDAwQTRFMjAwMEUyNDAyMDAwREFDRTIwMDE4QUNFOTAwMUMxQQorOjEwNDg4MDAwMDAwMzE4QzAyNDYzMDYwQzAyRTMxMDIxQUNFMjAwMDgwOAorOjEwNDg5MDAwOEVFMjA0QzRBQ0UyMDAxMEFGODgwMTIwOTJFMjRFMjAwOAorOjEwNDhBMDAwMTQ0MDAwMzcyNDA3MDAwMThFRTI0RTMwMDAwMjEwQzA5MQorOjEwNDhCMDAwMjQ0MjUwMzgwMkUyMjAyMThDODMwMDAwMjQwMjAwMDdBOQorOjEwNDhDMDAwMTQ2MjAwMUYwMDAwMDAwMDhFRTM0RTMwOEVFMjRFMzQ3MgorOjEwNDhEMDAwMTA2MjAwMUIyNDAzMDA0MDhDODIwMDA0MjQ0MjAwMDE2QgorOjEwNDhFMDAwQUM4MjAwMDQ4RUUyNEUzNDhFRTU0RTMwMjQ0MjAwMDE0QworOjEwNDhGMDAwMTA0MzAwMDcwMDAwMDAwMDhFRTI0RTM0MjQ0MjAwMDEwNQorOjEwNDkwMDAwMTBBMjAwMDUwMDAwMDAwMDA4MDAyMjQ3MDAwMDAwMDA3RgorOjEwNDkxMDAwMTRBMDAwMDUwMDAwMDAwMDhGODIwMTI4MjQ0MjAwMjAxRQorOjEwNDkyMDAwQUY4MjAxMjg4RjgyMDEyODhDODIwMDA0MkM0MjAwMTE2MgorOjEwNDkzMDAwNTA0MDAwMTNBQzgwMDAwMDA4MDAyMjVEMDAwMDAwMDAyMQorOjEwNDk0MDAwOEVFMjRFMzAyNDAzMDA0MDI0NDIwMDAxNTA0MzAwMDMxNQorOjEwNDk1MDAwMDAwMDEwMjE4RUUyNEUzMDI0NDIwMDAxQUVFMjRFMzBDMworOjEwNDk2MDAwOEVFMjRFMzAwMDAyMTBDMDI0NDI1MDM4MDJFMjIwMjE3NAorOjEwNDk3MDAwMjQwMjAwMDdBQzgyMDAwMDI0MDIwMDAxQUM4MjAwMDQ4MworOjEwNDk4MDAwNTRFMDAwMENBRUU5MDYwODNDMDQwMDAxMjQ4NDUzRjQxMgorOjEwNDk5MDAwQUZBMDAwMTBBRkEwMDAxNDhFRTYwNjA4OEY0NzAyMjhEMworOjEwNDlBMDAwM0MwNTAwMDkwQzAwMjQwMzM0QTVGMDAwMDgwMDIyRTBCNworOjEwNDlCMDAwMDAwMDAwMDA4RjgzMDEyMDI3NjIzODAwMjQ2NjAwMjA1OQorOjEwNDlDMDAwMDBDMjEwMkI1MDQwMDAwMTI3NjYzMDAwOEY4MjAxMjg2MgorOjEwNDlEMDAwMTBDMjAwMDQwMDAwMDAwMDhGODIwMTI0MTRDMjAwMDdFRQorOjEwNDlFMDAwMDAwMDAwMDA4RUUyMDFBNDAwMDAzODIxMjQ0MjAwMDFGMgorOjEwNDlGMDAwQUVFMjAxQTQwODAwMjJDNDhFRTIwMUE0OEVFMjA2MDgwMQorOjEwNEEwMDAwQUM2MjAwMUM4RUU0MDRBMDhFRTUwNEE0MjQ2MjAwMUNBOQorOjEwNEExMDAwQUM2MjAwMDgyNDAyMDAwOEE0NjIwMDBFMjQwMjAwMTEwNworOjEwNEEyMDAwQUM2MjAwMThBQzY0MDAwMEFDNjUwMDA0OEVFMjA0QzQwMworOjEwNEEzMDAwQUM2MjAwMTBBRjg2MDEyMDkyRTI0RTIwMTQ0MDAwMzc5NQorOjEwNEE0MDAwMjQwNzAwMDE4RUUyNEUzMDAwMDIxMEMwMjQ0MjUwMzg4QworOjEwNEE1MDAwMDJFMjIwMjE4QzgzMDAwMDI0MDIwMDEyMTQ2MjAwMUY1NQorOjEwNEE2MDAwMDAwMDAwMDA4RUUzNEUzMDhFRTI0RTM0MTA2MjAwMUJEOAorOjEwNEE3MDAwMjQwMzAwNDA4QzgyMDAwNDI0NDIwMDAxQUM4MjAwMDQyNAorOjEwNEE4MDAwOEVFMjRFMzQ4RUU1NEUzMDI0NDIwMDAxMTA0MzAwMDc4MgorOjEwNEE5MDAwMDAwMDAwMDA4RUUyNEUzNDI0NDIwMDAxMTBBMjAwMDUwNgorOjEwNEFBMDAwMDAwMDAwMDAwODAwMjJBRTAwMDAwMDAwMTRBMDAwMDU3NQorOjEwNEFCMDAwMDAwMDAwMDA4RjgyMDEyODI0NDIwMDIwQUY4MjAxMjhEQworOjEwNEFDMDAwOEY4MjAxMjg4QzgyMDAwNDJDNDIwMDExNTA0MDAwMTM3OAorOjEwNEFEMDAwQUM4MDAwMDAwODAwMjJDNDAwMDAwMDAwOEVFMjRFMzBDRQorOjEwNEFFMDAwMjQwMzAwNDAyNDQyMDAwMTUwNDMwMDAzMDAwMDEwMjEzMQorOjEwNEFGMDAwOEVFMjRFMzAyNDQyMDAwMUFFRTI0RTMwOEVFMjRFMzA2NQorOjEwNEIwMDAwMDAwMjEwQzAyNDQyNTAzODAyRTIyMDIxMjQwMjAwMTI4OAorOjEwNEIxMDAwQUM4MjAwMDAyNDAyMDAwMUFDODIwMDA0MTRFMDAwMUJGRgorOjEwNEIyMDAwMDAwMDAwMDAzQzA0MDAwMTI0ODQ1M0ZDQUZBMDAwMTBFRQorOjEwNEIzMDAwQUZBMDAwMTQ4RUU2MDYwODhGNDcwMjI4M0MwNTAwMDk0NgorOjEwNEI0MDAwMEMwMDI0MDMzNEE1RjAwMThFRTIwMUIwMjQ0MjAwMDFFMAorOjEwNEI1MDAwQUVFMjAxQjAwODAwMjJFMDhFRTIwMUIwM0MwNDAwMDFBOAorOjEwNEI2MDAwMjQ4NDU0MDhBRkEwMDAxNDhFRTYwNjA4OEY0NzAyMjg1QworOjEwNEI3MDAwM0MwNTAwMDkwQzAwMjQwMzM0QTVGMDA1OEVFMjAxQUNDRAorOjEwNEI4MDAwMjQ0MjAwMDFBRUUyMDFBQzhFRTIwMUFDOEVFMjAxNTBBMworOjEwNEI5MDAwMjQ0MjAwMDFBRUUyMDE1MDhFRTIwMTUwOEVFMjAxNjAzQgorOjEwNEJBMDAwMjQ0MjAwMDFBRUUyMDE2MDhFRTIwMTYwOEY0MzAyMkNEQworOjEwNEJCMDAwOEY0MjAxMEMxNDYyMDAwOTI0MDIwMDAyQUY4MjAwNjREQgorOjEwNEJDMDAwOEY4MjAwNjQxNDQwMDAwNTAwMDAwMDAwOEY0MzAyMkMxNworOjEwNEJEMDAwOEY0MjAxMEMxNDYyRjg3NTAwMDAwMDAwOEZCRjAwNDQ4MgorOjEwNEJFMDAwOEZCNjAwNDA4RkI1MDAzQzhGQjQwMDM4OEZCMzAwMzRDRgorOjEwNEJGMDAwOEZCMjAwMzA4RkIxMDAyQzhGQjAwMDI4MDNFMDAwMDg4NgorOjEwNEMwMDAwMjdCRDAwNDgyN0JERkZGODI0MDhGRkZGMTBBMDAwMTRBRgorOjEwNEMxMDAwMDAwMDQ4MjEzQzBBRURCODM1NEE4MzIwOTA4NzAwMDAwNworOjEwNEMyMDAwMjQ4NDAwMDEwMDAwMzAyMTAxMDcxMDI2MzA0MjAwMDFEOQorOjEwNEMzMDAwMTA0MDAwMDIwMDA4MTg0MjAwNkExODI2MDA2MDQwMjE1NworOjEwNEM0MDAwMjRDNjAwMDEyQ0MyMDAwODE0NDBGRkY3MDAwNzM4NDJCOAorOjEwNEM1MDAwMjUyOTAwMDEwMTI1MTAyQjE0NDBGRkYwMDAwMDAwMDA2MQorOjEwNEM2MDAwMDEwMDEwMjEwM0UwMDAwODI3QkQwMDA4MjdCREZGRTg3MAorOjEwNEM3MDAwMjc2NDI4MDBBRkJGMDAxMDBDMDAyNDg4MjQwNTEwMDAxMgorOjEwNEM4MDAwMjQwMjAwMjFBRjgwMDEwMEFGODAwMTA0QUY4MDAxMDg0MQorOjEwNEM5MDAwQUY4MDAxMTBBRjgwMDExNEFGODAwMTE4QUY4MDAxMjBGOAorOjEwNENBMDAwQUY4MDAxMjRBRjgwMDEyOEFGODAwMTMwQUY4MDAxMzQ5NAorOjEwNENCMDAwQUY4MDAxMzhBRUUwNEUyOEFFRTA0RTJDQUVFMDRFMzA3NAorOjEwNENDMDAwQUVFMDRFMzRBRjgyMDExQzhGNDIwMjE4MzA0MjAwNDBFOQorOjEwNENEMDAwMTA0MDAwMDQwMDAwMDAwMDhGODIwMTFDMzQ0MjAwMDREOAorOjEwNENFMDAwQUY4MjAxMUM4RkJGMDAxMDAzRTAwMDA4MjdCRDAwMTgzMQorOjEwNENGMDAwMjdCREZGRTBBRkJGMDAxODhGODIwMTA0QUZBMjAwMTBGNAorOjEwNEQwMDAwOEY4MjAxMDAzQzA1MDAwMkFGQTIwMDE0OEY4NjAwQjAyNAorOjEwNEQxMDAwOEY4NzAxMUMzQzA0MDAwMTI0ODQ1NEMwMEMwMDI0MDMzMAorOjEwNEQyMDAwMzRBNUYwMDA4RjgzMDBCMDNDMDI3RjAwMDA2MjE4MjQ5RAorOjEwNEQzMDAwM0MwMjA0MDAxMDYyMDAyOTAwNDMxMDJCMTQ0MDAwMDhCQworOjEwNEQ0MDAwM0MwMjIwMDAzQzAyMDEwMDEwNjIwMDI0M0MwMjAyMDBGMAorOjEwNEQ1MDAwMTA2MjAwMTEwMDAwMDAwMDA4MDAyMzc0MDAwMDAwMDAzMQorOjEwNEQ2MDAwMTA2MjAwMDgzQzAyNDAwMDE0NjIwMDFDMDAwMDAwMDBCOQorOjEwNEQ3MDAwOEVFMjAxOTAyNDQyMDAwMUFFRTIwMTkwMDgwMDIzNzQwQgorOjEwNEQ4MDAwOEVFMjAxOTA4RUUyMDE4QzI0NDIwMDAxQUVFMjAxOENBMQorOjEwNEQ5MDAwMDgwMDIzNzQ4RUUyMDE4QzhGODIwMTFDMzQ0MjAwMDJEMQorOjEwNERBMDAwQUY4MjAxMUM4RjgzMDEwNDhGODIwMEIwMzQ0MjAwMDE2NgorOjEwNERCMDAwQUY4MjAwQjBBRjgzMDEwNDhGODIwMTFDMjQwM0ZGRkQ4QQorOjEwNERDMDAwMDA0MzEwMjRBRjgyMDExQzhFRTIwMUEwMjQ0MjAwMDFBNgorOjEwNEREMDAwQUVFMjAxQTAwODAwMjM3NzhFRTIwMUEwOEY4MjAwQjAyRQorOjEwNERFMDAwMzQ0MjAwMDFBRjgyMDBCMDhGQkYwMDE4MDNFMDAwMDgxQQorOjEwNERGMDAwMjdCRDAwMjAyN0JERkZFMEFGQkYwMDFDQUZCMDAwMThFQgorOjEwNEUwMDAwOEY4MjAxMjBBRkEyMDAxMDhGODIwMTI0M0MwNTAwMDE5NworOjEwNEUxMDAwQUZBMjAwMTQ4Rjg2MDBBMDhGODcwMTFDM0MwNDAwMDEwNAorOjEwNEUyMDAwMjQ4NDU0Q0MwQzAwMjQwMzM0QTVGMDAwOEY4MzAwQTAwQworOjEwNEUzMDAwM0MwMjdGMDAwMDYyMTgyNDNDMDIwNDAwMTA2MjAwNTMxMAorOjEwNEU0MDAwMDAwMDgwMjEwMDQzMTAyQjE0NDAwMDA4M0MwNDIwMDA4NworOjEwNEU1MDAwM0MwMjAxMDAxMDYyMDA0RDNDMDIwMjAwMTA2MjAwM0E2OAorOjEwNEU2MDAwMDAwMDAwMDAwODAwMjNFMDAwMDAwMDAwMTA2NDAwMDNDMAorOjEwNEU3MDAwM0MwMjQwMDAxNDYyMDA0NTAwMDAwMDAwOEY4MjAwQTA0OAorOjEwNEU4MDAwMDA0NDEwMjQxMDQwMDAwNjAwMDAwMDAwOEVFMjAxOTQ0RgorOjEwNEU5MDAwMjQ0MjAwMDFBRUUyMDE5NDA4MDAyM0E5OEVFMjAxOTRBRAorOjEwNEVBMDAwOEVFMjAxOTgyNDQyMDAwMUFFRTIwMTk4OEVFMjAxOTg2MAorOjEwNEVCMDAwOEY4MjAxMUMzNDQyMDAwMkFGODIwMTFDOEY4MjAxMUNEMAorOjEwNEVDMDAwMzA0MjAyMDAxMDQwMDAxQjAwMDAwMDAwOEY4MzAwQTA1MQorOjEwNEVEMDAwOEY4NDAxMjQ4RjgyMDBBQzE0NDAwMDA3MjQwMjAwMDE1QgorOjEwNEVFMDAwM0MwMjAwMDEzNDQyRjAwMDAwNjIxMDI0NTA0MDAwMDFGNgorOjEwNEVGMDAwMjQxMDAwMDEyNDAyMDAwMTEyMDAwMDBEQUY4MjAwQTA2NgorOjEwNEYwMDAwOEY4MjAxMjQyNDQyRkZFMEFGODIwMTI0OEY4MjAxMjQ5QQorOjEwNEYxMDAwOEY4MjAxMjQyNzYzMzAwMDAwNDMxMDJCMTA0MDAwMDVDRQorOjEwNEYyMDAwMjc2MjM3RTBBRjgyMDEyNDA4MDAyM0NBMDAwMDAwMDA5NgorOjEwNEYzMDAwQUY4NDAxMjQ4RjgyMDExQzI0MDNGRkZEMDA0MzEwMjQ1MQorOjEwNEY0MDAwMDgwMDIzRTNBRjgyMDExQzhGODIwMTFDMzQ0MjAwMDI1RgorOjEwNEY1MDAwQUY4MjAxMUM4RjgzMDEyNDhGODIwMEEwMzQ0MjAwMDFBNAorOjEwNEY2MDAwQUY4MjAwQTBBRjgzMDEyNDhGODIwMTFDMjQwM0ZGRkRDOAorOjEwNEY3MDAwMDA0MzEwMjRBRjgyMDExQzhFRTIwMTlDMjQ0MjAwMDFGOAorOjEwNEY4MDAwQUVFMjAxOUMwODAwMjNFMzhFRTIwMTlDOEY4MjAwQTAyOAorOjEwNEY5MDAwMzQ0MjAwMDFBRjgyMDBBMDhGQkYwMDFDOEZCMDAwMTgwOAorOjEwNEZBMDAwMDNFMDAwMDgyN0JEMDAyMDAwMDAwMDAwM0MwMjAwMDFEMworOjEwNEZCMDAwOEM0MjVDNTgyN0JERkZFOEFGQkYwMDE0MTQ0MDAwMTJCQworOjEwNEZDMDAwQUZCMDAwMTAzQzEwMDAwMTI2MTA1REQwMDIwMDIwMjE3RgorOjEwNEZEMDAwMEMwMDI0ODgyNDA1MjAwMDI2MDIxRkUwM0MwMTAwMDE2QgorOjEwNEZFMDAwQUMyMjVEOTQzQzAxMDAwMUFDMjI1RDkwQUY0MjAyNTBDNgorOjEwNEZGMDAwMjQwMjIwMDBBRjUwMDI1NEFGNDIwMjU4MjQwMjAwMDFBNAorOjEwNTAwMDAwM0MwMTAwMDFBQzIyNUM1ODhGQkYwMDE0OEZCMDAwMTAyRgorOjEwNTAxMDAwMDNFMDAwMDgyN0JEMDAxODNDMDMwMDAxOEM2MzVEOTQ4OQorOjEwNTAyMDAwOEM4MjAwMDA4RkE4MDAxMDhGQTkwMDE0QUM2MjAwMDBEMQorOjEwNTAzMDAwM0MwMjAwMDE4QzQyNUQ5NDhDODMwMDA0QUM0MzAwMDQ2QworOjEwNTA0MDAwQUM0NTAwMDg4Rjg0MDA1NDI0NDNGRkUwQUM0NjAwMTBCOAorOjEwNTA1MDAwQUM0NzAwMTRBQzQ4MDAxOEFDNDkwMDFDM0MwMTAwMDFFRQorOjEwNTA2MDAwQUMyMzVEOTRBQzQ0MDAwQzNDMDIwMDAxMjQ0MjVERDBCMgorOjEwNTA3MDAwMDA2MjE4MkIxMDYwMDAwNTAwMDAwMDAwM0MwMjAwMDFENworOjEwNTA4MDAwOEM0MjVEOTAzQzAxMDAwMUFDMjI1RDk0M0MwMzAwMDEyOAorOjEwNTA5MDAwOEM2MzVEOTQzQzAyMDAwMThDNDI1QzQwQUM2MjAwMDA3OQorOjEwNTBBMDAwM0MwMzAwMDE4QzYzNUQ5NDNDMDIwMDAxOEM0MjVDNDAzNworOjEwNTBCMDAwQUM2MjAwMDQwM0UwMDAwOEFGNDMwMjUwM0MwMzAwMDE2RgorOjEwNTBDMDAwOEM2MzVEOTQzQzAyMDAwMThDNDI1QzQwMjdCREZGRDBBNAorOjEwNTBEMDAwQUZCNDAwMjA4RkI0MDA0MEFGQjAwMDEwMDA4MDgwMjEzQQorOjEwNTBFMDAwQUZCNTAwMjQ4RkI1MDA0NDhGQTQwMDQ4QUZCMTAwMTRDMQorOjEwNTBGMDAwMDBBMDg4MjFBRkJGMDAyOEFGQjMwMDFDQUZCMjAwMThEQQorOjEwNTEwMDAwQUM2MjAwMDAzQzA1MDAwMThDQTU1RDk0M0MwMjAwMDFFRQorOjEwNTExMDAwOEM0MjVDNDAwMEMwOTAyMTAwRTA5ODIxMTA4MDAwMDY4NQorOjEwNTEyMDAwQUNBMjAwMDQyNEE1MDAwODBDMDAyNDkwMjQwNjAwMTg1QQorOjEwNTEzMDAwMDgwMDI0NEUwMDAwMDAwMDI0QTQwMDA4MEMwMDI0ODg2RAorOjEwNTE0MDAwMjQwNTAwMTgzQzAyMDAwMThDNDI1RDk0M0MwNTAwMDFERQorOjEwNTE1MDAwMjRBNTVERDAyNDQyRkZFMDNDMDEwMDAxQUMyMjVEOTQxNworOjEwNTE2MDAwMDA0NTEwMkIxMDQwMDAwNTAwMDAwMDAwM0MwMjAwMDEyQgorOjEwNTE3MDAwOEM0MjVEOTAzQzAxMDAwMUFDMjI1RDk0M0MwMzAwMDEzNworOjEwNTE4MDAwOEM2MzVEOTQ4RTAyMDAwMEFDNjIwMDAwM0MwMzAwMDE2MQorOjEwNTE5MDAwOEM2MzVEOTQ4RTAyMDAwNEFDNjIwMDA0QUM3MTAwMDg2NAorOjEwNTFBMDAwOEY4NDAwNTQyNDYyRkZFMDNDMDEwMDAxQUMyMjVEOTQzNgorOjEwNTFCMDAwMDA0NTEwMkJBQzcyMDAxMEFDNzMwMDE0QUM3NDAwMThENgorOjEwNTFDMDAwQUM3NTAwMUMxMDQwMDAwNUFDNjQwMDBDM0MwMjAwMDFGMgorOjEwNTFEMDAwOEM0MjVEOTAzQzAxMDAwMUFDMjI1RDk0M0MwMzAwMDFENworOjEwNTFFMDAwOEM2MzVEOTQzQzAyMDAwMThDNDI1QzQwQUM2MjAwMDAyOAorOjEwNTFGMDAwM0MwMzAwMDE4QzYzNUQ5NDNDMDIwMDAxOEM0MjVDNDBFNgorOjEwNTIwMDAwQUM2MjAwMDRBRjQzMDI1MDhGQkYwMDI4OEZCNTAwMjQ2QQorOjEwNTIxMDAwOEZCNDAwMjA4RkIzMDAxQzhGQjIwMDE4OEZCMTAwMTQyMAorOjEwNTIyMDAwOEZCMDAwMTAwM0UwMDAwODI3QkQwMDMwMTBBMDAwMDU3QgorOjEwNTIzMDAwMDAwMDAwMDBBQzgwMDAwMDI0QTVGRkZDMTRBMEZGRkRDRQorOjEwNTI0MDAwMjQ4NDAwMDQwM0UwMDAwODAwMDAwMDAwMTBDMDAwMDdGMAorOjEwNTI1MDAwMDAwMDAwMDA4QzgyMDAwMDI0ODQwMDA0MjRDNkZGRkNBRgorOjEwNTI2MDAwQUNBMjAwMDAxNEMwRkZGQjI0QTUwMDA0MDNFMDAwMDg2QQorOjEwNTI3MDAwMDAwMDAwMDAxMEMwMDAwNzAwMDAwMDAwOENBMjAwMDAyOQorOjEwNTI4MDAwMjRBNTAwMDQyNEM2RkZGQ0FDODIwMDAwMTRDMEZGRkI3MAorOjEwNTI5MDAwMjQ4NDAwMDQwM0UwMDAwODAwMDAwMDAwMDNFMDAwMDg4QworOjEwNTJBMDAwMDAwMDAwMDAyN0JERkZEOEFGQkYwMDIwOEVFMzA0RTQ1QworOjEwNTJCMDAwOEVFMjA0RTAxMDYyMDQzNjAwMDAwMDAwOEVFMjA0RTQ5NgorOjEwNTJDMDAwOEVFMzA0RkMwMDAyMTEwMDAwNjI2MDIxOTU4NzAwMDg1MworOjEwNTJEMDAwOEQ4QTAwMDA4RDhCMDAwNDk1OEQwMDBBOEVFMjcyNUMzMQorOjEwNTJFMDAwOEVFMzcyNkMzMEU0RkZGRjAwNDQxMDIxMDA2MjE4MkI0MworOjEwNTJGMDAwMTA2MDAwMTUzMUEyMDAwNDhGODIwMEQ4OEVFMzcyNTgyRQorOjEwNTMwMDAwMDA0MzEwMjNBRUUyNzI2QzhFRTI3MjZDMUM0MDAwMDMwQworOjEwNTMxMDAwM0MwMzAwMDEwMDQzMTAyMUFFRTI3MjZDOEVFMjcyNUMyRAorOjEwNTMyMDAwOEVFMzcyNkMwMDQ0MTAyMTAwNjIxODJCMTA2MDAwMDY5RQorOjEwNTMzMDAwMzFBMjAwMDQ4RUUyMDFCODI0NDIwMDAxQUVFMjAxQjhCRAorOjEwNTM0MDAwMDgwMDI4RTE4RUUyMDFCODEwNDAwMjQwMzFBMjAyMDBCQworOjEwNTM1MDAwMTA0MDAxNEQwMDAwNDgyMTk2RTIwNDVBMzA0MjAwMTBFRQorOjEwNTM2MDAwMTA0MDAxNDkwMDAwMDAwMDhGODQwMTAwMjc2MjMwMDBENgorOjEwNTM3MDAwMjQ4NTAwMjAwMEEyMTAyQjUwNDAwMDAxMjc2NTI4MDA0MgorOjEwNTM4MDAwOEY4MjAxMDgxMEEyMDAwNDAwMDAwMDAwOEY4MjAxMDQzNworOjEwNTM5MDAwMTRBMjAwMDYyNDAyMDAwQzhFRTIwMUE4MjQ0MjAwMDE5RgorOjEwNTNBMDAwQUVFMjAxQTgwODAwMjUyQzhFRTIwMUE4QUM4QTAwMDAxQworOjEwNTNCMDAwQUM4QjAwMDQ4RUUzNzI2NDI0MDYwMDA1QTQ4MjAwMEUwOAorOjEwNTNDMDAwQUM4NjAwMThBQzgzMDAwODhFRTIwNEU0QUM4MjAwMUNCQQorOjEwNTNEMDAwOEVFMjA0QzhBQzgyMDAxMEFGODUwMTAwOTJFMjA0RUNCQQorOjEwNTNFMDAwMTQ0MDAwMzYyNDA5MDAwMThFRTI0RTI4MDAwMjEwQzA0RAorOjEwNTNGMDAwMjQ0MjRFMzgwMkUyMjAyMThDODIwMDAwMTQ0NjAwMUYxNQorOjEwNTQwMDAwMDAwMDAwMDA4RUUzNEUyODhFRTI0RTJDMTA2MjAwMUIzRQorOjEwNTQxMDAwMjQwMzAwNDA4QzgyMDAwNDI0NDIwMDAxQUM4MjAwMDQ3QQorOjEwNTQyMDAwOEVFMjRFMkM4RUU1NEUyODI0NDIwMDAxMTA0MzAwMDdFOAorOjEwNTQzMDAwMDAwMDAwMDA4RUUyNEUyQzI0NDIwMDAxMTBBMjAwMDU2NAorOjEwNTQ0MDAwMDAwMDAwMDAwODAwMjUxNjAwMDAwMDAwMTRBMDAwMDU2MAorOjEwNTQ1MDAwMDAwMDAwMDA4RjgyMDEwODI0NDIwMDIwQUY4MjAxMDg3MgorOjEwNTQ2MDAwOEY4MjAxMDg4QzgyMDAwNDJDNDIwMDExNTA0MDAwMTNFRQorOjEwNTQ3MDAwQUM4MDAwMDAwODAwMjUyQzAwMDAwMDAwOEVFMjRFMjhDMQorOjEwNTQ4MDAwMjQwMzAwNDAyNDQyMDAwMTUwNDMwMDAzMDAwMDEwMjE4NworOjEwNTQ5MDAwOEVFMjRFMjgyNDQyMDAwMUFFRTI0RTI4OEVFMjRFMjhEMworOjEwNTRBMDAwMDAwMjEwQzAyNDQyNEUzODAyRTIyMDIxMjQwMjAwMDVFRQorOjEwNTRCMDAwQUM4MjAwMDAyNDAyMDAwMUFDODIwMDA0MTUyMDAwMEEyNgorOjEwNTRDMDAwM0MwNDAwMDFBRkFCMDAxMDhFRTI3MjY0M0MwNDAwMDFBQQorOjEwNTREMDAwMjQ4NDU3MzAzQzA1MDAwNEFGQTIwMDE0OEVFNjA0RTQ5NworOjEwNTRFMDAwMDgwMDI4QkUzNEE1RjExNDhFRTI3MjY0MzQ4NDM4MDBCQQorOjEwNTRGMDAwMDM2NDE4MjEyNDQyMDAxMDAwNDMxMDJCMTQ0MDAwNzM1MQorOjEwNTUwMDAwMDAwMDAwMDA4RUUyNzI2NDI0NDgwMDEwMDM2NDEwMjE0MQorOjEwNTUxMDAwMDEwMjEwMkIxNDQwMDAwMjNDMDJGRkZGMDEwMjQwMjE1NworOjEwNTUyMDAwOEY4NTAxMDAyNzYyMzAwMDI0QTYwMDIwMDBDMjEwMkJDNgorOjEwNTUzMDAwNTA0MDAwMDEyNzY2MjgwMDhGODIwMTA4MTBDMjAwMDQzNQorOjEwNTU0MDAwMDAwMDAwMDA4RjgyMDEwNDE0QzIwMDA3MjU2MzAwMENENAorOjEwNTU1MDAwOEVFMjAxQTgwMDAwNDgyMTI0NDIwMDAxQUVFMjAxQTgyOQorOjEwNTU2MDAwMDgwMDI1QTA4RUUyMDFBODJDNjQwMDBDMDE0NDEwMjE0MworOjEwNTU3MDAwQUNBMjAwMDBBQ0EzMDAwNDI0RTJGRkY0QTRBMjAwMEUzRAorOjEwNTU4MDAwMjQwMjAwMDZBQ0E4MDAwOEFDQTIwMDE4OEVFMjA0RTRENQorOjEwNTU5MDAwQUNBMjAwMUM4RUUyMDRDODNDMDMwMDAyMDA0MzEwMjVBQworOjEwNTVBMDAwQUNBMjAwMTBBRjg2MDEwMDkyRTIwNEVDMTQ0MDAwMzc3OAorOjEwNTVCMDAwMjQwOTAwMDE4RUUyNEUyODAwMDIxMEMwMjQ0MjRFMzgxOQorOjEwNTVDMDAwMDJFMjIwMjE4QzgzMDAwMDI0MDIwMDA1MTQ2MjAwMUZFNworOjEwNTVEMDAwMDAwMDAwMDA4RUUzNEUyODhFRTI0RTJDMTA2MjAwMUI2RAorOjEwNTVFMDAwMjQwMzAwNDA4QzgyMDAwNDI0NDIwMDAxQUM4MjAwMDRBOQorOjEwNTVGMDAwOEVFMjRFMkM4RUU1NEUyODI0NDIwMDAxMTA0MzAwMDcxNworOjEwNTYwMDAwMDAwMDAwMDA4RUUyNEUyQzI0NDIwMDAxMTBBMjAwMDU5MgorOjEwNTYxMDAwMDAwMDAwMDAwODAwMjU4QTAwMDAwMDAwMTRBMDAwMDUxQQorOjEwNTYyMDAwMDAwMDAwMDA4RjgyMDEwODI0NDIwMDIwQUY4MjAxMDhBMAorOjEwNTYzMDAwOEY4MjAxMDg4QzgyMDAwNDJDNDIwMDExNTA0MDAwMTMxQworOjEwNTY0MDAwQUM4MDAwMDAwODAwMjVBMDAwMDAwMDAwOEVFMjRFMjg3QgorOjEwNTY1MDAwMjQwMzAwNDAyNDQyMDAwMTUwNDMwMDAzMDAwMDEwMjFCNQorOjEwNTY2MDAwOEVFMjRFMjgyNDQyMDAwMUFFRTI0RTI4OEVFMjRFMjgwMQorOjEwNTY3MDAwMDAwMjEwQzAyNDQyNEUzODAyRTIyMDIxMjQwMjAwMDUxQworOjEwNTY4MDAwQUM4MjAwMDAyNDAyMDAwMUFDODIwMDA0MTUyMDAwMEE1NAorOjEwNTY5MDAwMjUwOEZGRkNBRkFCMDAxMDhFRTI3MjY0M0MwNDAwMDFGMQorOjEwNTZBMDAwMjQ4NDU3MzAzQzA1MDAwNEFGQTIwMDE0OEVFNjA0RTRDNQorOjEwNTZCMDAwMDgwMDI4QkUzNEE1RjEyNTM0MDI4MTAwQTUwMjAwMDBBRgorOjEwNTZDMDAwOTU4MjAwMEUwODAwMjYxREE1MDIwMDAyOEY4NTAxMDBBQworOjEwNTZEMDAwMjc2MjMwMDAyNEE2MDAyMDAwQzIxMDJCNTA0MDAwMDE5OQorOjEwNTZFMDAwMjc2NjI4MDA4RjgyMDEwODEwQzIwMDA0MDAwMDAwMDAxNQorOjEwNTZGMDAwOEY4MjAxMDQxNEMyMDAwNzI1NjMwMDBDOEVFMjAxQTgwQQorOjEwNTcwMDAwMDAwMDQ4MjEyNDQyMDAwMUFFRTIwMUE4MDgwMDI2MEQ1NQorOjEwNTcxMDAwOEVFMjAxQTgyQzY0MDAwQzAxNDQxMDIxQUNBMjAwMDAxMAorOjEwNTcyMDAwQUNBMzAwMDQ4RUUzNzI2NDI0RTJGRkY0QTRBMjAwMEU5MgorOjEwNTczMDAwMjQwMjAwMDZBQ0EyMDAxODI0NjMwMDEwQUNBMzAwMDhFOQorOjEwNTc0MDAwOEVFMjA0RTRBQ0EyMDAxQzhFRTIwNEM4M0MwMzAwMDIxQQorOjEwNTc1MDAwMDA0MzEwMjVBQ0EyMDAxMEFGODYwMTAwOTJFMjA0RUNEOQorOjEwNTc2MDAwMTQ0MDAwMzcyNDA5MDAwMThFRTI0RTI4MDAwMjEwQzBDOAorOjEwNTc3MDAwMjQ0MjRFMzgwMkUyMjAyMThDODMwMDAwMjQwMjAwMDVERQorOjEwNTc4MDAwMTQ2MjAwMUYwMDAwMDAwMDhFRTM0RTI4OEVFMjRFMkNCMworOjEwNTc5MDAwMTA2MjAwMUIyNDAzMDA0MDhDODIwMDA0MjQ0MjAwMDE5QworOjEwNTdBMDAwQUM4MjAwMDQ4RUUyNEUyQzhFRTU0RTI4MjQ0MjAwMDE4RAorOjEwNTdCMDAwMTA0MzAwMDcwMDAwMDAwMDhFRTI0RTJDMjQ0MjAwMDEzRQorOjEwNTdDMDAwMTBBMjAwMDUwMDAwMDAwMDA4MDAyNUY3MDAwMDAwMDBGRQorOjEwNTdEMDAwMTRBMDAwMDUwMDAwMDAwMDhGODIwMTA4MjQ0MjAwMjA3MAorOjEwNTdFMDAwQUY4MjAxMDg4RjgyMDEwODhDODIwMDA0MkM0MjAwMTFENAorOjEwNTdGMDAwNTA0MDAwMTNBQzgwMDAwMDA4MDAyNjBEMDAwMDAwMDA5RgorOjEwNTgwMDAwOEVFMjRFMjgyNDAzMDA0MDI0NDIwMDAxNTA0MzAwMDM0RQorOjEwNTgxMDAwMDAwMDEwMjE4RUUyNEUyODI0NDIwMDAxQUVFMjRFMjgwNAorOjEwNTgyMDAwOEVFMjRFMjgwMDAyMTBDMDI0NDI0RTM4MDJFMjIwMjFBRgorOjEwNTgzMDAwMjQwMjAwMDVBQzgyMDAwMDI0MDIwMDAxQUM4MjAwMDRCNgorOjEwNTg0MDAwMTUyMDAwMEEzNDAyODEwMEFGQUIwMDEwOEVFMjcyNjRCMgorOjEwNTg1MDAwM0MwNDAwMDEyNDg0NTczMDNDMDUwMDA0QUZBMjAwMTQyRQorOjEwNTg2MDAwOEVFNjA0RTQwODAwMjhCRTM0QTVGMDE1OEVFMzcyNjRDOQorOjEwNTg3MDAwQTQ2MjAwMEM4RUUzNzI2NDk1ODIwMDBFQTQ2MjAwMEU5NgorOjEwNTg4MDAwMDgwMDI2ODEyNEU3MDAwNDhGODQwMTAwMjc2MjMwMDA4RAorOjEwNTg5MDAwMjQ4NTAwMjAwMEEyMTAyQjUwNDAwMDAxMjc2NTI4MDAxRAorOjEwNThBMDAwOEY4MjAxMDgxMEEyMDAwNDAwMDAwMDAwOEY4MjAxMDQxMgorOjEwNThCMDAwMTRBMjAwMDcyNDAyMDAwNjhFRTIwMUE4MDAwMDQ4MjE3RAorOjEwNThDMDAwMjQ0MjAwMDFBRUUyMDFBODA4MDAyNjc3OEVFMjAxQTg3QQorOjEwNThEMDAwQUM4QTAwMDBBQzhCMDAwNDhFRTM3MjY0QTQ4NzAwMEVENworOjEwNThFMDAwQUM4MjAwMThBQzgzMDAwODhFRTIwNEU0QUM4MjAwMUM5OQorOjEwNThGMDAwOEVFMjA0QzgzQzAzMDAwMjAwNDMxMDI1QUM4MjAwMTA3NQorOjEwNTkwMDAwQUY4NTAxMDA5MkUyMDRFQzE0NDAwMDM3MjQwOTAwMDE0NQorOjEwNTkxMDAwOEVFMjRFMjgwMDAyMTBDMDI0NDI0RTM4MDJFMjIwMjFCRQorOjEwNTkyMDAwOEM4MzAwMDAyNDAyMDAwNTE0NjIwMDFGMDAwMDAwMDBBOAorOjEwNTkzMDAwOEVFMzRFMjg4RUUyNEUyQzEwNjIwMDFCMjQwMzAwNDBBMgorOjEwNTk0MDAwOEM4MjAwMDQyNDQyMDAwMUFDODIwMDA0OEVFMjRFMkNDMgorOjEwNTk1MDAwOEVFNTRFMjgyNDQyMDAwMTEwNDMwMDA3MDAwMDAwMDA5RAorOjEwNTk2MDAwOEVFMjRFMkMyNDQyMDAwMTEwQTIwMDA1MDAwMDAwMDAyRgorOjEwNTk3MDAwMDgwMDI2NjEwMDAwMDAwMDE0QTAwMDA1MDAwMDAwMDBERgorOjEwNTk4MDAwOEY4MjAxMDgyNDQyMDAyMEFGODIwMTA4OEY4MjAxMDgyMworOjEwNTk5MDAwOEM4MjAwMDQyQzQyMDAxMTUwNDAwMDEzQUM4MDAwMDBBNworOjEwNTlBMDAwMDgwMDI2NzcwMDAwMDAwMDhFRTI0RTI4MjQwMzAwNDAwNQorOjEwNTlCMDAwMjQ0MjAwMDE1MDQzMDAwMzAwMDAxMDIxOEVFMjRFMjhEMworOjEwNTlDMDAwMjQ0MjAwMDFBRUUyNEUyODhFRTI0RTI4MDAwMjEwQzBCMgorOjEwNTlEMDAwMjQ0MjRFMzgwMkUyMjAyMTI0MDIwMDA1QUM4MjAwMDA1RAorOjEwNTlFMDAwMjQwMjAwMDFBQzgyMDAwNDE1MjAwMDA5M0MwNTAwMDREQgorOjEwNTlGMDAwQUZBQjAwMTA4RUUyNzI2NDNDMDQwMDAxMjQ4NDU3MzA4NworOjEwNUEwMDAwQUZBMjAwMTQ4RUU2MDRFNDA4MDAyOEJFMzRBNUYwMDQxQQorOjEwNUExMDAwOEVFMjcyNUMzMEU3RkZGRjAwNDcxMDIxQUVFMjcyNUM1RAorOjEwNUEyMDAwOEVFMjA0RTQ4RUUzMDRGQzhFRTQ3MjU4MDAwMjExMDA1RQorOjEwNUEzMDAwMDA0MzEwMjFBQzQ0MDAwQzhFRTI3MjU4QUZBMjAwMTg1MworOjEwNUE0MDAwOEVFMzcyNUNBRkEzMDAxQzhFRTI3MjVDMkM0MjAwM0NDMQorOjEwNUE1MDAwMTA0MDAwMDQyNDYyMDAwMTI0MDNGRkZFMDA0MzEwMjREMAorOjEwNUE2MDAwQUZBMjAwMUM4RUUyNzI2NDNDMDYwMDAxMzRDNjM4MDAwRQorOjEwNUE3MDAwOEVFMzcyNUMyNDA1RkZGODAwNDcxMDIxMjQ0MjAwMDdFMgorOjEwNUE4MDAwMDA0NTEwMjQyNDYzMDAwN0FFRTI3MjU4OEVFMjcyNkM2NworOjEwNUE5MDAwOEVFNDcyNTgwMDY1MTgyNDAwNDMxMDIzQUVFMjcyNkM0NQorOjEwNUFBMDAwMDM2NjEwMjEwMDgyMjAyQjE0ODAwMDA0M0MwM0ZGRkZCQQorOjEwNUFCMDAwOEVFMjcyNTgwMDQzMTAyMUFFRTI3MjU4OEVFMjcyNThBNAorOjEwNUFDMDAwQUVFMjcyNjQ4RjgyMDBGMDI0NDcwMDA4Mjc2MjE4MDA1QgorOjEwNUFEMDAwMDBFMjEwMkI1MDQwMDAwMTI3NjcxMDAwOEY4MjAwRjQ3NQorOjEwNUFFMDAwMTRFMjAwMDcwMDAwMDAwMDhFRTIwMUI0MDAwMDQ4MjEyQgorOjEwNUFGMDAwMjQ0MjAwMDFBRUUyMDFCNDA4MDAyNkM0OEVFMjAxQjRFMworOjEwNUIwMDAwOEY4MjAwRjAyNDA5MDAwMThGQTMwMDE4OEZBNDAwMUNDRAorOjEwNUIxMDAwQUM0MzAwMDBBQzQ0MDAwNEFGODcwMEYwMTUyMDAwMTIzNQorOjEwNUIyMDAwMDAwRDExNDI4RjgyMDBGMEFGQTIwMDEwOEY4MjAwRjRBRQorOjEwNUIzMDAwM0MwNDAwMDEyNDg0NTczQ0FGQTIwMDE0OEZBNjAwMTgzNworOjEwNUI0MDAwOEZBNzAwMUMzQzA1MDAwNDBDMDAyNDAzMzRBNUYwMDVCRAorOjEwNUI1MDAwOEVFMjAwODgyNDQyMDAwMUFFRTIwMDg4OEVFMjAwODhENgorOjEwNUI2MDAwMDgwMDI4RDNBRUUwNzI1QzMwNDMwMDAzMjQwMjAwMDIzOAorOjEwNUI3MDAwMTA2MjAwMTYyODYyMDAwMzEwNDAwMDA1MjQwMjAwMDE5NAorOjEwNUI4MDAwMTA2MjAwMDgwMDAwMDAwMDA4MDAyNzAzMDAwMDAwMDA2OQorOjEwNUI5MDAwMjQwMjAwMDMxMDYyMDAxNzAwMDAwMDAwMDgwMDI3MDMyMQorOjEwNUJBMDAwMDAwMDAwMDA4RUUyMDBFODhFRTMwMEVDMjQ2MzAwMDFCOAorOjEwNUJCMDAwMkM2NDAwMDEwMDQ0MTAyMUFFRTIwMEU4QUVFMzAwRUNFQQorOjEwNUJDMDAwOEVFMjAwRTgwODAwMjcwMzhFRTMwMEVDOEVFMjAwRjA4RQorOjEwNUJEMDAwOEVFMzAwRjQyNDYzMDAwMTJDNjQwMDAxMDA0NDEwMjFEMgorOjEwNUJFMDAwQUVFMjAwRjBBRUUzMDBGNDhFRTIwMEYwMDgwMDI3MDMxRQorOjEwNUJGMDAwOEVFMzAwRjQ4RUUyMDBGODhFRTMwMEZDMjQ2MzAwMDFFMworOjEwNUMwMDAwMkM2NDAwMDEwMDQ0MTAyMUFFRTIwMEY4QUVFMzAwRkM3OQorOjEwNUMxMDAwOEVFMjAwRjg4RUUzMDBGQzhFRTI3MjVDOEVFNDAwRTAxRgorOjEwNUMyMDAwOEVFNTAwRTQwMDQwMTgyMTAwMDAxMDIxMDBBMzI4MjE4NworOjEwNUMzMDAwMDBBMzMwMkIwMDgyMjAyMTAwODYyMDIxQUVFNDAwRTA2QQorOjEwNUM0MDAwQUVFNTAwRTQwODAwMjhEM0FFRTA3MjVDMzBFMkZGRkY2RQorOjEwNUM1MDAwMTA0MDAxQzEzMUEyMDIwMDEwNDAwMTREMDAwMDQ4MjE1NgorOjEwNUM2MDAwOTZFMjA0NUEzMDQyMDAxMDEwNDAwMTQ5MDAwMDAwMDA0MgorOjEwNUM3MDAwOEY4NDAxMDAyNzYyMzAwMDI0ODUwMDIwMDBBMjEwMkJCMQorOjEwNUM4MDAwNTA0MDAwMDEyNzY1MjgwMDhGODIwMTA4MTBBMjAwMDRGRgorOjEwNUM5MDAwMDAwMDAwMDA4RjgyMDEwNDE0QTIwMDA2MjQwMjAwMEMwMAorOjEwNUNBMDAwOEVFMjAxQTgyNDQyMDAwMUFFRTIwMUE4MDgwMDI3NkU5RQorOjEwNUNCMDAwOEVFMjAxQThBQzhBMDAwMEFDOEIwMDA0OEVFMzcyNjQxMworOjEwNUNDMDAwMjQwNjAwMDVBNDgyMDAwRUFDODYwMDE4QUM4MzAwMDhGMAorOjEwNUNEMDAwOEVFMjA0RTRBQzgyMDAxQzhFRTIwNEM4QUM4MjAwMTBBOAorOjEwNUNFMDAwQUY4NTAxMDA5MkUyMDRFQzE0NDAwMDM2MjQwOTAwMDE2MworOjEwNUNGMDAwOEVFMjRFMjgwMDAyMTBDMDI0NDI0RTM4MDJFMjIwMjFEQgorOjEwNUQwMDAwOEM4MjAwMDAxNDQ2MDAxRjAwMDAwMDAwOEVFMzRFMjgyNQorOjEwNUQxMDAwOEVFMjRFMkMxMDYyMDAxQjI0MDMwMDQwOEM4MjAwMDQ5MworOjEwNUQyMDAwMjQ0MjAwMDFBQzgyMDAwNDhFRTI0RTJDOEVFNTRFMjgwNworOjEwNUQzMDAwMjQ0MjAwMDExMDQzMDAwNzAwMDAwMDAwOEVFMjRFMkNCOAorOjEwNUQ0MDAwMjQ0MjAwMDExMEEyMDAwNTAwMDAwMDAwMDgwMDI3NThBRQorOjEwNUQ1MDAwMDAwMDAwMDAxNEEwMDAwNTAwMDAwMDAwOEY4MjAxMDg3MAorOjEwNUQ2MDAwMjQ0MjAwMjBBRjgyMDEwODhGODIwMTA4OEM4MjAwMDQ0NworOjEwNUQ3MDAwMkM0MjAwMTE1MDQwMDAxM0FDODAwMDAwMDgwMDI3NkUzOAorOjEwNUQ4MDAwMDAwMDAwMDA4RUUyNEUyODI0MDMwMDQwMjQ0MjAwMDE1RgorOjEwNUQ5MDAwNTA0MzAwMDMwMDAwMTAyMThFRTI0RTI4MjQ0MjAwMDFFRgorOjEwNURBMDAwQUVFMjRFMjg4RUUyNEUyODAwMDIxMEMwMjQ0MjRFMzg0OQorOjEwNURCMDAwMDJFMjIwMjEyNDAyMDAwNUFDODIwMDAwMjQwMjAwMDEzRQorOjEwNURDMDAwQUM4MjAwMDQxNTIwMDAwQTNDMDQwMDAxQUZBQjAwMTBCNworOjEwNUREMDAwOEVFMjcyNjQzQzA0MDAwMTI0ODQ1NzMwM0MwNTAwMDRDOAorOjEwNURFMDAwQUZBMjAwMTQ4RUU2MDRFNDA4MDAyOEJFMzRBNUYwMTQyNworOjEwNURGMDAwOEVFMjcyNjQzNDg0MzgwMDAzNjQxODIxMjQ0MjAwMTA1NworOjEwNUUwMDAwMDA0MzEwMkIxNDQwMDA3MzAwMDAwMDAwOEVFMjcyNjQwNworOjEwNUUxMDAwMjQ0ODAwMTAwMzY0MTAyMTAxMDIxMDJCMTQ0MDAwMDJEQQorOjEwNUUyMDAwM0MwMkZGRkYwMTAyNDAyMThGODUwMTAwMjc2MjMwMDAwNAorOjEwNUUzMDAwMjRBNjAwMjAwMEMyMTAyQjUwNDAwMDAxMjc2NjI4MDAzNQorOjEwNUU0MDAwOEY4MjAxMDgxMEMyMDAwNDAwMDAwMDAwOEY4MjAxMDQ0QworOjEwNUU1MDAwMTRDMjAwMDcyNTYzMDAwQzhFRTIwMUE4MDAwMDQ4MjE0RgorOjEwNUU2MDAwMjQ0MjAwMDFBRUUyMDFBODA4MDAyN0UyOEVFMjAxQTg2OAorOjEwNUU3MDAwMkM2NDAwMEMwMTQ0MTAyMUFDQTIwMDAwQUNBMzAwMDQ2RgorOjEwNUU4MDAwMjRFMkZGRjRBNEEyMDAwRTI0MDIwMDA2QUNBODAwMDgzRAorOjEwNUU5MDAwQUNBMjAwMTg4RUUyMDRFNEFDQTIwMDFDOEVFMjA0Qzg5RQorOjEwNUVBMDAwM0MwMzAwMDIwMDQzMTAyNUFDQTIwMDEwQUY4NjAxMDBBNQorOjEwNUVCMDAwOTJFMjA0RUMxNDQwMDAzNzI0MDkwMDAxOEVFMjRFMjhERgorOjEwNUVDMDAwMDAwMjEwQzAyNDQyNEUzODAyRTIyMDIxOEM4MzAwMDBFMAorOjEwNUVEMDAwMjQwMjAwMDUxNDYyMDAxRjAwMDAwMDAwOEVFMzRFMjgxQgorOjEwNUVFMDAwOEVFMjRFMkMxMDYyMDAxQjI0MDMwMDQwOEM4MjAwMDRDMgorOjEwNUVGMDAwMjQ0MjAwMDFBQzgyMDAwNDhFRTI0RTJDOEVFNTRFMjgzNgorOjEwNUYwMDAwMjQ0MjAwMDExMDQzMDAwNzAwMDAwMDAwOEVFMjRFMkNFNgorOjEwNUYxMDAwMjQ0MjAwMDExMEEyMDAwNTAwMDAwMDAwMDgwMDI3Q0M2OAorOjEwNUYyMDAwMDAwMDAwMDAxNEEwMDAwNTAwMDAwMDAwOEY4MjAxMDg5RQorOjEwNUYzMDAwMjQ0MjAwMjBBRjgyMDEwODhGODIwMTA4OEM4MjAwMDQ3NQorOjEwNUY0MDAwMkM0MjAwMTE1MDQwMDAxM0FDODAwMDAwMDgwMDI3RTJGMgorOjEwNUY1MDAwMDAwMDAwMDA4RUUyNEUyODI0MDMwMDQwMjQ0MjAwMDE4RAorOjEwNUY2MDAwNTA0MzAwMDMwMDAwMTAyMThFRTI0RTI4MjQ0MjAwMDExRAorOjEwNUY3MDAwQUVFMjRFMjg4RUUyNEUyODAwMDIxMEMwMjQ0MjRFMzg3NworOjEwNUY4MDAwMDJFMjIwMjEyNDAyMDAwNUFDODIwMDAwMjQwMjAwMDE2QworOjEwNUY5MDAwQUM4MjAwMDQxNTIwMDAwQTI1MDhGRkZDQUZBQjAwMTBGRQorOjEwNUZBMDAwOEVFMjcyNjQzQzA0MDAwMTI0ODQ1NzMwM0MwNTAwMDRGNgorOjEwNUZCMDAwQUZBMjAwMTQ4RUU2MDRFNDA4MDAyOEJFMzRBNUYwMTU1NAorOjEwNUZDMDAwMzQwMjgxMDBBNTAyMDAwMDk1ODIwMDBFMDgwMDI4NUZCRgorOjEwNUZEMDAwQTUwMjAwMDI4Rjg1MDEwMDI3NjIzMDAwMjRBNjAwMjA2MAorOjEwNUZFMDAwMDBDMjEwMkI1MDQwMDAwMTI3NjYyODAwOEY4MjAxMDg1NAorOjEwNUZGMDAwMTBDMjAwMDQwMDAwMDAwMDhGODIwMTA0MTRDMjAwMDdEOAorOjEwNjAwMDAwMjU2MzAwMEM4RUUyMDFBODAwMDA0ODIxMjQ0MjAwMDExMworOjEwNjAxMDAwQUVFMjAxQTgwODAwMjg0RjhFRTIwMUE4MkM2NDAwMEMxMworOjEwNjAyMDAwMDE0NDEwMjFBQ0EyMDAwMEFDQTMwMDA0OEVFMzcyNjQxMgorOjEwNjAzMDAwMjRFMkZGRjRBNEEyMDAwRTI0MDIwMDA2QUNBMjAwMTg4MQorOjEwNjA0MDAwMjQ2MzAwMTBBQ0EzMDAwODhFRTIwNEU0QUNBMjAwMUNBMAorOjEwNjA1MDAwOEVFMjA0QzgzQzAzMDAwMjAwNDMxMDI1QUNBMjAwMTBFRAorOjEwNjA2MDAwQUY4NjAxMDA5MkUyMDRFQzE0NDAwMDM3MjQwOTAwMDFERAorOjEwNjA3MDAwOEVFMjRFMjgwMDAyMTBDMDI0NDI0RTM4MDJFMjIwMjE1NworOjEwNjA4MDAwOEM4MzAwMDAyNDAyMDAwNTE0NjIwMDFGMDAwMDAwMDA0MQorOjEwNjA5MDAwOEVFMzRFMjg4RUUyNEUyQzEwNjIwMDFCMjQwMzAwNDAzQgorOjEwNjBBMDAwOEM4MjAwMDQyNDQyMDAwMUFDODIwMDA0OEVFMjRFMkM1QgorOjEwNjBCMDAwOEVFNTRFMjgyNDQyMDAwMTEwNDMwMDA3MDAwMDAwMDAzNgorOjEwNjBDMDAwOEVFMjRFMkMyNDQyMDAwMTEwQTIwMDA1MDAwMDAwMDBDOAorOjEwNjBEMDAwMDgwMDI4MzkwMDAwMDAwMDE0QTAwMDA1MDAwMDAwMDA5RQorOjEwNjBFMDAwOEY4MjAxMDgyNDQyMDAyMEFGODIwMTA4OEY4MjAxMDhCQworOjEwNjBGMDAwOEM4MjAwMDQyQzQyMDAxMTUwNDAwMDEzQUM4MDAwMDA0MAorOjEwNjEwMDAwMDgwMDI4NEYwMDAwMDAwMDhFRTI0RTI4MjQwMzAwNDBDMworOjEwNjExMDAwMjQ0MjAwMDE1MDQzMDAwMzAwMDAxMDIxOEVFMjRFMjg2QgorOjEwNjEyMDAwMjQ0MjAwMDFBRUUyNEUyODhFRTI0RTI4MDAwMjEwQzA0QQorOjEwNjEzMDAwMjQ0MjRFMzgwMkUyMjAyMTI0MDIwMDA1QUM4MjAwMDBGNQorOjEwNjE0MDAwMjQwMjAwMDFBQzgyMDAwNDE1MjAwMDBBMzQwMjgxMDAwMAorOjEwNjE1MDAwQUZBQjAwMTA4RUUyNzI2NDNDMDQwMDAxMjQ4NDU3MzAxRgorOjEwNjE2MDAwM0MwNTAwMDRBRkEyMDAxNDhFRTYwNEU0MDgwMDI4QkUzQgorOjEwNjE3MDAwMzRBNUYwMTY4RUUzNzI2NEE0NjIwMDBDOEVFMzcyNjRBMAorOjEwNjE4MDAwOTU4MjAwMEVBNDYyMDAwRTA4MDAyOEMyMjRFNzAwMDRENQorOjEwNjE5MDAwOEY4MzAxMDAyNzYyMzAwMDI0NjQwMDIwMDA4MjEwMkJDRQorOjEwNjFBMDAwNTA0MDAwMDEyNzY0MjgwMDhGODIwMTA4MTA4MjAwMDRGQgorOjEwNjFCMDAwMDAwMDAwMDA4RjgyMDEwNDE0ODIwMDA3MjQwNTAwMDVGRQorOjEwNjFDMDAwOEVFMjAxQTgwMDAwNDgyMTI0NDIwMDAxQUVFMjAxQThBRAorOjEwNjFEMDAwMDgwMDI4QjY4RUUyMDFBOEFDNkEwMDAwQUM2QjAwMDQ4RgorOjEwNjFFMDAwOEVFMjcyNjRBNDY3MDAwRUFDNjUwMDE4QUM2MjAwMDgxMQorOjEwNjFGMDAwOEVFMjA0RTRBQzYyMDAxQzhFRTIwNEM4QUM2MjAwMTBDMworOjEwNjIwMDAwQUY4NDAxMDA5MkUyMDRFQzE0NDAwMDM2MjQwOTAwMDEzRQorOjEwNjIxMDAwOEVFMjRFMjgwMDAyMTBDMDI0NDI0RTM4MDJFMjIwMjFCNQorOjEwNjIyMDAwOEM4MjAwMDAxNDQ1MDAxRjAwMDAwMDAwOEVFMzRFMjgwMQorOjEwNjIzMDAwOEVFMjRFMkMxMDYyMDAxQjI0MDMwMDQwOEM4MjAwMDQ2RQorOjEwNjI0MDAwMjQ0MjAwMDFBQzgyMDAwNDhFRTI0RTJDOEVFNTRFMjhFMgorOjEwNjI1MDAwMjQ0MjAwMDExMDQzMDAwNzAwMDAwMDAwOEVFMjRFMkM5MworOjEwNjI2MDAwMjQ0MjAwMDExMEEyMDAwNTAwMDAwMDAwMDgwMDI4QTA0MAorOjEwNjI3MDAwMDAwMDAwMDAxNEEwMDAwNTAwMDAwMDAwOEY4MjAxMDg0QgorOjEwNjI4MDAwMjQ0MjAwMjBBRjgyMDEwODhGODIwMTA4OEM4MjAwMDQyMgorOjEwNjI5MDAwMkM0MjAwMTE1MDQwMDAxM0FDODAwMDAwMDgwMDI4QjZDQQorOjEwNjJBMDAwMDAwMDAwMDA4RUUyNEUyODI0MDMwMDQwMjQ0MjAwMDEzQQorOjEwNjJCMDAwNTA0MzAwMDMwMDAwMTAyMThFRTI0RTI4MjQ0MjAwMDFDQQorOjEwNjJDMDAwQUVFMjRFMjg4RUUyNEUyODAwMDIxMEMwMjQ0MjRFMzgyNAorOjEwNjJEMDAwMDJFMjIwMjEyNDAyMDAwNUFDODIwMDAwMjQwMjAwMDExOQorOjEwNjJFMDAwQUM4MjAwMDQxNTIwMDAwQjNDMDUwMDA0M0MwNDAwMDFCNgorOjEwNjJGMDAwMjQ4NDU3NDhBRkFCMDAxMEFGQTAwMDE0OEVFNjA0RTQyRQorOjEwNjMwMDAwMzRBNUYwMTcwQzAwMjQwMzMwRTdGRkZGMDgwMDI4RTE1NAorOjEwNjMxMDAwMDAwMDAwMDA4RUUyNzI2NDNDMDUwMDAxMzBFNEZGRkZFMworOjEwNjMyMDAwMDA0NDEwMjFBRUUyNzI2NDhFRTI3MjVDOEVFMzcyNjQwRAorOjEwNjMzMDAwMzRBNTM4MDAwMDQ0MTAyMUFFRTI3MjVDMDM2NTEwMjFFMAorOjEwNjM0MDAwMDA2MjE4MkIxNDYwMDAwNDNDMDNGRkZGOEVFMjcyNjRBRAorOjEwNjM1MDAwMDA0MzEwMjFBRUUyNzI2NDhFRTMwNEU0OTZFMjA0NTgzNgorOjEwNjM2MDAwMjQ2MzAwMDEyNDQyRkZGRjAwNjIxODI0QUVFMzA0RTQyQQorOjEwNjM3MDAwOEVFMzA0RTQ4RUUyMDRFMDE0NjIwMDA1MDAwMDAwMDBGNQorOjEwNjM4MDAwOEY4MjAwNjAyNDAzRkZGNzAwNDMxMDI0QUY4MjAwNjA3NworOjEwNjM5MDAwOEZCRjAwMjAwM0UwMDAwODI3QkQwMDI4MjdCREZGRTBENQorOjEwNjNBMDAwQUZCRjAwMTg4RUUzMDRFODhFRTIwNEUwMTA2MjAxODlCQQorOjEwNjNCMDAwMDAwMDAwMDA4RUUyMDRFODhFRTMwNEZDMDAwMjExMDBGRAorOjEwNjNDMDAwMDA2MjE4MjE5NDY3MDAwODkyRTIwNEVEOEM2ODAwMDBENgorOjEwNjNEMDAwOEM2OTAwMDQxMDQwMDAyMzk0NkEwMDBBOEVFMjA0QzgwRAorOjEwNjNFMDAwMzQ0NjA0MDAzMTQyMDIwMDEwNDAwMDFGMDAwMDAwMDA0QgorOjEwNjNGMDAwOTZFMjA0NUEzMDQyMDAxMDEwNDAwMDFCM0MwMjgwMDAxQworOjEwNjQwMDAwM0MwMTAwMDEwMDM3MDgyMUFDMjI4M0Q4OEVFMjcyNjQ3RgorOjEwNjQxMDAwOTQ2NDAwMEUzQzA1MDAwMTM0QTUzODAwMjQ0MjAwMDRCOQorOjEwNjQyMDAwQUVFMjcyNjQ4RUUzNzI2NDAwMDQyNDAwMDM2NTEwMjFGRQorOjEwNjQzMDAwM0MwMTAwMDEwMDM3MDgyMUFDMjQ4M0RDMDA2MjE4MkJFQQorOjEwNjQ0MDAwMTQ2MDAwMDUyNEU3MDAwNDhFRTI3MjY0M0MwM0ZGRkY0MQorOjEwNjQ1MDAwMDA0MzEwMjFBRUUyNzI2NDhFRTI3MjY0MDgwMDI5MTdENAorOjEwNjQ2MDAwQUVFMjcyNTg4RUU2MDRDODhFRTI3MjZDMzBFNEZGRkYzMgorOjEwNjQ3MDAwMDA0NDEwMkExMDQwMDAxNTAwMDAwMDAwOEY4MjAwRDg1MAorOjEwNjQ4MDAwOEVFMzcyNTgwMDQzMTAyM0FFRTI3MjZDOEVFMjcyNkM5RgorOjEwNjQ5MDAwMUM0MDAwMDcwMDQ0MTAyQThFRTI3MjZDM0MwMzAwMDE4RAorOjEwNjRBMDAwMDA0MzEwMjFBRUUyNzI2QzhFRTI3MjZDMDA0NDEwMkEzRQorOjEwNjRCMDAwMTA0MDAwMDYwMDAwMDAwMDhFRTIwMUI4MjQ0MjAwMDFGNgorOjEwNjRDMDAwQUVFMjAxQjgwODAwMkE3MjhFRTIwMUI4M0MwMjAwMDE3NworOjEwNjREMDAwMDA1NzEwMjE4QzQyODNEODU0NDAwMDAxMjRFN0ZGRkM3MAorOjEwNjRFMDAwMzE0MjAwMDQxMDQwMDBCOTMwRTJGRkZGM0MwMjAwMDFERAorOjEwNjRGMDAwMDA1NzEwMjE4QzQyODNEODEwNDAwMDJGMDAwMDUwMjFGQgorOjEwNjUwMDAwOEY4NDAxMDAyNzYyMzAwMDI0ODUwMDIwMDBBMjEwMkIxOAorOjEwNjUxMDAwNTA0MDAwMDEyNzY1MjgwMDhGODIwMTA4MTBBMjAwMzIzOAorOjEwNjUyMDAwMDAwMDAwMDA4RjgyMDEwNDEwQTIwMDJGMjQwMjAwMTUzOQorOjEwNjUzMDAwQUM4ODAwMDBBQzg5MDAwNDhFRTM3MjY0QTQ4NzAwMEU2RQorOjEwNjU0MDAwQUM4MjAwMThBQzgzMDAwODhFRTIwNEU4M0MwMzAwMDEzMgorOjEwNjU1MDAwMDA3NzE4MjE4QzYzODNEQ0FDODYwMDEwMDA0MzEwMjU4MworOjEwNjU2MDAwQUM4MjAwMUNBRjg1MDEwMDkyRTIwNEVDMTQ0MDAwNjY4RQorOjEwNjU3MDAwMjQwQTAwMDE4RUUyNEUyODI0MDMwMDQwMjQ0MjAwMDEzOAorOjEwNjU4MDAwNTA0MzAwMDMwMDAwMTAyMThFRTI0RTI4MjQ0MjAwMDFGNworOjEwNjU5MDAwQUVFMjRFMjg4RUUyNEUyODAwMDIxMEMwMjQ0MjRFMzg1MQorOjEwNjVBMDAwMDJFMjE4MjEyNDAyMDAxNUFDNjIwMDAwMjQwMjAwMDE1RQorOjEwNjVCMDAwMDgwMDI5QkZBQzYyMDAwNDhGODQwMTAwMjc2MjMwMDAwQworOjEwNjVDMDAwMjQ4NTAwMjAwMEEyMTAyQjUwNDAwMDAxMjc2NTI4MDBFMAorOjEwNjVEMDAwOEY4MjAxMDgxMEEyMDAwNDAwMDAwMDAwOEY4MjAxMDRENQorOjEwNjVFMDAwMTRBMjAwMDYyNDAyMDAwNjhFRTIwMUE4MjQ0MjAwMDE0MworOjEwNjVGMDAwQUVFMjAxQTgwODAwMjlCRjhFRTIwMUE4QUM4ODAwMDAyNQorOjEwNjYwMDAwQUM4OTAwMDQ4RUUzNzI2NEE0ODcwMDBFQUM4MjAwMTg4QgorOjEwNjYxMDAwQUM4MzAwMDg4RUUyMDRFOEFDODYwMDEwQUM4MjAwMUM1QgorOjEwNjYyMDAwQUY4NTAxMDA5MkUyMDRFQzE0NDAwMDM3MjQwQTAwMDExNworOjEwNjYzMDAwOEVFMjRFMjgwMDAyMTBDMDI0NDI0RTM4MDJFMjIwMjE5MQorOjEwNjY0MDAwOEM4MzAwMDAyNDAyMDAwNTE0NjIwMDFGMDAwMDAwMDA3QgorOjEwNjY1MDAwOEVFMzRFMjg4RUUyNEUyQzEwNjIwMDFCMjQwMzAwNDA3NQorOjEwNjY2MDAwOEM4MjAwMDQyNDQyMDAwMUFDODIwMDA0OEVFMjRFMkM5NQorOjEwNjY3MDAwOEVFNTRFMjgyNDQyMDAwMTEwNDMwMDA3MDAwMDAwMDA3MAorOjEwNjY4MDAwOEVFMjRFMkMyNDQyMDAwMTEwQTIwMDA1MDAwMDAwMDAwMgorOjEwNjY5MDAwMDgwMDI5QTkwMDAwMDAwMDE0QTAwMDA1MDAwMDAwMDA2NworOjEwNjZBMDAwOEY4MjAxMDgyNDQyMDAyMEFGODIwMTA4OEY4MjAxMDhGNgorOjEwNjZCMDAwOEM4MjAwMDQyQzQyMDAxMTUwNDAwMDEzQUM4MDAwMDA3QQorOjEwNjZDMDAwMDgwMDI5QkYwMDAwMDAwMDhFRTI0RTI4MjQwMzAwNDA4RAorOjEwNjZEMDAwMjQ0MjAwMDE1MDQzMDAwMzAwMDAxMDIxOEVFMjRFMjhBNgorOjEwNjZFMDAwMjQ0MjAwMDFBRUUyNEUyODhFRTI0RTI4MDAwMjEwQzA4NQorOjEwNjZGMDAwMjQ0MjRFMzgwMkUyMjAyMTI0MDIwMDA1QUM4MjAwMDAzMAorOjEwNjcwMDAwMjQwMjAwMDFBQzgyMDAwNDE1NDAwMDBBMjQwMjAwMDFBQQorOjEwNjcxMDAwQUZBOTAwMTA4RUUyNzI2NDNDMDQwMDAxMjQ4NDU3MzA1QgorOjEwNjcyMDAwM0MwNTAwMDRBRkEyMDAxNDhFRTYwNEU0MDgwMDJBNEZFMgorOjEwNjczMDAwMzRBNUYyMDRBMkUyMDRFRDhFRTIwNEU4OEVFMzA0RkM0OAorOjEwNjc0MDAwOEVFNDcyNTgzQzA2MDAwMTM0QzYzODAwM0MwMTAwMDE1QQorOjEwNjc1MDAwMDAzNzA4MjFBQzIwODNEODNDMDEwMDAxMDAzNzA4MjExNAorOjEwNjc2MDAwQUMyMDgzREMwMDAyMTEwMDAwNDMxMDIxQUM0NDAwMEM3QgorOjEwNjc3MDAwOEVFMjcyNjQyNDA1RkZGODMwRTNGRkZGMDA0MzEwMjEyRQorOjEwNjc4MDAwMjQ0MjAwMDcwMDQ1MTAyNDI0NjMwMDA3QUVFMjcyNTgzQgorOjEwNjc5MDAwOEVFMjcyNkM4RUU0NzI1ODAwNjUxODI0MDA0MzEwMjM1OAorOjEwNjdBMDAwQUVFMjcyNkMwMzY2MTAyMTAwODIyMDJCMTQ4MDAwMDQ3QworOjEwNjdCMDAwM0MwM0ZGRkY4RUUyNzI1ODAwNDMxMDIxQUVFMjcyNTg5NAorOjEwNjdDMDAwOEVFMjcyNTgwODAwMkE2NEFFRTI3MjY0MTA0MDAwNzNEMAorOjEwNjdEMDAwMDAwMDAwMDA4RjgzMDEwMDI3NjIzMDAwMjQ2NDAwMjA0NQorOjEwNjdFMDAwMDA4MjEwMkIxNDQwMDAwMjAwMDA1MDIxMjc2NDI4MDA3MgorOjEwNjdGMDAwOEY4MjAxMDgxMDgyMDAwNDAwMDAwMDAwOEY4MjAxMDREMworOjEwNjgwMDAwMTQ4MjAwMDYyNDA1MDAwNThFRTIwMUE4MjQ0MjAwMDEzRQorOjEwNjgxMDAwQUVFMjAxQTgwODAwMkE0NjhFRTIwMUE4QUM2ODAwMDA5QQorOjEwNjgyMDAwQUM2OTAwMDQ4RUUyNzI2NEE0NjcwMDBFQUM2NTAwMThDNworOjEwNjgzMDAwQUM2MjAwMDg4RUUyMDRFOEFDNjYwMDEwQUM2MjAwMUM5QQorOjEwNjg0MDAwQUY4NDAxMDA5MkUyMDRFQzE0NDAwMDM2MjQwQTAwMDFGNworOjEwNjg1MDAwOEVFMjRFMjgwMDAyMTBDMDI0NDI0RTM4MDJFMjIwMjE2RgorOjEwNjg2MDAwOEM4MjAwMDAxNDQ1MDAxRjAwMDAwMDAwOEVFMzRFMjhCQgorOjEwNjg3MDAwOEVFMjRFMkMxMDYyMDAxQjI0MDMwMDQwOEM4MjAwMDQyOAorOjEwNjg4MDAwMjQ0MjAwMDFBQzgyMDAwNDhFRTI0RTJDOEVFNTRFMjg5QworOjEwNjg5MDAwMjQ0MjAwMDExMDQzMDAwNzAwMDAwMDAwOEVFMjRFMkM0RAorOjEwNjhBMDAwMjQ0MjAwMDExMEEyMDAwNTAwMDAwMDAwMDgwMDJBMzA2OAorOjEwNjhCMDAwMDAwMDAwMDAxNEEwMDAwNTAwMDAwMDAwOEY4MjAxMDgwNQorOjEwNjhDMDAwMjQ0MjAwMjBBRjgyMDEwODhGODIwMTA4OEM4MjAwMDREQworOjEwNjhEMDAwMkM0MjAwMTE1MDQwMDAxM0FDODAwMDAwMDgwMDJBNDZGMgorOjEwNjhFMDAwMDAwMDAwMDA4RUUyNEUyODI0MDMwMDQwMjQ0MjAwMDFGNAorOjEwNjhGMDAwNTA0MzAwMDMwMDAwMTAyMThFRTI0RTI4MjQ0MjAwMDE4NAorOjEwNjkwMDAwQUVFMjRFMjg4RUUyNEUyODAwMDIxMEMwMjQ0MjRFMzhERAorOjEwNjkxMDAwMDJFMjIwMjEyNDAyMDAwNUFDODIwMDAwMjQwMjAwMDFEMgorOjEwNjkyMDAwQUM4MjAwMDQxNTQwMDAwQzMwRTVGRkZGM0MwNDAwMDE4MAorOjEwNjkzMDAwMjQ4NDU3NDgzQzA1MDAwNEFGQTkwMDEwQUZBMDAwMTQwMAorOjEwNjk0MDAwOEVFNjA0RTQzNEE1RjIzNzBDMDAyNDAzMzBFN0ZGRkZBMQorOjEwNjk1MDAwMDgwMDJBNzIwMDAwMDAwMDhFRTI3MjY0MDA0NTEwMjFENworOjEwNjk2MDAwQUVFMjcyNjQ4RUUyNzI2QzhFRTM3MjY0M0MwNDAwMDFFQgorOjEwNjk3MDAwMzQ4NDM4MDBBMkUwMDRFRDAwNDUxMDIzQUVFMjcyNkNDRQorOjEwNjk4MDAwMDM2NDEwMjEwMDYyMTgyQjE0NjAwMDA0M0MwM0ZGRkYxNQorOjEwNjk5MDAwOEVFMjcyNjQwMDQzMTAyMUFFRTI3MjY0OEVFMzA0RTg3QQorOjEwNjlBMDAwOTZFMjA0NTgyNDYzMDAwMTI0NDJGRkZGMDA2MjE4MjQ4OQorOjEwNjlCMDAwQUVFMzA0RTg4RUUzMDRFODhFRTIwNEUwMTQ2MjAwMDUyRQorOjEwNjlDMDAwMDAwMDAwMDA4RjgyMDA2MDI0MDNGRkY3MDA0MzEwMjRDMgorOjEwNjlEMDAwQUY4MjAwNjA4RkJGMDAxODAzRTAwMDA4MjdCRDAwMjBEMQorOjEwNjlFMDAwMjdCREZGRTBBRkJGMDAxQ0FGQjAwMDE4OEY4MjAxMDBEMQorOjEwNjlGMDAwOEVFMzRFMkM4RjgyMDEwNDhGODUwMTA4MjQwMjAwNDAxMworOjEwNkEwMDAwMjQ2MzAwMDE1MDYyMDAwMzAwMDAxMDIxOEVFMjRFMkMyRQorOjEwNkExMDAwMjQ0MjAwMDFBRUUyNEUyQzhFRTI0RTJDOEVFMzRFMkMzMAorOjEwNkEyMDAwMDAwMjEwQzAyNDQyNEUzODAyRTIyMDIxOEVFMjRFMjg5RAorOjEwNkEzMDAwOEM4NzAwMDQxNDYyMDAwNzAwQTAzMDIxOEY4MjAxMDhCNworOjEwNkE0MDAwMjQ0MjAwMjBBRjgyMDEwODhGODIwMTA4MDgwMDJBQTI5OAorOjEwNkE1MDAwQUM4MDAwMDA4RUUyNEUyQzI0MDMwMDQwMjQ0MjAwMDE1MgorOjEwNkE2MDAwNTA0MzAwMDMwMDAwMTAyMThFRTI0RTJDMjQ0MjAwMDEwRQorOjEwNkE3MDAwMDAwMjEwQzAyNDQyNEUzODAyRTIyMDIxOEM4MjAwMDQyMQorOjEwNkE4MDAwOEY4MzAxMDgwMDAyMTE0MDAwNjIxODIxQUY4MzAxMDhDMgorOjEwNkE5MDAwQUM4MDAwMDA4Q0MyMDAxODI0NDNGRkZFMkM2MjAwMTM1RgorOjEwNkFBMDAwMTA0MDAwQzEwMDAzMTA4MDNDMDEwMDAxMDAyMjA4MjFCOQorOjEwNkFCMDAwOEMyMjU3NzAwMDQwMDAwODAwMDAwMDAwOEVFMjA0RjBCNQorOjEwNkFDMDAwMDA0NzEwMjFBRUUyMDRGMDhFRTIwNEYwOEY0MzAyM0M1NgorOjEwNkFEMDAwMDA0MzEwMkIxNDQwMDBCRTAwMDAwMDAwOEVFMzA0RTRDRAorOjEwNkFFMDAwOEVFMjA0Rjg1MDYyMDBCQUEyRTAwNEY0OEY4MzAxMjAyMQorOjEwNkFGMDAwMjc2MjM4MDAyNDY2MDAyMDAwQzIxMDJCNTA0MDAwMDE5RAorOjEwNkIwMDAwMjc2NjMwMDA4RjgyMDEyODEwQzIwMDA0MDAwMDAwMDBCOAorOjEwNkIxMDAwOEY4MjAxMjQxNEMyMDAwNzAwMDAwMDAwOEVFMjAxQTQ0RAorOjEwNkIyMDAwMDAwMDgwMjEyNDQyMDAwMUFFRTIwMUE0MDgwMDJCMTJFMworOjEwNkIzMDAwOEVFMjAxQTQ4RUUyMDRFNEFDNjIwMDFDOEVFNDA0QjA5OAorOjEwNkI0MDAwOEVFNTA0QjQyNDYyMDAxQ0FDNjIwMDA4MjQwMjAwMDgzNAorOjEwNkI1MDAwQTQ2MjAwMEUyNDAyMDAxMUFDNjIwMDE4QUM2NDAwMDBCNAorOjEwNkI2MDAwQUM2NTAwMDQ4RUUyMDRDNEFDNjIwMDEwQUY4NjAxMjA2NAorOjEwNkI3MDAwOTJFMjRFMjAxNDQwMDAzNzI0MTAwMDAxOEVFMjRFMzA4NQorOjEwNkI4MDAwMDAwMjEwQzAyNDQyNTAzODAyRTIyMDIxOEM4MzAwMDAxMQorOjEwNkI5MDAwMjQwMjAwMTIxNDYyMDAxRjAwMDAwMDAwOEVFMzRFMzAzOQorOjEwNkJBMDAwOEVFMjRFMzQxMDYyMDAxQjI0MDMwMDQwOEM4MjAwMDRFRAorOjEwNkJCMDAwMjQ0MjAwMDFBQzgyMDAwNDhFRTI0RTM0OEVFNTRFMzA1OQorOjEwNkJDMDAwMjQ0MjAwMDExMDQzMDAwNzAwMDAwMDAwOEVFMjRFMzQxMgorOjEwNkJEMDAwMjQ0MjAwMDExMEEyMDAwNTAwMDAwMDAwMDgwMDJBRkM2OQorOjEwNkJFMDAwMDAwMDAwMDAxNEEwMDAwNTAwMDAwMDAwOEY4MjAxMjhCMgorOjEwNkJGMDAwMjQ0MjAwMjBBRjgyMDEyODhGODIwMTI4OEM4MjAwMDQ2OQorOjEwNkMwMDAwMkM0MjAwMTE1MDQwMDAxM0FDODAwMDAwMDgwMDJCMTJGMQorOjEwNkMxMDAwMDAwMDAwMDA4RUUyNEUzMDI0MDMwMDQwMjQ0MjAwMDFCOAorOjEwNkMyMDAwNTA0MzAwMDMwMDAwMTAyMThFRTI0RTMwMjQ0MjAwMDE0OAorOjEwNkMzMDAwQUVFMjRFMzA4RUUyNEUzMDAwMDIxMEMwMjQ0MjUwMzg5OAorOjEwNkM0MDAwMDJFMjIwMjEyNDAyMDAxMkFDODIwMDAwMjQwMjAwMDE5MgorOjEwNkM1MDAwQUM4MjAwMDQ1NjAwMDAwQjI0MTAwMDAxOEVFMjA0RTQxNAorOjEwNkM2MDAwM0MwNDAwMDEyNDg0NTc1NEFGQTAwMDE0QUZBMjAwMTBDQworOjEwNkM3MDAwOEVFNjA2MDg4RjQ3MDIyODNDMDUwMDA5MEMwMDI0MDMxNQorOjEwNkM4MDAwMzRBNUYwMDYxNjAwMDAwMzI0MDIwMDAxMDgwMDJCNzE1MQorOjEwNkM5MDAwQTJFMjA0RjQ4RUUyMDE3MDI0NDIwMDAxQUVFMjAxNzAyRgorOjEwNkNBMDAwOEVFMjAxNzA4RUUyMDRFNEEyRTAwNEY0QUVFMDA0RjBBRgorOjEwNkNCMDAwQUVFMjA0Rjg4RjQyMDIzQzUwNDAwMDQ1QUVFMDcyNzRGMAorOjEwNkNDMDAwOEVFMjAxODQyNDQyMDAwMUFFRTIwMTg0OEVFMjAxODQ1RQorOjEwNkNEMDAwMDgwMDJCNzFBRUUwNzI3NDhFRTIwNTA0MjQwMzAwNDBCQworOjEwNkNFMDAwMjQ0MjAwMDE1MDQzMDAwMzAwMDAxMDIxOEVFMjA1MDRGRAorOjEwNkNGMDAwMjQ0MjAwMDFBRUUyMDUwNDhFRTIwNTA0OENDMzAwMThCNAorOjEwNkQwMDAwMDAwMjEwODAwMDU3MTAyMThDNDQwNTA4MjQwMjAwMDM2MworOjEwNkQxMDAwMTQ2MjAwMEYwMDAwMDAwMDNDMDIwMDAxMDA1NzEwMjEyNworOjEwNkQyMDAwOTA0MjgzQjExMDQwMDAxNDAwMDAwMDAwOEVFMjAxRDBCOAorOjEwNkQzMDAwOEVFMzUyNDAwMDQ0MTAyMUFFRTIwMUQwOEVFMjAxRDgzMQorOjEwNkQ0MDAwMDA2NDE4MjEzMDYzMDBGRjA4MDAyQjU5QUVFMzUyNDA2NQorOjEwNkQ1MDAwOEVFMjAxQ0M4RUUzMEUxMDAwNDQxMDIxQUVFMjAxQ0M5NQorOjEwNkQ2MDAwOEVFMjAxRDgwMDY0MTgyMTMwNjMwMUZGQUVFMzBFMTBGQgorOjEwNkQ3MDAwMDA0NDEwMjFBRUUyMDFEODhFRTIwMDAwMzQ0MjAwNDAwRgorOjEwNkQ4MDAwMDgwMDJCNzFBRUUyMDAwMDhFRTIwMTRDM0MwMTAwMDFENAorOjEwNkQ5MDAwMDAzNzA4MjFBMDIwODNFMDI0NDIwMDAxQUVFMjAxNEMyQworOjEwNkRBMDAwMDgwMDJCNzE4RUUyMDE0Qzk0QzcwMDBFOENDMjAwMUNBRgorOjEwNkRCMDAwM0MwNDAwMDEyNDg0NTc2MEFGQTYwMDE0QUZBMjAwMTA2OQorOjEwNkRDMDAwOENDNjAwMTgzQzA1MDAwODBDMDAyNDAzMzRBNTA5MTBFQgorOjEwNkREMDAwOEZCRjAwMUM4RkIwMDAxODAzRTAwMDA4MjdCRDAwMjAwMworOjEwNkRFMDAwMjdCREZGOThBRkJGMDA2MEFGQkUwMDVDQUZCNjAwNThENAorOjEwNkRGMDAwQUZCNTAwNTRBRkI0MDA1MEFGQjMwMDRDQUZCMjAwNDhEMQorOjEwNkUwMDAwQUZCMTAwNDRBRkIwMDA0MDhGODMwMTA4OEY4MjAxMDQwRQorOjEwNkUxMDAwQUZBMDAwMjQxMDYyMDNFN0FGQTAwMDJDM0MxRTAwMDFDRAorOjEwNkUyMDAwMzdERTM4MDAzQzBCRkZGRjhGOTMwMTA4OEU2MjAwMTg5RAorOjEwNkUzMDAwOEY4MzAxMDQyNDQzRkZGRTJDNjIwMDE0MTA0MDAzQ0YxMworOjEwNkU0MDAwMDAwMzEwODAzQzAxMDAwMTAwMjIwODIxOEMyMjU3QzA2MQorOjEwNkU1MDAwMDA0MDAwMDgwMDAwMDAwMDk2NjMwMDBFOEVFMjcyNUNBNQorOjEwNkU2MDAwOEVFNDA0RjAwMDQzMTAyMUFFRTI3MjVDOEU2MzAwMUNERAorOjEwNkU3MDAwOTZFMjA0NTgyNDg0MDAwMUFFRTQwNEYwMjQ2MzAwMDE4NworOjEwNkU4MDAwMjQ0MkZGRkYwMDYyMTgyNEFFRTMwNEU0OEY0MjAyM0M3OAorOjEwNkU5MDAwMDA4MjIwMkIxNDgwMDNCOTAwMDAwMDAwOEY4MzAxMjBBMgorOjEwNkVBMDAwMjc2MjM4MDAyNDY2MDAyMDAwQzIxMDJCNTA0MDAwMDFFOQorOjEwNkVCMDAwMjc2NjMwMDA4RjgyMDEyODEwQzIwMDA0MDAwMDAwMDAwNQorOjEwNkVDMDAwOEY4MjAxMjQxNEMyMDAwNzAwMDAwMDAwOEVFMjAxQTQ5QQorOjEwNkVEMDAwMDAwMDgwMjEyNDQyMDAwMUFFRTIwMUE0MDgwMDJCRkU0NAorOjEwNkVFMDAwOEVFMjAxQTQ4RUUyMDRFNEFDNjIwMDFDOEVFNDA0QjBFNQorOjEwNkVGMDAwOEVFNTA0QjQyNDYyMDAxQ0FDNjIwMDA4MjQwMjAwMDg4MQorOjEwNkYwMDAwQTQ2MjAwMEUyNDAyMDAxMUFDNjIwMDE4QUM2NDAwMDAwMAorOjEwNkYxMDAwQUM2NTAwMDQ4RUUyMDRDNEFDNjIwMDEwQUY4NjAxMjBCMAorOjEwNkYyMDAwOTJFMjRFMjAxNDQwMDAzNzI0MTAwMDAxOEVFMjRFMzBEMQorOjEwNkYzMDAwMDAwMjEwQzAyNDQyNTAzODAyRTIyMDIxOEM4MzAwMDA1RAorOjEwNkY0MDAwMjQwMjAwMTIxNDYyMDAxRjAwMDAwMDAwOEVFMzRFMzA4NQorOjEwNkY1MDAwOEVFMjRFMzQxMDYyMDAxQjI0MEMwMDQwOEM4MjAwMDQzMAorOjEwNkY2MDAwMjQ0MjAwMDFBQzgyMDAwNDhFRTI0RTM0OEVFMzRFMzBBNworOjEwNkY3MDAwMjQ0MjAwMDExMDRDMDAwNzAwMDAwMDAwOEVFMjRFMzQ1NQorOjEwNkY4MDAwMjQ0MjAwMDExMDYyMDAwNTAwMDAwMDAwMDgwMDJCRTgwOAorOjEwNkY5MDAwMDAwMDAwMDAxNDYwMDAwNTAwMDAwMDAwOEY4MjAxMjgzRQorOjEwNkZBMDAwMjQ0MjAwMjBBRjgyMDEyODhGODIwMTI4OEM4MjAwMDRCNQorOjEwNkZCMDAwMkM0MjAwMTE1MDQwMDAxM0FDODAwMDAwMDgwMDJCRkU1MgorOjEwNkZDMDAwMDAwMDAwMDA4RUUyNEUzMDI0MEMwMDQwMjQ0MjAwMDFGQworOjEwNkZEMDAwNTA0QzAwMDMwMDAwMTAyMThFRTI0RTMwMjQ0MjAwMDE4QworOjEwNkZFMDAwQUVFMjRFMzA4RUUyNEUzMDAwMDIxMEMwMjQ0MjUwMzhFNQorOjEwNkZGMDAwMDJFMjIwMjEyNDAyMDAxMjI0MEMwMDAxQUM4MjAwMDBENQorOjEwNzAwMDAwQUM4QzAwMDQ1NjAwMDAwRDI0MTAwMDAxOEVFMjA0RTQ1NAorOjEwNzAxMDAwM0MwNDAwMDEyNDg0NTc1NEFGQTAwMDE0QUZBMjAwMTAxOAorOjEwNzAyMDAwOEVFNjA2MDg4RjQ3MDIyODNDMDUwMDA5MzRBNUYwMDZDNQorOjEwNzAzMDAwMEMwMDI0MDNBRkFCMDAzODhGQUIwMDM4MTIwMDAzMEFGQQorOjEwNzA0MDAwMjQwQzAwMDEwODAwMkYxOTAwMDAwMDAwOTY2QzAwMUNBMQorOjEwNzA1MDAwQUZBQzAwMkM5NjYyMDAxRTNDMEM4MDAwQUZBQzAwMjQ0QworOjEwNzA2MDAwQUU2MjAwMUM4RTc1MDAxQzhFRTIwNEZDOEVFNDA0RkNGMworOjEwNzA3MDAwMDAxNTE5MDAwMDYyMTAyMThDNTIwMDBDOTJFMjdCOThERQorOjEwNzA4MDAwMDA2NDE4MjE5NDc2MDAwQTE0NDAwMDAzMzJDMjAwMDIwMgorOjEwNzA5MDAwQUVGMjdCQTRBRUY1N0I5QzEwNDAwMDRCMDAwMDgwMjEzQgorOjEwNzBBMDAwOTZFMjA0NUEzMDQyMDAwMjEwNDAwMDQ3MDAwMDAwMDBGRgorOjEwNzBCMDAwOEU2MzAwMUM4RUUyMDRGQzAwMDMyMTAwMDA4MjEwMjE3QworOjEwNzBDMDAwOEM0MjAwMEMwMzdFMTgyMTI0NDIwMDIyMDA0MzEwMkIyNgorOjEwNzBEMDAwMTQ0MDAwMEEyNDA1MDAxNDhFRTIwNEZDMDA4MjEwMjFGMgorOjEwNzBFMDAwOEM0NDAwMENBRkFCMDAzODBDMDAyRjc1MjQ4NDAwMEVDQworOjEwNzBGMDAwOEZBQjAwMzgwODAwMkM1MjMwNTBGRkZGOEVFMjA0RkNBQQorOjEwNzEwMDAwMDA4MjEwMjE4QzQyMDAwQzk0NTAwMDBFOTQ0MzAwMTAxOQorOjEwNzExMDAwOTQ0NDAwMTI5NDQ1MDAxNDAyMDM4MDIxMDIwNDgwMjE0QgorOjEwNzEyMDAwMDIwNTgwMjE5NDQzMDAxNjk0NDQwMDE4OTQ0NTAwMUFFNworOjEwNzEzMDAwMDIwMzgwMjEwMjA0ODAyMTAyMDU4MDIxOTQ0MzAwMUM2NworOjEwNzE0MDAwOTQ0NDAwMUU5NDQyMDAyMDAyMDM4MDIxMDIwNDgwMjEwNgorOjEwNzE1MDAwMDIwMjgwMjEwMDEwMUMwMjMyMDJGRkZGMDA2MjgwMjEyNworOjEwNzE2MDAwOEU2MzAwMUM4RUUyMDRGQzAwMTAyNDAyMDAwMzI5MDA0MAorOjEwNzE3MDAwMDBBMjEwMjE4QzQzMDAwQzMyMDJGRkZGMDA4MjgwMjEwQworOjEwNzE4MDAwMDM3RTEwMjEyNDYzMDAxODAwNjIxODJCMTQ2MDAwMDk4QworOjEwNzE5MDAwMDAwMDAwMDA4RUUyMDRGQzAwQTIxMDIxOEM0MzAwMENEMQorOjEwNzFBMDAwMDAxMDEwMjczQzAxRkZGRjAwMjMwODIxMDgwMDJDNkY2RQorOjEwNzFCMDAwQTQyMjAwMTg4RUUyMDRGQzAwQTIxMDIxOEM0MzAwMENEMworOjEwNzFDMDAwMDAxMDEwMjdBNDYyMDAxODk2RTIwNDVBMDAwMDg4MjFEQgorOjEwNzFEMDAwMzA0MjAwMDgxNDQwMDA2MzAwMDBBMDIxOEU2MzAwMUNCMAorOjEwNzFFMDAwOEVFMjA0RkMwMDAzMzEwMDAwQzIxMDIxOEM0MjAwMEMyRQorOjEwNzFGMDAwMDM3RTE4MjEyNDQyMDAyMjAwNDMxMDJCMTQ0MDAwMzU0NgorOjEwNzIwMDAwMDAwMDAwMDA4RUUyMDRGQzAwQzIxMDIxOEM0MjAwMEM0MQorOjEwNzIxMDAwMjQ0NzAwMTAwMzdFMTAyMTAwRTIxMDJCNTA0MDAwMDE5MworOjEwNzIyMDAwMDBFQjM4MjE4RUUyMDRGQzk0RjEwMDAwMDBDMjEwMjEzMgorOjEwNzIzMDAwOEM0MjAwMEMyNDQ3MDAxNjAzN0UxMDIxMDBFMjEwMkIyNAorOjEwNzI0MDAwMTQ0MDAwMDIyNjM0RkZFQzAwRUIzODIxOEVFMjA0RkNFRgorOjEwNzI1MDAwOTBFMzAwMDEwMEMyMTAyMThDNDIwMDBDMjQ0NzAwMUE2OAorOjEwNzI2MDAwMDM3RTEwMjEwMEUyMTAyQjE0NDAwMDAyMDI4Mzg4MjFDQgorOjEwNzI3MDAwMDBFQjM4MjE5NEUyMDAwMDI0RTcwMDAyMDIyMjg4MjE3QQorOjEwNzI4MDAwMDM3RTEwMjEwMEUyMTAyQjUwNDAwMDAxMDBFQjM4MjE1QQorOjEwNzI5MDAwOTRFMjAwMDAyNEU3MDAwMjAyMjI4ODIxMDM3RTEwMjFFQworOjEwNzJBMDAwMDBFMjEwMkI1MDQwMDAwMTAwRUIzODIxOTRFMjAwMDA3NgorOjEwNzJCMDAwMjRFNzAwMDIwMjIyODgyMTAzN0UxMDIxMDBFMjEwMkIyNQorOjEwNzJDMDAwNTA0MDAwMDEwMEVCMzgyMTk0RTIwMDAwMDgwMDJDRDA2RgorOjEwNzJEMDAwMDIyMjg4MjE4RUUyMDRGQzAwQzIxMDIxOEM0MzAwMENBMworOjEwNzJFMDAwOEVFMjA0RkM5NDcxMDAxMDhFRTMwNEZDMDBDMjEwMjFCNQorOjEwNzJGMDAwOEM0NDAwMEMwMEMzMTgyMThDNjIwMDBDMjYzNEZGRUM3NworOjEwNzMwMDAwOTA4NDAwMTc4RUUzMDRGQzk0NDIwMDFBMDI4NDg4MjFDMgorOjEwNzMxMDAwMDBDMzE4MjE4QzY1MDAwQzhFRTMwNEZDMDIyMjg4MjEzNgorOjEwNzMyMDAwOEVFMjA0RkMwMEMzMTgyMTAwQzIxMDIxOEM0NDAwMEMyMgorOjEwNzMzMDAwOEM2MjAwMEM5NEEzMDAxQzk0ODQwMDFFOTQ0MjAwMjBENAorOjEwNzM0MDAwMDIyMzg4MjEwMjI0ODgyMTAyMjI4ODIxMDAxMTFDMDJBNAorOjEwNzM1MDAwMzIyMkZGRkYwMDYyODgyMTAwMTExQzAyMzIyMkZGRkY0RgorOjEwNzM2MDAwMDA2Mjg4MjEzMkMyMDAwMTEwNDAwMEIyMDAwMDAwMDAxQgorOjEwNzM3MDAwOTZFMjA0NUEzMDQyMDAwMTEwNDAwMEFFMzJDMjAwODA1MgorOjEwNzM4MDAwMTA0MDAwMDgwMDAwMDAwMDkyRTI3Qjk4MTQ0MDAwMDVDNQorOjEwNzM5MDAwMDAwMDAwMDAyNDBDMDAwMUEyRUM3Qjk4QUVGNTdCOUM2MQorOjEwNzNBMDAwQUVGMjdCQTQ4RUUzMDRGQzAwMTUxMTAwMDA0MzEwMjExMworOjEwNzNCMDAwOEM0NzAwMEMwMzdFMTgyMTI0RTIwMDBFMDA0MzEwMkJBMgorOjEwNzNDMDAwMTQ0MDAwMDgwMEUwMjAyMTI0MDUwMDBFMEMwMDJGNzU1OQorOjEwNzNEMDAwQUZBQjAwMzgzMDQyRkZGRjhGQUIwMDM4MDgwMDJEMDlGQgorOjEwNzNFMDAwMDIwMjgwMjE5NEU2MDAwMDI0RTcwMDAyOTRFNTAwMDBGOAorOjEwNzNGMDAwMjRFNzAwMDI5NEUzMDAwMDI0RTcwMDAyOTRFMjAwMDA4NgorOjEwNzQwMDAwMjRFNzAwMDI5NEU0MDAwMDI0RTcwMDAyMDIwNjgwMjE0MQorOjEwNzQxMDAwMDIwNTgwMjEwMjAzODAyMTAyMDI4MDIxOTRFMjAwMDAwMworOjEwNzQyMDAwOTRFMzAwMDIwMjA0ODAyMTAyMDI4MDIxMDIwMzgwMjFGMQorOjEwNzQzMDAwMDAxMDFDMDIzMjAyRkZGRjAwNjI4MDIxMDAxMDFDMDJCQgorOjEwNzQ0MDAwMzIwMkZGRkY4RUU0N0I5QzAwNjI4MDIxMTQ5NTAwMDREMQorOjEwNzQ1MDAwMzIwNUZGRkY5NjYyMDAxNjA4MDAyRDE3MDA1MTIwMjEwQgorOjEwNzQ2MDAwOTY2MjAwMTYwMDU0MjAyMTAwMDQxNDAyMzA4M0ZGRkZBRQorOjEwNzQ3MDAwMDA0MzIwMjEwMDg1MjAyMzAwMDQxNDAyMDA4MjIwMjFFMworOjEwNzQ4MDAwMzA4NEZGRkY1MDgwMDAwMTM0MDRGRkZGOEVFMjdCQTRCNAorOjEwNzQ5MDAwMjQ0MzAwMTcwMzdFMTAyMTAwNjIxMDJCNTA0MDAwMDE4RQorOjEwNzRBMDAwMDA2QjE4MjE5MDYzMDAwMDI0MDIwMDExMTQ2MjAwMzE2NworOjEwNzRCMDAwMjQwMjAwMDY4RUUyN0JBNDAzN0UxODIxMjQ0MjAwMjhDOQorOjEwNzRDMDAwMDA0MzEwMkIxNDQwMDAxODAwMDAwMDAwOEVFMjdCOUM0QgorOjEwNzREMDAwMTJBMjAwMEEzMkMyMDEwMDhFRTI3QkE0M0MwMUZGRkYyRgorOjEwNzRFMDAwMDAyMjA4MjE5NDIyMDAyODAwODIyMDIxMDAwNDFDMDI4RQorOjEwNzRGMDAwMzA4MkZGRkYwMDYyMjAyMTMyQzIwMTAwMTQ0MDAwMDRFQworOjEwNzUwMDAwMDAwNDEwMjc5MkUyN0I5ODE0NDAwMDAyMDAwNDEwMjcyOAorOjEwNzUxMDAwMzA0NEZGRkY4RUUyN0JBNDNDMDFGRkZGMDAyMjA4MjFFNAorOjEwNzUyMDAwMDgwMDJEOEFBNDI0MDAyODhFRTI3QjlDMTJBMjAwMDg2OQorOjEwNzUzMDAwMzJDMjAxMDA4RUUyN0JBNDk0NDIwMDI4MDA4MjIwMjEwNgorOjEwNzU0MDAwMDAwNDFDMDIzMDgyRkZGRjAwNjIyMDIxMzJDMjAxMDBEMQorOjEwNzU1MDAwMTQ0MDAwMDQwMDA0MTAyNzkyRTI3Qjk4MTQ0MDAwMDJCQgorOjEwNzU2MDAwMDAwNDEwMjczMDQ0RkZGRjhFRTI3QkE0MDgwMDJEOEEyMAorOjEwNzU3MDAwQTQ0NDAwMjgxNDYyMDAyRjAzN0UxODIxOEVFMjdCQTQwRAorOjEwNzU4MDAwMjQ0MjAwMzIwMDQzMTAyQjE0NDAwMDE4MDAwMDAwMDA3OQorOjEwNzU5MDAwOEVFMjdCOUMxMkEyMDAwQTMyQzIwMTAwOEVFMjdCQTQyMgorOjEwNzVBMDAwM0MwMUZGRkYwMDIyMDgyMTk0MjIwMDMyMDA4MjIwMjFBQQorOjEwNzVCMDAwMDAwNDFDMDIzMDgyRkZGRjAwNjIyMDIxMzJDMjAxMDA2MQorOjEwNzVDMDAwMTQ0MDAwMDQwMDA0MTAyNzkyRTI3Qjk4MTQ0MDAwMDI0QgorOjEwNzVEMDAwMDAwNDEwMjczMDQ0RkZGRjhFRTI3QkE0M0MwMUZGRkYzNAorOjEwNzVFMDAwMDAyMjA4MjEwODAwMkQ4QUE0MjQwMDMyOEVFMjdCOUMxMAorOjEwNzVGMDAwMTJBMjAwMDgzMkMyMDEwMDhFRTI3QkE0OTQ0MjAwMzI0MworOjEwNzYwMDAwMDA4MjIwMjEwMDA0MUMwMjMwODJGRkZGMDA2MjIwMjE0MgorOjEwNzYxMDAwMzJDMjAxMDAxNDQwMDAwNDAwMDQxMDI3OTJFMjdCOTg1QgorOjEwNzYyMDAwMTQ0MDAwMDIwMDA0MTAyNzMwNDRGRkZGOEVFMjdCQTRDOAorOjEwNzYzMDAwQTQ0NDAwMzI4RkFDMDAyNDExODAwMDJDMDM3RTE4MjE1QQorOjEwNzY0MDAwOEU0MjAwMDBBRTQyRkZGQzI2NDIwMDBBMDA0MzEwMkI4RgorOjEwNzY1MDAwMTQ0MDAwMUIzNDAzODEwMDI2NDMwMDA0MDM3RTEwMjFFNAorOjEwNzY2MDAwMDA2MjEwMkIxNDQwMDAwMzAwNjAyMDIxMDA2QjE4MjFFMQorOjEwNzY3MDAwMDA2MDIwMjE4QzYyMDAwMDI0NjMwMDA0QUU0MjAwMDAwMAorOjEwNzY4MDAwMDM3RTEwMjEwMDYyMTAyQjUwNDAwMDAxMDA2QjE4MjE3NgorOjEwNzY5MDAwOEM2MjAwMDBBQzgyMDAwMDM0MDI4MTAwQTQ2MjAwMDAxMQorOjEwNzZBMDAwMjQ2MzAwMDIwMzdFMTAyMTAwNjIxMDJCNTA0MDAwMDE3MQorOjEwNzZCMDAwMDA2QjE4MjE5N0FDMDAyRTA4MDAyREI0QTQ2QzAwMDBCQworOjEwNzZDMDAwOEU0MjAwMDQ4RTQ0MDAwOEE2NDMwMDA4OTdBQzAwMkVBQQorOjEwNzZEMDAwQTY0QzAwMEFBRTQyMDAwMEFFNDQwMDA0OTY2MjAwMEVDMgorOjEwNzZFMDAwMjY1MkZGRkMyNDQyMDAwNEE2NjIwMDBFOTY2MjAwMEVBMQorOjEwNzZGMDAwOEVFMzcyNUMwMDYyMTgyMUFFRTM3MjVDQUZCMjAwMThEOAorOjEwNzcwMDAwOEVFMzcyNUNBRkEzMDAxQzhFRTI3MjVDMkM0MjAwM0NFNAorOjEwNzcxMDAwMTA0MDAwMDQyNDYyMDAwMTI0MDNGRkZFMDA0MzEwMjRGMworOjEwNzcyMDAwQUZBMjAwMUMzMkMyMDA4MDEwNDAwMDBDMzJDMjAxMDAyNworOjEwNzczMDAwOEVFMjdCQTgyNDQzMDAwMTAwMDIxMEMwMDA1NzEwMjFGNAorOjEwNzc0MDAwQUVFMzdCQTg4RkEzMDAxODhGQTQwMDFDQUM0MzdCQUNENgorOjEwNzc1MDAwQUM0NDdCQjAwODAwMkVBMEFFRTA3MjVDMTA0MDAwNzIxQQorOjEwNzc2MDAwMDAwMDAwMDA4RUUyN0JBODI0NDMwMDAxMDAwMjEwQzA0QworOjEwNzc3MDAwMDA1NzEwMjFBRUUzN0JBODhGQTMwMDE4OEZBNDAwMUMzNAorOjEwNzc4MDAwQUM0MzdCQUNBQzQ0N0JCMDhFRTI3QkE4MTA0MDAwNjM4MgorOjEwNzc5MDAwMDAwMDQ4MjEwMDAwNTAyMThGODIwMEYwMjQ0ODAwMDg5QQorOjEwNzdBMDAwMjc2MjE4MDAwMTAyMTAyQjUwNDAwMDAxMjc2ODEwMDBDQQorOjEwNzdCMDAwOEY4MjAwRjQxNTAyMDAwNzAwMDAwMDAwOEVFMjAxQjQ4MQorOjEwNzdDMDAwMDAwMDgwMjEyNDQyMDAwMUFFRTIwMUI0MDgwMDJERkEzRAorOjEwNzdEMDAwOEVFMjAxQjQ4RjgzMDBGMDI0MTAwMDAxMDE1NzEwMjFDNAorOjEwNzdFMDAwOEM0NDdCQUM4QzQ1N0JCMEFDNjQwMDAwQUM2NTAwMDQ4MQorOjEwNzdGMDAwQUY4ODAwRjAxNjAwMDAwNjAyRUExMDIxOEVFMjAwODgzMQorOjEwNzgwMDAwMjQ0MjAwMDFBRUUyMDA4ODA4MDAyRTNGOEVFMjAwODg4QworOjEwNzgxMDAwOEM0MjdCQjA4RUU0MDBFMDhFRTUwMEU0OEVFNjdCOUMzQgorOjEwNzgyMDAwMDA0MDE4MjEwMDAwMTAyMTAwQTMyODIxMDBBMzM4MkJCQworOjEwNzgzMDAwMDA4MjIwMjEwMDg3MjAyMThFRTIwNEZDMDBDOTMwMjEzMworOjEwNzg0MDAwMDAwNjMxMDBBRUU0MDBFMEFFRTUwMEU0MDBDMjMwMjEwNQorOjEwNzg1MDAwOTRDMjAwMEEyNDBDMDAwMjAwMDIxMTQyMzA0MzAwMDNDQgorOjEwNzg2MDAwMTA2QzAwMTYyODYyMDAwMzEwNDAwMDA1MjQwQzAwMDE3MworOjEwNzg3MDAwMTA2QzAwMDgwMDAwMDAwMDA4MDAyRTNGMDAwMDAwMDAwRgorOjEwNzg4MDAwMjQwQzAwMDMxMDZDMDAxNzAwMDAwMDAwMDgwMDJFM0ZCRAorOjEwNzg5MDAwMDAwMDAwMDA4RUUyMDBFODhFRTMwMEVDMjQ2MzAwMDFBQgorOjEwNzhBMDAwMkM2NDAwMDEwMDQ0MTAyMUFFRTIwMEU4QUVFMzAwRUNERAorOjEwNzhCMDAwOEVFMjAwRTgwODAwMkUzRjhFRTMwMEVDOEVFMjAwRjAzRQorOjEwNzhDMDAwOEVFMzAwRjQyNDYzMDAwMTJDNjQwMDAxMDA0NDEwMjFDNQorOjEwNzhEMDAwQUVFMjAwRjBBRUUzMDBGNDhFRTIwMEYwMDgwMDJFM0ZDRQorOjEwNzhFMDAwOEVFMzAwRjQ4RUUyMDBGODhFRTMwMEZDMjQ2MzAwMDFENgorOjEwNzhGMDAwMkM2NDAwMDEwMDQ0MTAyMUFFRTIwMEY4QUVFMzAwRkM2RAorOjEwNzkwMDAwOEVFMjAwRjg4RUUzMDBGQzhFRTI3QkE4MjUyOTAwMDFDMAorOjEwNzkxMDAwMDEyMjEwMkIxNDQwRkZBMDI1NEEwMDA4QTJFMDdCOTgwQQorOjEwNzkyMDAwMDgwMDJFOUZBRUUwN0JBODhGODIwMEYwMjQ0NzAwMDg1RAorOjEwNzkzMDAwMjc2MjE4MDAwMEUyMTAyQjUwNDAwMDAxMjc2NzEwMDA1QQorOjEwNzk0MDAwOEY4MjAwRjQxNEUyMDAwNzAwMDAwMDAwOEVFMjAxQjQxMAorOjEwNzk1MDAwMDAwMDgwMjEyNDQyMDAwMUFFRTIwMUI0MDgwMDJFNUQ0NworOjEwNzk2MDAwOEVFMjAxQjQ4RjgyMDBGMDI0MTAwMDAxOEZBMzAwMTg3MgorOjEwNzk3MDAwOEZBNDAwMUNBQzQzMDAwMEFDNDQwMDA0QUY4NzAwRjBBRgorOjEwNzk4MDAwMTYwMDAwMDcwMDAwMDAwMDhFRTIwMDg4MjQ0MjAwMDE3QgorOjEwNzk5MDAwQUVFMjAwODg4RUUyMDA4ODA4MDAyRUEwQUVFMDcyNUNBNQorOjEwNzlBMDAwOEVFMjcyNUM4RUU0MDBFMDhFRTUwMEU0MjQwQzAwMDJCRQorOjEwNzlCMDAwMDA0MDE4MjEwMDAwMTAyMTAwQTMyODIxMDBBMzMwMkIzMworOjEwNzlDMDAwMDA4MjIwMjEwMDg2MjAyMTAwMTYxMTQyMzA0MzAwMDM0RQorOjEwNzlEMDAwQUVFNDAwRTBBRUU1MDBFNDEwNkMwMDE3MkM2MjAwMDM5QQorOjEwNzlFMDAwMTA0MDAwMDUyNDBDMDAwMTEwNkMwMDA4MDAwMDAwMDA4RAorOjEwNzlGMDAwMDgwMDJFQTBBRUUwNzI1QzI0MEMwMDAzMTA2QzAwMTk4RAorOjEwN0EwMDAwMDAwMDAwMDAwODAwMkVBMEFFRTA3MjVDOEVFMjAwRThFQworOjEwN0ExMDAwOEVFMzAwRUMyNDYzMDAwMTJDNjQwMDAxMDA0NDEwMjE3QgorOjEwN0EyMDAwQUVFMjAwRThBRUUzMDBFQzhFRTIwMEU4OEVFMzAwRUNBQworOjEwN0EzMDAwMDgwMDJFQTBBRUUwNzI1QzhFRTIwMEYwOEVFMzAwRjQ0RgorOjEwN0E0MDAwMjQ2MzAwMDEyQzY0MDAwMTAwNDQxMDIxQUVFMjAwRjAyOAorOjEwN0E1MDAwQUVFMzAwRjQ4RUUyMDBGMDhFRTMwMEY0MDgwMDJFQTAwNgorOjEwN0E2MDAwQUVFMDcyNUM4RUUyMDBGODhFRTMwMEZDMjQ2MzAwMDE1RAorOjEwN0E3MDAwMkM2NDAwMDEwMDQ0MTAyMUFFRTIwMEY4QUVFMzAwRkNFQgorOjEwN0E4MDAwOEVFMjAwRjg4RUUzMDBGQ0FFRTA3MjVDOEU2MjAwMUNCOQorOjEwN0E5MDAwOTZFMzA0NTg4RUU0MDRGMDI0NDIwMDAxMjQ2M0ZGRkZCRgorOjEwN0FBMDAwMDA0MzEwMjQyNDg0MDAwMUFFRTIwNEU0QUVFNDA0RjBCOAorOjEwN0FCMDAwOEY0MjAyM0MwMDgyMjAyQjE0ODAwMEIwMDAwMDAwMDBBNgorOjEwN0FDMDAwOEY4MzAxMjAyNzYyMzgwMDI0NjYwMDIwMDBDMjEwMkIxQgorOjEwN0FEMDAwNTA0MDAwMDEyNzY2MzAwMDhGODIwMTI4MTBDMjAwMDQ0OAorOjEwN0FFMDAwMDAwMDAwMDA4RjgyMDEyNDE0QzIwMDA3MDAwMDAwMDA4MworOjEwN0FGMDAwOEVFMjAxQTQwMDAwODAyMTI0NDIwMDAxQUVFMjAxQTQzNAorOjEwN0IwMDAwMDgwMDJGMDc4RUUyMDFBNDhFRTIwNEU0QUM2MjAwMUNBMAorOjEwN0IxMDAwOEVFNDA0QjA4RUU1MDRCNDI0NjIwMDFDQUM2MjAwMDg1QworOjEwN0IyMDAwMjQwMjAwMDhBNDYyMDAwRTI0MDIwMDExQUM2MjAwMThCNgorOjEwN0IzMDAwQUM2NDAwMDBBQzY1MDAwNDhFRTIwNEM0QUM2MjAwMTBDQQorOjEwN0I0MDAwQUY4NjAxMjA5MkUyNEUyMDE0NDAwMDM3MjQxMDAwMDEzRAorOjEwN0I1MDAwOEVFMjRFMzAwMDAyMTBDMDI0NDI1MDM4MDJFMjIwMjE1MgorOjEwN0I2MDAwOEM4MzAwMDAyNDAyMDAxMjE0NjIwMDFGMDAwMDAwMDAzOQorOjEwN0I3MDAwOEVFMzRFMzA4RUUyNEUzNDEwNjIwMDFCMjQwQzAwNDAyNworOjEwN0I4MDAwOEM4MjAwMDQyNDQyMDAwMUFDODIwMDA0OEVFMjRFMzQ1OAorOjEwN0I5MDAwOEVFMzRFMzAyNDQyMDAwMTEwNEMwMDA3MDAwMDAwMDAyQworOjEwN0JBMDAwOEVFMjRFMzQyNDQyMDAwMTEwNjIwMDA1MDAwMDAwMDAwNQorOjEwN0JCMDAwMDgwMDJFRjEwMDAwMDAwMDE0NjAwMDA1MDAwMDAwMDAyNQorOjEwN0JDMDAwOEY4MjAxMjgyNDQyMDAyMEFGODIwMTI4OEY4MjAxMjg2MQorOjEwN0JEMDAwOEM4MjAwMDQyQzQyMDAxMTUwNDAwMDEzQUM4MDAwMDA0NQorOjEwN0JFMDAwMDgwMDJGMDcwMDAwMDAwMDhFRTI0RTMwMjQwQzAwNDBGOQorOjEwN0JGMDAwMjQ0MjAwMDE1MDRDMDAwMzAwMDAxMDIxOEVFMjRFMzA2MAorOjEwN0MwMDAwMjQ0MjAwMDFBRUUyNEUzMDhFRTI0RTMwMDAwMjEwQzAzRgorOjEwN0MxMDAwMjQ0MjUwMzgwMkUyMjAyMTI0MDIwMDEyMjQwQzAwMDFFOAorOjEwN0MyMDAwQUM4MjAwMDBBQzhDMDAwNDU2MDAwMDBEMjQxMDAwMDE1MgorOjEwN0MzMDAwOEVFMjA0RTQzQzA0MDAwMTI0ODQ1NzU0QUZBMDAwMTRGNQorOjEwN0M0MDAwQUZBMjAwMTA4RUU2MDYwODhGNDcwMjI4M0MwNTAwMDkwNworOjEwN0M1MDAwMzRBNUYwMDYwQzAwMjQwM0FGQUIwMDM4OEZBQjAwMzgxRQorOjEwN0M2MDAwMTYwMDAwMDMyNDBDMDAwMTA4MDAyRjVDQTJFQzA0RjRCMQorOjEwN0M3MDAwOEVFMjAxNzAyNDQyMDAwMUFFRTIwMTcwOEVFMjAxNzBEQQorOjEwN0M4MDAwOEVFMjA0RTRBMkUwMDRGNEFFRTAwNEYwQUVFMDcyNzQyQworOjEwN0M5MDAwQUVFMjA0Rjg4RjQyMDIzQzEwNDAwMDM4MDAwMDAwMDBDMQorOjEwN0NBMDAwOEVFMjAxODQyNDQyMDAwMUFFRTIwMTg0MDgwMDJGNUNEMAorOjEwN0NCMDAwOEVFMjAxODQ4RUUyMDUwNDI0MEMwMDQwMjQ0MjAwMDE3RgorOjEwN0NDMDAwNTA0QzAwMDMwMDAwMTAyMThFRTIwNTA0MjQ0MjAwMDEwNAorOjEwN0NEMDAwQUVFMjA1MDQ4RUUyMDUwNDhFNjMwMDE4MjQwQzAwMDM1NgorOjEwN0NFMDAwMDAwMjEwODAwMDU3MTAyMTE0NkMwMDBGOEM0NDA1MDgwRQorOjEwN0NGMDAwM0MwMjAwMDEwMDU3MTAyMTkwNDI4M0IxMTA0MDAwMTQ1MworOjEwN0QwMDAwMDAwMDAwMDA4RUUyMDFEMDhFRTM1MjQwMDA0NDEwMjFCQQorOjEwN0QxMDAwQUVFMjAxRDA4RUUyMDFEODAwNjQxODIxMzA2MzAwRkY4QQorOjEwN0QyMDAwMDgwMDJGNEZBRUUzNTI0MDhFRTIwMUNDOEVFMzBFMTBERQorOjEwN0QzMDAwMDA0NDEwMjFBRUUyMDFDQzhFRTIwMUQ4MDA2NDE4MjE4QgorOjEwN0Q0MDAwMzA2MzAxRkZBRUUzMEUxMDAwNDQxMDIxQUVFMjAxRDgxMworOjEwN0Q1MDAwOEVFMjAwMDAzNDQyMDA0MDA4MDAyRjVDQUVFMjAwMDBEQQorOjEwN0Q2MDAwOEVFMjAxNEMzQzAxMDAwMTAwMzcwODIxQTAyMDgzRTA5NQorOjEwN0Q3MDAwMjQ0MjAwMDFBRUUyMDE0QzhFRTIwMTRDOEY4MjAxMDhFOAorOjEwN0Q4MDAwMjQ0MjAwMjBBRjgyMDEwODhGODIwMTA4OEY4MjAxMDhGRgorOjEwN0Q5MDAwMjc2MzMwMDAwMDQzMTAyQjE0NDAwMDAyMjc2MjI4MDBBNAorOjEwN0RBMDAwQUY4MjAxMDg4RjgzMDEwODhGODIwMTA0MTQ2MkZDMUVEOAorOjEwN0RCMDAwMDAwMDAwMDA4RkJGMDA2MDhGQkUwMDVDOEZCNjAwNThDRgorOjEwN0RDMDAwOEZCNTAwNTQ4RkI0MDA1MDhGQjMwMDRDOEZCMjAwNDg3MQorOjEwN0REMDAwOEZCMTAwNDQ4RkIwMDA0MDAzRTAwMDA4MjdCRDAwNjg2OQorOjEwN0RFMDAwMDAwNTI4NDMxMEEwMDAwRDAwMDAzMDIxM0MwMzAwMDFENQorOjEwN0RGMDAwMzQ2MzM4MDAzQzA3RkZGRjAzNjMxMDIxMDA4MjEwMkIxRgorOjEwN0UwMDAwNTA0MDAwMDEwMDg3MjAyMTk0ODIwMDAwMjQ4NDAwMDI1OQorOjEwN0UxMDAwMjRBNUZGRkYxNEEwRkZGODAwQzIzMDIxMDAwNjFDMDJCOQorOjEwN0UyMDAwMzBDMkZGRkYwMDYyMzAyMTAwMDYxQzAyMzBDMkZGRkY5QgorOjEwN0UzMDAwMDA2MjMwMjEwM0UwMDAwODMwQzJGRkZGMjdCREZGODg0OQorOjEwN0U0MDAwMjQwRjAwMDFBRkJGMDA3MEFGQkUwMDZDQUZCNjAwNjg3QQorOjEwN0U1MDAwQUZCNTAwNjRBRkI0MDA2MEFGQjMwMDVDQUZCMjAwNTgyMAorOjEwN0U2MDAwQUZCMTAwNTRBRkIwMDA1MEEzQTAwMDI3QUZBRjAwMkNCQgorOjEwN0U3MDAwOEVFMjA0RDQwMDAwODAyMTMwNDIwMDAxMTQ0MDAwMkEyOAorOjEwN0U4MDAwQTNBMDAwMzc4Rjg3MDBFMDhGODgwMEM0OEY4MjAwRThBRQorOjEwN0U5MDAwMDBFMjIwMjMyQzgyMTAwMDUwNDAwMDAxMjQ4NDEwMDBCNgorOjEwN0VBMDAwMDAwNDIwQzIwMDgwMTgyMThFRTQwMEM4OEVFNTAwQ0NCQQorOjEwN0VCMDAwMDAwMDEwMjEwMEEzMjgyMTAwQTMzMDJCMDA4MjIwMjFFNAorOjEwN0VDMDAwMDA4NjIwMjFBRUU0MDBDOEFFRTUwMENDOEY4MzAwQzg1OAorOjEwN0VEMDAwM0MwMjAwMEEzNDQyRUZGRjAxMDMyMDIzMDA0NDEwMkIzMAorOjEwN0VFMDAwMTA0MDAwMDMzQzAyMDAwQTM0NDJGMDAwMDA4MjIwMjFDRQorOjEwN0VGMDAwMDA4MDE4MjE4RUU0MDBDMDhFRTUwMEM0MDAwMDEwMjEyRgorOjEwN0YwMDAwMDBBMzI4MjEwMEEzMzAyQjAwODIyMDIxMDA4NjIwMjFGRAorOjEwN0YxMDAwQUVFNDAwQzBBRUU1MDBDNEFGODgwMEM4QUY4NzAwRTQ5RgorOjEwN0YyMDAwMDgwMDM0Q0NBRjg3MDBFODNDMDIwMDAxMDA1NzEwMjE2NAorOjEwN0YzMDAwOTA0MjgzQzAxMDQwMDAwQjAwMDAwMDAwM0MxNDAwMDE4MAorOjEwN0Y0MDAwMDI5N0EwMjE4RTk0ODNDNDNDMTMwMDAxMDI3Nzk4MjFFQworOjEwN0Y1MDAwOEU3MzgzQzgzQzEyMDAwMTAyNTc5MDIxMDgwMDMxOTNCMAorOjEwN0Y2MDAwOEU1MjgzQ0M4RjgzMDBFMDhGODIwMEU0MTA0MzAwMDdBMQorOjEwN0Y3MDAwMDAwMDg4MjE4RjgyMDBFNDI0MTEwMDAxOEM0MzAwMDA1RQorOjEwN0Y4MDAwOEM0NDAwMDRBRkEzMDAxOEFGQTQwMDFDMTYyMDAwMEUwMAorOjEwN0Y5MDAwM0MwMkZGRkY4RjgyMDBDNEFGQTIwMDEwOEY4MjAwQzg5NgorOjEwN0ZBMDAwM0MwNDAwMDEyNDg0NTg3MEFGQTIwMDE0OEY4NjAwRTBDNgorOjEwN0ZCMDAwOEY4NzAwRTQzQzA1MDAwNjBDMDAyNDAzMzRBNUYwMDA4NAorOjEwN0ZDMDAwMDgwMDM0Q0MwMDAwMDAwMDhGQTMwMDFDOEZCMjAwMTgwMgorOjEwN0ZEMDAwMzA3NEZGRkYyNjk0RkZGQzAwNjIxMDI0MTA0MDAwNTgwQworOjEwN0ZFMDAwMDI0MDk4MjEzQzAyMDA4MDAwNjIxMDI0MTA0MDAwMEFFOAorOjEwN0ZGMDAwM0MwNDAwNDA4RUUyMDA3QzI0NDIwMDAxQUVFMjAwN0NBMgorOjEwODAwMDAwOEVFMjAwN0M4RUUyMDFGQzI0NDIwMDAxQUVFMjAxRkMyMworOjEwODAxMDAwMDgwMDM0QzY4RUUyMDFGQzNDMDYwMDA0M0MwQjAwMDE2MworOjEwODAyMDAwM0MwQTAwMDIzQzA1MDAxMDNDMDkwMDA4OEVFMjAwODA3QQorOjEwODAzMDAwM0MwODAwMjAzNDA3ODAwMDI0NDIwMDAxQUVFMjAwODBBQQorOjEwODA0MDAwOEVFMjAwODA4RkEyMDAxQzAwNDQxODI0MTA2NjAwMjFEQworOjEwODA1MDAwMDBDMzEwMkIxNDQwMDAwNzAwMDAwMDAwMTA2QjAwMTEzQgorOjEwODA2MDAwMDAwMDAwMDAxMDZBMDAxNTAwMDAwMDAwMDgwMDMwNDkwMAorOjEwODA3MDAwMDAwNDIwNDIxMDY1MDAyMzAwQTMxMDJCMTQ0MDAwMDVDQgorOjEwODA4MDAwMDAwMDAwMDAxMDY5MDAxOTAwMDAwMDAwMDgwMDMwNDlERAorOjEwODA5MDAwMDAwNDIwNDIxMDY4MDAyMTAwMDAwMDAwMDgwMDMwNDk2MAorOjEwODBBMDAwMDAwNDIwNDI4RUUyMDAzNDI0NDIwMDAxQUVFMjAwMzQ5QgorOjEwODBCMDAwOEVFMjAwMzQwODAwMzA0OTAwMDQyMDQyOEVFMjAxRUNEOAorOjEwODBDMDAwMjQ0MjAwMDFBRUUyMDFFQzhFRTIwMUVDMDgwMDMwNDlFRQorOjEwODBEMDAwMDAwNDIwNDI4RUUyMDFGMDI0NDIwMDAxQUVFMjAxRjBGMQorOjEwODBFMDAwOEVFMjAxRjAwODAwMzA0OTAwMDQyMDQyOEVFMjAxRjRFMworOjEwODBGMDAwMjQ0MjAwMDFBRUUyMDFGNDhFRTIwMUY0MDgwMDMwNDlBRQorOjEwODEwMDAwMDAwNDIwNDI4RUUyMDAzMDI0NDIwMDAxQUVFMjAwMzA0MgorOjEwODExMDAwOEVFMjAwMzAwODAwMzA0OTAwMDQyMDQyOEVFMjAxRjg2RgorOjEwODEyMDAwMjQ0MjAwMDFBRUUyMDFGODhFRTIwMUY4MDAwNDIwNDI5MAorOjEwODEzMDAwMTA4NzA0N0MwMDAwMDAwMDA4MDAzMDBFMDAwMDAwMDBFMgorOjEwODE0MDAwM0MwMjAwMDEwMDU3MTAyMTkwNDI4M0IyMTQ0MDAwODQ4OQorOjEwODE1MDAwMjQwMjAwMDEzQzAzMDAwMTAwNzcxODIxOTA2MzgzQjNERgorOjEwODE2MDAwMTQ2MjAwN0YzQzAyMDEwMDhFNDMwMDAwMDA2MjEwMjQ3NAorOjEwODE3MDAwMTA0MDAwNkYyNDAyRkZGRjE0NjIwMDA1MjQxMDAwMDE2QworOjEwODE4MDAwOTY0MzAwMDQzNDAyRkZGRjEwNjIwMDc1MDAwMDAwMDBGNworOjEwODE5MDAwOTJFMjA0RDgxNDQwMDA3MjAwMDAwMDAwM0MwMjAwMDE4QQorOjEwODFBMDAwMDA1NzEwMjE4QzQyODNCNDI4NDIwMDA1MTA0MDAwMjA2MworOjEwODFCMDAwMDAwMDM4MjEzQzAyMDAwMTAwNTcxMDIxOEM0MjgzQjQ5QQorOjEwODFDMDAwMTg0MDAwMTYwMDAwMjgyMTk2NjYwMDAwMDAwNTIwQzAxNworOjEwODFEMDAwMDA5NzEwMjE5NDQyNzc3RTE0NDYwMDA5MDA5NzEwMjFFMQorOjEwODFFMDAwOTQ0Mzc3ODA5NjYyMDAwMjE0NjIwMDA1MDA5NzEwMjE4NAorOjEwODFGMDAwOTQ0Mzc3ODI5NjYyMDAwNDUwNjIwMDA4MjQwNzAwMDFDRAorOjEwODIwMDAwM0MwMjAwMDEwMDU3MTAyMThDNDI4M0I0MjRBNTAwMDFEOAorOjEwODIxMDAwMDBBMjEwMkE1NDQwRkZFRTAwMDUyMEMwMzBFMjAwRkYwQgorOjEwODIyMDAwMTA0MDA0NDAwMDAwMDAwMDA4MDAzMEQ1MDAwMDAwMDBBRAorOjEwODIzMDAwMDI0MDIwMjEwQzAwMjJGRTI0MDUwMDA2MzA0NDAwMUZDRAorOjEwODI0MDAwMDAwNDI4QzAwMkU1MTAyMTk0NDI3MjdDMzA0MjQwMDBCNAorOjEwODI1MDAwMTQ0MDA0MzQwMEI3MTAyMTk0NDM3MjdFOTY2MjAwMDBFQgorOjEwODI2MDAwMTQ2MjAwMEIwMDA0MThDMDAwQjcxMDIxOTQ0MzcyODAwMAorOjEwODI3MDAwOTY2MjAwMDIxNDYyMDAwNjAwMDQxOEMwMDBCNzEwMjFDNAorOjEwODI4MDAwOTQ0MzcyODI5NjYyMDAwNDEwNjIwMDM1MDAwNDE4QzBBNAorOjEwODI5MDAwMDJFMzEwMjE5NDQyNzI3QzMwNDI4MDAwMTQ0MDA0MjE5OQorOjEwODJBMDAwMDJFMzEwMjE5NDRCNzI3Qzk2NjcwMDAwMDAwQjI4QzBGQgorOjEwODJCMDAwMDBCNzEwMjE5NDQyNzM3RTA4MDAzMEI3MDAwMDMwMjFDRgorOjEwODJDMDAwMDAwNDIwQzAwMkU0MTAyMTk0NDM3MzdDMDJFNDEwMjFENgorOjEwODJEMDAwOTQ0QjczN0MzMDYzODAwMDE0NjAwMDEwMDAwQjI4QzA0NgorOjEwODJFMDAwMDBCNzEwMjE5NDQyNzM3RTE0NDdGRkY1MDE2MDIwMjFFRQorOjEwODJGMDAwMDBCNzEwMjE5NDQzNzM4MDk2NjIwMDAyNTQ2MkZGRjEyQworOjEwODMwMDAwMDAwNDIwQzAwMEI3MTAyMTk0NDM3MzgyOTY2MjAwMDREOQorOjEwODMxMDAwNTQ2MkZGRUMwMDA0MjBDMDI0MDYwMDAxMzBDMjAwRkZCQworOjEwODMyMDAwMTA0MDA0MDAwMDAwMDAwMDA4MDAzMEQ1MDAwMDAwMDBFQworOjEwODMzMDAwOTc0MzAyMDI5NjQyMDAwMDE0NjIwM0ZBMDAwMDAwMDAxNAorOjEwODM0MDAwOTc0MzAyMDQ5NjQyMDAwMjE0NjIwM0Y2MDAwMDAwMDAwNAorOjEwODM1MDAwOTc0MzAyMDY5NjQyMDAwNDE0NjIwM0YyMDAwMDAwMDBGNAorOjEwODM2MDAwOTI0MjAwMDAzQTAzMDAwMTMwNDIwMDAxMDA0MzEwMjQxMQorOjEwODM3MDAwMTA0MDAwNzQyNDAyRkZGRjhFNjMwMDAwMTQ2MjAwMDRBQQorOjEwODM4MDAwMzQwMkZGRkY5NjYzMDAwNDEwNjIwMDZGMjQwRjAwMDJBNgorOjEwODM5MDAwM0MwMjAwMDEwMDU3MTAyMTkwNDI4M0IyMTQ0MDAwNkE1MQorOjEwODNBMDAwMjQwRjAwMDM5MkUyMDREODU0NDAwMDY4QUZBRjAwMkNDMQorOjEwODNCMDAwM0MwMjAwMDEwMDU3MTAyMThDNDI4M0I0Mjg0MjAwMDU4MgorOjEwODNDMDAwMTA0MDAwMjAwMDAwMzgyMTNDMDIwMDAxMDA1NzEwMjExRAorOjEwODNEMDAwOEM0MjgzQjQxODQwMDAxNjAwMDAyODIxOTY2NjAwMDBFNQorOjEwODNFMDAwMDAwNTIwQzAwMDk3MTAyMTk0NDI3NzdFMTQ0NjAwMDlCMgorOjEwODNGMDAwMDA5NzEwMjE5NDQzNzc4MDk2NjIwMDAyMTQ2MjAwMDU3MgorOjEwODQwMDAwMDA5NzEwMjE5NDQzNzc4Mjk2NjIwMDA0NTA2MjAwMDgxRQorOjEwODQxMDAwMjQwNzAwMDEzQzAyMDAwMTAwNTcxMDIxOEM0MjgzQjQ2NAorOjEwODQyMDAwMjRBNTAwMDEwMEEyMTAyQTU0NDBGRkVFMDAwNTIwQzA0MAorOjEwODQzMDAwMzBFMjAwRkYxNDQwMDA0NDI0MEYwMDAzMDgwMDM0QzY1QgorOjEwODQ0MDAwMDAwMDAwMDAwMjQwMjAyMTBDMDAyMkZFMjQwNTAwMDY0RQorOjEwODQ1MDAwMzA0NDAwMUYwMDA0MjhDMDAyRTUxMDIxOTQ0MjcyN0NDMQorOjEwODQ2MDAwMzA0MjQwMDAxNDQwMDNBRjAwQjcxMDIxOTQ0MzcyN0VBNQorOjEwODQ3MDAwOTY2MjAwMDAxNDYyMDAwQjAwMDQxOEMwMDBCNzEwMjFCRgorOjEwODQ4MDAwOTQ0MzcyODA5NjYyMDAwMjE0NjIwMDA2MDAwNDE4QzBEMQorOjEwODQ5MDAwMDBCNzEwMjE5NDQzNzI4Mjk2NjIwMDA0MTA2MjAwMjc5NAorOjEwODRBMDAwMDAwNDE4QzAwMkUzMTAyMTk0NDI3MjdDMzA0MjgwMDAyNAorOjEwODRCMDAwMTQ0MDAzOUMwMkUzMTAyMTk0NEI3MjdDOTY2NzAwMDBFOQorOjEwODRDMDAwMDAwQjI4QzAwMEI3MTAyMTk0NDI3MzdFMDgwMDMxM0M5NQorOjEwODREMDAwMDAwMDMwMjEwMDA0MjBDMDAyRTQxMDIxOTQ0MzczN0M4QQorOjEwODRFMDAwMDJFNDEwMjE5NDRCNzM3QzMwNjM4MDAwMTQ2MDAwMTAxMAorOjEwODRGMDAwMDAwQjI4QzAwMEI3MTAyMTk0NDI3MzdFMTQ0N0ZGRjU4QgorOjEwODUwMDAwMDE2MDIwMjEwMEI3MTAyMTk0NDM3MzgwOTY2MjAwMDIxRAorOjEwODUxMDAwNTQ2MkZGRjEwMDA0MjBDMDAwQjcxMDIxOTQ0MzczODIxRAorOjEwODUyMDAwOTY2MjAwMDQ1NDYyRkZFQzAwMDQyMEMwMjQwNjAwMDE5RgorOjEwODUzMDAwMzBDMjAwRkYxMDQwMDM3QjAwMDAwMDAwMDgwMDMxNEZGNAorOjEwODU0MDAwMjQwRjAwMDMyNDBGMDAwMUFGQUYwMDJDOEY0MjAyNjAwNAorOjEwODU1MDAwMDA1NDEwMkIxMDQwMDAzQTAwMDAwMDAwOEY4MzAwRTQwQworOjEwODU2MDAwOEY4MjAwRTAxMDYyMDAwMzI0NjMwMDA4QUY4MzAwRTQwMAorOjEwODU3MDAwQUY4MzAwRTg4RUU0MDBDMDhFRTUwMEM0MDI4MDE4MjFCRAorOjEwODU4MDAwMDAwMDEwMjEwMEEzMjgyMTAwQTMzMDJCMDA4MjIwMjEwRAorOjEwODU5MDAwMDA4NjIwMjFBRUU0MDBDMEFFRTUwMEM0OEVFMjAwNThBMworOjEwODVBMDAwMjQ0MjAwMDFBRUUyMDA1ODhFRTIwMDU4OEVFMjAwN0NDOAorOjEwODVCMDAwMjQ0MjAwMDFBRUUyMDA3QzhFRTIwMDdDOEY4MjAwRTA2QgorOjEwODVDMDAwQUZBMjAwMTA4RjgyMDBFNDNDMDQwMDAxMjQ4NDU4Nzg5QworOjEwODVEMDAwQUZBMjAwMTQ4RkE2MDAxODhGQTcwMDFDM0MwNTAwMDY1MAorOjEwODVFMDAwMEMwMDI0MDMzNEE1RjAwMzA4MDAzNENDMDAwMDAwMDA4NAorOjEwODVGMDAwOEVFMjUyNDBBRkEyMDAxMDhFRTI1MjQ0M0MwNDAwMDFEMQorOjEwODYwMDAwMjQ4NDU4ODRBRkEyMDAxNDhFRTYwRTEwOEVFNzBFMTg1NAorOjEwODYxMDAwM0MwNTAwMDYwQzAwMjQwMzM0QTVGMDAyOEVFMjAxQzBFNAorOjEwODYyMDAwMjQ0MjAwMDFBRUUyMDFDMDhFRTIwMDAwOEVFMzAxQzBGMAorOjEwODYzMDAwMjQwM0ZGQkYwMDQzMTAyNDA4MDAzNDcwQUVFMjAwMDBBMgorOjEwODY0MDAwOTZFMjA0NjgwMDU0MTAyQjEwNDAwMDAzMDAwMDAwMDA2NAorOjEwODY1MDAwMjQwRjAwMDFBM0FGMDAyNzEyODAwMzAxMjQxNjAwMDc5NgorOjEwODY2MDAwMjQxNTAwNDAyNDFFMDAwMTI0MEUwMDEyOEVFMjcyNENEQworOjEwODY3MDAwOEY0MzAyODAyNDQyMDAwMTMwNDIwN0ZGMTA2MjAyRDM4MAorOjEwODY4MDAwMDAwMDAwMDA5M0EyMDAyNzEwNDAwMDE0MDAwMDAwMDAyQQorOjEwODY5MDAwOEVFMzUyNDA4RUUyNTI0NDEwNjIwMDA5MjZFRDUyNDRBRAorOjEwODZBMDAwOEVFNjUyNDQ4RUUzNTI0NDAwMDIxMTQwMjQ0MjUyNDg2NgorOjEwODZCMDAwMDJFMjgwMjEyNDYzMDAwMTA4MDAzMUJGMzA2QjAwRkYxQgorOjEwODZDMDAwOTJFMjcyNDgxNDQwRkZDQTAwMDAwMDAwOEVFMjAxRTAwRQorOjEwODZEMDAwMjQ0MjAwMDFBRUUyMDFFMDhFRTIwMUUwOEVFMzBFMTBFMgorOjEwODZFMDAwOEVFMjBFMTgxMDYyRkZDMjI2RUQwRTE4OEVFNjBFMThFRQorOjEwODZGMDAwOEVFMzBFMTgwMDAyMTE0MDI0NDIwRTIwMDJFMjgwMjE3NworOjEwODcwMDAwMjQ2MzAwMDEzMDZCMDFGRjk2RTIwNDZBMzA0MjAwMTBERQorOjEwODcxMDAwMTA0MDAwMTkwMDAwMDAwMDk2NDIwMDBDMzQwRjgxMDA0OAorOjEwODcyMDAwMTQ0RjAwMTUwMDAwMDAwMDNDMDIwMDAxMDA1NzEwMjEwQQorOjEwODczMDAwOTA0MjgzQzAxNDQwMDAxMDAwMDAwMDAwOTY0MjAwMEVEQQorOjEwODc0MDAwQTYwMjAwMTY4RTQyMDAwODhFNDMwMDA0OEU0NDAwMDBFQworOjEwODc1MDAwMjY5NEZGRkNBRTQyMDAwQ0FFNDMwMDA4QUU0NDAwMDQ3OQorOjEwODc2MDAwOTYwMjAwMEUyNjczMDAwNDI0MEYwMDAxQTNBRjAwMzcwOQorOjEwODc3MDAwMzQ0MjAyMDBBNjAyMDAwRThFMDIwMDAwOEUwMzAwMDRBNgorOjEwODc4MDAwM0MwNDAwMDEzNDg0MzgwMDMwNkEwMDA3MDI2QTk4MjNGMAorOjEwODc5MDAwMDM2NDEwMjEwMjYyMTAyQjEwNDAwMDA1MDI4QUEwMjEwMAorOjEwODdBMDAwMDI2NDEwMjMwMzYyMTgyMzNDMDIwMDIwMDA0Mzk4MjMzNAorOjEwODdCMDAwMjY4MjAwMDcyNDA0RkZGODk2MDMwMDBBMDA0NDYwMjQ4MAorOjEwODdDMDAwMDA2QTE4MjEwMDZDMTAyQjEwNDAwMDAyMDE4MDM4MjEzMworOjEwODdEMDAwMDA2MDM4MjFBRTEzMDAxODhGODgwMTIwMjRFMjAwMDdDMgorOjEwODdFMDAwMDA0NDM4MjQyNzYyMzgwMDI1MDkwMDIwMDEyMjEwMkI3QworOjEwODdGMDAwNTA0MDAwMDEyNzY5MzAwMDhGODIwMTI4MTEyMjAwMDRCNworOjEwODgwMDAwMDAwMDAwMDA4RjgyMDEyNDE1MjIwMDA3MDE0MDE4MjE3QQorOjEwODgxMDAwOEVFMjAxQTQwMDAwODgyMTI0NDIwMDAxQUVFMjAxQTRGRQorOjEwODgyMDAwMDgwMDMyNEM4RUUyMDFBNDhFMDQwMDAwOEUwNTAwMDQ4NAorOjEwODgzMDAwMDAwMDEwMjFBRDEzMDAwOEE1MDcwMDBFQUQxNjAwMThBQQorOjEwODg0MDAwQUQwNjAwMUMwMEEzMzAyQjAwQTMyODIzMDA4MjIwMjNBOAorOjEwODg1MDAwMDA4NjIwMjNBRDA0MDAwMEFEMDUwMDA0OEVFMjA0QzBCNAorOjEwODg2MDAwQUQwMjAwMTBBRjg5MDEyMDkyRTI0RTIwMTQ0MDAwMzM4NworOjEwODg3MDAwMjQxMTAwMDE4RUUyNEUzMDAwMDIxMEMwMjQ0MjUwMzgxNAorOjEwODg4MDAwMDJFMjIwMjE4QzgyMDAwMDE0NTYwMDFGMDAwMDAwMDAyQworOjEwODg5MDAwOEVFMzRFMzA4RUUyNEUzNDEwNjIwMDFCMDAwMDAwMDA2QQorOjEwODhBMDAwOEM4MjAwMDQyNDQyMDAwMUFDODIwMDA0OEVFMjRFMzQyQgorOjEwODhCMDAwOEVFMzRFMzAyNDQyMDAwMTEwNTUwMDA3MDAwMDAwMDBGNgorOjEwODhDMDAwOEVFMjRFMzQyNDQyMDAwMTEwNjIwMDA1MDAwMDAwMDBEOAorOjEwODhEMDAwMDgwMDMyMzkwMDAwMDAwMDE0NjAwMDA1MDAwMDAwMDBBQworOjEwODhFMDAwOEY4MjAxMjgyNDQyMDAyMEFGODIwMTI4OEY4MjAxMjgzNAorOjEwODhGMDAwOEM4MjAwMDQyQzQyMDAxMTUwNDAwMDEwQUM4MDAwMDAxQgorOjEwODkwMDAwMDgwMDMyNEMwMDAwMDAwMDhFRTI0RTMwMjQ0MjAwMDE4QworOjEwODkxMDAwNTA1NTAwMDMwMDAwMTAyMThFRTI0RTMwMjQ0MjAwMDEyOQorOjEwODkyMDAwQUVFMjRFMzA4RUUyNEUzMDAwMDIxMEMwMjQ0MjUwMzg4QgorOjEwODkzMDAwMDJFMjIwMjFBQzk2MDAwMEFDOUUwMDA0MTYyMDAwMTgzNAorOjEwODk0MDAwM0MwNTAwMDY4RTAyMDAxODNDMDQwMDAxMjQ4NDU4OTA2NworOjEwODk1MDAwQUZBMjAwMTA4RTAyMDAwMDhFMDMwMDA0MzRBNUYwMDlCRgorOjEwODk2MDAwMDIwMDMwMjEwQzAwMjQwM0FGQTMwMDE0OTNBMjAwMzdBRgorOjEwODk3MDAwMTA0MDAyMTYzNDBGODEwMDhFNDIwMDA0OEU0MzAwMDgxRQorOjEwODk4MDAwOEU0NDAwMENBNjRGMDAwQ0FFNDIwMDAwQUU0MzAwMDQyMworOjEwODk5MDAwQUU0NDAwMDg5NjAyMDAxNjA4MDAzNDcwQTY0MjAwMEU4RAorOjEwODlBMDAwMTRFQzAxNjgwMjhBMTgyMzk2MEMwMDBBOTYwMzAwMEU0NAorOjEwODlCMDAwMDI4QTEwMjNBNjAyMDAwQTM0NjIwMDA0QTYwMjAwMEVGNgorOjEwODlDMDAwOEY4ODAxMjAyNzYyMzgwMDI1MDkwMDIwMDEyMjEwMkIwMgorOjEwODlEMDAwMTQ0MDAwMDIzMDZBRkZGRjI3NjkzMDAwOEY4MjAxMjhBRgorOjEwODlFMDAwMTEyMjAwMDQwMDAwMDAwMDhGODIwMTI0MTUyMjAwMDdEQworOjEwODlGMDAwMjQwNDAwMjA4RUUyMDFBNDAwMDA4ODIxMjQ0MjAwMDEwQQorOjEwOEEwMDAwQUVFMjAxQTQwODAwMzJDQThFRTIwMUE0OEVFNTcyNENFNworOjEwOEExMDAwOEVFNjA0OTA4RUU3MDQ5NEE1MDQwMDBFMjQwNDAwMDQ1RQorOjEwOEEyMDAwQUQxMDAwMDhBRDA0MDAxODAwMDUyOTQwMDBBMDE4MjE3MQorOjEwOEEzMDAwMDAwMDEwMjEwMEUzMzgyMTAwRTMyMDJCMDBDMjMwMjE4OAorOjEwOEE0MDAwMDBDNDMwMjFBRDA2MDAwMEFEMDcwMDA0OEVFMjcyNEM3OAorOjEwOEE1MDAwQUQwMjAwMUM4RUUyMDRDNEFEMDIwMDEwQUY4OTAxMjBGQgorOjEwOEE2MDAwOTJFMjRFMjAxNDQwMDAzMzI0MTEwMDAxOEVFMjRFMzA3OQorOjEwOEE3MDAwMDAwMjEwQzAyNDQyNTAzODAyRTIyMDIxOEM4MjAwMDAwMworOjEwOEE4MDAwMTQ1NjAwMUYwMDAwMDAwMDhFRTM0RTMwOEVFMjRFMzQ3QworOjEwOEE5MDAwMTA2MjAwMUIwMDAwMDAwMDhDODIwMDA0MjQ0MjAwMDFEMAorOjEwOEFBMDAwQUM4MjAwMDQ4RUUyNEUzNDhFRTM0RTMwMjQ0MjAwMDE0QworOjEwOEFCMDAwMTA1NTAwMDcwMDAwMDAwMDhFRTI0RTM0MjQ0MjAwMDFGMQorOjEwOEFDMDAwMTA2MjAwMDUwMDAwMDAwMDA4MDAzMkI3MDAwMDAwMDAzRQorOjEwOEFEMDAwMTQ2MDAwMDUwMDAwMDAwMDhGODIwMTI4MjQ0MjAwMjA1RAorOjEwOEFFMDAwQUY4MjAxMjg4RjgyMDEyODhDODIwMDA0MkM0MjAwMTE2MQorOjEwOEFGMDAwNTA0MDAwMTBBQzgwMDAwMDA4MDAzMkNBMDAwMDAwMDBBNgorOjEwOEIwMDAwOEVFMjRFMzAyNDQyMDAwMTUwNTUwMDAzMDAwMDEwMjEzNworOjEwOEIxMDAwOEVFMjRFMzAyNDQyMDAwMUFFRTI0RTMwOEVFMjRFMzAwNAorOjEwOEIyMDAwMDAwMjEwQzAyNDQyNTAzODAyRTIyMDIxQUM5NjAwMDAxRQorOjEwOEIzMDAwQUM5RTAwMDQxNjIwMDAwRDAwMDAwMDAwQTYwQzAwMEFFOAorOjEwOEI0MDAwQTYwQTAwMEU4RjgyMDEwMEFGQTIwMDEwOEY4MjAxMDRERQorOjEwOEI1MDAwM0MwNDAwMDEyNDg0NTg5QzNDMDUwMDA2QUZBMjAwMTQ4QworOjEwOEI2MDAwOEVFNjcyNEMwODAwMzQzQjM0QTVGMDBCM0MwMTAwMDE0QQorOjEwOEI3MDAwMDAzNzA4MjFBMDIwODNDMEFEQUIwMDAwOEVFMjAxRDhGMQorOjEwOEI4MDAwOEVFMzcyNEMyNDQyRkZGRkFFRTIwMUQ4OEVFMjAxRDhBMAorOjEwOEI5MDAwMjQ2MzAwMDEzMDYzMDdGRjI2RTI1MjQ0MTVBMjAwMDY1OQorOjEwOEJBMDAwQUVFMzcyNEM4RUUyMDFEMDI0NDJGRkZGQUVFMjAxRDA3MAorOjEwOEJCMDAwMDgwMDMyRUY4RUUyMDFEMDhFRTIwMUNDMjQ0MkZGRkZBQQorOjEwOEJDMDAwQUVFMjAxQ0M4RUUyMDFDQzhGNDIwMjQwMTA0MDAwNzMzNQorOjEwOEJEMDAwMDAwMDAwMDA4RUUyMEUxQzI0NDIwMDAxQUVFMjBFMUNEQQorOjEwOEJFMDAwOEY0MzAyNDAwMDQzMTAyQjE0NDAwMTc2MDAwMEEwMjE2NworOjEwOEJGMDAwOEY4MzAxMjAyNzYyMzgwMDI0NjYwMDIwMDBDMjEwMkJEQQorOjEwOEMwMDAwNTA0MDAwMDEyNzY2MzAwMDhGODIwMTI4MTBDMjAwMDQwNgorOjEwOEMxMDAwMDAwMDAwMDA4RjgyMDEyNDE0QzIwMDA3MDAwMDAwMDA0MQorOjEwOEMyMDAwOEVFMjAxQTQwMDAwODgyMTI0NDIwMDAxQUVFMjAxQTRFQQorOjEwOEMzMDAwMDgwMDMzNEY4RUUyMDFBNDhFRTI3MjRDQUM2MjAwMUMzRAorOjEwOEM0MDAwOEVFNDA0QTg4RUU1MDRBQzI0NjIwMDFDQUM2MjAwMDgyQgorOjEwOEM1MDAwMjQwMjAwMDhBNDYyMDAwRTI0MDIwMDExQUM2MjAwMTg3NQorOjEwOEM2MDAwQUM2NDAwMDBBQzY1MDAwNDhFRTIwNEM0QUM2MjAwMTA4OQorOjEwOEM3MDAwQUY4NjAxMjA5MkUyNEUyMDE0NDAwMDMzMjQxMTAwMDFGRgorOjEwOEM4MDAwOEVFMjRFMzAwMDAyMTBDMDI0NDI1MDM4MDJFMjIwMjExMQorOjEwOEM5MDAwOEM4MjAwMDAxNDRFMDAxRjAwMDAwMDAwOEVFMzRFMzA1NgorOjEwOENBMDAwOEVFMjRFMzQxMDYyMDAxQjAwMDAwMDAwOEM4MjAwMDQzMworOjEwOENCMDAwMjQ0MjAwMDFBQzgyMDAwNDhFRTI0RTM0OEVFMzRFMzAzQQorOjEwOENDMDAwMjQ0MjAwMDExMDU1MDAwNzAwMDAwMDAwOEVFMjRFMzRERgorOjEwOENEMDAwMjQ0MjAwMDExMDYyMDAwNTAwMDAwMDAwMDgwMDMzM0MzRgorOjEwOENFMDAwMDAwMDAwMDAxNDYwMDAwNTAwMDAwMDAwOEY4MjAxMjhEMQorOjEwOENGMDAwMjQ0MjAwMjBBRjgyMDEyODhGODIwMTI4OEM4MjAwMDQ0OAorOjEwOEQwMDAwMkM0MjAwMTE1MDQwMDAxMEFDODAwMDAwMDgwMDMzNEY4RQorOjEwOEQxMDAwMDAwMDAwMDA4RUUyNEUzMDI0NDIwMDAxNTA1NTAwMDM1NgorOjEwOEQyMDAwMDAwMDEwMjE4RUUyNEUzMDI0NDIwMDAxQUVFMjRFMzBBRgorOjEwOEQzMDAwOEVFMjRFMzAwMDAyMTBDMDI0NDI1MDM4MDJFMjIwMjE2MAorOjEwOEQ0MDAwQUM4RTAwMDBBQzlFMDAwNDU2MjAwMDBEMjQxMTAwMDFFMgorOjEwOEQ1MDAwOEVFMjcyNEMzQzA0MDAwMTI0ODQ1OEE4QUZBMDAwMTQ5OQorOjEwOEQ2MDAwQUZBMjAwMTA4RUU2NzI0QzhGNDcwMjgwM0MwNTAwMDlDRQorOjEwOEQ3MDAwMzRBNUYwMDgwQzAwMjQwM0FGQUUwMDQ4OEZBRTAwNDhDNQorOjEwOEQ4MDAwNTYyMDAwMDFBRUUwMEUxQzhFRTIwMTg4MjQ0MjAwMDE1NAorOjEwOEQ5MDAwQUVFMjAxODgwODAwMzNDODhFRTIwMTg4OEY4MzAxMjA4QgorOjEwOERBMDAwMjc2MjM4MDAyNDY2MDAyMDAwQzIxMDJCNTA0MDAwMDFDQQorOjEwOERCMDAwMjc2NjMwMDA4RjgyMDEyODEwQzIwMDA0MDAwMDAwMDBFNgorOjEwOERDMDAwOEY4MjAxMjQxNEMyMDAwNzAwMDAwMDAwOEVFMjAxQTQ3QgorOjEwOEREMDAwMDAwMDg4MjEyNDQyMDAwMUFFRTIwMUE0MDgwMDMzQkE1OQorOjEwOERFMDAwOEVFMjAxQTQ4RUUyNzI0Q0FDNjIwMDFDOEVFNDA0QThGOAorOjEwOERGMDAwOEVFNTA0QUMyNDYyMDAxQ0FDNjIwMDA4MjQwMjAwMDg2QQorOjEwOEUwMDAwQTQ2MjAwMEUyNDAyMDAxMUFDNjIwMDE4QUM2NDAwMDBFMQorOjEwOEUxMDAwQUM2NTAwMDQ4RUUyMDRDNEFDNjIwMDEwQUY4NjAxMjA5MQorOjEwOEUyMDAwOTJFMjRFMjAxNDQwMDAzMzI0MTEwMDAxOEVFMjRFMzBCNQorOjEwOEUzMDAwMDAwMjEwQzAyNDQyNTAzODAyRTIyMDIxOEM4MjAwMDAzRgorOjEwOEU0MDAwMTQ0RTAwMUYwMDAwMDAwMDhFRTM0RTMwOEVFMjRFMzRDMAorOjEwOEU1MDAwMTA2MjAwMUIwMDAwMDAwMDhDODIwMDA0MjQ0MjAwMDEwQworOjEwOEU2MDAwQUM4MjAwMDQ4RUUyNEUzNDhFRTM0RTMwMjQ0MjAwMDE4OAorOjEwOEU3MDAwMTA1NTAwMDcwMDAwMDAwMDhFRTI0RTM0MjQ0MjAwMDEyRAorOjEwOEU4MDAwMTA2MjAwMDUwMDAwMDAwMDA4MDAzM0E3MDAwMDAwMDA4OQorOjEwOEU5MDAwMTQ2MDAwMDUwMDAwMDAwMDhGODIwMTI4MjQ0MjAwMjA5OQorOjEwOEVBMDAwQUY4MjAxMjg4RjgyMDEyODhDODIwMDA0MkM0MjAwMTE5RAorOjEwOEVCMDAwNTA0MDAwMTBBQzgwMDAwMDA4MDAzM0JBMDAwMDAwMDBGMQorOjEwOEVDMDAwOEVFMjRFMzAyNDQyMDAwMTUwNTUwMDAzMDAwMDEwMjE3NAorOjEwOEVEMDAwOEVFMjRFMzAyNDQyMDAwMUFFRTI0RTMwOEVFMjRFMzA0MQorOjEwOEVFMDAwMDAwMjEwQzAyNDQyNTAzODAyRTIyMDIxQUM4RTAwMDA2MworOjEwOEVGMDAwQUM5RTAwMDQxNjIwMDAwRDAwMDAwMDAwOEVFMjcyNENCMworOjEwOEYwMDAwM0MwNDAwMDEyNDg0NThBOEFGQTAwMDE0QUZBMjAwMTBCNAorOjEwOEYxMDAwOEVFNjcyNEM4RjQ3MDI4MDNDMDUwMDA5MzRBNUYwMDhBQworOjEwOEYyMDAwMEMwMDI0MDNBRkFFMDA0ODhGQUUwMDQ4OEVFMjAxNzRGRgorOjEwOEYzMDAwMjQ0MjAwMDFBRUUyMDE3NDhFRTIwMTc0MDgwMDM0NkUzNgorOjEwOEY0MDAwMDAwMEEwMjE5NjBDMDAwQTAxODMxMDJCNTQ0MDAwMDE2MAorOjEwOEY1MDAwMDE4MDE4MjFBNjAzMDAwQThGODgwMTIwMjc2MjM4MDBBQgorOjEwOEY2MDAwMjUwOTAwMjAwMTIyMTAyQjUwNDAwMDAxMjc2OTMwMDAwNAorOjEwOEY3MDAwOEY4MjAxMjgxMTIyMDAwNDAwMDAwMDAwOEY4MjAxMjQ0QQorOjEwOEY4MDAwMTUyMjAwMDcyNDA0MDAyMDhFRTIwMUE0MDAwMDg4MjE5RAorOjEwOEY5MDAwMjQ0MjAwMDFBRUUyMDFBNDA4MDAzNDJGOEVFMjAxQTRCNQorOjEwOEZBMDAwOEVFNTcyNEM4RUU2MDQ5MDhFRTcwNDk0QTUwNDAwMEVDNAorOjEwOEZCMDAwMjQwNDAwMDRBRDEwMDAwOEFEMDQwMDE4MDAwNTI5NDA4OQorOjEwOEZDMDAwMDBBMDE4MjEwMDAwMTAyMTAwRTMzODIxMDBFMzIwMkIyRAorOjEwOEZEMDAwMDBDMjMwMjEwMEM0MzAyMUFEMDYwMDAwQUQwNzAwMDRGRQorOjEwOEZFMDAwOEVFMjcyNENBRDAyMDAxQzhFRTIwNEM0QUQwMjAwMTA5MQorOjEwOEZGMDAwQUY4OTAxMjA5MkUyNEUyMDE0NDAwMDMzMjQxMTAwMDE3OQorOjEwOTAwMDAwOEVFMjRFMzAwMDAyMTBDMDI0NDI1MDM4MDJFMjIwMjE4RAorOjEwOTAxMDAwOEM4MjAwMDAxNDU2MDAxRjAwMDAwMDAwOEVFMzRFMzBDQQorOjEwOTAyMDAwOEVFMjRFMzQxMDYyMDAxQjAwMDAwMDAwOEM4MjAwMDRBRgorOjEwOTAzMDAwMjQ0MjAwMDFBQzgyMDAwNDhFRTI0RTM0OEVFMzRFMzBCNgorOjEwOTA0MDAwMjQ0MjAwMDExMDU1MDAwNzAwMDAwMDAwOEVFMjRFMzQ1QgorOjEwOTA1MDAwMjQ0MjAwMDExMDYyMDAwNTAwMDAwMDAwMDgwMDM0MUNEQQorOjEwOTA2MDAwMDAwMDAwMDAxNDYwMDAwNTAwMDAwMDAwOEY4MjAxMjg0RAorOjEwOTA3MDAwMjQ0MjAwMjBBRjgyMDEyODhGODIwMTI4OEM4MjAwMDRDNAorOjEwOTA4MDAwMkM0MjAwMTE1MDQwMDAxMEFDODAwMDAwMDgwMDM0MkYyQQorOjEwOTA5MDAwMDAwMDAwMDA4RUUyNEUzMDI0NDIwMDAxNTA1NTAwMDNEMworOjEwOTBBMDAwMDAwMDEwMjE4RUUyNEUzMDI0NDIwMDAxQUVFMjRFMzAyQworOjEwOTBCMDAwOEVFMjRFMzAwMDAyMTBDMDI0NDI1MDM4MDJFMjIwMjFERAorOjEwOTBDMDAwQUM5NjAwMDBBQzlFMDAwNDE2MjAwMDFEMDAwMDAwMDBCRAorOjEwOTBEMDAwQTYwQzAwMEE4RjgyMDEwMEFGQTIwMDEwOEY4MjAxMDQ0QgorOjEwOTBFMDAwM0MwNDAwMDEyNDg0NTg5QzNDMDUwMDA2QUZBMjAwMTRGNworOjEwOTBGMDAwOEVFNjcyNEMzNEE1RjAwRDBDMDAyNDAzMDIwMDM4MjFEQQorOjEwOTEwMDAwOTNBMjAwMzcxMDQwMDAzMTM0MEY4MTAwOEU0MjAwMDREQQorOjEwOTExMDAwOEU0MzAwMDg4RTQ0MDAwQ0E2NEYwMDBDQUU0MjAwMDBBNworOjEwOTEyMDAwQUU0MzAwMDRBRTQ0MDAwODk2MDIwMDE2QTY0MjAwMEVBQworOjEwOTEzMDAwOTYwMjAwMEUzMDQyRkRGRjA4MDAzNDcwQTYwMjAwMEVCOQorOjEwOTE0MDAwOEVFMjAxRDgyNDQyRkZGRkFFRTIwMUQ4OEVFMjAxRDhDMAorOjEwOTE1MDAwOEVFMjAxQ0MzQzA0MDAxRjNDMDEwMDAxMDAzNzA4MjFENQorOjEwOTE2MDAwQTAzRTgzQzAyNDQyRkZGRkFFRTIwMUNDOTYwMzAwMEE3QQorOjEwOTE3MDAwMzQ4NEZGRkY4RUUyMDFDQzAwNkExODIxMDI2Mzk4MjEzQgorOjEwOTE4MDAwMDA5MzIwMkIxMDgwMDAwMzNDMDJGRkY1MzQ0MjEwMDBCNgorOjEwOTE5MDAwMDI2Mjk4MjFBREFCMDAwMDhFRTI3MjRDMjQ0MjAwMDFDNQorOjEwOTFBMDAwMzA0MjA3RkZBRUUyNzI0QzhGNDIwMjQwMTA0MDAwMDQ5MgorOjEwOTFCMDAwMDI4M0EwMjM4RUUyMEUxQzI0NDIwMDAxQUVFMjBFMUNBQworOjEwOTFDMDAwQTNBMDAwMjcxNjgwRkQyOTAwMDAwMDAwMTI4MDAwMjRDMworOjEwOTFEMDAwMDAwMDAwMDAzQzAxMDAwMTAwMzcwODIxQUMzNDgzQzRDQQorOjEwOTFFMDAwM0MwMTAwMDEwMDM3MDgyMUFDMzM4M0M4M0MwMTAwMDE3OQorOjEwOTFGMDAwMDAzNzA4MjFBQzMyODNDQzkzQTIwMDM3MTA0MDAwMDgxRQorOjEwOTIwMDAwMDAwMDAwMDAzQzAyMDAwMTAwNTcxMDIxOEM0MjgzQ0M3QQorOjEwOTIxMDAwMjQ0MjAwMDQzQzAxMDAwMTAwMzcwODIxQUMyMjgzQ0MyOQorOjEwOTIyMDAwOEVFMjcyNEM4RjQzMDI4MDI0NDIwMDAxMzA0MjA3RkZERAorOjEwOTIzMDAwMTQ2MjAwMDYwMDAwMDAwMDhFRTIwMUM0MjQ0MjAwMDExNgorOjEwOTI0MDAwQUVFMjAxQzQwODAwMzRDQzhFRTIwMUM0OEVFMjAxQkM1RgorOjEwOTI1MDAwMjQ0MjAwMDFBRUUyMDFCQzA4MDAzNENDOEVFMjAxQkMyNQorOjEwOTI2MDAwOTdBNDAwMUUyNDg0RkZGQzAwODAxODIxOEVFNDAwQzAxNworOjEwOTI3MDAwOEVFNTAwQzQwMDAwMTAyMTAwQTMyODIxMDBBMzMwMkI5QworOjEwOTI4MDAwMDA4MjIwMjEwMDg2MjAyMUFFRTQwMEMwQUVFNTAwQzRBQgorOjEwOTI5MDAwOEZBRjAwMkMyNDAyMDAwMjExRTIwMDBGMjlFMjAwMDMyQworOjEwOTJBMDAwMTQ0MDAwMTcyNDAyMDAwMzE1RTIwMDE1MDAwMDAwMDAxRQorOjEwOTJCMDAwOEVFMjAwRDA4RUUzMDBENDI0NjMwMDAxMkM2NDAwMDExMAorOjEwOTJDMDAwMDA0NDEwMjFBRUUyMDBEMEFFRTMwMEQ0OEVFMjAwRDAyNAorOjEwOTJEMDAwMDgwMDM0QzY4RUUzMDBENDhFRTIwMEQ4OEVFMzAwRENCMgorOjEwOTJFMDAwMjQ2MzAwMDEyQzY0MDAwMTAwNDQxMDIxQUVFMjAwRDg4OAorOjEwOTJGMDAwQUVFMzAwREM4RUUyMDBEODA4MDAzNEM2OEVFMzAwREM2QQorOjEwOTMwMDAwOEVFMjAwQzg4RUUzMDBDQzI0NjMwMDAxMkM2NDAwMDFDRgorOjEwOTMxMDAwMDA0NDEwMjFBRUUyMDBDOEFFRTMwMENDOEVFMjAwQzhFQgorOjEwOTMyMDAwOEVFMzAwQ0M4RjgzMDBFNDhGODIwMEUwMTA2MjAwMDNBNAorOjEwOTMzMDAwMjQ2MzAwMDhBRjgzMDBFNEFGODMwMEU4OEZCRjAwNzBCMAorOjEwOTM0MDAwOEZCRTAwNkM4RkI2MDA2ODhGQjUwMDY0OEZCNDAwNjA2QworOjEwOTM1MDAwOEZCMzAwNUM4RkIyMDA1ODhGQjEwMDU0OEZCMDAwNTBCMworOjEwOTM2MDAwMDNFMDAwMDgyN0JEMDA3ODI3QkRGRkIwQUZCNTAwNDQ3QgorOjEwOTM3MDAwMDAwMEE4MjFBRkIwMDAzMDAwMDA4MDIxQUZCRjAwNEMzQQorOjEwOTM4MDAwQUZCNjAwNDhBRkI0MDA0MEFGQjMwMDNDQUZCMjAwMzg1NgorOjEwOTM5MDAwQUZCMTAwMzQ4RUUyMDRENDI0MTQwMDAxMzA0MjAwMDE0NQorOjEwOTNBMDAwMTQ0MDAwMkEwMDAwQjAyMThGODcwMEUwOEY4ODAwQzQ5RAorOjEwOTNCMDAwOEY4MjAwRTgwMEUyMjAyMzJDODIxMDAwNTA0MDAwMDE0MAorOjEwOTNDMDAwMjQ4NDEwMDAwMDA0MjBDMjAwODAxODIxOEVFNDAwQzgwQworOjEwOTNEMDAwOEVFNTAwQ0MwMDAwMTAyMTAwQTMyODIxMDBBMzMwMkIzMworOjEwOTNFMDAwMDA4MjIwMjEwMDg2MjAyMUFFRTQwMEM4QUVFNTAwQ0MzQQorOjEwOTNGMDAwOEY4MzAwQzgzQzAyMDAwQTM0NDJFRkZGMDEwMzIwMjNBMAorOjEwOTQwMDAwMDA0NDEwMkIxMDQwMDAwMzNDMDIwMDBBMzQ0MkYwMDBEQworOjEwOTQxMDAwMDA4MjIwMjEwMDgwMTgyMThFRTQwMEMwOEVFNTAwQzQ2NworOjEwOTQyMDAwMDAwMDEwMjEwMEEzMjgyMTAwQTMzMDJCMDA4MjIwMjE1RQorOjEwOTQzMDAwMDA4NjIwMjFBRUU0MDBDMEFFRTUwMEM0QUY4ODAwQzhCRAorOjEwOTQ0MDAwQUY4NzAwRTQwODAwMzg1MEFGODcwMEU4M0MwMjAwMDExNQorOjEwOTQ1MDAwMDA1NzEwMjE5MDQyODNDMDEwNDAwMDBCMDAwMDAwMDAxNAorOjEwOTQ2MDAwM0MxMzAwMDEwMjc3OTgyMThFNzM4M0M0M0MxMTAwMDFFNAorOjEwOTQ3MDAwMDIzNzg4MjE4RTMxODNDODNDMTIwMDAxMDI1NzkwMjFBNworOjEwOTQ4MDAwMDgwMDM2RTg4RTUyODNDQzhGODMwMEUwOEY4MjAwRTRBMAorOjEwOTQ5MDAwMTA0MzAwMDcwMDAwNDgyMThGODIwMEU0MjQwOTAwMDFFNgorOjEwOTRBMDAwOEM0MzAwMDA4QzQ0MDAwNEFGQTMwMDE4QUZBNDAwMUM0MAorOjEwOTRCMDAwMTUyMDAwMEUzQzAyRkZGRjhGODIwMEM0QUZBMjAwMTBGNworOjEwOTRDMDAwOEY4MjAwQzgzQzA0MDAwMTI0ODQ1ODcwQUZBMjAwMTRBRAorOjEwOTREMDAwOEY4NjAwRTA4Rjg3MDBFNDNDMDUwMDA2MEMwMDI0MDMyMworOjEwOTRFMDAwMzRBNUYwMDAwODAwMzg1MDAwMDAwMDAwOEZBMzAwMUNENQorOjEwOTRGMDAwOEZCMjAwMTgzMDczRkZGRjI2NzNGRkZDMDA2MjEwMjQ0OAorOjEwOTUwMDAwMTA0MDAwNTgwMjQwODgyMTNDMDIwMDgwMDA2MjEwMjQ3NAorOjEwOTUxMDAwMTA0MDAwMEEzQzA0MDA0MDhFRTIwMDdDMjQ0MjAwMDExRQorOjEwOTUyMDAwQUVFMjAwN0M4RUUyMDA3QzhFRTIwMUZDMjQ0MjAwMDE2RgorOjEwOTUzMDAwQUVFMjAxRkMwODAwMzg0QThFRTIwMUZDM0MwNjAwMDQ2MQorOjEwOTU0MDAwM0MwQjAwMDEzQzBBMDAwMjNDMDUwMDEwM0MwOTAwMDhFRAorOjEwOTU1MDAwOEVFMjAwODAzQzA4MDAyMDM0MDc4MDAwMjQ0MjAwMDE5NQorOjEwOTU2MDAwQUVFMjAwODA4RUUyMDA4MDhGQTIwMDFDMDA0NDE4MjQyRQorOjEwOTU3MDAwMTA2NjAwMjEwMEMzMTAyQjE0NDAwMDA3MDAwMDAwMDBGQgorOjEwOTU4MDAwMTA2QjAwMTEwMDAwMDAwMDEwNkEwMDE1MDAwMDAwMDBDMAorOjEwOTU5MDAwMDgwMDM1OTIwMDA0MjA0MjEwNjUwMDIzMDBBMzEwMkIyMAorOjEwOTVBMDAwMTQ0MDAwMDUwMDAwMDAwMDEwNjkwMDE5MDAwMDAwMDBEMAorOjEwOTVCMDAwMDgwMDM1OTIwMDA0MjA0MjEwNjgwMDIxMDAwMDAwMDBERAorOjEwOTVDMDAwMDgwMDM1OTIwMDA0MjA0MjhFRTIwMDM0MjQ0MjAwMDE1QgorOjEwOTVEMDAwQUVFMjAwMzQ4RUUyMDAzNDA4MDAzNTkyMDAwNDIwNDJFRQorOjEwOTVFMDAwOEVFMjAxRUMyNDQyMDAwMUFFRTIwMUVDOEVFMjAxRUNERAorOjEwOTVGMDAwMDgwMDM1OTIwMDA0MjA0MjhFRTIwMUYwMjQ0MjAwMDE2RQorOjEwOTYwMDAwQUVFMjAxRjA4RUUyMDFGMDA4MDAzNTkyMDAwNDIwNDI0MworOjEwOTYxMDAwOEVFMjAxRjQyNDQyMDAwMUFFRTIwMUY0OEVFMjAxRjQ5NAorOjEwOTYyMDAwMDgwMDM1OTIwMDA0MjA0MjhFRTIwMDMwMjQ0MjAwMDFGRQorOjEwOTYzMDAwQUVFMjAwMzA4RUUyMDAzMDA4MDAzNTkyMDAwNDIwNDI5NQorOjEwOTY0MDAwOEVFMjAxRjgyNDQyMDAwMUFFRTIwMUY4OEVFMjAxRjg1OAorOjEwOTY1MDAwMDAwNDIwNDIxMDg3MDJCNzAwMDAwMDAwMDgwMDM1NTdDMAorOjEwOTY2MDAwMDAwMDAwMDAzQzAyMDAwMTAwNTcxMDIxOTA0MjgzQjIyQworOjEwOTY3MDAwMTQ0MDAwODQyNDAyMDAwMTNDMDMwMDAxMDA3NzE4MjFGQgorOjEwOTY4MDAwOTA2MzgzQjMxNDYyMDA3RjNDMDIwMTAwOEU0MzAwMDBBQworOjEwOTY5MDAwMDA2MjEwMjQxMDQwMDA2RjI0MDJGRkZGMTQ2MjAwMDVENgorOjEwOTZBMDAwMjQxMDAwMDE5NjQzMDAwNDM0MDJGRkZGMTA2MjAwNzU4RAorOjEwOTZCMDAwMDAwMDAwMDA5MkUyMDREODE0NDAwMDcyMDAwMDAwMDA5NAorOjEwOTZDMDAwM0MwMjAwMDEwMDU3MTAyMThDNDI4M0I0Mjg0MjAwMDU1RgorOjEwOTZEMDAwMTA0MDAwMjAwMDAwMzgyMTNDMDIwMDAxMDA1NzEwMjFGQQorOjEwOTZFMDAwOEM0MjgzQjQxODQwMDAxNjAwMDAyODIxOTYyNjAwMDAwMgorOjEwOTZGMDAwMDAwNTIwQzAwMDk3MTAyMTk0NDI3NzdFMTQ0NjAwMDk4RgorOjEwOTcwMDAwMDA5NzEwMjE5NDQzNzc4MDk2MjIwMDAyMTQ2MjAwMDU4RQorOjEwOTcxMDAwMDA5NzEwMjE5NDQzNzc4Mjk2MjIwMDA0NTA2MjAwMDgzQgorOjEwOTcyMDAwMjQwNzAwMDEzQzAyMDAwMTAwNTcxMDIxOEM0MjgzQjQ0MQorOjEwOTczMDAwMjRBNTAwMDEwMEEyMTAyQTU0NDBGRkVFMDAwNTIwQzAxRAorOjEwOTc0MDAwMzBFMjAwRkYxMDQwMDI3QjAwMDAwMDAwMDgwMDM2MUVERgorOjEwOTc1MDAwMDAwMDAwMDAwMjQwMjAyMTBDMDAyMkZFMjQwNTAwMDYyQgorOjEwOTc2MDAwMzA0NDAwMUYwMDA0MjhDMDAyRTUxMDIxOTQ0MjcyN0M5RQorOjEwOTc3MDAwMzA0MjQwMDAxNDQwMDI2RjAwQjcxMDIxOTQ0MzcyN0VDMworOjEwOTc4MDAwOTYyMjAwMDAxNDYyMDAwQjAwMDQxOEMwMDBCNzEwMjFEQworOjEwOTc5MDAwOTQ0MzcyODA5NjIyMDAwMjE0NjIwMDA2MDAwNDE4QzBFRQorOjEwOTdBMDAwMDBCNzEwMjE5NDQzNzI4Mjk2MjIwMDA0MTA2MjAwMzVBMworOjEwOTdCMDAwMDAwNDE4QzAwMkUzMTAyMTk0NDI3MjdDMzA0MjgwMDAwMQorOjEwOTdDMDAwMTQ0MDAyNUMwMkUzMTAyMTk0NDg3MjdDOTYyNzAwMDA0QQorOjEwOTdEMDAwMDAwODI4QzAwMEI3MTAyMTk0NDI3MzdFMDgwMDM2MDBBQworOjEwOTdFMDAwMDAwMDMwMjEwMDA0MjBDMDAyRTQxMDIxOTQ0MzczN0M2NworOjEwOTdGMDAwMDJFNDEwMjE5NDQ4NzM3QzMwNjM4MDAwMTQ2MDAwMTBGMAorOjEwOTgwMDAwMDAwODI4QzAwMEI3MTAyMTk0NDI3MzdFMTQ0N0ZGRjU2QQorOjEwOTgxMDAwMDEwMDIwMjEwMEI3MTAyMTk0NDM3MzgwOTYyMjAwMDI5QQorOjEwOTgyMDAwNTQ2MkZGRjEwMDA0MjBDMDAwQjcxMDIxOTQ0MzczODJGQQorOjEwOTgzMDAwOTYyMjAwMDQ1NDYyRkZFQzAwMDQyMEMwMjQwNjAwMDFCQworOjEwOTg0MDAwMzBDMjAwRkYxMDQwMDIzQjAwMDAwMDAwMDgwMDM2MUUzRQorOjEwOTg1MDAwMDAwMDAwMDA5NzQzMDIwMjk2NDIwMDAwMTQ2MjAyMzVBNQorOjEwOTg2MDAwMDAwMDAwMDA5NzQzMDIwNDk2NDIwMDAyMTQ2MjAyMzE5NQorOjEwOTg3MDAwMDAwMDAwMDA5NzQzMDIwNjk2NDIwMDA0MTQ2MjAyMkQ4NQorOjEwOTg4MDAwMDAwMDAwMDA5MjQyMDAwMDNBMDMwMDAxMzA0MjAwMDE1MworOjEwOTg5MDAwMDA0MzEwMjQxMDQwMDA3NDI0MDJGRkZGOEUyMzAwMDBCOAorOjEwOThBMDAwMTQ2MjAwMDQzNDAyRkZGRjk2MjMwMDA0MTA2MjAwNkY2QworOjEwOThCMDAwMjQxNDAwMDIzQzAyMDAwMTAwNTcxMDIxOTA0MjgzQjJBMAorOjEwOThDMDAwMTQ0MDAwNkEyNDE0MDAwMzkyRTIwNEQ4MTQ0MDAwNjc5NAorOjEwOThEMDAwMDAwMDAwMDAzQzAyMDAwMTAwNTcxMDIxOEM0MjgzQjRCQworOjEwOThFMDAwMjg0MjAwMDUxMDQwMDAyMDAwMDAzODIxM0MwMjAwMDEwMQorOjEwOThGMDAwMDA1NzEwMjE4QzQyODNCNDE4NDAwMDE2MDAwMDI4MjEyNAorOjEwOTkwMDAwOTYyNjAwMDAwMDA1MjBDMDAwOTcxMDIxOTQ0Mjc3N0UyMworOjEwOTkxMDAwMTQ0NjAwMDkwMDk3MTAyMTk0NDM3NzgwOTYyMjAwMDI5NAorOjEwOTkyMDAwMTQ2MjAwMDUwMDk3MTAyMTk0NDM3NzgyOTYyMjAwMDQ2OAorOjEwOTkzMDAwNTA2MjAwMDgyNDA3MDAwMTNDMDIwMDAxMDA1NzEwMjE3QQorOjEwOTk0MDAwOEM0MjgzQjQyNEE1MDAwMTAwQTIxMDJBNTQ0MEZGRUVFQgorOjEwOTk1MDAwMDAwNTIwQzAzMEUyMDBGRjE0NDAwMDQ0MjQxNDAwMDMzRQorOjEwOTk2MDAwMDgwMDM4NEEwMDAwMDAwMDAyNDAyMDIxMEMwMDIyRkVCRQorOjEwOTk3MDAwMjQwNTAwMDYzMDQ0MDAxRjAwMDQyOEMwMDJFNTEwMjEyMQorOjEwOTk4MDAwOTQ0MjcyN0MzMDQyNDAwMDE0NDAwMUVBMDBCNzEwMjEzQQorOjEwOTk5MDAwOTQ0MzcyN0U5NjIyMDAwMDE0NjIwMDBCMDAwNDE4QzBFQgorOjEwOTlBMDAwMDBCNzEwMjE5NDQzNzI4MDk2MjIwMDAyMTQ2MjAwMDZEMAorOjEwOTlCMDAwMDAwNDE4QzAwMEI3MTAyMTk0NDM3MjgyOTYyMjAwMDQ1QworOjEwOTlDMDAwMTA2MjAwMjcwMDA0MThDMDAyRTMxMDIxOTQ0MjcyN0M0OAorOjEwOTlEMDAwMzA0MjgwMDAxNDQwMDFENzAyRTMxMDIxOTQ0ODcyN0M4OQorOjEwOTlFMDAwOTYyNzAwMDAwMDA4MjhDMDAwQjcxMDIxOTQ0MjczN0UxQgorOjEwOTlGMDAwMDgwMDM2ODUwMDAwMzAyMTAwMDQyMEMwMDJFNDEwMjE1OAorOjEwOUEwMDAwOTQ0MzczN0MwMkU0MTAyMTk0NDg3MzdDMzA2MzgwMDA5QgorOjEwOUExMDAwMTQ2MDAwMTAwMDA4MjhDMDAwQjcxMDIxOTQ0MjczN0UyMworOjEwOUEyMDAwMTQ0N0ZGRjUwMTAwMjAyMTAwQjcxMDIxOTQ0MzczODBGMworOjEwOUEzMDAwOTYyMjAwMDI1NDYyRkZGMTAwMDQyMEMwMDBCNzEwMjFGQQorOjEwOUE0MDAwOTQ0MzczODI5NjIyMDAwNDU0NjJGRkVDMDAwNDIwQzAwOQorOjEwOUE1MDAwMjQwNjAwMDEzMEMyMDBGRjEwNDAwMUI2MDAwMDAwMDBFMworOjEwOUE2MDAwMDgwMDM2OTgyNDE0MDAwMzI0MTQwMDAxOEY0MjAyNjA3OQorOjEwOUE3MDAwMDA1MzEwMkIxMDQwMDA0OTAwMDAwMDAwOEY4MzAwRTRDOQorOjEwOUE4MDAwOEY4MjAwRTAxMDYyMDAwMzI0NjMwMDA4QUY4MzAwRTRDQgorOjEwOUE5MDAwQUY4MzAwRTg4RUU0MDBDMDhFRTUwMEM0MDI2MDE4MjFBOAorOjEwOUFBMDAwMDAwMDEwMjEwMEEzMjgyMTAwQTMzMDJCMDA4MjIwMjFEOAorOjEwOUFCMDAwMDA4NjIwMjFBRUU0MDBDMEFFRTUwMEM0OEVFMjAwNTg2RQorOjEwOUFDMDAwMjQ0MjAwMDFBRUUyMDA1ODhFRTIwMDU4OEVFMjAwN0M5MworOjEwOUFEMDAwMjQ0MjAwMDFBRUUyMDA3QzhFRTIwMDdDOEY4MjAwRTAzNgorOjEwOUFFMDAwQUZBMjAwMTA4RjgyMDBFNDNDMDQwMDAxMjQ4NDU4Nzg2NworOjEwOUFGMDAwQUZBMjAwMTQ4RkE2MDAxODhGQTcwMDFDM0MwNTAwMDYxQgorOjEwOUIwMDAwMEMwMDI0MDMzNEE1RjAwMzA4MDAzODUwMDAwMDAwMDBDNgorOjEwOUIxMDAwOEVFMjUyNDBBRkEyMDAxMDhFRTI1MjQ0M0MwNDAwMDE5QgorOjEwOUIyMDAwMjQ4NDU4ODRBRkEyMDAxNDhFRTYwRTEwOEVFNzBFMTgxRgorOjEwOUIzMDAwMEMwMDI0MDMzNEE1RjAwMjhFRTIwMUMwMjQ0MjAwMDE4RgorOjEwOUI0MDAwQUVFMjAxQzA4RUUyMDAwMDhFRTMwMUMwMjQwM0ZGQkYzRAorOjEwOUI1MDAwMDA0MzEwMjQwODAwMzdGOEFFRTIwMDAwOEVFMjUyNDBDNQorOjEwOUI2MDAwQUZBMjAwMTA4RUUyNTI0NDNDMDQwMDAxMjQ4NDU4ODRDOQorOjEwOUI3MDAwQUZBMjAwMTQ4RUU2MEUxMDhFRTcwRTE4M0MwNTAwMDYwQworOjEwOUI4MDAwMEMwMDI0MDMzNEE1RjAwMjhFRTIwMUMwMjQ0MjAwMDEzRgorOjEwOUI5MDAwQUVFMjAxQzAwODAwMzdGODhFRTIwMUMwOTZFMjA0NjgyOAorOjEwOUJBMDAwMDA1MzEwMkI1NDQwMDAwMTNDMTU4MDAwMTI2MDAxMzExRAorOjEwOUJCMDAwM0MwQzAwMUYzNThDRkZGRjhFRTI3MjRDOEY0MzAyODBGRAorOjEwOUJDMDAwMjQ0MjAwMDEzMDQyMDdGRjEwNjIwMTA4MDAwMDAwMDAzQgorOjEwOUJEMDAwMTJBMDAwMTQwMDAwMDAwMDhFRTM1MjQwOEVFMjUyNDRCNgorOjEwOUJFMDAwMTA2MjAwMDkyNkVFNTI0NDhFRUI1MjQ0OEVFMzUyNDQzQQorOjEwOUJGMDAwMDAwMjExNDAyNDQyNTI0ODAyRTI4MDIxMjQ2MzAwMDEwNQorOjEwOUMwMDAwMDgwMDM3MTIzMDY4MDBGRjkyRTI3MjQ4MTQ0MEZGQzAyQgorOjEwOUMxMDAwM0MwNTAwMDY4RUUyMDFFMDI0NDIwMDAxQUVFMjAxRTBENAorOjEwOUMyMDAwOEVFMjAxRTA4RUUzMEUxMDhFRTIwRTE4MTA2MkZGQ0I4MgorOjEwOUMzMDAwMjZFRTBFMTg4RUVCMEUxODAwMDBBODIxOEVFMzBFMThFQgorOjEwOUM0MDAwMDAwMjExNDAyNDQyMEUyMDAyRTI4MDIxMjQ2MzAwMDEyMAorOjEwOUM1MDAwMzA2ODAxRkY5NkUyMDQ2QTMwNDIwMDEwMTA0MDAwMTc5RAorOjEwOUM2MDAwMzQwMjgxMDA5NjQzMDAwQzE0NjIwMDE0MDAwMDAwMDBDRQorOjEwOUM3MDAwM0MwMjAwMDEwMDU3MTAyMTkwNDI4M0MwMTQ0MDAwMEZBNQorOjEwOUM4MDAwMDAwMDAwMDA5NjQyMDAwRUE2MDIwMDE2OEU0MjAwMDg1OAorOjEwOUM5MDAwOEU0MzAwMDQ4RTQ0MDAwMDI2NzNGRkZDQUU0MjAwMEM4RAorOjEwOUNBMDAwQUU0MzAwMDhBRTQ0MDAwNDk2MDIwMDBFMjYzMTAwMDRDNAorOjEwOUNCMDAwMjQxNjAwMDEzNDQyMDIwMEE2MDIwMDBFOTYwMzAwMEE5OAorOjEwOUNDMDAwMDI2MDUwMjEwMDczMTAyQjEwNDAwMDAyMDI2MDY4MjFENgorOjEwOUNEMDAwMDA2MDUwMjEyRDQyMDAzRDEwNDAwMDJBMDAwMDM4MjEzNAorOjEwOUNFMDAwOTYyMzAwMEMyNDAyMDgwMDU0NjIwMDI3QUUxMTAwMThDRAorOjEwOUNGMDAwM0MwMjAwMDEwMDU3MTAyMTkwNDI4M0MwNTQ0MDAwMjJEMgorOjEwOUQwMDAwQUUxMTAwMTgyNjIyMDAxNzAxODIxMDJCMTA0MDAwMTNGQworOjEwOUQxMDAwMDAwMDAwMDAzQzAyRkZGNTAwNTExMDIxOTA0MjEwMTc5NgorOjEwOUQyMDAwMzg0MzAwMDYyQzYzMDAwMTM4NDIwMDExMkM0MjAwMDEyOAorOjEwOUQzMDAwMDA2MjE4MjUxMDYwMDAxMzI2MjIwMDEwMDE4MjEwMkJFQgorOjEwOUQ0MDAwMTA0MDAwMEUwMDAwMDAwMDNDMDdGRkY1MDBGMTM4MjEzNAorOjEwOUQ1MDAwOTRFNzEwMTAwODAwMzc1RTI0RTcwMDBFOTIyMjAwMTdFNworOjEwOUQ2MDAwMzg0MzAwMDYyQzYzMDAwMTM4NDIwMDExMkM0MjAwMDFFOAorOjEwOUQ3MDAwMDA2MjE4MjU1MDYwMDAwNEFFMTEwMDE4OTYyNzAwMTBFQworOjEwOUQ4MDAwMjRFNzAwMEVBRTExMDAxODNDMDIwMDAxMDA1NzEwMjExQworOjEwOUQ5MDAwOTA0MjgzQzAwMDAyMTAyQjE0RTAwMDAyMDAwMjRFQzA2QgorOjEwOURBMDAwMDE0MDM4MjE4RjgzMDEyMDI3NjIzODAwMjQ2NjAwMjA3QgorOjEwOURCMDAwMDBDMjEwMkI1MDQwMDAwMTI3NjYzMDAwOEY4MjAxMjgxRQorOjEwOURDMDAwMTBDMjAwMDQwMDAwMDAwMDhGODIwMTI0MTRDMjAwMDdBQQorOjEwOUREMDAwMjQwMjAwMEI4RUUyMDFBNDAwMDA0ODIxMjQ0MjAwMDE2RAorOjEwOURFMDAwQUVFMjAxQTQwODAwMzdCRjhFRTIwMUE0OEUwNDAwMDA5OQorOjEwOURGMDAwOEUwNTAwMDRBQzYyMDAxODAxNzUxMDI1MDA0OTEwMjU3RAorOjEwOUUwMDAwQUM3MTAwMDhBNDY3MDAwRUFDNjIwMDFDQUM2NDAwMDBEQQorOjEwOUUxMDAwQUM2NTAwMDQ4RUUyMDRDMEFDNjIwMDEwQUY4NjAxMjA4NQorOjEwOUUyMDAwOTJFMjRFMjAxNDQwMDAzODI0MDkwMDAxOEVFMjRFMzBBOAorOjEwOUUzMDAwMDAwMjEwQzAyNDQyNTAzODAyRTIyMDIxOEM4MzAwMDAyRQorOjEwOUU0MDAwMjQwMjAwMDcxNDYyMDAyMDAwMDAwMDAwOEVFMzRFMzA2MAorOjEwOUU1MDAwOEVFMjRFMzQxMDYyMDAxQzAwMDAwMDAwOEM4MjAwMDQ3MAorOjEwOUU2MDAwMjQ0MjAwMDFBQzgyMDAwNDhFRTM0RTM0OEVFNTRFMzA3NQorOjEwOUU3MDAwMjQwMjAwNDAyNDYzMDAwMTEwNjIwMDA3MDAwMDAwMDA3QgorOjEwOUU4MDAwOEVFMjRFMzQyNDQyMDAwMTEwQTIwMDA1MDAwMDAwMDBDMgorOjEwOUU5MDAwMDgwMDM3QTkwMDAwMDAwMDE0QTAwMDA1MDAwMDAwMDAyMQorOjEwOUVBMDAwOEY4MjAxMjgyNDQyMDAyMEFGODIwMTI4OEY4MjAxMjg1RQorOjEwOUVCMDAwOEM4MjAwMDQyQzQyMDAxMTUwNDAwMDEzQUM4MDAwMDA0MgorOjEwOUVDMDAwMDgwMDM3QkYwMDAwMDAwMDhFRTI0RTMwMjQwMzAwNDAzRgorOjEwOUVEMDAwMjQ0MjAwMDE1MDQzMDAwMzAwMDAxMDIxOEVFMjRFMzA2NgorOjEwOUVFMDAwMjQ0MjAwMDFBRUUyNEUzMDhFRTI0RTMwMDAwMjEwQzAzRAorOjEwOUVGMDAwMjQ0MjUwMzgwMkUyMjAyMTI0MDIwMDA3QUM4MjAwMDBGNAorOjEwOUYwMDAwMjQwMjAwMDFBQzgyMDAwNDE1MjAwMDE4M0MwNTAwMDY2NAorOjEwOUYxMDAwOEUwMjAwMTgzQzA0MDAwMTI0ODQ1ODkwQUZBMjAwMTA2NworOjEwOUYyMDAwOEUwMjAwMDA4RTAzMDAwNDM0QTVGMDA5MDIwMDMwMjFFNworOjEwOUYzMDAwMEMwMDI0MDNBRkEzMDAxNDMyQzIwMEZGMTA0MDAwMkIxQQorOjEwOUY0MDAwMzQwMjgxMDA4RTQzMDAwNDhFNDQwMDA4OEU0NTAwMENDQworOjEwOUY1MDAwQTY0MjAwMENBRTQzMDAwMEFFNDQwMDA0QUU0NTAwMDgyQgorOjEwOUY2MDAwOTYwMjAwMTYwODAwMzdGOEE2NDIwMDBFMTU0RDAwMEFBQQorOjEwOUY3MDAwMDAwMDAwMDA5NjAyMDAwRUE2MTMwMDBBMzQ0MjAwMDRGRQorOjEwOUY4MDAwQTYwMjAwMEUzQzAxMDAwMTAwMzcwODIxQTAyMDgzQzA3QQorOjEwOUY5MDAwMDgwMDM3RjYwMDAwOTgyMTk2MDQwMDBBMDA5MzEwMkI2MQorOjEwOUZBMDAwMTA0MDAwMDIwMjYwMTgyMTAwODAxODIxMjQwMjAwMDFFNAorOjEwOUZCMDAwQTYwMzAwMEEzQzAxMDAwMTAwMzcwODIxQTAyMjgzQzA0QgorOjEwOUZDMDAwOTYwNDAwMEEwMjI0ODgyMTAxOTExMDJCMTA0MDAwMDNGRQorOjEwOUZEMDAwM0MwMkZGRjUzNDQyMTAwMDAyMjI4ODIxMDI2NDk4MjNEQgorOjEwOUZFMDAwMDAwMEE4MjExNjYwRkVGNEFEQzgwMDAwMTI2MDAwMjEzOAorOjEwOUZGMDAwMzJDMjAwRkYzQzAxMDAwMTAwMzcwODIxQUMzMzgzQzRBQQorOjEwQTAwMDAwM0MwMTAwMDEwMDM3MDgyMUFDMzE4M0M4M0MwMTAwMDE0QworOjEwQTAxMDAwMDAzNzA4MjExMDQwMDAwOEFDMzI4M0NDM0MwMjAwMDExQworOjEwQTAyMDAwMDA1NzEwMjE4QzQyODNDQzI0NDIwMDA0M0MwMTAwMDFFMworOjEwQTAzMDAwMDAzNzA4MjFBQzIyODNDQzhFRTI3MjRDOEY0MzAyODAyMQorOjEwQTA0MDAwMjQ0MjAwMDExNDYyMDAwNjAwMDAwMDAwOEVFMjAxQzRGOAorOjEwQTA1MDAwMjQ0MjAwMDFBRUUyMDFDNDA4MDAzODUwOEVFMjAxQzQ3RgorOjEwQTA2MDAwOEVFMjAxQkMyNDQyMDAwMUFFRTIwMUJDMDgwMDM4NTA3RgorOjEwQTA3MDAwOEVFMjAxQkM5N0E0MDAxRTI0ODRGRkZDMDA4MDE4MjFGRQorOjEwQTA4MDAwOEVFNDAwQzA4RUU1MDBDNDAwMDAxMDIxMDBBMzI4MjE0QQorOjEwQTA5MDAwMDBBMzMwMkIwMDgyMjAyMTAwODYyMDIxMjQwMjAwMDIxMAorOjEwQTBBMDAwQUVFNDAwQzBBRUU1MDBDNDEyODIwMDBGMkE4MjAwMDNCNQorOjEwQTBCMDAwMTQ0MDAwMTcyNDAyMDAwMzE2ODIwMDE1MDAwMDAwMDA1RgorOjEwQTBDMDAwOEVFMjAwRDA4RUUzMDBENDI0NjMwMDAxMkM2NDAwMDFGMgorOjEwQTBEMDAwMDA0NDEwMjFBRUUyMDBEMEFFRTMwMEQ0OEVFMjAwRDAwNgorOjEwQTBFMDAwMDgwMDM4NEE4RUUzMDBENDhFRTIwMEQ4OEVFMzAwREMwQworOjEwQTBGMDAwMjQ2MzAwMDEyQzY0MDAwMTAwNDQxMDIxQUVFMjAwRDg2QQorOjEwQTEwMDAwQUVFMzAwREM4RUUyMDBEODA4MDAzODRBOEVFMzAwRENDMworOjEwQTExMDAwOEVFMjAwQzg4RUUzMDBDQzI0NjMwMDAxMkM2NDAwMDFCMQorOjEwQTEyMDAwMDA0NDEwMjFBRUUyMDBDOEFFRTMwMENDOEVFMjAwQzhDRAorOjEwQTEzMDAwOEVFMzAwQ0M4RjgzMDBFNDhGODIwMEUwMTA2MjAwMDM4NgorOjEwQTE0MDAwMjQ2MzAwMDhBRjgzMDBFNEFGODMwMEU4OEZCRjAwNENCNgorOjEwQTE1MDAwOEZCNjAwNDg4RkI1MDA0NDhGQjQwMDQwOEZCMzAwM0NFOQorOjEwQTE2MDAwOEZCMjAwMzg4RkIxMDAzNDhGQjAwMDMwMDNFMDAwMDhBOAorOjEwQTE3MDAwMjdCRDAwNTAyN0JERkY5MEFGQjYwMDYwMDAwMEIwMjFBMgorOjEwQTE4MDAwQUZCRjAwNjhBRkJFMDA2NEFGQjUwMDVDQUZCNDAwNThBRAorOjEwQTE5MDAwQUZCMzAwNTRBRkIyMDA1MEFGQjEwMDRDQUZCMDAwNDgwNQorOjEwQTFBMDAwOEVFMjA0RDQwMDAwODgyMTI0MTUwMDAxMzA0MjAwMDExMQorOjEwQTFCMDAwMTQ0MDAwMkFBM0EwMDAyRjhGODcwMEUwOEY4ODAwQzRERQorOjEwQTFDMDAwOEY4MjAwRTgwMEUyMjAyMzJDODIxMDAwNTA0MDAwMDEyMgorOjEwQTFEMDAwMjQ4NDEwMDAwMDA0MjBDMjAwODAxODIxOEVFNDAwQzhFRQorOjEwQTFFMDAwOEVFNTAwQ0MwMDAwMTAyMTAwQTMyODIxMDBBMzMwMkIxNQorOjEwQTFGMDAwMDA4MjIwMjEwMDg2MjAyMUFFRTQwMEM4QUVFNTAwQ0MxQworOjEwQTIwMDAwOEY4MzAwQzgzQzAyMDAwQTM0NDJFRkZGMDEwMzIwMjM4MQorOjEwQTIxMDAwMDA0NDEwMkIxMDQwMDAwMzNDMDIwMDBBMzQ0MkYwMDBCRQorOjEwQTIyMDAwMDA4MjIwMjEwMDgwMTgyMThFRTQwMEMwOEVFNTAwQzQ0OQorOjEwQTIzMDAwMDAwMDEwMjEwMEEzMjgyMTAwQTMzMDJCMDA4MjIwMjE0MAorOjEwQTI0MDAwMDA4NjIwMjFBRUU0MDBDMEFFRTUwMEM0QUY4ODAwQzg5RgorOjEwQTI1MDAwQUY4NzAwRTQwODAwM0M1QkFGODcwMEU4M0MwMjAwMDFFOAorOjEwQTI2MDAwMDA1NzEwMjE5MDQyODNDMDEwNDAwMDBCMDAwMDAwMDBGNgorOjEwQTI3MDAwM0MxMzAwMDEwMjc3OTgyMThFNzM4M0M0M0MxMDAwMDFDNworOjEwQTI4MDAwMDIxNzgwMjE4RTEwODNDODNDMTIwMDAxMDI1NzkwMjFEMgorOjEwQTI5MDAwMDgwMDNBNTk4RTUyODNDQzhGODMwMEUwOEY4MjAwRTQwRAorOjEwQTJBMDAwMTA0MzAwMDcwMDAwMzgyMThGODIwMEU0MjQwNzAwMDFEQQorOjEwQTJCMDAwOEM0MzAwMDA4QzQ0MDAwNEFGQTMwMDE4QUZBNDAwMUMyMgorOjEwQTJDMDAwMTRFMDAwMEUzQzAyRkZGRjhGODIwMEM0QUZBMjAwMTAxQQorOjEwQTJEMDAwOEY4MjAwQzgzQzA0MDAwMTI0ODQ1OEI0QUZBMjAwMTQ0QgorOjEwQTJFMDAwOEY4NjAwRTA4Rjg3MDBFNDNDMDUwMDA2MEMwMDI0MDMwNQorOjEwQTJGMDAwMzRBNUYyMDAwODAwM0M1QjAwMDAwMDAwOEZBMzAwMUNBNgorOjEwQTMwMDAwOEZCMjAwMTgzMDczRkZGRjI2NzNGRkZDMDA2MjEwMjQyOQorOjEwQTMxMDAwMTA0MDAwNTgwMjQwODAyMTNDMDIwMDgwMDA2MjEwMjQ1RQorOjEwQTMyMDAwMTA0MDAwMEEzQzA0MDA0MDhFRTIwMDdDMjQ0MjAwMDEwMAorOjEwQTMzMDAwQUVFMjAwN0M4RUUyMDA3QzhFRTIwMUZDMjQ0MjAwMDE1MQorOjEwQTM0MDAwQUVFMjAxRkMwODAwM0M1NThFRTIwMUZDM0MwNjAwMDQzNAorOjEwQTM1MDAwM0MwQjAwMDEzQzBBMDAwMjNDMDUwMDEwM0MwOTAwMDhDRgorOjEwQTM2MDAwOEVFMjAwODAzQzA4MDAyMDM0MDc4MDAwMjQ0MjAwMDE3NworOjEwQTM3MDAwQUVFMjAwODA4RUUyMDA4MDhGQTIwMDFDMDA0NDE4MjQxMAorOjEwQTM4MDAwMTA2NjAwMjEwMEMzMTAyQjE0NDAwMDA3MDAwMDAwMDBERAorOjEwQTM5MDAwMTA2QjAwMTEwMDAwMDAwMDEwNkEwMDE1MDAwMDAwMDBBMgorOjEwQTNBMDAwMDgwMDM5MTYwMDA0MjA0MjEwNjUwMDIzMDBBMzEwMkI3QQorOjEwQTNCMDAwMTQ0MDAwMDUwMDAwMDAwMDEwNjkwMDE5MDAwMDAwMDBCMgorOjEwQTNDMDAwMDgwMDM5MTYwMDA0MjA0MjEwNjgwMDIxMDAwMDAwMDAzNworOjEwQTNEMDAwMDgwMDM5MTYwMDA0MjA0MjhFRTIwMDM0MjQ0MjAwMDFCNQorOjEwQTNFMDAwQUVFMjAwMzQ4RUUyMDAzNDA4MDAzOTE2MDAwNDIwNDI0OAorOjEwQTNGMDAwOEVFMjAxRUMyNDQyMDAwMUFFRTIwMUVDOEVFMjAxRUNCRgorOjEwQTQwMDAwMDgwMDM5MTYwMDA0MjA0MjhFRTIwMUYwMjQ0MjAwMDFDNworOjEwQTQxMDAwQUVFMjAxRjA4RUUyMDFGMDA4MDAzOTE2MDAwNDIwNDI5RAorOjEwQTQyMDAwOEVFMjAxRjQyNDQyMDAwMUFFRTIwMUY0OEVFMjAxRjQ3NgorOjEwQTQzMDAwMDgwMDM5MTYwMDA0MjA0MjhFRTIwMDMwMjQ0MjAwMDE1OAorOjEwQTQ0MDAwQUVFMjAwMzA4RUUyMDAzMDA4MDAzOTE2MDAwNDIwNDJFRgorOjEwQTQ1MDAwOEVFMjAxRjgyNDQyMDAwMUFFRTIwMUY4OEVFMjAxRjgzQQorOjEwQTQ2MDAwMDAwNDIwNDIxMDg3MDMzRTAwMDAwMDAwMDgwMDM4REI5MworOjEwQTQ3MDAwMDAwMDAwMDAzQzAyMDAwMTAwNTcxMDIxOTA0MjgzQjIwRQorOjEwQTQ4MDAwMTQ0MDAwODQyNDAyMDAwMTNDMDMwMDAxMDA3NzE4MjFERAorOjEwQTQ5MDAwOTA2MzgzQjMxNDYyMDA3RjNDMDIwMTAwOEU0MzAwMDA4RQorOjEwQTRBMDAwMDA2MjEwMjQxMDQwMDA2RjI0MDJGRkZGMTQ2MjAwMDVCOAorOjEwQTRCMDAwMjQxMTAwMDE5NjQzMDAwNDM0MDJGRkZGMTA2MjAwNzU2RQorOjEwQTRDMDAwMDAwMDAwMDA5MkUyMDREODE0NDAwMDcyMDAwMDAwMDA3NgorOjEwQTREMDAwM0MwMjAwMDEwMDU3MTAyMThDNDI4M0I0Mjg0MjAwMDU0MQorOjEwQTRFMDAwMTA0MDAwMjAwMDAwMzgyMTNDMDIwMDAxMDA1NzEwMjFEQworOjEwQTRGMDAwOEM0MjgzQjQxODQwMDAxNjAwMDAyODIxOTYwNjAwMDAwNAorOjEwQTUwMDAwMDAwNTIwQzAwMDk3MTAyMTk0NDI3NzdFMTQ0NjAwMDk3MAorOjEwQTUxMDAwMDA5NzEwMjE5NDQzNzc4MDk2MDIwMDAyMTQ2MjAwMDU5MAorOjEwQTUyMDAwMDA5NzEwMjE5NDQzNzc4Mjk2MDIwMDA0NTA2MjAwMDgzRAorOjEwQTUzMDAwMjQwNzAwMDEzQzAyMDAwMTAwNTcxMDIxOEM0MjgzQjQyMworOjEwQTU0MDAwMjRBNTAwMDEwMEEyMTAyQTU0NDBGRkVFMDAwNTIwQzBGRgorOjEwQTU1MDAwMzBFMjAwRkYxMDQwMDMwMjAwMDAwMDAwMDgwMDM5QTJCMgorOjEwQTU2MDAwMDAwMDAwMDAwMjQwMjAyMTBDMDAyMkZFMjQwNTAwMDYwRAorOjEwQTU3MDAwMzA0NDAwMUYwMDA0MjhDMDAyRTUxMDIxOTQ0MjcyN0M4MAorOjEwQTU4MDAwMzA0MjQwMDAxNDQwMDJGNjAwQjcxMDIxOTQ0MzcyN0UxRQorOjEwQTU5MDAwOTYwMjAwMDAxNDYyMDAwQjAwMDQxOEMwMDBCNzEwMjFERQorOjEwQTVBMDAwOTQ0MzcyODA5NjAyMDAwMjE0NjIwMDA2MDAwNDE4QzBGMAorOjEwQTVCMDAwMDBCNzEwMjE5NDQzNzI4Mjk2MDIwMDA0MTA2MjAwMzVBNQorOjEwQTVDMDAwMDAwNDE4QzAwMkUzMTAyMTk0NDI3MjdDMzA0MjgwMDBFMworOjEwQTVEMDAwMTQ0MDAyRTMwMkUzMTAyMTk0NEQ3MjdDOTYwNzAwMDBDMAorOjEwQTVFMDAwMDAwRDI4QzAwMEI3MTAyMTk0NDI3MzdFMDgwMDM5ODQwMgorOjEwQTVGMDAwMDAwMDMwMjEwMDA0MjBDMDAyRTQxMDIxOTQ0MzczN0M0OQorOjEwQTYwMDAwMDJFNDEwMjE5NDRENzM3QzMwNjM4MDAwMTQ2MDAwMTBDQworOjEwQTYxMDAwMDAwRDI4QzAwMEI3MTAyMTk0NDI3MzdFMTQ0N0ZGRjU0NworOjEwQTYyMDAwMDFBMDIwMjEwMEI3MTAyMTk0NDM3MzgwOTYwMjAwMDJGQworOjEwQTYzMDAwNTQ2MkZGRjEwMDA0MjBDMDAwQjcxMDIxOTQ0MzczODJEQworOjEwQTY0MDAwOTYwMjAwMDQ1NDYyRkZFQzAwMDQyMEMwMjQwNjAwMDFCRQorOjEwQTY1MDAwMzBDMjAwRkYxMDQwMDJDMjAwMDAwMDAwMDgwMDM5QTIxMgorOjEwQTY2MDAwMDAwMDAwMDA5NzQzMDIwMjk2NDIwMDAwMTQ2MjAyQkMwMAorOjEwQTY3MDAwMDAwMDAwMDA5NzQzMDIwNDk2NDIwMDAyMTQ2MjAyQjhGMAorOjEwQTY4MDAwMDAwMDAwMDA5NzQzMDIwNjk2NDIwMDA0MTQ2MjAyQjRFMAorOjEwQTY5MDAwMDAwMDAwMDA5MjQyMDAwMDNBMjMwMDAxMzA0MjAwMDExNQorOjEwQTZBMDAwMDA0MzEwMjQxMDQwMDA3NDI0MDJGRkZGOEUwMzAwMDBCQQorOjEwQTZCMDAwMTQ2MjAwMDQzNDAyRkZGRjk2MDMwMDA0MTA2MjAwNkY2RQorOjEwQTZDMDAwMjQxNTAwMDIzQzAyMDAwMTAwNTcxMDIxOTA0MjgzQjI4MQorOjEwQTZEMDAwMTQ0MDAwNkEyNDE1MDAwMzkyRTIwNEQ4MTQ0MDAwNjc3NQorOjEwQTZFMDAwMDAwMDAwMDAzQzAyMDAwMTAwNTcxMDIxOEM0MjgzQjQ5RQorOjEwQTZGMDAwMjg0MjAwMDUxMDQwMDAyMDAwMDAzODIxM0MwMjAwMDFFMworOjEwQTcwMDAwMDA1NzEwMjE4QzQyODNCNDE4NDAwMDE2MDAwMDI4MjEwNQorOjEwQTcxMDAwOTYwNjAwMDAwMDA1MjBDMDAwOTcxMDIxOTQ0Mjc3N0UyNQorOjEwQTcyMDAwMTQ0NjAwMDkwMDk3MTAyMTk0NDM3NzgwOTYwMjAwMDI5NgorOjEwQTczMDAwMTQ2MjAwMDUwMDk3MTAyMTk0NDM3NzgyOTYwMjAwMDQ2QQorOjEwQTc0MDAwNTA2MjAwMDgyNDA3MDAwMTNDMDIwMDAxMDA1NzEwMjE1QworOjEwQTc1MDAwOEM0MjgzQjQyNEE1MDAwMTAwQTIxMDJBNTQ0MEZGRUVDRAorOjEwQTc2MDAwMDAwNTIwQzAzMEUyMDBGRjE0NDAwMDQ0MjQxNTAwMDMxRgorOjEwQTc3MDAwMDgwMDNDNTUwMDAwMDAwMDAyNDAyMDIxMEMwMDIyRkU5MQorOjEwQTc4MDAwMjQwNTAwMDYzMDQ0MDAxRjAwMDQyOEMwMDJFNTEwMjEwMworOjEwQTc5MDAwOTQ0MjcyN0MzMDQyNDAwMDE0NDAwMjcxMDBCNzEwMjE5NAorOjEwQTdBMDAwOTQ0MzcyN0U5NjAyMDAwMDE0NjIwMDBCMDAwNDE4QzBFRAorOjEwQTdCMDAwMDBCNzEwMjE5NDQzNzI4MDk2MDIwMDAyMTQ2MjAwMDZEMgorOjEwQTdDMDAwMDAwNDE4QzAwMEI3MTAyMTk0NDM3MjgyOTYwMjAwMDQ1RQorOjEwQTdEMDAwMTA2MjAwMjcwMDA0MThDMDAyRTMxMDIxOTQ0MjcyN0MyQQorOjEwQTdFMDAwMzA0MjgwMDAxNDQwMDI1RTAyRTMxMDIxOTQ0RDcyN0NERQorOjEwQTdGMDAwOTYwNzAwMDAwMDBEMjhDMDAwQjcxMDIxOTQ0MjczN0UxOAorOjEwQTgwMDAwMDgwMDNBMDkwMDAwMzAyMTAwMDQyMEMwMDJFNDEwMjFCMQorOjEwQTgxMDAwOTQ0MzczN0MwMkU0MTAyMTk0NEQ3MzdDMzA2MzgwMDA3OAorOjEwQTgyMDAwMTQ2MDAwMTAwMDBEMjhDMDAwQjcxMDIxOTQ0MjczN0UwMAorOjEwQTgzMDAwMTQ0N0ZGRjUwMUEwMjAyMTAwQjcxMDIxOTQ0MzczODAzNQorOjEwQTg0MDAwOTYwMjAwMDI1NDYyRkZGMTAwMDQyMEMwMDBCNzEwMjFGQworOjEwQTg1MDAwOTQ0MzczODI5NjAyMDAwNDU0NjJGRkVDMDAwNDIwQzAwQgorOjEwQTg2MDAwMjQwNjAwMDEzMEMyMDBGRjEwNDAwMjNEMDAwMDAwMDAzRAorOjEwQTg3MDAwMDgwMDNBMUMyNDE1MDAwMzI0MTUwMDAxOEY0MjAyNjBEMQorOjEwQTg4MDAwMDA1MzEwMkIxMDQwMDAzNjAwMDAwMDAwOEY4MzAwRTRCRQorOjEwQTg5MDAwOEY4MjAwRTAxMDYyMDAwMzI0NjMwMDA4QUY4MzAwRTRBRAorOjEwQThBMDAwQUY4MzAwRTg4RUU0MDBDMDhFRTUwMEM0MDI2MDE4MjE4QQorOjEwQThCMDAwMDAwMDEwMjEwMEEzMjgyMTAwQTMzMDJCMDA4MjIwMjFCQQorOjEwQThDMDAwMDA4NjIwMjFBRUU0MDBDMEFFRTUwMEM0OEVFMjAwNTg1MAorOjEwQThEMDAwMjQ0MjAwMDFBRUUyMDA1ODhFRTIwMDU4OEVFMjAwN0M3NQorOjEwQThFMDAwMjQ0MjAwMDFBRUUyMDA3QzhFRTIwMDdDOEY4MjAwRTAxOAorOjEwQThGMDAwQUZBMjAwMTA4RjgyMDBFNDNDMDQwMDAxMjQ4NDU4QzAwMQorOjEwQTkwMDAwQUZBMjAwMTQ4RkE2MDAxODhGQTcwMDFDM0MwNTAwMDZGQworOjEwQTkxMDAwMEMwMDI0MDMzNEE1RjIwMzA4MDAzQzVCMDAwMDAwMDA5NworOjEwQTkyMDAwOEVFMjUyNDBBRkEyMDAxMDhFRTI1MjQ0M0MwNDAwMDE3RAorOjEwQTkzMDAwMjQ4NDU4Q0NBRkEyMDAxNDhFRTYwRTEwOEVFNzBFMThCOQorOjEwQTk0MDAwM0MwNTAwMDYwQzAwMjQwMzM0QTVGMjAyOEVFMjAxQzA4RgorOjEwQTk1MDAwMjQ0MjAwMDFBRUUyMDFDMDA4MDAzQzAyOEVFMjAxQzBDOAorOjEwQTk2MDAwOTZFMjA0NjgwMDUzMTAyQjU0NDAwMDAxM0MxNjgwMDAwRQorOjEwQTk3MDAwMTI2MDAxQ0IzQzBFMDAxRjM1Q0VGRkZGM0MwRkZGRjVGMAorOjEwQTk4MDAwMzVFRjEwMDAyNDFFMDA0MDhFRTI3MjRDOEY0MzAyODA4RgorOjEwQTk5MDAwMjQ0MjAwMDEzMDQyMDdGRjEwNjIwMTlFMDAwMDAwMDBDNworOjEwQTlBMDAwMTJDMDAwMTIwMDAwMDAwMDhFRTM1MjQwOEVFMjUyNDRCQQorOjEwQTlCMDAwMTA2MjAwMEEyNkY4NTI0NDhFRjQ1MjQ0QUZCODAwMjRDNAorOjEwQTlDMDAwOEVFMzUyNDQwMDAyMTE0MDI0NDI1MjQ4MDJFMjg4MjFBMAorOjEwQTlEMDAwMjQ2MzAwMDEwODAwM0E4NTMwNkQwMEZGOEVFMjAxRTAzQgorOjEwQTlFMDAwMjQ0MjAwMDFBRUUyMDFFMDhFRTIwMUUwOEVFMzBFMTBBRgorOjEwQTlGMDAwOEVFMjBFMTgxMDYyRkZDQTI2RjgwRTE4OEVGNDBFMTg5QQorOjEwQUEwMDAwMDAwMEIwMjFBRkI4MDAyNDhFRTMwRTE4MDAwMjExNDAwMAorOjEwQUExMDAwMjQ0MjBFMjAwMkUyODgyMTI0NjMwMDAxMzA2RDAxRkZGMAorOjEwQUEyMDAwOTZFMjA0NkEzMDQyMDAxMDEwNDAwMDE4MzQwMjgxMDA5RgorOjEwQUEzMDAwOTY0MzAwMEMxNDYyMDAxNTAwMDAwMDAwM0MwMjAwMDE2NworOjEwQUE0MDAwMDA1NzEwMjE5MDQyODNDMDE0NDAwMDEwMDAwMDAwMDAwNQorOjEwQUE1MDAwOTY0MjAwMEVBNjIyMDAxNjhFNDIwMDA4OEU0MzAwMDQ4NQorOjEwQUE2MDAwOEU0NDAwMDAyNjczRkZGQ0FFNDIwMDBDQUU0MzAwMDg4QgorOjEwQUE3MDAwQUU0NDAwMDQ5NjIyMDAwRTI2MTAwMDA0MjQxODAwMDFBMworOjEwQUE4MDAwQTNCODAwMkYzNDQyMDIwMEE2MjIwMDBFOEUyMjAwMDAzRQorOjEwQUE5MDAwOEUyMzAwMDQzQzA0MDAwMTM0ODQzODAwMDIwMDMwMjE3RAorOjEwQUFBMDAwMzA2QTAwMDcwMjBBODAyMzAzNjQxMDIxMDIwMjEwMkI3RgorOjEwQUFCMDAwMTA0MDAwMDUwMjZBOTgyMTAyMDQxMDIzMDM2MjE4MjM0MworOjEwQUFDMDAwM0MwMjAwMjAwMDQzODAyMzI2NjIwMDA3OTYyMzAwMEFGMAorOjEwQUFEMDAwMjQxOEZGRjgwMDU4QzgyNDAwNkExODIxMDA3OTEwMkJBOAorOjEwQUFFMDAwMTA0MDAwMDIwMzIwNjAyMTAwNjA2MDIxMDE4MDE4MjFENQorOjEwQUFGMDAwMjQ2MjAwMDcyNDE4RkZGODAwNTg2MDI0MDI2QzEwMkIxMQorOjEwQUIwMDAwMTQ0MDAwMDQwMTkzMjgyMzAxODMyODIzMDgwMDNBQzMzQQorOjEwQUIxMDAwMDBDMzEwMjEwMEQzMTAyMTAwNEEyMDIzMDFDNDEwMkJCMAorOjEwQUIyMDAwNTQ0MDAwMDEwMDhGMjAyMTI1NDIwMDQwMDA0QzEwMkI5MgorOjEwQUIzMDAwMTQ0MDAwMzUwMDAwNTgyMTk0QzMwMDBDMjQwMjA4MDA4MgorOjEwQUI0MDAwNTQ2MjAwMzJBRTI2MDAxODNDMDIwMDAxMDA1NzEwMjE2QQorOjEwQUI1MDAwOTA0MjgzQzA1NDQwMDAyREFFMjYwMDE4MjRDMjAwMTczNgorOjEwQUI2MDAwMDFDMjEwMkIxMDQwMDAxMzAwMDAwMDAwM0MwMkZGRjU1MgorOjEwQUI3MDAwMDA0NjEwMjE5MDQyMTAxNzM4NDMwMDA2MkM2MzAwMDE1NAorOjEwQUI4MDAwMzg0MjAwMTEyQzQyMDAwMTAwNjIxODI1MTA2MDAwMTRBOAorOjEwQUI5MDAwMjRDMjAwMTAwMUMyMTAyQjEwNDAwMDBFMDAwMDAwMDA2MworOjEwQUJBMDAwM0MwQkZGRjUwMTY2NTgyMTk1NkIxMDEwMDgwMDNBRjQzNAorOjEwQUJCMDAwMjU2MjAwMEU5MEMyMDAxNzM4NDMwMDA2MkM2MzAwMDE4NgorOjEwQUJDMDAwMzg0MjAwMTEyQzQyMDAwMTAwNjIxODI1MTA2MDAwMDU3NworOjEwQUJEMDAwMDE2MDE4MjE5NENCMDAxMDI1NjIwMDBFMDA0QTU4MjExNAorOjEwQUJFMDAwMDE2MDE4MjEyNDYyMDAwNzI0MThGRkY4MDA1ODU4MjQzNworOjEwQUJGMDAwMDBDMzEwMjEwMDRBMjAyMzAxQzQxMDJCMTA0MDAwMDI4MgorOjEwQUMwMDAwMDE2MzI4MjMwMDhGMjAyMUFFMjYwMDE4M0MwMjAwMDE5QQorOjEwQUMxMDAwMDA1NzEwMjE5MDQyODNDMDAwMDIxMDJCMDAwMjE2QzA4MgorOjEwQUMyMDAwMTU2MDAwMDJBRkEyMDA0NDAxODA1ODIxMzA4MjAwMDE2QgorOjEwQUMzMDAwMTA0MDAwMDcwMDAwNDAyMTkwODgwMDAwMjQ4NDAwMDE5QgorOjEwQUM0MDAwMDFDNDEwMkIxMDQwMDAwMjI0QTVGRkZGMDA4RjIwMjExQgorOjEwQUM1MDAwNTBBMDAwMTIwMDA4MUMwMjJDQTIwMDAyNTQ0MDAwMDk1RgorOjEwQUM2MDAwMjRBNUZGRkY5NDgyMDAwMDI0ODQwMDAyMDEwMjQwMjFGOQorOjEwQUM3MDAwMDFDNDEwMkIxMDQwMDAwNjI0QTVGRkZFMDgwMDNCMjE1NAorOjEwQUM4MDAwMDA4RjIwMjE5MDgyMDAwMDAwMDIxMjAwMDEwMjQwMjE2QQorOjEwQUM5MDAwMTRBMEZGRjIyQ0EyMDAwMjAwMDgxQzAyMzEwMkZGRkZFOAorOjEwQUNBMDAwMDA2MjQwMjEzMTA4RkZGRjAxNDAyODIxMTE0MDAwMTFCRQorOjEwQUNCMDAwMDIwMDIwMjEyQ0EyMDAwMjU0NDAwMDA5MjRBNUZGRkYxRAorOjEwQUNDMDAwOTQ4MjAwMDAyNDg0MDAwMjAxMDI0MDIxMDFDNDEwMkI2MAorOjEwQUNEMDAwMTA0MDAwMDYyNEE1RkZGRTA4MDAzQjM4MDA4RjIwMjEwRAorOjEwQUNFMDAwOTA4MjAwMDAwMDAyMTIwMDAxMDI0MDIxMTRBMEZGRjIzNQorOjEwQUNGMDAwMkNBMjAwMDIwMDA4MUMwMjMxMDJGRkZGMDA2MjQwMjE2QQorOjEwQUQwMDAwMDAwODFDMDIzMTAyRkZGRjhGODkwMTIwMDA2MjQwMjFGMAorOjEwQUQxMDAwMjc2MjM4MDAyNTIzMDAyMDAwNjIxMDJCMTQ0MDAwMDIxNworOjEwQUQyMDAwMzEwOEZGRkYyNzYzMzAwMDhGODIwMTI4MTA2MjAwMDQ4MgorOjEwQUQzMDAwMDAwMDAwMDA4RjgyMDEyNDE0NjIwMDA3MDE0MDI4MjFENgorOjEwQUQ0MDAwOEVFMjAxQTQwMDAwMzgyMTI0NDIwMDAxQUVFMjAxQTRGOQorOjEwQUQ1MDAwMDgwMDNCQzk4RUUyMDFBNDhFMjYwMDAwOEUyNzAwMDQ2NQorOjEwQUQ2MDAwMDAwODE0MDAzNDQ4MDAwQkFEMzAwMDA4QTUyQjAwMEU3RAorOjEwQUQ3MDAwQUQyODAwMTg4RkI4MDA0NDAwMDAyMDIxMDI5NjEwMjU0RAorOjEwQUQ4MDAwMDA1ODEwMjVBRDIyMDAxQzAwRTUxMDJCMDBFNTM4MjNFQgorOjEwQUQ5MDAwMDBDNDMwMjMwMEMyMzAyM0FEMjYwMDAwQUQyNzAwMDREQworOjEwQURBMDAwOEVFMjA0QzBBRDIyMDAxMEFGODMwMTIwOTJFMjRFMjA1QgorOjEwQURCMDAwMTQ0MDAwNUYyNDA3MDAwMTI1MDJGRkVFMkM0MjAwMDIzMAorOjEwQURDMDAwMTQ0MDAwMDMyNDAyMDAxMTE1MDIwMDI0MDAwMDAwMDBCQQorOjEwQUREMDAwOEVFMjRFMzAwMDAyMTBDMDI0NDI1MDM4MDJFMjIwMjFBMAorOjEwQURFMDAwOEM4MzAwMDAyNDAyMDAxMjE0NjIwMDBGMDAwMDAwMDA5NworOjEwQURGMDAwOEVFMzRFMzA4RUUyNEUzNDEwNjIwMDBCMDAwMDAwMDBGNQorOjEwQUUwMDAwOEM4MjAwMDQyNDQyMDAwMUFDODIwMDA0OEVFMjRFMzRBNQorOjEwQUUxMDAwOEVFMzRFMzAyNDQyMDAwMTEwNUUwMDJBMDAwMDAwMDA0NAorOjEwQUUyMDAwMDgwMDNCQTgwMDAwMDAwMDhFRTI0RTMwMjQ0MjAwMDFFMgorOjEwQUUzMDAwNTA1RTAwMDMwMDAwMTAyMThFRTI0RTMwMjQ0MjAwMDFEQgorOjEwQUU0MDAwQUVFMjRFMzA4RUUyNEUzMDAwMDIxMEMwMjQ0MjUwMzg0NgorOjEwQUU1MDAwMDJFMjIwMjEwODAwM0JDNjI0MDIwMDEyOEVFMjRFMzA5RQorOjEwQUU2MDAwMDAwMjEwQzAyNDQyNTAzODAyRTIyMDIxOEM4MzAwMDBFRQorOjEwQUU3MDAwMjQwMjAwMDcxNDYyMDAxRjAwMDAwMDAwOEVFMzRFMzAyMQorOjEwQUU4MDAwOEVFMjRFMzQxMDYyMDAxQjAwMDAwMDAwOEM4MjAwMDQzMQorOjEwQUU5MDAwMjQ0MjAwMDFBQzgyMDAwNDhFRTI0RTM0OEVFMzRFMzAzOAorOjEwQUVBMDAwMjQ0MjAwMDExMDVFMDAwNzAwMDAwMDAwOEVFMjRFMzRENAorOjEwQUVCMDAwMjQ0MjAwMDExMDYyMDAwNTAwMDAwMDAwMDgwMDNCQjRCRAorOjEwQUVDMDAwMDAwMDAwMDAxNDYwMDAwNTAwMDAwMDAwOEY4MjAxMjhDRgorOjEwQUVEMDAwMjQ0MjAwMjBBRjgyMDEyODhGODIwMTI4OEM4MjAwMDQ0NgorOjEwQUVFMDAwMkM0MjAwMTE1MDQwMDAxMkFDODAwMDAwMDgwMDNCQzkwOQorOjEwQUVGMDAwMDAwMDAwMDA4RUUyNEUzMDI0NDIwMDAxNTA1RTAwMDM0QworOjEwQUYwMDAwMDAwMDEwMjE4RUUyNEUzMDI0NDIwMDAxQUVFMjRFMzBBRAorOjEwQUYxMDAwOEVFMjRFMzAwMDAyMTBDMDI0NDI1MDM4MDJFMjIwMjE1RQorOjEwQUYyMDAwMjQwMjAwMDdBQzgyMDAwMDI0MDIwMDAxQUM4MjAwMDQ2RAorOjEwQUYzMDAwMTRFMDAwMTkzQzA1MDAwNjNDMDQwMDAxMjQ4NDU4OTBFQworOjEwQUY0MDAwOEUyMjAwMTgzNEE1RjIwOUFGQTIwMDEwOEUyMjAwMDA1NAorOjEwQUY1MDAwOEUyMzAwMDQwMjIwMzAyMTAxNjAzODIxMEMwMDI0MDNEQworOjEwQUY2MDAwQUZBMzAwMTQ5M0EyMDAyRjEwNDAwMDJBMzQwMjgxMDBFNgorOjEwQUY3MDAwOEU0MzAwMDQ4RTQ0MDAwODhFNDUwMDBDQTY0MjAwMEM0RgorOjEwQUY4MDAwQUU0MzAwMDBBRTQ0MDAwNEFFNDUwMDA4OTYyMjAwMTYxMQorOjEwQUY5MDAwMDgwMDNDMDJBNjQyMDAwRTE1OTkwMDBBMDI2QTE4MjMxNgorOjEwQUZBMDAwOTYyMjAwMEVBNjIzMDAwQTM0NDIwMDA0QTYyMjAwMEVCOAorOjEwQUZCMDAwM0MwMTAwMDEwMDM3MDgyMUEwMjA4M0MwMDgwMDNCRkZBRQorOjEwQUZDMDAwMDAwMDk4MjE5NjI0MDAwQTAwODMxMDJCNTQ0MDAwMDFCMQorOjEwQUZEMDAwMDA4MDE4MjEyNDAyMDAwMUE2MjMwMDBBM0MwMTAwMDE4MAorOjEwQUZFMDAwMDAzNzA4MjFBMDIyODNDMDk2MjIwMDBBMDA0QTE4MjFCNworOjEwQUZGMDAwMDIwMzgwMjEwMUQwMTAyQjU0NDAwMDAxMDIwRjgwMjE1OAorOjEwQjAwMDAwMDI2Mzk4MjMwMDAwQjAyMThGQjgwMDI0MTY2MEZFNUUxMgorOjEwQjAxMDAwQUYwRDAwMDAxMjYwMDAyMjAwMDAwMDAwM0MwMTAwMDFBMgorOjEwQjAyMDAwMDAzNzA4MjFBQzMzODNDNDNDMDEwMDAxMDAzNzA4MjFGQworOjEwQjAzMDAwQUMzMDgzQzgzQzAxMDAwMTAwMzcwODIxQUMzMjgzQ0MxRQorOjEwQjA0MDAwOTNBMjAwMkYxMDQwMDAwODAwMDAwMDAwM0MwMjAwMDEwNQorOjEwQjA1MDAwMDA1NzEwMjE4QzQyODNDQzI0NDIwMDA0M0MwMTAwMDFBMworOjEwQjA2MDAwMDAzNzA4MjFBQzIyODNDQzhGNDMwMjgwOEVFMjcyNENFMQorOjEwQjA3MDAwMTQ2MjAwMDYwMDAwMDAwMDhFRTIwMUM0MjQ0MjAwMDFCOAorOjEwQjA4MDAwQUVFMjAxQzQwODAwM0M1QjhFRTIwMUM0OEVFMjAxQkM2QQorOjEwQjA5MDAwMjQ0MjAwMDFBRUUyMDFCQzA4MDAzQzVCOEVFMjAxQkMzMAorOjEwQjBBMDAwOTdBNDAwMUUyNDg0RkZGQzAwODAxODIxOEVFNDAwQzBCOQorOjEwQjBCMDAwOEVFNTAwQzQwMDAwMTAyMTAwQTMyODIxMDBBMzMwMkIzRQorOjEwQjBDMDAwMDA4MjIwMjEwMDg2MjAyMTI0MDIwMDAyQUVFNDAwQzA3QworOjEwQjBEMDAwQUVFNTAwQzQxMkEyMDAwRjJBQTIwMDAzMTQ0MDAwMTcxQworOjEwQjBFMDAwMjQwMjAwMDMxNkEyMDAxNTAwMDAwMDAwOEVFMjAwRDAyQQorOjEwQjBGMDAwOEVFMzAwRDQyNDYzMDAwMTJDNjQwMDAxMDA0NDEwMjE3RAorOjEwQjEwMDAwQUVFMjAwRDBBRUUzMDBENDhFRTIwMEQwMDgwMDNDNTVBMQorOjEwQjExMDAwOEVFMzAwRDQ4RUUyMDBEODhFRTMwMERDMjQ2MzAwMDFDRAorOjEwQjEyMDAwMkM2NDAwMDEwMDQ0MTAyMUFFRTIwMEQ4QUVFMzAwREM0NAorOjEwQjEzMDAwOEVFMjAwRDgwODAwM0M1NThFRTMwMERDOEVFMjAwQzhBOQorOjEwQjE0MDAwOEVFMzAwQ0MyNDYzMDAwMTJDNjQwMDAxMDA0NDEwMjEzNAorOjEwQjE1MDAwQUVFMjAwQzhBRUUzMDBDQzhFRTIwMEM4OEVFMzAwQ0NDNQorOjEwQjE2MDAwOEY4MzAwRTQ4RjgyMDBFMDEwNjIwMDAzMjQ2MzAwMDhGNAorOjEwQjE3MDAwQUY4MzAwRTRBRjgzMDBFODhGQkYwMDY4OEZCRTAwNjQzOAorOjEwQjE4MDAwOEZCNjAwNjA4RkI1MDA1QzhGQjQwMDU4OEZCMzAwNTQ0OQorOjEwQjE5MDAwOEZCMjAwNTA4RkIxMDA0QzhGQjAwMDQ4MDNFMDAwMDgyMAorOjEwQjFBMDAwMjdCRDAwNzAyN0JERkZFMEFGQkYwMDE4OEVFMzBFMTQ2RgorOjEwQjFCMDAwOEVFMjBFMEMxMDYyMDA3NDAwMDAwMDAwOEVFMzBFMEM5NAorOjEwQjFDMDAwOEVFMjBFMTQwMDYyMjAyMzA0ODIwMDAxMjQ4NDAyMDAxNworOjEwQjFEMDAwOEVFMzBFMTg4RUUyMEUxNDAwNDMxMDJCMTQ0MDAwMDQ3MAorOjEwQjFFMDAwMjQwMjAyMDA4RUUzMEUxNDA4MDAzQzdEMDA0MzE4MjM2NQorOjEwQjFGMDAwOEVFMjBFMTg4RUUzMEUxNDAwNDMxMDIzMjQ0M0ZGRkY0QgorOjEwQjIwMDAwMDA4MDQ4MjEwMDY5MTAyQTU0NDAwMDAxMDA2MDQ4MjE1NAorOjEwQjIxMDAwOEY4NzAxMDAyNzYyMzAwMDI0RTgwMDIwMDEwMjEwMkJGNAorOjEwQjIyMDAwNTA0MDAwMDEyNzY4MjgwMDhGODIwMTA4MTEwMjAwMDRBNQorOjEwQjIzMDAwMDAwMDAwMDA4RjgyMDEwNDE1MDIwMDA3MDAwMDEwMjFBOQorOjEwQjI0MDAwOEVFMjAxQTgwMDAwMjAyMTI0NDIwMDAxQUVFMjAxQTgwNAorOjEwQjI1MDAwMDgwMDNDQkY4RUUyMDFBODhFRTQwRTE0MDAwNDIxNDBEOQorOjEwQjI2MDAwMDA4MDE4MjE4RUU0MDQ2MDhFRTUwNDY0MDBBMzI4MjE4OAorOjEwQjI3MDAwMDBBMzMwMkIwMDgyMjAyMTAwODYyMDIxQUNFNDAwMDBCNgorOjEwQjI4MDAwQUNFNTAwMDQ4RUUzMEUxNDAwMDkxMTQwQTRFMjAwMEVBOAorOjEwQjI5MDAwMjQwMjAwMDJBQ0UyMDAxODAwMDMxOTQwMjQ2MzBFMjBDRgorOjEwQjJBMDAwMDJFMzEwMjFBQ0UyMDAwODhFRTIwRTE0QUNFMjAwMUNCNgorOjEwQjJCMDAwOEVFMjA0Q0NBQ0UyMDAxMEFGODgwMTAwOTJFMjA0RUMxNAorOjEwQjJDMDAwMTQ0MDAwMTEyNDA0MDAwMThFRTI0RTI4MjQwMzAwNDBBMworOjEwQjJEMDAwMjQ0MjAwMDE1MDQzMDAwMzAwMDAxMDIxOEVFMjRFMjg1QQorOjEwQjJFMDAwMjQ0MjAwMDFBRUUyNEUyODhFRTI0RTI4MDAwMjEwQzAzOQorOjEwQjJGMDAwMjQ0MjRFMzgwMkUyMTgyMTI0MDIwMDAyQUM2MjAwMDAwRgorOjEwQjMwMDAwMjQwMjAwMDFBQzYyMDAwNDE0ODAwMDBFMjQwMzAwNDBGQgorOjEwQjMxMDAwOEVFMjBFMTRBRkEyMDAxMDhFRTIwRTE4M0MwNTAwMDc1QworOjEwQjMyMDAwQUZBMjAwMTQ4RUU2MEUwQzhFRTcwRTEwM0MwNDAwMDE1NgorOjEwQjMzMDAwMjQ4NDU4RDQwQzAwMjQwMzM0QTVGMDAxMDgwMDNDREQxQgorOjEwQjM0MDAwMDAwMDAwMDA4RUUyMDUwMDI0NDIwMDAxNTA0MzAwMDM4QgorOjEwQjM1MDAwMDAwMDEwMjE4RUUyMDUwMDI0NDIwMDAxQUVFMjA1MDA0QgorOjEwQjM2MDAwOEVFMjA1MDAwMDAyMTA4MDAwNTcxMDIxQUM0OTA1MDg0QworOjEwQjM3MDAwOEVFMjBFMTQwMDQ5MTAyMTMwNDIwMUZGQUVFMjBFMTQ5RAorOjEwQjM4MDAwOEVFMzBFMTQ4RUUyMEUwQzE0NjIwMDA1MDAwMDAwMDAyNQorOjEwQjM5MDAwOEY4MjAwNjAyNDAzRkRGRjAwNDMxMDI0QUY4MjAwNjAxMQorOjEwQjNBMDAwOEZCRjAwMTgwM0UwMDAwODI3QkQwMDIwMjdCREZGRTA4NQorOjEwQjNCMDAwQUZCRjAwMTg4RUUzNTIzQzhFRTI1MjM4MTA2MjAwNzQyOAorOjEwQjNDMDAwMDAwMDAwMDA4RUUzNTIzODhFRTI1MjNDMDA2MjIwMjNERgorOjEwQjNEMDAwMDQ4MjAwMDEyNDg0MDEwMDhFRTM1MjQ0OEVFMjUyM0MzOAorOjEwQjNFMDAwMDA0MzEwMkIxNDQwMDAwNDI0MDIwMTAwOEVFMzUyM0M2MQorOjEwQjNGMDAwMDgwMDNDRkYwMDQzMTgyMzhFRTI1MjQ0OEVFMzUyM0M4NworOjEwQjQwMDAwMDA0MzEwMjMyNDQzRkZGRjAwODA0ODIxMDA2OTEwMkFENQorOjEwQjQxMDAwNTQ0MDAwMDEwMDYwNDgyMThGODcwMTAwMjc2MjMwMDBGRQorOjEwQjQyMDAwMjRFODAwMjAwMTAyMTAyQjUwNDAwMDAxMjc2ODI4MDA2QQorOjEwQjQzMDAwOEY4MjAxMDgxMTAyMDAwNDAwMDAwMDAwOEY4MjAxMDRDNQorOjEwQjQ0MDAwMTUwMjAwMDcwMDAwMTAyMThFRTIwMUE4MDAwMDIwMjE1MworOjEwQjQ1MDAwMjQ0MjAwMDFBRUUyMDFBODA4MDAzRDQxOEVFMjAxQThBRAorOjEwQjQ2MDAwOEVFNDUyM0MwMDA0MjE0MDAwODAxODIxOEVFNDA0NzBEOAorOjEwQjQ3MDAwOEVFNTA0NzQwMEEzMjgyMTAwQTMzMDJCMDA4MjIwMjEzNAorOjEwQjQ4MDAwMDA4NjIwMjFBQ0U0MDAwMEFDRTUwMDA0OEVFMzUyM0NEMQorOjEwQjQ5MDAwMDAwOTExNDBBNEUyMDAwRTI0MDIwMDAzQUNFMjAwMThFRgorOjEwQjRBMDAwMDAwMzE5NDAyNDYzNTI0ODAyRTMxMDIxQUNFMjAwMDg3MworOjEwQjRCMDAwOEVFMjUyM0NBQ0UyMDAxQzhFRTIwNENDQUNFMjAwMTAwNgorOjEwQjRDMDAwQUY4ODAxMDA5MkUyMDRFQzE0NDAwMDExMjQwNDAwMDE1MgorOjEwQjREMDAwOEVFMjRFMjgyNDAzMDA0MDI0NDIwMDAxNTA0MzAwMDMyMgorOjEwQjRFMDAwMDAwMDEwMjE4RUUyNEUyODI0NDIwMDAxQUVFMjRFMjhEOAorOjEwQjRGMDAwOEVFMjRFMjgwMDAyMTBDMDI0NDI0RTM4MDJFMjE4MjE4QgorOjEwQjUwMDAwMjQwMjAwMDNBQzYyMDAwMDI0MDIwMDAxQUM2MjAwMDRDQgorOjEwQjUxMDAwMTQ4MDAwMEUyNDAzMDA0MDhFRTI1MjNDQUZBMjAwMTBDMworOjEwQjUyMDAwOEVFMjUyNDQzQzA1MDAwN0FGQTIwMDE0OEVFNjUyMzg2QQorOjEwQjUzMDAwOEVFNzUyNDAzQzA0MDAwMTI0ODQ1OEUwMEMwMDI0MDNCMAorOjEwQjU0MDAwMzRBNUYwMTAwODAwM0Q1RjAwMDAwMDAwOEVFMjA1MDAwOQorOjEwQjU1MDAwMjQ0MjAwMDE1MDQzMDAwMzAwMDAxMDIxOEVFMjA1MDA0OAorOjEwQjU2MDAwMjQ0MjAwMDFBRUUyMDUwMDhFRTIwNTAwMDAwMjEwODBEOAorOjEwQjU3MDAwMDA1NzEwMjFBQzQ5MDUwODhFRTI1MjNDMDA0OTEwMjFDOQorOjEwQjU4MDAwMzA0MjAwRkZBRUUyNTIzQzhFRTM1MjNDOEVFMjUyMzgzMworOjEwQjU5MDAwMTQ2MjAwMDUwMDAwMDAwMDhGODIwMDYwMjQwM0ZFRkY5QgorOjEwQjVBMDAwMDA0MzEwMjRBRjgyMDA2MDhGQkYwMDE4MDNFMDAwMDg0MgorOjEwQjVCMDAwMjdCRDAwMjA4RjgyMDEyMDhFRTM0RTM0OEY4MjAxMjQyQworOjEwQjVDMDAwOEY4NjAxMjgyNDAyMDA0MDI0NjMwMDAxNTA2MjAwMDM5QQorOjEwQjVEMDAwMDAwMDEwMjE4RUUyNEUzNDI0NDIwMDAxQUVFMjRFMzRDRgorOjEwQjVFMDAwOEVFMjRFMzQ4RUU0NEUzNDhFRTM0RTMwMDAwMjEwQzBCNAorOjEwQjVGMDAwMjQ0MjUwMzgxNDgzMDAwNzAyRTIyODIxOEY4MjAxMjg1OAorOjEwQjYwMDAwMjQ0MjAwMjBBRjgyMDEyODhGODIwMTI4MDgwMDNEOTI0OQorOjEwQjYxMDAwQUNBMDAwMDA4RUUyNEUzNDI0MDMwMDQwMjQ0MjAwMDExRQorOjEwQjYyMDAwNTA0MzAwMDMwMDAwMTAyMThFRTI0RTM0MjQ0MjAwMDFGQQorOjEwQjYzMDAwMDAwMjEwQzAyNDQyNTAzODAyRTIyODIxOENBMjAwMDRFQgorOjEwQjY0MDAwOEY4MzAxMjgwMDAyMTE0MDAwNjIxODIxQUY4MzAxMjg3NgorOjEwQjY1MDAwQUNBMDAwMDA4Q0MyMDAxODI0NDNGRkZFMkM2MjAwMTIzNAorOjEwQjY2MDAwMTA0MDAwMDgwMDAzMTA4MDNDMDEwMDAxMDAyMjA4MjE2NgorOjEwQjY3MDAwOEMyMjU4RjAwMDQwMDAwODAwMDAwMDAwMjQwMjAwMDE2NQorOjEwQjY4MDAwQUVFMjRFMjQwM0UwMDAwODAwMDAwMDAwMjdCREZGQzgyMgorOjEwQjY5MDAwQUZCRjAwMzBBRkI1MDAyQ0FGQjQwMDI4QUZCMzAwMjQ2QgorOjEwQjZBMDAwQUZCMjAwMjBBRkIxMDAxQ0FGQjAwMDE4OEY4MzAxMjhFQgorOjEwQjZCMDAwOEY4MjAxMjQxMDYyMDJCMDAwMDA5ODIxM0MxMTAwMUYwQgorOjEwQjZDMDAwMzYzMUZGRkYzQzEyRkZGNTM2NTIxMDAwMjQxNTAwMTJGMAorOjEwQjZEMDAwMjQxNDAwNDA4RjhDMDEyODhGODIwMTI4MjQ0MjAwMjBFRQorOjEwQjZFMDAwQUY4MjAxMjg5MTgyMDAxQjhGODMwMTI4MjQ0M0ZGRkUzMworOjEwQjZGMDAwMkM2MjAwMTIxMDQwMDI5QzAwMDMxMDgwM0MwMTAwMDFFQgorOjEwQjcwMDAwMDAyMjA4MjE4QzIyNTk0ODAwNDAwMDA4MDAwMDAwMDA1NworOjEwQjcxMDAwOEY0MjAyMTgzMDQyMDEwMDEwNDAwMDA3MDAwMDAwMDA3NAorOjEwQjcyMDAwOTU4MzAwMTY5NTgyMDAxODAwNjIxODIzMDAwMzE0MDIwNgorOjEwQjczMDAwMDA0MzEwMjFBNTgyMDAxNjhEODIwMDFDM0MwMzgwMDA2RQorOjEwQjc0MDAwMzA0NEZGRkYwMDQzNjgyNDNDMDMwODAwMDA0MzE4MjRGMgorOjEwQjc1MDAwMTFBMDAwMDRBRDg0MDAxQzAwMDQxMTQwMDgwMDNERDg3NQorOjEwQjc2MDAwMjQ0MjUyNDgwMDA0MTE0MDI0NDIwRTIwMDJFMjU4MjE5MworOjEwQjc3MDAwOTU2MjAwMEUzMDQyRkZGQzEwNjAwMDA0QTU2MjAwMEVDRQorOjEwQjc4MDAwOTU4NDAwMTYwODAwM0VDMDAwMDAwMDAwOEQ2OTAwMTg3NgorOjEwQjc5MDAwMDAwMDQwMjE5NTJBMDAwMDI1MjkwMDAyOTUyNzAwMDA3RAorOjEwQjdBMDAwMjUyOTAwMDI5NTI2MDAwMDI1MjkwMDAyOTUyNTAwMDA4NAorOjEwQjdCMDAwMjUyOTAwMDI5NTI0MDAwMDI1MjkwMDAyOTUyMzAwMDA3OAorOjEwQjdDMDAwMjUyOTAwMDI5NTIyMDAwMDI1MjkwMDAyMDE0NzUwMjE2OQorOjEwQjdEMDAwMDE0NjUwMjEwMTQ1NTAyMTAxNDQ1MDIxMDE0MzUwMjE4RgorOjEwQjdFMDAwMDE0MjUwMjEwMDBBMUMwMjMxNDJGRkZGMDA2MjUwMjEzOQorOjEwQjdGMDAwMDAwQTFDMDIzMTQyRkZGRjAwNjI1MDIxOTZFMjA0NkFGNworOjEwQjgwMDAwMzE0RUZGRkYzMDQyMDAwMjEwNDAwMDQ0MDAwMDUwMjE0MgorOjEwQjgxMDAwMjUyMjAwMTQwMjIyMTAyQjEwNDAwMDE0MDEyMDE4MjFCMAorOjEwQjgyMDAwMjQwNTAwMEEwMDAwMjAyMTAyMjMxMDJCNTQ0MDAwMDFBRgorOjEwQjgzMDAwMDA3MjE4MjE5NDYyMDAwMDI0NjMwMDAyMjRBNUZGRkYxNworOjEwQjg0MDAwMTRBMEZGRjkwMDgyMjAyMTAwMDQxQzAyMzA4MkZGRkZCNworOjEwQjg1MDAwMDA2MjIwMjEwMDA0MTQwMjMwODNGRkZGMDA0MzEwMjEwNgorOjEwQjg2MDAwMzA0MkZGRkYwODAwM0UzMzAxNDI1MDIxOTUyQTAwMDA3QworOjEwQjg3MDAwMjUyOTAwMDI5NTI4MDAwMDI1MjkwMDAyOTUyNzAwMDBBRgorOjEwQjg4MDAwMjUyOTAwMDI5NTI2MDAwMDI1MjkwMDAyOTUyNTAwMDBBMworOjEwQjg5MDAwMjUyOTAwMDI5NTIzMDAwMDI1MjkwMDAyOTUyMjAwMDA5OQorOjEwQjhBMDAwMjUyOTAwMDI5NTI0MDAwMDI1MjkwMDAyMDE0ODUwMjE4NQorOjEwQjhCMDAwMDE0NzUwMjEwMTQ2NTAyMTAxNDU1MDIxMDE0MzUwMjFBQgorOjEwQjhDMDAwMDE0MjUwMjE5NTIyMDAwMDk1MjMwMDAyMDE0NDUwMjE5RAorOjEwQjhEMDAwMDE0MjUwMjEwMTQzNTAyMTAwMEExQzAyMzE0MkZGRkY2NgorOjEwQjhFMDAwMDA2MjUwMjEwMDBBMUMwMjMxNDJGRkZGMDA2MjUwMjExOQorOjEwQjhGMDAwMzE0OEZGRkY1MTAwMDAwMTM0MDhGRkZGOEQ2MjAwMTgzRQorOjEwQjkwMDAwOTQ0MzAwMEMyNDAyMDgwMDU0NjIwMDA1QTU2ODAwMTA0RQorOjEwQjkxMDAwOTU2MjAwMEUzNDQyMDAwMkE1NjIwMDBFQTU2ODAwMTA3OAorOjEwQjkyMDAwOTZFMjA0NkEwMDAwMjgyMTMwNDIwMDA4MTQ0MDAwNTZDNAorOjEwQjkzMDAwMDAwMDMwMjE4RDYzMDAxODI0NjIwMDI0MDIyMjEwMkJBNQorOjEwQjk0MDAwMTA0MDAwMzQyNDY5MDAxMDAyMjkxMDJCNTQ0MDAwMDFEQgorOjEwQjk1MDAwMDEzMjQ4MjE5NTI1MDAwMDI0NjkwMDE0MDIyOTEwMkI4QQorOjEwQjk2MDAwMTA0MDAwMDIyNEE1RkZFQzAxMzI0ODIxOTUyMjAwMDA3RQorOjEwQjk3MDAwMzA0MjBGRkYxNDQwMDAwMzI1MjkwMDAyMDgwMDNFNjBGQQorOjEwQjk4MDAwMjQxMzAwMDEwMDAwOTgyMTAwQTAzMDIxMDIyOTEwMkI2RgorOjEwQjk5MDAwNTQ0MDAwMDEwMTMyNDgyMTkxMjIwMDAxMjUyOTAwMDI3MgorOjEwQjlBMDAwMDBBMjI4MjEwMjI5MTAyQjU0NDAwMDAxMDEzMjQ4MjExNQorOjEwQjlCMDAwMjUyOTAwMDIwMjI5MTAyQjU0NDAwMDAxMDEzMjQ4MjFBMAorOjEwQjlDMDAwOTUyMjAwMDAyNTI5MDAwMjAwQTIyODIxMDIyOTEwMkIxRgorOjEwQjlEMDAwNTQ0MDAwMDEwMTMyNDgyMTk1MjIwMDAwMjUyOTAwMDIyRgorOjEwQjlFMDAwMDBBMjI4MjEwMjI5MTAyQjU0NDAwMDAxMDEzMjQ4MjFENQorOjEwQjlGMDAwOTUyMjAwMDAyNTI5MDAwMjAwQTIyODIxMDIyOTEwMkJFRgorOjEwQkEwMDAwNTQ0MDAwMDEwMTMyNDgyMTk1MjIwMDAwMDgwMDNFOTk2RgorOjEwQkExMDAwMDBBMjI4MjE5NDY1MDAxMDk0NjIwMDE0MjQ2OTAwMTY4NQorOjEwQkEyMDAwMzA0MjBGRkYxNDQwMDAwMzI0QTVGRkVDMDgwMDNFOENCOQorOjEwQkEzMDAwMjQxMzAwMDEwMDAwOTgyMTAwQTAzMDIxOTEyMzAwMDE2RgorOjEwQkE0MDAwMjUyOTAwMDQ5NTIyMDAwMDI1MjkwMDAyOTUyNDAwMDBFNAorOjEwQkE1MDAwMjUyOTAwMDIwMEEzMjgyMTAwQTIyODIxOTUyMjAwMDAwOAorOjEwQkE2MDAwOTUyMzAwMDIwMEE0MjgyMTAwQTIyODIxMDBBMzI4MjE1OAorOjEwQkE3MDAwMDAwNTFDMDIzMEEyRkZGRjAwNjIyODIxMDAwNTFDMDIwNQorOjEwQkE4MDAwMzBBMkZGRkYwMDYyMjgyMTk2RTIwNDZBMzA0MjAwMDFFMgorOjEwQkE5MDAwMTA0MDAwMUUwMDAwMjAyMTk1ODIwMDE2MDA0RTIwMjMzOQorOjEwQkFBMDAwMDAwNDE0MDIwMDgyMjAyMTMyNjIwMEZGNTA0MDAwMDI5NAorOjEwQkFCMDAwMDA4NjIwMjEwMDg1MjAyMTAwMDQxNDAyMDA4MjIwMjExQworOjEwQkFDMDAwMzA4NEZGRkY1MDgwMDAwMTM0MDRGRkZGOEQ2MjAwMThCNgorOjEwQkFEMDAwMjQ0MzAwMTcwMjIzMTAyQjU0NDAwMDAxMDA3MjE4MjE0OAorOjEwQkFFMDAwOTA2MjAwMDAzODQzMDAxMTJDNjMwMDAxMzg0MjAwMDZDOAorOjEwQkFGMDAwMkM0MjAwMDEwMDYyMTgyNTEwNjAwMDA0MDAwMDAwMDBDNAorOjEwQkIwMDAwOTU2MjAwMEUzNDQyMDAwMUE1NjIwMDBFOTU2MjAwMEU5RgorOjEwQkIxMDAwMjQwQTAwMDIzMDQyMDAwNDEwNDAwMDAyQTU2NDAwMTIxMgorOjEwQkIyMDAwMjQwQTAwMDQ4Rjg4MDEyMDI3NjIzODAwMjUwOTAwMjA5QworOjEwQkIzMDAwMDEyMjEwMkI1MDQwMDAwMTI3NjkzMDAwOEY4MjAxMjgxQworOjEwQkI0MDAwMTEyMjAwMDQwMDAwMDAwMDhGODIwMTI0MTUyMjAwMDc0QQorOjEwQkI1MDAwMjQwNDAwMjA4RUUyMDFBNDAwMDA4MDIxMjQ0MjAwMDE4MAorOjEwQkI2MDAwQUVFMjAxQTQwODAwM0Y0RjhFRTIwMUE0OEVFNTcyNENDNAorOjEwQkI3MDAwOEVFNjA0OTA4RUU3MDQ5NEFEMEIwMDA4QTUwNDAwMEUzOQorOjEwQkI4MDAwQUQwQTAwMTgwMDA1Mjk0MDAwQTAxODIxMDAwMDEwMjE2RQorOjEwQkI5MDAwMDBFMzM4MjEwMEUzMjAyQjAwQzIzMDIxMDBDNDMwMjExMworOjEwQkJBMDAwQUQwNjAwMDBBRDA3MDAwNDhFRTI3MjRDMDA0RDEwMjU3QQorOjEwQkJCMDAwQUQwMjAwMUM4RUUyMDRDNEFEMDIwMDEwQUY4OTAxMjA2QQorOjEwQkJDMDAwOTJFMjRFMjAxNDQwMDA2MDI0MTAwMDAxMjU0M0ZGRUU1NQorOjEwQkJEMDAwMkM2MzAwMDIzOTQyMDAxMTJDNDIwMDAxMDA2MjE4MjUzQQorOjEwQkJFMDAwMTA2MDAwMjQwMDAwMDAwMDhFRTI0RTMwMDAwMjEwQzAwMQorOjEwQkJGMDAwMjQ0MjUwMzgwMkUyMjAyMThDODIwMDAwMTQ1NTAwMEZBQworOjEwQkMwMDAwMDAwMDAwMDA4RUUzNEUzMDhFRTI0RTM0MTA2MjAwMEJENgorOjEwQkMxMDAwMDAwMDAwMDA4QzgyMDAwNDI0NDIwMDAxQUM4MjAwMDQ3OQorOjEwQkMyMDAwOEVFMjRFMzQ4RUUzNEUzMDI0NDIwMDAxMTA1NDAwMkIzRAorOjEwQkMzMDAwMDAwMDAwMDAwODAwM0YyRTAwMDAwMDAwOEVFMjRFMzBBMQorOjEwQkM0MDAwMjQ0MjAwMDE1MDU0MDAwMzAwMDAxMDIxOEVFMjRFMzBDNworOjEwQkM1MDAwMjQ0MjAwMDFBRUUyNEUzMDhFRTI0RTMwMDAwMjEwQzBBRgorOjEwQkM2MDAwMjQ0MjUwMzgwMkUyMjAyMTI0MDIwMDAxMDgwMDNGNEUwNQorOjEwQkM3MDAwQUM5NTAwMDA4RUUyNEUzMDAwMDIxMEMwMjQ0MjUwMzhENQorOjEwQkM4MDAwMDJFMjIwMjE4QzgzMDAwMDI0MDIwMDA3MTQ2MjAwMUZCRQorOjEwQkM5MDAwMDAwMDAwMDA4RUUzNEUzMDhFRTI0RTM0MTA2MjAwMUIzNgorOjEwQkNBMDAwMDAwMDAwMDA4QzgyMDAwNDI0NDIwMDAxQUM4MjAwMDRFOQorOjEwQkNCMDAwOEVFMjRFMzQ4RUUzNEUzMDI0NDIwMDAxMTA1NDAwMDdEMQorOjEwQkNDMDAwMDAwMDAwMDA4RUUyNEUzNDI0NDIwMDAxMTA2MjAwMDVBNAorOjEwQkNEMDAwMDAwMDAwMDAwODAwM0YzQTAwMDAwMDAwMTQ2MDAwMDU2QQorOjEwQkNFMDAwMDAwMDAwMDA4RjgyMDEyODI0NDIwMDIwQUY4MjAxMjgzQQorOjEwQkNGMDAwOEY4MjAxMjg4QzgyMDAwNDJDNDIwMDExNTA0MDAwMTJENworOjEwQkQwMDAwQUM4MDAwMDAwODAwM0Y0RjAwMDAwMDAwOEVFMjRFMzA4MworOjEwQkQxMDAwMjQ0MjAwMDE1MDU0MDAwMzAwMDAxMDIxOEVFMjRFMzBGNgorOjEwQkQyMDAwMjQ0MjAwMDFBRUUyNEUzMDhFRTI0RTMwMDAwMjEwQzBERQorOjEwQkQzMDAwMjQ0MjUwMzgwMkUyMjAyMTI0MDIwMDA3QUM4MjAwMDA5NQorOjEwQkQ0MDAwMjQwMjAwMDFBQzgyMDAwNDE2MDAwMDBEMDAwMDAwMDA3NworOjEwQkQ1MDAwOEY4MjAxMjAzQzA0MDAwMTI0ODQ1OTM4QUZBMDAwMTRENAorOjEwQkQ2MDAwQUZBMjAwMTA4RDg2MDAxQzhGODcwMTI0M0MwNTAwMDhCRgorOjEwQkQ3MDAwMEMwMDI0MDMzNEE1MDAwMTA4MDA0MDU3MDAwMDAwMDAxNworOjEwQkQ4MDAwOEVFMjcyNEMyNDQyMDAwMTMwNDIwN0ZGMTFBMDAwMDZFRgorOjEwQkQ5MDAwQUVFMjcyNEM4RUUyMDFEMDI0NDJGRkZGQUVFMjAxRDA0RgorOjEwQkRBMDAwMDgwMDNGNkI4RUUyMDFEMDhFRTIwMUNDMjQ0MkZGRkZGRgorOjEwQkRCMDAwQUVFMjAxQ0M4RUUyMDFDQzhFRTIwMUQ4MjQ0MkZGRkYzQworOjEwQkRDMDAwQUVFMjAxRDgwODAwNDA1NzhFRTIwMUQ4OEY0MjAyNDAwRgorOjEwQkREMDAwMTA0MDAwRTUwMDAwMDAwMDhFRTIwRTFDMjQ0MjAwMDEyRAorOjEwQkRFMDAwMDgwMDQwNTdBRUUyMEUxQzk1ODIwMDFFQUQ4MjAwMUM3QQorOjEwQkRGMDAwOEY0MjAyNDAxMDQwMDA3MjAwMDAwMDAwOEVFMjBFMUNENAorOjEwQkUwMDAwMjQ0MjAwMDFBRUUyMEUxQzhGNDMwMjQwMDA0MzEwMkI3RgorOjEwQkUxMDAwMTQ0MDAwRDUwMDAwMDAwMDhGODMwMTIwMjc2MjM4MDAwNQorOjEwQkUyMDAwMjQ2NjAwMjAwMEMyMTAyQjUwNDAwMDAxMjc2NjMwMDAxRAorOjEwQkUzMDAwOEY4MjAxMjgxMEMyMDAwNDAwMDAwMDAwOEY4MjAxMjRCQworOjEwQkU0MDAwMTRDMjAwMDcwMDAwMDAwMDhFRTIwMUE0MDAwMDgwMjE1RgorOjEwQkU1MDAwMjQ0MjAwMDFBRUUyMDFBNDA4MDAzRkRBOEVFMjAxQTQxMAorOjEwQkU2MDAwOEVFMjcyNENBQzYyMDAxQzhFRTQwNEE4OEVFNTA0QUMzOQorOjEwQkU3MDAwMjQ2MjAwMUNBQzYyMDAwODI0MDIwMDA4QTQ2MjAwMEVDOAorOjEwQkU4MDAwMjQwMjAwMTFBQzYyMDAxOEFDNjQwMDAwQUM2NTAwMDQzMAorOjEwQkU5MDAwOEVFMjA0QzRBQzYyMDAxMEFGODYwMTIwOTJFMjRFMjAxNAorOjEwQkVBMDAwMTQ0MDAwMzQyNDEwMDAwMThFRTI0RTMwMDAwMjEwQzAxNQorOjEwQkVCMDAwMjQ0MjUwMzgwMkUyMjAyMThDODIwMDAwMTQ1NTAwMUZEOQorOjEwQkVDMDAwMDAwMDAwMDA4RUUzNEUzMDhFRTI0RTM0MTA2MjAwMUIwNAorOjEwQkVEMDAwMDAwMDAwMDA4QzgyMDAwNDI0NDIwMDAxQUM4MjAwMDRCNworOjEwQkVFMDAwOEVFMjRFMzQ4RUUzNEUzMDI0NDIwMDAxMTA1NDAwMDc5RgorOjEwQkVGMDAwMDAwMDAwMDA4RUUyNEUzNDI0NDIwMDAxMTA2MjAwMDU3MgorOjEwQkYwMDAwMDAwMDAwMDAwODAwM0ZDNjAwMDAwMDAwMTQ2MDAwMDVBQgorOjEwQkYxMDAwMDAwMDAwMDA4RjgyMDEyODI0NDIwMDIwQUY4MjAxMjgwNworOjEwQkYyMDAwOEY4MjAxMjg4QzgyMDAwNDJDNDIwMDExNTA0MDAwMTFBNQorOjEwQkYzMDAwQUM4MDAwMDAwODAwM0ZEQTAwMDAwMDAwOEVFMjRFMzBDNgorOjEwQkY0MDAwMjQ0MjAwMDE1MDU0MDAwMzAwMDAxMDIxOEVFMjRFMzBDNAorOjEwQkY1MDAwMjQ0MjAwMDFBRUUyNEUzMDhFRTI0RTMwMDAwMjEwQzBBQworOjEwQkY2MDAwMjQ0MjUwMzgwMkUyMjAyMTI0MDIwMDAxQUM5NTAwMDA1NgorOjEwQkY3MDAwQUM4MjAwMDQ1NjAwMDAwQjI0MTAwMDAxOEVFMjcyNENDQgorOjEwQkY4MDAwM0MwNDAwMDEyNDg0NThBOEFGQTAwMDE0QUZBMjAwMTAwNAorOjEwQkY5MDAwOEVFNjcyNEM4RjQ3MDI4MDNDMDUwMDA5MEMwMDI0MDM5QQorOjEwQkZBMDAwMzRBNUYwMDg1NjAwMDAwMUFFRTAwRTFDOEVFMjAxODhCOAorOjEwQkZCMDAwMjQ0MjAwMDFBRUUyMDE4ODA4MDA0MDUwOEVFMjAxODg3MAorOjEwQkZDMDAwOEY4MzAxMjAyNzYyMzgwMDI0NjYwMDIwMDBDMjEwMkJENgorOjEwQkZEMDAwNTA0MDAwMDEyNzY2MzAwMDhGODIwMTI4MTBDMjAwMDQwMworOjEwQkZFMDAwMDAwMDAwMDA4RjgyMDEyNDE0QzIwMDA3MDAwMDAwMDAzRQorOjEwQkZGMDAwOEVFMjAxQTQwMDAwODAyMTI0NDIwMDAxQUVFMjAxQTRFRgorOjEwQzAwMDAwMDgwMDQwNDQ4RUUyMDFBNDhFRTI3MjRDQUM2MjAwMUMzNworOjEwQzAxMDAwOEVFNDA0QTg4RUU1MDRBQzI0NjIwMDFDQUM2MjAwMDgyNworOjEwQzAyMDAwMjQwMjAwMDhBNDYyMDAwRTI0MDIwMDExQUM2MjAwMTg3MQorOjEwQzAzMDAwQUM2NDAwMDBBQzY1MDAwNDhFRTIwNEM0QUM2MjAwMTA4NQorOjEwQzA0MDAwQUY4NjAxMjA5MkUyNEUyMDE0NDAwMDM0MjQxMDAwMDFGQgorOjEwQzA1MDAwOEVFMjRFMzAwMDAyMTBDMDI0NDI1MDM4MDJFMjIwMjEwRAorOjEwQzA2MDAwOEM4MjAwMDAxNDU1MDAxRjAwMDAwMDAwOEVFMzRFMzA0QgorOjEwQzA3MDAwOEVFMjRFMzQxMDYyMDAxQjAwMDAwMDAwOEM4MjAwMDQyRgorOjEwQzA4MDAwMjQ0MjAwMDFBQzgyMDAwNDhFRTI0RTM0OEVFMzRFMzAzNgorOjEwQzA5MDAwMjQ0MjAwMDExMDU0MDAwNzAwMDAwMDAwOEVFMjRFMzREQworOjEwQzBBMDAwMjQ0MjAwMDExMDYyMDAwNTAwMDAwMDAwMDgwMDQwMzAzQQorOjEwQzBCMDAwMDAwMDAwMDAxNDYwMDAwNTAwMDAwMDAwOEY4MjAxMjhDRAorOjEwQzBDMDAwMjQ0MjAwMjBBRjgyMDEyODhGODIwMTI4OEM4MjAwMDQ0NAorOjEwQzBEMDAwMkM0MjAwMTE1MDQwMDAxMUFDODAwMDAwMDgwMDQwNDQ4OAorOjEwQzBFMDAwMDAwMDAwMDA4RUUyNEUzMDI0NDIwMDAxNTA1NDAwMDM1NAorOjEwQzBGMDAwMDAwMDEwMjE4RUUyNEUzMDI0NDIwMDAxQUVFMjRFMzBBQworOjEwQzEwMDAwOEVFMjRFMzAwMDAyMTBDMDI0NDI1MDM4MDJFMjIwMjE1QworOjEwQzExMDAwMjQwMjAwMDFBQzk1MDAwMEFDODIwMDA0MTYwMDAwMEI2NAorOjEwQzEyMDAwMDAwMDAwMDA4RUUyNzI0QzNDMDQwMDAxMjQ4NDU4QThGOAorOjEwQzEzMDAwQUZBMDAwMTRBRkEyMDAxMDhFRTY3MjRDOEY0NzAyODBCMQorOjEwQzE0MDAwM0MwNTAwMDkwQzAwMjQwMzM0QTVGMDA4OEVFMjAxNzRCQworOjEwQzE1MDAwMjQ0MjAwMDFBRUUyMDE3NDA4MDA0MDU3OEVFMjAxNzRFRgorOjEwQzE2MDAwMjQwMjAwMDFBRUUyNEUyNDhGODMwMTI4OEY4MjAxMjQzNQorOjEwQzE3MDAwMTQ2MkZENTgwMDAwMDAwMDhGQkYwMDMwOEZCNTAwMkMwNgorOjEwQzE4MDAwOEZCNDAwMjg4RkIzMDAyNDhGQjIwMDIwOEZCMTAwMUMyMQorOjEwQzE5MDAwOEZCMDAwMTgwM0UwMDAwODI3QkQwMDM4MjdCREZGRTg3NgorOjEwQzFBMDAwMjc4NDAyMDgyNzQ1MDIwMDI0MDYwMDA4QUZCRjAwMTRCOAorOjEwQzFCMDAwMEMwMDI0OUFBRkIwMDAxMDAwMDAyMDIxMjQxMDAwMDFEMAorOjEwQzFDMDAwMjQwMjI0MUZBRjkwMDIxMEFGOTAwMjAwQUY4MDAyMDQzRgorOjEwQzFEMDAwQUY4MjAyMTQ4RjQ2MDI0ODI0MDMwMDA0M0MwMjAwNDA1MAorOjEwQzFFMDAwM0MwMTAwMDFBQzIzNUNDNDNDMDEwMDAxQUMyMzVDQzhGMQorOjEwQzFGMDAwM0MwMTAwMDFBQzIwNUQ5QzNDMDEwMDAxQUMyMjVDQzAxNAorOjEwQzIwMDAwM0MwMTAwMDFBQzIzNUNDODBDMDA1MTA4MjQwNTAwMDQ2QgorOjEwQzIxMDAwMEMwMDQ4MjIwMDAwMDAwMDhFRTIwMDAwM0MwM0ZFRkZGQworOjEwQzIyMDAwMzQ2M0ZGRkQwMDQzMTAyNEFFRTIwMDAwM0MwMjNDMDBGQQorOjEwQzIzMDAwQUY4MjAyMUMzQzAxMDAwMTAwMzcwODIxQUMzMDgzQUMwNgorOjEwQzI0MDAwOEZCRjAwMTQ4RkIwMDAxMDAzRTAwMDA4MjdCRDAwMTg1NgorOjEwQzI1MDAwMjdCREZGRTAzQzA1MDAwODM0QTUwNDAwQUZCRjAwMTg2RgorOjEwQzI2MDAwQUZBMDAwMTBBRkEwMDAxNDhGODYwMjAwM0MwNDAwMDFCNAorOjEwQzI3MDAwMjQ4NDU5RjAwQzAwMjQwMzAwMDAzODIxOEVFMjAyODA0RgorOjEwQzI4MDAwMjQ0MjAwMDFBRUUyMDI4MDhFRTIwMjgwOEY4MzAyMDAyRgorOjEwQzI5MDAwM0MwMjNGMDAwMDYyMTgyNDhGQkYwMDE4M0MwMjA0MDBEQgorOjEwQzJBMDAwMDNFMDAwMDgyN0JEMDAyMDI3QkRGRkQ4QUZCRjAwMjA1NgorOjEwQzJCMDAwQUZCMTAwMUNBRkIwMDAxODhGOTAwMjIwOEVFMjAyMTRDNAorOjEwQzJDMDAwMDAwMDM4MjEyNDQyMDAwMUFFRTIwMjE0OEVFMjAyMTQ4MgorOjEwQzJEMDAwM0MwMjAzMDAwMjAyMTAyNDEwNDAwMDI3M0MxMTA0MDAxRAorOjEwQzJFMDAwMEMwMDQyOUIwMDAwMDAwMDNDMDIwMTAwMDIwMjEwMjRFRQorOjEwQzJGMDAwMTA0MDAwMDcwMDAwMDAwMDhFRTIwMjE4MjQ0MjAwMDFGNgorOjEwQzMwMDAwQUVFMjAyMTg4RUUyMDIxODA4MDA0MEM2M0MwM0ZERkZCMAorOjEwQzMxMDAwOEVFMjAyMUMyNDQyMDAwMUFFRTIwMjFDOEVFMjAyMUNFQworOjEwQzMyMDAwM0MwM0ZERkYzNDYzRkZGRjNDMDgwOEZGMzUwOEZGRkZCNworOjEwQzMzMDAwOEVFMjAwMDAzQzA0MDAwMTI0ODQ1OUZDM0MwNTAwMDgwNgorOjEwQzM0MDAwMDIwMDMwMjEwMDQzMTAyNEFFRTIwMDAwOEY4MjAyMjA2MAorOjEwQzM1MDAwMDAwMDM4MjEzQzAzMDMwMDAwNDgxMDI0MDA0MzEwMjU0RQorOjEwQzM2MDAwQUY4MjAyMjBBRkEwMDAxMDBDMDAyNDAzQUZBMDAwMTQ4NQorOjEwQzM3MDAwMDgwMDQyOTYwMDAwMDAwMDAyMTExMDI0MTA0MDAwMUYyNworOjEwQzM4MDAwM0MwMjQwMDA4RjgzMDIyNDI0MDIxNDAyMTQ2MjAwMEIzQQorOjEwQzM5MDAwM0MwM0ZERkYzQzA0MDAwMTI0ODQ1QTA4M0MwNTAwMDhDRQorOjEwQzNBMDAwQUZBMDAwMTBBRkEwMDAxNDhGODYwMjI0MzRBNUZGRkZCOQorOjEwQzNCMDAwMEMwMDI0MDMwMDAwMzgyMTNDMDNGREZGOEVFMjAwMDA0NgorOjEwQzNDMDAwMzQ2M0ZGRkYwMjAwMjAyMTAwNDMxMDI0MEMwMDRFNTQ3MAorOjEwQzNEMDAwQUVFMjAwMDA4RUUyMDIyMDI0NDIwMDAxQUVFMjAyMjAyMgorOjEwQzNFMDAwOEVFMjAyMjA4RjgyMDIyMDNDMDMwOEZGMzQ2M0ZGRkZBRAorOjEwQzNGMDAwMDA0MzEwMjQwODAwNDI5NTAwNTExMDI1MDIwMjEwMjQyOQorOjEwQzQwMDAwMTA0MDAxNDIwMDAwMDAwMDhFRTIwMjJDMjQ0MjAwMDE5NAorOjEwQzQxMDAwQUVFMjAyMkM4RUUyMDIyQzhGODIwMjIwM0MwMzA4RkY0NworOjEwQzQyMDAwMzQ2M0ZGRkYwMDQzMTAyNDM0NDIwMDA0QUY4MjAyMjAzMworOjEwQzQzMDAwOEY4MzAwNTQ4RjgyMDA1NDA4MDA0MTBFMjQ2MzAwMDI1MQorOjEwQzQ0MDAwOEY4MjAwNTQwMDYyMTAyMzJDNDIwMDAzMTQ0MEZGRkMzMgorOjEwQzQ1MDAwMDAwMDAwMDA4Rjg2MDBFMDhGODQwMEU0MzBDMjAwMDdGNworOjEwQzQ2MDAwMTA0MDAwMTIwMDAwMDAwMDhGODMwMEU0MjQwMkZGRjg1NworOjEwQzQ3MDAwMDBDMjEwMjQxMDQzMDAwRDAwMDAwMDAwOEY4MjAwNTQwMQorOjEwQzQ4MDAwOEY4MzAwRTAxNEMzMDAwOTI0NDQwMDUwOEY4MjAwNTRCRAorOjEwQzQ5MDAwMDA4MjEwMjMyQzQyMDA1MTEwNDAwMDA0MDAwMDAwMDBENAorOjEwQzRBMDAwOEY4MjAwRTAxMEMyRkZGOTAwMDAwMDAwOEY4MjAyMjA5RQorOjEwQzRCMDAwM0MwMzA4RkYzNDYzRkZGRDAwNDMxMDI0QUY4MjAyMjBEOQorOjEwQzRDMDAwOEY4NjAwRTAzMEMyMDAwNzEwNDAwMDAzMjQwMkZGRjgwRQorOjEwQzREMDAwMDBDMjMwMjRBRjg2MDBFMDhGODMwMEM0M0MwMjAwMUZGRQorOjEwQzRFMDAwMzQ0MkZGRkYyNDY4MDAwODAwNDgxMDJCMTA0MDAwMDM2RQorOjEwQzRGMDAwM0MwMkZGRjUzNDQyMTAwMDAxMDI0MDIxOEY4QjAwQzgzRQorOjEwQzUwMDAwOEY4NTAxMjA4Rjg0MDEyNDA4MDA0MTQ1MDAwMDYwMjFBRgorOjEwQzUxMDAwMjc2MjM4MDAwMDgyMTAyQjUwNDAwMDAxMjc2NDMwMDA1MQorOjEwQzUyMDAwMTBBNDAwMTAzMTgyMDBGRjhDODIwMDE4Mzg0MzAwMDdFRAorOjEwQzUzMDAwMkM2MzAwMDEzODQyMDAwQjJDNDIwMDAxMDA2MjE4MjVEOAorOjEwQzU0MDAwNTA2MEZGRjMyNDg0MDAyMDhFRTIwMjQwMjQwQzAwMDE5RQorOjEwQzU1MDAwMjQ0MjAwMDFBRUUyMDI0MDhFRTIwMjQwOEM4QjAwMDhEMQorOjEwQzU2MDAwMzE4MjAwRkYxNDQwMDA2NTAwMDAwMDAwM0MwMjAwMDEyMQorOjEwQzU3MDAwMDA1NzEwMjE5MDQyODNDMDE0NDAwMDYwMDAwMDAwMDA2QQorOjEwQzU4MDAwOEY4NDAwRTQwMEM0MTAyMzAwMDIxOEMzMDQ2MjAwMDE3OQorOjEwQzU5MDAwMjQ2MzAyMDA4Rjg5MDBDNDEwNjAwMDA1MjQwMjAwMDE5QQorOjEwQzVBMDAwMTA2MjAwMDkwMDAwMDAwMDA4MDA0MTg3MDAwMDAwMDA0MAorOjEwQzVCMDAwOEVFMjAyMzAwMTIwNTgyMTI0NDIwMDAxQUVFMjAyMzAxNgorOjEwQzVDMDAwMDgwMDQxQkM4RUUyMDIzMDhFRTIwMjM0M0MwNTAwMEFEMworOjEwQzVEMDAwMjQ0MjAwMDFBRUUyMDIzNDhDOEIwMDAwMzRBNUYwMDA0RQorOjEwQzVFMDAwOEVFMjAyMzQwMTJCMTgyMzAwQTMxMDJCNTQ0MDAwMDFDQgorOjEwQzVGMDAwMDA2NTE4MjEyQzYyMjMzRjE0NDAwMDQwMDAwMDAwMDAxOQorOjEwQzYwMDAwOEY4MjAwRTgyNDQyMDAwOEFGODIwMEU4OEY4MjAwRThCMQorOjEwQzYxMDAwOEY4MjAwRTQwMTIwNTgyMTI0NDIwMDA4QUY4MjAwRTQwOAorOjEwQzYyMDAwMDgwMDQxQkM4RjgyMDBFNDhFRTIwMjM4M0MwMzAwMEExRAorOjEwQzYzMDAwMjQ0MjAwMDFBRUUyMDIzODhDODQwMDAwMzQ2M0YwMDAzMgorOjEwQzY0MDAwOEVFMjAyMzgwMDg4MzgyMzAwNjcxMDJCNTQ0MDAwMDEyNgorOjEwQzY1MDAwMDBFMzM4MjEzQzAyMDAwMzM0NDIwRDQwMDA0NzEwMkIxOAorOjEwQzY2MDAwMTA0MDAwMDMwMDAwMDAwMDA4MDA0MUJDMDA4MDU4MjE3OQorOjEwQzY3MDAwOEY4MjAwRTQyNDQ0MDAwOEFGODQwMEU0OEY4NDAwRTQ0NworOjEwQzY4MDAwMTA4NjAwMTgzQzA1MDAwQTM0QTVGMDAwM0MwQTAwMDM5RgorOjEwQzY5MDAwMzU0QTBENDA4RUUyMDA3QzI0NDIwMDAxQUVFMjAwN0M2RgorOjEwQzZBMDAwOEM4MzAwMDA4RUUyMDA3QzAwNjgzODIzMDBBNzEwMkJFQQorOjEwQzZCMDAwNTQ0MDAwMDEwMEU1MzgyMTAxNDcxMDJCNTQ0MDAwMDc4OQorOjEwQzZDMDAwMDA2MDU4MjE4RjgyMDBFNDI0NDQwMDA4QUY4NDAwRTQxNQorOjEwQzZEMDAwOEY4NDAwRTQxNDg2RkZFRjAwMDAwMDAwMTQ4NjAwMDUzQworOjEwQzZFMDAwMDAwMDAwMDAwMTIwNTgyMUFGODYwMEU0MDgwMDQxQkM5MgorOjEwQzZGMDAwQUY4NjAwRThBRjg0MDBFNEFGODQwMEU4OEY4MjAwQzgxMgorOjEwQzcwMDAwM0MwMzAwMEEzNDYzRjAwMDAwNDgzODIzMDA2NzEwMkIxNAorOjEwQzcxMDAwNTQ0MDAwMDEwMEUzMzgyMTNDMDIwMDAzMzQ0MjBEM0Y0NQorOjEwQzcyMDAwMDA0NzEwMkI1NDQwMDAwNzAwMDA2MDIxMDE2ODM4MjNBNworOjEwQzczMDAwMDA2NzEwMkI1NDQwMDAwMzAwRTMzODIxMDgwMDQxQ0Y2QworOjEwQzc0MDAwM0MwMjAwMDMzQzAyMDAwMzM0NDIwRDNGMDA0NzEwMkIyMworOjEwQzc1MDAwMTQ0MDAwMTYzMTgyMDBGRjE0NDAwMDA2MDAwMDAwMDA2MworOjEwQzc2MDAwM0MwMjAwMDEwMDU3MTAyMTkwNDI4M0MwMTA0MDAwMEY4RQorOjEwQzc3MDAwMDAwMDAwMDA4RUUyMDIzQzNDMDRGREZGOEVFMzAwMDA1RQorOjEwQzc4MDAwMzQ4NEZGRkYyNDQyMDAwMUFFRTIwMjNDOEVFMjAyM0MxMAorOjEwQzc5MDAwMjQwMjAwMDEwMDY0MTgyNDNDMDEwMDAxMDAzNzA4MjEzNAorOjEwQzdBMDAwQTAyMjgzQjgwODAwNDIyQ0FFRTMwMDAwQUY4QjAwQzg4MworOjEwQzdCMDAwOEY4MzAwQzg4RjgyMDBDNDNDMDQwMDBBMzQ4NEYwMDBEOAorOjEwQzdDMDAwMDA2MjM4MjMwMDg3MTAyQjU0NDAwMDAxMDBFNDM4MjExOAorOjEwQzdEMDAwM0MwMjAwMDMzNDQyMEQ0MDAwNDcxMDJCMkNFMzAwMDFDMworOjEwQzdFMDAwMDA0MzEwMjUxMDQwMDAwODAwMDAwMDAwOEY4MjAyMjA0NgorOjEwQzdGMDAwM0MwMzA4RkYzNDYzRkZGRjAwNDMxMDI0M0MwMzQwMDA2OAorOjEwQzgwMDAwMDA0MzEwMjVBRjgyMDIyMDhGODYwMEUwOEY4NDAwRTQ3MQorOjEwQzgxMDAwMTBDNDAwMkEwMDAwMDAwMDhFRTIwMDdDMjQ0MjAwMDFDNworOjEwQzgyMDAwQUVFMjAwN0M4RUUyMDA3QzI0QzJGRkY4QUY4MjAwRTAyMgorOjEwQzgzMDAwM0MwMjAwMDE4QzQyN0UzMDNDMDMwMDA4OEY4NjAwRTAwMQorOjEwQzg0MDAwMDA0MzEwMjQxMDQwMDAxRDAwMDAwMDAwMTBDNDAwMUIxNQorOjEwQzg1MDAwMjQwREZGRjgzQzBBMDAwQTM1NEFGMDAwM0MwQzAwODAyOQorOjEwQzg2MDAwMjQ4NTAwMDgyNzYyMjgwMDUwQTIwMDAxMjc2NTE4MDBDRgorOjEwQzg3MDAwOEM4ODAwMDQ4QzgyMDAwMDhDQTkwMDAwMzEwM0ZGRkYyQgorOjEwQzg4MDAwMDA0MzEwMjEwMDREMTAyNDI0NDMwMDEwMDA2QjEwMkI5NgorOjEwQzg5MDAwNTQ0MDAwMDEwMDZBMTgyMTAxMkIxMDJCNTQ0MDAwMDE2NAorOjEwQzhBMDAwMDEyQTQ4MjExMDY5MDAwMjAxMEMxMDI1QUM4MjAwMDQwNQorOjEwQzhCMDAwMDBBMDIwMjExNEM0RkZFQjI0ODUwMDA4OEY4MjAyMjBGMQorOjEwQzhDMDAwM0MwMzA4RkYzNDYzRkZGRjAwNDMxMDI0MzQ0MjAwMDI5RQorOjEwQzhEMDAwQUY4MjAyMjA4RjgzMDA1NDhGODIwMDU0MDgwMDQyMzdCOQorOjEwQzhFMDAwMjQ2MzAwMDE4RjgyMDA1NDAwNjIxMDIzMkM0MjAwMDI1NgorOjEwQzhGMDAwMTQ0MEZGRkMwMDAwMDAwMDhGODIwMjIwM0MwMzA4RkY3MAorOjEwQzkwMDAwMzQ2M0ZGRkIwMDQzMTAyNEFGODIwMjIwMDYwMTAwNTU3MAorOjEwQzkxMDAwMDAwMDAwMDA4RUUyMDIyODI0NDIwMDAxQUVFMjAyMjg1QworOjEwQzkyMDAwOEVFMjAyMjg4RjgyMDIyMDNDMDMwOEZGMzQ2M0ZGRkY1RgorOjEwQzkzMDAwMDA0MzEwMjQzNDQyMDAwNEFGODIwMjIwOEY4MzAwNTQ0RAorOjEwQzk0MDAwOEY4MjAwNTQwODAwNDI1MTI0NjMwMDAyOEY4MjAwNTRGOQorOjEwQzk1MDAwMDA2MjEwMjMyQzQyMDAwMzE0NDBGRkZDMDAwMDAwMDA4MgorOjEwQzk2MDAwOEY4NjAwRTAzMEMyMDAwNzEwNDAwMDEyMDAwMDAwMDA3NworOjEwQzk3MDAwOEY4MzAwRTQyNDAyRkZGODAwQzIxMDI0MTA0MzAwMEQ0RQorOjEwQzk4MDAwMDAwMDAwMDA4RjgyMDA1NDhGODMwMEUwMTRDMzAwMDk3MAorOjEwQzk5MDAwMjQ0NDAwMzI4RjgyMDA1NDAwODIxMDIzMkM0MjAwMzM0MgorOjEwQzlBMDAwMTA0MDAwMDQwMDAwMDAwMDhGODIwMEUwMTBDMkZGRjk3OAorOjEwQzlCMDAwMDAwMDAwMDA4RjgyMDIyMDNDMDMwOEZGMzQ2M0ZGRkQ2QgorOjEwQzlDMDAwMDA0MzEwMjRBRjgyMDIyMDhGODYwMEUwMzBDMjAwMDdBRgorOjEwQzlEMDAwMTA0MDAwMDMyNDAyRkZGODAwQzIzMDI0QUY4NjAwRTBCQworOjEwQzlFMDAwMjQwMzAxRjU4RjgyMDBFODAwNjczODIzMDAwNzE4QzA5MAorOjEwQzlGMDAwMDA0MzEwMjFBRjgyMDBFODhGODIwMEU4QUY4MjAwRTQ5QworOjEwQ0EwMDAwOEVFMjAwN0MzQzA0MDhGRjM0ODRGRkZGMDA0NzEwMjFDNQorOjEwQ0ExMDAwQUVFMjAwN0M4RjgyMDIyMDNDMDM4MDAwMzQ2MzAwMDI3RgorOjEwQ0EyMDAwMDA0NDEwMjQwMDQzMTAyNUFGODIwMjIwOEY4MzAwNTQ1RAorOjEwQ0EzMDAwOEY4MjAwNTQwODAwNDI4RDI0NjMwMDAxOEY4MjAwNTRDRAorOjEwQ0E0MDAwMDA2MjEwMjMyQzQyMDAwMjE0NDBGRkZDMDAwMDAwMDA5MgorOjEwQ0E1MDAwOEY4MjAyMjAzQzAzMDhGRjM0NjNGRkZCMDA0MzEwMjQ1NQorOjEwQ0E2MDAwQUY4MjAyMjA4RkJGMDAyMDhGQjEwMDFDOEZCMDAwMTg1MgorOjEwQ0E3MDAwMDNFMDAwMDgyN0JEMDAyODNDMDIwMDAxOEM0MjVDRDg3RQorOjEwQ0E4MDAwMjdCREZGRDgxMDQwMDAxMkFGQkYwMDIwM0MwNDAwMDFCQQorOjEwQ0E5MDAwMjQ4NDVBMTQzQzA1MDAwODI0MDIwMDAxM0MwMTAwMDFEMgorOjEwQ0FBMDAwMDAzNzA4MjFBQzIyODNBQ0FGQTAwMDEwQUZBMDAwMTQ2NworOjEwQ0FCMDAwOEY4NjAyMjAzNEE1MDQ5ODNDMDEwMDAxQUMyMDVDRDg4QworOjEwQ0FDMDAwM0MwMTAwMDFBQzIyNUNDQzBDMDAyNDAzMDAwMDM4MjFBNgorOjEwQ0FEMDAwOEY0MjAyNjgzQzAzN0ZGRjM0NjNGRkZGMDA0MzEwMjQ1MgorOjEwQ0FFMDAwQUY0MjAyNjg4RUUyMDREMDhFRTQwNEQ0MjQwM0ZGRkUzOQorOjEwQ0FGMDAwMDA0MzEwMjQzMDg0MDAwMjEwODAwMTFFQUVFMjA0RDBGNgorOjEwQ0IwMDAwOEVFMjA0RDQyNDAzRkZGRDAwNDMxMDI0QUVFMjA0RDREQgorOjEwQ0IxMDAwOEY4MjAwNDQzQzAzMDYwMDM0NjMyMDAwMzQ0MjAwMjAyRQorOjEwQ0IyMDAwQUY4MjAwNDRBRkEzMDAxODhFRTIwNjA4OEY0MzAyMjhBQworOjEwQ0IzMDAwMjQ0MjAwMDEzMDRBMDBGRjUxNDMwMEZFQUZBMDAwMTAyNAorOjEwQ0I0MDAwOEVFMjA2MDgwMDAyMTBDMDAwNTcxMDIxOEZBMzAwMThDMworOjEwQ0I1MDAwOEZBNDAwMUNBQzQzMDYwQ0FDNDQwNjEwOEY4MzAwNTQxOQorOjEwQ0I2MDAwOEY4MjAwNTQyNDY5MDAzMjAxMjIxMDIzMkM0MjAwMzNBQQorOjEwQ0I3MDAwMTA0MDAwNkEwMDAwNTgyMTI0MTgwMDA4MjQwRjAwMERGRQorOjEwQ0I4MDAwMjQwRDAwMDcyNDBDMDA0MDI0MEUwMDAxOEY4NzAxMjA5MworOjEwQ0I5MDAwMjc2MjM4MDAyNEU4MDAyMDAxMDIxMDJCNTA0MDAwMDFEOQorOjEwQ0JBMDAwMjc2ODMwMDA4RjgyMDEyODExMDIwMDA0MDAwMDAwMDA3NQorOjEwQ0JCMDAwOEY4MjAxMjQxNTAyMDAwNzAwMDAxMDIxOEVFMjAxQTREQgorOjEwQ0JDMDAwMDAwMDI4MjEyNDQyMDAwMUFFRTIwMUE0MDgwMDQzM0RGOAorOjEwQ0JEMDAwOEVFMjAxQTQ4RUU0MDYwODAwMDQyMEMwMDA4MDE4MjEyMworOjEwQ0JFMDAwOEVFNDA0MzA4RUU1MDQzNDAwQTMyODIxMDBBMzMwMkIwQQorOjEwQ0JGMDAwMDA4MjIwMjEwMDg2MjAyMUFDRTQwMDAwQUNFNTAwMDQ4NgorOjEwQ0MwMDAwOEVFMjA2MDhBNEY4MDAwRUFDRUYwMDE4QUNFQTAwMUM5NworOjEwQ0MxMDAwMDAwMjEwQzAyNDQyMDYwQzAyRTIxMDIxQUNFMjAwMDgxRgorOjEwQ0MyMDAwOEVFMjA0QzRBQ0UyMDAxMEFGODgwMTIwOTJFMjRFMjBGNAorOjEwQ0MzMDAwMTQ0MDAwMzMyNDA1MDAwMThFRTI0RTMwMDAwMjEwQzA4MworOjEwQ0M0MDAwMjQ0MjUwMzgwMkUyMjAyMThDODIwMDAwMTQ0RDAwMUY0MworOjEwQ0M1MDAwMDAwMDAwMDA4RUUzNEUzMDhFRTI0RTM0MTA2MjAwMUI2NgorOjEwQ0M2MDAwMDAwMDAwMDA4QzgyMDAwNDI0NDIwMDAxQUM4MjAwMDQxOQorOjEwQ0M3MDAwOEVFMjRFMzQ4RUUzNEUzMDI0NDIwMDAxMTA0QzAwMDcwOQorOjEwQ0M4MDAwMDAwMDAwMDA4RUUyNEUzNDI0NDIwMDAxMTA2MjAwMDVENAorOjEwQ0M5MDAwMDAwMDAwMDAwODAwNDMyQTAwMDAwMDAwMTQ2MDAwMDVBNgorOjEwQ0NBMDAwMDAwMDAwMDA4RjgyMDEyODI0NDIwMDIwQUY4MjAxMjg2QQorOjEwQ0NCMDAwOEY4MjAxMjg4QzgyMDAwNDJDNDIwMDExNTA0MDAwMTAwOQorOjEwQ0NDMDAwQUM4MDAwMDAwODAwNDMzRDAwMDAwMDAwOEVFMjRFMzBDMgorOjEwQ0NEMDAwMjQ0MjAwMDE1MDRDMDAwMzAwMDAxMDIxOEVFMjRFMzAyRgorOjEwQ0NFMDAwMjQ0MjAwMDFBRUUyNEUzMDhFRTI0RTMwMDAwMjEwQzAwRgorOjEwQ0NGMDAwMjQ0MjUwMzgwMkUyMjAyMUFDOEQwMDAwQUM4RTAwMDRBQQorOjEwQ0QwMDAwNTRBMDAwMDYyNDBCMDAwMThGODIwMDU0MDEyMjEwMjMzRQorOjEwQ0QxMDAwMkM0MjAwMzMxNDQwRkY5RDAwMDAwMDAwMzE2MzAwRkZFRgorOjEwQ0QyMDAwMjQwMjAwMDE1NDYyMDA3OUFGQTAwMDEwQUVFQTA2MDhBOAorOjEwQ0QzMDAwOEY4MzAwNTQ4RjgyMDA1NDI0NjkwMDMyMDEyMjEwMjMxMworOjEwQ0Q0MDAwMkM0MjAwMzMxMDQwMDA2MTAwMDA1ODIxMjQwRDAwMDhERgorOjEwQ0Q1MDAwMjQwQzAwMTEyNDA4MDAxMjI0MDcwMDQwMjQwQTAwMDFCQQorOjEwQ0Q2MDAwOEY4MzAxMjAyNzYyMzgwMDI0NjYwMDIwMDBDMjEwMkIyOAorOjEwQ0Q3MDAwNTA0MDAwMDEyNzY2MzAwMDhGODIwMTI4MTBDMjAwMDQ1NQorOjEwQ0Q4MDAwMDAwMDAwMDA4RjgyMDEyNDE0QzIwMDA3MDAwMDAwMDA5MAorOjEwQ0Q5MDAwOEVFMjAxQTQwMDAwMjgyMTI0NDIwMDAxQUVFMjAxQTQ5OQorOjEwQ0RBMDAwMDgwMDQzQTk4RUUyMDFBNDhFRTIwNjA4QUM2MjAwMUNEMgorOjEwQ0RCMDAwOEVFNDA0QTA4RUU1MDRBNDI0NjIwMDFDQUM2MjAwMDg4QQorOjEwQ0RDMDAwQTQ2RDAwMEVBQzZDMDAxOEFDNjQwMDAwQUM2NTAwMDRFRgorOjEwQ0REMDAwOEVFMjA0QzRBQzYyMDAxMEFGODYwMTIwOTJFMjRFMjBDNQorOjEwQ0RFMDAwMTQ0MDAwMzMyNDA1MDAwMThFRTI0RTMwMDAwMjEwQzBEMgorOjEwQ0RGMDAwMjQ0MjUwMzgwMkUyMjAyMThDODIwMDAwMTQ0ODAwMUY5NworOjEwQ0UwMDAwMDAwMDAwMDA4RUUzNEUzMDhFRTI0RTM0MTA2MjAwMUJCNAorOjEwQ0UxMDAwMDAwMDAwMDA4QzgyMDAwNDI0NDIwMDAxQUM4MjAwMDQ2NworOjEwQ0UyMDAwOEVFMjRFMzQ4RUUzNEUzMDI0NDIwMDAxMTA0NzAwMDc1QworOjEwQ0UzMDAwMDAwMDAwMDA4RUUyNEUzNDI0NDIwMDAxMTA2MjAwMDUyMgorOjEwQ0U0MDAwMDAwMDAwMDAwODAwNDM5NjAwMDAwMDAwMTQ2MDAwMDU4OAorOjEwQ0U1MDAwMDAwMDAwMDA4RjgyMDEyODI0NDIwMDIwQUY4MjAxMjhCOAorOjEwQ0U2MDAwOEY4MjAxMjg4QzgyMDAwNDJDNDIwMDExNTA0MDAwMTA1NworOjEwQ0U3MDAwQUM4MDAwMDAwODAwNDNBOTAwMDAwMDAwOEVFMjRFMzBBNAorOjEwQ0U4MDAwMjQ0MjAwMDE1MDQ3MDAwMzAwMDAxMDIxOEVFMjRFMzA4MgorOjEwQ0U5MDAwMjQ0MjAwMDFBRUUyNEUzMDhFRTI0RTMwMDAwMjEwQzA1RAorOjEwQ0VBMDAwMjQ0MjUwMzgwMkUyMjAyMUFDODgwMDAwQUM4QTAwMDQwMQorOjEwQ0VCMDAwNTRBMDAwMDYyNDBCMDAwMThGODIwMDU0MDEyMjEwMjM4RAorOjEwQ0VDMDAwMkM0MjAwMzMxNDQwRkZBNjAwMDAwMDAwMzE2MzAwRkYzNQorOjEwQ0VEMDAwMjQwMjAwMDE1NDYyMDAwM0FGQTAwMDEwMDgwMDQzRDZGMgorOjEwQ0VFMDAwMDAwMDAwMDAzQzA0MDAwMTI0ODQ1QTIwQUZBMDAwMTQ3QworOjEwQ0VGMDAwOEY4NjAxMjA4Rjg3MDEyNDNDMDUwMDA5MEMwMDI0MDM0NAorOjEwQ0YwMDAwMzRBNUYwMTEwODAwNDNENjAwMDAwMDAwM0MwNDAwMDFFNQorOjEwQ0YxMDAwMjQ4NDVBMkNBRkEwMDAxNDhGODYwMTIwOEY4NzAxMjQwRgorOjEwQ0YyMDAwM0MwNTAwMDkwQzAwMjQwMzM0QTVGMDEwMDgwMDQzRDY4QQorOjEwQ0YzMDAwMDAwMDAwMDAzQzA0MDAwMTI0ODQ1QTM4QUZBMDAwMTQxMworOjEwQ0Y0MDAwOEVFNjA2MDg4RjQ3MDIyODNDMDUwMDA5MEMwMDI0MDNFMgorOjEwQ0Y1MDAwMzRBNUYwMEY4RUUyMDFBQzI0NDIwMDAxQUVFMjAxQUMzOAorOjEwQ0Y2MDAwOEVFMjAxQUM4RUUyMDE1QzI0NDIwMDAxQUVFMjAxNUM4MworOjEwQ0Y3MDAwOEVFMjAxNUM4RkJGMDAyMDAzRTAwMDA4MjdCRDAwMjg3RgorOjEwQ0Y4MDAwM0MwMjAwMDE4QzQyNUNEODI3QkRGRkUwMTQ0MDAwMEQzQworOjEwQ0Y5MDAwQUZCRjAwMTgzQzA0MDAwMTI0ODQ1QTQ0M0MwNTAwMDgzQgorOjEwQ0ZBMDAwQUZBMDAwMTBBRkEwMDAxNDhGODYwMjIwMzRBNTA0OTkxMgorOjEwQ0ZCMDAwMjQwMjAwMDEzQzAxMDAwMUFDMjI1Q0Q4MEMwMDI0MDNENworOjEwQ0ZDMDAwMDAwMDM4MjE4RUUyMDREMDNDMDMwMDAxMDA3NzE4MjFENAorOjEwQ0ZEMDAwOTQ2MzgzQjIzNDQyMDAwMTEwNjAwMDA3QUVFMjA0RDBEMworOjEwQ0ZFMDAwOEY4MjAyMjAzQzAzMDhGRjM0NjNGRkZGMDA0MzEwMjRCQworOjEwQ0ZGMDAwMzQ0MjAwMDhBRjgyMDIyMDAwMDAyMDIxMEMwMDUyQTIxRgorOjEwRDAwMDAwMjQwNTAwMDRBRjQyMDI2ODhGQkYwMDE4MDNFMDAwMDg0NworOjEwRDAxMDAwMjdCRDAwMjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwQworOjEwRDAyMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorOjEwRDAzMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBGMAorOjEwRDA0MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFMAorOjEwRDA1MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBEMAorOjEwRDA2MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBDMAorOjEwRDA3MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBCMAorOjEwRDA4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBBMAorOjEwRDA5MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA5MAorOjEwRDBBMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA4MAorOjEwRDBCMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA3MAorOjEwRDBDMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA2MAorOjEwRDBEMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA1MAorOjEwRDBFMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA0MAorOjEwRDBGMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAzMAorOjEwRDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM0MxMjAwMDFEMAorOjEwRDExMDAwMjY1MjEyMDAzQzE0MDAwMThFOTQ1QzUwM0MxMDAwMDExOQorOjEwRDEyMDAwMjYxMDExMjAzQzE1QzAwMDM2QjUwMDYwOEU4QTAwMDAyNAorOjEwRDEzMDAwOEVCMzAwMDAwMjZBNDAwQjAyNDgwMDBBMDIwMEY4MjE4OAorOjEwRDE0MDAwMDAwMDAwMDAwMDAwMDAwRDAwMDAwMDAwMDAwMDAwMDBEMgorOjEwRDE1MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBDRgorOjEwRDE2MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBCRgorOjEwRDE3MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBBRgorOjEwRDE4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA5RgorOjEwRDE5MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA4RgorOjEwRDFBMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA3RgorOjEwRDFCMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA2RgorOjEwRDFDMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA1RgorOjEwRDFEMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA0RgorOjEwRDFFMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAzRgorOjEwRDFGMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyRgorOjEwRDIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDgwMDE0RDYyQworOjEwRDIxMDAwMDAwMDAwMDAwODAwMTREODNDMEEwMDAxMDgwMDE0RDhERgorOjEwRDIyMDAwM0MwQTAwMDIwODAwMTREODAwMDAwMDAwMDgwMDI0QTZGMAorOjEwRDIzMDAwMDAwMDAwMDAwODAwMTREODNDMEEwMDAzMDgwMDE0RDhCRAorOjEwRDI0MDAwM0MwQTAwMDQwODAwMkY4QzAwMDAwMDAwMDgwMDE0RDhERAorOjEwRDI1MDAwM0MwQTAwMDUwODAwM0NFODAwMDAwMDAwMDgwMDNDNjZBRAorOjEwRDI2MDAwMDAwMDAwMDAwODAwMTREODNDMEEwMDA2MDgwMDE0RDg4QQorOjEwRDI3MDAwM0MwQTAwMDcwODAwMTREODAwMDAwMDAwMDgwMDE0RDg3OQorOjEwRDI4MDAwMDAwMDAwMDAwODAwMTREODAwMDAwMDAwMDgwMDJBNzUwMworOjEwRDI5MDAwMDAwMDAwMDAwODAwMTREODNDMEEwMDBCMDgwMDE0RDg1NQorOjEwRDJBMDAwM0MwQTAwMEMwODAwMTREODNDMEEwMDBEMDgwMDIzN0E0MAorOjEwRDJCMDAwMDAwMDAwMDAwODAwMjMzOTAwMDAwMDAwMDgwMDE0RDgxNgorOjEwRDJDMDAwM0MwQTAwMEUwODAwMUIzQzAwMDAwMDAwMDgwMDI0QTREQgorOjEwRDJEMDAwMDAwMDAwMDAwODAwMTREODNDMEEwMDBGMDgwMDQwQTcxNgorOjEwRDJFMDAwMDAwMDAwMDAwODAwNDA5MTAwMDAwMDAwMDgwMDE0RDg3MQorOjEwRDJGMDAwM0MwQTAwMTAwODAwMTRFRTAwMDAwMDAwMDgwMDE0RDhEQQorOjEwRDMwMDAwM0MwQTAwMTEwODAwMTREODNDMEEwMDEyMDgwMDE0RDg4NgorOjEwRDMxMDAwM0MwQTAwMTMwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBCNAorOjEwRDMyMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBGRAorOjEwRDMzMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFRAorOjEwRDM0MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBERAorOjEwRDM1MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBDRAorOjEwRDM2MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBCRAorOjEwRDM3MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBBRAorOjEwRDM4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA5RAorOjEwRDM5MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA4RAorOjEwRDNBMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA3RAorOjEwRDNCMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA2RAorOjEwRDNDMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA1RAorOjEwRDNEMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA0RAorOjEwRDNFMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAzRAorOjEwRDNGMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyRAorOjEwRDQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM0MwMzAwMDFEQworOjEwRDQxMDAwMzQ2MzM4MDAyNDA1MDA4MDI0MDQwMDFGMjQwNkZGRkYyNQorOjEwRDQyMDAwMjQwMjAwMDFBRjgwMDIxQ0FGODIwMjAwQUY4MjAyMjAwMgorOjEwRDQzMDAwMDM2MzEwMjFBRjgyMDBDMDAzNjMxMDIxQUY4MjAwQzREOAorOjEwRDQ0MDAwMDM2MzEwMjFBRjgyMDBDODI3NjIzODAwQUY4MjAwRDA4QQorOjEwRDQ1MDAwMjc2MjM4MDBBRjgyMDBENDI3NjIzODAwQUY4MjAwRDgzQworOjEwRDQ2MDAwMjc2MjE4MDBBRjgyMDBFMDI3NjIxODAwQUY4MjAwRTQ1NAorOjEwRDQ3MDAwMjc2MjE4MDBBRjgyMDBFODI3NjIxMDAwQUY4MjAwRjAzOAorOjEwRDQ4MDAwMjc2MjEwMDBBRjgyMDBGNDI3NjIxMDAwQUY4MjAwRjgxQworOjEwRDQ5MDAwQUNBMDAwMDAyNDg0RkZGRjE0ODZGRkZEMjRBNTAwMDQzNworOjEwRDRBMDAwOEY4MzAwNDAzQzAyRjAwMDAwNjIxODI0M0MwMjUwMDBEMAorOjEwRDRCMDAwMTA2MjAwMEMwMDQzMTAyQjE0NDAwMDA2M0MwMjYwMDA3OAorOjEwRDRDMDAwM0MwMjQwMDAxMDYyMDAwODI0MDIwODAwMDgwMDQ1MzlCMAorOjEwRDREMDAwMDAwMDAwMDAxMDYyMDAwNDI0MDIwODAwMDgwMDQ1MzkyMgorOjEwRDRFMDAwMDAwMDAwMDAyNDAyMDcwMDNDMDEwMDAxQUMyMjVDRENDQgorOjEwRDRGMDAwMDNFMDAwMDgwMDAwMDAwMDI3QkRGRkQ4QUZCRjAwMjRGNAorOjEwRDUwMDAwQUZCMDAwMjA4RjgzMDA1NDhGODIwMDU0M0MwMTAwMDE5MworOjEwRDUxMDAwQUMyMDVDQzQwODAwNDU0NTI0NjMwMDY0OEY4MjAwNTQzRAorOjEwRDUyMDAwMDA2MjEwMjMyQzQyMDA2NTE0NDBGRkZDMDAwMDAwMDA0NAorOjEwRDUzMDAwMEMwMDRENzEwMDAwMDAwMDI0MDQwMDAxMDAwMDI4MjFBRgorOjEwRDU0MDAwMjdBNjAwMTgzNDAyODAwMDBDMDA0OThFQTdBMjAwMThGQworOjEwRDU1MDAwOEY4MzAwNTQ4RjgyMDA1NDA4MDA0NTU2MjQ2MzAwNjQ3MgorOjEwRDU2MDAwOEY4MjAwNTQwMDYyMTAyMzJDNDIwMDY1MTQ0MEZGRkM5RgorOjEwRDU3MDAwMjQwNDAwMDEyNDA1MDAwMTBDMDA0OTRDMjdBNjAwMThEMgorOjEwRDU4MDAwOEY4MzAwNTQ4RjgyMDA1NDA4MDA0NTYyMjQ2MzAwNjQzNgorOjEwRDU5MDAwOEY4MjAwNTQwMDYyMTAyMzJDNDIwMDY1MTQ0MEZGRkM2RgorOjEwRDVBMDAwMjQwNDAwMDEyNDA1MDAwMTBDMDA0OTRDMjdBNjAwMThBMgorOjEwRDVCMDAwOEY4MzAwNTQ4RjgyMDA1NDA4MDA0NTZFMjQ2MzAwNjRGQQorOjEwRDVDMDAwOEY4MjAwNTQwMDYyMTAyMzJDNDIwMDY1MTQ0MEZGRkMzRgorOjEwRDVEMDAwMjQwNDAwMDEzQzA2MDAwMTI0QzY1REEwMEMwMDQ5NEM1NworOjEwRDVFMDAwMjQwNTAwMDI4RjgzMDA1NDhGODIwMDU0MDgwMDQ1N0I3RAorOjEwRDVGMDAwMjQ2MzAwNjQ4RjgyMDA1NDAwNjIxMDIzMkM0MjAwNjU3MworOjEwRDYwMDAwMTQ0MEZGRkMyNDA0MDAwMTI0MDUwMDAzM0MxMDAwMDEyOQorOjEwRDYxMDAwMjYxMDVEQTIwQzAwNDk0QzAyMDAzMDIxOTdBNjAwMTg4QworOjEwRDYyMDAwM0MwNzAwMDE5NEU3NURBMDNDMDQwMDAxMjQ4NDVBQjA0QgorOjEwRDYzMDAwQUZBMDAwMTQ5NjAyMDAwMDNDMDUwMDBEMzRBNTAxMDBDNworOjEwRDY0MDAwMEMwMDI0MDNBRkEyMDAxMDk3QTIwMDE4MTA0MDAwNEM1OQorOjEwRDY1MDAwMjQwMzYwNDA5NjAyMDAwMDMwNDJGRkYwMTQ0MzAwMEFBOQorOjEwRDY2MDAwMjQwMjAwMjAzQzAzMDAwMTk0NjM1REEwNTQ2MjAwMDk4MQorOjEwRDY3MDAwMjQwMjc4MzAyNDAyMDAwMzNDMDEwMDAxQUMyMjVDQzQ4NworOjEwRDY4MDAwMDgwMDQ1QUMyNDAyMDAwNTNDMDMwMDAxOTQ2MzVEQTA0MgorOjEwRDY5MDAwMjQwMjc4MzAxNDYyMDAwRjI0MDMwMDEwM0MwMjAwMDFDMQorOjEwRDZBMDAwOTQ0MjVEQTIzMDQyRkZGMDE0NDMwMDBBMjQwMjAwMDNCQQorOjEwRDZCMDAwM0MwMTAwMDFBQzIyNUNDNDI0MDIwMDA2M0MwMTAwMDFENAorOjEwRDZDMDAwQUMyMjVEQjAzQzAxMDAwMUFDMjI1REJDMDgwMDQ1RTYyNworOjEwRDZEMDAwM0MwOUZGRjAzQzAyMDAwMThDNDI1Q0M0M0MwMzAwMDFBOQorOjEwRDZFMDAwOTQ2MzVEQTAzNDQyMDAwMTNDMDEwMDAxQUMyMjVDQzRBMworOjEwRDZGMDAwMjQwMjAwMTUxNDYyMDAwRjAwMDAwMDAwM0MwMjAwMDEyQgorOjEwRDcwMDAwOTQ0MjVEQTIzMDQyRkZGMDM4NDNGNDIwMkM2MzAwMDFDNAorOjEwRDcxMDAwMzg0MkY0MzAyQzQyMDAwMTAwNjIxODI1MTA2MDAwMDVFOAorOjEwRDcyMDAwMjQwMjAwMDMzQzAxMDAwMUFDMjI1REJDMDgwMDQ1RTY3OAorOjEwRDczMDAwM0MwOUZGRjAzQzAzMDAwMTk0NjM1REEwMjQwMjc4MTBEMworOjEwRDc0MDAwMTQ2MjAwMEIyNDAyMDAwMjNDMDIwMDAxOTQ0MjVEQTIxQworOjEwRDc1MDAwMzA0MkZGRjAxNDQwMDAwNjI0MDIwMDAyMjQwMjAwMDRCQworOjEwRDc2MDAwM0MwMTAwMDFBQzIyNURCQzA4MDA0NUU2M0MwOUZGRjAyRAorOjEwRDc3MDAwM0MwMTAwMDFBQzIyNURCQzA4MDA0NUU2M0MwOUZGRjAxRAorOjEwRDc4MDAwM0MwMjAwMDE4QzQyNUNDNDI0MDMwMDAxM0MwMTAwMDEwNgorOjEwRDc5MDAwQUMyMzVEQkMzNDQyMDAwNDNDMDEwMDAxQUMyMjVDQzRGQgorOjEwRDdBMDAwM0MwOUZGRjAzNTI5QkRDMDNDMDYwMDAxOENDNjVDQzRCNQorOjEwRDdCMDAwM0MwNDAwMDEyNDg0NUFCMDI0MDIwMDAxM0MwMTAwMDExMQorOjEwRDdDMDAwQUMyMjVDQ0M4RjgyMDA1NDNDMDcwMDAxOENFNzVEQkMyRQorOjEwRDdEMDAwM0MwMzAwMDE5NDYzNURBMDNDMDgwMDAxOTUwODVEQTIzNAorOjEwRDdFMDAwM0MwNTAwMEQzNEE1MDEwMDNDMDEwMDAxQUMyMDVDQzhFMworOjEwRDdGMDAwMDA0OTEwMjEzQzAxMDAwMUFDMjI1REFDQUZBMzAwMTAzOAorOjEwRDgwMDAwMEMwMDI0MDNBRkE4MDAxNDhGQkYwMDI0OEZCMDAwMjBBOQorOjEwRDgxMDAwMDNFMDAwMDgyN0JEMDAyODI3QkRGRkU4M0MwNTAwMDEwNAorOjEwRDgyMDAwOENBNTVDQzgyNDA2MDAwNDI0MDIwMDAxMTRBMjAwMTQ4NAorOjEwRDgzMDAwQUZCRjAwMTAzQzAyMDAwMThDNDI3RTNDMzA0MjgwMDBCMQorOjEwRDg0MDAwMTA0MDAwMDUzQzA0MDAwRjNDMDMwMDAxOEM2MzVEQkNFQworOjEwRDg1MDAwMDgwMDQ2MTczNDg0NDI0MDNDMDQwMDA0M0MwMzAwMDFBNQorOjEwRDg2MDAwOEM2MzVEQkMzNDg0OTNFMDI0MDIwMDA1MTQ2MjAwMTZDRQorOjEwRDg3MDAwMDAwMDAwMDAzQzA0MDAzRDA4MDA0NjJGMzQ4NDA5MDBFRAorOjEwRDg4MDAwM0MwMjAwMDE4QzQyN0UzODMwNDI4MDAwMTA0MDAwMDU4RQorOjEwRDg5MDAwM0MwNDAwMUUzQzAzMDAwMThDNjM1REJDMDgwMDQ2MkE2QQorOjEwRDhBMDAwMzQ4NDg0ODAzQzA0MDAwRjNDMDMwMDAxOEM2MzVEQkMyNQorOjEwRDhCMDAwMzQ4NDQyNDAyNDAyMDAwNTE0NjIwMDAzMDAwMDAwMDA4QQorOjEwRDhDMDAwM0MwNDAwN0EzNDg0MTIwMDNDMDIwMDAxOEM0MjVEQUNCRQorOjEwRDhEMDAwOEY4MzAwNTQwMDQ0MTAyMTAwNDMxMDIzMDA0NDEwMkI3OAorOjEwRDhFMDAwMTQ0MDAwMzcwMDAwMDAwMDNDMDIwMDAxOEM0MjVDRDA3NAorOjEwRDhGMDAwMTQ0MDAwMzMwMDAwMDAwMDNDMDEwMDAxMTBDMDAwMjU2RQorOjEwRDkwMDAwQUMyMDVDRTAzQzA5MDAwMThEMjk1Q0M0MjQwNzAwMDFDNworOjEwRDkxMDAwM0MwNDQwMDAzQzA4MDAwMTI1MDg3RTNDMjUwQUZGRkMzMQorOjEwRDkyMDAwMDAwNTI4NDIxNEEwMDAwMjI0QzZGRkZGMjQwNTAwMDhCOQorOjEwRDkzMDAwMDBBOTEwMjQxMDQwMDAxMDAwMDAwMDAwMTRBNzAwMDhFNworOjEwRDk0MDAwMDAwMDAwMDA4RDAyMDAwMDAwNDQxMDI0MTA0MDAwMEE3NgorOjEwRDk1MDAwMDAwMDAwMDAzQzAxMDAwMTA4MDA0NjVCQUMyNTVDRTBEMworOjEwRDk2MDAwOEQ0MjAwMDAwMDQ0MTAyNDEwNDAwMDAzMDAwMDAwMDAxRAorOjEwRDk3MDAwM0MwMTAwMDFBQzI3NUNFMDNDMDIwMDAxOEM0MjVDRTAxMQorOjEwRDk4MDAwMDAwNjE4MkIyQzQyMDAwMTAwNDMxMDI0NTQ0MEZGRTVGMAorOjEwRDk5MDAwMDAwNTI4NDI4RjgyMDA1NDNDMDMwMDAxOEM2MzVDRTA0OAorOjEwRDlBMDAwM0MwMTAwMDFBQzIyNURBQzEwNjAwMDJBMjQwMjAwMDFBMQorOjEwRDlCMDAwM0MwMTAwMDFBQzI1NUNDODNDMDEwMDAxQUMyMjVDQ0MwMAorOjEwRDlDMDAwM0MwMjAwMDE4QzQyNUNFMDEwNDAwMDIyMDAwMDAwMDA5QworOjEwRDlEMDAwM0MwMjAwMDE4QzQyNUNDQzEwNDAwMDBBMjQwMjAwMDE5MQorOjEwRDlFMDAwM0MwMTAwMDFBQzIwNUNDQzNDMDEwMDAxMDAzNzA4MjE2NworOjEwRDlGMDAwQUMyMjgzQUMzQzAxMDAwMUFDMjA1RDRDM0MwMTAwMDEzOQorOjEwREEwMDAwQUMyMjVEMDQzQzAzMDAwMTAwNzcxODIxOEM2MzgzQUNEOQorOjEwREExMDAwMjQwMjAwMDgxMDYyMDAwNTI0MDIwMDAxMEMwMDQ2OTU1MworOjEwREEyMDAwMDAwMDAwMDAwODAwNDY5MjAwMDAwMDAwM0MwMzAwMDFENgorOjEwREEzMDAwOEM2MzVDQzgxMDYyMDAwNzI0MDIwMDBFM0MwMzAwMDFFNgorOjEwREE0MDAwOEM2MzdERDAxMDYyMDAwMzAwMDAwMDAwMEMwMDRFNTQ3NworOjEwREE1MDAwOEY4NDAyMjA4RkJGMDAxMDAzRTAwMDA4MjdCRDAwMTg0QworOjEwREE2MDAwMjdCREZGRTAzQzAyRkRGRkFGQkYwMDE4OEVFMzAwMDBDMgorOjEwREE3MDAwM0MwNTAwMDE4Q0E1NUNDODNDMDQwMDAxOEM4NDVDRjA3MgorOjEwREE4MDAwMzQ0MkZGRkYwMDYyMTgyNDE0QTQwMDA4QUVFMzAwMDAzMworOjEwREE5MDAwM0MwMzAwMDEwMDc3MTgyMThDNjM4M0FDM0MwMjAwMDEzOQorOjEwREFBMDAwOEM0MjVDRjQxMDYyMDAwODAwMDAwMDAwM0MwMjAwMDE5RgorOjEwREFCMDAwMDA1NzEwMjE4QzQyODNBQzNDMDEwMDAxQUMyNTVDRjA4NgorOjEwREFDMDAwM0MwMTAwMDFBQzIyNUNGNDNDMDMwMDAxOEM2MzVDQzhBNworOjEwREFEMDAwMjQwMjAwMDIxMDYyMDE2OTJDNjIwMDAzMTA0MDAwMDU1QworOjEwREFFMDAwMjQwMjAwMDExMDYyMDAwODAwMDAwMDAwMDgwMDQ4MUMyOQorOjEwREFGMDAwMDAwMDAwMDAyNDAyMDAwNDEwNjIwMEIxMjQwMjAwMDFCMgorOjEwREIwMDAwMDgwMDQ4MUQwMDAwMDAwMDNDMDIwMDAxMDA1NzEwMjFFMQorOjEwREIxMDAwOEM0MjgzQUMyNDQzRkZGRjJDNjIwMDA4MTA0MDAxNUE2MgorOjEwREIyMDAwMDAwMzEwODAzQzAxMDAwMTAwMjIwODIxOEMyMjVBQzgwOQorOjEwREIzMDAwMDA0MDAwMDgwMDAwMDAwMDNDMDMwMDAxOEM2MzVEQkM1NQorOjEwREI0MDAwMjQwMjAwMDUxNDYyMDAxNDAwMDAwMDAwM0MwMjAwMDFFMQorOjEwREI1MDAwOEM0MjVDRDQxMDQwMDAwQTI0MDIwMDAzMEMwMDQ4MjJDRQorOjEwREI2MDAwMDAwMDAwMDAyNDAyMDAwMjNDMDEwMDAxMDAzNzA4MjFFRgorOjEwREI3MDAwQUMyMjgzQUMzQzAxMDAwMTA4MDA0NkUwQUMyMDVDRDQ0MAorOjEwREI4MDAwM0MwMTAwMDEwMDM3MDgyMUFDMjI4M0FDM0MwMTAwMDFCQworOjEwREI5MDAwMDgwMDQ4MUZBQzIwNUM2MDBDMDA0ODIyMDAwMDAwMDAxOAorOjEwREJBMDAwM0MwMjAwMDE4QzQyNUNENDNDMDEwMDAxQUMyMDVDNjA3MgorOjEwREJCMDAwMTA0MDAwREQyNDAyMDAwMjNDMDEwMDAxMDAzNzA4MjE3MgorOjEwREJDMDAwQUMyMjgzQUMzQzAxMDAwMTA4MDA0ODFGQUMyMDVDRDRBRgorOjEwREJEMDAwM0MwMzAwMDE4QzYzNURCQzI0MDIwMDA1MTQ2MjAwMDM1OQorOjEwREJFMDAwMjQwMjAwMDEzQzAxMDAwMUFDMjI1RDAwMEMwMDQ5Q0Y4MQorOjEwREJGMDAwMDAwMDAwMDAzQzAzMDAwMThDNjM1RDAwMDgwMDQ3OEVCQworOjEwREMwMDAwMjQwMjAwMTEzQzA1MDAwMThDQTU1Q0M4M0MwNjAwMDEwMworOjEwREMxMDAwOENDNjdFM0MwQzAwNTEwODAwMDAyMDIxMjQwMjAwMDUyNworOjEwREMyMDAwM0MwMTAwMDFBQzIwNUNENDNDMDEwMDAxMDAzNzA4MjExQworOjEwREMzMDAwMDgwMDQ4MUZBQzIyODNBQzNDMDQwMDAxMjQ4NDVBQkM3OQorOjEwREM0MDAwM0MwNTAwMEYzNEE1MDEwMDAwMDAzMDIxMDAwMDM4MjEwMAorOjEwREM1MDAwQUZBMDAwMTAwQzAwMjQwM0FGQTAwMDE0MDgwMDQ4MUY2MAorOjEwREM2MDAwMDAwMDAwMDA4RjgyMDIyMDNDMDNGNzAwMDA0MzEwMjVEMworOjEwREM3MDAwMDgwMDQ3QjdBRjgyMDIyMDhGODIwMjIwM0MwMzAwMDRENQorOjEwREM4MDAwMDA0MzEwMjQxNDQwMDBBOTI0MDIwMDA3OEY4MzAwNTQ4RAorOjEwREM5MDAwM0MwMjAwMDE4QzQyNURBNDI0NjNEOEYwMDA0MzEwMjNCMQorOjEwRENBMDAwMkM0MjI3MTAxNDQwMDBGODI0MDIwMDAxMDgwMDQ4MURFRgorOjEwRENCMDAwMDAwMDAwMDAzQzA1MDAwMThDQTU1Q0M4MEMwMDUyQTJDRAorOjEwRENDMDAwMDAwMDIwMjEwQzAwNTM4NjAwMDAyMDIxM0MwMzAwMDFBRAorOjEwRENEMDAwOEM2MzdFMzQwNDYxMDBFQTI0MDIwMDAxM0MwMjAwMDhFNworOjEwRENFMDAwMDA2MjEwMjQxMDQwMDAwNjAwMDAwMDAwOEY4MjAyMTQyMQorOjEwRENGMDAwM0MwM0ZGRkYwMDQzMTAyNDA4MDA0NzQxMzQ0MjI1MUYyNgorOjEwREQwMDAwOEY4MjAyMTQzQzAzRkZGRjAwNDMxMDI0MzQ0MjI0MUY3RgorOjEwREQxMDAwQUY4MjAyMTQ4RUUyMDAwMDNDMDMwMjAwMDA0MzEwMjU5MworOjEwREQyMDAwQUVFMjAwMDA4RjgyMDIyMDI0MDNGRkZCMDA0MzEwMjQ5OAorOjEwREQzMDAwQUY4MjAyMjA4RjgyMDIyMDM0NDIwMDAyQUY4MjAyMjA5MgorOjEwREQ0MDAwMjQwMjAwMDgzQzAxMDAwMTAwMzcwODIxQUMyMjgzQUMwQQorOjEwREQ1MDAwOEY4MjAyMjAzQzAzMDAwNDAwNDMxMDI0MTQ0MDAwMDU3RAorOjEwREQ2MDAwMDAwMDAwMDA4RjgyMDIyMDNDMDNGNzAwMDA0MzEwMjVEMgorOjEwREQ3MDAwQUY4MjAyMjAzQzAzMDAwMThDNjM1REJDMjQwMjAwMDVERAorOjEwREQ4MDAwMTQ2MjAwMEEwMDAwMDAwMDNDMDIwMDAxOTQ0MjVEQTJGRgorOjEwREQ5MDAwMjQ0MjlGQkMyQzQyMDAwNDEwNDAwMDA0MjQwNDAwMThCQworOjEwRERBMDAwMjQwNTAwMDIwQzAwNEQ5MzI0MDYwMDIwMEMwMDQzRERFNgorOjEwRERCMDAwMDAwMDAwMDAzQzAxMDAwMTA4MDA0ODFGQUMyMDVENTAzRAorOjEwRERDMDAwM0MwMjAwMDEwMDU3MTAyMThDNDI4M0FDMjQ0M0ZGRkYyQQorOjEwREREMDAwMkM2MjAwMDgxMDQwMDBBQzAwMDMxMDgwM0MwMTAwMDFFMAorOjEwRERFMDAwMDAyMjA4MjE4QzIyNUFFODAwNDAwMDA4MDAwMDAwMDBCMAorOjEwRERGMDAwMEMwMDQyOUIwMDAwMDAwMDNDMDEwMDAxQUMyMDVDQ0MwOAorOjEwREUwMDAwQUY4MDAyMDQzQzAxMDAwMTBDMDA0ODIyQUMyMDdFMjBCRgorOjEwREUxMDAwMjQwMjAwMDEzQzAxMDAwMUFDMjI1Q0U0MjQwMjAwMDI2NworOjEwREUyMDAwM0MwMTAwMDEwMDM3MDgyMTA4MDA0ODFGQUMyMjgzQUNFOAorOjEwREUzMDAwMEMwMDQ4OUYwMDAwMDAwMDNDMDMwMDAxOEM2MzVDRTQ4MAorOjEwREU0MDAwMjQwMjAwMDkxNDYyMDA5MDI0MDIwMDAzM0MwMTAwMDEzNgorOjEwREU1MDAwMDAzNzA4MjEwODAwNDgxRkFDMjI4M0FDM0MwMjAwMDFCNworOjEwREU2MDAwOEM0MjdFMzgzMDQyNDAwMDEwNDAwMDA1MDAwMDAwMDAyNworOjEwREU3MDAwOEY4MjAwNDQzQzAzRkZGRjA4MDA0NzlGMzQ2MzdGRkYwRAorOjEwREU4MDAwOEY4MjAwNDQyNDAzRkY3RjAwNDMxMDI0QUY4MjAwNDRBQworOjEwREU5MDAwOEY4MzAwNTQwODAwNDdCOTI0MDIwMDA0OEY4MzAwNTQ4NAorOjEwREVBMDAwM0MwMjAwMDE4QzQyNURBNDI0NjNEOEYwMDA0MzEwMjM5RgorOjEwREVCMDAwMkM0MjI3MTAxNDQwMDA3NDI0MDIwMDA1M0MwMTAwMDE4QworOjEwREVDMDAwMDAzNzA4MjEwODAwNDgxRkFDMjI4M0FDOEY4MjAyMjA1MworOjEwREVEMDAwM0MwM0Y3MDAwMDQzMTAyNUFGODIwMjIwQUY4MDAyMDQwQworOjEwREVFMDAwM0MwMTAwMDFBQzIwN0UyMDhGODMwMDU0MjQwMjAwMDZGOAorOjEwREVGMDAwM0MwMTAwMDEwMDM3MDgyMUFDMjI4M0FDM0MwMTAwMDE0OQorOjEwREYwMDAwMDgwMDQ4MUZBQzIzNURBNDhGODMwMDU0M0MwMjAwMDEyRAorOjEwREYxMDAwOEM0MjVEQTQyNDYzRkZGNjAwNDMxMDIzMkM0MjAwMEFDOAorOjEwREYyMDAwMTQ0MDAwNTkwMDAwMDAwMDI0MDIwMDA3M0MwMTAwMDFEOQorOjEwREYzMDAwMDAzNzA4MjEwODAwNDgxRkFDMjI4M0FDOEY4MjAyMjBFMgorOjEwREY0MDAwM0MwNEY3MDAwMDQ0MTAyNUFGODIwMjIwOEY4MjAyMjA5QgorOjEwREY1MDAwM0MwMzAzMDAwMDQzMTAyNDE0NDAwMDA1MDAwMDE4MjE3NgorOjEwREY2MDAwOEY4MjAyMjAyNDAzMDAwMTAwNDQxMDI1QUY4MjAyMjA4QQorOjEwREY3MDAwMTA2MDAwNDMyNDAyMDAwMThGODIwMjE0M0MwM0ZGRkY2MworOjEwREY4MDAwM0MwNDAwMDE4Qzg0NUQ5ODAwNDMxMDI0MzQ0MjI1MUYxQQorOjEwREY5MDAwQUY4MjAyMTQyNDAyMDAwODNDMDEwMDAxMDAzNzA4MjE2RQorOjEwREZBMDAwMTA4MDAwMEJBQzIyODNBQzNDMDIwMDAxOEM0MjVENzRGQgorOjEwREZCMDAwMTQ0MDAwMDcyNDAyMDAwMTNDMDEwMDAxQUMyMjdERDA4NgorOjEwREZDMDAwMEMwMDRFNTQ4Rjg0MDIyMDA4MDA0ODBDMDAwMDAwMDAxMgorOjEwREZEMDAwOEY4MjAyMjAzQzAzMDAwODAwNDMxMDI0MTQ0MDAwMTdFNQorOjEwREZFMDAwMjQwMjAwMEUzQzAxMDAwMUFDMjI3REQwOEVFMjAwMDAzNAorOjEwREZGMDAwMDAwMDIwMjEzQzAzMDIwMDAwNDMxMDI1MEMwMDUzODY0MgorOjEwRTAwMDAwQUVFMjAwMDA4RjgyMDIyMDI0MDNGRkZCMDA0MzEwMjRCNQorOjEwRTAxMDAwQUY4MjAyMjA4RjgyMDIyMDM0NDIwMDAyMEMwMDQzRERENgorOjEwRTAyMDAwQUY4MjAyMjAzQzA1MDAwMThDQTU1Q0M4MEMwMDUyQTIwNgorOjEwRTAzMDAwMDAwMDIwMjEwODAwNDgxRjAwMDAwMDAwM0MwMjAwMDFGMQorOjEwRTA0MDAwOEM0MjVENzQxMDQwMDAxMDAwMDAwMDAwM0MwMjAwMDE5MgorOjEwRTA1MDAwOEM0MjVENzAyNDQyRkZGRjNDMDEwMDAxQUMyMjVENzBFOAorOjEwRTA2MDAwMTQ0MDAwMDkyNDAyMDAwMjNDMDEwMDAxQUMyMDVENzQ1MAorOjEwRTA3MDAwM0MwMTAwMDEwODAwNDgxRkFDMjI1RDcwMjQwMjAwMDEzMQorOjEwRTA4MDAwM0MwMTAwMDFBQzIyNUNDQzhGQkYwMDE4MDNFMDAwMDgwQgorOjEwRTA5MDAwMjdCRDAwMjA4RjgyMDIwMDhGODIwMjIwOEY4MjAyMjAwMworOjEwRTBBMDAwMzQ0MjAwMDRBRjgyMDIyMDhGODIwMjAwM0MwNjAwMDE0RAorOjEwRTBCMDAwOENDNjVDQzgzNDQyMDAwNEFGODIwMjAwMjQwMjAwMDIxNQorOjEwRTBDMDAwMTBDMjAwM0EyQ0MyMDAwMzEwNDAwMDA1MjQwMjAwMDFENworOjEwRTBEMDAwMTBDMjAwMDgwMDAwMDAwMDA4MDA0ODY4MDAwMDAwMDBBRQorOjEwRTBFMDAwMjQwMjAwMDQxMEMyMDAxMzI0MDIwMDAxMDgwMDQ4Njg0MgorOjEwRTBGMDAwMDAwMDAwMDAzQzAzMDAwMThDNjM1Q0I4M0MwMjAwMDE5RQorOjEwRTEwMDAwOEM0MjVDQzAzQzA0MDAwMThDODQ1Q0RDM0MwNTAwMDE1QQorOjEwRTExMDAwOENBNTVDQkNBRjg2MDIwMEFGODYwMjIwMzQ2MzAwMjI2RgorOjEwRTEyMDAwMDA0NDEwMjUwMDQ1MTAyNTM0NDIwMDAyMDgwMDQ4NjdDRAorOjEwRTEzMDAwQUY4MzAyMDAzQzAzMDAwMThDNjM1RDk4QUY4MjAyMDA1NAorOjEwRTE0MDAwMTA2MDAwMDlBRjgyMDIyMDNDMDIwMDAxOEM0MjVENzQyNQorOjEwRTE1MDAwMTQ0MDAwMDUzQzAzM0YwMDNDMDIwMDAxOEM0MjVDQjBDRgorOjEwRTE2MDAwMDgwMDQ4NUIzNDYzMDBFMDNDMDIwMDAxOEM0MjVDQjA3NAorOjEwRTE3MDAwM0MwMzNGMDAzNDYzMDBFMjAwNDMxMDI1QUY4MjAyMDBGRAorOjEwRTE4MDAwM0MwMzAwMDE4QzYzNUNCNDNDMDRGNzAwM0MwMjAwMDFEQQorOjEwRTE5MDAwOEM0MjVDQzAzQzA1MDAwMThDQTU1Q0RDMDA2NDE4MjU0OQorOjEwRTFBMDAwMDA0MzEwMjUwMDQ1MTAyNUFGODIwMjIwMDNFMDAwMDgzRgorOjEwRTFCMDAwMDAwMDAwMDA4RjgyMDIyMDNDMDMwMDAxOEM2MzVDQzhEOQorOjEwRTFDMDAwMzQ0MjAwMDRBRjgyMDIyMDI0MDIwMDAxMTA2MjAwMEZEQQorOjEwRTFEMDAwMDAwMDAwMDA4RjgzMDA1NDhGODIwMDU0MjQ2MzAwMDJFQgorOjEwRTFFMDAwMDA2MjEwMjMyQzQyMDAwMzEwNDAwMDExMDAwMDAwMDBDOAorOjEwRTFGMDAwOEY4MjAwNTQwMDYyMTAyMzJDNDIwMDAzMTA0MDAwMEM1OAorOjEwRTIwMDAwMDAwMDAwMDAwODAwNDg3OTAwMDAwMDAwOEY4MzAwNTRERgorOjEwRTIxMDAwOEY4MjAwNTQwODAwNDg4NTI0NjMwMDA3OEY4MjAwNTREMQorOjEwRTIyMDAwMDA2MjEwMjMyQzQyMDAwODE0NDBGRkZDMDAwMDAwMDA5NAorOjEwRTIzMDAwOEY4NDAwRTAzMDgyMDAwNzEwNDAwMDBEMDAwMDAwMDBENQorOjEwRTI0MDAwOEY4MjAwNTQ4RjgzMDBFMDE0ODMwMDA5MjQ0NTAwMzIzQworOjEwRTI1MDAwOEY4MjAwNTQwMEEyMTAyMzJDNDIwMDMzMTA0MDAwMDQ4RgorOjEwRTI2MDAwMDAwMDAwMDA4RjgyMDBFMDEwODJGRkY5MDAwMDAwMDAzMworOjEwRTI3MDAwOEY4MjAyMjAyNDAzRkZGRDAwNDMxMDI0QUY4MjAyMjA3RQorOjEwRTI4MDAwMDNFMDAwMDgwMDAwMDAwMDNDMDMwMDAxOEM2MzVDRTQzNAorOjEwRTI5MDAwM0MwMjAwMDE4QzQyNUNFODUwNjIwMDA0MjQ2M0ZGRkZGMgorOjEwRTJBMDAwM0MwMTAwMDFBQzIzNUNFODI0NjNGRkZGMkM2MjAwMDkwMQorOjEwRTJCMDAwMTA0MDAwOUQwMDAzMTA4MDNDMDEwMDAxMDAyMjA4MjE1NQorOjEwRTJDMDAwOEMyMjVCMDgwMDQwMDAwODAwMDAwMDAwOEY4MjAwNDRBMAorOjEwRTJEMDAwMzQ0MjgwODBBRjgyMDA0NDhGODMwMDU0MDgwMDQ5Mzg2NAorOjEwRTJFMDAwMjQwMjAwMDI4RjgzMDA1NDNDMDIwMDAxOEM0MjVEQTg4RQorOjEwRTJGMDAwMjQ2M0Q4RjAwMDQzMTAyMzJDNDIyNzEwMTQ0MDAwOEFENgorOjEwRTMwMDAwMjQwMjAwMDMwODAwNDk0NTAwMDAwMDAwOEY4MjAwNDRGOQorOjEwRTMxMDAwM0MwM0ZGRkYzNDYzN0ZGRjAwNDMxMDI0QUY4MjAwNDRCRgorOjEwRTMyMDAwOEY4MzAwNTQwODAwNDkzODI0MDIwMDA0OEY4MzAwNTQ2RQorOjEwRTMzMDAwM0MwMjAwMDE4QzQyNURBODI0NjNGRkY2MDA0MzEwMjNEOQorOjEwRTM0MDAwMkM0MjAwMEExNDQwMDA3ODI0MDIwMDA1MDgwMDQ5NDVDOAorOjEwRTM1MDAwMDAwMDAwMDA4RjgyMDIyMDNDMDNGNzAwMDA0MzEwMjVEQworOjEwRTM2MDAwQUY4MjAyMjA4RjgyMDIyMDI0MDNGRkZCMDA0MzEwMjQ4RgorOjEwRTM3MDAwQUY4MjAyMjA4RjgyMDIyMDM0NDIwMDAyQUY4MjAyMjA0QworOjEwRTM4MDAwM0MwMjNGMDAzNDQyMDBFMEFGODIwMjAwOEY4MjAyMDA3NAorOjEwRTM5MDAwMjQwM0ZGRkQwMDQzMTAyNEFGODIwMjAwMjQwNDAwMDE4NworOjEwRTNBMDAwMzQwNUZGRkZBRjg0MDIwNDhGODMwMDU0OEY4MjAwNTQzMgorOjEwRTNCMDAwMDgwMDQ4RUMyNDYzMDAwMThGODIwMDU0MDA2MjEwMjM5RgorOjEwRTNDMDAwMkM0MjAwMDIxNDQwRkZGQzAwMDAwMDAwOEY4MjAyMjQ1NworOjEwRTNEMDAwMDAwNDIwNDAwMEE0MTAyQjEwNDBGRkYyMDAwMDAwMDBCOQorOjEwRTNFMDAwOEY4MjAyMjAzQzAzRjcwMDAwNDMxMDI1QUY4MjAyMjBGOQorOjEwRTNGMDAwOEY4MjAyMTQzQzAzRkZGRjAwNDMxMDI0MzQ0MjI1MUY4OAorOjEwRTQwMDAwQUY4MjAyMTQ4RjgyMDIyMDI0MDNGRkZCMDA0MzEwMjRGQQorOjEwRTQxMDAwQUY4MjAyMjA4RjgyMDIyMDNDMDRGNzAwMzQ4NDAwMDg3RgorOjEwRTQyMDAwMzQ0MjAwMDJBRjgyMDIyMDhGODIwMjIwM0MwMzNGMDA3MAorOjEwRTQzMDAwMzQ2MzAwRTIwMDQ0MTAyNUFGODIwMjIwQUY4MzAyMDA2MworOjEwRTQ0MDAwOEY4NDAwRjAyNzYyMTdGODE0ODIwMDAyMjQ4NTAwMDhFOAorOjEwRTQ1MDAwMjc2NTEwMDA4RjgyMDBGNDEwQTIwMDA3M0MwMzgwMDBBMworOjEwRTQ2MDAwMzQ2MzAwNDAzQzAyMDAwMTI0NDI1QzcwQUM4MjAwMDAzNgorOjEwRTQ3MDAwQUM4MzAwMDRBRjg1MDBGMDhGODMwMDU0MDgwMDQ5Mzg1NgorOjEwRTQ4MDAwMjQwMjAwMDY4RjgzMDA1NDNDMDIwMDAxOEM0MjVEQThFOAorOjEwRTQ5MDAwMjQ2M0ZGRjYwMDQzMTAyMzJDNDIwMDBBMTQ0MDAwMjI5QworOjEwRTRBMDAwMjQwMjAwMDcwODAwNDk0NTAwMDAwMDAwOEY4MjAwRTBCOAorOjEwRTRCMDAwQUY4MjAwRTQ4RjgyMDBFMEFGODIwMEU4OEY4MjAyMjAwQQorOjEwRTRDMDAwMzQ0MjAwMDRBRjgyMDIyMDhGODIwMjIwMjQwM0ZGRjcyRgorOjEwRTREMDAwMDA0MzEwMjRBRjgyMDIyMDhGODIwMDQ0MzQ0MjgwODBBNworOjEwRTRFMDAwQUY4MjAwNDQ4RjgzMDA1NDI0MDIwMDA4M0MwMTAwMDFFNQorOjEwRTRGMDAwQUMyMjVDRTQzQzAxMDAwMTA4MDA0OTQ3QUMyMzVEQTg2NAorOjEwRTUwMDAwOEY4MzAwNTQzQzAyMDAwMThDNDI1REE4MjQ2M0Q4RjA0NAorOjEwRTUxMDAwMDA0MzEwMjMyQzQyMjcxMDE0NDAwMDAzMjQwMjAwMDk1QQorOjEwRTUyMDAwM0MwMTAwMDFBQzIyNUNFNDAzRTAwMDA4MDAwMDAwMDBCNAorOjEwRTUzMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMjdCREZGRDgyMAorOjEwRTU0MDAwQUZCMjAwMTgwMDgwOTAyMUFGQjMwMDFDMDBBMDk4MjE0QQorOjEwRTU1MDAwQUZCMTAwMTQwMEMwODgyMUFGQjAwMDEwMDAwMDgwMjFDRQorOjEwRTU2MDAwQUZCRjAwMjBBNjIwMDAwMDBDMDA0RDRCMjQwNDAwMDE4QQorOjEwRTU3MDAwMjYxMDAwMDEyRTAyMDAyMDE0NDBGRkZCMDAwMDAwMDBDNgorOjEwRTU4MDAwMEMwMDRENEIwMDAwMjAyMTBDMDA0RDRCMjQwNDAwMDFEOQorOjEwRTU5MDAwMEMwMDRENEIyNDA0MDAwMTBDMDA0RDRCMDAwMDIwMjFDOQorOjEwRTVBMDAwMjQxMDAwMTAwMjUwMTAyNDEwNDAwMDAyMDAwMDIwMjEwRQorOjEwRTVCMDAwMjQwNDAwMDEwQzAwNEQ0QjAwMTA4MDQyMTYwMEZGRkFBRAorOjEwRTVDMDAwMDI1MDEwMjQyNDEwMDAxMDAyNzAxMDI0MTA0MDAwMDI4OQorOjEwRTVEMDAwMDAwMDIwMjEyNDA0MDAwMTBDMDA0RDRCMDAxMDgwNDI1QgorOjEwRTVFMDAwMTYwMEZGRkEwMjcwMTAyNDBDMDA0RDcxMzQxMDgwMDBFOAorOjEwRTVGMDAwMEMwMDRENzEwMDAwMDAwMDBDMDA0RDJCMDAwMDAwMDBDRAorOjEwRTYwMDAwNTA0MDAwMDUwMDEwODA0Mjk2MjIwMDAwMDA1MDEwMjU2NgorOjEwRTYxMDAwQTYyMjAwMDAwMDEwODA0MjE2MDBGRkY3MDAwMDAwMDA1NAorOjEwRTYyMDAwMEMwMDRENzEwMDAwMDAwMDhGQkYwMDIwOEZCMzAwMUM1NAorOjEwRTYzMDAwOEZCMjAwMTg4RkIxMDAxNDhGQjAwMDEwMDNFMDAwMDhGMworOjEwRTY0MDAwMjdCRDAwMjgyN0JERkZEOEFGQjEwMDE0MDA4MDg4MjE2NgorOjEwRTY1MDAwQUZCMjAwMTgwMEEwOTAyMUFGQjMwMDFDMDBDMDk4MjFGOQorOjEwRTY2MDAwQUZCMDAwMTAwMDAwODAyMUFGQkYwMDIwMEMwMDRENEI2OAorOjEwRTY3MDAwMjQwNDAwMDEyNjEwMDAwMTJFMDIwMDIwMTQ0MEZGRkI5QworOjEwRTY4MDAwMDAwMDAwMDAwQzAwNEQ0QjAwMDAyMDIxMEMwMDRENEIwMQorOjEwRTY5MDAwMjQwNDAwMDEwQzAwNEQ0QjAwMDAyMDIxMEMwMDRENEJDOAorOjEwRTZBMDAwMjQwNDAwMDEyNDEwMDAxMDAyMzAxMDI0MTA0MDAwMDI0NQorOjEwRTZCMDAwMDAwMDIwMjEyNDA0MDAwMTBDMDA0RDRCMDAxMDgwNDI3QQorOjEwRTZDMDAwMTYwMEZGRkEwMjMwMTAyNDI0MTAwMDEwMDI1MDEwMjQwQgorOjEwRTZEMDAwMTA0MDAwMDIwMDAwMjAyMTI0MDQwMDAxMEMwMDRENEJEQQorOjEwRTZFMDAwMDAxMDgwNDIxNjAwRkZGQTAyNTAxMDI0MEMwMDRENEIxRgorOjEwRTZGMDAwMjQwNDAwMDEwQzAwNEQ0QjAwMDAyMDIxMzQxMDgwMDA0OAorOjEwRTcwMDAwOTY2MjAwMDAwMDUwMTAyNDEwNDAwMDAyMDAwMDIwMjFGQQorOjEwRTcxMDAwMjQwNDAwMDEwQzAwNEQ0QjAwMTA4MDQyMTYwMEZGRjg0RAorOjEwRTcyMDAwMDAwMDAwMDAwQzAwNEQ3MTAwMDAwMDAwOEZCRjAwMjBCMQorOjEwRTczMDAwOEZCMzAwMUM4RkIyMDAxODhGQjEwMDE0OEZCMDAwMTA3RgorOjEwRTc0MDAwMDNFMDAwMDgyN0JEMDAyODNDMDMwMDAxOEM2MzVEMDA0NgorOjEwRTc1MDAwM0MwMjAwMDE4QzQyNUQ0ODI3QkRGRkQ4QUZCRjAwMjBCRQorOjEwRTc2MDAwQUZCMTAwMUMxMDYyMDAwM0FGQjAwMDE4M0MwMTAwMDEwMworOjEwRTc3MDAwQUMyMzVENDgyNDYzRkZGRjJDNjIwMDEzMTA0MDAzNDk2MworOjEwRTc4MDAwMDAwMzEwODAzQzAxMDAwMTAwMjIwODIxOEMyMjVCMzAzNAorOjEwRTc5MDAwMDA0MDAwMDgwMDAwMDAwMDBDMDA0RDcxMDAwMDgwMjFDNgorOjEwRTdBMDAwMzQwMjgwMDBBN0EyMDAxMDI3QjEwMDEwMEMwMDRENEJDRQorOjEwRTdCMDAwMjQwNDAwMDEyNjEwMDAwMTJFMDIwMDIwMTQ0MEZGRkI1QgorOjEwRTdDMDAwMDAwMDAwMDAwQzAwNEQ0QjAwMDAyMDIxMEMwMDRENEJDMAorOjEwRTdEMDAwMjQwNDAwMDEwQzAwNEQ0QjAwMDAyMDIxMEMwMDRENEI4NworOjEwRTdFMDAwMjQwNDAwMDEyNDEwMDAxMDMyMDIwMDAxMTA0MDAwMDIzNQorOjEwRTdGMDAwMDAwMDIwMjEyNDA0MDAwMTBDMDA0RDRCMDAxMDgwNDIzOQorOjEwRTgwMDAwMTYwMEZGRkEzMjAyMDAwMTI0MTAwMDEwMEMwMDRENEJEQworOjEwRTgxMDAwMDAwMDIwMjEwMDEwODA0MjE2MDBGRkZDMDAwMDAwMDBENAorOjEwRTgyMDAwMEMwMDRENEIyNDA0MDAwMTBDMDA0RDRCMDAwMDIwMjEzNgorOjEwRTgzMDAwMzQxMDgwMDA5NjIyMDAwMDAwNTAxMDI0MTA0MDAwMDI4NgorOjEwRTg0MDAwMDAwMDIwMjEyNDA0MDAwMTBDMDA0RDRCMDAxMDgwNDJFOAorOjEwRTg1MDAwMTYwMEZGRjgwMDAwMDAwMDBDMDA0RDcxMDAwMDAwMDBFMQorOjEwRTg2MDAwMDgwMDREMjQyNDAyMDAwMjI3QjEwMDEwQTdBMDAwMTBDOAorOjEwRTg3MDAwMDAwMDgwMjEwQzAwNEQ0QjI0MDQwMDAxMjYxMDAwMDFGMworOjEwRTg4MDAwMkUwMjAwMjAxNDQwRkZGQjAwMDAwMDAwMEMwMDRENEI0NgorOjEwRTg5MDAwMDAwMDIwMjEwQzAwNEQ0QjI0MDQwMDAxMEMwMDRENEJDNgorOjEwRThBMDAwMjQwNDAwMDEwQzAwNEQ0QjAwMDAyMDIxMjQxMDAwMTAxNgorOjEwRThCMDAwMzIwMjAwMDExMDQwMDAwMjAwMDAyMDIxMjQwNDAwMDE2NworOjEwRThDMDAwMEMwMDRENEIwMDEwODA0MjE2MDBGRkZBMzIwMjAwMDE4RQorOjEwRThEMDAwMjQxMDAwMTAwQzAwNEQ0QjAwMDAyMDIxMDAxMDgwNDIzRAorOjEwRThFMDAwMTYwMEZGRkMwMDAwMDAwMDBDMDA0RDcxMzQxMDgwMDA4OQorOjEwRThGMDAwMEMwMDRENzEwMDAwMDAwMDBDMDA0RDJCMDAwMDAwMDBDQQorOjEwRTkwMDAwNTA0MDAwMDUwMDEwODA0Mjk2MjIwMDAwMDA1MDEwMjU2MworOjEwRTkxMDAwQTYyMjAwMDAwMDEwODA0MjE2MDBGRkY3MDAwMDAwMDA1MQorOjEwRTkyMDAwMEMwMDRENzEwMDAwMDAwMDk3QTIwMDEwMzA0MjgwMDBFMgorOjEwRTkzMDAwMTQ0MDAyREMyNDAyMDAwMzA4MDA0RDI0MDAwMDAwMDAwMworOjEwRTk0MDAwMjQwMjEyMDBBN0EyMDAxMDI3QjEwMDEwMDAwMDgwMjFBRAorOjEwRTk1MDAwMEMwMDRENEIyNDA0MDAwMTI2MTAwMDAxMkUwMjAwMjA2MworOjEwRTk2MDAwMTQ0MEZGRkIwMDAwMDAwMDBDMDA0RDRCMDAwMDIwMjE3NAorOjEwRTk3MDAwMEMwMDRENEIyNDA0MDAwMTBDMDA0RDRCMDAwMDIwMjFFNQorOjEwRTk4MDAwMEMwMDRENEIyNDA0MDAwMTI0MTAwMDEwMzIwMjAwMDE0MQorOjEwRTk5MDAwMTA0MDAwMDIwMDAwMjAyMTI0MDQwMDAxMEMwMDRENEIxNworOjEwRTlBMDAwMDAxMDgwNDIxNjAwRkZGQTMyMDIwMDAxMjQxMDAwMTAwRAorOjEwRTlCMDAwMEMwMDRENEIwMDAwMjAyMTAwMTA4MDQyMTYwMEZGRkM4RgorOjEwRTlDMDAwMDAwMDAwMDAwQzAwNEQ0QjI0MDQwMDAxMEMwMDRENEJENgorOjEwRTlEMDAwMDAwMDIwMjEzNDEwODAwMDk2MjIwMDAwMDA1MDEwMjRGNgorOjEwRTlFMDAwMTA0MDAwMDIwMDAwMjAyMTI0MDQwMDAxMEMwMDRENEJDNworOjEwRTlGMDAwMDAxMDgwNDIxNjAwRkZGODAwMDAwMDAwMEMwMDRENzE2RQorOjEwRUEwMDAwMDAwMDAwMDA4RjgzMDA1NDA4MDA0RDE2MjQwMjAwMDQwQgorOjEwRUExMDAwOEY4MzAwNTQzQzAyMDAwMThDNDI1REI4MjQ2M0ZGOUM0QworOjEwRUEyMDAwMDA0MzEwMjMyQzQyMDA2NDE0NDAwMjlFMjQwMjAwMDI4MgorOjEwRUEzMDAwM0MwMzAwMDE4QzYzNURCQzEwNjIwMjk3MkM2MjAwMDNGMgorOjEwRUE0MDAwMTQ0MDAyOTYyNDAyMDAxMTI0MDIwMDAzMTA2MjAwMDUwMworOjEwRUE1MDAwMjQwMjAwMDQxMDYyMDI5MTI0MDIwMDBGMDgwMDREMjREOQorOjEwRUE2MDAwMjQwMjAwMTEwODAwNEQyNDI0MDIwMDA1MjQwMjAwMTQ5MQorOjEwRUE3MDAwQTdBMjAwMTAyN0IxMDAxMDAwMDA4MDIxMEMwMDRENEIxMAorOjEwRUE4MDAwMjQwNDAwMDEyNjEwMDAwMTJFMDIwMDIwMTQ0MEZGRkI4OAorOjEwRUE5MDAwMDAwMDAwMDAwQzAwNEQ0QjAwMDAyMDIxMEMwMDRENEJFRAorOjEwRUFBMDAwMjQwNDAwMDEwQzAwNEQ0QjAwMDAyMDIxMEMwMDRENEJCNAorOjEwRUFCMDAwMjQwNDAwMDEyNDEwMDAxMDMyMDIwMDAxMTA0MDAwMDI2MgorOjEwRUFDMDAwMDAwMDIwMjEyNDA0MDAwMTBDMDA0RDRCMDAxMDgwNDI2NgorOjEwRUFEMDAwMTYwMEZGRkEzMjAyMDAwMTI0MTAwMDEwMzIwMjAwMTI2OAorOjEwRUFFMDAwMTA0MDAwMDIwMDAwMjAyMTI0MDQwMDAxMEMwMDRENEJDNgorOjEwRUFGMDAwMDAxMDgwNDIxNjAwRkZGQTMyMDIwMDEyMEMwMDRENEI0QgorOjEwRUIwMDAwMjQwNDAwMDEwQzAwNEQ0QjAwMDAyMDIxMzQxMDgwMDAzMworOjEwRUIxMDAwOTYyMjAwMDAwMDUwMTAyNDEwNDAwMDAyMDAwMDIwMjEyNgorOjEwRUIyMDAwMjQwNDAwMDEwQzAwNEQ0QjAwMTA4MDQyMTYwMEZGRjgzOQorOjEwRUIzMDAwMDAwMDAwMDAwQzAwNEQ3MTAwMDAwMDAwOEY4MzAwNTRBNQorOjEwRUI0MDAwMDgwMDREMTYyNDAyMDAwNjhGODMwMDU0M0MwMjAwMDE4OQorOjEwRUI1MDAwOEM0MjVEQjgyNDYzRkY5QzAwNDMxMDIzMkM0MjAwNjQ2OAorOjEwRUI2MDAwMTQ0MDAyNTAyNDAyMDAwNzA4MDA0RDI0MDAwMDAwMDA1OQorOjEwRUI3MDAwMjQwMjAwMDZBN0EyMDAxMDI3QjEwMDEwMDAwMDgwMjE4NworOjEwRUI4MDAwMEMwMDRENEIyNDA0MDAwMTI2MTAwMDAxMkUwMjAwMjAzMQorOjEwRUI5MDAwMTQ0MEZGRkIwMDAwMDAwMDBDMDA0RDRCMDAwMDIwMjE0MgorOjEwRUJBMDAwMEMwMDRENEIyNDA0MDAwMTBDMDA0RDRCMDAwMDIwMjFCMworOjEwRUJCMDAwMEMwMDRENEIyNDA0MDAwMTI0MTAwMDEwMzIwMjAwMDEwRgorOjEwRUJDMDAwMTA0MDAwMDIwMDAwMjAyMTI0MDQwMDAxMEMwMDRENEJFNQorOjEwRUJEMDAwMDAxMDgwNDIxNjAwRkZGQTMyMDIwMDAxMjQxMDAwMTBEQgorOjEwRUJFMDAwMzIwMjAwMTMxMDQwMDAwMjAwMDAyMDIxMjQwNDAwMDEyMgorOjEwRUJGMDAwMEMwMDRENEIwMDEwODA0MjE2MDBGRkZBMzIwMjAwMTM0OQorOjEwRUMwMDAwMEMwMDRENEIyNDA0MDAwMTBDMDA0RDRCMDAwMDIwMjE1MgorOjEwRUMxMDAwMzQxMDgwMDA5NjIyMDAwMDAwNTAxMDI0MTA0MDAwMDJBMgorOjEwRUMyMDAwMDAwMDIwMjEyNDA0MDAwMTBDMDA0RDRCMDAxMDgwNDIwNAorOjEwRUMzMDAwMTYwMEZGRjgwMDAwMDAwMDBDMDA0RDcxMDAwMDAwMDBGRAorOjEwRUM0MDAwOEY4MzAwNTQwODAwNEQxNjI0MDIwMDA4OEY4MzAwNTQ1RgorOjEwRUM1MDAwM0MwMjAwMDE4QzQyNURCODI0NjNGRjlDMDA0MzEwMjNGQQorOjEwRUM2MDAwMkM0MjAwNjQxNDQwMDIwRjI0MDIwMDA5MDgwMDREMjRDNQorOjEwRUM3MDAwMDAwMDAwMDAyN0IxMDAxMEE3QTAwMDEwMDAwMDgwMjFCNAorOjEwRUM4MDAwMEMwMDRENEIyNDA0MDAwMTI2MTAwMDAxMkUwMjAwMjAzMAorOjEwRUM5MDAwMTQ0MEZGRkIwMDAwMDAwMDBDMDA0RDRCMDAwMDIwMjE0MQorOjEwRUNBMDAwMEMwMDRENEIyNDA0MDAwMTBDMDA0RDRCMjQwNDAwMDFDQQorOjEwRUNCMDAwMEMwMDRENEIwMDAwMjAyMTI0MTAwMDEwMzIwMjAwMDFGNgorOjEwRUNDMDAwMTA0MDAwMDIwMDAwMjAyMTI0MDQwMDAxMEMwMDRENEJFNAorOjEwRUNEMDAwMDAxMDgwNDIxNjAwRkZGQTMyMDIwMDAxMjQxMDAwMTBEQQorOjEwRUNFMDAwMzIwMjAwMTgxMDQwMDAwMjAwMDAyMDIxMjQwNDAwMDExQworOjEwRUNGMDAwMEMwMDRENEIwMDEwODA0MjE2MDBGRkZBMzIwMjAwMTg0MworOjEwRUQwMDAwMEMwMDRENzEzNDEwODAwMDBDMDA0RDcxMDAwMDAwMDBBQgorOjEwRUQxMDAwMEMwMDREMkIwMDAwMDAwMDUwNDAwMDA1MDAxMDgwNDIwOAorOjEwRUQyMDAwOTYyMjAwMDAwMDUwMTAyNUE2MjIwMDAwMDAxMDgwNDIwQworOjEwRUQzMDAwMTYwMEZGRjcwMDAwMDAwMDBDMDA0RDcxMDAwMDgwMjE1QworOjEwRUQ0MDAwOTdBMjAwMTAyN0IxMDAxMDM0NDIwMDAxQTdBMjAwMTBDMgorOjEwRUQ1MDAwMEMwMDRENEIyNDA0MDAwMTI2MTAwMDAxMkUwMjAwMjA1RgorOjEwRUQ2MDAwMTQ0MEZGRkIwMDAwMDAwMDBDMDA0RDRCMDAwMDIwMjE3MAorOjEwRUQ3MDAwMEMwMDRENEIyNDA0MDAwMTBDMDA0RDRCMDAwMDIwMjFFMQorOjEwRUQ4MDAwMEMwMDRENEIyNDA0MDAwMTI0MTAwMDEwMzIwMjAwMDEzRAorOjEwRUQ5MDAwMTA0MDAwMDIwMDAwMjAyMTI0MDQwMDAxMEMwMDRENEIxMworOjEwRURBMDAwMDAxMDgwNDIxNjAwRkZGQTMyMDIwMDAxMjQxMDAwMTAwOQorOjEwRURCMDAwMzIwMjAwMTgxMDQwMDAwMjAwMDAyMDIxMjQwNDAwMDE0QgorOjEwRURDMDAwMEMwMDRENEIwMDEwODA0MjE2MDBGRkZBMzIwMjAwMTg3MgorOjEwRUREMDAwMEMwMDRENEIyNDA0MDAwMTBDMDA0RDRCMDAwMDIwMjE4MQorOjEwRURFMDAwMzQxMDgwMDA5NjIyMDAwMDAwNTAxMDI0MTA0MDAwMDJEMQorOjEwRURGMDAwMDAwMDIwMjEyNDA0MDAwMTBDMDA0RDRCMDAxMDgwNDIzMworOjEwRUUwMDAwMTYwMEZGRjgwMDAwMDAwMDBDMDA0RDcxMDAwMDAwMDAyQgorOjEwRUUxMDAwOEY4MzAwNTQwODAwNEQxNjI0MDIwMDBBOEY4MzAwNTQ4QgorOjEwRUUyMDAwM0MwMjAwMDE4QzQyNURCODI0NjNGRjlDMDA0MzEwMjMyOAorOjEwRUUzMDAwMkM0MjAwNjQxNDQwMDE5QjI0MDIwMDBCMDgwMDREMjQ2NgorOjEwRUU0MDAwMDAwMDAwMDAyN0IxMDAxMEE3QTAwMDEwMDAwMDgwMjFFMgorOjEwRUU1MDAwMEMwMDRENEIyNDA0MDAwMTI2MTAwMDAxMkUwMjAwMjA1RQorOjEwRUU2MDAwMTQ0MEZGRkIwMDAwMDAwMDBDMDA0RDRCMDAwMDIwMjE2RgorOjEwRUU3MDAwMEMwMDRENEIyNDA0MDAwMTBDMDA0RDRCMjQwNDAwMDFGOAorOjEwRUU4MDAwMEMwMDRENEIwMDAwMjAyMTI0MTAwMDEwMzIwMjAwMDEyNAorOjEwRUU5MDAwMTA0MDAwMDIwMDAwMjAyMTI0MDQwMDAxMEMwMDRENEIxMgorOjEwRUVBMDAwMDAxMDgwNDIxNjAwRkZGQTMyMDIwMDAxMjQxMDAwMTAwOAorOjEwRUVCMDAwMzIwMjAwMTcxMDQwMDAwMjAwMDAyMDIxMjQwNDAwMDE0QgorOjEwRUVDMDAwMEMwMDRENEIwMDEwODA0MjE2MDBGRkZBMzIwMjAwMTc3MgorOjEwRUVEMDAwMEMwMDRENzEzNDEwODAwMDBDMDA0RDcxMDAwMDAwMDBEQQorOjEwRUVFMDAwMEMwMDREMkIwMDAwMDAwMDUwNDAwMDA1MDAxMDgwNDIzNworOjEwRUVGMDAwOTYyMjAwMDAwMDUwMTAyNUE2MjIwMDAwMDAxMDgwNDIzQgorOjEwRUYwMDAwMTYwMEZGRjcwMDAwMDAwMDBDMDA0RDcxMDAwMDgwMjE4QQorOjEwRUYxMDAwOTdBMjAwMTAyN0IxMDAxMDM0NDIwNzAwQTdBMjAwMTBFQQorOjEwRUYyMDAwMEMwMDRENEIyNDA0MDAwMTI2MTAwMDAxMkUwMjAwMjA4RAorOjEwRUYzMDAwMTQ0MEZGRkIwMDAwMDAwMDBDMDA0RDRCMDAwMDIwMjE5RQorOjEwRUY0MDAwMEMwMDRENEIyNDA0MDAwMTBDMDA0RDRCMDAwMDIwMjEwRgorOjEwRUY1MDAwMEMwMDRENEIyNDA0MDAwMTI0MTAwMDEwMzIwMjAwMDE2QgorOjEwRUY2MDAwMTA0MDAwMDIwMDAwMjAyMTI0MDQwMDAxMEMwMDRENEI0MQorOjEwRUY3MDAwMDAxMDgwNDIxNjAwRkZGQTMyMDIwMDAxMjQxMDAwMTAzNworOjEwRUY4MDAwMzIwMjAwMTcxMDQwMDAwMjAwMDAyMDIxMjQwNDAwMDE3QQorOjEwRUY5MDAwMEMwMDRENEIwMDEwODA0MjE2MDBGRkZBMzIwMjAwMTdBMQorOjEwRUZBMDAwMEMwMDRENEIyNDA0MDAwMTBDMDA0RDRCMDAwMDIwMjFBRgorOjEwRUZCMDAwMzQxMDgwMDA5NjIyMDAwMDAwNTAxMDI0MTA0MDAwMDJGRgorOjEwRUZDMDAwMDAwMDIwMjEyNDA0MDAwMTBDMDA0RDRCMDAxMDgwNDI2MQorOjEwRUZEMDAwMTYwMEZGRjgwMDAwMDAwMDBDMDA0RDcxMDAwMDAwMDA1QQorOjEwRUZFMDAwOEY4MzAwNTQwODAwNEQxNjI0MDIwMDBDOEY4MzAwNTRCOAorOjEwRUZGMDAwM0MwMjAwMDE4QzQyNURCODI0NjNGRjlDMDA0MzEwMjM1NworOjEwRjAwMDAwMkM0MjAwNjQxNDQwMDEyNzI0MDIwMDEyMDgwMDREMjQwMQorOjEwRjAxMDAwMDAwMDAwMDAyN0IxMDAxMEE3QTAwMDEwMDAwMDgwMjExMAorOjEwRjAyMDAwMEMwMDRENEIyNDA0MDAwMTI2MTAwMDAxMkUwMjAwMjA4QworOjEwRjAzMDAwMTQ0MEZGRkIwMDAwMDAwMDBDMDA0RDRCMDAwMDIwMjE5RAorOjEwRjA0MDAwMEMwMDRENEIyNDA0MDAwMTBDMDA0RDRCMjQwNDAwMDEyNgorOjEwRjA1MDAwMEMwMDRENEIwMDAwMjAyMTI0MTAwMDEwMzIwMjAwMDE1MgorOjEwRjA2MDAwMTA0MDAwMDIwMDAwMjAyMTI0MDQwMDAxMEMwMDRENEI0MAorOjEwRjA3MDAwMDAxMDgwNDIxNjAwRkZGQTMyMDIwMDAxMjQxMDAwMTAzNgorOjEwRjA4MDAwMzIwMjAwMTQxMDQwMDAwMjAwMDAyMDIxMjQwNDAwMDE3QworOjEwRjA5MDAwMEMwMDRENEIwMDEwODA0MjE2MDBGRkZBMzIwMjAwMTRBMworOjEwRjBBMDAwMEMwMDRENzEzNDEwODAwMDBDMDA0RDcxMDAwMDAwMDAwOAorOjEwRjBCMDAwMEMwMDREMkIwMDAwMDAwMDUwNDAwMDA1MDAxMDgwNDI2NQorOjEwRjBDMDAwOTYyMjAwMDAwMDUwMTAyNUE2MjIwMDAwMDAxMDgwNDI2OQorOjEwRjBEMDAwMTYwMEZGRjcwMDAwMDAwMDBDMDA0RDcxMDAwMDgwMjFCOQorOjEwRjBFMDAwOTdBMjAwMTAyN0IxMDAxMDM0NDIwMDEwQTdBMjAwMTAxMAorOjEwRjBGMDAwMEMwMDRENEIyNDA0MDAwMTI2MTAwMDAxMkUwMjAwMjBCQworOjEwRjEwMDAwMTQ0MEZGRkIwMDAwMDAwMDBDMDA0RDRCMDAwMDIwMjFDQworOjEwRjExMDAwMEMwMDRENEIyNDA0MDAwMTBDMDA0RDRCMDAwMDIwMjEzRAorOjEwRjEyMDAwMEMwMDRENEIyNDA0MDAwMTI0MTAwMDEwMzIwMjAwMDE5OQorOjEwRjEzMDAwMTA0MDAwMDIwMDAwMjAyMTI0MDQwMDAxMEMwMDRENEI2RgorOjEwRjE0MDAwMDAxMDgwNDIxNjAwRkZGQTMyMDIwMDAxMjQxMDAwMTA2NQorOjEwRjE1MDAwMzIwMjAwMTQxMDQwMDAwMjAwMDAyMDIxMjQwNDAwMDFBQgorOjEwRjE2MDAwMEMwMDRENEIwMDEwODA0MjE2MDBGRkZBMzIwMjAwMTREMgorOjEwRjE3MDAwMEMwMDRENEIyNDA0MDAwMTBDMDA0RDRCMDAwMDIwMjFERAorOjEwRjE4MDAwMzQxMDgwMDA5NjIyMDAwMDAwNTAxMDI0MTA0MDAwMDIyRAorOjEwRjE5MDAwMDAwMDIwMjEyNDA0MDAwMTBDMDA0RDRCMDAxMDgwNDI4RgorOjEwRjFBMDAwMTYwMEZGRjgwMDAwMDAwMDBDMDA0RDcxMDAwMDAwMDA4OAorOjEwRjFCMDAwOEY4MzAwNTQwODAwNEQxNjI0MDIwMDEzOEY4MzAwNTRERgorOjEwRjFDMDAwM0MwMjAwMDE4QzQyNURCODI0NjNGRjlDMDA0MzEwMjM4NQorOjEwRjFEMDAwMkM0MjAwNjQxNDQwMDBCMzI0MDIwMDBEMDgwMDREMjRBQQorOjEwRjFFMDAwMDAwMDAwMDAyN0IxMDAxMEE3QTAwMDEwMDAwMDgwMjEzRgorOjEwRjFGMDAwMEMwMDRENEIyNDA0MDAwMTI2MTAwMDAxMkUwMjAwMjBCQgorOjEwRjIwMDAwMTQ0MEZGRkIwMDAwMDAwMDBDMDA0RDRCMDAwMDIwMjFDQgorOjEwRjIxMDAwMEMwMDRENEIyNDA0MDAwMTBDMDA0RDRCMjQwNDAwMDE1NAorOjEwRjIyMDAwMEMwMDRENEIwMDAwMjAyMTI0MTAwMDEwMzIwMjAwMDE4MAorOjEwRjIzMDAwMTA0MDAwMDIwMDAwMjAyMTI0MDQwMDAxMEMwMDRENEI2RQorOjEwRjI0MDAwMDAxMDgwNDIxNjAwRkZGQTMyMDIwMDAxMjQxMDAwMTA2NAorOjEwRjI1MDAwMzIwMjAwMTgxMDQwMDAwMjAwMDAyMDIxMjQwNDAwMDFBNgorOjEwRjI2MDAwMEMwMDRENEIwMDEwODA0MjE2MDBGRkZBMzIwMjAwMThDRAorOjEwRjI3MDAwMEMwMDRENzEzNDEwODAwMDBDMDA0RDcxMDAwMDAwMDAzNgorOjEwRjI4MDAwMEMwMDREMkIwMDAwMDAwMDUwNDAwMDA1MDAxMDgwNDI5MworOjEwRjI5MDAwOTYyMjAwMDAwMDUwMTAyNUE2MjIwMDAwMDAxMDgwNDI5NworOjEwRjJBMDAwMTYwMEZGRjcwMDAwMDAwMDBDMDA0RDcxMDAwMDgwMjFFNworOjEwRjJCMDAwOTdBMjAwMTAyN0IxMDAxMDMwNDJGRkZFQTdBMjAwMTA1NQorOjEwRjJDMDAwMEMwMDRENEIyNDA0MDAwMTI2MTAwMDAxMkUwMjAwMjBFQQorOjEwRjJEMDAwMTQ0MEZGRkIwMDAwMDAwMDBDMDA0RDRCMDAwMDIwMjFGQgorOjEwRjJFMDAwMEMwMDRENEIyNDA0MDAwMTBDMDA0RDRCMDAwMDIwMjE2QworOjEwRjJGMDAwMEMwMDRENEIyNDA0MDAwMTI0MTAwMDEwMzIwMjAwMDFDOAorOjEwRjMwMDAwMTA0MDAwMDIwMDAwMjAyMTI0MDQwMDAxMEMwMDRENEI5RAorOjEwRjMxMDAwMDAxMDgwNDIxNjAwRkZGQTMyMDIwMDAxMjQxMDAwMTA5MworOjEwRjMyMDAwMzIwMjAwMTgxMDQwMDAwMjAwMDAyMDIxMjQwNDAwMDFENQorOjEwRjMzMDAwMEMwMDRENEIwMDEwODA0MjE2MDBGRkZBMzIwMjAwMThGQworOjEwRjM0MDAwMEMwMDRENEIyNDA0MDAwMTBDMDA0RDRCMDAwMDIwMjEwQgorOjEwRjM1MDAwMzQxMDgwMDA5NjIyMDAwMDAwNTAxMDI0MTA0MDAwMDI1QgorOjEwRjM2MDAwMDAwMDIwMjEyNDA0MDAwMTBDMDA0RDRCMDAxMDgwNDJCRAorOjEwRjM3MDAwMTYwMEZGRjgwMDAwMDAwMDBDMDA0RDcxMDAwMDAwMDBCNgorOjEwRjM4MDAwOEY4MzAwNTQwODAwNEQxNjI0MDIwMDBFMjQwMjA4NDAwQQorOjEwRjM5MDAwQTdBMjAwMTAyN0IxMDAxMDAwMDA4MDIxMEMwMDRENEJFNworOjEwRjNBMDAwMjQwNDAwMDEyNjEwMDAwMTJFMDIwMDIwMTQ0MEZGRkI1RgorOjEwRjNCMDAwMDAwMDAwMDAwQzAwNEQ0QjAwMDAyMDIxMEMwMDRENEJDNAorOjEwRjNDMDAwMjQwNDAwMDEwQzAwNEQ0QjAwMDAyMDIxMEMwMDRENEI4QgorOjEwRjNEMDAwMjQwNDAwMDEyNDEwMDAxMDMyMDIwMDAxMTA0MDAwMDIzOQorOjEwRjNFMDAwMDAwMDIwMjEyNDA0MDAwMTBDMDA0RDRCMDAxMDgwNDIzRAorOjEwRjNGMDAwMTYwMEZGRkEzMjAyMDAwMTI0MTAwMDEwMzIwMjAwMTMzRQorOjEwRjQwMDAwMTA0MDAwMDIwMDAwMjAyMTI0MDQwMDAxMEMwMDRENEI5QworOjEwRjQxMDAwMDAxMDgwNDIxNjAwRkZGQTMyMDIwMDEzMEMwMDRENEIyMAorOjEwRjQyMDAwMjQwNDAwMDEwQzAwNEQ0QjAwMDAyMDIxMzQxMDgwMDAwQQorOjEwRjQzMDAwOTYyMjAwMDAwMDUwMTAyNDEwNDAwMDAyMDAwMDIwMjFGRAorOjEwRjQ0MDAwMjQwNDAwMDEwQzAwNEQ0QjAwMTA4MDQyMTYwMEZGRjgxMAorOjEwRjQ1MDAwMDAwMDAwMDAwQzAwNEQ3MTAwMDAwMDAwOEY4MzAwNTQ3QworOjEwRjQ2MDAwMjQwMjAwMTAzQzAxMDAwMUFDMjI1RDAwM0MwMTAwMDFCRgorOjEwRjQ3MDAwMDgwMDREMjZBQzIzNURCODhGODMwMDU0M0MwMjAwMDE4OAorOjEwRjQ4MDAwOEM0MjVEQjgyNDYzRkY5QzAwNDMxMDIzMkM0MjAwNjQyRgorOjEwRjQ5MDAwMTQ0MDAwMDQwMDAwMDAwMDI0MDIwMDExM0MwMTAwMDE5RgorOjEwRjRBMDAwQUMyMjVEMDA4RkJGMDAyMDhGQjEwMDFDOEZCMDAwMTgxMAorOjEwRjRCMDAwMDNFMDAwMDgyN0JEMDAyODhGODUwMDQ0OEY4MjAwNDRBOAorOjEwRjRDMDAwM0MwMzAwMDEwMDQzMTAyNTNDMDMwMDA4QUY4MjAwNDRDOAorOjEwRjREMDAwOEY4NDAwNTQ4RjgyMDA1NDAwQTMyODI0MDgwMDREMzdFNQorOjEwRjRFMDAwMjQ4NDAwMDE4RjgyMDA1NDAwODIxMDIzMkM0MjAwMDJFOQorOjEwRjRGMDAwMTQ0MEZGRkMwMDAwMDAwMDhGODIwMDQ0M0MwM0ZGRkUyQworOjEwRjUwMDAwMzQ2M0ZGRkYwMDQzMTAyNEFGODIwMDQ0OEY4MzAwNTQxNAorOjEwRjUxMDAwOEY4MjAwNTQwODAwNEQ0NTI0NjMwMDAxOEY4MjAwNTRGRgorOjEwRjUyMDAwMDA2MjEwMjMyQzQyMDAwMjE0NDBGRkZDMDAwMDAwMDA4NworOjEwRjUzMDAwMDNFMDAwMDgwMEEwMTAyMThGODMwMDQ0M0MwMkZGRjA4QworOjEwRjU0MDAwMzQ0MkZGRkYwMDA0MjQ4MDAwNjIxODI0M0MwMjAwMDJDMQorOjEwRjU1MDAwMDA4MjIwMjUwMDY0MTgyNUFGODMwMDQ0OEY4MjAwNDQ3OAorOjEwRjU2MDAwM0MwM0ZGRkUzNDYzRkZGRjAwNDMxMDI0QUY4MjAwNDRERQorOjEwRjU3MDAwOEY4MzAwNTQ4RjgyMDA1NDA4MDA0RDVFMjQ2MzAwMDE4NQorOjEwRjU4MDAwOEY4MjAwNTQwMDYyMTAyMzJDNDIwMDAyMTQ0MEZGRkNDMgorOjEwRjU5MDAwMDAwMDAwMDA4RjgyMDA0NDNDMDMwMDAxMDA0MzEwMjU1RQorOjEwRjVBMDAwQUY4MjAwNDQ4RjgzMDA1NDhGODIwMDU0MDgwMDRENkI1QgorOjEwRjVCMDAwMjQ2MzAwMDE4RjgyMDA1NDAwNjIxMDIzMkM0MjAwMDI1OQorOjEwRjVDMDAwMTQ0MEZGRkMwMDAwMDAwMDAzRTAwMDA4MDAwMDAwMDAwMQorOjEwRjVEMDAwOEY4MjAwNDQzQzAzRkZGMDM0NjNGRkZGMDA0MzEwMjQ5QworOjEwRjVFMDAwQUY4MjAwNDQ4RjgyMDA0NDNDMDMwMDAxMDA0MzEwMjU5OQorOjEwRjVGMDAwQUY4MjAwNDQ4RjgzMDA1NDhGODIwMDU0MDgwMDREN0ZGNworOjEwRjYwMDAwMjQ2MzAwMDE4RjgyMDA1NDAwNjIxMDIzMkM0MjAwMDIwOAorOjEwRjYxMDAwMTQ0MEZGRkMwMDAwMDAwMDhGODIwMDQ0M0MwM0ZGRkUwQQorOjEwRjYyMDAwMzQ2M0ZGRkYwMDQzMTAyNEFGODIwMDQ0OEY4MzAwNTRGMworOjEwRjYzMDAwOEY4MjAwNTQwODAwNEQ4RDI0NjMwMDAxOEY4MjAwNTQ5NgorOjEwRjY0MDAwMDA2MjEwMjMyQzQyMDAwMjE0NDBGRkZDMDAwMDAwMDA2NgorOjEwRjY1MDAwMDNFMDAwMDgwMDAwMDAwMDI3QkRGRkM4QUZCMzAwMjQ4RQorOjEwRjY2MDAwMDA4MDk4MjFBRkI1MDAyQzAwQTBBODIxQUZCMjAwMjBFNworOjEwRjY3MDAwMDBDMDkwMjEzMkEyRkZGRkFGQkYwMDMwQUZCNDAwMjgxRQorOjEwRjY4MDAwQUZCMTAwMUNBRkIwMDAxODE0NDAwMDM0QTdCMjAwMTA5NgorOjEwRjY5MDAwMzI3MUZGRkYyN0IyMDAxMDAwMDA4MDIxMEMwMDRENEI5QgorOjEwRjZBMDAwMjQwNDAwMDEyNjEwMDAwMTJFMDIwMDIwMTQ0MEZGRkI1QworOjEwRjZCMDAwMDAwMDAwMDAwQzAwNEQ0QjAwMDAyMDIxMEMwMDRENEJDMQorOjEwRjZDMDAwMjQwNDAwMDEwQzAwNEQ0QjAwMDAyMDIxMEMwMDRENEI4OAorOjEwRjZEMDAwMjQwNDAwMDEyNDEwMDAxMDMyMDIwMDAxMTA0MDAwMDIzNgorOjEwRjZFMDAwMDAwMDIwMjEyNDA0MDAwMTBDMDA0RDRCMDAxMDgwNDIzQQorOjEwRjZGMDAwMTYwMEZGRkEzMjAyMDAwMTI0MTAwMDEwMDIzMDEwMjQxQworOjEwRjcwMDAwMTA0MDAwMDIwMDAwMjAyMTI0MDQwMDAxMEMwMDRENEI5OQorOjEwRjcxMDAwMDAxMDgwNDIxNjAwRkZGQTAyMzAxMDI0MEMwMDRENEJGRQorOjEwRjcyMDAwMjQwNDAwMDEwQzAwNEQ0QjAwMDAyMDIxMzQxMDgwMDAwNworOjEwRjczMDAwOTY0MjAwMDAwMDUwMTAyNDEwNDAwMDAyMDAwMDIwMjFEQQorOjEwRjc0MDAwMjQwNDAwMDEwQzAwNEQ0QjAwMTA4MDQyMTIwMDAwNzU5MworOjEwRjc1MDAwMDAwMDAwMDAwODAwNERDOTAwMDAwMDAwMzI3NEZGRkZFNworOjEwRjc2MDAwMjdCMTAwMTBBN0EwMDAxMDAwMDA4MDIxMEMwMDRENEIxNQorOjEwRjc3MDAwMjQwNDAwMDEyNjEwMDAwMTJFMDIwMDIwMTQ0MEZGRkI4QgorOjEwRjc4MDAwMDAwMDAwMDAwQzAwNEQ0QjAwMDAyMDIxMEMwMDRENEJGMAorOjEwRjc5MDAwMjQwNDAwMDEwQzAwNEQ0QjI0MDQwMDAxMEMwMDRENEJDRgorOjEwRjdBMDAwMDAwMDIwMjEyNDEwMDAxMDMyMDIwMDAxMTA0MDAwMDI0RAorOjEwRjdCMDAwMDAwMDIwMjEyNDA0MDAwMTBDMDA0RDRCMDAxMDgwNDI2OQorOjEwRjdDMDAwMTYwMEZGRkEzMjAyMDAwMTI0MTAwMDEwMDI5MDEwMjRFQgorOjEwRjdEMDAwMTA0MDAwMDIwMDAwMjAyMTI0MDQwMDAxMEMwMDRENEJDOQorOjEwRjdFMDAwMDAxMDgwNDIxNjAwRkZGQTAyOTAxMDI0MEMwMDRENzFBOAorOjEwRjdGMDAwMzQxMDgwMDAwQzAwNEQ3MTAwMDAwMDAwMEMwMDREMkJGNworOjEwRjgwMDAwMDAwMDAwMDA1MDQwMDAwNTAwMTA4MDQyOTYyMjAwMDBEOQorOjEwRjgxMDAwMDA1MDEwMjVBNjIyMDAwMDAwMTA4MDQyMTYwMEZGRjdCRAorOjEwRjgyMDAwMDAwMDAwMDAwQzAwNEQ3MTAwMDAwMDAwMzJBNUZGRkYzOQorOjEwRjgzMDAwMjQwMjAwMDE1NEEyMDAwNDI0MDIwMDAyOTdBMjAwMTAzNgorOjEwRjg0MDAwMDgwMDRFMTQwMDUyMTAyNTE0QTIwMDA2MzI3MUZGRkY2QQorOjEwRjg1MDAwOTdBMjAwMTAwMDEyMTgyNzAwNDMxMDI0QTdBMjAwMTAzRQorOjEwRjg2MDAwMzI3MUZGRkYyN0IyMDAxMDAwMDA4MDIxMEMwMDRENEJDOQorOjEwRjg3MDAwMjQwNDAwMDEyNjEwMDAwMTJFMDIwMDIwMTQ0MEZGRkI4QQorOjEwRjg4MDAwMDAwMDAwMDAwQzAwNEQ0QjAwMDAyMDIxMEMwMDRENEJFRgorOjEwRjg5MDAwMjQwNDAwMDEwQzAwNEQ0QjAwMDAyMDIxMEMwMDRENEJCNgorOjEwRjhBMDAwMjQwNDAwMDEyNDEwMDAxMDMyMDIwMDAxMTA0MDAwMDI2NAorOjEwRjhCMDAwMDAwMDIwMjEyNDA0MDAwMTBDMDA0RDRCMDAxMDgwNDI2OAorOjEwRjhDMDAwMTYwMEZGRkEzMjAyMDAwMTI0MTAwMDEwMDIzMDEwMjQ0QQorOjEwRjhEMDAwMTA0MDAwMDIwMDAwMjAyMTI0MDQwMDAxMEMwMDRENEJDOAorOjEwRjhFMDAwMDAxMDgwNDIxNjAwRkZGQTAyMzAxMDI0MEMwMDRENEIyRAorOjEwRjhGMDAwMjQwNDAwMDEwQzAwNEQ0QjAwMDAyMDIxMzQxMDgwMDAzNgorOjEwRjkwMDAwOTY0MjAwMDAwMDUwMTAyNDEwNDAwMDAyMDAwMDIwMjEwOAorOjEwRjkxMDAwMjQwNDAwMDEwQzAwNEQ0QjAwMTA4MDQyMTYwMEZGRjgzQgorOjEwRjkyMDAwMDAwMDAwMDAwQzAwNEQ3MTAwMDAwMDAwOEZCRjAwMzA4RgorOjEwRjkzMDAwOEZCNTAwMkM4RkI0MDAyODhGQjMwMDI0OEZCMjAwMjAyNQorOjEwRjk0MDAwOEZCMTAwMUM4RkIwMDAxODAzRTAwMDA4MjdCRDAwMzhGRAorOjEwRjk1MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMjdCREZGRThEQworOjEwRjk2MDAwQUZCRjAwMTAzQzAzMDAwMTAwNzcxODIxOEM2MzgzQUMwQgorOjEwRjk3MDAwMjQwMjAwMDgxNDYyMDIyQzAwODAzMDIxM0MwMjAwMDFBNQorOjEwRjk4MDAwOEM0MjVEOTgxNDQwMDAzMzAwMDAwMDAwOEY4NTAyMjRGMworOjEwRjk5MDAwMzhBMzAwMjAyQzYzMDAwMTM4QTIwMDEwMkM0MjAwMDE4MworOjEwRjlBMDAwMDA2MjE4MjUxNDYwMDAwRDM4QTMwMDMwMkM2MzAwMDE5QworOjEwRjlCMDAwMzhBMjA0MDAyQzQyMDAwMTAwNjIxODI1MTQ2MDAwMDdFMAorOjEwRjlDMDAwMzhBMzA0MDIyQzYzMDAwMTM4QTIwNDA0MkM0MjAwMDE3NQorOjEwRjlEMDAwMDA2MjE4MjUxMDYwMDAwNTAwMDAwMDAwMEMwMDQyOUIyQQorOjEwRjlFMDAwMDAwMDAwMDAwODAwNEU4RDI0MDIwMDBFMEMwMDQzRERENAorOjEwRjlGMDAwMDAwMDAwMDAzQzA1MDAwMThDQTU1Q0M4MEMwMDUyQTI3MAorOjEwRkEwMDAwMDAwMDIwMjEzQzAzMDAwMThDNjM1Q0M4MjQwMjAwMDQzOAorOjEwRkExMDAwMTQ2MjAwMDUyNDAzRkZGQjNDMDIwMDAxOEM0MjVDQzQxRAorOjEwRkEyMDAwMDgwMDRFODkyNDAzRkZGNzNDMDIwMDAxOEM0MjVDQzRBRAorOjEwRkEzMDAwMDA0MzEwMjQzQzAxMDAwMUFDMjI1Q0M0MjQwMjAwMEVFRgorOjEwRkE0MDAwM0MwMTAwMDEwQzAwNDI5QkFDMjI3REQwMDgwMDUwODc5NQorOjEwRkE1MDAwMDAwMDAwMDA4RjgyMDIyMDNDMDMwNDAwMDA0MzEwMjRCOQorOjEwRkE2MDAwMTA0MDAwMjcyNDAzRkZCRjhGODUwMjI0M0MwMjAwMDFDMQorOjEwRkE3MDAwOEM0MjdEREMwMEEzMjAyNDAwNDMxMDI0MTQ4MjAwMEM1RgorOjEwRkE4MDAwMDAwMDAwMDAzQzAyMDAwMThDNDI3REUwMjQ0MjAwMDFBNQorOjEwRkE5MDAwM0MwMTAwMDFBQzIyN0RFMDJDNDIwMDAyMTQ0MDAwMDgzMQorOjEwRkFBMDAwMjQwMjAwMDEzQzAxMDAwMTA4MDA0RUFEQUMyMjdFMDBBMgorOjEwRkFCMDAwM0MwMTAwMDFBQzIwN0RFMDNDMDEwMDAxQUMyMDdFMDA1NworOjEwRkFDMDAwM0MwMjAwMDE4QzQyN0UwMDEwNDAwMDA2MzBBMjAwNDA0MworOjEwRkFEMDAwMTA0MDAwMDQyNDAyMDAwMTNDMDEwMDAxMDgwMDRFQjg1RgorOjEwRkFFMDAwQUMyMjdFMDQzQzAxMDAwMUFDMjA3RTA0M0MwMTAwMDFGQworOjEwRkFGMDAwQUMyNTdEREMzQzAxMDAwMTA4MDA0RUM4QUMyMDdFMTAyNgorOjEwRkIwMDAwMjQwMjAwMDEzQzAxMDAwMUFDMjI3RTEwM0MwMTAwMDFGNgorOjEwRkIxMDAwQUMyMDdFMDAzQzAxMDAwMUFDMjA3REUwM0MwMTAwMDFGNgorOjEwRkIyMDAwQUMyMDdFMDQzQzAxMDAwMUFDMjA3RERDM0MwMzAwMDFFNAorOjEwRkIzMDAwOEM2MzdERDAzQzAyMDAwMThDNDI3REQ0MTA2MjAwMDNCNgorOjEwRkI0MDAwM0MwMjAyMDAzQzAxMDAwMUFDMjM3REQ0MDBDMjEwMjQyMQorOjEwRkI1MDAwMTA0MDAwMDcyNDYzRkZGRjhGODIwMjIwMjQwMzAwMDE2RQorOjEwRkI2MDAwM0MwMTAwMDFBQzIzNUNDQzA4MDA1MDg1M0MwM0Y3MDA0RAorOjEwRkI3MDAwMkM2MjAwMEUxMDQwMDFBODAwMDMxMDgwM0MwMTAwMDExRgorOjEwRkI4MDAwMDAyMjA4MjE4QzIyNUI4MDAwNDAwMDA4MDAwMDAwMDA1OQorOjEwRkI5MDAwM0MwMTAwMDFBQzIwN0UwMDNDMDEwMDAxQUMyMDdERTA3NgorOjEwRkJBMDAwM0MwMTAwMDFBQzIwN0REQzNDMDEwMDAxQUMyMDdFMDQ2NgorOjEwRkJCMDAwM0MwMTAwMDFBQzIwN0RGODNDMDEwMDAxQUMyMDdERjA0RgorOjEwRkJDMDAwMEMwMDQ4NkFBRjgwMDIyNDI0MDIwMDAyM0MwMTAwMDFCQworOjEwRkJEMDAwQUMyMjdERDAzQzAyMDAwMThDNDI3RTEwMTQ0MDAwNTZDNQorOjEwRkJFMDAwM0MwM0ZERkY4RUUyMDAwMDM0NjNGRkZGMDA0MzEwMjQ1RQorOjEwRkJGMDAwMEMwMDQyOUJBRUUyMDAwMEFGODAwMjA0OEY4MjAyMDA0NAorOjEwRkMwMDAwMjQwM0ZGRkQwMDQzMTAyNEFGODIwMjAwM0MwMTAwMDFFOQorOjEwRkMxMDAwQUMyMDdFMjA4RjgzMDA1NDNDMDIwMDAxOEM0MjdERjg5MgorOjEwRkMyMDAwMjQwNDAwMDEzQzAxMDAwMUFDMjQ3RTBDMjQ0MjAwMDFBQworOjEwRkMzMDAwM0MwMTAwMDFBQzIyN0RGODJDNDIwMDA0M0MwMTAwMDE5MworOjEwRkM0MDAwQUMyMzdERjQxNDQwMDAwNjI0MDIwMDAzM0MwMTAwMDFCMworOjEwRkM1MDAwQUMyNDVDQ0MzQzAxMDAwMTA4MDA1MDgzQUMyMDdERjg1MgorOjEwRkM2MDAwM0MwMTAwMDEwODAwNTA4M0FDMjI3REQwOEY4MzAwNTRGQQorOjEwRkM3MDAwM0MwMjAwMDE4QzQyN0RGNDI0NjNEOEYwMDA0MzEwMjM0MQorOjEwRkM4MDAwMkM0MjI3MTAxNDQwMDAwMzI0MDIwMDA0M0MwMTAwMDExMAorOjEwRkM5MDAwQUMyMjdERDAzQzAyMDAwMThDNDI3RTEwMTQ0MDAwMjYzNAorOjEwRkNBMDAwM0MwM0ZERkY4RUUyMDAwMDM0NjNGRkZGMDA0MzEwMjQ5RAorOjEwRkNCMDAwMDgwMDUwODNBRUUyMDAwMDNDMDQwMDAxOEM4NDVEOUM4RgorOjEwRkNDMDAwM0MwMTAwMDEwQzAwNTA4QUFDMjA3REU4M0MwMjAwMDFBMAorOjEwRkNEMDAwOEM0MjdFMUNBRjgyMDIwNDNDMDIwMDAxOEM0MjdFMTBFQQorOjEwRkNFMDAwMTQ0MDAwMTUzQzAzRkRGRjhFRTIwMDAwMzQ2M0ZGRkY2QgorOjEwRkNGMDAwMDA0MzEwMjRBRUUyMDAwMDhGODIwMjA0MzA0MjAwMzA0NAorOjEwRkQwMDAwMTQ0MDAxM0MyNDAyMDAwMjNDMDMwMDAxOEM2MzdFMUM3MQorOjEwRkQxMDAwMjQwMjAwMDUzQzAxMDAwMUFDMjI3REQwM0MwMTAwMDEyMQorOjEwRkQyMDAwMDgwMDUwODNBQzIzN0UyMDNDMDIwMDAxOEM0MjdFMTBGMAorOjEwRkQzMDAwMTA0MDAwMTAzQzAzRkRGRjNDMDIwMDAxOEM0MjVENkM1MgorOjEwRkQ0MDAwMjQ0MjAwMDEzQzAxMDAwMUFDMjI1RDZDMkM0MjAwMDIwNworOjEwRkQ1MDAwMTQ0MDAxMzEyNDAyMDAwMTNDMDEwMDAxQUMyMjVENzQxOQorOjEwRkQ2MDAwM0MwMTAwMDFBQzIwNUQ2QzNDMDEwMDAxMDgwMDUwODNBNworOjEwRkQ3MDAwQUMyMjVDQ0M4RUUyMDAwMDM0NjNGRkZGMDA0MzEwMjQxMQorOjEwRkQ4MDAwQUVFMjAwMDAzQzAyMDAwMThDNDI3RTAwMTA0MDAxMjJFNQorOjEwRkQ5MDAwMDAwMDAwMDAzQzAyMDAwMThDNDI3RERDMTA0MDAxMUU4RQorOjEwRkRBMDAwMDAwMDAwMDAzQzAxMDAwMUFDMjI3RTA4MjQwMjAwMDM5OAorOjEwRkRCMDAwM0MwMTAwMDFBQzIyN0RFMDA4MDA1MDI0MjQwMjAwMDYzMgorOjEwRkRDMDAwM0MwMTAwMDFBQzIwN0RFODhGODIwMjA0MzQ0MjAwNDBGNworOjEwRkREMDAwQUY4MjAyMDQzQzAyMDAwMThDNDI3RTIwMjQwMzAwMDcxMworOjEwRkRFMDAwM0MwMTAwMDFBQzIzN0REMDM0NDIwMDQwM0MwMTAwMDFDNQorOjEwRkRGMDAwQUMyMjdFMjAzQzAyMDAwMThDNDI3RTAwMTA0MDAwMDVCNworOjEwRkUwMDAwMDAwMDAwMDAzQzAyMDAwMThDNDI3RERDMTA0MDAwRjk0MworOjEwRkUxMDAwMjQwMjAwMDIzQzA1MDAwMTI0QTU3REUwOENBMjAwMDAyNAorOjEwRkUyMDAwMkM0MjRFMjExMDQwMDBGMzI0MDIwMDAyM0MwMjAwMDE0QgorOjEwRkUzMDAwOEM0MjdFMDQxMDQwMDBGODI0MDRGRkJGM0MwMjAwMDEwNQorOjEwRkU0MDAwOEM0MjdEREMzQzAzMDAwMThDNjM3RTA4MDA0NDEwMjQ1RQorOjEwRkU1MDAwMDA2NDE4MjQxMDQzMDAwNDI0MDIwMDAxM0MwMTAwMDE0NgorOjEwRkU2MDAwMDgwMDUwODNBQzIyN0REMDI0MDIwMDAzQUNBMjAwMDAyNQorOjEwRkU3MDAwMjQwMjAwMDgzQzAxMDAwMUFDMjI3REQwM0MwMjAwMDFCQworOjEwRkU4MDAwOEM0MjdFMEMxMDQwMDAwQzI0MDIwMDAxM0MwNDAwMDE1NgorOjEwRkU5MDAwMEMwMDUwOTc4Qzg0N0REQzNDMDIwMDAxOEM0MjdFMjg1MworOjEwRkVBMDAwMTQ0MDAwMDUyNDAyMDAwMTNDMDIwMDAxOEM0MjdFMjQyMworOjEwRkVCMDAwMTA0MDAwMDYyNDAyMDAwMTNDMDEwMDAxQUMyMjVDQ0M5MQorOjEwRkVDMDAwM0MwMTAwMDEwODAwNTA4M0FDMjA3REY4M0MwMjAwMDE5OQorOjEwRkVEMDAwOEM0MjdERjAzQzAzMDAwMThDNjM3RERDMkM0MjAwMDFGMAorOjEwRkVFMDAwMDAwMjEwQzAzMDYzMDAwODNDMDEwMDAxQUMyMjdERjAyQworOjEwRkVGMDAwM0MwMTAwMDFBQzIzN0RFQzhGODMwMDU0MjQwMjAwMDlGNworOjEwRkYwMDAwM0MwMTAwMDFBQzIyN0REMDNDMDEwMDAxMDgwMDUwODM3RgorOjEwRkYxMDAwQUMyMzdERjQ4RjgzMDA1NDNDMDIwMDAxOEM0MjdERjRCRAorOjEwRkYyMDAwMjQ2M0Q4RjAwMDQzMTAyMzJDNDIyNzEwMTQ0MDAwQTg2QgorOjEwRkYzMDAwMDAwMDAwMDAzQzAyMDAwMThDNDI3RTAwMTA0MDAwMDVFMQorOjEwRkY0MDAwMDAwMDAwMDAzQzAyMDAwMThDNDI3RERDMTA0MDAwQTk1MgorOjEwRkY1MDAwMjQwMjAwMDIzQzAzMDAwMTI0NjM3REUwOEM2MjAwMDA2NworOjEwRkY2MDAwMkM0MjRFMjExMDQwMDBBMzI0MDIwMDAyM0MwMjAwMDE1QQorOjEwRkY3MDAwOEM0MjdFMEMxMDQwMDAwRTAwMDAwMDAwM0MwMjAwMDE4QworOjEwRkY4MDAwOEM0MjdEREMzQzAxMDAwMUFDMjA3RTBDMzA0MjAwODBDNAorOjEwRkY5MDAwMTA0MDAwMkYyNDAyMDAwQzhGODIwMjA0MzA0MjAwODBBNworOjEwRkZBMDAwMTQ0MDAwMEMyNDAyMDAwMzA4MDA1MDExMjQwMjAwMEMyRAorOjEwRkZCMDAwM0MwMjAwMDE4QzQyN0REQzMwNDIwMDgwMTQ0MDAwMDU5MAorOjEwRkZDMDAwMjQwMjAwMDM4RjgyMDIwNDMwNDIwMDgwMTA0MDAwMUY5MAorOjEwRkZEMDAwMjQwMjAwMDNBQzYyMDAwMDI0MDIwMDBBM0MwMTAwMDE3QworOjEwRkZFMDAwQUMyMjdERDAzQzA0MDAwMTI0ODQ3RTE4OEM4MjAwMDA2OQorOjEwRkZGMDAwM0MwMzAwMDE4QzYzN0RGMDAwNDMxMDI1QUY4MjAyMDRCNgorOjAyMDAwMDAyMTAwMEVDCis6MTAwMDAwMDA4QzgzMDAwMDNDMDQwMDAxOEM4NDdERjAyNDAyMDAwQkYyCis6MTAwMDEwMDAzQzAxMDAwMUFDMjI3REQwMDA2NDE4MjUzQzAxMDAwMUE4Cis6MTAwMDIwMDBBQzIzN0UyMDNDMDUwMDAxMjRBNTdERTA4Q0EyMDAwMENECis6MTAwMDMwMDAyQzQyNEUyMTEwNDAwMDZGMjQwMjAwMDIzQzAyMDAwMUJECis6MTAwMDQwMDA4QzQyN0UxMDEwNDAwMDA1MDAwMDAwMDAyNDAyMDAwQ0NECis6MTAwMDUwMDAzQzAxMDAwMTA4MDA1MDgzQUMyMjdERDAzQzAyMDAwMTJECis6MTAwMDYwMDA4QzQyN0UwMDEwNDAwMDZDMDAwMDAwMDAzQzA0MDAwMTQ3Cis6MTAwMDcwMDA4Qzg0N0REQzEwODAwMDVFMzA4MjAwMDgzQzAzMDAwMTJGCis6MTAwMDgwMDA4QzYzN0RFQzEwNjIwMDY0MjQwMjAwMDMzQzAxMDAwMURCCis6MTAwMDkwMDBBQzI0N0UwOEFDQTIwMDAwMjQwMjAwMDYzQzAxMDAwMTUyCis6MTAwMEEwMDAwODAwNTA4M0FDMjI3REQwOEY4MjAyMDAzNDQyMDAwMkNGCis6MTAwMEIwMDBBRjgyMDIwMDhGODMwMDU0MjQwMjAwMEQzQzAxMDAwMTM2Cis6MTAwMEMwMDBBQzIyN0REMDNDMDEwMDAxQUMyMzdERjQ4RjgzMDA1NDMxCis6MTAwMEQwMDAzQzAyMDAwMThDNDI3REY0MjQ2M0Q4RjAwMDQzMTAyM0RECis6MTAwMEUwMDAyQzQyMjcxMDE0NDAwMDNBMDAwMDAwMDAzQzAyMDAwMTlFCis6MTAwMEYwMDA4QzQyN0UxMDEwNDAwMDI5MjQwMjAwMEUzQzAzMDAwMUI3Cis6MTAwMTAwMDA4QzYzN0UyNDNDMDEwMDAxMTQ2MDAwMTVBQzIyN0REMDdDCis6MTAwMTEwMDAwQzAwNDNERDAwMDAwMDAwM0MwNTAwMDE4Q0E1NUNDODFDCis6MTAwMTIwMDAwQzAwNTJBMjAwMDAyMDIxM0MwMzAwMDE4QzYzNUNDODNCCis6MTAwMTMwMDAyNDAyMDAwNDE0NjIwMDA1MjQwM0ZGRkIzQzAyMDAwMUJBCis6MTAwMTQwMDA4QzQyNUNDNDA4MDA1MDUyMjQwM0ZGRjczQzAyMDAwMUJCCis6MTAwMTUwMDA4QzQyNUNDNDAwNDMxMDI0M0MwMTAwMDFBQzIyNUNDNDBFCis6MTAwMTYwMDA4RUUyMDAwMDNDMDMwMjAwMDA0MzEwMjVBRUUyMDAwMEQ2Cis6MTAwMTcwMDA4RjgyMDIyNDNDMDEwMDAxQUMyMjdFMkM4RjgyMDIyMDVGCis6MTAwMTgwMDAyNDAzRkZGQjAwNDMxMDI0QUY4MjAyMjA4RjgyMDIyMDUxCis6MTAwMTkwMDAzNDQyMDAwMjA4MDA1MDgzQUY4MjAyMjAzQzAyMDAwMTdBCis6MTAwMUEwMDA4QzQyN0UwMDEwNDAwMDA1MDAwMDAwMDAzQzAyMDAwMTZGCis6MTAwMUIwMDA4QzQyN0REQzEwNDAwMDBGMjQwMjAwMDIzQzAyMDAwMTUyCis6MTAwMUMwMDA4QzQyN0RFMDJDNDI0RTIxMTA0MDAwMEEyNDAyMDAwMkE1Cis6MTAwMUQwMDAzQzAyMDAwMThDNDI3RTAwMTA0MDAwMEYwMDAwMDAwMDM1Cis6MTAwMUUwMDAzQzAyMDAwMThDNDI3RERDMTQ0MDAwMEIwMDAwMDAwMDRBCis6MTAwMUYwMDAyNDAyMDAwMjNDMDEwMDAxMDgwMDUwODNBQzIyN0REMEEzCis6MTAwMjAwMDAzQzAyMDAwMThDNDI3RTAwMTA0MDAwMDMwMDAwMDAwMDEwCis6MTAwMjEwMDAwQzAwNDI5QjAwMDAwMDAwOEY4MjAyMjAzQzAzRjcwMDhDCis6MTAwMjIwMDAwMDQzMTAyNUFGODIwMjIwOEZCRjAwMTAwM0UwMDAwOEJBCis6MTAwMjMwMDAyN0JEMDAxODNDMDMwMDAxMjQ2MzdFMjg4QzYyMDAwMDY3Cis6MTAwMjQwMDAxMDQwMDAwNTM0NDIyMDAwM0MwMTAwMDFBQzIyN0UxQzFECis6MTAwMjUwMDAwODAwNTA5NUFDNjAwMDAwM0MwMTAwMDFBQzI0N0UxQ0ZECis6MTAwMjYwMDAwM0UwMDAwODAwMDAwMDAwMjdCREZGRTAzMDgyMDAzMEZFCis6MTAwMjcwMDBBRkJGMDAxODNDMDEwMDAxQUMyMjdFMjQxNDQwMDA2NzhGCis6MTAwMjgwMDAzQzAyRkZGRjM0NDIxRjBFMDA4MjEwMjQxNDQwMDA2MTI0Cis6MTAwMjkwMDAyNDAyMDAzMDMwODIyMDAwMTA0MDAwNUQzMDgzODAwMDU2Cis6MTAwMkEwMDAwMDAzMUEwMjMwODIwMDAxMDAwMjEyMDAzQzA0MDAwMTI3Cis6MTAwMkIwMDA4Qzg0NUQ5QzAwNjIxODI1MDAwMzMxQzIzQzAzMDAwMTYwCis6MTAwMkMwMDAyNDYzNUQ3ODMwODI4MDAwMDAwMjEyMDIzMDg0MDAwMUQ1Cis6MTAwMkQwMDAwMDA0MjIwMDAwNDQxMDI1MDAwMjM5QzIwMDA2MTA4MEVDCis6MTAwMkUwMDAwMDQzMTAyMTAwNDcxMDIxOTA0MzAwMDAyNDAyMDAwMTI4Cis6MTAwMkYwMDAxMDYyMDAyNTAwMDAwMDAwMTA2MDAwMDcyNDAyMDAwMkM4Cis6MTAwMzAwMDAxMDYyMDAxMzI0MDIwMDAzMTA2MjAwMkMzQzA1MDAwRjUxCis6MTAwMzEwMDAwODAwNTBGOTAwMDAwMDAwOEY4MjAyMDAyNDAzRkVGRjU1Cis6MTAwMzIwMDAwMDQzMTAyNEFGODIwMjAwOEY4MjAyMjAzQzAzRkZGRUI0Cis6MTAwMzMwMDAzNDYzRkZGRjAwNDMxMDI0QUY4MjAyMjAzQzAxMDAwMTIwCis6MTAwMzQwMDBBQzIwN0U0NDNDMDEwMDAxMDgwMDUxMDRBQzIwN0U0Q0VFCis6MTAwMzUwMDA4RjgyMDIwMDM0NDIwMTAwQUY4MjAyMDA4RjgyMDIyMEFECis6MTAwMzYwMDAzQzAzRkZGRTM0NjNGRkZGMDA0MzEwMjRBRjgyMDIyMEYyCis6MTAwMzcwMDAyNDAyMDEwMDNDMDEwMDAxQUMyMjdFNDQzQzAxMDAwMTRBCis6MTAwMzgwMDAwODAwNTEwNEFDMjA3RTRDOEY4MjAyMDAyNDAzRkVGRjQzCis6MTAwMzkwMDAwMDQzMTAyNEFGODIwMjAwOEY4MjAyMjAzQzAzMDAwMTQwCis6MTAwM0EwMDAwMDQzMTAyNUFGODIwMjIwM0MwMTAwMDFBQzIwN0U0NEI2Cis6MTAwM0IwMDAzQzAxMDAwMTA4MDA1MTA0QUMyMzdFNEM4RjgyMDIwMEY2Cis6MTAwM0MwMDAzNDQyMDEwMEFGODIwMjAwOEY4MjAyMjAzQzAzMDAwMTEwCis6MTAwM0QwMDAwMDQzMTAyNUFGODIwMjIwMjQwMjAxMDAzQzAxMDAwMUVECis6MTAwM0UwMDBBQzIyN0U0NDNDMDEwMDAxMDgwMDUxMDRBQzIzN0U0QzQ5Cis6MTAwM0YwMDAzNEE1RkZGRjNDMDQwMDAxMjQ4NDVCQjhBRkEzMDAxMEM4Cis6MTAwNDAwMDAwQzAwMjQwM0FGQTAwMDE0MDgwMDUxMDQwMDAwMDAwMEY5Cis6MTAwNDEwMDAyNDAyMDAzMDNDMDEwMDAxQUMyMjdFMjg4RkJGMDAxODZFCis6MTAwNDIwMDAwM0UwMDAwODI3QkQwMDIwMDAwMDAwMDAyN0JERkZDODMyCis6MTAwNDMwMDBBRkIyMDAyODAwODA5MDIxQUZCMzAwMkMwMEEwOTgyMTFCCis6MTAwNDQwMDBBRkIwMDAyMDAwQzA4MDIxM0MwNDAwMDEyNDg0NUJEMEI4Cis6MTAwNDUwMDAzQzA1MDAwOTNDMDIwMDAxOEM0MjVDQzgzNEE1OTAwMUI3Cis6MTAwNDYwMDAwMjQwMzAyMTAyNjAzODIxQUZCRjAwMzBBRkIxMDAyNDFDCis6MTAwNDcwMDBBN0EwMDAxQUFGQjAwMDE0MEMwMDI0MDNBRkEyMDAxMDE0Cis6MTAwNDgwMDAyNDAyMDAwMjEyNjIwMDgzMkU2MjAwMDMxMDQwMDAwNTY1Cis6MTAwNDkwMDAyNDAyMDAwMTEyNjIwMDBBMDAwMDAwMDAwODAwNTI5QkMyCis6MTAwNEEwMDAwMDAwMDAwMDI0MDIwMDA0MTI2MjAwRkEyNDAyMDAwODg2Cis6MTAwNEIwMDAxMjYyMDBGOTNDMDJGRkVDMDgwMDUyOUIwMDAwMDAwMEIxCis6MTAwNEMwMDAzQzAyMDAwMThDNDI1Q0M0MzA0MjAwMDIxNDQwMDAwNDMzCis6MTAwNEQwMDAwMDEyODk0MDNDMDJGRkZCMzQ0MkZGRkYwMjAyODAyNEVECis6MTAwNEUwMDAzQzAxMDAwMTAwMzEwODIxQUMzMDdFM0MzQzAyNDAwMDYwCis6MTAwNEYwMDAwMjAyMTAyNDEwNDAwMDRFMDAxMDIzQzIzMDg0MDAzMDRECis6MTAwNTAwMDAwMDEwMTM4MjMwNDIwMDFDM0MwMzAwMDEyNDYzNUQwODhDCis6MTAwNTEwMDAwMDQzMTAyMTAwODIzODIxM0MwMjAwMjAwMjAyMTAyNEY2Cis6MTAwNTIwMDAxMDQwMDAwNjI0MDIwMTAwM0MwMTAwMDEwMDMxMDgyMUI2Cis6MTAwNTMwMDBBQzIyN0U0MDA4MDA1MTUwM0MwMjAwODAzQzAxMDAwMThBCis6MTAwNTQwMDAwMDMxMDgyMUFDMjA3RTQwM0MwMjAwODAwMjAyMTAyNEQxCis6MTAwNTUwMDAxMDQwMDAwNjAwMTIxOTQwM0MwMjAwMDEzQzAxMDAwMTVECis6MTAwNTYwMDAwMDIzMDgyMTA4MDA1MTVDQUMyMjdFNDgwMDEyMTE0MDkzCis6MTAwNTcwMDAzQzAxMDAwMTAwMjIwODIxQUMyMDdFNDg5NEU0MDAwMEU4Cis6MTAwNTgwMDAzQzAzMDAwMThDNjM1REJDMjQwMjAwMDUxMDYyMDAxMDc2Cis6MTAwNTkwMDBBN0E0MDAxODMyMDI0MDAwMTA0MDAwMDIzNDgyNDAwMDNDCis6MTAwNUEwMDBBN0EyMDAxODI0MDQwMDAxOTRFMjAwMDIyNDA1MDAwNDFDCis6MTAwNUIwMDAyNEU2MDAwMjM0NDIwMDAxMEMwMDQ5OEVBNEUyMDAwMjRECis6MTAwNUMwMDAyNDA0MDAwMTAwMDAyODIxMEMwMDQ5OEUyN0E2MDAxOEYxCis6MTAwNUQwMDAzQzAyMDAwMThDNDI1Q0M4MjQxMTAwMDEzQzAxMDAwMTc2Cis6MTAwNUUwMDBBQzMxNUNENDE0NTMwMDA0MzIwMjgwMDAwQzAwNDI5QkY2Cis6MTAwNUYwMDAwMDAwMDAwMDMyMDI4MDAwMTA0MDAxMUYwMDAwMDAwMEQ3Cis6MTAwNjAwMDAwQzAwNDI5QjAwMDAwMDAwM0MwMzAwMDE4QzYzNURCQ0I5Cis6MTAwNjEwMDAyNDAyMDAwNTEwNjIwMTE4MjQwMjAwMDIzQzAxMDAwMUJFCis6MTAwNjIwMDBBQzMxNUNDQzNDMDEwMDAxMDgwMDUyOUJBQzIyNUNDOEEwCis6MTAwNjMwMDAyNDA0MDAwMTI0MDUwMDA0MjdCMDAwMUEwQzAwNDk4RTkwCis6MTAwNjQwMDAwMjAwMzAyMTI0MDQwMDAxMDAwMDI4MjEwQzAwNDk4RTAyCis6MTAwNjUwMDAwMjAwMzAyMTNDMDIwMDAxMDA1MTEwMjE4QzQyN0UzNDA2Cis6MTAwNjYwMDAzQzA0MDAwMThDODQ1Q0M4M0MwM0JGRkYzNDYzRkZGRjgzCis6MTAwNjcwMDAzQzAxMDAwMUFDMzM1Q0Q0MDA0MzEwMjQzQzAxMDAwMTc4Cis6MTAwNjgwMDAwMDMxMDgyMTEwOTMwMEZBQUMyMjdFMzQwODAwNTI5QkZFCis6MTAwNjkwMDAwMDAwMDAwMDNDMDIyMDAwMDIwMjEwMjQxMDQwMDAwNTZGCis6MTAwNkEwMDAyNDAyMDAwMTNDMDEwMDAxQUMyMjVEOTgwODAwNTFBRDFDCis6MTAwNkIwMDAwMDEyODk0MDNDMDEwMDAxQUMyMDVEOTgwMDEyODk0MDg1Cis6MTAwNkMwMDAzQzAxMDAwMTAwMzEwODIxQUMzMDdFMzgzQzAyNDAwMDgyCis6MTAwNkQwMDAwMjAyMTAyNDE0NDAwMDE2MDAwMDAwMDAzQzAyMDAwMTM5Cis6MTAwNkUwMDA4QzQyNUQ5ODEwNDAwMDA4MjQwNDAwMDQyNDA1MDAwMTk5Cis6MTAwNkYwMDAwQzAwNEQ5MzI0MDYyMDAwMjQwMjAwMDEzQzAxMDAwMTVGCis6MTAwNzAwMDAwMDM3MDgyMUFDMjI4M0FDM0MwMjAwMDEwMDUxMTAyMUNCCis6MTAwNzEwMDA4QzQyN0UzMDNDMDNCRkZGMzQ2M0ZGRkYwMDQzMTAyNDU0Cis6MTAwNzIwMDAzQzAxMDAwMTAwMzEwODIxMDgwMDUyOTlBQzIyN0UzMEMyCis6MTAwNzMwMDAzQzAyMDAwMThDNDI1RDk4MTA0MDAwMjgzQzAzMDBBMDYwCis6MTAwNzQwMDAwMjAzMTAyNDU0NDMwMDBEM0MwMjAwMjAzQzAyMDAwMTJGCis6MTAwNzUwMDA4QzQyNUQ5QzI0MDMwMTAwM0MwMTAwMDEwMDMxMDgyMTEyCis6MTAwNzYwMDBBQzIzN0U0NDNDMDMwMDAxM0MwMTAwMDEwMDMxMDgyMTIwCis6MTAwNzcwMDBBQzIzN0U0QzA4MDA1MUYwMzQ0MjA0MDAwMjAyMTAyNEU1Cis6MTAwNzgwMDAxMDQwMDAwODI0MDMwMTAwM0MwMjAwMDE4QzQyNUQ5Q0UzCis6MTAwNzkwMDAzQzAxMDAwMTAwMzEwODIxQUMyMzdFNDQwODAwNTFGMEU3Cis6MTAwN0EwMDAzNDQyMDgwMDNDMDIwMDgwMDIwMjEwMjQxMDQwMDAyRTU3Cis6MTAwN0IwMDAzQzAzMDAwMTNDMDIwMDAxOEM0MjVEOUMzQzAxMDAwMUI1Cis6MTAwN0MwMDAwMDMxMDgyMUFDMjM3RTRDMzQ0MjBDMDAzQzAxMDAwMTc2Cis6MTAwN0QwMDBBQzIyNUQ5QzA4MDA1MjE4MjQwNDAwMDEzQzAyMDAyMDU5Cis6MTAwN0UwMDAwMjAyMTAyNDEwNDAwMDA2MjQwMjAxMDAzQzAxMDAwMTE2Cis6MTAwN0YwMDAwMDMxMDgyMUFDMjI3RTQ0MDgwMDUyMDEzQzAyMDA4MEY2Cis6MTAwODAwMDAzQzAxMDAwMTAwMzEwODIxQUMyMDdFNDQzQzAyMDA4MDA0Cis6MTAwODEwMDAwMjAyMTAyNDEwNDAwMDA3MDAxMjE5NDAzQzAyMDAwMTlGCis6MTAwODIwMDAzQzAxMDAwMTAwMjMwODIxQUMyMjdFNEMwODAwNTIwRjNECis6MTAwODMwMDAyNDA0MDAwMTAwMTIxMTQwM0MwMTAwMDEwMDIyMDgyMUEzCis6MTAwODQwMDBBQzIwN0U0QzI0MDQwMDAxMDAwMDI4MjEyN0IwMDAxRUFCCis6MTAwODUwMDAwQzAwNDk0QzAyMDAzMDIxMjQwNDAwMDEwMDAwMjgyMTMyCis6MTAwODYwMDAwQzAwNDk0QzAyMDAzMDIxMjQwNDAwMDEyNDA1MDAwMTQxCis6MTAwODcwMDAyN0IwMDAxQzBDMDA0OTRDMDIwMDMwMjEyNDA0MDAwMTY4Cis6MTAwODgwMDAyNDA1MDAwMTBDMDA0OTRDMDIwMDMwMjEwODAwNTI5OTU3Cis6MTAwODkwMDAwMDAwMDAwMDNDMDJGRkVDMzQ0MkZGRkYwMjAyODAyNDEzCis6MTAwOEEwMDAzQzAyMDAwODAyMDI4MDI1MDAxMjExNDAzQzAxMDAwMUI4Cis6MTAwOEIwMDAwMDIyMDgyMUFDMzA3RTM4M0MwMjIwMDAwMjAyMTAyNEM1Cis6MTAwOEMwMDAxMDQwMDAwOTAwMDAwMDAwM0MwMjAwMDE4QzQyNUQ3NEYxCis6MTAwOEQwMDAxNDQwMDAwNTI0MDIwMDAxM0MwMTAwMDFBQzIyNUQ5ODk3Cis6MTAwOEUwMDAwODAwNTIzQTNDMDI0MDAwM0MwMTAwMDFBQzIwNUQ5OEY3Cis6MTAwOEYwMDAzQzAyNDAwMDAyMDIxMDI0MTQ0MDAwMUUwMDAwMDAwMEQwCis6MTAwOTAwMDAzQzAyMDAwMThDNDI1RDk4M0MwMTAwMDFBQzIwNUNFMDlGCis6MTAwOTEwMDAxMDQwMDAwNzI0MDIyMDIwM0MwMTAwMDFBQzIyNUQ5QzE1Cis6MTAwOTIwMDAyNDAyMDAwMTNDMDEwMDAxMDAzNzA4MjFBQzIyODNBQzA1Cis6MTAwOTMwMDAzQzA0QkZGRjAwMTIxOTQwM0MwMjAwMDEwMDQzMTAyMTlCCis6MTAwOTQwMDA4QzQyN0UzMDNDMDUwMDAxOENBNTVDQzgzNDg0RkZGRkRFCis6MTAwOTUwMDAwMDQ0MTAyNDNDMDEwMDAxMDAyMzA4MjFBQzIyN0UzMDE5Cis6MTAwOTYwMDAyNDAyMDAwMTEwQTIwMDQ0MDAwMDAwMDAwODAwNTI5OTc3Cis6MTAwOTcwMDAwMDAwMDAwMDNDMDIwMDAxOEM0MjVEOTgxMDQwMDAxQzA5Cis6MTAwOTgwMDAyNDAyMjAwMDNDMDEwMDAxQUMyMjVEOUMzQzAzMDBBMDNECis6MTAwOTkwMDAwMjAzMTAyNDE0NDMwMDA1MDAxMjExNDAzNDAyQTAwMDg5Cis6MTAwOUEwMDAzQzAxMDAwMTA4MDA1Mjk0QUMyMjVEOUMzQzAzMDAwMTE0Cis6MTAwOUIwMDAwMDYyMTgyMThDNjM3RTM4M0MwMjAwMjAwMDYyMTAyNDAzCis6MTAwOUMwMDAxMDQwMDAwNDI0MDIyMDAxM0MwMTAwMDEwODAwNTI5NDYwCis6MTAwOUQwMDBBQzIyNUQ5QzNDMDIwMDgwMDA2MjEwMjQxMDQwMDAxRjhECis6MTAwOUUwMDAzNDAyQTAwMTNDMDEwMDAxMDgwMDUyOTRBQzIyNUQ5QzNECis6MTAwOUYwMDAzQzAyMDAyMDAyMDIxMDI0MTA0MDAwMDcwMDEyMTk0MDlGCis6MTAwQTAwMDAyNDAyMDEwMDNDMDEwMDAxMDAyMzA4MjFBQzIyN0U0NEE1Cis6MTAwQTEwMDAwODAwNTI4ODNDMDIwMDgwMDAxMjExNDAzQzAxMDAwMTk1Cis6MTAwQTIwMDAwMDIyMDgyMUFDMjA3RTQ0M0MwMjAwODAwMjAyMTAyNEY3Cis6MTAwQTMwMDAxMDQwMDAwNjAwMTIxOTQwM0MwMjAwMDEzQzAxMDAwMTc4Cis6MTAwQTQwMDAwMDIzMDgyMTA4MDA1Mjk0QUMyMjdFNEMwMDEyMTE0MDcxCis6MTAwQTUwMDAzQzAxMDAwMTAwMjIwODIxQUMyMDdFNEMzQzAzMDAwMTM3Cis6MTAwQTYwMDA4QzYzNUNDODI0MDIwMDAxMTA2MjAwMDMwMDAwMDAwMEQ3Cis6MTAwQTcwMDAwQzAwNDI5QjAwMDAwMDAwOEZCRjAwMzA4RkIzMDAyQ0ExCis6MTAwQTgwMDA4RkIyMDAyODhGQjEwMDI0OEZCMDAwMjAwM0UwMDAwODRGCis6MTAwQTkwMDAyN0JEMDAzODI3QkRGRkQ4QUZCMjAwMjAwMDgwOTAyMUNECis6MTAwQUEwMDBBRkIxMDAxQzAwMDA4ODIxMjQwMjAwMDJBRkJGMDAyNDY3Cis6MTAwQUIwMDBBRkIwMDAxOEE3QTAwMDEyMTBBMjAwRDNBN0EwMDAxMDhBCis6MTAwQUMwMDAyQ0EyMDAwMzEwNDAwMDA1MjQwMjAwMDExMEEyMDAwQTFECis6MTAwQUQwMDAwMDEyODE0MDA4MDA1MzgwMDIyMDEwMjEyNDAyMDAwNEVCCis6MTAwQUUwMDAxMEEyMDA3RDI0MDIwMDA4MTBBMjAwN0MwMDEyMjk0MDAwCis6MTAwQUYwMDAwODAwNTM4MDAyMjAxMDIxM0MwMzAwMDEwMDcwMTgyMURGCis6MTAwQjAwMDA4QzYzN0UzQzNDMDI0MDAwMDA2MjEwMjQxNDQwMDAwOUNCCis6MTAwQjEwMDAyNDA0MDAwMTNDMDI3RkZGMzQ0MkZGRkYwMDYyODgyNDZFCis6MTAwQjIwMDAzQzAxMDAwMTAwMzAwODIxQUMzMTdFMzQwODAwNTM4MEM0Cis6MTAwQjMwMDAwMjIwMTAyMTI0MDUwMDAxMEMwMDQ5NEMyN0E2MDAxMEJBCis6MTAwQjQwMDAyNDA0MDAwMTI0MDUwMDAxMEMwMDQ5NEMyN0E2MDAxMEQ0Cis6MTAwQjUwMDA5N0EyMDAxMDMwNDIwMDA0MTA0MDAwMzQzQzExNDAwMEM1Cis6MTAwQjYwMDAzQzAyMDAwMThDNDI1REJDMjQ0M0ZGRkYyQzYyMDAwNjY2Cis6MTAwQjcwMDAxMDQwMDAzNDAwMDMxMDgwM0MwMTAwMDEwMDIyMDgyMUQ1Cis6MTAwQjgwMDA4QzIyNUJFMDAwNDAwMDA4MDAwMDAwMDAyNDA0MDAwMTBCCis6MTAwQjkwMDAyNDA1MDAxMTI3QjAwMDEyMEMwMDQ5NEMwMjAwMzAyMTNFCis6MTAwQkEwMDAyNDA0MDAwMTI0MDUwMDExMEMwMDQ5NEMwMjAwMzAyMUVFCis6MTAwQkIwMDA5N0E1MDAxMjMwQTI0MDAwMTA0MDAwMDIzQzA0MDAxMDMzCis6MTAwQkMwMDAzQzA0MDAwODNDMDMwMDAxMDgwMDUzMDEzMEEyODAwMEVGCis6MTAwQkQwMDAyNDA0MDAwMTI0MDUwMDE0MjdCMDAwMTIwQzAwNDk0QzI1Cis6MTAwQkUwMDAwMjAwMzAyMTI0MDQwMDAxMjQwNTAwMTQwQzAwNDk0Q0FCCis6MTAwQkYwMDAwMjAwMzAyMTk3QTUwMDEyMzBBMjEwMDAxMDQwMDAwMjIwCis6MTAwQzAwMDAzQzA0MDAxMDNDMDQwMDA4M0MwMzAwMDEzMEEyMDgwMDMyCis6MTAwQzEwMDA1NDQwMDAwMTNDMDMwMDAyM0MwMjgwMDAwMjIyMTAyNUU3Cis6MTAwQzIwMDAwMDY0MTgyNTA4MDA1MzBFMDA0Mzg4MjUzQzExMDAwMTdDCis6MTAwQzMwMDAwMjMwODgyMThFMzE3RTNDM0MwMjdGRkYzNDQyRkZGRjMwCis6MTAwQzQwMDAwMjIyODgyNDNDMDIwMDAxOEM0MjVDRDgxMDQwMDAxRDI2Cis6MTAwQzUwMDAwMDEyMTE0MDNDMDIwMDAxOEM0MjVEOTgxMDQwMDAwMkRECis6MTAwQzYwMDAzQzAyMjAwMDAyMjI4ODI1MDAxMjExNDAzQzAxMDAwMUI0Cis6MTAwQzcwMDAwMDIyMDgyMThDMjI3RTQwMTA0MDAwMDMzQzAyMDAyMDBDCis6MTAwQzgwMDAwODAwNTMyMjAyMjI4ODI1M0MwMkZGREYzNDQyRkZGRjg2Cis6MTAwQzkwMDAwMjIyODgyNDAwMTIxMTQwM0MwMTAwMDEwMDIyMDgyMTk4Cis6MTAwQ0EwMDA4QzIyN0U0ODEwNDAwMDAzM0MwMjAwODAwODAwNTMyRDM3Cis6MTAwQ0IwMDAwMjIyODgyNTNDMDJGRjdGMzQ0MkZGRkYwMjIyODgyNDYzCis6MTAwQ0MwMDAwMDEyMTE0MDNDMDEwMDAxMDAyMjA4MjFBQzMxN0UzNEE5Cis6MTAwQ0QwMDAwODAwNTM4MDAyMjAxMDIxMDAxMjI5NDAzQzAzMDAwMTJCCis6MTAwQ0UwMDAwMDY1MTgyMThDNjM3RTM4M0MwMjQwMDAwMDYyMTAyNEFECis6MTAwQ0YwMDAxNDQwMDAwODNDMDI3RkZGMzQ0MkZGRkYwMDYyODgyNDVBCis6MTAwRDAwMDAzQzAxMDAwMTAwMjUwODIxQUMzMTdFMzAwODAwNTM4MEYxCis6MTAwRDEwMDAwMjIwMTAyMTNDMDIwMDAxOEM0MjVDRDgxMDQwMDAzM0JDCis6MTAwRDIwMDAzQzExQzAwQzNDMDIwMDAxOEM0MjVENzQzQzA0QzAwQ0MwCis6MTAwRDMwMDAzNDg0MjAwMDNDMDMwMDAxOEM2MzVEOTgwMDAyMTAyQjdBCis6MTAwRDQwMDAwMDAyMTAyMzAwNDQxMDI0MTA2MDAwMDMwMDUxODgyNTg1Cis6MTAwRDUwMDAzQzAyMjAwMDAyMjI4ODI1M0MwMjAwMDEwMDQ1MTAyMUFGCis6MTAwRDYwMDA4QzQyN0U0NDEwNDAwMDAzM0MwMjAwMjAwODAwNTM1RDhBCis6MTAwRDcwMDAwMjIyODgyNTNDMDJGRkRGMzQ0MkZGRkYwMjIyODgyNDQyCis6MTAwRDgwMDAwMDEyMTE0MDNDMDEwMDAxMDAyMjA4MjE4QzIyN0U0Q0ZGCis6MTAwRDkwMDAxMDQwMDAwMzNDMDIwMDgwMDgwMDUzNjgwMjIyODgyNUFFCis6MTAwREEwMDAzQzAyRkY3RjM0NDJGRkZGMDIyMjg4MjQzQzAyMDAwMTA0Cis6MTAwREIwMDA4QzQyNUQ2MDEwNDAwMDAyM0MwMjA4MDAwMjIyODgyNTNGCis6MTAwREMwMDAzQzAyMDAwMThDNDI1RDY0MTA0MDAwMDIzQzAyMDQwMEMxCis6MTAwREQwMDAwMjIyODgyNTNDMDIwMDAxOEM0MjVENjgxMDQwMDAwNjFBCis6MTAwREUwMDAzQzAyMDEwMDA4MDA1MzdCMDIyMjg4MjUzQzAyN0ZGRjYxCis6MTAwREYwMDAzNDQyRkZGRjAwNjI4ODI0MDAxMjExNDAzQzAxMDAwMUQwCis6MTAwRTAwMDAwMDIyMDgyMUFDMzE3RTMwMDIyMDEwMjE4RkJGMDAyNDQ3Cis6MTAwRTEwMDA4RkIyMDAyMDhGQjEwMDFDOEZCMDAwMTgwM0UwMDAwOEQzCis6MTAwRTIwMDAyN0JEMDAyODI3QkRGRkQ4QUZCNDAwMjAwMDgwQTAyMTM3Cis6MTAwRTMwMDBBRkJGMDAyNEFGQjMwMDFDQUZCMjAwMThBRkIxMDAxNEI1Cis6MTAwRTQwMDBBRkIwMDAxMDhGOTAwMjAwM0MwMzAwMDE4QzYzNUNDOEJGCis6MTAwRTUwMDA4RjkzMDIyMDI0MDIwMDAyMTA2MjAwNjMyQzYyMDAwM0MwCis6MTAwRTYwMDAxMDQwMDAwNTI0MDIwMDAxMTA2MjAwMEEwMDE0MTk0MDFECis6MTAwRTcwMDAwODAwNTQ0ODAwMDAwMDAwMjQwMjAwMDQxMDYyMDA1QUQ4Cis6MTAwRTgwMDAyNDAyMDAwODEwNjIwMDU5MDAxNDkxNDAwODAwNTQ0OEUwCis6MTAwRTkwMDAwMDAwMDAwMDNDMDQwMDAxMDA4MzIwMjE4Qzg0N0UzQzgzCis6MTAwRUEwMDAzQzExMDAwMTAyMjM4ODIxOEUzMTdFMzQzQzAyNDAwMDM3Cis6MTAwRUIwMDAwMDgyMTAyNDEwNDAwMDNFM0MwMjAwMDgwMjIyMTAyNDUwCis6MTAwRUMwMDAxMDQwMDAyMDM2MTAwMDAyM0MwMjAwMDEwMDQzMTAyMUI3Cis6MTAwRUQwMDA4QzQyN0U0MDEwNDAwMDA1MzYxMDAwMjAzNjEwMDEwMDg0Cis6MTAwRUUwMDAzQzAyMDAyMDA4MDA1M0JEMDIyMjg4MjUyNDAyRkVGRjk4Cis6MTAwRUYwMDAwMjAyODAyNDNDMDJGRkRGMzQ0MkZGRkYwMjIyODgyNEVBCis6MTAwRjAwMDAwMDE0MTE0MDNDMDEwMDAxMDAyMjA4MjE4QzIyN0U0ODdGCis6MTAwRjEwMDAxMDQwMDAwNTNDMDIwMDAxMDI2Mjk4MjUzQzAyMDA4MDVFCis6MTAwRjIwMDAwODAwNTNEQzAyMjI4ODI1M0MwMkZGRkUzNDQyRkZGRjBBCis6MTAwRjMwMDAwMjYyOTgyNDNDMDJGRjdGMzQ0MkZGRkYwODAwNTNEQzJBCis6MTAwRjQwMDAwMjIyODgyNDI0MDJGRURGMDIwMjgwMjQzQzAyRkZGRUVCCis6MTAwRjUwMDAzNDQyRkZGRjAyNjI5ODI0M0MwMkZGNUYzNDQyRkZGRkVECis6MTAwRjYwMDAwMjIyODgyNDNDMDEwMDAxMDAyMzA4MjFBQzIwN0U0MDlECis6MTAwRjcwMDAzQzAxMDAwMTAwMjMwODIxQUMyMDdFNDgwQzAwNDg2QTk3Cis6MTAwRjgwMDAwMDAwMDAwMEFGOTAwMjAwQUY5MzAyMjA4RjgyMDIyMDg5Cis6MTAwRjkwMDAyNDAzRkZGQjAwNDMxMDI0QUY4MjAyMjA4RjgyMDIyMDMzCis6MTAwRkEwMDAzNDQyMDAwMkFGODIwMjIwMDgwMDUzRjMwMDE0MTE0MEMzCis6MTAwRkIwMDA4RjgyMDIwMDI0MDNGRkZEMDA0MzEwMjQwQzAwNDg2QUM2Cis6MTAwRkMwMDBBRjgyMDIwMDNDMDJCRkZGMzQ0MkZGRkYwQzAwNDI5Qjk1Cis6MTAwRkQwMDAwMjIyODgyNDAwMTQxMTQwM0MwMTAwMDEwMDIyMDgyMTUzCis6MTAwRkUwMDAwODAwNTQ0OEFDMzE3RTM0MDAxNDkxNDAzQzA0MDAwMUE4Cis6MTAwRkYwMDAwMDkyMjAyMThDODQ3RTM4M0MxMTAwMDEwMjMyODgyMTJECis6MTAxMDAwMDA4RTMxN0UzMDNDMDI0MDAwMDA4MjEwMjQxNDQwMDAxMURBCis6MTAxMDEwMDAwMDAwMDAwMDNDMDIwMDAxOEM0MjVEOTgxNDQwMDAwNjc0Cis6MTAxMDIwMDAzQzAyQkZGRjhGODIwMjAwMzQ0MjAwMDIwQzAwNDg2QTdCCis6MTAxMDMwMDBBRjgyMDIwMDNDMDJCRkZGMzQ0MkZGRkYwQzAwNDI5QjI0Cis6MTAxMDQwMDAwMjIyODgyNDNDMDEwMDAxMDAzMjA4MjEwODAwNTQ0ODkzCis6MTAxMDUwMDBBQzMxN0UzMDNDMDIwMDAxOEM0MjVEOTgxMDQwMDAwNUFFCis6MTAxMDYwMDAzQzAyMDAyMDNDMDIwMDAxOEM0MjVENzQxMDQwMDAyQkM5Cis6MTAxMDcwMDAzQzAyMDAyMDAwODIxMDI0MTA0MDAwMDczNjEwMDAyMDlGCis6MTAxMDgwMDAyNDAyMDEwMDNDMDEwMDAxMDAzMjA4MjFBQzIyN0U0NDEwCis6MTAxMDkwMDAwODAwNTQyODM2MTAwMTAwM0MwMTAwMDEwMDMyMDgyMUVDCis6MTAxMEEwMDBBQzIwN0U0NDI0MDJGRUZGMDIwMjgwMjQzQzAyMDA4MDI5Cis6MTAxMEIwMDAwMDgyMTAyNDEwNDAwMDA3MDAxNDE5NDAzQzAyMDAwMTc3Cis6MTAxMEMwMDAzQzAxMDAwMTAwMjMwODIxQUMyMjdFNEMwODAwNTQzOTY5Cis6MTAxMEQwMDAwMjYyOTgyNTAwMTQxMTQwM0MwMTAwMDEwMDIyMDgyMTAxCis6MTAxMEUwMDBBQzIwN0U0QzNDMDJGRkZFMzQ0MkZGRkYwMjYyOTgyNDlCCis6MTAxMEYwMDAwQzAwNDg2QTAwMDAwMDAwQUY5MDAyMDBBRjkzMDIyMDhECis6MTAxMTAwMDA4RjgyMDIyMDI0MDNGRkZCMDA0MzEwMjRBRjgyMDIyMEMxCis6MTAxMTEwMDA4RjgyMDIyMDM0NDIwMDAyQUY4MjAyMjAwMDE0MTE0MDZDCis6MTAxMTIwMDAzQzAxMDAwMTAwMjIwODIxQUMzMTdFMzA4RkJGMDAyNDM5Cis6MTAxMTMwMDA4RkI0MDAyMDhGQjMwMDFDOEZCMjAwMTg4RkIxMDAxNDQxCis6MTAxMTQwMDA4RkIwMDAxMDAzRTAwMDA4MjdCRDAwMjgyNDQ4NjU2MTI3Cis6MTAxMTUwMDA2NDY1NzIzQTIwMkY3MDcyNkY2QTY1NjM3NDczMkY3MkMwCis6MTAxMTYwMDA2MzczMkY3Mzc3MkY2NzY1MkYyRTJGNkU2OTYzMkY2NjNBCis6MTAxMTcwMDA3NzJGNjM2RjZENkQ2RjZFMkY2Njc3NkQ2MTY5NkUyRTYxCis6MTAxMTgwMDA2MzJDNzYyMDMxMkUzMTJFMzIyRTMxMzEyMDMxMzkzOUY3Cis6MTAxMTkwMDAzODJGMzAzNDJGMzIzNzIwMzIzMjNBMzEzMzNBMzQzMjJBCis6MTAxMUEwMDAyMDczNjg3NTYxNkU2NzIwNDU3ODcwMjAyNDAwMDAwMDA4Cis6MTAxMUIwMDA3NDY4NjU1RjQ0NDE1NzRFMDAwMDAwMDA1MzU0NDE0MzNBCis6MTAxMUMwMDA0QjVGMzEyMDAwMDAwMDAwNDI2MTY0NTM2RTY0NTI2RTM4Cis6MTAxMUQwMDA2NzAwMDAwMDNGNDU2RTcxNDU3Njc0MDAzRjZFNkY1MUE5Cis6MTAxMUUwMDA2NDQ1NzY1MDAwMDAwMDAwNjU3NjUyNkU2NzQ2NzU2QzY3Cis6MTAxMUYwMDA2QzAwMDAwMDQ5NkM2QzQzNkY2RTY2NTI3ODAwMDAwMDEyCis6MTAxMjAwMDA1MzY1NkU2NDQzNkI1Mzc1NkQwMDAwMDA1MjY1NjM3NkUxCis6MTAxMjEwMDA1NjZDNjE2RTAwMDAwMDAwMDAwMDAwMDAyNDQ4NjU2MTBCCis6MTAxMjIwMDA2NDY1NzIzQTIwMkY3MDcyNkY2QTY1NjM3NDczMkY3MkVGCis6MTAxMjMwMDA2MzczMkY3Mzc3MkY2NzY1MkYyRTJGNkU2OTYzMkY2NjY5Cis6MTAxMjQwMDA3NzJGNjM2RjZENkQ2RjZFMkY3NDY5NkQ2NTcyMkU2MzhFCis6MTAxMjUwMDAyQzc2MjAzMTJFMzEyRTMyMkUzODIwMzEzOTM5MzgyRjRDCis6MTAxMjYwMDAzMDM3MkYzMzMxMjAzMTM3M0EzNTM4M0EzNDM1MjA3MzFGCis6MTAxMjcwMDA2ODc1NjE2RTY3MjA0NTc4NzAyMDI0MDA1NDJENDQ2RDk4Cis6MTAxMjgwMDA2MTUyNjQzMTAwMDAwMDAwNTQyRDQ0NkQ2MTQyNDIwMEZGCis6MTAxMjkwMDA1NDJENDQ2RDYxMzIwMDAwM0Y2RTZGNTE2NDU0Nzg0NUE3Cis6MTAxMkEwMDAwMDAwMDAwMDNGNkU2RjUxNjQ1Mjc4NDUwMDAwMDAwMDVFCis6MTAxMkIwMDA2NTZFNzE0RDQ1NzY1MDQ2NjE2OTZDMDA2NTZFNzE0RDg1Cis6MTAxMkMwMDA0NTc2NDY2MTY5NkMwMDAwNjY2MTY5NkM0NTZFNDU0RDA2Cis6MTAxMkQwMDAwMDAwMDAwMDNGNDU2RTcxNDU3Njc0MDAzRjZFNkY1MTBGCis6MTAxMkUwMDA2NDQ1NzY1MDAwMDAwMDAwNjU3NjUyNkU2NzQ2NzU2QzY2Cis6MTAxMkYwMDA2QzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyNDQ4NjU2MTUwCis6MTAxMzAwMDA2NDY1NzIzQTIwMkY3MDcyNkY2QTY1NjM3NDczMkY3MjBFCis6MTAxMzEwMDA2MzczMkY3Mzc3MkY2NzY1MkYyRTJGNkU2OTYzMkY2Njg4Cis6MTAxMzIwMDA3NzJGNjM2RjZENkQ2RjZFMkY2MzZGNkQ2RDYxNkU2NDgwCis6MTAxMzMwMDAyRTYzMkM3NjIwMzEyRTMxMkUzMjJFMzEzMDIwMzEzOTUxCis6MTAxMzQwMDAzOTM4MkYzMTMxMkYzMTM4MjAzMTM3M0EzMTMxM0EzMTc0Cis6MTAxMzUwMDAzODIwNzM2ODc1NjE2RTY3MjA0NTc4NzAyMDI0MDAwMDFFCis6MTAxMzYwMDAzRjRENjI2Rjc4NDU3Njc0MDAwMDAwMDA0RTRGNjM2RjBBCis6MTAxMzcwMDA2RDYxNkU2NDAwMDAwMDAwNjg3Mzc0NjU1RjQ1NTI1MkQxCis6MTAxMzgwMDAwMDAwMDAwMDQxMkQ0NTcyNzI0Mjc1NjMwMDAwMDAwMEFDCis6MTAxMzkwMDA0NTUyNTI0RjUyMkQ0MTY0NjQwMDAwMDA2NTZFNzE0REZDCis6MTAxM0EwMDA0NTc2NTA0NjYxNjk2QzAwNjU2RTcxNEQ0NTc2NDY2MUMzCis6MTAxM0IwMDA2OTZDMDAwMDY2NjE2OTZDNDU2RTQ1NEQwMDAwMDAwMDc3Cis6MTAxM0MwMDA0NDJENDU3MjcyNEM2MTczNzQwMDAwMDA0NDJENDU3MkM3Cis6MTAxM0QwMDA3MjMyMDAwMDZENDM3Mzc0NEQ2NDQ1NTI1MjAwMDAwMDM4Cis6MTAxM0UwMDA3MDcyNkY2RDRENjQ0NTUyNTIwMDAwMDA0NjY5NkM3NDE2Cis6MTAxM0YwMDA0RDY0NDU1MjUyMDAwMDAwNjM2RDY0NUY0NTUyNTIwMEQ3Cis6MTAxNDAwMDAzRjQ1NkU3MTQ1NzY3NDAwM0Y2RTZGNTE2NDQ1NzY1MDZFCis6MTAxNDEwMDAwMDAwMDAwMDY1NzY1MjZFNjc0Njc1NkM2QzAwMDAwMDM3Cis6MTAxNDIwMDAwMDAwMDAwMDAwMDA2RUEwMDAwMDdGQkMwMDAwNkUzOENECis6MTAxNDMwMDAwMDAwODczNDAwMDA4MkIwMDAwMDg3ODAwMDAwODc4MEIxCis6MTAxNDQwMDAwMDAwNkY1NDAwMDA3Njk0MDAwMDdGMEMwMDAwODBBODFDCis6MTAxNDUwMDAwMDAwODA3NDAwMDA4NzgwMDAwMDdFNzAwMDAwODBDQzU3Cis6MTAxNDYwMDAwMDAwNkU2NDAwMDA4MUNDMDAwMDAwMDAyNDQ4NjU2MTJCCis6MTAxNDcwMDA2NDY1NzIzQTIwMkY3MDcyNkY2QTY1NjM3NDczMkY3MjlECis6MTAxNDgwMDA2MzczMkY3Mzc3MkY2NzY1MkYyRTJGNkU2OTYzMkY2NjE3Cis6MTAxNDkwMDA3NzJGNjM2RjZENkQ2RjZFMkY2NDZENjEyRTYzMkM3Njg5Cis6MTAxNEEwMDAyMDMxMkUzMTJFMzIyRTMzMjAzMTM5MzkzODJGMzAzNDNECis6MTAxNEIwMDAyRjMyMzcyMDMyMzIzQTMxMzMzQTM0MzEyMDczNjg3NTYzCis6MTAxNEMwMDA2MTZFNjcyMDQ1Nzg3MDIwMjQwMDAwMDA2NDZENjE3MkIxCis6MTAxNEQwMDA2NDQxNTQ0RTAwMDAwMDAwNjQ2RDYxNzc3MjQxNTQ0RUM3Cis6MTAxNEUwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyNDQ4NjU2MUNBCis6MTAxNEYwMDA2NDY1NzIzQTIwMkY3MDcyNkY2QTY1NjM3NDczMkY3MjFECis6MTAxNTAwMDA2MzczMkY3Mzc3MkY2NzY1MkYyRTJGNkU2OTYzMkY2Njk2Cis6MTAxNTEwMDA3NzJGNjM2RjZENkQ2RjZFMkY3NDcyNjE2MzY1MkU2M0NECis6MTAxNTIwMDAyQzc2MjAzMTJFMzEyRTMyMkUzMjIwMzEzOTM5MzgyRjdGCis6MTAxNTMwMDAzMDM0MkYzMjM3MjAzMjMyM0EzMTMzM0EzNTMwMjA3MzVCCis6MTAxNTQwMDA2ODc1NjE2RTY3MjA0NTc4NzAyMDI0MDAyNDQ4NjU2MUM1Cis6MTAxNTUwMDA2NDY1NzIzQTIwMkY3MDcyNkY2QTY1NjM3NDczMkY3MkJDCis6MTAxNTYwMDA2MzczMkY3Mzc3MkY2NzY1MkYyRTJGNkU2OTYzMkY2NjM2Cis6MTAxNTcwMDA3NzJGNjM2RjZENkQ2RjZFMkY2NDYxNzQ2MTJFNjMyQ0I2Cis6MTAxNTgwMDA3NjIwMzEyRTMxMkUzMjJFMzIyMDMxMzkzOTM4MkYzMDFCCis6MTAxNTkwMDAzNDJGMzIzNzIwMzIzMjNBMzEzMzNBMzQzMDIwNzM2OEM0Cis6MTAxNUEwMDA3NTYxNkU2NzIwNDU3ODcwMjAyNDAwMDA0NjU3NUY1NkFECis6MTAxNUIwMDA0NTUyNTM0OTRGNEUzQTIwMjMzMTIwNDY3MjY5MjA0MTBCCis6MTAxNUMwMDA3MDcyMjAzNzIwMzEzNzNBMzUzNTNBMzQzODIwNTA0NDVDCis6MTAxNUQwMDA1NDIwMzIzMDMwMzAwMDAwNDY1NzVGNDM0RjRENTA0OTYxCis6MTAxNUUwMDA0QzQ1NUY1NDQ5NEQ0NTNBMjAzMTM3M0EzNTM1M0EzNDA4Cis6MTAxNUYwMDAzODAwMDAwMDQ2NTc1RjQzNEY0RDUwNDk0QzQ1NUY0MjBECis6MTAxNjAwMDA1OTNBMjA2NDY1NzY3MjYzNzMwMDAwMDA0NjU3NUY0MzYxCis6MTAxNjEwMDA0RjRENTA0OTRDNDU1RjQ4NEY1MzU0M0EyMDYzNkY2RENFCis6MTAxNjIwMDA3MDc1NzQ2NTAwMDAwMDAwNDY1NzVGNDM0RjRENTA0OTg4Cis6MTAxNjMwMDA0QzQ1NUY0NDRGNEQ0MTQ5NEUzQTIwNjU2RTY3MkU2MURGCis6MTAxNjQwMDA2Mzc0NjU2RjZFMkU2MzZGNkQwMDAwMDA0NjU3NUY0M0Q1Cis6MTAxNjUwMDA0RjRENTA0OTRDNDU1MjNBMjA2NzYzNjMyMDc2NjU3MjdFCis6MTAxNjYwMDA3MzY5NkY2RTIwMzIyRTM3MkUzMjAwMDAwMDAwMDAwMEFBCis6MTAxNjcwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyNDQ4NjU2MTM4Cis6MTAxNjgwMDA2NDY1NzIzQTIwMkY3MDcyNkY2QTY1NjM3NDczMkY3MjhCCis6MTAxNjkwMDA2MzczMkY3Mzc3MkY2NzY1MkYyRTJGNkU2OTYzMkY2NjA1Cis6MTAxNkEwMDA3NzJGNjM2RjZENkQ2RjZFMkY2RDY1NkQyRTYzMkM3NjZBCis6MTAxNkIwMDAyMDMxMkUzMTJFMzIyRTMyMjAzMTM5MzkzODJGMzAzNDJDCis6MTAxNkMwMDAyRjMyMzcyMDMyMzIzQTMxMzMzQTM0MzQyMDczNjg3NTRFCis6MTAxNkQwMDA2MTZFNjcyMDQ1Nzg3MDIwMjQwMDAwMDAyNDQ4NjU2MTExCis6MTAxNkUwMDA2NDY1NzIzQTIwMkY3MDcyNkY2QTY1NjM3NDczMkY3MjJCCis6MTAxNkYwMDA2MzczMkY3Mzc3MkY2NzY1MkYyRTJGNkU2OTYzMkY2NkE1Cis6MTAxNzAwMDA3NzJGNjM2RjZENkQ2RjZFMkY3MzY1NkU2NDJFNjMyQzE0Cis6MTAxNzEwMDA3NjIwMzEyRTMxMkUzMjJFMzEzMTIwMzEzOTM5MzgyRjg5Cis6MTAxNzIwMDAzMTMyMkYzMjMyMjAzMTM3M0EzMTM3M0EzNTM1MjA3MzYyCis6MTAxNzMwMDA2ODc1NjE2RTY3MjA0NTc4NzAyMDI0MDA3MzZFNjQ2NDVDCis6MTAxNzQwMDA2NTRFNkY1MTIwMDAwMDAwNkU2RjQ1NEU1MTVGNTQ1ODNBCis6MTAxNzUwMDAwMDAwMDAwMDczNkU2NDY0NzQ0RTZGNTEyMDAwMDAwMDNFCis6MTAxNzYwMDAzRjZFNkY1MTY0NTQ3ODQ1MDAwMDAwMDA3NTZFNkI3MkQ3Cis6MTAxNzcwMDA2NDc0Nzk3MDY1MDAwMDAwMDAwMDAwMDAwMDAwQUNDQ0NCCis6MTAxNzgwMDAwMDAwQUNDQzAwMDBBRDlDMDAwMEFBQjAwMDAwQUFCMEU0Cis6MTAxNzkwMDAwMDAwQUQ5QzAwMDBBRDlDMDAwMEFEOUMwMDAwQUQ5QzI1Cis6MTAxN0EwMDAwMDAwQUQ5QzAwMDBBRDlDMDAwMEFEOUMwMDAwQUQ5QzE1Cis6MTAxN0IwMDAwMDAwQUQ5QzAwMDBBRDlDMDAwMEFEOUMwMDAwQUQ5QzA1Cis6MTAxN0MwMDAwMDAwQUQ5QzAwMDBBRDdDMDAwMDAwMDAwMDAwQkNBODQzCis6MTAxN0QwMDAwMDAwQkNBODAwMDBCRDcwMDAwMEFFNEMwMDAwQjA1ODc2Cis6MTAxN0UwMDAwMDAwQkQ3MDAwMDBCRDcwMDAwMEJENzAwMDAwQkQ3MDQ1Cis6MTAxN0YwMDAwMDAwQkQ3MDAwMDBCRDcwMDAwMEJENzAwMDAwQkQ3MDM1Cis6MTAxODAwMDAwMDAwQkQ3MDAwMDBCRDcwMDAwMEJENzAwMDAwQkQ3MDI0Cis6MTAxODEwMDAwMDAwQkQ3MDAwMDBCRDU0MDAwMEIwNDAyNDQ4NjU2MTY4Cis6MTAxODIwMDA2NDY1NzIzQTIwMkY3MDcyNkY2QTY1NjM3NDczMkY3MkU5Cis6MTAxODMwMDA2MzczMkY3Mzc3MkY2NzY1MkYyRTJGNkU2OTYzMkY2NjYzCis6MTAxODQwMDA3NzJGNjM2RjZENkQ2RjZFMkY3MjY1NjM3NjJFNjMyQ0NECis6MTAxODUwMDA3NjIwMzEyRTMxMkUzMjJFMzEzOTIwMzEzOTM5MzgyRjQwCis6MTAxODYwMDAzMDM3MkYzMjM0MjAzMjMxM0EzMzMwM0EzMDM1MjA3MzJBCis6MTAxODcwMDA2ODc1NjE2RTY3MjA0NTc4NzAyMDI0MDA3MDZCNTI3ODFGCis6MTAxODgwMDA0NTUyNTIwMDY2NzI2RDMyNEM2MTcyNjc2NTAwMDAwMDBECis6MTAxODkwMDA3Mjc4NEU2RjUyNzg0MjY0MDAwMDAwMDA3Mjc4NTE0NEIyCis6MTAxOEEwMDA2RDYxNDQ0NjAwMDAwMDAwNzI3ODUxNDQ2RDYxNDI0NjBCCis6MTAxOEIwMDAwMDAwMDAwMDNGNkU2RjUxNjQ1Mjc4NDUwMDAwMDAwMDQ4Cis6MTAxOEMwMDA3MDZCNTI3ODQ1NTI1MjczMDAwMDAwMDA2NjcyNkQzMkEwCis6MTAxOEQwMDA0QzcyNjc1MzAwMDAwMDAwNzI3ODRFNkY0MjY0NTMwMEYwCis6MTAxOEUwMDAzRjcyNDI2NDQ0NkQ2MTQ2MDAwMDAwMDAzRjcyNEE0MjBDCis6MTAxOEYwMDA2NDQ0NkQ0NjAwMDAwMDAwMDAwMDAwMDAwMDAwRjY3ODFGCis6MTAxOTAwMDAwMDAwRjY3ODAwMDBGNjc4MDAwMEY2NzgwMDAwRjY3ODFGCis6MTAxOTEwMDAwMDAwRjY3ODAwMDBGNjc4MDAwMEY2NzgwMDAwRjY3ODBGCis6MTAxOTIwMDAwMDAwRjY3ODAwMDBGNjc4MDAwMEY2NzgwMDAwRjY3OEZGCis6MTAxOTMwMDAwMDAwRjY3ODAwMDBGNjc4MDAwMEY2NzAwMDAwRjY3MEZGCis6MTAxOTQwMDAwMDAwRjY3MDU3MkQ0NDRENDE0NTZFNDYwMDAwMDAwMEUyCis6MTAxOTUwMDAwMDAwMDAwMDAwMDBGREMwMDAwMTAxNUMwMDAwRkREQzkzCis6MTAxOTYwMDAwMDAxMDE1QzAwMDEwMTVDMDAwMTAxNUMwMDAxMDE1Q0ZGCis6MTAxOTcwMDAwMDAxMDE1QzAwMDEwMTVDMDAwMEY3MDQwMDAxMDE1QzUyCis6MTAxOTgwMDAwMDAxMDE1QzAwMDEwMTVDMDAwMTAxNUMwMDAxMDE1Q0RGCis6MTAxOTkwMDAwMDAxMDE1NDAwMDEwMTU0MDAwMTAxNTQyNDQ4NjU2MTEzCis6MTAxOUEwMDA2NDY1NzIzQTIwMkY3MDcyNkY2QTY1NjM3NDczMkY3MjY4Cis6MTAxOUIwMDA2MzczMkY3Mzc3MkY2NzY1MkYyRTJGNkU2OTYzMkY2NkUyCis6MTAxOUMwMDA3NzJGNjM2RjZENkQ2RjZFMkY2RDYxNjMyRTYzMkM3NjU1Cis6MTAxOUQwMDAyMDMxMkUzMTJFMzIyRTMxMzIyMDMxMzkzOTM4MkYzMDBDCis6MTAxOUUwMDAzNDJGMzIzNzIwMzIzMjNBMzEzMzNBMzQzMjIwNzM2ODZFCis6MTAxOUYwMDA3NTYxNkU2NzIwNDU3ODcwMjAyNDAwMDA2RDYxNjM3NDA2Cis6MTAxQTAwMDA3ODQxNTQ0RTAwMDAwMDAwNEU3NDUzNzk2RTI2NEM2QkEyCis6MTAxQTEwMDAwMDAwMDAwMDcyNjU2RDYxNzM3MzcyNzQwMDAwMDAwMDU1Cis6MTAxQTIwMDA2QzY5NkU2QjQ0NEY1NzRFMDAwMDAwMDA2NTZFNzE0RDNGCis6MTAxQTMwMDA0NTc2NTA0NjYxNjk2QzAwNjU2RTcxNEQ0NTc2NDY2MTJDCis6MTAxQTQwMDA2OTZDMDAwMDY2NjE2OTZDNDU2RTQ1NEQwMDAwMDAwMEUwCis6MTAxQTUwMDA2QzY5NkU2QjU1NTAwMDAwMDAwMDAwMDAyNDQ4NjU2MTAxCis6MTAxQTYwMDA2NDY1NzIzQTIwMkY3MDcyNkY2QTY1NjM3NDczMkY3MkE3Cis6MTAxQTcwMDA2MzczMkY3Mzc3MkY2NzY1MkYyRTJGNkU2OTYzMkY2NjIxCis6MTAxQTgwMDA3NzJGNjM2RjZENkQ2RjZFMkY2MzZCNzM3NTZEMkU2MzQ0Cis6MTAxQTkwMDAyQzc2MjAzMTJFMzEyRTMyMkUzMjIwMzEzOTM5MzgyRjBBCis6MTAxQUEwMDAzMDM0MkYzMjM3MjAzMjMyM0EzMTMzM0EzMzM5MjA3M0RGCis6MTAxQUIwMDA2ODc1NjE2RTY3MjA0NTc4NzAyMDI0MDA1MDcyNkY2MkVGCis6MTAxQUMwMDA2NTUwNjg3OTAwMDAwMDAwNkM2RTZCNDE1MzUzNTI1NEFFCis6MTAxQUQwMDAwMDAwMDAwMDAwMDExQjJDMDAwMTFCQzQwMDAxMUJGOENBCis6MTAxQUUwMDAwMDAxMUMyQzAwMDExQzU4MDAwMTFDNkMwMDAxMUNBOEVBCis6MTAxQUYwMDAwMDAxMjA3QzAwMDExREU0MDAwMTFFMjQwMDAxMUU1MDk1Cis6MTAxQjAwMDAwMDAxMUU5MDAwMDExRUMwMDAwMTFFRkMwMDAxMUYzMERDCis6MTAxQjEwMDAwMDAxMjA3QzAwMDEyMkMwMDAwMTIyRDgwMDAxMjMwMDI2Cis6MTAxQjIwMDAwMDAxMjMyMDAwMDEyMzQ4MDAwMTI0NzgwMDAxMjRBMEEzCis6MTAxQjMwMDAwMDAxMjRGNDAwMDEyNTFDMDAwMDAwMDAwMDAxMjc4Qzk2Cis6MTAxQjQwMDAwMDAxMjg1QzAwMDEyOTM0MDAwMTJBMDQwMDAxMkE2MEY4Cis6MTAxQjUwMDAwMDAxMkIzQzAwMDEyQjY0MDAwMTJDNDAwMDAxMkM2ODhCCis6MTAxQjYwMDAwMDAxMkUxMDAwMDEyRTM4MDAwMTJGRTAwMDAxMzFEOEI1Cis6MTAxQjcwMDAwMDAxMzQ2QzAwMDEzMzgwMDAwMTM0NkMwMDAxMzQ5OEEyCis6MTAxQjgwMDAwMDAxMzAwODAwMDEzMUIwMDAwMDAwMDAwMDAxM0I4NDdBCis6MTAxQjkwMDAwMDAxM0JDODAwMDEzQzYwMDAwMTNDQUMwMDAxM0QxQzYxCis6MTAxQkEwMDAwMDAxM0RCNDAwMDEzREU4MDAwMTNFNzAwMDAxM0YwODI2Cis6MTAxQkIwMDAwMDAxM0ZEODAwMDE0MDE4MDAwMTQwOUMwMDAxNDBDMEQ2Cis6MTAxQkMwMDAwMDAxNDFGNDY0NkY0MjYxNzM2NTUwNjcwMDAwMDAwMERBCis6MTAxQkQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA3Mzc0NkQ2MTUwCis6MTAxQkUwMDA2MzRDNEU0QjAwMDAwMDAwMDAwMDAwMDAwMDAxNEMzODI4Cis6MTAxQkYwMDAwMDAxNEMzODAwMDE0QjgwMDAwMTRCQzQwMDAxNEMzOEZGCis6MTAxQzAwMDAwMDAxNEMzODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDRGCis6MTAxQzEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEM0Cis6MTAxQzIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA0MTZDNzQ2NTJFCis6MTAxQzMwMDA2RjZFMjA0MTYzNjU0RTQ5NDMyMDU2MDA0MTZDNzQ2NUM4Cis6MTAxQzQwMDA2RjZFMjA0MTYzNjU0RTQ5NDMyMDU2MDA0MjQyNDI0MjM2Cis6MTAxQzUwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEzNTQxODA1Cis6MTAxQzYwMDAwMDEzRTdGQzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDdFCis6MTAxQzcwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDYwQ0YwMDM1Cis6MTAxQzgwMDAwMDAwMDA2MENGMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDI1Cis6MTAxQzkwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDQ0Cis6MTAxQ0EwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDM0Cis6MTAxQ0IwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDI0Cis6MTAxQ0MwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDE0Cis6MTAxQ0QwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDMwMDAwMDAwMDAxCis6MTAxQ0UwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEYzCis6MTAxQ0YwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMEUyCis6MTAxRDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMUQyCis6MTAxRDEwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEMyCis6MTAxRDIwMDAwMDAwMDAwMDAwMDAwMDAwMDEwMDAwMDAyMTAwMDAwMDkxCis6MTAxRDMwMDAxMjAwMDE0MDAwMDAwMDAwMDAwMDAwMDAyMDAwMDAwMDMwCis6MTAxRDQwMDAxMjAwMDBBMDAwMDAwMDAwMTIwMDAwNjAxMjAwMDE4MERDCis6MTAxRDUwMDAxMjAwMDFFMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDkwCis6MTAxRDYwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDcyCis6MTAxRDcwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMjYxCis6MTAxRDgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMzAwMDEwMDAwMDAwMTRFCis6MEMxRDkwMDAwMDAzMDIwMTAwMDAwMDAwMDAwMDAwMDA0MQorOjAwMDAwMDAxRkYKKy8qIHRnMSBmaXJtd2FyZSB2MTIuNC4xMSAqLwpkaWZmIC0tZ2l0IGEvZmlybXdhcmUvYWNlbmljL3RnMi5iaW4uaWhleCBiL2Zpcm13YXJlL2FjZW5pYy90ZzIuYmluLmloZXgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTlmZjRmNAotLS0gL2Rldi9udWxsCisrKyBiL2Zpcm13YXJlL2FjZW5pYy90ZzIuYmluLmloZXgKQEAgLTAsMCArMSw0ODQ0IEBACis6MTAwMDAwMDAwQzA0MEIwMDAwMDA0MDAwMDAwMDQwMDAwMDAwMDAwMDU1Cis6MTAwMDEwMDAxMDAwMDAwMzAwMDAwMDAwMDAwMDAwMEQwMDAwMDAwREIzCis6MTAwMDIwMDAzQzFEMDAwMThGQkQ2RDIwMDNBMEYwMjEzQzEwMDAwMDlECis6MTAwMDMwMDAyNjEwNDAwMDBDMDAxMEMwMDAwMDAwMDAwMDAwMDAwRDYxCis6MTAwMDQwMDAzQzFEMDAwMThGQkQ2RDI0MDNBMEYwMjEzQzEwMDAwMDc5Cis6MTAwMDUwMDAyNjEwNDAwMDBDMDAxN0UwMDAwMDAwMDAwMDAwMDAwRDFBCis6MTAwMDYwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDkwCis6MTAwMDcwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDgwCis6MTAwMDgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDcwCis6MTAwMDkwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDYwCis6MTAwMEEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDUwCis6MTAwMEIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDQwCis6MTAwMEMwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDMwCis6MTAwMEQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIwCis6MTAwMEUwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEwCis6MTAwMEYwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCis6MTAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMjAwMDAwOEU1Cis6MTAwMTEwMDAwMDAwMDAwMDA4MDAxNzJGM0MwQTAwMDEwODAwMTcyRkZDCis6MTAwMTIwMDAzQzBBMDAwMjA4MDAxNzJGMDAwMDAwMDAwODAwMkNBQzU5Cis6MTAwMTMwMDAwMDAwMDAwMDA4MDAyQzRGMDAwMDAwMDAwODAwMTcyRkVFCis6MTAwMTQwMDAzQzBBMDAwNDA4MDAzMjhBMDAwMDAwMDAwODAwMUE1MjJECis6MTAwMTUwMDAwMDAwMDAwMDA4MDAzOTREMDAwMDAwMDAwODAwMzhGNERECis6MTAwMTYwMDAwMDAwMDAwMDA4MDAxNzJGM0MwQTAwMDYwODAwMzlCQkY5Cis6MTAwMTcwMDAzQzBBMDAwNzA4MDAxNzJGM0MwQTAwMDgwODAwMTcyRjQ4Cis6MTAwMTgwMDAzQzBBMDAwOTA4MDAzQTEzMDAwMDAwMDAwODAwMkVBNkVGCis6MTAwMTkwMDAwMDAwMDAwMDA4MDAxNzJGM0MwQTAwMEIwODAwMTcyRjcyCis6MTAwMUEwMDAzQzBBMDAwQzA4MDAxNzJGM0MwQTAwMEQwODAwMjhGQjMxCis6MTAwMUIwMDAwMDAwMDAwMDA4MDAyODkwMDAwMDAwMDAwODAwMTcyRjMxCis6MTAwMUMwMDAzQzBBMDAwRTA4MDAyMDhDMDAwMDAwMDAwODAwMTk2NEEyCis6MTAwMUQwMDAwMDAwMDAwMDA4MDAxQTA0MDAwMDAwMDAwODAwM0NBNjBGCis6MTAwMUUwMDAwMDAwMDAwMDA4MDAzQzk0MDAwMDAwMDAwODAwMTcyRkU5Cis6MTAwMUYwMDAwMDAwMDAwMDA4MDAxOTFBMDAwMDAwMDAwODAwMTcyRjc2Cis6MTAwMjAwMDAwMDAwMDAwMDA4MDAxNzJGM0MwQTAwMTMwODAwMTcyRkY5Cis6MTAwMjEwMDAzQzBBMDAxNDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDg0Cis6MTAwMjIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMENFCis6MTAwMjMwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEJFCis6MTAwMjQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEFFCis6MTAwMjUwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDlFCis6MTAwMjYwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDhFCis6MTAwMjcwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDdFCis6MTAwMjgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDZFCis6MTAwMjkwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDVFCis6MTAwMkEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDRFCis6MTAwMkIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDNFCis6MTAwMkMwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDJFCis6MTAwMkQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDFFCis6MTAwMkUwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFCis6MTAwMkYwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEZFCis6MTAwMzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyN0JERkZFMDJBCis6MTAwMzEwMDAzQzFDQzAwMEFGQkYwMDFDQUZCMDAwMTg4RjgyMDE0MDcyCis6MTAwMzIwMDAyNDAzMDAwM0FGODMwMEVDMzQ0MjAwMDQwQzAwMkIyMEI0Cis6MTAwMzMwMDBBRjgyMDE0MDNDMDEwMEMwMEMwMDE3NjNBQzIwM0ZGQ0MxCis6MTAwMzQwMDAwMDQwMTgyMTNDMDIwMDEwM0MwMTAwMDFBQzIzNkU5Q0NGCis6MTAwMzUwMDAxMDYyMDAxMTAwNDMxMDJCMTQ0MDAwMDIzQzAyMDAyMEU4Cis6MTAwMzYwMDAzQzAyMDAwODEwNjIwMDBDMjQwNTAxMDAzQzA2MDAwMTVDCis6MTAwMzcwMDA4Q0M2NkU5QzNDMDQwMDAxMjQ4NDVDNzQwMDAwMzgyMTBGCis6MTAwMzgwMDBBRkEwMDAxMDBDMDAyQjNCQUZBMDAwMTQzQzAyMDAyMERCCis6MTAwMzkwMDAzQzAxMDAwMUFDMjI2RTlDMjQwMjAwMDgzQzAxMDAwMURCCis6MTAwM0EwMDBBQzIyNkVCNDI0MDIwMDFGM0MwMTAwMDFBQzIyNkVDNERBCis6MTAwM0IwMDAyNDAyMDAxNjNDMDEwMDAxQUMyMjZFOTgzQzA1RkZGRUIxCis6MTAwM0MwMDAzNEE1NkYwODNDMDIwMDAxOEM0MjZFOUMzQzAzMDAwMjg1Cis6MTAwM0QwMDAyNDYzOTAxMDNDMDQwMDAxOEM4NDZDQzQwMDQzMTAyM0ZGCis6MTAwM0UwMDAxNDgwMDAwMjAwNDU4MDIxMjYxMEZBMzgyNDAyRjAwMDEzCis6MTAwM0YwMDAwMjAyODAyNDBDMDAxNzg1MDIwMDIwMjEwMjAyMjgyMzFCCis6MTAwNDAwMDAzQzA0MDAyMDAwODIxODIzMDA2NTE4MjMyNDdCQjAwMEUwCis6MTAwNDEwMDAzQzAzRkZGRTM0NjNCRjA4MDM2M0I4MjEzQzA2MDBCRjAyCis6MTAwNDIwMDAzNEM2RjAwMDNDMDcwMDAxOENFNzZDQzAzQzAzMDBCRjAxCis6MTAwNDMwMDAzNDYzRTAwMDAwODUyMDIzM0MwMTAwMDFBQzI0NkVBODU5Cis6MTAwNDQwMDAwMDgyMjAyMzNDMDEwMDAxQUMyNTZFOTAwMDA1Mjg0MjZCCis6MTAwNDUwMDAzQzAxMDAwMUFDMjI2RTg0Mjc2MjBGRkMzQzAxMDAwMUNDCis6MTAwNDYwMDBBQzIyNkQyMDI3NjIxRkZDMDBEQjMwMjMwMDdCMTgyM0E5Cis6MTAwNDcwMDAzQzAxMDAwMUFDMjQ2RTg4M0MwMTAwMDFBQzI1NkVBQzRGCis6MTAwNDgwMDAzQzAxMDAwMUFDMjI2RDI0QUY4NjAxNTAxMEUwMDAxMTQ4Cis6MTAwNDkwMDBBRjgzMDI1MDNDMUQwMDAxOEZCRDZDQ0MwM0EwRjAyMTQ2Cis6MTAwNEEwMDAwQzAwMTc0OTAwMDAwMDAwM0MwMjAwMDE4QzQyNkNEMDk3Cis6MTAwNEIwMDAzQzAzMDAwMThDNjM2Q0Q0MjQ0MkZFMDAyNDYzMDIwMEUwCis6MTAwNEMwMDAzQzAxMDAwMUFDMjI2Q0QwM0MwMTAwMDExMDAwMDAwNDkyCis6MTAwNEQwMDBBQzIzNkNENDNDMUQwMDAxOEZCRDZEMjAwM0EwRjAyMTI2Cis6MTAwNEUwMDAzQzAyMDAwMThDNDI2Q0M0MTA0MDAwMEQyNkZBRkEzODIwCis6MTAwNEYwMDAzQzAyMDAwMThDNDI2Q0QwM0MwMzAwMDE4QzYzNkNENDQ0Cis6MTAwNTAwMDAzQzFBMDAwMThGNUE2Q0Q0MjQ0MkZBMzgyNDYzMDVDODdGCis6MTAwNTEwMDAzQzAxMDAwMUFDMjI2Q0QwM0MwMTAwMDFBQzIzNkNENDQ2Cis6MTAwNTIwMDAzQzAyMDAwMThDNDI2Q0M4MTQ0MDAwMDMwMDAwMDAwMDMzCis6MTAwNTMwMDAzQzAxMDAwMUFDMjA2Q0QwMEMwMDExNTEwMDAwMDAwMDA3Cis6MTAwNTQwMDA4RkJGMDAxQzhGQjAwMDE4MDNFMDAwMDgyN0JEMDAyMEZCCis6MTAwNTUwMDAzQzAyMDAwMThDNDI2Q0QwM0MwMzAwMDE4QzYzNkNENEUzCis6MTAwNTYwMDAyN0JERkY5OEFGQjAwMDQ4M0MxMDAwMDE4RTEwNjZCODYwCis6MTAwNTcwMDBBRkIyMDA1MDNDMTIwMDAwMjY1MjQxMDBBRkJGMDA2MEY1Cis6MTAwNTgwMDBBRkJFMDA1Q0FGQjUwMDU4QUZCMzAwNTRBRkIxMDA0Qzg0Cis6MTAwNTkwMDBBRkEyMDAzNEFGQTMwMDMwQUZBMDAwMTBBRkEwMDAxNDkyCis6MTAwNUEwMDA4Rjg2MDA0MDNDMDQwMDAxMjQ4NDVDODAyNDA1MDIwMDA2Cis6MTAwNUIwMDAzQzAxMDAwMUFDMzI2RTgwMEMwMDJCM0IwMjAwMzgyMTY0Cis6MTAwNUMwMDA4RjgzMDA0MDNDMDJGMDAwMDA2MjE4MjQzQzAyNjAwMDZGCis6MTAwNUQwMDAxMDYyMDAwQkEzQTAwMDNGMjQwRTAwMDEzQzA0MDAwMUE4Cis6MTAwNUUwMDAyNDg0NUM4OEEzQUUwMDNGQUZBMDAwMTBBRkEwMDAxNDJECis6MTAwNUYwMDA4Rjg2MDA0MDI0MDUwMzAwMEMwMDJCM0IwMjAwMzgyMUFECis6MTAwNjAwMDA4RjgyMDI0MDNDMDMwMDAxMDA0MzEwMjVBRjgyMDI0MDZDCis6MTAwNjEwMDBBRjgwMDA0ODhGODIwMDQ4MTQ0MDAwMDUwMDAwMDAwMEIxCis6MTAwNjIwMDBBRjgwMDA0ODhGODIwMDQ4MTA0MDAwMDQwMDAwMDAwMEE2Cis6MTAwNjMwMDBBRjgwMDA0ODEwMDAwMDAzMDJFMDIwMjFBRjgwMDA0QzkyCis6MTAwNjQwMDAwMkUwMjAyMTNDMDUwMDAxMEMwMDJCQTgzNEE1NDBGODU1Cis6MTAwNjUwMDAwMzQwMjAyMTBDMDAyQkE4MjQwNTA1QzgzQzAyMDAwMTAyCis6MTAwNjYwMDA4QzQyNkVBODNDMEQwMDAxOERBRDZFODgzQzAzMDAwMUVDCis6MTAwNjcwMDA4QzYzNkU4NDNDMDgwMDAxOEQwODZFOTAzQzA5MDAwMTdCCis6MTAwNjgwMDA4RDI5NkVBQzNDMEEwMDAxOEQ0QTZFQjQzQzBCMDAwMTEyCis6MTAwNjkwMDA4RDZCNkVDNDNDMEMwMDAxOEQ4QzZFOTgzQzA0MDAwMTg3Cis6MTAwNkEwMDAyNDg0NUM5NDI0MDUwNDAwQUY0MjAxM0M4RjQyMDEzQzQ5Cis6MTAwNkIwMDAyNDA2MDAwMTI0MDcwMDAxQUY0MDAwMDBBRjREMDEzOEJGCis6MTAwNkMwMDBBRjQzMDE0NEFGNDgwMTQ4QUY0OTAxNENBRjRBMDE1MDI0Cis6MTAwNkQwMDBBRjRCMDE1NEFGNEMwMTU4MjQ0MkZGODBBRjQyMDE0MDYwCis6MTAwNkUwMDAyNDAyMDAwMUFGQTIwMDEwMEMwMDJCM0JBRkEwMDAxNEFECis6MTAwNkYwMDA4RjQyMDEzOEFGQTIwMDEwOEY0MjAxM0NBRkEyMDAxNDFDCis6MTAwNzAwMDA4RjQ2MDE0NDhGNDcwMTQ4M0MwNDAwMDEyNDg0NUNBMENCCis6MTAwNzEwMDAwQzAwMkIzQjI0MDUwNTAwQUZCNzAwMTBBRkJBMDAxNDQ2Cis6MTAwNzIwMDA4RjQ2MDE0QzhGNDcwMTUwM0MwNDAwMDEyNDg0NUNBQzhGCis6MTAwNzMwMDAwQzAwMkIzQjI0MDUwNjAwM0MwMjAwMDE4QzQyNkU5QzAxCis6MTAwNzQwMDAwMzYwMzgyMTNDMDYwMDAyMjRDNjkwMTAyNDQ4RkZGRkI1Cis6MTAwNzUwMDAwMTA2MTgyNDAwRTgxMDI0MDA0MzEwMkIxMDQwMDAwNjY2Cis6MTAwNzYwMDAyNDA1MDkwMDNDMDQwMDAxMjQ4NDVDQjhBRkE4MDAxMEYzCis6MTAwNzcwMDAwQzAwMkIzQkFGQTAwMDE0OEY4MjAwMENBRkEyMDAxMDI2Cis6MTAwNzgwMDA4RjgyMDAzQ0FGQTIwMDE0OEY4NjAwMDA4Rjg3MDAwNDg4Cis6MTAwNzkwMDAzQzA0MDAwMTI0ODQ1Q0M0MEMwMDJCM0IyNDA1MTAwMEE1Cis6MTAwN0EwMDA4QzAyMDIyMDhDMDMwMjI0OEMwNjAyMTg4QzA3MDIxQzg3Cis6MTAwN0IwMDAzQzA0MDAwMTI0ODQ1Q0NDMjQwNTExMDBBRkEyMDAxMDhECis6MTAwN0MwMDAwQzAwMkIzQkFGQTMwMDE0QUY4MDAwNTRBRjgwMDExQzgyCis6MTAwN0QwMDA4QzAyMDIxODMwNDIwMDAyMTA0MDAwMDkwMDAwMDAwMEE0Cis6MTAwN0UwMDA4QzAyMDIyMDNDMDMwMDAyMzQ2MzAwMDQwMDQzMTAyNTA1Cis6MTAwN0YwMDBBRjQyMDAwQzhDMDIwMjFDMTAwMDAwMDgzNDQyMDAwNEJFCis6MTAwODAwMDA4QzAyMDIyMDNDMDMwMDAyMzQ2MzAwMDYwMDQzMTAyNUUyCis6MTAwODEwMDBBRjQyMDAwQzhDMDIwMjFDMzQ0MjAwMDZBRjQyMDAxNEFFCis6MTAwODIwMDA4QzAyMDIxODMwNDIwMDEwMTA0MDAwMEEwMDAwMDAwMDQ0Cis6MTAwODMwMDA4QzAyMDIxQzM0NDIwMDA0QUY0MjAwMTA4QzAyMDIyMEUxCis6MTAwODQwMDAzQzAzMDAwQTM0NjMwMDA0MDA0MzEwMjUxMDAwMDAwOTMzCis6MTAwODUwMDBBRjQyMDAwODhDMDIwMjIwM0MwMzAwMEEzNDYzMDAwNjA5Cis6MTAwODYwMDAwMDQzMTAyNUFGNDIwMDA4OEMwMjAyMUMzNDQyMDAwNkVGCis6MTAwODcwMDBBRjQyMDAxMDI0MDIwMDAxQUY4MjAwQTBBRjgyMDBCMDlFCis6MTAwODgwMDA4RjgzMDA1NDhGODIwMDU0QUY4MDAwRDBBRjgwMDBDMEFGCis6MTAwODkwMDAxMDAwMDAwMjI0NjMwMDY0OEY4MjAwNTQwMDYyMTAyMzYxCis6MTAwOEEwMDAyQzQyMDA2NTE0NDBGRkZDMDAwMDAwMDA4QzA0MDIwODhDCis6MTAwOEIwMDA4QzA1MDIwQzI2RTIwMDI4QUVFMjAwMjAyNDAyMDQ5MEZGCis6MTAwOEMwMDBBRUUyMDAxMEFFRTQwMDA4QUVFNTAwMEMyNkU0MDAwODNECis6MTAwOEQwMDA4QzgyMDAwMDhDODMwMDA0QUY4MjAwOTBBRjgzMDA5NDcwCis6MTAwOEUwMDA4QzgyMDAxOEFGODIwMEI0OTQ4MjAwMEFBRjgyMDA5QzEwCis6MTAwOEYwMDA4RjQyMDAxNEFGODIwMEIwOEY4MjAwQjAzMDQyMDAwNEZCCis6MTAwOTAwMDAxNDQwRkZGRDAwMDAwMDAwOEY4MjAwQjAzQzAzRUYwMEE4Cis6MTAwOTEwMDAwMDQzMTAyNDEwNDAwMDIxMDAwMDAwMDA4RjgyMDBCNDJBCis6MTAwOTIwMDBBRkEyMDAxMDhGODIwMDkwOEY4MzAwOTQzQzA0MDAwMURFCis6MTAwOTMwMDAyNDg0NUNENEFGQTMwMDE0OEY4NjAwQjA4Rjg3MDA5QzAyCis6MTAwOTQwMDAzQzA1MDAwMTBDMDAyQjNCMzRBNTIwMEQzQzA0MDAwMUFDCis6MTAwOTUwMDAyNDg0NUNFMDI0MDIwM0MwQUZBMjAwMTBBRkEwMDAxNDA2Cis6MTAwOTYwMDA4Rjg2MDE0NDNDMDcwMDAxMjRFNzVDRTgwQzAwMkIzQjI4Cis6MTAwOTcwMDAzNDA1REVBRDhGODIwMTFDMzQ0MjAwMDJBRjgyMDExQ0JGCis6MTAwOTgwMDA4RjgyMDIyMDM0NDIwMDA0QUY4MjAyMjA4RjgyMDE0MDE1Cis6MTAwOTkwMDAzQzAzMDAwMTAwNDMxMDI1QUY4MjAxNDA5NkUyMDQ3MjNGCis6MTAwOUEwMDA5NkU2MDQ1Mjk2RTcwNDYyQUZBMjAwMTA5NkUyMDQ4MjMzCis6MTAwOUIwMDAzQzA0MDAwMTI0ODQ1RDE0MjQwNTEyMDAwQzAwMkIzQjMwCis6MTAwOUMwMDBBRkEyMDAxNDk2RjAwNDUyMzIwMjAwMDExMDQwMDAwMjVGCis6MTAwOUQwMDAwMDAwQjAyMTI0MTYwMDAxMzIwMjAwMDI1NDQwMDAwMTQwCis6MTAwOUUwMDAzNkQ2MDAwMjMyMDIwMDA4NTQ0MDAwMDEzNkQ2MDAwNDE4Cis6MTAwOUYwMDAzMjAyMDAxMDU0NDAwMDAxMzZENjAwMDgzMjAyMDAyMEI2Cis6MTAwQTAwMDA1NDQwMDAwMTM2RDYwMDEwMzIwMjAwNDA1NDQwMDAwMTJDCis6MTAwQTEwMDAzNkQ2MDAyMDMyMDIwMDgwNTQ0MDAwMDEzNkQ2MDA0MDE1Cis6MTAwQTIwMDA5NkU2MDQ4MjMwQzIwMjAwNTQ0MDAwMDEzNkQ2NDAwMEVGCis6MTAwQTMwMDA5NkUzMDQ3MjMwNjIwMjAwMTA0MDAwMDMzMDYyMDEwMDRECis6MTAwQTQwMDAxMDAwMDAwMzM2RDYyMDAwNTQ0MDAwMDEzNkQ2MTAwMEI2Cis6MTAwQTUwMDA5NkYwMDQ2MjMyQzI0MDAwMTQ0MDAwMDQzMjA3MDA5QjRBCis6MTAwQTYwMDAzMEMyMDA5QjE0RTIwMDA3MjQwRTAwMDEzMkMyMjAwMEI1Cis6MTAwQTcwMDAxNDQwMDAwRDMyMDIwMDAxMzA2MjAwOUIxMEUyMDAwOUI4Cis6MTAwQTgwMDAyNDBFMDAwMTNDMDQwMDAxMjQ4NDVEMjAyNDA1MTMwMDkxCis6MTAwQTkwMDAwMjAwMzgyMUEzQUUwMDNGQUZBMzAwMTAwQzAwMkIzQjk3Cis6MTAwQUEwMDBBRkEwMDAxNDMyMDIwMDAxNTQ0MDAwMDEzNkQ2MDA4MDhECis6MTAwQUIwMDAzMjAyMDAwMjU0NDAwMDAxMzZENjAxMDAzMjAyMDAwODIyCis6MTAwQUMwMDA1NDQwMDAwMTM2RDYwMjAwMzIwMjAwMTA1NDQwMDAwMUFBCis6MTAwQUQwMDAzNkQ2MDQwMDMyMDIwMDgwNTQ0MDAwMDEzNkQ2MDgwMEE5Cis6MTAwQUUwMDA4QzAyMDIxODMwNDIwMjAwMTA0MDAwMDIzQzAyMDAwODUyCis6MTAwQUYwMDAwMkMyQjAyNThDMDIwMjE4MzA0MjA4MDAxMDQwMDAwMkU5Cis6MTAwQjAwMDAzQzAyMDA4MDAyQzJCMDI1OEMwMjAyMTgzMDQyMDQwMDcwCis6MTAwQjEwMDAxMDQwMDAwMjNDMDIwMTAwMDJDMkIwMjU4QzAyMDIxODAzCis6MTAwQjIwMDAzMDQyMDEwMDEwNDAwMDAyM0MwMjAyMDAwMkMyQjAyNTI3Cis6MTAwQjMwMDA4QzAyMDIxODMwNDIwMDgwMTA0MDAwMDIzQzAyMDQwMDg3Cis6MTAwQjQwMDAwMkMyQjAyNThDMDIwMjE4MzA0MjIwMDAxMDQwMDAwMjgwCis6MTAwQjUwMDAzQzAyMDAxMDAyQzJCMDI1OEMwMjAyMTgzMDQyNDAwMDU0Cis6MTAwQjYwMDAxMDQwMDAwMjNDMDIwMDIwMDJDMkIwMjU4QzAyMDIxODk0Cis6MTAwQjcwMDAzMDQyMTAwMDEwNDAwMDAyM0MwMjAwNDAwMkMyQjAyNThBCis6MTAwQjgwMDA4RUUyMDQ5ODhFRTMwNDlDQUY0MjAxNjBBRjQzMDE2NDlGCis6MTAwQjkwMDA4RUUyMDRBMDhFRTMwNEE0QUY0MjAxNjhBRjQzMDE2QzZGCis6MTAwQkEwMDA4RUUyMDRBODhFRTMwNEFDQUY0MjAxNzBBRjQzMDE3NDNGCis6MTAwQkIwMDA4RUUyMDQyODhFRTMwNDJDQUY0MjAxNzhBRjQzMDE3QzFGCis6MTAwQkMwMDA4RUUyMDQ0ODhFRTMwNDRDQUY0MjAxODBBRjQzMDE4NEJGCis6MTAwQkQwMDA4RUUyMDQ1ODhFRTMwNDVDQUY0MjAxODhBRjQzMDE4QzdGCis6MTAwQkUwMDA4RUUyMDQ2ODhFRTMwNDZDQUY0MjAxOTBBRjQzMDE5NDNGCis6MTAwQkYwMDA4RUUyMDQ3ODhFRTMwNDdDQUY0MjAxOThBRjQzMDE5Q0ZGCis6MTAwQzAwMDA4RUUyMDQ4ODhFRTMwNDhDQUY0MjAxQTBBRjQzMDFBNEJFCis6MTAwQzEwMDA4RUUyMDRCMDhFRTMwNEI0MjQwNDAwODBBRjQyMDFBODQ1Cis6MTAwQzIwMDBBRjQzMDFBQzBDMDAyQkE4MjQwNTAwODA4QzAyMDI1Q0IxCis6MTAwQzMwMDAyNzQ0MDIyNEFGNDIwMUYwOEMwMjAyNjAyNDA1MDIwMDI2Cis6MTAwQzQwMDAyNDA2MDAwODBDMDAyQkJGQUY0MjAxRjgzQzA0M0I5QTdECis6MTAwQzUwMDAzNDg0Q0EwMDAwMDAzODIxMjQwMjAwMDYyNDAzMDAwMjY0Cis6MTAwQzYwMDBBRjQyMDFGNDI0MDIwM0U4QUY0MzAyMDRBRjQzMDIwMEExCis6MTAwQzcwMDBBRjQ0MDFGQ0FGNDIwMjk0MjQwMjAwMDFBRjQzMDI5MDUyCis6MTAwQzgwMDBBRjQyMDI5QzNDMDMwMDAxMDA2NzE4MjE5MDYzNkNEOEJFCis6MTAwQzkwMDAwMzQ3MTAyMTI0RTcwMDAxQTA0MzAyMkMyQ0UyMDAwRjlGCis6MTAwQ0EwMDAxNDQwRkZGODAzNDcxODIxMjRFNzAwMDEzQzA4MDAwMTI1Cis6MTAwQ0IwMDAzNTA4NDBGODhGODIwMDQwM0MwNDAwMDEyNDg0NUQyQ0ZDCis6MTAwQ0MwMDAyNDA1MTQwMDAwMDIxNzAyMjQ0MjAwMzBBMDYyMDIyQzA2Cis6MTAwQ0QwMDAwMzQ3MTAyMUEwNDAwMjJDOEMwNzAyMTgwMkMwMzAyMUNCCis6MTAwQ0UwMDAyNDAyMDVDOEFGQTIwMDEwMEMwMDJCM0JBRkE4MDAxNEQzCis6MTAwQ0YwMDAzQzA0MDAwMTI0ODQ1RDM4M0MwNTAwMDAyNEE1NUM4MDkwCis6MTAwRDAwMDAyNDA2MDAxMDI3QjEwMDMwMDIyMDM4MjEyN0IzMDAzNDE4Cis6MTAwRDEwMDAwQzAwMTdBM0FGQjMwMDEwM0MwMzAwMDE4QzYzNkNDODM4Cis6MTAwRDIwMDAxMDYwMDAwQTAwNDA4MDIxOEZBMzAwMzAyNDA1RkYwMERFCis6MTAwRDMwMDA4RkEyMDAzNDI0NjQwMEZGMDA4NTIwMjQwMDgzMTgyMzQwCis6MTAwRDQwMDAwMDQzMTAyM0FGQTIwMDM0QUZBNDAwMzAzQzA0MDAwMUU0Cis6MTAwRDUwMDAyNDg0NUQ0NDNDMDUwMDAwMjRBNTQxMDAyNDA2MDEwOENDCis6MTAwRDYwMDAwMjIwMzgyMTBDMDAxN0EzQUZCMzAwMTAwMDQwOTAyMURGCis6MTAwRDcwMDAzMkMyMDAwMzNDMDEwMDAxQUMzMjZFODAxMDQwMDA0NURECis6MTAwRDgwMDAwMjIwMzgyMThGODIwMDUwM0MwMzAwMTAwMDQzMTAyNEMxCis6MTAwRDkwMDAxMDQwMDAxNjAwMDAwMDAwOEMwMjAyMTgzMDQyMDA0MDkzCis6MTAwREEwMDAxMDQwMDAwRjI0MDIwMDAxOEY4MjAwNTA4QzAzMDIxOEIzCis6MTAwREIwMDAyNDBFMDAwMTNDMDQwMDAxMjQ4NDVENTBBM0FFMDAzRkRBCis6MTAwREMwMDBBRkEyMDAxMEFGQTMwMDE0OEY4NzAwNDAyNDA1MTUwMEM4Cis6MTAwREQwMDAwQzAwMkIzQjAyQzAzMDIxMTAwMDAwMDQwMDAwMDAwMDdBCis6MTAwREUwMDAzQzAxMDAwMTAwMzcwODIxQTAyMjQwRjQzQzA0MDAwMTJFCis6MTAwREYwMDAyNDg0NUQ1QzNDMDUwMDAxMjRBNTVCNDAzQzA2MDAwMUE5Cis6MTAwRTAwMDAyNEM2NUJBQzAwQzUzMDIzOEY0MjAwMTAyN0IzMDAzMEVFCis6MTAwRTEwMDAwMjYwMzgyMTI3QjEwMDM0MzQ0MjBBMDBBRjQyMDAxMDhBCis6MTAwRTIwMDAwQzAwMTdBM0FGQjEwMDEwM0MwNDAwMDEyNDg0NUQ3MEQ2Cis6MTAwRTMwMDAzQzA1MDAwMTI0QTVCNzE0M0MwNjAwMDEyNEM2QkE5MDY1Cis6MTAwRTQwMDAwMEM1MzAyMzAyNjAzODIxQUY0MjAxMDgwQzAwMTdBMzBGCis6MTAwRTUwMDBBRkIxMDAxMDNDMDQwMDAxMjQ4NDVEOEMzQzA1MDAwMTBFCis6MTAwRTYwMDAyNEE1QkU1ODNDMDYwMDAxMjRDNkM5MDAwMEM1MzAyMzk1Cis6MTAwRTcwMDAwMjYwMzgyMTNDMDEwMDAxQUMyMjZFRjQwQzAwMTdBMzgzCis6MTAwRTgwMDBBRkIxMDAxMDNDMDQwMDAxMjQ4NDVEQTQxMDAwMDAyNEQ0Cis6MTAwRTkwMDAyNDA1MTYwMDNDMDQwMDAxMjQ4NDVEQUMzQzA1MDAwMURGCis6MTAwRUEwMDAyNEE1QTEwQzNDMDYwMDAxMjRDNkEyMzgwMEM1MzAyM0FECis6MTAwRUIwMDAwQzAwMTdBM0FGQjMwMDEwM0MwNDAwMDEyNDg0NURCQ0Y4Cis6MTAwRUMwMDAzQzA1MDAwMTI0QTVCMkIwM0MwNjAwMDEyNEM2QjcwQ0M1Cis6MTAwRUQwMDAwMEM1MzAyMzAyMjAzODIxQUY0MjAxMDgwQzAwMTdBM0JGCis6MTAwRUUwMDBBRkIzMDAxMDNDMDQwMDAxMjQ4NDVERDAzQzA1MDAwMTM4Cis6MTAwRUYwMDAyNEE1QkE5ODNDMDYwMDAxMjRDNkJFNTAwMEM1MzAyMzg0Cis6MTAwRjAwMDAwMjIwMzgyMTNDMDEwMDAxQUMyMjZFRjQwQzAwMTdBMzMyCis6MTAwRjEwMDBBRkIzMDAxMDNDMDQwMDAxMjQ4NDVERTQyNDA1MTY1MEE2Cis6MTAwRjIwMDAwMkMwMzAyMTAwMDAzODIxM0MwMTAwMDFBQzIyNkVGOEUzCis6MTAwRjMwMDBBRkEwMDAxMDBDMDAyQjNCQUZBMDAwMTQzMkMyMDAyMDY5Cis6MTAwRjQwMDAxMDQwMDAyMTI3QTcwMDMwM0MwNDAwMDEyNDg0NURGMEZDCis6MTAwRjUwMDAzQzA1MDAwMTI0QTVCMTNDM0MwNjAwMDEyNEM2QjJBODEyCis6MTAwRjYwMDAwMEM1MzAyMzI0MDIyMDAwQUY0MjAwMUMyN0EyMDAzNDE5Cis6MTAwRjcwMDAwQzAwMTdBM0FGQTIwMDEwMDAwMjE5MDAwMDAzMTk4MjkxCis6MTAwRjgwMDAzQzA0MDgwMDAwNjQxODI1QUU0MzAwMjgyNDAzMDAxMDI4Cis6MTAwRjkwMDBBRjQzMDAzQzk2RTMwNDUwQUY0MzAwNDA4RjQzMDA0MDEyCis6MTAwRkEwMDAzQzA0MDAwMTI0ODQ1RTA0QUZBMDAwMTRBRkEzMDAxMDMxCis6MTAwRkIwMDA4RjQ3MDAxQzI0MDUxNjYwM0MwMTAwMDFBQzIyNkVGMDM2Cis6MTAwRkMwMDAxMDAwMDAyNTMyQzYwMDIwOEVFMjA0NDg4RUUzMDQ0QzU3Cis6MTAwRkQwMDBBRjQzMDAxQzhGNDIwMDFDMjQ0MkUwMDAyQzQyMjAwMTQxCis6MTAwRkUwMDAxNDQwMDAwQTI0MEUwMDAxM0MwNDAwMDEyNDg0NUUxMDE5Cis6MTAwRkYwMDBBM0FFMDAzRkFGQTAwMDEwQUZBMDAwMTQ4RjQ2MDAxQ0FFCis6MTAxMDAwMDAyNDA1MTcwMDBDMDAyQjNCMDAwMDM4MjEzQzAyMDAwMDk3Cis6MTAxMDEwMDAyNDQyNUNCQzAwMDIxMTAwMDAwMjExODIzQzAzMDgwMDYzCis6MTAxMDIwMDAwMDQzMTAyNUFFNDIwMDI4MjQwMjAwMDhBRjQyMDAzQ0Q1Cis6MTAxMDMwMDA5NkUyMDQ1MEFGNDIwMDQwOEY0MjAwNDAzQzA0MDAwMTYxCis6MTAxMDQwMDAyNDg0NUUxQ0FGQTAwMDE0QUZBMjAwMTA4RjQ3MDAxQ0M4Cis6MTAxMDUwMDAyNDA1MTgwMDMyQzYwMDIwMEMwMDJCM0IwMDAwMDAwMEM1Cis6MTAxMDYwMDAzQzA1MEZGRjNDMDMwMDAxOEM2MzZFRjQzNEE1RkZGRkM5Cis6MTAxMDcwMDAwMjQwMzAyMTNDMDIwMDAxOEM0MjZFRjgzQzA0MDgwMDIyCis6MTAxMDgwMDAwMDY1MTgyNDAwMDMxODgyMDA2NDE4MjUwMDQ1MTAyNDA4Cis6MTAxMDkwMDAwMDAyMTA4MjAwNDQxMDI1QUNDMjAwODAzMkMyMDE4MEUwCis6MTAxMEEwMDAxMDQwMDA1NkFDQzMwMDIwOEY4MjAwNUMzQzAzMDA4MERGCis6MTAxMEIwMDAwMDQzMTAyNDEwNDAwMDBEMDAwMDAwMDA4RjgyMDA1MEZCCis6MTAxMEMwMDBBRkEyMDAxMDhGODIwMDVDMjQwRTAwMDEzQzA0MDAwMURFCis6MTAxMEQwMDAyNDg0NUUyOEEzQUUwMDNGQUZBMjAwMTQ4Rjg3MDA0MDk3Cis6MTAxMEUwMDAyNDA1MTkwMDBDMDAyQjNCMDJDMDMwMjE4RjgyMDA1MEQ4Cis6MTAxMEYwMDAzQzAzMDAxMDAwNDMxMDI0MTA0MDAwMTYwMDAwMDAwMEM0Cis6MTAxMTAwMDA4QzAyMDIxODMwNDIwMDQwMTA0MDAwMEYyNDAyMDAwMUZGCis6MTAxMTEwMDA4RjgyMDA1MDhDMDMwMjE4MjQwRTAwMDEzQzA0MDAwMTUxCis6MTAxMTIwMDAyNDg0NUQ1MEEzQUUwMDNGQUZBMjAwMTBBRkEzMDAxNDEzCis6MTAxMTMwMDA4Rjg3MDA0MDI0MDUyMDAwMEMwMDJCM0IwMkMwMzAyMThCCis6MTAxMTQwMDAxMDAwMDAwNDAwMDAwMDAwM0MwMTAwMDEwMDM3MDgyMUVECis6MTAxMTUwMDBBMDIyNDBGNDNDMDQwMDAxMjQ4NDVFMzQzQzA1MDAwMURDCis6MTAxMTYwMDAyNEE1NUFDMDNDMDYwMDAxMjRDNjVCMzgwMEM1MzAyM0M0Cis6MTAxMTcwMDA4RjQyMDAwODI3QjMwMDMwMDI2MDM4MjEyN0IxMDAzNEM1Cis6MTAxMTgwMDAzNDQyMEUwMEFGNDIwMDA4MEMwMDE3QTNBRkIxMDAxMEFDCis6MTAxMTkwMDAzQzA0MDAwMTI0ODQ1RTRDM0MwNTAwMDEyNEE1RDhCNDI1Cis6MTAxMUEwMDAzQzA2MDAwMTI0QzZFM0M4MDBDNTMwMjMwMjYwMzgyMTk0Cis6MTAxMUIwMDBBRjQyMDEwQzBDMDAxN0EzQUZCMTAwMTAzQzA0MDAwMUJBCis6MTAxMUMwMDAyNDg0NUU2NDNDMDUwMDAxMjRBNUU5QUMzQzA2MDAwMUQyCis6MTAxMUQwMDAyNEM2RjBGMDAwQzUzMDIzMDI2MDM4MjEzQzAxMDAwMTM0Cis6MTAxMUUwMDBBQzIyNkYwNDBDMDAxN0EzQUZCMTAwMTAzQzA0MDAwMTQ3Cis6MTAxMUYwMDAyNDg0NUU3QzEwMDAwMDI3MjQwNTIxMDAzQzA0MDAwMUFCCis6MTAxMjAwMDAyNDg0NUU4NDNDMDUwMDAxMjRBNTlGQzgzQzA2MDAwMTlGCis6MTAxMjEwMDAyNEM2QTEwNDAwQzUzMDIzMjdCMTAwMzAwMjIwMzgyMUE0Cis6MTAxMjIwMDAyN0IzMDAzNDBDMDAxN0EzQUZCMzAwMTAzQzA0MDAwMTM3Cis6MTAxMjMwMDAyNDg0NUU5NDNDMDUwMDAxMjRBNUNBRDQzQzA2MDAwMTI4Cis6MTAxMjQwMDAyNEM2RDhBQzAwQzUzMDIzMDIyMDM4MjFBRjQyMDEwQzlGCis6MTAxMjUwMDAwQzAwMTdBM0FGQjMwMDEwM0MwNDAwMDEyNDg0NUVBNDZCCis6MTAxMjYwMDAzQzA1MDAwMTI0QTVFODRDM0MwNjAwMDEyNEM2RTlBNDg1Cis6MTAxMjcwMDAwMEM1MzAyMzAyMjAzODIxM0MwMTAwMDFBQzIyNkYwNDVDCis6MTAxMjgwMDAwQzAwMTdBM0FGQjMwMDEwM0MwNDAwMDEyNDg0NUVCODI3Cis6MTAxMjkwMDAyNDA1MjE1MDAyQzAzMDIxMDAwMDM4MjEzQzAxMDAwMTBBCis6MTAxMkEwMDBBQzIyNkYxMEFGQTAwMDEwMEMwMDJCM0JBRkEwMDAxNEJECis6MTAxMkIwMDAzQzExMEZGRjNDMDMwMDAxOEM2MzZGMDQzNjMxRkZGRkNDCis6MTAxMkMwMDAwMjQwOTgyMTNDMDIwMDAxOEM0MjZGMTAzQzBFMDgwMDQ1Cis6MTAxMkQwMDAwMDcxMTgyNDAwMDMxODgyMDA2RTE4MjUwMDUxMTAyNDk0Cis6MTAxMkUwMDAwMDAyMTA4MjAwNEUxMDI1QUU2MzAwMzhBRTYyMDA3ODE2Cis6MTAxMkYwMDA4QzAyMDIxODMwNDIwMDQwMTQ0MDAwMDQyNDAyMDAwMTE1Cis6MTAxMzAwMDAzQzAxMDAwMTAwMzcwODIxQTAyMjQwRjQzQzA0MDAwMTA4Cis6MTAxMzEwMDAyNDg0NUVDNDNDMDUwMDAxMjRBNUUzRDAzQzA2MDAwMTAyCis6MTAxMzIwMDAyNEM2RTUyQzAwQzUzMDIzMjdCRTAwMzAwM0MwMzgyMTc5Cis6MTAxMzMwMDAyN0I1MDAzNDBDMDAxN0EzQUZCNTAwMTAzQzAxMDAwMTI1Cis6MTAxMzQwMDBBQzIyNkVGQzAwNTExMDI0MDAwMjEwODIzQzBFMDgwMEZBCis6MTAxMzUwMDAwMDRFMTAyNUFFNjIwMDUwMzJDMjIwMDAxMDQwMDAwNjQwCis6MTAxMzYwMDAwM0MwMzgyMTNDMDIwMDAwMjQ0MjVDQkMwMjIyMTAyNDRECis6MTAxMzcwMDAxMDAwMDAwRjAwMDIxMDgyM0MwNDAwMDEyNDg0NUVEODlCCis6MTAxMzgwMDAzQzA1MDAwMTI0QTVFNTM0M0MwNjAwMDEyNEM2RTZFNDQyCis6MTAxMzkwMDAwMEM1MzAyMzBDMDAxN0EzQUZCNTAwMTAzQzAxMDAwMUJECis6MTAxM0EwMDBBQzIyNkYxNDAwNTExMDI0MDAwMjEwODIzQzBFMDgwMDgxCis6MTAxM0IwMDAwMDRFMTAyNUFFNjIwMDQ4MzJDMjQwMDAxMDQwMDAwNUM5Cis6MTAxM0MwMDAyN0E3MDAzMDNDMDIwMDAwMjQ0MjVDQkMxMDAwMDAwRTQ1Cis6MTAxM0QwMDAwMDAyMTEwMDNDMDQwMDAxMjQ4NDVFRjAzQzA1MDAwMTgxCis6MTAxM0UwMDAyNEE1RTZFQzNDMDYwMDAxMjRDNkU4NDQwMEM1MzAyM0YxCis6MTAxM0YwMDAyN0EyMDAzNDBDMDAxN0EzQUZBMjAwMTAzQzAxMDAwMThCCis6MTAxNDAwMDBBQzIyNkYwODAwMDIxMTAwMDAwMjExODIzQzAzMDgwMEE4Cis6MTAxNDEwMDAwMDQzMTAyNUFFNDIwMDYwM0MwNDAwMDEyNDg0NUYwOEI0Cis6MTAxNDIwMDAzQzA1MDAwMTI0QTU4MjMwM0MwNjAwMDEyNEM2ODY1MEZDCis6MTAxNDMwMDAwMEM1MzAyMzI3QjEwMDMwMDIyMDM4MjEyN0IzMDAzNDAzCis6MTAxNDQwMDAwQzAwMTdBM0FGQjMwMDEwM0MwRTBGRkYzNUNFRkZGRjBCCis6MTAxNDUwMDAzQzA0MDAwMTI0ODQ1RjE0M0MwNTAwMDAyNEE1NjQ2ODVBCis6MTAxNDYwMDAzQzA2MDAwMDI0QzY2NTg4MDBDNTMwMjMwMjIwMzgyMUQwCis6MTAxNDcwMDAwMjQwRjAyMTNDMDEwMDAxQUMyMjZFREMwMDRFMTAyNDQxCis6MTAxNDgwMDAwMDAyMTA4MjNDMTUwODAwMDA1NTEwMjVBRkFFMDA0NDQ0Cis6MTAxNDkwMDBBRkMyMDBCODBDMDAxN0EzQUZCMzAwMTAzQzA0MDAwMUFBCis6MTAxNEEwMDAyNDg0NUYyMDNDMDUwMDAwMjRBNTY1OTAzQzA2MDAwMEQ0Cis6MTAxNEIwMDAyNEM2NjgwODhGQUUwMDQ0MDBDNTMwMjMwMjIwMzgyMUJFCis6MTAxNEMwMDAzQzAxMDAwMUFDMjI2RUQwMDA0RTEwMjQwMDAyMTA4MkJDCis6MTAxNEQwMDAwMDU1MTAyNUFGQzIwMEU4MEMwMDE3QTNBRkIzMDAxMEYxCis6MTAxNEUwMDAzQzA0MDAwMTI0ODQ1RjM4M0MwNTAwMDAyNEE1NjgxMEZBCis6MTAxNEYwMDAzQzA2MDAwMDI0QzY2OTQwOEZBRTAwNDQwMEM1MzAyMzdFCis6MTAxNTAwMDAwMjIwMzgyMTNDMDEwMDAxQUMyMjZFQzgwMDRFMTAyNDlDCis6MTAxNTEwMDAwMDAyMTA4MjAwNTUxMDI1QUZDMjAwQzAwQzAwMTdBM0I2Cis6MTAxNTIwMDBBRkIzMDAxMDNDMDQwMDAxMjQ4NDVGNTAzQzA1MDAwMTZGCis6MTAxNTMwMDAyNEE1RkFEMDNDMDYwMDAxMjRDNkZCQTg4RkFFMDA0NEM3Cis6MTAxNTQwMDAwMEM1MzAyMzAyMjAzODIxM0MwMTAwMDFBQzIyNkVENEJBCis6MTAxNTUwMDAwMDRFMTAyNDAwMDIxMDgyMDA1NTEwMjVBRkMyMDBDOEIyCis6MTAxNTYwMDAwQzAwMTdBM0FGQjMwMDEwM0MwNDAwMDEyNDg0NUY1QzlGCis6MTAxNTcwMDAzQzA1MDAwMTI0QTVDOTNDM0MwNjAwMDEyNEM2Q0EyMDQ0Cis6MTAxNTgwMDAwMEM1MzAyMzAyMjAzODIxQUY0MjAxMTAwQzAwMTdBMzAwCis6MTAxNTkwMDBBRkIzMDAxMDNDMDQwMDAxMjQ4NDVGNkMzQzA1MDAwMUUzCis6MTAxNUEwMDAyNEE1QzkxMDNDMDYwMDAxMjRDNkM5MzQwMEM1MzAyMzU3Cis6MTAxNUIwMDAwMjIwMzgyMUFGNDIwMTI0MEMwMDE3QTNBRkIzMDAxMDYyCis6MTAxNUMwMDAzQzA0MDAwMTI0ODQ1RjdDM0MwNTAwMDEyNEE1NUE4MDcyCis6MTAxNUQwMDAzQzA2MDAwMTI0QzY1QUFDMDBDNTMwMjMwMjIwMzgyMTQ1Cis6MTAxNUUwMDBBRjQyMDEyMEFGNDIwMTE0MEMwMDE3QTNBRkIzMDAxMEFCCis6MTAxNUYwMDAzQzA0MDAwMTI0ODQ1Rjg4M0MwNTAwMDEyNEE1RjI5ODg2Cis6MTAxNjAwMDAzQzA2MDAwMTI0QzZGNkI0MDBDNTMwMjMwMjIwMzgyMTcwCis6MTAxNjEwMDBBRjQyMDExODBDMDAxN0EzQUZCMzAwMTA4RkFFMDA0NDA3Cis6MTAxNjIwMDAzQzAxMDAwMUFDMjI2RjE4MDA0RTEwMjQwMDAyMTA4MjExCis6MTAxNjMwMDAwMDU1MTAyNTBDMDAzRkMzQUZDMjAwRDAwQzAwM0M0MDQ5Cis6MTAxNjQwMDAwMDAwMDAwMDBDMDAyN0E4MDAwMDAwMDBBQzAwMDIyOEU5Cis6MTAxNjUwMDBBQzAwMDIyQzk2RTIwNDUwMjQ0MkZGRkZBRjQyMDAzODU3Cis6MTAxNjYwMDA5NkUyMDQ2MEFGNDIwMDgwMzJDMjQwMDAxNDQwMDAwM0EyCis6MTAxNjcwMDAwMDAwMDAwMDk2RTIwNDgwQUY0MjAwODQ5NkU3MDQ5MEU4Cis6MTAxNjgwMDA1MEUwMDAwMTI0MDcwODAwMjRFMkZGRkZBRjQyMDA4ODc5Cis6MTAxNjkwMDBBRjQyMDA3QzI0MDIwODAwMTBFMjAwMEYzMkMyNDAwMDdBCis6MTAxNkEwMDAxMDQwMDAwMzI0MDIwNDAwMTBFMjAwMEIwMDAwMDAwMEMwCis6MTAxNkIwMDAyNDBFMDAwMTNDMDQwMDAxMjQ4NDVGOThBM0FFMDAzRjg3Cis6MTAxNkMwMDA5NkU2MDQ5MDI0MDUyMTcwMDJDMDM4MjFBRkEwMDAxMEQ2Cis6MTAxNkQwMDAwQzAwMkIzQkFGQTAwMDE0OEY0MzAxMzg4RjQ0MDEzODFFCis6MTAxNkUwMDAyNDAyMDAwMUEzNDIwNUMyQUY0MzAwOTRBRjQ0MDA5ODE2Cis6MTAxNkYwMDBBRkEwMDAxMEFGQTAwMDE0OEY0NjAwODA4RjQ3MDA4NDc5Cis6MTAxNzAwMDAzQzA0MDAwMTI0ODQ1RkE0MEMwMDJCM0IyNDA1MjIwMDMwCis6MTAxNzEwMDAwQzAwMjRBNDNDMTEwODAwM0MxNDMzRDgzNjk0Q0I1ODU4Cis6MTAxNzIwMDAzQzAyMDgwMDM0NDIwMDgwM0MwNDAwMDEyNDg0NUZCMDg1Cis6MTAxNzMwMDAzQzA1MDAwMDI0QTU1RDAwM0MwNjAwMDAyNEM2NUQxQzlECis6MTAxNzQwMDAwMEM1MzAyMzI3QTcwMDMwQUY4MjAwNjAyNDAyRkZGRkNFCis6MTAxNzUwMDBBRjgyMDA2NDI3QTIwMDM0MEMwMDE3QTNBRkEyMDAxMEQwCis6MTAxNzYwMDAzQzAxMDAwMUFDMjI2RUI4MDAwMjExMDAwMDAyMTE4MjlGCis6MTAxNzcwMDAwMDUxMTAyNTBDMDAxOEZDQUU0MjAwMDA4RjgyMDI0MDgwCis6MTAxNzgwMDAzQzAzMDAwMTAwNDMxMDI1QUY4MjAyNDAzQzAyMDAwMEYwCis6MTAxNzkwMDAyNDQyNDAzNEFGODIwMjQ0QUY4MDAyNDA4RjgyMDA2MDE2Cis6MTAxN0EwMDAwMDUxMTAyNDE0NDAwMDA1M0MwMzA4MDA4RjgyMDA2MEEzCis6MTAxN0IwMDAwMDQzMTAyNDEwNDBGRkZEMDAwMDAwMDAwQzAwM0M0REQxCis6MTAxN0MwMDAwMDAwODgyMTNDMDIwMTAwQUZBMjAwMjA4RjUzMDAxOEM2Cis6MTAxN0QwMDAyNDAyMDBGRjU2NjIwMDAxMjY3MTAwMDE4QzAyMDIyOERCCis6MTAxN0UwMDAxNjIyMDAwRTAwMTMzMEMwOEY0MjAzM0MyNDQyMDAwMTM5Cis6MTAxN0YwMDBBRjQyMDMzQzhGNDIwMzNDOEMwMjAyMjgzQzA0MDAwMUIwCis6MTAxODAwMDAyNDg0NUMyNDNDMDUwMDA5QUZBMDAwMTRBRkEyMDAxMEEyCis6MTAxODEwMDA4RkE2MDAyMDEwMDAwMDNGMzRBNTAxMDAwMEQ3MTAyMTQyCis6MTAxODIwMDA4RkEzMDAyMDhGQTQwMDI0QUM0MzA0QzBBQzQ0MDRDNEE0Cis6MTAxODMwMDAwMEMwMTgyMThGNDQwMTc4OEY0NTAxN0MwMDAwMTAyMUUxCis6MTAxODQwMDAyNDA3MDAwNEFGQTcwMDEwQUZCMTAwMTQ4RjQ4MDAwQ0FDCis6MTAxODUwMDAyNEM2MDRDMDAyRTYzMDIxQUZBODAwMTg4RjQ4MDEwQzRFCis6MTAxODYwMDAyNDA3MDAwODAwQTMyODIxMDBBMzQ4MkIwMDgyMjAyMTgwCis6MTAxODcwMDAwMTAwRjgwOTAwODkyMDIxMTQ0MDAwMEIyNDA3MDAwODBBCis6MTAxODgwMDA4RjgyMDEyMEFGQTIwMDEwOEY4MjAxMjQzQzA0MDAwMTRFCis6MTAxODkwMDAyNDg0NUMyQzNDMDUwMDA5QUZBMjAwMTQ4RkE2MDAyMDE0Cis6MTAxOEEwMDAxMDAwMDAxQzM0QTUwMjAwOEY0NDAxNjA4RjQ1MDE2NEM0Cis6MTAxOEIwMDA4RjQzMDAwQ0FGNTEwMDE4OEY4NjAxMjAyNDAyMDAxMEM2Cis6MTAxOEMwMDBBRkEyMDAxMEFGQjEwMDE0QUZBMzAwMTg4RjQyMDEwQ0ZCCis6MTAxOEQwMDAwMDQwRjgwOTI0QzYwMDFDMTQ0MDAwMTAwMDAwMDAwMDVECis6MTAxOEUwMDA4RjQyMDM0MDI0NDIwMDAxQUY0MjAzNDA4RjQyMDM0MDM1Cis6MTAxOEYwMDA4RjgyMDEyMEFGQTIwMDEwOEY4MjAxMjQzQzA0MDAwMURFCis6MTAxOTAwMDAyNDg0NUMzNDNDMDUwMDA5QUZBMjAwMTQ4RkE2MDAyMDlCCis6MTAxOTEwMDAzNEE1MDMwMDBDMDAyQjNCMDI2MDM4MjE4RjQyMDJFNDA3Cis6MTAxOTIwMDAyNDQyMDAwMUFGNDIwMkU0OEY0MjAyRTQ5M0EyMDAzRjRFCis6MTAxOTMwMDAxMDQwMDA2OTNDMDIwNzAwMzQ0MjMwMDBBRkEyMDAyODhBCis6MTAxOTQwMDA4RjUzMDAxODI0MDIwMEZGMTI2MjAwMDIwMDAwODgyMTU5Cis6MTAxOTUwMDAyNjcxMDAwMThDMDIwMjI4MTYyMjAwMEUwMDEzMzBDMEVFCis6MTAxOTYwMDA4RjQyMDMzQzI0NDIwMDAxQUY0MjAzM0M4RjQyMDMzQ0MwCis6MTAxOTcwMDA4QzAyMDIyODNDMDQwMDAxMjQ4NDVDMjQzQzA1MDAwOUZDCis6MTAxOTgwMDBBRkEwMDAxNEFGQTIwMDEwOEZBNjAwMjgxMDAwMDAzRkU3Cis6MTAxOTkwMDAzNEE1MDEwMDAwRDcxMDIxOEZBMzAwMjg4RkE0MDAyQ0FDCis6MTAxOUEwMDBBQzQzMDRDMEFDNDQwNEM0MDBDMDE4MjE4RjQ0MDE3ODg3Cis6MTAxOUIwMDA4RjQ1MDE3QzAwMDAxMDIxMjQwNzAwMDRBRkE3MDAxMDEwCis6MTAxOUMwMDBBRkIxMDAxNDhGNDgwMDBDMjRDNjA0QzAwMkU2MzAyMUQ5Cis6MTAxOUQwMDBBRkE4MDAxODhGNDgwMTBDMjQwNzAwMDgwMEEzMjgyMTk1Cis6MTAxOUUwMDAwMEEzNDgyQjAwODIyMDIxMDEwMEY4MDkwMDg5MjAyMTUyCis6MTAxOUYwMDAxNDQwMDAwQjI0MDcwMDA4OEY4MjAxMjBBRkEyMDAxMEMyCis6MTAxQTAwMDA4RjgyMDEyNDNDMDQwMDAxMjQ4NDVDMkMzQzA1MDAwOUU1Cis6MTAxQTEwMDBBRkEyMDAxNDhGQTYwMDI4MTAwMDAwMUMzNEE1MDIwMEZECis6MTAxQTIwMDA4RjQ0MDE2MDhGNDUwMTY0OEY0MzAwMENBRjUxMDAxODUzCis6MTAxQTMwMDA4Rjg2MDEyMDI0MDIwMDEwQUZBMjAwMTBBRkIxMDAxNDY1Cis6MTAxQTQwMDBBRkEzMDAxODhGNDIwMTBDMDA0MEY4MDkyNEM2MDAxQzA3Cis6MTAxQTUwMDAxNDQwMDAxMDAwMDAwMDAwOEY0MjAzNDAyNDQyMDAwMUE3Cis6MTAxQTYwMDBBRjQyMDM0MDhGNDIwMzQwOEY4MjAxMjBBRkEyMDAxMDlCCis6MTAxQTcwMDA4RjgyMDEyNDNDMDQwMDAxMjQ4NDVDMzQzQzA1MDAwOTZECis6MTAxQTgwMDBBRkEyMDAxNDhGQTYwMDI4MzRBNTAzMDAwQzAwMkIzQjQ2Cis6MTAxQTkwMDAwMjYwMzgyMThGNDIwMkYwMjQ0MjAwMDFBRjQyMDJGMDdFCis6MTAxQUEwMDA4RjQyMDJGMDNDMDQwMDAxMjQ4NDVGQzBBRkEwMDAxMDBDCis6MTAxQUIwMDBBRkEwMDAxNDhGQTYwMDI4MjQwNTIzMDAwQzAwMkIzQkE4Cis6MTAxQUMwMDAwMDAwMzgyMTEwMDAwMDA0MDAwMDAwMDA4QzAyMDI2NEI1Cis6MTAxQUQwMDAxMDQwMDAwNTAwMDAwMDAwOEY4MjAwQTAzMDQyMDAwNDhBCis6MTAxQUUwMDAxNDQwRkZGQTAwMDAwMDAwOEY4MjAwNDQzNDQyMDAwNERBCis6MTAxQUYwMDBBRjgyMDA0NDhGNDIwMzA4MjQ0MjAwMDFBRjQyMDMwODMyCis6MTAxQjAwMDA4RjQyMDMwODhGODIwMEQ4OEY4MzAwRDQwMDQzMTAyM0I0Cis6MTAxQjEwMDAyNDQyRkY4MEFGNDIwMDkwOEY0MjAwOTAyODQyRkY4MTE0Cis6MTAxQjIwMDAxMDQwMDAwNjI0MDIwMDAxOEY0MjAwOTA4RjQzMDE0NEMwCis6MTAxQjMwMDAwMDQzMTAyMUFGNDIwMDkwMjQwMjAwMDFBRjQyMDA4QzBDCis6MTAxQjQwMDAzMkMyMDAwODEwNDAwMDA2MDAwMDAwMDA4RjgyMDIxNDFDCis6MTAxQjUwMDAzQzAzODEwMDMwNDJGRkZGMDA0MzEwMjVBRjgyMDIxNDk2Cis6MTAxQjYwMDAzQzAzMDAwMThDNjM2RDk0MzA2MjAwMDIxMDQwMDAwOTU4Cis6MTAxQjcwMDAzMDYyMDAwMTNDMDQwMDAxMjQ4NDVGQ0MzQzA1MDAwMDdECis6MTAxQjgwMDAyNEE1NkQ1MDNDMDYwMDAwMjRDNjcxQzgxMDAwMDAxMjQ4Cis6MTAxQjkwMDAwMEM1MzAyMzEwNDAwMDA5MDAwMDAwMDAzQzA0MDAwMTkzCis6MTAxQkEwMDAyNDg0NUZEQzNDMDUwMDAwMjRBNTcxRDAzQzA2MDAwMEM1Cis6MTAxQkIwMDAyNEM2NzY3ODEwMDAwMDA4MDBDNTMwMjMzQzA0MDAwMURDCis6MTAxQkMwMDAyNDg0NUZFQzNDMDUwMDAwMjRBNTY5NDgzQzA2MDAwMDI1Cis6MTAxQkQwMDAyNEM2NkQ0ODAwQzUzMDIzMjdBNzAwMzAyN0EyMDAzNDUzCis6MTAxQkUwMDAwQzAwMTdBM0FGQTIwMDEwM0MwMTAwMDFBQzIyNkVDQzg4Cis6MTAxQkYwMDAzQzAyMDAwMThDNDI2RUNDM0MwMzA4MDAwMDAyMTEwMDQ0Cis6MTAxQzAwMDAwMDAyMTE4MjAwNDMxMDI1QUU0MjAwNDA4RjgyMDBBMEU2Cis6MTAxQzEwMDBBRkEyMDAxMDhGODIwMEIwQUZBMjAwMTQ4Rjg2MDA1Q0NDCis6MTAxQzIwMDA4Rjg3MDExQzNDMDQwMDAxMjQ4NDVGRkMzQzAxMDAwMUZGCis6MTAxQzMwMDBBQzM2NkVBNDNDMDEwMDAxQUMyMDZFOTQzQzAxMDAwMTY2Cis6MTAxQzQwMDBBQzNDNkU4QzNDMDEwMDAxQUMzQjZFQkMzQzAxMDAwMTI1Cis6MTAxQzUwMDBBQzM3NkVDMDNDMDEwMDAxQUMzQTZFQTAwQzAwMkIzQkNGCis6MTAxQzYwMDAyNDA1MjQwMDhGODIwMjAwQUZBMjAwMTA4RjgyMDIyMDgwCis6MTAxQzcwMDBBRkEyMDAxNDhGODYwMDQ0OEY4NzAwNTAzQzA0MDAwMUZGCis6MTAxQzgwMDAyNDg0NjAwODBDMDAyQjNCMjQwNTI1MDA4RjgzMDA2MDEyCis6MTAxQzkwMDAwMDc0MTAwQjAyNDIwMDBBMDIwMEY4MjEwMDAwMDAwMDRDCis6MTAxQ0EwMDAwMDAwMDAwRDhGQkYwMDYwOEZCRTAwNUM4RkI1MDA1ODM0Cis6MTAxQ0IwMDA4RkIzMDA1NDhGQjIwMDUwOEZCMTAwNEM4RkIwMDA0OEVBCis6MTAxQ0MwMDAwM0UwMDAwODI3QkQwMDY4MjdCREZGRTAzQzA0MDAwMUQ5Cis6MTAxQ0QwMDAyNDg0NjAxNDI0MDUyNjAwMDAwMDMwMjEwMDAwMzgyMUVGCis6MTAxQ0UwMDBBRkJGMDAxOEFGQTAwMDEwMEMwMDJCM0JBRkEwMDAxNDNBCis6MTAxQ0YwMDA4RkJGMDAxODAzRTAwMDA4MjdCRDAwMjAwM0UwMDAwOEE0Cis6MTAxRDAwMDAwMDAwMDAwMDAzRTAwMDA4MDAwMDAwMDAwMDAwMDAwMEU4Cis6MTAxRDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEMzCis6MTAxRDIwMDAwM0UwMDAwODAwMDAwMDAwMDNFMDAwMDgwMDAwMDAwMERECis6MTAxRDMwMDAyN0JERkRFMDI3QTUwMDE4M0MwNERFQUQzNDg0QkVFRkNFCis6MTAxRDQwMDBBRkJGMDIxODhGODIwMTUwM0MwMzAwMUYzNDYzRkZGRkI2Cis6MTAxRDUwMDBBRkE0MDAxODAwQTIyODIzMDBBMzI4MjQ4Q0EyMDAwMDBFCis6MTAxRDYwMDAxMDQ0MDAwQTAwMDAwMDAwQUZBNTAwMTA4Q0EyMDAwMDgzCis6MTAxRDcwMDBBRkEyMDAxNDhGODYwMTUwOEY4NzAyNTAzQzA0MDAwMUVGCis6MTAxRDgwMDAyNDg0NjAxQzBDMDAyQjNCMjQwNTI3MDA4RkJGMDIxODA1Cis6MTAxRDkwMDAwM0UwMDAwODI3QkQwMjIwMjdCREZGRTAzQzA2QUJCQUU4Cis6MTAxREEwMDAzNEM2QkFCRUFGQjAwMDE4M0MxMDAwMDQzQzA3MDA3RjM4Cis6MTAxREIwMDAzNEU3RkZGRkFGQkYwMDFDMDAxMDI4NDA4RTA0MDAwMDc2Cis6MTAxREMwMDA4Q0EzMDAwMEFDQTAwMDAwQUUwNjAwMDA4Q0EyMDAwMEI2Cis6MTAxREQwMDBBQ0EzMDAwMDEwNDYwMDA1QUUwNDAwMDAwMEEwODAyMTY2Cis6MTAxREUwMDAwMEYwMTAyQjEwNDBGRkY1MDAxMDI4NDAzQzA0MDAwMUNCCis6MTAxREYwMDAyNDg0NjAyODI0MDUyODAwMDIwMDMwMjEwMDAwMzgyMUI2Cis6MTAxRTAwMDBBRkEwMDAxMDBDMDAyQjNCQUZBMDAwMTQwMjAwMTAyMTZCCis6MTAxRTEwMDA4RkJGMDAxQzhGQjAwMDE4MDNFMDAwMDgyN0JEMDAyMDEyCis6MTAxRTIwMDA4QzAyMDIyNDMwNDcwMDNGMTBFMDAwMTAwMDgwMzAyMTc3Cis6MTAxRTMwMDAwMDAwMjgyMTI0MDMwMDIwMDBFMzEwMjQxMDQwMDAwMkE5Cis6MTAxRTQwMDAwMDA2MzA0MjAwQTYyODIxMDAwMzE4NDIxNDYwRkZGQjYwCis6MTAxRTUwMDAwMEUzMTAyNDI0MDJGMDAwMDBBMjI4MjQzNDAyRkZGRjMzCis6MTAxRTYwMDAwMDQ1MTAyQjE0NDAwMDAzM0MwMjAwMDExMDAwMDAwODQ0Cis6MTAxRTcwMDAzQzAyMDAwMTM0NDJGRkZGMDA4NTE4MjMwMDQzMTAyQjcxCis6MTAxRTgwMDAxNDQwMDAwMzAwQTAxMDIxM0MwMkZGRkUwMDgyMTAyMTNDCis6MTAxRTkwMDAwM0UwMDAwODAwMDAwMDAwMjdCREZGRDBBRkI1MDAyODE4Cis6MTAxRUEwMDA4RkI1MDA0MEFGQjIwMDIwMDBBMDkwMjFBRkIxMDAxQzYwCis6MTAxRUIwMDAyNEM2MDAwM0FGQkYwMDJDQUZCMzAwMjRBRkIwMDAxODlFCis6MTAxRUMwMDA4RUEyMDAwMDI0MDNGRkZDMDBDMzgwMjQwMDUwMTAyQkNFCis6MTAxRUQwMDAxNDQwMDAxQjAwRTA4ODIxOEUzMzAwMDBBRkIwMDAxMERBCis6MTAxRUUwMDA4RUEyMDAwMEFGQTIwMDE0OEUyNzAwMDAyNDA1MzAwMDRGCis6MTAxRUYwMDAwQzAwMkIzQjAyNDAzMDIxOEUyMzAwMDAwMDcwMjAyMTdCCis6MTAxRjAwMDAwMDY0MTAyQjEwNDAwMDA3MDI0MDI4MjE4Q0EyMDAwMDIyCis6MTAxRjEwMDBBQzYyMDAwMDI0NjMwMDA0MDA2NDEwMkIxNDQwRkZGQjNCCis6MTAxRjIwMDAyNEE1MDAwNDhFQTIwMDAwMDA1MDEwMjNBRUEyMDAwMEUxCis6MTAxRjMwMDA4RTIyMDAwMDAwNTAxMDIxMTAwMDAwMEJBRTIyMDAwMDg1Cis6MTAxRjQwMDAyNDAyMDAyREEwODIwMDAwQUZCMDAwMTA4RUEyMDAwMDdECis6MTAxRjUwMDAwMjQwOTgyMUFGQTIwMDE0OEUyNzAwMDAyNDA1MzEwMDEyCis6MTAxRjYwMDAwQzAwMkIzQjAyNjAzMDIxMDI2MDEwMjE4RkJGMDAyQzNGCis6MTAxRjcwMDA4RkI1MDAyODhGQjMwMDI0OEZCMjAwMjA4RkIxMDAxQ0QyCis6MTAxRjgwMDA4RkIwMDAxODAzRTAwMDA4MjdCRDAwMzAyN0JERkZFODMwCis6MTAxRjkwMDAzQzFDQzAwMDNDMDVGRkZFM0MwMzAwMDE4QzYzNkU4NENBCis6MTAxRkEwMDAzQzA0MDAwMThDODQ2RTkwMzRBNUJGMDgyNDAyMUZGQzAxCis6MTAxRkIwMDAzQzAxMDAwMUFDMjI2Q0QwM0MwMjAwQzAzQzAxMDAwMTlECis6MTAxRkMwMDBBQzIyNkNENDNDMDIwMDIwQUZCRjAwMTAzQzAxMDBDMDJBCis6MTAxRkQwMDBBQzIwMUZGQzAwNDMxMDIzMDA0NDEwMjMyNDVCQjAwMEZFCis6MTAxRkUwMDAwMzY1QjgyMTNDMUQwMDAxOEZCRDZDQ0MwM0EwRjAyMTFFCis6MTAxRkYwMDAzQzA0MDBDMDM0ODQwMjAwM0MxQTAwQzAzQzAzMDBDMDEyCis6MTAyMDAwMDAzNDYzMDdDODI0MDIxREZDM0MwMTAwMDFBQzIyNkNEMEUzCis6MTAyMDEwMDAyNDAyMTgzNDNDMDEwMDAxQUMyNDZDRDQzQzAxMDAwMUMyCis6MTAyMDIwMDBBQzIyNkNEMDNDMDEwMDAxQUMyMzZDRDQwQzAwMTgwRDI4Cis6MTAyMDMwMDAzNzVBMDIwMDhGQkYwMDEwMDNFMDAwMDgyN0JEMDAxOEM4Cis6MTAyMDQwMDAyN0JERkZDODNDMDQwMDAxMjQ4NDYwMzQyNDA1MzIwMDBECis6MTAyMDUwMDAzQzAyMDAwMThDNDI2Q0QwM0MwMzAwMDE4QzYzNkNENEM4Cis6MTAyMDYwMDAwMDAwMzAyMTAzNjAzODIxQUZCRjAwMzBBRkIzMDAyQzM3Cis6MTAyMDcwMDBBRkIyMDAyOEFGQjEwMDI0QUZCMDAwMjBBRkEyMDAxQzY3Cis6MTAyMDgwMDBBRkEzMDAxOEFGQjcwMDEwMEMwMDJCM0JBRkJBMDAxNDgxCis6MTAyMDkwMDAwQzAwMTkxNjAwMDAwMDAwOEY4MjAyNDAzNDQyMDAwNDM4Cis6MTAyMEEwMDBBRjgyMDI0MDI0MDIwMDAxQUY0MjAwMDAzQzAyMDAwMTY2Cis6MTAyMEIwMDAwMDU3MTAyMTkwNDI0MEY0MTA0MDAwOTIyNDAzRkZGQzhFCis6MTAyMEMwMDAzQzEwMDAwMTI2MTBBQzczM0MxMjAwMDEyNjUyQTg0Q0IzCis6MTAyMEQwMDAwMjEyMTAyMzAwNDM4MDI0OEZBMzAwMUMzQzA0MDAwMTQzCis6MTAyMEUwMDAyNDg0NjA0MDAwNzAxMDJCMTQ0MDAwMUEyN0IzMDAxODlECis6MTAyMEYwMDA4RkIxMDAxODI0MDUzMDAwMDI0MDMwMjFBRkIwMDAxMDJECis6MTAyMTAwMDBBRkEzMDAxNDBDMDAyQjNCMDIyMDM4MjE4RkEzMDAxODMyCis6MTAyMTEwMDAwMDcwMjAyMTAwNjQxMDJCMTA0MDAwMDcwMjQwMzAyMTg1Cis6MTAyMTIwMDA4Q0MyMDAwMEFDNjIwMDAwMjQ2MzAwMDQwMDY0MTAyQjI5Cis6MTAyMTMwMDAxNDQwRkZGQjI0QzYwMDA0OEZBMjAwMUMwMDUwMTAyMzkzCis6MTAyMTQwMDBBRkEyMDAxQzhFNjIwMDAwMDA1MDEwMjExMDAwMDAwQTk3Cis6MTAyMTUwMDBBRTYyMDAwMDAyNDA4ODIxMjQwNTMxMDBBRkIwMDAxMEJCCis6MTAyMTYwMDBBRkEzMDAxNDhGQTcwMDE4MDIyMDMwMjEyNDAyMDAyREY1Cis6MTAyMTcwMDAwQzAwMkIzQkEwODIwMDAwMjQwNzAwMjA4RkEzMDAxQzMyCis6MTAyMTgwMDAzQzA0MDAwMTI0ODQ2MDVDMjQxMjAwMjAzQzAxMDAwMTE2Cis6MTAyMTkwMDBBQzMxNkVCMDJDNjIwMDIwMTQ0MDAwMUQyN0IxMDAxODM1Cis6MTAyMUEwMDA4RkIwMDAxODI0MDUzMDAwM0MwNjAwMDEyNEM2NkY1MDkzCis6MTAyMUIwMDBBRkE3MDAxMEFGQTMwMDE0MEMwMDJCM0IwMjAwMzgyMTg2Cis6MTAyMUMwMDA4RkEzMDAxODNDMDQwMDAxMjQ4NDZGNTAyNDY1MDAyMDc0Cis6MTAyMUQwMDAwMDY1MTAyQjEwNDAwMDA3MDAwMDAwMDA4QzgyMDAwMEZBCis6MTAyMUUwMDBBQzYyMDAwMDI0NjMwMDA0MDA2NTEwMkIxNDQwRkZGQjY4Cis6MTAyMUYwMDAyNDg0MDAwNDhGQTIwMDFDMDA1MjEwMjNBRkEyMDAxQ0Y0Cis6MTAyMjAwMDA4RTIyMDAwMDAwNTIxMDIxMTAwMDAwMEJBRTIyMDAwMEIwCis6MTAyMjEwMDAzQzEwMDAwMTI2MTA2RjUwMjQwNTMxMDBBRkE3MDAxMEJDCis6MTAyMjIwMDBBRkEzMDAxNDhGQTcwMDE4MDIwMDMwMjEyNDAyMDAyRDU0Cis6MTAyMjMwMDAwQzAwMkIzQkEwODIwMDAwMjQwNzAwMjAzQzA0MDAwMTdFCis6MTAyMjQwMDAyNDg0NjA3MDhGQTMwMDFDMjQxMjAwMjAzQzAxMDAwMTM0Cis6MTAyMjUwMDBBQzMwNkVFNDJDNjIwMDIwMTQ0MDAwMUQyN0IxMDAxODQxCis6MTAyMjYwMDA4RkIwMDAxODI0MDUzMDAwM0MwNjAwMDEyNEM2NkY3MEIyCis6MTAyMjcwMDBBRkE3MDAxMEFGQTMwMDE0MEMwMDJCM0IwMjAwMzgyMUM1Cis6MTAyMjgwMDA4RkEzMDAxODNDMDQwMDAxMjQ4NDZGNzAyNDY1MDAyMDkzCis6MTAyMjkwMDAwMDY1MTAyQjEwNDAwMDA3MDAwMDAwMDA4QzgyMDAwMDM5Cis6MTAyMkEwMDBBQzYyMDAwMDI0NjMwMDA0MDA2NTEwMkIxNDQwRkZGQkE3Cis6MTAyMkIwMDAyNDg0MDAwNDhGQTIwMDFDMDA1MjEwMjNBRkEyMDAxQzMzCis6MTAyMkMwMDA4RTIyMDAwMDAwNTIxMDIxMTAwMDAwMEJBRTIyMDAwMEYwCis6MTAyMkQwMDAzQzEwMDAwMTI2MTA2RjcwMjQwNTMxMDBBRkE3MDAxMERDCis6MTAyMkUwMDBBRkEzMDAxNDhGQTcwMDE4MDIwMDMwMjEyNDAyMDAyRDk0Cis6MTAyMkYwMDAwQzAwMkIzQkEwODIwMDAwM0MwMTAwMDExMDAwMDAzMUNCCis6MTAyMzAwMDBBQzMwNkVFMDNDMTAwMDAxMjYxMDgyMUYzQzEyMDAwMTMwCis6MTAyMzEwMDAyNjUyODA5QzAyMTIxMDIzMDA0MzgwMjQ4RkEzMDAxQ0FECis6MTAyMzIwMDAzQzA0MDAwMTI0ODQ2MDg0MDA3MDEwMkIxNDQwMDAxQUM3Cis6MTAyMzMwMDAyN0IzMDAxODhGQjEwMDE4MjQwNTMwMDAwMjQwMzAyMTY3Cis6MTAyMzQwMDBBRkIwMDAxMEFGQTMwMDE0MEMwMDJCM0IwMjIwMzgyMUNCCis6MTAyMzUwMDA4RkEzMDAxODAwNzAyMDIxMDA2NDEwMkIxMDQwMDAwNzhDCis6MTAyMzYwMDAwMjQwMzAyMThDQzIwMDAwQUM2MjAwMDAyNDYzMDAwNEYzCis6MTAyMzcwMDAwMDY0MTAyQjE0NDBGRkZCMjRDNjAwMDQ4RkEyMDAxQzM1Cis6MTAyMzgwMDAwMDUwMTAyM0FGQTIwMDFDOEU2MjAwMDAwMDUwMTAyMUVDCis6MTAyMzkwMDAxMDAwMDAwQUFFNjIwMDAwMDI0MDg4MjEyNDA1MzEwMENFCis6MTAyM0EwMDBBRkIwMDAxMEFGQTMwMDE0OEZBNzAwMTgwMjIwMzAyMTk3Cis6MTAyM0IwMDAyNDAyMDAyRDBDMDAyQjNCQTA4MjAwMDAzQzAxMDAwMUY4Cis6MTAyM0MwMDBBQzMxNkVCMDNDMDMwMDAxOEM2MzZFQjAyNDAyMDQwMDlCCis6MTAyM0QwMDAwMDYwRjgwOUFGODIwMDcwOEZCRjAwMzA4RkIzMDAyQzBGCis6MTAyM0UwMDA4RkIyMDAyODhGQjEwMDI0OEZCMDAwMjAwM0UwMDAwOEQ2Cis6MTAyM0YwMDAyN0JEMDAzODAwMDAwMDAwMDAwMDAwMDA4RjgyMDA0MDcwCis6MTAyNDAwMDAzQzAzRjAwMDAwNDMxMDI0M0MwMzYwMDAxNDQzMDAwNjJBCis6MTAyNDEwMDAwMDAwMDAwMDhGODIwMDUwMjQwM0ZGODAwMDQzMTAyNDNFCis6MTAyNDIwMDAzNDQyMDA1NUFGODIwMDUwOEY4MjAwNTQyNDQyMDNFOEFBCis6MTAyNDMwMDBBRjgyMDA1ODI0MDIwMUY0QUY0MjAwRTAyNDAyMDAwNEZECis6MTAyNDQwMDBBRjQyMDBFODI0MDIwMDAyQUY0MDAxQjBBRjQwMDBFNDE4Cis6MTAyNDUwMDBBRjQyMDBEQ0FGNDAwMEQ4QUY0MDAwRDQwM0UwMDAwODNBCis6MTAyNDYwMDBBRjQwMDBEMDhGODIwMDU0MjQ0MjAwMDUwM0UwMDAwOEYyCis6MTAyNDcwMDBBRjgyMDA3ODI3QkRGRkU4QUZCRjAwMTA4RjgyMDA1NDA1Cis6MTAyNDgwMDAyNDQyMDNFOEFGODIwMDU4M0MwMjA4MDAwMkMyMTAyNDM0Cis6MTAyNDkwMDAxMDQwMDAwNDNDMDJGN0ZGMzQ0MkZGRkYwMkMyQjAyNEE4Cis6MTAyNEEwMDAzNjk0MDA0MDNDMDIwMDAxOEM0MjZEQTgxMDQwMDAxNzk5Cis6MTAyNEIwMDAzQzAyMDIwMDNDMDMwMDAxOEM2MzZGMUMxMDYwMDAxNjlDCis6MTAyNEMwMDAwMjgyQTAyNTNDMDIwMDAxOEM0MjZFNDQxNDQwMDAxMjlFCis6MTAyNEQwMDAzQzAyMDIwMDNDMDIwMDAxOEM0MjZEOTQzMDQyMDAwMzM5Cis6MTAyNEUwMDAxNDQwMDAwRDNDMDIwMjAwOEY4MzAyMjQzQzAyMDAwMkQzCis6MTAyNEYwMDA4QzQyOEZFQzEwNjIwMDA4M0MwMjAyMDAwQzAwM0RBRkUxCis6MTAyNTAwMDAwMDAwMDAwMDEwMDAwMDA0M0MwMjAyMDAwQzAwNDE5Njk0Cis6MTAyNTEwMDAwMDAwMDAwMDNDMDIwMjAwMDJDMjEwMjQxMDQwMDAwMzMwCis6MTAyNTIwMDAwMDAwMDAwMDBDMDAxRjRCMDAwMDAwMDA4RjQyMDBEODhDCis6MTAyNTMwMDA4RjQzMDBEQzI0NDIwMDAxQUY0MjAwRDgwMDQzMTAyQjNGCis6MTAyNTQwMDAxNDQwMDAwMzAwMDAwMDAwQUY0MDAwRDgzNjk0MDA4MDIzCis6MTAyNTUwMDA4QzAzMDIzODEwNjAwMDBDMDAwMDAwMDA4RjQyMDFCMEI0Cis6MTAyNTYwMDAyNDQyMDNFOEFGNDIwMUIwMDA0MzEwMkIxNDQwMDAwNkEwCis6MTAyNTcwMDAwMDAwMDAwMDkzNDIwNUM1MTQ0MDAwMDMwMDAwMDAwMDY1Cis6MTAyNTgwMDAwQzAwMURBMDAwMDAwMDAwOEZCRjAwMTAwM0UwMDAwODM5Cis6MTAyNTkwMDAyN0JEMDAxODAzRTAwMDA4MDAwMDAwMDAyN0JERkZEODk5Cis6MTAyNUEwMDBBRkJGMDAyMDhGNDMwMDJDOEY0MjAwMzgxMDYyMDA1OUNCCis6MTAyNUIwMDAwMDAwMDAwMDNDMDIwMDAxMDA1NzEwMjE5MDQyNDBGMDUyCis6MTAyNUMwMDAxMDQwMDAyNjI0MDcwMDA4OEY0NDAxNzA4RjQ1MDE3NEQ1Cis6MTAyNUQwMDA4RjQ4MDAwQzhGODYwMTIwMjQwMjAwMjBBRkEyMDAxMDNCCis6MTAyNUUwMDBBRkEzMDAxNEFGQTgwMDE4OEY0MjAxMEMwMDQwRjgwOUY3Cis6MTAyNUYwMDAyNEM2MDAxQzE0NDAwMDExMjQwMjAwMDEzQzAxMDAwMTBCCis6MTAyNjAwMDAwMDM3MDgyMUEwMjI0MEYwOEY4MjAxMjRBRkEyMDAxMEUxCis6MTAyNjEwMDA4RjgyMDEyODNDMDQwMDAxMjQ4NDYxMjhBRkEyMDAxNEE5Cis6MTAyNjIwMDA4RjQ2MDAyQzhGODcwMTIwM0MwNTAwMDkwQzAwMkIzQkI2Cis6MTAyNjMwMDAzNEE1MDkwMDEwMDAwMDVDMDAwMDAwMDA4RjQyMDMwMDc4Cis6MTAyNjQwMDAyNDQyMDAwMUFGNDIwMzAwOEY0MjAzMDA4RjQyMDAyQzVFCis6MTAyNjUwMDBBMzQwMDVDMTEwMDAwMDI3QUY0MjAwMzg4RjQ0MDE3MDJECis6MTAyNjYwMDA4RjQ1MDE3NDhGNDMwMDJDOEY0ODAwMEM4Rjg2MDEyMDBBCis6MTAyNjcwMDAyNDAyMDA4MEFGQTIwMDEwQUZBMzAwMTRBRkE4MDAxODdFCis6MTAyNjgwMDA4RjQyMDEwQzAwNDBGODA5MjRDNjAwMUMxNDQwMDAxMUMwCis6MTAyNjkwMDAyNDAyMDAwMTNDMDEwMDAxMDAzNzA4MjFBMDIyNDBGMTgyCis6MTAyNkEwMDA4RjgyMDEyNEFGQTIwMDEwOEY4MjAxMjgzQzA0MDAwMTE4Cis6MTAyNkIwMDAyNDg0NjEzNEFGQTIwMDE0OEY0NjAwMkM4Rjg3MDEyMDQwCis6MTAyNkMwMDAzQzA1MDAwOTBDMDAyQjNCMzRBNTExMDAxMDAwMDAzNjFFCis6MTAyNkQwMDAwMDAwMDAwMDhGNDIwMzAwOEY0MzAwMkMyNDQyMDAwMUMxCis6MTAyNkUwMDBBRjQyMDMwMDhGNDIwMzAwMjQwMjAwMDFBMzQyMDVDMTUwCis6MTAyNkYwMDBBRjQzMDAzODNDMDEwMDAxMDAzNzA4MjFBMDIwNDBGMTIxCis6MTAyNzAwMDAzQzAxMDAwMTAwMzcwODIxQTAyMDQwRjAxMDAwMDAyNjA1Cis6MTAyNzEwMDBBRjQwMDAzNDkzNDIwNUMxMTA0MDAwMUQwMDAwMDAwMDhFCis6MTAyNzIwMDBBMzQwMDVDMThGODIwMDQwMzA0MjAwMDExNDQwMDAwOEUwCis6MTAyNzMwMDAwMDAwMjAyMThDMDMwMTA0MjQwMjAwMDE1MDYyMDAwNUU2Cis6MTAyNzQwMDAyNDA0MDAwMThDMDIwMjY0MTA0MDAwMDMwMDgwMTAyMTY4Cis6MTAyNzUwMDAyNDA0MDAwMTAwODAxMDIxMTA0MDAwMDYwMDAwMDAwMDQ5Cis6MTAyNzYwMDA4RjQyMDMwQzI0NDIwMDAxQUY0MjAzMEMxMDAwMDAwODBBCis6MTAyNzcwMDA4RjQyMDMwQzhGODIwMDQ0MzQ0MjAwMDRBRjgyMDA0NDM1Cis6MTAyNzgwMDA4RjQyMDMwODI0NDIwMDAxQUY0MjAzMDg4RjQyMDMwODJFCis6MTAyNzkwMDAzQzAxMDAwMTAwMzcwODIxQTAyMDQwRjAzQzAxMDAwMTZECis6MTAyN0EwMDAwMDM3MDgyMUEwMjA0MEYxOEY0MjAwMDAxMDQwMDAwN0IwCis6MTAyN0IwMDAwMDAwMDAwMEFGODAwMDRDOEY4MjAwNEMxMDQwRkZGREY1Cis6MTAyN0MwMDAwMDAwMDAwMDEwMDAwMDA1MDAwMDAwMDBBRjgwMDA0ODdECis6MTAyN0QwMDA4RjgyMDA0ODEwNDBGRkZEMDAwMDAwMDA4RjgyMDA2MEUzCis6MTAyN0UwMDAzQzAzRkY3RjM0NjNGRkZGMDA0MzEwMjRBRjgyMDA2MDhGCis6MTAyN0YwMDA4RjQyMDAwMDEwNDAwMDAzMDAwMDAwMDAxMDAwMDAwMkEzCis6MTAyODAwMDBBRjgwMDA0Q0FGODAwMDQ4OEZCRjAwMjAwM0UwMDAwODdECis6MTAyODEwMDAyN0JEMDAyODAzRTAwMDA4MDAwMDAwMDAyN0JERkZEODA2Cis6MTAyODIwMDBBRkJGMDAyMDhGNDMwMDQ0OEY0MjAwN0MxMDYyMDAyOTFDCis6MTAyODMwMDAyNDA3MDAwODhGNDQwMTY4OEY0NTAxNkM4RjQ4MDAwQzA1Cis6MTAyODQwMDA4Rjg2MDEyMDI0MDIwMDQwQUZBMjAwMTBBRkEzMDAxNDI1Cis6MTAyODUwMDBBRkE4MDAxODhGNDIwMTBDMDA0MEY4MDkyNEM2MDAxQ0U0Cis6MTAyODYwMDAxNDQwMDAxMTI0MDIwMDAxM0MwMTAwMDEwMDM3MDgyMTNFCis6MTAyODcwMDBBMDIyNDBGMjhGODIwMTI0QUZBMjAwMTA4RjgyMDEyODkzCis6MTAyODgwMDAzQzA0MDAwMTI0ODQ2MTNDQUZBMjAwMTQ4RjQ2MDA0NDQ0Cis6MTAyODkwMDA4Rjg3MDEyMDNDMDUwMDA5MEMwMDJCM0IzNEE1MTMwMDU5Cis6MTAyOEEwMDAxMDAwMDAwRjAwMDAwMDAwOEY0MjAzMDQyNDQyMDAwMUNBCis6MTAyOEIwMDBBRjQyMDMwNDhGNDIwMzA0OEY0MjAwNDRBRjQyMDA3Q0M2Cis6MTAyOEMwMDAzQzAxMDAwMTAwMzcwODIxQTAyMDQwRjIxMDAwMDAwNDY0Cis6MTAyOEQwMDBBRjQwMDA3ODNDMDEwMDAxMDAzNzA4MjFBMDIwNDBGMjAxCis6MTAyOEUwMDA4RjQyMDAwMDEwNDAwMDA3MDAwMDAwMDBBRjgwMDA0QzQ1Cis6MTAyOEYwMDA4RjgyMDA0QzEwNDBGRkZEMDAwMDAwMDAxMDAwMDAwNTFBCis6MTAyOTAwMDAwMDAwMDAwMEFGODAwMDQ4OEY4MjAwNDgxMDQwRkZGREFCCis6MTAyOTEwMDAwMDAwMDAwMDhGODIwMDYwM0MwM0ZFRkYzNDYzRkZGRjc1Cis6MTAyOTIwMDAwMDQzMTAyNEFGODIwMDYwOEY0MjAwMDAxMDQwMDAwMzdCCis6MTAyOTMwMDAwMDAwMDAwMDEwMDAwMDAyQUY4MDAwNENBRjgwMDA0ODkzCis6MTAyOTQwMDA4RkJGMDAyMDAzRTAwMDA4MjdCRDAwMjgwM0UwMDAwODM3Cis6MTAyOTUwMDAwMDAwMDAwMDNDMDIwMDAxOEM0MjZEQTgyN0JERkZBOENBCis6MTAyOTYwMDBBRkJGMDA1MEFGQkUwMDRDQUZCNTAwNDhBRkIzMDA0NDlFCis6MTAyOTcwMDBBRkIyMDA0MEFGQjEwMDNDQUZCMDAwMzgxMDQwMDBENTVFCis6MTAyOTgwMDA4RjkwMDA0NDhGNDIwMEQwMjQ0MzAwMDEyODQyMDAwQjY2Cis6MTAyOTkwMDAxNDQwMDBFNEFGNDMwMEQwOEY0MjAwMDQzMDQyMDAwMkY0Cis6MTAyOUEwMDAxNDQwMDA5Q0FGNDAwMEQwOEY0MjAwMDQzQzAzMDAwMTYzCis6MTAyOUIwMDA4QzYzNkQ5ODM0NDIwMDAyQUY0MjAwMDQyNDAyMDAwMThGCis6MTAyOUMwMDAxNDYyMDAwMzNDMDIwNjAwMTAwMDAwMDIzNDQyMzAwMDkyCis6MTAyOUQwMDAzNDQyMTAwMEFGQTIwMDIwOEY0QTAwMThBRkFBMDAzNDgyCis6MTAyOUUwMDAyN0FBMDAyMEFGQUEwMDJDOEZBQTAwMzQyNDAyMDBGRkRGCis6MTAyOUYwMDAxMTQyMDAwMjAwMDAxODIxMjU0MzAwMDE4QzAyMDIyODI4Cis6MTAyQTAwMDAwMDYwOTgyMTE2NjIwMDBFM0MwNTAwMDk4RjQyMDMzQ0NECis6MTAyQTEwMDAyNDQyMDAwMUFGNDIwMzNDOEY0MjAzM0M4QzAyMDIyODU3Cis6MTAyQTIwMDA4RkE3MDAzNDNDMDQwMDAxMjQ4NDYxMENBRkEwMDAxNDgzCis6MTAyQTMwMDBBRkEyMDAxMDhGQTYwMDIwMTAwMDAwNzAzNEE1MDUwMDgyCis6MTAyQTQwMDA4RkFBMDAzNDAwMEEzOEMwMDBGNzEwMjE4RkEzMDAyMDlECis6MTAyQTUwMDA4RkE0MDAyNEFDNDMwNEMwQUM0NDA0QzQ4RjgzMDA1NDRFCis6MTAyQTYwMDA4RjgyMDA1NDI0NzEwM0U4MDIyMjEwMjMyQzQyMDNFOUQwCis6MTAyQTcwMDAxMDQwMDAxQjAwMDBBODIxMDBFMDkwMjEyNjVFMDRDMDQ5Cis6MTAyQTgwMDA4RjQ0MDE3ODhGNDUwMTdDMDI0MDE4MjEyNDBBMDAwNEZDCis6MTAyQTkwMDBBRkFBMDAxMEFGQjMwMDE0OEY0ODAwMEMwMDAwMTAyMTQzCis6MTAyQUEwMDAwMkZFMzAyMUFGQTgwMDE4OEY0ODAxMEMyNDA3MDAwODRGCis6MTAyQUIwMDAwMEEzMjgyMTAwQTM0ODJCMDA4MjIwMjEwMTAwRjgwOTRGCis6MTAyQUMwMDAwMDg5MjAyMTU0NDAwMDA2MjQxNTAwMDE4RjgyMDA1NDAzCis6MTAyQUQwMDAwMjIyMTAyMzJDNDIwM0U5MTQ0MEZGRTkwMDAwMDAwMDA5Cis6MTAyQUUwMDAzMkEyMDBGRjU0NDAwMDE4QUY1MzAwMTg4RjQyMDM3ODAxCis6MTAyQUYwMDAyNDQyMDAwMUFGNDIwMzc4OEY0MjAzNzg4RjgyMDEyMDg1Cis6MTAyQjAwMDA4RkFBMDAyQzhGQTcwMDM0QUZBMjAwMTA4RjgyMDEyNDVGCis6MTAyQjEwMDAzQzA0MDAwMTI0ODQ2MTE4QUZBMjAwMTQ4RDQ2MDAwMDFCCis6MTAyQjIwMDAzQzA1MDAwOTEwMDAwMDM1MzRBNTA2MDA4RjQyMDMwODVCCis6MTAyQjMwMDAyNDE1MDAwMTI0NDIwMDAxQUY0MjAzMDg4RjQyMDMwODFDCis6MTAyQjQwMDAxMDAwMDAxRTMyQTIwMEZGOEY4MzAwNTQ4RjgyMDA1NEI5Cis6MTAyQjUwMDAyNDcxMDNFODAyMjIxMDIzMkM0MjAzRTkxMDQwMDAxNkRFCis6MTAyQjYwMDAwMDAwQTgyMTNDMUUwMDIwMjQxMjAwMTA4RjQyMDAwQ0ZGCis6MTAyQjcwMDA4RjQ0MDE2MDhGNDUwMTY0OEY4NjAxMjBBRkIyMDAxMDQxCis6MTAyQjgwMDBBRkIzMDAxNDAwNUUxMDI1QUZBMjAwMTg4RjQyMDEwQ0Y1Cis6MTAyQjkwMDAyNDA3MDAwODAwNDBGODA5MjRDNjAwMUMxNDQwRkZFMzg1Cis6MTAyQkEwMDAwMDAwMDAwMDhGODIwMDU0MDIyMjEwMjMyQzQyMDNFOTBGCis6MTAyQkIwMDAxNDQwRkZFRTAwMDAwMDAwMzJBMjAwRkYxNDQwMDAxMTlDCis6MTAyQkMwMDAzQzA1MDAwOThGNDIwMzc4MjQ0MjAwMDFBRjQyMDM3ODlDCis6MTAyQkQwMDA4RjQyMDM3ODhGODIwMTIwOEZBQTAwMkM4RkE3MDAzNEE4Cis6MTAyQkUwMDBBRkEyMDAxMDhGODIwMTI0M0MwNDAwMDEyNDg0NjEyMEU0Cis6MTAyQkYwMDBBRkEyMDAxNDhENDYwMDAwMzRBNTA3MDAwQzAwMkIzQjRCCis6MTAyQzAwMDAwMDAwMDAwMDhGNDIwMkVDMjQ0MjAwMDFBRjQyMDJFQ0JGCis6MTAyQzEwMDA4RjQyMDJFQzhGNDIwMDA0MzA0MjAwMDE1MDQwMDAyOUY0Cis6MTAyQzIwMDAzNjEwMDA0MDNDMDIwNDAwMDJDMjEwMjQxMDQwMDAxMzgxCis6MTAyQzMwMDAyNDA0RkZERjhGNDIwMjUwOEY0MzAyNTQ4RjQ0MDFCNEJCCis6MTAyQzQwMDAxNDY0MDAwNjM2MTAwMDQwOEY0MjAyNzA4RjQzMDI3NEY1Cis6MTAyQzUwMDA4RjQ0MDFCODEwNjQwMDA3MjQwMkZGREY4RjQyMDI1MDQ2Cis6MTAyQzYwMDA4RjQzMDI1NDhGNDQwMjcwOEY0NTAyNzQxMDAwMDAxMjhCCis6MTAyQzcwMDAzQTEwMDAyMDEwMDAwMDJCMDIwMjgwMjQ4RjQyMDI1MEU0Cis6MTAyQzgwMDA4RjQzMDI1NDhGNDUwMUI0MTQ2NTAwMDYwMjA0ODAyNDZBCis6MTAyQzkwMDA4RjQyMDI3MDhGNDMwMjc0OEY0NDAxQjg1MDY0MDAyMTQ4Cis6MTAyQ0EwMDAzNjEwMDA0MDhGNDIwMjUwOEY0MzAyNTQ4RjQ0MDI3MDBFCis6MTAyQ0IwMDA4RjQ1MDI3NDNBMTAwMDQwQUY0MzAxQjQxMDAwMDAxOTcwCis6MTAyQ0MwMDBBRjQ1MDFCODhGNDIwMEQ0MjQ0MzAwMDExMDAwMDAxMTI5Cis6MTAyQ0QwMDAyODQyMDAzMzhGNDIwMDA0MzA0MjAwMDExMDQwMDAwOUI2Cis6MTAyQ0UwMDAzQzAyMDQwMDAyQzIxMDI0MTA0MDAwMDQyNDAyRkZERjUyCis6MTAyQ0YwMDAwMjAyODAyNDEwMDAwMDBCMzYxMDAwNDAxMDAwMDAwOTcyCis6MTAyRDAwMDAzNjEwMDA2MDhGNDIwMEQ0MzYxMDAwNDAyNDQzMDAwMThBCis6MTAyRDEwMDAyODQyMDFGNTE0NDAwMDAzQUY0MzAwRDRBRjQwMDBENDczCis6MTAyRDIwMDAzQTEwMDAyMEFGOTAwMDQ0MjQwMkZGN0YwMjgyQTAyNENBCis6MTAyRDMwMDA4RkJGMDA1MDhGQkUwMDRDOEZCNTAwNDg4RkIzMDA0NDRBCis6MTAyRDQwMDA4RkIyMDA0MDhGQjEwMDNDOEZCMDAwMzgwM0UwMDAwODI0Cis6MTAyRDUwMDAyN0JEMDA1ODAzRTAwMDA4MDAwMDAwMDAzQzAyMDAwMTBECis6MTAyRDYwMDA4QzQyNkRBODI3QkRGRkIwQUZCRjAwNDhBRkJFMDA0NDg2Cis6MTAyRDcwMDBBRkI1MDA0MEFGQjMwMDNDQUZCMjAwMzhBRkIxMDAzNEU0Cis6MTAyRDgwMDAxMDQwMDBDN0FGQjAwMDMwOEY0MjAwRDAyNDQzMDAwMTk0Cis6MTAyRDkwMDAyODQyMDAwQjE0NDAwMERBQUY0MzAwRDA4RjQyMDAwNEY5Cis6MTAyREEwMDAzMDQyMDAwMjE0NDAwMDk3QUY0MDAwRDA4RjQyMDAwNDMwCis6MTAyREIwMDAzQzAzMDAwMThDNjM2RDk4MzQ0MjAwMDJBRjQyMDAwNDcyCis6MTAyREMwMDAyNDAyMDAwMTE0NjIwMDAzM0MwMjA2MDAxMDAwMDAwMjBECis6MTAyREQwMDAzNDQyMzAwMDM0NDIxMDAwQUZBMjAwMjAwMDAwMTgyMTFECis6MTAyREUwMDA4RjVFMDAxODI3QUEwMDIwMjQwMjAwRkYxM0MyMDAwMkYxCis6MTAyREYwMDBBRkFBMDAyQzI3QzMwMDAxOEMwMjAyMjgwMDYwOTAyMTlBCis6MTAyRTAwMDAxNjQyMDAwRTAwMUUzOEMwOEY0MjAzM0MyNDQyMDAwMUNGCis6MTAyRTEwMDBBRjQyMDMzQzhGNDIwMzNDOEMwMjAyMjgzQzA0MDAwMTc5Cis6MTAyRTIwMDAyNDg0NjEwQzNDMDUwMDA5QUZBMDAwMTRBRkEyMDAxMDdGCis6MTAyRTMwMDA4RkE2MDAyMDEwMDAwMDZEMzRBNTA1MDAwMEY3MTAyMUJBCis6MTAyRTQwMDA4RkEzMDAyMDhGQTQwMDI0QUM0MzA0QzBBQzQ0MDRDNDZFCis6MTAyRTUwMDA4RjgzMDA1NDhGODIwMDU0MjQ3MDAzRTgwMjAyMTAyM0YxCis6MTAyRTYwMDAyQzQyMDNFOTEwNDAwMDFCMDAwMDk4MjEwMEUwODgyMTVCCis6MTAyRTcwMDAyNjM1MDRDMDhGNDQwMTc4OEY0NTAxN0MwMjIwMTgyMTNCCis6MTAyRTgwMDAyNDBBMDAwNEFGQUEwMDEwQUZCMjAwMTQ4RjQ4MDAwQzRGCis6MTAyRTkwMDAwMDAwMTAyMTAyRjUzMDIxQUZBODAwMTg4RjQ4MDEwQzY2Cis6MTAyRUEwMDAyNDA3MDAwODAwQTMyODIxMDBBMzQ4MkIwMDgyMjAyMTJBCis6MTAyRUIwMDAwMTAwRjgwOTAwODkyMDIxNTQ0MDAwMDYyNDEzMDAwMTc0Cis6MTAyRUMwMDA4RjgyMDA1NDAyMDIxMDIzMkM0MjAzRTkxNDQwRkZFOUQwCis6MTAyRUQwMDAwMDAwMDAwMDMyNjIwMEZGNTQ0MDAwMTdBRjUyMDAxODlCCis6MTAyRUUwMDA4RjQyMDM3ODI0NDIwMDAxQUY0MjAzNzg4RjQyMDM3ODc3Cis6MTAyRUYwMDA4RjgyMDEyMDhGQUEwMDJDQUZBMjAwMTA4RjgyMDEyNEE0Cis6MTAyRjAwMDAzQzA0MDAwMTI0ODQ2MTE4M0MwNTAwMDlBRkEyMDAxNEIwCis6MTAyRjEwMDA4RDQ2MDAwMDEwMDAwMDM1MzRBNTA2MDA4RjQyMDMwOERFCis6MTAyRjIwMDAyNDEzMDAwMTI0NDIwMDAxQUY0MjAzMDg4RjQyMDMwODJBCis6MTAyRjMwMDAxMDAwMDAxRTMyNjIwMEZGOEY4MzAwNTQ4RjgyMDA1NDA1Cis6MTAyRjQwMDAyNDcwMDNFODAyMDIxMDIzMkM0MjAzRTkxMDQwMDAxNjBCCis6MTAyRjUwMDAwMDAwOTgyMTNDMTUwMDIwMjQxMTAwMTA4RjQyMDAwQzI1Cis6MTAyRjYwMDA4RjQ0MDE2MDhGNDUwMTY0OEY4NjAxMjBBRkIxMDAxMDRFCis6MTAyRjcwMDBBRkIyMDAxNDAwNTUxMDI1QUZBMjAwMTg4RjQyMDEwQzBCCis6MTAyRjgwMDAyNDA3MDAwODAwNDBGODA5MjRDNjAwMUMxNDQwRkZFMzkxCis6MTAyRjkwMDAwMDAwMDAwMDhGODIwMDU0MDIwMjEwMjMyQzQyMDNFOTNCCis6MTAyRkEwMDAxNDQwRkZFRTAwMDAwMDAwMzI2MjAwRkYxNDQwMDAxMUU4Cis6MTAyRkIwMDAwMDAwMDAwMDhGNDIwMzc4MjQ0MjAwMDFBRjQyMDM3OEYyCis6MTAyRkMwMDA4RjQyMDM3ODhGODIwMTIwOEZBQTAwMkNBRkEyMDAxMEJECis6MTAyRkQwMDA4RjgyMDEyNDNDMDQwMDAxMjQ4NDYxMjAzQzA1MDAwOTA3Cis6MTAyRkUwMDBBRkEyMDAxNDhENDYwMDAwMzRBNTA3MDAwQzAwMkIzQjU3Cis6MTAyRkYwMDAwM0MwMzgyMThGNDIwMkVDMjQ0MjAwMDFBRjQyMDJFQ0IwCis6MTAzMDAwMDA4RjQyMDJFQzhGNDIwMDA0MzA0MjAwMDExMDQwMDAxODUxCis6MTAzMDEwMDAyNDA0MDAwMThGNDIwMjUwOEY0MzAyNTQ4RjQ1MDFCNEIzCis6MTAzMDIwMDAzQzAxMDAwMTE0NjUwMDA2QTAyNDZDRjE4RjQyMDI3MDdGCis6MTAzMDMwMDA4RjQzMDI3NDhGNDQwMUI4MTA2NDAwMjEwMDAwMDAwMDI3Cis6MTAzMDQwMDA4RjQyMDI1MDhGNDMwMjU0M0MwNDAwMDE5MDg0NkNGMDg0Cis6MTAzMDUwMDA4RjQ2MDI3MDhGNDcwMjc0Mzg4NDAwMDFBRjQzMDFCNDc5Cis6MTAzMDYwMDBBRjQ3MDFCODNDMDEwMDAxMTAwMDAwMjVBMDI0NkNGMDFFCis6MTAzMDcwMDA4RjQyMDBENDNDMDEwMDAxQTAyMDZDRjAyNDQzMDAwMUU5Cis6MTAzMDgwMDAyODQyMDAzMzE0NDAwMDFFQUY0MzAwRDQzQzAyMDAwMTJDCis6MTAzMDkwMDA5MDQyNkNGMUFGNDAwMEQ0MTAwMDAwMTczODQyMDAwMTlDCis6MTAzMEEwMDA4RjQyMDAwNDMwNDIwMDAxMTA0MDAwMDgwMDAwMDAwMDgwCis6MTAzMEIwMDAwQzAwNTY1QTAwMDAyMDIxM0MwMTAwMDFBMDIwNkNGMUI4Cis6MTAzMEMwMDAzQzAxMDAwMTEwMDAwMDBFQTAyMDZDRjA4RjQyMDBENEUzCis6MTAzMEQwMDAzQzAxMDAwMUEwMjA2Q0YwMjQ0MzAwMDEyODQyMDFGNUNFCis6MTAzMEUwMDAxNDQwMDAwN0FGNDMwMEQ0M0MwMjAwMDE5MDQyNkNGMTUxCis6MTAzMEYwMDBBRjQwMDBENDAwNDIxMDI2M0MwMTAwMDFBMDIyNkNGMTM4Cis6MTAzMTAwMDAzQzAzMDAwMThDNjM2RDk4MjQwMjAwMDIxNDYyMDAwQ0UxCis6MTAzMTEwMDAzQzAzMDAwMjNDMDMwMDAxOTA2MzZDRjEyNDAyMDAwMUI3Cis6MTAzMTIwMDA1NDYyMDAxRjAwMDAyMDIxM0MwMjAwMDE5MDQyNkNGMDFDCis6MTAzMTMwMDAxNDQzMDAxQjI0MDQwMDA1MTAwMDAwMTkyNDA0MDAwNjk5Cis6MTAzMTQwMDAzQzAyMDAwMjhDNDI4RkY0MDA0MzEwMjQxMDQwMDAwQjFDCis6MTAzMTUwMDAyNDAyMDAwMTNDMDMwMDAxOTA2MzZDRjE1NDYyMDAxMEYyCis6MTAzMTYwMDAwMDAwMjAyMTNDMDIwMDAxOTA0MjZDRjAxNDQzMDAwQzRFCis6MTAzMTcwMDAyNDA0MDAwMzEwMDAwMDBBMjQwNDAwMDQzQzAzMDAwMTlFCis6MTAzMTgwMDA5MDYzNkNGMTE0NjIwMDA2MDAwMDIwMjEzQzAyMDAwMUYzCis6MTAzMTkwMDA5MDQyNkNGMDI0MDQwMDAxNTA0NDAwMDEyNDA0MDAwMjE5Cis6MTAzMUEwMDAwQzAwNTY1QTAwMDAwMDAwMjQwMkZGN0YwMjgyQTAyNDc3Cis6MTAzMUIwMDA4RkJGMDA0ODhGQkUwMDQ0OEZCNTAwNDA4RkIzMDAzQ0U2Cis6MTAzMUMwMDA4RkIyMDAzODhGQjEwMDM0OEZCMDAwMzAwM0UwMDAwOEI4Cis6MTAzMUQwMDAyN0JEMDA1MDAzRTAwMDA4MDAwMDAwMDAzQzAyMDAwMTkxCis6MTAzMUUwMDA4QzQyNkRBODI3QkRGRkIwQUZCRjAwNDhBRkJFMDA0NDAyCis6MTAzMUYwMDBBRkI1MDA0MEFGQjMwMDNDQUZCMjAwMzhBRkIxMDAzNDYwCis6MTAzMjAwMDAxMDQwMDBERUFGQjAwMDMwOEY0MjAwRDAzQzA0MDAwMTFGCis6MTAzMjEwMDA4Qzg0NkQ5ODI0NDMwMDAxMjg0MjAwMEJBRjQ0MDBFOEUxCis6MTAzMjIwMDAxNDQwMDBGRUFGNDMwMEQwOEY0MjAwMDQzMDQyMDAwMjQxCis6MTAzMjMwMDAxNDQwMDA5NUFGNDAwMEQwOEY0MjAwMDQzNDQyMDAwMjk5Cis6MTAzMjQwMDBBRjQyMDAwNDI0MDIwMDAxMTQ4MjAwMDMzQzAyMDYwMDg1Cis6MTAzMjUwMDAxMDAwMDAwMjM0NDIzMDAwMzQ0MjEwMDBBRkEyMDAyMEJGCis6MTAzMjYwMDAwMDAwMTgyMThGNUUwMDE4MjdBQTAwMjAyNDAyMDBGRjBBCis6MTAzMjcwMDAxM0MyMDAwMkFGQUEwMDJDMjdDMzAwMDE4QzAyMDIyODRGCis6MTAzMjgwMDAwMDYwOTAyMTE2NDIwMDBFMDAxRTM4QzA4RjQyMDMzQ0ExCis6MTAzMjkwMDAyNDQyMDAwMUFGNDIwMzNDOEY0MjAzM0M4QzAyMDIyOENGCis6MTAzMkEwMDAzQzA0MDAwMTI0ODQ2MTBDM0MwNTAwMDlBRkEwMDAxNDFCCis6MTAzMkIwMDBBRkEyMDAxMDhGQTYwMDIwMTAwMDAwNkQzNEE1MDUwMEZECis6MTAzMkMwMDAwMEY3MTAyMThGQTMwMDIwOEZBNDAwMjRBQzQzMDRDMDdBCis6MTAzMkQwMDBBQzQ0MDRDNDhGODMwMDU0OEY4MjAwNTQyNDcwMDNFOEVDCis6MTAzMkUwMDAwMjAyMTAyMzJDNDIwM0U5MTA0MDAwMUIwMDAwOTgyMTI5Cis6MTAzMkYwMDAwMEUwODgyMTI2MzUwNEMwOEY0NDAxNzg4RjQ1MDE3Qzg5Cis6MTAzMzAwMDAwMjIwMTgyMTI0MEEwMDA0QUZBQTAwMTBBRkIyMDAxNDUyCis6MTAzMzEwMDA4RjQ4MDAwQzAwMDAxMDIxMDJGNTMwMjFBRkE4MDAxOEUyCis6MTAzMzIwMDA4RjQ4MDEwQzI0MDcwMDA4MDBBMzI4MjEwMEEzNDgyQjg0Cis6MTAzMzMwMDAwMDgyMjAyMTAxMDBGODA5MDA4OTIwMjE1NDQwMDAwNjY0Cis6MTAzMzQwMDAyNDEzMDAwMThGODIwMDU0MDIwMjEwMjMyQzQyMDNFOTRGCis6MTAzMzUwMDAxNDQwRkZFOTAwMDAwMDAwMzI2MjAwRkY1NDQwMDAxN0YzCis6MTAzMzYwMDBBRjUyMDAxODhGNDIwMzc4MjQ0MjAwMDFBRjQyMDM3ODI1Cis6MTAzMzcwMDA4RjQyMDM3ODhGODIwMTIwOEZBQTAwMkNBRkEyMDAxMDA5Cis6MTAzMzgwMDA4RjgyMDEyNDNDMDQwMDAxMjQ4NDYxMTgzQzA1MDAwOTVCCis6MTAzMzkwMDBBRkEyMDAxNDhENDYwMDAwMTAwMDAwMzUzNEE1MDYwMEQxCis6MTAzM0EwMDA4RjQyMDMwODI0MTMwMDAxMjQ0MjAwMDFBRjQyMDMwOEE2Cis6MTAzM0IwMDA4RjQyMDMwODEwMDAwMDFFMzI2MjAwRkY4RjgzMDA1NDBBCis6MTAzM0MwMDA4RjgyMDA1NDI0NzAwM0U4MDIwMjEwMjMyQzQyMDNFOTg4Cis6MTAzM0QwMDAxMDQwMDAxNjAwMDA5ODIxM0MxNTAwMjAyNDExMDAxMDE4Cis6MTAzM0UwMDA4RjQyMDAwQzhGNDQwMTYwOEY0NTAxNjQ4Rjg2MDEyMDVECis6MTAzM0YwMDBBRkIxMDAxMEFGQjIwMDE0MDA1NTEwMjVBRkEyMDAxOEY1Cis6MTAzNDAwMDA4RjQyMDEwQzI0MDcwMDA4MDA0MEY4MDkyNEM2MDAxQzY0Cis6MTAzNDEwMDAxNDQwRkZFMzAwMDAwMDAwOEY4MjAwNTQwMjAyMTAyM0RBCis6MTAzNDIwMDAyQzQyMDNFOTE0NDBGRkVFMDAwMDAwMDAzMjYyMDBGRjZFCis6MTAzNDMwMDAxNDQwMDAxMTAwMDAwMDAwOEY0MjAzNzgyNDQyMDAwMTc0Cis6MTAzNDQwMDBBRjQyMDM3ODhGNDIwMzc4OEY4MjAxMjA4RkFBMDAyQzJECis6MTAzNDUwMDBBRkEyMDAxMDhGODIwMTI0M0MwNDAwMDEyNDg0NjEyMDZCCis6MTAzNDYwMDAzQzA1MDAwOUFGQTIwMDE0OEQ0NjAwMDAzNEE1MDcwMEZBCis6MTAzNDcwMDAwQzAwMkIzQjAzQzAzODIxOEY0MjAyRUMyNDQyMDAwMTk4Cis6MTAzNDgwMDBBRjQyMDJFQzhGNDIwMkVDOEY0MjAwMDQzMDQyMDAwMTU2Cis6MTAzNDkwMDAxMDQwMDAzMzNDMDIwNDAwMDJDMjEwMjQxMDQwMDAxNzA4Cis6MTAzNEEwMDAwMDAwMDAwMDkzNDIwNUMwOEY0NDAyNTA4RjQ1MDI1NDMzCis6MTAzNEIwMDA4RjQzMDFCNDM0NDIwMDIwMTRBMzAwMDZBMzQyMDVDMDg4Cis6MTAzNEMwMDA4RjQyMDI3MDhGNDMwMjc0OEY0NDAxQjgxMDY0MDAwODY5Cis6MTAzNEQwMDAwMDAwMDAwMDhGNDIwMjUwOEY0MzAyNTQ5MzQ0MDVDMDA1Cis6MTAzNEUwMDA4RjQ2MDI3MDhGNDcwMjc0MTAwMDAwMTYzODg0MDA0MDI3Cis6MTAzNEYwMDA5MzQyMDVDMDEwMDAwMDQ4MzA0MjAwQkY5MzQyMDVDMDBGCis6MTAzNTAwMDA4RjQ0MDI1MDhGNDUwMjU0OEY0MzAxQjQzMDQyMDBCRkI0Cis6MTAzNTEwMDAxNEEzMDAwNkEzNDIwNUMwOEY0MjAyNzA4RjQzMDI3NEI5Cis6MTAzNTIwMDA4RjQ0MDFCODEwNjQwMDBCMDAwMDAwMDA4RjQyMDI1MDZECis6MTAzNTMwMDA4RjQzMDI1NDkzNDQwNUMwOEY0NjAyNzA4RjQ3MDI3NDM0Cis6MTAzNTQwMDAzODg0MDAyMEFGNDMwMUI0QUY0NzAxQjgxMDAwMDAzMzA2Cis6MTAzNTUwMDBBMzQ0MDVDMDkzNDIwNUMwMTAwMDAwMkYzNDQyMDAyMDUwCis6MTAzNTYwMDA5MzQyMDVDMDhGNDMwMEQ0MzQ0MjAwMjBBMzQyMDVDMERCCis6MTAzNTcwMDAyNDYyMDAwMTEwMDAwMDIzMjg2MzAwMzM4RjQyMDBFNDFFCis6MTAzNTgwMDA4RjQzMDBFMDI0NDIwMDAxQUY0MjAwRTQwMDQzMTAyQUQwCis6MTAzNTkwMDAxNDQwMDAwNjI0MDMwMDAxOEY0MjAwRTgxNDQzMDAwMjk3Cis6MTAzNUEwMDBBRjQwMDBFNDI0MDMwMDA0QUY0MzAwRTg4RjQyMDAwNDZFCis6MTAzNUIwMDAzMDQyMDAwMTEwNDAwMDBEM0MwMjA0MDAwMkMyMTAyNDAxCis6MTAzNUMwMDAxMDQwMDAwNzAwMDAwMDAwOTM0MjA1QzAzNDQyMDA0MDU0Cis6MTAzNUQwMDBBMzQyMDVDMDkzNDIwNUMwMTAwMDAwMEYzMDQyMDBERjM3Cis6MTAzNUUwMDA5MzQyMDVDMDEwMDAwMDBDMzQ0MjAwNjA5MzQyMDVDMEI1Cis6MTAzNUYwMDA4RjQzMDBENDM0NDIwMDIwQTM0MjA1QzAyNDYyMDAwMTVFCis6MTAzNjAwMDAyODYzMDBGQjE0NjAwMDA1QUY0MjAwRDQ5MzQyMDVDMDVDCis6MTAzNjEwMDBBRjQwMDBENDM4NDIwMDQwQTM0MjA1QzA5MzQyMDVDMEU5Cis6MTAzNjIwMDA4RjQzMDBFODMwNDIwMDdGQTM0MjA1QzAyNDAyMDAwMTFFCis6MTAzNjMwMDAxNDYyMDAwNTAwMDAwMDAwOTM0NDA1QzAwMDA0MjEwMjRDCis6MTAzNjQwMDAxMDAwMDAwMzM0ODQwMEYwOTM0NDA1QzAzNDg0MDAwRjVDCis6MTAzNjUwMDAwQzAwNTY0MDAwMDAwMDAwMjQwMkZGN0YwMjgyQTAyNERDCis6MTAzNjYwMDA4RkJGMDA0ODhGQkUwMDQ0OEZCNTAwNDA4RkIzMDAzQzMxCis6MTAzNjcwMDA4RkIyMDAzODhGQjEwMDM0OEZCMDAwMzAwM0UwMDAwODAzCis6MTAzNjgwMDAyN0JEMDA1MDAzRTAwMDA4MDAwMDAwMDAyN0JERkZCMDg4Cis6MTAzNjkwMDAyNzQ0MDFDMDI2RTMwMDI4MjQ2NTA0MDAwMDY1MTAyQkEwCis6MTAzNkEwMDBBRkJGMDA0OEFGQkUwMDQ0QUZCNTAwNDBBRkIzMDAzQzcxCis6MTAzNkIwMDBBRkIyMDAzOEFGQjEwMDM0MTA0MDAwMDdBRkIwMDAzMEY3Cis6MTAzNkMwMDA4QzgyMDAwMEFDNjIwMDAwMjQ2MzAwMDQwMDY1MTAyQkIzCis6MTAzNkQwMDAxNDQwRkZGQjI0ODQwMDA0OEMwMjAwODBBRUUyMDA0NDBFCis6MTAzNkUwMDA4QzAyMDBDMEFFRTIwMDQwOEMwMjAwODRBRUUyMDAzMEVBCis6MTAzNkYwMDA4QzAyMDA4NEFFRTIwMjNDOEMwMjAwODhBRUUyMDI0MDAyCis6MTAzNzAwMDA4QzAyMDA4Q0FFRTIwMjQ0OEMwMjAwOTBBRUUyMDI0OEQxCis6MTAzNzEwMDA4QzAyMDA5NEFFRTIwMjRDOEMwMjAwOThBRUUyMDI1MEExCis6MTAzNzIwMDA4QzAyMDA5Q0FFRTIwMjU0OEMwMjAwQTBBRUUyMDI1ODcxCis6MTAzNzMwMDA4QzAyMDBBNEFFRTIwMjVDOEMwMjAwQThBRUUyMDI2MDQxCis6MTAzNzQwMDA4QzAyMDBBQ0FFRTIwMjY0OEMwMjAwQjBBRUUyMDI2ODExCis6MTAzNzUwMDA4QzAyMDBCNEFFRTIwMjZDOEMwMjAwQjhBRUUyMDI3MEUxCis6MTAzNzYwMDA4QzAyMDBCQzI0MDQwMDAxQUVFMjAyNzRBRUUwMDAzNDFFCis6MTAzNzcwMDAwMDA0MTA4MDAwNTcxMDIxOEVFMzAwMzQ4QzQyMDIzQzdDCis6MTAzNzgwMDAyNDg0MDAwMTAwNjIxODIxMkM4MjAwMEZBRUUzMDAzNDczCis6MTAzNzkwMDAxNDQwRkZGODAwMDQxMDgwOEMwMjAwQ0NBRUUyMDA0ODE4Cis6MTAzN0EwMDA4QzAyMDBEMEFFRTIwMDRDOEMwMjAwRTBBRUUyMDFGOEU4Cis6MTAzN0IwMDA4QzAyMDBFNEFFRTIwMUZDOEMwMjAwRThBRUUyMDIwMDAyCis6MTAzN0MwMDA4QzAyMDBFQ0FFRTIwMjA0OEMwMjAwRjBBRUUyMDIwOEQxCis6MTAzN0QwMDA4RUU0MDBDMDhFRTUwMEM0OEMwMjAwRkMwMDQ1MTAyQjc2Cis6MTAzN0UwMDAxMDQwMDAwQjAwMDAwMDAwOEVFMjAwQzA4RUUzMDBDNDE5Cis6MTAzN0YwMDAyNDA0MDAwMTI0MDUwMDAwMDA2NTE4MjEwMDY1MzAyQjE5Cis6MTAzODAwMDAwMDQ0MTAyMTAwNDYxMDIxQUVFMjAwQzBBRUUzMDBDNDI3Cis6MTAzODEwMDA4QzAyMDBGQzhFRTQwMEMwOEVFNTAwQzQyNDA4RkZGRjhCCis6MTAzODIwMDAyNDA5MDAwMDAwNDAxODIxMDAwMDEwMjEwMDg4MjAyNEY1Cis6MTAzODMwMDAwMEE5MjgyNDAwODIyMDI1MDBBMzI4MjVBRUU0MDBDMDhBCis6MTAzODQwMDBBRUU1MDBDNDhFRTQwMEQwOEVFNTAwRDQ4QzAyMDBGNDE2Cis6MTAzODUwMDAwMDQ1MTAyQjEwNDAwMDBCMDAwMDAwMDA4RUUyMDBEMDRECis6MTAzODYwMDA4RUUzMDBENDI0MDQwMDAxMjQwNTAwMDAwMDY1MTgyMTIzCis6MTAzODcwMDAwMDY1MzAyQjAwNDQxMDIxMDA0NjEwMjFBRUUyMDBEMDNDCis6MTAzODgwMDBBRUUzMDBENDhDMDIwMEY0OEVFNDAwRDA4RUU1MDBENEM4Cis6MTAzODkwMDAwMDQwMTgyMTAwMDAxMDIxMDA4ODIwMjQwMEE5MjgyNEJECis6MTAzOEEwMDAwMDgyMjAyNTAwQTMyODI1QUVFNDAwRDBBRUU1MDBENDk4Cis6MTAzOEIwMDA4RUU0MDBDODhFRTUwMENDOEMwMjAwRjgwMDQ1MTAyQjg5Cis6MTAzOEMwMDAxMDQwMDAwQjAwMDAwMDAwOEVFMjAwQzg4RUUzMDBDQzI4Cis6MTAzOEQwMDAyNDA0MDAwMTI0MDUwMDAwMDA2NTE4MjEwMDY1MzAyQjM4Cis6MTAzOEUwMDAwMDQ0MTAyMTAwNDYxMDIxQUVFMjAwQzhBRUUzMDBDQzM3Cis6MTAzOEYwMDA4QzAyMDBGODhFRTQwMEM4OEVFNTAwQ0MwMDQwMTgyMTUwCis6MTAzOTAwMDAwMDAwMTAyMTAwODgyMDI0MDBBOTI4MjQwMDgyMjAyNUZFCis6MTAzOTEwMDAwMEEzMjgyNTI0MDIwMDA4QUVFNDAwQzhBRUU1MDBDQ0QwCis6MTAzOTIwMDBBRkEyMDAxMEFGQTAwMDE0OEY0MjAwMEM4QzA0MDIwODVDCis6MTAzOTMwMDA4QzA1MDIwQ0FGQTIwMDE4OEY0MjAxMEMyNkU2MDAyODZECis6MTAzOTQwMDAwMDQwRjgwOTI0MDcwNDAwMTA0MDAwRjAzQzAyMDQwMDg1Cis6MTAzOTUwMDBBRkEyMDAyMDkzNDIwNUM2MTA0MDAwODkwMDAwMTgyMTQ0Cis6MTAzOTYwMDA4RjVFMDAxODI3QUEwMDIwMjQwMjAwRkYxM0MyMDAwMjY1Cis6MTAzOTcwMDBBRkFBMDAyQzI3QzMwMDAxOEMwMjAyMjgwMDYwOTAyMTBFCis6MTAzOTgwMDAxNjQyMDAwRTAwMUUzOEMwOEY0MjAzM0MyNDQyMDAwMTQ0Cis6MTAzOTkwMDBBRjQyMDMzQzhGNDIwMzNDOEMwMjAyMjgzQzA0MDAwMUVFCis6MTAzOUEwMDAyNDg0NjEwQzNDMDUwMDA5QUZBMDAwMTRBRkEyMDAxMEY0Cis6MTAzOUIwMDA4RkE2MDAyMDEwMDAwMDZCMzRBNTA1MDAwMEY3MTAyMTMxCis6MTAzOUMwMDA4RkEzMDAyMDhGQTQwMDI0QUM0MzA0QzBBQzQ0MDRDNEUzCis6MTAzOUQwMDA4RjgzMDA1NDhGODIwMDU0MjQ3MDAzRTgwMjAyMTAyMzY2Cis6MTAzOUUwMDAyQzQyMDNFOTEwNDAwMDFCMDAwMDk4MjEwMEUwODgyMUQwCis6MTAzOUYwMDAyNjM1MDRDMDhGNDQwMTc4OEY0NTAxN0MwMjIwMTgyMUIwCis6MTAzQTAwMDAyNDBBMDAwNEFGQUEwMDEwQUZCMjAwMTQ4RjQ4MDAwQ0MzCis6MTAzQTEwMDAwMDAwMTAyMTAyRjUzMDIxQUZBODAwMTg4RjQ4MDEwQ0RBCis6MTAzQTIwMDAyNDA3MDAwODAwQTMyODIxMDBBMzQ4MkIwMDgyMjAyMTlFCis6MTAzQTMwMDAwMTAwRjgwOTAwODkyMDIxNTQ0MDAwMDYyNDEzMDAwMUU4Cis6MTAzQTQwMDA4RjgyMDA1NDAyMDIxMDIzMkM0MjAzRTkxNDQwRkZFOTQ0Cis6MTAzQTUwMDAwMDAwMDAwMDMyNjIwMEZGNTQ0MDAwMTdBRjUyMDAxODBGCis6MTAzQTYwMDA4RjQyMDM3ODI0NDIwMDAxQUY0MjAzNzg4RjQyMDM3OEVCCis6MTAzQTcwMDA4RjgyMDEyMDhGQUEwMDJDQUZBMjAwMTA4RjgyMDEyNDE4Cis6MTAzQTgwMDAzQzA0MDAwMTI0ODQ2MTE4M0MwNTAwMDlBRkEyMDAxNDI1Cis6MTAzQTkwMDA4RDQ2MDAwMDEwMDAwMDMzMzRBNTA2MDA4RjQyMDMwODU1Cis6MTAzQUEwMDAyNDEzMDAwMTI0NDIwMDAxQUY0MjAzMDg4RjQyMDMwODlGCis6MTAzQUIwMDAxMDAwMDAxQzMyNjIwMEZGOEY4MzAwNTQ4RjgyMDA1NDdDCis6MTAzQUMwMDAyNDcwMDNFODAyMDIxMDIzMkM0MjAzRTkxMDQwMDAxNDgyCis6MTAzQUQwMDAwMDAwOTgyMTI0MTEwMDEwOEY0MjAwMEM4RjQ0MDE2MEQ3Cis6MTAzQUUwMDA4RjQ1MDE2NDhGODYwMTIwQUZCMTAwMTBBRkIyMDAxNDgyCis6MTAzQUYwMDBBRkEyMDAxODhGNDIwMTBDMjQwNzAwMDgwMDQwRjgwOTBCCis6MTAzQjAwMDAyNEM2MDAxQzE0NDBGRkU1MDAwMDAwMDA4RjgyMDA1NDEyCis6MTAzQjEwMDAwMjAyMTAyMzJDNDIwM0U5MTQ0MEZGRUYwMDAwMDAwMEQyCis6MTAzQjIwMDAzMjYyMDBGRjU0NDAwMDEyMjQwMjAwMDE4RjQyMDM3OEU5Cis6MTAzQjMwMDAyNDQyMDAwMUFGNDIwMzc4OEY0MjAzNzg4RjgyMDEyMDM0Cis6MTAzQjQwMDA4RkFBMDAyQ0FGQTIwMDEwOEY4MjAxMjQzQzA0MDAwMTM4Cis6MTAzQjUwMDAyNDg0NjEyMDNDMDUwMDA5QUZBMjAwMTQ4RDQ2MDAwMEJBCis6MTAzQjYwMDAzNEE1MDcwMDBDMDAyQjNCMDNDMDM4MjEwMDAwMTAyMUI2Cis6MTAzQjcwMDAxNDQwMDA1QjI0MDIwMDAxMTAwMDAwNjUwMDAwMDAwMEZBCis6MTAzQjgwMDA4RjUxMDAxODI0MDIwMEZGMTIyMjAwMDIwMDAwODAyMTQxCis6MTAzQjkwMDAyNjMwMDAwMThDMDIwMjI4MTYwMjAwMEUwMDExMzBDMEVGCis6MTAzQkEwMDA4RjQyMDMzQzI0NDIwMDAxQUY0MjAzM0M4RjQyMDMzQzVFCis6MTAzQkIwMDA4QzAyMDIyODNDMDQwMDAxMjQ4NDYwRjQzQzA1MDAwOUM2Cis6MTAzQkMwMDBBRkEwMDAxNEFGQTIwMDEwOEZBNjAwMjAxMDAwMDAzRjhECis6MTAzQkQwMDAzNEE1MDEwMDAwRDcxMDIxOEZBMzAwMjA4RkE0MDAyNDVBCis6MTAzQkUwMDBBQzQzMDRDMEFDNDQwNEM0MDBDMDE4MjE4RjQ0MDE3ODI1Cis6MTAzQkYwMDA4RjQ1MDE3QzAwMDAxMDIxMjQwNzAwMDRBRkE3MDAxMEFFCis6MTAzQzAwMDBBRkIwMDAxNDhGNDgwMDBDMjRDNjA0QzAwMkU2MzAyMTc3Cis6MTAzQzEwMDBBRkE4MDAxODhGNDgwMTBDMjQwNzAwMDgwMEEzMjgyMTMyCis6MTAzQzIwMDAwMEEzNDgyQjAwODIyMDIxMDEwMEY4MDkwMDg5MjAyMUVGCis6MTAzQzMwMDAxNDQwMDAwQjI0MDcwMDA4OEY4MjAxMjBBRkEyMDAxMDVGCis6MTAzQzQwMDA4RjgyMDEyNDNDMDQwMDAxMjQ4NDYwRkMzQzA1MDAwOUFGCis6MTAzQzUwMDBBRkEyMDAxNDhGQTYwMDIwMTAwMDAwMUMzNEE1MDIwMEEzCis6MTAzQzYwMDA4RjQ0MDE2MDhGNDUwMTY0OEY0MzAwMENBRjUwMDAxOEYyCis6MTAzQzcwMDA4Rjg2MDEyMDI0MDIwMDEwQUZBMjAwMTBBRkIwMDAxNDA0Cis6MTAzQzgwMDBBRkEzMDAxODhGNDIwMTBDMDA0MEY4MDkyNEM2MDAxQ0E1Cis6MTAzQzkwMDA1NDQwMDAxMTI0MDIwMDAxOEY0MjAzNDAyNDQyMDAwMURECis6MTAzQ0EwMDBBRjQyMDM0MDhGNDIwMzQwOEY4MjAxMjBBRkEyMDAxMDM5Cis6MTAzQ0IwMDA4RjgyMDEyNDNDMDQwMDAxMjQ4NDYxMDQzQzA1MDAwOTM2Cis6MTAzQ0MwMDBBRkEyMDAxNDhGQTYwMDIwMzRBNTAzMDAwQzAwMkIzQkVDCis6MTAzQ0QwMDAwMjIwMzgyMTAwMDAxMDIxMTA0MDAwMEQyNDAyMDAwMUI0Cis6MTAzQ0UwMDA4RjQyMDJFOEEzNDAwNUM2QUY0MDAxQjAyNDQyMDAwMTY0Cis6MTAzQ0YwMDBBRjQyMDJFODhGNDIwMkU4OEVFMjAxNTAyNDQyMDAwMTA2Cis6MTAzRDAwMDBBRUUyMDE1MDEwMDAwMDAzOEVFMjAxNTAyNDAyMDAwMUQ3Cis6MTAzRDEwMDBBMzQyMDVDNjhGQkYwMDQ4OEZCRTAwNDQ4RkI1MDA0MDQ4Cis6MTAzRDIwMDA4RkIzMDAzQzhGQjIwMDM4OEZCMTAwMzQ4RkIwMDAzMEI5Cis6MTAzRDMwMDAwM0UwMDAwODI3QkQwMDUwMjdCREZGRDhBRkJGMDAyMDFCCis6MTAzRDQwMDA4RjgyMDBCMDMwNDIwMDA0MTA0MDAwNjgwMDAwMDAwMDg0Cis6MTAzRDUwMDA4RjQzMDEyODhGODIwMTA0MTQ2MjAwMDUwMDAwMDAwMEQ3Cis6MTAzRDYwMDA4RjQzMDEzMDhGODIwMEI0MTA2MjAwMDYwMDAwMDAwMDEzCis6MTAzRDcwMDA4RjgyMDEwNEFGNDIwMTI4OEY4MjAwQjQxMDAwMDA1QkUzCis6MTAzRDgwMDBBRjQyMDEzMDhGODIwMEIwM0MwMzAwODAwMDQzMTAyNDFBCis6MTAzRDkwMDAxMDQwMDAwRDAwMDAwMDAwOEY4MjAxMUMzNDQyMDAwMjIwCis6MTAzREEwMDBBRjgyMDExQzhGODIwMEIwMjQwM0ZGRkIwMDQzMTAyNDZDCis6MTAzREIwMDBBRjgyMDBCMDhGODIwMTFDMjQwM0ZGRkQwMDQzMTAyNDVBCis6MTAzREMwMDAxMDAwMDA0QUFGODIwMTFDOEY0MzAxMjg4RjgyMDEwNDNBCis6MTAzREQwMDAxNDYyMDAwNTAwMDAwMDAwOEY0MzAxMzA4RjgyMDBCNEEwCis6MTAzREUwMDAxMDYyMDAxMDAwMDAwMDAwOEY4MjAxMDRBRjQyMDEyODIxCis6MTAzREYwMDA4RjgyMDBCNDhGNDMwMTI4QUY0MjAxMzBBRkEzMDAxMDdGCis6MTAzRTAwMDA4RjQyMDEzMDNDMDQwMDAxMjQ4NDYxNDRBRkEyMDAxNEJECis6MTAzRTEwMDA4Rjg2MDExQzhGODcwMEIwM0MwNTAwMDUxMDAwMDAzMTIzCis6MTAzRTIwMDAzNEE1MDkwMDhGNDIwMTI4QUZBMjAwMTA4RjQyMDEzMDUzCis6MTAzRTMwMDAzQzA0MDAwMTI0ODQ2MTUwQUZBMjAwMTQ4Rjg2MDExQzUxCis6MTAzRTQwMDA4Rjg3MDBCMDNDMDUwMDA1MEMwMDJCM0IzNEE1MTAwMDBCCis6MTAzRTUwMDA4RjgyMDExQzM0NDIwMDAyQUY4MjAxMUM4RjgzMDEwNDU3Cis6MTAzRTYwMDA4RjgyMDBCMDM0NDIwMDAxQUY4MjAwQjAyNDAyMDAwODBCCis6MTAzRTcwMDBBRjgzMDEwNEFGQTIwMDEwQUZBMDAwMTQ4RjQyMDAwQzZBCis6MTAzRTgwMDA4QzA0MDIwODhDMDUwMjBDQUZBMjAwMTg4RjQyMDEwQ0IyCis6MTAzRTkwMDAyNkU2MDAyODAwNDBGODA5MjQwNzA0MDA4RjgyMDExQzUwCis6MTAzRUEwMDAyNDAzRkZGRDAwNDMxMDI0QUY4MjAxMUM4RUUyMDFEQ0RECis6MTAzRUIwMDAyNDQyMDAwMUFFRTIwMURDOEVFMjAxREM4RjQyMDEyOEU3Cis6MTAzRUMwMDBBRkEyMDAxMDhGNDIwMTMwM0MwNDAwMDEyNDg0NjE1Q0U5Cis6MTAzRUQwMDBBRkEyMDAxNDhGODYwMTFDOEY4NzAwQjAzQzA1MDAwNTNGCis6MTAzRUUwMDAzNEE1MTEwMDBDMDAyQjNCMDAwMDAwMDA4RjgyMDBBMEM1Cis6MTAzRUYwMDAzMDQyMDAwNDEwNDAwMDY5MDAwMDAwMDA4RjQzMDEyQzk0Cis6MTAzRjAwMDA4RjgyMDEyNDE0NjIwMDA1MDAwMDAwMDA4RjQzMDEzNEY5Cis6MTAzRjEwMDA4RjgyMDBBNDEwNjIwMDA2MDAwMDAwMDA4RjgyMDEyNDNFCis6MTAzRjIwMDBBRjQyMDEyQzhGODIwMEE0MTAwMDAwNUNBRjQyMDEzNDJDCis6MTAzRjMwMDA4RjgyMDBBMDNDMDMwMDgwMDA0MzEwMjQxMDQwMDAwRDNECis6MTAzRjQwMDAwMDAwMDAwMDhGODIwMTFDMzQ0MjAwMDJBRjgyMDExQzdECis6MTAzRjUwMDA4RjgyMDBBMDI0MDNGRkZCMDA0MzEwMjRBRjgyMDBBMDQ3Cis6MTAzRjYwMDA4RjgyMDExQzI0MDNGRkZEMDA0MzEwMjQxMDAwMDA0QjJFCis6MTAzRjcwMDBBRjgyMDExQzhGNDMwMTJDOEY4MjAxMjQxNDYyMDAwNTQzCis6MTAzRjgwMDAwMDAwMDAwMDhGNDMwMTM0OEY4MjAwQTQxMDYyMDAxMEYzCis6MTAzRjkwMDAwMDAwMDAwMDhGODIwMTI0QUY0MjAxMkM4RjgyMDBBNDE4Cis6MTAzRkEwMDA4RjQzMDEyQ0FGNDIwMTM0QUZBMzAwMTA4RjQyMDEzNDg0Cis6MTAzRkIwMDAzQzA0MDAwMTI0ODQ2MTY4QUZBMjAwMTQ4Rjg2MDExQ0I4Cis6MTAzRkMwMDA4Rjg3MDBBMDNDMDUwMDA1MTAwMDAwMzIzNEE1MTIwMEM4Cis6MTAzRkQwMDA4RjQyMDEyQ0FGQTIwMDEwOEY0MjAxMzQzQzA0MDAwMTNCCis6MTAzRkUwMDAyNDg0NjE3NEFGQTIwMDE0OEY4NjAxMUM4Rjg3MDBBMDA3Cis6MTAzRkYwMDAzQzA1MDAwNTBDMDAyQjNCMzRBNTEzMDA4RjgyMDExQ0VGCis6MTA0MDAwMDAzNDQyMDAwMkFGODIwMTFDOEY4MzAxMjQ4RjgyMDBBMDAyCis6MTA0MDEwMDAzNDQyMDAwMUFGODIwMEEwMjQwMjAwODBBRjgzMDEyNDVCCis6MTA0MDIwMDBBRkEyMDAxMEFGQTAwMDE0OEY0MjAwMTQ4QzA0MDIwODRECis6MTA0MDMwMDA4QzA1MDIwQ0FGQTIwMDE4OEY0MjAxMDgzQzA2MDAwMTVCCis6MTA0MDQwMDAyNEM2NkVEODAwNDBGODA5MjQwNzAwMDQ4RjgyMDExQ0EyCis6MTA0MDUwMDAyNDAzRkZGRDAwNDMxMDI0QUY4MjAxMUM4RUUyMDFEQzJCCis6MTA0MDYwMDAyNDQyMDAwMUFFRTIwMURDOEVFMjAxREM4RjQyMDEyQzMxCis6MTA0MDcwMDBBRkEyMDAxMDhGNDIwMTM0M0MwNDAwMDEyNDg0NjE4MDBGCis6MTA0MDgwMDBBRkEyMDAxNDhGODYwMTFDOEY4NzAwQTAzQzA1MDAwNTlECis6MTA0MDkwMDAzNEE1MTQwMDBDMDAyQjNCMDAwMDAwMDA4RkJGMDAyMDUzCis6MTA0MEEwMDAwM0UwMDAwODI3QkQwMDI4M0MwODEwMDAyNDA3MDAwMTk5Cis6MTA0MEIwMDAzQzA2MDA4MDNDMDUwMTAwOEY4MjAwNzAwMDQ4MTAyNEZGCis6MTA0MEMwMDAxMDQwRkZGRDAwMDAwMDAwOEY4MjAwNTQyNDQyMDAwNUQ0Cis6MTA0MEQwMDBBRjgyMDA3ODhDMDQwMjM0MTA4MDAwMTYwMDAwMTgyMTkyCis6MTA0MEUwMDAzQzAyMDAwMTAwNTcxMDIxOEM0MjQwRTgyNDQyMDAwNUE4Cis6MTA0MEYwMDAzQzAxMDAwMTAwMzcwODIxQUMyMjQwRTgzQzAyMDAwMUVECis6MTA0MTAwMDAwMDU3MTAyMThDNDI0MEU4MDA0NDEwMkIxNDQwMDAwOTU1Cis6MTA0MTEwMDAwMDAwMDAwMDNDMDMwMDgwM0MwMTAwMDEwMDM3MDgyMTQyCis6MTA0MTIwMDBBQzIwNDBFODNDMDEwMDAxMDAzNzA4MjExMDAwMDAwQkUyCis6MTA0MTMwMDBBMDI3NDBGMDNDMDIwMDAxMDA1NzEwMjE5MDQyNDBGMEJGCis6MTA0MTQwMDA1NDQwMDAwNjAwNjYxODI1M0MwMjAwMDEwMDU3MTAyMTZCCis6MTA0MTUwMDA5MDQyNDBGMTU0NDAwMDAxMDA2NjE4MjU4QzA0MDIzMDYyCis6MTA0MTYwMDAxMDgwMDAxMzAwMDAwMDAwM0MwMjAwMDEwMDU3MTAyMUU1Cis6MTA0MTcwMDA4QzQyNDBFQzI0NDIwMDA1M0MwMTAwMDEwMDM3MDgyMTNDCis6MTA0MTgwMDBBQzIyNDBFQzNDMDIwMDAxMDA1NzEwMjE4QzQyNDBFQzc0Cis6MTA0MTkwMDAwMDQ0MTAyQjE0NDAwMDA2MDAwMDAwMDAzQzAxMDAwMTA4Cis6MTA0MUEwMDAwMDM3MDgyMUFDMjA0MEVDMTAwMDAwMDYwMDY1MTgyNUZGCis6MTA0MUIwMDAzQzAyMDAwMTAwNTcxMDIxOTA0MjQwRjI1NDQwMDAwMTlGCis6MTA0MUMwMDAwMDY1MTgyNTEwNjBGRkJDMDAwMDAwMDA4RjQyMDAwMDUxCis6MTA0MUQwMDAxMDQwMDAwNzAwMDAwMDAwQUY4MDAwNEM4RjgyMDA0Q0IwCis6MTA0MUUwMDAxMDQwRkZGRDAwMDAwMDAwMTAwMDAwMDUwMDAwMDAwMDZFCis6MTA0MUYwMDBBRjgwMDA0ODhGODIwMDQ4MTA0MEZGRkQwMDAwMDAwMEEzCis6MTA0MjAwMDA4RjgyMDA2MDAwNDMxMDI1QUY4MjAwNjA4RjQyMDAwMDYzCis6MTA0MjEwMDAxMDQwMDAwMzAwMDAwMDAwMTAwMEZGQTdBRjgwMDA0QzFBCis6MTA0MjIwMDAxMDAwRkZBNUFGODAwMDQ4MDNFMDAwMDgwMDAwMDAwMDc4Cis6MTA0MjMwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyN0JERkZFMEJCCis6MTA0MjQwMDBBRkJGMDAxODhGODYwMDY0MzBDMjAwMDQxMDQwMDAyNTA0Cis6MTA0MjUwMDAyNDA0MDAwNDhDMDIwMTE0QUY0MjAwMjBBRjg0MDA2NEU3Cis6MTA0MjYwMDA4RjQyMDJGQzI0NDIwMDAxQUY0MjAyRkM4RjQyMDJGQzVBCis6MTA0MjcwMDA4RjgyMDA2NDMwNDIwMDA0MTQ0MDAwMDUwMDAwMDAwMEZBCis6MTA0MjgwMDA4QzAzMDExNDhGNDIwMDIwMTQ2MkZGRjIwMDAwMDAwMDMyCis6MTA0MjkwMDA4RjQyMDAwMDEwNDAwMDA3OEY0MzAwM0NBRjgwMDA0QzZECis6MTA0MkEwMDA4RjgyMDA0QzEwNDBGRkZEMDAwMDAwMDAxMDAwMDAwNTUwCis6MTA0MkIwMDAwMDAwMDAwMEFGODAwMDQ4OEY4MjAwNDgxMDQwRkZGREUyCis6MTA0MkMwMDAwMDAwMDAwMDhGODIwMDYwMDA0MzEwMjVBRjgyMDA2MDc0Cis6MTA0MkQwMDA4RjQyMDAwMDEwNDAwMDczMDAwMDAwMDAxMDAwMDA2RkNCCis6MTA0MkUwMDAwMDAwMDAwMDMwQzIwMDA4MTA0MDAwMjAyNDA0MDAwODM0Cis6MTA0MkYwMDA4QzAyMDExQ0FGNDIwMDQ4QUY4NDAwNjQ4RjQyMDJBOEM4Cis6MTA0MzAwMDAyNDQyMDAwMUFGNDIwMkE4OEY0MjAyQTg4RjgyMDA2NEJCCis6MTA0MzEwMDAzMDQyMDAwODE0NDAwMDA1MDAwMDAwMDA4QzAzMDExQzFFCis6MTA0MzIwMDA4RjQyMDA0ODE0NjJGRkYyMDAwMDAwMDA4RjQyMDAwMDNDCis6MTA0MzMwMDAxMDQwMDAwNzAwMDAwMDAwQUY4MDAwNEM4RjgyMDA0QzRFCis6MTA0MzQwMDAxMDQwRkZGRDAwMDAwMDAwMTAwMDAwMDUwMDAwMDAwMDBDCis6MTA0MzUwMDBBRjgwMDA0ODhGODIwMDQ4MTA0MEZGRkQwMDAwMDAwMDQxCis6MTA0MzYwMDA4RjgyMDA2MDEwMDBGRkQ5MzQ0MjAyMDAzMEMyMDAyMDZBCis6MTA0MzcwMDAxMDQwMDAyMzI0MDQwMDIwOEMwMjAxMkNBRjQyMDA2ODZFCis6MTA0MzgwMDBBRjg0MDA2NDhGNDIwMkQ4MjQ0MjAwMDFBRjQyMDJEOEI5Cis6MTA0MzkwMDA4RjQyMDJEODhGODIwMDY0MzA0MjAwMjAxNDQwMDAwNTEyCis6MTA0M0EwMDAzMkMyNDAwMDhDMDMwMTJDOEY0MjAwNjgxNDYyRkZGMjdECis6MTA0M0IwMDAzMkMyNDAwMDE0NDAwMDAyM0MwMjAwMDEwMkMyQjAyNTlCCis6MTA0M0MwMDA4RjQyMDAwMDEwNDAwMDA3MDAwMDAwMDBBRjgwMDA0QzRBCis6MTA0M0QwMDA4RjgyMDA0QzEwNDBGRkZEMDAwMDAwMDAxMDAwMDAwNTFGCis6MTA0M0UwMDAwMDAwMDAwMEFGODAwMDQ4OEY4MjAwNDgxMDQwRkZGREIxCis6MTA0M0YwMDAwMDAwMDAwMDhGODIwMDYwMTAwMEZGQjQzNDQyMDgwMDBCCis6MTA0NDAwMDAzMEMyMDAxMDEwNDAwMDI5MjQwNDAwMTA4QzAyMDEyNDQ2Cis6MTA0NDEwMDBBRjQyMDA1OEFGODQwMDY0OEY0MjAyRDQyNDQyMDAwMUFFCis6MTA0NDIwMDBBRjQyMDJENDhGNDIwMkQ0OEY4MjAwNjQzMDQyMDAxMDI3Cis6MTA0NDMwMDAxNDQwMDAwNTMyQzIyMDAwOEMwMzAxMjQ4RjQyMDA1ODMyCis6MTA0NDQwMDAxNDYyRkZGMjMyQzIyMDAwNTA0MDAwMDEzNkQ2ODAwMEQ0Cis6MTA0NDUwMDA4RjQyMDAwMDEwNDAwMDA3MDAwMDAwMDBBRjgwMDA0Q0I5Cis6MTA0NDYwMDA4RjgyMDA0QzEwNDBGRkZEMDAwMDAwMDAxMDAwMDAwNThFCis6MTA0NDcwMDAwMDAwMDAwMEFGODAwMDQ4OEY4MjAwNDgxMDQwRkZGRDIwCis6MTA0NDgwMDAwMDAwMDAwMDhGODIwMDYwMzQ0MjAxMDBBRjgyMDA2MEIzCis6MTA0NDkwMDA4RjQyMDAwMDEwNDAwMDAzMDAwMDAwMDAxMDAwMDA2QzdDCis6MTA0NEEwMDBBRjgwMDA0QzEwMDAwMDZBQUY4MDAwNDgzMEMyMDAwMUFECis6MTA0NEIwMDAxMDQwMDAwNDI0MDIwMDAxQUY4MjAwNjQxMDAwMDA2NDc4Cis6MTA0NEMwMDAwMDAwMDAwMDMwQzIwMDAyMTQ0MDAwMEIzQzA1MDAwMzU1Cis6MTA0NEQwMDAzQzA0MDAwMTI0ODQ2MjQ0MzRBNTA1MDAwMDAwMzgyMTE2Cis6MTA0NEUwMDBBRkEwMDAxMDBDMDAyQjNCQUZBMDAwMTQyNDAyRkZDMEIzCis6MTA0NEYwMDAxMDAwMDA1N0FGODIwMDY0OEMwNTAyMkM4QzAyMDEwQzY2Cis6MTA0NTAwMDAxMEEyMDA0ODAwMDUxMDgwOEM0NjAzMDAyNEEyMDAwMTgwCis6MTA0NTEwMDAzMDQ1MDAzRjI0MDIwMDAzQUMwNTAyMkMwMDA2MUUwMkI5Cis6MTA0NTIwMDAxMDYyMDAwNTI0MDIwMDEwMTA2MjAwMUQzMEMyMEZGRjRGCis6MTA0NTMwMDAxMDAwMDAzOTAwMDAwMDAwOEY0MzAyQTg4RjQ0MDAwMEUzCis6MTA0NTQwMDAzMEMyMEZGRkFGNDIwMDQ4MjQ2MzAwMDFBRjQzMDJBODBFCis6MTA0NTUwMDAxMDgwMDAwNzhGNDIwMkE4QUY4MDAwNEM4RjgyMDA0QzcxCis6MTA0NTYwMDAxMDQwRkZGRDAwMDAwMDAwMTAwMDAwMDUwMDAwMDAwMEVBCis6MTA0NTcwMDBBRjgwMDA0ODhGODIwMDQ4MTA0MEZGRkQwMDAwMDAwMDFGCis6MTA0NTgwMDA4RjgyMDA2MDM0NDIwMjAwQUY4MjAwNjA4RjQyMDAwMEUwCis6MTA0NTkwMDAxMDQwMDAxRjAwMDAwMDAwMTAwMDAwMUIwMDAwMDAwMDgxCis6MTA0NUEwMDBBRjQyMDA1ODMyQzIyMDAwNTA0MDAwMDEzNkQ2ODAwMDkxCis6MTA0NUIwMDA4RjQyMDJENDhGNDMwMDAwMjQ0MjAwMDFBRjQyMDJENDU0Cis6MTA0NUMwMDAxMDYwMDAwNzhGNDIwMkQ0QUY4MDAwNEM4RjgyMDA0Q0Y1Cis6MTA0NUQwMDAxMDQwRkZGRDAwMDAwMDAwMTAwMDAwMDUwMDAwMDAwMDdBCis6MTA0NUUwMDBBRjgwMDA0ODhGODIwMDQ4MTA0MEZGRkQwMDAwMDAwMEFGCis6MTA0NUYwMDA4RjgyMDA2MDM0NDIwMTAwQUY4MjAwNjA4RjQyMDAwMDcxCis6MTA0NjAwMDAxMDQwMDAwMzAwMDAwMDAwMTAwMDAwMDZBRjgwMDA0Q0M2Cis6MTA0NjEwMDAxMDAwMDAwNEFGODAwMDQ4MEMwMDIxOTYwMEMwMjAyMTRCCis6MTA0NjIwMDAwMDQwMjgyMThDMDIwMTBDMTRBMjAwMDIyNDAyMDAwMjg2Cis6MTA0NjMwMDBBRjgyMDA2NDhGODIwMDY0MzA0MjAwMDIxNDQwMDAwNEE0Cis6MTA0NjQwMDAwMDAwMDAwMDhDMDIwMTBDMTRBMkZGQUMwMDAwMDAwMDZFCis6MTA0NjUwMDA4RkJGMDAxODAzRTAwMDA4MjdCRDAwMjAwM0UwMDAwODFBCis6MTA0NjYwMDAwMDAwMDAwMDI3QkRGRkEwQUZCMDAwNDAwMDgwODAyMTA3Cis6MTA0NjcwMDAwMDEwMTYwMjI0NDJGRkZGMzA0MzAwRkYyQzYyMDAxMzlCCis6MTA0NjgwMDBBRkJGMDA1OEFGQkUwMDU0QUZCNTAwNTBBRkIzMDA0QzQxCis6MTA0NjkwMDBBRkIyMDA0OEFGQjEwMDQ0MTA0MDAxRjNBRkE1MDAzNDAxCis6MTA0NkEwMDAwMDAzMTA4MDNDMDEwMDAxMDAyMjA4MjE4QzIyNjI4ODU2Cis6MTA0NkIwMDAwMDQwMDAwODAwMDAwMDAwMDAxMDEzMDIzMDQ0MEZGRjBCCis6MTA0NkMwMDAyNDAyMDAwMTEwODIwMDA1MjQwMjAwMDIxMDgyMDAwQzY2Cis6MTA0NkQwMDAyNDAyRkZGRTEwMDAwMDI0M0MwNTAwMDM4RjQzMDAwNDY5Cis6MTA0NkUwMDAzQzAyMDAwMThDNDI2RjA0QUY0NDAyMDBBRjQ0MDIwNDVDCis6MTA0NkYwMDAzQzA0MDAwMThDODQ2RTgwMTAwMDAwMDkzNDYzMDAwMUNBCis6MTA0NzAwMDA4RjQzMDAwNEFGNDQwMjAwQUY0NDAyMDQzQzA0MDAwMUE0Cis6MTA0NzEwMDA4Qzg0NkU4MDAwNjIxODI0M0MwMjAwMDEyNDQyQ0EyODY2Cis6MTA0NzIwMDAwMDAyMTEwMDAwMDIxMTgyQUY0MzAwMDQzQzAzMDgwMEE0Cis6MTA0NzMwMDAwMDQzMTAyNUFDODIwMDM4OEY4NDAwNTQwMDA0MTQ0MkRBCis6MTA0NzQwMDAwMDA0MUM4MjAwNDMxMDIxMDAwNDFDQzIwMDQzMTAyM0ZCCis6MTA0NzUwMDAwMDA0MUQwMjAwNDMxMDIxMDAwNDFENDIwMDQzMTAyM0U5Cis6MTA0NzYwMDAxMDAwMDAwOUFGNDIwMjA4M0MwNDAwMDEyNDg0NjI1MDlBCis6MTA0NzcwMDAzNEE1MTAwMDAyMDAzMDIxMDAwMDM4MjFBRkEwMDAxMDQ1Cis6MTA0NzgwMDAwQzAwMkIzQkFGQTAwMDE0OEY0MjAyQTAyNDQyMDAwMTdBCis6MTA0NzkwMDBBRjQyMDJBMDEwMDAwMjFGOEY0MjAyQTAyN0IwMDAyOEUzCis6MTA0N0EwMDAwMjAwMjAyMTI0MDUwMjEwMEMwMDJCQkYyNDA2MDAwODYzCis6MTA0N0IwMDAwQzAwMjUxODAyMDAyMDIxMTAwMDAyMTYwMDAwMDAwMDQ1Cis6MTA0N0MwMDA4RkFBMDAzNDI3QTQwMDI4MDAwQTE4ODAyNTQyMDAwMTdGCis6MTA0N0QwMDAzMDQyMDAzRkFGQTIwMDM0OEM2NTAzMDA4RkFBMDAzNDQyCis6MTA0N0UwMDAwMDAyMTA4MDhDNDMwMzAwMjU0MjAwMDEzMDQyMDAzRjRDCis6MTA0N0YwMDBBRkEyMDAzNEFDMDIwMjJDQUZBNTAwMjgwQzAwMjUxODkzCis6MTA0ODAwMDBBRkEzMDAyQzEwMDAwMjAzMDAwMDAwMDAyN0IwMDAyODE2Cis6MTA0ODEwMDAwMjAwMjAyMTI0MDUwMjEwMEMwMDJCQkYyNDA2MDAwOEYyCis6MTA0ODIwMDAwQzAwMjY1NzAyMDAyMDIxMTAwMDAxRkEwMDAwMDAwMEIxCis6MTA0ODMwMDA4RkFBMDAzNDI3QTQwMDI4MDAwQTE4ODAyNTQyMDAwMTBFCis6MTA0ODQwMDAzMDQyMDAzRkFGQTIwMDM0OEM2NTAzMDA4RkFBMDAzNEQxCis6MTA0ODUwMDAwMDAyMTA4MDhDNDMwMzAwMjU0MjAwMDEzMDQyMDAzRkRCCis6MTA0ODYwMDBBRkEyMDAzNEFDMDIwMjJDQUZBNTAwMjgwQzAwMjY1N0UyCis6MTA0ODcwMDBBRkEzMDAyQzEwMDAwMUU3MDAwMDAwMDAwMDEwMTMwMjlECis6MTA0ODgwMDAzMDQzMEZGRjI0MDIwMDAxMTA2MjAwMDUyNDAyMDAwMkUxCis6MTA0ODkwMDAxMDYyMDAxRTNDMDIwMDAyMTAwMDAwMzMzQzA1MDAwM0MxCis6MTA0OEEwMDAzQzAzMDAwMjAyQzMxMDI0NTQ0MDAwMzcwMkMzQjAyNTY5Cis6MTA0OEIwMDA4RjgyMDIyODNDMDEwMDAxMDAzNzA4MjFBQzIyMzhEODQxCis6MTA0OEMwMDA4RjgyMDIyQzNDMDEwMDAxMDAzNzA4MjFBQzIyMzhEQzI5Cis6MTA0OEQwMDA4RjgyMDIzMDNDMDEwMDAxMDAzNzA4MjFBQzIyMzhFMDExCis6MTA0OEUwMDA4RjgyMDIzNDNDMDEwMDAxMDAzNzA4MjFBQzIyMzhFNEY5Cis6MTA0OEYwMDAyNDAyRkZGRkFGODIwMjI4QUY4MjAyMkNBRjgyMDIzMDc3Cis6MTA0OTAwMDBBRjgyMDIzNDEwMDAwMDIwMDJDM0IwMjUwMkMyMTAyNDdFCis6MTA0OTEwMDAxMDQwMDAxMjNDMDJGRkZEM0MwMjAwMDEwMDU3MTAyMTM0Cis6MTA0OTIwMDA4QzQyMzhEOEFGODIwMjI4M0MwMjAwMDEwMDU3MTAyMTg3Cis6MTA0OTMwMDA4QzQyMzhEQ0FGODIwMjJDM0MwMjAwMDEwMDU3MTAyMTZGCis6MTA0OTQwMDA4QzQyMzhFMEFGODIwMjMwM0MwMjAwMDEwMDU3MTAyMTU3Cis6MTA0OTUwMDA4QzQyMzhFNEFGODIwMjM0M0MwMkZGRkQzNDQyRkZGRjU4Cis6MTA0OTYwMDAxMDAwMDAwOTAyQzJCMDI0M0MwNDAwMDEyNDg0NjI1Q0VGCis6MTA0OTcwMDAzNEE1MTEwMDAyMDAzMDIxMDAwMDM4MjFBRkEwMDAxMDQyCis6MTA0OTgwMDAwQzAwMkIzQkFGQTAwMDE0OEY0MjAyQ0MyNDQyMDAwMTRDCis6MTA0OTkwMDBBRjQyMDJDQzEwMDAwMTlGOEY0MjAyQ0MwMDEwMTMwMkU0Cis6MTA0OUEwMDAzMDQ1MEZGRjI0MDIwMDAxMTBBMjAwMDUyNDAyMDAwMjdFCis6MTA0OUIwMDAxMEEyMDAwRDNDMDQwOEZGMTAwMDAwMTQzQzA1MDAwMzg5Cis6MTA0OUMwMDAzQzAyMDhGRjM0NDJGRkZGOEY4MzAyMjAzQzA0MDAwNEI2Cis6MTA0OUQwMDAwMkM0QjAyNTAwNjIxODI0MzQ2MzAwMDhBRjgzMDIyMEFCCis6MTA0OUUwMDAxMDAwMDAxMkFGNDUwMjk4MzQ4NEZGRjczQzAzRkZGQjMwCis6MTA0OUYwMDA4RjgyMDIyMDM0NjNGRkZGMDJDM0IwMjQwMDQ0MTAyNERFCis6MTA0QTAwMDBBRjgyMDIyMDEwMDAwMDA5QUY0NTAyOTgzQzA0MDAwMTZCCis6MTA0QTEwMDAyNDg0NjI2ODM0QTUxMjAwMDIwMDMwMjEwMDAwMzgyMThECis6MTA0QTIwMDBBRkEwMDAxMDBDMDAyQjNCQUZBMDAwMTQ4RjQyMDJCQ0MzCis6MTA0QTMwMDAyNDQyMDAwMUFGNDIwMkJDMTAwMDAxNzY4RjQyMDJCQzRBCis6MTA0QTQwMDAyNzg0MDIwODI0MDUwMjAwMEMwMDJCQkYyNDA2MDAwODVFCis6MTA0QTUwMDAyNzQ0MDIyNDI0MDUwMjAwMEMwMDJCQkYyNDA2MDAwODcyCis6MTA0QTYwMDA4RjQyMDJDNDI0NDIwMDAxQUY0MjAyQzQxMDAwMDE2OTE3Cis6MTA0QTcwMDA4RjQyMDJDNDAwMTAxMzAyMzA0MzBGRkYyNDAyMDAwMUQyCis6MTA0QTgwMDAxMDYyMDAxMTI4NjIwMDAyNTA0MDAwMDUyNDAyMDAwMjVBCis6MTA0QTkwMDAxMDYwMDAwNzAwMDAwMDAwMTAwMDAwMTcwMDAwMDAwMDc4Cis6MTA0QUEwMDAxMDYyMDAwRjAwMDAwMDAwMTAwMDAwMTMwMDAwMDAwMDYyCis6MTA0QUIwMDA4QzA2MDI0ODAwMDAyMDIxMEMwMDUxMDQyNDA1MDAwNDRCCis6MTA0QUMwMDAxMDAwMDAwNzAwMDAwMDAwOEMwNjAyNDgwMDAwMjAyMUIyCis6MTA0QUQwMDAwQzAwNTEwNDI0MDUwMDA0MTAwMDAwMTAwMDAwMDAwMDI4Cis6MTA0QUUwMDA4QzA2MDI0QzAwMDAyMDIxMEMwMDUxMDQyNDA1MDAwMTFBCis6MTA0QUYwMDAxMDAwMDAwQTAwMDAwMDAwM0MwNDAwMDEyNDg0NjI3NERECis6MTA0QjAwMDAzQzA1MDAwMzM0QTUxMzAwMDIwMDMwMjEwMDAwMzgyMUM5Cis6MTA0QjEwMDBBRkEwMDAxMDBDMDAyQjNCQUZBMDAwMTQ4RjQyMDJDMENFCis6MTA0QjIwMDAyNDQyMDAwMUFGNDIwMkMwMTAwMDAxM0E4RjQyMDJDMDhECis6MTA0QjMwMDAwQzAwMjQyNjAwMDAwMDAwMTAwMDAxMzYwMDAwMDAwMEQ4Cis6MTA0QjQwMDAyNDAyMDAwMUEzNDIwNUM1MjQxMDAxMDA4RjQ0MDFBOERFCis6MTA0QjUwMDA4RjQ1MDFBQ0FGQjAwMDEwQUZBMDAwMTQ4RjQyMDAxNDFECis6MTA0QjYwMDBBRkEyMDAxODhGNDIwMTA4MjZFNjAwMjgwMDQwRjgwOThECis6MTA0QjcwMDAyNDA3MDQwMDEwNDBGRkY1MDAwMDAwMDAxMDAwMDEyNThDCis6MTA0QjgwMDAwMDAwMDAwMDNDMDNGRkZGMzQ2MzdGRkY4RjQyMDM2ODk3Cis6MTA0QjkwMDA4RjQ0MDM2MDAyQzNCMDI0MDAwMDE4MjFBRjQwMDA1OEM2Cis6MTA0QkEwMDBBRjQwMDA1Q0FGNDAwMDYwQUY0MDAwNjQwMDQ0MTAyM0ExCis6MTA0QkIwMDBBRjQyMDM2ODNDMDIwOTAwQUY0MDAzNjBBRkEyMDAyMDhGCis6MTA0QkMwMDA4RjVFMDAxODI3QUEwMDIwMjQwMjAwRkYxM0MyMDAwMkYzCis6MTA0QkQwMDBBRkFBMDAzQzI3QzMwMDAxOEMwMjAyMjgwMDYwOTAyMThDCis6MTA0QkUwMDAxNjQyMDAwRTAwMUUzOEMwOEY0MjAzM0MyNDQyMDAwMUQyCis6MTA0QkYwMDBBRjQyMDMzQzhGNDIwMzNDOEMwMjAyMjgzQzA0MDAwMTdDCis6MTA0QzAwMDAyNDg0NjIwQzNDMDUwMDA5QUZBMDAwMTRBRkEyMDAxMDgwCis6MTA0QzEwMDA4RkE2MDAyMDEwMDAwMDZCMzRBNTA1MDAwMEY3MTAyMUJFCis6MTA0QzIwMDA4RkEzMDAyMDhGQTQwMDI0QUM0MzA0QzBBQzQ0MDRDNDcwCis6MTA0QzMwMDA4RjgzMDA1NDhGODIwMDU0MjQ3MDAzRTgwMjAyMTAyM0YzCis6MTA0QzQwMDAyQzQyMDNFOTEwNDAwMDFCMDAwMDk4MjEwMEUwODgyMTVECis6MTA0QzUwMDAyNjM1MDRDMDhGNDQwMTc4OEY0NTAxN0MwMjIwMTgyMTNECis6MTA0QzYwMDAyNDBBMDAwNEFGQUEwMDEwQUZCMjAwMTQ4RjQ4MDAwQzUxCis6MTA0QzcwMDAwMDAwMTAyMTAyRjUzMDIxQUZBODAwMTg4RjQ4MDEwQzY4Cis6MTA0QzgwMDAyNDA3MDAwODAwQTMyODIxMDBBMzQ4MkIwMDgyMjAyMTJDCis6MTA0QzkwMDAwMTAwRjgwOTAwODkyMDIxNTQ0MDAwMDYyNDEzMDAwMTc2Cis6MTA0Q0EwMDA4RjgyMDA1NDAyMDIxMDIzMkM0MjAzRTkxNDQwRkZFOUQyCis6MTA0Q0IwMDAwMDAwMDAwMDMyNjIwMEZGNTQ0MDAwMTdBRjUyMDAxODlECis6MTA0Q0MwMDA4RjQyMDM3ODI0NDIwMDAxQUY0MjAzNzg4RjQyMDM3ODc5Cis6MTA0Q0QwMDA4RjgyMDEyMDhGQUEwMDNDQUZBMjAwMTA4RjgyMDEyNDk2Cis6MTA0Q0UwMDAzQzA0MDAwMTI0ODQ2MjE4M0MwNTAwMDlBRkEyMDAxNEIyCis6MTA0Q0YwMDA4RDQ2MDAwMDEwMDAwMDMzMzRBNTA2MDA4RjQyMDMwOEUzCis6MTA0RDAwMDAyNDEzMDAwMTI0NDIwMDAxQUY0MjAzMDg4RjQyMDMwODJDCis6MTA0RDEwMDAxMDAwMDAxQzMyNjIwMEZGOEY4MzAwNTQ4RjgyMDA1NDA5Cis6MTA0RDIwMDAyNDcwMDNFODAyMDIxMDIzMkM0MjAzRTkxMDQwMDAxNDBGCis6MTA0RDMwMDAwMDAwOTgyMTI0MTEwMDEwOEY0MjAwMEM4RjQ0MDE2MDY0Cis6MTA0RDQwMDA4RjQ1MDE2NDhGODYwMTIwQUZCMTAwMTBBRkIyMDAxNDBGCis6MTA0RDUwMDBBRkEyMDAxODhGNDIwMTBDMjQwNzAwMDgwMDQwRjgwOTk4Cis6MTA0RDYwMDAyNEM2MDAxQzE0NDBGRkU1MDAwMDAwMDA4RjgyMDA1NEEwCis6MTA0RDcwMDAwMjAyMTAyMzJDNDIwM0U5MTQ0MEZGRUYwMDAwMDAwMDYwCis6MTA0RDgwMDAzMjYyMDBGRjE0NDAwMDExMDAwMDAwMDA4RjQyMDM3OERGCis6MTA0RDkwMDAyNDQyMDAwMUFGNDIwMzc4OEY0MjAzNzg4RjgyMDEyMEMyCis6MTA0REEwMDA4RkFBMDAzQ0FGQTIwMDEwOEY4MjAxMjQzQzA0MDAwMUI2Cis6MTA0REIwMDAyNDg0NjIyMDNDMDUwMDA5QUZBMjAwMTQ4RDQ2MDAwMDQ3Cis6MTA0REMwMDAzNEE1MDcwMDBDMDAyQjNCMDNDMDM4MjE4RjQyMDJCMEYyCis6MTA0REQwMDAyNDQyMDAwMUFGNDIwMkIwOEY0MjAyQjA4RjQyMDJGODdCCis6MTA0REUwMDAyNDQyMDAwMUFGNDIwMkY4MTAwMDAwOEE4RjQyMDJGODBDCis6MTA0REYwMDA4QzAyMDI1QzI3NDQwMjI0QUY0MjAxRjA4QzAyMDI2MDY0Cis6MTA0RTAwMDAyNDA1MDIwMDI0MDYwMDA4MEMwMDJCQkZBRjQyMDFGODY1Cis6MTA0RTEwMDA4RjgyMDIyMDMwNDIwMDA4MTQ0MDAwMDIyNDAyMDAwMTY4Cis6MTA0RTIwMDAyNDAyMDAwMkFGNDIwMjk4OEY0MjAyQUMyNDQyMDAwMUU5Cis6MTA0RTMwMDBBRjQyMDJBQzEwMDAwMDc3OEY0MjAyQUMzQzAyMDBGRjkwCis6MTA0RTQwMDAzNDQyRkZGRjAyMDIxODI0MzJDMjAxODAxNDQwMDAwNkRGCis6MTA0RTUwMDAzNDAyRkZGQjAwNDMxMDJCMTQ0MDAwMDMwMDAwMDAwMDRECis6MTA0RTYwMDAxMDAwMDA2Q0FGNDMwMEJDM0MwNDAwMDEyNDg0NjI4MDRECis6MTA0RTcwMDAzQzA1MDAwMzM0QTUxNTAwMDIwMDMwMjEwMDAwMzgyMTU0Cis6MTA0RTgwMDBBRkEwMDAxMDBDMDAyQjNCQUZBMDAwMTQzQzAyMDcwMEE5Cis6MTA0RTkwMDAzNDQyMTAwMDAwMTAxRTAyMDA2MjE4MjVBRkEzMDAyMDRCCis6MTA0RUEwMDA4RjUxMDAxODI0MDIwMEZGMTIyMjAwMDIwMDAwODAyMTBFCis6MTA0RUIwMDAyNjMwMDAwMThDMDIwMjI4MTYwMjAwMEUwMDExMzBDMEJDCis6MTA0RUMwMDA4RjQyMDMzQzI0NDIwMDAxQUY0MjAzM0M4RjQyMDMzQzJCCis6MTA0RUQwMDA4QzAyMDIyODNDMDQwMDAxMjQ4NDYxRjQzQzA1MDAwOTkyCis6MTA0RUUwMDBBRkEwMDAxNEFGQTIwMDEwOEZBNjAwMjAxMDAwMDAzRjVBCis6MTA0RUYwMDAzNEE1MDEwMDAwRDcxMDIxOEZBMzAwMjA4RkE0MDAyNDI3Cis6MTA0RjAwMDBBQzQzMDRDMEFDNDQwNEM0MDBDMDE4MjE4RjQ0MDE3OEYxCis6MTA0RjEwMDA4RjQ1MDE3QzAwMDAxMDIxMjQwNzAwMDRBRkE3MDAxMDdBCis6MTA0RjIwMDBBRkIwMDAxNDhGNDgwMDBDMjRDNjA0QzAwMkU2MzAyMTQ0Cis6MTA0RjMwMDBBRkE4MDAxODhGNDgwMTBDMjQwNzAwMDgwMEEzMjgyMUZGCis6MTA0RjQwMDAwMEEzNDgyQjAwODIyMDIxMDEwMEY4MDkwMDg5MjAyMUJDCis6MTA0RjUwMDAxNDQwMDAwQjI0MDcwMDA4OEY4MjAxMjBBRkEyMDAxMDJDCis6MTA0RjYwMDA4RjgyMDEyNDNDMDQwMDAxMjQ4NDYxRkMzQzA1MDAwOTdCCis6MTA0RjcwMDBBRkEyMDAxNDhGQTYwMDIwMTAwMDAwMUMzNEE1MDIwMDcwCis6MTA0RjgwMDA4RjQ0MDE2MDhGNDUwMTY0OEY0MzAwMENBRjUwMDAxOEJGCis6MTA0RjkwMDA4Rjg2MDEyMDI0MDIwMDEwQUZBMjAwMTBBRkIwMDAxNEQxCis6MTA0RkEwMDBBRkEzMDAxODhGNDIwMTBDMDA0MEY4MDkyNEM2MDAxQzcyCis6MTA0RkIwMDAxNDQwMDAxMDAwMDAwMDAwOEY0MjAzNDAyNDQyMDAwMTEyCis6MTA0RkMwMDBBRjQyMDM0MDhGNDIwMzQwOEY4MjAxMjBBRkEyMDAxMDA2Cis6MTA0RkQwMDA4RjgyMDEyNDNDMDQwMDAxMjQ4NDYyMDQzQzA1MDAwOTAyCis6MTA0RkUwMDBBRkEyMDAxNDhGQTYwMDIwMzRBNTAzMDAwQzAwMkIzQkI5Cis6MTA0RkYwMDAwMjIwMzgyMThGNDIwMkUwMjQ0MjAwMDFBRjQyMDJFMDQ5Cis6MTA1MDAwMDA4RjQyMDJFMDhGNDIwMkYwMjQ0MjAwMDFBRjQyMDJGMEUwCis6MTA1MDEwMDA4RjQyMDJGMDhGQTIwMDM0OEZCRjAwNTg4RkJFMDA1NDIxCis6MTA1MDIwMDA4RkI1MDA1MDhGQjMwMDRDOEZCMjAwNDg4RkIxMDA0NDUxCis6MTA1MDMwMDA4RkIwMDA0MDAzRTAwMDA4MjdCRDAwNjAyN0JERkZGOEU3Cis6MTA1MDQwMDAyNDA4RkZGRjEwQTAwMDE0MDAwMDQ4MjEzQzBBRURCODFFCis6MTA1MDUwMDAzNTRBODMyMDkwODcwMDAwMjQ4NDAwMDEwMDAwMzAyMTFECis6MTA1MDYwMDAwMTA3MTAyNjMwNDIwMDAxMTA0MDAwMDIwMDA4MTg0MkRCCis6MTA1MDcwMDAwMDZBMTgyNjAwNjA0MDIxMjRDNjAwMDEyQ0MyMDAwOEU2Cis6MTA1MDgwMDAxNDQwRkZGNzAwMDczODQyMjUyOTAwMDEwMTI1MTAyQkE1Cis6MTA1MDkwMDAxNDQwRkZGMDAwMDAwMDAwMDEwMDEwMjEwM0UwMDAwOEIwCis6MTA1MEEwMDAyN0JEMDAwODI3QkRGRkIwQUZCRjAwNDhBRkJFMDA0NDFBCis6MTA1MEIwMDBBRkI1MDA0MEFGQjMwMDNDQUZCMjAwMzhBRkIxMDAzNDgxCis6MTA1MEMwMDBBRkIwMDAzMDhGODcwMjIwQUZBNzAwMjQ4Rjg3MDIwMDg3Cis6MTA1MEQwMDBBRkE3MDAyQzhGODIwMjIwM0MwMzA4RkYzNDYzRkZGRjQwCis6MTA1MEUwMDAwMDQzMTAyNDM0NDIwMDA0QUY4MjAyMjA4RjgyMDIwMDY5Cis6MTA1MEYwMDAzQzAzQzBGRjM0NjNGRkZGMDA0MzEwMjQzNDQyMDAwNDJDCis6MTA1MTAwMDBBRjgyMDIwMDhGNTMwMzU4OEY1NTAzNUM4RjVFMDM2MDlDCis6MTA1MTEwMDA4RjQ3MDM2NEFGQTcwMDE0OEY0NzAzNjhBRkE3MDAxQzM1Cis6MTA1MTIwMDA4RjQyMDJEMDI3NDQwMUMwMjQ0MjAwMDFBRjQyMDJEMDg2Cis6MTA1MTMwMDA4RjUwMDJEMDhGNTEwMjA0OEY1MjAyMDAwQzAwMkJBODE2Cis6MTA1MTQwMDAyNDA1MDQwMEFGNTMwMzU4QUY1NTAzNUNBRjVFMDM2MDAyCis6MTA1MTUwMDA4RkE3MDAxNEFGNDcwMzY0OEZBNzAwMUNBRjQ3MDM2OEY1Cis6MTA1MTYwMDBBRjUwMDJEMEFGNTEwMjA0QUY1MjAyMDA4QzAyMDI1Qzc5Cis6MTA1MTcwMDAyNzQ0MDIyNEFGNDIwMUYwOEMwMjAyNjAyNDA1MDIwMEExCis6MTA1MTgwMDAyNDA2MDAwOEFGNDIwMUY4MjQwMjAwMDYwQzAwMkJCRkUxCis6MTA1MTkwMDBBRjQyMDFGNDNDMDIzQjlBMzQ0MkNBMDBBRjQyMDFGQ0U4Cis6MTA1MUEwMDAyNDAyMDNFODI0MDQwMDAyMjQwMzAwMDFBRjQyMDI5NDE1Cis6MTA1MUIwMDBBRjQ0MDI5MEFGNDMwMjlDOEY4MjAyMjAzMDQyMDAwODJECis6MTA1MUMwMDAxMDQwMDAwNDAwMDAwMDAwQUY0MzAyOTgxMDAwMDAwM0VDCis6MTA1MUQwMDAwMDAwMzAyMUFGNDQwMjk4MDAwMDMwMjEzQzAzMDAwMTYwCis6MTA1MUUwMDAwMDY2MTgyMTkwNjM2RDAwMDM0NjEwMjEyNEM2MDAwMTVCCis6MTA1MUYwMDBBMDQzMDIyQzJDQzIwMDBGMTQ0MEZGRjgwMzQ2MTgyMUQ0Cis6MTA1MjAwMDAyNEM2MDAwMThGODIwMDQwMjQwNDAwODAyNDA1MDA4MDExCis6MTA1MjEwMDAwMDAyMTcwMjI0NDIwMDMwQTA2MjAyMkMwMzQ2MTAyMTMzCis6MTA1MjIwMDAwQzAwMkJBOEEwNDAwMjJDOEZBNzAwMjQzMEUyMDAwNDIxCis6MTA1MjMwMDAxNDQwMDAwNjAwMDAwMDAwOEY4MjAyMjAzQzAzMDhGRjlCCis6MTA1MjQwMDAzNDYzRkZGQjAwNDMxMDI0QUY4MjAyMjA4RkE3MDAyQ0ExCis6MTA1MjUwMDAzMEUyMDAwNDE0NDAwMDA2MDAwMDAwMDA4RjgyMDIwMENCCis6MTA1MjYwMDAzQzAzQzBGRjM0NjNGRkZCMDA0MzEwMjRBRjgyMDIwMDA1Cis6MTA1MjcwMDA4RkJGMDA0ODhGQkUwMDQ0OEZCNTAwNDA4RkIzMDAzQzA1Cis6MTA1MjgwMDA4RkIyMDAzODhGQjEwMDM0OEZCMDAwMzAwM0UwMDAwOEQ3Cis6MTA1MjkwMDAyN0JEMDA1MDAwMDAwMDAwMDAwMDAwMDBBRjQwMDEwNEU2Cis6MTA1MkEwMDAyNDA0MDAwMTAwMDQxMEMwMDJFMjE4MjEyNDgyMDAwMTNECis6MTA1MkIwMDAzQzAxMDAwMTAwMjMwODIxQTQyMjM0RDAwMDQwMjAyMTE5Cis6MTA1MkMwMDAyQzgyMDA4MDE0NDBGRkY4MDAwNDEwQzAyNDAyMDAwMTZBCis6MTA1MkQwMDAzQzAxMDAwMTAwMzcwODIxQTQyMDM4RDBBRjQyMDEwMDcyCis6MTA1MkUwMDBBRjgwMDIyOEFGODAwMjJDQUY4MDAyMzBBRjgwMDIzNDQyCis6MTA1MkYwMDAwM0UwMDAwODAwMDAwMDAwMjdCREZGRThBRkJGMDAxNDc2Cis6MTA1MzAwMDBBRkIwMDAxMDhGNDIwMTA0Mjg0MjAwMDUxMDQwMDAyNjczCis6MTA1MzEwMDAwMDgwODAyMTNDMDIwMDAxOEY0MzAxMDQzNDQyMzBEMEUwCis6MTA1MzIwMDAwMkUyMjAyMTAwMDMxOEMwMDA2MjE4MjEwMkUzMTgyMUM0Cis6MTA1MzMwMDAwMDgzMTAyQjEwNDAwMDE1MDAwMDEwMjE5NjA3MDAwMDdDCis6MTA1MzQwMDAyNDg0MDAwNjI0NjYwMDA2OTQ4MkZGRkMxNDQ3MDAwOUFBCis6MTA1MzUwMDAwMDAwMjgyMTk0ODNGRkZFOTYwMjAwMDIxNDYyMDAwNkRBCis6MTA1MzYwMDAwMEEwMTAyMTk0ODIwMDAwOTYwMzAwMDQwMDQzMTAyNjQwCis6MTA1MzcwMDAyQzQ1MDAwMTAwQTAxMDIxMTQ0MDAwMDkyNDg0MDAwOERECis6MTA1MzgwMDAwMDg2MTAyQjE0NDBGRkYwMDAwMDEwMjEzMDQyMDBGRjc3Cis6MTA1MzkwMDAxNDQwMDAzMDI0MDIwMDAxMTAwMDAwMkUwMDAwMTAyMUYzCis6MTA1M0EwMDAxMDAwRkZGQTI0MDIwMDAxMDIwMDIwMjEwQzAwMjQwQzRFCis6MTA1M0IwMDAyNDA1MDAwNjMwNDIwMDdGMDAwMjE4QzAwMkUzMTAyMURECis6MTA1M0MwMDAzQzAxMDAwMTAwMjIwODIxOTQyMjMwRDAxMDQwRkZGMjVECis6MTA1M0QwMDAwMkUzMTAyMTNDMDYwMDAxMDBDMjMwMjE5NEM2MzBEMDA3Cis6MTA1M0UwMDAxMEMwRkZFRDNDMDgwMDAxMzUwODM0RDI5NjA3MDAwMERDCis6MTA1M0YwMDAwMDA2MTBDMDAwNTcyMDIxMDA4ODIwMjE5NDgyMDAwMDYwCis6MTA1NDAwMDAxNDQ3MDAwOTAwMDAyODIxOTQ4MzAwMDI5NjAyMDAwMjNDCis6MTA1NDEwMDAxNDYyMDAwNjAwQTAxMDIxOTQ4MjAwMDQ5NjAzMDAwNDg4Cis6MTA1NDIwMDAwMDQzMTAyNjJDNDUwMDAxMDBBMDEwMjExNDQwMDAwNzY1Cis6MTA1NDMwMDAwMDA2MTBDMDAyRTIxMDIxM0MwNjAwMDEwMEMyMzAyMTJCCis6MTA1NDQwMDA5NEM2MzREMDE0QzBGRkVCMDAwNjEwQzAxMEMwRkZEMkM5Cis6MTA1NDUwMDAyNDAyMDAwMThGQkYwMDE0OEZCMDAwMTAwM0UwMDAwODg5Cis6MTA1NDYwMDAyN0JEMDAxODAzRTAwMDA4MDAwMDAwMDAyN0JERkZCMEMyCis6MTA1NDcwMDAwMDgwMTAyMUFGQjAwMDMwMjQ1MDAwMDIwMjAwMjAyMTMzCis6MTA1NDgwMDAyNDA1MDAwNkFGQjEwMDM0MDA0MDg4MjFBRkJGMDA0OEJBCis6MTA1NDkwMDBBRkJFMDA0NEFGQjUwMDQwQUZCMzAwM0MwQzAwMjQwQ0RECis6MTA1NEEwMDBBRkIyMDAzODMwNDcwMDdGMDAwNzEwQzAwMkUyMTAyMTgxCis6MTA1NEIwMDAzQzA1MDAwMTAwQTIyODIxOTRBNTMwRDA1MEEwMDAxQzdBCis6MTA1NEMwMDAwMEEwMzAyMTNDMDkwMDAxMzUyOTM0RDI5NjI4MDAwMjgxCis6MTA1NEQwMDAwMDA1MTBDMDAwNTcyMDIxMDA4OTIwMjE5NDgyMDAwMDdGCis6MTA1NEUwMDAxNDQ4MDAwOTAwMDAzMDIxOTQ4MzAwMDI5NjAyMDAwMjUzCis6MTA1NEYwMDAxNDYyMDAwNjAwQzAxMDIxOTQ4MjAwMDQ5NjAzMDAwNDg4Cis6MTA1NTAwMDAwMDQzMTAyNjJDNDYwMDAxMDBDMDEwMjExNDQwMDAwNzYzCis6MTA1NTEwMDAwMDA1MTBDMDAyRTIxMDIxM0MwNTAwMDEwMEEyMjgyMTc0Cis6MTA1NTIwMDA5NEE1MzREMDE0QTBGRkVCMDAwNTEwQzAwMEEwMzAyMURBCis6MTA1NTMwMDAxMEMwMDAxNDAwMDYxMEMwMDA1NzE4MjEzQzAxMDAwMUUzCis6MTA1NTQwMDAwMDIzMDgyMThDMjMzNEQwMDA1NzEwMjFBRkEzMDAxMDcyCis6MTA1NTUwMDAzQzAxMDAwMTAwMjIwODIxOEMyMjM0RDQzQzA0MDAwMUNCCis6MTA1NTYwMDAyNDg0NjM5NEFGQTIwMDE0OEUyNjAwMDA4RTI3MDAwNENBCis6MTA1NTcwMDAzQzA1MDAwNDBDMDAyQjNCMzRBNTA0MDAxMDAwMDA2MzI0Cis6MTA1NTgwMDAzQzAyMDgwMDhGNDUwMTAwMTBBMDAwMDYwMDA1MTBDMDc1Cis6MTA1NTkwMDAwMkUyMTAyMTNDMDEwMDAxMDAyMjA4MjE5NDIyMzREMEIzCis6MTA1NUEwMDBBRjQyMDEwMDAwQTAzMDIxMTRDMDAwMTEwMDA2MjhDMDQ1Cis6MTA1NUIwMDAwMDA3MTBDMDAyRTIxMDIxQUZBNzAwMTAzQzAxMDAwMTVCCis6MTA1NUMwMDAwMDIyMDgyMTk0MjIzMEQwM0MwNDAwMDEyNDg0NjNBMEVFCis6MTA1NUQwMDBBRkEyMDAxNDhFMjYwMDAwOEUyNzAwMDQzQzA1MDAwNEI0Cis6MTA1NUUwMDAwQzAwMkIzQjM0QTUwNTAwMTAwMDAwNDgzQzAyMDgwMENECis6MTA1NUYwMDAwMEI3MTgyMTNDMDIwMDAxOTYwNDAwMDAzNDQyMzREMjY2Cis6MTA1NjAwMDAwMDYyMTgyMUE0NjQwMDAwOEUwMjAwMDIwMDA3MjBDMDdFCis6MTA1NjEwMDBBQzYyMDAwMjAyRTQxMDIxM0MwMzAwMDEwMDYyMTgyMTg4Cis6MTA1NjIwMDA5NDYzMzBEMDAyRTUxMDIxM0MwMTAwMDEwMDIyMDgyMUUyCis6MTA1NjMwMDBBNDIzMzREMDAyRTQxMDIxM0MwMTAwMDEwMDIyMDgyMUZGCis6MTA1NjQwMDBBNDI2MzBEMDhGNDIwMTA0MjQ0MjAwMDEyODQyMDA4MDY5Cis6MTA1NjUwMDAxMDQwMDAwRjNDMDIwMDAyOEY0MjAxMDQzQzA0MDAwMTk0Cis6MTA1NjYwMDAzNDg0MzBEMjk2MDMwMDAwMDAwMjEwQzAwMDU3MTAyMThECis6MTA1NjcwMDAwMDQ0MTAyMUE0NDMwMDAwOEUwMzAwMDJBQzQzMDAwMjRBCis6MTA1NjgwMDA4RjQyMDEwNDI0NDIwMDAxQUY0MjAxMDQzQzAyMDAwMkE3Cis6MTA1NjkwMDAwMkMyMTAyNDEwNDAwMDExMDAwNzIxNDIzQzAzMDAwMTA3Cis6MTA1NkEwMDAzNDYzMzhEODI0MDIwMDAzMDA0NDEwMjMwMDAyMTA4MDIxCis6MTA1NkIwMDAwMDU3MjAyMTAwODMyMDIxMDA1NzEwMjEwMDQzMTAyMTkyCis6MTA1NkMwMDAzMEU1MDAxRjhDNDMwMDAwMjQwMjAwMDEwMEEyMTAwNEZBCis6MTA1NkQwMDAwMDYyMTgyNTEwMDAwMDBDQUM4MzAwMDAyNDAyMDAwM0I3Cis6MTA1NkUwMDAwMDQ0MTAyMzAwMDIxMDgwMDA1QzI4MjEwMDVDMTAyMTdGCis6MTA1NkYwMDAzMEU0MDAxRjhDNDMwMjI4MjQwMjAwMDEwMDgyMTAwNEMxCis6MTA1NzAwMDAwMDYyMTgyNUFDQTMwMjI4M0MwMjA4MDAzNDQyMTAwMEI1Cis6MTA1NzEwMDAwMDAwMTgyMUFGQTIwMDIwOEY1RTAwMTgyN0FBMDAyMEU5Cis6MTA1NzIwMDAyNDAyMDBGRjEzQzIwMDAyQUZBQTAwMkMyN0MzMDAwMTBECis6MTA1NzMwMDA4QzAyMDIyODAwNjA5MDIxMTY0MjAwMEUwMDFFMzhDMDI0Cis6MTA1NzQwMDA4RjQyMDMzQzI0NDIwMDAxQUY0MjAzM0M4RjQyMDMzQ0EyCis6MTA1NzUwMDA4QzAyMDIyODNDMDQwMDAxMjQ4NDYzNUMzQzA1MDAwOTlGCis6MTA1NzYwMDBBRkEwMDAxNEFGQTIwMDEwOEZBNjAwMjAxMDAwMDA2QkE1Cis6MTA1NzcwMDAzNEE1MDUwMDAwRjcxMDIxOEZBMzAwMjA4RkE0MDAyNDdBCis6MTA1NzgwMDBBQzQzMDRDMEFDNDQwNEM0OEY4MzAwNTQ4RjgyMDA1NEUzCis6MTA1NzkwMDAyNDcwMDNFODAyMDIxMDIzMkM0MjAzRTkxMDQwMDAxQjhFCis6MTA1N0EwMDAwMDAwOTgyMTAwRTA4ODIxMjYzNTA0QzA4RjQ0MDE3ODRDCis6MTA1N0IwMDA4RjQ1MDE3QzAyMjAxODIxMjQwQTAwMDRBRkFBMDAxMEEyCis6MTA1N0MwMDBBRkIyMDAxNDhGNDgwMDBDMDAwMDEwMjEwMkY1MzAyMTA4Cis6MTA1N0QwMDBBRkE4MDAxODhGNDgwMTBDMjQwNzAwMDgwMEEzMjgyMTU3Cis6MTA1N0UwMDAwMEEzNDgyQjAwODIyMDIxMDEwMEY4MDkwMDg5MjAyMTE0Cis6MTA1N0YwMDA1NDQwMDAwNjI0MTMwMDAxOEY4MjAwNTQwMjAyMTAyMzNCCis6MTA1ODAwMDAyQzQyMDNFOTE0NDBGRkU5MDAwMDAwMDAzMjYyMDBGRjZGCis6MTA1ODEwMDA1NDQwMDAxN0FGNTIwMDE4OEY0MjAzNzgyNDQyMDAwMTExCis6MTA1ODIwMDBBRjQyMDM3ODhGNDIwMzc4OEY4MjAxMjA4RkFBMDAyQzI5Cis6MTA1ODMwMDBBRkEyMDAxMDhGODIwMTI0M0MwNDAwMDEyNDg0NjM2ODFECis6MTA1ODQwMDAzQzA1MDAwOUFGQTIwMDE0OEQ0NjAwMDAxMDAwMDAzMzkzCis6MTA1ODUwMDAzNEE1MDYwMDhGNDIwMzA4MjQxMzAwMDEyNDQyMDAwMUVFCis6MTA1ODYwMDBBRjQyMDMwODhGNDIwMzA4MTAwMDAwMUMzMjYyMDBGRkExCis6MTA1ODcwMDA4RjgzMDA1NDhGODIwMDU0MjQ3MDAzRTgwMjAyMTAyM0E3Cis6MTA1ODgwMDAyQzQyMDNFOTEwNDAwMDE0MDAwMDk4MjEyNDExMDAxMDVDCis6MTA1ODkwMDA4RjQyMDAwQzhGNDQwMTYwOEY0NTAxNjQ4Rjg2MDEyMDg4Cis6MTA1OEEwMDBBRkIxMDAxMEFGQjIwMDE0QUZBMjAwMTg4RjQyMDEwQ0NDCis6MTA1OEIwMDAyNDA3MDAwODAwNDBGODA5MjRDNjAwMUMxNDQwRkZFNTM2Cis6MTA1OEMwMDAwMDAwMDAwMDhGODIwMDU0MDIwMjEwMjMyQzQyMDNFOUUyCis6MTA1OEQwMDAxNDQwRkZFRjAwMDAwMDAwMzI2MjAwRkYxNDQwMDAxMThFCis6MTA1OEUwMDAwMDAwMDAwMDhGNDIwMzc4MjQ0MjAwMDFBRjQyMDM3ODk5Cis6MTA1OEYwMDA4RjQyMDM3ODhGODIwMTIwOEZBQTAwMkNBRkEyMDAxMDY0Cis6MTA1OTAwMDA4RjgyMDEyNDNDMDQwMDAxMjQ4NDYzNzAzQzA1MDAwOTVCCis6MTA1OTEwMDBBRkEyMDAxNDhENDYwMDAwMzRBNTA3MDAwQzAwMkIzQkZECis6MTA1OTIwMDAwM0MwMzgyMThGNDIwMkI0MjQ0MjAwMDFBRjQyMDJCNEM2Cis6MTA1OTMwMDA4RjQyMDJCNDhGNDIwMkY0MjQ0MjAwMDFBRjQyMDJGNENCCis6MTA1OTQwMDA4RjQyMDJGNDhGQkYwMDQ4OEZCRTAwNDQ4RkI1MDA0MEU1Cis6MTA1OTUwMDA4RkIzMDAzQzhGQjIwMDM4OEZCMTAwMzQ4RkIwMDAzMDZECis6MTA1OTYwMDAwM0UwMDAwODI3QkQwMDUwMjdCREZGQTAwMDgwMTAyMUU0Cis6MTA1OTcwMDBBRkIwMDA0MDI0NTAwMDAyMDIwMDIwMjEyNDA1MDAwNkEwCis6MTA1OTgwMDBBRkIxMDA0NDAwNDA4ODIxQUZCRjAwNThBRkJFMDA1NDAzCis6MTA1OTkwMDBBRkI1MDA1MEFGQjMwMDRDMEMwMDI0MENBRkIyMDA0OEMwCis6MTA1OUEwMDAzMDQ4MDA3RjAwMDgxMEMwMDJFMjEwMjEzQzA2MDAwMUQwCis6MTA1OUIwMDAwMEMyMzAyMTk0QzYzMEQwMTBDMDAwMUMwMDAwMzgyMTM1Cis6MTA1OUMwMDAzQzBBMDAwMTM1NEEzNEQyOTYyOTAwMDIwMDA2MTBDMDc0Cis6MTA1OUQwMDAwMDU3MjAyMTAwOEEyMDIxOTQ4MjAwMDAxNDQ5MDAwOUU4Cis6MTA1OUUwMDAwMDAwMjgyMTk0ODMwMDAyOTYwMjAwMDIxNDYyMDAwNjNGCis6MTA1OUYwMDAwMEEwMTAyMTk0ODIwMDA0OTYwMzAwMDQwMDQzMTAyNkE2Cis6MTA1QTAwMDAyQzQ1MDAwMTAwQTAxMDIxMTQ0MDAwMDgwMDA2MTBDMDIxCis6MTA1QTEwMDAwMEMwMzgyMTAyRTIxMDIxM0MwNjAwMDEwMEMyMzAyMTAyCis6MTA1QTIwMDA5NEM2MzREMDE0QzBGRkVBMDAwNjEwQzAxNEMwMDAxMUEwCis6MTA1QTMwMDBBRkE3MDAyODAwMDgxMEMwMDJFMjEwMjFBRkE4MDAxMDk0Cis6MTA1QTQwMDAzQzAxMDAwMTAwMjIwODIxOTQyMjMwRDAzQzA0MDAwMUQ2Cis6MTA1QTUwMDAyNDg0NjNBQ0FGQTIwMDE0OEUyNjAwMDA4RTI3MDAwNEJECis6MTA1QTYwMDAzQzA1MDAwNDBDMDAyQjNCMzRBNTA5MDAxMDAwMDA3NTE4Cis6MTA1QTcwMDAzQzAyMDgwMDEwRTAwMDBDMDAwNjEwQzAwMkUyMTAyMUY5Cis6MTA1QTgwMDAzQzAzMDAwMTAwNjIxODIxOTQ2MzM0RDAwMDA3MTBDMDY5Cis6MTA1QTkwMDAwMkUyMTAyMTNDMDEwMDAxMDAyMjA4MjFBNDIzMzREMDlECis6MTA1QUEwMDAxMDAwMDAwQjNDMDQwMDAxMDJFMjEwMjEzQzAzMDAwMTQ1Cis6MTA1QUIwMDAwMDYyMTgyMTk0NjMzNEQwMDAwODEwQzAwMkUyMTAyMTYzCis6MTA1QUMwMDAzQzAxMDAwMTAwMjIwODIxQTQyMzMwRDAzQzA0MDAwMTQ1Cis6MTA1QUQwMDAzNDg0MzBEMDhGNDMwMTAwMDAwNjEwQzAwMkUyMTAyMTUwCis6MTA1QUUwMDAzQzAxMDAwMTAwMjIwODIxQTQyMzM0RDA4RjQyMDEwNDhDCis6MTA1QUYwMDAwMkU0MzgyMTAwMDAyODIxMTg0MDAwMjlBRjQ2MDEwMEE3Cis6MTA1QjAwMDAyNEU2MDAwNjk0QzNGRkZDOTYwMjAwMDAxNDYyMDAwOTFDCis6MTA1QjEwMDAwMDAwMjAyMTk0QzNGRkZFOTYwMjAwMDIxNDYyMDAwNkRBCis6MTA1QjIwMDAwMDgwMTAyMTk0QzIwMDAwOTYwMzAwMDQwMDQzMTAyNjU4Cis6MTA1QjMwMDAyQzQ0MDAwMTAwODAxMDIxNTA0MDAwMTQyNEE1MDAwMUQ1Cis6MTA1QjQwMDA4RjQyMDEwNDI0NDJGRkZGMDBBMjEwMkExMDQwMDAwQkU0Cis6MTA1QjUwMDAyNEU0MDAwNDk0ODIwMDA2OEM4MzAwMDhBNDgyRkZGRUUzCis6MTA1QjYwMDBBQzgzMDAwMDhGNDIwMTA0MjRBNTAwMDEyNDQyRkZGRjAyCis6MTA1QjcwMDAwMEEyMTAyQTE0NDBGRkY3MjQ4NDAwMDg4RjQyMDEwNDc5Cis6MTA1QjgwMDAyNDQyRkZGRjEwMDAwMDA2QUY0MjAxMDQ4RjQyMDEwNENGCis6MTA1QjkwMDAyNEM2MDAwODAwQTIxMDJBMTQ0MEZGREEyNEU3MDAwOEY3Cis6MTA1QkEwMDAwMDA4MTBDMDAyRTIxMDIxM0MwMTAwMDEwMDIyMDgyMTdGCis6MTA1QkIwMDA5NDIyMzBEMDE0NDAwMDIzM0MwMjA4MDAzQzAyMDAwMjMyCis6MTA1QkMwMDAwMkMyMTAyNDEwNDAwMDEyMDAwODIxNDIzQzAzMDAwMUQwCis6MTA1QkQwMDAzNDYzMzhEODI0MDIwMDAzMDA0NDEwMjMwMDAyMTA4MEVDCis6MTA1QkUwMDAwMDU3MjAyMTAwODMyMDIxMDA1NzEwMjEwMDQzMTAyMTVECis6MTA1QkYwMDAzMTA1MDAxRjI0MDMwMDAxOEM0MjAwMDAwMEEzMTgwNDlCCis6MTA1QzAwMDAwMDAzMTgyNzAwNDMxMDI0MTAwMDAwMERBQzgyMDAwMDkwCis6MTA1QzEwMDAyNDAyMDAwMzAwNDQxMDIzMDAwMjEwODAwMDVDMjgyMUFECis6MTA1QzIwMDAwMDVDMTAyMTMxMDQwMDFGMjQwMzAwMDE4QzQyMDIyODczCis6MTA1QzMwMDAwMDgzMTgwNDAwMDMxODI3MDA0MzEwMjRBQ0EyMDIyODk0Cis6MTA1QzQwMDAzQzAyMDgwMDM0NDIyMDAwMDAwMDE4MjFBRkEyMDAyMENFCis6MTA1QzUwMDA4RjVFMDAxODI3QUIwMDIwMjQwMjAwRkYxM0MyMDAwMjUxCis6MTA1QzYwMDBBRkFCMDAzNDI3QzMwMDAxOEMwMjAyMjgwMDYwOTAyMUYyCis6MTA1QzcwMDAxNjQyMDAwRTAwMUUzOEMwOEY0MjAzM0MyNDQyMDAwMTMxCis6MTA1QzgwMDBBRjQyMDMzQzhGNDIwMzNDOEMwMjAyMjgzQzA0MDAwMURCCis6MTA1QzkwMDAyNDg0NjM1QzNDMDUwMDA5QUZBMDAwMTRBRkEyMDAxMDhGCis6MTA1Q0EwMDA4RkE2MDAyMDEwMDAwMDZCMzRBNTA1MDAwMEY3MTAyMTFFCis6MTA1Q0IwMDA4RkEzMDAyMDhGQTQwMDI0QUM0MzA0QzBBQzQ0MDRDNEQwCis6MTA1Q0MwMDA4RjgzMDA1NDhGODIwMDU0MjQ3MDAzRTgwMjAyMTAyMzUzCis6MTA1Q0QwMDAyQzQyMDNFOTEwNDAwMDFCMDAwMDk4MjEwMEUwODgyMUJECis6MTA1Q0UwMDAyNjM1MDRDMDhGNDQwMTc4OEY0NTAxN0MwMjIwMTgyMTlECis6MTA1Q0YwMDAyNDBCMDAwNEFGQUIwMDEwQUZCMjAwMTQ4RjQ4MDAwQ0FGCis6MTA1RDAwMDAwMDAwMTAyMTAyRjUzMDIxQUZBODAwMTg4RjQ4MDEwQ0M3Cis6MTA1RDEwMDAyNDA3MDAwODAwQTMyODIxMDBBMzQ4MkIwMDgyMjAyMThCCis6MTA1RDIwMDAwMTAwRjgwOTAwODkyMDIxNTQ0MDAwMDYyNDEzMDAwMUQ1Cis6MTA1RDMwMDA4RjgyMDA1NDAyMDIxMDIzMkM0MjAzRTkxNDQwRkZFOTMxCis6MTA1RDQwMDAwMDAwMDAwMDMyNjIwMEZGNTQ0MDAwMTdBRjUyMDAxOEZDCis6MTA1RDUwMDA4RjQyMDM3ODI0NDIwMDAxQUY0MjAzNzg4RjQyMDM3OEQ4Cis6MTA1RDYwMDA4RjgyMDEyMDhGQUIwMDM0QUZBMjAwMTA4RjgyMDEyNEZDCis6MTA1RDcwMDAzQzA0MDAwMTI0ODQ2MzY4M0MwNTAwMDlBRkEyMDAxNEMwCis6MTA1RDgwMDA4RDY2MDAwMDEwMDAwMDMzMzRBNTA2MDA4RjQyMDMwODIyCis6MTA1RDkwMDAyNDEzMDAwMTI0NDIwMDAxQUY0MjAzMDg4RjQyMDMwODhDCis6MTA1REEwMDAxMDAwMDAxQzMyNjIwMEZGOEY4MzAwNTQ4RjgyMDA1NDY5Cis6MTA1REIwMDAyNDcwMDNFODAyMDIxMDIzMkM0MjAzRTkxMDQwMDAxNDZGCis6MTA1REMwMDAwMDAwOTgyMTI0MTEwMDEwOEY0MjAwMEM4RjQ0MDE2MEM0Cis6MTA1REQwMDA4RjQ1MDE2NDhGODYwMTIwQUZCMTAwMTBBRkIyMDAxNDZGCis6MTA1REUwMDBBRkEyMDAxODhGNDIwMTBDMjQwNzAwMDgwMDQwRjgwOUY4Cis6MTA1REYwMDAyNEM2MDAxQzE0NDBGRkU1MDAwMDAwMDA4RjgyMDA1NDAwCis6MTA1RTAwMDAwMjAyMTAyMzJDNDIwM0U5MTQ0MEZGRUYwMDAwMDAwMEJGCis6MTA1RTEwMDAzMjYyMDBGRjE0NDAwMDExMDAwMDAwMDA4RjQyMDM3ODNFCis6MTA1RTIwMDAyNDQyMDAwMUFGNDIwMzc4OEY0MjAzNzg4RjgyMDEyMDIxCis6MTA1RTMwMDA4RkFCMDAzNEFGQTIwMDEwOEY4MjAxMjQzQzA0MDAwMTFDCis6MTA1RTQwMDAyNDg0NjM3MDNDMDUwMDA5QUZBMjAwMTQ4RDY2MDAwMDM1Cis6MTA1RTUwMDAzNEE1MDcwMDBDMDAyQjNCMDNDMDM4MjE4RjQyMDJCODQ5Cis6MTA1RTYwMDAyNDQyMDAwMUFGNDIwMkI4OEY0MjAyQjg4RjQyMDJGNENFCis6MTA1RTcwMDAyNDQyMDAwMUFGNDIwMkY0OEY0MjAyRjQ4RkJGMDA1ODY3Cis6MTA1RTgwMDA4RkJFMDA1NDhGQjUwMDUwOEZCMzAwNEM4RkIyMDA0OEM2Cis6MTA1RTkwMDA4RkIxMDA0NDhGQjAwMDQwMDNFMDAwMDgyN0JEMDA2MEQwCis6MTA1RUEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyN0JERkZFMDJGCis6MTA1RUIwMDAyNzY0NDAwMEFGQkYwMDE4MEMwMDJCQTgyNDA1MTAwMDc5Cis6MTA1RUMwMDAzQzAzMDAwMTM0NjMyQ0MwM0MwNDAwMDEzNDg0MkVDODIwCis6MTA1RUQwMDAyNDAyMDAyMEFGODIwMTFDMDJFMzEwMjFBRjgwMDEwMEU4Cis6MTA1RUUwMDBBRjgwMDEwNEFGODAwMTA4QUY4MDAxMTBBRjgwMDExNEMyCis6MTA1RUYwMDBBRjgwMDExOEFGODAwMTIwQUY4MDAxMjRBRjgwMDEyODVFCis6MTA1RjAwMDBBRjgwMDEzMEFGODAwMTM0QUY4MDAxMzhBRjQyMDBFQzg4Cis6MTA1RjEwMDAwMkUzMTAyMUFGNDIwMEYwMDJFNDEwMjFBRjQyMDBGNDhFCis6MTA1RjIwMDAwMkU0MTAyMUFGNDIwMEY4M0MwMjAwMDEwMDU3MTAyMUFBCis6MTA1RjMwMDA5MDQyNDBGNDE0NDAwMDFDM0MwNTAwMDE4RjgyMDExQzdCCis6MTA1RjQwMDAzQzA0MDAwMTI0ODQ2NDcwM0MwNTAwMDEzNDQyMDAwMURCCis6MTA1RjUwMDBBRjgyMDExQ0FGQTAwMDEwQUZBMDAwMTQ4Rjg2MDExQ0ZGCis6MTA1RjYwMDAzNEE1MDEwMDBDMDAyQjNCMDAwMDM4MjE4QzAyMDIxOEU0Cis6MTA1RjcwMDAzMDQyMDA0MDEwNDAwMDE0MDAwMDAwMDA4RjgyMDExQ0RECis6MTA1RjgwMDAzQzA0MDAwMTI0ODQ2NDdDM0MwNTAwMDEzNDQyMDAwNDhDCis6MTA1RjkwMDBBRjgyMDExQ0FGQTAwMDEwQUZBMDAwMTQ4Rjg2MDExQ0JGCis6MTA1RkEwMDAxMDAwMDAwNzM0QTUwMjAwM0MwNDAwMDEyNDg0NjQ4NDJFCis6MTA1RkIwMDBBRkEwMDAxMEFGQTAwMDE0OEY4NjAxMUMzNEE1MDMwMDExCis6MTA1RkMwMDAwQzAwMkIzQjAwMDAzODIxOEZCRjAwMTgwM0UwMDAwOEI1Cis6MTA1RkQwMDAyN0JEMDAyMDhGQTkwMDEwOEY4MzAxMkM4RkFBMDAxNEU5Cis6MTA1RkUwMDA4RkFCMDAxODEwNjAwMDBBMjc2MjRGRTAxNDYyMDAwMkI1Cis6MTA1RkYwMDAyNDY4MDAyMDI3Njg0ODAwOEY4MjAxMjgxMTAyMDAwNENECis6MTA2MDAwMDAwMDAwMDAwMDhGODIwMTI0MTUwMjAwMDcwMDAwMDAwMDNDCis6MTA2MDEwMDA4RjQzMDMzNDAwMDAxMDIxMjQ2MzAwMDFBRjQzMDMzNDk1Cis6MTA2MDIwMDAxMDAwMDAzOThGNDMwMzM0QUM2NDAwMDBBQzY1MDAwNEY5Cis6MTA2MDMwMDBBQzY2MDAwOEE0NjcwMDBFQUM2OTAwMThBQzZBMDAxQ0NFCis6MTA2MDQwMDBBQzZCMDAxMEFDNjIwMDE0QUY4ODAxMjA4RjQyMDBGQ0UyCis6MTA2MDUwMDA4RjQ0MDBGNDI0NDJGRkZGQUY0MjAwRkM4QzgyMDAwMDFBCis6MTA2MDYwMDAxMDQ5MDAwNTMwNDJGRjhGMTA0MDAwMTkzMTIyRkY4Rjg4Cis6MTA2MDcwMDAxMDQwMDAxODNDMDIwMDAxOEM4MzAwMDQyQzYyMDAxMEM4Cis6MTA2MDgwMDAxMDQwMDAxMzNDMDIwMDAxMjQ2MzAwMDFBQzgzMDAwNEIzCis6MTA2MDkwMDA4RjQzMDBGODM0NDIzMEM4MDJFMjEwMjE1NDYyMDAwNEY5Cis6MTA2MEEwMDAyNDYyMDAwODNDMDIwMDAxMzQ0MjJFQzgwMkUyMTAyMUEyCis6MTA2MEIwMDAxNDQ0MDAxNTI0MDIwMDAxOEY4MjAxMjgyNDQyMDAyMDhDCis6MTA2MEMwMDBBRjgyMDEyODhGODIwMTI4MTAwMDAwMEYyNDAyMDAwMUY2Cis6MTA2MEQwMDAzQzAyMDAwMTM0NDIzMEM4MDJFMjEwMjE1NDgyMDAwNDI0Cis6MTA2MEUwMDAyNDgyMDAwODNDMDIwMDAxMzQ0MjJFQzgwMkUyMTAyMTQyCis6MTA2MEYwMDAwMDQwMjAyMTI0MDIwMDAxQUY0NDAwRjRBQzg5MDAwMERDCis6MTA2MTAwMDBBQzgyMDAwNDI0MDIwMDAxMDNFMDAwMDgwMDAwMDAwMDRCCis6MTA2MTEwMDAwM0UwMDAwODAwMDAwMDAwOEZBOTAwMTA4RjgzMDEwQzJECis6MTA2MTIwMDA4RkFBMDAxNDhGQUIwMDE4MTA2MDAwMEEyNzYyNDdFMEE2Cis6MTA2MTMwMDAxNDYyMDAwMjI0NjgwMDIwMjc2ODQwMDA4RjgyMDEwODUyCis6MTA2MTQwMDAxMTAyMDAwNDAwMDAwMDAwOEY4MjAxMDQxNTAyMDAwNzA0Cis6MTA2MTUwMDAwMDAwMDAwMDhGNDMwMzM4MDAwMDEwMjEyNDYzMDAwMTc5Cis6MTA2MTYwMDBBRjQzMDMzODEwMDAwMDM1OEY0MzAzMzhBQzY0MDAwMEEwCis6MTA2MTcwMDBBQzY1MDAwNEFDNjYwMDA4QTQ2NzAwMEVBQzY5MDAxOEFBCis6MTA2MTgwMDBBQzZBMDAxQ0FDNkIwMDEwQUM2MjAwMTRBRjg4MDEwMDVDCis6MTA2MTkwMDA4RjQ0MDBFQzhDODIwMDAwMzA0MjAwMDYxMDQwMDAxOTUxCis6MTA2MUEwMDAzMTIyMDAwNjEwNDAwMDE4M0MwMjAwMDE4QzgzMDAwNERDCis6MTA2MUIwMDAyQzYyMDAxMDEwNDAwMDEzM0MwMjAwMDEyNDYzMDAwMTE3Cis6MTA2MUMwMDBBQzgzMDAwNDhGNDMwMEYwMzQ0MjJFQzAwMkUyMTAyMTYxCis6MTA2MUQwMDA1NDYyMDAwNDI0NjIwMDA4M0MwMjAwMDEzNDQyMkNDMEQ2Cis6MTA2MUUwMDAwMkUyMTAyMTE0NDQwMDE1MjQwMjAwMDE4RjgyMDEwOEVDCis6MTA2MUYwMDAyNDQyMDAyMEFGODIwMTA4OEY4MjAxMDgxMDAwMDAwRkE2Cis6MTA2MjAwMDAyNDAyMDAwMTNDMDIwMDAxMzQ0MjJFQzAwMkUyMTAyMUFGCis6MTA2MjEwMDA1NDgyMDAwNDI0ODIwMDA4M0MwMjAwMDEzNDQyMkNDMDU1Cis6MTA2MjIwMDAwMkUyMTAyMTAwNDAyMDIxMjQwMjAwMDFBRjQ0MDBFQ0QyCis6MTA2MjMwMDBBQzg5MDAwMEFDODIwMDA0MjQwMjAwMDEwM0UwMDAwOEU1Cis6MTA2MjQwMDAwMDAwMDAwMDAzRTAwMDA4MDAwMDAwMDAyN0JERkZEOEE4Cis6MTA2MjUwMDAzQzA0MDAwMTI0ODQ2NDhDM0MwNTAwMDFBRkJGMDAyNDkxCis6MTA2MjYwMDBBRkIyMDAyMEFGQjEwMDFDQUZCMDAwMTg4RjkwMDEwNDk2Cis6MTA2MjcwMDA4RjkxMDBCMDhGOTIwMTFDMzRBNTI1MDA4RjgyMDEwMDAwCis6MTA2MjgwMDAwMjQwMzAyMTAyMjAzODIxQUZBMjAwMTAwQzAwMkIzQjJECis6MTA2MjkwMDBBRkIwMDAxNDhFMDIwMDA4QUZBMjAwMTA4RTAyMDAwQ0Y2Cis6MTA2MkEwMDAzQzA0MDAwMTI0ODQ2NDk4QUZBMjAwMTQ4RTA2MDAwMDEwCis6MTA2MkIwMDA4RTA3MDAwNDNDMDUwMDAxMEMwMDJCM0IzNEE1MjUxMDgzCis6MTA2MkMwMDA4RTAyMDAxOEFGQTIwMDEwOEUwMjAwMUMzQzA0MDAwMUQ4Cis6MTA2MkQwMDAyNDg0NjRBNEFGQTIwMDE0OEUwNjAwMTA4RTA3MDAxNDVDCis6MTA2MkUwMDAzQzA1MDAwMTBDMDAyQjNCMzRBNTI1MjAzQzAyN0YwMDFGCis6MTA2MkYwMDAwMjIyMTAyNDNDMDMwODAwNTQ0MzAwMTYzQzAzMDIwMDExCis6MTA2MzAwMDA4RjgyMDA5QzMwNDJGRkZGMTQ0MDAwMTIzQzAzMDIwMEM5Cis6MTA2MzEwMDAzQzA0MDAwMTI0ODQ2NEIwM0MwNTAwMDIzNEE1RjAzMDQ0Cis6MTA2MzIwMDAwMDAwMzAyMTAwMDAzODIxMzY0MjAwMDJBRjgyMDExQ0ZCCis6MTA2MzMwMDAzNjIyMDAwMUFGODIwMEIwQUY5MDAxMDRBRjkyMDExQzgxCis6MTA2MzQwMDBBRkEwMDAxMDBDMDAyQjNCQUZBMDAwMTQxMDAwMDAyNEU1Cis6MTA2MzUwMDAwMDAwMDAwMDAyQzMxMDI0MTA0MDAwMEQwMjIzMTAyNDhFCis6MTA2MzYwMDAxMDQwMDAwQjM2NDIwMDAyQUY4MjAxMUMzNjIyMDAwMUIxCis6MTA2MzcwMDBBRjgyMDBCMEFGOTAwMTA0QUY5MjAxMUM4RjQyMDMzMDk2Cis6MTA2MzgwMDAyNDQyMDAwMUFGNDIwMzMwMTAwMDAwMTU4RjQyMDMzMDU5Cis6MTA2MzkwMDAzQzA0MDAwMTI0ODQ2NEI4MjQwMjAyQTlBRkEyMDAxMEM2Cis6MTA2M0EwMDBBRkEwMDAxNDhGODYwMTQ0M0MwNzAwMDEyNEU3NjRDMEJECis6MTA2M0IwMDAwQzAwMkIzQjM0MDVERUFEOEY4MjAxMUMzNDQyMDAwMjAxCis6MTA2M0MwMDBBRjgyMDExQzhGODIwMjIwMzQ0MjAwMDRBRjgyMDIyMDdGCis6MTA2M0QwMDA4RjgyMDE0MDNDMDMwMDAxMDA0MzEwMjVBRjgyMDE0MDQxCis6MTA2M0UwMDA4RkJGMDAyNDhGQjIwMDIwOEZCMTAwMUM4RkIwMDAxODI3Cis6MTA2M0YwMDAwM0UwMDAwODI3QkQwMDI4MjdCREZGRDgzQzA0MDAwMUFBCis6MTA2NDAwMDAyNDg0NjRFODNDMDUwMDAxQUZCRjAwMjRBRkIyMDAyMDQzCis6MTA2NDEwMDBBRkIxMDAxQ0FGQjAwMDE4OEY5MDAxMjQ4RjkxMDBBMDg1Cis6MTA2NDIwMDA4RjkyMDExQzM0QTUyNjAwOEY4MjAxMjAwMjQwMzAyMTZBCis6MTA2NDMwMDAwMjIwMzgyMUFGQTIwMDEwMEMwMDJCM0JBRkIwMDAxNDlCCis6MTA2NDQwMDA4RTAyMDAwOEFGQTIwMDEwOEUwMjAwMEMzQzA0MDAwMTc2Cis6MTA2NDUwMDAyNDg0NjRGNEFGQTIwMDE0OEUwNjAwMDA4RTA3MDAwNEFBCis6MTA2NDYwMDAzQzA1MDAwMTBDMDAyQjNCMzRBNTI2MTA4RTAyMDAxOEMxCis6MTA2NDcwMDBBRkEyMDAxMDhFMDIwMDFDM0MwNDAwMDEyNDg0NjUwMEMxCis6MTA2NDgwMDBBRkEyMDAxNDhFMDYwMDEwOEUwNzAwMTQzQzA1MDAwMTE4Cis6MTA2NDkwMDAwQzAwMkIzQjM0QTUyNjIwM0MwMjdGMDAwMjIyMTAyNDU2Cis6MTA2NEEwMDAzQzAzMDgwMDU0NDMwMDE2M0MwMzAyMDA4RjgyMDBBQ0ZBCis6MTA2NEIwMDAzMDQyRkZGRjE0NDAwMDEyM0MwMzAyMDAzQzA0MDAwMTg0Cis6MTA2NEMwMDAyNDg0NjUwQzNDMDUwMDAxMzRBNUYwMzAwMDAwMzAyMTI3Cis6MTA2NEQwMDAwMDAwMzgyMTM2NDIwMDAyQUY4MjAxMUMzNjIyMDAwMTQyCis6MTA2NEUwMDBBRjgyMDBBMEFGOTAwMTI0QUY5MjAxMUNBRkEwMDAxMEJBCis6MTA2NEYwMDAwQzAwMkIzQkFGQTAwMDE0MTAwMDAwMjQwMDAwMDAwMDkzCis6MTA2NTAwMDAwMkMzMTAyNDEwNDAwMDBEMDIyMzEwMjQxMDQwMDAwQjgxCis6MTA2NTEwMDAzNjQyMDAwMkFGODIwMTFDMzYyMjAwMDFBRjgyMDBBMDg5Cis6MTA2NTIwMDBBRjkwMDEyNEFGOTIwMTFDOEY0MjAzMkMyNDQyMDAwMTQyCis6MTA2NTMwMDBBRjQyMDMyQzEwMDAwMDE1OEY0MjAzMkMzQzA0MDAwMUQ1Cis6MTA2NTQwMDAyNDg0NjRCODI0MDIwMkUyQUZBMjAwMTBBRkEwMDAxNEI5Cis6MTA2NTUwMDA4Rjg2MDE0NDNDMDcwMDAxMjRFNzY0QzAwQzAwMkIzQkZDCis6MTA2NTYwMDAzNDA1REVBRDhGODIwMTFDMzQ0MjAwMDJBRjgyMDExQzczCis6MTA2NTcwMDA4RjgyMDIyMDM0NDIwMDA0QUY4MjAyMjA4RjgyMDE0MEM5Cis6MTA2NTgwMDAzQzAzMDAwMTAwNDMxMDI1QUY4MjAxNDA4RkJGMDAyNDZGCis6MTA2NTkwMDA4RkIyMDAyMDhGQjEwMDFDOEZCMDAwMTgwM0UwMDAwOEZDCis6MTA2NUEwMDAyN0JEMDAyODAwMDA2MDIxMDAwMDUwMjEwMDAwMzAyMTlDCis6MTA2NUIwMDAwMDAwMjgyMTAwMDA2ODIxMDAwMDQ4MjEwMDAwNzgyMTA3Cis6MTA2NUMwMDAwMDAwNzAyMThGODgwMTI0OEY4NzAxMDQxNTgwMDAyRTIwCis6MTA2NUQwMDA4RjhCMDExQzExQTAwMDE0MzE2MjA4MDA4RjgyMDEyMEYyCis6MTA2NUUwMDAxMDQ2MDAyOTAwMDAwMDAwM0MwNDAwMDE4Qzg0NkVFNDg5Cis6MTA2NUYwMDA4Q0MyMDAwMDhDQzMwMDA0QUM4MjAwMDBBQzgzMDAwNDk5Cis6MTA2NjAwMDA4Q0MyMDAwOEFDODIwMDA4OTRDMjAwMEVBNDgyMDAwRTY2Cis6MTA2NjEwMDA4Q0MyMDAxMDI0MEMwMDAxQUM4MjAwMTA4Q0MyMDAxNDRCCis6MTA2NjIwMDAxMDAwMDAxMjI0QzYwMDIwMTA0MDAwMTcwMDAwMDAwMEQ3Cis6MTA2NjMwMDAzQzA0MDAwMThDODQ2RUU0OEQwMjAwMDA4RDAzMDAwNDk0Cis6MTA2NjQwMDBBQzgyMDAwMEFDODMwMDA0OEQwMjAwMDhBQzgyMDAwODFDCis6MTA2NjUwMDA5NTAyMDAwRUE0ODIwMDBFOEQwMjAwMTAyNTA2MDAyMDc3Cis6MTA2NjYwMDBBQzgyMDAxMDhEMDIwMDE0MjQwQzAwMDEwMEMwMTgyMTFGCis6MTA2NjcwMDBBQzgyMDAxNDI3NjI0RkUwMDA0MzEwMkI1NDQwMDAwMTBECis6MTA2NjgwMDAyNzYzNDgwMDAwNjAzMDIxMTU0MDAwMkYzMTYyMDEwMDZGCis6MTA2NjkwMDAxMTIwMDAxNDMxNjI4MDAwOEY4MjAxMDAxMDQ1MDAyQTExCis6MTA2NkEwMDAzMTYyMDEwMDNDMDQwMDAxOEM4NDZFRTA4Q0EyMDAwMDg5Cis6MTA2NkIwMDA4Q0EzMDAwNEFDODIwMDAwQUM4MzAwMDQ4Q0EyMDAwODEwCis6MTA2NkMwMDBBQzgyMDAwODk0QTIwMDBFQTQ4MjAwMEU4Q0EyMDAxMERFCis6MTA2NkQwMDAyNDBBMDAwMUFDODIwMDEwOENBMjAwMTQxMDAwMDAxMkU5Cis6MTA2NkUwMDAyNEE1MDAyMDEwNDAwMDE4MzE2MjAxMDAzQzA0MDAwMTg0Cis6MTA2NkYwMDA4Qzg0NkVFMDhDRTIwMDAwOENFMzAwMDRBQzgyMDAwMDJECis6MTA2NzAwMDBBQzgzMDAwNDhDRTIwMDA4QUM4MjAwMDg5NEUyMDAwRTI2Cis6MTA2NzEwMDBBNDgyMDAwRThDRTIwMDEwMjRFNTAwMjBBQzgyMDAxMDYwCis6MTA2NzIwMDA4Q0UyMDAxNDI0MEEwMDAxMDBBMDE4MjFBQzgyMDAxNDlECis6MTA2NzMwMDAyNzYyNDdFMDAwNDMxMDJCNTQ0MDAwMDEyNzYzNDAwMENDCis6MTA2NzQwMDAwMDYwMjgyMTMxNjIwMTAwNTQ0MDAwMUQzMTYyMTAwMEI4Cis6MTA2NzUwMDAxMUEwMDAwOTMxQTIwODAwMTA0MDAwMDQyNTAyMDAyMDA5Cis6MTA2NzYwMDA4RjgyMDBBOEE1RTIwMDAwMjUwMjAwMjBBRjgyMDEyNDRDCis6MTA2NzcwMDA4Rjg4MDEyNDAwMDA2ODIxMTE4MDAwMTEzMTYyMTAwMDBGCis6MTA2NzgwMDAzQzA0MDAwMThDODQ2RUU0OEM4MjAwMDA4QzgzMDAwNDQ1Cis6MTA2NzkwMDBBRjgyMDA4MEFGODMwMDg0OEM4MjAwMDhBRjgyMDBBNEE3Cis6MTA2N0EwMDA5NDgyMDAwRUFGODIwMEFDOEM4MjAwMTAwMDAwNjAyMTQ5Cis6MTA2N0IwMDBBRjgyMDBBMDhDOEQwMDEwOEM4RjAwMTQzMTYyMTAwMDBECis6MTA2N0MwMDAxNDQwRkY4MjAwMDAwMDAwMTEyMDAwMEYzMTIyMDgwMDU5Cis6MTA2N0QwMDAxMDQwMDAwNDNDMDIwMDAyOEY4MjAwQjhBNUMyMDAwMEY1Cis6MTA2N0UwMDAzQzAyMDAwMjAxMjIxMDI0MTA0MDAwMDQyNEUyMDAyMDk4Cis6MTA2N0YwMDA4RjgyMDBCNEFGODIwMEQ0MjRFMjAwMjBBRjgyMDEwNDczCis6MTA2ODAwMDA4Rjg3MDEwNDAwMDA0ODIxMTE0MEZGNzAwMDAwMDAwMDQ0Cis6MTA2ODEwMDAzQzA0MDAwMThDODQ2RUUwOEM4MjAwMDA4QzgzMDAwNEI4Cis6MTA2ODIwMDBBRjgyMDA5MEFGODMwMDk0OEM4MjAwMDhBRjgyMDBCNEU2Cis6MTA2ODMwMDA5NDgyMDAwRUFGODIwMDlDOEM4MjAwMTAwMDAwNTAyMUQ4Cis6MTA2ODQwMDBBRjgyMDBCMDhDODkwMDEwMTAwMEZGNjA4QzhFMDAxNEE1Cis6MTA2ODUwMDAwM0UwMDAwODAwMDAwMDAwMDAwMDYwMjEwMDAwNTgyMTUzCis6MTA2ODYwMDAwMDAwMzAyMTAwMDAyODIxMDAwMDY4MjEwMDAwNTAyMTk0Cis6MTA2ODcwMDAwMDAwNzgyMTAwMDA3MDIxOEY4ODAxMjQ4Rjg3MDEwNDk3Cis6MTA2ODgwMDAzQzE4MDEwMDE1ODAwMDJFOEY4OTAxMUMxMUEwMDAxNEY2Cis6MTA2ODkwMDAzMTIyMDgwMDhGODIwMTIwMTA0NjAwMjkwMDAwMDAwMEVDCis6MTA2OEEwMDAzQzA0MDAwMThDODQ2RUU0OENDMjAwMDA4Q0MzMDAwNEE0Cis6MTA2OEIwMDBBQzgyMDAwMEFDODMwMDA0OENDMjAwMDhBQzgyMDAwOEVCCis6MTA2OEMwMDA5NEMyMDAwRUE0ODIwMDBFOENDMjAwMTAyNDBDMDAwMUExCis6MTA2OEQwMDBBQzgyMDAxMDhDQzIwMDE0MTAwMDAwMTIyNEM2MDAyMEVDCis6MTA2OEUwMDAxMDQwMDAxNzAwMDAwMDAwM0MwNDAwMDE4Qzg0NkVFNDlFCis6MTA2OEYwMDA4RDAyMDAwMDhEMDMwMDA0QUM4MjAwMDBBQzgzMDAwNDE0Cis6MTA2OTAwMDA4RDAyMDAwOEFDODIwMDA4OTUwMjAwMEVBNDgyMDAwRUUxCis6MTA2OTEwMDA4RDAyMDAxMDI1MDYwMDIwQUM4MjAwMTA4RDAyMDAxNEFDCis6MTA2OTIwMDAyNDBDMDAwMTAwQzAxODIxQUM4MjAwMTQyNzYyNEZFMDQzCis6MTA2OTMwMDAwMDQzMTAyQjU0NDAwMDAxMjc2MzQ4MDAwMDYwMzAyMUMxCis6MTA2OTQwMDAxNTYwMDAyRjMxMjIwMTAwMTE0MDAwMTQzMTIyODAwMDE3Cis6MTA2OTUwMDA4RjgyMDEwMDEwNDUwMDJBMzEyMjAxMDAzQzA0MDAwMTExCis6MTA2OTYwMDA4Qzg0NkVFMDhDQTIwMDAwOENBMzAwMDRBQzgyMDAwMDNBCis6MTA2OTcwMDBBQzgzMDAwNDhDQTIwMDA4QUM4MjAwMDg5NEEyMDAwRTM0Cis6MTA2OTgwMDBBNDgyMDAwRThDQTIwMDEwMjQwQjAwMDFBQzgyMDAxMDI3Cis6MTA2OTkwMDA4Q0EyMDAxNDEwMDAwMDEyMjRBNTAwMjAxMDQwMDAxODQyCis6MTA2OUEwMDAzMTIyMDEwMDNDMDQwMDAxOEM4NDZFRTA4Q0UyMDAwMDg2Cis6MTA2OUIwMDA4Q0UzMDAwNEFDODIwMDAwQUM4MzAwMDQ4Q0UyMDAwODhECis6MTA2OUMwMDBBQzgyMDAwODk0RTIwMDBFQTQ4MjAwMEU4Q0UyMDAxMDVCCis6MTA2OUQwMDAyNEU1MDAyMEFDODIwMDEwOENFMjAwMTQyNDBCMDAwMTlFCis6MTA2OUUwMDAwMEEwMTgyMUFDODIwMDE0Mjc2MjQ3RTAwMDQzMTAyQjVFCis6MTA2OUYwMDA1NDQwMDAwMTI3NjM0MDAwMDA2MDI4MjEzMTIyMDEwMDNCCis6MTA2QTAwMDA1NDQwMDAxRDMxMjIxMDAwMTFBMDAwMDkzMUEyMDgwMERECis6MTA2QTEwMDAxMDQwMDAwNDI1MDIwMDIwOEY4MjAwQThBNUUyMDAwMDlCCis6MTA2QTIwMDAyNTAyMDAyMEFGODIwMTI0OEY4ODAxMjQwMDAwNjgyMTA0Cis6MTA2QTMwMDAxMTgwMDAxMTMxMjIxMDAwM0MwNDAwMDE4Qzg0NkVFNEFFCis6MTA2QTQwMDA4QzgyMDAwMDhDODMwMDA0QUY4MjAwODBBRjgzMDA4NEJFCis6MTA2QTUwMDA4QzgyMDAwOEFGODIwMEE0OTQ4MjAwMEVBRjgyMDBBQzRBCis6MTA2QTYwMDA4QzgyMDAxMDAwMDA2MDIxQUY4MjAwQTA4QzhEMDAxMDhECis6MTA2QTcwMDA4QzhGMDAxNDMxMjIxMDAwMTQ0MDAwMjIwMDAwMDAwMDBFCis6MTA2QTgwMDAxMTQwMDAwRjMxNDIwODAwMTA0MDAwMDQzQzAyMDAwMjk3Cis6MTA2QTkwMDA4RjgyMDBCOEE1QzIwMDAwM0MwMjAwMDIwMTQyMTAyNDBGCis6MTA2QUEwMDAxMDQwMDAwNDI0RTIwMDIwOEY4MjAwQjRBRjgyMDBENEEyCis6MTA2QUIwMDAyNEUyMDAyMEFGODIwMTA0OEY4NzAxMDQwMDAwNTAyMUVFCis6MTA2QUMwMDAxMTYwMDAxMDAwMDAwMDAwM0MwNDAwMDE4Qzg0NkVFMEE2Cis6MTA2QUQwMDA4QzgyMDAwMDhDODMwMDA0QUY4MjAwOTBBRjgzMDA5NDBFCis6MTA2QUUwMDA4QzgyMDAwOEFGODIwMEI0OTQ4MjAwMEVBRjgyMDA5Q0JBCis6MTA2QUYwMDA4QzgyMDAxMDAwMDA1ODIxQUY4MjAwQjA4QzhBMDAxMEY4Cis6MTA2QjAwMDA4QzhFMDAxNDhGODIwMDcwM0MwMzEwMDAwMDQzMTAyNDEwCis6MTA2QjEwMDAxMDQwRkY1QzAwMDAwMDAwOEY4MjAwNTQyNDQyMDAwNUZBCis6MTA2QjIwMDBBRjgyMDA3ODhDMDQwMjM0MTA4MDAwMTYwMDAwMTgyMTE3Cis6MTA2QjMwMDAzQzAyMDAwMTAwNTcxMDIxOEM0MjQwRTgyNDQyMDAwNTJECis6MTA2QjQwMDAzQzAxMDAwMTAwMzcwODIxQUMyMjQwRTgzQzAyMDAwMTcyCis6MTA2QjUwMDAwMDU3MTAyMThDNDI0MEU4MDA0NDEwMkIxNDQwMDAwOURCCis6MTA2QjYwMDAyNDAyMDAwMTNDMDMwMDgwM0MwMTAwMDEwMDM3MDgyMUExCis6MTA2QjcwMDBBQzIwNDBFODNDMDEwMDAxMDAzNzA4MjExMDAwMDAwQzY3Cis6MTA2QjgwMDBBMDIyNDBGMDNDMDIwMDAxMDA1NzEwMjE5MDQyNDBGMDRBCis6MTA2QjkwMDAxNDQwMDAwNjNDMDIwMDgwM0MwMjAwMDEwMDU3MTAyMTE2Cis6MTA2QkEwMDA5MDQyNDBGMTEwNDAwMDAyM0MwMjAwODAwMDYyMTgyNTMzCis6MTA2QkIwMDA4QzA0MDIzMDEwODAwMDEzMDAwMDAwMDAzQzAyMDAwMTMxCis6MTA2QkMwMDAwMDU3MTAyMThDNDI0MEVDMjQ0MjAwMDUzQzAxMDAwMTlBCis6MTA2QkQwMDAwMDM3MDgyMUFDMjI0MEVDM0MwMjAwMDEwMDU3MTAyMTk0Cis6MTA2QkUwMDA4QzQyNDBFQzAwNDQxMDJCMTQ0MDAwMDYwMDAwMDAwMEQyCis6MTA2QkYwMDAzQzAxMDAwMTAwMzcwODIxQUMyMDQwRUMxMDAwMDAwNkU5Cis6MTA2QzAwMDAwMDc4MTgyNTNDMDIwMDAxMDA1NzEwMjE5MDQyNDBGMjA0Cis6MTA2QzEwMDA1NDQwMDAwMTAwNzgxODI1MTA2MEZGMUEwMDAwMDAwMEExCis6MTA2QzIwMDA4RjQyMDAwMDEwNDAwMDA3MDAwMDAwMDBBRjgwMDA0Q0MxCis6MTA2QzMwMDA4RjgyMDA0QzEwNDBGRkZEMDAwMDAwMDAxMDAwMDAwNTk2Cis6MTA2QzQwMDAwMDAwMDAwMEFGODAwMDQ4OEY4MjAwNDgxMDQwRkZGRDI4Cis6MTA2QzUwMDAwMDAwMDAwMDhGODIwMDYwMDA0MzEwMjVBRjgyMDA2MEJBCis6MTA2QzYwMDA4RjQyMDAwMDEwNDAwMDAzMDAwMDAwMDAxMDAwRkYwNUVDCis6MTA2QzcwMDBBRjgwMDA0QzEwMDBGRjAzQUY4MDAwNDgwM0UwMDAwODI1Cis6MTA2QzgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAzQzAyMDAwMUM1Cis6MTA2QzkwMDA4QzQyNkQyODI3QkRGRkU4QUZCRjAwMTQxNDQwMDAxMkRFCis6MTA2Q0EwMDBBRkIwMDAxMDNDMTAwMDAxMjYxMDZGOTAwMjAwMjAyMUIwCis6MTA2Q0IwMDAwQzAwMkJBODI0MDUyMDAwMjYwMjFGRTAzQzAxMDAwMTQ3Cis6MTA2Q0MwMDBBQzIyNkVFQzNDMDEwMDAxQUMyMjZFRThBQzAyMDI1MDNBCis6MTA2Q0QwMDAyNDAyMjAwMEFDMTAwMjU0QUMwMjAyNTgyNDAyMDAwMTJECis6MTA2Q0UwMDAzQzAxMDAwMUFDMjI2RDI4OEZCRjAwMTQ4RkIwMDAxMDUyCis6MTA2Q0YwMDAwM0UwMDAwODI3QkQwMDE4M0MwOTAwMDE4RDI5NkVFQzU3Cis6MTA2RDAwMDA4QzgyMDAwMDhGQTMwMDEwOEZBODAwMTRBRDIyMDAwMDE5Cis6MTA2RDEwMDA4QzgyMDAwNEFEMjUwMDA4QUQyMjAwMDQ4RjgyMDA1NDRGCis6MTA2RDIwMDBBRDI2MDAxMEFEMjcwMDE0QUQyMzAwMThBRDI4MDAxQ0JGCis6MTA2RDMwMDBBRDIyMDAwQzI1MjlGRkUwM0MwMjAwMDEyNDQyNkY5MEE3Cis6MTA2RDQwMDAwMTIyMTAyQjEwNDAwMDAzMDAwMDAwMDAzQzA5MDAwMTRDCis6MTA2RDUwMDA4RDI5NkVFODNDMDIwMDAxOEM0MjZEMTBBRDIyMDAwMENFCis6MTA2RDYwMDAzQzAyMDAwMThDNDI2RDEwM0MwMTAwMDFBQzI5NkVFQzJDCis6MTA2RDcwMDBBRDIyMDAwNEFDMDkwMjUwMDNFMDAwMDgwMDAwMDAwMDRFCis6MTA2RDgwMDAyN0JERkZEMEFGQjAwMDEwM0MxMDAwMDE4RTEwNkVFQzlDCis6MTA2RDkwMDAzQzAyMDAwMThDNDI2RDEwQUZCMTAwMTQwMDgwODgyMUNDCis6MTA2REEwMDBBRkJFMDAyNDhGQkUwMDQwOEZBNDAwNDhBRkIyMDAxOEQxCis6MTA2REIwMDAwMEEwOTAyMUFGQkYwMDI4QUZCNTAwMjBBRkIzMDAxQ0VBCis6MTA2REMwMDBBRTAyMDAwMDNDMDIwMDAxOEM0MjZEMTAwMEMwOTgyMTEwCis6MTA2REQwMDAwMEUwQTgyMTEwODAwMDA2QUUwMjAwMDQyNjA1MDAwODhECis6MTA2REUwMDAwQzAwMkJCMzI0MDYwMDE4MTAwMDAwMDUyNjEwRkZFMDRECis6MTA2REYwMDAyNjA0MDAwODBDMDAyQkE4MjQwNTAwMTgyNjEwRkZFMDJDCis6MTA2RTAwMDAzQzAzMDAwMTI0NjM2RjkwMDIwMzEwMkIxMDQwMDAwMzI5Cis6MTA2RTEwMDAwMDAwMDAwMDNDMTAwMDAxOEUxMDZFRTg4RTIyMDAwMDgxCis6MTA2RTIwMDBBRTAyMDAwMDhFMjIwMDA0QUUxMjAwMDhBRTAyMDAwNDgyCis6MTA2RTMwMDA4RjgyMDA1NEFFMTMwMDEwQUUxNTAwMTRBRTFFMDAxODYxCis6MTA2RTQwMDA4RkE4MDA0NEFFMDgwMDFDQUUwMjAwMEMyNjEwRkZFMDI0Cis6MTA2RTUwMDAwMjAzMTAyQjEwNDAwMDAzMDAwMDAwMDAzQzEwMDAwMTUyCis6MTA2RTYwMDA4RTEwNkVFODNDMDIwMDAxOEM0MjZEMTBBRTAyMDAwMEY0Cis6MTA2RTcwMDAzQzAyMDAwMThDNDI2RDEwM0MwMTAwMDFBQzMwNkVFQzE0Cis6MTA2RTgwMDBBRTAyMDAwNEFDMTAwMjUwOEZCRjAwMjg4RkJFMDAyNDU5Cis6MTA2RTkwMDA4RkI1MDAyMDhGQjMwMDFDOEZCMjAwMTg4RkIxMDAxNDgzCis6MTA2RUEwMDA4RkIwMDAxMDAzRTAwMDA4MjdCRDAwMzAwMDg1MTgyMUQ2Cis6MTA2RUIwMDAwMDgzMTAyQjEwNDAwMDA2MDAwMDAwMDBBQzgwMDAwMDkyCis6MTA2RUMwMDAyNDg0MDAwNDAwODMxMDJCNTQ0MEZGRkRBQzgwMDAwMDlDCis6MTA2RUQwMDAwM0UwMDAwODAwMDAwMDAwMDBBNjE4MjEwMEEzMTAyQjBBCis6MTA2RUUwMDAxMDQwMDAwNzAwMDAwMDAwOEM4MjAwMDBBQ0EyMDAwMEVGCis6MTA2RUYwMDAyNEE1MDAwNDAwQTMxMDJCMTQ0MEZGRkIyNDg0MDAwNEVECis6MTA2RjAwMDAwM0UwMDAwODAwMDAwMDAwMDA4NjE4MjEwMDgzMTAyQjE5Cis6MTA2RjEwMDAxMDQwMDAwNzAwMDAwMDAwOENBMjAwMDBBQzgyMDAwMEJFCis6MTA2RjIwMDAyNDg0MDAwNDAwODMxMDJCMTQ0MEZGRkIyNEE1MDAwNERDCis6MTA2RjMwMDAwM0UwMDAwODAwMDAwMDAwMDAwNjMwODAwMDg2MTgyMUYxCis6MTA2RjQwMDAwMDgzMTAyQjEwNDAwMDA2MDAwMDAwMDBBQzg1MDAwMEZDCis6MTA2RjUwMDAyNDg0MDAwNDAwODMxMDJCNTQ0MEZGRkRBQzg1MDAwMDA2Cis6MTA2RjYwMDAwM0UwMDAwODAwMDAwMDAwMDAwMDAwMDAyNkU1MDAyODAzCis6MTA2RjcwMDAwMEEwMzAyMTI3NDMwMUMwOEY0RDAzNTg4RjQ3MDM1Qzg5Cis6MTA2RjgwMDA4RjQ4MDM2MDhGNDkwMzY0OEY0QTAzNjg4RjRCMDIwNDY0Cis6MTA2RjkwMDA4RjRDMDIwMDI0NjQwNDAwMDA2NDEwMkIxMDQwMDAwODkxCis6MTA2RkEwMDAzQzAyMDhGRjhDQzIwMDAwQUM2MjAwMDAyNDYzMDAwNEI1Cis6MTA2RkIwMDAwMDY0MTAyQjE0NDBGRkZCMjRDNjAwMDQzQzAyMDhGRkIxCis6MTA2RkMwMDAzNDQyRkZGRjNDMDNDMEZGQUY0RDAzNThBRjQ3MDM1Q0EzCis6MTA2RkQwMDBBRjQ4MDM2MEFGNDkwMzY0QUY0QTAzNjhBRjRCMDIwNDk0Cis6MTA2RkUwMDBBRjRDMDIwMDhGODQwMjIwMzQ2M0ZGRkY4Rjg2MDIwMEMzCis6MTA2RkYwMDAwMDgyMTAyNDM0NDIwMDA0MDBDMzE4MjQzNDYzMDAwNEM3Cis6MTA3MDAwMDBBRjgyMDIyMEFGODMwMjAwOENBMjAyMTRBQzAyMDA4NDgzCis6MTA3MDEwMDA4Q0EyMDIxOEFDMDIwMDg4OENBMjAyMUNBQzAyMDA4QzZDCis6MTA3MDIwMDA4Q0EyMDIyMEFDMDIwMDkwOENBMjAyMjRBQzAyMDA5NDNDCis6MTA3MDMwMDA4Q0EyMDIyOEFDMDIwMDk4OENBMjAyMkNBQzAyMDA5QzBDCis6MTA3MDQwMDA4Q0EyMDIzMEFDMDIwMEEwOENBMjAyMzRBQzAyMDBBNERDCis6MTA3MDUwMDA4Q0EyMDIzOEFDMDIwMEE4OENBMjAyM0NBQzAyMDBBQ0FDCis6MTA3MDYwMDA4Q0EyMDI0MEFDMDIwMEIwOENBMjAyNDRBQzAyMDBCNDdDCis6MTA3MDcwMDA4Q0EyMDI0OEFDMDIwMEI4OENBMjAyNENBQzAyMDBCQzRDCis6MTA3MDgwMDA4Q0EyMDAxQ0FDMDIwMDgwOENBMjAwMThBQzAyMDBDMEQ0Cis6MTA3MDkwMDA4Q0EyMDAyMEFDMDIwMENDOENBMjAwMjRBQzAyMDBEMDU4Cis6MTA3MEEwMDA4Q0EyMDFEMEFDMDIwMEUwOENBMjAxRDRBQzAyMDBFNEJFCis6MTA3MEIwMDA4Q0EyMDFEOEFDMDIwMEU4OENBMjAxRENBQzAyMDBFQzhFCis6MTA3MEMwMDA4Q0EyMDFFMEFDMDIwMEYwOENBMjAwOTg4Q0EzMDA5QzgyCis6MTA3MEQwMDBBQzAzMDBGQzhDQTIwMEE4OENBMzAwQUNBQzAzMDBGNEIxCis6MTA3MEUwMDA4Q0EyMDBBMDhDQTMwMEE0MzA4NDAwMDRBQzAzMDBGOEEwCis6MTA3MEYwMDAxNDgwMDAwNzMwQzIwMDA0OEY4MjAyMjAzQzAzMDhGRjg2Cis6MTA3MTAwMDAzNDYzRkZGQjAwNDMxMDI0QUY4MjAyMjAzMEMyMDAwNDJFCis6MTA3MTEwMDAxNDQwMDAwNjAwMDAwMDAwOEY4MjAyMDAzQzAzQzBGRjA0Cis6MTA3MTIwMDAzNDYzRkZGQjAwNDMxMDI0QUY4MjAyMDA4RjQyMDJEQzc1Cis6MTA3MTMwMDBBMzQwMDVDNTI0NDIwMDAxQUY0MjAyREM4RjQyMDJEQ0JECis6MTA3MTQwMDAwM0UwMDAwODAwMDAwMDAwMjdCREZGRDhBRkJGMDAyNDA3Cis6MTA3MTUwMDBBRkIwMDAyMDhGNDMwMDI0OEY0MjAwMjAxMDYyMDAzODFGCis6MTA3MTYwMDAwMDAwMDAwMDhGNDMwMDIwOEY0MjAwMjQwMDYyMjAyMzkzCis6MTA3MTcwMDAwNDgxMDAwMzAwMDAwMDAwOEY0MjAwNDAwMDgyMjAyMUIzCis6MTA3MTgwMDA4RjQzMDAzMDhGNDIwMDI0MDA0MzEwMkIxNDQwMDAwNTMxCis6MTA3MTkwMDAwMDAwMDAwMDhGNDMwMDQwOEY0MjAwMjQxMDAwMDAwNUQzCis6MTA3MUEwMDAwMDYyMTAyMzhGNDIwMDMwOEY0MzAwMjQwMDQzMTAyM0RECis6MTA3MUIwMDAyNDQyRkZGRjAwNDA2MDIxMDA4QzEwMkE1NDQwMDAwMTRGCis6MTA3MUMwMDAwMDgwNjAyMThGNEEwMDI0OEY0OTAwNDA4RjQ4MDAyNEFFCis6MTA3MUQwMDA4RjQ0MDE4MDhGNDUwMTg0OEY0NjAwMjQ4RjRCMDAxQzEzCis6MTA3MUUwMDAyNDA3MDAwMUFGQTcwMDEwMDAwODQxMDAwMTAwMTgyMThBCis6MTA3MUYwMDAwMTRDNTAyMTI1MjlGRkZGMDE0OTgwMjRBRkIwMDAxNDI0Cis6MTA3MjAwMDA4RjQ3MDAxNDAwMDAxMDIxMDAwNjMxMDBBRkE3MDAxOEJFCis6MTA3MjEwMDAwMEEzMjgyMTAwQTMzODJCMDA4MjIwMjEwMDg3MjAyMUYxCis6MTA3MjIwMDA4RjQyMDEwODAxNjYzMDIxMDA0MEY4MDkwMDBDMzkwMDQ2Cis6MTA3MjMwMDA1NDQwMDAwMUFGNTAwMDI0OEY0MzAwMjQ4RjQyMDAyMEFGCis6MTA3MjQwMDAxNDYyMDAxODAwMDAwMDAwOEY0MjAwMDAxMDQwMDAwNzg4Cis6MTA3MjUwMDAwMDAwMDAwMEFGODAwMDRDOEY4MjAwNEMxMDQwRkZGRDBBCis6MTA3MjYwMDAwMDAwMDAwMDEwMDAwMDA1MDAwMDAwMDBBRjgwMDA0ODkyCis6MTA3MjcwMDA4RjgyMDA0ODEwNDBGRkZEMDAwMDAwMDA4RjgyMDA2MEY4Cis6MTA3MjgwMDAyNDAzRkZFRjAwNDMxMDI0QUY4MjAwNjA4RjQyMDAwMDEwCis6MTA3MjkwMDAxMDQwMDAwMzAwMDAwMDAwMTAwMDAwMDJBRjgwMDA0QzBFCis6MTA3MkEwMDBBRjgwMDA0ODhGQkYwMDI0OEZCMDAwMjAwM0UwMDAwOEFCCis6MTA3MkIwMDAyN0JEMDAyODAzRTAwMDA4MDAwMDAwMDAyN0JERkZDMDM0Cis6MTA3MkMwMDAzMkMyMDAyMEFGQkYwMDM4QUZCMzAwMzRBRkIyMDAzMERECis6MTA3MkQwMDBBRkIxMDAyQzEwNDAwMDA0QUZCMDAwMjg4RjUzMDAyODNECis6MTA3MkUwMDAxMDAwMDAwMjAwMDAwMDAwOEY1MzAwMjA4RjQyMDAzMDg5Cis6MTA3MkYwMDAxMDUzMDBFQjAwMDIxMTAwOEY0MzAwMUMwMDYyODAyMTNDCis6MTA3MzAwMDA4RTA0MDAwMDhFMDUwMDA0OTYxMjAwMDg4RjQyMDA5MDQzCis6MTA3MzEwMDA5NjExMDAwQTMyNDZGRkZGMDA0NjEwMkExMDQwMDAxNzVGCis6MTA3MzIwMDAwMDAwMDAwMDhGODIwMEQ4OEY0MzAwOTgwMDQzMTAyMzk0Cis6MTA3MzMwMDAyNDQyRENCRUFGNDIwMDkwOEY0MjAwOTAyODQyRENCRjY2Cis6MTA3MzQwMDAxMDQwMDAwNTAwMDAwMDAwOEY0MjAwOTA4RjQzMDE0NDcwCis6MTA3MzUwMDAwMDQzMTAyMUFGNDIwMDkwOEY0MjAwOTAwMDQ2MTAyQTU3Cis6MTA3MzYwMDAxMDQwMDAwNjAwMDAwMDAwOEY0MjAzNDgyNDQyMDAwMTQ0Cis6MTA3MzcwMDBBRjQyMDM0ODEwMDAwMEUxOEY0MjAzNDg4RjgyMDBGQ0I3Cis6MTA3MzgwMDAxNDQwMDAwNjAwMDAwMDAwOEY0MjAzNDQyNDQyMDAwMTI0Cis6MTA3MzkwMDBBRjQyMDM0NDEwMDAwMEQ5OEY0MjAzNDQ5MzQyMDVDMjE4Cis6MTA3M0EwMDAxMDQwMDAwQjMyQzIwMDA4MTA0MDAwMDgzMjIyMDIwMEQ4Cis6MTA3M0IwMDAxMDQwMDAwNjNDMDM0MDAwOTYwMjAwMEVBRjQzMDBBQ0I0Cis6MTA3M0MwMDAwMDAyMTQwMDEwMDAwMDAyQUY0MjAwQjBBRjQwMDBBQzU5Cis6MTA3M0QwMDAzMjIyMDAwNDEwNDAwMDdGMzIyMjA4MDAxMDQwMDAwM0Q3Cis6MTA3M0UwMDAzMjQ3RkZGRjEwMDAwMDAyMjQwMjAwMjAyNDAyMDAwNEE0Cis6MTA3M0YwMDBBRkEyMDAxMDhGNDIwMDMwQUZBMjAwMTQ4RjQyMDAxMEU1Cis6MTA3NDAwMDAzQzAzMDAwMjAwNDMxMDI1QUZBMjAwMTg4RjQ2MDA5OEVECis6MTA3NDEwMDA4RjQyMDEwODAwNDBGODA5MDAwMDAwMDAxMDQwMDBCNzRBCis6MTA3NDIwMDAwMDAwMDAwMDhGNDIwMDlDOEY0MzAwOTQwMjQyMTAyMTE0Cis6MTA3NDMwMDBBRjQyMDA5Q0FFMDMwMDBDOEY0MjAwQUMxMDQwMDAwODJECis6MTA3NDQwMDAzQzAzNDAwMDhGNDIwMDk0MDA0MzEwMjVBRkEyMDAyMDZGCis6MTA3NDUwMDA4RjQyMDA5QzhGNDMwMEIwMTAwMDAwMDQwMDQzMTAyNUIxCis6MTA3NDYwMDA4RjQyMDA5NEFGQTIwMDIwOEY0MjAwOUNBRkEyMDAyNDY0Cis6MTA3NDcwMDA4RjgyMDBGQzhGQTMwMDIwOEZBNDAwMjRBQzQzMDAwMDY3Cis6MTA3NDgwMDBBQzQ0MDAwNDI0NDIwMDA4QUY4MjAwRjA4RjQyMDA5QzBDCis6MTA3NDkwMDA4RjQ0MDI3MDhGNDUwMjc0MDA0MDE4MjEwMDAwMTAyMUIzCis6MTA3NEEwMDAwMEEzMjgyMTAwQTMzMDJCMDA4MjIwMjEwMDg2MjAyMTY4Cis6MTA3NEIwMDAzMjIzMDA2MDI0MDIwMDQwQUY0NDAyNzBBRjQ1MDI3NEUyCis6MTA3NEMwMDAxMDYyMDAxNzJDNjIwMDQxMTA0MDAwMDUyNDAyMDAyMEM5Cis6MTA3NEQwMDAxMDYyMDAwODI0MDIwMDAxMTAwMDAwMjYwMDAwMDAwMEQ1Cis6MTA3NEUwMDAyNDAyMDA2MDEwNjIwMDE5MjQwMjAwMDExMDAwMDAyMTMzCis6MTA3NEYwMDAwMDAwMDAwMDhGNDIwMjc4OEY0MzAyN0MyNDYzMDAwMTY5Cis6MTA3NTAwMDAyQzY0MDAwMTAwNDQxMDIxQUY0MjAyNzhBRjQzMDI3QzlBCis6MTA3NTEwMDA4RjQyMDI3ODhGNDMwMjdDMTAwMDAwMTYyNDAyMDAwMTgzCis6MTA3NTIwMDA4RjQyMDI4MDhGNDMwMjg0MjQ2MzAwMDEyQzY0MDAwMTk3Cis6MTA3NTMwMDAwMDQ0MTAyMUFGNDIwMjgwQUY0MzAyODQ4RjQyMDI4MDk4Cis6MTA3NTQwMDA4RjQzMDI4NDEwMDAwMDBCMjQwMjAwMDE4RjQyMDI4ODQ2Cis6MTA3NTUwMDA4RjQzMDI4QzI0NjMwMDAxMkM2NDAwMDEwMDQ0MTAyMTNECis6MTA3NTYwMDBBRjQyMDI4OEFGNDMwMjhDOEY0MjAyODg4RjQzMDI4QzY1Cis6MTA3NTcwMDAyNDAyMDAwMUEzNDIwNUMyOEY0MjAwOTgzMjQ0RkZGRjVCCis6MTA3NTgwMDAyNDA2RkZGODhGNDUwMTNDMDA0NDEwMjEyNDQyMDAwN0U3Cis6MTA3NTkwMDAwMDQ2MTAyNDI0ODQwMDA3QUY0MjAwOTQ4RjQyMDA5MERDCis6MTA3NUEwMDA4RjQzMDA5NDAwODYyMDI0MDA0NDEwMjMwMDY1MTgyQjhDCis6MTA3NUIwMDAxNDYwMDAwNUFGNDIwMDkwOEY0MjAwOTQ4RjQzMDE0NDU1Cis6MTA3NUMwMDAwMDQzMTAyM0FGNDIwMDk0OEY0MjAwOTQxMDAwMDAyMzI4Cis6MTA3NUQwMDBBRjQwMDA5QzMyNDdGRkZGNTBFMDAwMjIzMkMyMDAyMDQzCis6MTA3NUUwMDAxNDQwMDAwMjI0MDIwMDEwMjQwMjAwMDJBRkEyMDAxMDg2Cis6MTA3NUYwMDA4RjQyMDAzMEFGQTIwMDE0OEY0MjAwMTBBRkEyMDAxOERCCis6MTA3NjAwMDA4RjQ2MDA5ODhGNDIwMTA4MDA0MEY4MDkwMDAwMDAwMEYyCis6MTA3NjEwMDAxMDQwMDAzQTMyNDVGRkZGOEY0MjAwOTg4RjQzMDA5MEEwCis6MTA3NjIwMDA4RjQ2MDEzQzAwNDUxMDIxQUY0MjAwOTg4RjQyMDA5Q0RDCis6MTA3NjMwMDA4RjQ0MDA5OEEzNDAwNUMyMDA2NTE4MjNBRjQzMDA5MDEzCis6MTA3NjQwMDAwMDQ1MTAyMTAwODYyMDJCMTQ4MDAwMDVBRjQyMDA5Q0NECis6MTA3NjUwMDA4RjQyMDA5ODhGNDMwMTQ0MDA0MzEwMjNBRjQyMDA5OEFCCis6MTA3NjYwMDAzMkMyMDAyMDEwNDAwMDA1MDAwMDAwMDA4RjQyMDM1ODg1Cis6MTA3NjcwMDAyNDQyRkZGRkFGNDIwMzU4OEY0MjAzNTg4RjQyMDAzMDJECis6MTA3NjgwMDA4RjQzMDA0MDI0NDIwMDAxMjQ2M0ZGRkYwMDQzMTAyNDg1Cis6MTA3NjkwMDBBRjQyMDAzMDhGNDIwMDMwMTQ1MzAwMTgwMDAwMDAwMDQ5Cis6MTA3NkEwMDA4RjQyMDAwMDEwNDAwMDA3MDAwMDAwMDBBRjgwMDA0QzM3Cis6MTA3NkIwMDA4RjgyMDA0QzEwNDBGRkZEMDAwMDAwMDAxMDAwMDAwNTBDCis6MTA3NkMwMDAwMDAwMDAwMEFGODAwMDQ4OEY4MjAwNDgxMDQwRkZGRDlFCis6MTA3NkQwMDAwMDAwMDAwMDhGODIwMDYwMjQwM0ZGRjcwMDQzMTAyNEE1Cis6MTA3NkUwMDBBRjgyMDA2MDhGNDIwMDAwMTA0MDAwMDMwMDAwMDAwMEU1Cis6MTA3NkYwMDAxMDAwMDAwMkFGODAwMDRDQUY4MDAwNDg4RkJGMDAzODAwCis6MTA3NzAwMDA4RkIzMDAzNDhGQjIwMDMwOEZCMTAwMkM4RkIwMDAyOEJGCis6MTA3NzEwMDAwM0UwMDAwODI3QkQwMDQwMDNFMDAwMDgwMDAwMDAwMDZGCis6MTA3NzIwMDAyN0JERkZEMDMyQzIwMDIwQUZCRjAwMkNBRkIyMDAyODZGCis6MTA3NzMwMDBBRkIxMDAyNDEwNDAwMDA0QUZCMDAwMjA4RjUyMDAyOEU5Cis6MTA3NzQwMDAxMDAwMDAwMjAwMDAwMDAwOEY1MjAwMjA4RjQyMDAzMDI1Cis6MTA3NzUwMDAxMDUyMDBCNTAwMDIxMTAwOEY0MzAwMUMwMDYyODAyMTBFCis6MTA3NzYwMDA4RTA0MDAwMDhFMDUwMDA0OTYxMTAwMDg4RjQyMDA5MEUwCis6MTA3NzcwMDA5NjA3MDAwQTMyMjZGRkZGMDA0NjEwMkExMDQwMDAxNzI1Cis6MTA3NzgwMDAwMDAwMDAwMDhGODIwMEQ4OEY0MzAwOTgwMDQzMTAyMzMwCis6MTA3NzkwMDAyNDQyREM0NkFGNDIwMDkwOEY0MjAwOTAyODQyREM0N0YyCis6MTA3N0EwMDAxMDQwMDAwNTAwMDAwMDAwOEY0MjAwOTA4RjQzMDE0NDBDCis6MTA3N0IwMDAwMDQzMTAyMUFGNDIwMDkwOEY0MjAwOTAwMDQ2MTAyQUYzCis6MTA3N0MwMDAxMDQwMDAwNjAwMDAwMDAwOEY0MjAzNDgyNDQyMDAwMUUwCis6MTA3N0QwMDBBRjQyMDM0ODEwMDAwMEFCOEY0MjAzNDg4Rjg2MDBGQzg1Cis6MTA3N0UwMDAxMEMwMDAwQzAwMDAwMDAwOEY4MjAwRjQyNDAzRkZGODlBCis6MTA3N0YwMDAwMDQzMTAyNDAwNDYxMDIzMDAwMjE4QzM1ODYwMDAwMTAzCis6MTA3ODAwMDAyNDYzMDEwMDhGNDIwMDhDMDA0MzEwMkIxNDQwMDAwNkJCCis6MTA3ODEwMDAwMDA3MTJDMjhGNDIwMzQ0MjQ0MjAwMDFBRjQyMDM0NEQ2Cis6MTA3ODIwMDAxMDAwMDA5ODhGNDIwMzQ0OTM0MzA1QzIxMDYwMDAwRjdDCis6MTA3ODMwMDAzMDQ2MDAwMThGNDIwMDEwMzQ0ODA0MDAzMkMyMDAwODc0Cis6MTA3ODQwMDAxMDQwMDAwODMwRTIwMjAwMTA0MDAwMDYzQzAzNDAwMEY3Cis6MTA3ODUwMDA5NjAyMDAwRUFGNDMwMEFDMDAwMjE0MDAxMDAwMDAwNEJBCis6MTA3ODYwMDBBRjQyMDBCMDEwMDAwMDAyQUY0MDAwQUM4RjQ4MDAxMEUzCis6MTA3ODcwMDAzMEUyMDAwNDEwNDAwMDQ1MzIyN0ZGRkY4RjQ5MDBBQzgyCis6MTA3ODgwMDAxMTIwMDAwNTMwQzIwMEZGMTQ0MDAwMDYyNDAyMDA0MDExCis6MTA3ODkwMDAxMDAwMDAwNDI0MDIwMDA4MTQ0MDAwMDIyNDAyMDAyMDBBCis6MTA3OEEwMDAyNDAyMDAwNEFGQTIwMDEwOEY0MzAwMzAxMTIwMDAwNDE2Cis6MTA3OEIwMDBBRkEzMDAxNDhGNDIwMEIwMDA2MjEwMjVBRkEyMDAxNEU1Cis6MTA3OEMwMDAzQzAyMDAwMjAxMDIxMDI1QUZBMjAwMTg4RjQ2MDA5ODZBCis6MTA3OEQwMDA4RjQyMDEwODAwNDBGODA5MDAwMDAwMDAxMDQwMDA2OUQ0Cis6MTA3OEUwMDAzMjI0RkZGRjhGNDIwMDhDOEY0MzAwOTQyNDQyMDAwMTFBCis6MTA3OEYwMDBBRjQyMDA4QzI0MDIwMDAxQUUwMzAwMENBMzQyMDVDMjdCCis6MTA3OTAwMDA4RjQyMDA5ODI0MDZGRkY4OEY0NTAxM0MwMDQ0MTAyMTY3Cis6MTA3OTEwMDAyNDQyMDAwNzAwNDYxMDI0MjQ4NDAwMDdBRjQyMDA5NDRDCis6MTA3OTIwMDA4RjQyMDA5MDhGNDMwMDk0MDA4NjIwMjQwMDQ0MTAyMzRGCis6MTA3OTMwMDAwMDY1MTgyQjE0NjAwMDA1QUY0MjAwOTA4RjQyMDA5NDQwCis6MTA3OTQwMDA4RjQzMDE0NDAwNDMxMDIzQUY0MjAwOTQ4RjQzMDA5NEJGCis6MTA3OTUwMDA4RjQyMDE0MDAwNDMxMDJCMTA0MDAwMDkwMDAwMDAwMDNFCis6MTA3OTYwMDA4RjQzMDEzQzhGNDQwMDk0OEY0MjAwOTA4RjQ1MDEzODMzCis6MTA3OTcwMDAwMDY0MTgyMzAwNDMxMDIzQUY0MjAwOTBBRjQ1MDA5NEU5Cis6MTA3OTgwMDA4RjQyMDA5NDEwMDAwMDFGQUY0MjAwOTgxMEUwMDAxRENECis6MTA3OTkwMDAzMEMyMDBGRjE0NDAwMDAyMjQwMjAwMTAyNDAyMDAwMjQyCis6MTA3OUEwMDBBRkEyMDAxMDhGNDIwMDMwQUZBODAwMThBRkEyMDAxNEExCis6MTA3OUIwMDA4RjQ2MDA5ODhGNDIwMTA4MDA0MEY4MDkwMDAwMDAwMDNGCis6MTA3OUMwMDAxMDQwMDAzMDMyMjVGRkZGOEY0MjAwOTg4RjQ0MDEzQzY5Cis6MTA3OUQwMDAwMDQ1MTAyMUFGNDIwMDk4OEY0MjAwOTA4RjQzMDA5OERECis6MTA3OUUwMDBBMzQwMDVDMjAwNDUxMDIzMDA2NDE4MkIxNDYwMDAwNTU1Cis6MTA3OUYwMDBBRjQyMDA5MDhGNDIwMDk4OEY0MzAxNDQwMDQzMTAyMzEwCis6MTA3QTAwMDBBRjQyMDA5ODhGNDIwMDMwOEY0MzAwNDAyNDQyMDAwMTczCis6MTA3QTEwMDAyNDYzRkZGRjAwNDMxMDI0QUY0MjAwMzA4RjQyMDAzMDQ4Cis6MTA3QTIwMDAxNDUyMDAxODAwMDAwMDAwOEY0MjAwMDAxMDQwMDAwN0IwCis6MTA3QTMwMDAwMDAwMDAwMEFGODAwMDRDOEY4MjAwNEMxMDQwRkZGRDIyCis6MTA3QTQwMDAwMDAwMDAwMDEwMDAwMDA1MDAwMDAwMDBBRjgwMDA0OEFBCis6MTA3QTUwMDA4RjgyMDA0ODEwNDBGRkZEMDAwMDAwMDA4RjgyMDA2MDEwCis6MTA3QTYwMDAyNDAzRkZGNzAwNDMxMDI0QUY4MjAwNjA4RjQyMDAwMDIwCis6MTA3QTcwMDAxMDQwMDAwMzAwMDAwMDAwMTAwMDAwMDJBRjgwMDA0QzI2Cis6MTA3QTgwMDBBRjgwMDA0ODhGQkYwMDJDOEZCMjAwMjg4RkIxMDAyNDM4Cis6MTA3QTkwMDA4RkIwMDAyMDAzRTAwMDA4MjdCRDAwMzAwM0UwMDAwODlECis6MTA3QUEwMDAwMDAwMDAwMDI3QkRGRkQ4M0MwMjAwMDEzNDQyMkVDMDc4Cis6MTA3QUIwMDBBRkJGMDAyMDhGNDMwMEYwOEY4NDAxMDgwMkUyMTAyMTQ1Cis6MTA3QUMwMDA1NDYyMDAwNDI0NjIwMDA4M0MwMjAwMDEzNDQyMkNDMENECis6MTA3QUQwMDAwMkUyMTAyMTAwNDAxODIxQUY0MzAwRjBBQzYwMDAwMDJBCis6MTA3QUUwMDA4RjQyMDBFQzhDNjYwMDA0MTQ2MjAwMDQzQzAyMDAwMTJBCis6MTA3QUYwMDAyNDgyMDAyMDEwMDAwMDBGQUY4MjAxMDg4RjQzMDBGMEE1Cis6MTA3QjAwMDAzNDQyMkVDMDAyRTIxMDIxNTQ2MjAwMDQyNDYyMDAwOEI0Cis6MTA3QjEwMDAzQzAyMDAwMTM0NDIyQ0MwMDJFMjEwMjEwMDQwMTgyMTM2Cis6MTA3QjIwMDA4QzYyMDAwNDAwMDIxMTQwMDA4MjEwMjFBRjgyMDEwODIzCis6MTA3QjMwMDBBQzYwMDAwMDhDODUwMDE4MzBBMjAwMzYxMDQwMDA2QzRDCis6MTA3QjQwMDAzMEEyMDAwMThDODIwMDFDOEY0MzAwNDA4RjQ0MDAzNDFGCis6MTA3QjUwMDAyNDQyMDAwMTI0NjNGRkZGMDA0MzEwMjQwMDg2MjAyMUZCCis6MTA3QjYwMDBBRjQyMDAyQzMwQTIwMDMwMTQ0MDAwMDZBRjQ0MDAzNDc1Cis6MTA3QjcwMDA4RjQyMDAzNDhDMDMwMjNDMDA0MzEwMkIxNDQwMDBCNEFECis6MTA3QjgwMDAwMDAwMDAwMDMyQzIwMDEwMTA0MDAwMjgyNDA3MDAwODQ2Cis6MTA3QjkwMDA4RjQ0MDE3MDhGNDUwMTc0OEY0MzAwMkM4RjQ4MDAwQzc3Cis6MTA3QkEwMDA4Rjg2MDEyMDI0MDIwMDgwQUZBMjAwMTBBRkEzMDAxNDMyCis6MTA3QkIwMDBBRkE4MDAxODhGNDIwMTBDMDA0MEY4MDkyNEM2MDAxQzMxCis6MTA3QkMwMDAxNDQwMDAxMTI0MDIwMDAxM0MwMTAwMDEwMDM3MDgyMThCCis6MTA3QkQwMDBBMDIyNDBGMThGODIwMTI0QUZBMjAwMTA4RjgyMDEyOEUxCis6MTA3QkUwMDAzQzA0MDAwMTI0ODQ2N0M0QUZBMjAwMTQ4RjQ2MDAyQzFCCis6MTA3QkYwMDA4Rjg3MDEyMDNDMDUwMDA5MEMwMDJCM0IzNEE1MTEwMEE4Cis6MTA3QzAwMDAxMDAwMDAzNjAwMDAwMDAwOEY0MjAzMDA4RjQzMDAyQzVDCis6MTA3QzEwMDAyNDQyMDAwMUFGNDIwMzAwOEY0MjAzMDAyNDAyMDAwMTBFCis6MTA3QzIwMDBBMzQyMDVDMTEwMDAwMDI2QUY0MzAwMzg4RjQ0MDE3MDA1Cis6MTA3QzMwMDA4RjQ1MDE3NDhGNDMwMDJDOEY0ODAwMEM4Rjg2MDEyMEU0Cis6MTA3QzQwMDAyNDAyMDAyMEFGQTIwMDEwQUZBMzAwMTRBRkE4MDAxOEI4Cis6MTA3QzUwMDA4RjQyMDEwQzAwNDBGODA5MjRDNjAwMUMxNDQwMDAxMTlBCis6MTA3QzYwMDAyNDAyMDAwMTNDMDEwMDAxMDAzNzA4MjFBMDIyNDBGMDVECis6MTA3QzcwMDA4RjgyMDEyNEFGQTIwMDEwOEY4MjAxMjgzQzA0MDAwMUYyCis6MTA3QzgwMDAyNDg0NjdCOEFGQTIwMDE0OEY0NjAwMkM4Rjg3MDEyMDkwCis6MTA3QzkwMDAzQzA1MDAwOTBDMDAyQjNCMzRBNTA5MDAxMDAwMDAwRjI3Cis6MTA3Q0EwMDAwMDAwMDAwMDhGNDIwMzAwMjQ0MjAwMDFBRjQyMDMwMEE1Cis6MTA3Q0IwMDA4RjQyMDMwMDhGNDIwMDJDQTM0MDA1QzFBRjQyMDAzODIxCis6MTA3Q0MwMDAzQzAxMDAwMTAwMzcwODIxQTAyMDQwRjEzQzAxMDAwMUU3Cis6MTA3Q0QwMDAwMDM3MDgyMUEwMjA0MEYwQUY0MDAwMzQ4RjQyMDMxNDQ5Cis6MTA3Q0UwMDAyNDQyMDAwMUFGNDIwMzE0MTAwMDAwNTk4RjQyMDMxNEQ0Cis6MTA3Q0YwMDAxMDQwMDAyMjMwQTI3MDAwOEM4NTAwMUM4RjQyMDAyOEFBCis6MTA3RDAwMDAwMEEyMjAyMzA0ODEwMDAzMDAwMDAwMDA4RjQyMDA0MEY1Cis6MTA3RDEwMDAwMDgyMjAyMThGNDIwMzU4OEY0MzAwMDBBRjQ1MDAyODg2Cis6MTA3RDIwMDAwMDQ0MTAyMTEwNjAwMDA3QUY0MjAzNThBRjgwMDA0Q0EwCis6MTA3RDMwMDA4RjgyMDA0QzEwNDBGRkZEMDAwMDAwMDAxMDAwMDAwNTg1Cis6MTA3RDQwMDAwMDAwMDAwMEFGODAwMDQ4OEY4MjAwNDgxMDQwRkZGRDE3Cis6MTA3RDUwMDAwMDAwMDAwMDhGODIwMDYwMzQ0MjAwMDhBRjgyMDA2MEEzCis6MTA3RDYwMDA4RjQyMDAwMDEwNDAwMDAzMDAwMDAwMDAxMDAwMDAzOEE3Cis6MTA3RDcwMDBBRjgwMDA0QzEwMDAwMDM2QUY4MDAwNDgxMDQwMDAyRjRDCis6MTA3RDgwMDAzMEEyMTAwMDEwNDAwMDBDMzBBMjQwMDA4QzgzMDAxQzc4Cis6MTA3RDkwMDA4RjQyMDA1MDAwNjIyMDIzMDQ4MjAwMDEyNDg0MDIwMEVDCis6MTA3REEwMDA4RjQyMDM1QzAwNDQxMDIxQUY0MjAzNUM4RjQyMDM2OEEyCis6MTA3REIwMDAxMDAwMDAxQUFGNDMwMDUwMTA0MDAwMEMzMkMyODAwMDg3Cis6MTA3REMwMDA4QzgzMDAxQzhGNDIwMDcwMDA2MjIwMjMwNDgyMDAwMTFCCis6MTA3REQwMDAyNDg0MDQwMDhGNDIwMzY0MDA0NDEwMjFBRjQyMDM2NEYyCis6MTA3REUwMDA4RjQyMDM2ODEwMDAwMDBEQUY0MzAwNzAxMDQwMDAwRTdBCis6MTA3REYwMDAzQzAyMDgwMDhDODMwMDFDOEY0MjAwNjAwMDYyMjAyMzNDCis6MTA3RTAwMDAwNDgyMDAwMTI0ODQwMTAwOEY0MjAzNjAwMDQ0MTAyMTk5Cis6MTA3RTEwMDBBRjQyMDM2MDhGNDIwMzY4QUY0MzAwNjAwMDQ0MTAyMTBCCis6MTA3RTIwMDBBRjQyMDM2ODNDMDIwODAwMDJDMjEwMjQ1MDQwMDAwODIwCis6MTA3RTMwMDAzNjk0MDA0MDEwMDAwMDA2MDAwMDAwMDAzMEEyMDEwMDRGCis6MTA3RTQwMDAxMDQwMDAwMzAwMDAwMDAwMEMwMDJCRDgwMDAwMDAwMEQwCis6MTA3RTUwMDA4RkJGMDAyMDAzRTAwMDA4MjdCRDAwMjgwM0UwMDAwOEQyCis6MTA3RTYwMDAwMDAwMDAwMDI3QkRGRkE4QUZCRjAwNTBBRkJFMDA0QzEwCis6MTA3RTcwMDBBRkI1MDA0OEFGQjMwMDQ0QUZCMjAwNDBBRkIxMDAzQzczCis6MTA3RTgwMDBBRkIwMDAzODhGOTEwMTA4MjYyMjAwMjBBRjgyMDEwODkwCis6MTA3RTkwMDA4RTMyMDAxODAwMDBBODIxMzI0MjAwMjQxMDQwMDFCQTlFCis6MTA3RUEwMDAwMDAwRjAyMThFMjYwMDFDOEY0MzAwMUMwMDA2MTEwMEVDCis6MTA3RUIwMDAwMDYyMTgyMThDNzAwMDBDOTYwNDAwMEM5NjJEMDAxNkEwCis6MTA3RUMwMDA5NDczMDAwQTJDODMwNUREMzg4Mjg4NzAyQzQyMDAwMUVGCis6MTA3RUQwMDAwMDYyMTgyNTEwNjAwMDE1MDAwMDI4MjEzMkMyMDA0MDAxCis6MTA3RUUwMDAxMDQwMDAxNTI0MDIwODAwOTYwMzAwMTQxNDYyMDAxMkNBCis6MTA3RUYwMDAzNDAyQUFBQTk2MDMwMDBFMTQ2MjAwMDcwMDAwMjAyMTkzCis6MTA3RjAwMDA5NjAzMDAxMDI0MDIwMzAwMTQ2MjAwMDQwMDgwMTAyMTc0Cis6MTA3RjEwMDA5NjAyMDAxMjJDNDQwMDAxMDA4MDEwMjE1NDQwMDAwNkZCCis6MTA3RjIwMDAyNDA1MDAxNjEwMDAwMDA0MDAwMDAwMDAyNDAyMDgwMEQwCis6MTA3RjMwMDA1MDgyMDAwMTI0MDUwMDBFOTM0MjA1QzMxNDQwMDAwODNFCis6MTA3RjQwMDAwMDAwNTgyMTI0MEIwMDAxMzI2MjAxODBBRjQ1MDBBOEQ3Cis6MTA3RjUwMDBBRjUwMDBBMDEwNDAwMDAyQUY0NjAwQTRBMzRCMDVDM0UxCis6MTA3RjYwMDAxMEEwMDA4NTAyMDU0MDIxOTEwMjAwMDAwMDAwMzgyMTg4Cis6MTA3RjcwMDAzMDQyMDAwRjAwMDI1MDgwMzJDMjAwMDIxMDQwMDAxMjU2Cis6MTA3RjgwMDAwMTBBMTgyMTMyNjIwMDAyMTA0MDAwMTAzMkMyMDAwMUMyCis6MTA3RjkwMDAwMTAwMjAyMTk0ODIwMDAwMjQ4NDAwMDIwMEUyMzgyMUE0Cis6MTA3RkEwMDAwMDgzMTAyQjE0NDBGRkZCMzBFMkZGRkYwMDA3MUMwMjkwCis6MTA3RkIwMDAwMDYyMzgyMTAwMDcxQzAyMzBFMkZGRkYwMDYyMzgyMTE2Cis6MTA3RkMwMDAwMDA3MTAyN0E1MDIwMDBBMzJDMjAwMDExMDQwMDA2QTEzCis6MTA3RkQwMDAzMjYyMDAwMTEwNDAwMDY4MDAwMDAwMDA4RjQyMDBBOERCCis6MTA3RkUwMDAxMDQwMDA2NTAwMDAwMDAwOEY0MjAwQTA4RjQzMDBBOEYxCis6MTA3RkYwMDAwMDQzMTAyMTkwNEMwMDA5MzE4OTAwRkYzOTIzMDAwNjBECis6MTA4MDAwMDAwMDAzMTgyQjM5MjIwMDExMDAwMjEwMkIwMDYyMTgyNEUzCis6MTA4MDEwMDAxMDYwMDAwQzNDMDUwMDA2OEY0MjAwQTQzQzA0MDAwMUU3Cis6MTA4MDIwMDAyNDg0NjdENEFGQTIwMDEwOEY0MjAwQTAzNEE1NDYwMDdDCis6MTA4MDMwMDAwMTIwMzgyMTBDMDAyQjNCQUZBMjAwMTQxMDAwMDA0RTkxCis6MTA4MDQwMDAwMDAwMDAwMDMyQzIwMDA0MTQ0MDAwMTMwMDAwMjgyMTg4Cis6MTA4MDUwMDAzMTYyMDBGRjE0NDAwMDA0MDAwMDAwMDA5NTAyMDAwMjlECis6MTA4MDYwMDAxMDAwMDAwRDAwNEEyODIzOTUwNTAwMEM5NTAyMDAwRTEzCis6MTA4MDcwMDA5NTAzMDAxMDAwQTIyODIxMDBBMzI4MjE5NTAzMDAxMkQ3Cis6MTA4MDgwMDA5MTA0MDAwOTk1MDIwMDAyMDBBMzI4MjEwMEE0MjgyMUUwCis6MTA4MDkwMDAwMDRBMTAyMzAwQTIyODIxMDIwMDIwMjE5NDgyMDAwMDFGCis6MTA4MEEwMDAyNDg0MDAwMjAwRTIzODIxMDA4ODEwMkIxNDQwRkZGQkRBCis6MTA4MEIwMDAwMDA3MUMwMjMwRTJGRkZGMDA2MjM4MjEwMDA3MUMwMkFCCis6MTA4MEMwMDAzMEUyRkZGRjAwNjIzODIxMDFBNTI4MjEwMDA1MUMwMkQzCis6MTA4MEQwMDAzMEEyRkZGRjAwNjIyODIxMDAwNTFDMDIzMEEyRkZGRjMyCis6MTA4MEUwMDAwMDYyMjgyMTAwQTcyODIzMDAwNTE0MDIwMEEyMjgyMUVECis6MTA4MEYwMDAzMEE1RkZGRjUwQTAwMDAxMzQwNUZGRkYzMTYyMDBGRkYzCis6MTA4MTAwMDAxNDQwMDAwODMxODMwMEZGOEY0MzAwQTA4RjQyMDBBODc1Cis6MTA4MTEwMDAwMDYyNDAyMTkxMDIwMDAwMzA0MjAwMEYwMDAyNTA4MEI2Cis6MTA4MTIwMDAzMTgzMDBGRjI0MDIwMDA2MTQ2MjAwMDMwMTBBMTAyMUJCCis6MTA4MTMwMDAxMDAwMDAwMjI0NDQwMDEwMjQ0NDAwMDYzMTYyMDBGRkI1Cis6MTA4MTQwMDAxNDQwMDAwNjAwMDAwMDAwOTQ4MjAwMDAwMEEyMjgyMUQ0Cis6MTA4MTUwMDAwMDA1MUMwMjMwQTJGRkZGMDA2MjI4MjE5MzQyMDVDM0U0Cis6MTA4MTYwMDAxMDQwMDAwMzMyNjIwMTAwNTA0MDAwMDNBNDg1MDAwMDZCCis6MTA4MTcwMDAwMDA1MjgyN0E0ODUwMDAwOTYyMjAwMEU4RjQzMDA5QzRFCis6MTA4MTgwMDAwMDYyMTgyMTMyQTIwMEZGMTA0MDAwMDdBRjQzMDA5QzlDCis6MTA4MTkwMDAzQzAyNDAwMDAyMDIxMDI1QUZBMjAwMjA4RjQyMDA5QzRBCis6MTA4MUEwMDAxMDAwMDAwMzAwNUUxMDI1QUZCMDAwMjA4RjQyMDA5QzNECis6MTA4MUIwMDBBRkEyMDAyNDMyNjIwMDgwMTA0MDAwMTAzMjYyMDEwMDQxCis6MTA4MUMwMDA4RjQyMDBCNDI0NDMwMDAxMDAwMjEwQzAwMDU3MTAyMTY4Cis6MTA4MUQwMDBBRjQzMDBCNDhGQTMwMDIwOEZBNDAwMjQzQzAxMDAwMTEyCis6MTA4MUUwMDAwMDIyMDgyMUFDMjMzOEU4M0MwMTAwMDEwMDIyMDgyMUNDCis6MTA4MUYwMDBBQzI0MzhFQzEwMDAwMEE1MzJDMjAwMjAxMDQwMDA2NDBFCis6MTA4MjAwMDAwMDAwMDAwMDhGNDIwMEI0MjQ0MzAwMDEwMDAyMTBDMEFGCis6MTA4MjEwMDAwMDU3MTAyMUFGNDMwMEI0OEZBMzAwMjA4RkE0MDAyNDg3Cis6MTA4MjIwMDAzQzAxMDAwMTAwMjIwODIxQUMyMzM4RTgzQzAxMDAwMTk4Cis6MTA4MjMwMDAwMDIyMDgyMUFDMjQzOEVDOEY0MjAwQjQxMDQwMDA1MUQ5Cis6MTA4MjQwMDAwMDAwMzgyMTNDMDkwMDAxMzUyOTM4RTgzQzA4MDAxRkFFCis6MTA4MjUwMDAzNTA4RkZGRjI0MEJGRkZGMzQwQUZGRkYwMDA3MTBDMEEzCis6MTA4MjYwMDAwMDU3MTAyMTAwNDkxMDIxOEM0MzAwMDA4QzQ0MDAwNDY5Cis6MTA4MjcwMDBBRkEzMDAyOEFGQTQwMDJDOEY4MjAwRkM4RkEzMDAyODlFCis6MTA4MjgwMDA4RkE0MDAyQ0FDNDMwMDAwQUM0NDAwMDQyNDQyMDAwODNFCis6MTA4MjkwMDBBRjgyMDBGMDhGNDIwMDhDMjQ0MkZGRkZBRjQyMDA4QzdGCis6MTA4MkEwMDA5N0EyMDAyRThGNDQwMjcwOEY0NTAyNzQwMDQwMTgyMTVGCis6MTA4MkIwMDAwMDAwMTAyMTAwQTMyODIxMDBBMzMwMkIwMDgyMjAyMUUwCis6MTA4MkMwMDAwMDg2MjAyMUFGNDQwMjcwQUY0NTAyNzQ4RkEyMDAyOEJGCis6MTA4MkQwMDAwMDQ4MTAyNDkwNDMwMDAwMzA2MzAwMDExNDYwMDAwQjNDCis6MTA4MkUwMDAwMDQwMjAyMThGNDIwMjc4OEY0MzAyN0MyNDYzMDAwMUVBCis6MTA4MkYwMDAyQzY0MDAwMTAwNDQxMDIxQUY0MjAyNzhBRjQzMDI3QzlECis6MTA4MzAwMDA4RjQyMDI3ODEwMDAwMDFBOEY0MzAyN0M4QzgyMDAwMDlBCis6MTA4MzEwMDAxNDRCMDAwRTAwMDAwMDAwOTQ4MjAwMDQxNDRBMDAwQjZECis6MTA4MzIwMDAwMDAwMDAwMDhGNDIwMjg4OEY0MzAyOEMyNDYzMDAwMTBBCis6MTA4MzMwMDAyQzY0MDAwMTAwNDQxMDIxQUY0MjAyODhBRjQzMDI4QzNDCis6MTA4MzQwMDA4RjQyMDI4ODEwMDAwMDBBOEY0MzAyOEM4RjQyMDI4MDA1Cis6MTA4MzUwMDA4RjQzMDI4NDI0NjMwMDAxMkM2NDAwMDEwMDQ0MTAyMTM3Cis6MTA4MzYwMDBBRjQyMDI4MEFGNDMwMjg0OEY0MjAyODA4RjQzMDI4NDc3Cis6MTA4MzcwMDA4RjQyMDBCNDI0RTcwMDAxMDBFMjEwMkIxNDQwRkZCODQ0Cis6MTA4MzgwMDAwMDA3MTBDMEEzNDAwNUMzMTAwMDAwM0ZBRjQwMDBCNDc5Cis6MTA4MzkwMDA4RjgyMDBGQzhGQTMwMDIwOEZBNDAwMjRBQzQzMDAwMDM4Cis6MTA4M0EwMDBBQzQ0MDAwNDI0NDIwMDA4QUY4MjAwRjA4RjQyMDA5Q0RECis6MTA4M0IwMDA4RjQ2MDA4QzhGNDQwMjcwOEY0NTAyNzQwMDQwMTgyMTU0Cis6MTA4M0MwMDAwMDAwMTAyMTI0QzZGRkZGQUY0NjAwOEMwMEEzMjgyMTI3Cis6MTA4M0QwMDAwMEEzMzAyQjAwODIyMDIxMDA4NjIwMjFBRjQ0MDI3MEIwCis6MTA4M0UwMDBBRjQ1MDI3NDkyMDIwMDAwMzA0MjAwMDExNDQwMDAwQ0JDCis6MTA4M0YwMDAyNDAyRkZGRjhGNDIwMjc4OEY0MzAyN0MyNDYzMDAwMTM2Cis6MTA4NDAwMDAyQzY0MDAwMTAwNDQxMDIxQUY0MjAyNzhBRjQzMDI3QzhCCis6MTA4NDEwMDA4RjQyMDI3ODhGNDMwMjdDMTAwMDAwMUMzMkMyMDAyMDgxCis6MTA4NDIwMDA4RTAzMDAwMDE0NjIwMDBGMzQwMkZGRkY5NjAzMDAwNDY1Cis6MTA4NDMwMDAxNDYyMDAwQzAwMDAwMDAwOEY0MjAyODg4RjQzMDI4Q0ZGCis6MTA4NDQwMDAyNDYzMDAwMTJDNjQwMDAxMDA0NDEwMjFBRjQyMDI4ODIzCis6MTA4NDUwMDBBRjQzMDI4QzhGNDIwMjg4OEY0MzAyOEMxMDAwMDAwQkM2Cis6MTA4NDYwMDAzMkMyMDAyMDhGNDIwMjgwOEY0MzAyODQyNDYzMDAwMUM1Cis6MTA4NDcwMDAyQzY0MDAwMTAwNDQxMDIxQUY0MjAyODBBRjQzMDI4NDBCCis6MTA4NDgwMDA4RjQyMDI4MDhGNDMwMjg0MzJDMjAwMjAxMDQwMDAwNUQ4Cis6MTA4NDkwMDBBRjQwMDA5QzhGNDIwMzU4MjQ0MkZGRkZBRjQyMDM1ODc1Cis6MTA4NEEwMDA4RjQyMDM1ODhFMjIwMDFDOEY0MzAwNDAyNDQyMDAwMTVCCis6MTA4NEIwMDAyNDYzRkZGRjAwNDMxMDI0QUY0MjAwMkMzMjQyMDA2MENGCis6MTA4NEMwMDAxNDQwMDAwODMyQzIwMDEwOEY0MjAwMzQyNDQyMDAwMUUwCis6MTA4NEQwMDBBRjQyMDAzNDhDMDMwMjNDMDA0MzEwMkIxNDQwMDEwMkQ1Cis6MTA4NEUwMDAzMkMyMDAxMDEwNDAwMDE4MjQwNzAwMDg4RjQ0MDE3MEE5Cis6MTA4NEYwMDA4RjQ1MDE3NDhGNDMwMDJDOEY0ODAwMEM4Rjg2MDEyMDFDCis6MTA4NTAwMDAyNDAyMDA4MEFGQTIwMDEwQUZBMzAwMTRBRkE4MDAxODhGCis6MTA4NTEwMDA4RjQyMDEwQzAwNDBGODA5MjRDNjAwMUMxMDQwMDA0NzlGCis6MTA4NTIwMDAyNDAyMDAwMThGNDIwMzAwOEY0MzAwMkMyNDQyMDAwMUVCCis6MTA4NTMwMDBBRjQyMDMwMDhGNDIwMzAwMjQwMjAwMDFBMzQyMDVDMUExCis6MTA4NTQwMDAxMDAwMDA3Q0FGNDMwMDM4OEY0NDAxNzA4RjQ1MDE3NEU4Cis6MTA4NTUwMDA4RjQzMDAyQzhGNDgwMDBDOEY4NjAxMjAyNDAyMDAyMEJFCis6MTA4NTYwMDBBRkEyMDAxMEFGQTMwMDE0QUZBODAwMTg4RjQyMDEwQ0Y3Cis6MTA4NTcwMDAwMDQwRjgwOTI0QzYwMDFDMTA0MDAwNTcyNDAyMDAwMUU2Cis6MTA4NTgwMDAxMDAwMDA2NTAwMDAwMDAwMzI0MjAwMTIxMDQwMDA3NTJCCis6MTA4NTkwMDAzMjQyMDAwMTk2MjIwMDBFOEY0MzAwOUMwMDYyMTgyMTk3Cis6MTA4NUEwMDAzMkMyMDAyMDEwNDAwMDA1QUY0MzAwOUM4RjQyMDM1OEE4Cis6MTA4NUIwMDAyNDQyRkZGRkFGNDIwMzU4OEY0MjAzNTg4RTIyMDAxQzEzCis6MTA4NUMwMDA4RjQzMDA0MDI0NDIwMDAxMjQ2M0ZGRkYwMDQzMTAyNDM2Cis6MTA4NUQwMDBBRjQyMDAyQzMyNDIwMDEwMTQ0MDAwMDgzMkMyMDAxMDlBCis6MTA4NUUwMDA4RjQyMDAzNDI0NDIwMDAxQUY0MjAwMzQ4QzAzMDIzQzJECis6MTA4NUYwMDAwMDQzMTAyQjE0NDAwMEJDMzJDMjAwMTAxMDQwMDAyODcxCis6MTA4NjAwMDAyNDA3MDAwODhGNDQwMTcwOEY0NTAxNzQ4RjQzMDAyQ0FDCis6MTA4NjEwMDA4RjQ4MDAwQzhGODYwMTIwMjQwMjAwODBBRkEyMDAxMDNBCis6MTA4NjIwMDBBRkEzMDAxNEFGQTgwMDE4OEY0MjAxMEMwMDQwRjgwOTU2Cis6MTA4NjMwMDAyNEM2MDAxQzE0NDAwMDExMjQwMjAwMDEzQzAxMDAwMTZBCis6MTA4NjQwMDAwMDM3MDgyMUEwMjI0MEYxOEY4MjAxMjRBRkEyMDAxMDQwCis6MTA4NjUwMDA4RjgyMDEyODNDMDQwMDAxMjQ4NDY3QzRBRkEyMDAxNDY3Cis6MTA4NjYwMDA4RjQ2MDAyQzhGODcwMTIwM0MwNTAwMDkwQzAwMkIzQjE2Cis6MTA4NjcwMDAzNEE1MTEwMDEwMDAwMDM2MDAwMDAwMDA4RjQyMDMwMEY2Cis6MTA4NjgwMDA4RjQzMDAyQzI0NDIwMDAxQUY0MjAzMDA4RjQyMDMwMEJECis6MTA4NjkwMDAyNDAyMDAwMUEzNDIwNUMxMTAwMDAwMjZBRjQzMDAzOEE4Cis6MTA4NkEwMDA4RjQ0MDE3MDhGNDUwMTc0OEY0MzAwMkM4RjQ4MDAwQzVDCis6MTA4NkIwMDA4Rjg2MDEyMDI0MDIwMDIwQUZBMjAwMTBBRkEzMDAxNDc3Cis6MTA4NkMwMDBBRkE4MDAxODhGNDIwMTBDMDA0MEY4MDkyNEM2MDAxQzE2Cis6MTA4NkQwMDAxNDQwMDAxMTI0MDIwMDAxM0MwMTAwMDEwMDM3MDgyMTcwCis6MTA4NkUwMDBBMDIyNDBGMDhGODIwMTI0QUZBMjAwMTA4RjgyMDEyOEM3Cis6MTA4NkYwMDAzQzA0MDAwMTI0ODQ2N0I4QUZBMjAwMTQ4RjQ2MDAyQzBDCis6MTA4NzAwMDA4Rjg3MDEyMDNDMDUwMDA5MEMwMDJCM0IzNEE1MDkwMDk0Cis6MTA4NzEwMDAxMDAwMDAwRjAwMDAwMDAwOEY0MjAzMDAyNDQyMDAwMUZGCis6MTA4NzIwMDBBRjQyMDMwMDhGNDIwMzAwOEY0MjAwMkNBMzQwMDVDMURCCis6MTA4NzMwMDBBRjQyMDAzODNDMDEwMDAxMDAzNzA4MjFBMDIwNDBGMTgxCis6MTA4NzQwMDAzQzAxMDAwMTAwMzcwODIxQTAyMDQwRjBBRjQwMDAzNDc4Cis6MTA4NzUwMDA4RjQyMDMxNDI0NDIwMDAxQUY0MjAzMTQxMDAwMDA2MjUwCis6MTA4NzYwMDA4RjQyMDMxNDEwNDAwMDIyMzI0MjcwMDA4RTI1MDAxQ0ZDCis6MTA4NzcwMDA4RjQyMDAyODAwQTIyMDIzMDQ4MTAwMDMwMDAwMDAwMDkzCis6MTA4NzgwMDA4RjQyMDA0MDAwODIyMDIxOEY0MjAzNTg4RjQzMDAwMDE3Cis6MTA4NzkwMDBBRjQ1MDAyODAwNDQxMDIxMTA2MDAwMDdBRjQyMDM1ODg1Cis6MTA4N0EwMDBBRjgwMDA0QzhGODIwMDRDMTA0MEZGRkQwMDAwMDAwMEE1Cis6MTA4N0IwMDAxMDAwMDAwNTAwMDAwMDAwQUY4MDAwNDg4RjgyMDA0OEQ0Cis6MTA4N0MwMDAxMDQwRkZGRDAwMDAwMDAwOEY4MjAwNjAzNDQyMDAwODZFCis6MTA4N0QwMDBBRjgyMDA2MDhGNDIwMDAwMTA0MDAwMDMwMDAwMDAwMEU0Cis6MTA4N0UwMDAxMDAwMDA0MUFGODAwMDRDMTAwMDAwM0ZBRjgwMDA0OEY3Cis6MTA4N0YwMDAxMDQwMDAyRjMyNDIxMDAwMTA0MDAwMEMzMjQyNDAwMDY2Cis6MTA4ODAwMDA4RTIzMDAxQzhGNDIwMDUwMDA2MjIwMjMwNDgyMDAwMTRFCis6MTA4ODEwMDAyNDg0MDIwMDhGNDIwMzVDMDA0NDEwMjFBRjQyMDM1Q0I5Cis6MTA4ODIwMDA4RjQyMDM2ODEwMDAwMDFBQUY0MzAwNTAxMDQwMDAwQzQ0Cis6MTA4ODMwMDAzMkMyODAwMDhFMjMwMDFDOEY0MjAwNzAwMDYyMjAyMzExCis6MTA4ODQwMDAwNDgyMDAwMTI0ODQwNDAwOEY0MjAzNjQwMDQ0MTAyMTQ4Cis6MTA4ODUwMDBBRjQyMDM2NDhGNDIwMzY4MTAwMDAwMERBRjQzMDA3MDA1Cis6MTA4ODYwMDAxMDQwMDAwRTNDMDIwODAwOEUyMzAwMUM4RjQyMDA2MDY2Cis6MTA4ODcwMDAwMDYyMjAyMzA0ODIwMDAxMjQ4NDAxMDA4RjQyMDM2MEVGCis6MTA4ODgwMDAwMDQ0MTAyMUFGNDIwMzYwOEY0MjAzNjhBRjQzMDA2MDkxCis6MTA4ODkwMDAwMDQ0MTAyMUFGNDIwMzY4M0MwMjA4MDAwMkMyMTAyNEM5Cis6MTA4OEEwMDA1MDQwMDAxMTM2OTQwMDQwMTAwMDAwMEYwMDAwMDAwMEZFCis6MTA4OEIwMDAzMjQyMDA0ODEwNDAwMDA3MjQxNTAwMDE4RTIyMDAxQzlGCis6MTA4OEMwMDAzQzAzRkZGRjAwNDNGMDI0MzA0MkZGRkYxMDAwRkQ3NTIyCis6MTA4OEQwMDBBRTIyMDAxQzMyNDIwMTAwMTA0MDAwMDMwMDAwMDAwMEU0Cis6MTA4OEUwMDAwQzAwMkJEODAwMDAwMDAwOEZCRjAwNTA4RkJFMDA0QzQyCis6MTA4OEYwMDA4RkI1MDA0ODhGQjMwMDQ0OEZCMjAwNDA4RkIxMDAzQzY5Cis6MTA4OTAwMDA4RkIwMDAzODAzRTAwMDA4MjdCRDAwNTgwM0UwMDAwOERFCis6MTA4OTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA4RjgzMDBFNDYxCis6MTA4OTIwMDA4RjgyMDBFMDI0MDRGRkY4MDA0NDEwMjQwMDYyMTAyNjI3Cis6MTA4OTMwMDAwMDAyMTAyQjAwMDIxMDIzMDNFMDAwMDgwMDYyMTAyNDQ0Cis6MTA4OTQwMDAwM0UwMDAwODAwMDAwMDAwMjdCREZGRTBBRkJGMDAxQ0VGCis6MTA4OTUwMDBBRkIwMDAxODhGODYwMEM0OEY4NDAwRTA4Rjg1MDBFNERDCis6MTA4OTYwMDAyNDAyRkZGODAwODIxODI0MTBBMzAwMDkyNzYyM0ZGOEIwCis6MTA4OTcwMDAxNEEyMDAwMjI0QTIwMDA4Mjc2MjMwMDAwMDQwODAyMUQ3Cis6MTA4OTgwMDAxNjAzMDAwNTMwODIwMDA0MTA0MDAwMDQwMEMwMjAyMUJFCis6MTA4OTkwMDAxMDAwMDAyMjAwMDAxMDIxOEUwNDAwMDA4RjQyMDExQ0Y0Cis6MTA4OUEwMDAxNEEyMDAwMzAwMDAwMDAwOEY0MjAxMjBBRjQyMDExNDE2Cis6MTA4OUIwMDA4Q0EzMDAwMDhGNDIwMTQ4MDA4MzE4MjMwMDQzMTAyQjMyCis6MTA4OUMwMDAxMDQwMDAwMzAwMDAwMDAwOEY0MjAxNDgwMDYyMTgyMTlGCis6MTA4OUQwMDA5NEEyMDAwNjI0NDIwMDUwMDA2MjEwMkIxNDQwMDAwRkE1Cis6MTA4OUUwMDAwMEEwMTAyMUFGQTQwMDEwQUZBMzAwMTQ4Q0E2MDAwMEJCCis6MTA4OUYwMDA4Q0E3MDAwNDNDMDQwMDAxMEMwMDJCM0IyNDg0Njg5NEU5Cis6MTA4QTAwMDA4RjQyMDIwQzI0NDIwMDAxQUY0MjAyMEM4RjQyMDIwQzQyCis6MTA4QTEwMDAwMDAwMTAyMUFGOTAwMEU4QUY5MDAwRTQ4RkJGMDAxQzcxCis6MTA4QTIwMDA4RkIwMDAxODAzRTAwMDA4MjdCRDAwMjAwM0UwMDAwODE1Cis6MTA4QTMwMDAwMDAwMDAwMDhGODQwMEUwOEY4ODAwQzQ4RjgzMDBFODZFCis6MTA4QTQwMDAyNDAyRkZGODAwODIzODI0MDBFMzIwMjMyQzgyMTAwMDQ3Cis6MTA4QTUwMDA1MDQwMDAwMTI0ODQxMDAwMDAwNDIwQzIwMDgwMTgyMTJFCis6MTA4QTYwMDA4RjQ0MDI1ODhGNDUwMjVDMDAwMDEwMjEwMEEzMjgyMThBCis6MTA4QTcwMDAwMEEzMzAyQjAwODIyMDIxMDA4NjIwMjFBRjQ0MDI1ODIxCis6MTA4QTgwMDBBRjQ1MDI1QzhGODMwMEM4OEY0MjAxNDgwMTAzMjAyMzU5Cis6MTA4QTkwMDAwMDgyMTAyQjE0NDAwMDA0MDA4MDE4MjE4RjQyMDE0OEVFCis6MTA4QUEwMDAwMDgyMjAyMTAwODAxODIxOEY0NDAyNTA4RjQ1MDI1NEZCCis6MTA4QUIwMDAwMDAwMTAyMTAwQTMyODIxMDBBMzMwMkIwMDgyMjAyMUQ4Cis6MTA4QUMwMDAwMDg2MjAyMUFGNDQwMjUwQUY0NTAyNTRBRjg4MDBDODUxCis6MTA4QUQwMDBBRjg3MDBFNEFGODcwMEU4MDNFMDAwMDgwMDAwMDAwMDczCis6MTA4QUUwMDAyN0JERkYzMDI0MEEwMDAxQUZCRjAwQzhBRkJFMDBDNERECis6MTA4QUYwMDBBRkI1MDBDMEFGQjMwMEJDQUZCMjAwQjhBRkIxMDBCNDA3Cis6MTA4QjAwMDBBRkIwMDBCMEEzQTAwMDk3QUZBMDAwNDRBRkFBMDA1QzM0Cis6MTA4QjEwMDA5MzQyMDVDNEE3QTAwMDhFMTA0MDAwMEFBN0EwMDA4NkJCCis6MTA4QjIwMDA4RjRCMDBDNEFGQUIwMDY0OEY0QTAwQzBBRkFBMDA2QzhCCis6MTA4QjMwMDA4RjRCMDBDQ0FGQUIwMDc0OEY0QTAwQzgxMDAwMDEyOUU2Cis6MTA4QjQwMDBBRkFBMDA3QzhGNDIwMTE0MDA0MEY4MDkwMDAwMDAwMDI5Cis6MTA4QjUwMDAwMDQwMzAyMTEwQzAwMzRGMDAwMDAwMDA4Q0MyMDAwMDE0Cis6MTA4QjYwMDA4Q0MzMDAwNEFGQTIwMDIwQUZBMzAwMjQ4RkFCMDAyNDZECis6MTA4QjcwMDA4RkFBMDAyMDMxNjJGRkZGMjQ0MkZGRkNBRkEyMDA2Q0VECis6MTA4QjgwMDAzQzAyMDAwNjAyQzIxMDI0QUZBQjAwN0MxNDQwMDAxNTZBCis6MTA4QjkwMDBBRkFBMDA2NDkxNDIwMDAwMzA0MjAwMDExMDQwMDAxMTcxCis6MTA4QkEwMDAyNDAyRkZGRjhENDMwMDAwMTQ2MjAwMDQzNDAyRkZGRjIzCis6MTA4QkIwMDA5NTQzMDAwNDEwNjIwMDBCMDAwMDAwMDAwQzAwMjRCQjcxCis6MTA4QkMwMDA4RkE0MDA2NDMwNDIwMEZGMTQ0MDAwMDYwMDAwMDAwMDQzCis6MTA4QkQwMDA4RjQyMDExODAwNDBGODA5MDAwMDAwMDAxMDAwMDMyRDJBCis6MTA4QkUwMDAwMDAwMDAwMDhGQTIwMDI0M0MwM0ZGQkYzNDYzRkZGRjlFCis6MTA4QkYwMDAwMDQzMTAyNDNDMDNGRkZGMDA0MzE4MjQxNDYwMDAwM0NCCis6MTA4QzAwMDBBRkEyMDAyNDEwMDAwMDQwMDAwMDE4MjEzQzAyMDA4MEE4Cis6MTA4QzEwMDAwMDYyMTAyNDEwNDAwMDA3MDAwMDAwMDA4RjQyMDM4QzA3Cis6MTA4QzIwMDAyNDQyMDAwMUFGNDIwMzhDOEY0MjAzOEMxMDAwMDAzNkI3Cis6MTA4QzMwMDAyNDAzMDAwMThGNDIwMjEwMjQ0MjAwMDFBRjQyMDIxMEJGCis6MTA4QzQwMDA4RjQyMDIxMDNDMDIwMDAxMDA2MjEwMjQxMDQwMDAwNjE2Cis6MTA4QzUwMDAzQzAyMDAwMjhGNDIwMUM0MjQ0MjAwMDFBRjQyMDFDNDIxCis6MTA4QzYwMDA4RjQyMDFDNDNDMDIwMDAyMDA2MjEwMjQxMDQwMDAwNjQyCis6MTA4QzcwMDAzQzAyMDAwNDhGNDIwMzdDMjQ0MjAwMDFBRjQyMDM3QzhCCis6MTA4QzgwMDA4RjQyMDM3QzNDMDIwMDA0MDA2MjEwMjQxMDQwMDAwNjY2Cis6MTA4QzkwMDAzQzAyMDAwODhGNDIwMzgwMjQ0MjAwMDFBRjQyMDM4MDVGCis6MTA4Q0EwMDA4RjQyMDM4MDNDMDIwMDA4MDA2MjEwMjQxMDQwMDAwNjNFCis6MTA4Q0IwMDAzQzAyMDAxMDhGNDIwMzg0MjQ0MjAwMDFBRjQyMDM4NDJGCis6MTA4Q0MwMDA4RjQyMDM4NDNDMDIwMDEwMDA2MjEwMjQxMDQwMDAwNjEyCis6MTA4Q0QwMDAzQzAyMDAyMDhGNDIwMUMwMjQ0MjAwMDFBRjQyMDFDMDhCCis6MTA4Q0UwMDA4RjQyMDFDMDNDMDIwMDIwMDA2MjEwMjQxMDQwMDAwNkE4Cis6MTA4Q0YwMDAyNDAzMDAwMThGNDIwMzg4MjQ0MjAwMDFBRjQyMDM4ODBECis6MTA4RDAwMDA4RjQyMDM4ODI0MDMwMDAxOEMwMjAyNjA4RkFCMDA2QzQ5Cis6MTA4RDEwMDAwMDRCMTAyQjEwNDAwMDE0MzA3MDAwRkY4RjQyMDFFODEwCis6MTA4RDIwMDAyNDQyMDAwMUFGNDIwMUU4OEY0MjAxRTg4RkFBMDA3QzkzCis6MTA4RDMwMDA4RjgyMDBFMDM1NEEwMTAwQUZBQTAwN0NBRkEyMDAxMDhDCis6MTA4RDQwMDA4RjgyMDBFNDI0MTAwMDAxM0MwNDAwMDEyNDg0NjhBMDA4Cis6MTA4RDUwMDBBRkEyMDAxNDhGQTYwMDIwOEZBNzAwMjQzQzA1MDAwN0I3Cis6MTA4RDYwMDAwQzAwMkIzQjM0QTUwODAwMTIwMDAwMTAzQzAyMDA4MEQwCis6MTA4RDcwMDAwMkMyMTAyNDE0NDAwMDBFMzJDMjA0MDA4RkFCMDA3Q0VCCis6MTA4RDgwMDAzQzAyMDA4MDM0NDIwMTAwMDE2MjEwMjQxMDQwMDAwNUMyCis6MTA4RDkwMDAwMDAwMDAwMDhGNDIwMjBDMjQ0MjAwMDFBRjQyMDIwQzhFCis6MTA4REEwMDA4RjQyMDIwQzEwMDAwMkIwOEZBMzAwNkMzMkMyMDQwMDhDCis6MTA4REIwMDAxMDQwMDAxNTM0MDI4MTAwOEZBQTAwNjQ5NTQzMDAwQzE2Cis6MTA4REMwMDAxNDYyMDAxMjNDMDIwMTAwMjQwQjAyMDBBN0FCMDA4RUNCCis6MTA4REQwMDA5NTQyMDAwRThENDMwMDA4OEQ0NDAwMDQ4RDQ1MDAwMDJGCis6MTA4REUwMDA4RkFBMDA2QzhGQUIwMDY0MjU0QUZGRkNBRkFBMDA2QzExCis6MTA4REYwMDBBN0EyMDA4NkFENjMwMDBDQUQ2NDAwMDhBRDY1MDAwNDU5Cis6MTA4RTAwMDAyNTZCMDAwNEFGQUIwMDY0M0MwMjAxMDAwMkMyMTAyNEQ5Cis6MTA4RTEwMDAxMDQwMDAwNDAwMDAwMDAwOEZBQTAwNkMyNTRBMDAwNEU2Cis6MTA4RTIwMDBBRkFBMDA2QzhGNDIwMEJDNTA0MDAwMEFBRkEwMDA3NDkzCis6MTA4RTMwMDA4RkFCMDA2QzAwNEIxMDJCNTA0MDAwMDZBRkEwMDA3NEFECis6MTA4RTQwMDA4RjQyMDBCQzAxNjIxMDIzQUZBMjAwNzQ4RjRBMDBCQ0E1Cis6MTA4RTUwMDBBRkFBMDA2QzhGNDIwMDgwOEZBQjAwNkMwMDRCMTAyQkQwCis6MTA4RTYwMDAxMDQwMDA1NjMyQzI4MDAwMTA0MDAwNUUyNDBBMDAwMzA5Cis6MTA4RTcwMDAzMkMyMTAwMDEwNDAwMDVCQUZBQTAwNUMxMDAwMDA1ODI2Cis6MTA4RTgwMDAyNDBCMDAwNDhGNDIwMzUwMjQwM0ZGQkYwMjgzQTAyNDVECis6MTA4RTkwMDAyNDQyMDAwMUFGNDIwMzUwMTAwMDAyNEY4RjQyMDM1MEEyCis6MTA4RUEwMDAwMkMyQjAyNTI0MDJGRkJGMDI4MkEwMjQ4RjgzMDEyOEMyCis6MTA4RUIwMDAzQzA0MDAwMTI0ODQ2OEQwMjY2MjAwMDFBRkEyMDAxNEEzCis6MTA4RUMwMDBBRkEzMDAxMDhGODYwMTIwOEY4NzAxMjQzQzA1MDAwNzg3Cis6MTA4RUQwMDAwQzAwMkIzQjM0QTUyMjUwMTAwMDAyM0YwMDAwMDAwMDg0Cis6MTA4RUUwMDAwMkMyQjAyNTI0MDJGRkJGMDI4MkEwMjQ4RjgzMDEyODgyCis6MTA4RUYwMDAzQzA0MDAwMTI0ODQ2OEQwMjQwMjAwMDJBRkEyMDAxNEM0Cis6MTA4RjAwMDBBRkEzMDAxMDhGODYwMTIwOEY4NzAxMjQzQzA1MDAwNzQ2Cis6MTA4RjEwMDAwQzAwMkIzQjM0QTUyNDUwMTAwMDAyMkYwMDAwMDAwMDUxCis6MTA4RjIwMDA4RUEyMDAwMDhFQTMwMDA0M0MwNDAwMDEyNDg0NjhFOEEzCis6MTA4RjMwMDBBRkIwMDAxMEFGQkUwMDE0OEVBNzAwMTgzNEE1MjgwMEYzCis6MTA4RjQwMDAwQzAwMkIzQjAwNjAzMDIxMTAwMDAyMjMwMDAwMDAwMEM5Cis6MTA4RjUwMDBBNkIxMDAwQThGODIwMTI0M0MwNDAwMDEyNDg0NjhGMDM5Cis6MTA4RjYwMDBBRkJFMDAxNEFGQTIwMDEwOEY0NjAwNDQ4Rjg3MDEyMENGCis6MTA4RjcwMDAzQzA1MDAwNzBDMDAyQjNCMzRBNTMwMDAxMDAwMDIxNjA2Cis6MTA4RjgwMDAwMDAwMDAwMEE2QjEwMDBBQTZCMjAwMEU4RjgyMDEyNEU0Cis6MTA4RjkwMDAzQzA0MDAwMTI0ODQ2OEZDQUZCRTAwMTRBRkEyMDAxMEEyCis6MTA4RkEwMDA4RjQ2MDA0NDhGODcwMTIwM0MwNTAwMDcwQzAwMkIzQkI3Cis6MTA4RkIwMDAzNEE1MzIwMDEwMDAwMjA4MDAwMDAwMDA4RjQyMDA4NDM3Cis6MTA4RkMwMDA4RkFBMDA2QzAwNEExMDJCMTQ0MDAwMDczQzAyMDAwMURECis6MTA4RkQwMDAwMkMyMTAyNDEwNDAwMDA0MDAwMDAwMDAyNDBCMDAwMjE0Cis6MTA4RkUwMDBBRkFCMDA1QzhGQUEwMDZDMTE0MDAyMUIyN0FCMDAyMEM2Cis6MTA4RkYwMDBBRkFCMDBBNDNDMEEwMDFGMzU0QUZGRkZBRkFBMDA5QzlDCis6MTA5MDAwMDA4RkFCMDA1QzI0MEEwMDAxNTU2QTAwMjEyNDBBMDAwMjhCCis6MTA5MDEwMDA4RjQzMDA1NDhGNDIwMDUwMTA2MjAwMEIyNzRCMDA1NEM2Cis6MTA5MDIwMDA4RjVFMDA1NDM0MDNFQ0MwQUZBQjAwNEMyN0MyMDAwMThDCis6MTA5MDMwMDAzMDQyMDFGRkFGQTIwMDU0MDAxRTExNDAwMDQzMTAyMTM2Cis6MTA5MDQwMDAxMDAwMDA2QjAyRTJBODIxOEY0MjAwNDQ4RkFBMDA2QzNFCis6MTA5MDUwMDAzQzA0MDAwMTI0ODQ2OEFDQUZBQTAwMTRBRkEyMDAxMDQ1Cis6MTA5MDYwMDA4RjQ2MDA1NDhGNDcwMDUwM0MwNTAwMDcwQzAwMkIzQkY3Cis6MTA5MDcwMDAzNEE1MTMwMDhGNDMwMzUwMjQwMkZGQkYwMjgyQTAyNEIzCis6MTA5MDgwMDAyNDYzMDAwMUFGNDMwMzUwMTAwMDAxRDM4RjQyMDM1MDBCCis6MTA5MDkwMDAxNTZBMDAxRDAwMDAwMDAwOEY0MzAwNzQ4RjQyMDA3MEFECis6MTA5MEEwMDAxMDYyMDAwQTI3NEIwMDc0OEY1RTAwNzRBRkFCMDA0QzU3Cis6MTA5MEIwMDAyN0MyMDAwMTMwNDIwM0ZGQUZBMjAwNTQwMDFFMTE0MDNFCis6MTA5MEMwMDAyNDQyNkNDMDEwMDAwMDRBMDJFMkE4MjE4RjQyMDA0NEYyCis6MTA5MEQwMDA4RkFBMDA2QzNDMDQwMDAxMjQ4NDY4QjgzQzA1MDAwNzlBCis6MTA5MEUwMDBBRkFBMDAxNEFGQTIwMDEwOEY0NjAwNzQ4RjQ3MDA3MDIzCis6MTA5MEYwMDAzNEE1MTUwMDI0MEIwMDAxMEMwMDJCM0JBRkFCMDA1QzJBCis6MTA5MTAwMDAxMDAwRkZDMzAwMDAwMDAwOEY0MzAwNjQ4RjQyMDA2MDI2Cis6MTA5MTEwMDAxMDYyMDAxQTI3NEEwMDY0OEY1RTAwNjQ4RkFCMDA1QzA3Cis6MTA5MTIwMDBBRkFBMDA0QzI3QzIwMDAxMzA0MjAwRkZBRkEyMDA1NDlBCis6MTA5MTMwMDAyNDAyMDAwNDE1NjIwMDBFMDAxRTExNDAwMDFFMTE4MDYyCis6MTA5MTQwMDAyNDQyMENDMDAyRTIxMDIxQUZBMjAwNDQ5NDQyMDAyQTQzCis6MTA5MTUwMDA4RkFBMDA0NDhGQUIwMDZDMDA0QjEwMkIxMDQwMDAyNEYyCis6MTA5MTYwMDAyNTU1MDAyMDI0MEEwMDAxMTAwMDAwMjFBM0FBMDA5NzIxCis6MTA5MTcwMDAyNDQyNENDMDEwMDAwMDFFMDJFMkE4MjE4RjQyMDA0NDhECis6MTA5MTgwMDA4RkFCMDA2QzNDMDQwMDAxMjQ4NDY4QzRBRkFCMDAxNEI2Cis6MTA5MTkwMDBBRkEyMDAxMDhGNDYwMDY0OEY0NzAwNjAzQzA1MDAwN0I3Cis6MTA5MUEwMDAwQzAwMkIzQjM0QTUxODAwM0MwMjAwMDgwMkMyMTAyNDFFCis6MTA5MUIwMDAxNDQwRkYzNDAwMDAwMDAwOEY0MjAzNzAyNDBBMDAwMUI1Cis6MTA5MUMwMDBBRkFBMDA1QzI0NDIwMDAxQUY0MjAzNzAxMDAwRkY5MDgwCis6MTA5MUQwMDA4RjQyMDM3MDI3QTMwMDM2MDAxMzEwNDAwMDYyMTgyMTRECis6MTA5MUUwMDA5NDYyMDAwMDAwNDQxMDIxMTAwMDAwMjBBNDYyMDAwMERFCis6MTA5MUYwMDA4RkFCMDA2NEFFQUIwMDE4OTNBMjAwOTcxMDQwMDA3MkQyCis6MTA5MjAwMDAwMDAwOTgyMThGQUEwMDQ0OEZBNDAwNkM4RkEzMDBBNEIzCis6MTA5MjEwMDAyNTQyMDAyMEFGQTIwMDI4MjU0MjAwMDhBRkEyMDAzMDVFCis6MTA5MjIwMDAyNTQyMDAxMEFGQUEwMDJDQUZBMjAwMzQ5NTQyMDAyQUJDCis6MTA5MjMwMDBBN0EyMDAzODk1NDIwMDE4QTdBMjAwM0E5NTQyMDAxQTRBCis6MTA5MjQwMDBBN0EyMDAzQzk1NDIwMDFDQTdBMjAwM0U5NDYyMDAxODExCis6MTA5MjUwMDAyNDYzMDAwMjAwODIyMDIzMTg4MEZGREUyNjczMDAwMUIxCis6MTA5MjYwMDAyRTYyMDAwNDE0NDBGRkY5MDAwMDAwMDA4RjQyMDBGQzUxCis6MTA5MjcwMDAyNjY1MDAwMTAwQTIxMDJBMTQ0MDAwMkIyNDAzMDAwMURGCis6MTA5MjgwMDA4RjgzMDEyQzEwNjAwMDIzMDAwMDAwMDA4RjgyMDEyNEQ2Cis6MTA5MjkwMDAwMDQzMTAyMzAwMDIyMTQzNTg4MDAwMDEyNDg0MDA0MDMxCis6MTA5MkEwMDA4RjgyMDEyODAwNDMxMDIzMDAwMjE5NDM1ODYwMDAwMUY3Cis6MTA5MkIwMDAyNDYzMDA0MDAwNjQxMDJBNTQ0MDAwMDEwMDYwMjAyMTEzCis6MTA5MkMwMDBBRjQ0MDBGQzhGNDIwMEZDMDBBMjEwMkExMDQwMDAxMUE1Cis6MTA5MkQwMDAyNDAzMDAwMTEwMDAwMDE1MzA2MjAwRkY4RkFCMDA2NDEyCis6MTA5MkUwMDA5NjA3MDAxOEFGQUIwMDEwOEUyMjAwMDgzQzA0MDAwMTY2Cis6MTA5MkYwMDAyNDg0NjhEQzhDNDMwMDA0OEM0MjAwMDAzNEE1MjQwMEU0Cis6MTA5MzAwMDAwMjQwMzAyMTBDMDAyQjNCQUZBMzAwMTQxMDAwMDAyQkI3Cis6MTA5MzEwMDAwMDAwMDAwMDhGNDIwMzM0MDAwMDE4MjEyNDQyMDAwMUE1Cis6MTA5MzIwMDBBRjQyMDMzNDhGNDIwMzM0MzA2MjAwRkY1MDQwRkVEQzEyCis6MTA5MzMwMDAzQzAyMDgwMDEyNjAwMDIxMDAwMDkwMjE4RkIxMDBBNEJGCis6MTA5MzQwMDAwMjIwODAyMThFMjIwMDA4OTYwNzAwMTg4RkE2MDA2NDU0Cis6MTA5MzUwMDA4QzQ0MDAwMDhDNDUwMDA0MjQwQTAwMDFBRkFBMDAxMEQwCis6MTA5MzYwMDBBRkJFMDAxNDhGNDIwMDA4QUZBMjAwMTg4RjQyMDEwQzVDCis6MTA5MzcwMDAwMDQwRjgwOTAwMDAwMDAwMTA0MEZGRDgzQzA1MDAwNzNECis6MTA5MzgwMDA5NjAyMDAxODhGQUIwMDY0OEZBQTAwOUMwMTYyNTgyMURFCis6MTA5MzkwMDAwMTRCMTAyQjEwNDAwMDA0QUZBQjAwNjQ4RjQyMDE0ODFBCis6MTA5M0EwMDAwMTYyNTgyM0FGQUIwMDY0MjYxMDAwMDIyNjUyMDAwMTcwCis6MTA5M0IwMDAwMjUzMTAyQjE0NDBGRkUzMjYzMTAwMDQ4RkIwMDA2Q0UxCis6MTA5M0MwMDAxMDAwMDAzNjk3QjEwMDM4OEY0MjAwRkMyNDA1MDAwMkRGCis6MTA5M0QwMDAwMEEyMTAyQTE0NDAwMDFCMjQwMzAwMDE4RjgzMDEyQ0RCCis6MTA5M0UwMDAxMDYwMDAxMzAwMDAwMDAwOEY4MjAxMjQwMDQzMTAyMzRFCis6MTA5M0YwMDAwMDAyMjE0MzU4ODAwMDAxMjQ4NDAwNDA4RjgyMDEyODBDCis6MTA5NDAwMDAwMDQzMTAyMzAwMDIxOTQzNTg2MDAwMDEyNDYzMDA0MDA4Cis6MTA5NDEwMDAwMDY0MTAyQTU0NDAwMDAxMDA2MDIwMjFBRjQ0MDBGQzg5Cis6MTA5NDIwMDA4RjQyMDBGQzAwQTIxMDJBMTQ0MDAwMDYyNDAzMDAwMTExCis6MTA5NDMwMDA4RjQyMDMzNDAwMDAxODIxMjQ0MjAwMDFBRjQyMDMzNDVDCis6MTA5NDQwMDA4RjQyMDMzNDMwNjIwMEZGMTA0MEZFQTUzQzAyMDgwMDRBCis6MTA5NDUwMDA5NkIxMDAwQThGQjAwMDZDMzIyM0ZGRkYwMDcwMTAyQjEyCis6MTA5NDYwMDA1NDQwMDAwMTAwNjA4MDIxOEVBNDAwMDA4RUE1MDAwNEZECis6MTA5NDcwMDAyNDBCMDAwMUFGQUIwMDEwQUZCRTAwMTQ4RjQyMDAwOEY4Cis6MTA5NDgwMDA4RkE2MDA2NEFGQTIwMDE4OEY0MjAxMEMwMDQwRjgwOUJCCis6MTA5NDkwMDAwMjAwMzgyMTEwNDBGRUEyM0MwNTAwMDc5NkEzMDAwRUYyCis6MTA5NEEwMDA5N0FBMDA4RTExNDAwMDA3MDA2MDkwMjE5MzQyMDVDNEU2Cis6MTA5NEIwMDAxNDQwMDAwNDAwMDAwMDAwOTdBQjAwODYwMDZBMTgyNUU1Cis6MTA5NEMwMDBBNkFCMDAxNjhGQUEwMDdDM0MwMkZGRkYwMTQyMTAyNENECis6MTA5NEQwMDAxMDQwMDAwMzAwMEExNDAyMzQ2MzA0MDBBNkEyMDAxNDIyCis6MTA5NEUwMDA4RkFCMDA2QzU2MEIwMDcyQTZBMzAwMEUzNDYyMDAwNDEyCis6MTA5NEYwMDBBNkEyMDAwRThGQUEwMDc0MDE2QTEwMjFBNkEyMDAwQTdCCis6MTA5NTAwMDA4RjQzMDA0NDhGNDQwMUEwOEY0NTAxQTQzNDAyODAwMEEyCis6MTA5NTEwMDBBRkEyMDAxMDhGNDIwMDQ0MDJBMDMwMjEyNDA3MDAyMDk3Cis6MTA5NTIwMDBBRkEyMDAxNDhGNDIwMDBDMDAwMzE5NDAwMDYwNDgyMUQ0Cis6MTA5NTMwMDBBRkEyMDAxODhGNDIwMTBDMDAwMDQwMjEwMEE5MjgyMTkxCis6MTA5NTQwMDAwMEE5MTgyQjAwODgyMDIxMDA0MEY4MDkwMDgzMjAyMTYxCis6MTA5NTUwMDA1MDQwRkU3RkE2QjIwMDBFOEY0MjAzNjhBRkEwMDA2Q0ExCis6MTA5NTYwMDBBMzQwMDVDNDI0NDJGRkZGQUY0MjAzNjg4RkFCMDA1Q0Y5Cis6MTA5NTcwMDAyNDBBMDAwMThGNDIwMzY4MTU2QTAwMDYyNDBBMDAwMkNCCis6MTA5NTgwMDA4RjQyMDM1QzI0NDJGRkZGQUY0MjAzNUMxMDAwMDAwQ0RCCis6MTA5NTkwMDA4RjQyMDM1QzE1NkEwMDA2MDAwMDAwMDA4RjQyMDM2NERFCis6MTA5NUEwMDAyNDQyRkZGRkFGNDIwMzY0MTAwMDAwMDU4RjQyMDM2NEIyCis6MTA5NUIwMDA4RjQyMDM2MDI0NDJGRkZGQUY0MjAzNjA4RjQyMDM2MDhCCis6MTA5NUMwMDA4RkFBMDA1NDhGQUIwMDRDQUQ2QTAwMDA4RjQyMDA0NDVDCis6MTA5NUQwMDA4RjQ0MDA4ODhGNDMwMDc4MjQ0MjAwMDEwMDQ0MTAyNDA3Cis6MTA5NUUwMDAyNDYzMDAwMUFGNDIwMDQ0QUY0MzAwNzg4QzAyMDI0MDg0Cis6MTA5NUYwMDAwMDYyMTgyQjE0NjAwMDc1MjQwNzAwMDg4RjQ0MDE2ODZFCis6MTA5NjAwMDA4RjQ1MDE2QzhGNDMwMDQ0OEY0ODAwMEM4Rjg2MDEyMEVBCis6MTA5NjEwMDAyNDAyMDA0MEFGQTIwMDEwQUZBMzAwMTRBRkE4MDAxOEFFCis6MTA5NjIwMDA4RjQyMDEwQzAwNDBGODA5MjRDNjAwMUMxNDQwMDAxMUIwCis6MTA5NjMwMDAyNDBCMDAwMTNDMDEwMDAxMDAzNzA4MjFBMDJCNDBGMjVGCis6MTA5NjQwMDA4RjgyMDEyNEFGQTIwMDEwOEY4MjAxMjgzQzA0MDAwMTA4Cis6MTA5NjUwMDAyNDg0Njg4Q0FGQTIwMDE0OEY0NjAwNDQ4Rjg3MDEyMEI5Cis6MTA5NjYwMDAzQzA1MDAwOTBDMDAyQjNCMzRBNTEzMDAxMDAwMDAwQjM3Cis6MTA5NjcwMDAwMDAwMDAwMDhGNDIwMzA0MjQ0MjAwMDFBRjQyMDMwNEIzCis6MTA5NjgwMDA4RjQyMDMwNDhGNDIwMDQ0QUY0MjAwN0MzQzAxMDAwMTQyCis6MTA5NjkwMDAwMDM3MDgyMUEwMjA0MEYyQUY0MDAwNzg4RjQyMDMxODI1Cis6MTA5NkEwMDAyNDQyMDAwMUFGNDIwMzE4MTAwMDAwNDg4RjQyMDMxODAzCis6MTA5NkIwMDBBNkIwMDAwQThGNDMwMDQ0OEY0NDAxQTA4RjQ1MDFBNDQ3Cis6MTA5NkMwMDAzNDAyODAwMEFGQTIwMDEwOEY0MjAwNDQwMkEwMzAyMTdCCis6MTA5NkQwMDAyNDA3MDAyMEFGQTIwMDE0OEY0MjAwMEMwMDAzMTk0MEExCis6MTA5NkUwMDAwMDYwNDgyMUFGQTIwMDE4OEY0MjAxMEMwMDAwNDAyMTA5Cis6MTA5NkYwMDAwMEE5MjgyMTAwQTkxODJCMDA4ODIwMjEwMDQwRjgwOTgyCis6MTA5NzAwMDAwMDgzMjAyMTEwNDBGRTFGMjQwQTAwMDFBMzRBMDVDNDQzCis6MTA5NzEwMDA4RkFCMDA2QzhGQUEwMDY0MDE3MDU4MjNBRkFCMDA2QzU0Cis6MTA5NzIwMDA4RkFCMDA5QzAxNTA1MDIxMDE2QTEwMkIxMDQwMDAwNEE3Cis6MTA5NzMwMDBBRkFBMDA2NDhGNDIwMTQ4MDE0MjUwMjNBRkFBMDA2NERGCis6MTA5NzQwMDA4RjQyMDM2ODI0NDJGRkZGQUY0MjAzNjg4RkFBMDA1Qzg4Cis6MTA5NzUwMDAyNDBCMDAwMThGNDIwMzY4MTU0QjAwMDYyNDBCMDAwMjA2Cis6MTA5NzYwMDA4RjQyMDM1QzI0NDJGRkZGQUY0MjAzNUMxMDAwMDAwQ0Y5Cis6MTA5NzcwMDA4RjQyMDM1QzExNEIwMDA2MDAwMDAwMDA4RjQyMDM2MDIzCis6MTA5NzgwMDAyNDQyRkZGRkFGNDIwMzYwMTAwMDAwMDU4RjQyMDM2MEQ4Cis6MTA5NzkwMDA4RjQyMDM2NDI0NDJGRkZGQUY0MjAzNjQ4RjQyMDM2NDlECis6MTA5N0EwMDA4RkFCMDA1NDhGQUEwMDRDQUQ0QjAwMDA4RjQyMDA0NDk5Cis6MTA5N0IwMDA4RjQ0MDA4ODhGNDMwMDc4MjQ0MjAwMDEwMDQ0MTAyNDI1Cis6MTA5N0MwMDAyNDYzMDAwMUFGNDIwMDQ0QUY0MzAwNzg4RkFBMDA2Q0NECis6MTA5N0QwMDAxNTQwRkUwQjAwMDAwMDAwOEZBQjAwNkMxMTYwMDAxRUY2Cis6MTA5N0UwMDAwMDAwMDAwMDkzNDIwNUM0MTA0MDAwMDkwMDAwMDAwMDgyCis6MTA5N0YwMDA4RkFBMDA2NEFGNEEwMEM0QUY0QjAwQzA4RkFCMDA3QzlGCis6MTA5ODAwMDBBRjRCMDBDODhGQUEwMDc0MTAwMDAwMEVBRjRBMDBDQzA2Cis6MTA5ODEwMDA5N0FCMDA4RTExNjAwMDBCMzQwMzgxMDA4RkEyMDAyMEYzCis6MTA5ODIwMDA4QzQ2MDAwQ0E0NDMwMDBDOTdBQTAwODY4QzQ0MDAwNENDCis6MTA5ODMwMDA4QzQ1MDAwOEE0NEEwMDBFQUM0NDAwMDBBQzQ1MDAwNDZFCis6MTA5ODQwMDBBQzQ2MDAwODhGNDIwMzRDMjQ0MjAwMDFBRjQyMDM0QzU3Cis6MTA5ODUwMDAxMDAwMDAxMDhGNDIwMzRDOEZBQjAwN0MzMTY0RkZGRjdGCis6MTA5ODYwMDAyNDg0RkZGQzAwODAxODIxOEY0NDAyNTA4RjQ1MDI1NDRECis6MTA5ODcwMDA4RjQ2MDExODAwMDAxMDIxMDBBMzI4MjEwMEEzMzgyQkQ3Cis6MTA5ODgwMDAwMDgyMjAyMTAwODcyMDIxQUY0NDAyNTAwMEMwRjgwOTQ3Cis6MTA5ODkwMDBBRjQ1MDI1NDhGQkYwMEM4OEZCRTAwQzQ4RkI1MDBDMDUzCis6MTA5OEEwMDA4RkIzMDBCQzhGQjIwMEI4OEZCMTAwQjQ4RkIwMDBCMERFCis6MTA5OEIwMDAwM0UwMDAwODI3QkQwMEQwMDNFMDAwMDgwMDAwMDAwMDFFCis6MTA5OEMwMDAyN0JERkYzODI0MEIwMDAxQUZCRjAwQzBBRkJFMDBCQ0Y2Cis6MTA5OEQwMDBBRkI1MDBCOEFGQjMwMEI0QUZCMjAwQjBBRkIxMDBBQzM5Cis6MTA5OEUwMDBBRkIwMDBBOEEzQTAwMDg3QUZBMDAwNDRBRkFCMDA1QzVFCis6MTA5OEYwMDA5MzQyMDVDNEE3QTAwMDc2MTA0MDAwMDdBN0EwMDA3RUYxCis6MTA5OTAwMDA4RjRDMDBDMEFGQUMwMDY0OEY0QjAwQzg4RjVFMDBDNEFBCis6MTA5OTEwMDAxMDAwMDEzMEFGQUIwMDZDOEY0MjAxMTQwMDQwRjgwOTE5Cis6MTA5OTIwMDAwMDAwMDAwMDAwNDAzMDIxMTBDMDAyQTEwMDAwMDAwMDMzCis6MTA5OTMwMDA4Q0MyMDAwMDhDQzMwMDA0QUZBMjAwMjBBRkEzMDAyNDlGCis6MTA5OTQwMDA4RkFDMDAyNDhGQkUwMDIwMzE4MkZGRkYyNDQyRkZGQzM5Cis6MTA5OTUwMDBBRkEyMDA2NDNDMDIwMDA2MDJDMjEwMjQxNDQwMDAxNUFECis6MTA5OTYwMDBBRkFDMDA2QzkzQzIwMDAwMzA0MjAwMDExMDQwMDAxMTA3Cis6MTA5OTcwMDAyNDAyRkZGRjhGQzMwMDAwMTQ2MjAwMDQzNDAyRkZGRkMzCis6MTA5OTgwMDA5N0MzMDAwNDEwNjIwMDBCMDAwMDAwMDAwQzAwMjRCQjExCis6MTA5OTkwMDAwM0MwMjAyMTMwNDIwMEZGMTQ0MDAwMDYwMDAwMDAwMEY4Cis6MTA5OUEwMDA4RjQyMDExODAwNDBGODA5MDAwMDAwMDAxMDAwMDI4MEZBCis6MTA5OUIwMDAwMDAwMDAwMDhGQTIwMDI0M0MwM0ZGQkYzNDYzRkZGRkMwCis6MTA5OUMwMDAwMDQzMTAyNDNDMDNGRkZGMDA0MzE4MjQxNDYwMDAwM0VECis6MTA5OUQwMDBBRkEyMDAyNDEwMDAwMDQwMDAwMDgwMjEzQzAyMDA4MDYzCis6MTA5OUUwMDAwMDYyMTAyNDEwNDAwMDA3MDAwMDAwMDA4RjQyMDM4QzJBCis6MTA5OUYwMDAyNDQyMDAwMUFGNDIwMzhDOEY0MjAzOEMxMDAwMDAzNkRBCis6MTA5QTAwMDAyNDEwMDAwMThGNDIwMjEwMjQ0MjAwMDFBRjQyMDIxMEQ0Cis6MTA5QTEwMDA4RjQyMDIxMDNDMDIwMDAxMDA2MjEwMjQxMDQwMDAwNjM4Cis6MTA5QTIwMDAzQzAyMDAwMjhGNDIwMUM0MjQ0MjAwMDFBRjQyMDFDNDQzCis6MTA5QTMwMDA4RjQyMDFDNDNDMDIwMDAyMDA2MjEwMjQxMDQwMDAwNjY0Cis6MTA5QTQwMDAzQzAyMDAwNDhGNDIwMzdDMjQ0MjAwMDFBRjQyMDM3Q0FECis6MTA5QTUwMDA4RjQyMDM3QzNDMDIwMDA0MDA2MjEwMjQxMDQwMDAwNjg4Cis6MTA5QTYwMDAzQzAyMDAwODhGNDIwMzgwMjQ0MjAwMDFBRjQyMDM4MDgxCis6MTA5QTcwMDA4RjQyMDM4MDNDMDIwMDA4MDA2MjEwMjQxMDQwMDAwNjYwCis6MTA5QTgwMDAzQzAyMDAxMDhGNDIwMzg0MjQ0MjAwMDFBRjQyMDM4NDUxCis6MTA5QTkwMDA4RjQyMDM4NDNDMDIwMDEwMDA2MjEwMjQxMDQwMDAwNjM0Cis6MTA5QUEwMDAzQzAyMDAyMDhGNDIwMUMwMjQ0MjAwMDFBRjQyMDFDMEFECis6MTA5QUIwMDA4RjQyMDFDMDNDMDIwMDIwMDA2MjEwMjQxMDQwMDAwNkNBCis6MTA5QUMwMDAyNDEwMDAwMThGNDIwMzg4MjQ0MjAwMDFBRjQyMDM4ODIyCis6MTA5QUQwMDA4RjQyMDM4ODI0MTAwMDAxOEMwMjAyNjA4RkFCMDA2NDY3Cis6MTA5QUUwMDAwMDRCMTAyQjEwNDAwMDE1MzIwMjAwRkY4RjQyMDFFODlFCis6MTA5QUYwMDAyNDQyMDAwMUFGNDIwMUU4OEY0MjAxRTg4RkFDMDA2Q0M0Cis6MTA5QjAwMDA4RjgyMDBFMDM1OEMwMTAwQUZBQzAwNkNBRkEyMDAxMDdBCis6MTA5QjEwMDA4RjgyMDBFNDI0MTAwMDAxM0MwNDAwMDEyNDg0NjhBMDJBCis6MTA5QjIwMDBBRkEyMDAxNDhGQTYwMDIwOEZBNzAwMjQzQzA1MDAwN0Q5Cis6MTA5QjMwMDAwQzAwMkIzQjM0QTUzNjAwMzIwMjAwRkYxMDQwMDAxMDExCis6MTA5QjQwMDAzQzAyMDA4MDAyQzIxMDI0MTQ0MDAwMEUzMkMyMDQwMDA1Cis6MTA5QjUwMDA4RkFCMDA2QzNDMDIwMDgwMzQ0MjAxMDAwMTYyMTAyNDkzCis6MTA5QjYwMDAxMDQwMDAwNTAwMDAwMDAwOEY0MjAyMEMyNDQyMDAwMTVBCis6MTA5QjcwMDBBRjQyMDIwQzhGNDIwMjBDMTAwMDAyMDI4RkEzMDA2NDVECis6MTA5QjgwMDAzMkMyMDQwMDEwNDAwMDEyMzQwMjgxMDA5N0MzMDAwQzVFCis6MTA5QjkwMDAxNDYyMDAwRjAwMDAwMDAwMjQwQzAyMDBBN0FDMDA3NjQ1Cis6MTA5QkEwMDA5N0MyMDAwRThGQzMwMDA4OEZDNDAwMDQ4RkFCMDA2NEZGCis6MTA5QkIwMDA4RkM1MDAwMDI1NkJGRkZDQUZBQjAwNjRBN0EyMDA3RTQxCis6MTA5QkMwMDBBRkMzMDAwQ0FGQzQwMDA4QUZDNTAwMDQyN0RFMDAwNDFCCis6MTA5QkQwMDA4RkE3MDA2NDMyMDIwMEZGMTQ0MDAwMzQzQzAyMDEwMEYxCis6MTA5QkUwMDA5N0M0MDAwQzJDODMwNUREMzg4Mjg4NzAyQzQyMDAwMTVDCis6MTA5QkYwMDAwMDYyMTgyNTEwNjAwMDE1MDAwMDI4MjEzMkMyMDgwMEZDCis6MTA5QzAwMDAxMDQwMDAxNTI0MDIwODAwOTdDMzAwMTQxNDYyMDAxMkNCCis6MTA5QzEwMDAzNDAyQUFBQTk3QzMwMDBFMTQ2MjAwMDcwMDAwMjAyMTk0Cis6MTA5QzIwMDA5N0MzMDAxMDI0MDIwMzAwMTQ2MjAwMDQwMDgwMTAyMTc2Cis6MTA5QzMwMDA5N0MyMDAxMjJDNDQwMDAxMDA4MDEwMjE1NDQwMDAwNkZECis6MTA5QzQwMDAyNDA1MDAxNjEwMDAwMDA0MDAwMDAwMDAyNDAyMDgwMDkzCis6MTA5QzUwMDA1MDgyMDAwMTI0MDUwMDBFMTBBMDAwMTMwM0M1MjAyMTJFCis6MTA5QzYwMDAyNDgzMDAwOTNDMDIwMDFGMzQ0MkZGRkYwMDQzMTAyQkY1Cis6MTA5QzcwMDAxMDQwMDAwMzAwMDAwMDAwOEY0MjAxNDgwMDYyMTgyM0RBCis6MTA5QzgwMDA5MDYyMDAwMDM4NDMwMDA2MkM2MzAwMDEzODQyMDAxMTQ2Cis6MTA5QzkwMDAyQzQyMDAwMTAwNjIxODI1MTA2MDAwMDQzQzAyMDEwMDAzCis6MTA5Q0EwMDA5NDgyMDAwMjAwNDUzODIxM0MwMjAxMDAwMkMyMTAyNEM3Cis6MTA5Q0IwMDA1MDQwMDAwRUFGQTcwMDY0OEZBQzAwNjQxMEVDMDAwOEE5Cis6MTA5Q0MwMDAzQzA1MDAwNzNDMDQwMDAxMjQ4NDY5MDg4RkE2MDA2NDU5Cis6MTA5Q0QwMDAzNEE1NDAwMEFGQTAwMDEwMEMwMDJCM0JBRkEwMDAxNDM3Cis6MTA5Q0UwMDA4RkFCMDA2NDI1NkIwMDA0QUZBQjAwNjQ4RjQyMDA4MDMzCis6MTA5Q0YwMDA4RkFDMDA2NDAwNEMxMDJCMTA0MDAwMkMzMkMyODAwMDRFCis6MTA5RDAwMDAxMDQwMDAzNDI0MEIwMDAzMzJDMjEwMDAxMDQwMDAzMTE4Cis6MTA5RDEwMDBBRkFCMDA1QzEwMDAwMDJFMjQwQzAwMDQ4RjQyMDM1MEY3Cis6MTA5RDIwMDAyNDAzRkZCRjAyODNBMDI0MjQ0MjAwMDFBRjQyMDM1MDVBCis6MTA5RDMwMDAxMDAwMDE3MzhGNDIwMzUwM0MwMjA4MDAwMkMyQjAyNTlDCis6MTA5RDQwMDAyNDAyRkZCRjAyODJBMDI0OEY4MzAxMjgzQzA0MDAwMTZCCis6MTA5RDUwMDAyNDg0NjhEMDI2NjIwMDAxQUZBMjAwMTRBRkEzMDAxMEQzCis6MTA5RDYwMDA4Rjg2MDEyMDhGODcwMTI0M0MwNTAwMDcwQzAwMkIzQkM4Cis6MTA5RDcwMDAzNEE1NTMwMDEwMDAwMTYyMDAwMDAwMDA4RUEyMDAwMDE0Cis6MTA5RDgwMDA4RUEzMDAwNDNDMDQwMDAxMjQ4NDY4RThBRkIwMDAxMEY2Cis6MTA5RDkwMDBBRkIxMDAxNDhFQTcwMDE4MzRBNTU5MDAwQzAwMkIzQjVFCis6MTA5REEwMDAwMDYwMzAyMTEwMDAwMTU2MDAwMDAwMDA4RjQyMDA4NDQ2Cis6MTA5REIwMDA4RkFCMDA2NDAwNEIxMDJCMTQ0MDAwMDczQzAyMDAwMUU1Cis6MTA5REMwMDAwMkMyMTAyNDEwNDAwMDA0MDAwMDAwMDAyNDBDMDAwMjE1Cis6MTA5REQwMDBBRkFDMDA1QzhGQUIwMDY0MTE2MDAxNjYyN0FDMDAyMDYzCis6MTA5REUwMDBBRkFDMDA4QzhGQUIwMDVDMjQwQzAwMDE1NTZDMDAyMUUzCis6MTA5REYwMDAyNDBDMDAwMjhGNDMwMDU0OEY0MjAwNTAxMDYyMDAwQjZECis6MTA5RTAwMDAyNzRCMDA1NDhGNTEwMDU0MzQwM0VDQzBBRkFCMDA0Q0NGCis6MTA5RTEwMDAyNjIyMDAwMTMwNDIwMUZGQUZBMjAwNTQwMDExMTE0MDgwCis6MTA5RTIwMDAwMDQzMTAyMTEwMDAwMDZCMDJFMkE4MjE4RjQyMDA0NDgxCis6MTA5RTMwMDA4RkFDMDA2NDNDMDQwMDAxMjQ4NDY4QUNBRkFDMDAxNDE3Cis6MTA5RTQwMDBBRkEyMDAxMDhGNDYwMDU0OEY0NzAwNTAzQzA1MDAwNzFBCis6MTA5RTUwMDAwQzAwMkIzQjM0QTU0MzAwOEY0MzAzNTAyNDAyRkZCRjZCCis6MTA5RTYwMDAwMjgyQTAyNDI0NjMwMDAxQUY0MzAzNTAxMDAwMDEyNEE4Cis6MTA5RTcwMDA4RjQyMDM1MDE1NkMwMDFEMDAwMDAwMDA4RjQzMDA3NERBCis6MTA5RTgwMDA4RjQyMDA3MDEwNjIwMDBBMjc0QjAwNzQ4RjUxMDA3NERCCis6MTA5RTkwMDBBRkFCMDA0QzI2MjIwMDAxMzA0MjAzRkZBRkEyMDA1NEJBCis6MTA5RUEwMDAwMDExMTE0MDI0NDI2Q0MwMTAwMDAwNEEwMkUyQTgyMUI3Cis6MTA5RUIwMDA4RjQyMDA0NDhGQUMwMDY0M0MwNDAwMDEyNDg0NjhCOEU1Cis6MTA5RUMwMDAzQzA1MDAwN0FGQUMwMDE0QUZBMjAwMTA4RjQ2MDA3NDMxCis6MTA5RUQwMDA4RjQ3MDA3MDM0QTU0NTAwMjQwQjAwMDEwQzAwMkIzQjdDCis6MTA5RUUwMDBBRkFCMDA1QzEwMDBGRkMzMDAwMDAwMDA4RjQzMDA2NEI0Cis6MTA5RUYwMDA4RjQyMDA2MDEwNjIwMDFBMjc0QzAwNjQ4RjUxMDA2NDhBCis6MTA5RjAwMDA4RkFCMDA1Q0FGQUMwMDRDMjYyMjAwMDEzMDQyMDBGRjVBCis6MTA5RjEwMDBBRkEyMDA1NDI0MDIwMDA0MTU2MjAwMEUwMDExMTE0MDhCCis6MTA5RjIwMDAwMDExMTE4MDI0NDIwQ0MwMDJFMjEwMjFBRkEyMDA0NEIzCis6MTA5RjMwMDA5NDQyMDAyQThGQUMwMDQ0OEZBQjAwNjQwMDRCMTAyQjdFCis6MTA5RjQwMDAxMDQwMDAyNDI1OTUwMDIwMjQwQzAwMDExMDAwMDAyMTYxCis6MTA5RjUwMDBBM0FDMDA4NzI0NDI0Q0MwMTAwMDAwMUUwMkUyQTgyMURFCis6MTA5RjYwMDA4RjQyMDA0NDhGQUIwMDY0M0MwNDAwMDEyNDg0NjhDNDI5Cis6MTA5RjcwMDBBRkFCMDAxNEFGQTIwMDEwOEY0NjAwNjQ4RjQ3MDA2MEEzCis6MTA5RjgwMDAzQzA1MDAwNzBDMDAyQjNCMzRBNTQ4MDAzQzAyMDAwOEIwCis6MTA5RjkwMDAwMkMyMTAyNDE0NDBGRjYxMDAwMDAwMDA4RjQyMDM3MEQxCis6MTA5RkEwMDAyNDBDMDAwMUFGQUMwMDVDMjQ0MjAwMDFBRjQyMDM3MEZFCis6MTA5RkIwMDAxMDAwRkY5MDhGNDIwMzcwMjdBMzAwMzYwMDEzMTA0MDVCCis6MTA5RkMwMDAwMDYyMTgyMTk0NjIwMDAwMDA0NDEwMjExMDAwMDAxRjVDCis6MTA5RkQwMDBBNDYyMDAwMEFFQkUwMDE4OTNBMjAwODcxMDQwMDA4NDY3Cis6MTA5RkUwMDAwMDAwOTgyMThGQUIwMDQ0OEZBNDAwNjQ4RkEzMDA4Q0U1Cis6MTA5RkYwMDAyNTYyMDAyMEFGQTIwMDI4MjU2MjAwMDhBRkEyMDAzMDMxCis6MTBBMDAwMDAyNTYyMDAxMEFGQUIwMDJDQUZBMjAwMzQ5NTYyMDAyQThECis6MTBBMDEwMDBBN0EyMDAzODk1NjIwMDE4QTdBMjAwM0E5NTYyMDAxQTFDCis6MTBBMDIwMDBBN0EyMDAzQzk1NjIwMDFDQTdBMjAwM0U5NDYyMDAxODAzCis6MTBBMDMwMDAyNDYzMDAwMjAwODIyMDIzMTg4MEZGREYyNjczMDAwMUMyCis6MTBBMDQwMDAyRTYyMDAwNDE0NDBGRkY5MDAwMDAwMDA4RjQyMDBGQzYzCis6MTBBMDUwMDAwMjYyMTAyQTE0NDAwMDMwMjQwMzAwMDE4RjgzMDEyQzc3Cis6MTBBMDYwMDAxMDYwMDAyODAwMDAwMDAwOEY4MjAxMjQwMDQzMTAyM0FDCis6MTBBMDcwMDAwMDAyMjE0MzU4ODAwMDAxMjQ4NDAwNDA4RjgyMDEyODdGCis6MTBBMDgwMDAwMDQzMTAyMzAwMDIxOTQzNTg2MDAwMDEyNDYzMDA0MDdDCis6MTBBMDkwMDAwMDY0MTAyQTU0NDAwMDAxMDA2MDIwMjFBRjQ0MDBGQ0ZECis6MTBBMEEwMDA4RjQyMDBGQzAyNjIxMDJBMTA0MDAwMTYyNDAzMDAwMUI3Cis6MTBBMEIwMDAxMDAwMDAxQTMwNjIwMEZGOEZBQzAwOEMwMDEwMTA0MEJFCis6MTBBMEMwMDAwMDRDMTAyMTk0NDcwMDE4MDAxMDEwODAwMDRDMTAyMTAzCis6MTBBMEQwMDBBRkJFMDAxMDhDNDIwMDA4M0MwNDAwMDEyNDg0NjhEQzAwCis6MTBBMEUwMDAzQzA1MDAwNzhDNDMwMDA0OEM0MjAwMDAzNEE1NTUwMDU5Cis6MTBBMEYwMDAwMjAwMzAyMTBDMDAyQjNCQUZBMzAwMTQxMDAwMDAzOUVDCis6MTBBMTAwMDAwMDAwMDAwMDhGNDIwMzM0MDAwMDE4MjEyNDQyMDAwMUE3Cis6MTBBMTEwMDBBRjQyMDMzNDhGNDIwMzM0MzA2MjAwRkYxMDQwRkYwNjI5Cis6MTBBMTIwMDAwMDAwODAyMThGNDMwMDA4MjQwMkZCRkYxMjYwMDAyREY1Cis6MTBBMTMwMDAwMDYyNTAyNDNDMEI0MDAwMDIyQjQwMjU4RkIxMDA4QzY0Cis6MTBBMTQwMDAyNjY5RkZGRjAyMjA5MDIxOEU0MjAwMDg5NjI3MDAxODAyCis6MTBBMTUwMDA4QzQ0MDAwMDhDNDUwMDA0NTYwOTAwMDQyNDBCMDAwMUM3Cis6MTBBMTYwMDAyNDBDMDAwMjEwMDAwMDAyQUZBQzAwMTBBRkFCMDAxMEQ2Cis6MTBBMTcwMDAxNjAwMDAwNEFGQTgwMDE0OEY0MjAwMDgxMDAwMDAwMjZGCis6MTBBMTgwMDBBRkEyMDAxOEFGQUEwMDE4OEY0MjAxMEMwM0MwMzAyMTAzCis6MTBBMTkwMDBBRkE4MDA5OEFGQTkwMDlDMDA0MEY4MDlBRkFBMDBBMEEyCis6MTBBMUEwMDA4RkE4MDA5ODhGQTkwMDlDOEZBQTAwQTAxMDQwRkZDMjIyCis6MTBBMUIwMDAzQzAyMDAxRjk2MjMwMDE4MzQ0MkZGRkYwM0MzRjAyMTI2Cis6MTBBMUMwMDAwMDVFMTAyQjEwNDAwMDAzMjYzMTAwMDI4RjQyMDE0ODMwCis6MTBBMUQwMDAwM0MyRjAyMzI2MTAwMDAxMDIxMzEwMkIxNDQwRkZEQUYzCis6MTBBMUUwMDAyNjUyMDAwNDhGQjAwMDY0MTAwMDAwMUEwMDAwMDAwMDI2Cis6MTBBMUYwMDA5NkEzMDAwQThGQjAwMDY0MDA3MDEwMkI1NDQwMDAwMTM5Cis6MTBBMjAwMDAwMDYwODAyMThFQTQwMDAwOEVBNTAwMDQ4RkFCMDA1QzRFCis6MTBBMjEwMDAyNDBDMDAwMkFGQUMwMDEwOTM0MzA1QzQwMDBCMTcwMEUwCis6MTBBMjIwMDAxMDYwMDAwMzAyMjIzMDI1M0MwMjA4MDAwMEMyMzAyNUU1Cis6MTBBMjMwMDBBRkE2MDAxNDhGNDIwMDA4QUZBMjAwMTg4RjQyMDEwQzk1Cis6MTBBMjQwMDAwM0MwMzAyMTAwNDBGODA5MDIwMDM4MjExMDQwRkVDQjQ1Cis6MTBBMjUwMDAzQzA1MDAwNzk3QUMwMDc2MTE4MDAwMDc5NkEzMDAwRTFFCis6MTBBMjYwMDA5MzQyMDVDNDE0NDAwMDA0MDAwMDAwMDA5N0FCMDA3RTM4Cis6MTBBMjcwMDAwMDZDMTgyNUE2QUIwMDE2OEZBQzAwNkMzQzAyRkZGRkVCCis6MTBBMjgwMDAwMTgyMTAyNDEwNDAwMDAzMDAwQzE0MDIzNDYzMDQwMDA3Cis6MTBBMjkwMDBBNkEyMDAxNEE2QjAwMDBBOEZBQjAwNjQ1NjBCMDAwNkZECis6MTBBMkEwMDAwM0QwRjAyMTM0NjIwMDA0QUZBMDAwNjRBNkEyMDAwRTI3Cis6MTBBMkIwMDAxMDAwMDAwREEzNDAwNUM0OEZBQzAwNjQzQzAyMDAxRkQ5Cis6MTBBMkMwMDAzNDQyRkZGRjAwNUUxMDJCMDE5MDYwMjNBRkFDMDA2NEFFCis6MTBBMkQwMDBBNkEzMDAwRTI0MEIwMDAxMTA0MDAwMDNBMzRCMDVDNEVECis6MTBBMkUwMDA4RjQyMDE0ODAzQzJGMDIzOEZBQjAwNTQ4RkFDMDA0QzY3Cis6MTBBMkYwMDBBRDhCMDAwMDhGQUMwMDY0MTU4MEZFQkEwMDAwMDAwMDNBCis6MTBBMzAwMDA4RkFCMDA2NDExNjAwMDFCMDAwMDAwMDA5MzQyMDVDNDg1Cis6MTBBMzEwMDAxMDQwMDAwNjAwMDAwMDAwQUY1RTAwQzRBRjRCMDBDMDVDCis6MTBBMzIwMDA4RkFDMDA2QzEwMDAwMDBFQUY0QzAwQzg5N0FCMDA3NkVECis6MTBBMzMwMDAxMTYwMDAwQjM0MDM4MTAwOEZBMjAwMjA4QzQ2MDAwQ0JBCis6MTBBMzQwMDBBNDQzMDAwQzk3QUMwMDdFOEM0NDAwMDQ4QzQ1MDAwOEFDCis6MTBBMzUwMDBBNDRDMDAwRUFDNDQwMDAwQUM0NTAwMDRBQzQ2MDAwODIwCis6MTBBMzYwMDA4RjQyMDM0QzI0NDIwMDAxQUY0MjAzNEMxMDAwMDAxMDA2Cis6MTBBMzcwMDA4RjQyMDM0QzhGQUIwMDZDMzE2NEZGRkYyNDg0RkZGQ0UxCis6MTBBMzgwMDAwMDgwMTgyMThGNDQwMjUwOEY0NTAyNTQ4RjQ2MDExOEQ3Cis6MTBBMzkwMDAwMDAwMTAyMTAwQTMyODIxMDBBMzM4MkIwMDgyMjAyMUQ3Cis6MTBBM0EwMDAwMDg3MjAyMUFGNDQwMjUwMDBDMEY4MDlBRjQ1MDI1NDk1Cis6MTBBM0IwMDA4RkJGMDBDMDhGQkUwMEJDOEZCNTAwQjg4RkIzMDBCNDk0Cis6MTBBM0MwMDA4RkIyMDBCMDhGQjEwMEFDOEZCMDAwQTgwM0UwMDAwOERFCis6MTBBM0QwMDAyN0JEMDBDODAzRTAwMDA4MDAwMDAwMDAyN0JERkZEODJCCis6MTBBM0UwMDBBRkJGMDAyNEFGQjAwMDIwOEY0MzAwNEM4RjQyMDA0ODI1Cis6MTBBM0YwMDAxMDYyMDAzNDAwMDAwMDAwOEY0MzAwNDg4RjQyMDA0QzgwCis6MTBBNDAwMDAwMDYyMjAyMzA0ODIwMDAxMjQ4NDAyMDA4RjQzMDA1NDUwCis6MTBBNDEwMDA4RjQyMDA0QzAwNDMxMDJCMTQ0MDAwMDQyNDAyMDIwMDIxCis6MTBBNDIwMDA4RjQzMDA0QzEwMDAwMDA1MDA0MzEwMjM4RjQyMDA1NDVFCis6MTBBNDMwMDA4RjQzMDA0QzAwNDMxMDIzMjQ0MkZGRkYwMDQwNTAyMTczCis6MTBBNDQwMDAwMDhBMTAyQTU0NDAwMDAxMDA4MDUwMjE4RjQ5MDA0QzlFCis6MTBBNDUwMDA4RjQ4MDA0QzhGNDQwMTg4OEY0NTAxOEM4RjQ2MDA0Q0ZCCis6MTBBNDYwMDAyNDA3MTAwMEFGQTcwMDEwMDAwODQxNDAwMTAwMTgyMTg4Cis6MTBBNDcwMDAwMTJBNDgyMTMxMzAwMUZGQUZCMDAwMTQ4RjQ3MDAxNDhBCis6MTBBNDgwMDAwMDAwMTAyMTAwMDYzMTQwQUZBNzAwMTgwMEEzMjgyMUNBCis6MTBBNDkwMDAwMEEzMzgyQjAwODIyMDIxMDA4NzIwMjEzNDAyRUNDMDQ5Cis6MTBBNEEwMDAwMEMyMzAyMThGNDIwMTA4MDJFNjMwMjEwMDQwRjgwOTQ1Cis6MTBBNEIwMDAwMDBBMzk0MDU0NDAwMDAxQUY1MDAwNEM4RjQzMDA0QzFCCis6MTBBNEMwMDA4RjQyMDA0ODE0NjIwMDE4MDAwMDAwMDA4RjQyMDAwMDE0Cis6MTBBNEQwMDAxMDQwMDAwNzAwMDAwMDAwQUY4MDAwNEM4RjgyMDA0QzRECis6MTBBNEUwMDAxMDQwRkZGRDAwMDAwMDAwMTAwMDAwMDUwMDAwMDAwMDBCCis6MTBBNEYwMDBBRjgwMDA0ODhGODIwMDQ4MTA0MEZGRkQwMDAwMDAwMDQwCis6MTBBNTAwMDA4RjgyMDA2MDI0MDNGREZGMDA0MzEwMjRBRjgyMDA2MEFGCis6MTBBNTEwMDA4RjQyMDAwMDEwNDAwMDAzMDAwMDAwMDAxMDAwMDAwMjA1Cis6MTBBNTIwMDBBRjgwMDA0Q0FGODAwMDQ4OEZCRjAwMjQ4RkIwMDAyMDY4Cis6MTBBNTMwMDAwM0UwMDAwODI3QkQwMDI4MDNFMDAwMDgwMDAwMDAwMDM5Cis6MTBBNTQwMDAyN0JERkZEOEFGQkYwMDI0QUZCMDAwMjA4RjQzMDA1QzExCis6MTBBNTUwMDA4RjQyMDA1ODEwNjIwMDQ5MDAwMDAwMDA4RjQzMDA1OEVECis6MTBBNTYwMDA4RjQyMDA1QzAwNjIyMDIzMDQ4MjAwMDEyNDg0MDEwMEU5Cis6MTBBNTcwMDA4RjQzMDA2NDhGNDIwMDVDMDA0MzEwMkIxNDQwMDAwNEEyCis6MTBBNTgwMDAyNDAyMDEwMDhGNDMwMDVDMTAwMDAwMDUwMDQzMTAyM0VCCis6MTBBNTkwMDA4RjQyMDA2NDhGNDMwMDVDMDA0MzEwMjMyNDQyRkZGRjdFCis6MTBBNUEwMDAwMDQwMzgyMTAwODcxMDJBNTQ0MDAwMDEwMDgwMzgyMUUzCis6MTBBNUIwMDA4RjQyMDA1QzAwNDcxMDIxMzA1MDAwRkYzMkMyMTAwMDczCis6MTBBNUMwMDAxMDQwMDAxNTI0MDgyMDAwOEY0OTAwNUM4RjQ0MDE5MDQyCis6MTBBNUQwMDA4RjQ1MDE5NDhGNDYwMDVDMDAwNzM5ODBBRkE4MDAxMEJBCis6MTBBNUUwMDBBRkIwMDAxNDhGNDgwMDE0MDAwOTQ5ODAwMTIwMTgyMUUxCis6MTBBNUYwMDAwMDAwMTAyMTAwQTMyODIxMDBBMzQ4MkIwMDgyMjAyMTY1Cis6MTBBNjAwMDAwMDg5MjAyMTAwMDYzMTgwQUZBODAwMTg4RjQyMDEwODgwCis6MTBBNjEwMDAxMDAwMDAxNDI0QzYwQ0MwOEY0OTAwNUM4RjQ0MDE5MEM4Cis6MTBBNjIwMDA4RjQ1MDE5NDhGNDYwMDVDMDAwNzM5NDBBRkE4MDAxMEE5Cis6MTBBNjMwMDBBRkIwMDAxNDhGNDgwMDE0MDAwOTQ5NDAwMTIwMTgyMUQwCis6MTBBNjQwMDAwMDAwMTAyMTAwQTMyODIxMDBBMzQ4MkIwMDgyMjAyMTE0Cis6MTBBNjUwMDAwMDg5MjAyMTAwMDYzMTQwQUZBODAwMTg4RjQyMDEwODcwCis6MTBBNjYwMDAyNEM2NENDMDAwNDBGODA5MDJFNjMwMjE1NDQwMDAwMUU1Cis6MTBBNjcwMDBBRjUwMDA1QzhGNDMwMDVDOEY0MjAwNTgxNDYyMDAxODlBCis6MTBBNjgwMDAwMDAwMDAwMDhGNDIwMDAwMTA0MDAwMDcwMDAwMDAwMEEyCis6MTBBNjkwMDBBRjgwMDA0QzhGODIwMDRDMTA0MEZGRkQwMDAwMDAwMDk2Cis6MTBBNkEwMDAxMDAwMDAwNTAwMDAwMDAwQUY4MDAwNDg4RjgyMDA0OEM1Cis6MTBBNkIwMDAxMDQwRkZGRDAwMDAwMDAwOEY4MjAwNjAyNDAzRkVGRkI5Cis6MTBBNkMwMDAwMDQzMTAyNEFGODIwMDYwOEY0MjAwMDAxMDQwMDAwMzVFCis6MTBBNkQwMDAwMDAwMDAwMDEwMDAwMDAyQUY4MDAwNENBRjgwMDA0ODc2Cis6MTBBNkUwMDA4RkJGMDAyNDhGQjAwMDIwMDNFMDAwMDgyN0JEMDAyOEEyCis6MTBBNkYwMDAwM0UwMDAwODAwMDAwMDAwMjdCREZGRDhBRkJGMDAyNDIyCis6MTBBNzAwMDBBRkIwMDAyMDhGNDMwMDZDOEY0MjAwNjgxMDYyMDAzM0FFCis6MTBBNzEwMDAwMDAwMDAwMDhGNDMwMDY4OEY0MjAwNkMwMDYyMjAyMzFECis6MTBBNzIwMDAwNDgyMDAwMTI0ODQwNDAwOEY0MzAwNzQ4RjQyMDA2QzczCis6MTBBNzMwMDAwMDQzMTAyQjE0NDAwMDA0MjQwMjA0MDA4RjQzMDA2Q0RCCis6MTBBNzQwMDAxMDAwMDAwNTAwNDMxMDIzOEY0MjAwNzQ4RjQzMDA2Q0ZCCis6MTBBNzUwMDAwMDQzMTAyMzI0NDJGRkZGMDA0MDUwMjEwMDhBMTAyQUFBCis6MTBBNzYwMDA1NDQwMDAwMTAwODA1MDIxOEY0OTAwNkM4RjQ4MDA2Q0RDCis6MTBBNzcwMDA4RjQ0MDE5ODhGNDUwMTlDOEY0NjAwNkMyNDA3NDAwMDUwCis6MTBBNzgwMDBBRkE3MDAxMDAwMDg0MTQwMDEwMDE4MjEwMTJBNDgyMTBDCis6MTBBNzkwMDAzMTMwMDNGRkFGQjAwMDE0OEY0NzAwMTQwMDAwMTAyMUM4Cis6MTBBN0EwMDAwMDA2MzE0MDI0QzY2Q0MwQUZBNzAwMTgwMEEzMjgyMUMyCis6MTBBN0IwMDAwMEEzMzgyQjAwODIyMDIxMDA4NzIwMjE4RjQyMDEwODJFCis6MTBBN0MwMDAwMkU2MzAyMTAwNDBGODA5MDAwQTM5NDA1NDQwMDAwMUY3Cis6MTBBN0QwMDBBRjUwMDA2QzhGNDMwMDZDOEY0MjAwNjgxNDYyMDAxODA5Cis6MTBBN0UwMDAwMDAwMDAwMDhGNDIwMDAwMTA0MDAwMDcwMDAwMDAwMDQxCis6MTBBN0YwMDBBRjgwMDA0QzhGODIwMDRDMTA0MEZGRkQwMDAwMDAwMDM1Cis6MTBBODAwMDAxMDAwMDAwNTAwMDAwMDAwQUY4MDAwNDg4RjgyMDA0ODYzCis6MTBBODEwMDAxMDQwRkZGRDAwMDAwMDAwOEY4MjAwNjAyNDAzRjdGRjVFCis6MTBBODIwMDAwMDQzMTAyNEFGODIwMDYwOEY0MjAwMDAxMDQwMDAwM0ZDCis6MTBBODMwMDAwMDAwMDAwMDEwMDAwMDAyQUY4MDAwNENBRjgwMDA0ODE0Cis6MTBBODQwMDA4RkJGMDAyNDhGQjAwMDIwMDNFMDAwMDgyN0JEMDAyODQwCis6MTBBODUwMDAwM0UwMDAwODAwMDAwMDAwOEY0MjAwRkMzQzAzMDAwMTAwCis6MTBBODYwMDA4RjQ0MDBGODM0NjMzMEM4MjQ0MjAwMDFBRjQyMDBGQzNBCis6MTBBODcwMDA4Rjg1MDEyODAyRTMxMDIxNTQ4MjAwMDQyNDgyMDAwOEZECis6MTBBODgwMDAzQzAyMDAwMTM0NDIyRUM4MDJFMjEwMjEwMDQwMTgyMThGCis6MTBBODkwMDBBRjQzMDBGOEFDNjAwMDAwOEY0MjAwRjQxNDYyMDAwNDgzCis6MTBBOEEwMDAzQzAyMDAwMTI0QTIwMDIwMTAwMDAwMEZBRjgyMDEyODBBCis6MTBBOEIwMDA4RjQzMDBGODM0NDIzMEM4MDJFMjEwMjE1NDYyMDAwNDkxCis6MTBBOEMwMDAyNDYyMDAwODNDMDIwMDAxMzQ0MjJFQzgwMkUyMTAyMTNBCis6MTBBOEQwMDAwMDQwMTgyMThDNjIwMDA0MDAwMjExNDAwMEEyMTAyMUU3Cis6MTBBOEUwMDBBRjgyMDEyOEFDNjAwMDAwOENBMzAwMTgzMDYyMDA3MEI5Cis6MTBBOEYwMDAxMDQwMDAyRDMwNjIwMDIwMTA0MDAwMDQzQzAyMDAxMDg3Cis6MTBBOTAwMDAwMkMyMTAyNDEwNDAwMDBEMDAwMDAwMDAzMDYyMDA0MDIwCis6MTBBOTEwMDAxMDQwMDAwNDNDMDIwMDIwMDJDMjEwMjQxMDQwMDAwNzM2Cis6MTBBOTIwMDAwMDAwMDAwMDMwNjIwMDEwMTA0MDAwMUYzQzAyMDA0MDk4Cis6MTBBOTMwMDAwMkMyMTAyNDE0NDAwMDFDMDAwMDAwMDA4RjgyMDA0MDVFCis6MTBBOTQwMDAzMDQyMDAwMTE0NDAwMDA4MDAwMDIwMjE4QzAzMDEwNDYzCis6MTBBOTUwMDAyNDAyMDAwMTUwNjIwMDA1MjQwNDAwMDE4QzAyMDI2NEZDCis6MTBBOTYwMDAxMDQwMDAwMzAwODAxMDIxMjQwNDAwMDEwMDgwMTAyMTA5Cis6MTBBOTcwMDAxMDQwMDAwNjAwMDAwMDAwOEY0MjAzMEMyNDQyMDAwMTNBCis6MTBBOTgwMDBBRjQyMDMwQzEwMDAwMDA4OEY0MjAzMEM4RjgyMDA0NDdBCis6MTBBOTkwMDAzNDQyMDAwNEFGODIwMDQ0OEY0MjAzMDgyNDQyMDAwMTg1Cis6MTBBOUEwMDBBRjQyMDMwODhGNDIwMzA4MDNFMDAwMDgwMDAwMDAwMEU0Cis6MTBBOUIwMDAwM0UwMDAwODAwMDAwMDAwMjdCREZGOThBRkJGMDA2MDYzCis6MTBBOUMwMDBBRkJFMDA1Q0FGQjUwMDU4QUZCMzAwNTRBRkIyMDA1MDlCCis6MTBBOUQwMDBBRkIxMDA0Q0FGQjAwMDQ4OEY0MjAwRkMyNDQyMDAwMUYwCis6MTBBOUUwMDBBRjQyMDBGQzhGODgwMTI4MjUwMjAwMjBBRjgyMDEyODk5Cis6MTBBOUYwMDA4RDAzMDAxODMwNjIwMDcwMTA0MDAwMkUzMDYyMDAyMDdECis6MTBBQTAwMDAxMDQwMDAwNDNDMDIwMDEwMDJDMjEwMjQxMDQwMDAwRDRGCis6MTBBQTEwMDAwMDAwMDAwMDMwNjIwMDQwMTA0MDAwMDQzQzAyMDAyMEIyCis6MTBBQTIwMDAwMkMyMTAyNDEwNDAwMDA3MDAwMDAwMDAzMDYyMDAxMDM1Cis6MTBBQTMwMDAxMDQwMDFBOTNDMDIwMDQwMDJDMjEwMjQxNDQwMDFBNkFCCis6MTBBQTQwMDAwMDAwMDAwMDhGODIwMDQwMzA0MjAwMDExNDQwMDAwOEU2Cis6MTBBQTUwMDAwMDAwMjAyMThDMDMwMTA0MjQwMjAwMDE1MDYyMDAwNTQzCis6MTBBQTYwMDAyNDA0MDAwMThDMDIwMjY0MTA0MDAwMDMwMDgwMTAyMUM1Cis6MTBBQTcwMDAyNDA0MDAwMTAwODAxMDIxMTA0MDAwMDYwMDAwMDAwMEE2Cis6MTBBQTgwMDA4RjQyMDMwQzI0NDIwMDAxQUY0MjAzMEMxMDAwMDE5MkRDCis6MTBBQTkwMDA4RjQyMDMwQzhGODIwMDQ0MzQ0MjAwMDRBRjgyMDA0NDkyCis6MTBBQUEwMDA4RjQyMDMwODI0NDIwMDAxQUY0MjAzMDgxMDAwMDE4QUNDCis6MTBBQUIwMDA4RjQyMDMwODMwNjIwMDAyMTA0MDAxNEIzQzAyMDgwMDQ0Cis6MTBBQUMwMDA4RDFFMDAxQzAwMUU1NzAyQUZBQTAwMzQ5NTBBMDAxNjA2Cis6MTBBQUQwMDAwM0MyMjAyNEFGQUEwMDI0OEZBQTAwMzQyNDAyMDAwMTVDCis6MTBBQUUwMDAxNTQyMDAwNjMzREVGRkZGMDAxRTExNDAzNDAzRUNDMEE4Cis6MTBBQUYwMDAwMDQzMTAyMTEwMDAwMDEwMDJFMkE4MjEyNDAyMDAwMkVECis6MTBBQjAwMDAxNTQyMDAwNTI0MDIwMDAzMDAxRTExNDAyNDQyNkNDMEJGCis6MTBBQjEwMDAxMDAwMDAwOTAyRTJBODIxMTU0MjAwMDUwMDFFMTE4MDY0Cis6MTBBQjIwMDAwMDFFMTE0MDI0NDI0Q0MwMTAwMDAwMDMwMkUyQTgyMTg0Cis6MTBBQjMwMDAwMDU3MTAyMTI0NTUwQ0UwOTZBMjAwMEUzMDRBRkZGQzZECis6MTBBQjQwMDAzMDQyMDQwMDEwNDAwMDAzQUZBQTAwMkMxMDAwMDBFMUM2Cis6MTBBQjUwMDAwMDAwODgyMTEwODAwMDA0MDAwMDg4MjE5N0IxMDAyNkExCis6MTBBQjYwMDAxMDAwMDBEREE2QjEwMDEyOEVCMzAwMTg5NjZBMDAwQzJBCis6MTBBQjcwMDBBN0FBMDAzRTk3QTUwMDNFMkNBMzA1REQzOEEyODg3MDQ5Cis6MTBBQjgwMDAyQzQyMDAwMTAwNjIxODI1MTA2MDAwMTUwMDAwMjAyMUYxCis6MTBBQjkwMDAzMkMyMDgwMDEwNDAwMDE1MjQwMjA4MDA5NjYzMDAxNDE5Cis6MTBBQkEwMDAxNDYyMDAxMjM0MDJBQUFBOTY2MzAwMEUxNDYyMDAwNzBGCis6MTBBQkIwMDAwMDAwMjgyMTk2NjMwMDEwMjQwMjAzMDAxNDYyMDAwNEEwCis6MTBBQkMwMDAwMEEwMTAyMTk2NjIwMDEyMkM0NTAwMDEwMEEwMTAyMTY3Cis6MTBBQkQwMDA1NDQwMDAwNjI0MDQwMDE2MTAwMDAwMDQwMDAwMDAwMDg5Cis6MTBBQkUwMDAyNDAyMDgwMDUwQTIwMDAxMjQwNDAwMEUxMDgwMDBCOUM1Cis6MTBBQkYwMDAwMjY0OTAyMTkyNDIwMDAwMzA0MjAwMEYwMDAyODA4MEU3Cis6MTBBQzAwMDAzMkMyMDEwMDEwNDAwMDIwMDI1MDE4MjEzQzAyMDAyMEY2Cis6MTBBQzEwMDAwMDQzMTAyQjE0NDAwMDBFMDI0MDIwMjEwMDAwMjgyMTg4Cis6MTBBQzIwMDA5NDgyMDAwMDI0ODQwMDAyMDBBMjI4MjEwMDgzMTAyQkJCCis6MTBBQzMwMDAxNDQwRkZGQjMwQTJGRkZGMDAwNTFDMDIwMDYyMjgyMTI4Cis6MTBBQzQwMDAwMDA1MUMwMjMwQTJGRkZGMTAwMDAwMDkwMDYyMjgyMTRECis6MTBBQzUwMDA4RjQ3MDE0ODhGNDIwMTEwMDAxMDI4NDIzQzA2MDAyMDE3Cis6MTBBQzYwMDAwMDQwRjgwOUFGQTgwMDQwMzA0NUZGRkY4RkE4MDA0MDIyCis6MTBBQzcwMDA1MEEwMDAwMTM0MDVGRkZGOEZBQTAwMkMzNTRBMDAwMkM2Cis6MTBBQzgwMDAxMDAwMDAwMkFGQUEwMDJDMDAwMDI4MjEzMkMyMDA4MDcwCis6MTBBQzkwMDAxMDQwMDA5MEE2QTUwMDEwMjY0MzAwMDkzQzAyMDAxRkFBCis6MTBBQ0EwMDAzNDQyRkZGRjAwNDMxMDJCMTA0MDAwMDMwMDAwMDAwMDVGCis6MTBBQ0IwMDA4RjQyMDE0ODAwNjIxODIzOTA2NjAwMDAzMEMyMDBGRkY2Cis6MTBBQ0MwMDAzODQzMDAwNjJDNjMwMDAxMzg0MjAwMTEyQzQyMDAwMTc5Cis6MTBBQ0QwMDAwMDYyMTgyNTEwNjAwMDdGMjQwMjA4MDAwMDAwODgyMTBGCis6MTBBQ0UwMDA5N0EzMDAzRTE0NjIwMDBGMDI2MDIwMjE5NjcxMDAwMEJECis6MTBBQ0YwMDA5NjYyMDAwMjk2NjMwMDA0OTY2NDAwMDYwMjIyODgyMTkwCis6MTBBRDAwMDAwMjIzODgyMTAyMjQ4ODIxOTY2MjAwMDg5NjYzMDAwQUEzCis6MTBBRDEwMDA5NjY0MDAwQzAyMjI4ODIxMDIyMzg4MjExMDAwMDAwNzdCCis6MTBBRDIwMDAwMjI0ODgyMTk0ODIwMDAwMjQ4NDAwMDIwMjIyODgyMUM3Cis6MTBBRDMwMDAwMDkyMTAyQjE0NDBGRkZCMDAwMDAwMDAwMDExMUMwMkM5Cis6MTBBRDQwMDAzMjIyRkZGRjAwNjI4ODIxMDAxMTFDMDIzMjIyRkZGRjI1Cis6MTBBRDUwMDAwMDYyODgyMTMyQzIwMjAwMTA0MDAwMDMyNjQ0MDAwNjJGCis6MTBBRDYwMDAxMDAwMDAzRTAwMDA4MDIxM0MwNTAwMUYzNEE1RkZGRkJECis6MTBBRDcwMDAwMEE0MTAyQjEwNDAwMDAzMDAwMDAwMDA4RjQyMDE0ODg3Cis6MTBBRDgwMDAwMDgyMjAyMzk0ODIwMDAwMzA0MjFGRkYxMDQwMDAwNDA0Cis6MTBBRDkwMDAyNjQ0MDAwQzk2NDIwMDAyMTAwMDAwMzAwMDUwODAyMzMwCis6MTBBREEwMDA5NjQyMDAwMjI2NDMwMDE0MDA1MDgwMjMzQzAyMDAyMEZCCis6MTBBREIwMDAwMDQzMTAyQjE0NDAwMDBBMDBEMDgwMjE5NjQyMDAwQzYyCis6MTBBREMwMDAwMjAyODAyMTk2NDIwMDBFOTY0MzAwMTA5NjQ0MDAxMjIzCis6MTBBREQwMDAwMjAyODAyMTAyMDM4MDIxMTAwMDAwMjAwMjA0ODAyMTUxCis6MTBBREUwMDAwMEE0MTAyQjEwNDAwMDAzMDAwMDAwMDA4RjQyMDE0ODE3Cis6MTBBREYwMDAwMDgyMjAyMzk0ODIwMDAwMjQ4NDAwMDIwMjAyODAyMTI5Cis6MTBBRTAwMDAwMEE0MTAyQjEwNDAwMDAzMDAwMDAwMDA4RjQyMDE0OEY2Cis6MTBBRTEwMDAwMDgyMjAyMzk0ODIwMDAwMjQ4NDAwMDIwMjAyODAyMTA4Cis6MTBBRTIwMDAwMEE0MTAyQjEwNDAwMDAzMDAwMDAwMDA4RjQyMDE0OEQ2Cis6MTBBRTMwMDAwMDgyMjAyMzk0ODIwMDAwMjQ4NDAwMDIwMjAyODAyMUU4Cis6MTBBRTQwMDAwMEE0MTAyQjEwNDAwMDAzMDAwMDAwMDA4RjQyMDE0OEI2Cis6MTBBRTUwMDAwMDgyMjAyMzk0ODIwMDAwMDIwMjgwMjEzQzAyMDEwMDMzCis6MTBBRTYwMDAwMkMyMTAyNDEwNDAwMDBFMDAwMDAwMDA4RkFBMDAyQzI3Cis6MTBBRTcwMDAzMTQyMDAwNDEwNDAwMDBBMDAwMDAwMDA5NTA0MDAwRTVBCis6MTBBRTgwMDAwMjY0MjAyMTBDMDAzRUVDMjQ4NEZGRkMzMDQyRkZGRkQyCis6MTBBRTkwMDAwMjIyODgyMTAwMTExQzAyMzIyMkZGRkYwMDYyODgyMTU5Cis6MTBBRUEwMDA4RkFBMDAyNDAxNTE4ODIzMDAxMTE0MDIwMjIyODgyMTU0Cis6MTBBRUIwMDAwMjMwODgyMTAwMTExNDAyMDIyMjg4MjEzMjMxRkZGRjYyCis6MTBBRUMwMDA1MjIwMDAwMTM0MTFGRkZGOEZBQTAwMkMzNTRBMDAwMUU3Cis6MTBBRUQwMDBBRkFBMDAyQ0E2QjEwMDEyOTdBQTAwMkVBNkFBMDAwRUI3Cis6MTBBRUUwMDA4RkFBMDAyQzMxNDIwMDA0MTA0MDAwMDIyNDA5MTAwMEY3Cis6MTBBRUYwMDAzNDA5ODAwMDhGNDgwMDQ0OEY0NDAxQTA4RjQ1MDFBNDhECis6MTBBRjAwMDBBRkE5MDAxMDhGNDkwMDQ0MDAwODQxNDAwMTAwMTgyMUZBCis6MTBBRjEwMDBBRkE5MDAxNDhGNDgwMDBDMDJBMDMwMjEyNDA3MDAyMEE0Cis6MTBBRjIwMDBBRkE4MDAxODhGNDgwMTBDMDAwMDEwMjEwMEEzMjgyMUIxCis6MTBBRjMwMDAwMEEzNDgyQjAwODIyMDIxMDEwMEY4MDkwMDg5MjAyMTZDCis6MTBBRjQwMDAxNDQwMDAwQjAwMDAwMDAwOEY4MjAxMjgzQzA0MDAwMTI3Cis6MTBBRjUwMDAyNDg0NjkxNEFGQkUwMDE0QUZBMjAwMTA4Rjg2MDEyNEIwCis6MTBBRjYwMDA4Rjg3MDEyMDNDMDUwMDA3MEMwMDJCM0IzNEE1OTkyMDVFCis6MTBBRjcwMDA4RjQyMDM2ODI0NDJGRkZGQUY0MjAzNjg4RjQyMDA0NEMwCis6MTBBRjgwMDA4RjQzMDA4ODI0NDIwMDAxMDA0MzEwMjRBRjQyMDA0NDU0Cis6MTBBRjkwMDA4RkFBMDAzNDhGNDQwMzY4MjQwMjAwMDExNTQyMDAwNjgyCis6MTBBRkEwMDAyNDAyMDAwMjhGNDIwMzVDMjQ0MkZGRkZBRjQyMDM1Qzk1Cis6MTBBRkIwMDAxMDAwMDA0OThGNDIwMzVDMTU0MjAwMDYwMDAwMDAwMEFCCis6MTBBRkMwMDA4RjQyMDM2NDI0NDJGRkZGQUY0MjAzNjQxMDAwMDA0MjNCCis6MTBBRkQwMDA4RjQyMDM2NDhGNDIwMzYwMjQ0MkZGRkZBRjQyMDM2MDRECis6MTBBRkUwMDAxMDAwMDAzRDhGNDIwMzYwMzA2MjEwMDAxMDQwMDAwNUU5Cis6MTBBRkYwMDAzMDYyODAwMDhGNDIwMDc4MjQ0MjAwMDExMDAwMDAzNjQ5Cis6MTBCMDAwMDBBRjQyMDA3ODEwNDAwMDM0MDAwMDAwMDA4RjQyMDA3ODBBCis6MTBCMDEwMDAyNDQyMDAwMUFGNDIwMDc4OEMwMzAyNDAwMDQzMTAyQjExCis6MTBCMDIwMDAxNDQwMDAyRDI0MDcwMDA4OEY0NDAxNjg4RjQ1MDE2Q0VGCis6MTBCMDMwMDA4RjQzMDA0NDhGNDgwMDBDOEY4NjAxMjAyNDAyMDA0MDdCCis6MTBCMDQwMDBBRkEyMDAxMEFGQTMwMDE0QUZBODAwMTg4RjQyMDEwQ0VDCis6MTBCMDUwMDAwMDQwRjgwOTI0QzYwMDFDMTQ0MDAwMTEyNDAyMDAwMTFECis6MTBCMDYwMDAzQzAxMDAwMTAwMzcwODIxQTAyMjQwRjI4RjgyMDEyNDE4Cis6MTBCMDcwMDBBRkEyMDAxMDhGODIwMTI4M0MwNDAwMDEyNDg0Njg4QzU4Cis6MTBCMDgwMDBBRkEyMDAxNDhGNDYwMDQ0OEY4NzAxMjAzQzA1MDAwOUMxCis6MTBCMDkwMDAwQzAwMkIzQjM0QTUxMzAwMTAwMDAwMEIwMDAwMDAwMDM3Cis6MTBCMEEwMDA4RjQyMDMwNDI0NDIwMDAxQUY0MjAzMDQ4RjQyMDMwNDkxCis6MTBCMEIwMDA4RjQyMDA0NEFGNDIwMDdDM0MwMTAwMDEwMDM3MDgyMTcwCis6MTBCMEMwMDBBMDIwNDBGMkFGNDAwMDc4OEY0MjAzMTgyNDQyMDAwMUQ0Cis6MTBCMEQwMDBBRjQyMDMxODhGNDIwMzE4OEZCRjAwNjA4RkJFMDA1QzIxCis6MTBCMEUwMDA4RkI1MDA1ODhGQjMwMDU0OEZCMjAwNTA4RkIxMDA0QzExCis6MTBCMEYwMDA4RkIwMDA0ODAzRTAwMDA4MjdCRDAwNjgwM0UwMDAwOEE3Cis6MTBCMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA4RjQyMDEzQzMxCis6MTBCMTEwMDBBRjgyMDBDMDhGNDIwMTNDQUY4MjAwQzQ4RjQyMDEzQzJECis6MTBCMTIwMDBBRjgyMDBDODhGNDIwMTM4QUY4MjAwRDA4RjQyMDEzODExCis6MTBCMTMwMDBBRjgyMDBENDhGNDIwMTM4MDNFMDAwMDhBRjgyMDBEODBDCis6MTBCMTQwMDAyN0JERkZFMDI3ODQwMjA4MjQwNTAyMDBBRkJGMDAxOEQ2Cis6MTBCMTUwMDAwQzAwMkJCRjI0MDYwMDA4OEMwMjAyMDQwQzAwNDAxMkQ1Cis6MTBCMTYwMDBBRjgyMDIxMDNDMDIwMDAxOEM0MjZEOTQzMDQyMDAwMjFBCis6MTBCMTcwMDAxMDQwMDAwRTAwMDAyMDIxOEMwNjAyNDgyNDAyMDAwMjJDCis6MTBCMTgwMDAzQzAxMDAwMUFDMjI2RDk4MEMwMDUxMDQyNDA1MDAwMjIyCis6MTBCMTkwMDAwMDAwMjAyMThDMDYwMjQ4MjQwMjAwMDEzQzAxMDAwMTJECis6MTBCMUEwMDBBQzIyNkQ5ODEwMDAwMDExMjQwNTAwMDE4QzA2MDI0OEE1Cis6MTBCMUIwMDAyNDAyMDAwNDNDMDEwMDAxQUMyMjZEOTgwQzAwNTEwNEYzCis6MTBCMUMwMDAyNDA1MDAwNDNDMDIwMDAxOEM0MjZEOTQzMDQyMDAwMUQxCis6MTBCMUQwMDAxMDQwMDAwODI0MDIwMDAxM0MwMTAwMDFBQzIyNkQ5OERGCis6MTBCMUUwMDAwMDAwMjAyMTI0MDUwMDAxM0MwNjYwMUIwQzAwNTEwNEQ2Cis6MTBCMUYwMDAwMDAwMDAwMDNDMDQwMDAxMjQ4NDY5RDA4RjQyMDE1MDBCCis6MTBCMjAwMDA4RjQzMDE1NDNDMDUwMDA4OEY0NjAxNTgwMDAyMTY0MDQ4Cis6MTBCMjEwMDAwMDAzMTk0MDM0NjMwNDAzMDA0MzEwMjUwMDA2MzNDMEMzCis6MTBCMjIwMDAwMDQ2MTAyNUFGODIwMjFDQUZBMDAwMTBBRkEwMDAxNDkyCis6MTBCMjMwMDA4Rjg2MDIxQzM0QTUwMjAwMEMwMDJCM0IwMDAwMzgyMTM1Cis6MTBCMjQwMDAzQzAxMDAwMUFDMjA2RDkwM0MwMTAwMDFBQzIwNkRBOEQ4Cis6MTBCMjUwMDA4RkJGMDAxODAzRTAwMDA4MjdCRDAwMjAyN0JERkZFMEQ2Cis6MTBCMjYwMDAzQzA1MDAwODM0QTUwMzAwQUZCRjAwMThBRkEwMDAxMEQ0Cis6MTBCMjcwMDBBRkEwMDAxNDhGODYwMjAwM0MwNDAwMDEyNDg0NjlEQzI2Cis6MTBCMjgwMDAwQzAwMkIzQjAwMDAzODIxOEY0MjA0MTAyNDQyMDAwMUE3Cis6MTBCMjkwMDBBRjQyMDQxMDhGNDIwNDEwOEZCRjAwMTgwM0UwMDAwODczCis6MTBCMkEwMDAyN0JEMDAyMDI3QkRGRkQ4QUZCRjAwMjBBRkIxMDAxQ0Q1Cis6MTBCMkIwMDBBRkIwMDAxODhGNDIwM0E0MjQ0MjAwMDFBRjQyMDNBNEEwCis6MTBCMkMwMDA4RjQyMDNBNDhGOTAwMjIwOEY4MjAwRTBBRkEyMDAxMDczCis6MTBCMkQwMDA4RjgyMDBFNEFGQTIwMDE0OEY4NjAwQzQ4Rjg3MDBDODVECis6MTBCMkUwMDAzQzA0MDAwMTI0ODQ2OUU4MEMwMDJCM0IwMjAwMjgyMTY3Cis6MTBCMkYwMDAzQzA0NDAwMDAyMDQxMDI0NTA0MDAwQjQzQzA0MDEwMDBGCis6MTBCMzAwMDA4RjQyMDNCQzI0NDIwMDAxQUY0MjAzQkM4RjQyMDNCQzA2Cis6MTBCMzEwMDA4Rjg3MDBDNDhGODMwMEM4OEY0MjAxNDgwMDY3MTgyM0JECis6MTBCMzIwMDAwMDQzMTAyQjEwNDAwMDAzMDAwMDAwMDA4RjQyMDE0ODMyCis6MTBCMzMwMDAwMDYyMTgyMTEwNjAwMDA1MDAwMDAwMDA4RjQyMDE0Q0RGCis6MTBCMzQwMDAwMDQzMTAyQjEwNDAwMDBCMDAwMDAwMDA4RjgyMDBFMDMzCis6MTBCMzUwMDA4RjQzMDEyNEFGNDIwMTFDQUY0MzAxMTQ4RjgyMDIyMEFFCis6MTBCMzYwMDAzQzAzMDhGRjM0NjNGRkZCMDA0MzEwMjQxMDAwMDBDRUIxCis6MTBCMzcwMDAwMDQ0MTAyNThGODIwMjIwM0MwMzA4RkYzNDYzRkZGRjQ2Cis6MTBCMzgwMDAwMDQzMTAyNDM0NDIwMDA0QUY4MjAyMjA4RjgyMDBFMDg4Cis6MTBCMzkwMDA4RjQzMDEyNEFGNDIwMTFDQUY0MzAxMTQ4Rjg2MDBDOEM0Cis6MTBCM0EwMDA4Rjg0MDEyMDhGODMwMTI0MTAwMDAwMDUwMDAwMjgyMUQ0Cis6MTBCM0IwMDAxNDYyMDAwMjI0NjIwMDIwMjc2MjQ4MDAwMDQwMTgyMTI1Cis6MTBCM0MwMDAxMDY0MDAwQzMwQTIwMEZGOEM2MjAwMTgzMDQyMDAwM0IxCis6MTBCM0QwMDAxMDQwRkZGNzI3NjI0RkUwOEY0MjAzRDAyNDA1MDAwMUExCis6MTBCM0UwMDAyNDQyMDAwMUFGNDIwM0QwOEY0MjAzRDA4QzY2MDAwODk0Cis6MTBCM0YwMDAzMEEyMDBGRjE0NDAwMDU4MDAwMDAwMDA5MzQyMDVDNDMyCis6MTBCNDAwMDAxNDQwMDA1NTAwMDAwMDAwOEY4NzAwQzQ4Rjg4MDBFMEMyCis6MTBCNDEwMDA4Rjg0MDBFNDI0MDJGRkY4MDEwMjQwMjQwMTA0MTAyMzc5Cis6MTBCNDIwMDAwMDAyMThDMzA0NjIwMDAxMjQ2MzAyMDAxMDYwMDAwNURBCis6MTBCNDMwMDAyNDAyMDAwMTEwNjIwMDA5MDAwMDAwMDAxMDAwMDAxRjNCCis6MTBCNDQwMDAwMDAwMDAwMDhGNDIwM0MwMDBFMDMwMjEyNDQyMDAwMUQwCis6MTBCNDUwMDBBRjQyMDNDMDEwMDAwMDQwOEY0MjAzQzA4RjQyMDNDNEJDCis6MTBCNDYwMDAyNDQyMDAwMUFGNDIwM0M0OEM4NjAwMDA4RjQyMDE0ODkxCis6MTBCNDcwMDA4RjQzMDNDNDAwRTYxODIzMDA0MzEwMkIxMDQwMDAwNDQwCis6MTBCNDgwMDAyQzYyMjMzRjhGNDIwMTQ4MDA2MjE4MjEyQzYyMjMzRjI3Cis6MTBCNDkwMDAxNDQwMDAzMTAwMDAwMDAwOEY0MjAyMEMyNDQyMDAwMUUxCis6MTBCNEEwMDBBRjQyMDIwQzhGNDIwMjBDMDBFMDMwMjEyNDgyMDAwOERGCis6MTBCNEIwMDBBRjgyMDBFNDEwMDAwMDI4QUY4MjAwRTg4RjQyMDNDODhBCis6MTBCNEMwMDAyNDQyMDAwMUFGNDIwM0M4OEY0MjAzQzg4Qzg1MDAwMEFDCis6MTBCNEQwMDA4RjQyMDE0ODAwQTcxODIzMDA0MzEwMkIxMDQwMDAwMzlGCis6MTBCNEUwMDAwMDAwMDAwMDhGNDIwMTQ4MDA2MjE4MjE4RjQyMDE0Qzg5Cis6MTBCNEYwMDAwMDQzMTAyQjU0NDAwMDBBMDBBMDMwMjE4RjQyMDIwQzYwCis6MTBCNTAwMDAyNDQyMDAwMUFGNDIwMjBDOEY0MjAyMEMyNDgyMDAwODQ4Cis6MTBCNTEwMDBBRjgyMDBFNDhGODQwMEU0MTQ4OEZGRUNBRjg0MDBFODdECis6MTBCNTIwMDAxNDg4MDAwRDI3NjIzMDAwMTQ4MjAwMDIyNDgyRkZGODg0Cis6MTBCNTMwMDAyNzYyM0ZGODk0NDMwMDA2M0MwMjAwMUYzNDQyRkZGRjlECis6MTBCNTQwMDAwMEMzMzAyMTAwNDYxMDJCMTA0MDAwMDMwMDAwMDAwMDEzCis6MTBCNTUwMDA4RjQyMDE0ODAwQzIzMDIzQUY4NjAwQzg4RjgzMDBDNEU5Cis6MTBCNTYwMDA4RjQyMDE0ODAwQzMxODIzMDA0MzEwMkIxMDQwMDAwM0YyCis6MTBCNTcwMDAwMDAwMDAwMDhGNDIwMTQ4MDA2MjE4MjExMDYwMDAwNUExCis6MTBCNTgwMDAwMDAwMDAwMDhGNDIwMTRDMDA0MzEwMkI1MDQwMDAwODg3Cis6MTBCNTkwMDAzQzAyRkRGRjhGODIwMjIwM0MwMzA4RkYzNDYzRkZGQjY3Cis6MTBCNUEwMDAwMDQzMTAyNDNDMDM0MDAwMTAwMDAwM0YwMDQzMTAyNURFCis6MTBCNUIwMDA4RjQzMDNDQzM0NDJGRkZGMDI4MkEwMjQyNDYzMDAwMUE2Cis6MTBCNUMwMDBBRjQzMDNDQzEwMDAwMDM5OEY0MjAzQ0MwMjA0MTAyNDk3Cis6MTBCNUQwMDAxMDQwMDAwRTNDMTEwMjAwOEY0MjAzQTgyNDQyMDAwMURCCis6MTBCNUUwMDBBRjQyMDNBODhGNDIwM0E4OEY4MjAyMjAzQzAzMDhGRkNBCis6MTBCNUYwMDAzNDYzRkZGRjAwNDMxMDI0MDA0NDEwMjUwQzAwM0RBRkNFCis6MTBCNjAwMDBBRjgyMDIyMDEwMDAwMDI5MDAwMDAwMDAwMjExMTAyNDY3Cis6MTBCNjEwMDA1MDQwMDAwODNDMTEwNDAwOEY0MjAzQUMyNDQyMDAwMTVBCis6MTBCNjIwMDBBRjQyMDNBQzBDMDAzREFGOEY0MjAzQUMxMDAwMDAxOUQ5Cis6MTBCNjMwMDAwMDAwMDAwMDAyMTExMDI0MTA0MDAwMUMwMDAwMDAwMDU3Cis6MTBCNjQwMDA4RjgzMDIyNDI0MDIxNDAyMTQ2MjAwMDkzQzA1MDAwOEJFCis6MTBCNjUwMDAzQzA0MDAwMTI0ODQ2OUY0QUZBMDAwMTBBRkEwMDAxNEUyCis6MTBCNjYwMDA4Rjg2MDIyNDM0QTUwNTAwMEMwMDJCM0IwMDAwMzgyMUY2Cis6MTBCNjcwMDA4RjQyMDNCMDI0NDIwMDAxQUY0MjAzQjA4RjQyMDNCMEI3Cis6MTBCNjgwMDA4RjgyMDIyMDAyMDAyMDIxMzQ0MjAwMDIwQzAwNEU5Q0Q2Cis6MTBCNjkwMDBBRjgyMDIyMDhGODIwMjIwM0MwMzA4RkYzNDYzRkZGRjQ5Cis6MTBCNkEwMDAwMDQzMTAyNDAwNTExMDI1QUY4MjAyMjA4RkJGMDAyMERDCis6MTBCNkIwMDA4RkIxMDAxQzhGQjAwMDE4MDNFMDAwMDgyN0JEMDAyOEUwCis6MTBCNkMwMDAwM0UwMDAwODAwMDAwMDAwM0MwMjAwMDE4QzQyNkRBODZECis6MTBCNkQwMDAyN0JERkZCMEFGQkYwMDQ4QUZCRTAwNDRBRkI1MDA0MENDCis6MTBCNkUwMDBBRkIzMDAzQ0FGQjIwMDM4QUZCMTAwMzQxMDQwMDAwRjMwCis6MTBCNkYwMDBBRkIwMDAzMDNDMDQwMDAxMjQ4NDZBMDAzQzA1MDAwODFGCis6MTBCNzAwMDBBRkEwMDAxMEFGQTAwMDE0OEY4NjAyMjAzNEE1MDYwMDYxCis6MTBCNzEwMDAyNDAyMDAwMTNDMDEwMDAxQUMyMDZEQTgzQzAxMDAwMUE1Cis6MTBCNzIwMDBBQzIyNkQ5QzBDMDAyQjNCMDAwMDM4MjEzQzAzN0ZGRkJBCis6MTBCNzMwMDA4QzAyMDI2ODM0NjNGRkZGM0MwNEZERkYwMDQzMTAyNEM5Cis6MTBCNzQwMDBBQzAyMDI2ODhGNDIwMDA0MzQ4NEZGRkYzMDQyMDAwMkUyCis6MTBCNzUwMDAxMDQwMDA5MjAyODRBMDI0M0MwNDA2MDAzNDg0MjAwMDlGCis6MTBCNzYwMDA4RjQyMDAwNDAwMDAyODIxMjQwM0ZGRkQwMDQzMTAyNDIxCis6MTBCNzcwMDBBRjQyMDAwNEFGQTQwMDIwOEY1RTAwMTgyN0FBMDAyMDZCCis6MTBCNzgwMDAyNDAyMDBGRjEzQzIwMDAyQUZBQTAwMkMyN0M1MDAwMTRCCis6MTBCNzkwMDA4QzAyMDIyODAwQTA5MDIxMTY0MjAwMEUwMDFFMzhDMDI0Cis6MTBCN0EwMDA4RjQyMDMzQzI0NDIwMDAxQUY0MjAzM0M4RjQyMDMzQ0UyCis6MTBCN0IwMDA4QzAyMDIyODNDMDQwMDAxMjQ4NDY5OTgzQzA1MDAwOTlECis6MTBCN0MwMDBBRkEwMDAxNEFGQTIwMDEwOEZBNjAwMjAxMDAwMDA2REUzCis6MTBCN0QwMDAzNEE1MDUwMDAwRjcxMDIxOEZBMzAwMjA4RkE0MDAyNEJBCis6MTBCN0UwMDBBQzQzMDRDMEFDNDQwNEM0OEY4MzAwNTQ4RjgyMDA1NDIzCis6MTBCN0YwMDAyNDcwMDNFODAyMDIxMDIzMkM0MjAzRTkxMDQwMDAxQkNFCis6MTBCODAwMDAwMDAwOTgyMTAwRTA4ODIxMjYzNTA0QzA4RjQ0MDE3ODhCCis6MTBCODEwMDA4RjQ1MDE3QzAyMjAxODIxMjQwQTAwMDRBRkFBMDAxMEUxCis6MTBCODIwMDBBRkIyMDAxNDhGNDgwMDBDMDAwMDEwMjEwMkY1MzAyMTQ3Cis6MTBCODMwMDBBRkE4MDAxODhGNDgwMTBDMjQwNzAwMDgwMEEzMjgyMTk2Cis6MTBCODQwMDAwMEEzNDgyQjAwODIyMDIxMDEwMEY4MDkwMDg5MjAyMTUzCis6MTBCODUwMDA1NDQwMDAwNjI0MTMwMDAxOEY4MjAwNTQwMjAyMTAyMzdBCis6MTBCODYwMDAyQzQyMDNFOTE0NDBGRkU5MDAwMDAwMDAzMjYyMDBGRkFGCis6MTBCODcwMDA1NDQwMDAxN0FGNTIwMDE4OEY0MjAzNzgyNDQyMDAwMTUxCis6MTBCODgwMDBBRjQyMDM3ODhGNDIwMzc4OEY4MjAxMjA4RkFBMDAyQzY5Cis6MTBCODkwMDBBRkEyMDAxMDhGODIwMTI0M0MwNDAwMDEyNDg0NjlBNDFCCis6MTBCOEEwMDAzQzA1MDAwOUFGQTIwMDE0OEQ0NjAwMDAxMDAwMDAzNUQxCis6MTBCOEIwMDAzNEE1MDYwMDhGNDIwMzA4MjQxMzAwMDEyNDQyMDAwMTJFCis6MTBCOEMwMDBBRjQyMDMwODhGNDIwMzA4MTAwMDAwMUUzMjYyMDBGRkRGCis6MTBCOEQwMDA4RjgzMDA1NDhGODIwMDU0MjQ3MDAzRTgwMjAyMTAyM0U3Cis6MTBCOEUwMDAyQzQyMDNFOTEwNDAwMDE2MDAwMDk4MjEzQzE1MDAyMDZFCis6MTBCOEYwMDAyNDExMDAxMDhGNDIwMDBDOEY0NDAxNjA4RjQ1MDE2NEI5Cis6MTBCOTAwMDA4Rjg2MDEyMEFGQjEwMDEwQUZCMjAwMTQwMDU1MTAyNTkyCis6MTBCOTEwMDBBRkEyMDAxODhGNDIwMTBDMjQwNzAwMDgwMDQwRjgwOTZDCis6MTBCOTIwMDAyNEM2MDAxQzE0NDBGRkUzMDAwMDAwMDA4RjgyMDA1NDc2Cis6MTBCOTMwMDAwMjAyMTAyMzJDNDIwM0U5MTQ0MEZGRUUwMDAwMDAwMDM1Cis6MTBCOTQwMDAzMjYyMDBGRjE0NDAwMDExMDAwMDAwMDA4RjQyMDM3OEIzCis6MTBCOTUwMDAyNDQyMDAwMUFGNDIwMzc4OEY0MjAzNzg4RjgyMDEyMDk2Cis6MTBCOTYwMDA4RkFBMDAyQ0FGQTIwMDEwOEY4MjAxMjQzQzA0MDAwMTlBCis6MTBCOTcwMDAyNDg0NjlBQzNDMDUwMDA5QUZBMjAwMTQ4RDQ2MDAwMDg4Cis6MTBCOTgwMDAzNEE1MDcwMDBDMDAyQjNCMDNDMDM4MjE4RjQyMDJFQzhBCis6MTBCOTkwMDAyNDQyMDAwMUFGNDIwMkVDOEY0MjAyRUM4RkJGMDA0ODBDCis6MTBCOUEwMDA4RkJFMDA0NDhGQjUwMDQwOEZCMzAwM0M4RkIyMDAzODhCCis6MTBCOUIwMDA4RkIxMDAzNDhGQjAwMDMwMDNFMDAwMDgyN0JEMDA1MDg1Cis6MTBCOUMwMDAzQzAyMDAwMThDNDI2REE4MjdCREZGRTAxNDQwMDAwRDMxCis6MTBCOUQwMDBBRkJGMDAxODNDMDQwMDAxMjQ4NDZBMEMzQzA1MDAwODM5Cis6MTBCOUUwMDBBRkEwMDAxMEFGQTAwMDE0OEY4NjAyMjAzNEE1MDcwMDdFCis6MTBCOUYwMDAyNDAyMDAwMTNDMDEwMDAxQUMyMjZEQTgwQzAwMkIzQjhECis6MTBCQTAwMDAwMDAwMzgyMTNDMDIwMDA0MDJDMjEwMjQxMDQwMDAwNzRDCis6MTBCQTEwMDAwMDAwMDAwMDhGODIwMjIwM0MwMzA4RkYzNDYzRkZGRjE4Cis6MTBCQTIwMDAwMDQzMTAyNDM0NDIwMDA4QUY4MjAyMjAzQzA1MDAwMThDCis6MTBCQTMwMDA4Q0E1NkQ5ODI0MDIwMDAxMTRBMjAwMDcwMDAwMjAyMUFCCis6MTBCQTQwMDAwQzAwNTI5QjI0MDUwMDAxQUMwMjAyNkM4QzAzMDI2Q0JBCis6MTBCQTUwMDAxMDAwMDAwNjNDMDIwMDA3MEMwMDUyOUIwMDAwMjAyMTUxCis6MTBCQTYwMDBBQzAyMDI2ODhDMDMwMjY4M0MwMjAwMDcwMDYyMTgyNEUyCis6MTBCQTcwMDAzQzAyMDAwMjUwNjIwMDBEM0MwMjA1RjUwMDQzMTAyQjExCis6MTBCQTgwMDAxNDQwMDAwNjNDMDIwMDA0M0MwMjAwMDExMDYyMDAwOTYwCis6MTBCQTkwMDAzQzAyMDA5ODEwMDAwMDBCMDAwMDAwMDAxNDYyMDAwOTM2Cis6MTBCQUEwMDAzQzAyM0I5QTEwMDAwMDA0MzQ0MkNBMDAxMDAwMDAwMjFECis6MTBCQUIwMDAzNDQyRTEwMDM0NDI5NjgwQUY0MjAxRkM4RjQyMDFGQ0U3Cis6MTBCQUMwMDBBRUUyMDA2NDhGQkYwMDE4MDNFMDAwMDgyN0JEMDAyMDJECis6MTBCQUQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDg2MTAyQkE1Cis6MTBCQUUwMDA1MDQwMDAwMTAwODcyMDIzMDBDNDEwMjMwMDAyNDg0Mzc3Cis6MTBCQUYwMDAwMTI1MTAyQjEwNDAwMDFCMDAwOTEwNDAwMDgyNDAyMTNFCis6MTBCQjAwMDAwMDg4MTAyQjEwNDAwMDA3MDAwMDE4MjE5NDgyMDAwMENDCis6MTBCQjEwMDAyNDg0MDAwMjAwNjIxODIxMDA4ODEwMkIxNDQwRkZGQkNGCis6MTBCQjIwMDAwMDAwMDAwMDAwNjAyMDIxMDBDNzMwMjMwMEE5MTAyMzdFCis6MTBCQjMwMDAwMDAyMTA0MDAwQzIyODIxMDBDNTEwMkIxMDQwMDAwNzUxCis6MTBCQjQwMDAwMDAwMTgyMTk0QzIwMDAwMjRDNjAwMDIwMDYyMTgyMURGCis6MTBCQjUwMDAwMEM1MTAyQjE0NDBGRkZCMDAwMDAwMDAxMDAwMDAwRDdBCis6MTBCQjYwMDAwMDgzMjAyMTAwMDUxMDQwMDA4MjI4MjEwMDg1MTAyQjMxCis6MTBCQjcwMDAxMDQwMDAwNzAwMDAxODIxOTQ4MjAwMDAyNDg0MDAwMjc1Cis6MTBCQjgwMDAwMDYyMTgyMTAwODUxMDJCMTQ0MEZGRkIwMDAwMDAwMDBDCis6MTBCQjkwMDAwMDYwMjAyMTAwMDQxQzAyMzA4MkZGRkYwMDYyMjAyMThGCis6MTBCQkEwMDAwMDA0MUMwMjMwODJGRkZGMDA2MjIwMjEwM0UwMDAwODM1Cis6MTBCQkIwMDAzMDgyRkZGRjAzRTAwMDA4MDAwMDAwMDAwMDgwMjgyMTIxCis6MTBCQkMwMDAzMEEyMDAwMTEwNDAwMDJCM0MwMzAwMUYzNDYzRkZGRjM0Cis6MTBCQkQwMDAyNEEyMDAwNDAwNjIxMDJCNTQ0MDAwMDcwMDY1MTAyQkMzCis6MTBCQkUwMDA5MEEyMDAwMTkwQTQwMDAzOTBBMzAwMDA5MEE1MDAwMjgxCis6MTBCQkYwMDAxMDAwMDAyQTAwNDQxMDIxMTA0MDAwMDMwMDAwMDAwMDQzCis6MTBCQzAwMDA4RjQyMDE0ODAwQTIyODIzOTBBNDAwMDAyNEE1MDAwMTJGCis6MTBCQzEwMDAwMDY1MTAyQjEwNDAwMDAzMDAwMDAwMDA4RjQyMDE0ODE3Cis6MTBCQzIwMDAwMEEyMjgyMzkwQTIwMDAwMjRBNTAwMDEwMDAyMTIwMDE3Cis6MTBCQzMwMDAwMDgyMjAyMTAwNjUxMDJCMTA0MDAwMDMwMDAwMDAwMDRFCis6MTBCQzQwMDA4RjQyMDE0ODAwQTIyODIzOTBBMjAwMDAyNEE1MDAwMUYxCis6MTBCQzUwMDAwMDgyMjAyMTAwNjUxMDJCMTA0MDAwMDMwMDAwMDAwMDJFCis6MTBCQzYwMDA4RjQyMDE0ODAwQTIyODIzOTBBMjAwMDAxMDAwMDAyRDVFCis6MTBCQzcwMDAwMDAyMTIwMDM0NjNGRkZGMjRBMjAwMDQwMDYyMTAyQkI0Cis6MTBCQzgwMDA1NDQwMDAwQTAwNjUxMDJCOTBBMjAwMDA5MEE0MDAwMjBFCis6MTBCQzkwMDA5MEEzMDAwMTkwQTUwMDAzMDA0NDEwMjEwMDAyMTIwMEFGCis6MTBCQ0EwMDAwMDY1MTgyMTEwMDAwMDIwMDA0MzIwMjExMDQwMDAwM0VGCis6MTBCQ0IwMDAwMDAwMDAwMDhGNDIwMTQ4MDBBMjI4MjM5MEEyMDAwMDRCCis6MTBCQ0MwMDAyNEE1MDAwMTAwMDIyMjAwMDA2NTEwMkIxMDQwMDAwMzkzCis6MTBCQ0QwMDAwMDAwMDAwMDhGNDIwMTQ4MDBBMjI4MjM5MEEyMDAwMDJCCis6MTBCQ0UwMDAyNEE1MDAwMTAwODIyMDIxMDA2NTEwMkIxMDQwMDAwM0Q0Cis6MTBCQ0YwMDAwMDAwMDAwMDhGNDIwMTQ4MDBBMjI4MjM5MEEyMDAwMDBCCis6MTBCRDAwMDAyNEE1MDAwMTAwMDIxMjAwMDA4MjIwMjEwMDY1MTAyQkYyCis6MTBCRDEwMDAxMDQwMDAwMzAwMDAwMDAwOEY0MjAxNDgwMEEyMjgyM0M5Cis6MTBCRDIwMDA5MEEyMDAwMDAwODIyMDIxMDAwNDFDMDIzMDgyRkZGRjRDCis6MTBCRDMwMDAwMDYyMjAyMTAwMDQxQzAyMzA4MkZGRkYwMDYyMjAyMUVCCis6MTBCRDQwMDAwM0UwMDAwODMwODJGRkZGMDAwMDAwMDA4RjgyMDIyMDI1Cis6MTBCRDUwMDAzNDQyMDAwMkFGODIwMjIwM0MwMjAwMDI4QzQyOEZGODgzCis6MTBCRDYwMDAzMDQyNDAwMDEwNDAwMDU0MjQwNDAwMDE4RjgyMDIwMDQxCis6MTBCRDcwMDAyNDA2N0ZGRjhGODMwMjAwMzA0NTAwMDIyNDAyRkZGRDZFCis6MTBCRDgwMDAwMDYyMTgyNEFGODMwMjAwQUY4NDAyMDQ4RjgzMDA1NDQyCis6MTBCRDkwMDA4RjgyMDA1NDEwMDAwMDAyMjQ2MzAwMDE4RjgyMDA1NDNGCis6MTBCREEwMDAwMDYyMTAyMzJDNDIwMDAyMTQ0MEZGRkMwMDAwMDAwMDNGCis6MTBCREIwMDA4RjgyMDIyNDE0NDQwMDREMDAwNDIwNDAwMEM0MTAyQjQ0Cis6MTBCREMwMDAxMDQwRkZGMTAwMDAwMDAwOEY4MjAyMDAwMDQ1MTAyNUE2Cis6MTBCREQwMDBBRjgyMDIwMDhGODIwMjIwMzQ0MjgwMDBBRjgyMDIyMEI0Cis6MTBCREUwMDA4RjgzMDA1NDhGODIwMDU0MTAwMDAwMDIyNDYzMDAwMUVFCis6MTBCREYwMDA4RjgyMDA1NDAwNjIxMDIzMkM0MjAwMDIxNDQwRkZGQzhBCis6MTBCRTAwMDAwMDAwMDAwMDhGODIwMjIwM0MwMzAwMDQwMDQzMTAyNDQ1Cis6MTBCRTEwMDAxNDQwMDAwRjAwMDAwMDAwOEY4MjAyMjAzQzAzRkZGRjRGCis6MTBCRTIwMDAzNDYzN0ZGRjAwNDMxMDI0QUY4MjAyMjA4RjgzMDA1NENECis6MTBCRTMwMDA4RjgyMDA1NDEwMDAwMDAyMjQ2MzAwMDE4RjgyMDA1NDlFCis6MTBCRTQwMDAwMDYyMTAyMzJDNDIwMDAyMTQ0MEZGRkMwMDAwMDAwMDlFCis6MTBCRTUwMDA4RjgyMDIyMDNDMDMwMDA0MDA0MzEwMjQxNDQwMDAwRDk0Cis6MTBCRTYwMDAwMDAwMDAwMDhGODIwMjIwMzQ0MjgwMDBBRjgyMDIyMDU2Cis6MTBCRTcwMDA4RjgzMDA1NDhGODIwMDU0MTAwMDAwMDIyNDYzMDAwMTVECis6MTBCRTgwMDA4RjgyMDA1NDAwNjIxMDIzMkM0MjAwMDIxNDQwRkZGQ0Y5Cis6MTBCRTkwMDAwMDAwMDAwMDhGODIwMjIwM0MwMzAwMDQwMDQzMTAyNEI1Cis6MTBCRUEwMDAxMDQwMDAxQjAwMDAxMDIxOEY4MzAyMjAyNDAyMDAwMTlCCis6MTBCRUIwMDAxMDAwMDAxNTNDMDRGNzAwOEY4MjAyMjAzQzA0RjcwMEJDCis6MTBCRUMwMDAwMDQ0MTAyNUFGODIwMjIwOEY4MjAyMjAyNDAzRkZGRDUwCis6MTBCRUQwMDAwMDQzMTAyNEFGODIwMjIwOEY4MjAyMjAzQzAzMDMwMDIzCis6MTBCRUUwMDAwMDQzMTAyNDE0NDAwMDAzMDAwMDAwMDAxMDAwMDAwODZDCis6MTBCRUYwMDAwMDAwMTAyMThGODIwMjIwMzQ0MjAwMDJBRjgyMDIyMDEzCis6MTBCRjAwMDA4RjgzMDIyMDI0MDIwMDAxMDA2NDE4MjVBRjgzMDIyMEUxCis6MTBCRjEwMDAwM0UwMDAwODAwMDAwMDAwMDAwMDIwMjEzQzA1MDEwMEIzCis6MTBCRjIwMDAyNDAyMDAwMUFGODAwMjFDQUY4MjAyMDBBRjgyMDIyMDE3Cis6MTBCRjMwMDAyNzYyNTAwMEFGODIwMEMwMjc2MjUwMDBBRjgyMDBDNDY5Cis6MTBCRjQwMDAyNzYyNTAwMEFGODIwMEM4Mjc2MjUwMDBBRjgyMDBEMDQ1Cis6MTBCRjUwMDAyNzYyNTAwMEFGODIwMEQ0Mjc2MjUwMDBBRjgyMDBEODIxCis6MTBCRjYwMDAyNzYyMzAwMEFGODIwMEUwMjc2MjMwMDBBRjgyMDBFNDM5Cis6MTBCRjcwMDAyNzYyMzAwMEFGODIwMEU4Mjc2MjI4MDBBRjgyMDBGMDFECis6MTBCRjgwMDAyNzYyMjgwMEFGODIwMEY0Mjc2MjI4MDBBRjgyMDBGODAxCis6MTBCRjkwMDAwMDA0MThDMDI0ODQwMDAxMDM2MzEwMjFBQzQ1MzAwNDYwCis6MTBCRkEwMDAwMzYzMTAyMUFDNDAzMDAwMjg4MjAyMDAxNDQwRkZGOUU2Cis6MTBCRkIwMDAwMDA0MThDMDAwMDAyMDIxMDAwNDE4QzAyNDg0MDAwMURGCis6MTBCRkMwMDAwMzYzMTAyMUFDNDAyODA0MDM2MzEwMjFBQzQwMjgwMDE3Cis6MTBCRkQwMDAyODgyMDEwMDE0NDBGRkY5MDAwNDE4QzBBRjgwMDIzQzIxCis6MTBCRkUwMDAyNDAzMDA4MDI0MDQwMTAwQUM2MDAwMDAyNDYzMDAwNEVBCis6MTBCRkYwMDAwMDY0MTAyQjU0NDBGRkZEQUM2MDAwMDA4RjgzMDA0MEI0Cis6MTBDMDAwMDAzQzAyRjAwMDAwNjIxODI0M0MwMjUwMDAxMDYyMDAwQzU4Cis6MTBDMDEwMDAwMDQzMTAyQjE0NDAwMDA2M0MwMjYwMDAzQzAyNDAwMDJDCis6MTBDMDIwMDAxMDYyMDAwODI0MDIwODAwMTAwMDAwMDgwMDAwMDAwMDUwCis6MTBDMDMwMDAxMDYyMDAwNDI0MDIwODAwMTAwMDAwMDQwMDAwMDAwMDQ4Cis6MTBDMDQwMDAyNDAyMDcwMDNDMDEwMDAxQUMyMjZEQUMwM0UwMDAwOEIzCis6MTBDMDUwMDAwMDAwMDAwMDNDMDIwMDAxOEM0MjZEQkMyN0JERkZEMEY3Cis6MTBDMDYwMDBBRkJGMDAyQ0FGQjIwMDI4QUZCMTAwMjRBRkIwMDAyMEFBCis6MTBDMDcwMDAzQzAxMDAwMTEwNDAwMDA1QUMyMDZEOTQwQzAwNEQ5RTY5Cis6MTBDMDgwMDAwMDAwMDAwMDNDMDEwMDAxQUMyMDZEQkM4RjgzMDA1NDE3Cis6MTBDMDkwMDA4RjgyMDA1NDEwMDAwMDAyMjQ2MzAwNjQ4RjgyMDA1NEQ5Cis6MTBDMEEwMDAwMDYyMTAyMzJDNDIwMDY1MTQ0MEZGRkMwMDAwMDAwMEQ5Cis6MTBDMEIwMDAwQzAwNERCOTAwMDAwMDAwMjQwNDAwMDEwMDAwMjgyMUZDCis6MTBDMEMwMDAyN0E2MDAxODM0MDI4MDAwMEMwMDQ1QkVBN0EyMDAxODY1Cis6MTBDMEQwMDA4RjgzMDA1NDhGODIwMDU0MTAwMDAwMDIyNDYzMDA2NDk4Cis6MTBDMEUwMDA4RjgyMDA1NDAwNjIxMDIzMkM0MjAwNjUxNDQwRkZGQzM0Cis6MTBDMEYwMDAyNDA0MDAwMTI0MDUwMDAxMEMwMDQ1N0MyN0E2MDAxODNCCis6MTBDMTAwMDA4RjgzMDA1NDhGODIwMDU0MTAwMDAwMDIyNDYzMDA2NDY3Cis6MTBDMTEwMDA4RjgyMDA1NDAwNjIxMDIzMkM0MjAwNjUxNDQwRkZGQzAzCis6MTBDMTIwMDAyNDA0MDAwMTI0MDUwMDAxMEMwMDQ1N0MyN0E2MDAxODBBCis6MTBDMTMwMDA4RjgzMDA1NDhGODIwMDU0MTAwMDAwMDIyNDYzMDA2NDM3Cis6MTBDMTQwMDA4RjgyMDA1NDAwNjIxMDIzMkM0MjAwNjUxNDQwRkZGQ0QzCis6MTBDMTUwMDAyNDA0MDAwMTNDMDYwMDAxMjRDNjZGMjQwQzAwNDU3QzI5Cis6MTBDMTYwMDAyNDA1MDAwMjhGODMwMDU0OEY4MjAwNTQxMDAwMDAwMkM3Cis6MTBDMTcwMDAyNDYzMDA2NDhGODIwMDU0MDA2MjEwMjMyQzQyMDA2NTA3Cis6MTBDMTgwMDAxNDQwRkZGQzI0MDQwMDAxMjQwNTAwMDMzQzEwMDAwMUJFCis6MTBDMTkwMDAyNjEwNkYyNjBDMDA0NTdDMDIwMDMwMjE5N0E2MDAxODVGCis6MTBDMUEwMDAzQzA3MDAwMTk0RTc2RjI0M0MwNDAwMDEyNDg0NkFFMDBBCis6MTBDMUIwMDBBRkEwMDAxNDk2MDIwMDAwM0MwNTAwMEQzNEE1MDEwMDVDCis6MTBDMUMwMDAwQzAwMkIzQkFGQTIwMDEwOTdBMjAwMTgxMDQwMDA0REFFCis6MTBDMUQwMDAyNDAzNjA0MDk2MDIwMDAwMzA0MkZGRjAxNDQzMDAwQzNDCis6MTBDMUUwMDAyNDAyMDAyMDNDMDMwMDAxOTQ2MzZGMjQxNDYyMDAwQkJFCis6MTBDMUYwMDAyNDAyNzgzMDI0MDIwMDAzM0MwMTAwMDFBQzIyNkQ5NDNCCis6MTBDMjAwMDAyNDAyMDAwNTNDMDEwMDAxMTAwMDAwM0ZBQzIyNkYzNDA1Cis6MTBDMjEwMDAzQzAzMDAwMTk0NjM2RjI0MjQwMjc4MzAxNDYyMDAwQzA0Cis6MTBDMjIwMDAyNDAzMDAxMDNDMDIwMDAxOTQ0MjZGMjYzMDQyRkZGMENDCis6MTBDMjMwMDAxNDQzMDAwNzI0MDIwMDAzM0MwMTAwMDFBQzIyNkQ5NDZBCis6MTBDMjQwMDAyNDAyMDAwNjNDMDEwMDAxMTAwMDAwMkZBQzIyNkYzNEQ0Cis6MTBDMjUwMDAzQzAyMDAwMThDNDI2RDk0M0MwMzAwMDE5NDYzNkYyNDA2Cis6MTBDMjYwMDAzNDQyMDAwMTNDMDEwMDAxQUMyMjZEOTQyNDAyMDAxNTBGCis6MTBDMjcwMDAxNDYyMDAwQjAwMDAwMDAwM0MwMjAwMDE5NDQyNkYyNjkzCis6MTBDMjgwMDAzMDQyRkZGMDM4NDNGNDIwMkM2MzAwMDEzODQyRjQzMDkwCis6MTBDMjkwMDAyQzQyMDAwMTAwNjIxODI1MTQ2MDAwMUIyNDAyMDAwM0Q4Cis6MTBDMkEwMDAzQzAzMDAwMTk0NjM2RjI0MjQwMjc4MTAxNDYyMDAxNjhBCis6MTBDMkIwMDAyNDAyMDAwMjNDMDIwMDAxOTQ0MjZGMjYzMDQyRkZGMDRCCis6MTBDMkMwMDAxNDQwMDAxMTI0MDIwMDAyMTAwMDAwMEYyNDAyMDAwNDk4Cis6MTBDMkQwMDAzQzAyMDAwMThDNDI2RDk0MzQ0MjAwMDgzQzAxMDAwMTk0Cis6MTBDMkUwMDBBQzIyNkQ5NDEwMDAwMDVFMjQwMjAwMDQzQzAyMDAwMUE4Cis6MTBDMkYwMDA4QzQyNkQ5NDM0NDIwMDA0M0MwMTAwMDExMDAwMDBBRkY4Cis6MTBDMzAwMDBBQzIyNkQ5NDI0MDIwMDAxM0MwMTAwMDFBQzIyNkY0MDdDCis6MTBDMzEwMDAzQzAyMDAwMThDNDI2RDk0MzA0MjAwMDIxNDQwMDBCMjk1Cis6MTBDMzIwMDAzQzA5RkZGMDI0MDIwRTAwQUY4MjAyMzg4Rjg0MDA1NEQzCis6MTBDMzMwMDA4RjgyMDA1NDI0MDMwMDA4M0MwMTAwMDFBQzIzNkQ5ODU3Cis6MTBDMzQwMDAxMDAwMDAwMjI0ODQwMUY0OEY4MjAwNTQwMDgyMTAyMzI0Cis6MTBDMzUwMDAyQzQyMDFGNTE0NDBGRkZDM0MwMjAwQzgzNDQyMDFGQkIyCis6MTBDMzYwMDBBRjgyMDIzODhGODMwMDU0OEY4MjAwNTQxMDAwMDAwMjg1Cis6MTBDMzcwMDAyNDYzMDFGNDhGODIwMDU0MDA2MjEwMjMyQzQyMDFGNUUzCis6MTBDMzgwMDAxNDQwRkZGQzAwMDA4MDIxMjQxMjAwMDEyNDExMDAwOTQ4Cis6MTBDMzkwMDAwQzAwNDQ4MjAwMDAwMDAwM0MwMTAwMDFBQzMyNkRCNDhFCis6MTBDM0EwMDAwQzAwNDU0NzAwMDAwMDAwM0MwMjAwMDE4QzQyNkRCNEM3Cis6MTBDM0IwMDAxNDUxRkZGQjNDMDIwMEM4MzQ0MjAxRjZBRjgyMDIzODQwCis6MTBDM0MwMDA4RjgzMDA1NDhGODIwMDU0MTAwMDAwMDIyNDYzMDAwQUZGCis6MTBDM0QwMDA4RjgyMDA1NDAwNjIxMDIzMkM0MjAwMEIxNDQwRkZGQzlCCis6MTBDM0UwMDAwMDAwMDAwMDhGODIwMjIwMjQwNDAwMDEzNDQyMDAwMjc5Cis6MTBDM0YwMDBBRjgyMDIyMDhGODMwMjAwMjQwNTdGRkYyNDAyRkZGRDBECis6MTBDNDAwMDAwMDYyMTgyNEFGODMwMjAwQUY4NDAyMDQ4RjgzMDA1NEJCCis6MTBDNDEwMDA4RjgyMDA1NDEwMDAwMDAyMjQ2MzAwMDE4RjgyMDA1NEI4Cis6MTBDNDIwMDAwMDYyMTAyMzJDNDIwMDAyMTQ0MEZGRkMwMDAwMDAwMEI4Cis6MTBDNDMwMDA4RjgyMDIyNDE0NDQwMDA1MzQwMjgwMDAwMDA0MjA0MDRFCis6MTBDNDQwMDAwMEE0MTAyQjEwNDBGRkYwMzQwMjgwMDAxMDgyRkZBMEU3Cis6MTBDNDUwMDAyNjEwMDAwMTJFMDIwMDE0MTQ0MEZGQ0QyNDAyMDAwNDE3Cis6MTBDNDYwMDAzQzAxMDAwMUFDMjI2RDk4MDAwMDgwMjEyNDEyMDAwOURCCis6MTBDNDcwMDAzQzExRkZGRjM2MzEzRjdGMEMwMDQ0ODIwMDAwMDAwMDdBCis6MTBDNDgwMDAyNDAyMDAwMTNDMDEwMDAxQUMyMjZEQjQwQzAwNDU0N0MwCis6MTBDNDkwMDAwMDAwMDAwMDNDMDIwMDAxOEM0MjZEQjQxNDUyRkZGQjBFCis6MTBDNEEwMDAwMDAwMDAwMDhGODIwMDQ0MDA1MTEwMjQzNDQyNTA4MDZDCis6MTBDNEIwMDBBRjgyMDA0NDhGODMwMDU0OEY4MjAwNTQxMDAwMDAwMjJBCis6MTBDNEMwMDAyNDYzMDAwQThGODIwMDU0MDA2MjEwMjMyQzQyMDAwQjY4Cis6MTBDNEQwMDAxNDQwRkZGQzAwMDAwMDAwOEY4MjAwNDQwMDUxMTAyNDMzCis6MTBDNEUwMDAzNDQyRjA4MEFGODIwMDQ0OEY4MzAwNTQ4RjgyMDA1NDI2Cis6MTBDNEYwMDAxMDAwMDAwMjI0NjMwMDBBOEY4MjAwNTQwMDYyMTAyMzlGCis6MTBDNTAwMDAyQzQyMDAwQjE0NDBGRkZDMDAwMDAwMDA4RjgyMDIyMDMwCis6MTBDNTEwMDAzQzAzRjcwMDAwNDMxMDI1QUY4MjAyMjA4RjgzMDA1NEI0Cis6MTBDNTIwMDA4RjgyMDA1NDEwMDAwMDAyMjQ2MzAwNjQ4RjgyMDA1NDQ0Cis6MTBDNTMwMDAwMDYyMTAyMzJDNDIwMDY1MTQ0MEZGRkMwMDAwMDAwMDQ0Cis6MTBDNTQwMDA4RjgyMDIyMDI0MDQwMDAxMzQ0MjAwMDJBRjgyMDIyMEM0Cis6MTBDNTUwMDA4RjgzMDIwMDI0MDU3RkZGMjQwMkZGRkQwMDYyMTgyNDYwCis6MTBDNTYwMDBBRjgzMDIwMEFGODQwMjA0OEY4MzAwNTQ4RjgyMDA1NDkzCis6MTBDNTcwMDAxMDAwMDAwMjI0NjMwMDAxOEY4MjAwNTQwMDYyMTAyMzI3Cis6MTBDNTgwMDAyQzQyMDAwMjE0NDBGRkZDMDAwMDAwMDA4RjgyMDIyNEI1Cis6MTBDNTkwMDAxNDQ0MDAwNTM0MDI4MDAwMDAwNDIwNDAwMEE0MTAyQjQ1Cis6MTBDNUEwMDAxMDQwRkZGMDM0MDI4MDAwMTA4MkZGNTAyNjEwMDAwMTdFCis6MTBDNUIwMDAyRTAyMDA2NDE0NDBGRkIwMDAwMDAwMDAzQzAyMDAwMUE1Cis6MTBDNUMwMDA4QzQyNkQ5NDMwNDIwMDA0MTQ0MDAwMDczQzA5RkZGMDk3Cis6MTBDNUQwMDA4RjgyMDA0NDNDMDNGRkZGMzQ2MzNGN0YwMDQzMTAyNEZECis6MTBDNUUwMDBBRjgyMDA0NDNDMDlGRkYwMzUyOUJEQzAzQzA2MDAwMTg0Cis6MTBDNUYwMDA4Q0M2NkQ5NDNDMDQwMDAxMjQ4NDZBRTAyNDAyMDAwMThFCis6MTBDNjAwMDAzQzAxMDAwMUFDMjI2RDlDOEY4MjAwNTQzQzA3MDAwMTZDCis6MTBDNjEwMDA4Q0U3NkY0MDNDMDMwMDAxOTQ2MzZGMjQzQzA4MDAwMUU5Cis6MTBDNjIwMDA5NTA4NkYyNjNDMDUwMDBEMzRBNTAxMDAzQzAxMDAwMTcyCis6MTBDNjMwMDBBQzIwNkQ5ODAwNDkxMDIxM0MwMTAwMDFBQzIyNkYzMDA0Cis6MTBDNjQwMDBBRkEzMDAxMDBDMDAyQjNCQUZBODAwMTQ4RkJGMDAyQzMxCis6MTBDNjUwMDA4RkIyMDAyODhGQjEwMDI0OEZCMDAwMjAwM0UwMDAwOEMzCis6MTBDNjYwMDAyN0JEMDAzMDI3QkRGRkU4M0MwNTAwMDE4Q0E1NkQ5ODczCis6MTBDNjcwMDAyNDA2MDAwNDI0MDIwMDAxMTRBMjAwMTRBRkJGMDAxMDFECis6MTBDNjgwMDAzQzAyMDAwMjhDNDI4RkZDMzA0MjgwMDAxMDQwMDAwNUNBCis6MTBDNjkwMDAzQzA0MDAwRjNDMDMwMDAxOEM2MzZGNDAxMDAwMDAwNTU4Cis6MTBDNkEwMDAzNDg0NDI0MDNDMDQwMDA0M0MwMzAwMDE4QzYzNkY0MDJFCis6MTBDNkIwMDAzNDg0OTNFMDI0MDIwMDA1MTQ2MjAwMTYwMDAwMDAwMDk4Cis6MTBDNkMwMDAzQzA0MDAzRDEwMDAwMDEzMzQ4NDA5MDAzQzAyMDAwMkM5Cis6MTBDNkQwMDA4QzQyOEZGODMwNDI4MDAwMTA0MDAwMDUzQzA0MDAxRTYwCis6MTBDNkUwMDAzQzAzMDAwMThDNjM2RjQwMTAwMDAwMDUzNDg0ODQ4MDlCCis6MTBDNkYwMDAzQzA0MDAwRjNDMDMwMDAxOEM2MzZGNDAzNDg0NDI0MEQzCis6MTBDNzAwMDAyNDAyMDAwNTE0NjIwMDAzMDAwMDAwMDAzQzA0MDA3QUNCCis6MTBDNzEwMDAzNDg0MTIwMDNDMDIwMDAxOEM0MjZGMzA4RjgzMDA1NDNECis6MTBDNzIwMDAwMDQ0MTAyMTAwNDMxMDIzMDA0NDEwMkIxNDQwMDA0Q0ZGCis6MTBDNzMwMDAwMDAwMDAwMDNDMDIwMDAxOEM0MjZEQTAxNDQwMDA0ODQzCis6MTBDNzQwMDAwMDAwMDAwMDNDMDEwMDAxMTBDMDAwMjVBQzIwNkRCMENECis6MTBDNzUwMDAzQzA5MDAwMThEMjk2RDk0MjQwNzAwMDEzQzA0NDAwMDMwCis6MTBDNzYwMDAzQzA4MDAwMjI1MDg4RkZDMjUwQUZGRkMwMDA1Mjg0MjMyCis6MTBDNzcwMDAxNEEwMDAwMjI0QzZGRkZGMjQwNTAwMDgwMEE5MTAyNDBECis6MTBDNzgwMDAxMDQwMDAxMDAwMDAwMDAwMTRBNzAwMDgwMDAwMDAwMDg2Cis6MTBDNzkwMDA4RDAyMDAwMDAwNDQxMDI0MTA0MDAwMEEwMDAwMDAwMDM4Cis6MTBDN0EwMDAzQzAxMDAwMTEwMDAwMDA3QUMyNTZEQjA4RDQyMDAwMDc3Cis6MTBDN0IwMDAwMDQ0MTAyNDEwNDAwMDAzMDAwMDAwMDAzQzAxMDAwMTcwCis6MTBDN0MwMDBBQzI3NkRCMDNDMDIwMDAxOEM0MjZEQjAwMDA2MTgyQjA2Cis6MTBDN0QwMDAyQzQyMDAwMTAwNDMxMDI0NTQ0MEZGRTUwMDA1Mjg0MjhDCis6MTBDN0UwMDA4RjgyMDA1NDNDMDMwMDAxOEM2MzZEQjAzQzAxMDAwMTVBCis6MTBDN0YwMDBBQzIyNkYzMDEwNjAwMDNCMjQwMjAwMDUzQzAzMDAwMUI2Cis6MTBDODAwMDA4QzYzNkY0MDNDMDEwMDAxQUMyNTZEOTgxNDYyMDAxMkVFCis6MTBDODEwMDAyNDAyMDAwMTNDMDIwMDAyOEM0MjhGRjgzQzAzMjAwMEZECis6MTBDODIwMDAzNDYzNTAwMDAwNDMxMDI0MTQ0MDAwMDYyNDAyMDAwMTI5Cis6MTBDODMwMDAzQzAxMDAwMUFDMjA2RjFDM0MwMTAwMDFBQzIyNkQ5ODUyCis6MTBDODQwMDAyNDAyMDAwMTNDMDEwMDAxQUMyMjZFMjQzQzAxMDAwMUU1Cis6MTBDODUwMDBBQzIyNkRBNDI0MDIwMDAxM0MwMTAwMDFBQzIyNkQ5Q0JECis6MTBDODYwMDAzQzAyMDAwMThDNDI2REIwMTA0MDAwMUUwMDAwMDAwMDMwCis6MTBDODcwMDAzQzAyMDAwMThDNDI2RDlDMTA0MDAwMDgyNDAyMDAwMTIzCis6MTBDODgwMDAzQzAxMDAwMUFDMjA2RDlDQUVFMjA0QjgzQzAxMDAwMTBCCis6MTBDODkwMDBBQzIwNkUxQzNDMDEwMDAxQUMyMjZERDQ4RUUzMDRCOEM4Cis6MTBDOEEwMDAyNDAyMDAwODEwNjIwMDA1MjQwMjAwMDEwQzAwNDIzOTM1Cis6MTBDOEIwMDAwMDAwMDAwMDEwMDAwMDBCMDAwMDAwMDAzQzAzMDAwMTFECis6MTBDOEMwMDA4QzYzNkQ5ODEwNjIwMDA3MjQwMjAwMEUzQzAzMDAwMjg2Cis6MTBDOEQwMDA4QzYzOEY5MDEwNjIwMDAzMDAwMDAwMDAwQzAwNEU5Q0RGCis6MTBDOEUwMDA4Rjg0MDIyMDhGQkYwMDEwMDNFMDAwMDgyN0JEMDAxOENFCis6MTBDOEYwMDAyN0JERkZFMDNDMDNGREZGM0MwNDAwMDE4Qzg0NkQ5OEU0Cis6MTBDOTAwMDAzQzAyMDAwMThDNDI2REMwMzQ2M0ZGRkYwMjgzQTAyNDBGCis6MTBDOTEwMDAxNDgyMDAwNkFGQkYwMDE4OEVFMzA0QjgzQzAyMDAwMTg5Cis6MTBDOTIwMDA4QzQyNkRDNDEwNjIwMDA2MDAwMDAwMDA4RUUyMDRCODY0Cis6MTBDOTMwMDAzQzAxMDAwMUFDMjQ2REMwM0MwMTAwMDFBQzIyNkRDNDdGCis6MTBDOTQwMDAzQzAzMDAwMThDNjM2RDk4MjQwMjAwMDIxMDYyMDE5QzdDCis6MTBDOTUwMDAyQzYyMDAwMzEwNDAwMDA1MjQwMjAwMDExMDYyMDAwQTRFCis6MTBDOTYwMDAwMDAwMDAwMDEwMDAwMjI2MDAwMDAwMDAyNDAyMDAwNDY1Cis6MTBDOTcwMDAxMDYyMDBCNjI0MDIwMDA4MTA2MjAxMEEyNDAyMDAwMUJECis6MTBDOTgwMDAxMDAwMDIxRjAwMDAwMDAwOEVFMjA0QjgyNDQzRkZGRkU1Cis6MTBDOTkwMDAyQzYyMDAwODEwNDAwMjFDMDAwMzEwODAzQzAxMDAwMUMyCis6MTBDOUEwMDAwMDIyMDgyMThDMjI2QUY4MDA0MDAwMDgwMDAwMDAwMEU0Cis6MTBDOUIwMDAzQzAzMDAwMThDNjM2RjQwMjQwMjAwMDUxNDYyMDAxMEU4Cis6MTBDOUMwMDAwMDAwMDAwMDNDMDIwMDAxOEM0MjZEQTQxMDQwMDAwOEYxCis6MTBDOUQwMDAyNDAyMDAwMzBDMDA0NDgyMDAwMDAwMDAyNDAyMDAwMjM0Cis6MTBDOUUwMDBBRUUyMDRCODNDMDEwMDAxMTAwMDAwMDJBQzIwNkRBNENFCis6MTBDOUYwMDBBRUUyMDRCODNDMDEwMDAxMTAwMDAyMDNBQzIwNkQzMDJGCis6MTBDQTAwMDAwQzAwNDQ4MjAwMDAwMDAwM0MwMjAwMDE4QzQyNkRBNDM2Cis6MTBDQTEwMDAzQzAxMDAwMUFDMjA2RDMwMTQ0MDAxN0EyNDAyMDAwMjc4Cis6MTBDQTIwMDAxMDAwMDE5RDI0MDIwMDA3M0MwMzAwMDE4QzYzNkY0MDRECis6MTBDQTMwMDAyNDAyMDAwNTE0NjIwMDAzMjQwMjAwMDEzQzAxMDAwMUVECis6MTBDQTQwMDBBQzIyNkREMDBDMDA0NUZGMDAwMDAwMDAzQzAzMDAwMTRCCis6MTBDQTUwMDA4QzYzNkREMDEwMDAwMTc0MjQwMjAwMTEzQzA1MDAwMUFDCis6MTBDQTYwMDA4Q0E1NkQ5ODNDMDYwMDAyOENDNjhGRkMwQzAwNTEwNDBFCis6MTBDQTcwMDAwMDAwMjAyMTI0MDIwMDA1M0MwMTAwMDFBQzIwNkRBNDJGCis6MTBDQTgwMDAxMDAwMDFFMUFFRTIwNEI4M0MwNDAwMDEyNDg0NkFFQzI5Cis6MTBDQTkwMDAzQzA1MDAwRjM0QTUwMTAwMDAwMDMwMjEwMDAwMzgyMUMyCis6MTBDQUEwMDBBRkEwMDAxMDBDMDAyQjNCQUZBMDAwMTQxMDAwMDFENjZCCis6MTBDQUIwMDAwMDAwMDAwMDhGODIwMjIwM0MwMzAwMDQwMDQzMTAyNDg5Cis6MTBDQUMwMDAxNDQwMDE3NTI0MDIwMDA3OEY4MzAwNTQzQzAyMDAwMUNBCis6MTBDQUQwMDA4QzQyNkYyODI0NjNEOEYwMDA0MzEwMjMyQzQyMjcxMDg3Cis6MTBDQUUwMDAxNDQwMDAwMzI0MDIwMDAxM0MwMTAwMDFBQzIyNkQ5Q0IzCis6MTBDQUYwMDAzQzAyMDAwMjhDNDI4RkZDMzA0MjUwMDAxMDQwMDFDMkM4Cis6MTBDQjAwMDAwMDAwMDAwMDhGODIwMjIwMzA0MjgwMDAxMDQwMDE3RDMyCis6MTBDQjEwMDAwMDAwMDAwMDEwMDAwMTc1MDAwMDAwMDAzQzA1MDAwMTRECis6MTBDQjIwMDA4Q0E1NkQ5ODBDMDA1MjlCMDAwMDIwMjEwQzAwNTUxQjE5Cis6MTBDQjMwMDAwMDAwMjAyMTNDMDMwMDAyOEM2MzhGRjQwNDYxMDFCMEVCCis6MTBDQjQwMDAyNDAyMDAwMTNDMDIwMDA4MDA2MjEwMjQxMDQwMDAwNjhDCis6MTBDQjUwMDAwMDAwMDAwMDhGODIwMjE0M0MwM0ZGRkYwMDQzMTAyNEZBCis6MTBDQjYwMDAxMDAwMDAwNTM0NDIyNTFGOEY4MjAyMTQzQzAzRkZGRjkyCis6MTBDQjcwMDAwMDQzMTAyNDM0NDIyNDFGQUY4MjAyMTQ4RjgyMDIyMDBCCis6MTBDQjgwMDAzQzAzMDIwMDM0NDIwMDAyQUY4MjAyMjAyNDAyMDAwODZCCis6MTBDQjkwMDBBRUUyMDRCODhGODIwMjIwMDI4M0EwMjUzQzAzMDAwNDg5Cis6MTBDQkEwMDAwMDQzMTAyNDE0NDAwMDE2MDAwMDAwMDAzQzAyMDAwMjY0Cis6MTBDQkIwMDA4QzQyOEZGQzMwNDI1MDAwMTA0MDAwMEQwMDAwMDAwMEZECis6MTBDQkMwMDA4RjgyMDIyMDMwNDI4MDAwMTA0MDAwMDYwMDAwMDAwMEVBCis6MTBDQkQwMDA4RjgyMDIyMDNDMDNGRkZGMzQ2MzdGRkYxMDAwMDAwM0JECis6MTBDQkUwMDAwMDQzMTAyNDhGODIwMjIwMzQ0MjgwMDBBRjgyMDIyMDUyCis6MTBDQkYwMDA4RjgyMDIyMDNDMDNGNzAwMDA0MzEwMjVBRjgyMDIyMDAxCis6MTBDQzAwMDAzQzAzMDAwMThDNjM2RjQwMjQwMjAwMDUxNDYyMDAwQTlCCis6MTBDQzEwMDAwMDAwMDAwMDNDMDIwMDAxOTQ0MjZGMjYyNDQyOUZCQ0E5Cis6MTBDQzIwMDAyQzQyMDAwNDEwNDAwMDA0MjQwNDAwMTgyNDA1MDAwMkQzCis6MTBDQzMwMDAwQzAwNEREQjI0MDYwMDIwMEMwMDNFNkQwMDAwMDAwMEJGCis6MTBDQzQwMDAzQzAxMDAwMTEwMDAwMTcwQUMyMDZFMjA4RUUyMDRCODlGCis6MTBDQzUwMDAyNDQzRkZGRjJDNjIwMDA4MTA0MDAxNkIwMDAzMTA4MDhBCis6MTBDQzYwMDAzQzAxMDAwMTAwMjIwODIxOEMyMjZCMTgwMDQwMDAwOEMyCis6MTBDQzcwMDAwMDAwMDAwMDBDMDA0NTQ3MDAwMDAwMDAzQzAzMDAwMURDCis6MTBDQzgwMDA4QzYzNkRCNDEwMDAwMEU4MjQwMjAwMDkzQzAyMDAwMjJECis6MTBDQzkwMDA4QzQyOEZGODMwNDI0MDAwMTA0MDAwMDQwMDAwMDAwMDM5Cis6MTBDQ0EwMDA4RjgyMDA0NDEwMDAwMDA2MzQ0MkYwODA4RjgyMDA0NERFCis6MTBDQ0IwMDAzQzAzRkZGRjM0NjMzRjdGMDA0MzEwMjQzNDQyQTA4MEQ1Cis6MTBDQ0MwMDBBRjgyMDA0NDhGODMwMDU0MTAwMDAwRUEyNDAyMDAwNDY1Cis6MTBDQ0QwMDA4RjgzMDA1NDNDMDIwMDAxOEM0MjZGMjgyNDYzRDhGMEZCCis6MTBDQ0UwMDAwMDQzMTAyMzJDNDIyNzEwMTQ0MDAxNDcyNDAyMDAwNTYyCis6MTBDQ0YwMDAxMDAwMDBEODAwMDAwMDAwOEY4MjAyMjAzQzAzRjcwMEUzCis6MTBDRDAwMDAwMDQzMTAyNUFGODIwMjIwQUY4MDAyMDQzQzAxMDAwMkU0Cis6MTBDRDEwMDAxMDAwMDBENkFDMjA4RkUwOEY4MzAwNTQzQzAyMDAwMTRECis6MTBDRDIwMDA4QzQyNkYyODI0NjNGRkY2MDA0MzEwMjMyQzQyMDAwQTM0Cis6MTBDRDMwMDAxNDQwMDEzNTI0MDIwMDA3MTAwMDAwRDcwMDAwMDAwMDU1Cis6MTBDRDQwMDAwQzAwM0Y1MDAwMDAwMDAwMTA0MDAxMkQyNDAyMDAwMUEzCis6MTBDRDUwMDA4RjgyMDIxNDNDMDNGRkZGM0MwNDAwMDE4Qzg0NkYxQzkzCis6MTBDRDYwMDAwMDQzMTAyNDM0NDIyNTFGQUY4MjAyMTQyNDAyMDAwODFECis6MTBDRDcwMDAxMDgwMDAwNUFFRTIwNEI4M0MwMjAwMDE4QzQyNkU0NDEzCis6MTBDRDgwMDAxMDQwMDA2NDI0MDIwMDAxOEY4MjAyMjAzQzAzMDAwODRFCis6MTBDRDkwMDAwMDQzMTAyNDEwNDAwMDZBM0MwMjAyMDAxMDAwMDA3ODlBCis6MTBDREEwMDAwMDAwMDAwMDhFRTIwNEI4MjQ0M0ZGRkYyQzYyMDAwNzVECis6MTBDREIwMDAxMDQwMDExNTAwMDMxMDgwM0MwMTAwMDEwMDIyMDgyMUYxCis6MTBDREMwMDA4QzIyNkIzODAwNDAwMDA4MDAwMDAwMDAwQzAwM0RBRkQyCis6MTBDREQwMDAwMDAwMDAwMDNDMDEwMDAxQUMyMDZEOUNBRjgwMDIwNDBCCis6MTBDREUwMDAzQzAxMDAwMjBDMDA0NDgyQUMyMDhGRTAyNDAyMDAwMUQwCis6MTBDREYwMDAzQzAxMDAwMUFDMjI2REI0MjQwMjAwMDIxMDAwMDEwMkNCCis6MTBDRTAwMDBBRUUyMDRCODBDMDA0NTQ3MDAwMDAwMDAzQzAzMDAwMUZFCis6MTBDRTEwMDA4QzYzNkRCNDEwMDAwMDg0MjQwMjAwMDkzQzAyMDAwMkZGCis6MTBDRTIwMDA4QzQyOEZGODMwNDI0MDAwMTA0MDAwMDMzQzAyMDBDOEEyCis6MTBDRTMwMDAxMDAwMDAwMjM0NDIwMUY2MzQ0MjAxRkVBRjgyMDIzODkzCis6MTBDRTQwMDA4RjgzMDA1NDEwMDAwMDhCMjQwMjAwMDQ4RjgzMDA1NDUxCis6MTBDRTUwMDAzQzAyMDAwMThDNDI2RjI4MjQ2M0Q4RjAwMDQzMTAyMzY5Cis6MTBDRTYwMDAyQzQyMjcxMDE0NDAwMEU4MjQwMjAwMDUxMDAwMDA3OTJECis6MTBDRTcwMDAwMDAwMDAwMDhGODIwMjIwM0MwM0Y3MDAwMDQzMTAyNUQxCis6MTBDRTgwMDBBRjgyMDIyMEFGODAwMjA0M0MwMTAwMDIxMDAwMDA3NzU0Cis6MTBDRTkwMDBBQzIwOEZFMDhGODMwMDU0M0MwMjAwMDE4QzQyNkYyODRECis6MTBDRUEwMDAyNDYzRkZGNjAwNDMxMDIzMkM0MjAwMEExNDQwMDBENkVFCis6MTBDRUIwMDAyNDAyMDAwNzEwMDAwMDc4MDAwMDAwMDAwQzAwM0Y1MDIyCis6MTBDRUMwMDAwMDAwMDAwMDEwNDAwMENFMjQwMjAwMDE4RjgyMDIxNEY2Cis6MTBDRUQwMDAzQzAzRkZGRjNDMDQwMDAxOEM4NDZGMUMwMDQzMTAyNEMyCis6MTBDRUUwMDAzNDQyMjUxRkFGODIwMjE0MjQwMjAwMDgxMDgwMDAwRjc0Cis6MTBDRUYwMDBBRUUyMDRCODNDMDIwMDAxOEM0MjZFNDQxNDQwMDAwQkM4Cis6MTBDRjAwMDAwMDAwMDAwMDhGODIwMjIwMzQ0MjAwMDJBRjgyMDIyMDIzCis6MTBDRjEwMDAyNDAyMDAwMTNDMDEwMDAyQUMyMjhGOTAwQzAwNEU5Q0M4Cis6MTBDRjIwMDA4Rjg0MDIyMDEwMDAwMDE2MDAwMDAwMDA4RjgyMDIyMDczCis6MTBDRjMwMDAzQzAzMDAwODAwNDMxMDI0MTQ0MDAwMTEzQzAyMDIwMDhFCis6MTBDRjQwMDAwMjgyQTAyNTI0MDIwMDBFM0MwMTAwMDJBQzIyOEY5MDM4Cis6MTBDRjUwMDAwQzAwNTUxQjAwMDAyMDIxOEY4MjAyMjAzNDQyMDAwMjY5Cis6MTBDRjYwMDAwQzAwM0U2REFGODIwMjIwM0MwNTAwMDE4Q0E1NkQ5ODNGCis6MTBDRjcwMDAwQzAwNTI5QjAwMDAyMDIxMTAwMDAwQTMwMDAwMDAwMEM0Cis6MTBDRjgwMDAzQzAyMDAwMThDNDI2RTQ0MTA0MDAwOUYwMDAwMDAwMEYzCis6MTBDRjkwMDAzQzAyMDAwMThDNDI2RTQwMjQ0MkZGRkYzQzAxMDAwMTM0Cis6MTBDRkEwMDBBQzIyNkU0MDE0NDAwMDk4MjQwMjAwMDIzQzAxMDAwMUIzCis6MTBDRkIwMDBBQzIwNkU0NDNDMDEwMDAxMTAwMDAwOTNBQzIyNkU0MDk2Cis6MTBDRkMwMDA4RUUyMDRCODI0NDNGRkZGMkM2MjAwMDcxMDQwMDA4RTVECis6MTBDRkQwMDAwMDAzMTA4MDNDMDEwMDAxMDAyMjA4MjE4QzIyNkI1OEM0Cis6MTBDRkUwMDAwMDQwMDAwODAwMDAwMDAwM0MwMjAwMDE4QzQyNkRBNERCCis6MTBDRkYwMDAxMDQwMDAxODI0MDIwMDA1MEMwMDQ0ODIwMDAwMDAwMENDCis6MTBEMDAwMDAyNDAyMDAwMkFFRTIwNEI4M0MwMTAwMDExMDAwMDA3RUUwCis6MTBEMDEwMDBBQzIwNkRBNDBDMDA0OTYzMDAwMDAwMDAzQzAzMDAwMTNCCis6MTBEMDIwMDA4QzYzNkRENDI0MDIwMDA2MTQ2MjAwNzcyNDAyMDAwMzhFCis6MTBEMDMwMDAxMDAwMDA3NUFFRTIwNEI4M0MwNTAwMDE4Q0E1NkQ5OEE3Cis6MTBEMDQwMDAzQzA2MDAwMjhDQzY4RkY4MEMwMDUxMDQwMDAwMjAyMTIxCis6MTBEMDUwMDAyNDAyMDAwNTEwMDAwMDZDQUVFMjA0Qjg4RjgyMDIyMEFBCis6MTBEMDYwMDAzQzAzRjcwMDAwNDMxMDI1QUY4MjAyMjA4RjgzMDA1NDU5Cis6MTBEMDcwMDAyNDAyMDAwNkFFRTIwNEI4M0MwMTAwMDExMDAwMDA2Mjg4Cis6MTBEMDgwMDBBQzIzNkYyODhGODIwMjIwM0MwMzAwMDQwMDQzMTAyNDRECis6MTBEMDkwMDAxMDQwMDAwMzI0MDIwMDA3MTAwMDAwNUJBRUUyMDRCODU5Cis6MTBEMEEwMDA4RjgzMDA1NDNDMDIwMDAxOEM0MjZGMjgyNDYzRDhGMDI3Cis6MTBEMEIwMDAwMDQzMTAyMzJDNDIyNzEwMTQ0MDAwMDMyNDAyMDAwMUQ3Cis6MTBEMEMwMDAzQzAxMDAwMUFDMjI2RDlDM0MwMjAwMDI4QzQyOEZGOEI2Cis6MTBEMEQwMDAzMDQyNTAwMDEwNDAwMDRDMDAwMDAwMDA4RjgyMDIyMEJGCis6MTBEMEUwMDAzMDQyODAwMDEwNDAwMDA3MDAwMDAwMDA4RjgyMDIyMEM0Cis6MTBEMEYwMDAzQzAzRkZGRjM0NjM3RkZGMDA0MzEwMjQxMDAwMDA0MjE1Cis6MTBEMTAwMDBBRjgyMDIyMDhGODIwMjIwMzQ0MjgwMDAxMDAwMDAzRTU1Cis6MTBEMTEwMDBBRjgyMDIyMDNDMDUwMDAxOENBNTZEOTgwQzAwNTI5QjRCCis6MTBEMTIwMDAwMDAwMjAyMTBDMDA1NTFCMDAwMDIwMjEzQzAyMDAwMkMxCis6MTBEMTMwMDA4QzQyOEZGMDA0NDEwMDMyMjQwMjAwMDE4RjgyMDIxNERECis6MTBEMTQwMDAzQzAzRkZGRjAwNDMxMDI0MzQ0MjI1MUZBRjgyMDIxNDJBCis6MTBEMTUwMDAyNDAyMDAwOEFFRTIwNEI4OEY4MjAyMjAzNDQyMDAwMkFBCis6MTBEMTYwMDBBRjgyMDIyMDhGODIwMjIwM0MwMzAwMDQwMDQzMTAyNDdGCis6MTBEMTcwMDAxNDQwMDAxNjAwMDAwMDAwM0MwMjAwMDI4QzQyOEZGOEIwCis6MTBEMTgwMDAzMDQyNTAwMDEwNDAwMDBEMDAwMDAwMDA4RjgyMDIyMDRECis6MTBEMTkwMDAzMDQyODAwMDEwNDAwMDA2MDAwMDAwMDA4RjgyMDIyMDE0Cis6MTBEMUEwMDAzQzAzRkZGRjM0NjM3RkZGMTAwMDAwMDMwMDQzMTAyNEEzCis6MTBEMUIwMDA4RjgyMDIyMDM0NDI4MDAwQUY4MjAyMjA4RjgyMDIyMEMwCis6MTBEMUMwMDAzQzAzRjcwMDAwNDMxMDI1QUY4MjAyMjAzQzAyMDAwMTFGCis6MTBEMUQwMDA5NDQyNkYyNjI0NDI5RkJDMkM0MjAwMDQxMDQwMDAwNDVECis6MTBEMUUwMDAyNDA0MDAxODI0MDUwMDAyMEMwMDREREIyNDA2MDAyMDU2Cis6MTBEMUYwMDAwQzAwM0U2RDAwMDAwMDAwMTAwMDAwMDMwMDAwMDAwMDY1Cis6MTBEMjAwMDAzQzAxMDAwMUFDMjI2RDlDOEZCRjAwMTgwM0UwMDAwOEI4Cis6MTBEMjEwMDAyN0JEMDAyMDhGODIwMjAwOEY4MjAyMjA4RjgyMDIyMDkxCis6MTBEMjIwMDAzNDQyMDAwNEFGODIwMjIwOEY4MjAyMDAzQzA1MDAwMURDCis6MTBEMjMwMDA4Q0E1NkQ5ODM0NDIwMDA0QUY4MjAyMDAyNDAyMDAwMkUzCis6MTBEMjQwMDAxMEEyMDA0QjJDQTIwMDAzMTA0MDAwMDUyNDAyMDAwMTk0Cis6MTBEMjUwMDAxMEEyMDAwQTAwMDAwMDAwMTAwMDAwQjEwMDAwMDAwMDUxCis6MTBEMjYwMDAyNDAyMDAwNDEwQTIwMDcyMjQwMjAwMDgxMEEyMDA4NTBCCis6MTBEMjcwMDAzQzAyRjBGRjEwMDAwMEFBMDAwMDAwMDA4RjgzMDA1MDY1Cis6MTBEMjgwMDAzQzAyRjBGRjM0NDJGRkZGM0MwNDAwMDE4Qzg0NkY0MEZECis6MTBEMjkwMDAwMDYyMTgyNDNDMDIwNzAwMDA2MjE4MjUyNDAyMEUwMEQ4Cis6MTBEMkEwMDAyNDg0RkZGQjJDODQwMDAyQUY4MzAwNTBBRjg1MDIwMDcyCis6MTBEMkIwMDBBRjg1MDIyMDE0ODAwMDA2QUY4MjAyMzg4RjgyMDA0NEJFCis6MTBEMkMwMDAzQzAzRkZGRjM0NjMzRjdGMDA0MzEwMjRBRjgyMDA0NEUwCis6MTBEMkQwMDAzQzAzMDAwMThDNjM2RjQwMjQwMjAwMDUxNDYyMDAwNENCCis6MTBEMkUwMDAwMDAwMDAwMDhGODIwMDQ0MzQ0MjUwMDBBRjgyMDA0NEFFCis6MTBEMkYwMDAzQzAyMDAwMThDNDI2RDg4M0MwMzAwMDE4QzYzNkY0MDRFCis6MTBEMzAwMDAzNDQyMDAyMjI0NjNGRkZDMkM2MzAwMDIxNDYwMDAwQ0YyCis6MTBEMzEwMDBBRjgyMDIwMDNDMDIwMDAxOEM0MjZEQUMzQzAzMDAwMTc0Cis6MTBEMzIwMDA4QzYzNkQ5MDNDMDQwMDAxOEM4NDZEOEMzNDQyODAwMEQxCis6MTBEMzMwMDAwMDYyMTgyNTAwNjQxODI1MTAwMDAwMEEzNDYyMDAwMkZCCis6MTBEMzQwMDAzQzAyMDAwMThDNDI2RDkwM0MwMzAwMDE4QzYzNkRBQzhCCis6MTBEMzUwMDAzQzA0MDAwMThDODQ2RDhDMDA0MzEwMjUwMDQ0MTAyNTkyCis6MTBEMzYwMDAzNDQyMDAwMkFGODIwMjIwMTAwMDAwMkYyNDAyMDAwMThDCis6MTBEMzcwMDAyNDAyMEUwMUFGODIwMjM4OEY4MzAwNTAzQzAyRjBGRjdFCis6MTBEMzgwMDAzNDQyRkZGRjNDMDQwMDAxOEM4NDZGMUMwMDYyMTgyNEFGCis6MTBEMzkwMDAzQzAyMEQwMDAwNjIxODI1MjQwMjAwMDFBRjgzMDA1MEZBCis6MTBEM0EwMDBBRjgyMDIwMEFGODIwMjIwMTA4MDAwMDUzQzAzM0YwMEU0Cis6MTBEM0IwMDAzQzAyMDAwMThDNDI2RDgwMTAwMDAwMDQzNDYzMDA3MDU4Cis6MTBEM0MwMDAzQzAyMDAwMThDNDI2RDgwMzQ2MzAwNzIwMDQzMTAyNUUyCis6MTBEM0QwMDBBRjgyMDIwMDNDMDMwMDAxOEM2MzZEODQzQzAyRjcwMEM1Cis6MTBEM0UwMDAwMDYyMTgyNTNDMDIwMDAxOEM0MjZEOTAzQzA0MDAwMTUzCis6MTBEM0YwMDA4Qzg0NkRBQzNDMDUwMDAxOENBNTZGNDAwMDQzMTAyNTZBCis6MTBENDAwMDAwMDQ0MTAyNUFGODIwMjIwMjQwMjAwMDUxNEEyMDAwNjY5Cis6MTBENDEwMDAyNDAyMDAwMThGODIwMDQ0MjQwM0FGRkYwMDQzMTAyNDQ0Cis6MTBENDIwMDBBRjgyMDA0NDI0MDIwMDAxMTAwMDAwM0RBRjgyMDIzOEE4Cis6MTBENDMwMDA4RjgzMDA1MDNDMDJGMEZGMzQ0MkZGRkYzQzA0MDAwMUE4Cis6MTBENDQwMDA4Qzg0NkYxQzAwNjIxODI0M0MwMjBBMDAwMDYyMTgyNUJDCis6MTBENDUwMDAyNDAyMDAwMUFGODMwMDUwQUY4MjAyMDAxMDgwMDAxRTQyCis6MTBENDYwMDBBRjgyMDIyMDNDMDIwMDAxOEM0MjZFNDQxNDQwMDAxQTNDCis6MTBENDcwMDAzQzAzM0YwMDNDMDIwMDAxOEM0MjZEODAxMDAwMDAxQTBBCis6MTBENDgwMDAzNDYzMDBFMDhGODMwMDUwM0MwNDAwMDE4Qzg0NkYxQ0U3Cis6MTBENDkwMDAzNDQyRkZGRjAwNjIxODI0MTA4MDAwMEZBRjgzMDA1MDU5Cis6MTBENEEwMDAzQzAyMDAwMThDNDI2RTQ0MTQ0MDAwMEIzQzA0M0YwMERGCis6MTBENEIwMDAzQzAzMDAwMThDNjM2RDgwMzQ4NDAwRTAyNDAyMDAwMTkxCis6MTBENEMwMDBBRjgyMDIwMEFGODIwMjIwMDA2NDE4MjVBRjgzMDIwMDAxCis6MTBENEQwMDAxMDAwMDAwODNDMDVGNzAwM0MwMjAwMDE4QzQyNkQ4MDAyCis6MTBENEUwMDAzQzAzM0YwMDM0NjMwMEUyMDA0MzEwMjVBRjgyMDIwMDlBCis6MTBENEYwMDAzQzA1RjcwMDM0QTU4MDAwM0MwMzAwMDE4QzYzNkQ4NDdCCis6MTBENTAwMDAzQzAyMDAwMThDNDI2RDkwM0MwNDAwMDE4Qzg0NkRBQ0E3Cis6MTBENTEwMDAwMDY1MTgyNTAwNDMxMDI1MDA0NDEwMjVBRjgyMDIyMDI1Cis6MTBENTIwMDAwM0UwMDAwODAwMDAwMDAwM0MwMzAwMDE4QzYzNkRCNEMwCis6MTBENTMwMDAzQzAyMDAwMThDNDI2REI4MTA2MjAwMDMyNDAyMDAwMjFDCis6MTBENTQwMDAzQzAxMDAwMUFDMjM2REI4MTA2MjAwMUQyQzYyMDAwMzg5Cis6MTBENTUwMDAxMDQwMDAyNTI0MDIwMDAxMTQ2MjAwMjMyNDAyMDAwNDZDCis6MTBENTYwMDAzQzAzMDAwMThDNjM2RDk4MTA2MjAwMDYyNDAyMDAwOEUxCis6MTBENTcwMDAxNDYyMDAwQzNDMDIwMEM4MzQ0MjAxRkIxMDAwMDAwOTk4Cis6MTBENTgwMDBBRjgyMDIzODI0MDIwRTAxQUY4MjAyMzg4RjgyMDA0NDNCCis6MTBENTkwMDAzQzAzRkZGRjM0NjMzRjdGMDA0MzEwMjQzNDQyMDA4MDhDCis6MTBENUEwMDBBRjgyMDA0NDhGODMwMDU0MjQwMjAwMDIzQzAxMDAwMTNBCis6MTBENUIwMDBBQzIyNkRCNDNDMDEwMDAxMTAwMDAwMEJBQzIzNkYyQ0I5Cis6MTBENUMwMDA4RjgzMDA1NDNDMDIwMDAxOEM0MjZGMkMyNDYzRDhGMEZFCis6MTBENUQwMDAwMDQzMTAyMzJDNDIyNzEwMTQ0MDAwMDMyNDAyMDAwOUFBCis6MTBENUUwMDAzQzAxMDAwMUFDMjI2REI0MDNFMDAwMDgwMDAwMDAwMDIzCis6MTBENUYwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyN0JERkZEODcwCis6MTBENjAwMDBBRkIyMDAxODAwODA5MDIxQUZCMzAwMUMwMEEwOTgyMTk5Cis6MTBENjEwMDBBRkIxMDAxNDAwQzA4ODIxQUZCMDAwMTAwMDAwODAyMTFECis6MTBENjIwMDBBRkJGMDAyMEE2MjAwMDAwMEMwMDRENzgyNDA0MDAwMUFDCis6MTBENjMwMDAyNjEwMDAwMTJFMDIwMDIwMTQ0MEZGRkIwMDAwMDAwMDE1Cis6MTBENjQwMDAwQzAwNEQ3ODAwMDAyMDIxMEMwMDRENzgyNDA0MDAwMUNFCis6MTBENjUwMDAwQzAwNEQ3ODI0MDQwMDAxMEMwMDRENzgwMDAwMjAyMUJFCis6MTBENjYwMDAyNDEwMDAxMDAyNTAxMDI0MTA0MDAwMDIwMDAwMjAyMTVECis6MTBENjcwMDAyNDA0MDAwMTBDMDA0RDc4MDAxMDgwNDIxNjAwRkZGQUNGCis6MTBENjgwMDAwMjUwMTAyNDI0MTAwMDEwMDI3MDEwMjQxMDQwMDAwMkQ4Cis6MTBENjkwMDAwMDAwMjAyMTI0MDQwMDAxMEMwMDRENzgwMDEwODA0MjdECis6MTBENkEwMDAxNjAwRkZGQTAyNzAxMDI0MEMwMDREQjkzNDEwODAwMEVGCis6MTBENkIwMDAwQzAwNERCOTAwMDAwMDAwMEMwMDRENTgwMDAwMDAwMEE3Cis6MTBENkMwMDA1MDQwMDAwNTAwMTA4MDQyOTYyMjAwMDAwMDUwMTAyNUI2Cis6MTBENkQwMDBBNjIyMDAwMDAwMTA4MDQyMTYwMEZGRjcwMDAwMDAwMEE0Cis6MTBENkUwMDAwQzAwNERCOTAwMDAwMDAwOEZCRjAwMjA4RkIzMDAxQzVDCis6MTBENkYwMDA4RkIyMDAxODhGQjEwMDE0OEZCMDAwMTAwM0UwMDAwODQzCis6MTBENzAwMDAyN0JEMDAyODI3QkRGRkQ4QUZCMTAwMTQwMDgwODgyMUI1Cis6MTBENzEwMDBBRkIyMDAxODAwQTA5MDIxQUZCMzAwMUMwMEMwOTgyMTQ4Cis6MTBENzIwMDBBRkIwMDAxMDAwMDA4MDIxQUZCRjAwMjAwQzAwNEQ3ODhBCis6MTBENzMwMDAyNDA0MDAwMTI2MTAwMDAxMkUwMjAwMjAxNDQwRkZGQkVCCis6MTBENzQwMDAwMDAwMDAwMDBDMDA0RDc4MDAwMDIwMjEwQzAwNEQ3OEY2Cis6MTBENzUwMDAyNDA0MDAwMTBDMDA0RDc4MDAwMDIwMjEwQzAwNEQ3OEJECis6MTBENzYwMDAyNDA0MDAwMTI0MTAwMDEwMDIzMDEwMjQxMDQwMDAwMjk0Cis6MTBENzcwMDAwMDAwMjAyMTI0MDQwMDAxMEMwMDRENzgwMDEwODA0MjlDCis6MTBENzgwMDAxNjAwRkZGQTAyMzAxMDI0MjQxMDAwMTAwMjUwMTAyNDVBCis6MTBENzkwMDAxMDQwMDAwMjAwMDAyMDIxMjQwNDAwMDEwQzAwNEQ3OEZDCis6MTBEN0EwMDAwMDEwODA0MjE2MDBGRkZBMDI1MDEwMjQwQzAwNEQ3ODQxCis6MTBEN0IwMDAyNDA0MDAwMTBDMDA0RDc4MDAwMDIwMjEzNDEwODAwMDZBCis6MTBEN0MwMDA5NjYyMDAwMDAwNTAxMDI0MTA0MDAwMDIwMDAwMjAyMTRBCis6MTBEN0QwMDAyNDA0MDAwMTBDMDA0RDc4MDAxMDgwNDIxNjAwRkZGODcwCis6MTBEN0UwMDAwMDAwMDAwMDBDMDA0REI5MDAwMDAwMDA4RkJGMDAyMEI5Cis6MTBEN0YwMDA4RkIzMDAxQzhGQjIwMDE4OEZCMTAwMTQ4RkIwMDAxMENGCis6MTBEODAwMDAwM0UwMDAwODI3QkQwMDI4M0MwNDAwMDE4Qzg0NkREMDkzCis6MTBEODEwMDAzQzAyMDAwMThDNDI2RTE4MjdCREZGRDhBRkJGMDAyMDJDCis6MTBEODIwMDBBRkIxMDAxQzEwODIwMDAzQUZCMDAwMTgzQzAxMDAwMTMyCis6MTBEODMwMDBBQzI0NkUxODNDMDMwMDAxOEM2MzZGNDAyNDAyMDAwNTg5Cis6MTBEODQwMDAxNDYyMDAwNTI0ODNGRkZGMEMwMDQ5NjMwMDAwMDAwMDAwCis6MTBEODUwMDAxMDAwMDM0QzAwMDAwMDAwMkM2MjAwMTMxMDQwMDM0OTJDCis6MTBEODYwMDAwMDAzMTA4MDNDMDEwMDAxMDAyMjA4MjE4QzIyNkI4MDAzCis6MTBEODcwMDAwMDQwMDAwODAwMDAwMDAwMEMwMDREQjkwMDAwODAyMUFECis6MTBEODgwMDAzNDAyODAwMEE3QTIwMDEwMjdCMTAwMTAwQzAwNEQ3OEQwCis6MTBEODkwMDAyNDA0MDAwMTI2MTAwMDAxMkUwMjAwMjAxNDQwRkZGQjhBCis6MTBEOEEwMDAwMDAwMDAwMDBDMDA0RDc4MDAwMDIwMjEwQzAwNEQ3ODk1Cis6MTBEOEIwMDAyNDA0MDAwMTBDMDA0RDc4MDAwMDIwMjEwQzAwNEQ3ODVDCis6MTBEOEMwMDAyNDA0MDAwMTI0MTAwMDEwMzIwMjAwMDExMDQwMDAwMjY0Cis6MTBEOEQwMDAwMDAwMjAyMTI0MDQwMDAxMEMwMDRENzgwMDEwODA0MjNCCis6MTBEOEUwMDAxNjAwRkZGQTMyMDIwMDAxMjQxMDAwMTAwQzAwNEQ3OERGCis6MTBEOEYwMDAwMDAwMjAyMTAwMTA4MDQyMTYwMEZGRkMwMDAwMDAwMDA0Cis6MTBEOTAwMDAwQzAwNEQ3ODI0MDQwMDAxMEMwMDRENzgwMDAwMjAyMTBCCis6MTBEOTEwMDAzNDEwODAwMDk2MjIwMDAwMDA1MDEwMjQxMDQwMDAwMkI1Cis6MTBEOTIwMDAwMDAwMjAyMTI0MDQwMDAxMEMwMDRENzgwMDEwODA0MkVBCis6MTBEOTMwMDAxNjAwRkZGODAwMDAwMDAwMEMwMDREQjkwMDAwMDAwMEM4Cis6MTBEOTQwMDAxMDAwMDMwRTI0MDIwMDAyMjdCMTAwMTBBN0EwMDAxMDRGCis6MTBEOTUwMDAwMDAwODAyMTBDMDA0RDc4MjQwNDAwMDEyNjEwMDAwMUY1Cis6MTBEOTYwMDAyRTAyMDAyMDE0NDBGRkZCMDAwMDAwMDAwQzAwNEQ3ODQ4Cis6MTBEOTcwMDAwMDAwMjAyMTBDMDA0RDc4MjQwNDAwMDEwQzAwNEQ3ODlCCis6MTBEOTgwMDAyNDA0MDAwMTBDMDA0RDc4MDAwMDIwMjEyNDEwMDAxMDE4Cis6MTBEOTkwMDAzMjAyMDAwMTEwNDAwMDAyMDAwMDIwMjEyNDA0MDAwMTk2Cis6MTBEOUEwMDAwQzAwNEQ3ODAwMTA4MDQyMTYwMEZGRkEzMjAyMDAwMTkwCis6MTBEOUIwMDAyNDEwMDAxMDBDMDA0RDc4MDAwMDIwMjEwMDEwODA0MjNGCis6MTBEOUMwMDAxNjAwRkZGQzAwMDAwMDAwMEMwMDREQjkzNDEwODAwMDcwCis6MTBEOUQwMDAwQzAwNERCOTAwMDAwMDAwMEMwMDRENTgwMDAwMDAwMDg0Cis6MTBEOUUwMDA1MDQwMDAwNTAwMTA4MDQyOTYyMjAwMDAwMDUwMTAyNTkzCis6MTBEOUYwMDBBNjIyMDAwMDAwMTA4MDQyMTYwMEZGRjcwMDAwMDAwMDgxCis6MTBEQTAwMDAwQzAwNERCOTAwMDAwMDAwOTdBMjAwMTAzMDQyODAwMEM5Cis6MTBEQTEwMDAxNDQwMDJEQzI0MDIwMDAzMTAwMDAyRDgwMDAwMDAwMEMxCis6MTBEQTIwMDAyNDAyMTIwMEE3QTIwMDEwMjdCMTAwMTAwMDAwODAyMURDCis6MTBEQTMwMDAwQzAwNEQ3ODI0MDQwMDAxMjYxMDAwMDEyRTAyMDAyMDY1Cis6MTBEQTQwMDAxNDQwRkZGQjAwMDAwMDAwMEMwMDRENzgwMDAwMjAyMTc2Cis6MTBEQTUwMDAwQzAwNEQ3ODI0MDQwMDAxMEMwMDRENzgwMDAwMjAyMUJBCis6MTBEQTYwMDAwQzAwNEQ3ODI0MDQwMDAxMjQxMDAwMTAzMjAyMDAwMTQzCis6MTBEQTcwMDAxMDQwMDAwMjAwMDAyMDIxMjQwNDAwMDEwQzAwNEQ3ODE5Cis6MTBEQTgwMDAwMDEwODA0MjE2MDBGRkZBMzIwMjAwMDEyNDEwMDAxMDNDCis6MTBEQTkwMDAwQzAwNEQ3ODAwMDAyMDIxMDAxMDgwNDIxNjAwRkZGQzkxCis6MTBEQUEwMDAwMDAwMDAwMDBDMDA0RDc4MjQwNDAwMDEwQzAwNEQ3OEFCCis6MTBEQUIwMDAwMDAwMjAyMTM0MTA4MDAwOTYyMjAwMDAwMDUwMTAyNDI1Cis6MTBEQUMwMDAxMDQwMDAwMjAwMDAyMDIxMjQwNDAwMDEwQzAwNEQ3OEM5Cis6MTBEQUQwMDAwMDEwODA0MjE2MDBGRkY4MDAwMDAwMDAwQzAwNERCOTU1Cis6MTBEQUUwMDAwMDAwMDAwMDhGODMwMDU0MTAwMDAyOTYyNDAyMDAwNEZFCis6MTBEQUYwMDA4RjgzMDA1NDNDMDIwMDAxOEM0MjZGM0MyNDYzRkY5Q0U2Cis6MTBEQjAwMDAwMDQzMTAyMzJDNDIwMDY0MTQ0MDAyOUUyNDAyMDAwMkIxCis6MTBEQjEwMDAzQzAzMDAwMThDNjM2RjQwMTA2MjAyOTcyQzYyMDAwMzhCCis6MTBEQjIwMDAxNDQwMDI5NjI0MDIwMDExMjQwMjAwMDMxMDYyMDAwNTMyCis6MTBEQjMwMDAyNDAyMDAwNDEwNjIwMjkxMjQwMjAwMEYxMDAwMDI4RkUwCis6MTBEQjQwMDAyNDAyMDAxMTEwMDAwMjhEMjQwMjAwMDUyNDAyMDAxNDlBCis6MTBEQjUwMDBBN0EyMDAxMDI3QjEwMDEwMDAwMDgwMjEwQzAwNEQ3ODEyCis6MTBEQjYwMDAyNDA0MDAwMTI2MTAwMDAxMkUwMjAwMjAxNDQwRkZGQkI3Cis6MTBEQjcwMDAwMDAwMDAwMDBDMDA0RDc4MDAwMDIwMjEwQzAwNEQ3OEMyCis6MTBEQjgwMDAyNDA0MDAwMTBDMDA0RDc4MDAwMDIwMjEwQzAwNEQ3ODg5Cis6MTBEQjkwMDAyNDA0MDAwMTI0MTAwMDEwMzIwMjAwMDExMDQwMDAwMjkxCis6MTBEQkEwMDAwMDAwMjAyMTI0MDQwMDAxMEMwMDRENzgwMDEwODA0MjY4Cis6MTBEQkIwMDAxNjAwRkZGQTMyMDIwMDAxMjQxMDAwMTAzMjAyMDAxMjk3Cis6MTBEQkMwMDAxMDQwMDAwMjAwMDAyMDIxMjQwNDAwMDEwQzAwNEQ3OEM4Cis6MTBEQkQwMDAwMDEwODA0MjE2MDBGRkZBMzIwMjAwMTIwQzAwNEQ3ODRECis6MTBEQkUwMDAyNDA0MDAwMTBDMDA0RDc4MDAwMDIwMjEzNDEwODAwMDM2Cis6MTBEQkYwMDA5NjIyMDAwMDAwNTAxMDI0MTA0MDAwMDIwMDAwMjAyMTU2Cis6MTBEQzAwMDAyNDA0MDAwMTBDMDA0RDc4MDAxMDgwNDIxNjAwRkZGODNCCis6MTBEQzEwMDAwMDAwMDAwMDBDMDA0REI5MDAwMDAwMDA4RjgzMDA1NDhDCis6MTBEQzIwMDAxMDAwMDI0ODI0MDIwMDA2OEY4MzAwNTQzQzAyMDAwMUM5Cis6MTBEQzMwMDA4QzQyNkYzQzI0NjNGRjlDMDA0MzEwMjMyQzQyMDA2NDAxCis6MTBEQzQwMDAxNDQwMDI1MDI0MDIwMDA3MTAwMDAyNEMwMDAwMDAwMEEzCis6MTBEQzUwMDAyNDAyMDAwNkE3QTIwMDEwMjdCMTAwMTAwMDAwODAyMUI2Cis6MTBEQzYwMDAwQzAwNEQ3ODI0MDQwMDAxMjYxMDAwMDEyRTAyMDAyMDMzCis6MTBEQzcwMDAxNDQwRkZGQjAwMDAwMDAwMEMwMDRENzgwMDAwMjAyMTQ0Cis6MTBEQzgwMDAwQzAwNEQ3ODI0MDQwMDAxMEMwMDRENzgwMDAwMjAyMTg4Cis6MTBEQzkwMDAwQzAwNEQ3ODI0MDQwMDAxMjQxMDAwMTAzMjAyMDAwMTExCis6MTBEQ0EwMDAxMDQwMDAwMjAwMDAyMDIxMjQwNDAwMDEwQzAwNEQ3OEU3Cis6MTBEQ0IwMDAwMDEwODA0MjE2MDBGRkZBMzIwMjAwMDEyNDEwMDAxMDBBCis6MTBEQ0MwMDAzMjAyMDAxMzEwNDAwMDAyMDAwMDIwMjEyNDA0MDAwMTUxCis6MTBEQ0QwMDAwQzAwNEQ3ODAwMTA4MDQyMTYwMEZGRkEzMjAyMDAxMzRCCis6MTBEQ0UwMDAwQzAwNEQ3ODI0MDQwMDAxMEMwMDRENzgwMDAwMjAyMTI4Cis6MTBEQ0YwMDAzNDEwODAwMDk2MjIwMDAwMDA1MDEwMjQxMDQwMDAwMkQyCis6MTBERDAwMDAwMDAwMjAyMTI0MDQwMDAxMEMwMDRENzgwMDEwODA0MjA2Cis6MTBERDEwMDAxNjAwRkZGODAwMDAwMDAwMEMwMDREQjkwMDAwMDAwMEU0Cis6MTBERDIwMDA4RjgzMDA1NDEwMDAwMjA3MjQwMjAwMDg4RjgzMDA1NEUwCis6MTBERDMwMDAzQzAyMDAwMThDNDI2RjNDMjQ2M0ZGOUMwMDQzMTAyMzkzCis6MTBERDQwMDAyQzQyMDA2NDE0NDAwMjBGMjQwMjAwMDkxMDAwMDIwQjUwCis6MTBERDUwMDAwMDAwMDAwMDI3QjEwMDEwQTdBMDAwMTAwMDAwODAyMUUzCis6MTBERDYwMDAwQzAwNEQ3ODI0MDQwMDAxMjYxMDAwMDEyRTAyMDAyMDMyCis6MTBERDcwMDAxNDQwRkZGQjAwMDAwMDAwMEMwMDRENzgwMDAwMjAyMTQzCis6MTBERDgwMDAwQzAwNEQ3ODI0MDQwMDAxMEMwMDRENzgyNDA0MDAwMTlGCis6MTBERDkwMDAwQzAwNEQ3ODAwMDAyMDIxMjQxMDAwMTAzMjAyMDAwMUY4Cis6MTBEREEwMDAxMDQwMDAwMjAwMDAyMDIxMjQwNDAwMDEwQzAwNEQ3OEU2Cis6MTBEREIwMDAwMDEwODA0MjE2MDBGRkZBMzIwMjAwMDEyNDEwMDAxMDA5Cis6MTBEREMwMDAzMjAyMDAxODEwNDAwMDAyMDAwMDIwMjEyNDA0MDAwMTRCCis6MTBEREQwMDAwQzAwNEQ3ODAwMTA4MDQyMTYwMEZGRkEzMjAyMDAxODQ1Cis6MTBEREUwMDAwQzAwNERCOTM0MTA4MDAwMEMwMDREQjkwMDAwMDAwMDRCCis6MTBEREYwMDAwQzAwNEQ1ODAwMDAwMDAwNTA0MDAwMDUwMDEwODA0MjBCCis6MTBERTAwMDA5NjIyMDAwMDAwNTAxMDI1QTYyMjAwMDAwMDEwODA0MjNCCis6MTBERTEwMDAxNjAwRkZGNzAwMDAwMDAwMEMwMDREQjkwMDAwODAyMTQzCis6MTBERTIwMDA5N0EyMDAxMDI3QjEwMDEwMzQ0MjAwMDFBN0EyMDAxMEYxCis6MTBERTMwMDAwQzAwNEQ3ODI0MDQwMDAxMjYxMDAwMDEyRTAyMDAyMDYxCis6MTBERTQwMDAxNDQwRkZGQjAwMDAwMDAwMEMwMDRENzgwMDAwMjAyMTcyCis6MTBERTUwMDAwQzAwNEQ3ODI0MDQwMDAxMEMwMDRENzgwMDAwMjAyMUI2Cis6MTBERTYwMDAwQzAwNEQ3ODI0MDQwMDAxMjQxMDAwMTAzMjAyMDAwMTNGCis6MTBERTcwMDAxMDQwMDAwMjAwMDAyMDIxMjQwNDAwMDEwQzAwNEQ3ODE1Cis6MTBERTgwMDAwMDEwODA0MjE2MDBGRkZBMzIwMjAwMDEyNDEwMDAxMDM4Cis6MTBERTkwMDAzMjAyMDAxODEwNDAwMDAyMDAwMDIwMjEyNDA0MDAwMTdBCis6MTBERUEwMDAwQzAwNEQ3ODAwMTA4MDQyMTYwMEZGRkEzMjAyMDAxODc0Cis6MTBERUIwMDAwQzAwNEQ3ODI0MDQwMDAxMEMwMDRENzgwMDAwMjAyMTU2Cis6MTBERUMwMDAzNDEwODAwMDk2MjIwMDAwMDA1MDEwMjQxMDQwMDAwMjAwCis6MTBERUQwMDAwMDAwMjAyMTI0MDQwMDAxMEMwMDRENzgwMDEwODA0MjM1Cis6MTBERUUwMDAxNjAwRkZGODAwMDAwMDAwMEMwMDREQjkwMDAwMDAwMDEzCis6MTBERUYwMDA4RjgzMDA1NDEwMDAwMTkzMjQwMjAwMEE4RjgzMDA1NDgyCis6MTBERjAwMDAzQzAyMDAwMThDNDI2RjNDMjQ2M0ZGOUMwMDQzMTAyM0MxCis6MTBERjEwMDAyQzQyMDA2NDE0NDAwMTlCMjQwMjAwMEIxMDAwMDE5NzY2Cis6MTBERjIwMDAwMDAwMDAwMDI3QjEwMDEwQTdBMDAwMTAwMDAwODAyMTExCis6MTBERjMwMDAwQzAwNEQ3ODI0MDQwMDAxMjYxMDAwMDEyRTAyMDAyMDYwCis6MTBERjQwMDAxNDQwRkZGQjAwMDAwMDAwMEMwMDRENzgwMDAwMjAyMTcxCis6MTBERjUwMDAwQzAwNEQ3ODI0MDQwMDAxMEMwMDRENzgyNDA0MDAwMUNECis6MTBERjYwMDAwQzAwNEQ3ODAwMDAyMDIxMjQxMDAwMTAzMjAyMDAwMTI2Cis6MTBERjcwMDAxMDQwMDAwMjAwMDAyMDIxMjQwNDAwMDEwQzAwNEQ3ODE0Cis6MTBERjgwMDAwMDEwODA0MjE2MDBGRkZBMzIwMjAwMDEyNDEwMDAxMDM3Cis6MTBERjkwMDAzMjAyMDAxNzEwNDAwMDAyMDAwMDIwMjEyNDA0MDAwMTdBCis6MTBERkEwMDAwQzAwNEQ3ODAwMTA4MDQyMTYwMEZGRkEzMjAyMDAxNzc0Cis6MTBERkIwMDAwQzAwNERCOTM0MTA4MDAwMEMwMDREQjkwMDAwMDAwMDc5Cis6MTBERkMwMDAwQzAwNEQ1ODAwMDAwMDAwNTA0MDAwMDUwMDEwODA0MjM5Cis6MTBERkQwMDA5NjIyMDAwMDAwNTAxMDI1QTYyMjAwMDAwMDEwODA0MjZBCis6MTBERkUwMDAxNjAwRkZGNzAwMDAwMDAwMEMwMDREQjkwMDAwODAyMTcyCis6MTBERkYwMDA5N0EyMDAxMDI3QjEwMDEwMzQ0MjA3MDBBN0EyMDAxMDFBCis6MTBFMDAwMDAwQzAwNEQ3ODI0MDQwMDAxMjYxMDAwMDEyRTAyMDAyMDhGCis6MTBFMDEwMDAxNDQwRkZGQjAwMDAwMDAwMEMwMDRENzgwMDAwMjAyMUEwCis6MTBFMDIwMDAwQzAwNEQ3ODI0MDQwMDAxMEMwMDRENzgwMDAwMjAyMUU0Cis6MTBFMDMwMDAwQzAwNEQ3ODI0MDQwMDAxMjQxMDAwMTAzMjAyMDAwMTZECis6MTBFMDQwMDAxMDQwMDAwMjAwMDAyMDIxMjQwNDAwMDEwQzAwNEQ3ODQzCis6MTBFMDUwMDAwMDEwODA0MjE2MDBGRkZBMzIwMjAwMDEyNDEwMDAxMDY2Cis6MTBFMDYwMDAzMjAyMDAxNzEwNDAwMDAyMDAwMDIwMjEyNDA0MDAwMUE5Cis6MTBFMDcwMDAwQzAwNEQ3ODAwMTA4MDQyMTYwMEZGRkEzMjAyMDAxN0EzCis6MTBFMDgwMDAwQzAwNEQ3ODI0MDQwMDAxMEMwMDRENzgwMDAwMjAyMTg0Cis6MTBFMDkwMDAzNDEwODAwMDk2MjIwMDAwMDA1MDEwMjQxMDQwMDAwMjJFCis6MTBFMEEwMDAwMDAwMjAyMTI0MDQwMDAxMEMwMDRENzgwMDEwODA0MjYzCis6MTBFMEIwMDAxNjAwRkZGODAwMDAwMDAwMEMwMDREQjkwMDAwMDAwMDQxCis6MTBFMEMwMDA4RjgzMDA1NDEwMDAwMTFGMjQwMjAwMEM4RjgzMDA1NDIyCis6MTBFMEQwMDAzQzAyMDAwMThDNDI2RjNDMjQ2M0ZGOUMwMDQzMTAyM0YwCis6MTBFMEUwMDAyQzQyMDA2NDE0NDAwMTI3MjQwMjAwMTIxMDAwMDEyMzc2Cis6MTBFMEYwMDAwMDAwMDAwMDI3QjEwMDEwQTdBMDAwMTAwMDAwODAyMTQwCis6MTBFMTAwMDAwQzAwNEQ3ODI0MDQwMDAxMjYxMDAwMDEyRTAyMDAyMDhFCis6MTBFMTEwMDAxNDQwRkZGQjAwMDAwMDAwMEMwMDRENzgwMDAwMjAyMTlGCis6MTBFMTIwMDAwQzAwNEQ3ODI0MDQwMDAxMEMwMDRENzgyNDA0MDAwMUZCCis6MTBFMTMwMDAwQzAwNEQ3ODAwMDAyMDIxMjQxMDAwMTAzMjAyMDAwMTU0Cis6MTBFMTQwMDAxMDQwMDAwMjAwMDAyMDIxMjQwNDAwMDEwQzAwNEQ3ODQyCis6MTBFMTUwMDAwMDEwODA0MjE2MDBGRkZBMzIwMjAwMDEyNDEwMDAxMDY1Cis6MTBFMTYwMDAzMjAyMDAxNDEwNDAwMDAyMDAwMDIwMjEyNDA0MDAwMUFCCis6MTBFMTcwMDAwQzAwNEQ3ODAwMTA4MDQyMTYwMEZGRkEzMjAyMDAxNEE1Cis6MTBFMTgwMDAwQzAwNERCOTM0MTA4MDAwMEMwMDREQjkwMDAwMDAwMEE3Cis6MTBFMTkwMDAwQzAwNEQ1ODAwMDAwMDAwNTA0MDAwMDUwMDEwODA0MjY3Cis6MTBFMUEwMDA5NjIyMDAwMDAwNTAxMDI1QTYyMjAwMDAwMDEwODA0Mjk4Cis6MTBFMUIwMDAxNjAwRkZGNzAwMDAwMDAwMEMwMDREQjkwMDAwODAyMUEwCis6MTBFMUMwMDA5N0EyMDAxMDI3QjEwMDEwMzQ0MjAwMTBBN0EyMDAxMDNGCis6MTBFMUQwMDAwQzAwNEQ3ODI0MDQwMDAxMjYxMDAwMDEyRTAyMDAyMEJFCis6MTBFMUUwMDAxNDQwRkZGQjAwMDAwMDAwMEMwMDRENzgwMDAwMjAyMUNGCis6MTBFMUYwMDAwQzAwNEQ3ODI0MDQwMDAxMEMwMDRENzgwMDAwMjAyMTEzCis6MTBFMjAwMDAwQzAwNEQ3ODI0MDQwMDAxMjQxMDAwMTAzMjAyMDAwMTlCCis6MTBFMjEwMDAxMDQwMDAwMjAwMDAyMDIxMjQwNDAwMDEwQzAwNEQ3ODcxCis6MTBFMjIwMDAwMDEwODA0MjE2MDBGRkZBMzIwMjAwMDEyNDEwMDAxMDk0Cis6MTBFMjMwMDAzMjAyMDAxNDEwNDAwMDAyMDAwMDIwMjEyNDA0MDAwMURBCis6MTBFMjQwMDAwQzAwNEQ3ODAwMTA4MDQyMTYwMEZGRkEzMjAyMDAxNEQ0Cis6MTBFMjUwMDAwQzAwNEQ3ODI0MDQwMDAxMEMwMDRENzgwMDAwMjAyMUIyCis6MTBFMjYwMDAzNDEwODAwMDk2MjIwMDAwMDA1MDEwMjQxMDQwMDAwMjVDCis6MTBFMjcwMDAwMDAwMjAyMTI0MDQwMDAxMEMwMDRENzgwMDEwODA0MjkxCis6MTBFMjgwMDAxNjAwRkZGODAwMDAwMDAwMEMwMDREQjkwMDAwMDAwMDZGCis6MTBFMjkwMDA4RjgzMDA1NDEwMDAwMEFCMjQwMjAwMTM4RjgzMDA1NEJFCis6MTBFMkEwMDAzQzAyMDAwMThDNDI2RjNDMjQ2M0ZGOUMwMDQzMTAyMzFFCis6MTBFMkIwMDAyQzQyMDA2NDE0NDAwMEIzMjQwMjAwMEQxMDAwMDBBRjkzCis6MTBFMkMwMDAwMDAwMDAwMDI3QjEwMDEwQTdBMDAwMTAwMDAwODAyMTZFCis6MTBFMkQwMDAwQzAwNEQ3ODI0MDQwMDAxMjYxMDAwMDEyRTAyMDAyMEJECis6MTBFMkUwMDAxNDQwRkZGQjAwMDAwMDAwMEMwMDRENzgwMDAwMjAyMUNFCis6MTBFMkYwMDAwQzAwNEQ3ODI0MDQwMDAxMEMwMDRENzgyNDA0MDAwMTJBCis6MTBFMzAwMDAwQzAwNEQ3ODAwMDAyMDIxMjQxMDAwMTAzMjAyMDAwMTgyCis6MTBFMzEwMDAxMDQwMDAwMjAwMDAyMDIxMjQwNDAwMDEwQzAwNEQ3ODcwCis6MTBFMzIwMDAwMDEwODA0MjE2MDBGRkZBMzIwMjAwMDEyNDEwMDAxMDkzCis6MTBFMzMwMDAzMjAyMDAxODEwNDAwMDAyMDAwMDIwMjEyNDA0MDAwMUQ1Cis6MTBFMzQwMDAwQzAwNEQ3ODAwMTA4MDQyMTYwMEZGRkEzMjAyMDAxOENGCis6MTBFMzUwMDAwQzAwNERCOTM0MTA4MDAwMEMwMDREQjkwMDAwMDAwMEQ1Cis6MTBFMzYwMDAwQzAwNEQ1ODAwMDAwMDAwNTA0MDAwMDUwMDEwODA0Mjk1Cis6MTBFMzcwMDA5NjIyMDAwMDAwNTAxMDI1QTYyMjAwMDAwMDEwODA0MkM2Cis6MTBFMzgwMDAxNjAwRkZGNzAwMDAwMDAwMEMwMDREQjkwMDAwODAyMUNFCis6MTBFMzkwMDA5N0EyMDAxMDI3QjEwMDEwMzA0MkZGRkVBN0EyMDAxMDg0Cis6MTBFM0EwMDAwQzAwNEQ3ODI0MDQwMDAxMjYxMDAwMDEyRTAyMDAyMEVDCis6MTBFM0IwMDAxNDQwRkZGQjAwMDAwMDAwMEMwMDRENzgwMDAwMjAyMUZECis6MTBFM0MwMDAwQzAwNEQ3ODI0MDQwMDAxMEMwMDRENzgwMDAwMjAyMTQxCis6MTBFM0QwMDAwQzAwNEQ3ODI0MDQwMDAxMjQxMDAwMTAzMjAyMDAwMUNBCis6MTBFM0UwMDAxMDQwMDAwMjAwMDAyMDIxMjQwNDAwMDEwQzAwNEQ3OEEwCis6MTBFM0YwMDAwMDEwODA0MjE2MDBGRkZBMzIwMjAwMDEyNDEwMDAxMEMzCis6MTBFNDAwMDAzMjAyMDAxODEwNDAwMDAyMDAwMDIwMjEyNDA0MDAwMTA0Cis6MTBFNDEwMDAwQzAwNEQ3ODAwMTA4MDQyMTYwMEZGRkEzMjAyMDAxOEZFCis6MTBFNDIwMDAwQzAwNEQ3ODI0MDQwMDAxMEMwMDRENzgwMDAwMjAyMUUwCis6MTBFNDMwMDAzNDEwODAwMDk2MjIwMDAwMDA1MDEwMjQxMDQwMDAwMjhBCis6MTBFNDQwMDAwMDAwMjAyMTI0MDQwMDAxMEMwMDRENzgwMDEwODA0MkJGCis6MTBFNDUwMDAxNjAwRkZGODAwMDAwMDAwMEMwMDREQjkwMDAwMDAwMDlECis6MTBFNDYwMDA4RjgzMDA1NDEwMDAwMDM3MjQwMjAwMEUyNDAyMDg0MDVECis6MTBFNDcwMDBBN0EyMDAxMDI3QjEwMDEwMDAwMDgwMjEwQzAwNEQ3OEU5Cis6MTBFNDgwMDAyNDA0MDAwMTI2MTAwMDAxMkUwMjAwMjAxNDQwRkZGQjhFCis6MTBFNDkwMDAwMDAwMDAwMDBDMDA0RDc4MDAwMDIwMjEwQzAwNEQ3ODk5Cis6MTBFNEEwMDAyNDA0MDAwMTBDMDA0RDc4MDAwMDIwMjEwQzAwNEQ3ODYwCis6MTBFNEIwMDAyNDA0MDAwMTI0MTAwMDEwMzIwMjAwMDExMDQwMDAwMjY4Cis6MTBFNEMwMDAwMDAwMjAyMTI0MDQwMDAxMEMwMDRENzgwMDEwODA0MjNGCis6MTBFNEQwMDAxNjAwRkZGQTMyMDIwMDAxMjQxMDAwMTAzMjAyMDAxMzZECis6MTBFNEUwMDAxMDQwMDAwMjAwMDAyMDIxMjQwNDAwMDEwQzAwNEQ3ODlGCis6MTBFNEYwMDAwMDEwODA0MjE2MDBGRkZBMzIwMjAwMTMwQzAwNEQ3ODIzCis6MTBFNTAwMDAyNDA0MDAwMTBDMDA0RDc4MDAwMDIwMjEzNDEwODAwMDBDCis6MTBFNTEwMDA5NjIyMDAwMDAwNTAxMDI0MTA0MDAwMDIwMDAwMjAyMTJDCis6MTBFNTIwMDAyNDA0MDAwMTBDMDA0RDc4MDAxMDgwNDIxNjAwRkZGODEyCis6MTBFNTMwMDAwMDAwMDAwMDBDMDA0REI5MDAwMDAwMDA4RjgzMDA1NDYzCis6MTBFNTQwMDAyNDAyMDAxMDNDMDEwMDAxQUMyMjZERDAzQzAxMDAwMTBFCis6MTBFNTUwMDAxMDAwMDAwQ0FDMjM2RjNDOEY4MzAwNTQzQzAyMDAwMTgwCis6MTBFNTYwMDA4QzQyNkYzQzI0NjNGRjlDMDA0MzEwMjMyQzQyMDA2NEM4Cis6MTBFNTcwMDAxNDQwMDAwNDAwMDAwMDAwMjQwMjAwMTEzQzAxMDAwMUNFCis6MTBFNTgwMDBBQzIyNkREMDhGQkYwMDIwOEZCMTAwMUM4RkIwMDAxODVGCis6MTBFNTkwMDAwM0UwMDAwODI3QkQwMDI4M0MwMzAwMDE4QzYzNkQ5ODUwCis6MTBFNUEwMDAyN0JERkZDODI0MDIwMDAyQUZCRjAwMzRBRkIyMDAzMDY1Cis6MTBFNUIwMDBBRkIxMDAyQzE0NjIwMDA0QUZCMDAwMjgzQzEyMDAwMjdFCis6MTBFNUMwMDAxMDAwMDAwMzhFNTI4RkY4M0MxMjAwMDI4RTUyOEZGQzE2Cis6MTBFNUQwMDAzQzAzMDAwMThDNjM2REQ0M0MwMjAwMDE4QzQyNkUxQzM0Cis6MTBFNUUwMDA1MDYyMDAwNDI0NjNGRkZGM0MwMTAwMDFBQzIzNkUxQzU5Cis6MTBFNUYwMDAyNDYzRkZGRjJDNjIwMDA2MTA0MDAzNzcwMDAzMTA4MEE1Cis6MTBFNjAwMDAzQzAxMDAwMTAwMjIwODIxOEMyMjZCRDgwMDQwMDAwODQ4Cis6MTBFNjEwMDAwMDAwMDAwMDAwMDAyMDIxMDAwMDI4MjEwQzAwNEREQjNDCis6MTBFNjIwMDAzNDA2ODAwMDI0MDQwMDEwMjQwNTAwMDIyNDA2MDAwMkExCis6MTBFNjMwMDAyNDAyMDAwMjBDMDA0RERCQTdBMjAwMTgyNDAyMDAwMkY1Cis6MTBFNjQwMDAzQzAxMDAwMTEwMDAwMzY0QUMyMjZERDQyN0IxMDAxODE2Cis6MTBFNjUwMDBBN0EwMDAxODAwMDA4MDIxMEMwMDRENzgyNDA0MDAwMUMwCis6MTBFNjYwMDAyNjEwMDAwMTJFMDIwMDIwMTQ0MEZGRkIwMDAwMDAwMEQ1Cis6MTBFNjcwMDAwQzAwNEQ3ODAwMDAyMDIxMEMwMDRENzgyNDA0MDAwMThFCis6MTBFNjgwMDAwQzAwNEQ3ODI0MDQwMDAxMEMwMDRENzgwMDAwMjAyMTdFCis6MTBFNjkwMDAyNDEwMDAxMDMyMDIwMDAxMTA0MDAwMDIwMDAwMjAyMTZFCis6MTBFNkEwMDAyNDA0MDAwMTBDMDA0RDc4MDAxMDgwNDIxNjAwRkZGQThGCis6MTBFNkIwMDAzMjAyMDAwMTI0MTAwMDEwMEMwMDRENzgwMDAwMjAyMUNGCis6MTBFNkMwMDAwMDEwODA0MjE2MDBGRkZDMDAwMDAwMDAwQzAwNERCOTU1Cis6MTBFNkQwMDAzNDEwODAwMDBDMDA0REI5MDAwMDAwMDAwQzAwNEQ1OEIzCis6MTBFNkUwMDAwMDAwMDAwMDUwNDAwMDA1MDAxMDgwNDI5NjIyMDAwMDBCCis6MTBFNkYwMDAwMDUwMTAyNUE2MjIwMDAwMDAxMDgwNDIxNjAwRkZGN0VGCis6MTBFNzAwMDAwMDAwMDAwMDBDMDA0REI5MDAwMDAwMDA5N0EyMDAxOEE2Cis6MTBFNzEwMDAzMDQyODAwMDE0NDAwMDA0MjQwMjAwMDMzQzAxMDAwMTQ4Cis6MTBFNzIwMDBBQzIyNkRENDI0MDIwMDAzM0MwMTAwMDExMDAwMDMyQTM2Cis6MTBFNzMwMDBBQzIyNkRENDI0MDQwMDEwMjQwNTAwMDIyNDA2MDAwMjNCCis6MTBFNzQwMDAyNDAyMDAwMjBDMDA0RERCQTdBMjAwMTgzQzAzMDAwMUNDCis6MTBFNzUwMDA4QzYzNkUyMDI0MDIwMDAxMTQ2MjAxRTEwMDAwODAyMTFDCis6MTBFNzYwMDAyN0IxMDAxOEE3QTAwMDE4MEMwMDRENzgyNDA0MDAwMTYwCis6MTBFNzcwMDAyNjEwMDAwMTJFMDIwMDIwMTQ0MEZGRkIwMDAwMDAwMEM0Cis6MTBFNzgwMDAwQzAwNEQ3ODAwMDAyMDIxMEMwMDRENzgyNDA0MDAwMTdECis6MTBFNzkwMDAwQzAwNEQ3ODI0MDQwMDAxMEMwMDRENzgwMDAwMjAyMTZECis6MTBFN0EwMDAyNDEwMDAxMDMyMDIwMDAxMTA0MDAwMDIwMDAwMjAyMTVECis6MTBFN0IwMDAyNDA0MDAwMTBDMDA0RDc4MDAxMDgwNDIxNjAwRkZGQTdFCis6MTBFN0MwMDAzMjAyMDAwMTI0MTAwMDEwMzIwMjAwMTgxMDQwMDAwMjMyCis6MTBFN0QwMDAwMDAwMjAyMTI0MDQwMDAxMEMwMDRENzgwMDEwODA0MjJDCis6MTBFN0UwMDAxNjAwRkZGQTMyMDIwMDE4MEMwMDREQjkzNDEwODAwMEY4Cis6MTBFN0YwMDAwQzAwNERCOTAwMDAwMDAwMEMwMDRENTgwMDAwMDAwMDU2Cis6MTBFODAwMDA1MDQwMDAwNTAwMTA4MDQyOTYyMjAwMDAwMDUwMTAyNTY0Cis6MTBFODEwMDBBNjIyMDAwMDAwMTA4MDQyMTYwMEZGRjcwMDAwMDAwMDUyCis6MTBFODIwMDAwQzAwNERCOTAwMDA4MDIxMjdCMTAwMThBN0EwMDAxOEU2Cis6MTBFODMwMDAwQzAwNEQ3ODI0MDQwMDAxMjYxMDAwMDEyRTAyMDAyMDU3Cis6MTBFODQwMDAxNDQwRkZGQjAwMDAwMDAwMEMwMDRENzgwMDAwMjAyMTY4Cis6MTBFODUwMDAwQzAwNEQ3ODI0MDQwMDAxMEMwMDRENzgyNDA0MDAwMUM0Cis6MTBFODYwMDAwQzAwNEQ3ODAwMDAyMDIxMjQxMDAwMTAzMjAyMDAwMTFECis6MTBFODcwMDAxMDQwMDAwMjAwMDAyMDIxMjQwNDAwMDEwQzAwNEQ3ODBCCis6MTBFODgwMDAwMDEwODA0MjE2MDBGRkZBMzIwMjAwMDEyNDEwMDAxMDJFCis6MTBFODkwMDAzMjAyMDAxODEwNDAwMDAyMDAwMDIwMjEyNDA0MDAwMTcwCis6MTBFOEEwMDAwQzAwNEQ3ODAwMTA4MDQyMTYwMEZGRkEzMjAyMDAxODZBCis6MTBFOEIwMDAwQzAwNERCOTM0MTA4MDAwMEMwMDREQjkwMDAwMDAwMDcwCis6MTBFOEMwMDAwQzAwNEQ1ODAwMDAwMDAwNTA0MDAwMDUwMDEwODA0MjMwCis6MTBFOEQwMDA5NjIyMDAwMDAwNTAxMDI1QTYyMjAwMDAwMDEwODA0MjYxCis6MTBFOEUwMDAxNjAwRkZGNzAwMDAwMDAwMEMwMDREQjkwMDAwODAyMTY5Cis6MTBFOEYwMDAyNDA0MDAxODAwMDAyODIxMEMwMDREREIyNDA2MDQwNDI5Cis6MTBFOTAwMDBBN0EwMDAxQTBDMDA0RDc4MjQwNDAwMDEyNjEwMDAwMTc1Cis6MTBFOTEwMDAyRTAyMDAyMDE0NDBGRkZCMDAwMDAwMDAwQzAwNEQ3ODg4Cis6MTBFOTIwMDAwMDAwMjAyMTBDMDA0RDc4MjQwNDAwMDEwQzAwNEQ3OERCCis6MTBFOTMwMDAyNDA0MDAwMTBDMDA0RDc4MDAwMDIwMjEyNDEwMDAxMDU4Cis6MTBFOTQwMDAzMjAyMDAwMTEwNDAwMDAyMDAwMDIwMjEyNDA0MDAwMUQ2Cis6MTBFOTUwMDAwQzAwNEQ3ODAwMTA4MDQyMTYwMEZGRkEzMjAyMDAwMUQwCis6MTBFOTYwMDAyNDEwMDAxMDMyMDIwMDE4MTA0MDAwMDIwMDAwMjAyMTg0Cis6MTBFOTcwMDAyNDA0MDAwMTBDMDA0RDc4MDAxMDgwNDIxNjAwRkZGQUJDCis6MTBFOTgwMDAzMjAyMDAxODBDMDA0REI5MzQxMDgwMDAwQzAwNERCOTUzCis6MTBFOTkwMDAwMDAwMDAwMDBDMDA0RDU4MDAwMDAwMDA1MDQwMDAwNTMxCis6MTBFOUEwMDAwMDEwODA0Mjk3QTIwMDFBMDA1MDEwMjVBN0EyMDAxQTVBCis6MTBFOUIwMDAwMDEwODA0MjE2MDBGRkY3MDAwMDAwMDAwQzAwNERCOTY3Cis6MTBFOUMwMDAwMDAwODAyMUE3QTAwMDFBMEMwMDRENzgyNDA0MDAwMTRCCis6MTBFOUQwMDAyNjEwMDAwMTJFMDIwMDIwMTQ0MEZGRkIwMDAwMDAwMDYyCis6MTBFOUUwMDAwQzAwNEQ3ODAwMDAyMDIxMEMwMDRENzgyNDA0MDAwMTFCCis6MTBFOUYwMDAwQzAwNEQ3ODI0MDQwMDAxMEMwMDRENzgwMDAwMjAyMTBCCis6MTBFQTAwMDAyNDEwMDAxMDMyMDIwMDAxMTA0MDAwMDIwMDAwMjAyMUZBCis6MTBFQTEwMDAyNDA0MDAwMTBDMDA0RDc4MDAxMDgwNDIxNjAwRkZGQTFCCis6MTBFQTIwMDAzMjAyMDAwMTI0MTAwMDEwMzIwMjAwMTgxMDQwMDAwMkNGCis6MTBFQTMwMDAwMDAwMjAyMTI0MDQwMDAxMEMwMDRENzgwMDEwODA0MkM5Cis6MTBFQTQwMDAxNjAwRkZGQTMyMDIwMDE4MEMwMDREQjkzNDEwODAwMDk1Cis6MTBFQTUwMDAwQzAwNERCOTAwMDAwMDAwMEMwMDRENTgwMDAwMDAwMEYzCis6MTBFQTYwMDA1MDQwMDAwNTAwMTA4MDQyOTdBMjAwMUEwMDUwMTAyNTY3Cis6MTBFQTcwMDBBN0EyMDAxQTAwMTA4MDQyMTYwMEZGRjcwMDAwMDAwMDU1Cis6MTBFQTgwMDAwQzAwNERCOTAwMDA4MDIxQTdBMDAwMUMwQzAwNEQ3ODlGCis6MTBFQTkwMDAyNDA0MDAwMTI2MTAwMDAxMkUwMjAwMjAxNDQwRkZGQjc4Cis6MTBFQUEwMDAwMDAwMDAwMDBDMDA0RDc4MDAwMDIwMjEwQzAwNEQ3ODgzCis6MTBFQUIwMDAyNDA0MDAwMTBDMDA0RDc4MjQwNDAwMDEwQzAwNEQ3ODYyCis6MTBFQUMwMDAwMDAwMjAyMTI0MTAwMDEwMEMwMDRENzgwMDAwMjAyMUFGCis6MTBFQUQwMDAwMDEwODA0MjE2MDBGRkZDMDAwMDAwMDAyNDEwMDAxMDBGCis6MTBFQUUwMDAzMjAyMDAxRTEwNDAwMDAyMDAwMDIwMjEyNDA0MDAwMTE4Cis6MTBFQUYwMDAwQzAwNEQ3ODAwMTA4MDQyMTYwMEZGRkEzMjAyMDAxRTEyCis6MTBFQjAwMDAwQzAwNERCOTM0MTA4MDAwMEMwMDREQjkwMDAwMDAwMDFECis6MTBFQjEwMDAwQzAwNEQ1ODAwMDAwMDAwNTA0MDAwMDUwMDEwODA0MkRECis6MTBFQjIwMDA5N0EyMDAxQzAwNTAxMDI1QTdBMjAwMUMwMDEwODA0MkQ0Cis6MTBFQjMwMDAxNjAwRkZGNzAwMDAwMDAwMEMwMDREQjkwMDAwODAyMTE2Cis6MTBFQjQwMDBBN0EwMDAxQzBDMDA0RDc4MjQwNDAwMDEyNjEwMDAwMTMxCis6MTBFQjUwMDAyRTAyMDAyMDE0NDBGRkZCMDAwMDAwMDAwQzAwNEQ3ODQ2Cis6MTBFQjYwMDAwMDAwMjAyMTBDMDA0RDc4MjQwNDAwMDEwQzAwNEQ3ODk5Cis6MTBFQjcwMDAyNDA0MDAwMTBDMDA0RDc4MDAwMDIwMjEyNDEwMDAxMDE2Cis6MTBFQjgwMDAwQzAwNEQ3ODAwMDAyMDIxMDAxMDgwNDIxNjAwRkZGQzkwCis6MTBFQjkwMDAwMDAwMDAwMDI0MTAwMDEwMzIwMjAwMUUxMDQwMDAwMjhECis6MTBFQkEwMDAwMDAwMjAyMTI0MDQwMDAxMEMwMDRENzgwMDEwODA0MjU4Cis6MTBFQkIwMDAxNjAwRkZGQTMyMDIwMDFFMEMwMDREQjkzNDEwODAwMDFFCis6MTBFQkMwMDAwQzAwNERCOTAwMDAwMDAwMEMwMDRENTgwMDAwMDAwMDgyCis6MTBFQkQwMDA1MDQwMDAwNTAwMTA4MDQyOTdBMjAwMUMwMDUwMTAyNUY0Cis6MTBFQkUwMDBBN0EyMDAxQzAwMTA4MDQyMTYwMEZGRjcwMDAwMDAwMEUyCis6MTBFQkYwMDAwQzAwNERCOTAwMDA4MDIxMjQwMjAwMDJBN0EyMDAxRUQzCis6MTBFQzAwMDAwQzAwNEQ3ODI0MDQwMDAxMjYxMDAwMDEyRTAyMDAyMDgzCis6MTBFQzEwMDAxNDQwRkZGQjAwMDAwMDAwMEMwMDRENzgwMDAwMjAyMTk0Cis6MTBFQzIwMDAwQzAwNEQ3ODI0MDQwMDAxMEMwMDRENzgwMDAwMjAyMUQ4Cis6MTBFQzMwMDAwQzAwNEQ3ODI0MDQwMDAxMjQxMDAwMTAwQzAwNEQ3OEM1Cis6MTBFQzQwMDAwMDAwMjAyMTAwMTA4MDQyMTYwMEZGRkMwMDAwMDAwMEEwCis6MTBFQzUwMDAyNDEwMDAxMDMyMDIwMDFFMTA0MDAwMDIwMDAwMjAyMThCCis6MTBFQzYwMDAyNDA0MDAwMTBDMDA0RDc4MDAxMDgwNDIxNjAwRkZGQUM5Cis6MTBFQzcwMDAzMjAyMDAxRTBDMDA0RDc4MjQwNDAwMDEwQzAwNEQ3ODc3Cis6MTBFQzgwMDAwMDAwMjAyMTM0MTA4MDAwOTdBMjAwMUUwMDUwMTAyNEE0Cis6MTBFQzkwMDAxMDQwMDAwMjAwMDAyMDIxMjQwNDAwMDEwQzAwNEQ3OEU3Cis6MTBFQ0EwMDAwMDEwODA0MjE2MDBGRkY4MDAwMDAwMDAwQzAwNERCOTczCis6MTBFQ0IwMDAwMDAwODAyMUE3QTAwMDIwMEMwMDRENzgyNDA0MDAwMTUyCis6MTBFQ0MwMDAyNjEwMDAwMTJFMDIwMDIwMTQ0MEZGRkIwMDAwMDAwMDZGCis6MTBFQ0QwMDAwQzAwNEQ3ODAwMDAyMDIxMEMwMDRENzgyNDA0MDAwMTI4Cis6MTBFQ0UwMDAwQzAwNEQ3ODI0MDQwMDAxMEMwMDRENzgwMDAwMjAyMTE4Cis6MTBFQ0YwMDAyNDEwMDAxMDBDMDA0RDc4MDAwMDIwMjEwMDEwODA0MkVDCis6MTBFRDAwMDAxNjAwRkZGQzAwMDAwMDAwMjQxMDAwMTAzMjAyMDAxRTVDCis6MTBFRDEwMDAxMDQwMDAwMjAwMDAyMDIxMjQwNDAwMDEwQzAwNEQ3ODY2Cis6MTBFRDIwMDAwMDEwODA0MjE2MDBGRkZBMzIwMjAwMUUwQzAwNERCOTlFCis6MTBFRDMwMDAzNDEwODAwMDBDMDA0REI5MDAwMDAwMDAwQzAwNEQ1ODRDCis6MTBFRDQwMDAwMDAwMDAwMDUwNDAwMDA1MDAxMDgwNDI5N0EyMDAyMDAzCis6MTBFRDUwMDAwMDUwMTAyNUE3QTIwMDIwMDAxMDgwNDIxNjAwRkZGN0U3Cis6MTBFRDYwMDAwMDAwMDAwMDBDMDA0REI5MDAwMDgwMjFBN0EwMDAyMDg5Cis6MTBFRDcwMDAwQzAwNEQ3ODI0MDQwMDAxMjYxMDAwMDEyRTAyMDAyMDEyCis6MTBFRDgwMDAxNDQwRkZGQjAwMDAwMDAwMEMwMDRENzgwMDAwMjAyMTIzCis6MTBFRDkwMDAwQzAwNEQ3ODI0MDQwMDAxMEMwMDRENzgyNDA0MDAwMTdGCis6MTBFREEwMDAwQzAwNEQ3ODAwMDAyMDIxMjQxMDAwMTAwQzAwNEQ3ODNDCis6MTBFREIwMDAwMDAwMjAyMTAwMTA4MDQyMTYwMEZGRkMwMDAwMDAwMDJGCis6MTBFREMwMDAyNDEwMDAxMDMyMDIwMDFFMTA0MDAwMDIwMDAwMjAyMTFBCis6MTBFREQwMDAyNDA0MDAwMTBDMDA0RDc4MDAxMDgwNDIxNjAwRkZGQTU4Cis6MTBFREUwMDAzMjAyMDAxRTBDMDA0REI5MzQxMDgwMDAwQzAwNERCOUU5Cis6MTBFREYwMDAwMDAwMDAwMDBDMDA0RDU4MDAwMDAwMDA1MDQwMDAwNUNECis6MTBFRTAwMDAwMDEwODA0Mjk3QTIwMDIwMDA1MDEwMjVBN0EyMDAyMEU5Cis6MTBFRTEwMDAwMDEwODA0MjE2MDBGRkY3MDAwMDAwMDAwQzAwNERCOTAyCis6MTBFRTIwMDAwMDAwODAyMUE3QTAwMDIyMEMwMDRENzgyNDA0MDAwMURFCis6MTBFRTMwMDAyNjEwMDAwMTJFMDIwMDIwMTQ0MEZGRkIwMDAwMDAwMEZECis6MTBFRTQwMDAwQzAwNEQ3ODAwMDAyMDIxMEMwMDRENzgyNDA0MDAwMUI2Cis6MTBFRTUwMDAwQzAwNEQ3ODAwMDAyMDIxMEMwMDRENzgyNDA0MDAwMUE2Cis6MTBFRTYwMDAyNDEwMDAxMDBDMDA0RDc4MDAwMDIwMjEwMDEwODA0MjdBCis6MTBFRTcwMDAxNjAwRkZGQzAwMDAwMDAwMjQxMDAwMTAwQzAwNEQ3ODZDCis6MTBFRTgwMDAwMDAwMjAyMTAwMTA4MDQyMTYwMEZGRkMwMDAwMDAwMDVFCis6MTBFRTkwMDAwQzAwNEQ3ODI0MDQwMDAxMEMwMDRENzgwMDAwMjAyMTY2Cis6MTBFRUEwMDAzNDEwODAwMDk3QTIwMDIyMDA1MDEwMjQxMDQwMDAwMjZECis6MTBFRUIwMDAwMDAwMjAyMTI0MDQwMDAxMEMwMDRENzgwMDEwODA0MjQ1Cis6MTBFRUMwMDAxNjAwRkZGODAwMDAwMDAwMEMwMDREQjkwMDAwMDAwMDIzCis6MTBFRUQwMDAyNDA0MDAxODI0MDUwMDAyMEMwMDREREIyNDA2MDAwNDY1Cis6MTBFRUUwMDAzQzEwMDAwMThFMTA2RTI0MjQwMjAwMDExNjAyMDExRDQ4Cis6MTBFRUYwMDAwMDAwMDAwMDNDMDIwMDAxOTQ0MjZGMjYzQzAxMDAwMTJBCis6MTBFRjAwMDBBQzIwNkUyNDI0NDI5RkJDMkM0MjAwMDQxMDQwMDAwQzE0Cis6MTBFRjEwMDAyNDA0MDAwOTI0MDUwMDAxMEMwMDREREIyNDA2MDQwMDM0Cis6MTBFRjIwMDAyNDA0MDAxODI0MDUwMDAxMEMwMDREREIyNDA2MDAyMEY5Cis6MTBFRjMwMDAyNDA0MDAxODI0MDUwMDAxMEMwMDREREIyNDA2MjAwMEU5Cis6MTBFRjQwMDAzQzAyNDAwMDAyNDIxMDI0MTA0MDAxMjMzQzAyMjAwMEY5Cis6MTBFRjUwMDAwMjQyMTAyNDEwNDAwMDA0MDAwMDAwMDAzQzAxMDAwMUE3Cis6MTBFRjYwMDAxMDAwMDAwM0FDMzA2RjFDM0MwMTAwMDFBQzIwNkYxQzkyCis6MTBFRjcwMDAzQzAzMDAwMThDNjM2RjM0MjQwMjAwMDUxNDYyMDBGOTI1Cis6MTBFRjgwMDAwMDAwMDAwMDNDMDIwMDAxOEM0MjZGMUMxMDQwMDA2NzMyCis6MTBFRjkwMDAzQzAyMDAwNDAyNDIxMDI0MTA0MDAwMTFBN0EwMDAxOEY3Cis6MTBFRkEwMDAzQzAyMDAwODAyNDIxMDI0MTA0MDAwMDIyNDAyMDIwMDI5Cis6MTBFRkIwMDBBN0EyMDAxODNDMDIwMDEwMDI0MjEwMjQxMDQwMDAwNEQ2Cis6MTBFRkMwMDAwMDAwMDAwMDk3QTIwMDE4MzQ0MjAxMDBBN0EyMDAxODE4Cis6MTBFRkQwMDA5N0E2MDAxODI0MDQwMDA5MTAwMDAwMDQwMDAwMjgyMTRFCis6MTBFRkUwMDAyNDA0MDAwOTAwMDAyODIxMDAwMDMwMjEwQzAwNEREQjIyCis6MTBFRkYwMDAwMDAwMDAwMDI0MDIwMDAxQTdBMjAwMUEzQzAyMDAwODQxCis6MTBGMDAwMDAwMjQyMTAyNDEwNDAwMDBDM0MwMjAwMDIwMjQyMTAyNDc0Cis6MTBGMDEwMDAxMDQwMDAwMjI0MDIwMTAxQTdBMjAwMUEzQzAyMDAwMUQ0Cis6MTBGMDIwMDAwMjQyMTAyNDEwNDAwMDA1M0MwMjAwMTA5N0EyMDAxQTcyCis6MTBGMDMwMDAzNDQyMDA0MEE3QTIwMDFBM0MwMjAwMTAwMjQyMTAyNEYxCis6MTBGMDQwMDAxMDQwMDAwRTNDMDIwMDAyMDI0MjEwMjQxMDQwMDAwNTU1Cis6MTBGMDUwMDAzQzAyMDAwMTk3QTIwMDFBMzQ0MjAwODBBN0EyMDAxQUM1Cis6MTBGMDYwMDAzQzAyMDAwMTAyNDIxMDI0MTA0MDAwMDUzQzAzMDBBMEI1Cis6MTBGMDcwMDA5N0EyMDAxQTM0NDIwMDIwQTdBMjAwMUEzQzAzMDBBMDY1Cis6MTBGMDgwMDAwMjQzMTAyNDU0NDMwMDA0M0MwMjAwMjA5N0EyMDAxQUJCCis6MTBGMDkwMDAxMDAwMDAwQzM0NDIwNDAwMDI0MjEwMjQ1MDQwMDAwNENFCis6MTBGMEEwMDAzQzAyMDA4MDk3QTIwMDFBMTAwMDAwMDYzNDQyMDgwMEJCCis6MTBGMEIwMDAwMjQyMTAyNDEwNDAwMDA0MDAwMDAwMDA5N0EyMDAxQTMxCis6MTBGMEMwMDAzNDQyMEMwMEE3QTIwMDFBOTdBNjAwMUEyNDA0MDAwNEQ4Cis6MTBGMEQwMDAwQzAwNEREQjAwMDAyODIxM0MwMjAwMDQwMjQyMTAyNEY5Cis6MTBGMEUwMDAxMDQwMDAwNEE3QTAwMDFDMzI0MjUwMDAxNDQwMDAwNDRECis6MTBGMEYwMDAwMDAwMDAwMDMyNDI0MDAwMTA0MDAwMDUwMDAwMjAyMUM2Cis6MTBGMTAwMDAwQzAwNENGOTAyNDAyMDIxMTAwMDAwOTYwMDAwMDAwMDg1Cis6MTBGMTEwMDA5N0E2MDAxQzAwMDAyODIxMzRDNjEyMDAwQzAwNEREQjBECis6MTBGMTIwMDBBN0E2MDAxQzEwMDAwMDhGMDAwMDAwMDAwMjQyMTAyNDVGCis6MTBGMTMwMDAxMDQwMDAwNEE3QTAwMDE4MzI0MjUwMDAxNDQwMDAwNDAwCis6MTBGMTQwMDAwMDAwMDAwMDMyNDI0MDAwMTA0MDAwMDUzQzAyMDAxMDY4Cis6MTBGMTUwMDAwQzAwNENGOTAyNDAyMDIxMTAwMDAwMTlBN0EwMDAxQTUxCis6MTBGMTYwMDAwMjQyMTAyNDEwNDAwMDA0MDAwMDAwMDA5N0EyMDAxODgyCis6MTBGMTcwMDAxMDAwMDAwNEE3QTIwMDE4OTdBMjAwMTgzNDQyMDEwMDUyCis6MTBGMTgwMDBBN0EyMDAxODNDMDIwMDAxMDI0MjEwMjQxMDQwMDAwNDEzCis6MTBGMTkwMDAwMDAwMDAwMDk3QTIwMDE4MTAwMDAwMDRBN0EyMDAxOEE5Cis6MTBGMUEwMDA5N0EyMDAxODM0NDIyMDAwQTdBMjAwMTg5N0E2MDAxOEMyCis6MTBGMUIwMDAwMDAwMjAyMTBDMDA0RERCMDAwMDI4MjFBN0EwMDAxQTMwCis6MTBGMUMwMDAwMDAwODAyMTBDMDA0RDc4MjQwNDAwMDEyNjEwMDAwMTZECis6MTBGMUQwMDAyRTAyMDAyMDE0NDBGRkZCMDAwMDAwMDAwQzAwNEQ3OEMwCis6MTBGMUUwMDAwMDAwMjAyMTBDMDA0RDc4MjQwNDAwMDEwQzAwNEQ3ODEzCis6MTBGMUYwMDAyNDA0MDAwMTBDMDA0RDc4MDAwMDIwMjEyNDEwMDAxMDkwCis6MTBGMjAwMDAzMjAyMDAwMTEwNDAwMDAyMDAwMDIwMjEyNDA0MDAwMTBECis6MTBGMjEwMDAwQzAwNEQ3ODAwMTA4MDQyMTYwMEZGRkEzMjAyMDAwMTA3Cis6MTBGMjIwMDAyNDEwMDAxMDBDMDA0RDc4MDAwMDIwMjEwMDEwODA0MkI2Cis6MTBGMjMwMDAxNjAwRkZGQzAwMDAwMDAwMEMwMDREQjkzNDEwODAwMEU3Cis6MTBGMjQwMDAwQzAwNERCOTAwMDAwMDAwMEMwMDRENTgwMDAwMDAwMEZCCis6MTBGMjUwMDA1MDQwMDAwNTAwMTA4MDQyOTdBMjAwMUEwMDUwMTAyNTZGCis6MTBGMjYwMDBBN0EyMDAxQTAwMTA4MDQyMTYwMEZGRjcwMDAwMDAwMDVECis6MTBGMjcwMDAwQzAwNERCOTAwMDA4MDIxQTdBMDAwMUEwQzAwNEQ3OEE5Cis6MTBGMjgwMDAyNDA0MDAwMTI2MTAwMDAxMkUwMjAwMjAxNDQwRkZGQjgwCis6MTBGMjkwMDAwMDAwMDAwMDBDMDA0RDc4MDAwMDIwMjEwQzAwNEQ3ODhCCis6MTBGMkEwMDAyNDA0MDAwMTBDMDA0RDc4MjQwNDAwMDEwQzAwNEQ3ODZBCis6MTBGMkIwMDAwMDAwMjAyMTI0MTAwMDEwMzIwMjAwMDExMDQwMDAwMjQyCis6MTBGMkMwMDAwMDAwMjAyMTI0MDQwMDAxMEMwMDRENzgwMDEwODA0MjMxCis6MTBGMkQwMDAxNjAwRkZGQTMyMDIwMDAxMjQxMDAwMTAwQzAwNEQ3OEQ1Cis6MTBGMkUwMDAwMDAwMjAyMTAwMTA4MDQyMTYwMEZGRkMwMDAwMDAwMEZBCis6MTBGMkYwMDAwQzAwNERCOTM0MTA4MDAwMEMwMDREQjkwMDAwMDAwMDI2Cis6MTBGMzAwMDAwQzAwNEQ1ODAwMDAwMDAwNTA0MDAwMDUwMDEwODA0MkU1Cis6MTBGMzEwMDA5N0EyMDAxQTAwNTAxMDI1QTdBMjAwMUEwMDEwODA0MkUwCis6MTBGMzIwMDAxNjAwRkZGNzAwMDAwMDAwMEMwMDREQjkwMDAwMDAwMEJGCis6MTBGMzMwMDAzQzA0MDAwMTI0ODQ2QkNDOTdBNjAwMTg5N0E3MDAxQTAwCis6MTBGMzQwMDAzQzAyMDAwMThDNDI2RDk4M0MwMzAwMDE4QzYzNkYxQ0YxCis6MTBGMzUwMDAzQzA1MDAwRDM0QTUwMjA1QUZBMjAwMTAwQzAwMkIzQkFDCis6MTBGMzYwMDBBRkEzMDAxNDhGODMwMDU0MjQwMjAwMDQzQzAxMDAwMTY5Cis6MTBGMzcwMDBBQzIyNkRENDNDMDEwMDAxMTAwMDAwMTdBQzIzNkYzOEEzCis6MTBGMzgwMDA4RjgzMDA1NDNDMDIwMDAxOEM0MjZGMzgyNDYzRkY5QzQxCis6MTBGMzkwMDAwMDQzMTAyMzJDNDIwMDY0MTQ0MDAwMEYwMDAwMDAwMEMyCis6MTBGM0EwMDA4RjgyMDIyMDI0MDMwMDA1M0MwMTAwMDFBQzIzNkRENEIwCis6MTBGM0IwMDAzQzAzRjcwMDAwNDMxMDI1MTAwMDAwMDdBRjgyMDIyMDM1Cis6MTBGM0MwMDAyNDAyMDAwNjNDMDEwMDAxQUMyMjZERDQyNDAyMDAxMThECis6MTBGM0QwMDAzQzAxMDAwMUFDMjI2REQwOEZCRjAwMzQ4RkIyMDAzMEYxCis6MTBGM0UwMDA4RkIxMDAyQzhGQjAwMDI4MDNFMDAwMDgyN0JEMDAzODQzCis6MTBGM0YwMDAyN0JERkZEOEFGQjAwMDE4MDA4MDgwMjFBRkIxMDAxQzNFCis6MTBGNDAwMDAwMDAwODgyMTMyMDI0MDAwMTA0MDAwMTNBRkJGMDAyMEVFCis6MTBGNDEwMDAzQzAyMDAxMDAyMDIxMDI0MkM0MjAwMDEwMDAyMTAyM0MyCis6MTBGNDIwMDAzMDQzNDEwMDNDMDIwMDAxMDIwMjEwMjQxNDQwMDAwNjU3Cis6MTBGNDMwMDAzNDcxNDAwMDNDMDIwMDAyMDIwMjEwMjQxNDQwMDAwMjE5Cis6MTBGNDQwMDAzNDcxNjAwMDM0NzE0MDQwMDAwMDIwMjEwMDAwMjgyMTA4Cis6MTBGNDUwMDAxMDAwMDAzNjAyMjAzMDIxMzIwMjEwMDAxMDQwMDAzNTJBCis6MTBGNDYwMDAwMDAwMjAyMTAwMDAyODIxMEMwMDREREIyNDA2MDA0MDc0Cis6MTBGNDcwMDAyNDA0MDAxODAwMDAyODIxMEMwMDREREIyNDA2MEMwMDk5Cis6MTBGNDgwMDAyNDA0MDAxNzAwMDAyODIxMEMwMDREREIyNDA2MDQwMDkyCis6MTBGNDkwMDAyNDA0MDAxNjAwMDAyODIxMEMwMDREREIyNDA2MDAwNjgxCis6MTBGNEEwMDAyNDA0MDAxNzAwMDAyODIxMEMwMDREREIyNDA2MjUwMDUxCis6MTBGNEIwMDAyNDA0MDAxNjAwMDAyODIxMEMwMDREREIyNDA2MDAwNjYxCis6MTBGNEMwMDAyNDA0MDAxNzAwMDAyODIxMEMwMDREREIyNDA2NDYwMDEwCis6MTBGNEQwMDAyNDA0MDAxNjAwMDAyODIxMEMwMDREREIyNDA2MDAwNjQxCis6MTBGNEUwMDAyNDA0MDAxNzAwMDAyODIxMEMwMDREREIyNDA2NjcwMENGCis6MTBGNEYwMDAyNDA0MDAxNjAwMDAyODIxMEMwMDREREIyNDA2MDAwNjIxCis6MTBGNTAwMDAyNDA0MDAxRjAwMDAyODIxMEMwMDREREIyNDA2MDAxMEZECis6MTBGNTEwMDAyNDA0MDAwOTAwMDAyODIxMEMwMDREREIyNDA2MTUwMEZFCis6MTBGNTIwMDAyNDA0MDAwOTAwMDAyODIxMjQwNjFEMDAwQzAwNEREQkU2Cis6MTBGNTMwMDAwMDAwMDAwMDNDMDQwMDAxMjQ4NDZCRjAzQzA1MDAwRTM4Cis6MTBGNTQwMDAzNEE1MDEwMDAyMDAzMDIxMDIyMDM4MjFBRkEwMDAxMEI0Cis6MTBGNTUwMDAwQzAwMkIzQkFGQTAwMDE0OEZCRjAwMjA4RkIxMDAxQzBDCis6MTBGNTYwMDA4RkIwMDAxODAzRTAwMDA4MjdCRDAwMjg4Rjg1MDA0NEY1Cis6MTBGNTcwMDA4RjgyMDA0NDNDMDMwMDAxMDA0MzEwMjUzQzAzMDAwODM3Cis6MTBGNTgwMDBBRjgyMDA0NDhGODQwMDU0OEY4MjAwNTQwMEEzMjgyNDRCCis6MTBGNTkwMDAxMDAwMDAwMjI0ODQwMDAxOEY4MjAwNTQwMDgyMTAyMzk2Cis6MTBGNUEwMDAyQzQyMDAwMjE0NDBGRkZDMDAwMDAwMDA4RjgyMDA0NDQ3Cis6MTBGNUIwMDAzQzAzRkZGRTM0NjNGRkZGMDA0MzEwMjRBRjgyMDA0NDhFCis6MTBGNUMwMDA4RjgzMDA1NDhGODIwMDU0MTAwMDAwMDIyNDYzMDAwMUQ2Cis6MTBGNUQwMDA4RjgyMDA1NDAwNjIxMDIzMkM0MjAwMDIxNDQwRkZGQzcyCis6MTBGNUUwMDAwMDAwMDAwMDAzRTAwMDA4MDBBMDEwMjE4RjgzMDA0NDA5Cis6MTBGNUYwMDAzQzAyRkZGMDM0NDJGRkZGMDAwNDI0ODAwMDYyMTgyNDI0Cis6MTBGNjAwMDAzQzAyMDAwMjAwODIyMDI1MDA2NDE4MjVBRjgzMDA0NERDCis6MTBGNjEwMDA4RjgyMDA0NDNDMDNGRkZFMzQ2M0ZGRkYwMDQzMTAyNDRECis6MTBGNjIwMDBBRjgyMDA0NDhGODMwMDU0OEY4MjAwNTQxMDAwMDAwMjg4Cis6MTBGNjMwMDAyNDYzMDAwMThGODIwMDU0MDA2MjEwMjMyQzQyMDAwMkQ4Cis6MTBGNjQwMDAxNDQwRkZGQzAwMDAwMDAwOEY4MjAwNDQzQzAzMDAwMUQ2Cis6MTBGNjUwMDAwMDQzMTAyNUFGODIwMDQ0OEY4MzAwNTQ4RjgyMDA1NEYyCis6MTBGNjYwMDAxMDAwMDAwMjI0NjMwMDAxOEY4MjAwNTQwMDYyMTAyMzA2Cis6MTBGNjcwMDAyQzQyMDAwMjE0NDBGRkZDMDAwMDAwMDAwM0UwMDAwOEUwCis6MTBGNjgwMDAwMDAwMDAwMDhGODIwMDQ0MjQwM0ZGN0YwMDQzMTAyNDA5Cis6MTBGNjkwMDBBRjgyMDA0NDhGODMwMDU0OEY4MjAwNTQxMDAwMDAwMjE4Cis6MTBGNkEwMDAyNDYzMDAwMThGODIwMDU0MDA2MjEwMjMyQzQyMDAwMjY4Cis6MTBGNkIwMDAxNDQwRkZGQzAwMDAwMDAwOEY4MjAwNDQzNDQyMDA4MEIwCis6MTBGNkMwMDBBRjgyMDA0NDhGODMwMDU0OEY4MjAwNTQxMDAwMDAwMkU4Cis6MTBGNkQwMDAyNDYzMDAwMThGODIwMDU0MDA2MjEwMjMyQzQyMDAwMjM4Cis6MTBGNkUwMDAxNDQwRkZGQzAwMDAwMDAwMDNFMDAwMDgwMDAwMDAwMEUwCis6MTBGNkYwMDA4RjgyMDA0NDNDMDNGRkYwMzQ2M0ZGRkYwMDQzMTAyNDdCCis6MTBGNzAwMDBBRjgyMDA0NDhGODIwMDQ0M0MwMzAwMDEwMDQzMTAyNTc3Cis6MTBGNzEwMDBBRjgyMDA0NDhGODMwMDU0OEY4MjAwNTQxMDAwMDAwMjk3Cis6MTBGNzIwMDAyNDYzMDAwMThGODIwMDU0MDA2MjEwMjMyQzQyMDAwMkU3Cis6MTBGNzMwMDAxNDQwRkZGQzAwMDAwMDAwOEY4MjAwNDQzQzAzRkZGRUU5Cis6MTBGNzQwMDAzNDYzRkZGRjAwNDMxMDI0QUY4MjAwNDQ4RjgzMDA1NEQyCis6MTBGNzUwMDA4RjgyMDA1NDEwMDAwMDAyMjQ2MzAwMDE4RjgyMDA1NDQ1Cis6MTBGNzYwMDAwMDYyMTAyMzJDNDIwMDAyMTQ0MEZGRkMwMDAwMDAwMDQ1Cis6MTBGNzcwMDAwM0UwMDAwODAwMDAwMDAwMjdCREZGQzhBRkIzMDAyNDZECis6MTBGNzgwMDAwMDgwOTgyMUFGQkUwMDJDMDBBMEYwMjFBRkIyMDAyMDc1Cis6MTBGNzkwMDAwMEMwOTAyMTMzQzJGRkZGQUZCRjAwMzBBRkI1MDAyOERCCis6MTBGN0EwMDBBRkIxMDAxQ0FGQjAwMDE4MTQ0MDAwMzRBN0IyMDAxMDc1Cis6MTBGN0IwMDAzMjcxRkZGRjI3QjIwMDEwMDAwMDgwMjEwQzAwNEQ3ODRECis6MTBGN0MwMDAyNDA0MDAwMTI2MTAwMDAxMkUwMjAwMjAxNDQwRkZGQjNCCis6MTBGN0QwMDAwMDAwMDAwMDBDMDA0RDc4MDAwMDIwMjEwQzAwNEQ3ODQ2Cis6MTBGN0UwMDAyNDA0MDAwMTBDMDA0RDc4MDAwMDIwMjEwQzAwNEQ3ODBECis6MTBGN0YwMDAyNDA0MDAwMTI0MTAwMDEwMzIwMjAwMDExMDQwMDAwMjE1Cis6MTBGODAwMDAwMDAwMjAyMTI0MDQwMDAxMEMwMDRENzgwMDEwODA0MkVCCis6MTBGODEwMDAxNjAwRkZGQTMyMDIwMDAxMjQxMDAwMTAwMjMwMTAyNEZBCis6MTBGODIwMDAxMDQwMDAwMjAwMDAyMDIxMjQwNDAwMDEwQzAwNEQ3ODRCCis6MTBGODMwMDAwMDEwODA0MjE2MDBGRkZBMDIzMDEwMjQwQzAwNEQ3OEIwCis6MTBGODQwMDAyNDA0MDAwMTBDMDA0RDc4MDAwMDIwMjEzNDEwODAwMEI5Cis6MTBGODUwMDA5NjQyMDAwMDAwNTAxMDI0MTA0MDAwMDIwMDAwMjAyMUI5Cis6MTBGODYwMDAyNDA0MDAwMTBDMDA0RDc4MDAxMDgwNDIxMjAwMDA3NTQ1Cis6MTBGODcwMDAwMDAwMDAwMDEwMDBGRkY2MDAwMDAwMDAzMjc1RkZGRkRFCis6MTBGODgwMDAyN0IxMDAxMEE3QTAwMDEwMDAwMDgwMjEwQzAwNEQ3OEM3Cis6MTBGODkwMDAyNDA0MDAwMTI2MTAwMDAxMkUwMjAwMjAxNDQwRkZGQjZBCis6MTBGOEEwMDAwMDAwMDAwMDBDMDA0RDc4MDAwMDIwMjEwQzAwNEQ3ODc1Cis6MTBGOEIwMDAyNDA0MDAwMTBDMDA0RDc4MjQwNDAwMDEwQzAwNEQ3ODU0Cis6MTBGOEMwMDAwMDAwMjAyMTI0MTAwMDEwMzIwMjAwMDExMDQwMDAwMjJDCis6MTBGOEQwMDAwMDAwMjAyMTI0MDQwMDAxMEMwMDRENzgwMDEwODA0MjFCCis6MTBGOEUwMDAxNjAwRkZGQTMyMDIwMDAxMjQxMDAwMTAwMkIwMTAyNEFBCis6MTBGOEYwMDAxMDQwMDAwMjAwMDAyMDIxMjQwNDAwMDEwQzAwNEQ3ODdCCis6MTBGOTAwMDAwMDEwODA0MjE2MDBGRkZBMDJCMDEwMjQwQzAwNERCOTFFCis6MTBGOTEwMDAzNDEwODAwMDBDMDA0REI5MDAwMDAwMDAwQzAwNEQ1ODYwCis6MTBGOTIwMDAwMDAwMDAwMDUwNDAwMDA1MDAxMDgwNDI5NjIyMDAwMEI4Cis6MTBGOTMwMDAwMDUwMTAyNUE2MjIwMDAwMDAxMDgwNDIxNjAwRkZGNzlDCis6MTBGOTQwMDAwMDAwMDAwMDBDMDA0REI5MDAwMDAwMDAzM0M1RkZGRkFGCis6MTBGOTUwMDAyNDAyMDAwMTU0QTIwMDA0MjQwMjAwMDI5N0EyMDAxMDE1Cis6MTBGOTYwMDAxMDAwMDAwNjAwNTIxMDI1MTRBMjAwMDYzMjcxRkZGRjlECis6MTBGOTcwMDA5N0EyMDAxMDAwMTIxODI3MDA0MzEwMjRBN0EyMDAxMDFECis6MTBGOTgwMDAzMjcxRkZGRjI3QjIwMDEwMDAwMDgwMjEwQzAwNEQ3ODdCCis6MTBGOTkwMDAyNDA0MDAwMTI2MTAwMDAxMkUwMjAwMjAxNDQwRkZGQjY5Cis6MTBGOUEwMDAwMDAwMDAwMDBDMDA0RDc4MDAwMDIwMjEwQzAwNEQ3ODc0Cis6MTBGOUIwMDAyNDA0MDAwMTBDMDA0RDc4MDAwMDIwMjEwQzAwNEQ3ODNCCis6MTBGOUMwMDAyNDA0MDAwMTI0MTAwMDEwMzIwMjAwMDExMDQwMDAwMjQzCis6MTBGOUQwMDAwMDAwMjAyMTI0MDQwMDAxMEMwMDRENzgwMDEwODA0MjFBCis6MTBGOUUwMDAxNjAwRkZGQTMyMDIwMDAxMjQxMDAwMTAwMjMwMTAyNDI5Cis6MTBGOUYwMDAxMDQwMDAwMjAwMDAyMDIxMjQwNDAwMDEwQzAwNEQ3ODdBCis6MTBGQTAwMDAwMDEwODA0MjE2MDBGRkZBMDIzMDEwMjQwQzAwNEQ3OERFCis6MTBGQTEwMDAyNDA0MDAwMTBDMDA0RDc4MDAwMDIwMjEzNDEwODAwMEU3Cis6MTBGQTIwMDA5NjQyMDAwMDAwNTAxMDI0MTA0MDAwMDIwMDAwMjAyMUU3Cis6MTBGQTMwMDAyNDA0MDAwMTBDMDA0RDc4MDAxMDgwNDIxNjAwRkZGOEVECis6MTBGQTQwMDAwMDAwMDAwMDBDMDA0REI5MDAwMDAwMDA4RkJGMDAzMDI2Cis6MTBGQTUwMDA4RkJFMDAyQzhGQjUwMDI4OEZCMzAwMjQ4RkIyMDAyMEZBCis6MTBGQTYwMDA4RkIxMDAxQzhGQjAwMDE4MDNFMDAwMDgyN0JEMDAzOERDCis6MTBGQTcwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyN0JERkZFOEJCCis6MTBGQTgwMDBBRkJGMDAxMDhFRTMwNEI4MjQwMjAwMDgxNDYyMDFFMDQ2Cis6MTBGQTkwMDAwMDAwMDAwMDNDMDIwMDAxOEM0MjZGMUMxNDQwMDAwNTc1Cis6MTBGQUEwMDAwMDAwMDAwMDBDMDAzREFGOEY4NDAyMjQxMDAwMDFEODNDCis6MTBGQUIwMDAwMDAwMDAwMDhGODIwMjIwM0MwMzAwMDgwMDQzMTAyNDU1Cis6MTBGQUMwMDAxMDQwMDAyNjI0MDIwMDAxOEY4NDAyMjQ4RjgyMDIyMDJECis6MTBGQUQwMDAzQzAzMDQwMDAwNDMxMDI0MTA0MDAwMDYwMDAwMDAwMDE2Cis6MTBGQUUwMDAzQzAxMDAwMkFDMjA4RkEwM0MwMTAwMDIxMDAwMDAwQjgyCis6MTBGQUYwMDBBQzIwOEZDMDNDMDMwMDAyMjQ2MzhGQTA4QzYyMDAwMDA2Cis6MTBGQjAwMDAyNDQyMDAwMUFDNjIwMDAwMkM0MjAwMDIxNDQwMDAwM0I5Cis6MTBGQjEwMDAyNDAyMDAwMTNDMDEwMDAyQUMyMjhGQzAzQzAyMDAwMjIyCis6MTBGQjIwMDA4QzQyOEZDMDEwNDAwMDA2MzA4MjAwNDAxMDQwMDAwNDFDCis6MTBGQjMwMDAyNDAyMDAwMTNDMDEwMDAyMTAwMDAwMDNBQzIyOEZDNDJCCis6MTBGQjQwMDAzQzAxMDAwMkFDMjA4RkM0M0MwMTAwMDJBQzI0OEY5QzFECis6MTBGQjUwMDAzQzAxMDAwMjEwMDAwMDBCQUMyMDhGRDAzQzAxMDAwMkUxCis6MTBGQjYwMDBBQzIyOEZEMDNDMDEwMDAyQUMyMDhGQzAzQzAxMDAwMkNGCis6MTBGQjcwMDBBQzIwOEZBMDNDMDEwMDAyQUMyMDhGQzQzQzAxMDAwMkVECis6MTBGQjgwMDBBQzIwOEY5QzNDMDMwMDAyOEM2MzhGOTAzQzAyMDAwMkVGCis6MTBGQjkwMDA4QzQyOEY5NDUwNjIwMDA0MjQ2M0ZGRkYzQzAxMDAwMkZBCis6MTBGQkEwMDBBQzIzOEY5NDI0NjNGRkZGMkM2MjAwMEUxMDQwMDE5NDVECis6MTBGQkIwMDAwMDAzMTA4MDNDMDEwMDAxMDAyMjA4MjE4QzIyNkMwMDBGCis6MTBGQkMwMDAwMDQwMDAwODAwMDAwMDAwMjQwMjAwMDIzQzAxMDAwMjg2Cis6MTBGQkQwMDBBQzIwOEZDMDNDMDEwMDAyQUMyMDhGQTAzQzAxMDAwMjkxCis6MTBGQkUwMDBBQzIwOEY5QzNDMDEwMDAyQUMyMDhGQzQzQzAxMDAwMjgxCis6MTBGQkYwMDBBQzIwOEZCODNDMDEwMDAyQUMyMDhGQjBBRjgwMDIyNDUzCis6MTBGQzAwMDAzQzAxMDAwMkFDMjI4RjkwM0MwMjAwMDI4QzQyOEZEMDVCCis6MTBGQzEwMDAxNDQwMDA0RjNDMDJGREZGMzQ0MkZGRkYwQzAwM0RBRjlCCis6MTBGQzIwMDAwMjgyQTAyNEFGODAwMjA0OEY4MjAyMDAyNDAzRkZGRDIxCis6MTBGQzMwMDAwMDQzMTAyNEFGODIwMjAwM0MwMTAwMDJBQzIwOEZFMEEwCis6MTBGQzQwMDA4RjgzMDA1NDNDMDIwMDAyOEM0MjhGQjgyNDA0MDAwMUQwCis6MTBGQzUwMDAzQzAxMDAwMkFDMjQ4RkNDMjQ0MjAwMDEzQzAxMDAwMjk0Cis6MTBGQzYwMDBBQzIyOEZCODJDNDIwMDA0M0MwMTAwMDJBQzIzOEZCNEJDCis6MTBGQzcwMDAxNDQwMDAwNjI0MDIwMDAzM0MwMTAwMDFBQzI0NkQ5Q0VBCis6MTBGQzgwMDAzQzAxMDAwMjEwMDAwMTVFQUMyMDhGQjgzQzAxMDAwMjc0Cis6MTBGQzkwMDAxMDAwMDE1QkFDMjI4RjkwOEY4MzAwNTQzQzAyMDAwMjY1Cis6MTBGQ0EwMDA4QzQyOEZCNDI0NjNEOEYwMDA0MzEwMjMyQzQyMjcxMEQ5Cis6MTBGQ0IwMDAxNDQwMDAwMzI0MDIwMDA0M0MwMTAwMDJBQzIyOEY5MDk3Cis6MTBGQ0MwMDAzQzAyMDAwMjhDNDI4RkQwMTQ0MDAwMjEzQzAyRkRGRjE4Cis6MTBGQ0QwMDAzNDQyRkZGRjEwMDAwMTRBMDI4MkEwMjQzQzA0MDAwMUNDCis6MTBGQ0UwMDA4Qzg0NkYyMDNDMDEwMDAyMEMwMDUwODRBQzIwOEZBODUzCis6MTBGQ0YwMDAzQzAyMDAwMjhDNDI4RkRDQUY4MjAyMDQzQzAyMDAwMjE0Cis6MTBGRDAwMDA4QzQyOEZEMDE0NDAwMDEyM0MwM0ZERkY4RjgyMDIwNDBFCis6MTBGRDEwMDAzNDYzRkZGRjMwNDIwMDMwMTQ0MDAxMkYwMjgzQTAyNERGCis6MTBGRDIwMDAzQzAzMDAwMjhDNjM4RkRDMjQwMjAwMDUzQzAxMDAwMkNFCis6MTBGRDMwMDBBQzIyOEY5MDNDMDEwMDAyMTAwMDAxMzFBQzIzOEZFMDE3Cis6MTBGRDQwMDAzQzAyMDAwMjhDNDI4RkQwMTA0MDAwMTAzQzAyRkRGRkFDCis6MTBGRDUwMDAzQzAyMDAwMThDNDI2RTNDMjQ0MjAwMDEzQzAxMDAwMTQ3Cis6MTBGRDYwMDBBQzIyNkUzQzJDNDIwMDAyMTQ0MDAxMjUyNDAyMDAwMTBBCis6MTBGRDcwMDAzQzAxMDAwMUFDMjI2RTQ0M0MwMTAwMDFBQzIwNkUzQzExCis6MTBGRDgwMDAzQzAxMDAwMTEwMDAwMTFFQUMyMjZEOUMzQzAzMDAwMkVFCis6MTBGRDkwMDA4QzYzOEZDMDM0NDJGRkZGMTA2MDAxMTkwMjgyQTAyNERGCis6MTBGREEwMDAzQzAyMDAwMjhDNDI4RjlDMTA0MDAxMTUwMDAwMDAwMEI0Cis6MTBGREIwMDAzQzAxMDAwMkFDMjI4RkM4MjQwMjAwMDMzQzAxMDAwMjc3Cis6MTBGREMwMDBBQzIyOEZBMDEwMDAwMEI4MjQwMjAwMDYzQzAxMDAwMjAzCis6MTBGREQwMDBBQzIwOEZBODhGODIwMjA0MzQ0MjAwNDBBRjgyMDIwNDFDCis6MTBGREUwMDAzQzAyMDAwMjhDNDI4RkUwMjQwMzAwMDczQzAxMDAwMjI5Cis6MTBGREYwMDBBQzIzOEY5MDM0NDIwMDQwM0MwMTAwMDJBQzIyOEZFMEUzCis6MTBGRTAwMDAzQzAyMDAwMjhDNDI4RkMwMTA0MDAwMDUwMDAwMDAwMDQwCis6MTBGRTEwMDAzQzAyMDAwMjhDNDI4RjlDMTA0MDAwRjAyNDAyMDAwMjQxCis6MTBGRTIwMDAzQzA1MDAwMjI0QTU4RkEwOENBMjAwMDAyQzQyNEUyMThDCis6MTBGRTMwMDAxMDQwMDBFQTI0MDIwMDAyM0MwMjAwMDI4QzQyOEZDNEZGCis6MTBGRTQwMDAxMDQwMDBFRjI0MDRGRkJGM0MwMjAwMDI4QzQyOEY5QzU0Cis6MTBGRTUwMDAzQzAzMDAwMjhDNjM4RkM4MDA0NDEwMjQwMDY0MTgyNDAzCis6MTBGRTYwMDAxMDQzMDAwNDI0MDIwMDAxM0MwMTAwMDIxMDAwMDBFNEUxCis6MTBGRTcwMDBBQzIyOEY5MDI0MDIwMDAzQUNBMjAwMDAyNDAyMDAwOEYwCis6MTBGRTgwMDAzQzAxMDAwMkFDMjI4RjkwM0MwMjAwMDI4QzQyOEZDQ0RECis6MTBGRTkwMDAxMDQwMDAwQzI0MDIwMDAxM0MwNDAwMDIwQzAwNTA5MUIwCis6MTBGRUEwMDA4Qzg0OEY5QzNDMDIwMDAyOEM0MjhGRTgxNDQwMDAwNTM5Cis6MTBGRUIwMDAyNDAyMDAwMTNDMDIwMDAyOEM0MjhGRTQxMDQwMDAwNjQ0Cis6MTBGRUMwMDAyNDAyMDAwMTNDMDEwMDAxQUMyMjZEOUMzQzAxMDAwMkI3Cis6MTBGRUQwMDAxMDAwMDBDQkFDMjA4RkI4M0MwMjAwMDI4QzQyOEZCMEU3Cis6MTBGRUUwMDAzQzAzMDAwMjhDNjM4RjlDMkM0MjAwMDEwMDAyMTBDMDc2Cis6MTBGRUYwMDAzMDYzMDAwODNDMDEwMDAyQUMyMjhGQjAzQzAxMDAwMkRDCis6MTBGRjAwMDBBQzIzOEZBQzhGODMwMDU0MjQwMjAwMDkzQzAxMDAwMjEzCis6MTBGRjEwMDBBQzIyOEY5MDNDMDEwMDAyMTAwMDAwQjlBQzIzOEZCNERBCis6MTBGRjIwMDA4RjgzMDA1NDNDMDIwMDAyOEM0MjhGQjQyNDYzRDhGMENCCis6MTBGRjMwMDAwMDQzMTAyMzJDNDIyNzEwMTQ0MDAwOUYwMDAwMDAwMEIzCis6MTBGRjQwMDAzQzAyMDAwMjhDNDI4RkMwMTA0MDAwMDUwMDAwMDAwMEZGCis6MTBGRjUwMDAzQzAyMDAwMjhDNDI4RjlDMTA0MDAwQTAyNDAyMDAwMjUwCis6MTBGRjYwMDAzQzAzMDAwMjI0NjM4RkEwOEM2MjAwMDAyQzQyNEUyMUNGCis6MTBGRjcwMDAxMDQwMDA5QTI0MDIwMDAyM0MwMjAwMDI4QzQyOEZDQzA2Cis6MTBGRjgwMDAxMDQwMDAwRTAwMDAwMDAwM0MwMjAwMDI4QzQyOEY5Q0RBCis6MTBGRjkwMDAzQzAxMDAwMkFDMjA4RkNDMzA0MjAwODAxMDQwMDAyRjhBCis6MTBGRkEwMDAyNDAyMDAwQzhGODIwMjA0MzA0MjAwODAxNDQwMDAwQ0I2Cis6MTBGRkIwMDAyNDAyMDAwMzEwMDAwMDI5MjQwMjAwMEMzQzAyMDAwMjZECis6MTBGRkMwMDA4QzQyOEY5QzMwNDIwMDgwMTQ0MDAwMDUyNDAyMDAwM0M0Cis6MTBGRkQwMDA4RjgyMDIwNDMwNDIwMDgwMTA0MDAwMUYyNDAyMDAwMzgwCis6MTBGRkUwMDBBQzYyMDAwMDI0MDIwMDBBM0MwMTAwMDJBQzIyOEY5MEE3Cis6MTBGRkYwMDAzQzA0MDAwMjI0ODQ4RkQ4OEM4MjAwMDAzQzAzMDAwMjYxCis6MDIwMDAwMDIxMDAwRUMKKzoxMDAwMDAwMDhDNjM4RkIwMDA0MzEwMjVBRjgyMDIwNDhDODMwMDAwMDQKKzoxMDAwMTAwMDNDMDQwMDAyOEM4NDhGQjAyNDAyMDAwQjNDMDEwMDAyREYKKzoxMDAwMjAwMEFDMjI4RjkwMDA2NDE4MjUzQzAxMDAwMkFDMjM4RkUwQzUKKzoxMDAwMzAwMDNDMDUwMDAyMjRBNThGQTA4Q0EyMDAwMDJDNDI0RTIxN0EKKzoxMDAwNDAwMDEwNDAwMDY2MjQwMjAwMDIzQzAyMDAwMjhDNDI4RkQwNjUKKzoxMDAwNTAwMDEwNDAwMDA1MDAwMDAwMDAyNDAyMDAwQzNDMDEwMDAyREEKKzoxMDAwNjAwMDEwMDAwMDY3QUMyMjhGOTAzQzAyMDAwMjhDNDI4RkMwQ0YKKzoxMDAwNzAwMDEwNDAwMDYzMDAwMDAwMDAzQzA0MDAwMjhDODQ4RjlDNTAKKzoxMDAwODAwMDEwODAwMDU1MzA4MjAwMDgzQzAzMDAwMjhDNjM4RkFDNjYKKzoxMDAwOTAwMDEwNjIwMDVCMjQwMjAwMDMzQzAxMDAwMkFDMjQ4RkM4MDQKKzoxMDAwQTAwMEFDQTIwMDAwMjQwMjAwMDYzQzAxMDAwMjEwMDAwMDU0MzMKKzoxMDAwQjAwMEFDMjI4RjkwOEY4MjAyMDAzNDQyMDAwMkFGODIwMjAwOTUKKzoxMDAwQzAwMDhGODMwMDU0MjQwMjAwMEQzQzAxMDAwMkFDMjI4RjkwNkIKKzoxMDAwRDAwMDNDMDEwMDAyQUMyMzhGQjQ4RjgzMDA1NDNDMDIwMDAyMjkKKzoxMDAwRTAwMDhDNDI4RkI0MjQ2M0Q4RjAwMDQzMTAyMzJDNDIyNzEwOTUKKzoxMDAwRjAwMDE0NDAwMDMxMDAwMDAwMDAzQzAyMDAwMjhDNDI4RkQwMEUKKzoxMDAxMDAwMDEwNDAwMDIwMjQwMjAwMEUzQzAzMDAwMjhDNjM4RkU0QTgKKzoxMDAxMTAwMDNDMDEwMDAyMTQ2MDAwMTVBQzIyOEY5MDBDMDAzRTZENzMKKzoxMDAxMjAwMDAwMDAwMDAwM0MwNTAwMDE4Q0E1NkQ5ODBDMDA1MjlCNUUKKzoxMDAxMzAwMDAwMDAyMDIxM0MwMzAwMDE4QzYzNkQ5ODI0MDIwMDA0MjAKKzoxMDAxNDAwMDE0NjIwMDA1MjQwM0ZGRkIzQzAyMDAwMThDNDI2RDk0MDUKKzoxMDAxNTAwMDEwMDAwMDAzMjQwM0ZGRjczQzAyMDAwMThDNDI2RDk0NjEKKzoxMDAxNjAwMDAwNDMxMDI0M0MwMTAwMDFBQzIyNkQ5NDhGODMwMjI0RDMKKzoxMDAxNzAwMDNDMDIwMjAwM0MwMTAwMDJBQzIzOEZFQzEwMDAwMDIwODYKKzoxMDAxODAwMDAyODJBMDI1M0MwMjAwMDI4QzQyOEZDMDEwNDAwMDA1NzQKKzoxMDAxOTAwMDAwMDAwMDAwM0MwMjAwMDI4QzQyOEY5QzEwNDAwMDBGQzcKKzoxMDAxQTAwMDI0MDIwMDAyM0MwMjAwMDI4QzQyOEZBMDJDNDI0RTIxMEQKKzoxMDAxQjAwMDEwNDAwMDBBMjQwMjAwMDIzQzAyMDAwMjhDNDI4RkMwNjAKKzoxMDAxQzAwMDEwNDAwMDBGMDAwMDAwMDAzQzAyMDAwMjhDNDI4RjlDOTcKKzoxMDAxRDAwMDE0NDAwMDBCMDAwMDAwMDAyNDAyMDAwMjNDMDEwMDAyNTkKKzoxMDAxRTAwMDEwMDAwMDA3QUMyMjhGOTAzQzAyMDAwMjhDNDI4RkMwQUUKKzoxMDAxRjAwMDEwNDAwMDAzMDAwMDAwMDAwQzAwM0RBRjAwMDAwMDAwQjQKKzoxMDAyMDAwMDhGODIwMjIwM0MwM0Y3MDAwMDQzMTAyNUFGODIwMjIwQkEKKzoxMDAyMTAwMDhGQkYwMDEwMDNFMDAwMDgyN0JEMDAxODNDMDMwMDAyNTgKKzoxMDAyMjAwMDI0NjM4RkU4OEM2MjAwMDAxMDQwMDAwNTM0NDIyMDAwRjcKKzoxMDAyMzAwMDNDMDEwMDAyQUMyMjhGREMxMDAwMDAwM0FDNjAwMDAwMjcKKzoxMDAyNDAwMDNDMDEwMDAyQUMyNDhGREMwM0UwMDAwODAwMDAwMDAwNDkKKzoxMDAyNTAwMDI3QkRGRkUwMzA4MjAwMzBBRkJGMDAxODNDMDEwMDAyMzQKKzoxMDAyNjAwMEFDMjI4RkU0MTQ0MDAwNjczQzAyRkZGRjM0NDIxRjBFQjMKKzoxMDAyNzAwMDAwODIxMDI0MTQ0MDAwNjEyNDAyMDAzMDMwODIyMDAwRUIKKzoxMDAyODAwMDEwNDAwMDVEMzA4MzgwMDAwMDAzMUEwMjMwODIwMDAxQkMKKzoxMDAyOTAwMDAwMDIxMjAwM0MwNDAwMDE4Qzg0NkYyMDAwNjIxODI1Q0IKKzoxMDAyQTAwMDAwMDMzMUMyM0MwMzAwMDEyNDYzNkU0ODMwODI4MDAwQTkKKzoxMDAyQjAwMDAwMDIxMjAyMzA4NDAwMDEwMDA0MjIwMDAwNDQxMDI1RDQKKzoxMDAyQzAwMDAwMDIzOUMyMDAwNjEwODAwMDQzMTAyMTAwNDcxMDIxQUYKKzoxMDAyRDAwMDkwNDMwMDAwMjQwMjAwMDExMDYyMDAyNTAwMDAwMDAwOEQKKzoxMDAyRTAwMDEwNjAwMDA3MjQwMjAwMDIxMDYyMDAxMzI0MDIwMDAzQzEKKzoxMDAyRjAwMDEwNjIwMDJDM0MwNTAwMEYxMDAwMDAzNzAwMDAwMDAwQzkKKzoxMDAzMDAwMDhGODIwMjAwMjQwM0ZFRkYwMDQzMTAyNEFGODIwMjAwMEMKKzoxMDAzMTAwMDhGODIwMjIwM0MwM0ZGRkUzNDYzRkZGRjAwNDMxMDI0NjIKKzoxMDAzMjAwMEFGODIwMjIwM0MwMTAwMDJBQzIwOTAwNDNDMDEwMDAyOUMKKzoxMDAzMzAwMDEwMDAwMDM0QUMyMDkwMEM4RjgyMDIwMDM0NDIwMTAwODcKKzoxMDAzNDAwMEFGODIwMjAwOEY4MjAyMjAzQzAzRkZGRTM0NjNGRkZGNzYKKzoxMDAzNTAwMDAwNDMxMDI0QUY4MjAyMjAyNDAyMDEwMDNDMDEwMDAyNkQKKzoxMDAzNjAwMEFDMjI5MDA0M0MwMTAwMDIxMDAwMDAyNkFDMjA5MDBDNEUKKzoxMDAzNzAwMDhGODIwMjAwMjQwM0ZFRkYwMDQzMTAyNEFGODIwMjAwOUMKKzoxMDAzODAwMDhGODIwMjIwM0MwMzAwMDEwMDQzMTAyNUFGODIwMjIwMkYKKzoxMDAzOTAwMDNDMDEwMDAyQUMyMDkwMDQzQzAxMDAwMjEwMDAwMDE5NTYKKzoxMDAzQTAwMEFDMjM5MDBDOEY4MjAyMDAzNDQyMDEwMEFGODIwMjAwMjUKKzoxMDAzQjAwMDhGODIwMjIwM0MwMzAwMDEwMDQzMTAyNUFGODIwMjIwRkYKKzoxMDAzQzAwMDI0MDIwMTAwM0MwMTAwMDJBQzIyOTAwNDNDMDEwMDAyMjYKKzoxMDAzRDAwMDEwMDAwMDBDQUMyMzkwMEMzNEE1RkZGRjNDMDQwMDAxN0UKKzoxMDAzRTAwMDI0ODQ2QzM4QUZBMzAwMTAwQzAwMkIzQkFGQTAwMDE0OEEKKzoxMDAzRjAwMDEwMDAwMDA0MDAwMDAwMDAyNDAyMDAzMDNDMDEwMDAyNTQKKzoxMDA0MDAwMEFDMjI4RkU4OEZCRjAwMTgwM0UwMDAwODI3QkQwMDIwNTIKKzoxMDA0MTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDI3QkRGRkM4MzEKKzoxMDA0MjAwMEFGQjIwMDI4MDA4MDkwMjFBRkIzMDAyQzAwQTA5ODIxMkIKKzoxMDA0MzAwMEFGQjAwMDIwMDBDMDgwMjEzQzA0MDAwMTI0ODQ2QzUwMzcKKzoxMDA0NDAwMDNDMDUwMDA5M0MwMjAwMDE4QzQyNkQ5ODM0QTU5MDAxRTYKKzoxMDA0NTAwMDAyNDAzMDIxMDI2MDM4MjFBRkJGMDAzMEFGQjEwMDI0MkMKKzoxMDA0NjAwMEE3QTAwMDFBQUZCMDAwMTQwQzAwMkIzQkFGQTIwMDEwRTUKKzoxMDA0NzAwMDI0MDIwMDAyMTI2MjAwODMyRTYyMDAwMzEwNDAwMDA1NzUKKzoxMDA0ODAwMDI0MDIwMDAxMTI2MjAwMEEwMDAwMDAwMDEwMDAwMTczNDMKKzoxMDA0OTAwMDAwMDAwMDAwMjQwMjAwMDQxMjYyMDBGODI0MDIwMDA4OTgKKzoxMDA0QTAwMDEyNjIwMEY3M0MwMkZGRUMxMDAwMDE2QzAwMDAwMDAwM0IKKzoxMDA0QjAwMDNDMDIwMDAxOEM0MjZEOTQzMDQyMDAwMjE0NDAwMDA0NjIKKzoxMDA0QzAwMDAwMTI4OTQwM0MwMkZGRkIzNDQyRkZGRjAyMDI4MDI0RkQKKzoxMDA0RDAwMDNDMDEwMDAyMDAzMTA4MjFBQzMwOEZGQzNDMDI0MDAwOUUKKzoxMDA0RTAwMDAyMDIxMDI0MTA0MDAwNEUwMDEwMjNDMjMwODQwMDMwNUQKKzoxMDA0RjAwMDAwMTAxMzgyMzA0MjAwMUMzQzAzMDAwMTI0NjM2REQ4QkQKKzoxMDA1MDAwMDAwNDMxMDIxMDA4MjM4MjEzQzAyMDAyMDAyMDIxMDI0MDYKKzoxMDA1MTAwMDEwNDAwMDA2MjQwMjAxMDAzQzAxMDAwMjAwMzEwODIxQzUKKzoxMDA1MjAwMEFDMjI5MDAwMTAwMDAwMDUzQzAyMDA4MDNDMDEwMDAyNUIKKzoxMDA1MzAwMDAwMzEwODIxQUMyMDkwMDAzQzAyMDA4MDAyMDIxMDI0MEYKKzoxMDA1NDAwMDEwNDAwMDA2MDAxMjE5NDAzQzAyMDAwMTNDMDEwMDAyNkMKKzoxMDA1NTAwMDAwMjMwODIxMTAwMDAwMDVBQzIyOTAwODAwMTIxMTQwNzEKKzoxMDA1NjAwMDNDMDEwMDAyMDAyMjA4MjFBQzIwOTAwODk0RTQwMDAwMjUKKzoxMDA1NzAwMDNDMDMwMDAxOEM2MzZGNDAyNDAyMDAwNTEwNjIwMDEwRjAKKzoxMDA1ODAwMEE3QTQwMDE4MzIwMjQwMDAxMDQwMDAwMjM0ODI0MDAwNEMKKzoxMDA1OTAwMEE3QTIwMDE4MjQwNDAwMDE5NEUyMDAwMjI0MDUwMDA0MkMKKzoxMDA1QTAwMDI0RTYwMDAyMzQ0MjAwMDEwQzAwNDVCRUE0RTIwMDAyMzEKKzoxMDA1QjAwMDI0MDQwMDAxMDAwMDI4MjEwQzAwNDVCRTI3QTYwMDE4RDUKKzoxMDA1QzAwMDNDMDIwMDAxOEM0MjZEOTgyNDExMDAwMTNDMDEwMDAxQTUKKzoxMDA1RDAwMEFDMzE2REE0MTQ1MzAwMDQzMjAyODAwMDBDMDAzREFGMTYKKzoxMDA1RTAwMDAwMDAwMDAwMzIwMjgwMDAxMDQwMDExQzAwMDAwMDAwRUEKKzoxMDA1RjAwMDBDMDAzREFGMDAwMDAwMDAzQzAzMDAwMThDNjM2RjQwMjUKKzoxMDA2MDAwMDI0MDIwMDA1MTA2MjAxMTUyNDAyMDAwMjNDMDEwMDAxRDEKKzoxMDA2MTAwMEFDMzE2RDlDM0MwMTAwMDExMDAwMDExMEFDMjI2RDk4QzIKKzoxMDA2MjAwMDI0MDQwMDAxMjQwNTAwMDQyN0IwMDAxQTBDMDA0NUJFNzQKKzoxMDA2MzAwMDAyMDAzMDIxMjQwNDAwMDEwMDAwMjgyMTBDMDA0NUJFRTYKKzoxMDA2NDAwMDAyMDAzMDIxM0MwMjAwMDIwMDUxMTAyMThDNDI4RkY0NDQKKzoxMDA2NTAwMDNDMDQwMDAxOEM4NDZEOTgzQzAzQkZGRjM0NjNGRkZGQjIKKzoxMDA2NjAwMDNDMDEwMDAxQUMzMzZEQTQwMDQzMTAyNDNDMDEwMDAyQTYKKzoxMDA2NzAwMDAwMzEwODIxMTA5MzAwRjdBQzIyOEZGNDEwMDAwMEY3MkUKKzoxMDA2ODAwMDAwMDAwMDAwM0MwMjIwMDAwMjAyMTAyNDEwNDAwMDA1N0YKKzoxMDA2OTAwMDI0MDIwMDAxM0MwMTAwMDFBQzIyNkYxQzEwMDAwMDA0ODgKKzoxMDA2QTAwMDAwMTI4OTQwM0MwMTAwMDFBQzIwNkYxQzAwMTI4OTQwRkYKKzoxMDA2QjAwMDNDMDEwMDAyMDAzMTA4MjFBQzMwOEZGODNDMDI0MDAwQzAKKzoxMDA2QzAwMDAyMDIxMDI0MTQ0MDAwMTQwMDAwMDAwMDNDMDIwMDAxNEIKKzoxMDA2RDAwMDhDNDI2RjFDMTA0MDAwMDYyNDA0MDAwNDI0MDUwMDAxMTUKKzoxMDA2RTAwMDBDMDA0RERCMjQwNjIwMDAyNDAyMDAwMUFFRTIwNEI4MTkKKzoxMDA2RjAwMDNDMDIwMDAyMDA1MTEwMjE4QzQyOEZGMDNDMDNCRkZGRUUKKzoxMDA3MDAwMDM0NjNGRkZGMDA0MzEwMjQzQzAxMDAwMjAwMzEwODIxNDQKKzoxMDA3MTAwMDEwMDAwMEQwQUMyMjhGRjAzQzAyMDAwMThDNDI2RjFDMTQKKzoxMDA3MjAwMDEwNDAwMDI4M0MwMzAwQTAwMjAzMTAyNDU0NDMwMDBEOTUKKzoxMDA3MzAwMDNDMDIwMDIwM0MwMjAwMDE4QzQyNkYyMDI0MDMwMTAwOTcKKzoxMDA3NDAwMDNDMDEwMDAyMDAzMTA4MjFBQzIzOTAwNDNDMDMwMDAxNkQKKzoxMDA3NTAwMDNDMDEwMDAyMDAzMTA4MjFBQzIzOTAwQzEwMDAwMDE1NzAKKzoxMDA3NjAwMDM0NDIwNDAwMDIwMjEwMjQxMDQwMDAwODI0MDMwMTAwNTcKKzoxMDA3NzAwMDNDMDIwMDAxOEM0MjZGMjAzQzAxMDAwMjAwMzEwODIxNDQKKzoxMDA3ODAwMEFDMjM5MDA0MTAwMDAwMEIzNDQyMDgwMDNDMDIwMDgwQUYKKzoxMDA3OTAwMDAyMDIxMDI0MTA0MDAwMkUzQzAzMDAwMTNDMDIwMDAxMjQKKzoxMDA3QTAwMDhDNDI2RjIwM0MwMTAwMDIwMDMxMDgyMUFDMjM5MDBDRTgKKzoxMDA3QjAwMDM0NDIwQzAwM0MwMTAwMDFBQzIyNkYyMDEwMDAwMDI1RTcKKzoxMDA3QzAwMDI0MDQwMDAxM0MwMjAwMjAwMjAyMTAyNDEwNDAwMDA2MTQKKzoxMDA3RDAwMDI0MDIwMTAwM0MwMTAwMDIwMDMxMDgyMUFDMjI5MDA0RjcKKzoxMDA3RTAwMDEwMDAwMDA1M0MwMjAwODAzQzAxMDAwMjAwMzEwODIxOUQKKzoxMDA3RjAwMEFDMjA5MDA0M0MwMjAwODAwMjAyMTAyNDEwNDAwMDA3NEMKKzoxMDA4MDAwMDAwMTIxOTQwM0MwMjAwMDEzQzAxMDAwMjAwMjMwODIxQjMKKzoxMDA4MTAwMEFDMjI5MDBDMTAwMDAwMDYyNDA0MDAwMTAwMTIxMTQwQ0MKKzoxMDA4MjAwMDNDMDEwMDAyMDAyMjA4MjFBQzIwOTAwQzI0MDQwMDAxQUQKKzoxMDA4MzAwMDAwMDAyODIxMjdCMDAwMUUwQzAwNDU3QzAyMDAzMDIxNUEKKzoxMDA4NDAwMDI0MDQwMDAxMDAwMDI4MjEwQzAwNDU3QzAyMDAzMDIxMTYKKzoxMDA4NTAwMDI0MDQwMDAxMjQwNTAwMDEyN0IwMDAxQzBDMDA0NTdDODUKKzoxMDA4NjAwMDAyMDAzMDIxMjQwNDAwMDEyNDA1MDAwMTBDMDA0NTdDMTUKKzoxMDA4NzAwMDAyMDAzMDIxMTAwMDAwNzcwMDAwMDAwMDNDMDJGRkVDNzUKKzoxMDA4ODAwMDM0NDJGRkZGMDIwMjgwMjQzQzAyMDAwODAyMDI4MDI1NUQKKzoxMDA4OTAwMDAwMTIxMTQwM0MwMTAwMDIwMDIyMDgyMUFDMzA4RkY4MDgKKzoxMDA4QTAwMDNDMDIyMDAwMDIwMjEwMjQxMDQwMDAwOTAwMDAwMDAwNTkKKzoxMDA4QjAwMDNDMDIwMDAxOEM0MjZFNDQxNDQwMDAwNTI0MDIwMDAxRjkKKzoxMDA4QzAwMDNDMDEwMDAxQUMyMjZGMUMxMDAwMDAwNDNDMDI0MDAwRkYKKzoxMDA4RDAwMDNDMDEwMDAxQUMyMDZGMUMzQzAyNDAwMDAyMDIxMDI0Q0QKKzoxMDA4RTAwMDE0NDAwMDFEMjQwMjBFMDEzQzAzMDAwMThDNjM2RjFDQTgKKzoxMDA4RjAwMEFGODIwMjM4M0MwMTAwMDFBQzIwNkRCMDEwNjAwMDA1RjEKKzoxMDA5MDAwMDI0MDIyMDIwM0MwMTAwMDFBQzIyNkYyMDI0MDIwMDAxQkYKKzoxMDA5MTAwMEFFRTIwNEI4M0MwNEJGRkYwMDEyMTk0MDNDMDIwMDAyRTIKKzoxMDA5MjAwMDAwNDMxMDIxOEM0MjhGRjAzQzA1MDAwMThDQTU2RDk4OEUKKzoxMDA5MzAwMDM0ODRGRkZGMDA0NDEwMjQzQzAxMDAwMjAwMjMwODIxRkUKKzoxMDA5NDAwMEFDMjI4RkYwMjQwMjAwMDExMEEyMDA0NDAwMDAwMDAwM0QKKzoxMDA5NTAwMDEwMDAwMDQwMDAwMDAwMDAzQzAyMDAwMThDNDI2RjFDQUYKKzoxMDA5NjAwMDEwNDAwMDFDMjQwMjIwMDAzQzAxMDAwMUFDMjI2RjIwM0EKKzoxMDA5NzAwMDNDMDMwMEEwMDIwMzEwMjQxNDQzMDAwNTAwMTIxMTQwQTAKKzoxMDA5ODAwMDM0MDJBMDAwM0MwMTAwMDExMDAwMDAyREFDMjI2RjIwQjkKKzoxMDA5OTAwMDNDMDMwMDAyMDA2MjE4MjE4QzYzOEZGODNDMDIwMDIwQTcKKzoxMDA5QTAwMDAwNjIxMDI0MTA0MDAwMDQyNDAyMjAwMTNDMDEwMDAxRDgKKzoxMDA5QjAwMDEwMDAwMDIzQUMyMjZGMjAzQzAyMDA4MDAwNjIxMDI0NTMKKzoxMDA5QzAwMDEwNDAwMDFGMzQwMkEwMDEzQzAxMDAwMTEwMDAwMDFDNzcKKzoxMDA5RDAwMEFDMjI2RjIwM0MwMjAwMjAwMjAyMTAyNDEwNDAwMDA3Q0QKKzoxMDA5RTAwMDAwMTIxOTQwMjQwMjAxMDAzQzAxMDAwMjAwMjMwODIxRUEKKzoxMDA5RjAwMEFDMjI5MDA0MTAwMDAwMDYzQzAyMDA4MDAwMTIxMTQwNUUKKzoxMDBBMDAwMDNDMDEwMDAyMDAyMjA4MjFBQzIwOTAwNDNDMDIwMDgwM0UKKzoxMDBBMTAwMDAyMDIxMDI0MTA0MDAwMDYwMDEyMTk0MDNDMDIwMDAxOUUKKzoxMDBBMjAwMDNDMDEwMDAyMDAyMzA4MjExMDAwMDAwNUFDMjI5MDBDQkMKKzoxMDBBMzAwMDAwMTIxMTQwM0MwMTAwMDIwMDIyMDgyMUFDMjA5MDBDNjEKKzoxMDBBNDAwMDNDMDMwMDAxOEM2MzZEOTgyNDAyMDAwMTEwNjIwMDAzRDYKKzoxMDBBNTAwMDAwMDAwMDAwMEMwMDNEQUYwMDAwMDAwMDhGQkYwMDMwMjAKKzoxMDBBNjAwMDhGQjMwMDJDOEZCMjAwMjg4RkIxMDAyNDhGQjAwMDIwRUMKKzoxMDBBNzAwMDAzRTAwMDA4MjdCRDAwMzgyN0JERkZCMEFGQjMwMDNDM0UKKzoxMDBBODAwMDAwMDA5ODIxQUZCNTAwNDAwMDAwQTgyMUFGQjEwMDM0QUMKKzoxMDBBOTAwMDAwMDA4ODIxMjQwMjAwMDJBRkJGMDA0OEFGQkUwMDQ0MUUKKzoxMDBBQTAwMEFGQjIwMDM4QUZCMDAwMzBBRkE0MDAyQ0E3QTAwMDFBM0UKKzoxMDBBQjAwMEE3QTAwMDE4QTdBMDAwMjBBN0EwMDAxRUE3QTAwMDIyQTIKKzoxMDBBQzAwMDEwQTIwMTMwQTdBMDAwMUMyQ0EyMDAwMzEwNDAwMDA1QkEKKzoxMDBBRDAwMDI0MDIwMDAxMTBBMjAwMEEzQzAyNDAwMDEwMDAwMjVENDYKKzoxMDBBRTAwMDAyMjAxMDIxMjQwMjAwMDQxMEEyMDIwQTI0MDIwMDA4OUQKKzoxMDBBRjAwMDEwQTIwMjA4MDIyMDEwMjExMDAwMDI1NjAwMDAwMDAwN0YKKzoxMDBCMDAwMDhGQTgwMDJDMDAwODgxNDAzQzAzMDAwMjAwNzAxODIxQ0YKKzoxMDBCMTAwMDhDNjM4RkZDMDA2MjEwMjQxNDQwMDAwOTI0MDQwMDAxM0YKKzoxMDBCMjAwMDNDMDI3RkZGMzQ0MkZGRkYwMDYyODgyNDNDMDEwMDAyNDgKKzoxMDBCMzAwMDAwMzAwODIxQUMzMThGRjQxMDAwMDI0NjAyMjAxMDIxNTEKKzoxMDBCNDAwMDI0MDUwMDAxMEMwMDQ1N0MyN0E2MDAxODI0MDQwMDAxQTAKKzoxMDBCNTAwMDI0MDUwMDAxMEMwMDQ1N0MyN0E2MDAxODk3QTIwMDE4NjgKKzoxMDBCNjAwMDMwNDIwMDA0MTA0MDAwRDkzQzExNDAwMDNDMDIwMDAxMUEKKzoxMDBCNzAwMDhDNDI2RjQwMjQ0M0ZGRkYyQzYyMDAwNjEwNDAwMEQ5RDYKKzoxMDBCODAwMDAwMDMxMDgwM0MwMTAwMDEwMDIyMDgyMThDMjI2QzY4QzcKKzoxMDBCOTAwMDAwNDAwMDA4MDAwMDAwMDAyNDA0MDAwMTI0MDUwMDExQUEKKzoxMDBCQTAwMDI3QjAwMDFBMEMwMDQ1N0MwMjAwMzAyMTI0MDQwMDAxMEIKKzoxMDBCQjAwMDI0MDUwMDExMEMwMDQ1N0MwMjAwMzAyMTk3QTMwMDFBODcKKzoxMDBCQzAwMDMwNjI0MDAwMTA0MDAwMDIzQzE1MDAxMDNDMTUwMDA4NDcKKzoxMDBCRDAwMDMwNjI4MDAwMTA0MDAwQUEzQzEzMDAwMTEwMDAwMEE4MDEKKzoxMDBCRTAwMDNDMTMwMDAyMjQwNDAwMDEyNDA1MDAxNDI3QjAwMDFBNUQKKzoxMDBCRjAwMDBDMDA0NTdDMDIwMDMwMjEyNDA0MDAwMTI0MDUwMDE0NkYKKzoxMDBDMDAwMDBDMDA0NTdDMDIwMDMwMjE5N0EzMDAxQTMwNjIxMDAwQ0UKKzoxMDBDMTAwMDEwNDAwMDAyM0MxNTAwMTAzQzE1MDAwODMwNjIwODAwMkUKKzoxMDBDMjAwMDEwNDAwMDk3M0MxMzAwMDExMDAwMDA5NTNDMTMwMDAyOTcKKzoxMDBDMzAwMDI0MDQwMDAxMjQwNTAwMTkyN0IwMDAxQzBDMDA0NTdDODkKKzoxMDBDNDAwMDAyMDAzMDIxMjQwNDAwMDEyNDA1MDAxOTBDMDA0NTdDMTkKKzoxMDBDNTAwMDAyMDAzMDIxOTdBMjAwMUMzMDQzMDcwMDI0MDIwNDAwNDgKKzoxMDBDNjAwMDEwNjIwMDI3Mjg2MjA0MDExMDQwMDAwRTI0MDIwMjAwRDYKKzoxMDBDNzAwMDEwNjIwMDFGMjg2MjAyMDExMDQwMDAwNTI0MDIwMTAwREEKKzoxMDBDODAwMDUwNjIwMDFFM0MxMzAwMDExMDAwMDAxRTI0MDQwMDAxRUQKKzoxMDBDOTAwMDI0MDIwMzAwNTA2MjAwMTkzQzEzMDAwMjEwMDAwMDE5RTYKKzoxMDBDQTAwMDI0MDQwMDAxMjQwMjA2MDAxMDYyMDAwRDI4NjIwNjAxREYKKzoxMDBDQjAwMDEwNDAwMDA1MjQwMjA1MDA1MDYyMDAwQjNDMTMwMDAyQTYKKzoxMDBDQzAwMDEwMDAwMDEwMjQwNDAwMDEyNDAyMDcwMDE0NjIwMDBEMkIKKzoxMDBDRDAwMDI0MDQwMDAxM0MxMzAwMDQxMDAwMDAwQTNDMTUwMDA4MjUKKzoxMDBDRTAwMDEwMDAwMDA2M0MxMzAwMDQxMDAwMDAwNTNDMTUwMDA4MkQKKzoxMDBDRjAwMDNDMTMwMDAxMTAwMDAwMDIzQzE1MDAwODNDMTUwMDEwRDgKKzoxMDBEMDAwMDI0MDQwMDAxMjQwNTAwMTgyN0IwMDAxRTBDMDA0NTdDQjcKKzoxMDBEMTAwMDAyMDAzMDIxMjQwNDAwMDEyNDA1MDAxODBDMDA0NTdDNDkKKzoxMDBEMjAwMDAyMDAzMDIxOEZBODAwMkM5N0E3MDAxRTAwMDgxMTQwNTgKKzoxMDBEMzAwMDNDMDYwMDAyMDBDMjMwMjE4Q0M2OEZGNDk3QTIwMDIyMkMKKzoxMDBENDAwMDNDMTAwMDAxMjYxMDZDNUMwMjAwMjAyMUFGQTIwMDEwQjQKKzoxMDBENTAwMDk3QTIwMDFDM0MwNTAwMEMzNEE1MDMwMzBDMDAyQjNCQTAKKzoxMDBENjAwMEFGQTIwMDE0M0MwMjAwMDQxNjYyMDAxMDNDMDIwMDAxMTUKKzoxMDBENzAwMDhGODQwMDU0MjQwMzAwMDEyNDAyMDAwMjNDMDEwMDAxN0UKKzoxMDBEODAwMEFDMjM2RDlDM0MwMTAwMDFBQzIyNkQ5ODNDMDEwMDAxM0MKKzoxMDBEOTAwMEFDMjM2REE0M0MwMTAwMDFBQzIzNkUyNDNDMDEwMDAxOTYKKzoxMDBEQTAwMEFDMjQ2RjMwMTAwMDAwNEYwMkIzODgyNTE2NjIwMDM5NjIKKzoxMDBEQjAwMDNDMDI4MDAwM0MwMjAwMDE4QzQyNkUyMDE0NDAwMDFFNjgKKzoxMDBEQzAwMDI0MDQwMDE4MDAwMDIwMjEwMDAwMjgyMTBDMDA0RERCMjUKKzoxMDBERDAwMDM0MDY4MDAwOEY4MzAwNTQ4RjgyMDA1NDAyQjM4ODI1MkMKKzoxMDBERTAwMDEwMDAwMDAyMjQ2MzAwMzI4RjgyMDA1NDAwNjIxMDIzM0UKKzoxMDBERjAwMDJDNDIwMDMzMTQ0MEZGRkMwMDAwMDAwMDhGODMwMDU0OUQKKzoxMDBFMDAwMDI0MDIwMDAxM0MwMTAwMDFBQzIyNkUyMDNDMDEwMDAxRTMKKzoxMDBFMTAwMEFDMjI2RDlDM0MwMTAwMDFBQzIyNkQ5ODNDMDEwMDAxQUMKKzoxMDBFMjAwMEFDMjI2REE0M0MwMTAwMDFBQzIyNkUyNDNDMDEwMDAxMDcKKzoxMDBFMzAwMDEwMDAwMDJDQUMyMzZGMzAwMDAwMjgyMTBDMDA0RERCOEIKKzoxMDBFNDAwMDI0MDYwNDA0MDAwMDIwMjEyNDA1MDAxRTI3QTYwMDE4MDMKKzoxMDBFNTAwMDI0MDIwMDAyMEMwMDQ1QkVBN0EyMDAxODAwMDAyMDIxQjkKKzoxMDBFNjAwMDAwMDAyODIxMjdBNjAwMTgwQzAwNDVCRUE3QTAwMDE4RTYKKzoxMDBFNzAwMDI0MDQwMDE4MjQwNTAwMDIwQzAwNEREQjI0MDYwMDA0QTUKKzoxMDBFODAwMDNDMDI4MDAwMDIyMjEwMjUwMkIzMTgyNTEwMDAwMDE1MzQKKzoxMDBFOTAwMDAwNDM4ODI1MDIyMjEwMjUwMjc1MTgyNTAwNDM4ODI1NjUKKzoxMDBFQTAwMDAyMDAyMDIxOTdBNjAwMUMzQzA3MDAwMThDRTc2RDk4RUEKKzoxMDBFQjAwMDNDMDUwMDBDMzRBNTAzMjZBRkIzMDAxMDBDMDAyQjNCRkYKKzoxMDBFQzAwMEFGQjEwMDE0MTAwMDAwMDcwMDAwMDAwMDNDMTEwMDAyNDgKKzoxMDBFRDAwMDAyMzA4ODIxOEUzMThGRkMzQzAyN0ZGRjM0NDJGRkZGQkQKKzoxMDBFRTAwMDAyMjI4ODI0M0MwMjAwMDE4QzQyNkRBODEwNDAwMDFFQTIKKzoxMDBFRjAwMDAwMDAwMDAwM0MwMjAwMDE4QzQyNkYxQzEwNDAwMDAyMDgKKzoxMDBGMDAwMDNDMDIyMDAwMDIyMjg4MjU4RkE4MDAyQzAwMDgxMTQwRjYKKzoxMDBGMTAwMDNDMDEwMDAyMDAyMjA4MjE4QzIyOTAwMDEwNDAwMDAzQjYKKzoxMDBGMjAwMDNDMDIwMDIwMTAwMDAwMDUwMjIyODgyNTNDMDJGRkRGNjEKKzoxMDBGMzAwMDM0NDJGRkZGMDIyMjg4MjQ4RkE4MDAyQzAwMDgxMTQwQjEKKzoxMDBGNDAwMDNDMDEwMDAyMDAyMjA4MjE4QzIyOTAwODEwNDAwMDAzN0UKKzoxMDBGNTAwMDNDMDIwMDgwMTAwMDAwMDQwMjIyODgyNTNDMDJGRjdGMzIKKzoxMDBGNjAwMDM0NDJGRkZGMDIyMjg4MjQ4RkE4MDAyQzAwMDgxMTQwODEKKzoxMDBGNzAwMDNDMDEwMDAyMDAyMjA4MjFBQzMxOEZGNDEwMDAwMTM1NDEKKzoxMDBGODAwMDAyMjAxMDIxOEZBODAwMkMwMDA4RjE0MDNDMDMwMDAyMzEKKzoxMDBGOTAwMDAwN0UxODIxOEM2MzhGRjgzQzAyNDAwMDAwNjIxMDI0MTAKKzoxMDBGQTAwMDE0NDAwMDA5MjQwNDAwMDEzQzAyN0ZGRjM0NDJGRkZGOEIKKzoxMDBGQjAwMDAwNjI4ODI0M0MwMTAwMDIwMDNFMDgyMUFDMzE4RkYwMjEKKzoxMDBGQzAwMDEwMDAwMTI0MDIyMDEwMjEwMDAwMjgyMTBDMDA0NTdDODMKKzoxMDBGRDAwMDI3QTYwMDE4MjQwNDAwMDEwMDAwMjgyMTBDMDA0NTdDRUQKKzoxMDBGRTAwMDI3QTYwMDE4MjQwNDAwMDEyNDA1MDAwMTI3QjIwMDIwRDAKKzoxMDBGRjAwMDBDMDA0NTdDMDI0MDMwMjEyNDA0MDAwMTI0MDUwMDAxM0UKKzoxMDEwMDAwMDBDMDA0NTdDMDI0MDMwMjEyNDA0MDAwMTI0MDUwMDA0MkEKKzoxMDEwMTAwMDI3QjEwMDFFMEMwMDQ1N0MwMjIwMzAyMTI0MDQwMDAxNzEKKzoxMDEwMjAwMDI0MDUwMDA0MEMwMDQ1N0MwMjIwMzAyMTI0MDQwMDAxMkEKKzoxMDEwMzAwMDI0MDUwMDA1MjdCMDAwMjIwQzAwNDU3QzAyMDAzMDIxNjkKKzoxMDEwNDAwMDI0MDQwMDAxMjQwNTAwMDUwQzAwNDU3QzAyMDAzMDIxMjkKKzoxMDEwNTAwMDI0MDQwMDAxMjQwNTAwMTAwQzAwNDU3QzI3QTYwMDE4N0MKKzoxMDEwNjAwMDI0MDQwMDAxMjQwNTAwMTAwQzAwNDU3QzI3QTYwMDE4NkMKKzoxMDEwNzAwMDI0MDQwMDAxMjQwNTAwMEEwQzAwNDU3QzAyNDAzMDIxQjQKKzoxMDEwODAwMDI0MDQwMDAxMjQwNTAwMEEwQzAwNDU3QzAyNDAzMDIxQTQKKzoxMDEwOTAwMDI0MDQwMDAxMjQwNTAwMTgwQzAwNDU3QzAyMjAzMDIxQTYKKzoxMDEwQTAwMDI0MDQwMDAxMjQwNTAwMTgwQzAwNDU3QzAyMjAzMDIxOTYKKzoxMDEwQjAwMDI0MDQwMDAxMjQwNTAwMDEwQzAwNDU3QzI3QTYwMDE4MkIKKzoxMDEwQzAwMDI0MDQwMDAxMjQwNTAwMDEwQzAwNDU3QzI3QTYwMDE4MUIKKzoxMDEwRDAwMDk3QTIwMDE4MzA0MjAwMDQxMDQwMDA2NjNDMTE0MDAwMDYKKzoxMDEwRTAwMDNDMDMwMDAxOEM2MzZGMzQyNDAyMDAwNTE0NjIwMDY3MjYKKzoxMDEwRjAwMDI0MDQwMDAxMjQwNTAwMTkyN0IwMDAxQzBDMDA0NTdDQzUKKzoxMDExMDAwMDAyMDAzMDIxMjQwNDAwMDEyNDA1MDAxOTBDMDA0NTdDNTQKKzoxMDExMTAwMDAyMDAzMDIxOTdBMjAwMUMzMDQzMDcwMDI0MDIwNDAwODMKKzoxMDExMjAwMDEwNjIwMDI3Mjg2MjA0MDExMDQwMDAwRTI0MDIwMjAwMTEKKzoxMDExMzAwMDEwNjIwMDFGMjg2MjAyMDExMDQwMDAwNTI0MDIwMTAwMTUKKzoxMDExNDAwMDUwNjIwMDFFM0MxMzAwMDExMDAwMDAxRTNDMDIwMDA0MEYKKzoxMDExNTAwMDI0MDIwMzAwNTA2MjAwMTkzQzEzMDAwMjEwMDAwMDE5MjEKKzoxMDExNjAwMDNDMDIwMDA0MjQwMjA2MDAxMDYyMDAwRDI4NjIwNjAxMDEKKzoxMDExNzAwMDEwNDAwMDA1MjQwMjA1MDA1MDYyMDAwQjNDMTMwMDAyRTEKKzoxMDExODAwMDEwMDAwMDEwM0MwMjAwMDQyNDAyMDcwMDE0NjIwMDBENEQKKzoxMDExOTAwMDNDMDIwMDA0M0MxMzAwMDQxMDAwMDAwQTNDMTUwMDA4NDcKKzoxMDExQTAwMDEwMDAwMDA2M0MxMzAwMDQxMDAwMDAwNTNDMTUwMDA4NjgKKzoxMDExQjAwMDNDMTMwMDAxMTAwMDAwMDIzQzE1MDAwODNDMTUwMDEwMTMKKzoxMDExQzAwMDNDMDIwMDA0MTI2MjAwMTczQzAyODAwMDhGODIwMDU0MkYKKzoxMDExRDAwMDI0MTAwMDAxM0MwMTAwMDFBQzMwNkQ5QzNDMDEwMDAxNzkKKzoxMDExRTAwMEFDMzA2RDk4M0MwMTAwMDFBQzMwNkRBNDNDMDEwMDAxQjUKKzoxMDExRjAwMEFDMzA2RTI0M0MwMTAwMDFBQzIyNkYzMDNDMDIwMDAxOTcKKzoxMDEyMDAwMDE2NjIwMDIyMDI3NTg4MjUwMDAwMjAyMTAwMDAyODIxOTYKKzoxMDEyMTAwMDBDMDA0RERCMzQwNjgwMDAzQzAxMDAwMTEwMDAwMDFCNzcKKzoxMDEyMjAwMEFDMzA2RTIwMDIyMjEwMjUwMkIzMTgyNTAwNDM4ODI1MTkKKzoxMDEyMzAwMDk3QTYwMDFDM0MwMjAwMDE4QzQyNkYxQzNDMDcwMDAxNzkKKzoxMDEyNDAwMDhDRTc2RDk4M0MwNDAwMDEyNDg0NkM1Q0FGQTIwMDEwMTQKKzoxMDEyNTAwMDk3QTIwMDFFM0MwNTAwMEMzNEE1MDMyMzNDMDEwMDAxQUQKKzoxMDEyNjAwMEFDMjA2RTIwMEMwMDJCM0JBRkEyMDAxNDEwMDAwMDA3MzYKKzoxMDEyNzAwMDAwMDAwMDAwM0MxMTAwMDIwMjNFODgyMThFMzE4RkYwRjgKKzoxMDEyODAwMDNDMDI3RkZGMzQ0MkZGRkYwMjIyODgyNDNDMDIwMDAxMUYKKzoxMDEyOTAwMDhDNDI2REE4MTA0MDAwNjkwMDAwMDAwMDNDMDIwMDAxNzMKKzoxMDEyQTAwMDhDNDI2RjFDMTA0MDAwMDIzQzAyMjAwMDAyMjI4ODI1NjQKKzoxMDEyQjAwMDhGQTgwMDJDMDAwODExNDAzQzAxMDAwMjAwMjIwODIxRTgKKzoxMDEyQzAwMDhDMjI5MDA0MTA0MDAwMDMzQzAyMDAyMDEwMDAwMDA1MTYKKzoxMDEyRDAwMDAyMjI4ODI1M0MwMkZGREYzNDQyRkZGRjAyMjI4ODI0REQKKzoxMDEyRTAwMDhGQTgwMDJDMDAwODExNDAzQzAxMDAwMjAwMjIwODIxQjgKKzoxMDEyRjAwMDhDMjI5MDBDMTA0MDAwMDMzQzAyMDA4MDEwMDAwMDRGMzQKKzoxMDEzMDAwMDAyMjI4ODI1M0MwMkZGN0YzNDQyRkZGRjEwMDAwMDRCODEKKzoxMDEzMTAwMDAyMjI4ODI0OEZBODAwMkMwMDA4Mjk0MDNDMDMwMDAyRTgKKzoxMDEzMjAwMDAwNjUxODIxOEM2MzhGRjgzQzAyNDAwMDAwNjIxMDI0OTUKKzoxMDEzMzAwMDE0NDAwMDA4M0MwMjdGRkYzNDQyRkZGRjAwNjI4ODI0MTMKKzoxMDEzNDAwMDNDMDEwMDAyMDAyNTA4MjFBQzMxOEZGMDEwMDAwMDQxNjMKKzoxMDEzNTAwMDAyMjAxMDIxM0MwMjAwMDE4QzQyNkRBODEwNDAwMDM0OTQKKzoxMDEzNjAwMDNDMTFDMDBDM0MwMjAwMDE4QzQyNkU0NDNDMDRDMDBDOTkKKzoxMDEzNzAwMDM0ODQyMDAwM0MwMzAwMDE4QzYzNkYxQzAwMDIxMDJCOUUKKzoxMDEzODAwMDAwMDIxMDIzMDA0NDEwMjQxMDYwMDAwMzAwNTE4ODI1M0YKKzoxMDEzOTAwMDNDMDIyMDAwMDIyMjg4MjUzQzAyMDAwMjAwNDUxMDIxNjgKKzoxMDEzQTAwMDhDNDI5MDA0MTA0MDAwMDMzQzAyMDAyMDEwMDAwMDA0MTYKKzoxMDEzQjAwMDAyMjI4ODI1M0MwMkZGREYzNDQyRkZGRjAyMjI4ODI0RkMKKzoxMDEzQzAwMDhGQTgwMDJDMDAwODExNDAzQzAxMDAwMjAwMjIwODIxRDcKKzoxMDEzRDAwMDhDMjI5MDBDMTA0MDAwMDMzQzAyMDA4MDEwMDAwMDA0OUUKKzoxMDEzRTAwMDAyMjI4ODI1M0MwMkZGN0YzNDQyRkZGRjAyMjI4ODI0MkMKKzoxMDEzRjAwMDNDMDIwMDAxOEM0MjZFMzAxMDQwMDAwMjNDMDIwODAwQUEKKzoxMDE0MDAwMDAyMjI4ODI1M0MwMjAwMDE4QzQyNkUzNDEwNDAwMDAyMEEKKzoxMDE0MTAwMDNDMDIwNDAwMDIyMjg4MjUzQzAyMDAwMThDNDI2RTM4MDYKKzoxMDE0MjAwMDEwNDAwMDA2M0MwMjAxMDAxMDAwMDAwNDAyMjI4ODI1NDIKKzoxMDE0MzAwMDNDMDI3RkZGMzQ0MkZGRkYwMDYyODgyNDhGQTgwMDJDMEIKKzoxMDE0NDAwMDAwMDgxMTQwM0MwMTAwMDIwMDIyMDgyMUFDMzE4RkYwNUQKKzoxMDE0NTAwMDAyMjAxMDIxOEZCRjAwNDg4RkJFMDA0NDhGQjUwMDQwOEUKKzoxMDE0NjAwMDhGQjMwMDNDOEZCMjAwMzg4RkIxMDAzNDhGQjAwMDMwQTIKKzoxMDE0NzAwMDAzRTAwMDA4MjdCRDAwNTAyN0JERkZEMEFGQjIwMDI4MTEKKzoxMDE0ODAwMDAwODA5MDIxQUZCRjAwMkNBRkIxMDAyNEFGQjAwMDIwOEUKKzoxMDE0OTAwMDhGODQwMjAwM0MxMDAwMDE4RTEwNkQ5ODhGODYwMjIwMTAKKzoxMDE0QTAwMDI0MDIwMDAyMTIwMjAwNUMyRTAyMDAwMzEwNDAwMDA1MUMKKzoxMDE0QjAwMDI0MDIwMDAxMTIwMjAwMEEwMDEyMTk0MDEwMDAwMTBDNUYKKzoxMDE0QzAwMDAwMDAwMDAwMjQwMjAwMDQxMjAyMDBCRjI0MDIwMDA4RjEKKzoxMDE0RDAwMDEyMDIwMEJFMDAxMjg5NDAxMDAwMDEwNTAwMDAwMDAwNDkKKzoxMDE0RTAwMDNDMDUwMDAyMDBBMzI4MjE4Q0E1OEZGQzNDMTAwMDAyQzMKKzoxMDE0RjAwMDAyMDM4MDIxOEUxMDhGRjQzQzAyNDAwMDAwQTIxMDI0RDEKKzoxMDE1MDAwMDEwNDAwMDM4M0MwMjAwMDgwMjAyMTAyNDEwNDAwMDIwNjUKKzoxMDE1MTAwMDM0ODQwMDAyM0MwMjAwMDIwMDQzMTAyMThDNDI5MDAwRkYKKzoxMDE1MjAwMDEwNDAwMDA1MzQ4NDAwMjAzNDg0MDEwMDNDMDIwMDIwNzcKKzoxMDE1MzAwMDEwMDAwMDA2MDIwMjgwMjUyNDAyRkVGRjAwODIyMDI0MDMKKzoxMDE1NDAwMDNDMDJGRkRGMzQ0MkZGRkYwMjAyODAyNDAwMTIxMTQwMDAKKzoxMDE1NTAwMDNDMDEwMDAyMDAyMjA4MjE4QzIyOTAwODEwNDAwMDA1NjYKKzoxMDE1NjAwMDNDMDIwMDAxMDBDMjMwMjUzQzAyMDA4MDEwMDAwMDE2NDEKKzoxMDE1NzAwMDAyMDI4MDI1M0MwMkZGRkUzNDQyRkZGRjAwQzIzMDI0RkQKKzoxMDE1ODAwMDNDMDJGRjdGMzQ0MkZGRkYxMDAwMDAwRjAyMDI4MDI0NjQKKzoxMDE1OTAwMDI0MDJGRURGMDA4MjIwMjQzQzAyRkZGRTM0NDJGRkZGRDMKKzoxMDE1QTAwMDAwQzIzMDI0M0MwMkZGNUYzNDQyRkZGRjAyMDI4MDI0NkQKKzoxMDE1QjAwMDNDMDEwMDAyMDAyMzA4MjFBQzIwOTAwMDNDMDEwMDAyMDUKKzoxMDE1QzAwMDAwMjMwODIxQUMyMDkwMDhBRjg0MDIwMEFGODYwMjIwREYKKzoxMDE1RDAwMDhGODIwMjIwMzQ0MjAwMDJBRjgyMDIyMDEwMDAwMDBBRjMKKzoxMDE1RTAwMDAwMTIxMTQwM0MwMkJGRkYzNDQyRkZGRjhGODMwMjAwMTQKKzoxMDE1RjAwMDAyMDI4MDI0MjQwMkZGRkQwMDYyMTgyNDBDMDAzREFGOEIKKzoxMDE2MDAwMEFGODMwMjAwMDAxMjExNDAzQzAxMDAwMjAwMjIwODIxQjkKKzoxMDE2MTAwMDEwMDAwMEI3QUMzMDhGRjQzQzAyMDAwMThDNDI2RjFDMEMKKzoxMDE2MjAwMDEwNDAwMDY5MjQwNTAwMDQyNDA0MDAwMTBDMDA0NTdDREUKKzoxMDE2MzAwMDI3QTYwMDE4MjQwNDAwMDEyNDA1MDAwNTBDMDA0NTdDQTEKKzoxMDE2NDAwMDI3QTYwMDFBOTdBMzAwMTg5N0EyMDAxQTNDMDQwMDAxQ0QKKzoxMDE2NTAwMDI0ODQ2RTQ4MzA2MzBDMDAwMDAzMUE4MjMwNDIwQzAwNzAKKzoxMDE2NjAwMDAwMDIxMjgyQTdBMjAwMUEwMDAyMTA4MDAwNDQxMDIxN0EKKzoxMDE2NzAwMDAwNDMxMDIxQTdBMzAwMTg5MDQ4MDAwMDI0MDIwMDAxOTUKKzoxMDE2ODAwMDMxMDNGRkZGMTA2MjAwMjkyODYyMDAwMjEwNDAwMDA1QUMKKzoxMDE2OTAwMDAwMDAwMDAwMTA2MDAwMDkwMDAwMDAwMDEwMDAwMDNEODQKKzoxMDE2QTAwMDAwMDAwMDAwMTA3MDAwMTMyNDAyMDAwMzEwNjIwMDJDRTAKKzoxMDE2QjAwMDAwMDAwMDAwMTAwMDAwMzcwMDAwMDAwMDhGODIwMjAwRDAKKzoxMDE2QzAwMDI0MDNGRUZGMDA0MzEwMjRBRjgyMDIwMDhGODIwMjIwMTkKKzoxMDE2RDAwMDNDMDNGRkZFMzQ2M0ZGRkYwMDQzMTAyNEFGODIwMjIwNkYKKzoxMDE2RTAwMDNDMDEwMDAyQUMyMDkwMDQzQzAxMDAwMjEwMDAwMDMyREEKKzoxMDE2RjAwMEFDMjA5MDBDOEY4MjAyMDAzNDQyMDEwMEFGODIwMjAwQzUKKzoxMDE3MDAwMDhGODIwMjIwM0MwM0ZGRkUzNDYzRkZGRjAwNDMxMDI0NUUKKzoxMDE3MTAwMEFGODIwMjIwMjQwMjAxMDAzQzAxMDAwMkFDMjI5MDA0QUUKKzoxMDE3MjAwMDNDMDEwMDAyMTAwMDAwMjRBQzIwOTAwQzhGODIwMjAwQ0IKKzoxMDE3MzAwMDI0MDNGRUZGMDA0MzEwMjRBRjgyMDIwMDhGODIwMjIwQTgKKzoxMDE3NDAwMDNDMDMwMDAxMDA0MzEwMjVBRjgyMDIyMDNDMDEwMDAyNEYKKzoxMDE3NTAwMEFDMjA5MDA0M0MwMTAwMDIxMDAwMDAxN0FDMjM5MDBDNTgKKzoxMDE3NjAwMDhGODIwMjAwMzQ0MjAxMDBBRjgyMDIwMDhGODIwMjIwODkKKzoxMDE3NzAwMDNDMDMwMDAxMDA0MzEwMjVBRjgyMDIyMDI0MDIwMTAwMzcKKzoxMDE3ODAwMDNDMDEwMDAyQUMyMjkwMDQzQzAxMDAwMjEwMDAwMDBBNUYKKzoxMDE3OTAwMEFDMjM5MDBDM0MwNDAwMDEyNDg0NkM4MDk3QTYwMDFBQjIKKzoxMDE3QTAwMDk3QTcwMDE4M0MwNTAwMDEzNEE1RkZGRkFGQTgwMDEwNjMKKzoxMDE3QjAwMDBDMDAyQjNCQUZBMDAwMTQ4RjgyMDIwMDM0NDIwMDAyQzkKKzoxMDE3QzAwMDEwMDAwMDRCQUY4MjAyMDAwMDEyODk0MDNDMDUwMDAyNkQKKzoxMDE3RDAwMDAwQjEyODIxOENBNThGRjgzQzEwMDAwMjAyMTE4MDIxNTUKKzoxMDE3RTAwMDhFMTA4RkYwM0MwMjQwMDAwMEEyMTAyNDE0NDAwMDEwMjQKKzoxMDE3RjAwMDAwMDAwMDAwM0MwMjAwMDE4QzQyNkYxQzE0NDAwMDA1RjgKKzoxMDE4MDAwMDNDMDJCRkZGOEY4MjAyMDAzNDQyMDAwMkFGODIwMjAwMUUKKzoxMDE4MTAwMDNDMDJCRkZGMzQ0MkZGRkYwQzAwM0RBRjAyMDI4MDI0QjgKKzoxMDE4MjAwMDNDMDEwMDAyMDAzMTA4MjExMDAwMDAzMUFDMzA4RkYwODMKKzoxMDE4MzAwMDNDMDIwMDAxOEM0MjZGMUMxMDQwMDAwNTNDMDIwMDIwNUQKKzoxMDE4NDAwMDNDMDIwMDAxOEM0MjZFNDQxMDQwMDAyNTNDMDIwMDIwMDYKKzoxMDE4NTAwMDAwQTIxMDI0MTA0MDAwMDczNDg0MDAyMDI0MDIwMTAwNUMKKzoxMDE4NjAwMDNDMDEwMDAyMDAzMTA4MjFBQzIyOTAwNDEwMDAwMDA2NjcKKzoxMDE4NzAwMDM0ODQwMTAwM0MwMTAwMDIwMDMxMDgyMUFDMjA5MDA0QjYKKzoxMDE4ODAwMDI0MDJGRUZGMDA4MjIwMjQzQzAyMDA4MDAwQTIxMDI0REIKKzoxMDE4OTAwMDEwNDAwMDA3MDAxMjE5NDAzQzAyMDAwMTNDMDEwMDAyMDgKKzoxMDE4QTAwMDAwMjMwODIxQUMyMjkwMEMxMDAwMDAwODAwQzIzMDI1NTMKKzoxMDE4QjAwMDAwMTIxMTQwM0MwMTAwMDIwMDIyMDgyMUFDMjA5MDBDRDMKKzoxMDE4QzAwMDNDMDJGRkZFMzQ0MkZGRkYwMEMyMzAyNEFGODQwMjAwMUUKKzoxMDE4RDAwMEFGODYwMjIwOEY4MjAyMjAzNDQyMDAwMkFGODIwMjIwQjMKKzoxMDE4RTAwMDAwMTIxMTQwM0MwMTAwMDIwMDIyMDgyMUFDMzA4RkYwQjAKKzoxMDE4RjAwMDhGQkYwMDJDOEZCMjAwMjg4RkIxMDAyNDhGQjAwMDIwNDIKKzoxMDE5MDAwMDAzRTAwMDA4MjdCRDAwMzAwMDAwMDAwMDAwMDAxODIxOUYKKzoxMDE5MTAwMDMwODQwMEZGMjQwNUZGREYyNDA2RkZCRjAwNjQxMDA3QUEKKzoxMDE5MjAwMDMwNDIwMDAxMTA0MDAwMDQwMDAwMDAwMDhGODIwMDQ0OUIKKzoxMDE5MzAwMDEwMDAwMDAzMzQ0MjAwNDA4RjgyMDA0NDAwNDYxMDI0MEYKKzoxMDE5NDAwMEFGODIwMDQ0OEY4MjAwNDQzNDQyMDAyMEFGODIwMDQ0QzIKKzoxMDE5NTAwMDhGODIwMDQ0MDA0NTEwMjRBRjgyMDA0NDI0NjMwMDAxQkMKKzoxMDE5NjAwMDI4NjIwMDA4NTQ0MEZGRUUwMDY0MTAwNzAzRTAwMDA4RkUKKzoxMDE5NzAwMDAwMDAwMDAwMkM4MjAwMDgxMDQwMDAxQjAwMDAwMDAwNDYKKzoxMDE5ODAwMDI0MDVGRkRGMjQwNkZGQkYwMDA0MTg4MDNDMDIwMDAxOEQKKzoxMDE5OTAwMDI0NDI2RTYwMDA2MjE4MjEyNDY0MDAwNDkwNjIwMDAwRkEKKzoxMDE5QTAwMDEwNDAwMDA0MDAwMDAwMDA4RjgyMDA0NDEwMDAwMDAzN0IKKzoxMDE5QjAwMDM0NDIwMDQwOEY4MjAwNDQwMDQ2MTAyNEFGODIwMDQ0MkQKKzoxMDE5QzAwMDhGODIwMDQ0MzQ0MjAwMjBBRjgyMDA0NDhGODIwMDQ0NjIKKzoxMDE5RDAwMDAwNDUxMDI0QUY4MjAwNDQyNDYzMDAwMTAwNjQxMDJCRjIKKzoxMDE5RTAwMDE0NDBGRkVFMDAwMDAwMDAwM0UwMDAwODAwMDAwMDAwQ0IKKzoxMDE5RjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDhGODQwMEM0MTAKKzoxMDFBMDAwMDhGODYwMEUwOEY4NzAwRTQyNDAyRkZGODAwQzIyODI0QkMKKzoxMDFBMTAwMDEwRTUwMDFBMjc2MjNGRjgxNEUyMDAwMjI0RTgwMDA4RUIKKzoxMDFBMjAwMDI3NjgzMDAwNTUwNTAwMDQ4RDBBMDAwMDMwQzIwMDA0MEMKKzoxMDFBMzAwMDE0NDAwMDEyMDA4MDUwMjE4Q0U5MDAwMDhGNDIwMTNDQ0MKKzoxMDFBNDAwMDAxNDk0ODIzMDA0OTE4MkI5NEVCMDAwNjEwNjAwMDAyNUUKKzoxMDFBNTAwMDI1NjMwMDUwMDA0OTQ4MjEwMTIzMTgyQjUwNDAwMDAzMDIKKzoxMDFBNjAwMDhGNDIwMUZDMDNFMDAwMDgwMEUwMTAyMUFGODgwMEU4OEQKKzoxMDFBNzAwMDI0NDIwMDAxQUY0MjAxRkNBRjg4MDBFNDAzRTAwMDA4MEIKKzoxMDFBODAwMDAwMDAxMDIxMDNFMDAwMDgwMDAwMDAwMDhGODMwMEU0NDQKKzoxMDFBOTAwMDI3NjIzRkY4MTA2MjAwMDQyNDYyMDAwOEFGODIwMEU4NjkKKzoxMDFBQTAwMDAzRTAwMDA4QUY4MjAwRTQyNzYyMzAwMEFGODIwMEU4NjQKKzoxMDFBQjAwMDAzRTAwMDA4QUY4MjAwRTQwM0UwMDAwODAwMDAwMDAwM0IKKzoxMDFBQzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDhGODgwMTIwREUKKzoxMDFBRDAwMDI3NjI0RkUwOEY4MzAxMjgxNTAyMDAwMjI1MDkwMDIwQUMKKzoxMDFBRTAwMDI3Njk0ODAwMTEyMzAwMTI4RkEyMDAxMEFEMDQwMDAwRTYKKzoxMDFBRjAwMEFEMDUwMDA0QUQwNjAwMDhBNTA3MDAwRThGQTMwMDE0NzUKKzoxMDFCMDAwMEFEMDIwMDE4OEZBMjAwMThBRDAzMDAxQzI1MDMwMDE2QkIKKzoxMDFCMTAwMEFEMDIwMDEwQUQwMzAwMTRBRjg5MDEyMDhGNDMwMEZDMUIKKzoxMDFCMjAwMDI0MDIwMDAxMjQ2M0ZGRkYwM0UwMDAwOEFGNDMwMEZDMzAKKzoxMDFCMzAwMDhGNDMwMzI0MDAwMDEwMjEyNDYzMDAwMTAzRTAwMDA4MDgKKzoxMDFCNDAwMEFGNDMwMzI0MDNFMDAwMDgwMDAwMDAwMDhGODgwMTAwNzkKKzoxMDFCNTAwMDI3NjI0N0UwOEY4MzAxMDgxNTAyMDAwMjI1MDkwMDIwNTMKKzoxMDFCNjAwMDI3Njk0MDAwMTEyMzAwMEY4RkEyMDAxMEFEMDQwMDAwNzAKKzoxMDFCNzAwMEFEMDUwMDA0QUQwNjAwMDhBNTA3MDAwRThGQTMwMDE0RjQKKzoxMDFCODAwMEFEMDIwMDE4OEZBMjAwMThBRDAzMDAxQzI1MDMwMDE2M0IKKzoxMDFCOTAwMEFEMDIwMDEwQUQwMzAwMTRBRjg5MDEwMDAzRTAwMDA4OUUKKzoxMDFCQTAwMDI0MDIwMDAxOEY0MzAzMjgwMDAwMTAyMTI0NjMwMDAxNTgKKzoxMDFCQjAwMDAzRTAwMDA4QUY0MzAzMjgwM0UwMDAwODAwMDAwMDAwMzIKKzoxMDFCQzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDI0NDg2NTYxRTMKKzoxMDFCRDAwMDY0NjU3MjNBMjAyRjcwNzI2RjZBNjU2Mzc0NzMyRjcyMzYKKzoxMDFCRTAwMDYzNzMyRjczNzcyRjY3NjUyRjJFMkY2RTY5NjMyRjY2QjAKKzoxMDFCRjAwMDc3MzIyRjYzNkY2RDZENkY2RTJGNjY3NzZENjE2OTZFRDMKKzoxMDFDMDAwMDJFNjMyQzc2MjAzMTJFMzEyRTMyMkUzNDM1MjAzMTM5NzAKKzoxMDFDMTAwMDM5MzkyRjMwMzEyRjMyMzQyMDMwMzAzQTMxMzAzQTM1QTMKKzoxMDFDMjAwMDM1MjA3MzY4NzU2MTZFNjcyMDQ1Nzg3MDIwMjQwMDAwNDgKKzoxMDFDMzAwMDY1NzY3NDUyNkU2NzQ2MDA1MTY1NzY3NDQ2MDAwMDAwMDIKKzoxMDFDNDAwMDUxNjU3Njc0NTA1RjQ2MDA0RDY1NzY3NDUyNkU2NzQ2RjYKKzoxMDFDNTAwMDAwMDAwMDAwNEQ1MTY1NzY3NDQ2MDAwMDRENTE2NTc2RDgKKzoxMDFDNjAwMDUwNUY0NjAwNTE3MzQzNkY2RTQ5NUY0NjAwMDAwMDAwQUQKKzoxMDFDNzAwMDUxNzM0MzZGNkU3MzQ2MDA1MTcyNTA3MjZGNjQ0NjAwMjkKKzoxMDFDODAwMDYyNjE2NDRENjU2RDUzN0EwMDAwMDAwMDY4Nzc1NjY1QTcKKzoxMDFDOTAwMDcyMDAwMDAwNjI2MTY0NDg3NzU2NjU3MjAwMDAwMDAwQkYKKzoxMDFDQTAwMDJBMkE0NDQxNTc0RTVGNDEwMDAwMDAwMDc0Nzg1Mjc4NjAKKzoxMDFDQjAwMDQyNjY1MzdBMDAwMDAwMDA2MjY2NDE3NDZFNEQ3MjZCOUEKKzoxMDFDQzAwMDAwMDAwMDAwNzI2NTY0NUE2RjZFNjUzMTAwMDAwMDAwMEMKKzoxMDFDRDAwMDcwNjM2OTQzNkY2RTY2MDA2NzY1NkU0MzZGNkU2NjAwODIKKzoxMDFDRTAwMDJBNjQ2RDYxNTI0NDY2NkMwMDAwMDAwMDJBNTA0MTRFMjcKKzoxMDFDRjAwMDQ5NDMyQTAwMkUyRTJGMkUyRTJGMkUyRTJGMkUyRTJGMDIKKzoxMDFEMDAwMDJFMkUyRjczNzI2MzJGNkU2OTYzMkY2Njc3MzIyRjYzQzcKKzoxMDFEMTAwMDZGNkQ2RDZGNkUyRjY2Nzc2RDYxNjk2RTJFNjMwMDAwNUIKKzoxMDFEMjAwMDcyNjM2MjQ2NkM2MTY3NzMwMDAwMDAwMDYyNjE2NDUyMTYKKzoxMDFEMzAwMDc4NTI2MzYyMDAwMDAwMDA2NzZDNkY2MjQ2NkM2NzczRTQKKzoxMDFENDAwMDAwMDAwMDAwMkI1RjY0Njk3MzcwNUY2QzZGNkY3MDAwNDAKKzoxMDFENTAwMDJCNjU3NjVGNjg2MTZFNjQ2QzY1NzIwMDYzNjE2RTc0OUEKKzoxMDFENjAwMDMxNDQ2RDYxMDAwMDAwMDAyQjcxNUY2NDZENjE1Rjc0MzAKKzoxMDFENzAwMDZGNUY2RTY5NjM1RjYzNkI3Mzc1NkQwMDJCNjg1RjczNzQKKzoxMDFEODAwMDY1NkU2NDVGNjQ2MTc0NjE1RjcyNjU2MTY0Nzk1RjYzRUQKKzoxMDFEOTAwMDZCNzM3NTZEMDAwMDAwMDAyQjY4NUY2NDZENjE1RjcyOEUKKzoxMDFEQTAwMDY0NUY2MTczNzM2OTczNzQ1RjYzNkI3Mzc1NkQwMDAwNTcKKzoxMDFEQjAwMDc0NDM2QjczNkQ0RjZFMDAyQjcxNUY2NDZENjE1Rjc0NjQKKzoxMDFEQzAwMDZGNUY2RTY5NjMwMDAwMDAyQjY4NUY3MzY1NkU2NDVGMTAKKzoxMDFERDAwMDY0NjE3NDYxNUY3MjY1NjE2NDc5MDAwMDJCNjg1RjY0OUYKKzoxMDFERTAwMDZENjE1RjcyNjQ1RjYxNzM3MzY5NzM3NDAwMDAwMDAwRkEKKzoxMDFERjAwMDc0NDM2QjczNkQ0RjY2NjYwMDAwMDAwMDJCNjg1RjczNjEKKzoxMDFFMDAwMDY1NkU2NDVGNjI2NDVGNzI2NTYxNjQ3OTAwMDAwMDAwMDIKKzoxMDFFMTAwMDY4NzM3NDUzNTI2OTZFNjcwMDAwMDAwMDYyNjE2NDUzMTYKKzoxMDFFMjAwMDUyNjk2RTY3MDAwMDAwMDA2RTY5NjM1MzUyNjk2RTY3MDUKKzoxMDFFMzAwMDAwMDAwMDAwNzc0NDZENjE0MTZDNkM0MTAwMDAwMDAwQkYKKzoxMDFFNDAwMDJCNzE1RjY0NkQ2MTVGNzQ2RjVGNjg2RjczNzQ1RjYzNDQKKzoxMDFFNTAwMDZCNzM3NTZEMDAwMDAwMDAyQjY4NUY2RDYxNjM1RjcyQ0UKKzoxMDFFNjAwMDc4NUY2MzZGNkQ3MDVGNjM2QjczNzU2RDAwMDAwMDAwNkEKKzoxMDFFNzAwMDJCNjg1RjY0NkQ2MTVGNzc3MjVGNjE3MzczNjk3Mzc0MDAKKzoxMDFFODAwMDVGNjM2QjczNzU2RDAwMDA3MjQzNkI3MzZENEY2RTAwMTMKKzoxMDFFOTAwMDJCNzE1RjY0NkQ2MTVGNzQ2RjVGNjg2RjczNzQwMDAwQjYKKzoxMDFFQTAwMDJCNjg1RjZENjE2MzVGNzI3ODVGNjM2RjZENzAwMDAwQjgKKzoxMDFFQjAwMDJCNjg1RjY0NkQ2MTVGNzc3MjVGNjE3MzczNjk3Mzc0QzAKKzoxMDFFQzAwMDAwMDAwMDAwNzI0MzZCNzM2RDRGNjY2NjAwMDAwMDAwRjcKKzoxMDFFRDAwMDJCNjg1RjcyNjU2Mzc2NUY2MjY0NUY3MjY1NjE2NDc5QzcKKzoxMDFFRTAwMDAwMDAwMDAwMkI2ODVGNzI2NTYzNzY1RjZBNzU2RDYyNDMKKzoxMDFFRjAwMDZGNUY2MjY0NUY3MjY1NjE2NDc5MDAwMDJCNjg1RjcyNzYKKzoxMDFGMDAwMDY1NjM3NjVGNkQ2OTZFNjk1RjYyNjQ1RjcyNjU2MTY0NjcKKzoxMDFGMTAwMDc5MDAwMDAwMkI2RDY4NUY2MzZGNkQ2RDYxNkU2NDAwMEEKKzoxMDFGMjAwMDJCNjg1Rjc0Njk2RDY1NzIwMDAwMDAwMDJCNjg1RjY0NDgKKzoxMDFGMzAwMDZGNUY3NTcwNjQ2MTc0NjU1Rjc0Nzg1RjYzNkY2RTczRjMKKzoxMDFGNDAwMDAwMDAwMDAwMkI2ODVGNjQ2RjVGNzU3MDY0NjE3NDY1RUEKKzoxMDFGNTAwMDVGNzI3ODVGNzA3MjZGNjQwMDAwMDAwMDJCNjM2QjczQjgKKzoxMDFGNjAwMDc1NkQzMTM2MDAwMDAwMDAyQjcwNjU2NTZCNUY2RDYxMkIKKzoxMDFGNzAwMDYzNUY3Mjc4NUY3NzYxMDAyQjcwNjU2NTZCNUY2RDYxODEKKzoxMDFGODAwMDYzNUY3Mjc4MDAwMDAwMDAyQjY0NjU3MTVGNkQ2MTYzQjAKKzoxMDFGOTAwMDVGNzI3ODAwMkI2ODVGNkQ2MTYzNUY3Mjc4NUY2MTc0NTgKKzoxMDFGQTAwMDc0NkUwMDAwNjI2MTY0NTI2NTc0NTM3QTAwMDAwMDAwMzAKKzoxMDFGQjAwMDcyNzg0MjY0NDI2NjUzN0EwMDAwMDAwMDJCNkU3NTZDQTIKKzoxMDFGQzAwMDZDNUY2ODYxNkU2NDZDNjU3MjAwMDAwMDY2Nzc0RjcwQ0MKKzoxMDFGRDAwMDQ2NjE2OTZDMDAwMDAwMDAyQjY4NUY3NTcwNjQ2MTc0NzUKKzoxMDFGRTAwMDY1NUY2QzY1NjQzNDAwMDAyQjY4NUY3NTcwNjQ2MTc0QjQKKzoxMDFGRjAwMDY1NUY2QzY1NjQzNjAwMDAyQjY4NUY3NTcwNjQ2MTc0QTIKKzoxMDIwMDAwMDY1NUY2QzY1NjQzMjAwMDA2OTZFNzQ1Mzc0NjE3NDY1NTkKKzoxMDIwMTAwMDAwMDAwMDAwMkEyQTY5NkU2OTc0NDM3MDAwMDAwMDAwMDUKKzoxMDIwMjAwMDIzNzM2MzcyNjU2MTZEMDA2OTUzNzQ2MTYzNkI0NTcyRkMKKzoxMDIwMzAwMDAwMDAwMDAwNzA3MjZGNjI2NTRENjU2RDAwMDAwMDAwNjkKKzoxMDIwNDAwMDJBMkE0NDQxNTc0RTVGNDIwMDAwMDAwMDJCNzM3NzVGRkQKKzoxMDIwNTAwMDY0NkQ2MTVGNjE3MzczNjk3Mzc0NUY3MDZDNzU3MzVGRDYKKzoxMDIwNjAwMDc0Njk2RDY1NzIwMDAwMDAyQjI2NzA3MjY1NkM2RjYxN0IKKzoxMDIwNzAwMDY0NUY3NzcyNUY2NDY1NzM2MzcyMDAwMDJCMjY3MDcyMTEKKzoxMDIwODAwMDY1NkM2RjYxNjQ1RjcyNjQ1RjY0NjU3MzYzNzIwMDAwQTYKKzoxMDIwOTAwMDJCNjg1RjY4NjY1Rjc0Njk2RDY1NzIwMDI0NDg2NTYxQ0UKKzoxMDIwQTAwMDY0NjU3MjNBMjAyRjcwNzI2RjZBNjU2Mzc0NzMyRjcyNjEKKzoxMDIwQjAwMDYzNzMyRjczNzcyRjY3NjUyRjJFMkY2RTY5NjMyRjY2REIKKzoxMDIwQzAwMDc3MzIyRjYzNkY2RDZENkY2RTJGNzQ2OTZENjU3MjJFMzEKKzoxMDIwRDAwMDYzMkM3NjIwMzEyRTMxMkUzMjJFMzMzNTIwMzEzOTM5OTIKKzoxMDIwRTAwMDM5MkYzMDMxMkYzMjM3MjAzMTM5M0EzMDM5M0EzNTMwQzMKKzoxMDIwRjAwMDIwNjg2MTc5NjU3MzIwNDU3ODcwMjAyNDAwMDAwMDAwMTUKKzoxMDIxMDAwMDY1NzY3NDUyNkU2NzQ2MDA1MTY1NzY3NDQ2MDAwMDAwMkQKKzoxMDIxMTAwMDUxNjU3Njc0NTA1RjQ2MDA0RDY1NzY3NDUyNkU2NzQ2MjEKKzoxMDIxMjAwMDAwMDAwMDAwNEQ1MTY1NzY3NDQ2MDAwMDRENTE2NTc2MDMKKzoxMDIxMzAwMDUwNUY0NjAwNTE3MzQzNkY2RTQ5NUY0NjAwMDAwMDAwRDgKKzoxMDIxNDAwMDUxNzM0MzZGNkU3MzQ2MDA1MTcyNTA3MjZGNjQ0NjAwNTQKKzoxMDIxNTAwMDU0MkQ0NDZENjE1MjY0MzIwMDAwMDAwMDU0MkQ0NDZERDIKKzoxMDIxNjAwMDYxNTI2NDMxMDAwMDAwMDA1NDJENDQ2RDYxNTI2NDQyOUMKKzoxMDIxNzAwMDAwMDAwMDAwNTQyRDQ0NkQ2MTU3NzIzMjAwMDAwMDAwRDEKKzoxMDIxODAwMDU0MkQ0NDZENjE1NzcyMzEwMDAwMDAwMDU0MkQ0NDZEOTAKKzoxMDIxOTAwMDYxNTc3MjQyMDAwMDAwMDAwMDAwMDAwMDI0NDg2NTYxQTEKKzoxMDIxQTAwMDY0NjU3MjNBMjAyRjcwNzI2RjZBNjU2Mzc0NzMyRjcyNjAKKzoxMDIxQjAwMDYzNzMyRjczNzcyRjY3NjUyRjJFMkY2RTY5NjMyRjY2REEKKzoxMDIxQzAwMDc3MzIyRjYzNkY2RDZENkY2RTJGNjM2RjZENkQ2MTZFMDQKKzoxMDIxRDAwMDY0MkU2MzJDNzYyMDMxMkUzMTJFMzIyRTMyMzgyMDMxNkYKKzoxMDIxRTAwMDM5MzkzOTJGMzAzMTJGMzIzMDIwMzEzOTNBMzQzOTNBQjgKKzoxMDIxRjAwMDM0MzkyMDczNjg3NTYxNkU2NzIwNDU3ODcwMjAyNDAwM0IKKzoxMDIyMDAwMDY1NzY3NDUyNkU2NzQ2MDA1MTY1NzY3NDQ2MDAwMDAwMkMKKzoxMDIyMTAwMDUxNjU3Njc0NTA1RjQ2MDA0RDY1NzY3NDUyNkU2NzQ2MjAKKzoxMDIyMjAwMDAwMDAwMDAwNEQ1MTY1NzY3NDQ2MDAwMDRENTE2NTc2MDIKKzoxMDIyMzAwMDUwNUY0NjAwNTE3MzQzNkY2RTQ5NUY0NjAwMDAwMDAwRDcKKzoxMDIyNDAwMDUxNzM0MzZGNkU3MzQ2MDA1MTcyNTA3MjZGNjQ0NjAwNTMKKzoxMDIyNTAwMDNGNDg2MzZENjQ0RDYyNzgwMDAwMDAwMDNGNjM2RDY0MjkKKzoxMDIyNjAwMDQ4NzM3NDUzMDAwMDAwMDAzRjYzNkQ2NDRENjM0RDY0MTgKKzoxMDIyNzAwMDAwMDAwMDAwM0Y2MzZENjQ1MDcyNkY2RDAwMDAwMDAwNEQKKzoxMDIyODAwMDNGNjM2RDY0NEM2OTZFNkIwMDAwMDAwMDNGNjM2RDY0REEKKzoxMDIyOTAwMDQ1NzI3MjAwMDAwMDg2QUMwMDAwOEU1QzAwMDA4RTVDMEYKKzoxMDIyQTAwMDAwMDA4REU0MDAwMDhCNzgwMDAwOEUzMDAwMDA4RTVDMTIKKzoxMDIyQjAwMDAwMDA4NzkwMDAwMDg4MDAwMDAwODk5MDAwMDA4QTY4NzQKKzoxMDIyQzAwMDAwMDA4QTM0MDAwMDhFNUMwMDAwODg3MDAwMDA4QjI0QkYKKzoxMDIyRDAwMDAwMDA4RTVDMDAwMDhCMzQwMDAwODdCNDAwMDA4ODI0NkUKKzoxMDIyRTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDI0NDg2NTYxQkMKKzoxMDIyRjAwMDY0NjU3MjNBMjAyRjcwNzI2RjZBNjU2Mzc0NzMyRjcyMEYKKzoxMDIzMDAwMDYzNzMyRjczNzcyRjY3NjUyRjJFMkY2RTY5NjMyRjY2ODgKKzoxMDIzMTAwMDc3MzIyRjYzNkY2RDZENkY2RTJGNkQ2MzYxNzM3NDJFRTcKKzoxMDIzMjAwMDYzMkM3NjIwMzEyRTMxMkUzMjJFMzgyMDMxMzkzOTM4MzcKKzoxMDIzMzAwMDJGMzEzMjJGMzAzODIwMzAzMjNBMzMzNjNBMzMzNjIwOEMKKzoxMDIzNDAwMDczNjg3NTYxNkU2NzIwNDU3ODcwMjAyNDAwMDAwMDAwNzYKKzoxMDIzNTAwMDY1NzY3NDUyNkU2NzQ2MDA1MTY1NzY3NDQ2MDAwMDAwREIKKzoxMDIzNjAwMDUxNjU3Njc0NTA1RjQ2MDA0RDY1NzY3NDUyNkU2NzQ2Q0YKKzoxMDIzNzAwMDAwMDAwMDAwNEQ1MTY1NzY3NDQ2MDAwMDRENTE2NTc2QjEKKzoxMDIzODAwMDUwNUY0NjAwNTE3MzQzNkY2RTQ5NUY0NjAwMDAwMDAwODYKKzoxMDIzOTAwMDUxNzM0MzZGNkU3MzQ2MDA1MTcyNTA3MjZGNjQ0NjAwMDIKKzoxMDIzQTAwMDYxNjQ2NDRENjM0NDc1NzAwMDAwMDAwMDYxNjQ2NDREQjUKKzoxMDIzQjAwMDYzNDY3NTZDMDAwMDAwMDA2NDY1NkM0RDYzNEU2RjQ1QUMKKzoxMDIzQzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDI0NDg2NTYxREIKKzoxMDIzRDAwMDY0NjU3MjNBMjAyRjcwNzI2RjZBNjU2Mzc0NzMyRjcyMkUKKzoxMDIzRTAwMDYzNzMyRjczNzcyRjY3NjUyRjJFMkY2RTY5NjMyRjY2QTgKKzoxMDIzRjAwMDc3MzIyRjYzNkY2RDZENkY2RTJGNjQ2RDYxMkU2MzJDNUUKKzoxMDI0MDAwMDc2MjAzMTJFMzEyRTMyMkUzMjM0MjAzMTM5MzkzODJGODgKKzoxMDI0MTAwMDMxMzIyRjMyMzEyMDMwMzAzQTMzMzMzQTMwMzkyMDczNzEKKzoxMDI0MjAwMDY4NzU2MTZFNjcyMDQ1Nzg3MDIwMjQwMDY1NzY3NDUyNjcKKzoxMDI0MzAwMDZFNjc0NjAwNTE2NTc2NzQ0NjAwMDAwMDUxNjU3Njc0RkIKKzoxMDI0NDAwMDUwNUY0NjAwNEQ2NTc2NzQ1MjZFNjc0NjAwMDAwMDAwOEUKKzoxMDI0NTAwMDRENTE2NTc2NzQ0NjAwMDA0RDUxNjU3NjUwNUY0NjAwREIKKzoxMDI0NjAwMDUxNzM0MzZGNkU0OTVGNDYwMDAwMDAwMDUxNzM0MzZGMjQKKzoxMDI0NzAwMDZFNzM0NjAwNTE3MjUwNzI2RjY0NDYwMDczNzc0NDZERkMKKzoxMDI0ODAwMDYxNEY2NjY2MDAwMDAwMDAzMTQ0NkQ2MTRGNkUwMDAwRDAKKzoxMDI0OTAwMDczNzc0NDZENjE0RjZFMDAyMzcyNDQ2RDYxNDE1NDRFRjkKKzoxMDI0QTAwMDAwMDAwMDAwNzI0NDZENjE0MTU0NEUzMDAwMDAwMDAwOTUKKzoxMDI0QjAwMDcyNDQ2RDYxNDE1NDRFMzEwMDAwMDAwMDcyNDQ2RDYxMDAKKzoxMDI0QzAwMDM0NDc2MjAwMkE1MDQxNEU0OTQzMkEwMDJFMkUyRjJFQjcKKzoxMDI0RDAwMDJFMkYyRTJFMkYyRTJFMkYyRTJFMkY3MzcyNjMyRjZFMTkKKzoxMDI0RTAwMDY5NjMyRjY2NzczMjJGNjM2RjZENkQ2RjZFMkY2NDZEMkEKKzoxMDI0RjAwMDYxMkU2MzAwMjM3NzQ0NkQ2MTQxNTQ0RTAwMDAwMDAwNUIKKzoxMDI1MDAwMDc3NDQ2RDYxNDE1NDRFMzAwMDAwMDAwMDc3NDQ2RDYxQTYKKzoxMDI1MTAwMDQxNTQ0RTMxMDAwMDAwMDA3NzQ0NkQ2MTM0NDc2MjAwNDEKKzoxMDI1MjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDI0NDg2NTYxNzkKKzoxMDI1MzAwMDY0NjU3MjNBMjAyRjcwNzI2RjZBNjU2Mzc0NzMyRjcyQ0MKKzoxMDI1NDAwMDYzNzMyRjczNzcyRjY3NjUyRjJFMkY2RTY5NjMyRjY2NDYKKzoxMDI1NTAwMDc3MzIyRjYzNkY2RDZENkY2RTJGNzQ3MjYxNjM2NTJFQUUKKzoxMDI1NjAwMDYzMkM3NjIwMzEyRTMxMkUzMjJFMzUyMDMxMzkzOTM4RjgKKzoxMDI1NzAwMDJGMzAzOTJGMzMzMDIwMzEzODNBMzUzMDNBMzIzODIwNDUKKzoxMDI1ODAwMDczNjg3NTYxNkU2NzIwNDU3ODcwMjAyNDAwMDAwMDAwMzQKKzoxMDI1OTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDI0NDg2NTYxMDkKKzoxMDI1QTAwMDY0NjU3MjNBMjAyRjcwNzI2RjZBNjU2Mzc0NzMyRjcyNUMKKzoxMDI1QjAwMDYzNzMyRjczNzcyRjY3NjUyRjJFMkY2RTY5NjMyRjY2RDYKKzoxMDI1QzAwMDc3MzIyRjYzNkY2RDZENkY2RTJGNjQ2MTc0NjEyRTYzNTAKKzoxMDI1RDAwMDJDNzYyMDMxMkUzMTJFMzIyRTMxMzIyMDMxMzkzOTM5QkMKKzoxMDI1RTAwMDJGMzAzMTJGMzIzMDIwMzEzOTNBMzQzOTNBMzUzMTIwRDkKKzoxMDI1RjAwMDczNjg3NTYxNkU2NzIwNDU3ODcwMjAyNDAwMDAwMDAwQzQKKzoxMDI2MDAwMDQ2NTc1RjU2NDU1MjUzNDk0RjRFM0EyMDIzMzEyMDQ2OTQKKzoxMDI2MTAwMDcyNjkyMDQxNzA3MjIwMzcyMDMxMzczQTM1MzczQTM1QTgKKzoxMDI2MjAwMDMyMjA1MDQ0NTQyMDMyMzAzMDMwMDAwMDQ2NTc1RjQzNEYKKzoxMDI2MzAwMDRGNEQ1MDQ5NEM0NTVGNTQ0OTRENDUzQTIwMzEzNzNBNEEKKzoxMDI2NDAwMDM1MzczQTM1MzIwMDAwMDA0NjU3NUY0MzRGNEQ1MDQ5MDkKKzoxMDI2NTAwMDRDNDU1RjQyNTkzQTIwNjQ2NTc2NzI2MzczMDAwMDAwMEUKKzoxMDI2NjAwMDQ2NTc1RjQzNEY0RDUwNDk0QzQ1NUY0ODRGNTM1NDNBOEUKKzoxMDI2NzAwMDIwNjM2RjZENzA3NTc0NjUwMDAwMDAwMDQ2NTc1RjQzRkUKKzoxMDI2ODAwMDRGNEQ1MDQ5NEM0NTVGNDQ0RjRENDE0OTRFM0EyMDY1QUUKKzoxMDI2OTAwMDZFNjcyRTYxNjM3NDY1NkY2RTJFNjM2RjZEMDAwMDAwNTAKKzoxMDI2QTAwMDQ2NTc1RjQzNEY0RDUwNDk0QzQ1NTIzQTIwNjc2MzYzNEMKKzoxMDI2QjAwMDIwNzY2NTcyNzM2OTZGNkUyMDMyMkUzNzJFMzIwMDAwREQKKzoxMDI2QzAwMDAwMDAwMDAwMTIwNDExMDAwMDAwMDAwMDI0NDg2NTYxQjEKKzoxMDI2RDAwMDY0NjU3MjNBMjAyRjcwNzI2RjZBNjU2Mzc0NzMyRjcyMkIKKzoxMDI2RTAwMDYzNzMyRjczNzcyRjY3NjUyRjJFMkY2RTY5NjMyRjY2QTUKKzoxMDI2RjAwMDc3MzIyRjYzNkY2RDZENkY2RTJGNkQ2NTZEMkU2MzJDNEUKKzoxMDI3MDAwMDc2MjAzMTJFMzEyRTMyMkUzNTIwMzEzOTM5MzgyRjMwODYKKzoxMDI3MTAwMDM5MkYzMzMwMjAzMTM4M0EzNTMwM0EzMDM4MjA3MzY4MjkKKzoxMDI3MjAwMDc1NjE2RTY3MjA0NTc4NzAyMDI0MDAwMDI0NDg2NTYxM0IKKzoxMDI3MzAwMDY0NjU3MjNBMjAyRjcwNzI2RjZBNjU2Mzc0NzMyRjcyQ0EKKzoxMDI3NDAwMDYzNzMyRjczNzcyRjY3NjUyRjJFMkY2RTY5NjMyRjY2NDQKKzoxMDI3NTAwMDc3MzIyRjYzNkY2RDZENkY2RTJGNzM2NTZFNjQyRTYzQUUKKzoxMDI3NjAwMDJDNzYyMDMxMkUzMTJFMzIyRTM0MzQyMDMxMzkzOTM4MjYKKzoxMDI3NzAwMDJGMzEzMjJGMzIzMTIwMzAzMDNBMzMzMzNBMzEzODIwNTIKKzoxMDI3ODAwMDczNjg3NTYxNkU2NzIwNDU3ODcwMjAyNDAwMDAwMDAwMzIKKzoxMDI3OTAwMDY1NzY3NDUyNkU2NzQ2MDA1MTY1NzY3NDQ2MDAwMDAwOTcKKzoxMDI3QTAwMDUxNjU3Njc0NTA1RjQ2MDA0RDY1NzY3NDUyNkU2NzQ2OEIKKzoxMDI3QjAwMDAwMDAwMDAwNEQ1MTY1NzY3NDQ2MDAwMDRENTE2NTc2NkQKKzoxMDI3QzAwMDUwNUY0NjAwNTE3MzQzNkY2RTQ5NUY0NjAwMDAwMDAwNDIKKzoxMDI3RDAwMDUxNzM0MzZGNkU3MzQ2MDA1MTcyNTA3MjZGNjQ0NjAwQkUKKzoxMDI3RTAwMDY5NzM2RTc0NTQ2MzcwNTUwMDAwMDAwMDI0NDg2NTYxN0QKKzoxMDI3RjAwMDY0NjU3MjNBMjAyRjcwNzI2RjZBNjU2Mzc0NzMyRjcyMEEKKzoxMDI4MDAwMDYzNzMyRjczNzcyRjY3NjUyRjJFMkY2RTY5NjMyRjY2ODMKKzoxMDI4MTAwMDc3MzIyRjYzNkY2RDZENkY2RTJGNzI2NTYzNzYyRTYzRTcKKzoxMDI4MjAwMDJDNzYyMDMxMkUzMTJFMzIyRTM1MzMyMDMxMzkzOTM5NjQKKzoxMDI4MzAwMDJGMzAzMTJGMzEzNjIwMzAzMjNBMzUzNTNBMzQzMzIwOEIKKzoxMDI4NDAwMDczNjg3NTYxNkU2NzIwNDU3ODcwMjAyNDAwMDAwMDAwNzEKKzoxMDI4NTAwMDY1NzY3NDUyNkU2NzQ2MDA1MTY1NzY3NDQ2MDAwMDAwRDYKKzoxMDI4NjAwMDUxNjU3Njc0NTA1RjQ2MDA0RDY1NzY3NDUyNkU2NzQ2Q0EKKzoxMDI4NzAwMDAwMDAwMDAwNEQ1MTY1NzY3NDQ2MDAwMDRENTE2NTc2QUMKKzoxMDI4ODAwMDUwNUY0NjAwNTE3MzQzNkY2RTQ5NUY0NjAwMDAwMDAwODEKKzoxMDI4OTAwMDUxNzM0MzZGNkU3MzQ2MDA1MTcyNTA3MjZGNjQ0NjAwRkQKKzoxMDI4QTAwMDcyNEQ2MTYzNDM2ODZCMzAwMDAwMDAwMDcyNzg0NjcyQkQKKzoxMDI4QjAwMDZEMzI0QzY3MDAwMDAwMDA3Mjc4NEU2RjUzNzQ0MjY0QjIKKzoxMDI4QzAwMDAwMDAwMDAwNzI3ODRFNkY0RDY5NDI2NDAwMDAwMDAwMDUKKzoxMDI4RDAwMDcyNzg0RTZGNEE2RDQyNjQwMDAwMDAwMDcyNzg0MzZCNUMKKzoxMDI4RTAwMDQ0NkQ2MTQ2MDAwMDAwMDA3Mjc4NTE0NDZENDU3ODQ2QTEKKzoxMDI4RjAwMDAwMDAwMDAwNzI3ODUxNDQ2RDYxNDYwMDcyNzg1MTQ0QzYKKzoxMDI5MDAwMDRDNDI2NDQ2MDAwMDAwMDA3Mjc4NTE0NDZENDI2NDQ2QjcKKzoxMDI5MTAwMDAwMDAwMDAwNzI3ODQzNzI2MzUwNjE2NDAwMDAwMDAwQTAKKzoxMDI5MjAwMDcyNTM2RDUxNDQ2RDYxNDYwMDAwMDAwMDI0NDg2NTYxOUEKKzoxMDI5MzAwMDY0NjU3MjNBMjAyRjcwNzI2RjZBNjU2Mzc0NzMyRjcyQzgKKzoxMDI5NDAwMDYzNzMyRjczNzcyRjY3NjUyRjJFMkY2RTY5NjMyRjY2NDIKKzoxMDI5NTAwMDc3MzIyRjYzNkY2RDZENkY2RTJGNkQ2MTYzMkU2MzJDRjkKKzoxMDI5NjAwMDc2MjAzMTJFMzEyRTMyMkUzMjMyMjAzMTM5MzkzODJGMjUKKzoxMDI5NzAwMDMxMzIyRjMwMzgyMDMwMzIzQTMzMzYzQTMzMzAyMDczMDgKKzoxMDI5ODAwMDY4NzU2MTZFNjcyMDQ1Nzg3MDIwMjQwMDY1NzY3NDUyMDIKKzoxMDI5OTAwMDZFNjc0NjAwNTE2NTc2NzQ0NjAwMDAwMDUxNjU3Njc0OTYKKzoxMDI5QTAwMDUwNUY0NjAwNEQ2NTc2NzQ1MjZFNjc0NjAwMDAwMDAwMjkKKzoxMDI5QjAwMDRENTE2NTc2NzQ0NjAwMDA0RDUxNjU3NjUwNUY0NjAwNzYKKzoxMDI5QzAwMDUxNzM0MzZGNkU0OTVGNDYwMDAwMDAwMDUxNzM0MzZGQkYKKzoxMDI5RDAwMDZFNzM0NjAwNTE3MjUwNzI2RjY0NDYwMDZENjE2MzU0QUQKKzoxMDI5RTAwMDY4NzI2NTczMDAwMDAwMDAyMzc0NEQ2MTYzNDE1NDRFQUEKKzoxMDI5RjAwMDAwMDAwMDAwMjM3MjRENjE2MzQxNTQ0RTAwMDAwMDAwNEUKKzoxMDJBMDAwMDcyNjU2RDQxNzM3MzcyNzQwMDAwMDAwMDZDNjk2RTZCQzcKKzoxMDJBMTAwMDQ0NEY1NzRFMDAwMDAwMDA2QzY5NkU2QjU1NTAwMDAwMkIKKzoxMDJBMjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDI0NDg2NTYxNzQKKzoxMDJBMzAwMDY0NjU3MjNBMjAyRjcwNzI2RjZBNjU2Mzc0NzMyRjcyQzcKKzoxMDJBNDAwMDYzNzMyRjczNzcyRjY3NjUyRjJFMkY2RTY5NjMyRjY2NDEKKzoxMDJBNTAwMDc3MzIyRjYzNkY2RDZENkY2RTJGNjM2QjczNzU2RDJFOTUKKzoxMDJBNjAwMDYzMkM3NjIwMzEyRTMxMkUzMjJFMzkyMDMxMzkzOTM5RUUKKzoxMDJBNzAwMDJGMzAzMTJGMzEzNDIwMzAzMDNBMzAzMzNBMzQzODIwNEYKKzoxMDJBODAwMDczNjg3NTYxNkU2NzIwNDU3ODcwMjAyNDAwMDAwMDAwMkYKKzoxMDJBOTAwMDY1NzY3NDUyNkU2NzQ2MDA1MTY1NzY3NDQ2MDAwMDAwOTQKKzoxMDJBQTAwMDUxNjU3Njc0NTA1RjQ2MDA0RDY1NzY3NDUyNkU2NzQ2ODgKKzoxMDJBQjAwMDAwMDAwMDAwNEQ1MTY1NzY3NDQ2MDAwMDRENTE2NTc2NkEKKzoxMDJBQzAwMDUwNUY0NjAwNTE3MzQzNkY2RTQ5NUY0NjAwMDAwMDAwM0YKKzoxMDJBRDAwMDUxNzM0MzZGNkU3MzQ2MDA1MTcyNTA3MjZGNjQ0NjAwQkIKKzoxMDJBRTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDUwNzI2RjYyNTMKKzoxMDJBRjAwMDY1NTA2ODc5MDAwMDAwMDA2QzZFNkI0MTUzNTM1MjU0NkUKKzoxMDJCMDAwMDAwMDAwMDAwMDAwMTA5QTQwMDAxMEExQzAwMDEwQTUwOTUKKzoxMDJCMTAwMDAwMDEwQTdDMDAwMTEwNTAwMDAxMEFBODAwMDEwQjEwRkUKKzoxMDJCMjAwMDAwMDExMUZDMDAwMTBEQzAwMDAxMEM2ODAwMDEwQzgwQzcKKzoxMDJCMzAwMDAwMDEwQ0M0MDAwMTBDRUMwMDAxMEQwQzAwMDEwRDM0NkYKKzoxMDJCNDAwMDAwMDExMUZDMDAwMTBEQzAwMDAxMERGODAwMDEwRTEwODQKKzoxMDJCNTAwMDAwMDEwRTQwMDAwMTBFNjgwMDAxMEU4ODAwMDEwRUIwNTkKKzoxMDJCNjAwMDAwMDAwMDAwMDAwMTBGREMwMDAxMTAwODAwMDExMDJDMjMKKzoxMDJCNzAwMDAwMDExMUZDMDAwMTEwNTAwMDAxMTA3ODAwMDExMTA4NDMKKzoxMDJCODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExODZDQzAKKzoxMDJCOTAwMDAwMDExOTNDMDAwMTFBMTQwMDAxMUFFNDAwMDExQjQwNTUKKzoxMDJCQTAwMDAwMDExQzFDMDAwMTFDNDQwMDAxMUQyMDAwMDExRDQ4RTcKKzoxMDJCQjAwMDAwMDExRUYwMDAwMTFGMTgwMDAxMjBDMDAwMDEyMkI4MTIKKzoxMDJCQzAwMDAwMDEyNTRDMDAwMTI0NjAwMDAxMjU0QzAwMDEyNTc4RkUKKzoxMDJCRDAwMDAwMDEyMEU4MDAwMTIyOTA3MjczNzQ1RjY3NkQ2OTY5REIKKzoxMDJCRTAwMDAwMDAwMDAwMDAwMTI2MDgwMDAxMjY0MDAwMDEyNzI4RkYKKzoxMDJCRjAwMDAwMDEzMzc0MDAwMTMzQjQwMDAxMzNDQzczNjU3NDZDOEQKKzoxMDJDMDAwMDZGNkY3MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEzQkJDN0UKKzoxMDJDMTAwMDAwMDEzQkZDMDAwMTNDOEMwMDAxM0NEMDAwMDEzRDM0MzQKKzoxMDJDMjAwMDAwMDEzREMwMDAwMTNERjQwMDAxM0U3QzAwMDEzRjE0NjUKKzoxMDJDMzAwMDAwMDEzRkU0MDAwMTQwMjQwMDAxNDBBODAwMDE0MENDMTUKKzoxMDJDNDAwMDAwMDE0MURDNjQ2RjQyNjE3MzY1NTA2NzAwMDAwMDAwNjEKKzoxMDJDNTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDczNzQ2RDYxQkYKKzoxMDJDNjAwMDYzNEM0RTRCMDAwMDAwMDA2NzY1NzQ2RDYzNkM2RTZCQzcKKzoxMDJDNzAwMDAwMDAwMDAwMDAwMTRFRDgwMDAxNEVEODAwMDE0QjhDMkUKKzoxMDJDODAwMDAwMDE0QkQ4MDAwMTRDMjQwMDAxNEVEODczNjU3NDZEQ0YKKzoxMDJDOTAwMDYxNjM2MTYzNzQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMzgKKzoxMDJDQTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMjQKKzoxMDJDQjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTQKKzoxMDJDQzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDMKKzoxMDJDRDAwMDAwMDAwMDAxMDAwMDAwMDEwMEMwMDFGQzAwMDAzRkZDRkEKKzoxMDJDRTAwMDAwQzAwMDAwNDE2Qzc0NjU2RjZFMjA0MTYzNjU0RTQ5MDEKKzoxMDJDRjAwMDQzMjA1NjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMUIKKzoxMDJEMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDQxNkM3NDY1M0QKKzoxMDJEMTAwMDZGNkUyMDQxNjM2NTRFNDk0MzIwNTYwMDQyNDI0MjQyNTUKKzoxMDJEMjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMUZGRkZDODkKKzoxMDJEMzAwMDAwMUZGRjdDMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRjkKKzoxMDJENDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNjBDRjAwNTQKKzoxMDJENTAwMDAwMDAwMDYwQ0YwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNDQKKzoxMDJENjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNjMKKzoxMDJENzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNTMKKzoxMDJEODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNDMKKzoxMDJEOTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMzMKKzoxMDJEQTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMzAwMDAwMDAwMjAKKzoxMDJEQjAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTIKKzoxMDJEQzAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDEKKzoxMDJERDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxRjIKKzoxMDJERTAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRTIKKzoxMDJERjAwMDAwMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDIxMDAwMDAwQjEKKzoxMDJFMDAwMDEyMDAwMTQwMDAwMDAwMDAwMDAwMDAwMDIwMDAwMDAwNEYKKzoxMDJFMTAwMDEyMDAwMEEwMDAwMDAwMDAxMjAwMDA2MDEyMDAwMTgwRkIKKzoxMDJFMjAwMDEyMDAwMUUwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwQUYKKzoxMDJFMzAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwOTEKKzoxMDJFNDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyODAKKzoxMDJFNTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAzMDAwMTAwMDAwMDAxNkQKKzoxMDJFNjAwMDAwMDMwMjAxMDAwMDAwMDAwMDAwMDAwMDAxMDEwMTAxNTgKKzoxMDJFNzAwMDAxMDEwMTAwMDAwMTAxMDAwMTAxMDAwMTAwMDEwMDAxNDgKKzowQzJFODAwMDAxMDAwMTAxMDAwMDAxMDEwMDAwMDAwMDQxCis6MDAwMDAwMDFGRgorLyogdGcyIGZpcm13YXJlIHYxMi40LjExICovCmRpZmYgLS1naXQgYS9maXJtd2FyZS9hZGFwdGVjL3N0YXJmaXJlX3J4LmJpbi5paGV4IGIvZmlybXdhcmUvYWRhcHRlYy9zdGFyZmlyZV9yeC5iaW4uaWhleApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjFmYWUwCi0tLSAvZGV2L251bGwKKysrIGIvZmlybXdhcmUvYWRhcHRlYy9zdGFyZmlyZV9yeC5iaW4uaWhleApAQCAtMCwwICsxLDUzIEBACis6MTAwMDAwMDAwMTAwMDNEQzAwMDAwMDAwMDQwMDA0MjEwMDAwMDA4NjYxCis6MTAwMDEwMDA4MDAwMDAxNTAwMDAxODBFODEwMDAwMTUwMDAwNjY2NEM1Cis6MTAwMDIwMDAxQTAwNDBBQjAwMDAwQjA2MTQyMDAwMTEwMDAwMDAwMDc1Cis6MTAwMDMwMDAxNDIwNDAyMjAwMDBBQUFBMTQyMDQwMjIwMDAwMDMwMDNECis6MTAwMDQwMDAxNDIwNDAyMjAwMDAwMDAwMUEwMDQwQUIwMDAwMEIxNEY2Cis6MTAwMDUwMDAxNDIwMDAxMTAwMDAwMDAwODMwMDAwMTUwMDAwMDAwMkMxCis6MTAwMDYwMDAwNDAwMDAyMTAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDVCCis6MTAwMDcwMDAwNDAwMDQyMTAwMDAwMDg3MDAwMDAwMTAwMDAwMDAwMEMwCis6MTAwMDgwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDgwMTUwMDAwMDAwMENCCis6MTAwMDkwMDAwMDAwMDAzRTAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDEyCis6MTAwMEEwMDA4MjAwMDAxNTAwMDA0MDAwMDA5RTgwNTAwMDAwMDAwMDBCCis6MTAwMEIwMDAwMzAwODAxNTAwMDAwMDAwODYwMDgwMTUwMDAwMDAwMDhECis6MTAwMEMwMDA4MjAwMDAxNTAwMDA4MDAwMDEwMDAwMUMwMDAwMDAwMEZDCis6MTAwMEQwMDAwMDAwNTBBMDAwMDAwMTBDNEUyMEQwMTEwMDAwNjAwODZDCis6MTAwMEUwMDAxNDIwRDAxMjAwMDA0MDA4MDAwMEYwOTAwMDAwNzAwMEMyCis6MTAwMEYwMDAwMDAwQzhCMDAwMDAzMDAwMDAwMDQwNDAwMDAwMDAwMEQ4Cis6MTAwMTAwMDAwMDEwODAxNTAwMDAwMDAwMDBBMkMxNTAwMDAwNDAwMDU3Cis6MTAwMTEwMDAwMEE0MDBCMDAwMDAwMDE0MDAwMDAwMjAwMDAwMDAwMDU3Cis6MTAwMTIwMDAyNTAwNDAwRDAwMDAyNTI1MDAwNDcyMjAwMDAwMzEwMDRDCis6MTAwMTMwMDAwMDkzNDA3MDAwMDAwMDAwMDAwMDAwMjAwMDAwMDAwMDVDCis6MTAwMTQwMDAwMDkyNDQ2MDAwMDAwMTg0MkIyMEMwMTEwMDAwMDAwMEQ4Cis6MTAwMTUwMDAwMDAwQzQyMDAwMDAwNTQwMzYwMTQwMTgwMDAwNDIyRDc4Cis6MTAwMTYwMDAxNDIwMDAxMTAwMDAwMDAwMDA5MjQ0NjAwMDAwMDE4MzkwCis6MTAwMTcwMDAzMjAwMDAxRjAwMDAwMDM0MDJBQzAwMTUwMDAwMDAwMjM1Cis6MTAwMTgwMDAwMEE2MDExMDAwMDAwMDA4NDIyMDAwMTEwMDAwMDAwMDNECis6MTAwMTkwMDAwMDkyNDA2MDAwMDAwMTAzMDAwMDAwMUUwMDAwMDAwMDBCCis6MTAwMUEwMDAwMDAwMDAyMDAwMDAwMTAwMDAwMDAwMUUwMDAwMDAwMDEwCis6MTAwMUIwMDAwMDkyNDQ2MDAwMDAwMDg2MDAwMDQwODAwMDAwMDAwMEMzCis6MTAwMUMwMDAwMDkyQzA3MDAwMDAwMDAwMDA5MjQwNjAwMDAwMDEwMDNBCis6MTAwMUQwMDAwMDAwQzg5MDAwMDA1MDAwMDBBNkMxMTAwMDAwMDAwMDAwCis6MTAwMUUwMDAwMEIwQzA5MDAwMDAwMDEyMDIxQzAwMTUwMDAwMDAwMENBCis6MTAwMUYwMDAzMjAwMDAxRjAwMDAwMDM0MDA5MjQ0NjAwMDAwMDUxMDJGCis6MTAwMjAwMDA0NDIxMDAxMTAwMDAwMDAwNDIwMDAwMTEwMDAwMDAwMDI1Cis6MTAwMjEwMDA4MzAwMDAxNTAwMDAwMDQwMDA5MjQ0NjAwMDAwMDUwOEMzCis6MTAwMjIwMDA0NTAxNDAxODAwMDA0NTQ1MDA4MDgwNTAwMDAwMDAwMDU2Cis6MTAwMjMwMDA2MjIwODAxMjAwMDAwMDAwODIwMDAwMTUwMDAwMDgwMDBCCis6MTAwMjQwMDAxNTIwMDAxMTAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDU4Cis6MTAwMjUwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDdFCis6MTAwMjYwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDZFCis6MTAwMjcwMDA4MDAwMDAxNTAwMDBFRUE0ODEwMDAwMTUwMDAwMDA1RjYyCis6MTAwMjgwMDAwMDAwMDA2MDAwMDAwMDAwMDAwMDQxMjAwMDAwMDAwMEFECis6MTAwMjkwMDAwMDAwNEEwMDAwMDA0MDAwMDA5MjQ0NjAwMDAwMDE5MDBECis6MTAwMkEwMDA1NjAxNDAxQTAwMDA1OTU2MTQwMDAwMTEwMDAwMDAwMEM5Cis6MTAwMkIwMDAwMDkzNDA1MDAwMDAwMDE4MDA5MzAwNTAwMDAwMDAxODA4Cis6MTAwMkMwMDAzNjAxNDAzQTAwMDAwMDJEMDAwNjQzQTkwMDAwMDAwMDVFCis6MTAwMkQwMDAwMDAwQzQyMDAwMDAwMTQwNTYwMTQwMUEwMDAwNTk1Njk5Cis6MTAwMkUwMDAxNDAwMDAxMTAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMEQ5Cis6MTAwMkYwMDAwMDAwMDAxMDAwMDAwMDAwMDAwNjQyQTkwMDAwMDAwMEZECis6MTAwMzAwMDAwMDAyNDQyMDAwMDAwMTgzNTYwMTQwMUEwMDAwNTk1NkEzCis6MTAwMzEwMDA4MjAwMDAxNTAwMDAyMDAwMTUyMDAwMTEwMDAwMDAwMEUwCis6MTAwMzIwMDA4MjAwMDAxNTAwMDAwMDEwMTUyMDAwMTEwMDAwMDAwMEUwCis6MTAwMzMwMDA4MjAwMDAxNTAwMDAwMDEwMTUyMDAwMTEwMDAwMDAwMEQwCis6MDAwMDAwMDFGRgpkaWZmIC0tZ2l0IGEvZmlybXdhcmUvYWRhcHRlYy9zdGFyZmlyZV90eC5iaW4uaWhleCBiL2Zpcm13YXJlL2FkYXB0ZWMvc3RhcmZpcmVfdHguYmluLmloZXgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmIxZmFlMAotLS0gL2Rldi9udWxsCisrKyBiL2Zpcm13YXJlL2FkYXB0ZWMvc3RhcmZpcmVfdHguYmluLmloZXgKQEAgLTAsMCArMSw1MyBAQAorOjEwMDAwMDAwMDEwMDAzREMwMDAwMDAwMDA0MDAwNDIxMDAwMDAwODY2MQorOjEwMDAxMDAwODAwMDAwMTUwMDAwMTgwRTgxMDAwMDE1MDAwMDY2NjRDNQorOjEwMDAyMDAwMUEwMDQwQUIwMDAwMEIwNjE0MjAwMDExMDAwMDAwMDA3NQorOjEwMDAzMDAwMTQyMDQwMjIwMDAwQUFBQTE0MjA0MDIyMDAwMDAzMDAzRAorOjEwMDA0MDAwMTQyMDQwMjIwMDAwMDAwMDFBMDA0MEFCMDAwMDBCMTRGNgorOjEwMDA1MDAwMTQyMDAwMTEwMDAwMDAwMDgzMDAwMDE1MDAwMDAwMDJDMQorOjEwMDA2MDAwMDQwMDAwMjEwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDA1QgorOjEwMDA3MDAwMDQwMDA0MjEwMDAwMDA4NzAwMDAwMDEwMDAwMDAwMDBDMAorOjEwMDA4MDAwMDAwMDAwMTAwMDAwMDAwMDAwMDA4MDE1MDAwMDAwMDBDQgorOjEwMDA5MDAwMDAwMDAwM0UwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAxMgorOjEwMDBBMDAwODIwMDAwMTUwMDAwNDAwMDAwOUU4MDUwMDAwMDAwMDAwQgorOjEwMDBCMDAwMDMwMDgwMTUwMDAwMDAwMDg2MDA4MDE1MDAwMDAwMDA4RAorOjEwMDBDMDAwODIwMDAwMTUwMDAwODAwMDAxMDAwMDFDMDAwMDAwMDBGQworOjEwMDBEMDAwMDAwMDUwQTAwMDAwMDEwQzRFMjBEMDExMDAwMDYwMDg2QworOjEwMDBFMDAwMTQyMEQwMTIwMDAwNDAwODAwMDBGMDkwMDAwMDcwMDBDMgorOjEwMDBGMDAwMDAwMEM4QjAwMDAwMzAwMDAwMDA0MDQwMDAwMDAwMDBEOAorOjEwMDEwMDAwMDAxMDgwMTUwMDAwMDAwMDAwQTJDMTUwMDAwMDQwMDA1NworOjEwMDExMDAwMDBBNDAwQjAwMDAwMDAxNDAwMDAwMDIwMDAwMDAwMDA1NworOjEwMDEyMDAwMjUwMDQwMEQwMDAwMjUyNTAwMDQ3MjIwMDAwMDMxMDA0QworOjEwMDEzMDAwMDA5MzQwNzAwMDAwMDAwMDAwMDAwMDIwMDAwMDAwMDA1QworOjEwMDE0MDAwMDA5MjQ0NjAwMDAwMDE4NDJCMjBDMDExMDAwMDAwMDBEOAorOjEwMDE1MDAwMDAwMEM0MjAwMDAwMDU0MDM2MDE0MDE4MDAwMDQyMkQ3OAorOjEwMDE2MDAwMTQyMDAwMTEwMDAwMDAwMDAwOTI0NDYwMDAwMDAxODM5MAorOjEwMDE3MDAwMzIwMDAwMUYwMDAwMDAzNDAyQUMwMDE1MDAwMDAwMDIzNQorOjEwMDE4MDAwMDBBNjAxMTAwMDAwMDAwODQyMjAwMDExMDAwMDAwMDAzRAorOjEwMDE5MDAwMDA5MjQwNjAwMDAwMDEwMzAwMDAwMDFFMDAwMDAwMDAwQgorOjEwMDFBMDAwMDAwMDAwMjAwMDAwMDEwMDAwMDAwMDFFMDAwMDAwMDAxMAorOjEwMDFCMDAwMDA5MjQ0NjAwMDAwMDA4NjAwMDA0MDgwMDAwMDAwMDBDMworOjEwMDFDMDAwMDA5MkMwNzAwMDAwMDAwMDAwOTI0MDYwMDAwMDAxMDAzQQorOjEwMDFEMDAwMDAwMEM4OTAwMDAwNTAwMDAwQTZDMTEwMDAwMDAwMDAwMAorOjEwMDFFMDAwMDBCMEMwOTAwMDAwMDAxMjAyMUMwMDE1MDAwMDAwMDBDQQorOjEwMDFGMDAwMzIwMDAwMUYwMDAwMDAzNDAwOTI0NDYwMDAwMDA1MTAyRgorOjEwMDIwMDAwNDQyMTAwMTEwMDAwMDAwMDQyMDAwMDExMDAwMDAwMDAyNQorOjEwMDIxMDAwODMwMDAwMTUwMDAwMDA0MDAwOTI0NDYwMDAwMDA1MDhDMworOjEwMDIyMDAwNDUwMTQwMTgwMDAwNDU0NTAwODA4MDUwMDAwMDAwMDA1NgorOjEwMDIzMDAwNjIyMDgwMTIwMDAwMDAwMDgyMDAwMDE1MDAwMDA4MDAwQgorOjEwMDI0MDAwMTUyMDAwMTEwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDA1OAorOjEwMDI1MDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDA3RQorOjEwMDI2MDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDA2RQorOjEwMDI3MDAwODAwMDAwMTUwMDAwRUVBNDgxMDAwMDE1MDAwMDAwNUY2MgorOjEwMDI4MDAwMDAwMDAwNjAwMDAwMDAwMDAwMDA0MTIwMDAwMDAwMDBBRAorOjEwMDI5MDAwMDAwMDRBMDAwMDAwNDAwMDAwOTI0NDYwMDAwMDAxOTAwRAorOjEwMDJBMDAwNTYwMTQwMUEwMDAwNTk1NjE0MDAwMDExMDAwMDAwMDBDOQorOjEwMDJCMDAwMDA5MzQwNTAwMDAwMDAxODAwOTMwMDUwMDAwMDAwMTgwOAorOjEwMDJDMDAwMzYwMTQwM0EwMDAwMDAyRDAwMDY0M0E5MDAwMDAwMDA1RQorOjEwMDJEMDAwMDAwMEM0MjAwMDAwMDE0MDU2MDE0MDFBMDAwMDU5NTY5OQorOjEwMDJFMDAwMTQwMDAwMTEwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDBEOQorOjEwMDJGMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDY0MkE5MDAwMDAwMDBGRAorOjEwMDMwMDAwMDAwMjQ0MjAwMDAwMDE4MzU2MDE0MDFBMDAwMDU5NTZBMworOjEwMDMxMDAwODIwMDAwMTUwMDAwMjAwMDE1MjAwMDExMDAwMDAwMDBFMAorOjEwMDMyMDAwODIwMDAwMTUwMDAwMDAxMDE1MjAwMDExMDAwMDAwMDBFMAorOjEwMDMzMDAwODIwMDAwMTUwMDAwMDAxMDE1MjAwMDExMDAwMDAwMDBEMAorOjAwMDAwMDAxRkYKZGlmZiAtLWdpdCBhL2Zpcm13YXJlL2RzcDU2ay9ib290c3RyYXAuYXNtIGIvZmlybXdhcmUvZHNwNTZrL2Jvb3RzdHJhcC5hc20KaW5kZXggMTBkODkxOS4uYTQxMTA0NyAxMDA2NDQKLS0tIGEvZmlybXdhcmUvZHNwNTZrL2Jvb3RzdHJhcC5hc20KKysrIGIvZmlybXdhcmUvZHNwNTZrL2Jvb3RzdHJhcC5hc20KQEAgLTUxLDE5ICs1MSwxOSBAQAogICAgICAgICA7IENvcHkgRFNQIHByb2dyYW0gY29udHJvbAogICAgICAgICBtb3ZlICAgICNyZWFsLHIwCiAgICAgICAgIG1vdmUgICAgI3VwbG9hZCxyMQotICAgICAgICBkbyAgICAgICN1cGxvYWRfZW5kLXVwbG9hZCw8X2NvcHkKLSAgICAgICAgbW92ZSAgICBQOihyMCkrLHgwCi0gICAgICAgIG1vdmUgICAgeDAsUDoocjEpKwotX2NvcHkgICBtb3ZlcCAgICM+NCxYOjw8TV9IQ1IKLSAgICAgICAgbW92ZXAgICAjPiRjMDAsWDo8PE1fSVBSCisgICAgICAgIGRvICAgICAgI3VwbG9hZF9lbmQtdXBsb2FkLF9jb3B5CisgICAgICAgIG1vdmVtICAgIFA6KHIwKSsseDAKKyAgICAgICAgbW92ZW0gICAgeDAsUDoocjEpKworX2NvcHkgICBtb3ZlcCAgICM0LFg6PDxNX0hDUgorICAgICAgICBtb3ZlcCAgICMkYzAwLFg6PDxNX0lQUgogICAgICAgICBhbmQgICAgICM8JGZlLG1yCiAgICAgICAgIGptcCAgICAgdXBsb2FkCiAKIHJlYWwKICAgICAgICAgb3JnICAgICBQOiQ3ZWE5CiB1cGxvYWQKLSAgICAgICAgbW92ZXAgICAjPjEsWDo8PE1fUEJDCi0gICAgICAgIG1vdmVwICAgIz4wLFg6PDxNX0JDUgorICAgICAgICBtb3ZlcCAgICMxLFg6PDxNX1BCQworICAgICAgICBtb3ZlcCAgICMwLFg6PDxNX0JDUgogCiBuZXh0ICAgIGpjbHIgICAgIzAsWDo8PE1fSFNSLCoKICAgICAgICAgbW92ZXAgICBYOjw8TV9IUlgsQQpAQCAtODEsMTggKzgxLDE4IEBACiAgICAgICAgIGNtcCAgICAgeDAsQQogICAgICAgICBqZXEgICAgIGxvYWRfWQogCi1sb2FkX1AgIGRvICAgICAgeTAsX2xvYWQKK2xvYWRfUCAgZG8gICAgICB5MCxfbG9hZF9QCiAgICAgICAgIGpjbHIgICAgIzAsWDo8PE1fSFNSLCoKICAgICAgICAgbW92ZXAgICBYOjw8TV9IUlgsUDoocjApKwotX2xvYWQgICBqbXAgICAgIG5leHQKLWxvYWRfWCAgZG8gICAgICB5MCxfbG9hZAorX2xvYWRfUCBqbXAgICAgIG5leHQKK2xvYWRfWCAgZG8gICAgICB5MCxfbG9hZF9YCiAgICAgICAgIGpjbHIgICAgIzAsWDo8PE1fSFNSLCoKICAgICAgICAgbW92ZXAgICBYOjw8TV9IUlgsWDoocjApKwotX2xvYWQgICBqbXAgICAgIG5leHQKLWxvYWRfWSAgZG8gICAgICB5MCxfbG9hZAorX2xvYWRfWCBqbXAgICAgIG5leHQKK2xvYWRfWSAgZG8gICAgICB5MCxfbG9hZF9ZCiAgICAgICAgIGpjbHIgICAgIzAsWDo8PE1fSFNSLCoKICAgICAgICAgbW92ZXAgICBYOjw8TV9IUlgsWToocjApKwotX2xvYWQgICBqbXAgICAgIG5leHQKK19sb2FkX1kgam1wICAgICBuZXh0CiAKIHVwbG9hZF9lbmQKICAgICAgICAgZW5kCmRpZmYgLS1naXQgYS9maXJtd2FyZS9lMTAwL2QxMDFtX3Vjb2RlLmJpbi5paGV4IGIvZmlybXdhcmUvZTEwMC9kMTAxbV91Y29kZS5iaW4uaWhleApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjk3MWVkCi0tLSAvZGV2L251bGwKKysrIGIvZmlybXdhcmUvZTEwMC9kMTAxbV91Y29kZS5iaW4uaWhleApAQCAtMCwwICsxLDM4IEBACis6MTAwMDAwMDAxNTAyNTUwMDM3MDRGRkZGRkZGRkZGRkY4OTA3QTcwNjEyCis6MTAwMDEwMDBGRkZGRkZGRkZGRkY1ODA1MDEwMDBDMDAxMjEzMTAwMDQ3Cis6MTAwMDIwMDAwODAwMEMwMDE2MDIzODAwOUMwMDEwMDA1NjQwMjAwMDBBCis6MTAwMDMwMDBDQzgwMjMwMDU2MDAzODAwOUMwMDEwMDAwQjRDMjQwMDlDCis6MTAwMDQwMDAwMDA4MDAwMDE4NDgxMjAwMzgwNDM4MDAwMDAwMDAwMEMyCis6MTAwMDUwMDAwMDAwMTQwMDU1MDUzODAwMDA4MDMwMDA2MjA2MTAwMEQyCis6MTAwMDYwMDA2MTA1MTAwMDA4MDQwRTAwNjE0ODEzMDAwMjAwMEMwMDM2Cis6MTAwMDcwMDA5MzMwMTAwMDAwODAzMDAwMjQwNjEwMDA2MTA1MTAwMDRECis6MTAwMDgwMDAwODA0MEUwMDYxMDgxMDAwN0UwMDBDMDAyMTJDMjIwMEU0Cis6MTAwMDkwMDAwMjAwMEMwMDkzMzAxMDAwN0EwQzM4MDAwMDAwMDgwMEI5Cis6MTAwMEEwMDA5MDMwMTAwMDdBMEMzODAwMDAwMDAwMDAwMDAwMDAwMEMyCis6MTAwMEIwMDAwMDAwMDAwMDAwMDAwMDAwOUMwMDEwMDAyRDRDMjQwMEY3Cis6MTAwMEMwMDAwNDAwMDEwMDAwMTAwNDAwMzcwNDNBMDAxMDQwMDQwMDRFCis6MTAwMEQwMDA4QTA3MzgwMDAwMDAwMDAwOTkwMDEwMDA3QTZDMjAwMEE4Cis6MTAwMEUwMDA5QzAwMTAwMDQ4NEMyNDAwMjQwODEzMDAwMTAwMEMwMDYwCis6MTAwMEYwMDAxMzEyMTAwMDc1MEMyNjAwMDAxMDA0MDAwNDAwMDEwMDBCCis6MTAwMTAwMDAyNjA4MTMwMDA2MDAwQzAwQTgwNjIyMDAyNkM5MTMwMENBCis6MTAwMTEwMDAxMzEzMTAwMEE4MDYzODAwMDAwMDAwMDAwMDAwMDAwMEMzCis6MTAwMTIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMENGCis6MTAwMTMwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNjA4MDAxMDFCMTAwMDc2Cis6MTAwMTQwMDAwNDAwMDUwMDI2MDgxMDAwMTAxMjEwMDAzNDBDMzgwMEJFCis6MTAwMTUwMDAwMDAwMDAwMDAwMDAwMDAwNUIxNTIxMDA5OTAwMTAwMDY1Cis6MTAwMTYwMDA1OTY1MjAwMDlDMDAxMDAwNTk0NTI0MDAzNjA4MTMwMEYyCis6MTAwMTcwMDAwMDAwMEMwMDYyMEMyMjAwMDEwMDBDMDAxMzFCMTAwMDk4Cis6MTAwMTgwMDAwRTlDMjIwMDBFMEMyMTAwMEU2QzIyMDAwRTZDMjEwMDMxCis6MTAwMTkwMDAwRUZDMjIwMDBFNUMyMTAwMEU0QzIxMDA1NTA1MzgwMDlCCis6MTAwMUEwMDAwNDAwMDEwMDAwMTAwNDAwNjc4QzI3MDAwMDA4MDQwMDEwCis6MTAwMUIwMDAwMDgxMDEwMDM3MDQzQTAwMjYwODEzMDAwMTAwMEMwMEZBCis6MTAwMUMwMDA1OTA1MjIwMDEzMTMxMDAwNTkwNTM4MDAwMDAwMDAwMEUzCis6MTAwMUQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDFGCis6MTAwMUUwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAzMTA4MTMwMEMzCis6MTAwMUYwMDAwQjA5MTAwMDEzNDgxMjAwODBGRjBDMDBBQjA2MjYwMDBDCis6MTAwMjAwMDAwMDEwMDQwMDA0MDAwMTAwQTgwNjM4MDAwMDAwMDAwMEVGCis6MEIwMjEwMDAwMDAwMDAwMDAwMDAwMDAwNEU0MTdFRDYKKzowMDAwMDAwMUZGCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgTWljcm8gY29kZSBmb3IgODA4NjoxMjI5IFJldiA4ICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9maXJtd2FyZS9lMTAwL2QxMDFzX3Vjb2RlLmJpbi5paGV4IGIvZmlybXdhcmUvZTEwMC9kMTAxc191Y29kZS5iaW4uaWhleApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDJjN2ZlCi0tLSAvZGV2L251bGwKKysrIGIvZmlybXdhcmUvZTEwMC9kMTAxc191Y29kZS5iaW4uaWhleApAQCAtMCwwICsxLDM4IEBACis6MTAwMDAwMDA0MjAyNTUwMDdFMDRGRkZGRkZGRkZGRkYxODA4RkYwNkI2Cis6MTAwMDEwMDBGRkZGRkZGRkZGRkZBNjA1MDEwMDBDMDAxMjEzMTAwMEY5Cis6MTAwMDIwMDAwODAwMEMwMDQzMDIzODAwOUMwMDEwMDA1NjQwMjAwMERECis6MTAwMDMwMDBEMDgwMjMwMDU2MDAzODAwOUMwMDEwMDA4QjRGMjQwMDE1Cis6MTAwMDQwMDAwMDA4MDAwMDE4NDgxMjAwN0YwNDM4MDAwMDAwMDAwMDdCCis6MTAwMDUwMDAwMDAwMTQwMEEzMDUzODAwMDA4MDMwMDAxMDA2MTAwMEQ2Cis6MTAwMDYwMDA2MTA1MTAwMDA4MDQwRTAwNjE0ODEzMDAwMjAwMEMwMDM2Cis6MTAwMDcwMDA5MzMwMTAwMDAwODAzMDAwMjQwNjEwMDA2MTA1MTAwMDRECis6MTAwMDgwMDAwODA0MEUwMDYxMDgxMDAwN0UwMDBDMDBBMTJGMjIwMDYxCis6MTAwMDkwMDAwMjAwMEMwMDkzMzAxMDAwOTAwRjM4MDAwMDAwMDgwMEEwCis6MTAwMEEwMDA5MDMwMTAwMDkwMEYzODAwMDAwMDAwMDAwMDAwMDAwMEE5Cis6MTAwMEIwMDAwMDAwMDAwMDAwMDAwMDAwOUMwMDEwMDBBRDRGMjQwMDc0Cis6MTAwMEMwMDAwNDAwMDEwMDAwMTAwNDAwN0UwNDNBMDAxMDQwMDQwMDA3Cis6MTAwMEQwMDAxOTA4MzgwMDAwMDAwMDAwOTkwMDEwMDBGRDZGMjAwMDkyCis6MTAwMEUwMDA5QTAwMTAwMEZEQUYyMDAwOUMwMDEwMDBDODRGMjQwMEIzCis6MTAwMEYwMDAyNDA4MTMwMDAxMDAwQzAwMTMxMjEwMDBGNzBGMjYwMDUzCis6MTAwMTAwMDAwMDEwMDQwMDA0MDAwMTAwMjYwODEzMDAwNjAwMEMwMDgzCis6MTAwMTEwMDAwMDA3MjIwMDI2QzkxMzAwMTMxMzEwMDAwMDA3MzgwMDNGCis6MTAwMTIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMENGCis6MTAwMTMwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNjA4MDAxMDFCMTAwMDc2Cis6MTAwMTQwMDAwNDAwMDUwMDI2MDgxMDAwMTAxMjEwMDBCNjBGMzgwMDM5Cis6MTAwMTUwMDAwMDAwMDAwMDAwMDAwMDAwQTkxNTIxMDA5OTAwMTAwMDE3Cis6MTAwMTYwMDBBNzY1MjAwMDlBMDAxMDAwQTdBNTIwMDA5QzAwMTAwMEExCis6MTAwMTcwMDBBNzQ1MjQwMDM2MDgxMzAwMDAwMDBDMDBFNDBGMjIwMEZECis6MTAwMTgwMDAwMTAwMEMwMDEzMUIxMDAwOEU5RjIyMDA4RTBGMjEwMDE3Cis6MTAwMTkwMDA4RTZGMjIwMDhFNkYyMTAwOEVGRjIyMDA4RTVGMjEwMDY1Cis6MTAwMUEwMDA4RTRGMjEwMEEzMDUzODAwMDQwMDAxMDAwMDEwMDQwMDU4Cis6MTAwMUIwMDBFOThGMjcwMDAwMDgwNDAwMDA4MTAxMDA3RTA0M0EwMDU2Cis6MTAwMUMwMDAyNjA4MTMwMDAxMDAwQzAwQTcwNTIyMDAxMzEzMTAwMERECis6MTAwMUQwMDBBNzA1MzgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDNCCis6MTAwMUUwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBGCis6MTAwMUYwMDAwMDAwMDAwMDMxMDgxMzAwMEIwOTEwMDAxMzQ4MTIwMDIyCis6MTAwMjAwMDA4MEZGMEMwMDAzMDcyNjAwMDAxMDA0MDAwNDAwMDEwMDFBCis6MEIwMjEwMDAwMDA3MzgwMDAwMDAwMDAwNEU0MzgwOTMKKzowMDAwMDAwMUZGCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgTWljcm8gY29kZSBmb3IgODA4NjoxMjI5IFJldiA5ICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9maXJtd2FyZS9lMTAwL2QxMDJlX3Vjb2RlLmJpbi5paGV4IGIvZmlybXdhcmUvZTEwMC9kMTAyZV91Y29kZS5iaW4uaWhleApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTgwNmRhCi0tLSAvZGV2L251bGwKKysrIGIvZmlybXdhcmUvZTEwMC9kMTAyZV91Y29kZS5iaW4uaWhleApAQCAtMCwwICsxLDM4IEBACis6MTAwMDAwMDA4RjAyN0QwMEY5MDQ0MjBFODUwQ0VEMTRFOTE0RkExNEY4Cis6MTAwMDEwMDAzNjBFRjcwRUZGMUZGRjFGQjkxNEUwMDAwMDAwMDAwMEFFCis6MTAwMDIwMDAwMDAwMDAwMDAwMDAwMDAwQkQxNEUwMDAwMDAwMDAwMDFGCis6MTAwMDMwMDAwMDAwMDAwMDAwMDAwMDAwRDUxNEUwMDAwMDAwMDAwMEY3Cis6MTAwMDQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEIwCis6MTAwMDUwMDAwMDAwMDAwMDAwMDAwMDAwQzExNEUwMDAwMDAwMDAwMEVCCis6MTAwMDYwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDkwCis6MTAwMDcwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDgwCis6MTAwMDgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDcwCis6MTAwMDkwMDAwMDAwMDAwMDAwMDAwMDAwQzgxNEUwMDAwMDAwMDAwMEE0Cis6MTAwMEEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNjIwMDBFRTE0RTAwMDQ4Cis6MTAwMEIwMDAwMDAwMDAwMDAwMDAwMDAwODBGRjMwMDA0NjBFOTQwMEE5Cis6MTAwMEMwMDAwMDgyMDMwMDAwMjAxMDAwNDMwRUUwMDAwMDAwMDAwMDRBCis6MTAwMEQwMDAwMDAwMDAwMDAwMDAwMDAwMDYwMDMwMDBGQjE0RTAwMEZCCis6MTAwMEUwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEwCis6MTAwMEYwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCis6MTAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEVGCis6MTAwMTEwMDAwMDAwMDAwMDAwMDAwMDAwNDE2RTkwMDAzQzBFODAwMEQ2Cis6MTAwMTIwMDAzOTBFRTAwMDAwMDAwMDAwRkQ2RTkwMDBGRDBFOTAwMDEyCis6MTAwMTMwMDBGODBFRTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEQ5Cis6MTAwMTQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEFGCis6MTAwMTUwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDlGCis6MTAwMTYwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDhGCis6MTAwMTcwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDdGCis6MTAwMTgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDZGCis6MTAwMTkwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDVGCis6MTAwMUEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDRGCis6MTAwMUIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDNGCis6MTAwMUMwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDJGCis6MTAwMUQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDFGCis6MTAwMUUwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBGCis6MTAwMUYwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEZGCis6MTAwMjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEVFCis6MEIwMjEwMDAwMDAwMDAwMDAwMDAwMDAwMkEzNjJFNTUKKzowMDAwMDAwMUZGCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgTWljcm8gY29kZSBmb3IgdGhlIDgwODY6MTIyOSBSZXYgRi8xMCAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9maXJtd2FyZS90aWdvbi90ZzMuYmluLmloZXggYi9maXJtd2FyZS90aWdvbi90ZzMuYmluLmloZXgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDg0MmQ3YwotLS0gL2Rldi9udWxsCisrKyBiL2Zpcm13YXJlL3RpZ29uL3RnMy5iaW4uaWhleApAQCAtMCwwICsxLDE3NSBAQAorOjEwMDAwMDAwMDAwMDAwMDAwODAwMDAwMDAwMDAwQTgwMDAwMDAwMDA1RQorOjEwMDAxMDAwMTAwMDAwMDMwMDAwMDAwMDAwMDAwMDBEMDAwMDAwMERCMworOjEwMDAyMDAwM0MxRDA4MDAzN0JEM0ZGQzAzQTBGMDIxM0MxMDA4MDAzOAorOjEwMDAzMDAwMjYxMDAwMDAwRTAwMDAxODAwMDAwMDAwMDAwMDAwMEQ1NworOjEwMDA0MDAwM0MxRDA4MDAzN0JEM0ZGQzAzQTBGMDIxM0MxMDA4MDAxOAorOjEwMDA1MDAwMjYxMDAwMzQwRTAwMDIxQzAwMDAwMDAwMDAwMDAwMERGRAorOjEwMDA2MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMjdCREZGRTBDRAorOjEwMDA3MDAwM0MxQ0MwMDBBRkJGMDAxOEFGODA2ODBDMEUwMDAwNENFNQorOjEwMDA4MDAwMjQxQjIxMDU5Nzg1MDAwMDk3ODcwMDAyOTc4MjAwMkM4QQorOjEwMDA5MDAwOTc4MzAwMkUzQzA0MDgwMDI0ODQwOUMwQUZBMDAwMTRGQworOjEwMDBBMDAwMDAwMjE0MDAwMDYyMTgyNTAwMDUyQzAwQUZBMzAwMTAwOAorOjEwMDBCMDAwOEY4NjAwMTAwMEU1MjgyNTBFMDAwMDYwMjQwNzAxMDI0RAorOjEwMDBDMDAwM0MwMkFDMDAzNDQyMDEwMDNDMDNBQzAxMzQ2MzAxMDA0QgorOjEwMDBEMDAwQUY4MjA0OTAzQzAyRkZGRkFGODIwNDk0QUY4MzA0OTg4OAorOjEwMDBFMDAwQUY4MjA0OUMyNDAyMDAwMUFGODI1Q0UwMEUwMDAwM0Y1RQorOjEwMDBGMDAwQUY4MjVEMDAwRTAwMDE0MDAwMDAwMDAwOEZCRjAwMThCRAorOjEwMDEwMDAwMDNFMDAwMDgyN0JEMDAyMDI0MDJGRkZGQUY4MjU0MDQ1MworOjEwMDExMDAwOEY4MzU0MDAzNDYzMDQwMEFGODM1NDAwQUY4MjU0MDRDRgorOjEwMDEyMDAwM0MwMjA4MDAyNDQyMDAzNEFGODI1NDFDMDNFMDAwMDg2MworOjEwMDEzMDAwQUY4MDU0MDAwMDAwMDAwMDAwMDAwMDAwM0MwMjA4MDBGNgorOjEwMDE0MDAwMzQ0MjMwMDAzQzAzMDgwMDM0NjMzMDAwM0MwNDA4MDBCMworOjEwMDE1MDAwMzQ4NDM3RkYzQzAxMDgwMEFDMjIwQTY0MjQwMjAwNDBDQQorOjEwMDE2MDAwM0MwMTA4MDBBQzIyMEE2ODNDMDEwODAwQUMyMDBBNjA4RgorOjEwMDE3MDAwQUM2MDAwMDAyNDYzMDAwNDAwODMxMDJCNTA0MEZGRkQ5RQorOjEwMDE4MDAwQUM2MDAwMDAwM0UwMDAwODAwMDAwMDAwMDA4MDQ4MjE4RgorOjEwMDE5MDAwOEZBQTAwMTAzQzAyMDgwMDhDNDIwQTYwM0MwNDA4MDA1MAorOjEwMDFBMDAwOEM4NDBBNjg4RkFCMDAxNDI0NDMwMDAxMDA0NDEwMkI5OAorOjEwMDFCMDAwM0MwMTA4MDBBQzIzMEE2MDE0NDAwMDAzMDAwMDQwMjEwOQorOjEwMDFDMDAwM0MwMTA4MDBBQzIwMEE2MDNDMDIwODAwOEM0MjBBNjAzNgorOjEwMDFEMDAwM0MwMzA4MDA4QzYzMEE2NDkxMjQwMDAwMDAwMjExNDA3MworOjEwMDFFMDAwMDA0MzEwMjEwMDQ4MTAyMTI1MDgwMDAxQTA0NDAwMDAxMAorOjEwMDFGMDAwMjkwMjAwMDgxNDQwRkZGNDI1MjkwMDAxM0MwMjA4MDBGMAorOjEwMDIwMDAwOEM0MjBBNjAzQzAzMDgwMDhDNjMwQTY0OEY4NDY4MEM4QgorOjEwMDIxMDAwMDAwMjExNDAwMDQzMTAyMUFDNDQwMDA4QUM0NTAwMEMyMgorOjEwMDIyMDAwQUM0NjAwMTBBQzQ3MDAxNEFDNEEwMDE4MDNFMDAwMDhDQworOjEwMDIzMDAwQUM0QjAwMUMwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBBQgorOjEwMDI0MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBBRQorOjEwMDI1MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA5RQorOjEwMDI2MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA4RQorOjEwMDI3MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA3RQorOjEwMDI4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA2RQorOjEwMDI5MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA1RQorOjEwMDJBMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA0RQorOjEwMDJCMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAzRQorOjEwMDJDMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyRQorOjEwMDJEMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxRQorOjEwMDJFMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRQorOjEwMDJGMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBGRQorOjEwMDMwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIwMDAwMDhFMworOjEwMDMxMDAwMDAwMDAwMDAwQTAwMDFFMzNDMEEwMDAxMEEwMDAxRTNCQQorOjEwMDMyMDAwM0MwQTAwMDIwQTAwMDFFMzAwMDAwMDAwMEEwMDAxRTNBOQorOjEwMDMzMDAwMDAwMDAwMDAwQTAwMDFFMzAwMDAwMDAwMEEwMDAxRTNFMQorOjEwMDM0MDAwMDAwMDAwMDAwQTAwMDFFMzAwMDAwMDAwMEEwMDAxRTNEMQorOjEwMDM1MDAwMDAwMDAwMDAwQTAwMDFFMzAwMDAwMDAwMEEwMDAxRTNDMQorOjEwMDM2MDAwMDAwMDAwMDAwQTAwMDFFMzAwMDAwMDAwMEEwMDAxRTNCMQorOjEwMDM3MDAwM0MwQTAwMDcwQTAwMDFFMzNDMEEwMDA4MEEwMDAxRTMwNgorOjEwMDM4MDAwM0MwQTAwMDkwQTAwMDFFMzAwMDAwMDAwMEEwMDAxRTM0MgorOjEwMDM5MDAwMDAwMDAwMDAwQTAwMDFFMzNDMEEwMDBCMEEwMDAxRTMzMAorOjEwMDNBMDAwM0MwQTAwMEMwQTAwMDFFMzNDMEEwMDBEMEEwMDAxRTNDQworOjEwMDNCMDAwMDAwMDAwMDAwQTAwMDFFMzAwMDAwMDAwMEEwMDAxRTM2MQorOjEwMDNDMDAwM0MwQTAwMEUwQTAwMDFFMzAwMDAwMDAwMEEwMDAxRTNGRAorOjEwMDNEMDAwMDAwMDAwMDAwQTAwMDFFMzAwMDAwMDAwMEEwMDAxRTM0MQorOjEwMDNFMDAwMDAwMDAwMDAwQTAwMDFFMzAwMDAwMDAwMEEwMDAxRTMzMQorOjEwMDNGMDAwMDAwMDAwMDAwQTAwMDFFMzAwMDAwMDAwMEEwMDAxRTMyMQorOjEwMDQwMDAwMDAwMDAwMDAwQTAwMDFFMzNDMEEwMDEzMEEwMDAxRTNCNworOjEwMDQxMDAwM0MwQTAwMTQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA4MgorOjEwMDQyMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBDQworOjEwMDQzMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBCQworOjEwMDQ0MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBBQworOjEwMDQ1MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA5QworOjEwMDQ2MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA4QworOjEwMDQ3MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA3QworOjEwMDQ4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA2QworOjEwMDQ5MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA1QworOjEwMDRBMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA0QworOjEwMDRCMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAzQworOjEwMDRDMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyQworOjEwMDREMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxQworOjEwMDRFMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwQworOjEwMDRGMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBGQworOjEwMDUwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMjdCREZGRTAyOAorOjEwMDUxMDAwMDAwMDE4MjEwMDAwMTAyMUFGQkYwMDE4QUZCMTAwMTQ3NworOjEwMDUyMDAwQUZCMDAwMTAzQzAxMDgwMDAwMjIwODIxQUMyMDBBNzA4NgorOjEwMDUzMDAwM0MwMTA4MDAwMDIyMDgyMUFDMjAwQTc0M0MwMTA4MDA5QworOjEwMDU0MDAwMDAyMjA4MjFBQzIwMEE3ODI0NjMwMDAxMTg2MEZGRjUxRQorOjEwMDU1MDAwMjQ0MjAwMEMyNDExMDAwMThGOTA2ODEwMzIwMjAwMDQyNAorOjEwMDU2MDAwMTQ0MDAwMDUyNDA0MDAwMTNDMDIwODAwOEM0MjBBNzg3MworOjEwMDU3MDAwMTg0MDAwMDMwMDAwMjAyMTBFMDAwMTgyMDAwMDAwMDA0RQorOjEwMDU4MDAwMzIwMjAwMDExMDQwMDAwMzAwMDAwMDAwMEUwMDAxNjk2QgorOjEwMDU5MDAwMDAwMDAwMDAwQTAwMDE1M0FGOTE1MDI4OEZCRjAwMThERgorOjEwMDVBMDAwOEZCMTAwMTQ4RkIwMDAxMDAzRTAwMDA4MjdCRDAwMjBCOQorOjEwMDVCMDAwM0MwNTA4MDA4Q0E1MEE3MDNDMDYwODAwOENDNjBBODAyMQorOjEwMDVDMDAwM0MwNzA4MDA4Q0U3MEE3ODI3QkRGRkUwM0MwNDA4MDBFMAorOjEwMDVEMDAwMjQ4NDA5RDBBRkJGMDAxOEFGQTAwMDEwMEUwMDAwNjA0NworOjEwMDVFMDAwQUZBMDAwMTQwRTAwMDE3QjAwMDAyMDIxOEZCRjAwMTg3NworOjEwMDVGMDAwMDNFMDAwMDgyN0JEMDAyMDI0MDIwMDAxOEY4MzY4MTA1QgorOjEwMDYwMDAwMDA4MjEwMDQwMDAyMTAyNzAwNjIxODI0MDNFMDAwMDg5MgorOjEwMDYxMDAwQUY4MzY4MTAyN0JERkZEOEFGQkYwMDI0MTA4MDAwMkUyNQorOjEwMDYyMDAwQUZCMDAwMjA4RjgyNUNFQ0FGQTIwMDE4OEY4MjVDRUMzMAorOjEwMDYzMDAwM0MxMDA4MDAyNjEwMEE3OEFGQTIwMDFDMzQwMjgwMDA4QgorOjEwMDY0MDAwQUY4MjVDRUM4RTAyMDAwMDE4NDAwMDE2MDAwMDAwMDAzMworOjEwMDY1MDAwM0MwMjA4MDA5NDQyMEE3NDhGQTMwMDFDMDAwMjIxQzBDRgorOjEwMDY2MDAwQUM4MzAwMDQ4RkEyMDAxQzNDMDEwODAwMEUwMDAyMDFCNAorOjEwMDY3MDAwQUMyMjBBNzQxMDQwMDAwNTAwMDAwMDAwOEUwMjAwMDA0OQorOjEwMDY4MDAwMjQ0MjAwMDEwQTAwMDFERkFFMDIwMDAwM0MwMjA4MDAyMworOjEwMDY5MDAwOEM0MjBBNzAwMDAyMUMwMjAwMDMyMUMwMEEwMDAxQzUzRQorOjEwMDZBMDAwQUZBMjAwMUMwRTAwMDIwMTAwMDAwMDAwMTA0MDAwMUY1RAorOjEwMDZCMDAwMDAwMDAwMDA4RTAyMDAwMDhGQTMwMDFDMjQ0MjAwMDFGNQorOjEwMDZDMDAwM0MwMTA4MDBBQzIzMEE3MDNDMDEwODAwQUMyMzBBNzQwQQorOjEwMDZEMDAwMEEwMDAxREZBRTAyMDAwMDNDMTAwODAwMjYxMDBBNzg3NAorOjEwMDZFMDAwOEUwMjAwMDAxODQwMDAyODAwMDAwMDAwMEUwMDAyMDFFOQorOjEwMDZGMDAwMDAwMDAwMDAxNDQwMDAyNDAwMDAwMDAwOEUwMjAwMDBGMgorOjEwMDcwMDAwM0MwMzA4MDA4QzYzMEE3MDI0NDJGRkZGQUZBMzAwMUM2NworOjEwMDcxMDAwMTg0MDAwMDZBRTAyMDAwMDAwMDMxNDAyMDAwMjIxQzBDRgorOjEwMDcyMDAwOEM4MjAwMDQzQzAxMDgwMEFDMjIwQTcwOTdBMjAwMUVEMworOjEwMDczMDAwMjQ0MkZGMDAyQzQyMDMwMDE0NDAwMDBCMjQwMjQwMDAxRQorOjEwMDc0MDAwM0MwNDA4MDAyNDg0MDlEQ0FGQTAwMDEwQUZBMDAwMTQxMgorOjEwMDc1MDAwOEZBNjAwMUMyNDA1MDAwODBFMDAwMDYwMDAwMDM4MjE1MAorOjEwMDc2MDAwMEEwMDAxREYwMDAwMDAwMEFGODI1Q0Y4M0MwMjA4MDBENAorOjEwMDc3MDAwOEM0MjBBNDA4RkEzMDAxQzI0NDIwMDAxQUY4MzVDRjgyNgorOjEwMDc4MDAwM0MwMTA4MDBBQzIyMEE0MDhGQkYwMDI0OEZCMDAwMjAzQgorOjEwMDc5MDAwMDNFMDAwMDgyN0JEMDAyODI3QkRGRkUwM0MwNDA4MDA1NworOjEwMDdBMDAwMjQ4NDA5RTgwMDAwMjgyMTAwMDAzMDIxMDAwMDM4MjFCRAorOjEwMDdCMDAwQUZCRjAwMThBRkEwMDAxMDBFMDAwMDYwQUZBMDAwMTQ4MworOjEwMDdDMDAwOEZCRjAwMTgwM0UwMDAwODI3QkQwMDIwOEY4MjY4MEM0RgorOjEwMDdEMDAwOEY4NTY4MEMwMDAyMTgyNzAwMDMxODJCMDAwMzE4MjNDQworOjEwMDdFMDAwMDA0MzEwMjQwMDQ0MTAyMTAwQTIyODJCMTBBMDAwMDY3MgorOjEwMDdGMDAwMDAwMDAwMDAwMDQwMTgyMThGODI2ODBDMDA0MzEwMkI3RAorOjEwMDgwMDAwMTQ0MEZGRkQwMDAwMDAwMDAzRTAwMDA4MDAwMDAwMDBBRAorOjEwMDgxMDAwM0MwNDA4MDA4Qzg0MDAwMDNDMDMwODAwOEM2MzBBNDAwMAorOjEwMDgyMDAwMDA2NDEwMkI1NDQwMDAwMjAwODMxMDIzMDA2NDEwMjM0NgorOjEwMDgzMDAwMkM0MjAwMDgwM0UwMDAwODM4NDIwMDAxMjdCREZGRTAxOQorOjEwMDg0MDAwMDA4MDI4MjEzQzA0MDgwMDI0ODQwQTAwMDAwMDMwMjE5NAorOjEwMDg1MDAwMDAwMDM4MjFBRkJGMDAxOEFGQTAwMDEwMEUwMDAwNjBFQworOjEwMDg2MDAwQUZBMDAwMTQwQTAwMDIxNjAwMDAwMDAwOEZCRjAwMTg5RAorOjEwMDg3MDAwMDNFMDAwMDgyN0JEMDAyMDAwMDAwMDAwMjdCREZGRTBDNgorOjEwMDg4MDAwM0MxQ0MwMDBBRkJGMDAxODBFMDAwMDRDQUY4MDY4MENDRAorOjEwMDg5MDAwM0MwNDA4MDAyNDg0MEExMDAzODAyODIxMDAwMDMwMjEzMQorOjEwMDhBMDAwMDAwMDM4MjFBRkEwMDAxMDBFMDAwMDYwQUZBMDAwMTRCRgorOjEwMDhCMDAwMjQwMkZGRkZBRjgyNTQwNDNDMDIwMEFBMEUwMDAyMzQ1RgorOjEwMDhDMDAwQUY4MjU0MzQ4RkJGMDAxODAzRTAwMDA4MjdCRDAwMjAxQQorOjEwMDhEMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMjdCREZGRTg0RAorOjEwMDhFMDAwQUZCMDAwMTAyNDEwMDAwMUFGQkYwMDE0M0MwMUMwMDNFMgorOjEwMDhGMDAwQUMyMDAwMDA4RjgyNjgxMDMwNDIyMDAwMTA0MDAwMDNCRQorOjEwMDkwMDAwMDAwMDAwMDAwRTAwMDI0NjAwMDAwMDAwMEEwMDAyM0E0QgorOjEwMDkxMDAwQUY5MDU0Mjg4RkJGMDAxNDhGQjAwMDEwMDNFMDAwMDg4MAorOjEwMDkyMDAwMjdCRDAwMTgyN0JERkZGODhGODQ1RDBDM0MwMjAwRkYzNworOjEwMDkzMDAwM0MwMzA4MDA4QzYzMEE1MDM0NDJGRkY4MDA4MjEwMjQwNAorOjEwMDk0MDAwMTA0MzAwMUUzQzA1MDBGRjM0QTVGRkY4M0MwNkMwMDMyMQorOjEwMDk1MDAwM0MwNzQwMDAwMDg1MTgyNDhDNjIwMDEwM0MwMTA4MDAxMAorOjEwMDk2MDAwQUMyMzBBNTAzMDQyMDAwODEwNDAwMDA1MDA4NzEwMjVEMworOjEwMDk3MDAwOENDMjAwMDAyNDQyMDAwMUFDQzIwMDAwMDA4NzEwMjU5OAorOjEwMDk4MDAwQUY4MjVEMEM4RkEyMDAwMDI0NDIwMDAxQUZBMjAwMDBFNAorOjEwMDk5MDAwOEZBMjAwMDA4RkEyMDAwMDI0NDIwMDAxQUZBMjAwMDAzRAorOjEwMDlBMDAwOEZBMjAwMDA4Rjg0NUQwQzNDMDMwODAwOEM2MzBBNTAwQQorOjEwMDlCMDAwMDA4NTEwMjQxNDQzRkZFODAwODUxODI0MjdCRDAwMDg5MworOjEwMDlDMDAwMDNFMDAwMDgwMDAwMDAwMDAwMDAwMDAwMzUzNzMwMzE2RgorOjEwMDlEMDAwNzI2QzczNDEwMDAwMDAwMDAwMDAwMDAwNTM3NzQ1NzYwMAorOjEwMDlFMDAwNjU2RTc0MzAwMDAwMDAwMDcyNkM3MDQ1NzY2NTZFNzQ0MAorOjEwMDlGMDAwMzEwMDAwMDA1NTZFNkI2RTQ1NzY2RTc0MDAwMDAwMDA4RAorOjEwMEEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNjY2MTc0NjE0QQorOjEwMEExMDAwNkM0NTcyNzIwMDAwMDAwMDAwMDAwMDAwNEQ2MTY5NkVCQworOjEwMEEyMDAwNDM3MDc1NDIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA1QworOjEwMEEzMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBCNgorOjEwMEE0MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBBNgorOjEwMEE1MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA5NgorOjBDMEE2MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwOEEKKzowMDAwMDAwMUZGCisgKiBGaXJtd2FyZSBpczoKKyAqCURlcml2ZWQgZnJvbSBwcm9wcmlldGFyeSB1bnB1Ymxpc2hlZCBzb3VyY2UgY29kZSwKKyAqCUNvcHlyaWdodCAoQykgMjAwMC0yMDAzIEJyb2FkY29tIENvcnBvcmF0aW9uLgorICoKKyAqCVBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQgZm9yIHRoZSBkaXN0cmlidXRpb24gb2YgdGhpcyBmaXJtd2FyZQorICoJZGF0YSBpbiBoZXhhZGVjaW1hbCBvciBlcXVpdmFsZW50IGZvcm1hdCwgcHJvdmlkZWQgdGhpcyBjb3B5cmlnaHQKKyAqCW5vdGljZSBpcyBhY2NvbXBhbnlpbmcgaXQuCmRpZmYgLS1naXQgYS9maXJtd2FyZS90aWdvbi90ZzNfdHNvLmJpbi5paGV4IGIvZmlybXdhcmUvdGlnb24vdGczX3Rzby5iaW4uaWhleApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTBjNGVmCi0tLSAvZGV2L251bGwKKysrIGIvZmlybXdhcmUvdGlnb24vdGczX3Rzby5iaW4uaWhleApAQCAtMCwwICsxLDQ0NiBAQAorOjEwMDAwMDAwMDEwNjAwMDAwODAwMDAwMDAwMDAyNDE0MEUwMDAwMDM5OAorOjEwMDAxMDAwMDAwMDAwMDAwODAwMUIyNDAwMDAwMDAwMTAwMDAwMDM4NgorOjEwMDAyMDAwMDAwMDAwMDAwMDAwMDAwRDAwMDAwMDBEM0MxRDA4MDA1NQorOjEwMDAzMDAwMzdCRDQwMDAwM0EwRjAyMTNDMTAwODAwMjYxMDAwMDA0RQorOjEwMDA0MDAwMEUwMDAwMTAwMDAwMDAwMDAwMDAwMDBEMjdCREZGRTBDMgorOjEwMDA1MDAwM0MwNEZFRkVBRkJGMDAxODBFMDAwNUQ4MzQ4NDAwMDIzOQorOjEwMDA2MDAwMEUwMDA2NjgwMDAwMDAwMDNDMDMwODAwOTA2MzFCNjg1NworOjEwMDA3MDAwMjQwMjAwMDIzQzA0MDgwMDI0ODQxQUFDMTQ2MjAwMDMyOQorOjEwMDA4MDAwMjQwNTAwMDEzQzA0MDgwMDI0ODQxQUEwMjQwNjAwMDY2QworOjEwMDA5MDAwMDAwMDM4MjFBRkEwMDAxMDBFMDAwNjdDQUZBMDAwMTRCNQorOjEwMDBBMDAwOEY2MjVDNTAzNDQyMDAwMUFGNjI1QzUwOEY2MjVDOTBBMgorOjEwMDBCMDAwMzQ0MjAwMDFBRjYyNUM5MDI0MDJGRkZGMEUwMDAwMzQ2NgorOjEwMDBDMDAwQUY2MjU0MDQ4RkJGMDAxODAzRTAwMDA4MjdCRDAwMjA3MgorOjEwMDBEMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMjdCREZGRTA1RAorOjEwMDBFMDAwQUZCRjAwMUNBRkIyMDAxOEFGQjEwMDE0MEUwMDAwNUIzMAorOjEwMDBGMDAwQUZCMDAwMTAyNDEyMDAwMjI0MTEwMDAxOEY3MDY4MjA5QworOjEwMDEwMDAwMzIwMjAxMDAxMDQwMDAwMzAwMDAwMDAwMEUwMDAwQkI5RQorOjEwMDExMDAwMDAwMDAwMDA4RjcwNjgyMDMyMDIyMDAwMTA0MDAwMDRCMAorOjEwMDEyMDAwMzIwMjAwMDEwRTAwMDFGMDI0MDQwMDAxMzIwMjAwMDEzRAorOjEwMDEzMDAwMTA0MDAwMDMwMDAwMDAwMDBFMDAwMEEzMDAwMDAwMDBCQgorOjEwMDE0MDAwM0MwMjA4MDA5MDQyMUI5ODE0NTIwMDAzMDAwMDAwMDA3QgorOjEwMDE1MDAwMEUwMDA0QzAwMDAwMDAwMDBBMDAwMDNDQUY3MTUwMjhFRgorOjEwMDE2MDAwOEZCRjAwMUM4RkIyMDAxODhGQjEwMDE0OEZCMDAwMTAyOQorOjEwMDE3MDAwMDNFMDAwMDgyN0JEMDAyMDI3QkRGRkUwM0MwNDA4MDA4NQorOjEwMDE4MDAwMjQ4NDFBQzAwMDAwMjgyMTAwMDAzMDIxMDAwMDM4MjFGQQorOjEwMDE5MDAwQUZCRjAwMThBRkEwMDAxMDBFMDAwNjdDQUZBMDAwMTQ4NworOjEwMDFBMDAwM0MwNDA4MDAyNDg0MjNEOEE0ODAwMDAwM0MwMTA4MDBGQgorOjEwMDFCMDAwQTAyMDFCOTgzQzAxMDgwMEFDMjAxQjlDM0MwMTA4MDBCRgorOjEwMDFDMDAwQUMyMDFCQTAzQzAxMDgwMEFDMjAxQkE0M0MwMTA4MDA5MworOjEwMDFEMDAwQUMyMDFCQUMzQzAxMDgwMEFDMjAxQkI4M0MwMTA4MDA2MworOjEwMDFFMDAwQUMyMDFCQkM4RjYyNDQzNDNDMDEwODAwQUMyMjFCODg0RAorOjEwMDFGMDAwOEY2MjQ0MzgzQzAxMDgwMEFDMjIxQjhDOEY2MjQ0MTA5MworOjEwMDIwMDAwQUM4MEY3QTgzQzAxMDgwMEFDMjAxQjg0M0MwMTA4MDAyRQorOjEwMDIxMDAwQUMyMDIzRTAzQzAxMDgwMEFDMjAyM0M4M0MwMTA4MDBDRQorOjEwMDIyMDAwQUMyMDIzQ0MzQzAxMDgwMEFDMjAyNDAwM0MwMTA4MDA5OQorOjEwMDIzMDAwQUMyMjFCOTA4RjYyMDA2ODI0MDMwMDA3MDAwMjE3MDJBMworOjEwMDI0MDAwMTA0MzAwMDUwMDAwMDAwMDhGNjIwMDY4MDAwMjE3MDJFMgorOjEwMDI1MDAwMTQ0MDAwMDQyNDAyMDAwMTNDMDEwODAwMEEwMDAwOTczOQorOjEwMDI2MDAwQUMyMDI0MENBQzgyMDAzNDNDMDQwODAwMjQ4NDFBQ0M1QQorOjEwMDI3MDAwM0MwNTA4MDA4Q0E1MjQwQzAwMDAzMDIxMDAwMDM4MjEyQQorOjEwMDI4MDAwQUZBMDAwMTAwRTAwMDY3Q0FGQTAwMDE0OEZCRjAwMThCNgorOjEwMDI5MDAwMDNFMDAwMDgyN0JEMDAyMDI3QkRGRkUwM0MwNDA4MDA2NAorOjEwMDJBMDAwMjQ4NDFBRDgwMDAwMjgyMTAwMDAzMDIxMDAwMDM4MjFDMQorOjEwMDJCMDAwQUZCRjAwMThBRkEwMDAxMDBFMDAwNjdDQUZBMDAwMTQ2NgorOjEwMDJDMDAwMEUwMDAwNUIwMDAwMDAwMDBFMDAwMEI0MDAwMDIwMjFDMgorOjEwMDJEMDAwOEZCRjAwMTgwM0UwMDAwODI3QkQwMDIwMjQwMjAwMDFBMgorOjEwMDJFMDAwOEY2MzY4MjAwMDgyMTAwNDAwMDIxMDI3MDA2MjE4MjQyNworOjEwMDJGMDAwMDNFMDAwMDhBRjYzNjgyMDI3QkRGRkQwQUZCRjAwMkMyQworOjEwMDMwMDAwQUZCNjAwMjhBRkI1MDAyNEFGQjQwMDIwQUZCMzAwMUNENworOjEwMDMxMDAwQUZCMjAwMThBRkIxMDAxNEFGQjAwMDEwOEY2NzVDNUNEMworOjEwMDMyMDAwM0MwMzA4MDAyNDYzMUJCQzhDNjIwMDAwMTQ0NzAwMDVEQQorOjEwMDMzMDAwM0MwMjAwRkYzQzAyMDgwMDkwNDIxQjk4MTQ0MDAxMTk0NworOjEwMDM0MDAwM0MwMjAwRkYzNDQyRkZGODAwRTI4ODI0QUM2NzAwMDA2MgorOjEwMDM1MDAwMDAxMTE5MDIzMDYzMDBGRjMwRTIwMDAzMDAwMjExQzBGNworOjEwMDM2MDAwMDA2MjI4MjUwMEEwNDAyMTAwMDcxNjAyM0MwMzA4MDA3NworOjEwMDM3MDAwOTA2MzFCOTgzMDQ0MDAwRjE0NjAwMDM2MDA4MDQ4MjFDMQorOjEwMDM4MDAwMjQwMjAwMDEzQzAxMDgwMEEwMjIxQjk4MDAwNTExMDA3NgorOjEwMDM5MDAwMDA4MjEwMjUzQzAxMDgwMEFDMjAxQjlDM0MwMTA4MDA5OQorOjEwMDNBMDAwQUMyMDFCQTAzQzAxMDgwMEFDMjAxQkE0M0MwMTA4MDBCMQorOjEwMDNCMDAwQUMyMDFCQUMzQzAxMDgwMEFDMjAxQkI4M0MwMTA4MDA4MQorOjEwMDNDMDAwQUMyMDFCQjAzQzAxMDgwMEFDMjAxQkI0M0MwMTA4MDA3MQorOjEwMDNEMDAwQTQyMjIzRDg5NjIyMDAwQzMwNDM3RkZGM0MwMTA4MDA2MgorOjEwMDNFMDAwQTQyMjI0MTAzMDQyODAwMDNDMDEwODAwQTQyMzFCQzYzNAorOjEwMDNGMDAwMTA0MDAwMDUyNDAyMDAwMTNDMDEwODAwQUMyMjIzRjQ1NworOjEwMDQwMDAwMEEwMDAxMDIyNDA2MDAzRTI0MDYwMDM2M0MwMTA4MDBEMgorOjEwMDQxMDAwQUMyMDIzRjQ5NjIyMDAwQTNDMDMwODAwOTQ2MzFCQzYxOAorOjEwMDQyMDAwM0MwMTA4MDBBQzIwMjNGMDNDMDEwODAwQUMyMDIzRjg3QworOjEwMDQzMDAwMDAwMjEzMDIwMDAyMTA4MDAwQzIxMDIxMDA2MjE4MjE4NQorOjEwMDQ0MDAwM0MwMTA4MDBBNDIyMjNEMDNDMDEwODAwMEEwMDAxMTU0OQorOjEwMDQ1MDAwQTQyMzFCOTY5NjIyMDAwQzNDMDEwODAwQTQyMjIzRUM0NgorOjEwMDQ2MDAwM0MwNDA4MDAyNDg0MUI5QzhDODIwMDAwMDAwMjExMDBDNAorOjEwMDQ3MDAwM0MwMTA4MDAwMDIyMDgyMUFDMzExQkM4OEM4MjAwMDAxRQorOjEwMDQ4MDAwMDAwMjExMDAzQzAxMDgwMDAwMjIwODIxQUMyNzFCQ0MwRgorOjEwMDQ5MDAwOEM4MjAwMDAyNTAzMDAwMTMwNjYwMUZGMDAwMjExMDA3QworOjEwMDRBMDAwM0MwMTA4MDAwMDIyMDgyMUFDMjYxQkQwOEM4MjAwMDBGMQorOjEwMDRCMDAwMDAwMjExMDAzQzAxMDgwMDAwMjIwODIxQUMyOTFCRDRENQorOjEwMDRDMDAwOTYyMzAwMDgzQzAyMDgwMDhDNDIxQkFDMDA0MzI4MjEwNAorOjEwMDREMDAwM0MwMTA4MDBBQzI1MUJBQzk2MjIwMDBBMzA0MjAwMDQwNworOjEwMDRFMDAwMTQ0MDAwMTgwMDA2MTEwMDhGNjMwQzE0MzA2MzAwMEZENQorOjEwMDRGMDAwMkM2MjAwMDIxNDQwMDAwQjNDMDJDMDAwOEY2MzBDMTRGRAorOjEwMDUwMDAwM0MwMjA4MDA4QzQyMUI0MDMwNjMwMDBGMjQ0MjAwMDE3MworOjEwMDUxMDAwM0MwMTA4MDBBQzIyMUI0MDJDNjIwMDAyMTA0MEZGRjc5NworOjEwMDUyMDAwM0MwMkMwMDAwMEUyMTgyNUFGNjM1QzVDOEY2MjVDNTA0NworOjEwMDUzMDAwMzA0MjAwMDIxMDQwMDAxNDAwMDAwMDAwMEEwMDAxNDc5MQorOjEwMDU0MDAwMDAwMDAwMDAzQzAzMDgwMDhDNjMxQjgwM0MwNDA4MDA5MgorOjEwMDU1MDAwOTQ4NDFCOTQwMTIyMTAyNTNDMDEwODAwQTQyMjIzREE3NAorOjEwMDU2MDAwMjQwMjAwMDEzQzAxMDgwMEFDMjIxQkI4MjQ2MzAwMDFGNgorOjEwMDU3MDAwMDA4NTIwMkEzQzAxMDgwMDEwODAwMDAzQUMyMzFCODA2QQorOjEwMDU4MDAwM0MwMTA4MDBBNDI1MUI5NDNDMDYwODAwMjRDNjFCOUNDMworOjEwMDU5MDAwOENDMjAwMDAyNDQyMDAwMUFDQzIwMDAwMjg0MjAwODA0RQorOjEwMDVBMDAwMTQ0MDAwMDUwMDAwMDAwMDBFMDAwNjU2MjQwNDAwMDI1RQorOjEwMDVCMDAwMEEwMDAxRTYwMDAwMDAwMDNDMDIwODAwOEM0MjFCQjg2MworOjEwMDVDMDAwMTA0MDAwNzgyNDAyMDAwMTNDMDUwODAwOTBBNTFCOTgwQgorOjEwMDVEMDAwMTRBMjAwNzIwMDAwMDAwMDNDMTUwODAwOTZCNTFCOTY5RQorOjEwMDVFMDAwM0MwNDA4MDA4Qzg0MUJBQzMyQTNGRkZGMDA4MzEwMkE1QworOjEwMDVGMDAwMTQ0MDAwNkMwMDAwMDAwMDE0ODMwMDAzMDAwMDAwMDBBMQorOjEwMDYwMDAwM0MwMTA4MDBBQzI1MjNGMDEwNjAwMDVDMDAwMDkwMjE0NAorOjEwMDYxMDAwMjRENjAwMDQwMDYwQTAyMTI0RDMwMDE0OEVDMjAwMDA2MAorOjEwMDYyMDAwMDAwMjgxMDAzQzExMDgwMDAyMzA4ODIxMEUwMDA2MjVERQorOjEwMDYzMDAwOEUzMTFCQzgwMDQwMjgyMTEwQTAwMDU0MDAwMDAwMDA4QgorOjEwMDY0MDAwOTYyODAwMEEzMTAyMDA0MDEwNDAwMDA1MjQwNzE4MENDQgorOjEwMDY1MDAwOEUyMjAwMEMyNDA3MTg4QzAwMDIxNDAwQUNBMjAwMTg5MworOjEwMDY2MDAwM0MwMzA4MDAwMDcwMTgyMThDNjMxQkQwM0MwMjA4MDA3QQorOjEwMDY3MDAwMDA1MDEwMjE4QzQyMUJENDAwMDMxRDAwMDAwMjE0MDAwNgorOjEwMDY4MDAwMDA2MjE4MjVBQ0EzMDAxNDhFQzMwMDA0OTYyMjAwMDg1MworOjEwMDY5MDAwMDA0MzIwMjMzMjQyRkZGRjMwODNGRkZGMDA0MzEwMjEzRAorOjEwMDZBMDAwMDI4MjEwMkExNDQwMDAwMjAyQjIzMDIzMDA4MDMwMjE1RQorOjEwMDZCMDAwOEU2MjAwMDAzMEM0RkZGRjAwNDQxMDIxQUU2MjAwMDBEMworOjEwMDZDMDAwOEUyMjAwMDBBQ0EyMDAwMDhFMjIwMDA0OEU2M0ZGRjQ5NAorOjEwMDZEMDAwMDA0MzEwMjFBQ0EyMDAwNEE0QTYwMDBFOEU2MkZGRjQxOQorOjEwMDZFMDAwMDA0NDEwMjFBRTYyRkZGNDk2MjMwMDA4MDA0MzEwMkE1NAorOjEwMDZGMDAwMTQ0MDAwMDUwMjQ2OTAyMThFNjJGRkYwQUU2MEZGRjRDOAorOjEwMDcwMDAwMjQ0MjAwMDFBRTYyRkZGMEFDQTAwMDA4MzI0MkZGRkZCRAorOjEwMDcxMDAwMTQ1NDAwMDgyNDAyMDMwNTMxMDIwMDgwNTQ0MDAwMDFGMworOjEwMDcyMDAwMzRFNzAwMTAyNDAyMDkwNUE0QTIwMDBDMEEwMDAxQ0I0MgorOjEwMDczMDAwMzRFNzAwMjBBNEEyMDAwQzNDMDIwODAwOEM0MjIzRjAwNQorOjEwMDc0MDAwMTA0MDAwMDMzQzAyNEI2NTBBMDAwMUQzMzQ0Mjc2NTQ0QQorOjEwMDc1MDAwM0MwMkI0OUEzNDQyODlBQkFDQTIwMDFDMzBFMkZGRkZFOQorOjEwMDc2MDAwQUNBMjAwMTAwRTAwMDVBMjAwQTAyMDIxMzI0MkZGRkYyMworOjEwMDc3MDAwMDA1NDEwMkIxNDQwRkZBOTAwMDAwMDAwMjQwMjAwMDJDNgorOjEwMDc4MDAwM0MwMTA4MDAwQTAwMDFFNkEwMjIxQjk4OEVDMjA4M0MyQQorOjEwMDc5MDAwMjQ0MjAwMDEwQTAwMDFFNkFFQzIwODNDMEUwMDA0QzA3QgorOjEwMDdBMDAwMDAwMDAwMDA4RkJGMDAyQzhGQjYwMDI4OEZCNTAwMjRGQQorOjEwMDdCMDAwOEZCNDAwMjA4RkIzMDAxQzhGQjIwMDE4OEZCMTAwMTRDQgorOjEwMDdDMDAwOEZCMDAwMTAwM0UwMDAwODI3QkQwMDMwMjdCREZGRDAyOAorOjEwMDdEMDAwQUZCRjAwMjhBRkIzMDAyNEFGQjIwMDIwQUZCMTAwMUMwMAorOjEwMDdFMDAwQUZCMDAwMTg4RjcyNUM5QzNDMDIwMEZGMzQ0MkZGRjhFRgorOjEwMDdGMDAwM0MwNzA4MDAyNEU3MUJCNDAyNDI4ODI0OTYyMzAwMEUxRAorOjEwMDgwMDAwOENFMjAwMDAwMDQzMTAyMUFDRTIwMDAwOEUyMjAwMTBCOAorOjEwMDgxMDAwMzA0MjAwMjAxNDQwMDAxMTAwODA5ODIxMEUwMDA2M0I1OQorOjEwMDgyMDAwMDIyMDIwMjEzQzAyQzAwMDAyNDIxODI1QUY2MzVDOUNEQworOjEwMDgzMDAwOEY2MjVDOTAzMDQyMDAwMjEwNDAwMTFFMDAwMDAwMDBGOAorOjEwMDg0MDAwQUY2MzVDOUM4RjYyNUM5MDMwNDIwMDAyMTA0MDAxMTlFMworOjEwMDg1MDAwMDAwMDAwMDAwQTAwMDIwRDAwMDAwMDAwOEUyNDAwMDhDNQorOjEwMDg2MDAwOEUyMzAwMTQwMDA0MTQwMjAwMDIzMUMwMDAwMzE1MDI5QworOjEwMDg3MDAwMzA0MjAxRkYyNDQyRkZGRjMwNDIwMDdGMDAwMzE5NDI1MworOjEwMDg4MDAwMzA2Mzc4MDAwMDAyMTEwMDI0NDI0MDAwMDA2MjQ4MjFEOQorOjEwMDg5MDAwOTUyMjAwMEEzMDg0RkZGRjMwNDIwMDA4MTA0MDAwQjA2QgorOjEwMDhBMDAwMDAwNDI5QzAzQzAyMDgwMDhDNDIyNDAwMTQ0MDAwMjRBQgorOjEwMDhCMDAwMjRDNTAwMDg5NEMyMDAxNDNDMDEwODAwQTQyMjIzRDBERgorOjEwMDhDMDAwOENDNDAwMTAwMDA0MTQwMjNDMDEwODAwQTQyMjIzRDJBRQorOjEwMDhEMDAwM0MwMTA4MDBBNDI0MjNENDk0QzIwMDBFMzA4M0ZGRkZGRgorOjEwMDhFMDAwMDA0MzEwMjMzQzAxMDgwMEFDMjIyNDA4OTRDMjAwMUFFMworOjEwMDhGMDAwM0MwMTA4MDBBQzI2MjQwMDNDMDEwODAwQUMzMjI0MDQ3MgorOjEwMDkwMDAwM0MwMTA4MDBBQzIyMjNGQzNDMDJDMDAwMDI0MjE4MjUzNgorOjEwMDkxMDAwQUY2MzVDOUM4RjYyNUM5MDMwNDIwMDAyMTA0MDAwRTU0NworOjEwMDkyMDAwMDAwMDAwMDBBRjYzNUM5QzhGNjI1QzkwMzA0MjAwMDI2QworOjEwMDkzMDAwMTA0MDAwRTAwMDAwMDAwMDBBMDAwMjQ2MDAwMDAwMDAzNQorOjEwMDk0MDAwOTRDMjAwMEUzQzAzMDgwMDk0NjMyM0Q0MDA0MzQwMjM2OAorOjEwMDk1MDAwMzEwM0ZGRkYyQzYyMDAwODEwNDAwMDFDMDAwMDAwMDA2MworOjEwMDk2MDAwOTRDMjAwMTQyNDQyMDAyODAwQTIyODIxMDAwMzEwNDI0RgorOjEwMDk3MDAwMTg0MDAwMEIwMDAwMjAyMTI0RTYwODQ4MDA0MDM4MjFFMAorOjEwMDk4MDAwOTRBMzAwMDA4Q0MyMDAwMDI0ODQwMDAxMDA0MzEwMjFDNQorOjEwMDk5MDAwQUNDMjAwMDAwMDg3MTAyQTE0NDBGRkY5MjRBNTAwMDIxMQorOjEwMDlBMDAwMzEwMjAwMDExMDQwMDAxRjNDMDI0MDAwM0MwNDA4MDBERQorOjEwMDlCMDAwMjQ4NDIzRkNBMEEwMDAwMTk0QTMwMDAwOEM4MjAwMDBFQQorOjEwMDlDMDAwMDA0MzEwMjEwQTAwMDI4NUFDODIwMDAwOEY2MjY4MDA5QgorOjEwMDlEMDAwM0MwMzAwMTAwMDQzMTAyNDEwNDAwMDA5MDAwMDAwMDBGOAorOjEwMDlFMDAwOTRDMjAwMUEzQzAzMDgwMDhDNjMyM0ZDMDA0MzEwMjFDRQorOjEwMDlGMDAwM0MwMTA4MDBBQzIyMjNGQzBBMDAwMjg2M0MwMjQwMDBCNQorOjEwMEEwMDAwOTRDMjAwMUE5NEM0MDAxQzNDMDMwODAwOEM2MzIzRkNBRAorOjEwMEExMDAwMDA0NDEwMjMwMDYyMTgyMTNDMDEwODAwQUMyMzIzRkM5MQorOjEwMEEyMDAwM0MwMjQwMDAwMjQyMTgyNUFGNjM1QzlDOEY2MjVDOTBFMAorOjEwMEEzMDAwMzA0MjAwMDIxNDQwRkZGQzAwMDAwMDAwOTUyMjAwMEEzMgorOjEwMEE0MDAwMzA0MjAwMTAxMDQwMDA5QjAwMDAwMDAwM0MwMzA4MDBGMgorOjEwMEE1MDAwOTQ2MzIzRDQzQzA3MDgwMDI0RTcyNDAwOENFNDAwMDBCRQorOjEwMEE2MDAwOEY2MjY4MDAyNDYzMDAzMDAwODMyODIxM0MwMzAwMTA1QgorOjEwMEE3MDAwMDA0MzEwMjQxNDQwMDAwQTAwMDAwMDAwOTRBMjAwMDQ2NworOjEwMEE4MDAwM0MwNDA4MDA4Qzg0MjQwODNDMDMwODAwOEM2MzIzRkM4RAorOjEwMEE5MDAwMDA0NDEwMjMwMDYyMTgyMTNDMDEwODAwQUMyMzIzRkMxMQorOjEwMEFBMDAwM0MwNDA4MDA4Qzg0MjNGQzAwMDQxQzAyMzA4MkZGRkZGRAorOjEwMEFCMDAwMDA2MjIwMjEwMDA0MTQwMjAwODIyMDIxMDAwNDEwMjc3QgorOjEwMEFDMDAwQTRBMjAwMDYzQzAzMDgwMDhDNjMyNDA0M0MwMjAwRkYzRgorOjEwMEFEMDAwMzQ0MkZGRjgwMDYyODgyNDk2MjIwMDA4MjQwNTAwMDFCMQorOjEwMEFFMDAwMjQwMzQwMDAwMDAyMzFDMDAwODAxMDIxQTRDMjAwMUE3QgorOjEwMEFGMDAwQTRDMDAwMUNBQ0UwMDAwMDNDMDEwODAwQUMyNTFCNjA1OQorOjEwMEIwMDAwQUY2MzVDQjg4RjYyNUNCMDMwNDIwMDAyMTA0MDAwMDNGQgorOjEwMEIxMDAwMDAwMDAwMDAzQzAxMDgwMEFDMjAxQjYwOEUyMjAwMDg5MQorOjEwMEIyMDAwQUY2MjVDQjg4RjYyNUNCMDMwNDIwMDAyMTA0MDAwMDNEQworOjEwMEIzMDAwMDAwMDAwMDAzQzAxMDgwMEFDMjAxQjYwM0MwMjA4MDBFMworOjEwMEI0MDAwOEM0MjFCNjAxMDQwRkZFQzAwMDAwMDAwM0MwNDA4MDBEOQorOjEwMEI1MDAwMEUwMDA2M0I4Qzg0MjQwNDBBMDAwMzJBMDAwMDAwMDBENworOjEwMEI2MDAwM0MwMzA4MDA5MDYzMUI5ODI0MDIwMDAyMTQ2MjAwMDNGNworOjEwMEI3MDAwM0MwMzRCNjUwQTAwMDJFMTAwMDA4MDIxOEUyMjAwMUMyQworOjEwMEI4MDAwMzQ2Mzc2NTQxMDQzMDAwMjI0MTAwMDAyMjQxMDAwMDE0NAorOjEwMEI5MDAwMDBDMDIwMjEwRTAwMDM1MDAyMDAzMDIxMjQwMjAwMDM3NworOjEwMEJBMDAwM0MwMTA4MDBBMDIyMUI5ODI0MDIwMDAyMTIwMjAwMEE0NQorOjEwMEJCMDAwMjQwMjAwMDEzQzAzMDgwMDhDNjMyM0YwMTA2MjAwMDY0RAorOjEwMEJDMDAwMDAwMDAwMDAzQzAyMDgwMDk0NDIyM0Q4MDAwMjE0MDBGOAorOjEwMEJEMDAwMEEwMDAzMUZBRTIyMDAxNDNDMDQwODAwMjQ4NDIzREExOAorOjEwMEJFMDAwOTQ4MjAwMDAwMDAyMTQwMEFFMjIwMDE0M0MwMjA4MDBBRgorOjEwMEJGMDAwOEM0MjFCQkMzQzAzQzAwMDNDMDEwODAwQTAyMDFCOTg5OQorOjEwMEMwMDAwMDA0MzEwMjVBRjYyNUM1QzhGNjI1QzUwMzA0MjAwMDI5MgorOjEwMEMxMDAwMTA0MDAwMDkwMDAwMDAwMDI0ODRGN0UyOEM4MjAwMDBFQworOjEwMEMyMDAwMDA0MzEwMjVBRjYyNUM1QzhGNjI1QzUwMzA0MjAwMDI3MgorOjEwMEMzMDAwMTQ0MEZGRkEwMDAwMDAwMDNDMDIwODAwMjQ0MjFCODQxQworOjEwMEM0MDAwOEM0MzAwMDAyNDYzMDAwMUFDNDMwMDAwOEY2MzBDMTQ0QworOjEwMEM1MDAwMzA2MzAwMEYyQzYyMDAwMjE0NDAwMDBDM0MwMjQwMDA4NAorOjEwMEM2MDAwOEY2MzBDMTQzQzAyMDgwMDhDNDIxQjQwMzA2MzAwMEY2MQorOjEwMEM3MDAwMjQ0MjAwMDEzQzAxMDgwMEFDMjIxQjQwMkM2MjAwMDIwRgorOjEwMEM4MDAwMTA0MEZGRjcwMDAwMDAwMDNDMDI0MDAwMDI0MjE4MjUxRgorOjEwMEM5MDAwQUY2MzVDOUM4RjYyNUM5MDMwNDIwMDAyMTQ0MEZGRkNBQQorOjEwMENBMDAwMDAwMDAwMDAxMjYwMDAwMzAwMDAwMDAwMEUwMDA0QzBGRAorOjEwMENCMDAwMDAwMDAwMDA4RkJGMDAyODhGQjMwMDI0OEZCMjAwMjBGNworOjEwMENDMDAwOEZCMTAwMUM4RkIwMDAxODAzRTAwMDA4MjdCRDAwMzA3MgorOjEwMENEMDAwOEY2MzQ0NTAzQzA0MDgwMDI0ODQxQjg4OEM4MjAwMDBFRAorOjEwMENFMDAwMDAwMzFDMDIwMDQzMTAyQjE0NDAwMDA3M0MwMzgwMDA0QgorOjEwMENGMDAwOEM4NDAwMDQ4RjYyNDQ1MDAwMDIxQzAyMDA4MzEwMkI3RAorOjEwMEQwMDAwMTA0MEZGRkMzQzAzODAwMEFGNjM0NDQ0OEY2MjQ0NDRDNgorOjEwMEQxMDAwMDA0MzEwMjQxNDQwRkZGRDAwMDAwMDAwOEY2MjQ0NDg4RgorOjEwMEQyMDAwMDNFMDAwMDgzMDQyRkZGRjNDMDI0MDAwMDA4MjIwMjUyMworOjEwMEQzMDAwQUY2NDVDMzg4RjYyNUMzMDMwNDIwMDAyMTQ0MEZGRkNDQworOjEwMEQ0MDAwMDAwMDAwMDAwM0UwMDAwODAwMDAwMDAwMjdCREZGRTBGNQorOjEwMEQ1MDAwMDA4MDU4MjExNEMwMDAxMTI1NkUwMDA4M0MwMjA4MDBENAorOjEwMEQ2MDAwOEM0MjIzRjQxMDQwMDAwNzI0MDIwMDE2M0MwMTA4MDBDNgorOjEwMEQ3MDAwQTQyMjIzRDIyNDAyMDAyQTNDMDEwODAwMEEwMDAzNjRCMgorOjEwMEQ4MDAwQTQyMjIzRDQ4RDY3MDAxMDAwMDcxNDAyM0MwMTA4MDA0MAorOjEwMEQ5MDAwQTQyMjIzRDIzQzAxMDgwMEE0MjcyM0Q0M0MwNDA4MDA0OQorOjEwMERBMDAwOTQ4NDIzRDQzQzAzMDgwMDk0NjMyM0QyOTVDRjAwMDY5NworOjEwMERCMDAwM0MwMjA4MDA5NDQyMjNEMDAwODMyMDIzMDFFMkMwMjM5OAorOjEwMERDMDAwMzA2NUZGRkYyNEEyMDAyODAxQzI0ODIxMzA4MkZGRkZDNgorOjEwMEREMDAwMTRDMDAwMUEwMTIyNjAyMTk1ODIwMDBDMzA0MjAwM0ZBRAorOjEwMERFMDAwM0MwMTA4MDBBNDIyMjNENjk1ODIwMDA0OTU4MzAwMDZDNgorOjEwMERGMDAwM0MwMTA4MDBBQzIwMjNFNDNDMDEwODAwQUMyMDIzRThCRgorOjEwMEUwMDAwMDAwMjE0MDAwMDQzMTAyNTNDMDEwODAwQUMyMjFCQzA2NgorOjEwMEUxMDAwOTUyMjAwMDQzQzAxMDgwMEE0MjIxQkM0OTUyMzAwMDI3MworOjEwMEUyMDAwMDFFNTEwMjMwMDQzMTAyQTEwNDAwMDEwMjQwMjAwMDFBNQorOjEwMEUzMDAwM0MwMTA4MDAwQTAwMDM5OEFDMjIyM0Y4M0MwMzA4MDA5OAorOjEwMEU0MDAwOEM2MzIzRTgzQzAyMDgwMDk0NDIxQkM0MDA0MzEwMjEzOQorOjEwMEU1MDAwQTUyMjAwMDQzQzAyMDgwMDk0NDIxQkMwQTU4MjAwMDRBNQorOjEwMEU2MDAwM0MwMjA4MDA4QzQyMUJDMEE1ODIwMDA2M0MwMjA4MDAyMAorOjEwMEU3MDAwOEM0MjIzRjAzQzBEMDgwMDhEQUQyM0U0M0MwQTA4MDBCMQorOjEwMEU4MDAwMTQ0MDAwRTU4RDRBMjNFODNDMDIwODAwOTQ0MjFCQzQ0QworOjEwMEU5MDAwMDA0QTE4MjEzMDYzRkZGRjAwNjIxODJCMjQwMjAwMDI3MQorOjEwMEVBMDAwMTBDMjAwMEQwMTQzNTAyMzNDMDIwODAwOTQ0MjIzRDY5NworOjEwMEVCMDAwMzA0MjAwMDkxMDQwMDAwODAwMDAwMDAwOTU4MjAwMEMzQworOjEwMEVDMDAwMzA0MkZGRjZBNTgyMDAwQzNDMDIwODAwOTQ0MjIzRDY3MworOjEwMEVEMDAwMzA0MjAwMDkwMUEyNjgyMzNDMDIwODAwOEM0MjIzRjgzQQorOjEwMEVFMDAwMTA0MDAwNEEwMTIwMzgyMTNDMDIwODAwOTQ0MjIzRDJERAorOjEwMEVGMDAwMDAwMDQwMjFBNTIwMDAwQTAxRTIxMDIzQTUyMjAwMDJFMworOjEwMEYwMDAwMzA4MkZGRkYwMDAyMTA0MjE4NDAwMDA4MDAwMDMwMjEyQworOjEwMEYxMDAwMDA0MDE4MjE5NEUyMDAwMDI1MDgwMDAxMDBDMjMwMjFBMQorOjEwMEYyMDAwMDEwMzEwMkExNDQwRkZGQjI0RTcwMDAyMDAwNjFDMDIwNAorOjEwMEYzMDAwMzBDMkZGRkYwMDYyMzAyMTAwMDYxNDAyMDBDMjMwMjFERgorOjEwMEY0MDAwMDBDMDI4MjEwMDA2MTAyN0E1MjIwMDBBMDAwMDMwMjEzOQorOjEwMEY1MDAwMjUyNzAwMEMwMDAwNDAyMTk0RTIwMDAwMjUwODAwMDEzNAorOjEwMEY2MDAwMDBDMjMwMjEyRDAyMDAwNDE0NDBGRkZCMjRFNzAwMDJFMAorOjEwMEY3MDAwOTUyMjAwMDIwMDAwNDAyMTkxMjMwMDA5MDA0NDIwMjMxMworOjEwMEY4MDAwMDE4MDM4MjEzMDgyRkZGRkE0RTAwMDEwMDA2MjE4MjFBOAorOjEwMEY5MDAwMDAwMjEwNDIxODQwMDAxMDAwQzMzMDIxMDA0MDQ4MjFEOAorOjEwMEZBMDAwOTRFMjAwMDAyNEU3MDAwMjAwQzIzMDIxMzBFMjAwN0YxQQorOjEwMEZCMDAwMTQ0MDAwMDYyNTA4MDAwMThENjMwMDAwM0MwMjAwN0ZGQworOjEwMEZDMDAwMzQ0MkZGODAwMDYyNTgyNDI1NjcwMDA4MDEwOTEwMkE3NgorOjEwMEZEMDAwMTQ0MEZGRjMwMDAwMDAwMDMwODIwMDAxMTA0MDAwMDVDMworOjEwMEZFMDAwMDAwNjFDMDJBMEUwMDAwMTk0RTIwMDAwMDBDMjMwMjFEMworOjEwMEZGMDAwMDAwNjFDMDIzMEMyRkZGRjAwNjIzMDIxMDAwNjE0MDIwRQorOjEwMTAwMDAwMDBDMjMwMjEwQTAwMDQ3RDMwQzZGRkZGMjQwMjAwMDIyNgorOjEwMTAxMDAwMTRDMjAwODEwMDAwMDAwMDNDMDIwODAwOEM0MjI0MEMzNQorOjEwMTAyMDAwMTQ0MDAwMDcwMDAwMDAwMDNDMDIwODAwOTQ0MjIzRDI1NAorOjEwMTAzMDAwOTUyMzAwMDIwMUUyMTAyMzEwNjIwMDc3MDAwMDAwMDBGNworOjEwMTA0MDAwM0MwMjA4MDA5NDQyMjNEMjAxRTIxMDIzQTUyMjAwMDJCMAorOjEwMTA1MDAwM0MwMjA4MDA4QzQyMjQwQzEwNDAwMDFBMzFFM0ZGRkZEMAorOjEwMTA2MDAwOERDNzAwMTAzQzAyMDgwMDk0NDIxQjk2MDBFMDQwMjEwRQorOjEwMTA3MDAwMDAwNzJDMDIwMEFBMjAyMTAwNDMxMDIzMDA4MjM4MjNGRAorOjEwMTA4MDAwMDAwNzI0MDIzMEUyRkZGRjAwODIzODIxMDAwNzEwMjcwQQorOjEwMTA5MDAwQTUyMjAwMEEzMTAyRkZGRjNDMDQwODAwOTQ4NDIzRDRGNworOjEwMTBBMDAwMDA0NTMwMjMwMEUwMjgyMTAwNjQxODIzMDA2RDE4MjEzQQorOjEwMTBCMDAwMDBDMzMwMjEwMDA2MUMwMjMwQzJGRkZGMEEwMDA0N0Q3RAorOjEwMTBDMDAwMDA2MjMwMjEwMTIwMzgyMTAwMDA0MDIxMzA4MkZGRkZFMgorOjEwMTBEMDAwMDAwMjEwNDIxODQwMDAwODAwMDAzMDIxMDA0MDE4MjE5MgorOjEwMTBFMDAwOTRFMjAwMDAyNTA4MDAwMTAwQzIzMDIxMDEwMzEwMkEwQgorOjEwMTBGMDAwMTQ0MEZGRkIyNEU3MDAwMjAwMDYxQzAyMzBDMkZGRkY4MQorOjEwMTEwMDAwMDA2MjMwMjEwMDA2MTQwMjAwQzIzMDIxMDBDMDI4MjFGNAorOjEwMTExMDAwMDAwNjEwMjdBNTIyMDAwQTAwMDAzMDIxMjUyNzAwMEMxOAorOjEwMTEyMDAwMDAwMDQwMjE5NEUyMDAwMDI1MDgwMDAxMDBDMjMwMjFBNworOjEwMTEzMDAwMkQwMjAwMDQxNDQwRkZGQjI0RTcwMDAyOTUyMjAwMDI2OAorOjEwMTE0MDAwMDAwMDQwMjE5MTIzMDAwOTAwNDQyMDIzMDE4MDM4MjEyMAorOjEwMTE1MDAwMzA4MkZGRkZBNEUwMDAxMDNDMDQwODAwOTQ4NDIzRDRGNAorOjEwMTE2MDAwMDA2MjE4MjEwMEMzMzAyMTAwMDYxQzAyMzBDMkZGRkZCQworOjEwMTE3MDAwMDA2MjMwMjEwMDA2MUMwMjNDMDIwODAwOTQ0MjIzRDA4OQorOjEwMTE4MDAwMDBDMzQ4MjEwMDQ0MTAyMzAwMDIxRkMyMDA0MzEwMjE2NQorOjEwMTE5MDAwMDAwMjEwNDMxODQwMDAxMDAwMDAzMDIxMDA0MDIwMjFDMAorOjEwMTFBMDAwOTRFMjAwMDAyNEU3MDAwMjAwQzIzMDIxMzBFMjAwN0YxOAorOjEwMTFCMDAwMTQ0MDAwMDYyNTA4MDAwMThENjMwMDAwM0MwMjAwN0ZGQQorOjEwMTFDMDAwMzQ0MkZGODAwMDYyNTgyNDI1NjcwMDA4MDEwNDEwMkE3OQorOjEwMTFEMDAwMTQ0MEZGRjMwMDAwMDAwMDNDMDIwODAwOTQ0MjIzRUM5RQorOjEwMTFFMDAwMDBDMjMwMjEzMTIyRkZGRjAwQzIzMDIxMDAwNjFDMDI2NAorOjEwMTFGMDAwMzBDMkZGRkYwMDYyMzAyMTAwMDYxNDAyMDBDMjMwMjExRAorOjEwMTIwMDAwMDBDMDQwMjEwMDA2MTAyN0E1ODIwMDEwQURDMDAwMTRDOAorOjEwMTIxMDAwMEEwMDA0OURBREMwMDAwMDhEQzcwMDEwMDBFMDQwMjExMQorOjEwMTIyMDAwMTE0MDAwMDcwMDA3MkMwMjAwQUEzMDIxMDAwNjE0MDIxQQorOjEwMTIzMDAwMzBDM0ZGRkYwMDQzMzAyMTAwMDYxNDAyMDBDMjI4MjEwMgorOjEwMTI0MDAwMDAwNTEwMjdBNTIyMDAwQTNDMDMwODAwOTQ2MzIzRDQ1QworOjEwMTI1MDAwMzEwMkZGRkYwMUUyMTAyMTAwNDMzMDIzMDBDRDMwMjE5NQorOjEwMTI2MDAwMDAwNjFDMDIzMEMyRkZGRjAwNjIzMDIxMDAwNjE0MDI5QgorOjEwMTI3MDAwMDBDMjMwMjEwMEMwNDAyMTAwMDYxMDI3QTU4MjAwMTBDNgorOjEwMTI4MDAwMzEwMkZGRkYwMDA1MUMwMDAwNDMxMDI1QURDMjAwMTAxNQorOjEwMTI5MDAwM0MwMjA4MDA4QzQyMjNGNDEwNDAwMDA1MkRFMjA1RUJDRgorOjEwMTJBMDAwMTQ0MDAwMDIyNUUyRkZGMjM0MDI4ODcwQTVDMjAwMzQyNworOjEwMTJCMDAwM0MwMzA4MDAyNDYzMjNFODhDNjIwMDAwMjQ0MjAwMDEwMAorOjEwMTJDMDAwQUM2MjAwMDAzQzA0MDgwMDhDODQyM0U0M0MwMjA4MDA2QgorOjEwMTJEMDAwOEM0MjFCQzAzMzAzRkZGRjAwODMyMDIxMDA0MzE4MjFGMQorOjEwMTJFMDAwMDA2MjEwMkIzQzAxMDgwMEFDMjQyM0U0MTA0MDAwMDNGMgorOjEwMTJGMDAwMjQ4MkZGRkYzQzAxMDgwMEFDMjIyM0U0M0MwMTA4MDBFQgorOjEwMTMwMDAwQUMyMzFCQzAwM0UwMDAwODI3QkQwMDIwMjdCREZGQjhBOQorOjEwMTMxMDAwM0MwNTA4MDAyNEE1MUI5NkFGQkYwMDQ0QUZCRTAwNDBBQgorOjEwMTMyMDAwQUZCNzAwM0NBRkI2MDAzOEFGQjUwMDM0QUZCNDAwMzA1MworOjEwMTMzMDAwQUZCMzAwMkNBRkIyMDAyOEFGQjEwMDI0QUZCMDAwMjA5MworOjEwMTM0MDAwOTRBOTAwMDAzQzAyMDgwMDk0NDIyM0QwM0MwMzA4MDAwQQorOjEwMTM1MDAwOEM2MzFCQjAzQzA0MDgwMDhDODQxQkFDMDEyMjEwMjM1RQorOjEwMTM2MDAwMDA2NDE4MkFBN0E5MDAxRTEwNjAwMEJFQTdBMjAwMTZEQworOjEwMTM3MDAwMjRCRTAwMjI5N0I2MDAxRTI0QjMwMDFBMjRCNzAwMTYxQworOjEwMTM4MDAwOEZDMjAwMDAxNDQwMDAwODAwMDAwMDAwOEZDMkZGRjg2OAorOjEwMTM5MDAwOTdBMzAwMTY4RkM0RkZGNDAwNDMxMDIxMDA4MjIwMkE3NworOjEwMTNBMDAwMTQ4MDAwQjAwMDAwMDAwMDk3RDUwODE4MzJBMkZGRkY5QgorOjEwMTNCMDAwMTA0MDAwQTMwMDAwOTAyMTAwNDBBMDIxMDAwMDg4MjFERgorOjEwMTNDMDAwMEUwMDA2MjUwMDAwMDAwMDAwNDAzMDIxMTRDMDAwMDc3OAorOjEwMTNEMDAwMDAwMDAwMDAzQzAyMDgwMDhDNDIyM0RDMjQ0MjAwMDE5MworOjEwMTNFMDAwM0MwMTA4MDAwQTAwMDU5NkFDMjIyM0RDM0MxMDA4MDBGMgorOjEwMTNGMDAwMDIxMTgwMjE4RTEwMUJDODk2MDgwMDBBMzEwMjAwNDA5RAorOjEwMTQwMDAwMTA0MDAwMDUyNDA3MTgwQzhFMDIwMDBDMjQwNzE4OENDRAorOjEwMTQxMDAwMDAwMjE0MDBBQ0MyMDAxODMxMDIwMDgwNTQ0MDAwMDFFOAorOjEwMTQyMDAwMzRFNzAwMTAzQzAyMDgwMDAwNTExMDIxOEM0MjFCRDAxMAorOjEwMTQzMDAwM0MwMzA4MDAwMDcxMTgyMThDNjMxQkQ0MDAwMjE1MDBDNgorOjEwMTQ0MDAwMDAwMzFDMDAwMDQzMTAyNUFDQzIwMDE0OTYwNDAwMDhFMQorOjEwMTQ1MDAwMzI0MkZGRkYwMDgyMTAyMTAyODIxMDJBMTQ0MDAwMDI1MworOjEwMTQ2MDAwMDJCMjI4MjMwMDgwMjgyMThFMDIwMDAwMDI0NTkwMjEyQworOjEwMTQ3MDAwQUNDMjAwMDA4RTAyMDAwNDAwQzAyMDIxMjYzMTAwMTAwMgorOjEwMTQ4MDAwQUM4MjAwMDQzMEUyRkZGRkFDODAwMDA4QTQ4NTAwMEVBRgorOjEwMTQ5MDAwQUM4MjAwMTAyNDAyMDMwNTBFMDAwNUEyQTQ4MjAwMENGOQorOjEwMTRBMDAwMzI0MkZGRkYwMDU0MTAyQjE0NDBGRkM1MzI0MkZGRkZCMQorOjEwMTRCMDAwMEEwMDA1OEUwMDAwMDAwMDhFNjIwMDAwOEU2M0ZGRkNCMworOjEwMTRDMDAwMDA0MzEwMkExMDQwMDA2NzAwMDAwMDAwOEU2MkZGRjAwOQorOjEwMTREMDAwMDAwMjg5MDAzQzEwMDgwMDAyMTE4MDIxMEUwMDA2MjU0MAorOjEwMTRFMDAwOEUxMDFCQzgwMDQwMzAyMTE0QzAwMDA1MDAwMDAwMDAxMQorOjEwMTRGMDAwOEU2MjA4MkMyNDQyMDAwMTBBMDAwNTk2QUU2MjA4MkM3OAorOjEwMTUwMDAwOTYwODAwMEEzMTAyMDA0MDEwNDAwMDA1MjQwNzE4MEMxQworOjEwMTUxMDAwOEUwMjAwMEMyNDA3MTg4QzAwMDIxNDAwQUNDMjAwMThDNAorOjEwMTUyMDAwM0MwMjA4MDAwMDUxMTAyMThDNDIxQkQwM0MwMzA4MDBGMworOjEwMTUzMDAwMDA3MTE4MjE4QzYzMUJENDAwMDIxNTAwMDAwMzFDMDBFRAorOjEwMTU0MDAwMDA0MzEwMjVBQ0MyMDAxNDhFNjNGRkY0OTYwMjAwMDgxRAorOjEwMTU1MDAwMDA0MzIwMjMzMjQyRkZGRjMwODNGRkZGMDA0MzEwMjE2RQorOjEwMTU2MDAwMDJDMjEwMkExMDQwMDAwMzAwODAyODIxOTdBOTAwMUUwMworOjEwMTU3MDAwMDEzMjI4MjM4RTYyMDAwMDMwQTRGRkZGMDA0NDEwMjFCNgorOjEwMTU4MDAwQUU2MjAwMDBBNEM1MDAwRThFMDIwMDAwQUNDMjAwMDBENgorOjEwMTU5MDAwOEUwMjAwMDQ4RTYzRkZGNDAwNDMxMDIxQUNDMjAwMDRFRAorOjEwMTVBMDAwOEU2M0ZGRjQ5NjAyMDAwODAwNjQxODIxMDA2MjEwMkE3RQorOjEwMTVCMDAwMTQ0MDAwMDYwMjQ1OTAyMThFNjJGRkYwQUU2MEZGRjRGOQorOjEwMTVDMDAwMjQ0MjAwMDEwQTAwMDU3MUFFNjJGRkYwQUU2M0ZGRjQzMQorOjEwMTVEMDAwQUNDMDAwMDgzMjQyRkZGRjEwNTYwMDAzMzEwMjAwMDQ4NQorOjEwMTVFMDAwMTA0MDAwMDYyNDAyMDMwNTMxMDIwMDgwNTQ0MDAwMDEyRgorOjEwMTVGMDAwMzRFNzAwMTAzNEU3MDAyMDI0MDIwOTA1QTRDMjAwMENERgorOjEwMTYwMDAwOEVFMzAwMDA4RUUyMDAwNDE0NjIwMDA3M0MwMkI0OUFFQworOjEwMTYxMDAwOEVFMjA4NjA1NDQwMDAwMTM0RTcwNDAwM0MwMjRCNjU1MAorOjEwMTYyMDAwMEEwMDA1ODgzNDQyNzY1NDM0NDI4OUFCQUNDMjAwMUNBRgorOjEwMTYzMDAwMzBFMkZGRkZBQ0MyMDAxMDBFMDAwNUEyMDBDMDIwMjE2NgorOjEwMTY0MDAwMzI0MkZGRkYwMDU2MTAyQjE0NDBGRjlCMDAwMDAwMDBBOQorOjEwMTY1MDAwOEU2MjAwMDA4RTYzRkZGQzAwNDMxMDJBMTQ0MEZGNDg5NgorOjEwMTY2MDAwMDAwMDAwMDA4RkJGMDA0NDhGQkUwMDQwOEZCNzAwM0NEOQorOjEwMTY3MDAwOEZCNjAwMzg4RkI1MDAzNDhGQjQwMDMwOEZCMzAwMkM5NAorOjEwMTY4MDAwOEZCMjAwMjg4RkIxMDAyNDhGQjAwMDIwMDNFMDAwMDg0MworOjEwMTY5MDAwMjdCRDAwNDgyN0JERkZFOEFGQkYwMDE0QUZCMDAwMTA2MgorOjEwMTZBMDAwOEY2MjQ0NTA4RjYzNDQxMDBBMDAwNUIxMDA4MDgwMjE4RQorOjEwMTZCMDAwOEY2MjY4MjAzMDQyMjAwMDEwNDAwMDAzMDAwMDAwMDBDQworOjEwMTZDMDAwMEUwMDAxRjAwMDAwMjAyMThGNjI0NDUwOEY2MzQ0MTAwRgorOjEwMTZEMDAwMzA0MkZGRkYwMDQzMTAyQjE0NDBGRkY1MDAwMDAwMDBENAorOjEwMTZFMDAwOEY2MzBDMTQzMDYzMDAwRjJDNjIwMDAyMTQ0MDAwMEI1NworOjEwMTZGMDAwMDAwMDAwMDA4RjYzMEMxNDNDMDIwODAwOEM0MjFCNDA2OQorOjEwMTcwMDAwMzA2MzAwMEYyNDQyMDAwMTNDMDEwODAwQUMyMjFCNDA2MgorOjEwMTcxMDAwMkM2MjAwMDIxMDQwRkZGNzAwMDAwMDAwQUY3MDVDMTg2MAorOjEwMTcyMDAwOEY2MjVDMTAzMDQyMDAwMjEwNDAwMDA5MDAwMDAwMDA4RgorOjEwMTczMDAwOEY2MjY4MjAzMDQyMjAwMDEwNDBGRkY4MDAwMDAwMDA1NworOjEwMTc0MDAwMEUwMDAxRjAwMDAwMjAyMTBBMDAwNUM0MDAwMDAwMDA4NgorOjEwMTc1MDAwOEZCRjAwMTQ4RkIwMDAxMDAzRTAwMDA4MjdCRDAwMThGMQorOjEwMTc2MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMjdCREZGRThBRQorOjEwMTc3MDAwM0MxQkMwMDBBRkJGMDAxNEFGQjAwMDEwQUY2MDY4MENERQorOjEwMTc4MDAwOEY2MjY4MDQzNDQyMDA4MkFGNjI2ODA0OEY2MzQwMDA1NQorOjEwMTc5MDAwMjQwMjBCNTAzQzAxMDgwMEFDMjIxQjU0MjQwMjBCNzg5RAorOjEwMTdBMDAwM0MwMTA4MDBBQzIyMUI2NDM0NjMwMDAyQUY2MzQwMDBCQworOjEwMTdCMDAwMEUwMDA2MDUwMDgwODAyMTNDMDEwODAwQTAyMjFCNjg2NQorOjEwMTdDMDAwMzA0MjAwRkYyNDAzMDAwMjE0NDMwMDA1MDAwMDAwMDAyMworOjEwMTdEMDAwM0MwMjA4MDA4QzQyMUI1NDBBMDAwNUY4QUM1MDAwQzBDMworOjEwMTdFMDAwM0MwMjA4MDA4QzQyMUI1NEFDNTAwMEJDOEY2MjQ0MzQ1NQorOjEwMTdGMDAwOEY2MzQ0Mzg4RjY0NDQxMDNDMDEwODAwQUMyMjFCNUNBQQorOjEwMTgwMDAwM0MwMTA4MDBBQzIzMUI2QzNDMDEwODAwQUMyNDFCNThCNQorOjEwMTgxMDAwOEZCRjAwMTQ4RkIwMDAxMDAzRTAwMDA4MjdCRDAwMTgzMAorOjEwMTgyMDAwM0MwNDA4MDA4Qzg3MDAwMDNDMDNBQTU1MzQ2M0FBNTU4OQorOjEwMTgzMDAwM0MwNkMwMDNBQzgzMDAwMDhDQzIwMDAwMTQ0MzAwMDdDOAorOjEwMTg0MDAwMjQwNTAwMDIzQzAzNTVBQTM0NjM1NUFBQUM4MzAwMDA2QQorOjEwMTg1MDAwOENDMjAwMDA1MDQzMDAwMTI0MDUwMDAxM0MwMjA4MDAzNgorOjEwMTg2MDAwQUM0NzAwMDAwM0UwMDAwODAwQTAxMDIxMjdCREZGRjhFRQorOjEwMTg3MDAwMTg4MDAwMDkwMDAwMjgyMThGNjM2ODBDOEY2MjY4MENCMworOjEwMTg4MDAwMTA0M0ZGRkUwMDAwMDAwMDI0QTUwMDAxMDBBNDEwMkE2MAorOjEwMTg5MDAwMTQ0MEZGRjkwMDAwMDAwMDAzRTAwMDA4MjdCRDAwMDgyNQorOjEwMThBMDAwOEY2MzQ0NTAzQzAyMDgwMDhDNDIxQjVDMDAwMzFDMDIwNgorOjEwMThCMDAwMDA0MzEwMkIxNDQwMDAwODNDMDM4MDAwM0MwNDA4MDA0NworOjEwMThDMDAwOEM4NDFCNkM4RjYyNDQ1MDAwMDIxQzAyMDA4MzEwMkIxRQorOjEwMThEMDAwMTA0MEZGRkMzQzAzODAwMEFGNjM0NDQ0OEY2MjQ0NDRFQgorOjEwMThFMDAwMDA0MzEwMjQxNDQwRkZGRDAwMDAwMDAwOEY2MjQ0NDhCNAorOjEwMThGMDAwMDNFMDAwMDgzMDQyRkZGRjMwODJGRkZGMjQ0MkUwMDA5NworOjEwMTkwMDAwMkM0MjIwMDExNDQwMDAwMzNDMDI0MDAwMEEwMDA2NDgxQgorOjEwMTkxMDAwMjQwMkZGRkYwMDgyMjAyNUFGNjQ1QzM4OEY2MjVDMzBCOAorOjEwMTkyMDAwMzA0MjAwMDIxNDQwRkZGQzAwMDAxMDIxMDNFMDAwMDhEOAorOjEwMTkzMDAwMDAwMDAwMDA4RjYyNDQ1MDNDMDMwODAwOEM2MzFCNTg3OQorOjEwMTk0MDAwMEEwMDA2NTEzMDQyRkZGRjhGNjI0NDUwMzA0MkZGRkZEMQorOjEwMTk1MDAwMDA0MzEwMkIxNDQwRkZGQzAwMDAwMDAwMDNFMDAwMDhDRgorOjEwMTk2MDAwMDAwMDAwMDAyN0JERkZFMDAwODAyODIxM0MwNDA4MDBBMworOjEwMTk3MDAwMjQ4NDFBRjAwMDAwMzAyMTAwMDAzODIxQUZCRjAwMTg4NQorOjEwMTk4MDAwQUZBMDAwMTAwRTAwMDY3Q0FGQTAwMDE0MEEwMDA2NjA5NQorOjEwMTk5MDAwMDAwMDAwMDA4RkJGMDAxODAzRTAwMDA4MjdCRDAwMjBGMgorOjEwMTlBMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM0MwMjA4MDBGMQorOjEwMTlCMDAwMzQ0MjMwMDAzQzAzMDgwMDM0NjMzMDAwM0MwNDA4MDAyQgorOjEwMTlDMDAwMzQ4NDM3RkYzQzAxMDgwMEFDMjIxQjc0MjQwMjAwNDAyMQorOjEwMTlEMDAwM0MwMTA4MDBBQzIyMUI3ODNDMDEwODAwQUMyMDFCNzBDNQorOjEwMTlFMDAwQUM2MDAwMDAyNDYzMDAwNDAwODMxMDJCNTA0MEZGRkQxNgorOjEwMTlGMDAwQUM2MDAwMDAwM0UwMDAwODAwMDAwMDAwMDA4MDQ4MjEwNworOjEwMUEwMDAwOEZBQTAwMTAzQzAyMDgwMDhDNDIxQjcwM0MwNDA4MDBBNgorOjEwMUExMDAwOEM4NDFCNzg4RkFCMDAxNDI0NDMwMDAxMDA0NDEwMkJFRQorOjEwMUEyMDAwM0MwMTA4MDBBQzIzMUI3MDE0NDAwMDAzMDAwMDQwMjE1RgorOjEwMUEzMDAwM0MwMTA4MDBBQzIwMUI3MDNDMDIwODAwOEM0MjFCNzA2QgorOjEwMUE0MDAwM0MwMzA4MDA4QzYzMUI3NDkxMjQwMDAwMDAwMjExNDBDOQorOjEwMUE1MDAwMDA0MzEwMjEwMDQ4MTAyMTI1MDgwMDAxQTA0NDAwMDA4NworOjEwMUE2MDAwMjkwMjAwMDgxNDQwRkZGNDI1MjkwMDAxM0MwMjA4MDA2NworOjEwMUE3MDAwOEM0MjFCNzAzQzAzMDgwMDhDNjMxQjc0OEY2NDY4MENFMQorOjEwMUE4MDAwMDAwMjExNDAwMDQzMTAyMUFDNDQwMDA4QUM0NTAwMEM5QQorOjEwMUE5MDAwQUM0NjAwMTBBQzQ3MDAxNEFDNEEwMDE4MDNFMDAwMDg0NAorOjEwMUFBMDAwQUM0QjAwMUMwMDAwMDAwMDAwMDAwMDAwNEQ2MTY5NkU5RQorOjEwMUFCMDAwNDM3MDc1NDIwMDAwMDAwMDRENjE2OTZFNDM3MDc1NDFDRQorOjEwMUFDMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNzM3NDZCNkY1NQorOjEwMUFEMDAwNjY2NjZDNjQ0OTZFMDAwMDczNzQ2QjZGNjY2NjJBMkFEMgorOjEwMUFFMDAwMDAwMDAwMDA1Mzc3NDU3NjY1NkU3NDMwMDAwMDAwMDBGQQorOjEwMUFGMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNjY2MTc0NjE0QQorOjEwMUIwMDAwNkM0NTcyNzIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA0MAorOjEwMUIxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBDNQorOjEwMUIyMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBCNQorOjEwMUIzMDAwNzM3NDZCNkY2NjY2NkM2NDVGNzYzMTJFMzYyRTMwMDA4MAorOjEwMUI0MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA5NQorOjBDMUI1MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwODkKKzowMDAwMDAwMUZGCisgKiBGaXJtd2FyZSBpczoKKyAqCURlcml2ZWQgZnJvbSBwcm9wcmlldGFyeSB1bnB1Ymxpc2hlZCBzb3VyY2UgY29kZSwKKyAqCUNvcHlyaWdodCAoQykgMjAwMC0yMDAzIEJyb2FkY29tIENvcnBvcmF0aW9uLgorICoKKyAqCVBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQgZm9yIHRoZSBkaXN0cmlidXRpb24gb2YgdGhpcyBmaXJtd2FyZQorICoJZGF0YSBpbiBoZXhhZGVjaW1hbCBvciBlcXVpdmFsZW50IGZvcm1hdCwgcHJvdmlkZWQgdGhpcyBjb3B5cmlnaHQKKyAqCW5vdGljZSBpcyBhY2NvbXBhbnlpbmcgaXQuCmRpZmYgLS1naXQgYS9maXJtd2FyZS90aWdvbi90ZzNfdHNvNS5iaW4uaWhleCBiL2Zpcm13YXJlL3RpZ29uL3RnM190c281LmJpbi5paGV4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzNjcyNTEKLS0tIC9kZXYvbnVsbAorKysgYi9maXJtd2FyZS90aWdvbi90ZzNfdHNvNS5iaW4uaWhleApAQCAtMCwwICsxLDI1MiBAQAorOjEwMDAwMDAwMDEwMjAwMDAwMDAxMDAwMDAwMDAwRkQ4MEMwMDQwMDNCNgorOjEwMDAxMDAwMDAwMDAwMDAwMDAxMEYwNDAwMDAwMDAwMTAwMDAwMDNCOQorOjEwMDAyMDAwMDAwMDAwMDAwMDAwMDAwRDAwMDAwMDBEM0MxRDAwMDE1QworOjEwMDAzMDAwMzdCREUwMDAwM0EwRjAyMTNDMTAwMDAxMjYxMDAwMDBCNQorOjEwMDA0MDAwMEMwMDQwMTAwMDAwMDAwMDAwMDAwMDBEMjdCREZGRTA4NAorOjEwMDA1MDAwM0MwNEZFRkVBRkJGMDAxODBDMDA0MkU4MzQ4NDAwMDJFRQorOjEwMDA2MDAwMEMwMDQzNjQwMDAwMDAwMDNDMDMwMDAxOTA2MzBGMzQ2NworOjEwMDA3MDAwMjQwMjAwMDIzQzA0MDAwMTI0ODQwRTlDMTQ2MjAwMDM0QworOjEwMDA4MDAwMjQwNTAwMDEzQzA0MDAwMTI0ODQwRTkwMjQwNjAwMDI5MworOjEwMDA5MDAwMDAwMDM4MjFBRkEwMDAxMDBDMDA0Mzc4QUZBMDAwMTQ3RQorOjEwMDBBMDAwMEMwMDQwMkMwMDAwMDAwMDhGQkYwMDE4MDNFMDAwMDg4NworOjEwMDBCMDAwMjdCRDAwMjAwMDAwMDAwMDAwMDAwMDAwMjdCREZGRTA3OQorOjEwMDBDMDAwQUZCRjAwMUNBRkIyMDAxOEFGQjEwMDE0MEMwMDQyRDQ5NworOjEwMDBEMDAwQUZCMDAwMTAzQzEyODAwMDI0MTEwMDAxOEY3MDY4MTAzNgorOjEwMDBFMDAwMzIwMjA0MDAxMDQwMDAwNzAwMDAwMDAwOEY2NDEwMDg3NgorOjEwMDBGMDAwMDA5MjEwMjQxNDQwMDAwMzAwMDAwMDAwMEMwMDQwNjQzMworOjEwMDEwMDAwMDAwMDAwMDAzQzAyMDAwMTkwNDIwRjU2MTA1MTAwMDMxNQorOjEwMDExMDAwMzIwMjAyMDAxMDQwRkZGMTAwMDAwMDAwMEMwMDQxQjQ2OAorOjEwMDEyMDAwMDAwMDAwMDAwODAwNDAzNDAwMDAwMDAwOEZCRjAwMUNFOQorOjEwMDEzMDAwOEZCMjAwMTg4RkIxMDAxNDhGQjAwMDEwMDNFMDAwMDhEOAorOjEwMDE0MDAwMjdCRDAwMjAyN0JERkZFMDNDMDQwMDAxMjQ4NDBFQjA0MQorOjEwMDE1MDAwMDAwMDI4MjEwMDAwMzAyMTAwMDAzODIxQUZCRjAwMTgyNgorOjEwMDE2MDAwQUZBMDAwMTAwQzAwNDM3OEFGQTAwMDE0MDAwMEQwMjExNQorOjEwMDE3MDAwMjQwMjAxMzBBRjYyNTAwMDNDMDEwMDAxQTQyMDBGNTA2NgorOjEwMDE4MDAwM0MwMTAwMDFBMDIwMEY1NzhGQkYwMDE4MDNFMDAwMDhCQQorOjEwMDE5MDAwMjdCRDAwMjAwMDAwMDAwMDAwMDAwMDAwM0MwMzAwMDExQgorOjEwMDFBMDAwMjQ2MzBGNjA5MDYyMDAwMDI3QkRGRkYwMTQ0MDAwMDMzRAorOjEwMDFCMDAwMDA4MEMwMjEwODAwNDA3MzAwMDA0ODIxM0MwMjIwMDA1QworOjEwMDFDMDAwMDMwMjEwMjQxMDQwMDAwMzI0MDkwMDAyMDgwMDQwNzNCOQorOjEwMDFEMDAwQTA2MDAwMDAyNDA5MDAwMTAwMTgxMDQwMzA0MzFGODA3NworOjEwMDFFMDAwMzQ2RjgwMDgxNTIwMDA0QjI1RUIwMDI4M0MwNDAwMDFFQgorOjEwMDFGMDAwMDA4MzIwMjE4Qzg0ODAxMDNDMDUwMDAxMjRBNTBGN0EwNworOjEwMDIwMDAwMDAwNDE0MDJBMEEyMDAwMDNDMDEwMDAxQTAyNDBGN0IwNgorOjEwMDIxMDAwM0MwMjAwMDEwMDQzMTAyMTk0NDI4MDE0M0MwMTAwMDE4MworOjEwMDIyMDAwQTAyMjBGN0MzQzBDMDAwMTAxODM2MDIxOEQ4QzgwMTg4MgorOjEwMDIzMDAwMzA0MjAwRkYyNDQyMDAwODAwMDIyMEMzMjQwMjAwMDFEMworOjEwMDI0MDAwM0MwMTAwMDFBMDIyMEY2MDAxMjQxMDJCMTA0MDAwMEM4MworOjEwMDI1MDAwMDAwMDM4MjEyNEE2MDAwRTAxNjAyODIxOENBMjAwMDA5NQorOjEwMDI2MDAwOENBMzAwMDQyNEE1MDAwODI0RTcwMDAxQUNDMjAwMDAxMAorOjEwMDI3MDAwQUNDMzAwMDQwMEU0MTAyQjE0NDBGRkY4MjRDNjAwMDhBRgorOjEwMDI4MDAwMDAwMDM4MjEzQzA4MDAwMTI1MDgwRjdCOTEwNjAwMDA4MgorOjEwMDI5MDAwM0MwMjAwMDE5MDQyMEY3QzI1MDMwMDBEMDBDMzI4MjE4MQorOjEwMDJBMDAwMDA0NjEwMjMwMDAyMUZDMjAwNDMxMDIxMDAwMjEwNDMyOQorOjEwMDJCMDAwMTg0MDAwMEMwMDAwMjAyMTkxMDIwMDAxMDA0NjEwMjM4QworOjEwMDJDMDAwMDAwMjFGQzIwMDQzMTAyMTAwMDIxODQzOTRBMjAwMDA0NAorOjEwMDJEMDAwMjRFNzAwMDEwMDgyMjAyMTAwRTMxMDJBMTQ0MEZGRkJFNAorOjEwMDJFMDAwMjRBNTAwMDIwMDA0MUMwMjMwODJGRkZGMDA2MjIwMjFDRQorOjEwMDJGMDAwMDAwNDE0MDIwMDgyMjAyMTNDMDJGRkZGMDE4MjEwMjQyRQorOjEwMDMwMDAwMzA4M0ZGRkYwMDQzMTAyNTNDMDEwMDAxMDgwMDQwRkE0NAorOjEwMDMxMDAwQUMyMjBGODAzQzA1MDAwMTI0QTUwRjdDOTBBMjAwMDBCOAorOjEwMDMyMDAwM0MwQzAwMDEwMTgzNjAyMThEOEM4MDE4MDAwMjIwQzJFQQorOjEwMDMzMDAwMTA4MDAwMEUwMDAwMzgyMTAxNjAzMDIxMjRBNTAwMEMzRgorOjEwMDM0MDAwOENBMjAwMDA4Q0EzMDAwNDI0QTUwMDA4MjRFNzAwMDE2RgorOjEwMDM1MDAwQUNDMjAwMDBBQ0MzMDAwNDAwRTQxMDJCMTQ0MEZGRjg1MgorOjEwMDM2MDAwMjRDNjAwMDgzQzA1MDAwMTI0QTUwRjdDOTBBMjAwMDBEMworOjEwMDM3MDAwMzA0MzAwMDcyNDAyMDAwNDEwNjIwMDExMjg2MjAwMDVDNworOjEwMDM4MDAwMTA0MDAwMDUyNDAyMDAwMjEwNjIwMDA4MDAwNzEwQzA5RgorOjEwMDM5MDAwMDgwMDQwRkEwMDAwMDAwMDI0MDIwMDA2MTA2MjAwMEU2RgorOjEwMDNBMDAwMDAwNzEwQzAwODAwNDBGQTAwMDAwMDAwMDBBMjE4MjE1OQorOjEwMDNCMDAwOTQ2MzAwMEMwMDRCMTAyMTA4MDA0MEZBQTQ0MzAwMDA5NQorOjEwMDNDMDAwMDAwNzEwQzAwMEEyMTgyMThDNjMwMDBDMDA0QjEwMjEwNAorOjEwMDNEMDAwMDgwMDQwRkFBQzQzMDAwMDAwQTIxODIxOEM2MzAwMEMxNgorOjEwMDNFMDAwMDA0QjIwMjEwMEEyMTAyMUFDODMwMDAwOTQ0MjAwMTA5OQorOjEwMDNGMDAwQTQ4MjAwMDQ5NUU3MDAwNjNDMDIwMDAxOTA0MjBGN0NCNQorOjEwMDQwMDAwM0MwMzAwMDE5MDYzMEY3QTAwRTJDODIzM0MwMjAwMDEyNAorOjEwMDQxMDAwOTA0MjBGN0IyNDYzMDAyODAxRTM0MDIxMjQ0MjAwMjhGRQorOjEwMDQyMDAwMTUyMDAwMTIwMUUyMzAyMTk0QzIwMDBDM0MwMTAwMDFCMQorOjEwMDQzMDAwQTQyMjBGNzg5NEMyMDAwNDk0QzMwMDA2M0MwMTAwMDE3QQorOjEwMDQ0MDAwQTQyMDBGNzYzQzAxMDAwMUE0MjAwRjcyMDAwMjE0MDBDQQorOjEwMDQ1MDAwMDA0MzEwMjUzQzAxMDAwMUFDMjIwRjZDOTUwMjAwMDQwMgorOjEwMDQ2MDAwM0MwMTAwMDEwODAwNDEyNEE0MjIwRjcwM0MwMjAwMDE1RAorOjEwMDQ3MDAwOTQ0MjBGNzAzQzAzMDAwMTk0NjMwRjcyMDA0MzEwMjFGQgorOjEwMDQ4MDAwQTUwMjAwMDQzQzAyMDAwMTk0NDIwRjZDQTRDMjAwMDRDNworOjEwMDQ5MDAwM0MwMjAwMDE4QzQyMEY2Q0E0QzIwMDA2M0MwNDAwMDEyNworOjEwMDRBMDAwOTQ4NDBGNzIzQzAyMDAwMTk0NDIwRjcwM0MwQTAwMDFEOAorOjEwMDRCMDAwOTU0QTBGNzYwMDQ0MTgyMTMwNjNGRkZGMDA2MjE4MkEyNgorOjEwMDRDMDAwMjQwMjAwMDIxMTIyMDAwQjAwODMyMDIzM0MwMzAwMDFDMAorOjEwMDREMDAwOTQ2MzBGNzgzMDYyMDAwOTEwNDAwMDA2MzA2MkZGRjYyNgorOjEwMDRFMDAwQTRDMjAwMEMzQzAyMDAwMTk0NDIwRjc4MzA0MjAwMDk4MworOjEwMDRGMDAwMDE0MjUwMjMyNDAyMDAwMTExMjIwMDFCMjkyMjAwMDI4NAorOjEwMDUwMDAwNTA0MDAwMDUyNDAyMDAwMjExMjAwMDA3MzFBMkZGRkYyNQorOjEwMDUxMDAwMDgwMDQxOTcwMDAwMDAwMDExMjIwMDFEMjQwMjAwMTY2RgorOjEwMDUyMDAwMDgwMDQxOTczMUEyRkZGRjNDMEUwMDAxOTVDRTBGODBERAorOjEwMDUzMDAwMTA4MDAwMDUwMTgwNjgyMTAxQzQyMDIxMDAwNDFDMDJGNAorOjEwMDU0MDAwMzA4MkZGRkYwMDYyNzAyMTAwMEUxMDI3QTUwMjAwMEExMgorOjEwMDU1MDAwM0MwMzAwMDE5MDYzMEY3QjMxQTJGRkZGMDBFMjEwMjFGQQorOjEwMDU2MDAwMDgwMDQxOEQwMDQzMjAyMzNDMDIwMDAxOTQ0MjBGODA4QgorOjEwMDU3MDAwMDA0NDIwMjEwMDA0MUMwMjMwODJGRkZGMDA2MjIwMjE4MQorOjEwMDU4MDAwMDA4MDcwMjEwMDA0MTAyNzA4MDA0MTg1QTUwMjAwMEFBMAorOjEwMDU5MDAwM0MwNTAwMDEyNEE1MEY3QTkwQTMwMDAwMTQ2MjAwMDIxQworOjEwMDVBMDAwMjRFMkZGRjJBNUUyMDAzNDkwQTIwMDAwMDBFMjEwMjM1MgorOjEwMDVCMDAwQTUwMjAwMDIzQzAzMDAwMTk0NjMwRjgwM0MwMjAwMDE4RAorOjEwMDVDMDAwOTQ0MjBGNUEzMEU1RkZGRjAwNjQxODIxMDA0NTEwMjNDNAorOjEwMDVEMDAwMDA2MjIwMjMwMDA0MUMwMjMwODJGRkZGMDA2MjIwMjEwMQorOjEwMDVFMDAwMDAwNDEwMjdBNTAyMDAwQTNDMDMwMDAxOTA2MzBGN0M2MQorOjEwMDVGMDAwMjQ2MjAwMDExNEEyMDAwNTAwODA3MDIxMDE2MzEwMjExMworOjEwMDYwMDAwOTA0MjAwMDAwODAwNDE4NTAwMDI2MjAwMjQ2MjAwMDI1RQorOjEwMDYxMDAwMTRBMjAwMDMzMDYyMDBGRTAwNEIxMDIxOTQ0QzAwMDAzNQorOjEwMDYyMDAwM0MwMjAwMDE5NDQyMEY4MjMxODNGRkZGM0MwNDAwMDEzMQorOjEwMDYzMDAwOTA4NDBGN0IwMDQzMTAyMTAwRTIxMDIxMDA0NDIwMjMwRQorOjEwMDY0MDAwMDA4QTIwMjEwMDA0MUMwMjMwODJGRkZGMDA2MjIwMjE2QQorOjEwMDY1MDAwMDAwNDE0MDIwMDgyMjAyMTAwODA2ODIxMDAwNDEwMjc3OQorOjEwMDY2MDAwQTRDMjAwMTAzMUEyRkZGRjAwMEUxQzAwMDA0MzEwMjVBMQorOjEwMDY3MDAwM0MwNDAwMDEyNDg0MEY3MkFERTIwMDEwOTQ4MjAwMDA1QgorOjEwMDY4MDAwM0MwNTAwMDE5NEE1MEY3NjNDMDMwMDAxOEM2MzBGNkNDMAorOjEwMDY5MDAwMjQ0MjAwMDEwMEI5MjgyMUE0ODIwMDAwMzMyMkZGRkY3OAorOjEwMDZBMDAwMDA2MjIwMjEwMDgzMTgyQjNDMDEwMDAxQTQyNTBGNzY1NQorOjEwMDZCMDAwMTA2MDAwMDMyNEEyRkZGRjNDMDEwMDAxQTQyMjBGNzY3QQorOjEwMDZDMDAwM0MwMjQwMDAwMzAyMTAyNTNDMDEwMDAxQUMyNDBGNkNFOQorOjEwMDZEMDAwQUY2MjEwMDgwM0UwMDAwODI3QkQwMDEwM0MwMzAwMDFEMgorOjEwMDZFMDAwOTA2MzBGNTYyN0JERkZFODI0MDIwMDAxQUZCRjAwMTQzRQorOjEwMDZGMDAwMTA2MjAwMjZBRkIwMDAxMDhGNjIwQ0Y0MjQ0MkZGRkY5RQorOjEwMDcwMDAwMzA0MjAwN0YwMDAyMTEwMDhDNDM0MDAwM0MwMTAwMDE5OAorOjEwMDcxMDAwQUMyMzBGNjQ4QzQzNDAwODI0NDQ0MDAwOEM1QzQwMDRBQworOjEwMDcyMDAwMzA2MjAwNDAxNDQwMDAwMjI0MDIwMDg4MjQwMjAwMDhDNQorOjEwMDczMDAwM0MwMTAwMDFBNDIyMEY2ODMwNjIwMDA0MTA0MDAwMDU1MworOjEwMDc0MDAwMjQwMjAwMDEzQzAxMDAwMUEwMjIwRjU3MDgwMDQxRDVGRQorOjEwMDc1MDAwMDAwMzE0MDIzQzAxMDAwMUEwMjAwRjU3MDAwMzE0MDIwMworOjEwMDc2MDAwM0MwMTAwMDFBNDIyMEY1NDk0ODMwMDBDMjQwMjAwMDFEOAorOjEwMDc3MDAwM0MwMTAwMDFBNDIwMEY1MDNDMDEwMDAxQTAyMjBGNTZCMworOjEwMDc4MDAwM0MwMTAwMDFBNDIzMEY2MjI0MDIwMDAxMTM0MjAwMUU1OQorOjEwMDc5MDAwMDAwMDAwMDAxMzQwMDAwNTI0MDIwMDAzMTM0MjAwNjcxQworOjEwMDdBMDAwMDAwMDAwMDAwODAwNDJDRjAwMDAwMDAwM0MwMjAwMDFGMQorOjEwMDdCMDAwOTQ0MjBGNjIyNDFBMDAwMTNDMDEwMDAxQTQyMDBGNUU0NAorOjEwMDdDMDAwM0MwMTAwMDFBNDIwMEY1MjMwNDQwN0ZGMDAwMjFCQzI2RAorOjEwMDdEMDAwMDAwMzE4MjMzMDYzMDAzRTM0NjMwMDM2MDAwMjEyNDJFNworOjEwMDdFMDAwMzA0MjAwM0MwMDYyMTgyMTNDMDEwMDAxQTQyNDBGNTg1MworOjEwMDdGMDAwMDA4MzIwMjEyNDYzMDAzMDNDMDEwMDAxQTQyNDBGNUEwRgorOjEwMDgwMDAwM0MwMTAwMDFBNDIzMEY1QzNDMDYwMDAxMjRDNjBGNTJFQQorOjEwMDgxMDAwOTRDNTAwMDA5NEMzMDAwMjNDMDQwMDAxOTQ4NDBGNUE2NAorOjEwMDgyMDAwMDA2NTEwMjEwMDQ0MTAyQTEwNDAwMDEzM0MxMDgwMDA4NQorOjEwMDgzMDAwMDBBMzEwMjFBNEMyMDAwMDNDMDJBMDAwQUY2MjBDRjQ4RgorOjEwMDg0MDAwM0MwMTAwMDFBMDIwMEY1NjhGNjQxMDA4MDA5MDEwMjQ3NgorOjEwMDg1MDAwMTQ0MDAwMDMwMDAwMDAwMDBDMDA0MDY0MDAwMDAwMDA5MQorOjEwMDg2MDAwOEY2MjBDRjQwMDUwMTAyNDEwNDAwMEI3MDAwMDAwMDAwQworOjEwMDg3MDAwMDgwMDQyMEYwMDAwMDAwMDNDMDMwMDAxOTQ2MzBGNTA4OQorOjEwMDg4MDAwMDA4NTEwMjNBNEM0MDAwMDAwNjIxODIxMzA0MkZGRkYzRAorOjEwMDg5MDAwM0MwMTAwMDFBNDIzMEY1MEFGNjIwQ0U4M0MwMjAwMDFCMAorOjEwMDhBMDAwOTQ0MjBGNjgzNDQyMDAyNEFGNjIwQ0VDOTRDMzAwMDJGRgorOjEwMDhCMDAwM0MwMjAwMDE5NDQyMEY1MDE0NjIwMDEyM0MwMjgwMDA3RQorOjEwMDhDMDAwM0MxMDgwMDAzQzAyQTAwMEFGNjIwQ0Y0M0MwMTAwMDEyRgorOjEwMDhEMDAwQTAyMDBGNTY4RjY0MTAwODAwOTAxMDI0MTQ0MDAwMDNDRAorOjEwMDhFMDAwMDAwMDAwMDAwQzAwNDA2NDAwMDAwMDAwOEY2MjBDRjQ2NworOjEwMDhGMDAwMDA1MDEwMjQxNDQwRkZGNzAwMDAwMDAwMDgwMDQyQ0YxMQorOjEwMDkwMDAwMjQxQTAwMDNBRjYyMENGNDNDMTA4MDAwOEY2NDEwMDhCRQorOjEwMDkxMDAwMDA5MDEwMjQxNDQwMDAwMzAwMDAwMDAwMEMwMDQwNjQwQworOjEwMDkyMDAwMDAwMDAwMDA4RjYyMENGNDAwNTAxMDI0MTQ0MEZGRjcwOAorOjEwMDkzMDAwMDAwMDAwMDAwODAwNDJDRjI0MUEwMDAzM0MwNzAwMDExOQorOjEwMDk0MDAwMjRFNzBGNTA5NEUyMDAwMDAzODIxMDIxQUY2MjBDRTAxNAorOjEwMDk1MDAwM0MwMjAwMDE4QzQyMEY2NEFGNjIwQ0U0M0MwNTAwMDFENAorOjEwMDk2MDAwOTRBNTBGNTQ5NEUzMDAwMDNDMDQwMDAxOTQ4NDBGNThCNAorOjEwMDk3MDAwM0MwMjAwMDE5NDQyMEY1RTAwQTMyODIzMDA4MjIwMjM0MgorOjEwMDk4MDAwMzBBNkZGRkYzMDgzRkZGRjAwQzMxMDJCMTQ0MDAwNDM0RAorOjEwMDk5MDAwMDAwMDAwMDAzQzAyMDAwMTk0NDIwRjVDMDAwMjE0MDBDMQorOjEwMDlBMDAwMDA2MjEwMjVBRjYyMENFODk0RTIwMDAwM0MwMzAwMDFGNQorOjEwMDlCMDAwOTQ2MzBGNTQwMDQ0MTAyMUE0RTIwMDAwMzA0MkZGRkY3MgorOjEwMDlDMDAwMTQ0MzAwMjEzQzAyMDAwODNDMDIwMDAxOTA0MjBGNTdGMgorOjEwMDlEMDAwMTA0MDAwMDYzQzAzMDAwQzNDMDIwMDAxOTQ0MjBGNjhFQQorOjEwMDlFMDAwMzQ2MzA2MjQwODAwNDI3QzAwMDBEMDIxM0MwMjAwMDE1MAorOjEwMDlGMDAwOTQ0MjBGNjgzQzAzMDAwODM0NjMwNjI0MDA0MzEwMjUyQQorOjEwMEEwMDAwQUY2MjBDRUMzQzEwODAwMDNDMDJBMDAwQUY2MjBDRjQyMgorOjEwMEExMDAwM0MwMTAwMDFBMDIwMEY1NjhGNjQxMDA4MDA5MDEwMjRBNAorOjEwMEEyMDAwMTQ0MDAwMDMwMDAwMDAwMDBDMDA0MDY0MDAwMDAwMDBCRgorOjEwMEEzMDAwOEY2MjBDRjQwMDUwMTAyNDEwNDAwMDE1MDAwMDAwMDBEQworOjEwMEE0MDAwMDgwMDQyODMwMDAwMDAwMDNDMDMwMDAxOTQ2MzBGNjgyQgorOjEwMEE1MDAwMzQ0MjA2MjQzQzEwODAwMDAwNjIxODI1M0MwMjgwMDBDRAorOjEwMEE2MDAwQUY2MzBDRUNBRjYyMENGNDhGNjQxMDA4MDA5MDEwMjQ5QworOjEwMEE3MDAwMTQ0MDAwMDMwMDAwMDAwMDBDMDA0MDY0MDAwMDAwMDA2RgorOjEwMEE4MDAwOEY2MjBDRjQwMDUwMTAyNDE0NDBGRkY3MDAwMDAwMDBBNworOjEwMEE5MDAwM0MwMTAwMDEwODAwNDJDRkE0MjAwRjVFM0MwMjAwMDE4RgorOjEwMEFBMDAwOTQ0MjBGNUMwMDAyMTQwMDAwQzIxMDI1QUY2MjBDRThGMworOjEwMEFCMDAwM0MwMjAwMDE5MDQyMEY1NzEwNDAwMDA5M0MwMzAwMEMxQgorOjEwMEFDMDAwM0MwMjAwMDE5NDQyMEY2ODM0NjMwNjI0MDAwMEQwMjFFOAorOjEwMEFEMDAwMDA0MzEwMjVBRjYyMENFQzA4MDA0MkMxM0MxMDgwMDBCRQorOjEwMEFFMDAwM0MwMjAwMDE5NDQyMEY2ODNDMDMwMDA4MzQ2MzA2MDQ5MgorOjEwMEFGMDAwMDA0MzEwMjVBRjYyMENFQzNDMDIwMDAxOTQ0MjBGNUVGMworOjEwMEIwMDAwMDA0NTEwMjEzQzAxMDAwMUE0MjIwRjVFM0MxMDgwMDAzMgorOjEwMEIxMDAwM0MwMkEwMDBBRjYyMENGNDNDMDEwMDAxQTAyMDBGNTY4MworOjEwMEIyMDAwOEY2NDEwMDgwMDkwMTAyNDE0NDAwMDAzMDAwMDAwMDA5RgorOjEwMEIzMDAwMEMwMDQwNjQwMDAwMDAwMDhGNjIwQ0Y0MDA1MDEwMjQ5MAorOjEwMEI0MDAwMTQ0MEZGRjcwMDAwMDAwMDhGQkYwMDE0OEZCMDAwMTBBQQorOjEwMEI1MDAwMDNFMDAwMDgyN0JEMDAxODAwMDAwMDAwMjdCREZGRTBFQgorOjEwMEI2MDAwM0MwNDAwMDEyNDg0MEVDMDAwMDAyODIxMDAwMDMwMjEzNAorOjEwMEI3MDAwMDAwMDM4MjFBRkJGMDAxOEFGQTAwMDEwMEMwMDQzNzg3MAorOjEwMEI4MDAwQUZBMDAwMTQwMDAwRDAyMTI0MDIwMTMwQUY2MjUwMDA1OQorOjEwMEI5MDAwM0MwMTAwMDFBNDIwMEY1MDNDMDEwMDAxQTAyMDBGNTc5MAorOjEwMEJBMDAwOEZCRjAwMTgwM0UwMDAwODI3QkQwMDIwMjdCREZGRTgyNQorOjEwMEJCMDAwM0MxQkMwMDBBRkJGMDAxNEFGQjAwMDEwQUY2MDY4MENBQQorOjEwMEJDMDAwOEY2MjY4MDQzNDQyMDA4MkFGNjI2ODA0OEY2MzQwMDAyMQorOjEwMEJEMDAwMjQwMjBCNTAzQzAxMDAwMUFDMjIwRjIwMjQwMjBCNzhCMAorOjEwMEJFMDAwM0MwMTAwMDFBQzIyMEYzMDM0NjMwMDAyQUY2MzQwMDBDRgorOjEwMEJGMDAwMEMwMDQzMTUwMDgwODAyMTNDMDEwMDAxQTAyMjBGMzQyRAorOjEwMEMwMDAwMzA0MjAwRkYyNDAzMDAwMjE0NDMwMDA1MDAwMDAwMDBFRQorOjEwMEMxMDAwM0MwMjAwMDE4QzQyMEYyMDA4MDA0MzA4QUM1MDAwQzA4OQorOjEwMEMyMDAwM0MwMjAwMDE4QzQyMEYyMEFDNTAwMEJDOEY2MjQ0MzQ2NworOjEwMEMzMDAwOEY2MzQ0Mzg4RjY0NDQxMDNDMDEwMDAxQUMyMjBGMjhCQworOjEwMEM0MDAwM0MwMTAwMDFBQzIzMEYzODNDMDEwMDAxQUMyNDBGMjQwRgorOjEwMEM1MDAwOEZCRjAwMTQ4RkIwMDAxMDAzRTAwMDA4MjdCRDAwMThGQworOjEwMEM2MDAwMDNFMDAwMDgyNDAyMDAwMTI3QkRGRkY4MTg4MDAwMDlGNgorOjEwMEM3MDAwMDAwMDI4MjE4RjYzNjgwQzhGNjI2ODBDMTA0M0ZGRkUxMAorOjEwMEM4MDAwMDAwMDAwMDAyNEE1MDAwMTAwQTQxMDJBMTQ0MEZGRjk3MAorOjEwMEM5MDAwMDAwMDAwMDAwM0UwMDAwODI3QkQwMDA4OEY2MzQ0NTBGNworOjEwMENBMDAwM0MwMjAwMDE4QzQyMEYyODAwMDMxQzAyMDA0MzEwMkI2MQorOjEwMENCMDAwMTQ0MDAwMDgzQzAzODAwMDNDMDQwMDAxOEM4NDBGMzg4MQorOjEwMENDMDAwOEY2MjQ0NTAwMDAyMUMwMjAwODMxMDJCMTA0MEZGRkM3NgorOjEwMENEMDAwM0MwMzgwMDBBRjYzNDQ0NDhGNjI0NDQ0MDA0MzEwMjRDQgorOjEwMENFMDAwMTQ0MEZGRkQwMDAwMDAwMDhGNjI0NDQ4MDNFMDAwMDg0QworOjEwMENGMDAwMzA0MkZGRkYzMDgyRkZGRjI0NDJFMDAwMkM0MjIwMDFGRgorOjEwMEQwMDAwMTQ0MDAwMDMzQzAyNDAwMDA4MDA0MzQ3MjQwMkZGRkY1OAorOjEwMEQxMDAwMDA4MjIwMjVBRjY0NUMzODhGNjI1QzMwMzA0MjAwMDI3NAorOjEwMEQyMDAwMTQ0MEZGRkMwMDAwMTAyMTAzRTAwMDA4MDAwMDAwMDA1OAorOjEwMEQzMDAwOEY2MjQ0NTAzQzAzMDAwMThDNjMwRjI0MDgwMDQzNTAzMQorOjEwMEQ0MDAwMzA0MkZGRkY4RjYyNDQ1MDMwNDJGRkZGMDA0MzEwMkJDMAorOjEwMEQ1MDAwMTQ0MEZGRkMwMDAwMDAwMDAzRTAwMDA4MDAwMDAwMDA1OQorOjEwMEQ2MDAwMjdCREZGRTAwMDgwMjgyMTNDMDQwMDAxMjQ4NDBFRDAzMAorOjEwMEQ3MDAwMDAwMDMwMjEwMDAwMzgyMUFGQkYwMDE4QUZBMDAwMTBFNAorOjEwMEQ4MDAwMEMwMDQzNzhBRkEwMDAxNDA4MDA0MzVGMDAwMDAwMDA4RgorOjEwMEQ5MDAwOEZCRjAwMTgwM0UwMDAwODI3QkQwMDIwM0MwMjAwMDFCRgorOjEwMERBMDAwMzQ0MkQ2MDAzQzAzMDAwMTM0NjNENjAwM0MwNDAwMDEwOQorOjEwMERCMDAwMzQ4NERERkYzQzAxMDAwMUFDMjIwRjQwMjQwMjAwNDBERQorOjEwMERDMDAwM0MwMTAwMDFBQzIyMEY0NDNDMDEwMDAxQUMyMDBGM0M2RgorOjEwMEREMDAwQUM2MDAwMDAyNDYzMDAwNDAwODMxMDJCNTA0MEZGRkQzMgorOjEwMERFMDAwQUM2MDAwMDAwM0UwMDAwODAwMDAwMDAwMDA4MDQ4MjEyMworOjEwMERGMDAwOEZBQTAwMTAzQzAyMDAwMThDNDIwRjNDM0MwNDAwMDExMQorOjEwMEUwMDAwOEM4NDBGNDQ4RkFCMDAxNDI0NDMwMDAxMDA0NDEwMkI0QQorOjEwMEUxMDAwM0MwMTAwMDFBQzIzMEYzQzE0NDAwMDAzMDAwMDQwMjFDMgorOjEwMEUyMDAwM0MwMTAwMDFBQzIwMEYzQzNDMDIwMDAxOEM0MjBGM0MxNQorOjEwMEUzMDAwM0MwMzAwMDE4QzYzMEY0MDkxMjQwMDAwMDAwMjExNDAyQworOjEwMEU0MDAwMDA0MzEwMjEwMDQ4MTAyMTI1MDgwMDAxQTA0NDAwMDBBMworOjEwMEU1MDAwMjkwMjAwMDgxNDQwRkZGNDI1MjkwMDAxM0MwMjAwMDE4QQorOjEwMEU2MDAwOEM0MjBGM0MzQzAzMDAwMThDNjMwRjQwOEY2NDY4MEM4NAorOjEwMEU3MDAwMDAwMjExNDAwMDQzMTAyMUFDNDQwMDA4QUM0NTAwMENCNgorOjEwMEU4MDAwQUM0NjAwMTBBQzQ3MDAxNEFDNEEwMDE4MDNFMDAwMDg2MAorOjEwMEU5MDAwQUM0QjAwMUMwMDAwMDAwMDAwMDAwMDAwNEQ2MTY5NkVCQQorOjEwMEVBMDAwNDM3MDc1NDIwMDAwMDAwMDRENjE2OTZFNDM3MDc1NDFFQQorOjEwMEVCMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNzM3NDZCNkY3MQorOjEwMEVDMDAwNjY2NjZDNjQwMDAwMDAwMDAwMDAwMDAwNzM3NDZCNkZDNQorOjEwMEVEMDAwNjY2NjZDNjQwMDAwMDAwMDAwMDAwMDAwNjY2MTc0NjFEQQorOjEwMEVFMDAwNkM0NTcyNzIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA2RAorOjEwMEVGMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBGMgorOjEwMEYwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFMQorOjEwMEYxMDAwNzM3NDZCNkY2NjY2NkM2NDVGNzYzMTJFMzIyRTMwMDBCMAorOjBDMEYyMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwQzUKKzowMDAwMDAwMUZGCisgKiBGaXJtd2FyZSBpczoKKyAqCURlcml2ZWQgZnJvbSBwcm9wcmlldGFyeSB1bnB1Ymxpc2hlZCBzb3VyY2UgY29kZSwKKyAqCUNvcHlyaWdodCAoQykgMjAwMC0yMDAzIEJyb2FkY29tIENvcnBvcmF0aW9uLgorICoKKyAqCVBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQgZm9yIHRoZSBkaXN0cmlidXRpb24gb2YgdGhpcyBmaXJtd2FyZQorICoJZGF0YSBpbiBoZXhhZGVjaW1hbCBvciBlcXVpdmFsZW50IGZvcm1hdCwgcHJvdmlkZWQgdGhpcyBjb3B5cmlnaHQKKyAqCW5vdGljZSBpcyBhY2NvbXBhbnlpbmcgaXQuCisvKiA1NzA1IG5lZWRzIGEgc3BlY2lhbCB2ZXJzaW9uIG9mIHRoZSBUU08gZmlybXdhcmUuICAqLwpkaWZmIC0tZ2l0IGEvZnMvS2NvbmZpZyBiL2ZzL0tjb25maWcKaW5kZXggZmYwZTgxOS4uMzI4ODM1OCAxMDA2NDQKLS0tIGEvZnMvS2NvbmZpZworKysgYi9mcy9LY29uZmlnCkBAIC0xODksNiArMTg5LDggQEAKIAlzZWxlY3QgQ09ORklHRlNfRlMKIAlzZWxlY3QgSkJEMgogCXNlbGVjdCBDUkMzMgorCXNlbGVjdCBRVU9UQQorCXNlbGVjdCBRVU9UQV9UUkVFCiAJaGVscAogCSAgT0NGUzIgaXMgYSBnZW5lcmFsIHB1cnBvc2UgZXh0ZW50IGJhc2VkIHNoYXJlZCBkaXNrIGNsdXN0ZXIgZmlsZQogCSAgc3lzdGVtIHdpdGggbWFueSBzaW1pbGFyaXRpZXMgdG8gZXh0My4gSXQgc3VwcG9ydHMgNjQgYml0IGlub2RlCkBAIC0yNTgsMTUgKzI2MCwxNCBAQAogCSAgdGhpcyBvcHRpb24gZm9yIGRlYnVnZ2luZyBvbmx5IGFzIGl0IGlzIGxpa2VseSB0byBkZWNyZWFzZQogCSAgcGVyZm9ybWFuY2Ugb2YgdGhlIGZpbGVzeXN0ZW0uCiAKLWNvbmZpZyBPQ0ZTMl9DT01QQVRfSkJECi0JYm9vbCAiVXNlIEpCRCBmb3IgY29tcGF0aWJpbGl0eSIKK2NvbmZpZyBPQ0ZTMl9GU19QT1NJWF9BQ0wKKwlib29sICJPQ0ZTMiBQT1NJWCBBY2Nlc3MgQ29udHJvbCBMaXN0cyIKIAlkZXBlbmRzIG9uIE9DRlMyX0ZTCisJc2VsZWN0IEZTX1BPU0lYX0FDTAogCWRlZmF1bHQgbgotCXNlbGVjdCBKQkQKIAloZWxwCi0JICBUaGUgb2NmczIgZmlsZXN5c3RlbSBub3cgdXNlcyBKQkQyIGZvciBpdHMgam91cm5hbGxpbmcuICBKQkQyCi0JICBpcyBiYWNrd2FyZHMgY29tcGF0aWJsZSB3aXRoIEpCRC4gIEl0IGlzIHNhZmUgdG8gc2F5IE4gaGVyZS4KLQkgIEhvd2V2ZXIsIGlmIHlvdSByZWFsbHkgd2FudCB0byB1c2UgdGhlIG9yaWdpbmFsIEpCRCwgc2F5IFkgaGVyZS4KKwkgIFBvc2l4IEFjY2VzcyBDb250cm9sIExpc3RzIChBQ0xzKSBzdXBwb3J0IHBlcm1pc3Npb25zIGZvciB1c2VycyBhbmQKKwkgIGdyb3VwcyBiZXlvbmQgdGhlIG93bmVyL2dyb3VwL3dvcmxkIHNjaGVtZS4KIAogZW5kaWYgIyBCTE9DSwogCkBAIC0zMDMsNiArMzA0LDEwIEBACiAJICBOb3RlIHRoYXQgdGhpcyBiZWhhdmlvciBpcyBjdXJyZW50bHkgZGVwcmVjYXRlZCBhbmQgbWF5IGdvIGF3YXkgaW4KIAkgIGZ1dHVyZS4gUGxlYXNlIHVzZSBub3RpZmljYXRpb24gdmlhIG5ldGxpbmsgc29ja2V0IGluc3RlYWQuCiAKKyMgR2VuZXJpYyBzdXBwb3J0IGZvciB0cmVlIHN0cnVjdHVyZWQgcXVvdGEgZmlsZXMuIFNlbGV0ZWQgd2hlbiBuZWVkZWQuCitjb25maWcgUVVPVEFfVFJFRQorCSB0cmlzdGF0ZQorCiBjb25maWcgUUZNVF9WMQogCXRyaXN0YXRlICJPbGQgcXVvdGEgZm9ybWF0IHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBRVU9UQQpAQCAtMzE0LDYgKzMxOSw3IEBACiBjb25maWcgUUZNVF9WMgogCXRyaXN0YXRlICJRdW90YSBmb3JtYXQgdjIgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIFFVT1RBCisJc2VsZWN0IFFVT1RBX1RSRUUKIAloZWxwCiAJICBUaGlzIHF1b3RhIGZvcm1hdCBhbGxvd3MgdXNpbmcgcXVvdGFzIHdpdGggMzItYml0IFVJRHMvR0lEcy4gSWYgeW91CiAJICBuZWVkIHRoaXMgZnVuY3Rpb25hbGl0eSBzYXkgWSBoZXJlLgpAQCAtNzE1LDcgKzcyMSwyMCBAQAogCiBlbmRtZW51CiAKLW1lbnUgIk1pc2NlbGxhbmVvdXMgZmlsZXN5c3RlbXMiCittZW51Y29uZmlnIE1JU0NfRklMRVNZU1RFTVMKKwlib29sICJNaXNjZWxsYW5lb3VzIGZpbGVzeXN0ZW1zIgorCWRlZmF1bHQgeQorCS0tLWhlbHAtLS0KKwkgIFNheSBZIGhlcmUgdG8gZ2V0IHRvIHNlZSBvcHRpb25zIGZvciB2YXJpb3VzIG1pc2NlbGxhbmVvdXMKKwkgIGZpbGVzeXN0ZW1zLCBzdWNoIGFzIGZpbGVzeXN0ZW1zIHRoYXQgY2FtZSBmcm9tIG90aGVyCisJICBvcGVyYXRpbmcgc3lzdGVtcy4KKworCSAgVGhpcyBvcHRpb24gYWxvbmUgZG9lcyBub3QgYWRkIGFueSBrZXJuZWwgY29kZS4KKworCSAgSWYgeW91IHNheSBOLCBhbGwgb3B0aW9ucyBpbiB0aGlzIHN1Ym1lbnUgd2lsbCBiZSBza2lwcGVkIGFuZAorCSAgZGlzYWJsZWQ7IGlmIHVuc3VyZSwgc2F5IFkgaGVyZS4KKworaWYgTUlTQ19GSUxFU1lTVEVNUwogCiBjb25maWcgQURGU19GUwogCXRyaXN0YXRlICJBREZTIGZpbGUgc3lzdGVtIHN1cHBvcnQgKEVYUEVSSU1FTlRBTCkiCkBAIC0xMDg1LDcgKzExMDQsNyBAQAogCSAgWSBoZXJlLiAgVGhpcyB3aWxsIHJlc3VsdCBpbiBfbWFueV8gYWRkaXRpb25hbCBkZWJ1Z2dpbmcgbWVzc2FnZXMgdG8gYmUKIAkgIHdyaXR0ZW4gdG8gdGhlIHN5c3RlbSBsb2cuCiAKLWVuZG1lbnUKK2VuZGlmICMgTUlTQ19GSUxFU1lTVEVNUwogCiBtZW51Y29uZmlnIE5FVFdPUktfRklMRVNZU1RFTVMKIAlib29sICJOZXR3b3JrIEZpbGUgU3lzdGVtcyIKZGlmZiAtLWdpdCBhL2ZzL01ha2VmaWxlIGIvZnMvTWFrZWZpbGUKaW5kZXggZTZmNDIzZC4uYzgzMDYxMSAxMDA2NDQKLS0tIGEvZnMvTWFrZWZpbGUKKysrIGIvZnMvTWFrZWZpbGUKQEAgLTU0LDYgKzU0LDcgQEAKIG9iai0kKENPTkZJR19RVU9UQSkJCSs9IGRxdW90Lm8KIG9iai0kKENPTkZJR19RRk1UX1YxKQkJKz0gcXVvdGFfdjEubwogb2JqLSQoQ09ORklHX1FGTVRfVjIpCQkrPSBxdW90YV92Mi5vCitvYmotJChDT05GSUdfUVVPVEFfVFJFRSkJKz0gcXVvdGFfdHJlZS5vCiBvYmotJChDT05GSUdfUVVPVEFDVEwpCQkrPSBxdW90YS5vCiAKIG9iai0kKENPTkZJR19QUk9DX0ZTKQkJKz0gcHJvYy8KZGlmZiAtLWdpdCBhL2ZzL2FmZnMvaW5vZGUuYyBiL2ZzL2FmZnMvaW5vZGUuYwppbmRleCA0MTVkOWM2Li4zYzRlYzdkIDEwMDY0NAotLS0gYS9mcy9hZmZzL2lub2RlLmMKKysrIGIvZnMvYWZmcy9pbm9kZS5jCkBAIC0xMTksOCArMTE5LDcgQEAKIAkJZ290byBiYWRfaW5vZGU7CiAjZWxzZQogCQlpbm9kZS0+aV9tb2RlIHw9IFNfSUZESVI7Ci0JCWlub2RlLT5pX29wID0gTlVMTDsKLQkJaW5vZGUtPmlfZm9wID0gTlVMTDsKKwkJLyogLi4uIGFuZCBsZWF2ZSAtPmlfb3AgYW5kIC0+aV9mb3AgcG9pbnRpbmcgdG8gZW1wdHkgKi8KIAkJYnJlYWs7CiAjZW5kaWYKIAljYXNlIFNUX0xJTktGSUxFOgpkaWZmIC0tZ2l0IGEvZnMvYXV0b2ZzL2lub2RlLmMgYi9mcy9hdXRvZnMvaW5vZGUuYwppbmRleCBjNzczNjgwLi5lMTczNGYyIDEwMDY0NAotLS0gYS9mcy9hdXRvZnMvaW5vZGUuYworKysgYi9mcy9hdXRvZnMvaW5vZGUuYwpAQCAtMjUxLDEzICsyNTEsMTEgQEAKIAlpbm9kZS0+aV9tb2RlID0gU19JRkRJUiB8IFNfSVJVR08gfCBTX0lYVUdPOwogCWlub2RlLT5pX25saW5rID0gMjsKIAlpbm9kZS0+aV9tdGltZSA9IGlub2RlLT5pX2F0aW1lID0gaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUU7Ci0JaW5vZGUtPmlfYmxvY2tzID0gMDsKIAogCWlmIChpbm8gPT0gQVVUT0ZTX1JPT1RfSU5PKSB7CiAJCWlub2RlLT5pX21vZGUgPSBTX0lGRElSIHwgU19JUlVHTyB8IFNfSVhVR08gfCBTX0lXVVNSOwogCQlpbm9kZS0+aV9vcCA9ICZhdXRvZnNfcm9vdF9pbm9kZV9vcGVyYXRpb25zOwogCQlpbm9kZS0+aV9mb3AgPSAmYXV0b2ZzX3Jvb3Rfb3BlcmF0aW9uczsKLQkJaW5vZGUtPmlfdWlkID0gaW5vZGUtPmlfZ2lkID0gMDsgLyogQ2hhbmdlZCBpbiByZWFkX3N1cGVyICovCiAJCWdvdG8gZG9uZTsKIAl9IAogCQpkaWZmIC0tZ2l0IGEvZnMvYXV0b2ZzNC9hdXRvZnNfaS5oIGIvZnMvYXV0b2ZzNC9hdXRvZnNfaS5oCmluZGV4IGUwZjE2ZGEuLmE3NjgwMzEgMTAwNjQ0Ci0tLSBhL2ZzL2F1dG9mczQvYXV0b2ZzX2kuaAorKysgYi9mcy9hdXRvZnM0L2F1dG9mc19pLmgKQEAgLTI1LDggKzI1LDYgQEAKICNkZWZpbmUgQVVUT0ZTX0RFVl9JT0NUTF9JT0NfRklSU1QJKEFVVE9GU19ERVZfSU9DVExfVkVSU0lPTikKICNkZWZpbmUgQVVUT0ZTX0RFVl9JT0NUTF9JT0NfQ09VTlQJKEFVVE9GU19JT0NfQ09VTlQgLSAxMSkKIAotI2RlZmluZSBBVVRPRlNfVFlQRV9UUklHR0VSCShBVVRPRlNfVFlQRV9ESVJFQ1R8QVVUT0ZTX1RZUEVfT0ZGU0VUKQotCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KZGlmZiAtLWdpdCBhL2ZzL2F1dG9mczQvZGV2LWlvY3RsLmMgYi9mcy9hdXRvZnM0L2Rldi1pb2N0bC5jCmluZGV4IDYzYjdjN2EuLjAyNWUxMDUgMTAwNjQ0Ci0tLSBhL2ZzL2F1dG9mczQvZGV2LWlvY3RsLmMKKysrIGIvZnMvYXV0b2ZzNC9kZXYtaW9jdGwuYwpAQCAtMTI0LDcgKzEyNCw3IEBACiAKIC8qCiAgKiBDaGVjayBzYW5pdHkgb2YgcGFyYW1ldGVyIGNvbnRyb2wgZmllbGRzIGFuZCBpZiBhIHBhdGggaXMgcHJlc2VudAotICogY2hlY2sgdGhhdCBpdCBoYXMgYSAiLyIgYW5kIGlzIHRlcm1pbmF0ZWQuCisgKiBjaGVjayB0aGF0IGl0IGlzIHRlcm1pbmF0ZWQgYW5kIGNvbnRhaW5zIGF0IGxlYXN0IG9uZSAiLyIuCiAgKi8KIHN0YXRpYyBpbnQgdmFsaWRhdGVfZGV2X2lvY3RsKGludCBjbWQsIHN0cnVjdCBhdXRvZnNfZGV2X2lvY3RsICpwYXJhbSkKIHsKQEAgLTEzOCwxNSArMTM4LDE2IEBACiAJfQogCiAJaWYgKHBhcmFtLT5zaXplID4gc2l6ZW9mKCpwYXJhbSkpIHsKLQkJZXJyID0gY2hlY2tfbmFtZShwYXJhbS0+cGF0aCk7CisJCWVyciA9IGludmFsaWRfc3RyKHBhcmFtLT5wYXRoLAorCQkJCSAodm9pZCAqKSAoKHNpemVfdCkgcGFyYW0gKyBwYXJhbS0+c2l6ZSkpOwogCQlpZiAoZXJyKSB7Ci0JCQlBVVRPRlNfV0FSTigiaW52YWxpZCBwYXRoIHN1cHBsaWVkIGZvciBjbWQoMHglMDh4KSIsCi0JCQkJICAgIGNtZCk7CisJCQlBVVRPRlNfV0FSTigKKwkJCSAgInBhdGggc3RyaW5nIHRlcm1pbmF0b3IgbWlzc2luZyBmb3IgY21kKDB4JTA4eCkiLAorCQkJICBjbWQpOwogCQkJZ290byBvdXQ7CiAJCX0KIAotCQllcnIgPSBpbnZhbGlkX3N0cihwYXJhbS0+cGF0aCwKLQkJCQkgKHZvaWQgKikgKChzaXplX3QpIHBhcmFtICsgcGFyYW0tPnNpemUpKTsKKwkJZXJyID0gY2hlY2tfbmFtZShwYXJhbS0+cGF0aCk7CiAJCWlmIChlcnIpIHsKIAkJCUFVVE9GU19XQVJOKCJpbnZhbGlkIHBhdGggc3VwcGxpZWQgZm9yIGNtZCgweCUwOHgpIiwKIAkJCQkgICAgY21kKTsKQEAgLTE4MCw3ICsxODEsNyBAQAogCQkJCSAgICAgc3RydWN0IGF1dG9mc19zYl9pbmZvICpzYmksCiAJCQkJICAgICBzdHJ1Y3QgYXV0b2ZzX2Rldl9pb2N0bCAqcGFyYW0pCiB7Ci0JcGFyYW0tPmFyZzEgPSBzYmktPnZlcnNpb247CisJcGFyYW0tPnByb3RvdmVyLnZlcnNpb24gPSBzYmktPnZlcnNpb247CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE4OSw3ICsxOTAsNyBAQAogCQkJCQlzdHJ1Y3QgYXV0b2ZzX3NiX2luZm8gKnNiaSwKIAkJCQkJc3RydWN0IGF1dG9mc19kZXZfaW9jdGwgKnBhcmFtKQogewotCXBhcmFtLT5hcmcxID0gc2JpLT5zdWJfdmVyc2lvbjsKKwlwYXJhbS0+cHJvdG9zdWJ2ZXIuc3ViX3ZlcnNpb24gPSBzYmktPnN1Yl92ZXJzaW9uOwogCXJldHVybiAwOwogfQogCkBAIC0zMzUsMTMgKzMzNiwxMyBAQAogCWludCBlcnIsIGZkOwogCiAJLyogcGFyYW0tPnBhdGggaGFzIGFscmVhZHkgYmVlbiBjaGVja2VkICovCi0JaWYgKCFwYXJhbS0+YXJnMSkKKwlpZiAoIXBhcmFtLT5vcGVubW91bnQuZGV2aWQpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJcGFyYW0tPmlvY3RsZmQgPSAtMTsKIAogCXBhdGggPSBwYXJhbS0+cGF0aDsKLQlkZXZpZCA9IHBhcmFtLT5hcmcxOworCWRldmlkID0gcGFyYW0tPm9wZW5tb3VudC5kZXZpZDsKIAogCWVyciA9IDA7CiAJZmQgPSBhdXRvZnNfZGV2X2lvY3RsX29wZW5fbW91bnRwb2ludChwYXRoLCBkZXZpZCk7CkBAIC0zNzMsNyArMzc0LDcgQEAKIHsKIAlhdXRvZnNfd3F0X3QgdG9rZW47CiAKLQl0b2tlbiA9IChhdXRvZnNfd3F0X3QpIHBhcmFtLT5hcmcxOworCXRva2VuID0gKGF1dG9mc193cXRfdCkgcGFyYW0tPnJlYWR5LnRva2VuOwogCXJldHVybiBhdXRvZnM0X3dhaXRfcmVsZWFzZShzYmksIHRva2VuLCAwKTsKIH0KIApAQCAtMzg4LDggKzM4OSw4IEBACiAJYXV0b2ZzX3dxdF90IHRva2VuOwogCWludCBzdGF0dXM7CiAKLQl0b2tlbiA9IChhdXRvZnNfd3F0X3QpIHBhcmFtLT5hcmcxOwotCXN0YXR1cyA9IHBhcmFtLT5hcmcyID8gcGFyYW0tPmFyZzIgOiAtRU5PRU5UOworCXRva2VuID0gKGF1dG9mc193cXRfdCkgcGFyYW0tPmZhaWwudG9rZW47CisJc3RhdHVzID0gcGFyYW0tPmZhaWwuc3RhdHVzID8gcGFyYW0tPmZhaWwuc3RhdHVzIDogLUVOT0VOVDsKIAlyZXR1cm4gYXV0b2ZzNF93YWl0X3JlbGVhc2Uoc2JpLCB0b2tlbiwgc3RhdHVzKTsKIH0KIApAQCAtNDEyLDEwICs0MTMsMTAgQEAKIAlpbnQgcGlwZWZkOwogCWludCBlcnIgPSAwOwogCi0JaWYgKHBhcmFtLT5hcmcxID09IC0xKQorCWlmIChwYXJhbS0+c2V0cGlwZWZkLnBpcGVmZCA9PSAtMSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlwaXBlZmQgPSBwYXJhbS0+YXJnMTsKKwlwaXBlZmQgPSBwYXJhbS0+c2V0cGlwZWZkLnBpcGVmZDsKIAogCW11dGV4X2xvY2soJnNiaS0+d3FfbXV0ZXgpOwogCWlmICghc2JpLT5jYXRhdG9uaWMpIHsKQEAgLTQ1Nyw4ICs0NTgsOCBAQAogewogCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKIAotCXRpbWVvdXQgPSBwYXJhbS0+YXJnMTsKLQlwYXJhbS0+YXJnMSA9IHNiaS0+ZXhwX3RpbWVvdXQgLyBIWjsKKwl0aW1lb3V0ID0gcGFyYW0tPnRpbWVvdXQudGltZW91dDsKKwlwYXJhbS0+dGltZW91dC50aW1lb3V0ID0gc2JpLT5leHBfdGltZW91dCAvIEhaOwogCXNiaS0+ZXhwX3RpbWVvdXQgPSB0aW1lb3V0ICogSFo7CiAJcmV0dXJuIDA7CiB9CkBAIC00ODksNyArNDkwLDcgQEAKIAlwYXRoID0gcGFyYW0tPnBhdGg7CiAJZGV2aWQgPSBzYmktPnNiLT5zX2RldjsKIAotCXBhcmFtLT5hcmcxID0gcGFyYW0tPmFyZzIgPSAtMTsKKwlwYXJhbS0+cmVxdWVzdGVyLnVpZCA9IHBhcmFtLT5yZXF1ZXN0ZXIuZ2lkID0gLTE7CiAKIAkvKiBHZXQgbmFtZWlkYXRhIG9mIHRoZSBwYXJlbnQgZGlyZWN0b3J5ICovCiAJZXJyID0gcGF0aF9sb29rdXAocGF0aCwgTE9PS1VQX1BBUkVOVCwgJm5kKTsKQEAgLTUwNSw4ICs1MDYsOCBAQAogCQllcnIgPSAwOwogCQlhdXRvZnM0X2V4cGlyZV93YWl0KG5kLnBhdGguZGVudHJ5KTsKIAkJc3Bpbl9sb2NrKCZzYmktPmZzX2xvY2spOwotCQlwYXJhbS0+YXJnMSA9IGluby0+dWlkOwotCQlwYXJhbS0+YXJnMiA9IGluby0+Z2lkOworCQlwYXJhbS0+cmVxdWVzdGVyLnVpZCA9IGluby0+dWlkOworCQlwYXJhbS0+cmVxdWVzdGVyLmdpZCA9IGluby0+Z2lkOwogCQlzcGluX3VubG9jaygmc2JpLT5mc19sb2NrKTsKIAl9CiAKQEAgLTUyOSwxMCArNTMwLDEwIEBACiAJaW50IGVyciA9IC1FQUdBSU47CiAJaW50IGhvdzsKIAotCWhvdyA9IHBhcmFtLT5hcmcxOworCWhvdyA9IHBhcmFtLT5leHBpcmUuaG93OwogCW1udCA9IGZwLT5mX3BhdGgubW50OwogCi0JaWYgKHNiaS0+dHlwZSAmIEFVVE9GU19UWVBFX1RSSUdHRVIpCisJaWYgKGF1dG9mc190eXBlX3RyaWdnZXIoc2JpLT50eXBlKSkKIAkJZGVudHJ5ID0gYXV0b2ZzNF9leHBpcmVfZGlyZWN0KHNiaS0+c2IsIG1udCwgc2JpLCBob3cpOwogCWVsc2UKIAkJZGVudHJ5ID0gYXV0b2ZzNF9leHBpcmVfaW5kaXJlY3Qoc2JpLT5zYiwgbW50LCBzYmksIGhvdyk7CkBAIC01NjUsOSArNTY2LDkgQEAKIAkJCQkgICAgICBzdHJ1Y3QgYXV0b2ZzX3NiX2luZm8gKnNiaSwKIAkJCQkgICAgICBzdHJ1Y3QgYXV0b2ZzX2Rldl9pb2N0bCAqcGFyYW0pCiB7Ci0JcGFyYW0tPmFyZzEgPSAwOworCXBhcmFtLT5hc2t1bW91bnQubWF5X3Vtb3VudCA9IDA7CiAJaWYgKG1heV91bW91bnQoZnAtPmZfcGF0aC5tbnQpKQotCQlwYXJhbS0+YXJnMSA9IDE7CisJCXBhcmFtLT5hc2t1bW91bnQubWF5X3Vtb3VudCA9IDE7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTYwMCw2ICs2MDEsNyBAQAogCXN0cnVjdCBuYW1laWRhdGEgbmQ7CiAJY29uc3QgY2hhciAqcGF0aDsKIAl1bnNpZ25lZCBpbnQgdHlwZTsKKwl1bnNpZ25lZCBpbnQgZGV2aWQsIG1hZ2ljOwogCWludCBlcnIgPSAtRU5PRU5UOwogCiAJaWYgKHBhcmFtLT5zaXplIDw9IHNpemVvZigqcGFyYW0pKSB7CkBAIC02MDgsMTMgKzYxMCwxMyBAQAogCX0KIAogCXBhdGggPSBwYXJhbS0+cGF0aDsKLQl0eXBlID0gcGFyYW0tPmFyZzE7CisJdHlwZSA9IHBhcmFtLT5pc21vdW50cG9pbnQuaW4udHlwZTsKIAotCXBhcmFtLT5hcmcxID0gMDsKLQlwYXJhbS0+YXJnMiA9IDA7CisJcGFyYW0tPmlzbW91bnRwb2ludC5vdXQuZGV2aWQgPSBkZXZpZCA9IDA7CisJcGFyYW0tPmlzbW91bnRwb2ludC5vdXQubWFnaWMgPSBtYWdpYyA9IDA7CiAKIAlpZiAoIWZwIHx8IHBhcmFtLT5pb2N0bGZkID09IC0xKSB7Ci0JCWlmICh0eXBlID09IEFVVE9GU19UWVBFX0FOWSkgeworCQlpZiAoYXV0b2ZzX3R5cGVfYW55KHR5cGUpKSB7CiAJCQlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiOwogCiAJCQllcnIgPSBwYXRoX2xvb2t1cChwYXRoLCBMT09LVVBfRk9MTE9XLCAmbmQpOwpAQCAtNjIyLDcgKzYyNCw3IEBACiAJCQkJZ290byBvdXQ7CiAKIAkJCXNiID0gbmQucGF0aC5kZW50cnktPmRfc2I7Ci0JCQlwYXJhbS0+YXJnMSA9IG5ld19lbmNvZGVfZGV2KHNiLT5zX2Rldik7CisJCQlkZXZpZCA9IG5ld19lbmNvZGVfZGV2KHNiLT5zX2Rldik7CiAJCX0gZWxzZSB7CiAJCQlzdHJ1Y3QgYXV0b2ZzX2luZm8gKmlubzsKIApAQCAtNjM1LDM4ICs2MzcsNDEgQEAKIAkJCQlnb3RvIG91dF9yZWxlYXNlOwogCiAJCQlpbm8gPSBhdXRvZnM0X2RlbnRyeV9pbm8obmQucGF0aC5kZW50cnkpOwotCQkJcGFyYW0tPmFyZzEgPSBhdXRvZnM0X2dldF9kZXYoaW5vLT5zYmkpOworCQkJZGV2aWQgPSBhdXRvZnM0X2dldF9kZXYoaW5vLT5zYmkpOwogCQl9CiAKIAkJZXJyID0gMDsKIAkJaWYgKG5kLnBhdGguZGVudHJ5LT5kX2lub2RlICYmCiAJCSAgICBuZC5wYXRoLm1udC0+bW50X3Jvb3QgPT0gbmQucGF0aC5kZW50cnkpIHsKIAkJCWVyciA9IDE7Ci0JCQlwYXJhbS0+YXJnMiA9IG5kLnBhdGguZGVudHJ5LT5kX2lub2RlLT5pX3NiLT5zX21hZ2ljOworCQkJbWFnaWMgPSBuZC5wYXRoLmRlbnRyeS0+ZF9pbm9kZS0+aV9zYi0+c19tYWdpYzsKIAkJfQogCX0gZWxzZSB7Ci0JCWRldl90IGRldmlkID0gbmV3X2VuY29kZV9kZXYoc2JpLT5zYi0+c19kZXYpOworCQlkZXZfdCBkZXYgPSBhdXRvZnM0X2dldF9kZXYoc2JpKTsKIAogCQllcnIgPSBwYXRoX2xvb2t1cChwYXRoLCBMT09LVVBfUEFSRU5ULCAmbmQpOwogCQlpZiAoZXJyKQogCQkJZ290byBvdXQ7CiAKLQkJZXJyID0gYXV0b2ZzX2Rldl9pb2N0bF9maW5kX3N1cGVyKCZuZCwgZGV2aWQpOworCQllcnIgPSBhdXRvZnNfZGV2X2lvY3RsX2ZpbmRfc3VwZXIoJm5kLCBkZXYpOwogCQlpZiAoZXJyKQogCQkJZ290byBvdXRfcmVsZWFzZTsKIAotCQlwYXJhbS0+YXJnMSA9IGF1dG9mczRfZ2V0X2RldihzYmkpOworCQlkZXZpZCA9IGRldjsKIAogCQllcnIgPSBoYXZlX3N1Ym1vdW50cyhuZC5wYXRoLmRlbnRyeSk7CiAKIAkJaWYgKG5kLnBhdGgubW50LT5tbnRfbW91bnRwb2ludCAhPSBuZC5wYXRoLm1udC0+bW50X3Jvb3QpIHsKIAkJCWlmIChmb2xsb3dfZG93bigmbmQucGF0aC5tbnQsICZuZC5wYXRoLmRlbnRyeSkpIHsKIAkJCQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gbmQucGF0aC5kZW50cnktPmRfaW5vZGU7Ci0JCQkJcGFyYW0tPmFyZzIgPSBpbm9kZS0+aV9zYi0+c19tYWdpYzsKKwkJCQltYWdpYyA9IGlub2RlLT5pX3NiLT5zX21hZ2ljOwogCQkJfQogCQl9CiAJfQogCisJcGFyYW0tPmlzbW91bnRwb2ludC5vdXQuZGV2aWQgPSBkZXZpZDsKKwlwYXJhbS0+aXNtb3VudHBvaW50Lm91dC5tYWdpYyA9IG1hZ2ljOworCiBvdXRfcmVsZWFzZToKIAlwYXRoX3B1dCgmbmQucGF0aCk7CiBvdXQ6CmRpZmYgLS1naXQgYS9mcy9hdXRvZnM0L2V4cGlyZS5jIGIvZnMvYXV0b2ZzNC9leHBpcmUuYwppbmRleCA0YjZmYjNmLi5lM2JkNTA3IDEwMDY0NAotLS0gYS9mcy9hdXRvZnM0L2V4cGlyZS5jCisrKyBiL2ZzL2F1dG9mczQvZXhwaXJlLmMKQEAgLTYzLDcgKzYzLDcgQEAKIAkJc3RydWN0IGF1dG9mc19zYl9pbmZvICpzYmkgPSBhdXRvZnM0X3NiaShkZW50cnktPmRfc2IpOwogCiAJCS8qIFRoaXMgaXMgYW4gYXV0b2ZzIHN1Ym1vdW50LCB3ZSBjYW4ndCBleHBpcmUgaXQgKi8KLQkJaWYgKHNiaS0+dHlwZSA9PSBBVVRPRlNfVFlQRV9JTkRJUkVDVCkKKwkJaWYgKGF1dG9mc190eXBlX2luZGlyZWN0KHNiaS0+dHlwZSkpCiAJCQlnb3RvIGRvbmU7CiAKIAkJLyoKQEAgLTQ5MCw3ICs0OTAsNyBAQAogCWlmIChhcmcgJiYgZ2V0X3VzZXIoZG9fbm93LCBhcmcpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAotCWlmIChzYmktPnR5cGUgJiBBVVRPRlNfVFlQRV9UUklHR0VSKQorCWlmIChhdXRvZnNfdHlwZV90cmlnZ2VyKHNiaS0+dHlwZSkpCiAJCWRlbnRyeSA9IGF1dG9mczRfZXhwaXJlX2RpcmVjdChzYiwgbW50LCBzYmksIGRvX25vdyk7CiAJZWxzZQogCQlkZW50cnkgPSBhdXRvZnM0X2V4cGlyZV9pbmRpcmVjdChzYiwgbW50LCBzYmksIGRvX25vdyk7CmRpZmYgLS1naXQgYS9mcy9hdXRvZnM0L2lub2RlLmMgYi9mcy9hdXRvZnM0L2lub2RlLmMKaW5kZXggN2IxOTgwMi4uNzE2ZTEyYiAxMDA2NDQKLS0tIGEvZnMvYXV0b2ZzNC9pbm9kZS5jCisrKyBiL2ZzL2F1dG9mczQvaW5vZGUuYwpAQCAtMTk3LDkgKzE5Nyw5IEBACiAJc2VxX3ByaW50ZihtLCAiLG1pbnByb3RvPSVkIiwgc2JpLT5taW5fcHJvdG8pOwogCXNlcV9wcmludGYobSwgIixtYXhwcm90bz0lZCIsIHNiaS0+bWF4X3Byb3RvKTsKIAotCWlmIChzYmktPnR5cGUgJiBBVVRPRlNfVFlQRV9PRkZTRVQpCisJaWYgKGF1dG9mc190eXBlX29mZnNldChzYmktPnR5cGUpKQogCQlzZXFfcHJpbnRmKG0sICIsb2Zmc2V0Iik7Ci0JZWxzZSBpZiAoc2JpLT50eXBlICYgQVVUT0ZTX1RZUEVfRElSRUNUKQorCWVsc2UgaWYgKGF1dG9mc190eXBlX2RpcmVjdChzYmktPnR5cGUpKQogCQlzZXFfcHJpbnRmKG0sICIsZGlyZWN0Iik7CiAJZWxzZQogCQlzZXFfcHJpbnRmKG0sICIsaW5kaXJlY3QiKTsKQEAgLTI4NCwxMyArMjg0LDEzIEBACiAJCQkqbWF4cHJvdG8gPSBvcHRpb247CiAJCQlicmVhazsKIAkJY2FzZSBPcHRfaW5kaXJlY3Q6Ci0JCQkqdHlwZSA9IEFVVE9GU19UWVBFX0lORElSRUNUOworCQkJc2V0X2F1dG9mc190eXBlX2luZGlyZWN0KHR5cGUpOwogCQkJYnJlYWs7CiAJCWNhc2UgT3B0X2RpcmVjdDoKLQkJCSp0eXBlID0gQVVUT0ZTX1RZUEVfRElSRUNUOworCQkJc2V0X2F1dG9mc190eXBlX2RpcmVjdCh0eXBlKTsKIAkJCWJyZWFrOwogCQljYXNlIE9wdF9vZmZzZXQ6Ci0JCQkqdHlwZSA9IEFVVE9GU19UWVBFX09GRlNFVDsKKwkJCXNldF9hdXRvZnNfdHlwZV9vZmZzZXQodHlwZSk7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCXJldHVybiAxOwpAQCAtMzM4LDcgKzMzOCw3IEBACiAJc2JpLT5zYiA9IHM7CiAJc2JpLT52ZXJzaW9uID0gMDsKIAlzYmktPnN1Yl92ZXJzaW9uID0gMDsKLQlzYmktPnR5cGUgPSBBVVRPRlNfVFlQRV9JTkRJUkVDVDsKKwlzZXRfYXV0b2ZzX3R5cGVfaW5kaXJlY3QoJnNiaS0+dHlwZSk7CiAJc2JpLT5taW5fcHJvdG8gPSAwOwogCXNiaS0+bWF4X3Byb3RvID0gMDsKIAltdXRleF9pbml0KCZzYmktPndxX211dGV4KTsKQEAgLTM4MCw3ICszODAsNyBAQAogCX0KIAogCXJvb3RfaW5vZGUtPmlfZm9wID0gJmF1dG9mczRfcm9vdF9vcGVyYXRpb25zOwotCXJvb3RfaW5vZGUtPmlfb3AgPSBzYmktPnR5cGUgJiBBVVRPRlNfVFlQRV9UUklHR0VSID8KKwlyb290X2lub2RlLT5pX29wID0gYXV0b2ZzX3R5cGVfdHJpZ2dlcihzYmktPnR5cGUpID8KIAkJCSZhdXRvZnM0X2RpcmVjdF9yb290X2lub2RlX29wZXJhdGlvbnMgOgogCQkJJmF1dG9mczRfaW5kaXJlY3Rfcm9vdF9pbm9kZV9vcGVyYXRpb25zOwogCkBAIC00NTUsMTEgKzQ1NSw3IEBACiAJaWYgKHNiLT5zX3Jvb3QpIHsKIAkJaW5vZGUtPmlfdWlkID0gc2ItPnNfcm9vdC0+ZF9pbm9kZS0+aV91aWQ7CiAJCWlub2RlLT5pX2dpZCA9IHNiLT5zX3Jvb3QtPmRfaW5vZGUtPmlfZ2lkOwotCX0gZWxzZSB7Ci0JCWlub2RlLT5pX3VpZCA9IDA7Ci0JCWlub2RlLT5pX2dpZCA9IDA7CiAJfQotCWlub2RlLT5pX2Jsb2NrcyA9IDA7CiAJaW5vZGUtPmlfYXRpbWUgPSBpbm9kZS0+aV9tdGltZSA9IGlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FOwogCiAJaWYgKFNfSVNESVIoaW5mLT5tb2RlKSkgewpkaWZmIC0tZ2l0IGEvZnMvYXV0b2ZzNC93YWl0cS5jIGIvZnMvYXV0b2ZzNC93YWl0cS5jCmluZGV4IGUwMmNjOGEuLmVlYjI0NjggMTAwNjQ0Ci0tLSBhL2ZzL2F1dG9mczQvd2FpdHEuYworKysgYi9mcy9hdXRvZnM0L3dhaXRxLmMKQEAgLTMzNyw3ICszMzcsNyBAQAogCQkgKiBpcyB2ZXJ5IHNpbWlsYXIgZm9yIGluZGlyZWN0IG1vdW50cyBleGNlcHQgb25seSBkZW50cnlzCiAJCSAqIGluIHRoZSByb290IG9mIHRoZSBhdXRvZnMgZmlsZSBzeXN0ZW0gbWF5IGJlIG5lZ2F0aXZlLgogCQkgKi8KLQkJaWYgKHNiaS0+dHlwZSAmIEFVVE9GU19UWVBFX1RSSUdHRVIpCisJCWlmIChhdXRvZnNfdHlwZV90cmlnZ2VyKHNiaS0+dHlwZSkpCiAJCQlyZXR1cm4gLUVOT0VOVDsKIAkJZWxzZSBpZiAoIUlTX1JPT1QoZGVudHJ5LT5kX3BhcmVudCkpCiAJCQlyZXR1cm4gLUVOT0VOVDsKQEAgLTM0OCw3ICszNDgsNyBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAogCS8qIElmIHRoaXMgaXMgYSBkaXJlY3QgbW91bnQgcmVxdWVzdCBjcmVhdGUgYSBkdW1teSBuYW1lICovCi0JaWYgKElTX1JPT1QoZGVudHJ5KSAmJiBzYmktPnR5cGUgJiBBVVRPRlNfVFlQRV9UUklHR0VSKQorCWlmIChJU19ST09UKGRlbnRyeSkgJiYgYXV0b2ZzX3R5cGVfdHJpZ2dlcihzYmktPnR5cGUpKQogCQlxc3RyLmxlbiA9IHNwcmludGYobmFtZSwgIiVwIiwgZGVudHJ5KTsKIAllbHNlIHsKIAkJcXN0ci5sZW4gPSBhdXRvZnM0X2dldHBhdGgoc2JpLCBkZW50cnksICZuYW1lKTsKQEAgLTQwNiwxMSArNDA2LDExIEBACiAJCQkJdHlwZSA9IGF1dG9mc19wdHlwZV9leHBpcmVfbXVsdGk7CiAJCX0gZWxzZSB7CiAJCQlpZiAobm90aWZ5ID09IE5GWV9NT1VOVCkKLQkJCQl0eXBlID0gKHNiaS0+dHlwZSAmIEFVVE9GU19UWVBFX1RSSUdHRVIpID8KKwkJCQl0eXBlID0gYXV0b2ZzX3R5cGVfdHJpZ2dlcihzYmktPnR5cGUpID8KIAkJCQkJYXV0b2ZzX3B0eXBlX21pc3NpbmdfZGlyZWN0IDoKIAkJCQkJIGF1dG9mc19wdHlwZV9taXNzaW5nX2luZGlyZWN0OwogCQkJZWxzZQotCQkJCXR5cGUgPSAoc2JpLT50eXBlICYgQVVUT0ZTX1RZUEVfVFJJR0dFUikgPworCQkJCXR5cGUgPSBhdXRvZnNfdHlwZV90cmlnZ2VyKHNiaS0+dHlwZSkgPwogCQkJCQlhdXRvZnNfcHR5cGVfZXhwaXJlX2RpcmVjdCA6CiAJCQkJCWF1dG9mc19wdHlwZV9leHBpcmVfaW5kaXJlY3Q7CiAJCX0KZGlmZiAtLWdpdCBhL2ZzL2Jmcy9pbm9kZS5jIGIvZnMvYmZzL2lub2RlLmMKaW5kZXggMGVkNTdiNS4uY2M0MDYyZCAxMDA2NDQKLS0tIGEvZnMvYmZzL2lub2RlLmMKKysrIGIvZnMvYmZzL2lub2RlLmMKQEAgLTIxMyw2ICsyMTMsOSBAQAogewogCXN0cnVjdCBiZnNfc2JfaW5mbyAqaW5mbyA9IEJGU19TQihzKTsKIAorCWlmICghaW5mbykKKwkJcmV0dXJuOworCiAJYnJlbHNlKGluZm8tPnNpX3NiaCk7CiAJbXV0ZXhfZGVzdHJveSgmaW5mby0+YmZzX2xvY2spOwogCWtmcmVlKGluZm8tPnNpX2ltYXApOwpAQCAtMzI3LDYgKzMzMCw3IEBACiAJdW5zaWduZWQgaSwgaW1hcF9sZW47CiAJc3RydWN0IGJmc19zYl9pbmZvICppbmZvOwogCWxvbmcgcmV0ID0gLUVJTlZBTDsKKwl1bnNpZ25lZCBsb25nIGlfc2Jsb2NrLCBpX2VibG9jaywgaV9lb2ZmLCBzX3NpemU7CiAKIAlpbmZvID0ga3phbGxvYyhzaXplb2YoKmluZm8pLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWluZm8pCkBAIC0zNTAsNiArMzU0LDEyIEBACiAKIAlzLT5zX21hZ2ljID0gQkZTX01BR0lDOwogCWluZm8tPnNpX3NiaCA9IGJoOworCisJaWYgKGxlMzJfdG9fY3B1KGJmc19zYi0+c19zdGFydCkgPiBsZTMyX3RvX2NwdShiZnNfc2ItPnNfZW5kKSkgeworCQlwcmludGYoIlN1cGVyYmxvY2sgaXMgY29ycnVwdGVkXG4iKTsKKwkJZ290byBvdXQ7CisJfQorCiAJaW5mby0+c2lfbGFzdGkgPSAobGUzMl90b19jcHUoYmZzX3NiLT5zX3N0YXJ0KSAtIEJGU19CU0laRSkgLwogCQkJCQlzaXplb2Yoc3RydWN0IGJmc19pbm9kZSkKIAkJCQkJKyBCRlNfUk9PVF9JTk8gLSAxOwpAQCAtMzgwLDYgKzM5MCwxOCBAQAogCQkJLSBsZTMyX3RvX2NwdShiZnNfc2ItPnNfc3RhcnQpKSA+PiBCRlNfQlNJWkVfQklUUzsKIAlpbmZvLT5zaV9mcmVlaSA9IDA7CiAJaW5mby0+c2lfbGZfZWJsayA9IDA7CisKKwkvKiBjYW4gd2UgcmVhZCB0aGUgbGFzdCBibG9jaz8gKi8KKwliaCA9IHNiX2JyZWFkKHMsIGluZm8tPnNpX2Jsb2NrcyAtIDEpOworCWlmICghYmgpIHsKKwkJcHJpbnRmKCJMYXN0IGJsb2NrIG5vdCBhdmFpbGFibGU6ICVsdVxuIiwgaW5mby0+c2lfYmxvY2tzIC0gMSk7CisJCWlwdXQoaW5vZGUpOworCQlyZXQgPSAtRUlPOworCQlrZnJlZShpbmZvLT5zaV9pbWFwKTsKKwkJZ290byBvdXQ7CisJfQorCWJyZWxzZShiaCk7CisKIAliaCA9IE5VTEw7CiAJZm9yIChpID0gQkZTX1JPT1RfSU5POyBpIDw9IGluZm8tPnNpX2xhc3RpOyBpKyspIHsKIAkJc3RydWN0IGJmc19pbm9kZSAqZGk7CkBAIC0zOTcsNiArNDE5LDI5IEBACiAKIAkJZGkgPSAoc3RydWN0IGJmc19pbm9kZSAqKWJoLT5iX2RhdGEgKyBvZmY7CiAKKwkJLyogdGVzdCBpZiBmaWxlc3lzdGVtIGlzIG5vdCBjb3JydXB0ZWQgKi8KKworCQlpX2VvZmYgPSBsZTMyX3RvX2NwdShkaS0+aV9lb2Zmc2V0KTsKKwkJaV9zYmxvY2sgPSBsZTMyX3RvX2NwdShkaS0+aV9zYmxvY2spOworCQlpX2VibG9jayA9IGxlMzJfdG9fY3B1KGRpLT5pX2VibG9jayk7CisJCXNfc2l6ZSA9IGxlMzJfdG9fY3B1KGJmc19zYi0+c19lbmQpOworCisJCWlmIChpX3NibG9jayA+IGluZm8tPnNpX2Jsb2NrcyB8fAorCQkJaV9lYmxvY2sgPiBpbmZvLT5zaV9ibG9ja3MgfHwKKwkJCWlfc2Jsb2NrID4gaV9lYmxvY2sgfHwKKwkJCWlfZW9mZiA+IHNfc2l6ZSB8fAorCQkJaV9zYmxvY2sgKiBCRlNfQlNJWkUgPiBpX2VvZmYpIHsKKworCQkJcHJpbnRmKCJJbm9kZSAweCUwOHggY29ycnVwdGVkXG4iLCBpKTsKKworCQkJYnJlbHNlKGJoKTsKKwkJCXMtPnNfcm9vdCA9IE5VTEw7CisJCQlrZnJlZShpbmZvLT5zaV9pbWFwKTsKKwkJCWtmcmVlKGluZm8pOworCQkJcy0+c19mc19pbmZvID0gTlVMTDsKKwkJCXJldHVybiAtRUlPOworCQl9CisKIAkJaWYgKCFkaS0+aV9pbm8pIHsKIAkJCWluZm8tPnNpX2ZyZWVpKys7CiAJCQljb250aW51ZTsKZGlmZiAtLWdpdCBhL2ZzL2JpbmZtdF9lbGYuYyBiL2ZzL2JpbmZtdF9lbGYuYwppbmRleCBjNDFmYTJhLi5lM2ZmMmI5IDEwMDY0NAotLS0gYS9mcy9iaW5mbXRfZWxmLmMKKysrIGIvZnMvYmluZm10X2VsZi5jCkBAIC0xNTIsOCArMTUyLDEwIEBACiAJZWxmX2FkZHJfdCBfX3VzZXIgKnNwOwogCWVsZl9hZGRyX3QgX191c2VyICp1X3BsYXRmb3JtOwogCWVsZl9hZGRyX3QgX191c2VyICp1X2Jhc2VfcGxhdGZvcm07CisJZWxmX2FkZHJfdCBfX3VzZXIgKnVfcmFuZF9ieXRlczsKIAljb25zdCBjaGFyICprX3BsYXRmb3JtID0gRUxGX1BMQVRGT1JNOwogCWNvbnN0IGNoYXIgKmtfYmFzZV9wbGF0Zm9ybSA9IEVMRl9CQVNFX1BMQVRGT1JNOworCXVuc2lnbmVkIGNoYXIga19yYW5kX2J5dGVzWzE2XTsKIAlpbnQgaXRlbXM7CiAJZWxmX2FkZHJfdCAqZWxmX2luZm87CiAJaW50IGVpX2luZGV4ID0gMDsKQEAgLTE5Niw2ICsxOTgsMTUgQEAKIAkJCXJldHVybiAtRUZBVUxUOwogCX0KIAorCS8qCisJICogR2VuZXJhdGUgMTYgcmFuZG9tIGJ5dGVzIGZvciB1c2Vyc3BhY2UgUFJORyBzZWVkaW5nLgorCSAqLworCWdldF9yYW5kb21fYnl0ZXMoa19yYW5kX2J5dGVzLCBzaXplb2Yoa19yYW5kX2J5dGVzKSk7CisJdV9yYW5kX2J5dGVzID0gKGVsZl9hZGRyX3QgX191c2VyICopCisJCSAgICAgICBTVEFDS19BTExPQyhwLCBzaXplb2Yoa19yYW5kX2J5dGVzKSk7CisJaWYgKF9fY29weV90b191c2VyKHVfcmFuZF9ieXRlcywga19yYW5kX2J5dGVzLCBzaXplb2Yoa19yYW5kX2J5dGVzKSkpCisJCXJldHVybiAtRUZBVUxUOworCiAJLyogQ3JlYXRlIHRoZSBFTEYgaW50ZXJwcmV0ZXIgaW5mbyAqLwogCWVsZl9pbmZvID0gKGVsZl9hZGRyX3QgKiljdXJyZW50LT5tbS0+c2F2ZWRfYXV4djsKIAkvKiB1cGRhdGUgQVRfVkVDVE9SX1NJWkVfQkFTRSBpZiB0aGUgbnVtYmVyIG9mIE5FV19BVVhfRU5UKCkgY2hhbmdlcyAqLwpAQCAtMjI4LDYgKzIzOSw3IEBACiAJTkVXX0FVWF9FTlQoQVRfR0lELCBjcmVkLT5naWQpOwogCU5FV19BVVhfRU5UKEFUX0VHSUQsIGNyZWQtPmVnaWQpOwogIAlORVdfQVVYX0VOVChBVF9TRUNVUkUsIHNlY3VyaXR5X2Jwcm1fc2VjdXJlZXhlYyhicHJtKSk7CisJTkVXX0FVWF9FTlQoQVRfUkFORE9NLCAoZWxmX2FkZHJfdCkodW5zaWduZWQgbG9uZyl1X3JhbmRfYnl0ZXMpOwogCU5FV19BVVhfRU5UKEFUX0VYRUNGTiwgYnBybS0+ZXhlYyk7CiAJaWYgKGtfcGxhdGZvcm0pIHsKIAkJTkVXX0FVWF9FTlQoQVRfUExBVEZPUk0sCmRpZmYgLS1naXQgYS9mcy9iaW5mbXRfbWlzYy5jIGIvZnMvYmluZm10X21pc2MuYwppbmRleCBmMjc0NGFiLi5jNGU4MzUzIDEwMDY0NAotLS0gYS9mcy9iaW5mbXRfbWlzYy5jCisrKyBiL2ZzL2JpbmZtdF9taXNjLmMKQEAgLTQ5Niw5ICs0OTYsNiBAQAogCiAJaWYgKGlub2RlKSB7CiAJCWlub2RlLT5pX21vZGUgPSBtb2RlOwotCQlpbm9kZS0+aV91aWQgPSAwOwotCQlpbm9kZS0+aV9naWQgPSAwOwotCQlpbm9kZS0+aV9ibG9ja3MgPSAwOwogCQlpbm9kZS0+aV9hdGltZSA9IGlub2RlLT5pX210aW1lID0gaW5vZGUtPmlfY3RpbWUgPQogCQkJY3VycmVudF9mc190aW1lKGlub2RlLT5pX3NiKTsKIAl9CkBAIC02NTIsNyArNjQ5LDcgQEAKIHN0YXRpYyBzc2l6ZV90CiBibV9zdGF0dXNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IG5ieXRlcywgbG9mZl90ICpwcG9zKQogewotCWNoYXIgKnMgPSBlbmFibGVkID8gImVuYWJsZWQiIDogImRpc2FibGVkIjsKKwljaGFyICpzID0gZW5hYmxlZCA/ICJlbmFibGVkXG4iIDogImRpc2FibGVkXG4iOwogCiAJcmV0dXJuIHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKGJ1ZiwgbmJ5dGVzLCBwcG9zLCBzLCBzdHJsZW4ocykpOwogfQpkaWZmIC0tZ2l0IGEvZnMvYmlvLmMgYi9mcy9iaW8uYwppbmRleCA3MTFjZWUxLi4wNjIyOTlhIDEwMDY0NAotLS0gYS9mcy9iaW8uYworKysgYi9mcy9iaW8uYwpAQCAtNzg4LDYgKzc4OCw3IEBACiAJaW50IGksIHJldDsKIAlpbnQgbnJfcGFnZXMgPSAwOwogCXVuc2lnbmVkIGludCBsZW4gPSAwOworCXVuc2lnbmVkIGludCBvZmZzZXQgPSBtYXBfZGF0YSA/IG1hcF9kYXRhLT5vZmZzZXQgJiB+UEFHRV9NQVNLIDogMDsKIAogCWZvciAoaSA9IDA7IGkgPCBpb3ZfY291bnQ7IGkrKykgewogCQl1bnNpZ25lZCBsb25nIHVhZGRyOwpAQCAtODE0LDM1ICs4MTUsNDIgQEAKIAliaW8tPmJpX3J3IHw9ICghd3JpdGVfdG9fdm0gPDwgQklPX1JXKTsKIAogCXJldCA9IDA7Ci0JaSA9IDA7Ci0Jd2hpbGUgKGxlbikgewotCQl1bnNpZ25lZCBpbnQgYnl0ZXM7CiAKLQkJaWYgKG1hcF9kYXRhKQotCQkJYnl0ZXMgPSAxVSA8PCAoUEFHRV9TSElGVCArIG1hcF9kYXRhLT5wYWdlX29yZGVyKTsKLQkJZWxzZQotCQkJYnl0ZXMgPSBQQUdFX1NJWkU7CisJaWYgKG1hcF9kYXRhKSB7CisJCW5yX3BhZ2VzID0gMSA8PCBtYXBfZGF0YS0+cGFnZV9vcmRlcjsKKwkJaSA9IG1hcF9kYXRhLT5vZmZzZXQgLyBQQUdFX1NJWkU7CisJfQorCXdoaWxlIChsZW4pIHsKKwkJdW5zaWduZWQgaW50IGJ5dGVzID0gUEFHRV9TSVpFOworCisJCWJ5dGVzIC09IG9mZnNldDsKIAogCQlpZiAoYnl0ZXMgPiBsZW4pCiAJCQlieXRlcyA9IGxlbjsKIAogCQlpZiAobWFwX2RhdGEpIHsKLQkJCWlmIChpID09IG1hcF9kYXRhLT5ucl9lbnRyaWVzKSB7CisJCQlpZiAoaSA9PSBtYXBfZGF0YS0+bnJfZW50cmllcyAqIG5yX3BhZ2VzKSB7CiAJCQkJcmV0ID0gLUVOT01FTTsKIAkJCQlicmVhazsKIAkJCX0KLQkJCXBhZ2UgPSBtYXBfZGF0YS0+cGFnZXNbaSsrXTsKLQkJfSBlbHNlCisKKwkJCXBhZ2UgPSBtYXBfZGF0YS0+cGFnZXNbaSAvIG5yX3BhZ2VzXTsKKwkJCXBhZ2UgKz0gKGkgJSBucl9wYWdlcyk7CisKKwkJCWkrKzsKKwkJfSBlbHNlIHsKIAkJCXBhZ2UgPSBhbGxvY19wYWdlKHEtPmJvdW5jZV9nZnAgfCBnZnBfbWFzayk7Ci0JCWlmICghcGFnZSkgewotCQkJcmV0ID0gLUVOT01FTTsKLQkJCWJyZWFrOworCQkJaWYgKCFwYWdlKSB7CisJCQkJcmV0ID0gLUVOT01FTTsKKwkJCQlicmVhazsKKwkJCX0KIAkJfQogCi0JCWlmIChiaW9fYWRkX3BjX3BhZ2UocSwgYmlvLCBwYWdlLCBieXRlcywgMCkgPCBieXRlcykKKwkJaWYgKGJpb19hZGRfcGNfcGFnZShxLCBiaW8sIHBhZ2UsIGJ5dGVzLCBvZmZzZXQpIDwgYnl0ZXMpCiAJCQlicmVhazsKIAogCQlsZW4gLT0gYnl0ZXM7CisJCW9mZnNldCA9IDA7CiAJfQogCiAJaWYgKHJldCkKQEAgLTg1MSw3ICs4NTksNyBAQAogCS8qCiAJICogc3VjY2VzcwogCSAqLwotCWlmICghd3JpdGVfdG9fdm0pIHsKKwlpZiAoIXdyaXRlX3RvX3ZtICYmICghbWFwX2RhdGEgfHwgIW1hcF9kYXRhLT5udWxsX21hcHBlZCkpIHsKIAkJcmV0ID0gX19iaW9fY29weV9pb3YoYmlvLCBiaW8tPmJpX2lvX3ZlYywgaW92LCBpb3ZfY291bnQsIDAsIDApOwogCQlpZiAocmV0KQogCQkJZ290byBjbGVhbnVwOwpkaWZmIC0tZ2l0IGEvZnMvYmxvY2tfZGV2LmMgYi9mcy9ibG9ja19kZXYuYwppbmRleCAzNDlhMjZjLi5hYzcwMzFmIDEwMDY0NAotLS0gYS9mcy9ibG9ja19kZXYuYworKysgYi9mcy9ibG9ja19kZXYuYwpAQCAtMTAwNSw2ICsxMDA1LDcgQEAKIAl9CiAKIAlsb2NrX2tlcm5lbCgpOworIHJlc3RhcnQ6CiAKIAlyZXQgPSAtRU5YSU87CiAJZGlzayA9IGdldF9nZW5kaXNrKGJkZXYtPmJkX2RldiwgJnBhcnRubyk7CkBAIC0xMDI1LDYgKzEwMjYsMTkgQEAKIAogCQkJaWYgKGRpc2stPmZvcHMtPm9wZW4pIHsKIAkJCQlyZXQgPSBkaXNrLT5mb3BzLT5vcGVuKGJkZXYsIG1vZGUpOworCQkJCWlmIChyZXQgPT0gLUVSRVNUQVJUU1lTKSB7CisJCQkJCS8qIExvc3QgYSByYWNlIHdpdGggJ2Rpc2snIGJlaW5nCisJCQkJCSAqIGRlbGV0ZWQsIHRyeSBhZ2Fpbi4KKwkJCQkJICogU2VlIG1kLmMKKwkJCQkJICovCisJCQkJCWRpc2tfcHV0X3BhcnQoYmRldi0+YmRfcGFydCk7CisJCQkJCWJkZXYtPmJkX3BhcnQgPSBOVUxMOworCQkJCQltb2R1bGVfcHV0KGRpc2stPmZvcHMtPm93bmVyKTsKKwkJCQkJcHV0X2Rpc2soZGlzayk7CisJCQkJCWJkZXYtPmJkX2Rpc2sgPSBOVUxMOworCQkJCQltdXRleF91bmxvY2soJmJkZXYtPmJkX211dGV4KTsKKwkJCQkJZ290byByZXN0YXJ0OworCQkJCX0KIAkJCQlpZiAocmV0KQogCQkJCQlnb3RvIG91dF9jbGVhcjsKIAkJCX0KQEAgLTEyMjAsNiArMTIzNCwyMCBAQAogCXJldHVybiBibGtkZXZfaW9jdGwoYmRldiwgbW9kZSwgY21kLCBhcmcpOwogfQogCisvKgorICogVHJ5IHRvIHJlbGVhc2UgYSBwYWdlIGFzc29jaWF0ZWQgd2l0aCBibG9jayBkZXZpY2Ugd2hlbiB0aGUgc3lzdGVtCisgKiBpcyB1bmRlciBtZW1vcnkgcHJlc3N1cmUuCisgKi8KK3N0YXRpYyBpbnQgYmxrZGV2X3JlbGVhc2VwYWdlKHN0cnVjdCBwYWdlICpwYWdlLCBnZnBfdCB3YWl0KQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc3VwZXIgPSBCREVWX0kocGFnZS0+bWFwcGluZy0+aG9zdCktPmJkZXYuYmRfc3VwZXI7CisKKwlpZiAoc3VwZXIgJiYgc3VwZXItPnNfb3AtPmJkZXZfdHJ5X3RvX2ZyZWVfcGFnZSkKKwkJcmV0dXJuIHN1cGVyLT5zX29wLT5iZGV2X3RyeV90b19mcmVlX3BhZ2Uoc3VwZXIsIHBhZ2UsIHdhaXQpOworCisJcmV0dXJuIHRyeV90b19mcmVlX2J1ZmZlcnMocGFnZSk7Cit9CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zIGRlZl9ibGtfYW9wcyA9IHsKIAkucmVhZHBhZ2UJPSBibGtkZXZfcmVhZHBhZ2UsCiAJLndyaXRlcGFnZQk9IGJsa2Rldl93cml0ZXBhZ2UsCkBAIC0xMjI3LDYgKzEyNTUsNyBAQAogCS53cml0ZV9iZWdpbgk9IGJsa2Rldl93cml0ZV9iZWdpbiwKIAkud3JpdGVfZW5kCT0gYmxrZGV2X3dyaXRlX2VuZCwKIAkud3JpdGVwYWdlcwk9IGdlbmVyaWNfd3JpdGVwYWdlcywKKwkucmVsZWFzZXBhZ2UJPSBibGtkZXZfcmVsZWFzZXBhZ2UsCiAJLmRpcmVjdF9JTwk9IGJsa2Rldl9kaXJlY3RfSU8sCiB9OwogCkBAIC0xMjYyLDcgKzEyOTEsNyBAQAogCiAvKioKICAqIGxvb2t1cF9iZGV2ICAtIGxvb2t1cCBhIHN0cnVjdCBibG9ja19kZXZpY2UgYnkgbmFtZQotICogQHBhdGg6CXNwZWNpYWwgZmlsZSByZXByZXNlbnRpbmcgdGhlIGJsb2NrIGRldmljZQorICogQHBhdGhuYW1lOglzcGVjaWFsIGZpbGUgcmVwcmVzZW50aW5nIHRoZSBibG9jayBkZXZpY2UKICAqCiAgKiBHZXQgYSByZWZlcmVuY2UgdG8gdGhlIGJsb2NrZGV2aWNlIGF0IEBwYXRobmFtZSBpbiB0aGUgY3VycmVudAogICogbmFtZXNwYWNlIGlmIHBvc3NpYmxlIGFuZCByZXR1cm4gaXQuICBSZXR1cm4gRVJSX1BUUihlcnJvcikKZGlmZiAtLWdpdCBhL2ZzL2J1ZmZlci5jIGIvZnMvYnVmZmVyLmMKaW5kZXggYTEzZjA5Yi4uYzI2ZGE3OCAxMDA2NDQKLS0tIGEvZnMvYnVmZmVyLmMKKysrIGIvZnMvYnVmZmVyLmMKQEAgLTIwMjIsNyArMjAyMiw2IEBACiAJCQlpZiAocG9zICsgbGVuID4gaW5vZGUtPmlfc2l6ZSkKIAkJCQl2bXRydW5jYXRlKGlub2RlLCBpbm9kZS0+aV9zaXplKTsKIAkJfQotCQlnb3RvIG91dDsKIAl9CiAKIG91dDoKZGlmZiAtLWdpdCBhL2ZzL2NoYXJfZGV2LmMgYi9mcy9jaGFyX2Rldi5jCmluZGV4IDcwMDY5N2EuLjM4ZjcxMjIgMTAwNjQ0Ci0tLSBhL2ZzL2NoYXJfZGV2LmMKKysrIGIvZnMvY2hhcl9kZXYuYwpAQCAtMTIwLDcgKzEyMCw3IEBACiAJY2QtPm1ham9yID0gbWFqb3I7CiAJY2QtPmJhc2VtaW5vciA9IGJhc2VtaW5vcjsKIAljZC0+bWlub3JjdCA9IG1pbm9yY3Q7Ci0Jc3RybmNweShjZC0+bmFtZSxuYW1lLCA2NCk7CisJc3RybGNweShjZC0+bmFtZSwgbmFtZSwgc2l6ZW9mKGNkLT5uYW1lKSk7CiAKIAlpID0gbWFqb3JfdG9faW5kZXgobWFqb3IpOwogCmRpZmYgLS1naXQgYS9mcy9jaWZzL2lub2RlLmMgYi9mcy9jaWZzL2lub2RlLmMKaW5kZXggZjI0N2RhOS4uNWFiOTg5NiAxMDA2NDQKLS0tIGEvZnMvY2lmcy9pbm9kZS5jCisrKyBiL2ZzL2NpZnMvaW5vZGUuYwpAQCAtMTY0MSw3ICsxNjQxLDcgQEAKIAlpX3NpemVfd3JpdGUoaW5vZGUsIG9mZnNldCk7CiAJc3Bpbl91bmxvY2soJmlub2RlLT5pX2xvY2spOwogb3V0X3RydW5jYXRlOgotCWlmIChpbm9kZS0+aV9vcCAmJiBpbm9kZS0+aV9vcC0+dHJ1bmNhdGUpCisJaWYgKGlub2RlLT5pX29wLT50cnVuY2F0ZSkKIAkJaW5vZGUtPmlfb3AtPnRydW5jYXRlKGlub2RlKTsKIAlyZXR1cm4gMDsKIG91dF9zaWc6CmRpZmYgLS1naXQgYS9mcy9jb2RhL2ZpbGUuYyBiL2ZzL2NvZGEvZmlsZS5jCmluZGV4IDQ2NjMwM2QuLjZhMzQ3ZmIgMTAwNjQ0Ci0tLSBhL2ZzL2NvZGEvZmlsZS5jCisrKyBiL2ZzL2NvZGEvZmlsZS5jCkBAIC0yMDEsOCArMjAxLDcgQEAKIGludCBjb2RhX2ZzeW5jKHN0cnVjdCBmaWxlICpjb2RhX2ZpbGUsIHN0cnVjdCBkZW50cnkgKmNvZGFfZGVudHJ5LCBpbnQgZGF0YXN5bmMpCiB7CiAJc3RydWN0IGZpbGUgKmhvc3RfZmlsZTsKLQlzdHJ1Y3QgZGVudHJ5ICpob3N0X2RlbnRyeTsKLQlzdHJ1Y3QgaW5vZGUgKmhvc3RfaW5vZGUsICpjb2RhX2lub2RlID0gY29kYV9kZW50cnktPmRfaW5vZGU7CisJc3RydWN0IGlub2RlICpjb2RhX2lub2RlID0gY29kYV9kZW50cnktPmRfaW5vZGU7CiAJc3RydWN0IGNvZGFfZmlsZV9pbmZvICpjZmk7CiAJaW50IGVyciA9IDA7CiAKQEAgLTIxNCwxNCArMjEzLDcgQEAKIAlCVUdfT04oIWNmaSB8fCBjZmktPmNmaV9tYWdpYyAhPSBDT0RBX01BR0lDKTsKIAlob3N0X2ZpbGUgPSBjZmktPmNmaV9jb250YWluZXI7CiAKLQlpZiAoaG9zdF9maWxlLT5mX29wICYmIGhvc3RfZmlsZS0+Zl9vcC0+ZnN5bmMpIHsKLQkJaG9zdF9kZW50cnkgPSBob3N0X2ZpbGUtPmZfcGF0aC5kZW50cnk7Ci0JCWhvc3RfaW5vZGUgPSBob3N0X2RlbnRyeS0+ZF9pbm9kZTsKLQkJbXV0ZXhfbG9jaygmaG9zdF9pbm9kZS0+aV9tdXRleCk7Ci0JCWVyciA9IGhvc3RfZmlsZS0+Zl9vcC0+ZnN5bmMoaG9zdF9maWxlLCBob3N0X2RlbnRyeSwgZGF0YXN5bmMpOwotCQltdXRleF91bmxvY2soJmhvc3RfaW5vZGUtPmlfbXV0ZXgpOwotCX0KLQorCWVyciA9IHZmc19mc3luYyhob3N0X2ZpbGUsIGhvc3RfZmlsZS0+Zl9wYXRoLmRlbnRyeSwgZGF0YXN5bmMpOwogCWlmICggIWVyciAmJiAhZGF0YXN5bmMgKSB7CiAJCWxvY2tfa2VybmVsKCk7CiAJCWVyciA9IHZlbnVzX2ZzeW5jKGNvZGFfaW5vZGUtPmlfc2IsIGNvZGFfaTJmKGNvZGFfaW5vZGUpKTsKZGlmZiAtLWdpdCBhL2ZzL2NvZGEvc3lzY3RsLmMgYi9mcy9jb2RhL3N5c2N0bC5jCmluZGV4IDgxYjc3NzEuLjQzYzk2Y2UgMTAwNjQ0Ci0tLSBhL2ZzL2NvZGEvc3lzY3RsLmMKKysrIGIvZnMvY29kYS9zeXNjdGwuYwpAQCAtMTEsNyArMTEsOSBAQAogCiAjaW5jbHVkZSAiY29kYV9pbnQuaCIKIAorI2lmZGVmIENPTkZJR19TWVNDVEwKIHN0YXRpYyBzdHJ1Y3QgY3RsX3RhYmxlX2hlYWRlciAqZnNfdGFibGVfaGVhZGVyOworI2VuZGlmCiAKIHN0YXRpYyBjdGxfdGFibGUgY29kYV90YWJsZVtdID0gewogCXsKQEAgLTQxLDYgKzQzLDcgQEAKIAl7fQogfTsKIAorI2lmZGVmIENPTkZJR19TWVNDVEwKIHN0YXRpYyBjdGxfdGFibGUgZnNfdGFibGVbXSA9IHsKIAl7CiAJCS5jdGxfbmFtZQk9IENUTF9VTk5VTUJFUkVELApAQCAtNTAsNyArNTMsNyBAQAogCX0sCiAJe30KIH07Ci0KKyNlbmRpZgogCiB2b2lkIGNvZGFfc3lzY3RsX2luaXQodm9pZCkKIHsKZGlmZiAtLWdpdCBhL2ZzL2NvbXBhdC5jIGIvZnMvY29tcGF0LmMKaW5kZXggZDFlY2U3OS4uMzBmMmZhYSAxMDA2NDQKLS0tIGEvZnMvY29tcGF0LmMKKysrIGIvZnMvY29tcGF0LmMKQEAgLTExODcsNiArMTE4Nyw5IEBACiAJcmV0ID0gY29tcGF0X2RvX3JlYWR2X3dyaXRldihSRUFELCBmaWxlLCB2ZWMsIHZsZW4sICZmaWxlLT5mX3Bvcyk7CiAKIG91dDoKKwlpZiAocmV0ID4gMCkKKwkJYWRkX3JjaGFyKGN1cnJlbnQsIHJldCk7CisJaW5jX3N5c2NyKGN1cnJlbnQpOwogCWZwdXQoZmlsZSk7CiAJcmV0dXJuIHJldDsKIH0KQEAgLTEyMTAsNiArMTIxMyw5IEBACiAJcmV0ID0gY29tcGF0X2RvX3JlYWR2X3dyaXRldihXUklURSwgZmlsZSwgdmVjLCB2bGVuLCAmZmlsZS0+Zl9wb3MpOwogCiBvdXQ6CisJaWYgKHJldCA+IDApCisJCWFkZF93Y2hhcihjdXJyZW50LCByZXQpOworCWluY19zeXNjdyhjdXJyZW50KTsKIAlmcHV0KGZpbGUpOwogCXJldHVybiByZXQ7CiB9CmRpZmYgLS1naXQgYS9mcy9jb25maWdmcy9pbm9kZS5jIGIvZnMvY29uZmlnZnMvaW5vZGUuYwppbmRleCA0ODAzY2NjLi41ZDM0OWQzIDEwMDY0NAotLS0gYS9mcy9jb25maWdmcy9pbm9kZS5jCisrKyBiL2ZzL2NvbmZpZ2ZzL2lub2RlLmMKQEAgLTExNyw4ICsxMTcsNiBAQAogc3RhdGljIGlubGluZSB2b2lkIHNldF9kZWZhdWx0X2lub2RlX2F0dHIoc3RydWN0IGlub2RlICogaW5vZGUsIG1vZGVfdCBtb2RlKQogewogCWlub2RlLT5pX21vZGUgPSBtb2RlOwotCWlub2RlLT5pX3VpZCA9IDA7Ci0JaW5vZGUtPmlfZ2lkID0gMDsKIAlpbm9kZS0+aV9hdGltZSA9IGlub2RlLT5pX210aW1lID0gaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUU7CiB9CiAKQEAgLTEzNiw3ICsxMzQsNiBAQAogewogCXN0cnVjdCBpbm9kZSAqIGlub2RlID0gbmV3X2lub2RlKGNvbmZpZ2ZzX3NiKTsKIAlpZiAoaW5vZGUpIHsKLQkJaW5vZGUtPmlfYmxvY2tzID0gMDsKIAkJaW5vZGUtPmlfbWFwcGluZy0+YV9vcHMgPSAmY29uZmlnZnNfYW9wczsKIAkJaW5vZGUtPmlfbWFwcGluZy0+YmFja2luZ19kZXZfaW5mbyA9ICZjb25maWdmc19iYWNraW5nX2Rldl9pbmZvOwogCQlpbm9kZS0+aV9vcCA9ICZjb25maWdmc19pbm9kZV9vcGVyYXRpb25zOwpkaWZmIC0tZ2l0IGEvZnMvY3JhbWZzL2lub2RlLmMgYi9mcy9jcmFtZnMvaW5vZGUuYwppbmRleCBmNDA0MjNlLi5hMDczMzhkIDEwMDY0NAotLS0gYS9mcy9jcmFtZnMvaW5vZGUuYworKysgYi9mcy9jcmFtZnMvaW5vZGUuYwpAQCAtODMsOCArODMsNiBAQAogCQkJaW5vZGUtPmlfb3AgPSAmcGFnZV9zeW1saW5rX2lub2RlX29wZXJhdGlvbnM7CiAJCQlpbm9kZS0+aV9kYXRhLmFfb3BzID0gJmNyYW1mc19hb3BzOwogCQl9IGVsc2UgewotCQkJaW5vZGUtPmlfc2l6ZSA9IDA7Ci0JCQlpbm9kZS0+aV9ibG9ja3MgPSAwOwogCQkJaW5pdF9zcGVjaWFsX2lub2RlKGlub2RlLCBpbm9kZS0+aV9tb2RlLAogCQkJCW9sZF9kZWNvZGVfZGV2KGNyYW1mc19pbm9kZS0+c2l6ZSkpOwogCQl9CmRpZmYgLS1naXQgYS9mcy9kY2FjaGUuYyBiL2ZzL2RjYWNoZS5jCmluZGV4IGU4OGMyM2IuLjQ1NDdmNjYgMTAwNjQ0Ci0tLSBhL2ZzL2RjYWNoZS5jCisrKyBiL2ZzL2RjYWNoZS5jCkBAIC0xNTY3LDEwICsxNTY3LDYgQEAKIAlzcGluX3VubG9jaygmZGNhY2hlX2xvY2spOwogfQogCi0jZGVmaW5lIGRvX3N3aXRjaCh4LHkpIGRvIHsgXAotCV9fdHlwZW9mX18gKHgpIF9fdG1wID0geDsgXAotCXggPSB5OyB5ID0gX190bXA7IH0gd2hpbGUgKDApCi0KIC8qCiAgKiBXaGVuIHN3aXRjaGluZyBuYW1lcywgdGhlIGFjdHVhbCBzdHJpbmcgZG9lc24ndCBzdHJpY3RseSBoYXZlIHRvCiAgKiBiZSBwcmVzZXJ2ZWQgaW4gdGhlIHRhcmdldCAtIGJlY2F1c2Ugd2UncmUgZHJvcHBpbmcgdGhlIHRhcmdldApAQCAtMTU4OSw3ICsxNTg1LDcgQEAKIAkJCS8qCiAJCQkgKiBCb3RoIGV4dGVybmFsOiBzd2FwIHRoZSBwb2ludGVycwogCQkJICovCi0JCQlkb19zd2l0Y2godGFyZ2V0LT5kX25hbWUubmFtZSwgZGVudHJ5LT5kX25hbWUubmFtZSk7CisJCQlzd2FwKHRhcmdldC0+ZF9uYW1lLm5hbWUsIGRlbnRyeS0+ZF9uYW1lLm5hbWUpOwogCQl9IGVsc2UgewogCQkJLyoKIAkJCSAqIGRlbnRyeTppbnRlcm5hbCwgdGFyZ2V0OmV4dGVybmFsLiAgU3RlYWwgdGFyZ2V0J3MKQEAgLTE2MjAsNyArMTYxNiw3IEBACiAJCQlyZXR1cm47CiAJCX0KIAl9Ci0JZG9fc3dpdGNoKGRlbnRyeS0+ZF9uYW1lLmxlbiwgdGFyZ2V0LT5kX25hbWUubGVuKTsKKwlzd2FwKGRlbnRyeS0+ZF9uYW1lLmxlbiwgdGFyZ2V0LT5kX25hbWUubGVuKTsKIH0KIAogLyoKQEAgLTE2ODAsNyArMTY3Niw3IEBACiAKIAkvKiBTd2l0Y2ggdGhlIG5hbWVzLi4gKi8KIAlzd2l0Y2hfbmFtZXMoZGVudHJ5LCB0YXJnZXQpOwotCWRvX3N3aXRjaChkZW50cnktPmRfbmFtZS5oYXNoLCB0YXJnZXQtPmRfbmFtZS5oYXNoKTsKKwlzd2FwKGRlbnRyeS0+ZF9uYW1lLmhhc2gsIHRhcmdldC0+ZF9uYW1lLmhhc2gpOwogCiAJLyogLi4uIGFuZCBzd2l0Y2ggdGhlIHBhcmVudHMgKi8KIAlpZiAoSVNfUk9PVChkZW50cnkpKSB7CkBAIC0xNjg4LDcgKzE2ODQsNyBAQAogCQl0YXJnZXQtPmRfcGFyZW50ID0gdGFyZ2V0OwogCQlJTklUX0xJU1RfSEVBRCgmdGFyZ2V0LT5kX3UuZF9jaGlsZCk7CiAJfSBlbHNlIHsKLQkJZG9fc3dpdGNoKGRlbnRyeS0+ZF9wYXJlbnQsIHRhcmdldC0+ZF9wYXJlbnQpOworCQlzd2FwKGRlbnRyeS0+ZF9wYXJlbnQsIHRhcmdldC0+ZF9wYXJlbnQpOwogCiAJCS8qIEFuZCBhZGQgdGhlbSBiYWNrIHRvIHRoZSAobmV3KSBwYXJlbnQgbGlzdHMgKi8KIAkJbGlzdF9hZGQoJnRhcmdldC0+ZF91LmRfY2hpbGQsICZ0YXJnZXQtPmRfcGFyZW50LT5kX3N1YmRpcnMpOwpAQCAtMTc4OSw3ICsxNzg1LDcgQEAKIAlzdHJ1Y3QgZGVudHJ5ICpkcGFyZW50LCAqYXBhcmVudDsKIAogCXN3aXRjaF9uYW1lcyhkZW50cnksIGFub24pOwotCWRvX3N3aXRjaChkZW50cnktPmRfbmFtZS5oYXNoLCBhbm9uLT5kX25hbWUuaGFzaCk7CisJc3dhcChkZW50cnktPmRfbmFtZS5oYXNoLCBhbm9uLT5kX25hbWUuaGFzaCk7CiAKIAlkcGFyZW50ID0gZGVudHJ5LT5kX3BhcmVudDsKIAlhcGFyZW50ID0gYW5vbi0+ZF9wYXJlbnQ7CmRpZmYgLS1naXQgYS9mcy9kZWJ1Z2ZzL2ZpbGUuYyBiL2ZzL2RlYnVnZnMvZmlsZS5jCmluZGV4IDE1OWE1ZWYuLjMzYTkwMTIgMTAwNjQ0Ci0tLSBhL2ZzL2RlYnVnZnMvZmlsZS5jCisrKyBiL2ZzL2RlYnVnZnMvZmlsZS5jCkBAIC0yOTQsNiArMjk0LDM4IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChkZWJ1Z2ZzX2NyZWF0ZV94MzIpOwogCisKK3N0YXRpYyBpbnQgZGVidWdmc19zaXplX3Rfc2V0KHZvaWQgKmRhdGEsIHU2NCB2YWwpCit7CisJKihzaXplX3QgKilkYXRhID0gdmFsOworCXJldHVybiAwOworfQorc3RhdGljIGludCBkZWJ1Z2ZzX3NpemVfdF9nZXQodm9pZCAqZGF0YSwgdTY0ICp2YWwpCit7CisJKnZhbCA9ICooc2l6ZV90ICopZGF0YTsKKwlyZXR1cm4gMDsKK30KK0RFRklORV9TSU1QTEVfQVRUUklCVVRFKGZvcHNfc2l6ZV90LCBkZWJ1Z2ZzX3NpemVfdF9nZXQsIGRlYnVnZnNfc2l6ZV90X3NldCwKKwkJCSIlbGx1XG4iKTsJLyogJWxsdSBhbmQgJXp1IGFyZSBtb3JlIG9yIGxlc3MgdGhlIHNhbWUgKi8KKworLyoqCisgKiBkZWJ1Z2ZzX2NyZWF0ZV9zaXplX3QgLSBjcmVhdGUgYSBkZWJ1Z2ZzIGZpbGUgdGhhdCBpcyB1c2VkIHRvIHJlYWQgYW5kIHdyaXRlIGFuIHNpemVfdCB2YWx1ZQorICogQG5hbWU6IGEgcG9pbnRlciB0byBhIHN0cmluZyBjb250YWluaW5nIHRoZSBuYW1lIG9mIHRoZSBmaWxlIHRvIGNyZWF0ZS4KKyAqIEBtb2RlOiB0aGUgcGVybWlzc2lvbiB0aGF0IHRoZSBmaWxlIHNob3VsZCBoYXZlCisgKiBAcGFyZW50OiBhIHBvaW50ZXIgdG8gdGhlIHBhcmVudCBkZW50cnkgZm9yIHRoaXMgZmlsZS4gIFRoaXMgc2hvdWxkIGJlIGEKKyAqICAgICAgICAgIGRpcmVjdG9yeSBkZW50cnkgaWYgc2V0LiAgSWYgdGhpcyBwYXJhbWV0ZXIgaXMgJU5VTEwsIHRoZW4gdGhlCisgKiAgICAgICAgICBmaWxlIHdpbGwgYmUgY3JlYXRlZCBpbiB0aGUgcm9vdCBvZiB0aGUgZGVidWdmcyBmaWxlc3lzdGVtLgorICogQHZhbHVlOiBhIHBvaW50ZXIgdG8gdGhlIHZhcmlhYmxlIHRoYXQgdGhlIGZpbGUgc2hvdWxkIHJlYWQgdG8gYW5kIHdyaXRlCisgKiAgICAgICAgIGZyb20uCisgKi8KK3N0cnVjdCBkZW50cnkgKmRlYnVnZnNfY3JlYXRlX3NpemVfdChjb25zdCBjaGFyICpuYW1lLCBtb2RlX3QgbW9kZSwKKwkJCQkgICAgIHN0cnVjdCBkZW50cnkgKnBhcmVudCwgc2l6ZV90ICp2YWx1ZSkKK3sKKwlyZXR1cm4gZGVidWdmc19jcmVhdGVfZmlsZShuYW1lLCBtb2RlLCBwYXJlbnQsIHZhbHVlLCAmZm9wc19zaXplX3QpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZGVidWdmc19jcmVhdGVfc2l6ZV90KTsKKworCiBzdGF0aWMgc3NpemVfdCByZWFkX2ZpbGVfYm9vbChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAogCQkJICAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCiB7CmRpZmYgLS1naXQgYS9mcy9kZWJ1Z2ZzL2lub2RlLmMgYi9mcy9kZWJ1Z2ZzL2lub2RlLmMKaW5kZXggM2RiZTIxNi4uODFhZTllYSAxMDA2NDQKLS0tIGEvZnMvZGVidWdmcy9pbm9kZS5jCisrKyBiL2ZzL2RlYnVnZnMvaW5vZGUuYwpAQCAtMzcsOSArMzcsNiBAQAogCiAJaWYgKGlub2RlKSB7CiAJCWlub2RlLT5pX21vZGUgPSBtb2RlOwotCQlpbm9kZS0+aV91aWQgPSAwOwotCQlpbm9kZS0+aV9naWQgPSAwOwotCQlpbm9kZS0+aV9ibG9ja3MgPSAwOwogCQlpbm9kZS0+aV9hdGltZSA9IGlub2RlLT5pX210aW1lID0gaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUU7CiAJCXN3aXRjaCAobW9kZSAmIFNfSUZNVCkgewogCQlkZWZhdWx0OgpkaWZmIC0tZ2l0IGEvZnMvZGV2cHRzL2lub2RlLmMgYi9mcy9kZXZwdHMvaW5vZGUuYwppbmRleCBmZmY5NmUxLi41ZjMyMzFiIDEwMDY0NAotLS0gYS9mcy9kZXZwdHMvaW5vZGUuYworKysgYi9mcy9kZXZwdHMvaW5vZGUuYwpAQCAtMTg5LDggKzE4OSw2IEBACiAJfQogCiAJaW5vZGUtPmlfaW5vID0gMjsKLQlpbm9kZS0+aV91aWQgPSBpbm9kZS0+aV9naWQgPSAwOwotCWlub2RlLT5pX2Jsb2NrcyA9IDA7CiAJaW5vZGUtPmlfbXRpbWUgPSBpbm9kZS0+aV9hdGltZSA9IGlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FOwogCiAJbW9kZSA9IFNfSUZDSFJ8b3B0cy0+cHRteG1vZGU7CkBAIC0zMDAsOCArMjk4LDYgQEAKIAkJZ290byBmcmVlX2ZzaTsKIAlpbm9kZS0+aV9pbm8gPSAxOwogCWlub2RlLT5pX210aW1lID0gaW5vZGUtPmlfYXRpbWUgPSBpbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRTsKLQlpbm9kZS0+aV9ibG9ja3MgPSAwOwotCWlub2RlLT5pX3VpZCA9IGlub2RlLT5pX2dpZCA9IDA7CiAJaW5vZGUtPmlfbW9kZSA9IFNfSUZESVIgfCBTX0lSVUdPIHwgU19JWFVHTyB8IFNfSVdVU1I7CiAJaW5vZGUtPmlfb3AgPSAmc2ltcGxlX2Rpcl9pbm9kZV9vcGVyYXRpb25zOwogCWlub2RlLT5pX2ZvcCA9ICZzaW1wbGVfZGlyX29wZXJhdGlvbnM7CmRpZmYgLS1naXQgYS9mcy9kaXJlY3QtaW8uYyBiL2ZzL2RpcmVjdC1pby5jCmluZGV4IGFmMDU1OGQuLmI2ZDQzOTAgMTAwNjQ0Ci0tLSBhL2ZzL2RpcmVjdC1pby5jCisrKyBiL2ZzL2RpcmVjdC1pby5jCkBAIC0xMjA5LDYgKzEyMDksMTkgQEAKIAlyZXR2YWwgPSBkaXJlY3RfaW9fd29ya2VyKHJ3LCBpb2NiLCBpbm9kZSwgaW92LCBvZmZzZXQsCiAJCQkJbnJfc2VncywgYmxrYml0cywgZ2V0X2Jsb2NrLCBlbmRfaW8sIGRpbyk7CiAKKwkvKgorCSAqIEluIGNhc2Ugb2YgZXJyb3IgZXh0ZW5kaW5nIHdyaXRlIG1heSBoYXZlIGluc3RhbnRpYXRlZCBhIGZldworCSAqIGJsb2NrcyBvdXRzaWRlIGlfc2l6ZS4gVHJpbSB0aGVzZSBvZmYgYWdhaW4gZm9yIERJT19MT0NLSU5HLgorCSAqIE5PVEU6IERJT19OT19MT0NLL0RJT19PV05fTE9DSyBjYWxsZXJzIGhhdmUgdG8gaGFuZGxlIHRoaXMgYnkKKwkgKiBpdCdzIG93biBtZWFuZXIuCisJICovCisJaWYgKHVubGlrZWx5KHJldHZhbCA8IDAgJiYgKHJ3ICYgV1JJVEUpKSkgeworCQlsb2ZmX3QgaXNpemUgPSBpX3NpemVfcmVhZChpbm9kZSk7CisKKwkJaWYgKGVuZCA+IGlzaXplICYmIGRpb19sb2NrX3R5cGUgPT0gRElPX0xPQ0tJTkcpCisJCQl2bXRydW5jYXRlKGlub2RlLCBpc2l6ZSk7CisJfQorCiAJaWYgKHJ3ID09IFJFQUQgJiYgZGlvX2xvY2tfdHlwZSA9PSBESU9fTE9DS0lORykKIAkJcmVsZWFzZV9pX211dGV4ID0gMDsKIApkaWZmIC0tZ2l0IGEvZnMvZGxtL2FzdC5jIGIvZnMvZGxtL2FzdC5jCmluZGV4IDhiZjMxZTMuLmRjMmFkNjAgMTAwNjQ0Ci0tLSBhL2ZzL2RsbS9hc3QuYworKysgYi9mcy9kbG0vYXN0LmMKQEAgLTIsNyArMiw3IEBACiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqKgogKiogIENvcHlyaWdodCAoQykgU2lzdGluYSBTb2Z0d2FyZSwgSW5jLiAgMTk5Ny0yMDAzICBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiogIENvcHlyaWdodCAoQykgMjAwNC0yMDA1IFJlZCBIYXQsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqKiAgQ29weXJpZ2h0IChDKSAyMDA0LTIwMDggUmVkIEhhdCwgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KICoqCiAqKiAgVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCiAqKiAgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKQEAgLTMzLDEwICszMywxMCBAQAogCXNwaW5fdW5sb2NrKCZhc3RfcXVldWVfbG9jayk7CiB9CiAKLXZvaWQgZGxtX2FkZF9hc3Qoc3RydWN0IGRsbV9sa2IgKmxrYiwgaW50IHR5cGUpCit2b2lkIGRsbV9hZGRfYXN0KHN0cnVjdCBkbG1fbGtiICpsa2IsIGludCB0eXBlLCBpbnQgYmFzdG1vZGUpCiB7CiAJaWYgKGxrYi0+bGtiX2ZsYWdzICYgRExNX0lGTF9VU0VSKSB7Ci0JCWRsbV91c2VyX2FkZF9hc3QobGtiLCB0eXBlKTsKKwkJZGxtX3VzZXJfYWRkX2FzdChsa2IsIHR5cGUsIGJhc3Rtb2RlKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtNDYsNiArNDYsOCBAQAogCQlsaXN0X2FkZF90YWlsKCZsa2ItPmxrYl9hc3RxdWV1ZSwgJmFzdF9xdWV1ZSk7CiAJfQogCWxrYi0+bGtiX2FzdF90eXBlIHw9IHR5cGU7CisJaWYgKGJhc3Rtb2RlKQorCQlsa2ItPmxrYl9iYXN0bW9kZSA9IGJhc3Rtb2RlOwogCXNwaW5fdW5sb2NrKCZhc3RfcXVldWVfbG9jayk7CiAKIAlzZXRfYml0KFdBS0VfQVNUUywgJmFzdGRfd2FrZWZsYWdzKTsKQEAgLTU5LDUwICs2MSw0MCBAQAogCXN0cnVjdCBkbG1fbGtiICpsa2I7CiAJdm9pZCAoKmNhc3QpICh2b2lkICphc3RwYXJhbSk7CiAJdm9pZCAoKmJhc3QpICh2b2lkICphc3RwYXJhbSwgaW50IG1vZGUpOwotCWludCB0eXBlID0gMCwgZm91bmQsIGJtb2RlOworCWludCB0eXBlID0gMCwgYmFzdG1vZGU7CiAKLQlmb3IgKDs7KSB7Ci0JCWZvdW5kID0gMDsKLQkJc3Bpbl9sb2NrKCZhc3RfcXVldWVfbG9jayk7Ci0JCWxpc3RfZm9yX2VhY2hfZW50cnkobGtiLCAmYXN0X3F1ZXVlLCBsa2JfYXN0cXVldWUpIHsKLQkJCXIgPSBsa2ItPmxrYl9yZXNvdXJjZTsKLQkJCWxzID0gci0+cmVzX2xzOworcmVwZWF0OgorCXNwaW5fbG9jaygmYXN0X3F1ZXVlX2xvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnkobGtiLCAmYXN0X3F1ZXVlLCBsa2JfYXN0cXVldWUpIHsKKwkJciA9IGxrYi0+bGtiX3Jlc291cmNlOworCQlscyA9IHItPnJlc19sczsKIAotCQkJaWYgKGRsbV9sb2NraW5nX3N0b3BwZWQobHMpKQotCQkJCWNvbnRpbnVlOworCQlpZiAoZGxtX2xvY2tpbmdfc3RvcHBlZChscykpCisJCQljb250aW51ZTsKIAotCQkJbGlzdF9kZWwoJmxrYi0+bGtiX2FzdHF1ZXVlKTsKLQkJCXR5cGUgPSBsa2ItPmxrYl9hc3RfdHlwZTsKLQkJCWxrYi0+bGtiX2FzdF90eXBlID0gMDsKLQkJCWZvdW5kID0gMTsKLQkJCWJyZWFrOwotCQl9CisJCWxpc3RfZGVsKCZsa2ItPmxrYl9hc3RxdWV1ZSk7CisJCXR5cGUgPSBsa2ItPmxrYl9hc3RfdHlwZTsKKwkJbGtiLT5sa2JfYXN0X3R5cGUgPSAwOworCQliYXN0bW9kZSA9IGxrYi0+bGtiX2Jhc3Rtb2RlOworCiAJCXNwaW5fdW5sb2NrKCZhc3RfcXVldWVfbG9jayk7Ci0KLQkJaWYgKCFmb3VuZCkKLQkJCWJyZWFrOwotCiAJCWNhc3QgPSBsa2ItPmxrYl9hc3RmbjsKIAkJYmFzdCA9IGxrYi0+bGtiX2Jhc3RmbjsKLQkJYm1vZGUgPSBsa2ItPmxrYl9iYXN0bW9kZTsKIAogCQlpZiAoKHR5cGUgJiBBU1RfQ09NUCkgJiYgY2FzdCkKIAkJCWNhc3QobGtiLT5sa2JfYXN0cGFyYW0pOwogCi0JCS8qIEZJWE1FOiBJcyBpdCBzYWZlIHRvIGxvb2sgYXQgbGtiX2dybW9kZSBoZXJlCi0JCSAgIHdpdGhvdXQgZG9pbmcgYSBsb2NrX3JzYigpID8KLQkJICAgTG9vayBhdCBvdGhlciBjaGVja3MgaW4gdjEgdG8gYXZvaWQgYmFzdHMuICovCi0KIAkJaWYgKCh0eXBlICYgQVNUX0JBU1QpICYmIGJhc3QpCi0JCQlpZiAoIWRsbV9tb2Rlc19jb21wYXQobGtiLT5sa2JfZ3Jtb2RlLCBibW9kZSkpCi0JCQkJYmFzdChsa2ItPmxrYl9hc3RwYXJhbSwgYm1vZGUpOworCQkJYmFzdChsa2ItPmxrYl9hc3RwYXJhbSwgYmFzdG1vZGUpOwogCiAJCS8qIHRoaXMgcmVtb3ZlcyB0aGUgcmVmZXJlbmNlIGFkZGVkIGJ5IGRsbV9hZGRfYXN0CiAJCSAgIGFuZCBtYXkgcmVzdWx0IGluIHRoZSBsa2IgYmVpbmcgZnJlZWQgKi8KIAkJZGxtX3B1dF9sa2IobGtiKTsKIAotCQlzY2hlZHVsZSgpOworCQljb25kX3Jlc2NoZWQoKTsKKwkJZ290byByZXBlYXQ7CiAJfQorCXNwaW5fdW5sb2NrKCZhc3RfcXVldWVfbG9jayk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IG5vX2FzdHModm9pZCkKZGlmZiAtLWdpdCBhL2ZzL2RsbS9hc3QuaCBiL2ZzL2RsbS9hc3QuaAppbmRleCA2ZWUyNzZjLi4xYjVmYzVmIDEwMDY0NAotLS0gYS9mcy9kbG0vYXN0LmgKKysrIGIvZnMvZGxtL2FzdC5oCkBAIC0xLDcgKzEsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKioKLSoqICBDb3B5cmlnaHQgKEMpIDIwMDUgUmVkIEhhdCwgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyoqICBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwOCBSZWQgSGF0LCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgogKioKICoqICBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKICoqICBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwpAQCAtMTMsNyArMTMsNyBAQAogI2lmbmRlZiBfX0FTVERfRE9UX0hfXwogI2RlZmluZSBfX0FTVERfRE9UX0hfXwogCi12b2lkIGRsbV9hZGRfYXN0KHN0cnVjdCBkbG1fbGtiICpsa2IsIGludCB0eXBlKTsKK3ZvaWQgZGxtX2FkZF9hc3Qoc3RydWN0IGRsbV9sa2IgKmxrYiwgaW50IHR5cGUsIGludCBiYXN0bW9kZSk7CiB2b2lkIGRsbV9kZWxfYXN0KHN0cnVjdCBkbG1fbGtiICpsa2IpOwogCiB2b2lkIGRsbV9hc3RkX3dha2Uodm9pZCk7CmRpZmYgLS1naXQgYS9mcy9kbG0vZGVidWdfZnMuYyBiL2ZzL2RsbS9kZWJ1Z19mcy5jCmluZGV4IDhmYzI0ZjQuLjJmMTA3ZDEgMTAwNjQ0Ci0tLSBhL2ZzL2RsbS9kZWJ1Z19mcy5jCisrKyBiL2ZzL2RsbS9kZWJ1Z19mcy5jCkBAIC0xLDcgKzEsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKioKLSoqICBDb3B5cmlnaHQgKEMpIDIwMDUgUmVkIEhhdCwgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyoqICBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwOCBSZWQgSGF0LCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgogKioKICoqICBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKICoqICBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwpAQCAtMjcsNyArMjcsNyBAQAogCiBzdHJ1Y3QgcnNiX2l0ZXIgewogCWludCBlbnRyeTsKLQlpbnQgbG9ja3M7CisJaW50IGZvcm1hdDsKIAlpbnQgaGVhZGVyOwogCXN0cnVjdCBkbG1fbHMgKmxzOwogCXN0cnVjdCBsaXN0X2hlYWQgKm5leHQ7CkBAIC02MCw4ICs2MCw4IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBwcmludF9yZXNvdXJjZV9sb2NrKHN0cnVjdCBzZXFfZmlsZSAqcywgc3RydWN0IGRsbV9sa2IgKmxrYiwKLQkJCQlzdHJ1Y3QgZGxtX3JzYiAqcmVzKQorc3RhdGljIHZvaWQgcHJpbnRfZm9ybWF0MV9sb2NrKHN0cnVjdCBzZXFfZmlsZSAqcywgc3RydWN0IGRsbV9sa2IgKmxrYiwKKwkJCSAgICAgICBzdHJ1Y3QgZGxtX3JzYiAqcmVzKQogewogCXNlcV9wcmludGYocywgIiUwOHggJXMiLCBsa2ItPmxrYl9pZCwgcHJpbnRfbG9ja21vZGUobGtiLT5sa2JfZ3Jtb2RlKSk7CiAKQEAgLTgzLDcgKzgzLDcgQEAKIAlzZXFfcHJpbnRmKHMsICJcbiIpOwogfQogCi1zdGF0aWMgaW50IHByaW50X3Jlc291cmNlKHN0cnVjdCBkbG1fcnNiICpyZXMsIHN0cnVjdCBzZXFfZmlsZSAqcykKK3N0YXRpYyBpbnQgcHJpbnRfZm9ybWF0MShzdHJ1Y3QgZGxtX3JzYiAqcmVzLCBzdHJ1Y3Qgc2VxX2ZpbGUgKnMpCiB7CiAJc3RydWN0IGRsbV9sa2IgKmxrYjsKIAlpbnQgaSwgbHZibGVuID0gcmVzLT5yZXNfbHMtPmxzX2x2YmxlbiwgcmVjb3Zlcl9saXN0LCByb290X2xpc3Q7CkBAIC0xMzQsMTUgKzEzNCwxNSBAQAogCS8qIFByaW50IHRoZSBsb2NrcyBhdHRhY2hlZCB0byB0aGlzIHJlc291cmNlICovCiAJc2VxX3ByaW50ZihzLCAiR3JhbnRlZCBRdWV1ZVxuIik7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeShsa2IsICZyZXMtPnJlc19ncmFudHF1ZXVlLCBsa2Jfc3RhdGVxdWV1ZSkKLQkJcHJpbnRfcmVzb3VyY2VfbG9jayhzLCBsa2IsIHJlcyk7CisJCXByaW50X2Zvcm1hdDFfbG9jayhzLCBsa2IsIHJlcyk7CiAKIAlzZXFfcHJpbnRmKHMsICJDb252ZXJzaW9uIFF1ZXVlXG4iKTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGxrYiwgJnJlcy0+cmVzX2NvbnZlcnRxdWV1ZSwgbGtiX3N0YXRlcXVldWUpCi0JCXByaW50X3Jlc291cmNlX2xvY2socywgbGtiLCByZXMpOworCQlwcmludF9mb3JtYXQxX2xvY2socywgbGtiLCByZXMpOwogCiAJc2VxX3ByaW50ZihzLCAiV2FpdGluZyBRdWV1ZVxuIik7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeShsa2IsICZyZXMtPnJlc193YWl0cXVldWUsIGxrYl9zdGF0ZXF1ZXVlKQotCQlwcmludF9yZXNvdXJjZV9sb2NrKHMsIGxrYiwgcmVzKTsKKwkJcHJpbnRfZm9ybWF0MV9sb2NrKHMsIGxrYiwgcmVzKTsKIAogCWlmIChsaXN0X2VtcHR5KCZyZXMtPnJlc19sb29rdXApKQogCQlnb3RvIG91dDsKQEAgLTE2MCwyMyArMTYwLDI0IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIHByaW50X2xvY2soc3RydWN0IHNlcV9maWxlICpzLCBzdHJ1Y3QgZGxtX2xrYiAqbGtiLCBzdHJ1Y3QgZGxtX3JzYiAqcikKK3N0YXRpYyB2b2lkIHByaW50X2Zvcm1hdDJfbG9jayhzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHN0cnVjdCBkbG1fbGtiICpsa2IsCisJCQkgICAgICAgc3RydWN0IGRsbV9yc2IgKnIpCiB7Ci0JdW5zaWduZWQgaW50IHdhaXRpbmcgPSAwOwotCXVpbnQ2NF90IHhpZCA9IDA7CisJdTY0IHhpZCA9IDA7CisJdTY0IHVzOwogCiAJaWYgKGxrYi0+bGtiX2ZsYWdzICYgRExNX0lGTF9VU0VSKSB7CiAJCWlmIChsa2ItPmxrYl91YSkKIAkJCXhpZCA9IGxrYi0+bGtiX3VhLT54aWQ7CiAJfQogCi0JaWYgKGxrYi0+bGtiX3RpbWVzdGFtcCkKLQkJd2FpdGluZyA9IGppZmZpZXNfdG9fbXNlY3MoamlmZmllcyAtIGxrYi0+bGtiX3RpbWVzdGFtcCk7CisJLyogbWljcm9zZWNvbmRzIHNpbmNlIGxrYiB3YXMgYWRkZWQgdG8gY3VycmVudCBxdWV1ZSAqLworCXVzID0ga3RpbWVfdG9fdXMoa3RpbWVfc3ViKGt0aW1lX2dldCgpLCBsa2ItPmxrYl90aW1lc3RhbXApKTsKIAotCS8qIGlkIG5vZGVpZCByZW1pZCBwaWQgeGlkIGV4ZmxhZ3MgZmxhZ3Mgc3RzIGdybW9kZSBycW1vZGUgdGltZV9tcworCS8qIGlkIG5vZGVpZCByZW1pZCBwaWQgeGlkIGV4ZmxhZ3MgZmxhZ3Mgc3RzIGdybW9kZSBycW1vZGUgdGltZV91cwogCSAgIHJfbm9kZWlkIHJfbGVuIHJfbmFtZSAqLwogCi0Jc2VxX3ByaW50ZihzLCAiJXggJWQgJXggJXUgJWxsdSAleCAleCAlZCAlZCAlZCAldSAldSAlZCBcIiVzXCJcbiIsCisJc2VxX3ByaW50ZihzLCAiJXggJWQgJXggJXUgJWxsdSAleCAleCAlZCAlZCAlZCAlbGx1ICV1ICVkIFwiJXNcIlxuIiwKIAkJICAgbGtiLT5sa2JfaWQsCiAJCSAgIGxrYi0+bGtiX25vZGVpZCwKIAkJICAgbGtiLT5sa2JfcmVtaWQsCkBAIC0xODcsMjYgKzE4OCwxMTQgQEAKIAkJICAgbGtiLT5sa2Jfc3RhdHVzLAogCQkgICBsa2ItPmxrYl9ncm1vZGUsCiAJCSAgIGxrYi0+bGtiX3JxbW9kZSwKLQkJICAgd2FpdGluZywKKwkJICAgKHVuc2lnbmVkIGxvbmcgbG9uZyl1cywKIAkJICAgci0+cmVzX25vZGVpZCwKIAkJICAgci0+cmVzX2xlbmd0aCwKIAkJICAgci0+cmVzX25hbWUpOwogfQogCi1zdGF0aWMgaW50IHByaW50X2xvY2tzKHN0cnVjdCBkbG1fcnNiICpyLCBzdHJ1Y3Qgc2VxX2ZpbGUgKnMpCitzdGF0aWMgaW50IHByaW50X2Zvcm1hdDIoc3RydWN0IGRsbV9yc2IgKnIsIHN0cnVjdCBzZXFfZmlsZSAqcykKIHsKIAlzdHJ1Y3QgZGxtX2xrYiAqbGtiOwogCiAJbG9ja19yc2Iocik7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGxrYiwgJnItPnJlc19ncmFudHF1ZXVlLCBsa2Jfc3RhdGVxdWV1ZSkKLQkJcHJpbnRfbG9jayhzLCBsa2IsIHIpOworCQlwcmludF9mb3JtYXQyX2xvY2socywgbGtiLCByKTsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkobGtiLCAmci0+cmVzX2NvbnZlcnRxdWV1ZSwgbGtiX3N0YXRlcXVldWUpCi0JCXByaW50X2xvY2socywgbGtiLCByKTsKKwkJcHJpbnRfZm9ybWF0Ml9sb2NrKHMsIGxrYiwgcik7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGxrYiwgJnItPnJlc193YWl0cXVldWUsIGxrYl9zdGF0ZXF1ZXVlKQotCQlwcmludF9sb2NrKHMsIGxrYiwgcik7CisJCXByaW50X2Zvcm1hdDJfbG9jayhzLCBsa2IsIHIpOworCisJdW5sb2NrX3JzYihyKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfZm9ybWF0M19sb2NrKHN0cnVjdCBzZXFfZmlsZSAqcywgc3RydWN0IGRsbV9sa2IgKmxrYiwKKwkJCSAgICAgICBpbnQgcnNiX2xvb2t1cCkKK3sKKwl1NjQgeGlkID0gMDsKKworCWlmIChsa2ItPmxrYl9mbGFncyAmIERMTV9JRkxfVVNFUikgeworCQlpZiAobGtiLT5sa2JfdWEpCisJCQl4aWQgPSBsa2ItPmxrYl91YS0+eGlkOworCX0KKworCXNlcV9wcmludGYocywgImxrYiAleCAlZCAleCAldSAlbGx1ICV4ICV4ICVkICVkICVkICVkICVkICVkICV1ICVsbHUgJWxsdVxuIiwKKwkJICAgbGtiLT5sa2JfaWQsCisJCSAgIGxrYi0+bGtiX25vZGVpZCwKKwkJICAgbGtiLT5sa2JfcmVtaWQsCisJCSAgIGxrYi0+bGtiX293bnBpZCwKKwkJICAgKHVuc2lnbmVkIGxvbmcgbG9uZyl4aWQsCisJCSAgIGxrYi0+bGtiX2V4ZmxhZ3MsCisJCSAgIGxrYi0+bGtiX2ZsYWdzLAorCQkgICBsa2ItPmxrYl9zdGF0dXMsCisJCSAgIGxrYi0+bGtiX2dybW9kZSwKKwkJICAgbGtiLT5sa2JfcnFtb2RlLAorCQkgICBsa2ItPmxrYl9oaWdoYmFzdCwKKwkJICAgcnNiX2xvb2t1cCwKKwkJICAgbGtiLT5sa2Jfd2FpdF90eXBlLAorCQkgICBsa2ItPmxrYl9sdmJzZXEsCisJCSAgICh1bnNpZ25lZCBsb25nIGxvbmcpa3RpbWVfdG9fbnMobGtiLT5sa2JfdGltZXN0YW1wKSwKKwkJICAgKHVuc2lnbmVkIGxvbmcgbG9uZylrdGltZV90b19ucyhsa2ItPmxrYl90aW1lX2Jhc3QpKTsKK30KKworc3RhdGljIGludCBwcmludF9mb3JtYXQzKHN0cnVjdCBkbG1fcnNiICpyLCBzdHJ1Y3Qgc2VxX2ZpbGUgKnMpCit7CisJc3RydWN0IGRsbV9sa2IgKmxrYjsKKwlpbnQgaSwgbHZibGVuID0gci0+cmVzX2xzLT5sc19sdmJsZW47CisJaW50IHByaW50X25hbWUgPSAxOworCisJbG9ja19yc2Iocik7CisKKwlzZXFfcHJpbnRmKHMsICJyc2IgJXAgJWQgJXggJWx4ICVkICVkICV1ICVkICIsCisJCSAgIHIsCisJCSAgIHItPnJlc19ub2RlaWQsCisJCSAgIHItPnJlc19maXJzdF9sa2lkLAorCQkgICByLT5yZXNfZmxhZ3MsCisJCSAgICFsaXN0X2VtcHR5KCZyLT5yZXNfcm9vdF9saXN0KSwKKwkJICAgIWxpc3RfZW1wdHkoJnItPnJlc19yZWNvdmVyX2xpc3QpLAorCQkgICByLT5yZXNfcmVjb3Zlcl9sb2Nrc19jb3VudCwKKwkJICAgci0+cmVzX2xlbmd0aCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgci0+cmVzX2xlbmd0aDsgaSsrKSB7CisJCWlmICghaXNhc2NpaShyLT5yZXNfbmFtZVtpXSkgfHwgIWlzcHJpbnQoci0+cmVzX25hbWVbaV0pKQorCQkJcHJpbnRfbmFtZSA9IDA7CisJfQorCisJc2VxX3ByaW50ZihzLCAiJXMiLCBwcmludF9uYW1lID8gInN0ciAiIDogImhleCIpOworCisJZm9yIChpID0gMDsgaSA8IHItPnJlc19sZW5ndGg7IGkrKykgeworCQlpZiAocHJpbnRfbmFtZSkKKwkJCXNlcV9wcmludGYocywgIiVjIiwgci0+cmVzX25hbWVbaV0pOworCQllbHNlCisJCQlzZXFfcHJpbnRmKHMsICIgJTAyeCIsICh1bnNpZ25lZCBjaGFyKXItPnJlc19uYW1lW2ldKTsKKwl9CisJc2VxX3ByaW50ZihzLCAiXG4iKTsKKworCWlmICghci0+cmVzX2x2YnB0cikKKwkJZ290byBkb19sb2NrczsKKworCXNlcV9wcmludGYocywgImx2YiAldSAlZCIsIHItPnJlc19sdmJzZXEsIGx2Ymxlbik7CisKKwlmb3IgKGkgPSAwOyBpIDwgbHZibGVuOyBpKyspCisJCXNlcV9wcmludGYocywgIiAlMDJ4IiwgKHVuc2lnbmVkIGNoYXIpci0+cmVzX2x2YnB0cltpXSk7CisJc2VxX3ByaW50ZihzLCAiXG4iKTsKKworIGRvX2xvY2tzOgorCWxpc3RfZm9yX2VhY2hfZW50cnkobGtiLCAmci0+cmVzX2dyYW50cXVldWUsIGxrYl9zdGF0ZXF1ZXVlKQorCQlwcmludF9mb3JtYXQzX2xvY2socywgbGtiLCAwKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkobGtiLCAmci0+cmVzX2NvbnZlcnRxdWV1ZSwgbGtiX3N0YXRlcXVldWUpCisJCXByaW50X2Zvcm1hdDNfbG9jayhzLCBsa2IsIDApOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShsa2IsICZyLT5yZXNfd2FpdHF1ZXVlLCBsa2Jfc3RhdGVxdWV1ZSkKKwkJcHJpbnRfZm9ybWF0M19sb2NrKHMsIGxrYiwgMCk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGxrYiwgJnItPnJlc19sb29rdXAsIGxrYl9yc2JfbG9va3VwKQorCQlwcmludF9mb3JtYXQzX2xvY2socywgbGtiLCAxKTsKIAogCXVubG9ja19yc2Iocik7CiAJcmV0dXJuIDA7CkBAIC0yMzEsNyArMzIwLDcgQEAKIAkJCQlicmVhazsKIAkJCX0KIAkJCXJlYWRfdW5sb2NrKCZscy0+bHNfcnNidGJsW2ldLmxvY2spOwotICAgICAgICAgICAgICAgIH0KKwkJfQogCQlyaS0+ZW50cnkgPSBpOwogCiAJCWlmIChyaS0+ZW50cnkgPj0gbHMtPmxzX3JzYnRibF9zaXplKQpAQCAtMjQ4LDcgKzMzNyw3IEBACiAJCQlyZWFkX3VubG9jaygmbHMtPmxzX3JzYnRibFtpXS5sb2NrKTsKIAkJCWRsbV9wdXRfcnNiKG9sZCk7CiAJCQlnb3RvIHRvcDsKLSAgICAgICAgICAgICAgICB9CisJCX0KIAkJcmktPnJzYiA9IGxpc3RfZW50cnkocmktPm5leHQsIHN0cnVjdCBkbG1fcnNiLCByZXNfaGFzaGNoYWluKTsKIAkJZGxtX2hvbGRfcnNiKHJpLT5yc2IpOwogCQlyZWFkX3VubG9jaygmbHMtPmxzX3JzYnRibFtpXS5sb2NrKTsKQEAgLTI3NCw2ICszNjMsNyBAQAogCXJpLT5scyA9IGxzOwogCXJpLT5lbnRyeSA9IDA7CiAJcmktPm5leHQgPSBOVUxMOworCXJpLT5mb3JtYXQgPSAxOwogCiAJaWYgKHJzYl9pdGVyX25leHQocmkpKSB7CiAJCXJzYl9pdGVyX2ZyZWUocmkpOwpAQCAtMzI1LDE2ICs0MTUsMjYgQEAKIHsKIAlzdHJ1Y3QgcnNiX2l0ZXIgKnJpID0gaXRlcl9wdHI7CiAKLQlpZiAocmktPmxvY2tzKSB7CisJc3dpdGNoIChyaS0+Zm9ybWF0KSB7CisJY2FzZSAxOgorCQlwcmludF9mb3JtYXQxKHJpLT5yc2IsIGZpbGUpOworCQlicmVhazsKKwljYXNlIDI6CiAJCWlmIChyaS0+aGVhZGVyKSB7Ci0JCQlzZXFfcHJpbnRmKGZpbGUsICJpZCBub2RlaWQgcmVtaWQgcGlkIHhpZCBleGZsYWdzIGZsYWdzICIKLQkJCQkJICJzdHMgZ3Jtb2RlIHJxbW9kZSB0aW1lX21zIHJfbm9kZWlkICIKLQkJCQkJICJyX2xlbiByX25hbWVcbiIpOworCQkJc2VxX3ByaW50ZihmaWxlLCAiaWQgbm9kZWlkIHJlbWlkIHBpZCB4aWQgZXhmbGFncyAiCisJCQkJCSAiZmxhZ3Mgc3RzIGdybW9kZSBycW1vZGUgdGltZV9tcyAiCisJCQkJCSAicl9ub2RlaWQgcl9sZW4gcl9uYW1lXG4iKTsKIAkJCXJpLT5oZWFkZXIgPSAwOwogCQl9Ci0JCXByaW50X2xvY2tzKHJpLT5yc2IsIGZpbGUpOwotCX0gZWxzZSB7Ci0JCXByaW50X3Jlc291cmNlKHJpLT5yc2IsIGZpbGUpOworCQlwcmludF9mb3JtYXQyKHJpLT5yc2IsIGZpbGUpOworCQlicmVhazsKKwljYXNlIDM6CisJCWlmIChyaS0+aGVhZGVyKSB7CisJCQlzZXFfcHJpbnRmKGZpbGUsICJ2ZXJzaW9uIHJzYiAxLjEgbHZiIDEuMSBsa2IgMS4xXG4iKTsKKwkJCXJpLT5oZWFkZXIgPSAwOworCQl9CisJCXByaW50X2Zvcm1hdDMocmktPnJzYiwgZmlsZSk7CisJCWJyZWFrOwogCX0KIAogCXJldHVybiAwOwpAQCAtMzg1LDcgKzQ4NSw3IEBACiAJcmktPmxzID0gbHM7CiAJcmktPmVudHJ5ID0gMDsKIAlyaS0+bmV4dCA9IE5VTEw7Ci0JcmktPmxvY2tzID0gMTsKKwlyaS0+Zm9ybWF0ID0gMjsKIAogCWlmICgqcG9zID09IDApCiAJCXJpLT5oZWFkZXIgPSAxOwpAQCAtNDQ4LDYgKzU0OCw4NCBAQAogfTsKIAogLyoKKyAqIER1bXAgYWxsIHJzYi9sdmIvbGtiIHN0YXRlIGluIGNvbXBhY3QgbGlzdGluZywgbW9yZSBjb21wbGV0ZSB0aGFuIF9sb2NrcworICogVGhpcyBjYW4gcmVwbGFjZSBib3RoIGZvcm1hdHMgMSBhbmQgMiBldmVudHVhbGx5LgorICovCisKK3N0YXRpYyBzdHJ1Y3QgcnNiX2l0ZXIgKmFsbF9pdGVyX2luaXQoc3RydWN0IGRsbV9scyAqbHMsIGxvZmZfdCAqcG9zKQoreworCXN0cnVjdCByc2JfaXRlciAqcmk7CisKKwlyaSA9IGt6YWxsb2Moc2l6ZW9mICpyaSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFyaSkKKwkJcmV0dXJuIE5VTEw7CisKKwlyaS0+bHMgPSBsczsKKwlyaS0+ZW50cnkgPSAwOworCXJpLT5uZXh0ID0gTlVMTDsKKwlyaS0+Zm9ybWF0ID0gMzsKKworCWlmICgqcG9zID09IDApCisJCXJpLT5oZWFkZXIgPSAxOworCisJaWYgKHJzYl9pdGVyX25leHQocmkpKSB7CisJCXJzYl9pdGVyX2ZyZWUocmkpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlyZXR1cm4gcmk7Cit9CisKK3N0YXRpYyB2b2lkICphbGxfc2VxX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqZmlsZSwgbG9mZl90ICpwb3MpCit7CisJc3RydWN0IHJzYl9pdGVyICpyaTsKKwlsb2ZmX3QgbiA9ICpwb3M7CisKKwlyaSA9IGFsbF9pdGVyX2luaXQoZmlsZS0+cHJpdmF0ZSwgcG9zKTsKKwlpZiAoIXJpKQorCQlyZXR1cm4gTlVMTDsKKworCXdoaWxlIChuLS0pIHsKKwkJaWYgKHJzYl9pdGVyX25leHQocmkpKSB7CisJCQlyc2JfaXRlcl9mcmVlKHJpKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJfQorCisJcmV0dXJuIHJpOworfQorCitzdGF0aWMgc3RydWN0IHNlcV9vcGVyYXRpb25zIGFsbF9zZXFfb3BzID0geworCS5zdGFydCA9IGFsbF9zZXFfc3RhcnQsCisJLm5leHQgID0gcnNiX3NlcV9uZXh0LAorCS5zdG9wICA9IHJzYl9zZXFfc3RvcCwKKwkuc2hvdyAgPSByc2Jfc2VxX3Nob3csCit9OworCitzdGF0aWMgaW50IGFsbF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBzZXFfZmlsZSAqc2VxOworCWludCByZXQ7CisKKwlyZXQgPSBzZXFfb3BlbihmaWxlLCAmYWxsX3NlcV9vcHMpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlzZXEgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc2VxLT5wcml2YXRlID0gaW5vZGUtPmlfcHJpdmF0ZTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhbGxfZm9wcyA9IHsKKwkub3duZXIgICA9IFRISVNfTU9EVUxFLAorCS5vcGVuICAgID0gYWxsX29wZW4sCisJLnJlYWQgICAgPSBzZXFfcmVhZCwKKwkubGxzZWVrICA9IHNlcV9sc2VlaywKKwkucmVsZWFzZSA9IHNlcV9yZWxlYXNlCit9OworCisvKgogICogZHVtcCBsa2IncyBvbiB0aGUgbHNfd2FpdGVycyBsaXN0CiAgKi8KIApAQCAtNDg5LDMwICs2NjcsMzMgQEAKIAkucmVhZCAgICA9IHdhaXRlcnNfcmVhZAogfTsKIAordm9pZCBkbG1fZGVsZXRlX2RlYnVnX2ZpbGUoc3RydWN0IGRsbV9scyAqbHMpCit7CisJaWYgKGxzLT5sc19kZWJ1Z19yc2JfZGVudHJ5KQorCQlkZWJ1Z2ZzX3JlbW92ZShscy0+bHNfZGVidWdfcnNiX2RlbnRyeSk7CisJaWYgKGxzLT5sc19kZWJ1Z193YWl0ZXJzX2RlbnRyeSkKKwkJZGVidWdmc19yZW1vdmUobHMtPmxzX2RlYnVnX3dhaXRlcnNfZGVudHJ5KTsKKwlpZiAobHMtPmxzX2RlYnVnX2xvY2tzX2RlbnRyeSkKKwkJZGVidWdmc19yZW1vdmUobHMtPmxzX2RlYnVnX2xvY2tzX2RlbnRyeSk7CisJaWYgKGxzLT5sc19kZWJ1Z19hbGxfZGVudHJ5KQorCQlkZWJ1Z2ZzX3JlbW92ZShscy0+bHNfZGVidWdfYWxsX2RlbnRyeSk7Cit9CisKIGludCBkbG1fY3JlYXRlX2RlYnVnX2ZpbGUoc3RydWN0IGRsbV9scyAqbHMpCiB7CiAJY2hhciBuYW1lW0RMTV9MT0NLU1BBQ0VfTEVOKzhdOwogCisJLyogZm9ybWF0IDEgKi8KKwogCWxzLT5sc19kZWJ1Z19yc2JfZGVudHJ5ID0gZGVidWdmc19jcmVhdGVfZmlsZShscy0+bHNfbmFtZSwKIAkJCQkJCSAgICAgIFNfSUZSRUcgfCBTX0lSVUdPLAogCQkJCQkJICAgICAgZGxtX3Jvb3QsCiAJCQkJCQkgICAgICBscywKIAkJCQkJCSAgICAgICZyc2JfZm9wcyk7CiAJaWYgKCFscy0+bHNfZGVidWdfcnNiX2RlbnRyeSkKLQkJcmV0dXJuIC1FTk9NRU07CisJCWdvdG8gZmFpbDsKIAotCW1lbXNldChuYW1lLCAwLCBzaXplb2YobmFtZSkpOwotCXNucHJpbnRmKG5hbWUsIERMTV9MT0NLU1BBQ0VfTEVOKzgsICIlc193YWl0ZXJzIiwgbHMtPmxzX25hbWUpOwotCi0JbHMtPmxzX2RlYnVnX3dhaXRlcnNfZGVudHJ5ID0gZGVidWdmc19jcmVhdGVfZmlsZShuYW1lLAotCQkJCQkJCSAgU19JRlJFRyB8IFNfSVJVR08sCi0JCQkJCQkJICBkbG1fcm9vdCwKLQkJCQkJCQkgIGxzLAotCQkJCQkJCSAgJndhaXRlcnNfZm9wcyk7Ci0JaWYgKCFscy0+bHNfZGVidWdfd2FpdGVyc19kZW50cnkpIHsKLQkJZGVidWdmc19yZW1vdmUobHMtPmxzX2RlYnVnX3JzYl9kZW50cnkpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9CisJLyogZm9ybWF0IDIgKi8KIAogCW1lbXNldChuYW1lLCAwLCBzaXplb2YobmFtZSkpOwogCXNucHJpbnRmKG5hbWUsIERMTV9MT0NLU1BBQ0VfTEVOKzgsICIlc19sb2NrcyIsIGxzLT5sc19uYW1lKTsKQEAgLTUyMiwyMyArNzAzLDM4IEBACiAJCQkJCQkJZGxtX3Jvb3QsCiAJCQkJCQkJbHMsCiAJCQkJCQkJJmxvY2tzX2ZvcHMpOwotCWlmICghbHMtPmxzX2RlYnVnX2xvY2tzX2RlbnRyeSkgewotCQlkZWJ1Z2ZzX3JlbW92ZShscy0+bHNfZGVidWdfd2FpdGVyc19kZW50cnkpOwotCQlkZWJ1Z2ZzX3JlbW92ZShscy0+bHNfZGVidWdfcnNiX2RlbnRyeSk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KKwlpZiAoIWxzLT5sc19kZWJ1Z19sb2Nrc19kZW50cnkpCisJCWdvdG8gZmFpbDsKKworCS8qIGZvcm1hdCAzICovCisKKwltZW1zZXQobmFtZSwgMCwgc2l6ZW9mKG5hbWUpKTsKKwlzbnByaW50ZihuYW1lLCBETE1fTE9DS1NQQUNFX0xFTis4LCAiJXNfYWxsIiwgbHMtPmxzX25hbWUpOworCisJbHMtPmxzX2RlYnVnX2FsbF9kZW50cnkgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKG5hbWUsCisJCQkJCQkgICAgICBTX0lGUkVHIHwgU19JUlVHTywKKwkJCQkJCSAgICAgIGRsbV9yb290LAorCQkJCQkJICAgICAgbHMsCisJCQkJCQkgICAgICAmYWxsX2ZvcHMpOworCWlmICghbHMtPmxzX2RlYnVnX2FsbF9kZW50cnkpCisJCWdvdG8gZmFpbDsKKworCW1lbXNldChuYW1lLCAwLCBzaXplb2YobmFtZSkpOworCXNucHJpbnRmKG5hbWUsIERMTV9MT0NLU1BBQ0VfTEVOKzgsICIlc193YWl0ZXJzIiwgbHMtPmxzX25hbWUpOworCisJbHMtPmxzX2RlYnVnX3dhaXRlcnNfZGVudHJ5ID0gZGVidWdmc19jcmVhdGVfZmlsZShuYW1lLAorCQkJCQkJCSAgU19JRlJFRyB8IFNfSVJVR08sCisJCQkJCQkJICBkbG1fcm9vdCwKKwkJCQkJCQkgIGxzLAorCQkJCQkJCSAgJndhaXRlcnNfZm9wcyk7CisJaWYgKCFscy0+bHNfZGVidWdfd2FpdGVyc19kZW50cnkpCisJCWdvdG8gZmFpbDsKIAogCXJldHVybiAwOwotfQogCi12b2lkIGRsbV9kZWxldGVfZGVidWdfZmlsZShzdHJ1Y3QgZGxtX2xzICpscykKLXsKLQlpZiAobHMtPmxzX2RlYnVnX3JzYl9kZW50cnkpCi0JCWRlYnVnZnNfcmVtb3ZlKGxzLT5sc19kZWJ1Z19yc2JfZGVudHJ5KTsKLQlpZiAobHMtPmxzX2RlYnVnX3dhaXRlcnNfZGVudHJ5KQotCQlkZWJ1Z2ZzX3JlbW92ZShscy0+bHNfZGVidWdfd2FpdGVyc19kZW50cnkpOwotCWlmIChscy0+bHNfZGVidWdfbG9ja3NfZGVudHJ5KQotCQlkZWJ1Z2ZzX3JlbW92ZShscy0+bHNfZGVidWdfbG9ja3NfZGVudHJ5KTsKKyBmYWlsOgorCWRsbV9kZWxldGVfZGVidWdfZmlsZShscyk7CisJcmV0dXJuIC1FTk9NRU07CiB9CiAKIGludCBfX2luaXQgZGxtX3JlZ2lzdGVyX2RlYnVnZnModm9pZCkKZGlmZiAtLWdpdCBhL2ZzL2RsbS9kaXIuYyBiL2ZzL2RsbS9kaXIuYwppbmRleCA4NWRlZmViLi45Mjk2OWY4IDEwMDY0NAotLS0gYS9mcy9kbG0vZGlyLmMKKysrIGIvZnMvZGxtL2Rpci5jCkBAIC0zNzQsNyArMzc0LDcgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0OwogCXN0cnVjdCBkbG1fcnNiICpyOwogCWludCBvZmZzZXQgPSAwLCBkaXJfbm9kZWlkOwotCXVpbnQxNl90IGJlX25hbWVsZW47CisJX19iZTE2IGJlX25hbWVsZW47CiAKIAlkb3duX3JlYWQoJmxzLT5sc19yb290X3NlbSk7CiAKQEAgLTQxMCwxNSArNDEwLDE1IEBACiAKIAkJaWYgKG9mZnNldCArIHNpemVvZih1aW50MTZfdCkqMiArIHItPnJlc19sZW5ndGggPiBvdXRsZW4pIHsKIAkJCS8qIFdyaXRlIGVuZC1vZi1ibG9jayByZWNvcmQgKi8KLQkJCWJlX25hbWVsZW4gPSAwOwotCQkJbWVtY3B5KG91dGJ1ZiArIG9mZnNldCwgJmJlX25hbWVsZW4sIHNpemVvZih1aW50MTZfdCkpOwotCQkJb2Zmc2V0ICs9IHNpemVvZih1aW50MTZfdCk7CisJCQliZV9uYW1lbGVuID0gY3B1X3RvX2JlMTYoMCk7CisJCQltZW1jcHkob3V0YnVmICsgb2Zmc2V0LCAmYmVfbmFtZWxlbiwgc2l6ZW9mKF9fYmUxNikpOworCQkJb2Zmc2V0ICs9IHNpemVvZihfX2JlMTYpOwogCQkJZ290byBvdXQ7CiAJCX0KIAogCQliZV9uYW1lbGVuID0gY3B1X3RvX2JlMTYoci0+cmVzX2xlbmd0aCk7Ci0JCW1lbWNweShvdXRidWYgKyBvZmZzZXQsICZiZV9uYW1lbGVuLCBzaXplb2YodWludDE2X3QpKTsKLQkJb2Zmc2V0ICs9IHNpemVvZih1aW50MTZfdCk7CisJCW1lbWNweShvdXRidWYgKyBvZmZzZXQsICZiZV9uYW1lbGVuLCBzaXplb2YoX19iZTE2KSk7CisJCW9mZnNldCArPSBzaXplb2YoX19iZTE2KTsKIAkJbWVtY3B5KG91dGJ1ZiArIG9mZnNldCwgci0+cmVzX25hbWUsIHItPnJlc19sZW5ndGgpOwogCQlvZmZzZXQgKz0gci0+cmVzX2xlbmd0aDsKIAl9CkBAIC00MzAsOSArNDMwLDkgQEAKIAogCWlmICgobGlzdCA9PSAmbHMtPmxzX3Jvb3RfbGlzdCkgJiYKIAkgICAgKG9mZnNldCArIHNpemVvZih1aW50MTZfdCkgPD0gb3V0bGVuKSkgewotCQliZV9uYW1lbGVuID0gMHhGRkZGOwotCQltZW1jcHkob3V0YnVmICsgb2Zmc2V0LCAmYmVfbmFtZWxlbiwgc2l6ZW9mKHVpbnQxNl90KSk7Ci0JCW9mZnNldCArPSBzaXplb2YodWludDE2X3QpOworCQliZV9uYW1lbGVuID0gY3B1X3RvX2JlMTYoMHhGRkZGKTsKKwkJbWVtY3B5KG91dGJ1ZiArIG9mZnNldCwgJmJlX25hbWVsZW4sIHNpemVvZihfX2JlMTYpKTsKKwkJb2Zmc2V0ICs9IHNpemVvZihfX2JlMTYpOwogCX0KIAogIG91dDoKZGlmZiAtLWdpdCBhL2ZzL2RsbS9kbG1faW50ZXJuYWwuaCBiL2ZzL2RsbS9kbG1faW50ZXJuYWwuaAppbmRleCA4NjhlNGM5Li5lZjJmMWUzIDEwMDY0NAotLS0gYS9mcy9kbG0vZGxtX2ludGVybmFsLmgKKysrIGIvZnMvZGxtL2RsbV9pbnRlcm5hbC5oCkBAIC0yNDUsNyArMjQ1LDggQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkCWxrYl9hc3RxdWV1ZTsJLyogbmVlZCBhc3QgdG8gYmUgc2VudCAqLwogCXN0cnVjdCBsaXN0X2hlYWQJbGtiX293bnF1ZXVlOwkvKiBsaXN0IG9mIGxvY2tzIGZvciBhIHByb2Nlc3MgKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkCWxrYl90aW1lX2xpc3Q7Ci0JdW5zaWduZWQgbG9uZwkJbGtiX3RpbWVzdGFtcDsKKwlrdGltZV90CQkJbGtiX3RpbWVfYmFzdDsJLyogZm9yIGRlYnVnZ2luZyAqLworCWt0aW1lX3QJCQlsa2JfdGltZXN0YW1wOwogCXVuc2lnbmVkIGxvbmcJCWxrYl90aW1lb3V0X2NzOwogCiAJY2hhcgkJCSpsa2JfbHZicHRyOwpAQCAtNDgxLDYgKzQ4Miw3IEBACiAJc3RydWN0IGRlbnRyeQkJKmxzX2RlYnVnX3JzYl9kZW50cnk7IC8qIGRlYnVnZnMgKi8KIAlzdHJ1Y3QgZGVudHJ5CQkqbHNfZGVidWdfd2FpdGVyc19kZW50cnk7IC8qIGRlYnVnZnMgKi8KIAlzdHJ1Y3QgZGVudHJ5CQkqbHNfZGVidWdfbG9ja3NfZGVudHJ5OyAvKiBkZWJ1Z2ZzICovCisJc3RydWN0IGRlbnRyeQkJKmxzX2RlYnVnX2FsbF9kZW50cnk7IC8qIGRlYnVnZnMgKi8KIAogCXdhaXRfcXVldWVfaGVhZF90CWxzX3VldmVudF93YWl0OwkvKiB1c2VyIHBhcnQgb2Ygam9pbi9sZWF2ZSAqLwogCWludAkJCWxzX3VldmVudF9yZXN1bHQ7CmRpZmYgLS1naXQgYS9mcy9kbG0vbG9jay5jIGIvZnMvZGxtL2xvY2suYwppbmRleCA3MjRkZGFjLi42Y2ZlNjViIDEwMDY0NAotLS0gYS9mcy9kbG0vbG9jay5jCisrKyBiL2ZzL2RsbS9sb2NrLmMKQEAgLTMwNyw3ICszMDcsNyBAQAogCWxrYi0+bGtiX2xrc2ItPnNiX3N0YXR1cyA9IHJ2OwogCWxrYi0+bGtiX2xrc2ItPnNiX2ZsYWdzID0gbGtiLT5sa2Jfc2JmbGFnczsKIAotCWRsbV9hZGRfYXN0KGxrYiwgQVNUX0NPTVApOworCWRsbV9hZGRfYXN0KGxrYiwgQVNUX0NPTVAsIDApOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgcXVldWVfY2FzdF9vdmVybGFwKHN0cnVjdCBkbG1fcnNiICpyLCBzdHJ1Y3QgZGxtX2xrYiAqbGtiKQpAQCAtMzE4LDEyICszMTgsMTIgQEAKIAogc3RhdGljIHZvaWQgcXVldWVfYmFzdChzdHJ1Y3QgZGxtX3JzYiAqciwgc3RydWN0IGRsbV9sa2IgKmxrYiwgaW50IHJxbW9kZSkKIHsKKwlsa2ItPmxrYl90aW1lX2Jhc3QgPSBrdGltZV9nZXQoKTsKKwogCWlmIChpc19tYXN0ZXJfY29weShsa2IpKQogCQlzZW5kX2Jhc3QociwgbGtiLCBycW1vZGUpOwotCWVsc2UgewotCQlsa2ItPmxrYl9iYXN0bW9kZSA9IHJxbW9kZTsKLQkJZGxtX2FkZF9hc3QobGtiLCBBU1RfQkFTVCk7Ci0JfQorCWVsc2UKKwkJZGxtX2FkZF9hc3QobGtiLCBBU1RfQkFTVCwgcnFtb2RlKTsKIH0KIAogLyoKQEAgLTc0NCw2ICs3NDQsOCBAQAogCiAJRExNX0FTU0VSVCghbGtiLT5sa2Jfc3RhdHVzLCBkbG1fcHJpbnRfbGtiKGxrYik7KTsKIAorCWxrYi0+bGtiX3RpbWVzdGFtcCA9IGt0aW1lX2dldCgpOworCiAJbGtiLT5sa2Jfc3RhdHVzID0gc3RhdHVzOwogCiAJc3dpdGNoIChzdGF0dXMpIHsKQEAgLTEwMTMsMTAgKzEwMTUsOCBAQAogewogCXN0cnVjdCBkbG1fbHMgKmxzID0gbGtiLT5sa2JfcmVzb3VyY2UtPnJlc19sczsKIAotCWlmIChpc19tYXN0ZXJfY29weShsa2IpKSB7Ci0JCWxrYi0+bGtiX3RpbWVzdGFtcCA9IGppZmZpZXM7CisJaWYgKGlzX21hc3Rlcl9jb3B5KGxrYikpCiAJCXJldHVybjsKLQl9CiAKIAlpZiAodGVzdF9iaXQoTFNGTF9USU1FV0FSTiwgJmxzLT5sc19mbGFncykgJiYKIAkgICAgIShsa2ItPmxrYl9leGZsYWdzICYgRExNX0xLRl9OT0RMQ0tXVCkpIHsKQEAgLTEwMzEsNyArMTAzMSw2IEBACiAJRExNX0FTU0VSVChsaXN0X2VtcHR5KCZsa2ItPmxrYl90aW1lX2xpc3QpLCBkbG1fcHJpbnRfbGtiKGxrYik7KTsKIAltdXRleF9sb2NrKCZscy0+bHNfdGltZW91dF9tdXRleCk7CiAJaG9sZF9sa2IobGtiKTsKLQlsa2ItPmxrYl90aW1lc3RhbXAgPSBqaWZmaWVzOwogCWxpc3RfYWRkX3RhaWwoJmxrYi0+bGtiX3RpbWVfbGlzdCwgJmxzLT5sc190aW1lb3V0KTsKIAltdXRleF91bmxvY2soJmxzLT5sc190aW1lb3V0X211dGV4KTsKIH0KQEAgLTEwNTksNiArMTA1OCw3IEBACiAJc3RydWN0IGRsbV9yc2IgKnI7CiAJc3RydWN0IGRsbV9sa2IgKmxrYjsKIAlpbnQgZG9fY2FuY2VsLCBkb193YXJuOworCXM2NCB3YWl0X3VzOwogCiAJZm9yICg7OykgewogCQlpZiAoZGxtX2xvY2tpbmdfc3RvcHBlZChscykpCkBAIC0xMDY5LDE0ICsxMDY5LDE1IEBACiAJCW11dGV4X2xvY2soJmxzLT5sc190aW1lb3V0X211dGV4KTsKIAkJbGlzdF9mb3JfZWFjaF9lbnRyeShsa2IsICZscy0+bHNfdGltZW91dCwgbGtiX3RpbWVfbGlzdCkgewogCisJCQl3YWl0X3VzID0ga3RpbWVfdG9fdXMoa3RpbWVfc3ViKGt0aW1lX2dldCgpLAorCQkJCQkgICAgICAJCWxrYi0+bGtiX3RpbWVzdGFtcCkpOworCiAJCQlpZiAoKGxrYi0+bGtiX2V4ZmxhZ3MgJiBETE1fTEtGX1RJTUVPVVQpICYmCi0JCQkgICAgdGltZV9hZnRlcl9lcShqaWZmaWVzLCBsa2ItPmxrYl90aW1lc3RhbXAgKwotCQkJCQkgIGxrYi0+bGtiX3RpbWVvdXRfY3MgKiBIWi8xMDApKQorCQkJICAgIHdhaXRfdXMgPj0gKGxrYi0+bGtiX3RpbWVvdXRfY3MgKiAxMDAwMCkpCiAJCQkJZG9fY2FuY2VsID0gMTsKIAogCQkJaWYgKChsa2ItPmxrYl9mbGFncyAmIERMTV9JRkxfV0FUQ0hfVElNRVdBUk4pICYmCi0JCQkgICAgdGltZV9hZnRlcl9lcShqaWZmaWVzLCBsa2ItPmxrYl90aW1lc3RhbXAgKwotCQkJCSAgIAkgICBkbG1fY29uZmlnLmNpX3RpbWV3YXJuX2NzICogSFovMTAwKSkKKwkJCSAgICB3YWl0X3VzID49IGRsbV9jb25maWcuY2lfdGltZXdhcm5fY3MgKiAxMDAwMCkKIAkJCQlkb193YXJuID0gMTsKIAogCQkJaWYgKCFkb19jYW5jZWwgJiYgIWRvX3dhcm4pCkBAIC0xMTIyLDEyICsxMTIzLDEyIEBACiB2b2lkIGRsbV9hZGp1c3RfdGltZW91dHMoc3RydWN0IGRsbV9scyAqbHMpCiB7CiAJc3RydWN0IGRsbV9sa2IgKmxrYjsKLQlsb25nIGFkaiA9IGppZmZpZXMgLSBscy0+bHNfcmVjb3Zlcl9iZWdpbjsKKwl1NjQgYWRqX3VzID0gamlmZmllc190b191c2VjcyhqaWZmaWVzIC0gbHMtPmxzX3JlY292ZXJfYmVnaW4pOwogCiAJbHMtPmxzX3JlY292ZXJfYmVnaW4gPSAwOwogCW11dGV4X2xvY2soJmxzLT5sc190aW1lb3V0X211dGV4KTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGxrYiwgJmxzLT5sc190aW1lb3V0LCBsa2JfdGltZV9saXN0KQotCQlsa2ItPmxrYl90aW1lc3RhbXAgKz0gYWRqOworCQlsa2ItPmxrYl90aW1lc3RhbXAgPSBrdGltZV9hZGRfdXMobGtiLT5sa2JfdGltZXN0YW1wLCBhZGpfdXMpOwogCW11dGV4X3VubG9jaygmbHMtPmxzX3RpbWVvdXRfbXV0ZXgpOwogfQogCmRpZmYgLS1naXQgYS9mcy9kbG0vbG93Y29tbXMuYyBiL2ZzL2RsbS9sb3djb21tcy5jCmluZGV4IDM5NjIyNjIuLjEwM2E1ZWIgMTAwNjQ0Ci0tLSBhL2ZzL2RsbS9sb3djb21tcy5jCisrKyBiL2ZzL2RsbS9sb3djb21tcy5jCkBAIC0yOTUsNiArMjk1LDcgQEAKIAljb24tPnNvY2stPnNrLT5za193cml0ZV9zcGFjZSA9IGxvd2NvbW1zX3dyaXRlX3NwYWNlOwogCWNvbi0+c29jay0+c2stPnNrX3N0YXRlX2NoYW5nZSA9IGxvd2NvbW1zX3N0YXRlX2NoYW5nZTsKIAljb24tPnNvY2stPnNrLT5za191c2VyX2RhdGEgPSBjb247CisJY29uLT5zb2NrLT5zay0+c2tfYWxsb2NhdGlvbiA9IEdGUF9OT0ZTOwogCXJldHVybiAwOwogfQogCkBAIC04MjMsNyArODI0LDYgQEAKIAlsZW4gPSBlLT5sZW47CiAJb2Zmc2V0ID0gZS0+b2Zmc2V0OwogCXNwaW5fdW5sb2NrKCZjb24tPndyaXRlcXVldWVfbG9jayk7Ci0Ja21hcChlLT5wYWdlKTsKIAogCS8qIFNlbmQgdGhlIGZpcnN0IGJsb2NrIG9mZiB0aGUgd3JpdGUgcXVldWUgKi8KIAlpb3ZbMF0uaW92X2Jhc2UgPSBwYWdlX2FkZHJlc3MoZS0+cGFnZSkrb2Zmc2V0OwpAQCAtODU0LDcgKzg1NCw2IEBACiAKIAkJaWYgKGUtPmxlbiA9PSAwICYmIGUtPnVzZXJzID09IDApIHsKIAkJCWxpc3RfZGVsKCZlLT5saXN0KTsKLQkJCWt1bm1hcChlLT5wYWdlKTsKIAkJCWZyZWVfZW50cnkoZSk7CiAJCX0KIAkJc3Bpbl91bmxvY2soJmNvbi0+d3JpdGVxdWV1ZV9sb2NrKTsKQEAgLTEyMDMsOCArMTIwMiw2IEBACiAKIAlpZiAoZSkgewogCWdvdF9vbmU6Ci0JCWlmICh1c2VycyA9PSAwKQotCQkJa21hcChlLT5wYWdlKTsKIAkJKnBwYyA9IHBhZ2VfYWRkcmVzcyhlLT5wYWdlKSArIG9mZnNldDsKIAkJcmV0dXJuIGU7CiAJfQpAQCAtMTIzMyw3ICsxMjMwLDYgQEAKIAlpZiAodXNlcnMpCiAJCWdvdG8gb3V0OwogCWUtPmxlbiA9IGUtPmVuZCAtIGUtPm9mZnNldDsKLQlrdW5tYXAoZS0+cGFnZSk7CiAJc3Bpbl91bmxvY2soJmNvbi0+d3JpdGVxdWV1ZV9sb2NrKTsKIAogCWlmICghdGVzdF9hbmRfc2V0X2JpdChDRl9XUklURV9QRU5ESU5HLCAmY29uLT5mbGFncykpIHsKQEAgLTEyNzIsNyArMTI2OCw2IEBACiAJCW9mZnNldCA9IGUtPm9mZnNldDsKIAkJQlVHX09OKGxlbiA9PSAwICYmIGUtPnVzZXJzID09IDApOwogCQlzcGluX3VubG9jaygmY29uLT53cml0ZXF1ZXVlX2xvY2spOwotCQlrbWFwKGUtPnBhZ2UpOwogCiAJCXJldCA9IDA7CiAJCWlmIChsZW4pIHsKQEAgLTEyOTQsNyArMTI4OSw2IEBACiAKIAkJaWYgKGUtPmxlbiA9PSAwICYmIGUtPnVzZXJzID09IDApIHsKIAkJCWxpc3RfZGVsKCZlLT5saXN0KTsKLQkJCWt1bm1hcChlLT5wYWdlKTsKIAkJCWZyZWVfZW50cnkoZSk7CiAJCQljb250aW51ZTsKIAkJfQpkaWZmIC0tZ2l0IGEvZnMvZGxtL21lbW9yeS5jIGIvZnMvZGxtL21lbW9yeS5jCmluZGV4IDU0YzE0YzYuLmMxNzc1YjggMTAwNjQ0Ci0tLSBhL2ZzL2RsbS9tZW1vcnkuYworKysgYi9mcy9kbG0vbWVtb3J5LmMKQEAgLTM5LDcgKzM5LDcgQEAKIHsKIAljaGFyICpwOwogCi0JcCA9IGt6YWxsb2MobHMtPmxzX2x2YmxlbiwgR0ZQX0tFUk5FTCk7CisJcCA9IGt6YWxsb2MobHMtPmxzX2x2YmxlbiwgbHMtPmxzX2FsbG9jYXRpb24pOwogCXJldHVybiBwOwogfQogCkBAIC01Nyw3ICs1Nyw3IEBACiAKIAlETE1fQVNTRVJUKG5hbWVsZW4gPD0gRExNX1JFU05BTUVfTUFYTEVOLCk7CiAKLQlyID0ga3phbGxvYyhzaXplb2YoKnIpICsgbmFtZWxlbiwgR0ZQX0tFUk5FTCk7CisJciA9IGt6YWxsb2Moc2l6ZW9mKCpyKSArIG5hbWVsZW4sIGxzLT5sc19hbGxvY2F0aW9uKTsKIAlyZXR1cm4gcjsKIH0KIApAQCAtNzIsNyArNzIsNyBAQAogewogCXN0cnVjdCBkbG1fbGtiICpsa2I7CiAKLQlsa2IgPSBrbWVtX2NhY2hlX3phbGxvYyhsa2JfY2FjaGUsIEdGUF9LRVJORUwpOworCWxrYiA9IGttZW1fY2FjaGVfemFsbG9jKGxrYl9jYWNoZSwgbHMtPmxzX2FsbG9jYXRpb24pOwogCXJldHVybiBsa2I7CiB9CiAKZGlmZiAtLWdpdCBhL2ZzL2RsbS9taWRjb21tcy5jIGIvZnMvZGxtL21pZGNvbW1zLmMKaW5kZXggMDdhYzcwOS4uZjMzOTZjNiAxMDA2NDQKLS0tIGEvZnMvZGxtL21pZGNvbW1zLmMKKysrIGIvZnMvZGxtL21pZGNvbW1zLmMKQEAgLTExMiw3ICsxMTIsNyBAQAogCQkgICBvcmRpbmFyeSBtZXNzYWdlcykuICovCiAKIAkJaWYgKG1zZ2xlbiA+IHNpemVvZihfX3RtcCkgJiYgcCA9PSAmX190bXAucCkgewotCQkJcCA9IGttYWxsb2MoZGxtX2NvbmZpZy5jaV9idWZmZXJfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJCQlwID0ga21hbGxvYyhkbG1fY29uZmlnLmNpX2J1ZmZlcl9zaXplLCBHRlBfTk9GUyk7CiAJCQlpZiAocCA9PSBOVUxMKQogCQkJCXJldHVybiByZXQ7CiAJCX0KZGlmZiAtLWdpdCBhL2ZzL2RsbS9uZXRsaW5rLmMgYi9mcy9kbG0vbmV0bGluay5jCmluZGV4IGFhMmE1NzcuLmNjYzlkNjIgMTAwNjQ0Ci0tLSBhL2ZzL2RsbS9uZXRsaW5rLmMKKysrIGIvZnMvZGxtL25ldGxpbmsuYwpAQCAtMTE1LDcgKzExNSw2IEBACiAJZGF0YS0+c3RhdHVzID0gbGtiLT5sa2Jfc3RhdHVzOwogCWRhdGEtPmdybW9kZSA9IGxrYi0+bGtiX2dybW9kZTsKIAlkYXRhLT5ycW1vZGUgPSBsa2ItPmxrYl9ycW1vZGU7Ci0JZGF0YS0+dGltZXN0YW1wID0gbGtiLT5sa2JfdGltZXN0YW1wOwogCWlmIChsa2ItPmxrYl91YSkKIAkJZGF0YS0+eGlkID0gbGtiLT5sa2JfdWEtPnhpZDsKIAlpZiAocikgewpkaWZmIC0tZ2l0IGEvZnMvZGxtL3VzZXIuYyBiL2ZzL2RsbS91c2VyLmMKaW5kZXggYjM4MzJjNi4uMDY1MTQ5ZSAxMDA2NDQKLS0tIGEvZnMvZGxtL3VzZXIuYworKysgYi9mcy9kbG0vdXNlci5jCkBAIC0xNzUsNyArMTc1LDcgQEAKIC8qIHdlIGNvdWxkIHBvc3NpYmx5IGNoZWNrIGlmIHRoZSBjYW5jZWwgb2YgYW4gb3JwaGFuIGhhcyByZXN1bHRlZCBpbiB0aGUgbGtiCiAgICBiZWluZyByZW1vdmVkIGFuZCB0aGVuIHJlbW92ZSB0aGF0IGxrYiBmcm9tIHRoZSBvcnBoYW5zIGxpc3QgYW5kIGZyZWUgaXQgKi8KIAotdm9pZCBkbG1fdXNlcl9hZGRfYXN0KHN0cnVjdCBkbG1fbGtiICpsa2IsIGludCB0eXBlKQordm9pZCBkbG1fdXNlcl9hZGRfYXN0KHN0cnVjdCBkbG1fbGtiICpsa2IsIGludCB0eXBlLCBpbnQgYmFzdG1vZGUpCiB7CiAJc3RydWN0IGRsbV9scyAqbHM7CiAJc3RydWN0IGRsbV91c2VyX2FyZ3MgKnVhOwpAQCAtMjA4LDYgKzIwOCw4IEBACiAKIAlhc3RfdHlwZSA9IGxrYi0+bGtiX2FzdF90eXBlOwogCWxrYi0+bGtiX2FzdF90eXBlIHw9IHR5cGU7CisJaWYgKGJhc3Rtb2RlKQorCQlsa2ItPmxrYl9iYXN0bW9kZSA9IGJhc3Rtb2RlOwogCiAJaWYgKCFhc3RfdHlwZSkgewogCQlrcmVmX2dldCgmbGtiLT5sa2JfcmVmKTsKZGlmZiAtLWdpdCBhL2ZzL2RsbS91c2VyLmggYi9mcy9kbG0vdXNlci5oCmluZGV4IDM1ZWI2YTEuLjFjOTY4NjQgMTAwNjQ0Ci0tLSBhL2ZzL2RsbS91c2VyLmgKKysrIGIvZnMvZGxtL3VzZXIuaApAQCAtOSw3ICs5LDcgQEAKICNpZm5kZWYgX19VU0VSX0RPVF9IX18KICNkZWZpbmUgX19VU0VSX0RPVF9IX18KIAotdm9pZCBkbG1fdXNlcl9hZGRfYXN0KHN0cnVjdCBkbG1fbGtiICpsa2IsIGludCB0eXBlKTsKK3ZvaWQgZGxtX3VzZXJfYWRkX2FzdChzdHJ1Y3QgZGxtX2xrYiAqbGtiLCBpbnQgdHlwZSwgaW50IGJhc3Rtb2RlKTsKIGludCBkbG1fdXNlcl9pbml0KHZvaWQpOwogdm9pZCBkbG1fdXNlcl9leGl0KHZvaWQpOwogaW50IGRsbV9kZXZpY2VfZGVyZWdpc3RlcihzdHJ1Y3QgZGxtX2xzICpscyk7CmRpZmYgLS1naXQgYS9mcy9kcXVvdC5jIGIvZnMvZHF1b3QuYwppbmRleCBjMjM3Y2NjLi40OGMwNTcxIDEwMDY0NAotLS0gYS9mcy9kcXVvdC5jCisrKyBiL2ZzL2RxdW90LmMKQEAgLTIxMSw4ICsyMTEsNiBAQAogCiBzdHJ1Y3QgZHFzdGF0cyBkcXN0YXRzOwogCi1zdGF0aWMgdm9pZCBkcXB1dChzdHJ1Y3QgZHF1b3QgKmRxdW90KTsKLQogc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQKIGhhc2hmbihjb25zdCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB1bnNpZ25lZCBpbnQgaWQsIGludCB0eXBlKQogewpAQCAtNDE1LDYgKzQxMywxNyBAQAogCXJldHVybiByZXQ7CiB9CiAKK3ZvaWQgZHF1b3RfZGVzdHJveShzdHJ1Y3QgZHF1b3QgKmRxdW90KQoreworCWttZW1fY2FjaGVfZnJlZShkcXVvdF9jYWNoZXAsIGRxdW90KTsKK30KK0VYUE9SVF9TWU1CT0woZHF1b3RfZGVzdHJveSk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkb19kZXN0cm95X2RxdW90KHN0cnVjdCBkcXVvdCAqZHF1b3QpCit7CisJZHF1b3QtPmRxX3NiLT5kcV9vcC0+ZGVzdHJveV9kcXVvdChkcXVvdCk7Cit9CisKIC8qIEludmFsaWRhdGUgYWxsIGRxdW90cyBvbiB0aGUgbGlzdC4gTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGFmdGVyCiAgKiBxdW90YSBpcyBkaXNhYmxlZCBhbmQgcG9pbnRlcnMgZnJvbSBpbm9kZXMgcmVtb3ZlZCBzbyB0aGVyZSBjYW5ub3QgYmUgbmV3CiAgKiBxdW90YSB1c2Vycy4gVGhlcmUgY2FuIHN0aWxsIGJlIHNvbWUgdXNlcnMgb2YgcXVvdGFzIGR1ZSB0byBpbm9kZXMgYmVpbmcKQEAgLTQ2MywxMSArNDcyLDQ2IEBACiAJCXJlbW92ZV9kcXVvdF9oYXNoKGRxdW90KTsKIAkJcmVtb3ZlX2ZyZWVfZHF1b3QoZHF1b3QpOwogCQlyZW1vdmVfaW51c2UoZHF1b3QpOwotCQlrbWVtX2NhY2hlX2ZyZWUoZHF1b3RfY2FjaGVwLCBkcXVvdCk7CisJCWRvX2Rlc3Ryb3lfZHF1b3QoZHF1b3QpOwogCX0KIAlzcGluX3VubG9jaygmZHFfbGlzdF9sb2NrKTsKIH0KIAorLyogQ2FsbCBjYWxsYmFjayBmb3IgZXZlcnkgYWN0aXZlIGRxdW90IG9uIGdpdmVuIGZpbGVzeXN0ZW0gKi8KK2ludCBkcXVvdF9zY2FuX2FjdGl2ZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQkgICAgICBpbnQgKCpmbikoc3RydWN0IGRxdW90ICpkcXVvdCwgdW5zaWduZWQgbG9uZyBwcml2KSwKKwkJICAgICAgdW5zaWduZWQgbG9uZyBwcml2KQoreworCXN0cnVjdCBkcXVvdCAqZHF1b3QsICpvbGRfZHF1b3QgPSBOVUxMOworCWludCByZXQgPSAwOworCisJbXV0ZXhfbG9jaygmc2JfZHFvcHQoc2IpLT5kcW9ub2ZmX211dGV4KTsKKwlzcGluX2xvY2soJmRxX2xpc3RfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShkcXVvdCwgJmludXNlX2xpc3QsIGRxX2ludXNlKSB7CisJCWlmICghdGVzdF9iaXQoRFFfQUNUSVZFX0IsICZkcXVvdC0+ZHFfZmxhZ3MpKQorCQkJY29udGludWU7CisJCWlmIChkcXVvdC0+ZHFfc2IgIT0gc2IpCisJCQljb250aW51ZTsKKwkJLyogTm93IHdlIGhhdmUgYWN0aXZlIGRxdW90IHNvIHdlIGNhbiBqdXN0IGluY3JlYXNlIHVzZSBjb3VudCAqLworCQlhdG9taWNfaW5jKCZkcXVvdC0+ZHFfY291bnQpOworCQlkcXN0YXRzLmxvb2t1cHMrKzsKKwkJc3Bpbl91bmxvY2soJmRxX2xpc3RfbG9jayk7CisJCWRxcHV0KG9sZF9kcXVvdCk7CisJCW9sZF9kcXVvdCA9IGRxdW90OworCQlyZXQgPSBmbihkcXVvdCwgcHJpdik7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBvdXQ7CisJCXNwaW5fbG9jaygmZHFfbGlzdF9sb2NrKTsKKwkJLyogV2UgYXJlIHNhZmUgdG8gY29udGludWUgbm93IGJlY2F1c2Ugb3VyIGRxdW90IGNvdWxkIG5vdAorCQkgKiBiZSBtb3ZlZCBvdXQgb2YgdGhlIGludXNlIGxpc3Qgd2hpbGUgd2UgaG9sZCB0aGUgcmVmZXJlbmNlICovCisJfQorCXNwaW5fdW5sb2NrKCZkcV9saXN0X2xvY2spOworb3V0OgorCWRxcHV0KG9sZF9kcXVvdCk7CisJbXV0ZXhfdW5sb2NrKCZzYl9kcW9wdChzYiktPmRxb25vZmZfbXV0ZXgpOworCXJldHVybiByZXQ7Cit9CisKIGludCB2ZnNfcXVvdGFfc3luYyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgdHlwZSkKIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkICpkaXJ0eTsKQEAgLTQ3OSw3ICs1MjMsNyBAQAogCWZvciAoY250ID0gMDsgY250IDwgTUFYUVVPVEFTOyBjbnQrKykgewogCQlpZiAodHlwZSAhPSAtMSAmJiBjbnQgIT0gdHlwZSkKIAkJCWNvbnRpbnVlOwotCQlpZiAoIXNiX2hhc19xdW90YV9lbmFibGVkKHNiLCBjbnQpKQorCQlpZiAoIXNiX2hhc19xdW90YV9hY3RpdmUoc2IsIGNudCkpCiAJCQljb250aW51ZTsKIAkJc3Bpbl9sb2NrKCZkcV9saXN0X2xvY2spOwogCQlkaXJ0eSA9ICZkcW9wdC0+aW5mb1tjbnRdLmRxaV9kaXJ0eV9saXN0OwpAQCAtNTA0LDggKzU0OCw4IEBACiAJfQogCiAJZm9yIChjbnQgPSAwOyBjbnQgPCBNQVhRVU9UQVM7IGNudCsrKQotCQlpZiAoKGNudCA9PSB0eXBlIHx8IHR5cGUgPT0gLTEpICYmIHNiX2hhc19xdW90YV9lbmFibGVkKHNiLCBjbnQpCi0JCQkmJiBpbmZvX2RpcnR5KCZkcW9wdC0+aW5mb1tjbnRdKSkKKwkJaWYgKChjbnQgPT0gdHlwZSB8fCB0eXBlID09IC0xKSAmJiBzYl9oYXNfcXVvdGFfYWN0aXZlKHNiLCBjbnQpCisJCSAgICAmJiBpbmZvX2RpcnR5KCZkcW9wdC0+aW5mb1tjbnRdKSkKIAkJCXNiLT5kcV9vcC0+d3JpdGVfaW5mbyhzYiwgY250KTsKIAlzcGluX2xvY2soJmRxX2xpc3RfbG9jayk7CiAJZHFzdGF0cy5zeW5jcysrOwpAQCAtNTI3LDcgKzU3MSw3IEBACiAJCXJlbW92ZV9kcXVvdF9oYXNoKGRxdW90KTsKIAkJcmVtb3ZlX2ZyZWVfZHF1b3QoZHF1b3QpOwogCQlyZW1vdmVfaW51c2UoZHF1b3QpOwotCQlrbWVtX2NhY2hlX2ZyZWUoZHF1b3RfY2FjaGVwLCBkcXVvdCk7CisJCWRvX2Rlc3Ryb3lfZHF1b3QoZHF1b3QpOwogCQljb3VudC0tOwogCQloZWFkID0gZnJlZV9kcXVvdHMucHJldjsKIAl9CkBAIC01NTgsNyArNjAyLDcgQEAKICAqIE5PVEU6IElmIHlvdSBjaGFuZ2UgdGhpcyBmdW5jdGlvbiBwbGVhc2UgY2hlY2sgd2hldGhlciBkcXB1dF9ibG9ja3MoKSB3b3JrcyByaWdodC4uLgogICogTVVTVCBiZSBjYWxsZWQgd2l0aCBlaXRoZXIgZHFwdHJfc2VtIG9yIGRxb25vZmZfbXV0ZXggaGVsZAogICovCi1zdGF0aWMgdm9pZCBkcXB1dChzdHJ1Y3QgZHF1b3QgKmRxdW90KQordm9pZCBkcXB1dChzdHJ1Y3QgZHF1b3QgKmRxdW90KQogewogCWludCByZXQ7CiAKQEAgLTU4NCw3ICs2MjgsNyBAQAogCQkvKiBXZSBoYXZlIG1vcmUgdGhhbiBvbmUgdXNlci4uLiBub3RoaW5nIHRvIGRvICovCiAJCWF0b21pY19kZWMoJmRxdW90LT5kcV9jb3VudCk7CiAJCS8qIFJlbGVhc2luZyBkcXVvdCBkdXJpbmcgcXVvdGFvZmYgcGhhc2U/ICovCi0JCWlmICghc2JfaGFzX3F1b3RhX2VuYWJsZWQoZHF1b3QtPmRxX3NiLCBkcXVvdC0+ZHFfdHlwZSkgJiYKKwkJaWYgKCFzYl9oYXNfcXVvdGFfYWN0aXZlKGRxdW90LT5kcV9zYiwgZHF1b3QtPmRxX3R5cGUpICYmCiAJCSAgICBhdG9taWNfcmVhZCgmZHF1b3QtPmRxX2NvdW50KSA9PSAxKQogCQkJd2FrZV91cCgmZHF1b3QtPmRxX3dhaXRfdW51c2VkKTsKIAkJc3Bpbl91bmxvY2soJmRxX2xpc3RfbG9jayk7CkBAIC02MjUsMTEgKzY2OSwxNyBAQAogCXNwaW5fdW5sb2NrKCZkcV9saXN0X2xvY2spOwogfQogCitzdHJ1Y3QgZHF1b3QgKmRxdW90X2FsbG9jKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCB0eXBlKQoreworCXJldHVybiBrbWVtX2NhY2hlX3phbGxvYyhkcXVvdF9jYWNoZXAsIEdGUF9OT0ZTKTsKK30KK0VYUE9SVF9TWU1CT0woZHF1b3RfYWxsb2MpOworCiBzdGF0aWMgc3RydWN0IGRxdW90ICpnZXRfZW1wdHlfZHF1b3Qoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHR5cGUpCiB7CiAJc3RydWN0IGRxdW90ICpkcXVvdDsKIAotCWRxdW90ID0ga21lbV9jYWNoZV96YWxsb2MoZHF1b3RfY2FjaGVwLCBHRlBfTk9GUyk7CisJZHF1b3QgPSBzYi0+ZHFfb3AtPmFsbG9jX2RxdW90KHNiLCB0eXBlKTsKIAlpZighZHF1b3QpCiAJCXJldHVybiBOT0RRVU9UOwogCkBAIC02NDcsMTUgKzY5NywzMyBAQAogfQogCiAvKgorICogQ2hlY2sgd2hldGhlciBkcXVvdCBpcyBpbiBtZW1vcnkuCisgKiBNVVNUIGJlIGNhbGxlZCB3aXRoIGVpdGhlciBkcXB0cl9zZW0gb3IgZHFvbm9mZl9tdXRleCBoZWxkCisgKi8KK2ludCBkcXVvdF9pc19jYWNoZWQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdW5zaWduZWQgaW50IGlkLCBpbnQgdHlwZSkKK3sKKwl1bnNpZ25lZCBpbnQgaGFzaGVudCA9IGhhc2hmbihzYiwgaWQsIHR5cGUpOworCWludCByZXQgPSAwOworCisgICAgICAgIGlmICghc2JfaGFzX3F1b3RhX2FjdGl2ZShzYiwgdHlwZSkpCisJCXJldHVybiAwOworCXNwaW5fbG9jaygmZHFfbGlzdF9sb2NrKTsKKwlpZiAoZmluZF9kcXVvdChoYXNoZW50LCBzYiwgaWQsIHR5cGUpICE9IE5PRFFVT1QpCisJCXJldCA9IDE7CisJc3Bpbl91bmxvY2soJmRxX2xpc3RfbG9jayk7CisJcmV0dXJuIHJldDsKK30KKworLyoKICAqIEdldCByZWZlcmVuY2UgdG8gZHF1b3QKICAqIE1VU1QgYmUgY2FsbGVkIHdpdGggZWl0aGVyIGRxcHRyX3NlbSBvciBkcW9ub2ZmX211dGV4IGhlbGQKICAqLwotc3RhdGljIHN0cnVjdCBkcXVvdCAqZHFnZXQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdW5zaWduZWQgaW50IGlkLCBpbnQgdHlwZSkKK3N0cnVjdCBkcXVvdCAqZHFnZXQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdW5zaWduZWQgaW50IGlkLCBpbnQgdHlwZSkKIHsKIAl1bnNpZ25lZCBpbnQgaGFzaGVudCA9IGhhc2hmbihzYiwgaWQsIHR5cGUpOwogCXN0cnVjdCBkcXVvdCAqZHF1b3QsICplbXB0eSA9IE5PRFFVT1Q7CiAKLSAgICAgICAgaWYgKCFzYl9oYXNfcXVvdGFfZW5hYmxlZChzYiwgdHlwZSkpCisgICAgICAgIGlmICghc2JfaGFzX3F1b3RhX2FjdGl2ZShzYiwgdHlwZSkpCiAJCXJldHVybiBOT0RRVU9UOwogd2Vfc2xlcHQ6CiAJc3Bpbl9sb2NrKCZkcV9saXN0X2xvY2spOwpAQCAtNjgyLDcgKzc1MCw3IEBACiAJCWRxc3RhdHMubG9va3VwcysrOwogCQlzcGluX3VubG9jaygmZHFfbGlzdF9sb2NrKTsKIAkJaWYgKGVtcHR5KQotCQkJa21lbV9jYWNoZV9mcmVlKGRxdW90X2NhY2hlcCwgZW1wdHkpOworCQkJZG9fZGVzdHJveV9kcXVvdChlbXB0eSk7CiAJfQogCS8qIFdhaXQgZm9yIGRxX2xvY2sgLSBhZnRlciB0aGlzIHdlIGtub3cgdGhhdCBlaXRoZXIgZHF1b3RfcmVsZWFzZSgpIGlzIGFscmVhZHkKIAkgKiBmaW5pc2hlZCBvciBpdCB3aWxsIGJlIGNhbmNlbGVkIGR1ZSB0byBkcV9jb3VudCA+IDEgdGVzdCAqLwpAQCAtODIwLDcgKzg4OCw3IEBACiAJfQogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgZHF1b3RfaW5jcl9pbm9kZXMoc3RydWN0IGRxdW90ICpkcXVvdCwgdW5zaWduZWQgbG9uZyBudW1iZXIpCitzdGF0aWMgaW5saW5lIHZvaWQgZHF1b3RfaW5jcl9pbm9kZXMoc3RydWN0IGRxdW90ICpkcXVvdCwgcXNpemVfdCBudW1iZXIpCiB7CiAJZHF1b3QtPmRxX2RxYi5kcWJfY3VyaW5vZGVzICs9IG51bWJlcjsKIH0KQEAgLTgzMCw5ICs4OTgsMTAgQEAKIAlkcXVvdC0+ZHFfZHFiLmRxYl9jdXJzcGFjZSArPSBudW1iZXI7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBkcXVvdF9kZWNyX2lub2RlcyhzdHJ1Y3QgZHF1b3QgKmRxdW90LCB1bnNpZ25lZCBsb25nIG51bWJlcikKK3N0YXRpYyBpbmxpbmUgdm9pZCBkcXVvdF9kZWNyX2lub2RlcyhzdHJ1Y3QgZHF1b3QgKmRxdW90LCBxc2l6ZV90IG51bWJlcikKIHsKLQlpZiAoZHF1b3QtPmRxX2RxYi5kcWJfY3VyaW5vZGVzID4gbnVtYmVyKQorCWlmIChzYl9kcW9wdChkcXVvdC0+ZHFfc2IpLT5mbGFncyAmIERRVU9UX05FR0FUSVZFX1VTQUdFIHx8CisJICAgIGRxdW90LT5kcV9kcWIuZHFiX2N1cmlub2RlcyA+PSBudW1iZXIpCiAJCWRxdW90LT5kcV9kcWIuZHFiX2N1cmlub2RlcyAtPSBudW1iZXI7CiAJZWxzZQogCQlkcXVvdC0+ZHFfZHFiLmRxYl9jdXJpbm9kZXMgPSAwOwpAQCAtODQzLDExICs5MTIsMTIgQEAKIAogc3RhdGljIGlubGluZSB2b2lkIGRxdW90X2RlY3Jfc3BhY2Uoc3RydWN0IGRxdW90ICpkcXVvdCwgcXNpemVfdCBudW1iZXIpCiB7Ci0JaWYgKGRxdW90LT5kcV9kcWIuZHFiX2N1cnNwYWNlID4gbnVtYmVyKQorCWlmIChzYl9kcW9wdChkcXVvdC0+ZHFfc2IpLT5mbGFncyAmIERRVU9UX05FR0FUSVZFX1VTQUdFIHx8CisJICAgIGRxdW90LT5kcV9kcWIuZHFiX2N1cnNwYWNlID49IG51bWJlcikKIAkJZHF1b3QtPmRxX2RxYi5kcWJfY3Vyc3BhY2UgLT0gbnVtYmVyOwogCWVsc2UKIAkJZHF1b3QtPmRxX2RxYi5kcWJfY3Vyc3BhY2UgPSAwOwotCWlmICh0b3FiKGRxdW90LT5kcV9kcWIuZHFiX2N1cnNwYWNlKSA8PSBkcXVvdC0+ZHFfZHFiLmRxYl9ic29mdGxpbWl0KQorCWlmIChkcXVvdC0+ZHFfZHFiLmRxYl9jdXJzcGFjZSA8PSBkcXVvdC0+ZHFfZHFiLmRxYl9ic29mdGxpbWl0KQogCQlkcXVvdC0+ZHFfZHFiLmRxYl9idGltZSA9ICh0aW1lX3QpIDA7CiAJY2xlYXJfYml0KERRX0JMS1NfQiwgJmRxdW90LT5kcV9mbGFncyk7CiB9CkBAIC0xMDIzLDEwICsxMDkzLDExIEBACiB9CiAKIC8qIG5lZWRzIGRxX2RhdGFfbG9jayAqLwotc3RhdGljIGludCBjaGVja19pZHEoc3RydWN0IGRxdW90ICpkcXVvdCwgdWxvbmcgaW5vZGVzLCBjaGFyICp3YXJudHlwZSkKK3N0YXRpYyBpbnQgY2hlY2tfaWRxKHN0cnVjdCBkcXVvdCAqZHF1b3QsIHFzaXplX3QgaW5vZGVzLCBjaGFyICp3YXJudHlwZSkKIHsKIAkqd2FybnR5cGUgPSBRVU9UQV9OTF9OT1dBUk47Ci0JaWYgKGlub2RlcyA8PSAwIHx8IHRlc3RfYml0KERRX0ZBS0VfQiwgJmRxdW90LT5kcV9mbGFncykpCisJaWYgKCFzYl9oYXNfcXVvdGFfbGltaXRzX2VuYWJsZWQoZHF1b3QtPmRxX3NiLCBkcXVvdC0+ZHFfdHlwZSkgfHwKKwkgICAgdGVzdF9iaXQoRFFfRkFLRV9CLCAmZHF1b3QtPmRxX2ZsYWdzKSkKIAkJcmV0dXJuIFFVT1RBX09LOwogCiAJaWYgKGRxdW90LT5kcV9kcWIuZHFiX2loYXJkbGltaXQgJiYKQEAgLTEwNTgsMTEgKzExMjksMTIgQEAKIHN0YXRpYyBpbnQgY2hlY2tfYmRxKHN0cnVjdCBkcXVvdCAqZHF1b3QsIHFzaXplX3Qgc3BhY2UsIGludCBwcmVhbGxvYywgY2hhciAqd2FybnR5cGUpCiB7CiAJKndhcm50eXBlID0gUVVPVEFfTkxfTk9XQVJOOwotCWlmIChzcGFjZSA8PSAwIHx8IHRlc3RfYml0KERRX0ZBS0VfQiwgJmRxdW90LT5kcV9mbGFncykpCisJaWYgKCFzYl9oYXNfcXVvdGFfbGltaXRzX2VuYWJsZWQoZHF1b3QtPmRxX3NiLCBkcXVvdC0+ZHFfdHlwZSkgfHwKKwkgICAgdGVzdF9iaXQoRFFfRkFLRV9CLCAmZHF1b3QtPmRxX2ZsYWdzKSkKIAkJcmV0dXJuIFFVT1RBX09LOwogCiAJaWYgKGRxdW90LT5kcV9kcWIuZHFiX2JoYXJkbGltaXQgJiYKLQkgICB0b3FiKGRxdW90LT5kcV9kcWIuZHFiX2N1cnNwYWNlICsgc3BhY2UpID4gZHF1b3QtPmRxX2RxYi5kcWJfYmhhcmRsaW1pdCAmJgorCSAgICBkcXVvdC0+ZHFfZHFiLmRxYl9jdXJzcGFjZSArIHNwYWNlID4gZHF1b3QtPmRxX2RxYi5kcWJfYmhhcmRsaW1pdCAmJgogICAgICAgICAgICAgIWlnbm9yZV9oYXJkbGltaXQoZHF1b3QpKSB7CiAJCWlmICghcHJlYWxsb2MpCiAJCQkqd2FybnR5cGUgPSBRVU9UQV9OTF9CSEFSRFdBUk47CkBAIC0xMDcwLDcgKzExNDIsNyBAQAogCX0KIAogCWlmIChkcXVvdC0+ZHFfZHFiLmRxYl9ic29mdGxpbWl0ICYmCi0JICAgdG9xYihkcXVvdC0+ZHFfZHFiLmRxYl9jdXJzcGFjZSArIHNwYWNlKSA+IGRxdW90LT5kcV9kcWIuZHFiX2Jzb2Z0bGltaXQgJiYKKwkgICAgZHF1b3QtPmRxX2RxYi5kcWJfY3Vyc3BhY2UgKyBzcGFjZSA+IGRxdW90LT5kcV9kcWIuZHFiX2Jzb2Z0bGltaXQgJiYKIAkgICAgZHF1b3QtPmRxX2RxYi5kcWJfYnRpbWUgJiYgZ2V0X3NlY29uZHMoKSA+PSBkcXVvdC0+ZHFfZHFiLmRxYl9idGltZSAmJgogICAgICAgICAgICAgIWlnbm9yZV9oYXJkbGltaXQoZHF1b3QpKSB7CiAJCWlmICghcHJlYWxsb2MpCkBAIC0xMDc5LDcgKzExNTEsNyBAQAogCX0KIAogCWlmIChkcXVvdC0+ZHFfZHFiLmRxYl9ic29mdGxpbWl0ICYmCi0JICAgdG9xYihkcXVvdC0+ZHFfZHFiLmRxYl9jdXJzcGFjZSArIHNwYWNlKSA+IGRxdW90LT5kcV9kcWIuZHFiX2Jzb2Z0bGltaXQgJiYKKwkgICAgZHF1b3QtPmRxX2RxYi5kcWJfY3Vyc3BhY2UgKyBzcGFjZSA+IGRxdW90LT5kcV9kcWIuZHFiX2Jzb2Z0bGltaXQgJiYKIAkgICAgZHF1b3QtPmRxX2RxYi5kcWJfYnRpbWUgPT0gMCkgewogCQlpZiAoIXByZWFsbG9jKSB7CiAJCQkqd2FybnR5cGUgPSBRVU9UQV9OTF9CU09GVFdBUk47CkBAIC0xMDk2LDEwICsxMTY4LDExIEBACiAJcmV0dXJuIFFVT1RBX09LOwogfQogCi1zdGF0aWMgaW50IGluZm9faWRxX2ZyZWUoc3RydWN0IGRxdW90ICpkcXVvdCwgdWxvbmcgaW5vZGVzKQorc3RhdGljIGludCBpbmZvX2lkcV9mcmVlKHN0cnVjdCBkcXVvdCAqZHF1b3QsIHFzaXplX3QgaW5vZGVzKQogewogCWlmICh0ZXN0X2JpdChEUV9GQUtFX0IsICZkcXVvdC0+ZHFfZmxhZ3MpIHx8Ci0JICAgIGRxdW90LT5kcV9kcWIuZHFiX2N1cmlub2RlcyA8PSBkcXVvdC0+ZHFfZHFiLmRxYl9pc29mdGxpbWl0KQorCSAgICBkcXVvdC0+ZHFfZHFiLmRxYl9jdXJpbm9kZXMgPD0gZHF1b3QtPmRxX2RxYi5kcWJfaXNvZnRsaW1pdCB8fAorCSAgICAhc2JfaGFzX3F1b3RhX2xpbWl0c19lbmFibGVkKGRxdW90LT5kcV9zYiwgZHF1b3QtPmRxX3R5cGUpKQogCQlyZXR1cm4gUVVPVEFfTkxfTk9XQVJOOwogCiAJaWYgKGRxdW90LT5kcV9kcWIuZHFiX2N1cmlub2RlcyAtIGlub2RlcyA8PSBkcXVvdC0+ZHFfZHFiLmRxYl9pc29mdGxpbWl0KQpAQCAtMTExMywxNSArMTE4NiwxMyBAQAogc3RhdGljIGludCBpbmZvX2JkcV9mcmVlKHN0cnVjdCBkcXVvdCAqZHF1b3QsIHFzaXplX3Qgc3BhY2UpCiB7CiAJaWYgKHRlc3RfYml0KERRX0ZBS0VfQiwgJmRxdW90LT5kcV9mbGFncykgfHwKLQkgICAgdG9xYihkcXVvdC0+ZHFfZHFiLmRxYl9jdXJzcGFjZSkgPD0gZHF1b3QtPmRxX2RxYi5kcWJfYnNvZnRsaW1pdCkKKwkgICAgZHF1b3QtPmRxX2RxYi5kcWJfY3Vyc3BhY2UgPD0gZHF1b3QtPmRxX2RxYi5kcWJfYnNvZnRsaW1pdCkKIAkJcmV0dXJuIFFVT1RBX05MX05PV0FSTjsKIAotCWlmICh0b3FiKGRxdW90LT5kcV9kcWIuZHFiX2N1cnNwYWNlIC0gc3BhY2UpIDw9Ci0JICAgIGRxdW90LT5kcV9kcWIuZHFiX2Jzb2Z0bGltaXQpCisJaWYgKGRxdW90LT5kcV9kcWIuZHFiX2N1cnNwYWNlIC0gc3BhY2UgPD0gZHF1b3QtPmRxX2RxYi5kcWJfYnNvZnRsaW1pdCkKIAkJcmV0dXJuIFFVT1RBX05MX0JTT0ZUQkVMT1c7Ci0JaWYgKHRvcWIoZHF1b3QtPmRxX2RxYi5kcWJfY3Vyc3BhY2UpID49IGRxdW90LT5kcV9kcWIuZHFiX2JoYXJkbGltaXQgJiYKLQkgICAgdG9xYihkcXVvdC0+ZHFfZHFiLmRxYl9jdXJzcGFjZSAtIHNwYWNlKSA8Ci0JCQkJCQlkcXVvdC0+ZHFfZHFiLmRxYl9iaGFyZGxpbWl0KQorCWlmIChkcXVvdC0+ZHFfZHFiLmRxYl9jdXJzcGFjZSA+PSBkcXVvdC0+ZHFfZHFiLmRxYl9iaGFyZGxpbWl0ICYmCisJICAgIGRxdW90LT5kcV9kcWIuZHFiX2N1cnNwYWNlIC0gc3BhY2UgPCBkcXVvdC0+ZHFfZHFiLmRxYl9iaGFyZGxpbWl0KQogCQlyZXR1cm4gUVVPVEFfTkxfQkhBUkRCRUxPVzsKIAlyZXR1cm4gUVVPVEFfTkxfTk9XQVJOOwogfQpAQCAtMTE2NiwxNyArMTIzNywyMyBAQAogICogCVJlbGVhc2UgYWxsIHF1b3RhcyByZWZlcmVuY2VkIGJ5IGlub2RlCiAgKglUcmFuc2FjdGlvbiBtdXN0IGJlIHN0YXJ0ZWQgYXQgYW4gZW50cnkKICAqLwotaW50IGRxdW90X2Ryb3Aoc3RydWN0IGlub2RlICppbm9kZSkKK2ludCBkcXVvdF9kcm9wX2xvY2tlZChzdHJ1Y3QgaW5vZGUgKmlub2RlKQogewogCWludCBjbnQ7CiAKLQlkb3duX3dyaXRlKCZzYl9kcW9wdChpbm9kZS0+aV9zYiktPmRxcHRyX3NlbSk7CiAJZm9yIChjbnQgPSAwOyBjbnQgPCBNQVhRVU9UQVM7IGNudCsrKSB7CiAJCWlmIChpbm9kZS0+aV9kcXVvdFtjbnRdICE9IE5PRFFVT1QpIHsKIAkJCWRxcHV0KGlub2RlLT5pX2RxdW90W2NudF0pOwogCQkJaW5vZGUtPmlfZHF1b3RbY250XSA9IE5PRFFVT1Q7CiAJCX0KIAl9CisJcmV0dXJuIDA7Cit9CisKK2ludCBkcXVvdF9kcm9wKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJZG93bl93cml0ZSgmc2JfZHFvcHQoaW5vZGUtPmlfc2IpLT5kcXB0cl9zZW0pOworCWRxdW90X2Ryb3BfbG9ja2VkKGlub2RlKTsKIAl1cF93cml0ZSgmc2JfZHFvcHQoaW5vZGUtPmlfc2IpLT5kcXB0cl9zZW0pOwogCXJldHVybiAwOwogfQpAQCAtMTI2NCw3ICsxMzQxLDcgQEAKIC8qCiAgKiBUaGlzIG9wZXJhdGlvbiBjYW4gYmxvY2ssIGJ1dCBvbmx5IGFmdGVyIGV2ZXJ5dGhpbmcgaXMgdXBkYXRlZAogICovCi1pbnQgZHF1b3RfYWxsb2NfaW5vZGUoY29uc3Qgc3RydWN0IGlub2RlICppbm9kZSwgdW5zaWduZWQgbG9uZyBudW1iZXIpCitpbnQgZHF1b3RfYWxsb2NfaW5vZGUoY29uc3Qgc3RydWN0IGlub2RlICppbm9kZSwgcXNpemVfdCBudW1iZXIpCiB7CiAJaW50IGNudCwgcmV0ID0gTk9fUVVPVEE7CiAJY2hhciB3YXJudHlwZVtNQVhRVU9UQVNdOwpAQCAtMTM0OSw3ICsxNDI2LDcgQEAKIC8qCiAgKiBUaGlzIG9wZXJhdGlvbiBjYW4gYmxvY2ssIGJ1dCBvbmx5IGFmdGVyIGV2ZXJ5dGhpbmcgaXMgdXBkYXRlZAogICovCi1pbnQgZHF1b3RfZnJlZV9pbm9kZShjb25zdCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1bnNpZ25lZCBsb25nIG51bWJlcikKK2ludCBkcXVvdF9mcmVlX2lub2RlKGNvbnN0IHN0cnVjdCBpbm9kZSAqaW5vZGUsIHFzaXplX3QgbnVtYmVyKQogewogCXVuc2lnbmVkIGludCBjbnQ7CiAJY2hhciB3YXJudHlwZVtNQVhRVU9UQVNdOwpAQCAtMTQ5NSw3ICsxNTcyLDcgQEAKIC8qIFdyYXBwZXIgZm9yIHRyYW5zZmVycmluZyBvd25lcnNoaXAgb2YgYW4gaW5vZGUgKi8KIGludCB2ZnNfZHFfdHJhbnNmZXIoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGlhdHRyICppYXR0cikKIHsKLQlpZiAoc2JfYW55X3F1b3RhX2VuYWJsZWQoaW5vZGUtPmlfc2IpICYmICFJU19OT1FVT1RBKGlub2RlKSkgeworCWlmIChzYl9hbnlfcXVvdGFfYWN0aXZlKGlub2RlLT5pX3NiKSAmJiAhSVNfTk9RVU9UQShpbm9kZSkpIHsKIAkJdmZzX2RxX2luaXQoaW5vZGUpOwogCQlpZiAoaW5vZGUtPmlfc2ItPmRxX29wLT50cmFuc2Zlcihpbm9kZSwgaWF0dHIpID09IE5PX1FVT1RBKQogCQkJcmV0dXJuIDE7CkBAIC0xNTMzLDU0ICsxNjEwLDI3IEBACiAJLmFjcXVpcmVfZHF1b3QJPSBkcXVvdF9hY3F1aXJlLAogCS5yZWxlYXNlX2RxdW90CT0gZHF1b3RfcmVsZWFzZSwKIAkubWFya19kaXJ0eQk9IGRxdW90X21hcmtfZHF1b3RfZGlydHksCi0JLndyaXRlX2luZm8JPSBkcXVvdF9jb21taXRfaW5mbworCS53cml0ZV9pbmZvCT0gZHF1b3RfY29tbWl0X2luZm8sCisJLmFsbG9jX2RxdW90CT0gZHF1b3RfYWxsb2MsCisJLmRlc3Ryb3lfZHF1b3QJPSBkcXVvdF9kZXN0cm95LAogfTsKIAotc3RhdGljIGlubGluZSB2b2lkIHNldF9lbmFibGVfZmxhZ3Moc3RydWN0IHF1b3RhX2luZm8gKmRxb3B0LCBpbnQgdHlwZSkKLXsKLQlzd2l0Y2ggKHR5cGUpIHsKLQkJY2FzZSBVU1JRVU9UQToKLQkJCWRxb3B0LT5mbGFncyB8PSBEUVVPVF9VU1JfRU5BQkxFRDsKLQkJCWRxb3B0LT5mbGFncyAmPSB+RFFVT1RfVVNSX1NVU1BFTkRFRDsKLQkJCWJyZWFrOwotCQljYXNlIEdSUFFVT1RBOgotCQkJZHFvcHQtPmZsYWdzIHw9IERRVU9UX0dSUF9FTkFCTEVEOwotCQkJZHFvcHQtPmZsYWdzICY9IH5EUVVPVF9HUlBfU1VTUEVOREVEOwotCQkJYnJlYWs7Ci0JfQotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgcmVzZXRfZW5hYmxlX2ZsYWdzKHN0cnVjdCBxdW90YV9pbmZvICpkcW9wdCwgaW50IHR5cGUsCi0JCQkJICAgICAgaW50IHJlbW91bnQpCi17Ci0Jc3dpdGNoICh0eXBlKSB7Ci0JCWNhc2UgVVNSUVVPVEE6Ci0JCQlkcW9wdC0+ZmxhZ3MgJj0gfkRRVU9UX1VTUl9FTkFCTEVEOwotCQkJaWYgKHJlbW91bnQpCi0JCQkJZHFvcHQtPmZsYWdzIHw9IERRVU9UX1VTUl9TVVNQRU5ERUQ7Ci0JCQllbHNlCi0JCQkJZHFvcHQtPmZsYWdzICY9IH5EUVVPVF9VU1JfU1VTUEVOREVEOwotCQkJYnJlYWs7Ci0JCWNhc2UgR1JQUVVPVEE6Ci0JCQlkcW9wdC0+ZmxhZ3MgJj0gfkRRVU9UX0dSUF9FTkFCTEVEOwotCQkJaWYgKHJlbW91bnQpCi0JCQkJZHFvcHQtPmZsYWdzIHw9IERRVU9UX0dSUF9TVVNQRU5ERUQ7Ci0JCQllbHNlCi0JCQkJZHFvcHQtPmZsYWdzICY9IH5EUVVPVF9HUlBfU1VTUEVOREVEOwotCQkJYnJlYWs7Ci0JfQotfQotCi0KIC8qCiAgKiBUdXJuIHF1b3RhIG9mZiBvbiBhIGRldmljZS4gdHlwZSA9PSAtMSA9PT4gcXVvdGFvZmYgZm9yIGFsbCB0eXBlcyAodW1vdW50KQogICovCi1pbnQgdmZzX3F1b3RhX29mZihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgdHlwZSwgaW50IHJlbW91bnQpCitpbnQgdmZzX3F1b3RhX2Rpc2FibGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHR5cGUsIHVuc2lnbmVkIGludCBmbGFncykKIHsKIAlpbnQgY250LCByZXQgPSAwOwogCXN0cnVjdCBxdW90YV9pbmZvICpkcW9wdCA9IHNiX2Rxb3B0KHNiKTsKIAlzdHJ1Y3QgaW5vZGUgKnRvcHV0aW5vZGVbTUFYUVVPVEFTXTsKIAorCS8qIENhbm5vdCB0dXJuIG9mZiB1c2FnZSBhY2NvdW50aW5nIHdpdGhvdXQgdHVybmluZyBvZmYgbGltaXRzLCBvcgorCSAqIHN1c3BlbmQgcXVvdGFzIGFuZCBzaW11bHRhbmVvdXNseSB0dXJuIHF1b3RhcyBvZmYuICovCisJaWYgKChmbGFncyAmIERRVU9UX1VTQUdFX0VOQUJMRUQgJiYgIShmbGFncyAmIERRVU9UX0xJTUlUU19FTkFCTEVEKSkKKwkgICAgfHwgKGZsYWdzICYgRFFVT1RfU1VTUEVOREVEICYmIGZsYWdzICYgKERRVU9UX0xJTUlUU19FTkFCTEVEIHwKKwkgICAgRFFVT1RfVVNBR0VfRU5BQkxFRCkpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwogCS8qIFdlIG5lZWQgdG8gc2VyaWFsaXplIHF1b3RhX29mZigpIGZvciBkZXZpY2UgKi8KIAltdXRleF9sb2NrKCZkcW9wdC0+ZHFvbm9mZl9tdXRleCk7CiAKQEAgLTE1ODksNyArMTYzOSw3IEBACiAJICogc29tZXRpbWVzIHdlIGFyZSBjYWxsZWQgd2hlbiBmaWxsX3N1cGVyKCkgZmFpbGVkIGFuZCBjYWxsaW5nCiAJICogc3luY19mcygpIGluIHN1Y2ggY2FzZXMgZG9lcyBubyBnb29kLgogCSAqLwotCWlmICghc2JfYW55X3F1b3RhX2VuYWJsZWQoc2IpICYmICFzYl9hbnlfcXVvdGFfc3VzcGVuZGVkKHNiKSkgeworCWlmICghc2JfYW55X3F1b3RhX2xvYWRlZChzYikpIHsKIAkJbXV0ZXhfdW5sb2NrKCZkcW9wdC0+ZHFvbm9mZl9tdXRleCk7CiAJCXJldHVybiAwOwogCX0KQEAgLTE1OTcsMTcgKzE2NDcsMjggQEAKIAkJdG9wdXRpbm9kZVtjbnRdID0gTlVMTDsKIAkJaWYgKHR5cGUgIT0gLTEgJiYgY250ICE9IHR5cGUpCiAJCQljb250aW51ZTsKLQkJLyogSWYgd2Uga2VlcCBpbm9kZXMgb2YgcXVvdGEgZmlsZXMgYWZ0ZXIgcmVtb3VudCBhbmQgcXVvdGFvZmYKLQkJICogaXMgY2FsbGVkLCBkcm9wIGtlcHQgaW5vZGVzLiAqLwotCQlpZiAoIXJlbW91bnQgJiYgc2JfaGFzX3F1b3RhX3N1c3BlbmRlZChzYiwgY250KSkgewotCQkJaXB1dChkcW9wdC0+ZmlsZXNbY250XSk7Ci0JCQlkcW9wdC0+ZmlsZXNbY250XSA9IE5VTEw7Ci0JCQlyZXNldF9lbmFibGVfZmxhZ3MoZHFvcHQsIGNudCwgMCk7CisJCWlmICghc2JfaGFzX3F1b3RhX2xvYWRlZChzYiwgY250KSkKIAkJCWNvbnRpbnVlOworCisJCWlmIChmbGFncyAmIERRVU9UX1NVU1BFTkRFRCkgeworCQkJZHFvcHQtPmZsYWdzIHw9CisJCQkJZHF1b3Rfc3RhdGVfZmxhZyhEUVVPVF9TVVNQRU5ERUQsIGNudCk7CisJCX0gZWxzZSB7CisJCQlkcW9wdC0+ZmxhZ3MgJj0gfmRxdW90X3N0YXRlX2ZsYWcoZmxhZ3MsIGNudCk7CisJCQkvKiBUdXJuaW5nIG9mZiBzdXNwZW5kZWQgcXVvdGFzPyAqLworCQkJaWYgKCFzYl9oYXNfcXVvdGFfbG9hZGVkKHNiLCBjbnQpICYmCisJCQkgICAgc2JfaGFzX3F1b3RhX3N1c3BlbmRlZChzYiwgY250KSkgeworCQkJCWRxb3B0LT5mbGFncyAmPQl+ZHF1b3Rfc3RhdGVfZmxhZygKKwkJCQkJCQlEUVVPVF9TVVNQRU5ERUQsIGNudCk7CisJCQkJaXB1dChkcW9wdC0+ZmlsZXNbY250XSk7CisJCQkJZHFvcHQtPmZpbGVzW2NudF0gPSBOVUxMOworCQkJCWNvbnRpbnVlOworCQkJfQogCQl9Ci0JCWlmICghc2JfaGFzX3F1b3RhX2VuYWJsZWQoc2IsIGNudCkpCisKKwkJLyogV2Ugc3RpbGwgaGF2ZSB0byBrZWVwIHF1b3RhIGxvYWRlZD8gKi8KKwkJaWYgKHNiX2hhc19xdW90YV9sb2FkZWQoc2IsIGNudCkgJiYgIShmbGFncyAmIERRVU9UX1NVU1BFTkRFRCkpCiAJCQljb250aW51ZTsKLQkJcmVzZXRfZW5hYmxlX2ZsYWdzKGRxb3B0LCBjbnQsIHJlbW91bnQpOwogCiAJCS8qIE5vdGU6IHRoZXNlIGFyZSBibG9ja2luZyBvcGVyYXRpb25zICovCiAJCWRyb3BfZHF1b3RfcmVmKHNiLCBjbnQpOwpAQCAtMTYyMyw3ICsxNjg0LDcgQEAKIAkJcHV0X3F1b3RhX2Zvcm1hdChkcW9wdC0+aW5mb1tjbnRdLmRxaV9mb3JtYXQpOwogCiAJCXRvcHV0aW5vZGVbY250XSA9IGRxb3B0LT5maWxlc1tjbnRdOwotCQlpZiAoIXJlbW91bnQpCisJCWlmICghc2JfaGFzX3F1b3RhX2xvYWRlZChzYiwgY250KSkKIAkJCWRxb3B0LT5maWxlc1tjbnRdID0gTlVMTDsKIAkJZHFvcHQtPmluZm9bY250XS5kcWlfZmxhZ3MgPSAwOwogCQlkcW9wdC0+aW5mb1tjbnRdLmRxaV9pZ3JhY2UgPSAwOwpAQCAtMTYzMSw2ICsxNjkyLDExIEBACiAJCWRxb3B0LT5vcHNbY250XSA9IE5VTEw7CiAJfQogCW11dGV4X3VubG9jaygmZHFvcHQtPmRxb25vZmZfbXV0ZXgpOworCisJLyogU2tpcCBzeW5jaW5nIGFuZCBzZXR0aW5nIGZsYWdzIGlmIHF1b3RhIGZpbGVzIGFyZSBoaWRkZW4gKi8KKwlpZiAoZHFvcHQtPmZsYWdzICYgRFFVT1RfUVVPVEFfU1lTX0ZJTEUpCisJCWdvdG8gcHV0X2lub2RlczsKKwogCS8qIFN5bmMgdGhlIHN1cGVyYmxvY2sgc28gdGhhdCBidWZmZXJzIHdpdGggcXVvdGEgZGF0YSBhcmUgd3JpdHRlbiB0bwogCSAqIGRpc2sgKGFuZCBzbyB1c2Vyc3BhY2Ugc2VlcyBjb3JyZWN0IGRhdGEgYWZ0ZXJ3YXJkcykuICovCiAJaWYgKHNiLT5zX29wLT5zeW5jX2ZzKQpAQCAtMTY0Niw3ICsxNzEyLDcgQEAKIAkJCW11dGV4X2xvY2soJmRxb3B0LT5kcW9ub2ZmX211dGV4KTsKIAkJCS8qIElmIHF1b3RhIHdhcyByZWVuYWJsZWQgaW4gdGhlIG1lYW50aW1lLCB3ZSBoYXZlCiAJCQkgKiBub3RoaW5nIHRvIGRvICovCi0JCQlpZiAoIXNiX2hhc19xdW90YV9lbmFibGVkKHNiLCBjbnQpKSB7CisJCQlpZiAoIXNiX2hhc19xdW90YV9sb2FkZWQoc2IsIGNudCkpIHsKIAkJCQltdXRleF9sb2NrX25lc3RlZCgmdG9wdXRpbm9kZVtjbnRdLT5pX211dGV4LCBJX01VVEVYX1FVT1RBKTsKIAkJCQl0b3B1dGlub2RlW2NudF0tPmlfZmxhZ3MgJj0gfihTX0lNTVVUQUJMRSB8CiAJCQkJICBTX05PQVRJTUUgfCBTX05PUVVPVEEpOwpAQCAtMTY1NSwyNiArMTcyMSw0MyBAQAogCQkJCW1hcmtfaW5vZGVfZGlydHkodG9wdXRpbm9kZVtjbnRdKTsKIAkJCX0KIAkJCW11dGV4X3VubG9jaygmZHFvcHQtPmRxb25vZmZfbXV0ZXgpOworCQl9CisJaWYgKHNiLT5zX2JkZXYpCisJCWludmFsaWRhdGVfYmRldihzYi0+c19iZGV2KTsKK3B1dF9pbm9kZXM6CisJZm9yIChjbnQgPSAwOyBjbnQgPCBNQVhRVU9UQVM7IGNudCsrKQorCQlpZiAodG9wdXRpbm9kZVtjbnRdKSB7CiAJCQkvKiBPbiByZW1vdW50IFJPLCB3ZSBrZWVwIHRoZSBpbm9kZSBwb2ludGVyIHNvIHRoYXQgd2UKLQkJCSAqIGNhbiByZWVuYWJsZSBxdW90YSBvbiB0aGUgc3Vic2VxdWVudCByZW1vdW50IFJXLgotCQkJICogQnV0IHdlIGhhdmUgYmV0dGVyIG5vdCBrZWVwIGlub2RlIHBvaW50ZXIgd2hlbiB0aGVyZQotCQkJICogaXMgcGVuZGluZyBkZWxldGUgb24gdGhlIHF1b3RhIGZpbGUuLi4gKi8KLQkJCWlmICghcmVtb3VudCkKKwkJCSAqIGNhbiByZWVuYWJsZSBxdW90YSBvbiB0aGUgc3Vic2VxdWVudCByZW1vdW50IFJXLiBXZQorCQkJICogaGF2ZSB0byBjaGVjayAnZmxhZ3MnIHZhcmlhYmxlIGFuZCBub3QgdXNlIHNiX2hhc18KKwkJCSAqIGZ1bmN0aW9uIGJlY2F1c2UgYW5vdGhlciBxdW90YW9uIC8gcXVvdGFvZmYgY291bGQKKwkJCSAqIGNoYW5nZSBnbG9iYWwgc3RhdGUgYmVmb3JlIHdlIGdvdCBoZXJlLiBXZSByZWZ1c2UKKwkJCSAqIHRvIHN1c3BlbmQgcXVvdGFzIHdoZW4gdGhlcmUgaXMgcGVuZGluZyBkZWxldGUgb24KKwkJCSAqIHRoZSBxdW90YSBmaWxlLi4uICovCisJCQlpZiAoIShmbGFncyAmIERRVU9UX1NVU1BFTkRFRCkpCiAJCQkJaXB1dCh0b3B1dGlub2RlW2NudF0pOwogCQkJZWxzZSBpZiAoIXRvcHV0aW5vZGVbY250XS0+aV9ubGluaykKIAkJCQlyZXQgPSAtRUJVU1k7CiAJCX0KLQlpZiAoc2ItPnNfYmRldikKLQkJaW52YWxpZGF0ZV9iZGV2KHNiLT5zX2JkZXYpOwogCXJldHVybiByZXQ7CiB9CiAKK2ludCB2ZnNfcXVvdGFfb2ZmKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCB0eXBlLCBpbnQgcmVtb3VudCkKK3sKKwlyZXR1cm4gdmZzX3F1b3RhX2Rpc2FibGUoc2IsIHR5cGUsIHJlbW91bnQgPyBEUVVPVF9TVVNQRU5ERUQgOgorCQkJCSAoRFFVT1RfVVNBR0VfRU5BQkxFRCB8IERRVU9UX0xJTUlUU19FTkFCTEVEKSk7Cit9CisKIC8qCiAgKglUdXJuIHF1b3RhcyBvbiBvbiBhIGRldmljZQogICovCiAKLS8qIEhlbHBlciBmdW5jdGlvbiB3aGVuIHdlIGFscmVhZHkgaGF2ZSB0aGUgaW5vZGUgKi8KLXN0YXRpYyBpbnQgdmZzX3F1b3RhX29uX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCB0eXBlLCBpbnQgZm9ybWF0X2lkKQorLyoKKyAqIEhlbHBlciBmdW5jdGlvbiB0byB0dXJuIHF1b3RhcyBvbiB3aGVuIHdlIGFscmVhZHkgaGF2ZSB0aGUgaW5vZGUgb2YKKyAqIHF1b3RhIGZpbGUgYW5kIG5vIHF1b3RhIGluZm9ybWF0aW9uIGlzIGxvYWRlZC4KKyAqLworc3RhdGljIGludCB2ZnNfbG9hZF9xdW90YV9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgdHlwZSwgaW50IGZvcm1hdF9pZCwKKwl1bnNpZ25lZCBpbnQgZmxhZ3MpCiB7CiAJc3RydWN0IHF1b3RhX2Zvcm1hdF90eXBlICpmbXQgPSBmaW5kX3F1b3RhX2Zvcm1hdChmb3JtYXRfaWQpOwogCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS0+aV9zYjsKQEAgLTE2OTYsMjcgKzE3NzksMzcgQEAKIAkJZXJyb3IgPSAtRUlOVkFMOwogCQlnb3RvIG91dF9mbXQ7CiAJfQorCS8qIFVzYWdlIGFsd2F5cyBoYXMgdG8gYmUgc2V0Li4uICovCisJaWYgKCEoZmxhZ3MgJiBEUVVPVF9VU0FHRV9FTkFCTEVEKSkgeworCQllcnJvciA9IC1FSU5WQUw7CisJCWdvdG8gb3V0X2ZtdDsKKwl9CiAKLQkvKiBBcyB3ZSBieXBhc3MgdGhlIHBhZ2VjYWNoZSB3ZSBtdXN0IG5vdyBmbHVzaCB0aGUgaW5vZGUgc28gdGhhdAotCSAqIHdlIHNlZSBhbGwgdGhlIGNoYW5nZXMgZnJvbSB1c2Vyc3BhY2UuLi4gKi8KLQl3cml0ZV9pbm9kZV9ub3coaW5vZGUsIDEpOwotCS8qIEFuZCBub3cgZmx1c2ggdGhlIGJsb2NrIGNhY2hlIHNvIHRoYXQga2VybmVsIHNlZXMgdGhlIGNoYW5nZXMgKi8KLQlpbnZhbGlkYXRlX2JkZXYoc2ItPnNfYmRldik7CisJaWYgKCEoZHFvcHQtPmZsYWdzICYgRFFVT1RfUVVPVEFfU1lTX0ZJTEUpKSB7CisJCS8qIEFzIHdlIGJ5cGFzcyB0aGUgcGFnZWNhY2hlIHdlIG11c3Qgbm93IGZsdXNoIHRoZSBpbm9kZSBzbworCQkgKiB0aGF0IHdlIHNlZSBhbGwgdGhlIGNoYW5nZXMgZnJvbSB1c2Vyc3BhY2UuLi4gKi8KKwkJd3JpdGVfaW5vZGVfbm93KGlub2RlLCAxKTsKKwkJLyogQW5kIG5vdyBmbHVzaCB0aGUgYmxvY2sgY2FjaGUgc28gdGhhdCBrZXJuZWwgc2VlcyB0aGUKKwkJICogY2hhbmdlcyAqLworCQlpbnZhbGlkYXRlX2JkZXYoc2ItPnNfYmRldik7CisJfQogCW11dGV4X2xvY2soJmlub2RlLT5pX211dGV4KTsKIAltdXRleF9sb2NrKCZkcW9wdC0+ZHFvbm9mZl9tdXRleCk7Ci0JaWYgKHNiX2hhc19xdW90YV9lbmFibGVkKHNiLCB0eXBlKSB8fAotCQkJc2JfaGFzX3F1b3RhX3N1c3BlbmRlZChzYiwgdHlwZSkpIHsKKwlpZiAoc2JfaGFzX3F1b3RhX2xvYWRlZChzYiwgdHlwZSkpIHsKIAkJZXJyb3IgPSAtRUJVU1k7CiAJCWdvdG8gb3V0X2xvY2s7CiAJfQotCS8qIFdlIGRvbid0IHdhbnQgcXVvdGEgYW5kIGF0aW1lIG9uIHF1b3RhIGZpbGVzIChkZWFkbG9ja3MgcG9zc2libGUpCi0JICogQWxzbyBub2JvZHkgc2hvdWxkIHdyaXRlIHRvIHRoZSBmaWxlIC0gd2UgdXNlIHNwZWNpYWwgSU8gb3BlcmF0aW9ucwotCSAqIHdoaWNoIGlnbm9yZSB0aGUgaW1tdXRhYmxlIGJpdC4gKi8KLQlkb3duX3dyaXRlKCZkcW9wdC0+ZHFwdHJfc2VtKTsKLQlvbGRmbGFncyA9IGlub2RlLT5pX2ZsYWdzICYgKFNfTk9BVElNRSB8IFNfSU1NVVRBQkxFIHwgU19OT1FVT1RBKTsKLQlpbm9kZS0+aV9mbGFncyB8PSBTX05PUVVPVEEgfCBTX05PQVRJTUUgfCBTX0lNTVVUQUJMRTsKLQl1cF93cml0ZSgmZHFvcHQtPmRxcHRyX3NlbSk7Ci0Jc2ItPmRxX29wLT5kcm9wKGlub2RlKTsKKworCWlmICghKGRxb3B0LT5mbGFncyAmIERRVU9UX1FVT1RBX1NZU19GSUxFKSkgeworCQkvKiBXZSBkb24ndCB3YW50IHF1b3RhIGFuZCBhdGltZSBvbiBxdW90YSBmaWxlcyAoZGVhZGxvY2tzCisJCSAqIHBvc3NpYmxlKSBBbHNvIG5vYm9keSBzaG91bGQgd3JpdGUgdG8gdGhlIGZpbGUgLSB3ZSB1c2UKKwkJICogc3BlY2lhbCBJTyBvcGVyYXRpb25zIHdoaWNoIGlnbm9yZSB0aGUgaW1tdXRhYmxlIGJpdC4gKi8KKwkJZG93bl93cml0ZSgmZHFvcHQtPmRxcHRyX3NlbSk7CisJCW9sZGZsYWdzID0gaW5vZGUtPmlfZmxhZ3MgJiAoU19OT0FUSU1FIHwgU19JTU1VVEFCTEUgfCBTX05PUVVPVEEpOworCQlpbm9kZS0+aV9mbGFncyB8PSBTX05PUVVPVEEgfCBTX05PQVRJTUUgfCBTX0lNTVVUQUJMRTsKKwkJdXBfd3JpdGUoJmRxb3B0LT5kcXB0cl9zZW0pOworCQlzYi0+ZHFfb3AtPmRyb3AoaW5vZGUpOworCX0KIAogCWVycm9yID0gLUVJTzsKIAlkcW9wdC0+ZmlsZXNbdHlwZV0gPSBpZ3JhYihpbm9kZSk7CkBAIC0xNzM3LDcgKzE4MzAsNyBAQAogCX0KIAltdXRleF91bmxvY2soJmRxb3B0LT5kcWlvX211dGV4KTsKIAltdXRleF91bmxvY2soJmlub2RlLT5pX211dGV4KTsKLQlzZXRfZW5hYmxlX2ZsYWdzKGRxb3B0LCB0eXBlKTsKKwlkcW9wdC0+ZmxhZ3MgfD0gZHF1b3Rfc3RhdGVfZmxhZyhmbGFncywgdHlwZSk7CiAKIAlhZGRfZHF1b3RfcmVmKHNiLCB0eXBlKTsKIAltdXRleF91bmxvY2soJmRxb3B0LT5kcW9ub2ZmX211dGV4KTsKQEAgLTE3NzAsMjAgKzE4NjMsMjMgQEAKIAlzdHJ1Y3QgcXVvdGFfaW5mbyAqZHFvcHQgPSBzYl9kcW9wdChzYik7CiAJc3RydWN0IGlub2RlICppbm9kZTsKIAlpbnQgcmV0OworCXVuc2lnbmVkIGludCBmbGFnczsKIAogCW11dGV4X2xvY2soJmRxb3B0LT5kcW9ub2ZmX211dGV4KTsKIAlpZiAoIXNiX2hhc19xdW90YV9zdXNwZW5kZWQoc2IsIHR5cGUpKSB7CiAJCW11dGV4X3VubG9jaygmZHFvcHQtPmRxb25vZmZfbXV0ZXgpOwogCQlyZXR1cm4gMDsKIAl9Ci0JQlVHX09OKHNiX2hhc19xdW90YV9lbmFibGVkKHNiLCB0eXBlKSk7Ci0KIAlpbm9kZSA9IGRxb3B0LT5maWxlc1t0eXBlXTsKIAlkcW9wdC0+ZmlsZXNbdHlwZV0gPSBOVUxMOwotCXJlc2V0X2VuYWJsZV9mbGFncyhkcW9wdCwgdHlwZSwgMCk7CisJZmxhZ3MgPSBkcW9wdC0+ZmxhZ3MgJiBkcXVvdF9zdGF0ZV9mbGFnKERRVU9UX1VTQUdFX0VOQUJMRUQgfAorCQkJCQkJRFFVT1RfTElNSVRTX0VOQUJMRUQsIHR5cGUpOworCWRxb3B0LT5mbGFncyAmPSB+ZHF1b3Rfc3RhdGVfZmxhZyhEUVVPVF9TVEFURV9GTEFHUywgdHlwZSk7CiAJbXV0ZXhfdW5sb2NrKCZkcW9wdC0+ZHFvbm9mZl9tdXRleCk7CiAKLQlyZXQgPSB2ZnNfcXVvdGFfb25faW5vZGUoaW5vZGUsIHR5cGUsIGRxb3B0LT5pbmZvW3R5cGVdLmRxaV9mbXRfaWQpOworCWZsYWdzID0gZHF1b3RfZ2VuZXJpY19mbGFnKGZsYWdzLCB0eXBlKTsKKwlyZXQgPSB2ZnNfbG9hZF9xdW90YV9pbm9kZShpbm9kZSwgdHlwZSwgZHFvcHQtPmluZm9bdHlwZV0uZHFpX2ZtdF9pZCwKKwkJCQkgICBmbGFncyk7CiAJaXB1dChpbm9kZSk7CiAKIAlyZXR1cm4gcmV0OwpAQCAtMTc5OSwxMiArMTg5NSwxMiBAQAogCWlmIChwYXRoLT5tbnQtPm1udF9zYiAhPSBzYikKIAkJZXJyb3IgPSAtRVhERVY7CiAJZWxzZQotCQllcnJvciA9IHZmc19xdW90YV9vbl9pbm9kZShwYXRoLT5kZW50cnktPmRfaW5vZGUsIHR5cGUsCi0JCQkJCSAgIGZvcm1hdF9pZCk7CisJCWVycm9yID0gdmZzX2xvYWRfcXVvdGFfaW5vZGUocGF0aC0+ZGVudHJ5LT5kX2lub2RlLCB0eXBlLAorCQkJCQkgICAgIGZvcm1hdF9pZCwgRFFVT1RfVVNBR0VfRU5BQkxFRCB8CisJCQkJCSAgICAgRFFVT1RfTElNSVRTX0VOQUJMRUQpOwogCXJldHVybiBlcnJvcjsKIH0KIAotLyogQWN0dWFsIGZ1bmN0aW9uIGNhbGxlZCBmcm9tIHF1b3RhY3RsKCkgKi8KIGludCB2ZnNfcXVvdGFfb24oc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHR5cGUsIGludCBmb3JtYXRfaWQsIGNoYXIgKm5hbWUsCiAJCSBpbnQgcmVtb3VudCkKIHsKQEAgLTE4MjMsNiArMTkxOSw1MCBAQAogfQogCiAvKgorICogTW9yZSBwb3dlcmZ1bCBmdW5jdGlvbiBmb3IgdHVybmluZyBvbiBxdW90YXMgYWxsb3dpbmcgc2V0dGluZworICogb2YgaW5kaXZpZHVhbCBxdW90YSBmbGFncworICovCitpbnQgdmZzX3F1b3RhX2VuYWJsZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgdHlwZSwgaW50IGZvcm1hdF9pZCwKKwkJdW5zaWduZWQgaW50IGZsYWdzKQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS0+aV9zYjsKKwlzdHJ1Y3QgcXVvdGFfaW5mbyAqZHFvcHQgPSBzYl9kcW9wdChzYik7CisKKwkvKiBKdXN0IHVuc3VzcGVuZCBxdW90YXM/ICovCisJaWYgKGZsYWdzICYgRFFVT1RfU1VTUEVOREVEKQorCQlyZXR1cm4gdmZzX3F1b3RhX29uX3JlbW91bnQoc2IsIHR5cGUpOworCWlmICghZmxhZ3MpCisJCXJldHVybiAwOworCS8qIEp1c3QgdXBkYXRpbmcgZmxhZ3MgbmVlZGVkPyAqLworCWlmIChzYl9oYXNfcXVvdGFfbG9hZGVkKHNiLCB0eXBlKSkgeworCQltdXRleF9sb2NrKCZkcW9wdC0+ZHFvbm9mZl9tdXRleCk7CisJCS8qIE5vdyBkbyBhIHJlbGlhYmxlIHRlc3QuLi4gKi8KKwkJaWYgKCFzYl9oYXNfcXVvdGFfbG9hZGVkKHNiLCB0eXBlKSkgeworCQkJbXV0ZXhfdW5sb2NrKCZkcW9wdC0+ZHFvbm9mZl9tdXRleCk7CisJCQlnb3RvIGxvYWRfcXVvdGE7CisJCX0KKwkJaWYgKGZsYWdzICYgRFFVT1RfVVNBR0VfRU5BQkxFRCAmJgorCQkgICAgc2JfaGFzX3F1b3RhX3VzYWdlX2VuYWJsZWQoc2IsIHR5cGUpKSB7CisJCQlyZXQgPSAtRUJVU1k7CisJCQlnb3RvIG91dF9sb2NrOworCQl9CisJCWlmIChmbGFncyAmIERRVU9UX0xJTUlUU19FTkFCTEVEICYmCisJCSAgICBzYl9oYXNfcXVvdGFfbGltaXRzX2VuYWJsZWQoc2IsIHR5cGUpKSB7CisJCQlyZXQgPSAtRUJVU1k7CisJCQlnb3RvIG91dF9sb2NrOworCQl9CisJCXNiX2Rxb3B0KHNiKS0+ZmxhZ3MgfD0gZHF1b3Rfc3RhdGVfZmxhZyhmbGFncywgdHlwZSk7CitvdXRfbG9jazoKKwkJbXV0ZXhfdW5sb2NrKCZkcW9wdC0+ZHFvbm9mZl9tdXRleCk7CisJCXJldHVybiByZXQ7CisJfQorCitsb2FkX3F1b3RhOgorCXJldHVybiB2ZnNfbG9hZF9xdW90YV9pbm9kZShpbm9kZSwgdHlwZSwgZm9ybWF0X2lkLCBmbGFncyk7Cit9CisKKy8qCiAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgd2hlbiBmaWxlc3lzdGVtIG5lZWRzIHRvIGluaXRpYWxpemUgcXVvdGFzCiAgKiBkdXJpbmcgbW91bnQgdGltZS4KICAqLwpAQCAtMTg0Myw3ICsxOTgzLDggQEAKIAogCWVycm9yID0gc2VjdXJpdHlfcXVvdGFfb24oZGVudHJ5KTsKIAlpZiAoIWVycm9yKQotCQllcnJvciA9IHZmc19xdW90YV9vbl9pbm9kZShkZW50cnktPmRfaW5vZGUsIHR5cGUsIGZvcm1hdF9pZCk7CisJCWVycm9yID0gdmZzX2xvYWRfcXVvdGFfaW5vZGUoZGVudHJ5LT5kX2lub2RlLCB0eXBlLCBmb3JtYXRfaWQsCisJCQkJRFFVT1RfVVNBR0VfRU5BQkxFRCB8IERRVU9UX0xJTUlUU19FTkFCTEVEKTsKIAogb3V0OgogCWRwdXQoZGVudHJ5KTsKQEAgLTE4NjYsMTQgKzIwMDcsMjQgQEAKIAlyZXR1cm4gcmV0OwogfQogCitzdGF0aWMgaW5saW5lIHFzaXplX3QgcWJ0b3MocXNpemVfdCBibG9ja3MpCit7CisJcmV0dXJuIGJsb2NrcyA8PCBRSUZfRFFCTEtTSVpFX0JJVFM7Cit9CisKK3N0YXRpYyBpbmxpbmUgcXNpemVfdCBzdG9xYihxc2l6ZV90IHNwYWNlKQoreworCXJldHVybiAoc3BhY2UgKyBRSUZfRFFCTEtTSVpFIC0gMSkgPj4gUUlGX0RRQkxLU0laRV9CSVRTOworfQorCiAvKiBHZW5lcmljIHJvdXRpbmUgZm9yIGdldHRpbmcgY29tbW9uIHBhcnQgb2YgcXVvdGEgc3RydWN0dXJlICovCiBzdGF0aWMgdm9pZCBkb19nZXRfZHFibGsoc3RydWN0IGRxdW90ICpkcXVvdCwgc3RydWN0IGlmX2RxYmxrICpkaSkKIHsKIAlzdHJ1Y3QgbWVtX2RxYmxrICpkbSA9ICZkcXVvdC0+ZHFfZHFiOwogCiAJc3Bpbl9sb2NrKCZkcV9kYXRhX2xvY2spOwotCWRpLT5kcWJfYmhhcmRsaW1pdCA9IGRtLT5kcWJfYmhhcmRsaW1pdDsKLQlkaS0+ZHFiX2Jzb2Z0bGltaXQgPSBkbS0+ZHFiX2Jzb2Z0bGltaXQ7CisJZGktPmRxYl9iaGFyZGxpbWl0ID0gc3RvcWIoZG0tPmRxYl9iaGFyZGxpbWl0KTsKKwlkaS0+ZHFiX2Jzb2Z0bGltaXQgPSBzdG9xYihkbS0+ZHFiX2Jzb2Z0bGltaXQpOwogCWRpLT5kcWJfY3Vyc3BhY2UgPSBkbS0+ZHFiX2N1cnNwYWNlOwogCWRpLT5kcWJfaWhhcmRsaW1pdCA9IGRtLT5kcWJfaWhhcmRsaW1pdDsKIAlkaS0+ZHFiX2lzb2Z0bGltaXQgPSBkbS0+ZHFiX2lzb2Z0bGltaXQ7CkBAIC0xOTE4LDI4ICsyMDY5LDM4IEBACiAJaWYgKGRpLT5kcWJfdmFsaWQgJiBRSUZfU1BBQ0UpIHsKIAkJZG0tPmRxYl9jdXJzcGFjZSA9IGRpLT5kcWJfY3Vyc3BhY2U7CiAJCWNoZWNrX2JsaW0gPSAxOworCQlfX3NldF9iaXQoRFFfTEFTVFNFVF9CICsgUUlGX1NQQUNFX0IsICZkcXVvdC0+ZHFfZmxhZ3MpOwogCX0KIAlpZiAoZGktPmRxYl92YWxpZCAmIFFJRl9CTElNSVRTKSB7Ci0JCWRtLT5kcWJfYnNvZnRsaW1pdCA9IGRpLT5kcWJfYnNvZnRsaW1pdDsKLQkJZG0tPmRxYl9iaGFyZGxpbWl0ID0gZGktPmRxYl9iaGFyZGxpbWl0OworCQlkbS0+ZHFiX2Jzb2Z0bGltaXQgPSBxYnRvcyhkaS0+ZHFiX2Jzb2Z0bGltaXQpOworCQlkbS0+ZHFiX2JoYXJkbGltaXQgPSBxYnRvcyhkaS0+ZHFiX2JoYXJkbGltaXQpOwogCQljaGVja19ibGltID0gMTsKKwkJX19zZXRfYml0KERRX0xBU1RTRVRfQiArIFFJRl9CTElNSVRTX0IsICZkcXVvdC0+ZHFfZmxhZ3MpOwogCX0KIAlpZiAoZGktPmRxYl92YWxpZCAmIFFJRl9JTk9ERVMpIHsKIAkJZG0tPmRxYl9jdXJpbm9kZXMgPSBkaS0+ZHFiX2N1cmlub2RlczsKIAkJY2hlY2tfaWxpbSA9IDE7CisJCV9fc2V0X2JpdChEUV9MQVNUU0VUX0IgKyBRSUZfSU5PREVTX0IsICZkcXVvdC0+ZHFfZmxhZ3MpOwogCX0KIAlpZiAoZGktPmRxYl92YWxpZCAmIFFJRl9JTElNSVRTKSB7CiAJCWRtLT5kcWJfaXNvZnRsaW1pdCA9IGRpLT5kcWJfaXNvZnRsaW1pdDsKIAkJZG0tPmRxYl9paGFyZGxpbWl0ID0gZGktPmRxYl9paGFyZGxpbWl0OwogCQljaGVja19pbGltID0gMTsKKwkJX19zZXRfYml0KERRX0xBU1RTRVRfQiArIFFJRl9JTElNSVRTX0IsICZkcXVvdC0+ZHFfZmxhZ3MpOwogCX0KLQlpZiAoZGktPmRxYl92YWxpZCAmIFFJRl9CVElNRSkKKwlpZiAoZGktPmRxYl92YWxpZCAmIFFJRl9CVElNRSkgewogCQlkbS0+ZHFiX2J0aW1lID0gZGktPmRxYl9idGltZTsKLQlpZiAoZGktPmRxYl92YWxpZCAmIFFJRl9JVElNRSkKKwkJY2hlY2tfYmxpbSA9IDE7CisJCV9fc2V0X2JpdChEUV9MQVNUU0VUX0IgKyBRSUZfQlRJTUVfQiwgJmRxdW90LT5kcV9mbGFncyk7CisJfQorCWlmIChkaS0+ZHFiX3ZhbGlkICYgUUlGX0lUSU1FKSB7CiAJCWRtLT5kcWJfaXRpbWUgPSBkaS0+ZHFiX2l0aW1lOworCQljaGVja19pbGltID0gMTsKKwkJX19zZXRfYml0KERRX0xBU1RTRVRfQiArIFFJRl9JVElNRV9CLCAmZHF1b3QtPmRxX2ZsYWdzKTsKKwl9CiAKIAlpZiAoY2hlY2tfYmxpbSkgewotCQlpZiAoIWRtLT5kcWJfYnNvZnRsaW1pdCB8fCB0b3FiKGRtLT5kcWJfY3Vyc3BhY2UpIDwgZG0tPmRxYl9ic29mdGxpbWl0KSB7CisJCWlmICghZG0tPmRxYl9ic29mdGxpbWl0IHx8IGRtLT5kcWJfY3Vyc3BhY2UgPCBkbS0+ZHFiX2Jzb2Z0bGltaXQpIHsKIAkJCWRtLT5kcWJfYnRpbWUgPSAwOwogCQkJY2xlYXJfYml0KERRX0JMS1NfQiwgJmRxdW90LT5kcV9mbGFncyk7CiAJCX0KQEAgLTE5NzAsMTIgKzIxMzEsMTQgQEAKIAlpbnQgcmM7CiAKIAltdXRleF9sb2NrKCZzYl9kcW9wdChzYiktPmRxb25vZmZfbXV0ZXgpOwotCWlmICghKGRxdW90ID0gZHFnZXQoc2IsIGlkLCB0eXBlKSkpIHsKLQkJbXV0ZXhfdW5sb2NrKCZzYl9kcW9wdChzYiktPmRxb25vZmZfbXV0ZXgpOwotCQlyZXR1cm4gLUVTUkNIOworCWRxdW90ID0gZHFnZXQoc2IsIGlkLCB0eXBlKTsKKwlpZiAoIWRxdW90KSB7CisJCXJjID0gLUVTUkNIOworCQlnb3RvIG91dDsKIAl9CiAJcmMgPSBkb19zZXRfZHFibGsoZHF1b3QsIGRpKTsKIAlkcXB1dChkcXVvdCk7CitvdXQ6CiAJbXV0ZXhfdW5sb2NrKCZzYl9kcW9wdChzYiktPmRxb25vZmZfbXV0ZXgpOwogCXJldHVybiByYzsKIH0KQEAgLTE5ODYsNyArMjE0OSw3IEBACiAJc3RydWN0IG1lbV9kcWluZm8gKm1pOwogICAKIAltdXRleF9sb2NrKCZzYl9kcW9wdChzYiktPmRxb25vZmZfbXV0ZXgpOwotCWlmICghc2JfaGFzX3F1b3RhX2VuYWJsZWQoc2IsIHR5cGUpKSB7CisJaWYgKCFzYl9oYXNfcXVvdGFfYWN0aXZlKHNiLCB0eXBlKSkgewogCQltdXRleF91bmxvY2soJnNiX2Rxb3B0KHNiKS0+ZHFvbm9mZl9tdXRleCk7CiAJCXJldHVybiAtRVNSQ0g7CiAJfQpAQCAtMjAwNSwxMSArMjE2OCwxMiBAQAogaW50IHZmc19zZXRfZHFpbmZvKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCB0eXBlLCBzdHJ1Y3QgaWZfZHFpbmZvICppaSkKIHsKIAlzdHJ1Y3QgbWVtX2RxaW5mbyAqbWk7CisJaW50IGVyciA9IDA7CiAKIAltdXRleF9sb2NrKCZzYl9kcW9wdChzYiktPmRxb25vZmZfbXV0ZXgpOwotCWlmICghc2JfaGFzX3F1b3RhX2VuYWJsZWQoc2IsIHR5cGUpKSB7Ci0JCW11dGV4X3VubG9jaygmc2JfZHFvcHQoc2IpLT5kcW9ub2ZmX211dGV4KTsKLQkJcmV0dXJuIC1FU1JDSDsKKwlpZiAoIXNiX2hhc19xdW90YV9hY3RpdmUoc2IsIHR5cGUpKSB7CisJCWVyciA9IC1FU1JDSDsKKwkJZ290byBvdXQ7CiAJfQogCW1pID0gc2JfZHFvcHQoc2IpLT5pbmZvICsgdHlwZTsKIAlzcGluX2xvY2soJmRxX2RhdGFfbG9jayk7CkBAIC0yMDIzLDggKzIxODcsOSBAQAogCW1hcmtfaW5mb19kaXJ0eShzYiwgdHlwZSk7CiAJLyogRm9yY2Ugd3JpdGUgdG8gZGlzayAqLwogCXNiLT5kcV9vcC0+d3JpdGVfaW5mbyhzYiwgdHlwZSk7CitvdXQ6CiAJbXV0ZXhfdW5sb2NrKCZzYl9kcW9wdChzYiktPmRxb25vZmZfbXV0ZXgpOwotCXJldHVybiAwOworCXJldHVybiBlcnI7CiB9CiAKIHN0cnVjdCBxdW90YWN0bF9vcHMgdmZzX3F1b3RhY3RsX29wcyA9IHsKQEAgLTIxODYsMTAgKzIzNTEsMTMgQEAKIEVYUE9SVF9TWU1CT0wodW5yZWdpc3Rlcl9xdW90YV9mb3JtYXQpOwogRVhQT1JUX1NZTUJPTChkcXN0YXRzKTsKIEVYUE9SVF9TWU1CT0woZHFfZGF0YV9sb2NrKTsKK0VYUE9SVF9TWU1CT0wodmZzX3F1b3RhX2VuYWJsZSk7CiBFWFBPUlRfU1lNQk9MKHZmc19xdW90YV9vbik7CiBFWFBPUlRfU1lNQk9MKHZmc19xdW90YV9vbl9wYXRoKTsKIEVYUE9SVF9TWU1CT0wodmZzX3F1b3RhX29uX21vdW50KTsKK0VYUE9SVF9TWU1CT0wodmZzX3F1b3RhX2Rpc2FibGUpOwogRVhQT1JUX1NZTUJPTCh2ZnNfcXVvdGFfb2ZmKTsKK0VYUE9SVF9TWU1CT0woZHF1b3Rfc2Nhbl9hY3RpdmUpOwogRVhQT1JUX1NZTUJPTCh2ZnNfcXVvdGFfc3luYyk7CiBFWFBPUlRfU1lNQk9MKHZmc19nZXRfZHFpbmZvKTsKIEVYUE9SVF9TWU1CT0wodmZzX3NldF9kcWluZm8pOwpAQCAtMjIwMiw3ICsyMzcwLDExIEBACiBFWFBPUlRfU1lNQk9MKGRxdW90X21hcmtfZHF1b3RfZGlydHkpOwogRVhQT1JUX1NZTUJPTChkcXVvdF9pbml0aWFsaXplKTsKIEVYUE9SVF9TWU1CT0woZHF1b3RfZHJvcCk7CitFWFBPUlRfU1lNQk9MKGRxdW90X2Ryb3BfbG9ja2VkKTsKIEVYUE9SVF9TWU1CT0wodmZzX2RxX2Ryb3ApOworRVhQT1JUX1NZTUJPTChkcWdldCk7CitFWFBPUlRfU1lNQk9MKGRxcHV0KTsKK0VYUE9SVF9TWU1CT0woZHF1b3RfaXNfY2FjaGVkKTsKIEVYUE9SVF9TWU1CT0woZHF1b3RfYWxsb2Nfc3BhY2UpOwogRVhQT1JUX1NZTUJPTChkcXVvdF9hbGxvY19pbm9kZSk7CiBFWFBPUlRfU1lNQk9MKGRxdW90X2ZyZWVfc3BhY2UpOwpkaWZmIC0tZ2l0IGEvZnMvZWNyeXB0ZnMvY3J5cHRvLmMgYi9mcy9lY3J5cHRmcy9jcnlwdG8uYwppbmRleCA2MDQ2MjM5Li5jMDFlMDQzIDEwMDY0NAotLS0gYS9mcy9lY3J5cHRmcy9jcnlwdG8uYworKysgYi9mcy9lY3J5cHRmcy9jcnlwdG8uYwpAQCAtMTc1LDggKzE3NSw4IEBACiAgKgogICogUmV0dXJucyB6ZXJvIG9uIHN1Y2Nlc3M7IG5vbi16ZXJvIG9uIGVycm9yLgogICovCi1zdGF0aWMgaW50IGVjcnlwdGZzX2Rlcml2ZV9pdihjaGFyICppdiwgc3RydWN0IGVjcnlwdGZzX2NyeXB0X3N0YXQgKmNyeXB0X3N0YXQsCi0JCQkgICAgICBsb2ZmX3Qgb2Zmc2V0KQoraW50IGVjcnlwdGZzX2Rlcml2ZV9pdihjaGFyICppdiwgc3RydWN0IGVjcnlwdGZzX2NyeXB0X3N0YXQgKmNyeXB0X3N0YXQsCisJCSAgICAgICBsb2ZmX3Qgb2Zmc2V0KQogewogCWludCByYyA9IDA7CiAJY2hhciBkc3RbTUQ1X0RJR0VTVF9TSVpFXTsKQEAgLTkyNCw2ICs5MjQsMTUgQEAKIAkJY3J5cHRfc3RhdC0+ZmxhZ3MgfD0gRUNSWVBURlNfTUVUQURBVEFfSU5fWEFUVFI7CiAJaWYgKG1vdW50X2NyeXB0X3N0YXQtPmZsYWdzICYgRUNSWVBURlNfRU5DUllQVEVEX1ZJRVdfRU5BQkxFRCkKIAkJY3J5cHRfc3RhdC0+ZmxhZ3MgfD0gRUNSWVBURlNfVklFV19BU19FTkNSWVBURUQ7CisJaWYgKG1vdW50X2NyeXB0X3N0YXQtPmZsYWdzICYgRUNSWVBURlNfR0xPQkFMX0VOQ1JZUFRfRklMRU5BTUVTKSB7CisJCWNyeXB0X3N0YXQtPmZsYWdzIHw9IEVDUllQVEZTX0VOQ1JZUFRfRklMRU5BTUVTOworCQlpZiAobW91bnRfY3J5cHRfc3RhdC0+ZmxhZ3MKKwkJICAgICYgRUNSWVBURlNfR0xPQkFMX0VOQ0ZOX1VTRV9NT1VOVF9GTkVLKQorCQkJY3J5cHRfc3RhdC0+ZmxhZ3MgfD0gRUNSWVBURlNfRU5DRk5fVVNFX01PVU5UX0ZORUs7CisJCWVsc2UgaWYgKG1vdW50X2NyeXB0X3N0YXQtPmZsYWdzCisJCQkgJiBFQ1JZUFRGU19HTE9CQUxfRU5DRk5fVVNFX0ZFSykKKwkJCWNyeXB0X3N0YXQtPmZsYWdzIHw9IEVDUllQVEZTX0VOQ0ZOX1VTRV9GRUs7CisJfQogfQogCiBzdGF0aWMgaW50IGVjcnlwdGZzX2NvcHlfbW91bnRfd2lkZV9zaWdzX3RvX2lub2RlX3NpZ3MoCkBAIC0xMDYwLDcgKzEwNjksOCBAQAogc3RhdGljIHN0cnVjdCBlY3J5cHRmc19mbGFnX21hcF9lbGVtIGVjcnlwdGZzX2ZsYWdfbWFwW10gPSB7CiAJezB4MDAwMDAwMDEsIEVDUllQVEZTX0VOQUJMRV9ITUFDfSwKIAl7MHgwMDAwMDAwMiwgRUNSWVBURlNfRU5DUllQVEVEfSwKLQl7MHgwMDAwMDAwNCwgRUNSWVBURlNfTUVUQURBVEFfSU5fWEFUVFJ9CisJezB4MDAwMDAwMDQsIEVDUllQVEZTX01FVEFEQVRBX0lOX1hBVFRSfSwKKwl7MHgwMDAwMDAwOCwgRUNSWVBURlNfRU5DUllQVF9GSUxFTkFNRVN9CiB9OwogCiAvKioKQEAgLTExNDksMTkgKzExNTksMjAgQEAKIAogLyoqCiAgKiBlY3J5cHRmc19jb2RlX2Zvcl9jaXBoZXJfc3RyaW5nCi0gKiBAY3J5cHRfc3RhdDogVGhlIGNyeXB0b2dyYXBoaWMgY29udGV4dAorICogQGNpcGhlcl9uYW1lOiBUaGUgc3RyaW5nIGFsaWFzIGZvciB0aGUgY2lwaGVyCisgKiBAa2V5X2J5dGVzOiBMZW5ndGggb2Yga2V5IGluIGJ5dGVzOyB1c2VkIGZvciBBRVMgY29kZSBzZWxlY3Rpb24KICAqCiAgKiBSZXR1cm5zIHplcm8gb24gbm8gbWF0Y2gsIG9yIHRoZSBjaXBoZXIgY29kZSBvbiBtYXRjaAogICovCi11OCBlY3J5cHRmc19jb2RlX2Zvcl9jaXBoZXJfc3RyaW5nKHN0cnVjdCBlY3J5cHRmc19jcnlwdF9zdGF0ICpjcnlwdF9zdGF0KQordTggZWNyeXB0ZnNfY29kZV9mb3JfY2lwaGVyX3N0cmluZyhjaGFyICpjaXBoZXJfbmFtZSwgc2l6ZV90IGtleV9ieXRlcykKIHsKIAlpbnQgaTsKIAl1OCBjb2RlID0gMDsKIAlzdHJ1Y3QgZWNyeXB0ZnNfY2lwaGVyX2NvZGVfc3RyX21hcF9lbGVtICptYXAgPQogCQllY3J5cHRmc19jaXBoZXJfY29kZV9zdHJfbWFwOwogCi0JaWYgKHN0cmNtcChjcnlwdF9zdGF0LT5jaXBoZXIsICJhZXMiKSA9PSAwKSB7Ci0JCXN3aXRjaCAoY3J5cHRfc3RhdC0+a2V5X3NpemUpIHsKKwlpZiAoc3RyY21wKGNpcGhlcl9uYW1lLCAiYWVzIikgPT0gMCkgeworCQlzd2l0Y2ggKGtleV9ieXRlcykgewogCQljYXNlIDE2OgogCQkJY29kZSA9IFJGQzI0NDBfQ0lQSEVSX0FFU18xMjg7CiAJCQlicmVhazsKQEAgLTExNzMsNyArMTE4NCw3IEBACiAJCX0KIAl9IGVsc2UgewogCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShlY3J5cHRmc19jaXBoZXJfY29kZV9zdHJfbWFwKTsgaSsrKQotCQkJaWYgKHN0cmNtcChjcnlwdF9zdGF0LT5jaXBoZXIsIG1hcFtpXS5jaXBoZXJfc3RyKSA9PSAwKXsKKwkJCWlmIChzdHJjbXAoY2lwaGVyX25hbWUsIG1hcFtpXS5jaXBoZXJfc3RyKSA9PSAwKSB7CiAJCQkJY29kZSA9IG1hcFtpXS5jaXBoZXJfY29kZTsKIAkJCQlicmVhazsKIAkJCX0KQEAgLTEyMTIsNiArMTIyMyw4IEBACiAJCSYoZWNyeXB0ZnNfaW5vZGVfdG9fcHJpdmF0ZShlY3J5cHRmc19pbm9kZSktPmNyeXB0X3N0YXQpOwogCWludCByYzsKIAorCWlmIChjcnlwdF9zdGF0LT5leHRlbnRfc2l6ZSA9PSAwKQorCQljcnlwdF9zdGF0LT5leHRlbnRfc2l6ZSA9IEVDUllQVEZTX0RFRkFVTFRfRVhURU5UX1NJWkU7CiAJcmMgPSBlY3J5cHRmc19yZWFkX2xvd2VyKGRhdGEsIDAsIGNyeXB0X3N0YXQtPmV4dGVudF9zaXplLAogCQkJCSBlY3J5cHRmc19pbm9kZSk7CiAJaWYgKHJjKSB7CkBAIC0xMjIxLDcgKzEyMzQsNiBAQAogCX0KIAlpZiAoIWNvbnRhaW5zX2VjcnlwdGZzX21hcmtlcihkYXRhICsgRUNSWVBURlNfRklMRV9TSVpFX0JZVEVTKSkgewogCQlyYyA9IC1FSU5WQUw7Ci0JCWVjcnlwdGZzX3ByaW50ayhLRVJOX0RFQlVHLCAiVmFsaWQgbWFya2VyIG5vdCBmb3VuZFxuIik7CiAJfQogb3V0OgogCXJldHVybiByYzsKQEAgLTE2MjgsOTUgKzE2NDAsOTUgQEAKIH0KIAogLyoqCi0gKiBlY3J5cHRmc19lbmNvZGVfZmlsZW5hbWUgLSBjb252ZXJ0cyBhIHBsYWludGV4dCBmaWxlIG5hbWUgdG8gY2lwaGVyIHRleHQKLSAqIEBjcnlwdF9zdGF0OiBUaGUgY3J5cHRfc3RhdCBzdHJ1Y3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBmaWxlIGFuZW0gdG8gZW5jb2RlCi0gKiBAbmFtZTogVGhlIHBsYWludGV4dCBuYW1lCi0gKiBAbGVuZ3RoOiBUaGUgbGVuZ3RoIG9mIHRoZSBwbGFpbnRleHQKLSAqIEBlbmNvZGVkX25hbWU6IFRoZSBlbmN5cHRlZCBuYW1lCisgKiBlY3J5cHRmc19lbmNyeXB0X2ZpbGVuYW1lIC0gZW5jcnlwdCBmaWxlbmFtZQogICoKLSAqIEVuY3J5cHRzIGFuZCBlbmNvZGVzIGEgZmlsZW5hbWUgaW50byBzb21ldGhpbmcgdGhhdCBjb25zdGl0dXRlcyBhCi0gKiB2YWxpZCBmaWxlbmFtZSBmb3IgYSBmaWxlc3lzdGVtLCB3aXRoIHByaW50YWJsZSBjaGFyYWN0ZXJzLgorICogQ0JDLWVuY3J5cHRzIHRoZSBmaWxlbmFtZS4gV2UgZG8gbm90IHdhbnQgdG8gZW5jcnlwdCB0aGUgc2FtZQorICogZmlsZW5hbWUgd2l0aCB0aGUgc2FtZSBrZXkgYW5kIElWLCB3aGljaCBtYXkgaGFwcGVuIHdpdGggaGFyZAorICogbGlua3MsIHNvIHdlIHByZXBlbmQgcmFuZG9tIGJpdHMgdG8gZWFjaCBmaWxlbmFtZS4KICAqCi0gKiBXZSBhc3N1bWUgdGhhdCB3ZSBoYXZlIGEgcHJvcGVybHkgaW5pdGlhbGl6ZWQgY3J5cHRvIGNvbnRleHQsCi0gKiBwb2ludGVkIHRvIGJ5IGNyeXB0X3N0YXQtPnRmbS4KLSAqCi0gKiBUT0RPOiBJbXBsZW1lbnQgZmlsZW5hbWUgZGVjb2RpbmcgYW5kIGRlY3J5cHRpb24gaGVyZSwgaW4gcGxhY2Ugb2YKLSAqIG1lbWNweS4gV2UgYXJlIGtlZXBpbmcgdGhlIGZyYW1ld29yayBhcm91bmQgZm9yIG5vdyB0byAoMSkKLSAqIGZhY2lsaXRhdGUgdGVzdGluZyBvZiB0aGUgY29tcG9uZW50cyBuZWVkZWQgdG8gaW1wbGVtZW50IGZpbGVuYW1lCi0gKiBlbmNyeXB0aW9uIGFuZCAoMikgdG8gcHJvdmlkZSBhIGNvZGUgYmFzZSBmcm9tIHdoaWNoIG90aGVyCi0gKiBkZXZlbG9wZXJzIGluIHRoZSBjb21tdW5pdHkgY2FuIGVhc2lseSBpbXBsZW1lbnQgdGhpcyBmZWF0dXJlLgotICoKLSAqIFJldHVybnMgdGhlIGxlbmd0aCBvZiBlbmNvZGVkIGZpbGVuYW1lOyBuZWdhdGl2ZSBpZiBlcnJvcgorICogUmV0dXJucyB6ZXJvIG9uIHN1Y2Nlc3M7IG5vbi16ZXJvIG90aGVyd2lzZQogICovCi1pbnQKLWVjcnlwdGZzX2VuY29kZV9maWxlbmFtZShzdHJ1Y3QgZWNyeXB0ZnNfY3J5cHRfc3RhdCAqY3J5cHRfc3RhdCwKLQkJCSBjb25zdCBjaGFyICpuYW1lLCBpbnQgbGVuZ3RoLCBjaGFyICoqZW5jb2RlZF9uYW1lKQorc3RhdGljIGludAorZWNyeXB0ZnNfZW5jcnlwdF9maWxlbmFtZShzdHJ1Y3QgZWNyeXB0ZnNfZmlsZW5hbWUgKmZpbGVuYW1lLAorCQkJICBzdHJ1Y3QgZWNyeXB0ZnNfY3J5cHRfc3RhdCAqY3J5cHRfc3RhdCwKKwkJCSAgc3RydWN0IGVjcnlwdGZzX21vdW50X2NyeXB0X3N0YXQgKm1vdW50X2NyeXB0X3N0YXQpCiB7Ci0JaW50IGVycm9yID0gMDsKKwlpbnQgcmMgPSAwOwogCi0JKCplbmNvZGVkX25hbWUpID0ga21hbGxvYyhsZW5ndGggKyAyLCBHRlBfS0VSTkVMKTsKLQlpZiAoISgqZW5jb2RlZF9uYW1lKSkgewotCQllcnJvciA9IC1FTk9NRU07CisJZmlsZW5hbWUtPmVuY3J5cHRlZF9maWxlbmFtZSA9IE5VTEw7CisJZmlsZW5hbWUtPmVuY3J5cHRlZF9maWxlbmFtZV9zaXplID0gMDsKKwlpZiAoKGNyeXB0X3N0YXQgJiYgKGNyeXB0X3N0YXQtPmZsYWdzICYgRUNSWVBURlNfRU5DRk5fVVNFX01PVU5UX0ZORUspKQorCSAgICB8fCAobW91bnRfY3J5cHRfc3RhdCAmJiAobW91bnRfY3J5cHRfc3RhdC0+ZmxhZ3MKKwkJCQkgICAgICYgRUNSWVBURlNfR0xPQkFMX0VOQ0ZOX1VTRV9NT1VOVF9GTkVLKSkpIHsKKwkJc2l6ZV90IHBhY2tldF9zaXplOworCQlzaXplX3QgcmVtYWluaW5nX2J5dGVzOworCisJCXJjID0gZWNyeXB0ZnNfd3JpdGVfdGFnXzcwX3BhY2tldCgKKwkJCU5VTEwsIE5VTEwsCisJCQkmZmlsZW5hbWUtPmVuY3J5cHRlZF9maWxlbmFtZV9zaXplLAorCQkJbW91bnRfY3J5cHRfc3RhdCwgTlVMTCwKKwkJCWZpbGVuYW1lLT5maWxlbmFtZV9zaXplKTsKKwkJaWYgKHJjKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBFcnJvciBhdHRlbXB0aW5nIHRvIGdldCBwYWNrZXQgIgorCQkJICAgICAgICJzaXplIGZvciB0YWcgNzI7IHJjID0gWyVkXVxuIiwgX19mdW5jX18sCisJCQkgICAgICAgcmMpOworCQkJZmlsZW5hbWUtPmVuY3J5cHRlZF9maWxlbmFtZV9zaXplID0gMDsKKwkJCWdvdG8gb3V0OworCQl9CisJCWZpbGVuYW1lLT5lbmNyeXB0ZWRfZmlsZW5hbWUgPQorCQkJa21hbGxvYyhmaWxlbmFtZS0+ZW5jcnlwdGVkX2ZpbGVuYW1lX3NpemUsIEdGUF9LRVJORUwpOworCQlpZiAoIWZpbGVuYW1lLT5lbmNyeXB0ZWRfZmlsZW5hbWUpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IE91dCBvZiBtZW1vcnkgd2hpbHN0IGF0dGVtcHRpbmcgIgorCQkJICAgICAgICJ0byBrbWFsbG9jIFslemRdIGJ5dGVzXG4iLCBfX2Z1bmNfXywKKwkJCSAgICAgICBmaWxlbmFtZS0+ZW5jcnlwdGVkX2ZpbGVuYW1lX3NpemUpOworCQkJcmMgPSAtRU5PTUVNOworCQkJZ290byBvdXQ7CisJCX0KKwkJcmVtYWluaW5nX2J5dGVzID0gZmlsZW5hbWUtPmVuY3J5cHRlZF9maWxlbmFtZV9zaXplOworCQlyYyA9IGVjcnlwdGZzX3dyaXRlX3RhZ183MF9wYWNrZXQoZmlsZW5hbWUtPmVuY3J5cHRlZF9maWxlbmFtZSwKKwkJCQkJCSAgJnJlbWFpbmluZ19ieXRlcywKKwkJCQkJCSAgJnBhY2tldF9zaXplLAorCQkJCQkJICBtb3VudF9jcnlwdF9zdGF0LAorCQkJCQkJICBmaWxlbmFtZS0+ZmlsZW5hbWUsCisJCQkJCQkgIGZpbGVuYW1lLT5maWxlbmFtZV9zaXplKTsKKwkJaWYgKHJjKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBFcnJvciBhdHRlbXB0aW5nIHRvIGdlbmVyYXRlICIKKwkJCSAgICAgICAidGFnIDcwIHBhY2tldDsgcmMgPSBbJWRdXG4iLCBfX2Z1bmNfXywKKwkJCSAgICAgICByYyk7CisJCQlrZnJlZShmaWxlbmFtZS0+ZW5jcnlwdGVkX2ZpbGVuYW1lKTsKKwkJCWZpbGVuYW1lLT5lbmNyeXB0ZWRfZmlsZW5hbWUgPSBOVUxMOworCQkJZmlsZW5hbWUtPmVuY3J5cHRlZF9maWxlbmFtZV9zaXplID0gMDsKKwkJCWdvdG8gb3V0OworCQl9CisJCWZpbGVuYW1lLT5lbmNyeXB0ZWRfZmlsZW5hbWVfc2l6ZSA9IHBhY2tldF9zaXplOworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IE5vIHN1cHBvcnQgZm9yIHJlcXVlc3RlZCBmaWxlbmFtZSAiCisJCSAgICAgICAiZW5jcnlwdGlvbiBtZXRob2QgaW4gdGhpcyByZWxlYXNlXG4iLCBfX2Z1bmNfXyk7CisJCXJjID0gLUVOT1RTVVBQOwogCQlnb3RvIG91dDsKIAl9Ci0JLyogVE9ETzogRmlsZW5hbWUgZW5jcnlwdGlvbiBpcyBhIHNjaGVkdWxlZCBmZWF0dXJlIGZvciBhCi0JICogZnV0dXJlIHZlcnNpb24gb2YgZUNyeXB0ZnMuIFRoaXMgZnVuY3Rpb24gaXMgaGVyZSBvbmx5IGZvcgotCSAqIHRoZSBwdXJwb3NlIG9mIHByb3ZpZGluZyBhIGZyYW1ld29yayBmb3Igb3RoZXIgZGV2ZWxvcGVycwotCSAqIHRvIGVhc2lseSBpbXBsZW1lbnQgZmlsZW5hbWUgZW5jcnlwdGlvbi4gSGludDogUmVwbGFjZSB0aGlzCi0JICogbWVtY3B5KCkgd2l0aCBhIGNhbGwgdG8gZW5jcnlwdCBhbmQgZW5jb2RlIHRoZQotCSAqIGZpbGVuYW1lLCB0aGUgc2V0IHRoZSBsZW5ndGggYWNjb3JkaW5nbHkuICovCi0JbWVtY3B5KCh2b2lkICopKCplbmNvZGVkX25hbWUpLCAodm9pZCAqKW5hbWUsIGxlbmd0aCk7Ci0JKCplbmNvZGVkX25hbWUpW2xlbmd0aF0gPSAnXDAnOwotCWVycm9yID0gbGVuZ3RoICsgMTsKIG91dDoKLQlyZXR1cm4gZXJyb3I7CisJcmV0dXJuIHJjOwogfQogCi0vKioKLSAqIGVjcnlwdGZzX2RlY29kZV9maWxlbmFtZSAtIGNvbnZlcnRzIHRoZSBjaXBoZXIgdGV4dCBuYW1lIHRvIHBsYWludGV4dAotICogQGNyeXB0X3N0YXQ6IFRoZSBjcnlwdF9zdGF0IHN0cnVjdCBhc3NvY2lhdGVkIHdpdGggdGhlIGZpbGUKLSAqIEBuYW1lOiBUaGUgZmlsZW5hbWUgaW4gY2lwaGVyIHRleHQKLSAqIEBsZW5ndGg6IFRoZSBsZW5ndGggb2YgdGhlIGNpcGhlciB0ZXh0IG5hbWUKLSAqIEBkZWNyeXB0ZWRfbmFtZTogVGhlIHBsYWludGV4dCBuYW1lCi0gKgotICogRGVjb2RlcyBhbmQgZGVjcnlwdHMgdGhlIGZpbGVuYW1lLgotICoKLSAqIFdlIGFzc3VtZSB0aGF0IHdlIGhhdmUgYSBwcm9wZXJseSBpbml0aWFsaXplZCBjcnlwdG8gY29udGV4dCwKLSAqIHBvaW50ZWQgdG8gYnkgY3J5cHRfc3RhdC0+dGZtLgotICoKLSAqIFRPRE86IEltcGxlbWVudCBmaWxlbmFtZSBkZWNvZGluZyBhbmQgZGVjcnlwdGlvbiBoZXJlLCBpbiBwbGFjZSBvZgotICogbWVtY3B5LiBXZSBhcmUga2VlcGluZyB0aGUgZnJhbWV3b3JrIGFyb3VuZCBmb3Igbm93IHRvICgxKQotICogZmFjaWxpdGF0ZSB0ZXN0aW5nIG9mIHRoZSBjb21wb25lbnRzIG5lZWRlZCB0byBpbXBsZW1lbnQgZmlsZW5hbWUKLSAqIGVuY3J5cHRpb24gYW5kICgyKSB0byBwcm92aWRlIGEgY29kZSBiYXNlIGZyb20gd2hpY2ggb3RoZXIKLSAqIGRldmVsb3BlcnMgaW4gdGhlIGNvbW11bml0eSBjYW4gZWFzaWx5IGltcGxlbWVudCB0aGlzIGZlYXR1cmUuCi0gKgotICogUmV0dXJucyB0aGUgbGVuZ3RoIG9mIGRlY29kZWQgZmlsZW5hbWU7IG5lZ2F0aXZlIGlmIGVycm9yCi0gKi8KLWludAotZWNyeXB0ZnNfZGVjb2RlX2ZpbGVuYW1lKHN0cnVjdCBlY3J5cHRmc19jcnlwdF9zdGF0ICpjcnlwdF9zdGF0LAotCQkJIGNvbnN0IGNoYXIgKm5hbWUsIGludCBsZW5ndGgsIGNoYXIgKipkZWNyeXB0ZWRfbmFtZSkKK3N0YXRpYyBpbnQgZWNyeXB0ZnNfY29weV9maWxlbmFtZShjaGFyICoqY29waWVkX25hbWUsIHNpemVfdCAqY29waWVkX25hbWVfc2l6ZSwKKwkJCQkgIGNvbnN0IGNoYXIgKm5hbWUsIHNpemVfdCBuYW1lX3NpemUpCiB7Ci0JaW50IGVycm9yID0gMDsKKwlpbnQgcmMgPSAwOwogCi0JKCpkZWNyeXB0ZWRfbmFtZSkgPSBrbWFsbG9jKGxlbmd0aCArIDIsIEdGUF9LRVJORUwpOwotCWlmICghKCpkZWNyeXB0ZWRfbmFtZSkpIHsKLQkJZXJyb3IgPSAtRU5PTUVNOworCSgqY29waWVkX25hbWUpID0ga21hbGxvYygobmFtZV9zaXplICsgMiksIEdGUF9LRVJORUwpOworCWlmICghKCpjb3BpZWRfbmFtZSkpIHsKKwkJcmMgPSAtRU5PTUVNOwogCQlnb3RvIG91dDsKIAl9Ci0JLyogVE9ETzogRmlsZW5hbWUgZW5jcnlwdGlvbiBpcyBhIHNjaGVkdWxlZCBmZWF0dXJlIGZvciBhCi0JICogZnV0dXJlIHZlcnNpb24gb2YgZUNyeXB0ZnMuIFRoaXMgZnVuY3Rpb24gaXMgaGVyZSBvbmx5IGZvcgotCSAqIHRoZSBwdXJwb3NlIG9mIHByb3ZpZGluZyBhIGZyYW1ld29yayBmb3Igb3RoZXIgZGV2ZWxvcGVycwotCSAqIHRvIGVhc2lseSBpbXBsZW1lbnQgZmlsZW5hbWUgZW5jcnlwdGlvbi4gSGludDogUmVwbGFjZSB0aGlzCi0JICogbWVtY3B5KCkgd2l0aCBhIGNhbGwgdG8gZGVjb2RlIGFuZCBkZWNyeXB0IHRoZQotCSAqIGZpbGVuYW1lLCB0aGUgc2V0IHRoZSBsZW5ndGggYWNjb3JkaW5nbHkuICovCi0JbWVtY3B5KCh2b2lkICopKCpkZWNyeXB0ZWRfbmFtZSksICh2b2lkICopbmFtZSwgbGVuZ3RoKTsKLQkoKmRlY3J5cHRlZF9uYW1lKVtsZW5ndGggKyAxXSA9ICdcMCc7CS8qIE9ubHkgZm9yIGNvbnZlbmllbmNlCisJbWVtY3B5KCh2b2lkICopKCpjb3BpZWRfbmFtZSksICh2b2lkICopbmFtZSwgbmFtZV9zaXplKTsKKwkoKmNvcGllZF9uYW1lKVsobmFtZV9zaXplKV0gPSAnXDAnOwkvKiBPbmx5IGZvciBjb252ZW5pZW5jZQogCQkJCQkJICogaW4gcHJpbnRpbmcgb3V0IHRoZQogCQkJCQkJICogc3RyaW5nIGluIGRlYnVnCiAJCQkJCQkgKiBtZXNzYWdlcyAqLwotCWVycm9yID0gbGVuZ3RoOworCSgqY29waWVkX25hbWVfc2l6ZSkgPSAobmFtZV9zaXplICsgMSk7CiBvdXQ6Ci0JcmV0dXJuIGVycm9yOworCXJldHVybiByYzsKIH0KIAogLyoqCkBAIC0xNzQwLDcgKzE3NTIsNyBAQAogCSprZXlfdGZtID0gTlVMTDsKIAlpZiAoKmtleV9zaXplID4gRUNSWVBURlNfTUFYX0tFWV9CWVRFUykgewogCQlyYyA9IC1FSU5WQUw7Ci0JCXByaW50ayhLRVJOX0VSUiAiUmVxdWVzdGVkIGtleSBzaXplIGlzIFslWmRdIGJ5dGVzOyBtYXhpbXVtICIKKwkJcHJpbnRrKEtFUk5fRVJSICJSZXF1ZXN0ZWQga2V5IHNpemUgaXMgWyV6ZF0gYnl0ZXM7IG1heGltdW0gIgogCQkgICAgICAiYWxsb3dhYmxlIGlzIFslZF1cbiIsICprZXlfc2l6ZSwgRUNSWVBURlNfTUFYX0tFWV9CWVRFUyk7CiAJCWdvdG8gb3V0OwogCX0KQEAgLTE3NjUsNyArMTc3Nyw3IEBACiAJZ2V0X3JhbmRvbV9ieXRlcyhkdW1teV9rZXksICprZXlfc2l6ZSk7CiAJcmMgPSBjcnlwdG9fYmxrY2lwaGVyX3NldGtleSgqa2V5X3RmbSwgZHVtbXlfa2V5LCAqa2V5X3NpemUpOwogCWlmIChyYykgewotCQlwcmludGsoS0VSTl9FUlIgIkVycm9yIGF0dGVtcHRpbmcgdG8gc2V0IGtleSBvZiBzaXplIFslWmRdIGZvciAiCisJCXByaW50ayhLRVJOX0VSUiAiRXJyb3IgYXR0ZW1wdGluZyB0byBzZXQga2V5IG9mIHNpemUgWyV6ZF0gZm9yICIKIAkJICAgICAgICJjaXBoZXIgWyVzXTsgcmMgPSBbJWRdXG4iLCAqa2V5X3NpemUsIGNpcGhlcl9uYW1lLCByYyk7CiAJCXJjID0gLUVJTlZBTDsKIAkJZ290byBvdXQ7CkBAIC0xOTEwLDMgKzE5MjIsMzQxIEBACiAJbXV0ZXhfdW5sb2NrKCZrZXlfdGZtX2xpc3RfbXV0ZXgpOwogCXJldHVybiByYzsKIH0KKworLyogNjQgY2hhcmFjdGVycyBmb3JtaW5nIGEgNi1iaXQgdGFyZ2V0IGZpZWxkICovCitzdGF0aWMgdW5zaWduZWQgY2hhciAqcG9ydGFibGVfZmlsZW5hbWVfY2hhcnMgPSAoIi0uMDEyMzQ1Njc4OUFCQ0QiCisJCQkJCQkgIkVGR0hJSktMTU5PUFFSU1QiCisJCQkJCQkgIlVWV1hZWmFiY2RlZmdoaWoiCisJCQkJCQkgImtsbW5vcHFyc3R1dnd4eXoiKTsKKworLyogV2UgY291bGQgZWl0aGVyIG9mZnNldCBvbiBldmVyeSByZXZlcnNlIG1hcCBvciBqdXN0IHBhZCBzb21lIDB4MDAncworICogYXQgdGhlIGZyb250IGhlcmUgKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGZpbGVuYW1lX3Jldl9tYXBbXSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMTUgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAyMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDMxICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMzkgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAvKiA0NyAqLworCTB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIDB4MDgsIDB4MDksIC8qIDU1ICovCisJMHgwQSwgMHgwQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogNjMgKi8KKwkweDAwLCAweDBDLCAweDBELCAweDBFLCAweDBGLCAweDEwLCAweDExLCAweDEyLCAvKiA3MSAqLworCTB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsIDB4MTgsIDB4MTksIDB4MUEsIC8qIDc5ICovCisJMHgxQiwgMHgxQywgMHgxRCwgMHgxRSwgMHgxRiwgMHgyMCwgMHgyMSwgMHgyMiwgLyogODcgKi8KKwkweDIzLCAweDI0LCAweDI1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiA5NSAqLworCTB4MDAsIDB4MjYsIDB4MjcsIDB4MjgsIDB4MjksIDB4MkEsIDB4MkIsIDB4MkMsIC8qIDEwMyAqLworCTB4MkQsIDB4MkUsIDB4MkYsIDB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIC8qIDExMSAqLworCTB4MzUsIDB4MzYsIDB4MzcsIDB4MzgsIDB4MzksIDB4M0EsIDB4M0IsIDB4M0MsIC8qIDExOSAqLworCTB4M0QsIDB4M0UsIDB4M0YKK307CisKKy8qKgorICogZWNyeXB0ZnNfZW5jb2RlX2Zvcl9maWxlbmFtZQorICogQGRzdDogRGVzdGluYXRpb24gbG9jYXRpb24gZm9yIGVuY29kZWQgZmlsZW5hbWUKKyAqIEBkc3Rfc2l6ZTogU2l6ZSBvZiB0aGUgZW5jb2RlZCBmaWxlbmFtZSBpbiBieXRlcworICogQHNyYzogU291cmNlIGxvY2F0aW9uIGZvciB0aGUgZmlsZW5hbWUgdG8gZW5jb2RlCisgKiBAc3JjX3NpemU6IFNpemUgb2YgdGhlIHNvdXJjZSBpbiBieXRlcworICovCit2b2lkIGVjcnlwdGZzX2VuY29kZV9mb3JfZmlsZW5hbWUodW5zaWduZWQgY2hhciAqZHN0LCBzaXplX3QgKmRzdF9zaXplLAorCQkJCSAgdW5zaWduZWQgY2hhciAqc3JjLCBzaXplX3Qgc3JjX3NpemUpCit7CisJc2l6ZV90IG51bV9ibG9ja3M7CisJc2l6ZV90IGJsb2NrX251bSA9IDA7CisJc2l6ZV90IGRzdF9vZmZzZXQgPSAwOworCXVuc2lnbmVkIGNoYXIgbGFzdF9ibG9ja1szXTsKKworCWlmIChzcmNfc2l6ZSA9PSAwKSB7CisJCSgqZHN0X3NpemUpID0gMDsKKwkJZ290byBvdXQ7CisJfQorCW51bV9ibG9ja3MgPSAoc3JjX3NpemUgLyAzKTsKKwlpZiAoKHNyY19zaXplICUgMykgPT0gMCkgeworCQltZW1jcHkobGFzdF9ibG9jaywgKCZzcmNbc3JjX3NpemUgLSAzXSksIDMpOworCX0gZWxzZSB7CisJCW51bV9ibG9ja3MrKzsKKwkJbGFzdF9ibG9ja1syXSA9IDB4MDA7CisJCXN3aXRjaCAoc3JjX3NpemUgJSAzKSB7CisJCWNhc2UgMToKKwkJCWxhc3RfYmxvY2tbMF0gPSBzcmNbc3JjX3NpemUgLSAxXTsKKwkJCWxhc3RfYmxvY2tbMV0gPSAweDAwOworCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCWxhc3RfYmxvY2tbMF0gPSBzcmNbc3JjX3NpemUgLSAyXTsKKwkJCWxhc3RfYmxvY2tbMV0gPSBzcmNbc3JjX3NpemUgLSAxXTsKKwkJfQorCX0KKwkoKmRzdF9zaXplKSA9IChudW1fYmxvY2tzICogNCk7CisJaWYgKCFkc3QpCisJCWdvdG8gb3V0OworCXdoaWxlIChibG9ja19udW0gPCBudW1fYmxvY2tzKSB7CisJCXVuc2lnbmVkIGNoYXIgKnNyY19ibG9jazsKKwkJdW5zaWduZWQgY2hhciBkc3RfYmxvY2tbNF07CisKKwkJaWYgKGJsb2NrX251bSA9PSAobnVtX2Jsb2NrcyAtIDEpKQorCQkJc3JjX2Jsb2NrID0gbGFzdF9ibG9jazsKKwkJZWxzZQorCQkJc3JjX2Jsb2NrID0gJnNyY1tibG9ja19udW0gKiAzXTsKKwkJZHN0X2Jsb2NrWzBdID0gKChzcmNfYmxvY2tbMF0gPj4gMikgJiAweDNGKTsKKwkJZHN0X2Jsb2NrWzFdID0gKCgoc3JjX2Jsb2NrWzBdIDw8IDQpICYgMHgzMCkKKwkJCQl8ICgoc3JjX2Jsb2NrWzFdID4+IDQpICYgMHgwRikpOworCQlkc3RfYmxvY2tbMl0gPSAoKChzcmNfYmxvY2tbMV0gPDwgMikgJiAweDNDKQorCQkJCXwgKChzcmNfYmxvY2tbMl0gPj4gNikgJiAweDAzKSk7CisJCWRzdF9ibG9ja1szXSA9IChzcmNfYmxvY2tbMl0gJiAweDNGKTsKKwkJZHN0W2RzdF9vZmZzZXQrK10gPSBwb3J0YWJsZV9maWxlbmFtZV9jaGFyc1tkc3RfYmxvY2tbMF1dOworCQlkc3RbZHN0X29mZnNldCsrXSA9IHBvcnRhYmxlX2ZpbGVuYW1lX2NoYXJzW2RzdF9ibG9ja1sxXV07CisJCWRzdFtkc3Rfb2Zmc2V0KytdID0gcG9ydGFibGVfZmlsZW5hbWVfY2hhcnNbZHN0X2Jsb2NrWzJdXTsKKwkJZHN0W2RzdF9vZmZzZXQrK10gPSBwb3J0YWJsZV9maWxlbmFtZV9jaGFyc1tkc3RfYmxvY2tbM11dOworCQlibG9ja19udW0rKzsKKwl9CitvdXQ6CisJcmV0dXJuOworfQorCisvKioKKyAqIGVjcnlwdGZzX2RlY29kZV9mcm9tX2ZpbGVuYW1lCisgKiBAZHN0OiBJZiBOVUxMLCB0aGlzIGZ1bmN0aW9uIG9ubHkgc2V0cyBAZHN0X3NpemUgYW5kIHJldHVybnMuIElmCisgKiAgICAgICBub24tTlVMTCwgdGhpcyBmdW5jdGlvbiBkZWNvZGVzIHRoZSBlbmNvZGVkIG9jdGV0cyBpbiBAc3JjCisgKiAgICAgICBpbnRvIHRoZSBtZW1vcnkgdGhhdCBAZHN0IHBvaW50cyB0by4KKyAqIEBkc3Rfc2l6ZTogU2V0IHRvIHRoZSBzaXplIG9mIHRoZSBkZWNvZGVkIHN0cmluZy4KKyAqIEBzcmM6IFRoZSBlbmNvZGVkIHNldCBvZiBvY3RldHMgdG8gZGVjb2RlLgorICogQHNyY19zaXplOiBUaGUgc2l6ZSBvZiB0aGUgZW5jb2RlZCBzZXQgb2Ygb2N0ZXRzIHRvIGRlY29kZS4KKyAqLworc3RhdGljIHZvaWQKK2VjcnlwdGZzX2RlY29kZV9mcm9tX2ZpbGVuYW1lKHVuc2lnbmVkIGNoYXIgKmRzdCwgc2l6ZV90ICpkc3Rfc2l6ZSwKKwkJCSAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyYywgc2l6ZV90IHNyY19zaXplKQoreworCXU4IGN1cnJlbnRfYml0X29mZnNldCA9IDA7CisJc2l6ZV90IHNyY19ieXRlX29mZnNldCA9IDA7CisJc2l6ZV90IGRzdF9ieXRlX29mZnNldCA9IDA7CisKKwlpZiAoZHN0ID09IE5VTEwpIHsKKwkJLyogTm90IGV4YWN0OyBjb25zZXJ2YXRpdmVseSBsb25nLiBFdmVyeSBibG9jayBvZiA0CisJCSAqIGVuY29kZWQgY2hhcmFjdGVycyBkZWNvZGVzIGludG8gYSBibG9jayBvZiAzCisJCSAqIGRlY29kZWQgY2hhcmFjdGVycy4gVGhpcyBzZWdtZW50IG9mIGNvZGUgcHJvdmlkZXMKKwkJICogdGhlIGNhbGxlciB3aXRoIHRoZSBtYXhpbXVtIGFtb3VudCBvZiBhbGxvY2F0ZWQKKwkJICogc3BhY2UgdGhhdCBAZHN0IHdpbGwgbmVlZCB0byBwb2ludCB0byBpbiBhCisJCSAqIHN1YnNlcXVlbnQgY2FsbC4gKi8KKwkJKCpkc3Rfc2l6ZSkgPSAoKChzcmNfc2l6ZSArIDEpICogMykgLyA0KTsKKwkJZ290byBvdXQ7CisJfQorCXdoaWxlIChzcmNfYnl0ZV9vZmZzZXQgPCBzcmNfc2l6ZSkgeworCQl1bnNpZ25lZCBjaGFyIHNyY19ieXRlID0KKwkJCQlmaWxlbmFtZV9yZXZfbWFwWyhpbnQpc3JjW3NyY19ieXRlX29mZnNldF1dOworCisJCXN3aXRjaCAoY3VycmVudF9iaXRfb2Zmc2V0KSB7CisJCWNhc2UgMDoKKwkJCWRzdFtkc3RfYnl0ZV9vZmZzZXRdID0gKHNyY19ieXRlIDw8IDIpOworCQkJY3VycmVudF9iaXRfb2Zmc2V0ID0gNjsKKwkJCWJyZWFrOworCQljYXNlIDY6CisJCQlkc3RbZHN0X2J5dGVfb2Zmc2V0KytdIHw9IChzcmNfYnl0ZSA+PiA0KTsKKwkJCWRzdFtkc3RfYnl0ZV9vZmZzZXRdID0gKChzcmNfYnl0ZSAmIDB4RikKKwkJCQkJCSA8PCA0KTsKKwkJCWN1cnJlbnRfYml0X29mZnNldCA9IDQ7CisJCQlicmVhazsKKwkJY2FzZSA0OgorCQkJZHN0W2RzdF9ieXRlX29mZnNldCsrXSB8PSAoc3JjX2J5dGUgPj4gMik7CisJCQlkc3RbZHN0X2J5dGVfb2Zmc2V0XSA9IChzcmNfYnl0ZSA8PCA2KTsKKwkJCWN1cnJlbnRfYml0X29mZnNldCA9IDI7CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJZHN0W2RzdF9ieXRlX29mZnNldCsrXSB8PSAoc3JjX2J5dGUpOworCQkJZHN0W2RzdF9ieXRlX29mZnNldF0gPSAwOworCQkJY3VycmVudF9iaXRfb2Zmc2V0ID0gMDsKKwkJCWJyZWFrOworCQl9CisJCXNyY19ieXRlX29mZnNldCsrOworCX0KKwkoKmRzdF9zaXplKSA9IGRzdF9ieXRlX29mZnNldDsKK291dDoKKwlyZXR1cm47Cit9CisKKy8qKgorICogZWNyeXB0ZnNfZW5jcnlwdF9hbmRfZW5jb2RlX2ZpbGVuYW1lIC0gY29udmVydHMgYSBwbGFpbnRleHQgZmlsZSBuYW1lIHRvIGNpcGhlciB0ZXh0CisgKiBAY3J5cHRfc3RhdDogVGhlIGNyeXB0X3N0YXQgc3RydWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgZmlsZSBhbmVtIHRvIGVuY29kZQorICogQG5hbWU6IFRoZSBwbGFpbnRleHQgbmFtZQorICogQGxlbmd0aDogVGhlIGxlbmd0aCBvZiB0aGUgcGxhaW50ZXh0CisgKiBAZW5jb2RlZF9uYW1lOiBUaGUgZW5jeXB0ZWQgbmFtZQorICoKKyAqIEVuY3J5cHRzIGFuZCBlbmNvZGVzIGEgZmlsZW5hbWUgaW50byBzb21ldGhpbmcgdGhhdCBjb25zdGl0dXRlcyBhCisgKiB2YWxpZCBmaWxlbmFtZSBmb3IgYSBmaWxlc3lzdGVtLCB3aXRoIHByaW50YWJsZSBjaGFyYWN0ZXJzLgorICoKKyAqIFdlIGFzc3VtZSB0aGF0IHdlIGhhdmUgYSBwcm9wZXJseSBpbml0aWFsaXplZCBjcnlwdG8gY29udGV4dCwKKyAqIHBvaW50ZWQgdG8gYnkgY3J5cHRfc3RhdC0+dGZtLgorICoKKyAqIFJldHVybnMgemVybyBvbiBzdWNjZXNzOyBub24temVybyBvbiBvdGhlcndpc2UKKyAqLworaW50IGVjcnlwdGZzX2VuY3J5cHRfYW5kX2VuY29kZV9maWxlbmFtZSgKKwljaGFyICoqZW5jb2RlZF9uYW1lLAorCXNpemVfdCAqZW5jb2RlZF9uYW1lX3NpemUsCisJc3RydWN0IGVjcnlwdGZzX2NyeXB0X3N0YXQgKmNyeXB0X3N0YXQsCisJc3RydWN0IGVjcnlwdGZzX21vdW50X2NyeXB0X3N0YXQgKm1vdW50X2NyeXB0X3N0YXQsCisJY29uc3QgY2hhciAqbmFtZSwgc2l6ZV90IG5hbWVfc2l6ZSkKK3sKKwlzaXplX3QgZW5jb2RlZF9uYW1lX25vX3ByZWZpeF9zaXplOworCWludCByYyA9IDA7CisKKwkoKmVuY29kZWRfbmFtZSkgPSBOVUxMOworCSgqZW5jb2RlZF9uYW1lX3NpemUpID0gMDsKKwlpZiAoKGNyeXB0X3N0YXQgJiYgKGNyeXB0X3N0YXQtPmZsYWdzICYgRUNSWVBURlNfRU5DUllQVF9GSUxFTkFNRVMpKQorCSAgICB8fCAobW91bnRfY3J5cHRfc3RhdCAmJiAobW91bnRfY3J5cHRfc3RhdC0+ZmxhZ3MKKwkJCQkgICAgICYgRUNSWVBURlNfR0xPQkFMX0VOQ1JZUFRfRklMRU5BTUVTKSkpIHsKKwkJc3RydWN0IGVjcnlwdGZzX2ZpbGVuYW1lICpmaWxlbmFtZTsKKworCQlmaWxlbmFtZSA9IGt6YWxsb2Moc2l6ZW9mKCpmaWxlbmFtZSksIEdGUF9LRVJORUwpOworCQlpZiAoIWZpbGVuYW1lKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBPdXQgb2YgbWVtb3J5IHdoaWxzdCBhdHRlbXB0aW5nICIKKwkJCSAgICAgICAidG8ga3phbGxvYyBbJXpkXSBieXRlc1xuIiwgX19mdW5jX18sCisJCQkgICAgICAgc2l6ZW9mKCpmaWxlbmFtZSkpOworCQkJcmMgPSAtRU5PTUVNOworCQkJZ290byBvdXQ7CisJCX0KKwkJZmlsZW5hbWUtPmZpbGVuYW1lID0gKGNoYXIgKiluYW1lOworCQlmaWxlbmFtZS0+ZmlsZW5hbWVfc2l6ZSA9IG5hbWVfc2l6ZTsKKwkJcmMgPSBlY3J5cHRmc19lbmNyeXB0X2ZpbGVuYW1lKGZpbGVuYW1lLCBjcnlwdF9zdGF0LAorCQkJCQkgICAgICAgbW91bnRfY3J5cHRfc3RhdCk7CisJCWlmIChyYykgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogRXJyb3IgYXR0ZW1wdGluZyB0byBlbmNyeXB0ICIKKwkJCSAgICAgICAiZmlsZW5hbWU7IHJjID0gWyVkXVxuIiwgX19mdW5jX18sIHJjKTsKKwkJCWtmcmVlKGZpbGVuYW1lKTsKKwkJCWdvdG8gb3V0OworCQl9CisJCWVjcnlwdGZzX2VuY29kZV9mb3JfZmlsZW5hbWUoCisJCQlOVUxMLCAmZW5jb2RlZF9uYW1lX25vX3ByZWZpeF9zaXplLAorCQkJZmlsZW5hbWUtPmVuY3J5cHRlZF9maWxlbmFtZSwKKwkJCWZpbGVuYW1lLT5lbmNyeXB0ZWRfZmlsZW5hbWVfc2l6ZSk7CisJCWlmICgoY3J5cHRfc3RhdCAmJiAoY3J5cHRfc3RhdC0+ZmxhZ3MKKwkJCQkgICAgJiBFQ1JZUFRGU19FTkNGTl9VU0VfTU9VTlRfRk5FSykpCisJCSAgICB8fCAobW91bnRfY3J5cHRfc3RhdAorCQkJJiYgKG1vdW50X2NyeXB0X3N0YXQtPmZsYWdzCisJCQkgICAgJiBFQ1JZUFRGU19HTE9CQUxfRU5DRk5fVVNFX01PVU5UX0ZORUspKSkKKwkJCSgqZW5jb2RlZF9uYW1lX3NpemUpID0KKwkJCQkoRUNSWVBURlNfRk5FS19FTkNSWVBURURfRklMRU5BTUVfUFJFRklYX1NJWkUKKwkJCQkgKyBlbmNvZGVkX25hbWVfbm9fcHJlZml4X3NpemUpOworCQllbHNlCisJCQkoKmVuY29kZWRfbmFtZV9zaXplKSA9CisJCQkJKEVDUllQVEZTX0ZFS19FTkNSWVBURURfRklMRU5BTUVfUFJFRklYX1NJWkUKKwkJCQkgKyBlbmNvZGVkX25hbWVfbm9fcHJlZml4X3NpemUpOworCQkoKmVuY29kZWRfbmFtZSkgPSBrbWFsbG9jKCgqZW5jb2RlZF9uYW1lX3NpemUpICsgMSwgR0ZQX0tFUk5FTCk7CisJCWlmICghKCplbmNvZGVkX25hbWUpKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBPdXQgb2YgbWVtb3J5IHdoaWxzdCBhdHRlbXB0aW5nICIKKwkJCSAgICAgICAidG8ga3phbGxvYyBbJXpkXSBieXRlc1xuIiwgX19mdW5jX18sCisJCQkgICAgICAgKCplbmNvZGVkX25hbWVfc2l6ZSkpOworCQkJcmMgPSAtRU5PTUVNOworCQkJa2ZyZWUoZmlsZW5hbWUtPmVuY3J5cHRlZF9maWxlbmFtZSk7CisJCQlrZnJlZShmaWxlbmFtZSk7CisJCQlnb3RvIG91dDsKKwkJfQorCQlpZiAoKGNyeXB0X3N0YXQgJiYgKGNyeXB0X3N0YXQtPmZsYWdzCisJCQkJICAgICYgRUNSWVBURlNfRU5DRk5fVVNFX01PVU5UX0ZORUspKQorCQkgICAgfHwgKG1vdW50X2NyeXB0X3N0YXQKKwkJCSYmIChtb3VudF9jcnlwdF9zdGF0LT5mbGFncworCQkJICAgICYgRUNSWVBURlNfR0xPQkFMX0VOQ0ZOX1VTRV9NT1VOVF9GTkVLKSkpIHsKKwkJCW1lbWNweSgoKmVuY29kZWRfbmFtZSksCisJCQkgICAgICAgRUNSWVBURlNfRk5FS19FTkNSWVBURURfRklMRU5BTUVfUFJFRklYLAorCQkJICAgICAgIEVDUllQVEZTX0ZORUtfRU5DUllQVEVEX0ZJTEVOQU1FX1BSRUZJWF9TSVpFKTsKKwkJCWVjcnlwdGZzX2VuY29kZV9mb3JfZmlsZW5hbWUoCisJCQkgICAgKCgqZW5jb2RlZF9uYW1lKQorCQkJICAgICArIEVDUllQVEZTX0ZORUtfRU5DUllQVEVEX0ZJTEVOQU1FX1BSRUZJWF9TSVpFKSwKKwkJCSAgICAmZW5jb2RlZF9uYW1lX25vX3ByZWZpeF9zaXplLAorCQkJICAgIGZpbGVuYW1lLT5lbmNyeXB0ZWRfZmlsZW5hbWUsCisJCQkgICAgZmlsZW5hbWUtPmVuY3J5cHRlZF9maWxlbmFtZV9zaXplKTsKKwkJCSgqZW5jb2RlZF9uYW1lX3NpemUpID0KKwkJCQkoRUNSWVBURlNfRk5FS19FTkNSWVBURURfRklMRU5BTUVfUFJFRklYX1NJWkUKKwkJCQkgKyBlbmNvZGVkX25hbWVfbm9fcHJlZml4X3NpemUpOworCQkJKCplbmNvZGVkX25hbWUpWygqZW5jb2RlZF9uYW1lX3NpemUpXSA9ICdcMCc7CisJCQkoKmVuY29kZWRfbmFtZV9zaXplKSsrOworCQl9IGVsc2UgeworCQkJcmMgPSAtRU5PVFNVUFA7CisJCX0KKwkJaWYgKHJjKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBFcnJvciBhdHRlbXB0aW5nIHRvIGVuY29kZSAiCisJCQkgICAgICAgImVuY3J5cHRlZCBmaWxlbmFtZTsgcmMgPSBbJWRdXG4iLCBfX2Z1bmNfXywKKwkJCSAgICAgICByYyk7CisJCQlrZnJlZSgoKmVuY29kZWRfbmFtZSkpOworCQkJKCplbmNvZGVkX25hbWUpID0gTlVMTDsKKwkJCSgqZW5jb2RlZF9uYW1lX3NpemUpID0gMDsKKwkJfQorCQlrZnJlZShmaWxlbmFtZS0+ZW5jcnlwdGVkX2ZpbGVuYW1lKTsKKwkJa2ZyZWUoZmlsZW5hbWUpOworCX0gZWxzZSB7CisJCXJjID0gZWNyeXB0ZnNfY29weV9maWxlbmFtZShlbmNvZGVkX25hbWUsCisJCQkJCSAgICBlbmNvZGVkX25hbWVfc2l6ZSwKKwkJCQkJICAgIG5hbWUsIG5hbWVfc2l6ZSk7CisJfQorb3V0OgorCXJldHVybiByYzsKK30KKworLyoqCisgKiBlY3J5cHRmc19kZWNvZGVfYW5kX2RlY3J5cHRfZmlsZW5hbWUgLSBjb252ZXJ0cyB0aGUgZW5jb2RlZCBjaXBoZXIgdGV4dCBuYW1lIHRvIGRlY29kZWQgcGxhaW50ZXh0CisgKiBAcGxhaW50ZXh0X25hbWU6IFRoZSBwbGFpbnRleHQgbmFtZQorICogQHBsYWludGV4dF9uYW1lX3NpemU6IFRoZSBwbGFpbnRleHQgbmFtZSBzaXplCisgKiBAZWNyeXB0ZnNfZGlyX2RlbnRyeTogZUNyeXB0ZnMgZGlyZWN0b3J5IGRlbnRyeQorICogQG5hbWU6IFRoZSBmaWxlbmFtZSBpbiBjaXBoZXIgdGV4dAorICogQG5hbWVfc2l6ZTogVGhlIGNpcGhlciB0ZXh0IG5hbWUgc2l6ZQorICoKKyAqIERlY3J5cHRzIGFuZCBkZWNvZGVzIHRoZSBmaWxlbmFtZS4KKyAqCisgKiBSZXR1cm5zIHplcm8gb24gZXJyb3I7IG5vbi16ZXJvIG90aGVyd2lzZQorICovCitpbnQgZWNyeXB0ZnNfZGVjb2RlX2FuZF9kZWNyeXB0X2ZpbGVuYW1lKGNoYXIgKipwbGFpbnRleHRfbmFtZSwKKwkJCQkJIHNpemVfdCAqcGxhaW50ZXh0X25hbWVfc2l6ZSwKKwkJCQkJIHN0cnVjdCBkZW50cnkgKmVjcnlwdGZzX2Rpcl9kZW50cnksCisJCQkJCSBjb25zdCBjaGFyICpuYW1lLCBzaXplX3QgbmFtZV9zaXplKQoreworCWNoYXIgKmRlY29kZWRfbmFtZTsKKwlzaXplX3QgZGVjb2RlZF9uYW1lX3NpemU7CisJc2l6ZV90IHBhY2tldF9zaXplOworCWludCByYyA9IDA7CisKKwlpZiAoKG5hbWVfc2l6ZSA+IEVDUllQVEZTX0ZORUtfRU5DUllQVEVEX0ZJTEVOQU1FX1BSRUZJWF9TSVpFKQorCSAgICAmJiAoc3RybmNtcChuYW1lLCBFQ1JZUFRGU19GTkVLX0VOQ1JZUFRFRF9GSUxFTkFNRV9QUkVGSVgsCisJCQlFQ1JZUFRGU19GTkVLX0VOQ1JZUFRFRF9GSUxFTkFNRV9QUkVGSVhfU0laRSkgPT0gMCkpIHsKKwkJc3RydWN0IGVjcnlwdGZzX21vdW50X2NyeXB0X3N0YXQgKm1vdW50X2NyeXB0X3N0YXQgPQorCQkJJmVjcnlwdGZzX3N1cGVyYmxvY2tfdG9fcHJpdmF0ZSgKKwkJCQllY3J5cHRmc19kaXJfZGVudHJ5LT5kX3NiKS0+bW91bnRfY3J5cHRfc3RhdDsKKwkJY29uc3QgY2hhciAqb3JpZ19uYW1lID0gbmFtZTsKKwkJc2l6ZV90IG9yaWdfbmFtZV9zaXplID0gbmFtZV9zaXplOworCisJCW5hbWUgKz0gRUNSWVBURlNfRk5FS19FTkNSWVBURURfRklMRU5BTUVfUFJFRklYX1NJWkU7CisJCW5hbWVfc2l6ZSAtPSBFQ1JZUFRGU19GTkVLX0VOQ1JZUFRFRF9GSUxFTkFNRV9QUkVGSVhfU0laRTsKKwkJZWNyeXB0ZnNfZGVjb2RlX2Zyb21fZmlsZW5hbWUoTlVMTCwgJmRlY29kZWRfbmFtZV9zaXplLAorCQkJCQkgICAgICBuYW1lLCBuYW1lX3NpemUpOworCQlkZWNvZGVkX25hbWUgPSBrbWFsbG9jKGRlY29kZWRfbmFtZV9zaXplLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFkZWNvZGVkX25hbWUpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IE91dCBvZiBtZW1vcnkgd2hpbHN0IGF0dGVtcHRpbmcgIgorCQkJICAgICAgICJ0byBrbWFsbG9jIFslemRdIGJ5dGVzXG4iLCBfX2Z1bmNfXywKKwkJCSAgICAgICBkZWNvZGVkX25hbWVfc2l6ZSk7CisJCQlyYyA9IC1FTk9NRU07CisJCQlnb3RvIG91dDsKKwkJfQorCQllY3J5cHRmc19kZWNvZGVfZnJvbV9maWxlbmFtZShkZWNvZGVkX25hbWUsICZkZWNvZGVkX25hbWVfc2l6ZSwKKwkJCQkJICAgICAgbmFtZSwgbmFtZV9zaXplKTsKKwkJcmMgPSBlY3J5cHRmc19wYXJzZV90YWdfNzBfcGFja2V0KHBsYWludGV4dF9uYW1lLAorCQkJCQkJICBwbGFpbnRleHRfbmFtZV9zaXplLAorCQkJCQkJICAmcGFja2V0X3NpemUsCisJCQkJCQkgIG1vdW50X2NyeXB0X3N0YXQsCisJCQkJCQkgIGRlY29kZWRfbmFtZSwKKwkJCQkJCSAgZGVjb2RlZF9uYW1lX3NpemUpOworCQlpZiAocmMpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBDb3VsZCBub3QgcGFyc2UgdGFnIDcwIHBhY2tldCAiCisJCQkgICAgICAgImZyb20gZmlsZW5hbWU7IGNvcHlpbmcgdGhyb3VnaCBmaWxlbmFtZSAiCisJCQkgICAgICAgImFzLWlzXG4iLCBfX2Z1bmNfXyk7CisJCQlyYyA9IGVjcnlwdGZzX2NvcHlfZmlsZW5hbWUocGxhaW50ZXh0X25hbWUsCisJCQkJCQkgICAgcGxhaW50ZXh0X25hbWVfc2l6ZSwKKwkJCQkJCSAgICBvcmlnX25hbWUsIG9yaWdfbmFtZV9zaXplKTsKKwkJCWdvdG8gb3V0X2ZyZWU7CisJCX0KKwl9IGVsc2UgeworCQlyYyA9IGVjcnlwdGZzX2NvcHlfZmlsZW5hbWUocGxhaW50ZXh0X25hbWUsCisJCQkJCSAgICBwbGFpbnRleHRfbmFtZV9zaXplLAorCQkJCQkgICAgbmFtZSwgbmFtZV9zaXplKTsKKwkJZ290byBvdXQ7CisJfQorb3V0X2ZyZWU6CisJa2ZyZWUoZGVjb2RlZF9uYW1lKTsKK291dDoKKwlyZXR1cm4gcmM7Cit9CmRpZmYgLS1naXQgYS9mcy9lY3J5cHRmcy9lY3J5cHRmc19rZXJuZWwuaCBiL2ZzL2VjcnlwdGZzL2VjcnlwdGZzX2tlcm5lbC5oCmluZGV4IGE3NTAyNmQuLmMxMWZjOTUgMTAwNjQ0Ci0tLSBhL2ZzL2VjcnlwdGZzL2VjcnlwdGZzX2tlcm5lbC5oCisrKyBiL2ZzL2VjcnlwdGZzL2VjcnlwdGZzX2tlcm5lbC5oCkBAIC01MSwxMiArNTEsMTYgQEAKICNkZWZpbmUgRUNSWVBURlNfVkVSU0lPTklOR19YQVRUUiAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMAogI2RlZmluZSBFQ1JZUFRGU19WRVJTSU9OSU5HX01VTFRLRVkgICAgICAgICAgICAgICAweDAwMDAwMDIwCiAjZGVmaW5lIEVDUllQVEZTX1ZFUlNJT05JTkdfREVWTUlTQyAgICAgICAgICAgICAgIDB4MDAwMDAwNDAKKyNkZWZpbmUgRUNSWVBURlNfVkVSU0lPTklOR19ITUFDICAgICAgICAgICAgICAgICAgMHgwMDAwMDA4MAorI2RlZmluZSBFQ1JZUFRGU19WRVJTSU9OSU5HX0ZJTEVOQU1FX0VOQ1JZUFRJT04gICAweDAwMDAwMTAwCisjZGVmaW5lIEVDUllQVEZTX1ZFUlNJT05JTkdfR0NNICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMDAKICNkZWZpbmUgRUNSWVBURlNfVkVSU0lPTklOR19NQVNLIChFQ1JZUFRGU19WRVJTSU9OSU5HX1BBU1NQSFJBU0UgXAogCQkJCSAgfCBFQ1JZUFRGU19WRVJTSU9OSU5HX1BMQUlOVEVYVF9QQVNTVEhST1VHSCBcCiAJCQkJICB8IEVDUllQVEZTX1ZFUlNJT05JTkdfUFVCS0VZIFwKIAkJCQkgIHwgRUNSWVBURlNfVkVSU0lPTklOR19YQVRUUiBcCiAJCQkJICB8IEVDUllQVEZTX1ZFUlNJT05JTkdfTVVMVEtFWSBcCi0JCQkJICB8IEVDUllQVEZTX1ZFUlNJT05JTkdfREVWTUlTQykKKwkJCQkgIHwgRUNSWVBURlNfVkVSU0lPTklOR19ERVZNSVNDIFwKKwkJCQkgIHwgRUNSWVBURlNfVkVSU0lPTklOR19GSUxFTkFNRV9FTkNSWVBUSU9OKQogI2RlZmluZSBFQ1JZUFRGU19NQVhfUEFTU1dPUkRfTEVOR1RIIDY0CiAjZGVmaW5lIEVDUllQVEZTX01BWF9QQVNTUEhSQVNFX0JZVEVTIEVDUllQVEZTX01BWF9QQVNTV09SRF9MRU5HVEgKICNkZWZpbmUgRUNSWVBURlNfU0FMVF9TSVpFIDgKQEAgLTE5OSw2ICsyMDMsNyBAQAogI2RlZmluZSBFQ1JZUFRGU19ERUZBVUxUX0NJUEhFUiAiYWVzIgogI2RlZmluZSBFQ1JZUFRGU19ERUZBVUxUX0tFWV9CWVRFUyAxNgogI2RlZmluZSBFQ1JZUFRGU19ERUZBVUxUX0hBU0ggIm1kNSIKKyNkZWZpbmUgRUNSWVBURlNfVEFHXzcwX0RJR0VTVCBFQ1JZUFRGU19ERUZBVUxUX0hBU0gKICNkZWZpbmUgRUNSWVBURlNfVEFHXzFfUEFDS0VUX1RZUEUgMHgwMQogI2RlZmluZSBFQ1JZUFRGU19UQUdfM19QQUNLRVRfVFlQRSAweDhDCiAjZGVmaW5lIEVDUllQVEZTX1RBR18xMV9QQUNLRVRfVFlQRSAweEVECkBAIC0yMDYsMzAgKzIxMSw2NCBAQAogI2RlZmluZSBFQ1JZUFRGU19UQUdfNjVfUEFDS0VUX1RZUEUgMHg0MQogI2RlZmluZSBFQ1JZUFRGU19UQUdfNjZfUEFDS0VUX1RZUEUgMHg0MgogI2RlZmluZSBFQ1JZUFRGU19UQUdfNjdfUEFDS0VUX1RZUEUgMHg0MworI2RlZmluZSBFQ1JZUFRGU19UQUdfNzBfUEFDS0VUX1RZUEUgMHg0NiAvKiBGTkVLLWVuY3J5cHRlZCBmaWxlbmFtZQorCQkJCQkgICogYXMgZGVudHJ5IG5hbWUgKi8KKyNkZWZpbmUgRUNSWVBURlNfVEFHXzcxX1BBQ0tFVF9UWVBFIDB4NDcgLyogRk5FSy1lbmNyeXB0ZWQgZmlsZW5hbWUgaW4KKwkJCQkJICAqIG1ldGFkYXRhICovCisjZGVmaW5lIEVDUllQVEZTX1RBR183Ml9QQUNLRVRfVFlQRSAweDQ4IC8qIEZFSy1lbmNyeXB0ZWQgZmlsZW5hbWUgYXMKKwkJCQkJICAqIGRlbnRyeSBuYW1lICovCisjZGVmaW5lIEVDUllQVEZTX1RBR183M19QQUNLRVRfVFlQRSAweDQ5IC8qIEZFSy1lbmNyeXB0ZWQgZmlsZW5hbWUgYXMKKwkJCQkJICAqIG1ldGFkYXRhICovCisvKiBDb25zdHJhaW50OiBFQ1JZUFRGU19GSUxFTkFNRV9NSU5fUkFORE9NX1BSRVBFTkRfQllURVMgPj0KKyAqIEVDUllQVEZTX01BWF9JVl9CWVRFUyAqLworI2RlZmluZSBFQ1JZUFRGU19GSUxFTkFNRV9NSU5fUkFORE9NX1BSRVBFTkRfQllURVMgMTYKKyNkZWZpbmUgRUNSWVBURlNfTk9OX05VTEwgMHg0MiAvKiBBIHJlYXNvbmFibGUgc3Vic3RpdHV0ZSBmb3IgTlVMTCAqLwogI2RlZmluZSBNRDVfRElHRVNUX1NJWkUgMTYKKyNkZWZpbmUgRUNSWVBURlNfVEFHXzcwX0RJR0VTVF9TSVpFIE1ENV9ESUdFU1RfU0laRQorI2RlZmluZSBFQ1JZUFRGU19GRUtfRU5DUllQVEVEX0ZJTEVOQU1FX1BSRUZJWCAiRUNSWVBURlNfRkVLX0VOQ1JZUFRFRC4iCisjZGVmaW5lIEVDUllQVEZTX0ZFS19FTkNSWVBURURfRklMRU5BTUVfUFJFRklYX1NJWkUgMjMKKyNkZWZpbmUgRUNSWVBURlNfRk5FS19FTkNSWVBURURfRklMRU5BTUVfUFJFRklYICJFQ1JZUFRGU19GTkVLX0VOQ1JZUFRFRC4iCisjZGVmaW5lIEVDUllQVEZTX0ZORUtfRU5DUllQVEVEX0ZJTEVOQU1FX1BSRUZJWF9TSVpFIDI0CisjZGVmaW5lIEVDUllQVEZTX0VOQ1JZUFRFRF9ERU5UUllfTkFNRV9MRU4gKDE4ICsgMSArIDQgKyAxICsgMzIpCiAKIHN0cnVjdCBlY3J5cHRmc19rZXlfc2lnIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGNyeXB0X3N0YXRfbGlzdDsKIAljaGFyIGtleXNpZ1tFQ1JZUFRGU19TSUdfU0laRV9IRVhdOwogfTsKIAorc3RydWN0IGVjcnlwdGZzX2ZpbGVuYW1lIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGNyeXB0X3N0YXRfbGlzdDsKKyNkZWZpbmUgRUNSWVBURlNfRklMRU5BTUVfQ09OVEFJTlNfREVDUllQVEVEIDB4MDAwMDAwMDEKKwl1MzIgZmxhZ3M7CisJdTMyIHNlcV9ubzsKKwljaGFyICpmaWxlbmFtZTsKKwljaGFyICplbmNyeXB0ZWRfZmlsZW5hbWU7CisJc2l6ZV90IGZpbGVuYW1lX3NpemU7CisJc2l6ZV90IGVuY3J5cHRlZF9maWxlbmFtZV9zaXplOworCWNoYXIgZm5la19zaWdbRUNSWVBURlNfU0lHX1NJWkVfSEVYXTsKKwljaGFyIGRlbnRyeV9uYW1lW0VDUllQVEZTX0VOQ1JZUFRFRF9ERU5UUllfTkFNRV9MRU4gKyAxXTsKK307CisKIC8qKgogICogVGhpcyBpcyB0aGUgcHJpbWFyeSBzdHJ1Y3QgYXNzb2NpYXRlZCB3aXRoIGVhY2ggZW5jcnlwdGVkIGZpbGUuCiAgKgogICogVE9ETzogY2FjaGUgYWxpZ24vcGFjaz8KICAqLwogc3RydWN0IGVjcnlwdGZzX2NyeXB0X3N0YXQgewotI2RlZmluZSBFQ1JZUFRGU19TVFJVQ1RfSU5JVElBTElaRUQgMHgwMDAwMDAwMQotI2RlZmluZSBFQ1JZUFRGU19QT0xJQ1lfQVBQTElFRCAgICAgMHgwMDAwMDAwMgotI2RlZmluZSBFQ1JZUFRGU19ORVdfRklMRSAgICAgICAgICAgMHgwMDAwMDAwNAotI2RlZmluZSBFQ1JZUFRGU19FTkNSWVBURUQgICAgICAgICAgMHgwMDAwMDAwOAotI2RlZmluZSBFQ1JZUFRGU19TRUNVUklUWV9XQVJOSU5HICAgMHgwMDAwMDAxMAotI2RlZmluZSBFQ1JZUFRGU19FTkFCTEVfSE1BQyAgICAgICAgMHgwMDAwMDAyMAotI2RlZmluZSBFQ1JZUFRGU19FTkNSWVBUX0lWX1BBR0VTICAgMHgwMDAwMDA0MAotI2RlZmluZSBFQ1JZUFRGU19LRVlfVkFMSUQgICAgICAgICAgMHgwMDAwMDA4MAotI2RlZmluZSBFQ1JZUFRGU19NRVRBREFUQV9JTl9YQVRUUiAgMHgwMDAwMDEwMAotI2RlZmluZSBFQ1JZUFRGU19WSUVXX0FTX0VOQ1JZUFRFRCAgMHgwMDAwMDIwMAotI2RlZmluZSBFQ1JZUFRGU19LRVlfU0VUICAgICAgICAgICAgMHgwMDAwMDQwMAorI2RlZmluZSBFQ1JZUFRGU19TVFJVQ1RfSU5JVElBTElaRUQgICAweDAwMDAwMDAxCisjZGVmaW5lIEVDUllQVEZTX1BPTElDWV9BUFBMSUVEICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgRUNSWVBURlNfTkVXX0ZJTEUgICAgICAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBFQ1JZUFRGU19FTkNSWVBURUQgICAgICAgICAgICAweDAwMDAwMDA4CisjZGVmaW5lIEVDUllQVEZTX1NFQ1VSSVRZX1dBUk5JTkcgICAgIDB4MDAwMDAwMTAKKyNkZWZpbmUgRUNSWVBURlNfRU5BQkxFX0hNQUMgICAgICAgICAgMHgwMDAwMDAyMAorI2RlZmluZSBFQ1JZUFRGU19FTkNSWVBUX0lWX1BBR0VTICAgICAweDAwMDAwMDQwCisjZGVmaW5lIEVDUllQVEZTX0tFWV9WQUxJRCAgICAgICAgICAgIDB4MDAwMDAwODAKKyNkZWZpbmUgRUNSWVBURlNfTUVUQURBVEFfSU5fWEFUVFIgICAgMHgwMDAwMDEwMAorI2RlZmluZSBFQ1JZUFRGU19WSUVXX0FTX0VOQ1JZUFRFRCAgICAweDAwMDAwMjAwCisjZGVmaW5lIEVDUllQVEZTX0tFWV9TRVQgICAgICAgICAgICAgIDB4MDAwMDA0MDAKKyNkZWZpbmUgRUNSWVBURlNfRU5DUllQVF9GSUxFTkFNRVMgICAgMHgwMDAwMDgwMAorI2RlZmluZSBFQ1JZUFRGU19FTkNGTl9VU0VfTU9VTlRfRk5FSyAweDAwMDAxMDAwCisjZGVmaW5lIEVDUllQVEZTX0VOQ0ZOX1VTRV9GRUsgICAgICAgIDB4MDAwMDIwMDAKIAl1MzIgZmxhZ3M7CiAJdW5zaWduZWQgaW50IGZpbGVfdmVyc2lvbjsKIAlzaXplX3QgaXZfYnl0ZXM7CkBAIC0zMzIsMTMgKzM3MSwyMCBAQAogI2RlZmluZSBFQ1JZUFRGU19YQVRUUl9NRVRBREFUQV9FTkFCTEVEICAgICAgICAweDAwMDAwMDAyCiAjZGVmaW5lIEVDUllQVEZTX0VOQ1JZUFRFRF9WSUVXX0VOQUJMRUQgICAgICAgIDB4MDAwMDAwMDQKICNkZWZpbmUgRUNSWVBURlNfTU9VTlRfQ1JZUFRfU1RBVF9JTklUSUFMSVpFRCAgMHgwMDAwMDAwOAorI2RlZmluZSBFQ1JZUFRGU19HTE9CQUxfRU5DUllQVF9GSUxFTkFNRVMgICAgICAweDAwMDAwMDEwCisjZGVmaW5lIEVDUllQVEZTX0dMT0JBTF9FTkNGTl9VU0VfTU9VTlRfRk5FSyAgIDB4MDAwMDAwMjAKKyNkZWZpbmUgRUNSWVBURlNfR0xPQkFMX0VOQ0ZOX1VTRV9GRUsgICAgICAgICAgMHgwMDAwMDA0MAogCXUzMiBmbGFnczsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGdsb2JhbF9hdXRoX3Rva19saXN0OwogCXN0cnVjdCBtdXRleCBnbG9iYWxfYXV0aF90b2tfbGlzdF9tdXRleDsKIAlzaXplX3QgbnVtX2dsb2JhbF9hdXRoX3Rva3M7CiAJc2l6ZV90IGdsb2JhbF9kZWZhdWx0X2NpcGhlcl9rZXlfc2l6ZTsKKwlzaXplX3QgZ2xvYmFsX2RlZmF1bHRfZm5fY2lwaGVyX2tleV9ieXRlczsKIAl1bnNpZ25lZCBjaGFyIGdsb2JhbF9kZWZhdWx0X2NpcGhlcl9uYW1lW0VDUllQVEZTX01BWF9DSVBIRVJfTkFNRV9TSVpFCiAJCQkJCQkgKyAxXTsKKwl1bnNpZ25lZCBjaGFyIGdsb2JhbF9kZWZhdWx0X2ZuX2NpcGhlcl9uYW1lWworCQlFQ1JZUFRGU19NQVhfQ0lQSEVSX05BTUVfU0laRSArIDFdOworCWNoYXIgZ2xvYmFsX2RlZmF1bHRfZm5la19zaWdbRUNSWVBURlNfU0lHX1NJWkVfSEVYICsgMV07CiB9OwogCiAvKiBzdXBlcmJsb2NrIHByaXZhdGUgZGF0YS4gKi8KQEAgLTU3MSwxMyArNjE3LDIyIEBACiBpbnQgZWNyeXB0ZnNfaW50ZXJwb3NlKHN0cnVjdCBkZW50cnkgKmhpZGRlbl9kZW50cnksCiAJCSAgICAgICBzdHJ1Y3QgZGVudHJ5ICp0aGlzX2RlbnRyeSwgc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKIAkJICAgICAgIHUzMiBmbGFncyk7CitpbnQgZWNyeXB0ZnNfbG9va3VwX2FuZF9pbnRlcnBvc2VfbG93ZXIoc3RydWN0IGRlbnRyeSAqZWNyeXB0ZnNfZGVudHJ5LAorCQkJCQlzdHJ1Y3QgZGVudHJ5ICpsb3dlcl9kZW50cnksCisJCQkJCXN0cnVjdCBlY3J5cHRmc19jcnlwdF9zdGF0ICpjcnlwdF9zdGF0LAorCQkJCQlzdHJ1Y3QgaW5vZGUgKmVjcnlwdGZzX2Rpcl9pbm9kZSwKKwkJCQkJc3RydWN0IG5hbWVpZGF0YSAqZWNyeXB0ZnNfbmQpOworaW50IGVjcnlwdGZzX2RlY29kZV9hbmRfZGVjcnlwdF9maWxlbmFtZShjaGFyICoqZGVjcnlwdGVkX25hbWUsCisJCQkJCSBzaXplX3QgKmRlY3J5cHRlZF9uYW1lX3NpemUsCisJCQkJCSBzdHJ1Y3QgZGVudHJ5ICplY3J5cHRmc19kZW50cnksCisJCQkJCSBjb25zdCBjaGFyICpuYW1lLCBzaXplX3QgbmFtZV9zaXplKTsKIGludCBlY3J5cHRmc19maWxsX3plcm9zKHN0cnVjdCBmaWxlICpmaWxlLCBsb2ZmX3QgbmV3X2xlbmd0aCk7Ci1pbnQgZWNyeXB0ZnNfZGVjb2RlX2ZpbGVuYW1lKHN0cnVjdCBlY3J5cHRmc19jcnlwdF9zdGF0ICpjcnlwdF9zdGF0LAotCQkJICAgICBjb25zdCBjaGFyICpuYW1lLCBpbnQgbGVuZ3RoLAotCQkJICAgICBjaGFyICoqZGVjcnlwdGVkX25hbWUpOwotaW50IGVjcnlwdGZzX2VuY29kZV9maWxlbmFtZShzdHJ1Y3QgZWNyeXB0ZnNfY3J5cHRfc3RhdCAqY3J5cHRfc3RhdCwKLQkJCSAgICAgY29uc3QgY2hhciAqbmFtZSwgaW50IGxlbmd0aCwKLQkJCSAgICAgY2hhciAqKmVuY29kZWRfbmFtZSk7CitpbnQgZWNyeXB0ZnNfZW5jcnlwdF9hbmRfZW5jb2RlX2ZpbGVuYW1lKAorCWNoYXIgKiplbmNvZGVkX25hbWUsCisJc2l6ZV90ICplbmNvZGVkX25hbWVfc2l6ZSwKKwlzdHJ1Y3QgZWNyeXB0ZnNfY3J5cHRfc3RhdCAqY3J5cHRfc3RhdCwKKwlzdHJ1Y3QgZWNyeXB0ZnNfbW91bnRfY3J5cHRfc3RhdCAqbW91bnRfY3J5cHRfc3RhdCwKKwljb25zdCBjaGFyICpuYW1lLCBzaXplX3QgbmFtZV9zaXplKTsKIHN0cnVjdCBkZW50cnkgKmVjcnlwdGZzX2xvd2VyX2RlbnRyeShzdHJ1Y3QgZGVudHJ5ICp0aGlzX2RlbnRyeSk7CiB2b2lkIGVjcnlwdGZzX2R1bXBfaGV4KGNoYXIgKmRhdGEsIGludCBieXRlcyk7CiBpbnQgdmlydF90b19zY2F0dGVybGlzdChjb25zdCB2b2lkICphZGRyLCBpbnQgc2l6ZSwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywKQEAgLTU5OSw3ICs2NTQsNyBAQAogCQkJCQkgICAgIHN0cnVjdCBpbm9kZSAqZWNyeXB0ZnNfaW5vZGUpOwogaW50IGVjcnlwdGZzX3JlYWRfYW5kX3ZhbGlkYXRlX3hhdHRyX3JlZ2lvbihjaGFyICpwYWdlX3ZpcnQsCiAJCQkJCSAgICBzdHJ1Y3QgZGVudHJ5ICplY3J5cHRmc19kZW50cnkpOwotdTggZWNyeXB0ZnNfY29kZV9mb3JfY2lwaGVyX3N0cmluZyhzdHJ1Y3QgZWNyeXB0ZnNfY3J5cHRfc3RhdCAqY3J5cHRfc3RhdCk7Cit1OCBlY3J5cHRmc19jb2RlX2Zvcl9jaXBoZXJfc3RyaW5nKGNoYXIgKmNpcGhlcl9uYW1lLCBzaXplX3Qga2V5X2J5dGVzKTsKIGludCBlY3J5cHRmc19jaXBoZXJfY29kZV90b19zdHJpbmcoY2hhciAqc3RyLCB1OCBjaXBoZXJfY29kZSk7CiB2b2lkIGVjcnlwdGZzX3NldF9kZWZhdWx0X3NpemVzKHN0cnVjdCBlY3J5cHRmc19jcnlwdF9zdGF0ICpjcnlwdF9zdGF0KTsKIGludCBlY3J5cHRmc19nZW5lcmF0ZV9rZXlfcGFja2V0X3NldChjaGFyICpkZXN0X2Jhc2UsCkBAIC02OTQsNSArNzQ5LDE3IEBACiAJCQkgICAgIHN0cnVjdCB2ZnNtb3VudCAqbG93ZXJfbW50LAogCQkJICAgICBjb25zdCBzdHJ1Y3QgY3JlZCAqY3JlZCk7CiBpbnQgZWNyeXB0ZnNfaW5pdF9wZXJzaXN0ZW50X2ZpbGUoc3RydWN0IGRlbnRyeSAqZWNyeXB0ZnNfZGVudHJ5KTsKK2ludAorZWNyeXB0ZnNfd3JpdGVfdGFnXzcwX3BhY2tldChjaGFyICpkZXN0LCBzaXplX3QgKnJlbWFpbmluZ19ieXRlcywKKwkJCSAgICAgc2l6ZV90ICpwYWNrZXRfc2l6ZSwKKwkJCSAgICAgc3RydWN0IGVjcnlwdGZzX21vdW50X2NyeXB0X3N0YXQgKm1vdW50X2NyeXB0X3N0YXQsCisJCQkgICAgIGNoYXIgKmZpbGVuYW1lLCBzaXplX3QgZmlsZW5hbWVfc2l6ZSk7CitpbnQKK2VjcnlwdGZzX3BhcnNlX3RhZ183MF9wYWNrZXQoY2hhciAqKmZpbGVuYW1lLCBzaXplX3QgKmZpbGVuYW1lX3NpemUsCisJCQkgICAgIHNpemVfdCAqcGFja2V0X3NpemUsCisJCQkgICAgIHN0cnVjdCBlY3J5cHRmc19tb3VudF9jcnlwdF9zdGF0ICptb3VudF9jcnlwdF9zdGF0LAorCQkJICAgICBjaGFyICpkYXRhLCBzaXplX3QgbWF4X3BhY2tldF9zaXplKTsKK2ludCBlY3J5cHRmc19kZXJpdmVfaXYoY2hhciAqaXYsIHN0cnVjdCBlY3J5cHRmc19jcnlwdF9zdGF0ICpjcnlwdF9zdGF0LAorCQkgICAgICAgbG9mZl90IG9mZnNldCk7CiAKICNlbmRpZiAvKiAjaWZuZGVmIEVDUllQVEZTX0tFUk5FTF9IICovCmRpZmYgLS1naXQgYS9mcy9lY3J5cHRmcy9maWxlLmMgYi9mcy9lY3J5cHRmcy9maWxlLmMKaW5kZXggZWIzZGM0Yy4uOWU5NDQwNSAxMDA2NDQKLS0tIGEvZnMvZWNyeXB0ZnMvZmlsZS5jCisrKyBiL2ZzL2VjcnlwdGZzL2ZpbGUuYwpAQCAtNzcsMjcgKzc3LDI3IEBACiAKIC8qIEluc3BpcmVkIGJ5IGdlbmVyaWMgZmlsbGRpciBpbiBmcy9yZWFkZGlyLmMgKi8KIHN0YXRpYyBpbnQKLWVjcnlwdGZzX2ZpbGxkaXIodm9pZCAqZGlyZW50LCBjb25zdCBjaGFyICpuYW1lLCBpbnQgbmFtZWxlbiwgbG9mZl90IG9mZnNldCwKLQkJIHU2NCBpbm8sIHVuc2lnbmVkIGludCBkX3R5cGUpCitlY3J5cHRmc19maWxsZGlyKHZvaWQgKmRpcmVudCwgY29uc3QgY2hhciAqbG93ZXJfbmFtZSwgaW50IGxvd2VyX25hbWVsZW4sCisJCSBsb2ZmX3Qgb2Zmc2V0LCB1NjQgaW5vLCB1bnNpZ25lZCBpbnQgZF90eXBlKQogewotCXN0cnVjdCBlY3J5cHRmc19jcnlwdF9zdGF0ICpjcnlwdF9zdGF0OwogCXN0cnVjdCBlY3J5cHRmc19nZXRkZW50c19jYWxsYmFjayAqYnVmID0KIAkgICAgKHN0cnVjdCBlY3J5cHRmc19nZXRkZW50c19jYWxsYmFjayAqKWRpcmVudDsKKwlzaXplX3QgbmFtZV9zaXplOworCWNoYXIgKm5hbWU7CiAJaW50IHJjOwotCWludCBkZWNvZGVkX2xlbmd0aDsKLQljaGFyICpkZWNvZGVkX25hbWU7CiAKLQljcnlwdF9zdGF0ID0gZWNyeXB0ZnNfZGVudHJ5X3RvX3ByaXZhdGUoYnVmLT5kZW50cnkpLT5jcnlwdF9zdGF0OwogCWJ1Zi0+ZmlsbGRpcl9jYWxsZWQrKzsKLQlkZWNvZGVkX2xlbmd0aCA9IGVjcnlwdGZzX2RlY29kZV9maWxlbmFtZShjcnlwdF9zdGF0LCBuYW1lLCBuYW1lbGVuLAotCQkJCQkJICAmZGVjb2RlZF9uYW1lKTsKLQlpZiAoZGVjb2RlZF9sZW5ndGggPCAwKSB7Ci0JCXJjID0gZGVjb2RlZF9sZW5ndGg7CisJcmMgPSBlY3J5cHRmc19kZWNvZGVfYW5kX2RlY3J5cHRfZmlsZW5hbWUoJm5hbWUsICZuYW1lX3NpemUsCisJCQkJCQkgIGJ1Zi0+ZGVudHJ5LCBsb3dlcl9uYW1lLAorCQkJCQkJICBsb3dlcl9uYW1lbGVuKTsKKwlpZiAocmMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogRXJyb3IgYXR0ZW1wdGluZyB0byBkZWNvZGUgYW5kIGRlY3J5cHQgIgorCQkgICAgICAgImZpbGVuYW1lIFslc107IHJjID0gWyVkXVxuIiwgX19mdW5jX18sIGxvd2VyX25hbWUsCisJCSAgICAgICByYyk7CiAJCWdvdG8gb3V0OwogCX0KLQlyYyA9IGJ1Zi0+ZmlsbGRpcihidWYtPmRpcmVudCwgZGVjb2RlZF9uYW1lLCBkZWNvZGVkX2xlbmd0aCwgb2Zmc2V0LAotCQkJICBpbm8sIGRfdHlwZSk7Ci0Ja2ZyZWUoZGVjb2RlZF9uYW1lKTsKKwlyYyA9IGJ1Zi0+ZmlsbGRpcihidWYtPmRpcmVudCwgbmFtZSwgbmFtZV9zaXplLCBvZmZzZXQsIGlubywgZF90eXBlKTsKKwlrZnJlZShuYW1lKTsKIAlpZiAocmMgPj0gMCkKIAkJYnVmLT5lbnRyaWVzX3dyaXR0ZW4rKzsKIG91dDoKQEAgLTEwNiw4ICsxMDYsOCBAQAogCiAvKioKICAqIGVjcnlwdGZzX3JlYWRkaXIKLSAqIEBmaWxlOiBUaGUgZWNyeXB0ZnMgZmlsZSBzdHJ1Y3QKLSAqIEBkaXJlbnQ6IERpcmVjdG9yeSBlbnRyeQorICogQGZpbGU6IFRoZSBlQ3J5cHRmcyBkaXJlY3RvcnkgZmlsZQorICogQGRpcmVudDogRGlyZWN0b3J5IGVudHJ5IGhhbmRsZQogICogQGZpbGxkaXI6IFRoZSBmaWxsZGlyIGNhbGxiYWNrIGZ1bmN0aW9uCiAgKi8KIHN0YXRpYyBpbnQgZWNyeXB0ZnNfcmVhZGRpcihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZGlyZW50LCBmaWxsZGlyX3QgZmlsbGRpcikKQEAgLTI3NSwxOCArMjc1LDkgQEAKIHN0YXRpYyBpbnQKIGVjcnlwdGZzX2ZzeW5jKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGludCBkYXRhc3luYykKIHsKLQlzdHJ1Y3QgZmlsZSAqbG93ZXJfZmlsZSA9IGVjcnlwdGZzX2ZpbGVfdG9fbG93ZXIoZmlsZSk7Ci0Jc3RydWN0IGRlbnRyeSAqbG93ZXJfZGVudHJ5ID0gZWNyeXB0ZnNfZGVudHJ5X3RvX2xvd2VyKGRlbnRyeSk7Ci0Jc3RydWN0IGlub2RlICpsb3dlcl9pbm9kZSA9IGxvd2VyX2RlbnRyeS0+ZF9pbm9kZTsKLQlpbnQgcmMgPSAtRUlOVkFMOwotCi0JaWYgKGxvd2VyX2lub2RlLT5pX2ZvcC0+ZnN5bmMpIHsKLQkJbXV0ZXhfbG9jaygmbG93ZXJfaW5vZGUtPmlfbXV0ZXgpOwotCQlyYyA9IGxvd2VyX2lub2RlLT5pX2ZvcC0+ZnN5bmMobG93ZXJfZmlsZSwgbG93ZXJfZGVudHJ5LAotCQkJCQkgICAgICAgZGF0YXN5bmMpOwotCQltdXRleF91bmxvY2soJmxvd2VyX2lub2RlLT5pX211dGV4KTsKLQl9Ci0JcmV0dXJuIHJjOworCXJldHVybiB2ZnNfZnN5bmMoZWNyeXB0ZnNfZmlsZV90b19sb3dlcihmaWxlKSwKKwkJCSBlY3J5cHRmc19kZW50cnlfdG9fbG93ZXIoZGVudHJ5KSwKKwkJCSBkYXRhc3luYyk7CiB9CiAKIHN0YXRpYyBpbnQgZWNyeXB0ZnNfZmFzeW5jKGludCBmZCwgc3RydWN0IGZpbGUgKmZpbGUsIGludCBmbGFnKQpkaWZmIC0tZ2l0IGEvZnMvZWNyeXB0ZnMvaW5vZGUuYyBiL2ZzL2VjcnlwdGZzL2lub2RlLmMKaW5kZXggNWU3OGZjMS4uNTY5Nzg5OSAxMDA2NDQKLS0tIGEvZnMvZWNyeXB0ZnMvaW5vZGUuYworKysgYi9mcy9lY3J5cHRmcy9pbm9kZS5jCkBAIC01Miw4ICs1Miw3IEBACiAvKioKICAqIGVjcnlwdGZzX2NyZWF0ZV91bmRlcmx5aW5nX2ZpbGUKICAqIEBsb3dlcl9kaXJfaW5vZGU6IGlub2RlIG9mIHRoZSBwYXJlbnQgaW4gdGhlIGxvd2VyIGZzIG9mIHRoZSBuZXcgZmlsZQotICogQGxvd2VyX2RlbnRyeTogTmV3IGZpbGUncyBkZW50cnkgaW4gdGhlIGxvd2VyIGZzCi0gKiBAZWNyeXB0ZnNfZGVudHJ5OiBOZXcgZmlsZSdzIGRlbnRyeSBpbiBlY3J5cHRmcworICogQGRlbnRyeTogTmV3IGZpbGUncyBkZW50cnkKICAqIEBtb2RlOiBUaGUgbW9kZSBvZiB0aGUgbmV3IGZpbGUKICAqIEBuZDogbmFtZWlkYXRhIG9mIGVjcnlwdGZzJyBwYXJlbnQncyBkZW50cnkgJiB2ZnNtb3VudAogICoKQEAgLTIyOCw4ICsyMjcsNyBAQAogewogCWludCByYzsKIAotCS8qIGVjcnlwdGZzX2RvX2NyZWF0ZSgpIGNhbGxzIGVjcnlwdGZzX2ludGVycG9zZSgpLCB3aGljaCBvcGVucwotCSAqIHRoZSBjcnlwdF9zdGF0LT5sb3dlcl9maWxlIChwZXJzaXN0ZW50IGZpbGUpICovCisJLyogZWNyeXB0ZnNfZG9fY3JlYXRlKCkgY2FsbHMgZWNyeXB0ZnNfaW50ZXJwb3NlKCkgKi8KIAlyYyA9IGVjcnlwdGZzX2RvX2NyZWF0ZShkaXJlY3RvcnlfaW5vZGUsIGVjcnlwdGZzX2RlbnRyeSwgbW9kZSwgbmQpOwogCWlmICh1bmxpa2VseShyYykpIHsKIAkJZWNyeXB0ZnNfcHJpbnRrKEtFUk5fV0FSTklORywgIkZhaWxlZCB0byBjcmVhdGUgZmlsZSBpbiIKQEAgLTI0NCwxNDEgKzI0Miw5MSBAQAogfQogCiAvKioKLSAqIGVjcnlwdGZzX2xvb2t1cAotICogQGRpcjogaW5vZGUKLSAqIEBkZW50cnk6IFRoZSBkZW50cnkKLSAqIEBuZDogbmFtZWlkYXRhLCBtYXkgYmUgTlVMTAotICoKLSAqIEZpbmQgYSBmaWxlIG9uIGRpc2suIElmIHRoZSBmaWxlIGRvZXMgbm90IGV4aXN0LCB0aGVuIHdlJ2xsIGFkZCBpdCB0byB0aGUKLSAqIGRlbnRyeSBjYWNoZSBhbmQgY29udGludWUgb24gdG8gcmVhZCBpdCBmcm9tIHRoZSBkaXNrLgorICogZWNyeXB0ZnNfbG9va3VwX2FuZF9pbnRlcnBvc2VfbG93ZXIgLSBQZXJmb3JtIGEgbG9va3VwCiAgKi8KLXN0YXRpYyBzdHJ1Y3QgZGVudHJ5ICplY3J5cHRmc19sb29rdXAoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKLQkJCQkgICAgICBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKK2ludCBlY3J5cHRmc19sb29rdXBfYW5kX2ludGVycG9zZV9sb3dlcihzdHJ1Y3QgZGVudHJ5ICplY3J5cHRmc19kZW50cnksCisJCQkJCXN0cnVjdCBkZW50cnkgKmxvd2VyX2RlbnRyeSwKKwkJCQkJc3RydWN0IGVjcnlwdGZzX2NyeXB0X3N0YXQgKmNyeXB0X3N0YXQsCisJCQkJCXN0cnVjdCBpbm9kZSAqZWNyeXB0ZnNfZGlyX2lub2RlLAorCQkJCQlzdHJ1Y3QgbmFtZWlkYXRhICplY3J5cHRmc19uZCkKIHsKLQlpbnQgcmMgPSAwOwogCXN0cnVjdCBkZW50cnkgKmxvd2VyX2Rpcl9kZW50cnk7Ci0Jc3RydWN0IGRlbnRyeSAqbG93ZXJfZGVudHJ5OwogCXN0cnVjdCB2ZnNtb3VudCAqbG93ZXJfbW50OwotCWNoYXIgKmVuY29kZWRfbmFtZTsKLQlpbnQgZW5jb2RlZF9uYW1lbGVuOwotCXN0cnVjdCBlY3J5cHRmc19jcnlwdF9zdGF0ICpjcnlwdF9zdGF0ID0gTlVMTDsKKwlzdHJ1Y3QgaW5vZGUgKmxvd2VyX2lub2RlOwogCXN0cnVjdCBlY3J5cHRmc19tb3VudF9jcnlwdF9zdGF0ICptb3VudF9jcnlwdF9zdGF0OwogCWNoYXIgKnBhZ2VfdmlydCA9IE5VTEw7Ci0Jc3RydWN0IGlub2RlICpsb3dlcl9pbm9kZTsKIAl1NjQgZmlsZV9zaXplOworCWludCByYyA9IDA7CiAKLQlsb3dlcl9kaXJfZGVudHJ5ID0gZWNyeXB0ZnNfZGVudHJ5X3RvX2xvd2VyKGRlbnRyeS0+ZF9wYXJlbnQpOwotCWRlbnRyeS0+ZF9vcCA9ICZlY3J5cHRmc19kb3BzOwotCWlmICgoZGVudHJ5LT5kX25hbWUubGVuID09IDEgJiYgIXN0cmNtcChkZW50cnktPmRfbmFtZS5uYW1lLCAiLiIpKQotCSAgICB8fCAoZGVudHJ5LT5kX25hbWUubGVuID09IDIKLQkJJiYgIXN0cmNtcChkZW50cnktPmRfbmFtZS5uYW1lLCAiLi4iKSkpIHsKLQkJZF9kcm9wKGRlbnRyeSk7Ci0JCWdvdG8gb3V0OwotCX0KLQllbmNvZGVkX25hbWVsZW4gPSBlY3J5cHRmc19lbmNvZGVfZmlsZW5hbWUoY3J5cHRfc3RhdCwKLQkJCQkJCSAgIGRlbnRyeS0+ZF9uYW1lLm5hbWUsCi0JCQkJCQkgICBkZW50cnktPmRfbmFtZS5sZW4sCi0JCQkJCQkgICAmZW5jb2RlZF9uYW1lKTsKLQlpZiAoZW5jb2RlZF9uYW1lbGVuIDwgMCkgewotCQlyYyA9IGVuY29kZWRfbmFtZWxlbjsKLQkJZF9kcm9wKGRlbnRyeSk7Ci0JCWdvdG8gb3V0OwotCX0KLQllY3J5cHRmc19wcmludGsoS0VSTl9ERUJVRywgImVuY29kZWRfbmFtZSA9IFslc107IGVuY29kZWRfbmFtZWxlbiAiCi0JCQkiPSBbJWRdXG4iLCBlbmNvZGVkX25hbWUsIGVuY29kZWRfbmFtZWxlbik7Ci0JbG93ZXJfZGVudHJ5ID0gbG9va3VwX29uZV9sZW4oZW5jb2RlZF9uYW1lLCBsb3dlcl9kaXJfZGVudHJ5LAotCQkJCSAgICAgIGVuY29kZWRfbmFtZWxlbiAtIDEpOwotCWtmcmVlKGVuY29kZWRfbmFtZSk7Ci0JaWYgKElTX0VSUihsb3dlcl9kZW50cnkpKSB7Ci0JCWVjcnlwdGZzX3ByaW50ayhLRVJOX0VSUiwgIkVSUiBmcm9tIGxvd2VyX2RlbnRyeVxuIik7Ci0JCXJjID0gUFRSX0VSUihsb3dlcl9kZW50cnkpOwotCQlkX2Ryb3AoZGVudHJ5KTsKLQkJZ290byBvdXQ7Ci0JfQotCWxvd2VyX21udCA9IG1udGdldChlY3J5cHRmc19kZW50cnlfdG9fbG93ZXJfbW50KGRlbnRyeS0+ZF9wYXJlbnQpKTsKLQllY3J5cHRmc19wcmludGsoS0VSTl9ERUJVRywgImxvd2VyX2RlbnRyeSA9IFslcF07IGxvd2VyX2RlbnRyeS0+IgotICAgICAgIAkJImRfbmFtZS5uYW1lID0gWyVzXVxuIiwgbG93ZXJfZGVudHJ5LAotCQlsb3dlcl9kZW50cnktPmRfbmFtZS5uYW1lKTsKKwlsb3dlcl9kaXJfZGVudHJ5ID0gbG93ZXJfZGVudHJ5LT5kX3BhcmVudDsKKwlsb3dlcl9tbnQgPSBtbnRnZXQoZWNyeXB0ZnNfZGVudHJ5X3RvX2xvd2VyX21udCgKKwkJCQkgICBlY3J5cHRmc19kZW50cnktPmRfcGFyZW50KSk7CiAJbG93ZXJfaW5vZGUgPSBsb3dlcl9kZW50cnktPmRfaW5vZGU7Ci0JZnNzdGFja19jb3B5X2F0dHJfYXRpbWUoZGlyLCBsb3dlcl9kaXJfZGVudHJ5LT5kX2lub2RlKTsKKwlmc3N0YWNrX2NvcHlfYXR0cl9hdGltZShlY3J5cHRmc19kaXJfaW5vZGUsIGxvd2VyX2Rpcl9kZW50cnktPmRfaW5vZGUpOwogCUJVR19PTighYXRvbWljX3JlYWQoJmxvd2VyX2RlbnRyeS0+ZF9jb3VudCkpOwotCWVjcnlwdGZzX3NldF9kZW50cnlfcHJpdmF0ZShkZW50cnksCisJZWNyeXB0ZnNfc2V0X2RlbnRyeV9wcml2YXRlKGVjcnlwdGZzX2RlbnRyeSwKIAkJCQkgICAga21lbV9jYWNoZV9hbGxvYyhlY3J5cHRmc19kZW50cnlfaW5mb19jYWNoZSwKIAkJCQkJCSAgICAgR0ZQX0tFUk5FTCkpOwotCWlmICghZWNyeXB0ZnNfZGVudHJ5X3RvX3ByaXZhdGUoZGVudHJ5KSkgeworCWlmICghZWNyeXB0ZnNfZGVudHJ5X3RvX3ByaXZhdGUoZWNyeXB0ZnNfZGVudHJ5KSkgewogCQlyYyA9IC1FTk9NRU07Ci0JCWVjcnlwdGZzX3ByaW50ayhLRVJOX0VSUiwgIk91dCBvZiBtZW1vcnkgd2hpbHN0IGF0dGVtcHRpbmcgIgotCQkJCSJ0byBhbGxvY2F0ZSBlY3J5cHRmc19kZW50cnlfaW5mbyBzdHJ1Y3RcbiIpOworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBPdXQgb2YgbWVtb3J5IHdoaWxzdCBhdHRlbXB0aW5nICIKKwkJICAgICAgICJ0byBhbGxvY2F0ZSBlY3J5cHRmc19kZW50cnlfaW5mbyBzdHJ1Y3RcbiIsCisJCQlfX2Z1bmNfXyk7CiAJCWdvdG8gb3V0X2RwdXQ7CiAJfQotCWVjcnlwdGZzX3NldF9kZW50cnlfbG93ZXIoZGVudHJ5LCBsb3dlcl9kZW50cnkpOwotCWVjcnlwdGZzX3NldF9kZW50cnlfbG93ZXJfbW50KGRlbnRyeSwgbG93ZXJfbW50KTsKKwllY3J5cHRmc19zZXRfZGVudHJ5X2xvd2VyKGVjcnlwdGZzX2RlbnRyeSwgbG93ZXJfZGVudHJ5KTsKKwllY3J5cHRmc19zZXRfZGVudHJ5X2xvd2VyX21udChlY3J5cHRmc19kZW50cnksIGxvd2VyX21udCk7CiAJaWYgKCFsb3dlcl9kZW50cnktPmRfaW5vZGUpIHsKIAkJLyogV2Ugd2FudCB0byBhZGQgYmVjYXVzZSB3ZSBjb3VsZG4ndCBmaW5kIGluIGxvd2VyICovCi0JCWRfYWRkKGRlbnRyeSwgTlVMTCk7CisJCWRfYWRkKGVjcnlwdGZzX2RlbnRyeSwgTlVMTCk7CiAJCWdvdG8gb3V0OwogCX0KLQlyYyA9IGVjcnlwdGZzX2ludGVycG9zZShsb3dlcl9kZW50cnksIGRlbnRyeSwgZGlyLT5pX3NiLAotCQkJCUVDUllQVEZTX0lOVEVSUE9TRV9GTEFHX0RfQUREKTsKKwlyYyA9IGVjcnlwdGZzX2ludGVycG9zZShsb3dlcl9kZW50cnksIGVjcnlwdGZzX2RlbnRyeSwKKwkJCQllY3J5cHRmc19kaXJfaW5vZGUtPmlfc2IsIDEpOwogCWlmIChyYykgewotCQllY3J5cHRmc19wcmludGsoS0VSTl9FUlIsICJFcnJvciBpbnRlcnBvc2luZ1xuIik7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IEVycm9yIGludGVycG9zaW5nOyByYyA9IFslZF1cbiIsCisJCSAgICAgICBfX2Z1bmNfXywgcmMpOwogCQlnb3RvIG91dDsKIAl9Ci0JaWYgKFNfSVNESVIobG93ZXJfaW5vZGUtPmlfbW9kZSkpIHsKLQkJZWNyeXB0ZnNfcHJpbnRrKEtFUk5fREVCVUcsICJJcyBhIGRpcmVjdG9yeTsgcmV0dXJuaW5nXG4iKTsKKwlpZiAoU19JU0RJUihsb3dlcl9pbm9kZS0+aV9tb2RlKSkKIAkJZ290byBvdXQ7Ci0JfQotCWlmIChTX0lTTE5LKGxvd2VyX2lub2RlLT5pX21vZGUpKSB7Ci0JCWVjcnlwdGZzX3ByaW50ayhLRVJOX0RFQlVHLCAiSXMgYSBzeW1saW5rOyByZXR1cm5pbmdcbiIpOworCWlmIChTX0lTTE5LKGxvd2VyX2lub2RlLT5pX21vZGUpKQogCQlnb3RvIG91dDsKLQl9Ci0JaWYgKHNwZWNpYWxfZmlsZShsb3dlcl9pbm9kZS0+aV9tb2RlKSkgewotCQllY3J5cHRmc19wcmludGsoS0VSTl9ERUJVRywgIklzIGEgc3BlY2lhbCBmaWxlOyByZXR1cm5pbmdcbiIpOworCWlmIChzcGVjaWFsX2ZpbGUobG93ZXJfaW5vZGUtPmlfbW9kZSkpCiAJCWdvdG8gb3V0OwotCX0KLQlpZiAoIW5kKSB7Ci0JCWVjcnlwdGZzX3ByaW50ayhLRVJOX0RFQlVHLCAiV2UgaGF2ZSBhIE5VTEwgbmQsIGp1c3QgbGVhdmUiCi0JCQkJImFzIHdlICp0aGluayogd2UgYXJlIGFib3V0IHRvIHVubGlua1xuIik7CisJaWYgKCFlY3J5cHRmc19uZCkKIAkJZ290byBvdXQ7Ci0JfQogCS8qIFJlbGVhc2VkIGluIHRoaXMgZnVuY3Rpb24gKi8KLQlwYWdlX3ZpcnQgPSBrbWVtX2NhY2hlX3phbGxvYyhlY3J5cHRmc19oZWFkZXJfY2FjaGVfMiwKLQkJCQkgICAgICBHRlBfVVNFUik7CisJcGFnZV92aXJ0ID0ga21lbV9jYWNoZV96YWxsb2MoZWNyeXB0ZnNfaGVhZGVyX2NhY2hlXzIsIEdGUF9VU0VSKTsKIAlpZiAoIXBhZ2VfdmlydCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBDYW5ub3Qga21lbV9jYWNoZV96YWxsb2MoKSBhIHBhZ2VcbiIsCisJCSAgICAgICBfX2Z1bmNfXyk7CiAJCXJjID0gLUVOT01FTTsKLQkJZWNyeXB0ZnNfcHJpbnRrKEtFUk5fRVJSLAotCQkJCSJDYW5ub3QgZWNyeXB0ZnNfa21hbGxvYyBhIHBhZ2VcbiIpOwogCQlnb3RvIG91dDsKIAl9Ci0JY3J5cHRfc3RhdCA9ICZlY3J5cHRmc19pbm9kZV90b19wcml2YXRlKGRlbnRyeS0+ZF9pbm9kZSktPmNyeXB0X3N0YXQ7Ci0JaWYgKCEoY3J5cHRfc3RhdC0+ZmxhZ3MgJiBFQ1JZUFRGU19QT0xJQ1lfQVBQTElFRCkpCi0JCWVjcnlwdGZzX3NldF9kZWZhdWx0X3NpemVzKGNyeXB0X3N0YXQpOwotCWlmICghZWNyeXB0ZnNfaW5vZGVfdG9fcHJpdmF0ZShkZW50cnktPmRfaW5vZGUpLT5sb3dlcl9maWxlKSB7Ci0JCXJjID0gZWNyeXB0ZnNfaW5pdF9wZXJzaXN0ZW50X2ZpbGUoZGVudHJ5KTsKKwlpZiAoIWVjcnlwdGZzX2lub2RlX3RvX3ByaXZhdGUoZWNyeXB0ZnNfZGVudHJ5LT5kX2lub2RlKS0+bG93ZXJfZmlsZSkgeworCQlyYyA9IGVjcnlwdGZzX2luaXRfcGVyc2lzdGVudF9maWxlKGVjcnlwdGZzX2RlbnRyeSk7CiAJCWlmIChyYykgewogCQkJcHJpbnRrKEtFUk5fRVJSICIlczogRXJyb3IgYXR0ZW1wdGluZyB0byBpbml0aWFsaXplICIKIAkJCSAgICAgICAidGhlIHBlcnNpc3RlbnQgZmlsZSBmb3IgdGhlIGRlbnRyeSB3aXRoIG5hbWUgIgogCQkJICAgICAgICJbJXNdOyByYyA9IFslZF1cbiIsIF9fZnVuY19fLAotCQkJICAgICAgIGRlbnRyeS0+ZF9uYW1lLm5hbWUsIHJjKTsKLQkJCWdvdG8gb3V0OworCQkJICAgICAgIGVjcnlwdGZzX2RlbnRyeS0+ZF9uYW1lLm5hbWUsIHJjKTsKKwkJCWdvdG8gb3V0X2ZyZWVfa21lbTsKIAkJfQogCX0KIAlyYyA9IGVjcnlwdGZzX3JlYWRfYW5kX3ZhbGlkYXRlX2hlYWRlcl9yZWdpb24ocGFnZV92aXJ0LAotCQkJCQkJICAgICAgZGVudHJ5LT5kX2lub2RlKTsKKwkJCQkJCSAgICAgIGVjcnlwdGZzX2RlbnRyeS0+ZF9pbm9kZSk7CiAJaWYgKHJjKSB7Ci0JCXJjID0gZWNyeXB0ZnNfcmVhZF9hbmRfdmFsaWRhdGVfeGF0dHJfcmVnaW9uKHBhZ2VfdmlydCwgZGVudHJ5KTsKKwkJcmMgPSBlY3J5cHRmc19yZWFkX2FuZF92YWxpZGF0ZV94YXR0cl9yZWdpb24ocGFnZV92aXJ0LAorCQkJCQkJCSAgICAgZWNyeXB0ZnNfZGVudHJ5KTsKIAkJaWYgKHJjKSB7Ci0JCQlwcmludGsoS0VSTl9ERUJVRyAiVmFsaWQgbWV0YWRhdGEgbm90IGZvdW5kIGluIGhlYWRlciAiCi0JCQkgICAgICAgInJlZ2lvbiBvciB4YXR0ciByZWdpb247IHRyZWF0aW5nIGZpbGUgYXMgIgotCQkJICAgICAgICJ1bmVuY3J5cHRlZFxuIik7CiAJCQlyYyA9IDA7Ci0JCQlrbWVtX2NhY2hlX2ZyZWUoZWNyeXB0ZnNfaGVhZGVyX2NhY2hlXzIsIHBhZ2VfdmlydCk7Ci0JCQlnb3RvIG91dDsKKwkJCWdvdG8gb3V0X2ZyZWVfa21lbTsKIAkJfQogCQljcnlwdF9zdGF0LT5mbGFncyB8PSBFQ1JZUFRGU19NRVRBREFUQV9JTl9YQVRUUjsKIAl9CiAJbW91bnRfY3J5cHRfc3RhdCA9ICZlY3J5cHRmc19zdXBlcmJsb2NrX3RvX3ByaXZhdGUoCi0JCWRlbnRyeS0+ZF9zYiktPm1vdW50X2NyeXB0X3N0YXQ7CisJCWVjcnlwdGZzX2RlbnRyeS0+ZF9zYiktPm1vdW50X2NyeXB0X3N0YXQ7CiAJaWYgKG1vdW50X2NyeXB0X3N0YXQtPmZsYWdzICYgRUNSWVBURlNfRU5DUllQVEVEX1ZJRVdfRU5BQkxFRCkgewogCQlpZiAoY3J5cHRfc3RhdC0+ZmxhZ3MgJiBFQ1JZUFRGU19NRVRBREFUQV9JTl9YQVRUUikKIAkJCWZpbGVfc2l6ZSA9IChjcnlwdF9zdGF0LT5udW1faGVhZGVyX2J5dGVzX2F0X2Zyb250CkBAIC0zODgsMTQgKzMzNiwxMDMgQEAKIAl9IGVsc2UgewogCQlmaWxlX3NpemUgPSBnZXRfdW5hbGlnbmVkX2JlNjQocGFnZV92aXJ0KTsKIAl9Ci0JaV9zaXplX3dyaXRlKGRlbnRyeS0+ZF9pbm9kZSwgKGxvZmZfdClmaWxlX3NpemUpOworCWlfc2l6ZV93cml0ZShlY3J5cHRmc19kZW50cnktPmRfaW5vZGUsIChsb2ZmX3QpZmlsZV9zaXplKTsKK291dF9mcmVlX2ttZW06CiAJa21lbV9jYWNoZV9mcmVlKGVjcnlwdGZzX2hlYWRlcl9jYWNoZV8yLCBwYWdlX3ZpcnQpOwogCWdvdG8gb3V0OwotCiBvdXRfZHB1dDoKIAlkcHV0KGxvd2VyX2RlbnRyeSk7Ci0JZF9kcm9wKGRlbnRyeSk7CisJZF9kcm9wKGVjcnlwdGZzX2RlbnRyeSk7CiBvdXQ6CisJcmV0dXJuIHJjOworfQorCisvKioKKyAqIGVjcnlwdGZzX2xvb2t1cAorICogQGVjcnlwdGZzX2Rpcl9pbm9kZTogVGhlIGVDcnlwdGZzIGRpcmVjdG9yeSBpbm9kZQorICogQGVjcnlwdGZzX2RlbnRyeTogVGhlIGVDcnlwdGZzIGRlbnRyeSB0aGF0IHdlIGFyZSBsb29raW5nIHVwCisgKiBAZWNyeXB0ZnNfbmQ6IG5hbWVpZGF0YTsgbWF5IGJlIE5VTEwKKyAqCisgKiBGaW5kIGEgZmlsZSBvbiBkaXNrLiBJZiB0aGUgZmlsZSBkb2VzIG5vdCBleGlzdCwgdGhlbiB3ZSdsbCBhZGQgaXQgdG8gdGhlCisgKiBkZW50cnkgY2FjaGUgYW5kIGNvbnRpbnVlIG9uIHRvIHJlYWQgaXQgZnJvbSB0aGUgZGlzay4KKyAqLworc3RhdGljIHN0cnVjdCBkZW50cnkgKmVjcnlwdGZzX2xvb2t1cChzdHJ1Y3QgaW5vZGUgKmVjcnlwdGZzX2Rpcl9pbm9kZSwKKwkJCQkgICAgICBzdHJ1Y3QgZGVudHJ5ICplY3J5cHRmc19kZW50cnksCisJCQkJICAgICAgc3RydWN0IG5hbWVpZGF0YSAqZWNyeXB0ZnNfbmQpCit7CisJY2hhciAqZW5jcnlwdGVkX2FuZF9lbmNvZGVkX25hbWUgPSBOVUxMOworCXNpemVfdCBlbmNyeXB0ZWRfYW5kX2VuY29kZWRfbmFtZV9zaXplOworCXN0cnVjdCBlY3J5cHRmc19jcnlwdF9zdGF0ICpjcnlwdF9zdGF0ID0gTlVMTDsKKwlzdHJ1Y3QgZWNyeXB0ZnNfbW91bnRfY3J5cHRfc3RhdCAqbW91bnRfY3J5cHRfc3RhdCA9IE5VTEw7CisJc3RydWN0IGVjcnlwdGZzX2lub2RlX2luZm8gKmlub2RlX2luZm87CisJc3RydWN0IGRlbnRyeSAqbG93ZXJfZGlyX2RlbnRyeSwgKmxvd2VyX2RlbnRyeTsKKwlpbnQgcmMgPSAwOworCisJZWNyeXB0ZnNfZGVudHJ5LT5kX29wID0gJmVjcnlwdGZzX2RvcHM7CisJaWYgKChlY3J5cHRmc19kZW50cnktPmRfbmFtZS5sZW4gPT0gMQorCSAgICAgJiYgIXN0cmNtcChlY3J5cHRmc19kZW50cnktPmRfbmFtZS5uYW1lLCAiLiIpKQorCSAgICB8fCAoZWNyeXB0ZnNfZGVudHJ5LT5kX25hbWUubGVuID09IDIKKwkJJiYgIXN0cmNtcChlY3J5cHRmc19kZW50cnktPmRfbmFtZS5uYW1lLCAiLi4iKSkpIHsKKwkJZ290byBvdXRfZF9kcm9wOworCX0KKwlsb3dlcl9kaXJfZGVudHJ5ID0gZWNyeXB0ZnNfZGVudHJ5X3RvX2xvd2VyKGVjcnlwdGZzX2RlbnRyeS0+ZF9wYXJlbnQpOworCWxvd2VyX2RlbnRyeSA9IGxvb2t1cF9vbmVfbGVuKGVjcnlwdGZzX2RlbnRyeS0+ZF9uYW1lLm5hbWUsCisJCQkJICAgICAgbG93ZXJfZGlyX2RlbnRyeSwKKwkJCQkgICAgICBlY3J5cHRmc19kZW50cnktPmRfbmFtZS5sZW4pOworCWlmIChJU19FUlIobG93ZXJfZGVudHJ5KSkgeworCQlyYyA9IFBUUl9FUlIobG93ZXJfZGVudHJ5KTsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogbG9va3VwX29uZV9sZW4oKSByZXR1cm5lZCBbJWRdIG9uICIKKwkJICAgICAgICJsb3dlcl9kZW50cnkgPSBbJXNdXG4iLCBfX2Z1bmNfXywgcmMsCisJCSAgICAgICBlY3J5cHRmc19kZW50cnktPmRfbmFtZS5uYW1lKTsKKwkJZ290byBvdXRfZF9kcm9wOworCX0KKwlpZiAobG93ZXJfZGVudHJ5LT5kX2lub2RlKQorCQlnb3RvIGxvb2t1cF9hbmRfaW50ZXJwb3NlOworCWlub2RlX2luZm8gPSAgZWNyeXB0ZnNfaW5vZGVfdG9fcHJpdmF0ZShlY3J5cHRmc19kZW50cnktPmRfaW5vZGUpOworCWlmIChpbm9kZV9pbmZvKSB7CisJCWNyeXB0X3N0YXQgPSAmaW5vZGVfaW5mby0+Y3J5cHRfc3RhdDsKKwkJLyogVE9ETzogbG9jayBmb3IgY3J5cHRfc3RhdCBjb21wYXJpc29uICovCisJCWlmICghKGNyeXB0X3N0YXQtPmZsYWdzICYgRUNSWVBURlNfUE9MSUNZX0FQUExJRUQpKQorCQkJZWNyeXB0ZnNfc2V0X2RlZmF1bHRfc2l6ZXMoY3J5cHRfc3RhdCk7CisJfQorCWlmIChjcnlwdF9zdGF0KQorCQltb3VudF9jcnlwdF9zdGF0ID0gY3J5cHRfc3RhdC0+bW91bnRfY3J5cHRfc3RhdDsKKwllbHNlCisJCW1vdW50X2NyeXB0X3N0YXQgPSAmZWNyeXB0ZnNfc3VwZXJibG9ja190b19wcml2YXRlKAorCQkJZWNyeXB0ZnNfZGVudHJ5LT5kX3NiKS0+bW91bnRfY3J5cHRfc3RhdDsKKwlpZiAoIShjcnlwdF9zdGF0ICYmIChjcnlwdF9zdGF0LT5mbGFncyAmIEVDUllQVEZTX0VOQ1JZUFRfRklMRU5BTUVTKSkKKwkgICAgJiYgIShtb3VudF9jcnlwdF9zdGF0ICYmIChtb3VudF9jcnlwdF9zdGF0LT5mbGFncworCQkJCSAgICAgJiBFQ1JZUFRGU19HTE9CQUxfRU5DUllQVF9GSUxFTkFNRVMpKSkKKwkJZ290byBsb29rdXBfYW5kX2ludGVycG9zZTsKKwlkcHV0KGxvd2VyX2RlbnRyeSk7CisJcmMgPSBlY3J5cHRmc19lbmNyeXB0X2FuZF9lbmNvZGVfZmlsZW5hbWUoCisJCSZlbmNyeXB0ZWRfYW5kX2VuY29kZWRfbmFtZSwgJmVuY3J5cHRlZF9hbmRfZW5jb2RlZF9uYW1lX3NpemUsCisJCWNyeXB0X3N0YXQsIG1vdW50X2NyeXB0X3N0YXQsIGVjcnlwdGZzX2RlbnRyeS0+ZF9uYW1lLm5hbWUsCisJCWVjcnlwdGZzX2RlbnRyeS0+ZF9uYW1lLmxlbik7CisJaWYgKHJjKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IEVycm9yIGF0dGVtcHRpbmcgdG8gZW5jcnlwdCBhbmQgZW5jb2RlICIKKwkJICAgICAgICJmaWxlbmFtZTsgcmMgPSBbJWRdXG4iLCBfX2Z1bmNfXywgcmMpOworCQlnb3RvIG91dF9kX2Ryb3A7CisJfQorCWxvd2VyX2RlbnRyeSA9IGxvb2t1cF9vbmVfbGVuKGVuY3J5cHRlZF9hbmRfZW5jb2RlZF9uYW1lLAorCQkJCSAgICAgIGxvd2VyX2Rpcl9kZW50cnksCisJCQkJICAgICAgZW5jcnlwdGVkX2FuZF9lbmNvZGVkX25hbWVfc2l6ZSAtIDEpOworCWlmIChJU19FUlIobG93ZXJfZGVudHJ5KSkgeworCQlyYyA9IFBUUl9FUlIobG93ZXJfZGVudHJ5KTsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogbG9va3VwX29uZV9sZW4oKSByZXR1cm5lZCBbJWRdIG9uICIKKwkJICAgICAgICJsb3dlcl9kZW50cnkgPSBbJXNdXG4iLCBfX2Z1bmNfXywgcmMsCisJCSAgICAgICBlbmNyeXB0ZWRfYW5kX2VuY29kZWRfbmFtZSk7CisJCWdvdG8gb3V0X2RfZHJvcDsKKwl9Citsb29rdXBfYW5kX2ludGVycG9zZToKKwlyYyA9IGVjcnlwdGZzX2xvb2t1cF9hbmRfaW50ZXJwb3NlX2xvd2VyKGVjcnlwdGZzX2RlbnRyeSwgbG93ZXJfZGVudHJ5LAorCQkJCQkJIGNyeXB0X3N0YXQsIGVjcnlwdGZzX2Rpcl9pbm9kZSwKKwkJCQkJCSBlY3J5cHRmc19uZCk7CisJZ290byBvdXQ7CitvdXRfZF9kcm9wOgorCWRfZHJvcChlY3J5cHRmc19kZW50cnkpOworb3V0OgorCWtmcmVlKGVuY3J5cHRlZF9hbmRfZW5jb2RlZF9uYW1lKTsKIAlyZXR1cm4gRVJSX1BUUihyYyk7CiB9CiAKQEAgLTQ2NiwxOSArNTAzLDIxIEBACiAJc3RydWN0IGRlbnRyeSAqbG93ZXJfZGVudHJ5OwogCXN0cnVjdCBkZW50cnkgKmxvd2VyX2Rpcl9kZW50cnk7CiAJY2hhciAqZW5jb2RlZF9zeW1uYW1lOwotCWludCBlbmNvZGVkX3N5bWxlbjsKLQlzdHJ1Y3QgZWNyeXB0ZnNfY3J5cHRfc3RhdCAqY3J5cHRfc3RhdCA9IE5VTEw7CisJc2l6ZV90IGVuY29kZWRfc3ltbGVuOworCXN0cnVjdCBlY3J5cHRmc19tb3VudF9jcnlwdF9zdGF0ICptb3VudF9jcnlwdF9zdGF0ID0gTlVMTDsKIAogCWxvd2VyX2RlbnRyeSA9IGVjcnlwdGZzX2RlbnRyeV90b19sb3dlcihkZW50cnkpOwogCWRnZXQobG93ZXJfZGVudHJ5KTsKIAlsb3dlcl9kaXJfZGVudHJ5ID0gbG9ja19wYXJlbnQobG93ZXJfZGVudHJ5KTsKLQllbmNvZGVkX3N5bWxlbiA9IGVjcnlwdGZzX2VuY29kZV9maWxlbmFtZShjcnlwdF9zdGF0LCBzeW1uYW1lLAotCQkJCQkJICBzdHJsZW4oc3ltbmFtZSksCi0JCQkJCQkgICZlbmNvZGVkX3N5bW5hbWUpOwotCWlmIChlbmNvZGVkX3N5bWxlbiA8IDApIHsKLQkJcmMgPSBlbmNvZGVkX3N5bWxlbjsKKwltb3VudF9jcnlwdF9zdGF0ID0gJmVjcnlwdGZzX3N1cGVyYmxvY2tfdG9fcHJpdmF0ZSgKKwkJZGlyLT5pX3NiKS0+bW91bnRfY3J5cHRfc3RhdDsKKwlyYyA9IGVjcnlwdGZzX2VuY3J5cHRfYW5kX2VuY29kZV9maWxlbmFtZSgmZW5jb2RlZF9zeW1uYW1lLAorCQkJCQkJICAmZW5jb2RlZF9zeW1sZW4sCisJCQkJCQkgIE5VTEwsCisJCQkJCQkgIG1vdW50X2NyeXB0X3N0YXQsIHN5bW5hbWUsCisJCQkJCQkgIHN0cmxlbihzeW1uYW1lKSk7CisJaWYgKHJjKQogCQlnb3RvIG91dF9sb2NrOwotCX0KIAlyYyA9IHZmc19zeW1saW5rKGxvd2VyX2Rpcl9kZW50cnktPmRfaW5vZGUsIGxvd2VyX2RlbnRyeSwKIAkJCSBlbmNvZGVkX3N5bW5hbWUpOwogCWtmcmVlKGVuY29kZWRfc3ltbmFtZSk7CkBAIC02MDIsNTMgKzY0MSw1NCBAQAogfQogCiBzdGF0aWMgaW50Ci1lY3J5cHRmc19yZWFkbGluayhzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNoYXIgX191c2VyICogYnVmLCBpbnQgYnVmc2l6KQorZWNyeXB0ZnNfcmVhZGxpbmsoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBjaGFyIF9fdXNlciAqYnVmLCBpbnQgYnVmc2l6KQogewotCWludCByYzsKLQlzdHJ1Y3QgZGVudHJ5ICpsb3dlcl9kZW50cnk7Ci0JY2hhciAqZGVjb2RlZF9uYW1lOwogCWNoYXIgKmxvd2VyX2J1ZjsKLQltbV9zZWdtZW50X3Qgb2xkX2ZzOworCXN0cnVjdCBkZW50cnkgKmxvd2VyX2RlbnRyeTsKIAlzdHJ1Y3QgZWNyeXB0ZnNfY3J5cHRfc3RhdCAqY3J5cHRfc3RhdDsKKwljaGFyICpwbGFpbnRleHRfbmFtZTsKKwlzaXplX3QgcGxhaW50ZXh0X25hbWVfc2l6ZTsKKwltbV9zZWdtZW50X3Qgb2xkX2ZzOworCWludCByYzsKIAogCWxvd2VyX2RlbnRyeSA9IGVjcnlwdGZzX2RlbnRyeV90b19sb3dlcihkZW50cnkpOwotCWlmICghbG93ZXJfZGVudHJ5LT5kX2lub2RlLT5pX29wIHx8Ci0JICAgICFsb3dlcl9kZW50cnktPmRfaW5vZGUtPmlfb3AtPnJlYWRsaW5rKSB7CisJaWYgKCFsb3dlcl9kZW50cnktPmRfaW5vZGUtPmlfb3AtPnJlYWRsaW5rKSB7CiAJCXJjID0gLUVJTlZBTDsKIAkJZ290byBvdXQ7CiAJfQorCWNyeXB0X3N0YXQgPSAmZWNyeXB0ZnNfaW5vZGVfdG9fcHJpdmF0ZShkZW50cnktPmRfaW5vZGUpLT5jcnlwdF9zdGF0OwogCS8qIFJlbGVhc2VkIGluIHRoaXMgZnVuY3Rpb24gKi8KIAlsb3dlcl9idWYgPSBrbWFsbG9jKGJ1ZnNpeiwgR0ZQX0tFUk5FTCk7CiAJaWYgKGxvd2VyX2J1ZiA9PSBOVUxMKSB7Ci0JCWVjcnlwdGZzX3ByaW50ayhLRVJOX0VSUiwgIk91dCBvZiBtZW1vcnlcbiIpOworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBPdXQgb2YgbWVtb3J5IHdoaWxzdCBhdHRlbXB0aW5nIHRvICIKKwkJICAgICAgICJrbWFsbG9jIFslZF0gYnl0ZXNcbiIsIF9fZnVuY19fLCBidWZzaXopOwogCQlyYyA9IC1FTk9NRU07CiAJCWdvdG8gb3V0OwogCX0KIAlvbGRfZnMgPSBnZXRfZnMoKTsKIAlzZXRfZnMoZ2V0X2RzKCkpOwotCWVjcnlwdGZzX3ByaW50ayhLRVJOX0RFQlVHLCAiQ2FsbGluZyByZWFkbGluayB3LyAiCi0JCQkibG93ZXJfZGVudHJ5LT5kX25hbWUubmFtZSA9IFslc11cbiIsCi0JCQlsb3dlcl9kZW50cnktPmRfbmFtZS5uYW1lKTsKIAlyYyA9IGxvd2VyX2RlbnRyeS0+ZF9pbm9kZS0+aV9vcC0+cmVhZGxpbmsobG93ZXJfZGVudHJ5LAogCQkJCQkJICAgKGNoYXIgX191c2VyICopbG93ZXJfYnVmLAogCQkJCQkJICAgYnVmc2l6KTsKIAlzZXRfZnMob2xkX2ZzKTsKIAlpZiAocmMgPj0gMCkgewotCQljcnlwdF9zdGF0ID0gTlVMTDsKLQkJcmMgPSBlY3J5cHRmc19kZWNvZGVfZmlsZW5hbWUoY3J5cHRfc3RhdCwgbG93ZXJfYnVmLCByYywKLQkJCQkJICAgICAgJmRlY29kZWRfbmFtZSk7Ci0JCWlmIChyYyA9PSAtRU5PTUVNKQorCQlyYyA9IGVjcnlwdGZzX2RlY29kZV9hbmRfZGVjcnlwdF9maWxlbmFtZSgmcGxhaW50ZXh0X25hbWUsCisJCQkJCQkJICAmcGxhaW50ZXh0X25hbWVfc2l6ZSwKKwkJCQkJCQkgIGRlbnRyeSwgbG93ZXJfYnVmLAorCQkJCQkJCSAgcmMpOworCQlpZiAocmMpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IEVycm9yIGF0dGVtcHRpbmcgdG8gZGVjb2RlIGFuZCAiCisJCQkgICAgICAgImRlY3J5cHQgZmlsZW5hbWU7IHJjID0gWyVkXVxuIiwgX19mdW5jX18sCisJCQkJcmMpOwogCQkJZ290byBvdXRfZnJlZV9sb3dlcl9idWY7Ci0JCWlmIChyYyA+IDApIHsKLQkJCWVjcnlwdGZzX3ByaW50ayhLRVJOX0RFQlVHLCAiQ29weWluZyBbJWRdIGJ5dGVzICIKLQkJCQkJInRvIHVzZXJzcGFjZTogWyUqc11cbiIsIHJjLAotCQkJCQlkZWNvZGVkX25hbWUpOwotCQkJaWYgKGNvcHlfdG9fdXNlcihidWYsIGRlY29kZWRfbmFtZSwgcmMpKQotCQkJCXJjID0gLUVGQVVMVDsKIAkJfQotCQlrZnJlZShkZWNvZGVkX25hbWUpOwotCQlmc3N0YWNrX2NvcHlfYXR0cl9hdGltZShkZW50cnktPmRfaW5vZGUsCi0JCQkJCWxvd2VyX2RlbnRyeS0+ZF9pbm9kZSk7CisJCXJjID0gY29weV90b191c2VyKGJ1ZiwgcGxhaW50ZXh0X25hbWUsIHBsYWludGV4dF9uYW1lX3NpemUpOworCQlpZiAocmMpCisJCQlyYyA9IC1FRkFVTFQ7CisJCWVsc2UKKwkJCXJjID0gcGxhaW50ZXh0X25hbWVfc2l6ZTsKKwkJa2ZyZWUocGxhaW50ZXh0X25hbWUpOworCQlmc3N0YWNrX2NvcHlfYXR0cl9hdGltZShkZW50cnktPmRfaW5vZGUsIGxvd2VyX2RlbnRyeS0+ZF9pbm9kZSk7CiAJfQogb3V0X2ZyZWVfbG93ZXJfYnVmOgogCWtmcmVlKGxvd2VyX2J1Zik7CkBAIC02NzAsOCArNzEwLDYgQEAKIAl9CiAJb2xkX2ZzID0gZ2V0X2ZzKCk7CiAJc2V0X2ZzKGdldF9kcygpKTsKLQllY3J5cHRmc19wcmludGsoS0VSTl9ERUJVRywgIkNhbGxpbmcgcmVhZGxpbmsgdy8gIgotCQkJImRlbnRyeS0+ZF9uYW1lLm5hbWUgPSBbJXNdXG4iLCBkZW50cnktPmRfbmFtZS5uYW1lKTsKIAlyYyA9IGRlbnRyeS0+ZF9pbm9kZS0+aV9vcC0+cmVhZGxpbmsoZGVudHJ5LCAoY2hhciBfX3VzZXIgKilidWYsIGxlbik7CiAJc2V0X2ZzKG9sZF9mcyk7CiAJaWYgKHJjIDwgMCkKZGlmZiAtLWdpdCBhL2ZzL2VjcnlwdGZzL2tleXN0b3JlLmMgYi9mcy9lY3J5cHRmcy9rZXlzdG9yZS5jCmluZGV4IDBkNzEzYjYuLmZmNTM5NDIgMTAwNjQ0Ci0tLSBhL2ZzL2VjcnlwdGZzL2tleXN0b3JlLmMKKysrIGIvZnMvZWNyeXB0ZnMva2V5c3RvcmUuYwpAQCAtMzU4LDcgKzM1OCw3IEBACiAJLyogdmVyaWZ5IHRoYXQgZXZlcnl0aGluZyB0aHJvdWdoIHRoZSBlbmNyeXB0ZWQgRkVLIHNpemUgaXMgcHJlc2VudCAqLwogCWlmIChtZXNzYWdlX2xlbiA8IDQpIHsKIAkJcmMgPSAtRUlPOwotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBtZXNzYWdlX2xlbiBpcyBbJVpkXTsgbWluaW11bSBhY2NlcHRhYmxlICIKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogbWVzc2FnZV9sZW4gaXMgWyV6ZF07IG1pbmltdW0gYWNjZXB0YWJsZSAiCiAJCSAgICAgICAibWVzc2FnZSBsZW5ndGggaXMgWyVkXVxuIiwgX19mdW5jX18sIG1lc3NhZ2VfbGVuLCA0KTsKIAkJZ290byBvdXQ7CiAJfQpAQCAtMzg1LDEzICszODUsMTMgQEAKIAlpICs9IGRhdGFfbGVuOwogCWlmIChtZXNzYWdlX2xlbiA8IChpICsga2V5X3JlYy0+ZW5jX2tleV9zaXplKSkgewogCQlyYyA9IC1FSU87Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IG1lc3NhZ2VfbGVuIFslWmRdOyBtYXggbGVuIGlzIFslWmRdXG4iLAorCQlwcmludGsoS0VSTl9FUlIgIiVzOiBtZXNzYWdlX2xlbiBbJXpkXTsgbWF4IGxlbiBpcyBbJXpkXVxuIiwKIAkJICAgICAgIF9fZnVuY19fLCBtZXNzYWdlX2xlbiwgKGkgKyBrZXlfcmVjLT5lbmNfa2V5X3NpemUpKTsKIAkJZ290byBvdXQ7CiAJfQogCWlmIChrZXlfcmVjLT5lbmNfa2V5X3NpemUgPiBFQ1JZUFRGU19NQVhfRU5DUllQVEVEX0tFWV9CWVRFUykgewogCQlyYyA9IC1FSU87Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IEVuY3J5cHRlZCBrZXlfc2l6ZSBbJVpkXSBsYXJnZXIgdGhhbiAiCisJCXByaW50ayhLRVJOX0VSUiAiJXM6IEVuY3J5cHRlZCBrZXlfc2l6ZSBbJXpkXSBsYXJnZXIgdGhhbiAiCiAJCSAgICAgICAidGhlIG1heGltdW0ga2V5IHNpemUgWyVkXVxuIiwgX19mdW5jX18sCiAJCSAgICAgICBrZXlfcmVjLT5lbmNfa2V5X3NpemUsCiAJCSAgICAgICBFQ1JZUFRGU19NQVhfRU5DUllQVEVEX0tFWV9CWVRFUyk7CkBAIC00MDMsNiArNDAzLDU4MCBAQAogfQogCiBzdGF0aWMgaW50CitlY3J5cHRmc19maW5kX2dsb2JhbF9hdXRoX3Rva19mb3Jfc2lnKAorCXN0cnVjdCBlY3J5cHRmc19nbG9iYWxfYXV0aF90b2sgKipnbG9iYWxfYXV0aF90b2ssCisJc3RydWN0IGVjcnlwdGZzX21vdW50X2NyeXB0X3N0YXQgKm1vdW50X2NyeXB0X3N0YXQsIGNoYXIgKnNpZykKK3sKKwlzdHJ1Y3QgZWNyeXB0ZnNfZ2xvYmFsX2F1dGhfdG9rICp3YWxrZXI7CisJaW50IHJjID0gMDsKKworCSgqZ2xvYmFsX2F1dGhfdG9rKSA9IE5VTEw7CisJbXV0ZXhfbG9jaygmbW91bnRfY3J5cHRfc3RhdC0+Z2xvYmFsX2F1dGhfdG9rX2xpc3RfbXV0ZXgpOworCWxpc3RfZm9yX2VhY2hfZW50cnkod2Fsa2VyLAorCQkJICAgICZtb3VudF9jcnlwdF9zdGF0LT5nbG9iYWxfYXV0aF90b2tfbGlzdCwKKwkJCSAgICBtb3VudF9jcnlwdF9zdGF0X2xpc3QpIHsKKwkJaWYgKG1lbWNtcCh3YWxrZXItPnNpZywgc2lnLCBFQ1JZUFRGU19TSUdfU0laRV9IRVgpID09IDApIHsKKwkJCSgqZ2xvYmFsX2F1dGhfdG9rKSA9IHdhbGtlcjsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCXJjID0gLUVJTlZBTDsKK291dDoKKwltdXRleF91bmxvY2soJm1vdW50X2NyeXB0X3N0YXQtPmdsb2JhbF9hdXRoX3Rva19saXN0X211dGV4KTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qKgorICogZWNyeXB0ZnNfZmluZF9hdXRoX3Rva19mb3Jfc2lnCisgKiBAYXV0aF90b2s6IFNldCB0byB0aGUgbWF0Y2hpbmcgYXV0aF90b2s7IE5VTEwgaWYgbm90IGZvdW5kCisgKiBAY3J5cHRfc3RhdDogaW5vZGUgY3J5cHRfc3RhdCBjcnlwdG8gY29udGV4dAorICogQHNpZzogU2lnIG9mIGF1dGhfdG9rIHRvIGZpbmQKKyAqCisgKiBGb3Igbm93LCB0aGlzIGZ1bmN0aW9uIHNpbXBseSBsb29rcyBhdCB0aGUgcmVnaXN0ZXJlZCBhdXRoX3RvaydzCisgKiBsaW5rZWQgb2ZmIHRoZSBtb3VudF9jcnlwdF9zdGF0LCBzbyBhbGwgdGhlIGF1dGhfdG9rcyB0aGF0IGNhbiBiZQorICogdXNlZCBtdXN0IGJlIHJlZ2lzdGVyZWQgYXQgbW91bnQgdGltZS4gVGhpcyBmdW5jdGlvbiBjb3VsZAorICogcG90ZW50aWFsbHkgdHJ5IGEgbG90IGhhcmRlciB0byBmaW5kIGF1dGhfdG9rJ3MgKGUuZy4sIGJ5IGNhbGxpbmcKKyAqIG91dCB0byBlY3J5cHRmc2QgdG8gZHluYW1pY2FsbHkgcmV0cmlldmUgYW4gYXV0aF90b2sgb2JqZWN0KSBzbworICogdGhhdCBzdGF0aWMgcmVnaXN0cmF0aW9uIG9mIGF1dGhfdG9rJ3Mgd2lsbCBubyBsb25nZXIgYmUgbmVjZXNzYXJ5LgorICoKKyAqIFJldHVybnMgemVybyBvbiBubyBlcnJvcjsgbm9uLXplcm8gb24gZXJyb3IKKyAqLworc3RhdGljIGludAorZWNyeXB0ZnNfZmluZF9hdXRoX3Rva19mb3Jfc2lnKAorCXN0cnVjdCBlY3J5cHRmc19hdXRoX3RvayAqKmF1dGhfdG9rLAorCXN0cnVjdCBlY3J5cHRmc19tb3VudF9jcnlwdF9zdGF0ICptb3VudF9jcnlwdF9zdGF0LAorCWNoYXIgKnNpZykKK3sKKwlzdHJ1Y3QgZWNyeXB0ZnNfZ2xvYmFsX2F1dGhfdG9rICpnbG9iYWxfYXV0aF90b2s7CisJaW50IHJjID0gMDsKKworCSgqYXV0aF90b2spID0gTlVMTDsKKwlpZiAoZWNyeXB0ZnNfZmluZF9nbG9iYWxfYXV0aF90b2tfZm9yX3NpZygmZ2xvYmFsX2F1dGhfdG9rLAorCQkJCQkJICBtb3VudF9jcnlwdF9zdGF0LCBzaWcpKSB7CisJCXN0cnVjdCBrZXkgKmF1dGhfdG9rX2tleTsKKworCQlyYyA9IGVjcnlwdGZzX2tleXJpbmdfYXV0aF90b2tfZm9yX3NpZygmYXV0aF90b2tfa2V5LCBhdXRoX3RvaywKKwkJCQkJCSAgICAgICBzaWcpOworCX0gZWxzZQorCQkoKmF1dGhfdG9rKSA9IGdsb2JhbF9hdXRoX3Rvay0+Z2xvYmFsX2F1dGhfdG9rOworCXJldHVybiByYzsKK30KKworLyoqCisgKiB3cml0ZV90YWdfNzBfcGFja2V0IGNhbiBnb2JibGUgYSBsb3Qgb2Ygc3RhY2sgc3BhY2UuIFdlIHN0dWZmIG1vc3QKKyAqIG9mIHRoZSBmdW5jdGlvbidzIHBhcmFtZXRlcnMgaW4gYSBrbWFsbG9jJ2Qgc3RydWN0IHRvIGhlbHAgcmVkdWNlCisgKiBlQ3J5cHRmcycgb3ZlcmFsbCBzdGFjayB1c2FnZS4KKyAqLworc3RydWN0IGVjcnlwdGZzX3dyaXRlX3RhZ183MF9wYWNrZXRfc2lsbHlfc3RhY2sgeworCXU4IGNpcGhlcl9jb2RlOworCXNpemVfdCBtYXhfcGFja2V0X3NpemU7CisJc2l6ZV90IHBhY2tldF9zaXplX2xlbjsKKwlzaXplX3QgYmxvY2tfYWxpZ25lZF9maWxlbmFtZV9zaXplOworCXNpemVfdCBibG9ja19zaXplOworCXNpemVfdCBpOworCXNpemVfdCBqOworCXNpemVfdCBudW1fcmFuZF9ieXRlczsKKwlzdHJ1Y3QgbXV0ZXggKnRmbV9tdXRleDsKKwljaGFyICpibG9ja19hbGlnbmVkX2ZpbGVuYW1lOworCXN0cnVjdCBlY3J5cHRmc19hdXRoX3RvayAqYXV0aF90b2s7CisJc3RydWN0IHNjYXR0ZXJsaXN0IHNyY19zZzsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgZHN0X3NnOworCXN0cnVjdCBibGtjaXBoZXJfZGVzYyBkZXNjOworCWNoYXIgaXZbRUNSWVBURlNfTUFYX0lWX0JZVEVTXTsKKwljaGFyIGhhc2hbRUNSWVBURlNfVEFHXzcwX0RJR0VTVF9TSVpFXTsKKwljaGFyIHRtcF9oYXNoW0VDUllQVEZTX1RBR183MF9ESUdFU1RfU0laRV07CisJc3RydWN0IGhhc2hfZGVzYyBoYXNoX2Rlc2M7CisJc3RydWN0IHNjYXR0ZXJsaXN0IGhhc2hfc2c7Cit9OworCisvKioKKyAqIHdyaXRlX3RhZ183MF9wYWNrZXQgLSBXcml0ZSBlbmNyeXB0ZWQgZmlsZW5hbWUgKEVGTikgcGFja2V0IGFnYWluc3QgRk5FSworICogQGZpbGVuYW1lOiBOVUxMLXRlcm1pbmF0ZWQgZmlsZW5hbWUgc3RyaW5nCisgKgorICogVGhpcyBpcyB0aGUgc2ltcGxlc3QgbWVjaGFuaXNtIGZvciBhY2hpZXZpbmcgZmlsZW5hbWUgZW5jcnlwdGlvbiBpbgorICogZUNyeXB0ZnMuIEl0IGVuY3J5cHRzIHRoZSBnaXZlbiBmaWxlbmFtZSB3aXRoIHRoZSBtb3VudC13aWRlCisgKiBmaWxlbmFtZSBlbmNyeXB0aW9uIGtleSAoRk5FSykgYW5kIHN0b3JlcyBpdCBpbiBhIHBhY2tldCB0byBAZGVzdCwKKyAqIHdoaWNoIHRoZSBjYWxsZWUgd2lsbCBlbmNvZGUgYW5kIHdyaXRlIGRpcmVjdGx5IGludG8gdGhlIGRlbnRyeQorICogbmFtZS4KKyAqLworaW50CitlY3J5cHRmc193cml0ZV90YWdfNzBfcGFja2V0KGNoYXIgKmRlc3QsIHNpemVfdCAqcmVtYWluaW5nX2J5dGVzLAorCQkJICAgICBzaXplX3QgKnBhY2tldF9zaXplLAorCQkJICAgICBzdHJ1Y3QgZWNyeXB0ZnNfbW91bnRfY3J5cHRfc3RhdCAqbW91bnRfY3J5cHRfc3RhdCwKKwkJCSAgICAgY2hhciAqZmlsZW5hbWUsIHNpemVfdCBmaWxlbmFtZV9zaXplKQoreworCXN0cnVjdCBlY3J5cHRmc193cml0ZV90YWdfNzBfcGFja2V0X3NpbGx5X3N0YWNrICpzOworCWludCByYyA9IDA7CisKKwlzID0ga21hbGxvYyhzaXplb2YoKnMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogT3V0IG9mIG1lbW9yeSB3aGlsc3QgdHJ5aW5nIHRvIGttYWxsb2MgIgorCQkgICAgICAgIlslemRdIGJ5dGVzIG9mIGtlcm5lbCBtZW1vcnlcbiIsIF9fZnVuY19fLCBzaXplb2YoKnMpKTsKKwkJZ290byBvdXQ7CisJfQorCXMtPmRlc2MuZmxhZ3MgPSBDUllQVE9fVEZNX1JFUV9NQVlfU0xFRVA7CisJKCpwYWNrZXRfc2l6ZSkgPSAwOworCXJjID0gZWNyeXB0ZnNfZ2V0X3RmbV9hbmRfbXV0ZXhfZm9yX2NpcGhlcl9uYW1lKAorCQkmcy0+ZGVzYy50Zm0sCisJCSZzLT50Zm1fbXV0ZXgsIG1vdW50X2NyeXB0X3N0YXQtPmdsb2JhbF9kZWZhdWx0X2ZuX2NpcGhlcl9uYW1lKTsKKwlpZiAodW5saWtlbHkocmMpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiSW50ZXJuYWwgZXJyb3Igd2hpbHN0IGF0dGVtcHRpbmcgdG8gZ2V0ICIKKwkJICAgICAgICJ0Zm0gYW5kIG11dGV4IGZvciBjaXBoZXIgbmFtZSBbJXNdOyByYyA9IFslZF1cbiIsCisJCSAgICAgICBtb3VudF9jcnlwdF9zdGF0LT5nbG9iYWxfZGVmYXVsdF9mbl9jaXBoZXJfbmFtZSwgcmMpOworCQlnb3RvIG91dDsKKwl9CisJbXV0ZXhfbG9jayhzLT50Zm1fbXV0ZXgpOworCXMtPmJsb2NrX3NpemUgPSBjcnlwdG9fYmxrY2lwaGVyX2Jsb2Nrc2l6ZShzLT5kZXNjLnRmbSk7CisJLyogUGx1cyBvbmUgZm9yIHRoZSBcMCBzZXBhcmF0b3IgYmV0d2VlbiB0aGUgcmFuZG9tIHByZWZpeAorCSAqIGFuZCB0aGUgcGxhaW50ZXh0IGZpbGVuYW1lICovCisJcy0+bnVtX3JhbmRfYnl0ZXMgPSAoRUNSWVBURlNfRklMRU5BTUVfTUlOX1JBTkRPTV9QUkVQRU5EX0JZVEVTICsgMSk7CisJcy0+YmxvY2tfYWxpZ25lZF9maWxlbmFtZV9zaXplID0gKHMtPm51bV9yYW5kX2J5dGVzICsgZmlsZW5hbWVfc2l6ZSk7CisJaWYgKChzLT5ibG9ja19hbGlnbmVkX2ZpbGVuYW1lX3NpemUgJSBzLT5ibG9ja19zaXplKSAhPSAwKSB7CisJCXMtPm51bV9yYW5kX2J5dGVzICs9IChzLT5ibG9ja19zaXplCisJCQkJICAgICAgLSAocy0+YmxvY2tfYWxpZ25lZF9maWxlbmFtZV9zaXplCisJCQkJCSAlIHMtPmJsb2NrX3NpemUpKTsKKwkJcy0+YmxvY2tfYWxpZ25lZF9maWxlbmFtZV9zaXplID0gKHMtPm51bV9yYW5kX2J5dGVzCisJCQkJCQkgICsgZmlsZW5hbWVfc2l6ZSk7CisJfQorCS8qIE9jdGV0IDA6IFRhZyA3MCBpZGVudGlmaWVyCisJICogT2N0ZXRzIDEtTjE6IFRhZyA3MCBwYWNrZXQgc2l6ZSAoaW5jbHVkZXMgY2lwaGVyIGlkZW50aWZpZXIKKwkgKiAgICAgICAgICAgICAgYW5kIGJsb2NrLWFsaWduZWQgZW5jcnlwdGVkIGZpbGVuYW1lIHNpemUpCisJICogT2N0ZXRzIE4xLU4yOiBGTkVLIHNpZyAoRUNSWVBURlNfU0lHX1NJWkUpCisJICogT2N0ZXQgTjItTjM6IENpcGhlciBpZGVudGlmaWVyICgxIG9jdGV0KQorCSAqIE9jdGV0cyBOMy1ONDogQmxvY2stYWxpZ25lZCBlbmNyeXB0ZWQgZmlsZW5hbWUKKwkgKiAgLSBDb25zaXN0cyBvZiBhIG1pbmltdW0gbnVtYmVyIG9mIHJhbmRvbSBjaGFyYWN0ZXJzLCBhIFwwCisJICogICAgc2VwYXJhdG9yLCBhbmQgdGhlbiB0aGUgZmlsZW5hbWUgKi8KKwlzLT5tYXhfcGFja2V0X3NpemUgPSAoMSAgICAgICAgICAgICAgICAgICAvKiBUYWcgNzAgaWRlbnRpZmllciAqLworCQkJICAgICAgKyAzICAgICAgICAgICAgICAgICAvKiBNYXggVGFnIDcwIHBhY2tldCBzaXplICovCisJCQkgICAgICArIEVDUllQVEZTX1NJR19TSVpFIC8qIEZORUsgc2lnICovCisJCQkgICAgICArIDEgICAgICAgICAgICAgICAgIC8qIENpcGhlciBpZGVudGlmaWVyICovCisJCQkgICAgICArIHMtPmJsb2NrX2FsaWduZWRfZmlsZW5hbWVfc2l6ZSk7CisJaWYgKGRlc3QgPT0gTlVMTCkgeworCQkoKnBhY2tldF9zaXplKSA9IHMtPm1heF9wYWNrZXRfc2l6ZTsKKwkJZ290byBvdXRfdW5sb2NrOworCX0KKwlpZiAocy0+bWF4X3BhY2tldF9zaXplID4gKCpyZW1haW5pbmdfYnl0ZXMpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBSZXF1aXJlIFslemRdIGJ5dGVzIHRvIHdyaXRlOyBvbmx5ICIKKwkJICAgICAgICJbJXpkXSBhdmFpbGFibGVcbiIsIF9fZnVuY19fLCBzLT5tYXhfcGFja2V0X3NpemUsCisJCSAgICAgICAoKnJlbWFpbmluZ19ieXRlcykpOworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gb3V0X3VubG9jazsKKwl9CisJcy0+YmxvY2tfYWxpZ25lZF9maWxlbmFtZSA9IGt6YWxsb2Mocy0+YmxvY2tfYWxpZ25lZF9maWxlbmFtZV9zaXplLAorCQkJCQkgICAgR0ZQX0tFUk5FTCk7CisJaWYgKCFzLT5ibG9ja19hbGlnbmVkX2ZpbGVuYW1lKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IE91dCBvZiBrZXJuZWwgbWVtb3J5IHdoaWxzdCBhdHRlbXB0aW5nIHRvICIKKwkJICAgICAgICJremFsbG9jIFslemRdIGJ5dGVzXG4iLCBfX2Z1bmNfXywKKwkJICAgICAgIHMtPmJsb2NrX2FsaWduZWRfZmlsZW5hbWVfc2l6ZSk7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBvdXRfdW5sb2NrOworCX0KKwlzLT5pID0gMDsKKwlkZXN0W3MtPmkrK10gPSBFQ1JZUFRGU19UQUdfNzBfUEFDS0VUX1RZUEU7CisJcmMgPSBlY3J5cHRmc193cml0ZV9wYWNrZXRfbGVuZ3RoKCZkZXN0W3MtPmldLAorCQkJCQkgIChFQ1JZUFRGU19TSUdfU0laRQorCQkJCQkgICArIDEgLyogQ2lwaGVyIGNvZGUgKi8KKwkJCQkJICAgKyBzLT5ibG9ja19hbGlnbmVkX2ZpbGVuYW1lX3NpemUpLAorCQkJCQkgICZzLT5wYWNrZXRfc2l6ZV9sZW4pOworCWlmIChyYykgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBFcnJvciBnZW5lcmF0aW5nIHRhZyA3MCBwYWNrZXQgIgorCQkgICAgICAgImhlYWRlcjsgY2Fubm90IGdlbmVyYXRlIHBhY2tldCBsZW5ndGg7IHJjID0gWyVkXVxuIiwKKwkJICAgICAgIF9fZnVuY19fLCByYyk7CisJCWdvdG8gb3V0X2ZyZWVfdW5sb2NrOworCX0KKwlzLT5pICs9IHMtPnBhY2tldF9zaXplX2xlbjsKKwllY3J5cHRmc19mcm9tX2hleCgmZGVzdFtzLT5pXSwKKwkJCSAgbW91bnRfY3J5cHRfc3RhdC0+Z2xvYmFsX2RlZmF1bHRfZm5la19zaWcsCisJCQkgIEVDUllQVEZTX1NJR19TSVpFKTsKKwlzLT5pICs9IEVDUllQVEZTX1NJR19TSVpFOworCXMtPmNpcGhlcl9jb2RlID0gZWNyeXB0ZnNfY29kZV9mb3JfY2lwaGVyX3N0cmluZygKKwkJbW91bnRfY3J5cHRfc3RhdC0+Z2xvYmFsX2RlZmF1bHRfZm5fY2lwaGVyX25hbWUsCisJCW1vdW50X2NyeXB0X3N0YXQtPmdsb2JhbF9kZWZhdWx0X2ZuX2NpcGhlcl9rZXlfYnl0ZXMpOworCWlmIChzLT5jaXBoZXJfY29kZSA9PSAwKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBVbmFibGUgdG8gZ2VuZXJhdGUgY29kZSBmb3IgIgorCQkgICAgICAgImNpcGhlciBbJXNdIHdpdGgga2V5IGJ5dGVzIFslemRdXG4iLCBfX2Z1bmNfXywKKwkJICAgICAgIG1vdW50X2NyeXB0X3N0YXQtPmdsb2JhbF9kZWZhdWx0X2ZuX2NpcGhlcl9uYW1lLAorCQkgICAgICAgbW91bnRfY3J5cHRfc3RhdC0+Z2xvYmFsX2RlZmF1bHRfZm5fY2lwaGVyX2tleV9ieXRlcyk7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBvdXRfZnJlZV91bmxvY2s7CisJfQorCWRlc3Rbcy0+aSsrXSA9IHMtPmNpcGhlcl9jb2RlOworCXJjID0gZWNyeXB0ZnNfZmluZF9hdXRoX3Rva19mb3Jfc2lnKAorCQkmcy0+YXV0aF90b2ssIG1vdW50X2NyeXB0X3N0YXQsCisJCW1vdW50X2NyeXB0X3N0YXQtPmdsb2JhbF9kZWZhdWx0X2ZuZWtfc2lnKTsKKwlpZiAocmMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogRXJyb3IgYXR0ZW1wdGluZyB0byBmaW5kIGF1dGggdG9rIGZvciAiCisJCSAgICAgICAiZm5layBzaWcgWyVzXTsgcmMgPSBbJWRdXG4iLCBfX2Z1bmNfXywKKwkJICAgICAgIG1vdW50X2NyeXB0X3N0YXQtPmdsb2JhbF9kZWZhdWx0X2ZuZWtfc2lnLCByYyk7CisJCWdvdG8gb3V0X2ZyZWVfdW5sb2NrOworCX0KKwkvKiBUT0RPOiBTdXBwb3J0IG90aGVyIGtleSBtb2R1bGVzIHRoYW4gcGFzc3BocmFzZSBmb3IKKwkgKiBmaWxlbmFtZSBlbmNyeXB0aW9uICovCisJQlVHX09OKHMtPmF1dGhfdG9rLT50b2tlbl90eXBlICE9IEVDUllQVEZTX1BBU1NXT1JEKTsKKwlzZ19pbml0X29uZSgKKwkJJnMtPmhhc2hfc2csCisJCSh1OCAqKXMtPmF1dGhfdG9rLT50b2tlbi5wYXNzd29yZC5zZXNzaW9uX2tleV9lbmNyeXB0aW9uX2tleSwKKwkJcy0+YXV0aF90b2stPnRva2VuLnBhc3N3b3JkLnNlc3Npb25fa2V5X2VuY3J5cHRpb25fa2V5X2J5dGVzKTsKKwlzLT5oYXNoX2Rlc2MuZmxhZ3MgPSBDUllQVE9fVEZNX1JFUV9NQVlfU0xFRVA7CisJcy0+aGFzaF9kZXNjLnRmbSA9IGNyeXB0b19hbGxvY19oYXNoKEVDUllQVEZTX1RBR183MF9ESUdFU1QsIDAsCisJCQkJCSAgICAgQ1JZUFRPX0FMR19BU1lOQyk7CisJaWYgKElTX0VSUihzLT5oYXNoX2Rlc2MudGZtKSkgeworCQkJcmMgPSBQVFJfRVJSKHMtPmhhc2hfZGVzYy50Zm0pOworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogRXJyb3IgYXR0ZW1wdGluZyB0byAiCisJCQkgICAgICAgImFsbG9jYXRlIGhhc2ggY3J5cHRvIGNvbnRleHQ7IHJjID0gWyVkXVxuIiwKKwkJCSAgICAgICBfX2Z1bmNfXywgcmMpOworCQkJZ290byBvdXRfZnJlZV91bmxvY2s7CisJfQorCXJjID0gY3J5cHRvX2hhc2hfaW5pdCgmcy0+aGFzaF9kZXNjKTsKKwlpZiAocmMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCSAgICAgICAiJXM6IEVycm9yIGluaXRpYWxpemluZyBjcnlwdG8gaGFzaDsgcmMgPSBbJWRdXG4iLAorCQkgICAgICAgX19mdW5jX18sIHJjKTsKKwkJZ290byBvdXRfcmVsZWFzZV9mcmVlX3VubG9jazsKKwl9CisJcmMgPSBjcnlwdG9faGFzaF91cGRhdGUoCisJCSZzLT5oYXNoX2Rlc2MsICZzLT5oYXNoX3NnLAorCQlzLT5hdXRoX3Rvay0+dG9rZW4ucGFzc3dvcmQuc2Vzc2lvbl9rZXlfZW5jcnlwdGlvbl9rZXlfYnl0ZXMpOworCWlmIChyYykgeworCQlwcmludGsoS0VSTl9FUlIKKwkJICAgICAgICIlczogRXJyb3IgdXBkYXRpbmcgY3J5cHRvIGhhc2g7IHJjID0gWyVkXVxuIiwKKwkJICAgICAgIF9fZnVuY19fLCByYyk7CisJCWdvdG8gb3V0X3JlbGVhc2VfZnJlZV91bmxvY2s7CisJfQorCXJjID0gY3J5cHRvX2hhc2hfZmluYWwoJnMtPmhhc2hfZGVzYywgcy0+aGFzaCk7CisJaWYgKHJjKSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkgICAgICAgIiVzOiBFcnJvciBmaW5hbGl6aW5nIGNyeXB0byBoYXNoOyByYyA9IFslZF1cbiIsCisJCSAgICAgICBfX2Z1bmNfXywgcmMpOworCQlnb3RvIG91dF9yZWxlYXNlX2ZyZWVfdW5sb2NrOworCX0KKwlmb3IgKHMtPmogPSAwOyBzLT5qIDwgKHMtPm51bV9yYW5kX2J5dGVzIC0gMSk7IHMtPmorKykgeworCQlzLT5ibG9ja19hbGlnbmVkX2ZpbGVuYW1lW3MtPmpdID0KKwkJCXMtPmhhc2hbKHMtPmogJSBFQ1JZUFRGU19UQUdfNzBfRElHRVNUX1NJWkUpXTsKKwkJaWYgKChzLT5qICUgRUNSWVBURlNfVEFHXzcwX0RJR0VTVF9TSVpFKQorCQkgICAgPT0gKEVDUllQVEZTX1RBR183MF9ESUdFU1RfU0laRSAtIDEpKSB7CisJCQlzZ19pbml0X29uZSgmcy0+aGFzaF9zZywgKHU4ICopcy0+aGFzaCwKKwkJCQkgICAgRUNSWVBURlNfVEFHXzcwX0RJR0VTVF9TSVpFKTsKKwkJCXJjID0gY3J5cHRvX2hhc2hfaW5pdCgmcy0+aGFzaF9kZXNjKTsKKwkJCWlmIChyYykgeworCQkJCXByaW50ayhLRVJOX0VSUgorCQkJCSAgICAgICAiJXM6IEVycm9yIGluaXRpYWxpemluZyBjcnlwdG8gaGFzaDsgIgorCQkJCSAgICAgICAicmMgPSBbJWRdXG4iLCBfX2Z1bmNfXywgcmMpOworCQkJCWdvdG8gb3V0X3JlbGVhc2VfZnJlZV91bmxvY2s7CisJCQl9CisJCQlyYyA9IGNyeXB0b19oYXNoX3VwZGF0ZSgmcy0+aGFzaF9kZXNjLCAmcy0+aGFzaF9zZywKKwkJCQkJCUVDUllQVEZTX1RBR183MF9ESUdFU1RfU0laRSk7CisJCQlpZiAocmMpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIKKwkJCQkgICAgICAgIiVzOiBFcnJvciB1cGRhdGluZyBjcnlwdG8gaGFzaDsgIgorCQkJCSAgICAgICAicmMgPSBbJWRdXG4iLCBfX2Z1bmNfXywgcmMpOworCQkJCWdvdG8gb3V0X3JlbGVhc2VfZnJlZV91bmxvY2s7CisJCQl9CisJCQlyYyA9IGNyeXB0b19oYXNoX2ZpbmFsKCZzLT5oYXNoX2Rlc2MsIHMtPnRtcF9oYXNoKTsKKwkJCWlmIChyYykgeworCQkJCXByaW50ayhLRVJOX0VSUgorCQkJCSAgICAgICAiJXM6IEVycm9yIGZpbmFsaXppbmcgY3J5cHRvIGhhc2g7ICIKKwkJCQkgICAgICAgInJjID0gWyVkXVxuIiwgX19mdW5jX18sIHJjKTsKKwkJCQlnb3RvIG91dF9yZWxlYXNlX2ZyZWVfdW5sb2NrOworCQkJfQorCQkJbWVtY3B5KHMtPmhhc2gsIHMtPnRtcF9oYXNoLAorCQkJICAgICAgIEVDUllQVEZTX1RBR183MF9ESUdFU1RfU0laRSk7CisJCX0KKwkJaWYgKHMtPmJsb2NrX2FsaWduZWRfZmlsZW5hbWVbcy0+al0gPT0gJ1wwJykKKwkJCXMtPmJsb2NrX2FsaWduZWRfZmlsZW5hbWVbcy0+al0gPSBFQ1JZUFRGU19OT05fTlVMTDsKKwl9CisJbWVtY3B5KCZzLT5ibG9ja19hbGlnbmVkX2ZpbGVuYW1lW3MtPm51bV9yYW5kX2J5dGVzXSwgZmlsZW5hbWUsCisJICAgICAgIGZpbGVuYW1lX3NpemUpOworCXJjID0gdmlydF90b19zY2F0dGVybGlzdChzLT5ibG9ja19hbGlnbmVkX2ZpbGVuYW1lLAorCQkJCSBzLT5ibG9ja19hbGlnbmVkX2ZpbGVuYW1lX3NpemUsICZzLT5zcmNfc2csIDEpOworCWlmIChyYyAhPSAxKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IEludGVybmFsIGVycm9yIHdoaWxzdCBhdHRlbXB0aW5nIHRvICIKKwkJICAgICAgICJjb252ZXJ0IGZpbGVuYW1lIG1lbW9yeSB0byBzY2F0dGVybGlzdDsgIgorCQkgICAgICAgImV4cGVjdGVkIHJjID0gMTsgZ290IHJjID0gWyVkXS4gIgorCQkgICAgICAgImJsb2NrX2FsaWduZWRfZmlsZW5hbWVfc2l6ZSA9IFslemRdXG4iLCBfX2Z1bmNfXywgcmMsCisJCSAgICAgICBzLT5ibG9ja19hbGlnbmVkX2ZpbGVuYW1lX3NpemUpOworCQlnb3RvIG91dF9yZWxlYXNlX2ZyZWVfdW5sb2NrOworCX0KKwlyYyA9IHZpcnRfdG9fc2NhdHRlcmxpc3QoJmRlc3Rbcy0+aV0sIHMtPmJsb2NrX2FsaWduZWRfZmlsZW5hbWVfc2l6ZSwKKwkJCQkgJnMtPmRzdF9zZywgMSk7CisJaWYgKHJjICE9IDEpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogSW50ZXJuYWwgZXJyb3Igd2hpbHN0IGF0dGVtcHRpbmcgdG8gIgorCQkgICAgICAgImNvbnZlcnQgZW5jcnlwdGVkIGZpbGVuYW1lIG1lbW9yeSB0byBzY2F0dGVybGlzdDsgIgorCQkgICAgICAgImV4cGVjdGVkIHJjID0gMTsgZ290IHJjID0gWyVkXS4gIgorCQkgICAgICAgImJsb2NrX2FsaWduZWRfZmlsZW5hbWVfc2l6ZSA9IFslemRdXG4iLCBfX2Z1bmNfXywgcmMsCisJCSAgICAgICBzLT5ibG9ja19hbGlnbmVkX2ZpbGVuYW1lX3NpemUpOworCQlnb3RvIG91dF9yZWxlYXNlX2ZyZWVfdW5sb2NrOworCX0KKwkvKiBUaGUgY2hhcmFjdGVycyBpbiB0aGUgZmlyc3QgYmxvY2sgZWZmZWN0aXZlbHkgZG8gdGhlIGpvYgorCSAqIG9mIHRoZSBJViBoZXJlLCBzbyB3ZSBqdXN0IHVzZSAwJ3MgZm9yIHRoZSBJVi4gTm90ZSB0aGUKKwkgKiBjb25zdHJhaW50IHRoYXQgRUNSWVBURlNfRklMRU5BTUVfTUlOX1JBTkRPTV9QUkVQRU5EX0JZVEVTCisJICogPj0gRUNSWVBURlNfTUFYX0lWX0JZVEVTLiAqLworCW1lbXNldChzLT5pdiwgMCwgRUNSWVBURlNfTUFYX0lWX0JZVEVTKTsKKwlzLT5kZXNjLmluZm8gPSBzLT5pdjsKKwlyYyA9IGNyeXB0b19ibGtjaXBoZXJfc2V0a2V5KAorCQlzLT5kZXNjLnRmbSwKKwkJcy0+YXV0aF90b2stPnRva2VuLnBhc3N3b3JkLnNlc3Npb25fa2V5X2VuY3J5cHRpb25fa2V5LAorCQltb3VudF9jcnlwdF9zdGF0LT5nbG9iYWxfZGVmYXVsdF9mbl9jaXBoZXJfa2V5X2J5dGVzKTsKKwlpZiAocmMgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IEVycm9yIHNldHRpbmcga2V5IGZvciBjcnlwdG8gY29udGV4dDsgIgorCQkgICAgICAgInJjID0gWyVkXS4gcy0+YXV0aF90b2stPnRva2VuLnBhc3N3b3JkLnNlc3Npb25fa2V5XyIKKwkJICAgICAgICJlbmNyeXB0aW9uX2tleSA9IFsweCVwXTsgbW91bnRfY3J5cHRfc3RhdC0+IgorCQkgICAgICAgImdsb2JhbF9kZWZhdWx0X2ZuX2NpcGhlcl9rZXlfYnl0ZXMgPSBbJXpkXVxuIiwgX19mdW5jX18sCisJCSAgICAgICByYywKKwkJICAgICAgIHMtPmF1dGhfdG9rLT50b2tlbi5wYXNzd29yZC5zZXNzaW9uX2tleV9lbmNyeXB0aW9uX2tleSwKKwkJICAgICAgIG1vdW50X2NyeXB0X3N0YXQtPmdsb2JhbF9kZWZhdWx0X2ZuX2NpcGhlcl9rZXlfYnl0ZXMpOworCQlnb3RvIG91dF9yZWxlYXNlX2ZyZWVfdW5sb2NrOworCX0KKwlyYyA9IGNyeXB0b19ibGtjaXBoZXJfZW5jcnlwdF9pdigmcy0+ZGVzYywgJnMtPmRzdF9zZywgJnMtPnNyY19zZywKKwkJCQkJIHMtPmJsb2NrX2FsaWduZWRfZmlsZW5hbWVfc2l6ZSk7CisJaWYgKHJjKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IEVycm9yIGF0dGVtcHRpbmcgdG8gZW5jcnlwdCBmaWxlbmFtZTsgIgorCQkgICAgICAgInJjID0gWyVkXVxuIiwgX19mdW5jX18sIHJjKTsKKwkJZ290byBvdXRfcmVsZWFzZV9mcmVlX3VubG9jazsKKwl9CisJcy0+aSArPSBzLT5ibG9ja19hbGlnbmVkX2ZpbGVuYW1lX3NpemU7CisJKCpwYWNrZXRfc2l6ZSkgPSBzLT5pOworCSgqcmVtYWluaW5nX2J5dGVzKSAtPSAoKnBhY2tldF9zaXplKTsKK291dF9yZWxlYXNlX2ZyZWVfdW5sb2NrOgorCWNyeXB0b19mcmVlX2hhc2gocy0+aGFzaF9kZXNjLnRmbSk7CitvdXRfZnJlZV91bmxvY2s6CisJbWVtc2V0KHMtPmJsb2NrX2FsaWduZWRfZmlsZW5hbWUsIDAsIHMtPmJsb2NrX2FsaWduZWRfZmlsZW5hbWVfc2l6ZSk7CisJa2ZyZWUocy0+YmxvY2tfYWxpZ25lZF9maWxlbmFtZSk7CitvdXRfdW5sb2NrOgorCW11dGV4X3VubG9jayhzLT50Zm1fbXV0ZXgpOworb3V0OgorCWtmcmVlKHMpOworCXJldHVybiByYzsKK30KKworc3RydWN0IGVjcnlwdGZzX3BhcnNlX3RhZ183MF9wYWNrZXRfc2lsbHlfc3RhY2sgeworCXU4IGNpcGhlcl9jb2RlOworCXNpemVfdCBtYXhfcGFja2V0X3NpemU7CisJc2l6ZV90IHBhY2tldF9zaXplX2xlbjsKKwlzaXplX3QgcGFyc2VkX3RhZ183MF9wYWNrZXRfc2l6ZTsKKwlzaXplX3QgYmxvY2tfYWxpZ25lZF9maWxlbmFtZV9zaXplOworCXNpemVfdCBibG9ja19zaXplOworCXNpemVfdCBpOworCXN0cnVjdCBtdXRleCAqdGZtX211dGV4OworCWNoYXIgKmRlY3J5cHRlZF9maWxlbmFtZTsKKwlzdHJ1Y3QgZWNyeXB0ZnNfYXV0aF90b2sgKmF1dGhfdG9rOworCXN0cnVjdCBzY2F0dGVybGlzdCBzcmNfc2c7CisJc3RydWN0IHNjYXR0ZXJsaXN0IGRzdF9zZzsKKwlzdHJ1Y3QgYmxrY2lwaGVyX2Rlc2MgZGVzYzsKKwljaGFyIGZuZWtfc2lnX2hleFtFQ1JZUFRGU19TSUdfU0laRV9IRVggKyAxXTsKKwljaGFyIGl2W0VDUllQVEZTX01BWF9JVl9CWVRFU107CisJY2hhciBjaXBoZXJfc3RyaW5nW0VDUllQVEZTX01BWF9DSVBIRVJfTkFNRV9TSVpFXTsKK307CisKKy8qKgorICogcGFyc2VfdGFnXzcwX3BhY2tldCAtIFBhcnNlIGFuZCBwcm9jZXNzIEZORUstZW5jcnlwdGVkIHBhc3NwaHJhc2UgcGFja2V0CisgKiBAZmlsZW5hbWU6IFRoaXMgZnVuY3Rpb24ga21hbGxvYydzIHRoZSBtZW1vcnkgZm9yIHRoZSBmaWxlbmFtZQorICogQGZpbGVuYW1lX3NpemU6IFRoaXMgZnVuY3Rpb24gc2V0cyB0aGlzIHRvIHRoZSBhbW91bnQgb2YgbWVtb3J5CisgKiAgICAgICAgICAgICAgICAga21hbGxvYydkIGZvciB0aGUgZmlsZW5hbWUKKyAqIEBwYWNrZXRfc2l6ZTogVGhpcyBmdW5jdGlvbiBzZXRzIHRoaXMgdG8gdGhlIHRoZSBudW1iZXIgb2Ygb2N0ZXRzCisgKiAgICAgICAgICAgICAgIGluIHRoZSBwYWNrZXQgcGFyc2VkCisgKiBAbW91bnRfY3J5cHRfc3RhdDogVGhlIG1vdW50LXdpZGUgY3J5cHRvZ3JhcGhpYyBjb250ZXh0CisgKiBAZGF0YTogVGhlIG1lbW9yeSBsb2NhdGlvbiBjb250YWluaW5nIHRoZSBzdGFydCBvZiB0aGUgdGFnIDcwCisgKiAgICAgICAgcGFja2V0CisgKiBAbWF4X3BhY2tldF9zaXplOiBUaGUgbWF4aW11bSBsZWdhbCBzaXplIG9mIHRoZSBwYWNrZXQgdG8gYmUgcGFyc2VkCisgKiAgICAgICAgICAgICAgICAgICBmcm9tIEBkYXRhCisgKgorICogUmV0dXJucyB6ZXJvIG9uIHN1Y2Nlc3M7IG5vbi16ZXJvIG90aGVyd2lzZQorICovCitpbnQKK2VjcnlwdGZzX3BhcnNlX3RhZ183MF9wYWNrZXQoY2hhciAqKmZpbGVuYW1lLCBzaXplX3QgKmZpbGVuYW1lX3NpemUsCisJCQkgICAgIHNpemVfdCAqcGFja2V0X3NpemUsCisJCQkgICAgIHN0cnVjdCBlY3J5cHRmc19tb3VudF9jcnlwdF9zdGF0ICptb3VudF9jcnlwdF9zdGF0LAorCQkJICAgICBjaGFyICpkYXRhLCBzaXplX3QgbWF4X3BhY2tldF9zaXplKQoreworCXN0cnVjdCBlY3J5cHRmc19wYXJzZV90YWdfNzBfcGFja2V0X3NpbGx5X3N0YWNrICpzOworCWludCByYyA9IDA7CisKKwkoKnBhY2tldF9zaXplKSA9IDA7CisJKCpmaWxlbmFtZV9zaXplKSA9IDA7CisJKCpmaWxlbmFtZSkgPSBOVUxMOworCXMgPSBrbWFsbG9jKHNpemVvZigqcyksIEdGUF9LRVJORUwpOworCWlmICghcykgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBPdXQgb2YgbWVtb3J5IHdoaWxzdCB0cnlpbmcgdG8ga21hbGxvYyAiCisJCSAgICAgICAiWyV6ZF0gYnl0ZXMgb2Yga2VybmVsIG1lbW9yeVxuIiwgX19mdW5jX18sIHNpemVvZigqcykpOworCQlnb3RvIG91dDsKKwl9CisJcy0+ZGVzYy5mbGFncyA9IENSWVBUT19URk1fUkVRX01BWV9TTEVFUDsKKwlpZiAobWF4X3BhY2tldF9zaXplIDwgKDEgKyAxICsgRUNSWVBURlNfU0lHX1NJWkUgKyAxICsgMSkpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IG1heF9wYWNrZXRfc2l6ZSBpcyBbJXpkXTsgaXQgbXVzdCBiZSAiCisJCSAgICAgICAiYXQgbGVhc3QgWyVkXVxuIiwgX19mdW5jX18sIG1heF9wYWNrZXRfc2l6ZSwKKwkJCSgxICsgMSArIEVDUllQVEZTX1NJR19TSVpFICsgMSArIDEpKTsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisJLyogT2N0ZXQgMDogVGFnIDcwIGlkZW50aWZpZXIKKwkgKiBPY3RldHMgMS1OMTogVGFnIDcwIHBhY2tldCBzaXplIChpbmNsdWRlcyBjaXBoZXIgaWRlbnRpZmllcgorCSAqICAgICAgICAgICAgICBhbmQgYmxvY2stYWxpZ25lZCBlbmNyeXB0ZWQgZmlsZW5hbWUgc2l6ZSkKKwkgKiBPY3RldHMgTjEtTjI6IEZORUsgc2lnIChFQ1JZUFRGU19TSUdfU0laRSkKKwkgKiBPY3RldCBOMi1OMzogQ2lwaGVyIGlkZW50aWZpZXIgKDEgb2N0ZXQpCisJICogT2N0ZXRzIE4zLU40OiBCbG9jay1hbGlnbmVkIGVuY3J5cHRlZCBmaWxlbmFtZQorCSAqICAtIENvbnNpc3RzIG9mIGEgbWluaW11bSBudW1iZXIgb2YgcmFuZG9tIG51bWJlcnMsIGEgXDAKKwkgKiAgICBzZXBhcmF0b3IsIGFuZCB0aGVuIHRoZSBmaWxlbmFtZSAqLworCWlmIChkYXRhWygqcGFja2V0X3NpemUpKytdICE9IEVDUllQVEZTX1RBR183MF9QQUNLRVRfVFlQRSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogSW52YWxpZCBwYWNrZXQgdGFnIFsweCUuMnhdOyBtdXN0IGJlICIKKwkJICAgICAgICJ0YWcgWzB4JS4yeF1cbiIsIF9fZnVuY19fLAorCQkgICAgICAgZGF0YVsoKCpwYWNrZXRfc2l6ZSkgLSAxKV0sIEVDUllQVEZTX1RBR183MF9QQUNLRVRfVFlQRSk7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCXJjID0gZWNyeXB0ZnNfcGFyc2VfcGFja2V0X2xlbmd0aCgmZGF0YVsoKnBhY2tldF9zaXplKV0sCisJCQkJCSAgJnMtPnBhcnNlZF90YWdfNzBfcGFja2V0X3NpemUsCisJCQkJCSAgJnMtPnBhY2tldF9zaXplX2xlbik7CisJaWYgKHJjKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBFcnJvciBwYXJzaW5nIHBhY2tldCBsZW5ndGg7ICIKKwkJICAgICAgICJyYyA9IFslZF1cbiIsIF9fZnVuY19fLCByYyk7CisJCWdvdG8gb3V0OworCX0KKwlzLT5ibG9ja19hbGlnbmVkX2ZpbGVuYW1lX3NpemUgPSAocy0+cGFyc2VkX3RhZ183MF9wYWNrZXRfc2l6ZQorCQkJCQkgIC0gRUNSWVBURlNfU0lHX1NJWkUgLSAxKTsKKwlpZiAoKDEgKyBzLT5wYWNrZXRfc2l6ZV9sZW4gKyBzLT5wYXJzZWRfdGFnXzcwX3BhY2tldF9zaXplKQorCSAgICA+IG1heF9wYWNrZXRfc2l6ZSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogbWF4X3BhY2tldF9zaXplIGlzIFslemRdOyByZWFsIHBhY2tldCAiCisJCSAgICAgICAic2l6ZSBpcyBbJXpkXVxuIiwgX19mdW5jX18sIG1heF9wYWNrZXRfc2l6ZSwKKwkJICAgICAgICgxICsgcy0+cGFja2V0X3NpemVfbGVuICsgMQorCQkJKyBzLT5ibG9ja19hbGlnbmVkX2ZpbGVuYW1lX3NpemUpKTsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisJKCpwYWNrZXRfc2l6ZSkgKz0gcy0+cGFja2V0X3NpemVfbGVuOworCWVjcnlwdGZzX3RvX2hleChzLT5mbmVrX3NpZ19oZXgsICZkYXRhWygqcGFja2V0X3NpemUpXSwKKwkJCUVDUllQVEZTX1NJR19TSVpFKTsKKwlzLT5mbmVrX3NpZ19oZXhbRUNSWVBURlNfU0lHX1NJWkVfSEVYXSA9ICdcMCc7CisJKCpwYWNrZXRfc2l6ZSkgKz0gRUNSWVBURlNfU0lHX1NJWkU7CisJcy0+Y2lwaGVyX2NvZGUgPSBkYXRhWygqcGFja2V0X3NpemUpKytdOworCXJjID0gZWNyeXB0ZnNfY2lwaGVyX2NvZGVfdG9fc3RyaW5nKHMtPmNpcGhlcl9zdHJpbmcsIHMtPmNpcGhlcl9jb2RlKTsKKwlpZiAocmMpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IENpcGhlciBjb2RlIFslZF0gaXMgaW52YWxpZFxuIiwKKwkJICAgICAgIF9fZnVuY19fLCBzLT5jaXBoZXJfY29kZSk7CisJCWdvdG8gb3V0OworCX0KKwlyYyA9IGVjcnlwdGZzX2dldF90Zm1fYW5kX211dGV4X2Zvcl9jaXBoZXJfbmFtZSgmcy0+ZGVzYy50Zm0sCisJCQkJCQkJJnMtPnRmbV9tdXRleCwKKwkJCQkJCQlzLT5jaXBoZXJfc3RyaW5nKTsKKwlpZiAodW5saWtlbHkocmMpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiSW50ZXJuYWwgZXJyb3Igd2hpbHN0IGF0dGVtcHRpbmcgdG8gZ2V0ICIKKwkJICAgICAgICJ0Zm0gYW5kIG11dGV4IGZvciBjaXBoZXIgbmFtZSBbJXNdOyByYyA9IFslZF1cbiIsCisJCSAgICAgICBzLT5jaXBoZXJfc3RyaW5nLCByYyk7CisJCWdvdG8gb3V0OworCX0KKwltdXRleF9sb2NrKHMtPnRmbV9tdXRleCk7CisJcmMgPSB2aXJ0X3RvX3NjYXR0ZXJsaXN0KCZkYXRhWygqcGFja2V0X3NpemUpXSwKKwkJCQkgcy0+YmxvY2tfYWxpZ25lZF9maWxlbmFtZV9zaXplLCAmcy0+c3JjX3NnLCAxKTsKKwlpZiAocmMgIT0gMSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBJbnRlcm5hbCBlcnJvciB3aGlsc3QgYXR0ZW1wdGluZyB0byAiCisJCSAgICAgICAiY29udmVydCBlbmNyeXB0ZWQgZmlsZW5hbWUgbWVtb3J5IHRvIHNjYXR0ZXJsaXN0OyAiCisJCSAgICAgICAiZXhwZWN0ZWQgcmMgPSAxOyBnb3QgcmMgPSBbJWRdLiAiCisJCSAgICAgICAiYmxvY2tfYWxpZ25lZF9maWxlbmFtZV9zaXplID0gWyV6ZF1cbiIsIF9fZnVuY19fLCByYywKKwkJICAgICAgIHMtPmJsb2NrX2FsaWduZWRfZmlsZW5hbWVfc2l6ZSk7CisJCWdvdG8gb3V0X3VubG9jazsKKwl9CisJKCpwYWNrZXRfc2l6ZSkgKz0gcy0+YmxvY2tfYWxpZ25lZF9maWxlbmFtZV9zaXplOworCXMtPmRlY3J5cHRlZF9maWxlbmFtZSA9IGttYWxsb2Mocy0+YmxvY2tfYWxpZ25lZF9maWxlbmFtZV9zaXplLAorCQkJCQlHRlBfS0VSTkVMKTsKKwlpZiAoIXMtPmRlY3J5cHRlZF9maWxlbmFtZSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBPdXQgb2YgbWVtb3J5IHdoaWxzdCBhdHRlbXB0aW5nIHRvICIKKwkJICAgICAgICJrbWFsbG9jIFslemRdIGJ5dGVzXG4iLCBfX2Z1bmNfXywKKwkJICAgICAgIHMtPmJsb2NrX2FsaWduZWRfZmlsZW5hbWVfc2l6ZSk7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBvdXRfdW5sb2NrOworCX0KKwlyYyA9IHZpcnRfdG9fc2NhdHRlcmxpc3Qocy0+ZGVjcnlwdGVkX2ZpbGVuYW1lLAorCQkJCSBzLT5ibG9ja19hbGlnbmVkX2ZpbGVuYW1lX3NpemUsICZzLT5kc3Rfc2csIDEpOworCWlmIChyYyAhPSAxKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IEludGVybmFsIGVycm9yIHdoaWxzdCBhdHRlbXB0aW5nIHRvICIKKwkJICAgICAgICJjb252ZXJ0IGRlY3J5cHRlZCBmaWxlbmFtZSBtZW1vcnkgdG8gc2NhdHRlcmxpc3Q7ICIKKwkJICAgICAgICJleHBlY3RlZCByYyA9IDE7IGdvdCByYyA9IFslZF0uICIKKwkJICAgICAgICJibG9ja19hbGlnbmVkX2ZpbGVuYW1lX3NpemUgPSBbJXpkXVxuIiwgX19mdW5jX18sIHJjLAorCQkgICAgICAgcy0+YmxvY2tfYWxpZ25lZF9maWxlbmFtZV9zaXplKTsKKwkJZ290byBvdXRfZnJlZV91bmxvY2s7CisJfQorCS8qIFRoZSBjaGFyYWN0ZXJzIGluIHRoZSBmaXJzdCBibG9jayBlZmZlY3RpdmVseSBkbyB0aGUgam9iIG9mCisJICogdGhlIElWIGhlcmUsIHNvIHdlIGp1c3QgdXNlIDAncyBmb3IgdGhlIElWLiBOb3RlIHRoZQorCSAqIGNvbnN0cmFpbnQgdGhhdCBFQ1JZUFRGU19GSUxFTkFNRV9NSU5fUkFORE9NX1BSRVBFTkRfQllURVMKKwkgKiA+PSBFQ1JZUFRGU19NQVhfSVZfQllURVMuICovCisJbWVtc2V0KHMtPml2LCAwLCBFQ1JZUFRGU19NQVhfSVZfQllURVMpOworCXMtPmRlc2MuaW5mbyA9IHMtPml2OworCXJjID0gZWNyeXB0ZnNfZmluZF9hdXRoX3Rva19mb3Jfc2lnKCZzLT5hdXRoX3RvaywgbW91bnRfY3J5cHRfc3RhdCwKKwkJCQkJICAgIHMtPmZuZWtfc2lnX2hleCk7CisJaWYgKHJjKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IEVycm9yIGF0dGVtcHRpbmcgdG8gZmluZCBhdXRoIHRvayBmb3IgIgorCQkgICAgICAgImZuZWsgc2lnIFslc107IHJjID0gWyVkXVxuIiwgX19mdW5jX18sIHMtPmZuZWtfc2lnX2hleCwKKwkJICAgICAgIHJjKTsKKwkJZ290byBvdXRfZnJlZV91bmxvY2s7CisJfQorCS8qIFRPRE86IFN1cHBvcnQgb3RoZXIga2V5IG1vZHVsZXMgdGhhbiBwYXNzcGhyYXNlIGZvcgorCSAqIGZpbGVuYW1lIGVuY3J5cHRpb24gKi8KKwlCVUdfT04ocy0+YXV0aF90b2stPnRva2VuX3R5cGUgIT0gRUNSWVBURlNfUEFTU1dPUkQpOworCXJjID0gY3J5cHRvX2Jsa2NpcGhlcl9zZXRrZXkoCisJCXMtPmRlc2MudGZtLAorCQlzLT5hdXRoX3Rvay0+dG9rZW4ucGFzc3dvcmQuc2Vzc2lvbl9rZXlfZW5jcnlwdGlvbl9rZXksCisJCW1vdW50X2NyeXB0X3N0YXQtPmdsb2JhbF9kZWZhdWx0X2ZuX2NpcGhlcl9rZXlfYnl0ZXMpOworCWlmIChyYyA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogRXJyb3Igc2V0dGluZyBrZXkgZm9yIGNyeXB0byBjb250ZXh0OyAiCisJCSAgICAgICAicmMgPSBbJWRdLiBzLT5hdXRoX3Rvay0+dG9rZW4ucGFzc3dvcmQuc2Vzc2lvbl9rZXlfIgorCQkgICAgICAgImVuY3J5cHRpb25fa2V5ID0gWzB4JXBdOyBtb3VudF9jcnlwdF9zdGF0LT4iCisJCSAgICAgICAiZ2xvYmFsX2RlZmF1bHRfZm5fY2lwaGVyX2tleV9ieXRlcyA9IFslemRdXG4iLCBfX2Z1bmNfXywKKwkJICAgICAgIHJjLAorCQkgICAgICAgcy0+YXV0aF90b2stPnRva2VuLnBhc3N3b3JkLnNlc3Npb25fa2V5X2VuY3J5cHRpb25fa2V5LAorCQkgICAgICAgbW91bnRfY3J5cHRfc3RhdC0+Z2xvYmFsX2RlZmF1bHRfZm5fY2lwaGVyX2tleV9ieXRlcyk7CisJCWdvdG8gb3V0X2ZyZWVfdW5sb2NrOworCX0KKwlyYyA9IGNyeXB0b19ibGtjaXBoZXJfZGVjcnlwdF9pdigmcy0+ZGVzYywgJnMtPmRzdF9zZywgJnMtPnNyY19zZywKKwkJCQkJIHMtPmJsb2NrX2FsaWduZWRfZmlsZW5hbWVfc2l6ZSk7CisJaWYgKHJjKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IEVycm9yIGF0dGVtcHRpbmcgdG8gZGVjcnlwdCBmaWxlbmFtZTsgIgorCQkgICAgICAgInJjID0gWyVkXVxuIiwgX19mdW5jX18sIHJjKTsKKwkJZ290byBvdXRfZnJlZV91bmxvY2s7CisJfQorCXMtPmkgPSAwOworCXdoaWxlIChzLT5kZWNyeXB0ZWRfZmlsZW5hbWVbcy0+aV0gIT0gJ1wwJworCSAgICAgICAmJiBzLT5pIDwgcy0+YmxvY2tfYWxpZ25lZF9maWxlbmFtZV9zaXplKQorCQlzLT5pKys7CisJaWYgKHMtPmkgPT0gcy0+YmxvY2tfYWxpZ25lZF9maWxlbmFtZV9zaXplKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBJbnZhbGlkIHRhZyA3MCBwYWNrZXQ7IGNvdWxkIG5vdCAiCisJCSAgICAgICAiZmluZCB2YWxpZCBzZXBhcmF0b3IgYmV0d2VlbiByYW5kb20gY2hhcmFjdGVycyBhbmQgIgorCQkgICAgICAgInRoZSBmaWxlbmFtZVxuIiwgX19mdW5jX18pOworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gb3V0X2ZyZWVfdW5sb2NrOworCX0KKwlzLT5pKys7CisJKCpmaWxlbmFtZV9zaXplKSA9IChzLT5ibG9ja19hbGlnbmVkX2ZpbGVuYW1lX3NpemUgLSBzLT5pKTsKKwlpZiAoISgoKmZpbGVuYW1lX3NpemUpID4gMCAmJiAoKmZpbGVuYW1lX3NpemUgPCBQQVRIX01BWCkpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBGaWxlbmFtZSBzaXplIGlzIFslemRdLCB3aGljaCBpcyAiCisJCSAgICAgICAiaW52YWxpZFxuIiwgX19mdW5jX18sICgqZmlsZW5hbWVfc2l6ZSkpOworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gb3V0X2ZyZWVfdW5sb2NrOworCX0KKwkoKmZpbGVuYW1lKSA9IGttYWxsb2MoKCgqZmlsZW5hbWVfc2l6ZSkgKyAxKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCEoKmZpbGVuYW1lKSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBPdXQgb2YgbWVtb3J5IHdoaWxzdCBhdHRlbXB0aW5nIHRvICIKKwkJICAgICAgICJrbWFsbG9jIFslemRdIGJ5dGVzXG4iLCBfX2Z1bmNfXywKKwkJICAgICAgICgoKmZpbGVuYW1lX3NpemUpICsgMSkpOworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gb3V0X2ZyZWVfdW5sb2NrOworCX0KKwltZW1jcHkoKCpmaWxlbmFtZSksICZzLT5kZWNyeXB0ZWRfZmlsZW5hbWVbcy0+aV0sICgqZmlsZW5hbWVfc2l6ZSkpOworCSgqZmlsZW5hbWUpWygqZmlsZW5hbWVfc2l6ZSldID0gJ1wwJzsKK291dF9mcmVlX3VubG9jazoKKwlrZnJlZShzLT5kZWNyeXB0ZWRfZmlsZW5hbWUpOworb3V0X3VubG9jazoKKwltdXRleF91bmxvY2socy0+dGZtX211dGV4KTsKK291dDoKKwlpZiAocmMpIHsKKwkJKCpwYWNrZXRfc2l6ZSkgPSAwOworCQkoKmZpbGVuYW1lX3NpemUpID0gMDsKKwkJKCpmaWxlbmFtZSkgPSBOVUxMOworCX0KKwlrZnJlZShzKTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQKIGVjcnlwdGZzX2dldF9hdXRoX3Rva19zaWcoY2hhciAqKnNpZywgc3RydWN0IGVjcnlwdGZzX2F1dGhfdG9rICphdXRoX3RvaykKIHsKIAlpbnQgcmMgPSAwOwpAQCAtODk3LDMwICsxNDcxLDYgQEAKIAlyZXR1cm4gcmM7CiB9CiAKLXN0YXRpYyBpbnQKLWVjcnlwdGZzX2ZpbmRfZ2xvYmFsX2F1dGhfdG9rX2Zvcl9zaWcoCi0Jc3RydWN0IGVjcnlwdGZzX2dsb2JhbF9hdXRoX3RvayAqKmdsb2JhbF9hdXRoX3RvaywKLQlzdHJ1Y3QgZWNyeXB0ZnNfbW91bnRfY3J5cHRfc3RhdCAqbW91bnRfY3J5cHRfc3RhdCwgY2hhciAqc2lnKQotewotCXN0cnVjdCBlY3J5cHRmc19nbG9iYWxfYXV0aF90b2sgKndhbGtlcjsKLQlpbnQgcmMgPSAwOwotCi0JKCpnbG9iYWxfYXV0aF90b2spID0gTlVMTDsKLQltdXRleF9sb2NrKCZtb3VudF9jcnlwdF9zdGF0LT5nbG9iYWxfYXV0aF90b2tfbGlzdF9tdXRleCk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeSh3YWxrZXIsCi0JCQkgICAgJm1vdW50X2NyeXB0X3N0YXQtPmdsb2JhbF9hdXRoX3Rva19saXN0LAotCQkJICAgIG1vdW50X2NyeXB0X3N0YXRfbGlzdCkgewotCQlpZiAobWVtY21wKHdhbGtlci0+c2lnLCBzaWcsIEVDUllQVEZTX1NJR19TSVpFX0hFWCkgPT0gMCkgewotCQkJKCpnbG9iYWxfYXV0aF90b2spID0gd2Fsa2VyOwotCQkJZ290byBvdXQ7Ci0JCX0KLQl9Ci0JcmMgPSAtRUlOVkFMOwotb3V0OgotCW11dGV4X3VubG9jaygmbW91bnRfY3J5cHRfc3RhdC0+Z2xvYmFsX2F1dGhfdG9rX2xpc3RfbXV0ZXgpOwotCXJldHVybiByYzsKLX0KLQogLyoqCiAgKiBlY3J5cHRmc192ZXJpZnlfdmVyc2lvbgogICogQHZlcnNpb246IFRoZSB2ZXJzaW9uIG51bWJlciB0byBjb25maXJtCkBAIC05OTAsNDMgKzE1NDAsNiBAQAogfQogCiAvKioKLSAqIGVjcnlwdGZzX2ZpbmRfYXV0aF90b2tfZm9yX3NpZwotICogQGF1dGhfdG9rOiBTZXQgdG8gdGhlIG1hdGNoaW5nIGF1dGhfdG9rOyBOVUxMIGlmIG5vdCBmb3VuZAotICogQGNyeXB0X3N0YXQ6IGlub2RlIGNyeXB0X3N0YXQgY3J5cHRvIGNvbnRleHQKLSAqIEBzaWc6IFNpZyBvZiBhdXRoX3RvayB0byBmaW5kCi0gKgotICogRm9yIG5vdywgdGhpcyBmdW5jdGlvbiBzaW1wbHkgbG9va3MgYXQgdGhlIHJlZ2lzdGVyZWQgYXV0aF90b2sncwotICogbGlua2VkIG9mZiB0aGUgbW91bnRfY3J5cHRfc3RhdCwgc28gYWxsIHRoZSBhdXRoX3Rva3MgdGhhdCBjYW4gYmUKLSAqIHVzZWQgbXVzdCBiZSByZWdpc3RlcmVkIGF0IG1vdW50IHRpbWUuIFRoaXMgZnVuY3Rpb24gY291bGQKLSAqIHBvdGVudGlhbGx5IHRyeSBhIGxvdCBoYXJkZXIgdG8gZmluZCBhdXRoX3RvaydzIChlLmcuLCBieSBjYWxsaW5nCi0gKiBvdXQgdG8gZWNyeXB0ZnNkIHRvIGR5bmFtaWNhbGx5IHJldHJpZXZlIGFuIGF1dGhfdG9rIG9iamVjdCkgc28KLSAqIHRoYXQgc3RhdGljIHJlZ2lzdHJhdGlvbiBvZiBhdXRoX3RvaydzIHdpbGwgbm8gbG9uZ2VyIGJlIG5lY2Vzc2FyeS4KLSAqCi0gKiBSZXR1cm5zIHplcm8gb24gbm8gZXJyb3I7IG5vbi16ZXJvIG9uIGVycm9yCi0gKi8KLXN0YXRpYyBpbnQKLWVjcnlwdGZzX2ZpbmRfYXV0aF90b2tfZm9yX3NpZygKLQlzdHJ1Y3QgZWNyeXB0ZnNfYXV0aF90b2sgKiphdXRoX3RvaywKLQlzdHJ1Y3QgZWNyeXB0ZnNfY3J5cHRfc3RhdCAqY3J5cHRfc3RhdCwgY2hhciAqc2lnKQotewotCXN0cnVjdCBlY3J5cHRmc19tb3VudF9jcnlwdF9zdGF0ICptb3VudF9jcnlwdF9zdGF0ID0KLQkJY3J5cHRfc3RhdC0+bW91bnRfY3J5cHRfc3RhdDsKLQlzdHJ1Y3QgZWNyeXB0ZnNfZ2xvYmFsX2F1dGhfdG9rICpnbG9iYWxfYXV0aF90b2s7Ci0JaW50IHJjID0gMDsKLQotCSgqYXV0aF90b2spID0gTlVMTDsKLQlpZiAoZWNyeXB0ZnNfZmluZF9nbG9iYWxfYXV0aF90b2tfZm9yX3NpZygmZ2xvYmFsX2F1dGhfdG9rLAotCQkJCQkJICBtb3VudF9jcnlwdF9zdGF0LCBzaWcpKSB7Ci0JCXN0cnVjdCBrZXkgKmF1dGhfdG9rX2tleTsKLQotCQlyYyA9IGVjcnlwdGZzX2tleXJpbmdfYXV0aF90b2tfZm9yX3NpZygmYXV0aF90b2tfa2V5LCBhdXRoX3RvaywKLQkJCQkJCSAgICAgICBzaWcpOwotCX0gZWxzZQotCQkoKmF1dGhfdG9rKSA9IGdsb2JhbF9hdXRoX3Rvay0+Z2xvYmFsX2F1dGhfdG9rOwotCXJldHVybiByYzsKLX0KLQotLyoqCiAgKiBkZWNyeXB0X3Bhc3NwaHJhc2VfZW5jcnlwdGVkX3Nlc3Npb25fa2V5IC0gRGVjcnlwdCB0aGUgc2Vzc2lvbiBrZXkgd2l0aCB0aGUgZ2l2ZW4gYXV0aF90b2suCiAgKiBAYXV0aF90b2s6IFRoZSBwYXNzcGhyYXNlIGF1dGhlbnRpY2F0aW9uIHRva2VuIHRvIHVzZSB0byBlbmNyeXB0IHRoZSBGRUsKICAqIEBjcnlwdF9zdGF0OiBUaGUgY3J5cHRvZ3JhcGhpYyBjb250ZXh0CkBAIC0xMjU2LDcgKzE3NjksOCBAQAogCQkJcmMgPSAtRUlOVkFMOwogCQkJZ290byBvdXRfd2lwZV9saXN0OwogCQl9Ci0JCWVjcnlwdGZzX2ZpbmRfYXV0aF90b2tfZm9yX3NpZygmbWF0Y2hpbmdfYXV0aF90b2ssIGNyeXB0X3N0YXQsCisJCWVjcnlwdGZzX2ZpbmRfYXV0aF90b2tfZm9yX3NpZygmbWF0Y2hpbmdfYXV0aF90b2ssCisJCQkJCSAgICAgICBjcnlwdF9zdGF0LT5tb3VudF9jcnlwdF9zdGF0LAogCQkJCQkgICAgICAgY2FuZGlkYXRlX2F1dGhfdG9rX3NpZyk7CiAJCWlmIChtYXRjaGluZ19hdXRoX3RvaykgewogCQkJZm91bmRfYXV0aF90b2sgPSAxOwpAQCAtMTMzNiw3ICsxODUwLDkgQEAKIAlpbnQgcmM7CiAKIAlyYyA9IHdyaXRlX3RhZ182Nl9wYWNrZXQoYXV0aF90b2stPnRva2VuLnByaXZhdGVfa2V5LnNpZ25hdHVyZSwKLQkJCQkgZWNyeXB0ZnNfY29kZV9mb3JfY2lwaGVyX3N0cmluZyhjcnlwdF9zdGF0KSwKKwkJCQkgZWNyeXB0ZnNfY29kZV9mb3JfY2lwaGVyX3N0cmluZygKKwkJCQkJIGNyeXB0X3N0YXQtPmNpcGhlciwKKwkJCQkJIGNyeXB0X3N0YXQtPmtleV9zaXplKSwKIAkJCQkgY3J5cHRfc3RhdCwgJnBheWxvYWQsICZwYXlsb2FkX2xlbik7CiAJaWYgKHJjKSB7CiAJCWVjcnlwdGZzX3ByaW50ayhLRVJOX0VSUiwgIkVycm9yIGdlbmVyYXRpbmcgdGFnIDY2IHBhY2tldFxuIik7CkBAIC0xNjk2LDcgKzIyMTIsOCBAQAogCWRlc3RbKCpwYWNrZXRfc2l6ZSkrK10gPSAweDA0OyAvKiB2ZXJzaW9uIDQgKi8KIAkvKiBUT0RPOiBCcmVhayBmcm9tIFJGQzI0NDAgc28gdGhhdCBhcmJpdHJhcnkgY2lwaGVycyBjYW4gYmUKIAkgKiBzcGVjaWZpZWQgd2l0aCBzdHJpbmdzICovCi0JY2lwaGVyX2NvZGUgPSBlY3J5cHRmc19jb2RlX2Zvcl9jaXBoZXJfc3RyaW5nKGNyeXB0X3N0YXQpOworCWNpcGhlcl9jb2RlID0gZWNyeXB0ZnNfY29kZV9mb3JfY2lwaGVyX3N0cmluZyhjcnlwdF9zdGF0LT5jaXBoZXIsCisJCQkJCQkgICAgICBjcnlwdF9zdGF0LT5rZXlfc2l6ZSk7CiAJaWYgKGNpcGhlcl9jb2RlID09IDApIHsKIAkJZWNyeXB0ZnNfcHJpbnRrKEtFUk5fV0FSTklORywgIlVuYWJsZSB0byBnZW5lcmF0ZSBjb2RlIGZvciAiCiAJCQkJImNpcGhlciBbJXNdXG4iLCBjcnlwdF9zdGF0LT5jaXBoZXIpOwpkaWZmIC0tZ2l0IGEvZnMvZWNyeXB0ZnMvbWFpbi5jIGIvZnMvZWNyeXB0ZnMvbWFpbi5jCmluZGV4IGZkNjMwNzEuLjc4OWNmMmUgMTAwNjQ0Ci0tLSBhL2ZzL2VjcnlwdGZzL21haW4uYworKysgYi9mcy9lY3J5cHRmcy9tYWluLmMKQEAgLTIwNiw3ICsyMDYsOSBAQAogICAgICAgIGVjcnlwdGZzX29wdF9jaXBoZXIsIGVjcnlwdGZzX29wdF9lY3J5cHRmc19jaXBoZXIsCiAgICAgICAgZWNyeXB0ZnNfb3B0X2VjcnlwdGZzX2tleV9ieXRlcywKICAgICAgICBlY3J5cHRmc19vcHRfcGFzc3Rocm91Z2gsIGVjcnlwdGZzX29wdF94YXR0cl9tZXRhZGF0YSwKLSAgICAgICBlY3J5cHRmc19vcHRfZW5jcnlwdGVkX3ZpZXcsIGVjcnlwdGZzX29wdF9lcnIgfTsKKyAgICAgICBlY3J5cHRmc19vcHRfZW5jcnlwdGVkX3ZpZXcsIGVjcnlwdGZzX29wdF9mbmVrX3NpZywKKyAgICAgICBlY3J5cHRmc19vcHRfZm5fY2lwaGVyLCBlY3J5cHRmc19vcHRfZm5fY2lwaGVyX2tleV9ieXRlcywKKyAgICAgICBlY3J5cHRmc19vcHRfZXJyIH07CiAKIHN0YXRpYyBjb25zdCBtYXRjaF90YWJsZV90IHRva2VucyA9IHsKIAl7ZWNyeXB0ZnNfb3B0X3NpZywgInNpZz0lcyJ9LApAQCAtMjE3LDYgKzIxOSw5IEBACiAJe2VjcnlwdGZzX29wdF9wYXNzdGhyb3VnaCwgImVjcnlwdGZzX3Bhc3N0aHJvdWdoIn0sCiAJe2VjcnlwdGZzX29wdF94YXR0cl9tZXRhZGF0YSwgImVjcnlwdGZzX3hhdHRyX21ldGFkYXRhIn0sCiAJe2VjcnlwdGZzX29wdF9lbmNyeXB0ZWRfdmlldywgImVjcnlwdGZzX2VuY3J5cHRlZF92aWV3In0sCisJe2VjcnlwdGZzX29wdF9mbmVrX3NpZywgImVjcnlwdGZzX2ZuZWtfc2lnPSVzIn0sCisJe2VjcnlwdGZzX29wdF9mbl9jaXBoZXIsICJlY3J5cHRmc19mbl9jaXBoZXI9JXMifSwKKwl7ZWNyeXB0ZnNfb3B0X2ZuX2NpcGhlcl9rZXlfYnl0ZXMsICJlY3J5cHRmc19mbl9rZXlfYnl0ZXM9JXUifSwKIAl7ZWNyeXB0ZnNfb3B0X2VyciwgTlVMTH0KIH07CiAKQEAgLTI4MSw4ICsyODYsMTEgQEAKIAlpbnQgcmMgPSAwOwogCWludCBzaWdfc2V0ID0gMDsKIAlpbnQgY2lwaGVyX25hbWVfc2V0ID0gMDsKKwlpbnQgZm5fY2lwaGVyX25hbWVfc2V0ID0gMDsKIAlpbnQgY2lwaGVyX2tleV9ieXRlczsKIAlpbnQgY2lwaGVyX2tleV9ieXRlc19zZXQgPSAwOworCWludCBmbl9jaXBoZXJfa2V5X2J5dGVzOworCWludCBmbl9jaXBoZXJfa2V5X2J5dGVzX3NldCA9IDA7CiAJc3RydWN0IGVjcnlwdGZzX21vdW50X2NyeXB0X3N0YXQgKm1vdW50X2NyeXB0X3N0YXQgPQogCQkmZWNyeXB0ZnNfc3VwZXJibG9ja190b19wcml2YXRlKHNiKS0+bW91bnRfY3J5cHRfc3RhdDsKIAlzdWJzdHJpbmdfdCBhcmdzW01BWF9PUFRfQVJHU107CkBAIC0yOTAsNyArMjk4LDEyIEBACiAJY2hhciAqc2lnX3NyYzsKIAljaGFyICpjaXBoZXJfbmFtZV9kc3Q7CiAJY2hhciAqY2lwaGVyX25hbWVfc3JjOworCWNoYXIgKmZuX2NpcGhlcl9uYW1lX2RzdDsKKwljaGFyICpmbl9jaXBoZXJfbmFtZV9zcmM7CisJY2hhciAqZm5la19kc3Q7CisJY2hhciAqZm5la19zcmM7CiAJY2hhciAqY2lwaGVyX2tleV9ieXRlc19zcmM7CisJY2hhciAqZm5fY2lwaGVyX2tleV9ieXRlc19zcmM7CiAKIAlpZiAoIW9wdGlvbnMpIHsKIAkJcmMgPSAtRUlOVkFMOwpAQCAtMzIyLDEwICszMzUsNyBAQAogCQkJCWdsb2JhbF9kZWZhdWx0X2NpcGhlcl9uYW1lOwogCQkJc3RybmNweShjaXBoZXJfbmFtZV9kc3QsIGNpcGhlcl9uYW1lX3NyYywKIAkJCQlFQ1JZUFRGU19NQVhfQ0lQSEVSX05BTUVfU0laRSk7Ci0JCQllY3J5cHRmc19wcmludGsoS0VSTl9ERUJVRywKLQkJCQkJIlRoZSBtb3VudF9jcnlwdF9zdGF0ICIKLQkJCQkJImdsb2JhbF9kZWZhdWx0X2NpcGhlcl9uYW1lIHNldCB0bzogIgotCQkJCQkiWyVzXVxuIiwgY2lwaGVyX25hbWVfZHN0KTsKKwkJCWNpcGhlcl9uYW1lX2RzdFtFQ1JZUFRGU19NQVhfQ0lQSEVSX05BTUVfU0laRV0gPSAnXDAnOwogCQkJY2lwaGVyX25hbWVfc2V0ID0gMTsKIAkJCWJyZWFrOwogCQljYXNlIGVjcnlwdGZzX29wdF9lY3J5cHRmc19rZXlfYnl0ZXM6CkBAIC0zMzUsMTEgKzM0NSw2IEBACiAJCQkJCQkgICAmY2lwaGVyX2tleV9ieXRlc19zcmMsIDApOwogCQkJbW91bnRfY3J5cHRfc3RhdC0+Z2xvYmFsX2RlZmF1bHRfY2lwaGVyX2tleV9zaXplID0KIAkJCQljaXBoZXJfa2V5X2J5dGVzOwotCQkJZWNyeXB0ZnNfcHJpbnRrKEtFUk5fREVCVUcsCi0JCQkJCSJUaGUgbW91bnRfY3J5cHRfc3RhdCAiCi0JCQkJCSJnbG9iYWxfZGVmYXVsdF9jaXBoZXJfa2V5X3NpemUgIgotCQkJCQkic2V0IHRvOiBbJWRdXG4iLCBtb3VudF9jcnlwdF9zdGF0LT4KLQkJCQkJZ2xvYmFsX2RlZmF1bHRfY2lwaGVyX2tleV9zaXplKTsKIAkJCWNpcGhlcl9rZXlfYnl0ZXNfc2V0ID0gMTsKIAkJCWJyZWFrOwogCQljYXNlIGVjcnlwdGZzX29wdF9wYXNzdGhyb3VnaDoKQEAgLTM1NiwxMSArMzYxLDUxIEBACiAJCQltb3VudF9jcnlwdF9zdGF0LT5mbGFncyB8PQogCQkJCUVDUllQVEZTX0VOQ1JZUFRFRF9WSUVXX0VOQUJMRUQ7CiAJCQlicmVhazsKKwkJY2FzZSBlY3J5cHRmc19vcHRfZm5la19zaWc6CisJCQlmbmVrX3NyYyA9IGFyZ3NbMF0uZnJvbTsKKwkJCWZuZWtfZHN0ID0KKwkJCQltb3VudF9jcnlwdF9zdGF0LT5nbG9iYWxfZGVmYXVsdF9mbmVrX3NpZzsKKwkJCXN0cm5jcHkoZm5la19kc3QsIGZuZWtfc3JjLCBFQ1JZUFRGU19TSUdfU0laRV9IRVgpOworCQkJbW91bnRfY3J5cHRfc3RhdC0+Z2xvYmFsX2RlZmF1bHRfZm5la19zaWdbCisJCQkJRUNSWVBURlNfU0lHX1NJWkVfSEVYXSA9ICdcMCc7CisJCQlyYyA9IGVjcnlwdGZzX2FkZF9nbG9iYWxfYXV0aF90b2soCisJCQkJbW91bnRfY3J5cHRfc3RhdCwKKwkJCQltb3VudF9jcnlwdF9zdGF0LT5nbG9iYWxfZGVmYXVsdF9mbmVrX3NpZyk7CisJCQlpZiAocmMpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgIkVycm9yIGF0dGVtcHRpbmcgdG8gcmVnaXN0ZXIgIgorCQkJCSAgICAgICAiZ2xvYmFsIGZuZWsgc2lnIFslc107IHJjID0gWyVkXVxuIiwKKwkJCQkgICAgICAgbW91bnRfY3J5cHRfc3RhdC0+Z2xvYmFsX2RlZmF1bHRfZm5la19zaWcsCisJCQkJICAgICAgIHJjKTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCW1vdW50X2NyeXB0X3N0YXQtPmZsYWdzIHw9CisJCQkJKEVDUllQVEZTX0dMT0JBTF9FTkNSWVBUX0ZJTEVOQU1FUworCQkJCSB8IEVDUllQVEZTX0dMT0JBTF9FTkNGTl9VU0VfTU9VTlRfRk5FSyk7CisJCQlicmVhazsKKwkJY2FzZSBlY3J5cHRmc19vcHRfZm5fY2lwaGVyOgorCQkJZm5fY2lwaGVyX25hbWVfc3JjID0gYXJnc1swXS5mcm9tOworCQkJZm5fY2lwaGVyX25hbWVfZHN0ID0KKwkJCQltb3VudF9jcnlwdF9zdGF0LT5nbG9iYWxfZGVmYXVsdF9mbl9jaXBoZXJfbmFtZTsKKwkJCXN0cm5jcHkoZm5fY2lwaGVyX25hbWVfZHN0LCBmbl9jaXBoZXJfbmFtZV9zcmMsCisJCQkJRUNSWVBURlNfTUFYX0NJUEhFUl9OQU1FX1NJWkUpOworCQkJbW91bnRfY3J5cHRfc3RhdC0+Z2xvYmFsX2RlZmF1bHRfZm5fY2lwaGVyX25hbWVbCisJCQkJRUNSWVBURlNfTUFYX0NJUEhFUl9OQU1FX1NJWkVdID0gJ1wwJzsKKwkJCWZuX2NpcGhlcl9uYW1lX3NldCA9IDE7CisJCQlicmVhazsKKwkJY2FzZSBlY3J5cHRmc19vcHRfZm5fY2lwaGVyX2tleV9ieXRlczoKKwkJCWZuX2NpcGhlcl9rZXlfYnl0ZXNfc3JjID0gYXJnc1swXS5mcm9tOworCQkJZm5fY2lwaGVyX2tleV9ieXRlcyA9CisJCQkJKGludClzaW1wbGVfc3RydG9sKGZuX2NpcGhlcl9rZXlfYnl0ZXNfc3JjLAorCQkJCQkJICAgJmZuX2NpcGhlcl9rZXlfYnl0ZXNfc3JjLCAwKTsKKwkJCW1vdW50X2NyeXB0X3N0YXQtPmdsb2JhbF9kZWZhdWx0X2ZuX2NpcGhlcl9rZXlfYnl0ZXMgPQorCQkJCWZuX2NpcGhlcl9rZXlfYnl0ZXM7CisJCQlmbl9jaXBoZXJfa2V5X2J5dGVzX3NldCA9IDE7CisJCQlicmVhazsKIAkJY2FzZSBlY3J5cHRmc19vcHRfZXJyOgogCQlkZWZhdWx0OgotCQkJZWNyeXB0ZnNfcHJpbnRrKEtFUk5fV0FSTklORywKLQkJCQkJImVDcnlwdGZzOiB1bnJlY29nbml6ZWQgb3B0aW9uICclcydcbiIsCi0JCQkJCXApOworCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJICAgICAgICIlczogZUNyeXB0ZnM6IHVucmVjb2duaXplZCBvcHRpb24gWyVzXVxuIiwKKwkJCSAgICAgICBfX2Z1bmNfXywgcCk7CiAJCX0KIAl9CiAJaWYgKCFzaWdfc2V0KSB7CkBAIC0zNzQsMzMgKzQxOSw2MCBAQAogCQlpbnQgY2lwaGVyX25hbWVfbGVuID0gc3RybGVuKEVDUllQVEZTX0RFRkFVTFRfQ0lQSEVSKTsKIAogCQlCVUdfT04oY2lwaGVyX25hbWVfbGVuID49IEVDUllQVEZTX01BWF9DSVBIRVJfTkFNRV9TSVpFKTsKLQogCQlzdHJjcHkobW91bnRfY3J5cHRfc3RhdC0+Z2xvYmFsX2RlZmF1bHRfY2lwaGVyX25hbWUsCiAJCSAgICAgICBFQ1JZUFRGU19ERUZBVUxUX0NJUEhFUik7CiAJfQotCWlmICghY2lwaGVyX2tleV9ieXRlc19zZXQpIHsKKwlpZiAoKG1vdW50X2NyeXB0X3N0YXQtPmZsYWdzICYgRUNSWVBURlNfR0xPQkFMX0VOQ1JZUFRfRklMRU5BTUVTKQorCSAgICAmJiAhZm5fY2lwaGVyX25hbWVfc2V0KQorCQlzdHJjcHkobW91bnRfY3J5cHRfc3RhdC0+Z2xvYmFsX2RlZmF1bHRfZm5fY2lwaGVyX25hbWUsCisJCSAgICAgICBtb3VudF9jcnlwdF9zdGF0LT5nbG9iYWxfZGVmYXVsdF9jaXBoZXJfbmFtZSk7CisJaWYgKCFjaXBoZXJfa2V5X2J5dGVzX3NldCkKIAkJbW91bnRfY3J5cHRfc3RhdC0+Z2xvYmFsX2RlZmF1bHRfY2lwaGVyX2tleV9zaXplID0gMDsKLQl9CisJaWYgKChtb3VudF9jcnlwdF9zdGF0LT5mbGFncyAmIEVDUllQVEZTX0dMT0JBTF9FTkNSWVBUX0ZJTEVOQU1FUykKKwkgICAgJiYgIWZuX2NpcGhlcl9rZXlfYnl0ZXNfc2V0KQorCQltb3VudF9jcnlwdF9zdGF0LT5nbG9iYWxfZGVmYXVsdF9mbl9jaXBoZXJfa2V5X2J5dGVzID0KKwkJCW1vdW50X2NyeXB0X3N0YXQtPmdsb2JhbF9kZWZhdWx0X2NpcGhlcl9rZXlfc2l6ZTsKIAltdXRleF9sb2NrKCZrZXlfdGZtX2xpc3RfbXV0ZXgpOwogCWlmICghZWNyeXB0ZnNfdGZtX2V4aXN0cyhtb3VudF9jcnlwdF9zdGF0LT5nbG9iYWxfZGVmYXVsdF9jaXBoZXJfbmFtZSwKLQkJCQkgTlVMTCkpCisJCQkJIE5VTEwpKSB7CiAJCXJjID0gZWNyeXB0ZnNfYWRkX25ld19rZXlfdGZtKAogCQkJTlVMTCwgbW91bnRfY3J5cHRfc3RhdC0+Z2xvYmFsX2RlZmF1bHRfY2lwaGVyX25hbWUsCiAJCQltb3VudF9jcnlwdF9zdGF0LT5nbG9iYWxfZGVmYXVsdF9jaXBoZXJfa2V5X3NpemUpOwotCW11dGV4X3VubG9jaygma2V5X3RmbV9saXN0X211dGV4KTsKLQlpZiAocmMpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJFcnJvciBhdHRlbXB0aW5nIHRvIGluaXRpYWxpemUgY2lwaGVyIHdpdGggIgotCQkgICAgICAgIm5hbWUgPSBbJXNdIGFuZCBrZXkgc2l6ZSA9IFsldGRdOyByYyA9IFslZF1cbiIsCi0JCSAgICAgICBtb3VudF9jcnlwdF9zdGF0LT5nbG9iYWxfZGVmYXVsdF9jaXBoZXJfbmFtZSwKLQkJICAgICAgIG1vdW50X2NyeXB0X3N0YXQtPmdsb2JhbF9kZWZhdWx0X2NpcGhlcl9rZXlfc2l6ZSwgcmMpOwotCQlyYyA9IC1FSU5WQUw7Ci0JCWdvdG8gb3V0OworCQlpZiAocmMpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiRXJyb3IgYXR0ZW1wdGluZyB0byBpbml0aWFsaXplICIKKwkJCSAgICAgICAiY2lwaGVyIHdpdGggbmFtZSA9IFslc10gYW5kIGtleSBzaXplID0gWyV0ZF07ICIKKwkJCSAgICAgICAicmMgPSBbJWRdXG4iLAorCQkJICAgICAgIG1vdW50X2NyeXB0X3N0YXQtPmdsb2JhbF9kZWZhdWx0X2NpcGhlcl9uYW1lLAorCQkJICAgICAgIG1vdW50X2NyeXB0X3N0YXQtPmdsb2JhbF9kZWZhdWx0X2NpcGhlcl9rZXlfc2l6ZSwKKwkJCSAgICAgICByYyk7CisJCQlyYyA9IC1FSU5WQUw7CisJCQltdXRleF91bmxvY2soJmtleV90Zm1fbGlzdF9tdXRleCk7CisJCQlnb3RvIG91dDsKKwkJfQogCX0KKwlpZiAoKG1vdW50X2NyeXB0X3N0YXQtPmZsYWdzICYgRUNSWVBURlNfR0xPQkFMX0VOQ1JZUFRfRklMRU5BTUVTKQorCSAgICAmJiAhZWNyeXB0ZnNfdGZtX2V4aXN0cygKKwkJICAgIG1vdW50X2NyeXB0X3N0YXQtPmdsb2JhbF9kZWZhdWx0X2ZuX2NpcGhlcl9uYW1lLCBOVUxMKSkgeworCQlyYyA9IGVjcnlwdGZzX2FkZF9uZXdfa2V5X3RmbSgKKwkJCU5VTEwsIG1vdW50X2NyeXB0X3N0YXQtPmdsb2JhbF9kZWZhdWx0X2ZuX2NpcGhlcl9uYW1lLAorCQkJbW91bnRfY3J5cHRfc3RhdC0+Z2xvYmFsX2RlZmF1bHRfZm5fY2lwaGVyX2tleV9ieXRlcyk7CisJCWlmIChyYykgeworCQkJcHJpbnRrKEtFUk5fRVJSICJFcnJvciBhdHRlbXB0aW5nIHRvIGluaXRpYWxpemUgIgorCQkJICAgICAgICJjaXBoZXIgd2l0aCBuYW1lID0gWyVzXSBhbmQga2V5IHNpemUgPSBbJXRkXTsgIgorCQkJICAgICAgICJyYyA9IFslZF1cbiIsCisJCQkgICAgICAgbW91bnRfY3J5cHRfc3RhdC0+Z2xvYmFsX2RlZmF1bHRfZm5fY2lwaGVyX25hbWUsCisJCQkgICAgICAgbW91bnRfY3J5cHRfc3RhdC0+Z2xvYmFsX2RlZmF1bHRfZm5fY2lwaGVyX2tleV9ieXRlcywKKwkJCSAgICAgICByYyk7CisJCQlyYyA9IC1FSU5WQUw7CisJCQltdXRleF91bmxvY2soJmtleV90Zm1fbGlzdF9tdXRleCk7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKwltdXRleF91bmxvY2soJmtleV90Zm1fbGlzdF9tdXRleCk7CiAJcmMgPSBlY3J5cHRmc19pbml0X2dsb2JhbF9hdXRoX3Rva3MobW91bnRfY3J5cHRfc3RhdCk7Ci0JaWYgKHJjKSB7CisJaWYgKHJjKQogCQlwcmludGsoS0VSTl9XQVJOSU5HICJPbmUgb3IgbW9yZSBnbG9iYWwgYXV0aCB0b2tzIGNvdWxkIG5vdCAiCiAJCSAgICAgICAicHJvcGVybHkgcmVnaXN0ZXI7IHJjID0gWyVkXVxuIiwgcmMpOwotCX0KIG91dDoKIAlyZXR1cm4gcmM7CiB9CmRpZmYgLS1naXQgYS9mcy9lY3J5cHRmcy9tZXNzYWdpbmcuYyBiL2ZzL2VjcnlwdGZzL21lc3NhZ2luZy5jCmluZGV4IDY5MTNmNzIuLjk2ZWY1MTQgMTAwNjQ0Ci0tLSBhL2ZzL2VjcnlwdGZzL21lc3NhZ2luZy5jCisrKyBiL2ZzL2VjcnlwdGZzL21lc3NhZ2luZy5jCkBAIC0xOTMsNyArMTkzLDcgQEAKIAkoKmRhZW1vbikgPSBremFsbG9jKHNpemVvZigqKmRhZW1vbiksIEdGUF9LRVJORUwpOwogCWlmICghKCpkYWVtb24pKSB7CiAJCXJjID0gLUVOT01FTTsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogRmFpbGVkIHRvIGFsbG9jYXRlIFslWmRdIGJ5dGVzIG9mICIKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogRmFpbGVkIHRvIGFsbG9jYXRlIFslemRdIGJ5dGVzIG9mICIKIAkJICAgICAgICJHRlBfS0VSTkVMIG1lbW9yeVxuIiwgX19mdW5jX18sIHNpemVvZigqKmRhZW1vbikpOwogCQlnb3RvIG91dDsKIAl9CkBAIC00MzUsNyArNDM1LDcgQEAKIAltc2dfY3R4LT5tc2cgPSBrbWFsbG9jKG1zZ19zaXplLCBHRlBfS0VSTkVMKTsKIAlpZiAoIW1zZ19jdHgtPm1zZykgewogCQlyYyA9IC1FTk9NRU07Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IEZhaWxlZCB0byBhbGxvY2F0ZSBbJVpkXSBieXRlcyBvZiAiCisJCXByaW50ayhLRVJOX0VSUiAiJXM6IEZhaWxlZCB0byBhbGxvY2F0ZSBbJXpkXSBieXRlcyBvZiAiCiAJCSAgICAgICAiR0ZQX0tFUk5FTCBtZW1vcnlcbiIsIF9fZnVuY19fLCBtc2dfc2l6ZSk7CiAJCWdvdG8gdW5sb2NrOwogCX0KZGlmZiAtLWdpdCBhL2ZzL2VjcnlwdGZzL21pc2NkZXYuYyBiL2ZzL2VjcnlwdGZzL21pc2NkZXYuYwppbmRleCBlZmQ5NWEwLi5hNjdmZWE2IDEwMDY0NAotLS0gYS9mcy9lY3J5cHRmcy9taXNjZGV2LmMKKysrIGIvZnMvZWNyeXB0ZnMvbWlzY2Rldi5jCkBAIC0xOTksNyArMTk5LDcgQEAKIAkJaWYgKCFtc2dfY3R4LT5tc2cpIHsKIAkJCXJjID0gLUVOT01FTTsKIAkJCXByaW50ayhLRVJOX0VSUiAiJXM6IE91dCBvZiBtZW1vcnkgd2hpbHN0IGF0dGVtcHRpbmcgIgotCQkJICAgICAgICJ0byBrbWFsbG9jKCVaZCwgR0ZQX0tFUk5FTClcbiIsIF9fZnVuY19fLAorCQkJICAgICAgICJ0byBrbWFsbG9jKCV6ZCwgR0ZQX0tFUk5FTClcbiIsIF9fZnVuY19fLAogCQkJICAgICAgIChzaXplb2YoKm1zZ19jdHgtPm1zZykgKyBkYXRhX3NpemUpKTsKIAkJCWdvdG8gb3V0X3VubG9jazsKIAkJfQpAQCAtMzIyLDcgKzMyMiw3IEBACiAJaWYgKGNvdW50IDwgdG90YWxfbGVuZ3RoKSB7CiAJCXJjID0gMDsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IE9ubHkgZ2l2ZW4gdXNlciBidWZmZXIgb2YgIgotCQkgICAgICAgInNpemUgWyVaZF0sIGJ1dCB3ZSBuZWVkIFslWmRdIHRvIHJlYWQgdGhlICIKKwkJICAgICAgICJzaXplIFslemRdLCBidXQgd2UgbmVlZCBbJXpkXSB0byByZWFkIHRoZSAiCiAJCSAgICAgICAicGVuZGluZyBtZXNzYWdlXG4iLCBfX2Z1bmNfXywgY291bnQsIHRvdGFsX2xlbmd0aCk7CiAJCWdvdG8gb3V0X3VubG9ja19tc2dfY3R4OwogCX0KQEAgLTM3Niw3ICszNzYsNyBAQAogCiAJaWYgKChzaXplb2YoKm1zZykgKyBtc2ctPmRhdGFfbGVuKSAhPSBkYXRhX3NpemUpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IChzaXplb2YoKm1zZykgKyBtc2ctPmRhdGFfbGVuKSA9ICIKLQkJICAgICAgICJbJVpkXTsgZGF0YV9zaXplID0gWyVaZF0uIEludmFsaWQgcGFja2V0LlxuIiwgX19mdW5jX18sCisJCSAgICAgICAiWyV6ZF07IGRhdGFfc2l6ZSA9IFslemRdLiBJbnZhbGlkIHBhY2tldC5cbiIsIF9fZnVuY19fLAogCQkgICAgICAgKHNpemVvZigqbXNnKSArIG1zZy0+ZGF0YV9sZW4pLCBkYXRhX3NpemUpOwogCQlyYyA9IC1FSU5WQUw7CiAJCWdvdG8gb3V0OwpAQCAtNDIxLDcgKzQyMSw3IEBACiAJZGF0YSA9IGttYWxsb2MoY291bnQsIEdGUF9LRVJORUwpOwogCWlmICghZGF0YSkgewogCQlwcmludGsoS0VSTl9FUlIgIiVzOiBPdXQgb2YgbWVtb3J5IHdoaWxzdCBhdHRlbXB0aW5nIHRvICIKLQkJICAgICAgICJrbWFsbG9jKFslWmRdLCBHRlBfS0VSTkVMKVxuIiwgX19mdW5jX18sIGNvdW50KTsKKwkJICAgICAgICJrbWFsbG9jKFslemRdLCBHRlBfS0VSTkVMKVxuIiwgX19mdW5jX18sIGNvdW50KTsKIAkJZ290byBvdXQ7CiAJfQogCXJjID0gY29weV9mcm9tX3VzZXIoZGF0YSwgYnVmLCBjb3VudCk7CkBAIC00MzYsOCArNDM2LDggQEAKIAljYXNlIEVDUllQVEZTX01TR19SRVNQT05TRToKIAkJaWYgKGNvdW50IDwgKDEgKyA0ICsgMSArIHNpemVvZihzdHJ1Y3QgZWNyeXB0ZnNfbWVzc2FnZSkpKSB7CiAJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogTWluaW11bSBhY2NlcHRhYmxlIHBhY2tldCAiCi0JCQkgICAgICAgInNpemUgaXMgWyVaZF0sIGJ1dCBhbW91bnQgb2YgZGF0YSB3cml0dGVuIGlzICIKLQkJCSAgICAgICAib25seSBbJVpkXS4gRGlzY2FyZGluZyByZXNwb25zZSBwYWNrZXQuXG4iLAorCQkJICAgICAgICJzaXplIGlzIFslemRdLCBidXQgYW1vdW50IG9mIGRhdGEgd3JpdHRlbiBpcyAiCisJCQkgICAgICAgIm9ubHkgWyV6ZF0uIERpc2NhcmRpbmcgcmVzcG9uc2UgcGFja2V0LlxuIiwKIAkJCSAgICAgICBfX2Z1bmNfXywKIAkJCSAgICAgICAoMSArIDQgKyAxICsgc2l6ZW9mKHN0cnVjdCBlY3J5cHRmc19tZXNzYWdlKSksCiAJCQkgICAgICAgY291bnQpOwpAQCAtNDU1LDkgKzQ1NSw5IEBACiAJCX0KIAkJaSArPSBwYWNrZXRfc2l6ZV9sZW5ndGg7CiAJCWlmICgoMSArIDQgKyBwYWNrZXRfc2l6ZV9sZW5ndGggKyBwYWNrZXRfc2l6ZSkgIT0gY291bnQpIHsKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiAoMSArIHBhY2tldF9zaXplX2xlbmd0aChbJVpkXSkiCi0JCQkgICAgICAgIiArIHBhY2tldF9zaXplKFslWmRdKSkoWyVaZF0pICE9ICIKLQkJCSAgICAgICAiY291bnQoWyVaZF0pLiBJbnZhbGlkIHBhY2tldCBmb3JtYXQuXG4iLAorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6ICgxICsgcGFja2V0X3NpemVfbGVuZ3RoKFslemRdKSIKKwkJCSAgICAgICAiICsgcGFja2V0X3NpemUoWyV6ZF0pKShbJXpkXSkgIT0gIgorCQkJICAgICAgICJjb3VudChbJXpkXSkuIEludmFsaWQgcGFja2V0IGZvcm1hdC5cbiIsCiAJCQkgICAgICAgX19mdW5jX18sIHBhY2tldF9zaXplX2xlbmd0aCwgcGFja2V0X3NpemUsCiAJCQkgICAgICAgKDEgKyBwYWNrZXRfc2l6ZV9sZW5ndGggKyBwYWNrZXRfc2l6ZSksIGNvdW50KTsKIAkJCWdvdG8gb3V0X2ZyZWU7CmRpZmYgLS1naXQgYS9mcy9leGVjLmMgYi9mcy9leGVjLmMKaW5kZXggM2VmOWNmOS4uNzFhNmVmZSAxMDA2NDQKLS0tIGEvZnMvZXhlYy5jCisrKyBiL2ZzL2V4ZWMuYwpAQCAtNTEsNiArNTEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2F1ZGl0Lmg+CiAjaW5jbHVkZSA8bGludXgvdHJhY2Vob29rLmg+CiAjaW5jbHVkZSA8bGludXgva21vZC5oPgorI2luY2x1ZGUgPGxpbnV4L2Zzbm90aWZ5Lmg+CiAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9tbXVfY29udGV4dC5oPgpAQCAtMTMyLDYgKzEzMyw4IEBACiAJaWYgKElTX0VSUihmaWxlKSkKIAkJZ290byBvdXQ7CiAKKwlmc25vdGlmeV9vcGVuKGZpbGUtPmZfcGF0aC5kZW50cnkpOworCiAJZXJyb3IgPSAtRU5PRVhFQzsKIAlpZihmaWxlLT5mX29wKSB7CiAJCXN0cnVjdCBsaW51eF9iaW5mbXQgKiBmbXQ7CkBAIC0yMjksMTMgKzIzMiwxMyBAQAogCiBzdGF0aWMgaW50IF9fYnBybV9tbV9pbml0KHN0cnVjdCBsaW51eF9iaW5wcm0gKmJwcm0pCiB7Ci0JaW50IGVyciA9IC1FTk9NRU07CisJaW50IGVycjsKIAlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSA9IE5VTEw7CiAJc3RydWN0IG1tX3N0cnVjdCAqbW0gPSBicHJtLT5tbTsKIAogCWJwcm0tPnZtYSA9IHZtYSA9IGttZW1fY2FjaGVfemFsbG9jKHZtX2FyZWFfY2FjaGVwLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXZtYSkKLQkJZ290byBlcnI7CisJCXJldHVybiAtRU5PTUVNOwogCiAJZG93bl93cml0ZSgmbW0tPm1tYXBfc2VtKTsKIAl2bWEtPnZtX21tID0gbW07CkBAIC0yNDgsMjggKzI1MSwyMCBAQAogCSAqLwogCXZtYS0+dm1fZW5kID0gU1RBQ0tfVE9QX01BWDsKIAl2bWEtPnZtX3N0YXJ0ID0gdm1hLT52bV9lbmQgLSBQQUdFX1NJWkU7Ci0KIAl2bWEtPnZtX2ZsYWdzID0gVk1fU1RBQ0tfRkxBR1M7CiAJdm1hLT52bV9wYWdlX3Byb3QgPSB2bV9nZXRfcGFnZV9wcm90KHZtYS0+dm1fZmxhZ3MpOwogCWVyciA9IGluc2VydF92bV9zdHJ1Y3QobW0sIHZtYSk7Ci0JaWYgKGVycikgewotCQl1cF93cml0ZSgmbW0tPm1tYXBfc2VtKTsKKwlpZiAoZXJyKQogCQlnb3RvIGVycjsKLQl9CiAKIAltbS0+c3RhY2tfdm0gPSBtbS0+dG90YWxfdm0gPSAxOwogCXVwX3dyaXRlKCZtbS0+bW1hcF9zZW0pOwotCiAJYnBybS0+cCA9IHZtYS0+dm1fZW5kIC0gc2l6ZW9mKHZvaWQgKik7Ci0KIAlyZXR1cm4gMDsKLQogZXJyOgotCWlmICh2bWEpIHsKLQkJYnBybS0+dm1hID0gTlVMTDsKLQkJa21lbV9jYWNoZV9mcmVlKHZtX2FyZWFfY2FjaGVwLCB2bWEpOwotCX0KLQorCXVwX3dyaXRlKCZtbS0+bW1hcF9zZW0pOworCWJwcm0tPnZtYSA9IE5VTEw7CisJa21lbV9jYWNoZV9mcmVlKHZtX2FyZWFfY2FjaGVwLCB2bWEpOwogCXJldHVybiBlcnI7CiB9CiAKQEAgLTY4NCw2ICs2NzksOCBAQAogCWlmIChJU19FUlIoZmlsZSkpCiAJCXJldHVybiBmaWxlOwogCisJZnNub3RpZnlfb3BlbihmaWxlLT5mX3BhdGguZGVudHJ5KTsKKwogCWVyciA9IGRlbnlfd3JpdGVfYWNjZXNzKGZpbGUpOwogCWlmIChlcnIpIHsKIAkJZnB1dChmaWxlKTsKQEAgLTE2ODksNyArMTY4Niw3IEBACiAJcmV0dXJuIChyZXQgPj0gMikgPyAyIDogcmV0OwogfQogCi1pbnQgZG9fY29yZWR1bXAobG9uZyBzaWduciwgaW50IGV4aXRfY29kZSwgc3RydWN0IHB0X3JlZ3MgKiByZWdzKQordm9pZCBkb19jb3JlZHVtcChsb25nIHNpZ25yLCBpbnQgZXhpdF9jb2RlLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAlzdHJ1Y3QgY29yZV9zdGF0ZSBjb3JlX3N0YXRlOwogCWNoYXIgY29yZW5hbWVbQ09SRU5BTUVfTUFYX1NJWkUgKyAxXTsKQEAgLTE3NzMsNiArMTc3MCwxMSBAQAogCiAgCWlmIChpc3BpcGUpIHsKIAkJaGVscGVyX2FyZ3YgPSBhcmd2X3NwbGl0KEdGUF9LRVJORUwsIGNvcmVuYW1lKzEsICZoZWxwZXJfYXJnYyk7CisJCWlmICghaGVscGVyX2FyZ3YpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzIGZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnlcbiIsCisJCQkgICAgICAgX19mdW5jX18pOworCQkJZ290byBmYWlsX3VubG9jazsKKwkJfQogCQkvKiBUZXJtaW5hdGUgdGhlIHN0cmluZyBiZWZvcmUgdGhlIGZpcnN0IG9wdGlvbiAqLwogCQlkZWxpbWl0ID0gc3RyY2hyKGNvcmVuYW1lLCAnICcpOwogCQlpZiAoZGVsaW1pdCkKQEAgLTE4NDAsNSArMTg0Miw1IEBACiAJcHV0X2NyZWQoY3JlZCk7CiAJY29yZWR1bXBfZmluaXNoKG1tKTsKIGZhaWw6Ci0JcmV0dXJuIHJldHZhbDsKKwlyZXR1cm47CiB9CmRpZmYgLS1naXQgYS9mcy9leHQyL2lhbGxvYy5jIGIvZnMvZXh0Mi9pYWxsb2MuYwppbmRleCBjNDU0ZDVkLi42NjMyMWE4IDEwMDY0NAotLS0gYS9mcy9leHQyL2lhbGxvYy5jCisrKyBiL2ZzL2V4dDIvaWFsbG9jLmMKQEAgLTU2NSwxMiArNTY1LDggQEAKIAlpbm9kZS0+aV9ibG9ja3MgPSAwOwogCWlub2RlLT5pX210aW1lID0gaW5vZGUtPmlfYXRpbWUgPSBpbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRV9TRUM7CiAJbWVtc2V0KGVpLT5pX2RhdGEsIDAsIHNpemVvZihlaS0+aV9kYXRhKSk7Ci0JZWktPmlfZmxhZ3MgPSBFWFQyX0koZGlyKS0+aV9mbGFncyAmIH5FWFQyX0JUUkVFX0ZMOwotCWlmIChTX0lTTE5LKG1vZGUpKQotCQllaS0+aV9mbGFncyAmPSB+KEVYVDJfSU1NVVRBQkxFX0ZMfEVYVDJfQVBQRU5EX0ZMKTsKLQkvKiBkaXJzeW5jIGlzIG9ubHkgYXBwbGllZCB0byBkaXJlY3RvcmllcyAqLwotCWlmICghU19JU0RJUihtb2RlKSkKLQkJZWktPmlfZmxhZ3MgJj0gfkVYVDJfRElSU1lOQ19GTDsKKwllaS0+aV9mbGFncyA9CisJCWV4dDJfbWFza19mbGFncyhtb2RlLCBFWFQyX0koZGlyKS0+aV9mbGFncyAmIEVYVDJfRkxfSU5IRVJJVEVEKTsKIAllaS0+aV9mYWRkciA9IDA7CiAJZWktPmlfZnJhZ19ubyA9IDA7CiAJZWktPmlfZnJhZ19zaXplID0gMDsKZGlmZiAtLWdpdCBhL2ZzL2V4dDIvaW5vZGUuYyBiL2ZzL2V4dDIvaW5vZGUuYwppbmRleCAwMmIzOWE1Li4yM2ZmZjJmIDEwMDY0NAotLS0gYS9mcy9leHQyL2lub2RlLmMKKysrIGIvZnMvZXh0Mi9pbm9kZS5jCkBAIC00OTgsOCArNDk4LDYgQEAKICAqIGV4dDJfc3BsaWNlX2JyYW5jaCAtIHNwbGljZSB0aGUgYWxsb2NhdGVkIGJyYW5jaCBvbnRvIGlub2RlLgogICogQGlub2RlOiBvd25lcgogICogQGJsb2NrOiAobG9naWNhbCkgbnVtYmVyIG9mIGJsb2NrIHdlIGFyZSBhZGRpbmcKLSAqIEBjaGFpbjogY2hhaW4gb2YgaW5kaXJlY3QgYmxvY2tzICh3aXRoIGEgbWlzc2luZyBsaW5rIC0gc2VlCi0gKglleHQyX2FsbG9jX2JyYW5jaCkKICAqIEB3aGVyZTogbG9jYXRpb24gb2YgbWlzc2luZyBsaW5rCiAgKiBAbnVtOiAgIG51bWJlciBvZiBpbmRpcmVjdCBibG9ja3Mgd2UgYXJlIGFkZGluZwogICogQGJsa3M6ICBudW1iZXIgb2YgZGlyZWN0IGJsb2NrcyB3ZSBhcmUgYWRkaW5nCmRpZmYgLS1naXQgYS9mcy9leHQyL2lvY3RsLmMgYi9mcy9leHQyL2lvY3RsLmMKaW5kZXggZGU4NzZmYS4uN2NiNGJhZCAxMDA2NDQKLS0tIGEvZnMvZXh0Mi9pb2N0bC5jCisrKyBiL2ZzL2V4dDIvaW9jdGwuYwpAQCAtNTAsOCArNTAsNyBAQAogCQkJZ290byBzZXRmbGFnc19vdXQ7CiAJCX0KIAotCQlpZiAoIVNfSVNESVIoaW5vZGUtPmlfbW9kZSkpCi0JCQlmbGFncyAmPSB+RVhUMl9ESVJTWU5DX0ZMOworCQlmbGFncyA9IGV4dDJfbWFza19mbGFncyhpbm9kZS0+aV9tb2RlLCBmbGFncyk7CiAKIAkJbXV0ZXhfbG9jaygmaW5vZGUtPmlfbXV0ZXgpOwogCQkvKiBJcyBpdCBxdW90YSBmaWxlPyBEbyBub3QgYWxsb3cgdXNlciB0byBtZXNzIHdpdGggaXQgKi8KZGlmZiAtLWdpdCBhL2ZzL2V4dDIvc3VwZXIuYyBiL2ZzL2V4dDIvc3VwZXIuYwppbmRleCA2NDdjZDg4Li5kYThiZGVhIDEwMDY0NAotLS0gYS9mcy9leHQyL3N1cGVyLmMKKysrIGIvZnMvZXh0Mi9zdXBlci5jCkBAIC0xMzIsNiArMTMyLDcgQEAKIAlwZXJjcHVfY291bnRlcl9kZXN0cm95KCZzYmktPnNfZGlyc19jb3VudGVyKTsKIAlicmVsc2UgKHNiaS0+c19zYmgpOwogCXNiLT5zX2ZzX2luZm8gPSBOVUxMOworCWtmcmVlKHNiaS0+c19ibG9ja2dyb3VwX2xvY2spOwogCWtmcmVlKHNiaSk7CiAKIAlyZXR1cm47CkBAIC03NTYsNiArNzU3LDEzIEBACiAJc2JpID0ga3phbGxvYyhzaXplb2YoKnNiaSksIEdGUF9LRVJORUwpOwogCWlmICghc2JpKQogCQlyZXR1cm4gLUVOT01FTTsKKworCXNiaS0+c19ibG9ja2dyb3VwX2xvY2sgPQorCQlremFsbG9jKHNpemVvZihzdHJ1Y3QgYmxvY2tncm91cF9sb2NrKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzYmktPnNfYmxvY2tncm91cF9sb2NrKSB7CisJCWtmcmVlKHNiaSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KIAlzYi0+c19mc19pbmZvID0gc2JpOwogCXNiaS0+c19zYl9ibG9jayA9IHNiX2Jsb2NrOwogCkBAIC05ODMsNyArOTkxLDcgQEAKIAkJcHJpbnRrICgiRVhUMi1mczogbm90IGVub3VnaCBtZW1vcnlcbiIpOwogCQlnb3RvIGZhaWxlZF9tb3VudDsKIAl9Ci0JYmdsX2xvY2tfaW5pdCgmc2JpLT5zX2Jsb2NrZ3JvdXBfbG9jayk7CisJYmdsX2xvY2tfaW5pdChzYmktPnNfYmxvY2tncm91cF9sb2NrKTsKIAlzYmktPnNfZGVidHMgPSBrY2FsbG9jKHNiaS0+c19ncm91cHNfY291bnQsIHNpemVvZigqc2JpLT5zX2RlYnRzKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFzYmktPnNfZGVidHMpIHsKIAkJcHJpbnRrICgiRVhUMi1mczogbm90IGVub3VnaCBtZW1vcnlcbiIpOwpkaWZmIC0tZ2l0IGEvZnMvZXh0My9oYXNoLmMgYi9mcy9leHQzL2hhc2guYwppbmRleCBjMzBlMTQ5Li43ZDIxNWI0IDEwMDY0NAotLS0gYS9mcy9leHQzL2hhc2guYworKysgYi9mcy9leHQzL2hhc2guYwpAQCAtMzUsMjMgKzM1LDcxIEBACiAKIAogLyogVGhlIG9sZCBsZWdhY3kgaGFzaCAqLwotc3RhdGljIF9fdTMyIGR4X2hhY2tfaGFzaCAoY29uc3QgY2hhciAqbmFtZSwgaW50IGxlbikKK3N0YXRpYyBfX3UzMiBkeF9oYWNrX2hhc2hfdW5zaWduZWQoY29uc3QgY2hhciAqbmFtZSwgaW50IGxlbikKIHsKLQlfX3UzMiBoYXNoMCA9IDB4MTJhM2ZlMmQsIGhhc2gxID0gMHgzN2FiZThmOTsKLQl3aGlsZSAobGVuLS0pIHsKLQkJX191MzIgaGFzaCA9IGhhc2gxICsgKGhhc2gwIF4gKCpuYW1lKysgKiA3MTUyMzczKSk7CisJX191MzIgaGFzaCwgaGFzaDAgPSAweDEyYTNmZTJkLCBoYXNoMSA9IDB4MzdhYmU4Zjk7CisJY29uc3QgdW5zaWduZWQgY2hhciAqdWNwID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikgbmFtZTsKIAotCQlpZiAoaGFzaCAmIDB4ODAwMDAwMDApIGhhc2ggLT0gMHg3ZmZmZmZmZjsKKwl3aGlsZSAobGVuLS0pIHsKKwkJaGFzaCA9IGhhc2gxICsgKGhhc2gwIF4gKCgoaW50KSAqdWNwKyspICogNzE1MjM3MykpOworCisJCWlmIChoYXNoICYgMHg4MDAwMDAwMCkKKwkJCWhhc2ggLT0gMHg3ZmZmZmZmZjsKIAkJaGFzaDEgPSBoYXNoMDsKIAkJaGFzaDAgPSBoYXNoOwogCX0KLQlyZXR1cm4gKGhhc2gwIDw8IDEpOworCXJldHVybiBoYXNoMCA8PCAxOwogfQogCi1zdGF0aWMgdm9pZCBzdHIyaGFzaGJ1Zihjb25zdCBjaGFyICptc2csIGludCBsZW4sIF9fdTMyICpidWYsIGludCBudW0pCitzdGF0aWMgX191MzIgZHhfaGFja19oYXNoX3NpZ25lZChjb25zdCBjaGFyICpuYW1lLCBpbnQgbGVuKQoreworCV9fdTMyIGhhc2gsIGhhc2gwID0gMHgxMmEzZmUyZCwgaGFzaDEgPSAweDM3YWJlOGY5OworCWNvbnN0IHNpZ25lZCBjaGFyICpzY3AgPSAoY29uc3Qgc2lnbmVkIGNoYXIgKikgbmFtZTsKKworCXdoaWxlIChsZW4tLSkgeworCQloYXNoID0gaGFzaDEgKyAoaGFzaDAgXiAoKChpbnQpICpzY3ArKykgKiA3MTUyMzczKSk7CisKKwkJaWYgKGhhc2ggJiAweDgwMDAwMDAwKQorCQkJaGFzaCAtPSAweDdmZmZmZmZmOworCQloYXNoMSA9IGhhc2gwOworCQloYXNoMCA9IGhhc2g7CisJfQorCXJldHVybiBoYXNoMCA8PCAxOworfQorCitzdGF0aWMgdm9pZCBzdHIyaGFzaGJ1Zl9zaWduZWQoY29uc3QgY2hhciAqbXNnLCBpbnQgbGVuLCBfX3UzMiAqYnVmLCBpbnQgbnVtKQogewogCV9fdTMyCXBhZCwgdmFsOwogCWludAlpOworCWNvbnN0IHNpZ25lZCBjaGFyICpzY3AgPSAoY29uc3Qgc2lnbmVkIGNoYXIgKikgbXNnOworCisJcGFkID0gKF9fdTMyKWxlbiB8ICgoX191MzIpbGVuIDw8IDgpOworCXBhZCB8PSBwYWQgPDwgMTY7CisKKwl2YWwgPSBwYWQ7CisJaWYgKGxlbiA+IG51bSo0KQorCQlsZW4gPSBudW0gKiA0OworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworCQlpZiAoKGkgJSA0KSA9PSAwKQorCQkJdmFsID0gcGFkOworCQl2YWwgPSAoKGludCkgc2NwW2ldKSArICh2YWwgPDwgOCk7CisJCWlmICgoaSAlIDQpID09IDMpIHsKKwkJCSpidWYrKyA9IHZhbDsKKwkJCXZhbCA9IHBhZDsKKwkJCW51bS0tOworCQl9CisJfQorCWlmICgtLW51bSA+PSAwKQorCQkqYnVmKysgPSB2YWw7CisJd2hpbGUgKC0tbnVtID49IDApCisJCSpidWYrKyA9IHBhZDsKK30KKworc3RhdGljIHZvaWQgc3RyMmhhc2hidWZfdW5zaWduZWQoY29uc3QgY2hhciAqbXNnLCBpbnQgbGVuLCBfX3UzMiAqYnVmLCBpbnQgbnVtKQoreworCV9fdTMyCXBhZCwgdmFsOworCWludAlpOworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnVjcCA9IChjb25zdCB1bnNpZ25lZCBjaGFyICopIG1zZzsKIAogCXBhZCA9IChfX3UzMilsZW4gfCAoKF9fdTMyKWxlbiA8PCA4KTsKIAlwYWQgfD0gcGFkIDw8IDE2OwpAQCAtNjIsNyArMTEwLDcgQEAKIAlmb3IgKGk9MDsgaSA8IGxlbjsgaSsrKSB7CiAJCWlmICgoaSAlIDQpID09IDApCiAJCQl2YWwgPSBwYWQ7Ci0JCXZhbCA9IG1zZ1tpXSArICh2YWwgPDwgOCk7CisJCXZhbCA9ICgoaW50KSB1Y3BbaV0pICsgKHZhbCA8PCA4KTsKIAkJaWYgKChpICUgNCkgPT0gMykgewogCQkJKmJ1ZisrID0gdmFsOwogCQkJdmFsID0gcGFkOwpAQCAtOTUsNiArMTQzLDggQEAKIAljb25zdCBjaGFyCSpwOwogCWludAkJaTsKIAlfX3UzMgkJaW5bOF0sIGJ1Zls0XTsKKwl2b2lkCQkoKnN0cjJoYXNoYnVmKShjb25zdCBjaGFyICosIGludCwgX191MzIgKiwgaW50KSA9CisJCQkJc3RyMmhhc2hidWZfc2lnbmVkOwogCiAJLyogSW5pdGlhbGl6ZSB0aGUgZGVmYXVsdCBzZWVkIGZvciB0aGUgaGFzaCBjaGVja3N1bSBmdW5jdGlvbnMgKi8KIAlidWZbMF0gPSAweDY3NDUyMzAxOwpAQCAtMTEzLDEzICsxNjMsMTggQEAKIAl9CiAKIAlzd2l0Y2ggKGhpbmZvLT5oYXNoX3ZlcnNpb24pIHsKLQljYXNlIERYX0hBU0hfTEVHQUNZOgotCQloYXNoID0gZHhfaGFja19oYXNoKG5hbWUsIGxlbik7CisJY2FzZSBEWF9IQVNIX0xFR0FDWV9VTlNJR05FRDoKKwkJaGFzaCA9IGR4X2hhY2tfaGFzaF91bnNpZ25lZChuYW1lLCBsZW4pOwogCQlicmVhazsKKwljYXNlIERYX0hBU0hfTEVHQUNZOgorCQloYXNoID0gZHhfaGFja19oYXNoX3NpZ25lZChuYW1lLCBsZW4pOworCQlicmVhazsKKwljYXNlIERYX0hBU0hfSEFMRl9NRDRfVU5TSUdORUQ6CisJCXN0cjJoYXNoYnVmID0gc3RyMmhhc2hidWZfdW5zaWduZWQ7CiAJY2FzZSBEWF9IQVNIX0hBTEZfTUQ0OgogCQlwID0gbmFtZTsKIAkJd2hpbGUgKGxlbiA+IDApIHsKLQkJCXN0cjJoYXNoYnVmKHAsIGxlbiwgaW4sIDgpOworCQkJKCpzdHIyaGFzaGJ1ZikocCwgbGVuLCBpbiwgOCk7CiAJCQloYWxmX21kNF90cmFuc2Zvcm0oYnVmLCBpbik7CiAJCQlsZW4gLT0gMzI7CiAJCQlwICs9IDMyOwpAQCAtMTI3LDEwICsxODIsMTIgQEAKIAkJbWlub3JfaGFzaCA9IGJ1ZlsyXTsKIAkJaGFzaCA9IGJ1ZlsxXTsKIAkJYnJlYWs7CisJY2FzZSBEWF9IQVNIX1RFQV9VTlNJR05FRDoKKwkJc3RyMmhhc2hidWYgPSBzdHIyaGFzaGJ1Zl91bnNpZ25lZDsKIAljYXNlIERYX0hBU0hfVEVBOgogCQlwID0gbmFtZTsKIAkJd2hpbGUgKGxlbiA+IDApIHsKLQkJCXN0cjJoYXNoYnVmKHAsIGxlbiwgaW4sIDQpOworCQkJKCpzdHIyaGFzaGJ1ZikocCwgbGVuLCBpbiwgNCk7CiAJCQlURUFfdHJhbnNmb3JtKGJ1ZiwgaW4pOwogCQkJbGVuIC09IDE2OwogCQkJcCArPSAxNjsKZGlmZiAtLWdpdCBhL2ZzL2V4dDMvaWFsbG9jLmMgYi9mcy9leHQzL2lhbGxvYy5jCmluZGV4IDU2NTVmYmMuLjhkZTZjNzIgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDMvaWFsbG9jLmMKKysrIGIvZnMvZXh0My9pYWxsb2MuYwpAQCAtNTU5LDEyICs1NTksOCBAQAogCWVpLT5pX2Rpcl9zdGFydF9sb29rdXAgPSAwOwogCWVpLT5pX2Rpc2tzaXplID0gMDsKIAotCWVpLT5pX2ZsYWdzID0gRVhUM19JKGRpciktPmlfZmxhZ3MgJiB+RVhUM19JTkRFWF9GTDsKLQlpZiAoU19JU0xOSyhtb2RlKSkKLQkJZWktPmlfZmxhZ3MgJj0gfihFWFQzX0lNTVVUQUJMRV9GTHxFWFQzX0FQUEVORF9GTCk7Ci0JLyogZGlyc3luYyBvbmx5IGFwcGxpZXMgdG8gZGlyZWN0b3JpZXMgKi8KLQlpZiAoIVNfSVNESVIobW9kZSkpCi0JCWVpLT5pX2ZsYWdzICY9IH5FWFQzX0RJUlNZTkNfRkw7CisJZWktPmlfZmxhZ3MgPQorCQlleHQzX21hc2tfZmxhZ3MobW9kZSwgRVhUM19JKGRpciktPmlfZmxhZ3MgJiBFWFQzX0ZMX0lOSEVSSVRFRCk7CiAjaWZkZWYgRVhUM19GUkFHTUVOVFMKIAllaS0+aV9mYWRkciA9IDA7CiAJZWktPmlfZnJhZ19ubyA9IDA7CmRpZmYgLS1naXQgYS9mcy9leHQzL2lvY3RsLmMgYi9mcy9leHQzL2lvY3RsLmMKaW5kZXggYjczOTRkMC4uNWU4NmNlOSAxMDA2NDQKLS0tIGEvZnMvZXh0My9pb2N0bC5jCisrKyBiL2ZzL2V4dDMvaW9jdGwuYwpAQCAtNTMsOCArNTMsNyBAQAogCQkJZ290byBmbGFnc19vdXQ7CiAJCX0KIAotCQlpZiAoIVNfSVNESVIoaW5vZGUtPmlfbW9kZSkpCi0JCQlmbGFncyAmPSB+RVhUM19ESVJTWU5DX0ZMOworCQlmbGFncyA9IGV4dDNfbWFza19mbGFncyhpbm9kZS0+aV9tb2RlLCBmbGFncyk7CiAKIAkJbXV0ZXhfbG9jaygmaW5vZGUtPmlfbXV0ZXgpOwogCQkvKiBJcyBpdCBxdW90YSBmaWxlPyBEbyBub3QgYWxsb3cgdXNlciB0byBtZXNzIHdpdGggaXQgKi8KZGlmZiAtLWdpdCBhL2ZzL2V4dDMvbmFtZWkuYyBiL2ZzL2V4dDMvbmFtZWkuYwppbmRleCAxZGQyYWJlLi42OWEzZDE5IDEwMDY0NAotLS0gYS9mcy9leHQzL25hbWVpLmMKKysrIGIvZnMvZXh0My9uYW1laS5jCkBAIC03NCwxMCArNzQsNiBAQAogI2RlZmluZSBhc3NlcnQodGVzdCkgSl9BU1NFUlQodGVzdCkKICNlbmRpZgogCi0jaWZuZGVmIHN3YXAKLSNkZWZpbmUgc3dhcCh4LCB5KSBkbyB7IHR5cGVvZih4KSB6ID0geDsgeCA9IHk7IHkgPSB6OyB9IHdoaWxlICgwKQotI2VuZGlmCi0KICNpZmRlZiBEWF9ERUJVRwogI2RlZmluZSBkeHRyYWNlKGNvbW1hbmQpIGNvbW1hbmQKICNlbHNlCkBAIC0zNjgsNiArMzY0LDggQEAKIAkJZ290byBmYWlsOwogCX0KIAloaW5mby0+aGFzaF92ZXJzaW9uID0gcm9vdC0+aW5mby5oYXNoX3ZlcnNpb247CisJaWYgKGhpbmZvLT5oYXNoX3ZlcnNpb24gPD0gRFhfSEFTSF9URUEpCisJCWhpbmZvLT5oYXNoX3ZlcnNpb24gKz0gRVhUM19TQihkaXItPmlfc2IpLT5zX2hhc2hfdW5zaWduZWQ7CiAJaGluZm8tPnNlZWQgPSBFWFQzX1NCKGRpci0+aV9zYiktPnNfaGFzaF9zZWVkOwogCWlmIChlbnRyeSkKIAkJZXh0M2ZzX2Rpcmhhc2goZW50cnktPm5hbWUsIGVudHJ5LT5sZW4sIGhpbmZvKTsKQEAgLTYzNiw2ICs2MzQsOSBAQAogCWRpciA9IGRpcl9maWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwogCWlmICghKEVYVDNfSShkaXIpLT5pX2ZsYWdzICYgRVhUM19JTkRFWF9GTCkpIHsKIAkJaGluZm8uaGFzaF92ZXJzaW9uID0gRVhUM19TQihkaXItPmlfc2IpLT5zX2RlZl9oYXNoX3ZlcnNpb247CisJCWlmIChoaW5mby5oYXNoX3ZlcnNpb24gPD0gRFhfSEFTSF9URUEpCisJCQloaW5mby5oYXNoX3ZlcnNpb24gKz0KKwkJCQlFWFQzX1NCKGRpci0+aV9zYiktPnNfaGFzaF91bnNpZ25lZDsKIAkJaGluZm8uc2VlZCA9IEVYVDNfU0IoZGlyLT5pX3NiKS0+c19oYXNoX3NlZWQ7CiAJCWNvdW50ID0gaHRyZWVfZGlyYmxvY2tfdG9fdHJlZShkaXJfZmlsZSwgZGlyLCAwLCAmaGluZm8sCiAJCQkJCSAgICAgICBzdGFydF9oYXNoLCBzdGFydF9taW5vcl9oYXNoKTsKQEAgLTExNTYsOSArMTE1Nyw5IEBACiAJdTMyIGhhc2gyOwogCXN0cnVjdCBkeF9tYXBfZW50cnkgKm1hcDsKIAljaGFyICpkYXRhMSA9ICgqYmgpLT5iX2RhdGEsICpkYXRhMjsKLQl1bnNpZ25lZCBzcGxpdCwgbW92ZSwgc2l6ZSwgaTsKKwl1bnNpZ25lZCBzcGxpdCwgbW92ZSwgc2l6ZTsKIAlzdHJ1Y3QgZXh0M19kaXJfZW50cnlfMiAqZGUgPSBOVUxMLCAqZGUyOwotCWludAllcnIgPSAwOworCWludAllcnIgPSAwLCBpOwogCiAJYmgyID0gZXh0M19hcHBlbmQgKGhhbmRsZSwgZGlyLCAmbmV3YmxvY2ssICZlcnIpOwogCWlmICghKGJoMikpIHsKQEAgLTEzOTgsNiArMTM5OSw4IEBACiAKIAkvKiBJbml0aWFsaXplIGFzIGZvciBkeF9wcm9iZSAqLwogCWhpbmZvLmhhc2hfdmVyc2lvbiA9IHJvb3QtPmluZm8uaGFzaF92ZXJzaW9uOworCWlmIChoaW5mby5oYXNoX3ZlcnNpb24gPD0gRFhfSEFTSF9URUEpCisJCWhpbmZvLmhhc2hfdmVyc2lvbiArPSBFWFQzX1NCKGRpci0+aV9zYiktPnNfaGFzaF91bnNpZ25lZDsKIAloaW5mby5zZWVkID0gRVhUM19TQihkaXItPmlfc2IpLT5zX2hhc2hfc2VlZDsKIAlleHQzZnNfZGlyaGFzaChuYW1lLCBuYW1lbGVuLCAmaGluZm8pOwogCWZyYW1lID0gZnJhbWVzOwpkaWZmIC0tZ2l0IGEvZnMvZXh0My9zdXBlci5jIGIvZnMvZXh0My9zdXBlci5jCmluZGV4IGY2Yzk0ZjIuLjVkMDQ3YTAgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDMvc3VwZXIuYworKysgYi9mcy9leHQzL3N1cGVyLmMKQEAgLTQzOSw2ICs0MzksNyBAQAogCQlleHQzX2Jsa2Rldl9yZW1vdmUoc2JpKTsKIAl9CiAJc2ItPnNfZnNfaW5mbyA9IE5VTEw7CisJa2ZyZWUoc2JpLT5zX2Jsb2NrZ3JvdXBfbG9jayk7CiAJa2ZyZWUoc2JpKTsKIAlyZXR1cm47CiB9CkBAIC02ODIsNiArNjgzLDI2IEBACiAJCQkJICAgIGV4dDNfbmZzX2dldF9pbm9kZSk7CiB9CiAKKy8qCisgKiBUcnkgdG8gcmVsZWFzZSBtZXRhZGF0YSBwYWdlcyAoaW5kaXJlY3QgYmxvY2tzLCBkaXJlY3Rvcmllcykgd2hpY2ggYXJlCisgKiBtYXBwZWQgdmlhIHRoZSBibG9jayBkZXZpY2UuICBTaW5jZSB0aGVzZSBwYWdlcyBjb3VsZCBoYXZlIGpvdXJuYWwgaGVhZHMKKyAqIHdoaWNoIHdvdWxkIHByZXZlbnQgdHJ5X3RvX2ZyZWVfYnVmZmVycygpIGZyb20gZnJlZWluZyB0aGVtLCB3ZSBtdXN0IHVzZQorICogamJkIGxheWVyJ3MgdHJ5X3RvX2ZyZWVfYnVmZmVycygpIGZ1bmN0aW9uIHRvIHJlbGVhc2UgdGhlbS4KKyAqLworc3RhdGljIGludCBiZGV2X3RyeV90b19mcmVlX3BhZ2Uoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IHBhZ2UgKnBhZ2UsCisJCQkJIGdmcF90IHdhaXQpCit7CisJam91cm5hbF90ICpqb3VybmFsID0gRVhUM19TQihzYiktPnNfam91cm5hbDsKKworCVdBUk5fT04oUGFnZUNoZWNrZWQocGFnZSkpOworCWlmICghcGFnZV9oYXNfYnVmZmVycyhwYWdlKSkKKwkJcmV0dXJuIDA7CisJaWYgKGpvdXJuYWwpCisJCXJldHVybiBqb3VybmFsX3RyeV90b19mcmVlX2J1ZmZlcnMoam91cm5hbCwgcGFnZSwgCisJCQkJCQkgICB3YWl0ICYgfl9fR0ZQX1dBSVQpOworCXJldHVybiB0cnlfdG9fZnJlZV9idWZmZXJzKHBhZ2UpOworfQorCiAjaWZkZWYgQ09ORklHX1FVT1RBCiAjZGVmaW5lIFFUWVBFMk5BTUUodCkgKCh0KT09VVNSUVVPVEE/InVzZXIiOiJncm91cCIpCiAjZGVmaW5lIFFUWVBFMk1PUFQob24sIHQpICgodCk9PVVTUlFVT1RBPygob24pIyNVU1JKUVVPVEEpOigob24pIyNHUlBKUVVPVEEpKQpAQCAtNzEzLDcgKzczNCw5IEBACiAJLmFjcXVpcmVfZHF1b3QJPSBleHQzX2FjcXVpcmVfZHF1b3QsCiAJLnJlbGVhc2VfZHF1b3QJPSBleHQzX3JlbGVhc2VfZHF1b3QsCiAJLm1hcmtfZGlydHkJPSBleHQzX21hcmtfZHF1b3RfZGlydHksCi0JLndyaXRlX2luZm8JPSBleHQzX3dyaXRlX2luZm8KKwkud3JpdGVfaW5mbwk9IGV4dDNfd3JpdGVfaW5mbywKKwkuYWxsb2NfZHF1b3QJPSBkcXVvdF9hbGxvYywKKwkuZGVzdHJveV9kcXVvdAk9IGRxdW90X2Rlc3Ryb3ksCiB9OwogCiBzdGF0aWMgc3RydWN0IHF1b3RhY3RsX29wcyBleHQzX3FjdGxfb3BlcmF0aW9ucyA9IHsKQEAgLTc0Niw2ICs3NjksNyBAQAogCS5xdW90YV9yZWFkCT0gZXh0M19xdW90YV9yZWFkLAogCS5xdW90YV93cml0ZQk9IGV4dDNfcXVvdGFfd3JpdGUsCiAjZW5kaWYKKwkuYmRldl90cnlfdG9fZnJlZV9wYWdlID0gYmRldl90cnlfdG9fZnJlZV9wYWdlLAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBleHBvcnRfb3BlcmF0aW9ucyBleHQzX2V4cG9ydF9vcHMgPSB7CkBAIC0xMDM1LDggKzEwNTksNyBAQAogCQljYXNlIE9wdF9ncnBqcXVvdGE6CiAJCQlxdHlwZSA9IEdSUFFVT1RBOwogc2V0X3FmX25hbWU6Ci0JCQlpZiAoKHNiX2FueV9xdW90YV9lbmFibGVkKHNiKSB8fAotCQkJICAgICBzYl9hbnlfcXVvdGFfc3VzcGVuZGVkKHNiKSkgJiYKKwkJCWlmIChzYl9hbnlfcXVvdGFfbG9hZGVkKHNiKSAmJgogCQkJICAgICFzYmktPnNfcWZfbmFtZXNbcXR5cGVdKSB7CiAJCQkJcHJpbnRrKEtFUk5fRVJSCiAJCQkJCSJFWFQzLWZzOiBDYW5ub3QgY2hhbmdlIGpvdXJuYWxlZCAiCkBAIC0xMDc1LDggKzEwOTgsNyBAQAogCQljYXNlIE9wdF9vZmZncnBqcXVvdGE6CiAJCQlxdHlwZSA9IEdSUFFVT1RBOwogY2xlYXJfcWZfbmFtZToKLQkJCWlmICgoc2JfYW55X3F1b3RhX2VuYWJsZWQoc2IpIHx8Ci0JCQkgICAgIHNiX2FueV9xdW90YV9zdXNwZW5kZWQoc2IpKSAmJgorCQkJaWYgKHNiX2FueV9xdW90YV9sb2FkZWQoc2IpICYmCiAJCQkgICAgc2JpLT5zX3FmX25hbWVzW3F0eXBlXSkgewogCQkJCXByaW50ayhLRVJOX0VSUiAiRVhUMy1mczogQ2Fubm90IGNoYW5nZSAiCiAJCQkJCSJqb3VybmFsZWQgcXVvdGEgb3B0aW9ucyB3aGVuICIKQEAgLTEwOTUsOCArMTExNyw3IEBACiAJCWNhc2UgT3B0X2pxZm10X3Zmc3YwOgogCQkJcWZtdCA9IFFGTVRfVkZTX1YwOwogc2V0X3FmX2Zvcm1hdDoKLQkJCWlmICgoc2JfYW55X3F1b3RhX2VuYWJsZWQoc2IpIHx8Ci0JCQkgICAgIHNiX2FueV9xdW90YV9zdXNwZW5kZWQoc2IpKSAmJgorCQkJaWYgKHNiX2FueV9xdW90YV9sb2FkZWQoc2IpICYmCiAJCQkgICAgc2JpLT5zX2pxdW90YV9mbXQgIT0gcWZtdCkgewogCQkJCXByaW50ayhLRVJOX0VSUiAiRVhUMy1mczogQ2Fubm90IGNoYW5nZSAiCiAJCQkJCSJqb3VybmFsZWQgcXVvdGEgb3B0aW9ucyB3aGVuICIKQEAgLTExMTUsOCArMTEzNiw3IEBACiAJCQlzZXRfb3B0KHNiaS0+c19tb3VudF9vcHQsIEdSUFFVT1RBKTsKIAkJCWJyZWFrOwogCQljYXNlIE9wdF9ub3F1b3RhOgotCQkJaWYgKHNiX2FueV9xdW90YV9lbmFibGVkKHNiKSB8fAotCQkJICAgIHNiX2FueV9xdW90YV9zdXNwZW5kZWQoc2IpKSB7CisJCQlpZiAoc2JfYW55X3F1b3RhX2xvYWRlZChzYikpIHsKIAkJCQlwcmludGsoS0VSTl9FUlIgIkVYVDMtZnM6IENhbm5vdCBjaGFuZ2UgcXVvdGEgIgogCQkJCQkib3B0aW9ucyB3aGVuIHF1b3RhIHR1cm5lZCBvbi5cbiIpOwogCQkJCXJldHVybiAwOwpAQCAtMTU0OCw2ICsxNTY4LDEzIEBACiAJc2JpID0ga3phbGxvYyhzaXplb2YoKnNiaSksIEdGUF9LRVJORUwpOwogCWlmICghc2JpKQogCQlyZXR1cm4gLUVOT01FTTsKKworCXNiaS0+c19ibG9ja2dyb3VwX2xvY2sgPQorCQlremFsbG9jKHNpemVvZihzdHJ1Y3QgYmxvY2tncm91cF9sb2NrKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzYmktPnNfYmxvY2tncm91cF9sb2NrKSB7CisJCWtmcmVlKHNiaSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KIAlzYi0+c19mc19pbmZvID0gc2JpOwogCXNiaS0+c19tb3VudF9vcHQgPSAwOwogCXNiaS0+c19yZXN1aWQgPSBFWFQzX0RFRl9SRVNVSUQ7CkBAIC0xNzQ0LDYgKzE3NzEsMTggQEAKIAlmb3IgKGk9MDsgaSA8IDQ7IGkrKykKIAkJc2JpLT5zX2hhc2hfc2VlZFtpXSA9IGxlMzJfdG9fY3B1KGVzLT5zX2hhc2hfc2VlZFtpXSk7CiAJc2JpLT5zX2RlZl9oYXNoX3ZlcnNpb24gPSBlcy0+c19kZWZfaGFzaF92ZXJzaW9uOworCWkgPSBsZTMyX3RvX2NwdShlcy0+c19mbGFncyk7CisJaWYgKGkgJiBFWFQyX0ZMQUdTX1VOU0lHTkVEX0hBU0gpCisJCXNiaS0+c19oYXNoX3Vuc2lnbmVkID0gMzsKKwllbHNlIGlmICgoaSAmIEVYVDJfRkxBR1NfU0lHTkVEX0hBU0gpID09IDApIHsKKyNpZmRlZiBfX0NIQVJfVU5TSUdORURfXworCQllcy0+c19mbGFncyB8PSBjcHVfdG9fbGUzMihFWFQyX0ZMQUdTX1VOU0lHTkVEX0hBU0gpOworCQlzYmktPnNfaGFzaF91bnNpZ25lZCA9IDM7CisjZWxzZQorCQllcy0+c19mbGFncyB8PSBjcHVfdG9fbGUzMihFWFQyX0ZMQUdTX1NJR05FRF9IQVNIKTsKKyNlbmRpZgorCQlzYi0+c19kaXJ0ID0gMTsKKwl9CiAKIAlpZiAoc2JpLT5zX2Jsb2Nrc19wZXJfZ3JvdXAgPiBibG9ja3NpemUgKiA4KSB7CiAJCXByaW50ayAoS0VSTl9FUlIKQEAgLTE3ODgsNyArMTgyNyw3IEBACiAJCWdvdG8gZmFpbGVkX21vdW50OwogCX0KIAotCWJnbF9sb2NrX2luaXQoJnNiaS0+c19ibG9ja2dyb3VwX2xvY2spOworCWJnbF9sb2NrX2luaXQoc2JpLT5zX2Jsb2NrZ3JvdXBfbG9jayk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgZGJfY291bnQ7IGkrKykgewogCQlibG9jayA9IGRlc2NyaXB0b3JfbG9jKHNiLCBsb2dpY19zYl9ibG9jaywgaSk7CmRpZmYgLS1naXQgYS9mcy9leHQ0L2JhbGxvYy5jIGIvZnMvZXh0NC9iYWxsb2MuYwppbmRleCAzOGIzYWNmLi42YmJhMDZiIDEwMDY0NAotLS0gYS9mcy9leHQ0L2JhbGxvYy5jCisrKyBiL2ZzL2V4dDQvYmFsbG9jLmMKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlICJleHQ0LmgiCiAjaW5jbHVkZSAiZXh0NF9qYmQyLmgiCiAjaW5jbHVkZSAiZ3JvdXAuaCIKKyNpbmNsdWRlICJtYmFsbG9jLmgiCiAKIC8qCiAgKiBiYWxsb2MuYyBjb250YWlucyB0aGUgYmxvY2tzIGFsbG9jYXRpb24gYW5kIGRlYWxsb2NhdGlvbiByb3V0aW5lcwpAQCAtMTAwLDEwICsxMDEsMTAgQEAKIAkJICogZXNzZW50aWFsbHkgaW1wbGVtZW50aW5nIGEgcGVyLWdyb3VwIHJlYWQtb25seSBmbGFnLiAqLwogCQlpZiAoIWV4dDRfZ3JvdXBfZGVzY19jc3VtX3ZlcmlmeShzYmksIGJsb2NrX2dyb3VwLCBnZHApKSB7CiAJCQlleHQ0X2Vycm9yKHNiLCBfX2Z1bmNfXywKLQkJCQkgICJDaGVja3N1bSBiYWQgZm9yIGdyb3VwICVsdVxuIiwgYmxvY2tfZ3JvdXApOwotCQkJZ2RwLT5iZ19mcmVlX2Jsb2Nrc19jb3VudCA9IDA7Ci0JCQlnZHAtPmJnX2ZyZWVfaW5vZGVzX2NvdW50ID0gMDsKLQkJCWdkcC0+YmdfaXRhYmxlX3VudXNlZCA9IDA7CisJCQkJICAiQ2hlY2tzdW0gYmFkIGZvciBncm91cCAldSIsIGJsb2NrX2dyb3VwKTsKKwkJCWV4dDRfZnJlZV9ibGtzX3NldChzYiwgZ2RwLCAwKTsKKwkJCWV4dDRfZnJlZV9pbm9kZXNfc2V0KHNiLCBnZHAsIDApOworCQkJZXh0NF9pdGFibGVfdW51c2VkX3NldChzYiwgZ2RwLCAwKTsKIAkJCW1lbXNldChiaC0+Yl9kYXRhLCAweGZmLCBzYi0+c19ibG9ja3NpemUpOwogCQkJcmV0dXJuIDA7CiAJCX0KQEAgLTIwNSwxNSArMjA2LDE1IEBACiAJCQkJCSAgICAgZXh0NF9ncm91cF90IGJsb2NrX2dyb3VwLAogCQkJCQkgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqKmJoKQogewotCXVuc2lnbmVkIGxvbmcgZ3JvdXBfZGVzYzsKLQl1bnNpZ25lZCBsb25nIG9mZnNldDsKKwl1bnNpZ25lZCBpbnQgZ3JvdXBfZGVzYzsKKwl1bnNpZ25lZCBpbnQgb2Zmc2V0OwogCXN0cnVjdCBleHQ0X2dyb3VwX2Rlc2MgKmRlc2M7CiAJc3RydWN0IGV4dDRfc2JfaW5mbyAqc2JpID0gRVhUNF9TQihzYik7CiAKIAlpZiAoYmxvY2tfZ3JvdXAgPj0gc2JpLT5zX2dyb3Vwc19jb3VudCkgewogCQlleHQ0X2Vycm9yKHNiLCAiZXh0NF9nZXRfZ3JvdXBfZGVzYyIsCiAJCQkgICAiYmxvY2tfZ3JvdXAgPj0gZ3JvdXBzX2NvdW50IC0gIgotCQkJICAgImJsb2NrX2dyb3VwID0gJWx1LCBncm91cHNfY291bnQgPSAlbHUiLAorCQkJICAgImJsb2NrX2dyb3VwID0gJXUsIGdyb3Vwc19jb3VudCA9ICV1IiwKIAkJCSAgIGJsb2NrX2dyb3VwLCBzYmktPnNfZ3JvdXBzX2NvdW50KTsKIAogCQlyZXR1cm4gTlVMTDsKQEAgLTIyNSw3ICsyMjYsNyBAQAogCWlmICghc2JpLT5zX2dyb3VwX2Rlc2NbZ3JvdXBfZGVzY10pIHsKIAkJZXh0NF9lcnJvcihzYiwgImV4dDRfZ2V0X2dyb3VwX2Rlc2MiLAogCQkJICAgIkdyb3VwIGRlc2NyaXB0b3Igbm90IGxvYWRlZCAtICIKLQkJCSAgICJibG9ja19ncm91cCA9ICVsdSwgZ3JvdXBfZGVzYyA9ICVsdSwgZGVzYyA9ICVsdSIsCisJCQkgICAiYmxvY2tfZ3JvdXAgPSAldSwgZ3JvdXBfZGVzYyA9ICV1LCBkZXNjID0gJXUiLAogCQkJICAgYmxvY2tfZ3JvdXAsIGdyb3VwX2Rlc2MsIG9mZnNldCk7CiAJCXJldHVybiBOVUxMOwogCX0KQEAgLTMxNSwyOSArMzE2LDUwIEBACiAJaWYgKHVubGlrZWx5KCFiaCkpIHsKIAkJZXh0NF9lcnJvcihzYiwgX19mdW5jX18sCiAJCQkgICAgIkNhbm5vdCByZWFkIGJsb2NrIGJpdG1hcCAtICIKLQkJCSAgICAiYmxvY2tfZ3JvdXAgPSAlbHUsIGJsb2NrX2JpdG1hcCA9ICVsbHUiLAorCQkJICAgICJibG9ja19ncm91cCA9ICV1LCBibG9ja19iaXRtYXAgPSAlbGx1IiwKIAkJCSAgICBibG9ja19ncm91cCwgYml0bWFwX2Jsayk7CiAJCXJldHVybiBOVUxMOwogCX0KLQlpZiAoYnVmZmVyX3VwdG9kYXRlKGJoKSAmJgotCSAgICAhKGRlc2MtPmJnX2ZsYWdzICYgY3B1X3RvX2xlMTYoRVhUNF9CR19CTE9DS19VTklOSVQpKSkKKworCWlmIChiaXRtYXBfdXB0b2RhdGUoYmgpKQogCQlyZXR1cm4gYmg7CiAKIAlsb2NrX2J1ZmZlcihiaCk7CisJaWYgKGJpdG1hcF91cHRvZGF0ZShiaCkpIHsKKwkJdW5sb2NrX2J1ZmZlcihiaCk7CisJCXJldHVybiBiaDsKKwl9CiAJc3Bpbl9sb2NrKHNiX2JnbF9sb2NrKEVYVDRfU0Ioc2IpLCBibG9ja19ncm91cCkpOwogCWlmIChkZXNjLT5iZ19mbGFncyAmIGNwdV90b19sZTE2KEVYVDRfQkdfQkxPQ0tfVU5JTklUKSkgewogCQlleHQ0X2luaXRfYmxvY2tfYml0bWFwKHNiLCBiaCwgYmxvY2tfZ3JvdXAsIGRlc2MpOworCQlzZXRfYml0bWFwX3VwdG9kYXRlKGJoKTsKIAkJc2V0X2J1ZmZlcl91cHRvZGF0ZShiaCk7Ci0JCXVubG9ja19idWZmZXIoYmgpOwogCQlzcGluX3VubG9jayhzYl9iZ2xfbG9jayhFWFQ0X1NCKHNiKSwgYmxvY2tfZ3JvdXApKTsKKwkJdW5sb2NrX2J1ZmZlcihiaCk7CiAJCXJldHVybiBiaDsKIAl9CiAJc3Bpbl91bmxvY2soc2JfYmdsX2xvY2soRVhUNF9TQihzYiksIGJsb2NrX2dyb3VwKSk7CisJaWYgKGJ1ZmZlcl91cHRvZGF0ZShiaCkpIHsKKwkJLyoKKwkJICogaWYgbm90IHVuaW5pdCBpZiBiaCBpcyB1cHRvZGF0ZSwKKwkJICogYml0bWFwIGlzIGFsc28gdXB0b2RhdGUKKwkJICovCisJCXNldF9iaXRtYXBfdXB0b2RhdGUoYmgpOworCQl1bmxvY2tfYnVmZmVyKGJoKTsKKwkJcmV0dXJuIGJoOworCX0KKwkvKgorCSAqIHN1Ym1pdCB0aGUgYnVmZmVyX2hlYWQgZm9yIHJlYWQuIFdlIGNhbgorCSAqIHNhZmVseSBtYXJrIHRoZSBiaXRtYXAgYXMgdXB0b2RhdGUgbm93LgorCSAqIFdlIGRvIGl0IGhlcmUgc28gdGhlIGJpdG1hcCB1cHRvZGF0ZSBiaXQKKwkgKiBnZXQgc2V0IHdpdGggYnVmZmVyIGxvY2sgaGVsZC4KKwkgKi8KKwlzZXRfYml0bWFwX3VwdG9kYXRlKGJoKTsKIAlpZiAoYmhfc3VibWl0X3JlYWQoYmgpIDwgMCkgewogCQlwdXRfYmgoYmgpOwogCQlleHQ0X2Vycm9yKHNiLCBfX2Z1bmNfXywKIAkJCSAgICAiQ2Fubm90IHJlYWQgYmxvY2sgYml0bWFwIC0gIgotCQkJICAgICJibG9ja19ncm91cCA9ICVsdSwgYmxvY2tfYml0bWFwID0gJWxsdSIsCisJCQkgICAgImJsb2NrX2dyb3VwID0gJXUsIGJsb2NrX2JpdG1hcCA9ICVsbHUiLAogCQkJICAgIGJsb2NrX2dyb3VwLCBiaXRtYXBfYmxrKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQpAQCAtMzUwLDYyICszNzIsNDQgQEAKIH0KIAogLyoqCi0gKiBleHQ0X2ZyZWVfYmxvY2tzX3NiKCkgLS0gRnJlZSBnaXZlbiBibG9ja3MgYW5kIHVwZGF0ZSBxdW90YQorICogZXh0NF9hZGRfZ3JvdXBibG9ja3MoKSAtLSBBZGQgZ2l2ZW4gYmxvY2tzIHRvIGFuIGV4aXN0aW5nIGdyb3VwCiAgKiBAaGFuZGxlOgkJCWhhbmRsZSB0byB0aGlzIHRyYW5zYWN0aW9uCiAgKiBAc2I6CQkJCXN1cGVyIGJsb2NrCi0gKiBAYmxvY2s6CQkJc3RhcnQgcGh5c2NpYWwgYmxvY2sgdG8gZnJlZQorICogQGJsb2NrOgkJCXN0YXJ0IHBoeXNjaWFsIGJsb2NrIHRvIGFkZCB0byB0aGUgYmxvY2sgZ3JvdXAKICAqIEBjb3VudDoJCQludW1iZXIgb2YgYmxvY2tzIHRvIGZyZWUKLSAqIEBwZHF1b3RfZnJlZWRfYmxvY2tzOglwb2ludGVyIHRvIHF1b3RhCiAgKgotICogWFhYIFRoaXMgZnVuY3Rpb24gaXMgb25seSB1c2VkIGJ5IHRoZSBvbi1saW5lIHJlc2l6aW5nIGNvZGUsIHdoaWNoCi0gKiBzaG91bGQgcHJvYmFibHkgYmUgZml4ZWQgdXAgdG8gY2FsbCB0aGUgbWJhbGxvYyB2YXJpYW50LiAgVGhlcmUKLSAqIHRoaXMgbmVlZHMgdG8gYmUgY2xlYW5lZCB1cCBsYXRlcjsgaW4gZmFjdCwgSSdtIG5vdCBjb252aW5jZWQgdGhpcwotICogaXMgMTAwJSBjb3JyZWN0IGluIHRoZSBmYWNlIG9mIHRoZSBtYmFsbG9jIGNvZGUuICBUaGUgb25saW5lIHJlc2l6aW5nCi0gKiBjb2RlIG5lZWRzIHRvIGJlIGZpeGVkIHVwIHRvIG1vcmUgdGlnaHRseSAoYW5kIGNvcnJlY3RseSkgaW50ZXJsb2NrCi0gKiB3aXRoIHRoZSBtYmFsbG9jIGNvZGUuCisgKiBUaGlzIG1hcmtzIHRoZSBibG9ja3MgYXMgZnJlZSBpbiB0aGUgYml0bWFwLiBXZSBhc2sgdGhlCisgKiBtYmFsbG9jIHRvIHJlbG9hZCB0aGUgYnVkZHkgYWZ0ZXIgdGhpcyBieSBzZXR0aW5nIGdyb3VwCisgKiBFWFQ0X0dST1VQX0lORk9fTkVFRF9JTklUX0JJVCBmbGFnCiAgKi8KLXZvaWQgZXh0NF9mcmVlX2Jsb2Nrc19zYihoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAotCQkJIGV4dDRfZnNibGtfdCBibG9jaywgdW5zaWduZWQgbG9uZyBjb3VudCwKLQkJCSB1bnNpZ25lZCBsb25nICpwZHF1b3RfZnJlZWRfYmxvY2tzKQordm9pZCBleHQ0X2FkZF9ncm91cGJsb2NrcyhoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQkJIGV4dDRfZnNibGtfdCBibG9jaywgdW5zaWduZWQgbG9uZyBjb3VudCkKIHsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJpdG1hcF9iaCA9IE5VTEw7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpnZF9iaDsKIAlleHQ0X2dyb3VwX3QgYmxvY2tfZ3JvdXA7CiAJZXh0NF9ncnBibGtfdCBiaXQ7Ci0JdW5zaWduZWQgbG9uZyBpOwotCXVuc2lnbmVkIGxvbmcgb3ZlcmZsb3c7CisJdW5zaWduZWQgaW50IGk7CiAJc3RydWN0IGV4dDRfZ3JvdXBfZGVzYyAqZGVzYzsKIAlzdHJ1Y3QgZXh0NF9zdXBlcl9ibG9jayAqZXM7CiAJc3RydWN0IGV4dDRfc2JfaW5mbyAqc2JpOwotCWludCBlcnIgPSAwLCByZXQ7Ci0JZXh0NF9ncnBibGtfdCBncm91cF9mcmVlZDsKKwlpbnQgZXJyID0gMCwgcmV0LCBibGtfZnJlZV9jb3VudDsKKwlleHQ0X2dycGJsa190IGJsb2Nrc19mcmVlZDsKKwlzdHJ1Y3QgZXh0NF9ncm91cF9pbmZvICpncnA7CiAKLQkqcGRxdW90X2ZyZWVkX2Jsb2NrcyA9IDA7CiAJc2JpID0gRVhUNF9TQihzYik7CiAJZXMgPSBzYmktPnNfZXM7Ci0JaWYgKGJsb2NrIDwgbGUzMl90b19jcHUoZXMtPnNfZmlyc3RfZGF0YV9ibG9jaykgfHwKLQkgICAgYmxvY2sgKyBjb3VudCA8IGJsb2NrIHx8Ci0JICAgIGJsb2NrICsgY291bnQgPiBleHQ0X2Jsb2Nrc19jb3VudChlcykpIHsKLQkJZXh0NF9lcnJvcihzYiwgImV4dDRfZnJlZV9ibG9ja3MiLAotCQkJICAgIkZyZWVpbmcgYmxvY2tzIG5vdCBpbiBkYXRhem9uZSAtICIKLQkJCSAgICJibG9jayA9ICVsbHUsIGNvdW50ID0gJWx1IiwgYmxvY2ssIGNvdW50KTsKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0JfQorCWV4dDRfZGVidWcoIkFkZGluZyBibG9jayhzKSAlbGx1LSVsbHVcbiIsIGJsb2NrLCBibG9jayArIGNvdW50IC0gMSk7CiAKLQlleHQ0X2RlYnVnKCJmcmVlaW5nIGJsb2NrKHMpICVsbHUtJWxsdVxuIiwgYmxvY2ssIGJsb2NrICsgY291bnQgLSAxKTsKLQotZG9fbW9yZToKLQlvdmVyZmxvdyA9IDA7CiAJZXh0NF9nZXRfZ3JvdXBfbm9fYW5kX29mZnNldChzYiwgYmxvY2ssICZibG9ja19ncm91cCwgJmJpdCk7CisJZ3JwID0gZXh0NF9nZXRfZ3JvdXBfaW5mbyhzYiwgYmxvY2tfZ3JvdXApOwogCS8qCiAJICogQ2hlY2sgdG8gc2VlIGlmIHdlIGFyZSBmcmVlaW5nIGJsb2NrcyBhY3Jvc3MgYSBncm91cAogCSAqIGJvdW5kYXJ5LgogCSAqLwogCWlmIChiaXQgKyBjb3VudCA+IEVYVDRfQkxPQ0tTX1BFUl9HUk9VUChzYikpIHsKLQkJb3ZlcmZsb3cgPSBiaXQgKyBjb3VudCAtIEVYVDRfQkxPQ0tTX1BFUl9HUk9VUChzYik7Ci0JCWNvdW50IC09IG92ZXJmbG93OworCQlnb3RvIGVycm9yX3JldHVybjsKIAl9Ci0JYnJlbHNlKGJpdG1hcF9iaCk7CiAJYml0bWFwX2JoID0gZXh0NF9yZWFkX2Jsb2NrX2JpdG1hcChzYiwgYmxvY2tfZ3JvdXApOwogCWlmICghYml0bWFwX2JoKQogCQlnb3RvIGVycm9yX3JldHVybjsKQEAgLTQxOCwxOCArNDIyLDE3IEBACiAJICAgIGluX3JhbmdlKGJsb2NrLCBleHQ0X2lub2RlX3RhYmxlKHNiLCBkZXNjKSwgc2JpLT5zX2l0Yl9wZXJfZ3JvdXApIHx8CiAJICAgIGluX3JhbmdlKGJsb2NrICsgY291bnQgLSAxLCBleHQ0X2lub2RlX3RhYmxlKHNiLCBkZXNjKSwKIAkJICAgICBzYmktPnNfaXRiX3Blcl9ncm91cCkpIHsKLQkJZXh0NF9lcnJvcihzYiwgImV4dDRfZnJlZV9ibG9ja3MiLAotCQkJICAgIkZyZWVpbmcgYmxvY2tzIGluIHN5c3RlbSB6b25lcyAtICIKKwkJZXh0NF9lcnJvcihzYiwgX19mdW5jX18sCisJCQkgICAiQWRkaW5nIGJsb2NrcyBpbiBzeXN0ZW0gem9uZXMgLSAiCiAJCQkgICAiQmxvY2sgPSAlbGx1LCBjb3VudCA9ICVsdSIsCiAJCQkgICBibG9jaywgY291bnQpOwogCQlnb3RvIGVycm9yX3JldHVybjsKIAl9CiAKIAkvKgotCSAqIFdlIGFyZSBhYm91dCB0byBzdGFydCByZWxlYXNpbmcgYmxvY2tzIGluIHRoZSBiaXRtYXAsCisJICogV2UgYXJlIGFib3V0IHRvIGFkZCBibG9ja3MgdG8gdGhlIGJpdG1hcCwKIAkgKiBzbyB3ZSBuZWVkIHVuZG8gYWNjZXNzLgogCSAqLwotCS8qIEBAQCBjaGVjayBlcnJvcnMgKi8KIAlCVUZGRVJfVFJBQ0UoYml0bWFwX2JoLCAiZ2V0dGluZyB1bmRvIGFjY2VzcyIpOwogCWVyciA9IGV4dDRfam91cm5hbF9nZXRfdW5kb19hY2Nlc3MoaGFuZGxlLCBiaXRtYXBfYmgpOwogCWlmIChlcnIpCkBAIC00NDQsMTA3ICs0NDcsNTUgQEAKIAllcnIgPSBleHQ0X2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGUsIGdkX2JoKTsKIAlpZiAoZXJyKQogCQlnb3RvIGVycm9yX3JldHVybjsKLQotCWpiZF9sb2NrX2JoX3N0YXRlKGJpdG1hcF9iaCk7Ci0KLQlmb3IgKGkgPSAwLCBncm91cF9mcmVlZCA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCS8qCi0JCSAqIEFuIEhKIHNwZWNpYWwuICBUaGlzIGlzIGV4cGVuc2l2ZS4uLgotCQkgKi8KLSNpZmRlZiBDT05GSUdfSkJEMl9ERUJVRwotCQlqYmRfdW5sb2NrX2JoX3N0YXRlKGJpdG1hcF9iaCk7Ci0JCXsKLQkJCXN0cnVjdCBidWZmZXJfaGVhZCAqZGVidWdfYmg7Ci0JCQlkZWJ1Z19iaCA9IHNiX2ZpbmRfZ2V0X2Jsb2NrKHNiLCBibG9jayArIGkpOwotCQkJaWYgKGRlYnVnX2JoKSB7Ci0JCQkJQlVGRkVSX1RSQUNFKGRlYnVnX2JoLCAiRGVsZXRlZCEiKTsKLQkJCQlpZiAoIWJoMmpoKGJpdG1hcF9iaCktPmJfY29tbWl0dGVkX2RhdGEpCi0JCQkJCUJVRkZFUl9UUkFDRShkZWJ1Z19iaCwKLQkJCQkJCSJObyBjb21taXRlZCBkYXRhIGluIGJpdG1hcCIpOwotCQkJCUJVRkZFUl9UUkFDRTIoZGVidWdfYmgsIGJpdG1hcF9iaCwgImJpdG1hcCIpOwotCQkJCV9fYnJlbHNlKGRlYnVnX2JoKTsKLQkJCX0KLQkJfQotCQlqYmRfbG9ja19iaF9zdGF0ZShiaXRtYXBfYmgpOwotI2VuZGlmCi0JCWlmIChuZWVkX3Jlc2NoZWQoKSkgewotCQkJamJkX3VubG9ja19iaF9zdGF0ZShiaXRtYXBfYmgpOwotCQkJY29uZF9yZXNjaGVkKCk7Ci0JCQlqYmRfbG9ja19iaF9zdGF0ZShiaXRtYXBfYmgpOwotCQl9Ci0JCS8qIEBAQCBUaGlzIHByZXZlbnRzIG5ld2x5LWFsbG9jYXRlZCBkYXRhIGZyb20gYmVpbmcKLQkJICogZnJlZWQgYW5kIHRoZW4gcmVhbGxvY2F0ZWQgd2l0aGluIHRoZSBzYW1lCi0JCSAqIHRyYW5zYWN0aW9uLgotCQkgKgotCQkgKiBJZGVhbGx5IHdlIHdvdWxkIHdhbnQgdG8gYWxsb3cgdGhhdCB0byBoYXBwZW4sIGJ1dCB0bwotCQkgKiBkbyBzbyByZXF1aXJlcyBtYWtpbmcgamJkMl9qb3VybmFsX2ZvcmdldCgpIGNhcGFibGUgb2YKLQkJICogcmV2b2tpbmcgdGhlIHF1ZXVlZCB3cml0ZSBvZiBhIGRhdGEgYmxvY2ssIHdoaWNoCi0JCSAqIGltcGxpZXMgYmxvY2tpbmcgb24gdGhlIGpvdXJuYWwgbG9jay4gICpmb3JnZXQoKQotCQkgKiBjYW5ub3QgYmxvY2sgZHVlIHRvIHRydW5jYXRlIHJhY2VzLgotCQkgKgotCQkgKiBFdmVudHVhbGx5IHdlIGNhbiBmaXggdGhpcyBieSBtYWtpbmcgamJkMl9qb3VybmFsX2ZvcmdldCgpCi0JCSAqIHJldHVybiBhIHN0YXR1cyBpbmRpY2F0aW5nIHdoZXRoZXIgb3Igbm90IGl0IHdhcyBhYmxlCi0JCSAqIHRvIHJldm9rZSB0aGUgYnVmZmVyLiAgT24gc3VjY2Vzc2Z1bCByZXZva2UsIGl0IGlzCi0JCSAqIHNhZmUgbm90IHRvIHNldCB0aGUgYWxsb2NhdGlvbiBiaXQgaW4gdGhlIGNvbW1pdHRlZAotCQkgKiBiaXRtYXAsIGJlY2F1c2Ugd2Uga25vdyB0aGF0IHRoZXJlIGlzIG5vIG91dHN0YW5kaW5nCi0JCSAqIGFjdGl2aXR5IG9uIHRoZSBidWZmZXIgYW55IG1vcmUgYW5kIHNvIGl0IGlzIHNhZmUgdG8KLQkJICogcmVhbGxvY2F0ZSBpdC4KLQkJICovCi0JCUJVRkZFUl9UUkFDRShiaXRtYXBfYmgsICJzZXQgaW4gYl9jb21taXR0ZWRfZGF0YSIpOwotCQlKX0FTU0VSVF9CSChiaXRtYXBfYmgsCi0JCQkJYmgyamgoYml0bWFwX2JoKS0+Yl9jb21taXR0ZWRfZGF0YSAhPSBOVUxMKTsKLQkJZXh0NF9zZXRfYml0X2F0b21pYyhzYl9iZ2xfbG9jayhzYmksIGJsb2NrX2dyb3VwKSwgYml0ICsgaSwKLQkJCQliaDJqaChiaXRtYXBfYmgpLT5iX2NvbW1pdHRlZF9kYXRhKTsKLQotCQkvKgotCQkgKiBXZSBjbGVhciB0aGUgYml0IGluIHRoZSBiaXRtYXAgYWZ0ZXIgc2V0dGluZyB0aGUgY29tbWl0dGVkCi0JCSAqIGRhdGEgYml0LCBiZWNhdXNlIHRoaXMgaXMgdGhlIHJldmVyc2Ugb3JkZXIgdG8gdGhhdCB3aGljaAotCQkgKiB0aGUgYWxsb2NhdG9yIHVzZXMuCi0JCSAqLworCS8qCisJICogbWFrZSBzdXJlIHdlIGRvbid0IGFsbG93IGEgcGFyYWxsZWwgaW5pdCBvbiBvdGhlciBncm91cHMgaW4gdGhlCisJICogc2FtZSBidWRkeSBjYWNoZQorCSAqLworCWRvd25fd3JpdGUoJmdycC0+YWxsb2Nfc2VtKTsKKwlmb3IgKGkgPSAwLCBibG9ja3NfZnJlZWQgPSAwOyBpIDwgY291bnQ7IGkrKykgewogCQlCVUZGRVJfVFJBQ0UoYml0bWFwX2JoLCAiY2xlYXIgYml0Iik7CiAJCWlmICghZXh0NF9jbGVhcl9iaXRfYXRvbWljKHNiX2JnbF9sb2NrKHNiaSwgYmxvY2tfZ3JvdXApLAogCQkJCQkJYml0ICsgaSwgYml0bWFwX2JoLT5iX2RhdGEpKSB7Ci0JCQlqYmRfdW5sb2NrX2JoX3N0YXRlKGJpdG1hcF9iaCk7CiAJCQlleHQ0X2Vycm9yKHNiLCBfX2Z1bmNfXywKIAkJCQkgICAiYml0IGFscmVhZHkgY2xlYXJlZCBmb3IgYmxvY2sgJWxsdSIsCiAJCQkJICAgKGV4dDRfZnNibGtfdCkoYmxvY2sgKyBpKSk7Ci0JCQlqYmRfbG9ja19iaF9zdGF0ZShiaXRtYXBfYmgpOwogCQkJQlVGRkVSX1RSQUNFKGJpdG1hcF9iaCwgImJpdCBhbHJlYWR5IGNsZWFyZWQiKTsKIAkJfSBlbHNlIHsKLQkJCWdyb3VwX2ZyZWVkKys7CisJCQlibG9ja3NfZnJlZWQrKzsKIAkJfQogCX0KLQlqYmRfdW5sb2NrX2JoX3N0YXRlKGJpdG1hcF9iaCk7Ci0KIAlzcGluX2xvY2soc2JfYmdsX2xvY2soc2JpLCBibG9ja19ncm91cCkpOwotCWxlMTZfYWRkX2NwdSgmZGVzYy0+YmdfZnJlZV9ibG9ja3NfY291bnQsIGdyb3VwX2ZyZWVkKTsKKwlibGtfZnJlZV9jb3VudCA9IGJsb2Nrc19mcmVlZCArIGV4dDRfZnJlZV9ibGtzX2NvdW50KHNiLCBkZXNjKTsKKwlleHQ0X2ZyZWVfYmxrc19zZXQoc2IsIGRlc2MsIGJsa19mcmVlX2NvdW50KTsKIAlkZXNjLT5iZ19jaGVja3N1bSA9IGV4dDRfZ3JvdXBfZGVzY19jc3VtKHNiaSwgYmxvY2tfZ3JvdXAsIGRlc2MpOwogCXNwaW5fdW5sb2NrKHNiX2JnbF9sb2NrKHNiaSwgYmxvY2tfZ3JvdXApKTsKLQlwZXJjcHVfY291bnRlcl9hZGQoJnNiaS0+c19mcmVlYmxvY2tzX2NvdW50ZXIsIGNvdW50KTsKKwlwZXJjcHVfY291bnRlcl9hZGQoJnNiaS0+c19mcmVlYmxvY2tzX2NvdW50ZXIsIGJsb2Nrc19mcmVlZCk7CiAKIAlpZiAoc2JpLT5zX2xvZ19ncm91cHNfcGVyX2ZsZXgpIHsKIAkJZXh0NF9ncm91cF90IGZsZXhfZ3JvdXAgPSBleHQ0X2ZsZXhfZ3JvdXAoc2JpLCBibG9ja19ncm91cCk7CiAJCXNwaW5fbG9jayhzYl9iZ2xfbG9jayhzYmksIGZsZXhfZ3JvdXApKTsKLQkJc2JpLT5zX2ZsZXhfZ3JvdXBzW2ZsZXhfZ3JvdXBdLmZyZWVfYmxvY2tzICs9IGNvdW50OworCQlzYmktPnNfZmxleF9ncm91cHNbZmxleF9ncm91cF0uZnJlZV9ibG9ja3MgKz0gYmxvY2tzX2ZyZWVkOwogCQlzcGluX3VubG9jayhzYl9iZ2xfbG9jayhzYmksIGZsZXhfZ3JvdXApKTsKIAl9CisJLyoKKwkgKiByZXF1ZXN0IHRvIHJlbG9hZCB0aGUgYnVkZHkgd2l0aCB0aGUKKwkgKiBuZXcgYml0bWFwIGluZm9ybWF0aW9uCisJICovCisJc2V0X2JpdChFWFQ0X0dST1VQX0lORk9fTkVFRF9JTklUX0JJVCwgJihncnAtPmJiX3N0YXRlKSk7CisJZXh0NF9tYl91cGRhdGVfZ3JvdXBfaW5mbyhncnAsIGJsb2Nrc19mcmVlZCk7CisJdXBfd3JpdGUoJmdycC0+YWxsb2Nfc2VtKTsKIAogCS8qIFdlIGRpcnRpZWQgdGhlIGJpdG1hcCBibG9jayAqLwogCUJVRkZFUl9UUkFDRShiaXRtYXBfYmgsICJkaXJ0aWVkIGJpdG1hcCBibG9jayIpOwotCWVyciA9IGV4dDRfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGJpdG1hcF9iaCk7CisJZXJyID0gZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBOVUxMLCBiaXRtYXBfYmgpOwogCiAJLyogQW5kIHRoZSBncm91cCBkZXNjcmlwdG9yIGJsb2NrICovCiAJQlVGRkVSX1RSQUNFKGdkX2JoLCAiZGlydGllZCBncm91cCBkZXNjcmlwdG9yIGJsb2NrIik7Ci0JcmV0ID0gZXh0NF9qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgZ2RfYmgpOwotCWlmICghZXJyKSBlcnIgPSByZXQ7Ci0JKnBkcXVvdF9mcmVlZF9ibG9ja3MgKz0gZ3JvdXBfZnJlZWQ7Ci0KLQlpZiAob3ZlcmZsb3cgJiYgIWVycikgewotCQlibG9jayArPSBjb3VudDsKLQkJY291bnQgPSBvdmVyZmxvdzsKLQkJZ290byBkb19tb3JlOwotCX0KKwlyZXQgPSBleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIE5VTEwsIGdkX2JoKTsKKwlpZiAoIWVycikKKwkJZXJyID0gcmV0OwogCXNiLT5zX2RpcnQgPSAxOworCiBlcnJvcl9yZXR1cm46CiAJYnJlbHNlKGJpdG1hcF9iaCk7CiAJZXh0NF9zdGRfZXJyb3Ioc2IsIGVycik7CkBAIC02MTQsNyArNTY1LDcgQEAKIAkJaWYgKGRpcnR5X2Jsb2NrcyA8IDApIHsKIAkJCXByaW50ayhLRVJOX0NSSVQgIkRpcnR5IGJsb2NrIGFjY291bnRpbmcgIgogCQkJCQkid2VudCB3cm9uZyAlbGxkXG4iLAotCQkJCQlkaXJ0eV9ibG9ja3MpOworCQkJCQkobG9uZyBsb25nKWRpcnR5X2Jsb2Nrcyk7CiAJCX0KIAl9CiAJLyogQ2hlY2sgd2hldGhlciB3ZSBoYXZlIHNwYWNlIGFmdGVyCkBAIC02NjYsMTAxICs2MTcsNDUgQEAKIAlyZXR1cm4gamJkMl9qb3VybmFsX2ZvcmNlX2NvbW1pdF9uZXN0ZWQoRVhUNF9TQihzYiktPnNfam91cm5hbCk7CiB9CiAKLSNkZWZpbmUgRVhUNF9NRVRBX0JMT0NLIDB4MQotCi1zdGF0aWMgZXh0NF9mc2Jsa190IGRvX2Jsa19hbGxvYyhoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCQkJCWV4dDRfbGJsa190IGlibG9jaywgZXh0NF9mc2Jsa190IGdvYWwsCi0JCQkJdW5zaWduZWQgbG9uZyAqY291bnQsIGludCAqZXJycCwgaW50IGZsYWdzKQotewotCXN0cnVjdCBleHQ0X2FsbG9jYXRpb25fcmVxdWVzdCBhcjsKLQlleHQ0X2ZzYmxrX3QgcmV0OwotCi0JbWVtc2V0KCZhciwgMCwgc2l6ZW9mKGFyKSk7Ci0JLyogRmlsbCB3aXRoIG5laWdoYm91ciBhbGxvY2F0ZWQgYmxvY2tzICovCi0KLQlhci5pbm9kZSA9IGlub2RlOwotCWFyLmdvYWwgPSBnb2FsOwotCWFyLmxlbiA9ICpjb3VudDsKLQlhci5sb2dpY2FsID0gaWJsb2NrOwotCi0JaWYgKFNfSVNSRUcoaW5vZGUtPmlfbW9kZSkgJiYgIShmbGFncyAmIEVYVDRfTUVUQV9CTE9DSykpCi0JCS8qIGVuYWJsZSBpbi1jb3JlIHByZWFsbG9jYXRpb24gZm9yIGRhdGEgYmxvY2sgYWxsb2NhdGlvbiAqLwotCQlhci5mbGFncyA9IEVYVDRfTUJfSElOVF9EQVRBOwotCWVsc2UKLQkJLyogZGlzYWJsZSBpbi1jb3JlIHByZWFsbG9jYXRpb24gZm9yIG5vbi1yZWd1bGFyIGZpbGVzICovCi0JCWFyLmZsYWdzID0gMDsKLQotCXJldCA9IGV4dDRfbWJfbmV3X2Jsb2NrcyhoYW5kbGUsICZhciwgZXJycCk7Ci0JKmNvdW50ID0gYXIubGVuOwotCXJldHVybiByZXQ7Ci19Ci0KIC8qCiAgKiBleHQ0X25ld19tZXRhX2Jsb2NrcygpIC0tIGFsbG9jYXRlIGJsb2NrIGZvciBtZXRhIGRhdGEgKGluZGV4aW5nKSBibG9ja3MKICAqCiAgKiBAaGFuZGxlOiAgICAgICAgICAgICBoYW5kbGUgdG8gdGhpcyB0cmFuc2FjdGlvbgogICogQGlub2RlOiAgICAgICAgICAgICAgZmlsZSBpbm9kZQogICogQGdvYWw6ICAgICAgICAgICAgICAgZ2l2ZW4gdGFyZ2V0IGJsb2NrKGZpbGVzeXN0ZW0gd2lkZSkKLSAqIEBjb3VudDoJCXRvdGFsIG51bWJlciBvZiBibG9ja3MgbmVlZAorICogQGNvdW50OgkJcG9pbnRlciB0byB0b3RhbCBudW1iZXIgb2YgYmxvY2tzIG5lZWRlZAogICogQGVycnA6ICAgICAgICAgICAgICAgZXJyb3IgY29kZQogICoKLSAqIFJldHVybiAxc3QgYWxsb2NhdGVkIGJsb2NrIG51bWJlcm9uIHN1Y2Nlc3MsICpjb3VudCBzdG9yZXMgdG90YWwgYWNjb3VudAorICogUmV0dXJuIDFzdCBhbGxvY2F0ZWQgYmxvY2sgbnVtYmVyIG9uIHN1Y2Nlc3MsICpjb3VudCBzdG9yZXMgdG90YWwgYWNjb3VudAogICogZXJyb3Igc3RvcmVzIGluIGVycnAgcG9pbnRlcgogICovCiBleHQ0X2ZzYmxrX3QgZXh0NF9uZXdfbWV0YV9ibG9ja3MoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSwKIAkJZXh0NF9mc2Jsa190IGdvYWwsIHVuc2lnbmVkIGxvbmcgKmNvdW50LCBpbnQgKmVycnApCiB7CisJc3RydWN0IGV4dDRfYWxsb2NhdGlvbl9yZXF1ZXN0IGFyOwogCWV4dDRfZnNibGtfdCByZXQ7Ci0JcmV0ID0gZG9fYmxrX2FsbG9jKGhhbmRsZSwgaW5vZGUsIDAsIGdvYWwsCi0JCQkJY291bnQsIGVycnAsIEVYVDRfTUVUQV9CTE9DSyk7CisKKwltZW1zZXQoJmFyLCAwLCBzaXplb2YoYXIpKTsKKwkvKiBGaWxsIHdpdGggbmVpZ2hib3VyIGFsbG9jYXRlZCBibG9ja3MgKi8KKwlhci5pbm9kZSA9IGlub2RlOworCWFyLmdvYWwgPSBnb2FsOworCWFyLmxlbiA9IGNvdW50ID8gKmNvdW50IDogMTsKKworCXJldCA9IGV4dDRfbWJfbmV3X2Jsb2NrcyhoYW5kbGUsICZhciwgZXJycCk7CisJaWYgKGNvdW50KQorCQkqY291bnQgPSBhci5sZW47CisKIAkvKgogCSAqIEFjY291bnQgZm9yIHRoZSBhbGxvY2F0ZWQgbWV0YSBibG9ja3MKIAkgKi8KIAlpZiAoISgqZXJycCkgJiYgRVhUNF9JKGlub2RlKS0+aV9kZWxhbGxvY19yZXNlcnZlZF9mbGFnKSB7CiAJCXNwaW5fbG9jaygmRVhUNF9JKGlub2RlKS0+aV9ibG9ja19yZXNlcnZhdGlvbl9sb2NrKTsKLQkJRVhUNF9JKGlub2RlKS0+aV9hbGxvY2F0ZWRfbWV0YV9ibG9ja3MgKz0gKmNvdW50OworCQlFWFQ0X0koaW5vZGUpLT5pX2FsbG9jYXRlZF9tZXRhX2Jsb2NrcyArPSBhci5sZW47CiAJCXNwaW5fdW5sb2NrKCZFWFQ0X0koaW5vZGUpLT5pX2Jsb2NrX3Jlc2VydmF0aW9uX2xvY2spOwogCX0KIAlyZXR1cm4gcmV0OwogfQogCi0vKgotICogZXh0NF9uZXdfbWV0YV9ibG9jaygpIC0tIGFsbG9jYXRlIGJsb2NrIGZvciBtZXRhIGRhdGEgKGluZGV4aW5nKSBibG9ja3MKLSAqCi0gKiBAaGFuZGxlOiAgICAgICAgICAgICBoYW5kbGUgdG8gdGhpcyB0cmFuc2FjdGlvbgotICogQGlub2RlOiAgICAgICAgICAgICAgZmlsZSBpbm9kZQotICogQGdvYWw6ICAgICAgICAgICAgICAgZ2l2ZW4gdGFyZ2V0IGJsb2NrKGZpbGVzeXN0ZW0gd2lkZSkKLSAqIEBlcnJwOiAgICAgICAgICAgICAgIGVycm9yIGNvZGUKLSAqCi0gKiBSZXR1cm4gYWxsb2NhdGVkIGJsb2NrIG51bWJlciBvbiBzdWNjZXNzCi0gKi8KLWV4dDRfZnNibGtfdCBleHQ0X25ld19tZXRhX2Jsb2NrKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCWV4dDRfZnNibGtfdCBnb2FsLCBpbnQgKmVycnApCi17Ci0JdW5zaWduZWQgbG9uZyBjb3VudCA9IDE7Ci0JcmV0dXJuIGV4dDRfbmV3X21ldGFfYmxvY2tzKGhhbmRsZSwgaW5vZGUsIGdvYWwsICZjb3VudCwgZXJycCk7Ci19Ci0KLS8qCi0gKiBleHQ0X25ld19ibG9ja3MoKSAtLSBhbGxvY2F0ZSBkYXRhIGJsb2NrcwotICoKLSAqIEBoYW5kbGU6ICAgICAgICAgICAgIGhhbmRsZSB0byB0aGlzIHRyYW5zYWN0aW9uCi0gKiBAaW5vZGU6ICAgICAgICAgICAgICBmaWxlIGlub2RlCi0gKiBAZ29hbDogICAgICAgICAgICAgICBnaXZlbiB0YXJnZXQgYmxvY2soZmlsZXN5c3RlbSB3aWRlKQotICogQGNvdW50OgkJdG90YWwgbnVtYmVyIG9mIGJsb2NrcyBuZWVkCi0gKiBAZXJycDogICAgICAgICAgICAgICBlcnJvciBjb2RlCi0gKgotICogUmV0dXJuIDFzdCBhbGxvY2F0ZWQgYmxvY2sgbnVtYmVyb24gc3VjY2VzcywgKmNvdW50IHN0b3JlcyB0b3RhbCBhY2NvdW50Ci0gKiBlcnJvciBzdG9yZXMgaW4gZXJycCBwb2ludGVyCi0gKi8KLQotZXh0NF9mc2Jsa190IGV4dDRfbmV3X2Jsb2NrcyhoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCQkJCWV4dDRfbGJsa190IGlibG9jaywgZXh0NF9mc2Jsa190IGdvYWwsCi0JCQkJdW5zaWduZWQgbG9uZyAqY291bnQsIGludCAqZXJycCkKLXsKLQlyZXR1cm4gZG9fYmxrX2FsbG9jKGhhbmRsZSwgaW5vZGUsIGlibG9jaywgZ29hbCwgY291bnQsIGVycnAsIDApOwotfQotCiAvKioKICAqIGV4dDRfY291bnRfZnJlZV9ibG9ja3MoKSAtLSBjb3VudCBmaWxlc3lzdGVtIGZyZWUgYmxvY2tzCiAgKiBAc2I6CQlzdXBlcmJsb2NrCkBAIC03NzYsNyArNjcxLDcgQEAKICNpZmRlZiBFWFQ0RlNfREVCVUcKIAlzdHJ1Y3QgZXh0NF9zdXBlcl9ibG9jayAqZXM7CiAJZXh0NF9mc2Jsa190IGJpdG1hcF9jb3VudDsKLQl1bnNpZ25lZCBsb25nIHg7CisJdW5zaWduZWQgaW50IHg7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaXRtYXBfYmggPSBOVUxMOwogCiAJZXMgPSBFWFQ0X1NCKHNiKS0+c19lczsKQEAgLTc5Niw3ICs2OTEsNyBAQAogCQkJY29udGludWU7CiAKIAkJeCA9IGV4dDRfY291bnRfZnJlZShiaXRtYXBfYmgsIHNiLT5zX2Jsb2Nrc2l6ZSk7Ci0JCXByaW50ayhLRVJOX0RFQlVHICJncm91cCAlbHU6IHN0b3JlZCA9ICVkLCBjb3VudGVkID0gJWx1XG4iLAorCQlwcmludGsoS0VSTl9ERUJVRyAiZ3JvdXAgJWx1OiBzdG9yZWQgPSAlZCwgY291bnRlZCA9ICV1XG4iLAogCQkJaSwgbGUxNl90b19jcHUoZ2RwLT5iZ19mcmVlX2Jsb2Nrc19jb3VudCksIHgpOwogCQliaXRtYXBfY291bnQgKz0geDsKIAl9CkBAIC04MTIsNyArNzA3LDcgQEAKIAkJZ2RwID0gZXh0NF9nZXRfZ3JvdXBfZGVzYyhzYiwgaSwgTlVMTCk7CiAJCWlmICghZ2RwKQogCQkJY29udGludWU7Ci0JCWRlc2NfY291bnQgKz0gbGUxNl90b19jcHUoZ2RwLT5iZ19mcmVlX2Jsb2Nrc19jb3VudCk7CisJCWRlc2NfY291bnQgKz0gZXh0NF9mcmVlX2Jsa3NfY291bnQoc2IsIGdkcCk7CiAJfQogCiAJcmV0dXJuIGRlc2NfY291bnQ7CmRpZmYgLS1naXQgYS9mcy9leHQ0L2JpdG1hcC5jIGIvZnMvZXh0NC9iaXRtYXAuYwppbmRleCAwYTdhNjY2Li5mYTNhZjgxIDEwMDY0NAotLS0gYS9mcy9leHQ0L2JpdG1hcC5jCisrKyBiL2ZzL2V4dDQvYml0bWFwLmMKQEAgLTE1LDEwICsxNSw5IEBACiAKIHN0YXRpYyBjb25zdCBpbnQgbmliYmxlbWFwW10gPSB7NCwgMywgMywgMiwgMywgMiwgMiwgMSwgMywgMiwgMiwgMSwgMiwgMSwgMSwgMH07CiAKLXVuc2lnbmVkIGxvbmcgZXh0NF9jb3VudF9mcmVlKHN0cnVjdCBidWZmZXJfaGVhZCAqbWFwLCB1bnNpZ25lZCBpbnQgbnVtY2hhcnMpCit1bnNpZ25lZCBpbnQgZXh0NF9jb3VudF9mcmVlKHN0cnVjdCBidWZmZXJfaGVhZCAqbWFwLCB1bnNpZ25lZCBpbnQgbnVtY2hhcnMpCiB7Ci0JdW5zaWduZWQgaW50IGk7Ci0JdW5zaWduZWQgbG9uZyBzdW0gPSAwOworCXVuc2lnbmVkIGludCBpLCBzdW0gPSAwOwogCiAJaWYgKCFtYXApCiAJCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZnMvZXh0NC9kaXIuYyBiL2ZzL2V4dDQvZGlyLmMKaW5kZXggZmVkNWI2MS4uMmRmMmU0MCAxMDA2NDQKLS0tIGEvZnMvZXh0NC9kaXIuYworKysgYi9mcy9leHQ0L2Rpci5jCkBAIC02NCw3ICs2NCw3IEBACiBpbnQgZXh0NF9jaGVja19kaXJfZW50cnkoY29uc3QgY2hhciAqZnVuY3Rpb24sIHN0cnVjdCBpbm9kZSAqZGlyLAogCQkJIHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICpkZSwKIAkJCSBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLAotCQkJIHVuc2lnbmVkIGxvbmcgb2Zmc2V0KQorCQkJIHVuc2lnbmVkIGludCBvZmZzZXQpCiB7CiAJY29uc3QgY2hhciAqZXJyb3JfbXNnID0gTlVMTDsKIAljb25zdCBpbnQgcmxlbiA9IGV4dDRfcmVjX2xlbl9mcm9tX2Rpc2soZGUtPnJlY19sZW4pOwpAQCAtODQsOSArODQsOSBAQAogCWlmIChlcnJvcl9tc2cgIT0gTlVMTCkKIAkJZXh0NF9lcnJvcihkaXItPmlfc2IsIGZ1bmN0aW9uLAogCQkJImJhZCBlbnRyeSBpbiBkaXJlY3RvcnkgIyVsdTogJXMgLSAiCi0JCQkib2Zmc2V0PSVsdSwgaW5vZGU9JWx1LCByZWNfbGVuPSVkLCBuYW1lX2xlbj0lZCIsCisJCQkib2Zmc2V0PSV1LCBpbm9kZT0ldSwgcmVjX2xlbj0lZCwgbmFtZV9sZW49JWQiLAogCQkJZGlyLT5pX2lubywgZXJyb3JfbXNnLCBvZmZzZXQsCi0JCQkodW5zaWduZWQgbG9uZykgbGUzMl90b19jcHUoZGUtPmlub2RlKSwKKwkJCWxlMzJfdG9fY3B1KGRlLT5pbm9kZSksCiAJCQlybGVuLCBkZS0+bmFtZV9sZW4pOwogCXJldHVybiBlcnJvcl9tc2cgPT0gTlVMTCA/IDEgOiAwOwogfQpAQCAtOTUsNyArOTUsNyBAQAogCQkJIHZvaWQgKmRpcmVudCwgZmlsbGRpcl90IGZpbGxkaXIpCiB7CiAJaW50IGVycm9yID0gMDsKLQl1bnNpZ25lZCBsb25nIG9mZnNldDsKKwl1bnNpZ25lZCBpbnQgb2Zmc2V0OwogCWludCBpLCBzdG9yZWQ7CiAJc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKmRlOwogCXN0cnVjdCBzdXBlcl9ibG9jayAqc2I7CkBAIC00MDUsNyArNDA1LDcgQEAKIAlzYiA9IGlub2RlLT5pX3NiOwogCiAJaWYgKCFmbmFtZSkgewotCQlwcmludGsoS0VSTl9FUlIgImV4dDQ6IGNhbGxfZmlsbGRpcjogY2FsbGVkIHdpdGggIgorCQlwcmludGsoS0VSTl9FUlIgIkVYVDQtZnM6IGNhbGxfZmlsbGRpcjogY2FsbGVkIHdpdGggIgogCQkgICAgICAgIm51bGwgZm5hbWU/IT9cbiIpOwogCQlyZXR1cm4gMDsKIAl9CmRpZmYgLS1naXQgYS9mcy9leHQ0L2V4dDQuaCBiL2ZzL2V4dDQvZXh0NC5oCmluZGV4IGIwNTM3YzguLmM2NjhlNDMgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvZXh0NC5oCisrKyBiL2ZzL2V4dDQvZXh0NC5oCkBAIC0xOSw2ICsxOSw3IEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KICNpbmNsdWRlIDxsaW51eC9tYWdpYy5oPgorI2luY2x1ZGUgPGxpbnV4L2piZDIuaD4KICNpbmNsdWRlICJleHQ0X2kuaCIKIAogLyoKQEAgLTk0LDkgKzk1LDkgQEAKIAkvKiBwaHlzLiBibG9jayBmb3IgXl5eICovCiAJZXh0NF9mc2Jsa190IHByaWdodDsKIAkvKiBob3cgbWFueSBibG9ja3Mgd2Ugd2FudCB0byBhbGxvY2F0ZSAqLwotCXVuc2lnbmVkIGxvbmcgbGVuOworCXVuc2lnbmVkIGludCBsZW47CiAJLyogZmxhZ3MuIHNlZSBhYm92ZSBFWFQ0X01CX0hJTlRfKiAqLwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaW50IGZsYWdzOwogfTsKIAogLyoKQEAgLTE1NiwxMiArMTU3LDEyIEBACiAJX19sZTMyCWJnX2Jsb2NrX2JpdG1hcF9sbzsJLyogQmxvY2tzIGJpdG1hcCBibG9jayAqLwogCV9fbGUzMgliZ19pbm9kZV9iaXRtYXBfbG87CS8qIElub2RlcyBiaXRtYXAgYmxvY2sgKi8KIAlfX2xlMzIJYmdfaW5vZGVfdGFibGVfbG87CS8qIElub2RlcyB0YWJsZSBibG9jayAqLwotCV9fbGUxNgliZ19mcmVlX2Jsb2Nrc19jb3VudDsJLyogRnJlZSBibG9ja3MgY291bnQgKi8KLQlfX2xlMTYJYmdfZnJlZV9pbm9kZXNfY291bnQ7CS8qIEZyZWUgaW5vZGVzIGNvdW50ICovCi0JX19sZTE2CWJnX3VzZWRfZGlyc19jb3VudDsJLyogRGlyZWN0b3JpZXMgY291bnQgKi8KKwlfX2xlMTYJYmdfZnJlZV9ibG9ja3NfY291bnRfbG87LyogRnJlZSBibG9ja3MgY291bnQgKi8KKwlfX2xlMTYJYmdfZnJlZV9pbm9kZXNfY291bnRfbG87LyogRnJlZSBpbm9kZXMgY291bnQgKi8KKwlfX2xlMTYJYmdfdXNlZF9kaXJzX2NvdW50X2xvOwkvKiBEaXJlY3RvcmllcyBjb3VudCAqLwogCV9fbGUxNgliZ19mbGFnczsJCS8qIEVYVDRfQkdfZmxhZ3MgKElOT0RFX1VOSU5JVCwgZXRjKSAqLwogCV9fdTMyCWJnX3Jlc2VydmVkWzJdOwkJLyogTGlrZWx5IGJsb2NrL2lub2RlIGJpdG1hcCBjaGVja3N1bSAqLwotCV9fbGUxNiAgYmdfaXRhYmxlX3VudXNlZDsJLyogVW51c2VkIGlub2RlcyBjb3VudCAqLworCV9fbGUxNiAgYmdfaXRhYmxlX3VudXNlZF9sbzsJLyogVW51c2VkIGlub2RlcyBjb3VudCAqLwogCV9fbGUxNiAgYmdfY2hlY2tzdW07CQkvKiBjcmMxNihzYl91dWlkK2dyb3VwK2Rlc2MpICovCiAJX19sZTMyCWJnX2Jsb2NrX2JpdG1hcF9oaTsJLyogQmxvY2tzIGJpdG1hcCBibG9jayBNU0IgKi8KIAlfX2xlMzIJYmdfaW5vZGVfYml0bWFwX2hpOwkvKiBJbm9kZXMgYml0bWFwIGJsb2NrIE1TQiAqLwpAQCAtMTY5LDcgKzE3MCw3IEBACiAJX19sZTE2CWJnX2ZyZWVfYmxvY2tzX2NvdW50X2hpOy8qIEZyZWUgYmxvY2tzIGNvdW50IE1TQiAqLwogCV9fbGUxNgliZ19mcmVlX2lub2Rlc19jb3VudF9oaTsvKiBGcmVlIGlub2RlcyBjb3VudCBNU0IgKi8KIAlfX2xlMTYJYmdfdXNlZF9kaXJzX2NvdW50X2hpOwkvKiBEaXJlY3RvcmllcyBjb3VudCBNU0IgKi8KLQlfX2xlMTYJYmdfaXRhYmxlX3VudXNlZF9oaTsJLyogVW51c2VkIGlub2RlcyBjb3VudCBNU0IgKi8KKwlfX2xlMTYgIGJnX2l0YWJsZV91bnVzZWRfaGk7ICAgIC8qIFVudXNlZCBpbm9kZXMgY291bnQgTVNCICovCiAJX191MzIJYmdfcmVzZXJ2ZWQyWzNdOwogfTsKIApAQCAtMzI4LDYgKzMyOSw3IEBACiAJdWlkX3Qgc19yZXN1aWQ7CiAJZ2lkX3Qgc19yZXNnaWQ7CiAJdW5zaWduZWQgbG9uZyBzX2NvbW1pdF9pbnRlcnZhbDsKKwl1MzIgc19taW5fYmF0Y2hfdGltZSwgc19tYXhfYmF0Y2hfdGltZTsKICNpZmRlZiBDT05GSUdfUVVPVEEKIAlpbnQgc19qcXVvdGFfZm10OwogCWNoYXIgKnNfcWZfbmFtZXNbTUFYUVVPVEFTXTsKQEAgLTUzNCw3ICs1MzYsNiBAQAogI2RlZmluZSBFWFQ0X01PVU5UX1FVT1RBCQkweDgwMDAwIC8qIFNvbWUgcXVvdGEgb3B0aW9uIHNldCAqLwogI2RlZmluZSBFWFQ0X01PVU5UX1VTUlFVT1RBCQkweDEwMDAwMCAvKiAib2xkIiB1c2VyIHF1b3RhICovCiAjZGVmaW5lIEVYVDRfTU9VTlRfR1JQUVVPVEEJCTB4MjAwMDAwIC8qICJvbGQiIGdyb3VwIHF1b3RhICovCi0jZGVmaW5lIEVYVDRfTU9VTlRfRVhURU5UUwkJMHg0MDAwMDAgLyogRXh0ZW50cyBzdXBwb3J0ICovCiAjZGVmaW5lIEVYVDRfTU9VTlRfSk9VUk5BTF9DSEVDS1NVTQkweDgwMDAwMCAvKiBKb3VybmFsIGNoZWNrc3VtcyAqLwogI2RlZmluZSBFWFQ0X01PVU5UX0pPVVJOQUxfQVNZTkNfQ09NTUlUCTB4MTAwMDAwMCAvKiBKb3VybmFsIEFzeW5jIENvbW1pdCAqLwogI2RlZmluZSBFWFQ0X01PVU5UX0lfVkVSU0lPTiAgICAgICAgICAgIDB4MjAwMDAwMCAvKiBpX3ZlcnNpb24gc3VwcG9ydCAqLwpAQCAtNzI2LDExICs3MjcsMTEgQEAKICAqLwogCiAjZGVmaW5lIEVYVDRfSEFTX0NPTVBBVF9GRUFUVVJFKHNiLG1hc2spCQkJXAotCShFWFQ0X1NCKHNiKS0+c19lcy0+c19mZWF0dXJlX2NvbXBhdCAmIGNwdV90b19sZTMyKG1hc2spKQorCSgoRVhUNF9TQihzYiktPnNfZXMtPnNfZmVhdHVyZV9jb21wYXQgJiBjcHVfdG9fbGUzMihtYXNrKSkgIT0gMCkKICNkZWZpbmUgRVhUNF9IQVNfUk9fQ09NUEFUX0ZFQVRVUkUoc2IsbWFzaykJCQlcCi0JKEVYVDRfU0Ioc2IpLT5zX2VzLT5zX2ZlYXR1cmVfcm9fY29tcGF0ICYgY3B1X3RvX2xlMzIobWFzaykpCisJKChFWFQ0X1NCKHNiKS0+c19lcy0+c19mZWF0dXJlX3JvX2NvbXBhdCAmIGNwdV90b19sZTMyKG1hc2spKSAhPSAwKQogI2RlZmluZSBFWFQ0X0hBU19JTkNPTVBBVF9GRUFUVVJFKHNiLG1hc2spCQkJXAotCShFWFQ0X1NCKHNiKS0+c19lcy0+c19mZWF0dXJlX2luY29tcGF0ICYgY3B1X3RvX2xlMzIobWFzaykpCisJKChFWFQ0X1NCKHNiKS0+c19lcy0+c19mZWF0dXJlX2luY29tcGF0ICYgY3B1X3RvX2xlMzIobWFzaykpICE9IDApCiAjZGVmaW5lIEVYVDRfU0VUX0NPTVBBVF9GRUFUVVJFKHNiLG1hc2spCQkJXAogCUVYVDRfU0Ioc2IpLT5zX2VzLT5zX2ZlYXR1cmVfY29tcGF0IHw9IGNwdV90b19sZTMyKG1hc2spCiAjZGVmaW5lIEVYVDRfU0VUX1JPX0NPTVBBVF9GRUFUVVJFKHNiLG1hc2spCQkJXApAQCAtODA2LDYgKzgwNywxMiBAQAogI2RlZmluZSBFWFQ0X0RFRk1fSk1PREVfV0JBQ0sJMHgwMDYwCiAKIC8qCisgKiBEZWZhdWx0IGpvdXJuYWwgYmF0Y2ggdGltZXMKKyAqLworI2RlZmluZSBFWFQ0X0RFRl9NSU5fQkFUQ0hfVElNRQkwCisjZGVmaW5lIEVYVDRfREVGX01BWF9CQVRDSF9USU1FCTE1MDAwIC8qIDE1bXMgKi8KKworLyoKICAqIFN0cnVjdHVyZSBvZiBhIGRpcmVjdG9yeSBlbnRyeQogICovCiAjZGVmaW5lIEVYVDRfTkFNRV9MRU4gMjU1CkBAIC04OTEsNiArODk4LDkgQEAKICNkZWZpbmUgRFhfSEFTSF9MRUdBQ1kJCTAKICNkZWZpbmUgRFhfSEFTSF9IQUxGX01ENAkxCiAjZGVmaW5lIERYX0hBU0hfVEVBCQkyCisjZGVmaW5lIERYX0hBU0hfTEVHQUNZX1VOU0lHTkVECTMKKyNkZWZpbmUgRFhfSEFTSF9IQUxGX01ENF9VTlNJR05FRAk0CisjZGVmaW5lIERYX0hBU0hfVEVBX1VOU0lHTkVECQk1CiAKICNpZmRlZiBfX0tFUk5FTF9fCiAKQEAgLTk1NSw3ICs5NjUsNyBAQAogI2RlZmluZSBFUlJfQkFEX0RYX0RJUgktNzUwMDAKIAogdm9pZCBleHQ0X2dldF9ncm91cF9ub19hbmRfb2Zmc2V0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGV4dDRfZnNibGtfdCBibG9ja25yLAotCQkJdW5zaWduZWQgbG9uZyAqYmxvY2tncnBwLCBleHQ0X2dycGJsa190ICpvZmZzZXRwKTsKKwkJCWV4dDRfZ3JvdXBfdCAqYmxvY2tncnBwLCBleHQ0X2dycGJsa190ICpvZmZzZXRwKTsKIAogZXh0ZXJuIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZXh0NF9wcm9jX3Jvb3Q7CiAKQEAgLTk4Nyw2ICs5OTcsOSBAQAogIyBkZWZpbmUgQVRUUklCX05PUkVUCV9fYXR0cmlidXRlX18oKG5vcmV0dXJuKSkKICMgZGVmaW5lIE5PUkVUX0FORAlub3JldHVybiwKIAorLyogYml0bWFwLmMgKi8KK2V4dGVybiB1bnNpZ25lZCBpbnQgZXh0NF9jb3VudF9mcmVlKHN0cnVjdCBidWZmZXJfaGVhZCAqLCB1bnNpZ25lZCk7CisKIC8qIGJhbGxvYy5jICovCiBleHRlcm4gdW5zaWduZWQgaW50IGV4dDRfYmxvY2tfZ3JvdXAoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKIAkJCWV4dDRfZnNibGtfdCBibG9ja25yKTsKQEAgLTk5NSwyMCArMTAwOCwxNCBAQAogZXh0ZXJuIGludCBleHQ0X2JnX2hhc19zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBleHQ0X2dyb3VwX3QgZ3JvdXApOwogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgZXh0NF9iZ19udW1fZ2RiKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCiAJCQlleHQ0X2dyb3VwX3QgZ3JvdXApOwotZXh0ZXJuIGV4dDRfZnNibGtfdCBleHQ0X25ld19tZXRhX2Jsb2NrKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCQlleHQ0X2ZzYmxrX3QgZ29hbCwgaW50ICplcnJwKTsKIGV4dGVybiBleHQ0X2ZzYmxrX3QgZXh0NF9uZXdfbWV0YV9ibG9ja3MoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSwKIAkJCWV4dDRfZnNibGtfdCBnb2FsLCB1bnNpZ25lZCBsb25nICpjb3VudCwgaW50ICplcnJwKTsKLWV4dGVybiBleHQ0X2ZzYmxrX3QgZXh0NF9uZXdfYmxvY2tzKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCQkJCWV4dDRfbGJsa190IGlibG9jaywgZXh0NF9mc2Jsa190IGdvYWwsCi0JCQkJCXVuc2lnbmVkIGxvbmcgKmNvdW50LCBpbnQgKmVycnApOwogZXh0ZXJuIGludCBleHQ0X2NsYWltX2ZyZWVfYmxvY2tzKHN0cnVjdCBleHQ0X3NiX2luZm8gKnNiaSwgczY0IG5ibG9ja3MpOwogZXh0ZXJuIGludCBleHQ0X2hhc19mcmVlX2Jsb2NrcyhzdHJ1Y3QgZXh0NF9zYl9pbmZvICpzYmksIHM2NCBuYmxvY2tzKTsKIGV4dGVybiB2b2lkIGV4dDRfZnJlZV9ibG9ja3MoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSwKIAkJCWV4dDRfZnNibGtfdCBibG9jaywgdW5zaWduZWQgbG9uZyBjb3VudCwgaW50IG1ldGFkYXRhKTsKLWV4dGVybiB2b2lkIGV4dDRfZnJlZV9ibG9ja3Nfc2IoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKLQkJCQlleHQ0X2ZzYmxrX3QgYmxvY2ssIHVuc2lnbmVkIGxvbmcgY291bnQsCi0JCQkJdW5zaWduZWQgbG9uZyAqcGRxdW90X2ZyZWVkX2Jsb2Nrcyk7CitleHRlcm4gdm9pZCBleHQ0X2FkZF9ncm91cGJsb2NrcyhoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQkJCWV4dDRfZnNibGtfdCBibG9jaywgdW5zaWduZWQgbG9uZyBjb3VudCk7CiBleHRlcm4gZXh0NF9mc2Jsa190IGV4dDRfY291bnRfZnJlZV9ibG9ja3Moc3RydWN0IHN1cGVyX2Jsb2NrICopOwogZXh0ZXJuIHZvaWQgZXh0NF9jaGVja19ibG9ja3NfYml0bWFwKHN0cnVjdCBzdXBlcl9ibG9jayAqKTsKIGV4dGVybiBzdHJ1Y3QgZXh0NF9ncm91cF9kZXNjICogZXh0NF9nZXRfZ3JvdXBfZGVzYyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYiwKQEAgLTEwMTksNyArMTAyNiw3IEBACiAvKiBkaXIuYyAqLwogZXh0ZXJuIGludCBleHQ0X2NoZWNrX2Rpcl9lbnRyeShjb25zdCBjaGFyICosIHN0cnVjdCBpbm9kZSAqLAogCQkJCXN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICosCi0JCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICosIHVuc2lnbmVkIGxvbmcpOworCQkJCXN0cnVjdCBidWZmZXJfaGVhZCAqLCB1bnNpZ25lZCBpbnQpOwogZXh0ZXJuIGludCBleHQ0X2h0cmVlX3N0b3JlX2RpcmVudChzdHJ1Y3QgZmlsZSAqZGlyX2ZpbGUsIF9fdTMyIGhhc2gsCiAJCQkJICAgIF9fdTMyIG1pbm9yX2hhc2gsCiAJCQkJICAgIHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICpkaXJlbnQpOwpAQCAtMTAzOSw3ICsxMDQ2LDYgQEAKIGV4dGVybiB1bnNpZ25lZCBsb25nIGV4dDRfY291bnRfZnJlZV9pbm9kZXMoc3RydWN0IHN1cGVyX2Jsb2NrICopOwogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgZXh0NF9jb3VudF9kaXJzKHN0cnVjdCBzdXBlcl9ibG9jayAqKTsKIGV4dGVybiB2b2lkIGV4dDRfY2hlY2tfaW5vZGVzX2JpdG1hcChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKik7Ci1leHRlcm4gdW5zaWduZWQgbG9uZyBleHQ0X2NvdW50X2ZyZWUoc3RydWN0IGJ1ZmZlcl9oZWFkICosIHVuc2lnbmVkKTsKIAogLyogbWJhbGxvYy5jICovCiBleHRlcm4gbG9uZyBleHQ0X21iX3N0YXRzOwpAQCAtMTA1NCwxMiArMTA2MCwxMyBAQAogZXh0ZXJuIHZvaWQgZXhpdF9leHQ0X21iYWxsb2Modm9pZCk7CiBleHRlcm4gdm9pZCBleHQ0X21iX2ZyZWVfYmxvY2tzKGhhbmRsZV90ICosIHN0cnVjdCBpbm9kZSAqLAogCQl1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nLCBpbnQsIHVuc2lnbmVkIGxvbmcgKik7Ci1leHRlcm4gaW50IGV4dDRfbWJfYWRkX21vcmVfZ3JvdXBpbmZvKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCitleHRlcm4gaW50IGV4dDRfbWJfYWRkX2dyb3VwaW5mbyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAogCQlleHQ0X2dyb3VwX3QgaSwgc3RydWN0IGV4dDRfZ3JvdXBfZGVzYyAqZGVzYyk7CiBleHRlcm4gdm9pZCBleHQ0X21iX3VwZGF0ZV9ncm91cF9pbmZvKHN0cnVjdCBleHQ0X2dyb3VwX2luZm8gKmdycCwKIAkJZXh0NF9ncnBibGtfdCBhZGQpOwotCi0KK2V4dGVybiBpbnQgZXh0NF9tYl9nZXRfYnVkZHlfY2FjaGVfbG9jayhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgZXh0NF9ncm91cF90KTsKK2V4dGVybiB2b2lkIGV4dDRfbWJfcHV0X2J1ZGR5X2NhY2hlX2xvY2soc3RydWN0IHN1cGVyX2Jsb2NrICosCisJCQkJCQlleHQ0X2dyb3VwX3QsIGludCk7CiAvKiBpbm9kZS5jICovCiBpbnQgZXh0NF9mb3JnZXQoaGFuZGxlX3QgKmhhbmRsZSwgaW50IGlzX21ldGFkYXRhLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAogCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCBleHQ0X2ZzYmxrX3QgYmxvY2tucik7CkBAIC0xMDY5LDEwICsxMDc2LDYgQEAKIAkJCQkJCWV4dDRfbGJsa190LCBpbnQsIGludCAqKTsKIGludCBleHQ0X2dldF9ibG9jayhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzZWN0b3JfdCBpYmxvY2ssCiAJCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaF9yZXN1bHQsIGludCBjcmVhdGUpOwotaW50IGV4dDRfZ2V0X2Jsb2Nrc19oYW5kbGUoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSwKLQkJCQlleHQ0X2xibGtfdCBpYmxvY2ssIHVuc2lnbmVkIGxvbmcgbWF4YmxvY2tzLAotCQkJCXN0cnVjdCBidWZmZXJfaGVhZCAqYmhfcmVzdWx0LAotCQkJCWludCBjcmVhdGUsIGludCBleHRlbmRfZGlza3NpemUpOwogCiBleHRlcm4gc3RydWN0IGlub2RlICpleHQ0X2lnZXQoc3RydWN0IHN1cGVyX2Jsb2NrICosIHVuc2lnbmVkIGxvbmcpOwogZXh0ZXJuIGludCAgZXh0NF93cml0ZV9pbm9kZShzdHJ1Y3QgaW5vZGUgKiwgaW50KTsKQEAgLTExMjMsNiArMTEyNiw5IEBACiAJX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAzLCA0KSkpOwogZXh0ZXJuIHZvaWQgZXh0NF93YXJuaW5nKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgLi4uKQogCV9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgMywgNCkpKTsKK2V4dGVybiB2b2lkIGV4dDRfZ3JwX2xvY2tlZF9lcnJvcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgZXh0NF9ncm91cF90LAorCQkJCWNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCAuLi4pCisJX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCA0LCA1KSkpOwogZXh0ZXJuIHZvaWQgZXh0NF91cGRhdGVfZHluYW1pY19yZXYoc3RydWN0IHN1cGVyX2Jsb2NrICpzYik7CiBleHRlcm4gaW50IGV4dDRfdXBkYXRlX2NvbXBhdF9mZWF0dXJlKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCiAJCQkJCV9fdTMyIGNvbXBhdCk7CkBAIC0xMTM2LDEyICsxMTQyLDI4IEBACiAJCQkJICAgICAgc3RydWN0IGV4dDRfZ3JvdXBfZGVzYyAqYmcpOwogZXh0ZXJuIGV4dDRfZnNibGtfdCBleHQ0X2lub2RlX3RhYmxlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCiAJCQkJICAgICBzdHJ1Y3QgZXh0NF9ncm91cF9kZXNjICpiZyk7CitleHRlcm4gX191MzIgZXh0NF9mcmVlX2Jsa3NfY291bnQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJCQlzdHJ1Y3QgZXh0NF9ncm91cF9kZXNjICpiZyk7CitleHRlcm4gX191MzIgZXh0NF9mcmVlX2lub2Rlc19jb3VudChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQkJCSBzdHJ1Y3QgZXh0NF9ncm91cF9kZXNjICpiZyk7CitleHRlcm4gX191MzIgZXh0NF91c2VkX2RpcnNfY291bnQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJCQlzdHJ1Y3QgZXh0NF9ncm91cF9kZXNjICpiZyk7CitleHRlcm4gX191MzIgZXh0NF9pdGFibGVfdW51c2VkX2NvdW50KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCQkJICAgc3RydWN0IGV4dDRfZ3JvdXBfZGVzYyAqYmcpOwogZXh0ZXJuIHZvaWQgZXh0NF9ibG9ja19iaXRtYXBfc2V0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCiAJCQkJICBzdHJ1Y3QgZXh0NF9ncm91cF9kZXNjICpiZywgZXh0NF9mc2Jsa190IGJsayk7CiBleHRlcm4gdm9pZCBleHQ0X2lub2RlX2JpdG1hcF9zZXQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKIAkJCQkgIHN0cnVjdCBleHQ0X2dyb3VwX2Rlc2MgKmJnLCBleHQ0X2ZzYmxrX3QgYmxrKTsKIGV4dGVybiB2b2lkIGV4dDRfaW5vZGVfdGFibGVfc2V0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCiAJCQkJIHN0cnVjdCBleHQ0X2dyb3VwX2Rlc2MgKmJnLCBleHQ0X2ZzYmxrX3QgYmxrKTsKK2V4dGVybiB2b2lkIGV4dDRfZnJlZV9ibGtzX3NldChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQkJICAgICAgIHN0cnVjdCBleHQ0X2dyb3VwX2Rlc2MgKmJnLCBfX3UzMiBjb3VudCk7CitleHRlcm4gdm9pZCBleHQ0X2ZyZWVfaW5vZGVzX3NldChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQkJCXN0cnVjdCBleHQ0X2dyb3VwX2Rlc2MgKmJnLCBfX3UzMiBjb3VudCk7CitleHRlcm4gdm9pZCBleHQ0X3VzZWRfZGlyc19zZXQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJCQlzdHJ1Y3QgZXh0NF9ncm91cF9kZXNjICpiZywgX191MzIgY291bnQpOworZXh0ZXJuIHZvaWQgZXh0NF9pdGFibGVfdW51c2VkX3NldChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQkJCSAgIHN0cnVjdCBleHQ0X2dyb3VwX2Rlc2MgKmJnLCBfX3UzMiBjb3VudCk7CiAKIHN0YXRpYyBpbmxpbmUgZXh0NF9mc2Jsa190IGV4dDRfYmxvY2tzX2NvdW50KHN0cnVjdCBleHQ0X3N1cGVyX2Jsb2NrICplcykKIHsKQEAgLTEyMjUsMTEgKzEyNDcsMTEgQEAKIH0gd2hpbGUgKDApCiAKICNpZmRlZiBDT05GSUdfU01QCi0vKiBFYWNoIENQVSBjYW4gYWNjdW11bGF0ZSBGQkNfQkFUQ0ggYmxvY2tzIGluIHRoZWlyIGxvY2FsCisvKiBFYWNoIENQVSBjYW4gYWNjdW11bGF0ZSBwZXJjcHVfY291bnRlcl9iYXRjaCBibG9ja3MgaW4gdGhlaXIgbG9jYWwKICAqIGNvdW50ZXJzLiBTbyB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSB3ZSBoYXZlIGZyZWUgYmxvY2tzIG1vcmUKLSAqIHRoYW4gRkJDX0JBVENIICAqIG5yX2NwdV9pZHMuIEFsc28gYWRkIGEgd2luZG93IG9mIDQgdGltZXMuCisgKiB0aGFuIHBlcmNwdV9jb3VudGVyX2JhdGNoICAqIG5yX2NwdV9pZHMuIEFsc28gYWRkIGEgd2luZG93IG9mIDQgdGltZXMuCiAgKi8KLSNkZWZpbmUgRVhUNF9GUkVFQkxPQ0tTX1dBVEVSTUFSSyAoNCAqIChGQkNfQkFUQ0ggKiBucl9jcHVfaWRzKSkKKyNkZWZpbmUgRVhUNF9GUkVFQkxPQ0tTX1dBVEVSTUFSSyAoNCAqIChwZXJjcHVfY291bnRlcl9iYXRjaCAqIG5yX2NwdV9pZHMpKQogI2Vsc2UKICNkZWZpbmUgRVhUNF9GUkVFQkxPQ0tTX1dBVEVSTUFSSyAwCiAjZW5kaWYKQEAgLTEyNDYsNiArMTI2OCw1MCBAQAogCXJldHVybiA7CiB9CiAKK3N0cnVjdCBleHQ0X2dyb3VwX2luZm8geworCXVuc2lnbmVkIGxvbmcgICBiYl9zdGF0ZTsKKwlzdHJ1Y3QgcmJfcm9vdCAgYmJfZnJlZV9yb290OworCXVuc2lnbmVkIHNob3J0ICBiYl9maXJzdF9mcmVlOworCXVuc2lnbmVkIHNob3J0ICBiYl9mcmVlOworCXVuc2lnbmVkIHNob3J0ICBiYl9mcmFnbWVudHM7CisJc3RydWN0ICAgICAgICAgIGxpc3RfaGVhZCBiYl9wcmVhbGxvY19saXN0OworI2lmZGVmIERPVUJMRV9DSEVDSworCXZvaWQgICAgICAgICAgICAqYmJfYml0bWFwOworI2VuZGlmCisJc3RydWN0IHJ3X3NlbWFwaG9yZSBhbGxvY19zZW07CisJdW5zaWduZWQgc2hvcnQgIGJiX2NvdW50ZXJzW107Cit9OworCisjZGVmaW5lIEVYVDRfR1JPVVBfSU5GT19ORUVEX0lOSVRfQklUCTAKKyNkZWZpbmUgRVhUNF9HUk9VUF9JTkZPX0xPQ0tFRF9CSVQJMQorCisjZGVmaW5lIEVYVDRfTUJfR1JQX05FRURfSU5JVChncnApCVwKKwkodGVzdF9iaXQoRVhUNF9HUk9VUF9JTkZPX05FRURfSU5JVF9CSVQsICYoKGdycCktPmJiX3N0YXRlKSkpCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBleHQ0X2xvY2tfZ3JvdXAoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgZXh0NF9ncm91cF90IGdyb3VwKQoreworCXN0cnVjdCBleHQ0X2dyb3VwX2luZm8gKmdyaW5mbyA9IGV4dDRfZ2V0X2dyb3VwX2luZm8oc2IsIGdyb3VwKTsKKworCWJpdF9zcGluX2xvY2soRVhUNF9HUk9VUF9JTkZPX0xPQ0tFRF9CSVQsICYoZ3JpbmZvLT5iYl9zdGF0ZSkpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZXh0NF91bmxvY2tfZ3JvdXAoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJCQkJZXh0NF9ncm91cF90IGdyb3VwKQoreworCXN0cnVjdCBleHQ0X2dyb3VwX2luZm8gKmdyaW5mbyA9IGV4dDRfZ2V0X2dyb3VwX2luZm8oc2IsIGdyb3VwKTsKKworCWJpdF9zcGluX3VubG9jayhFWFQ0X0dST1VQX0lORk9fTE9DS0VEX0JJVCwgJihncmluZm8tPmJiX3N0YXRlKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGV4dDRfaXNfZ3JvdXBfbG9ja2VkKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCQkJCWV4dDRfZ3JvdXBfdCBncm91cCkKK3sKKwlzdHJ1Y3QgZXh0NF9ncm91cF9pbmZvICpncmluZm8gPSBleHQ0X2dldF9ncm91cF9pbmZvKHNiLCBncm91cCk7CisKKwlyZXR1cm4gYml0X3NwaW5faXNfbG9ja2VkKEVYVDRfR1JPVVBfSU5GT19MT0NLRURfQklULAorCQkJCQkJJihncmluZm8tPmJiX3N0YXRlKSk7Cit9CisKIC8qCiAgKiBJbm9kZXMgYW5kIGZpbGVzIG9wZXJhdGlvbnMKICAqLwpAQCAtMTI3MSwxOCArMTMzNywzOCBAQAogZXh0ZXJuIGludCBleHQ0X2V4dF9pbmRleF90cmFuc19ibG9ja3Moc3RydWN0IGlub2RlICppbm9kZSwgaW50IG5yYmxvY2tzLAogCQkJCSAgICAgICBpbnQgY2h1bmspOwogZXh0ZXJuIGludCBleHQ0X2V4dF9nZXRfYmxvY2tzKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCQlleHQ0X2xibGtfdCBpYmxvY2ssCi0JCQl1bnNpZ25lZCBsb25nIG1heF9ibG9ja3MsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmhfcmVzdWx0LAotCQkJaW50IGNyZWF0ZSwgaW50IGV4dGVuZF9kaXNrc2l6ZSk7CisJCQkgICAgICAgZXh0NF9sYmxrX3QgaWJsb2NrLCB1bnNpZ25lZCBpbnQgbWF4X2Jsb2NrcywKKwkJCSAgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoX3Jlc3VsdCwKKwkJCSAgICAgICBpbnQgY3JlYXRlLCBpbnQgZXh0ZW5kX2Rpc2tzaXplKTsKIGV4dGVybiB2b2lkIGV4dDRfZXh0X3RydW5jYXRlKHN0cnVjdCBpbm9kZSAqKTsKIGV4dGVybiB2b2lkIGV4dDRfZXh0X2luaXQoc3RydWN0IHN1cGVyX2Jsb2NrICopOwogZXh0ZXJuIHZvaWQgZXh0NF9leHRfcmVsZWFzZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKik7CiBleHRlcm4gbG9uZyBleHQ0X2ZhbGxvY2F0ZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbW9kZSwgbG9mZl90IG9mZnNldCwKIAkJCSAgbG9mZl90IGxlbik7CiBleHRlcm4gaW50IGV4dDRfZ2V0X2Jsb2Nrc193cmFwKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCQlzZWN0b3JfdCBibG9jaywgdW5zaWduZWQgbG9uZyBtYXhfYmxvY2tzLAorCQkJc2VjdG9yX3QgYmxvY2ssIHVuc2lnbmVkIGludCBtYXhfYmxvY2tzLAogCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgaW50IGNyZWF0ZSwKIAkJCWludCBleHRlbmRfZGlza3NpemUsIGludCBmbGFnKTsKK2V4dGVybiBpbnQgZXh0NF9maWVtYXAoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpZW1hcF9leHRlbnRfaW5mbyAqZmllaW5mbywKKwkJCV9fdTY0IHN0YXJ0LCBfX3U2NCBsZW4pOworCisvKgorICogQWRkIG5ldyBtZXRob2QgdG8gdGVzdCB3ZXRoZXIgYmxvY2sgYW5kIGlub2RlIGJpdG1hcHMgYXJlIHByb3Blcmx5CisgKiBpbml0aWFsaXplZC4gV2l0aCB1bmluaXRfYmcgcmVhZGluZyB0aGUgYmxvY2sgZnJvbSBkaXNrIGlzIG5vdCBlbm91Z2gKKyAqIHRvIG1hcmsgdGhlIGJpdG1hcCB1cHRvZGF0ZS4gV2UgbmVlZCB0byBhbHNvIHplcm8tb3V0IHRoZSBiaXRtYXAKKyAqLworI2RlZmluZSBCSF9CSVRNQVBfVVBUT0RBVEUgQkhfSkJEUHJpdmF0ZVN0YXJ0CisKK3N0YXRpYyBpbmxpbmUgaW50IGJpdG1hcF91cHRvZGF0ZShzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQoreworCXJldHVybiAoYnVmZmVyX3VwdG9kYXRlKGJoKSAmJgorCQkJdGVzdF9iaXQoQkhfQklUTUFQX1VQVE9EQVRFLCAmKGJoKS0+Yl9zdGF0ZSkpOworfQorc3RhdGljIGlubGluZSB2b2lkIHNldF9iaXRtYXBfdXB0b2RhdGUoc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKK3sKKwlzZXRfYml0KEJIX0JJVE1BUF9VUFRPREFURSwgJihiaCktPmJfc3RhdGUpOworfQorCiAjZW5kaWYJLyogX19LRVJORUxfXyAqLwogCiAjZW5kaWYJLyogX0VYVDRfSCAqLwpkaWZmIC0tZ2l0IGEvZnMvZXh0NC9leHQ0X2V4dGVudHMuaCBiL2ZzL2V4dDQvZXh0NF9leHRlbnRzLmgKaW5kZXggYmVjN2NlNS4uMThjYjY3YiAxMDA2NDQKLS0tIGEvZnMvZXh0NC9leHQ0X2V4dGVudHMuaAorKysgYi9mcy9leHQ0L2V4dDRfZXh0ZW50cy5oCkBAIC0xOTQsMTEgKzE5NCw2IEBACiAJcmV0dXJuIGxlMTZfdG9fY3B1KGV4dF9pbm9kZV9oZHIoaW5vZGUpLT5laF9kZXB0aCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBleHQ0X2V4dF90cmVlX2NoYW5nZWQoc3RydWN0IGlub2RlICppbm9kZSkKLXsKLQlFWFQ0X0koaW5vZGUpLT5pX2V4dF9nZW5lcmF0aW9uKys7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgdm9pZAogZXh0NF9leHRfaW52YWxpZGF0ZV9jYWNoZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQogewpkaWZmIC0tZ2l0IGEvZnMvZXh0NC9leHQ0X2kuaCBiL2ZzL2V4dDQvZXh0NF9pLmgKaW5kZXggNWMxMjRjMC4uZTY5YWNjMSAxMDA2NDQKLS0tIGEvZnMvZXh0NC9leHQ0X2kuaAorKysgYi9mcy9leHQ0L2V4dDRfaS5oCkBAIC0zMSw3ICszMSw3IEBACiB0eXBlZGVmIF9fdTMyIGV4dDRfbGJsa190OwogCiAvKiBkYXRhIHR5cGUgZm9yIGJsb2NrIGdyb3VwIG51bWJlciAqLwotdHlwZWRlZiB1bnNpZ25lZCBsb25nIGV4dDRfZ3JvdXBfdDsKK3R5cGVkZWYgdW5zaWduZWQgaW50IGV4dDRfZ3JvdXBfdDsKIAogI2RlZmluZSByc3Zfc3RhcnQgcnN2X3dpbmRvdy5fcnN2X3N0YXJ0CiAjZGVmaW5lIHJzdl9lbmQgcnN2X3dpbmRvdy5fcnN2X2VuZApAQCAtMTAwLDkgKzEwMCw2IEBACiAJICovCiAJbG9mZl90CWlfZGlza3NpemU7CiAKLQkvKiBvbi1kaXNrIGFkZGl0aW9uYWwgbGVuZ3RoICovCi0JX191MTYgaV9leHRyYV9pc2l6ZTsKLQogCS8qCiAJICogaV9kYXRhX3NlbSBpcyBmb3Igc2VyaWFsaXNpbmcgZXh0NF90cnVuY2F0ZSgpIGFnYWluc3QKIAkgKiBleHQ0X2dldGJsb2NrKCkuICBJbiB0aGUgMi40IGV4dDIgZGVzaWduLCBncmVhdCBjaHVua3Mgb2YgaW5vZGUncwpAQCAtMTE3LDcgKzExNCw2IEBACiAJc3RydWN0IGlub2RlIHZmc19pbm9kZTsKIAlzdHJ1Y3QgamJkMl9pbm9kZSBqaW5vZGU7CiAKLQl1bnNpZ25lZCBsb25nIGlfZXh0X2dlbmVyYXRpb247CiAJc3RydWN0IGV4dDRfZXh0X2NhY2hlIGlfY2FjaGVkX2V4dGVudDsKIAkvKgogCSAqIEZpbGUgY3JlYXRpb24gdGltZS4gSXRzIGZ1bmN0aW9uIGlzIHNhbWUgYXMgdGhhdCBvZgpAQCAtMTMwLDEwICsxMjYsMTQgQEAKIAlzcGlubG9ja190IGlfcHJlYWxsb2NfbG9jazsKIAogCS8qIGFsbG9jYXRpb24gcmVzZXJ2YXRpb24gaW5mbyBmb3IgZGVsYWxsb2MgKi8KLQl1bnNpZ25lZCBsb25nIGlfcmVzZXJ2ZWRfZGF0YV9ibG9ja3M7Ci0JdW5zaWduZWQgbG9uZyBpX3Jlc2VydmVkX21ldGFfYmxvY2tzOwotCXVuc2lnbmVkIGxvbmcgaV9hbGxvY2F0ZWRfbWV0YV9ibG9ja3M7CisJdW5zaWduZWQgaW50IGlfcmVzZXJ2ZWRfZGF0YV9ibG9ja3M7CisJdW5zaWduZWQgaW50IGlfcmVzZXJ2ZWRfbWV0YV9ibG9ja3M7CisJdW5zaWduZWQgaW50IGlfYWxsb2NhdGVkX21ldGFfYmxvY2tzOwogCXVuc2lnbmVkIHNob3J0IGlfZGVsYWxsb2NfcmVzZXJ2ZWRfZmxhZzsKKworCS8qIG9uLWRpc2sgYWRkaXRpb25hbCBsZW5ndGggKi8KKwlfX3UxNiBpX2V4dHJhX2lzaXplOworCiAJc3BpbmxvY2tfdCBpX2Jsb2NrX3Jlc2VydmF0aW9uX2xvY2s7CiB9OwogCmRpZmYgLS1naXQgYS9mcy9leHQ0L2V4dDRfamJkMi5jIGIvZnMvZXh0NC9leHQ0X2piZDIuYwppbmRleCBjNzUzODRiLi5hZDEzYTg0IDEwMDY0NAotLS0gYS9mcy9leHQ0L2V4dDRfamJkMi5jCisrKyBiL2ZzL2V4dDQvZXh0NF9qYmQyLmMKQEAgLTcsNTMgKzcsOTYgQEAKIGludCBfX2V4dDRfam91cm5hbF9nZXRfdW5kb19hY2Nlc3MoY29uc3QgY2hhciAqd2hlcmUsIGhhbmRsZV90ICpoYW5kbGUsCiAJCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKIHsKLQlpbnQgZXJyID0gamJkMl9qb3VybmFsX2dldF91bmRvX2FjY2VzcyhoYW5kbGUsIGJoKTsKLQlpZiAoZXJyKQotCQlleHQ0X2pvdXJuYWxfYWJvcnRfaGFuZGxlKHdoZXJlLCBfX2Z1bmNfXywgYmgsIGhhbmRsZSwgZXJyKTsKKwlpbnQgZXJyID0gMDsKKworCWlmIChleHQ0X2hhbmRsZV92YWxpZChoYW5kbGUpKSB7CisJCWVyciA9IGpiZDJfam91cm5hbF9nZXRfdW5kb19hY2Nlc3MoaGFuZGxlLCBiaCk7CisJCWlmIChlcnIpCisJCQlleHQ0X2pvdXJuYWxfYWJvcnRfaGFuZGxlKHdoZXJlLCBfX2Z1bmNfXywgYmgsCisJCQkJCQkgIGhhbmRsZSwgZXJyKTsKKwl9CiAJcmV0dXJuIGVycjsKIH0KIAogaW50IF9fZXh0NF9qb3VybmFsX2dldF93cml0ZV9hY2Nlc3MoY29uc3QgY2hhciAqd2hlcmUsIGhhbmRsZV90ICpoYW5kbGUsCiAJCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKIHsKLQlpbnQgZXJyID0gamJkMl9qb3VybmFsX2dldF93cml0ZV9hY2Nlc3MoaGFuZGxlLCBiaCk7Ci0JaWYgKGVycikKLQkJZXh0NF9qb3VybmFsX2Fib3J0X2hhbmRsZSh3aGVyZSwgX19mdW5jX18sIGJoLCBoYW5kbGUsIGVycik7CisJaW50IGVyciA9IDA7CisKKwlpZiAoZXh0NF9oYW5kbGVfdmFsaWQoaGFuZGxlKSkgeworCQllcnIgPSBqYmQyX2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGUsIGJoKTsKKwkJaWYgKGVycikKKwkJCWV4dDRfam91cm5hbF9hYm9ydF9oYW5kbGUod2hlcmUsIF9fZnVuY19fLCBiaCwKKwkJCQkJCSAgaGFuZGxlLCBlcnIpOworCX0KIAlyZXR1cm4gZXJyOwogfQogCiBpbnQgX19leHQ0X2pvdXJuYWxfZm9yZ2V0KGNvbnN0IGNoYXIgKndoZXJlLCBoYW5kbGVfdCAqaGFuZGxlLAogCQkJCXN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCiB7Ci0JaW50IGVyciA9IGpiZDJfam91cm5hbF9mb3JnZXQoaGFuZGxlLCBiaCk7Ci0JaWYgKGVycikKLQkJZXh0NF9qb3VybmFsX2Fib3J0X2hhbmRsZSh3aGVyZSwgX19mdW5jX18sIGJoLCBoYW5kbGUsIGVycik7CisJaW50IGVyciA9IDA7CisKKwlpZiAoZXh0NF9oYW5kbGVfdmFsaWQoaGFuZGxlKSkgeworCQllcnIgPSBqYmQyX2pvdXJuYWxfZm9yZ2V0KGhhbmRsZSwgYmgpOworCQlpZiAoZXJyKQorCQkJZXh0NF9qb3VybmFsX2Fib3J0X2hhbmRsZSh3aGVyZSwgX19mdW5jX18sIGJoLAorCQkJCQkJICBoYW5kbGUsIGVycik7CisJfQogCXJldHVybiBlcnI7CiB9CiAKIGludCBfX2V4dDRfam91cm5hbF9yZXZva2UoY29uc3QgY2hhciAqd2hlcmUsIGhhbmRsZV90ICpoYW5kbGUsCiAJCQkJZXh0NF9mc2Jsa190IGJsb2NrbnIsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCiB7Ci0JaW50IGVyciA9IGpiZDJfam91cm5hbF9yZXZva2UoaGFuZGxlLCBibG9ja25yLCBiaCk7Ci0JaWYgKGVycikKLQkJZXh0NF9qb3VybmFsX2Fib3J0X2hhbmRsZSh3aGVyZSwgX19mdW5jX18sIGJoLCBoYW5kbGUsIGVycik7CisJaW50IGVyciA9IDA7CisKKwlpZiAoZXh0NF9oYW5kbGVfdmFsaWQoaGFuZGxlKSkgeworCQllcnIgPSBqYmQyX2pvdXJuYWxfcmV2b2tlKGhhbmRsZSwgYmxvY2tuciwgYmgpOworCQlpZiAoZXJyKQorCQkJZXh0NF9qb3VybmFsX2Fib3J0X2hhbmRsZSh3aGVyZSwgX19mdW5jX18sIGJoLAorCQkJCQkJICBoYW5kbGUsIGVycik7CisJfQogCXJldHVybiBlcnI7CiB9CiAKIGludCBfX2V4dDRfam91cm5hbF9nZXRfY3JlYXRlX2FjY2Vzcyhjb25zdCBjaGFyICp3aGVyZSwKIAkJCQloYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQogewotCWludCBlcnIgPSBqYmQyX2pvdXJuYWxfZ2V0X2NyZWF0ZV9hY2Nlc3MoaGFuZGxlLCBiaCk7Ci0JaWYgKGVycikKLQkJZXh0NF9qb3VybmFsX2Fib3J0X2hhbmRsZSh3aGVyZSwgX19mdW5jX18sIGJoLCBoYW5kbGUsIGVycik7CisJaW50IGVyciA9IDA7CisKKwlpZiAoZXh0NF9oYW5kbGVfdmFsaWQoaGFuZGxlKSkgeworCQllcnIgPSBqYmQyX2pvdXJuYWxfZ2V0X2NyZWF0ZV9hY2Nlc3MoaGFuZGxlLCBiaCk7CisJCWlmIChlcnIpCisJCQlleHQ0X2pvdXJuYWxfYWJvcnRfaGFuZGxlKHdoZXJlLCBfX2Z1bmNfXywgYmgsCisJCQkJCQkgIGhhbmRsZSwgZXJyKTsKKwl9CiAJcmV0dXJuIGVycjsKIH0KIAotaW50IF9fZXh0NF9qb3VybmFsX2RpcnR5X21ldGFkYXRhKGNvbnN0IGNoYXIgKndoZXJlLAotCQkJCWhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCitpbnQgX19leHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShjb25zdCBjaGFyICp3aGVyZSwgaGFuZGxlX3QgKmhhbmRsZSwKKwkJCQkgc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKIHsKLQlpbnQgZXJyID0gamJkMl9qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgYmgpOwotCWlmIChlcnIpCi0JCWV4dDRfam91cm5hbF9hYm9ydF9oYW5kbGUod2hlcmUsIF9fZnVuY19fLCBiaCwgaGFuZGxlLCBlcnIpOworCWludCBlcnIgPSAwOworCisJaWYgKGV4dDRfaGFuZGxlX3ZhbGlkKGhhbmRsZSkpIHsKKwkJZXJyID0gamJkMl9qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgYmgpOworCQlpZiAoZXJyKQorCQkJZXh0NF9qb3VybmFsX2Fib3J0X2hhbmRsZSh3aGVyZSwgX19mdW5jX18sIGJoLAorCQkJCQkJICBoYW5kbGUsIGVycik7CisJfSBlbHNlIHsKKwkJbWFya19idWZmZXJfZGlydHkoYmgpOworCQlpZiAoaW5vZGUgJiYgaW5vZGVfbmVlZHNfc3luYyhpbm9kZSkpIHsKKwkJCXN5bmNfZGlydHlfYnVmZmVyKGJoKTsKKwkJCWlmIChidWZmZXJfcmVxKGJoKSAmJiAhYnVmZmVyX3VwdG9kYXRlKGJoKSkgeworCQkJCWV4dDRfZXJyb3IoaW5vZGUtPmlfc2IsIF9fZnVuY19fLAorCQkJCQkgICAiSU8gZXJyb3Igc3luY2luZyBpbm9kZSwgIgorCQkJCQkgICAiaW5vZGU9JWx1LCBibG9jaz0lbGx1IiwKKwkJCQkJICAgaW5vZGUtPmlfaW5vLAorCQkJCQkgICAodW5zaWduZWQgbG9uZyBsb25nKSBiaC0+Yl9ibG9ja25yKTsKKwkJCQllcnIgPSAtRUlPOworCQkJfQorCQl9CisJfQogCXJldHVybiBlcnI7CiB9CmRpZmYgLS1naXQgYS9mcy9leHQ0L2V4dDRfamJkMi5oIGIvZnMvZXh0NC9leHQ0X2piZDIuaAppbmRleCBiNDU1YzY4Li5iZTJmNDI2IDEwMDY0NAotLS0gYS9mcy9leHQ0L2V4dDRfamJkMi5oCisrKyBiL2ZzL2V4dDQvZXh0NF9qYmQyLmgKQEAgLTMyLDggKzMyLDggQEAKICAqIDUgbGV2ZWxzIG9mIHRyZWUgKyByb290IHdoaWNoIGFyZSBzdG9yZWQgaW4gdGhlIGlub2RlLiAqLwogCiAjZGVmaW5lIEVYVDRfU0lOR0xFREFUQV9UUkFOU19CTE9DS1Moc2IpCQkJCVwKLQkoRVhUNF9IQVNfSU5DT01QQVRfRkVBVFVSRShzYiwgRVhUNF9GRUFUVVJFX0lOQ09NUEFUX0VYVEVOVFMpCVwKLQkJfHwgdGVzdF9vcHQoc2IsIEVYVEVOVFMpID8gMjdVIDogOFUpCisJKEVYVDRfSEFTX0lOQ09NUEFUX0ZFQVRVUkUoc2IsIEVYVDRfRkVBVFVSRV9JTkNPTVBBVF9FWFRFTlRTKSAgIFwKKwkgPyAyN1UgOiA4VSkKIAogLyogRXh0ZW5kZWQgYXR0cmlidXRlIG9wZXJhdGlvbnMgdG91Y2ggYXQgbW9zdCB0d28gZGF0YSBidWZmZXJzLAogICogdHdvIGJpdG1hcCBidWZmZXJzLCBhbmQgdHdvIGdyb3VwIHN1bW1hcmllcywgaW4gYWRkaXRpb24gdG8gdGhlIGlub2RlCkBAIC0xMjIsMTIgKzEyMiw2IEBACiAgKiBiZWVuIGRvbmUgeWV0LgogICovCiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBleHQ0X2pvdXJuYWxfcmVsZWFzZV9idWZmZXIoaGFuZGxlX3QgKmhhbmRsZSwKLQkJCQkJCXN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCi17Ci0JamJkMl9qb3VybmFsX3JlbGVhc2VfYnVmZmVyKGhhbmRsZSwgYmgpOwotfQotCiB2b2lkIGV4dDRfam91cm5hbF9hYm9ydF9oYW5kbGUoY29uc3QgY2hhciAqY2FsbGVyLCBjb25zdCBjaGFyICplcnJfZm4sCiAJCXN0cnVjdCBidWZmZXJfaGVhZCAqYmgsIGhhbmRsZV90ICpoYW5kbGUsIGludCBlcnIpOwogCkBAIC0xNDYsOCArMTQwLDggQEAKIGludCBfX2V4dDRfam91cm5hbF9nZXRfY3JlYXRlX2FjY2Vzcyhjb25zdCBjaGFyICp3aGVyZSwKIAkJCQloYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKTsKIAotaW50IF9fZXh0NF9qb3VybmFsX2RpcnR5X21ldGFkYXRhKGNvbnN0IGNoYXIgKndoZXJlLAotCQkJCWhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpOworaW50IF9fZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEoY29uc3QgY2hhciAqd2hlcmUsIGhhbmRsZV90ICpoYW5kbGUsCisJCQkJIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpOwogCiAjZGVmaW5lIGV4dDRfam91cm5hbF9nZXRfdW5kb19hY2Nlc3MoaGFuZGxlLCBiaCkgXAogCV9fZXh0NF9qb3VybmFsX2dldF91bmRvX2FjY2VzcyhfX2Z1bmNfXywgKGhhbmRsZSksIChiaCkpCkBAIC0xNTcsMTQgKzE1MSw1NyBAQAogCV9fZXh0NF9qb3VybmFsX3Jldm9rZShfX2Z1bmNfXywgKGhhbmRsZSksIChibG9ja25yKSwgKGJoKSkKICNkZWZpbmUgZXh0NF9qb3VybmFsX2dldF9jcmVhdGVfYWNjZXNzKGhhbmRsZSwgYmgpIFwKIAlfX2V4dDRfam91cm5hbF9nZXRfY3JlYXRlX2FjY2VzcyhfX2Z1bmNfXywgKGhhbmRsZSksIChiaCkpCi0jZGVmaW5lIGV4dDRfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGJoKSBcCi0JX19leHQ0X2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoX19mdW5jX18sIChoYW5kbGUpLCAoYmgpKQogI2RlZmluZSBleHQ0X2pvdXJuYWxfZm9yZ2V0KGhhbmRsZSwgYmgpIFwKIAlfX2V4dDRfam91cm5hbF9mb3JnZXQoX19mdW5jX18sIChoYW5kbGUpLCAoYmgpKQorI2RlZmluZSBleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGlub2RlLCBiaCkgXAorCV9fZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEoX19mdW5jX18sIChoYW5kbGUpLCAoaW5vZGUpLCAoYmgpKQogCiBoYW5kbGVfdCAqZXh0NF9qb3VybmFsX3N0YXJ0X3NiKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCBuYmxvY2tzKTsKIGludCBfX2V4dDRfam91cm5hbF9zdG9wKGNvbnN0IGNoYXIgKndoZXJlLCBoYW5kbGVfdCAqaGFuZGxlKTsKIAorI2RlZmluZSBFWFQ0X05PSk9VUk5BTF9IQU5ETEUJKChoYW5kbGVfdCAqKSAweDEpCisKK3N0YXRpYyBpbmxpbmUgaW50IGV4dDRfaGFuZGxlX3ZhbGlkKGhhbmRsZV90ICpoYW5kbGUpCit7CisJaWYgKGhhbmRsZSA9PSBFWFQ0X05PSk9VUk5BTF9IQU5ETEUpCisJCXJldHVybiAwOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZXh0NF9oYW5kbGVfc3luYyhoYW5kbGVfdCAqaGFuZGxlKQoreworCWlmIChleHQ0X2hhbmRsZV92YWxpZChoYW5kbGUpKQorCQloYW5kbGUtPmhfc3luYyA9IDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBleHQ0X2hhbmRsZV9yZWxlYXNlX2J1ZmZlcihoYW5kbGVfdCAqaGFuZGxlLAorCQkJCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKK3sKKwlpZiAoZXh0NF9oYW5kbGVfdmFsaWQoaGFuZGxlKSkKKwkJamJkMl9qb3VybmFsX3JlbGVhc2VfYnVmZmVyKGhhbmRsZSwgYmgpOworfQorCitzdGF0aWMgaW5saW5lIGludCBleHQ0X2hhbmRsZV9pc19hYm9ydGVkKGhhbmRsZV90ICpoYW5kbGUpCit7CisJaWYgKGV4dDRfaGFuZGxlX3ZhbGlkKGhhbmRsZSkpCisJCXJldHVybiBpc19oYW5kbGVfYWJvcnRlZChoYW5kbGUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBleHQ0X2hhbmRsZV9oYXNfZW5vdWdoX2NyZWRpdHMoaGFuZGxlX3QgKmhhbmRsZSwgaW50IG5lZWRlZCkKK3sKKwlpZiAoZXh0NF9oYW5kbGVfdmFsaWQoaGFuZGxlKSAmJiBoYW5kbGUtPmhfYnVmZmVyX2NyZWRpdHMgPCBuZWVkZWQpCisJCXJldHVybiAwOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZXh0NF9qb3VybmFsX3JlbGVhc2VfYnVmZmVyKGhhbmRsZV90ICpoYW5kbGUsCisJCQkJCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQoreworCWlmIChleHQ0X2hhbmRsZV92YWxpZChoYW5kbGUpKQorCQlqYmQyX2pvdXJuYWxfcmVsZWFzZV9idWZmZXIoaGFuZGxlLCBiaCk7Cit9CisKIHN0YXRpYyBpbmxpbmUgaGFuZGxlX3QgKmV4dDRfam91cm5hbF9zdGFydChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbmJsb2NrcykKIHsKIAlyZXR1cm4gZXh0NF9qb3VybmFsX3N0YXJ0X3NiKGlub2RlLT5pX3NiLCBuYmxvY2tzKTsKQEAgLTE4MCwyNyArMjE3LDM3IEBACiAKIHN0YXRpYyBpbmxpbmUgaW50IGV4dDRfam91cm5hbF9leHRlbmQoaGFuZGxlX3QgKmhhbmRsZSwgaW50IG5ibG9ja3MpCiB7Ci0JcmV0dXJuIGpiZDJfam91cm5hbF9leHRlbmQoaGFuZGxlLCBuYmxvY2tzKTsKKwlpZiAoZXh0NF9oYW5kbGVfdmFsaWQoaGFuZGxlKSkKKwkJcmV0dXJuIGpiZDJfam91cm5hbF9leHRlbmQoaGFuZGxlLCBuYmxvY2tzKTsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgZXh0NF9qb3VybmFsX3Jlc3RhcnQoaGFuZGxlX3QgKmhhbmRsZSwgaW50IG5ibG9ja3MpCiB7Ci0JcmV0dXJuIGpiZDJfam91cm5hbF9yZXN0YXJ0KGhhbmRsZSwgbmJsb2Nrcyk7CisJaWYgKGV4dDRfaGFuZGxlX3ZhbGlkKGhhbmRsZSkpCisJCXJldHVybiBqYmQyX2pvdXJuYWxfcmVzdGFydChoYW5kbGUsIG5ibG9ja3MpOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW5saW5lIGludCBleHQ0X2pvdXJuYWxfYmxvY2tzX3Blcl9wYWdlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7Ci0JcmV0dXJuIGpiZDJfam91cm5hbF9ibG9ja3NfcGVyX3BhZ2UoaW5vZGUpOworCWlmIChFWFQ0X0pPVVJOQUwoaW5vZGUpICE9IE5VTEwpCisJCXJldHVybiBqYmQyX2pvdXJuYWxfYmxvY2tzX3Blcl9wYWdlKGlub2RlKTsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgZXh0NF9qb3VybmFsX2ZvcmNlX2NvbW1pdChqb3VybmFsX3QgKmpvdXJuYWwpCiB7Ci0JcmV0dXJuIGpiZDJfam91cm5hbF9mb3JjZV9jb21taXQoam91cm5hbCk7CisJaWYgKGpvdXJuYWwpCisJCXJldHVybiBqYmQyX2pvdXJuYWxfZm9yY2VfY29tbWl0KGpvdXJuYWwpOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW5saW5lIGludCBleHQ0X2piZDJfZmlsZV9pbm9kZShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlKQogewotCXJldHVybiBqYmQyX2pvdXJuYWxfZmlsZV9pbm9kZShoYW5kbGUsICZFWFQ0X0koaW5vZGUpLT5qaW5vZGUpOworCWlmIChleHQ0X2hhbmRsZV92YWxpZChoYW5kbGUpKQorCQlyZXR1cm4gamJkMl9qb3VybmFsX2ZpbGVfaW5vZGUoaGFuZGxlLCAmRVhUNF9JKGlub2RlKS0+amlub2RlKTsKKwlyZXR1cm4gMDsKIH0KIAogLyogc3VwZXIuYyAqLwpAQCAtMjA4LDYgKzI1NSw4IEBACiAKIHN0YXRpYyBpbmxpbmUgaW50IGV4dDRfc2hvdWxkX2pvdXJuYWxfZGF0YShzdHJ1Y3QgaW5vZGUgKmlub2RlKQogeworCWlmIChFWFQ0X0pPVVJOQUwoaW5vZGUpID09IE5VTEwpCisJCXJldHVybiAwOwogCWlmICghU19JU1JFRyhpbm9kZS0+aV9tb2RlKSkKIAkJcmV0dXJuIDE7CiAJaWYgKHRlc3Rfb3B0KGlub2RlLT5pX3NiLCBEQVRBX0ZMQUdTKSA9PSBFWFQ0X01PVU5UX0pPVVJOQUxfREFUQSkKQEAgLTIxOSw2ICsyNjgsOCBAQAogCiBzdGF0aWMgaW5saW5lIGludCBleHQ0X3Nob3VsZF9vcmRlcl9kYXRhKHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7CisJaWYgKEVYVDRfSk9VUk5BTChpbm9kZSkgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CiAJaWYgKCFTX0lTUkVHKGlub2RlLT5pX21vZGUpKQogCQlyZXR1cm4gMDsKIAlpZiAoRVhUNF9JKGlub2RlKS0+aV9mbGFncyAmIEVYVDRfSk9VUk5BTF9EQVRBX0ZMKQpAQCAtMjMwLDYgKzI4MSw4IEBACiAKIHN0YXRpYyBpbmxpbmUgaW50IGV4dDRfc2hvdWxkX3dyaXRlYmFja19kYXRhKHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7CisJaWYgKEVYVDRfSk9VUk5BTChpbm9kZSkgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CiAJaWYgKCFTX0lTUkVHKGlub2RlLT5pX21vZGUpKQogCQlyZXR1cm4gMDsKIAlpZiAoRVhUNF9JKGlub2RlKS0+aV9mbGFncyAmIEVYVDRfSk9VUk5BTF9EQVRBX0ZMKQpkaWZmIC0tZ2l0IGEvZnMvZXh0NC9leHQ0X3NiLmggYi9mcy9leHQ0L2V4dDRfc2IuaAppbmRleCBiMjFmMTY3Li4wMzliNmVhIDEwMDY0NAotLS0gYS9mcy9leHQ0L2V4dDRfc2IuaAorKysgYi9mcy9leHQ0L2V4dDRfc2IuaApAQCAtNTcsNiArNTcsNyBAQAogCXUzMiBzX25leHRfZ2VuZXJhdGlvbjsKIAl1MzIgc19oYXNoX3NlZWRbNF07CiAJaW50IHNfZGVmX2hhc2hfdmVyc2lvbjsKKwlpbnQgc19oYXNoX3Vuc2lnbmVkOwkvKiAzIGlmIGhhc2ggc2hvdWxkIGJlIHNpZ25lZCwgMCBpZiBub3QgKi8KIAlzdHJ1Y3QgcGVyY3B1X2NvdW50ZXIgc19mcmVlYmxvY2tzX2NvdW50ZXI7CiAJc3RydWN0IHBlcmNwdV9jb3VudGVyIHNfZnJlZWlub2Rlc19jb3VudGVyOwogCXN0cnVjdCBwZXJjcHVfY291bnRlciBzX2RpcnNfY291bnRlcjsKQEAgLTczLDYgKzc0LDggQEAKIAlzdHJ1Y3Qgam91cm5hbF9zICpzX2pvdXJuYWw7CiAJc3RydWN0IGxpc3RfaGVhZCBzX29ycGhhbjsKIAl1bnNpZ25lZCBsb25nIHNfY29tbWl0X2ludGVydmFsOworCXUzMiBzX21heF9iYXRjaF90aW1lOworCXUzMiBzX21pbl9iYXRjaF90aW1lOwogCXN0cnVjdCBibG9ja19kZXZpY2UgKmpvdXJuYWxfYmRldjsKICNpZmRlZiBDT05GSUdfSkJEMl9ERUJVRwogCXN0cnVjdCB0aW1lcl9saXN0IHR1cm5fcm9fdGltZXI7CS8qIEZvciB0dXJuaW5nIHJlYWQtb25seSAoY3Jhc2ggc2ltdWxhdGlvbikgKi8KQEAgLTEwMSw3ICsxMDQsOCBAQAogCXNwaW5sb2NrX3Qgc19yZXNlcnZlX2xvY2s7CiAJc3BpbmxvY2tfdCBzX21kX2xvY2s7CiAJdGlkX3Qgc19sYXN0X3RyYW5zYWN0aW9uOwotCXVuc2lnbmVkIHNob3J0ICpzX21iX29mZnNldHMsICpzX21iX21heHM7CisJdW5zaWduZWQgc2hvcnQgKnNfbWJfb2Zmc2V0czsKKwl1bnNpZ25lZCBpbnQgKnNfbWJfbWF4czsKIAogCS8qIHR1bmFibGVzICovCiAJdW5zaWduZWQgbG9uZyBzX3N0cmlwZTsKZGlmZiAtLWdpdCBhL2ZzL2V4dDQvZXh0ZW50cy5jIGIvZnMvZXh0NC9leHRlbnRzLmMKaW5kZXggZWEyY2UzYy4uNTRiZjA2MiAxMDA2NDQKLS0tIGEvZnMvZXh0NC9leHRlbnRzLmMKKysrIGIvZnMvZXh0NC9leHRlbnRzLmMKQEAgLTk3LDYgKzk3LDggQEAKIHsKIAlpbnQgZXJyOwogCisJaWYgKCFleHQ0X2hhbmRsZV92YWxpZChoYW5kbGUpKQorCQlyZXR1cm4gMDsKIAlpZiAoaGFuZGxlLT5oX2J1ZmZlcl9jcmVkaXRzID4gbmVlZGVkKQogCQlyZXR1cm4gMDsKIAllcnIgPSBleHQ0X2pvdXJuYWxfZXh0ZW5kKGhhbmRsZSwgbmVlZGVkKTsKQEAgLTEzNCw3ICsxMzYsNyBAQAogCWludCBlcnI7CiAJaWYgKHBhdGgtPnBfYmgpIHsKIAkJLyogcGF0aCBwb2ludHMgdG8gYmxvY2sgKi8KLQkJZXJyID0gZXh0NF9qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgcGF0aC0+cF9iaCk7CisJCWVyciA9IGV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgaW5vZGUsIHBhdGgtPnBfYmgpOwogCX0gZWxzZSB7CiAJCS8qIHBhdGggcG9pbnRzIHRvIGxlYWYvaW5kZXggaW4gaW5vZGUgYm9keSAqLwogCQllcnIgPSBleHQ0X21hcmtfaW5vZGVfZGlydHkoaGFuZGxlLCBpbm9kZSk7CkBAIC0xOTEsNyArMTkzLDcgQEAKIAlleHQ0X2ZzYmxrX3QgZ29hbCwgbmV3YmxvY2s7CiAKIAlnb2FsID0gZXh0NF9leHRfZmluZF9nb2FsKGlub2RlLCBwYXRoLCBsZTMyX3RvX2NwdShleC0+ZWVfYmxvY2spKTsKLQluZXdibG9jayA9IGV4dDRfbmV3X21ldGFfYmxvY2soaGFuZGxlLCBpbm9kZSwgZ29hbCwgZXJyKTsKKwluZXdibG9jayA9IGV4dDRfbmV3X21ldGFfYmxvY2tzKGhhbmRsZSwgaW5vZGUsIGdvYWwsIE5VTEwsIGVycik7CiAJcmV0dXJuIG5ld2Jsb2NrOwogfQogCkBAIC03ODAsNyArNzgyLDcgQEAKIAlzZXRfYnVmZmVyX3VwdG9kYXRlKGJoKTsKIAl1bmxvY2tfYnVmZmVyKGJoKTsKIAotCWVyciA9IGV4dDRfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGJoKTsKKwllcnIgPSBleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGlub2RlLCBiaCk7CiAJaWYgKGVycikKIAkJZ290byBjbGVhbnVwOwogCWJyZWxzZShiaCk7CkBAIC04NTksNyArODYxLDcgQEAKIAkJc2V0X2J1ZmZlcl91cHRvZGF0ZShiaCk7CiAJCXVubG9ja19idWZmZXIoYmgpOwogCi0JCWVyciA9IGV4dDRfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGJoKTsKKwkJZXJyID0gZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBpbm9kZSwgYmgpOwogCQlpZiAoZXJyKQogCQkJZ290byBjbGVhbnVwOwogCQlicmVsc2UoYmgpOwpAQCAtOTU1LDcgKzk1Nyw3IEBACiAJc2V0X2J1ZmZlcl91cHRvZGF0ZShiaCk7CiAJdW5sb2NrX2J1ZmZlcihiaCk7CiAKLQllcnIgPSBleHQ0X2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBiaCk7CisJZXJyID0gZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBpbm9kZSwgYmgpOwogCWlmIChlcnIpCiAJCWdvdG8gb3V0OwogCkBAIC0xMTYwLDE1ICsxMTYyLDEzIEBACiAJd2hpbGUgKC0tZGVwdGggPj0gMCkgewogCQlpeCA9IHBhdGhbZGVwdGhdLnBfaWR4OwogCQlpZiAoaXggIT0gRVhUX0xBU1RfSU5ERVgocGF0aFtkZXB0aF0ucF9oZHIpKQotCQkJYnJlYWs7CisJCQlnb3RvIGdvdF9pbmRleDsKIAl9CiAKLQlpZiAoZGVwdGggPCAwKSB7Ci0JCS8qIHdlJ3ZlIGdvbmUgdXAgdG8gdGhlIHJvb3QgYW5kCi0JCSAqIGZvdW5kIG5vIGluZGV4IHRvIHRoZSByaWdodCAqLwotCQlyZXR1cm4gMDsKLQl9CisJLyogd2UndmUgZ29uZSB1cCB0byB0aGUgcm9vdCBhbmQgZm91bmQgbm8gaW5kZXggdG8gdGhlIHJpZ2h0ICovCisJcmV0dXJuIDA7CiAKK2dvdF9pbmRleDoKIAkvKiB3ZSd2ZSBmb3VuZCBpbmRleCB0byB0aGUgcmlnaHQsIGxldCdzCiAJICogZm9sbG93IGl0IGFuZCBmaW5kIHRoZSBjbG9zZXN0IGFsbG9jYXRlZAogCSAqIGJsb2NrIHRvIHRoZSByaWdodCAqLwpAQCAtMTIwMSw3ICsxMjAxLDYgQEAKIAkqcGh5cyA9IGV4dF9wYmxvY2soZXgpOwogCXB1dF9iaChiaCk7CiAJcmV0dXJuIDA7Ci0KIH0KIAogLyoKQEAgLTE2MjIsNyArMTYyMSw2IEBACiAJCWV4dDRfZXh0X2Ryb3BfcmVmcyhucGF0aCk7CiAJCWtmcmVlKG5wYXRoKTsKIAl9Ci0JZXh0NF9leHRfdHJlZV9jaGFuZ2VkKGlub2RlKTsKIAlleHQ0X2V4dF9pbnZhbGlkYXRlX2NhY2hlKGlub2RlKTsKIAlyZXR1cm4gZXJyOwogfQpAQCAtMjIzMyw3ICsyMjMxLDYgQEAKIAkJfQogCX0KIG91dDoKLQlleHQ0X2V4dF90cmVlX2NoYW5nZWQoaW5vZGUpOwogCWV4dDRfZXh0X2Ryb3BfcmVmcyhwYXRoKTsKIAlrZnJlZShwYXRoKTsKIAlleHQ0X2pvdXJuYWxfc3RvcChoYW5kbGUpOwpAQCAtMjI1MCw3ICsyMjQ3LDcgQEAKIAkgKiBwb3NzaWJsZSBpbml0aWFsaXphdGlvbiB3b3VsZCBiZSBoZXJlCiAJICovCiAKLQlpZiAodGVzdF9vcHQoc2IsIEVYVEVOVFMpKSB7CisJaWYgKEVYVDRfSEFTX0lOQ09NUEFUX0ZFQVRVUkUoc2IsIEVYVDRfRkVBVFVSRV9JTkNPTVBBVF9FWFRFTlRTKSkgewogCQlwcmludGsoS0VSTl9JTkZPICJFWFQ0LWZzOiBmaWxlIGV4dGVudHMgZW5hYmxlZCIpOwogI2lmZGVmIEFHR1JFU1NJVkVfVEVTVAogCQlwcmludGsoIiwgYWdncmVzc2l2ZSB0ZXN0cyIpOwpAQCAtMjI3NSw3ICsyMjcyLDcgQEAKICAqLwogdm9pZCBleHQ0X2V4dF9yZWxlYXNlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCiB7Ci0JaWYgKCF0ZXN0X29wdChzYiwgRVhURU5UUykpCisJaWYgKCFFWFQ0X0hBU19JTkNPTVBBVF9GRUFUVVJFKHNiLCBFWFQ0X0ZFQVRVUkVfSU5DT01QQVRfRVhURU5UUykpCiAJCXJldHVybjsKIAogI2lmZGVmIEVYVEVOVFNfU1RBVFMKQEAgLTIzODAsNyArMjM3Nyw3IEBACiAJCQkJCQlzdHJ1Y3QgaW5vZGUgKmlub2RlLAogCQkJCQkJc3RydWN0IGV4dDRfZXh0X3BhdGggKnBhdGgsCiAJCQkJCQlleHQ0X2xibGtfdCBpYmxvY2ssCi0JCQkJCQl1bnNpZ25lZCBsb25nIG1heF9ibG9ja3MpCisJCQkJCQl1bnNpZ25lZCBpbnQgbWF4X2Jsb2NrcykKIHsKIAlzdHJ1Y3QgZXh0NF9leHRlbnQgKmV4LCBuZXdleCwgb3JpZ19leDsKIAlzdHJ1Y3QgZXh0NF9leHRlbnQgKmV4MSA9IE5VTEw7CkBAIC0yNTM2LDcgKzI1MzMsNyBAQAogCQkgKi8KIAkJbmV3ZGVwdGggPSBleHRfZGVwdGgoaW5vZGUpOwogCQkvKgotCQkgKiB1cGRhdGUgdGhlIGV4dGVudCBsZW5ndGggYWZ0ZXIgc3VjY2Vzc2Z1bGwgaW5zZXJ0IG9mIHRoZQorCQkgKiB1cGRhdGUgdGhlIGV4dGVudCBsZW5ndGggYWZ0ZXIgc3VjY2Vzc2Z1bCBpbnNlcnQgb2YgdGhlCiAJCSAqIHNwbGl0IGV4dGVudAogCQkgKi8KIAkJb3JpZ19leC5lZV9sZW4gPSBjcHVfdG9fbGUxNihlZV9sZW4gLQpAQCAtMjY3OCwyNiArMjY3NSwyNiBAQAogICovCiBpbnQgZXh0NF9leHRfZ2V0X2Jsb2NrcyhoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAogCQkJZXh0NF9sYmxrX3QgaWJsb2NrLAotCQkJdW5zaWduZWQgbG9uZyBtYXhfYmxvY2tzLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoX3Jlc3VsdCwKKwkJCXVuc2lnbmVkIGludCBtYXhfYmxvY2tzLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoX3Jlc3VsdCwKIAkJCWludCBjcmVhdGUsIGludCBleHRlbmRfZGlza3NpemUpCiB7CiAJc3RydWN0IGV4dDRfZXh0X3BhdGggKnBhdGggPSBOVUxMOwogCXN0cnVjdCBleHQ0X2V4dGVudF9oZWFkZXIgKmVoOwogCXN0cnVjdCBleHQ0X2V4dGVudCBuZXdleCwgKmV4OwotCWV4dDRfZnNibGtfdCBnb2FsLCBuZXdibG9jazsKLQlpbnQgZXJyID0gMCwgZGVwdGgsIHJldDsKLQl1bnNpZ25lZCBsb25nIGFsbG9jYXRlZCA9IDA7CisJZXh0NF9mc2Jsa190IG5ld2Jsb2NrOworCWludCBlcnIgPSAwLCBkZXB0aCwgcmV0LCBjYWNoZV90eXBlOworCXVuc2lnbmVkIGludCBhbGxvY2F0ZWQgPSAwOwogCXN0cnVjdCBleHQ0X2FsbG9jYXRpb25fcmVxdWVzdCBhcjsKIAlsb2ZmX3QgZGlza3NpemU7CiAKIAlfX2NsZWFyX2JpdChCSF9OZXcsICZiaF9yZXN1bHQtPmJfc3RhdGUpOwotCWV4dF9kZWJ1ZygiYmxvY2tzICV1LyVsdSByZXF1ZXN0ZWQgZm9yIGlub2RlICV1XG4iLAorCWV4dF9kZWJ1ZygiYmxvY2tzICV1LyV1IHJlcXVlc3RlZCBmb3IgaW5vZGUgJXVcbiIsCiAJCQlpYmxvY2ssIG1heF9ibG9ja3MsIGlub2RlLT5pX2lubyk7CiAKIAkvKiBjaGVjayBpbiBjYWNoZSAqLwotCWdvYWwgPSBleHQ0X2V4dF9pbl9jYWNoZShpbm9kZSwgaWJsb2NrLCAmbmV3ZXgpOwotCWlmIChnb2FsKSB7Ci0JCWlmIChnb2FsID09IEVYVDRfRVhUX0NBQ0hFX0dBUCkgeworCWNhY2hlX3R5cGUgPSBleHQ0X2V4dF9pbl9jYWNoZShpbm9kZSwgaWJsb2NrLCAmbmV3ZXgpOworCWlmIChjYWNoZV90eXBlKSB7CisJCWlmIChjYWNoZV90eXBlID09IEVYVDRfRVhUX0NBQ0hFX0dBUCkgewogCQkJaWYgKCFjcmVhdGUpIHsKIAkJCQkvKgogCQkJCSAqIGJsb2NrIGlzbid0IGFsbG9jYXRlZCB5ZXQgYW5kCkBAIC0yNzA2LDcgKzI3MDMsNyBAQAogCQkJCWdvdG8gb3V0MjsKIAkJCX0KIAkJCS8qIHdlIHNob3VsZCBhbGxvY2F0ZSByZXF1ZXN0ZWQgYmxvY2sgKi8KLQkJfSBlbHNlIGlmIChnb2FsID09IEVYVDRfRVhUX0NBQ0hFX0VYVEVOVCkgeworCQl9IGVsc2UgaWYgKGNhY2hlX3R5cGUgPT0gRVhUNF9FWFRfQ0FDSEVfRVhURU5UKSB7CiAJCQkvKiBibG9jayBpcyBhbHJlYWR5IGFsbG9jYXRlZCAqLwogCQkJbmV3YmxvY2sgPSBpYmxvY2sKIAkJCQkgICAtIGxlMzJfdG9fY3B1KG5ld2V4LmVlX2Jsb2NrKQpAQCAtMjg1NCw3ICsyODUxLDcgQEAKIAlpZiAoIW5ld2Jsb2NrKQogCQlnb3RvIG91dDI7CiAJZXh0X2RlYnVnKCJhbGxvY2F0ZSBuZXcgYmxvY2s6IGdvYWwgJWxsdSwgZm91bmQgJWxsdS8lbHVcbiIsCi0JCQlnb2FsLCBuZXdibG9jaywgYWxsb2NhdGVkKTsKKwkJICBhci5nb2FsLCBuZXdibG9jaywgYWxsb2NhdGVkKTsKIAogCS8qIHRyeSB0byBpbnNlcnQgbmV3IGV4dGVudCBpbnRvIGZvdW5kIGxlYWYgYW5kIHJldHVybiAqLwogCWV4dDRfZXh0X3N0b3JlX3BibG9jaygmbmV3ZXgsIG5ld2Jsb2NrKTsKQEAgLTI5NTAsNyArMjk0Nyw3IEBACiAJICogdHJhbnNhY3Rpb24gc3luY2hyb25vdXMuCiAJICovCiAJaWYgKElTX1NZTkMoaW5vZGUpKQotCQloYW5kbGUtPmhfc3luYyA9IDE7CisJCWV4dDRfaGFuZGxlX3N5bmMoaGFuZGxlKTsKIAogb3V0X3N0b3A6CiAJdXBfd3JpdGUoJkVYVDRfSShpbm9kZSktPmlfZGF0YV9zZW0pOwpAQCAtMzAwNCw3ICszMDAxLDcgQEAKIAloYW5kbGVfdCAqaGFuZGxlOwogCWV4dDRfbGJsa190IGJsb2NrOwogCWxvZmZfdCBuZXdfc2l6ZTsKLQl1bnNpZ25lZCBsb25nIG1heF9ibG9ja3M7CisJdW5zaWduZWQgaW50IG1heF9ibG9ja3M7CiAJaW50IHJldCA9IDA7CiAJaW50IHJldDIgPSAwOwogCWludCByZXRyaWVzID0gMDsKQEAgLTMwODMsNyArMzA4MCw3IEBACiAvKgogICogQ2FsbGJhY2sgZnVuY3Rpb24gY2FsbGVkIGZvciBlYWNoIGV4dGVudCB0byBnYXRoZXIgRklFTUFQIGluZm9ybWF0aW9uLgogICovCi1pbnQgZXh0NF9leHRfZmllbWFwX2NiKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBleHQ0X2V4dF9wYXRoICpwYXRoLAorc3RhdGljIGludCBleHQ0X2V4dF9maWVtYXBfY2Ioc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGV4dDRfZXh0X3BhdGggKnBhdGgsCiAJCSAgICAgICBzdHJ1Y3QgZXh0NF9leHRfY2FjaGUgKm5ld2V4LCBzdHJ1Y3QgZXh0NF9leHRlbnQgKmV4LAogCQkgICAgICAgdm9pZCAqZGF0YSkKIHsKQEAgLTMxNTIsNyArMzE0OSw4IEBACiAvKiBmaWVtYXAgZmxhZ3Mgd2UgY2FuIGhhbmRsZSBzcGVjaWZpZWQgaGVyZSAqLwogI2RlZmluZSBFWFQ0X0ZJRU1BUF9GTEFHUwkoRklFTUFQX0ZMQUdfU1lOQ3xGSUVNQVBfRkxBR19YQVRUUikKIAotaW50IGV4dDRfeGF0dHJfZmllbWFwKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWVtYXBfZXh0ZW50X2luZm8gKmZpZWluZm8pCitzdGF0aWMgaW50IGV4dDRfeGF0dHJfZmllbWFwKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJc3RydWN0IGZpZW1hcF9leHRlbnRfaW5mbyAqZmllaW5mbykKIHsKIAlfX3U2NCBwaHlzaWNhbCA9IDA7CiAJX191NjQgbGVuZ3RoOwpkaWZmIC0tZ2l0IGEvZnMvZXh0NC9maWxlLmMgYi9mcy9leHQ0L2ZpbGUuYwppbmRleCA2YmQxMWZiLi5mNzMxY2I1IDEwMDY0NAotLS0gYS9mcy9leHQ0L2ZpbGUuYworKysgYi9mcy9leHQ0L2ZpbGUuYwpAQCAtMTQwLDkgKzE0MCw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLWV4dGVybiBpbnQgZXh0NF9maWVtYXAoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpZW1hcF9leHRlbnRfaW5mbyAqZmllaW5mbywKLQkJX191NjQgc3RhcnQsIF9fdTY0IGxlbik7Ci0KIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZXh0NF9maWxlX29wZXJhdGlvbnMgPSB7CiAJLmxsc2VlawkJPSBnZW5lcmljX2ZpbGVfbGxzZWVrLAogCS5yZWFkCQk9IGRvX3N5bmNfcmVhZCwKZGlmZiAtLWdpdCBhL2ZzL2V4dDQvaGFzaC5jIGIvZnMvZXh0NC9oYXNoLmMKaW5kZXggNTU2Y2E4ZS4uYWM4ZjE2OCAxMDA2NDQKLS0tIGEvZnMvZXh0NC9oYXNoLmMKKysrIGIvZnMvZXh0NC9oYXNoLmMKQEAgLTM1LDIzICszNSw0MyBAQAogCiAKIC8qIFRoZSBvbGQgbGVnYWN5IGhhc2ggKi8KLXN0YXRpYyBfX3UzMiBkeF9oYWNrX2hhc2goY29uc3QgY2hhciAqbmFtZSwgaW50IGxlbikKK3N0YXRpYyBfX3UzMiBkeF9oYWNrX2hhc2hfdW5zaWduZWQoY29uc3QgY2hhciAqbmFtZSwgaW50IGxlbikKIHsKLQlfX3UzMiBoYXNoMCA9IDB4MTJhM2ZlMmQsIGhhc2gxID0gMHgzN2FiZThmOTsKLQl3aGlsZSAobGVuLS0pIHsKLQkJX191MzIgaGFzaCA9IGhhc2gxICsgKGhhc2gwIF4gKCpuYW1lKysgKiA3MTUyMzczKSk7CisJX191MzIgaGFzaCwgaGFzaDAgPSAweDEyYTNmZTJkLCBoYXNoMSA9IDB4MzdhYmU4Zjk7CisJY29uc3QgdW5zaWduZWQgY2hhciAqdWNwID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikgbmFtZTsKIAotCQlpZiAoaGFzaCAmIDB4ODAwMDAwMDApIGhhc2ggLT0gMHg3ZmZmZmZmZjsKKwl3aGlsZSAobGVuLS0pIHsKKwkJaGFzaCA9IGhhc2gxICsgKGhhc2gwIF4gKCgoaW50KSAqdWNwKyspICogNzE1MjM3MykpOworCisJCWlmIChoYXNoICYgMHg4MDAwMDAwMCkKKwkJCWhhc2ggLT0gMHg3ZmZmZmZmZjsKIAkJaGFzaDEgPSBoYXNoMDsKIAkJaGFzaDAgPSBoYXNoOwogCX0KLQlyZXR1cm4gKGhhc2gwIDw8IDEpOworCXJldHVybiBoYXNoMCA8PCAxOwogfQogCi1zdGF0aWMgdm9pZCBzdHIyaGFzaGJ1Zihjb25zdCBjaGFyICptc2csIGludCBsZW4sIF9fdTMyICpidWYsIGludCBudW0pCitzdGF0aWMgX191MzIgZHhfaGFja19oYXNoX3NpZ25lZChjb25zdCBjaGFyICpuYW1lLCBpbnQgbGVuKQoreworCV9fdTMyIGhhc2gsIGhhc2gwID0gMHgxMmEzZmUyZCwgaGFzaDEgPSAweDM3YWJlOGY5OworCWNvbnN0IHNpZ25lZCBjaGFyICpzY3AgPSAoY29uc3Qgc2lnbmVkIGNoYXIgKikgbmFtZTsKKworCXdoaWxlIChsZW4tLSkgeworCQloYXNoID0gaGFzaDEgKyAoaGFzaDAgXiAoKChpbnQpICpzY3ArKykgKiA3MTUyMzczKSk7CisKKwkJaWYgKGhhc2ggJiAweDgwMDAwMDAwKQorCQkJaGFzaCAtPSAweDdmZmZmZmZmOworCQloYXNoMSA9IGhhc2gwOworCQloYXNoMCA9IGhhc2g7CisJfQorCXJldHVybiBoYXNoMCA8PCAxOworfQorCitzdGF0aWMgdm9pZCBzdHIyaGFzaGJ1Zl9zaWduZWQoY29uc3QgY2hhciAqbXNnLCBpbnQgbGVuLCBfX3UzMiAqYnVmLCBpbnQgbnVtKQogewogCV9fdTMyCXBhZCwgdmFsOwogCWludAlpOworCWNvbnN0IHNpZ25lZCBjaGFyICpzY3AgPSAoY29uc3Qgc2lnbmVkIGNoYXIgKikgbXNnOwogCiAJcGFkID0gKF9fdTMyKWxlbiB8ICgoX191MzIpbGVuIDw8IDgpOwogCXBhZCB8PSBwYWQgPDwgMTY7CkBAIC02Miw3ICs4MiwzNSBAQAogCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewogCQlpZiAoKGkgJSA0KSA9PSAwKQogCQkJdmFsID0gcGFkOwotCQl2YWwgPSBtc2dbaV0gKyAodmFsIDw8IDgpOworCQl2YWwgPSAoKGludCkgc2NwW2ldKSArICh2YWwgPDwgOCk7CisJCWlmICgoaSAlIDQpID09IDMpIHsKKwkJCSpidWYrKyA9IHZhbDsKKwkJCXZhbCA9IHBhZDsKKwkJCW51bS0tOworCQl9CisJfQorCWlmICgtLW51bSA+PSAwKQorCQkqYnVmKysgPSB2YWw7CisJd2hpbGUgKC0tbnVtID49IDApCisJCSpidWYrKyA9IHBhZDsKK30KKworc3RhdGljIHZvaWQgc3RyMmhhc2hidWZfdW5zaWduZWQoY29uc3QgY2hhciAqbXNnLCBpbnQgbGVuLCBfX3UzMiAqYnVmLCBpbnQgbnVtKQoreworCV9fdTMyCXBhZCwgdmFsOworCWludAlpOworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnVjcCA9IChjb25zdCB1bnNpZ25lZCBjaGFyICopIG1zZzsKKworCXBhZCA9IChfX3UzMilsZW4gfCAoKF9fdTMyKWxlbiA8PCA4KTsKKwlwYWQgfD0gcGFkIDw8IDE2OworCisJdmFsID0gcGFkOworCWlmIChsZW4gPiBudW0qNCkKKwkJbGVuID0gbnVtICogNDsKKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKwkJaWYgKChpICUgNCkgPT0gMCkKKwkJCXZhbCA9IHBhZDsKKwkJdmFsID0gKChpbnQpIHVjcFtpXSkgKyAodmFsIDw8IDgpOwogCQlpZiAoKGkgJSA0KSA9PSAzKSB7CiAJCQkqYnVmKysgPSB2YWw7CiAJCQl2YWwgPSBwYWQ7CkBAIC05NSw2ICsxNDMsOCBAQAogCWNvbnN0IGNoYXIJKnA7CiAJaW50CQlpOwogCV9fdTMyCQlpbls4XSwgYnVmWzRdOworCXZvaWQJCSgqc3RyMmhhc2hidWYpKGNvbnN0IGNoYXIgKiwgaW50LCBfX3UzMiAqLCBpbnQpID0KKwkJCQlzdHIyaGFzaGJ1Zl9zaWduZWQ7CiAKIAkvKiBJbml0aWFsaXplIHRoZSBkZWZhdWx0IHNlZWQgZm9yIHRoZSBoYXNoIGNoZWNrc3VtIGZ1bmN0aW9ucyAqLwogCWJ1ZlswXSA9IDB4Njc0NTIzMDE7CkBAIC0xMTMsMTMgKzE2MywxOCBAQAogCX0KIAogCXN3aXRjaCAoaGluZm8tPmhhc2hfdmVyc2lvbikgewotCWNhc2UgRFhfSEFTSF9MRUdBQ1k6Ci0JCWhhc2ggPSBkeF9oYWNrX2hhc2gobmFtZSwgbGVuKTsKKwljYXNlIERYX0hBU0hfTEVHQUNZX1VOU0lHTkVEOgorCQloYXNoID0gZHhfaGFja19oYXNoX3Vuc2lnbmVkKG5hbWUsIGxlbik7CiAJCWJyZWFrOworCWNhc2UgRFhfSEFTSF9MRUdBQ1k6CisJCWhhc2ggPSBkeF9oYWNrX2hhc2hfc2lnbmVkKG5hbWUsIGxlbik7CisJCWJyZWFrOworCWNhc2UgRFhfSEFTSF9IQUxGX01ENF9VTlNJR05FRDoKKwkJc3RyMmhhc2hidWYgPSBzdHIyaGFzaGJ1Zl91bnNpZ25lZDsKIAljYXNlIERYX0hBU0hfSEFMRl9NRDQ6CiAJCXAgPSBuYW1lOwogCQl3aGlsZSAobGVuID4gMCkgewotCQkJc3RyMmhhc2hidWYocCwgbGVuLCBpbiwgOCk7CisJCQkoKnN0cjJoYXNoYnVmKShwLCBsZW4sIGluLCA4KTsKIAkJCWhhbGZfbWQ0X3RyYW5zZm9ybShidWYsIGluKTsKIAkJCWxlbiAtPSAzMjsKIAkJCXAgKz0gMzI7CkBAIC0xMjcsMTAgKzE4MiwxMiBAQAogCQltaW5vcl9oYXNoID0gYnVmWzJdOwogCQloYXNoID0gYnVmWzFdOwogCQlicmVhazsKKwljYXNlIERYX0hBU0hfVEVBX1VOU0lHTkVEOgorCQlzdHIyaGFzaGJ1ZiA9IHN0cjJoYXNoYnVmX3Vuc2lnbmVkOwogCWNhc2UgRFhfSEFTSF9URUE6CiAJCXAgPSBuYW1lOwogCQl3aGlsZSAobGVuID4gMCkgewotCQkJc3RyMmhhc2hidWYocCwgbGVuLCBpbiwgNCk7CisJCQkoKnN0cjJoYXNoYnVmKShwLCBsZW4sIGluLCA0KTsKIAkJCVRFQV90cmFuc2Zvcm0oYnVmLCBpbik7CiAJCQlsZW4gLT0gMTY7CiAJCQlwICs9IDE2OwpkaWZmIC0tZ2l0IGEvZnMvZXh0NC9pYWxsb2MuYyBiL2ZzL2V4dDQvaWFsbG9jLmMKaW5kZXggNmU2MDUyOC4uNGZiODZhMCAxMDA2NDQKLS0tIGEvZnMvZXh0NC9pYWxsb2MuYworKysgYi9mcy9leHQ0L2lhbGxvYy5jCkBAIC03NCwxNyArNzQsMTcgQEAKIAkvKiBJZiBjaGVja3N1bSBpcyBiYWQgbWFyayBhbGwgYmxvY2tzIGFuZCBpbm9kZXMgdXNlIHRvIHByZXZlbnQKIAkgKiBhbGxvY2F0aW9uLCBlc3NlbnRpYWxseSBpbXBsZW1lbnRpbmcgYSBwZXItZ3JvdXAgcmVhZC1vbmx5IGZsYWcuICovCiAJaWYgKCFleHQ0X2dyb3VwX2Rlc2NfY3N1bV92ZXJpZnkoc2JpLCBibG9ja19ncm91cCwgZ2RwKSkgewotCQlleHQ0X2Vycm9yKHNiLCBfX2Z1bmNfXywgIkNoZWNrc3VtIGJhZCBmb3IgZ3JvdXAgJWx1XG4iLAorCQlleHQ0X2Vycm9yKHNiLCBfX2Z1bmNfXywgIkNoZWNrc3VtIGJhZCBmb3IgZ3JvdXAgJXUiLAogCQkJICAgYmxvY2tfZ3JvdXApOwotCQlnZHAtPmJnX2ZyZWVfYmxvY2tzX2NvdW50ID0gMDsKLQkJZ2RwLT5iZ19mcmVlX2lub2Rlc19jb3VudCA9IDA7Ci0JCWdkcC0+YmdfaXRhYmxlX3VudXNlZCA9IDA7CisJCWV4dDRfZnJlZV9ibGtzX3NldChzYiwgZ2RwLCAwKTsKKwkJZXh0NF9mcmVlX2lub2Rlc19zZXQoc2IsIGdkcCwgMCk7CisJCWV4dDRfaXRhYmxlX3VudXNlZF9zZXQoc2IsIGdkcCwgMCk7CiAJCW1lbXNldChiaC0+Yl9kYXRhLCAweGZmLCBzYi0+c19ibG9ja3NpemUpOwogCQlyZXR1cm4gMDsKIAl9CiAKIAltZW1zZXQoYmgtPmJfZGF0YSwgMCwgKEVYVDRfSU5PREVTX1BFUl9HUk9VUChzYikgKyA3KSAvIDgpOwotCW1hcmtfYml0bWFwX2VuZChFWFQ0X0lOT0RFU19QRVJfR1JPVVAoc2IpLCBFWFQ0X0JMT0NLU19QRVJfR1JPVVAoc2IpLAorCW1hcmtfYml0bWFwX2VuZChFWFQ0X0lOT0RFU19QRVJfR1JPVVAoc2IpLCBzYi0+c19ibG9ja3NpemUgKiA4LAogCQkJYmgtPmJfZGF0YSk7CiAKIAlyZXR1cm4gRVhUNF9JTk9ERVNfUEVSX0dST1VQKHNiKTsKQEAgLTExMSwyOSArMTExLDQ5IEBACiAJaWYgKHVubGlrZWx5KCFiaCkpIHsKIAkJZXh0NF9lcnJvcihzYiwgX19mdW5jX18sCiAJCQkgICAgIkNhbm5vdCByZWFkIGlub2RlIGJpdG1hcCAtICIKLQkJCSAgICAiYmxvY2tfZ3JvdXAgPSAlbHUsIGlub2RlX2JpdG1hcCA9ICVsbHUiLAorCQkJICAgICJibG9ja19ncm91cCA9ICV1LCBpbm9kZV9iaXRtYXAgPSAlbGx1IiwKIAkJCSAgICBibG9ja19ncm91cCwgYml0bWFwX2Jsayk7CiAJCXJldHVybiBOVUxMOwogCX0KLQlpZiAoYnVmZmVyX3VwdG9kYXRlKGJoKSAmJgotCSAgICAhKGRlc2MtPmJnX2ZsYWdzICYgY3B1X3RvX2xlMTYoRVhUNF9CR19JTk9ERV9VTklOSVQpKSkKKwlpZiAoYml0bWFwX3VwdG9kYXRlKGJoKSkKIAkJcmV0dXJuIGJoOwogCiAJbG9ja19idWZmZXIoYmgpOworCWlmIChiaXRtYXBfdXB0b2RhdGUoYmgpKSB7CisJCXVubG9ja19idWZmZXIoYmgpOworCQlyZXR1cm4gYmg7CisJfQogCXNwaW5fbG9jayhzYl9iZ2xfbG9jayhFWFQ0X1NCKHNiKSwgYmxvY2tfZ3JvdXApKTsKIAlpZiAoZGVzYy0+YmdfZmxhZ3MgJiBjcHVfdG9fbGUxNihFWFQ0X0JHX0lOT0RFX1VOSU5JVCkpIHsKIAkJZXh0NF9pbml0X2lub2RlX2JpdG1hcChzYiwgYmgsIGJsb2NrX2dyb3VwLCBkZXNjKTsKKwkJc2V0X2JpdG1hcF91cHRvZGF0ZShiaCk7CiAJCXNldF9idWZmZXJfdXB0b2RhdGUoYmgpOwotCQl1bmxvY2tfYnVmZmVyKGJoKTsKIAkJc3Bpbl91bmxvY2soc2JfYmdsX2xvY2soRVhUNF9TQihzYiksIGJsb2NrX2dyb3VwKSk7CisJCXVubG9ja19idWZmZXIoYmgpOwogCQlyZXR1cm4gYmg7CiAJfQogCXNwaW5fdW5sb2NrKHNiX2JnbF9sb2NrKEVYVDRfU0Ioc2IpLCBibG9ja19ncm91cCkpOworCWlmIChidWZmZXJfdXB0b2RhdGUoYmgpKSB7CisJCS8qCisJCSAqIGlmIG5vdCB1bmluaXQgaWYgYmggaXMgdXB0b2RhdGUsCisJCSAqIGJpdG1hcCBpcyBhbHNvIHVwdG9kYXRlCisJCSAqLworCQlzZXRfYml0bWFwX3VwdG9kYXRlKGJoKTsKKwkJdW5sb2NrX2J1ZmZlcihiaCk7CisJCXJldHVybiBiaDsKKwl9CisJLyoKKwkgKiBzdWJtaXQgdGhlIGJ1ZmZlcl9oZWFkIGZvciByZWFkLiBXZSBjYW4KKwkgKiBzYWZlbHkgbWFyayB0aGUgYml0bWFwIGFzIHVwdG9kYXRlIG5vdy4KKwkgKiBXZSBkbyBpdCBoZXJlIHNvIHRoZSBiaXRtYXAgdXB0b2RhdGUgYml0CisJICogZ2V0IHNldCB3aXRoIGJ1ZmZlciBsb2NrIGhlbGQuCisJICovCisJc2V0X2JpdG1hcF91cHRvZGF0ZShiaCk7CiAJaWYgKGJoX3N1Ym1pdF9yZWFkKGJoKSA8IDApIHsKIAkJcHV0X2JoKGJoKTsKIAkJZXh0NF9lcnJvcihzYiwgX19mdW5jX18sCiAJCQkgICAgIkNhbm5vdCByZWFkIGlub2RlIGJpdG1hcCAtICIKLQkJCSAgICAiYmxvY2tfZ3JvdXAgPSAlbHUsIGlub2RlX2JpdG1hcCA9ICVsbHUiLAorCQkJICAgICJibG9ja19ncm91cCA9ICV1LCBpbm9kZV9iaXRtYXAgPSAlbGx1IiwKIAkJCSAgICBibG9ja19ncm91cCwgYml0bWFwX2Jsayk7CiAJCXJldHVybiBOVUxMOwogCX0KQEAgLTE2OCw3ICsxODgsNyBAQAogCXN0cnVjdCBleHQ0X2dyb3VwX2Rlc2MgKmdkcDsKIAlzdHJ1Y3QgZXh0NF9zdXBlcl9ibG9jayAqZXM7CiAJc3RydWN0IGV4dDRfc2JfaW5mbyAqc2JpOwotCWludCBmYXRhbCA9IDAsIGVycjsKKwlpbnQgZmF0YWwgPSAwLCBlcnIsIGNvdW50OwogCWV4dDRfZ3JvdXBfdCBmbGV4X2dyb3VwOwogCiAJaWYgKGF0b21pY19yZWFkKCZpbm9kZS0+aV9jb3VudCkgPiAxKSB7CkBAIC0xOTAsNiArMjEwLDExIEBACiAKIAlpbm8gPSBpbm9kZS0+aV9pbm87CiAJZXh0NF9kZWJ1ZygiZnJlZWluZyBpbm9kZSAlbHVcbiIsIGlubyk7CisJdHJhY2VfbWFyayhleHQ0X2ZyZWVfaW5vZGUsCisJCSAgICJkZXYgJXMgaW5vICVsdSBtb2RlICVkIHVpZCAlbHUgZ2lkICVsdSBib2NrcyAlbGx1IiwKKwkJICAgc2ItPnNfaWQsIGlub2RlLT5pX2lubywgaW5vZGUtPmlfbW9kZSwKKwkJICAgKHVuc2lnbmVkIGxvbmcpIGlub2RlLT5pX3VpZCwgKHVuc2lnbmVkIGxvbmcpIGlub2RlLT5pX2dpZCwKKwkJICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgaW5vZGUtPmlfYmxvY2tzKTsKIAogCS8qCiAJICogTm90ZTogd2UgbXVzdCBmcmVlIGFueSBxdW90YSBiZWZvcmUgbG9ja2luZyB0aGUgc3VwZXJibG9jaywKQEAgLTIzNiw5ICsyNjEsMTIgQEAKIAogCQlpZiAoZ2RwKSB7CiAJCQlzcGluX2xvY2soc2JfYmdsX2xvY2soc2JpLCBibG9ja19ncm91cCkpOwotCQkJbGUxNl9hZGRfY3B1KCZnZHAtPmJnX2ZyZWVfaW5vZGVzX2NvdW50LCAxKTsKLQkJCWlmIChpc19kaXJlY3RvcnkpCi0JCQkJbGUxNl9hZGRfY3B1KCZnZHAtPmJnX3VzZWRfZGlyc19jb3VudCwgLTEpOworCQkJY291bnQgPSBleHQ0X2ZyZWVfaW5vZGVzX2NvdW50KHNiLCBnZHApICsgMTsKKwkJCWV4dDRfZnJlZV9pbm9kZXNfc2V0KHNiLCBnZHAsIGNvdW50KTsKKwkJCWlmIChpc19kaXJlY3RvcnkpIHsKKwkJCQljb3VudCA9IGV4dDRfdXNlZF9kaXJzX2NvdW50KHNiLCBnZHApIC0gMTsKKwkJCQlleHQ0X3VzZWRfZGlyc19zZXQoc2IsIGdkcCwgY291bnQpOworCQkJfQogCQkJZ2RwLT5iZ19jaGVja3N1bSA9IGV4dDRfZ3JvdXBfZGVzY19jc3VtKHNiaSwKIAkJCQkJCQlibG9ja19ncm91cCwgZ2RwKTsKIAkJCXNwaW5fdW5sb2NrKHNiX2JnbF9sb2NrKHNiaSwgYmxvY2tfZ3JvdXApKTsKQEAgLTI1MywxMiArMjgxLDEyIEBACiAJCQkJc3Bpbl91bmxvY2soc2JfYmdsX2xvY2soc2JpLCBmbGV4X2dyb3VwKSk7CiAJCQl9CiAJCX0KLQkJQlVGRkVSX1RSQUNFKGJoMiwgImNhbGwgZXh0NF9qb3VybmFsX2RpcnR5X21ldGFkYXRhIik7Ci0JCWVyciA9IGV4dDRfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGJoMik7CisJCUJVRkZFUl9UUkFDRShiaDIsICJjYWxsIGV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhIik7CisJCWVyciA9IGV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgTlVMTCwgYmgyKTsKIAkJaWYgKCFmYXRhbCkgZmF0YWwgPSBlcnI7CiAJfQotCUJVRkZFUl9UUkFDRShiaXRtYXBfYmgsICJjYWxsIGV4dDRfam91cm5hbF9kaXJ0eV9tZXRhZGF0YSIpOwotCWVyciA9IGV4dDRfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGJpdG1hcF9iaCk7CisJQlVGRkVSX1RSQUNFKGJpdG1hcF9iaCwgImNhbGwgZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEiKTsKKwllcnIgPSBleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIE5VTEwsIGJpdG1hcF9iaCk7CiAJaWYgKCFmYXRhbCkKIAkJZmF0YWwgPSBlcnI7CiAJc2ItPnNfZGlydCA9IDE7CkBAIC0yOTEsMTMgKzMxOSwxMyBAQAogCiAJZm9yIChncm91cCA9IDA7IGdyb3VwIDwgbmdyb3VwczsgZ3JvdXArKykgewogCQlkZXNjID0gZXh0NF9nZXRfZ3JvdXBfZGVzYyhzYiwgZ3JvdXAsIE5VTEwpOwotCQlpZiAoIWRlc2MgfHwgIWRlc2MtPmJnX2ZyZWVfaW5vZGVzX2NvdW50KQorCQlpZiAoIWRlc2MgfHwgIWV4dDRfZnJlZV9pbm9kZXNfY291bnQoc2IsIGRlc2MpKQogCQkJY29udGludWU7Ci0JCWlmIChsZTE2X3RvX2NwdShkZXNjLT5iZ19mcmVlX2lub2Rlc19jb3VudCkgPCBhdmVmcmVlaSkKKwkJaWYgKGV4dDRfZnJlZV9pbm9kZXNfY291bnQoc2IsIGRlc2MpIDwgYXZlZnJlZWkpCiAJCQljb250aW51ZTsKIAkJaWYgKCFiZXN0X2Rlc2MgfHwKLQkJICAgIChsZTE2X3RvX2NwdShkZXNjLT5iZ19mcmVlX2Jsb2Nrc19jb3VudCkgPgotCQkgICAgIGxlMTZfdG9fY3B1KGJlc3RfZGVzYy0+YmdfZnJlZV9ibG9ja3NfY291bnQpKSkgeworCQkgICAgKGV4dDRfZnJlZV9ibGtzX2NvdW50KHNiLCBkZXNjKSA+CisJCSAgICAgZXh0NF9mcmVlX2Jsa3NfY291bnQoc2IsIGJlc3RfZGVzYykpKSB7CiAJCQkqYmVzdF9ncm91cCA9IGdyb3VwOwogCQkJYmVzdF9kZXNjID0gZGVzYzsKIAkJCXJldCA9IDA7CkBAIC0zNjksNyArMzk3LDcgQEAKIAlmb3IgKGkgPSBiZXN0X2ZsZXggKiBmbGV4X3NpemU7IGkgPCBuZ3JvdXBzICYmCiAJCSAgICAgaSA8IChiZXN0X2ZsZXggKyAxKSAqIGZsZXhfc2l6ZTsgaSsrKSB7CiAJCWRlc2MgPSBleHQ0X2dldF9ncm91cF9kZXNjKHNiLCBpLCAmYmgpOwotCQlpZiAobGUxNl90b19jcHUoZGVzYy0+YmdfZnJlZV9pbm9kZXNfY291bnQpKSB7CisJCWlmIChleHQ0X2ZyZWVfaW5vZGVzX2NvdW50KHNiLCBkZXNjKSkgewogCQkJKmJlc3RfZ3JvdXAgPSBpOwogCQkJZ290byBvdXQ7CiAJCX0KQEAgLTQ0MywxNyArNDcxLDE3IEBACiAJCWZvciAoaSA9IDA7IGkgPCBuZ3JvdXBzOyBpKyspIHsKIAkJCWdycCA9IChwYXJlbnRfZ3JvdXAgKyBpKSAlIG5ncm91cHM7CiAJCQlkZXNjID0gZXh0NF9nZXRfZ3JvdXBfZGVzYyhzYiwgZ3JwLCBOVUxMKTsKLQkJCWlmICghZGVzYyB8fCAhZGVzYy0+YmdfZnJlZV9pbm9kZXNfY291bnQpCisJCQlpZiAoIWRlc2MgfHwgIWV4dDRfZnJlZV9pbm9kZXNfY291bnQoc2IsIGRlc2MpKQogCQkJCWNvbnRpbnVlOwotCQkJaWYgKGxlMTZfdG9fY3B1KGRlc2MtPmJnX3VzZWRfZGlyc19jb3VudCkgPj0gYmVzdF9uZGlyKQorCQkJaWYgKGV4dDRfdXNlZF9kaXJzX2NvdW50KHNiLCBkZXNjKSA+PSBiZXN0X25kaXIpCiAJCQkJY29udGludWU7Ci0JCQlpZiAobGUxNl90b19jcHUoZGVzYy0+YmdfZnJlZV9pbm9kZXNfY291bnQpIDwgYXZlZnJlZWkpCisJCQlpZiAoZXh0NF9mcmVlX2lub2Rlc19jb3VudChzYiwgZGVzYykgPCBhdmVmcmVlaSkKIAkJCQljb250aW51ZTsKLQkJCWlmIChsZTE2X3RvX2NwdShkZXNjLT5iZ19mcmVlX2Jsb2Nrc19jb3VudCkgPCBhdmVmcmVlYikKKwkJCWlmIChleHQ0X2ZyZWVfYmxrc19jb3VudChzYiwgZGVzYykgPCBhdmVmcmVlYikKIAkJCQljb250aW51ZTsKIAkJCSpncm91cCA9IGdycDsKIAkJCXJldCA9IDA7Ci0JCQliZXN0X25kaXIgPSBsZTE2X3RvX2NwdShkZXNjLT5iZ191c2VkX2RpcnNfY291bnQpOworCQkJYmVzdF9uZGlyID0gZXh0NF91c2VkX2RpcnNfY291bnQoc2IsIGRlc2MpOwogCQl9CiAJCWlmIChyZXQgPT0gMCkKIAkJCXJldHVybiByZXQ7CkBAIC00NzksMTMgKzUwNywxMyBAQAogCWZvciAoaSA9IDA7IGkgPCBuZ3JvdXBzOyBpKyspIHsKIAkJKmdyb3VwID0gKHBhcmVudF9ncm91cCArIGkpICUgbmdyb3VwczsKIAkJZGVzYyA9IGV4dDRfZ2V0X2dyb3VwX2Rlc2Moc2IsICpncm91cCwgTlVMTCk7Ci0JCWlmICghZGVzYyB8fCAhZGVzYy0+YmdfZnJlZV9pbm9kZXNfY291bnQpCisJCWlmICghZGVzYyB8fCAhZXh0NF9mcmVlX2lub2Rlc19jb3VudChzYiwgZGVzYykpCiAJCQljb250aW51ZTsKLQkJaWYgKGxlMTZfdG9fY3B1KGRlc2MtPmJnX3VzZWRfZGlyc19jb3VudCkgPj0gbWF4X2RpcnMpCisJCWlmIChleHQ0X3VzZWRfZGlyc19jb3VudChzYiwgZGVzYykgPj0gbWF4X2RpcnMpCiAJCQljb250aW51ZTsKLQkJaWYgKGxlMTZfdG9fY3B1KGRlc2MtPmJnX2ZyZWVfaW5vZGVzX2NvdW50KSA8IG1pbl9pbm9kZXMpCisJCWlmIChleHQ0X2ZyZWVfaW5vZGVzX2NvdW50KHNiLCBkZXNjKSA8IG1pbl9pbm9kZXMpCiAJCQljb250aW51ZTsKLQkJaWYgKGxlMTZfdG9fY3B1KGRlc2MtPmJnX2ZyZWVfYmxvY2tzX2NvdW50KSA8IG1pbl9ibG9ja3MpCisJCWlmIChleHQ0X2ZyZWVfYmxrc19jb3VudChzYiwgZGVzYykgPCBtaW5fYmxvY2tzKQogCQkJY29udGludWU7CiAJCXJldHVybiAwOwogCX0KQEAgLTQ5NCw4ICs1MjIsOCBAQAogCWZvciAoaSA9IDA7IGkgPCBuZ3JvdXBzOyBpKyspIHsKIAkJKmdyb3VwID0gKHBhcmVudF9ncm91cCArIGkpICUgbmdyb3VwczsKIAkJZGVzYyA9IGV4dDRfZ2V0X2dyb3VwX2Rlc2Moc2IsICpncm91cCwgTlVMTCk7Ci0JCWlmIChkZXNjICYmIGRlc2MtPmJnX2ZyZWVfaW5vZGVzX2NvdW50ICYmCi0JCQlsZTE2X3RvX2NwdShkZXNjLT5iZ19mcmVlX2lub2Rlc19jb3VudCkgPj0gYXZlZnJlZWkpCisJCWlmIChkZXNjICYmIGV4dDRfZnJlZV9pbm9kZXNfY291bnQoc2IsIGRlc2MpICYmCisJCQlleHQ0X2ZyZWVfaW5vZGVzX2NvdW50KHNiLCBkZXNjKSA+PSBhdmVmcmVlaSkKIAkJCXJldHVybiAwOwogCX0KIApAQCAtNTI0LDggKzU1Miw4IEBACiAJICovCiAJKmdyb3VwID0gcGFyZW50X2dyb3VwOwogCWRlc2MgPSBleHQ0X2dldF9ncm91cF9kZXNjKHNiLCAqZ3JvdXAsIE5VTEwpOwotCWlmIChkZXNjICYmIGxlMTZfdG9fY3B1KGRlc2MtPmJnX2ZyZWVfaW5vZGVzX2NvdW50KSAmJgotCQkJbGUxNl90b19jcHUoZGVzYy0+YmdfZnJlZV9ibG9ja3NfY291bnQpKQorCWlmIChkZXNjICYmIGV4dDRfZnJlZV9pbm9kZXNfY291bnQoc2IsIGRlc2MpICYmCisJCQlleHQ0X2ZyZWVfYmxrc19jb3VudChzYiwgZGVzYykpCiAJCXJldHVybiAwOwogCiAJLyoKQEAgLTU0OCw4ICs1NzYsOCBAQAogCQlpZiAoKmdyb3VwID49IG5ncm91cHMpCiAJCQkqZ3JvdXAgLT0gbmdyb3VwczsKIAkJZGVzYyA9IGV4dDRfZ2V0X2dyb3VwX2Rlc2Moc2IsICpncm91cCwgTlVMTCk7Ci0JCWlmIChkZXNjICYmIGxlMTZfdG9fY3B1KGRlc2MtPmJnX2ZyZWVfaW5vZGVzX2NvdW50KSAmJgotCQkJCWxlMTZfdG9fY3B1KGRlc2MtPmJnX2ZyZWVfYmxvY2tzX2NvdW50KSkKKwkJaWYgKGRlc2MgJiYgZXh0NF9mcmVlX2lub2Rlc19jb3VudChzYiwgZGVzYykgJiYKKwkJCQlleHQ0X2ZyZWVfYmxrc19jb3VudChzYiwgZGVzYykpCiAJCQlyZXR1cm4gMDsKIAl9CiAKQEAgLTU2Miw3ICs1OTAsNyBAQAogCQlpZiAoKysqZ3JvdXAgPj0gbmdyb3VwcykKIAkJCSpncm91cCA9IDA7CiAJCWRlc2MgPSBleHQ0X2dldF9ncm91cF9kZXNjKHNiLCAqZ3JvdXAsIE5VTEwpOwotCQlpZiAoZGVzYyAmJiBsZTE2X3RvX2NwdShkZXNjLT5iZ19mcmVlX2lub2Rlc19jb3VudCkpCisJCWlmIChkZXNjICYmIGV4dDRfZnJlZV9pbm9kZXNfY291bnQoc2IsIGRlc2MpKQogCQkJcmV0dXJuIDA7CiAJfQogCkBAIC01NzAsNiArNTk4LDc5IEBACiB9CiAKIC8qCisgKiBjbGFpbSB0aGUgaW5vZGUgZnJvbSB0aGUgaW5vZGUgYml0bWFwLiBJZiB0aGUgZ3JvdXAKKyAqIGlzIHVuaW5pdCB3ZSBuZWVkIHRvIHRha2UgdGhlIGdyb3VwcydzIHNiX2JnbF9sb2NrCisgKiBhbmQgY2xlYXIgdGhlIHVuaW5pdCBmbGFnLiBUaGUgaW5vZGUgYml0bWFwIHVwZGF0ZQorICogYW5kIGdyb3VwIGRlc2MgdW5pbml0IGZsYWcgY2xlYXIgc2hvdWxkIGJlIGRvbmUKKyAqIGFmdGVyIGhvbGRpbmcgc2JfYmdsX2xvY2sgc28gdGhhdCBleHQ0X3JlYWRfaW5vZGVfYml0bWFwCisgKiBkb2Vzbid0IHJhY2Ugd2l0aCB0aGUgZXh0NF9jbGFpbV9pbm9kZQorICovCitzdGF0aWMgaW50IGV4dDRfY2xhaW1faW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJCXN0cnVjdCBidWZmZXJfaGVhZCAqaW5vZGVfYml0bWFwX2JoLAorCQkJdW5zaWduZWQgbG9uZyBpbm8sIGV4dDRfZ3JvdXBfdCBncm91cCwgaW50IG1vZGUpCit7CisJaW50IGZyZWUgPSAwLCByZXR2YWwgPSAwLCBjb3VudDsKKwlzdHJ1Y3QgZXh0NF9zYl9pbmZvICpzYmkgPSBFWFQ0X1NCKHNiKTsKKwlzdHJ1Y3QgZXh0NF9ncm91cF9kZXNjICpnZHAgPSBleHQ0X2dldF9ncm91cF9kZXNjKHNiLCBncm91cCwgTlVMTCk7CisKKwlzcGluX2xvY2soc2JfYmdsX2xvY2soc2JpLCBncm91cCkpOworCWlmIChleHQ0X3NldF9iaXQoaW5vLCBpbm9kZV9iaXRtYXBfYmgtPmJfZGF0YSkpIHsKKwkJLyogbm90IGEgZnJlZSBpbm9kZSAqLworCQlyZXR2YWwgPSAxOworCQlnb3RvIGVycl9yZXQ7CisJfQorCWlubysrOworCWlmICgoZ3JvdXAgPT0gMCAmJiBpbm8gPCBFWFQ0X0ZJUlNUX0lOTyhzYikpIHx8CisJCQlpbm8gPiBFWFQ0X0lOT0RFU19QRVJfR1JPVVAoc2IpKSB7CisJCXNwaW5fdW5sb2NrKHNiX2JnbF9sb2NrKHNiaSwgZ3JvdXApKTsKKwkJZXh0NF9lcnJvcihzYiwgX19mdW5jX18sCisJCQkgICAicmVzZXJ2ZWQgaW5vZGUgb3IgaW5vZGUgPiBpbm9kZXMgY291bnQgLSAiCisJCQkgICAiYmxvY2tfZ3JvdXAgPSAldSwgaW5vZGU9JWx1IiwgZ3JvdXAsCisJCQkgICBpbm8gKyBncm91cCAqIEVYVDRfSU5PREVTX1BFUl9HUk9VUChzYikpOworCQlyZXR1cm4gMTsKKwl9CisJLyogSWYgd2UgZGlkbid0IGFsbG9jYXRlIGZyb20gd2l0aGluIHRoZSBpbml0aWFsaXplZCBwYXJ0IG9mIHRoZSBpbm9kZQorCSAqIHRhYmxlIHRoZW4gd2UgbmVlZCB0byBpbml0aWFsaXplIHVwIHRvIHRoaXMgaW5vZGUuICovCisJaWYgKEVYVDRfSEFTX1JPX0NPTVBBVF9GRUFUVVJFKHNiLCBFWFQ0X0ZFQVRVUkVfUk9fQ09NUEFUX0dEVF9DU1VNKSkgeworCisJCWlmIChnZHAtPmJnX2ZsYWdzICYgY3B1X3RvX2xlMTYoRVhUNF9CR19JTk9ERV9VTklOSVQpKSB7CisJCQlnZHAtPmJnX2ZsYWdzICY9IGNwdV90b19sZTE2KH5FWFQ0X0JHX0lOT0RFX1VOSU5JVCk7CisJCQkvKiBXaGVuIG1hcmtpbmcgdGhlIGJsb2NrIGdyb3VwIHdpdGgKKwkJCSAqIH5FWFQ0X0JHX0lOT0RFX1VOSU5JVCB3ZSBkb24ndCB3YW50IHRvIGRlcGVuZAorCQkJICogb24gdGhlIHZhbHVlIG9mIGJnX2l0YWJsZV91bnVzZWQgZXZlbiB0aG91Z2gKKwkJCSAqIG1rZTJmcyBjb3VsZCBoYXZlIGluaXRpYWxpemVkIHRoZSBzYW1lIGZvciB1cy4KKwkJCSAqIEluc3RlYWQgd2UgY2FsY3VsYXRlZCB0aGUgdmFsdWUgYmVsb3cKKwkJCSAqLworCisJCQlmcmVlID0gMDsKKwkJfSBlbHNlIHsKKwkJCWZyZWUgPSBFWFQ0X0lOT0RFU19QRVJfR1JPVVAoc2IpIC0KKwkJCQlleHQ0X2l0YWJsZV91bnVzZWRfY291bnQoc2IsIGdkcCk7CisJCX0KKworCQkvKgorCQkgKiBDaGVjayB0aGUgcmVsYXRpdmUgaW5vZGUgbnVtYmVyIGFnYWluc3QgdGhlIGxhc3QgdXNlZAorCQkgKiByZWxhdGl2ZSBpbm9kZSBudW1iZXIgaW4gdGhpcyBncm91cC4gaWYgaXQgaXMgZ3JlYXRlcgorCQkgKiB3ZSBuZWVkIHRvICB1cGRhdGUgdGhlIGJnX2l0YWJsZV91bnVzZWQgY291bnQKKwkJICoKKwkJICovCisJCWlmIChpbm8gPiBmcmVlKQorCQkJZXh0NF9pdGFibGVfdW51c2VkX3NldChzYiwgZ2RwLAorCQkJCQkoRVhUNF9JTk9ERVNfUEVSX0dST1VQKHNiKSAtIGlubykpOworCX0KKwljb3VudCA9IGV4dDRfZnJlZV9pbm9kZXNfY291bnQoc2IsIGdkcCkgLSAxOworCWV4dDRfZnJlZV9pbm9kZXNfc2V0KHNiLCBnZHAsIGNvdW50KTsKKwlpZiAoU19JU0RJUihtb2RlKSkgeworCQljb3VudCA9IGV4dDRfdXNlZF9kaXJzX2NvdW50KHNiLCBnZHApICsgMTsKKwkJZXh0NF91c2VkX2RpcnNfc2V0KHNiLCBnZHAsIGNvdW50KTsKKwl9CisJZ2RwLT5iZ19jaGVja3N1bSA9IGV4dDRfZ3JvdXBfZGVzY19jc3VtKHNiaSwgZ3JvdXAsIGdkcCk7CitlcnJfcmV0OgorCXNwaW5fdW5sb2NrKHNiX2JnbF9sb2NrKHNiaSwgZ3JvdXApKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKgogICogVGhlcmUgYXJlIHR3byBwb2xpY2llcyBmb3IgYWxsb2NhdGluZyBhbiBpbm9kZS4gIElmIHRoZSBuZXcgaW5vZGUgaXMKICAqIGEgZGlyZWN0b3J5LCB0aGVuIGEgZm9yd2FyZCBzZWFyY2ggaXMgbWFkZSBmb3IgYSBibG9jayBncm91cCB3aXRoIGJvdGgKICAqIGZyZWUgc3BhY2UgYW5kIGEgbG93IGRpcmVjdG9yeS10by1pbm9kZSByYXRpbzsgaWYgdGhhdCBmYWlscywgdGhlbiBvZgpAQCAtNTgyLDggKzY4Myw4IEBACiBzdHJ1Y3QgaW5vZGUgKmV4dDRfbmV3X2lub2RlKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqZGlyLCBpbnQgbW9kZSkKIHsKIAlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiOwotCXN0cnVjdCBidWZmZXJfaGVhZCAqYml0bWFwX2JoID0gTlVMTDsKLQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoMjsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmlub2RlX2JpdG1hcF9iaCA9IE5VTEw7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpncm91cF9kZXNjX2JoOwogCWV4dDRfZ3JvdXBfdCBncm91cCA9IDA7CiAJdW5zaWduZWQgbG9uZyBpbm8gPSAwOwogCXN0cnVjdCBpbm9kZSAqaW5vZGU7CkBAIC02MDIsNiArNzAzLDggQEAKIAkJcmV0dXJuIEVSUl9QVFIoLUVQRVJNKTsKIAogCXNiID0gZGlyLT5pX3NiOworCXRyYWNlX21hcmsoZXh0NF9yZXF1ZXN0X2lub2RlLCAiZGV2ICVzIGRpciAlbHUgbW9kZSAlZCIsIHNiLT5zX2lkLAorCQkgICBkaXItPmlfaW5vLCBtb2RlKTsKIAlpbm9kZSA9IG5ld19pbm9kZShzYik7CiAJaWYgKCFpbm9kZSkKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CkBAIC02MzEsNDAgKzczNCw1MiBAQAogCWZvciAoaSA9IDA7IGkgPCBzYmktPnNfZ3JvdXBzX2NvdW50OyBpKyspIHsKIAkJZXJyID0gLUVJTzsKIAotCQlnZHAgPSBleHQ0X2dldF9ncm91cF9kZXNjKHNiLCBncm91cCwgJmJoMik7CisJCWdkcCA9IGV4dDRfZ2V0X2dyb3VwX2Rlc2Moc2IsIGdyb3VwLCAmZ3JvdXBfZGVzY19iaCk7CiAJCWlmICghZ2RwKQogCQkJZ290byBmYWlsOwogCi0JCWJyZWxzZShiaXRtYXBfYmgpOwotCQliaXRtYXBfYmggPSBleHQ0X3JlYWRfaW5vZGVfYml0bWFwKHNiLCBncm91cCk7Ci0JCWlmICghYml0bWFwX2JoKQorCQlicmVsc2UoaW5vZGVfYml0bWFwX2JoKTsKKwkJaW5vZGVfYml0bWFwX2JoID0gZXh0NF9yZWFkX2lub2RlX2JpdG1hcChzYiwgZ3JvdXApOworCQlpZiAoIWlub2RlX2JpdG1hcF9iaCkKIAkJCWdvdG8gZmFpbDsKIAogCQlpbm8gPSAwOwogCiByZXBlYXRfaW5fdGhpc19ncm91cDoKIAkJaW5vID0gZXh0NF9maW5kX25leHRfemVyb19iaXQoKHVuc2lnbmVkIGxvbmcgKikKLQkJCQliaXRtYXBfYmgtPmJfZGF0YSwgRVhUNF9JTk9ERVNfUEVSX0dST1VQKHNiKSwgaW5vKTsKKwkJCQkJICAgICAgaW5vZGVfYml0bWFwX2JoLT5iX2RhdGEsCisJCQkJCSAgICAgIEVYVDRfSU5PREVTX1BFUl9HUk9VUChzYiksIGlubyk7CisKIAkJaWYgKGlubyA8IEVYVDRfSU5PREVTX1BFUl9HUk9VUChzYikpIHsKIAotCQkJQlVGRkVSX1RSQUNFKGJpdG1hcF9iaCwgImdldF93cml0ZV9hY2Nlc3MiKTsKLQkJCWVyciA9IGV4dDRfam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZSwgYml0bWFwX2JoKTsKKwkJCUJVRkZFUl9UUkFDRShpbm9kZV9iaXRtYXBfYmgsICJnZXRfd3JpdGVfYWNjZXNzIik7CisJCQllcnIgPSBleHQ0X2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGUsCisJCQkJCQkJICAgIGlub2RlX2JpdG1hcF9iaCk7CiAJCQlpZiAoZXJyKQogCQkJCWdvdG8gZmFpbDsKIAotCQkJaWYgKCFleHQ0X3NldF9iaXRfYXRvbWljKHNiX2JnbF9sb2NrKHNiaSwgZ3JvdXApLAotCQkJCQkJaW5vLCBiaXRtYXBfYmgtPmJfZGF0YSkpIHsKKwkJCUJVRkZFUl9UUkFDRShncm91cF9kZXNjX2JoLCAiZ2V0X3dyaXRlX2FjY2VzcyIpOworCQkJZXJyID0gZXh0NF9qb3VybmFsX2dldF93cml0ZV9hY2Nlc3MoaGFuZGxlLAorCQkJCQkJCQlncm91cF9kZXNjX2JoKTsKKwkJCWlmIChlcnIpCisJCQkJZ290byBmYWlsOworCQkJaWYgKCFleHQ0X2NsYWltX2lub2RlKHNiLCBpbm9kZV9iaXRtYXBfYmgsCisJCQkJCQlpbm8sIGdyb3VwLCBtb2RlKSkgewogCQkJCS8qIHdlIHdvbiBpdCAqLwotCQkJCUJVRkZFUl9UUkFDRShiaXRtYXBfYmgsCi0JCQkJCSJjYWxsIGV4dDRfam91cm5hbF9kaXJ0eV9tZXRhZGF0YSIpOwotCQkJCWVyciA9IGV4dDRfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsCi0JCQkJCQkJCWJpdG1hcF9iaCk7CisJCQkJQlVGRkVSX1RSQUNFKGlub2RlX2JpdG1hcF9iaCwKKwkJCQkJImNhbGwgZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEiKTsKKwkJCQllcnIgPSBleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsCisJCQkJCQkJCSBpbm9kZSwKKwkJCQkJCQlpbm9kZV9iaXRtYXBfYmgpOwogCQkJCWlmIChlcnIpCiAJCQkJCWdvdG8gZmFpbDsKKwkJCQkvKiB6ZXJvIGJpdCBpcyBpbm9kZSBudW1iZXIgMSovCisJCQkJaW5vKys7CiAJCQkJZ290byBnb3Q7CiAJCQl9CiAJCQkvKiB3ZSBsb3N0IGl0ICovCi0JCQlqYmQyX2pvdXJuYWxfcmVsZWFzZV9idWZmZXIoaGFuZGxlLCBiaXRtYXBfYmgpOworCQkJZXh0NF9oYW5kbGVfcmVsZWFzZV9idWZmZXIoaGFuZGxlLCBpbm9kZV9iaXRtYXBfYmgpOworCQkJZXh0NF9oYW5kbGVfcmVsZWFzZV9idWZmZXIoaGFuZGxlLCBncm91cF9kZXNjX2JoKTsKIAogCQkJaWYgKCsraW5vIDwgRVhUNF9JTk9ERVNfUEVSX0dST1VQKHNiKSkKIAkJCQlnb3RvIHJlcGVhdF9pbl90aGlzX2dyb3VwOwpAQCAtNjg0LDMwICs3OTksMTYgQEAKIAlnb3RvIG91dDsKIAogZ290OgotCWlubysrOwotCWlmICgoZ3JvdXAgPT0gMCAmJiBpbm8gPCBFWFQ0X0ZJUlNUX0lOTyhzYikpIHx8Ci0JICAgIGlubyA+IEVYVDRfSU5PREVTX1BFUl9HUk9VUChzYikpIHsKLQkJZXh0NF9lcnJvcihzYiwgX19mdW5jX18sCi0JCQkgICAicmVzZXJ2ZWQgaW5vZGUgb3IgaW5vZGUgPiBpbm9kZXMgY291bnQgLSAiCi0JCQkgICAiYmxvY2tfZ3JvdXAgPSAlbHUsIGlub2RlPSVsdSIsIGdyb3VwLAotCQkJICAgaW5vICsgZ3JvdXAgKiBFWFQ0X0lOT0RFU19QRVJfR1JPVVAoc2IpKTsKLQkJZXJyID0gLUVJTzsKLQkJZ290byBmYWlsOwotCX0KLQotCUJVRkZFUl9UUkFDRShiaDIsICJnZXRfd3JpdGVfYWNjZXNzIik7Ci0JZXJyID0gZXh0NF9qb3VybmFsX2dldF93cml0ZV9hY2Nlc3MoaGFuZGxlLCBiaDIpOwotCWlmIChlcnIpIGdvdG8gZmFpbDsKLQogCS8qIFdlIG1heSBoYXZlIHRvIGluaXRpYWxpemUgdGhlIGJsb2NrIGJpdG1hcCBpZiBpdCBpc24ndCBhbHJlYWR5ICovCiAJaWYgKEVYVDRfSEFTX1JPX0NPTVBBVF9GRUFUVVJFKHNiLCBFWFQ0X0ZFQVRVUkVfUk9fQ09NUEFUX0dEVF9DU1VNKSAmJgogCSAgICBnZHAtPmJnX2ZsYWdzICYgY3B1X3RvX2xlMTYoRVhUNF9CR19CTE9DS19VTklOSVQpKSB7Ci0JCXN0cnVjdCBidWZmZXJfaGVhZCAqYmxvY2tfYmggPSBleHQ0X3JlYWRfYmxvY2tfYml0bWFwKHNiLCBncm91cCk7CisJCXN0cnVjdCBidWZmZXJfaGVhZCAqYmxvY2tfYml0bWFwX2JoOwogCi0JCUJVRkZFUl9UUkFDRShibG9ja19iaCwgImdldCBibG9jayBiaXRtYXAgYWNjZXNzIik7Ci0JCWVyciA9IGV4dDRfam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZSwgYmxvY2tfYmgpOworCQlibG9ja19iaXRtYXBfYmggPSBleHQ0X3JlYWRfYmxvY2tfYml0bWFwKHNiLCBncm91cCk7CisJCUJVRkZFUl9UUkFDRShibG9ja19iaXRtYXBfYmgsICJnZXQgYmxvY2sgYml0bWFwIGFjY2VzcyIpOworCQllcnIgPSBleHQ0X2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGUsIGJsb2NrX2JpdG1hcF9iaCk7CiAJCWlmIChlcnIpIHsKLQkJCWJyZWxzZShibG9ja19iaCk7CisJCQlicmVsc2UoYmxvY2tfYml0bWFwX2JoKTsKIAkJCWdvdG8gZmFpbDsKIAkJfQogCkBAIC03MTUsOSArODE2LDkgQEAKIAkJc3Bpbl9sb2NrKHNiX2JnbF9sb2NrKHNiaSwgZ3JvdXApKTsKIAkJLyogcmVjaGVjayBhbmQgY2xlYXIgZmxhZyB1bmRlciBsb2NrIGlmIHdlIHN0aWxsIG5lZWQgdG8gKi8KIAkJaWYgKGdkcC0+YmdfZmxhZ3MgJiBjcHVfdG9fbGUxNihFWFQ0X0JHX0JMT0NLX1VOSU5JVCkpIHsKLQkJCWdkcC0+YmdfZmxhZ3MgJj0gY3B1X3RvX2xlMTYofkVYVDRfQkdfQkxPQ0tfVU5JTklUKTsKIAkJCWZyZWUgPSBleHQ0X2ZyZWVfYmxvY2tzX2FmdGVyX2luaXQoc2IsIGdyb3VwLCBnZHApOwotCQkJZ2RwLT5iZ19mcmVlX2Jsb2Nrc19jb3VudCA9IGNwdV90b19sZTE2KGZyZWUpOworCQkJZ2RwLT5iZ19mbGFncyAmPSBjcHVfdG9fbGUxNih+RVhUNF9CR19CTE9DS19VTklOSVQpOworCQkJZXh0NF9mcmVlX2Jsa3Nfc2V0KHNiLCBnZHAsIGZyZWUpOwogCQkJZ2RwLT5iZ19jaGVja3N1bSA9IGV4dDRfZ3JvdXBfZGVzY19jc3VtKHNiaSwgZ3JvdXAsCiAJCQkJCQkJCWdkcCk7CiAJCX0KQEAgLTcyNSw1NSArODI2LDE5IEBACiAKIAkJLyogRG9uJ3QgbmVlZCB0byBkaXJ0eSBiaXRtYXAgYmxvY2sgaWYgd2UgZGlkbid0IGNoYW5nZSBpdCAqLwogCQlpZiAoZnJlZSkgewotCQkJQlVGRkVSX1RSQUNFKGJsb2NrX2JoLCAiZGlydHkgYmxvY2sgYml0bWFwIik7Ci0JCQllcnIgPSBleHQ0X2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBibG9ja19iaCk7CisJCQlCVUZGRVJfVFJBQ0UoYmxvY2tfYml0bWFwX2JoLCAiZGlydHkgYmxvY2sgYml0bWFwIik7CisJCQllcnIgPSBleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsCisJCQkJCQkJTlVMTCwgYmxvY2tfYml0bWFwX2JoKTsKIAkJfQogCi0JCWJyZWxzZShibG9ja19iaCk7CisJCWJyZWxzZShibG9ja19iaXRtYXBfYmgpOwogCQlpZiAoZXJyKQogCQkJZ290byBmYWlsOwogCX0KLQotCXNwaW5fbG9jayhzYl9iZ2xfbG9jayhzYmksIGdyb3VwKSk7Ci0JLyogSWYgd2UgZGlkbid0IGFsbG9jYXRlIGZyb20gd2l0aGluIHRoZSBpbml0aWFsaXplZCBwYXJ0IG9mIHRoZSBpbm9kZQotCSAqIHRhYmxlIHRoZW4gd2UgbmVlZCB0byBpbml0aWFsaXplIHVwIHRvIHRoaXMgaW5vZGUuICovCi0JaWYgKEVYVDRfSEFTX1JPX0NPTVBBVF9GRUFUVVJFKHNiLCBFWFQ0X0ZFQVRVUkVfUk9fQ09NUEFUX0dEVF9DU1VNKSkgewotCQlpZiAoZ2RwLT5iZ19mbGFncyAmIGNwdV90b19sZTE2KEVYVDRfQkdfSU5PREVfVU5JTklUKSkgewotCQkJZ2RwLT5iZ19mbGFncyAmPSBjcHVfdG9fbGUxNih+RVhUNF9CR19JTk9ERV9VTklOSVQpOwotCi0JCQkvKiBXaGVuIG1hcmtpbmcgdGhlIGJsb2NrIGdyb3VwIHdpdGgKLQkJCSAqIH5FWFQ0X0JHX0lOT0RFX1VOSU5JVCB3ZSBkb24ndCB3YW50IHRvIGRlcGVuZAotCQkJICogb24gdGhlIHZhbHVlIG9mIGJnX2l0YWJsZV91bnVzZWQgZXZlbiB0aG91Z2gKLQkJCSAqIG1rZTJmcyBjb3VsZCBoYXZlIGluaXRpYWxpemVkIHRoZSBzYW1lIGZvciB1cy4KLQkJCSAqIEluc3RlYWQgd2UgY2FsY3VsYXRlZCB0aGUgdmFsdWUgYmVsb3cKLQkJCSAqLwotCi0JCQlmcmVlID0gMDsKLQkJfSBlbHNlIHsKLQkJCWZyZWUgPSBFWFQ0X0lOT0RFU19QRVJfR1JPVVAoc2IpIC0KLQkJCQlsZTE2X3RvX2NwdShnZHAtPmJnX2l0YWJsZV91bnVzZWQpOwotCQl9Ci0KLQkJLyoKLQkJICogQ2hlY2sgdGhlIHJlbGF0aXZlIGlub2RlIG51bWJlciBhZ2FpbnN0IHRoZSBsYXN0IHVzZWQKLQkJICogcmVsYXRpdmUgaW5vZGUgbnVtYmVyIGluIHRoaXMgZ3JvdXAuIGlmIGl0IGlzIGdyZWF0ZXIKLQkJICogd2UgbmVlZCB0byAgdXBkYXRlIHRoZSBiZ19pdGFibGVfdW51c2VkIGNvdW50Ci0JCSAqCi0JCSAqLwotCQlpZiAoaW5vID4gZnJlZSkKLQkJCWdkcC0+YmdfaXRhYmxlX3VudXNlZCA9Ci0JCQkJY3B1X3RvX2xlMTYoRVhUNF9JTk9ERVNfUEVSX0dST1VQKHNiKSAtIGlubyk7Ci0JfQotCi0JbGUxNl9hZGRfY3B1KCZnZHAtPmJnX2ZyZWVfaW5vZGVzX2NvdW50LCAtMSk7Ci0JaWYgKFNfSVNESVIobW9kZSkpIHsKLQkJbGUxNl9hZGRfY3B1KCZnZHAtPmJnX3VzZWRfZGlyc19jb3VudCwgMSk7Ci0JfQotCWdkcC0+YmdfY2hlY2tzdW0gPSBleHQ0X2dyb3VwX2Rlc2NfY3N1bShzYmksIGdyb3VwLCBnZHApOwotCXNwaW5fdW5sb2NrKHNiX2JnbF9sb2NrKHNiaSwgZ3JvdXApKTsKLQlCVUZGRVJfVFJBQ0UoYmgyLCAiY2FsbCBleHQ0X2pvdXJuYWxfZGlydHlfbWV0YWRhdGEiKTsKLQllcnIgPSBleHQ0X2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBiaDIpOwotCWlmIChlcnIpIGdvdG8gZmFpbDsKKwlCVUZGRVJfVFJBQ0UoZ3JvdXBfZGVzY19iaCwgImNhbGwgZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEiKTsKKwllcnIgPSBleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIE5VTEwsIGdyb3VwX2Rlc2NfYmgpOworCWlmIChlcnIpCisJCWdvdG8gZmFpbDsKIAogCXBlcmNwdV9jb3VudGVyX2RlYygmc2JpLT5zX2ZyZWVpbm9kZXNfY291bnRlcik7CiAJaWYgKFNfSVNESVIobW9kZSkpCkBAIC04MjUsNyArODkwLDcgQEAKIAogCWV4dDRfc2V0X2lub2RlX2ZsYWdzKGlub2RlKTsKIAlpZiAoSVNfRElSU1lOQyhpbm9kZSkpCi0JCWhhbmRsZS0+aF9zeW5jID0gMTsKKwkJZXh0NF9oYW5kbGVfc3luYyhoYW5kbGUpOwogCWlmIChpbnNlcnRfaW5vZGVfbG9ja2VkKGlub2RlKSA8IDApIHsKIAkJZXJyID0gLUVJTlZBTDsKIAkJZ290byBmYWlsX2Ryb3A7CkBAIC04NTIsNyArOTE3LDcgQEAKIAlpZiAoZXJyKQogCQlnb3RvIGZhaWxfZnJlZV9kcm9wOwogCi0JaWYgKHRlc3Rfb3B0KHNiLCBFWFRFTlRTKSkgeworCWlmIChFWFQ0X0hBU19JTkNPTVBBVF9GRUFUVVJFKHNiLCBFWFQ0X0ZFQVRVUkVfSU5DT01QQVRfRVhURU5UUykpIHsKIAkJLyogc2V0IGV4dGVudCBmbGFnIG9ubHkgZm9yIGRpcmVjdG9yeSwgZmlsZSBhbmQgbm9ybWFsIHN5bWxpbmsqLwogCQlpZiAoU19JU0RJUihtb2RlKSB8fCBTX0lTUkVHKG1vZGUpIHx8IFNfSVNMTksobW9kZSkpIHsKIAkJCUVYVDRfSShpbm9kZSktPmlfZmxhZ3MgfD0gRVhUNF9FWFRFTlRTX0ZMOwpAQCAtODY3LDYgKzkzMiw4IEBACiAJfQogCiAJZXh0NF9kZWJ1ZygiYWxsb2NhdGluZyBpbm9kZSAlbHVcbiIsIGlub2RlLT5pX2lubyk7CisJdHJhY2VfbWFyayhleHQ0X2FsbG9jYXRlX2lub2RlLCAiZGV2ICVzIGlubyAlbHUgZGlyICVsdSBtb2RlICVkIiwKKwkJICAgc2ItPnNfaWQsIGlub2RlLT5pX2lubywgZGlyLT5pX2lubywgbW9kZSk7CiAJZ290byByZWFsbHlfb3V0OwogZmFpbDoKIAlleHQ0X3N0ZF9lcnJvcihzYiwgZXJyKTsKQEAgLTg3NCw3ICs5NDEsNyBAQAogCWlwdXQoaW5vZGUpOwogCXJldCA9IEVSUl9QVFIoZXJyKTsKIHJlYWxseV9vdXQ6Ci0JYnJlbHNlKGJpdG1hcF9iaCk7CisJYnJlbHNlKGlub2RlX2JpdG1hcF9iaCk7CiAJcmV0dXJuIHJldDsKIAogZmFpbF9mcmVlX2Ryb3A6CkBAIC04ODYsNyArOTUzLDcgQEAKIAlpbm9kZS0+aV9ubGluayA9IDA7CiAJdW5sb2NrX25ld19pbm9kZShpbm9kZSk7CiAJaXB1dChpbm9kZSk7Ci0JYnJlbHNlKGJpdG1hcF9iaCk7CisJYnJlbHNlKGlub2RlX2JpdG1hcF9iaCk7CiAJcmV0dXJuIEVSUl9QVFIoZXJyKTsKIH0KIApAQCAtOTg1LDcgKzEwNTIsNyBAQAogCQlnZHAgPSBleHQ0X2dldF9ncm91cF9kZXNjKHNiLCBpLCBOVUxMKTsKIAkJaWYgKCFnZHApCiAJCQljb250aW51ZTsKLQkJZGVzY19jb3VudCArPSBsZTE2X3RvX2NwdShnZHAtPmJnX2ZyZWVfaW5vZGVzX2NvdW50KTsKKwkJZGVzY19jb3VudCArPSBleHQ0X2ZyZWVfaW5vZGVzX2NvdW50KHNiLCBnZHApOwogCQlicmVsc2UoYml0bWFwX2JoKTsKIAkJYml0bWFwX2JoID0gZXh0NF9yZWFkX2lub2RlX2JpdG1hcChzYiwgaSk7CiAJCWlmICghYml0bWFwX2JoKQpAQCAtOTkzLDcgKzEwNjAsNyBAQAogCiAJCXggPSBleHQ0X2NvdW50X2ZyZWUoYml0bWFwX2JoLCBFWFQ0X0lOT0RFU19QRVJfR1JPVVAoc2IpIC8gOCk7CiAJCXByaW50ayhLRVJOX0RFQlVHICJncm91cCAlbHU6IHN0b3JlZCA9ICVkLCBjb3VudGVkID0gJWx1XG4iLAotCQkJaSwgbGUxNl90b19jcHUoZ2RwLT5iZ19mcmVlX2lub2Rlc19jb3VudCksIHgpOworCQkJaSwgZXh0NF9mcmVlX2lub2Rlc19jb3VudChzYiwgZ2RwKSwgeCk7CiAJCWJpdG1hcF9jb3VudCArPSB4OwogCX0KIAlicmVsc2UoYml0bWFwX2JoKTsKQEAgLTEwMDcsNyArMTA3NCw3IEBACiAJCWdkcCA9IGV4dDRfZ2V0X2dyb3VwX2Rlc2Moc2IsIGksIE5VTEwpOwogCQlpZiAoIWdkcCkKIAkJCWNvbnRpbnVlOwotCQlkZXNjX2NvdW50ICs9IGxlMTZfdG9fY3B1KGdkcC0+YmdfZnJlZV9pbm9kZXNfY291bnQpOworCQlkZXNjX2NvdW50ICs9IGV4dDRfZnJlZV9pbm9kZXNfY291bnQoc2IsIGdkcCk7CiAJCWNvbmRfcmVzY2hlZCgpOwogCX0KIAlyZXR1cm4gZGVzY19jb3VudDsKQEAgLTEwMjQsOCArMTA5MSw3IEBACiAJCXN0cnVjdCBleHQ0X2dyb3VwX2Rlc2MgKmdkcCA9IGV4dDRfZ2V0X2dyb3VwX2Rlc2Moc2IsIGksIE5VTEwpOwogCQlpZiAoIWdkcCkKIAkJCWNvbnRpbnVlOwotCQljb3VudCArPSBsZTE2X3RvX2NwdShnZHAtPmJnX3VzZWRfZGlyc19jb3VudCk7CisJCWNvdW50ICs9IGV4dDRfdXNlZF9kaXJzX2NvdW50KHNiLCBnZHApOwogCX0KIAlyZXR1cm4gY291bnQ7CiB9Ci0KZGlmZiAtLWdpdCBhL2ZzL2V4dDQvaW5vZGUuYyBiL2ZzL2V4dDQvaW5vZGUuYwppbmRleCA2NzAyYTQ5Li5hNjQ0NGNlIDEwMDY0NAotLS0gYS9mcy9leHQ0L2lub2RlLmMKKysrIGIvZnMvZXh0NC9pbm9kZS5jCkBAIC03MiwxMiArNzIsMTcgQEAKICAqICJiaCIgbWF5IGJlIE5VTEw6IGEgbWV0YWRhdGEgYmxvY2sgbWF5IGhhdmUgYmVlbiBmcmVlZCBmcm9tIG1lbW9yeQogICogYnV0IHRoZXJlIG1heSBzdGlsbCBiZSBhIHJlY29yZCBvZiBpdCBpbiB0aGUgam91cm5hbCwgYW5kIHRoYXQgcmVjb3JkCiAgKiBzdGlsbCBuZWVkcyB0byBiZSByZXZva2VkLgorICoKKyAqIElmIHRoZSBoYW5kbGUgaXNuJ3QgdmFsaWQgd2UncmUgbm90IGpvdXJuYWxpbmcgc28gdGhlcmUncyBub3RoaW5nIHRvIGRvLgogICovCiBpbnQgZXh0NF9mb3JnZXQoaGFuZGxlX3QgKmhhbmRsZSwgaW50IGlzX21ldGFkYXRhLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAogCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgZXh0NF9mc2Jsa190IGJsb2NrbnIpCiB7CiAJaW50IGVycjsKIAorCWlmICghZXh0NF9oYW5kbGVfdmFsaWQoaGFuZGxlKSkKKwkJcmV0dXJuIDA7CisKIAltaWdodF9zbGVlcCgpOwogCiAJQlVGRkVSX1RSQUNFKGJoLCAiZW50ZXIiKTsKQEAgLTE3MCw3ICsxNzUsOSBAQAogICovCiBzdGF0aWMgaW50IHRyeV90b19leHRlbmRfdHJhbnNhY3Rpb24oaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSkKIHsKLQlpZiAoaGFuZGxlLT5oX2J1ZmZlcl9jcmVkaXRzID4gRVhUNF9SRVNFUlZFX1RSQU5TX0JMT0NLUykKKwlpZiAoIWV4dDRfaGFuZGxlX3ZhbGlkKGhhbmRsZSkpCisJCXJldHVybiAwOworCWlmIChleHQ0X2hhbmRsZV9oYXNfZW5vdWdoX2NyZWRpdHMoaGFuZGxlLCBFWFQ0X1JFU0VSVkVfVFJBTlNfQkxPQ0tTKzEpKQogCQlyZXR1cm4gMDsKIAlpZiAoIWV4dDRfam91cm5hbF9leHRlbmQoaGFuZGxlLCBibG9ja3NfZm9yX3RydW5jYXRlKGlub2RlKSkpCiAJCXJldHVybiAwOwpAQCAtMTg0LDYgKzE5MSw3IEBACiAgKi8KIHN0YXRpYyBpbnQgZXh0NF9qb3VybmFsX3Rlc3RfcmVzdGFydChoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlKQogeworCUJVR19PTihFWFQ0X0pPVVJOQUwoaW5vZGUpID09IE5VTEwpOwogCWpiZF9kZWJ1ZygyLCAicmVzdGFydGluZyBoYW5kbGUgJXBcbiIsIGhhbmRsZSk7CiAJcmV0dXJuIGV4dDRfam91cm5hbF9yZXN0YXJ0KGhhbmRsZSwgYmxvY2tzX2Zvcl90cnVuY2F0ZShpbm9kZSkpOwogfQpAQCAtMjE2LDcgKzIyNCw3IEBACiAJfQogCiAJaWYgKElTX1NZTkMoaW5vZGUpKQotCQloYW5kbGUtPmhfc3luYyA9IDE7CisJCWV4dDRfaGFuZGxlX3N5bmMoaGFuZGxlKTsKIAlpbm9kZS0+aV9zaXplID0gMDsKIAllcnIgPSBleHQ0X21hcmtfaW5vZGVfZGlydHkoaGFuZGxlLCBpbm9kZSk7CiAJaWYgKGVycikgewpAQCAtMjMzLDcgKzI0MSw3IEBACiAJICogZW5vdWdoIGNyZWRpdHMgbGVmdCBpbiB0aGUgaGFuZGxlIHRvIHJlbW92ZSB0aGUgaW5vZGUgZnJvbQogCSAqIHRoZSBvcnBoYW4gbGlzdCBhbmQgc2V0IHRoZSBkdGltZSBmaWVsZC4KIAkgKi8KLQlpZiAoaGFuZGxlLT5oX2J1ZmZlcl9jcmVkaXRzIDwgMykgeworCWlmICghZXh0NF9oYW5kbGVfaGFzX2Vub3VnaF9jcmVkaXRzKGhhbmRsZSwgMykpIHsKIAkJZXJyID0gZXh0NF9qb3VybmFsX2V4dGVuZChoYW5kbGUsIDMpOwogCQlpZiAoZXJyID4gMCkKIAkJCWVyciA9IGV4dDRfam91cm5hbF9yZXN0YXJ0KGhhbmRsZSwgMyk7CkBAIC01MDYsMTAgKzUxNCwxMCBAQAogICoJcmV0dXJuIHRoZSB0b3RhbCBudW1iZXIgb2YgYmxvY2tzIHRvIGJlIGFsbG9jYXRlLCBpbmNsdWRpbmcgdGhlCiAgKglkaXJlY3QgYW5kIGluZGlyZWN0IGJsb2Nrcy4KICAqLwotc3RhdGljIGludCBleHQ0X2Jsa3NfdG9fYWxsb2NhdGUoSW5kaXJlY3QgKmJyYW5jaCwgaW50IGssIHVuc2lnbmVkIGxvbmcgYmxrcywKK3N0YXRpYyBpbnQgZXh0NF9ibGtzX3RvX2FsbG9jYXRlKEluZGlyZWN0ICpicmFuY2gsIGludCBrLCB1bnNpZ25lZCBpbnQgYmxrcywKIAkJaW50IGJsb2Nrc190b19ib3VuZGFyeSkKIHsKLQl1bnNpZ25lZCBsb25nIGNvdW50ID0gMDsKKwl1bnNpZ25lZCBpbnQgY291bnQgPSAwOwogCiAJLyoKIAkgKiBTaW1wbGUgY2FzZSwgW3QsZF1JbmRpcmVjdCBibG9jayhzKSBoYXMgbm90IGFsbG9jYXRlZCB5ZXQKQEAgLTU0Nyw2ICs1NTUsNyBAQAogCQkJCWludCBpbmRpcmVjdF9ibGtzLCBpbnQgYmxrcywKIAkJCQlleHQ0X2ZzYmxrX3QgbmV3X2Jsb2Nrc1s0XSwgaW50ICplcnIpCiB7CisJc3RydWN0IGV4dDRfYWxsb2NhdGlvbl9yZXF1ZXN0IGFyOwogCWludCB0YXJnZXQsIGk7CiAJdW5zaWduZWQgbG9uZyBjb3VudCA9IDAsIGJsa19hbGxvY2F0ZWQgPSAwOwogCWludCBpbmRleCA9IDA7CkBAIC01OTUsMTAgKzYwNCwxNyBAQAogCWlmICghdGFyZ2V0KQogCQlnb3RvIGFsbG9jYXRlZDsKIAkvKiBOb3cgYWxsb2NhdGUgZGF0YSBibG9ja3MgKi8KLQljb3VudCA9IHRhcmdldDsKLQkvKiBhbGxvY2F0aW5nIGJsb2NrcyBmb3IgZGF0YSBibG9ja3MgKi8KLQljdXJyZW50X2Jsb2NrID0gZXh0NF9uZXdfYmxvY2tzKGhhbmRsZSwgaW5vZGUsIGlibG9jaywKLQkJCQkJCWdvYWwsICZjb3VudCwgZXJyKTsKKwltZW1zZXQoJmFyLCAwLCBzaXplb2YoYXIpKTsKKwlhci5pbm9kZSA9IGlub2RlOworCWFyLmdvYWwgPSBnb2FsOworCWFyLmxlbiA9IHRhcmdldDsKKwlhci5sb2dpY2FsID0gaWJsb2NrOworCWlmIChTX0lTUkVHKGlub2RlLT5pX21vZGUpKQorCQkvKiBlbmFibGUgaW4tY29yZSBwcmVhbGxvY2F0aW9uIG9ubHkgZm9yIHJlZ3VsYXIgZmlsZXMgKi8KKwkJYXIuZmxhZ3MgPSBFWFQ0X01CX0hJTlRfREFUQTsKKworCWN1cnJlbnRfYmxvY2sgPSBleHQ0X21iX25ld19ibG9ja3MoaGFuZGxlLCAmYXIsIGVycik7CisKIAlpZiAoKmVyciAmJiAodGFyZ2V0ID09IGJsa3MpKSB7CiAJCS8qCiAJCSAqIGlmIHRoZSBhbGxvY2F0aW9uIGZhaWxlZCBhbmQgd2UgZGlkbid0IGFsbG9jYXRlCkBAIC02MTQsNyArNjMwLDcgQEAKIAkJICovCiAJCQluZXdfYmxvY2tzW2luZGV4XSA9IGN1cnJlbnRfYmxvY2s7CiAJCX0KLQkJYmxrX2FsbG9jYXRlZCArPSBjb3VudDsKKwkJYmxrX2FsbG9jYXRlZCArPSBhci5sZW47CiAJfQogYWxsb2NhdGVkOgogCS8qIHRvdGFsIG51bWJlciBvZiBibG9ja3MgYWxsb2NhdGVkIGZvciBkaXJlY3QgYmxvY2tzICovCkBAIC03MDksOCArNzI1LDggQEAKIAkJc2V0X2J1ZmZlcl91cHRvZGF0ZShiaCk7CiAJCXVubG9ja19idWZmZXIoYmgpOwogCi0JCUJVRkZFUl9UUkFDRShiaCwgImNhbGwgZXh0NF9qb3VybmFsX2RpcnR5X21ldGFkYXRhIik7Ci0JCWVyciA9IGV4dDRfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGJoKTsKKwkJQlVGRkVSX1RSQUNFKGJoLCAiY2FsbCBleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YSIpOworCQllcnIgPSBleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGlub2RlLCBiaCk7CiAJCWlmIChlcnIpCiAJCQlnb3RvIGZhaWxlZDsKIAl9CkBAIC03OTIsOCArODA4LDggQEAKIAkJICogZ2VuZXJpY19jb21taXRfd3JpdGUtPl9fbWFya19pbm9kZV9kaXJ0eS0+ZXh0NF9kaXJ0eV9pbm9kZS4KIAkJICovCiAJCWpiZF9kZWJ1Zyg1LCAic3BsaWNpbmcgaW5kaXJlY3Qgb25seVxuIik7Ci0JCUJVRkZFUl9UUkFDRSh3aGVyZS0+YmgsICJjYWxsIGV4dDRfam91cm5hbF9kaXJ0eV9tZXRhZGF0YSIpOwotCQllcnIgPSBleHQ0X2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCB3aGVyZS0+YmgpOworCQlCVUZGRVJfVFJBQ0Uod2hlcmUtPmJoLCAiY2FsbCBleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YSIpOworCQllcnIgPSBleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGlub2RlLCB3aGVyZS0+YmgpOwogCQlpZiAoZXJyKQogCQkJZ290byBlcnJfb3V0OwogCX0gZWxzZSB7CkBAIC04NDAsMTAgKzg1NiwxMCBAQAogICogZG93bl9yZWFkKCZFWFQ0X0koaW5vZGUpLT5pX2RhdGFfc2VtKSBpZiBub3QgYWxsb2NhdGluZyBmaWxlIHN5c3RlbSBibG9jawogICogKGllLCBjcmVhdGUgaXMgemVybykuIE90aGVyd2lzZSBkb3duX3dyaXRlKCZFWFQ0X0koaW5vZGUpLT5pX2RhdGFfc2VtKQogICovCi1pbnQgZXh0NF9nZXRfYmxvY2tzX2hhbmRsZShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCQlleHQ0X2xibGtfdCBpYmxvY2ssIHVuc2lnbmVkIGxvbmcgbWF4YmxvY2tzLAotCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoX3Jlc3VsdCwKLQkJaW50IGNyZWF0ZSwgaW50IGV4dGVuZF9kaXNrc2l6ZSkKK3N0YXRpYyBpbnQgZXh0NF9nZXRfYmxvY2tzX2hhbmRsZShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCSAgZXh0NF9sYmxrX3QgaWJsb2NrLCB1bnNpZ25lZCBpbnQgbWF4YmxvY2tzLAorCQkJCSAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaF9yZXN1bHQsCisJCQkJICBpbnQgY3JlYXRlLCBpbnQgZXh0ZW5kX2Rpc2tzaXplKQogewogCWludCBlcnIgPSAtRUlPOwogCWV4dDRfbGJsa190IG9mZnNldHNbNF07CkBAIC0xMDQ1LDcgKzEwNjEsNyBAQAogICogSXQgcmV0dXJucyB0aGUgZXJyb3IgaW4gY2FzZSBvZiBhbGxvY2F0aW9uIGZhaWx1cmUuCiAgKi8KIGludCBleHQ0X2dldF9ibG9ja3Nfd3JhcChoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzZWN0b3JfdCBibG9jaywKLQkJCXVuc2lnbmVkIGxvbmcgbWF4X2Jsb2Nrcywgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwKKwkJCXVuc2lnbmVkIGludCBtYXhfYmxvY2tzLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLAogCQkJaW50IGNyZWF0ZSwgaW50IGV4dGVuZF9kaXNrc2l6ZSwgaW50IGZsYWcpCiB7CiAJaW50IHJldHZhbDsKQEAgLTEyMjEsOCArMTIzNyw4IEBACiAJCQkJc2V0X2J1ZmZlcl91cHRvZGF0ZShiaCk7CiAJCQl9CiAJCQl1bmxvY2tfYnVmZmVyKGJoKTsKLQkJCUJVRkZFUl9UUkFDRShiaCwgImNhbGwgZXh0NF9qb3VybmFsX2RpcnR5X21ldGFkYXRhIik7Ci0JCQllcnIgPSBleHQ0X2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBiaCk7CisJCQlCVUZGRVJfVFJBQ0UoYmgsICJjYWxsIGV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhIik7CisJCQllcnIgPSBleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGlub2RlLCBiaCk7CiAJCQlpZiAoIWZhdGFsKQogCQkJCWZhdGFsID0gZXJyOwogCQl9IGVsc2UgewpAQCAtMTMzNSw2ICsxMzUxLDEwIEBACiAgCXBnb2ZmX3QgaW5kZXg7CiAJdW5zaWduZWQgZnJvbSwgdG87CiAKKwl0cmFjZV9tYXJrKGV4dDRfd3JpdGVfYmVnaW4sCisJCSAgICJkZXYgJXMgaW5vICVsdSBwb3MgJWxsdSBsZW4gJXUgZmxhZ3MgJXUiLAorCQkgICBpbm9kZS0+aV9zYi0+c19pZCwgaW5vZGUtPmlfaW5vLAorCQkgICAodW5zaWduZWQgbG9uZyBsb25nKSBwb3MsIGxlbiwgZmxhZ3MpOwogIAlpbmRleCA9IHBvcyA+PiBQQUdFX0NBQ0hFX1NISUZUOwogCWZyb20gPSBwb3MgJiAoUEFHRV9DQUNIRV9TSVpFIC0gMSk7CiAJdG8gPSBmcm9tICsgbGVuOwpAQCAtMTM4Nyw3ICsxNDA3LDcgQEAKIAlpZiAoIWJ1ZmZlcl9tYXBwZWQoYmgpIHx8IGJ1ZmZlcl9mcmVlZChiaCkpCiAJCXJldHVybiAwOwogCXNldF9idWZmZXJfdXB0b2RhdGUoYmgpOwotCXJldHVybiBleHQ0X2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBiaCk7CisJcmV0dXJuIGV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgTlVMTCwgYmgpOwogfQogCiAvKgpAQCAtMTQwNiw2ICsxNDI2LDEwIEBACiAJc3RydWN0IGlub2RlICppbm9kZSA9IG1hcHBpbmctPmhvc3Q7CiAJaW50IHJldCA9IDAsIHJldDI7CiAKKwl0cmFjZV9tYXJrKGV4dDRfb3JkZXJlZF93cml0ZV9lbmQsCisJCSAgICJkZXYgJXMgaW5vICVsdSBwb3MgJWxsdSBsZW4gJXUgY29waWVkICV1IiwKKwkJICAgaW5vZGUtPmlfc2ItPnNfaWQsIGlub2RlLT5pX2lubywKKwkJICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgcG9zLCBsZW4sIGNvcGllZCk7CiAJcmV0ID0gZXh0NF9qYmQyX2ZpbGVfaW5vZGUoaGFuZGxlLCBpbm9kZSk7CiAKIAlpZiAocmV0ID09IDApIHsKQEAgLTE0NDQsNiArMTQ2OCwxMCBAQAogCWludCByZXQgPSAwLCByZXQyOwogCWxvZmZfdCBuZXdfaV9zaXplOwogCisJdHJhY2VfbWFyayhleHQ0X3dyaXRlYmFja193cml0ZV9lbmQsCisJCSAgICJkZXYgJXMgaW5vICVsdSBwb3MgJWxsdSBsZW4gJXUgY29waWVkICV1IiwKKwkJICAgaW5vZGUtPmlfc2ItPnNfaWQsIGlub2RlLT5pX2lubywKKwkJICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgcG9zLCBsZW4sIGNvcGllZCk7CiAJbmV3X2lfc2l6ZSA9IHBvcyArIGNvcGllZDsKIAlpZiAobmV3X2lfc2l6ZSA+IEVYVDRfSShpbm9kZSktPmlfZGlza3NpemUpIHsKIAkJZXh0NF91cGRhdGVfaV9kaXNrc2l6ZShpbm9kZSwgbmV3X2lfc2l6ZSk7CkBAIC0xNDc5LDYgKzE1MDcsMTAgQEAKIAl1bnNpZ25lZCBmcm9tLCB0bzsKIAlsb2ZmX3QgbmV3X2lfc2l6ZTsKIAorCXRyYWNlX21hcmsoZXh0NF9qb3VybmFsbGVkX3dyaXRlX2VuZCwKKwkJICAgImRldiAlcyBpbm8gJWx1IHBvcyAlbGx1IGxlbiAldSBjb3BpZWQgJXUiLAorCQkgICBpbm9kZS0+aV9zYi0+c19pZCwgaW5vZGUtPmlfaW5vLAorCQkgICAodW5zaWduZWQgbG9uZyBsb25nKSBwb3MsIGxlbiwgY29waWVkKTsKIAlmcm9tID0gcG9zICYgKFBBR0VfQ0FDSEVfU0laRSAtIDEpOwogCXRvID0gZnJvbSArIGxlbjsKIApAQCAtMTYyNSw3ICsxNjU3LDcgQEAKIAlnZXRfYmxvY2tfdCAqZ2V0X2Jsb2NrOwogCXN0cnVjdCB3cml0ZWJhY2tfY29udHJvbCAqd2JjOwogCWludCBpb19kb25lOwotCWxvbmcgcGFnZXNfd3JpdHRlbjsKKwlpbnQgcGFnZXNfd3JpdHRlbjsKIAlpbnQgcmV0dmFsOwogfTsKIApAQCAtMTY0NSwzNSArMTY3NywzOSBAQAogICovCiBzdGF0aWMgaW50IG1wYWdlX2RhX3N1Ym1pdF9pbyhzdHJ1Y3QgbXBhZ2VfZGFfZGF0YSAqbXBkKQogewotCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gbXBkLT5pbm9kZS0+aV9tYXBwaW5nOwotCWludCByZXQgPSAwLCBlcnIsIG5yX3BhZ2VzLCBpOwotCXVuc2lnbmVkIGxvbmcgaW5kZXgsIGVuZDsKLQlzdHJ1Y3QgcGFnZXZlYyBwdmVjOwogCWxvbmcgcGFnZXNfc2tpcHBlZDsKKwlzdHJ1Y3QgcGFnZXZlYyBwdmVjOworCXVuc2lnbmVkIGxvbmcgaW5kZXgsIGVuZDsKKwlpbnQgcmV0ID0gMCwgZXJyLCBucl9wYWdlcywgaTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gbXBkLT5pbm9kZTsKKwlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IGlub2RlLT5pX21hcHBpbmc7CiAKIAlCVUdfT04obXBkLT5uZXh0X3BhZ2UgPD0gbXBkLT5maXJzdF9wYWdlKTsKLQlwYWdldmVjX2luaXQoJnB2ZWMsIDApOworCS8qCisJICogV2UgbmVlZCB0byBzdGFydCBmcm9tIHRoZSBmaXJzdF9wYWdlIHRvIHRoZSBuZXh0X3BhZ2UgLSAxCisJICogdG8gbWFrZSBzdXJlIHdlIGFsc28gd3JpdGUgdGhlIG1hcHBlZCBkaXJ0eSBidWZmZXJfaGVhZHMuCisJICogSWYgd2UgbG9vayBhdCBtcGQtPmxiaC5iX2Jsb2NrbnIgd2Ugd291bGQgb25seSBiZSBsb29raW5nCisJICogYXQgdGhlIGN1cnJlbnRseSBtYXBwZWQgYnVmZmVyX2hlYWRzLgorCSAqLwogCWluZGV4ID0gbXBkLT5maXJzdF9wYWdlOwogCWVuZCA9IG1wZC0+bmV4dF9wYWdlIC0gMTsKIAorCXBhZ2V2ZWNfaW5pdCgmcHZlYywgMCk7CiAJd2hpbGUgKGluZGV4IDw9IGVuZCkgewotCQkvKgotCQkgKiBXZSBjYW4gdXNlIFBBR0VDQUNIRV9UQUdfRElSVFkgbG9va3VwIGhlcmUgYmVjYXVzZQotCQkgKiBldmVuIHRob3VnaCB3ZSBoYXZlIGNsZWFyZWQgdGhlIGRpcnR5IGZsYWcgb24gdGhlIHBhZ2UKLQkJICogV2Ugc3RpbGwga2VlcCB0aGUgcGFnZSBpbiB0aGUgcmFkaXggdHJlZSB3aXRoIHRhZwotCQkgKiBQQUdFQ0FDSEVfVEFHX0RJUlRZLiBTZWUgY2xlYXJfcGFnZV9kaXJ0eV9mb3JfaW8uCi0JCSAqIFRoZSBQQUdFQ0FDSEVfVEFHX0RJUlRZIGlzIGNsZWFyZWQgaW4gc2V0X3BhZ2Vfd3JpdGViYWNrCi0JCSAqIHdoaWNoIGlzIGNhbGxlZCB2aWEgdGhlIGJlbG93IHdyaXRlcGFnZSBjYWxsYmFjay4KLQkJICovCi0JCW5yX3BhZ2VzID0gcGFnZXZlY19sb29rdXBfdGFnKCZwdmVjLCBtYXBwaW5nLCAmaW5kZXgsCi0JCQkJCVBBR0VDQUNIRV9UQUdfRElSVFksCi0JCQkJCW1pbihlbmQgLSBpbmRleCwKLQkJCQkJKHBnb2ZmX3QpUEFHRVZFQ19TSVpFLTEpICsgMSk7CisJCW5yX3BhZ2VzID0gcGFnZXZlY19sb29rdXAoJnB2ZWMsIG1hcHBpbmcsIGluZGV4LCBQQUdFVkVDX1NJWkUpOwogCQlpZiAobnJfcGFnZXMgPT0gMCkKIAkJCWJyZWFrOwogCQlmb3IgKGkgPSAwOyBpIDwgbnJfcGFnZXM7IGkrKykgewogCQkJc3RydWN0IHBhZ2UgKnBhZ2UgPSBwdmVjLnBhZ2VzW2ldOwogCisJCQlpbmRleCA9IHBhZ2UtPmluZGV4OworCQkJaWYgKGluZGV4ID4gZW5kKQorCQkJCWJyZWFrOworCQkJaW5kZXgrKzsKKworCQkJQlVHX09OKCFQYWdlTG9ja2VkKHBhZ2UpKTsKKwkJCUJVR19PTihQYWdlV3JpdGViYWNrKHBhZ2UpKTsKKwogCQkJcGFnZXNfc2tpcHBlZCA9IG1wZC0+d2JjLT5wYWdlc19za2lwcGVkOwogCQkJZXJyID0gbWFwcGluZy0+YV9vcHMtPndyaXRlcGFnZShwYWdlLCBtcGQtPndiYyk7CiAJCQlpZiAoIWVyciAmJiAocGFnZXNfc2tpcHBlZCA9PSBtcGQtPndiYy0+cGFnZXNfc2tpcHBlZCkpCkBAIC0xODMxLDEzICsxODY3LDEzIEBACiAJCQlleHQ0X2NvdW50X2ZyZWVfYmxvY2tzKGlub2RlLT5pX3NiKSk7CiAJcHJpbnRrKEtFUk5fRU1FUkcgIkZyZWUvRGlydHkgYmxvY2sgZGV0YWlsc1xuIik7CiAJcHJpbnRrKEtFUk5fRU1FUkcgImZyZWVfYmxvY2tzPSVsbGRcbiIsCi0JCQlwZXJjcHVfY291bnRlcl9zdW0oJnNiaS0+c19mcmVlYmxvY2tzX2NvdW50ZXIpKTsKKwkJCShsb25nIGxvbmcpcGVyY3B1X2NvdW50ZXJfc3VtKCZzYmktPnNfZnJlZWJsb2Nrc19jb3VudGVyKSk7CiAJcHJpbnRrKEtFUk5fRU1FUkcgImRpcnR5X2Jsb2Nrcz0lbGxkXG4iLAotCQkJcGVyY3B1X2NvdW50ZXJfc3VtKCZzYmktPnNfZGlydHlibG9ja3NfY291bnRlcikpOworCQkJKGxvbmcgbG9uZylwZXJjcHVfY291bnRlcl9zdW0oJnNiaS0+c19kaXJ0eWJsb2Nrc19jb3VudGVyKSk7CiAJcHJpbnRrKEtFUk5fRU1FUkcgIkJsb2NrIHJlc2VydmF0aW9uIGRldGFpbHNcbiIpOwotCXByaW50ayhLRVJOX0VNRVJHICJpX3Jlc2VydmVkX2RhdGFfYmxvY2tzPSVsdVxuIiwKKwlwcmludGsoS0VSTl9FTUVSRyAiaV9yZXNlcnZlZF9kYXRhX2Jsb2Nrcz0ldVxuIiwKIAkJCUVYVDRfSShpbm9kZSktPmlfcmVzZXJ2ZWRfZGF0YV9ibG9ja3MpOwotCXByaW50ayhLRVJOX0VNRVJHICJpX3Jlc2VydmVkX21ldGFfYmxvY2tzPSVsdVxuIiwKKwlwcmludGsoS0VSTl9FTUVSRyAiaV9yZXNlcnZlZF9tZXRhX2Jsb2Nrcz0ldVxuIiwKIAkJCUVYVDRfSShpbm9kZSktPmlfcmVzZXJ2ZWRfbWV0YV9ibG9ja3MpOwogCXJldHVybjsKIH0KQEAgLTIwODcsMTEgKzIxMjMsMjkgQEAKIAkJYmggPSBoZWFkOwogCQlkbyB7CiAJCQlCVUdfT04oYnVmZmVyX2xvY2tlZChiaCkpOworCQkJLyoKKwkJCSAqIFdlIG5lZWQgdG8gdHJ5IHRvIGFsbG9jYXRlCisJCQkgKiB1bm1hcHBlZCBibG9ja3MgaW4gdGhlIHNhbWUgcGFnZS4KKwkJCSAqIE90aGVyd2lzZSB3ZSB3b24ndCBtYWtlIHByb2dyZXNzCisJCQkgKiB3aXRoIHRoZSBwYWdlIGluIGV4dDRfZGFfd3JpdGVwYWdlCisJCQkgKi8KIAkJCWlmIChidWZmZXJfZGlydHkoYmgpICYmCiAJCQkJKCFidWZmZXJfbWFwcGVkKGJoKSB8fCBidWZmZXJfZGVsYXkoYmgpKSkgewogCQkJCW1wYWdlX2FkZF9iaF90b19leHRlbnQobXBkLCBsb2dpY2FsLCBiaCk7CiAJCQkJaWYgKG1wZC0+aW9fZG9uZSkKIAkJCQkJcmV0dXJuIE1QQUdFX0RBX0VYVEVOVF9UQUlMOworCQkJfSBlbHNlIGlmIChidWZmZXJfZGlydHkoYmgpICYmIChidWZmZXJfbWFwcGVkKGJoKSkpIHsKKwkJCQkvKgorCQkJCSAqIG1hcHBlZCBkaXJ0eSBidWZmZXIuIFdlIG5lZWQgdG8gdXBkYXRlCisJCQkJICogdGhlIGJfc3RhdGUgYmVjYXVzZSB3ZSBsb29rIGF0CisJCQkJICogYl9zdGF0ZSBpbiBtcGFnZV9kYV9tYXBfYmxvY2tzLiBXZSBkb24ndAorCQkJCSAqIHVwZGF0ZSBiX3NpemUgYmVjYXVzZSBpZiB3ZSBmaW5kIGFuCisJCQkJICogdW5tYXBwZWQgYnVmZmVyX2hlYWQgbGF0ZXIgd2UgbmVlZCB0bworCQkJCSAqIHVzZSB0aGUgYl9zdGF0ZSBmbGFnIG9mIHRoYXQgYnVmZmVyX2hlYWQuCisJCQkJICovCisJCQkJaWYgKG1wZC0+bGJoLmJfc2l6ZSA9PSAwKQorCQkJCQltcGQtPmxiaC5iX3N0YXRlID0KKwkJCQkJCWJoLT5iX3N0YXRlICYgQkhfRkxBR1M7CiAJCQl9CiAJCQlsb2dpY2FsKys7CiAJCX0gd2hpbGUgKChiaCA9IGJoLT5iX3RoaXNfcGFnZSkgIT0gaGVhZCk7CkBAIC0yMjY5LDEwICsyMzIzLDEzIEBACiB7CiAJaW50IHJldCA9IDA7CiAJbG9mZl90IHNpemU7Ci0JdW5zaWduZWQgbG9uZyBsZW47CisJdW5zaWduZWQgaW50IGxlbjsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKnBhZ2VfYnVmczsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gcGFnZS0+bWFwcGluZy0+aG9zdDsKIAorCXRyYWNlX21hcmsoZXh0NF9kYV93cml0ZXBhZ2UsCisJCSAgICJkZXYgJXMgaW5vICVsdSBwYWdlX2luZGV4ICVsdSIsCisJCSAgIGlub2RlLT5pX3NiLT5zX2lkLCBpbm9kZS0+aV9pbm8sIHBhZ2UtPmluZGV4KTsKIAlzaXplID0gaV9zaXplX3JlYWQoaW5vZGUpOwogCWlmIChwYWdlLT5pbmRleCA9PSBzaXplID4+IFBBR0VfQ0FDSEVfU0hJRlQpCiAJCWxlbiA9IHNpemUgJiB+UEFHRV9DQUNIRV9NQVNLOwpAQCAtMjM3OCwxMCArMjQzNSwyNSBAQAogCXN0cnVjdCBtcGFnZV9kYV9kYXRhIG1wZDsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gbWFwcGluZy0+aG9zdDsKIAlpbnQgbm9fbnJ3cml0ZV9pbmRleF91cGRhdGU7Ci0JbG9uZyBwYWdlc193cml0dGVuID0gMCwgcGFnZXNfc2tpcHBlZDsKKwlpbnQgcGFnZXNfd3JpdHRlbiA9IDA7CisJbG9uZyBwYWdlc19za2lwcGVkOwogCWludCBuZWVkZWRfYmxvY2tzLCByZXQgPSAwLCBucl90b193cml0ZWJ1bXAgPSAwOwogCXN0cnVjdCBleHQ0X3NiX2luZm8gKnNiaSA9IEVYVDRfU0IobWFwcGluZy0+aG9zdC0+aV9zYik7CiAKKwl0cmFjZV9tYXJrKGV4dDRfZGFfd3JpdGVwYWdlcywKKwkJICAgImRldiAlcyBpbm8gJWx1IG5yX3Rfd3JpdGUgJWxkICIKKwkJICAgInBhZ2VzX3NraXBwZWQgJWxkIHJhbmdlX3N0YXJ0ICVsbHUgIgorCQkgICAicmFuZ2VfZW5kICVsbHUgbm9uYmxvY2tpbmcgJWQgIgorCQkgICAiZm9yX2t1cGRhdGUgJWQgZm9yX3JlY2xhaW0gJWQgIgorCQkgICAiZm9yX3dyaXRlcGFnZXMgJWQgcmFuZ2VfY3ljbGljICVkIiwKKwkJICAgaW5vZGUtPmlfc2ItPnNfaWQsIGlub2RlLT5pX2lubywKKwkJICAgd2JjLT5ucl90b193cml0ZSwgd2JjLT5wYWdlc19za2lwcGVkLAorCQkgICAodW5zaWduZWQgbG9uZyBsb25nKSB3YmMtPnJhbmdlX3N0YXJ0LAorCQkgICAodW5zaWduZWQgbG9uZyBsb25nKSB3YmMtPnJhbmdlX2VuZCwKKwkJICAgd2JjLT5ub25ibG9ja2luZywgd2JjLT5mb3Jfa3VwZGF0ZSwKKwkJICAgd2JjLT5mb3JfcmVjbGFpbSwgd2JjLT5mb3Jfd3JpdGVwYWdlcywKKwkJICAgd2JjLT5yYW5nZV9jeWNsaWMpOworCiAJLyoKIAkgKiBObyBwYWdlcyB0byB3cml0ZT8gVGhpcyBpcyBtYWlubHkgYSBrbHVkZ2UgdG8gYXZvaWQgc3RhcnRpbmcKIAkgKiBhIHRyYW5zYWN0aW9uIGZvciBzcGVjaWFsIGlub2RlcyBsaWtlIGpvdXJuYWwgaW5vZGUgb24gbGFzdCBpcHV0KCkKQEAgLTIzODksNiArMjQ2MSwyMCBAQAogCSAqLwogCWlmICghbWFwcGluZy0+bnJwYWdlcyB8fCAhbWFwcGluZ190YWdnZWQobWFwcGluZywgUEFHRUNBQ0hFX1RBR19ESVJUWSkpCiAJCXJldHVybiAwOworCisJLyoKKwkgKiBJZiB0aGUgZmlsZXN5c3RlbSBoYXMgYWJvcnRlZCwgaXQgaXMgcmVhZC1vbmx5LCBzbyByZXR1cm4KKwkgKiByaWdodCBhd2F5IGluc3RlYWQgb2YgZHVtcGluZyBzdGFjayB0cmFjZXMgbGF0ZXIgb24gdGhhdAorCSAqIHdpbGwgb2JzY3VyZSB0aGUgcmVhbCBzb3VyY2Ugb2YgdGhlIHByb2JsZW0uICBXZSB0ZXN0CisJICogRVhUNF9NT1VOVF9BQk9SVCBpbnN0ZWFkIG9mIHNiLT5zX2ZsYWcncyBNU19SRE9OTFkgYmVjYXVzZQorCSAqIHRoZSBsYXR0ZXIgY291bGQgYmUgdHJ1ZSBpZiB0aGUgZmlsZXN5c3RlbSBpcyBtb3VudGVkCisJICogcmVhZC1vbmx5LCBhbmQgaW4gdGhhdCBjYXNlLCBleHQ0X2RhX3dyaXRlcGFnZXMgc2hvdWxkCisJICogKm5ldmVyKiBiZSBjYWxsZWQsIHNvIGlmIHRoYXQgZXZlciBoYXBwZW5zLCB3ZSB3b3VsZCB3YW50CisJICogdGhlIHN0YWNrIHRyYWNlLgorCSAqLworCWlmICh1bmxpa2VseShzYmktPnNfbW91bnRfb3B0ICYgRVhUNF9NT1VOVF9BQk9SVCkpCisJCXJldHVybiAtRVJPRlM7CisKIAkvKgogCSAqIE1ha2Ugc3VyZSBucl90b193cml0ZSBpcyA+PSBzYmktPnNfbWJfc3RyZWFtX3JlcXVlc3QKIAkgKiBUaGlzIG1ha2Ugc3VyZSBzbWFsbCBmaWxlcyBibG9ja3MgYXJlIGFsbG9jYXRlZCBpbgpAQCAtMjQzMyw3ICsyNTE5LDcgQEAKIAkJaGFuZGxlID0gZXh0NF9qb3VybmFsX3N0YXJ0KGlub2RlLCBuZWVkZWRfYmxvY2tzKTsKIAkJaWYgKElTX0VSUihoYW5kbGUpKSB7CiAJCQlyZXQgPSBQVFJfRVJSKGhhbmRsZSk7Ci0JCQlwcmludGsoS0VSTl9FTUVSRyAiJXM6IGpiZDJfc3RhcnQ6ICIKKwkJCXByaW50ayhLRVJOX0NSSVQgIiVzOiBqYmQyX3N0YXJ0OiAiCiAJCQkgICAgICAgIiVsZCBwYWdlcywgaW5vICVsdTsgZXJyICVkXG4iLCBfX2Z1bmNfXywKIAkJCQl3YmMtPm5yX3RvX3dyaXRlLCBpbm9kZS0+aV9pbm8sIHJldCk7CiAJCQlkdW1wX3N0YWNrKCk7CkBAIC0yNDg2LDYgKzI1NzIsMTQgQEAKIAlpZiAoIW5vX25yd3JpdGVfaW5kZXhfdXBkYXRlKQogCQl3YmMtPm5vX25yd3JpdGVfaW5kZXhfdXBkYXRlID0gMDsKIAl3YmMtPm5yX3RvX3dyaXRlIC09IG5yX3RvX3dyaXRlYnVtcDsKKwl0cmFjZV9tYXJrKGV4dDRfZGFfd3JpdGVwYWdlX3Jlc3VsdCwKKwkJICAgImRldiAlcyBpbm8gJWx1IHJldCAlZCBwYWdlc193cml0dGVuICVkICIKKwkJICAgInBhZ2VzX3NraXBwZWQgJWxkIGNvbmdlc3Rpb24gJWQgIgorCQkgICAibW9yZV9pbyAlZCBub19ucndyaXRlX2luZGV4X3VwZGF0ZSAlZCIsCisJCSAgIGlub2RlLT5pX3NiLT5zX2lkLCBpbm9kZS0+aV9pbm8sIHJldCwKKwkJICAgcGFnZXNfd3JpdHRlbiwgd2JjLT5wYWdlc19za2lwcGVkLAorCQkgICB3YmMtPmVuY291bnRlcmVkX2Nvbmdlc3Rpb24sIHdiYy0+bW9yZV9pbywKKwkJICAgd2JjLT5ub19ucndyaXRlX2luZGV4X3VwZGF0ZSk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMjQ5OCw3ICsyNTkyLDcgQEAKIAkvKgogCSAqIHN3aXRjaCB0byBub24gZGVsYWxsb2MgbW9kZSBpZiB3ZSBhcmUgcnVubmluZyBsb3cKIAkgKiBvbiBmcmVlIGJsb2NrLiBUaGUgZnJlZSBibG9jayBhY2NvdW50aW5nIHZpYSBwZXJjcHUKLQkgKiBjb3VudGVycyBjYW4gZ2V0IHNsaWdodGx5IHdyb25nIHdpdGggRkJDX0JBVENIIGdldHRpbmcKKwkgKiBjb3VudGVycyBjYW4gZ2V0IHNsaWdodGx5IHdyb25nIHdpdGggcGVyY3B1X2NvdW50ZXJfYmF0Y2ggZ2V0dGluZwogCSAqIGFjY3VtdWxhdGVkIG9uIGVhY2ggQ1BVIHdpdGhvdXQgdXBkYXRpbmcgZ2xvYmFsIGNvdW50ZXJzCiAJICogRGVsYWxsb2MgbmVlZCBhbiBhY2N1cmF0ZSBmcmVlIGJsb2NrIGFjY291bnRpbmcuIFNvIHN3aXRjaAogCSAqIHRvIG5vbiBkZWxhbGxvYyB3aGVuIHdlIGFyZSBuZWFyIHRvIGVycm9yIHJhbmdlLgpAQCAtMjUzNyw2ICsyNjMxLDExIEBACiAJCQkJCWxlbiwgZmxhZ3MsIHBhZ2VwLCBmc2RhdGEpOwogCX0KIAkqZnNkYXRhID0gKHZvaWQgKikwOworCisJdHJhY2VfbWFyayhleHQ0X2RhX3dyaXRlX2JlZ2luLAorCQkgICAiZGV2ICVzIGlubyAlbHUgcG9zICVsbHUgbGVuICV1IGZsYWdzICV1IiwKKwkJICAgaW5vZGUtPmlfc2ItPnNfaWQsIGlub2RlLT5pX2lubywKKwkJICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgcG9zLCBsZW4sIGZsYWdzKTsKIHJldHJ5OgogCS8qCiAJICogV2l0aCBkZWxheWVkIGFsbG9jYXRpb24sIHdlIGRvbid0IGxvZyB0aGUgaV9kaXNrc2l6ZSB1cGRhdGUKQEAgLTI2MjYsNiArMjcyNSwxMCBAQAogCQl9CiAJfQogCisJdHJhY2VfbWFyayhleHQ0X2RhX3dyaXRlX2VuZCwKKwkJICAgImRldiAlcyBpbm8gJWx1IHBvcyAlbGx1IGxlbiAldSBjb3BpZWQgJXUiLAorCQkgICBpbm9kZS0+aV9zYi0+c19pZCwgaW5vZGUtPmlfaW5vLAorCQkgICAodW5zaWduZWQgbG9uZyBsb25nKSBwb3MsIGxlbiwgY29waWVkKTsKIAlzdGFydCA9IHBvcyAmIChQQUdFX0NBQ0hFX1NJWkUgLSAxKTsKIAllbmQgPSBzdGFydCArIGNvcGllZCAtIDE7CiAKQEAgLTI3MTgsNyArMjgyMSwxMCBAQAogCQlmaWxlbWFwX3dyaXRlX2FuZF93YWl0KG1hcHBpbmcpOwogCX0KIAotCWlmIChFWFQ0X0koaW5vZGUpLT5pX3N0YXRlICYgRVhUNF9TVEFURV9KREFUQSkgeworCUJVR19PTighRVhUNF9KT1VSTkFMKGlub2RlKSAmJgorCSAgICAgICBFWFQ0X0koaW5vZGUpLT5pX3N0YXRlICYgRVhUNF9TVEFURV9KREFUQSk7CisKKwlpZiAoRVhUNF9KT1VSTkFMKGlub2RlKSAmJiBFWFQ0X0koaW5vZGUpLT5pX3N0YXRlICYgRVhUNF9TVEFURV9KREFUQSkgewogCQkvKgogCQkgKiBUaGlzIGlzIGEgUkVBTExZIGhlYXZ5d2VpZ2h0IGFwcHJvYWNoLCBidXQgdGhlIHVzZSBvZgogCQkgKiBibWFwIG9uIGRpcnR5IGZpbGVzIGlzIGV4cGVjdGVkIHRvIGJlIGV4dHJlbWVseSByYXJlOgpAQCAtMjgzNiw2ICsyOTQyLDkgQEAKIAlsb2ZmX3Qgc2l6ZSA9IGlfc2l6ZV9yZWFkKGlub2RlKTsKIAlsb2ZmX3QgbGVuOwogCisJdHJhY2VfbWFyayhleHQ0X25vcm1hbF93cml0ZXBhZ2UsCisJCSAgICJkZXYgJXMgaW5vICVsdSBwYWdlX2luZGV4ICVsdSIsCisJCSAgIGlub2RlLT5pX3NiLT5zX2lkLCBpbm9kZS0+aV9pbm8sIHBhZ2UtPmluZGV4KTsKIAlKX0FTU0VSVChQYWdlTG9ja2VkKHBhZ2UpKTsKIAlpZiAocGFnZS0+aW5kZXggPT0gc2l6ZSA+PiBQQUdFX0NBQ0hFX1NISUZUKQogCQlsZW4gPSBzaXplICYgflBBR0VfQ0FDSEVfTUFTSzsKQEAgLTI5MjEsNiArMzAzMCw5IEBACiAJbG9mZl90IHNpemUgPSBpX3NpemVfcmVhZChpbm9kZSk7CiAJbG9mZl90IGxlbjsKIAorCXRyYWNlX21hcmsoZXh0NF9qb3VybmFsbGVkX3dyaXRlcGFnZSwKKwkJICAgImRldiAlcyBpbm8gJWx1IHBhZ2VfaW5kZXggJWx1IiwKKwkJICAgaW5vZGUtPmlfc2ItPnNfaWQsIGlub2RlLT5pX2lubywgcGFnZS0+aW5kZXgpOwogCUpfQVNTRVJUKFBhZ2VMb2NrZWQocGFnZSkpOwogCWlmIChwYWdlLT5pbmRleCA9PSBzaXplID4+IFBBR0VfQ0FDSEVfU0hJRlQpCiAJCWxlbiA9IHNpemUgJiB+UEFHRV9DQUNIRV9NQVNLOwpAQCAtMjk4OSw3ICszMTAxLDEwIEBACiAJaWYgKG9mZnNldCA9PSAwKQogCQlDbGVhclBhZ2VDaGVja2VkKHBhZ2UpOwogCi0JamJkMl9qb3VybmFsX2ludmFsaWRhdGVwYWdlKGpvdXJuYWwsIHBhZ2UsIG9mZnNldCk7CisJaWYgKGpvdXJuYWwpCisJCWpiZDJfam91cm5hbF9pbnZhbGlkYXRlcGFnZShqb3VybmFsLCBwYWdlLCBvZmZzZXQpOworCWVsc2UKKwkJYmxvY2tfaW52YWxpZGF0ZXBhZ2UocGFnZSwgb2Zmc2V0KTsKIH0KIAogc3RhdGljIGludCBleHQ0X3JlbGVhc2VwYWdlKHN0cnVjdCBwYWdlICpwYWdlLCBnZnBfdCB3YWl0KQpAQCAtMjk5OSw3ICszMTE0LDEwIEBACiAJV0FSTl9PTihQYWdlQ2hlY2tlZChwYWdlKSk7CiAJaWYgKCFwYWdlX2hhc19idWZmZXJzKHBhZ2UpKQogCQlyZXR1cm4gMDsKLQlyZXR1cm4gamJkMl9qb3VybmFsX3RyeV90b19mcmVlX2J1ZmZlcnMoam91cm5hbCwgcGFnZSwgd2FpdCk7CisJaWYgKGpvdXJuYWwpCisJCXJldHVybiBqYmQyX2pvdXJuYWxfdHJ5X3RvX2ZyZWVfYnVmZmVycyhqb3VybmFsLCBwYWdlLCB3YWl0KTsKKwllbHNlCisJCXJldHVybiB0cnlfdG9fZnJlZV9idWZmZXJzKHBhZ2UpOwogfQogCiAvKgpAQCAtMzI3MSw3ICszMzg5LDcgQEAKIAogCWVyciA9IDA7CiAJaWYgKGV4dDRfc2hvdWxkX2pvdXJuYWxfZGF0YShpbm9kZSkpIHsKLQkJZXJyID0gZXh0NF9qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgYmgpOworCQllcnIgPSBleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGlub2RlLCBiaCk7CiAJfSBlbHNlIHsKIAkJaWYgKGV4dDRfc2hvdWxkX29yZGVyX2RhdGEoaW5vZGUpKQogCQkJZXJyID0gZXh0NF9qYmQyX2ZpbGVfaW5vZGUoaGFuZGxlLCBpbm9kZSk7CkBAIC0zMzk1LDggKzM1MTMsOCBAQAogCV9fbGUzMiAqcDsKIAlpZiAodHJ5X3RvX2V4dGVuZF90cmFuc2FjdGlvbihoYW5kbGUsIGlub2RlKSkgewogCQlpZiAoYmgpIHsKLQkJCUJVRkZFUl9UUkFDRShiaCwgImNhbGwgZXh0NF9qb3VybmFsX2RpcnR5X21ldGFkYXRhIik7Ci0JCQlleHQ0X2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBiaCk7CisJCQlCVUZGRVJfVFJBQ0UoYmgsICJjYWxsIGV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhIik7CisJCQlleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGlub2RlLCBiaCk7CiAJCX0KIAkJZXh0NF9tYXJrX2lub2RlX2RpcnR5KGhhbmRsZSwgaW5vZGUpOwogCQlleHQ0X2pvdXJuYWxfdGVzdF9yZXN0YXJ0KGhhbmRsZSwgaW5vZGUpOwpAQCAtMzQ5Niw3ICszNjE0LDcgQEAKIAkJCQkgIGNvdW50LCBibG9ja190b19mcmVlX3AsIHApOwogCiAJaWYgKHRoaXNfYmgpIHsKLQkJQlVGRkVSX1RSQUNFKHRoaXNfYmgsICJjYWxsIGV4dDRfam91cm5hbF9kaXJ0eV9tZXRhZGF0YSIpOworCQlCVUZGRVJfVFJBQ0UodGhpc19iaCwgImNhbGwgZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEiKTsKIAogCQkvKgogCQkgKiBUaGUgYnVmZmVyIGhlYWQgc2hvdWxkIGhhdmUgYW4gYXR0YWNoZWQgam91cm5hbCBoZWFkIGF0IHRoaXMKQEAgLTM1MDUsNyArMzYyMyw3IEBACiAJCSAqIHRoZSBibG9jayB3YXMgY2xlYXJlZC4gQ2hlY2sgZm9yIHRoaXMgaW5zdGVhZCBvZiBPT1BTaW5nLgogCQkgKi8KIAkJaWYgKGJoMmpoKHRoaXNfYmgpKQotCQkJZXh0NF9qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgdGhpc19iaCk7CisJCQlleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGlub2RlLCB0aGlzX2JoKTsKIAkJZWxzZQogCQkJZXh0NF9lcnJvcihpbm9kZS0+aV9zYiwgX19mdW5jX18sCiAJCQkJICAgImNpcmN1bGFyIGluZGlyZWN0IGJsb2NrIGRldGVjdGVkLCAiCkBAIC0zNTM1LDcgKzM2NTMsNyBAQAogCWV4dDRfZnNibGtfdCBucjsKIAlfX2xlMzIgKnA7CiAKLQlpZiAoaXNfaGFuZGxlX2Fib3J0ZWQoaGFuZGxlKSkKKwlpZiAoZXh0NF9oYW5kbGVfaXNfYWJvcnRlZChoYW5kbGUpKQogCQlyZXR1cm47CiAKIAlpZiAoZGVwdGgtLSkgewpAQCAtMzYwNSw3ICszNzIzLDcgQEAKIAkJCSAqIHdpbGwgbWVyZWx5IGNvbXBsYWluIGFib3V0IHJlbGVhc2luZyBhIGZyZWUgYmxvY2ssCiAJCQkgKiByYXRoZXIgdGhhbiBsZWFraW5nIGJsb2Nrcy4KIAkJCSAqLwotCQkJaWYgKGlzX2hhbmRsZV9hYm9ydGVkKGhhbmRsZSkpCisJCQlpZiAoZXh0NF9oYW5kbGVfaXNfYWJvcnRlZChoYW5kbGUpKQogCQkJCXJldHVybjsKIAkJCWlmICh0cnlfdG9fZXh0ZW5kX3RyYW5zYWN0aW9uKGhhbmRsZSwgaW5vZGUpKSB7CiAJCQkJZXh0NF9tYXJrX2lub2RlX2RpcnR5KGhhbmRsZSwgaW5vZGUpOwpAQCAtMzYyNCw5ICszNzQyLDEwIEBACiAJCQkJCQkJCSAgIHBhcmVudF9iaCkpewogCQkJCQkqcCA9IDA7CiAJCQkJCUJVRkZFUl9UUkFDRShwYXJlbnRfYmgsCi0JCQkJCSJjYWxsIGV4dDRfam91cm5hbF9kaXJ0eV9tZXRhZGF0YSIpOwotCQkJCQlleHQ0X2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLAotCQkJCQkJCQkgICAgcGFyZW50X2JoKTsKKwkJCQkJImNhbGwgZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEiKTsKKwkJCQkJZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEoaGFuZGxlLAorCQkJCQkJCQkgICBpbm9kZSwKKwkJCQkJCQkJICAgcGFyZW50X2JoKTsKIAkJCQl9CiAJCQl9CiAJCX0KQEAgLTM4MTQsNyArMzkzMyw3IEBACiAJICogc3luY2hyb25vdXMKIAkgKi8KIAlpZiAoSVNfU1lOQyhpbm9kZSkpCi0JCWhhbmRsZS0+aF9zeW5jID0gMTsKKwkJZXh0NF9oYW5kbGVfc3luYyhoYW5kbGUpOwogb3V0X3N0b3A6CiAJLyoKIAkgKiBJZiB0aGlzIHdhcyBhIHNpbXBsZSBmdHJ1bmNhdGUoKSwgYW5kIHRoZSBmaWxlIHdpbGwgcmVtYWluIGFsaXZlCkBAIC0zODQ0LDcgKzM5NjMsNyBAQAogCWV4dDRfZnNibGtfdAkJYmxvY2s7CiAJaW50CQkJaW5vZGVzX3Blcl9ibG9jaywgaW5vZGVfb2Zmc2V0OwogCi0JaWxvYy0+YmggPSAwOworCWlsb2MtPmJoID0gTlVMTDsKIAlpZiAoIWV4dDRfdmFsaWRfaW51bShzYiwgaW5vZGUtPmlfaW5vKSkKIAkJcmV0dXJuIC1FSU87CiAKQEAgLTM5NTEsNyArNDA3MCw3IEBACiAJCQludW0gPSBFWFQ0X0lOT0RFU19QRVJfR1JPVVAoc2IpOwogCQkJaWYgKEVYVDRfSEFTX1JPX0NPTVBBVF9GRUFUVVJFKHNiLAogCQkJCSAgICAgICBFWFQ0X0ZFQVRVUkVfUk9fQ09NUEFUX0dEVF9DU1VNKSkKLQkJCQludW0gLT0gbGUxNl90b19jcHUoZ2RwLT5iZ19pdGFibGVfdW51c2VkKTsKKwkJCQludW0gLT0gZXh0NF9pdGFibGVfdW51c2VkX2NvdW50KHNiLCBnZHApOwogCQkJdGFibGUgKz0gbnVtIC8gaW5vZGVzX3Blcl9ibG9jazsKIAkJCWlmIChlbmQgPiB0YWJsZSkKIAkJCQllbmQgPSB0YWJsZTsKQEAgLTQzMTMsOCArNDQzMiw4IEBACiAJCQlFWFQ0X1NFVF9ST19DT01QQVRfRkVBVFVSRShzYiwKIAkJCQkJRVhUNF9GRUFUVVJFX1JPX0NPTVBBVF9MQVJHRV9GSUxFKTsKIAkJCXNiLT5zX2RpcnQgPSAxOwotCQkJaGFuZGxlLT5oX3N5bmMgPSAxOwotCQkJZXJyID0gZXh0NF9qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwKKwkJCWV4dDRfaGFuZGxlX3N5bmMoaGFuZGxlKTsKKwkJCWVyciA9IGV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgaW5vZGUsCiAJCQkJCUVYVDRfU0Ioc2IpLT5zX3NiaCk7CiAJCX0KIAl9CkBAIC00MzQxLDkgKzQ0NjAsOCBAQAogCQlyYXdfaW5vZGUtPmlfZXh0cmFfaXNpemUgPSBjcHVfdG9fbGUxNihlaS0+aV9leHRyYV9pc2l6ZSk7CiAJfQogCi0KLQlCVUZGRVJfVFJBQ0UoYmgsICJjYWxsIGV4dDRfam91cm5hbF9kaXJ0eV9tZXRhZGF0YSIpOwotCXJjID0gZXh0NF9qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgYmgpOworCUJVRkZFUl9UUkFDRShiaCwgImNhbGwgZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEiKTsKKwlyYyA9IGV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgaW5vZGUsIGJoKTsKIAlpZiAoIWVycikKIAkJZXJyID0gcmM7CiAJZWktPmlfc3RhdGUgJj0gfkVYVDRfU1RBVEVfTkVXOwpAQCAtNDQwNiw2ICs0NTI0LDI1IEBACiAJcmV0dXJuIGV4dDRfZm9yY2VfY29tbWl0KGlub2RlLT5pX3NiKTsKIH0KIAoraW50IF9fZXh0NF93cml0ZV9kaXJ0eV9tZXRhZGF0YShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQoreworCWludCBlcnIgPSAwOworCisJbWFya19idWZmZXJfZGlydHkoYmgpOworCWlmIChpbm9kZSAmJiBpbm9kZV9uZWVkc19zeW5jKGlub2RlKSkgeworCQlzeW5jX2RpcnR5X2J1ZmZlcihiaCk7CisJCWlmIChidWZmZXJfcmVxKGJoKSAmJiAhYnVmZmVyX3VwdG9kYXRlKGJoKSkgeworCQkJZXh0NF9lcnJvcihpbm9kZS0+aV9zYiwgX19mdW5jX18sCisJCQkJICAgIklPIGVycm9yIHN5bmNpbmcgaW5vZGUsICIKKwkJCQkgICAiaW5vZGU9JWx1LCBibG9jaz0lbGx1IiwKKwkJCQkgICBpbm9kZS0+aV9pbm8sCisJCQkJICAgKHVuc2lnbmVkIGxvbmcgbG9uZyliaC0+Yl9ibG9ja25yKTsKKwkJCWVyciA9IC1FSU87CisJCX0KKwl9CisJcmV0dXJuIGVycjsKK30KKwogLyoKICAqIGV4dDRfc2V0YXR0cigpCiAgKgpAQCAtNDcxMCwxNiArNDg0NywxNSBAQAogZXh0NF9yZXNlcnZlX2lub2RlX3dyaXRlKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJCQkgc3RydWN0IGV4dDRfaWxvYyAqaWxvYykKIHsKLQlpbnQgZXJyID0gMDsKLQlpZiAoaGFuZGxlKSB7Ci0JCWVyciA9IGV4dDRfZ2V0X2lub2RlX2xvYyhpbm9kZSwgaWxvYyk7Ci0JCWlmICghZXJyKSB7Ci0JCQlCVUZGRVJfVFJBQ0UoaWxvYy0+YmgsICJnZXRfd3JpdGVfYWNjZXNzIik7Ci0JCQllcnIgPSBleHQ0X2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGUsIGlsb2MtPmJoKTsKLQkJCWlmIChlcnIpIHsKLQkJCQlicmVsc2UoaWxvYy0+YmgpOwotCQkJCWlsb2MtPmJoID0gTlVMTDsKLQkJCX0KKwlpbnQgZXJyOworCisJZXJyID0gZXh0NF9nZXRfaW5vZGVfbG9jKGlub2RlLCBpbG9jKTsKKwlpZiAoIWVycikgeworCQlCVUZGRVJfVFJBQ0UoaWxvYy0+YmgsICJnZXRfd3JpdGVfYWNjZXNzIik7CisJCWVyciA9IGV4dDRfam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZSwgaWxvYy0+YmgpOworCQlpZiAoZXJyKSB7CisJCQlicmVsc2UoaWxvYy0+YmgpOworCQkJaWxvYy0+YmggPSBOVUxMOwogCQl9CiAJfQogCWV4dDRfc3RkX2Vycm9yKGlub2RlLT5pX3NiLCBlcnIpOwpAQCAtNDc5MSw3ICs0OTI3LDggQEAKIAogCW1pZ2h0X3NsZWVwKCk7CiAJZXJyID0gZXh0NF9yZXNlcnZlX2lub2RlX3dyaXRlKGhhbmRsZSwgaW5vZGUsICZpbG9jKTsKLQlpZiAoRVhUNF9JKGlub2RlKS0+aV9leHRyYV9pc2l6ZSA8IHNiaS0+c193YW50X2V4dHJhX2lzaXplICYmCisJaWYgKGV4dDRfaGFuZGxlX3ZhbGlkKGhhbmRsZSkgJiYKKwkgICAgRVhUNF9JKGlub2RlKS0+aV9leHRyYV9pc2l6ZSA8IHNiaS0+c193YW50X2V4dHJhX2lzaXplICYmCiAJICAgICEoRVhUNF9JKGlub2RlKS0+aV9zdGF0ZSAmIEVYVDRfU1RBVEVfTk9fRVhQQU5EKSkgewogCQkvKgogCQkgKiBXZSBuZWVkIGV4dHJhIGJ1ZmZlciBjcmVkaXRzIHNpbmNlIHdlIG1heSB3cml0ZSBpbnRvIEVBIGJsb2NrCkBAIC00ODQzLDYgKzQ5ODAsMTEgQEAKIAloYW5kbGVfdCAqY3VycmVudF9oYW5kbGUgPSBleHQ0X2pvdXJuYWxfY3VycmVudF9oYW5kbGUoKTsKIAloYW5kbGVfdCAqaGFuZGxlOwogCisJaWYgKCFleHQ0X2hhbmRsZV92YWxpZChjdXJyZW50X2hhbmRsZSkpIHsKKwkJZXh0NF9tYXJrX2lub2RlX2RpcnR5KGN1cnJlbnRfaGFuZGxlLCBpbm9kZSk7CisJCXJldHVybjsKKwl9CisKIAloYW5kbGUgPSBleHQ0X2pvdXJuYWxfc3RhcnQoaW5vZGUsIDIpOwogCWlmIChJU19FUlIoaGFuZGxlKSkKIAkJZ290byBvdXQ7CkBAIC00ODgwLDggKzUwMjIsOSBAQAogCQkJQlVGRkVSX1RSQUNFKGlsb2MuYmgsICJnZXRfd3JpdGVfYWNjZXNzIik7CiAJCQllcnIgPSBqYmQyX2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGUsIGlsb2MuYmgpOwogCQkJaWYgKCFlcnIpCi0JCQkJZXJyID0gZXh0NF9qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwKLQkJCQkJCQkJICBpbG9jLmJoKTsKKwkJCQllcnIgPSBleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsCisJCQkJCQkJCSBpbm9kZSwKKwkJCQkJCQkJIGlsb2MuYmgpOwogCQkJYnJlbHNlKGlsb2MuYmgpOwogCQl9CiAJfQpAQCAtNDkwNyw2ICs1MDUwLDggQEAKIAkgKi8KIAogCWpvdXJuYWwgPSBFWFQ0X0pPVVJOQUwoaW5vZGUpOworCWlmICgham91cm5hbCkKKwkJcmV0dXJuIDA7CiAJaWYgKGlzX2pvdXJuYWxfYWJvcnRlZChqb3VybmFsKSkKIAkJcmV0dXJuIC1FUk9GUzsKIApAQCAtNDkzNiw3ICs1MDgxLDcgQEAKIAkJcmV0dXJuIFBUUl9FUlIoaGFuZGxlKTsKIAogCWVyciA9IGV4dDRfbWFya19pbm9kZV9kaXJ0eShoYW5kbGUsIGlub2RlKTsKLQloYW5kbGUtPmhfc3luYyA9IDE7CisJZXh0NF9oYW5kbGVfc3luYyhoYW5kbGUpOwogCWV4dDRfam91cm5hbF9zdG9wKGhhbmRsZSk7CiAJZXh0NF9zdGRfZXJyb3IoaW5vZGUtPmlfc2IsIGVycik7CiAKZGlmZiAtLWdpdCBhL2ZzL2V4dDQvaW9jdGwuYyBiL2ZzL2V4dDQvaW9jdGwuYwppbmRleCBkYzk5YjQ3Li40MmRjODNmIDEwMDY0NAotLS0gYS9mcy9leHQ0L2lvY3RsLmMKKysrIGIvZnMvZXh0NC9pb2N0bC5jCkBAIC05OSw3ICs5OSw3IEBACiAJCQlnb3RvIGZsYWdzX291dDsKIAkJfQogCQlpZiAoSVNfU1lOQyhpbm9kZSkpCi0JCQloYW5kbGUtPmhfc3luYyA9IDE7CisJCQlleHQ0X2hhbmRsZV9zeW5jKGhhbmRsZSk7CiAJCWVyciA9IGV4dDRfcmVzZXJ2ZV9pbm9kZV93cml0ZShoYW5kbGUsIGlub2RlLCAmaWxvYyk7CiAJCWlmIChlcnIpCiAJCQlnb3RvIGZsYWdzX2VycjsKZGlmZiAtLWdpdCBhL2ZzL2V4dDQvbWJhbGxvYy5jIGIvZnMvZXh0NC9tYmFsbG9jLmMKaW5kZXggNDQ0YWQ5OS4uOTE4YWVjMCAxMDA2NDQKLS0tIGEvZnMvZXh0NC9tYmFsbG9jLmMKKysrIGIvZnMvZXh0NC9tYmFsbG9jLmMKQEAgLTEwMCw3ICsxMDAsNyBAQAogICogaW5vZGUgYXM6CiAgKgogICogIHsgICAgICAgICAgICAgICAgICAgICAgICBwYWdlICAgICAgICAgICAgICAgICAgICAgICAgfQotICogIFsgZ3JvdXAgMCBidWRkeV1bIGdyb3VwIDAgYml0bWFwXSBbZ3JvdXAgMV1bIGdyb3VwIDFdLi4uCisgKiAgWyBncm91cCAwIGJpdG1hcF1bIGdyb3VwIDAgYnVkZHldIFtncm91cCAxXVsgZ3JvdXAgMV0uLi4KICAqCiAgKgogICogb25lIGJsb2NrIGVhY2ggZm9yIGJpdG1hcCBhbmQgYnVkZHkgaW5mb3JtYXRpb24uICBTbyBmb3IgZWFjaCBncm91cCB3ZQpAQCAtMzMwLDYgKzMzMCwxOCBAQAogICogICAgICAgIG9iamVjdAogICoKICAqLworc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICpleHQ0X3BzcGFjZV9jYWNoZXA7CitzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKmV4dDRfYWNfY2FjaGVwOworc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICpleHQ0X2ZyZWVfZXh0X2NhY2hlcDsKK3N0YXRpYyB2b2lkIGV4dDRfbWJfZ2VuZXJhdGVfZnJvbV9wYShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB2b2lkICpiaXRtYXAsCisJCQkJCWV4dDRfZ3JvdXBfdCBncm91cCk7CitzdGF0aWMgdm9pZCBleHQ0X21iX2dlbmVyYXRlX2Zyb21fZnJlZWxpc3Qoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdm9pZCAqYml0bWFwLAorCQkJCQkJZXh0NF9ncm91cF90IGdyb3VwKTsKK3N0YXRpYyBpbnQgZXh0NF9tYl9pbml0X3Blcl9kZXZfcHJvYyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKTsKK3N0YXRpYyBpbnQgZXh0NF9tYl9kZXN0cm95X3Blcl9kZXZfcHJvYyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKTsKK3N0YXRpYyB2b2lkIHJlbGVhc2VfYmxvY2tzX29uX2NvbW1pdChqb3VybmFsX3QgKmpvdXJuYWwsIHRyYW5zYWN0aW9uX3QgKnR4bik7CisKKwogCiBzdGF0aWMgaW5saW5lIHZvaWQgKm1iX2NvcnJlY3RfYWRkcl9hbmRfYml0KGludCAqYml0LCB2b2lkICphZGRyKQogewpAQCAtNDQ1LDkgKzQ1Nyw5IEBACiAJCQlibG9ja25yICs9IGZpcnN0ICsgaTsKIAkJCWJsb2NrbnIgKz0KIAkJCSAgICBsZTMyX3RvX2NwdShFWFQ0X1NCKHNiKS0+c19lcy0+c19maXJzdF9kYXRhX2Jsb2NrKTsKLQotCQkJZXh0NF9lcnJvcihzYiwgX19mdW5jX18sICJkb3VibGUtZnJlZSBvZiBpbm9kZSIKLQkJCQkgICAiICVsdSdzIGJsb2NrICVsbHUoYml0ICV1IGluIGdyb3VwICVsdSlcbiIsCisJCQlleHQ0X2dycF9sb2NrZWRfZXJyb3Ioc2IsIGU0Yi0+YmRfZ3JvdXAsCisJCQkJICAgX19mdW5jX18sICJkb3VibGUtZnJlZSBvZiBpbm9kZSIKKwkJCQkgICAiICVsdSdzIGJsb2NrICVsbHUoYml0ICV1IGluIGdyb3VwICV1KSIsCiAJCQkJICAgaW5vZGUgPyBpbm9kZS0+aV9pbm8gOiAwLCBibG9ja25yLAogCQkJCSAgIGZpcnN0ICsgaSwgZTRiLT5iZF9ncm91cCk7CiAJCX0KQEAgLTQ3Nyw3ICs0ODksNyBAQAogCQliMiA9ICh1bnNpZ25lZCBjaGFyICopIGJpdG1hcDsKIAkJZm9yIChpID0gMDsgaSA8IGU0Yi0+YmRfc2ItPnNfYmxvY2tzaXplOyBpKyspIHsKIAkJCWlmIChiMVtpXSAhPSBiMltpXSkgewotCQkJCXByaW50ayhLRVJOX0VSUiAiY29ycnVwdGlvbiBpbiBncm91cCAlbHUgIgorCQkJCXByaW50ayhLRVJOX0VSUiAiY29ycnVwdGlvbiBpbiBncm91cCAldSAiCiAJCQkJICAgICAgICJhdCBieXRlICV1KCV1KTogJXggaW4gY29weSAhPSAleCAiCiAJCQkJICAgICAgICJvbiBkaXNrL3ByZWFsbG9jXG4iLAogCQkJCSAgICAgICBlNGItPmJkX2dyb3VwLCBpLCBpICogOCwgYjFbaV0sIGIyW2ldKTsKQEAgLTY5MCw4ICs3MDIsOCBAQAogCWdycC0+YmJfZnJhZ21lbnRzID0gZnJhZ21lbnRzOwogCiAJaWYgKGZyZWUgIT0gZ3JwLT5iYl9mcmVlKSB7Ci0JCWV4dDRfZXJyb3Ioc2IsIF9fZnVuY19fLAotCQkJIkVYVDQtZnM6IGdyb3VwICVsdTogJXUgYmxvY2tzIGluIGJpdG1hcCwgJXUgaW4gZ2RcbiIsCisJCWV4dDRfZ3JwX2xvY2tlZF9lcnJvcihzYiwgZ3JvdXAsICBfX2Z1bmNfXywKKwkJCSJFWFQ0LWZzOiBncm91cCAldTogJXUgYmxvY2tzIGluIGJpdG1hcCwgJXUgaW4gZ2QiLAogCQkJZ3JvdXAsIGZyZWUsIGdycC0+YmJfZnJlZSk7CiAJCS8qCiAJCSAqIElmIHdlIGludGVudCB0byBjb250aW51ZSwgd2UgY29uc2lkZXIgZ3JvdXAgZGVzY3JpdG9yCkBAIC03MTYsNyArNzI4LDcgQEAKICAqIHN0b3JlZCBpbiB0aGUgaW5vZGUgYXMKICAqCiAgKiB7ICAgICAgICAgICAgICAgICAgICAgICAgcGFnZSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAqIFsgZ3JvdXAgMCBidWRkeV1bIGdyb3VwIDAgYml0bWFwXSBbZ3JvdXAgMV1bIGdyb3VwIDFdLi4uCisgKiBbIGdyb3VwIDAgYml0bWFwXVsgZ3JvdXAgMCBidWRkeV0gW2dyb3VwIDFdWyBncm91cCAxXS4uLgogICoKICAqCiAgKiBvbmUgYmxvY2sgZWFjaCBmb3IgYml0bWFwIGFuZCBidWRkeSBpbmZvcm1hdGlvbi4KQEAgLTc4MiwyNSArNzk0LDQ1IEBACiAJCWlmIChiaFtpXSA9PSBOVUxMKQogCQkJZ290byBvdXQ7CiAKLQkJaWYgKGJ1ZmZlcl91cHRvZGF0ZShiaFtpXSkgJiYKLQkJICAgICEoZGVzYy0+YmdfZmxhZ3MgJiBjcHVfdG9fbGUxNihFWFQ0X0JHX0JMT0NLX1VOSU5JVCkpKQorCQlpZiAoYml0bWFwX3VwdG9kYXRlKGJoW2ldKSkKIAkJCWNvbnRpbnVlOwogCiAJCWxvY2tfYnVmZmVyKGJoW2ldKTsKKwkJaWYgKGJpdG1hcF91cHRvZGF0ZShiaFtpXSkpIHsKKwkJCXVubG9ja19idWZmZXIoYmhbaV0pOworCQkJY29udGludWU7CisJCX0KIAkJc3Bpbl9sb2NrKHNiX2JnbF9sb2NrKEVYVDRfU0Ioc2IpLCBmaXJzdF9ncm91cCArIGkpKTsKIAkJaWYgKGRlc2MtPmJnX2ZsYWdzICYgY3B1X3RvX2xlMTYoRVhUNF9CR19CTE9DS19VTklOSVQpKSB7CiAJCQlleHQ0X2luaXRfYmxvY2tfYml0bWFwKHNiLCBiaFtpXSwKIAkJCQkJCWZpcnN0X2dyb3VwICsgaSwgZGVzYyk7CisJCQlzZXRfYml0bWFwX3VwdG9kYXRlKGJoW2ldKTsKIAkJCXNldF9idWZmZXJfdXB0b2RhdGUoYmhbaV0pOwotCQkJdW5sb2NrX2J1ZmZlcihiaFtpXSk7CiAJCQlzcGluX3VubG9jayhzYl9iZ2xfbG9jayhFWFQ0X1NCKHNiKSwgZmlyc3RfZ3JvdXAgKyBpKSk7CisJCQl1bmxvY2tfYnVmZmVyKGJoW2ldKTsKIAkJCWNvbnRpbnVlOwogCQl9CiAJCXNwaW5fdW5sb2NrKHNiX2JnbF9sb2NrKEVYVDRfU0Ioc2IpLCBmaXJzdF9ncm91cCArIGkpKTsKKwkJaWYgKGJ1ZmZlcl91cHRvZGF0ZShiaFtpXSkpIHsKKwkJCS8qCisJCQkgKiBpZiBub3QgdW5pbml0IGlmIGJoIGlzIHVwdG9kYXRlLAorCQkJICogYml0bWFwIGlzIGFsc28gdXB0b2RhdGUKKwkJCSAqLworCQkJc2V0X2JpdG1hcF91cHRvZGF0ZShiaFtpXSk7CisJCQl1bmxvY2tfYnVmZmVyKGJoW2ldKTsKKwkJCWNvbnRpbnVlOworCQl9CiAJCWdldF9iaChiaFtpXSk7CisJCS8qCisJCSAqIHN1Ym1pdCB0aGUgYnVmZmVyX2hlYWQgZm9yIHJlYWQuIFdlIGNhbgorCQkgKiBzYWZlbHkgbWFyayB0aGUgYml0bWFwIGFzIHVwdG9kYXRlIG5vdy4KKwkJICogV2UgZG8gaXQgaGVyZSBzbyB0aGUgYml0bWFwIHVwdG9kYXRlIGJpdAorCQkgKiBnZXQgc2V0IHdpdGggYnVmZmVyIGxvY2sgaGVsZC4KKwkJICovCisJCXNldF9iaXRtYXBfdXB0b2RhdGUoYmhbaV0pOwogCQliaFtpXS0+Yl9lbmRfaW8gPSBlbmRfYnVmZmVyX3JlYWRfc3luYzsKIAkJc3VibWl0X2JoKFJFQUQsIGJoW2ldKTsKLQkJbWJfZGVidWcoInJlYWQgYml0bWFwIGZvciBncm91cCAlbHVcbiIsIGZpcnN0X2dyb3VwICsgaSk7CisJCW1iX2RlYnVnKCJyZWFkIGJpdG1hcCBmb3IgZ3JvdXAgJXVcbiIsIGZpcnN0X2dyb3VwICsgaSk7CiAJfQogCiAJLyogd2FpdCBmb3IgSS9PIGNvbXBsZXRpb24gKi8KQEAgLTgxNCw2ICs4NDYsOCBAQAogCiAJZXJyID0gMDsKIAlmaXJzdF9ibG9jayA9IHBhZ2UtPmluZGV4ICogYmxvY2tzX3Blcl9wYWdlOworCS8qIGluaXQgdGhlIHBhZ2UgICovCisJbWVtc2V0KHBhZ2VfYWRkcmVzcyhwYWdlKSwgMHhmZiwgUEFHRV9DQUNIRV9TSVpFKTsKIAlmb3IgKGkgPSAwOyBpIDwgYmxvY2tzX3Blcl9wYWdlOyBpKyspIHsKIAkJaW50IGdyb3VwOwogCQlzdHJ1Y3QgZXh0NF9ncm91cF9pbmZvICpncmluZm87CkBAIC04NDAsNyArODc0LDYgQEAKIAkJCUJVR19PTihpbmNvcmUgPT0gTlVMTCk7CiAJCQltYl9kZWJ1ZygicHV0IGJ1ZGR5IGZvciBncm91cCAldSBpbiBwYWdlICVsdS8leFxuIiwKIAkJCQlncm91cCwgcGFnZS0+aW5kZXgsIGkgKiBibG9ja3NpemUpOwotCQkJbWVtc2V0KGRhdGEsIDB4ZmYsIGJsb2Nrc2l6ZSk7CiAJCQlncmluZm8gPSBleHQ0X2dldF9ncm91cF9pbmZvKHNiLCBncm91cCk7CiAJCQlncmluZm8tPmJiX2ZyYWdtZW50cyA9IDA7CiAJCQltZW1zZXQoZ3JpbmZvLT5iYl9jb3VudGVycywgMCwKQEAgLTg0OCw3ICs4ODEsOSBAQAogCQkJLyoKIAkJCSAqIGluY29yZSBnb3Qgc2V0IHRvIHRoZSBncm91cCBibG9jayBiaXRtYXAgYmVsb3cKIAkJCSAqLworCQkJZXh0NF9sb2NrX2dyb3VwKHNiLCBncm91cCk7CiAJCQlleHQ0X21iX2dlbmVyYXRlX2J1ZGR5KHNiLCBkYXRhLCBpbmNvcmUsIGdyb3VwKTsKKwkJCWV4dDRfdW5sb2NrX2dyb3VwKHNiLCBncm91cCk7CiAJCQlpbmNvcmUgPSBOVUxMOwogCQl9IGVsc2UgewogCQkJLyogdGhpcyBpcyBibG9jayBvZiBiaXRtYXAgKi8KQEAgLTg2Miw2ICs4OTcsNyBAQAogCiAJCQkvKiBtYXJrIGFsbCBwcmVhbGxvY2F0ZWQgYmxrcyB1c2VkIGluIGluLWNvcmUgYml0bWFwICovCiAJCQlleHQ0X21iX2dlbmVyYXRlX2Zyb21fcGEoc2IsIGRhdGEsIGdyb3VwKTsKKwkJCWV4dDRfbWJfZ2VuZXJhdGVfZnJvbV9mcmVlbGlzdChzYiwgZGF0YSwgZ3JvdXApOwogCQkJZXh0NF91bmxvY2tfZ3JvdXAoc2IsIGdyb3VwKTsKIAogCQkJLyogc2V0IGluY29yZSBzbyB0aGF0IHRoZSBidWRkeSBpbmZvcm1hdGlvbiBjYW4gYmUKQEAgLTg4NiwxOCArOTIyLDIwIEBACiBleHQ0X21iX2xvYWRfYnVkZHkoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgZXh0NF9ncm91cF90IGdyb3VwLAogCQkJCQlzdHJ1Y3QgZXh0NF9idWRkeSAqZTRiKQogewotCXN0cnVjdCBleHQ0X3NiX2luZm8gKnNiaSA9IEVYVDRfU0Ioc2IpOwotCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBzYmktPnNfYnVkZHlfY2FjaGU7CiAJaW50IGJsb2Nrc19wZXJfcGFnZTsKIAlpbnQgYmxvY2s7CiAJaW50IHBudW07CiAJaW50IHBvZmY7CiAJc3RydWN0IHBhZ2UgKnBhZ2U7CiAJaW50IHJldDsKKwlzdHJ1Y3QgZXh0NF9ncm91cF9pbmZvICpncnA7CisJc3RydWN0IGV4dDRfc2JfaW5mbyAqc2JpID0gRVhUNF9TQihzYik7CisJc3RydWN0IGlub2RlICppbm9kZSA9IHNiaS0+c19idWRkeV9jYWNoZTsKIAotCW1iX2RlYnVnKCJsb2FkIGdyb3VwICVsdVxuIiwgZ3JvdXApOworCW1iX2RlYnVnKCJsb2FkIGdyb3VwICV1XG4iLCBncm91cCk7CiAKIAlibG9ja3NfcGVyX3BhZ2UgPSBQQUdFX0NBQ0hFX1NJWkUgLyBzYi0+c19ibG9ja3NpemU7CisJZ3JwID0gZXh0NF9nZXRfZ3JvdXBfaW5mbyhzYiwgZ3JvdXApOwogCiAJZTRiLT5iZF9ibGtiaXRzID0gc2ItPnNfYmxvY2tzaXplX2JpdHM7CiAJZTRiLT5iZF9pbmZvID0gZXh0NF9nZXRfZ3JvdXBfaW5mbyhzYiwgZ3JvdXApOwpAQCAtOTA1LDYgKzk0MywxNSBAQAogCWU0Yi0+YmRfZ3JvdXAgPSBncm91cDsKIAllNGItPmJkX2J1ZGR5X3BhZ2UgPSBOVUxMOwogCWU0Yi0+YmRfYml0bWFwX3BhZ2UgPSBOVUxMOworCWU0Yi0+YWxsb2Nfc2VtcCA9ICZncnAtPmFsbG9jX3NlbTsKKworCS8qIFRha2UgdGhlIHJlYWQgbG9jayBvbiB0aGUgZ3JvdXAgYWxsb2MKKwkgKiBzZW0uIFRoaXMgd291bGQgbWFrZSBzdXJlIGEgcGFyYWxsZWwKKwkgKiBleHQ0X21iX2luaXRfZ3JvdXAgaGFwcGVuaW5nIG9uIG90aGVyCisJICogZ3JvdXBzIG1hcHBlZCBieSB0aGUgcGFnZSBpcyBibG9ja2VkCisJICogdGlsbCB3ZSBhcmUgZG9uZSB3aXRoIGFsbG9jYXRpb24KKwkgKi8KKwlkb3duX3JlYWQoZTRiLT5hbGxvY19zZW1wKTsKIAogCS8qCiAJICogdGhlIGJ1ZGR5IGNhY2hlIGlub2RlIHN0b3JlcyB0aGUgYmxvY2sgYml0bWFwCkBAIC05MjAsNiArOTY3LDE0IEBACiAJcGFnZSA9IGZpbmRfZ2V0X3BhZ2UoaW5vZGUtPmlfbWFwcGluZywgcG51bSk7CiAJaWYgKHBhZ2UgPT0gTlVMTCB8fCAhUGFnZVVwdG9kYXRlKHBhZ2UpKSB7CiAJCWlmIChwYWdlKQorCQkJLyoKKwkJCSAqIGRyb3AgdGhlIHBhZ2UgcmVmZXJlbmNlIGFuZCB0cnkKKwkJCSAqIHRvIGdldCB0aGUgcGFnZSB3aXRoIGxvY2suIElmIHdlCisJCQkgKiBhcmUgbm90IHVwdG9kYXRlIHRoYXQgaW1wbGllcworCQkJICogc29tZWJvZHkganVzdCBjcmVhdGVkIHRoZSBwYWdlIGJ1dAorCQkJICogaXMgeWV0IHRvIGluaXRpYWxpemUgdGhlIHNhbWUuIFNvCisJCQkgKiB3YWl0IGZvciBpdCB0byBpbml0aWFsaXplLgorCQkJICovCiAJCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CiAJCXBhZ2UgPSBmaW5kX29yX2NyZWF0ZV9wYWdlKGlub2RlLT5pX21hcHBpbmcsIHBudW0sIEdGUF9OT0ZTKTsKIAkJaWYgKHBhZ2UpIHsKQEAgLTk4NSw2ICsxMDQwLDkgQEAKIAkJcGFnZV9jYWNoZV9yZWxlYXNlKGU0Yi0+YmRfYnVkZHlfcGFnZSk7CiAJZTRiLT5iZF9idWRkeSA9IE5VTEw7CiAJZTRiLT5iZF9iaXRtYXAgPSBOVUxMOworCisJLyogRG9uZSB3aXRoIHRoZSBidWRkeSBjYWNoZSAqLworCXVwX3JlYWQoZTRiLT5hbGxvY19zZW1wKTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC05OTQsNiArMTA1Miw5IEBACiAJCXBhZ2VfY2FjaGVfcmVsZWFzZShlNGItPmJkX2JpdG1hcF9wYWdlKTsKIAlpZiAoZTRiLT5iZF9idWRkeV9wYWdlKQogCQlwYWdlX2NhY2hlX3JlbGVhc2UoZTRiLT5iZF9idWRkeV9wYWdlKTsKKwkvKiBEb25lIHdpdGggdGhlIGJ1ZGR5IGNhY2hlICovCisJaWYgKGU0Yi0+YWxsb2Nfc2VtcCkKKwkJdXBfcmVhZChlNGItPmFsbG9jX3NlbXApOwogfQogCiAKQEAgLTEwMzEsNyArMTA5MiwxMCBAQAogCQkJY3VyICs9IDMyOwogCQkJY29udGludWU7CiAJCX0KLQkJbWJfY2xlYXJfYml0X2F0b21pYyhsb2NrLCBjdXIsIGJtKTsKKwkJaWYgKGxvY2spCisJCQltYl9jbGVhcl9iaXRfYXRvbWljKGxvY2ssIGN1ciwgYm0pOworCQllbHNlCisJCQltYl9jbGVhcl9iaXQoY3VyLCBibSk7CiAJCWN1cisrOwogCX0KIH0KQEAgLTEwNDksNyArMTExMywxMCBAQAogCQkJY3VyICs9IDMyOwogCQkJY29udGludWU7CiAJCX0KLQkJbWJfc2V0X2JpdF9hdG9taWMobG9jaywgY3VyLCBibSk7CisJCWlmIChsb2NrKQorCQkJbWJfc2V0X2JpdF9hdG9taWMobG9jaywgY3VyLCBibSk7CisJCWVsc2UKKwkJCW1iX3NldF9iaXQoY3VyLCBibSk7CiAJCWN1cisrOwogCX0KIH0KQEAgLTEwOTQsMTIgKzExNjEsMTEgQEAKIAkJCWJsb2NrbnIgKz0gYmxvY2s7CiAJCQlibG9ja25yICs9CiAJCQkgICAgbGUzMl90b19jcHUoRVhUNF9TQihzYiktPnNfZXMtPnNfZmlyc3RfZGF0YV9ibG9jayk7Ci0JCQlleHQ0X3VubG9ja19ncm91cChzYiwgZTRiLT5iZF9ncm91cCk7Ci0JCQlleHQ0X2Vycm9yKHNiLCBfX2Z1bmNfXywgImRvdWJsZS1mcmVlIG9mIGlub2RlIgotCQkJCSAgICIgJWx1J3MgYmxvY2sgJWxsdShiaXQgJXUgaW4gZ3JvdXAgJWx1KVxuIiwKKwkJCWV4dDRfZ3JwX2xvY2tlZF9lcnJvcihzYiwgZTRiLT5iZF9ncm91cCwKKwkJCQkgICBfX2Z1bmNfXywgImRvdWJsZS1mcmVlIG9mIGlub2RlIgorCQkJCSAgICIgJWx1J3MgYmxvY2sgJWxsdShiaXQgJXUgaW4gZ3JvdXAgJXUpIiwKIAkJCQkgICBpbm9kZSA/IGlub2RlLT5pX2lubyA6IDAsIGJsb2NrbnIsIGJsb2NrLAogCQkJCSAgIGU0Yi0+YmRfZ3JvdXApOwotCQkJZXh0NF9sb2NrX2dyb3VwKHNiLCBlNGItPmJkX2dyb3VwKTsKIAkJfQogCQltYl9jbGVhcl9iaXQoYmxvY2ssIEVYVDRfTUJfQklUTUFQKGU0YikpOwogCQllNGItPmJkX2luZm8tPmJiX2NvdW50ZXJzW29yZGVyXSsrOwpAQCAtMTI5NiwxMyArMTM2MiwyMCBAQAogCWFjLT5hY190YWlsID0gcmV0ICYgMHhmZmZmOwogCWFjLT5hY19idWRkeSA9IHJldCA+PiAxNjsKIAotCS8qIFhYWFhYWFg6IFNVQ0ggQSBIT1JSSUJMRSAqKkNLICovCi0JLypGSVhNRSEhIFdoeSA/ICovCisJLyoKKwkgKiB0YWtlIHRoZSBwYWdlIHJlZmVyZW5jZS4gV2Ugd2FudCB0aGUgcGFnZSB0byBiZSBwaW5uZWQKKwkgKiBzbyB0aGF0IHdlIGRvbid0IGdldCBhIGV4dDRfbWJfaW5pdF9jYWNoZV9jYWxsIGZvciB0aGlzCisJICogZ3JvdXAgdW50aWwgd2UgdXBkYXRlIHRoZSBiaXRtYXAuIFRoYXQgd291bGQgbWVhbiB3ZQorCSAqIGRvdWJsZSBhbGxvY2F0ZSBibG9ja3MuIFRoZSByZWZlcmVuY2UgaXMgZHJvcHBlZAorCSAqIGluIGV4dDRfbWJfcmVsZWFzZV9jb250ZXh0CisJICovCiAJYWMtPmFjX2JpdG1hcF9wYWdlID0gZTRiLT5iZF9iaXRtYXBfcGFnZTsKIAlnZXRfcGFnZShhYy0+YWNfYml0bWFwX3BhZ2UpOwogCWFjLT5hY19idWRkeV9wYWdlID0gZTRiLT5iZF9idWRkeV9wYWdlOwogCWdldF9wYWdlKGFjLT5hY19idWRkeV9wYWdlKTsKLQorCS8qIG9uIGFsbG9jYXRpb24gd2UgdXNlIGFjIHRvIHRyYWNrIHRoZSBoZWxkIHNlbWFwaG9yZSAqLworCWFjLT5hbGxvY19zZW1wID0gIGU0Yi0+YWxsb2Nfc2VtcDsKKwllNGItPmFsbG9jX3NlbXAgPSBOVUxMOwogCS8qIHN0b3JlIGxhc3QgYWxsb2NhdGVkIGZvciBzdWJzZXF1ZW50IHN0cmVhbSBhbGxvY2F0aW9uICovCiAJaWYgKChhYy0+YWNfZmxhZ3MgJiBFWFQ0X01CX0hJTlRfREFUQSkpIHsKIAkJc3Bpbl9sb2NrKCZzYmktPnNfbWRfbG9jayk7CkBAIC0xMzI2LDYgKzEzOTksOCBAQAogCXN0cnVjdCBleHQ0X2ZyZWVfZXh0ZW50IGV4OwogCWludCBtYXg7CiAKKwlpZiAoYWMtPmFjX3N0YXR1cyA9PSBBQ19TVEFUVVNfRk9VTkQpCisJCXJldHVybjsKIAkvKgogCSAqIFdlIGRvbid0IHdhbnQgdG8gc2NhbiBmb3IgYSB3aG9sZSB5ZWFyCiAJICovCkBAIC0xNTc1LDggKzE2NTAsOSBAQAogCQkJICogZnJlZSBibG9ja3MgZXZlbiB0aG91Z2ggZ3JvdXAgaW5mbyBzYXlzIHdlCiAJCQkgKiB3ZSBoYXZlIGZyZWUgYmxvY2tzCiAJCQkgKi8KLQkJCWV4dDRfZXJyb3Ioc2IsIF9fZnVuY19fLCAiJWQgZnJlZSBibG9ja3MgYXMgcGVyICIKLQkJCQkJImdyb3VwIGluZm8uIEJ1dCBiaXRtYXAgc2F5cyAwXG4iLAorCQkJZXh0NF9ncnBfbG9ja2VkX2Vycm9yKHNiLCBlNGItPmJkX2dyb3VwLAorCQkJCQlfX2Z1bmNfXywgIiVkIGZyZWUgYmxvY2tzIGFzIHBlciAiCisJCQkJCSJncm91cCBpbmZvLiBCdXQgYml0bWFwIHNheXMgMCIsCiAJCQkJCWZyZWUpOwogCQkJYnJlYWs7CiAJCX0KQEAgLTE1ODQsOCArMTY2MCw5IEBACiAJCW1iX2ZpbmRfZXh0ZW50KGU0YiwgMCwgaSwgYWMtPmFjX2dfZXguZmVfbGVuLCAmZXgpOwogCQlCVUdfT04oZXguZmVfbGVuIDw9IDApOwogCQlpZiAoZnJlZSA8IGV4LmZlX2xlbikgewotCQkJZXh0NF9lcnJvcihzYiwgX19mdW5jX18sICIlZCBmcmVlIGJsb2NrcyBhcyBwZXIgIgotCQkJCQkiZ3JvdXAgaW5mby4gQnV0IGdvdCAlZCBibG9ja3NcbiIsCisJCQlleHQ0X2dycF9sb2NrZWRfZXJyb3Ioc2IsIGU0Yi0+YmRfZ3JvdXAsCisJCQkJCV9fZnVuY19fLCAiJWQgZnJlZSBibG9ja3MgYXMgcGVyICIKKwkJCQkJImdyb3VwIGluZm8uIEJ1dCBnb3QgJWQgYmxvY2tzIiwKIAkJCQkJZnJlZSwgZXguZmVfbGVuKTsKIAkJCS8qCiAJCQkgKiBUaGUgbnVtYmVyIG9mIGZyZWUgYmxvY2tzIGRpZmZlcnMuIFRoaXMgbW9zdGx5CkBAIC0xNjkyLDYgKzE3NjksMTczIEBACiAJcmV0dXJuIDA7CiB9CiAKKy8qCisgKiBsb2NrIHRoZSBncm91cF9pbmZvIGFsbG9jX3NlbSBvZiBhbGwgdGhlIGdyb3VwcworICogYmVsb25naW5nIHRvIHRoZSBzYW1lIGJ1ZGR5IGNhY2hlIHBhZ2UuIFRoaXMKKyAqIG1ha2Ugc3VyZSBvdGhlciBwYXJhbGxlbCBvcGVyYXRpb24gb24gdGhlIGJ1ZGR5CisgKiBjYWNoZSBkb2Vzbid0IGhhcHBlbiAgd2hpbGQgaG9sZGluZyB0aGUgYnVkZHkgY2FjaGUKKyAqIGxvY2sKKyAqLworaW50IGV4dDRfbWJfZ2V0X2J1ZGR5X2NhY2hlX2xvY2soc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgZXh0NF9ncm91cF90IGdyb3VwKQoreworCWludCBpOworCWludCBibG9jaywgcG51bTsKKwlpbnQgYmxvY2tzX3Blcl9wYWdlOworCWludCBncm91cHNfcGVyX3BhZ2U7CisJZXh0NF9ncm91cF90IGZpcnN0X2dyb3VwOworCXN0cnVjdCBleHQ0X2dyb3VwX2luZm8gKmdycDsKKworCWJsb2Nrc19wZXJfcGFnZSA9IFBBR0VfQ0FDSEVfU0laRSAvIHNiLT5zX2Jsb2Nrc2l6ZTsKKwkvKgorCSAqIHRoZSBidWRkeSBjYWNoZSBpbm9kZSBzdG9yZXMgdGhlIGJsb2NrIGJpdG1hcAorCSAqIGFuZCBidWRkeSBpbmZvcm1hdGlvbiBpbiBjb25zZWN1dGl2ZSBibG9ja3MuCisJICogU28gZm9yIGVhY2ggZ3JvdXAgd2UgbmVlZCB0d28gYmxvY2tzLgorCSAqLworCWJsb2NrID0gZ3JvdXAgKiAyOworCXBudW0gPSBibG9jayAvIGJsb2Nrc19wZXJfcGFnZTsKKwlmaXJzdF9ncm91cCA9IHBudW0gKiBibG9ja3NfcGVyX3BhZ2UgLyAyOworCisJZ3JvdXBzX3Blcl9wYWdlID0gYmxvY2tzX3Blcl9wYWdlID4+IDE7CisJaWYgKGdyb3Vwc19wZXJfcGFnZSA9PSAwKQorCQlncm91cHNfcGVyX3BhZ2UgPSAxOworCS8qIHJlYWQgYWxsIGdyb3VwcyB0aGUgcGFnZSBjb3ZlcnMgaW50byB0aGUgY2FjaGUgKi8KKwlmb3IgKGkgPSAwOyBpIDwgZ3JvdXBzX3Blcl9wYWdlOyBpKyspIHsKKworCQlpZiAoKGZpcnN0X2dyb3VwICsgaSkgPj0gRVhUNF9TQihzYiktPnNfZ3JvdXBzX2NvdW50KQorCQkJYnJlYWs7CisJCWdycCA9IGV4dDRfZ2V0X2dyb3VwX2luZm8oc2IsIGZpcnN0X2dyb3VwICsgaSk7CisJCS8qIHRha2UgYWxsIGdyb3VwcyB3cml0ZSBhbGxvY2F0aW9uCisJCSAqIHNlbWFwaG9yZS4gVGhpcyBtYWtlIHN1cmUgdGhlcmUgaXMKKwkJICogbm8gYmxvY2sgYWxsb2NhdGlvbiBnb2luZyBvbiBpbiBhbnkKKwkJICogb2YgdGhhdCBncm91cHMKKwkJICovCisJCWRvd25fd3JpdGVfbmVzdGVkKCZncnAtPmFsbG9jX3NlbSwgaSk7CisJfQorCXJldHVybiBpOworfQorCit2b2lkIGV4dDRfbWJfcHV0X2J1ZGR5X2NhY2hlX2xvY2soc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJCQkJZXh0NF9ncm91cF90IGdyb3VwLCBpbnQgbG9ja2VkX2dyb3VwKQoreworCWludCBpOworCWludCBibG9jaywgcG51bTsKKwlpbnQgYmxvY2tzX3Blcl9wYWdlOworCWV4dDRfZ3JvdXBfdCBmaXJzdF9ncm91cDsKKwlzdHJ1Y3QgZXh0NF9ncm91cF9pbmZvICpncnA7CisKKwlibG9ja3NfcGVyX3BhZ2UgPSBQQUdFX0NBQ0hFX1NJWkUgLyBzYi0+c19ibG9ja3NpemU7CisJLyoKKwkgKiB0aGUgYnVkZHkgY2FjaGUgaW5vZGUgc3RvcmVzIHRoZSBibG9jayBiaXRtYXAKKwkgKiBhbmQgYnVkZHkgaW5mb3JtYXRpb24gaW4gY29uc2VjdXRpdmUgYmxvY2tzLgorCSAqIFNvIGZvciBlYWNoIGdyb3VwIHdlIG5lZWQgdHdvIGJsb2Nrcy4KKwkgKi8KKwlibG9jayA9IGdyb3VwICogMjsKKwlwbnVtID0gYmxvY2sgLyBibG9ja3NfcGVyX3BhZ2U7CisJZmlyc3RfZ3JvdXAgPSBwbnVtICogYmxvY2tzX3Blcl9wYWdlIC8gMjsKKwkvKiByZWxlYXNlIGxvY2tzIG9uIGFsbCB0aGUgZ3JvdXBzICovCisJZm9yIChpID0gMDsgaSA8IGxvY2tlZF9ncm91cDsgaSsrKSB7CisKKwkJZ3JwID0gZXh0NF9nZXRfZ3JvdXBfaW5mbyhzYiwgZmlyc3RfZ3JvdXAgKyBpKTsKKwkJLyogdGFrZSBhbGwgZ3JvdXBzIHdyaXRlIGFsbG9jYXRpb24KKwkJICogc2VtYXBob3JlLiBUaGlzIG1ha2Ugc3VyZSB0aGVyZSBpcworCQkgKiBubyBibG9jayBhbGxvY2F0aW9uIGdvaW5nIG9uIGluIGFueQorCQkgKiBvZiB0aGF0IGdyb3VwcworCQkgKi8KKwkJdXBfd3JpdGUoJmdycC0+YWxsb2Nfc2VtKTsKKwl9CisKK30KKworc3RhdGljIGludCBleHQ0X21iX2luaXRfZ3JvdXAoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgZXh0NF9ncm91cF90IGdyb3VwKQoreworCisJaW50IHJldDsKKwl2b2lkICpiaXRtYXA7CisJaW50IGJsb2Nrc19wZXJfcGFnZTsKKwlpbnQgYmxvY2ssIHBudW0sIHBvZmY7CisJaW50IG51bV9ncnBfbG9ja2VkID0gMDsKKwlzdHJ1Y3QgZXh0NF9ncm91cF9pbmZvICp0aGlzX2dycDsKKwlzdHJ1Y3QgZXh0NF9zYl9pbmZvICpzYmkgPSBFWFQ0X1NCKHNiKTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gc2JpLT5zX2J1ZGR5X2NhY2hlOworCXN0cnVjdCBwYWdlICpwYWdlID0gTlVMTCwgKmJpdG1hcF9wYWdlID0gTlVMTDsKKworCW1iX2RlYnVnKCJpbml0IGdyb3VwICVsdVxuIiwgZ3JvdXApOworCWJsb2Nrc19wZXJfcGFnZSA9IFBBR0VfQ0FDSEVfU0laRSAvIHNiLT5zX2Jsb2Nrc2l6ZTsKKwl0aGlzX2dycCA9IGV4dDRfZ2V0X2dyb3VwX2luZm8oc2IsIGdyb3VwKTsKKwkvKgorCSAqIFRoaXMgZW5zdXJlcyB3ZSBkb24ndCBhZGQgZ3JvdXAKKwkgKiB0byB0aGlzIGJ1ZGR5IGNhY2hlIHZpYSByZXNpemUKKwkgKi8KKwludW1fZ3JwX2xvY2tlZCA9ICBleHQ0X21iX2dldF9idWRkeV9jYWNoZV9sb2NrKHNiLCBncm91cCk7CisJaWYgKCFFWFQ0X01CX0dSUF9ORUVEX0lOSVQodGhpc19ncnApKSB7CisJCS8qCisJCSAqIHNvbWVib2R5IGluaXRpYWxpemVkIHRoZSBncm91cAorCQkgKiByZXR1cm4gd2l0aG91dCBkb2luZyBhbnl0aGluZworCQkgKi8KKwkJcmV0ID0gMDsKKwkJZ290byBlcnI7CisJfQorCS8qCisJICogdGhlIGJ1ZGR5IGNhY2hlIGlub2RlIHN0b3JlcyB0aGUgYmxvY2sgYml0bWFwCisJICogYW5kIGJ1ZGR5IGluZm9ybWF0aW9uIGluIGNvbnNlY3V0aXZlIGJsb2Nrcy4KKwkgKiBTbyBmb3IgZWFjaCBncm91cCB3ZSBuZWVkIHR3byBibG9ja3MuCisJICovCisJYmxvY2sgPSBncm91cCAqIDI7CisJcG51bSA9IGJsb2NrIC8gYmxvY2tzX3Blcl9wYWdlOworCXBvZmYgPSBibG9jayAlIGJsb2Nrc19wZXJfcGFnZTsKKwlwYWdlID0gZmluZF9vcl9jcmVhdGVfcGFnZShpbm9kZS0+aV9tYXBwaW5nLCBwbnVtLCBHRlBfTk9GUyk7CisJaWYgKHBhZ2UpIHsKKwkJQlVHX09OKHBhZ2UtPm1hcHBpbmcgIT0gaW5vZGUtPmlfbWFwcGluZyk7CisJCXJldCA9IGV4dDRfbWJfaW5pdF9jYWNoZShwYWdlLCBOVUxMKTsKKwkJaWYgKHJldCkgeworCQkJdW5sb2NrX3BhZ2UocGFnZSk7CisJCQlnb3RvIGVycjsKKwkJfQorCQl1bmxvY2tfcGFnZShwYWdlKTsKKwl9CisJaWYgKHBhZ2UgPT0gTlVMTCB8fCAhUGFnZVVwdG9kYXRlKHBhZ2UpKSB7CisJCXJldCA9IC1FSU87CisJCWdvdG8gZXJyOworCX0KKwltYXJrX3BhZ2VfYWNjZXNzZWQocGFnZSk7CisJYml0bWFwX3BhZ2UgPSBwYWdlOworCWJpdG1hcCA9IHBhZ2VfYWRkcmVzcyhwYWdlKSArIChwb2ZmICogc2ItPnNfYmxvY2tzaXplKTsKKworCS8qIGluaXQgYnVkZHkgY2FjaGUgKi8KKwlibG9jaysrOworCXBudW0gPSBibG9jayAvIGJsb2Nrc19wZXJfcGFnZTsKKwlwb2ZmID0gYmxvY2sgJSBibG9ja3NfcGVyX3BhZ2U7CisJcGFnZSA9IGZpbmRfb3JfY3JlYXRlX3BhZ2UoaW5vZGUtPmlfbWFwcGluZywgcG51bSwgR0ZQX05PRlMpOworCWlmIChwYWdlID09IGJpdG1hcF9wYWdlKSB7CisJCS8qCisJCSAqIElmIGJvdGggdGhlIGJpdG1hcCBhbmQgYnVkZHkgYXJlIGluCisJCSAqIHRoZSBzYW1lIHBhZ2Ugd2UgZG9uJ3QgbmVlZCB0byBmb3JjZQorCQkgKiBpbml0IHRoZSBidWRkeQorCQkgKi8KKwkJdW5sb2NrX3BhZ2UocGFnZSk7CisJfSBlbHNlIGlmIChwYWdlKSB7CisJCUJVR19PTihwYWdlLT5tYXBwaW5nICE9IGlub2RlLT5pX21hcHBpbmcpOworCQlyZXQgPSBleHQ0X21iX2luaXRfY2FjaGUocGFnZSwgYml0bWFwKTsKKwkJaWYgKHJldCkgeworCQkJdW5sb2NrX3BhZ2UocGFnZSk7CisJCQlnb3RvIGVycjsKKwkJfQorCQl1bmxvY2tfcGFnZShwYWdlKTsKKwl9CisJaWYgKHBhZ2UgPT0gTlVMTCB8fCAhUGFnZVVwdG9kYXRlKHBhZ2UpKSB7CisJCXJldCA9IC1FSU87CisJCWdvdG8gZXJyOworCX0KKwltYXJrX3BhZ2VfYWNjZXNzZWQocGFnZSk7CitlcnI6CisJZXh0NF9tYl9wdXRfYnVkZHlfY2FjaGVfbG9jayhzYiwgZ3JvdXAsIG51bV9ncnBfbG9ja2VkKTsKKwlpZiAoYml0bWFwX3BhZ2UpCisJCXBhZ2VfY2FjaGVfcmVsZWFzZShiaXRtYXBfcGFnZSk7CisJaWYgKHBhZ2UpCisJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKKwlyZXR1cm4gcmV0OworfQorCiBzdGF0aWMgbm9pbmxpbmVfZm9yX3N0YWNrIGludAogZXh0NF9tYl9yZWd1bGFyX2FsbG9jYXRvcihzdHJ1Y3QgZXh0NF9hbGxvY2F0aW9uX2NvbnRleHQgKmFjKQogewpAQCAtMTc3NSw3ICsyMDE5LDcgQEAKIAkJCQlncm91cCA9IDA7CiAKIAkJCS8qIHF1aWNrIGNoZWNrIHRvIHNraXAgZW1wdHkgZ3JvdXBzICovCi0JCQlncnAgPSBleHQ0X2dldF9ncm91cF9pbmZvKGFjLT5hY19zYiwgZ3JvdXApOworCQkJZ3JwID0gZXh0NF9nZXRfZ3JvdXBfaW5mbyhzYiwgZ3JvdXApOwogCQkJaWYgKGdycC0+YmJfZnJlZSA9PSAwKQogCQkJCWNvbnRpbnVlOwogCkBAIC0xNzg4LDEwICsyMDMyLDkgQEAKIAkJCQkgKiB3ZSBuZWVkIGZ1bGwgZGF0YSBhYm91dCB0aGUgZ3JvdXAKIAkJCQkgKiB0byBtYWtlIGEgZ29vZCBzZWxlY3Rpb24KIAkJCQkgKi8KLQkJCQllcnIgPSBleHQ0X21iX2xvYWRfYnVkZHkoc2IsIGdyb3VwLCAmZTRiKTsKKwkJCQllcnIgPSBleHQ0X21iX2luaXRfZ3JvdXAoc2IsIGdyb3VwKTsKIAkJCQlpZiAoZXJyKQogCQkJCQlnb3RvIG91dDsKLQkJCQlleHQ0X21iX3JlbGVhc2VfZGVzYygmZTRiKTsKIAkJCX0KIAogCQkJLyoKQEAgLTE5MzIsMTMgKzIxNzUsMTMgQEAKIAlpZiAoaHMtPm9wID09IEVYVDRfTUJfSElTVE9SWV9BTExPQykgewogCQlmbXQgPSAiJS01dSAlLTh1ICUtMjNzICUtMjNzICUtMjNzICUtNXUgJS01dSAlLTJ1ICIKIAkJCSIlLTV1ICUtNXMgJS01dSAlLTZ1XG4iOwotCQlzcHJpbnRmKGJ1ZjIsICIlbHUvJWQvJXVAJXUiLCBocy0+cmVzdWx0LmZlX2dyb3VwLAorCQlzcHJpbnRmKGJ1ZjIsICIldS8lZC8ldUAldSIsIGhzLT5yZXN1bHQuZmVfZ3JvdXAsCiAJCQlocy0+cmVzdWx0LmZlX3N0YXJ0LCBocy0+cmVzdWx0LmZlX2xlbiwKIAkJCWhzLT5yZXN1bHQuZmVfbG9naWNhbCk7Ci0JCXNwcmludGYoYnVmLCAiJWx1LyVkLyV1QCV1IiwgaHMtPm9yaWcuZmVfZ3JvdXAsCisJCXNwcmludGYoYnVmLCAiJXUvJWQvJXVAJXUiLCBocy0+b3JpZy5mZV9ncm91cCwKIAkJCWhzLT5vcmlnLmZlX3N0YXJ0LCBocy0+b3JpZy5mZV9sZW4sCiAJCQlocy0+b3JpZy5mZV9sb2dpY2FsKTsKLQkJc3ByaW50ZihidWYzLCAiJWx1LyVkLyV1QCV1IiwgaHMtPmdvYWwuZmVfZ3JvdXAsCisJCXNwcmludGYoYnVmMywgIiV1LyVkLyV1QCV1IiwgaHMtPmdvYWwuZmVfZ3JvdXAsCiAJCQlocy0+Z29hbC5mZV9zdGFydCwgaHMtPmdvYWwuZmVfbGVuLAogCQkJaHMtPmdvYWwuZmVfbG9naWNhbCk7CiAJCXNlcV9wcmludGYoc2VxLCBmbXQsIGhzLT5waWQsIGhzLT5pbm8sIGJ1ZiwgYnVmMywgYnVmMiwKQEAgLTE5NDcsMjAgKzIxOTAsMjAgQEAKIAkJCQlocy0+YnVkZHkgPyAxIDw8IGhzLT5idWRkeSA6IDApOwogCX0gZWxzZSBpZiAoaHMtPm9wID09IEVYVDRfTUJfSElTVE9SWV9QUkVBTExPQykgewogCQlmbXQgPSAiJS01dSAlLTh1ICUtMjNzICUtMjNzICUtMjNzXG4iOwotCQlzcHJpbnRmKGJ1ZjIsICIlbHUvJWQvJXVAJXUiLCBocy0+cmVzdWx0LmZlX2dyb3VwLAorCQlzcHJpbnRmKGJ1ZjIsICIldS8lZC8ldUAldSIsIGhzLT5yZXN1bHQuZmVfZ3JvdXAsCiAJCQlocy0+cmVzdWx0LmZlX3N0YXJ0LCBocy0+cmVzdWx0LmZlX2xlbiwKIAkJCWhzLT5yZXN1bHQuZmVfbG9naWNhbCk7Ci0JCXNwcmludGYoYnVmLCAiJWx1LyVkLyV1QCV1IiwgaHMtPm9yaWcuZmVfZ3JvdXAsCisJCXNwcmludGYoYnVmLCAiJXUvJWQvJXVAJXUiLCBocy0+b3JpZy5mZV9ncm91cCwKIAkJCWhzLT5vcmlnLmZlX3N0YXJ0LCBocy0+b3JpZy5mZV9sZW4sCiAJCQlocy0+b3JpZy5mZV9sb2dpY2FsKTsKIAkJc2VxX3ByaW50ZihzZXEsIGZtdCwgaHMtPnBpZCwgaHMtPmlubywgYnVmLCAiIiwgYnVmMik7CiAJfSBlbHNlIGlmIChocy0+b3AgPT0gRVhUNF9NQl9ISVNUT1JZX0RJU0NBUkQpIHsKLQkJc3ByaW50ZihidWYyLCAiJWx1LyVkLyV1IiwgaHMtPnJlc3VsdC5mZV9ncm91cCwKKwkJc3ByaW50ZihidWYyLCAiJXUvJWQvJXUiLCBocy0+cmVzdWx0LmZlX2dyb3VwLAogCQkJaHMtPnJlc3VsdC5mZV9zdGFydCwgaHMtPnJlc3VsdC5mZV9sZW4pOwogCQlzZXFfcHJpbnRmKHNlcSwgIiUtNXUgJS04dSAlLTIzcyBkaXNjYXJkXG4iLAogCQkJCWhzLT5waWQsIGhzLT5pbm8sIGJ1ZjIpOwogCX0gZWxzZSBpZiAoaHMtPm9wID09IEVYVDRfTUJfSElTVE9SWV9GUkVFKSB7Ci0JCXNwcmludGYoYnVmMiwgIiVsdS8lZC8ldSIsIGhzLT5yZXN1bHQuZmVfZ3JvdXAsCisJCXNwcmludGYoYnVmMiwgIiV1LyVkLyV1IiwgaHMtPnJlc3VsdC5mZV9ncm91cCwKIAkJCWhzLT5yZXN1bHQuZmVfc3RhcnQsIGhzLT5yZXN1bHQuZmVfbGVuKTsKIAkJc2VxX3ByaW50ZihzZXEsICIlLTV1ICUtOHUgJS0yM3MgZnJlZVxuIiwKIAkJCQlocy0+cGlkLCBocy0+aW5vLCBidWYyKTsKQEAgLTIwNzMsNyArMjMxNiw3IEBACiAJCXJldHVybiBOVUxMOwogCiAJZ3JvdXAgPSAqcG9zICsgMTsKLQlyZXR1cm4gKHZvaWQgKikgZ3JvdXA7CisJcmV0dXJuICh2b2lkICopICgodW5zaWduZWQgbG9uZykgZ3JvdXApOwogfQogCiBzdGF0aWMgdm9pZCAqZXh0NF9tYl9zZXFfZ3JvdXBzX25leHQoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYsIGxvZmZfdCAqcG9zKQpAQCAtMjA4NiwxMyArMjMyOSwxMyBAQAogCWlmICgqcG9zIDwgMCB8fCAqcG9zID49IHNiaS0+c19ncm91cHNfY291bnQpCiAJCXJldHVybiBOVUxMOwogCWdyb3VwID0gKnBvcyArIDE7Ci0JcmV0dXJuICh2b2lkICopIGdyb3VwOzsKKwlyZXR1cm4gKHZvaWQgKikgKCh1bnNpZ25lZCBsb25nKSBncm91cCk7CiB9CiAKIHN0YXRpYyBpbnQgZXh0NF9tYl9zZXFfZ3JvdXBzX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCiB7CiAJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IHNlcS0+cHJpdmF0ZTsKLQlsb25nIGdyb3VwID0gKGxvbmcpIHY7CisJZXh0NF9ncm91cF90IGdyb3VwID0gKGV4dDRfZ3JvdXBfdCkgKCh1bnNpZ25lZCBsb25nKSB2KTsKIAlpbnQgaTsKIAlpbnQgZXJyOwogCXN0cnVjdCBleHQ0X2J1ZGR5IGU0YjsKQEAgLTIxMTQsNyArMjM1Nyw3IEBACiAJCXNpemVvZihzdHJ1Y3QgZXh0NF9ncm91cF9pbmZvKTsKIAllcnIgPSBleHQ0X21iX2xvYWRfYnVkZHkoc2IsIGdyb3VwLCAmZTRiKTsKIAlpZiAoZXJyKSB7Ci0JCXNlcV9wcmludGYoc2VxLCAiIyUtNWx1OiBJL08gZXJyb3JcbiIsIGdyb3VwKTsKKwkJc2VxX3ByaW50ZihzZXEsICIjJS01dTogSS9PIGVycm9yXG4iLCBncm91cCk7CiAJCXJldHVybiAwOwogCX0KIAlleHQ0X2xvY2tfZ3JvdXAoc2IsIGdyb3VwKTsKQEAgLTIxMjIsNyArMjM2NSw3IEBACiAJZXh0NF91bmxvY2tfZ3JvdXAoc2IsIGdyb3VwKTsKIAlleHQ0X21iX3JlbGVhc2VfZGVzYygmZTRiKTsKIAotCXNlcV9wcmludGYoc2VxLCAiIyUtNWx1OiAlLTV1ICUtNXUgJS01dSBbIiwgZ3JvdXAsIHNnLmluZm8uYmJfZnJlZSwKKwlzZXFfcHJpbnRmKHNlcSwgIiMlLTV1OiAlLTV1ICUtNXUgJS01dSBbIiwgZ3JvdXAsIHNnLmluZm8uYmJfZnJlZSwKIAkJCXNnLmluZm8uYmJfZnJhZ21lbnRzLCBzZy5pbmZvLmJiX2ZpcnN0X2ZyZWUpOwogCWZvciAoaSA9IDA7IGkgPD0gMTM7IGkrKykKIAkJc2VxX3ByaW50ZihzZXEsICIgJS01dSIsIGkgPD0gc2ItPnNfYmxvY2tzaXplX2JpdHMgKyAxID8KQEAgLTIyOTYsMTAgKzI1MzksMTEgQEAKIAkJCWV4dDRfZnJlZV9ibG9ja3NfYWZ0ZXJfaW5pdChzYiwgZ3JvdXAsIGRlc2MpOwogCX0gZWxzZSB7CiAJCW1ldGFfZ3JvdXBfaW5mb1tpXS0+YmJfZnJlZSA9Ci0JCQlsZTE2X3RvX2NwdShkZXNjLT5iZ19mcmVlX2Jsb2Nrc19jb3VudCk7CisJCQlleHQ0X2ZyZWVfYmxrc19jb3VudChzYiwgZGVzYyk7CiAJfQogCiAJSU5JVF9MSVNUX0hFQUQoJm1ldGFfZ3JvdXBfaW5mb1tpXS0+YmJfcHJlYWxsb2NfbGlzdCk7CisJaW5pdF9yd3NlbSgmbWV0YV9ncm91cF9pbmZvW2ldLT5hbGxvY19zZW0pOwogCW1ldGFfZ3JvdXBfaW5mb1tpXS0+YmJfZnJlZV9yb290LnJiX25vZGUgPSBOVUxMOzsKIAogI2lmZGVmIERPVUJMRV9DSEVDSwpAQCAtMjMyNyw1NCArMjU3MSw2IEBACiB9IC8qIGV4dDRfbWJfYWRkX2dyb3VwaW5mbyAqLwogCiAvKgotICogQWRkIGEgZ3JvdXAgdG8gdGhlIGV4aXN0aW5nIGdyb3Vwcy4KLSAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBmb3Igb25saW5lIHJlc2l6ZQotICovCi1pbnQgZXh0NF9tYl9hZGRfbW9yZV9ncm91cGluZm8oc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgZXh0NF9ncm91cF90IGdyb3VwLAotCQkJICAgICAgIHN0cnVjdCBleHQ0X2dyb3VwX2Rlc2MgKmRlc2MpCi17Ci0Jc3RydWN0IGV4dDRfc2JfaW5mbyAqc2JpID0gRVhUNF9TQihzYik7Ci0Jc3RydWN0IGlub2RlICppbm9kZSA9IHNiaS0+c19idWRkeV9jYWNoZTsKLQlpbnQgYmxvY2tzX3Blcl9wYWdlOwotCWludCBibG9jazsKLQlpbnQgcG51bTsKLQlzdHJ1Y3QgcGFnZSAqcGFnZTsKLQlpbnQgZXJyOwotCi0JLyogQWRkIGdyb3VwIGJhc2VkIG9uIGdyb3VwIGRlc2NyaXB0b3IqLwotCWVyciA9IGV4dDRfbWJfYWRkX2dyb3VwaW5mbyhzYiwgZ3JvdXAsIGRlc2MpOwotCWlmIChlcnIpCi0JCXJldHVybiBlcnI7Ci0KLQkvKgotCSAqIENhY2hlIHBhZ2VzIGNvbnRhaW5pbmcgZHluYW1pYyBtYl9hbGxvYyBkYXRhcyAoYnVkZHkgYW5kIGJpdG1hcAotCSAqIGRhdGFzKSBhcmUgc2V0IG5vdCB1cCB0byBkYXRlIHNvIHRoYXQgdGhleSB3aWxsIGJlIHJlLWluaXRpbGFpemVkCi0JICogZHVyaW5nIHRoZSBuZXh0IGNhbGwgdG8gZXh0NF9tYl9sb2FkX2J1ZGR5Ci0JICovCi0KLQkvKiBTZXQgYnVkZHkgcGFnZSBhcyBub3QgdXAgdG8gZGF0ZSAqLwotCWJsb2Nrc19wZXJfcGFnZSA9IFBBR0VfQ0FDSEVfU0laRSAvIHNiLT5zX2Jsb2Nrc2l6ZTsKLQlibG9jayA9IGdyb3VwICogMjsKLQlwbnVtID0gYmxvY2sgLyBibG9ja3NfcGVyX3BhZ2U7Ci0JcGFnZSA9IGZpbmRfZ2V0X3BhZ2UoaW5vZGUtPmlfbWFwcGluZywgcG51bSk7Ci0JaWYgKHBhZ2UgIT0gTlVMTCkgewotCQlDbGVhclBhZ2VVcHRvZGF0ZShwYWdlKTsKLQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOwotCX0KLQotCS8qIFNldCBiaXRtYXAgcGFnZSBhcyBub3QgdXAgdG8gZGF0ZSAqLwotCWJsb2NrKys7Ci0JcG51bSA9IGJsb2NrIC8gYmxvY2tzX3Blcl9wYWdlOwotCXBhZ2UgPSBmaW5kX2dldF9wYWdlKGlub2RlLT5pX21hcHBpbmcsIHBudW0pOwotCWlmIChwYWdlICE9IE5VTEwpIHsKLQkJQ2xlYXJQYWdlVXB0b2RhdGUocGFnZSk7Ci0JCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoKICAqIFVwZGF0ZSBhbiBleGlzdGluZyBncm91cC4KICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBmb3Igb25saW5lIHJlc2l6ZQogICovCkBAIC0yNDU3LDcgKzI2NTMsNyBAQAogCQlkZXNjID0gZXh0NF9nZXRfZ3JvdXBfZGVzYyhzYiwgaSwgTlVMTCk7CiAJCWlmIChkZXNjID09IE5VTEwpIHsKIAkJCXByaW50ayhLRVJOX0VSUgotCQkJCSJFWFQ0LWZzOiBjYW4ndCByZWFkIGRlc2NyaXB0b3IgJWx1XG4iLCBpKTsKKwkJCQkiRVhUNC1mczogY2FuJ3QgcmVhZCBkZXNjcmlwdG9yICV1XG4iLCBpKTsKIAkJCWdvdG8gZXJyX2ZyZWVidWRkeTsKIAkJfQogCQlpZiAoZXh0NF9tYl9hZGRfZ3JvdXBpbmZvKHNiLCBpLCBkZXNjKSAhPSAwKQpAQCAtMjQ5Myw2ICsyNjg5LDggQEAKIAlpZiAoc2JpLT5zX21iX29mZnNldHMgPT0gTlVMTCkgewogCQlyZXR1cm4gLUVOT01FTTsKIAl9CisKKwlpID0gKHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzICsgMikgKiBzaXplb2YodW5zaWduZWQgaW50KTsKIAlzYmktPnNfbWJfbWF4cyA9IGttYWxsb2MoaSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHNiaS0+c19tYl9tYXhzID09IE5VTEwpIHsKIAkJa2ZyZWUoc2JpLT5zX21iX21heHMpOwpAQCAtMjU1MSw3ICsyNzQ5LDggQEAKIAlleHQ0X21iX2luaXRfcGVyX2Rldl9wcm9jKHNiKTsKIAlleHQ0X21iX2hpc3RvcnlfaW5pdChzYik7CiAKLQlzYmktPnNfam91cm5hbC0+al9jb21taXRfY2FsbGJhY2sgPSByZWxlYXNlX2Jsb2Nrc19vbl9jb21taXQ7CisJaWYgKHNiaS0+c19qb3VybmFsKQorCQlzYmktPnNfam91cm5hbC0+al9jb21taXRfY2FsbGJhY2sgPSByZWxlYXNlX2Jsb2Nrc19vbl9jb21taXQ7CiAKIAlwcmludGsoS0VSTl9JTkZPICJFWFQ0LWZzOiBtYmFsbG9jIGVuYWJsZWRcbiIpOwogCXJldHVybiAwOwpAQCAtMjY1Miw3ICsyODUxLDcgQEAKIAlsaXN0X2Zvcl9lYWNoX3NhZmUobCwgbHRtcCwgJnR4bi0+dF9wcml2YXRlX2xpc3QpIHsKIAkJZW50cnkgPSBsaXN0X2VudHJ5KGwsIHN0cnVjdCBleHQ0X2ZyZWVfZGF0YSwgbGlzdCk7CiAKLQkJbWJfZGVidWcoImdvbm5hIGZyZWUgJXUgYmxvY2tzIGluIGdyb3VwICVsdSAoMHglcCk6IiwKKwkJbWJfZGVidWcoImdvbm5hIGZyZWUgJXUgYmxvY2tzIGluIGdyb3VwICV1ICgweCVwKToiLAogCQkJIGVudHJ5LT5jb3VudCwgZW50cnktPmdyb3VwLCBlbnRyeSk7CiAKIAkJZXJyID0gZXh0NF9tYl9sb2FkX2J1ZGR5KHNiLCBlbnRyeS0+Z3JvdXAsICZlNGIpOwpAQCAtMjY3OSw4ICsyODc4LDkgQEAKIAkJZGlzY2FyZF9ibG9jayA9IChleHQ0X2ZzYmxrX3QpIGVudHJ5LT5ncm91cCAqIEVYVDRfQkxPQ0tTX1BFUl9HUk9VUChzYikKIAkJCSsgZW50cnktPnN0YXJ0X2JsawogCQkJKyBsZTMyX3RvX2NwdShFWFQ0X1NCKHNiKS0+c19lcy0+c19maXJzdF9kYXRhX2Jsb2NrKTsKLQkJdHJhY2VfbWFyayhleHQ0X2Rpc2NhcmRfYmxvY2tzLCAiZGV2ICVzIGJsayAlbGx1IGNvdW50ICV1Iiwgc2ItPnNfaWQsCi0JCQkgICAodW5zaWduZWQgbG9uZyBsb25nKSBkaXNjYXJkX2Jsb2NrLCBlbnRyeS0+Y291bnQpOworCQl0cmFjZV9tYXJrKGV4dDRfZGlzY2FyZF9ibG9ja3MsICJkZXYgJXMgYmxrICVsbHUgY291bnQgJXUiLAorCQkJICAgc2ItPnNfaWQsICh1bnNpZ25lZCBsb25nIGxvbmcpIGRpc2NhcmRfYmxvY2ssCisJCQkgICBlbnRyeS0+Y291bnQpOwogCQlzYl9pc3N1ZV9kaXNjYXJkKHNiLCBkaXNjYXJkX2Jsb2NrLCBlbnRyeS0+Y291bnQpOwogCiAJCWttZW1fY2FjaGVfZnJlZShleHQ0X2ZyZWVfZXh0X2NhY2hlcCwgZW50cnkpOwpAQCAtMjc5MSw3ICsyOTkxLDcgQEAKICAqLwogc3RhdGljIG5vaW5saW5lX2Zvcl9zdGFjayBpbnQKIGV4dDRfbWJfbWFya19kaXNrc3BhY2VfdXNlZChzdHJ1Y3QgZXh0NF9hbGxvY2F0aW9uX2NvbnRleHQgKmFjLAotCQkJCWhhbmRsZV90ICpoYW5kbGUsIHVuc2lnbmVkIGxvbmcgcmVzZXJ2X2Jsa3MpCisJCQkJaGFuZGxlX3QgKmhhbmRsZSwgdW5zaWduZWQgaW50IHJlc2Vydl9ibGtzKQogewogCXN0cnVjdCBidWZmZXJfaGVhZCAqYml0bWFwX2JoID0gTlVMTDsKIAlzdHJ1Y3QgZXh0NF9zdXBlcl9ibG9jayAqZXM7CkBAIC0yODI0LDcgKzMwMjQsNyBAQAogCWlmICghZ2RwKQogCQlnb3RvIG91dF9lcnI7CiAKLQlleHQ0X2RlYnVnKCJ1c2luZyBibG9jayBncm91cCAlbHUoJWQpXG4iLCBhYy0+YWNfYl9leC5mZV9ncm91cCwKKwlleHQ0X2RlYnVnKCJ1c2luZyBibG9jayBncm91cCAldSglZClcbiIsIGFjLT5hY19iX2V4LmZlX2dyb3VwLAogCQkJZ2RwLT5iZ19mcmVlX2Jsb2Nrc19jb3VudCk7CiAKIAllcnIgPSBleHQ0X2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGUsIGdkcF9iaCk7CkBAIC0yODQzLDggKzMwNDMsOCBAQAogCSAgICBpbl9yYW5nZShibG9jayArIGxlbiAtIDEsIGV4dDRfaW5vZGVfdGFibGUoc2IsIGdkcCksCiAJCSAgICAgRVhUNF9TQihzYiktPnNfaXRiX3Blcl9ncm91cCkpIHsKIAkJZXh0NF9lcnJvcihzYiwgX19mdW5jX18sCi0JCQkgICAiQWxsb2NhdGluZyBibG9jayBpbiBzeXN0ZW0gem9uZSAtIGJsb2NrID0gJWxsdSIsCi0JCQkgICBibG9jayk7CisJCQkgICAiQWxsb2NhdGluZyBibG9jayAlbGx1IGluIHN5c3RlbSB6b25lIG9mICVkIGdyb3VwXG4iLAorCQkJICAgYmxvY2ssIGFjLT5hY19iX2V4LmZlX2dyb3VwKTsKIAkJLyogRmlsZSBzeXN0ZW0gbW91bnRlZCBub3QgdG8gcGFuaWMgb24gZXJyb3IKIAkJICogRml4IHRoZSBiaXRtYXAgYW5kIHJlcGVhdCB0aGUgYmxvY2sgYWxsb2NhdGlvbgogCQkgKiBXZSBsZWFrIHNvbWUgb2YgdGhlIGJsb2NrcyBoZXJlLgpAQCAtMjg1Miw3ICszMDUyLDcgQEAKIAkJbWJfc2V0X2JpdHMoc2JfYmdsX2xvY2soc2JpLCBhYy0+YWNfYl9leC5mZV9ncm91cCksCiAJCQkJYml0bWFwX2JoLT5iX2RhdGEsIGFjLT5hY19iX2V4LmZlX3N0YXJ0LAogCQkJCWFjLT5hY19iX2V4LmZlX2xlbik7Ci0JCWVyciA9IGV4dDRfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGJpdG1hcF9iaCk7CisJCWVyciA9IGV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgTlVMTCwgYml0bWFwX2JoKTsKIAkJaWYgKCFlcnIpCiAJCQllcnIgPSAtRUFHQUlOOwogCQlnb3RvIG91dF9lcnI7CkBAIC0yODY2LDE4ICszMDY2LDE3IEBACiAJCX0KIAl9CiAjZW5kaWYKLQltYl9zZXRfYml0cyhzYl9iZ2xfbG9jayhzYmksIGFjLT5hY19iX2V4LmZlX2dyb3VwKSwgYml0bWFwX2JoLT5iX2RhdGEsCi0JCQkJYWMtPmFjX2JfZXguZmVfc3RhcnQsIGFjLT5hY19iX2V4LmZlX2xlbik7Ci0KIAlzcGluX2xvY2soc2JfYmdsX2xvY2soc2JpLCBhYy0+YWNfYl9leC5mZV9ncm91cCkpOworCW1iX3NldF9iaXRzKE5VTEwsIGJpdG1hcF9iaC0+Yl9kYXRhLAorCQkJCWFjLT5hY19iX2V4LmZlX3N0YXJ0LCBhYy0+YWNfYl9leC5mZV9sZW4pOwogCWlmIChnZHAtPmJnX2ZsYWdzICYgY3B1X3RvX2xlMTYoRVhUNF9CR19CTE9DS19VTklOSVQpKSB7CiAJCWdkcC0+YmdfZmxhZ3MgJj0gY3B1X3RvX2xlMTYofkVYVDRfQkdfQkxPQ0tfVU5JTklUKTsKLQkJZ2RwLT5iZ19mcmVlX2Jsb2Nrc19jb3VudCA9Ci0JCQljcHVfdG9fbGUxNihleHQ0X2ZyZWVfYmxvY2tzX2FmdGVyX2luaXQoc2IsCi0JCQkJCQlhYy0+YWNfYl9leC5mZV9ncm91cCwKLQkJCQkJCWdkcCkpOworCQlleHQ0X2ZyZWVfYmxrc19zZXQoc2IsIGdkcCwKKwkJCQkJZXh0NF9mcmVlX2Jsb2Nrc19hZnRlcl9pbml0KHNiLAorCQkJCQlhYy0+YWNfYl9leC5mZV9ncm91cCwgZ2RwKSk7CiAJfQotCWxlMTZfYWRkX2NwdSgmZ2RwLT5iZ19mcmVlX2Jsb2Nrc19jb3VudCwgLWFjLT5hY19iX2V4LmZlX2xlbik7CisJbGVuID0gZXh0NF9mcmVlX2Jsa3NfY291bnQoc2IsIGdkcCkgLSBhYy0+YWNfYl9leC5mZV9sZW47CisJZXh0NF9mcmVlX2Jsa3Nfc2V0KHNiLCBnZHAsIGxlbik7CiAJZ2RwLT5iZ19jaGVja3N1bSA9IGV4dDRfZ3JvdXBfZGVzY19jc3VtKHNiaSwgYWMtPmFjX2JfZXguZmVfZ3JvdXAsIGdkcCk7CiAJc3Bpbl91bmxvY2soc2JfYmdsX2xvY2soc2JpLCBhYy0+YWNfYl9leC5mZV9ncm91cCkpOwogCXBlcmNwdV9jb3VudGVyX3N1Yigmc2JpLT5zX2ZyZWVibG9ja3NfY291bnRlciwgYWMtPmFjX2JfZXguZmVfbGVuKTsKQEAgLTI4OTksMTAgKzMwOTgsMTAgQEAKIAkJc3Bpbl91bmxvY2soc2JfYmdsX2xvY2soc2JpLCBmbGV4X2dyb3VwKSk7CiAJfQogCi0JZXJyID0gZXh0NF9qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgYml0bWFwX2JoKTsKKwllcnIgPSBleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIE5VTEwsIGJpdG1hcF9iaCk7CiAJaWYgKGVycikKIAkJZ290byBvdXRfZXJyOwotCWVyciA9IGV4dDRfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGdkcF9iaCk7CisJZXJyID0gZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBOVUxMLCBnZHBfYmgpOwogCiBvdXRfZXJyOgogCXNiLT5zX2RpcnQgPSAxOwpAQCAtMzAzMSw3ICszMjMwLDcgQEAKIAkvKiBjaGVjayB3ZSBkb24ndCBjcm9zcyBhbHJlYWR5IHByZWFsbG9jYXRlZCBibG9ja3MgKi8KIAlyY3VfcmVhZF9sb2NrKCk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UocGEsICZlaS0+aV9wcmVhbGxvY19saXN0LCBwYV9pbm9kZV9saXN0KSB7Ci0JCXVuc2lnbmVkIGxvbmcgcGFfZW5kOworCQlleHQ0X2xibGtfdCBwYV9lbmQ7CiAKIAkJaWYgKHBhLT5wYV9kZWxldGVkKQogCQkJY29udGludWU7CkBAIC0zMDc1LDcgKzMyNzQsNyBAQAogCS8qIFhYWDogZXh0cmEgbG9vcCB0byBjaGVjayB3ZSByZWFsbHkgZG9uJ3Qgb3ZlcmxhcCBwcmVhbGxvY2F0aW9ucyAqLwogCXJjdV9yZWFkX2xvY2soKTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShwYSwgJmVpLT5pX3ByZWFsbG9jX2xpc3QsIHBhX2lub2RlX2xpc3QpIHsKLQkJdW5zaWduZWQgbG9uZyBwYV9lbmQ7CisJCWV4dDRfbGJsa190IHBhX2VuZDsKIAkJc3Bpbl9sb2NrKCZwYS0+cGFfbG9jayk7CiAJCWlmIChwYS0+cGFfZGVsZXRlZCA9PSAwKSB7CiAJCQlwYV9lbmQgPSBwYS0+cGFfbHN0YXJ0ICsgcGEtPnBhX2xlbjsKQEAgLTMzMDcsNiArMzUwNiwzMiBAQAogfQogCiAvKgorICogdGhlIGZ1bmN0aW9uIGdvZXMgdGhyb3VnaCBhbGwgYmxvY2sgZnJlZWQgaW4gdGhlIGdyb3VwCisgKiBidXQgbm90IHlldCBjb21taXR0ZWQgYW5kIG1hcmtzIHRoZW0gdXNlZCBpbiBpbi1jb3JlIGJpdG1hcC4KKyAqIGJ1ZGR5IG11c3QgYmUgZ2VuZXJhdGVkIGZyb20gdGhpcyBiaXRtYXAKKyAqIE5lZWQgdG8gYmUgY2FsbGVkIHdpdGggZXh0NCBncm91cCBsb2NrIChleHQ0X2xvY2tfZ3JvdXApCisgKi8KK3N0YXRpYyB2b2lkIGV4dDRfbWJfZ2VuZXJhdGVfZnJvbV9mcmVlbGlzdChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB2b2lkICpiaXRtYXAsCisJCQkJCQlleHQ0X2dyb3VwX3QgZ3JvdXApCit7CisJc3RydWN0IHJiX25vZGUgKm47CisJc3RydWN0IGV4dDRfZ3JvdXBfaW5mbyAqZ3JwOworCXN0cnVjdCBleHQ0X2ZyZWVfZGF0YSAqZW50cnk7CisKKwlncnAgPSBleHQ0X2dldF9ncm91cF9pbmZvKHNiLCBncm91cCk7CisJbiA9IHJiX2ZpcnN0KCYoZ3JwLT5iYl9mcmVlX3Jvb3QpKTsKKworCXdoaWxlIChuKSB7CisJCWVudHJ5ID0gcmJfZW50cnkobiwgc3RydWN0IGV4dDRfZnJlZV9kYXRhLCBub2RlKTsKKwkJbWJfc2V0X2JpdHMoc2JfYmdsX2xvY2soRVhUNF9TQihzYiksIGdyb3VwKSwKKwkJCQliaXRtYXAsIGVudHJ5LT5zdGFydF9ibGssCisJCQkJZW50cnktPmNvdW50KTsKKwkJbiA9IHJiX25leHQobik7CisJfQorCXJldHVybjsKK30KKworLyoKICAqIHRoZSBmdW5jdGlvbiBnb2VzIHRocm91Z2ggYWxsIHByZWFsbG9jYXRpb24gaW4gdGhpcyBncm91cCBhbmQgbWFya3MgdGhlbQogICogdXNlZCBpbiBpbi1jb3JlIGJpdG1hcC4gYnVkZHkgbXVzdCBiZSBnZW5lcmF0ZWQgZnJvbSB0aGlzIGJpdG1hcAogICogTmVlZCB0byBiZSBjYWxsZWQgd2l0aCBleHQ0IGdyb3VwIGxvY2sgKGV4dDRfbG9ja19ncm91cCkKQEAgLTMzNDYsNyArMzU3MSw3IEBACiAJCXByZWFsbG9jYXRlZCArPSBsZW47CiAJCWNvdW50Kys7CiAJfQotCW1iX2RlYnVnKCJwcmVsbG9jYXRlZCAldSBmb3IgZ3JvdXAgJWx1XG4iLCBwcmVhbGxvY2F0ZWQsIGdyb3VwKTsKKwltYl9kZWJ1ZygicHJlbGxvY2F0ZWQgJXUgZm9yIGdyb3VwICV1XG4iLCBwcmVhbGxvY2F0ZWQsIGdyb3VwKTsKIH0KIAogc3RhdGljIHZvaWQgZXh0NF9tYl9wYV9jYWxsYmFjayhzdHJ1Y3QgcmN1X2hlYWQgKmhlYWQpCkBAIC0zMzYzLDcgKzM1ODgsNyBAQAogc3RhdGljIHZvaWQgZXh0NF9tYl9wdXRfcGEoc3RydWN0IGV4dDRfYWxsb2NhdGlvbl9jb250ZXh0ICphYywKIAkJCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBleHQ0X3ByZWFsbG9jX3NwYWNlICpwYSkKIHsKLQl1bnNpZ25lZCBsb25nIGdycDsKKwlleHQ0X2dyb3VwX3QgZ3JwOwogCiAJaWYgKCFhdG9taWNfZGVjX2FuZF90ZXN0KCZwYS0+cGFfY291bnQpIHx8IHBhLT5wYV9mcmVlICE9IDApCiAJCXJldHVybjsKQEAgLTM0NzMsNiArMzY5OCwxMCBAQAogCiAJbWJfZGVidWcoIm5ldyBpbm9kZSBwYSAlcDogJWxsdS8ldSBmb3IgJXVcbiIsIHBhLAogCQkJcGEtPnBhX3BzdGFydCwgcGEtPnBhX2xlbiwgcGEtPnBhX2xzdGFydCk7CisJdHJhY2VfbWFyayhleHQ0X21iX25ld19pbm9kZV9wYSwKKwkJICAgImRldiAlcyBpbm8gJWx1IHBzdGFydCAlbGx1IGxlbiAldSBsc3RhcnQgJXUiLAorCQkgICBzYi0+c19pZCwgYWMtPmFjX2lub2RlLT5pX2lubywKKwkJICAgcGEtPnBhX3BzdGFydCwgcGEtPnBhX2xlbiwgcGEtPnBhX2xzdGFydCk7CiAKIAlleHQ0X21iX3VzZV9pbm9kZV9wYShhYywgcGEpOwogCWF0b21pY19hZGQocGEtPnBhX2ZyZWUsICZFWFQ0X1NCKHNiKS0+c19tYl9wcmVhbGxvY2F0ZWQpOwpAQCAtMzUzMCw3ICszNzU5LDkgQEAKIAlwYS0+cGFfbGluZWFyID0gMTsKIAogCW1iX2RlYnVnKCJuZXcgZ3JvdXAgcGEgJXA6ICVsbHUvJXUgZm9yICV1XG4iLCBwYSwKLQkJCXBhLT5wYV9wc3RhcnQsIHBhLT5wYV9sZW4sIHBhLT5wYV9sc3RhcnQpOworCQkgcGEtPnBhX3BzdGFydCwgcGEtPnBhX2xlbiwgcGEtPnBhX2xzdGFydCk7CisJdHJhY2VfbWFyayhleHQ0X21iX25ld19ncm91cF9wYSwgImRldiAlcyBwc3RhcnQgJWxsdSBsZW4gJXUgbHN0YXJ0ICV1IiwKKwkJICAgc2ItPnNfaWQsIHBhLT5wYV9wc3RhcnQsIHBhLT5wYV9sZW4sIHBhLT5wYV9sc3RhcnQpOwogCiAJZXh0NF9tYl91c2VfZ3JvdXBfcGEoYWMsIHBhKTsKIAlhdG9taWNfYWRkKHBhLT5wYV9mcmVlLCAmRVhUNF9TQihzYiktPnNfbWJfcHJlYWxsb2NhdGVkKTsKQEAgLTM1NzksMTYgKzM4MTAsMTggQEAKIHsKIAlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gZTRiLT5iZF9zYjsKIAlzdHJ1Y3QgZXh0NF9zYl9pbmZvICpzYmkgPSBFWFQ0X1NCKHNiKTsKLQl1bnNpZ25lZCBsb25nIGVuZDsKLQl1bnNpZ25lZCBsb25nIG5leHQ7CisJdW5zaWduZWQgaW50IGVuZDsKKwl1bnNpZ25lZCBpbnQgbmV4dDsKIAlleHQ0X2dyb3VwX3QgZ3JvdXA7CiAJZXh0NF9ncnBibGtfdCBiaXQ7CisJdW5zaWduZWQgbG9uZyBsb25nIGdycF9ibGtfc3RhcnQ7CiAJc2VjdG9yX3Qgc3RhcnQ7CiAJaW50IGVyciA9IDA7CiAJaW50IGZyZWUgPSAwOwogCiAJQlVHX09OKHBhLT5wYV9kZWxldGVkID09IDApOwogCWV4dDRfZ2V0X2dyb3VwX25vX2FuZF9vZmZzZXQoc2IsIHBhLT5wYV9wc3RhcnQsICZncm91cCwgJmJpdCk7CisJZ3JwX2Jsa19zdGFydCA9IHBhLT5wYV9wc3RhcnQgLSBiaXQ7CiAJQlVHX09OKGdyb3VwICE9IGU0Yi0+YmRfZ3JvdXAgJiYgcGEtPnBhX2xlbiAhPSAwKTsKIAllbmQgPSBiaXQgKyBwYS0+cGFfbGVuOwogCkBAIC0zNjE4LDYgKzM4NTEsMTAgQEAKIAkJCWV4dDRfbWJfc3RvcmVfaGlzdG9yeShhYyk7CiAJCX0KIAorCQl0cmFjZV9tYXJrKGV4dDRfbWJfcmVsZWFzZV9pbm9kZV9wYSwKKwkJCSAgICJkZXYgJXMgaW5vICVsdSBibG9jayAlbGx1IGNvdW50ICV1IiwKKwkJCSAgIHNiLT5zX2lkLCBwYS0+cGFfaW5vZGUtPmlfaW5vLCBncnBfYmxrX3N0YXJ0ICsgYml0LAorCQkJICAgbmV4dCAtIGJpdCk7CiAJCW1iX2ZyZWVfYmxvY2tzKHBhLT5wYV9pbm9kZSwgZTRiLCBiaXQsIG5leHQgLSBiaXQpOwogCQliaXQgPSBuZXh0ICsgMTsKIAl9CkBAIC0zNjI2LDggKzM4NjMsOSBAQAogCQkJcGEsICh1bnNpZ25lZCBsb25nKSBwYS0+cGFfbHN0YXJ0LAogCQkJKHVuc2lnbmVkIGxvbmcpIHBhLT5wYV9wc3RhcnQsCiAJCQkodW5zaWduZWQgbG9uZykgcGEtPnBhX2xlbik7Ci0JCWV4dDRfZXJyb3Ioc2IsIF9fZnVuY19fLCAiZnJlZSAldSwgcGFfZnJlZSAldVxuIiwKLQkJCQkJCWZyZWUsIHBhLT5wYV9mcmVlKTsKKwkJZXh0NF9ncnBfbG9ja2VkX2Vycm9yKHNiLCBncm91cCwKKwkJCQkJX19mdW5jX18sICJmcmVlICV1LCBwYV9mcmVlICV1IiwKKwkJCQkJZnJlZSwgcGEtPnBhX2ZyZWUpOwogCQkvKgogCQkgKiBwYSBpcyBhbHJlYWR5IGRlbGV0ZWQgc28gd2UgdXNlIHRoZSB2YWx1ZSBvYnRhaW5lZAogCQkgKiBmcm9tIHRoZSBiaXRtYXAgYW5kIGNvbnRpbnVlLgpAQCAtMzY1MCw2ICszODg4LDggQEAKIAlpZiAoYWMpCiAJCWFjLT5hY19vcCA9IEVYVDRfTUJfSElTVE9SWV9ESVNDQVJEOwogCisJdHJhY2VfbWFyayhleHQ0X21iX3JlbGVhc2VfZ3JvdXBfcGEsICJkZXYgJXMgcHN0YXJ0ICVsbHUgbGVuICVkIiwKKwkJICAgc2ItPnNfaWQsIHBhLT5wYV9wc3RhcnQsIHBhLT5wYV9sZW4pOwogCUJVR19PTihwYS0+cGFfZGVsZXRlZCA9PSAwKTsKIAlleHQ0X2dldF9ncm91cF9ub19hbmRfb2Zmc2V0KHNiLCBwYS0+cGFfcHN0YXJ0LCAmZ3JvdXAsICZiaXQpOwogCUJVR19PTihncm91cCAhPSBlNGItPmJkX2dyb3VwICYmIHBhLT5wYV9sZW4gIT0gMCk7CkBAIC0zNjkyLDcgKzM5MzIsNyBAQAogCWludCBidXN5ID0gMDsKIAlpbnQgZnJlZSA9IDA7CiAKLQltYl9kZWJ1ZygiZGlzY2FyZCBwcmVhbGxvY2F0aW9uIGZvciBncm91cCAlbHVcbiIsIGdyb3VwKTsKKwltYl9kZWJ1ZygiZGlzY2FyZCBwcmVhbGxvY2F0aW9uIGZvciBncm91cCAldVxuIiwgZ3JvdXApOwogCiAJaWYgKGxpc3RfZW1wdHkoJmdycC0+YmJfcHJlYWxsb2NfbGlzdCkpCiAJCXJldHVybiAwOwpAQCAtMzcwMCwxNCArMzk0MCwxNCBAQAogCWJpdG1hcF9iaCA9IGV4dDRfcmVhZF9ibG9ja19iaXRtYXAoc2IsIGdyb3VwKTsKIAlpZiAoYml0bWFwX2JoID09IE5VTEwpIHsKIAkJZXh0NF9lcnJvcihzYiwgX19mdW5jX18sICJFcnJvciBpbiByZWFkaW5nIGJsb2NrICIKLQkJCQkiYml0bWFwIGZvciAlbHVcbiIsIGdyb3VwKTsKKwkJCQkiYml0bWFwIGZvciAldSIsIGdyb3VwKTsKIAkJcmV0dXJuIDA7CiAJfQogCiAJZXJyID0gZXh0NF9tYl9sb2FkX2J1ZGR5KHNiLCBncm91cCwgJmU0Yik7CiAJaWYgKGVycikgewogCQlleHQ0X2Vycm9yKHNiLCBfX2Z1bmNfXywgIkVycm9yIGluIGxvYWRpbmcgYnVkZHkgIgotCQkJCSJpbmZvcm1hdGlvbiBmb3IgJWx1XG4iLCBncm91cCk7CisJCQkJImluZm9ybWF0aW9uIGZvciAldSIsIGdyb3VwKTsKIAkJcHV0X2JoKGJpdG1hcF9iaCk7CiAJCXJldHVybiAwOwogCX0KQEAgLTM4MTUsNiArNDA1NSw4IEBACiAJfQogCiAJbWJfZGVidWcoImRpc2NhcmQgcHJlYWxsb2NhdGlvbiBmb3IgaW5vZGUgJWx1XG4iLCBpbm9kZS0+aV9pbm8pOworCXRyYWNlX21hcmsoZXh0NF9kaXNjYXJkX3ByZWFsbG9jYXRpb25zLCAiZGV2ICVzIGlubyAlbHUiLCBzYi0+c19pZCwKKwkJICAgaW5vZGUtPmlfaW5vKTsKIAogCUlOSVRfTElTVF9IRUFEKCZsaXN0KTsKIApAQCAtMzg3NCwxNCArNDExNiwxNCBAQAogCQllcnIgPSBleHQ0X21iX2xvYWRfYnVkZHkoc2IsIGdyb3VwLCAmZTRiKTsKIAkJaWYgKGVycikgewogCQkJZXh0NF9lcnJvcihzYiwgX19mdW5jX18sICJFcnJvciBpbiBsb2FkaW5nIGJ1ZGR5ICIKLQkJCQkJImluZm9ybWF0aW9uIGZvciAlbHVcbiIsIGdyb3VwKTsKKwkJCQkJImluZm9ybWF0aW9uIGZvciAldSIsIGdyb3VwKTsKIAkJCWNvbnRpbnVlOwogCQl9CiAKIAkJYml0bWFwX2JoID0gZXh0NF9yZWFkX2Jsb2NrX2JpdG1hcChzYiwgZ3JvdXApOwogCQlpZiAoYml0bWFwX2JoID09IE5VTEwpIHsKIAkJCWV4dDRfZXJyb3Ioc2IsIF9fZnVuY19fLCAiRXJyb3IgaW4gcmVhZGluZyBibG9jayAiCi0JCQkJCSJiaXRtYXAgZm9yICVsdVxuIiwgZ3JvdXApOworCQkJCQkiYml0bWFwIGZvciAldSIsIGdyb3VwKTsKIAkJCWV4dDRfbWJfcmVsZWFzZV9kZXNjKCZlNGIpOwogCQkJY29udGludWU7CiAJCX0KQEAgLTQwMjQsOCArNDI2Niw4IEBACiAJc3RydWN0IGV4dDRfc2JfaW5mbyAqc2JpID0gRVhUNF9TQihzYik7CiAJc3RydWN0IGV4dDRfc3VwZXJfYmxvY2sgKmVzID0gc2JpLT5zX2VzOwogCWV4dDRfZ3JvdXBfdCBncm91cDsKLQl1bnNpZ25lZCBsb25nIGxlbjsKLQl1bnNpZ25lZCBsb25nIGdvYWw7CisJdW5zaWduZWQgaW50IGxlbjsKKwlleHQ0X2ZzYmxrX3QgZ29hbDsKIAlleHQ0X2dycGJsa190IGJsb2NrOwogCiAJLyogd2UgY2FuJ3QgYWxsb2NhdGUgPiBncm91cCBzaXplICovCkBAIC00MDY4LDYgKzQzMTAsNyBAQAogCWFjLT5hY19wYSA9IE5VTEw7CiAJYWMtPmFjX2JpdG1hcF9wYWdlID0gTlVMTDsKIAlhYy0+YWNfYnVkZHlfcGFnZSA9IE5VTEw7CisJYWMtPmFsbG9jX3NlbXAgPSBOVUxMOwogCWFjLT5hY19sZyA9IE5VTEw7CiAKIAkvKiB3ZSBoYXZlIHRvIGRlZmluZSBjb250ZXh0OiB3ZSdsbCB3ZSB3b3JrIHdpdGggYSBmaWxlIG9yCkBAIC00MTQ2LDcgKzQzODksNyBAQAogCQlleHQ0X2dldF9ncm91cF9ub19hbmRfb2Zmc2V0KHNiLCBwYS0+cGFfcHN0YXJ0LCAmZ3JvdXAsIE5VTEwpOwogCQlpZiAoZXh0NF9tYl9sb2FkX2J1ZGR5KHNiLCBncm91cCwgJmU0YikpIHsKIAkJCWV4dDRfZXJyb3Ioc2IsIF9fZnVuY19fLCAiRXJyb3IgaW4gbG9hZGluZyBidWRkeSAiCi0JCQkJCSJpbmZvcm1hdGlvbiBmb3IgJWx1XG4iLCBncm91cCk7CisJCQkJCSJpbmZvcm1hdGlvbiBmb3IgJXUiLCBncm91cCk7CiAJCQljb250aW51ZTsKIAkJfQogCQlleHQ0X2xvY2tfZ3JvdXAoc2IsIGdyb3VwKTsKQEAgLTQyNDgsNiArNDQ5MSw4IEBACiAJCX0KIAkJZXh0NF9tYl9wdXRfcGEoYWMsIGFjLT5hY19zYiwgcGEpOwogCX0KKwlpZiAoYWMtPmFsbG9jX3NlbXApCisJCXVwX3JlYWQoYWMtPmFsbG9jX3NlbXApOwogCWlmIChhYy0+YWNfYml0bWFwX3BhZ2UpCiAJCXBhZ2VfY2FjaGVfcmVsZWFzZShhYy0+YWNfYml0bWFwX3BhZ2UpOwogCWlmIChhYy0+YWNfYnVkZHlfcGFnZSkKQEAgLTQyNjQsNiArNDUwOSw4IEBACiAJaW50IHJldDsKIAlpbnQgZnJlZWQgPSAwOwogCisJdHJhY2VfbWFyayhleHQ0X21iX2Rpc2NhcmRfcHJlYWxsb2NhdGlvbnMsICJkZXYgJXMgbmVlZGVkICVkIiwKKwkJICAgc2ItPnNfaWQsIG5lZWRlZCk7CiAJZm9yIChpID0gMDsgaSA8IEVYVDRfU0Ioc2IpLT5zX2dyb3Vwc19jb3VudCAmJiBuZWVkZWQgPiAwOyBpKyspIHsKIAkJcmV0ID0gZXh0NF9tYl9kaXNjYXJkX2dyb3VwX3ByZWFsbG9jYXRpb25zKHNiLCBpLCBuZWVkZWQpOwogCQlmcmVlZCArPSByZXQ7CkBAIC00Mjg2LDEyICs0NTMzLDI0IEBACiAJc3RydWN0IGV4dDRfc2JfaW5mbyAqc2JpOwogCXN0cnVjdCBzdXBlcl9ibG9jayAqc2I7CiAJZXh0NF9mc2Jsa190IGJsb2NrID0gMDsKLQl1bnNpZ25lZCBsb25nIGlucXVvdGE7Ci0JdW5zaWduZWQgbG9uZyByZXNlcnZfYmxrcyA9IDA7CisJdW5zaWduZWQgaW50IGlucXVvdGE7CisJdW5zaWduZWQgaW50IHJlc2Vydl9ibGtzID0gMDsKIAogCXNiID0gYXItPmlub2RlLT5pX3NiOwogCXNiaSA9IEVYVDRfU0Ioc2IpOwogCisJdHJhY2VfbWFyayhleHQ0X3JlcXVlc3RfYmxvY2tzLCAiZGV2ICVzIGZsYWdzICV1IGxlbiAldSBpbm8gJWx1ICIKKwkJICAgImxibGsgJWxsdSBnb2FsICVsbHUgbGxlZnQgJWxsdSBscmlnaHQgJWxsdSAiCisJCSAgICJwbGVmdCAlbGx1IHByaWdodCAlbGx1ICIsCisJCSAgIHNiLT5zX2lkLCBhci0+ZmxhZ3MsIGFyLT5sZW4sCisJCSAgIGFyLT5pbm9kZSA/IGFyLT5pbm9kZS0+aV9pbm8gOiAwLAorCQkgICAodW5zaWduZWQgbG9uZyBsb25nKSBhci0+bG9naWNhbCwKKwkJICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgYXItPmdvYWwsCisJCSAgICh1bnNpZ25lZCBsb25nIGxvbmcpIGFyLT5sbGVmdCwKKwkJICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgYXItPmxyaWdodCwKKwkJICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgYXItPnBsZWZ0LAorCQkgICAodW5zaWduZWQgbG9uZyBsb25nKSBhci0+cHJpZ2h0KTsKKwogCWlmICghRVhUNF9JKGFyLT5pbm9kZSktPmlfZGVsYWxsb2NfcmVzZXJ2ZWRfZmxhZykgewogCQkvKgogCQkgKiBXaXRoIGRlbGFsbG9jIHdlIGFscmVhZHkgcmVzZXJ2ZWQgdGhlIGJsb2NrcwpAQCAtNDMxMyw3ICs0NTcyLDcgQEAKIAl9CiAJaWYgKGFyLT5sZW4gPT0gMCkgewogCQkqZXJycCA9IC1FRFFVT1Q7Ci0JCXJldHVybiAwOworCQlnb3RvIG91dDM7CiAJfQogCWlucXVvdGEgPSBhci0+bGVuOwogCkBAIC00MzQ4LDEwICs0NjA3LDE0IEBACiAJCQkJYWMtPmFjX29fZXguZmVfbGVuIDwgYWMtPmFjX2JfZXguZmVfbGVuKQogCQkJZXh0NF9tYl9uZXdfcHJlYWxsb2NhdGlvbihhYyk7CiAJfQotCiAJaWYgKGxpa2VseShhYy0+YWNfc3RhdHVzID09IEFDX1NUQVRVU19GT1VORCkpIHsKIAkJKmVycnAgPSBleHQ0X21iX21hcmtfZGlza3NwYWNlX3VzZWQoYWMsIGhhbmRsZSwgcmVzZXJ2X2Jsa3MpOwogCQlpZiAoKmVycnAgPT0gIC1FQUdBSU4pIHsKKwkJCS8qCisJCQkgKiBkcm9wIHRoZSByZWZlcmVuY2UgdGhhdCB3ZSB0b29rCisJCQkgKiBpbiBleHQ0X21iX3VzZV9iZXN0X2ZvdW5kCisJCQkgKi8KKwkJCWV4dDRfbWJfcmVsZWFzZV9jb250ZXh0KGFjKTsKIAkJCWFjLT5hY19iX2V4LmZlX2dyb3VwID0gMDsKIAkJCWFjLT5hY19iX2V4LmZlX3N0YXJ0ID0gMDsKIAkJCWFjLT5hY19iX2V4LmZlX2xlbiA9IDA7CkBAIC00MzgyLDYgKzQ2NDUsMjYgQEAKIG91dDE6CiAJaWYgKGFyLT5sZW4gPCBpbnF1b3RhKQogCQlEUVVPVF9GUkVFX0JMT0NLKGFyLT5pbm9kZSwgaW5xdW90YSAtIGFyLT5sZW4pOworb3V0MzoKKwlpZiAoIWFyLT5sZW4pIHsKKwkJaWYgKCFFWFQ0X0koYXItPmlub2RlKS0+aV9kZWxhbGxvY19yZXNlcnZlZF9mbGFnKQorCQkJLyogcmVsZWFzZSBhbGwgdGhlIHJlc2VydmVkIGJsb2NrcyBpZiBub24gZGVsYWxsb2MgKi8KKwkJCXBlcmNwdV9jb3VudGVyX3N1Yigmc2JpLT5zX2RpcnR5YmxvY2tzX2NvdW50ZXIsCisJCQkJCQlyZXNlcnZfYmxrcyk7CisJfQorCisJdHJhY2VfbWFyayhleHQ0X2FsbG9jYXRlX2Jsb2NrcywKKwkJICAgImRldiAlcyBibG9jayAlbGx1IGZsYWdzICV1IGxlbiAldSBpbm8gJWx1ICIKKwkJICAgImxvZ2ljYWwgJWxsdSBnb2FsICVsbHUgbGxlZnQgJWxsdSBscmlnaHQgJWxsdSAiCisJCSAgICJwbGVmdCAlbGx1IHByaWdodCAlbGx1ICIsCisJCSAgIHNiLT5zX2lkLCAodW5zaWduZWQgbG9uZyBsb25nKSBibG9jaywKKwkJICAgYXItPmZsYWdzLCBhci0+bGVuLCBhci0+aW5vZGUgPyBhci0+aW5vZGUtPmlfaW5vIDogMCwKKwkJICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgYXItPmxvZ2ljYWwsCisJCSAgICh1bnNpZ25lZCBsb25nIGxvbmcpIGFyLT5nb2FsLAorCQkgICAodW5zaWduZWQgbG9uZyBsb25nKSBhci0+bGxlZnQsCisJCSAgICh1bnNpZ25lZCBsb25nIGxvbmcpIGFyLT5scmlnaHQsCisJCSAgICh1bnNpZ25lZCBsb25nIGxvbmcpIGFyLT5wbGVmdCwKKwkJICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgYXItPnByaWdodCk7CiAKIAlyZXR1cm4gYmxvY2s7CiB9CkBAIC00NDAzLDI3ICs0Njg2LDIzIEBACiAKIHN0YXRpYyBub2lubGluZV9mb3Jfc3RhY2sgaW50CiBleHQ0X21iX2ZyZWVfbWV0YWRhdGEoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGV4dDRfYnVkZHkgKmU0YiwKLQkJCSAgZXh0NF9ncm91cF90IGdyb3VwLCBleHQ0X2dycGJsa190IGJsb2NrLCBpbnQgY291bnQpCisJCSAgICAgIHN0cnVjdCBleHQ0X2ZyZWVfZGF0YSAqbmV3X2VudHJ5KQogeworCWV4dDRfZ3JwYmxrX3QgYmxvY2s7CisJc3RydWN0IGV4dDRfZnJlZV9kYXRhICplbnRyeTsKIAlzdHJ1Y3QgZXh0NF9ncm91cF9pbmZvICpkYiA9IGU0Yi0+YmRfaW5mbzsKIAlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gZTRiLT5iZF9zYjsKIAlzdHJ1Y3QgZXh0NF9zYl9pbmZvICpzYmkgPSBFWFQ0X1NCKHNiKTsKLQlzdHJ1Y3QgZXh0NF9mcmVlX2RhdGEgKmVudHJ5LCAqbmV3X2VudHJ5OwogCXN0cnVjdCByYl9ub2RlICoqbiA9ICZkYi0+YmJfZnJlZV9yb290LnJiX25vZGUsICpub2RlOwogCXN0cnVjdCByYl9ub2RlICpwYXJlbnQgPSBOVUxMLCAqbmV3X25vZGU7CiAKLQorCUJVR19PTighZXh0NF9oYW5kbGVfdmFsaWQoaGFuZGxlKSk7CiAJQlVHX09OKGU0Yi0+YmRfYml0bWFwX3BhZ2UgPT0gTlVMTCk7CiAJQlVHX09OKGU0Yi0+YmRfYnVkZHlfcGFnZSA9PSBOVUxMKTsKIAotCW5ld19lbnRyeSAgPSBrbWVtX2NhY2hlX2FsbG9jKGV4dDRfZnJlZV9leHRfY2FjaGVwLCBHRlBfTk9GUyk7Ci0JbmV3X2VudHJ5LT5zdGFydF9ibGsgPSBibG9jazsKLQluZXdfZW50cnktPmdyb3VwICA9IGdyb3VwOwotCW5ld19lbnRyeS0+Y291bnQgPSBjb3VudDsKLQluZXdfZW50cnktPnRfdGlkID0gaGFuZGxlLT5oX3RyYW5zYWN0aW9uLT50X3RpZDsKIAluZXdfbm9kZSA9ICZuZXdfZW50cnktPm5vZGU7CisJYmxvY2sgPSBuZXdfZW50cnktPnN0YXJ0X2JsazsKIAotCWV4dDRfbG9ja19ncm91cChzYiwgZ3JvdXApOwogCWlmICghKm4pIHsKIAkJLyogZmlyc3QgZnJlZSBibG9jayBleGVudC4gV2UgbmVlZCB0bwogCQkgICBwcm90ZWN0IGJ1ZGR5IGNhY2hlIGZyb20gYmVpbmcgZnJlZWQsCkBAIC00NDQxLDEwICs0NzIwLDkgQEAKIAkJZWxzZSBpZiAoYmxvY2sgPj0gKGVudHJ5LT5zdGFydF9ibGsgKyBlbnRyeS0+Y291bnQpKQogCQkJbiA9ICYoKm4pLT5yYl9yaWdodDsKIAkJZWxzZSB7Ci0JCQlleHQ0X3VubG9ja19ncm91cChzYiwgZ3JvdXApOwotCQkJZXh0NF9lcnJvcihzYiwgX19mdW5jX18sCi0JCQkgICAgIkRvdWJsZSBmcmVlIG9mIGJsb2NrcyAlZCAoJWQgJWQpXG4iLAotCQkJICAgIGJsb2NrLCBlbnRyeS0+c3RhcnRfYmxrLCBlbnRyeS0+Y291bnQpOworCQkJZXh0NF9ncnBfbG9ja2VkX2Vycm9yKHNiLCBlNGItPmJkX2dyb3VwLCBfX2Z1bmNfXywKKwkJCQkJIkRvdWJsZSBmcmVlIG9mIGJsb2NrcyAlZCAoJWQgJWQpIiwKKwkJCQkJYmxvY2ssIGVudHJ5LT5zdGFydF9ibGssIGVudHJ5LT5jb3VudCk7CiAJCQlyZXR1cm4gMDsKIAkJfQogCX0KQEAgLTQ0ODMsNyArNDc2MSw2IEBACiAJc3Bpbl9sb2NrKCZzYmktPnNfbWRfbG9jayk7CiAJbGlzdF9hZGQoJm5ld19lbnRyeS0+bGlzdCwgJmhhbmRsZS0+aF90cmFuc2FjdGlvbi0+dF9wcml2YXRlX2xpc3QpOwogCXNwaW5fdW5sb2NrKCZzYmktPnNfbWRfbG9jayk7Ci0JZXh0NF91bmxvY2tfZ3JvdXAoc2IsIGdyb3VwKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNDQ5OSw3ICs0Nzc2LDcgQEAKIAlzdHJ1Y3QgZXh0NF9hbGxvY2F0aW9uX2NvbnRleHQgKmFjID0gTlVMTDsKIAlzdHJ1Y3QgZXh0NF9ncm91cF9kZXNjICpnZHA7CiAJc3RydWN0IGV4dDRfc3VwZXJfYmxvY2sgKmVzOwotCXVuc2lnbmVkIGxvbmcgb3ZlcmZsb3c7CisJdW5zaWduZWQgaW50IG92ZXJmbG93OwogCWV4dDRfZ3JwYmxrX3QgYml0OwogCXN0cnVjdCBidWZmZXJfaGVhZCAqZ2RfYmg7CiAJZXh0NF9ncm91cF90IGJsb2NrX2dyb3VwOwpAQCAtNDUyMiw2ICs0Nzk5LDEwIEBACiAJfQogCiAJZXh0NF9kZWJ1ZygiZnJlZWluZyBibG9jayAlbHVcbiIsIGJsb2NrKTsKKwl0cmFjZV9tYXJrKGV4dDRfZnJlZV9ibG9ja3MsCisJCSAgICJkZXYgJXMgYmxvY2sgJWxsdSBjb3VudCAlbHUgbWV0YWRhdGEgJWQgaW5vICVsdSIsCisJCSAgIHNiLT5zX2lkLCAodW5zaWduZWQgbG9uZyBsb25nKSBibG9jaywgY291bnQsIG1ldGFkYXRhLAorCQkgICBpbm9kZSA/IGlub2RlLT5pX2lubyA6IDApOwogCiAJYWMgPSBrbWVtX2NhY2hlX2FsbG9jKGV4dDRfYWNfY2FjaGVwLCBHRlBfTk9GUyk7CiAJaWYgKGFjKSB7CkBAIC00NTgxLDExICs0ODYyLDYgQEAKIAllcnIgPSBleHQ0X2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGUsIGdkX2JoKTsKIAlpZiAoZXJyKQogCQlnb3RvIGVycm9yX3JldHVybjsKLQotCWVyciA9IGV4dDRfbWJfbG9hZF9idWRkeShzYiwgYmxvY2tfZ3JvdXAsICZlNGIpOwotCWlmIChlcnIpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCiAjaWZkZWYgQUdHUkVTU0lWRV9DSEVDSwogCXsKIAkJaW50IGk7CkBAIC00NTkzLDEzICs0ODY5LDYgQEAKIAkJCUJVR19PTighbWJfdGVzdF9iaXQoYml0ICsgaSwgYml0bWFwX2JoLT5iX2RhdGEpKTsKIAl9CiAjZW5kaWYKLQltYl9jbGVhcl9iaXRzKHNiX2JnbF9sb2NrKHNiaSwgYmxvY2tfZ3JvdXApLCBiaXRtYXBfYmgtPmJfZGF0YSwKLQkJCWJpdCwgY291bnQpOwotCi0JLyogV2UgZGlydGllZCB0aGUgYml0bWFwIGJsb2NrICovCi0JQlVGRkVSX1RSQUNFKGJpdG1hcF9iaCwgImRpcnRpZWQgYml0bWFwIGJsb2NrIik7Ci0JZXJyID0gZXh0NF9qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgYml0bWFwX2JoKTsKLQogCWlmIChhYykgewogCQlhYy0+YWNfYl9leC5mZV9ncm91cCA9IGJsb2NrX2dyb3VwOwogCQlhYy0+YWNfYl9leC5mZV9zdGFydCA9IGJpdDsKQEAgLTQ2MDcsMTkgKzQ4NzYsNDEgQEAKIAkJZXh0NF9tYl9zdG9yZV9oaXN0b3J5KGFjKTsKIAl9CiAKLQlpZiAobWV0YWRhdGEpIHsKLQkJLyogYmxvY2tzIGJlaW5nIGZyZWVkIGFyZSBtZXRhZGF0YS4gdGhlc2UgYmxvY2tzIHNob3VsZG4ndAotCQkgKiBiZSB1c2VkIHVudGlsIHRoaXMgdHJhbnNhY3Rpb24gaXMgY29tbWl0dGVkICovCi0JCWV4dDRfbWJfZnJlZV9tZXRhZGF0YShoYW5kbGUsICZlNGIsIGJsb2NrX2dyb3VwLCBiaXQsIGNvdW50KTsKKwllcnIgPSBleHQ0X21iX2xvYWRfYnVkZHkoc2IsIGJsb2NrX2dyb3VwLCAmZTRiKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycm9yX3JldHVybjsKKwlpZiAobWV0YWRhdGEgJiYgZXh0NF9oYW5kbGVfdmFsaWQoaGFuZGxlKSkgeworCQlzdHJ1Y3QgZXh0NF9mcmVlX2RhdGEgKm5ld19lbnRyeTsKKwkJLyoKKwkJICogYmxvY2tzIGJlaW5nIGZyZWVkIGFyZSBtZXRhZGF0YS4gdGhlc2UgYmxvY2tzIHNob3VsZG4ndAorCQkgKiBiZSB1c2VkIHVudGlsIHRoaXMgdHJhbnNhY3Rpb24gaXMgY29tbWl0dGVkCisJCSAqLworCQluZXdfZW50cnkgID0ga21lbV9jYWNoZV9hbGxvYyhleHQ0X2ZyZWVfZXh0X2NhY2hlcCwgR0ZQX05PRlMpOworCQluZXdfZW50cnktPnN0YXJ0X2JsayA9IGJpdDsKKwkJbmV3X2VudHJ5LT5ncm91cCAgPSBibG9ja19ncm91cDsKKwkJbmV3X2VudHJ5LT5jb3VudCA9IGNvdW50OworCQluZXdfZW50cnktPnRfdGlkID0gaGFuZGxlLT5oX3RyYW5zYWN0aW9uLT50X3RpZDsKKwkJZXh0NF9sb2NrX2dyb3VwKHNiLCBibG9ja19ncm91cCk7CisJCW1iX2NsZWFyX2JpdHMoc2JfYmdsX2xvY2soc2JpLCBibG9ja19ncm91cCksIGJpdG1hcF9iaC0+Yl9kYXRhLAorCQkJCWJpdCwgY291bnQpOworCQlleHQ0X21iX2ZyZWVfbWV0YWRhdGEoaGFuZGxlLCAmZTRiLCBuZXdfZW50cnkpOworCQlleHQ0X3VubG9ja19ncm91cChzYiwgYmxvY2tfZ3JvdXApOwogCX0gZWxzZSB7CiAJCWV4dDRfbG9ja19ncm91cChzYiwgYmxvY2tfZ3JvdXApOworCQkvKiBuZWVkIHRvIHVwZGF0ZSBncm91cF9pbmZvLT5iYl9mcmVlIGFuZCBiaXRtYXAKKwkJICogd2l0aCBncm91cCBsb2NrIGhlbGQuIGdlbmVyYXRlX2J1ZGR5IGxvb2sgYXQKKwkJICogdGhlbSB3aXRoIGdyb3VwIGxvY2tfaGVsZAorCQkgKi8KKwkJbWJfY2xlYXJfYml0cyhzYl9iZ2xfbG9jayhzYmksIGJsb2NrX2dyb3VwKSwgYml0bWFwX2JoLT5iX2RhdGEsCisJCQkJYml0LCBjb3VudCk7CiAJCW1iX2ZyZWVfYmxvY2tzKGlub2RlLCAmZTRiLCBiaXQsIGNvdW50KTsKIAkJZXh0NF9tYl9yZXR1cm5fdG9fcHJlYWxsb2NhdGlvbihpbm9kZSwgJmU0YiwgYmxvY2ssIGNvdW50KTsKIAkJZXh0NF91bmxvY2tfZ3JvdXAoc2IsIGJsb2NrX2dyb3VwKTsKIAl9CiAKIAlzcGluX2xvY2soc2JfYmdsX2xvY2soc2JpLCBibG9ja19ncm91cCkpOwotCWxlMTZfYWRkX2NwdSgmZ2RwLT5iZ19mcmVlX2Jsb2Nrc19jb3VudCwgY291bnQpOworCXJldCA9IGV4dDRfZnJlZV9ibGtzX2NvdW50KHNiLCBnZHApICsgY291bnQ7CisJZXh0NF9mcmVlX2Jsa3Nfc2V0KHNiLCBnZHAsIHJldCk7CiAJZ2RwLT5iZ19jaGVja3N1bSA9IGV4dDRfZ3JvdXBfZGVzY19jc3VtKHNiaSwgYmxvY2tfZ3JvdXAsIGdkcCk7CiAJc3Bpbl91bmxvY2soc2JfYmdsX2xvY2soc2JpLCBibG9ja19ncm91cCkpOwogCXBlcmNwdV9jb3VudGVyX2FkZCgmc2JpLT5zX2ZyZWVibG9ja3NfY291bnRlciwgY291bnQpOwpAQCAtNDYzNSw5ICs0OTI2LDEzIEBACiAKIAkqZnJlZWQgKz0gY291bnQ7CiAKKwkvKiBXZSBkaXJ0aWVkIHRoZSBiaXRtYXAgYmxvY2sgKi8KKwlCVUZGRVJfVFJBQ0UoYml0bWFwX2JoLCAiZGlydGllZCBiaXRtYXAgYmxvY2siKTsKKwllcnIgPSBleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIE5VTEwsIGJpdG1hcF9iaCk7CisKIAkvKiBBbmQgdGhlIGdyb3VwIGRlc2NyaXB0b3IgYmxvY2sgKi8KIAlCVUZGRVJfVFJBQ0UoZ2RfYmgsICJkaXJ0aWVkIGdyb3VwIGRlc2NyaXB0b3IgYmxvY2siKTsKLQlyZXQgPSBleHQ0X2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBnZF9iaCk7CisJcmV0ID0gZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBOVUxMLCBnZF9iaCk7CiAJaWYgKCFlcnIpCiAJCWVyciA9IHJldDsKIApkaWZmIC0tZ2l0IGEvZnMvZXh0NC9tYmFsbG9jLmggYi9mcy9leHQ0L21iYWxsb2MuaAppbmRleCBiNWRmZjFmLi4xMGEyOTIxIDEwMDY0NAotLS0gYS9mcy9leHQ0L21iYWxsb2MuaAorKysgYi9mcy9leHQ0L21iYWxsb2MuaApAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KICNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KICNpbmNsdWRlIDxsaW51eC9tYXJrZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgImV4dDRfamJkMi5oIgogI2luY2x1ZGUgImV4dDQuaCIKICNpbmNsdWRlICJncm91cC5oIgpAQCAtOTgsOSArOTksNiBAQAogICovCiAjZGVmaW5lIE1CX0RFRkFVTFRfR1JPVVBfUFJFQUxMT0MJNTEyCiAKLXN0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqZXh0NF9wc3BhY2VfY2FjaGVwOwotc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICpleHQ0X2FjX2NhY2hlcDsKLXN0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqZXh0NF9mcmVlX2V4dF9jYWNoZXA7CiAKIHN0cnVjdCBleHQ0X2ZyZWVfZGF0YSB7CiAJLyogdGhpcyBsaW5rcyB0aGUgZnJlZSBibG9jayBpbmZvcm1hdGlvbiBmcm9tIGdyb3VwX2luZm8gKi8KQEAgLTEyMCwyNiArMTE4LDYgQEAKIAl0aWRfdAl0X3RpZDsKIH07CiAKLXN0cnVjdCBleHQ0X2dyb3VwX2luZm8gewotCXVuc2lnbmVkIGxvbmcJYmJfc3RhdGU7Ci0Jc3RydWN0IHJiX3Jvb3QgIGJiX2ZyZWVfcm9vdDsKLQl1bnNpZ25lZCBzaG9ydAliYl9maXJzdF9mcmVlOwotCXVuc2lnbmVkIHNob3J0CWJiX2ZyZWU7Ci0JdW5zaWduZWQgc2hvcnQJYmJfZnJhZ21lbnRzOwotCXN0cnVjdAkJbGlzdF9oZWFkIGJiX3ByZWFsbG9jX2xpc3Q7Ci0jaWZkZWYgRE9VQkxFX0NIRUNLCi0Jdm9pZAkJKmJiX2JpdG1hcDsKLSNlbmRpZgotCXVuc2lnbmVkIHNob3J0CWJiX2NvdW50ZXJzW107Ci19OwotCi0jZGVmaW5lIEVYVDRfR1JPVVBfSU5GT19ORUVEX0lOSVRfQklUCTAKLSNkZWZpbmUgRVhUNF9HUk9VUF9JTkZPX0xPQ0tFRF9CSVQJMQotCi0jZGVmaW5lIEVYVDRfTUJfR1JQX05FRURfSU5JVChncnApCVwKLQkodGVzdF9iaXQoRVhUNF9HUk9VUF9JTkZPX05FRURfSU5JVF9CSVQsICYoKGdycCktPmJiX3N0YXRlKSkpCi0KLQogc3RydWN0IGV4dDRfcHJlYWxsb2Nfc3BhY2UgewogCXN0cnVjdCBsaXN0X2hlYWQJcGFfaW5vZGVfbGlzdDsKIAlzdHJ1Y3QgbGlzdF9oZWFkCXBhX2dyb3VwX2xpc3Q7CkBAIC0yMTcsNiArMTk1LDExIEBACiAJX191OCBhY19vcDsJCS8qIG9wZXJhdGlvbiwgZm9yIGhpc3Rvcnkgb25seSAqLwogCXN0cnVjdCBwYWdlICphY19iaXRtYXBfcGFnZTsKIAlzdHJ1Y3QgcGFnZSAqYWNfYnVkZHlfcGFnZTsKKwkvKgorCSAqIHBvaW50ZXIgdG8gdGhlIGhlbGQgc2VtYXBob3JlIHVwb24gc3VjY2Vzc2Z1bAorCSAqIGJsb2NrIGFsbG9jYXRpb24KKwkgKi8KKwlzdHJ1Y3Qgcndfc2VtYXBob3JlICphbGxvY19zZW1wOwogCXN0cnVjdCBleHQ0X3ByZWFsbG9jX3NwYWNlICphY19wYTsKIAlzdHJ1Y3QgZXh0NF9sb2NhbGl0eV9ncm91cCAqYWNfbGc7CiB9OwpAQCAtMjUwLDYgKzIzMyw3IEBACiAJc3RydWN0IHN1cGVyX2Jsb2NrICpiZF9zYjsKIAlfX3UxNiBiZF9ibGtiaXRzOwogCWV4dDRfZ3JvdXBfdCBiZF9ncm91cDsKKwlzdHJ1Y3Qgcndfc2VtYXBob3JlICphbGxvY19zZW1wOwogfTsKICNkZWZpbmUgRVhUNF9NQl9CSVRNQVAoZTRiKQkoKGU0YiktPmJkX2JpdG1hcCkKICNkZWZpbmUgRVhUNF9NQl9CVUREWShlNGIpCSgoZTRiKS0+YmRfYnVkZHkpCkBAIC0yNTksNTEgKzI0MywxMiBAQAogewogCXJldHVybjsKIH0KLSNlbHNlCi1zdGF0aWMgdm9pZCBleHQ0X21iX3N0b3JlX2hpc3Rvcnkoc3RydWN0IGV4dDRfYWxsb2NhdGlvbl9jb250ZXh0ICphYyk7CiAjZW5kaWYKIAogI2RlZmluZSBpbl9yYW5nZShiLCBmaXJzdCwgbGVuKQkoKGIpID49IChmaXJzdCkgJiYgKGIpIDw9IChmaXJzdCkgKyAobGVuKSAtIDEpCiAKIHN0cnVjdCBidWZmZXJfaGVhZCAqcmVhZF9ibG9ja19iaXRtYXAoc3RydWN0IHN1cGVyX2Jsb2NrICosIGV4dDRfZ3JvdXBfdCk7Ci0KLXN0YXRpYyB2b2lkIGV4dDRfbWJfZ2VuZXJhdGVfZnJvbV9wYShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB2b2lkICpiaXRtYXAsCi0JCQkJCWV4dDRfZ3JvdXBfdCBncm91cCk7Ci1zdGF0aWMgdm9pZCBleHQ0X21iX3JldHVybl90b19wcmVhbGxvY2F0aW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCQkJCXN0cnVjdCBleHQ0X2J1ZGR5ICplNGIsIHNlY3Rvcl90IGJsb2NrLAotCQkJCQlpbnQgY291bnQpOwotc3RhdGljIHZvaWQgZXh0NF9tYl9wdXRfcGEoc3RydWN0IGV4dDRfYWxsb2NhdGlvbl9jb250ZXh0ICosCi0JCQlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgc3RydWN0IGV4dDRfcHJlYWxsb2Nfc3BhY2UgKnBhKTsKLXN0YXRpYyBpbnQgZXh0NF9tYl9pbml0X3Blcl9kZXZfcHJvYyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKTsKLXN0YXRpYyBpbnQgZXh0NF9tYl9kZXN0cm95X3Blcl9kZXZfcHJvYyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKTsKLXN0YXRpYyB2b2lkIHJlbGVhc2VfYmxvY2tzX29uX2NvbW1pdChqb3VybmFsX3QgKmpvdXJuYWwsIHRyYW5zYWN0aW9uX3QgKnR4bik7Ci0KLQotc3RhdGljIGlubGluZSB2b2lkIGV4dDRfbG9ja19ncm91cChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBleHQ0X2dyb3VwX3QgZ3JvdXApCi17Ci0Jc3RydWN0IGV4dDRfZ3JvdXBfaW5mbyAqZ3JpbmZvID0gZXh0NF9nZXRfZ3JvdXBfaW5mbyhzYiwgZ3JvdXApOwotCi0JYml0X3NwaW5fbG9jayhFWFQ0X0dST1VQX0lORk9fTE9DS0VEX0JJVCwgJihncmluZm8tPmJiX3N0YXRlKSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBleHQ0X3VubG9ja19ncm91cChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAotCQkJCQlleHQ0X2dyb3VwX3QgZ3JvdXApCi17Ci0Jc3RydWN0IGV4dDRfZ3JvdXBfaW5mbyAqZ3JpbmZvID0gZXh0NF9nZXRfZ3JvdXBfaW5mbyhzYiwgZ3JvdXApOwotCi0JYml0X3NwaW5fdW5sb2NrKEVYVDRfR1JPVVBfSU5GT19MT0NLRURfQklULCAmKGdyaW5mby0+YmJfc3RhdGUpKTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgZXh0NF9pc19ncm91cF9sb2NrZWQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKLQkJCQkJZXh0NF9ncm91cF90IGdyb3VwKQotewotCXN0cnVjdCBleHQ0X2dyb3VwX2luZm8gKmdyaW5mbyA9IGV4dDRfZ2V0X2dyb3VwX2luZm8oc2IsIGdyb3VwKTsKLQotCXJldHVybiBiaXRfc3Bpbl9pc19sb2NrZWQoRVhUNF9HUk9VUF9JTkZPX0xPQ0tFRF9CSVQsCi0JCQkJCQkmKGdyaW5mby0+YmJfc3RhdGUpKTsKLX0KLQotc3RhdGljIGV4dDRfZnNibGtfdCBleHQ0X2dycF9vZmZzX3RvX2Jsb2NrKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCitzdGF0aWMgaW5saW5lIGV4dDRfZnNibGtfdCBleHQ0X2dycF9vZmZzX3RvX2Jsb2NrKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCiAJCQkJCXN0cnVjdCBleHQ0X2ZyZWVfZXh0ZW50ICpmZXgpCiB7CiAJZXh0NF9mc2Jsa190IGJsb2NrOwpkaWZmIC0tZ2l0IGEvZnMvZXh0NC9taWdyYXRlLmMgYi9mcy9leHQ0L21pZ3JhdGUuYwppbmRleCBmMmE5Y2Y0Li43MzRhYmNhIDEwMDY0NAotLS0gYS9mcy9leHQ0L21pZ3JhdGUuYworKysgYi9mcy9leHQ0L21pZ3JhdGUuYwpAQCAtNTksNyArNTksOCBAQAogCS8qCiAJICogTWFrZSBzdXJlIHRoZSBjcmVkaXQgd2UgYWNjdW1hbGF0ZWQgaXMgbm90IHJlYWxseSBoaWdoCiAJICovCi0JaWYgKG5lZWRlZCAmJiBoYW5kbGUtPmhfYnVmZmVyX2NyZWRpdHMgPj0gRVhUNF9SRVNFUlZFX1RSQU5TX0JMT0NLUykgeworCWlmIChuZWVkZWQgJiYgZXh0NF9oYW5kbGVfaGFzX2Vub3VnaF9jcmVkaXRzKGhhbmRsZSwKKwkJCQkJCUVYVDRfUkVTRVJWRV9UUkFOU19CTE9DS1MpKSB7CiAJCXJldHZhbCA9IGV4dDRfam91cm5hbF9yZXN0YXJ0KGhhbmRsZSwgbmVlZGVkKTsKIAkJaWYgKHJldHZhbCkKIAkJCWdvdG8gZXJyX291dDsKQEAgLTIyOSw3ICsyMzAsNyBAQAogewogCWludCByZXR2YWwgPSAwLCBuZWVkZWQ7CiAKLQlpZiAoaGFuZGxlLT5oX2J1ZmZlcl9jcmVkaXRzID4gRVhUNF9SRVNFUlZFX1RSQU5TX0JMT0NLUykKKwlpZiAoZXh0NF9oYW5kbGVfaGFzX2Vub3VnaF9jcmVkaXRzKGhhbmRsZSwgRVhUNF9SRVNFUlZFX1RSQU5TX0JMT0NLUysxKSkKIAkJcmV0dXJuIDA7CiAJLyoKIAkgKiBXZSBhcmUgZnJlZWluZyBhIGJsb2Nrcy4gRHVyaW5nIHRoaXMgd2UgdG91Y2gKQEAgLTQ1OCwxMyArNDU5LDEzIEBACiAJc3RydWN0IGxpc3RfYmxvY2tzX3N0cnVjdCBsYjsKIAl1bnNpZ25lZCBsb25nIG1heF9lbnRyaWVzOwogCi0JaWYgKCF0ZXN0X29wdChpbm9kZS0+aV9zYiwgRVhURU5UUykpCi0JCS8qCi0JCSAqIGlmIG1vdW50ZWQgd2l0aCBub2V4dGVudHMgd2UgZG9uJ3QgYWxsb3cgdGhlIG1pZ3JhdGUKLQkJICovCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKChFWFQ0X0koaW5vZGUpLT5pX2ZsYWdzICYgRVhUNF9FWFRFTlRTX0ZMKSkKKwkvKgorCSAqIElmIHRoZSBmaWxlc3lzdGVtIGRvZXMgbm90IHN1cHBvcnQgZXh0ZW50cywgb3IgdGhlIGlub2RlCisJICogYWxyZWFkeSBpcyBleHRlbnQtYmFzZWQsIGVycm9yIG91dC4KKwkgKi8KKwlpZiAoIUVYVDRfSEFTX0lOQ09NUEFUX0ZFQVRVUkUoaW5vZGUtPmlfc2IsCisJCQkJICAgICAgIEVYVDRfRkVBVFVSRV9JTkNPTVBBVF9FWFRFTlRTKSB8fAorCSAgICAoRVhUNF9JKGlub2RlKS0+aV9mbGFncyAmIEVYVDRfRVhURU5UU19GTCkpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJaWYgKFNfSVNMTksoaW5vZGUtPmlfbW9kZSkgJiYgaW5vZGUtPmlfYmxvY2tzID09IDApCmRpZmYgLS1naXQgYS9mcy9leHQ0L25hbWVpLmMgYi9mcy9leHQ0L25hbWVpLmMKaW5kZXggOWZkMmE1ZS4uZmVjMGI0YyAxMDA2NDQKLS0tIGEvZnMvZXh0NC9uYW1laS5jCisrKyBiL2ZzL2V4dDQvbmFtZWkuYwpAQCAtNzQsMTAgKzc0LDYgQEAKICNkZWZpbmUgYXNzZXJ0KHRlc3QpIEpfQVNTRVJUKHRlc3QpCiAjZW5kaWYKIAotI2lmbmRlZiBzd2FwCi0jZGVmaW5lIHN3YXAoeCwgeSkgZG8geyB0eXBlb2YoeCkgeiA9IHg7IHggPSB5OyB5ID0gejsgfSB3aGlsZSAoMCkKLSNlbmRpZgotCiAjaWZkZWYgRFhfREVCVUcKICNkZWZpbmUgZHh0cmFjZShjb21tYW5kKSBjb21tYW5kCiAjZWxzZQpAQCAtMzcyLDYgKzM2OCw4IEBACiAJCWdvdG8gZmFpbDsKIAl9CiAJaGluZm8tPmhhc2hfdmVyc2lvbiA9IHJvb3QtPmluZm8uaGFzaF92ZXJzaW9uOworCWlmIChoaW5mby0+aGFzaF92ZXJzaW9uIDw9IERYX0hBU0hfVEVBKQorCQloaW5mby0+aGFzaF92ZXJzaW9uICs9IEVYVDRfU0IoZGlyLT5pX3NiKS0+c19oYXNoX3Vuc2lnbmVkOwogCWhpbmZvLT5zZWVkID0gRVhUNF9TQihkaXItPmlfc2IpLT5zX2hhc2hfc2VlZDsKIAlpZiAoZF9uYW1lKQogCQlleHQ0ZnNfZGlyaGFzaChkX25hbWUtPm5hbWUsIGRfbmFtZS0+bGVuLCBoaW5mbyk7CkBAIC02NDEsNiArNjM5LDkgQEAKIAlkaXIgPSBkaXJfZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKIAlpZiAoIShFWFQ0X0koZGlyKS0+aV9mbGFncyAmIEVYVDRfSU5ERVhfRkwpKSB7CiAJCWhpbmZvLmhhc2hfdmVyc2lvbiA9IEVYVDRfU0IoZGlyLT5pX3NiKS0+c19kZWZfaGFzaF92ZXJzaW9uOworCQlpZiAoaGluZm8uaGFzaF92ZXJzaW9uIDw9IERYX0hBU0hfVEVBKQorCQkJaGluZm8uaGFzaF92ZXJzaW9uICs9CisJCQkJRVhUNF9TQihkaXItPmlfc2IpLT5zX2hhc2hfdW5zaWduZWQ7CiAJCWhpbmZvLnNlZWQgPSBFWFQ0X1NCKGRpci0+aV9zYiktPnNfaGFzaF9zZWVkOwogCQljb3VudCA9IGh0cmVlX2RpcmJsb2NrX3RvX3RyZWUoZGlyX2ZpbGUsIGRpciwgMCwgJmhpbmZvLAogCQkJCQkgICAgICAgc3RhcnRfaGFzaCwgc3RhcnRfbWlub3JfaGFzaCk7CkBAIC04MDYsNyArODA3LDcgQEAKIHN0YXRpYyBpbmxpbmUgaW50IHNlYXJjaF9kaXJibG9jayhzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLAogCQkJCSAgc3RydWN0IGlub2RlICpkaXIsCiAJCQkJICBjb25zdCBzdHJ1Y3QgcXN0ciAqZF9uYW1lLAotCQkJCSAgdW5zaWduZWQgbG9uZyBvZmZzZXQsCisJCQkJICB1bnNpZ25lZCBpbnQgb2Zmc2V0LAogCQkJCSAgc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKiogcmVzX2RpcikKIHsKIAlzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqIGRlOwpAQCAtMTA0MywxMSArMTA0NCwxMSBAQAogCWJoID0gZXh0NF9maW5kX2VudHJ5KGRpciwgJmRlbnRyeS0+ZF9uYW1lLCAmZGUpOwogCWlub2RlID0gTlVMTDsKIAlpZiAoYmgpIHsKLQkJdW5zaWduZWQgbG9uZyBpbm8gPSBsZTMyX3RvX2NwdShkZS0+aW5vZGUpOworCQlfX3UzMiBpbm8gPSBsZTMyX3RvX2NwdShkZS0+aW5vZGUpOwogCQlicmVsc2UoYmgpOwogCQlpZiAoIWV4dDRfdmFsaWRfaW51bShkaXItPmlfc2IsIGlubykpIHsKIAkJCWV4dDRfZXJyb3IoZGlyLT5pX3NiLCAiZXh0NF9sb29rdXAiLAotCQkJCSAgICJiYWQgaW5vZGUgbnVtYmVyOiAlbHUiLCBpbm8pOworCQkJCSAgICJiYWQgaW5vZGUgbnVtYmVyOiAldSIsIGlubyk7CiAJCQlyZXR1cm4gRVJSX1BUUigtRUlPKTsKIAkJfQogCQlpbm9kZSA9IGV4dDRfaWdldChkaXItPmlfc2IsIGlubyk7CkBAIC0xMDYwLDcgKzEwNjEsNyBAQAogCiBzdHJ1Y3QgZGVudHJ5ICpleHQ0X2dldF9wYXJlbnQoc3RydWN0IGRlbnRyeSAqY2hpbGQpCiB7Ci0JdW5zaWduZWQgbG9uZyBpbm87CisJX191MzIgaW5vOwogCXN0cnVjdCBpbm9kZSAqaW5vZGU7CiAJc3RhdGljIGNvbnN0IHN0cnVjdCBxc3RyIGRvdGRvdCA9IHsKIAkJLm5hbWUgPSAiLi4iLApAQCAtMTA3OCw3ICsxMDc5LDcgQEAKIAogCWlmICghZXh0NF92YWxpZF9pbnVtKGNoaWxkLT5kX2lub2RlLT5pX3NiLCBpbm8pKSB7CiAJCWV4dDRfZXJyb3IoY2hpbGQtPmRfaW5vZGUtPmlfc2IsICJleHQ0X2dldF9wYXJlbnQiLAotCQkJICAgImJhZCBpbm9kZSBudW1iZXI6ICVsdSIsIGlubyk7CisJCQkgICAiYmFkIGlub2RlIG51bWJlcjogJXUiLCBpbm8pOwogCQlyZXR1cm4gRVJSX1BUUigtRUlPKTsKIAl9CiAKQEAgLTExNjYsOSArMTE2Nyw5IEBACiAJdTMyIGhhc2gyOwogCXN0cnVjdCBkeF9tYXBfZW50cnkgKm1hcDsKIAljaGFyICpkYXRhMSA9ICgqYmgpLT5iX2RhdGEsICpkYXRhMjsKLQl1bnNpZ25lZCBzcGxpdCwgbW92ZSwgc2l6ZSwgaTsKKwl1bnNpZ25lZCBzcGxpdCwgbW92ZSwgc2l6ZTsKIAlzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqZGUgPSBOVUxMLCAqZGUyOwotCWludAllcnIgPSAwOworCWludAllcnIgPSAwLCBpOwogCiAJYmgyID0gZXh0NF9hcHBlbmQgKGhhbmRsZSwgZGlyLCAmbmV3YmxvY2ssICZlcnIpOwogCWlmICghKGJoMikpIHsKQEAgLTEyMjgsMTAgKzEyMjksMTAgQEAKIAkJZGUgPSBkZTI7CiAJfQogCWR4X2luc2VydF9ibG9jayhmcmFtZSwgaGFzaDIgKyBjb250aW51ZWQsIG5ld2Jsb2NrKTsKLQllcnIgPSBleHQ0X2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBiaDIpOworCWVyciA9IGV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgZGlyLCBiaDIpOwogCWlmIChlcnIpCiAJCWdvdG8gam91cm5hbF9lcnJvcjsKLQllcnIgPSBleHQ0X2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBmcmFtZS0+YmgpOworCWVyciA9IGV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgZGlyLCBmcmFtZS0+YmgpOwogCWlmIChlcnIpCiAJCWdvdG8gam91cm5hbF9lcnJvcjsKIAlicmVsc2UoYmgyKTsKQEAgLTEyNjYsNyArMTI2Nyw3IEBACiAJc3RydWN0IGlub2RlCSpkaXIgPSBkZW50cnktPmRfcGFyZW50LT5kX2lub2RlOwogCWNvbnN0IGNoYXIJKm5hbWUgPSBkZW50cnktPmRfbmFtZS5uYW1lOwogCWludAkJbmFtZWxlbiA9IGRlbnRyeS0+ZF9uYW1lLmxlbjsKLQl1bnNpZ25lZCBsb25nCW9mZnNldCA9IDA7CisJdW5zaWduZWQgaW50CW9mZnNldCA9IDA7CiAJdW5zaWduZWQgc2hvcnQJcmVjbGVuOwogCWludAkJbmxlbiwgcmxlbiwgZXJyOwogCWNoYXIJCSp0b3A7CkBAIC0xMzM1LDggKzEzMzYsOCBAQAogCWV4dDRfdXBkYXRlX2R4X2ZsYWcoZGlyKTsKIAlkaXItPmlfdmVyc2lvbisrOwogCWV4dDRfbWFya19pbm9kZV9kaXJ0eShoYW5kbGUsIGRpcik7Ci0JQlVGRkVSX1RSQUNFKGJoLCAiY2FsbCBleHQ0X2pvdXJuYWxfZGlydHlfbWV0YWRhdGEiKTsKLQllcnIgPSBleHQ0X2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBiaCk7CisJQlVGRkVSX1RSQUNFKGJoLCAiY2FsbCBleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YSIpOworCWVyciA9IGV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgZGlyLCBiaCk7CiAJaWYgKGVycikKIAkJZXh0NF9zdGRfZXJyb3IoZGlyLT5pX3NiLCBlcnIpOwogCWJyZWxzZShiaCk7CkBAIC0xNDA4LDYgKzE0MDksOCBAQAogCiAJLyogSW5pdGlhbGl6ZSBhcyBmb3IgZHhfcHJvYmUgKi8KIAloaW5mby5oYXNoX3ZlcnNpb24gPSByb290LT5pbmZvLmhhc2hfdmVyc2lvbjsKKwlpZiAoaGluZm8uaGFzaF92ZXJzaW9uIDw9IERYX0hBU0hfVEVBKQorCQloaW5mby5oYXNoX3ZlcnNpb24gKz0gRVhUNF9TQihkaXItPmlfc2IpLT5zX2hhc2hfdW5zaWduZWQ7CiAJaGluZm8uc2VlZCA9IEVYVDRfU0IoZGlyLT5pX3NiKS0+c19oYXNoX3NlZWQ7CiAJZXh0NGZzX2Rpcmhhc2gobmFtZSwgbmFtZWxlbiwgJmhpbmZvKTsKIAlmcmFtZSA9IGZyYW1lczsKQEAgLTE0MzcsNyArMTQ0MCw2IEBACiAJCQkgIHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7CiAJc3RydWN0IGlub2RlICpkaXIgPSBkZW50cnktPmRfcGFyZW50LT5kX2lub2RlOwotCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OwogCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CiAJc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKmRlOwogCXN0cnVjdCBzdXBlcl9ibG9jayAqc2I7CkBAIC0xNDU5LDcgKzE0NjEsNyBAQAogCQlleHQ0X21hcmtfaW5vZGVfZGlydHkoaGFuZGxlLCBkaXIpOwogCX0KIAlibG9ja3MgPSBkaXItPmlfc2l6ZSA+PiBzYi0+c19ibG9ja3NpemVfYml0czsKLQlmb3IgKGJsb2NrID0gMCwgb2Zmc2V0ID0gMDsgYmxvY2sgPCBibG9ja3M7IGJsb2NrKyspIHsKKwlmb3IgKGJsb2NrID0gMDsgYmxvY2sgPCBibG9ja3M7IGJsb2NrKyspIHsKIAkJYmggPSBleHQ0X2JyZWFkKGhhbmRsZSwgZGlyLCBibG9jaywgMCwgJnJldHZhbCk7CiAJCWlmKCFiaCkKIAkJCXJldHVybiByZXR2YWw7CkBAIC0xNTc0LDcgKzE1NzYsNyBAQAogCQkJZHh0cmFjZShkeF9zaG93X2luZGV4KCJub2RlIiwgZnJhbWVzWzFdLmVudHJpZXMpKTsKIAkJCWR4dHJhY2UoZHhfc2hvd19pbmRleCgibm9kZSIsCiAJCQkgICAgICAgKChzdHJ1Y3QgZHhfbm9kZSAqKSBiaDItPmJfZGF0YSktPmVudHJpZXMpKTsKLQkJCWVyciA9IGV4dDRfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGJoMik7CisJCQllcnIgPSBleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGlub2RlLCBiaDIpOwogCQkJaWYgKGVycikKIAkJCQlnb3RvIGpvdXJuYWxfZXJyb3I7CiAJCQlicmVsc2UgKGJoMik7CkBAIC0xNjAwLDcgKzE2MDIsNyBAQAogCQkJaWYgKGVycikKIAkJCQlnb3RvIGpvdXJuYWxfZXJyb3I7CiAJCX0KLQkJZXh0NF9qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgZnJhbWVzWzBdLmJoKTsKKwkJZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBpbm9kZSwgZnJhbWVzWzBdLmJoKTsKIAl9CiAJZGUgPSBkb19zcGxpdChoYW5kbGUsIGRpciwgJmJoLCBmcmFtZSwgJmhpbmZvLCAmZXJyKTsKIAlpZiAoIWRlKQpAQCAtMTY0Niw4ICsxNjQ4LDggQEAKIAkJCWVsc2UKIAkJCQlkZS0+aW5vZGUgPSAwOwogCQkJZGlyLT5pX3ZlcnNpb24rKzsKLQkJCUJVRkZFUl9UUkFDRShiaCwgImNhbGwgZXh0NF9qb3VybmFsX2RpcnR5X21ldGFkYXRhIik7Ci0JCQlleHQ0X2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBiaCk7CisJCQlCVUZGRVJfVFJBQ0UoYmgsICJjYWxsIGV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhIik7CisJCQlleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGRpciwgYmgpOwogCQkJcmV0dXJuIDA7CiAJCX0KIAkJaSArPSBleHQ0X3JlY19sZW5fZnJvbV9kaXNrKGRlLT5yZWNfbGVuKTsKQEAgLTE3MjUsNyArMTcyNyw3IEBACiAJCXJldHVybiBQVFJfRVJSKGhhbmRsZSk7CiAKIAlpZiAoSVNfRElSU1lOQyhkaXIpKQotCQloYW5kbGUtPmhfc3luYyA9IDE7CisJCWV4dDRfaGFuZGxlX3N5bmMoaGFuZGxlKTsKIAogCWlub2RlID0gZXh0NF9uZXdfaW5vZGUgKGhhbmRsZSwgZGlyLCBtb2RlKTsKIAllcnIgPSBQVFJfRVJSKGlub2RlKTsKQEAgLTE3NTksNyArMTc2MSw3IEBACiAJCXJldHVybiBQVFJfRVJSKGhhbmRsZSk7CiAKIAlpZiAoSVNfRElSU1lOQyhkaXIpKQotCQloYW5kbGUtPmhfc3luYyA9IDE7CisJCWV4dDRfaGFuZGxlX3N5bmMoaGFuZGxlKTsKIAogCWlub2RlID0gZXh0NF9uZXdfaW5vZGUoaGFuZGxlLCBkaXIsIG1vZGUpOwogCWVyciA9IFBUUl9FUlIoaW5vZGUpOwpAQCAtMTc5NSw3ICsxNzk3LDcgQEAKIAkJcmV0dXJuIFBUUl9FUlIoaGFuZGxlKTsKIAogCWlmIChJU19ESVJTWU5DKGRpcikpCi0JCWhhbmRsZS0+aF9zeW5jID0gMTsKKwkJZXh0NF9oYW5kbGVfc3luYyhoYW5kbGUpOwogCiAJaW5vZGUgPSBleHQ0X25ld19pbm9kZShoYW5kbGUsIGRpciwgU19JRkRJUiB8IG1vZGUpOwogCWVyciA9IFBUUl9FUlIoaW5vZGUpOwpAQCAtMTgyNCw4ICsxODI2LDggQEAKIAlzdHJjcHkoZGUtPm5hbWUsICIuLiIpOwogCWV4dDRfc2V0X2RlX3R5cGUoZGlyLT5pX3NiLCBkZSwgU19JRkRJUik7CiAJaW5vZGUtPmlfbmxpbmsgPSAyOwotCUJVRkZFUl9UUkFDRShkaXJfYmxvY2ssICJjYWxsIGV4dDRfam91cm5hbF9kaXJ0eV9tZXRhZGF0YSIpOwotCWV4dDRfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGRpcl9ibG9jayk7CisJQlVGRkVSX1RSQUNFKGRpcl9ibG9jaywgImNhbGwgZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEiKTsKKwlleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGRpciwgZGlyX2Jsb2NrKTsKIAlicmVsc2UoZGlyX2Jsb2NrKTsKIAlleHQ0X21hcmtfaW5vZGVfZGlydHkoaGFuZGxlLCBpbm9kZSk7CiAJZXJyID0gZXh0NF9hZGRfZW50cnkoaGFuZGxlLCBkZW50cnksIGlub2RlKTsKQEAgLTE4NTQsNyArMTg1Niw3IEBACiAgKi8KIHN0YXRpYyBpbnQgZW1wdHlfZGlyKHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7Ci0JdW5zaWduZWQgbG9uZyBvZmZzZXQ7CisJdW5zaWduZWQgaW50IG9mZnNldDsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOwogCXN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICpkZSwgKmRlMTsKIAlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiOwpAQCAtMTg5OSw3ICsxOTAxLDcgQEAKIAkJCQlpZiAoZXJyKQogCQkJCQlleHQ0X2Vycm9yKHNiLCBfX2Z1bmNfXywKIAkJCQkJCSAgICJlcnJvciAlZCByZWFkaW5nIGRpcmVjdG9yeSIKLQkJCQkJCSAgICIgIyVsdSBvZmZzZXQgJWx1IiwKKwkJCQkJCSAgICIgIyVsdSBvZmZzZXQgJXUiLAogCQkJCQkJICAgZXJyLCBpbm9kZS0+aV9pbm8sIG9mZnNldCk7CiAJCQkJb2Zmc2V0ICs9IHNiLT5zX2Jsb2Nrc2l6ZTsKIAkJCQljb250aW51ZTsKQEAgLTE5MzcsNiArMTkzOSw5IEBACiAJc3RydWN0IGV4dDRfaWxvYyBpbG9jOwogCWludCBlcnIgPSAwLCByYzsKIAorCWlmICghZXh0NF9oYW5kbGVfdmFsaWQoaGFuZGxlKSkKKwkJcmV0dXJuIDA7CisKIAlsb2NrX3N1cGVyKHNiKTsKIAlpZiAoIWxpc3RfZW1wdHkoJkVYVDRfSShpbm9kZSktPmlfb3JwaGFuKSkKIAkJZ290byBvdXRfdW5sb2NrOwpAQCAtMTk2NSw3ICsxOTcwLDcgQEAKIAkvKiBJbnNlcnQgdGhpcyBpbm9kZSBhdCB0aGUgaGVhZCBvZiB0aGUgb24tZGlzayBvcnBoYW4gbGlzdC4uLiAqLwogCU5FWFRfT1JQSEFOKGlub2RlKSA9IGxlMzJfdG9fY3B1KEVYVDRfU0Ioc2IpLT5zX2VzLT5zX2xhc3Rfb3JwaGFuKTsKIAlFWFQ0X1NCKHNiKS0+c19lcy0+c19sYXN0X29ycGhhbiA9IGNwdV90b19sZTMyKGlub2RlLT5pX2lubyk7Ci0JZXJyID0gZXh0NF9qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgRVhUNF9TQihzYiktPnNfc2JoKTsKKwllcnIgPSBleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGlub2RlLCBFWFQ0X1NCKHNiKS0+c19zYmgpOwogCXJjID0gZXh0NF9tYXJrX2lsb2NfZGlydHkoaGFuZGxlLCBpbm9kZSwgJmlsb2MpOwogCWlmICghZXJyKQogCQllcnIgPSByYzsKQEAgLTE5OTksMTAgKzIwMDQsMTMgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkICpwcmV2OwogCXN0cnVjdCBleHQ0X2lub2RlX2luZm8gKmVpID0gRVhUNF9JKGlub2RlKTsKIAlzdHJ1Y3QgZXh0NF9zYl9pbmZvICpzYmk7Ci0JdW5zaWduZWQgbG9uZyBpbm9fbmV4dDsKKwlfX3UzMiBpbm9fbmV4dDsKIAlzdHJ1Y3QgZXh0NF9pbG9jIGlsb2M7CiAJaW50IGVyciA9IDA7CiAKKwlpZiAoIWV4dDRfaGFuZGxlX3ZhbGlkKGhhbmRsZSkpCisJCXJldHVybiAwOworCiAJbG9ja19zdXBlcihpbm9kZS0+aV9zYik7CiAJaWYgKGxpc3RfZW1wdHkoJmVpLT5pX29ycGhhbikpIHsKIAkJdW5sb2NrX3N1cGVyKGlub2RlLT5pX3NiKTsKQEAgLTIwMjEsNyArMjAyOSw3IEBACiAJICogdHJhbnNhY3Rpb24gaGFuZGxlIHdpdGggd2hpY2ggdG8gdXBkYXRlIHRoZSBvcnBoYW4gbGlzdCBvbgogCSAqIGRpc2ssIGJ1dCB3ZSBzdGlsbCBuZWVkIHRvIHJlbW92ZSB0aGUgaW5vZGUgZnJvbSB0aGUgbGlua2VkCiAJICogbGlzdCBpbiBtZW1vcnkuICovCi0JaWYgKCFoYW5kbGUpCisJaWYgKHNiaS0+c19qb3VybmFsICYmICFoYW5kbGUpCiAJCWdvdG8gb3V0OwogCiAJZXJyID0gZXh0NF9yZXNlcnZlX2lub2RlX3dyaXRlKGhhbmRsZSwgaW5vZGUsICZpbG9jKTsKQEAgLTIwMjksMTkgKzIwMzcsMTkgQEAKIAkJZ290byBvdXRfZXJyOwogCiAJaWYgKHByZXYgPT0gJnNiaS0+c19vcnBoYW4pIHsKLQkJamJkX2RlYnVnKDQsICJzdXBlcmJsb2NrIHdpbGwgcG9pbnQgdG8gJWx1XG4iLCBpbm9fbmV4dCk7CisJCWpiZF9kZWJ1Zyg0LCAic3VwZXJibG9jayB3aWxsIHBvaW50IHRvICV1XG4iLCBpbm9fbmV4dCk7CiAJCUJVRkZFUl9UUkFDRShzYmktPnNfc2JoLCAiZ2V0X3dyaXRlX2FjY2VzcyIpOwogCQllcnIgPSBleHQ0X2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGUsIHNiaS0+c19zYmgpOwogCQlpZiAoZXJyKQogCQkJZ290byBvdXRfYnJlbHNlOwogCQlzYmktPnNfZXMtPnNfbGFzdF9vcnBoYW4gPSBjcHVfdG9fbGUzMihpbm9fbmV4dCk7Ci0JCWVyciA9IGV4dDRfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIHNiaS0+c19zYmgpOworCQllcnIgPSBleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGlub2RlLCBzYmktPnNfc2JoKTsKIAl9IGVsc2UgewogCQlzdHJ1Y3QgZXh0NF9pbG9jIGlsb2MyOwogCQlzdHJ1Y3QgaW5vZGUgKmlfcHJldiA9CiAJCQkmbGlzdF9lbnRyeShwcmV2LCBzdHJ1Y3QgZXh0NF9pbm9kZV9pbmZvLCBpX29ycGhhbiktPnZmc19pbm9kZTsKIAotCQlqYmRfZGVidWcoNCwgIm9ycGhhbiBpbm9kZSAlbHUgd2lsbCBwb2ludCB0byAlbHVcbiIsCisJCWpiZF9kZWJ1Zyg0LCAib3JwaGFuIGlub2RlICVsdSB3aWxsIHBvaW50IHRvICV1XG4iLAogCQkJICBpX3ByZXYtPmlfaW5vLCBpbm9fbmV4dCk7CiAJCWVyciA9IGV4dDRfcmVzZXJ2ZV9pbm9kZV93cml0ZShoYW5kbGUsIGlfcHJldiwgJmlsb2MyKTsKIAkJaWYgKGVycikKQEAgLTIwODYsNyArMjA5NCw3IEBACiAJCWdvdG8gZW5kX3JtZGlyOwogCiAJaWYgKElTX0RJUlNZTkMoZGlyKSkKLQkJaGFuZGxlLT5oX3N5bmMgPSAxOworCQlleHQ0X2hhbmRsZV9zeW5jKGhhbmRsZSk7CiAKIAlpbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKIApAQCAtMjE0MCw3ICsyMTQ4LDcgQEAKIAkJcmV0dXJuIFBUUl9FUlIoaGFuZGxlKTsKIAogCWlmIChJU19ESVJTWU5DKGRpcikpCi0JCWhhbmRsZS0+aF9zeW5jID0gMTsKKwkJZXh0NF9oYW5kbGVfc3luYyhoYW5kbGUpOwogCiAJcmV0dmFsID0gLUVOT0VOVDsKIAliaCA9IGV4dDRfZmluZF9lbnRyeShkaXIsICZkZW50cnktPmRfbmFtZSwgJmRlKTsKQEAgLTIxOTcsNyArMjIwNSw3IEBACiAJCXJldHVybiBQVFJfRVJSKGhhbmRsZSk7CiAKIAlpZiAoSVNfRElSU1lOQyhkaXIpKQotCQloYW5kbGUtPmhfc3luYyA9IDE7CisJCWV4dDRfaGFuZGxlX3N5bmMoaGFuZGxlKTsKIAogCWlub2RlID0gZXh0NF9uZXdfaW5vZGUoaGFuZGxlLCBkaXIsIFNfSUZMTkt8U19JUldYVUdPKTsKIAllcnIgPSBQVFJfRVJSKGlub2RlKTsKQEAgLTIyNjAsNyArMjI2OCw3IEBACiAJCXJldHVybiBQVFJfRVJSKGhhbmRsZSk7CiAKIAlpZiAoSVNfRElSU1lOQyhkaXIpKQotCQloYW5kbGUtPmhfc3luYyA9IDE7CisJCWV4dDRfaGFuZGxlX3N5bmMoaGFuZGxlKTsKIAogCWlub2RlLT5pX2N0aW1lID0gZXh0NF9jdXJyZW50X3RpbWUoaW5vZGUpOwogCWV4dDRfaW5jX2NvdW50KGhhbmRsZSwgaW5vZGUpOwpAQCAtMjMwOSw3ICsyMzE3LDcgQEAKIAkJcmV0dXJuIFBUUl9FUlIoaGFuZGxlKTsKIAogCWlmIChJU19ESVJTWU5DKG9sZF9kaXIpIHx8IElTX0RJUlNZTkMobmV3X2RpcikpCi0JCWhhbmRsZS0+aF9zeW5jID0gMTsKKwkJZXh0NF9oYW5kbGVfc3luYyhoYW5kbGUpOwogCiAJb2xkX2JoID0gZXh0NF9maW5kX2VudHJ5KG9sZF9kaXIsICZvbGRfZGVudHJ5LT5kX25hbWUsICZvbGRfZGUpOwogCS8qCkBAIC0yMzYzLDggKzIzNzEsOCBAQAogCQluZXdfZGlyLT5pX2N0aW1lID0gbmV3X2Rpci0+aV9tdGltZSA9CiAJCQkJCWV4dDRfY3VycmVudF90aW1lKG5ld19kaXIpOwogCQlleHQ0X21hcmtfaW5vZGVfZGlydHkoaGFuZGxlLCBuZXdfZGlyKTsKLQkJQlVGRkVSX1RSQUNFKG5ld19iaCwgImNhbGwgZXh0NF9qb3VybmFsX2RpcnR5X21ldGFkYXRhIik7Ci0JCWV4dDRfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIG5ld19iaCk7CisJCUJVRkZFUl9UUkFDRShuZXdfYmgsICJjYWxsIGV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhIik7CisJCWV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgbmV3X2RpciwgbmV3X2JoKTsKIAkJYnJlbHNlKG5ld19iaCk7CiAJCW5ld19iaCA9IE5VTEw7CiAJfQpAQCAtMjQxNCw4ICsyNDIyLDggQEAKIAkJQlVGRkVSX1RSQUNFKGRpcl9iaCwgImdldF93cml0ZV9hY2Nlc3MiKTsKIAkJZXh0NF9qb3VybmFsX2dldF93cml0ZV9hY2Nlc3MoaGFuZGxlLCBkaXJfYmgpOwogCQlQQVJFTlRfSU5PKGRpcl9iaC0+Yl9kYXRhKSA9IGNwdV90b19sZTMyKG5ld19kaXItPmlfaW5vKTsKLQkJQlVGRkVSX1RSQUNFKGRpcl9iaCwgImNhbGwgZXh0NF9qb3VybmFsX2RpcnR5X21ldGFkYXRhIik7Ci0JCWV4dDRfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGRpcl9iaCk7CisJCUJVRkZFUl9UUkFDRShkaXJfYmgsICJjYWxsIGV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhIik7CisJCWV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgb2xkX2RpciwgZGlyX2JoKTsKIAkJZXh0NF9kZWNfY291bnQoaGFuZGxlLCBvbGRfZGlyKTsKIAkJaWYgKG5ld19pbm9kZSkgewogCQkJLyogY2hlY2tlZCBlbXB0eV9kaXIgYWJvdmUsIGNhbid0IGhhdmUgYW5vdGhlciBwYXJlbnQsCmRpZmYgLS1naXQgYS9mcy9leHQ0L3Jlc2l6ZS5jIGIvZnMvZXh0NC9yZXNpemUuYwppbmRleCBiNmVjMTg0Li5jMzI4YmU1IDEwMDY0NAotLS0gYS9mcy9leHQ0L3Jlc2l6ZS5jCisrKyBiL2ZzL2V4dDQvcmVzaXplLmMKQEAgLTUwLDcgKzUwLDcgQEAKIAlleHQ0X2dldF9ncm91cF9ub19hbmRfb2Zmc2V0KHNiLCBzdGFydCwgTlVMTCwgJm9mZnNldCk7CiAJaWYgKGdyb3VwICE9IHNiaS0+c19ncm91cHNfY291bnQpCiAJCWV4dDRfd2FybmluZyhzYiwgX19mdW5jX18sCi0JCQkgICAgICJDYW5ub3QgYWRkIGF0IGdyb3VwICV1IChvbmx5ICVsdSBncm91cHMpIiwKKwkJCSAgICAgIkNhbm5vdCBhZGQgYXQgZ3JvdXAgJXUgKG9ubHkgJXUgZ3JvdXBzKSIsCiAJCQkgICAgIGlucHV0LT5ncm91cCwgc2JpLT5zX2dyb3Vwc19jb3VudCk7CiAJZWxzZSBpZiAob2Zmc2V0ICE9IDApCiAJCQlleHQ0X3dhcm5pbmcoc2IsIF9fZnVuY19fLCAiTGFzdCBncm91cCBub3QgZnVsbCIpOwpAQCAtMTQ5LDcgKzE0OSw3IEBACiB7CiAJaW50IGVycjsKIAotCWlmIChoYW5kbGUtPmhfYnVmZmVyX2NyZWRpdHMgPj0gdGhyZXNoKQorCWlmIChleHQ0X2hhbmRsZV9oYXNfZW5vdWdoX2NyZWRpdHMoaGFuZGxlLCB0aHJlc2gpKQogCQlyZXR1cm4gMDsKIAogCWVyciA9IGV4dDRfam91cm5hbF9leHRlbmQoaGFuZGxlLCBFWFQ0X01BWF9UUkFOU19EQVRBKTsKQEAgLTIzMiw3ICsyMzIsNyBAQAogCQltZW1jcHkoZ2RiLT5iX2RhdGEsIHNiaS0+c19ncm91cF9kZXNjW2ldLT5iX2RhdGEsIGdkYi0+Yl9zaXplKTsKIAkJc2V0X2J1ZmZlcl91cHRvZGF0ZShnZGIpOwogCQl1bmxvY2tfYnVmZmVyKGdkYik7Ci0JCWV4dDRfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGdkYik7CisJCWV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgTlVMTCwgZ2RiKTsKIAkJZXh0NF9zZXRfYml0KGJpdCwgYmgtPmJfZGF0YSk7CiAJCWJyZWxzZShnZGIpOwogCX0KQEAgLTI1MSw3ICsyNTEsNyBAQAogCQkJZXJyID0gUFRSX0VSUihiaCk7CiAJCQlnb3RvIGV4aXRfYmg7CiAJCX0KLQkJZXh0NF9qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgZ2RiKTsKKwkJZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBOVUxMLCBnZGIpOwogCQlleHQ0X3NldF9iaXQoYml0LCBiaC0+Yl9kYXRhKTsKIAkJYnJlbHNlKGdkYik7CiAJfQpAQCAtMjc2LDcgKzI3Niw3IEBACiAJCQllcnIgPSBQVFJfRVJSKGl0KTsKIAkJCWdvdG8gZXhpdF9iaDsKIAkJfQotCQlleHQ0X2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBpdCk7CisJCWV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgTlVMTCwgaXQpOwogCQlicmVsc2UoaXQpOwogCQlleHQ0X3NldF9iaXQoYml0LCBiaC0+Yl9kYXRhKTsKIAl9CkBAIC0yODQsMTEgKzI4NCw5IEBACiAJaWYgKChlcnIgPSBleHRlbmRfb3JfcmVzdGFydF90cmFuc2FjdGlvbihoYW5kbGUsIDIsIGJoKSkpCiAJCWdvdG8gZXhpdF9iaDsKIAotCW1hcmtfYml0bWFwX2VuZChpbnB1dC0+YmxvY2tzX2NvdW50LCBFWFQ0X0JMT0NLU19QRVJfR1JPVVAoc2IpLAotCQkJYmgtPmJfZGF0YSk7Ci0JZXh0NF9qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgYmgpOworCW1hcmtfYml0bWFwX2VuZChpbnB1dC0+YmxvY2tzX2NvdW50LCBzYi0+c19ibG9ja3NpemUgKiA4LCBiaC0+Yl9kYXRhKTsKKwlleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIE5VTEwsIGJoKTsKIAlicmVsc2UoYmgpOwotCiAJLyogTWFyayB1bnVzZWQgZW50cmllcyBpbiBpbm9kZSBiaXRtYXAgdXNlZCAqLwogCWV4dDRfZGVidWcoImNsZWFyIGlub2RlIGJpdG1hcCAlIzA0bGx4ICgrJWxsdSlcbiIsCiAJCSAgIGlucHV0LT5pbm9kZV9iaXRtYXAsIGlucHV0LT5pbm9kZV9iaXRtYXAgLSBzdGFydCk7CkBAIC0yOTcsOSArMjk1LDkgQEAKIAkJZ290byBleGl0X2pvdXJuYWw7CiAJfQogCi0JbWFya19iaXRtYXBfZW5kKEVYVDRfSU5PREVTX1BFUl9HUk9VUChzYiksIEVYVDRfQkxPQ0tTX1BFUl9HUk9VUChzYiksCisJbWFya19iaXRtYXBfZW5kKEVYVDRfSU5PREVTX1BFUl9HUk9VUChzYiksIHNiLT5zX2Jsb2Nrc2l6ZSAqIDgsCiAJCQliaC0+Yl9kYXRhKTsKLQlleHQ0X2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBiaCk7CisJZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBOVUxMLCBiaCk7CiBleGl0X2JoOgogCWJyZWxzZShiaCk7CiAKQEAgLTQ4NiwxMiArNDg0LDEyIEBACiAJICogcmVzZXJ2ZWQgaW5vZGUsIGFuZCB3aWxsIGJlY29tZSBHRFQgYmxvY2tzIChwcmltYXJ5IGFuZCBiYWNrdXApLgogCSAqLwogCWRhdGFbZ2RiX251bSAlIEVYVDRfQUREUl9QRVJfQkxPQ0soc2IpXSA9IDA7Ci0JZXh0NF9qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgZGluZCk7CisJZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBOVUxMLCBkaW5kKTsKIAlicmVsc2UoZGluZCk7CiAJaW5vZGUtPmlfYmxvY2tzIC09IChnZGJhY2t1cHMgKyAxKSAqIHNiLT5zX2Jsb2Nrc2l6ZSA+PiA5OwogCWV4dDRfbWFya19pbG9jX2RpcnR5KGhhbmRsZSwgaW5vZGUsICZpbG9jKTsKIAltZW1zZXQoKCpwcmltYXJ5KS0+Yl9kYXRhLCAwLCBzYi0+c19ibG9ja3NpemUpOwotCWV4dDRfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsICpwcmltYXJ5KTsKKwlleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIE5VTEwsICpwcmltYXJ5KTsKIAogCW9fZ3JvdXBfZGVzYyA9IEVYVDRfU0Ioc2IpLT5zX2dyb3VwX2Rlc2M7CiAJbWVtY3B5KG5fZ3JvdXBfZGVzYywgb19ncm91cF9kZXNjLApAQCAtNTAyLDcgKzUwMCw3IEBACiAJa2ZyZWUob19ncm91cF9kZXNjKTsKIAogCWxlMTZfYWRkX2NwdSgmZXMtPnNfcmVzZXJ2ZWRfZ2R0X2Jsb2NrcywgLTEpOwotCWV4dDRfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIEVYVDRfU0Ioc2IpLT5zX3NiaCk7CisJZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBOVUxMLCBFWFQ0X1NCKHNiKS0+c19zYmgpOwogCiAJcmV0dXJuIDA7CiAKQEAgLTYxOCw3ICs2MTYsNyBAQAogCQkgICAgICAgcHJpbWFyeVtpXS0+Yl9ibG9ja25yLCBnZGJhY2t1cHMsCiAJCSAgICAgICBibGsgKyBwcmltYXJ5W2ldLT5iX2Jsb2NrbnIpOyAqLwogCQlkYXRhW2dkYmFja3Vwc10gPSBjcHVfdG9fbGUzMihibGsgKyBwcmltYXJ5W2ldLT5iX2Jsb2NrbnIpOwotCQllcnIyID0gZXh0NF9qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgcHJpbWFyeVtpXSk7CisJCWVycjIgPSBleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIE5VTEwsIHByaW1hcnlbaV0pOwogCQlpZiAoIWVycikKIAkJCWVyciA9IGVycjI7CiAJfQpAQCAtNjc2LDcgKzY3NCw4IEBACiAJCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CiAKIAkJLyogT3V0IG9mIGpvdXJuYWwgc3BhY2UsIGFuZCBjYW4ndCBnZXQgbW9yZSAtIGFib3J0IC0gc28gc2FkICovCi0JCWlmIChoYW5kbGUtPmhfYnVmZmVyX2NyZWRpdHMgPT0gMCAmJgorCQlpZiAoZXh0NF9oYW5kbGVfdmFsaWQoaGFuZGxlKSAmJgorCQkgICAgaGFuZGxlLT5oX2J1ZmZlcl9jcmVkaXRzID09IDAgJiYKIAkJICAgIGV4dDRfam91cm5hbF9leHRlbmQoaGFuZGxlLCBFWFQ0X01BWF9UUkFOU19EQVRBKSAmJgogCQkgICAgKGVyciA9IGV4dDRfam91cm5hbF9yZXN0YXJ0KGhhbmRsZSwgRVhUNF9NQVhfVFJBTlNfREFUQSkpKQogCQkJYnJlYWs7CkBAIC02OTYsNyArNjk1LDcgQEAKIAkJCW1lbXNldChiaC0+Yl9kYXRhICsgc2l6ZSwgMCwgcmVzdCk7CiAJCXNldF9idWZmZXJfdXB0b2RhdGUoYmgpOwogCQl1bmxvY2tfYnVmZmVyKGJoKTsKLQkJZXh0NF9qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgYmgpOworCQlleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIE5VTEwsIGJoKTsKIAkJYnJlbHNlKGJoKTsKIAl9CiAJaWYgKChlcnIyID0gZXh0NF9qb3VybmFsX3N0b3AoaGFuZGxlKSkgJiYgIWVycikKQEAgLTcxNSw3ICs3MTQsNyBAQAogZXhpdF9lcnI6CiAJaWYgKGVycikgewogCQlleHQ0X3dhcm5pbmcoc2IsIF9fZnVuY19fLAotCQkJICAgICAiY2FuJ3QgdXBkYXRlIGJhY2t1cCBmb3IgZ3JvdXAgJWx1IChlcnIgJWQpLCAiCisJCQkgICAgICJjYW4ndCB1cGRhdGUgYmFja3VwIGZvciBncm91cCAldSAoZXJyICVkKSwgIgogCQkJICAgICAiZm9yY2luZyBmc2NrIG9uIG5leHQgcmVib290IiwgZ3JvdXAsIGVycik7CiAJCXNiaS0+c19tb3VudF9zdGF0ZSAmPSB+RVhUNF9WQUxJRF9GUzsKIAkJc2JpLT5zX2VzLT5zX3N0YXRlICY9IGNwdV90b19sZTE2KH5FWFQ0X1ZBTElEX0ZTKTsKQEAgLTc0Nyw2ICs3NDYsNyBAQAogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBOVUxMOwogCWhhbmRsZV90ICpoYW5kbGU7CiAJaW50IGdkYl9vZmYsIGdkYl9udW07CisJaW50IG51bV9ncnBfbG9ja2VkID0gMDsKIAlpbnQgZXJyLCBlcnIyOwogCiAJZ2RiX251bSA9IGlucHV0LT5ncm91cCAvIEVYVDRfREVTQ19QRVJfQkxPQ0soc2IpOwpAQCAtNzYxLDEzICs3NjEsMTMgQEAKIAogCWlmIChleHQ0X2Jsb2Nrc19jb3VudChlcykgKyBpbnB1dC0+YmxvY2tzX2NvdW50IDwKIAkgICAgZXh0NF9ibG9ja3NfY291bnQoZXMpKSB7Ci0JCWV4dDRfd2FybmluZyhzYiwgX19mdW5jX18sICJibG9ja3NfY291bnQgb3ZlcmZsb3dcbiIpOworCQlleHQ0X3dhcm5pbmcoc2IsIF9fZnVuY19fLCAiYmxvY2tzX2NvdW50IG92ZXJmbG93Iik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCWlmIChsZTMyX3RvX2NwdShlcy0+c19pbm9kZXNfY291bnQpICsgRVhUNF9JTk9ERVNfUEVSX0dST1VQKHNiKSA8CiAJICAgIGxlMzJfdG9fY3B1KGVzLT5zX2lub2Rlc19jb3VudCkpIHsKLQkJZXh0NF93YXJuaW5nKHNiLCBfX2Z1bmNfXywgImlub2Rlc19jb3VudCBvdmVyZmxvd1xuIik7CisJCWV4dDRfd2FybmluZyhzYiwgX19mdW5jX18sICJpbm9kZXNfY291bnQgb3ZlcmZsb3ciKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC03ODcsNiArNzg3LDcgQEAKIAkJfQogCX0KIAorCiAJaWYgKChlcnIgPSB2ZXJpZnlfZ3JvdXBfaW5wdXQoc2IsIGlucHV0KSkpCiAJCWdvdG8gZXhpdF9wdXQ7CiAKQEAgLTg1NSw2ICs4NTYsNyBAQAogICAgICAgICAgKiB1c2luZyB0aGUgbmV3IGRpc2sgYmxvY2tzLgogICAgICAgICAgKi8KIAorCW51bV9ncnBfbG9ja2VkID0gZXh0NF9tYl9nZXRfYnVkZHlfY2FjaGVfbG9jayhzYiwgaW5wdXQtPmdyb3VwKTsKIAkvKiBVcGRhdGUgZ3JvdXAgZGVzY3JpcHRvciBibG9jayBmb3IgbmV3IGdyb3VwICovCiAJZ2RwID0gKHN0cnVjdCBleHQ0X2dyb3VwX2Rlc2MgKikoKGNoYXIgKilwcmltYXJ5LT5iX2RhdGEgKwogCQkJCQkgZ2RiX29mZiAqIEVYVDRfREVTQ19TSVpFKHNiKSk7CkBAIC04NjIsMTcgKzg2NCwyMCBAQAogCWV4dDRfYmxvY2tfYml0bWFwX3NldChzYiwgZ2RwLCBpbnB1dC0+YmxvY2tfYml0bWFwKTsgLyogTFYgRklYTUUgKi8KIAlleHQ0X2lub2RlX2JpdG1hcF9zZXQoc2IsIGdkcCwgaW5wdXQtPmlub2RlX2JpdG1hcCk7IC8qIExWIEZJWE1FICovCiAJZXh0NF9pbm9kZV90YWJsZV9zZXQoc2IsIGdkcCwgaW5wdXQtPmlub2RlX3RhYmxlKTsgLyogTFYgRklYTUUgKi8KLQlnZHAtPmJnX2ZyZWVfYmxvY2tzX2NvdW50ID0gY3B1X3RvX2xlMTYoaW5wdXQtPmZyZWVfYmxvY2tzX2NvdW50KTsKLQlnZHAtPmJnX2ZyZWVfaW5vZGVzX2NvdW50ID0gY3B1X3RvX2xlMTYoRVhUNF9JTk9ERVNfUEVSX0dST1VQKHNiKSk7CisJZXh0NF9mcmVlX2Jsa3Nfc2V0KHNiLCBnZHAsIGlucHV0LT5mcmVlX2Jsb2Nrc19jb3VudCk7CisJZXh0NF9mcmVlX2lub2Rlc19zZXQoc2IsIGdkcCwgRVhUNF9JTk9ERVNfUEVSX0dST1VQKHNiKSk7CisJZ2RwLT5iZ19mbGFncyB8PSBjcHVfdG9fbGUxNihFWFQ0X0JHX0lOT0RFX1pFUk9FRCk7CiAJZ2RwLT5iZ19jaGVja3N1bSA9IGV4dDRfZ3JvdXBfZGVzY19jc3VtKHNiaSwgaW5wdXQtPmdyb3VwLCBnZHApOwogCiAJLyoKIAkgKiBXZSBjYW4gYWxsb2NhdGUgbWVtb3J5IGZvciBtYl9hbGxvYyBiYXNlZCBvbiB0aGUgbmV3IGdyb3VwCiAJICogZGVzY3JpcHRvcgogCSAqLwotCWVyciA9IGV4dDRfbWJfYWRkX21vcmVfZ3JvdXBpbmZvKHNiLCBpbnB1dC0+Z3JvdXAsIGdkcCk7Ci0JaWYgKGVycikKKwllcnIgPSBleHQ0X21iX2FkZF9ncm91cGluZm8oc2IsIGlucHV0LT5ncm91cCwgZ2RwKTsKKwlpZiAoZXJyKSB7CisJCWV4dDRfbWJfcHV0X2J1ZGR5X2NhY2hlX2xvY2soc2IsIGlucHV0LT5ncm91cCwgbnVtX2dycF9sb2NrZWQpOwogCQlnb3RvIGV4aXRfam91cm5hbDsKKwl9CiAKIAkvKgogCSAqIE1ha2UgdGhlIG5ldyBibG9ja3MgYW5kIGlub2RlcyB2YWxpZCBuZXh0LiAgV2UgZG8gdGhpcyBiZWZvcmUKQEAgLTkxNCw4ICs5MTksOSBAQAogCiAJLyogVXBkYXRlIHRoZSBnbG9iYWwgZnMgc2l6ZSBmaWVsZHMgKi8KIAlzYmktPnNfZ3JvdXBzX2NvdW50Kys7CisJZXh0NF9tYl9wdXRfYnVkZHlfY2FjaGVfbG9jayhzYiwgaW5wdXQtPmdyb3VwLCBudW1fZ3JwX2xvY2tlZCk7CiAKLQlleHQ0X2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBwcmltYXJ5KTsKKwlleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIE5VTEwsIHByaW1hcnkpOwogCiAJLyogVXBkYXRlIHRoZSByZXNlcnZlZCBibG9jayBjb3VudHMgb25seSBvbmNlIHRoZSBuZXcgZ3JvdXAgaXMKIAkgKiBhY3RpdmUuICovCkBAIC05MzcsNyArOTQzLDcgQEAKIAkJCUVYVDRfSU5PREVTX1BFUl9HUk9VUChzYik7CiAJfQogCi0JZXh0NF9qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgc2JpLT5zX3NiaCk7CisJZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBOVUxMLCBzYmktPnNfc2JoKTsKIAlzYi0+c19kaXJ0ID0gMTsKIAogZXhpdF9qb3VybmFsOgpAQCAtOTc1LDkgKzk4MSw3IEBACiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKIAloYW5kbGVfdCAqaGFuZGxlOwogCWludCBlcnI7Ci0JdW5zaWduZWQgbG9uZyBmcmVlZF9ibG9ja3M7CiAJZXh0NF9ncm91cF90IGdyb3VwOwotCXN0cnVjdCBleHQ0X2dyb3VwX2luZm8gKmdycDsKIAogCS8qIFdlIGRvbid0IG5lZWQgdG8gd29ycnkgYWJvdXQgbG9ja2luZyB3cnQgb3RoZXIgcmVzaXplcnMganVzdAogCSAqIHlldDogd2UncmUgZ29pbmcgdG8gcmV2YWxpZGF0ZSBlcy0+c19ibG9ja3NfY291bnQgYWZ0ZXIKQEAgLTk5Nyw4ICsxMDAxLDcgQEAKIAkJCSIgdG9vIGxhcmdlIHRvIHJlc2l6ZSB0byAlbGx1IGJsb2NrcyBzYWZlbHlcbiIsCiAJCQlzYi0+c19pZCwgbl9ibG9ja3NfY291bnQpOwogCQlpZiAoc2l6ZW9mKHNlY3Rvcl90KSA8IDgpCi0JCQlleHQ0X3dhcm5pbmcoc2IsIF9fZnVuY19fLAotCQkJIkNPTkZJR19MQkQgbm90IGVuYWJsZWRcbiIpOworCQkJZXh0NF93YXJuaW5nKHNiLCBfX2Z1bmNfXywgIkNPTkZJR19MQkQgbm90IGVuYWJsZWQiKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0xMDcxLDYyICsxMDc0LDE4IEBACiAJCWdvdG8gZXhpdF9wdXQ7CiAJfQogCWV4dDRfYmxvY2tzX2NvdW50X3NldChlcywgb19ibG9ja3NfY291bnQgKyBhZGQpOwotCWV4dDRfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIEVYVDRfU0Ioc2IpLT5zX3NiaCk7CisJZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBOVUxMLCBFWFQ0X1NCKHNiKS0+c19zYmgpOwogCXNiLT5zX2RpcnQgPSAxOwogCXVubG9ja19zdXBlcihzYik7CiAJZXh0NF9kZWJ1ZygiZnJlZWluZyBibG9ja3MgJWxsdSB0aHJvdWdoICVsbHVcbiIsIG9fYmxvY2tzX2NvdW50LAogCQkgICBvX2Jsb2Nrc19jb3VudCArIGFkZCk7Ci0JZXh0NF9mcmVlX2Jsb2Nrc19zYihoYW5kbGUsIHNiLCBvX2Jsb2Nrc19jb3VudCwgYWRkLCAmZnJlZWRfYmxvY2tzKTsKKwkvKiBXZSBhZGQgdGhlIGJsb2NrcyB0byB0aGUgYml0bWFwIGFuZCBzZXQgdGhlIGdyb3VwIG5lZWQgaW5pdCBiaXQgKi8KKwlleHQ0X2FkZF9ncm91cGJsb2NrcyhoYW5kbGUsIHNiLCBvX2Jsb2Nrc19jb3VudCwgYWRkKTsKIAlleHQ0X2RlYnVnKCJmcmVlZCBibG9ja3MgJWxsdSB0aHJvdWdoICVsbHVcbiIsIG9fYmxvY2tzX2NvdW50LAogCQkgICBvX2Jsb2Nrc19jb3VudCArIGFkZCk7CiAJaWYgKChlcnIgPSBleHQ0X2pvdXJuYWxfc3RvcChoYW5kbGUpKSkKIAkJZ290byBleGl0X3B1dDsKIAotCS8qCi0JICogTWFyayBtYmFsbG9jIHBhZ2VzIGFzIG5vdCB1cCB0byBkYXRlIHNvIHRoYXQgdGhleSB3aWxsIGJlIHVwZGF0ZWQKLQkgKiBuZXh0IHRpbWUgdGhleSBhcmUgbG9hZGVkIGJ5IGV4dDRfbWJfbG9hZF9idWRkeS4KLQkgKgotCSAqIFhYWCBCYWQsIEJhZCwgQkFEISEhICBXZSBzaG91bGQgbm90IGJlIG92ZXJsb2FkaW5nIHRoZQotCSAqIFVwdG9kYXRlIGZsYWcsIHBhcnRpY3VsYXJseSBvbiB0aHRlIGJpdG1hcCBiaCwgYXMgd2F5IG9mCi0JICogaGludGluZyB0byBleHQ0X21iX2xvYWRfYnVkZHkoKSB0aGF0IGl0IG5lZWRzIHRvIGJlCi0JICogb3ZlcmxvYWRlZC4gIEEgdXNlciBjb3VsZCB0YWtlIGEgTFZNIHNuYXBzaG90LCB0aGVuIGRvIGFuCi0JICogb24tbGluZSBmc2NrLCBhbmQgY2xlYXIgdGhlIHVwdG9kYXRlIGZsYWcsIGFuZCB0aGlzIHdvdWxkCi0JICogbm90IGJlIGEgYnVnIGluIHVzZXJzcGFjZSwgYnV0IGEgYnVnIGluIHRoZSBrZXJuZWwuICBGSVhNRSEhIQotCSAqLwotCXsKLQkJc3RydWN0IGV4dDRfc2JfaW5mbyAqc2JpID0gRVhUNF9TQihzYik7Ci0JCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBzYmktPnNfYnVkZHlfY2FjaGU7Ci0JCWludCBibG9ja3NfcGVyX3BhZ2U7Ci0JCWludCBibG9jazsKLQkJaW50IHBudW07Ci0JCXN0cnVjdCBwYWdlICpwYWdlOwotCi0JCS8qIFNldCBidWRkeSBwYWdlIGFzIG5vdCB1cCB0byBkYXRlICovCi0JCWJsb2Nrc19wZXJfcGFnZSA9IFBBR0VfQ0FDSEVfU0laRSAvIHNiLT5zX2Jsb2Nrc2l6ZTsKLQkJYmxvY2sgPSBncm91cCAqIDI7Ci0JCXBudW0gPSBibG9jayAvIGJsb2Nrc19wZXJfcGFnZTsKLQkJcGFnZSA9IGZpbmRfZ2V0X3BhZ2UoaW5vZGUtPmlfbWFwcGluZywgcG51bSk7Ci0JCWlmIChwYWdlICE9IE5VTEwpIHsKLQkJCUNsZWFyUGFnZVVwdG9kYXRlKHBhZ2UpOwotCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOwotCQl9Ci0KLQkJLyogU2V0IGJpdG1hcCBwYWdlIGFzIG5vdCB1cCB0byBkYXRlICovCi0JCWJsb2NrKys7Ci0JCXBudW0gPSBibG9jayAvIGJsb2Nrc19wZXJfcGFnZTsKLQkJcGFnZSA9IGZpbmRfZ2V0X3BhZ2UoaW5vZGUtPmlfbWFwcGluZywgcG51bSk7Ci0JCWlmIChwYWdlICE9IE5VTEwpIHsKLQkJCUNsZWFyUGFnZVVwdG9kYXRlKHBhZ2UpOwotCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOwotCQl9Ci0KLQkJLyogR2V0IHRoZSBpbmZvIG9uIHRoZSBsYXN0IGdyb3VwICovCi0JCWdycCA9IGV4dDRfZ2V0X2dyb3VwX2luZm8oc2IsIGdyb3VwKTsKLQotCQkvKiBVcGRhdGUgZnJlZSBibG9ja3MgaW4gZ3JvdXAgaW5mbyAqLwotCQlleHQ0X21iX3VwZGF0ZV9ncm91cF9pbmZvKGdycCwgYWRkKTsKLQl9Ci0KIAlpZiAodGVzdF9vcHQoc2IsIERFQlVHKSkKIAkJcHJpbnRrKEtFUk5fREVCVUcgIkVYVDQtZnM6IGV4dGVuZGVkIGdyb3VwIHRvICVsbHUgYmxvY2tzXG4iLAogCQkgICAgICAgZXh0NF9ibG9ja3NfY291bnQoZXMpKTsKZGlmZiAtLWdpdCBhL2ZzL2V4dDQvc3VwZXIuYyBiL2ZzL2V4dDQvc3VwZXIuYwppbmRleCAwNDE1OGFkLi44ZjdlMGJlIDEwMDY0NAotLS0gYS9mcy9leHQ0L3N1cGVyLmMKKysrIGIvZnMvZXh0NC9zdXBlci5jCkBAIC01MSw4ICs1MSw2IEBACiAKIHN0YXRpYyBpbnQgZXh0NF9sb2FkX2pvdXJuYWwoc3RydWN0IHN1cGVyX2Jsb2NrICosIHN0cnVjdCBleHQ0X3N1cGVyX2Jsb2NrICosCiAJCQkgICAgIHVuc2lnbmVkIGxvbmcgam91cm5hbF9kZXZudW0pOwotc3RhdGljIGludCBleHQ0X2NyZWF0ZV9qb3VybmFsKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBzdHJ1Y3QgZXh0NF9zdXBlcl9ibG9jayAqLAotCQkJICAgICAgIHVuc2lnbmVkIGludCk7CiBzdGF0aWMgdm9pZCBleHQ0X2NvbW1pdF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAogCQkJICAgICAgc3RydWN0IGV4dDRfc3VwZXJfYmxvY2sgKmVzLCBpbnQgc3luYyk7CiBzdGF0aWMgdm9pZCBleHQ0X21hcmtfcmVjb3ZlcnlfY29tcGxldGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKQEAgLTkzLDYgKzkxLDM4IEBACiAJCShleHQ0X2ZzYmxrX3QpbGUzMl90b19jcHUoYmctPmJnX2lub2RlX3RhYmxlX2hpKSA8PCAzMiA6IDApOwogfQogCitfX3UzMiBleHQ0X2ZyZWVfYmxrc19jb3VudChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQkJICAgICAgc3RydWN0IGV4dDRfZ3JvdXBfZGVzYyAqYmcpCit7CisJcmV0dXJuIGxlMTZfdG9fY3B1KGJnLT5iZ19mcmVlX2Jsb2Nrc19jb3VudF9sbykgfAorCQkoRVhUNF9ERVNDX1NJWkUoc2IpID49IEVYVDRfTUlOX0RFU0NfU0laRV82NEJJVCA/CisJCShfX3UzMilsZTE2X3RvX2NwdShiZy0+YmdfZnJlZV9ibG9ja3NfY291bnRfaGkpIDw8IDE2IDogMCk7Cit9CisKK19fdTMyIGV4dDRfZnJlZV9pbm9kZXNfY291bnQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJCSAgICAgIHN0cnVjdCBleHQ0X2dyb3VwX2Rlc2MgKmJnKQoreworCXJldHVybiBsZTE2X3RvX2NwdShiZy0+YmdfZnJlZV9pbm9kZXNfY291bnRfbG8pIHwKKwkJKEVYVDRfREVTQ19TSVpFKHNiKSA+PSBFWFQ0X01JTl9ERVNDX1NJWkVfNjRCSVQgPworCQkoX191MzIpbGUxNl90b19jcHUoYmctPmJnX2ZyZWVfaW5vZGVzX2NvdW50X2hpKSA8PCAxNiA6IDApOworfQorCitfX3UzMiBleHQ0X3VzZWRfZGlyc19jb3VudChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQkJICAgICAgc3RydWN0IGV4dDRfZ3JvdXBfZGVzYyAqYmcpCit7CisJcmV0dXJuIGxlMTZfdG9fY3B1KGJnLT5iZ191c2VkX2RpcnNfY291bnRfbG8pIHwKKwkJKEVYVDRfREVTQ19TSVpFKHNiKSA+PSBFWFQ0X01JTl9ERVNDX1NJWkVfNjRCSVQgPworCQkoX191MzIpbGUxNl90b19jcHUoYmctPmJnX3VzZWRfZGlyc19jb3VudF9oaSkgPDwgMTYgOiAwKTsKK30KKworX191MzIgZXh0NF9pdGFibGVfdW51c2VkX2NvdW50KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCQkgICAgICBzdHJ1Y3QgZXh0NF9ncm91cF9kZXNjICpiZykKK3sKKwlyZXR1cm4gbGUxNl90b19jcHUoYmctPmJnX2l0YWJsZV91bnVzZWRfbG8pIHwKKwkJKEVYVDRfREVTQ19TSVpFKHNiKSA+PSBFWFQ0X01JTl9ERVNDX1NJWkVfNjRCSVQgPworCQkoX191MzIpbGUxNl90b19jcHUoYmctPmJnX2l0YWJsZV91bnVzZWRfaGkpIDw8IDE2IDogMCk7Cit9CisKIHZvaWQgZXh0NF9ibG9ja19iaXRtYXBfc2V0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCiAJCQkgICBzdHJ1Y3QgZXh0NF9ncm91cF9kZXNjICpiZywgZXh0NF9mc2Jsa190IGJsaykKIHsKQEAgLTExNyw2ICsxNDcsMzggQEAKIAkJYmctPmJnX2lub2RlX3RhYmxlX2hpID0gY3B1X3RvX2xlMzIoYmxrID4+IDMyKTsKIH0KIAordm9pZCBleHQ0X2ZyZWVfYmxrc19zZXQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJCSAgc3RydWN0IGV4dDRfZ3JvdXBfZGVzYyAqYmcsIF9fdTMyIGNvdW50KQoreworCWJnLT5iZ19mcmVlX2Jsb2Nrc19jb3VudF9sbyA9IGNwdV90b19sZTE2KChfX3UxNiljb3VudCk7CisJaWYgKEVYVDRfREVTQ19TSVpFKHNiKSA+PSBFWFQ0X01JTl9ERVNDX1NJWkVfNjRCSVQpCisJCWJnLT5iZ19mcmVlX2Jsb2Nrc19jb3VudF9oaSA9IGNwdV90b19sZTE2KGNvdW50ID4+IDE2KTsKK30KKwordm9pZCBleHQ0X2ZyZWVfaW5vZGVzX3NldChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQkJICBzdHJ1Y3QgZXh0NF9ncm91cF9kZXNjICpiZywgX191MzIgY291bnQpCit7CisJYmctPmJnX2ZyZWVfaW5vZGVzX2NvdW50X2xvID0gY3B1X3RvX2xlMTYoKF9fdTE2KWNvdW50KTsKKwlpZiAoRVhUNF9ERVNDX1NJWkUoc2IpID49IEVYVDRfTUlOX0RFU0NfU0laRV82NEJJVCkKKwkJYmctPmJnX2ZyZWVfaW5vZGVzX2NvdW50X2hpID0gY3B1X3RvX2xlMTYoY291bnQgPj4gMTYpOworfQorCit2b2lkIGV4dDRfdXNlZF9kaXJzX3NldChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQkJICBzdHJ1Y3QgZXh0NF9ncm91cF9kZXNjICpiZywgX191MzIgY291bnQpCit7CisJYmctPmJnX3VzZWRfZGlyc19jb3VudF9sbyA9IGNwdV90b19sZTE2KChfX3UxNiljb3VudCk7CisJaWYgKEVYVDRfREVTQ19TSVpFKHNiKSA+PSBFWFQ0X01JTl9ERVNDX1NJWkVfNjRCSVQpCisJCWJnLT5iZ191c2VkX2RpcnNfY291bnRfaGkgPSBjcHVfdG9fbGUxNihjb3VudCA+PiAxNik7Cit9CisKK3ZvaWQgZXh0NF9pdGFibGVfdW51c2VkX3NldChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQkJICBzdHJ1Y3QgZXh0NF9ncm91cF9kZXNjICpiZywgX191MzIgY291bnQpCit7CisJYmctPmJnX2l0YWJsZV91bnVzZWRfbG8gPSBjcHVfdG9fbGUxNigoX191MTYpY291bnQpOworCWlmIChFWFQ0X0RFU0NfU0laRShzYikgPj0gRVhUNF9NSU5fREVTQ19TSVpFXzY0QklUKQorCQliZy0+YmdfaXRhYmxlX3VudXNlZF9oaSA9IGNwdV90b19sZTE2KGNvdW50ID4+IDE2KTsKK30KKwogLyoKICAqIFdyYXBwZXJzIGZvciBqYmQyX2pvdXJuYWxfc3RhcnQvZW5kLgogICoKQEAgLTEzNiwxMyArMTk4LDE5IEBACiAJICogYmFja3MgKGVnLiBFSU8gaW4gdGhlIGNvbW1pdCB0aHJlYWQpLCB0aGVuIHdlIHN0aWxsIG5lZWQgdG8KIAkgKiB0YWtlIHRoZSBGUyBpdHNlbGYgcmVhZG9ubHkgY2xlYW5seS4gKi8KIAlqb3VybmFsID0gRVhUNF9TQihzYiktPnNfam91cm5hbDsKLQlpZiAoaXNfam91cm5hbF9hYm9ydGVkKGpvdXJuYWwpKSB7Ci0JCWV4dDRfYWJvcnQoc2IsIF9fZnVuY19fLAotCQkJICAgIkRldGVjdGVkIGFib3J0ZWQgam91cm5hbCIpOwotCQlyZXR1cm4gRVJSX1BUUigtRVJPRlMpOworCWlmIChqb3VybmFsKSB7CisJCWlmIChpc19qb3VybmFsX2Fib3J0ZWQoam91cm5hbCkpIHsKKwkJCWV4dDRfYWJvcnQoc2IsIF9fZnVuY19fLAorCQkJCSAgICJEZXRlY3RlZCBhYm9ydGVkIGpvdXJuYWwiKTsKKwkJCXJldHVybiBFUlJfUFRSKC1FUk9GUyk7CisJCX0KKwkJcmV0dXJuIGpiZDJfam91cm5hbF9zdGFydChqb3VybmFsLCBuYmxvY2tzKTsKIAl9Ci0KLQlyZXR1cm4gamJkMl9qb3VybmFsX3N0YXJ0KGpvdXJuYWwsIG5ibG9ja3MpOworCS8qCisJICogV2UncmUgbm90IGpvdXJuYWxpbmcsIHJldHVybiB0aGUgYXBwcm9wcmlhdGUgaW5kaWNhdGlvbi4KKwkgKi8KKwljdXJyZW50LT5qb3VybmFsX2luZm8gPSBFWFQ0X05PSk9VUk5BTF9IQU5ETEU7CisJcmV0dXJuIGN1cnJlbnQtPmpvdXJuYWxfaW5mbzsKIH0KIAogLyoKQEAgLTE1Nyw2ICsyMjUsMTQgQEAKIAlpbnQgZXJyOwogCWludCByYzsKIAorCWlmICghZXh0NF9oYW5kbGVfdmFsaWQoaGFuZGxlKSkgeworCQkvKgorCQkgKiBEbyB0aGlzIGhlcmUgc2luY2Ugd2UgZG9uJ3QgY2FsbCBqYmQyX2pvdXJuYWxfc3RvcCgpIGluCisJCSAqIG5vLWpvdXJuYWwgbW9kZS4KKwkJICovCisJCWN1cnJlbnQtPmpvdXJuYWxfaW5mbyA9IE5VTEw7CisJCXJldHVybiAwOworCX0KIAlzYiA9IGhhbmRsZS0+aF90cmFuc2FjdGlvbi0+dF9qb3VybmFsLT5qX3ByaXZhdGU7CiAJZXJyID0gaGFuZGxlLT5oX2VycjsKIAlyYyA9IGpiZDJfam91cm5hbF9zdG9wKGhhbmRsZSk7CkBAIC0xNzQsNiArMjUwLDggQEAKIAljaGFyIG5idWZbMTZdOwogCWNvbnN0IGNoYXIgKmVycnN0ciA9IGV4dDRfZGVjb2RlX2Vycm9yKE5VTEwsIGVyciwgbmJ1Zik7CiAKKwlCVUdfT04oIWV4dDRfaGFuZGxlX3ZhbGlkKGhhbmRsZSkpOworCiAJaWYgKGJoKQogCQlCVUZGRVJfVFJBQ0UoYmgsICJhYm9ydCIpOwogCkBAIC0zNTAsNiArNDI4LDQ0IEBACiAJdmFfZW5kKGFyZ3MpOwogfQogCit2b2lkIGV4dDRfZ3JwX2xvY2tlZF9lcnJvcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBleHQ0X2dyb3VwX3QgZ3JwLAorCQkJCWNvbnN0IGNoYXIgKmZ1bmN0aW9uLCBjb25zdCBjaGFyICpmbXQsIC4uLikKK19fcmVsZWFzZXMoYml0bG9jaykKK19fYWNxdWlyZXMoYml0bG9jaykKK3sKKwl2YV9saXN0IGFyZ3M7CisJc3RydWN0IGV4dDRfc3VwZXJfYmxvY2sgKmVzID0gRVhUNF9TQihzYiktPnNfZXM7CisKKwl2YV9zdGFydChhcmdzLCBmbXQpOworCXByaW50ayhLRVJOX0NSSVQgIkVYVDQtZnMgZXJyb3IgKGRldmljZSAlcyk6ICVzOiAiLCBzYi0+c19pZCwgZnVuY3Rpb24pOworCXZwcmludGsoZm10LCBhcmdzKTsKKwlwcmludGsoIlxuIik7CisJdmFfZW5kKGFyZ3MpOworCisJaWYgKHRlc3Rfb3B0KHNiLCBFUlJPUlNfQ09OVCkpIHsKKwkJRVhUNF9TQihzYiktPnNfbW91bnRfc3RhdGUgfD0gRVhUNF9FUlJPUl9GUzsKKwkJZXMtPnNfc3RhdGUgfD0gY3B1X3RvX2xlMTYoRVhUNF9FUlJPUl9GUyk7CisJCWV4dDRfY29tbWl0X3N1cGVyKHNiLCBlcywgMCk7CisJCXJldHVybjsKKwl9CisJZXh0NF91bmxvY2tfZ3JvdXAoc2IsIGdycCk7CisJZXh0NF9oYW5kbGVfZXJyb3Ioc2IpOworCS8qCisJICogV2Ugb25seSBnZXQgaGVyZSBpbiB0aGUgRVJST1JTX1JPIGNhc2U7IHJlbG9ja2luZyB0aGUgZ3JvdXAKKwkgKiBtYXkgYmUgZGFuZ2Vyb3VzLCBidXQgbm90aGluZyBiYWQgd2lsbCBoYXBwZW4gc2luY2UgdGhlCisJICogZmlsZXN5c3RlbSB3aWxsIGhhdmUgYWxyZWFkeSBiZWVuIG1hcmtlZCByZWFkL29ubHkgYW5kIHRoZQorCSAqIGpvdXJuYWwgaGFzIGJlZW4gYWJvcnRlZC4gIFdlIHJldHVybiAxIGFzIGEgaGludCB0byBjYWxsZXJzCisJICogd2hvIG1pZ2h0IHdoYXQgdG8gdXNlIHRoZSByZXR1cm4gdmFsdWUgZnJvbQorCSAqIGV4dDRfZ3JwX2xvY2tlZF9lcnJvcigpIHRvIGRpc3Rpbmd1aXNoIGJld2VlbiB0aGUKKwkgKiBFUlJPUlNfQ09OVCBhbmQgRVJST1JTX1JPIGNhc2UsIGFuZCBwZXJoYXBzIHJldHVybiBtb3JlCisJICogYWdncmVzc2l2ZWx5IGZyb20gdGhlIGV4dDQgZnVuY3Rpb24gaW4gcXVlc3Rpb24sIHdpdGggYQorCSAqIG1vcmUgYXBwcm9wcmlhdGUgZXJyb3IgY29kZS4KKwkgKi8KKwlleHQ0X2xvY2tfZ3JvdXAoc2IsIGdycCk7CisJcmV0dXJuOworfQorCisKIHZvaWQgZXh0NF91cGRhdGVfZHluYW1pY19yZXYoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKIHsKIAlzdHJ1Y3QgZXh0NF9zdXBlcl9ibG9jayAqZXMgPSBFWFQ0X1NCKHNiKS0+c19lczsKQEAgLTM4OSw3ICs1MDUsNyBAQAogCXJldHVybiBiZGV2OwogCiBmYWlsOgotCXByaW50ayhLRVJOX0VSUiAiRVhUNDogZmFpbGVkIHRvIG9wZW4gam91cm5hbCBkZXZpY2UgJXM6ICVsZFxuIiwKKwlwcmludGsoS0VSTl9FUlIgIkVYVDQtZnM6IGZhaWxlZCB0byBvcGVuIGpvdXJuYWwgZGV2aWNlICVzOiAlbGRcbiIsCiAJCQlfX2JkZXZuYW1lKGRldiwgYiksIFBUUl9FUlIoYmRldikpOwogCXJldHVybiBOVUxMOwogfQpAQCAtNDQ4LDExICs1NjQsMTMgQEAKIAlleHQ0X21iX3JlbGVhc2Uoc2IpOwogCWV4dDRfZXh0X3JlbGVhc2Uoc2IpOwogCWV4dDRfeGF0dHJfcHV0X3N1cGVyKHNiKTsKLQllcnIgPSBqYmQyX2pvdXJuYWxfZGVzdHJveShzYmktPnNfam91cm5hbCk7Ci0Jc2JpLT5zX2pvdXJuYWwgPSBOVUxMOwotCWlmIChlcnIgPCAwKQotCQlleHQ0X2Fib3J0KHNiLCBfX2Z1bmNfXywgIkNvdWxkbid0IGNsZWFuIHVwIHRoZSBqb3VybmFsIik7Ci0KKwlpZiAoc2JpLT5zX2pvdXJuYWwpIHsKKwkJZXJyID0gamJkMl9qb3VybmFsX2Rlc3Ryb3koc2JpLT5zX2pvdXJuYWwpOworCQlzYmktPnNfam91cm5hbCA9IE5VTEw7CisJCWlmIChlcnIgPCAwKQorCQkJZXh0NF9hYm9ydChzYiwgX19mdW5jX18sCisJCQkJICAgIkNvdWxkbid0IGNsZWFuIHVwIHRoZSBqb3VybmFsIik7CisJfQogCWlmICghKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSkgewogCQlFWFQ0X0NMRUFSX0lOQ09NUEFUX0ZFQVRVUkUoc2IsIEVYVDRfRkVBVFVSRV9JTkNPTVBBVF9SRUNPVkVSKTsKIAkJZXMtPnNfc3RhdGUgPSBjcHVfdG9fbGUxNihzYmktPnNfbW91bnRfc3RhdGUpOwpAQCAtNTIyLDYgKzY0MCwxMSBAQAogCW1lbXNldCgmZWktPmlfY2FjaGVkX2V4dGVudCwgMCwgc2l6ZW9mKHN0cnVjdCBleHQ0X2V4dF9jYWNoZSkpOwogCUlOSVRfTElTVF9IRUFEKCZlaS0+aV9wcmVhbGxvY19saXN0KTsKIAlzcGluX2xvY2tfaW5pdCgmZWktPmlfcHJlYWxsb2NfbG9jayk7CisJLyoKKwkgKiBOb3RlOiAgV2UgY2FuIGJlIGNhbGxlZCBiZWZvcmUgRVhUNF9TQihzYiktPnNfam91cm5hbCBpcyBzZXQsCisJICogdGhlcmVmb3JlIGl0IGNhbiBiZSBudWxsIGhlcmUuICBEb24ndCBjaGVjayBpdCwganVzdCBpbml0aWFsaXplCisJICogamlub2RlLgorCSAqLwogCWpiZDJfam91cm5hbF9pbml0X2piZF9pbm9kZSgmZWktPmppbm9kZSwgJmVpLT52ZnNfaW5vZGUpOwogCWVpLT5pX3Jlc2VydmVkX2RhdGFfYmxvY2tzID0gMDsKIAllaS0+aV9yZXNlcnZlZF9tZXRhX2Jsb2NrcyA9IDA7CkBAIC01ODgsNyArNzExLDggQEAKIAl9CiAjZW5kaWYKIAlleHQ0X2Rpc2NhcmRfcHJlYWxsb2NhdGlvbnMoaW5vZGUpOwotCWpiZDJfam91cm5hbF9yZWxlYXNlX2piZF9pbm9kZShFWFQ0X1NCKGlub2RlLT5pX3NiKS0+c19qb3VybmFsLAorCWlmIChFWFQ0X0pPVVJOQUwoaW5vZGUpKQorCQlqYmQyX2pvdXJuYWxfcmVsZWFzZV9qYmRfaW5vZGUoRVhUNF9TQihpbm9kZS0+aV9zYiktPnNfam91cm5hbCwKIAkJCQkgICAgICAgJkVYVDRfSShpbm9kZSktPmppbm9kZSk7CiB9CiAKQEAgLTY4MSwxMCArODA1LDE5IEBACiAjZW5kaWYKIAlpZiAoIXRlc3Rfb3B0KHNiLCBSRVNFUlZBVElPTikpCiAJCXNlcV9wdXRzKHNlcSwgIixub3Jlc2VydmF0aW9uIik7Ci0JaWYgKHNiaS0+c19jb21taXRfaW50ZXJ2YWwpIHsKKwlpZiAoc2JpLT5zX2NvbW1pdF9pbnRlcnZhbCAhPSBKQkQyX0RFRkFVTFRfTUFYX0NPTU1JVF9BR0UqSFopIHsKIAkJc2VxX3ByaW50ZihzZXEsICIsY29tbWl0PSV1IiwKIAkJCSAgICh1bnNpZ25lZCkgKHNiaS0+c19jb21taXRfaW50ZXJ2YWwgLyBIWikpOwogCX0KKwlpZiAoc2JpLT5zX21pbl9iYXRjaF90aW1lICE9IEVYVDRfREVGX01JTl9CQVRDSF9USU1FKSB7CisJCXNlcV9wcmludGYoc2VxLCAiLG1pbl9iYXRjaF90aW1lPSV1IiwKKwkJCSAgICh1bnNpZ25lZCkgc2JpLT5zX21pbl9iYXRjaF90aW1lKTsKKwl9CisJaWYgKHNiaS0+c19tYXhfYmF0Y2hfdGltZSAhPSBFWFQ0X0RFRl9NQVhfQkFUQ0hfVElNRSkgeworCQlzZXFfcHJpbnRmKHNlcSwgIixtYXhfYmF0Y2hfdGltZT0ldSIsCisJCQkgICAodW5zaWduZWQpIHNiaS0+c19taW5fYmF0Y2hfdGltZSk7CisJfQorCiAJLyoKIAkgKiBXZSdyZSBjaGFuZ2luZyB0aGUgZGVmYXVsdCBvZiBiYXJyaWVyIG1vdW50IG9wdGlvbiwgc28KIAkgKiBsZXQncyBhbHdheXMgZGlzcGxheSBpdHMgbW91bnQgc3RhdGUgc28gaXQncyBjbGVhciB3aGF0IGl0cwpAQCAtNjk2LDggKzgyOSw2IEBACiAJCXNlcV9wdXRzKHNlcSwgIixqb3VybmFsX2FzeW5jX2NvbW1pdCIpOwogCWlmICh0ZXN0X29wdChzYiwgTk9CSCkpCiAJCXNlcV9wdXRzKHNlcSwgIixub2JoIik7Ci0JaWYgKCF0ZXN0X29wdChzYiwgRVhURU5UUykpCi0JCXNlcV9wdXRzKHNlcSwgIixub2V4dGVudHMiKTsKIAlpZiAodGVzdF9vcHQoc2IsIElfVkVSU0lPTikpCiAJCXNlcV9wdXRzKHNlcSwgIixpX3ZlcnNpb24iKTsKIAlpZiAoIXRlc3Rfb3B0KHNiLCBERUxBTExPQykpCkBAIC03NzIsNiArOTAzLDI1IEBACiAJCQkJICAgIGV4dDRfbmZzX2dldF9pbm9kZSk7CiB9CiAKKy8qCisgKiBUcnkgdG8gcmVsZWFzZSBtZXRhZGF0YSBwYWdlcyAoaW5kaXJlY3QgYmxvY2tzLCBkaXJlY3Rvcmllcykgd2hpY2ggYXJlCisgKiBtYXBwZWQgdmlhIHRoZSBibG9jayBkZXZpY2UuICBTaW5jZSB0aGVzZSBwYWdlcyBjb3VsZCBoYXZlIGpvdXJuYWwgaGVhZHMKKyAqIHdoaWNoIHdvdWxkIHByZXZlbnQgdHJ5X3RvX2ZyZWVfYnVmZmVycygpIGZyb20gZnJlZWluZyB0aGVtLCB3ZSBtdXN0IHVzZQorICogamJkMiBsYXllcidzIHRyeV90b19mcmVlX2J1ZmZlcnMoKSBmdW5jdGlvbiB0byByZWxlYXNlIHRoZW0uCisgKi8KK3N0YXRpYyBpbnQgYmRldl90cnlfdG9fZnJlZV9wYWdlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBwYWdlICpwYWdlLCBnZnBfdCB3YWl0KQoreworCWpvdXJuYWxfdCAqam91cm5hbCA9IEVYVDRfU0Ioc2IpLT5zX2pvdXJuYWw7CisKKwlXQVJOX09OKFBhZ2VDaGVja2VkKHBhZ2UpKTsKKwlpZiAoIXBhZ2VfaGFzX2J1ZmZlcnMocGFnZSkpCisJCXJldHVybiAwOworCWlmIChqb3VybmFsKQorCQlyZXR1cm4gamJkMl9qb3VybmFsX3RyeV90b19mcmVlX2J1ZmZlcnMoam91cm5hbCwgcGFnZSwKKwkJCQkJCQl3YWl0ICYgfl9fR0ZQX1dBSVQpOworCXJldHVybiB0cnlfdG9fZnJlZV9idWZmZXJzKHBhZ2UpOworfQorCiAjaWZkZWYgQ09ORklHX1FVT1RBCiAjZGVmaW5lIFFUWVBFMk5BTUUodCkgKCh0KSA9PSBVU1JRVU9UQSA/ICJ1c2VyIiA6ICJncm91cCIpCiAjZGVmaW5lIFFUWVBFMk1PUFQob24sIHQpICgodCkgPT0gVVNSUVVPVEE/KChvbikjI1VTUkpRVU9UQSk6KChvbikjI0dSUEpRVU9UQSkpCkBAIC04MDMsNyArOTUzLDkgQEAKIAkuYWNxdWlyZV9kcXVvdAk9IGV4dDRfYWNxdWlyZV9kcXVvdCwKIAkucmVsZWFzZV9kcXVvdAk9IGV4dDRfcmVsZWFzZV9kcXVvdCwKIAkubWFya19kaXJ0eQk9IGV4dDRfbWFya19kcXVvdF9kaXJ0eSwKLQkud3JpdGVfaW5mbwk9IGV4dDRfd3JpdGVfaW5mbworCS53cml0ZV9pbmZvCT0gZXh0NF93cml0ZV9pbmZvLAorCS5hbGxvY19kcXVvdAk9IGRxdW90X2FsbG9jLAorCS5kZXN0cm95X2RxdW90CT0gZHF1b3RfZGVzdHJveSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcXVvdGFjdGxfb3BzIGV4dDRfcWN0bF9vcGVyYXRpb25zID0gewpAQCAtODM2LDYgKzk4OCw3IEBACiAJLnF1b3RhX3JlYWQJPSBleHQ0X3F1b3RhX3JlYWQsCiAJLnF1b3RhX3dyaXRlCT0gZXh0NF9xdW90YV93cml0ZSwKICNlbmRpZgorCS5iZGV2X3RyeV90b19mcmVlX3BhZ2UgPSBiZGV2X3RyeV90b19mcmVlX3BhZ2UsCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGV4cG9ydF9vcGVyYXRpb25zIGV4dDRfZXhwb3J0X29wcyA9IHsKQEAgLTg1MCwxNiArMTAwMywxNyBAQAogCU9wdF9ub3VpZDMyLCBPcHRfZGVidWcsIE9wdF9vbGRhbGxvYywgT3B0X29ybG92LAogCU9wdF91c2VyX3hhdHRyLCBPcHRfbm91c2VyX3hhdHRyLCBPcHRfYWNsLCBPcHRfbm9hY2wsCiAJT3B0X3Jlc2VydmF0aW9uLCBPcHRfbm9yZXNlcnZhdGlvbiwgT3B0X25vbG9hZCwgT3B0X25vYmgsIE9wdF9iaCwKLQlPcHRfY29tbWl0LCBPcHRfam91cm5hbF91cGRhdGUsIE9wdF9qb3VybmFsX2ludW0sIE9wdF9qb3VybmFsX2RldiwKKwlPcHRfY29tbWl0LCBPcHRfbWluX2JhdGNoX3RpbWUsIE9wdF9tYXhfYmF0Y2hfdGltZSwKKwlPcHRfam91cm5hbF91cGRhdGUsIE9wdF9qb3VybmFsX2RldiwKIAlPcHRfam91cm5hbF9jaGVja3N1bSwgT3B0X2pvdXJuYWxfYXN5bmNfY29tbWl0LAogCU9wdF9hYm9ydCwgT3B0X2RhdGFfam91cm5hbCwgT3B0X2RhdGFfb3JkZXJlZCwgT3B0X2RhdGFfd3JpdGViYWNrLAogCU9wdF9kYXRhX2Vycl9hYm9ydCwgT3B0X2RhdGFfZXJyX2lnbm9yZSwKIAlPcHRfdXNyanF1b3RhLCBPcHRfZ3JwanF1b3RhLCBPcHRfb2ZmdXNyanF1b3RhLCBPcHRfb2ZmZ3JwanF1b3RhLAogCU9wdF9qcWZtdF92ZnNvbGQsIE9wdF9qcWZtdF92ZnN2MCwgT3B0X3F1b3RhLCBPcHRfbm9xdW90YSwKIAlPcHRfaWdub3JlLCBPcHRfYmFycmllciwgT3B0X2VyciwgT3B0X3Jlc2l6ZSwgT3B0X3VzcnF1b3RhLAotCU9wdF9ncnBxdW90YSwgT3B0X2V4dGVudHMsIE9wdF9ub2V4dGVudHMsIE9wdF9pX3ZlcnNpb24sCisJT3B0X2dycHF1b3RhLCBPcHRfaV92ZXJzaW9uLAogCU9wdF9zdHJpcGUsIE9wdF9kZWxhbGxvYywgT3B0X25vZGVsYWxsb2MsCi0JT3B0X2lub2RlX3JlYWRhaGVhZF9ibGtzCisJT3B0X2lub2RlX3JlYWRhaGVhZF9ibGtzLCBPcHRfam91cm5hbF9pb3ByaW8KIH07CiAKIHN0YXRpYyBjb25zdCBtYXRjaF90YWJsZV90IHRva2VucyA9IHsKQEAgLTg4OSw4ICsxMDQzLDkgQEAKIAl7T3B0X25vYmgsICJub2JoIn0sCiAJe09wdF9iaCwgImJoIn0sCiAJe09wdF9jb21taXQsICJjb21taXQ9JXUifSwKKwl7T3B0X21pbl9iYXRjaF90aW1lLCAibWluX2JhdGNoX3RpbWU9JXUifSwKKwl7T3B0X21heF9iYXRjaF90aW1lLCAibWF4X2JhdGNoX3RpbWU9JXUifSwKIAl7T3B0X2pvdXJuYWxfdXBkYXRlLCAiam91cm5hbD11cGRhdGUifSwKLQl7T3B0X2pvdXJuYWxfaW51bSwgImpvdXJuYWw9JXUifSwKIAl7T3B0X2pvdXJuYWxfZGV2LCAiam91cm5hbF9kZXY9JXUifSwKIAl7T3B0X2pvdXJuYWxfY2hlY2tzdW0sICJqb3VybmFsX2NoZWNrc3VtIn0sCiAJe09wdF9qb3VybmFsX2FzeW5jX2NvbW1pdCwgImpvdXJuYWxfYXN5bmNfY29tbWl0In0sCkBAIC05MTEsMTQgKzEwNjYsMTMgQEAKIAl7T3B0X3F1b3RhLCAicXVvdGEifSwKIAl7T3B0X3VzcnF1b3RhLCAidXNycXVvdGEifSwKIAl7T3B0X2JhcnJpZXIsICJiYXJyaWVyPSV1In0sCi0Je09wdF9leHRlbnRzLCAiZXh0ZW50cyJ9LAotCXtPcHRfbm9leHRlbnRzLCAibm9leHRlbnRzIn0sCiAJe09wdF9pX3ZlcnNpb24sICJpX3ZlcnNpb24ifSwKIAl7T3B0X3N0cmlwZSwgInN0cmlwZT0ldSJ9LAogCXtPcHRfcmVzaXplLCAicmVzaXplIn0sCiAJe09wdF9kZWxhbGxvYywgImRlbGFsbG9jIn0sCiAJe09wdF9ub2RlbGFsbG9jLCAibm9kZWxhbGxvYyJ9LAogCXtPcHRfaW5vZGVfcmVhZGFoZWFkX2Jsa3MsICJpbm9kZV9yZWFkYWhlYWRfYmxrcz0ldSJ9LAorCXtPcHRfam91cm5hbF9pb3ByaW8sICJqb3VybmFsX2lvcHJpbz0ldSJ9LAogCXtPcHRfZXJyLCBOVUxMfSwKIH07CiAKQEAgLTk0Myw4ICsxMDk3LDExIEBACiAJcmV0dXJuIHNiX2Jsb2NrOwogfQogCisjZGVmaW5lIERFRkFVTFRfSk9VUk5BTF9JT1BSSU8gKElPUFJJT19QUklPX1ZBTFVFKElPUFJJT19DTEFTU19CRSwgMykpCisKIHN0YXRpYyBpbnQgcGFyc2Vfb3B0aW9ucyhjaGFyICpvcHRpb25zLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAotCQkJIHVuc2lnbmVkIGludCAqaW51bSwgdW5zaWduZWQgbG9uZyAqam91cm5hbF9kZXZudW0sCisJCQkgdW5zaWduZWQgbG9uZyAqam91cm5hbF9kZXZudW0sCisJCQkgdW5zaWduZWQgaW50ICpqb3VybmFsX2lvcHJpbywKIAkJCSBleHQ0X2ZzYmxrX3QgKm5fYmxvY2tzX2NvdW50LCBpbnQgaXNfcmVtb3VudCkKIHsKIAlzdHJ1Y3QgZXh0NF9zYl9pbmZvICpzYmkgPSBFWFQ0X1NCKHNiKTsKQEAgLTk1Niw3ICsxMTEzLDYgQEAKIAlpbnQgcXR5cGUsIHFmbXQ7CiAJY2hhciAqcW5hbWU7CiAjZW5kaWYKLQlleHQ0X2ZzYmxrX3QgbGFzdF9ibG9jazsKIAogCWlmICghb3B0aW9ucykKIAkJcmV0dXJuIDE7CkBAIC0xMDY4LDE2ICsxMjI0LDYgQEAKIAkJCX0KIAkJCXNldF9vcHQoc2JpLT5zX21vdW50X29wdCwgVVBEQVRFX0pPVVJOQUwpOwogCQkJYnJlYWs7Ci0JCWNhc2UgT3B0X2pvdXJuYWxfaW51bToKLQkJCWlmIChpc19yZW1vdW50KSB7Ci0JCQkJcHJpbnRrKEtFUk5fRVJSICJFWFQ0LWZzOiBjYW5ub3Qgc3BlY2lmeSAiCi0JCQkJICAgICAgICJqb3VybmFsIG9uIHJlbW91bnRcbiIpOwotCQkJCXJldHVybiAwOwotCQkJfQotCQkJaWYgKG1hdGNoX2ludCgmYXJnc1swXSwgJm9wdGlvbikpCi0JCQkJcmV0dXJuIDA7Ci0JCQkqaW51bSA9IG9wdGlvbjsKLQkJCWJyZWFrOwogCQljYXNlIE9wdF9qb3VybmFsX2RldjoKIAkJCWlmIChpc19yZW1vdW50KSB7CiAJCQkJcHJpbnRrKEtFUk5fRVJSICJFWFQ0LWZzOiBjYW5ub3Qgc3BlY2lmeSAiCkBAIC0xMTA3LDYgKzEyNTMsMjIgQEAKIAkJCQlvcHRpb24gPSBKQkQyX0RFRkFVTFRfTUFYX0NPTU1JVF9BR0U7CiAJCQlzYmktPnNfY29tbWl0X2ludGVydmFsID0gSFogKiBvcHRpb247CiAJCQlicmVhazsKKwkJY2FzZSBPcHRfbWF4X2JhdGNoX3RpbWU6CisJCQlpZiAobWF0Y2hfaW50KCZhcmdzWzBdLCAmb3B0aW9uKSkKKwkJCQlyZXR1cm4gMDsKKwkJCWlmIChvcHRpb24gPCAwKQorCQkJCXJldHVybiAwOworCQkJaWYgKG9wdGlvbiA9PSAwKQorCQkJCW9wdGlvbiA9IEVYVDRfREVGX01BWF9CQVRDSF9USU1FOworCQkJc2JpLT5zX21heF9iYXRjaF90aW1lID0gb3B0aW9uOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X21pbl9iYXRjaF90aW1lOgorCQkJaWYgKG1hdGNoX2ludCgmYXJnc1swXSwgJm9wdGlvbikpCisJCQkJcmV0dXJuIDA7CisJCQlpZiAob3B0aW9uIDwgMCkKKwkJCQlyZXR1cm4gMDsKKwkJCXNiaS0+c19taW5fYmF0Y2hfdGltZSA9IG9wdGlvbjsKKwkJCWJyZWFrOwogCQljYXNlIE9wdF9kYXRhX2pvdXJuYWw6CiAJCQlkYXRhX29wdCA9IEVYVDRfTU9VTlRfSk9VUk5BTF9EQVRBOwogCQkJZ290byBkYXRhY2hlY2s7CkBAIC0xMTQyLDggKzEzMDQsNyBAQAogCQljYXNlIE9wdF9ncnBqcXVvdGE6CiAJCQlxdHlwZSA9IEdSUFFVT1RBOwogc2V0X3FmX25hbWU6Ci0JCQlpZiAoKHNiX2FueV9xdW90YV9lbmFibGVkKHNiKSB8fAotCQkJICAgICBzYl9hbnlfcXVvdGFfc3VzcGVuZGVkKHNiKSkgJiYKKwkJCWlmIChzYl9hbnlfcXVvdGFfbG9hZGVkKHNiKSAmJgogCQkJICAgICFzYmktPnNfcWZfbmFtZXNbcXR5cGVdKSB7CiAJCQkJcHJpbnRrKEtFUk5fRVJSCiAJCQkJICAgICAgICJFWFQ0LWZzOiBDYW5ub3QgY2hhbmdlIGpvdXJuYWxlZCAiCkBAIC0xMTgyLDggKzEzNDMsNyBAQAogCQljYXNlIE9wdF9vZmZncnBqcXVvdGE6CiAJCQlxdHlwZSA9IEdSUFFVT1RBOwogY2xlYXJfcWZfbmFtZToKLQkJCWlmICgoc2JfYW55X3F1b3RhX2VuYWJsZWQoc2IpIHx8Ci0JCQkgICAgIHNiX2FueV9xdW90YV9zdXNwZW5kZWQoc2IpKSAmJgorCQkJaWYgKHNiX2FueV9xdW90YV9sb2FkZWQoc2IpICYmCiAJCQkgICAgc2JpLT5zX3FmX25hbWVzW3F0eXBlXSkgewogCQkJCXByaW50ayhLRVJOX0VSUiAiRVhUNC1mczogQ2Fubm90IGNoYW5nZSAiCiAJCQkJCSJqb3VybmFsZWQgcXVvdGEgb3B0aW9ucyB3aGVuICIKQEAgLTEyMDIsOCArMTM2Miw3IEBACiAJCWNhc2UgT3B0X2pxZm10X3Zmc3YwOgogCQkJcWZtdCA9IFFGTVRfVkZTX1YwOwogc2V0X3FmX2Zvcm1hdDoKLQkJCWlmICgoc2JfYW55X3F1b3RhX2VuYWJsZWQoc2IpIHx8Ci0JCQkgICAgIHNiX2FueV9xdW90YV9zdXNwZW5kZWQoc2IpKSAmJgorCQkJaWYgKHNiX2FueV9xdW90YV9sb2FkZWQoc2IpICYmCiAJCQkgICAgc2JpLT5zX2pxdW90YV9mbXQgIT0gcWZtdCkgewogCQkJCXByaW50ayhLRVJOX0VSUiAiRVhUNC1mczogQ2Fubm90IGNoYW5nZSAiCiAJCQkJCSJqb3VybmFsZWQgcXVvdGEgb3B0aW9ucyB3aGVuICIKQEAgLTEyMjIsNyArMTM4MSw3IEBACiAJCQlzZXRfb3B0KHNiaS0+c19tb3VudF9vcHQsIEdSUFFVT1RBKTsKIAkJCWJyZWFrOwogCQljYXNlIE9wdF9ub3F1b3RhOgotCQkJaWYgKHNiX2FueV9xdW90YV9lbmFibGVkKHNiKSkgeworCQkJaWYgKHNiX2FueV9xdW90YV9sb2FkZWQoc2IpKSB7CiAJCQkJcHJpbnRrKEtFUk5fRVJSICJFWFQ0LWZzOiBDYW5ub3QgY2hhbmdlIHF1b3RhICIKIAkJCQkJIm9wdGlvbnMgd2hlbiBxdW90YSB0dXJuZWQgb24uXG4iKTsKIAkJCQlyZXR1cm4gMDsKQEAgLTEyODAsMzMgKzE0MzksNiBAQAogCQljYXNlIE9wdF9iaDoKIAkJCWNsZWFyX29wdChzYmktPnNfbW91bnRfb3B0LCBOT0JIKTsKIAkJCWJyZWFrOwotCQljYXNlIE9wdF9leHRlbnRzOgotCQkJaWYgKCFFWFQ0X0hBU19JTkNPTVBBVF9GRUFUVVJFKHNiLAotCQkJCQlFWFQ0X0ZFQVRVUkVfSU5DT01QQVRfRVhURU5UUykpIHsKLQkJCQlleHQ0X3dhcm5pbmcoc2IsIF9fZnVuY19fLAotCQkJCQkiZXh0ZW50cyBmZWF0dXJlIG5vdCBlbmFibGVkICIKLQkJCQkJIm9uIHRoaXMgZmlsZXN5c3RlbSwgdXNlIHR1bmUyZnNcbiIpOwotCQkJCXJldHVybiAwOwotCQkJfQotCQkJc2V0X29wdChzYmktPnNfbW91bnRfb3B0LCBFWFRFTlRTKTsKLQkJCWJyZWFrOwotCQljYXNlIE9wdF9ub2V4dGVudHM6Ci0JCQkvKgotCQkJICogV2hlbiBlMmZzcHJvZ3Mgc3VwcG9ydCByZXNpemluZyBhbiBhbHJlYWR5IGV4aXN0aW5nCi0JCQkgKiBleHQzIGZpbGUgc3lzdGVtIHRvIGdyZWF0ZXIgdGhhbiAyKiozMiB3ZSBuZWVkIHRvCi0JCQkgKiBhZGQgc3VwcG9ydCB0byBibG9jayBhbGxvY2F0b3IgdG8gaGFuZGxlIGdyb3dpbmcKLQkJCSAqIGFscmVhZHkgZXhpc3RpbmcgYmxvY2sgIG1hcHBlZCBpbm9kZSBzbyB0aGF0IGJsb2NrcwotCQkJICogYWxsb2NhdGVkIGZvciB0aGVtIGZhbGwgd2l0aGluIDIqKjMyCi0JCQkgKi8KLQkJCWxhc3RfYmxvY2sgPSBleHQ0X2Jsb2Nrc19jb3VudChzYmktPnNfZXMpIC0gMTsKLQkJCWlmIChsYXN0X2Jsb2NrICA+IDB4ZmZmZmZmZmZVTEwpIHsKLQkJCQlwcmludGsoS0VSTl9FUlIgIkVYVDQtZnM6IEZpbGVzeXN0ZW0gdG9vICIKLQkJCQkJCSJsYXJnZSB0byBtb3VudCB3aXRoICIKLQkJCQkJCSItbyBub2V4dGVudHMgb3B0aW9uc1xuIik7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCQljbGVhcl9vcHQoc2JpLT5zX21vdW50X29wdCwgRVhURU5UUyk7Ci0JCQlicmVhazsKIAkJY2FzZSBPcHRfaV92ZXJzaW9uOgogCQkJc2V0X29wdChzYmktPnNfbW91bnRfb3B0LCBJX1ZFUlNJT04pOwogCQkJc2ItPnNfZmxhZ3MgfD0gTVNfSV9WRVJTSU9OOwpAQCAtMTMzMSw2ICsxNDYzLDE0IEBACiAJCQkJcmV0dXJuIDA7CiAJCQlzYmktPnNfaW5vZGVfcmVhZGFoZWFkX2Jsa3MgPSBvcHRpb247CiAJCQlicmVhazsKKwkJY2FzZSBPcHRfam91cm5hbF9pb3ByaW86CisJCQlpZiAobWF0Y2hfaW50KCZhcmdzWzBdLCAmb3B0aW9uKSkKKwkJCQlyZXR1cm4gMDsKKwkJCWlmIChvcHRpb24gPCAwIHx8IG9wdGlvbiA+IDcpCisJCQkJYnJlYWs7CisJCQkqam91cm5hbF9pb3ByaW8gPSBJT1BSSU9fUFJJT19WQUxVRShJT1BSSU9fQ0xBU1NfQkUsCisJCQkJCQkJICAgIG9wdGlvbik7CisJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCXByaW50ayhLRVJOX0VSUgogCQkJICAgICAgICJFWFQ0LWZzOiBVbnJlY29nbml6ZWQgbW91bnQgb3B0aW9uIFwiJXNcIiAiCkBAIC0xNDA2LDI0ICsxNTQ2LDE5IEBACiAJCXByaW50ayhLRVJOX1dBUk5JTkcKIAkJICAgICAgICJFWFQ0LWZzIHdhcm5pbmc6IGNoZWNrdGltZSByZWFjaGVkLCAiCiAJCSAgICAgICAicnVubmluZyBlMmZzY2sgaXMgcmVjb21tZW5kZWRcbiIpOwotI2lmIDAKLQkJLyogQEBAIFdlIF93aWxsXyB3YW50IHRvIGNsZWFyIHRoZSB2YWxpZCBiaXQgaWYgd2UgZmluZAotCQkgKiBpbmNvbnNpc3RlbmNpZXMsIHRvIGZvcmNlIGEgZnNjayBhdCByZWJvb3QuICBCdXQgZm9yCi0JCSAqIGEgcGxhaW4gam91cm5hbGVkIGZpbGVzeXN0ZW0gd2UgY2FuIGtlZXAgaXQgc2V0IGFzCi0JCSAqIHZhbGlkIGZvcmV2ZXIhIDopCi0JCSAqLwotCWVzLT5zX3N0YXRlICY9IGNwdV90b19sZTE2KH5FWFQ0X1ZBTElEX0ZTKTsKLSNlbmRpZgorCWlmICghc2JpLT5zX2pvdXJuYWwpIAorCQllcy0+c19zdGF0ZSAmPSBjcHVfdG9fbGUxNih+RVhUNF9WQUxJRF9GUyk7CiAJaWYgKCEoX19zMTYpIGxlMTZfdG9fY3B1KGVzLT5zX21heF9tbnRfY291bnQpKQogCQllcy0+c19tYXhfbW50X2NvdW50ID0gY3B1X3RvX2xlMTYoRVhUNF9ERkxfTUFYX01OVF9DT1VOVCk7CiAJbGUxNl9hZGRfY3B1KCZlcy0+c19tbnRfY291bnQsIDEpOwogCWVzLT5zX210aW1lID0gY3B1X3RvX2xlMzIoZ2V0X3NlY29uZHMoKSk7CiAJZXh0NF91cGRhdGVfZHluYW1pY19yZXYoc2IpOwotCUVYVDRfU0VUX0lOQ09NUEFUX0ZFQVRVUkUoc2IsIEVYVDRfRkVBVFVSRV9JTkNPTVBBVF9SRUNPVkVSKTsKKwlpZiAoc2JpLT5zX2pvdXJuYWwpCisJCUVYVDRfU0VUX0lOQ09NUEFUX0ZFQVRVUkUoc2IsIEVYVDRfRkVBVFVSRV9JTkNPTVBBVF9SRUNPVkVSKTsKIAogCWV4dDRfY29tbWl0X3N1cGVyKHNiLCBlcywgMSk7CiAJaWYgKHRlc3Rfb3B0KHNiLCBERUJVRykpCi0JCXByaW50ayhLRVJOX0lORk8gIltFWFQ0IEZTIGJzPSVsdSwgZ2M9JWx1LCAiCisJCXByaW50ayhLRVJOX0lORk8gIltFWFQ0IEZTIGJzPSVsdSwgZ2M9JXUsICIKIAkJCQkiYnBnPSVsdSwgaXBnPSVsdSwgbW89JTA0bHhdXG4iLAogCQkJc2ItPnNfYmxvY2tzaXplLAogCQkJc2JpLT5zX2dyb3Vwc19jb3VudCwKQEAgLTE0MzEsOSArMTU2NiwxMyBAQAogCQkJRVhUNF9JTk9ERVNfUEVSX0dST1VQKHNiKSwKIAkJCXNiaS0+c19tb3VudF9vcHQpOwogCi0JcHJpbnRrKEtFUk5fSU5GTyAiRVhUNCBGUyBvbiAlcywgJXMgam91cm5hbCBvbiAlc1xuIiwKLQkgICAgICAgc2ItPnNfaWQsIEVYVDRfU0Ioc2IpLT5zX2pvdXJuYWwtPmpfaW5vZGUgPyAiaW50ZXJuYWwiIDoKLQkgICAgICAgImV4dGVybmFsIiwgRVhUNF9TQihzYiktPnNfam91cm5hbC0+al9kZXZuYW1lKTsKKwlpZiAoRVhUNF9TQihzYiktPnNfam91cm5hbCkgeworCQlwcmludGsoS0VSTl9JTkZPICJFWFQ0IEZTIG9uICVzLCAlcyBqb3VybmFsIG9uICVzXG4iLAorCQkgICAgICAgc2ItPnNfaWQsIEVYVDRfU0Ioc2IpLT5zX2pvdXJuYWwtPmpfaW5vZGUgPyAiaW50ZXJuYWwiIDoKKwkJICAgICAgICJleHRlcm5hbCIsIEVYVDRfU0Ioc2IpLT5zX2pvdXJuYWwtPmpfZGV2bmFtZSk7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiRVhUNCBGUyBvbiAlcywgbm8gam91cm5hbFxuIiwgc2ItPnNfaWQpOworCX0KIAlyZXR1cm4gcmVzOwogfQogCkBAIC0xNDQ1LDcgKzE1ODQsNiBAQAogCWV4dDRfZ3JvdXBfdCBmbGV4X2dyb3VwX2NvdW50OwogCWV4dDRfZ3JvdXBfdCBmbGV4X2dyb3VwOwogCWludCBncm91cHNfcGVyX2ZsZXggPSAwOwotCV9fdTY0IGJsb2NrX2JpdG1hcCA9IDA7CiAJaW50IGk7CiAKIAlpZiAoIXNiaS0+c19lcy0+c19sb2dfZ3JvdXBzX3Blcl9mbGV4KSB7CkBAIC0xNDY0LDIxICsxNjAyLDE4IEBACiAJCQkJICAgICBzaXplb2Yoc3RydWN0IGZsZXhfZ3JvdXBzKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHNiaS0+c19mbGV4X2dyb3VwcyA9PSBOVUxMKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiRVhUNC1mczogbm90IGVub3VnaCBtZW1vcnkgZm9yICIKLQkJCQkiJWx1IGZsZXggZ3JvdXBzXG4iLCBmbGV4X2dyb3VwX2NvdW50KTsKKwkJCQkiJXUgZmxleCBncm91cHNcbiIsIGZsZXhfZ3JvdXBfY291bnQpOwogCQlnb3RvIGZhaWxlZDsKIAl9CiAKLQlnZHAgPSBleHQ0X2dldF9ncm91cF9kZXNjKHNiLCAxLCAmYmgpOwotCWJsb2NrX2JpdG1hcCA9IGV4dDRfYmxvY2tfYml0bWFwKHNiLCBnZHApIC0gMTsKLQogCWZvciAoaSA9IDA7IGkgPCBzYmktPnNfZ3JvdXBzX2NvdW50OyBpKyspIHsKIAkJZ2RwID0gZXh0NF9nZXRfZ3JvdXBfZGVzYyhzYiwgaSwgJmJoKTsKIAogCQlmbGV4X2dyb3VwID0gZXh0NF9mbGV4X2dyb3VwKHNiaSwgaSk7CiAJCXNiaS0+c19mbGV4X2dyb3Vwc1tmbGV4X2dyb3VwXS5mcmVlX2lub2RlcyArPQotCQkJbGUxNl90b19jcHUoZ2RwLT5iZ19mcmVlX2lub2Rlc19jb3VudCk7CisJCQlleHQ0X2ZyZWVfaW5vZGVzX2NvdW50KHNiLCBnZHApOwogCQlzYmktPnNfZmxleF9ncm91cHNbZmxleF9ncm91cF0uZnJlZV9ibG9ja3MgKz0KLQkJCWxlMTZfdG9fY3B1KGdkcC0+YmdfZnJlZV9ibG9ja3NfY291bnQpOworCQkJZXh0NF9mcmVlX2Jsa3NfY291bnQoc2IsIGdkcCk7CiAJfQogCiAJcmV0dXJuIDE7CkBAIC0xNTUyLDE0ICsxNjg3LDE0IEBACiAJCWJsb2NrX2JpdG1hcCA9IGV4dDRfYmxvY2tfYml0bWFwKHNiLCBnZHApOwogCQlpZiAoYmxvY2tfYml0bWFwIDwgZmlyc3RfYmxvY2sgfHwgYmxvY2tfYml0bWFwID4gbGFzdF9ibG9jaykgewogCQkJcHJpbnRrKEtFUk5fRVJSICJFWFQ0LWZzOiBleHQ0X2NoZWNrX2Rlc2NyaXB0b3JzOiAiCi0JCQkgICAgICAgIkJsb2NrIGJpdG1hcCBmb3IgZ3JvdXAgJWx1IG5vdCBpbiBncm91cCAiCisJCQkgICAgICAgIkJsb2NrIGJpdG1hcCBmb3IgZ3JvdXAgJXUgbm90IGluIGdyb3VwICIKIAkJCSAgICAgICAiKGJsb2NrICVsbHUpIVxuIiwgaSwgYmxvY2tfYml0bWFwKTsKIAkJCXJldHVybiAwOwogCQl9CiAJCWlub2RlX2JpdG1hcCA9IGV4dDRfaW5vZGVfYml0bWFwKHNiLCBnZHApOwogCQlpZiAoaW5vZGVfYml0bWFwIDwgZmlyc3RfYmxvY2sgfHwgaW5vZGVfYml0bWFwID4gbGFzdF9ibG9jaykgewogCQkJcHJpbnRrKEtFUk5fRVJSICJFWFQ0LWZzOiBleHQ0X2NoZWNrX2Rlc2NyaXB0b3JzOiAiCi0JCQkgICAgICAgIklub2RlIGJpdG1hcCBmb3IgZ3JvdXAgJWx1IG5vdCBpbiBncm91cCAiCisJCQkgICAgICAgIklub2RlIGJpdG1hcCBmb3IgZ3JvdXAgJXUgbm90IGluIGdyb3VwICIKIAkJCSAgICAgICAiKGJsb2NrICVsbHUpIVxuIiwgaSwgaW5vZGVfYml0bWFwKTsKIAkJCXJldHVybiAwOwogCQl9CkBAIC0xNTY3LDE0ICsxNzAyLDE0IEBACiAJCWlmIChpbm9kZV90YWJsZSA8IGZpcnN0X2Jsb2NrIHx8CiAJCSAgICBpbm9kZV90YWJsZSArIHNiaS0+c19pdGJfcGVyX2dyb3VwIC0gMSA+IGxhc3RfYmxvY2spIHsKIAkJCXByaW50ayhLRVJOX0VSUiAiRVhUNC1mczogZXh0NF9jaGVja19kZXNjcmlwdG9yczogIgotCQkJICAgICAgICJJbm9kZSB0YWJsZSBmb3IgZ3JvdXAgJWx1IG5vdCBpbiBncm91cCAiCisJCQkgICAgICAgIklub2RlIHRhYmxlIGZvciBncm91cCAldSBub3QgaW4gZ3JvdXAgIgogCQkJICAgICAgICIoYmxvY2sgJWxsdSkhXG4iLCBpLCBpbm9kZV90YWJsZSk7CiAJCQlyZXR1cm4gMDsKIAkJfQogCQlzcGluX2xvY2soc2JfYmdsX2xvY2soc2JpLCBpKSk7CiAJCWlmICghZXh0NF9ncm91cF9kZXNjX2NzdW1fdmVyaWZ5KHNiaSwgaSwgZ2RwKSkgewogCQkJcHJpbnRrKEtFUk5fRVJSICJFWFQ0LWZzOiBleHQ0X2NoZWNrX2Rlc2NyaXB0b3JzOiAiCi0JCQkgICAgICAgIkNoZWNrc3VtIGZvciBncm91cCAlbHUgZmFpbGVkICgldSE9JXUpXG4iLAorCQkJICAgICAgICJDaGVja3N1bSBmb3IgZ3JvdXAgJXUgZmFpbGVkICgldSE9JXUpXG4iLAogCQkJICAgICAgIGksIGxlMTZfdG9fY3B1KGV4dDRfZ3JvdXBfZGVzY19jc3VtKHNiaSwgaSwKIAkJCSAgICAgICBnZHApKSwgbGUxNl90b19jcHUoZ2RwLT5iZ19jaGVja3N1bSkpOwogCQkJaWYgKCEoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpKSB7CkBAIC0xODY2LDE5ICsyMDAxLDIwIEBACiAJZXh0NF9mc2Jsa190IHNiX2Jsb2NrID0gZ2V0X3NiX2Jsb2NrKCZkYXRhKTsKIAlleHQ0X2ZzYmxrX3QgbG9naWNhbF9zYl9ibG9jazsKIAl1bnNpZ25lZCBsb25nIG9mZnNldCA9IDA7Ci0JdW5zaWduZWQgaW50IGpvdXJuYWxfaW51bSA9IDA7CiAJdW5zaWduZWQgbG9uZyBqb3VybmFsX2Rldm51bSA9IDA7CiAJdW5zaWduZWQgbG9uZyBkZWZfbW91bnRfb3B0czsKIAlzdHJ1Y3QgaW5vZGUgKnJvb3Q7CiAJY2hhciAqY3A7CisJY29uc3QgY2hhciAqZGVzY3I7CiAJaW50IHJldCA9IC1FSU5WQUw7CiAJaW50IGJsb2Nrc2l6ZTsKLQlpbnQgZGJfY291bnQ7Ci0JaW50IGk7CisJdW5zaWduZWQgaW50IGRiX2NvdW50OworCXVuc2lnbmVkIGludCBpOwogCWludCBuZWVkc19yZWNvdmVyeSwgaGFzX2h1Z2VfZmlsZXM7Ci0JX19sZTMyIGZlYXR1cmVzOworCWludCBmZWF0dXJlczsKIAlfX3U2NCBibG9ja3NfY291bnQ7CiAJaW50IGVycjsKKwl1bnNpZ25lZCBpbnQgam91cm5hbF9pb3ByaW8gPSBERUZBVUxUX0pPVVJOQUxfSU9QUklPOwogCiAJc2JpID0ga3phbGxvYyhzaXplb2YoKnNiaSksIEdGUF9LRVJORUwpOwogCWlmICghc2JpKQpAQCAtMTk1OSwzMSArMjA5NSwyMiBAQAogCiAJc2JpLT5zX3Jlc3VpZCA9IGxlMTZfdG9fY3B1KGVzLT5zX2RlZl9yZXN1aWQpOwogCXNiaS0+c19yZXNnaWQgPSBsZTE2X3RvX2NwdShlcy0+c19kZWZfcmVzZ2lkKTsKKwlzYmktPnNfY29tbWl0X2ludGVydmFsID0gSkJEMl9ERUZBVUxUX01BWF9DT01NSVRfQUdFICogSFo7CisJc2JpLT5zX21pbl9iYXRjaF90aW1lID0gRVhUNF9ERUZfTUlOX0JBVENIX1RJTUU7CisJc2JpLT5zX21heF9iYXRjaF90aW1lID0gRVhUNF9ERUZfTUFYX0JBVENIX1RJTUU7CiAKIAlzZXRfb3B0KHNiaS0+c19tb3VudF9vcHQsIFJFU0VSVkFUSU9OKTsKIAlzZXRfb3B0KHNiaS0+c19tb3VudF9vcHQsIEJBUlJJRVIpOwogCiAJLyoKLQkgKiB0dXJuIG9uIGV4dGVudHMgZmVhdHVyZSBieSBkZWZhdWx0IGluIGV4dDQgZmlsZXN5c3RlbQotCSAqIG9ubHkgaWYgZmVhdHVyZSBmbGFnIGFscmVhZHkgc2V0IGJ5IG1rZnMgb3IgdHVuZTJmcy4KLQkgKiBVc2UgLW8gbm9leHRlbnRzIHRvIHR1cm4gaXQgb2ZmCi0JICovCi0JaWYgKEVYVDRfSEFTX0lOQ09NUEFUX0ZFQVRVUkUoc2IsIEVYVDRfRkVBVFVSRV9JTkNPTVBBVF9FWFRFTlRTKSkKLQkJc2V0X29wdChzYmktPnNfbW91bnRfb3B0LCBFWFRFTlRTKTsKLQllbHNlCi0JCWV4dDRfd2FybmluZyhzYiwgX19mdW5jX18sCi0JCQkiZXh0ZW50cyBmZWF0dXJlIG5vdCBlbmFibGVkIG9uIHRoaXMgZmlsZXN5c3RlbSwgIgotCQkJInVzZSB0dW5lMmZzLlxuIik7Ci0KLQkvKgogCSAqIGVuYWJsZSBkZWxheWVkIGFsbG9jYXRpb24gYnkgZGVmYXVsdAogCSAqIFVzZSAtbyBub2RlbGFsbG9jIHRvIHR1cm4gaXQgb2ZmCiAJICovCiAJc2V0X29wdChzYmktPnNfbW91bnRfb3B0LCBERUxBTExPQyk7CiAKIAotCWlmICghcGFyc2Vfb3B0aW9ucygoY2hhciAqKSBkYXRhLCBzYiwgJmpvdXJuYWxfaW51bSwgJmpvdXJuYWxfZGV2bnVtLAotCQkJICAgTlVMTCwgMCkpCisJaWYgKCFwYXJzZV9vcHRpb25zKChjaGFyICopIGRhdGEsIHNiLCAmam91cm5hbF9kZXZudW0sCisJCQkgICAmam91cm5hbF9pb3ByaW8sIE5VTEwsIDApKQogCQlnb3RvIGZhaWxlZF9tb3VudDsKIAogCXNiLT5zX2ZsYWdzID0gKHNiLT5zX2ZsYWdzICYgfk1TX1BPU0lYQUNMKSB8CkBAIC0yMDA1LDE1ICsyMTMyLDE3IEBACiAJZmVhdHVyZXMgPSBFWFQ0X0hBU19JTkNPTVBBVF9GRUFUVVJFKHNiLCB+RVhUNF9GRUFUVVJFX0lOQ09NUEFUX1NVUFApOwogCWlmIChmZWF0dXJlcykgewogCQlwcmludGsoS0VSTl9FUlIgIkVYVDQtZnM6ICVzOiBjb3VsZG4ndCBtb3VudCBiZWNhdXNlIG9mICIKLQkJICAgICAgICJ1bnN1cHBvcnRlZCBvcHRpb25hbCBmZWF0dXJlcyAoJXgpLlxuIiwKLQkJICAgICAgIHNiLT5zX2lkLCBsZTMyX3RvX2NwdShmZWF0dXJlcykpOworCQkgICAgICAgInVuc3VwcG9ydGVkIG9wdGlvbmFsIGZlYXR1cmVzICgleCkuXG4iLCBzYi0+c19pZCwKKwkJCShsZTMyX3RvX2NwdShFWFQ0X1NCKHNiKS0+c19lcy0+c19mZWF0dXJlX2luY29tcGF0KSAmCisJCQl+RVhUNF9GRUFUVVJFX0lOQ09NUEFUX1NVUFApKTsKIAkJZ290byBmYWlsZWRfbW91bnQ7CiAJfQogCWZlYXR1cmVzID0gRVhUNF9IQVNfUk9fQ09NUEFUX0ZFQVRVUkUoc2IsIH5FWFQ0X0ZFQVRVUkVfUk9fQ09NUEFUX1NVUFApOwogCWlmICghKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSAmJiBmZWF0dXJlcykgewogCQlwcmludGsoS0VSTl9FUlIgIkVYVDQtZnM6ICVzOiBjb3VsZG4ndCBtb3VudCBSRFdSIGJlY2F1c2Ugb2YgIgotCQkgICAgICAgInVuc3VwcG9ydGVkIG9wdGlvbmFsIGZlYXR1cmVzICgleCkuXG4iLAotCQkgICAgICAgc2ItPnNfaWQsIGxlMzJfdG9fY3B1KGZlYXR1cmVzKSk7CisJCSAgICAgICAidW5zdXBwb3J0ZWQgb3B0aW9uYWwgZmVhdHVyZXMgKCV4KS5cbiIsIHNiLT5zX2lkLAorCQkJKGxlMzJfdG9fY3B1KEVYVDRfU0Ioc2IpLT5zX2VzLT5zX2ZlYXR1cmVfcm9fY29tcGF0KSAmCisJCQl+RVhUNF9GRUFUVVJFX1JPX0NPTVBBVF9TVVBQKSk7CiAJCWdvdG8gZmFpbGVkX21vdW50OwogCX0KIAloYXNfaHVnZV9maWxlcyA9IEVYVDRfSEFTX1JPX0NPTVBBVF9GRUFUVVJFKHNiLApAQCAtMjExOCw2ICsyMjQ3LDE4IEBACiAJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKIAkJc2JpLT5zX2hhc2hfc2VlZFtpXSA9IGxlMzJfdG9fY3B1KGVzLT5zX2hhc2hfc2VlZFtpXSk7CiAJc2JpLT5zX2RlZl9oYXNoX3ZlcnNpb24gPSBlcy0+c19kZWZfaGFzaF92ZXJzaW9uOworCWkgPSBsZTMyX3RvX2NwdShlcy0+c19mbGFncyk7CisJaWYgKGkgJiBFWFQyX0ZMQUdTX1VOU0lHTkVEX0hBU0gpCisJCXNiaS0+c19oYXNoX3Vuc2lnbmVkID0gMzsKKwllbHNlIGlmICgoaSAmIEVYVDJfRkxBR1NfU0lHTkVEX0hBU0gpID09IDApIHsKKyNpZmRlZiBfX0NIQVJfVU5TSUdORURfXworCQllcy0+c19mbGFncyB8PSBjcHVfdG9fbGUzMihFWFQyX0ZMQUdTX1VOU0lHTkVEX0hBU0gpOworCQlzYmktPnNfaGFzaF91bnNpZ25lZCA9IDM7CisjZWxzZQorCQllcy0+c19mbGFncyB8PSBjcHVfdG9fbGUzMihFWFQyX0ZMQUdTX1NJR05FRF9IQVNIKTsKKyNlbmRpZgorCQlzYi0+c19kaXJ0ID0gMTsKKwl9CiAKIAlpZiAoc2JpLT5zX2Jsb2Nrc19wZXJfZ3JvdXAgPiBibG9ja3NpemUgKiA4KSB7CiAJCXByaW50ayhLRVJOX0VSUgpAQCAtMjE0NSwyMCArMjI4NiwzMCBAQAogCWlmIChFWFQ0X0JMT0NLU19QRVJfR1JPVVAoc2IpID09IDApCiAJCWdvdG8gY2FudGZpbmRfZXh0NDsKIAotCS8qIGVuc3VyZSBibG9ja3NfY291bnQgY2FsY3VsYXRpb24gYmVsb3cgZG9lc24ndCBzaWduLWV4dGVuZCAqLwotCWlmIChleHQ0X2Jsb2Nrc19jb3VudChlcykgKyBFWFQ0X0JMT0NLU19QRVJfR1JPVVAoc2IpIDwKLQkgICAgbGUzMl90b19jcHUoZXMtPnNfZmlyc3RfZGF0YV9ibG9jaykgKyAxKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIkVYVDQtZnM6IGJhZCBnZW9tZXRyeTogYmxvY2sgY291bnQgJWxsdSwgIgotCQkgICAgICAgImZpcnN0IGRhdGEgYmxvY2sgJXUsIGJsb2NrcyBwZXIgZ3JvdXAgJWx1XG4iLAotCQkJZXh0NF9ibG9ja3NfY291bnQoZXMpLAotCQkJbGUzMl90b19jcHUoZXMtPnNfZmlyc3RfZGF0YV9ibG9jayksCi0JCQlFWFQ0X0JMT0NLU19QRVJfR1JPVVAoc2IpKTsKKyAgICAgICAgLyoKKyAgICAgICAgICogSXQgbWFrZXMgbm8gc2Vuc2UgZm9yIHRoZSBmaXJzdCBkYXRhIGJsb2NrIHRvIGJlIGJleW9uZCB0aGUgZW5kCisgICAgICAgICAqIG9mIHRoZSBmaWxlc3lzdGVtLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKGxlMzJfdG9fY3B1KGVzLT5zX2ZpcnN0X2RhdGFfYmxvY2spID49IGV4dDRfYmxvY2tzX2NvdW50KGVzKSkgeworICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX1dBUk5JTkcgIkVYVDQtZnM6IGJhZCBnZW9tZXRyeTogZmlyc3QgZGF0YSIKKwkJICAgICAgICJibG9jayAldSBpcyBiZXlvbmQgZW5kIG9mIGZpbGVzeXN0ZW0gKCVsbHUpXG4iLAorCQkgICAgICAgbGUzMl90b19jcHUoZXMtPnNfZmlyc3RfZGF0YV9ibG9jayksCisJCSAgICAgICBleHQ0X2Jsb2Nrc19jb3VudChlcykpOwogCQlnb3RvIGZhaWxlZF9tb3VudDsKIAl9CiAJYmxvY2tzX2NvdW50ID0gKGV4dDRfYmxvY2tzX2NvdW50KGVzKSAtCiAJCQlsZTMyX3RvX2NwdShlcy0+c19maXJzdF9kYXRhX2Jsb2NrKSArCiAJCQlFWFQ0X0JMT0NLU19QRVJfR1JPVVAoc2IpIC0gMSk7CiAJZG9fZGl2KGJsb2Nrc19jb3VudCwgRVhUNF9CTE9DS1NfUEVSX0dST1VQKHNiKSk7CisJaWYgKGJsb2Nrc19jb3VudCA+ICgodWludDY0X3QpMTw8MzIpIC0gRVhUNF9ERVNDX1BFUl9CTE9DSyhzYikpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiRVhUNC1mczogZ3JvdXBzIGNvdW50IHRvbyBsYXJnZTogJXUgIgorCQkgICAgICAgIihibG9jayBjb3VudCAlbGx1LCBmaXJzdCBkYXRhIGJsb2NrICV1LCAiCisJCSAgICAgICAiYmxvY2tzIHBlciBncm91cCAlbHUpXG4iLCBzYmktPnNfZ3JvdXBzX2NvdW50LAorCQkgICAgICAgZXh0NF9ibG9ja3NfY291bnQoZXMpLAorCQkgICAgICAgbGUzMl90b19jcHUoZXMtPnNfZmlyc3RfZGF0YV9ibG9jayksCisJCSAgICAgICBFWFQ0X0JMT0NLU19QRVJfR1JPVVAoc2IpKTsKKwkJZ290byBmYWlsZWRfbW91bnQ7CisJfQogCXNiaS0+c19ncm91cHNfY291bnQgPSBibG9ja3NfY291bnQ7CiAJZGJfY291bnQgPSAoc2JpLT5zX2dyb3Vwc19jb3VudCArIEVYVDRfREVTQ19QRVJfQkxPQ0soc2IpIC0gMSkgLwogCQkgICBFWFQ0X0RFU0NfUEVSX0JMT0NLKHNiKTsKQEAgLTIyNzAsMjcgKzI0MjEsMjYgQEAKIAkJCQlFWFQ0X1NCKHNiKS0+c19tb3VudF9zdGF0ZSB8PSBFWFQ0X0VSUk9SX0ZTOwogCQkJCWVzLT5zX3N0YXRlIHw9IGNwdV90b19sZTE2KEVYVDRfRVJST1JfRlMpOwogCQkJCWV4dDRfY29tbWl0X3N1cGVyKHNiLCBlcywgMSk7Ci0JCQkJcHJpbnRrKEtFUk5fQ1JJVAotCQkJCSAgICAgICAiRVhUNC1mcyAoZGV2aWNlICVzKTogbW91bnQgZmFpbGVkXG4iLAotCQkJCSAgICAgIHNiLT5zX2lkKTsKIAkJCQlnb3RvIGZhaWxlZF9tb3VudDQ7CiAJCQl9CiAJCX0KLQl9IGVsc2UgaWYgKGpvdXJuYWxfaW51bSkgewotCQlpZiAoZXh0NF9jcmVhdGVfam91cm5hbChzYiwgZXMsIGpvdXJuYWxfaW51bSkpCi0JCQlnb3RvIGZhaWxlZF9tb3VudDM7CisJfSBlbHNlIGlmICh0ZXN0X29wdChzYiwgTk9MT0FEKSAmJiAhKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSAmJgorCSAgICAgIEVYVDRfSEFTX0lOQ09NUEFUX0ZFQVRVUkUoc2IsIEVYVDRfRkVBVFVSRV9JTkNPTVBBVF9SRUNPVkVSKSkgeworCQlwcmludGsoS0VSTl9FUlIgIkVYVDQtZnM6IHJlcXVpcmVkIGpvdXJuYWwgcmVjb3ZlcnkgIgorCQkgICAgICAgInN1cHByZXNzZWQgYW5kIG5vdCBtb3VudGVkIHJlYWQtb25seVxuIik7CisJCWdvdG8gZmFpbGVkX21vdW50NDsKIAl9IGVsc2UgewotCQlpZiAoIXNpbGVudCkKLQkJCXByaW50ayhLRVJOX0VSUgotCQkJICAgICAgICJleHQ0OiBObyBqb3VybmFsIG9uIGZpbGVzeXN0ZW0gb24gJXNcbiIsCi0JCQkgICAgICAgc2ItPnNfaWQpOwotCQlnb3RvIGZhaWxlZF9tb3VudDM7CisJCWNsZWFyX29wdChzYmktPnNfbW91bnRfb3B0LCBEQVRBX0ZMQUdTKTsKKwkJc2V0X29wdChzYmktPnNfbW91bnRfb3B0LCBXUklURUJBQ0tfREFUQSk7CisJCXNiaS0+c19qb3VybmFsID0gTlVMTDsKKwkJbmVlZHNfcmVjb3ZlcnkgPSAwOworCQlnb3RvIG5vX2pvdXJuYWw7CiAJfQogCiAJaWYgKGV4dDRfYmxvY2tzX2NvdW50KGVzKSA+IDB4ZmZmZmZmZmZVTEwgJiYKIAkgICAgIWpiZDJfam91cm5hbF9zZXRfZmVhdHVyZXMoRVhUNF9TQihzYiktPnNfam91cm5hbCwgMCwgMCwKIAkJCQkgICAgICAgSkJEMl9GRUFUVVJFX0lOQ09NUEFUXzY0QklUKSkgewotCQlwcmludGsoS0VSTl9FUlIgImV4dDQ6IEZhaWxlZCB0byBzZXQgNjQtYml0IGpvdXJuYWwgZmVhdHVyZVxuIik7CisJCXByaW50ayhLRVJOX0VSUiAiRVhUNC1mczogRmFpbGVkIHRvIHNldCA2NC1iaXQgam91cm5hbCBmZWF0dXJlXG4iKTsKIAkJZ290byBmYWlsZWRfbW91bnQ0OwogCX0KIApAQCAtMjMzNSw2ICsyNDg1LDkgQEAKIAlkZWZhdWx0OgogCQlicmVhazsKIAl9CisJc2V0X3Rhc2tfaW9wcmlvKHNiaS0+c19qb3VybmFsLT5qX3Rhc2ssIGpvdXJuYWxfaW9wcmlvKTsKKworbm9fam91cm5hbDoKIAogCWlmICh0ZXN0X29wdChzYiwgTk9CSCkpIHsKIAkJaWYgKCEodGVzdF9vcHQoc2IsIERBVEFfRkxBR1MpID09IEVYVDRfTU9VTlRfV1JJVEVCQUNLX0RBVEEpKSB7CkBAIC0yNDIwLDEzICsyNTczLDIyIEBACiAJRVhUNF9TQihzYiktPnNfbW91bnRfc3RhdGUgfD0gRVhUNF9PUlBIQU5fRlM7CiAJZXh0NF9vcnBoYW5fY2xlYW51cChzYiwgZXMpOwogCUVYVDRfU0Ioc2IpLT5zX21vdW50X3N0YXRlICY9IH5FWFQ0X09SUEhBTl9GUzsKLQlpZiAobmVlZHNfcmVjb3ZlcnkpCisJaWYgKG5lZWRzX3JlY292ZXJ5KSB7CiAJCXByaW50ayhLRVJOX0lORk8gIkVYVDQtZnM6IHJlY292ZXJ5IGNvbXBsZXRlLlxuIik7Ci0JZXh0NF9tYXJrX3JlY292ZXJ5X2NvbXBsZXRlKHNiLCBlcyk7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiRVhUNC1mczogbW91bnRlZCBmaWxlc3lzdGVtIHdpdGggJXMgZGF0YSBtb2RlLlxuIiwKLQkgICAgICAgdGVzdF9vcHQoc2IsIERBVEFfRkxBR1MpID09IEVYVDRfTU9VTlRfSk9VUk5BTF9EQVRBID8gImpvdXJuYWwiOgotCSAgICAgICB0ZXN0X29wdChzYiwgREFUQV9GTEFHUykgPT0gRVhUNF9NT1VOVF9PUkRFUkVEX0RBVEEgPyAib3JkZXJlZCI6Ci0JICAgICAgICJ3cml0ZWJhY2siKTsKKwkJZXh0NF9tYXJrX3JlY292ZXJ5X2NvbXBsZXRlKHNiLCBlcyk7CisJfQorCWlmIChFWFQ0X1NCKHNiKS0+c19qb3VybmFsKSB7CisJCWlmICh0ZXN0X29wdChzYiwgREFUQV9GTEFHUykgPT0gRVhUNF9NT1VOVF9KT1VSTkFMX0RBVEEpCisJCQlkZXNjciA9ICIgam91cm5hbGxlZCBkYXRhIG1vZGUiOworCQllbHNlIGlmICh0ZXN0X29wdChzYiwgREFUQV9GTEFHUykgPT0gRVhUNF9NT1VOVF9PUkRFUkVEX0RBVEEpCisJCQlkZXNjciA9ICIgb3JkZXJlZCBkYXRhIG1vZGUiOworCQllbHNlCisJCQlkZXNjciA9ICIgd3JpdGViYWNrIGRhdGEgbW9kZSI7CisJfSBlbHNlCisJCWRlc2NyID0gIm91dCBqb3VybmFsIjsKKworCXByaW50ayhLRVJOX0lORk8gIkVYVDQtZnM6IG1vdW50ZWQgZmlsZXN5c3RlbSAlcyB3aXRoJXNcbiIsCisJICAgICAgIHNiLT5zX2lkLCBkZXNjcik7CiAKIAlsb2NrX2tlcm5lbCgpOwogCXJldHVybiAwOwpAQCAtMjQzOCw4ICsyNjAwLDExIEBACiAJZ290byBmYWlsZWRfbW91bnQ7CiAKIGZhaWxlZF9tb3VudDQ6Ci0JamJkMl9qb3VybmFsX2Rlc3Ryb3koc2JpLT5zX2pvdXJuYWwpOwotCXNiaS0+c19qb3VybmFsID0gTlVMTDsKKwlwcmludGsoS0VSTl9FUlIgIkVYVDQtZnMgKGRldmljZSAlcyk6IG1vdW50IGZhaWxlZFxuIiwgc2ItPnNfaWQpOworCWlmIChzYmktPnNfam91cm5hbCkgeworCQlqYmQyX2pvdXJuYWxfZGVzdHJveShzYmktPnNfam91cm5hbCk7CisJCXNiaS0+c19qb3VybmFsID0gTlVMTDsKKwl9CiBmYWlsZWRfbW91bnQzOgogCXBlcmNwdV9jb3VudGVyX2Rlc3Ryb3koJnNiaS0+c19mcmVlYmxvY2tzX2NvdW50ZXIpOwogCXBlcmNwdV9jb3VudGVyX2Rlc3Ryb3koJnNiaS0+c19mcmVlaW5vZGVzX2NvdW50ZXIpOwpAQCAtMjQ3NiwxMSArMjY0MSw5IEBACiB7CiAJc3RydWN0IGV4dDRfc2JfaW5mbyAqc2JpID0gRVhUNF9TQihzYik7CiAKLQlpZiAoc2JpLT5zX2NvbW1pdF9pbnRlcnZhbCkKLQkJam91cm5hbC0+al9jb21taXRfaW50ZXJ2YWwgPSBzYmktPnNfY29tbWl0X2ludGVydmFsOwotCS8qIFdlIGNvdWxkIGFsc28gc2V0IHVwIGFuIGV4dDQtc3BlY2lmaWMgZGVmYXVsdCBmb3IgdGhlIGNvbW1pdAotCSAqIGludGVydmFsIGhlcmUsIGJ1dCBmb3Igbm93IHdlJ2xsIGp1c3QgZmFsbCBiYWNrIHRvIHRoZSBqYmQKLQkgKiBkZWZhdWx0LiAqLworCWpvdXJuYWwtPmpfY29tbWl0X2ludGVydmFsID0gc2JpLT5zX2NvbW1pdF9pbnRlcnZhbDsKKwlqb3VybmFsLT5qX21pbl9iYXRjaF90aW1lID0gc2JpLT5zX21pbl9iYXRjaF90aW1lOworCWpvdXJuYWwtPmpfbWF4X2JhdGNoX3RpbWUgPSBzYmktPnNfbWF4X2JhdGNoX3RpbWU7CiAKIAlzcGluX2xvY2soJmpvdXJuYWwtPmpfc3RhdGVfbG9jayk7CiAJaWYgKHRlc3Rfb3B0KHNiLCBCQVJSSUVSKSkKQEAgLTI1MDAsNiArMjY2Myw4IEBACiAJc3RydWN0IGlub2RlICpqb3VybmFsX2lub2RlOwogCWpvdXJuYWxfdCAqam91cm5hbDsKIAorCUJVR19PTighRVhUNF9IQVNfQ09NUEFUX0ZFQVRVUkUoc2IsIEVYVDRfRkVBVFVSRV9DT01QQVRfSEFTX0pPVVJOQUwpKTsKKwogCS8qIEZpcnN0LCB0ZXN0IGZvciB0aGUgZXhpc3RlbmNlIG9mIGEgdmFsaWQgaW5vZGUgb24gZGlzay4gIEJhZAogCSAqIHRoaW5ncyBoYXBwZW4gaWYgd2UgaWdldCgpIGFuIHVudXNlZCBpbm9kZSwgYXMgdGhlIHN1YnNlcXVlbnQKIAkgKiBpcHV0KCkgd2lsbCB0cnkgdG8gZGVsZXRlIGl0LiAqLwpAQCAtMjU0OCwxMyArMjcxMywxNSBAQAogCXN0cnVjdCBleHQ0X3N1cGVyX2Jsb2NrICplczsKIAlzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2OwogCisJQlVHX09OKCFFWFQ0X0hBU19DT01QQVRfRkVBVFVSRShzYiwgRVhUNF9GRUFUVVJFX0NPTVBBVF9IQVNfSk9VUk5BTCkpOworCiAJYmRldiA9IGV4dDRfYmxrZGV2X2dldChqX2Rldik7CiAJaWYgKGJkZXYgPT0gTlVMTCkKIAkJcmV0dXJuIE5VTEw7CiAKIAlpZiAoYmRfY2xhaW0oYmRldiwgc2IpKSB7CiAJCXByaW50ayhLRVJOX0VSUgotCQkJIkVYVDQ6IGZhaWxlZCB0byBjbGFpbSBleHRlcm5hbCBqb3VybmFsIGRldmljZS5cbiIpOworCQkJIkVYVDQtZnM6IGZhaWxlZCB0byBjbGFpbSBleHRlcm5hbCBqb3VybmFsIGRldmljZS5cbiIpOwogCQlibGtkZXZfcHV0KGJkZXYsIEZNT0RFX1JFQUR8Rk1PREVfV1JJVEUpOwogCQlyZXR1cm4gTlVMTDsKIAl9CkBAIC0yNjM1LDYgKzI4MDIsOCBAQAogCWludCBlcnIgPSAwOwogCWludCByZWFsbHlfcmVhZF9vbmx5OwogCisJQlVHX09OKCFFWFQ0X0hBU19DT01QQVRfRkVBVFVSRShzYiwgRVhUNF9GRUFUVVJFX0NPTVBBVF9IQVNfSk9VUk5BTCkpOworCiAJaWYgKGpvdXJuYWxfZGV2bnVtICYmCiAJICAgIGpvdXJuYWxfZGV2bnVtICE9IGxlMzJfdG9fY3B1KGVzLT5zX2pvdXJuYWxfZGV2KSkgewogCQlwcmludGsoS0VSTl9JTkZPICJFWFQ0LWZzOiBleHRlcm5hbCBqb3VybmFsIGRldmljZSBtYWpvci9taW5vciAiCkBAIC0yNzE5LDQ4ICsyODg4LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBleHQ0X2NyZWF0ZV9qb3VybmFsKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCi0JCQkgICAgICAgc3RydWN0IGV4dDRfc3VwZXJfYmxvY2sgKmVzLAotCQkJICAgICAgIHVuc2lnbmVkIGludCBqb3VybmFsX2ludW0pCi17Ci0Jam91cm5hbF90ICpqb3VybmFsOwotCWludCBlcnI7Ci0KLQlpZiAoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJFWFQ0LWZzOiByZWFkb25seSBmaWxlc3lzdGVtIHdoZW4gdHJ5aW5nIHRvICIKLQkJCQkiY3JlYXRlIGpvdXJuYWwuXG4iKTsKLQkJcmV0dXJuIC1FUk9GUzsKLQl9Ci0KLQlqb3VybmFsID0gZXh0NF9nZXRfam91cm5hbChzYiwgam91cm5hbF9pbnVtKTsKLQlpZiAoIWpvdXJuYWwpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JcHJpbnRrKEtFUk5fSU5GTyAiRVhUNC1mczogY3JlYXRpbmcgbmV3IGpvdXJuYWwgb24gaW5vZGUgJXVcbiIsCi0JICAgICAgIGpvdXJuYWxfaW51bSk7Ci0KLQllcnIgPSBqYmQyX2pvdXJuYWxfY3JlYXRlKGpvdXJuYWwpOwotCWlmIChlcnIpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJFWFQ0LWZzOiBlcnJvciBjcmVhdGluZyBqb3VybmFsLlxuIik7Ci0JCWpiZDJfam91cm5hbF9kZXN0cm95KGpvdXJuYWwpOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0KLQlFWFQ0X1NCKHNiKS0+c19qb3VybmFsID0gam91cm5hbDsKLQotCWV4dDRfdXBkYXRlX2R5bmFtaWNfcmV2KHNiKTsKLQlFWFQ0X1NFVF9JTkNPTVBBVF9GRUFUVVJFKHNiLCBFWFQ0X0ZFQVRVUkVfSU5DT01QQVRfUkVDT1ZFUik7Ci0JRVhUNF9TRVRfQ09NUEFUX0ZFQVRVUkUoc2IsIEVYVDRfRkVBVFVSRV9DT01QQVRfSEFTX0pPVVJOQUwpOwotCi0JZXMtPnNfam91cm5hbF9pbnVtID0gY3B1X3RvX2xlMzIoam91cm5hbF9pbnVtKTsKLQlzYi0+c19kaXJ0ID0gMTsKLQotCS8qIE1ha2Ugc3VyZSB3ZSBmbHVzaCB0aGUgcmVjb3ZlcnkgZmxhZyB0byBkaXNrLiAqLwotCWV4dDRfY29tbWl0X3N1cGVyKHNiLCBlcywgMSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIHZvaWQgZXh0NF9jb21taXRfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKIAkJCSAgICAgIHN0cnVjdCBleHQ0X3N1cGVyX2Jsb2NrICplcywgaW50IHN5bmMpCiB7CkBAIC0yNzc3LDIwICsyOTA0LDIzIEBACiAJCSAqIGJlIHJlbWFwcGVkLiAgTm90aGluZyB3ZSBjYW4gZG8gYnV0IHRvIHJldHJ5IHRoZQogCQkgKiB3cml0ZSBhbmQgaG9wZSBmb3IgdGhlIGJlc3QuCiAJCSAqLwotCQlwcmludGsoS0VSTl9FUlIgImV4dDQ6IHByZXZpb3VzIEkvTyBlcnJvciB0byAiCisJCXByaW50ayhLRVJOX0VSUiAiRVhUNC1mczogcHJldmlvdXMgSS9PIGVycm9yIHRvICIKIAkJICAgICAgICJzdXBlcmJsb2NrIGRldGVjdGVkIGZvciAlcy5cbiIsIHNiLT5zX2lkKTsKIAkJY2xlYXJfYnVmZmVyX3dyaXRlX2lvX2Vycm9yKHNiaCk7CiAJCXNldF9idWZmZXJfdXB0b2RhdGUoc2JoKTsKIAl9CiAJZXMtPnNfd3RpbWUgPSBjcHVfdG9fbGUzMihnZXRfc2Vjb25kcygpKTsKLQlleHQ0X2ZyZWVfYmxvY2tzX2NvdW50X3NldChlcywgZXh0NF9jb3VudF9mcmVlX2Jsb2NrcyhzYikpOwotCWVzLT5zX2ZyZWVfaW5vZGVzX2NvdW50ID0gY3B1X3RvX2xlMzIoZXh0NF9jb3VudF9mcmVlX2lub2RlcyhzYikpOworCWV4dDRfZnJlZV9ibG9ja3NfY291bnRfc2V0KGVzLCBwZXJjcHVfY291bnRlcl9zdW1fcG9zaXRpdmUoCisJCQkJCSZFWFQ0X1NCKHNiKS0+c19mcmVlYmxvY2tzX2NvdW50ZXIpKTsKKwllcy0+c19mcmVlX2lub2Rlc19jb3VudCA9IGNwdV90b19sZTMyKHBlcmNwdV9jb3VudGVyX3N1bV9wb3NpdGl2ZSgKKwkJCQkJJkVYVDRfU0Ioc2IpLT5zX2ZyZWVpbm9kZXNfY291bnRlcikpOworCiAJQlVGRkVSX1RSQUNFKHNiaCwgIm1hcmtpbmcgZGlydHkiKTsKIAltYXJrX2J1ZmZlcl9kaXJ0eShzYmgpOwogCWlmIChzeW5jKSB7CiAJCXN5bmNfZGlydHlfYnVmZmVyKHNiaCk7CiAJCWlmIChidWZmZXJfd3JpdGVfaW9fZXJyb3Ioc2JoKSkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJleHQ0OiBJL08gZXJyb3Igd2hpbGUgd3JpdGluZyAiCisJCQlwcmludGsoS0VSTl9FUlIgIkVYVDQtZnM6IEkvTyBlcnJvciB3aGlsZSB3cml0aW5nICIKIAkJCSAgICAgICAic3VwZXJibG9jayBmb3IgJXMuXG4iLCBzYi0+c19pZCk7CiAJCQljbGVhcl9idWZmZXJfd3JpdGVfaW9fZXJyb3Ioc2JoKTsKIAkJCXNldF9idWZmZXJfdXB0b2RhdGUoc2JoKTsKQEAgLTI4MDksNiArMjkzOSwxMCBAQAogewogCWpvdXJuYWxfdCAqam91cm5hbCA9IEVYVDRfU0Ioc2IpLT5zX2pvdXJuYWw7CiAKKwlpZiAoIUVYVDRfSEFTX0NPTVBBVF9GRUFUVVJFKHNiLCBFWFQ0X0ZFQVRVUkVfQ09NUEFUX0hBU19KT1VSTkFMKSkgeworCQlCVUdfT04oam91cm5hbCAhPSBOVUxMKTsKKwkJcmV0dXJuOworCX0KIAlqYmQyX2pvdXJuYWxfbG9ja191cGRhdGVzKGpvdXJuYWwpOwogCWlmIChqYmQyX2pvdXJuYWxfZmx1c2goam91cm5hbCkgPCAwKQogCQlnb3RvIG91dDsKQEAgLTI4MzgsNiArMjk3Miw4IEBACiAJaW50IGpfZXJybm87CiAJY29uc3QgY2hhciAqZXJyc3RyOwogCisJQlVHX09OKCFFWFQ0X0hBU19DT01QQVRfRkVBVFVSRShzYiwgRVhUNF9GRUFUVVJFX0NPTVBBVF9IQVNfSk9VUk5BTCkpOworCiAJam91cm5hbCA9IEVYVDRfU0Ioc2IpLT5zX2pvdXJuYWw7CiAKIAkvKgpAQCAtMjg3MCwxNCArMzAwNiwxNyBAQAogaW50IGV4dDRfZm9yY2VfY29tbWl0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCiB7CiAJam91cm5hbF90ICpqb3VybmFsOwotCWludCByZXQ7CisJaW50IHJldCA9IDA7CiAKIAlpZiAoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpCiAJCXJldHVybiAwOwogCiAJam91cm5hbCA9IEVYVDRfU0Ioc2IpLT5zX2pvdXJuYWw7Ci0Jc2ItPnNfZGlydCA9IDA7Ci0JcmV0ID0gZXh0NF9qb3VybmFsX2ZvcmNlX2NvbW1pdChqb3VybmFsKTsKKwlpZiAoam91cm5hbCkgeworCQlzYi0+c19kaXJ0ID0gMDsKKwkJcmV0ID0gZXh0NF9qb3VybmFsX2ZvcmNlX2NvbW1pdChqb3VybmFsKTsKKwl9CisKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0yODg5LDkgKzMwMjgsMTMgQEAKICAqLwogc3RhdGljIHZvaWQgZXh0NF93cml0ZV9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQogewotCWlmIChtdXRleF90cnlsb2NrKCZzYi0+c19sb2NrKSAhPSAwKQotCQlCVUcoKTsKLQlzYi0+c19kaXJ0ID0gMDsKKwlpZiAoRVhUNF9TQihzYiktPnNfam91cm5hbCkgeworCQlpZiAobXV0ZXhfdHJ5bG9jaygmc2ItPnNfbG9jaykgIT0gMCkKKwkJCUJVRygpOworCQlzYi0+c19kaXJ0ID0gMDsKKwl9IGVsc2UgeworCQlleHQ0X2NvbW1pdF9zdXBlcihzYiwgRVhUNF9TQihzYiktPnNfZXMsIDEpOworCX0KIH0KIAogc3RhdGljIGludCBleHQ0X3N5bmNfZnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHdhaXQpCkBAIC0yOTAwLDEwICszMDQzLDE0IEBACiAKIAl0cmFjZV9tYXJrKGV4dDRfc3luY19mcywgImRldiAlcyB3YWl0ICVkIiwgc2ItPnNfaWQsIHdhaXQpOwogCXNiLT5zX2RpcnQgPSAwOwotCWlmICh3YWl0KQotCQlyZXQgPSBleHQ0X2ZvcmNlX2NvbW1pdChzYik7Ci0JZWxzZQotCQlqYmQyX2pvdXJuYWxfc3RhcnRfY29tbWl0KEVYVDRfU0Ioc2IpLT5zX2pvdXJuYWwsIE5VTEwpOworCWlmIChFWFQ0X1NCKHNiKS0+c19qb3VybmFsKSB7CisJCWlmICh3YWl0KQorCQkJcmV0ID0gZXh0NF9mb3JjZV9jb21taXQoc2IpOworCQllbHNlCisgCQkJamJkMl9qb3VybmFsX3N0YXJ0X2NvbW1pdChFWFQ0X1NCKHNiKS0+c19qb3VybmFsLCBOVUxMKTsKKwl9IGVsc2UgeworCQlleHQ0X2NvbW1pdF9zdXBlcihzYiwgRVhUNF9TQihzYiktPnNfZXMsIHdhaXQpOworCX0KIAlyZXR1cm4gcmV0OwogfQogCkBAIC0yOTE4LDE1ICszMDY1LDE3IEBACiAJaWYgKCEoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpKSB7CiAJCWpvdXJuYWxfdCAqam91cm5hbCA9IEVYVDRfU0Ioc2IpLT5zX2pvdXJuYWw7CiAKLQkJLyogTm93IHdlIHNldCB1cCB0aGUgam91cm5hbCBiYXJyaWVyLiAqLwotCQlqYmQyX2pvdXJuYWxfbG9ja191cGRhdGVzKGpvdXJuYWwpOworCQlpZiAoam91cm5hbCkgeworCQkJLyogTm93IHdlIHNldCB1cCB0aGUgam91cm5hbCBiYXJyaWVyLiAqLworCQkJamJkMl9qb3VybmFsX2xvY2tfdXBkYXRlcyhqb3VybmFsKTsKIAotCQkvKgotCQkgKiBXZSBkb24ndCB3YW50IHRvIGNsZWFyIG5lZWRzX3JlY292ZXJ5IGZsYWcgd2hlbiB3ZSBmYWlsZWQKLQkJICogdG8gZmx1c2ggdGhlIGpvdXJuYWwuCi0JCSAqLwotCQlpZiAoamJkMl9qb3VybmFsX2ZsdXNoKGpvdXJuYWwpIDwgMCkKLQkJCXJldHVybjsKKwkJCS8qCisJCQkgKiBXZSBkb24ndCB3YW50IHRvIGNsZWFyIG5lZWRzX3JlY292ZXJ5IGZsYWcgd2hlbiB3ZQorCQkJICogZmFpbGVkIHRvIGZsdXNoIHRoZSBqb3VybmFsLgorCQkJICovCisJCQlpZiAoamJkMl9qb3VybmFsX2ZsdXNoKGpvdXJuYWwpIDwgMCkKKwkJCQlyZXR1cm47CisJCX0KIAogCQkvKiBKb3VybmFsIGJsb2NrZWQgYW5kIGZsdXNoZWQsIGNsZWFyIG5lZWRzX3JlY292ZXJ5IGZsYWcuICovCiAJCUVYVDRfQ0xFQVJfSU5DT01QQVRfRkVBVFVSRShzYiwgRVhUNF9GRUFUVVJFX0lOQ09NUEFUX1JFQ09WRVIpOwpAQCAtMjk0MCw3ICszMDg5LDcgQEAKICAqLwogc3RhdGljIHZvaWQgZXh0NF91bmxvY2tmcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQogewotCWlmICghKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSkgeworCWlmIChFWFQ0X1NCKHNiKS0+c19qb3VybmFsICYmICEoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpKSB7CiAJCWxvY2tfc3VwZXIoc2IpOwogCQkvKiBSZXNlciB0aGUgbmVlZHNfcmVjb3ZlcnkgZmxhZyBiZWZvcmUgdGhlIGZzIGlzIHVubG9ja2VkLiAqLwogCQlFWFQ0X1NFVF9JTkNPTVBBVF9GRUFUVVJFKHNiLCBFWFQ0X0ZFQVRVUkVfSU5DT01QQVRfUkVDT1ZFUik7CkBAIC0yOTU4LDYgKzMxMDcsNyBAQAogCXVuc2lnbmVkIGxvbmcgb2xkX3NiX2ZsYWdzOwogCXN0cnVjdCBleHQ0X21vdW50X29wdGlvbnMgb2xkX29wdHM7CiAJZXh0NF9ncm91cF90IGc7CisJdW5zaWduZWQgaW50IGpvdXJuYWxfaW9wcmlvID0gREVGQVVMVF9KT1VSTkFMX0lPUFJJTzsKIAlpbnQgZXJyOwogI2lmZGVmIENPTkZJR19RVU9UQQogCWludCBpOwpAQCAtMjk2OSwxNiArMzExOSwyMSBAQAogCW9sZF9vcHRzLnNfcmVzdWlkID0gc2JpLT5zX3Jlc3VpZDsKIAlvbGRfb3B0cy5zX3Jlc2dpZCA9IHNiaS0+c19yZXNnaWQ7CiAJb2xkX29wdHMuc19jb21taXRfaW50ZXJ2YWwgPSBzYmktPnNfY29tbWl0X2ludGVydmFsOworCW9sZF9vcHRzLnNfbWluX2JhdGNoX3RpbWUgPSBzYmktPnNfbWluX2JhdGNoX3RpbWU7CisJb2xkX29wdHMuc19tYXhfYmF0Y2hfdGltZSA9IHNiaS0+c19tYXhfYmF0Y2hfdGltZTsKICNpZmRlZiBDT05GSUdfUVVPVEEKIAlvbGRfb3B0cy5zX2pxdW90YV9mbXQgPSBzYmktPnNfanF1b3RhX2ZtdDsKIAlmb3IgKGkgPSAwOyBpIDwgTUFYUVVPVEFTOyBpKyspCiAJCW9sZF9vcHRzLnNfcWZfbmFtZXNbaV0gPSBzYmktPnNfcWZfbmFtZXNbaV07CiAjZW5kaWYKKwlpZiAoc2JpLT5zX2pvdXJuYWwgJiYgc2JpLT5zX2pvdXJuYWwtPmpfdGFzay0+aW9fY29udGV4dCkKKwkJam91cm5hbF9pb3ByaW8gPSBzYmktPnNfam91cm5hbC0+al90YXNrLT5pb19jb250ZXh0LT5pb3ByaW87CiAKIAkvKgogCSAqIEFsbG93IHRoZSAiY2hlY2siIG9wdGlvbiB0byBiZSBwYXNzZWQgYXMgYSByZW1vdW50IG9wdGlvbi4KIAkgKi8KLQlpZiAoIXBhcnNlX29wdGlvbnMoZGF0YSwgc2IsIE5VTEwsIE5VTEwsICZuX2Jsb2Nrc19jb3VudCwgMSkpIHsKKwlpZiAoIXBhcnNlX29wdGlvbnMoZGF0YSwgc2IsIE5VTEwsICZqb3VybmFsX2lvcHJpbywKKwkJCSAgICZuX2Jsb2Nrc19jb3VudCwgMSkpIHsKIAkJZXJyID0gLUVJTlZBTDsKIAkJZ290byByZXN0b3JlX29wdHM7CiAJfQpAQCAtMjk5MSw3ICszMTQ2LDEwIEBACiAKIAllcyA9IHNiaS0+c19lczsKIAotCWV4dDRfaW5pdF9qb3VybmFsX3BhcmFtcyhzYiwgc2JpLT5zX2pvdXJuYWwpOworCWlmIChzYmktPnNfam91cm5hbCkgeworCQlleHQ0X2luaXRfam91cm5hbF9wYXJhbXMoc2IsIHNiaS0+c19qb3VybmFsKTsKKwkJc2V0X3Rhc2tfaW9wcmlvKHNiaS0+c19qb3VybmFsLT5qX3Rhc2ssIGpvdXJuYWxfaW9wcmlvKTsKKwl9CiAKIAlpZiAoKCpmbGFncyAmIE1TX1JET05MWSkgIT0gKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSB8fAogCQluX2Jsb2Nrc19jb3VudCA+IGV4dDRfYmxvY2tzX2NvdW50KGVzKSkgewpAQCAtMzAyMCwxNyArMzE3OCwyMCBAQAogCQkJICogV2UgaGF2ZSB0byB1bmxvY2sgc3VwZXIgc28gdGhhdCB3ZSBjYW4gd2FpdCBmb3IKIAkJCSAqIHRyYW5zYWN0aW9ucy4KIAkJCSAqLwotCQkJdW5sb2NrX3N1cGVyKHNiKTsKLQkJCWV4dDRfbWFya19yZWNvdmVyeV9jb21wbGV0ZShzYiwgZXMpOwotCQkJbG9ja19zdXBlcihzYik7CisJCQlpZiAoc2JpLT5zX2pvdXJuYWwpIHsKKwkJCQl1bmxvY2tfc3VwZXIoc2IpOworCQkJCWV4dDRfbWFya19yZWNvdmVyeV9jb21wbGV0ZShzYiwgZXMpOworCQkJCWxvY2tfc3VwZXIoc2IpOworCQkJfQogCQl9IGVsc2UgewotCQkJX19sZTMyIHJldDsKKwkJCWludCByZXQ7CiAJCQlpZiAoKHJldCA9IEVYVDRfSEFTX1JPX0NPTVBBVF9GRUFUVVJFKHNiLAogCQkJCQl+RVhUNF9GRUFUVVJFX1JPX0NPTVBBVF9TVVBQKSkpIHsKIAkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJFWFQ0LWZzOiAlczogY291bGRuJ3QgIgogCQkJCSAgICAgICAicmVtb3VudCBSRFdSIGJlY2F1c2Ugb2YgdW5zdXBwb3J0ZWQgIgotCQkJCSAgICAgICAib3B0aW9uYWwgZmVhdHVyZXMgKCV4KS5cbiIsCi0JCQkJICAgICAgIHNiLT5zX2lkLCBsZTMyX3RvX2NwdShyZXQpKTsKKwkJCQkgICAgICAgIm9wdGlvbmFsIGZlYXR1cmVzICgleCkuXG4iLCBzYi0+c19pZCwKKwkJCQkobGUzMl90b19jcHUoc2JpLT5zX2VzLT5zX2ZlYXR1cmVfcm9fY29tcGF0KSAmCisJCQkJCX5FWFQ0X0ZFQVRVUkVfUk9fQ09NUEFUX1NVUFApKTsKIAkJCQllcnIgPSAtRVJPRlM7CiAJCQkJZ290byByZXN0b3JlX29wdHM7CiAJCQl9CkBAIC0zMDQ3LDcgKzMyMDgsNyBAQAogCQkJCWlmICghZXh0NF9ncm91cF9kZXNjX2NzdW1fdmVyaWZ5KHNiaSwgZywgZ2RwKSkgewogCQkJCQlwcmludGsoS0VSTl9FUlIKIAkgICAgICAgIkVYVDQtZnM6IGV4dDRfcmVtb3VudDogIgotCQkiQ2hlY2tzdW0gZm9yIGdyb3VwICVsdSBmYWlsZWQgKCV1IT0ldSlcbiIsCisJCSJDaGVja3N1bSBmb3IgZ3JvdXAgJXUgZmFpbGVkICgldSE9JXUpXG4iLAogCQlnLCBsZTE2X3RvX2NwdShleHQ0X2dyb3VwX2Rlc2NfY3N1bShzYmksIGcsIGdkcCkpLAogCQkJCQkgICAgICAgbGUxNl90b19jcHUoZ2RwLT5iZ19jaGVja3N1bSkpOwogCQkJCQllcnIgPSAtRUlOVkFMOwpAQCAtMzA3Niw3ICszMjM3LDggQEAKIAkJCSAqIGJlZW4gY2hhbmdlZCBieSBlMmZzY2sgc2luY2Ugd2Ugb3JpZ2luYWxseSBtb3VudGVkCiAJCQkgKiB0aGUgcGFydGl0aW9uLikKIAkJCSAqLwotCQkJZXh0NF9jbGVhcl9qb3VybmFsX2VycihzYiwgZXMpOworCQkJaWYgKHNiaS0+c19qb3VybmFsKQorCQkJCWV4dDRfY2xlYXJfam91cm5hbF9lcnIoc2IsIGVzKTsKIAkJCXNiaS0+c19tb3VudF9zdGF0ZSA9IGxlMTZfdG9fY3B1KGVzLT5zX3N0YXRlKTsKIAkJCWlmICgoZXJyID0gZXh0NF9ncm91cF9leHRlbmQoc2IsIGVzLCBuX2Jsb2Nrc19jb3VudCkpKQogCQkJCWdvdG8gcmVzdG9yZV9vcHRzOwpAQCAtMzA4NCw2ICszMjQ2LDkgQEAKIAkJCQlzYi0+c19mbGFncyAmPSB+TVNfUkRPTkxZOwogCQl9CiAJfQorCWlmIChzYmktPnNfam91cm5hbCA9PSBOVUxMKQorCQlleHQ0X2NvbW1pdF9zdXBlcihzYiwgZXMsIDEpOworCiAjaWZkZWYgQ09ORklHX1FVT1RBCiAJLyogUmVsZWFzZSBvbGQgcXVvdGEgZmlsZSBuYW1lcyAqLwogCWZvciAoaSA9IDA7IGkgPCBNQVhRVU9UQVM7IGkrKykKQEAgLTMwOTgsNiArMzI2Myw4IEBACiAJc2JpLT5zX3Jlc3VpZCA9IG9sZF9vcHRzLnNfcmVzdWlkOwogCXNiaS0+c19yZXNnaWQgPSBvbGRfb3B0cy5zX3Jlc2dpZDsKIAlzYmktPnNfY29tbWl0X2ludGVydmFsID0gb2xkX29wdHMuc19jb21taXRfaW50ZXJ2YWw7CisJc2JpLT5zX21pbl9iYXRjaF90aW1lID0gb2xkX29wdHMuc19taW5fYmF0Y2hfdGltZTsKKwlzYmktPnNfbWF4X2JhdGNoX3RpbWUgPSBvbGRfb3B0cy5zX21heF9iYXRjaF90aW1lOwogI2lmZGVmIENPTkZJR19RVU9UQQogCXNiaS0+c19qcXVvdGFfZm10ID0gb2xkX29wdHMuc19qcXVvdGFfZm10OwogCWZvciAoaSA9IDA7IGkgPCBNQVhRVU9UQVM7IGkrKykgewpAQCAtMzM2MCw3ICszNTI3LDggQEAKIAkgKiBXaGVuIHdlIGpvdXJuYWwgZGF0YSBvbiBxdW90YSBmaWxlLCB3ZSBoYXZlIHRvIGZsdXNoIGpvdXJuYWwgdG8gc2VlCiAJICogYWxsIHVwZGF0ZXMgdG8gdGhlIGZpbGUgd2hlbiB3ZSBieXBhc3MgcGFnZWNhY2hlLi4uCiAJICovCi0JaWYgKGV4dDRfc2hvdWxkX2pvdXJuYWxfZGF0YShwYXRoLmRlbnRyeS0+ZF9pbm9kZSkpIHsKKwlpZiAoRVhUNF9TQihzYiktPnNfam91cm5hbCAmJgorCSAgICBleHQ0X3Nob3VsZF9qb3VybmFsX2RhdGEocGF0aC5kZW50cnktPmRfaW5vZGUpKSB7CiAJCS8qCiAJCSAqIFdlIGRvbid0IG5lZWQgdG8gbG9jayB1cGRhdGVzIGJ1dCBqb3VybmFsX2ZsdXNoKCkgY291bGQKIAkJICogb3RoZXJ3aXNlIGJlIGxpdmVsb2NrZWQuLi4KQEAgLTM0MzQsNyArMzYwMiw3IEBACiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKIAloYW5kbGVfdCAqaGFuZGxlID0gam91cm5hbF9jdXJyZW50X2hhbmRsZSgpOwogCi0JaWYgKCFoYW5kbGUpIHsKKwlpZiAoRVhUNF9TQihzYiktPnNfam91cm5hbCAmJiAhaGFuZGxlKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIkVYVDQtZnM6IFF1b3RhIHdyaXRlIChvZmY9JWxsdSwgbGVuPSVsbHUpIgogCQkJIiBjYW5jZWxsZWQgYmVjYXVzZSB0cmFuc2FjdGlvbiBpcyBub3Qgc3RhcnRlZC5cbiIsCiAJCQkodW5zaWduZWQgbG9uZyBsb25nKW9mZiwgKHVuc2lnbmVkIGxvbmcgbG9uZylsZW4pOwpAQCAtMzQ1OSw3ICszNjI3LDcgQEAKIAkJZmx1c2hfZGNhY2hlX3BhZ2UoYmgtPmJfcGFnZSk7CiAJCXVubG9ja19idWZmZXIoYmgpOwogCQlpZiAoam91cm5hbF9xdW90YSkKLQkJCWVyciA9IGV4dDRfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGJoKTsKKwkJCWVyciA9IGV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgTlVMTCwgYmgpOwogCQllbHNlIHsKIAkJCS8qIEFsd2F5cyBkbyBhdCBsZWFzdCBvcmRlcmVkIHdyaXRlcyBmb3IgcXVvdGFzICovCiAJCQllcnIgPSBleHQ0X2piZDJfZmlsZV9pbm9kZShoYW5kbGUsIGlub2RlKTsKQEAgLTM1MTMsMTggKzM2ODEsMTUgQEAKIHN0YXRpYyBzc2l6ZV90IGV4dDRfdWlfcHJvY193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKIAkJCSAgICAgICBzaXplX3QgY250LCBsb2ZmX3QgKnBwb3MpCiB7Ci0JdW5zaWduZWQgaW50ICpwID0gUERFKGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUpLT5kYXRhOworCXVuc2lnbmVkIGxvbmcgKnAgPSBQREUoZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSktPmRhdGE7CiAJY2hhciBzdHJbMzJdOwotCXVuc2lnbmVkIGxvbmcgdmFsdWU7CiAKIAlpZiAoY250ID49IHNpemVvZihzdHIpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAlpZiAoY29weV9mcm9tX3VzZXIoc3RyLCBidWYsIGNudCkpCiAJCXJldHVybiAtRUZBVUxUOwotCXZhbHVlID0gc2ltcGxlX3N0cnRvbChzdHIsIE5VTEwsIDApOwotCWlmICh2YWx1ZSA8IDApCi0JCXJldHVybiAtRVJBTkdFOwotCSpwID0gdmFsdWU7CisKKwkqcCA9IHNpbXBsZV9zdHJ0b3VsKHN0ciwgTlVMTCwgMCk7CiAJcmV0dXJuIGNudDsKIH0KIApAQCAtMzYxNSw3ICszNzgwLDcgQEAKIH0KIAogTU9EVUxFX0FVVEhPUigiUmVteSBDYXJkLCBTdGVwaGVuIFR3ZWVkaWUsIEFuZHJldyBNb3J0b24sIEFuZHJlYXMgRGlsZ2VyLCBUaGVvZG9yZSBUcydvIGFuZCBvdGhlcnMiKTsKLU1PRFVMRV9ERVNDUklQVElPTigiRm91cnRoIEV4dGVuZGVkIEZpbGVzeXN0ZW0gd2l0aCBleHRlbnRzIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkZvdXJ0aCBFeHRlbmRlZCBGaWxlc3lzdGVtIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiBtb2R1bGVfaW5pdChpbml0X2V4dDRfZnMpCiBtb2R1bGVfZXhpdChleGl0X2V4dDRfZnMpCmRpZmYgLS1naXQgYS9mcy9leHQ0L3hhdHRyLmMgYi9mcy9leHQ0L3hhdHRyLmMKaW5kZXggODA2MjZkNS4uMTU3Y2U2NSAxMDA2NDQKLS0tIGEvZnMvZXh0NC94YXR0ci5jCisrKyBiL2ZzL2V4dDQveGF0dHIuYwpAQCAtNDU3LDcgKzQ1Nyw3IEBACiAJaWYgKGV4dDRfam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZSwgRVhUNF9TQihzYiktPnNfc2JoKSA9PSAwKSB7CiAJCUVYVDRfU0VUX0NPTVBBVF9GRUFUVVJFKHNiLCBFWFQ0X0ZFQVRVUkVfQ09NUEFUX0VYVF9BVFRSKTsKIAkJc2ItPnNfZGlydCA9IDE7Ci0JCWV4dDRfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIEVYVDRfU0Ioc2IpLT5zX3NiaCk7CisJCWV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgTlVMTCwgRVhUNF9TQihzYiktPnNfc2JoKTsKIAl9CiB9CiAKQEAgLTQ4Nyw5ICs0ODcsOSBAQAogCQlleHQ0X2ZvcmdldChoYW5kbGUsIDEsIGlub2RlLCBiaCwgYmgtPmJfYmxvY2tucik7CiAJfSBlbHNlIHsKIAkJbGUzMl9hZGRfY3B1KCZCSERSKGJoKS0+aF9yZWZjb3VudCwgLTEpOwotCQllcnJvciA9IGV4dDRfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGJoKTsKKwkJZXJyb3IgPSBleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGlub2RlLCBiaCk7CiAJCWlmIChJU19TWU5DKGlub2RlKSkKLQkJCWhhbmRsZS0+aF9zeW5jID0gMTsKKwkJCWV4dDRfaGFuZGxlX3N5bmMoaGFuZGxlKTsKIAkJRFFVT1RfRlJFRV9CTE9DSyhpbm9kZSwgMSk7CiAJCWVhX2JkZWJ1ZyhiaCwgInJlZmNvdW50IG5vdz0lZDsgcmVsZWFzaW5nIiwKIAkJCSAgbGUzMl90b19jcHUoQkhEUihiaCktPmhfcmVmY291bnQpKTsKQEAgLTcyNCw4ICs3MjQsOSBAQAogCQkJaWYgKGVycm9yID09IC1FSU8pCiAJCQkJZ290byBiYWRfYmxvY2s7CiAJCQlpZiAoIWVycm9yKQotCQkJCWVycm9yID0gZXh0NF9qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwKLQkJCQkJCQkJICAgIGJzLT5iaCk7CisJCQkJZXJyb3IgPSBleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsCisJCQkJCQkJCSAgIGlub2RlLAorCQkJCQkJCQkgICBicy0+YmgpOwogCQkJaWYgKGVycm9yKQogCQkJCWdvdG8gY2xlYW51cDsKIAkJCWdvdG8gaW5zZXJ0ZWQ7CkBAIC03OTQsOCArNzk1LDkgQEAKIAkJCQllYV9iZGVidWcobmV3X2JoLCAicmV1c2luZzsgcmVmY291bnQgbm93PSVkIiwKIAkJCQkJbGUzMl90b19jcHUoQkhEUihuZXdfYmgpLT5oX3JlZmNvdW50KSk7CiAJCQkJdW5sb2NrX2J1ZmZlcihuZXdfYmgpOwotCQkJCWVycm9yID0gZXh0NF9qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwKLQkJCQkJCQkJICAgIG5ld19iaCk7CisJCQkJZXJyb3IgPSBleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsCisJCQkJCQkJCSAgIGlub2RlLAorCQkJCQkJCQkgICBuZXdfYmgpOwogCQkJCWlmIChlcnJvcikKIAkJCQkJZ290byBjbGVhbnVwX2RxdW90OwogCQkJfQpAQCAtODEwLDggKzgxMiw4IEBACiAJCQkvKiBXZSBuZWVkIHRvIGFsbG9jYXRlIGEgbmV3IGJsb2NrICovCiAJCQlleHQ0X2ZzYmxrX3QgZ29hbCA9IGV4dDRfZ3JvdXBfZmlyc3RfYmxvY2tfbm8oc2IsCiAJCQkJCQlFWFQ0X0koaW5vZGUpLT5pX2Jsb2NrX2dyb3VwKTsKLQkJCWV4dDRfZnNibGtfdCBibG9jayA9IGV4dDRfbmV3X21ldGFfYmxvY2soaGFuZGxlLCBpbm9kZSwKLQkJCQkJCQlnb2FsLCAmZXJyb3IpOworCQkJZXh0NF9mc2Jsa190IGJsb2NrID0gZXh0NF9uZXdfbWV0YV9ibG9ja3MoaGFuZGxlLCBpbm9kZSwKKwkJCQkJCSAgZ29hbCwgTlVMTCwgJmVycm9yKTsKIAkJCWlmIChlcnJvcikKIAkJCQlnb3RvIGNsZWFudXA7CiAJCQllYV9pZGVidWcoaW5vZGUsICJjcmVhdGluZyBibG9jayAlZCIsIGJsb2NrKTsKQEAgLTgzMyw3ICs4MzUsOCBAQAogCQkJc2V0X2J1ZmZlcl91cHRvZGF0ZShuZXdfYmgpOwogCQkJdW5sb2NrX2J1ZmZlcihuZXdfYmgpOwogCQkJZXh0NF94YXR0cl9jYWNoZV9pbnNlcnQobmV3X2JoKTsKLQkJCWVycm9yID0gZXh0NF9qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgbmV3X2JoKTsKKwkJCWVycm9yID0gZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEoaGFuZGxlLAorCQkJCQkJCSAgIGlub2RlLCBuZXdfYmgpOwogCQkJaWYgKGVycm9yKQogCQkJCWdvdG8gY2xlYW51cDsKIAkJfQpAQCAtMTA0MCw3ICsxMDQzLDcgQEAKIAkJICovCiAJCWlzLmlsb2MuYmggPSBOVUxMOwogCQlpZiAoSVNfU1lOQyhpbm9kZSkpCi0JCQloYW5kbGUtPmhfc3luYyA9IDE7CisJCQlleHQ0X2hhbmRsZV9zeW5jKGhhbmRsZSk7CiAJfQogCiBjbGVhbnVwOgpkaWZmIC0tZ2l0IGEvZnMvZmlsZXN5c3RlbXMuYyBiL2ZzL2ZpbGVzeXN0ZW1zLmMKaW5kZXggZDBlMjBjZS4uZDQ4OGRjZCAxMDA2NDQKLS0tIGEvZnMvZmlsZXN5c3RlbXMuYworKysgYi9mcy9maWxlc3lzdGVtcy5jCkBAIC0yNTMsMjQgKzI1MywyNyBAQAogbW9kdWxlX2luaXQocHJvY19maWxlc3lzdGVtc19pbml0KTsKICNlbmRpZgogCi1zdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZ2V0X2ZzX3R5cGUoY29uc3QgY2hhciAqbmFtZSkKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqX19nZXRfZnNfdHlwZShjb25zdCBjaGFyICpuYW1lLCBpbnQgbGVuKQogewogCXN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmczsKLQljb25zdCBjaGFyICpkb3QgPSBzdHJjaHIobmFtZSwgJy4nKTsKLQl1bnNpZ25lZCBsZW4gPSBkb3QgPyBkb3QgLSBuYW1lIDogc3RybGVuKG5hbWUpOwogCiAJcmVhZF9sb2NrKCZmaWxlX3N5c3RlbXNfbG9jayk7CiAJZnMgPSAqKGZpbmRfZmlsZXN5c3RlbShuYW1lLCBsZW4pKTsKIAlpZiAoZnMgJiYgIXRyeV9tb2R1bGVfZ2V0KGZzLT5vd25lcikpCiAJCWZzID0gTlVMTDsKIAlyZWFkX3VubG9jaygmZmlsZV9zeXN0ZW1zX2xvY2spOwotCWlmICghZnMgJiYgKHJlcXVlc3RfbW9kdWxlKCIlLipzIiwgbGVuLCBuYW1lKSA9PSAwKSkgewotCQlyZWFkX2xvY2soJmZpbGVfc3lzdGVtc19sb2NrKTsKLQkJZnMgPSAqKGZpbmRfZmlsZXN5c3RlbShuYW1lLCBsZW4pKTsKLQkJaWYgKGZzICYmICF0cnlfbW9kdWxlX2dldChmcy0+b3duZXIpKQotCQkJZnMgPSBOVUxMOwotCQlyZWFkX3VubG9jaygmZmlsZV9zeXN0ZW1zX2xvY2spOwotCX0KKwlyZXR1cm4gZnM7Cit9CisKK3N0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpnZXRfZnNfdHlwZShjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmczsKKwljb25zdCBjaGFyICpkb3QgPSBzdHJjaHIobmFtZSwgJy4nKTsKKwlpbnQgbGVuID0gZG90ID8gZG90IC0gbmFtZSA6IHN0cmxlbihuYW1lKTsKKworCWZzID0gX19nZXRfZnNfdHlwZShuYW1lLCBsZW4pOworCWlmICghZnMgJiYgKHJlcXVlc3RfbW9kdWxlKCIlLipzIiwgbGVuLCBuYW1lKSA9PSAwKSkKKwkJZnMgPSBfX2dldF9mc190eXBlKG5hbWUsIGxlbik7CiAKIAlpZiAoZG90ICYmIGZzICYmICEoZnMtPmZzX2ZsYWdzICYgRlNfSEFTX1NVQlRZUEUpKSB7CiAJCXB1dF9maWxlc3lzdGVtKGZzKTsKZGlmZiAtLWdpdCBhL2ZzL2ZzLXdyaXRlYmFjay5jIGIvZnMvZnMtd3JpdGViYWNrLmMKaW5kZXggZDBmZjBiOC4uZTVlYWE2MiAxMDA2NDQKLS0tIGEvZnMvZnMtd3JpdGViYWNrLmMKKysrIGIvZnMvZnMtd3JpdGViYWNrLmMKQEAgLTQyMSw5ICs0MjEsNiBAQAogICogSWYgd2UncmUgYSBwZGxmdXNoIHRocmVhZCwgdGhlbiBpbXBsZW1lbnQgcGRmbHVzaCBjb2xsaXNpb24gYXZvaWRhbmNlCiAgKiBhZ2FpbnN0IHRoZSBlbnRpcmUgbGlzdC4KICAqCi0gKiBXQl9TWU5DX0hPTEQgaXMgYSBoYWNrIGZvciBzeXNfc3luYygpOiByZWF0dGFjaCB0aGUgaW5vZGUgdG8gc2ItPnNfZGlydHkgc28KLSAqIHRoYXQgaXQgY2FuIGJlIGxvY2F0ZWQgZm9yIHdhaXRpbmcgb24gaW4gX193cml0ZWJhY2tfc2luZ2xlX2lub2RlKCkuCi0gKgogICogSWYgYGJkaScgaXMgbm9uLXplcm8gdGhlbiB3ZSdyZSBiZWluZyBhc2tlZCB0byB3cml0ZWJhY2sgYSBzcGVjaWZpYyBxdWV1ZS4KICAqIFRoaXMgZnVuY3Rpb24gYXNzdW1lcyB0aGF0IHRoZSBibG9ja2RldiBzdXBlcmJsb2NrJ3MgaW5vZGVzIGFyZSBiYWNrZWQgYnkKICAqIGEgdmFyaWV0eSBvZiBxdWV1ZXMsIHNvIGFsbCBpbm9kZXMgYXJlIHNlYXJjaGVkLiAgRm9yIG90aGVyIHN1cGVyYmxvY2tzLApAQCAtNDQzLDYgKzQ0MCw3IEBACiAJCQkJc3RydWN0IHdyaXRlYmFja19jb250cm9sICp3YmMpCiB7CiAJY29uc3QgdW5zaWduZWQgbG9uZyBzdGFydCA9IGppZmZpZXM7CS8qIGxpdmVsb2NrIGF2b2lkYW5jZSAqLworCWludCBzeW5jID0gd2JjLT5zeW5jX21vZGUgPT0gV0JfU1lOQ19BTEw7CiAKIAlzcGluX2xvY2soJmlub2RlX2xvY2spOwogCWlmICghd2JjLT5mb3Jfa3VwZGF0ZSB8fCBsaXN0X2VtcHR5KCZzYi0+c19pbykpCkBAIC00OTksMTAgKzQ5Nyw2IEBACiAJCV9faWdldChpbm9kZSk7CiAJCXBhZ2VzX3NraXBwZWQgPSB3YmMtPnBhZ2VzX3NraXBwZWQ7CiAJCV9fd3JpdGViYWNrX3NpbmdsZV9pbm9kZShpbm9kZSwgd2JjKTsKLQkJaWYgKHdiYy0+c3luY19tb2RlID09IFdCX1NZTkNfSE9MRCkgewotCQkJaW5vZGUtPmRpcnRpZWRfd2hlbiA9IGppZmZpZXM7Ci0JCQlsaXN0X21vdmUoJmlub2RlLT5pX2xpc3QsICZzYi0+c19kaXJ0eSk7Ci0JCX0KIAkJaWYgKGN1cnJlbnRfaXNfcGRmbHVzaCgpKQogCQkJd3JpdGViYWNrX3JlbGVhc2UoYmRpKTsKIAkJaWYgKHdiYy0+cGFnZXNfc2tpcHBlZCAhPSBwYWdlc19za2lwcGVkKSB7CkBAIC01MjMsNyArNTE3LDQ5IEBACiAJCWlmICghbGlzdF9lbXB0eSgmc2ItPnNfbW9yZV9pbykpCiAJCQl3YmMtPm1vcmVfaW8gPSAxOwogCX0KLQlzcGluX3VubG9jaygmaW5vZGVfbG9jayk7CisKKwlpZiAoc3luYykgeworCQlzdHJ1Y3QgaW5vZGUgKmlub2RlLCAqb2xkX2lub2RlID0gTlVMTDsKKworCQkvKgorCQkgKiBEYXRhIGludGVncml0eSBzeW5jLiBNdXN0IHdhaXQgZm9yIGFsbCBwYWdlcyB1bmRlciB3cml0ZWJhY2ssCisJCSAqIGJlY2F1c2UgdGhlcmUgbWF5IGhhdmUgYmVlbiBwYWdlcyBkaXJ0aWVkIGJlZm9yZSBvdXIgc3luYworCQkgKiBjYWxsLCBidXQgd2hpY2ggaGFkIHdyaXRlb3V0IHN0YXJ0ZWQgYmVmb3JlIHdlIHdyaXRlIGl0IG91dC4KKwkJICogSW4gd2hpY2ggY2FzZSwgdGhlIGlub2RlIG1heSBub3QgYmUgb24gdGhlIGRpcnR5IGxpc3QsIGJ1dAorCQkgKiB3ZSBzdGlsbCBoYXZlIHRvIHdhaXQgZm9yIHRoYXQgd3JpdGVvdXQuCisJCSAqLworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGlub2RlLCAmc2ItPnNfaW5vZGVzLCBpX3NiX2xpc3QpIHsKKwkJCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nOworCisJCQlpZiAoaW5vZGUtPmlfc3RhdGUgJiAoSV9GUkVFSU5HfElfV0lMTF9GUkVFKSkKKwkJCQljb250aW51ZTsKKwkJCW1hcHBpbmcgPSBpbm9kZS0+aV9tYXBwaW5nOworCQkJaWYgKG1hcHBpbmctPm5ycGFnZXMgPT0gMCkKKwkJCQljb250aW51ZTsKKwkJCV9faWdldChpbm9kZSk7CisJCQlzcGluX3VubG9jaygmaW5vZGVfbG9jayk7CisJCQkvKgorCQkJICogV2UgaG9sZCBhIHJlZmVyZW5jZSB0byAnaW5vZGUnIHNvIGl0IGNvdWxkbid0IGhhdmUKKwkJCSAqIGJlZW4gcmVtb3ZlZCBmcm9tIHNfaW5vZGVzIGxpc3Qgd2hpbGUgd2UgZHJvcHBlZCB0aGUKKwkJCSAqIGlub2RlX2xvY2suICBXZSBjYW5ub3QgaXB1dCB0aGUgaW5vZGUgbm93IGFzIHdlIGNhbgorCQkJICogYmUgaG9sZGluZyB0aGUgbGFzdCByZWZlcmVuY2UgYW5kIHdlIGNhbm5vdCBpcHV0IGl0CisJCQkgKiB1bmRlciBpbm9kZV9sb2NrLiBTbyB3ZSBrZWVwIHRoZSByZWZlcmVuY2UgYW5kIGlwdXQKKwkJCSAqIGl0IGxhdGVyLgorCQkJICovCisJCQlpcHV0KG9sZF9pbm9kZSk7CisJCQlvbGRfaW5vZGUgPSBpbm9kZTsKKworCQkJZmlsZW1hcF9mZGF0YXdhaXQobWFwcGluZyk7CisKKwkJCWNvbmRfcmVzY2hlZCgpOworCisJCQlzcGluX2xvY2soJmlub2RlX2xvY2spOworCQl9CisJCXNwaW5fdW5sb2NrKCZpbm9kZV9sb2NrKTsKKwkJaXB1dChvbGRfaW5vZGUpOworCX0gZWxzZQorCQlzcGluX3VubG9jaygmaW5vZGVfbG9jayk7CisKIAlyZXR1cm47CQkvKiBMZWF2ZSBhbnkgdW53cml0dGVuIGlub2RlcyBvbiBzX2lvICovCiB9CiBFWFBPUlRfU1lNQk9MX0dQTChnZW5lcmljX3N5bmNfc2JfaW5vZGVzKTsKQEAgLTU4OCw4ICs2MjQsNyBAQAogCiAvKgogICogd3JpdGViYWNrIGFuZCB3YWl0IHVwb24gdGhlIGZpbGVzeXN0ZW0ncyBkaXJ0eSBpbm9kZXMuICBUaGUgY2FsbGVyIHdpbGwKLSAqIGRvIHRoaXMgaW4gdHdvIHBhc3NlcyAtIG9uZSB0byB3cml0ZSwgYW5kIG9uZSB0byB3YWl0LiAgV0JfU1lOQ19IT0xEIGlzCi0gKiB1c2VkIHRvIHBhcmsgdGhlIHdyaXR0ZW4gaW5vZGVzIG9uIHNiLT5zX2RpcnR5IGZvciB0aGUgd2FpdCBwYXNzLgorICogZG8gdGhpcyBpbiB0d28gcGFzc2VzIC0gb25lIHRvIHdyaXRlLCBhbmQgb25lIHRvIHdhaXQuCiAgKgogICogQSBmaW5pdGUgbGltaXQgaXMgc2V0IG9uIHRoZSBudW1iZXIgb2YgcGFnZXMgd2hpY2ggd2lsbCBiZSB3cml0dGVuLgogICogVG8gcHJldmVudCBpbmZpbml0ZSBsaXZlbG9jayBvZiBzeXNfc3luYygpLgpAQCAtNjAwLDMyICs2MzUsMjMgQEAKIHZvaWQgc3luY19pbm9kZXNfc2Ioc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHdhaXQpCiB7CiAJc3RydWN0IHdyaXRlYmFja19jb250cm9sIHdiYyA9IHsKLQkJLnN5bmNfbW9kZQk9IHdhaXQgPyBXQl9TWU5DX0FMTCA6IFdCX1NZTkNfSE9MRCwKKwkJLnN5bmNfbW9kZQk9IHdhaXQgPyBXQl9TWU5DX0FMTCA6IFdCX1NZTkNfTk9ORSwKIAkJLnJhbmdlX3N0YXJ0CT0gMCwKIAkJLnJhbmdlX2VuZAk9IExMT05HX01BWCwKIAl9OwotCXVuc2lnbmVkIGxvbmcgbnJfZGlydHkgPSBnbG9iYWxfcGFnZV9zdGF0ZShOUl9GSUxFX0RJUlRZKTsKLQl1bnNpZ25lZCBsb25nIG5yX3Vuc3RhYmxlID0gZ2xvYmFsX3BhZ2Vfc3RhdGUoTlJfVU5TVEFCTEVfTkZTKTsKIAotCXdiYy5ucl90b193cml0ZSA9IG5yX2RpcnR5ICsgbnJfdW5zdGFibGUgKwotCQkJKGlub2Rlc19zdGF0Lm5yX2lub2RlcyAtIGlub2Rlc19zdGF0Lm5yX3VudXNlZCkgKwotCQkJbnJfZGlydHkgKyBucl91bnN0YWJsZTsKLQl3YmMubnJfdG9fd3JpdGUgKz0gd2JjLm5yX3RvX3dyaXRlIC8gMjsJCS8qIEJpdCBtb3JlIGZvciBsdWNrICovCisJaWYgKCF3YWl0KSB7CisJCXVuc2lnbmVkIGxvbmcgbnJfZGlydHkgPSBnbG9iYWxfcGFnZV9zdGF0ZShOUl9GSUxFX0RJUlRZKTsKKwkJdW5zaWduZWQgbG9uZyBucl91bnN0YWJsZSA9IGdsb2JhbF9wYWdlX3N0YXRlKE5SX1VOU1RBQkxFX05GUyk7CisKKwkJd2JjLm5yX3RvX3dyaXRlID0gbnJfZGlydHkgKyBucl91bnN0YWJsZSArCisJCQkoaW5vZGVzX3N0YXQubnJfaW5vZGVzIC0gaW5vZGVzX3N0YXQubnJfdW51c2VkKTsKKwl9IGVsc2UKKwkJd2JjLm5yX3RvX3dyaXRlID0gTE9OR19NQVg7IC8qIGRvZXNuJ3QgYWN0dWFsbHkgbWF0dGVyICovCisKIAlzeW5jX3NiX2lub2RlcyhzYiwgJndiYyk7CiB9CiAKLS8qCi0gKiBSYXRoZXIgbGFtZSBsaXZlbG9jayBhdm9pZGFuY2UuCi0gKi8KLXN0YXRpYyB2b2lkIHNldF9zYl9zeW5jaW5nKGludCB2YWwpCi17Ci0Jc3RydWN0IHN1cGVyX2Jsb2NrICpzYjsKLQlzcGluX2xvY2soJnNiX2xvY2spOwotCWxpc3RfZm9yX2VhY2hfZW50cnlfcmV2ZXJzZShzYiwgJnN1cGVyX2Jsb2Nrcywgc19saXN0KQotCQlzYi0+c19zeW5jaW5nID0gdmFsOwotCXNwaW5fdW5sb2NrKCZzYl9sb2NrKTsKLX0KLQogLyoqCiAgKiBzeW5jX2lub2RlcyAtIHdyaXRlcyBhbGwgaW5vZGVzIHRvIGRpc2sKICAqIEB3YWl0OiB3YWl0IGZvciBjb21wbGV0aW9uCkBAIC02NTIsOSArNjc4LDYgQEAKIAlzcGluX2xvY2soJnNiX2xvY2spOwogcmVzdGFydDoKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHNiLCAmc3VwZXJfYmxvY2tzLCBzX2xpc3QpIHsKLQkJaWYgKHNiLT5zX3N5bmNpbmcpCi0JCQljb250aW51ZTsKLQkJc2ItPnNfc3luY2luZyA9IDE7CiAJCXNiLT5zX2NvdW50Kys7CiAJCXNwaW5fdW5sb2NrKCZzYl9sb2NrKTsKIAkJZG93bl9yZWFkKCZzYi0+c191bW91bnQpOwpAQCAtNjcyLDEzICs2OTUsMTAgQEAKIAogdm9pZCBzeW5jX2lub2RlcyhpbnQgd2FpdCkKIHsKLQlzZXRfc2Jfc3luY2luZygwKTsKIAlfX3N5bmNfaW5vZGVzKDApOwogCi0JaWYgKHdhaXQpIHsKLQkJc2V0X3NiX3N5bmNpbmcoMCk7CisJaWYgKHdhaXQpCiAJCV9fc3luY19pbm9kZXMoMSk7Ci0JfQogfQogCiAvKioKZGlmZiAtLWdpdCBhL2ZzL2Z1c2UvY29udHJvbC5jIGIvZnMvZnVzZS9jb250cm9sLmMKaW5kZXggNGYzY2FiMy4uOTljOTlkZiAxMDA2NDQKLS0tIGEvZnMvZnVzZS9jb250cm9sLmMKKysrIGIvZnMvZnVzZS9jb250cm9sLmMKQEAgLTEsNiArMSw2IEBACiAvKgogICBGVVNFOiBGaWxlc3lzdGVtIGluIFVzZXJzcGFjZQotICBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNiAgTWlrbG9zIFN6ZXJlZGkgPG1pa2xvc0BzemVyZWRpLmh1PgorICBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOCAgTWlrbG9zIFN6ZXJlZGkgPG1pa2xvc0BzemVyZWRpLmh1PgogCiAgIFRoaXMgcHJvZ3JhbSBjYW4gYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMLgogICBTZWUgdGhlIGZpbGUgQ09QWUlORy4KQEAgLTQ4LDExICs0OCwxMyBAQAogCXNpemVfdCBzaXplOwogCiAJaWYgKCEqcHBvcykgeworCQlsb25nIHZhbHVlOwogCQlzdHJ1Y3QgZnVzZV9jb25uICpmYyA9IGZ1c2VfY3RsX2ZpbGVfY29ubl9nZXQoZmlsZSk7CiAJCWlmICghZmMpCiAJCQlyZXR1cm4gMDsKIAotCQlmaWxlLT5wcml2YXRlX2RhdGE9KHZvaWQgKikobG9uZylhdG9taWNfcmVhZCgmZmMtPm51bV93YWl0aW5nKTsKKwkJdmFsdWUgPSBhdG9taWNfcmVhZCgmZmMtPm51bV93YWl0aW5nKTsKKwkJZmlsZS0+cHJpdmF0ZV9kYXRhID0gKHZvaWQgKil2YWx1ZTsKIAkJZnVzZV9jb25uX3B1dChmYyk7CiAJfQogCXNpemUgPSBzcHJpbnRmKHRtcCwgIiVsZFxuIiwgKGxvbmcpZmlsZS0+cHJpdmF0ZV9kYXRhKTsKZGlmZiAtLWdpdCBhL2ZzL2Z1c2UvZGV2LmMgYi9mcy9mdXNlL2Rldi5jCmluZGV4IGZiYTU3MTYuLmUwYzdhZGEgMTAwNjQ0Ci0tLSBhL2ZzL2Z1c2UvZGV2LmMKKysrIGIvZnMvZnVzZS9kZXYuYwpAQCAtMSw2ICsxLDYgQEAKIC8qCiAgIEZVU0U6IEZpbGVzeXN0ZW0gaW4gVXNlcnNwYWNlCi0gIENvcHlyaWdodCAoQykgMjAwMS0yMDA2ICBNaWtsb3MgU3plcmVkaSA8bWlrbG9zQHN6ZXJlZGkuaHU+CisgIENvcHlyaWdodCAoQykgMjAwMS0yMDA4ICBNaWtsb3MgU3plcmVkaSA8bWlrbG9zQHN6ZXJlZGkuaHU+CiAKICAgVGhpcyBwcm9ncmFtIGNhbiBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEwuCiAgIFNlZSB0aGUgZmlsZSBDT1BZSU5HLgpAQCAtMjY5LDcgKzI2OSw3IEBACiAgKiBDYWxsZWQgd2l0aCBmYy0+bG9jaywgdW5sb2NrcyBpdAogICovCiBzdGF0aWMgdm9pZCByZXF1ZXN0X2VuZChzdHJ1Y3QgZnVzZV9jb25uICpmYywgc3RydWN0IGZ1c2VfcmVxICpyZXEpCi0JX19yZWxlYXNlcyhmYy0+bG9jaykKK19fcmVsZWFzZXMoJmZjLT5sb2NrKQogewogCXZvaWQgKCplbmQpIChzdHJ1Y3QgZnVzZV9jb25uICosIHN0cnVjdCBmdXNlX3JlcSAqKSA9IHJlcS0+ZW5kOwogCXJlcS0+ZW5kID0gTlVMTDsKQEAgLTI5MywxMyArMjkzLDEzIEBACiAJd2FrZV91cCgmcmVxLT53YWl0cSk7CiAJaWYgKGVuZCkKIAkJZW5kKGZjLCByZXEpOwotCWVsc2UKLQkJZnVzZV9wdXRfcmVxdWVzdChmYywgcmVxKTsKKwlmdXNlX3B1dF9yZXF1ZXN0KGZjLCByZXEpOwogfQogCiBzdGF0aWMgdm9pZCB3YWl0X2Fuc3dlcl9pbnRlcnJ1cHRpYmxlKHN0cnVjdCBmdXNlX2Nvbm4gKmZjLAogCQkJCSAgICAgIHN0cnVjdCBmdXNlX3JlcSAqcmVxKQotCV9fcmVsZWFzZXMoZmMtPmxvY2spIF9fYWNxdWlyZXMoZmMtPmxvY2spCitfX3JlbGVhc2VzKCZmYy0+bG9jaykKK19fYWNxdWlyZXMoJmZjLT5sb2NrKQogewogCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKIAkJcmV0dXJuOwpAQCAtMzE3LDcgKzMxNyw4IEBACiB9CiAKIHN0YXRpYyB2b2lkIHJlcXVlc3Rfd2FpdF9hbnN3ZXIoc3RydWN0IGZ1c2VfY29ubiAqZmMsIHN0cnVjdCBmdXNlX3JlcSAqcmVxKQotCV9fcmVsZWFzZXMoZmMtPmxvY2spIF9fYWNxdWlyZXMoZmMtPmxvY2spCitfX3JlbGVhc2VzKCZmYy0+bG9jaykKK19fYWNxdWlyZXMoJmZjLT5sb2NrKQogewogCWlmICghZmMtPm5vX2ludGVycnVwdCkgewogCQkvKiBBbnkgc2lnbmFsIG1heSBpbnRlcnJ1cHQgdGhpcyAqLwpAQCAtMzgwLDcgKzM4MSw3IEBACiAJfQogfQogCi12b2lkIHJlcXVlc3Rfc2VuZChzdHJ1Y3QgZnVzZV9jb25uICpmYywgc3RydWN0IGZ1c2VfcmVxICpyZXEpCit2b2lkIGZ1c2VfcmVxdWVzdF9zZW5kKHN0cnVjdCBmdXNlX2Nvbm4gKmZjLCBzdHJ1Y3QgZnVzZV9yZXEgKnJlcSkKIHsKIAlyZXEtPmlzcmVwbHkgPSAxOwogCXNwaW5fbG9jaygmZmMtPmxvY2spOwpAQCAtMzk5LDggKzQwMCw4IEBACiAJc3Bpbl91bmxvY2soJmZjLT5sb2NrKTsKIH0KIAotc3RhdGljIHZvaWQgcmVxdWVzdF9zZW5kX25vd2FpdF9sb2NrZWQoc3RydWN0IGZ1c2VfY29ubiAqZmMsCi0JCQkJICAgICAgIHN0cnVjdCBmdXNlX3JlcSAqcmVxKQorc3RhdGljIHZvaWQgZnVzZV9yZXF1ZXN0X3NlbmRfbm93YWl0X2xvY2tlZChzdHJ1Y3QgZnVzZV9jb25uICpmYywKKwkJCQkJICAgIHN0cnVjdCBmdXNlX3JlcSAqcmVxKQogewogCXJlcS0+YmFja2dyb3VuZCA9IDE7CiAJZmMtPm51bV9iYWNrZ3JvdW5kKys7CkBAIC00MTQsMTEgKzQxNSwxMSBAQAogCWZsdXNoX2JnX3F1ZXVlKGZjKTsKIH0KIAotc3RhdGljIHZvaWQgcmVxdWVzdF9zZW5kX25vd2FpdChzdHJ1Y3QgZnVzZV9jb25uICpmYywgc3RydWN0IGZ1c2VfcmVxICpyZXEpCitzdGF0aWMgdm9pZCBmdXNlX3JlcXVlc3Rfc2VuZF9ub3dhaXQoc3RydWN0IGZ1c2VfY29ubiAqZmMsIHN0cnVjdCBmdXNlX3JlcSAqcmVxKQogewogCXNwaW5fbG9jaygmZmMtPmxvY2spOwogCWlmIChmYy0+Y29ubmVjdGVkKSB7Ci0JCXJlcXVlc3Rfc2VuZF9ub3dhaXRfbG9ja2VkKGZjLCByZXEpOworCQlmdXNlX3JlcXVlc3Rfc2VuZF9ub3dhaXRfbG9ja2VkKGZjLCByZXEpOwogCQlzcGluX3VubG9jaygmZmMtPmxvY2spOwogCX0gZWxzZSB7CiAJCXJlcS0+b3V0LmguZXJyb3IgPSAtRU5PVENPTk47CkBAIC00MjYsMTYgKzQyNywxNiBAQAogCX0KIH0KIAotdm9pZCByZXF1ZXN0X3NlbmRfbm9yZXBseShzdHJ1Y3QgZnVzZV9jb25uICpmYywgc3RydWN0IGZ1c2VfcmVxICpyZXEpCit2b2lkIGZ1c2VfcmVxdWVzdF9zZW5kX25vcmVwbHkoc3RydWN0IGZ1c2VfY29ubiAqZmMsIHN0cnVjdCBmdXNlX3JlcSAqcmVxKQogewogCXJlcS0+aXNyZXBseSA9IDA7Ci0JcmVxdWVzdF9zZW5kX25vd2FpdChmYywgcmVxKTsKKwlmdXNlX3JlcXVlc3Rfc2VuZF9ub3dhaXQoZmMsIHJlcSk7CiB9CiAKLXZvaWQgcmVxdWVzdF9zZW5kX2JhY2tncm91bmQoc3RydWN0IGZ1c2VfY29ubiAqZmMsIHN0cnVjdCBmdXNlX3JlcSAqcmVxKQordm9pZCBmdXNlX3JlcXVlc3Rfc2VuZF9iYWNrZ3JvdW5kKHN0cnVjdCBmdXNlX2Nvbm4gKmZjLCBzdHJ1Y3QgZnVzZV9yZXEgKnJlcSkKIHsKIAlyZXEtPmlzcmVwbHkgPSAxOwotCXJlcXVlc3Rfc2VuZF9ub3dhaXQoZmMsIHJlcSk7CisJZnVzZV9yZXF1ZXN0X3NlbmRfbm93YWl0KGZjLCByZXEpOwogfQogCiAvKgpAQCAtNDQzLDEwICs0NDQsMTEgQEAKICAqCiAgKiBmYy0+Y29ubmVjdGVkIG11c3QgaGF2ZSBiZWVuIGNoZWNrZWQgcHJldmlvdXNseQogICovCi12b2lkIHJlcXVlc3Rfc2VuZF9iYWNrZ3JvdW5kX2xvY2tlZChzdHJ1Y3QgZnVzZV9jb25uICpmYywgc3RydWN0IGZ1c2VfcmVxICpyZXEpCit2b2lkIGZ1c2VfcmVxdWVzdF9zZW5kX2JhY2tncm91bmRfbG9ja2VkKHN0cnVjdCBmdXNlX2Nvbm4gKmZjLAorCQkJCQkgc3RydWN0IGZ1c2VfcmVxICpyZXEpCiB7CiAJcmVxLT5pc3JlcGx5ID0gMTsKLQlyZXF1ZXN0X3NlbmRfbm93YWl0X2xvY2tlZChmYywgcmVxKTsKKwlmdXNlX3JlcXVlc3Rfc2VuZF9ub3dhaXRfbG9ja2VkKGZjLCByZXEpOwogfQogCiAvKgpAQCAtNTM5LDggKzU0MSw4IEBACiAJCUJVR19PTighY3MtPm5yX3NlZ3MpOwogCQljcy0+c2VnbGVuID0gY3MtPmlvdlswXS5pb3ZfbGVuOwogCQljcy0+YWRkciA9ICh1bnNpZ25lZCBsb25nKSBjcy0+aW92WzBdLmlvdl9iYXNlOwotCQljcy0+aW92ICsrOwotCQljcy0+bnJfc2VncyAtLTsKKwkJY3MtPmlvdisrOworCQljcy0+bnJfc2Vncy0tOwogCX0KIAlkb3duX3JlYWQoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7CiAJZXJyID0gZ2V0X3VzZXJfcGFnZXMoY3VycmVudCwgY3VycmVudC0+bW0sIGNzLT5hZGRyLCAxLCBjcy0+d3JpdGUsIDAsCkBAIC01ODksOSArNTkxLDExIEBACiAJCWt1bm1hcF9hdG9taWMobWFwYWRkciwgS01fVVNFUjEpOwogCX0KIAl3aGlsZSAoY291bnQpIHsKLQkJaW50IGVycjsKLQkJaWYgKCFjcy0+bGVuICYmIChlcnIgPSBmdXNlX2NvcHlfZmlsbChjcykpKQotCQkJcmV0dXJuIGVycjsKKwkJaWYgKCFjcy0+bGVuKSB7CisJCQlpbnQgZXJyID0gZnVzZV9jb3B5X2ZpbGwoY3MpOworCQkJaWYgKGVycikKKwkJCQlyZXR1cm4gZXJyOworCQl9CiAJCWlmIChwYWdlKSB7CiAJCQl2b2lkICptYXBhZGRyID0ga21hcF9hdG9taWMocGFnZSwgS01fVVNFUjEpOwogCQkJdm9pZCAqYnVmID0gbWFwYWRkciArIG9mZnNldDsKQEAgLTYzMSw5ICs2MzUsMTEgQEAKIHN0YXRpYyBpbnQgZnVzZV9jb3B5X29uZShzdHJ1Y3QgZnVzZV9jb3B5X3N0YXRlICpjcywgdm9pZCAqdmFsLCB1bnNpZ25lZCBzaXplKQogewogCXdoaWxlIChzaXplKSB7Ci0JCWludCBlcnI7Ci0JCWlmICghY3MtPmxlbiAmJiAoZXJyID0gZnVzZV9jb3B5X2ZpbGwoY3MpKSkKLQkJCXJldHVybiBlcnI7CisJCWlmICghY3MtPmxlbikgeworCQkJaW50IGVyciA9IGZ1c2VfY29weV9maWxsKGNzKTsKKwkJCWlmIChlcnIpCisJCQkJcmV0dXJuIGVycjsKKwkJfQogCQlmdXNlX2NvcHlfZG8oY3MsICZ2YWwsICZzaXplKTsKIAl9CiAJcmV0dXJuIDA7CkBAIC02NjQsNiArNjcwLDggQEAKIAogLyogV2FpdCB1bnRpbCBhIHJlcXVlc3QgaXMgYXZhaWxhYmxlIG9uIHRoZSBwZW5kaW5nIGxpc3QgKi8KIHN0YXRpYyB2b2lkIHJlcXVlc3Rfd2FpdChzdHJ1Y3QgZnVzZV9jb25uICpmYykKK19fcmVsZWFzZXMoJmZjLT5sb2NrKQorX19hY3F1aXJlcygmZmMtPmxvY2spCiB7CiAJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CiAKQEAgLTY5MSw3ICs2OTksNyBAQAogICovCiBzdGF0aWMgaW50IGZ1c2VfcmVhZF9pbnRlcnJ1cHQoc3RydWN0IGZ1c2VfY29ubiAqZmMsIHN0cnVjdCBmdXNlX3JlcSAqcmVxLAogCQkJICAgICAgIGNvbnN0IHN0cnVjdCBpb3ZlYyAqaW92LCB1bnNpZ25lZCBsb25nIG5yX3NlZ3MpCi0JX19yZWxlYXNlcyhmYy0+bG9jaykKK19fcmVsZWFzZXMoJmZjLT5sb2NrKQogewogCXN0cnVjdCBmdXNlX2NvcHlfc3RhdGUgY3M7CiAJc3RydWN0IGZ1c2VfaW5faGVhZGVyIGloOwpAQCAtODEzLDYgKzgyMSwzNCBAQAogCXJldHVybiBlcnI7CiB9CiAKK3N0YXRpYyBpbnQgZnVzZV9ub3RpZnlfcG9sbChzdHJ1Y3QgZnVzZV9jb25uICpmYywgdW5zaWduZWQgaW50IHNpemUsCisJCQkgICAgc3RydWN0IGZ1c2VfY29weV9zdGF0ZSAqY3MpCit7CisJc3RydWN0IGZ1c2Vfbm90aWZ5X3BvbGxfd2FrZXVwX291dCBvdXRhcmc7CisJaW50IGVycjsKKworCWlmIChzaXplICE9IHNpemVvZihvdXRhcmcpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWVyciA9IGZ1c2VfY29weV9vbmUoY3MsICZvdXRhcmcsIHNpemVvZihvdXRhcmcpKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJcmV0dXJuIGZ1c2Vfbm90aWZ5X3BvbGxfd2FrZXVwKGZjLCAmb3V0YXJnKTsKK30KKworc3RhdGljIGludCBmdXNlX25vdGlmeShzdHJ1Y3QgZnVzZV9jb25uICpmYywgZW51bSBmdXNlX25vdGlmeV9jb2RlIGNvZGUsCisJCSAgICAgICB1bnNpZ25lZCBpbnQgc2l6ZSwgc3RydWN0IGZ1c2VfY29weV9zdGF0ZSAqY3MpCit7CisJc3dpdGNoIChjb2RlKSB7CisJY2FzZSBGVVNFX05PVElGWV9QT0xMOgorCQlyZXR1cm4gZnVzZV9ub3RpZnlfcG9sbChmYywgc2l6ZSwgY3MpOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorfQorCiAvKiBMb29rIHVwIHJlcXVlc3Qgb24gcHJvY2Vzc2luZyBsaXN0IGJ5IHVuaXF1ZSBJRCAqLwogc3RhdGljIHN0cnVjdCBmdXNlX3JlcSAqcmVxdWVzdF9maW5kKHN0cnVjdCBmdXNlX2Nvbm4gKmZjLCB1NjQgdW5pcXVlKQogewpAQCAtODc2LDkgKzkxMiwyMyBAQAogCWVyciA9IGZ1c2VfY29weV9vbmUoJmNzLCAmb2gsIHNpemVvZihvaCkpOwogCWlmIChlcnIpCiAJCWdvdG8gZXJyX2ZpbmlzaDsKKwogCWVyciA9IC1FSU5WQUw7Ci0JaWYgKCFvaC51bmlxdWUgfHwgb2guZXJyb3IgPD0gLTEwMDAgfHwgb2guZXJyb3IgPiAwIHx8Ci0JICAgIG9oLmxlbiAhPSBuYnl0ZXMpCisJaWYgKG9oLmxlbiAhPSBuYnl0ZXMpCisJCWdvdG8gZXJyX2ZpbmlzaDsKKworCS8qCisJICogWmVybyBvaC51bmlxdWUgaW5kaWNhdGVzIHVuc29saWNpdGVkIG5vdGlmaWNhdGlvbiBtZXNzYWdlCisJICogYW5kIGVycm9yIGNvbnRhaW5zIG5vdGlmaWNhdGlvbiBjb2RlLgorCSAqLworCWlmICghb2gudW5pcXVlKSB7CisJCWVyciA9IGZ1c2Vfbm90aWZ5KGZjLCBvaC5lcnJvciwgbmJ5dGVzIC0gc2l6ZW9mKG9oKSwgJmNzKTsKKwkJZnVzZV9jb3B5X2ZpbmlzaCgmY3MpOworCQlyZXR1cm4gZXJyID8gZXJyIDogbmJ5dGVzOworCX0KKworCWVyciA9IC1FSU5WQUw7CisJaWYgKG9oLmVycm9yIDw9IC0xMDAwIHx8IG9oLmVycm9yID4gMCkKIAkJZ290byBlcnJfZmluaXNoOwogCiAJc3Bpbl9sb2NrKCZmYy0+bG9jayk7CkBAIC05NjYsNiArMTAxNiw4IEBACiAgKiBUaGlzIGZ1bmN0aW9uIHJlbGVhc2VzIGFuZCByZWFjcXVpcmVzIGZjLT5sb2NrCiAgKi8KIHN0YXRpYyB2b2lkIGVuZF9yZXF1ZXN0cyhzdHJ1Y3QgZnVzZV9jb25uICpmYywgc3RydWN0IGxpc3RfaGVhZCAqaGVhZCkKK19fcmVsZWFzZXMoJmZjLT5sb2NrKQorX19hY3F1aXJlcygmZmMtPmxvY2spCiB7CiAJd2hpbGUgKCFsaXN0X2VtcHR5KGhlYWQpKSB7CiAJCXN0cnVjdCBmdXNlX3JlcSAqcmVxOwpAQCAtOTg4LDcgKzEwNDAsOCBAQAogICogbG9ja2VkKS4KICAqLwogc3RhdGljIHZvaWQgZW5kX2lvX3JlcXVlc3RzKHN0cnVjdCBmdXNlX2Nvbm4gKmZjKQotCV9fcmVsZWFzZXMoZmMtPmxvY2spIF9fYWNxdWlyZXMoZmMtPmxvY2spCitfX3JlbGVhc2VzKCZmYy0+bG9jaykKK19fYWNxdWlyZXMoJmZjLT5sb2NrKQogewogCXdoaWxlICghbGlzdF9lbXB0eSgmZmMtPmlvKSkgewogCQlzdHJ1Y3QgZnVzZV9yZXEgKnJlcSA9CkBAIC0xMDAyLDExICsxMDU1LDExIEBACiAJCXdha2VfdXAoJnJlcS0+d2FpdHEpOwogCQlpZiAoZW5kKSB7CiAJCQlyZXEtPmVuZCA9IE5VTEw7Ci0JCQkvKiBUaGUgZW5kIGZ1bmN0aW9uIHdpbGwgY29uc3VtZSB0aGlzIHJlZmVyZW5jZSAqLwogCQkJX19mdXNlX2dldF9yZXF1ZXN0KHJlcSk7CiAJCQlzcGluX3VubG9jaygmZmMtPmxvY2spOwogCQkJd2FpdF9ldmVudChyZXEtPndhaXRxLCAhcmVxLT5sb2NrZWQpOwogCQkJZW5kKGZjLCByZXEpOworCQkJZnVzZV9wdXRfcmVxdWVzdChmYywgcmVxKTsKIAkJCXNwaW5fbG9jaygmZmMtPmxvY2spOwogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvZnMvZnVzZS9kaXIuYyBiL2ZzL2Z1c2UvZGlyLmMKaW5kZXggOTViYzIyYi4uZmRmZjM0NiAxMDA2NDQKLS0tIGEvZnMvZnVzZS9kaXIuYworKysgYi9mcy9mdXNlL2Rpci5jCkBAIC0xLDYgKzEsNiBAQAogLyoKICAgRlVTRTogRmlsZXN5c3RlbSBpbiBVc2Vyc3BhY2UKLSAgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDYgIE1pa2xvcyBTemVyZWRpIDxtaWtsb3NAc3plcmVkaS5odT4KKyAgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDggIE1pa2xvcyBTemVyZWRpIDxtaWtsb3NAc3plcmVkaS5odT4KIAogICBUaGlzIHByb2dyYW0gY2FuIGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTC4KICAgU2VlIHRoZSBmaWxlIENPUFlJTkcuCkBAIC0xODksNyArMTg5LDcgQEAKIAkJcGFyZW50ID0gZGdldF9wYXJlbnQoZW50cnkpOwogCQlmdXNlX2xvb2t1cF9pbml0KGZjLCByZXEsIGdldF9ub2RlX2lkKHBhcmVudC0+ZF9pbm9kZSksCiAJCQkJICZlbnRyeS0+ZF9uYW1lLCAmb3V0YXJnKTsKLQkJcmVxdWVzdF9zZW5kKGZjLCByZXEpOworCQlmdXNlX3JlcXVlc3Rfc2VuZChmYywgcmVxKTsKIAkJZHB1dChwYXJlbnQpOwogCQllcnIgPSByZXEtPm91dC5oLmVycm9yOwogCQlmdXNlX3B1dF9yZXF1ZXN0KGZjLCByZXEpOwpAQCAtMjA0LDcgKzIwNCw3IEBACiAJCQkJcmV0dXJuIDA7CiAJCQl9CiAJCQlzcGluX2xvY2soJmZjLT5sb2NrKTsKLQkJCWZpLT5ubG9va3VwICsrOworCQkJZmktPm5sb29rdXArKzsKIAkJCXNwaW5fdW5sb2NrKCZmYy0+bG9jayk7CiAJCX0KIAkJZnVzZV9wdXRfcmVxdWVzdChmYywgZm9yZ2V0X3JlcSk7CkBAIC0yODMsNyArMjgzLDcgQEAKIAlhdHRyX3ZlcnNpb24gPSBmdXNlX2dldF9hdHRyX3ZlcnNpb24oZmMpOwogCiAJZnVzZV9sb29rdXBfaW5pdChmYywgcmVxLCBub2RlaWQsIG5hbWUsIG91dGFyZyk7Ci0JcmVxdWVzdF9zZW5kKGZjLCByZXEpOworCWZ1c2VfcmVxdWVzdF9zZW5kKGZjLCByZXEpOwogCWVyciA9IHJlcS0+b3V0LmguZXJyb3I7CiAJZnVzZV9wdXRfcmVxdWVzdChmYywgcmVxKTsKIAkvKiBaZXJvIG5vZGVpZCBpcyBzYW1lIGFzIC1FTk9FTlQsIGJ1dCB3aXRoIHZhbGlkIHRpbWVvdXQgKi8KQEAgLTM2OSw3ICszNjksNyBAQAogewogCWZ1c2VfcmVsZWFzZV9maWxsKGZmLCBub2RlaWQsIGZsYWdzLCBGVVNFX1JFTEVBU0UpOwogCWZmLT5yZXNlcnZlZF9yZXEtPmZvcmNlID0gMTsKLQlyZXF1ZXN0X3NlbmQoZmMsIGZmLT5yZXNlcnZlZF9yZXEpOworCWZ1c2VfcmVxdWVzdF9zZW5kKGZjLCBmZi0+cmVzZXJ2ZWRfcmVxKTsKIAlmdXNlX3B1dF9yZXF1ZXN0KGZjLCBmZi0+cmVzZXJ2ZWRfcmVxKTsKIAlrZnJlZShmZik7CiB9CkBAIC00MDgsNyArNDA4LDcgQEAKIAkJZ290byBvdXRfcHV0X2ZvcmdldF9yZXE7CiAKIAllcnIgPSAtRU5PTUVNOwotCWZmID0gZnVzZV9maWxlX2FsbG9jKCk7CisJZmYgPSBmdXNlX2ZpbGVfYWxsb2MoZmMpOwogCWlmICghZmYpCiAJCWdvdG8gb3V0X3B1dF9yZXF1ZXN0OwogCkBAIC00MzIsNyArNDMyLDcgQEAKIAlyZXEtPm91dC5hcmdzWzBdLnZhbHVlID0gJm91dGVudHJ5OwogCXJlcS0+b3V0LmFyZ3NbMV0uc2l6ZSA9IHNpemVvZihvdXRvcGVuKTsKIAlyZXEtPm91dC5hcmdzWzFdLnZhbHVlID0gJm91dG9wZW47Ci0JcmVxdWVzdF9zZW5kKGZjLCByZXEpOworCWZ1c2VfcmVxdWVzdF9zZW5kKGZjLCByZXEpOwogCWVyciA9IHJlcS0+b3V0LmguZXJyb3I7CiAJaWYgKGVycikgewogCQlpZiAoZXJyID09IC1FTk9TWVMpCkBAIC01MDIsNyArNTAyLDcgQEAKIAllbHNlCiAJCXJlcS0+b3V0LmFyZ3NbMF0uc2l6ZSA9IHNpemVvZihvdXRhcmcpOwogCXJlcS0+b3V0LmFyZ3NbMF0udmFsdWUgPSAmb3V0YXJnOwotCXJlcXVlc3Rfc2VuZChmYywgcmVxKTsKKwlmdXNlX3JlcXVlc3Rfc2VuZChmYywgcmVxKTsKIAllcnIgPSByZXEtPm91dC5oLmVycm9yOwogCWZ1c2VfcHV0X3JlcXVlc3QoZmMsIHJlcSk7CiAJaWYgKGVycikKQEAgLTYzMSwxNSArNjMxLDE3IEBACiAJcmVxLT5pbi5udW1hcmdzID0gMTsKIAlyZXEtPmluLmFyZ3NbMF0uc2l6ZSA9IGVudHJ5LT5kX25hbWUubGVuICsgMTsKIAlyZXEtPmluLmFyZ3NbMF0udmFsdWUgPSBlbnRyeS0+ZF9uYW1lLm5hbWU7Ci0JcmVxdWVzdF9zZW5kKGZjLCByZXEpOworCWZ1c2VfcmVxdWVzdF9zZW5kKGZjLCByZXEpOwogCWVyciA9IHJlcS0+b3V0LmguZXJyb3I7CiAJZnVzZV9wdXRfcmVxdWVzdChmYywgcmVxKTsKIAlpZiAoIWVycikgewogCQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZW50cnktPmRfaW5vZGU7CiAKLQkJLyogU2V0IG5saW5rIHRvIHplcm8gc28gdGhlIGlub2RlIGNhbiBiZSBjbGVhcmVkLCBpZgotICAgICAgICAgICAgICAgICAgIHRoZSBpbm9kZSBkb2VzIGhhdmUgbW9yZSBsaW5rcyB0aGlzIHdpbGwgYmUKLSAgICAgICAgICAgICAgICAgICBkaXNjb3ZlcmVkIGF0IHRoZSBuZXh0IGxvb2t1cC9nZXRhdHRyICovCisJCS8qCisJCSAqIFNldCBubGluayB0byB6ZXJvIHNvIHRoZSBpbm9kZSBjYW4gYmUgY2xlYXJlZCwgaWYgdGhlIGlub2RlCisJCSAqIGRvZXMgaGF2ZSBtb3JlIGxpbmtzIHRoaXMgd2lsbCBiZSBkaXNjb3ZlcmVkIGF0IHRoZSBuZXh0CisJCSAqIGxvb2t1cC9nZXRhdHRyLgorCQkgKi8KIAkJY2xlYXJfbmxpbmsoaW5vZGUpOwogCQlmdXNlX2ludmFsaWRhdGVfYXR0cihpbm9kZSk7CiAJCWZ1c2VfaW52YWxpZGF0ZV9hdHRyKGRpcik7CkBAIC02NjIsNyArNjY0LDcgQEAKIAlyZXEtPmluLm51bWFyZ3MgPSAxOwogCXJlcS0+aW4uYXJnc1swXS5zaXplID0gZW50cnktPmRfbmFtZS5sZW4gKyAxOwogCXJlcS0+aW4uYXJnc1swXS52YWx1ZSA9IGVudHJ5LT5kX25hbWUubmFtZTsKLQlyZXF1ZXN0X3NlbmQoZmMsIHJlcSk7CisJZnVzZV9yZXF1ZXN0X3NlbmQoZmMsIHJlcSk7CiAJZXJyID0gcmVxLT5vdXQuaC5lcnJvcjsKIAlmdXNlX3B1dF9yZXF1ZXN0KGZjLCByZXEpOwogCWlmICghZXJyKSB7CkBAIC02OTUsNyArNjk3LDcgQEAKIAlyZXEtPmluLmFyZ3NbMV0udmFsdWUgPSBvbGRlbnQtPmRfbmFtZS5uYW1lOwogCXJlcS0+aW4uYXJnc1syXS5zaXplID0gbmV3ZW50LT5kX25hbWUubGVuICsgMTsKIAlyZXEtPmluLmFyZ3NbMl0udmFsdWUgPSBuZXdlbnQtPmRfbmFtZS5uYW1lOwotCXJlcXVlc3Rfc2VuZChmYywgcmVxKTsKKwlmdXNlX3JlcXVlc3Rfc2VuZChmYywgcmVxKTsKIAllcnIgPSByZXEtPm91dC5oLmVycm9yOwogCWZ1c2VfcHV0X3JlcXVlc3QoZmMsIHJlcSk7CiAJaWYgKCFlcnIpIHsKQEAgLTgxMSw3ICs4MTMsNyBAQAogCWVsc2UKIAkJcmVxLT5vdXQuYXJnc1swXS5zaXplID0gc2l6ZW9mKG91dGFyZyk7CiAJcmVxLT5vdXQuYXJnc1swXS52YWx1ZSA9ICZvdXRhcmc7Ci0JcmVxdWVzdF9zZW5kKGZjLCByZXEpOworCWZ1c2VfcmVxdWVzdF9zZW5kKGZjLCByZXEpOwogCWVyciA9IHJlcS0+b3V0LmguZXJyb3I7CiAJZnVzZV9wdXRfcmVxdWVzdChmYywgcmVxKTsKIAlpZiAoIWVycikgewpAQCAtOTExLDcgKzkxMyw3IEBACiAJcmVxLT5pbi5udW1hcmdzID0gMTsKIAlyZXEtPmluLmFyZ3NbMF0uc2l6ZSA9IHNpemVvZihpbmFyZyk7CiAJcmVxLT5pbi5hcmdzWzBdLnZhbHVlID0gJmluYXJnOwotCXJlcXVlc3Rfc2VuZChmYywgcmVxKTsKKwlmdXNlX3JlcXVlc3Rfc2VuZChmYywgcmVxKTsKIAllcnIgPSByZXEtPm91dC5oLmVycm9yOwogCWZ1c2VfcHV0X3JlcXVlc3QoZmMsIHJlcSk7CiAJaWYgKGVyciA9PSAtRU5PU1lTKSB7CkBAIC0xMDMzLDcgKzEwMzUsNyBAQAogCXJlcS0+bnVtX3BhZ2VzID0gMTsKIAlyZXEtPnBhZ2VzWzBdID0gcGFnZTsKIAlmdXNlX3JlYWRfZmlsbChyZXEsIGZpbGUsIGlub2RlLCBmaWxlLT5mX3BvcywgUEFHRV9TSVpFLCBGVVNFX1JFQURESVIpOwotCXJlcXVlc3Rfc2VuZChmYywgcmVxKTsKKwlmdXNlX3JlcXVlc3Rfc2VuZChmYywgcmVxKTsKIAluYnl0ZXMgPSByZXEtPm91dC5hcmdzWzBdLnNpemU7CiAJZXJyID0gcmVxLT5vdXQuaC5lcnJvcjsKIAlmdXNlX3B1dF9yZXF1ZXN0KGZjLCByZXEpOwpAQCAtMTA2Nyw3ICsxMDY5LDcgQEAKIAlyZXEtPm91dC5udW1hcmdzID0gMTsKIAlyZXEtPm91dC5hcmdzWzBdLnNpemUgPSBQQUdFX1NJWkUgLSAxOwogCXJlcS0+b3V0LmFyZ3NbMF0udmFsdWUgPSBsaW5rOwotCXJlcXVlc3Rfc2VuZChmYywgcmVxKTsKKwlmdXNlX3JlcXVlc3Rfc2VuZChmYywgcmVxKTsKIAlpZiAocmVxLT5vdXQuaC5lcnJvcikgewogCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpIGxpbmspOwogCQlsaW5rID0gRVJSX1BUUihyZXEtPm91dC5oLmVycm9yKTsKQEAgLTEyNzMsNyArMTI3NSw3IEBACiAJZWxzZQogCQlyZXEtPm91dC5hcmdzWzBdLnNpemUgPSBzaXplb2Yob3V0YXJnKTsKIAlyZXEtPm91dC5hcmdzWzBdLnZhbHVlID0gJm91dGFyZzsKLQlyZXF1ZXN0X3NlbmQoZmMsIHJlcSk7CisJZnVzZV9yZXF1ZXN0X3NlbmQoZmMsIHJlcSk7CiAJZXJyID0gcmVxLT5vdXQuaC5lcnJvcjsKIAlmdXNlX3B1dF9yZXF1ZXN0KGZjLCByZXEpOwogCWlmIChlcnIpIHsKQEAgLTEzNjcsNyArMTM2OSw3IEBACiAJcmVxLT5pbi5hcmdzWzFdLnZhbHVlID0gbmFtZTsKIAlyZXEtPmluLmFyZ3NbMl0uc2l6ZSA9IHNpemU7CiAJcmVxLT5pbi5hcmdzWzJdLnZhbHVlID0gdmFsdWU7Ci0JcmVxdWVzdF9zZW5kKGZjLCByZXEpOworCWZ1c2VfcmVxdWVzdF9zZW5kKGZjLCByZXEpOwogCWVyciA9IHJlcS0+b3V0LmguZXJyb3I7CiAJZnVzZV9wdXRfcmVxdWVzdChmYywgcmVxKTsKIAlpZiAoZXJyID09IC1FTk9TWVMpIHsKQEAgLTE0MTMsNyArMTQxNSw3IEBACiAJCXJlcS0+b3V0LmFyZ3NbMF0uc2l6ZSA9IHNpemVvZihvdXRhcmcpOwogCQlyZXEtPm91dC5hcmdzWzBdLnZhbHVlID0gJm91dGFyZzsKIAl9Ci0JcmVxdWVzdF9zZW5kKGZjLCByZXEpOworCWZ1c2VfcmVxdWVzdF9zZW5kKGZjLCByZXEpOwogCXJldCA9IHJlcS0+b3V0LmguZXJyb3I7CiAJaWYgKCFyZXQpCiAJCXJldCA9IHNpemUgPyByZXEtPm91dC5hcmdzWzBdLnNpemUgOiBvdXRhcmcuc2l6ZTsKQEAgLTE0NjMsNyArMTQ2NSw3IEBACiAJCXJlcS0+b3V0LmFyZ3NbMF0uc2l6ZSA9IHNpemVvZihvdXRhcmcpOwogCQlyZXEtPm91dC5hcmdzWzBdLnZhbHVlID0gJm91dGFyZzsKIAl9Ci0JcmVxdWVzdF9zZW5kKGZjLCByZXEpOworCWZ1c2VfcmVxdWVzdF9zZW5kKGZjLCByZXEpOwogCXJldCA9IHJlcS0+b3V0LmguZXJyb3I7CiAJaWYgKCFyZXQpCiAJCXJldCA9IHNpemUgPyByZXEtPm91dC5hcmdzWzBdLnNpemUgOiBvdXRhcmcuc2l6ZTsKQEAgLTE0OTYsNyArMTQ5OCw3IEBACiAJcmVxLT5pbi5udW1hcmdzID0gMTsKIAlyZXEtPmluLmFyZ3NbMF0uc2l6ZSA9IHN0cmxlbihuYW1lKSArIDE7CiAJcmVxLT5pbi5hcmdzWzBdLnZhbHVlID0gbmFtZTsKLQlyZXF1ZXN0X3NlbmQoZmMsIHJlcSk7CisJZnVzZV9yZXF1ZXN0X3NlbmQoZmMsIHJlcSk7CiAJZXJyID0gcmVxLT5vdXQuaC5lcnJvcjsKIAlmdXNlX3B1dF9yZXF1ZXN0KGZjLCByZXEpOwogCWlmIChlcnIgPT0gLUVOT1NZUykgewpkaWZmIC0tZ2l0IGEvZnMvZnVzZS9maWxlLmMgYi9mcy9mdXNlL2ZpbGUuYwppbmRleCA0YzllZTcwLi5lODE2MjY0IDEwMDY0NAotLS0gYS9mcy9mdXNlL2ZpbGUuYworKysgYi9mcy9mdXNlL2ZpbGUuYwpAQCAtMSw2ICsxLDYgQEAKIC8qCiAgIEZVU0U6IEZpbGVzeXN0ZW0gaW4gVXNlcnNwYWNlCi0gIENvcHlyaWdodCAoQykgMjAwMS0yMDA2ICBNaWtsb3MgU3plcmVkaSA8bWlrbG9zQHN6ZXJlZGkuaHU+CisgIENvcHlyaWdodCAoQykgMjAwMS0yMDA4ICBNaWtsb3MgU3plcmVkaSA8bWlrbG9zQHN6ZXJlZGkuaHU+CiAKICAgVGhpcyBwcm9ncmFtIGNhbiBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEwuCiAgIFNlZSB0aGUgZmlsZSBDT1BZSU5HLgpAQCAtMzksMTQgKzM5LDE0IEBACiAJcmVxLT5vdXQubnVtYXJncyA9IDE7CiAJcmVxLT5vdXQuYXJnc1swXS5zaXplID0gc2l6ZW9mKCpvdXRhcmdwKTsKIAlyZXEtPm91dC5hcmdzWzBdLnZhbHVlID0gb3V0YXJncDsKLQlyZXF1ZXN0X3NlbmQoZmMsIHJlcSk7CisJZnVzZV9yZXF1ZXN0X3NlbmQoZmMsIHJlcSk7CiAJZXJyID0gcmVxLT5vdXQuaC5lcnJvcjsKIAlmdXNlX3B1dF9yZXF1ZXN0KGZjLCByZXEpOwogCiAJcmV0dXJuIGVycjsKIH0KIAotc3RydWN0IGZ1c2VfZmlsZSAqZnVzZV9maWxlX2FsbG9jKHZvaWQpCitzdHJ1Y3QgZnVzZV9maWxlICpmdXNlX2ZpbGVfYWxsb2Moc3RydWN0IGZ1c2VfY29ubiAqZmMpCiB7CiAJc3RydWN0IGZ1c2VfZmlsZSAqZmY7CiAJZmYgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZnVzZV9maWxlKSwgR0ZQX0tFUk5FTCk7CkBAIC01OCw3ICs1OCwxMiBAQAogCQl9IGVsc2UgewogCQkJSU5JVF9MSVNUX0hFQUQoJmZmLT53cml0ZV9lbnRyeSk7CiAJCQlhdG9taWNfc2V0KCZmZi0+Y291bnQsIDApOworCQkJc3Bpbl9sb2NrKCZmYy0+bG9jayk7CisJCQlmZi0+a2ggPSArK2ZjLT5raGN0cjsKKwkJCXNwaW5fdW5sb2NrKCZmYy0+bG9jayk7CiAJCX0KKwkJUkJfQ0xFQVJfTk9ERSgmZmYtPnBvbGxlZF9ub2RlKTsKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmZmYtPnBvbGxfd2FpdCk7CiAJfQogCXJldHVybiBmZjsKIH0KQEAgLTc5LDcgKzg0LDYgQEAKIHsKIAlkcHV0KHJlcS0+bWlzYy5yZWxlYXNlLmRlbnRyeSk7CiAJbW50cHV0KHJlcS0+bWlzYy5yZWxlYXNlLnZmc21vdW50KTsKLQlmdXNlX3B1dF9yZXF1ZXN0KGZjLCByZXEpOwogfQogCiBzdGF0aWMgdm9pZCBmdXNlX2ZpbGVfcHV0KHN0cnVjdCBmdXNlX2ZpbGUgKmZmKQpAQCAtODksNyArOTMsNyBAQAogCQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gcmVxLT5taXNjLnJlbGVhc2UuZGVudHJ5LT5kX2lub2RlOwogCQlzdHJ1Y3QgZnVzZV9jb25uICpmYyA9IGdldF9mdXNlX2Nvbm4oaW5vZGUpOwogCQlyZXEtPmVuZCA9IGZ1c2VfcmVsZWFzZV9lbmQ7Ci0JCXJlcXVlc3Rfc2VuZF9iYWNrZ3JvdW5kKGZjLCByZXEpOworCQlmdXNlX3JlcXVlc3Rfc2VuZF9iYWNrZ3JvdW5kKGZjLCByZXEpOwogCQlrZnJlZShmZik7CiAJfQogfQpAQCAtMTA5LDYgKzExMyw3IEBACiAKIGludCBmdXNlX29wZW5fY29tbW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLCBpbnQgaXNkaXIpCiB7CisJc3RydWN0IGZ1c2VfY29ubiAqZmMgPSBnZXRfZnVzZV9jb25uKGlub2RlKTsKIAlzdHJ1Y3QgZnVzZV9vcGVuX291dCBvdXRhcmc7CiAJc3RydWN0IGZ1c2VfZmlsZSAqZmY7CiAJaW50IGVycjsKQEAgLTEyMSw3ICsxMjYsNyBAQAogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAKLQlmZiA9IGZ1c2VfZmlsZV9hbGxvYygpOworCWZmID0gZnVzZV9maWxlX2FsbG9jKGZjKTsKIAlpZiAoIWZmKQogCQlyZXR1cm4gLUVOT01FTTsKIApAQCAtMTY3LDcgKzE3MiwxMSBAQAogCiAJCXNwaW5fbG9jaygmZmMtPmxvY2spOwogCQlsaXN0X2RlbCgmZmYtPndyaXRlX2VudHJ5KTsKKwkJaWYgKCFSQl9FTVBUWV9OT0RFKCZmZi0+cG9sbGVkX25vZGUpKQorCQkJcmJfZXJhc2UoJmZmLT5wb2xsZWRfbm9kZSwgJmZjLT5wb2xsZWRfZmlsZXMpOwogCQlzcGluX3VubG9jaygmZmMtPmxvY2spOworCisJCXdha2VfdXBfaW50ZXJydXB0aWJsZV9zeW5jKCZmZi0+cG9sbF93YWl0KTsKIAkJLyoKIAkJICogTm9ybWFsbHkgdGhpcyB3aWxsIHNlbmQgdGhlIFJFTEVBU0UgcmVxdWVzdCwKIAkJICogaG93ZXZlciBpZiBzb21lIGFzeW5jaHJvbm91cyBSRUFEIG9yIFdSSVRFIHJlcXVlc3RzCkBAIC0yODAsNyArMjg5LDcgQEAKIAlyZXEtPmluLmFyZ3NbMF0uc2l6ZSA9IHNpemVvZihpbmFyZyk7CiAJcmVxLT5pbi5hcmdzWzBdLnZhbHVlID0gJmluYXJnOwogCXJlcS0+Zm9yY2UgPSAxOwotCXJlcXVlc3Rfc2VuZChmYywgcmVxKTsKKwlmdXNlX3JlcXVlc3Rfc2VuZChmYywgcmVxKTsKIAllcnIgPSByZXEtPm91dC5oLmVycm9yOwogCWZ1c2VfcHV0X3JlcXVlc3QoZmMsIHJlcSk7CiAJaWYgKGVyciA9PSAtRU5PU1lTKSB7CkBAIC0zNDQsNyArMzUzLDcgQEAKIAlyZXEtPmluLm51bWFyZ3MgPSAxOwogCXJlcS0+aW4uYXJnc1swXS5zaXplID0gc2l6ZW9mKGluYXJnKTsKIAlyZXEtPmluLmFyZ3NbMF0udmFsdWUgPSAmaW5hcmc7Ci0JcmVxdWVzdF9zZW5kKGZjLCByZXEpOworCWZ1c2VfcmVxdWVzdF9zZW5kKGZjLCByZXEpOwogCWVyciA9IHJlcS0+b3V0LmguZXJyb3I7CiAJZnVzZV9wdXRfcmVxdWVzdChmYywgcmVxKTsKIAlpZiAoZXJyID09IC1FTk9TWVMpIHsKQEAgLTM5Niw3ICs0MDUsNyBAQAogCQlpbmFyZy0+cmVhZF9mbGFncyB8PSBGVVNFX1JFQURfTE9DS09XTkVSOwogCQlpbmFyZy0+bG9ja19vd25lciA9IGZ1c2VfbG9ja19vd25lcl9pZChmYywgb3duZXIpOwogCX0KLQlyZXF1ZXN0X3NlbmQoZmMsIHJlcSk7CisJZnVzZV9yZXF1ZXN0X3NlbmQoZmMsIHJlcSk7CiAJcmV0dXJuIHJlcS0+b3V0LmFyZ3NbMF0uc2l6ZTsKIH0KIApAQCAtNDkzLDcgKzUwMiw2IEBACiAJfQogCWlmIChyZXEtPmZmKQogCQlmdXNlX2ZpbGVfcHV0KHJlcS0+ZmYpOwotCWZ1c2VfcHV0X3JlcXVlc3QoZmMsIHJlcSk7CiB9CiAKIHN0YXRpYyB2b2lkIGZ1c2Vfc2VuZF9yZWFkcGFnZXMoc3RydWN0IGZ1c2VfcmVxICpyZXEsIHN0cnVjdCBmaWxlICpmaWxlLApAQCAtNTA5LDEwICs1MTcsMTEgQEAKIAkJc3RydWN0IGZ1c2VfZmlsZSAqZmYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAJCXJlcS0+ZmYgPSBmdXNlX2ZpbGVfZ2V0KGZmKTsKIAkJcmVxLT5lbmQgPSBmdXNlX3JlYWRwYWdlc19lbmQ7Ci0JCXJlcXVlc3Rfc2VuZF9iYWNrZ3JvdW5kKGZjLCByZXEpOworCQlmdXNlX3JlcXVlc3Rfc2VuZF9iYWNrZ3JvdW5kKGZjLCByZXEpOwogCX0gZWxzZSB7Ci0JCXJlcXVlc3Rfc2VuZChmYywgcmVxKTsKKwkJZnVzZV9yZXF1ZXN0X3NlbmQoZmMsIHJlcSk7CiAJCWZ1c2VfcmVhZHBhZ2VzX2VuZChmYywgcmVxKTsKKwkJZnVzZV9wdXRfcmVxdWVzdChmYywgcmVxKTsKIAl9CiB9CiAKQEAgLTU0Myw3ICs1NTIsNyBAQAogCQl9CiAJfQogCXJlcS0+cGFnZXNbcmVxLT5udW1fcGFnZXNdID0gcGFnZTsKLQlyZXEtPm51bV9wYWdlcyArKzsKKwlyZXEtPm51bV9wYWdlcysrOwogCXJldHVybiAwOwogfQogCkBAIC02MzYsNyArNjQ1LDcgQEAKIAkJaW5hcmctPndyaXRlX2ZsYWdzIHw9IEZVU0VfV1JJVEVfTE9DS09XTkVSOwogCQlpbmFyZy0+bG9ja19vd25lciA9IGZ1c2VfbG9ja19vd25lcl9pZChmYywgb3duZXIpOwogCX0KLQlyZXF1ZXN0X3NlbmQoZmMsIHJlcSk7CisJZnVzZV9yZXF1ZXN0X3NlbmQoZmMsIHJlcSk7CiAJcmV0dXJuIHJlcS0+bWlzYy53cml0ZS5vdXQuc2l6ZTsKIH0KIApAQCAtMTA0Miw3ICsxMDUxLDYgQEAKIHsKIAlfX2ZyZWVfcGFnZShyZXEtPnBhZ2VzWzBdKTsKIAlmdXNlX2ZpbGVfcHV0KHJlcS0+ZmYpOwotCWZ1c2VfcHV0X3JlcXVlc3QoZmMsIHJlcSk7CiB9CiAKIHN0YXRpYyB2b2lkIGZ1c2Vfd3JpdGVwYWdlX2ZpbmlzaChzdHJ1Y3QgZnVzZV9jb25uICpmYywgc3RydWN0IGZ1c2VfcmVxICpyZXEpCkBAIC0xMDYwLDYgKzEwNjgsOCBAQAogCiAvKiBDYWxsZWQgdW5kZXIgZmMtPmxvY2ssIG1heSByZWxlYXNlIGFuZCByZWFjcXVpcmUgaXQgKi8KIHN0YXRpYyB2b2lkIGZ1c2Vfc2VuZF93cml0ZXBhZ2Uoc3RydWN0IGZ1c2VfY29ubiAqZmMsIHN0cnVjdCBmdXNlX3JlcSAqcmVxKQorX19yZWxlYXNlcygmZmMtPmxvY2spCitfX2FjcXVpcmVzKCZmYy0+bG9jaykKIHsKIAlzdHJ1Y3QgZnVzZV9pbm9kZSAqZmkgPSBnZXRfZnVzZV9pbm9kZShyZXEtPmlub2RlKTsKIAlsb2ZmX3Qgc2l6ZSA9IGlfc2l6ZV9yZWFkKHJlcS0+aW5vZGUpOwpAQCAtMTA3OSwxMyArMTA4OSwxNCBAQAogCiAJcmVxLT5pbi5hcmdzWzFdLnNpemUgPSBpbmFyZy0+c2l6ZTsKIAlmaS0+d3JpdGVjdHIrKzsKLQlyZXF1ZXN0X3NlbmRfYmFja2dyb3VuZF9sb2NrZWQoZmMsIHJlcSk7CisJZnVzZV9yZXF1ZXN0X3NlbmRfYmFja2dyb3VuZF9sb2NrZWQoZmMsIHJlcSk7CiAJcmV0dXJuOwogCiAgb3V0X2ZyZWU6CiAJZnVzZV93cml0ZXBhZ2VfZmluaXNoKGZjLCByZXEpOwogCXNwaW5fdW5sb2NrKCZmYy0+bG9jayk7CiAJZnVzZV93cml0ZXBhZ2VfZnJlZShmYywgcmVxKTsKKwlmdXNlX3B1dF9yZXF1ZXN0KGZjLCByZXEpOwogCXNwaW5fbG9jaygmZmMtPmxvY2spOwogfQogCkBAIC0xMDk2LDYgKzExMDcsOCBAQAogICogQ2FsbGVkIHdpdGggZmMtPmxvY2sKICAqLwogdm9pZCBmdXNlX2ZsdXNoX3dyaXRlcGFnZXMoc3RydWN0IGlub2RlICppbm9kZSkKK19fcmVsZWFzZXMoJmZjLT5sb2NrKQorX19hY3F1aXJlcygmZmMtPmxvY2spCiB7CiAJc3RydWN0IGZ1c2VfY29ubiAqZmMgPSBnZXRfZnVzZV9jb25uKGlub2RlKTsKIAlzdHJ1Y3QgZnVzZV9pbm9kZSAqZmkgPSBnZXRfZnVzZV9pbm9kZShpbm9kZSk7CkBAIC0xMzI1LDcgKzEzMzgsNyBAQAogCXJlcS0+b3V0Lm51bWFyZ3MgPSAxOwogCXJlcS0+b3V0LmFyZ3NbMF0uc2l6ZSA9IHNpemVvZihvdXRhcmcpOwogCXJlcS0+b3V0LmFyZ3NbMF0udmFsdWUgPSAmb3V0YXJnOwotCXJlcXVlc3Rfc2VuZChmYywgcmVxKTsKKwlmdXNlX3JlcXVlc3Rfc2VuZChmYywgcmVxKTsKIAllcnIgPSByZXEtPm91dC5oLmVycm9yOwogCWZ1c2VfcHV0X3JlcXVlc3QoZmMsIHJlcSk7CiAJaWYgKCFlcnIpCkBAIC0xMzU3LDcgKzEzNzAsNyBAQAogCQlyZXR1cm4gUFRSX0VSUihyZXEpOwogCiAJZnVzZV9sa19maWxsKHJlcSwgZmlsZSwgZmwsIG9wY29kZSwgcGlkLCBmbG9jayk7Ci0JcmVxdWVzdF9zZW5kKGZjLCByZXEpOworCWZ1c2VfcmVxdWVzdF9zZW5kKGZjLCByZXEpOwogCWVyciA9IHJlcS0+b3V0LmguZXJyb3I7CiAJLyogbG9ja2luZyBpcyByZXN0YXJ0YWJsZSAqLwogCWlmIChlcnIgPT0gLUVJTlRSKQpAQCAtMTQzMyw3ICsxNDQ2LDcgQEAKIAlyZXEtPm91dC5udW1hcmdzID0gMTsKIAlyZXEtPm91dC5hcmdzWzBdLnNpemUgPSBzaXplb2Yob3V0YXJnKTsKIAlyZXEtPm91dC5hcmdzWzBdLnZhbHVlID0gJm91dGFyZzsKLQlyZXF1ZXN0X3NlbmQoZmMsIHJlcSk7CisJZnVzZV9yZXF1ZXN0X3NlbmQoZmMsIHJlcSk7CiAJZXJyID0gcmVxLT5vdXQuaC5lcnJvcjsKIAlmdXNlX3B1dF9yZXF1ZXN0KGZjLCByZXEpOwogCWlmIChlcnIgPT0gLUVOT1NZUykKQEAgLTE0NzAsNiArMTQ4Myw0MDYgQEAKIAlyZXR1cm4gcmV0dmFsOwogfQogCitzdGF0aWMgaW50IGZ1c2VfaW9jdGxfY29weV91c2VyKHN0cnVjdCBwYWdlICoqcGFnZXMsIHN0cnVjdCBpb3ZlYyAqaW92LAorCQkJdW5zaWduZWQgaW50IG5yX3NlZ3MsIHNpemVfdCBieXRlcywgYm9vbCB0b191c2VyKQoreworCXN0cnVjdCBpb3ZfaXRlciBpaTsKKwlpbnQgcGFnZV9pZHggPSAwOworCisJaWYgKCFieXRlcykKKwkJcmV0dXJuIDA7CisKKwlpb3ZfaXRlcl9pbml0KCZpaSwgaW92LCBucl9zZWdzLCBieXRlcywgMCk7CisKKwl3aGlsZSAoaW92X2l0ZXJfY291bnQoJmlpKSkgeworCQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IHBhZ2VzW3BhZ2VfaWR4KytdOworCQlzaXplX3QgdG9kbyA9IG1pbl90KHNpemVfdCwgUEFHRV9TSVpFLCBpb3ZfaXRlcl9jb3VudCgmaWkpKTsKKwkJdm9pZCAqa2FkZHIsICptYXA7CisKKwkJa2FkZHIgPSBtYXAgPSBrbWFwKHBhZ2UpOworCisJCXdoaWxlICh0b2RvKSB7CisJCQljaGFyIF9fdXNlciAqdWFkZHIgPSBpaS5pb3YtPmlvdl9iYXNlICsgaWkuaW92X29mZnNldDsKKwkJCXNpemVfdCBpb3ZfbGVuID0gaWkuaW92LT5pb3ZfbGVuIC0gaWkuaW92X29mZnNldDsKKwkJCXNpemVfdCBjb3B5ID0gbWluKHRvZG8sIGlvdl9sZW4pOworCQkJc2l6ZV90IGxlZnQ7CisKKwkJCWlmICghdG9fdXNlcikKKwkJCQlsZWZ0ID0gY29weV9mcm9tX3VzZXIoa2FkZHIsIHVhZGRyLCBjb3B5KTsKKwkJCWVsc2UKKwkJCQlsZWZ0ID0gY29weV90b191c2VyKHVhZGRyLCBrYWRkciwgY29weSk7CisKKwkJCWlmICh1bmxpa2VseShsZWZ0KSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKworCQkJaW92X2l0ZXJfYWR2YW5jZSgmaWksIGNvcHkpOworCQkJdG9kbyAtPSBjb3B5OworCQkJa2FkZHIgKz0gY29weTsKKwkJfQorCisJCWt1bm1hcChtYXApOworCX0KKworCXJldHVybiAwOworfQorCisvKgorICogRm9yIGlvY3RscywgdGhlcmUgaXMgbm8gZ2VuZXJpYyB3YXkgdG8gZGV0ZXJtaW5lIGhvdyBtdWNoIG1lbW9yeQorICogbmVlZHMgdG8gYmUgcmVhZCBhbmQvb3Igd3JpdHRlbi4gIEZ1cnRoZXJtb3JlLCBpb2N0bHMgYXJlIGFsbG93ZWQKKyAqIHRvIGRlcmVmZXJlbmNlIHRoZSBwYXNzZWQgcG9pbnRlciwgc28gdGhlIHBhcmFtZXRlciByZXF1aXJlcyBkZWVwCisgKiBjb3B5aW5nIGJ1dCBGVVNFIGhhcyBubyBpZGVhIHdoYXRzb2V2ZXIgYWJvdXQgd2hhdCB0byBjb3B5IGluIG9yCisgKiBvdXQuCisgKgorICogVGhpcyBpcyBzb2x2ZWQgYnkgYWxsb3dpbmcgRlVTRSBzZXJ2ZXIgdG8gcmV0cnkgaW9jdGwgd2l0aAorICogbmVjZXNzYXJ5IGluL291dCBpb3ZlY3MuICBMZXQncyBhc3N1bWUgdGhlIGlvY3RsIGltcGxlbWVudGF0aW9uCisgKiBuZWVkcyB0byByZWFkIGluIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlLgorICoKKyAqIHN0cnVjdCBhIHsKKyAqCWNoYXIJKmJ1ZjsKKyAqCXNpemVfdAlidWZsZW47CisgKiB9CisgKgorICogT24gdGhlIGZpcnN0IGNhbGxvdXQgdG8gRlVTRSBzZXJ2ZXIsIGluYXJnLT5pbl9zaXplIGFuZAorICogaW5hcmctPm91dF9zaXplIHdpbGwgYmUgTlVMTDsgdGhlbiwgdGhlIHNlcnZlciBjb21wbGV0ZXMgdGhlIGlvY3RsCisgKiB3aXRoIEZVU0VfSU9DVExfUkVUUlkgc2V0IGluIG91dC0+ZmxhZ3MsIG91dC0+aW5faW92cyBzZXQgdG8gMSBhbmQKKyAqIHRoZSBhY3R1YWwgaW92IGFycmF5IHRvCisgKgorICogeyB7IC5pb3ZfYmFzZSA9IGluYXJnLmFyZywJLmlvdl9sZW4gPSBzaXplb2Yoc3RydWN0IGEpIH0gfQorICoKKyAqIHdoaWNoIHRlbGxzIEZVU0UgdG8gY29weSBpbiB0aGUgcmVxdWVzdGVkIGFyZWEgYW5kIHJldHJ5IHRoZSBpb2N0bC4KKyAqIE9uIHRoZSBzZWNvbmQgcm91bmQsIHRoZSBzZXJ2ZXIgaGFzIGFjY2VzcyB0byB0aGUgc3RydWN0dXJlIGFuZAorICogZnJvbSB0aGF0IGl0IGNhbiB0ZWxsIHdoYXQgdG8gbG9vayBmb3IgbmV4dCwgc28gb24gdGhlIGludm9jYXRpb24sCisgKiBpdCBzZXRzIEZVU0VfSU9DVExfUkVUUlksIG91dC0+aW5faW92cyB0byAyIGFuZCBpb3YgYXJyYXkgdG8KKyAqCisgKiB7IHsgLmlvdl9iYXNlID0gaW5hcmcuYXJnLAkuaW92X2xlbiA9IHNpemVvZihzdHJ1Y3QgYSkJfSwKKyAqICAgeyAuaW92X2Jhc2UgPSBhLmJ1ZiwJLmlvdl9sZW4gPSBhLmJ1ZmxlbgkJfSB9CisgKgorICogRlVTRSB3aWxsIGNvcHkgYm90aCBzdHJ1Y3QgYSBhbmQgdGhlIHBvaW50ZWQgYnVmZmVyIGZyb20gdGhlCisgKiBwcm9jZXNzIGRvaW5nIHRoZSBpb2N0bCBhbmQgcmV0cnkgaW9jdGwgd2l0aCBib3RoIHN0cnVjdCBhIGFuZCB0aGUKKyAqIGJ1ZmZlci4KKyAqCisgKiBUaGlzIHRpbWUsIEZVU0Ugc2VydmVyIGhhcyBldmVyeXRoaW5nIGl0IG5lZWRzIGFuZCBjb21wbGV0ZXMgaW9jdGwKKyAqIHdpdGhvdXQgRlVTRV9JT0NUTF9SRVRSWSB3aGljaCBmaW5pc2hlcyB0aGUgaW9jdGwgY2FsbC4KKyAqCisgKiBDb3B5aW5nIGRhdGEgb3V0IHdvcmtzIHRoZSBzYW1lIHdheS4KKyAqCisgKiBOb3RlIHRoYXQgaWYgRlVTRV9JT0NUTF9VTlJFU1RSSUNURUQgaXMgY2xlYXIsIHRoZSBrZXJuZWwKKyAqIGF1dG9tYXRpY2FsbHkgaW5pdGlhbGl6ZXMgaW4gYW5kIG91dCBpb3ZzIGJ5IGRlY29kaW5nIEBjbWQgd2l0aAorICogX0lPQ18qIG1hY3JvcyBhbmQgdGhlIHNlcnZlciBpcyBub3QgYWxsb3dlZCB0byByZXF1ZXN0IFJFVFJZLiAgVGhpcworICogbGltaXRzIGlvY3RsIGRhdGEgdHJhbnNmZXJzIHRvIHdlbGwtZm9ybWVkIGlvY3RscyBhbmQgaXMgdGhlIGZvcmNlZAorICogYmVoYXZpb3IgZm9yIGFsbCBGVVNFIHNlcnZlcnMuCisgKi8KK3N0YXRpYyBsb25nIGZ1c2VfZmlsZV9kb19pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKKwkJCSAgICAgICB1bnNpZ25lZCBsb25nIGFyZywgdW5zaWduZWQgaW50IGZsYWdzKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgZnVzZV9maWxlICpmZiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZnVzZV9jb25uICpmYyA9IGdldF9mdXNlX2Nvbm4oaW5vZGUpOworCXN0cnVjdCBmdXNlX2lvY3RsX2luIGluYXJnID0geworCQkuZmggPSBmZi0+ZmgsCisJCS5jbWQgPSBjbWQsCisJCS5hcmcgPSBhcmcsCisJCS5mbGFncyA9IGZsYWdzCisJfTsKKwlzdHJ1Y3QgZnVzZV9pb2N0bF9vdXQgb3V0YXJnOworCXN0cnVjdCBmdXNlX3JlcSAqcmVxID0gTlVMTDsKKwlzdHJ1Y3QgcGFnZSAqKnBhZ2VzID0gTlVMTDsKKwlzdHJ1Y3QgcGFnZSAqaW92X3BhZ2UgPSBOVUxMOworCXN0cnVjdCBpb3ZlYyAqaW5faW92ID0gTlVMTCwgKm91dF9pb3YgPSBOVUxMOworCXVuc2lnbmVkIGludCBpbl9pb3ZzID0gMCwgb3V0X2lvdnMgPSAwLCBudW1fcGFnZXMgPSAwLCBtYXhfcGFnZXM7CisJc2l6ZV90IGluX3NpemUsIG91dF9zaXplLCB0cmFuc2ZlcnJlZDsKKwlpbnQgZXJyOworCisJLyogYXNzdW1lIGFsbCB0aGUgaW92cyByZXR1cm5lZCBieSBjbGllbnQgYWx3YXlzIGZpdHMgaW4gYSBwYWdlICovCisJQlVJTERfQlVHX09OKHNpemVvZihzdHJ1Y3QgaW92ZWMpICogRlVTRV9JT0NUTF9NQVhfSU9WID4gUEFHRV9TSVpFKTsKKworCWlmICghZnVzZV9hbGxvd190YXNrKGZjLCBjdXJyZW50KSkKKwkJcmV0dXJuIC1FQUNDRVM7CisKKwllcnIgPSAtRUlPOworCWlmIChpc19iYWRfaW5vZGUoaW5vZGUpKQorCQlnb3RvIG91dDsKKworCWVyciA9IC1FTk9NRU07CisJcGFnZXMgPSBremFsbG9jKHNpemVvZihwYWdlc1swXSkgKiBGVVNFX01BWF9QQUdFU19QRVJfUkVRLCBHRlBfS0VSTkVMKTsKKwlpb3ZfcGFnZSA9IGFsbG9jX3BhZ2UoR0ZQX0tFUk5FTCk7CisJaWYgKCFwYWdlcyB8fCAhaW92X3BhZ2UpCisJCWdvdG8gb3V0OworCisJLyoKKwkgKiBJZiByZXN0cmljdGVkLCBpbml0aWFsaXplIElPIHBhcmFtZXRlcnMgYXMgZW5jb2RlZCBpbiBAY21kLgorCSAqIFJFVFJZIGZyb20gc2VydmVyIGlzIG5vdCBhbGxvd2VkLgorCSAqLworCWlmICghKGZsYWdzICYgRlVTRV9JT0NUTF9VTlJFU1RSSUNURUQpKSB7CisJCXN0cnVjdCBpb3ZlYyAqaW92ID0gcGFnZV9hZGRyZXNzKGlvdl9wYWdlKTsKKworCQlpb3YtPmlvdl9iYXNlID0gKHZvaWQgX191c2VyICopYXJnOworCQlpb3YtPmlvdl9sZW4gPSBfSU9DX1NJWkUoY21kKTsKKworCQlpZiAoX0lPQ19ESVIoY21kKSAmIF9JT0NfV1JJVEUpIHsKKwkJCWluX2lvdiA9IGlvdjsKKwkJCWluX2lvdnMgPSAxOworCQl9CisKKwkJaWYgKF9JT0NfRElSKGNtZCkgJiBfSU9DX1JFQUQpIHsKKwkJCW91dF9pb3YgPSBpb3Y7CisJCQlvdXRfaW92cyA9IDE7CisJCX0KKwl9CisKKyByZXRyeToKKwlpbmFyZy5pbl9zaXplID0gaW5fc2l6ZSA9IGlvdl9sZW5ndGgoaW5faW92LCBpbl9pb3ZzKTsKKwlpbmFyZy5vdXRfc2l6ZSA9IG91dF9zaXplID0gaW92X2xlbmd0aChvdXRfaW92LCBvdXRfaW92cyk7CisKKwkvKgorCSAqIE91dCBkYXRhIGNhbiBiZSB1c2VkIGVpdGhlciBmb3IgYWN0dWFsIG91dCBkYXRhIG9yIGlvdnMsCisJICogbWFrZSBzdXJlIHRoZXJlIGFsd2F5cyBpcyBhdCBsZWFzdCBvbmUgcGFnZS4KKwkgKi8KKwlvdXRfc2l6ZSA9IG1heF90KHNpemVfdCwgb3V0X3NpemUsIFBBR0VfU0laRSk7CisJbWF4X3BhZ2VzID0gRElWX1JPVU5EX1VQKG1heChpbl9zaXplLCBvdXRfc2l6ZSksIFBBR0VfU0laRSk7CisKKwkvKiBtYWtlIHN1cmUgdGhlcmUgYXJlIGVub3VnaCBidWZmZXIgcGFnZXMgYW5kIGluaXQgcmVxdWVzdCB3aXRoIHRoZW0gKi8KKwllcnIgPSAtRU5PTUVNOworCWlmIChtYXhfcGFnZXMgPiBGVVNFX01BWF9QQUdFU19QRVJfUkVRKQorCQlnb3RvIG91dDsKKwl3aGlsZSAobnVtX3BhZ2VzIDwgbWF4X3BhZ2VzKSB7CisJCXBhZ2VzW251bV9wYWdlc10gPSBhbGxvY19wYWdlKEdGUF9LRVJORUwgfCBfX0dGUF9ISUdITUVNKTsKKwkJaWYgKCFwYWdlc1tudW1fcGFnZXNdKQorCQkJZ290byBvdXQ7CisJCW51bV9wYWdlcysrOworCX0KKworCXJlcSA9IGZ1c2VfZ2V0X3JlcShmYyk7CisJaWYgKElTX0VSUihyZXEpKSB7CisJCWVyciA9IFBUUl9FUlIocmVxKTsKKwkJcmVxID0gTlVMTDsKKwkJZ290byBvdXQ7CisJfQorCW1lbWNweShyZXEtPnBhZ2VzLCBwYWdlcywgc2l6ZW9mKHJlcS0+cGFnZXNbMF0pICogbnVtX3BhZ2VzKTsKKwlyZXEtPm51bV9wYWdlcyA9IG51bV9wYWdlczsKKworCS8qIG9rYXksIGxldCdzIHNlbmQgaXQgdG8gdGhlIGNsaWVudCAqLworCXJlcS0+aW4uaC5vcGNvZGUgPSBGVVNFX0lPQ1RMOworCXJlcS0+aW4uaC5ub2RlaWQgPSBnZXRfbm9kZV9pZChpbm9kZSk7CisJcmVxLT5pbi5udW1hcmdzID0gMTsKKwlyZXEtPmluLmFyZ3NbMF0uc2l6ZSA9IHNpemVvZihpbmFyZyk7CisJcmVxLT5pbi5hcmdzWzBdLnZhbHVlID0gJmluYXJnOworCWlmIChpbl9zaXplKSB7CisJCXJlcS0+aW4ubnVtYXJncysrOworCQlyZXEtPmluLmFyZ3NbMV0uc2l6ZSA9IGluX3NpemU7CisJCXJlcS0+aW4uYXJncGFnZXMgPSAxOworCisJCWVyciA9IGZ1c2VfaW9jdGxfY29weV91c2VyKHBhZ2VzLCBpbl9pb3YsIGluX2lvdnMsIGluX3NpemUsCisJCQkJCSAgIGZhbHNlKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gb3V0OworCX0KKworCXJlcS0+b3V0Lm51bWFyZ3MgPSAyOworCXJlcS0+b3V0LmFyZ3NbMF0uc2l6ZSA9IHNpemVvZihvdXRhcmcpOworCXJlcS0+b3V0LmFyZ3NbMF0udmFsdWUgPSAmb3V0YXJnOworCXJlcS0+b3V0LmFyZ3NbMV0uc2l6ZSA9IG91dF9zaXplOworCXJlcS0+b3V0LmFyZ3BhZ2VzID0gMTsKKwlyZXEtPm91dC5hcmd2YXIgPSAxOworCisJZnVzZV9yZXF1ZXN0X3NlbmQoZmMsIHJlcSk7CisJZXJyID0gcmVxLT5vdXQuaC5lcnJvcjsKKwl0cmFuc2ZlcnJlZCA9IHJlcS0+b3V0LmFyZ3NbMV0uc2l6ZTsKKwlmdXNlX3B1dF9yZXF1ZXN0KGZjLCByZXEpOworCXJlcSA9IE5VTEw7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisKKwkvKiBkaWQgaXQgYXNrIGZvciByZXRyeT8gKi8KKwlpZiAob3V0YXJnLmZsYWdzICYgRlVTRV9JT0NUTF9SRVRSWSkgeworCQljaGFyICp2YWRkcjsKKworCQkvKiBubyByZXRyeSBpZiBpbiByZXN0cmljdGVkIG1vZGUgKi8KKwkJZXJyID0gLUVJTzsKKwkJaWYgKCEoZmxhZ3MgJiBGVVNFX0lPQ1RMX1VOUkVTVFJJQ1RFRCkpCisJCQlnb3RvIG91dDsKKworCQlpbl9pb3ZzID0gb3V0YXJnLmluX2lvdnM7CisJCW91dF9pb3ZzID0gb3V0YXJnLm91dF9pb3ZzOworCisJCS8qCisJCSAqIE1ha2Ugc3VyZSB0aGluZ3MgYXJlIGluIGJvdW5kYXJ5LCBzZXBhcmF0ZSBjaGVja3MKKwkJICogYXJlIHRvIHByb3RlY3QgYWdhaW5zdCBvdmVyZmxvdy4KKwkJICovCisJCWVyciA9IC1FTk9NRU07CisJCWlmIChpbl9pb3ZzID4gRlVTRV9JT0NUTF9NQVhfSU9WIHx8CisJCSAgICBvdXRfaW92cyA+IEZVU0VfSU9DVExfTUFYX0lPViB8fAorCQkgICAgaW5faW92cyArIG91dF9pb3ZzID4gRlVTRV9JT0NUTF9NQVhfSU9WKQorCQkJZ290byBvdXQ7CisKKwkJZXJyID0gLUVJTzsKKwkJaWYgKChpbl9pb3ZzICsgb3V0X2lvdnMpICogc2l6ZW9mKHN0cnVjdCBpb3ZlYykgIT0gdHJhbnNmZXJyZWQpCisJCQlnb3RvIG91dDsKKworCQkvKiBva2F5LCBjb3B5IGluIGlvdnMgYW5kIHJldHJ5ICovCisJCXZhZGRyID0ga21hcF9hdG9taWMocGFnZXNbMF0sIEtNX1VTRVIwKTsKKwkJbWVtY3B5KHBhZ2VfYWRkcmVzcyhpb3ZfcGFnZSksIHZhZGRyLCB0cmFuc2ZlcnJlZCk7CisJCWt1bm1hcF9hdG9taWModmFkZHIsIEtNX1VTRVIwKTsKKworCQlpbl9pb3YgPSBwYWdlX2FkZHJlc3MoaW92X3BhZ2UpOworCQlvdXRfaW92ID0gaW5faW92ICsgaW5faW92czsKKworCQlnb3RvIHJldHJ5OworCX0KKworCWVyciA9IC1FSU87CisJaWYgKHRyYW5zZmVycmVkID4gaW5hcmcub3V0X3NpemUpCisJCWdvdG8gb3V0OworCisJZXJyID0gZnVzZV9pb2N0bF9jb3B5X3VzZXIocGFnZXMsIG91dF9pb3YsIG91dF9pb3ZzLCB0cmFuc2ZlcnJlZCwgdHJ1ZSk7Cisgb3V0OgorCWlmIChyZXEpCisJCWZ1c2VfcHV0X3JlcXVlc3QoZmMsIHJlcSk7CisJaWYgKGlvdl9wYWdlKQorCQlfX2ZyZWVfcGFnZShpb3ZfcGFnZSk7CisJd2hpbGUgKG51bV9wYWdlcykKKwkJX19mcmVlX3BhZ2UocGFnZXNbLS1udW1fcGFnZXNdKTsKKwlrZnJlZShwYWdlcyk7CisKKwlyZXR1cm4gZXJyID8gZXJyIDogb3V0YXJnLnJlc3VsdDsKK30KKworc3RhdGljIGxvbmcgZnVzZV9maWxlX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAorCQkJICAgIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXJldHVybiBmdXNlX2ZpbGVfZG9faW9jdGwoZmlsZSwgY21kLCBhcmcsIDApOworfQorCitzdGF0aWMgbG9uZyBmdXNlX2ZpbGVfY29tcGF0X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAorCQkJCSAgIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXJldHVybiBmdXNlX2ZpbGVfZG9faW9jdGwoZmlsZSwgY21kLCBhcmcsIEZVU0VfSU9DVExfQ09NUEFUKTsKK30KKworLyoKKyAqIEFsbCBmaWxlcyB3aGljaCBoYXZlIGJlZW4gcG9sbGVkIGFyZSBsaW5rZWQgdG8gUkIgdHJlZQorICogZnVzZV9jb25uLT5wb2xsZWRfZmlsZXMgd2hpY2ggaXMgaW5kZXhlZCBieSBraC4gIFdhbGsgdGhlIHRyZWUgYW5kCisgKiBmaW5kIHRoZSBtYXRjaGluZyBvbmUuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgcmJfbm9kZSAqKmZ1c2VfZmluZF9wb2xsZWRfbm9kZShzdHJ1Y3QgZnVzZV9jb25uICpmYywgdTY0IGtoLAorCQkJCQkgICAgICBzdHJ1Y3QgcmJfbm9kZSAqKnBhcmVudF9vdXQpCit7CisJc3RydWN0IHJiX25vZGUgKipsaW5rID0gJmZjLT5wb2xsZWRfZmlsZXMucmJfbm9kZTsKKwlzdHJ1Y3QgcmJfbm9kZSAqbGFzdCA9IE5VTEw7CisKKwl3aGlsZSAoKmxpbmspIHsKKwkJc3RydWN0IGZ1c2VfZmlsZSAqZmY7CisKKwkJbGFzdCA9ICpsaW5rOworCQlmZiA9IHJiX2VudHJ5KGxhc3QsIHN0cnVjdCBmdXNlX2ZpbGUsIHBvbGxlZF9ub2RlKTsKKworCQlpZiAoa2ggPCBmZi0+a2gpCisJCQlsaW5rID0gJmxhc3QtPnJiX2xlZnQ7CisJCWVsc2UgaWYgKGtoID4gZmYtPmtoKQorCQkJbGluayA9ICZsYXN0LT5yYl9yaWdodDsKKwkJZWxzZQorCQkJcmV0dXJuIGxpbms7CisJfQorCisJaWYgKHBhcmVudF9vdXQpCisJCSpwYXJlbnRfb3V0ID0gbGFzdDsKKwlyZXR1cm4gbGluazsKK30KKworLyoKKyAqIFRoZSBmaWxlIGlzIGFib3V0IHRvIGJlIHBvbGxlZC4gIE1ha2Ugc3VyZSBpdCdzIG9uIHRoZSBwb2xsZWRfZmlsZXMKKyAqIFJCIHRyZWUuICBOb3RlIHRoYXQgZmlsZXMgb25jZSBhZGRlZCB0byB0aGUgcG9sbGVkX2ZpbGVzIHRyZWUgYXJlCisgKiBub3QgcmVtb3ZlZCBiZWZvcmUgdGhlIGZpbGUgaXMgcmVsZWFzZWQuICBUaGlzIGlzIGJlY2F1c2UgYSBmaWxlCisgKiBwb2xsZWQgb25jZSBpcyBsaWtlbHkgdG8gYmUgcG9sbGVkIGFnYWluLgorICovCitzdGF0aWMgdm9pZCBmdXNlX3JlZ2lzdGVyX3BvbGxlZF9maWxlKHN0cnVjdCBmdXNlX2Nvbm4gKmZjLAorCQkJCSAgICAgIHN0cnVjdCBmdXNlX2ZpbGUgKmZmKQoreworCXNwaW5fbG9jaygmZmMtPmxvY2spOworCWlmIChSQl9FTVBUWV9OT0RFKCZmZi0+cG9sbGVkX25vZGUpKSB7CisJCXN0cnVjdCByYl9ub2RlICoqbGluaywgKnBhcmVudDsKKworCQlsaW5rID0gZnVzZV9maW5kX3BvbGxlZF9ub2RlKGZjLCBmZi0+a2gsICZwYXJlbnQpOworCQlCVUdfT04oKmxpbmspOworCQlyYl9saW5rX25vZGUoJmZmLT5wb2xsZWRfbm9kZSwgcGFyZW50LCBsaW5rKTsKKwkJcmJfaW5zZXJ0X2NvbG9yKCZmZi0+cG9sbGVkX25vZGUsICZmYy0+cG9sbGVkX2ZpbGVzKTsKKwl9CisJc3Bpbl91bmxvY2soJmZjLT5sb2NrKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGZ1c2VfZmlsZV9wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBwb2xsX3RhYmxlICp3YWl0KQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgZnVzZV9maWxlICpmZiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZnVzZV9jb25uICpmYyA9IGdldF9mdXNlX2Nvbm4oaW5vZGUpOworCXN0cnVjdCBmdXNlX3BvbGxfaW4gaW5hcmcgPSB7IC5maCA9IGZmLT5maCwgLmtoID0gZmYtPmtoIH07CisJc3RydWN0IGZ1c2VfcG9sbF9vdXQgb3V0YXJnOworCXN0cnVjdCBmdXNlX3JlcSAqcmVxOworCWludCBlcnI7CisKKwlpZiAoZmMtPm5vX3BvbGwpCisJCXJldHVybiBERUZBVUxUX1BPTExNQVNLOworCisJcG9sbF93YWl0KGZpbGUsICZmZi0+cG9sbF93YWl0LCB3YWl0KTsKKworCS8qCisJICogQXNrIGZvciBub3RpZmljYXRpb24gaWZmIHRoZXJlJ3Mgc29tZW9uZSB3YWl0aW5nIGZvciBpdC4KKwkgKiBUaGUgY2xpZW50IG1heSBpZ25vcmUgdGhlIGZsYWcgYW5kIGFsd2F5cyBub3RpZnkuCisJICovCisJaWYgKHdhaXRxdWV1ZV9hY3RpdmUoJmZmLT5wb2xsX3dhaXQpKSB7CisJCWluYXJnLmZsYWdzIHw9IEZVU0VfUE9MTF9TQ0hFRFVMRV9OT1RJRlk7CisJCWZ1c2VfcmVnaXN0ZXJfcG9sbGVkX2ZpbGUoZmMsIGZmKTsKKwl9CisKKwlyZXEgPSBmdXNlX2dldF9yZXEoZmMpOworCWlmIChJU19FUlIocmVxKSkKKwkJcmV0dXJuIFBUUl9FUlIocmVxKTsKKworCXJlcS0+aW4uaC5vcGNvZGUgPSBGVVNFX1BPTEw7CisJcmVxLT5pbi5oLm5vZGVpZCA9IGdldF9ub2RlX2lkKGlub2RlKTsKKwlyZXEtPmluLm51bWFyZ3MgPSAxOworCXJlcS0+aW4uYXJnc1swXS5zaXplID0gc2l6ZW9mKGluYXJnKTsKKwlyZXEtPmluLmFyZ3NbMF0udmFsdWUgPSAmaW5hcmc7CisJcmVxLT5vdXQubnVtYXJncyA9IDE7CisJcmVxLT5vdXQuYXJnc1swXS5zaXplID0gc2l6ZW9mKG91dGFyZyk7CisJcmVxLT5vdXQuYXJnc1swXS52YWx1ZSA9ICZvdXRhcmc7CisJZnVzZV9yZXF1ZXN0X3NlbmQoZmMsIHJlcSk7CisJZXJyID0gcmVxLT5vdXQuaC5lcnJvcjsKKwlmdXNlX3B1dF9yZXF1ZXN0KGZjLCByZXEpOworCisJaWYgKCFlcnIpCisJCXJldHVybiBvdXRhcmcucmV2ZW50czsKKwlpZiAoZXJyID09IC1FTk9TWVMpIHsKKwkJZmMtPm5vX3BvbGwgPSAxOworCQlyZXR1cm4gREVGQVVMVF9QT0xMTUFTSzsKKwl9CisJcmV0dXJuIFBPTExFUlI7Cit9CisKKy8qCisgKiBUaGlzIGlzIGNhbGxlZCBmcm9tIGZ1c2VfaGFuZGxlX25vdGlmeSgpIG9uIEZVU0VfTk9USUZZX1BPTEwgYW5kCisgKiB3YWtlcyB1cCB0aGUgcG9sbCB3YWl0ZXJzLgorICovCitpbnQgZnVzZV9ub3RpZnlfcG9sbF93YWtldXAoc3RydWN0IGZ1c2VfY29ubiAqZmMsCisJCQkgICAgc3RydWN0IGZ1c2Vfbm90aWZ5X3BvbGxfd2FrZXVwX291dCAqb3V0YXJnKQoreworCXU2NCBraCA9IG91dGFyZy0+a2g7CisJc3RydWN0IHJiX25vZGUgKipsaW5rOworCisJc3Bpbl9sb2NrKCZmYy0+bG9jayk7CisKKwlsaW5rID0gZnVzZV9maW5kX3BvbGxlZF9ub2RlKGZjLCBraCwgTlVMTCk7CisJaWYgKCpsaW5rKSB7CisJCXN0cnVjdCBmdXNlX2ZpbGUgKmZmOworCisJCWZmID0gcmJfZW50cnkoKmxpbmssIHN0cnVjdCBmdXNlX2ZpbGUsIHBvbGxlZF9ub2RlKTsKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlX3N5bmMoJmZmLT5wb2xsX3dhaXQpOworCX0KKworCXNwaW5fdW5sb2NrKCZmYy0+bG9jayk7CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGZ1c2VfZmlsZV9vcGVyYXRpb25zID0gewogCS5sbHNlZWsJCT0gZnVzZV9maWxlX2xsc2VlaywKIAkucmVhZAkJPSBkb19zeW5jX3JlYWQsCkBAIC0xNDg0LDYgKzE4OTcsOSBAQAogCS5sb2NrCQk9IGZ1c2VfZmlsZV9sb2NrLAogCS5mbG9jawkJPSBmdXNlX2ZpbGVfZmxvY2ssCiAJLnNwbGljZV9yZWFkCT0gZ2VuZXJpY19maWxlX3NwbGljZV9yZWFkLAorCS51bmxvY2tlZF9pb2N0bAk9IGZ1c2VfZmlsZV9pb2N0bCwKKwkuY29tcGF0X2lvY3RsCT0gZnVzZV9maWxlX2NvbXBhdF9pb2N0bCwKKwkucG9sbAkJPSBmdXNlX2ZpbGVfcG9sbCwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGZ1c2VfZGlyZWN0X2lvX2ZpbGVfb3BlcmF0aW9ucyA9IHsKQEAgLTE0OTYsNiArMTkxMiw5IEBACiAJLmZzeW5jCQk9IGZ1c2VfZnN5bmMsCiAJLmxvY2sJCT0gZnVzZV9maWxlX2xvY2ssCiAJLmZsb2NrCQk9IGZ1c2VfZmlsZV9mbG9jaywKKwkudW5sb2NrZWRfaW9jdGwJPSBmdXNlX2ZpbGVfaW9jdGwsCisJLmNvbXBhdF9pb2N0bAk9IGZ1c2VfZmlsZV9jb21wYXRfaW9jdGwsCisJLnBvbGwJCT0gZnVzZV9maWxlX3BvbGwsCiAJLyogbm8gbW1hcCBhbmQgc3BsaWNlX3JlYWQgKi8KIH07CiAKZGlmZiAtLWdpdCBhL2ZzL2Z1c2UvZnVzZV9pLmggYi9mcy9mdXNlL2Z1c2VfaS5oCmluZGV4IDM1YWNjZmQuLjVlNjRiODEgMTAwNjQ0Ci0tLSBhL2ZzL2Z1c2UvZnVzZV9pLmgKKysrIGIvZnMvZnVzZS9mdXNlX2kuaApAQCAtMSw2ICsxLDYgQEAKIC8qCiAgIEZVU0U6IEZpbGVzeXN0ZW0gaW4gVXNlcnNwYWNlCi0gIENvcHlyaWdodCAoQykgMjAwMS0yMDA2ICBNaWtsb3MgU3plcmVkaSA8bWlrbG9zQHN6ZXJlZGkuaHU+CisgIENvcHlyaWdodCAoQykgMjAwMS0yMDA4ICBNaWtsb3MgU3plcmVkaSA8bWlrbG9zQHN6ZXJlZGkuaHU+CiAKICAgVGhpcyBwcm9ncmFtIGNhbiBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEwuCiAgIFNlZSB0aGUgZmlsZSBDT1BZSU5HLgpAQCAtMTksNiArMTksOCBAQAogI2luY2x1ZGUgPGxpbnV4L2JhY2tpbmctZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC9yd3NlbS5oPgorI2luY2x1ZGUgPGxpbnV4L3JidHJlZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KIAogLyoqIE1heCBudW1iZXIgb2YgcGFnZXMgdGhhdCBjYW4gYmUgdXNlZCBpbiBhIHNpbmdsZSByZWFkIHJlcXVlc3QgKi8KICNkZWZpbmUgRlVTRV9NQVhfUEFHRVNfUEVSX1JFUSAzMgpAQCAtMTAwLDYgKzEwMiw5IEBACiAJLyoqIFJlcXVlc3QgcmVzZXJ2ZWQgZm9yIGZsdXNoIGFuZCByZWxlYXNlICovCiAJc3RydWN0IGZ1c2VfcmVxICpyZXNlcnZlZF9yZXE7CiAKKwkvKiogS2VybmVsIGZpbGUgaGFuZGxlIGd1YXJhbnRlZWQgdG8gYmUgdW5pcXVlICovCisJdTY0IGtoOworCiAJLyoqIEZpbGUgaGFuZGxlIHVzZWQgYnkgdXNlcnNwYWNlICovCiAJdTY0IGZoOwogCkBAIC0xMDgsNiArMTEzLDEyIEBACiAKIAkvKiogRW50cnkgb24gaW5vZGUncyB3cml0ZV9maWxlcyBsaXN0ICovCiAJc3RydWN0IGxpc3RfaGVhZCB3cml0ZV9lbnRyeTsKKworCS8qKiBSQiBub2RlIHRvIGJlIGxpbmtlZCBvbiBmdXNlX2Nvbm4tPnBvbGxlZF9maWxlcyAqLworCXN0cnVjdCByYl9ub2RlIHBvbGxlZF9ub2RlOworCisJLyoqIFdhaXQgcXVldWUgaGVhZCBmb3IgcG9sbCAqLworCXdhaXRfcXVldWVfaGVhZF90IHBvbGxfd2FpdDsKIH07CiAKIC8qKiBPbmUgaW5wdXQgYXJndW1lbnQgb2YgYSByZXF1ZXN0ICovCkBAIC0zMjIsNiArMzMzLDEyIEBACiAJLyoqIFRoZSBsaXN0IG9mIHJlcXVlc3RzIHVuZGVyIEkvTyAqLwogCXN0cnVjdCBsaXN0X2hlYWQgaW87CiAKKwkvKiogVGhlIG5leHQgdW5pcXVlIGtlcm5lbCBmaWxlIGhhbmRsZSAqLworCXU2NCBraGN0cjsKKworCS8qKiByYnRyZWUgb2YgZnVzZV9maWxlcyB3YWl0aW5nIGZvciBwb2xsIGV2ZW50cyBpbmRleGVkIGJ5IHBoICovCisJc3RydWN0IHJiX3Jvb3QgcG9sbGVkX2ZpbGVzOworCiAJLyoqIE51bWJlciBvZiByZXF1ZXN0cyBjdXJyZW50bHkgaW4gdGhlIGJhY2tncm91bmQgKi8KIAl1bnNpZ25lZCBudW1fYmFja2dyb3VuZDsKIApAQCAtMzU1LDE5ICszNzIsMTkgQEAKIAkvKiogQ29ubmVjdGlvbiBmYWlsZWQgKHZlcnNpb24gbWlzbWF0Y2gpLiAgQ2Fubm90IHJhY2Ugd2l0aAogCSAgICBzZXR0aW5nIG90aGVyIGJpdGZpZWxkcyBzaW5jZSBpdCBpcyBvbmx5IHNldCBvbmNlIGluIElOSVQKIAkgICAgcmVwbHksIGJlZm9yZSBhbnkgb3RoZXIgcmVxdWVzdCwgYW5kIG5ldmVyIGNsZWFyZWQgKi8KLQl1bnNpZ25lZCBjb25uX2Vycm9yIDogMTsKKwl1bnNpZ25lZCBjb25uX2Vycm9yOjE7CiAKIAkvKiogQ29ubmVjdGlvbiBzdWNjZXNzZnVsLiAgT25seSBzZXQgaW4gSU5JVCAqLwotCXVuc2lnbmVkIGNvbm5faW5pdCA6IDE7CisJdW5zaWduZWQgY29ubl9pbml0OjE7CiAKIAkvKiogRG8gcmVhZHBhZ2VzIGFzeW5jaHJvbm91c2x5PyAgT25seSBzZXQgaW4gSU5JVCAqLwotCXVuc2lnbmVkIGFzeW5jX3JlYWQgOiAxOworCXVuc2lnbmVkIGFzeW5jX3JlYWQ6MTsKIAogCS8qKiBEbyBub3Qgc2VuZCBzZXBhcmF0ZSBTRVRBVFRSIHJlcXVlc3QgYmVmb3JlIG9wZW4oT19UUlVOQykgICovCi0JdW5zaWduZWQgYXRvbWljX29fdHJ1bmMgOiAxOworCXVuc2lnbmVkIGF0b21pY19vX3RydW5jOjE7CiAKIAkvKiogRmlsZXN5c3RlbSBzdXBwb3J0cyBORlMgZXhwb3J0aW5nLiAgT25seSBzZXQgaW4gSU5JVCAqLwotCXVuc2lnbmVkIGV4cG9ydF9zdXBwb3J0IDogMTsKKwl1bnNpZ25lZCBleHBvcnRfc3VwcG9ydDoxOwogCiAJLyoKIAkgKiBUaGUgZm9sbG93aW5nIGJpdGZpZWxkcyBhcmUgb25seSBmb3Igb3B0aW1pemF0aW9uIHB1cnBvc2VzCkBAIC0zNzUsNDMgKzM5Miw0NiBAQAogCSAqLwogCiAJLyoqIElzIGZzeW5jIG5vdCBpbXBsZW1lbnRlZCBieSBmcz8gKi8KLQl1bnNpZ25lZCBub19mc3luYyA6IDE7CisJdW5zaWduZWQgbm9fZnN5bmM6MTsKIAogCS8qKiBJcyBmc3luY2RpciBub3QgaW1wbGVtZW50ZWQgYnkgZnM/ICovCi0JdW5zaWduZWQgbm9fZnN5bmNkaXIgOiAxOworCXVuc2lnbmVkIG5vX2ZzeW5jZGlyOjE7CiAKIAkvKiogSXMgZmx1c2ggbm90IGltcGxlbWVudGVkIGJ5IGZzPyAqLwotCXVuc2lnbmVkIG5vX2ZsdXNoIDogMTsKKwl1bnNpZ25lZCBub19mbHVzaDoxOwogCiAJLyoqIElzIHNldHhhdHRyIG5vdCBpbXBsZW1lbnRlZCBieSBmcz8gKi8KLQl1bnNpZ25lZCBub19zZXR4YXR0ciA6IDE7CisJdW5zaWduZWQgbm9fc2V0eGF0dHI6MTsKIAogCS8qKiBJcyBnZXR4YXR0ciBub3QgaW1wbGVtZW50ZWQgYnkgZnM/ICovCi0JdW5zaWduZWQgbm9fZ2V0eGF0dHIgOiAxOworCXVuc2lnbmVkIG5vX2dldHhhdHRyOjE7CiAKIAkvKiogSXMgbGlzdHhhdHRyIG5vdCBpbXBsZW1lbnRlZCBieSBmcz8gKi8KLQl1bnNpZ25lZCBub19saXN0eGF0dHIgOiAxOworCXVuc2lnbmVkIG5vX2xpc3R4YXR0cjoxOwogCiAJLyoqIElzIHJlbW92ZXhhdHRyIG5vdCBpbXBsZW1lbnRlZCBieSBmcz8gKi8KLQl1bnNpZ25lZCBub19yZW1vdmV4YXR0ciA6IDE7CisJdW5zaWduZWQgbm9fcmVtb3ZleGF0dHI6MTsKIAogCS8qKiBBcmUgZmlsZSBsb2NraW5nIHByaW1pdGl2ZXMgbm90IGltcGxlbWVudGVkIGJ5IGZzPyAqLwotCXVuc2lnbmVkIG5vX2xvY2sgOiAxOworCXVuc2lnbmVkIG5vX2xvY2s6MTsKIAogCS8qKiBJcyBhY2Nlc3Mgbm90IGltcGxlbWVudGVkIGJ5IGZzPyAqLwotCXVuc2lnbmVkIG5vX2FjY2VzcyA6IDE7CisJdW5zaWduZWQgbm9fYWNjZXNzOjE7CiAKIAkvKiogSXMgY3JlYXRlIG5vdCBpbXBsZW1lbnRlZCBieSBmcz8gKi8KLQl1bnNpZ25lZCBub19jcmVhdGUgOiAxOworCXVuc2lnbmVkIG5vX2NyZWF0ZToxOwogCiAJLyoqIElzIGludGVycnVwdCBub3QgaW1wbGVtZW50ZWQgYnkgZnM/ICovCi0JdW5zaWduZWQgbm9faW50ZXJydXB0IDogMTsKKwl1bnNpZ25lZCBub19pbnRlcnJ1cHQ6MTsKIAogCS8qKiBJcyBibWFwIG5vdCBpbXBsZW1lbnRlZCBieSBmcz8gKi8KLQl1bnNpZ25lZCBub19ibWFwIDogMTsKKwl1bnNpZ25lZCBub19ibWFwOjE7CisKKwkvKiogSXMgcG9sbCBub3QgaW1wbGVtZW50ZWQgYnkgZnM/ICovCisJdW5zaWduZWQgbm9fcG9sbDoxOwogCiAJLyoqIERvIG11bHRpLXBhZ2UgY2FjaGVkIHdyaXRlcyAqLwotCXVuc2lnbmVkIGJpZ193cml0ZXMgOiAxOworCXVuc2lnbmVkIGJpZ193cml0ZXM6MTsKIAogCS8qKiBUaGUgbnVtYmVyIG9mIHJlcXVlc3RzIHdhaXRpbmcgZm9yIGNvbXBsZXRpb24gKi8KIAlhdG9taWNfdCBudW1fd2FpdGluZzsKQEAgLTQ0NSw2ICs0NjUsOSBAQAogCiAJLyoqIFZlcnNpb24gY291bnRlciBmb3IgYXR0cmlidXRlIGNoYW5nZXMgKi8KIAl1NjQgYXR0cl92ZXJzaW9uOworCisJLyoqIENhbGxlZCBvbiBmaW5hbCBwdXQgKi8KKwl2b2lkICgqcmVsZWFzZSkoc3RydWN0IGZ1c2VfY29ubiAqKTsKIH07CiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IGZ1c2VfY29ubiAqZ2V0X2Z1c2VfY29ubl9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQpAQCAtNDk5LDcgKzUyMiw3IEBACiAgKi8KIGludCBmdXNlX29wZW5fY29tbW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLCBpbnQgaXNkaXIpOwogCi1zdHJ1Y3QgZnVzZV9maWxlICpmdXNlX2ZpbGVfYWxsb2Modm9pZCk7CitzdHJ1Y3QgZnVzZV9maWxlICpmdXNlX2ZpbGVfYWxsb2Moc3RydWN0IGZ1c2VfY29ubiAqZmMpOwogdm9pZCBmdXNlX2ZpbGVfZnJlZShzdHJ1Y3QgZnVzZV9maWxlICpmZik7CiB2b2lkIGZ1c2VfZmluaXNoX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCiAJCSAgICAgIHN0cnVjdCBmdXNlX2ZpbGUgKmZmLCBzdHJ1Y3QgZnVzZV9vcGVuX291dCAqb3V0YXJnKTsKQEAgLTUxOSw2ICs1NDIsMTIgQEAKIAkJICAgICAgaW50IGlzZGlyKTsKIAogLyoqCisgKiBOb3RpZnkgcG9sbCB3YWtldXAKKyAqLworaW50IGZ1c2Vfbm90aWZ5X3BvbGxfd2FrZXVwKHN0cnVjdCBmdXNlX2Nvbm4gKmZjLAorCQkJICAgIHN0cnVjdCBmdXNlX25vdGlmeV9wb2xsX3dha2V1cF9vdXQgKm91dGFyZyk7CisKKy8qKgogICogSW5pdGlhbGl6ZSBmaWxlIG9wZXJhdGlvbnMgb24gYSByZWd1bGFyIGZpbGUKICAqLwogdm9pZCBmdXNlX2luaXRfZmlsZV9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKQEAgLTU5MywxOSArNjIyLDIwIEBACiAvKioKICAqIFNlbmQgYSByZXF1ZXN0IChzeW5jaHJvbm91cykKICAqLwotdm9pZCByZXF1ZXN0X3NlbmQoc3RydWN0IGZ1c2VfY29ubiAqZmMsIHN0cnVjdCBmdXNlX3JlcSAqcmVxKTsKK3ZvaWQgZnVzZV9yZXF1ZXN0X3NlbmQoc3RydWN0IGZ1c2VfY29ubiAqZmMsIHN0cnVjdCBmdXNlX3JlcSAqcmVxKTsKIAogLyoqCiAgKiBTZW5kIGEgcmVxdWVzdCB3aXRoIG5vIHJlcGx5CiAgKi8KLXZvaWQgcmVxdWVzdF9zZW5kX25vcmVwbHkoc3RydWN0IGZ1c2VfY29ubiAqZmMsIHN0cnVjdCBmdXNlX3JlcSAqcmVxKTsKK3ZvaWQgZnVzZV9yZXF1ZXN0X3NlbmRfbm9yZXBseShzdHJ1Y3QgZnVzZV9jb25uICpmYywgc3RydWN0IGZ1c2VfcmVxICpyZXEpOwogCiAvKioKICAqIFNlbmQgYSByZXF1ZXN0IGluIHRoZSBiYWNrZ3JvdW5kCiAgKi8KLXZvaWQgcmVxdWVzdF9zZW5kX2JhY2tncm91bmQoc3RydWN0IGZ1c2VfY29ubiAqZmMsIHN0cnVjdCBmdXNlX3JlcSAqcmVxKTsKK3ZvaWQgZnVzZV9yZXF1ZXN0X3NlbmRfYmFja2dyb3VuZChzdHJ1Y3QgZnVzZV9jb25uICpmYywgc3RydWN0IGZ1c2VfcmVxICpyZXEpOwogCi12b2lkIHJlcXVlc3Rfc2VuZF9iYWNrZ3JvdW5kX2xvY2tlZChzdHJ1Y3QgZnVzZV9jb25uICpmYywgc3RydWN0IGZ1c2VfcmVxICpyZXEpOwordm9pZCBmdXNlX3JlcXVlc3Rfc2VuZF9iYWNrZ3JvdW5kX2xvY2tlZChzdHJ1Y3QgZnVzZV9jb25uICpmYywKKwkJCQkJIHN0cnVjdCBmdXNlX3JlcSAqcmVxKTsKIAogLyogQWJvcnQgYWxsIHJlcXVlc3RzICovCiB2b2lkIGZ1c2VfYWJvcnRfY29ubihzdHJ1Y3QgZnVzZV9jb25uICpmYyk7CkBAIC02MjMsNiArNjUzLDExIEBACiBzdHJ1Y3QgZnVzZV9jb25uICpmdXNlX2Nvbm5fZ2V0KHN0cnVjdCBmdXNlX2Nvbm4gKmZjKTsKIAogLyoqCisgKiBJbml0aWFsaXplIGZ1c2VfY29ubgorICovCitpbnQgZnVzZV9jb25uX2luaXQoc3RydWN0IGZ1c2VfY29ubiAqZmMsIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpOworCisvKioKICAqIFJlbGVhc2UgcmVmZXJlbmNlIHRvIGZ1c2VfY29ubgogICovCiB2b2lkIGZ1c2VfY29ubl9wdXQoc3RydWN0IGZ1c2VfY29ubiAqZmMpOwpkaWZmIC0tZ2l0IGEvZnMvZnVzZS9pbm9kZS5jIGIvZnMvZnVzZS9pbm9kZS5jCmluZGV4IDJlOTlmMzQuLjQ3Yzk2ZmQgMTAwNjQ0Ci0tLSBhL2ZzL2Z1c2UvaW5vZGUuYworKysgYi9mcy9mdXNlL2lub2RlLmMKQEAgLTEsNiArMSw2IEBACiAvKgogICBGVVNFOiBGaWxlc3lzdGVtIGluIFVzZXJzcGFjZQotICBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNiAgTWlrbG9zIFN6ZXJlZGkgPG1pa2xvc0BzemVyZWRpLmh1PgorICBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOCAgTWlrbG9zIFN6ZXJlZGkgPG1pa2xvc0BzemVyZWRpLmh1PgogCiAgIFRoaXMgcHJvZ3JhbSBjYW4gYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMLgogICBTZWUgdGhlIGZpbGUgQ09QWUlORy4KQEAgLTM3LDEwICszNywxMCBAQAogCXVuc2lnbmVkIHJvb3Rtb2RlOwogCXVuc2lnbmVkIHVzZXJfaWQ7CiAJdW5zaWduZWQgZ3JvdXBfaWQ7Ci0JdW5zaWduZWQgZmRfcHJlc2VudCA6IDE7Ci0JdW5zaWduZWQgcm9vdG1vZGVfcHJlc2VudCA6IDE7Ci0JdW5zaWduZWQgdXNlcl9pZF9wcmVzZW50IDogMTsKLQl1bnNpZ25lZCBncm91cF9pZF9wcmVzZW50IDogMTsKKwl1bnNpZ25lZCBmZF9wcmVzZW50OjE7CisJdW5zaWduZWQgcm9vdG1vZGVfcHJlc2VudDoxOworCXVuc2lnbmVkIHVzZXJfaWRfcHJlc2VudDoxOworCXVuc2lnbmVkIGdyb3VwX2lkX3ByZXNlbnQ6MTsKIAl1bnNpZ25lZCBmbGFnczsKIAl1bnNpZ25lZCBtYXhfcmVhZDsKIAl1bnNpZ25lZCBibGtzaXplOwpAQCAtOTQsNyArOTQsNyBAQAogCXJlcS0+aW4ubnVtYXJncyA9IDE7CiAJcmVxLT5pbi5hcmdzWzBdLnNpemUgPSBzaXplb2Yoc3RydWN0IGZ1c2VfZm9yZ2V0X2luKTsKIAlyZXEtPmluLmFyZ3NbMF0udmFsdWUgPSBpbmFyZzsKLQlyZXF1ZXN0X3NlbmRfbm9yZXBseShmYywgcmVxKTsKKwlmdXNlX3JlcXVlc3Rfc2VuZF9ub3JlcGx5KGZjLCByZXEpOwogfQogCiBzdGF0aWMgdm9pZCBmdXNlX2NsZWFyX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCkBAIC0yNTAsNyArMjUwLDcgQEAKIAogCWZpID0gZ2V0X2Z1c2VfaW5vZGUoaW5vZGUpOwogCXNwaW5fbG9jaygmZmMtPmxvY2spOwotCWZpLT5ubG9va3VwICsrOworCWZpLT5ubG9va3VwKys7CiAJc3Bpbl91bmxvY2soJmZjLT5sb2NrKTsKIAlmdXNlX2NoYW5nZV9hdHRyaWJ1dGVzKGlub2RlLCBhdHRyLCBhdHRyX3ZhbGlkLCBhdHRyX3ZlcnNpb24pOwogCkBAIC0yNjksNyArMjY5LDcgQEAKIAkJZmMtPmRlc3Ryb3lfcmVxID0gTlVMTDsKIAkJcmVxLT5pbi5oLm9wY29kZSA9IEZVU0VfREVTVFJPWTsKIAkJcmVxLT5mb3JjZSA9IDE7Ci0JCXJlcXVlc3Rfc2VuZChmYywgcmVxKTsKKwkJZnVzZV9yZXF1ZXN0X3NlbmQoZmMsIHJlcSk7CiAJCWZ1c2VfcHV0X3JlcXVlc3QoZmMsIHJlcSk7CiAJfQogfQpAQCAtMzM0LDcgKzMzNCw3IEBACiAJcmVxLT5vdXQuYXJnc1swXS5zaXplID0KIAkJZmMtPm1pbm9yIDwgNCA/IEZVU0VfQ09NUEFUX1NUQVRGU19TSVpFIDogc2l6ZW9mKG91dGFyZyk7CiAJcmVxLT5vdXQuYXJnc1swXS52YWx1ZSA9ICZvdXRhcmc7Ci0JcmVxdWVzdF9zZW5kKGZjLCByZXEpOworCWZ1c2VfcmVxdWVzdF9zZW5kKGZjLCByZXEpOwogCWVyciA9IHJlcS0+b3V0LmguZXJyb3I7CiAJaWYgKCFlcnIpCiAJCWNvbnZlcnRfZnVzZV9zdGF0ZnMoYnVmLCAmb3V0YXJnLnN0KTsKQEAgLTQ2Miw2OCArNDYyLDY5IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZnVzZV9jb25uICpuZXdfY29ubihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoraW50IGZ1c2VfY29ubl9pbml0KHN0cnVjdCBmdXNlX2Nvbm4gKmZjLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQogewotCXN0cnVjdCBmdXNlX2Nvbm4gKmZjOwogCWludCBlcnI7CiAKLQlmYyA9IGt6YWxsb2Moc2l6ZW9mKCpmYyksIEdGUF9LRVJORUwpOwotCWlmIChmYykgewotCQlzcGluX2xvY2tfaW5pdCgmZmMtPmxvY2spOwotCQltdXRleF9pbml0KCZmYy0+aW5zdF9tdXRleCk7Ci0JCWF0b21pY19zZXQoJmZjLT5jb3VudCwgMSk7Ci0JCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmZjLT53YWl0cSk7Ci0JCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmZjLT5ibG9ja2VkX3dhaXRxKTsKLQkJaW5pdF93YWl0cXVldWVfaGVhZCgmZmMtPnJlc2VydmVkX3JlcV93YWl0cSk7Ci0JCUlOSVRfTElTVF9IRUFEKCZmYy0+cGVuZGluZyk7Ci0JCUlOSVRfTElTVF9IRUFEKCZmYy0+cHJvY2Vzc2luZyk7Ci0JCUlOSVRfTElTVF9IRUFEKCZmYy0+aW8pOwotCQlJTklUX0xJU1RfSEVBRCgmZmMtPmludGVycnVwdHMpOwotCQlJTklUX0xJU1RfSEVBRCgmZmMtPmJnX3F1ZXVlKTsKLQkJYXRvbWljX3NldCgmZmMtPm51bV93YWl0aW5nLCAwKTsKLQkJZmMtPmJkaS5yYV9wYWdlcyA9IChWTV9NQVhfUkVBREFIRUFEICogMTAyNCkgLyBQQUdFX0NBQ0hFX1NJWkU7Ci0JCWZjLT5iZGkudW5wbHVnX2lvX2ZuID0gZGVmYXVsdF91bnBsdWdfaW9fZm47Ci0JCS8qIGZ1c2UgZG9lcyBpdCdzIG93biB3cml0ZWJhY2sgYWNjb3VudGluZyAqLwotCQlmYy0+YmRpLmNhcGFiaWxpdGllcyA9IEJESV9DQVBfTk9fQUNDVF9XQjsKLQkJZmMtPmRldiA9IHNiLT5zX2RldjsKLQkJZXJyID0gYmRpX2luaXQoJmZjLT5iZGkpOwotCQlpZiAoZXJyKQotCQkJZ290byBlcnJvcl9rZnJlZTsKLQkJaWYgKHNiLT5zX2JkZXYpIHsKLQkJCWVyciA9IGJkaV9yZWdpc3RlcigmZmMtPmJkaSwgTlVMTCwgIiV1OiV1LWZ1c2VibGsiLAotCQkJCQkgICBNQUpPUihmYy0+ZGV2KSwgTUlOT1IoZmMtPmRldikpOwotCQl9IGVsc2UgewotCQkJZXJyID0gYmRpX3JlZ2lzdGVyX2RldigmZmMtPmJkaSwgZmMtPmRldik7Ci0JCX0KLQkJaWYgKGVycikKLQkJCWdvdG8gZXJyb3JfYmRpX2Rlc3Ryb3k7Ci0JCS8qCi0JCSAqIEZvciBhIHNpbmdsZSBmdXNlIGZpbGVzeXN0ZW0gdXNlIG1heCAxJSBvZiBkaXJ0eSArCi0JCSAqIHdyaXRlYmFjayB0aHJlc2hvbGQuCi0JCSAqCi0JCSAqIFRoaXMgZ2l2ZXMgYWJvdXQgMU0gb2Ygd3JpdGUgYnVmZmVyIGZvciBtZW1vcnkgbWFwcyBvbiBhCi0JCSAqIG1hY2hpbmUgd2l0aCAxRyBhbmQgMTAlIGRpcnR5X3JhdGlvLCB3aGljaCBzaG91bGQgYmUgbW9yZQotCQkgKiB0aGFuIGVub3VnaC4KLQkJICoKLQkJICogUHJpdmlsZWdlZCB1c2VycyBjYW4gcmFpc2UgaXQgYnkgd3JpdGluZyB0bwotCQkgKgotCQkgKiAgICAvc3lzL2NsYXNzL2JkaS88YmRpPi9tYXhfcmF0aW8KLQkJICovCi0JCWJkaV9zZXRfbWF4X3JhdGlvKCZmYy0+YmRpLCAxKTsKLQkJZmMtPnJlcWN0ciA9IDA7Ci0JCWZjLT5ibG9ja2VkID0gMTsKLQkJZmMtPmF0dHJfdmVyc2lvbiA9IDE7Ci0JCWdldF9yYW5kb21fYnl0ZXMoJmZjLT5zY3JhbWJsZV9rZXksIHNpemVvZihmYy0+c2NyYW1ibGVfa2V5KSk7CisJbWVtc2V0KGZjLCAwLCBzaXplb2YoKmZjKSk7CisJc3Bpbl9sb2NrX2luaXQoJmZjLT5sb2NrKTsKKwltdXRleF9pbml0KCZmYy0+aW5zdF9tdXRleCk7CisJYXRvbWljX3NldCgmZmMtPmNvdW50LCAxKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZmYy0+d2FpdHEpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmZjLT5ibG9ja2VkX3dhaXRxKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZmYy0+cmVzZXJ2ZWRfcmVxX3dhaXRxKTsKKwlJTklUX0xJU1RfSEVBRCgmZmMtPnBlbmRpbmcpOworCUlOSVRfTElTVF9IRUFEKCZmYy0+cHJvY2Vzc2luZyk7CisJSU5JVF9MSVNUX0hFQUQoJmZjLT5pbyk7CisJSU5JVF9MSVNUX0hFQUQoJmZjLT5pbnRlcnJ1cHRzKTsKKwlJTklUX0xJU1RfSEVBRCgmZmMtPmJnX3F1ZXVlKTsKKwlJTklUX0xJU1RfSEVBRCgmZmMtPmVudHJ5KTsKKwlhdG9taWNfc2V0KCZmYy0+bnVtX3dhaXRpbmcsIDApOworCWZjLT5iZGkucmFfcGFnZXMgPSAoVk1fTUFYX1JFQURBSEVBRCAqIDEwMjQpIC8gUEFHRV9DQUNIRV9TSVpFOworCWZjLT5iZGkudW5wbHVnX2lvX2ZuID0gZGVmYXVsdF91bnBsdWdfaW9fZm47CisJLyogZnVzZSBkb2VzIGl0J3Mgb3duIHdyaXRlYmFjayBhY2NvdW50aW5nICovCisJZmMtPmJkaS5jYXBhYmlsaXRpZXMgPSBCRElfQ0FQX05PX0FDQ1RfV0I7CisJZmMtPmtoY3RyID0gMDsKKwlmYy0+cG9sbGVkX2ZpbGVzID0gUkJfUk9PVDsKKwlmYy0+ZGV2ID0gc2ItPnNfZGV2OworCWVyciA9IGJkaV9pbml0KCZmYy0+YmRpKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycm9yX211dGV4X2Rlc3Ryb3k7CisJaWYgKHNiLT5zX2JkZXYpIHsKKwkJZXJyID0gYmRpX3JlZ2lzdGVyKCZmYy0+YmRpLCBOVUxMLCAiJXU6JXUtZnVzZWJsayIsCisJCQkJICAgTUFKT1IoZmMtPmRldiksIE1JTk9SKGZjLT5kZXYpKTsKKwl9IGVsc2UgeworCQllcnIgPSBiZGlfcmVnaXN0ZXJfZGV2KCZmYy0+YmRpLCBmYy0+ZGV2KTsKIAl9Ci0JcmV0dXJuIGZjOworCWlmIChlcnIpCisJCWdvdG8gZXJyb3JfYmRpX2Rlc3Ryb3k7CisJLyoKKwkgKiBGb3IgYSBzaW5nbGUgZnVzZSBmaWxlc3lzdGVtIHVzZSBtYXggMSUgb2YgZGlydHkgKworCSAqIHdyaXRlYmFjayB0aHJlc2hvbGQuCisJICoKKwkgKiBUaGlzIGdpdmVzIGFib3V0IDFNIG9mIHdyaXRlIGJ1ZmZlciBmb3IgbWVtb3J5IG1hcHMgb24gYQorCSAqIG1hY2hpbmUgd2l0aCAxRyBhbmQgMTAlIGRpcnR5X3JhdGlvLCB3aGljaCBzaG91bGQgYmUgbW9yZQorCSAqIHRoYW4gZW5vdWdoLgorCSAqCisJICogUHJpdmlsZWdlZCB1c2VycyBjYW4gcmFpc2UgaXQgYnkgd3JpdGluZyB0bworCSAqCisJICogICAgL3N5cy9jbGFzcy9iZGkvPGJkaT4vbWF4X3JhdGlvCisJICovCisJYmRpX3NldF9tYXhfcmF0aW8oJmZjLT5iZGksIDEpOworCWZjLT5yZXFjdHIgPSAwOworCWZjLT5ibG9ja2VkID0gMTsKKwlmYy0+YXR0cl92ZXJzaW9uID0gMTsKKwlnZXRfcmFuZG9tX2J5dGVzKCZmYy0+c2NyYW1ibGVfa2V5LCBzaXplb2YoZmMtPnNjcmFtYmxlX2tleSkpOwogCi1lcnJvcl9iZGlfZGVzdHJveToKKwlyZXR1cm4gMDsKKworIGVycm9yX2JkaV9kZXN0cm95OgogCWJkaV9kZXN0cm95KCZmYy0+YmRpKTsKLWVycm9yX2tmcmVlOgorIGVycm9yX211dGV4X2Rlc3Ryb3k6CiAJbXV0ZXhfZGVzdHJveSgmZmMtPmluc3RfbXV0ZXgpOwotCWtmcmVlKGZjKTsKLQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gZXJyOwogfQorRVhQT1JUX1NZTUJPTF9HUEwoZnVzZV9jb25uX2luaXQpOwogCiB2b2lkIGZ1c2VfY29ubl9wdXQoc3RydWN0IGZ1c2VfY29ubiAqZmMpCiB7CkBAIC01MzIsNyArNTMzLDcgQEAKIAkJCWZ1c2VfcmVxdWVzdF9mcmVlKGZjLT5kZXN0cm95X3JlcSk7CiAJCW11dGV4X2Rlc3Ryb3koJmZjLT5pbnN0X211dGV4KTsKIAkJYmRpX2Rlc3Ryb3koJmZjLT5iZGkpOwotCQlrZnJlZShmYyk7CisJCWZjLT5yZWxlYXNlKGZjKTsKIAl9CiB9CiAKQEAgLTU0Miw3ICs1NDMsNyBAQAogCXJldHVybiBmYzsKIH0KIAotc3RhdGljIHN0cnVjdCBpbm9kZSAqZ2V0X3Jvb3RfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdW5zaWduZWQgbW9kZSkKK3N0YXRpYyBzdHJ1Y3QgaW5vZGUgKmZ1c2VfZ2V0X3Jvb3RfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdW5zaWduZWQgbW9kZSkKIHsKIAlzdHJ1Y3QgZnVzZV9hdHRyIGF0dHI7CiAJbWVtc2V0KCZhdHRyLCAwLCBzaXplb2YoYXR0cikpOwpAQCAtNTUzLDggKzU1NCw3IEBACiAJcmV0dXJuIGZ1c2VfaWdldChzYiwgMSwgMCwgJmF0dHIsIDAsIDApOwogfQogCi1zdHJ1Y3QgZnVzZV9pbm9kZV9oYW5kbGUKLXsKK3N0cnVjdCBmdXNlX2lub2RlX2hhbmRsZSB7CiAJdTY0IG5vZGVpZDsKIAl1MzIgZ2VuZXJhdGlvbjsKIH07CkBAIC03NjEsNyArNzYxLDYgQEAKIAkJZmMtPm1heF93cml0ZSA9IG1heF90KHVuc2lnbmVkLCA0MDk2LCBmYy0+bWF4X3dyaXRlKTsKIAkJZmMtPmNvbm5faW5pdCA9IDE7CiAJfQotCWZ1c2VfcHV0X3JlcXVlc3QoZmMsIHJlcSk7CiAJZmMtPmJsb2NrZWQgPSAwOwogCXdha2VfdXBfYWxsKCZmYy0+YmxvY2tlZF93YWl0cSk7CiB9CkBAIC03ODcsNyArNzg2LDEyIEBACiAJcmVxLT5vdXQuYXJnc1swXS5zaXplID0gc2l6ZW9mKHN0cnVjdCBmdXNlX2luaXRfb3V0KTsKIAlyZXEtPm91dC5hcmdzWzBdLnZhbHVlID0gJnJlcS0+bWlzYy5pbml0X291dDsKIAlyZXEtPmVuZCA9IHByb2Nlc3NfaW5pdF9yZXBseTsKLQlyZXF1ZXN0X3NlbmRfYmFja2dyb3VuZChmYywgcmVxKTsKKwlmdXNlX3JlcXVlc3Rfc2VuZF9iYWNrZ3JvdW5kKGZjLCByZXEpOworfQorCitzdGF0aWMgdm9pZCBmdXNlX2ZyZWVfY29ubihzdHJ1Y3QgZnVzZV9jb25uICpmYykKK3sKKwlrZnJlZShmYyk7CiB9CiAKIHN0YXRpYyBpbnQgZnVzZV9maWxsX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHZvaWQgKmRhdGEsIGludCBzaWxlbnQpCkBAIC04MjgsMTAgKzgzMiwxNyBAQAogCWlmIChmaWxlLT5mX29wICE9ICZmdXNlX2Rldl9vcGVyYXRpb25zKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWZjID0gbmV3X2Nvbm4oc2IpOworCWZjID0ga21hbGxvYyhzaXplb2YoKmZjKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFmYykKIAkJcmV0dXJuIC1FTk9NRU07CiAKKwllcnIgPSBmdXNlX2Nvbm5faW5pdChmYywgc2IpOworCWlmIChlcnIpIHsKKwkJa2ZyZWUoZmMpOworCQlyZXR1cm4gZXJyOworCX0KKworCWZjLT5yZWxlYXNlID0gZnVzZV9mcmVlX2Nvbm47CiAJZmMtPmZsYWdzID0gZC5mbGFnczsKIAlmYy0+dXNlcl9pZCA9IGQudXNlcl9pZDsKIAlmYy0+Z3JvdXBfaWQgPSBkLmdyb3VwX2lkOwpAQCAtODQxLDcgKzg1Miw3IEBACiAJc2ItPnNfZnNfaW5mbyA9IGZjOwogCiAJZXJyID0gLUVOT01FTTsKLQlyb290ID0gZ2V0X3Jvb3RfaW5vZGUoc2IsIGQucm9vdG1vZGUpOworCXJvb3QgPSBmdXNlX2dldF9yb290X2lub2RlKHNiLCBkLnJvb3Rtb2RlKTsKIAlpZiAoIXJvb3QpCiAJCWdvdG8gZXJyOwogCkBAIC05NTIsNyArOTYzLDcgQEAKIAogc3RhdGljIHZvaWQgZnVzZV9pbm9kZV9pbml0X29uY2Uodm9pZCAqZm9vKQogewotCXN0cnVjdCBpbm9kZSAqIGlub2RlID0gZm9vOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmb287CiAKIAlpbm9kZV9pbml0X29uY2UoaW5vZGUpOwogfQpAQCAtMTAzMSw3ICsxMDQyLDcgQEAKIHsKIAlpbnQgcmVzOwogCi0JcHJpbnRrKCJmdXNlIGluaXQgKEFQSSB2ZXJzaW9uICVpLiVpKVxuIiwKKwlwcmludGsoS0VSTl9JTkZPICJmdXNlIGluaXQgKEFQSSB2ZXJzaW9uICVpLiVpKVxuIiwKIAkgICAgICAgRlVTRV9LRVJORUxfVkVSU0lPTiwgRlVTRV9LRVJORUxfTUlOT1JfVkVSU0lPTik7CiAKIAlJTklUX0xJU1RfSEVBRCgmZnVzZV9jb25uX2xpc3QpOwpkaWZmIC0tZ2l0IGEvZnMvZ2ZzMi9LY29uZmlnIGIvZnMvZ2ZzMi9LY29uZmlnCmluZGV4IGFiMmY1N2UuLmU1NjNhNjQgMTAwNjQ0Ci0tLSBhL2ZzL2dmczIvS2NvbmZpZworKysgYi9mcy9nZnMyL0tjb25maWcKQEAgLTEsNiArMSw2IEBACiBjb25maWcgR0ZTMl9GUwogCXRyaXN0YXRlICJHRlMyIGZpbGUgc3lzdGVtIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwgJiYgKDY0QklUIHx8IChMU0YgJiYgTEJEKSkKKwlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTCAmJiAoNjRCSVQgfHwgTEJEKQogCXNlbGVjdCBGU19QT1NJWF9BQ0wKIAlzZWxlY3QgQ1JDMzIKIAloZWxwCmRpZmYgLS1naXQgYS9mcy9nZnMyL01ha2VmaWxlIGIvZnMvZ2ZzMi9NYWtlZmlsZQppbmRleCBlYzY1ODUxLi5jMWI0ZWM2IDEwMDY0NAotLS0gYS9mcy9nZnMyL01ha2VmaWxlCisrKyBiL2ZzL2dmczIvTWFrZWZpbGUKQEAgLTEsNSArMSw1IEBACiBvYmotJChDT05GSUdfR0ZTMl9GUykgKz0gZ2ZzMi5vCi1nZnMyLXkgOj0gYWNsLm8gYm1hcC5vIGRhZW1vbi5vIGRpci5vIGVhb3BzLm8gZWF0dHIubyBnbG9jay5vIFwKK2dmczIteSA6PSBhY2wubyBibWFwLm8gZGlyLm8gZWFvcHMubyBlYXR0ci5vIGdsb2NrLm8gXAogCWdsb3BzLm8gaW5vZGUubyBsb2cubyBsb3BzLm8gbG9ja2luZy5vIG1haW4ubyBtZXRhX2lvLm8gXAogCW1vdW50Lm8gb3BzX2FkZHJlc3MubyBvcHNfZGVudHJ5Lm8gb3BzX2V4cG9ydC5vIG9wc19maWxlLm8gXAogCW9wc19mc3R5cGUubyBvcHNfaW5vZGUubyBvcHNfc3VwZXIubyBxdW90YS5vIFwKZGlmZiAtLWdpdCBhL2ZzL2dmczIvYWNsLmMgYi9mcy9nZnMyL2FjbC5jCmluZGV4IDNlOWJkNDYuLmUzMzVkY2UgMTAwNjQ0Ci0tLSBhL2ZzL2dmczIvYWNsLmMKKysrIGIvZnMvZ2ZzMi9hY2wuYwpAQCAtOTEsNyArOTEsNyBAQAogCXN0cnVjdCBnZnMyX2VhX2xvY2F0aW9uIGVsX3RoaXM7CiAJaW50IGVycm9yOwogCi0JaWYgKCFpcC0+aV9kaS5kaV9lYXR0cikKKwlpZiAoIWlwLT5pX2VhdHRyKQogCQlyZXR1cm4gMDsKIAogCW1lbXNldCgmZXIsIDAsIHNpemVvZihzdHJ1Y3QgZ2ZzMl9lYV9yZXF1ZXN0KSk7CmRpZmYgLS1naXQgYS9mcy9nZnMyL2JtYXAuYyBiL2ZzL2dmczIvYm1hcC5jCmluZGV4IGJlYzc2YjEuLjExZmZjNTYgMTAwNjQ0Ci0tLSBhL2ZzL2dmczIvYm1hcC5jCisrKyBiL2ZzL2dmczIvYm1hcC5jCkBAIC03NSw5ICs3NSw5IEBACiAJCXZvaWQgKmthZGRyID0ga21hcChwYWdlKTsKIAogCQltZW1jcHkoa2FkZHIsIGRpYmgtPmJfZGF0YSArIHNpemVvZihzdHJ1Y3QgZ2ZzMl9kaW5vZGUpLAotCQkgICAgICAgaXAtPmlfZGkuZGlfc2l6ZSk7Ci0JCW1lbXNldChrYWRkciArIGlwLT5pX2RpLmRpX3NpemUsIDAsCi0JCSAgICAgICBQQUdFX0NBQ0hFX1NJWkUgLSBpcC0+aV9kaS5kaV9zaXplKTsKKwkJICAgICAgIGlwLT5pX2Rpc2tzaXplKTsKKwkJbWVtc2V0KGthZGRyICsgaXAtPmlfZGlza3NpemUsIDAsCisJCSAgICAgICBQQUdFX0NBQ0hFX1NJWkUgLSBpcC0+aV9kaXNrc2l6ZSk7CiAJCWt1bm1hcChwYWdlKTsKIAogCQlTZXRQYWdlVXB0b2RhdGUocGFnZSk7CkBAIC0xMzIsNyArMTMyLDcgQEAKIAlpZiAoZXJyb3IpCiAJCWdvdG8gb3V0OwogCi0JaWYgKGlwLT5pX2RpLmRpX3NpemUpIHsKKwlpZiAoaXAtPmlfZGlza3NpemUpIHsKIAkJLyogR2V0IGEgZnJlZSBibG9jaywgZmlsbCBpdCB3aXRoIHRoZSBzdHVmZmVkIGRhdGEsCiAJCSAgIGFuZCB3cml0ZSBpdCBvdXQgdG8gZGlzayAqLwogCkBAIC0xNTksNyArMTU5LDcgQEAKIAlkaSA9IChzdHJ1Y3QgZ2ZzMl9kaW5vZGUgKilkaWJoLT5iX2RhdGE7CiAJZ2ZzMl9idWZmZXJfY2xlYXJfdGFpbChkaWJoLCBzaXplb2Yoc3RydWN0IGdmczJfZGlub2RlKSk7CiAKLQlpZiAoaXAtPmlfZGkuZGlfc2l6ZSkgeworCWlmIChpcC0+aV9kaXNrc2l6ZSkgewogCQkqKF9fYmU2NCAqKShkaSArIDEpID0gY3B1X3RvX2JlNjQoYmxvY2spOwogCQlnZnMyX2FkZF9pbm9kZV9ibG9ja3MoJmlwLT5pX2lub2RlLCAxKTsKIAkJZGktPmRpX2Jsb2NrcyA9IGNwdV90b19iZTY0KGdmczJfZ2V0X2lub2RlX2Jsb2NrcygmaXAtPmlfaW5vZGUpKTsKQEAgLTkyNiw3ICs5MjYsNyBAQAogCQl9CiAJfQogCi0JaXAtPmlfZGkuZGlfc2l6ZSA9IHNpemU7CisJaXAtPmlfZGlza3NpemUgPSBzaXplOwogCWlwLT5pX2lub2RlLmlfbXRpbWUgPSBpcC0+aV9pbm9kZS5pX2N0aW1lID0gQ1VSUkVOVF9USU1FOwogCWdmczJfdHJhbnNfYWRkX2JoKGlwLT5pX2dsLCBkaWJoLCAxKTsKIAlnZnMyX2Rpbm9kZV9vdXQoaXAsIGRpYmgtPmJfZGF0YSk7CkBAIC0xMDMzLDcgKzEwMzMsNyBAQAogCQlnb3RvIG91dDsKIAogCWlmIChnZnMyX2lzX3N0dWZmZWQoaXApKSB7Ci0JCWlwLT5pX2RpLmRpX3NpemUgPSBzaXplOworCQlpcC0+aV9kaXNrc2l6ZSA9IHNpemU7CiAJCWlwLT5pX2lub2RlLmlfbXRpbWUgPSBpcC0+aV9pbm9kZS5pX2N0aW1lID0gQ1VSUkVOVF9USU1FOwogCQlnZnMyX3RyYW5zX2FkZF9iaChpcC0+aV9nbCwgZGliaCwgMSk7CiAJCWdmczJfZGlub2RlX291dChpcCwgZGliaC0+Yl9kYXRhKTsKQEAgLTEwNDUsOSArMTA0NSw5IEBACiAJCQllcnJvciA9IGdmczJfYmxvY2tfdHJ1bmNhdGVfcGFnZShpcC0+aV9pbm9kZS5pX21hcHBpbmcpOwogCiAJCWlmICghZXJyb3IpIHsKLQkJCWlwLT5pX2RpLmRpX3NpemUgPSBzaXplOworCQkJaXAtPmlfZGlza3NpemUgPSBzaXplOwogCQkJaXAtPmlfaW5vZGUuaV9tdGltZSA9IGlwLT5pX2lub2RlLmlfY3RpbWUgPSBDVVJSRU5UX1RJTUU7Ci0JCQlpcC0+aV9kaS5kaV9mbGFncyB8PSBHRlMyX0RJRl9UUlVOQ19JTl9QUk9HOworCQkJaXAtPmlfZGlza2ZsYWdzIHw9IEdGUzJfRElGX1RSVU5DX0lOX1BST0c7CiAJCQlnZnMyX3RyYW5zX2FkZF9iaChpcC0+aV9nbCwgZGliaCwgMSk7CiAJCQlnZnMyX2Rpbm9kZV9vdXQoaXAsIGRpYmgtPmJfZGF0YSk7CiAJCX0KQEAgLTExMTQsMTMgKzExMTQsMTMgQEAKIAlpZiAoZXJyb3IpCiAJCWdvdG8gb3V0OwogCi0JaWYgKCFpcC0+aV9kaS5kaV9zaXplKSB7CisJaWYgKCFpcC0+aV9kaXNrc2l6ZSkgewogCQlpcC0+aV9oZWlnaHQgPSAwOwogCQlpcC0+aV9nb2FsID0gaXAtPmlfbm9fYWRkcjsKIAkJZ2ZzMl9idWZmZXJfY2xlYXJfdGFpbChkaWJoLCBzaXplb2Yoc3RydWN0IGdmczJfZGlub2RlKSk7CiAJfQogCWlwLT5pX2lub2RlLmlfbXRpbWUgPSBpcC0+aV9pbm9kZS5pX2N0aW1lID0gQ1VSUkVOVF9USU1FOwotCWlwLT5pX2RpLmRpX2ZsYWdzICY9IH5HRlMyX0RJRl9UUlVOQ19JTl9QUk9HOworCWlwLT5pX2Rpc2tmbGFncyAmPSB+R0ZTMl9ESUZfVFJVTkNfSU5fUFJPRzsKIAogCWdmczJfdHJhbnNfYWRkX2JoKGlwLT5pX2dsLCBkaWJoLCAxKTsKIAlnZnMyX2Rpbm9kZV9vdXQoaXAsIGRpYmgtPmJfZGF0YSk7CkBAIC0xMjA1LDkgKzEyMDUsOSBAQAogCWlmIChnZnMyX2Fzc2VydF93YXJuKEdGUzJfU0IoJmlwLT5pX2lub2RlKSwgU19JU1JFRyhpcC0+aV9pbm9kZS5pX21vZGUpKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlpZiAoc2l6ZSA+IGlwLT5pX2RpLmRpX3NpemUpCisJaWYgKHNpemUgPiBpcC0+aV9kaXNrc2l6ZSkKIAkJZXJyb3IgPSBkb19ncm93KGlwLCBzaXplKTsKLQllbHNlIGlmIChzaXplIDwgaXAtPmlfZGkuZGlfc2l6ZSkKKwllbHNlIGlmIChzaXplIDwgaXAtPmlfZGlza3NpemUpCiAJCWVycm9yID0gZG9fc2hyaW5rKGlwLCBzaXplKTsKIAllbHNlCiAJCS8qIHVwZGF0ZSB0aW1lIHN0YW1wcyAqLwpAQCAtMTIxOSw3ICsxMjE5LDcgQEAKIGludCBnZnMyX3RydW5jYXRlaV9yZXN1bWUoc3RydWN0IGdmczJfaW5vZGUgKmlwKQogewogCWludCBlcnJvcjsKLQllcnJvciA9IHRydW5jX2RlYWxsb2MoaXAsIGlwLT5pX2RpLmRpX3NpemUpOworCWVycm9yID0gdHJ1bmNfZGVhbGxvYyhpcCwgaXAtPmlfZGlza3NpemUpOwogCWlmICghZXJyb3IpCiAJCWVycm9yID0gdHJ1bmNfZW5kKGlwKTsKIAlyZXR1cm4gZXJyb3I7CkBAIC0xMjMxLDM1ICsxMjMxLDYgQEAKIH0KIAogLyoqCi0gKiBnZnMyX3dyaXRlX2NhbGNfcmVzZXJ2IC0gY2FsY3VsYXRlIG51bWJlciBvZiBibG9ja3MgbmVlZGVkIHRvIHdyaXRlIHRvIGEgZmlsZQotICogQGlwOiB0aGUgZmlsZQotICogQGxlbjogdGhlIG51bWJlciBvZiBieXRlcyB0byBiZSB3cml0dGVuIHRvIHRoZSBmaWxlCi0gKiBAZGF0YV9ibG9ja3M6IHJldHVybnMgdGhlIG51bWJlciBvZiBkYXRhIGJsb2NrcyByZXF1aXJlZAotICogQGluZF9ibG9ja3M6IHJldHVybnMgdGhlIG51bWJlciBvZiBpbmRpcmVjdCBibG9ja3MgcmVxdWlyZWQKLSAqCi0gKi8KLQotdm9pZCBnZnMyX3dyaXRlX2NhbGNfcmVzZXJ2KHN0cnVjdCBnZnMyX2lub2RlICppcCwgdW5zaWduZWQgaW50IGxlbiwKLQkJCSAgICB1bnNpZ25lZCBpbnQgKmRhdGFfYmxvY2tzLCB1bnNpZ25lZCBpbnQgKmluZF9ibG9ja3MpCi17Ci0Jc3RydWN0IGdmczJfc2JkICpzZHAgPSBHRlMyX1NCKCZpcC0+aV9pbm9kZSk7Ci0JdW5zaWduZWQgaW50IHRtcDsKLQotCWlmIChnZnMyX2lzX2RpcihpcCkpIHsKLQkJKmRhdGFfYmxvY2tzID0gRElWX1JPVU5EX1VQKGxlbiwgc2RwLT5zZF9qYnNpemUpICsgMjsKLQkJKmluZF9ibG9ja3MgPSAzICogKHNkcC0+c2RfbWF4X2poZWlnaHQgLSAxKTsKLQl9IGVsc2UgewotCQkqZGF0YV9ibG9ja3MgPSAobGVuID4+IHNkcC0+c2Rfc2Iuc2JfYnNpemVfc2hpZnQpICsgMzsKLQkJKmluZF9ibG9ja3MgPSAzICogKHNkcC0+c2RfbWF4X2hlaWdodCAtIDEpOwotCX0KLQotCWZvciAodG1wID0gKmRhdGFfYmxvY2tzOyB0bXAgPiBzZHAtPnNkX2RpcHRyczspIHsKLQkJdG1wID0gRElWX1JPVU5EX1VQKHRtcCwgc2RwLT5zZF9pbnB0cnMpOwotCQkqaW5kX2Jsb2NrcyArPSB0bXA7Ci0JfQotfQotCi0vKioKICAqIGdmczJfd3JpdGVfYWxsb2NfcmVxdWlyZWQgLSBmaWd1cmUgb3V0IGlmIGEgd3JpdGUgd2lsbCByZXF1aXJlIGFuIGFsbG9jYXRpb24KICAqIEBpcDogdGhlIGZpbGUgYmVpbmcgd3JpdHRlbiB0bwogICogQG9mZnNldDogdGhlIG9mZnNldCB0byB3cml0ZSB0bwpAQCAtMTI3Niw2ICsxMjQ3LDcgQEAKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgYmg7CiAJdW5zaWduZWQgaW50IHNoaWZ0OwogCXU2NCBsYmxvY2ssIGxibG9ja19zdG9wLCBzaXplOworCXU2NCBlbmRfb2ZfZmlsZTsKIAogCSphbGxvY19yZXF1aXJlZCA9IDA7CiAKQEAgLTEyOTEsMTkgKzEyNjMsMTIgQEAKIAogCSphbGxvY19yZXF1aXJlZCA9IDE7CiAJc2hpZnQgPSBzZHAtPnNkX3NiLnNiX2JzaXplX3NoaWZ0OwotCWlmIChnZnMyX2lzX2RpcihpcCkpIHsKLQkJdW5zaWduZWQgaW50IGJzaXplID0gc2RwLT5zZF9qYnNpemU7Ci0JCWxibG9jayA9IG9mZnNldDsKLQkJZG9fZGl2KGxibG9jaywgYnNpemUpOwotCQlsYmxvY2tfc3RvcCA9IG9mZnNldCArIGxlbiArIGJzaXplIC0gMTsKLQkJZG9fZGl2KGxibG9ja19zdG9wLCBic2l6ZSk7Ci0JfSBlbHNlIHsKLQkJdTY0IGVuZF9vZl9maWxlID0gKGlwLT5pX2RpLmRpX3NpemUgKyBzZHAtPnNkX3NiLnNiX2JzaXplIC0gMSkgPj4gc2hpZnQ7Ci0JCWxibG9jayA9IG9mZnNldCA+PiBzaGlmdDsKLQkJbGJsb2NrX3N0b3AgPSAob2Zmc2V0ICsgbGVuICsgc2RwLT5zZF9zYi5zYl9ic2l6ZSAtIDEpID4+IHNoaWZ0OwotCQlpZiAobGJsb2NrX3N0b3AgPiBlbmRfb2ZfZmlsZSkKLQkJCXJldHVybiAwOwotCX0KKwlCVUdfT04oZ2ZzMl9pc19kaXIoaXApKTsKKwllbmRfb2ZfZmlsZSA9IChpcC0+aV9kaXNrc2l6ZSArIHNkcC0+c2Rfc2Iuc2JfYnNpemUgLSAxKSA+PiBzaGlmdDsKKwlsYmxvY2sgPSBvZmZzZXQgPj4gc2hpZnQ7CisJbGJsb2NrX3N0b3AgPSAob2Zmc2V0ICsgbGVuICsgc2RwLT5zZF9zYi5zYl9ic2l6ZSAtIDEpID4+IHNoaWZ0OworCWlmIChsYmxvY2tfc3RvcCA+IGVuZF9vZl9maWxlKQorCQlyZXR1cm4gMDsKIAogCXNpemUgPSAobGJsb2NrX3N0b3AgLSBsYmxvY2spIDw8IHNoaWZ0OwogCWRvIHsKZGlmZiAtLWdpdCBhL2ZzL2dmczIvYm1hcC5oIGIvZnMvZ2ZzMi9ibWFwLmgKaW5kZXggNGU2Y2RlMi4uYzk4MzE3NyAxMDA2NDQKLS0tIGEvZnMvZ2ZzMi9ibWFwLmgKKysrIGIvZnMvZ2ZzMi9ibWFwLmgKQEAgLTEwLDEwICsxMCw0MCBAQAogI2lmbmRlZiBfX0JNQVBfRE9UX0hfXwogI2RlZmluZSBfX0JNQVBfRE9UX0hfXwogCisjaW5jbHVkZSAiaW5vZGUuaCIKKwogc3RydWN0IGlub2RlOwogc3RydWN0IGdmczJfaW5vZGU7CiBzdHJ1Y3QgcGFnZTsKIAorCisvKioKKyAqIGdmczJfd3JpdGVfY2FsY19yZXNlcnYgLSBjYWxjdWxhdGUgbnVtYmVyIG9mIGJsb2NrcyBuZWVkZWQgdG8gd3JpdGUgdG8gYSBmaWxlCisgKiBAaXA6IHRoZSBmaWxlCisgKiBAbGVuOiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGJlIHdyaXR0ZW4gdG8gdGhlIGZpbGUKKyAqIEBkYXRhX2Jsb2NrczogcmV0dXJucyB0aGUgbnVtYmVyIG9mIGRhdGEgYmxvY2tzIHJlcXVpcmVkCisgKiBAaW5kX2Jsb2NrczogcmV0dXJucyB0aGUgbnVtYmVyIG9mIGluZGlyZWN0IGJsb2NrcyByZXF1aXJlZAorICoKKyAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgZ2ZzMl93cml0ZV9jYWxjX3Jlc2Vydihjb25zdCBzdHJ1Y3QgZ2ZzMl9pbm9kZSAqaXAsCisJCQkJCSAgdW5zaWduZWQgaW50IGxlbiwKKwkJCQkJICB1bnNpZ25lZCBpbnQgKmRhdGFfYmxvY2tzLAorCQkJCQkgIHVuc2lnbmVkIGludCAqaW5kX2Jsb2NrcykKK3sKKwljb25zdCBzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCA9IEdGUzJfU0IoJmlwLT5pX2lub2RlKTsKKwl1bnNpZ25lZCBpbnQgdG1wOworCisJQlVHX09OKGdmczJfaXNfZGlyKGlwKSk7CisJKmRhdGFfYmxvY2tzID0gKGxlbiA+PiBzZHAtPnNkX3NiLnNiX2JzaXplX3NoaWZ0KSArIDM7CisJKmluZF9ibG9ja3MgPSAzICogKHNkcC0+c2RfbWF4X2hlaWdodCAtIDEpOworCisJZm9yICh0bXAgPSAqZGF0YV9ibG9ja3M7IHRtcCA+IHNkcC0+c2RfZGlwdHJzOykgeworCQl0bXAgPSBESVZfUk9VTkRfVVAodG1wLCBzZHAtPnNkX2lucHRycyk7CisJCSppbmRfYmxvY2tzICs9IHRtcDsKKwl9Cit9CisKIGludCBnZnMyX3Vuc3R1ZmZfZGlub2RlKHN0cnVjdCBnZnMyX2lub2RlICppcCwgc3RydWN0IHBhZ2UgKnBhZ2UpOwogaW50IGdmczJfYmxvY2tfbWFwKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHNlY3Rvcl90IGxibG9jaywgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgaW50IGNyZWF0ZSk7CiBpbnQgZ2ZzMl9leHRlbnRfbWFwKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHU2NCBsYmxvY2ssIGludCAqbmV3LCB1NjQgKmRibG9jaywgdW5zaWduZWQgKmV4dGxlbik7CkBAIC0yMSwxMCArNTEsNiBAQAogaW50IGdmczJfdHJ1bmNhdGVpKHN0cnVjdCBnZnMyX2lub2RlICppcCwgdTY0IHNpemUpOwogaW50IGdmczJfdHJ1bmNhdGVpX3Jlc3VtZShzdHJ1Y3QgZ2ZzMl9pbm9kZSAqaXApOwogaW50IGdmczJfZmlsZV9kZWFsbG9jKHN0cnVjdCBnZnMyX2lub2RlICppcCk7Ci0KLXZvaWQgZ2ZzMl93cml0ZV9jYWxjX3Jlc2VydihzdHJ1Y3QgZ2ZzMl9pbm9kZSAqaXAsIHVuc2lnbmVkIGludCBsZW4sCi0JCQkgICAgdW5zaWduZWQgaW50ICpkYXRhX2Jsb2NrcywKLQkJCSAgICB1bnNpZ25lZCBpbnQgKmluZF9ibG9ja3MpOwogaW50IGdmczJfd3JpdGVfYWxsb2NfcmVxdWlyZWQoc3RydWN0IGdmczJfaW5vZGUgKmlwLCB1NjQgb2Zmc2V0LAogCQkJICAgICAgdW5zaWduZWQgaW50IGxlbiwgaW50ICphbGxvY19yZXF1aXJlZCk7CiAKZGlmZiAtLWdpdCBhL2ZzL2dmczIvZGFlbW9uLmMgYi9mcy9nZnMyL2RhZW1vbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTE5OTE5Li4wMDAwMDAwCi0tLSBhL2ZzL2dmczIvZGFlbW9uLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgU2lzdGluYSBTb2Z0d2FyZSwgSW5jLiAgMTk5Ny0yMDAzIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNiBSZWQgSGF0LCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAotICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKLSAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+Ci0jaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgotI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+Ci0jaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvZ2ZzMl9vbmRpc2suaD4KLSNpbmNsdWRlIDxsaW51eC9sbV9pbnRlcmZhY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9mcmVlemVyLmg+Ci0KLSNpbmNsdWRlICJnZnMyLmgiCi0jaW5jbHVkZSAiaW5jb3JlLmgiCi0jaW5jbHVkZSAiZGFlbW9uLmgiCi0jaW5jbHVkZSAiZ2xvY2suaCIKLSNpbmNsdWRlICJsb2cuaCIKLSNpbmNsdWRlICJxdW90YS5oIgotI2luY2x1ZGUgInJlY292ZXJ5LmgiCi0jaW5jbHVkZSAic3VwZXIuaCIKLSNpbmNsdWRlICJ1dGlsLmgiCi0KLS8qIFRoaXMgdXNlcyBzY2hlZHVsZV90aW1lb3V0KCkgaW5zdGVhZCBvZiBtc2xlZXAoKSBiZWNhdXNlIGl0J3MgZ29vZCBmb3IKLSAgIHRoZSBkYWVtb25zIHRvIHdha2UgdXAgbW9yZSBvZnRlbiB0aGFuIHRoZSB0aW1lb3V0IHdoZW4gdW5tb3VudGluZyBzbwotICAgdGhlIHVzZXIncyB1bm1vdW50IGRvZXNuJ3Qgc2l0IHRoZXJlIGZvcmV2ZXIuCi0KLSAgIFRoZSBrdGhyZWFkIGZ1bmN0aW9ucyB1c2VkIHRvIHN0YXJ0IHRoZXNlIGRhZW1vbnMgYmxvY2sgYW5kIGZsdXNoIHNpZ25hbHMuICovCi0KLS8qKgotICogZ2ZzMl9nbG9ja2QgLSBSZWNsYWltIHVudXNlZCBnbG9jayBzdHJ1Y3R1cmVzCi0gKiBAc2RwOiBQb2ludGVyIHRvIEdGUzIgc3VwZXJibG9jawotICoKLSAqIE9uZSBvciBtb3JlIG9mIHRoZXNlIGRhZW1vbnMgcnVuLCByZWNsYWltaW5nIGdsb2NrcyBvbiBzZF9yZWNsYWltX2xpc3QuCi0gKiBOdW1iZXIgb2YgZGFlbW9ucyBjYW4gYmUgc2V0IGJ5IHVzZXIsIHdpdGggbnVtX2dsb2NrZCBtb3VudCBvcHRpb24uCi0gKi8KLQotaW50IGdmczJfZ2xvY2tkKHZvaWQgKmRhdGEpCi17Ci0Jc3RydWN0IGdmczJfc2JkICpzZHAgPSBkYXRhOwotCi0Jd2hpbGUgKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkpIHsKLQkJd2hpbGUgKGF0b21pY19yZWFkKCZzZHAtPnNkX3JlY2xhaW1fY291bnQpKQotCQkJZ2ZzMl9yZWNsYWltX2dsb2NrKHNkcCk7Ci0KLQkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKHNkcC0+c2RfcmVjbGFpbV93cSwKLQkJCQkJIChhdG9taWNfcmVhZCgmc2RwLT5zZF9yZWNsYWltX2NvdW50KSB8fAotCQkJCQkga3RocmVhZF9zaG91bGRfc3RvcCgpKSk7Ci0JCWlmIChmcmVlemluZyhjdXJyZW50KSkKLQkJCXJlZnJpZ2VyYXRvcigpOwotCX0KLQotCXJldHVybiAwOwotfQotCi0vKioKLSAqIGdmczJfcmVjb3ZlcmQgLSBSZWNvdmVyIGRlYWQgbWFjaGluZSdzIGpvdXJuYWxzCi0gKiBAc2RwOiBQb2ludGVyIHRvIEdGUzIgc3VwZXJibG9jawotICoKLSAqLwotCi1pbnQgZ2ZzMl9yZWNvdmVyZCh2b2lkICpkYXRhKQotewotCXN0cnVjdCBnZnMyX3NiZCAqc2RwID0gZGF0YTsKLQl1bnNpZ25lZCBsb25nIHQ7Ci0KLQl3aGlsZSAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSkgewotCQlnZnMyX2NoZWNrX2pvdXJuYWxzKHNkcCk7Ci0JCXQgPSBnZnMyX3R1bmVfZ2V0KHNkcCwgIGd0X3JlY292ZXJkX3NlY3MpICogSFo7Ci0JCWlmIChmcmVlemluZyhjdXJyZW50KSkKLQkJCXJlZnJpZ2VyYXRvcigpOwotCQlzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUodCk7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qKgotICogZ2ZzMl9xdW90YWQgLSBXcml0ZSBjYWNoZWQgcXVvdGEgY2hhbmdlcyBpbnRvIHRoZSBxdW90YSBmaWxlCi0gKiBAc2RwOiBQb2ludGVyIHRvIEdGUzIgc3VwZXJibG9jawotICoKLSAqLwotCi1pbnQgZ2ZzMl9xdW90YWQodm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCA9IGRhdGE7Ci0JdW5zaWduZWQgbG9uZyB0OwotCWludCBlcnJvcjsKLQotCXdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpKSB7Ci0JCS8qIFVwZGF0ZSB0aGUgbWFzdGVyIHN0YXRmcyBmaWxlICovCi0KLQkJdCA9IHNkcC0+c2Rfc3RhdGZzX3N5bmNfdGltZSArCi0JCSAgICBnZnMyX3R1bmVfZ2V0KHNkcCwgZ3Rfc3RhdGZzX3F1YW50dW0pICogSFo7Ci0KLQkJaWYgKHRpbWVfYWZ0ZXJfZXEoamlmZmllcywgdCkpIHsKLQkJCWVycm9yID0gZ2ZzMl9zdGF0ZnNfc3luYyhzZHApOwotCQkJaWYgKGVycm9yICYmCi0JCQkgICAgZXJyb3IgIT0gLUVST0ZTICYmCi0JCQkgICAgIXRlc3RfYml0KFNERl9TSFVURE9XTiwgJnNkcC0+c2RfZmxhZ3MpKQotCQkJCWZzX2VycihzZHAsICJxdW90YWQ6ICgxKSBlcnJvcj0lZFxuIiwgZXJyb3IpOwotCQkJc2RwLT5zZF9zdGF0ZnNfc3luY190aW1lID0gamlmZmllczsKLQkJfQotCi0JCS8qIFVwZGF0ZSBxdW90YSBmaWxlICovCi0KLQkJdCA9IHNkcC0+c2RfcXVvdGFfc3luY190aW1lICsKLQkJICAgIGdmczJfdHVuZV9nZXQoc2RwLCBndF9xdW90YV9xdWFudHVtKSAqIEhaOwotCi0JCWlmICh0aW1lX2FmdGVyX2VxKGppZmZpZXMsIHQpKSB7Ci0JCQllcnJvciA9IGdmczJfcXVvdGFfc3luYyhzZHApOwotCQkJaWYgKGVycm9yICYmCi0JCQkgICAgZXJyb3IgIT0gLUVST0ZTICYmCi0JCQkgICAgIXRlc3RfYml0KFNERl9TSFVURE9XTiwgJnNkcC0+c2RfZmxhZ3MpKQotCQkJCWZzX2VycihzZHAsICJxdW90YWQ6ICgyKSBlcnJvcj0lZFxuIiwgZXJyb3IpOwotCQkJc2RwLT5zZF9xdW90YV9zeW5jX3RpbWUgPSBqaWZmaWVzOwotCQl9Ci0KLQkJZ2ZzMl9xdW90YV9zY2FuKHNkcCk7Ci0KLQkJdCA9IGdmczJfdHVuZV9nZXQoc2RwLCBndF9xdW90YWRfc2VjcykgKiBIWjsKLQkJaWYgKGZyZWV6aW5nKGN1cnJlbnQpKQotCQkJcmVmcmlnZXJhdG9yKCk7Ci0JCXNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZSh0KTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQpkaWZmIC0tZ2l0IGEvZnMvZ2ZzMi9kYWVtb24uaCBiL2ZzL2dmczIvZGFlbW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiZTA4NGYuLjAwMDAwMDAKLS0tIGEvZnMvZ2ZzMi9kYWVtb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIFNpc3RpbmEgU29mdHdhcmUsIEluYy4gIDE5OTctMjAwMyBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDYgUmVkIEhhdCwgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKLSAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCi0gKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLgotICovCi0KLSNpZm5kZWYgX19EQUVNT05fRE9UX0hfXwotI2RlZmluZSBfX0RBRU1PTl9ET1RfSF9fCi0KLWludCBnZnMyX2dsb2NrZCh2b2lkICpkYXRhKTsKLWludCBnZnMyX3JlY292ZXJkKHZvaWQgKmRhdGEpOwotaW50IGdmczJfcXVvdGFkKHZvaWQgKmRhdGEpOwotCi0jZW5kaWYgLyogX19EQUVNT05fRE9UX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZnMvZ2ZzMi9kaXIuYyBiL2ZzL2dmczIvZGlyLmMKaW5kZXggZWVkMDQwZC4uYjdjOGU1YyAxMDA2NDQKLS0tIGEvZnMvZ2ZzMi9kaXIuYworKysgYi9mcy9nZnMyL2Rpci5jCkBAIC0zNiw3ICszNiw3IEBACiAgKiB0aGUgYmxvY2suICBJbiBsZWF2ZXMsIHRoZXkgYmVnaW4gYXQgb2Zmc2V0IHNpemVvZihzdHJ1Y3QgZ2ZzMl9sZWFmKSBmcm9tIHRoZQogICogYmVnaW5uaW5nIG9mIHRoZSBsZWFmIGJsb2NrLiBUaGUgZGlyZW50cyByZXNpZGUgaW4gbGVhdmVzIHdoZW4KICAqCi0gKiBkaXAtPmlfZGkuZGlfZmxhZ3MgJiBHRlMyX0RJRl9FWEhBU0ggaXMgdHJ1ZQorICogZGlwLT5pX2Rpc2tmbGFncyAmIEdGUzJfRElGX0VYSEFTSCBpcyB0cnVlCiAgKgogICogT3RoZXJ3aXNlLCB0aGUgZGlyZW50cyBhcmUgImxpbmVhciIsIHdpdGhpbiBhIHNpbmdsZSBzdHVmZmVkIGRpbm9kZSBibG9jay4KICAqCkBAIC0xMjgsOCArMTI4LDggQEAKIAogCWdmczJfdHJhbnNfYWRkX2JoKGlwLT5pX2dsLCBkaWJoLCAxKTsKIAltZW1jcHkoZGliaC0+Yl9kYXRhICsgb2Zmc2V0ICsgc2l6ZW9mKHN0cnVjdCBnZnMyX2Rpbm9kZSksIGJ1Ziwgc2l6ZSk7Ci0JaWYgKGlwLT5pX2RpLmRpX3NpemUgPCBvZmZzZXQgKyBzaXplKQotCQlpcC0+aV9kaS5kaV9zaXplID0gb2Zmc2V0ICsgc2l6ZTsKKwlpZiAoaXAtPmlfZGlza3NpemUgPCBvZmZzZXQgKyBzaXplKQorCQlpcC0+aV9kaXNrc2l6ZSA9IG9mZnNldCArIHNpemU7CiAJaXAtPmlfaW5vZGUuaV9tdGltZSA9IGlwLT5pX2lub2RlLmlfY3RpbWUgPSBDVVJSRU5UX1RJTUU7CiAJZ2ZzMl9kaW5vZGVfb3V0KGlwLCBkaWJoLT5iX2RhdGEpOwogCkBAIC0yMjYsOCArMjI2LDggQEAKIAlpZiAoZXJyb3IpCiAJCXJldHVybiBlcnJvcjsKIAotCWlmIChpcC0+aV9kaS5kaV9zaXplIDwgb2Zmc2V0ICsgY29waWVkKQotCQlpcC0+aV9kaS5kaV9zaXplID0gb2Zmc2V0ICsgY29waWVkOworCWlmIChpcC0+aV9kaXNrc2l6ZSA8IG9mZnNldCArIGNvcGllZCkKKwkJaXAtPmlfZGlza3NpemUgPSBvZmZzZXQgKyBjb3BpZWQ7CiAJaXAtPmlfaW5vZGUuaV9tdGltZSA9IGlwLT5pX2lub2RlLmlfY3RpbWUgPSBDVVJSRU5UX1RJTUU7CiAKIAlnZnMyX3RyYW5zX2FkZF9iaChpcC0+aV9nbCwgZGliaCwgMSk7CkBAIC0yNzcsMTEgKzI3NywxMSBAQAogCWludCBjb3BpZWQgPSAwOwogCWludCBlcnJvciA9IDA7CiAKLQlpZiAob2Zmc2V0ID49IGlwLT5pX2RpLmRpX3NpemUpCisJaWYgKG9mZnNldCA+PSBpcC0+aV9kaXNrc2l6ZSkKIAkJcmV0dXJuIDA7CiAKLQlpZiAob2Zmc2V0ICsgc2l6ZSA+IGlwLT5pX2RpLmRpX3NpemUpCi0JCXNpemUgPSBpcC0+aV9kaS5kaV9zaXplIC0gb2Zmc2V0OworCWlmIChvZmZzZXQgKyBzaXplID4gaXAtPmlfZGlza3NpemUpCisJCXNpemUgPSBpcC0+aV9kaXNrc2l6ZSAtIG9mZnNldDsKIAogCWlmICghc2l6ZSkKIAkJcmV0dXJuIDA7CkBAIC03NTUsMTIgKzc1NSwxMiBAQAogCXN0cnVjdCBnZnMyX2lub2RlICppcCA9IEdGUzJfSShpbm9kZSk7CiAJaW50IGVycm9yOwogCi0JaWYgKGlwLT5pX2RpLmRpX2ZsYWdzICYgR0ZTMl9ESUZfRVhIQVNIKSB7CisJaWYgKGlwLT5pX2Rpc2tmbGFncyAmIEdGUzJfRElGX0VYSEFTSCkgewogCQlzdHJ1Y3QgZ2ZzMl9sZWFmICpsZWFmOwogCQl1bnNpZ25lZCBoc2l6ZSA9IDEgPDwgaXAtPmlfZGVwdGg7CiAJCXVuc2lnbmVkIGluZGV4OwogCQl1NjQgbG47Ci0JCWlmIChoc2l6ZSAqIHNpemVvZih1NjQpICE9IGlwLT5pX2RpLmRpX3NpemUpIHsKKwkJaWYgKGhzaXplICogc2l6ZW9mKHU2NCkgIT0gaXAtPmlfZGlza3NpemUpIHsKIAkJCWdmczJfY29uc2lzdF9pbm9kZShpcCk7CiAJCQlyZXR1cm4gRVJSX1BUUigtRUlPKTsKIAkJfQpAQCAtODU4LDggKzg1OCw4IEBACiAJCXJldHVybiAtRU5PU1BDOwogCWJuID0gYmgtPmJfYmxvY2tucjsKIAotCWdmczJfYXNzZXJ0KHNkcCwgZGlwLT5pX2RpLmRpX2VudHJpZXMgPCAoMSA8PCAxNikpOwotCWxlYWYtPmxmX2VudHJpZXMgPSBjcHVfdG9fYmUxNihkaXAtPmlfZGkuZGlfZW50cmllcyk7CisJZ2ZzMl9hc3NlcnQoc2RwLCBkaXAtPmlfZW50cmllcyA8ICgxIDw8IDE2KSk7CisJbGVhZi0+bGZfZW50cmllcyA9IGNwdV90b19iZTE2KGRpcC0+aV9lbnRyaWVzKTsKIAogCS8qICBDb3B5IGRpcmVudHMgICovCiAKQEAgLTkwNSw5ICs5MDUsOSBAQAogCWZvciAoeCA9IHNkcC0+c2RfaGFzaF9wdHJzOyB4LS07IGxwKyspCiAJCSpscCA9IGNwdV90b19iZTY0KGJuKTsKIAotCWRpcC0+aV9kaS5kaV9zaXplID0gc2RwLT5zZF9zYi5zYl9ic2l6ZSAvIDI7CisJZGlwLT5pX2Rpc2tzaXplID0gc2RwLT5zZF9zYi5zYl9ic2l6ZSAvIDI7CiAJZ2ZzMl9hZGRfaW5vZGVfYmxvY2tzKCZkaXAtPmlfaW5vZGUsIDEpOwotCWRpcC0+aV9kaS5kaV9mbGFncyB8PSBHRlMyX0RJRl9FWEhBU0g7CisJZGlwLT5pX2Rpc2tmbGFncyB8PSBHRlMyX0RJRl9FWEhBU0g7CiAKIAlmb3IgKHggPSBzZHAtPnNkX2hhc2hfcHRycywgeSA9IC0xOyB4OyB4ID4+PSAxLCB5KyspIDsKIAlkaXAtPmlfZGVwdGggPSB5OwpAQCAtMTA4Miw3ICsxMDgyLDcgQEAKIAlpbnQgZXJyb3IgPSAwOwogCiAJaHNpemUgPSAxIDw8IGRpcC0+aV9kZXB0aDsKLQlpZiAoaHNpemUgKiBzaXplb2YodTY0KSAhPSBkaXAtPmlfZGkuZGlfc2l6ZSkgeworCWlmIChoc2l6ZSAqIHNpemVvZih1NjQpICE9IGRpcC0+aV9kaXNrc2l6ZSkgewogCQlnZnMyX2NvbnNpc3RfaW5vZGUoZGlwKTsKIAkJcmV0dXJuIC1FSU87CiAJfQpAQCAtMTA5MSw3ICsxMDkxLDcgQEAKIAogCWJ1ZiA9IGtjYWxsb2MoMywgc2RwLT5zZF9oYXNoX2JzaXplLCBHRlBfTk9GUyB8IF9fR0ZQX05PRkFJTCk7CiAKLQlmb3IgKGJsb2NrID0gZGlwLT5pX2RpLmRpX3NpemUgPj4gc2RwLT5zZF9oYXNoX2JzaXplX3NoaWZ0OyBibG9jay0tOykgeworCWZvciAoYmxvY2sgPSBkaXAtPmlfZGlza3NpemUgPj4gc2RwLT5zZF9oYXNoX2JzaXplX3NoaWZ0OyBibG9jay0tOykgewogCQllcnJvciA9IGdmczJfZGlyX3JlYWRfZGF0YShkaXAsIChjaGFyICopYnVmLAogCQkJCQkgICAgYmxvY2sgKiBzZHAtPnNkX2hhc2hfYnNpemUsCiAJCQkJCSAgICBzZHAtPnNkX2hhc2hfYnNpemUsIDEpOwpAQCAtMTM3MCw3ICsxMzcwLDcgQEAKIAl1bnNpZ25lZCBkZXB0aCA9IDA7CiAKIAloc2l6ZSA9IDEgPDwgZGlwLT5pX2RlcHRoOwotCWlmIChoc2l6ZSAqIHNpemVvZih1NjQpICE9IGRpcC0+aV9kaS5kaV9zaXplKSB7CisJaWYgKGhzaXplICogc2l6ZW9mKHU2NCkgIT0gZGlwLT5pX2Rpc2tzaXplKSB7CiAJCWdmczJfY29uc2lzdF9pbm9kZShkaXApOwogCQlyZXR1cm4gLUVJTzsKIAl9CkBAIC0xNDI2LDEwICsxNDI2LDEwIEBACiAJaW50IGNvcGllZCA9IDA7CiAJaW50IGVycm9yOwogCi0JaWYgKCFkaXAtPmlfZGkuZGlfZW50cmllcykKKwlpZiAoIWRpcC0+aV9lbnRyaWVzKQogCQlyZXR1cm4gMDsKIAotCWlmIChkaXAtPmlfZGkuZGlfZmxhZ3MgJiBHRlMyX0RJRl9FWEhBU0gpCisJaWYgKGRpcC0+aV9kaXNrZmxhZ3MgJiBHRlMyX0RJRl9FWEhBU0gpCiAJCXJldHVybiBkaXJfZV9yZWFkKGlub2RlLCBvZmZzZXQsIG9wYXF1ZSwgZmlsbGRpcik7CiAKIAlpZiAoIWdmczJfaXNfc3R1ZmZlZChkaXApKSB7CkBAIC0xNDUzLDE3ICsxNDUzLDE3IEBACiAJCQllcnJvciA9IFBUUl9FUlIoZGVudCk7CiAJCQlnb3RvIG91dDsKIAkJfQotCQlpZiAoZGlwLT5pX2RpLmRpX2VudHJpZXMgIT0gZy5vZmZzZXQpIHsKKwkJaWYgKGRpcC0+aV9lbnRyaWVzICE9IGcub2Zmc2V0KSB7CiAJCQlmc193YXJuKHNkcCwgIk51bWJlciBvZiBlbnRyaWVzIGNvcnJ1cHQgaW4gZGlyICVsbHUsICIKLQkJCQkiaXAtPmlfZGkuZGlfZW50cmllcyAoJXUpICE9IGcub2Zmc2V0ICgldSlcbiIsCisJCQkJImlwLT5pX2VudHJpZXMgKCV1KSAhPSBnLm9mZnNldCAoJXUpXG4iLAogCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpZGlwLT5pX25vX2FkZHIsCi0JCQkJZGlwLT5pX2RpLmRpX2VudHJpZXMsCisJCQkJZGlwLT5pX2VudHJpZXMsCiAJCQkJZy5vZmZzZXQpOwogCQkJZXJyb3IgPSAtRUlPOwogCQkJZ290byBvdXQ7CiAJCX0KIAkJZXJyb3IgPSBkb19maWxsZGlyX21haW4oZGlwLCBvZmZzZXQsIG9wYXF1ZSwgZmlsbGRpciwgZGFyciwKLQkJCQkJZGlwLT5pX2RpLmRpX2VudHJpZXMsICZjb3BpZWQpOworCQkJCQlkaXAtPmlfZW50cmllcywgJmNvcGllZCk7CiBvdXQ6CiAJCWtmcmVlKGRhcnIpOwogCX0KQEAgLTE2MTIsNyArMTYxMiw3IEBACiAJCQlkZW50ID0gZ2ZzMl9pbml0X2RpcmVudChpbm9kZSwgZGVudCwgbmFtZSwgYmgpOwogCQkJZ2ZzMl9pbnVtX291dChuaXAsIGRlbnQpOwogCQkJZGVudC0+ZGVfdHlwZSA9IGNwdV90b19iZTE2KHR5cGUpOwotCQkJaWYgKGlwLT5pX2RpLmRpX2ZsYWdzICYgR0ZTMl9ESUZfRVhIQVNIKSB7CisJCQlpZiAoaXAtPmlfZGlza2ZsYWdzICYgR0ZTMl9ESUZfRVhIQVNIKSB7CiAJCQkJbGVhZiA9IChzdHJ1Y3QgZ2ZzMl9sZWFmICopYmgtPmJfZGF0YTsKIAkJCQliZTE2X2FkZF9jcHUoJmxlYWYtPmxmX2VudHJpZXMsIDEpOwogCQkJfQpAQCAtMTYyMSwxNCArMTYyMSwxNCBAQAogCQkJaWYgKGVycm9yKQogCQkJCWJyZWFrOwogCQkJZ2ZzMl90cmFuc19hZGRfYmgoaXAtPmlfZ2wsIGJoLCAxKTsKLQkJCWlwLT5pX2RpLmRpX2VudHJpZXMrKzsKKwkJCWlwLT5pX2VudHJpZXMrKzsKIAkJCWlwLT5pX2lub2RlLmlfbXRpbWUgPSBpcC0+aV9pbm9kZS5pX2N0aW1lID0gQ1VSUkVOVF9USU1FOwogCQkJZ2ZzMl9kaW5vZGVfb3V0KGlwLCBiaC0+Yl9kYXRhKTsKIAkJCWJyZWxzZShiaCk7CiAJCQllcnJvciA9IDA7CiAJCQlicmVhazsKIAkJfQotCQlpZiAoIShpcC0+aV9kaS5kaV9mbGFncyAmIEdGUzJfRElGX0VYSEFTSCkpIHsKKwkJaWYgKCEoaXAtPmlfZGlza2ZsYWdzICYgR0ZTMl9ESUZfRVhIQVNIKSkgewogCQkJZXJyb3IgPSBkaXJfbWFrZV9leGhhc2goaW5vZGUpOwogCQkJaWYgKGVycm9yKQogCQkJCWJyZWFrOwpAQCAtMTY5MSw3ICsxNjkxLDcgQEAKIAl9CiAKIAlkaXJlbnRfZGVsKGRpcCwgYmgsIHByZXYsIGRlbnQpOwotCWlmIChkaXAtPmlfZGkuZGlfZmxhZ3MgJiBHRlMyX0RJRl9FWEhBU0gpIHsKKwlpZiAoZGlwLT5pX2Rpc2tmbGFncyAmIEdGUzJfRElGX0VYSEFTSCkgewogCQlzdHJ1Y3QgZ2ZzMl9sZWFmICpsZWFmID0gKHN0cnVjdCBnZnMyX2xlYWYgKiliaC0+Yl9kYXRhOwogCQl1MTYgZW50cmllcyA9IGJlMTZfdG9fY3B1KGxlYWYtPmxmX2VudHJpZXMpOwogCQlpZiAoIWVudHJpZXMpCkBAIC0xNzA0LDEwICsxNzA0LDEwIEBACiAJaWYgKGVycm9yKQogCQlyZXR1cm4gZXJyb3I7CiAKLQlpZiAoIWRpcC0+aV9kaS5kaV9lbnRyaWVzKQorCWlmICghZGlwLT5pX2VudHJpZXMpCiAJCWdmczJfY29uc2lzdF9pbm9kZShkaXApOwogCWdmczJfdHJhbnNfYWRkX2JoKGRpcC0+aV9nbCwgYmgsIDEpOwotCWRpcC0+aV9kaS5kaV9lbnRyaWVzLS07CisJZGlwLT5pX2VudHJpZXMtLTsKIAlkaXAtPmlfaW5vZGUuaV9tdGltZSA9IGRpcC0+aV9pbm9kZS5pX2N0aW1lID0gQ1VSUkVOVF9USU1FOwogCWdmczJfZGlub2RlX291dChkaXAsIGJoLT5iX2RhdGEpOwogCWJyZWxzZShiaCk7CkBAIC0xNzQ4LDcgKzE3NDgsNyBAQAogCWdmczJfaW51bV9vdXQobmlwLCBkZW50KTsKIAlkZW50LT5kZV90eXBlID0gY3B1X3RvX2JlMTYobmV3X3R5cGUpOwogCi0JaWYgKGRpcC0+aV9kaS5kaV9mbGFncyAmIEdGUzJfRElGX0VYSEFTSCkgeworCWlmIChkaXAtPmlfZGlza2ZsYWdzICYgR0ZTMl9ESUZfRVhIQVNIKSB7CiAJCWJyZWxzZShiaCk7CiAJCWVycm9yID0gZ2ZzMl9tZXRhX2lub2RlX2J1ZmZlcihkaXAsICZiaCk7CiAJCWlmIChlcnJvcikKQEAgLTE3ODQsNyArMTc4NCw3IEBACiAJaW50IGVycm9yID0gMDsKIAogCWhzaXplID0gMSA8PCBkaXAtPmlfZGVwdGg7Ci0JaWYgKGhzaXplICogc2l6ZW9mKHU2NCkgIT0gZGlwLT5pX2RpLmRpX3NpemUpIHsKKwlpZiAoaHNpemUgKiBzaXplb2YodTY0KSAhPSBkaXAtPmlfZGlza3NpemUpIHsKIAkJZ2ZzMl9jb25zaXN0X2lub2RlKGRpcCk7CiAJCXJldHVybiAtRUlPOwogCX0KZGlmZiAtLWdpdCBhL2ZzL2dmczIvZGlyLmggYi9mcy9nZnMyL2Rpci5oCmluZGV4IDhhNDY4Y2EuLjRmOTE5NDQgMTAwNjQ0Ci0tLSBhL2ZzL2dmczIvZGlyLmgKKysrIGIvZnMvZ2ZzMi9kaXIuaApAQCAtMTEsNiArMTEsNyBAQAogI2RlZmluZSBfX0RJUl9ET1RfSF9fCiAKICNpbmNsdWRlIDxsaW51eC9kY2FjaGUuaD4KKyNpbmNsdWRlIDxsaW51eC9jcmMzMi5oPgogCiBzdHJ1Y3QgaW5vZGU7CiBzdHJ1Y3QgZ2ZzMl9pbm9kZTsKZGlmZiAtLWdpdCBhL2ZzL2dmczIvZWF0dHIuYyBiL2ZzL2dmczIvZWF0dHIuYwppbmRleCBlM2Y3NmY0Li4wZDFjNzZkIDEwMDY0NAotLS0gYS9mcy9nZnMyL2VhdHRyLmMKKysrIGIvZnMvZ2ZzMi9lYXR0ci5jCkBAIC0xMTQsMTEgKzExNCwxMSBAQAogCV9fYmU2NCAqZWFibGssICplbmQ7CiAJaW50IGVycm9yOwogCi0JZXJyb3IgPSBnZnMyX21ldGFfcmVhZChpcC0+aV9nbCwgaXAtPmlfZGkuZGlfZWF0dHIsIERJT19XQUlULCAmYmgpOworCWVycm9yID0gZ2ZzMl9tZXRhX3JlYWQoaXAtPmlfZ2wsIGlwLT5pX2VhdHRyLCBESU9fV0FJVCwgJmJoKTsKIAlpZiAoZXJyb3IpCiAJCXJldHVybiBlcnJvcjsKIAotCWlmICghKGlwLT5pX2RpLmRpX2ZsYWdzICYgR0ZTMl9ESUZfRUFfSU5ESVJFQ1QpKSB7CisJaWYgKCEoaXAtPmlfZGlza2ZsYWdzICYgR0ZTMl9ESUZfRUFfSU5ESVJFQ1QpKSB7CiAJCWVycm9yID0gZWFfZm9yZWFjaF9pKGlwLCBiaCwgZWFfY2FsbCwgZGF0YSk7CiAJCWdvdG8gb3V0OwogCX0KQEAgLTQxNCw3ICs0MTQsNyBAQAogCWlmIChlcnJvcikKIAkJcmV0dXJuIGVycm9yOwogCi0JaWYgKGlwLT5pX2RpLmRpX2VhdHRyKSB7CisJaWYgKGlwLT5pX2VhdHRyKSB7CiAJCXN0cnVjdCBlYV9saXN0IGVpID0geyAuZWlfZXIgPSBlciwgLmVpX3NpemUgPSAwIH07CiAKIAkJZXJyb3IgPSBlYV9mb3JlYWNoKGlwLCBlYV9saXN0X2ksICZlaSk7CkBAIC01MTQsNyArNTE0LDcgQEAKIAlzdHJ1Y3QgZ2ZzMl9lYV9sb2NhdGlvbiBlbDsKIAlpbnQgZXJyb3I7CiAKLQlpZiAoIWlwLT5pX2RpLmRpX2VhdHRyKQorCWlmICghaXAtPmlfZWF0dHIpCiAJCXJldHVybiAtRU5PREFUQTsKIAogCWVycm9yID0gZ2ZzMl9lYV9maW5kKGlwLCBlciwgJmVsKTsKQEAgLTc0MSw3ICs3NDEsNyBAQAogCWlmIChlcnJvcikKIAkJcmV0dXJuIGVycm9yOwogCi0JaXAtPmlfZGkuZGlfZWF0dHIgPSBiaC0+Yl9ibG9ja25yOworCWlwLT5pX2VhdHRyID0gYmgtPmJfYmxvY2tucjsKIAllcnJvciA9IGVhX3dyaXRlKGlwLCBHRlMyX0VBX0JIMkZJUlNUKGJoKSwgZXIpOwogCiAJYnJlbHNlKGJoKTsKQEAgLTkzNSwxMCArOTM1LDEwIEBACiAJaW50IGVycm9yOwogCWludCBtaF9zaXplID0gc2l6ZW9mKHN0cnVjdCBnZnMyX21ldGFfaGVhZGVyKTsKIAotCWlmIChpcC0+aV9kaS5kaV9mbGFncyAmIEdGUzJfRElGX0VBX0lORElSRUNUKSB7CisJaWYgKGlwLT5pX2Rpc2tmbGFncyAmIEdGUzJfRElGX0VBX0lORElSRUNUKSB7CiAJCV9fYmU2NCAqZW5kOwogCi0JCWVycm9yID0gZ2ZzMl9tZXRhX3JlYWQoaXAtPmlfZ2wsIGlwLT5pX2RpLmRpX2VhdHRyLCBESU9fV0FJVCwKKwkJZXJyb3IgPSBnZnMyX21ldGFfcmVhZChpcC0+aV9nbCwgaXAtPmlfZWF0dHIsIERJT19XQUlULAogCQkJCSAgICAgICAmaW5kYmgpOwogCQlpZiAoZXJyb3IpCiAJCQlyZXR1cm4gZXJyb3I7CkBAIC05NzIsOSArOTcyLDkgQEAKIAkJZ2ZzMl9idWZmZXJfY2xlYXJfdGFpbChpbmRiaCwgbWhfc2l6ZSk7CiAKIAkJZWFibGsgPSAoX19iZTY0ICopKGluZGJoLT5iX2RhdGEgKyBtaF9zaXplKTsKLQkJKmVhYmxrID0gY3B1X3RvX2JlNjQoaXAtPmlfZGkuZGlfZWF0dHIpOwotCQlpcC0+aV9kaS5kaV9lYXR0ciA9IGJsazsKLQkJaXAtPmlfZGkuZGlfZmxhZ3MgfD0gR0ZTMl9ESUZfRUFfSU5ESVJFQ1Q7CisJCSplYWJsayA9IGNwdV90b19iZTY0KGlwLT5pX2VhdHRyKTsKKwkJaXAtPmlfZWF0dHIgPSBibGs7CisJCWlwLT5pX2Rpc2tmbGFncyB8PSBHRlMyX0RJRl9FQV9JTkRJUkVDVDsKIAkJZ2ZzMl9hZGRfaW5vZGVfYmxvY2tzKCZpcC0+aV9pbm9kZSwgMSk7CiAKIAkJZWFibGsrKzsKQEAgLTEwMTUsNyArMTAxNSw3IEBACiAJaWYgKGVycm9yKQogCQlyZXR1cm4gZXJyb3I7CiAKLQlpZiAoIShpcC0+aV9kaS5kaV9mbGFncyAmIEdGUzJfRElGX0VBX0lORElSRUNUKSkKKwlpZiAoIShpcC0+aV9kaXNrZmxhZ3MgJiBHRlMyX0RJRl9FQV9JTkRJUkVDVCkpCiAJCWJsa3MrKzsKIAlpZiAoR0ZTMl9FQVJFUV9TSVpFX1NUVUZGRUQoZXIpID4gR0ZTMl9TQigmaXAtPmlfaW5vZGUpLT5zZF9qYnNpemUpCiAJCWJsa3MgKz0gRElWX1JPVU5EX1VQKGVyLT5lcl9kYXRhX2xlbiwgR0ZTMl9TQigmaXAtPmlfaW5vZGUpLT5zZF9qYnNpemUpOwpAQCAtMTA0MCw3ICsxMDQwLDcgQEAKIAlzdHJ1Y3QgZ2ZzMl9lYV9sb2NhdGlvbiBlbDsKIAlpbnQgZXJyb3I7CiAKLQlpZiAoIWlwLT5pX2RpLmRpX2VhdHRyKSB7CisJaWYgKCFpcC0+aV9lYXR0cikgewogCQlpZiAoZXItPmVyX2ZsYWdzICYgWEFUVFJfUkVQTEFDRSkKIAkJCXJldHVybiAtRU5PREFUQTsKIAkJcmV0dXJuIGVhX2luaXQoaXAsIGVyKTsKQEAgLTEwNTEsNyArMTA1MSw3IEBACiAJCXJldHVybiBlcnJvcjsKIAogCWlmIChlbC5lbF9lYSkgewotCQlpZiAoaXAtPmlfZGkuZGlfZmxhZ3MgJiBHRlMyX0RJRl9BUFBFTkRPTkxZKSB7CisJCWlmIChpcC0+aV9kaXNrZmxhZ3MgJiBHRlMyX0RJRl9BUFBFTkRPTkxZKSB7CiAJCQlicmVsc2UoZWwuZWxfYmgpOwogCQkJcmV0dXJuIC1FUEVSTTsKIAkJfQpAQCAtMTE0NSw3ICsxMTQ1LDcgQEAKIAlzdHJ1Y3QgZ2ZzMl9lYV9sb2NhdGlvbiBlbDsKIAlpbnQgZXJyb3I7CiAKLQlpZiAoIWlwLT5pX2RpLmRpX2VhdHRyKQorCWlmICghaXAtPmlfZWF0dHIpCiAJCXJldHVybiAtRU5PREFUQTsKIAogCWVycm9yID0gZ2ZzMl9lYV9maW5kKGlwLCBlciwgJmVsKTsKQEAgLTEzMDksNyArMTMwOSw3IEBACiAKIAltZW1zZXQoJnJsaXN0LCAwLCBzaXplb2Yoc3RydWN0IGdmczJfcmdycF9saXN0KSk7CiAKLQllcnJvciA9IGdmczJfbWV0YV9yZWFkKGlwLT5pX2dsLCBpcC0+aV9kaS5kaV9lYXR0ciwgRElPX1dBSVQsICZpbmRiaCk7CisJZXJyb3IgPSBnZnMyX21ldGFfcmVhZChpcC0+aV9nbCwgaXAtPmlfZWF0dHIsIERJT19XQUlULCAmaW5kYmgpOwogCWlmIChlcnJvcikKIAkJcmV0dXJuIGVycm9yOwogCkBAIC0xMzg4LDcgKzEzODgsNyBAQAogCWlmIChic3RhcnQpCiAJCWdmczJfZnJlZV9tZXRhKGlwLCBic3RhcnQsIGJsZW4pOwogCi0JaXAtPmlfZGkuZGlfZmxhZ3MgJj0gfkdGUzJfRElGX0VBX0lORElSRUNUOworCWlwLT5pX2Rpc2tmbGFncyAmPSB+R0ZTMl9ESUZfRUFfSU5ESVJFQ1Q7CiAKIAllcnJvciA9IGdmczJfbWV0YV9pbm9kZV9idWZmZXIoaXAsICZkaWJoKTsKIAlpZiAoIWVycm9yKSB7CkBAIC0xNDE2LDcgKzE0MTYsNyBAQAogCXN0cnVjdCBidWZmZXJfaGVhZCAqZGliaDsKIAlpbnQgZXJyb3I7CiAKLQlyZ2QgPSBnZnMyX2JsazJyZ3JwZChzZHAsIGlwLT5pX2RpLmRpX2VhdHRyKTsKKwlyZ2QgPSBnZnMyX2JsazJyZ3JwZChzZHAsIGlwLT5pX2VhdHRyKTsKIAlpZiAoIXJnZCkgewogCQlnZnMyX2NvbnNpc3RfaW5vZGUoaXApOwogCQlyZXR1cm4gLUVJTzsKQEAgLTE0MzIsOSArMTQzMiw5IEBACiAJaWYgKGVycm9yKQogCQlnb3RvIG91dF9ndW5sb2NrOwogCi0JZ2ZzMl9mcmVlX21ldGEoaXAsIGlwLT5pX2RpLmRpX2VhdHRyLCAxKTsKKwlnZnMyX2ZyZWVfbWV0YShpcCwgaXAtPmlfZWF0dHIsIDEpOwogCi0JaXAtPmlfZGkuZGlfZWF0dHIgPSAwOworCWlwLT5pX2VhdHRyID0gMDsKIAlnZnMyX2FkZF9pbm9kZV9ibG9ja3MoJmlwLT5pX2lub2RlLCAtMSk7CiAKIAllcnJvciA9IGdmczJfbWV0YV9pbm9kZV9idWZmZXIoaXAsICZkaWJoKTsKQEAgLTE0NzksNyArMTQ3OSw3IEBACiAJaWYgKGVycm9yKQogCQlnb3RvIG91dF9yaW5kZXg7CiAKLQlpZiAoaXAtPmlfZGkuZGlfZmxhZ3MgJiBHRlMyX0RJRl9FQV9JTkRJUkVDVCkgeworCWlmIChpcC0+aV9kaXNrZmxhZ3MgJiBHRlMyX0RJRl9FQV9JTkRJUkVDVCkgewogCQllcnJvciA9IGVhX2RlYWxsb2NfaW5kaXJlY3QoaXApOwogCQlpZiAoZXJyb3IpCiAJCQlnb3RvIG91dF9yaW5kZXg7CmRpZmYgLS1naXQgYS9mcy9nZnMyL2dsb2NrLmMgYi9mcy9nZnMyL2dsb2NrLmMKaW5kZXggYzk2MjI4My4uNmI5ODNhZSAxMDA2NDQKLS0tIGEvZnMvZ2ZzMi9nbG9jay5jCisrKyBiL2ZzL2dmczIvZ2xvY2suYwpAQCAtNDAsNiArNDAsNyBAQAogI2luY2x1ZGUgInF1b3RhLmgiCiAjaW5jbHVkZSAic3VwZXIuaCIKICNpbmNsdWRlICJ1dGlsLmgiCisjaW5jbHVkZSAiYm1hcC5oIgogCiBzdHJ1Y3QgZ2ZzMl9nbF9oYXNoX2J1Y2tldCB7CiAgICAgICAgIHN0cnVjdCBobGlzdF9oZWFkIGhiX2xpc3Q7CkBAIC02MSw5ICs2MiwxMCBAQAogCiBzdGF0aWMgREVDTEFSRV9SV1NFTShnZnMyX3Vtb3VudF9mbHVzaF9zZW0pOwogc3RhdGljIHN0cnVjdCBkZW50cnkgKmdmczJfcm9vdDsKLXN0YXRpYyBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnNjYW5kX3Byb2Nlc3M7Ci1zdGF0aWMgdW5zaWduZWQgaW50IHNjYW5kX3NlY3MgPSA1Owogc3RhdGljIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICpnbG9ja193b3JrcXVldWU7CitzdGF0aWMgTElTVF9IRUFEKGxydV9saXN0KTsKK3N0YXRpYyBhdG9taWNfdCBscnVfY291bnQgPSBBVE9NSUNfSU5JVCgwKTsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0sobHJ1X2xvY2spOwogCiAjZGVmaW5lIEdGUzJfR0xfSEFTSF9TSElGVCAgICAgIDE1CiAjZGVmaW5lIEdGUzJfR0xfSEFTSF9TSVpFICAgICAgICgxIDw8IEdGUzJfR0xfSEFTSF9TSElGVCkKQEAgLTE3NCw2ICsxNzYsMjIgQEAKIH0KIAogLyoqCisgKiBnZnMyX2dsb2NrX3NjaGVkdWxlX2Zvcl9yZWNsYWltIC0gQWRkIGEgZ2xvY2sgdG8gdGhlIHJlY2xhaW0gbGlzdAorICogQGdsOiB0aGUgZ2xvY2sKKyAqCisgKi8KKworc3RhdGljIHZvaWQgZ2ZzMl9nbG9ja19zY2hlZHVsZV9mb3JfcmVjbGFpbShzdHJ1Y3QgZ2ZzMl9nbG9jayAqZ2wpCit7CisJc3Bpbl9sb2NrKCZscnVfbG9jayk7CisJaWYgKGxpc3RfZW1wdHkoJmdsLT5nbF9scnUpICYmIGdsLT5nbF9zdGF0ZSAhPSBMTV9TVF9VTkxPQ0tFRCkgeworCQlsaXN0X2FkZF90YWlsKCZnbC0+Z2xfbHJ1LCAmbHJ1X2xpc3QpOworCQlhdG9taWNfaW5jKCZscnVfY291bnQpOworCX0KKwlzcGluX3VubG9jaygmbHJ1X2xvY2spOworfQorCisvKioKICAqIGdmczJfZ2xvY2tfcHV0KCkgLSBEZWNyZW1lbnQgcmVmZXJlbmNlIGNvdW50IG9uIGdsb2NrCiAgKiBAZ2w6IFRoZSBnbG9jayB0byBwdXQKICAqCkBAIC0xODcsMTQgKzIwNSwyMyBAQAogCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZnbC0+Z2xfcmVmKSkgewogCQlobGlzdF9kZWwoJmdsLT5nbF9saXN0KTsKIAkJd3JpdGVfdW5sb2NrKGdsX2xvY2tfYWRkcihnbC0+Z2xfaGFzaCkpOworCQlzcGluX2xvY2soJmxydV9sb2NrKTsKKwkJaWYgKCFsaXN0X2VtcHR5KCZnbC0+Z2xfbHJ1KSkgeworCQkJbGlzdF9kZWxfaW5pdCgmZ2wtPmdsX2xydSk7CisJCQlhdG9taWNfZGVjKCZscnVfY291bnQpOworCQl9CisJCXNwaW5fdW5sb2NrKCZscnVfbG9jayk7CiAJCUdMT0NLX0JVR19PTihnbCwgZ2wtPmdsX3N0YXRlICE9IExNX1NUX1VOTE9DS0VEKTsKLQkJR0xPQ0tfQlVHX09OKGdsLCAhbGlzdF9lbXB0eSgmZ2wtPmdsX3JlY2xhaW0pKTsKKwkJR0xPQ0tfQlVHX09OKGdsLCAhbGlzdF9lbXB0eSgmZ2wtPmdsX2xydSkpOwogCQlHTE9DS19CVUdfT04oZ2wsICFsaXN0X2VtcHR5KCZnbC0+Z2xfaG9sZGVycykpOwogCQlnbG9ja19mcmVlKGdsKTsKIAkJcnYgPSAxOwogCQlnb3RvIG91dDsKIAl9CiAJd3JpdGVfdW5sb2NrKGdsX2xvY2tfYWRkcihnbC0+Z2xfaGFzaCkpOworCS8qIDEgZm9yIGJlaW5nIGhhc2hlZCwgMSBmb3IgaGF2aW5nIHN0YXRlICE9IExNX1NUX1VOTE9DS0VEICovCisJaWYgKGF0b21pY19yZWFkKCZnbC0+Z2xfcmVmKSA9PSAyKQorCQlnZnMyX2dsb2NrX3NjaGVkdWxlX2Zvcl9yZWNsYWltKGdsKTsKIG91dDoKIAlyZXR1cm4gcnY7CiB9CkBAIC0yODksMTAgKzMxNiwxMyBAQAogICogZG9fcHJvbW90ZSAtIHByb21vdGUgYXMgbWFueSByZXF1ZXN0cyBhcyBwb3NzaWJsZSBvbiB0aGUgY3VycmVudCBxdWV1ZQogICogQGdsOiBUaGUgZ2xvY2sKICAqIAotICogUmV0dXJuczogdHJ1ZSBpZiB0aGVyZSBpcyBhIGJsb2NrZWQgaG9sZGVyIGF0IHRoZSBoZWFkIG9mIHRoZSBsaXN0CisgKiBSZXR1cm5zOiAxIGlmIHRoZXJlIGlzIGEgYmxvY2tlZCBob2xkZXIgYXQgdGhlIGhlYWQgb2YgdGhlIGxpc3QsIG9yIDIKKyAqICAgICAgICAgIGlmIGEgdHlwZSBzcGVjaWZpYyBvcGVyYXRpb24gaXMgdW5kZXJ3YXkuCiAgKi8KIAogc3RhdGljIGludCBkb19wcm9tb3RlKHN0cnVjdCBnZnMyX2dsb2NrICpnbCkKK19fcmVsZWFzZXMoJmdsLT5nbF9zcGluKQorX19hY3F1aXJlcygmZ2wtPmdsX3NwaW4pCiB7CiAJY29uc3Qgc3RydWN0IGdmczJfZ2xvY2tfb3BlcmF0aW9ucyAqZ2xvcHMgPSBnbC0+Z2xfb3BzOwogCXN0cnVjdCBnZnMyX2hvbGRlciAqZ2gsICp0bXA7CkBAIC0zMTAsNiArMzQwLDggQEAKIAkJCQlyZXQgPSBnbG9wcy0+Z29fbG9jayhnaCk7CiAJCQkJc3Bpbl9sb2NrKCZnbC0+Z2xfc3Bpbik7CiAJCQkJaWYgKHJldCkgeworCQkJCQlpZiAocmV0ID09IDEpCisJCQkJCQlyZXR1cm4gMjsKIAkJCQkJZ2gtPmdoX2Vycm9yID0gcmV0OwogCQkJCQlsaXN0X2RlbF9pbml0KCZnaC0+Z2hfbGlzdCk7CiAJCQkJCWdmczJfaG9sZGVyX3dha2UoZ2gpOwpAQCAtNDE0LDYgKzQ0Niw3IEBACiAJY29uc3Qgc3RydWN0IGdmczJfZ2xvY2tfb3BlcmF0aW9ucyAqZ2xvcHMgPSBnbC0+Z2xfb3BzOwogCXN0cnVjdCBnZnMyX2hvbGRlciAqZ2g7CiAJdW5zaWduZWQgc3RhdGUgPSByZXQgJiBMTV9PVVRfU1RfTUFTSzsKKwlpbnQgcnY7CiAKIAlzcGluX2xvY2soJmdsLT5nbF9zcGluKTsKIAlzdGF0ZV9jaGFuZ2UoZ2wsIHN0YXRlKTsKQEAgLTQ2OCw3ICs1MDEsNiBAQAogCQlnZnMyX2RlbW90ZV93YWtlKGdsKTsKIAlpZiAoc3RhdGUgIT0gTE1fU1RfVU5MT0NLRUQpIHsKIAkJaWYgKGdsb3BzLT5nb194bW90ZV9iaCkgewotCQkJaW50IHJ2OwogCQkJc3Bpbl91bmxvY2soJmdsLT5nbF9zcGluKTsKIAkJCXJ2ID0gZ2xvcHMtPmdvX3htb3RlX2JoKGdsLCBnaCk7CiAJCQlpZiAocnYgPT0gLUVBR0FJTikKQEAgLTQ3OSwxMCArNTExLDEzIEBACiAJCQkJZ290byBvdXQ7CiAJCQl9CiAJCX0KLQkJZG9fcHJvbW90ZShnbCk7CisJCXJ2ID0gZG9fcHJvbW90ZShnbCk7CisJCWlmIChydiA9PSAyKQorCQkJZ290byBvdXRfbG9ja2VkOwogCX0KIG91dDoKIAljbGVhcl9iaXQoR0xGX0xPQ0ssICZnbC0+Z2xfZmxhZ3MpOworb3V0X2xvY2tlZDoKIAlzcGluX3VubG9jaygmZ2wtPmdsX3NwaW4pOwogCWdmczJfZ2xvY2tfcHV0KGdsKTsKIH0KQEAgLTUxMSw2ICs1NDYsOCBAQAogICovCiAKIHN0YXRpYyB2b2lkIGRvX3htb3RlKHN0cnVjdCBnZnMyX2dsb2NrICpnbCwgc3RydWN0IGdmczJfaG9sZGVyICpnaCwgdW5zaWduZWQgaW50IHRhcmdldCkKK19fcmVsZWFzZXMoJmdsLT5nbF9zcGluKQorX19hY3F1aXJlcygmZ2wtPmdsX3NwaW4pCiB7CiAJY29uc3Qgc3RydWN0IGdmczJfZ2xvY2tfb3BlcmF0aW9ucyAqZ2xvcHMgPSBnbC0+Z2xfb3BzOwogCXN0cnVjdCBnZnMyX3NiZCAqc2RwID0gZ2wtPmdsX3NiZDsKQEAgLTU3Niw4ICs2MTMsMTEgQEAKICAqLwogCiBzdGF0aWMgdm9pZCBydW5fcXVldWUoc3RydWN0IGdmczJfZ2xvY2sgKmdsLCBjb25zdCBpbnQgbm9uYmxvY2spCitfX3JlbGVhc2VzKCZnbC0+Z2xfc3BpbikKK19fYWNxdWlyZXMoJmdsLT5nbF9zcGluKQogewogCXN0cnVjdCBnZnMyX2hvbGRlciAqZ2ggPSBOVUxMOworCWludCByZXQ7CiAKIAlpZiAodGVzdF9hbmRfc2V0X2JpdChHTEZfTE9DSywgJmdsLT5nbF9mbGFncykpCiAJCXJldHVybjsKQEAgLTU5Niw4ICs2MzYsMTEgQEAKIAl9IGVsc2UgewogCQlpZiAodGVzdF9iaXQoR0xGX0RFTU9URSwgJmdsLT5nbF9mbGFncykpCiAJCQlnZnMyX2RlbW90ZV93YWtlKGdsKTsKLQkJaWYgKGRvX3Byb21vdGUoZ2wpID09IDApCisJCXJldCA9IGRvX3Byb21vdGUoZ2wpOworCQlpZiAocmV0ID09IDApCiAJCQlnb3RvIG91dDsKKwkJaWYgKHJldCA9PSAyKQorCQkJcmV0dXJuOwogCQlnaCA9IGZpbmRfZmlyc3Rfd2FpdGVyKGdsKTsKIAkJZ2wtPmdsX3RhcmdldCA9IGdoLT5naF9zdGF0ZTsKIAkJaWYgKCEoZ2gtPmdoX2ZsYWdzICYgKExNX0ZMQUdfVFJZIHwgTE1fRkxBR19UUllfMUNCKSkpCkBAIC04MjAsNyArODYzLDcgQEAKICAqLwogCiBzdGF0aWMgdm9pZCBoYW5kbGVfY2FsbGJhY2soc3RydWN0IGdmczJfZ2xvY2sgKmdsLCB1bnNpZ25lZCBpbnQgc3RhdGUsCi0JCQkgICAgaW50IHJlbW90ZSwgdW5zaWduZWQgbG9uZyBkZWxheSkKKwkJCSAgICB1bnNpZ25lZCBsb25nIGRlbGF5KQogewogCWludCBiaXQgPSBkZWxheSA/IEdMRl9QRU5ESU5HX0RFTU9URSA6IEdMRl9ERU1PVEU7CiAKQEAgLTgyOCw5ICs4NzEsNiBAQAogCWlmIChnbC0+Z2xfZGVtb3RlX3N0YXRlID09IExNX1NUX0VYQ0xVU0lWRSkgewogCQlnbC0+Z2xfZGVtb3RlX3N0YXRlID0gc3RhdGU7CiAJCWdsLT5nbF9kZW1vdGVfdGltZSA9IGppZmZpZXM7Ci0JCWlmIChyZW1vdGUgJiYgZ2wtPmdsX29wcy0+Z29fdHlwZSA9PSBMTV9UWVBFX0lPUEVOICYmCi0JCSAgICBnbC0+Z2xfb2JqZWN0KQotCQkJZ2ZzMl9nbG9ja19zY2hlZHVsZV9mb3JfcmVjbGFpbShnbCk7CiAJfSBlbHNlIGlmIChnbC0+Z2xfZGVtb3RlX3N0YXRlICE9IExNX1NUX1VOTE9DS0VEICYmCiAJCQlnbC0+Z2xfZGVtb3RlX3N0YXRlICE9IHN0YXRlKSB7CiAJCWdsLT5nbF9kZW1vdGVfc3RhdGUgPSBMTV9TVF9VTkxPQ0tFRDsKQEAgLTg3Nyw2ICs5MTcsOCBAQAogICovCiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBhZGRfdG9fcXVldWUoc3RydWN0IGdmczJfaG9sZGVyICpnaCkKK19fcmVsZWFzZXMoJmdsLT5nbF9zcGluKQorX19hY3F1aXJlcygmZ2wtPmdsX3NwaW4pCiB7CiAJc3RydWN0IGdmczJfZ2xvY2sgKmdsID0gZ2gtPmdoX2dsOwogCXN0cnVjdCBnZnMyX3NiZCAqc2RwID0gZ2wtPmdsX3NiZDsKQEAgLTk5OCw3ICsxMDQwLDcgQEAKIAogCXNwaW5fbG9jaygmZ2wtPmdsX3NwaW4pOwogCWlmIChnaC0+Z2hfZmxhZ3MgJiBHTF9OT0NBQ0hFKQotCQloYW5kbGVfY2FsbGJhY2soZ2wsIExNX1NUX1VOTE9DS0VELCAwLCAwKTsKKwkJaGFuZGxlX2NhbGxiYWNrKGdsLCBMTV9TVF9VTkxPQ0tFRCwgMCk7CiAKIAlsaXN0X2RlbF9pbml0KCZnaC0+Z2hfbGlzdCk7CiAJaWYgKGZpbmRfZmlyc3RfaG9sZGVyKGdsKSA9PSBOVUxMKSB7CkBAIC0xMjY5LDEyICsxMzExLDI2IEBACiAJCWRlbGF5ID0gZ2wtPmdsX29wcy0+Z29fbWluX2hvbGRfdGltZTsKIAogCXNwaW5fbG9jaygmZ2wtPmdsX3NwaW4pOwotCWhhbmRsZV9jYWxsYmFjayhnbCwgc3RhdGUsIDEsIGRlbGF5KTsKKwloYW5kbGVfY2FsbGJhY2soZ2wsIHN0YXRlLCBkZWxheSk7CiAJc3Bpbl91bmxvY2soJmdsLT5nbF9zcGluKTsKIAlpZiAocXVldWVfZGVsYXllZF93b3JrKGdsb2NrX3dvcmtxdWV1ZSwgJmdsLT5nbF93b3JrLCBkZWxheSkgPT0gMCkKIAkJZ2ZzMl9nbG9ja19wdXQoZ2wpOwogfQogCitzdGF0aWMgdm9pZCBnZnMyX2pkZXNjX21ha2VfZGlydHkoc3RydWN0IGdmczJfc2JkICpzZHAsIHVuc2lnbmVkIGludCBqaWQpCit7CisJc3RydWN0IGdmczJfamRlc2MgKmpkOworCisJc3Bpbl9sb2NrKCZzZHAtPnNkX2ppbmRleF9zcGluKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGpkLCAmc2RwLT5zZF9qaW5kZXhfbGlzdCwgamRfbGlzdCkgeworCQlpZiAoamQtPmpkX2ppZCAhPSBqaWQpCisJCQljb250aW51ZTsKKwkJamQtPmpkX2RpcnR5ID0gMTsKKwkJYnJlYWs7CisJfQorCXNwaW5fdW5sb2NrKCZzZHAtPnNkX2ppbmRleF9zcGluKTsKK30KKwogLyoqCiAgKiBnZnMyX2dsb2NrX2NiIC0gQ2FsbGJhY2sgdXNlZCBieSBsb2NraW5nIG1vZHVsZQogICogQHNkcDogUG9pbnRlciB0byB0aGUgc3VwZXJibG9jawpAQCAtMTMzOCw4MCArMTM5NCw4MyBAQAogICogUmV0dXJuczogMSBpZiBpdCdzIG9rCiAgKi8KIAotc3RhdGljIGludCBkZW1vdGVfb2soc3RydWN0IGdmczJfZ2xvY2sgKmdsKQorc3RhdGljIGludCBkZW1vdGVfb2soY29uc3Qgc3RydWN0IGdmczJfZ2xvY2sgKmdsKQogewogCWNvbnN0IHN0cnVjdCBnZnMyX2dsb2NrX29wZXJhdGlvbnMgKmdsb3BzID0gZ2wtPmdsX29wczsKLQlpbnQgZGVtb3RlID0gMTsKIAotCWlmICh0ZXN0X2JpdChHTEZfU1RJQ0tZLCAmZ2wtPmdsX2ZsYWdzKSkKLQkJZGVtb3RlID0gMDsKLQllbHNlIGlmIChnbG9wcy0+Z29fZGVtb3RlX29rKQotCQlkZW1vdGUgPSBnbG9wcy0+Z29fZGVtb3RlX29rKGdsKTsKLQotCXJldHVybiBkZW1vdGU7CisJaWYgKGdsLT5nbF9zdGF0ZSA9PSBMTV9TVF9VTkxPQ0tFRCkKKwkJcmV0dXJuIDA7CisJaWYgKCFsaXN0X2VtcHR5KCZnbC0+Z2xfaG9sZGVycykpCisJCXJldHVybiAwOworCWlmIChnbG9wcy0+Z29fZGVtb3RlX29rKQorCQlyZXR1cm4gZ2xvcHMtPmdvX2RlbW90ZV9vayhnbCk7CisJcmV0dXJuIDE7CiB9CiAKLS8qKgotICogZ2ZzMl9nbG9ja19zY2hlZHVsZV9mb3JfcmVjbGFpbSAtIEFkZCBhIGdsb2NrIHRvIHRoZSByZWNsYWltIGxpc3QKLSAqIEBnbDogdGhlIGdsb2NrCi0gKgotICovCiAKLXZvaWQgZ2ZzMl9nbG9ja19zY2hlZHVsZV9mb3JfcmVjbGFpbShzdHJ1Y3QgZ2ZzMl9nbG9jayAqZ2wpCi17Ci0Jc3RydWN0IGdmczJfc2JkICpzZHAgPSBnbC0+Z2xfc2JkOwotCi0Jc3Bpbl9sb2NrKCZzZHAtPnNkX3JlY2xhaW1fbG9jayk7Ci0JaWYgKGxpc3RfZW1wdHkoJmdsLT5nbF9yZWNsYWltKSkgewotCQlnZnMyX2dsb2NrX2hvbGQoZ2wpOwotCQlsaXN0X2FkZCgmZ2wtPmdsX3JlY2xhaW0sICZzZHAtPnNkX3JlY2xhaW1fbGlzdCk7Ci0JCWF0b21pY19pbmMoJnNkcC0+c2RfcmVjbGFpbV9jb3VudCk7Ci0JCXNwaW5fdW5sb2NrKCZzZHAtPnNkX3JlY2xhaW1fbG9jayk7Ci0JCXdha2VfdXAoJnNkcC0+c2RfcmVjbGFpbV93cSk7Ci0JfSBlbHNlCi0JCXNwaW5fdW5sb2NrKCZzZHAtPnNkX3JlY2xhaW1fbG9jayk7Ci19Ci0KLS8qKgotICogZ2ZzMl9yZWNsYWltX2dsb2NrIC0gcHJvY2VzcyB0aGUgbmV4dCBnbG9jayBvbiB0aGUgZmlsZXN5c3RlbSdzIHJlY2xhaW0gbGlzdAotICogQHNkcDogdGhlIGZpbGVzeXN0ZW0KLSAqCi0gKiBDYWxsZWQgZnJvbSBnZnMyX2dsb2NrZCgpIGdsb2NrIHJlY2xhaW0gZGFlbW9uLCBvciB3aGVuIHByb21vdGluZyBhCi0gKiBkaWZmZXJlbnQgZ2xvY2sgYW5kIHdlIG5vdGljZSB0aGF0IHRoZXJlIGFyZSBhIGxvdCBvZiBnbG9ja3MgaW4gdGhlCi0gKiByZWNsYWltIGxpc3QuCi0gKgotICovCi0KLXZvaWQgZ2ZzMl9yZWNsYWltX2dsb2NrKHN0cnVjdCBnZnMyX3NiZCAqc2RwKQorc3RhdGljIGludCBnZnMyX3Nocmlua19nbG9ja19tZW1vcnkoaW50IG5yLCBnZnBfdCBnZnBfbWFzaykKIHsKIAlzdHJ1Y3QgZ2ZzMl9nbG9jayAqZ2w7Ci0JaW50IGRvbmVfY2FsbGJhY2sgPSAwOworCWludCBtYXlfZGVtb3RlOworCWludCBucl9za2lwcGVkID0gMDsKKwlpbnQgZ290X3JlZiA9IDA7CisJTElTVF9IRUFEKHNraXBwZWQpOwogCi0Jc3Bpbl9sb2NrKCZzZHAtPnNkX3JlY2xhaW1fbG9jayk7Ci0JaWYgKGxpc3RfZW1wdHkoJnNkcC0+c2RfcmVjbGFpbV9saXN0KSkgewotCQlzcGluX3VubG9jaygmc2RwLT5zZF9yZWNsYWltX2xvY2spOwotCQlyZXR1cm47CisJaWYgKG5yID09IDApCisJCWdvdG8gb3V0OworCisJaWYgKCEoZ2ZwX21hc2sgJiBfX0dGUF9GUykpCisJCXJldHVybiAtMTsKKworCXNwaW5fbG9jaygmbHJ1X2xvY2spOworCXdoaWxlKG5yICYmICFsaXN0X2VtcHR5KCZscnVfbGlzdCkpIHsKKwkJZ2wgPSBsaXN0X2VudHJ5KGxydV9saXN0Lm5leHQsIHN0cnVjdCBnZnMyX2dsb2NrLCBnbF9scnUpOworCQlsaXN0X2RlbF9pbml0KCZnbC0+Z2xfbHJ1KTsKKwkJYXRvbWljX2RlYygmbHJ1X2NvdW50KTsKKworCQkvKiBUZXN0IGZvciBiZWluZyBkZW1vdGFibGUgKi8KKwkJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KEdMRl9MT0NLLCAmZ2wtPmdsX2ZsYWdzKSkgeworCQkJZ2ZzMl9nbG9ja19ob2xkKGdsKTsKKwkJCWdvdF9yZWYgPSAxOworCQkJc3Bpbl91bmxvY2soJmxydV9sb2NrKTsKKwkJCXNwaW5fbG9jaygmZ2wtPmdsX3NwaW4pOworCQkJbWF5X2RlbW90ZSA9IGRlbW90ZV9vayhnbCk7CisJCQlzcGluX3VubG9jaygmZ2wtPmdsX3NwaW4pOworCQkJY2xlYXJfYml0KEdMRl9MT0NLLCAmZ2wtPmdsX2ZsYWdzKTsKKwkJCWlmIChtYXlfZGVtb3RlKSB7CisJCQkJaGFuZGxlX2NhbGxiYWNrKGdsLCBMTV9TVF9VTkxPQ0tFRCwgMCk7CisJCQkJbnItLTsKKwkJCQlpZiAocXVldWVfZGVsYXllZF93b3JrKGdsb2NrX3dvcmtxdWV1ZSwgJmdsLT5nbF93b3JrLCAwKSA9PSAwKQorCQkJCQlnZnMyX2dsb2NrX3B1dChnbCk7CisJCQl9CisJCQlzcGluX2xvY2soJmxydV9sb2NrKTsKKwkJCWlmIChtYXlfZGVtb3RlKQorCQkJCWNvbnRpbnVlOworCQl9CisJCWlmIChsaXN0X2VtcHR5KCZnbC0+Z2xfbHJ1KSAmJgorCQkgICAgKGF0b21pY19yZWFkKCZnbC0+Z2xfcmVmKSA8PSAoMiArIGdvdF9yZWYpKSkgeworCQkJbnJfc2tpcHBlZCsrOworCQkJbGlzdF9hZGQoJmdsLT5nbF9scnUsICZza2lwcGVkKTsKKwkJfQorCQlpZiAoZ290X3JlZikgeworCQkJc3Bpbl91bmxvY2soJmxydV9sb2NrKTsKKwkJCWdmczJfZ2xvY2tfcHV0KGdsKTsKKwkJCXNwaW5fbG9jaygmbHJ1X2xvY2spOworCQkJZ290X3JlZiA9IDA7CisJCX0KIAl9Ci0JZ2wgPSBsaXN0X2VudHJ5KHNkcC0+c2RfcmVjbGFpbV9saXN0Lm5leHQsCi0JCQlzdHJ1Y3QgZ2ZzMl9nbG9jaywgZ2xfcmVjbGFpbSk7Ci0JbGlzdF9kZWxfaW5pdCgmZ2wtPmdsX3JlY2xhaW0pOwotCXNwaW5fdW5sb2NrKCZzZHAtPnNkX3JlY2xhaW1fbG9jayk7Ci0KLQlhdG9taWNfZGVjKCZzZHAtPnNkX3JlY2xhaW1fY291bnQpOwotCWF0b21pY19pbmMoJnNkcC0+c2RfcmVjbGFpbWVkKTsKLQotCXNwaW5fbG9jaygmZ2wtPmdsX3NwaW4pOwotCWlmIChmaW5kX2ZpcnN0X2hvbGRlcihnbCkgPT0gTlVMTCAmJgotCSAgICBnbC0+Z2xfc3RhdGUgIT0gTE1fU1RfVU5MT0NLRUQgJiYgZGVtb3RlX29rKGdsKSkgewotCQloYW5kbGVfY2FsbGJhY2soZ2wsIExNX1NUX1VOTE9DS0VELCAwLCAwKTsKLQkJZG9uZV9jYWxsYmFjayA9IDE7Ci0JfQotCXNwaW5fdW5sb2NrKCZnbC0+Z2xfc3Bpbik7Ci0JaWYgKCFkb25lX2NhbGxiYWNrIHx8Ci0JICAgIHF1ZXVlX2RlbGF5ZWRfd29yayhnbG9ja193b3JrcXVldWUsICZnbC0+Z2xfd29yaywgMCkgPT0gMCkKLQkJZ2ZzMl9nbG9ja19wdXQoZ2wpOworCWxpc3Rfc3BsaWNlKCZza2lwcGVkLCAmbHJ1X2xpc3QpOworCWF0b21pY19hZGQobnJfc2tpcHBlZCwgJmxydV9jb3VudCk7CisJc3Bpbl91bmxvY2soJmxydV9sb2NrKTsKK291dDoKKwlyZXR1cm4gKGF0b21pY19yZWFkKCZscnVfY291bnQpIC8gMTAwKSAqIHN5c2N0bF92ZnNfY2FjaGVfcHJlc3N1cmU7CiB9CiAKK3N0YXRpYyBzdHJ1Y3Qgc2hyaW5rZXIgZ2xvY2tfc2hyaW5rZXIgPSB7CisJLnNocmluayA9IGdmczJfc2hyaW5rX2dsb2NrX21lbW9yeSwKKwkuc2Vla3MgPSBERUZBVUxUX1NFRUtTLAorfTsKKwogLyoqCiAgKiBleGFtaW5lX2J1Y2tldCAtIENhbGwgYSBmdW5jdGlvbiBmb3IgZ2xvY2sgaW4gYSBoYXNoIGJ1Y2tldAogICogQGV4YW1pbmVyOiB0aGUgZnVuY3Rpb24KQEAgLTE0NTcsMjYgKzE1MTYsNiBAQAogfQogCiAvKioKLSAqIHNjYW5fZ2xvY2sgLSBsb29rIGF0IGEgZ2xvY2sgYW5kIHNlZSBpZiB3ZSBjYW4gcmVjbGFpbSBpdAotICogQGdsOiB0aGUgZ2xvY2sgdG8gbG9vayBhdAotICoKLSAqLwotCi1zdGF0aWMgdm9pZCBzY2FuX2dsb2NrKHN0cnVjdCBnZnMyX2dsb2NrICpnbCkKLXsKLQlpZiAoZ2wtPmdsX29wcyA9PSAmZ2ZzMl9pbm9kZV9nbG9wcyAmJiBnbC0+Z2xfb2JqZWN0KQotCQlyZXR1cm47Ci0JaWYgKHRlc3RfYml0KEdMRl9MT0NLLCAmZ2wtPmdsX2ZsYWdzKSkKLQkJcmV0dXJuOwotCi0Jc3Bpbl9sb2NrKCZnbC0+Z2xfc3Bpbik7Ci0JaWYgKGZpbmRfZmlyc3RfaG9sZGVyKGdsKSA9PSBOVUxMICYmCi0JICAgIGdsLT5nbF9zdGF0ZSAhPSBMTV9TVF9VTkxPQ0tFRCAmJiBkZW1vdGVfb2soZ2wpKQotCQlnZnMyX2dsb2NrX3NjaGVkdWxlX2Zvcl9yZWNsYWltKGdsKTsKLQlzcGluX3VubG9jaygmZ2wtPmdsX3NwaW4pOwotfQotCi0vKioKICAqIGNsZWFyX2dsb2NrIC0gbG9vayBhdCBhIGdsb2NrIGFuZCBzZWUgaWYgd2UgY2FuIGZyZWUgaXQgZnJvbSBnbG9jayBjYWNoZQogICogQGdsOiB0aGUgZ2xvY2sgdG8gbG9vayBhdAogICoKQEAgLTE0ODQsMjMgKzE1MjMsMTYgQEAKIAogc3RhdGljIHZvaWQgY2xlYXJfZ2xvY2soc3RydWN0IGdmczJfZ2xvY2sgKmdsKQogewotCXN0cnVjdCBnZnMyX3NiZCAqc2RwID0gZ2wtPmdsX3NiZDsKLQlpbnQgcmVsZWFzZWQ7Ci0KLQlzcGluX2xvY2soJnNkcC0+c2RfcmVjbGFpbV9sb2NrKTsKLQlpZiAoIWxpc3RfZW1wdHkoJmdsLT5nbF9yZWNsYWltKSkgewotCQlsaXN0X2RlbF9pbml0KCZnbC0+Z2xfcmVjbGFpbSk7Ci0JCWF0b21pY19kZWMoJnNkcC0+c2RfcmVjbGFpbV9jb3VudCk7Ci0JCXNwaW5fdW5sb2NrKCZzZHAtPnNkX3JlY2xhaW1fbG9jayk7Ci0JCXJlbGVhc2VkID0gZ2ZzMl9nbG9ja19wdXQoZ2wpOwotCQlnZnMyX2Fzc2VydChzZHAsICFyZWxlYXNlZCk7Ci0JfSBlbHNlIHsKLQkJc3Bpbl91bmxvY2soJnNkcC0+c2RfcmVjbGFpbV9sb2NrKTsKKwlzcGluX2xvY2soJmxydV9sb2NrKTsKKwlpZiAoIWxpc3RfZW1wdHkoJmdsLT5nbF9scnUpKSB7CisJCWxpc3RfZGVsX2luaXQoJmdsLT5nbF9scnUpOworCQlhdG9taWNfZGVjKCZscnVfY291bnQpOwogCX0KKwlzcGluX3VubG9jaygmbHJ1X2xvY2spOwogCiAJc3Bpbl9sb2NrKCZnbC0+Z2xfc3Bpbik7CiAJaWYgKGZpbmRfZmlyc3RfaG9sZGVyKGdsKSA9PSBOVUxMICYmIGdsLT5nbF9zdGF0ZSAhPSBMTV9TVF9VTkxPQ0tFRCkKLQkJaGFuZGxlX2NhbGxiYWNrKGdsLCBMTV9TVF9VTkxPQ0tFRCwgMCwgMCk7CisJCWhhbmRsZV9jYWxsYmFjayhnbCwgTE1fU1RfVU5MT0NLRUQsIDApOwogCXNwaW5fdW5sb2NrKCZnbC0+Z2xfc3Bpbik7CiAJZ2ZzMl9nbG9ja19ob2xkKGdsKTsKIAlpZiAocXVldWVfZGVsYXllZF93b3JrKGdsb2NrX3dvcmtxdWV1ZSwgJmdsLT5nbF93b3JrLCAwKSA9PSAwKQpAQCAtMTU0OCw2ICsxNTgwLDIwIEBACiAJfQogfQogCit2b2lkIGdmczJfZ2xvY2tfZmluaXNoX3RydW5jYXRlKHN0cnVjdCBnZnMyX2lub2RlICppcCkKK3sKKwlzdHJ1Y3QgZ2ZzMl9nbG9jayAqZ2wgPSBpcC0+aV9nbDsKKwlpbnQgcmV0OworCisJcmV0ID0gZ2ZzMl90cnVuY2F0ZWlfcmVzdW1lKGlwKTsKKwlnZnMyX2Fzc2VydF93aXRoZHJhdyhnbC0+Z2xfc2JkLCByZXQgPT0gMCk7CisKKwlzcGluX2xvY2soJmdsLT5nbF9zcGluKTsKKwljbGVhcl9iaXQoR0xGX0xPQ0ssICZnbC0+Z2xfZmxhZ3MpOworCXJ1bl9xdWV1ZShnbCwgMSk7CisJc3Bpbl91bmxvY2soJmdsLT5nbF9zcGluKTsKK30KKwogc3RhdGljIGNvbnN0IGNoYXIgKnN0YXRlMnN0cih1bnNpZ25lZCBzdGF0ZSkKIHsKIAlzd2l0Y2goc3RhdGUpIHsKQEAgLTE2MjMsOCArMTY2OSw2IEBACiAJY2hhciAqcCA9IGJ1ZjsKIAlpZiAodGVzdF9iaXQoR0xGX0xPQ0ssIGdmbGFncykpCiAJCSpwKysgPSAnbCc7Ci0JaWYgKHRlc3RfYml0KEdMRl9TVElDS1ksIGdmbGFncykpCi0JCSpwKysgPSAncyc7CiAJaWYgKHRlc3RfYml0KEdMRl9ERU1PVEUsIGdmbGFncykpCiAJCSpwKysgPSAnRCc7CiAJaWYgKHRlc3RfYml0KEdMRl9QRU5ESU5HX0RFTU9URSwgZ2ZsYWdzKSkKQEAgLTE3NDMsMzQgKzE3ODcsNiBAQAogCXJldHVybiBlcnJvcjsKIH0KIAotLyoqCi0gKiBnZnMyX3NjYW5kIC0gTG9vayBmb3IgY2FjaGVkIGdsb2NrcyBhbmQgaW5vZGVzIHRvIHRvc3MgZnJvbSBtZW1vcnkKLSAqIEBzZHA6IFBvaW50ZXIgdG8gR0ZTMiBzdXBlcmJsb2NrCi0gKgotICogT25lIG9mIHRoZXNlIGRhZW1vbnMgcnVucywgZmluZGluZyBjYW5kaWRhdGVzIHRvIGFkZCB0byBzZF9yZWNsYWltX2xpc3QuCi0gKiBTZWUgZ2ZzMl9nbG9ja2QoKQotICovCi0KLXN0YXRpYyBpbnQgZ2ZzMl9zY2FuZCh2b2lkICpkYXRhKQotewotCXVuc2lnbmVkIHg7Ci0JdW5zaWduZWQgZGVsYXk7Ci0KLQl3aGlsZSAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSkgewotCQlmb3IgKHggPSAwOyB4IDwgR0ZTMl9HTF9IQVNIX1NJWkU7IHgrKykKLQkJCWV4YW1pbmVfYnVja2V0KHNjYW5fZ2xvY2ssIE5VTEwsIHgpOwotCQlpZiAoZnJlZXppbmcoY3VycmVudCkpCi0JCQlyZWZyaWdlcmF0b3IoKTsKLQkJZGVsYXkgPSBzY2FuZF9zZWNzOwotCQlpZiAoZGVsYXkgPCAxKQotCQkJZGVsYXkgPSAxOwotCQlzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUoZGVsYXkgKiBIWik7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLQogCiBpbnQgX19pbml0IGdmczJfZ2xvY2tfaW5pdCh2b2lkKQogewpAQCAtMTc4NCwyOCArMTgwMCwyMSBAQAogCX0KICNlbmRpZgogCi0Jc2NhbmRfcHJvY2VzcyA9IGt0aHJlYWRfcnVuKGdmczJfc2NhbmQsIE5VTEwsICJnZnMyX3NjYW5kIik7Ci0JaWYgKElTX0VSUihzY2FuZF9wcm9jZXNzKSkKLQkJcmV0dXJuIFBUUl9FUlIoc2NhbmRfcHJvY2Vzcyk7Ci0KIAlnbG9ja193b3JrcXVldWUgPSBjcmVhdGVfd29ya3F1ZXVlKCJnbG9ja193b3JrcXVldWUiKTsKLQlpZiAoSVNfRVJSKGdsb2NrX3dvcmtxdWV1ZSkpIHsKLQkJa3RocmVhZF9zdG9wKHNjYW5kX3Byb2Nlc3MpOworCWlmIChJU19FUlIoZ2xvY2tfd29ya3F1ZXVlKSkKIAkJcmV0dXJuIFBUUl9FUlIoZ2xvY2tfd29ya3F1ZXVlKTsKLQl9CisKKwlyZWdpc3Rlcl9zaHJpbmtlcigmZ2xvY2tfc2hyaW5rZXIpOwogCiAJcmV0dXJuIDA7CiB9CiAKIHZvaWQgZ2ZzMl9nbG9ja19leGl0KHZvaWQpCiB7CisJdW5yZWdpc3Rlcl9zaHJpbmtlcigmZ2xvY2tfc2hyaW5rZXIpOwogCWRlc3Ryb3lfd29ya3F1ZXVlKGdsb2NrX3dvcmtxdWV1ZSk7Ci0Ja3RocmVhZF9zdG9wKHNjYW5kX3Byb2Nlc3MpOwogfQogCi1tb2R1bGVfcGFyYW0oc2NhbmRfc2VjcywgdWludCwgU19JUlVHT3xTX0lXVVNSKTsKLU1PRFVMRV9QQVJNX0RFU0Moc2NhbmRfc2VjcywgIlRoZSBudW1iZXIgb2Ygc2Vjb25kcyBiZXR3ZWVuIHNjYW5kIHJ1bnMiKTsKLQogc3RhdGljIGludCBnZnMyX2dsb2NrX2l0ZXJfbmV4dChzdHJ1Y3QgZ2ZzMl9nbG9ja19pdGVyICpnaSkKIHsKIAlzdHJ1Y3QgZ2ZzMl9nbG9jayAqZ2w7CmRpZmYgLS1naXQgYS9mcy9nZnMyL2dsb2NrLmggYi9mcy9nZnMyL2dsb2NrLmgKaW5kZXggNjk1YzZiMS4uNTQzZWM3ZSAxMDA2NDQKLS0tIGEvZnMvZ2ZzMi9nbG9jay5oCisrKyBiL2ZzL2dmczIvZ2xvY2suaApAQCAtMTI5LDkgKzEyOSw5IEBACiB2b2lkIGdmczJfbHZiX3VuaG9sZChzdHJ1Y3QgZ2ZzMl9nbG9jayAqZ2wpOwogCiB2b2lkIGdmczJfZ2xvY2tfY2Iodm9pZCAqY2JfZGF0YSwgdW5zaWduZWQgaW50IHR5cGUsIHZvaWQgKmRhdGEpOwotdm9pZCBnZnMyX2dsb2NrX3NjaGVkdWxlX2Zvcl9yZWNsYWltKHN0cnVjdCBnZnMyX2dsb2NrICpnbCk7CiB2b2lkIGdmczJfcmVjbGFpbV9nbG9jayhzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCk7CiB2b2lkIGdmczJfZ2xfaGFzaF9jbGVhcihzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCk7Cit2b2lkIGdmczJfZ2xvY2tfZmluaXNoX3RydW5jYXRlKHN0cnVjdCBnZnMyX2lub2RlICppcCk7CiAKIGludCBfX2luaXQgZ2ZzMl9nbG9ja19pbml0KHZvaWQpOwogdm9pZCBnZnMyX2dsb2NrX2V4aXQodm9pZCk7CmRpZmYgLS1naXQgYS9mcy9nZnMyL2dsb3BzLmMgYi9mcy9nZnMyL2dsb3BzLmMKaW5kZXggYzZjMzE4Yy4uODUyMmQzYSAxMDA2NDQKLS0tIGEvZnMvZ2ZzMi9nbG9wcy5jCisrKyBiL2ZzL2dmczIvZ2xvcHMuYwpAQCAtMjAxLDE5ICsyMDEsMTIgQEAKICAqIFJldHVybnM6IDEgaWYgaXQncyBvawogICovCiAKLXN0YXRpYyBpbnQgaW5vZGVfZ29fZGVtb3RlX29rKHN0cnVjdCBnZnMyX2dsb2NrICpnbCkKK3N0YXRpYyBpbnQgaW5vZGVfZ29fZGVtb3RlX29rKGNvbnN0IHN0cnVjdCBnZnMyX2dsb2NrICpnbCkKIHsKIAlzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCA9IGdsLT5nbF9zYmQ7Ci0JaW50IGRlbW90ZSA9IDA7Ci0KLQlpZiAoIWdsLT5nbF9vYmplY3QgJiYgIWdsLT5nbF9hc3BhY2UtPmlfbWFwcGluZy0+bnJwYWdlcykKLQkJZGVtb3RlID0gMTsKLQllbHNlIGlmICghc2RwLT5zZF9hcmdzLmFyX2xvY2FsY2FjaGluZyAmJgotCQkgdGltZV9hZnRlcl9lcShqaWZmaWVzLCBnbC0+Z2xfc3RhbXAgKwotCQkJICAgICAgIGdmczJfdHVuZV9nZXQoc2RwLCBndF9kZW1vdGVfc2VjcykgKiBIWikpCi0JCWRlbW90ZSA9IDE7Ci0KLQlyZXR1cm4gZGVtb3RlOworCWlmIChzZHAtPnNkX2ppbmRleCA9PSBnbC0+Z2xfb2JqZWN0IHx8IHNkcC0+c2RfcmluZGV4ID09IGdsLT5nbF9vYmplY3QpCisJCXJldHVybiAwOworCXJldHVybiAxOwogfQogCiAvKioKQEAgLTIyNyw2ICsyMjAsNyBAQAogc3RhdGljIGludCBpbm9kZV9nb19sb2NrKHN0cnVjdCBnZnMyX2hvbGRlciAqZ2gpCiB7CiAJc3RydWN0IGdmczJfZ2xvY2sgKmdsID0gZ2gtPmdoX2dsOworCXN0cnVjdCBnZnMyX3NiZCAqc2RwID0gZ2wtPmdsX3NiZDsKIAlzdHJ1Y3QgZ2ZzMl9pbm9kZSAqaXAgPSBnbC0+Z2xfb2JqZWN0OwogCWludCBlcnJvciA9IDA7CiAKQEAgLTIzOSwxMCArMjMzLDE2IEBACiAJCQlyZXR1cm4gZXJyb3I7CiAJfQogCi0JaWYgKChpcC0+aV9kaS5kaV9mbGFncyAmIEdGUzJfRElGX1RSVU5DX0lOX1BST0cpICYmCisJaWYgKChpcC0+aV9kaXNrZmxhZ3MgJiBHRlMyX0RJRl9UUlVOQ19JTl9QUk9HKSAmJgogCSAgICAoZ2wtPmdsX3N0YXRlID09IExNX1NUX0VYQ0xVU0lWRSkgJiYKLQkgICAgKGdoLT5naF9zdGF0ZSA9PSBMTV9TVF9FWENMVVNJVkUpKQotCQllcnJvciA9IGdmczJfdHJ1bmNhdGVpX3Jlc3VtZShpcCk7CisJICAgIChnaC0+Z2hfc3RhdGUgPT0gTE1fU1RfRVhDTFVTSVZFKSkgeworCQlzcGluX2xvY2soJnNkcC0+c2RfdHJ1bmNfbG9jayk7CisJCWlmIChsaXN0X2VtcHR5KCZpcC0+aV90cnVuY19saXN0KSkKKwkJCWxpc3RfYWRkKCZzZHAtPnNkX3RydW5jX2xpc3QsICZpcC0+aV90cnVuY19saXN0KTsKKwkJc3Bpbl91bmxvY2soJnNkcC0+c2RfdHJ1bmNfbG9jayk7CisJCXdha2VfdXAoJnNkcC0+c2RfcXVvdGFfd2FpdCk7CisJCXJldHVybiAxOworCX0KIAogCXJldHVybiBlcnJvcjsKIH0KQEAgLTI2MCwxMCArMjYwLDEzIEBACiAJY29uc3Qgc3RydWN0IGdmczJfaW5vZGUgKmlwID0gZ2wtPmdsX29iamVjdDsKIAlpZiAoaXAgPT0gTlVMTCkKIAkJcmV0dXJuIDA7Ci0JZ2ZzMl9wcmludF9kYmcoc2VxLCAiIEk6IG46JWxsdS8lbGx1IHQ6JXUgZjoweCUwOGx4XG4iLAorCWdmczJfcHJpbnRfZGJnKHNlcSwgIiBJOiBuOiVsbHUvJWxsdSB0OiV1IGY6MHglMDJseCBkOjB4JTA4eCBzOiVsbHUvJWxsdVxuIiwKIAkJICAodW5zaWduZWQgbG9uZyBsb25nKWlwLT5pX25vX2Zvcm1hbF9pbm8sCiAJCSAgKHVuc2lnbmVkIGxvbmcgbG9uZylpcC0+aV9ub19hZGRyLAotCQkgIElGMkRUKGlwLT5pX2lub2RlLmlfbW9kZSksIGlwLT5pX2ZsYWdzKTsKKwkJICBJRjJEVChpcC0+aV9pbm9kZS5pX21vZGUpLCBpcC0+aV9mbGFncywKKwkJICAodW5zaWduZWQgaW50KWlwLT5pX2Rpc2tmbGFncywKKwkJICAodW5zaWduZWQgbG9uZyBsb25nKWlwLT5pX2lub2RlLmlfc2l6ZSwKKwkJICAodW5zaWduZWQgbG9uZyBsb25nKWlwLT5pX2Rpc2tzaXplKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjc0LDcgKzI3Nyw3IEBACiAgKiBSZXR1cm5zOiAxIGlmIGl0J3Mgb2sKICAqLwogCi1zdGF0aWMgaW50IHJncnBfZ29fZGVtb3RlX29rKHN0cnVjdCBnZnMyX2dsb2NrICpnbCkKK3N0YXRpYyBpbnQgcmdycF9nb19kZW1vdGVfb2soY29uc3Qgc3RydWN0IGdmczJfZ2xvY2sgKmdsKQogewogCXJldHVybiAhZ2wtPmdsX2FzcGFjZS0+aV9tYXBwaW5nLT5ucnBhZ2VzOwogfQpAQCAtMzE4LDcgKzMyMSw5IEBACiAJY29uc3Qgc3RydWN0IGdmczJfcmdycGQgKnJnZCA9IGdsLT5nbF9vYmplY3Q7CiAJaWYgKHJnZCA9PSBOVUxMKQogCQlyZXR1cm4gMDsKLQlnZnMyX3ByaW50X2RiZyhzZXEsICIgUjogbjolbGx1XG4iLCAodW5zaWduZWQgbG9uZyBsb25nKXJnZC0+cmRfYWRkcik7CisJZ2ZzMl9wcmludF9kYmcoc2VxLCAiIFI6IG46JWxsdSBmOiUwMnggYjoldS8ldSBpOiV1XG4iLAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylyZ2QtPnJkX2FkZHIsIHJnZC0+cmRfZmxhZ3MsCisJCSAgICAgICByZ2QtPnJkX2ZyZWUsIHJnZC0+cmRfZnJlZV9jbG9uZSwgcmdkLT5yZF9kaW5vZGVzKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMzc0LDEzICszNzksMjUgQEAKIH0KIAogLyoqCisgKiB0cmFuc19nb19kZW1vdGVfb2sKKyAqIEBnbDogdGhlIGdsb2NrCisgKgorICogQWx3YXlzIHJldHVybnMgMAorICovCisKK3N0YXRpYyBpbnQgdHJhbnNfZ29fZGVtb3RlX29rKGNvbnN0IHN0cnVjdCBnZnMyX2dsb2NrICpnbCkKK3sKKwlyZXR1cm4gMDsKK30KKworLyoqCiAgKiBxdW90YV9nb19kZW1vdGVfb2sgLSBDaGVjayB0byBzZWUgaWYgaXQncyBvayB0byB1bmxvY2sgYSBxdW90YSBnbG9jawogICogQGdsOiB0aGUgZ2xvY2sKICAqCiAgKiBSZXR1cm5zOiAxIGlmIGl0J3Mgb2sKICAqLwogCi1zdGF0aWMgaW50IHF1b3RhX2dvX2RlbW90ZV9vayhzdHJ1Y3QgZ2ZzMl9nbG9jayAqZ2wpCitzdGF0aWMgaW50IHF1b3RhX2dvX2RlbW90ZV9vayhjb25zdCBzdHJ1Y3QgZ2ZzMl9nbG9jayAqZ2wpCiB7CiAJcmV0dXJuICFhdG9taWNfcmVhZCgmZ2wtPmdsX2x2Yl9jb3VudCk7CiB9CkBAIC00MTQsNiArNDMxLDcgQEAKIGNvbnN0IHN0cnVjdCBnZnMyX2dsb2NrX29wZXJhdGlvbnMgZ2ZzMl90cmFuc19nbG9wcyA9IHsKIAkuZ29feG1vdGVfdGggPSB0cmFuc19nb19zeW5jLAogCS5nb194bW90ZV9iaCA9IHRyYW5zX2dvX3htb3RlX2JoLAorCS5nb19kZW1vdGVfb2sgPSB0cmFuc19nb19kZW1vdGVfb2ssCiAJLmdvX3R5cGUgPSBMTV9UWVBFX05PTkRJU0ssCiB9OwogCmRpZmYgLS1naXQgYS9mcy9nZnMyL2luY29yZS5oIGIvZnMvZ2ZzMi9pbmNvcmUuaAppbmRleCBmNTY2ZWMxLi42MDg4NDlkIDEwMDY0NAotLS0gYS9mcy9nZnMyL2luY29yZS5oCisrKyBiL2ZzL2dmczIvaW5jb3JlLmgKQEAgLTY4LDEyICs2OCw2IEBACiAJdTMyIGJpX2xlbjsKIH07CiAKLXN0cnVjdCBnZnMyX3JncnBfaG9zdCB7Ci0JdTMyIHJnX2ZyZWU7Ci0JdTMyIHJnX2Rpbm9kZXM7Ci0JdTY0IHJnX2lnZW5lcmF0aW9uOwotfTsKLQogc3RydWN0IGdmczJfcmdycGQgewogCXN0cnVjdCBsaXN0X2hlYWQgcmRfbGlzdDsJLyogTGluayB3aXRoIHN1cGVyYmxvY2sgKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkIHJkX2xpc3RfbXJ1OwpAQCAtODMsMTQgKzc3LDE2IEBACiAJdTMyIHJkX2xlbmd0aDsJCQkvKiBsZW5ndGggb2YgcmdycCBoZWFkZXIgaW4gZnMgYmxvY2tzICovCiAJdTMyIHJkX2RhdGE7CQkJLyogbnVtIG9mIGRhdGEgYmxvY2tzIGluIHJncnAgKi8KIAl1MzIgcmRfYml0Ynl0ZXM7CQkvKiBudW1iZXIgb2YgYnl0ZXMgaW4gZGF0YSBiaXRtYXBzICovCi0Jc3RydWN0IGdmczJfcmdycF9ob3N0IHJkX3JnOwotCXN0cnVjdCBnZnMyX2JpdG1hcCAqcmRfYml0czsKLQl1bnNpZ25lZCBpbnQgcmRfYmhfY291bnQ7Ci0Jc3RydWN0IG11dGV4IHJkX211dGV4OworCXUzMiByZF9mcmVlOwogCXUzMiByZF9mcmVlX2Nsb25lOworCXUzMiByZF9kaW5vZGVzOworCXU2NCByZF9pZ2VuZXJhdGlvbjsKKwlzdHJ1Y3QgZ2ZzMl9iaXRtYXAgKnJkX2JpdHM7CisJc3RydWN0IG11dGV4IHJkX211dGV4OwogCXN0cnVjdCBnZnMyX2xvZ19lbGVtZW50IHJkX2xlOwotCXUzMiByZF9sYXN0X2FsbG9jOwogCXN0cnVjdCBnZnMyX3NiZCAqcmRfc2JkOworCXVuc2lnbmVkIGludCByZF9iaF9jb3VudDsKKwl1MzIgcmRfbGFzdF9hbGxvYzsKIAl1bnNpZ25lZCBjaGFyIHJkX2ZsYWdzOwogI2RlZmluZSBHRlMyX1JERl9DSEVDSyAgICAgICAgMHgwMSAgICAgIC8qIE5lZWQgdG8gY2hlY2sgZm9yIHVubGlua2VkIGlub2RlcyAqLwogI2RlZmluZSBHRlMyX1JERl9OT0FMTE9DICAgICAgMHgwMiAgICAgIC8qIHJnIHByb2hpYml0cyBhbGxvY2F0aW9uICovCkBAIC0xMjksNyArMTI1LDcgQEAKIAl2b2lkICgqZ29feG1vdGVfdGgpIChzdHJ1Y3QgZ2ZzMl9nbG9jayAqZ2wpOwogCWludCAoKmdvX3htb3RlX2JoKSAoc3RydWN0IGdmczJfZ2xvY2sgKmdsLCBzdHJ1Y3QgZ2ZzMl9ob2xkZXIgKmdoKTsKIAl2b2lkICgqZ29faW52YWwpIChzdHJ1Y3QgZ2ZzMl9nbG9jayAqZ2wsIGludCBmbGFncyk7Ci0JaW50ICgqZ29fZGVtb3RlX29rKSAoc3RydWN0IGdmczJfZ2xvY2sgKmdsKTsKKwlpbnQgKCpnb19kZW1vdGVfb2spIChjb25zdCBzdHJ1Y3QgZ2ZzMl9nbG9jayAqZ2wpOwogCWludCAoKmdvX2xvY2spIChzdHJ1Y3QgZ2ZzMl9ob2xkZXIgKmdoKTsKIAl2b2lkICgqZ29fdW5sb2NrKSAoc3RydWN0IGdmczJfaG9sZGVyICpnaCk7CiAJaW50ICgqZ29fZHVtcCkoc3RydWN0IHNlcV9maWxlICpzZXEsIGNvbnN0IHN0cnVjdCBnZnMyX2dsb2NrICpnbCk7CkBAIC0xNTksNyArMTU1LDYgQEAKIAogZW51bSB7CiAJR0xGX0xPQ0sJCQk9IDEsCi0JR0xGX1NUSUNLWQkJCT0gMiwKIAlHTEZfREVNT1RFCQkJPSAzLAogCUdMRl9QRU5ESU5HX0RFTU9URQkJPSA0LAogCUdMRl9ERU1PVEVfSU5fUFJPR1JFU1MJCT0gNSwKQEAgLTE5NCw3ICsxODksNyBAQAogCXVuc2lnbmVkIGxvbmcgZ2xfdGNoYW5nZTsKIAl2b2lkICpnbF9vYmplY3Q7CiAKLQlzdHJ1Y3QgbGlzdF9oZWFkIGdsX3JlY2xhaW07CisJc3RydWN0IGxpc3RfaGVhZCBnbF9scnU7CiAKIAlzdHJ1Y3QgZ2ZzMl9zYmQgKmdsX3NiZDsKIApAQCAtMjMzLDI5ICsyMjgsMjQgQEAKIAlHSUZfVVNFUiAgICAgICAgICAgICAgICA9IDQsIC8qIHVzZXIgaW5vZGUsIG5vdCBtZXRhZGF0YSBhZGRyIHNwYWNlICovCiB9OwogCi1zdHJ1Y3QgZ2ZzMl9kaW5vZGVfaG9zdCB7Ci0JdTY0IGRpX3NpemU7CQkvKiBudW1iZXIgb2YgYnl0ZXMgaW4gZmlsZSAqLwotCXU2NCBkaV9nZW5lcmF0aW9uOwkvKiBnZW5lcmF0aW9uIG51bWJlciBmb3IgTkZTICovCi0JdTMyIGRpX2ZsYWdzOwkJLyogR0ZTMl9ESUZfLi4uICovCi0JLyogVGhlc2Ugb25seSBhcHBseSB0byBkaXJlY3RvcmllcyAgKi8KLQl1MzIgZGlfZW50cmllczsJCS8qIFRoZSBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgZGlyZWN0b3J5ICovCi0JdTY0IGRpX2VhdHRyOwkJLyogZXh0ZW5kZWQgYXR0cmlidXRlIGJsb2NrIG51bWJlciAqLwotfTsKIAogc3RydWN0IGdmczJfaW5vZGUgewogCXN0cnVjdCBpbm9kZSBpX2lub2RlOwogCXU2NCBpX25vX2FkZHI7CiAJdTY0IGlfbm9fZm9ybWFsX2lubzsKKwl1NjQgaV9nZW5lcmF0aW9uOworCXU2NCBpX2VhdHRyOworCWxvZmZfdCBpX2Rpc2tzaXplOwogCXVuc2lnbmVkIGxvbmcgaV9mbGFnczsJCS8qIEdJRl8uLi4gKi8KLQotCXN0cnVjdCBnZnMyX2Rpbm9kZV9ob3N0IGlfZGk7IC8qIFRvIGJlIHJlcGxhY2VkIGJ5IHJlZiB0byBibG9jayAqLwotCiAJc3RydWN0IGdmczJfZ2xvY2sgKmlfZ2w7IC8qIE1vdmUgaW50byBpX2doPyAqLwogCXN0cnVjdCBnZnMyX2hvbGRlciBpX2lvcGVuX2doOwogCXN0cnVjdCBnZnMyX2hvbGRlciBpX2doOyAvKiBmb3IgcHJlcGFyZS9jb21taXRfd3JpdGUgb25seSAqLwogCXN0cnVjdCBnZnMyX2FsbG9jICppX2FsbG9jOwogCXU2NCBpX2dvYWw7CS8qIGdvYWwgYmxvY2sgZm9yIGFsbG9jYXRpb25zICovCiAJc3RydWN0IHJ3X3NlbWFwaG9yZSBpX3J3X211dGV4OworCXN0cnVjdCBsaXN0X2hlYWQgaV90cnVuY19saXN0OworCXUzMiBpX2VudHJpZXM7CisJdTMyIGlfZGlza2ZsYWdzOwogCXU4IGlfaGVpZ2h0OwogCXU4IGlfZGVwdGg7CiB9OwpAQCAtNDA2LDEzICszOTYsMTEgQEAKIHN0cnVjdCBnZnMyX3R1bmUgewogCXNwaW5sb2NrX3QgZ3Rfc3BpbjsKIAotCXVuc2lnbmVkIGludCBndF9kZW1vdGVfc2VjczsgLyogQ2FjaGUgcmV0ZW50aW9uIGZvciB1bmhlbGQgZ2xvY2sgKi8KIAl1bnNpZ25lZCBpbnQgZ3RfaW5jb3JlX2xvZ19ibG9ja3M7CiAJdW5zaWduZWQgaW50IGd0X2xvZ19mbHVzaF9zZWNzOwogCiAJdW5zaWduZWQgaW50IGd0X3JlY292ZXJkX3NlY3M7CiAJdW5zaWduZWQgaW50IGd0X2xvZ2Rfc2VjczsKLQl1bnNpZ25lZCBpbnQgZ3RfcXVvdGFkX3NlY3M7CiAKIAl1bnNpZ25lZCBpbnQgZ3RfcXVvdGFfc2ltdWxfc3luYzsgLyogTWF4IHF1b3RhdmFscyB0byBzeW5jIGF0IG9uY2UgKi8KIAl1bnNpZ25lZCBpbnQgZ3RfcXVvdGFfd2Fybl9wZXJpb2Q7IC8qIFNlY3MgYmV0d2VlbiBxdW90YSB3YXJuIG1zZ3MgKi8KQEAgLTQ4OCwxMCArNDc2LDYgQEAKIAkvKiBMb2NrIFN0dWZmICovCiAKIAlzdHJ1Y3QgbG1fbG9ja3N0cnVjdCBzZF9sb2Nrc3RydWN0OwotCXN0cnVjdCBsaXN0X2hlYWQgc2RfcmVjbGFpbV9saXN0OwotCXNwaW5sb2NrX3Qgc2RfcmVjbGFpbV9sb2NrOwotCXdhaXRfcXVldWVfaGVhZF90IHNkX3JlY2xhaW1fd3E7Ci0JYXRvbWljX3Qgc2RfcmVjbGFpbV9jb3VudDsKIAlzdHJ1Y3QgZ2ZzMl9ob2xkZXIgc2RfbGl2ZV9naDsKIAlzdHJ1Y3QgZ2ZzMl9nbG9jayAqc2RfcmVuYW1lX2dsOwogCXN0cnVjdCBnZnMyX2dsb2NrICpzZF90cmFuc19nbDsKQEAgLTUxOSw3ICs1MDMsNiBAQAogCXNwaW5sb2NrX3Qgc2Rfc3RhdGZzX3NwaW47CiAJc3RydWN0IGdmczJfc3RhdGZzX2NoYW5nZV9ob3N0IHNkX3N0YXRmc19tYXN0ZXI7CiAJc3RydWN0IGdmczJfc3RhdGZzX2NoYW5nZV9ob3N0IHNkX3N0YXRmc19sb2NhbDsKLQl1bnNpZ25lZCBsb25nIHNkX3N0YXRmc19zeW5jX3RpbWU7CiAKIAkvKiBSZXNvdXJjZSBncm91cCBzdHVmZiAqLwogCkBAIC01NTIsOCArNTM1LDYgQEAKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnNkX3JlY292ZXJkX3Byb2Nlc3M7CiAJc3RydWN0IHRhc2tfc3RydWN0ICpzZF9sb2dkX3Byb2Nlc3M7CiAJc3RydWN0IHRhc2tfc3RydWN0ICpzZF9xdW90YWRfcHJvY2VzczsKLQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnNkX2dsb2NrZF9wcm9jZXNzW0dGUzJfR0xPQ0tEX01BWF07Ci0JdW5zaWduZWQgaW50IHNkX2dsb2NrZF9udW07CiAKIAkvKiBRdW90YSBzdHVmZiAqLwogCkBAIC01NjEsMTMgKzU0MiwxNSBAQAogCWF0b21pY190IHNkX3F1b3RhX2NvdW50OwogCXNwaW5sb2NrX3Qgc2RfcXVvdGFfc3BpbjsKIAlzdHJ1Y3QgbXV0ZXggc2RfcXVvdGFfbXV0ZXg7CisJd2FpdF9xdWV1ZV9oZWFkX3Qgc2RfcXVvdGFfd2FpdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHNkX3RydW5jX2xpc3Q7CisJc3BpbmxvY2tfdCBzZF90cnVuY19sb2NrOwogCiAJdW5zaWduZWQgaW50IHNkX3F1b3RhX3Nsb3RzOwogCXVuc2lnbmVkIGludCBzZF9xdW90YV9jaHVua3M7CiAJdW5zaWduZWQgY2hhciAqKnNkX3F1b3RhX2JpdG1hcDsKIAogCXU2NCBzZF9xdW90YV9zeW5jX2dlbjsKLQl1bnNpZ25lZCBsb25nIHNkX3F1b3RhX3N5bmNfdGltZTsKIAogCS8qIExvZyBzdHVmZiAqLwogCkBAIC02MjQsMTAgKzYwNyw2IEBACiAJc3RydWN0IG11dGV4IHNkX2ZyZWV6ZV9sb2NrOwogCXVuc2lnbmVkIGludCBzZF9mcmVlemVfY291bnQ7CiAKLQkvKiBDb3VudGVycyAqLwotCi0JYXRvbWljX3Qgc2RfcmVjbGFpbWVkOwotCiAJY2hhciBzZF9mc25hbWVbR0ZTMl9GU05BTUVfTEVOXTsKIAljaGFyIHNkX3RhYmxlX25hbWVbR0ZTMl9GU05BTUVfTEVOXTsKIAljaGFyIHNkX3Byb3RvX25hbWVbR0ZTMl9GU05BTUVfTEVOXTsKZGlmZiAtLWdpdCBhL2ZzL2dmczIvaW5vZGUuYyBiL2ZzL2dmczIvaW5vZGUuYwppbmRleCBkNTc2MTY4Li4zYjg3YzE4IDEwMDY0NAotLS0gYS9mcy9nZnMyL2lub2RlLmMKKysrIGIvZnMvZ2ZzMi9pbm9kZS5jCkBAIC0zMiw3ICszMiw2IEBACiAjaW5jbHVkZSAibG9nLmgiCiAjaW5jbHVkZSAibWV0YV9pby5oIgogI2luY2x1ZGUgIm9wc19hZGRyZXNzLmgiCi0jaW5jbHVkZSAib3BzX2lub2RlLmgiCiAjaW5jbHVkZSAicXVvdGEuaCIKICNpbmNsdWRlICJyZ3JwLmgiCiAjaW5jbHVkZSAidHJhbnMuaCIKQEAgLTI0OCw3ICsyNDcsNiBAQAogCiBzdGF0aWMgaW50IGdmczJfZGlub2RlX2luKHN0cnVjdCBnZnMyX2lub2RlICppcCwgY29uc3Qgdm9pZCAqYnVmKQogewotCXN0cnVjdCBnZnMyX2Rpbm9kZV9ob3N0ICpkaSA9ICZpcC0+aV9kaTsKIAljb25zdCBzdHJ1Y3QgZ2ZzMl9kaW5vZGUgKnN0ciA9IGJ1ZjsKIAlzdHJ1Y3QgdGltZXNwZWMgYXRpbWU7CiAJdTE2IGhlaWdodCwgZGVwdGg7CkBAIC0yNzQsOCArMjcyLDggQEAKIAkgKiB0byBkbyB0aGF0LgogCSAqLwogCWlwLT5pX2lub2RlLmlfbmxpbmsgPSBiZTMyX3RvX2NwdShzdHItPmRpX25saW5rKTsKLQlkaS0+ZGlfc2l6ZSA9IGJlNjRfdG9fY3B1KHN0ci0+ZGlfc2l6ZSk7Ci0JaV9zaXplX3dyaXRlKCZpcC0+aV9pbm9kZSwgZGktPmRpX3NpemUpOworCWlwLT5pX2Rpc2tzaXplID0gYmU2NF90b19jcHUoc3RyLT5kaV9zaXplKTsKKwlpX3NpemVfd3JpdGUoJmlwLT5pX2lub2RlLCBpcC0+aV9kaXNrc2l6ZSk7CiAJZ2ZzMl9zZXRfaW5vZGVfYmxvY2tzKCZpcC0+aV9pbm9kZSwgYmU2NF90b19jcHUoc3RyLT5kaV9ibG9ja3MpKTsKIAlhdGltZS50dl9zZWMgPSBiZTY0X3RvX2NwdShzdHItPmRpX2F0aW1lKTsKIAlhdGltZS50dl9uc2VjID0gYmUzMl90b19jcHUoc3RyLT5kaV9hdGltZV9uc2VjKTsKQEAgLTI4Nyw5ICsyODUsOSBAQAogCWlwLT5pX2lub2RlLmlfY3RpbWUudHZfbnNlYyA9IGJlMzJfdG9fY3B1KHN0ci0+ZGlfY3RpbWVfbnNlYyk7CiAKIAlpcC0+aV9nb2FsID0gYmU2NF90b19jcHUoc3RyLT5kaV9nb2FsX21ldGEpOwotCWRpLT5kaV9nZW5lcmF0aW9uID0gYmU2NF90b19jcHUoc3RyLT5kaV9nZW5lcmF0aW9uKTsKKwlpcC0+aV9nZW5lcmF0aW9uID0gYmU2NF90b19jcHUoc3RyLT5kaV9nZW5lcmF0aW9uKTsKIAotCWRpLT5kaV9mbGFncyA9IGJlMzJfdG9fY3B1KHN0ci0+ZGlfZmxhZ3MpOworCWlwLT5pX2Rpc2tmbGFncyA9IGJlMzJfdG9fY3B1KHN0ci0+ZGlfZmxhZ3MpOwogCWdmczJfc2V0X2lub2RlX2ZsYWdzKCZpcC0+aV9pbm9kZSk7CiAJaGVpZ2h0ID0gYmUxNl90b19jcHUoc3RyLT5kaV9oZWlnaHQpOwogCWlmICh1bmxpa2VseShoZWlnaHQgPiBHRlMyX01BWF9NRVRBX0hFSUdIVCkpCkBAIC0zMDAsOSArMjk4LDkgQEAKIAlpZiAodW5saWtlbHkoZGVwdGggPiBHRlMyX0RJUl9NQVhfREVQVEgpKQogCQlnb3RvIGNvcnJ1cHQ7CiAJaXAtPmlfZGVwdGggPSAodTgpZGVwdGg7Ci0JZGktPmRpX2VudHJpZXMgPSBiZTMyX3RvX2NwdShzdHItPmRpX2VudHJpZXMpOworCWlwLT5pX2VudHJpZXMgPSBiZTMyX3RvX2NwdShzdHItPmRpX2VudHJpZXMpOwogCi0JZGktPmRpX2VhdHRyID0gYmU2NF90b19jcHUoc3RyLT5kaV9lYXR0cik7CisJaXAtPmlfZWF0dHIgPSBiZTY0X3RvX2NwdShzdHItPmRpX2VhdHRyKTsKIAlpZiAoU19JU1JFRyhpcC0+aV9pbm9kZS5pX21vZGUpKQogCQlnZnMyX3NldF9hb3BzKCZpcC0+aV9pbm9kZSk7CiAKQEAgLTM4OCw3ICszODYsNiBAQAogCWdmczJfZnJlZV9kaShyZ2QsIGlwKTsKIAogCWdmczJfdHJhbnNfZW5kKHNkcCk7Ci0JY2xlYXJfYml0KEdMRl9TVElDS1ksICZpcC0+aV9nbC0+Z2xfZmxhZ3MpOwogCiBvdXRfcmdfZ3VubG9jazoKIAlnZnMyX2dsb2NrX2RxX3VuaW5pdCgmYWwtPmFsX3JnZF9naCk7CkBAIC02OTAsNyArNjg3LDcgQEAKIAkJcmV0dXJuIGVycm9yOwogCX0KIAotCWlmIChkaXAtPmlfZGkuZGlfZW50cmllcyA9PSAodTMyKS0xKQorCWlmIChkaXAtPmlfZW50cmllcyA9PSAodTMyKS0xKQogCQlyZXR1cm4gLUVGQklHOwogCWlmIChTX0lTRElSKG1vZGUpICYmIGRpcC0+aV9pbm9kZS5pX25saW5rID09ICh1MzIpLTEpCiAJCXJldHVybiAtRU1MSU5LOwpAQCAtNzkwLDExICs3ODcsMTEgQEAKIAlkaS0+ZGlfZmxhZ3MgPSAwOwogCiAJaWYgKFNfSVNSRUcobW9kZSkpIHsKLQkJaWYgKChkaXAtPmlfZGkuZGlfZmxhZ3MgJiBHRlMyX0RJRl9JTkhFUklUX0pEQVRBKSB8fAorCQlpZiAoKGRpcC0+aV9kaXNrZmxhZ3MgJiBHRlMyX0RJRl9JTkhFUklUX0pEQVRBKSB8fAogCQkgICAgZ2ZzMl90dW5lX2dldChzZHAsIGd0X25ld19maWxlc19qZGF0YSkpCiAJCQlkaS0+ZGlfZmxhZ3MgfD0gY3B1X3RvX2JlMzIoR0ZTMl9ESUZfSkRBVEEpOwogCX0gZWxzZSBpZiAoU19JU0RJUihtb2RlKSkgewotCQlkaS0+ZGlfZmxhZ3MgfD0gY3B1X3RvX2JlMzIoZGlwLT5pX2RpLmRpX2ZsYWdzICYKKwkJZGktPmRpX2ZsYWdzIHw9IGNwdV90b19iZTMyKGRpcC0+aV9kaXNrZmxhZ3MgJgogCQkJCQkgICAgR0ZTMl9ESUZfSU5IRVJJVF9KREFUQSk7CiAJfQogCkBAIC0xMDY4LDcgKzEwNjUsNyBAQAogCXN0cnVjdCBxc3RyIGRvdG5hbWU7CiAJaW50IGVycm9yOwogCi0JaWYgKGlwLT5pX2RpLmRpX2VudHJpZXMgIT0gMikgeworCWlmIChpcC0+aV9lbnRyaWVzICE9IDIpIHsKIAkJaWYgKGdmczJfY29uc2lzdF9pbm9kZShpcCkpCiAJCQlnZnMyX2Rpbm9kZV9wcmludChpcCk7CiAJCXJldHVybiAtRUlPOwpAQCAtMTE2OCw3ICsxMTY1LDcgQEAKIAkJcmV0dXJuIGVycm9yOwogCX0KIAotCWlmICghaXAtPmlfZGkuZGlfc2l6ZSkgeworCWlmICghaXAtPmlfZGlza3NpemUpIHsKIAkJZ2ZzMl9jb25zaXN0X2lub2RlKGlwKTsKIAkJZXJyb3IgPSAtRUlPOwogCQlnb3RvIG91dDsKQEAgLTExNzgsNyArMTE3NSw3IEBACiAJaWYgKGVycm9yKQogCQlnb3RvIG91dDsKIAotCXggPSBpcC0+aV9kaS5kaV9zaXplICsgMTsKKwl4ID0gaXAtPmlfZGlza3NpemUgKyAxOwogCWlmICh4ID4gKmxlbikgewogCQkqYnVmID0ga21hbGxvYyh4LCBHRlBfTk9GUyk7CiAJCWlmICghKmJ1ZikgewpAQCAtMTI0Miw3ICsxMjM5LDYgQEAKIAogdm9pZCBnZnMyX2Rpbm9kZV9vdXQoY29uc3Qgc3RydWN0IGdmczJfaW5vZGUgKmlwLCB2b2lkICpidWYpCiB7Ci0JY29uc3Qgc3RydWN0IGdmczJfZGlub2RlX2hvc3QgKmRpID0gJmlwLT5pX2RpOwogCXN0cnVjdCBnZnMyX2Rpbm9kZSAqc3RyID0gYnVmOwogCiAJc3RyLT5kaV9oZWFkZXIubWhfbWFnaWMgPSBjcHVfdG9fYmUzMihHRlMyX01BR0lDKTsKQEAgLTEyNTYsNyArMTI1Miw3IEBACiAJc3RyLT5kaV91aWQgPSBjcHVfdG9fYmUzMihpcC0+aV9pbm9kZS5pX3VpZCk7CiAJc3RyLT5kaV9naWQgPSBjcHVfdG9fYmUzMihpcC0+aV9pbm9kZS5pX2dpZCk7CiAJc3RyLT5kaV9ubGluayA9IGNwdV90b19iZTMyKGlwLT5pX2lub2RlLmlfbmxpbmspOwotCXN0ci0+ZGlfc2l6ZSA9IGNwdV90b19iZTY0KGRpLT5kaV9zaXplKTsKKwlzdHItPmRpX3NpemUgPSBjcHVfdG9fYmU2NChpcC0+aV9kaXNrc2l6ZSk7CiAJc3RyLT5kaV9ibG9ja3MgPSBjcHVfdG9fYmU2NChnZnMyX2dldF9pbm9kZV9ibG9ja3MoJmlwLT5pX2lub2RlKSk7CiAJc3RyLT5kaV9hdGltZSA9IGNwdV90b19iZTY0KGlwLT5pX2lub2RlLmlfYXRpbWUudHZfc2VjKTsKIAlzdHItPmRpX210aW1lID0gY3B1X3RvX2JlNjQoaXAtPmlfaW5vZGUuaV9tdGltZS50dl9zZWMpOwpAQCAtMTI2NCwxNyArMTI2MCwxNyBAQAogCiAJc3RyLT5kaV9nb2FsX21ldGEgPSBjcHVfdG9fYmU2NChpcC0+aV9nb2FsKTsKIAlzdHItPmRpX2dvYWxfZGF0YSA9IGNwdV90b19iZTY0KGlwLT5pX2dvYWwpOwotCXN0ci0+ZGlfZ2VuZXJhdGlvbiA9IGNwdV90b19iZTY0KGRpLT5kaV9nZW5lcmF0aW9uKTsKKwlzdHItPmRpX2dlbmVyYXRpb24gPSBjcHVfdG9fYmU2NChpcC0+aV9nZW5lcmF0aW9uKTsKIAotCXN0ci0+ZGlfZmxhZ3MgPSBjcHVfdG9fYmUzMihkaS0+ZGlfZmxhZ3MpOworCXN0ci0+ZGlfZmxhZ3MgPSBjcHVfdG9fYmUzMihpcC0+aV9kaXNrZmxhZ3MpOwogCXN0ci0+ZGlfaGVpZ2h0ID0gY3B1X3RvX2JlMTYoaXAtPmlfaGVpZ2h0KTsKIAlzdHItPmRpX3BheWxvYWRfZm9ybWF0ID0gY3B1X3RvX2JlMzIoU19JU0RJUihpcC0+aV9pbm9kZS5pX21vZGUpICYmCi0JCQkJCSAgICAgIShpcC0+aV9kaS5kaV9mbGFncyAmIEdGUzJfRElGX0VYSEFTSCkgPworCQkJCQkgICAgICEoaXAtPmlfZGlza2ZsYWdzICYgR0ZTMl9ESUZfRVhIQVNIKSA/CiAJCQkJCSAgICAgR0ZTMl9GT1JNQVRfREUgOiAwKTsKIAlzdHItPmRpX2RlcHRoID0gY3B1X3RvX2JlMTYoaXAtPmlfZGVwdGgpOwotCXN0ci0+ZGlfZW50cmllcyA9IGNwdV90b19iZTMyKGRpLT5kaV9lbnRyaWVzKTsKKwlzdHItPmRpX2VudHJpZXMgPSBjcHVfdG9fYmUzMihpcC0+aV9lbnRyaWVzKTsKIAotCXN0ci0+ZGlfZWF0dHIgPSBjcHVfdG9fYmU2NChkaS0+ZGlfZWF0dHIpOworCXN0ci0+ZGlfZWF0dHIgPSBjcHVfdG9fYmU2NChpcC0+aV9lYXR0cik7CiAJc3RyLT5kaV9hdGltZV9uc2VjID0gY3B1X3RvX2JlMzIoaXAtPmlfaW5vZGUuaV9hdGltZS50dl9uc2VjKTsKIAlzdHItPmRpX210aW1lX25zZWMgPSBjcHVfdG9fYmUzMihpcC0+aV9pbm9kZS5pX210aW1lLnR2X25zZWMpOwogCXN0ci0+ZGlfY3RpbWVfbnNlYyA9IGNwdV90b19iZTMyKGlwLT5pX2lub2RlLmlfY3RpbWUudHZfbnNlYyk7CkBAIC0xMjgyLDIyICsxMjc4LDIxIEBACiAKIHZvaWQgZ2ZzMl9kaW5vZGVfcHJpbnQoY29uc3Qgc3RydWN0IGdmczJfaW5vZGUgKmlwKQogewotCWNvbnN0IHN0cnVjdCBnZnMyX2Rpbm9kZV9ob3N0ICpkaSA9ICZpcC0+aV9kaTsKLQogCXByaW50ayhLRVJOX0lORk8gIiAgbm9fZm9ybWFsX2lubyA9ICVsbHVcbiIsCiAJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpaXAtPmlfbm9fZm9ybWFsX2lubyk7CiAJcHJpbnRrKEtFUk5fSU5GTyAiICBub19hZGRyID0gJWxsdVxuIiwKIAkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylpcC0+aV9ub19hZGRyKTsKLQlwcmludGsoS0VSTl9JTkZPICIgIGRpX3NpemUgPSAlbGx1XG4iLCAodW5zaWduZWQgbG9uZyBsb25nKWRpLT5kaV9zaXplKTsKKwlwcmludGsoS0VSTl9JTkZPICIgIGlfZGlza3NpemUgPSAlbGx1XG4iLAorCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWlwLT5pX2Rpc2tzaXplKTsKIAlwcmludGsoS0VSTl9JTkZPICIgIGJsb2NrcyA9ICVsbHVcbiIsCiAJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpZ2ZzMl9nZXRfaW5vZGVfYmxvY2tzKCZpcC0+aV9pbm9kZSkpOwogCXByaW50ayhLRVJOX0lORk8gIiAgaV9nb2FsID0gJWxsdVxuIiwKIAkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylpcC0+aV9nb2FsKTsKLQlwcmludGsoS0VSTl9JTkZPICIgIGRpX2ZsYWdzID0gMHglLjhYXG4iLCBkaS0+ZGlfZmxhZ3MpOworCXByaW50ayhLRVJOX0lORk8gIiAgaV9kaXNrZmxhZ3MgPSAweCUuOFhcbiIsIGlwLT5pX2Rpc2tmbGFncyk7CiAJcHJpbnRrKEtFUk5fSU5GTyAiICBpX2hlaWdodCA9ICV1XG4iLCBpcC0+aV9oZWlnaHQpOwogCXByaW50ayhLRVJOX0lORk8gIiAgaV9kZXB0aCA9ICV1XG4iLCBpcC0+aV9kZXB0aCk7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiICBkaV9lbnRyaWVzID0gJXVcbiIsIGRpLT5kaV9lbnRyaWVzKTsKLQlwcmludGsoS0VSTl9JTkZPICIgIGRpX2VhdHRyID0gJWxsdVxuIiwKLQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylkaS0+ZGlfZWF0dHIpOworCXByaW50ayhLRVJOX0lORk8gIiAgaV9lbnRyaWVzID0gJXVcbiIsIGlwLT5pX2VudHJpZXMpOworCXByaW50ayhLRVJOX0lORk8gIiAgaV9lYXR0ciA9ICVsbHVcbiIsCisJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpaXAtPmlfZWF0dHIpOwogfQogCmRpZmYgLS1naXQgYS9mcy9nZnMyL2lub2RlLmggYi9mcy9nZnMyL2lub2RlLmgKaW5kZXggMmQ0M2Y2OS4uZDUzMjkzNiAxMDA2NDQKLS0tIGEvZnMvZ2ZzMi9pbm9kZS5oCisrKyBiL2ZzL2dmczIvaW5vZGUuaApAQCAtMTAsNiArMTAsNyBAQAogI2lmbmRlZiBfX0lOT0RFX0RPVF9IX18KICNkZWZpbmUgX19JTk9ERV9ET1RfSF9fCiAKKyNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgInV0aWwuaCIKIAogc3RhdGljIGlubGluZSBpbnQgZ2ZzMl9pc19zdHVmZmVkKGNvbnN0IHN0cnVjdCBnZnMyX2lub2RlICppcCkKQEAgLTE5LDcgKzIwLDcgQEAKIAogc3RhdGljIGlubGluZSBpbnQgZ2ZzMl9pc19qZGF0YShjb25zdCBzdHJ1Y3QgZ2ZzMl9pbm9kZSAqaXApCiB7Ci0JcmV0dXJuIGlwLT5pX2RpLmRpX2ZsYWdzICYgR0ZTMl9ESUZfSkRBVEE7CisJcmV0dXJuIGlwLT5pX2Rpc2tmbGFncyAmIEdGUzJfRElGX0pEQVRBOwogfQogCiBzdGF0aWMgaW5saW5lIGludCBnZnMyX2lzX3dyaXRlYmFjayhjb25zdCBzdHJ1Y3QgZ2ZzMl9pbm9kZSAqaXApCkBAIC05Nyw1ICs5OCwxNSBAQAogdm9pZCBnZnMyX2Rpbm9kZV9vdXQoY29uc3Qgc3RydWN0IGdmczJfaW5vZGUgKmlwLCB2b2lkICpidWYpOwogdm9pZCBnZnMyX2Rpbm9kZV9wcmludChjb25zdCBzdHJ1Y3QgZ2ZzMl9pbm9kZSAqaXApOwogCitleHRlcm4gY29uc3Qgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgZ2ZzMl9maWxlX2lvcHM7CitleHRlcm4gY29uc3Qgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgZ2ZzMl9kaXJfaW9wczsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBnZnMyX3N5bWxpbmtfaW9wczsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGdmczJfZmlsZV9mb3BzOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZ2ZzMl9kaXJfZm9wczsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGdmczJfZmlsZV9mb3BzX25vbG9jazsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGdmczJfZGlyX2ZvcHNfbm9sb2NrOworCitleHRlcm4gdm9pZCBnZnMyX3NldF9pbm9kZV9mbGFncyhzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKKwogI2VuZGlmIC8qIF9fSU5PREVfRE9UX0hfXyAqLwogCmRpZmYgLS1naXQgYS9mcy9nZnMyL2xvY2tpbmcvZGxtL21vdW50LmMgYi9mcy9nZnMyL2xvY2tpbmcvZGxtL21vdW50LmMKaW5kZXggMGM0Y2JlNi4uMWFhN2ViNiAxMDA2NDQKLS0tIGEvZnMvZ2ZzMi9sb2NraW5nL2RsbS9tb3VudC5jCisrKyBiL2ZzL2dmczIvbG9ja2luZy9kbG0vbW91bnQuYwpAQCAtMTk0LDE3ICsxOTQsMjUgQEAKIHN0YXRpYyB2b2lkIGdkbG1fcmVjb3ZlcnlfZG9uZSh2b2lkICpsb2Nrc3BhY2UsIHVuc2lnbmVkIGludCBqaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG1lc3NhZ2UpCiB7CisJY2hhciBlbnZfamlkWzIwXTsKKwljaGFyIGVudl9zdGF0dXNbMjBdOworCWNoYXIgKmVudnBbXSA9IHsgZW52X2ppZCwgZW52X3N0YXR1cywgTlVMTCB9OwogCXN0cnVjdCBnZGxtX2xzICpscyA9IGxvY2tzcGFjZTsKIAlscy0+cmVjb3Zlcl9qaWRfZG9uZSA9IGppZDsKIAlscy0+cmVjb3Zlcl9qaWRfc3RhdHVzID0gbWVzc2FnZTsKLQlrb2JqZWN0X3VldmVudCgmbHMtPmtvYmosIEtPQkpfQ0hBTkdFKTsKKwlzcHJpbnRmKGVudl9qaWQsICJKSUQ9JWQiLCBqaWQpOworCXNwcmludGYoZW52X3N0YXR1cywgIlJFQ09WRVJZPSVzIiwKKwkJbWVzc2FnZSA9PSBMTV9SRF9TVUNDRVNTID8gIkRvbmUiIDogIkZhaWxlZCIpOworCWtvYmplY3RfdWV2ZW50X2VudigmbHMtPmtvYmosIEtPQkpfQ0hBTkdFLCBlbnZwKTsKIH0KIAogc3RhdGljIHZvaWQgZ2RsbV9vdGhlcnNfbWF5X21vdW50KHZvaWQgKmxvY2tzcGFjZSkKIHsKKwljaGFyICptZXNzYWdlID0gIkZJUlNUTU9VTlQ9RG9uZSI7CisJY2hhciAqZW52cFtdID0geyBtZXNzYWdlLCBOVUxMIH07CiAJc3RydWN0IGdkbG1fbHMgKmxzID0gbG9ja3NwYWNlOwogCWxzLT5maXJzdF9kb25lID0gMTsKLQlrb2JqZWN0X3VldmVudCgmbHMtPmtvYmosIEtPQkpfQ0hBTkdFKTsKKwlrb2JqZWN0X3VldmVudF9lbnYoJmxzLT5rb2JqLCBLT0JKX0NIQU5HRSwgZW52cCk7CiB9CiAKIC8qIFVzZXJzcGFjZSBnZXRzIHRoZSBvZmZsaW5lIHVldmVudCwgYmxvY2tzIG5ldyBnZnMgbG9ja3Mgb24KZGlmZiAtLWdpdCBhL2ZzL2dmczIvbG9ja2luZy9kbG0vc3lzZnMuYyBiL2ZzL2dmczIvbG9ja2luZy9kbG0vc3lzZnMuYwppbmRleCA0ZWM1NzFjLi45YjdlZGNmIDEwMDY0NAotLS0gYS9mcy9nZnMyL2xvY2tpbmcvZGxtL3N5c2ZzLmMKKysrIGIvZnMvZ2ZzMi9sb2NraW5nL2RsbS9zeXNmcy5jCkBAIC0xOTUsOSArMTk1LDIzIEBACiAJa29iamVjdF9wdXQoJmxzLT5rb2JqKTsKIH0KIAorc3RhdGljIGludCBnZGxtX3VldmVudChzdHJ1Y3Qga3NldCAqa3NldCwgc3RydWN0IGtvYmplY3QgKmtvYmosCisJCSAgICAgICBzdHJ1Y3Qga29ial91ZXZlbnRfZW52ICplbnYpCit7CisgICAgICAgIHN0cnVjdCBnZGxtX2xzICpscyA9IGNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgZ2RsbV9scywga29iaik7CisgICAgICAgIGFkZF91ZXZlbnRfdmFyKGVudiwgIkxPQ0tUQUJMRT0lczolcyIsIGxzLT5jbHVzdGVybmFtZSwgbHMtPmZzbmFtZSk7CisgICAgICAgIGFkZF91ZXZlbnRfdmFyKGVudiwgIkxPQ0tQUk9UTz1sb2NrX2RsbSIpOworICAgICAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBrc2V0X3VldmVudF9vcHMgZ2RsbV91ZXZlbnRfb3BzID0geworCS51ZXZlbnQgPSBnZGxtX3VldmVudCwKK307CisKKwogaW50IGdkbG1fc3lzZnNfaW5pdCh2b2lkKQogewotCWdkbG1fa3NldCA9IGtzZXRfY3JlYXRlX2FuZF9hZGQoImxvY2tfZGxtIiwgTlVMTCwga2VybmVsX2tvYmopOworCWdkbG1fa3NldCA9IGtzZXRfY3JlYXRlX2FuZF9hZGQoImxvY2tfZGxtIiwgJmdkbG1fdWV2ZW50X29wcywga2VybmVsX2tvYmopOwogCWlmICghZ2RsbV9rc2V0KSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBjYW4gbm90IGNyZWF0ZSBrc2V0XG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiAtRU5PTUVNOwpkaWZmIC0tZ2l0IGEvZnMvZ2ZzMi9tYWluLmMgYi9mcy9nZnMyL21haW4uYwppbmRleCBiYjJjYzMwLi43Y2FjZmRlIDEwMDY0NAotLS0gYS9mcy9nZnMyL21haW4uYworKysgYi9mcy9nZnMyL21haW4uYwpAQCAtMTksNyArMTksNyBAQAogCiAjaW5jbHVkZSAiZ2ZzMi5oIgogI2luY2x1ZGUgImluY29yZS5oIgotI2luY2x1ZGUgIm9wc19mc3R5cGUuaCIKKyNpbmNsdWRlICJzdXBlci5oIgogI2luY2x1ZGUgInN5cy5oIgogI2luY2x1ZGUgInV0aWwuaCIKICNpbmNsdWRlICJnbG9jay5oIgpAQCAtMzAsNiArMzAsNyBAQAogCiAJaW5vZGVfaW5pdF9vbmNlKCZpcC0+aV9pbm9kZSk7CiAJaW5pdF9yd3NlbSgmaXAtPmlfcndfbXV0ZXgpOworCUlOSVRfTElTVF9IRUFEKCZpcC0+aV90cnVuY19saXN0KTsKIAlpcC0+aV9hbGxvYyA9IE5VTEw7CiB9CiAKQEAgLTQyLDcgKzQzLDcgQEAKIAlJTklUX0xJU1RfSEVBRCgmZ2wtPmdsX2hvbGRlcnMpOwogCWdsLT5nbF9sdmIgPSBOVUxMOwogCWF0b21pY19zZXQoJmdsLT5nbF9sdmJfY291bnQsIDApOwotCUlOSVRfTElTVF9IRUFEKCZnbC0+Z2xfcmVjbGFpbSk7CisJSU5JVF9MSVNUX0hFQUQoJmdsLT5nbF9scnUpOwogCUlOSVRfTElTVF9IRUFEKCZnbC0+Z2xfYWlsX2xpc3QpOwogCWF0b21pY19zZXQoJmdsLT5nbF9haWxfY291bnQsIDApOwogfQpAQCAtOTMsNiArOTQsMTIgQEAKIAlpZiAoIWdmczJfcmdycGRfY2FjaGVwKQogCQlnb3RvIGZhaWw7CiAKKwlnZnMyX3F1b3RhZF9jYWNoZXAgPSBrbWVtX2NhY2hlX2NyZWF0ZSgiZ2ZzMl9xdW90YWQiLAorCQkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBnZnMyX3F1b3RhX2RhdGEpLAorCQkJCQkgICAgICAgMCwgMCwgTlVMTCk7CisJaWYgKCFnZnMyX3F1b3RhZF9jYWNoZXApCisJCWdvdG8gZmFpbDsKKwogCWVycm9yID0gcmVnaXN0ZXJfZmlsZXN5c3RlbSgmZ2ZzMl9mc190eXBlKTsKIAlpZiAoZXJyb3IpCiAJCWdvdG8gZmFpbDsKQEAgLTExMiw2ICsxMTksOSBAQAogZmFpbDoKIAlnZnMyX2dsb2NrX2V4aXQoKTsKIAorCWlmIChnZnMyX3F1b3RhZF9jYWNoZXApCisJCWttZW1fY2FjaGVfZGVzdHJveShnZnMyX3F1b3RhZF9jYWNoZXApOworCiAJaWYgKGdmczJfcmdycGRfY2FjaGVwKQogCQlrbWVtX2NhY2hlX2Rlc3Ryb3koZ2ZzMl9yZ3JwZF9jYWNoZXApOwogCkBAIC0xNDAsNiArMTUwLDcgQEAKIAl1bnJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJmdmczJfZnNfdHlwZSk7CiAJdW5yZWdpc3Rlcl9maWxlc3lzdGVtKCZnZnMybWV0YV9mc190eXBlKTsKIAorCWttZW1fY2FjaGVfZGVzdHJveShnZnMyX3F1b3RhZF9jYWNoZXApOwogCWttZW1fY2FjaGVfZGVzdHJveShnZnMyX3JncnBkX2NhY2hlcCk7CiAJa21lbV9jYWNoZV9kZXN0cm95KGdmczJfYnVmZGF0YV9jYWNoZXApOwogCWttZW1fY2FjaGVfZGVzdHJveShnZnMyX2lub2RlX2NhY2hlcCk7CmRpZmYgLS1naXQgYS9mcy9nZnMyL21vdW50LmMgYi9mcy9nZnMyL21vdW50LmMKaW5kZXggZjk2ZWI5MC4uM2NiMGE0NCAxMDA2NDQKLS0tIGEvZnMvZ2ZzMi9tb3VudC5jCisrKyBiL2ZzL2dmczIvbW91bnQuYwpAQCAtMzIsNyArMzIsNiBAQAogCU9wdF9kZWJ1ZywKIAlPcHRfbm9kZWJ1ZywKIAlPcHRfdXBncmFkZSwKLQlPcHRfbnVtX2dsb2NrZCwKIAlPcHRfYWNsLAogCU9wdF9ub2FjbCwKIAlPcHRfcXVvdGFfb2ZmLApAQCAtNTcsNyArNTYsNiBAQAogCXtPcHRfZGVidWcsICJkZWJ1ZyJ9LAogCXtPcHRfbm9kZWJ1ZywgIm5vZGVidWcifSwKIAl7T3B0X3VwZ3JhZGUsICJ1cGdyYWRlIn0sCi0Je09wdF9udW1fZ2xvY2tkLCAibnVtX2dsb2NrZD0lZCJ9LAogCXtPcHRfYWNsLCAiYWNsIn0sCiAJe09wdF9ub2FjbCwgIm5vYWNsIn0sCiAJe09wdF9xdW90YV9vZmYsICJxdW90YT1vZmYifSwKQEAgLTg3LDE2ICs4NSw3IEBACiAJaW50IGVycm9yID0gMDsKIAogCWlmICghcmVtb3VudCkgewotCQkvKiAgSWYgc29tZW9uZSBwcmVsb2FkZWQgb3B0aW9ucywgdXNlIHRob3NlIGluc3RlYWQgICovCi0JCXNwaW5fbG9jaygmZ2ZzMl9zeXNfbWFyZ3NfbG9jayk7Ci0JCWlmIChnZnMyX3N5c19tYXJncykgewotCQkJZGF0YSA9IGdmczJfc3lzX21hcmdzOwotCQkJZ2ZzMl9zeXNfbWFyZ3MgPSBOVUxMOwotCQl9Ci0JCXNwaW5fdW5sb2NrKCZnZnMyX3N5c19tYXJnc19sb2NrKTsKLQogCQkvKiAgU2V0IHNvbWUgZGVmYXVsdHMgICovCi0JCWFyZ3MtPmFyX251bV9nbG9ja2QgPSBHRlMyX0dMT0NLRF9ERUZBVUxUOwogCQlhcmdzLT5hcl9xdW90YSA9IEdGUzJfUVVPVEFfREVGQVVMVDsKIAkJYXJncy0+YXJfZGF0YSA9IEdGUzJfREFUQV9ERUZBVUxUOwogCX0KQEAgLTEwNSw3ICs5NCw3IEBACiAJICAgcHJvY2VzcyB0aGVtICovCiAKIAlmb3IgKG9wdGlvbnMgPSBkYXRhOyAobyA9IHN0cnNlcCgmb3B0aW9ucywgIiwiKSk7ICkgewotCQlpbnQgdG9rZW4sIG9wdGlvbjsKKwkJaW50IHRva2VuOwogCQlzdWJzdHJpbmdfdCB0bXBbTUFYX09QVF9BUkdTXTsKIAogCQlpZiAoISpvKQpAQCAtMTk2LDIyICsxODUsNiBAQAogCQkJCWdvdG8gY2FudF9yZW1vdW50OwogCQkJYXJncy0+YXJfdXBncmFkZSA9IDE7CiAJCQlicmVhazsKLQkJY2FzZSBPcHRfbnVtX2dsb2NrZDoKLQkJCWlmICgoZXJyb3IgPSBtYXRjaF9pbnQoJnRtcFswXSwgJm9wdGlvbikpKSB7Ci0JCQkJZnNfaW5mbyhzZHAsICJwcm9ibGVtIGdldHRpbmcgbnVtX2dsb2NrZFxuIik7Ci0JCQkJZ290byBvdXRfZXJyb3I7Ci0JCQl9Ci0KLQkJCWlmIChyZW1vdW50ICYmIG9wdGlvbiAhPSBhcmdzLT5hcl9udW1fZ2xvY2tkKQotCQkJCWdvdG8gY2FudF9yZW1vdW50OwotCQkJaWYgKCFvcHRpb24gfHwgb3B0aW9uID4gR0ZTMl9HTE9DS0RfTUFYKSB7Ci0JCQkJZnNfaW5mbyhzZHAsICIwIDwgbnVtX2dsb2NrZCA8PSAldSAgKG5vdCAldSlcbiIsCi0JCQkJICAgICAgICBHRlMyX0dMT0NLRF9NQVgsIG9wdGlvbik7Ci0JCQkJZXJyb3IgPSAtRUlOVkFMOwotCQkJCWdvdG8gb3V0X2Vycm9yOwotCQkJfQotCQkJYXJncy0+YXJfbnVtX2dsb2NrZCA9IG9wdGlvbjsKLQkJCWJyZWFrOwogCQljYXNlIE9wdF9hY2w6CiAJCQlhcmdzLT5hcl9wb3NpeF9hY2wgPSAxOwogCQkJc2RwLT5zZF92ZnMtPnNfZmxhZ3MgfD0gTVNfUE9TSVhBQ0w7CmRpZmYgLS1naXQgYS9mcy9nZnMyL29wc19hZGRyZXNzLmMgYi9mcy9nZnMyL29wc19hZGRyZXNzLmMKaW5kZXggMTVmNzEwZi4uNGRkYWI2NyAxMDA2NDQKLS0tIGEvZnMvZ2ZzMi9vcHNfYWRkcmVzcy5jCisrKyBiL2ZzL2dmczIvb3BzX2FkZHJlc3MuYwpAQCAtMjEwLDI1ICsyMTAsMjMgQEAKIHsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gcGFnZS0+bWFwcGluZy0+aG9zdDsKIAlzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCA9IEdGUzJfU0IoaW5vZGUpOwotCWludCBlcnJvcjsKKwlpbnQgcmV0OwogCWludCBkb25lX3RyYW5zID0gMDsKIAotCWVycm9yID0gZ2ZzMl93cml0ZXBhZ2VfY29tbW9uKHBhZ2UsIHdiYyk7Ci0JaWYgKGVycm9yIDw9IDApCi0JCXJldHVybiBlcnJvcjsKLQogCWlmIChQYWdlQ2hlY2tlZChwYWdlKSkgewogCQlpZiAod2JjLT5zeW5jX21vZGUgIT0gV0JfU1lOQ19BTEwpCiAJCQlnb3RvIG91dF9pZ25vcmU7Ci0JCWVycm9yID0gZ2ZzMl90cmFuc19iZWdpbihzZHAsIFJFU19ESU5PREUgKyAxLCAwKTsKLQkJaWYgKGVycm9yKQorCQlyZXQgPSBnZnMyX3RyYW5zX2JlZ2luKHNkcCwgUkVTX0RJTk9ERSArIDEsIDApOworCQlpZiAocmV0KQogCQkJZ290byBvdXRfaWdub3JlOwogCQlkb25lX3RyYW5zID0gMTsKIAl9Ci0JZXJyb3IgPSBfX2dmczJfamRhdGFfd3JpdGVwYWdlKHBhZ2UsIHdiYyk7CisJcmV0ID0gZ2ZzMl93cml0ZXBhZ2VfY29tbW9uKHBhZ2UsIHdiYyk7CisJaWYgKHJldCA+IDApCisJCXJldCA9IF9fZ2ZzMl9qZGF0YV93cml0ZXBhZ2UocGFnZSwgd2JjKTsKIAlpZiAoZG9uZV90cmFucykKIAkJZ2ZzMl90cmFuc19lbmQoc2RwKTsKLQlyZXR1cm4gZXJyb3I7CisJcmV0dXJuIHJldDsKIAogb3V0X2lnbm9yZToKIAlyZWRpcnR5X3BhZ2VfZm9yX3dyaXRlcGFnZSh3YmMsIHBhZ2UpOwpAQCAtNDUzLDggKzQ1MSw4IEBACiAKIAlrYWRkciA9IGttYXBfYXRvbWljKHBhZ2UsIEtNX1VTRVIwKTsKIAltZW1jcHkoa2FkZHIsIGRpYmgtPmJfZGF0YSArIHNpemVvZihzdHJ1Y3QgZ2ZzMl9kaW5vZGUpLAotCSAgICAgICBpcC0+aV9kaS5kaV9zaXplKTsKLQltZW1zZXQoa2FkZHIgKyBpcC0+aV9kaS5kaV9zaXplLCAwLCBQQUdFX0NBQ0hFX1NJWkUgLSBpcC0+aV9kaS5kaV9zaXplKTsKKwkgICAgICAgaXAtPmlfZGlza3NpemUpOworCW1lbXNldChrYWRkciArIGlwLT5pX2Rpc2tzaXplLCAwLCBQQUdFX0NBQ0hFX1NJWkUgLSBpcC0+aV9kaXNrc2l6ZSk7CiAJa3VubWFwX2F0b21pYyhrYWRkciwgS01fVVNFUjApOwogCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpOwogCWJyZWxzZShkaWJoKTsKQEAgLTYyNyw3ICs2MjUsNyBAQAogewogCXN0cnVjdCBnZnMyX2lub2RlICppcCA9IEdGUzJfSShtYXBwaW5nLT5ob3N0KTsKIAlzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCA9IEdGUzJfU0IobWFwcGluZy0+aG9zdCk7Ci0JdW5zaWduZWQgaW50IGRhdGFfYmxvY2tzLCBpbmRfYmxvY2tzLCByYmxvY2tzOworCXVuc2lnbmVkIGludCBkYXRhX2Jsb2NrcyA9IDAsIGluZF9ibG9ja3MgPSAwLCByYmxvY2tzOwogCWludCBhbGxvY19yZXF1aXJlZDsKIAlpbnQgZXJyb3IgPSAwOwogCXN0cnVjdCBnZnMyX2FsbG9jICphbDsKQEAgLTY0MSwxMSArNjM5LDEzIEBACiAJaWYgKHVubGlrZWx5KGVycm9yKSkKIAkJZ290byBvdXRfdW5pbml0OwogCi0JZ2ZzMl93cml0ZV9jYWxjX3Jlc2VydihpcCwgbGVuLCAmZGF0YV9ibG9ja3MsICZpbmRfYmxvY2tzKTsKIAllcnJvciA9IGdmczJfd3JpdGVfYWxsb2NfcmVxdWlyZWQoaXAsIHBvcywgbGVuLCAmYWxsb2NfcmVxdWlyZWQpOwogCWlmIChlcnJvcikKIAkJZ290byBvdXRfdW5sb2NrOwogCisJaWYgKGFsbG9jX3JlcXVpcmVkIHx8IGdmczJfaXNfamRhdGEoaXApKQorCQlnZnMyX3dyaXRlX2NhbGNfcmVzZXJ2KGlwLCBsZW4sICZkYXRhX2Jsb2NrcywgJmluZF9ibG9ja3MpOworCiAJaWYgKGFsbG9jX3JlcXVpcmVkKSB7CiAJCWFsID0gZ2ZzMl9hbGxvY19nZXQoaXApOwogCQlpZiAoIWFsKSB7CkBAIC02NzUsNiArNjc1LDcgQEAKIAkJZ290byBvdXRfdHJhbnNfZmFpbDsKIAogCWVycm9yID0gLUVOT01FTTsKKwlmbGFncyB8PSBBT1BfRkxBR19OT0ZTOwogCXBhZ2UgPSBncmFiX2NhY2hlX3BhZ2Vfd3JpdGVfYmVnaW4obWFwcGluZywgaW5kZXgsIGZsYWdzKTsKIAkqcGFnZXAgPSBwYWdlOwogCWlmICh1bmxpa2VseSghcGFnZSkpCkBAIC03ODIsNyArNzgzLDcgQEAKIAogCWlmIChpbm9kZS0+aV9zaXplIDwgdG8pIHsKIAkJaV9zaXplX3dyaXRlKGlub2RlLCB0byk7Ci0JCWlwLT5pX2RpLmRpX3NpemUgPSBpbm9kZS0+aV9zaXplOworCQlpcC0+aV9kaXNrc2l6ZSA9IGlub2RlLT5pX3NpemU7CiAJCWRpLT5kaV9zaXplID0gY3B1X3RvX2JlNjQoaW5vZGUtPmlfc2l6ZSk7CiAJCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOwogCX0KQEAgLTg0Nyw5ICs4NDgsOSBAQAogCiAJcmV0ID0gZ2VuZXJpY193cml0ZV9lbmQoZmlsZSwgbWFwcGluZywgcG9zLCBsZW4sIGNvcGllZCwgcGFnZSwgZnNkYXRhKTsKIAotCWlmIChsaWtlbHkocmV0ID49IDApICYmIChpbm9kZS0+aV9zaXplID4gaXAtPmlfZGkuZGlfc2l6ZSkpIHsKKwlpZiAobGlrZWx5KHJldCA+PSAwKSAmJiAoaW5vZGUtPmlfc2l6ZSA+IGlwLT5pX2Rpc2tzaXplKSkgewogCQlkaSA9IChzdHJ1Y3QgZ2ZzMl9kaW5vZGUgKilkaWJoLT5iX2RhdGE7Ci0JCWlwLT5pX2RpLmRpX3NpemUgPSBpbm9kZS0+aV9zaXplOworCQlpcC0+aV9kaXNrc2l6ZSA9IGlub2RlLT5pX3NpemU7CiAJCWRpLT5kaV9zaXplID0gY3B1X3RvX2JlNjQoaW5vZGUtPmlfc2l6ZSk7CiAJCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOwogCX0KZGlmZiAtLWdpdCBhL2ZzL2dmczIvb3BzX2RlbnRyeS5jIGIvZnMvZ2ZzMi9vcHNfZGVudHJ5LmMKaW5kZXggNGE1ZTY3Ni4uYzJhZDM2MyAxMDA2NDQKLS0tIGEvZnMvZ2ZzMi9vcHNfZGVudHJ5LmMKKysrIGIvZnMvZ2ZzMi9vcHNfZGVudHJ5LmMKQEAgLTE5LDcgKzE5LDcgQEAKICNpbmNsdWRlICJpbmNvcmUuaCIKICNpbmNsdWRlICJkaXIuaCIKICNpbmNsdWRlICJnbG9jay5oIgotI2luY2x1ZGUgIm9wc19kZW50cnkuaCIKKyNpbmNsdWRlICJzdXBlci5oIgogI2luY2x1ZGUgInV0aWwuaCIKICNpbmNsdWRlICJpbm9kZS5oIgogCmRpZmYgLS1naXQgYS9mcy9nZnMyL29wc19kZW50cnkuaCBiL2ZzL2dmczIvb3BzX2RlbnRyeS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Y2FhM2RiLi4wMDAwMDAwCi0tLSBhL2ZzL2dmczIvb3BzX2RlbnRyeS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgU2lzdGluYSBTb2Z0d2FyZSwgSW5jLiAgMTk5Ny0yMDAzIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNiBSZWQgSGF0LCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAotICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKLSAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuCi0gKi8KLQotI2lmbmRlZiBfX09QU19ERU5UUllfRE9UX0hfXwotI2RlZmluZSBfX09QU19ERU5UUllfRE9UX0hfXwotCi0jaW5jbHVkZSA8bGludXgvZGNhY2hlLmg+Ci0KLWV4dGVybiBzdHJ1Y3QgZGVudHJ5X29wZXJhdGlvbnMgZ2ZzMl9kb3BzOwotCi0jZW5kaWYgLyogX19PUFNfREVOVFJZX0RPVF9IX18gKi8KZGlmZiAtLWdpdCBhL2ZzL2dmczIvb3BzX2V4cG9ydC5jIGIvZnMvZ2ZzMi9vcHNfZXhwb3J0LmMKaW5kZXggYmJiOGMzNi4uN2ZkZWIxNCAxMDA2NDQKLS0tIGEvZnMvZ2ZzMi9vcHNfZXhwb3J0LmMKKysrIGIvZnMvZ2ZzMi9vcHNfZXhwb3J0LmMKQEAgLTIyLDggKzIyLDcgQEAKICNpbmNsdWRlICJnbG9jay5oIgogI2luY2x1ZGUgImdsb3BzLmgiCiAjaW5jbHVkZSAiaW5vZGUuaCIKLSNpbmNsdWRlICJvcHNfZGVudHJ5LmgiCi0jaW5jbHVkZSAib3BzX2ZzdHlwZS5oIgorI2luY2x1ZGUgInN1cGVyLmgiCiAjaW5jbHVkZSAicmdycC5oIgogI2luY2x1ZGUgInV0aWwuaCIKIApAQCAtMjE0LDcgKzIxMyw3IEBACiAJfQogCiAJZXJyb3IgPSAtRUlPOwotCWlmIChHRlMyX0koaW5vZGUpLT5pX2RpLmRpX2ZsYWdzICYgR0ZTMl9ESUZfU1lTVEVNKSB7CisJaWYgKEdGUzJfSShpbm9kZSktPmlfZGlza2ZsYWdzICYgR0ZTMl9ESUZfU1lTVEVNKSB7CiAJCWlwdXQoaW5vZGUpOwogCQlnb3RvIGZhaWw7CiAJfQpkaWZmIC0tZ2l0IGEvZnMvZ2ZzMi9vcHNfZmlsZS5jIGIvZnMvZ2ZzMi9vcHNfZmlsZS5jCmluZGV4IDNhNzQ3ZjguLjkzZmU0MWIgMTAwNjQ0Ci0tLSBhL2ZzL2dmczIvb3BzX2ZpbGUuYworKysgYi9mcy9nZnMyL29wc19maWxlLmMKQEAgLTM5LDcgKzM5LDYgQEAKICNpbmNsdWRlICJ1dGlsLmgiCiAjaW5jbHVkZSAiZWFvcHMuaCIKICNpbmNsdWRlICJvcHNfYWRkcmVzcy5oIgotI2luY2x1ZGUgIm9wc19pbm9kZS5oIgogCiAvKioKICAqIGdmczJfbGxzZWVrIC0gc2VlayB0byBhIGxvY2F0aW9uIGluIGEgZmlsZQpAQCAtMTU4LDggKzE1Nyw4IEBACiAJaWYgKGVycm9yKQogCQlyZXR1cm4gZXJyb3I7CiAKLQlmc2ZsYWdzID0gZnNmbGFnc19jdnQoZ2ZzMl90b19mc2ZsYWdzLCBpcC0+aV9kaS5kaV9mbGFncyk7Ci0JaWYgKCFTX0lTRElSKGlub2RlLT5pX21vZGUpICYmIGlwLT5pX2RpLmRpX2ZsYWdzICYgR0ZTMl9ESUZfSkRBVEEpCisJZnNmbGFncyA9IGZzZmxhZ3NfY3Z0KGdmczJfdG9fZnNmbGFncywgaXAtPmlfZGlza2ZsYWdzKTsKKwlpZiAoIVNfSVNESVIoaW5vZGUtPmlfbW9kZSkgJiYgaXAtPmlfZGlza2ZsYWdzICYgR0ZTMl9ESUZfSkRBVEEpCiAJCWZzZmxhZ3MgfD0gRlNfSk9VUk5BTF9EQVRBX0ZMOwogCWlmIChwdXRfdXNlcihmc2ZsYWdzLCBwdHIpKQogCQllcnJvciA9IC1FRkFVTFQ7CkBAIC0xNzIsMTcgKzE3MSwxNiBAQAogdm9pZCBnZnMyX3NldF9pbm9kZV9mbGFncyhzdHJ1Y3QgaW5vZGUgKmlub2RlKQogewogCXN0cnVjdCBnZnMyX2lub2RlICppcCA9IEdGUzJfSShpbm9kZSk7Ci0Jc3RydWN0IGdmczJfZGlub2RlX2hvc3QgKmRpID0gJmlwLT5pX2RpOwogCXVuc2lnbmVkIGludCBmbGFncyA9IGlub2RlLT5pX2ZsYWdzOwogCiAJZmxhZ3MgJj0gfihTX1NZTkN8U19BUFBFTkR8U19JTU1VVEFCTEV8U19OT0FUSU1FfFNfRElSU1lOQyk7Ci0JaWYgKGRpLT5kaV9mbGFncyAmIEdGUzJfRElGX0lNTVVUQUJMRSkKKwlpZiAoaXAtPmlfZGlza2ZsYWdzICYgR0ZTMl9ESUZfSU1NVVRBQkxFKQogCQlmbGFncyB8PSBTX0lNTVVUQUJMRTsKLQlpZiAoZGktPmRpX2ZsYWdzICYgR0ZTMl9ESUZfQVBQRU5ET05MWSkKKwlpZiAoaXAtPmlfZGlza2ZsYWdzICYgR0ZTMl9ESUZfQVBQRU5ET05MWSkKIAkJZmxhZ3MgfD0gU19BUFBFTkQ7Ci0JaWYgKGRpLT5kaV9mbGFncyAmIEdGUzJfRElGX05PQVRJTUUpCisJaWYgKGlwLT5pX2Rpc2tmbGFncyAmIEdGUzJfRElGX05PQVRJTUUpCiAJCWZsYWdzIHw9IFNfTk9BVElNRTsKLQlpZiAoZGktPmRpX2ZsYWdzICYgR0ZTMl9ESUZfU1lOQykKKwlpZiAoaXAtPmlfZGlza2ZsYWdzICYgR0ZTMl9ESUZfU1lOQykKIAkJZmxhZ3MgfD0gU19TWU5DOwogCWlub2RlLT5pX2ZsYWdzID0gZmxhZ3M7CiB9CkBAIC0yMjEsNyArMjE5LDcgQEAKIAlpZiAoZXJyb3IpCiAJCWdvdG8gb3V0X2Ryb3Bfd3JpdGU7CiAKLQlmbGFncyA9IGlwLT5pX2RpLmRpX2ZsYWdzOworCWZsYWdzID0gaXAtPmlfZGlza2ZsYWdzOwogCW5ld19mbGFncyA9IChmbGFncyAmIH5tYXNrKSB8IChyZXFmbGFncyAmIG1hc2spOwogCWlmICgobmV3X2ZsYWdzIF4gZmxhZ3MpID09IDApCiAJCWdvdG8gb3V0OwpAQCAtMjYwLDcgKzI1OCw3IEBACiAJaWYgKGVycm9yKQogCQlnb3RvIG91dF90cmFuc19lbmQ7CiAJZ2ZzMl90cmFuc19hZGRfYmgoaXAtPmlfZ2wsIGJoLCAxKTsKLQlpcC0+aV9kaS5kaV9mbGFncyA9IG5ld19mbGFnczsKKwlpcC0+aV9kaXNrZmxhZ3MgPSBuZXdfZmxhZ3M7CiAJZ2ZzMl9kaW5vZGVfb3V0KGlwLCBiaC0+Yl9kYXRhKTsKIAlicmVsc2UoYmgpOwogCWdmczJfc2V0X2lub2RlX2ZsYWdzKGlub2RlKTsKQEAgLTM0NCw3ICszNDIsNyBAQAogCXN0cnVjdCBnZnMyX2lub2RlICppcCA9IEdGUzJfSShpbm9kZSk7CiAJc3RydWN0IGdmczJfc2JkICpzZHAgPSBHRlMyX1NCKGlub2RlKTsKIAl1bnNpZ25lZCBsb25nIGxhc3RfaW5kZXg7Ci0JdTY0IHBvcyA9IHBhZ2UtPmluZGV4IDw8IChQQUdFX0NBQ0hFX1NJWkUgLSBpbm9kZS0+aV9ibGtiaXRzKTsKKwl1NjQgcG9zID0gcGFnZS0+aW5kZXggPDwgUEFHRV9DQUNIRV9TSElGVDsKIAl1bnNpZ25lZCBpbnQgZGF0YV9ibG9ja3MsIGluZF9ibG9ja3MsIHJibG9ja3M7CiAJaW50IGFsbG9jX3JlcXVpcmVkID0gMDsKIAlzdHJ1Y3QgZ2ZzMl9ob2xkZXIgZ2g7CkBAIC0zNTcsNyArMzU1LDYgQEAKIAkJZ290byBvdXQ7CiAKIAlzZXRfYml0KEdJRl9TV19QQUdFRCwgJmlwLT5pX2ZsYWdzKTsKLQlnZnMyX3dyaXRlX2NhbGNfcmVzZXJ2KGlwLCBQQUdFX0NBQ0hFX1NJWkUsICZkYXRhX2Jsb2NrcywgJmluZF9ibG9ja3MpOwogCXJldCA9IGdmczJfd3JpdGVfYWxsb2NfcmVxdWlyZWQoaXAsIHBvcywgUEFHRV9DQUNIRV9TSVpFLCAmYWxsb2NfcmVxdWlyZWQpOwogCWlmIChyZXQgfHwgIWFsbG9jX3JlcXVpcmVkKQogCQlnb3RvIG91dF91bmxvY2s7CkBAIC0zNjksNiArMzY2LDcgQEAKIAlyZXQgPSBnZnMyX3F1b3RhX2xvY2tfY2hlY2soaXApOwogCWlmIChyZXQpCiAJCWdvdG8gb3V0X2FsbG9jX3B1dDsKKwlnZnMyX3dyaXRlX2NhbGNfcmVzZXJ2KGlwLCBQQUdFX0NBQ0hFX1NJWkUsICZkYXRhX2Jsb2NrcywgJmluZF9ibG9ja3MpOwogCWFsLT5hbF9yZXF1ZXN0ZWQgPSBkYXRhX2Jsb2NrcyArIGluZF9ibG9ja3M7CiAJcmV0ID0gZ2ZzMl9pbnBsYWNlX3Jlc2VydmUoaXApOwogCWlmIChyZXQpCkBAIC00NzksNyArNDc3LDcgQEAKIAkJCWdvdG8gZmFpbDsKIAogCQlpZiAoIShmaWxlLT5mX2ZsYWdzICYgT19MQVJHRUZJTEUpICYmCi0JCSAgICBpcC0+aV9kaS5kaV9zaXplID4gTUFYX05PTl9MRlMpIHsKKwkJICAgIGlwLT5pX2Rpc2tzaXplID4gTUFYX05PTl9MRlMpIHsKIAkJCWVycm9yID0gLUVPVkVSRkxPVzsKIAkJCWdvdG8gZmFpbF9ndW5sb2NrOwogCQl9CmRpZmYgLS1naXQgYS9mcy9nZnMyL29wc19mc3R5cGUuYyBiL2ZzL2dmczIvb3BzX2ZzdHlwZS5jCmluZGV4IGIxMTdmY2YuLmY5MWVlYmQgMTAwNjQ0Ci0tLSBhL2ZzL2dmczIvb3BzX2ZzdHlwZS5jCisrKyBiL2ZzL2dmczIvb3BzX2ZzdHlwZS5jCkBAIC0yMiwyMCArMjIsMTggQEAKICNpbmNsdWRlICJnZnMyLmgiCiAjaW5jbHVkZSAiaW5jb3JlLmgiCiAjaW5jbHVkZSAiYm1hcC5oIgotI2luY2x1ZGUgImRhZW1vbi5oIgogI2luY2x1ZGUgImdsb2NrLmgiCiAjaW5jbHVkZSAiZ2xvcHMuaCIKICNpbmNsdWRlICJpbm9kZS5oIgogI2luY2x1ZGUgIm1vdW50LmgiCi0jaW5jbHVkZSAib3BzX2ZzdHlwZS5oIgotI2luY2x1ZGUgIm9wc19kZW50cnkuaCIKLSNpbmNsdWRlICJvcHNfc3VwZXIuaCIKICNpbmNsdWRlICJyZWNvdmVyeS5oIgogI2luY2x1ZGUgInJncnAuaCIKICNpbmNsdWRlICJzdXBlci5oIgogI2luY2x1ZGUgInN5cy5oIgogI2luY2x1ZGUgInV0aWwuaCIKICNpbmNsdWRlICJsb2cuaCIKKyNpbmNsdWRlICJxdW90YS5oIgorI2luY2x1ZGUgImRpci5oIgogCiAjZGVmaW5lIERPIDAKICNkZWZpbmUgVU5ETyAxCkBAIC01OCwxMiArNTYsMTAgQEAKIHsKIAlzcGluX2xvY2tfaW5pdCgmZ3QtPmd0X3NwaW4pOwogCi0JZ3QtPmd0X2RlbW90ZV9zZWNzID0gMzAwOwogCWd0LT5ndF9pbmNvcmVfbG9nX2Jsb2NrcyA9IDEwMjQ7CiAJZ3QtPmd0X2xvZ19mbHVzaF9zZWNzID0gNjA7CiAJZ3QtPmd0X3JlY292ZXJkX3NlY3MgPSA2MDsKIAlndC0+Z3RfbG9nZF9zZWNzID0gMTsKLQlndC0+Z3RfcXVvdGFkX3NlY3MgPSA1OwogCWd0LT5ndF9xdW90YV9zaW11bF9zeW5jID0gNjQ7CiAJZ3QtPmd0X3F1b3RhX3dhcm5fcGVyaW9kID0gMTA7CiAJZ3QtPmd0X3F1b3RhX3NjYWxlX251bSA9IDE7CkBAIC05MSwxMCArODcsNiBAQAogCiAJZ2ZzMl90dW5lX2luaXQoJnNkcC0+c2RfdHVuZSk7CiAKLQlJTklUX0xJU1RfSEVBRCgmc2RwLT5zZF9yZWNsYWltX2xpc3QpOwotCXNwaW5fbG9ja19pbml0KCZzZHAtPnNkX3JlY2xhaW1fbG9jayk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmc2RwLT5zZF9yZWNsYWltX3dxKTsKLQogCW11dGV4X2luaXQoJnNkcC0+c2RfaW51bV9tdXRleCk7CiAJc3Bpbl9sb2NrX2luaXQoJnNkcC0+c2Rfc3RhdGZzX3NwaW4pOwogCkBAIC0xMTAsNiArMTAyLDkgQEAKIAlJTklUX0xJU1RfSEVBRCgmc2RwLT5zZF9xdW90YV9saXN0KTsKIAlzcGluX2xvY2tfaW5pdCgmc2RwLT5zZF9xdW90YV9zcGluKTsKIAltdXRleF9pbml0KCZzZHAtPnNkX3F1b3RhX211dGV4KTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzZHAtPnNkX3F1b3RhX3dhaXQpOworCUlOSVRfTElTVF9IRUFEKCZzZHAtPnNkX3RydW5jX2xpc3QpOworCXNwaW5fbG9ja19pbml0KCZzZHAtPnNkX3RydW5jX2xvY2spOwogCiAJc3Bpbl9sb2NrX2luaXQoJnNkcC0+c2RfbG9nX2xvY2spOwogCkBAIC00NDMsMjQgKzQzOCwxMSBAQAogc3RhdGljIGludCBpbml0X2xvY2tpbmcoc3RydWN0IGdmczJfc2JkICpzZHAsIHN0cnVjdCBnZnMyX2hvbGRlciAqbW91bnRfZ2gsCiAJCQlpbnQgdW5kbykKIHsKLQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnA7CiAJaW50IGVycm9yID0gMDsKIAogCWlmICh1bmRvKQogCQlnb3RvIGZhaWxfdHJhbnM7CiAKLQlmb3IgKHNkcC0+c2RfZ2xvY2tkX251bSA9IDA7Ci0JICAgICBzZHAtPnNkX2dsb2NrZF9udW0gPCBzZHAtPnNkX2FyZ3MuYXJfbnVtX2dsb2NrZDsKLQkgICAgIHNkcC0+c2RfZ2xvY2tkX251bSsrKSB7Ci0JCXAgPSBrdGhyZWFkX3J1bihnZnMyX2dsb2NrZCwgc2RwLCAiZ2ZzMl9nbG9ja2QiKTsKLQkJZXJyb3IgPSBJU19FUlIocCk7Ci0JCWlmIChlcnJvcikgewotCQkJZnNfZXJyKHNkcCwgImNhbid0IHN0YXJ0IGdsb2NrZCB0aHJlYWQ6ICVkXG4iLCBlcnJvcik7Ci0JCQlnb3RvIGZhaWw7Ci0JCX0KLQkJc2RwLT5zZF9nbG9ja2RfcHJvY2Vzc1tzZHAtPnNkX2dsb2NrZF9udW1dID0gcDsKLQl9Ci0KIAllcnJvciA9IGdmczJfZ2xvY2tfbnFfbnVtKHNkcCwKIAkJCQkgIEdGUzJfTU9VTlRfTE9DSywgJmdmczJfbm9uZGlza19nbG9wcywKIAkJCQkgIExNX1NUX0VYQ0xVU0lWRSwgTE1fRkxBR19OT0VYUCB8IEdMX05PQ0FDSEUsCkBAIC00OTMsNyArNDc1LDYgQEAKIAkJZnNfZXJyKHNkcCwgImNhbid0IGNyZWF0ZSB0cmFuc2FjdGlvbiBnbG9jazogJWRcbiIsIGVycm9yKTsKIAkJZ290byBmYWlsX3JlbmFtZTsKIAl9Ci0Jc2V0X2JpdChHTEZfU1RJQ0tZLCAmc2RwLT5zZF90cmFuc19nbC0+Z2xfZmxhZ3MpOwogCiAJcmV0dXJuIDA7CiAKQEAgLTUwNiw5ICs0ODcsNiBAQAogZmFpbF9tb3VudDoKIAlnZnMyX2dsb2NrX2RxX3VuaW5pdChtb3VudF9naCk7CiBmYWlsOgotCXdoaWxlIChzZHAtPnNkX2dsb2NrZF9udW0tLSkKLQkJa3RocmVhZF9zdG9wKHNkcC0+c2RfZ2xvY2tkX3Byb2Nlc3Nbc2RwLT5zZF9nbG9ja2RfbnVtXSk7Ci0KIAlyZXR1cm4gZXJyb3I7CiB9CiAKQEAgLTYyMCw3ICs1OTgsNyBAQAogCiAJcHJldl9kYiA9IDA7CiAKLQlmb3IgKGxiID0gMDsgbGIgPCBpcC0+aV9kaS5kaV9zaXplID4+IHNkcC0+c2Rfc2Iuc2JfYnNpemVfc2hpZnQ7IGxiKyspIHsKKwlmb3IgKGxiID0gMDsgbGIgPCBpcC0+aV9kaXNrc2l6ZSA+PiBzZHAtPnNkX3NiLnNiX2JzaXplX3NoaWZ0OyBsYisrKSB7CiAJCWJoLmJfc3RhdGUgPSAwOwogCQliaC5iX2Jsb2NrbnIgPSAwOwogCQliaC5iX3NpemUgPSAxIDw8IGlwLT5pX2lub2RlLmlfYmxrYml0czsKQEAgLTY2MSw2ICs2MzksNzIgQEAKIAkJCQkJc2RwLT5zZF9sb2Nrc3RydWN0LmxzX2xvY2tzcGFjZSk7CiB9CiAKKy8qKgorICogZ2ZzMl9qaW5kZXhfaG9sZCAtIEdyYWIgYSBsb2NrIG9uIHRoZSBqaW5kZXgKKyAqIEBzZHA6IFRoZSBHRlMyIHN1cGVyYmxvY2sKKyAqIEBqaV9naDogdGhlIGhvbGRlciBmb3IgdGhlIGppbmRleCBnbG9jaworICoKKyAqIFJldHVybnM6IGVycm5vCisgKi8KKworc3RhdGljIGludCBnZnMyX2ppbmRleF9ob2xkKHN0cnVjdCBnZnMyX3NiZCAqc2RwLCBzdHJ1Y3QgZ2ZzMl9ob2xkZXIgKmppX2doKQoreworCXN0cnVjdCBnZnMyX2lub2RlICpkaXAgPSBHRlMyX0koc2RwLT5zZF9qaW5kZXgpOworCXN0cnVjdCBxc3RyIG5hbWU7CisJY2hhciBidWZbMjBdOworCXN0cnVjdCBnZnMyX2pkZXNjICpqZDsKKwlpbnQgZXJyb3I7CisKKwluYW1lLm5hbWUgPSBidWY7CisKKwltdXRleF9sb2NrKCZzZHAtPnNkX2ppbmRleF9tdXRleCk7CisKKwlmb3IgKDs7KSB7CisJCWVycm9yID0gZ2ZzMl9nbG9ja19ucV9pbml0KGRpcC0+aV9nbCwgTE1fU1RfU0hBUkVELCAwLCBqaV9naCk7CisJCWlmIChlcnJvcikKKwkJCWJyZWFrOworCisJCW5hbWUubGVuID0gc3ByaW50ZihidWYsICJqb3VybmFsJXUiLCBzZHAtPnNkX2pvdXJuYWxzKTsKKwkJbmFtZS5oYXNoID0gZ2ZzMl9kaXNrX2hhc2gobmFtZS5uYW1lLCBuYW1lLmxlbik7CisKKwkJZXJyb3IgPSBnZnMyX2Rpcl9jaGVjayhzZHAtPnNkX2ppbmRleCwgJm5hbWUsIE5VTEwpOworCQlpZiAoZXJyb3IgPT0gLUVOT0VOVCkgeworCQkJZXJyb3IgPSAwOworCQkJYnJlYWs7CisJCX0KKworCQlnZnMyX2dsb2NrX2RxX3VuaW5pdChqaV9naCk7CisKKwkJaWYgKGVycm9yKQorCQkJYnJlYWs7CisKKwkJZXJyb3IgPSAtRU5PTUVNOworCQlqZCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBnZnMyX2pkZXNjKSwgR0ZQX0tFUk5FTCk7CisJCWlmICghamQpCisJCQlicmVhazsKKworCQlJTklUX0xJU1RfSEVBRCgmamQtPmV4dGVudF9saXN0KTsKKwkJamQtPmpkX2lub2RlID0gZ2ZzMl9sb29rdXBpKHNkcC0+c2RfamluZGV4LCAmbmFtZSwgMSk7CisJCWlmICghamQtPmpkX2lub2RlIHx8IElTX0VSUihqZC0+amRfaW5vZGUpKSB7CisJCQlpZiAoIWpkLT5qZF9pbm9kZSkKKwkJCQllcnJvciA9IC1FTk9FTlQ7CisJCQllbHNlCisJCQkJZXJyb3IgPSBQVFJfRVJSKGpkLT5qZF9pbm9kZSk7CisJCQlrZnJlZShqZCk7CisJCQlicmVhazsKKwkJfQorCisJCXNwaW5fbG9jaygmc2RwLT5zZF9qaW5kZXhfc3Bpbik7CisJCWpkLT5qZF9qaWQgPSBzZHAtPnNkX2pvdXJuYWxzKys7CisJCWxpc3RfYWRkX3RhaWwoJmpkLT5qZF9saXN0LCAmc2RwLT5zZF9qaW5kZXhfbGlzdCk7CisJCXNwaW5fdW5sb2NrKCZzZHAtPnNkX2ppbmRleF9zcGluKTsKKwl9CisKKwltdXRleF91bmxvY2soJnNkcC0+c2RfamluZGV4X211dGV4KTsKKworCXJldHVybiBlcnJvcjsKK30KKwogc3RhdGljIGludCBpbml0X2pvdXJuYWwoc3RydWN0IGdmczJfc2JkICpzZHAsIGludCB1bmRvKQogewogCXN0cnVjdCBpbm9kZSAqbWFzdGVyID0gc2RwLT5zZF9tYXN0ZXJfZGlyLT5kX2lub2RlOwpAQCAtNjgxLDcgKzcyNSw2IEBACiAJCXJldHVybiBQVFJfRVJSKHNkcC0+c2RfamluZGV4KTsKIAl9CiAJaXAgPSBHRlMyX0koc2RwLT5zZF9qaW5kZXgpOwotCXNldF9iaXQoR0xGX1NUSUNLWSwgJmlwLT5pX2dsLT5nbF9mbGFncyk7CiAKIAkvKiBMb2FkIGluIHRoZSBqb3VybmFsIGluZGV4IHNwZWNpYWwgZmlsZSAqLwogCkBAIC04MzIsNyArODc1LDYgQEAKIAkJZ290byBmYWlsX3N0YXRmczsKIAl9CiAJaXAgPSBHRlMyX0koc2RwLT5zZF9yaW5kZXgpOwotCXNldF9iaXQoR0xGX1NUSUNLWSwgJmlwLT5pX2dsLT5nbF9mbGFncyk7CiAJc2RwLT5zZF9yaW5kZXhfdXB0b2RhdGUgPSAwOwogCiAJLyogUmVhZCBpbiB0aGUgcXVvdGEgaW5vZGUgKi8KQEAgLTk3Myw5ICsxMDE1LDYgQEAKIAl9CiAJc2RwLT5zZF9sb2dkX3Byb2Nlc3MgPSBwOwogCi0Jc2RwLT5zZF9zdGF0ZnNfc3luY190aW1lID0gamlmZmllczsKLQlzZHAtPnNkX3F1b3RhX3N5bmNfdGltZSA9IGppZmZpZXM7Ci0KIAlwID0ga3RocmVhZF9ydW4oZ2ZzMl9xdW90YWQsIHNkcCwgImdmczJfcXVvdGFkIik7CiAJZXJyb3IgPSBJU19FUlIocCk7CiAJaWYgKGVycm9yKSB7CkBAIC0xMjI0LDE3ICsxMjYzLDIxIEBACiBzdGF0aWMgdm9pZCBnZnMyX2tpbGxfc2Ioc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKIHsKIAlzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCA9IHNiLT5zX2ZzX2luZm87Ci0JaWYgKHNkcCkgewotCQlnZnMyX21ldGFfc3luY2ZzKHNkcCk7Ci0JCWRwdXQoc2RwLT5zZF9yb290X2Rpcik7Ci0JCWRwdXQoc2RwLT5zZF9tYXN0ZXJfZGlyKTsKLQkJc2RwLT5zZF9yb290X2RpciA9IE5VTEw7Ci0JCXNkcC0+c2RfbWFzdGVyX2RpciA9IE5VTEw7CisKKwlpZiAoc2RwID09IE5VTEwpIHsKKwkJa2lsbF9ibG9ja19zdXBlcihzYik7CisJCXJldHVybjsKIAl9CisKKwlnZnMyX21ldGFfc3luY2ZzKHNkcCk7CisJZHB1dChzZHAtPnNkX3Jvb3RfZGlyKTsKKwlkcHV0KHNkcC0+c2RfbWFzdGVyX2Rpcik7CisJc2RwLT5zZF9yb290X2RpciA9IE5VTEw7CisJc2RwLT5zZF9tYXN0ZXJfZGlyID0gTlVMTDsKIAlzaHJpbmtfZGNhY2hlX3NiKHNiKTsKIAlraWxsX2Jsb2NrX3N1cGVyKHNiKTsKLQlpZiAoc2RwKQotCQlnZnMyX2RlbGV0ZV9kZWJ1Z2ZzX2ZpbGUoc2RwKTsKKwlnZnMyX2RlbGV0ZV9kZWJ1Z2ZzX2ZpbGUoc2RwKTsKKwlrZnJlZShzZHApOwogfQogCiBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSBnZnMyX2ZzX3R5cGUgPSB7CmRpZmYgLS1naXQgYS9mcy9nZnMyL29wc19mc3R5cGUuaCBiL2ZzL2dmczIvb3BzX2ZzdHlwZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTg0OTA1Li4wMDAwMDAwCi0tLSBhL2ZzL2dmczIvb3BzX2ZzdHlwZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgU2lzdGluYSBTb2Z0d2FyZSwgSW5jLiAgMTk5Ny0yMDAzIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNiBSZWQgSGF0LCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAotICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKLSAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuCi0gKi8KLQotI2lmbmRlZiBfX09QU19GU1RZUEVfRE9UX0hfXwotI2RlZmluZSBfX09QU19GU1RZUEVfRE9UX0hfXwotCi0jaW5jbHVkZSA8bGludXgvZnMuaD4KLQotZXh0ZXJuIHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlIGdmczJfZnNfdHlwZTsKLWV4dGVybiBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSBnZnMybWV0YV9mc190eXBlOwotZXh0ZXJuIGNvbnN0IHN0cnVjdCBleHBvcnRfb3BlcmF0aW9ucyBnZnMyX2V4cG9ydF9vcHM7Ci0KLSNlbmRpZiAvKiBfX09QU19GU1RZUEVfRE9UX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZnMvZ2ZzMi9vcHNfaW5vZGUuYyBiL2ZzL2dmczIvb3BzX2lub2RlLmMKaW5kZXggZDIzMjk5MS4uNDk4Nzc1NCAxMDA2NDQKLS0tIGEvZnMvZ2ZzMi9vcHNfaW5vZGUuYworKysgYi9mcy9nZnMyL29wc19pbm9kZS5jCkBAIC0xOSw2ICsxOSw3IEBACiAjaW5jbHVkZSA8bGludXgvZ2ZzMl9vbmRpc2suaD4KICNpbmNsdWRlIDxsaW51eC9jcmMzMi5oPgogI2luY2x1ZGUgPGxpbnV4L2xtX2ludGVyZmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZpZW1hcC5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAKICNpbmNsdWRlICJnZnMyLmgiCkBAIC0zMSwxMiArMzIsMTEgQEAKICNpbmNsdWRlICJnbG9jay5oIgogI2luY2x1ZGUgImlub2RlLmgiCiAjaW5jbHVkZSAibWV0YV9pby5oIgotI2luY2x1ZGUgIm9wc19kZW50cnkuaCIKLSNpbmNsdWRlICJvcHNfaW5vZGUuaCIKICNpbmNsdWRlICJxdW90YS5oIgogI2luY2x1ZGUgInJncnAuaCIKICNpbmNsdWRlICJ0cmFucy5oIgogI2luY2x1ZGUgInV0aWwuaCIKKyNpbmNsdWRlICJzdXBlci5oIgogCiAvKioKICAqIGdmczJfY3JlYXRlIC0gQ3JlYXRlIGEgZmlsZQpAQCAtMTg1LDcgKzE4NSw3IEBACiAJaWYgKCFkaXAtPmlfaW5vZGUuaV9ubGluaykKIAkJZ290byBvdXRfZ3VubG9jazsKIAllcnJvciA9IC1FRkJJRzsKLQlpZiAoZGlwLT5pX2RpLmRpX2VudHJpZXMgPT0gKHUzMiktMSkKKwlpZiAoZGlwLT5pX2VudHJpZXMgPT0gKHUzMiktMSkKIAkJZ290byBvdXRfZ3VubG9jazsKIAllcnJvciA9IC1FUEVSTTsKIAlpZiAoSVNfSU1NVVRBQkxFKGlub2RlKSB8fCBJU19BUFBFTkQoaW5vZGUpKQpAQCAtMzcxLDcgKzM3MSw3IEBACiAKIAlpcCA9IGdoc1sxXS5naF9nbC0+Z2xfb2JqZWN0OwogCi0JaXAtPmlfZGkuZGlfc2l6ZSA9IHNpemU7CisJaXAtPmlfZGlza3NpemUgPSBzaXplOwogCiAJZXJyb3IgPSBnZnMyX21ldGFfaW5vZGVfYnVmZmVyKGlwLCAmZGliaCk7CiAKQEAgLTQyNSw5ICs0MjUsOSBAQAogCWlwID0gZ2hzWzFdLmdoX2dsLT5nbF9vYmplY3Q7CiAKIAlpcC0+aV9pbm9kZS5pX25saW5rID0gMjsKLQlpcC0+aV9kaS5kaV9zaXplID0gc2RwLT5zZF9zYi5zYl9ic2l6ZSAtIHNpemVvZihzdHJ1Y3QgZ2ZzMl9kaW5vZGUpOwotCWlwLT5pX2RpLmRpX2ZsYWdzIHw9IEdGUzJfRElGX0pEQVRBOwotCWlwLT5pX2RpLmRpX2VudHJpZXMgPSAyOworCWlwLT5pX2Rpc2tzaXplID0gc2RwLT5zZF9zYi5zYl9ic2l6ZSAtIHNpemVvZihzdHJ1Y3QgZ2ZzMl9kaW5vZGUpOworCWlwLT5pX2Rpc2tmbGFncyB8PSBHRlMyX0RJRl9KREFUQTsKKwlpcC0+aV9lbnRyaWVzID0gMjsKIAogCWVycm9yID0gZ2ZzMl9tZXRhX2lub2RlX2J1ZmZlcihpcCwgJmRpYmgpOwogCkBAIC01MTcsMTMgKzUxNywxMyBAQAogCWlmIChlcnJvcikKIAkJZ290byBvdXRfZ3VubG9jazsKIAotCWlmIChpcC0+aV9kaS5kaV9lbnRyaWVzIDwgMikgeworCWlmIChpcC0+aV9lbnRyaWVzIDwgMikgewogCQlpZiAoZ2ZzMl9jb25zaXN0X2lub2RlKGlwKSkKIAkJCWdmczJfZGlub2RlX3ByaW50KGlwKTsKIAkJZXJyb3IgPSAtRUlPOwogCQlnb3RvIG91dF9ndW5sb2NrOwogCX0KLQlpZiAoaXAtPmlfZGkuZGlfZW50cmllcyA+IDIpIHsKKwlpZiAoaXAtPmlfZW50cmllcyA+IDIpIHsKIAkJZXJyb3IgPSAtRU5PVEVNUFRZOwogCQlnb3RvIG91dF9ndW5sb2NrOwogCX0KQEAgLTcyNiwxMyArNzI2LDEzIEBACiAJCQlnb3RvIG91dF9ndW5sb2NrOwogCiAJCWlmIChTX0lTRElSKG5pcC0+aV9pbm9kZS5pX21vZGUpKSB7Ci0JCQlpZiAobmlwLT5pX2RpLmRpX2VudHJpZXMgPCAyKSB7CisJCQlpZiAobmlwLT5pX2VudHJpZXMgPCAyKSB7CiAJCQkJaWYgKGdmczJfY29uc2lzdF9pbm9kZShuaXApKQogCQkJCQlnZnMyX2Rpbm9kZV9wcmludChuaXApOwogCQkJCWVycm9yID0gLUVJTzsKIAkJCQlnb3RvIG91dF9ndW5sb2NrOwogCQkJfQotCQkJaWYgKG5pcC0+aV9kaS5kaV9lbnRyaWVzID4gMikgeworCQkJaWYgKG5pcC0+aV9lbnRyaWVzID4gMikgewogCQkJCWVycm9yID0gLUVOT1RFTVBUWTsKIAkJCQlnb3RvIG91dF9ndW5sb2NrOwogCQkJfQpAQCAtNzU4LDcgKzc1OCw3IEBACiAJCQkJZXJyb3IgPSAtRUlOVkFMOwogCQkJCWdvdG8gb3V0X2d1bmxvY2s7CiAJCQl9Ci0JCQlpZiAobmRpcC0+aV9kaS5kaV9lbnRyaWVzID09ICh1MzIpLTEpIHsKKwkJCWlmIChuZGlwLT5pX2VudHJpZXMgPT0gKHUzMiktMSkgewogCQkJCWVycm9yID0gLUVGQklHOwogCQkJCWdvdG8gb3V0X2d1bmxvY2s7CiAJCQl9CkBAIC05OTAsNyArOTkwLDcgQEAKIAlzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCA9IEdGUzJfU0IoaW5vZGUpOwogCWludCBlcnJvcjsKIAotCWlmIChhdHRyLT5pYV9zaXplICE9IGlwLT5pX2RpLmRpX3NpemUpIHsKKwlpZiAoYXR0ci0+aWFfc2l6ZSAhPSBpcC0+aV9kaXNrc2l6ZSkgewogCQllcnJvciA9IGdmczJfdHJhbnNfYmVnaW4oc2RwLCAwLCBzZHAtPnNkX2pkZXNjLT5qZF9ibG9ja3MpOwogCQlpZiAoZXJyb3IpCiAJCQlyZXR1cm4gZXJyb3I7CkBAIC0xMDAxLDggKzEwMDEsOCBAQAogCX0KIAogCWVycm9yID0gZ2ZzMl90cnVuY2F0ZWkoaXAsIGF0dHItPmlhX3NpemUpOwotCWlmIChlcnJvciAmJiAoaW5vZGUtPmlfc2l6ZSAhPSBpcC0+aV9kaS5kaV9zaXplKSkKLQkJaV9zaXplX3dyaXRlKGlub2RlLCBpcC0+aV9kaS5kaV9zaXplKTsKKwlpZiAoZXJyb3IgJiYgKGlub2RlLT5pX3NpemUgIT0gaXAtPmlfZGlza3NpemUpKQorCQlpX3NpemVfd3JpdGUoaW5vZGUsIGlwLT5pX2Rpc2tzaXplKTsKIAogCXJldHVybiBlcnJvcjsKIH0KQEAgLTEyMTIsNiArMTIxMiw0OCBAQAogCXJldHVybiBnZnMyX2VhX3JlbW92ZShHRlMyX0koZGVudHJ5LT5kX2lub2RlKSwgJmVyKTsKIH0KIAorc3RhdGljIGludCBnZnMyX2ZpZW1hcChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmllbWFwX2V4dGVudF9pbmZvICpmaWVpbmZvLAorCQkgICAgICAgdTY0IHN0YXJ0LCB1NjQgbGVuKQoreworCXN0cnVjdCBnZnMyX2lub2RlICppcCA9IEdGUzJfSShpbm9kZSk7CisJc3RydWN0IGdmczJfaG9sZGVyIGdoOworCWludCByZXQ7CisKKwlyZXQgPSBmaWVtYXBfY2hlY2tfZmxhZ3MoZmllaW5mbywgRklFTUFQX0ZMQUdfU1lOQyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCW11dGV4X2xvY2soJmlub2RlLT5pX211dGV4KTsKKworCXJldCA9IGdmczJfZ2xvY2tfbnFfaW5pdChpcC0+aV9nbCwgTE1fU1RfU0hBUkVELCAwLCAmZ2gpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJaWYgKGdmczJfaXNfc3R1ZmZlZChpcCkpIHsKKwkJdTY0IHBoeXMgPSBpcC0+aV9ub19hZGRyIDw8IGlub2RlLT5pX2Jsa2JpdHM7CisJCXU2NCBzaXplID0gaV9zaXplX3JlYWQoaW5vZGUpOworCQl1MzIgZmxhZ3MgPSBGSUVNQVBfRVhURU5UX0xBU1R8RklFTUFQX0VYVEVOVF9OT1RfQUxJR05FRHwKKwkJCSAgICBGSUVNQVBfRVhURU5UX0RBVEFfSU5MSU5FOworCQlwaHlzICs9IHNpemVvZihzdHJ1Y3QgZ2ZzMl9kaW5vZGUpOworCQlwaHlzICs9IHN0YXJ0OworCQlpZiAoc3RhcnQgKyBsZW4gPiBzaXplKQorCQkJbGVuID0gc2l6ZSAtIHN0YXJ0OworCQlpZiAoc3RhcnQgPCBzaXplKQorCQkJcmV0ID0gZmllbWFwX2ZpbGxfbmV4dF9leHRlbnQoZmllaW5mbywgc3RhcnQsIHBoeXMsCisJCQkJCQkgICAgICBsZW4sIGZsYWdzKTsKKwkJaWYgKHJldCA9PSAxKQorCQkJcmV0ID0gMDsKKwl9IGVsc2UgeworCQlyZXQgPSBfX2dlbmVyaWNfYmxvY2tfZmllbWFwKGlub2RlLCBmaWVpbmZvLCBzdGFydCwgbGVuLAorCQkJCQkgICAgIGdmczJfYmxvY2tfbWFwKTsKKwl9CisKKwlnZnMyX2dsb2NrX2RxX3VuaW5pdCgmZ2gpOworb3V0OgorCW11dGV4X3VubG9jaygmaW5vZGUtPmlfbXV0ZXgpOworCXJldHVybiByZXQ7Cit9CisKIGNvbnN0IHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGdmczJfZmlsZV9pb3BzID0gewogCS5wZXJtaXNzaW9uID0gZ2ZzMl9wZXJtaXNzaW9uLAogCS5zZXRhdHRyID0gZ2ZzMl9zZXRhdHRyLApAQCAtMTIyMCw2ICsxMjYyLDcgQEAKIAkuZ2V0eGF0dHIgPSBnZnMyX2dldHhhdHRyLAogCS5saXN0eGF0dHIgPSBnZnMyX2xpc3R4YXR0ciwKIAkucmVtb3ZleGF0dHIgPSBnZnMyX3JlbW92ZXhhdHRyLAorCS5maWVtYXAgPSBnZnMyX2ZpZW1hcCwKIH07CiAKIGNvbnN0IHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGdmczJfZGlyX2lvcHMgPSB7CkBAIC0xMjM5LDYgKzEyODIsNyBAQAogCS5nZXR4YXR0ciA9IGdmczJfZ2V0eGF0dHIsCiAJLmxpc3R4YXR0ciA9IGdmczJfbGlzdHhhdHRyLAogCS5yZW1vdmV4YXR0ciA9IGdmczJfcmVtb3ZleGF0dHIsCisJLmZpZW1hcCA9IGdmczJfZmllbWFwLAogfTsKIAogY29uc3Qgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgZ2ZzMl9zeW1saW5rX2lvcHMgPSB7CkBAIC0xMjUxLDUgKzEyOTUsNiBAQAogCS5nZXR4YXR0ciA9IGdmczJfZ2V0eGF0dHIsCiAJLmxpc3R4YXR0ciA9IGdmczJfbGlzdHhhdHRyLAogCS5yZW1vdmV4YXR0ciA9IGdmczJfcmVtb3ZleGF0dHIsCisJLmZpZW1hcCA9IGdmczJfZmllbWFwLAogfTsKIApkaWZmIC0tZ2l0IGEvZnMvZ2ZzMi9vcHNfaW5vZGUuaCBiL2ZzL2dmczIvb3BzX2lub2RlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0YjRiNzkuLjAwMDAwMDAKLS0tIGEvZnMvZ2ZzMi9vcHNfaW5vZGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIFNpc3RpbmEgU29mdHdhcmUsIEluYy4gIDE5OTctMjAwMyBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDYgUmVkIEhhdCwgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKLSAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCi0gKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLgotICovCi0KLSNpZm5kZWYgX19PUFNfSU5PREVfRE9UX0hfXwotI2RlZmluZSBfX09QU19JTk9ERV9ET1RfSF9fCi0KLSNpbmNsdWRlIDxsaW51eC9mcy5oPgotCi1leHRlcm4gY29uc3Qgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgZ2ZzMl9maWxlX2lvcHM7Ci1leHRlcm4gY29uc3Qgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgZ2ZzMl9kaXJfaW9wczsKLWV4dGVybiBjb25zdCBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBnZnMyX3N5bWxpbmtfaW9wczsKLWV4dGVybiBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGdmczJfZmlsZV9mb3BzOwotZXh0ZXJuIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZ2ZzMl9kaXJfZm9wczsKLWV4dGVybiBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGdmczJfZmlsZV9mb3BzX25vbG9jazsKLWV4dGVybiBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGdmczJfZGlyX2ZvcHNfbm9sb2NrOwotCi1leHRlcm4gdm9pZCBnZnMyX3NldF9pbm9kZV9mbGFncyhzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKLQotI2VuZGlmIC8qIF9fT1BTX0lOT0RFX0RPVF9IX18gKi8KZGlmZiAtLWdpdCBhL2ZzL2dmczIvb3BzX3N1cGVyLmMgYi9mcy9nZnMyL29wc19zdXBlci5jCmluZGV4IGQ1MzU1ZDkuLjc3Nzc4M2QgMTAwNjQ0Ci0tLSBhL2ZzL2dmczIvb3BzX3N1cGVyLmMKKysrIGIvZnMvZ2ZzMi9vcHNfc3VwZXIuYwpAQCAtMjgsNyArMjgsNiBAQAogI2luY2x1ZGUgImlub2RlLmgiCiAjaW5jbHVkZSAibG9nLmgiCiAjaW5jbHVkZSAibW91bnQuaCIKLSNpbmNsdWRlICJvcHNfc3VwZXIuaCIKICNpbmNsdWRlICJxdW90YS5oIgogI2luY2x1ZGUgInJlY292ZXJ5LmgiCiAjaW5jbHVkZSAicmdycC5oIgpAQCAtMTQzLDggKzE0Miw2IEBACiAJa3RocmVhZF9zdG9wKHNkcC0+c2RfcXVvdGFkX3Byb2Nlc3MpOwogCWt0aHJlYWRfc3RvcChzZHAtPnNkX2xvZ2RfcHJvY2Vzcyk7CiAJa3RocmVhZF9zdG9wKHNkcC0+c2RfcmVjb3ZlcmRfcHJvY2Vzcyk7Ci0Jd2hpbGUgKHNkcC0+c2RfZ2xvY2tkX251bS0tKQotCQlrdGhyZWFkX3N0b3Aoc2RwLT5zZF9nbG9ja2RfcHJvY2Vzc1tzZHAtPnNkX2dsb2NrZF9udW1dKTsKIAogCWlmICghKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSkgewogCQllcnJvciA9IGdmczJfbWFrZV9mc19ybyhzZHApOwpAQCAtMTg1LDcgKzE4Miw2IEBACiAKIAkvKiAgQXQgdGhpcyBwb2ludCwgd2UncmUgdGhyb3VnaCBwYXJ0aWNpcGF0aW5nIGluIHRoZSBsb2Nrc3BhY2UgICovCiAJZ2ZzMl9zeXNfZnNfZGVsKHNkcCk7Ci0Ja2ZyZWUoc2RwKTsKIH0KIAogLyoqCkBAIC0yNjAsNiArMjU2LDEzNyBAQAogfQogCiAvKioKKyAqIHN0YXRmc19maWxsIC0gZmlsbCBpbiB0aGUgc2cgZm9yIGEgZ2l2ZW4gUkcKKyAqIEByZ2Q6IHRoZSBSRworICogQHNjOiB0aGUgc2Mgc3RydWN0dXJlCisgKgorICogUmV0dXJuczogMCBvbiBzdWNjZXNzLCAtRVNUQUxFIGlmIHRoZSBMVkIgaXMgaW52YWxpZAorICovCisKK3N0YXRpYyBpbnQgc3RhdGZzX3Nsb3dfZmlsbChzdHJ1Y3QgZ2ZzMl9yZ3JwZCAqcmdkLAorCQkJICAgIHN0cnVjdCBnZnMyX3N0YXRmc19jaGFuZ2VfaG9zdCAqc2MpCit7CisJZ2ZzMl9yZ3JwX3ZlcmlmeShyZ2QpOworCXNjLT5zY190b3RhbCArPSByZ2QtPnJkX2RhdGE7CisJc2MtPnNjX2ZyZWUgKz0gcmdkLT5yZF9mcmVlOworCXNjLT5zY19kaW5vZGVzICs9IHJnZC0+cmRfZGlub2RlczsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBnZnMyX3N0YXRmc19zbG93IC0gU3RhdCBhIGZpbGVzeXN0ZW0gdXNpbmcgYXN5bmNocm9ub3VzIGxvY2tpbmcKKyAqIEBzZHA6IHRoZSBmaWxlc3lzdGVtCisgKiBAc2M6IHRoZSBzYyBpbmZvIHRoYXQgd2lsbCBiZSByZXR1cm5lZAorICoKKyAqIEFueSBlcnJvciAob3RoZXIgdGhhbiBhIHNpZ25hbCkgd2lsbCBjYXVzZSB0aGlzIHJvdXRpbmUgdG8gZmFsbCBiYWNrCisgKiB0byB0aGUgc3luY2hyb25vdXMgdmVyc2lvbi4KKyAqCisgKiBGSVhNRTogVGhpcyByZWFsbHkgc2hvdWxkbid0IGJ1c3kgd2FpdCBsaWtlIHRoaXMuCisgKgorICogUmV0dXJuczogZXJybm8KKyAqLworCitzdGF0aWMgaW50IGdmczJfc3RhdGZzX3Nsb3coc3RydWN0IGdmczJfc2JkICpzZHAsIHN0cnVjdCBnZnMyX3N0YXRmc19jaGFuZ2VfaG9zdCAqc2MpCit7CisJc3RydWN0IGdmczJfaG9sZGVyIHJpX2doOworCXN0cnVjdCBnZnMyX3JncnBkICpyZ2RfbmV4dDsKKwlzdHJ1Y3QgZ2ZzMl9ob2xkZXIgKmdoYSwgKmdoOworCXVuc2lnbmVkIGludCBzbG90cyA9IDY0OworCXVuc2lnbmVkIGludCB4OworCWludCBkb25lOworCWludCBlcnJvciA9IDAsIGVycjsKKworCW1lbXNldChzYywgMCwgc2l6ZW9mKHN0cnVjdCBnZnMyX3N0YXRmc19jaGFuZ2VfaG9zdCkpOworCWdoYSA9IGtjYWxsb2Moc2xvdHMsIHNpemVvZihzdHJ1Y3QgZ2ZzMl9ob2xkZXIpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWdoYSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwllcnJvciA9IGdmczJfcmluZGV4X2hvbGQoc2RwLCAmcmlfZ2gpOworCWlmIChlcnJvcikKKwkJZ290byBvdXQ7CisKKwlyZ2RfbmV4dCA9IGdmczJfcmdycGRfZ2V0X2ZpcnN0KHNkcCk7CisKKwlmb3IgKDs7KSB7CisJCWRvbmUgPSAxOworCisJCWZvciAoeCA9IDA7IHggPCBzbG90czsgeCsrKSB7CisJCQlnaCA9IGdoYSArIHg7CisKKwkJCWlmIChnaC0+Z2hfZ2wgJiYgZ2ZzMl9nbG9ja19wb2xsKGdoKSkgeworCQkJCWVyciA9IGdmczJfZ2xvY2tfd2FpdChnaCk7CisJCQkJaWYgKGVycikgeworCQkJCQlnZnMyX2hvbGRlcl91bmluaXQoZ2gpOworCQkJCQllcnJvciA9IGVycjsKKwkJCQl9IGVsc2UgeworCQkJCQlpZiAoIWVycm9yKQorCQkJCQkJZXJyb3IgPSBzdGF0ZnNfc2xvd19maWxsKAorCQkJCQkJCWdoLT5naF9nbC0+Z2xfb2JqZWN0LCBzYyk7CisJCQkJCWdmczJfZ2xvY2tfZHFfdW5pbml0KGdoKTsKKwkJCQl9CisJCQl9CisKKwkJCWlmIChnaC0+Z2hfZ2wpCisJCQkJZG9uZSA9IDA7CisJCQllbHNlIGlmIChyZ2RfbmV4dCAmJiAhZXJyb3IpIHsKKwkJCQllcnJvciA9IGdmczJfZ2xvY2tfbnFfaW5pdChyZ2RfbmV4dC0+cmRfZ2wsCisJCQkJCQkJICAgTE1fU1RfU0hBUkVELAorCQkJCQkJCSAgIEdMX0FTWU5DLAorCQkJCQkJCSAgIGdoKTsKKwkJCQlyZ2RfbmV4dCA9IGdmczJfcmdycGRfZ2V0X25leHQocmdkX25leHQpOworCQkJCWRvbmUgPSAwOworCQkJfQorCisJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCQkJZXJyb3IgPSAtRVJFU1RBUlRTWVM7CisJCX0KKworCQlpZiAoZG9uZSkKKwkJCWJyZWFrOworCisJCXlpZWxkKCk7CisJfQorCisJZ2ZzMl9nbG9ja19kcV91bmluaXQoJnJpX2doKTsKKworb3V0OgorCWtmcmVlKGdoYSk7CisJcmV0dXJuIGVycm9yOworfQorCisvKioKKyAqIGdmczJfc3RhdGZzX2kgLSBEbyBhIHN0YXRmcworICogQHNkcDogdGhlIGZpbGVzeXN0ZW0KKyAqIEBzZzogdGhlIHNnIHN0cnVjdHVyZQorICoKKyAqIFJldHVybnM6IGVycm5vCisgKi8KKworc3RhdGljIGludCBnZnMyX3N0YXRmc19pKHN0cnVjdCBnZnMyX3NiZCAqc2RwLCBzdHJ1Y3QgZ2ZzMl9zdGF0ZnNfY2hhbmdlX2hvc3QgKnNjKQoreworCXN0cnVjdCBnZnMyX3N0YXRmc19jaGFuZ2VfaG9zdCAqbV9zYyA9ICZzZHAtPnNkX3N0YXRmc19tYXN0ZXI7CisJc3RydWN0IGdmczJfc3RhdGZzX2NoYW5nZV9ob3N0ICpsX3NjID0gJnNkcC0+c2Rfc3RhdGZzX2xvY2FsOworCisJc3Bpbl9sb2NrKCZzZHAtPnNkX3N0YXRmc19zcGluKTsKKworCSpzYyA9ICptX3NjOworCXNjLT5zY190b3RhbCArPSBsX3NjLT5zY190b3RhbDsKKwlzYy0+c2NfZnJlZSArPSBsX3NjLT5zY19mcmVlOworCXNjLT5zY19kaW5vZGVzICs9IGxfc2MtPnNjX2Rpbm9kZXM7CisKKwlzcGluX3VubG9jaygmc2RwLT5zZF9zdGF0ZnNfc3Bpbik7CisKKwlpZiAoc2MtPnNjX2ZyZWUgPCAwKQorCQlzYy0+c2NfZnJlZSA9IDA7CisJaWYgKHNjLT5zY19mcmVlID4gc2MtPnNjX3RvdGFsKQorCQlzYy0+c2NfZnJlZSA9IHNjLT5zY190b3RhbDsKKwlpZiAoc2MtPnNjX2Rpbm9kZXMgPCAwKQorCQlzYy0+c2NfZGlub2RlcyA9IDA7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCiAgKiBnZnMyX3N0YXRmcyAtIEdhdGhlciBhbmQgcmV0dXJuIHN0YXRzIGFib3V0IHRoZSBmaWxlc3lzdGVtCiAgKiBAc2I6IFRoZSBzdXBlcmJsb2NrCiAgKiBAc3RhdGZzYnVmOiBUaGUgYnVmZmVyCkBAIC0zNzAsNyArNDk3LDYgQEAKIAkgKi8KIAlpZiAodGVzdF9iaXQoR0lGX1VTRVIsICZpcC0+aV9mbGFncykpIHsKIAkJaXAtPmlfZ2wtPmdsX29iamVjdCA9IE5VTEw7Ci0JCWdmczJfZ2xvY2tfc2NoZWR1bGVfZm9yX3JlY2xhaW0oaXAtPmlfZ2wpOwogCQlnZnMyX2dsb2NrX3B1dChpcC0+aV9nbCk7CiAJCWlwLT5pX2dsID0gTlVMTDsKIAkJaWYgKGlwLT5pX2lvcGVuX2doLmdoX2dsKSB7CkBAIC00MjMsOCArNTQ5LDYgQEAKIAkJc2VxX3ByaW50ZihzLCAiLGRlYnVnIik7CiAJaWYgKGFyZ3MtPmFyX3VwZ3JhZGUpCiAJCXNlcV9wcmludGYocywgIix1cGdyYWRlIik7Ci0JaWYgKGFyZ3MtPmFyX251bV9nbG9ja2QgIT0gR0ZTMl9HTE9DS0RfREVGQVVMVCkKLQkJc2VxX3ByaW50ZihzLCAiLG51bV9nbG9ja2Q9JXUiLCBhcmdzLT5hcl9udW1fZ2xvY2tkKTsKIAlpZiAoYXJncy0+YXJfcG9zaXhfYWNsKQogCQlzZXFfcHJpbnRmKHMsICIsYWNsIik7CiAJaWYgKGFyZ3MtPmFyX3F1b3RhICE9IEdGUzJfUVVPVEFfREVGQVVMVCkgewpAQCAtNDk0LDE2ICs2MTgsMTYgQEAKIAlnZnMyX2hvbGRlcl9yZWluaXQoTE1fU1RfRVhDTFVTSVZFLCBMTV9GTEFHX1RSWV8xQ0IgfCBHTF9OT0NBQ0hFLCAmaXAtPmlfaW9wZW5fZ2gpOwogCWVycm9yID0gZ2ZzMl9nbG9ja19ucSgmaXAtPmlfaW9wZW5fZ2gpOwogCWlmIChlcnJvcikKLQkJZ290byBvdXRfdW5pbml0OworCQlnb3RvIG91dF90cnVuY2F0ZTsKIAogCWlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpICYmCi0JICAgIChpcC0+aV9kaS5kaV9mbGFncyAmIEdGUzJfRElGX0VYSEFTSCkpIHsKKwkgICAgKGlwLT5pX2Rpc2tmbGFncyAmIEdGUzJfRElGX0VYSEFTSCkpIHsKIAkJZXJyb3IgPSBnZnMyX2Rpcl9leGhhc2hfZGVhbGxvYyhpcCk7CiAJCWlmIChlcnJvcikKIAkJCWdvdG8gb3V0X3VubG9jazsKIAl9CiAKLQlpZiAoaXAtPmlfZGkuZGlfZWF0dHIpIHsKKwlpZiAoaXAtPmlfZWF0dHIpIHsKIAkJZXJyb3IgPSBnZnMyX2VhX2RlYWxsb2MoaXApOwogCQlpZiAoZXJyb3IpCiAJCQlnb3RvIG91dF91bmxvY2s7CkBAIC01MTksNiArNjQzLDcgQEAKIAlpZiAoZXJyb3IpCiAJCWdvdG8gb3V0X3VubG9jazsKIAorb3V0X3RydW5jYXRlOgogCWVycm9yID0gZ2ZzMl90cmFuc19iZWdpbihzZHAsIDAsIHNkcC0+c2RfamRlc2MtPmpkX2Jsb2Nrcyk7CiAJaWYgKGVycm9yKQogCQlnb3RvIG91dF91bmxvY2s7CkBAIC01MjcsOCArNjUyLDggQEAKIAlnZnMyX3RyYW5zX2VuZChzZHApOwogCiBvdXRfdW5sb2NrOgotCWdmczJfZ2xvY2tfZHEoJmlwLT5pX2lvcGVuX2doKTsKLW91dF91bmluaXQ6CisJaWYgKHRlc3RfYml0KEhJRl9IT0xERVIsICZpcC0+aV9pb3Blbl9naC5naF9pZmxhZ3MpKQorCQlnZnMyX2dsb2NrX2RxKCZpcC0+aV9pb3Blbl9naCk7CiAJZ2ZzMl9ob2xkZXJfdW5pbml0KCZpcC0+aV9pb3Blbl9naCk7CiAJZ2ZzMl9nbG9ja19kcV91bmluaXQoJmdoKTsKIAlpZiAoZXJyb3IgJiYgZXJyb3IgIT0gR0xSX1RSWUZBSUxFRCkKZGlmZiAtLWdpdCBhL2ZzL2dmczIvb3BzX3N1cGVyLmggYi9mcy9nZnMyL29wc19zdXBlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDJhMjc0Li4wMDAwMDAwCi0tLSBhL2ZzL2dmczIvb3BzX3N1cGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSBTaXN0aW5hIFNvZnR3YXJlLCBJbmMuICAxOTk3LTIwMDMgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA2IFJlZCBIYXQsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCi0gKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwotICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4KLSAqLwotCi0jaWZuZGVmIF9fT1BTX1NVUEVSX0RPVF9IX18KLSNkZWZpbmUgX19PUFNfU1VQRVJfRE9UX0hfXwotCi0jaW5jbHVkZSA8bGludXgvZnMuaD4KLQotZXh0ZXJuIGNvbnN0IHN0cnVjdCBzdXBlcl9vcGVyYXRpb25zIGdmczJfc3VwZXJfb3BzOwotCi0jZW5kaWYgLyogX19PUFNfU1VQRVJfRE9UX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZnMvZ2ZzMi9xdW90YS5jIGIvZnMvZ2ZzMi9xdW90YS5jCmluZGV4IDNlMDczZjUuLmIwOGQwOTYgMTAwNjQ0Ci0tLSBhL2ZzL2dmczIvcXVvdGEuYworKysgYi9mcy9nZnMyL3F1b3RhLmMKQEAgLTQ2LDYgKzQ2LDggQEAKICNpbmNsdWRlIDxsaW51eC9iaW8uaD4KICNpbmNsdWRlIDxsaW51eC9nZnMyX29uZGlzay5oPgogI2luY2x1ZGUgPGxpbnV4L2xtX2ludGVyZmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9mcmVlemVyLmg+CiAKICNpbmNsdWRlICJnZnMyLmgiCiAjaW5jbHVkZSAiaW5jb3JlLmgiCkBAIC05NCw3ICs5Niw3IEBACiAJc3RydWN0IGdmczJfcXVvdGFfZGF0YSAqcWQ7CiAJaW50IGVycm9yOwogCi0JcWQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZ2ZzMl9xdW90YV9kYXRhKSwgR0ZQX05PRlMpOworCXFkID0ga21lbV9jYWNoZV96YWxsb2MoZ2ZzMl9xdW90YWRfY2FjaGVwLCBHRlBfTk9GUyk7CiAJaWYgKCFxZCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKQEAgLTExOSw3ICsxMjEsNyBAQAogCXJldHVybiAwOwogCiBmYWlsOgotCWtmcmVlKHFkKTsKKwlrbWVtX2NhY2hlX2ZyZWUoZ2ZzMl9xdW90YWRfY2FjaGVwLCBxZCk7CiAJcmV0dXJuIGVycm9yOwogfQogCkBAIC0xNTgsNyArMTYwLDcgQEAKIAkJaWYgKHFkIHx8ICFjcmVhdGUpIHsKIAkJCWlmIChuZXdfcWQpIHsKIAkJCQlnZnMyX2x2Yl91bmhvbGQobmV3X3FkLT5xZF9nbCk7Ci0JCQkJa2ZyZWUobmV3X3FkKTsKKwkJCQlrbWVtX2NhY2hlX2ZyZWUoZ2ZzMl9xdW90YWRfY2FjaGVwLCBuZXdfcWQpOwogCQkJfQogCQkJKnFkcCA9IHFkOwogCQkJcmV0dXJuIDA7CkBAIC0xMDEzLDcgKzEwMTUsNyBAQAogCiAJaWYgKGdmczJfYXNzZXJ0X3dhcm4oR0ZTMl9TQigmaXAtPmlfaW5vZGUpLCBjaGFuZ2UpKQogCQlyZXR1cm47Ci0JaWYgKGlwLT5pX2RpLmRpX2ZsYWdzICYgR0ZTMl9ESUZfU1lTVEVNKQorCWlmIChpcC0+aV9kaXNrZmxhZ3MgJiBHRlMyX0RJRl9TWVNURU0pCiAJCXJldHVybjsKIAogCWZvciAoeCA9IDA7IHggPCBhbC0+YWxfcWRfbnVtOyB4KyspIHsKQEAgLTExMDAsMTUgKzExMDIsMTUgQEAKIGludCBnZnMyX3F1b3RhX2luaXQoc3RydWN0IGdmczJfc2JkICpzZHApCiB7CiAJc3RydWN0IGdmczJfaW5vZGUgKmlwID0gR0ZTMl9JKHNkcC0+c2RfcWNfaW5vZGUpOwotCXVuc2lnbmVkIGludCBibG9ja3MgPSBpcC0+aV9kaS5kaV9zaXplID4+IHNkcC0+c2Rfc2Iuc2JfYnNpemVfc2hpZnQ7CisJdW5zaWduZWQgaW50IGJsb2NrcyA9IGlwLT5pX2Rpc2tzaXplID4+IHNkcC0+c2Rfc2Iuc2JfYnNpemVfc2hpZnQ7CiAJdW5zaWduZWQgaW50IHgsIHNsb3QgPSAwOwogCXVuc2lnbmVkIGludCBmb3VuZCA9IDA7CiAJdTY0IGRibG9jazsKIAl1MzIgZXh0bGVuID0gMDsKIAlpbnQgZXJyb3I7CiAKLQlpZiAoIWlwLT5pX2RpLmRpX3NpemUgfHwgaXAtPmlfZGkuZGlfc2l6ZSA+ICg2NCA8PCAyMCkgfHwKLQkgICAgaXAtPmlfZGkuZGlfc2l6ZSAmIChzZHAtPnNkX3NiLnNiX2JzaXplIC0gMSkpIHsKKwlpZiAoIWlwLT5pX2Rpc2tzaXplIHx8IGlwLT5pX2Rpc2tzaXplID4gKDY0IDw8IDIwKSB8fAorCSAgICBpcC0+aV9kaXNrc2l6ZSAmIChzZHAtPnNkX3NiLnNiX2JzaXplIC0gMSkpIHsKIAkJZ2ZzMl9jb25zaXN0X2lub2RlKGlwKTsKIAkJcmV0dXJuIC1FSU87CiAJfQpAQCAtMTE5NSw3ICsxMTk3LDcgQEAKIAlyZXR1cm4gZXJyb3I7CiB9CiAKLXZvaWQgZ2ZzMl9xdW90YV9zY2FuKHN0cnVjdCBnZnMyX3NiZCAqc2RwKQorc3RhdGljIHZvaWQgZ2ZzMl9xdW90YV9zY2FuKHN0cnVjdCBnZnMyX3NiZCAqc2RwKQogewogCXN0cnVjdCBnZnMyX3F1b3RhX2RhdGEgKnFkLCAqc2FmZTsKIAlMSVNUX0hFQUQoZGVhZCk7CkBAIC0xMjIyLDcgKzEyMjQsNyBAQAogCQlnZnMyX2Fzc2VydF93YXJuKHNkcCwgIXFkLT5xZF9iaF9jb3VudCk7CiAKIAkJZ2ZzMl9sdmJfdW5ob2xkKHFkLT5xZF9nbCk7Ci0JCWtmcmVlKHFkKTsKKwkJa21lbV9jYWNoZV9mcmVlKGdmczJfcXVvdGFkX2NhY2hlcCwgcWQpOwogCX0KIH0KIApAQCAtMTI1Nyw3ICsxMjU5LDcgQEAKIAkJZ2ZzMl9hc3NlcnRfd2FybihzZHAsICFxZC0+cWRfYmhfY291bnQpOwogCiAJCWdmczJfbHZiX3VuaG9sZChxZC0+cWRfZ2wpOwotCQlrZnJlZShxZCk7CisJCWttZW1fY2FjaGVfZnJlZShnZnMyX3F1b3RhZF9jYWNoZXAsIHFkKTsKIAogCQlzcGluX2xvY2soJnNkcC0+c2RfcXVvdGFfc3Bpbik7CiAJfQpAQCAtMTI3MiwzICsxMjc0LDk0IEBACiAJfQogfQogCitzdGF0aWMgdm9pZCBxdW90YWRfZXJyb3Ioc3RydWN0IGdmczJfc2JkICpzZHAsIGNvbnN0IGNoYXIgKm1zZywgaW50IGVycm9yKQoreworCWlmIChlcnJvciA9PSAwIHx8IGVycm9yID09IC1FUk9GUykKKwkJcmV0dXJuOworCWlmICghdGVzdF9iaXQoU0RGX1NIVVRET1dOLCAmc2RwLT5zZF9mbGFncykpCisJCWZzX2VycihzZHAsICJnZnMyX3F1b3RhZDogJXMgZXJyb3IgJWRcbiIsIG1zZywgZXJyb3IpOworfQorCitzdGF0aWMgdm9pZCBxdW90YWRfY2hlY2tfdGltZW8oc3RydWN0IGdmczJfc2JkICpzZHAsIGNvbnN0IGNoYXIgKm1zZywKKwkJCSAgICAgICBpbnQgKCpmeG4pKHN0cnVjdCBnZnMyX3NiZCAqc2RwKSwKKwkJCSAgICAgICB1bnNpZ25lZCBsb25nIHQsIHVuc2lnbmVkIGxvbmcgKnRpbWVvLAorCQkJICAgICAgIHVuc2lnbmVkIGludCAqbmV3X3RpbWVvKQoreworCWlmICh0ID49ICp0aW1lbykgeworCQlpbnQgZXJyb3IgPSBmeG4oc2RwKTsKKwkJcXVvdGFkX2Vycm9yKHNkcCwgbXNnLCBlcnJvcik7CisJCSp0aW1lbyA9IGdmczJfdHVuZV9nZXRfaSgmc2RwLT5zZF90dW5lLCBuZXdfdGltZW8pICogSFo7CisJfSBlbHNlIHsKKwkJKnRpbWVvIC09IHQ7CisJfQorfQorCitzdGF0aWMgdm9pZCBxdW90YWRfY2hlY2tfdHJ1bmNfbGlzdChzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCkKK3sKKwlzdHJ1Y3QgZ2ZzMl9pbm9kZSAqaXA7CisKKwl3aGlsZSgxKSB7CisJCWlwID0gTlVMTDsKKwkJc3Bpbl9sb2NrKCZzZHAtPnNkX3RydW5jX2xvY2spOworCQlpZiAoIWxpc3RfZW1wdHkoJnNkcC0+c2RfdHJ1bmNfbGlzdCkpIHsKKwkJCWlwID0gbGlzdF9lbnRyeShzZHAtPnNkX3RydW5jX2xpc3QubmV4dCwKKwkJCQkJc3RydWN0IGdmczJfaW5vZGUsIGlfdHJ1bmNfbGlzdCk7CisJCQlsaXN0X2RlbF9pbml0KCZpcC0+aV90cnVuY19saXN0KTsKKwkJfQorCQlzcGluX3VubG9jaygmc2RwLT5zZF90cnVuY19sb2NrKTsKKwkJaWYgKGlwID09IE5VTEwpCisJCQlyZXR1cm47CisJCWdmczJfZ2xvY2tfZmluaXNoX3RydW5jYXRlKGlwKTsKKwl9Cit9CisKKy8qKgorICogZ2ZzMl9xdW90YWQgLSBXcml0ZSBjYWNoZWQgcXVvdGEgY2hhbmdlcyBpbnRvIHRoZSBxdW90YSBmaWxlCisgKiBAc2RwOiBQb2ludGVyIHRvIEdGUzIgc3VwZXJibG9jaworICoKKyAqLworCitpbnQgZ2ZzMl9xdW90YWQodm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCA9IGRhdGE7CisJc3RydWN0IGdmczJfdHVuZSAqdHVuZSA9ICZzZHAtPnNkX3R1bmU7CisJdW5zaWduZWQgbG9uZyBzdGF0ZnNfdGltZW8gPSAwOworCXVuc2lnbmVkIGxvbmcgcXVvdGFkX3RpbWVvID0gMDsKKwl1bnNpZ25lZCBsb25nIHQgPSAwOworCURFRklORV9XQUlUKHdhaXQpOworCWludCBlbXB0eTsKKworCXdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpKSB7CisKKwkJLyogVXBkYXRlIHRoZSBtYXN0ZXIgc3RhdGZzIGZpbGUgKi8KKwkJcXVvdGFkX2NoZWNrX3RpbWVvKHNkcCwgInN0YXRmcyIsIGdmczJfc3RhdGZzX3N5bmMsIHQsCisJCQkJICAgJnN0YXRmc190aW1lbywgJnR1bmUtPmd0X3N0YXRmc19xdWFudHVtKTsKKworCQkvKiBVcGRhdGUgcXVvdGEgZmlsZSAqLworCQlxdW90YWRfY2hlY2tfdGltZW8oc2RwLCAic3luYyIsIGdmczJfcXVvdGFfc3luYywgdCwKKwkJCQkgICAmcXVvdGFkX3RpbWVvLCAmdHVuZS0+Z3RfcXVvdGFfcXVhbnR1bSk7CisKKwkJLyogRklYTUU6IFRoaXMgc2hvdWxkIGJlIHR1cm5lZCBpbnRvIGEgc2hyaW5rZXIgKi8KKwkJZ2ZzMl9xdW90YV9zY2FuKHNkcCk7CisKKwkJLyogQ2hlY2sgZm9yICYgcmVjb3ZlciBwYXJ0aWFsbHkgdHJ1bmNhdGVkIGlub2RlcyAqLworCQlxdW90YWRfY2hlY2tfdHJ1bmNfbGlzdChzZHApOworCisJCWlmIChmcmVlemluZyhjdXJyZW50KSkKKwkJCXJlZnJpZ2VyYXRvcigpOworCQl0ID0gbWluKHF1b3RhZF90aW1lbywgc3RhdGZzX3RpbWVvKTsKKworCQlwcmVwYXJlX3RvX3dhaXQoJnNkcC0+c2RfcXVvdGFfd2FpdCwgJndhaXQsIFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJc3Bpbl9sb2NrKCZzZHAtPnNkX3RydW5jX2xvY2spOworCQllbXB0eSA9IGxpc3RfZW1wdHkoJnNkcC0+c2RfdHJ1bmNfbGlzdCk7CisJCXNwaW5fdW5sb2NrKCZzZHAtPnNkX3RydW5jX2xvY2spOworCQlpZiAoZW1wdHkpCisJCQl0IC09IHNjaGVkdWxlX3RpbWVvdXQodCk7CisJCWVsc2UKKwkJCXQgPSAwOworCQlmaW5pc2hfd2FpdCgmc2RwLT5zZF9xdW90YV93YWl0LCAmd2FpdCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL2ZzL2dmczIvcXVvdGEuaCBiL2ZzL2dmczIvcXVvdGEuaAppbmRleCAzYjdmNGIwLi5jZWM5MDMyIDEwMDY0NAotLS0gYS9mcy9nZnMyL3F1b3RhLmgKKysrIGIvZnMvZ2ZzMi9xdW90YS5oCkBAIC0xNSwyMiArMTUsMjIgQEAKIAogI2RlZmluZSBOT19RVU9UQV9DSEFOR0UgKCh1MzIpLTEpCiAKLWludCBnZnMyX3F1b3RhX2hvbGQoc3RydWN0IGdmczJfaW5vZGUgKmlwLCB1MzIgdWlkLCB1MzIgZ2lkKTsKLXZvaWQgZ2ZzMl9xdW90YV91bmhvbGQoc3RydWN0IGdmczJfaW5vZGUgKmlwKTsKK2V4dGVybiBpbnQgZ2ZzMl9xdW90YV9ob2xkKHN0cnVjdCBnZnMyX2lub2RlICppcCwgdTMyIHVpZCwgdTMyIGdpZCk7CitleHRlcm4gdm9pZCBnZnMyX3F1b3RhX3VuaG9sZChzdHJ1Y3QgZ2ZzMl9pbm9kZSAqaXApOwogCi1pbnQgZ2ZzMl9xdW90YV9sb2NrKHN0cnVjdCBnZnMyX2lub2RlICppcCwgdTMyIHVpZCwgdTMyIGdpZCk7Ci12b2lkIGdmczJfcXVvdGFfdW5sb2NrKHN0cnVjdCBnZnMyX2lub2RlICppcCk7CitleHRlcm4gaW50IGdmczJfcXVvdGFfbG9jayhzdHJ1Y3QgZ2ZzMl9pbm9kZSAqaXAsIHUzMiB1aWQsIHUzMiBnaWQpOworZXh0ZXJuIHZvaWQgZ2ZzMl9xdW90YV91bmxvY2soc3RydWN0IGdmczJfaW5vZGUgKmlwKTsKIAotaW50IGdmczJfcXVvdGFfY2hlY2soc3RydWN0IGdmczJfaW5vZGUgKmlwLCB1MzIgdWlkLCB1MzIgZ2lkKTsKLXZvaWQgZ2ZzMl9xdW90YV9jaGFuZ2Uoc3RydWN0IGdmczJfaW5vZGUgKmlwLCBzNjQgY2hhbmdlLAotCQkgICAgICAgdTMyIHVpZCwgdTMyIGdpZCk7CitleHRlcm4gaW50IGdmczJfcXVvdGFfY2hlY2soc3RydWN0IGdmczJfaW5vZGUgKmlwLCB1MzIgdWlkLCB1MzIgZ2lkKTsKK2V4dGVybiB2b2lkIGdmczJfcXVvdGFfY2hhbmdlKHN0cnVjdCBnZnMyX2lub2RlICppcCwgczY0IGNoYW5nZSwKKwkJCSAgICAgIHUzMiB1aWQsIHUzMiBnaWQpOwogCi1pbnQgZ2ZzMl9xdW90YV9zeW5jKHN0cnVjdCBnZnMyX3NiZCAqc2RwKTsKLWludCBnZnMyX3F1b3RhX3JlZnJlc2goc3RydWN0IGdmczJfc2JkICpzZHAsIGludCB1c2VyLCB1MzIgaWQpOworZXh0ZXJuIGludCBnZnMyX3F1b3RhX3N5bmMoc3RydWN0IGdmczJfc2JkICpzZHApOworZXh0ZXJuIGludCBnZnMyX3F1b3RhX3JlZnJlc2goc3RydWN0IGdmczJfc2JkICpzZHAsIGludCB1c2VyLCB1MzIgaWQpOwogCi1pbnQgZ2ZzMl9xdW90YV9pbml0KHN0cnVjdCBnZnMyX3NiZCAqc2RwKTsKLXZvaWQgZ2ZzMl9xdW90YV9zY2FuKHN0cnVjdCBnZnMyX3NiZCAqc2RwKTsKLXZvaWQgZ2ZzMl9xdW90YV9jbGVhbnVwKHN0cnVjdCBnZnMyX3NiZCAqc2RwKTsKK2V4dGVybiBpbnQgZ2ZzMl9xdW90YV9pbml0KHN0cnVjdCBnZnMyX3NiZCAqc2RwKTsKK2V4dGVybiB2b2lkIGdmczJfcXVvdGFfY2xlYW51cChzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCk7CitleHRlcm4gaW50IGdmczJfcXVvdGFkKHZvaWQgKmRhdGEpOwogCiBzdGF0aWMgaW5saW5lIGludCBnZnMyX3F1b3RhX2xvY2tfY2hlY2soc3RydWN0IGdmczJfaW5vZGUgKmlwKQogewpkaWZmIC0tZ2l0IGEvZnMvZ2ZzMi9yZWNvdmVyeS5jIGIvZnMvZ2ZzMi9yZWNvdmVyeS5jCmluZGV4IGQ1ZTkxZjQuLmVmZDA5YzMgMTAwNjQ0Ci0tLSBhL2ZzL2dmczIvcmVjb3ZlcnkuYworKysgYi9mcy9nZnMyL3JlY292ZXJ5LmMKQEAgLTE0LDYgKzE0LDggQEAKICNpbmNsdWRlIDxsaW51eC9nZnMyX29uZGlzay5oPgogI2luY2x1ZGUgPGxpbnV4L2NyYzMyLmg+CiAjaW5jbHVkZSA8bGludXgvbG1faW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZyZWV6ZXIuaD4KIAogI2luY2x1ZGUgImdmczIuaCIKICNpbmNsdWRlICJpbmNvcmUuaCIKQEAgLTU4MywxMyArNTg1LDM1IEBACiAJcmV0dXJuIGVycm9yOwogfQogCitzdGF0aWMgc3RydWN0IGdmczJfamRlc2MgKmdmczJfamRlc2NfZmluZF9kaXJ0eShzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCkKK3sKKwlzdHJ1Y3QgZ2ZzMl9qZGVzYyAqamQ7CisJaW50IGZvdW5kID0gMDsKKworCXNwaW5fbG9jaygmc2RwLT5zZF9qaW5kZXhfc3Bpbik7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGpkLCAmc2RwLT5zZF9qaW5kZXhfbGlzdCwgamRfbGlzdCkgeworCQlpZiAoamQtPmpkX2RpcnR5KSB7CisJCQlqZC0+amRfZGlydHkgPSAwOworCQkJZm91bmQgPSAxOworCQkJYnJlYWs7CisJCX0KKwl9CisJc3Bpbl91bmxvY2soJnNkcC0+c2RfamluZGV4X3NwaW4pOworCisJaWYgKCFmb3VuZCkKKwkJamQgPSBOVUxMOworCisJcmV0dXJuIGpkOworfQorCiAvKioKICAqIGdmczJfY2hlY2tfam91cm5hbHMgLSBSZWNvdmVyIGFueSBkaXJ0eSBqb3VybmFscwogICogQHNkcDogdGhlIGZpbGVzeXN0ZW0KICAqCiAgKi8KIAotdm9pZCBnZnMyX2NoZWNrX2pvdXJuYWxzKHN0cnVjdCBnZnMyX3NiZCAqc2RwKQorc3RhdGljIHZvaWQgZ2ZzMl9jaGVja19qb3VybmFscyhzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCkKIHsKIAlzdHJ1Y3QgZ2ZzMl9qZGVzYyAqamQ7CiAKQEAgLTYwMywzICs2MjcsMjUgQEAKIAl9CiB9CiAKKy8qKgorICogZ2ZzMl9yZWNvdmVyZCAtIFJlY292ZXIgZGVhZCBtYWNoaW5lJ3Mgam91cm5hbHMKKyAqIEBzZHA6IFBvaW50ZXIgdG8gR0ZTMiBzdXBlcmJsb2NrCisgKgorICovCisKK2ludCBnZnMyX3JlY292ZXJkKHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGdmczJfc2JkICpzZHAgPSBkYXRhOworCXVuc2lnbmVkIGxvbmcgdDsKKworCXdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpKSB7CisJCWdmczJfY2hlY2tfam91cm5hbHMoc2RwKTsKKwkJdCA9IGdmczJfdHVuZV9nZXQoc2RwLCAgZ3RfcmVjb3ZlcmRfc2VjcykgKiBIWjsKKwkJaWYgKGZyZWV6aW5nKGN1cnJlbnQpKQorCQkJcmVmcmlnZXJhdG9yKCk7CisJCXNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZSh0KTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvZnMvZ2ZzMi9yZWNvdmVyeS5oIGIvZnMvZ2ZzMi9yZWNvdmVyeS5oCmluZGV4IGY3MjM1ZTYuLmE4MjE4ZWEgMTAwNjQ0Ci0tLSBhL2ZzL2dmczIvcmVjb3ZlcnkuaAorKysgYi9mcy9nZnMyL3JlY292ZXJ5LmgKQEAgLTE4LDE3ICsxOCwxNyBAQAogCSAgICAgICAgKmJsayA9IDA7CiB9CiAKLWludCBnZnMyX3JlcGxheV9yZWFkX2Jsb2NrKHN0cnVjdCBnZnMyX2pkZXNjICpqZCwgdW5zaWduZWQgaW50IGJsaywKK2V4dGVybiBpbnQgZ2ZzMl9yZXBsYXlfcmVhZF9ibG9jayhzdHJ1Y3QgZ2ZzMl9qZGVzYyAqamQsIHVuc2lnbmVkIGludCBibGssCiAJCQkgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKipiaCk7CiAKLWludCBnZnMyX3Jldm9rZV9hZGQoc3RydWN0IGdmczJfc2JkICpzZHAsIHU2NCBibGtubywgdW5zaWduZWQgaW50IHdoZXJlKTsKLWludCBnZnMyX3Jldm9rZV9jaGVjayhzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCwgdTY0IGJsa25vLCB1bnNpZ25lZCBpbnQgd2hlcmUpOwotdm9pZCBnZnMyX3Jldm9rZV9jbGVhbihzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCk7CitleHRlcm4gaW50IGdmczJfcmV2b2tlX2FkZChzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCwgdTY0IGJsa25vLCB1bnNpZ25lZCBpbnQgd2hlcmUpOworZXh0ZXJuIGludCBnZnMyX3Jldm9rZV9jaGVjayhzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCwgdTY0IGJsa25vLCB1bnNpZ25lZCBpbnQgd2hlcmUpOworZXh0ZXJuIHZvaWQgZ2ZzMl9yZXZva2VfY2xlYW4oc3RydWN0IGdmczJfc2JkICpzZHApOwogCi1pbnQgZ2ZzMl9maW5kX2poZWFkKHN0cnVjdCBnZnMyX2pkZXNjICpqZCwKK2V4dGVybiBpbnQgZ2ZzMl9maW5kX2poZWFkKHN0cnVjdCBnZnMyX2pkZXNjICpqZCwKIAkJICAgIHN0cnVjdCBnZnMyX2xvZ19oZWFkZXJfaG9zdCAqaGVhZCk7Ci1pbnQgZ2ZzMl9yZWNvdmVyX2pvdXJuYWwoc3RydWN0IGdmczJfamRlc2MgKmdmczJfamQpOwotdm9pZCBnZnMyX2NoZWNrX2pvdXJuYWxzKHN0cnVjdCBnZnMyX3NiZCAqc2RwKTsKK2V4dGVybiBpbnQgZ2ZzMl9yZWNvdmVyX2pvdXJuYWwoc3RydWN0IGdmczJfamRlc2MgKmdmczJfamQpOworZXh0ZXJuIGludCBnZnMyX3JlY292ZXJkKHZvaWQgKmRhdGEpOwogCiAjZW5kaWYgLyogX19SRUNPVkVSWV9ET1RfSF9fICovCiAKZGlmZiAtLWdpdCBhL2ZzL2dmczIvcmdycC5jIGIvZnMvZ2ZzMi9yZ3JwLmMKaW5kZXggMmQ5MGZiMi4uOGIwMWM2MyAxMDA2NDQKLS0tIGEvZnMvZ2ZzMi9yZ3JwLmMKKysrIGIvZnMvZ2ZzMi9yZ3JwLmMKQEAgLTI2OSwxNiArMjY5LDE0IEBACiAJCQkJCQkgIGJpLT5iaV9sZW4sIHgpOwogCX0KIAotCWlmIChjb3VudFswXSAhPSByZ2QtPnJkX3JnLnJnX2ZyZWUpIHsKKwlpZiAoY291bnRbMF0gIT0gcmdkLT5yZF9mcmVlKSB7CiAJCWlmIChnZnMyX2NvbnNpc3RfcmdycGQocmdkKSkKIAkJCWZzX2VycihzZHAsICJmcmVlIGRhdGEgbWlzbWF0Y2g6ICAldSAhPSAldVxuIiwKLQkJCSAgICAgICBjb3VudFswXSwgcmdkLT5yZF9yZy5yZ19mcmVlKTsKKwkJCSAgICAgICBjb3VudFswXSwgcmdkLT5yZF9mcmVlKTsKIAkJcmV0dXJuOwogCX0KIAotCXRtcCA9IHJnZC0+cmRfZGF0YSAtCi0JCXJnZC0+cmRfcmcucmdfZnJlZSAtCi0JCXJnZC0+cmRfcmcucmdfZGlub2RlczsKKwl0bXAgPSByZ2QtPnJkX2RhdGEgLSByZ2QtPnJkX2ZyZWUgLSByZ2QtPnJkX2Rpbm9kZXM7CiAJaWYgKGNvdW50WzFdICsgY291bnRbMl0gIT0gdG1wKSB7CiAJCWlmIChnZnMyX2NvbnNpc3RfcmdycGQocmdkKSkKIAkJCWZzX2VycihzZHAsICJ1c2VkIGRhdGEgbWlzbWF0Y2g6ICAldSAhPSAldVxuIiwKQEAgLTI4NiwxMCArMjg0LDEwIEBACiAJCXJldHVybjsKIAl9CiAKLQlpZiAoY291bnRbM10gIT0gcmdkLT5yZF9yZy5yZ19kaW5vZGVzKSB7CisJaWYgKGNvdW50WzNdICE9IHJnZC0+cmRfZGlub2RlcykgewogCQlpZiAoZ2ZzMl9jb25zaXN0X3JncnBkKHJnZCkpCiAJCQlmc19lcnIoc2RwLCAidXNlZCBtZXRhZGF0YSBtaXNtYXRjaDogICV1ICE9ICV1XG4iLAotCQkJICAgICAgIGNvdW50WzNdLCByZ2QtPnJkX3JnLnJnX2Rpbm9kZXMpOworCQkJICAgICAgIGNvdW50WzNdLCByZ2QtPnJkX2Rpbm9kZXMpOwogCQlyZXR1cm47CiAJfQogCkBAIC01MDEsNyArNDk5LDcgQEAKIAlmb3IgKHJncnBzID0gMDs7IHJncnBzKyspIHsKIAkJbG9mZl90IHBvcyA9IHJncnBzICogc2l6ZW9mKHN0cnVjdCBnZnMyX3JpbmRleCk7CiAKLQkJaWYgKHBvcyArIHNpemVvZihzdHJ1Y3QgZ2ZzMl9yaW5kZXgpID49IGlwLT5pX2RpLmRpX3NpemUpCisJCWlmIChwb3MgKyBzaXplb2Yoc3RydWN0IGdmczJfcmluZGV4KSA+PSBpcC0+aV9kaXNrc2l6ZSkKIAkJCWJyZWFrOwogCQllcnJvciA9IGdmczJfaW50ZXJuYWxfcmVhZChpcCwgJnJhX3N0YXRlLCBidWYsICZwb3MsCiAJCQkJCSAgIHNpemVvZihzdHJ1Y3QgZ2ZzMl9yaW5kZXgpKTsKQEAgLTU5MCw3ICs1ODgsNyBAQAogCXN0cnVjdCBnZnMyX3NiZCAqc2RwID0gR0ZTMl9TQigmaXAtPmlfaW5vZGUpOwogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSAmaXAtPmlfaW5vZGU7CiAJc3RydWN0IGZpbGVfcmFfc3RhdGUgcmFfc3RhdGU7Ci0JdTY0IHJncnBfY291bnQgPSBpcC0+aV9kaS5kaV9zaXplOworCXU2NCByZ3JwX2NvdW50ID0gaXAtPmlfZGlza3NpemU7CiAJaW50IGVycm9yOwogCiAJaWYgKGRvX2RpdihyZ3JwX2NvdW50LCBzaXplb2Yoc3RydWN0IGdmczJfcmluZGV4KSkpIHsKQEAgLTYzNCw3ICs2MzIsNyBAQAogCWZvciAoc2RwLT5zZF9yZ3JwcyA9IDA7OyBzZHAtPnNkX3JncnBzKyspIHsKIAkJLyogSWdub3JlIHBhcnRpYWxzICovCiAJCWlmICgoc2RwLT5zZF9yZ3JwcyArIDEpICogc2l6ZW9mKHN0cnVjdCBnZnMyX3JpbmRleCkgPgotCQkgICAgaXAtPmlfZGkuZGlfc2l6ZSkKKwkJICAgIGlwLT5pX2Rpc2tzaXplKQogCQkJYnJlYWs7CiAJCWVycm9yID0gcmVhZF9yaW5kZXhfZW50cnkoaXAsICZyYV9zdGF0ZSk7CiAJCWlmIChlcnJvcikgewpAQCAtNjkyLDcgKzY5MCw2IEBACiBzdGF0aWMgdm9pZCBnZnMyX3JncnBfaW4oc3RydWN0IGdmczJfcmdycGQgKnJnZCwgY29uc3Qgdm9pZCAqYnVmKQogewogCWNvbnN0IHN0cnVjdCBnZnMyX3JncnAgKnN0ciA9IGJ1ZjsKLQlzdHJ1Y3QgZ2ZzMl9yZ3JwX2hvc3QgKnJnID0gJnJnZC0+cmRfcmc7CiAJdTMyIHJnX2ZsYWdzOwogCiAJcmdfZmxhZ3MgPSBiZTMyX3RvX2NwdShzdHItPnJnX2ZsYWdzKTsKQEAgLTcwMCwyNCArNjk3LDIzIEBACiAJCXJnZC0+cmRfZmxhZ3MgfD0gR0ZTMl9SREZfTk9BTExPQzsKIAllbHNlCiAJCXJnZC0+cmRfZmxhZ3MgJj0gfkdGUzJfUkRGX05PQUxMT0M7Ci0JcmctPnJnX2ZyZWUgPSBiZTMyX3RvX2NwdShzdHItPnJnX2ZyZWUpOwotCXJnLT5yZ19kaW5vZGVzID0gYmUzMl90b19jcHUoc3RyLT5yZ19kaW5vZGVzKTsKLQlyZy0+cmdfaWdlbmVyYXRpb24gPSBiZTY0X3RvX2NwdShzdHItPnJnX2lnZW5lcmF0aW9uKTsKKwlyZ2QtPnJkX2ZyZWUgPSBiZTMyX3RvX2NwdShzdHItPnJnX2ZyZWUpOworCXJnZC0+cmRfZGlub2RlcyA9IGJlMzJfdG9fY3B1KHN0ci0+cmdfZGlub2Rlcyk7CisJcmdkLT5yZF9pZ2VuZXJhdGlvbiA9IGJlNjRfdG9fY3B1KHN0ci0+cmdfaWdlbmVyYXRpb24pOwogfQogCiBzdGF0aWMgdm9pZCBnZnMyX3JncnBfb3V0KHN0cnVjdCBnZnMyX3JncnBkICpyZ2QsIHZvaWQgKmJ1ZikKIHsKIAlzdHJ1Y3QgZ2ZzMl9yZ3JwICpzdHIgPSBidWY7Ci0Jc3RydWN0IGdmczJfcmdycF9ob3N0ICpyZyA9ICZyZ2QtPnJkX3JnOwogCXUzMiByZ19mbGFncyA9IDA7CiAKIAlpZiAocmdkLT5yZF9mbGFncyAmIEdGUzJfUkRGX05PQUxMT0MpCiAJCXJnX2ZsYWdzIHw9IEdGUzJfUkdGX05PQUxMT0M7CiAJc3RyLT5yZ19mbGFncyA9IGNwdV90b19iZTMyKHJnX2ZsYWdzKTsKLQlzdHItPnJnX2ZyZWUgPSBjcHVfdG9fYmUzMihyZy0+cmdfZnJlZSk7Ci0Jc3RyLT5yZ19kaW5vZGVzID0gY3B1X3RvX2JlMzIocmctPnJnX2Rpbm9kZXMpOworCXN0ci0+cmdfZnJlZSA9IGNwdV90b19iZTMyKHJnZC0+cmRfZnJlZSk7CisJc3RyLT5yZ19kaW5vZGVzID0gY3B1X3RvX2JlMzIocmdkLT5yZF9kaW5vZGVzKTsKIAlzdHItPl9fcGFkID0gY3B1X3RvX2JlMzIoMCk7Ci0Jc3RyLT5yZ19pZ2VuZXJhdGlvbiA9IGNwdV90b19iZTY0KHJnLT5yZ19pZ2VuZXJhdGlvbik7CisJc3RyLT5yZ19pZ2VuZXJhdGlvbiA9IGNwdV90b19iZTY0KHJnZC0+cmRfaWdlbmVyYXRpb24pOwogCW1lbXNldCgmc3RyLT5yZ19yZXNlcnZlZCwgMCwgc2l6ZW9mKHN0ci0+cmdfcmVzZXJ2ZWQpKTsKIH0KIApAQCAtNzc2LDcgKzc3Miw3IEBACiAJfQogCiAJc3Bpbl9sb2NrKCZzZHAtPnNkX3JpbmRleF9zcGluKTsKLQlyZ2QtPnJkX2ZyZWVfY2xvbmUgPSByZ2QtPnJkX3JnLnJnX2ZyZWU7CisJcmdkLT5yZF9mcmVlX2Nsb25lID0gcmdkLT5yZF9mcmVlOwogCXJnZC0+cmRfYmhfY291bnQrKzsKIAlzcGluX3VubG9jaygmc2RwLT5zZF9yaW5kZXhfc3Bpbik7CiAKQEAgLTg1MCw3ICs4NDYsNyBAQAogCX0KIAogCXNwaW5fbG9jaygmc2RwLT5zZF9yaW5kZXhfc3Bpbik7Ci0JcmdkLT5yZF9mcmVlX2Nsb25lID0gcmdkLT5yZF9yZy5yZ19mcmVlOworCXJnZC0+cmRfZnJlZV9jbG9uZSA9IHJnZC0+cmRfZnJlZTsKIAlzcGluX3VubG9jaygmc2RwLT5zZF9yaW5kZXhfc3Bpbik7CiB9CiAKQEAgLTE0MDMsOCArMTM5OSw4IEBACiAJYmxvY2sgPSByZ2QtPnJkX2RhdGEwICsgYmxrOwogCWlwLT5pX2dvYWwgPSBibG9jazsKIAotCWdmczJfYXNzZXJ0X3dpdGhkcmF3KHNkcCwgcmdkLT5yZF9yZy5yZ19mcmVlID49ICpuKTsKLQlyZ2QtPnJkX3JnLnJnX2ZyZWUgLT0gKm47CisJZ2ZzMl9hc3NlcnRfd2l0aGRyYXcoc2RwLCByZ2QtPnJkX2ZyZWUgPj0gKm4pOworCXJnZC0+cmRfZnJlZSAtPSAqbjsKIAogCWdmczJfdHJhbnNfYWRkX2JoKHJnZC0+cmRfZ2wsIHJnZC0+cmRfYml0c1swXS5iaV9iaCwgMSk7CiAJZ2ZzMl9yZ3JwX291dChyZ2QsIHJnZC0+cmRfYml0c1swXS5iaV9iaC0+Yl9kYXRhKTsKQEAgLTE0NDUsMTAgKzE0NDEsMTAgQEAKIAogCWJsb2NrID0gcmdkLT5yZF9kYXRhMCArIGJsazsKIAotCWdmczJfYXNzZXJ0X3dpdGhkcmF3KHNkcCwgcmdkLT5yZF9yZy5yZ19mcmVlKTsKLQlyZ2QtPnJkX3JnLnJnX2ZyZWUtLTsKLQlyZ2QtPnJkX3JnLnJnX2Rpbm9kZXMrKzsKLQkqZ2VuZXJhdGlvbiA9IHJnZC0+cmRfcmcucmdfaWdlbmVyYXRpb24rKzsKKwlnZnMyX2Fzc2VydF93aXRoZHJhdyhzZHAsIHJnZC0+cmRfZnJlZSk7CisJcmdkLT5yZF9mcmVlLS07CisJcmdkLT5yZF9kaW5vZGVzKys7CisJKmdlbmVyYXRpb24gPSByZ2QtPnJkX2lnZW5lcmF0aW9uKys7CiAJZ2ZzMl90cmFuc19hZGRfYmgocmdkLT5yZF9nbCwgcmdkLT5yZF9iaXRzWzBdLmJpX2JoLCAxKTsKIAlnZnMyX3JncnBfb3V0KHJnZCwgcmdkLT5yZF9iaXRzWzBdLmJpX2JoLT5iX2RhdGEpOwogCkBAIC0xNDgxLDcgKzE0NzcsNyBAQAogCWlmICghcmdkKQogCQlyZXR1cm47CiAKLQlyZ2QtPnJkX3JnLnJnX2ZyZWUgKz0gYmxlbjsKKwlyZ2QtPnJkX2ZyZWUgKz0gYmxlbjsKIAogCWdmczJfdHJhbnNfYWRkX2JoKHJnZC0+cmRfZ2wsIHJnZC0+cmRfYml0c1swXS5iaV9iaCwgMSk7CiAJZ2ZzMl9yZ3JwX291dChyZ2QsIHJnZC0+cmRfYml0c1swXS5iaV9iaC0+Yl9kYXRhKTsKQEAgLTE1MDksNyArMTUwNSw3IEBACiAJaWYgKCFyZ2QpCiAJCXJldHVybjsKIAotCXJnZC0+cmRfcmcucmdfZnJlZSArPSBibGVuOworCXJnZC0+cmRfZnJlZSArPSBibGVuOwogCiAJZ2ZzMl90cmFuc19hZGRfYmgocmdkLT5yZF9nbCwgcmdkLT5yZF9iaXRzWzBdLmJpX2JoLCAxKTsKIAlnZnMyX3JncnBfb3V0KHJnZCwgcmdkLT5yZF9iaXRzWzBdLmJpX2JoLT5iX2RhdGEpOwpAQCAtMTU0NiwxMCArMTU0MiwxMCBAQAogCQlyZXR1cm47CiAJZ2ZzMl9hc3NlcnRfd2l0aGRyYXcoc2RwLCByZ2QgPT0gdG1wX3JnZCk7CiAKLQlpZiAoIXJnZC0+cmRfcmcucmdfZGlub2RlcykKKwlpZiAoIXJnZC0+cmRfZGlub2RlcykKIAkJZ2ZzMl9jb25zaXN0X3JncnBkKHJnZCk7Ci0JcmdkLT5yZF9yZy5yZ19kaW5vZGVzLS07Ci0JcmdkLT5yZF9yZy5yZ19mcmVlKys7CisJcmdkLT5yZF9kaW5vZGVzLS07CisJcmdkLT5yZF9mcmVlKys7CiAKIAlnZnMyX3RyYW5zX2FkZF9iaChyZ2QtPnJkX2dsLCByZ2QtPnJkX2JpdHNbMF0uYmlfYmgsIDEpOwogCWdmczJfcmdycF9vdXQocmdkLCByZ2QtPnJkX2JpdHNbMF0uYmlfYmgtPmJfZGF0YSk7CmRpZmYgLS1naXQgYS9mcy9nZnMyL3N1cGVyLmMgYi9mcy9nZnMyL3N1cGVyLmMKaW5kZXggYzNiYTNkOS4uMTQxYjc4MSAxMDA2NDQKLS0tIGEvZnMvZ2ZzMi9zdXBlci5jCisrKyBiL2ZzL2dmczIvc3VwZXIuYwpAQCAtMzQsNzYgKzM0LDYgQEAKICNpbmNsdWRlICJ1dGlsLmgiCiAKIC8qKgotICogZ2ZzMl9qaW5kZXhfaG9sZCAtIEdyYWIgYSBsb2NrIG9uIHRoZSBqaW5kZXgKLSAqIEBzZHA6IFRoZSBHRlMyIHN1cGVyYmxvY2sKLSAqIEBqaV9naDogdGhlIGhvbGRlciBmb3IgdGhlIGppbmRleCBnbG9jawotICoKLSAqIFRoaXMgaXMgdmVyeSBzaW1pbGFyIHRvIHRoZSBnZnMyX3JpbmRleF9ob2xkKCkgZnVuY3Rpb24sIGV4Y2VwdCB0aGF0Ci0gKiBpbiBnZW5lcmFsIHdlIGhvbGQgdGhlIGppbmRleCBsb2NrIGZvciBsb25nZXIgcGVyaW9kcyBvZiB0aW1lIGFuZAotICogd2UgZ3JhYiBpdCBmYXIgbGVzcyBmcmVxdWVudGx5IChpbiBnZW5lcmFsKSB0aGVuIHRoZSByZ3JwIGxvY2suCi0gKgotICogUmV0dXJuczogZXJybm8KLSAqLwotCi1pbnQgZ2ZzMl9qaW5kZXhfaG9sZChzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCwgc3RydWN0IGdmczJfaG9sZGVyICpqaV9naCkKLXsKLQlzdHJ1Y3QgZ2ZzMl9pbm9kZSAqZGlwID0gR0ZTMl9JKHNkcC0+c2RfamluZGV4KTsKLQlzdHJ1Y3QgcXN0ciBuYW1lOwotCWNoYXIgYnVmWzIwXTsKLQlzdHJ1Y3QgZ2ZzMl9qZGVzYyAqamQ7Ci0JaW50IGVycm9yOwotCi0JbmFtZS5uYW1lID0gYnVmOwotCi0JbXV0ZXhfbG9jaygmc2RwLT5zZF9qaW5kZXhfbXV0ZXgpOwotCi0JZm9yICg7OykgewotCQllcnJvciA9IGdmczJfZ2xvY2tfbnFfaW5pdChkaXAtPmlfZ2wsIExNX1NUX1NIQVJFRCwgMCwgamlfZ2gpOwotCQlpZiAoZXJyb3IpCi0JCQlicmVhazsKLQotCQluYW1lLmxlbiA9IHNwcmludGYoYnVmLCAiam91cm5hbCV1Iiwgc2RwLT5zZF9qb3VybmFscyk7Ci0JCW5hbWUuaGFzaCA9IGdmczJfZGlza19oYXNoKG5hbWUubmFtZSwgbmFtZS5sZW4pOwotCi0JCWVycm9yID0gZ2ZzMl9kaXJfY2hlY2soc2RwLT5zZF9qaW5kZXgsICZuYW1lLCBOVUxMKTsKLQkJaWYgKGVycm9yID09IC1FTk9FTlQpIHsKLQkJCWVycm9yID0gMDsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJZ2ZzMl9nbG9ja19kcV91bmluaXQoamlfZ2gpOwotCi0JCWlmIChlcnJvcikKLQkJCWJyZWFrOwotCi0JCWVycm9yID0gLUVOT01FTTsKLQkJamQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZ2ZzMl9qZGVzYyksIEdGUF9LRVJORUwpOwotCQlpZiAoIWpkKQotCQkJYnJlYWs7Ci0KLQkJSU5JVF9MSVNUX0hFQUQoJmpkLT5leHRlbnRfbGlzdCk7Ci0JCWpkLT5qZF9pbm9kZSA9IGdmczJfbG9va3VwaShzZHAtPnNkX2ppbmRleCwgJm5hbWUsIDEpOwotCQlpZiAoIWpkLT5qZF9pbm9kZSB8fCBJU19FUlIoamQtPmpkX2lub2RlKSkgewotCQkJaWYgKCFqZC0+amRfaW5vZGUpCi0JCQkJZXJyb3IgPSAtRU5PRU5UOwotCQkJZWxzZQotCQkJCWVycm9yID0gUFRSX0VSUihqZC0+amRfaW5vZGUpOwotCQkJa2ZyZWUoamQpOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlzcGluX2xvY2soJnNkcC0+c2RfamluZGV4X3NwaW4pOwotCQlqZC0+amRfamlkID0gc2RwLT5zZF9qb3VybmFscysrOwotCQlsaXN0X2FkZF90YWlsKCZqZC0+amRfbGlzdCwgJnNkcC0+c2RfamluZGV4X2xpc3QpOwotCQlzcGluX3VubG9jaygmc2RwLT5zZF9qaW5kZXhfc3Bpbik7Ci0JfQotCi0JbXV0ZXhfdW5sb2NrKCZzZHAtPnNkX2ppbmRleF9tdXRleCk7Ci0KLQlyZXR1cm4gZXJyb3I7Ci19Ci0KLS8qKgogICogZ2ZzMl9qaW5kZXhfZnJlZSAtIENsZWFyIGFsbCB0aGUgam91cm5hbCBpbmRleCBpbmZvcm1hdGlvbgogICogQHNkcDogVGhlIEdGUzIgc3VwZXJibG9jawogICoKQEAgLTE2NiwzOSArOTYsNiBAQAogCXJldHVybiBqZDsKIH0KIAotdm9pZCBnZnMyX2pkZXNjX21ha2VfZGlydHkoc3RydWN0IGdmczJfc2JkICpzZHAsIHVuc2lnbmVkIGludCBqaWQpCi17Ci0Jc3RydWN0IGdmczJfamRlc2MgKmpkOwotCi0Jc3Bpbl9sb2NrKCZzZHAtPnNkX2ppbmRleF9zcGluKTsKLQlqZCA9IGpkZXNjX2ZpbmRfaSgmc2RwLT5zZF9qaW5kZXhfbGlzdCwgamlkKTsKLQlpZiAoamQpCi0JCWpkLT5qZF9kaXJ0eSA9IDE7Ci0Jc3Bpbl91bmxvY2soJnNkcC0+c2RfamluZGV4X3NwaW4pOwotfQotCi1zdHJ1Y3QgZ2ZzMl9qZGVzYyAqZ2ZzMl9qZGVzY19maW5kX2RpcnR5KHN0cnVjdCBnZnMyX3NiZCAqc2RwKQotewotCXN0cnVjdCBnZnMyX2pkZXNjICpqZDsKLQlpbnQgZm91bmQgPSAwOwotCi0Jc3Bpbl9sb2NrKCZzZHAtPnNkX2ppbmRleF9zcGluKTsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnkoamQsICZzZHAtPnNkX2ppbmRleF9saXN0LCBqZF9saXN0KSB7Ci0JCWlmIChqZC0+amRfZGlydHkpIHsKLQkJCWpkLT5qZF9kaXJ0eSA9IDA7Ci0JCQlmb3VuZCA9IDE7Ci0JCQlicmVhazsKLQkJfQotCX0KLQlzcGluX3VubG9jaygmc2RwLT5zZF9qaW5kZXhfc3Bpbik7Ci0KLQlpZiAoIWZvdW5kKQotCQlqZCA9IE5VTEw7Ci0KLQlyZXR1cm4gamQ7Ci19Ci0KIGludCBnZnMyX2pkZXNjX2NoZWNrKHN0cnVjdCBnZnMyX2pkZXNjICpqZCkKIHsKIAlzdHJ1Y3QgZ2ZzMl9pbm9kZSAqaXAgPSBHRlMyX0koamQtPmpkX2lub2RlKTsKQEAgLTIwNiwxNCArMTAzLDE0IEBACiAJaW50IGFyOwogCWludCBlcnJvcjsKIAotCWlmIChpcC0+aV9kaS5kaV9zaXplIDwgKDggPDwgMjApIHx8IGlwLT5pX2RpLmRpX3NpemUgPiAoMSA8PCAzMCkgfHwKLQkgICAgKGlwLT5pX2RpLmRpX3NpemUgJiAoc2RwLT5zZF9zYi5zYl9ic2l6ZSAtIDEpKSkgeworCWlmIChpcC0+aV9kaXNrc2l6ZSA8ICg4IDw8IDIwKSB8fCBpcC0+aV9kaXNrc2l6ZSA+ICgxIDw8IDMwKSB8fAorCSAgICAoaXAtPmlfZGlza3NpemUgJiAoc2RwLT5zZF9zYi5zYl9ic2l6ZSAtIDEpKSkgewogCQlnZnMyX2NvbnNpc3RfaW5vZGUoaXApOwogCQlyZXR1cm4gLUVJTzsKIAl9Ci0JamQtPmpkX2Jsb2NrcyA9IGlwLT5pX2RpLmRpX3NpemUgPj4gc2RwLT5zZF9zYi5zYl9ic2l6ZV9zaGlmdDsKKwlqZC0+amRfYmxvY2tzID0gaXAtPmlfZGlza3NpemUgPj4gc2RwLT5zZF9zYi5zYl9ic2l6ZV9zaGlmdDsKIAotCWVycm9yID0gZ2ZzMl93cml0ZV9hbGxvY19yZXF1aXJlZChpcCwgMCwgaXAtPmlfZGkuZGlfc2l6ZSwgJmFyKTsKKwllcnJvciA9IGdmczJfd3JpdGVfYWxsb2NfcmVxdWlyZWQoaXAsIDAsIGlwLT5pX2Rpc2tzaXplLCAmYXIpOwogCWlmICghZXJyb3IgJiYgYXIpIHsKIAkJZ2ZzMl9jb25zaXN0X2lub2RlKGlwKTsKIAkJZXJyb3IgPSAtRUlPOwpAQCAtNDIzLDEzNyArMzIwLDYgQEAKIAlyZXR1cm4gZXJyb3I7CiB9CiAKLS8qKgotICogZ2ZzMl9zdGF0ZnNfaSAtIERvIGEgc3RhdGZzCi0gKiBAc2RwOiB0aGUgZmlsZXN5c3RlbQotICogQHNnOiB0aGUgc2cgc3RydWN0dXJlCi0gKgotICogUmV0dXJuczogZXJybm8KLSAqLwotCi1pbnQgZ2ZzMl9zdGF0ZnNfaShzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCwgc3RydWN0IGdmczJfc3RhdGZzX2NoYW5nZV9ob3N0ICpzYykKLXsKLQlzdHJ1Y3QgZ2ZzMl9zdGF0ZnNfY2hhbmdlX2hvc3QgKm1fc2MgPSAmc2RwLT5zZF9zdGF0ZnNfbWFzdGVyOwotCXN0cnVjdCBnZnMyX3N0YXRmc19jaGFuZ2VfaG9zdCAqbF9zYyA9ICZzZHAtPnNkX3N0YXRmc19sb2NhbDsKLQotCXNwaW5fbG9jaygmc2RwLT5zZF9zdGF0ZnNfc3Bpbik7Ci0KLQkqc2MgPSAqbV9zYzsKLQlzYy0+c2NfdG90YWwgKz0gbF9zYy0+c2NfdG90YWw7Ci0Jc2MtPnNjX2ZyZWUgKz0gbF9zYy0+c2NfZnJlZTsKLQlzYy0+c2NfZGlub2RlcyArPSBsX3NjLT5zY19kaW5vZGVzOwotCi0Jc3Bpbl91bmxvY2soJnNkcC0+c2Rfc3RhdGZzX3NwaW4pOwotCi0JaWYgKHNjLT5zY19mcmVlIDwgMCkKLQkJc2MtPnNjX2ZyZWUgPSAwOwotCWlmIChzYy0+c2NfZnJlZSA+IHNjLT5zY190b3RhbCkKLQkJc2MtPnNjX2ZyZWUgPSBzYy0+c2NfdG90YWw7Ci0JaWYgKHNjLT5zY19kaW5vZGVzIDwgMCkKLQkJc2MtPnNjX2Rpbm9kZXMgPSAwOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qKgotICogc3RhdGZzX2ZpbGwgLSBmaWxsIGluIHRoZSBzZyBmb3IgYSBnaXZlbiBSRwotICogQHJnZDogdGhlIFJHCi0gKiBAc2M6IHRoZSBzYyBzdHJ1Y3R1cmUKLSAqCi0gKiBSZXR1cm5zOiAwIG9uIHN1Y2Nlc3MsIC1FU1RBTEUgaWYgdGhlIExWQiBpcyBpbnZhbGlkCi0gKi8KLQotc3RhdGljIGludCBzdGF0ZnNfc2xvd19maWxsKHN0cnVjdCBnZnMyX3JncnBkICpyZ2QsCi0JCQkgICAgc3RydWN0IGdmczJfc3RhdGZzX2NoYW5nZV9ob3N0ICpzYykKLXsKLQlnZnMyX3JncnBfdmVyaWZ5KHJnZCk7Ci0Jc2MtPnNjX3RvdGFsICs9IHJnZC0+cmRfZGF0YTsKLQlzYy0+c2NfZnJlZSArPSByZ2QtPnJkX3JnLnJnX2ZyZWU7Ci0Jc2MtPnNjX2Rpbm9kZXMgKz0gcmdkLT5yZF9yZy5yZ19kaW5vZGVzOwotCXJldHVybiAwOwotfQotCi0vKioKLSAqIGdmczJfc3RhdGZzX3Nsb3cgLSBTdGF0IGEgZmlsZXN5c3RlbSB1c2luZyBhc3luY2hyb25vdXMgbG9ja2luZwotICogQHNkcDogdGhlIGZpbGVzeXN0ZW0KLSAqIEBzYzogdGhlIHNjIGluZm8gdGhhdCB3aWxsIGJlIHJldHVybmVkCi0gKgotICogQW55IGVycm9yIChvdGhlciB0aGFuIGEgc2lnbmFsKSB3aWxsIGNhdXNlIHRoaXMgcm91dGluZSB0byBmYWxsIGJhY2sKLSAqIHRvIHRoZSBzeW5jaHJvbm91cyB2ZXJzaW9uLgotICoKLSAqIEZJWE1FOiBUaGlzIHJlYWxseSBzaG91bGRuJ3QgYnVzeSB3YWl0IGxpa2UgdGhpcy4KLSAqCi0gKiBSZXR1cm5zOiBlcnJubwotICovCi0KLWludCBnZnMyX3N0YXRmc19zbG93KHN0cnVjdCBnZnMyX3NiZCAqc2RwLCBzdHJ1Y3QgZ2ZzMl9zdGF0ZnNfY2hhbmdlX2hvc3QgKnNjKQotewotCXN0cnVjdCBnZnMyX2hvbGRlciByaV9naDsKLQlzdHJ1Y3QgZ2ZzMl9yZ3JwZCAqcmdkX25leHQ7Ci0Jc3RydWN0IGdmczJfaG9sZGVyICpnaGEsICpnaDsKLQl1bnNpZ25lZCBpbnQgc2xvdHMgPSA2NDsKLQl1bnNpZ25lZCBpbnQgeDsKLQlpbnQgZG9uZTsKLQlpbnQgZXJyb3IgPSAwLCBlcnI7Ci0KLQltZW1zZXQoc2MsIDAsIHNpemVvZihzdHJ1Y3QgZ2ZzMl9zdGF0ZnNfY2hhbmdlX2hvc3QpKTsKLQlnaGEgPSBrY2FsbG9jKHNsb3RzLCBzaXplb2Yoc3RydWN0IGdmczJfaG9sZGVyKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFnaGEpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JZXJyb3IgPSBnZnMyX3JpbmRleF9ob2xkKHNkcCwgJnJpX2doKTsKLQlpZiAoZXJyb3IpCi0JCWdvdG8gb3V0OwotCi0JcmdkX25leHQgPSBnZnMyX3JncnBkX2dldF9maXJzdChzZHApOwotCi0JZm9yICg7OykgewotCQlkb25lID0gMTsKLQotCQlmb3IgKHggPSAwOyB4IDwgc2xvdHM7IHgrKykgewotCQkJZ2ggPSBnaGEgKyB4OwotCi0JCQlpZiAoZ2gtPmdoX2dsICYmIGdmczJfZ2xvY2tfcG9sbChnaCkpIHsKLQkJCQllcnIgPSBnZnMyX2dsb2NrX3dhaXQoZ2gpOwotCQkJCWlmIChlcnIpIHsKLQkJCQkJZ2ZzMl9ob2xkZXJfdW5pbml0KGdoKTsKLQkJCQkJZXJyb3IgPSBlcnI7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaWYgKCFlcnJvcikKLQkJCQkJCWVycm9yID0gc3RhdGZzX3Nsb3dfZmlsbCgKLQkJCQkJCQlnaC0+Z2hfZ2wtPmdsX29iamVjdCwgc2MpOwotCQkJCQlnZnMyX2dsb2NrX2RxX3VuaW5pdChnaCk7Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAoZ2gtPmdoX2dsKQotCQkJCWRvbmUgPSAwOwotCQkJZWxzZSBpZiAocmdkX25leHQgJiYgIWVycm9yKSB7Ci0JCQkJZXJyb3IgPSBnZnMyX2dsb2NrX25xX2luaXQocmdkX25leHQtPnJkX2dsLAotCQkJCQkJCSAgIExNX1NUX1NIQVJFRCwKLQkJCQkJCQkgICBHTF9BU1lOQywKLQkJCQkJCQkgICBnaCk7Ci0JCQkJcmdkX25leHQgPSBnZnMyX3JncnBkX2dldF9uZXh0KHJnZF9uZXh0KTsKLQkJCQlkb25lID0gMDsKLQkJCX0KLQotCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQotCQkJCWVycm9yID0gLUVSRVNUQVJUU1lTOwotCQl9Ci0KLQkJaWYgKGRvbmUpCi0JCQlicmVhazsKLQotCQl5aWVsZCgpOwotCX0KLQotCWdmczJfZ2xvY2tfZHFfdW5pbml0KCZyaV9naCk7Ci0KLW91dDoKLQlrZnJlZShnaGEpOwotCXJldHVybiBlcnJvcjsKLX0KLQogc3RydWN0IGxmY2MgewogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKIAlzdHJ1Y3QgZ2ZzMl9ob2xkZXIgZ2g7CkBAIC01ODAsMTAgKzM0Niw2IEBACiAJc3RydWN0IGdmczJfbG9nX2hlYWRlcl9ob3N0IGxoOwogCWludCBlcnJvcjsKIAotCWVycm9yID0gZ2ZzMl9qaW5kZXhfaG9sZChzZHAsICZqaV9naCk7Ci0JaWYgKGVycm9yKQotCQlyZXR1cm4gZXJyb3I7Ci0KIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGpkLCAmc2RwLT5zZF9qaW5kZXhfbGlzdCwgamRfbGlzdCkgewogCQlsZmNjID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGxmY2MpLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCFsZmNjKSB7CmRpZmYgLS1naXQgYS9mcy9nZnMyL3N1cGVyLmggYi9mcy9nZnMyL3N1cGVyLmgKaW5kZXggNTBhNGM5Yi4uZjZiOGIwMCAxMDA2NDQKLS0tIGEvZnMvZ2ZzMi9zdXBlci5oCisrKyBiL2ZzL2dmczIvc3VwZXIuaApAQCAtMTAsNiArMTAsOCBAQAogI2lmbmRlZiBfX1NVUEVSX0RPVF9IX18KICNkZWZpbmUgX19TVVBFUl9ET1RfSF9fCiAKKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2RjYWNoZS5oPgogI2luY2x1ZGUgImluY29yZS5oIgogCiB2b2lkIGdmczJfbG1fdW5tb3VudChzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCk7CkBAIC0yMywxMiArMjUsOSBAQAogCXJldHVybiB4OwogfQogCi1pbnQgZ2ZzMl9qaW5kZXhfaG9sZChzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCwgc3RydWN0IGdmczJfaG9sZGVyICpqaV9naCk7CiB2b2lkIGdmczJfamluZGV4X2ZyZWUoc3RydWN0IGdmczJfc2JkICpzZHApOwogCiBzdHJ1Y3QgZ2ZzMl9qZGVzYyAqZ2ZzMl9qZGVzY19maW5kKHN0cnVjdCBnZnMyX3NiZCAqc2RwLCB1bnNpZ25lZCBpbnQgamlkKTsKLXZvaWQgZ2ZzMl9qZGVzY19tYWtlX2RpcnR5KHN0cnVjdCBnZnMyX3NiZCAqc2RwLCB1bnNpZ25lZCBpbnQgamlkKTsKLXN0cnVjdCBnZnMyX2pkZXNjICpnZnMyX2pkZXNjX2ZpbmRfZGlydHkoc3RydWN0IGdmczJfc2JkICpzZHApOwogaW50IGdmczJfamRlc2NfY2hlY2soc3RydWN0IGdmczJfamRlc2MgKmpkKTsKIAogaW50IGdmczJfbG9va3VwX2luX21hc3Rlcl9kaXIoc3RydWN0IGdmczJfc2JkICpzZHAsIGNoYXIgKmZpbGVuYW1lLApAQCAtNDAsMTEgKzM5LDE1IEBACiB2b2lkIGdmczJfc3RhdGZzX2NoYW5nZShzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCwKIAkJCXM2NCB0b3RhbCwgczY0IGZyZWUsIHM2NCBkaW5vZGVzKTsKIGludCBnZnMyX3N0YXRmc19zeW5jKHN0cnVjdCBnZnMyX3NiZCAqc2RwKTsKLWludCBnZnMyX3N0YXRmc19pKHN0cnVjdCBnZnMyX3NiZCAqc2RwLCBzdHJ1Y3QgZ2ZzMl9zdGF0ZnNfY2hhbmdlX2hvc3QgKnNjKTsKLWludCBnZnMyX3N0YXRmc19zbG93KHN0cnVjdCBnZnMyX3NiZCAqc2RwLCBzdHJ1Y3QgZ2ZzMl9zdGF0ZnNfY2hhbmdlX2hvc3QgKnNjKTsKIAogaW50IGdmczJfZnJlZXplX2ZzKHN0cnVjdCBnZnMyX3NiZCAqc2RwKTsKIHZvaWQgZ2ZzMl91bmZyZWV6ZV9mcyhzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCk7CiAKK2V4dGVybiBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSBnZnMyX2ZzX3R5cGU7CitleHRlcm4gc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgZ2ZzMm1ldGFfZnNfdHlwZTsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgZXhwb3J0X29wZXJhdGlvbnMgZ2ZzMl9leHBvcnRfb3BzOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBzdXBlcl9vcGVyYXRpb25zIGdmczJfc3VwZXJfb3BzOworZXh0ZXJuIHN0cnVjdCBkZW50cnlfb3BlcmF0aW9ucyBnZnMyX2RvcHM7CisKICNlbmRpZiAvKiBfX1NVUEVSX0RPVF9IX18gKi8KIApkaWZmIC0tZ2l0IGEvZnMvZ2ZzMi9zeXMuYyBiL2ZzL2dmczIvc3lzLmMKaW5kZXggN2UxODc5Zi4uMjZjMWZhNyAxMDA2NDQKLS0tIGEvZnMvZ2ZzMi9zeXMuYworKysgYi9mcy9nZnMyL3N5cy5jCkBAIC0yNiw5ICsyNiw2IEBACiAjaW5jbHVkZSAicXVvdGEuaCIKICNpbmNsdWRlICJ1dGlsLmgiCiAKLWNoYXIgKmdmczJfc3lzX21hcmdzOwotc3BpbmxvY2tfdCBnZnMyX3N5c19tYXJnc19sb2NrOwotCiBzdGF0aWMgc3NpemVfdCBpZF9zaG93KHN0cnVjdCBnZnMyX3NiZCAqc2RwLCBjaGFyICpidWYpCiB7CiAJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJXU6JXVcbiIsCkBAIC0yNjMsNyArMjYwLDYgQEAKIEFSR1NfQVRUUihsb2NhbGZsb2NrcywgICAgICIlZFxuIik7CiBBUkdTX0FUVFIoZGVidWcsICAgICAgICAgICAiJWRcbiIpOwogQVJHU19BVFRSKHVwZ3JhZGUsICAgICAgICAgIiVkXG4iKTsKLUFSR1NfQVRUUihudW1fZ2xvY2tkLCAgICAgICIldVxuIik7CiBBUkdTX0FUVFIocG9zaXhfYWNsLCAgICAgICAiJWRcbiIpOwogQVJHU19BVFRSKHF1b3RhLCAgICAgICAgICAgIiV1XG4iKTsKIEFSR1NfQVRUUihzdWlkZGlyLCAgICAgICAgICIlZFxuIik7CkBAIC0yNzksNyArMjc1LDYgQEAKIAkmYXJnc19hdHRyX2xvY2FsZmxvY2tzLmF0dHIsCiAJJmFyZ3NfYXR0cl9kZWJ1Zy5hdHRyLAogCSZhcmdzX2F0dHJfdXBncmFkZS5hdHRyLAotCSZhcmdzX2F0dHJfbnVtX2dsb2NrZC5hdHRyLAogCSZhcmdzX2F0dHJfcG9zaXhfYWNsLmF0dHIsCiAJJmFyZ3NfYXR0cl9xdW90YS5hdHRyLAogCSZhcmdzX2F0dHJfc3VpZGRpci5hdHRyLApAQCAtMjg4LDMwICsyODMsNiBAQAogfTsKIAogLyoKLSAqIGRpc3BsYXkgY291bnRlcnMgZnJvbSBzdXBlcmJsb2NrCi0gKi8KLQotc3RydWN0IGNvdW50ZXJzX2F0dHIgewotCXN0cnVjdCBhdHRyaWJ1dGUgYXR0cjsKLQlzc2l6ZV90ICgqc2hvdykoc3RydWN0IGdmczJfc2JkICosIGNoYXIgKik7Ci19OwotCi0jZGVmaW5lIENPVU5URVJTX0FUVFIobmFtZSwgZm10KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotc3RhdGljIHNzaXplX3QgbmFtZSMjX3Nob3coc3RydWN0IGdmczJfc2JkICpzZHAsIGNoYXIgKmJ1ZikgICAgICAgICAgICAgICAgIFwKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCBmbXQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCQkodW5zaWduZWQgaW50KWF0b21pY19yZWFkKCZzZHAtPnNkXyMjbmFtZSkpOyAgICAgICAgXAotfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLXN0YXRpYyBzdHJ1Y3QgY291bnRlcnNfYXR0ciBjb3VudGVyc19hdHRyXyMjbmFtZSA9IF9fQVRUUl9STyhuYW1lKQotCi1DT1VOVEVSU19BVFRSKHJlY2xhaW1lZCwgICAgICAgICIldVxuIik7Ci0KLXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpjb3VudGVyc19hdHRyc1tdID0gewotCSZjb3VudGVyc19hdHRyX3JlY2xhaW1lZC5hdHRyLAotCU5VTEwsCi19OwotCi0vKgogICogZ2V0IGFuZCBzZXQgc3RydWN0IGdmczJfdHVuZSBmaWVsZHMKICAqLwogCkBAIC0zOTMsNyArMzY0LDYgQEAKIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIFRVTkVfQVRUUl8yKG5hbWUsIG5hbWUjI19zdG9yZSkKIAotVFVORV9BVFRSKGRlbW90ZV9zZWNzLCAwKTsKIFRVTkVfQVRUUihpbmNvcmVfbG9nX2Jsb2NrcywgMCk7CiBUVU5FX0FUVFIobG9nX2ZsdXNoX3NlY3MsIDApOwogVFVORV9BVFRSKHF1b3RhX3dhcm5fcGVyaW9kLCAwKTsKQEAgLTQwOCwxMSArMzc4LDkgQEAKIFRVTkVfQVRUUihzdGF0ZnNfcXVhbnR1bSwgMSk7CiBUVU5FX0FUVFJfREFFTU9OKHJlY292ZXJkX3NlY3MsIHJlY292ZXJkX3Byb2Nlc3MpOwogVFVORV9BVFRSX0RBRU1PTihsb2dkX3NlY3MsIGxvZ2RfcHJvY2Vzcyk7Ci1UVU5FX0FUVFJfREFFTU9OKHF1b3RhZF9zZWNzLCBxdW90YWRfcHJvY2Vzcyk7CiBUVU5FX0FUVFJfMyhxdW90YV9zY2FsZSwgcXVvdGFfc2NhbGVfc2hvdywgcXVvdGFfc2NhbGVfc3RvcmUpOwogCiBzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqdHVuZV9hdHRyc1tdID0gewotCSZ0dW5lX2F0dHJfZGVtb3RlX3NlY3MuYXR0ciwKIAkmdHVuZV9hdHRyX2luY29yZV9sb2dfYmxvY2tzLmF0dHIsCiAJJnR1bmVfYXR0cl9sb2dfZmx1c2hfc2Vjcy5hdHRyLAogCSZ0dW5lX2F0dHJfcXVvdGFfd2Fybl9wZXJpb2QuYXR0ciwKQEAgLTQyNiw3ICszOTQsNiBAQAogCSZ0dW5lX2F0dHJfc3RhdGZzX3F1YW50dW0uYXR0ciwKIAkmdHVuZV9hdHRyX3JlY292ZXJkX3NlY3MuYXR0ciwKIAkmdHVuZV9hdHRyX2xvZ2Rfc2Vjcy5hdHRyLAotCSZ0dW5lX2F0dHJfcXVvdGFkX3NlY3MuYXR0ciwKIAkmdHVuZV9hdHRyX3F1b3RhX3NjYWxlLmF0dHIsCiAJJnR1bmVfYXR0cl9uZXdfZmlsZXNfamRhdGEuYXR0ciwKIAlOVUxMLApAQCAtNDM3LDExICs0MDQsNiBAQAogCS5hdHRycyA9IGxvY2tzdHJ1Y3RfYXR0cnMsCiB9OwogCi1zdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBjb3VudGVyc19ncm91cCA9IHsKLQkubmFtZSA9ICJjb3VudGVycyIsCi0JLmF0dHJzID0gY291bnRlcnNfYXR0cnMsCi19OwotCiBzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBhcmdzX2dyb3VwID0gewogCS5uYW1lID0gImFyZ3MiLAogCS5hdHRycyA9IGFyZ3NfYXR0cnMsCkBAIC00NjYsMTMgKzQyOCw5IEBACiAJaWYgKGVycm9yKQogCQlnb3RvIGZhaWxfcmVnOwogCi0JZXJyb3IgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJnNkcC0+c2Rfa29iaiwgJmNvdW50ZXJzX2dyb3VwKTsKLQlpZiAoZXJyb3IpCi0JCWdvdG8gZmFpbF9sb2Nrc3RydWN0OwotCiAJZXJyb3IgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJnNkcC0+c2Rfa29iaiwgJmFyZ3NfZ3JvdXApOwogCWlmIChlcnJvcikKLQkJZ290byBmYWlsX2NvdW50ZXJzOworCQlnb3RvIGZhaWxfbG9ja3N0cnVjdDsKIAogCWVycm9yID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZzZHAtPnNkX2tvYmosICZ0dW5lX2dyb3VwKTsKIAlpZiAoZXJyb3IpCkBAIC00ODMsOCArNDQxLDYgQEAKIAogZmFpbF9hcmdzOgogCXN5c2ZzX3JlbW92ZV9ncm91cCgmc2RwLT5zZF9rb2JqLCAmYXJnc19ncm91cCk7Ci1mYWlsX2NvdW50ZXJzOgotCXN5c2ZzX3JlbW92ZV9ncm91cCgmc2RwLT5zZF9rb2JqLCAmY291bnRlcnNfZ3JvdXApOwogZmFpbF9sb2Nrc3RydWN0OgogCXN5c2ZzX3JlbW92ZV9ncm91cCgmc2RwLT5zZF9rb2JqLCAmbG9ja3N0cnVjdF9ncm91cCk7CiBmYWlsX3JlZzoKQEAgLTQ5OCwxNiArNDU0LDI3IEBACiB7CiAJc3lzZnNfcmVtb3ZlX2dyb3VwKCZzZHAtPnNkX2tvYmosICZ0dW5lX2dyb3VwKTsKIAlzeXNmc19yZW1vdmVfZ3JvdXAoJnNkcC0+c2Rfa29iaiwgJmFyZ3NfZ3JvdXApOwotCXN5c2ZzX3JlbW92ZV9ncm91cCgmc2RwLT5zZF9rb2JqLCAmY291bnRlcnNfZ3JvdXApOwogCXN5c2ZzX3JlbW92ZV9ncm91cCgmc2RwLT5zZF9rb2JqLCAmbG9ja3N0cnVjdF9ncm91cCk7CiAJa29iamVjdF9wdXQoJnNkcC0+c2Rfa29iaik7CiB9CiAKK3N0YXRpYyBpbnQgZ2ZzMl91ZXZlbnQoc3RydWN0IGtzZXQgKmtzZXQsIHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQkgICAgICAgc3RydWN0IGtvYmpfdWV2ZW50X2VudiAqZW52KQoreworCXN0cnVjdCBnZnMyX3NiZCAqc2RwID0gY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBnZnMyX3NiZCwgc2Rfa29iaik7CisJYWRkX3VldmVudF92YXIoZW52LCAiTE9DS1RBQkxFPSVzIiwgc2RwLT5zZF90YWJsZV9uYW1lKTsKKwlhZGRfdWV2ZW50X3ZhcihlbnYsICJMT0NLUFJPVE89JXMiLCBzZHAtPnNkX3Byb3RvX25hbWUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGtzZXRfdWV2ZW50X29wcyBnZnMyX3VldmVudF9vcHMgPSB7CisJLnVldmVudCA9IGdmczJfdWV2ZW50LAorfTsKKworCiBpbnQgZ2ZzMl9zeXNfaW5pdCh2b2lkKQogewotCWdmczJfc3lzX21hcmdzID0gTlVMTDsKLQlzcGluX2xvY2tfaW5pdCgmZ2ZzMl9zeXNfbWFyZ3NfbG9jayk7Ci0JZ2ZzMl9rc2V0ID0ga3NldF9jcmVhdGVfYW5kX2FkZCgiZ2ZzMiIsIE5VTEwsIGZzX2tvYmopOworCWdmczJfa3NldCA9IGtzZXRfY3JlYXRlX2FuZF9hZGQoImdmczIiLCAmZ2ZzMl91ZXZlbnRfb3BzLCBmc19rb2JqKTsKIAlpZiAoIWdmczJfa3NldCkKIAkJcmV0dXJuIC1FTk9NRU07CiAJcmV0dXJuIDA7CkBAIC01MTUsNyArNDgyLDYgQEAKIAogdm9pZCBnZnMyX3N5c191bmluaXQodm9pZCkKIHsKLQlrZnJlZShnZnMyX3N5c19tYXJncyk7CiAJa3NldF91bnJlZ2lzdGVyKGdmczJfa3NldCk7CiB9CiAKZGlmZiAtLWdpdCBhL2ZzL2dmczIvc3lzLmggYi9mcy9nZnMyL3N5cy5oCmluZGV4IDFjYThjZGEuLmU5NDU2MGUgMTAwNjQ0Ci0tLSBhL2ZzL2dmczIvc3lzLmgKKysrIGIvZnMvZ2ZzMi9zeXMuaApAQCAtMTMsMTAgKzEzLDYgQEAKICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogc3RydWN0IGdmczJfc2JkOwogCi0vKiBBbGxvdyBhcmdzIHRvIGJlIHBhc3NlZCB0byBHRlMyIHdoZW4gdXNpbmcgYW4gaW5pdGlhbCByYW0gZGlzayAqLwotZXh0ZXJuIGNoYXIgKmdmczJfc3lzX21hcmdzOwotZXh0ZXJuIHNwaW5sb2NrX3QgZ2ZzMl9zeXNfbWFyZ3NfbG9jazsKLQogaW50IGdmczJfc3lzX2ZzX2FkZChzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCk7CiB2b2lkIGdmczJfc3lzX2ZzX2RlbChzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCk7CiAKZGlmZiAtLWdpdCBhL2ZzL2dmczIvdXRpbC5jIGIvZnMvZ2ZzMi91dGlsLmMKaW5kZXggZDMxZTM1NS4uMzc0ZjUwZSAxMDA2NDQKLS0tIGEvZnMvZ2ZzMi91dGlsLmMKKysrIGIvZnMvZ2ZzMi91dGlsLmMKQEAgLTI1LDYgKzI1LDcgQEAKIHN0cnVjdCBrbWVtX2NhY2hlICpnZnMyX2lub2RlX2NhY2hlcCBfX3JlYWRfbW9zdGx5Owogc3RydWN0IGttZW1fY2FjaGUgKmdmczJfYnVmZGF0YV9jYWNoZXAgX19yZWFkX21vc3RseTsKIHN0cnVjdCBrbWVtX2NhY2hlICpnZnMyX3JncnBkX2NhY2hlcCBfX3JlYWRfbW9zdGx5Oworc3RydWN0IGttZW1fY2FjaGUgKmdmczJfcXVvdGFkX2NhY2hlcCBfX3JlYWRfbW9zdGx5OwogCiB2b2lkIGdmczJfYXNzZXJ0X2koc3RydWN0IGdmczJfc2JkICpzZHApCiB7CmRpZmYgLS1naXQgYS9mcy9nZnMyL3V0aWwuaCBiL2ZzL2dmczIvdXRpbC5oCmluZGV4IDdmNDg1NzYuLjMzZTk2YjAgMTAwNjQ0Ci0tLSBhL2ZzL2dmczIvdXRpbC5oCisrKyBiL2ZzL2dmczIvdXRpbC5oCkBAIC0xNDgsNiArMTQ4LDcgQEAKIGV4dGVybiBzdHJ1Y3Qga21lbV9jYWNoZSAqZ2ZzMl9pbm9kZV9jYWNoZXA7CiBleHRlcm4gc3RydWN0IGttZW1fY2FjaGUgKmdmczJfYnVmZGF0YV9jYWNoZXA7CiBleHRlcm4gc3RydWN0IGttZW1fY2FjaGUgKmdmczJfcmdycGRfY2FjaGVwOworZXh0ZXJuIHN0cnVjdCBrbWVtX2NhY2hlICpnZnMyX3F1b3RhZF9jYWNoZXA7CiAKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGdmczJfdHVuZV9nZXRfaShzdHJ1Y3QgZ2ZzMl90dW5lICpndCwKIAkJCQkJICAgdW5zaWduZWQgaW50ICpwKQpkaWZmIC0tZ2l0IGEvZnMvaHVnZXRsYmZzL2lub2RlLmMgYi9mcy9odWdldGxiZnMvaW5vZGUuYwppbmRleCA3ZDQ3OWNlLi42OTAzZDM3IDEwMDY0NAotLS0gYS9mcy9odWdldGxiZnMvaW5vZGUuYworKysgYi9mcy9odWdldGxiZnMvaW5vZGUuYwpAQCAtMjUyLDYgKzI1Miw3IEBACiAJZm9yICg7OykgewogCQlzdHJ1Y3QgcGFnZSAqcGFnZTsKIAkJdW5zaWduZWQgbG9uZyBuciwgcmV0OworCQlpbnQgcmE7CiAKIAkJLyogbnIgaXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIGNvcHkgZnJvbSB0aGlzIHBhZ2UgKi8KIAkJbnIgPSBodWdlX3BhZ2Vfc2l6ZShoKTsKQEAgLTI3NCwxNiArMjc1LDE5IEBACiAJCQkgKi8KIAkJCXJldCA9IGxlbiA8IG5yID8gbGVuIDogbnI7CiAJCQlpZiAoY2xlYXJfdXNlcihidWYsIHJldCkpCi0JCQkJcmV0ID0gLUVGQVVMVDsKKwkJCQlyYSA9IC1FRkFVTFQ7CisJCQllbHNlCisJCQkJcmEgPSAwOwogCQl9IGVsc2UgewogCQkJLyoKIAkJCSAqIFdlIGhhdmUgdGhlIHBhZ2UsIGNvcHkgaXQgdG8gdXNlciBzcGFjZSBidWZmZXIuCiAJCQkgKi8KLQkJCXJldCA9IGh1Z2V0bGJmc19yZWFkX2FjdG9yKHBhZ2UsIG9mZnNldCwgYnVmLCBsZW4sIG5yKTsKKwkJCXJhID0gaHVnZXRsYmZzX3JlYWRfYWN0b3IocGFnZSwgb2Zmc2V0LCBidWYsIGxlbiwgbnIpOworCQkJcmV0ID0gcmE7CiAJCX0KLQkJaWYgKHJldCA8IDApIHsKKwkJaWYgKHJhIDwgMCkgewogCQkJaWYgKHJldHZhbCA9PSAwKQotCQkJCXJldHZhbCA9IHJldDsKKwkJCQlyZXR2YWwgPSByYTsKIAkJCWlmIChwYWdlKQogCQkJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKIAkJCWdvdG8gb3V0OwpAQCAtNTA2LDcgKzUxMCw2IEBACiAJCWlub2RlLT5pX21vZGUgPSBtb2RlOwogCQlpbm9kZS0+aV91aWQgPSB1aWQ7CiAJCWlub2RlLT5pX2dpZCA9IGdpZDsKLQkJaW5vZGUtPmlfYmxvY2tzID0gMDsKIAkJaW5vZGUtPmlfbWFwcGluZy0+YV9vcHMgPSAmaHVnZXRsYmZzX2FvcHM7CiAJCWlub2RlLT5pX21hcHBpbmctPmJhY2tpbmdfZGV2X2luZm8gPSZodWdldGxiZnNfYmFja2luZ19kZXZfaW5mbzsKIAkJaW5vZGUtPmlfYXRpbWUgPSBpbm9kZS0+aV9tdGltZSA9IGlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FOwpkaWZmIC0tZ2l0IGEvZnMvaW5vZGUuYyBiL2ZzL2lub2RlLmMKaW5kZXggN2RlMWNkYS4uMDAxM2FjMSAxMDA2NDQKLS0tIGEvZnMvaW5vZGUuYworKysgYi9mcy9pbm9kZS5jCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgogI2luY2x1ZGUgPGxpbnV4L2lub3RpZnkuaD4KICNpbmNsdWRlIDxsaW51eC9tb3VudC5oPgorI2luY2x1ZGUgPGxpbnV4L2FzeW5jLmg+CiAKIC8qCiAgKiBUaGlzIGlzIG5lZWRlZCBmb3IgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnM6CkBAIC0xMTAsOCArMTExLDggQEAKIAogLyoqCiAgKiBpbm9kZV9pbml0X2Fsd2F5cyAtIHBlcmZvcm0gaW5vZGUgc3RydWN0dXJlIGludGlhbGlzYXRpb24KLSAqIEBzYgkJLSBzdXBlcmJsb2NrIGlub2RlIGJlbG9uZ3MgdG8uCi0gKiBAaW5vZGUJLSBpbm9kZSB0byBpbml0aWFsaXNlCisgKiBAc2I6IHN1cGVyYmxvY2sgaW5vZGUgYmVsb25ncyB0bworICogQGlub2RlOiBpbm9kZSB0byBpbml0aWFsaXNlCiAgKgogICogVGhlc2UgYXJlIGluaXRpYWxpemF0aW9ucyB0aGF0IG5lZWQgdG8gYmUgZG9uZSBvbiBldmVyeSBpbm9kZQogICogYWxsb2NhdGlvbiBhcyB0aGUgZmllbGRzIGFyZSBub3QgaW5pdGlhbGlzZWQgYnkgc2xhYiBhbGxvY2F0aW9uLgpAQCAtMTMxLDYgKzEzMiw4IEBACiAJaW5vZGUtPmlfb3AgPSAmZW1wdHlfaW9wczsKIAlpbm9kZS0+aV9mb3AgPSAmZW1wdHlfZm9wczsKIAlpbm9kZS0+aV9ubGluayA9IDE7CisJaW5vZGUtPmlfdWlkID0gMDsKKwlpbm9kZS0+aV9naWQgPSAwOwogCWF0b21pY19zZXQoJmlub2RlLT5pX3dyaXRlY291bnQsIDApOwogCWlub2RlLT5pX3NpemUgPSAwOwogCWlub2RlLT5pX2Jsb2NrcyA9IDA7CkBAIC0xNjQsNyArMTY3LDcgQEAKIAltYXBwaW5nLT5hX29wcyA9ICZlbXB0eV9hb3BzOwogCW1hcHBpbmctPmhvc3QgPSBpbm9kZTsKIAltYXBwaW5nLT5mbGFncyA9IDA7Ci0JbWFwcGluZ19zZXRfZ2ZwX21hc2sobWFwcGluZywgR0ZQX0hJR0hVU0VSX1BBR0VDQUNIRSk7CisJbWFwcGluZ19zZXRfZ2ZwX21hc2sobWFwcGluZywgR0ZQX0hJR0hVU0VSX01PVkFCTEUpOwogCW1hcHBpbmctPmFzc29jX21hcHBpbmcgPSBOVUxMOwogCW1hcHBpbmctPmJhY2tpbmdfZGV2X2luZm8gPSAmZGVmYXVsdF9iYWNraW5nX2Rldl9pbmZvOwogCW1hcHBpbmctPndyaXRlYmFja19pbmRleCA9IDA7CkBAIC01NzQsOCArNTc3LDggQEAKIAogLyoqCiAgKiBpbm9kZV9hZGRfdG9fbGlzdHMgLSBhZGQgYSBuZXcgaW5vZGUgdG8gcmVsZXZhbnQgbGlzdHMKLSAqIEBzYgkJLSBzdXBlcmJsb2NrIGlub2RlIGJlbG9uZ3MgdG8uCi0gKiBAaW5vZGUJLSBpbm9kZSB0byBtYXJrIGluIHVzZQorICogQHNiOiBzdXBlcmJsb2NrIGlub2RlIGJlbG9uZ3MgdG8KKyAqIEBpbm9kZTogaW5vZGUgdG8gbWFyayBpbiB1c2UKICAqCiAgKiBXaGVuIGFuIGlub2RlIGlzIGFsbG9jYXRlZCBpdCBuZWVkcyB0byBiZSBhY2NvdW50ZWQgZm9yLCBhZGRlZCB0byB0aGUgaW4gdXNlCiAgKiBsaXN0LCB0aGUgb3duaW5nIHN1cGVyYmxvY2sgYW5kIHRoZSBpbm9kZSBoYXNoLiBUaGlzIG5lZWRzIHRvIGJlIGRvbmUgdW5kZXIKQEAgLTU5OSw3ICs2MDIsNyBAQAogICoJQHNiOiBzdXBlcmJsb2NrCiAgKgogICoJQWxsb2NhdGVzIGEgbmV3IGlub2RlIGZvciBnaXZlbiBzdXBlcmJsb2NrLiBUaGUgZGVmYXVsdCBnZnBfbWFzawotICoJZm9yIGFsbG9jYXRpb25zIHJlbGF0ZWQgdG8gaW5vZGUtPmlfbWFwcGluZyBpcyBHRlBfSElHSFVTRVJfUEFHRUNBQ0hFLgorICoJZm9yIGFsbG9jYXRpb25zIHJlbGF0ZWQgdG8gaW5vZGUtPmlfbWFwcGluZyBpcyBHRlBfSElHSFVTRVJfTU9WQUJMRS4KICAqCUlmIEhJR0hNRU0gcGFnZXMgYXJlIHVuc3VpdGFibGUgb3IgaXQgaXMga25vd24gdGhhdCBwYWdlcyBhbGxvY2F0ZWQKICAqCWZvciB0aGUgcGFnZSBjYWNoZSBhcmUgbm90IHJlY2xhaW1hYmxlIG9yIG1pZ3JhdGFibGUsCiAgKgltYXBwaW5nX3NldF9nZnBfbWFzaygpIG11c3QgYmUgY2FsbGVkIHdpdGggc3VpdGFibGUgZmxhZ3Mgb24gdGhlCkBAIC0xMTM2LDE2ICsxMTM5LDExIEBACiAgKiBJX0ZSRUVJTkcgaXMgc2V0IHNvIHRoYXQgbm8tb25lIHdpbGwgdGFrZSBhIG5ldyByZWZlcmVuY2UgdG8gdGhlIGlub2RlIHdoaWxlCiAgKiBpdCBpcyBiZWluZyBkZWxldGVkLgogICovCi12b2lkIGdlbmVyaWNfZGVsZXRlX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCitzdGF0aWMgdm9pZCBnZW5lcmljX2RlbGV0ZV9pbm9kZV9hc3luYyh2b2lkICpkYXRhLCBhc3luY19jb29raWVfdCBjb29raWUpCiB7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGRhdGE7CiAJY29uc3Qgc3RydWN0IHN1cGVyX29wZXJhdGlvbnMgKm9wID0gaW5vZGUtPmlfc2ItPnNfb3A7CiAKLQlsaXN0X2RlbF9pbml0KCZpbm9kZS0+aV9saXN0KTsKLQlsaXN0X2RlbF9pbml0KCZpbm9kZS0+aV9zYl9saXN0KTsKLQlpbm9kZS0+aV9zdGF0ZSB8PSBJX0ZSRUVJTkc7Ci0JaW5vZGVzX3N0YXQubnJfaW5vZGVzLS07Ci0Jc3Bpbl91bmxvY2soJmlub2RlX2xvY2spOwotCiAJc2VjdXJpdHlfaW5vZGVfZGVsZXRlKGlub2RlKTsKIAogCWlmIChvcC0+ZGVsZXRlX2lub2RlKSB7CkBAIC0xMTY5LDYgKzExNjcsMTYgQEAKIAlkZXN0cm95X2lub2RlKGlub2RlKTsKIH0KIAordm9pZCBnZW5lcmljX2RlbGV0ZV9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCWxpc3RfZGVsX2luaXQoJmlub2RlLT5pX2xpc3QpOworCWxpc3RfZGVsX2luaXQoJmlub2RlLT5pX3NiX2xpc3QpOworCWlub2RlLT5pX3N0YXRlIHw9IElfRlJFRUlORzsKKwlpbm9kZXNfc3RhdC5ucl9pbm9kZXMtLTsKKwlzcGluX3VubG9jaygmaW5vZGVfbG9jayk7CisJYXN5bmNfc2NoZWR1bGVfc3BlY2lhbChnZW5lcmljX2RlbGV0ZV9pbm9kZV9hc3luYywgaW5vZGUsICZpbm9kZS0+aV9zYi0+c19hc3luY19saXN0KTsKK30KKwogRVhQT1JUX1NZTUJPTChnZW5lcmljX2RlbGV0ZV9pbm9kZSk7CiAKIHN0YXRpYyB2b2lkIGdlbmVyaWNfZm9yZ2V0X2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCmRpZmYgLS1naXQgYS9mcy9pb2N0bC5jIGIvZnMvaW9jdGwuYwppbmRleCA0M2U4YjJjLi5jYzNmMWFhIDEwMDY0NAotLS0gYS9mcy9pb2N0bC5jCisrKyBiL2ZzL2lvY3RsLmMKQEAgLTIzMSw3ICsyMzEsOCBAQAogI2RlZmluZSBibGtfdG9fbG9naWNhbChpbm9kZSwgYmxrKSAoYmxrIDw8IChpbm9kZSktPmlfYmxrYml0cykKICNkZWZpbmUgbG9naWNhbF90b19ibGsoaW5vZGUsIG9mZnNldCkgKG9mZnNldCA+PiAoaW5vZGUpLT5pX2Jsa2JpdHMpOwogCi0vKgorLyoqCisgKiBfX2dlbmVyaWNfYmxvY2tfZmllbWFwIC0gRklFTUFQIGZvciBibG9jayBiYXNlZCBpbm9kZXMgKG5vIGxvY2tpbmcpCiAgKiBAaW5vZGUgLSB0aGUgaW5vZGUgdG8gbWFwCiAgKiBAYXJnIC0gdGhlIHBvaW50ZXIgdG8gdXNlcnNwYWNlIHdoZXJlIHdlIGNvcHkgZXZlcnl0aGluZyB0bwogICogQGdldF9ibG9jayAtIHRoZSBmcydzIGdldF9ibG9jayBmdW5jdGlvbgpAQCAtMjQyLDExICsyNDMsMTUgQEAKICAqCiAgKiBJZiBpdCBpcyBwb3NzaWJsZSB0byBoYXZlIGRhdGEgYmxvY2tzIGJleW9uZCBhIGhvbGUgcGFzdCBAaW5vZGUtPmlfc2l6ZSwgdGhlbgogICogcGxlYXNlIGRvIG5vdCB1c2UgdGhpcyBmdW5jdGlvbiwgaXQgd2lsbCBzdG9wIGF0IHRoZSBmaXJzdCB1bm1hcHBlZCBibG9jawotICogYmV5b25kIGlfc2l6ZQorICogYmV5b25kIGlfc2l6ZS4KKyAqCisgKiBJZiB5b3UgdXNlIHRoaXMgZnVuY3Rpb24gZGlyZWN0bHksIHlvdSBuZWVkIHRvIGRvIHlvdXIgb3duIGxvY2tpbmcuIFVzZQorICogZ2VuZXJpY19ibG9ja19maWVtYXAgaWYgeW91IHdhbnQgdGhlIGxvY2tpbmcgZG9uZSBmb3IgeW91LgogICovCi1pbnQgZ2VuZXJpY19ibG9ja19maWVtYXAoc3RydWN0IGlub2RlICppbm9kZSwKLQkJCSBzdHJ1Y3QgZmllbWFwX2V4dGVudF9pbmZvICpmaWVpbmZvLCB1NjQgc3RhcnQsCi0JCQkgdTY0IGxlbiwgZ2V0X2Jsb2NrX3QgKmdldF9ibG9jaykKKworaW50IF9fZ2VuZXJpY19ibG9ja19maWVtYXAoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCSAgIHN0cnVjdCBmaWVtYXBfZXh0ZW50X2luZm8gKmZpZWluZm8sIHU2NCBzdGFydCwKKwkJCSAgIHU2NCBsZW4sIGdldF9ibG9ja190ICpnZXRfYmxvY2spCiB7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkIHRtcDsKIAl1bnNpZ25lZCBpbnQgc3RhcnRfYmxrOwpAQCAtMjYwLDkgKzI2NSw2IEBACiAKIAlzdGFydF9ibGsgPSBsb2dpY2FsX3RvX2Jsayhpbm9kZSwgc3RhcnQpOwogCi0JLyogZ3VhcmQgYWdhaW5zdCBjaGFuZ2UgKi8KLQltdXRleF9sb2NrKCZpbm9kZS0+aV9tdXRleCk7Ci0KIAlsZW5ndGggPSAobG9uZyBsb25nKW1pbl90KHU2NCwgbGVuLCBpX3NpemVfcmVhZChpbm9kZSkpOwogCW1hcF9sZW4gPSBsZW5ndGg7CiAKQEAgLTMzNCwxNCArMzM2LDM2IEBACiAJCWNvbmRfcmVzY2hlZCgpOwogCX0gd2hpbGUgKDEpOwogCi0JbXV0ZXhfdW5sb2NrKCZpbm9kZS0+aV9tdXRleCk7Ci0KIAkvKiBpZiByZXQgaXMgMSB0aGVuIHdlIGp1c3QgaGl0IHRoZSBlbmQgb2YgdGhlIGV4dGVudCBhcnJheSAqLwogCWlmIChyZXQgPT0gMSkKIAkJcmV0ID0gMDsKIAogCXJldHVybiByZXQ7CiB9CitFWFBPUlRfU1lNQk9MKF9fZ2VuZXJpY19ibG9ja19maWVtYXApOworCisvKioKKyAqIGdlbmVyaWNfYmxvY2tfZmllbWFwIC0gRklFTUFQIGZvciBibG9jayBiYXNlZCBpbm9kZXMKKyAqIEBpbm9kZTogVGhlIGlub2RlIHRvIG1hcAorICogQGZpZWluZm86IFRoZSBtYXBwaW5nIGluZm9ybWF0aW9uCisgKiBAc3RhcnQ6IFRoZSBpbml0aWFsIGJsb2NrIHRvIG1hcAorICogQGxlbjogVGhlIGxlbmd0aCBvZiB0aGUgZXh0ZWN0IHRvIGF0dGVtcHQgdG8gbWFwCisgKiBAZ2V0X2Jsb2NrOiBUaGUgYmxvY2sgbWFwcGluZyBmdW5jdGlvbiBmb3IgdGhlIGZzCisgKgorICogQ2FsbHMgX19nZW5lcmljX2Jsb2NrX2ZpZW1hcCB0byBtYXAgdGhlIGlub2RlLCBhZnRlciB0YWtpbmcKKyAqIHRoZSBpbm9kZSdzIG11dGV4IGxvY2suCisgKi8KKworaW50IGdlbmVyaWNfYmxvY2tfZmllbWFwKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkgc3RydWN0IGZpZW1hcF9leHRlbnRfaW5mbyAqZmllaW5mbywgdTY0IHN0YXJ0LAorCQkJIHU2NCBsZW4sIGdldF9ibG9ja190ICpnZXRfYmxvY2spCit7CisJaW50IHJldDsKKwltdXRleF9sb2NrKCZpbm9kZS0+aV9tdXRleCk7CisJcmV0ID0gX19nZW5lcmljX2Jsb2NrX2ZpZW1hcChpbm9kZSwgZmllaW5mbywgc3RhcnQsIGxlbiwgZ2V0X2Jsb2NrKTsKKwltdXRleF91bmxvY2soJmlub2RlLT5pX211dGV4KTsKKwlyZXR1cm4gcmV0OworfQogRVhQT1JUX1NZTUJPTChnZW5lcmljX2Jsb2NrX2ZpZW1hcCk7CiAKICNlbmRpZiAgLyogIENPTkZJR19CTE9DSyAgKi8KZGlmZiAtLWdpdCBhL2ZzL2lvcHJpby5jIGIvZnMvaW9wcmlvLmMKaW5kZXggMzU2OWUwYS4uMWEzOWFjMyAxMDA2NDQKLS0tIGEvZnMvaW9wcmlvLmMKKysrIGIvZnMvaW9wcmlvLmMKQEAgLTI3LDcgKzI3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zZWN1cml0eS5oPgogI2luY2x1ZGUgPGxpbnV4L3BpZF9uYW1lc3BhY2UuaD4KIAotc3RhdGljIGludCBzZXRfdGFza19pb3ByaW8oc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBpbnQgaW9wcmlvKQoraW50IHNldF90YXNrX2lvcHJpbyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIGludCBpb3ByaW8pCiB7CiAJaW50IGVycjsKIAlzdHJ1Y3QgaW9fY29udGV4dCAqaW9jOwpAQCAtNzAsNiArNzAsNyBAQAogCXRhc2tfdW5sb2NrKHRhc2spOwogCXJldHVybiBlcnI7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChzZXRfdGFza19pb3ByaW8pOwogCiBhc21saW5rYWdlIGxvbmcgc3lzX2lvcHJpb19zZXQoaW50IHdoaWNoLCBpbnQgd2hvLCBpbnQgaW9wcmlvKQogewpkaWZmIC0tZ2l0IGEvZnMvaXNvZnMvaW5vZGUuYyBiL2ZzL2lzb2ZzL2lub2RlLmMKaW5kZXggM2Y4YWYwZi4uNjE0N2VjMyAxMDA2NDQKLS0tIGEvZnMvaXNvZnMvaW5vZGUuYworKysgYi9mcy9pc29mcy9pbm9kZS5jCkBAIC04NTUsMTAgKzg1NSw2IEBACiAJfQogCXNiaS0+c19qb2xpZXRfbGV2ZWwgPSBqb2xpZXRfbGV2ZWw7CiAKLQkvKiBjaGVjayB0aGUgcm9vdCBpbm9kZSAqLwotCWlmICghaW5vZGUtPmlfb3ApCi0JCWdvdG8gb3V0X2JhZF9yb290OwotCiAJLyogTWFrZSBzdXJlIHRoZSByb290IGlub2RlIGlzIGEgZGlyZWN0b3J5ICovCiAJaWYgKCFTX0lTRElSKGlub2RlLT5pX21vZGUpKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcKQEAgLTg4Niw4ICs4ODIsNiBAQAogCS8qCiAJICogRGlzcGxheSBlcnJvciBtZXNzYWdlcyBhbmQgZnJlZSByZXNvdXJjZXMuCiAJICovCi1vdXRfYmFkX3Jvb3Q6Ci0JcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHJvb3QgaW5vZGUgbm90IGluaXRpYWxpemVkXG4iLCBfX2Z1bmNfXyk7CiBvdXRfaXB1dDoKIAlpcHV0KGlub2RlKTsKIAlnb3RvIG91dF9ub19pbm9kZTsKZGlmZiAtLWdpdCBhL2ZzL2piZC9jb21taXQuYyBiL2ZzL2piZC9jb21taXQuYwppbmRleCAyNTcxOWQ5Li4zZmJmZmIxIDEwMDY0NAotLS0gYS9mcy9qYmQvY29tbWl0LmMKKysrIGIvZnMvamJkL2NvbW1pdC5jCkBAIC0zMDYsNiArMzA2LDggQEAKIAlpbnQgZmxhZ3M7CiAJaW50IGVycjsKIAl1bnNpZ25lZCBsb25nIGJsb2NrbnI7CisJa3RpbWVfdCBzdGFydF90aW1lOworCXU2NCBjb21taXRfdGltZTsKIAljaGFyICp0YWdwID0gTlVMTDsKIAlqb3VybmFsX2hlYWRlcl90ICpoZWFkZXI7CiAJam91cm5hbF9ibG9ja190YWdfdCAqdGFnID0gTlVMTDsKQEAgLTQxOCw2ICs0MjAsNyBAQAogCWNvbW1pdF90cmFuc2FjdGlvbi0+dF9zdGF0ZSA9IFRfRkxVU0g7CiAJam91cm5hbC0+al9jb21taXR0aW5nX3RyYW5zYWN0aW9uID0gY29tbWl0X3RyYW5zYWN0aW9uOwogCWpvdXJuYWwtPmpfcnVubmluZ190cmFuc2FjdGlvbiA9IE5VTEw7CisJc3RhcnRfdGltZSA9IGt0aW1lX2dldCgpOwogCWNvbW1pdF90cmFuc2FjdGlvbi0+dF9sb2dfc3RhcnQgPSBqb3VybmFsLT5qX2hlYWQ7CiAJd2FrZV91cCgmam91cm5hbC0+al93YWl0X3RyYW5zYWN0aW9uX2xvY2tlZCk7CiAJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfc3RhdGVfbG9jayk7CkBAIC05MTMsNiArOTE2LDE4IEBACiAJSl9BU1NFUlQoY29tbWl0X3RyYW5zYWN0aW9uID09IGpvdXJuYWwtPmpfY29tbWl0dGluZ190cmFuc2FjdGlvbik7CiAJam91cm5hbC0+al9jb21taXRfc2VxdWVuY2UgPSBjb21taXRfdHJhbnNhY3Rpb24tPnRfdGlkOwogCWpvdXJuYWwtPmpfY29tbWl0dGluZ190cmFuc2FjdGlvbiA9IE5VTEw7CisJY29tbWl0X3RpbWUgPSBrdGltZV90b19ucyhrdGltZV9zdWIoa3RpbWVfZ2V0KCksIHN0YXJ0X3RpbWUpKTsKKworCS8qCisJICogd2VpZ2h0IHRoZSBjb21taXQgdGltZSBoaWdoZXIgdGhhbiB0aGUgYXZlcmFnZSB0aW1lIHNvIHdlIGRvbid0CisJICogcmVhY3QgdG9vIHN0cm9uZ2x5IHRvIHZhc3QgY2hhbmdlcyBpbiBjb21taXQgdGltZQorCSAqLworCWlmIChsaWtlbHkoam91cm5hbC0+al9hdmVyYWdlX2NvbW1pdF90aW1lKSkKKwkJam91cm5hbC0+al9hdmVyYWdlX2NvbW1pdF90aW1lID0gKGNvbW1pdF90aW1lKjMgKworCQkJCWpvdXJuYWwtPmpfYXZlcmFnZV9jb21taXRfdGltZSkgLyA0OworCWVsc2UKKwkJam91cm5hbC0+al9hdmVyYWdlX2NvbW1pdF90aW1lID0gY29tbWl0X3RpbWU7CisKIAlzcGluX3VubG9jaygmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKIAogCWlmIChjb21taXRfdHJhbnNhY3Rpb24tPnRfY2hlY2twb2ludF9saXN0ID09IE5VTEwgJiYKZGlmZiAtLWdpdCBhL2ZzL2piZC90cmFuc2FjdGlvbi5jIGIvZnMvamJkL3RyYW5zYWN0aW9uLmMKaW5kZXggNjBkNGMzMi4uZTZhMTE3NCAxMDA2NDQKLS0tIGEvZnMvamJkL3RyYW5zYWN0aW9uLmMKKysrIGIvZnMvamJkL3RyYW5zYWN0aW9uLmMKQEAgLTI1LDYgKzI1LDcgQEAKICNpbmNsdWRlIDxsaW51eC90aW1lci5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgorI2luY2x1ZGUgPGxpbnV4L2hydGltZXIuaD4KIAogc3RhdGljIHZvaWQgX19qb3VybmFsX3RlbXBfdW5saW5rX2J1ZmZlcihzdHJ1Y3Qgam91cm5hbF9oZWFkICpqaCk7CiAKQEAgLTQ5LDYgKzUwLDcgQEAKIHsKIAl0cmFuc2FjdGlvbi0+dF9qb3VybmFsID0gam91cm5hbDsKIAl0cmFuc2FjdGlvbi0+dF9zdGF0ZSA9IFRfUlVOTklORzsKKwl0cmFuc2FjdGlvbi0+dF9zdGFydF90aW1lID0ga3RpbWVfZ2V0KCk7CiAJdHJhbnNhY3Rpb24tPnRfdGlkID0gam91cm5hbC0+al90cmFuc2FjdGlvbl9zZXF1ZW5jZSsrOwogCXRyYW5zYWN0aW9uLT50X2V4cGlyZXMgPSBqaWZmaWVzICsgam91cm5hbC0+al9jb21taXRfaW50ZXJ2YWw7CiAJc3Bpbl9sb2NrX2luaXQoJnRyYW5zYWN0aW9uLT50X2hhbmRsZV9sb2NrKTsKQEAgLTc1Miw3ICs3NTQsNiBAQAogICogaW50IGpvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcygpIC0gbm90aWZ5IGludGVudCB0byBtb2RpZnkgYSBidWZmZXIgZm9yIG1ldGFkYXRhIChub3QgZGF0YSkgdXBkYXRlLgogICogQGhhbmRsZTogdHJhbnNhY3Rpb24gdG8gYWRkIGJ1ZmZlciBtb2RpZmljYXRpb25zIHRvCiAgKiBAYmg6ICAgICBiaCB0byBiZSB1c2VkIGZvciBtZXRhZGF0YSB3cml0ZXMKLSAqIEBjcmVkaXRzOiB2YXJpYWJsZSB0aGF0IHdpbGwgcmVjZWl2ZSBjcmVkaXRzIGZvciB0aGUgYnVmZmVyCiAgKgogICogUmV0dXJucyBhbiBlcnJvciBjb2RlIG9yIDAgb24gc3VjY2Vzcy4KICAqCkBAIC0xMzcwLDcgKzEzNzEsNyBAQAogewogCXRyYW5zYWN0aW9uX3QgKnRyYW5zYWN0aW9uID0gaGFuZGxlLT5oX3RyYW5zYWN0aW9uOwogCWpvdXJuYWxfdCAqam91cm5hbCA9IHRyYW5zYWN0aW9uLT50X2pvdXJuYWw7Ci0JaW50IG9sZF9oYW5kbGVfY291bnQsIGVycjsKKwlpbnQgZXJyOwogCXBpZF90IHBpZDsKIAogCUpfQVNTRVJUKGpvdXJuYWxfY3VycmVudF9oYW5kbGUoKSA9PSBoYW5kbGUpOwpAQCAtMTM5OSw2ICsxNDAwLDE3IEBACiAJICogb24gSU8gYW55d2F5LiAgU3BlZWRzIHVwIG1hbnktdGhyZWFkZWQsIG1hbnktZGlyIG9wZXJhdGlvbnMKIAkgKiBieSAzMHggb3IgbW9yZS4uLgogCSAqCisJICogV2UgdHJ5IGFuZCBvcHRpbWl6ZSB0aGUgc2xlZXAgdGltZSBhZ2FpbnN0IHdoYXQgdGhlIHVuZGVybHlpbmcgZGlzaworCSAqIGNhbiBkbywgaW5zdGVhZCBvZiBoYXZpbmcgYSBzdGF0aWMgc2xlZXAgdGltZS4gIFRoaXMgaXMgdXNlZnVsbCBmb3IKKwkgKiB0aGUgY2FzZSB3aGVyZSBvdXIgc3RvcmFnZSBpcyBzbyBmYXN0IHRoYXQgaXQgaXMgbW9yZSBvcHRpbWFsIHRvIGdvCisJICogYWhlYWQgYW5kIGZvcmNlIGEgZmx1c2ggYW5kIHdhaXQgZm9yIHRoZSB0cmFuc2FjdGlvbiB0byBiZSBjb21taXR0ZWQKKwkgKiB0aGFuIGl0IGlzIHRvIHdhaXQgZm9yIGFuIGFyYml0cmFyeSBhbW91bnQgb2YgdGltZSBmb3IgbmV3IHdyaXRlcnMgdG8KKwkgKiBqb2luIHRoZSB0cmFuc2FjdGlvbi4gIFdlIGFjaGVpdmUgdGhpcyBieSBtZWFzdXJpbmcgaG93IGxvbmcgaXQgdGFrZXMKKwkgKiB0byBjb21taXQgYSB0cmFuc2FjdGlvbiwgYW5kIGNvbXBhcmUgaXQgd2l0aCBob3cgbG9uZyB0aGlzCisJICogdHJhbnNhY3Rpb24gaGFzIGJlZW4gcnVubmluZywgYW5kIGlmIHJ1biB0aW1lIDwgY29tbWl0IHRpbWUgdGhlbiB3ZQorCSAqIHNsZWVwIGZvciB0aGUgZGVsdGEgYW5kIGNvbW1pdC4gIFRoaXMgZ3JlYXRseSBoZWxwcyBzdXBlciBmYXN0IGRpc2tzCisJICogdGhhdCB3b3VsZCBzZWUgc2xvd2Rvd25zIGFzIG1vcmUgdGhyZWFkcyBzdGFydGVkIGRvaW5nIGZzeW5jcy4KKwkgKgogCSAqIEJ1dCBkb24ndCBkbyB0aGlzIGlmIHRoaXMgcHJvY2VzcyB3YXMgdGhlIG1vc3QgcmVjZW50IG9uZSB0bwogCSAqIHBlcmZvcm0gYSBzeW5jaHJvbm91cyB3cml0ZS4gIFdlIGRvIHRoaXMgdG8gZGV0ZWN0IHRoZSBjYXNlIHdoZXJlIGEKIAkgKiBzaW5nbGUgcHJvY2VzcyBpcyBkb2luZyBhIHN0cmVhbSBvZiBzeW5jIHdyaXRlcy4gIE5vIHBvaW50IGluIHdhaXRpbmcKQEAgLTE0MDYsMTEgKzE0MTgsMjYgQEAKIAkgKi8KIAlwaWQgPSBjdXJyZW50LT5waWQ7CiAJaWYgKGhhbmRsZS0+aF9zeW5jICYmIGpvdXJuYWwtPmpfbGFzdF9zeW5jX3dyaXRlciAhPSBwaWQpIHsKKwkJdTY0IGNvbW1pdF90aW1lLCB0cmFuc190aW1lOworCiAJCWpvdXJuYWwtPmpfbGFzdF9zeW5jX3dyaXRlciA9IHBpZDsKLQkJZG8gewotCQkJb2xkX2hhbmRsZV9jb3VudCA9IHRyYW5zYWN0aW9uLT50X2hhbmRsZV9jb3VudDsKLQkJCXNjaGVkdWxlX3RpbWVvdXRfdW5pbnRlcnJ1cHRpYmxlKDEpOwotCQl9IHdoaWxlIChvbGRfaGFuZGxlX2NvdW50ICE9IHRyYW5zYWN0aW9uLT50X2hhbmRsZV9jb3VudCk7CisKKwkJc3Bpbl9sb2NrKCZqb3VybmFsLT5qX3N0YXRlX2xvY2spOworCQljb21taXRfdGltZSA9IGpvdXJuYWwtPmpfYXZlcmFnZV9jb21taXRfdGltZTsKKwkJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfc3RhdGVfbG9jayk7CisKKwkJdHJhbnNfdGltZSA9IGt0aW1lX3RvX25zKGt0aW1lX3N1YihrdGltZV9nZXQoKSwKKwkJCQkJCSAgIHRyYW5zYWN0aW9uLT50X3N0YXJ0X3RpbWUpKTsKKworCQljb21taXRfdGltZSA9IG1pbl90KHU2NCwgY29tbWl0X3RpbWUsCisJCQkJICAgIDEwMDAqamlmZmllc190b191c2VjcygxKSk7CisKKwkJaWYgKHRyYW5zX3RpbWUgPCBjb21taXRfdGltZSkgeworCQkJa3RpbWVfdCBleHBpcmVzID0ga3RpbWVfYWRkX25zKGt0aW1lX2dldCgpLAorCQkJCQkJICAgICAgIGNvbW1pdF90aW1lKTsKKwkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJCXNjaGVkdWxlX2hydGltZW91dCgmZXhwaXJlcywgSFJUSU1FUl9NT0RFX0FCUyk7CisJCX0KIAl9CiAKIAljdXJyZW50LT5qb3VybmFsX2luZm8gPSBOVUxMOwpkaWZmIC0tZ2l0IGEvZnMvamJkMi9jaGVja3BvaW50LmMgYi9mcy9qYmQyL2NoZWNrcG9pbnQuYwppbmRleCA5NDk3NzE4Li4xNzE1OWNhIDEwMDY0NAotLS0gYS9mcy9qYmQyL2NoZWNrcG9pbnQuYworKysgYi9mcy9qYmQyL2NoZWNrcG9pbnQuYwpAQCAtMjQ5LDE2ICsyNDksMTQgQEAKIAlyZXR1cm4gcmV0OwogfQogCi0jZGVmaW5lIE5SX0JBVENICTY0Ci0KIHN0YXRpYyB2b2lkCi1fX2ZsdXNoX2JhdGNoKGpvdXJuYWxfdCAqam91cm5hbCwgc3RydWN0IGJ1ZmZlcl9oZWFkICoqYmhzLCBpbnQgKmJhdGNoX2NvdW50KQorX19mbHVzaF9iYXRjaChqb3VybmFsX3QgKmpvdXJuYWwsIGludCAqYmF0Y2hfY291bnQpCiB7CiAJaW50IGk7CiAKLQlsbF9yd19ibG9jayhTV1JJVEUsICpiYXRjaF9jb3VudCwgYmhzKTsKKwlsbF9yd19ibG9jayhTV1JJVEUsICpiYXRjaF9jb3VudCwgam91cm5hbC0+al9jaGtwdF9iaHMpOwogCWZvciAoaSA9IDA7IGkgPCAqYmF0Y2hfY291bnQ7IGkrKykgewotCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gYmhzW2ldOworCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gam91cm5hbC0+al9jaGtwdF9iaHNbaV07CiAJCWNsZWFyX2J1ZmZlcl9qd3JpdGUoYmgpOwogCQlCVUZGRVJfVFJBQ0UoYmgsICJicmVsc2UiKTsKIAkJX19icmVsc2UoYmgpOwpAQCAtMjc3LDggKzI3NSw3IEBACiAgKiBDYWxsZWQgdW5kZXIgamJkX2xvY2tfYmhfc3RhdGUoamgyYmgoamgpKSwgYW5kIGRyb3BzIGl0CiAgKi8KIHN0YXRpYyBpbnQgX19wcm9jZXNzX2J1ZmZlcihqb3VybmFsX3QgKmpvdXJuYWwsIHN0cnVjdCBqb3VybmFsX2hlYWQgKmpoLAotCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICoqYmhzLCBpbnQgKmJhdGNoX2NvdW50LAotCQkJdHJhbnNhY3Rpb25fdCAqdHJhbnNhY3Rpb24pCisJCQkgICAgaW50ICpiYXRjaF9jb3VudCwgdHJhbnNhY3Rpb25fdCAqdHJhbnNhY3Rpb24pCiB7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IGpoMmJoKGpoKTsKIAlpbnQgcmV0ID0gMDsKQEAgLTMyNSwxNCArMzIyLDE0IEBACiAJCWdldF9iaChiaCk7CiAJCUpfQVNTRVJUX0JIKGJoLCAhYnVmZmVyX2p3cml0ZShiaCkpOwogCQlzZXRfYnVmZmVyX2p3cml0ZShiaCk7Ci0JCWJoc1sqYmF0Y2hfY291bnRdID0gYmg7CisJCWpvdXJuYWwtPmpfY2hrcHRfYmhzWypiYXRjaF9jb3VudF0gPSBiaDsKIAkJX19idWZmZXJfcmVsaW5rX2lvKGpoKTsKIAkJamJkX3VubG9ja19iaF9zdGF0ZShiaCk7CiAJCXRyYW5zYWN0aW9uLT50X2NocF9zdGF0cy5jc193cml0dGVuKys7CiAJCSgqYmF0Y2hfY291bnQpKys7Ci0JCWlmICgqYmF0Y2hfY291bnQgPT0gTlJfQkFUQ0gpIHsKKwkJaWYgKCpiYXRjaF9jb3VudCA9PSBKQkQyX05SX0JBVENIKSB7CiAJCQlzcGluX3VubG9jaygmam91cm5hbC0+al9saXN0X2xvY2spOwotCQkJX19mbHVzaF9iYXRjaChqb3VybmFsLCBiaHMsIGJhdGNoX2NvdW50KTsKKwkJCV9fZmx1c2hfYmF0Y2goam91cm5hbCwgYmF0Y2hfY291bnQpOwogCQkJcmV0ID0gMTsKIAkJfQogCX0KQEAgLTM4OCw3ICszODUsNiBAQAogCWlmIChqb3VybmFsLT5qX2NoZWNrcG9pbnRfdHJhbnNhY3Rpb25zID09IHRyYW5zYWN0aW9uICYmCiAJCQl0cmFuc2FjdGlvbi0+dF90aWQgPT0gdGhpc190aWQpIHsKIAkJaW50IGJhdGNoX2NvdW50ID0gMDsKLQkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaHNbTlJfQkFUQ0hdOwogCQlzdHJ1Y3Qgam91cm5hbF9oZWFkICpqaDsKIAkJaW50IHJldHJ5ID0gMCwgZXJyOwogCkBAIC00MDIsNyArMzk4LDcgQEAKIAkJCQlyZXRyeSA9IDE7CiAJCQkJYnJlYWs7CiAJCQl9Ci0JCQlyZXRyeSA9IF9fcHJvY2Vzc19idWZmZXIoam91cm5hbCwgamgsIGJocywgJmJhdGNoX2NvdW50LAorCQkJcmV0cnkgPSBfX3Byb2Nlc3NfYnVmZmVyKGpvdXJuYWwsIGpoLCAmYmF0Y2hfY291bnQsCiAJCQkJCQkgdHJhbnNhY3Rpb24pOwogCQkJaWYgKHJldHJ5IDwgMCAmJiAhcmVzdWx0KQogCQkJCXJlc3VsdCA9IHJldHJ5OwpAQCAtNDE5LDcgKzQxNSw3IEBACiAJCQkJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfbGlzdF9sb2NrKTsKIAkJCQlyZXRyeSA9IDE7CiAJCQl9Ci0JCQlfX2ZsdXNoX2JhdGNoKGpvdXJuYWwsIGJocywgJmJhdGNoX2NvdW50KTsKKwkJCV9fZmx1c2hfYmF0Y2goam91cm5hbCwgJmJhdGNoX2NvdW50KTsKIAkJfQogCiAJCWlmIChyZXRyeSkgewpAQCAtNjg2LDYgKzY4Miw3IEBACiAJICAgc2FmZWx5IHJlbW92ZSB0aGlzIHRyYW5zYWN0aW9uIGZyb20gdGhlIGxvZyAqLwogCiAJX19qYmQyX2pvdXJuYWxfZHJvcF90cmFuc2FjdGlvbihqb3VybmFsLCB0cmFuc2FjdGlvbik7CisJa2ZyZWUodHJhbnNhY3Rpb24pOwogCiAJLyogSnVzdCBpbiBjYXNlIGFueWJvZHkgd2FzIHdhaXRpbmcgZm9yIG1vcmUgdHJhbnNhY3Rpb25zIHRvIGJlCiAgICAgICAgICAgIGNoZWNrcG9pbnRlZC4uLiAqLwpAQCAtNzYwLDUgKzc1Nyw0IEBACiAJSl9BU1NFUlQoam91cm5hbC0+al9ydW5uaW5nX3RyYW5zYWN0aW9uICE9IHRyYW5zYWN0aW9uKTsKIAogCWpiZF9kZWJ1ZygxLCAiRHJvcHBpbmcgdHJhbnNhY3Rpb24gJWQsIGFsbCBkb25lXG4iLCB0cmFuc2FjdGlvbi0+dF90aWQpOwotCWtmcmVlKHRyYW5zYWN0aW9uKTsKIH0KZGlmZiAtLWdpdCBhL2ZzL2piZDIvY29tbWl0LmMgYi9mcy9qYmQyL2NvbW1pdC5jCmluZGV4IGViYzY2N2IuLjYyODA0ZTUgMTAwNjQ0Ci0tLSBhL2ZzL2piZDIvY29tbWl0LmMKKysrIGIvZnMvamJkMi9jb21taXQuYwpAQCAtMjUsNiArMjUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2NyYzMyLmg+CiAjaW5jbHVkZSA8bGludXgvd3JpdGViYWNrLmg+CiAjaW5jbHVkZSA8bGludXgvYmFja2luZy1kZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9iaW8uaD4KIAogLyoKICAqIERlZmF1bHQgSU8gZW5kIGhhbmRsZXIgZm9yIHRlbXBvcmFyeSBCSl9JTyBidWZmZXJfaGVhZHMuCkBAIC0xMzcsNyArMTM4LDcgQEAKIAkJc2V0X2J1ZmZlcl9vcmRlcmVkKGJoKTsKIAkJYmFycmllcl9kb25lID0gMTsKIAl9Ci0JcmV0ID0gc3VibWl0X2JoKFdSSVRFLCBiaCk7CisJcmV0ID0gc3VibWl0X2JoKFdSSVRFX1NZTkMsIGJoKTsKIAlpZiAoYmFycmllcl9kb25lKQogCQljbGVhcl9idWZmZXJfb3JkZXJlZChiaCk7CiAKQEAgLTE1OCw3ICsxNTksNyBAQAogCQlsb2NrX2J1ZmZlcihiaCk7CiAJCXNldF9idWZmZXJfdXB0b2RhdGUoYmgpOwogCQljbGVhcl9idWZmZXJfZGlydHkoYmgpOwotCQlyZXQgPSBzdWJtaXRfYmgoV1JJVEUsIGJoKTsKKwkJcmV0ID0gc3VibWl0X2JoKFdSSVRFX1NZTkMsIGJoKTsKIAl9CiAJKmNiaCA9IGJoOwogCXJldHVybiByZXQ7CkBAIC0xNjgsMTIgKzE2OSwzNCBAQAogICogVGhpcyBmdW5jdGlvbiBhbG9uZyB3aXRoIGpvdXJuYWxfc3VibWl0X2NvbW1pdF9yZWNvcmQKICAqIGFsbG93cyB0byB3cml0ZSB0aGUgY29tbWl0IHJlY29yZCBhc3luY2hyb25vdXNseS4KICAqLwotc3RhdGljIGludCBqb3VybmFsX3dhaXRfb25fY29tbWl0X3JlY29yZChzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQorc3RhdGljIGludCBqb3VybmFsX3dhaXRfb25fY29tbWl0X3JlY29yZChqb3VybmFsX3QgKmpvdXJuYWwsCisJCQkJCSBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQogewogCWludCByZXQgPSAwOwogCityZXRyeToKIAljbGVhcl9idWZmZXJfZGlydHkoYmgpOwogCXdhaXRfb25fYnVmZmVyKGJoKTsKKwlpZiAoYnVmZmVyX2VvcG5vdHN1cHAoYmgpICYmIChqb3VybmFsLT5qX2ZsYWdzICYgSkJEMl9CQVJSSUVSKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCSAgICAgICAiSkJEMjogd2FpdF9vbl9jb21taXRfcmVjb3JkOiBzeW5jIGZhaWxlZCBvbiAlcyAtICIKKwkJICAgICAgICJkaXNhYmxpbmcgYmFycmllcnNcbiIsIGpvdXJuYWwtPmpfZGV2bmFtZSk7CisJCXNwaW5fbG9jaygmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKKwkJam91cm5hbC0+al9mbGFncyAmPSB+SkJEMl9CQVJSSUVSOworCQlzcGluX3VubG9jaygmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKKworCQlsb2NrX2J1ZmZlcihiaCk7CisJCWNsZWFyX2J1ZmZlcl9kaXJ0eShiaCk7CisJCXNldF9idWZmZXJfdXB0b2RhdGUoYmgpOworCQliaC0+Yl9lbmRfaW8gPSBqb3VybmFsX2VuZF9idWZmZXJfaW9fc3luYzsKKworCQlyZXQgPSBzdWJtaXRfYmgoV1JJVEVfU1lOQywgYmgpOworCQlpZiAocmV0KSB7CisJCQl1bmxvY2tfYnVmZmVyKGJoKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwkJZ290byByZXRyeTsKKwl9CiAKIAlpZiAodW5saWtlbHkoIWJ1ZmZlcl91cHRvZGF0ZShiaCkpKQogCQlyZXQgPSAtRUlPOwpAQCAtMzMyLDEzICszNTUsMTUgQEAKIAlpbnQgZmxhZ3M7CiAJaW50IGVycjsKIAl1bnNpZ25lZCBsb25nIGxvbmcgYmxvY2tucjsKKwlrdGltZV90IHN0YXJ0X3RpbWU7CisJdTY0IGNvbW1pdF90aW1lOwogCWNoYXIgKnRhZ3AgPSBOVUxMOwogCWpvdXJuYWxfaGVhZGVyX3QgKmhlYWRlcjsKIAlqb3VybmFsX2Jsb2NrX3RhZ190ICp0YWcgPSBOVUxMOwogCWludCBzcGFjZV9sZWZ0ID0gMDsKIAlpbnQgZmlyc3RfdGFnID0gMDsKIAlpbnQgdGFnX2ZsYWc7Ci0JaW50IGk7CisJaW50IGksIHRvX2ZyZWUgPSAwOwogCWludCB0YWdfYnl0ZXMgPSBqb3VybmFsX3RhZ19ieXRlcyhqb3VybmFsKTsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmNiaCA9IE5VTEw7IC8qIEZvciB0cmFuc2FjdGlvbmFsIGNoZWNrc3VtcyAqLwogCV9fdTMyIGNyYzMyX3N1bSA9IH4wOwpAQCAtNDU4LDYgKzQ4Myw3IEBACiAJY29tbWl0X3RyYW5zYWN0aW9uLT50X3N0YXRlID0gVF9GTFVTSDsKIAlqb3VybmFsLT5qX2NvbW1pdHRpbmdfdHJhbnNhY3Rpb24gPSBjb21taXRfdHJhbnNhY3Rpb247CiAJam91cm5hbC0+al9ydW5uaW5nX3RyYW5zYWN0aW9uID0gTlVMTDsKKwlzdGFydF90aW1lID0ga3RpbWVfZ2V0KCk7CiAJY29tbWl0X3RyYW5zYWN0aW9uLT50X2xvZ19zdGFydCA9IGpvdXJuYWwtPmpfaGVhZDsKIAl3YWtlX3VwKCZqb3VybmFsLT5qX3dhaXRfdHJhbnNhY3Rpb25fbG9ja2VkKTsKIAlzcGluX3VubG9jaygmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKQEAgLTUwOSw2ICs1MzUsMTAgQEAKIAkJaWYgKGlzX2pvdXJuYWxfYWJvcnRlZChqb3VybmFsKSkgewogCQkJY2xlYXJfYnVmZmVyX2piZGRpcnR5KGpoMmJoKGpoKSk7CiAJCQlKQlVGRkVSX1RSQUNFKGpoLCAiam91cm5hbCBpcyBhYm9ydGluZzogcmVmaWxlIik7CisJCQlqYmQyX2J1ZmZlcl9hYm9ydF90cmlnZ2VyKGpoLAorCQkJCQkJICBqaC0+Yl9mcm96ZW5fZGF0YSA/CisJCQkJCQkgIGpoLT5iX2Zyb3plbl90cmlnZ2VycyA6CisJCQkJCQkgIGpoLT5iX3RyaWdnZXJzKTsKIAkJCWpiZDJfam91cm5hbF9yZWZpbGVfYnVmZmVyKGpvdXJuYWwsIGpoKTsKIAkJCS8qIElmIHRoYXQgd2FzIHRoZSBsYXN0IG9uZSwgd2UgbmVlZCB0byBjbGVhbiB1cAogCQkJICogYW55IGRlc2NyaXB0b3IgYnVmZmVycyB3aGljaCBtYXkgaGF2ZSBiZWVuCkBAIC03OTksNyArODI5LDcgQEAKIAkJCV9famJkMl9qb3VybmFsX2Fib3J0X2hhcmQoam91cm5hbCk7CiAJfQogCWlmICghZXJyICYmICFpc19qb3VybmFsX2Fib3J0ZWQoam91cm5hbCkpCi0JCWVyciA9IGpvdXJuYWxfd2FpdF9vbl9jb21taXRfcmVjb3JkKGNiaCk7CisJCWVyciA9IGpvdXJuYWxfd2FpdF9vbl9jb21taXRfcmVjb3JkKGpvdXJuYWwsIGNiaCk7CiAKIAlpZiAoZXJyKQogCQlqYmQyX2pvdXJuYWxfYWJvcnQoam91cm5hbCwgZXJyKTsKQEAgLTg0NCw2ICs4NzQsOSBAQAogCQkgKiBkYXRhLgogCQkgKgogCQkgKiBPdGhlcndpc2UsIHdlIGNhbiBqdXN0IHRocm93IGF3YXkgdGhlIGZyb3plbiBkYXRhIG5vdy4KKwkJICoKKwkJICogV2UgYWxzbyBrbm93IHRoYXQgdGhlIGZyb3plbiBkYXRhIGhhcyBhbHJlYWR5IGZpcmVkCisJCSAqIGl0cyB0cmlnZ2VycyBpZiB0aGV5IGV4aXN0LCBzbyB3ZSBjYW4gY2xlYXIgdGhhdCB0b28uCiAJCSAqLwogCQlpZiAoamgtPmJfY29tbWl0dGVkX2RhdGEpIHsKIAkJCWpiZDJfZnJlZShqaC0+Yl9jb21taXR0ZWRfZGF0YSwgYmgtPmJfc2l6ZSk7CkBAIC04NTEsMTAgKzg4NCwxMiBAQAogCQkJaWYgKGpoLT5iX2Zyb3plbl9kYXRhKSB7CiAJCQkJamgtPmJfY29tbWl0dGVkX2RhdGEgPSBqaC0+Yl9mcm96ZW5fZGF0YTsKIAkJCQlqaC0+Yl9mcm96ZW5fZGF0YSA9IE5VTEw7CisJCQkJamgtPmJfZnJvemVuX3RyaWdnZXJzID0gTlVMTDsKIAkJCX0KIAkJfSBlbHNlIGlmIChqaC0+Yl9mcm96ZW5fZGF0YSkgewogCQkJamJkMl9mcmVlKGpoLT5iX2Zyb3plbl9kYXRhLCBiaC0+Yl9zaXplKTsKIAkJCWpoLT5iX2Zyb3plbl9kYXRhID0gTlVMTDsKKwkJCWpoLT5iX2Zyb3plbl90cmlnZ2VycyA9IE5VTEw7CiAJCX0KIAogCQlzcGluX2xvY2soJmpvdXJuYWwtPmpfbGlzdF9sb2NrKTsKQEAgLTk3MiwxNCArMTAwNywyMyBAQAogCUpfQVNTRVJUKGNvbW1pdF90cmFuc2FjdGlvbiA9PSBqb3VybmFsLT5qX2NvbW1pdHRpbmdfdHJhbnNhY3Rpb24pOwogCWpvdXJuYWwtPmpfY29tbWl0X3NlcXVlbmNlID0gY29tbWl0X3RyYW5zYWN0aW9uLT50X3RpZDsKIAlqb3VybmFsLT5qX2NvbW1pdHRpbmdfdHJhbnNhY3Rpb24gPSBOVUxMOwotCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX3N0YXRlX2xvY2spOworCWNvbW1pdF90aW1lID0ga3RpbWVfdG9fbnMoa3RpbWVfc3ViKGt0aW1lX2dldCgpLCBzdGFydF90aW1lKSk7CiAKLQlpZiAoam91cm5hbC0+al9jb21taXRfY2FsbGJhY2spCi0JCWpvdXJuYWwtPmpfY29tbWl0X2NhbGxiYWNrKGpvdXJuYWwsIGNvbW1pdF90cmFuc2FjdGlvbik7CisJLyoKKwkgKiB3ZWlnaHQgdGhlIGNvbW1pdCB0aW1lIGhpZ2hlciB0aGFuIHRoZSBhdmVyYWdlIHRpbWUgc28gd2UgZG9uJ3QKKwkgKiByZWFjdCB0b28gc3Ryb25nbHkgdG8gdmFzdCBjaGFuZ2VzIGluIHRoZSBjb21taXQgdGltZQorCSAqLworCWlmIChsaWtlbHkoam91cm5hbC0+al9hdmVyYWdlX2NvbW1pdF90aW1lKSkKKwkJam91cm5hbC0+al9hdmVyYWdlX2NvbW1pdF90aW1lID0gKGNvbW1pdF90aW1lICsKKwkJCQlqb3VybmFsLT5qX2F2ZXJhZ2VfY29tbWl0X3RpbWUqMykgLyA0OworCWVsc2UKKwkJam91cm5hbC0+al9hdmVyYWdlX2NvbW1pdF90aW1lID0gY29tbWl0X3RpbWU7CisJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfc3RhdGVfbG9jayk7CiAKIAlpZiAoY29tbWl0X3RyYW5zYWN0aW9uLT50X2NoZWNrcG9pbnRfbGlzdCA9PSBOVUxMICYmCiAJICAgIGNvbW1pdF90cmFuc2FjdGlvbi0+dF9jaGVja3BvaW50X2lvX2xpc3QgPT0gTlVMTCkgewogCQlfX2piZDJfam91cm5hbF9kcm9wX3RyYW5zYWN0aW9uKGpvdXJuYWwsIGNvbW1pdF90cmFuc2FjdGlvbik7CisJCXRvX2ZyZWUgPSAxOwogCX0gZWxzZSB7CiAJCWlmIChqb3VybmFsLT5qX2NoZWNrcG9pbnRfdHJhbnNhY3Rpb25zID09IE5VTEwpIHsKIAkJCWpvdXJuYWwtPmpfY2hlY2twb2ludF90cmFuc2FjdGlvbnMgPSBjb21taXRfdHJhbnNhY3Rpb247CkBAIC05OTgsMTEgKzEwNDIsMTYgQEAKIAl9CiAJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfbGlzdF9sb2NrKTsKIAorCWlmIChqb3VybmFsLT5qX2NvbW1pdF9jYWxsYmFjaykKKwkJam91cm5hbC0+al9jb21taXRfY2FsbGJhY2soam91cm5hbCwgY29tbWl0X3RyYW5zYWN0aW9uKTsKKwogCXRyYWNlX21hcmsoamJkMl9lbmRfY29tbWl0LCAiZGV2ICVzIHRyYW5zYWN0aW9uICVkIGhlYWQgJWQiLAotCQkgICBqb3VybmFsLT5qX2Rldm5hbWUsIGpvdXJuYWwtPmpfY29tbWl0X3NlcXVlbmNlLAorCQkgICBqb3VybmFsLT5qX2Rldm5hbWUsIGNvbW1pdF90cmFuc2FjdGlvbi0+dF90aWQsCiAJCSAgIGpvdXJuYWwtPmpfdGFpbF9zZXF1ZW5jZSk7CiAJamJkX2RlYnVnKDEsICJKQkQ6IGNvbW1pdCAlZCBjb21wbGV0ZSwgaGVhZCAlZFxuIiwKIAkJICBqb3VybmFsLT5qX2NvbW1pdF9zZXF1ZW5jZSwgam91cm5hbC0+al90YWlsX3NlcXVlbmNlKTsKKwlpZiAodG9fZnJlZSkKKwkJa2ZyZWUoY29tbWl0X3RyYW5zYWN0aW9uKTsKIAogCXdha2VfdXAoJmpvdXJuYWwtPmpfd2FpdF9kb25lX2NvbW1pdCk7CiB9CmRpZmYgLS1naXQgYS9mcy9qYmQyL2pvdXJuYWwuYyBiL2ZzL2piZDIvam91cm5hbC5jCmluZGV4IGU3MGQ2NTcuLjU2Njc1MzAgMTAwNjQ0Ci0tLSBhL2ZzL2piZDIvam91cm5hbC5jCisrKyBiL2ZzL2piZDIvam91cm5hbC5jCkBAIC00MCw2ICs0MCw3IEBACiAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisjaW5jbHVkZSA8YXNtL2RpdjY0Lmg+CiAKIEVYUE9SVF9TWU1CT0woamJkMl9qb3VybmFsX3N0YXJ0KTsKIEVYUE9SVF9TWU1CT0woamJkMl9qb3VybmFsX3Jlc3RhcnQpOwpAQCAtNTAsNiArNTEsNyBAQAogRVhQT1JUX1NZTUJPTChqYmQyX2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2Vzcyk7CiBFWFBPUlRfU1lNQk9MKGpiZDJfam91cm5hbF9nZXRfY3JlYXRlX2FjY2Vzcyk7CiBFWFBPUlRfU1lNQk9MKGpiZDJfam91cm5hbF9nZXRfdW5kb19hY2Nlc3MpOworRVhQT1JUX1NZTUJPTChqYmQyX2pvdXJuYWxfc2V0X3RyaWdnZXJzKTsKIEVYUE9SVF9TWU1CT0woamJkMl9qb3VybmFsX2RpcnR5X21ldGFkYXRhKTsKIEVYUE9SVF9TWU1CT0woamJkMl9qb3VybmFsX3JlbGVhc2VfYnVmZmVyKTsKIEVYUE9SVF9TWU1CT0woamJkMl9qb3VybmFsX2ZvcmdldCk7CkBAIC02NSw3ICs2Nyw2IEBACiBFWFBPUlRfU1lNQk9MKGpiZDJfam91cm5hbF9jaGVja191c2VkX2ZlYXR1cmVzKTsKIEVYUE9SVF9TWU1CT0woamJkMl9qb3VybmFsX2NoZWNrX2F2YWlsYWJsZV9mZWF0dXJlcyk7CiBFWFBPUlRfU1lNQk9MKGpiZDJfam91cm5hbF9zZXRfZmVhdHVyZXMpOwotRVhQT1JUX1NZTUJPTChqYmQyX2pvdXJuYWxfY3JlYXRlKTsKIEVYUE9SVF9TWU1CT0woamJkMl9qb3VybmFsX2xvYWQpOwogRVhQT1JUX1NZTUJPTChqYmQyX2pvdXJuYWxfZGVzdHJveSk7CiBFWFBPUlRfU1lNQk9MKGpiZDJfam91cm5hbF9hYm9ydCk7CkBAIC0xMzEsOCArMTMyLDkgQEAKIAlqb3VybmFsLT5qX3Rhc2sgPSBjdXJyZW50OwogCXdha2VfdXAoJmpvdXJuYWwtPmpfd2FpdF9kb25lX2NvbW1pdCk7CiAKLQlwcmludGsoS0VSTl9JTkZPICJram91cm5hbGQyIHN0YXJ0aW5nLiAgQ29tbWl0IGludGVydmFsICVsZCBzZWNvbmRzXG4iLAotCQkJam91cm5hbC0+al9jb21taXRfaW50ZXJ2YWwgLyBIWik7CisJcHJpbnRrKEtFUk5fSU5GTyAia2pvdXJuYWxkMiBzdGFydGluZzogcGlkICVkLCBkZXYgJXMsICIKKwkgICAgICAgImNvbW1pdCBpbnRlcnZhbCAlbGQgc2Vjb25kc1xuIiwgY3VycmVudC0+cGlkLAorCSAgICAgICBqb3VybmFsLT5qX2Rldm5hbWUsIGpvdXJuYWwtPmpfY29tbWl0X2ludGVydmFsIC8gSFopOwogCiAJLyoKIAkgKiBBbmQgbm93LCB3YWl0IGZvcmV2ZXIgZm9yIGNvbW1pdCB3YWtldXAgZXZlbnRzLgpAQCAtMjkwLDYgKzI5Miw3IEBACiAJc3RydWN0IHBhZ2UgKm5ld19wYWdlOwogCXVuc2lnbmVkIGludCBuZXdfb2Zmc2V0OwogCXN0cnVjdCBidWZmZXJfaGVhZCAqYmhfaW4gPSBqaDJiaChqaF9pbik7CisJc3RydWN0IGpiZDJfYnVmZmVyX3RyaWdnZXJfdHlwZSAqdHJpZ2dlcnM7CiAKIAkvKgogCSAqIFRoZSBidWZmZXIgcmVhbGx5IHNob3VsZG4ndCBiZSBsb2NrZWQ6IG9ubHkgdGhlIGN1cnJlbnQgY29tbWl0dGluZwpAQCAtMzE0LDEzICszMTcsMjMgQEAKIAkJZG9uZV9jb3B5X291dCA9IDE7CiAJCW5ld19wYWdlID0gdmlydF90b19wYWdlKGpoX2luLT5iX2Zyb3plbl9kYXRhKTsKIAkJbmV3X29mZnNldCA9IG9mZnNldF9pbl9wYWdlKGpoX2luLT5iX2Zyb3plbl9kYXRhKTsKKwkJdHJpZ2dlcnMgPSBqaF9pbi0+Yl9mcm96ZW5fdHJpZ2dlcnM7CiAJfSBlbHNlIHsKIAkJbmV3X3BhZ2UgPSBqaDJiaChqaF9pbiktPmJfcGFnZTsKIAkJbmV3X29mZnNldCA9IG9mZnNldF9pbl9wYWdlKGpoMmJoKGpoX2luKS0+Yl9kYXRhKTsKKwkJdHJpZ2dlcnMgPSBqaF9pbi0+Yl90cmlnZ2VyczsKIAl9CiAKIAltYXBwZWRfZGF0YSA9IGttYXBfYXRvbWljKG5ld19wYWdlLCBLTV9VU0VSMCk7CiAJLyoKKwkgKiBGaXJlIGFueSBjb21taXQgdHJpZ2dlci4gIERvIHRoaXMgYmVmb3JlIGNoZWNraW5nIGZvciBlc2NhcGluZywKKwkgKiBhcyB0aGUgdHJpZ2dlciBtYXkgbW9kaWZ5IHRoZSBtYWdpYyBvZmZzZXQuICBJZiBhIGNvcHktb3V0CisJICogaGFwcGVucyBhZnRlcndhcmRzLCBpdCB3aWxsIGhhdmUgdGhlIGNvcnJlY3QgZGF0YSBpbiB0aGUgYnVmZmVyLgorCSAqLworCWpiZDJfYnVmZmVyX2NvbW1pdF90cmlnZ2VyKGpoX2luLCBtYXBwZWRfZGF0YSArIG5ld19vZmZzZXQsCisJCQkJICAgdHJpZ2dlcnMpOworCisJLyoKIAkgKiBDaGVjayBmb3IgZXNjYXBpbmcKIAkgKi8KIAlpZiAoKigoX19iZTMyICopKG1hcHBlZF9kYXRhICsgbmV3X29mZnNldCkpID09CkBAIC0zNTIsNiArMzY1LDEzIEBACiAJCW5ld19wYWdlID0gdmlydF90b19wYWdlKHRtcCk7CiAJCW5ld19vZmZzZXQgPSBvZmZzZXRfaW5fcGFnZSh0bXApOwogCQlkb25lX2NvcHlfb3V0ID0gMTsKKworCQkvKgorCQkgKiBUaGlzIGlzbid0IHN0cmljdGx5IG5lY2Vzc2FyeSwgYXMgd2UncmUgdXNpbmcgZnJvemVuCisJCSAqIGRhdGEgZm9yIHRoZSBlc2NhcGluZywgYnV0IGl0IGtlZXBzIGNvbnNpc3RlbmN5IHdpdGgKKwkJICogYl9mcm96ZW5fZGF0YSB1c2FnZS4KKwkJICovCisJCWpoX2luLT5iX2Zyb3plbl90cmlnZ2VycyA9IGpoX2luLT5iX3RyaWdnZXJzOwogCX0KIAogCS8qCkBAIC02MzEsNiArNjUxLDggQEAKIAkJcmV0dXJuIE5VTEw7CiAKIAliaCA9IF9fZ2V0YmxrKGpvdXJuYWwtPmpfZGV2LCBibG9ja25yLCBqb3VybmFsLT5qX2Jsb2Nrc2l6ZSk7CisJaWYgKCFiaCkKKwkJcmV0dXJuIE5VTEw7CiAJbG9ja19idWZmZXIoYmgpOwogCW1lbXNldChiaC0+Yl9kYXRhLCAwLCBqb3VybmFsLT5qX2Jsb2Nrc2l6ZSk7CiAJc2V0X2J1ZmZlcl91cHRvZGF0ZShiaCk7CkBAIC04MjQsNiArODQ2LDggQEAKIAkgICAgamlmZmllc190b19tc2VjcyhzLT5zdGF0cy0+dS5ydW4ucnNfZmx1c2hpbmcgLyBzLT5zdGF0cy0+dHNfdGlkKSk7CiAJc2VxX3ByaW50ZihzZXEsICIgICV1bXMgbG9nZ2luZyB0cmFuc2FjdGlvblxuIiwKIAkgICAgamlmZmllc190b19tc2VjcyhzLT5zdGF0cy0+dS5ydW4ucnNfbG9nZ2luZyAvIHMtPnN0YXRzLT50c190aWQpKTsKKwlzZXFfcHJpbnRmKHNlcSwgIiAgJWx1dXMgYXZlcmFnZSB0cmFuc2FjdGlvbiBjb21taXQgdGltZVxuIiwKKwkJICAgZG9fZGl2KHMtPmpvdXJuYWwtPmpfYXZlcmFnZV9jb21taXRfdGltZSwgMTAwMCkpOwogCXNlcV9wcmludGYoc2VxLCAiICAlbHUgaGFuZGxlcyBwZXIgdHJhbnNhY3Rpb25cbiIsCiAJICAgIHMtPnN0YXRzLT51LnJ1bi5yc19oYW5kbGVfY291bnQgLyBzLT5zdGF0cy0+dHNfdGlkKTsKIAlzZXFfcHJpbnRmKHNlcSwgIiAgJWx1IGJsb2NrcyBwZXIgdHJhbnNhY3Rpb25cbiIsCkBAIC05NjEsNiArOTg1LDggQEAKIAlzcGluX2xvY2tfaW5pdCgmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKIAogCWpvdXJuYWwtPmpfY29tbWl0X2ludGVydmFsID0gKEhaICogSkJEMl9ERUZBVUxUX01BWF9DT01NSVRfQUdFKTsKKwlqb3VybmFsLT5qX21pbl9iYXRjaF90aW1lID0gMDsKKwlqb3VybmFsLT5qX21heF9iYXRjaF90aW1lID0gMTUwMDA7IC8qIDE1bXMgKi8KIAogCS8qIFRoZSBqb3VybmFsIGlzIG1hcmtlZCBmb3IgZXJyb3IgdW50aWwgd2Ugc3VjY2VlZCB3aXRoIHJlY292ZXJ5ISAqLwogCWpvdXJuYWwtPmpfZmxhZ3MgPSBKQkQyX0FCT1JUOwpAQCAtMTAxNiwxNSArMTA0MiwxNCBAQAogCiAJLyogam91cm5hbCBkZXNjcmlwdG9yIGNhbiBzdG9yZSB1cCB0byBuIGJsb2NrcyAtYnp6eiAqLwogCWpvdXJuYWwtPmpfYmxvY2tzaXplID0gYmxvY2tzaXplOworCWpiZDJfc3RhdHNfcHJvY19pbml0KGpvdXJuYWwpOwogCW4gPSBqb3VybmFsLT5qX2Jsb2Nrc2l6ZSAvIHNpemVvZihqb3VybmFsX2Jsb2NrX3RhZ190KTsKIAlqb3VybmFsLT5qX3didWZzaXplID0gbjsKIAlqb3VybmFsLT5qX3didWYgPSBrbWFsbG9jKG4gKiBzaXplb2Yoc3RydWN0IGJ1ZmZlcl9oZWFkKiksIEdGUF9LRVJORUwpOwogCWlmICgham91cm5hbC0+al93YnVmKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiJXM6IENhbnQgYWxsb2NhdGUgYmhzIGZvciBjb21taXQgdGhyZWFkXG4iLAogCQkJX19mdW5jX18pOwotCQlrZnJlZShqb3VybmFsKTsKLQkJam91cm5hbCA9IE5VTEw7Ci0JCWdvdG8gb3V0OworCQlnb3RvIG91dF9lcnI7CiAJfQogCWpvdXJuYWwtPmpfZGV2ID0gYmRldjsKIAlqb3VybmFsLT5qX2ZzX2RldiA9IGZzX2RldjsKQEAgLTEwMzQsMTQgKzEwNTksMjIgQEAKIAlwID0gam91cm5hbC0+al9kZXZuYW1lOwogCXdoaWxlICgocCA9IHN0cmNocihwLCAnLycpKSkKIAkJKnAgPSAnISc7Ci0JamJkMl9zdGF0c19wcm9jX2luaXQoam91cm5hbCk7CiAKIAliaCA9IF9fZ2V0YmxrKGpvdXJuYWwtPmpfZGV2LCBzdGFydCwgam91cm5hbC0+al9ibG9ja3NpemUpOwotCUpfQVNTRVJUKGJoICE9IE5VTEwpOworCWlmICghYmgpIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCSAgICAgICAiJXM6IENhbm5vdCBnZXQgYnVmZmVyIGZvciBqb3VybmFsIHN1cGVyYmxvY2tcbiIsCisJCSAgICAgICBfX2Z1bmNfXyk7CisJCWdvdG8gb3V0X2VycjsKKwl9CiAJam91cm5hbC0+al9zYl9idWZmZXIgPSBiaDsKIAlqb3VybmFsLT5qX3N1cGVyYmxvY2sgPSAoam91cm5hbF9zdXBlcmJsb2NrX3QgKiliaC0+Yl9kYXRhOwotb3V0OgorCiAJcmV0dXJuIGpvdXJuYWw7CitvdXRfZXJyOgorCWpiZDJfc3RhdHNfcHJvY19leGl0KGpvdXJuYWwpOworCWtmcmVlKGpvdXJuYWwpOworCXJldHVybiBOVUxMOwogfQogCiAvKioKQEAgLTEwODksOSArMTEyMiw3IEBACiAJaWYgKCFqb3VybmFsLT5qX3didWYpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogQ2FudCBhbGxvY2F0ZSBiaHMgZm9yIGNvbW1pdCB0aHJlYWRcbiIsCiAJCQlfX2Z1bmNfXyk7Ci0JCWpiZDJfc3RhdHNfcHJvY19leGl0KGpvdXJuYWwpOwotCQlrZnJlZShqb3VybmFsKTsKLQkJcmV0dXJuIE5VTEw7CisJCWdvdG8gb3V0X2VycjsKIAl9CiAKIAllcnIgPSBqYmQyX2pvdXJuYWxfYm1hcChqb3VybmFsLCAwLCAmYmxvY2tucik7CkBAIC0xMDk5LDE3ICsxMTMwLDI0IEBACiAJaWYgKGVycikgewogCQlwcmludGsoS0VSTl9FUlIgIiVzOiBDYW5ubm90IGxvY2F0ZSBqb3VybmFsIHN1cGVyYmxvY2tcbiIsCiAJCSAgICAgICBfX2Z1bmNfXyk7Ci0JCWpiZDJfc3RhdHNfcHJvY19leGl0KGpvdXJuYWwpOwotCQlrZnJlZShqb3VybmFsKTsKLQkJcmV0dXJuIE5VTEw7CisJCWdvdG8gb3V0X2VycjsKIAl9CiAKIAliaCA9IF9fZ2V0YmxrKGpvdXJuYWwtPmpfZGV2LCBibG9ja25yLCBqb3VybmFsLT5qX2Jsb2Nrc2l6ZSk7Ci0JSl9BU1NFUlQoYmggIT0gTlVMTCk7CisJaWYgKCFiaCkgeworCQlwcmludGsoS0VSTl9FUlIKKwkJICAgICAgICIlczogQ2Fubm90IGdldCBidWZmZXIgZm9yIGpvdXJuYWwgc3VwZXJibG9ja1xuIiwKKwkJICAgICAgIF9fZnVuY19fKTsKKwkJZ290byBvdXRfZXJyOworCX0KIAlqb3VybmFsLT5qX3NiX2J1ZmZlciA9IGJoOwogCWpvdXJuYWwtPmpfc3VwZXJibG9jayA9IChqb3VybmFsX3N1cGVyYmxvY2tfdCAqKWJoLT5iX2RhdGE7CiAKIAlyZXR1cm4gam91cm5hbDsKK291dF9lcnI6CisJamJkMl9zdGF0c19wcm9jX2V4aXQoam91cm5hbCk7CisJa2ZyZWUoam91cm5hbCk7CisJcmV0dXJuIE5VTEw7CiB9CiAKIC8qCkBAIC0xMTU4LDc3ICsxMTk2LDYgQEAKIH0KIAogLyoqCi0gKiBpbnQgamJkMl9qb3VybmFsX2NyZWF0ZSgpIC0gSW5pdGlhbGlzZSB0aGUgbmV3IGpvdXJuYWwgZmlsZQotICogQGpvdXJuYWw6IEpvdXJuYWwgdG8gY3JlYXRlLiBUaGlzIHN0cnVjdHVyZSBtdXN0IGhhdmUgYmVlbiBpbml0aWFsaXNlZAotICoKLSAqIEdpdmVuIGEgam91cm5hbF90IHN0cnVjdHVyZSB3aGljaCB0ZWxscyB1cyB3aGljaCBkaXNrIGJsb2NrcyB3ZSBjYW4KLSAqIHVzZSwgY3JlYXRlIGEgbmV3IGpvdXJuYWwgc3VwZXJibG9jayBhbmQgaW5pdGlhbGlzZSBhbGwgb2YgdGhlCi0gKiBqb3VybmFsIGZpZWxkcyBmcm9tIHNjcmF0Y2guCi0gKiovCi1pbnQgamJkMl9qb3VybmFsX2NyZWF0ZShqb3VybmFsX3QgKmpvdXJuYWwpCi17Ci0JdW5zaWduZWQgbG9uZyBsb25nIGJsb2NrbnI7Ci0Jc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKLQlqb3VybmFsX3N1cGVyYmxvY2tfdCAqc2I7Ci0JaW50IGksIGVycjsKLQotCWlmIChqb3VybmFsLT5qX21heGxlbiA8IEpCRDJfTUlOX0pPVVJOQUxfQkxPQ0tTKSB7Ci0JCXByaW50ayAoS0VSTl9FUlIgIkpvdXJuYWwgbGVuZ3RoICglZCBibG9ja3MpIHRvbyBzaG9ydC5cbiIsCi0JCQlqb3VybmFsLT5qX21heGxlbik7Ci0JCWpvdXJuYWxfZmFpbF9zdXBlcmJsb2NrKGpvdXJuYWwpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpZiAoam91cm5hbC0+al9pbm9kZSA9PSBOVUxMKSB7Ci0JCS8qCi0JCSAqIFdlIGRvbid0IGtub3cgd2hhdCBibG9jayB0byBzdGFydCBhdCEKLQkJICovCi0JCXByaW50ayhLRVJOX0VNRVJHCi0JCSAgICAgICAiJXM6IGNyZWF0aW9uIG9mIGpvdXJuYWwgb24gZXh0ZXJuYWwgZGV2aWNlIVxuIiwKLQkJICAgICAgIF9fZnVuY19fKTsKLQkJQlVHKCk7Ci0JfQotCi0JLyogWmVybyBvdXQgdGhlIGVudGlyZSBqb3VybmFsIG9uIGRpc2suICBXZSBjYW5ub3QgYWZmb3JkIHRvCi0JICAgaGF2ZSBhbnkgYmxvY2tzIG9uIGRpc2sgYmVnaW5uaW5nIHdpdGggSkJEMl9NQUdJQ19OVU1CRVIuICovCi0JamJkX2RlYnVnKDEsICJKQkQ6IFplcm9pbmcgb3V0IGpvdXJuYWwgYmxvY2tzLi4uXG4iKTsKLQlmb3IgKGkgPSAwOyBpIDwgam91cm5hbC0+al9tYXhsZW47IGkrKykgewotCQllcnIgPSBqYmQyX2pvdXJuYWxfYm1hcChqb3VybmFsLCBpLCAmYmxvY2tucik7Ci0JCWlmIChlcnIpCi0JCQlyZXR1cm4gZXJyOwotCQliaCA9IF9fZ2V0YmxrKGpvdXJuYWwtPmpfZGV2LCBibG9ja25yLCBqb3VybmFsLT5qX2Jsb2Nrc2l6ZSk7Ci0JCWxvY2tfYnVmZmVyKGJoKTsKLQkJbWVtc2V0IChiaC0+Yl9kYXRhLCAwLCBqb3VybmFsLT5qX2Jsb2Nrc2l6ZSk7Ci0JCUJVRkZFUl9UUkFDRShiaCwgIm1hcmtpbmcgZGlydHkiKTsKLQkJbWFya19idWZmZXJfZGlydHkoYmgpOwotCQlCVUZGRVJfVFJBQ0UoYmgsICJtYXJraW5nIHVwdG9kYXRlIik7Ci0JCXNldF9idWZmZXJfdXB0b2RhdGUoYmgpOwotCQl1bmxvY2tfYnVmZmVyKGJoKTsKLQkJX19icmVsc2UoYmgpOwotCX0KLQotCXN5bmNfYmxvY2tkZXYoam91cm5hbC0+al9kZXYpOwotCWpiZF9kZWJ1ZygxLCAiSkJEOiBqb3VybmFsIGNsZWFyZWQuXG4iKTsKLQotCS8qIE9LLCBmaWxsIGluIHRoZSBpbml0aWFsIHN0YXRpYyBmaWVsZHMgaW4gdGhlIG5ldyBzdXBlcmJsb2NrICovCi0Jc2IgPSBqb3VybmFsLT5qX3N1cGVyYmxvY2s7Ci0KLQlzYi0+c19oZWFkZXIuaF9tYWdpYwkgPSBjcHVfdG9fYmUzMihKQkQyX01BR0lDX05VTUJFUik7Ci0Jc2ItPnNfaGVhZGVyLmhfYmxvY2t0eXBlID0gY3B1X3RvX2JlMzIoSkJEMl9TVVBFUkJMT0NLX1YyKTsKLQotCXNiLT5zX2Jsb2Nrc2l6ZQk9IGNwdV90b19iZTMyKGpvdXJuYWwtPmpfYmxvY2tzaXplKTsKLQlzYi0+c19tYXhsZW4JPSBjcHVfdG9fYmUzMihqb3VybmFsLT5qX21heGxlbik7Ci0Jc2ItPnNfZmlyc3QJPSBjcHVfdG9fYmUzMigxKTsKLQotCWpvdXJuYWwtPmpfdHJhbnNhY3Rpb25fc2VxdWVuY2UgPSAxOwotCi0Jam91cm5hbC0+al9mbGFncyAmPSB+SkJEMl9BQk9SVDsKLQlqb3VybmFsLT5qX2Zvcm1hdF92ZXJzaW9uID0gMjsKLQotCXJldHVybiBqb3VybmFsX3Jlc2V0KGpvdXJuYWwpOwotfQotCi0vKioKICAqIHZvaWQgamJkMl9qb3VybmFsX3VwZGF0ZV9zdXBlcmJsb2NrKCkgLSBVcGRhdGUgam91cm5hbCBzYiBvbiBkaXNrLgogICogQGpvdXJuYWw6IFRoZSBqb3VybmFsIHRvIHVwZGF0ZS4KICAqIEB3YWl0OiBTZXQgdG8gJzAnIGlmIHlvdSBkb24ndCB3YW50IHRvIHdhaXQgZm9yIElPIGNvbXBsZXRpb24uCkBAIC0xNDcyLDcgKzE0MzksOSBAQAogCXNwaW5fbG9jaygmam91cm5hbC0+al9saXN0X2xvY2spOwogCXdoaWxlIChqb3VybmFsLT5qX2NoZWNrcG9pbnRfdHJhbnNhY3Rpb25zICE9IE5VTEwpIHsKIAkJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfbGlzdF9sb2NrKTsKKwkJbXV0ZXhfbG9jaygmam91cm5hbC0+al9jaGVja3BvaW50X211dGV4KTsKIAkJamJkMl9sb2dfZG9fY2hlY2twb2ludChqb3VybmFsKTsKKwkJbXV0ZXhfdW5sb2NrKCZqb3VybmFsLT5qX2NoZWNrcG9pbnRfbXV0ZXgpOwogCQlzcGluX2xvY2soJmpvdXJuYWwtPmpfbGlzdF9sb2NrKTsKIAl9CiAKZGlmZiAtLWdpdCBhL2ZzL2piZDIvdHJhbnNhY3Rpb24uYyBiL2ZzL2piZDIvdHJhbnNhY3Rpb24uYwppbmRleCAzOWI3ODA1Li40NmI0ZTM0IDEwMDY0NAotLS0gYS9mcy9qYmQyL3RyYW5zYWN0aW9uLmMKKysrIGIvZnMvamJkMi90cmFuc2FjdGlvbi5jCkBAIC0yNSw2ICsyNSw3IEBACiAjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9ocnRpbWVyLmg+CiAKIHN0YXRpYyB2b2lkIF9famJkMl9qb3VybmFsX3RlbXBfdW5saW5rX2J1ZmZlcihzdHJ1Y3Qgam91cm5hbF9oZWFkICpqaCk7CiAKQEAgLTQ4LDYgKzQ5LDcgQEAKIHsKIAl0cmFuc2FjdGlvbi0+dF9qb3VybmFsID0gam91cm5hbDsKIAl0cmFuc2FjdGlvbi0+dF9zdGF0ZSA9IFRfUlVOTklORzsKKwl0cmFuc2FjdGlvbi0+dF9zdGFydF90aW1lID0ga3RpbWVfZ2V0KCk7CiAJdHJhbnNhY3Rpb24tPnRfdGlkID0gam91cm5hbC0+al90cmFuc2FjdGlvbl9zZXF1ZW5jZSsrOwogCXRyYW5zYWN0aW9uLT50X2V4cGlyZXMgPSBqaWZmaWVzICsgam91cm5hbC0+al9jb21taXRfaW50ZXJ2YWw7CiAJc3Bpbl9sb2NrX2luaXQoJnRyYW5zYWN0aW9uLT50X2hhbmRsZV9sb2NrKTsKQEAgLTc0MSw2ICs3NDMsMTIgQEAKIAkJc291cmNlID0ga21hcF9hdG9taWMocGFnZSwgS01fVVNFUjApOwogCQltZW1jcHkoamgtPmJfZnJvemVuX2RhdGEsIHNvdXJjZStvZmZzZXQsIGpoMmJoKGpoKS0+Yl9zaXplKTsKIAkJa3VubWFwX2F0b21pYyhzb3VyY2UsIEtNX1VTRVIwKTsKKworCQkvKgorCQkgKiBOb3cgdGhhdCB0aGUgZnJvemVuIGRhdGEgaXMgc2F2ZWQgb2ZmLCB3ZSBuZWVkIHRvIHN0b3JlCisJCSAqIGFueSBtYXRjaGluZyB0cmlnZ2Vycy4KKwkJICovCisJCWpoLT5iX2Zyb3plbl90cmlnZ2VycyA9IGpoLT5iX3RyaWdnZXJzOwogCX0KIAlqYmRfdW5sb2NrX2JoX3N0YXRlKGJoKTsKIApAQCAtOTQ0LDYgKzk1Miw0NyBAQAogfQogCiAvKioKKyAqIHZvaWQgamJkMl9qb3VybmFsX3NldF90cmlnZ2VycygpIC0gQWRkIHRyaWdnZXJzIGZvciBjb21taXQgd3JpdGVvdXQKKyAqIEBiaDogYnVmZmVyIHRvIHRyaWdnZXIgb24KKyAqIEB0eXBlOiBzdHJ1Y3QgamJkMl9idWZmZXJfdHJpZ2dlcl90eXBlIGNvbnRhaW5pbmcgdGhlIHRyaWdnZXIocykuCisgKgorICogU2V0IGFueSB0cmlnZ2VycyBvbiB0aGlzIGpvdXJuYWxfaGVhZC4gIFRoaXMgaXMgYWx3YXlzIHNhZmUsIGJlY2F1c2UKKyAqIHRyaWdnZXJzIGZvciBhIGNvbW1pdHRpbmcgYnVmZmVyIHdpbGwgYmUgc2F2ZWQgb2ZmLCBhbmQgdHJpZ2dlcnMgZm9yCisgKiBhIHJ1bm5pbmcgdHJhbnNhY3Rpb24gd2lsbCBtYXRjaCB0aGUgYnVmZmVyIGluIHRoYXQgdHJhbnNhY3Rpb24uCisgKgorICogQ2FsbCB3aXRoIE5VTEwgdG8gY2xlYXIgdGhlIHRyaWdnZXJzLgorICovCit2b2lkIGpiZDJfam91cm5hbF9zZXRfdHJpZ2dlcnMoc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwKKwkJCSAgICAgICBzdHJ1Y3QgamJkMl9idWZmZXJfdHJpZ2dlcl90eXBlICp0eXBlKQoreworCXN0cnVjdCBqb3VybmFsX2hlYWQgKmpoID0gYmgyamgoYmgpOworCisJamgtPmJfdHJpZ2dlcnMgPSB0eXBlOworfQorCit2b2lkIGpiZDJfYnVmZmVyX2NvbW1pdF90cmlnZ2VyKHN0cnVjdCBqb3VybmFsX2hlYWQgKmpoLCB2b2lkICptYXBwZWRfZGF0YSwKKwkJCQlzdHJ1Y3QgamJkMl9idWZmZXJfdHJpZ2dlcl90eXBlICp0cmlnZ2VycykKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gamgyYmgoamgpOworCisJaWYgKCF0cmlnZ2VycyB8fCAhdHJpZ2dlcnMtPnRfY29tbWl0KQorCQlyZXR1cm47CisKKwl0cmlnZ2Vycy0+dF9jb21taXQodHJpZ2dlcnMsIGJoLCBtYXBwZWRfZGF0YSwgYmgtPmJfc2l6ZSk7Cit9CisKK3ZvaWQgamJkMl9idWZmZXJfYWJvcnRfdHJpZ2dlcihzdHJ1Y3Qgam91cm5hbF9oZWFkICpqaCwKKwkJCSAgICAgICBzdHJ1Y3QgamJkMl9idWZmZXJfdHJpZ2dlcl90eXBlICp0cmlnZ2VycykKK3sKKwlpZiAoIXRyaWdnZXJzIHx8ICF0cmlnZ2Vycy0+dF9hYm9ydCkKKwkJcmV0dXJuOworCisJdHJpZ2dlcnMtPnRfYWJvcnQodHJpZ2dlcnMsIGpoMmJoKGpoKSk7Cit9CisKKworCisvKioKICAqIGludCBqYmQyX2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoKSAtICBtYXJrIGEgYnVmZmVyIGFzIGNvbnRhaW5pbmcgZGlydHkgbWV0YWRhdGEKICAqIEBoYW5kbGU6IHRyYW5zYWN0aW9uIHRvIGFkZCBidWZmZXIgdG8uCiAgKiBAYmg6IGJ1ZmZlciB0byBtYXJrCkBAIC0xMTkzLDcgKzEyNDIsNyBAQAogewogCXRyYW5zYWN0aW9uX3QgKnRyYW5zYWN0aW9uID0gaGFuZGxlLT5oX3RyYW5zYWN0aW9uOwogCWpvdXJuYWxfdCAqam91cm5hbCA9IHRyYW5zYWN0aW9uLT50X2pvdXJuYWw7Ci0JaW50IG9sZF9oYW5kbGVfY291bnQsIGVycjsKKwlpbnQgZXJyOwogCXBpZF90IHBpZDsKIAogCUpfQVNTRVJUKGpvdXJuYWxfY3VycmVudF9oYW5kbGUoKSA9PSBoYW5kbGUpOwpAQCAtMTIxNiwyNCArMTI2NSw1NCBAQAogCS8qCiAJICogSW1wbGVtZW50IHN5bmNocm9ub3VzIHRyYW5zYWN0aW9uIGJhdGNoaW5nLiAgSWYgdGhlIGhhbmRsZQogCSAqIHdhcyBzeW5jaHJvbm91cywgZG9uJ3QgZm9yY2UgYSBjb21taXQgaW1tZWRpYXRlbHkuICBMZXQncwotCSAqIHlpZWxkIGFuZCBsZXQgYW5vdGhlciB0aHJlYWQgcGlnZ3liYWNrIG9udG8gdGhpcyB0cmFuc2FjdGlvbi4KLQkgKiBLZWVwIGRvaW5nIHRoYXQgd2hpbGUgbmV3IHRocmVhZHMgY29udGludWUgdG8gYXJyaXZlLgotCSAqIEl0IGRvZXNuJ3QgY29zdCBtdWNoIC0gd2UncmUgYWJvdXQgdG8gcnVuIGEgY29tbWl0IGFuZCBzbGVlcAotCSAqIG9uIElPIGFueXdheS4gIFNwZWVkcyB1cCBtYW55LXRocmVhZGVkLCBtYW55LWRpciBvcGVyYXRpb25zCi0JICogYnkgMzB4IG9yIG1vcmUuLi4KKwkgKiB5aWVsZCBhbmQgbGV0IGFub3RoZXIgdGhyZWFkIHBpZ2d5YmFjayBvbnRvIHRoaXMKKwkgKiB0cmFuc2FjdGlvbi4gIEtlZXAgZG9pbmcgdGhhdCB3aGlsZSBuZXcgdGhyZWFkcyBjb250aW51ZSB0bworCSAqIGFycml2ZS4gIEl0IGRvZXNuJ3QgY29zdCBtdWNoIC0gd2UncmUgYWJvdXQgdG8gcnVuIGEgY29tbWl0CisJICogYW5kIHNsZWVwIG9uIElPIGFueXdheS4gIFNwZWVkcyB1cCBtYW55LXRocmVhZGVkLCBtYW55LWRpcgorCSAqIG9wZXJhdGlvbnMgYnkgMzB4IG9yIG1vcmUuLi4KIAkgKgotCSAqIEJ1dCBkb24ndCBkbyB0aGlzIGlmIHRoaXMgcHJvY2VzcyB3YXMgdGhlIG1vc3QgcmVjZW50IG9uZSB0bwotCSAqIHBlcmZvcm0gYSBzeW5jaHJvbm91cyB3cml0ZS4gIFdlIGRvIHRoaXMgdG8gZGV0ZWN0IHRoZSBjYXNlIHdoZXJlIGEKLQkgKiBzaW5nbGUgcHJvY2VzcyBpcyBkb2luZyBhIHN0cmVhbSBvZiBzeW5jIHdyaXRlcy4gIE5vIHBvaW50IGluIHdhaXRpbmcKLQkgKiBmb3Igam9pbmVycyBpbiB0aGF0IGNhc2UuCisJICogV2UgdHJ5IGFuZCBvcHRpbWl6ZSB0aGUgc2xlZXAgdGltZSBhZ2FpbnN0IHdoYXQgdGhlCisJICogdW5kZXJseWluZyBkaXNrIGNhbiBkbywgaW5zdGVhZCBvZiBoYXZpbmcgYSBzdGF0aWMgc2xlZXAKKwkgKiB0aW1lLiAgVGhpcyBpcyB1c2VmdWwgZm9yIHRoZSBjYXNlIHdoZXJlIG91ciBzdG9yYWdlIGlzIHNvCisJICogZmFzdCB0aGF0IGl0IGlzIG1vcmUgb3B0aW1hbCB0byBnbyBhaGVhZCBhbmQgZm9yY2UgYSBmbHVzaAorCSAqIGFuZCB3YWl0IGZvciB0aGUgdHJhbnNhY3Rpb24gdG8gYmUgY29tbWl0dGVkIHRoYW4gaXQgaXMgdG8KKwkgKiB3YWl0IGZvciBhbiBhcmJpdHJhcnkgYW1vdW50IG9mIHRpbWUgZm9yIG5ldyB3cml0ZXJzIHRvCisJICogam9pbiB0aGUgdHJhbnNhY3Rpb24uICBXZSBhY2hpZXZlIHRoaXMgYnkgbWVhc3VyaW5nIGhvdworCSAqIGxvbmcgaXQgdGFrZXMgdG8gY29tbWl0IGEgdHJhbnNhY3Rpb24sIGFuZCBjb21wYXJlIGl0IHdpdGgKKwkgKiBob3cgbG9uZyB0aGlzIHRyYW5zYWN0aW9uIGhhcyBiZWVuIHJ1bm5pbmcsIGFuZCBpZiBydW4gdGltZQorCSAqIDwgY29tbWl0IHRpbWUgdGhlbiB3ZSBzbGVlcCBmb3IgdGhlIGRlbHRhIGFuZCBjb21taXQuICBUaGlzCisJICogZ3JlYXRseSBoZWxwcyBzdXBlciBmYXN0IGRpc2tzIHRoYXQgd291bGQgc2VlIHNsb3dkb3ducyBhcworCSAqIG1vcmUgdGhyZWFkcyBzdGFydGVkIGRvaW5nIGZzeW5jcy4KKwkgKgorCSAqIEJ1dCBkb24ndCBkbyB0aGlzIGlmIHRoaXMgcHJvY2VzcyB3YXMgdGhlIG1vc3QgcmVjZW50IG9uZQorCSAqIHRvIHBlcmZvcm0gYSBzeW5jaHJvbm91cyB3cml0ZS4gIFdlIGRvIHRoaXMgdG8gZGV0ZWN0IHRoZQorCSAqIGNhc2Ugd2hlcmUgYSBzaW5nbGUgcHJvY2VzcyBpcyBkb2luZyBhIHN0cmVhbSBvZiBzeW5jCisJICogd3JpdGVzLiAgTm8gcG9pbnQgaW4gd2FpdGluZyBmb3Igam9pbmVycyBpbiB0aGF0IGNhc2UuCiAJICovCiAJcGlkID0gY3VycmVudC0+cGlkOwogCWlmIChoYW5kbGUtPmhfc3luYyAmJiBqb3VybmFsLT5qX2xhc3Rfc3luY193cml0ZXIgIT0gcGlkKSB7CisJCXU2NCBjb21taXRfdGltZSwgdHJhbnNfdGltZTsKKwogCQlqb3VybmFsLT5qX2xhc3Rfc3luY193cml0ZXIgPSBwaWQ7Ci0JCWRvIHsKLQkJCW9sZF9oYW5kbGVfY291bnQgPSB0cmFuc2FjdGlvbi0+dF9oYW5kbGVfY291bnQ7Ci0JCQlzY2hlZHVsZV90aW1lb3V0X3VuaW50ZXJydXB0aWJsZSgxKTsKLQkJfSB3aGlsZSAob2xkX2hhbmRsZV9jb3VudCAhPSB0cmFuc2FjdGlvbi0+dF9oYW5kbGVfY291bnQpOworCisJCXNwaW5fbG9jaygmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKKwkJY29tbWl0X3RpbWUgPSBqb3VybmFsLT5qX2F2ZXJhZ2VfY29tbWl0X3RpbWU7CisJCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX3N0YXRlX2xvY2spOworCisJCXRyYW5zX3RpbWUgPSBrdGltZV90b19ucyhrdGltZV9zdWIoa3RpbWVfZ2V0KCksCisJCQkJCQkgICB0cmFuc2FjdGlvbi0+dF9zdGFydF90aW1lKSk7CisKKwkJY29tbWl0X3RpbWUgPSBtYXhfdCh1NjQsIGNvbW1pdF90aW1lLAorCQkJCSAgICAxMDAwKmpvdXJuYWwtPmpfbWluX2JhdGNoX3RpbWUpOworCQljb21taXRfdGltZSA9IG1pbl90KHU2NCwgY29tbWl0X3RpbWUsCisJCQkJICAgIDEwMDAqam91cm5hbC0+al9tYXhfYmF0Y2hfdGltZSk7CisKKwkJaWYgKHRyYW5zX3RpbWUgPCBjb21taXRfdGltZSkgeworCQkJa3RpbWVfdCBleHBpcmVzID0ga3RpbWVfYWRkX25zKGt0aW1lX2dldCgpLAorCQkJCQkJICAgICAgIGNvbW1pdF90aW1lKTsKKwkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJCXNjaGVkdWxlX2hydGltZW91dCgmZXhwaXJlcywgSFJUSU1FUl9NT0RFX0FCUyk7CisJCX0KIAl9CiAKIAljdXJyZW50LT5qb3VybmFsX2luZm8gPSBOVUxMOwpkaWZmIC0tZ2l0IGEvZnMvamZzL2pmc19pbWFwLmMgYi9mcy9qZnMvamZzX2ltYXAuYwppbmRleCBkNjM2M2Q4Li4wZjk0MzgxIDEwMDY0NAotLS0gYS9mcy9qZnMvamZzX2ltYXAuYworKysgYi9mcy9qZnMvamZzX2ltYXAuYwpAQCAtNTgsOSArNTgsOSBAQAogCiAvKgogICogX19tYXJrX2lub2RlX2RpcnR5IGV4cGVjdHMgaW5vZGVzIHRvIGJlIGhhc2hlZC4gIFNpbmNlIHdlIGRvbid0IHdhbnQKLSAqIHNwZWNpYWwgaW5vZGVzIGluIHRoZSBmaWxlc2V0IGlub2RlIHNwYWNlLCB3ZSBoYXNoIHRoZW0gdG8gYSBkdW1teSBoZWFkCisgKiBzcGVjaWFsIGlub2RlcyBpbiB0aGUgZmlsZXNldCBpbm9kZSBzcGFjZSwgd2UgbWFrZSB0aGVtIGFwcGVhciBoYXNoZWQsCisgKiBidXQgZG8gbm90IHB1dCBvbiBhbnkgbGlzdHMuCiAgKi8KLXN0YXRpYyBITElTVF9IRUFEKGFnZ3JlZ2F0ZV9oYXNoKTsKIAogLyoKICAqIGltYXAgbG9ja3MKQEAgLTQ5Niw3ICs0OTYsMTEgQEAKIAkvKiByZWxlYXNlIHRoZSBwYWdlICovCiAJcmVsZWFzZV9tZXRhcGFnZShtcCk7CiAKLQlobGlzdF9hZGRfaGVhZCgmaXAtPmlfaGFzaCwgJmFnZ3JlZ2F0ZV9oYXNoKTsKKwkvKgorCSAqIHRoYXQgd2lsbCBsb29rIGhhc2hlZCwgYnV0IHdvbid0IGJlIG9uIGFueSBsaXN0OyBobGlzdF9kZWwoKQorCSAqIHdpbGwgd29yayBmaW5lIGFuZCByZXF1aXJlIG5vIGxvY2tpbmcuCisJICovCisJaXAtPmlfaGFzaC5wcHJldiA9ICZpcC0+aV9oYXNoLm5leHQ7CiAKIAlyZXR1cm4gKGlwKTsKIH0KZGlmZiAtLWdpdCBhL2ZzL2xpYmZzLmMgYi9mcy9saWJmcy5jCmluZGV4IGJkYWVjMTcuLjQ5YjQ0MDkgMTAwNjQ0Ci0tLSBhL2ZzL2xpYmZzLmMKKysrIGIvZnMvbGliZnMuYwpAQCAtMjMxLDcgKzIzMSw2IEBACiAJICovCiAJcm9vdC0+aV9pbm8gPSAxOwogCXJvb3QtPmlfbW9kZSA9IFNfSUZESVIgfCBTX0lSVVNSIHwgU19JV1VTUjsKLQlyb290LT5pX3VpZCA9IHJvb3QtPmlfZ2lkID0gMDsKIAlyb290LT5pX2F0aW1lID0gcm9vdC0+aV9tdGltZSA9IHJvb3QtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUU7CiAJZGVudHJ5ID0gZF9hbGxvYyhOVUxMLCAmZF9uYW1lKTsKIAlpZiAoIWRlbnRyeSkgewpAQCAtNDM2LDggKzQzNSw2IEBACiAJICovCiAJaW5vZGUtPmlfaW5vID0gMTsKIAlpbm9kZS0+aV9tb2RlID0gU19JRkRJUiB8IDA3NTU7Ci0JaW5vZGUtPmlfdWlkID0gaW5vZGUtPmlfZ2lkID0gMDsKLQlpbm9kZS0+aV9ibG9ja3MgPSAwOwogCWlub2RlLT5pX2F0aW1lID0gaW5vZGUtPmlfbXRpbWUgPSBpbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRTsKIAlpbm9kZS0+aV9vcCA9ICZzaW1wbGVfZGlyX2lub2RlX29wZXJhdGlvbnM7CiAJaW5vZGUtPmlfZm9wID0gJnNpbXBsZV9kaXJfb3BlcmF0aW9uczsKQEAgLTQ2NCw4ICs0NjEsNiBAQAogCQlpZiAoIWlub2RlKQogCQkJZ290byBvdXQ7CiAJCWlub2RlLT5pX21vZGUgPSBTX0lGUkVHIHwgZmlsZXMtPm1vZGU7Ci0JCWlub2RlLT5pX3VpZCA9IGlub2RlLT5pX2dpZCA9IDA7Ci0JCWlub2RlLT5pX2Jsb2NrcyA9IDA7CiAJCWlub2RlLT5pX2F0aW1lID0gaW5vZGUtPmlfbXRpbWUgPSBpbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRTsKIAkJaW5vZGUtPmlfZm9wID0gZmlsZXMtPm9wczsKIAkJaW5vZGUtPmlfaW5vID0gaTsKZGlmZiAtLWdpdCBhL2ZzL2xvY2tkL2NsbnRwcm9jLmMgYi9mcy9sb2NrZC9jbG50cHJvYy5jCmluZGV4IDMxNjY4YjYuLmRkNzk1NzAgMTAwNjQ0Ci0tLSBhL2ZzL2xvY2tkL2NsbnRwcm9jLmMKKysrIGIvZnMvbG9ja2QvY2xudHByb2MuYwpAQCAtMTYsNyArMTYsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9jbG50Lmg+CiAjaW5jbHVkZSA8bGludXgvc3VucnBjL3N2Yy5oPgogI2luY2x1ZGUgPGxpbnV4L2xvY2tkL2xvY2tkLmg+Ci0jaW5jbHVkZSA8bGludXgvbG9ja2Qvc21faW50ZXIuaD4KIAogI2RlZmluZSBOTE1EQkdfRkFDSUxJVFkJCU5MTURCR19DTElFTlQKICNkZWZpbmUgTkxNQ0xOVF9HUkFDRV9XQUlUCSg1KkhaKQpAQCAtNTE4LDExICs1MTcsOSBAQAogCXVuc2lnbmVkIGNoYXIgZmxfdHlwZTsKIAlpbnQgc3RhdHVzID0gLUVOT0xDSzsKIAotCWlmIChuc21fbW9uaXRvcihob3N0KSA8IDApIHsKLQkJcHJpbnRrKEtFUk5fTk9USUNFICJsb2NrZDogZmFpbGVkIHRvIG1vbml0b3IgJXNcbiIsCi0JCQkJCWhvc3QtPmhfbmFtZSk7CisJaWYgKG5zbV9tb25pdG9yKGhvc3QpIDwgMCkKIAkJZ290byBvdXQ7Ci0JfQorCiAJZmwtPmZsX2ZsYWdzIHw9IEZMX0FDQ0VTUzsKIAlzdGF0dXMgPSBkb192ZnNfbG9jayhmbCk7CiAJZmwtPmZsX2ZsYWdzID0gZmxfZmxhZ3M7CmRpZmYgLS1naXQgYS9mcy9sb2NrZC9ob3N0LmMgYi9mcy9sb2NrZC9ob3N0LmMKaW5kZXggYWJkZWJmNy4uOTlkNzM3YiAxMDA2NDQKLS0tIGEvZnMvbG9ja2QvaG9zdC5jCisrKyBiL2ZzL2xvY2tkL2hvc3QuYwpAQCAtMTUsNyArMTUsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9jbG50Lmg+CiAjaW5jbHVkZSA8bGludXgvc3VucnBjL3N2Yy5oPgogI2luY2x1ZGUgPGxpbnV4L2xvY2tkL2xvY2tkLmg+Ci0jaW5jbHVkZSA8bGludXgvbG9ja2Qvc21faW50ZXIuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogCiAjaW5jbHVkZSA8bmV0L2lwdjYuaD4KQEAgLTMyLDExICszMSw2IEBACiBzdGF0aWMgREVGSU5FX01VVEVYKG5sbV9ob3N0X211dGV4KTsKIAogc3RhdGljIHZvaWQJCQlubG1fZ2NfaG9zdHModm9pZCk7Ci1zdGF0aWMgc3RydWN0IG5zbV9oYW5kbGUJKm5zbV9maW5kKGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqc2FwLAotCQkJCQkJY29uc3Qgc2l6ZV90IHNhbGVuLAotCQkJCQkJY29uc3QgY2hhciAqaG9zdG5hbWUsCi0JCQkJCQljb25zdCBzaXplX3QgaG9zdG5hbWVfbGVuLAotCQkJCQkJY29uc3QgaW50IGNyZWF0ZSk7CiAKIHN0cnVjdCBubG1fbG9va3VwX2hvc3RfaW5mbyB7CiAJY29uc3QgaW50CQlzZXJ2ZXI7CQkvKiBzZWFyY2ggZm9yIHNlcnZlcnxjbGllbnQgKi8KQEAgLTEwNSwzMiArOTksNiBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgbmxtX2Rpc3BsYXlfYWRkcmVzcyhjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKnNhcCwKLQkJCQljaGFyICpidWYsIGNvbnN0IHNpemVfdCBsZW4pCi17Ci0JY29uc3Qgc3RydWN0IHNvY2thZGRyX2luICpzaW4gPSAoc3RydWN0IHNvY2thZGRyX2luICopc2FwOwotCWNvbnN0IHN0cnVjdCBzb2NrYWRkcl9pbjYgKnNpbjYgPSAoc3RydWN0IHNvY2thZGRyX2luNiAqKXNhcDsKLQotCXN3aXRjaCAoc2FwLT5zYV9mYW1pbHkpIHsKLQljYXNlIEFGX1VOU1BFQzoKLQkJc25wcmludGYoYnVmLCBsZW4sICJ1bnNwZWNpZmllZCIpOwotCQlicmVhazsKLQljYXNlIEFGX0lORVQ6Ci0JCXNucHJpbnRmKGJ1ZiwgbGVuLCAiJXBJNCIsICZzaW4tPnNpbl9hZGRyLnNfYWRkcik7Ci0JCWJyZWFrOwotCWNhc2UgQUZfSU5FVDY6Ci0JCWlmIChpcHY2X2FkZHJfdjRtYXBwZWQoJnNpbjYtPnNpbjZfYWRkcikpCi0JCQlzbnByaW50ZihidWYsIGxlbiwgIiVwSTQiLAotCQkJCSAmc2luNi0+c2luNl9hZGRyLnM2X2FkZHIzMlszXSk7Ci0JCWVsc2UKLQkJCXNucHJpbnRmKGJ1ZiwgbGVuLCAiJXBJNiIsICZzaW42LT5zaW42X2FkZHIpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlzbnByaW50ZihidWYsIGxlbiwgInVuc3VwcG9ydGVkIGFkZHJlc3MgZmFtaWx5Iik7Ci0JCWJyZWFrOwotCX0KLX0KLQogLyoKICAqIENvbW1vbiBob3N0IGxvb2t1cCByb3V0aW5lIGZvciBzZXJ2ZXIgJiBjbGllbnQKICAqLwpAQCAtMTkwLDggKzE1OCw4IEBACiAJCWF0b21pY19pbmMoJm5zbS0+c21fY291bnQpOwogCWVsc2UgewogCQlob3N0ID0gTlVMTDsKLQkJbnNtID0gbnNtX2ZpbmQobmktPnNhcCwgbmktPnNhbGVuLAotCQkJCW5pLT5ob3N0bmFtZSwgbmktPmhvc3RuYW1lX2xlbiwgMSk7CisJCW5zbSA9IG5zbV9nZXRfaGFuZGxlKG5pLT5zYXAsIG5pLT5zYWxlbiwKKwkJCQkJbmktPmhvc3RuYW1lLCBuaS0+aG9zdG5hbWVfbGVuKTsKIAkJaWYgKCFuc20pIHsKIAkJCWRwcmludGsoImxvY2tkOiBubG1fbG9va3VwX2hvc3QgZmFpbGVkOyAiCiAJCQkJIm5vIG5zbSBoYW5kbGVcbiIpOwpAQCAtMjA2LDYgKzE3NCw3IEBACiAJCWdvdG8gb3V0OwogCX0KIAlob3N0LT5oX25hbWUJICAgPSBuc20tPnNtX25hbWU7CisJaG9zdC0+aF9hZGRyYnVmICAgID0gbnNtLT5zbV9hZGRyYnVmOwogCW1lbWNweShubG1fYWRkcihob3N0KSwgbmktPnNhcCwgbmktPnNhbGVuKTsKIAlob3N0LT5oX2FkZHJsZW4gPSBuaS0+c2FsZW47CiAJbmxtX2NsZWFyX3BvcnQobmxtX2FkZHIoaG9zdCkpOwpAQCAtMjMyLDExICsyMDEsNiBAQAogCiAJbnJob3N0cysrOwogCi0JbmxtX2Rpc3BsYXlfYWRkcmVzcygoc3RydWN0IHNvY2thZGRyICopJmhvc3QtPmhfYWRkciwKLQkJCQlob3N0LT5oX2FkZHJidWYsIHNpemVvZihob3N0LT5oX2FkZHJidWYpKTsKLQlubG1fZGlzcGxheV9hZGRyZXNzKChzdHJ1Y3Qgc29ja2FkZHIgKikmaG9zdC0+aF9zcmNhZGRyLAotCQkJCWhvc3QtPmhfc3JjYWRkcmJ1Ziwgc2l6ZW9mKGhvc3QtPmhfc3JjYWRkcmJ1ZikpOwotCiAJZHByaW50aygibG9ja2Q6IG5sbV9sb29rdXBfaG9zdCBjcmVhdGVkIGhvc3QgJXNcbiIsCiAJCQlob3N0LT5oX25hbWUpOwogCkBAIC0yNTYsMTAgKzIyMCw4IEBACiAJQlVHX09OKCFsaXN0X2VtcHR5KCZob3N0LT5oX2xvY2tvd25lcnMpKTsKIAlCVUdfT04oYXRvbWljX3JlYWQoJmhvc3QtPmhfY291bnQpKTsKIAotCS8qCi0JICogUmVsZWFzZSBOU00gaGFuZGxlIGFuZCB1bm1vbml0b3IgaG9zdC4KLQkgKi8KIAluc21fdW5tb25pdG9yKGhvc3QpOworCW5zbV9yZWxlYXNlKGhvc3QtPmhfbnNtaGFuZGxlKTsKIAogCWNsbnQgPSBob3N0LT5oX3JwY2NsbnQ7CiAJaWYgKGNsbnQgIT0gTlVMTCkKQEAgLTM3OCw4ICszNDAsOCBAQAogewogCXN0cnVjdCBycGNfY2xudAkqY2xudDsKIAotCWRwcmludGsoImxvY2tkOiBubG1fYmluZF9ob3N0ICVzICglcyksIG15IGFkZHI9JXNcbiIsCi0JCQlob3N0LT5oX25hbWUsIGhvc3QtPmhfYWRkcmJ1ZiwgaG9zdC0+aF9zcmNhZGRyYnVmKTsKKwlkcHJpbnRrKCJsb2NrZDogbmxtX2JpbmRfaG9zdCAlcyAoJXMpXG4iLAorCQkJaG9zdC0+aF9uYW1lLCBob3N0LT5oX2FkZHJidWYpOwogCiAJLyogTG9jayBob3N0IGhhbmRsZSAqLwogCW11dGV4X2xvY2soJmhvc3QtPmhfbXV0ZXgpOwpAQCAtNDgxLDM1ICs0NDMsMjMgQEAKIAl9CiB9CiAKLS8qCi0gKiBXZSB3ZXJlIG5vdGlmaWVkIHRoYXQgdGhlIGhvc3QgaW5kaWNhdGVkIGJ5IGFkZHJlc3MgJnNpbgotICogaGFzIHJlYm9vdGVkLgotICogUmVsZWFzZSBhbGwgcmVzb3VyY2VzIGhlbGQgYnkgdGhhdCBwZWVyLgorLyoqCisgKiBubG1faG9zdF9yZWJvb3RlZCAtIFJlbGVhc2UgYWxsIHJlc291cmNlcyBoZWxkIGJ5IHJlYm9vdGVkIGhvc3QKKyAqIEBpbmZvOiBwb2ludGVyIHRvIGRlY29kZWQgcmVzdWx0cyBvZiBOTE1fU01fTk9USUZZIGNhbGwKKyAqCisgKiBXZSB3ZXJlIG5vdGlmaWVkIHRoYXQgdGhlIHNwZWNpZmllZCBob3N0IGhhcyByZWJvb3RlZC4gIFJlbGVhc2UKKyAqIGFsbCByZXNvdXJjZXMgaGVsZCBieSB0aGF0IHBlZXIuCiAgKi8KLXZvaWQgbmxtX2hvc3RfcmVib290ZWQoY29uc3Qgc3RydWN0IHNvY2thZGRyX2luICpzaW4sCi0JCQkJY29uc3QgY2hhciAqaG9zdG5hbWUsCi0JCQkJdW5zaWduZWQgaW50IGhvc3RuYW1lX2xlbiwKLQkJCQl1MzIgbmV3X3N0YXRlKQordm9pZCBubG1faG9zdF9yZWJvb3RlZChjb25zdCBzdHJ1Y3QgbmxtX3JlYm9vdCAqaW5mbykKIHsKIAlzdHJ1Y3QgaGxpc3RfaGVhZCAqY2hhaW47CiAJc3RydWN0IGhsaXN0X25vZGUgKnBvczsKIAlzdHJ1Y3QgbnNtX2hhbmRsZSAqbnNtOwogCXN0cnVjdCBubG1faG9zdAkqaG9zdDsKIAotCW5zbSA9IG5zbV9maW5kKChzdHJ1Y3Qgc29ja2FkZHIgKilzaW4sIHNpemVvZigqc2luKSwKLQkJCWhvc3RuYW1lLCBob3N0bmFtZV9sZW4sIDApOwotCWlmIChuc20gPT0gTlVMTCkgewotCQlkcHJpbnRrKCJsb2NrZDogbmV2ZXIgc2F3IHJlYm9vdGVkIHBlZXIgJyUuKnMnIGJlZm9yZVxuIiwKLQkJCQlob3N0bmFtZV9sZW4sIGhvc3RuYW1lKTsKKwluc20gPSBuc21fcmVib290X2xvb2t1cChpbmZvKTsKKwlpZiAodW5saWtlbHkobnNtID09IE5VTEwpKQogCQlyZXR1cm47Ci0JfQotCi0JZHByaW50aygibG9ja2Q6IG5sbV9ob3N0X3JlYm9vdGVkKCUuKnMsICVzKVxuIiwKLQkJCWhvc3RuYW1lX2xlbiwgaG9zdG5hbWUsIG5zbS0+c21fYWRkcmJ1Zik7Ci0KLQkvKiBXaGVuIHJlY2xhaW1pbmcgbG9ja3Mgb24gdGhpcyBwZWVyLCBtYWtlIHN1cmUgdGhhdAotCSAqIHdlIHNldCB1cCBhIG5ldyBub3RpZmljYXRpb24gKi8KLQluc20tPnNtX21vbml0b3JlZCA9IDA7CiAKIAkvKiBNYXJrIGFsbCBob3N0cyB0aWVkIHRvIHRoaXMgTlNNIHN0YXRlIGFzIGhhdmluZyByZWJvb3RlZC4KIAkgKiBXZSBydW4gdGhlIGxvb3AgcmVwZWF0ZWRseSwgYmVjYXVzZSB3ZSBkcm9wIHRoZSBob3N0IHRhYmxlCkBAIC01MjAsOCArNDcwLDggQEAKIAlmb3IgKGNoYWluID0gbmxtX2hvc3RzOyBjaGFpbiA8IG5sbV9ob3N0cyArIE5MTV9IT1NUX05SSEFTSDsgKytjaGFpbikgewogCQlobGlzdF9mb3JfZWFjaF9lbnRyeShob3N0LCBwb3MsIGNoYWluLCBoX2hhc2gpIHsKIAkJCWlmIChob3N0LT5oX25zbWhhbmRsZSA9PSBuc20KLQkJCSAmJiBob3N0LT5oX25zbXN0YXRlICE9IG5ld19zdGF0ZSkgewotCQkJCWhvc3QtPmhfbnNtc3RhdGUgPSBuZXdfc3RhdGU7CisJCQkgJiYgaG9zdC0+aF9uc21zdGF0ZSAhPSBpbmZvLT5zdGF0ZSkgeworCQkJCWhvc3QtPmhfbnNtc3RhdGUgPSBpbmZvLT5zdGF0ZTsKIAkJCQlob3N0LT5oX3N0YXRlKys7CiAKIAkJCQlubG1fZ2V0X2hvc3QoaG9zdCk7CkBAIC02MjksODkgKzU3OSwzIEBACiAKIAluZXh0X2djID0gamlmZmllcyArIE5MTV9IT1NUX0NPTExFQ1Q7CiB9Ci0KLQotLyoKLSAqIE1hbmFnZSBOU00gaGFuZGxlcwotICovCi1zdGF0aWMgTElTVF9IRUFEKG5zbV9oYW5kbGVzKTsKLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0sobnNtX2xvY2spOwotCi1zdGF0aWMgc3RydWN0IG5zbV9oYW5kbGUgKm5zbV9maW5kKGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqc2FwLAotCQkJCSAgIGNvbnN0IHNpemVfdCBzYWxlbiwKLQkJCQkgICBjb25zdCBjaGFyICpob3N0bmFtZSwKLQkJCQkgICBjb25zdCBzaXplX3QgaG9zdG5hbWVfbGVuLAotCQkJCSAgIGNvbnN0IGludCBjcmVhdGUpCi17Ci0Jc3RydWN0IG5zbV9oYW5kbGUgKm5zbSA9IE5VTEw7Ci0Jc3RydWN0IG5zbV9oYW5kbGUgKnBvczsKLQotCWlmICghc2FwKQotCQlyZXR1cm4gTlVMTDsKLQotCWlmIChob3N0bmFtZSAmJiBtZW1jaHIoaG9zdG5hbWUsICcvJywgaG9zdG5hbWVfbGVuKSAhPSBOVUxMKSB7Ci0JCWlmIChwcmludGtfcmF0ZWxpbWl0KCkpIHsKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkludmFsaWQgaG9zdG5hbWUgXCIlLipzXCIgIgotCQkJCQkgICAgImluIE5GUyBsb2NrIHJlcXVlc3RcbiIsCi0JCQkJKGludClob3N0bmFtZV9sZW4sIGhvc3RuYW1lKTsKLQkJfQotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLXJldHJ5OgotCXNwaW5fbG9jaygmbnNtX2xvY2spOwotCWxpc3RfZm9yX2VhY2hfZW50cnkocG9zLCAmbnNtX2hhbmRsZXMsIHNtX2xpbmspIHsKLQotCQlpZiAoaG9zdG5hbWUgJiYgbnNtX3VzZV9ob3N0bmFtZXMpIHsKLQkJCWlmIChzdHJsZW4ocG9zLT5zbV9uYW1lKSAhPSBob3N0bmFtZV9sZW4KLQkJCSB8fCBtZW1jbXAocG9zLT5zbV9uYW1lLCBob3N0bmFtZSwgaG9zdG5hbWVfbGVuKSkKLQkJCQljb250aW51ZTsKLQkJfSBlbHNlIGlmICghbmxtX2NtcF9hZGRyKG5zbV9hZGRyKHBvcyksIHNhcCkpCi0JCQljb250aW51ZTsKLQkJYXRvbWljX2luYygmcG9zLT5zbV9jb3VudCk7Ci0JCWtmcmVlKG5zbSk7Ci0JCW5zbSA9IHBvczsKLQkJZ290byBmb3VuZDsKLQl9Ci0JaWYgKG5zbSkgewotCQlsaXN0X2FkZCgmbnNtLT5zbV9saW5rLCAmbnNtX2hhbmRsZXMpOwotCQlnb3RvIGZvdW5kOwotCX0KLQlzcGluX3VubG9jaygmbnNtX2xvY2spOwotCi0JaWYgKCFjcmVhdGUpCi0JCXJldHVybiBOVUxMOwotCi0JbnNtID0ga3phbGxvYyhzaXplb2YoKm5zbSkgKyBob3N0bmFtZV9sZW4gKyAxLCBHRlBfS0VSTkVMKTsKLQlpZiAobnNtID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCi0JbWVtY3B5KG5zbV9hZGRyKG5zbSksIHNhcCwgc2FsZW4pOwotCW5zbS0+c21fYWRkcmxlbiA9IHNhbGVuOwotCW5zbS0+c21fbmFtZSA9IChjaGFyICopIChuc20gKyAxKTsKLQltZW1jcHkobnNtLT5zbV9uYW1lLCBob3N0bmFtZSwgaG9zdG5hbWVfbGVuKTsKLQluc20tPnNtX25hbWVbaG9zdG5hbWVfbGVuXSA9ICdcMCc7Ci0JbmxtX2Rpc3BsYXlfYWRkcmVzcygoc3RydWN0IHNvY2thZGRyICopJm5zbS0+c21fYWRkciwKLQkJCQluc20tPnNtX2FkZHJidWYsIHNpemVvZihuc20tPnNtX2FkZHJidWYpKTsKLQlhdG9taWNfc2V0KCZuc20tPnNtX2NvdW50LCAxKTsKLQlnb3RvIHJldHJ5OwotCi1mb3VuZDoKLQlzcGluX3VubG9jaygmbnNtX2xvY2spOwotCXJldHVybiBuc207Ci19Ci0KLS8qCi0gKiBSZWxlYXNlIGFuIE5TTSBoYW5kbGUKLSAqLwotdm9pZAotbnNtX3JlbGVhc2Uoc3RydWN0IG5zbV9oYW5kbGUgKm5zbSkKLXsKLQlpZiAoIW5zbSkKLQkJcmV0dXJuOwotCWlmIChhdG9taWNfZGVjX2FuZF9sb2NrKCZuc20tPnNtX2NvdW50LCAmbnNtX2xvY2spKSB7Ci0JCWxpc3RfZGVsKCZuc20tPnNtX2xpbmspOwotCQlzcGluX3VubG9jaygmbnNtX2xvY2spOwotCQlrZnJlZShuc20pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2ZzL2xvY2tkL21vbi5jIGIvZnMvbG9ja2QvbW9uLmMKaW5kZXggZmZkMzQ2MS4uNWUyYzRkNSAxMDA2NDQKLS0tIGEvZnMvbG9ja2QvbW9uLmMKKysrIGIvZnMvbG9ja2QvbW9uLmMKQEAgLTksMzUgKzksMTIzIEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC91dHNuYW1lLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgva3RpbWUuaD4KKwogI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9jbG50Lmg+CiAjaW5jbHVkZSA8bGludXgvc3VucnBjL3hwcnRzb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvc3VucnBjL3N2Yy5oPgogI2luY2x1ZGUgPGxpbnV4L2xvY2tkL2xvY2tkLmg+Ci0jaW5jbHVkZSA8bGludXgvbG9ja2Qvc21faW50ZXIuaD4KLQogCiAjZGVmaW5lIE5MTURCR19GQUNJTElUWQkJTkxNREJHX01PTklUT1IKKyNkZWZpbmUgTlNNX1BST0dSQU0JCTEwMDAyNAorI2RlZmluZSBOU01fVkVSU0lPTgkJMQogCi0jZGVmaW5lIFhEUl9BRERSQlVGX0xFTgkJKDIwKQorZW51bSB7CisJTlNNUFJPQ19OVUxMLAorCU5TTVBST0NfU1RBVCwKKwlOU01QUk9DX01PTiwKKwlOU01QUk9DX1VOTU9OLAorCU5TTVBST0NfVU5NT05fQUxMLAorCU5TTVBST0NfU0lNVV9DUkFTSCwKKwlOU01QUk9DX05PVElGWSwKK307CiAKLXN0YXRpYyBzdHJ1Y3QgcnBjX2NsbnQgKgluc21fY3JlYXRlKHZvaWQpOworc3RydWN0IG5zbV9hcmdzIHsKKwlzdHJ1Y3QgbnNtX3ByaXZhdGUJKnByaXY7CisJdTMyCQkJcHJvZzsJCS8qIFJQQyBjYWxsYmFjayBpbmZvICovCisJdTMyCQkJdmVyczsKKwl1MzIJCQlwcm9jOworCisJY2hhcgkJCSptb25fbmFtZTsKK307CisKK3N0cnVjdCBuc21fcmVzIHsKKwl1MzIJCQlzdGF0dXM7CisJdTMyCQkJc3RhdGU7Cit9OwogCiBzdGF0aWMgc3RydWN0IHJwY19wcm9ncmFtCW5zbV9wcm9ncmFtOworc3RhdGljCQkJCUxJU1RfSEVBRChuc21faGFuZGxlcyk7CitzdGF0aWMJCQkJREVGSU5FX1NQSU5MT0NLKG5zbV9sb2NrKTsKIAogLyoKICAqIExvY2FsIE5TTSBzdGF0ZQogICovCi1pbnQJCQkJbnNtX2xvY2FsX3N0YXRlOworaW50CV9fcmVhZF9tb3N0bHkJCW5zbV9sb2NhbF9zdGF0ZTsKK2ludAlfX3JlYWRfbW9zdGx5CQluc21fdXNlX2hvc3RuYW1lczsKIAotLyoKLSAqIENvbW1vbiBwcm9jZWR1cmUgZm9yIFNNX01PTi9TTV9VTk1PTiBjYWxscwotICovCi1zdGF0aWMgaW50Ci1uc21fbW9uX3VubW9uKHN0cnVjdCBuc21faGFuZGxlICpuc20sIHUzMiBwcm9jLCBzdHJ1Y3QgbnNtX3JlcyAqcmVzKQorc3RhdGljIGlubGluZSBzdHJ1Y3Qgc29ja2FkZHIgKm5zbV9hZGRyKGNvbnN0IHN0cnVjdCBuc21faGFuZGxlICpuc20pCit7CisJcmV0dXJuIChzdHJ1Y3Qgc29ja2FkZHIgKikmbnNtLT5zbV9hZGRyOworfQorCitzdGF0aWMgdm9pZCBuc21fZGlzcGxheV9pcHY0X2FkZHJlc3MoY29uc3Qgc3RydWN0IHNvY2thZGRyICpzYXAsIGNoYXIgKmJ1ZiwKKwkJCQkgICAgIGNvbnN0IHNpemVfdCBsZW4pCit7CisJY29uc3Qgc3RydWN0IHNvY2thZGRyX2luICpzaW4gPSAoc3RydWN0IHNvY2thZGRyX2luICopc2FwOworCXNucHJpbnRmKGJ1ZiwgbGVuLCAiJXBJNCIsICZzaW4tPnNpbl9hZGRyLnNfYWRkcik7Cit9CisKK3N0YXRpYyB2b2lkIG5zbV9kaXNwbGF5X2lwdjZfYWRkcmVzcyhjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKnNhcCwgY2hhciAqYnVmLAorCQkJCSAgICAgY29uc3Qgc2l6ZV90IGxlbikKK3sKKwljb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW42ICpzaW42ID0gKHN0cnVjdCBzb2NrYWRkcl9pbjYgKilzYXA7CisKKwlpZiAoaXB2Nl9hZGRyX3Y0bWFwcGVkKCZzaW42LT5zaW42X2FkZHIpKQorCQlzbnByaW50ZihidWYsIGxlbiwgIiVwSTQiLCAmc2luNi0+c2luNl9hZGRyLnM2X2FkZHIzMlszXSk7CisJZWxzZSBpZiAoc2luNi0+c2luNl9zY29wZV9pZCAhPSAwKQorCQlzbnByaW50ZihidWYsIGxlbiwgIiVwSTYlJSV1IiwgJnNpbjYtPnNpbjZfYWRkciwKKwkJCQlzaW42LT5zaW42X3Njb3BlX2lkKTsKKwllbHNlCisJCXNucHJpbnRmKGJ1ZiwgbGVuLCAiJXBJNiIsICZzaW42LT5zaW42X2FkZHIpOworfQorCitzdGF0aWMgdm9pZCBuc21fZGlzcGxheV9hZGRyZXNzKGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqc2FwLAorCQkJCWNoYXIgKmJ1ZiwgY29uc3Qgc2l6ZV90IGxlbikKK3sKKwlzd2l0Y2ggKHNhcC0+c2FfZmFtaWx5KSB7CisJY2FzZSBBRl9JTkVUOgorCQluc21fZGlzcGxheV9pcHY0X2FkZHJlc3Moc2FwLCBidWYsIGxlbik7CisJCWJyZWFrOworCWNhc2UgQUZfSU5FVDY6CisJCW5zbV9kaXNwbGF5X2lwdjZfYWRkcmVzcyhzYXAsIGJ1ZiwgbGVuKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJc25wcmludGYoYnVmLCBsZW4sICJ1bnN1cHBvcnRlZCBhZGRyZXNzIGZhbWlseSIpOworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcnBjX2NsbnQgKm5zbV9jcmVhdGUodm9pZCkKK3sKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gc2luID0geworCQkuc2luX2ZhbWlseQkJPSBBRl9JTkVULAorCQkuc2luX2FkZHIuc19hZGRyCT0gaHRvbmwoSU5BRERSX0xPT1BCQUNLKSwKKwl9OworCXN0cnVjdCBycGNfY3JlYXRlX2FyZ3MgYXJncyA9IHsKKwkJLnByb3RvY29sCQk9IFhQUlRfVFJBTlNQT1JUX1VEUCwKKwkJLmFkZHJlc3MJCT0gKHN0cnVjdCBzb2NrYWRkciAqKSZzaW4sCisJCS5hZGRyc2l6ZQkJPSBzaXplb2Yoc2luKSwKKwkJLnNlcnZlcm5hbWUJCT0gInJwYy5zdGF0ZCIsCisJCS5wcm9ncmFtCQk9ICZuc21fcHJvZ3JhbSwKKwkJLnZlcnNpb24JCT0gTlNNX1ZFUlNJT04sCisJCS5hdXRoZmxhdm9yCQk9IFJQQ19BVVRIX05VTEwsCisJfTsKKworCXJldHVybiBycGNfY3JlYXRlKCZhcmdzKTsKK30KKworc3RhdGljIGludCBuc21fbW9uX3VubW9uKHN0cnVjdCBuc21faGFuZGxlICpuc20sIHUzMiBwcm9jLCBzdHJ1Y3QgbnNtX3JlcyAqcmVzKQogewogCXN0cnVjdCBycGNfY2xudAkqY2xudDsKIAlpbnQJCXN0YXR1czsKLQlzdHJ1Y3QgbnNtX2FyZ3MJYXJnczsKKwlzdHJ1Y3QgbnNtX2FyZ3MgYXJncyA9IHsKKwkJLnByaXYJCT0gJm5zbS0+c21fcHJpdiwKKwkJLnByb2cJCT0gTkxNX1BST0dSQU0sCisJCS52ZXJzCQk9IDMsCisJCS5wcm9jCQk9IE5MTVBST0NfTlNNX05PVElGWSwKKwkJLm1vbl9uYW1lCT0gbnNtLT5zbV9tb25fbmFtZSwKKwl9OwogCXN0cnVjdCBycGNfbWVzc2FnZSBtc2cgPSB7CiAJCS5ycGNfYXJncAk9ICZhcmdzLAogCQkucnBjX3Jlc3AJPSByZXMsCkBAIC00NiwyMiArMTM0LDE4IEBACiAJY2xudCA9IG5zbV9jcmVhdGUoKTsKIAlpZiAoSVNfRVJSKGNsbnQpKSB7CiAJCXN0YXR1cyA9IFBUUl9FUlIoY2xudCk7CisJCWRwcmludGsoImxvY2tkOiBmYWlsZWQgdG8gY3JlYXRlIE5TTSB1cGNhbGwgdHJhbnNwb3J0LCAiCisJCQkJInN0YXR1cz0lZFxuIiwgc3RhdHVzKTsKIAkJZ290byBvdXQ7CiAJfQogCi0JbWVtc2V0KCZhcmdzLCAwLCBzaXplb2YoYXJncykpOwotCWFyZ3MubW9uX25hbWUgPSBuc20tPnNtX25hbWU7Ci0JYXJncy5hZGRyID0gbnNtX2FkZHJfaW4obnNtKS0+c2luX2FkZHIuc19hZGRyOwotCWFyZ3MucHJvZyA9IE5MTV9QUk9HUkFNOwotCWFyZ3MudmVycyA9IDM7Ci0JYXJncy5wcm9jID0gTkxNUFJPQ19OU01fTk9USUZZOwogCW1lbXNldChyZXMsIDAsIHNpemVvZigqcmVzKSk7CiAKIAltc2cucnBjX3Byb2MgPSAmY2xudC0+Y2xfcHJvY2luZm9bcHJvY107CiAJc3RhdHVzID0gcnBjX2NhbGxfc3luYyhjbG50LCAmbXNnLCAwKTsKIAlpZiAoc3RhdHVzIDwgMCkKLQkJcHJpbnRrKEtFUk5fREVCVUcgIm5zbV9tb25fdW5tb246IHJwYyBmYWlsZWQsIHN0YXR1cz0lZFxuIiwKLQkJCXN0YXR1cyk7CisJCWRwcmludGsoImxvY2tkOiBOU00gdXBjYWxsIFJQQyBmYWlsZWQsIHN0YXR1cz0lZFxuIiwKKwkJCQlzdGF0dXMpOwogCWVsc2UKIAkJc3RhdHVzID0gMDsKIAlycGNfc2h1dGRvd25fY2xpZW50KGNsbnQpOwpAQCAtNjksODIgKzE1MywyNzIgQEAKIAlyZXR1cm4gc3RhdHVzOwogfQogCi0vKgotICogU2V0IHVwIG1vbml0b3Jpbmcgb2YgYSByZW1vdGUgaG9zdAorLyoqCisgKiBuc21fbW9uaXRvciAtIE5vdGlmeSBhIHBlZXIgaW4gY2FzZSB3ZSByZWJvb3QKKyAqIEBob3N0OiBwb2ludGVyIHRvIG5sbV9ob3N0IG9mIHBlZXIgdG8gbm90aWZ5CisgKgorICogSWYgdGhpcyBwZWVyIGlzIG5vdCBhbHJlYWR5IG1vbml0b3JlZCwgdGhpcyBmdW5jdGlvbiBzZW5kcyBhbgorICogdXBjYWxsIHRvIHRoZSBsb2NhbCBycGMuc3RhdGQgdG8gcmVjb3JkIHRoZSBuYW1lL2FkZHJlc3Mgb2YKKyAqIHRoZSBwZWVyIHRvIG5vdGlmeSBpbiBjYXNlIHdlIHJlYm9vdC4KKyAqCisgKiBSZXR1cm5zIHplcm8gaWYgdGhlIHBlZXIgaXMgbW9uaXRvcmVkIGJ5IHRoZSBsb2NhbCBycGMuc3RhdGQ7CisgKiBvdGhlcndpc2UgYSBuZWdhdGl2ZSBlcnJubyB2YWx1ZSBpcyByZXR1cm5lZC4KICAqLwotaW50Ci1uc21fbW9uaXRvcihzdHJ1Y3QgbmxtX2hvc3QgKmhvc3QpCitpbnQgbnNtX21vbml0b3IoY29uc3Qgc3RydWN0IG5sbV9ob3N0ICpob3N0KQogewogCXN0cnVjdCBuc21faGFuZGxlICpuc20gPSBob3N0LT5oX25zbWhhbmRsZTsKIAlzdHJ1Y3QgbnNtX3JlcwlyZXM7CiAJaW50CQlzdGF0dXM7CiAKLQlkcHJpbnRrKCJsb2NrZDogbnNtX21vbml0b3IoJXMpXG4iLCBob3N0LT5oX25hbWUpOwotCUJVR19PTihuc20gPT0gTlVMTCk7CisJZHByaW50aygibG9ja2Q6IG5zbV9tb25pdG9yKCVzKVxuIiwgbnNtLT5zbV9uYW1lKTsKIAogCWlmIChuc20tPnNtX21vbml0b3JlZCkKIAkJcmV0dXJuIDA7CiAKLQlzdGF0dXMgPSBuc21fbW9uX3VubW9uKG5zbSwgU01fTU9OLCAmcmVzKTsKKwkvKgorCSAqIENob29zZSB3aGV0aGVyIHRvIHJlY29yZCB0aGUgY2FsbGVyX25hbWUgb3IgSVAgYWRkcmVzcyBvZgorCSAqIHRoaXMgcGVlciBpbiB0aGUgbG9jYWwgcnBjLnN0YXRkJ3MgZGF0YWJhc2UuCisJICovCisJbnNtLT5zbV9tb25fbmFtZSA9IG5zbV91c2VfaG9zdG5hbWVzID8gbnNtLT5zbV9uYW1lIDogbnNtLT5zbV9hZGRyYnVmOwogCi0JaWYgKHN0YXR1cyA8IDAgfHwgcmVzLnN0YXR1cyAhPSAwKQotCQlwcmludGsoS0VSTl9OT1RJQ0UgImxvY2tkOiBjYW5ub3QgbW9uaXRvciAlc1xuIiwgaG9zdC0+aF9uYW1lKTsKKwlzdGF0dXMgPSBuc21fbW9uX3VubW9uKG5zbSwgTlNNUFJPQ19NT04sICZyZXMpOworCWlmIChyZXMuc3RhdHVzICE9IDApCisJCXN0YXR1cyA9IC1FSU87CisJaWYgKHN0YXR1cyA8IDApCisJCXByaW50ayhLRVJOX05PVElDRSAibG9ja2Q6IGNhbm5vdCBtb25pdG9yICVzXG4iLCBuc20tPnNtX25hbWUpOwogCWVsc2UKIAkJbnNtLT5zbV9tb25pdG9yZWQgPSAxOwogCXJldHVybiBzdGF0dXM7CiB9CiAKLS8qCi0gKiBDZWFzZSB0byBtb25pdG9yIHJlbW90ZSBob3N0CisvKioKKyAqIG5zbV91bm1vbml0b3IgLSBVbnJlZ2lzdGVyIHBlZXIgbm90aWZpY2F0aW9uCisgKiBAaG9zdDogcG9pbnRlciB0byBubG1faG9zdCBvZiBwZWVyIHRvIHN0b3AgbW9uaXRvcmluZworICoKKyAqIElmIHRoaXMgcGVlciBpcyBtb25pdG9yZWQsIHRoaXMgZnVuY3Rpb24gc2VuZHMgYW4gdXBjYWxsIHRvCisgKiB0ZWxsIHRoZSBsb2NhbCBycGMuc3RhdGQgbm90IHRvIHNlbmQgdGhpcyBwZWVyIGEgbm90aWZpY2F0aW9uCisgKiB3aGVuIHdlIHJlYm9vdC4KICAqLwotaW50Ci1uc21fdW5tb25pdG9yKHN0cnVjdCBubG1faG9zdCAqaG9zdCkKK3ZvaWQgbnNtX3VubW9uaXRvcihjb25zdCBzdHJ1Y3QgbmxtX2hvc3QgKmhvc3QpCiB7CiAJc3RydWN0IG5zbV9oYW5kbGUgKm5zbSA9IGhvc3QtPmhfbnNtaGFuZGxlOwogCXN0cnVjdCBuc21fcmVzCXJlczsKLQlpbnQJCXN0YXR1cyA9IDA7Ci0KLQlpZiAobnNtID09IE5VTEwpCi0JCXJldHVybiAwOwotCWhvc3QtPmhfbnNtaGFuZGxlID0gTlVMTDsKKwlpbnQgc3RhdHVzOwogCiAJaWYgKGF0b21pY19yZWFkKCZuc20tPnNtX2NvdW50KSA9PSAxCiAJICYmIG5zbS0+c21fbW9uaXRvcmVkICYmICFuc20tPnNtX3N0aWNreSkgewotCQlkcHJpbnRrKCJsb2NrZDogbnNtX3VubW9uaXRvciglcylcbiIsIGhvc3QtPmhfbmFtZSk7CisJCWRwcmludGsoImxvY2tkOiBuc21fdW5tb25pdG9yKCVzKVxuIiwgbnNtLT5zbV9uYW1lKTsKIAotCQlzdGF0dXMgPSBuc21fbW9uX3VubW9uKG5zbSwgU01fVU5NT04sICZyZXMpOworCQlzdGF0dXMgPSBuc21fbW9uX3VubW9uKG5zbSwgTlNNUFJPQ19VTk1PTiwgJnJlcyk7CisJCWlmIChyZXMuc3RhdHVzICE9IDApCisJCQlzdGF0dXMgPSAtRUlPOwogCQlpZiAoc3RhdHVzIDwgMCkKIAkJCXByaW50ayhLRVJOX05PVElDRSAibG9ja2Q6IGNhbm5vdCB1bm1vbml0b3IgJXNcbiIsCi0JCQkJCWhvc3QtPmhfbmFtZSk7CisJCQkJCW5zbS0+c21fbmFtZSk7CiAJCWVsc2UKIAkJCW5zbS0+c21fbW9uaXRvcmVkID0gMDsKIAl9Ci0JbnNtX3JlbGVhc2UobnNtKTsKLQlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgc3RydWN0IG5zbV9oYW5kbGUgKm5zbV9sb29rdXBfaG9zdG5hbWUoY29uc3QgY2hhciAqaG9zdG5hbWUsCisJCQkJCSAgICAgIGNvbnN0IHNpemVfdCBsZW4pCit7CisJc3RydWN0IG5zbV9oYW5kbGUgKm5zbTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkobnNtLCAmbnNtX2hhbmRsZXMsIHNtX2xpbmspCisJCWlmIChzdHJsZW4obnNtLT5zbV9uYW1lKSA9PSBsZW4gJiYKKwkJICAgIG1lbWNtcChuc20tPnNtX25hbWUsIGhvc3RuYW1lLCBsZW4pID09IDApCisJCQlyZXR1cm4gbnNtOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgc3RydWN0IG5zbV9oYW5kbGUgKm5zbV9sb29rdXBfYWRkcihjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKnNhcCkKK3sKKwlzdHJ1Y3QgbnNtX2hhbmRsZSAqbnNtOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShuc20sICZuc21faGFuZGxlcywgc21fbGluaykKKwkJaWYgKG5sbV9jbXBfYWRkcihuc21fYWRkcihuc20pLCBzYXApKQorCQkJcmV0dXJuIG5zbTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHN0cnVjdCBuc21faGFuZGxlICpuc21fbG9va3VwX3ByaXYoY29uc3Qgc3RydWN0IG5zbV9wcml2YXRlICpwcml2KQoreworCXN0cnVjdCBuc21faGFuZGxlICpuc207CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KG5zbSwgJm5zbV9oYW5kbGVzLCBzbV9saW5rKQorCQlpZiAobWVtY21wKG5zbS0+c21fcHJpdi5kYXRhLCBwcml2LT5kYXRhLAorCQkJCQlzaXplb2YocHJpdi0+ZGF0YSkpID09IDApCisJCQlyZXR1cm4gbnNtOworCXJldHVybiBOVUxMOwogfQogCiAvKgotICogQ3JlYXRlIE5TTSBjbGllbnQgZm9yIHRoZSBsb2NhbCBob3N0CisgKiBDb25zdHJ1Y3QgYSB1bmlxdWUgY29va2llIHRvIG1hdGNoIHRoaXMgbnNtX2hhbmRsZSB0byB0aGlzIG1vbml0b3JlZAorICogaG9zdC4gIEl0IGlzIHBhc3NlZCB0byB0aGUgbG9jYWwgcnBjLnN0YXRkIHZpYSBOU01QUk9DX01PTiwgYW5kCisgKiByZXR1cm5lZCB2aWEgTkxNUFJPQ19TTV9OT1RJRlksIGluIHRoZSAicHJpdiIgZmllbGQgb2YgdGhlc2UKKyAqIHJlcXVlc3RzLgorICoKKyAqIFRoZSBOU00gcHJvdG9jb2wgcmVxdWlyZXMgdGhhdCB0aGVzZSBjb29raWVzIGJlIHVuaXF1ZSB3aGlsZSB0aGUKKyAqIHN5c3RlbSBpcyBydW5uaW5nLiAgV2UgcHJlZmVyIGEgc3Ryb25nZXIgcmVxdWlyZW1lbnQgb2YgbWFraW5nIHRoZW0KKyAqIHVuaXF1ZSBhY3Jvc3MgcmVib290cy4gIElmIHVzZXIgc3BhY2UgYnVncyBjYXVzZSBhIHN0YWxlIGNvb2tpZSB0bworICogYmUgc2VudCB0byB0aGUga2VybmVsLCBpdCBjb3VsZCBjYXVzZSB0aGUgd3JvbmcgaG9zdCB0byBsb3NlIGl0cworICogbG9jayBzdGF0ZSBpZiBjb29raWVzIHdlcmUgbm90IHVuaXF1ZSBhY3Jvc3MgcmVib290cy4KKyAqCisgKiBUaGUgY29va2llcyBhcmUgZXhwb3NlZCBvbmx5IHRvIGxvY2FsIHVzZXIgc3BhY2UgdmlhIGxvb3BiYWNrLiAgVGhleQorICogZG8gbm90IGFwcGVhciBvbiB0aGUgcGh5c2ljYWwgbmV0d29yay4gIElmIHdlIHdhbnQgZ3JlYXRlciBzZWN1cml0eQorICogZm9yIHNvbWUgcmVhc29uLCBuc21faW5pdF9wcml2YXRlKCkgY291bGQgcGVyZm9ybSBhIG9uZS13YXkgaGFzaCB0bworICogb2JzY3VyZSB0aGUgY29udGVudHMgb2YgdGhlIGNvb2tpZS4KICAqLwotc3RhdGljIHN0cnVjdCBycGNfY2xudCAqCi1uc21fY3JlYXRlKHZvaWQpCitzdGF0aWMgdm9pZCBuc21faW5pdF9wcml2YXRlKHN0cnVjdCBuc21faGFuZGxlICpuc20pCiB7Ci0Jc3RydWN0IHNvY2thZGRyX2luCXNpbiA9IHsKLQkJLnNpbl9mYW1pbHkJPSBBRl9JTkVULAotCQkuc2luX2FkZHIuc19hZGRyID0gaHRvbmwoSU5BRERSX0xPT1BCQUNLKSwKLQkJLnNpbl9wb3J0CT0gMCwKLQl9OwotCXN0cnVjdCBycGNfY3JlYXRlX2FyZ3MgYXJncyA9IHsKLQkJLnByb3RvY29sCT0gWFBSVF9UUkFOU1BPUlRfVURQLAotCQkuYWRkcmVzcwk9IChzdHJ1Y3Qgc29ja2FkZHIgKikmc2luLAotCQkuYWRkcnNpemUJPSBzaXplb2Yoc2luKSwKLQkJLnNlcnZlcm5hbWUJPSAibG9jYWxob3N0IiwKLQkJLnByb2dyYW0JPSAmbnNtX3Byb2dyYW0sCi0JCS52ZXJzaW9uCT0gU01fVkVSU0lPTiwKLQkJLmF1dGhmbGF2b3IJPSBSUENfQVVUSF9OVUxMLAotCX07CisJdTY0ICpwID0gKHU2NCAqKSZuc20tPnNtX3ByaXYuZGF0YTsKKwlzdHJ1Y3QgdGltZXNwZWMgdHM7CiAKLQlyZXR1cm4gcnBjX2NyZWF0ZSgmYXJncyk7CisJa3RpbWVfZ2V0X3RzKCZ0cyk7CisJKnArKyA9IHRpbWVzcGVjX3RvX25zKCZ0cyk7CisJKnAgPSAodW5zaWduZWQgbG9uZyluc207Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbnNtX2hhbmRsZSAqbnNtX2NyZWF0ZV9oYW5kbGUoY29uc3Qgc3RydWN0IHNvY2thZGRyICpzYXAsCisJCQkJCSAgICBjb25zdCBzaXplX3Qgc2FsZW4sCisJCQkJCSAgICBjb25zdCBjaGFyICpob3N0bmFtZSwKKwkJCQkJICAgIGNvbnN0IHNpemVfdCBob3N0bmFtZV9sZW4pCit7CisJc3RydWN0IG5zbV9oYW5kbGUgKm5ldzsKKworCW5ldyA9IGt6YWxsb2Moc2l6ZW9mKCpuZXcpICsgaG9zdG5hbWVfbGVuICsgMSwgR0ZQX0tFUk5FTCk7CisJaWYgKHVubGlrZWx5KG5ldyA9PSBOVUxMKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlhdG9taWNfc2V0KCZuZXctPnNtX2NvdW50LCAxKTsKKwluZXctPnNtX25hbWUgPSAoY2hhciAqKShuZXcgKyAxKTsKKwltZW1jcHkobnNtX2FkZHIobmV3KSwgc2FwLCBzYWxlbik7CisJbmV3LT5zbV9hZGRybGVuID0gc2FsZW47CisJbnNtX2luaXRfcHJpdmF0ZShuZXcpOworCW5zbV9kaXNwbGF5X2FkZHJlc3MoKGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqKSZuZXctPnNtX2FkZHIsCisJCQkJbmV3LT5zbV9hZGRyYnVmLCBzaXplb2YobmV3LT5zbV9hZGRyYnVmKSk7CisJbWVtY3B5KG5ldy0+c21fbmFtZSwgaG9zdG5hbWUsIGhvc3RuYW1lX2xlbik7CisJbmV3LT5zbV9uYW1lW2hvc3RuYW1lX2xlbl0gPSAnXDAnOworCisJcmV0dXJuIG5ldzsKK30KKworLyoqCisgKiBuc21fZ2V0X2hhbmRsZSAtIEZpbmQgb3IgY3JlYXRlIGEgY2FjaGVkIG5zbV9oYW5kbGUKKyAqIEBzYXA6IHBvaW50ZXIgdG8gc29ja2V0IGFkZHJlc3Mgb2YgaGFuZGxlIHRvIGZpbmQKKyAqIEBzYWxlbjogbGVuZ3RoIG9mIHNvY2tldCBhZGRyZXNzCisgKiBAaG9zdG5hbWU6IHBvaW50ZXIgdG8gQyBzdHJpbmcgY29udGFpbmluZyBob3N0bmFtZSB0byBmaW5kCisgKiBAaG9zdG5hbWVfbGVuOiBsZW5ndGggb2YgQyBzdHJpbmcKKyAqCisgKiBCZWhhdmlvciBpcyBtb2R1bGF0ZWQgYnkgdGhlIGdsb2JhbCBuc21fdXNlX2hvc3RuYW1lcyB2YXJpYWJsZS4KKyAqCisgKiBSZXR1cm5zIGEgY2FjaGVkIG5zbV9oYW5kbGUgYWZ0ZXIgYnVtcGluZyBpdHMgcmVmIGNvdW50LCBvcgorICogcmV0dXJucyBhIGZyZXNoIG5zbV9oYW5kbGUgaWYgYSBoYW5kbGUgdGhhdCBtYXRjaGVzIEBzYXAgYW5kL29yCisgKiBAaG9zdG5hbWUgY2Fubm90IGJlIGZvdW5kIGluIHRoZSBoYW5kbGUgY2FjaGUuICBSZXR1cm5zIE5VTEwgaWYKKyAqIGFuIGVycm9yIG9jY3Vycy4KKyAqLworc3RydWN0IG5zbV9oYW5kbGUgKm5zbV9nZXRfaGFuZGxlKGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqc2FwLAorCQkJCSAgY29uc3Qgc2l6ZV90IHNhbGVuLCBjb25zdCBjaGFyICpob3N0bmFtZSwKKwkJCQkgIGNvbnN0IHNpemVfdCBob3N0bmFtZV9sZW4pCit7CisJc3RydWN0IG5zbV9oYW5kbGUgKmNhY2hlZCwgKm5ldyA9IE5VTEw7CisKKwlpZiAoaG9zdG5hbWUgJiYgbWVtY2hyKGhvc3RuYW1lLCAnLycsIGhvc3RuYW1lX2xlbikgIT0gTlVMTCkgeworCQlpZiAocHJpbnRrX3JhdGVsaW1pdCgpKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJJbnZhbGlkIGhvc3RuYW1lIFwiJS4qc1wiICIKKwkJCQkJICAgICJpbiBORlMgbG9jayByZXF1ZXN0XG4iLAorCQkJCShpbnQpaG9zdG5hbWVfbGVuLCBob3N0bmFtZSk7CisJCX0KKwkJcmV0dXJuIE5VTEw7CisJfQorCityZXRyeToKKwlzcGluX2xvY2soJm5zbV9sb2NrKTsKKworCWlmIChuc21fdXNlX2hvc3RuYW1lcyAmJiBob3N0bmFtZSAhPSBOVUxMKQorCQljYWNoZWQgPSBuc21fbG9va3VwX2hvc3RuYW1lKGhvc3RuYW1lLCBob3N0bmFtZV9sZW4pOworCWVsc2UKKwkJY2FjaGVkID0gbnNtX2xvb2t1cF9hZGRyKHNhcCk7CisKKwlpZiAoY2FjaGVkICE9IE5VTEwpIHsKKwkJYXRvbWljX2luYygmY2FjaGVkLT5zbV9jb3VudCk7CisJCXNwaW5fdW5sb2NrKCZuc21fbG9jayk7CisJCWtmcmVlKG5ldyk7CisJCWRwcmludGsoImxvY2tkOiBmb3VuZCBuc21faGFuZGxlIGZvciAlcyAoJXMpLCAiCisJCQkJImNudCAlZFxuIiwgY2FjaGVkLT5zbV9uYW1lLAorCQkJCWNhY2hlZC0+c21fYWRkcmJ1ZiwKKwkJCQlhdG9taWNfcmVhZCgmY2FjaGVkLT5zbV9jb3VudCkpOworCQlyZXR1cm4gY2FjaGVkOworCX0KKworCWlmIChuZXcgIT0gTlVMTCkgeworCQlsaXN0X2FkZCgmbmV3LT5zbV9saW5rLCAmbnNtX2hhbmRsZXMpOworCQlzcGluX3VubG9jaygmbnNtX2xvY2spOworCQlkcHJpbnRrKCJsb2NrZDogY3JlYXRlZCBuc21faGFuZGxlIGZvciAlcyAoJXMpXG4iLAorCQkJCW5ldy0+c21fbmFtZSwgbmV3LT5zbV9hZGRyYnVmKTsKKwkJcmV0dXJuIG5ldzsKKwl9CisKKwlzcGluX3VubG9jaygmbnNtX2xvY2spOworCisJbmV3ID0gbnNtX2NyZWF0ZV9oYW5kbGUoc2FwLCBzYWxlbiwgaG9zdG5hbWUsIGhvc3RuYW1lX2xlbik7CisJaWYgKHVubGlrZWx5KG5ldyA9PSBOVUxMKSkKKwkJcmV0dXJuIE5VTEw7CisJZ290byByZXRyeTsKK30KKworLyoqCisgKiBuc21fcmVib290X2xvb2t1cCAtIG1hdGNoIE5MTVBST0NfU01fTk9USUZZIGFyZ3VtZW50cyB0byBhbiBuc21faGFuZGxlCisgKiBAaW5mbzogcG9pbnRlciB0byBOTE1QUk9DX1NNX05PVElGWSBhcmd1bWVudHMKKyAqCisgKiBSZXR1cm5zIGEgbWF0Y2hpbmcgbnNtX2hhbmRsZSBpZiBmb3VuZCBpbiB0aGUgbnNtIGNhY2hlOyB0aGUgcmV0dXJuZWQKKyAqIG5zbV9oYW5kbGUncyByZWZlcmVuY2UgY291bnQgaXMgYnVtcGVkIGFuZCBzbV9tb25pdG9yZWQgaXMgY2xlYXJlZC4KKyAqIE90aGVyd2lzZSByZXR1cm5zIE5VTEwgaWYgc29tZSBlcnJvciBvY2N1cnJlZC4KKyAqLworc3RydWN0IG5zbV9oYW5kbGUgKm5zbV9yZWJvb3RfbG9va3VwKGNvbnN0IHN0cnVjdCBubG1fcmVib290ICppbmZvKQoreworCXN0cnVjdCBuc21faGFuZGxlICpjYWNoZWQ7CisKKwlzcGluX2xvY2soJm5zbV9sb2NrKTsKKworCWNhY2hlZCA9IG5zbV9sb29rdXBfcHJpdigmaW5mby0+cHJpdik7CisJaWYgKHVubGlrZWx5KGNhY2hlZCA9PSBOVUxMKSkgeworCQlzcGluX3VubG9jaygmbnNtX2xvY2spOworCQlkcHJpbnRrKCJsb2NrZDogbmV2ZXIgc2F3IHJlYm9vdGVkIHBlZXIgJyUuKnMnIGJlZm9yZVxuIiwKKwkJCQlpbmZvLT5sZW4sIGluZm8tPm1vbik7CisJCXJldHVybiBjYWNoZWQ7CisJfQorCisJYXRvbWljX2luYygmY2FjaGVkLT5zbV9jb3VudCk7CisJc3Bpbl91bmxvY2soJm5zbV9sb2NrKTsKKworCS8qCisJICogRHVyaW5nIHN1YnNlcXVlbnQgbG9jayBhY3Rpdml0eSwgZm9yY2UgYSBmcmVzaAorCSAqIG5vdGlmaWNhdGlvbiB0byBiZSBzZXQgdXAgZm9yIHRoaXMgaG9zdC4KKwkgKi8KKwljYWNoZWQtPnNtX21vbml0b3JlZCA9IDA7CisKKwlkcHJpbnRrKCJsb2NrZDogaG9zdCAlcyAoJXMpIHJlYm9vdGVkLCBjbnQgJWRcbiIsCisJCQljYWNoZWQtPnNtX25hbWUsIGNhY2hlZC0+c21fYWRkcmJ1ZiwKKwkJCWF0b21pY19yZWFkKCZjYWNoZWQtPnNtX2NvdW50KSk7CisJcmV0dXJuIGNhY2hlZDsKK30KKworLyoqCisgKiBuc21fcmVsZWFzZSAtIFJlbGVhc2UgYW4gTlNNIGhhbmRsZQorICogQG5zbTogcG9pbnRlciB0byBoYW5kbGUgdG8gYmUgcmVsZWFzZWQKKyAqCisgKi8KK3ZvaWQgbnNtX3JlbGVhc2Uoc3RydWN0IG5zbV9oYW5kbGUgKm5zbSkKK3sKKwlpZiAoYXRvbWljX2RlY19hbmRfbG9jaygmbnNtLT5zbV9jb3VudCwgJm5zbV9sb2NrKSkgeworCQlsaXN0X2RlbCgmbnNtLT5zbV9saW5rKTsKKwkJc3Bpbl91bmxvY2soJm5zbV9sb2NrKTsKKwkJZHByaW50aygibG9ja2Q6IGRlc3Ryb3llZCBuc21faGFuZGxlIGZvciAlcyAoJXMpXG4iLAorCQkJCW5zbS0+c21fbmFtZSwgbnNtLT5zbV9hZGRyYnVmKTsKKwkJa2ZyZWUobnNtKTsKKwl9CiB9CiAKIC8qCkBAIC0xNTQsMTI3ICs0MjgsMTMyIEBACiAgKiBTdGF0dXMgTW9uaXRvciB3aXJlIHByb3RvY29sLgogICovCiAKLXN0YXRpYyBfX2JlMzIgKnhkcl9lbmNvZGVfbnNtX3N0cmluZyhfX2JlMzIgKnAsIGNoYXIgKnN0cmluZykKK3N0YXRpYyBpbnQgZW5jb2RlX25zbV9zdHJpbmcoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgY29uc3QgY2hhciAqc3RyaW5nKQogewotCXNpemVfdCBsZW4gPSBzdHJsZW4oc3RyaW5nKTsKKwljb25zdCB1MzIgbGVuID0gc3RybGVuKHN0cmluZyk7CisJX19iZTMyICpwOwogCi0JaWYgKGxlbiA+IFNNX01BWFNUUkxFTikKLQkJbGVuID0gU01fTUFYU1RSTEVOOwotCXJldHVybiB4ZHJfZW5jb2RlX29wYXF1ZShwLCBzdHJpbmcsIGxlbik7CisJaWYgKHVubGlrZWx5KGxlbiA+IFNNX01BWFNUUkxFTikpCisJCXJldHVybiAtRUlPOworCXAgPSB4ZHJfcmVzZXJ2ZV9zcGFjZSh4ZHIsIHNpemVvZih1MzIpICsgbGVuKTsKKwlpZiAodW5saWtlbHkocCA9PSBOVUxMKSkKKwkJcmV0dXJuIC1FSU87CisJeGRyX2VuY29kZV9vcGFxdWUocCwgc3RyaW5nLCBsZW4pOworCXJldHVybiAwOwogfQogCiAvKgogICogIm1vbl9uYW1lIiBzcGVjaWZpZXMgdGhlIGhvc3QgdG8gYmUgbW9uaXRvcmVkLgotICoKLSAqIExpbnV4IHVzZXMgYSB0ZXh0IHZlcnNpb24gb2YgdGhlIElQIGFkZHJlc3Mgb2YgdGhlIHJlbW90ZQotICogaG9zdCBhcyB0aGUgaG9zdCBpZGVudGlmaWVyICh0aGUgIm1vbl9uYW1lIiBhcmd1bWVudCkuCi0gKgotICogTGludXggc3RhdGQgYWx3YXlzIGxvb2tzIHVwIHRoZSBjYW5vbmljYWwgaG9zdG5hbWUgZmlyc3QgZm9yCi0gKiB3aGF0ZXZlciByZW1vdGUgaG9zdG5hbWUgaXQgcmVjZWl2ZXMsIHNvIHRoaXMgd29ya3MgYWxyaWdodC4KICAqLwotc3RhdGljIF9fYmUzMiAqeGRyX2VuY29kZV9tb25fbmFtZShfX2JlMzIgKnAsIHN0cnVjdCBuc21fYXJncyAqYXJncCkKK3N0YXRpYyBpbnQgZW5jb2RlX21vbl9uYW1lKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIGNvbnN0IHN0cnVjdCBuc21fYXJncyAqYXJncCkKIHsKLQljaGFyCWJ1ZmZlcltYRFJfQUREUkJVRl9MRU4gKyAxXTsKLQljaGFyCSpuYW1lID0gYXJncC0+bW9uX25hbWU7Ci0KLQlpZiAoIW5zbV91c2VfaG9zdG5hbWVzKSB7Ci0JCXNucHJpbnRmKGJ1ZmZlciwgWERSX0FERFJCVUZfTEVOLAotCQkJICIlcEk0IiwgJmFyZ3AtPmFkZHIpOwotCQluYW1lID0gYnVmZmVyOwotCX0KLQotCXJldHVybiB4ZHJfZW5jb2RlX25zbV9zdHJpbmcocCwgbmFtZSk7CisJcmV0dXJuIGVuY29kZV9uc21fc3RyaW5nKHhkciwgYXJncC0+bW9uX25hbWUpOwogfQogCiAvKgogICogVGhlICJteV9pZCIgYXJndW1lbnQgc3BlY2lmaWVzIHRoZSBob3N0bmFtZSBhbmQgUlBDIHByb2NlZHVyZQogICogdG8gYmUgY2FsbGVkIHdoZW4gdGhlIHN0YXR1cyBtYW5hZ2VyIHJlY2VpdmVzIG5vdGlmaWNhdGlvbgotICogKHZpYSB0aGUgU01fTk9USUZZIGNhbGwpIHRoYXQgdGhlIHN0YXRlIG9mIGhvc3QgIm1vbl9uYW1lIgorICogKHZpYSB0aGUgTkxNUFJPQ19TTV9OT1RJRlkgY2FsbCkgdGhhdCB0aGUgc3RhdGUgb2YgaG9zdCAibW9uX25hbWUiCiAgKiBoYXMgY2hhbmdlZC4KICAqLwotc3RhdGljIF9fYmUzMiAqeGRyX2VuY29kZV9teV9pZChfX2JlMzIgKnAsIHN0cnVjdCBuc21fYXJncyAqYXJncCkKK3N0YXRpYyBpbnQgZW5jb2RlX215X2lkKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIGNvbnN0IHN0cnVjdCBuc21fYXJncyAqYXJncCkKIHsKLQlwID0geGRyX2VuY29kZV9uc21fc3RyaW5nKHAsIHV0c25hbWUoKS0+bm9kZW5hbWUpOwotCWlmICghcCkKLQkJcmV0dXJuIEVSUl9QVFIoLUVJTyk7CisJaW50IHN0YXR1czsKKwlfX2JlMzIgKnA7CiAKKwlzdGF0dXMgPSBlbmNvZGVfbnNtX3N0cmluZyh4ZHIsIHV0c25hbWUoKS0+bm9kZW5hbWUpOworCWlmICh1bmxpa2VseShzdGF0dXMgIT0gMCkpCisJCXJldHVybiBzdGF0dXM7CisJcCA9IHhkcl9yZXNlcnZlX3NwYWNlKHhkciwgMyAqIHNpemVvZih1MzIpKTsKKwlpZiAodW5saWtlbHkocCA9PSBOVUxMKSkKKwkJcmV0dXJuIC1FSU87CiAJKnArKyA9IGh0b25sKGFyZ3AtPnByb2cpOwogCSpwKysgPSBodG9ubChhcmdwLT52ZXJzKTsKIAkqcCsrID0gaHRvbmwoYXJncC0+cHJvYyk7Ci0KLQlyZXR1cm4gcDsKKwlyZXR1cm4gMDsKIH0KIAogLyoKICAqIFRoZSAibW9uX2lkIiBhcmd1bWVudCBzcGVjaWZpZXMgdGhlIG5vbi1wcml2YXRlIGFyZ3VtZW50cwotICogb2YgYW4gU01fTU9OIG9yIFNNX1VOTU9OIGNhbGwuCisgKiBvZiBhbiBOU01QUk9DX01PTiBvciBOU01QUk9DX1VOTU9OIGNhbGwuCiAgKi8KLXN0YXRpYyBfX2JlMzIgKnhkcl9lbmNvZGVfbW9uX2lkKF9fYmUzMiAqcCwgc3RydWN0IG5zbV9hcmdzICphcmdwKQorc3RhdGljIGludCBlbmNvZGVfbW9uX2lkKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIGNvbnN0IHN0cnVjdCBuc21fYXJncyAqYXJncCkKIHsKLQlwID0geGRyX2VuY29kZV9tb25fbmFtZShwLCBhcmdwKTsKLQlpZiAoIXApCi0JCXJldHVybiBFUlJfUFRSKC1FSU8pOworCWludCBzdGF0dXM7CiAKLQlyZXR1cm4geGRyX2VuY29kZV9teV9pZChwLCBhcmdwKTsKKwlzdGF0dXMgPSBlbmNvZGVfbW9uX25hbWUoeGRyLCBhcmdwKTsKKwlpZiAodW5saWtlbHkoc3RhdHVzICE9IDApKQorCQlyZXR1cm4gc3RhdHVzOworCXJldHVybiBlbmNvZGVfbXlfaWQoeGRyLCBhcmdwKTsKIH0KIAogLyoKICAqIFRoZSAicHJpdiIgYXJndW1lbnQgbWF5IGNvbnRhaW4gcHJpdmF0ZSBpbmZvcm1hdGlvbiByZXF1aXJlZAotICogYnkgdGhlIFNNX01PTiBjYWxsLiBUaGlzIGluZm9ybWF0aW9uIHdpbGwgYmUgc3VwcGxpZWQgaW4gdGhlCi0gKiBTTV9OT1RJRlkgY2FsbC4KLSAqCi0gKiBMaW51eCBwcm92aWRlcyB0aGUgcmF3IElQIGFkZHJlc3Mgb2YgdGhlIG1vbml0b3JlZCBob3N0LAotICogbGVmdCBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIuCisgKiBieSB0aGUgTlNNUFJPQ19NT04gY2FsbC4gVGhpcyBpbmZvcm1hdGlvbiB3aWxsIGJlIHN1cHBsaWVkIGluIHRoZQorICogTkxNUFJPQ19TTV9OT1RJRlkgY2FsbC4KICAqLwotc3RhdGljIF9fYmUzMiAqeGRyX2VuY29kZV9wcml2KF9fYmUzMiAqcCwgc3RydWN0IG5zbV9hcmdzICphcmdwKQorc3RhdGljIGludCBlbmNvZGVfcHJpdihzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBjb25zdCBzdHJ1Y3QgbnNtX2FyZ3MgKmFyZ3ApCiB7Ci0JKnArKyA9IGFyZ3AtPmFkZHI7Ci0JKnArKyA9IDA7Ci0JKnArKyA9IDA7Ci0JKnArKyA9IDA7CisJX19iZTMyICpwOwogCi0JcmV0dXJuIHA7Ci19Ci0KLXN0YXRpYyBpbnQKLXhkcl9lbmNvZGVfbW9uKHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsIF9fYmUzMiAqcCwgc3RydWN0IG5zbV9hcmdzICphcmdwKQotewotCXAgPSB4ZHJfZW5jb2RlX21vbl9pZChwLCBhcmdwKTsKLQlpZiAoSVNfRVJSKHApKQotCQlyZXR1cm4gUFRSX0VSUihwKTsKLQotCXAgPSB4ZHJfZW5jb2RlX3ByaXYocCwgYXJncCk7Ci0JaWYgKElTX0VSUihwKSkKLQkJcmV0dXJuIFBUUl9FUlIocCk7Ci0KLQlycXN0cC0+cnFfc2xlbiA9IHhkcl9hZGp1c3RfaW92ZWMocnFzdHAtPnJxX3N2ZWMsIHApOworCXAgPSB4ZHJfcmVzZXJ2ZV9zcGFjZSh4ZHIsIFNNX1BSSVZfU0laRSk7CisJaWYgKHVubGlrZWx5KHAgPT0gTlVMTCkpCisJCXJldHVybiAtRUlPOworCXhkcl9lbmNvZGVfb3BhcXVlX2ZpeGVkKHAsIGFyZ3AtPnByaXYtPmRhdGEsIFNNX1BSSVZfU0laRSk7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQKLXhkcl9lbmNvZGVfdW5tb24oc3RydWN0IHJwY19ycXN0ICpycXN0cCwgX19iZTMyICpwLCBzdHJ1Y3QgbnNtX2FyZ3MgKmFyZ3ApCitzdGF0aWMgaW50IHhkcl9lbmNfbW9uKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsCisJCSAgICAgICBjb25zdCBzdHJ1Y3QgbnNtX2FyZ3MgKmFyZ3ApCiB7Ci0JcCA9IHhkcl9lbmNvZGVfbW9uX2lkKHAsIGFyZ3ApOwotCWlmIChJU19FUlIocCkpCi0JCXJldHVybiBQVFJfRVJSKHApOwotCXJxc3RwLT5ycV9zbGVuID0geGRyX2FkanVzdF9pb3ZlYyhycXN0cC0+cnFfc3ZlYywgcCk7Ci0JcmV0dXJuIDA7CisJc3RydWN0IHhkcl9zdHJlYW0geGRyOworCWludCBzdGF0dXM7CisKKwl4ZHJfaW5pdF9lbmNvZGUoJnhkciwgJnJlcS0+cnFfc25kX2J1ZiwgcCk7CisJc3RhdHVzID0gZW5jb2RlX21vbl9pZCgmeGRyLCBhcmdwKTsKKwlpZiAodW5saWtlbHkoc3RhdHVzKSkKKwkJcmV0dXJuIHN0YXR1czsKKwlyZXR1cm4gZW5jb2RlX3ByaXYoJnhkciwgYXJncCk7CiB9CiAKLXN0YXRpYyBpbnQKLXhkcl9kZWNvZGVfc3RhdF9yZXMoc3RydWN0IHJwY19ycXN0ICpycXN0cCwgX19iZTMyICpwLCBzdHJ1Y3QgbnNtX3JlcyAqcmVzcCkKK3N0YXRpYyBpbnQgeGRyX2VuY191bm1vbihzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLAorCQkJIGNvbnN0IHN0cnVjdCBuc21fYXJncyAqYXJncCkKIHsKKwlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CisKKwl4ZHJfaW5pdF9lbmNvZGUoJnhkciwgJnJlcS0+cnFfc25kX2J1ZiwgcCk7CisJcmV0dXJuIGVuY29kZV9tb25faWQoJnhkciwgYXJncCk7Cit9CisKK3N0YXRpYyBpbnQgeGRyX2RlY19zdGF0X3JlcyhzdHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLCBfX2JlMzIgKnAsCisJCQkgICAgc3RydWN0IG5zbV9yZXMgKnJlc3ApCit7CisJc3RydWN0IHhkcl9zdHJlYW0geGRyOworCisJeGRyX2luaXRfZGVjb2RlKCZ4ZHIsICZycXN0cC0+cnFfcmN2X2J1ZiwgcCk7CisJcCA9IHhkcl9pbmxpbmVfZGVjb2RlKCZ4ZHIsIDIgKiBzaXplb2YodTMyKSk7CisJaWYgKHVubGlrZWx5KHAgPT0gTlVMTCkpCisJCXJldHVybiAtRUlPOwogCXJlc3AtPnN0YXR1cyA9IG50b2hsKCpwKyspOwotCXJlc3AtPnN0YXRlID0gbnRvaGwoKnArKyk7Ci0JZHByaW50aygibnNtOiB4ZHJfZGVjb2RlX3N0YXRfcmVzIHN0YXR1cyAlZCBzdGF0ZSAlZFxuIiwKKwlyZXNwLT5zdGF0ZSA9IG50b2hsKCpwKTsKKworCWRwcmludGsoImxvY2tkOiB4ZHJfZGVjX3N0YXRfcmVzIHN0YXR1cyAlZCBzdGF0ZSAlZFxuIiwKIAkJCXJlc3AtPnN0YXR1cywgcmVzcC0+c3RhdGUpOwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50Ci14ZHJfZGVjb2RlX3N0YXQoc3RydWN0IHJwY19ycXN0ICpycXN0cCwgX19iZTMyICpwLCBzdHJ1Y3QgbnNtX3JlcyAqcmVzcCkKK3N0YXRpYyBpbnQgeGRyX2RlY19zdGF0KHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsIF9fYmUzMiAqcCwKKwkJCXN0cnVjdCBuc21fcmVzICpyZXNwKQogewotCXJlc3AtPnN0YXRlID0gbnRvaGwoKnArKyk7CisJc3RydWN0IHhkcl9zdHJlYW0geGRyOworCisJeGRyX2luaXRfZGVjb2RlKCZ4ZHIsICZycXN0cC0+cnFfcmN2X2J1ZiwgcCk7CisJcCA9IHhkcl9pbmxpbmVfZGVjb2RlKCZ4ZHIsIHNpemVvZih1MzIpKTsKKwlpZiAodW5saWtlbHkocCA9PSBOVUxMKSkKKwkJcmV0dXJuIC1FSU87CisJcmVzcC0+c3RhdGUgPSBudG9obCgqcCk7CisKKwlkcHJpbnRrKCJsb2NrZDogeGRyX2RlY19zdGF0IHN0YXRlICVkXG4iLCByZXNwLT5zdGF0ZSk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTI4OCwyMiArNTY3LDIyIEBACiAjZGVmaW5lIFNNX3VubW9ucmVzX3N6CTEKIAogc3RhdGljIHN0cnVjdCBycGNfcHJvY2luZm8JbnNtX3Byb2NlZHVyZXNbXSA9IHsKLVtTTV9NT05dID0gewotCQkucF9wcm9jCQk9IFNNX01PTiwKLQkJLnBfZW5jb2RlCT0gKGt4ZHJwcm9jX3QpIHhkcl9lbmNvZGVfbW9uLAotCQkucF9kZWNvZGUJPSAoa3hkcnByb2NfdCkgeGRyX2RlY29kZV9zdGF0X3JlcywKK1tOU01QUk9DX01PTl0gPSB7CisJCS5wX3Byb2MJCT0gTlNNUFJPQ19NT04sCisJCS5wX2VuY29kZQk9IChreGRycHJvY190KXhkcl9lbmNfbW9uLAorCQkucF9kZWNvZGUJPSAoa3hkcnByb2NfdCl4ZHJfZGVjX3N0YXRfcmVzLAogCQkucF9hcmdsZW4JPSBTTV9tb25fc3osCiAJCS5wX3JlcGxlbgk9IFNNX21vbnJlc19zeiwKLQkJLnBfc3RhdGlkeAk9IFNNX01PTiwKKwkJLnBfc3RhdGlkeAk9IE5TTVBST0NfTU9OLAogCQkucF9uYW1lCQk9ICJNT05JVE9SIiwKIAl9LAotW1NNX1VOTU9OXSA9IHsKLQkJLnBfcHJvYwkJPSBTTV9VTk1PTiwKLQkJLnBfZW5jb2RlCT0gKGt4ZHJwcm9jX3QpIHhkcl9lbmNvZGVfdW5tb24sCi0JCS5wX2RlY29kZQk9IChreGRycHJvY190KSB4ZHJfZGVjb2RlX3N0YXQsCitbTlNNUFJPQ19VTk1PTl0gPSB7CisJCS5wX3Byb2MJCT0gTlNNUFJPQ19VTk1PTiwKKwkJLnBfZW5jb2RlCT0gKGt4ZHJwcm9jX3QpeGRyX2VuY191bm1vbiwKKwkJLnBfZGVjb2RlCT0gKGt4ZHJwcm9jX3QpeGRyX2RlY19zdGF0LAogCQkucF9hcmdsZW4JPSBTTV9tb25faWRfc3osCiAJCS5wX3JlcGxlbgk9IFNNX3VubW9ucmVzX3N6LAotCQkucF9zdGF0aWR4CT0gU01fVU5NT04sCisJCS5wX3N0YXRpZHgJPSBOU01QUk9DX1VOTU9OLAogCQkucF9uYW1lCQk9ICJVTk1PTklUT1IiLAogCX0sCiB9OwpAQCAtMzIyLDcgKzYwMSw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgcnBjX3Byb2dyYW0JbnNtX3Byb2dyYW0gPSB7CiAJCS5uYW1lCQk9ICJzdGF0ZCIsCi0JCS5udW1iZXIJCT0gU01fUFJPR1JBTSwKKwkJLm51bWJlcgkJPSBOU01fUFJPR1JBTSwKIAkJLm5ydmVycwkJPSBBUlJBWV9TSVpFKG5zbV92ZXJzaW9uKSwKIAkJLnZlcnNpb24JPSBuc21fdmVyc2lvbiwKIAkJLnN0YXRzCQk9ICZuc21fc3RhdHMKZGlmZiAtLWdpdCBhL2ZzL2xvY2tkL3N2Yy5jIGIvZnMvbG9ja2Qvc3ZjLmMKaW5kZXggMjUyZDgwMS4uNjRmMWMzMSAxMDA2NDQKLS0tIGEvZnMvbG9ja2Qvc3ZjLmMKKysrIGIvZnMvbG9ja2Qvc3ZjLmMKQEAgLTM1LDcgKzM1LDYgQEAKICNpbmNsdWRlIDxsaW51eC9zdW5ycGMvc3Zjc29jay5oPgogI2luY2x1ZGUgPG5ldC9pcC5oPgogI2luY2x1ZGUgPGxpbnV4L2xvY2tkL2xvY2tkLmg+Ci0jaW5jbHVkZSA8bGludXgvbG9ja2Qvc21faW50ZXIuaD4KICNpbmNsdWRlIDxsaW51eC9uZnMuaD4KIAogI2RlZmluZSBOTE1EQkdfRkFDSUxJVFkJCU5MTURCR19TVkMKQEAgLTU0LDEzICs1MywyNiBAQAogdW5zaWduZWQgbG9uZwkJCW5sbXN2Y190aW1lb3V0OwogCiAvKgorICogSWYgdGhlIGtlcm5lbCBoYXMgSVB2NiBzdXBwb3J0IGF2YWlsYWJsZSwgYWx3YXlzIGxpc3RlbiBmb3IKKyAqIGJvdGggQUZfSU5FVCBhbmQgQUZfSU5FVDYgcmVxdWVzdHMuCisgKi8KKyNpZiAoZGVmaW5lZChDT05GSUdfSVBWNikgfHwgZGVmaW5lZChDT05GSUdfSVBWNl9NT0RVTEUpKSAmJiBcCisJZGVmaW5lZChDT05GSUdfU1VOUlBDX1JFR0lTVEVSX1Y0KQorc3RhdGljIGNvbnN0IHNhX2ZhbWlseV90CW5sbXN2Y19mYW1pbHkgPSBBRl9JTkVUNjsKKyNlbHNlCS8qIChDT05GSUdfSVBWNiB8fCBDT05GSUdfSVBWNl9NT0RVTEUpICYmIENPTkZJR19TVU5SUENfUkVHSVNURVJfVjQgKi8KK3N0YXRpYyBjb25zdCBzYV9mYW1pbHlfdAlubG1zdmNfZmFtaWx5ID0gQUZfSU5FVDsKKyNlbmRpZgkvKiAoQ09ORklHX0lQVjYgfHwgQ09ORklHX0lQVjZfTU9EVUxFKSAmJiBDT05GSUdfU1VOUlBDX1JFR0lTVEVSX1Y0ICovCisKKy8qCiAgKiBUaGVzZSBjYW4gYmUgc2V0IGF0IGluc21vZCB0aW1lICh1c2VmdWwgZm9yIE5GUyBhcyByb290IGZpbGVzeXN0ZW0pLAogICogYW5kIGFsc28gY2hhbmdlZCB0aHJvdWdoIHRoZSBzeXNjdGwgaW50ZXJmYWNlLiAgLS0gSmFtaWUgTG9raWVyLCBBdWcgMjAwMwogICovCiBzdGF0aWMgdW5zaWduZWQgbG9uZwkJbmxtX2dyYWNlX3BlcmlvZDsKIHN0YXRpYyB1bnNpZ25lZCBsb25nCQlubG1fdGltZW91dCA9IExPQ0tEX0RGTFRfVElNRU87CiBzdGF0aWMgaW50CQkJbmxtX3VkcHBvcnQsIG5sbV90Y3Bwb3J0OwotaW50CQkJCW5zbV91c2VfaG9zdG5hbWVzID0gMDsKKworLyogUkxJTV9OT0ZJTEUgZGVmYXVsdHMgdG8gMTAyNC4gVGhhdCBzZWVtcyBsaWtlIGEgcmVhc29uYWJsZSBkZWZhdWx0IGhlcmUuICovCitzdGF0aWMgdW5zaWduZWQgaW50CQlubG1fbWF4X2Nvbm5lY3Rpb25zID0gMTAyNDsKIAogLyoKICAqIENvbnN0YW50cyBuZWVkZWQgZm9yIHRoZSBzeXNjdGwgaW50ZXJmYWNlLgpAQCAtMTQzLDYgKzE1NSw5IEBACiAJCWxvbmcgdGltZW91dCA9IE1BWF9TQ0hFRFVMRV9USU1FT1VUOwogCQlSUENfSUZERUJVRyhjaGFyIGJ1ZltSUENfTUFYX0FERFJCVUZMRU5dKTsKIAorCQkvKiB1cGRhdGUgc3ZfbWF4Y29ubiBpZiBpdCBoYXMgY2hhbmdlZCAqLworCQlycXN0cC0+cnFfc2VydmVyLT5zdl9tYXhjb25uID0gbmxtX21heF9jb25uZWN0aW9uczsKKwogCQlpZiAoc2lnbmFsbGVkKCkpIHsKIAkJCWZsdXNoX3NpZ25hbHMoY3VycmVudCk7CiAJCQlpZiAobmxtc3ZjX29wcykgewpAQCAtMTg5LDYgKzIwNCwxOSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IGNyZWF0ZV9sb2NrZF9saXN0ZW5lcihzdHJ1Y3Qgc3ZjX3NlcnYgKnNlcnYsIGNoYXIgKm5hbWUsCisJCQkJIHVuc2lnbmVkIHNob3J0IHBvcnQpCit7CisJc3RydWN0IHN2Y194cHJ0ICp4cHJ0OworCisJeHBydCA9IHN2Y19maW5kX3hwcnQoc2VydiwgbmFtZSwgMCwgMCk7CisJaWYgKHhwcnQgPT0gTlVMTCkKKwkJcmV0dXJuIHN2Y19jcmVhdGVfeHBydChzZXJ2LCBuYW1lLCBwb3J0LCBTVkNfU09DS19ERUZBVUxUUyk7CisKKwlzdmNfeHBydF9wdXQoeHBydCk7CisJcmV0dXJuIDA7Cit9CisKIC8qCiAgKiBFbnN1cmUgdGhlcmUgYXJlIGFjdGl2ZSBVRFAgYW5kIFRDUCBsaXN0ZW5lcnMgZm9yIGxvY2tkLgogICoKQEAgLTIwMiwyOSArMjMwLDIzIEBACiBzdGF0aWMgaW50IG1ha2Vfc29ja3Moc3RydWN0IHN2Y19zZXJ2ICpzZXJ2KQogewogCXN0YXRpYyBpbnQgd2FybmVkOwotCXN0cnVjdCBzdmNfeHBydCAqeHBydDsKLQlpbnQgZXJyID0gMDsKKwlpbnQgZXJyOwogCi0JeHBydCA9IHN2Y19maW5kX3hwcnQoc2VydiwgInVkcCIsIDAsIDApOwotCWlmICgheHBydCkKLQkJZXJyID0gc3ZjX2NyZWF0ZV94cHJ0KHNlcnYsICJ1ZHAiLCBubG1fdWRwcG9ydCwKLQkJCQkgICAgICBTVkNfU09DS19ERUZBVUxUUyk7Ci0JZWxzZQotCQlzdmNfeHBydF9wdXQoeHBydCk7Ci0JaWYgKGVyciA+PSAwKSB7Ci0JCXhwcnQgPSBzdmNfZmluZF94cHJ0KHNlcnYsICJ0Y3AiLCAwLCAwKTsKLQkJaWYgKCF4cHJ0KQotCQkJZXJyID0gc3ZjX2NyZWF0ZV94cHJ0KHNlcnYsICJ0Y3AiLCBubG1fdGNwcG9ydCwKLQkJCQkJICAgICAgU1ZDX1NPQ0tfREVGQVVMVFMpOwotCQllbHNlCi0JCQlzdmNfeHBydF9wdXQoeHBydCk7Ci0JfQotCWlmIChlcnIgPj0gMCkgewotCQl3YXJuZWQgPSAwOwotCQllcnIgPSAwOwotCX0gZWxzZSBpZiAod2FybmVkKysgPT0gMCkKKwllcnIgPSBjcmVhdGVfbG9ja2RfbGlzdGVuZXIoc2VydiwgInVkcCIsIG5sbV91ZHBwb3J0KTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBvdXRfZXJyOworCisJZXJyID0gY3JlYXRlX2xvY2tkX2xpc3RlbmVyKHNlcnYsICJ0Y3AiLCBubG1fdGNwcG9ydCk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gb3V0X2VycjsKKworCXdhcm5lZCA9IDA7CisJcmV0dXJuIDA7CisKK291dF9lcnI6CisJaWYgKHdhcm5lZCsrID09IDApCiAJCXByaW50ayhLRVJOX1dBUk5JTkcKLQkJICAgICAgICJsb2NrZF91cDogbWFrZXNvY2sgZmFpbGVkLCBlcnJvcj0lZFxuIiwgZXJyKTsKKwkJCSJsb2NrZF91cDogbWFrZXNvY2sgZmFpbGVkLCBlcnJvcj0lZFxuIiwgZXJyKTsKIAlyZXR1cm4gZXJyOwogfQogCkBAIC0yNTIsNyArMjc0LDcgQEAKIAkJCSJsb2NrZF91cDogbm8gcGlkLCAlZCB1c2Vycz8/XG4iLCBubG1zdmNfdXNlcnMpOwogCiAJZXJyb3IgPSAtRU5PTUVNOwotCXNlcnYgPSBzdmNfY3JlYXRlKCZubG1zdmNfcHJvZ3JhbSwgTE9DS0RfQlVGU0laRSwgQUZfSU5FVCwgTlVMTCk7CisJc2VydiA9IHN2Y19jcmVhdGUoJm5sbXN2Y19wcm9ncmFtLCBMT0NLRF9CVUZTSVpFLCBubG1zdmNfZmFtaWx5LCBOVUxMKTsKIAlpZiAoIXNlcnYpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAibG9ja2RfdXA6IGNyZWF0ZSBzZXJ2aWNlIGZhaWxlZFxuIik7CiAJCWdvdG8gb3V0OwpAQCAtMjc2LDYgKzI5OCw3IEBACiAJfQogCiAJc3ZjX3NvY2tfdXBkYXRlX2J1ZnMoc2Vydik7CisJc2Vydi0+c3ZfbWF4Y29ubiA9IG5sbV9tYXhfY29ubmVjdGlvbnM7CiAKIAlubG1zdmNfdGFzayA9IGt0aHJlYWRfcnVuKGxvY2tkLCBubG1zdmNfcnFzdCwgc2Vydi0+c3ZfbmFtZSk7CiAJaWYgKElTX0VSUihubG1zdmNfdGFzaykpIHsKQEAgLTQ4NSw2ICs1MDgsNyBAQAogbW9kdWxlX3BhcmFtX2NhbGwobmxtX3RjcHBvcnQsIHBhcmFtX3NldF9wb3J0LCBwYXJhbV9nZXRfaW50LAogCQkgICZubG1fdGNwcG9ydCwgMDY0NCk7CiBtb2R1bGVfcGFyYW0obnNtX3VzZV9ob3N0bmFtZXMsIGJvb2wsIDA2NDQpOworbW9kdWxlX3BhcmFtKG5sbV9tYXhfY29ubmVjdGlvbnMsIHVpbnQsIDA2NDQpOwogCiAvKgogICogSW5pdGlhbGlzaW5nIGFuZCB0ZXJtaW5hdGluZyB0aGUgbW9kdWxlLgpkaWZmIC0tZ2l0IGEvZnMvbG9ja2Qvc3ZjNHByb2MuYyBiL2ZzL2xvY2tkL3N2YzRwcm9jLmMKaW5kZXggNGRmZGNiYy4uMTcyNTAzNzMgMTAwNjQ0Ci0tLSBhL2ZzL2xvY2tkL3N2YzRwcm9jLmMKKysrIGIvZnMvbG9ja2Qvc3ZjNHByb2MuYwpAQCAtMTYsOCArMTYsNiBAQAogI2luY2x1ZGUgPGxpbnV4L25mc2QvbmZzZC5oPgogI2luY2x1ZGUgPGxpbnV4L2xvY2tkL2xvY2tkLmg+CiAjaW5jbHVkZSA8bGludXgvbG9ja2Qvc2hhcmUuaD4KLSNpbmNsdWRlIDxsaW51eC9sb2NrZC9zbV9pbnRlci5oPgotCiAKICNkZWZpbmUgTkxNREJHX0ZBQ0lMSVRZCQlOTE1EQkdfQ0xJRU5UCiAKQEAgLTQxOSw4ICs0MTcsNiBAQAogbmxtNHN2Y19wcm9jX3NtX25vdGlmeShzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgbmxtX3JlYm9vdCAqYXJncCwKIAkJCQkJICAgICAgdm9pZAkgICAgICAgICpyZXNwKQogewotCXN0cnVjdCBzb2NrYWRkcl9pbglzYWRkcjsKLQogCWRwcmludGsoImxvY2tkOiBTTV9OT1RJRlkgICAgIGNhbGxlZFxuIik7CiAKIAlpZiAoIW5sbV9wcml2aWxlZ2VkX3JlcXVlc3RlcihycXN0cCkpIHsKQEAgLTQzMCwxNCArNDI2LDcgQEAKIAkJcmV0dXJuIHJwY19zeXN0ZW1fZXJyOwogCX0KIAotCS8qIE9idGFpbiB0aGUgaG9zdCBwb2ludGVyIGZvciB0aGlzIE5GUyBzZXJ2ZXIgYW5kIHRyeSB0bwotCSAqIHJlY2xhaW0gYWxsIGxvY2tzIHdlIGhvbGQgb24gdGhpcyBzZXJ2ZXIuCi0JICovCi0JbWVtc2V0KCZzYWRkciwgMCwgc2l6ZW9mKHNhZGRyKSk7Ci0Jc2FkZHIuc2luX2ZhbWlseSA9IEFGX0lORVQ7Ci0Jc2FkZHIuc2luX2FkZHIuc19hZGRyID0gYXJncC0+YWRkcjsKLQlubG1faG9zdF9yZWJvb3RlZCgmc2FkZHIsIGFyZ3AtPm1vbiwgYXJncC0+bGVuLCBhcmdwLT5zdGF0ZSk7Ci0KKwlubG1faG9zdF9yZWJvb3RlZChhcmdwKTsKIAlyZXR1cm4gcnBjX3N1Y2Nlc3M7CiB9CiAKZGlmZiAtLWdpdCBhL2ZzL2xvY2tkL3N2Y3Byb2MuYyBiL2ZzL2xvY2tkL3N2Y3Byb2MuYwppbmRleCAzY2E4OWUyLi4zNjg4ZTU1IDEwMDY0NAotLS0gYS9mcy9sb2NrZC9zdmNwcm9jLmMKKysrIGIvZnMvbG9ja2Qvc3ZjcHJvYy5jCkBAIC0xNiw4ICsxNiw2IEBACiAjaW5jbHVkZSA8bGludXgvbmZzZC9uZnNkLmg+CiAjaW5jbHVkZSA8bGludXgvbG9ja2QvbG9ja2QuaD4KICNpbmNsdWRlIDxsaW51eC9sb2NrZC9zaGFyZS5oPgotI2luY2x1ZGUgPGxpbnV4L2xvY2tkL3NtX2ludGVyLmg+Ci0KIAogI2RlZmluZSBOTE1EQkdfRkFDSUxJVFkJCU5MTURCR19DTElFTlQKIApAQCAtNDUxLDggKzQ0OSw2IEBACiBubG1zdmNfcHJvY19zbV9ub3RpZnkoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IG5sbV9yZWJvb3QgKmFyZ3AsCiAJCQkJCSAgICAgIHZvaWQJICAgICAgICAqcmVzcCkKIHsKLQlzdHJ1Y3Qgc29ja2FkZHJfaW4Jc2FkZHI7Ci0KIAlkcHJpbnRrKCJsb2NrZDogU01fTk9USUZZICAgICBjYWxsZWRcbiIpOwogCiAJaWYgKCFubG1fcHJpdmlsZWdlZF9yZXF1ZXN0ZXIocnFzdHApKSB7CkBAIC00NjIsMTQgKzQ1OCw3IEBACiAJCXJldHVybiBycGNfc3lzdGVtX2VycjsKIAl9CiAKLQkvKiBPYnRhaW4gdGhlIGhvc3QgcG9pbnRlciBmb3IgdGhpcyBORlMgc2VydmVyIGFuZCB0cnkgdG8KLQkgKiByZWNsYWltIGFsbCBsb2NrcyB3ZSBob2xkIG9uIHRoaXMgc2VydmVyLgotCSAqLwotCW1lbXNldCgmc2FkZHIsIDAsIHNpemVvZihzYWRkcikpOwotCXNhZGRyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOwotCXNhZGRyLnNpbl9hZGRyLnNfYWRkciA9IGFyZ3AtPmFkZHI7Ci0JbmxtX2hvc3RfcmVib290ZWQoJnNhZGRyLCBhcmdwLT5tb24sIGFyZ3AtPmxlbiwgYXJncC0+c3RhdGUpOwotCisJbmxtX2hvc3RfcmVib290ZWQoYXJncCk7CiAJcmV0dXJuIHJwY19zdWNjZXNzOwogfQogCmRpZmYgLS1naXQgYS9mcy9sb2NrZC9zdmNzdWJzLmMgYi9mcy9sb2NrZC9zdmNzdWJzLmMKaW5kZXggMzRjMjc2Ni4uOWU0ZDZhYWIgMTAwNjQ0Ci0tLSBhL2ZzL2xvY2tkL3N2Y3N1YnMuYworKysgYi9mcy9sb2NrZC9zdmNzdWJzLmMKQEAgLTE3LDcgKzE3LDYgQEAKICNpbmNsdWRlIDxsaW51eC9uZnNkL2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2xvY2tkL2xvY2tkLmg+CiAjaW5jbHVkZSA8bGludXgvbG9ja2Qvc2hhcmUuaD4KLSNpbmNsdWRlIDxsaW51eC9sb2NrZC9zbV9pbnRlci5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L21vdW50Lmg+CiAKZGlmZiAtLWdpdCBhL2ZzL2xvY2tkL3hkci5jIGIvZnMvbG9ja2QveGRyLmMKaW5kZXggMWYyMjYyOS4uMDMzNmYyYiAxMDA2NDQKLS0tIGEvZnMvbG9ja2QveGRyLmMKKysrIGIvZnMvbG9ja2QveGRyLmMKQEAgLTE2LDcgKzE2LDYgQEAKICNpbmNsdWRlIDxsaW51eC9zdW5ycGMvc3ZjLmg+CiAjaW5jbHVkZSA8bGludXgvc3VucnBjL3N0YXRzLmg+CiAjaW5jbHVkZSA8bGludXgvbG9ja2QvbG9ja2QuaD4KLSNpbmNsdWRlIDxsaW51eC9sb2NrZC9zbV9pbnRlci5oPgogCiAjZGVmaW5lIE5MTURCR19GQUNJTElUWQkJTkxNREJHX1hEUgogCkBAIC0zNDksOCArMzQ4LDggQEAKIAlpZiAoIShwID0geGRyX2RlY29kZV9zdHJpbmdfaW5wbGFjZShwLCAmYXJncC0+bW9uLCAmYXJncC0+bGVuLCBTTV9NQVhTVFJMRU4pKSkKIAkJcmV0dXJuIDA7CiAJYXJncC0+c3RhdGUgPSBudG9obCgqcCsrKTsKLQkvKiBQcmVzZXJ2ZSB0aGUgYWRkcmVzcyBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIgKi8KLQlhcmdwLT5hZGRyID0gKnArKzsKKwltZW1jcHkoJmFyZ3AtPnByaXYuZGF0YSwgcCwgc2l6ZW9mKGFyZ3AtPnByaXYuZGF0YSkpOworCXAgKz0gWERSX1FVQURMRU4oU01fUFJJVl9TSVpFKTsKIAlyZXR1cm4geGRyX2FyZ3NpemVfY2hlY2socnFzdHAsIHApOwogfQogCmRpZmYgLS1naXQgYS9mcy9sb2NrZC94ZHI0LmMgYi9mcy9sb2NrZC94ZHI0LmMKaW5kZXggNTBjNDkzYS4uZTFkNTI4NiAxMDA2NDQKLS0tIGEvZnMvbG9ja2QveGRyNC5jCisrKyBiL2ZzL2xvY2tkL3hkcjQuYwpAQCAtMTcsNyArMTcsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9zdmMuaD4KICNpbmNsdWRlIDxsaW51eC9zdW5ycGMvc3RhdHMuaD4KICNpbmNsdWRlIDxsaW51eC9sb2NrZC9sb2NrZC5oPgotI2luY2x1ZGUgPGxpbnV4L2xvY2tkL3NtX2ludGVyLmg+CiAKICNkZWZpbmUgTkxNREJHX0ZBQ0lMSVRZCQlOTE1EQkdfWERSCiAKQEAgLTM1Niw4ICszNTUsOCBAQAogCWlmICghKHAgPSB4ZHJfZGVjb2RlX3N0cmluZ19pbnBsYWNlKHAsICZhcmdwLT5tb24sICZhcmdwLT5sZW4sIFNNX01BWFNUUkxFTikpKQogCQlyZXR1cm4gMDsKIAlhcmdwLT5zdGF0ZSA9IG50b2hsKCpwKyspOwotCS8qIFByZXNlcnZlIHRoZSBhZGRyZXNzIGluIG5ldHdvcmsgYnl0ZSBvcmRlciAqLwotCWFyZ3AtPmFkZHIgID0gKnArKzsKKwltZW1jcHkoJmFyZ3AtPnByaXYuZGF0YSwgcCwgc2l6ZW9mKGFyZ3AtPnByaXYuZGF0YSkpOworCXAgKz0gWERSX1FVQURMRU4oU01fUFJJVl9TSVpFKTsKIAlyZXR1cm4geGRyX2FyZ3NpemVfY2hlY2socnFzdHAsIHApOwogfQogCmRpZmYgLS1naXQgYS9mcy9taW5peC9kaXIuYyBiL2ZzL21pbml4L2Rpci5jCmluZGV4IGY3MDQzMzguLmQ0OTQ2YzQgMTAwNjQ0Ci0tLSBhL2ZzL21pbml4L2Rpci5jCisrKyBiL2ZzL21pbml4L2Rpci5jCkBAIC0yODAsNyArMjgwLDcgQEAKIAlyZXR1cm4gLUVJTlZBTDsKIAogZ290X2l0OgotCXBvcyA9IChwYWdlLT5pbmRleCA+PiBQQUdFX0NBQ0hFX1NISUZUKSArIHAgLSAoY2hhciopcGFnZV9hZGRyZXNzKHBhZ2UpOworCXBvcyA9IHBhZ2Vfb2Zmc2V0KHBhZ2UpICsgcCAtIChjaGFyICopcGFnZV9hZGRyZXNzKHBhZ2UpOwogCWVyciA9IF9fbWluaXhfd3JpdGVfYmVnaW4oTlVMTCwgcGFnZS0+bWFwcGluZywgcG9zLCBzYmktPnNfZGlyc2l6ZSwKIAkJCQkJQU9QX0ZMQUdfVU5JTlRFUlJVUFRJQkxFLCAmcGFnZSwgTlVMTCk7CiAJaWYgKGVycikKZGlmZiAtLWdpdCBhL2ZzL21wYWdlLmMgYi9mcy9tcGFnZS5jCmluZGV4IDU1MmI4MGIuLjE2YzNlZjMgMTAwNjQ0Ci0tLSBhL2ZzL21wYWdlLmMKKysrIGIvZnMvbXBhZ2UuYwpAQCAtMjQxLDcgKzI0MSw2IEBACiAJCQkJZmlyc3RfaG9sZSA9IHBhZ2VfYmxvY2s7CiAJCQlwYWdlX2Jsb2NrKys7CiAJCQlibG9ja19pbl9maWxlKys7Ci0JCQljbGVhcl9idWZmZXJfbWFwcGVkKG1hcF9iaCk7CiAJCQljb250aW51ZTsKIAkJfQogCkBAIC0zMDgsNyArMzA3LDEwIEBACiAJCWdvdG8gYWxsb2NfbmV3OwogCX0KIAotCWlmIChidWZmZXJfYm91bmRhcnkobWFwX2JoKSB8fCAoZmlyc3RfaG9sZSAhPSBibG9ja3NfcGVyX3BhZ2UpKQorCXJlbGF0aXZlX2Jsb2NrID0gYmxvY2tfaW5fZmlsZSAtICpmaXJzdF9sb2dpY2FsX2Jsb2NrOworCW5ibG9ja3MgPSBtYXBfYmgtPmJfc2l6ZSA+PiBibGtiaXRzOworCWlmICgoYnVmZmVyX2JvdW5kYXJ5KG1hcF9iaCkgJiYgcmVsYXRpdmVfYmxvY2sgPT0gbmJsb2NrcykgfHwKKwkgICAgKGZpcnN0X2hvbGUgIT0gYmxvY2tzX3Blcl9wYWdlKSkKIAkJYmlvID0gbXBhZ2VfYmlvX3N1Ym1pdChSRUFELCBiaW8pOwogCWVsc2UKIAkJKmxhc3RfYmxvY2tfaW5fYmlvID0gYmxvY2tzW2Jsb2Nrc19wZXJfcGFnZSAtIDFdOwpkaWZmIC0tZ2l0IGEvZnMvbmFtZWkuYyBiL2ZzL25hbWVpLmMKaW5kZXggZGYyZDNkZi4uZjA1YmVkMiAxMDA2NDQKLS0tIGEvZnMvbmFtZWkuYworKysgYi9mcy9uYW1laS5jCkBAIC0yNTcsNyArMjU3LDcgQEAKIAkJCXJldHVybiAtRUFDQ0VTOwogCX0KIAotCWlmIChpbm9kZS0+aV9vcCAmJiBpbm9kZS0+aV9vcC0+cGVybWlzc2lvbikKKwlpZiAoaW5vZGUtPmlfb3AtPnBlcm1pc3Npb24pCiAJCXJldHZhbCA9IGlub2RlLT5pX29wLT5wZXJtaXNzaW9uKGlub2RlLCBtYXNrKTsKIAllbHNlCiAJCXJldHZhbCA9IGdlbmVyaWNfcGVybWlzc2lvbihpbm9kZSwgbWFzaywgTlVMTCk7CkBAIC00MzIsNyArNDMyLDcgQEAKIHsKIAl1bW9kZV90CW1vZGUgPSBpbm9kZS0+aV9tb2RlOwogCi0JaWYgKGlub2RlLT5pX29wICYmIGlub2RlLT5pX29wLT5wZXJtaXNzaW9uKQorCWlmIChpbm9kZS0+aV9vcC0+cGVybWlzc2lvbikKIAkJcmV0dXJuIC1FQUdBSU47CiAKIAlpZiAoY3VycmVudF9mc3VpZCgpID09IGlub2RlLT5pX3VpZCkKQEAgLTkwOCw5ICs5MDgsNiBAQAogCQlpbm9kZSA9IG5leHQuZGVudHJ5LT5kX2lub2RlOwogCQlpZiAoIWlub2RlKQogCQkJZ290byBvdXRfZHB1dDsKLQkJZXJyID0gLUVOT1RESVI7IAotCQlpZiAoIWlub2RlLT5pX29wKQotCQkJZ290byBvdXRfZHB1dDsKIAogCQlpZiAoaW5vZGUtPmlfb3AtPmZvbGxvd19saW5rKSB7CiAJCQllcnIgPSBkb19mb2xsb3dfbGluaygmbmV4dCwgbmQpOwpAQCAtOTIwLDkgKzkxNyw2IEBACiAJCQlpbm9kZSA9IG5kLT5wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKIAkJCWlmICghaW5vZGUpCiAJCQkJYnJlYWs7Ci0JCQllcnIgPSAtRU5PVERJUjsgCi0JCQlpZiAoIWlub2RlLT5pX29wKQotCQkJCWJyZWFrOwogCQl9IGVsc2UKIAkJCXBhdGhfdG9fbmFtZWlkYXRhKCZuZXh0LCBuZCk7CiAJCWVyciA9IC1FTk9URElSOyAKQEAgLTk2MSw3ICs5NTUsNyBAQAogCQkJYnJlYWs7CiAJCWlub2RlID0gbmV4dC5kZW50cnktPmRfaW5vZGU7CiAJCWlmICgobG9va3VwX2ZsYWdzICYgTE9PS1VQX0ZPTExPVykKLQkJICAgICYmIGlub2RlICYmIGlub2RlLT5pX29wICYmIGlub2RlLT5pX29wLT5mb2xsb3dfbGluaykgeworCQkgICAgJiYgaW5vZGUgJiYgaW5vZGUtPmlfb3AtPmZvbGxvd19saW5rKSB7CiAJCQllcnIgPSBkb19mb2xsb3dfbGluaygmbmV4dCwgbmQpOwogCQkJaWYgKGVycikKIAkJCQlnb3RvIHJldHVybl9lcnI7CkBAIC05NzMsNyArOTY3LDcgQEAKIAkJCWJyZWFrOwogCQlpZiAobG9va3VwX2ZsYWdzICYgTE9PS1VQX0RJUkVDVE9SWSkgewogCQkJZXJyID0gLUVOT1RESVI7IAotCQkJaWYgKCFpbm9kZS0+aV9vcCB8fCAhaW5vZGUtPmlfb3AtPmxvb2t1cCkKKwkJCWlmICghaW5vZGUtPmlfb3AtPmxvb2t1cCkKIAkJCQlicmVhazsKIAkJfQogCQlnb3RvIHJldHVybl9iYXNlOwpAQCAtMTQ2OSw3ICsxNDYzLDcgQEAKIAlpZiAoZXJyb3IpCiAJCXJldHVybiBlcnJvcjsKIAotCWlmICghZGlyLT5pX29wIHx8ICFkaXItPmlfb3AtPmNyZWF0ZSkKKwlpZiAoIWRpci0+aV9vcC0+Y3JlYXRlKQogCQlyZXR1cm4gLUVBQ0NFUzsJLyogc2hvdWxkbid0IGl0IGJlIEVOT1NZUz8gKi8KIAltb2RlICY9IFNfSUFMTFVHTzsKIAltb2RlIHw9IFNfSUZSRUc7CkBAIC0xNzUyLDcgKzE3NDYsNyBAQAogCWVycm9yID0gLUVOT0VOVDsKIAlpZiAoIXBhdGguZGVudHJ5LT5kX2lub2RlKQogCQlnb3RvIGV4aXRfZHB1dDsKLQlpZiAocGF0aC5kZW50cnktPmRfaW5vZGUtPmlfb3AgJiYgcGF0aC5kZW50cnktPmRfaW5vZGUtPmlfb3AtPmZvbGxvd19saW5rKQorCWlmIChwYXRoLmRlbnRyeS0+ZF9pbm9kZS0+aV9vcC0+Zm9sbG93X2xpbmspCiAJCWdvdG8gZG9fbGluazsKIAogCXBhdGhfdG9fbmFtZWlkYXRhKCZwYXRoLCAmbmQpOwpAQCAtMTkzMyw3ICsxOTI3LDcgQEAKIAlpZiAoKFNfSVNDSFIobW9kZSkgfHwgU19JU0JMSyhtb2RlKSkgJiYgIWNhcGFibGUoQ0FQX01LTk9EKSkKIAkJcmV0dXJuIC1FUEVSTTsKIAotCWlmICghZGlyLT5pX29wIHx8ICFkaXItPmlfb3AtPm1rbm9kKQorCWlmICghZGlyLT5pX29wLT5ta25vZCkKIAkJcmV0dXJuIC1FUEVSTTsKIAogCWVycm9yID0gZGV2Y2dyb3VwX2lub2RlX21rbm9kKG1vZGUsIGRldik7CkBAIC0yMDM1LDcgKzIwMjksNyBAQAogCWlmIChlcnJvcikKIAkJcmV0dXJuIGVycm9yOwogCi0JaWYgKCFkaXItPmlfb3AgfHwgIWRpci0+aV9vcC0+bWtkaXIpCisJaWYgKCFkaXItPmlfb3AtPm1rZGlyKQogCQlyZXR1cm4gLUVQRVJNOwogCiAJbW9kZSAmPSAoU19JUldYVUdPfFNfSVNWVFgpOwpAQCAtMjEyNiw3ICsyMTIwLDcgQEAKIAlpZiAoZXJyb3IpCiAJCXJldHVybiBlcnJvcjsKIAotCWlmICghZGlyLT5pX29wIHx8ICFkaXItPmlfb3AtPnJtZGlyKQorCWlmICghZGlyLT5pX29wLT5ybWRpcikKIAkJcmV0dXJuIC1FUEVSTTsKIAogCURRVU9UX0lOSVQoZGlyKTsKQEAgLTIyMTMsNyArMjIwNyw3IEBACiAJaWYgKGVycm9yKQogCQlyZXR1cm4gZXJyb3I7CiAKLQlpZiAoIWRpci0+aV9vcCB8fCAhZGlyLT5pX29wLT51bmxpbmspCisJaWYgKCFkaXItPmlfb3AtPnVubGluaykKIAkJcmV0dXJuIC1FUEVSTTsKIAogCURRVU9UX0lOSVQoZGlyKTsKQEAgLTIzMjAsNyArMjMxNCw3IEBACiAJaWYgKGVycm9yKQogCQlyZXR1cm4gZXJyb3I7CiAKLQlpZiAoIWRpci0+aV9vcCB8fCAhZGlyLT5pX29wLT5zeW1saW5rKQorCWlmICghZGlyLT5pX29wLT5zeW1saW5rKQogCQlyZXR1cm4gLUVQRVJNOwogCiAJZXJyb3IgPSBzZWN1cml0eV9pbm9kZV9zeW1saW5rKGRpciwgZGVudHJ5LCBvbGRuYW1lKTsKQEAgLTI0MDEsNyArMjM5NSw3IEBACiAJICovCiAJaWYgKElTX0FQUEVORChpbm9kZSkgfHwgSVNfSU1NVVRBQkxFKGlub2RlKSkKIAkJcmV0dXJuIC1FUEVSTTsKLQlpZiAoIWRpci0+aV9vcCB8fCAhZGlyLT5pX29wLT5saW5rKQorCWlmICghZGlyLT5pX29wLT5saW5rKQogCQlyZXR1cm4gLUVQRVJNOwogCWlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpKQogCQlyZXR1cm4gLUVQRVJNOwpAQCAtMjYwOCw3ICsyNjAyLDcgQEAKIAlpZiAoZXJyb3IpCiAJCXJldHVybiBlcnJvcjsKIAotCWlmICghb2xkX2Rpci0+aV9vcCB8fCAhb2xkX2Rpci0+aV9vcC0+cmVuYW1lKQorCWlmICghb2xkX2Rpci0+aV9vcC0+cmVuYW1lKQogCQlyZXR1cm4gLUVQRVJNOwogCiAJRFFVT1RfSU5JVChvbGRfZGlyKTsKZGlmZiAtLWdpdCBhL2ZzL25jcGZzL2dldG9wdC5jIGIvZnMvbmNwZnMvZ2V0b3B0LmMKaW5kZXggMzM1YjAwMy4uMGFmMzM0OSAxMDA2NDQKLS0tIGEvZnMvbmNwZnMvZ2V0b3B0LmMKKysrIGIvZnMvbmNwZnMvZ2V0b3B0LmMKQEAgLTE2LDcgKzE2LDYgQEAKICAqCUBvcHRzOiBhbiBhcnJheSBvZiAmc3RydWN0IG9wdGlvbiBlbnRyaWVzIGNvbnRyb2xsaW5nIHBhcnNlciBvcGVyYXRpb25zCiAgKglAb3B0b3B0OiBvdXRwdXQ7IHdpbGwgY29udGFpbiB0aGUgY3VycmVudCBvcHRpb24KICAqCUBvcHRhcmc6IG91dHB1dDsgd2lsbCBjb250YWluIHRoZSB2YWx1ZSAoaWYgb25lIGV4aXN0cykKLSAqCUBmbGFnOiBvdXRwdXQ7IG1heSBiZSBOVUxMOyBzaG91bGQgcG9pbnQgdG8gYSBsb25nIGZvciBvcidpbmcgZmxhZ3MKICAqCUB2YWx1ZTogb3V0cHV0OyBtYXkgYmUgTlVMTDsgd2lsbCBiZSBvdmVyd3JpdHRlbiB3aXRoIHRoZSBpbnRlZ2VyIHZhbHVlCiAgKgkJb2YgdGhlIGN1cnJlbnQgYXJndW1lbnQuCiAgKgpkaWZmIC0tZ2l0IGEvZnMvbmNwZnMvaW9jdGwuYyBiL2ZzL25jcGZzL2lvY3RsLmMKaW5kZXggNmQwNGUwNS4uZjU0MzYwZiAxMDA2NDQKLS0tIGEvZnMvbmNwZnMvaW9jdGwuYworKysgYi9mcy9uY3Bmcy9pb2N0bC5jCkBAIC05OCw3ICs5OCw3IEBACiB7CiAJczMyCQlhdXRoX3R5cGU7CiAJdTMyCQlvYmplY3RfbmFtZV9sZW47Ci0JY29tcGF0X2NhZGRyX3QJb2JqZWN0X25hbWU7CS8qIGFuIHVzZXJzcGFjZSBkYXRhLCBpbiBtb3N0IGNhc2VzIHVzZXIgbmFtZSAqLworCWNvbXBhdF9jYWRkcl90CW9iamVjdF9uYW1lOwkvKiBhIHVzZXJzcGFjZSBkYXRhLCBpbiBtb3N0IGNhc2VzIHVzZXIgbmFtZSAqLwogfTsKIAogc3RydWN0IGNvbXBhdF9uY3BfZnNfaW5mb192MiB7CmRpZmYgLS1naXQgYS9mcy9uZnNkL2F1dGguYyBiL2ZzL25mc2QvYXV0aC5jCmluZGV4IDAxODRmZTkuLmM5MDNlMDQgMTAwNjQ0Ci0tLSBhL2ZzL25mc2QvYXV0aC5jCisrKyBiL2ZzL25mc2QvYXV0aC5jCkBAIC03NiwxMCArNzYsMTAgQEAKIAogCXJldCA9IHNldF9ncm91cHMobmV3LCBnaSk7CiAJcHV0X2dyb3VwX2luZm8oZ2kpOwotCWlmICghcmV0KQorCWlmIChyZXQgPCAwKQogCQlnb3RvIGVycm9yOwogCi0JaWYgKG5ldy0+dWlkKQorCWlmIChuZXctPmZzdWlkKQogCQluZXctPmNhcF9lZmZlY3RpdmUgPSBjYXBfZHJvcF9uZnNkX3NldChuZXctPmNhcF9lZmZlY3RpdmUpOwogCWVsc2UKIAkJbmV3LT5jYXBfZWZmZWN0aXZlID0gY2FwX3JhaXNlX25mc2Rfc2V0KG5ldy0+Y2FwX2VmZmVjdGl2ZSwKZGlmZiAtLWdpdCBhL2ZzL25mc2QvbmZzNGNhbGxiYWNrLmMgYi9mcy9uZnNkL25mczRjYWxsYmFjay5jCmluZGV4IDZkN2Q4YzAuLmM0NjQxODEgMTAwNjQ0Ci0tLSBhL2ZzL25mc2QvbmZzNGNhbGxiYWNrLmMKKysrIGIvZnMvbmZzZC9uZnM0Y2FsbGJhY2suYwpAQCAtNTMsOSArNTMsNiBAQAogI2RlZmluZSBORlNQUk9DNF9DQl9OVUxMIDAKICNkZWZpbmUgTkZTUFJPQzRfQ0JfQ09NUE9VTkQgMQogCi0vKiBkZWNsYXJhdGlvbnMgKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgcnBjX2NhbGxfb3BzIG5mczRfY2JfbnVsbF9vcHM7Ci0KIC8qIEluZGV4IG9mIHByZWRlZmluZWQgTGludXggY2FsbGJhY2sgY2xpZW50IG9wZXJhdGlvbnMgKi8KIAogZW51bSB7CmRpZmYgLS1naXQgYS9mcy9uZnNkL25mczRwcm9jLmMgYi9mcy9uZnNkL25mczRwcm9jLmMKaW5kZXggNjY5NDYxZS4uOWZhNjBhMyAxMDA2NDQKLS0tIGEvZnMvbmZzZC9uZnM0cHJvYy5jCisrKyBiL2ZzL25mc2QvbmZzNHByb2MuYwpAQCAtOTQ2LDYgKzk0NiwxMSBAQAogCQkJbmZzZDRfZW5jb2RlX29wZXJhdGlvbihyZXNwLCBvcCk7CiAJCQlzdGF0dXMgPSBvcC0+c3RhdHVzOwogCQl9CisKKwkJZHByaW50aygibmZzdjQgY29tcG91bmQgb3AgJXAgb3BjbnQgJWQgIyVkOiAlZDogc3RhdHVzICVkXG4iLAorCQkJYXJncy0+b3BzLCBhcmdzLT5vcGNudCwgcmVzcC0+b3BjbnQsIG9wLT5vcG51bSwKKwkJCWJlMzJfdG9fY3B1KHN0YXR1cykpOworCiAJCWlmIChjc3RhdGUtPnJlcGxheV9vd25lcikgewogCQkJbmZzNF9wdXRfc3RhdGVvd25lcihjc3RhdGUtPnJlcGxheV9vd25lcik7CiAJCQljc3RhdGUtPnJlcGxheV9vd25lciA9IE5VTEw7CmRpZmYgLS1naXQgYS9mcy9uZnNkL25mczRyZWNvdmVyLmMgYi9mcy9uZnNkL25mczRyZWNvdmVyLmMKaW5kZXggMGY5ZDZlZi4uNzRmN2I2NyAxMDA2NDQKLS0tIGEvZnMvbmZzZC9uZnM0cmVjb3Zlci5jCisrKyBiL2ZzL25mc2QvbmZzNHJlY292ZXIuYwpAQCAtMTE2LDkgKzExNiw5IEBACiAKIAltZDVfdG9faGV4KGRuYW1lLCBja3N1bS5kYXRhKTsKIAotCWtmcmVlKGNrc3VtLmRhdGEpOwogCXN0YXR1cyA9IG5mc19vazsKIG91dDoKKwlrZnJlZShja3N1bS5kYXRhKTsKIAljcnlwdG9fZnJlZV9oYXNoKGRlc2MudGZtKTsKIG91dF9ub190Zm06CiAJcmV0dXJuIHN0YXR1czsKZGlmZiAtLWdpdCBhL2ZzL25mc2QvbmZzNHN0YXRlLmMgYi9mcy9uZnNkL25mczRzdGF0ZS5jCmluZGV4IDEzZTBlMDcuLjg4ZGI3ZDMgMTAwNjQ0Ci0tLSBhL2ZzL25mc2QvbmZzNHN0YXRlLmMKKysrIGIvZnMvbmZzZC9uZnM0c3RhdGUuYwpAQCAtMjQxNiw2ICsyNDE2LDI2IEBACiAjZGVmaW5lIExPQ0tfSEFTSF9TSVpFICAgICAgICAgICAgICgxIDw8IExPQ0tfSEFTSF9CSVRTKQogI2RlZmluZSBMT0NLX0hBU0hfTUFTSyAgICAgICAgICAgICAoTE9DS19IQVNIX1NJWkUgLSAxKQogCitzdGF0aWMgaW5saW5lIHU2NAorZW5kX29mZnNldCh1NjQgc3RhcnQsIHU2NCBsZW4pCit7CisJdTY0IGVuZDsKKworCWVuZCA9IHN0YXJ0ICsgbGVuOworCXJldHVybiBlbmQgPj0gc3RhcnQgPyBlbmQ6IE5GUzRfTUFYX1VJTlQ2NDsKK30KKworLyogbGFzdCBvY3RldCBpbiBhIHJhbmdlICovCitzdGF0aWMgaW5saW5lIHU2NAorbGFzdF9ieXRlX29mZnNldCh1NjQgc3RhcnQsIHU2NCBsZW4pCit7CisJdTY0IGVuZDsKKworCUJVR19PTighbGVuKTsKKwllbmQgPSBzdGFydCArIGxlbjsKKwlyZXR1cm4gZW5kID4gc3RhcnQgPyBlbmQgLSAxOiBORlM0X01BWF9VSU5UNjQ7Cit9CisKICNkZWZpbmUgbG9ja293bmVyaWRfaGFzaHZhbChpZCkgXAogICAgICAgICAoKGlkKSAmIExPQ0tfSEFTSF9NQVNLKQogCkBAIC0yNDM1LDEzICsyNDU1LDEzIEBACiBzdGF0aWMgc3RydWN0IG5mczRfc3RhdGVpZCAqCiBmaW5kX3N0YXRlaWQoc3RhdGVpZF90ICpzdGlkLCBpbnQgZmxhZ3MpCiB7Ci0Jc3RydWN0IG5mczRfc3RhdGVpZCAqbG9jYWwgPSBOVUxMOworCXN0cnVjdCBuZnM0X3N0YXRlaWQgKmxvY2FsOwogCXUzMiBzdF9pZCA9IHN0aWQtPnNpX3N0YXRlb3duZXJpZDsKIAl1MzIgZl9pZCA9IHN0aWQtPnNpX2ZpbGVpZDsKIAl1bnNpZ25lZCBpbnQgaGFzaHZhbDsKIAogCWRwcmludGsoIk5GU0Q6IGZpbmRfc3RhdGVpZCBmbGFncyAweCV4XG4iLGZsYWdzKTsKLQlpZiAoKGZsYWdzICYgTE9DS19TVEFURSkgfHwgKGZsYWdzICYgUkRfU1RBVEUpIHx8IChmbGFncyAmIFdSX1NUQVRFKSkgeworCWlmIChmbGFncyAmIChMT0NLX1NUQVRFIHwgUkRfU1RBVEUgfCBXUl9TVEFURSkpIHsKIAkJaGFzaHZhbCA9IHN0YXRlaWRfaGFzaHZhbChzdF9pZCwgZl9pZCk7CiAJCWxpc3RfZm9yX2VhY2hfZW50cnkobG9jYWwsICZsb2Nrc3RhdGVpZF9oYXNodGJsW2hhc2h2YWxdLCBzdF9oYXNoKSB7CiAJCQlpZiAoKGxvY2FsLT5zdF9zdGF0ZWlkLnNpX3N0YXRlb3duZXJpZCA9PSBzdF9pZCkgJiYKQEAgLTI0NDksNyArMjQ2OSw4IEBACiAJCQkJcmV0dXJuIGxvY2FsOwogCQl9CiAJfSAKLQlpZiAoKGZsYWdzICYgT1BFTl9TVEFURSkgfHwgKGZsYWdzICYgUkRfU1RBVEUpIHx8IChmbGFncyAmIFdSX1NUQVRFKSkgeworCisJaWYgKGZsYWdzICYgKE9QRU5fU1RBVEUgfCBSRF9TVEFURSB8IFdSX1NUQVRFKSkgewogCQloYXNodmFsID0gc3RhdGVpZF9oYXNodmFsKHN0X2lkLCBmX2lkKTsKIAkJbGlzdF9mb3JfZWFjaF9lbnRyeShsb2NhbCwgJnN0YXRlaWRfaGFzaHRibFtoYXNodmFsXSwgc3RfaGFzaCkgewogCQkJaWYgKChsb2NhbC0+c3Rfc3RhdGVpZC5zaV9zdGF0ZW93bmVyaWQgPT0gc3RfaWQpICYmCkBAIC0yNTE4LDggKzI1MzksOCBAQAogCQlkZW55LT5sZF9jbGllbnRpZC5jbF9pZCA9IDA7CiAJfQogCWRlbnktPmxkX3N0YXJ0ID0gZmwtPmZsX3N0YXJ0OwotCWRlbnktPmxkX2xlbmd0aCA9IH4odTY0KTA7Ci0JaWYgKGZsLT5mbF9lbmQgIT0gfih1NjQpMCkKKwlkZW55LT5sZF9sZW5ndGggPSBORlM0X01BWF9VSU5UNjQ7CisJaWYgKGZsLT5mbF9lbmQgIT0gTkZTNF9NQVhfVUlOVDY0KQogCQlkZW55LT5sZF9sZW5ndGggPSBmbC0+ZmxfZW5kIC0gZmwtPmZsX3N0YXJ0ICsgMTsgICAgICAgIAogCWRlbnktPmxkX3R5cGUgPSBORlM0X1JFQURfTFQ7CiAJaWYgKGZsLT5mbF90eXBlICE9IEZfUkRMQ0spCkBAIC0yNjE2LDcgKzI2MzcsNyBAQAogc3RhdGljIGludAogY2hlY2tfbG9ja19sZW5ndGgodTY0IG9mZnNldCwgdTY0IGxlbmd0aCkKIHsKLQlyZXR1cm4gKChsZW5ndGggPT0gMCkgIHx8ICgobGVuZ3RoICE9IH4odTY0KTApICYmCisJcmV0dXJuICgobGVuZ3RoID09IDApICB8fCAoKGxlbmd0aCAhPSBORlM0X01BWF9VSU5UNjQpICYmCiAJICAgICBMT0ZGX09WRVJGTE9XKG9mZnNldCwgbGVuZ3RoKSkpOwogfQogCkBAIC0yNzM2LDExICsyNzU3LDcgQEAKIAlmaWxlX2xvY2suZmxfbG1vcHMgPSAmbmZzZF9wb3NpeF9tbmdfb3BzOwogCiAJZmlsZV9sb2NrLmZsX3N0YXJ0ID0gbG9jay0+bGtfb2Zmc2V0OwotCWlmICgobG9jay0+bGtfbGVuZ3RoID09IH4odTY0KTApIHx8IAotCQkJTE9GRl9PVkVSRkxPVyhsb2NrLT5sa19vZmZzZXQsIGxvY2stPmxrX2xlbmd0aCkpCi0JCWZpbGVfbG9jay5mbF9lbmQgPSB+KHU2NCkwOwotCWVsc2UKLQkJZmlsZV9sb2NrLmZsX2VuZCA9IGxvY2stPmxrX29mZnNldCArIGxvY2stPmxrX2xlbmd0aCAtIDE7CisJZmlsZV9sb2NrLmZsX2VuZCA9IGxhc3RfYnl0ZV9vZmZzZXQobG9jay0+bGtfb2Zmc2V0LCBsb2NrLT5sa19sZW5ndGgpOwogCW5mczRfdHJhbnNmb3JtX2xvY2tfb2Zmc2V0KCZmaWxlX2xvY2spOwogCiAJLyoKQEAgLTI3ODEsNiArMjc5OCwyNSBAQAogfQogCiAvKgorICogVGhlIE5GU3Y0IHNwZWMgYWxsb3dzIGEgY2xpZW50IHRvIGRvIGEgTE9DS1Qgd2l0aG91dCBob2xkaW5nIGFuIE9QRU4sCisgKiBzbyB3ZSBkbyBhIHRlbXBvcmFyeSBvcGVuIGhlcmUganVzdCB0byBnZXQgYW4gb3BlbiBmaWxlIHRvIHBhc3MgdG8KKyAqIHZmc190ZXN0X2xvY2suICAoQXJndWFibHkgcGVyaGFwcyB0ZXN0X2xvY2sgc2hvdWxkIGJlIGRvbmUgd2l0aCBhbgorICogaW5vZGUgb3BlcmF0aW9uLikKKyAqLworc3RhdGljIGludCBuZnNkX3Rlc3RfbG9jayhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3Qgc3ZjX2ZoICpmaHAsIHN0cnVjdCBmaWxlX2xvY2sgKmxvY2spCit7CisJc3RydWN0IGZpbGUgKmZpbGU7CisJaW50IGVycjsKKworCWVyciA9IG5mc2Rfb3BlbihycXN0cCwgZmhwLCBTX0lGUkVHLCBORlNEX01BWV9SRUFELCAmZmlsZSk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKwllcnIgPSB2ZnNfdGVzdF9sb2NrKGZpbGUsIGxvY2spOworCW5mc2RfY2xvc2UoZmlsZSk7CisJcmV0dXJuIGVycjsKK30KKworLyoKICAqIExPQ0tUIG9wZXJhdGlvbgogICovCiBfX2JlMzIKQEAgLTI3ODgsNyArMjgyNCw2IEBACiAJICAgIHN0cnVjdCBuZnNkNF9sb2NrdCAqbG9ja3QpCiB7CiAJc3RydWN0IGlub2RlICppbm9kZTsKLQlzdHJ1Y3QgZmlsZSBmaWxlOwogCXN0cnVjdCBmaWxlX2xvY2sgZmlsZV9sb2NrOwogCWludCBlcnJvcjsKIAlfX2JlMzIgc3RhdHVzOwpAQCAtMjgzOSwyMyArMjg3NCwxMiBAQAogCWZpbGVfbG9jay5mbF9sbW9wcyA9ICZuZnNkX3Bvc2l4X21uZ19vcHM7CiAKIAlmaWxlX2xvY2suZmxfc3RhcnQgPSBsb2NrdC0+bHRfb2Zmc2V0OwotCWlmICgobG9ja3QtPmx0X2xlbmd0aCA9PSB+KHU2NCkwKSB8fCBMT0ZGX09WRVJGTE9XKGxvY2t0LT5sdF9vZmZzZXQsIGxvY2t0LT5sdF9sZW5ndGgpKQotCQlmaWxlX2xvY2suZmxfZW5kID0gfih1NjQpMDsKLQllbHNlCi0JCWZpbGVfbG9jay5mbF9lbmQgPSBsb2NrdC0+bHRfb2Zmc2V0ICsgbG9ja3QtPmx0X2xlbmd0aCAtIDE7CisJZmlsZV9sb2NrLmZsX2VuZCA9IGxhc3RfYnl0ZV9vZmZzZXQobG9ja3QtPmx0X29mZnNldCwgbG9ja3QtPmx0X2xlbmd0aCk7CiAKIAluZnM0X3RyYW5zZm9ybV9sb2NrX29mZnNldCgmZmlsZV9sb2NrKTsKIAotCS8qIHZmc190ZXN0X2xvY2sgdXNlcyB0aGUgc3RydWN0IGZpbGUgX29ubHlfIHRvIHJlc29sdmUgdGhlIGlub2RlLgotCSAqIHNpbmNlIExPQ0tUIGRvZXNuJ3QgcmVxdWlyZSBhbiBPUEVOLCBhbmQgdGhlcmVmb3JlIGEgc3RydWN0Ci0JICogZmlsZSBtYXkgbm90IGV4aXN0LCBwYXNzIHZmc190ZXN0X2xvY2sgYSBzdHJ1Y3QgZmlsZSB3aXRoCi0JICogb25seSB0aGUgZGVudHJ5Omlub2RlIHNldC4KLQkgKi8KLQltZW1zZXQoJmZpbGUsIDAsIHNpemVvZiAoc3RydWN0IGZpbGUpKTsKLQlmaWxlLmZfcGF0aC5kZW50cnkgPSBjc3RhdGUtPmN1cnJlbnRfZmguZmhfZGVudHJ5OwotCiAJc3RhdHVzID0gbmZzX29rOwotCWVycm9yID0gdmZzX3Rlc3RfbG9jaygmZmlsZSwgJmZpbGVfbG9jayk7CisJZXJyb3IgPSBuZnNkX3Rlc3RfbG9jayhycXN0cCwgJmNzdGF0ZS0+Y3VycmVudF9maCwgJmZpbGVfbG9jayk7CiAJaWYgKGVycm9yKSB7CiAJCXN0YXR1cyA9IG5mc2Vycm5vKGVycm9yKTsKIAkJZ290byBvdXQ7CkBAIC0yOTA2LDEwICsyOTMwLDcgQEAKIAlmaWxlX2xvY2suZmxfbG1vcHMgPSAmbmZzZF9wb3NpeF9tbmdfb3BzOwogCWZpbGVfbG9jay5mbF9zdGFydCA9IGxvY2t1LT5sdV9vZmZzZXQ7CiAKLQlpZiAoKGxvY2t1LT5sdV9sZW5ndGggPT0gfih1NjQpMCkgfHwgTE9GRl9PVkVSRkxPVyhsb2NrdS0+bHVfb2Zmc2V0LCBsb2NrdS0+bHVfbGVuZ3RoKSkKLQkJZmlsZV9sb2NrLmZsX2VuZCA9IH4odTY0KTA7Ci0JZWxzZQotCQlmaWxlX2xvY2suZmxfZW5kID0gbG9ja3UtPmx1X29mZnNldCArIGxvY2t1LT5sdV9sZW5ndGggLSAxOworCWZpbGVfbG9jay5mbF9lbmQgPSBsYXN0X2J5dGVfb2Zmc2V0KGxvY2t1LT5sdV9vZmZzZXQsIGxvY2t1LT5sdV9sZW5ndGgpOwogCW5mczRfdHJhbnNmb3JtX2xvY2tfb2Zmc2V0KCZmaWxlX2xvY2spOwogCiAJLyoKZGlmZiAtLWdpdCBhL2ZzL25mc2QvbmZzNHhkci5jIGIvZnMvbmZzZC9uZnM0eGRyLmMKaW5kZXggYWZjZGY0Yi4uZjY1OTUzYiAxMDA2NDQKLS0tIGEvZnMvbmZzZC9uZnM0eGRyLmMKKysrIGIvZnMvbmZzZC9uZnM0eGRyLmMKQEAgLTEsNiArMSw0IEBACiAvKgotICogIGZzL25mcy9uZnM0eGRyLmMKLSAqCiAgKiAgU2VydmVyLXNpZGUgWERSIGZvciBORlN2NAogICoKICAqICBDb3B5cmlnaHQgKGMpIDIwMDIgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgTWljaGlnYW4uCmRpZmYgLS1naXQgYS9mcy9uZnNkL25mc2N0bC5jIGIvZnMvbmZzZC9uZnNjdGwuYwppbmRleCA3N2Q3YjhjLi4zZDkzYjIwIDEwMDY0NAotLS0gYS9mcy9uZnNkL25mc2N0bC5jCisrKyBiL2ZzL25mc2QvbmZzY3RsLmMKQEAgLTg0LDYgKzg0LDggQEAKIHN0YXRpYyBzc2l6ZV90IHdyaXRlX2dldGZkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyICpidWYsIHNpemVfdCBzaXplKTsKIHN0YXRpYyBzc2l6ZV90IHdyaXRlX2dldGZzKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyICpidWYsIHNpemVfdCBzaXplKTsKIHN0YXRpYyBzc2l6ZV90IHdyaXRlX2ZpbGVoYW5kbGUoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpOworc3RhdGljIHNzaXplX3Qgd3JpdGVfdW5sb2NrX2lwKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyICpidWYsIHNpemVfdCBzaXplKTsKK3N0YXRpYyBzc2l6ZV90IHdyaXRlX3VubG9ja19mcyhzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSk7CiBzdGF0aWMgc3NpemVfdCB3cml0ZV90aHJlYWRzKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyICpidWYsIHNpemVfdCBzaXplKTsKIHN0YXRpYyBzc2l6ZV90IHdyaXRlX3Bvb2xfdGhyZWFkcyhzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSk7CiBzdGF0aWMgc3NpemVfdCB3cml0ZV92ZXJzaW9ucyhzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSk7CkBAIC05NCw5ICs5Niw2IEBACiBzdGF0aWMgc3NpemVfdCB3cml0ZV9yZWNvdmVyeWRpcihzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSk7CiAjZW5kaWYKIAotc3RhdGljIHNzaXplX3QgZmFpbG92ZXJfdW5sb2NrX2lwKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyICpidWYsIHNpemVfdCBzaXplKTsKLXN0YXRpYyBzc2l6ZV90IGZhaWxvdmVyX3VubG9ja19mcyhzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSk7Ci0KIHN0YXRpYyBzc2l6ZV90ICgqd3JpdGVfb3BbXSkoc3RydWN0IGZpbGUgKiwgY2hhciAqLCBzaXplX3QpID0gewogCVtORlNEX1N2Y10gPSB3cml0ZV9zdmMsCiAJW05GU0RfQWRkXSA9IHdyaXRlX2FkZCwKQEAgLTEwNiw4ICsxMDUsOCBAQAogCVtORlNEX0dldGZkXSA9IHdyaXRlX2dldGZkLAogCVtORlNEX0dldGZzXSA9IHdyaXRlX2dldGZzLAogCVtORlNEX0ZoXSA9IHdyaXRlX2ZpbGVoYW5kbGUsCi0JW05GU0RfRk9fVW5sb2NrSVBdID0gZmFpbG92ZXJfdW5sb2NrX2lwLAotCVtORlNEX0ZPX1VubG9ja0ZTXSA9IGZhaWxvdmVyX3VubG9ja19mcywKKwlbTkZTRF9GT19VbmxvY2tJUF0gPSB3cml0ZV91bmxvY2tfaXAsCisJW05GU0RfRk9fVW5sb2NrRlNdID0gd3JpdGVfdW5sb2NrX2ZzLAogCVtORlNEX1RocmVhZHNdID0gd3JpdGVfdGhyZWFkcywKIAlbTkZTRF9Qb29sX1RocmVhZHNdID0gd3JpdGVfcG9vbF90aHJlYWRzLAogCVtORlNEX1ZlcnNpb25zXSA9IHdyaXRlX3ZlcnNpb25zLApAQCAtMTc2LDEwICsxNzUsMjQgQEAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKgogICogcGF5bG9hZCAtIHdyaXRlIG1ldGhvZHMKLSAqIElmIHRoZSBtZXRob2QgaGFzIGEgcmVzcG9uc2UsIHRoZSByZXNwb25zZSBzaG91bGQgYmUgcHV0IGluIGJ1ZiwKLSAqIGFuZCB0aGUgbGVuZ3RoIHJldHVybmVkLiAgT3RoZXJ3aXNlIHJldHVybiAwIG9yIGFuZCAtZXJyb3IuCiAgKi8KIAorLyoqCisgKiB3cml0ZV9zdmMgLSBTdGFydCBrZXJuZWwncyBORlNEIHNlcnZlcgorICoKKyAqIERlcHJlY2F0ZWQuICAvcHJvYy9mcy9uZnNkL3RocmVhZHMgaXMgcHJlZmVycmVkLgorICogRnVuY3Rpb24gcmVtYWlucyB0byBzdXBwb3J0IG9sZCB2ZXJzaW9ucyBvZiBuZnMtdXRpbHMuCisgKgorICogSW5wdXQ6CisgKgkJCWJ1ZjoJc3RydWN0IG5mc2N0bF9zdmMKKyAqCQkJCXN2Y19wb3J0Oglwb3J0IG51bWJlciBvZiB0aGlzCisgKgkJCQkJCXNlcnZlcidzIGxpc3RlbmVyCisgKgkJCQlzdmNfbnRocmVhZHM6CW51bWJlciBvZiB0aHJlYWRzIHRvIHN0YXJ0CisgKgkJCXNpemU6CXNpemUgaW4gYnl0ZXMgb2YgcGFzc2VkIGluIG5mc2N0bF9zdmMKKyAqIE91dHB1dDoKKyAqCU9uIHN1Y2Nlc3M6CXJldHVybnMgemVybworICoJT24gZXJyb3I6CXJldHVybiBjb2RlIGlzIG5lZ2F0aXZlIGVycm5vIHZhbHVlCisgKi8KIHN0YXRpYyBzc2l6ZV90IHdyaXRlX3N2YyhzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSkKIHsKIAlzdHJ1Y3QgbmZzY3RsX3N2YyAqZGF0YTsKQEAgLTE4OSw2ICsyMDIsMzAgQEAKIAlyZXR1cm4gbmZzZF9zdmMoZGF0YS0+c3ZjX3BvcnQsIGRhdGEtPnN2Y19udGhyZWFkcyk7CiB9CiAKKy8qKgorICogd3JpdGVfYWRkIC0gQWRkIG9yIG1vZGlmeSBjbGllbnQgZW50cnkgaW4gYXV0aCB1bml4IGNhY2hlCisgKgorICogRGVwcmVjYXRlZC4gIC9wcm9jL25ldC9ycGMvYXV0aC51bml4LmlwIGlzIHByZWZlcnJlZC4KKyAqIEZ1bmN0aW9uIHJlbWFpbnMgdG8gc3VwcG9ydCBvbGQgdmVyc2lvbnMgb2YgbmZzLXV0aWxzLgorICoKKyAqIElucHV0OgorICoJCQlidWY6CXN0cnVjdCBuZnNjdGxfY2xpZW50CisgKgkJCQljbF9pZGVudDoJJ1wwJy10ZXJtaW5hdGVkIEMgc3RyaW5nCisgKgkJCQkJCWNvbnRhaW5pbmcgZG9tYWluIG5hbWUKKyAqCQkJCQkJb2YgY2xpZW50CisgKgkJCQljbF9uYWRkcjoJbm8uIG9mIGl0ZW1zIGluIGNsX2FkZHJsaXN0CisgKgkJCQljbF9hZGRybGlzdDoJYXJyYXkgb2YgY2xpZW50IGFkZHJlc3NlcworICoJCQkJY2xfZmhrZXl0eXBlOglpZ25vcmVkCisgKgkJCQljbF9maGtleWxlbjoJaWdub3JlZAorICoJCQkJY2xfZmhrZXk6CWlnbm9yZWQKKyAqCQkJc2l6ZToJc2l6ZSBpbiBieXRlcyBvZiBwYXNzZWQgaW4gbmZzY3RsX2NsaWVudAorICogT3V0cHV0OgorICoJT24gc3VjY2VzczoJcmV0dXJucyB6ZXJvCisgKglPbiBlcnJvcjoJcmV0dXJuIGNvZGUgaXMgbmVnYXRpdmUgZXJybm8gdmFsdWUKKyAqCisgKiBOb3RlOiBPbmx5IEFGX0lORVQgY2xpZW50IGFkZHJlc3NlcyBhcmUgcGFzc2VkIGluLCBzaW5jZQorICogbmZzY3RsX2NsaWVudC5jbF9hZGRybGlzdCBjb250YWlucyBvbmx5IGluX2FkZHIgZmllbGRzIGZvciBhZGRyZXNzZXMuCisgKi8KIHN0YXRpYyBzc2l6ZV90IHdyaXRlX2FkZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSkKIHsKIAlzdHJ1Y3QgbmZzY3RsX2NsaWVudCAqZGF0YTsKQEAgLTE5OCw2ICsyMzUsMzAgQEAKIAlyZXR1cm4gZXhwX2FkZGNsaWVudChkYXRhKTsKIH0KIAorLyoqCisgKiB3cml0ZV9kZWwgLSBSZW1vdmUgY2xpZW50IGZyb20gYXV0aCB1bml4IGNhY2hlCisgKgorICogRGVwcmVjYXRlZC4gIC9wcm9jL25ldC9ycGMvYXV0aC51bml4LmlwIGlzIHByZWZlcnJlZC4KKyAqIEZ1bmN0aW9uIHJlbWFpbnMgdG8gc3VwcG9ydCBvbGQgdmVyc2lvbnMgb2YgbmZzLXV0aWxzLgorICoKKyAqIElucHV0OgorICoJCQlidWY6CXN0cnVjdCBuZnNjdGxfY2xpZW50CisgKgkJCQljbF9pZGVudDoJJ1wwJy10ZXJtaW5hdGVkIEMgc3RyaW5nCisgKgkJCQkJCWNvbnRhaW5pbmcgZG9tYWluIG5hbWUKKyAqCQkJCQkJb2YgY2xpZW50CisgKgkJCQljbF9uYWRkcjoJaWdub3JlZAorICoJCQkJY2xfYWRkcmxpc3Q6CWlnbm9yZWQKKyAqCQkJCWNsX2Zoa2V5dHlwZToJaWdub3JlZAorICoJCQkJY2xfZmhrZXlsZW46CWlnbm9yZWQKKyAqCQkJCWNsX2Zoa2V5OglpZ25vcmVkCisgKgkJCXNpemU6CXNpemUgaW4gYnl0ZXMgb2YgcGFzc2VkIGluIG5mc2N0bF9jbGllbnQKKyAqIE91dHB1dDoKKyAqCU9uIHN1Y2Nlc3M6CXJldHVybnMgemVybworICoJT24gZXJyb3I6CXJldHVybiBjb2RlIGlzIG5lZ2F0aXZlIGVycm5vIHZhbHVlCisgKgorICogTm90ZTogT25seSBBRl9JTkVUIGNsaWVudCBhZGRyZXNzZXMgYXJlIHBhc3NlZCBpbiwgc2luY2UKKyAqIG5mc2N0bF9jbGllbnQuY2xfYWRkcmxpc3QgY29udGFpbnMgb25seSBpbl9hZGRyIGZpZWxkcyBmb3IgYWRkcmVzc2VzLgorICovCiBzdGF0aWMgc3NpemVfdCB3cml0ZV9kZWwoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpCiB7CiAJc3RydWN0IG5mc2N0bF9jbGllbnQgKmRhdGE7CkBAIC0yMDcsNiArMjY4LDMzIEBACiAJcmV0dXJuIGV4cF9kZWxjbGllbnQoZGF0YSk7CiB9CiAKKy8qKgorICogd3JpdGVfZXhwb3J0IC0gRXhwb3J0IHBhcnQgb3IgYWxsIG9mIGEgbG9jYWwgZmlsZSBzeXN0ZW0KKyAqCisgKiBEZXByZWNhdGVkLiAgL3Byb2MvbmV0L3JwYy97bmZzZC5leHBvcnQsbmZzZC5maH0gYXJlIHByZWZlcnJlZC4KKyAqIEZ1bmN0aW9uIHJlbWFpbnMgdG8gc3VwcG9ydCBvbGQgdmVyc2lvbnMgb2YgbmZzLXV0aWxzLgorICoKKyAqIElucHV0OgorICoJCQlidWY6CXN0cnVjdCBuZnNjdGxfZXhwb3J0CisgKgkJCQlleF9jbGllbnQ6CSdcMCctdGVybWluYXRlZCBDIHN0cmluZworICoJCQkJCQljb250YWluaW5nIGRvbWFpbiBuYW1lCisgKgkJCQkJCW9mIGNsaWVudCBhbGxvd2VkIHRvIGFjY2VzcworICoJCQkJCQl0aGlzIGV4cG9ydAorICoJCQkJZXhfcGF0aDoJJ1wwJy10ZXJtaW5hdGVkIEMgc3RyaW5nCisgKgkJCQkJCWNvbnRhaW5pbmcgcGF0aG5hbWUgb2YKKyAqCQkJCQkJZGlyZWN0b3J5IGluIGxvY2FsIGZpbGUgc3lzdGVtCisgKgkJCQlleF9kZXY6CQlmc2lkIHRvIHVzZSBmb3IgdGhpcyBleHBvcnQKKyAqCQkJCWV4X2lubzoJCWlnbm9yZWQKKyAqCQkJCWV4X2ZsYWdzOglleHBvcnQgZmxhZ3MgZm9yIHRoaXMgZXhwb3J0CisgKgkJCQlleF9hbm9uX3VpZDoJVUlEIHRvIHVzZSBmb3IgYW5vbnltb3VzCisgKgkJCQkJCXJlcXVlc3RzCisgKgkJCQlleF9hbm9uX2dpZDoJR0lEIHRvIHVzZSBmb3IgYW5vbnltb3VzCisgKgkJCQkJCXJlcXVlc3RzCisgKgkJCXNpemU6CXNpemUgaW4gYnl0ZXMgb2YgcGFzc2VkIGluIG5mc2N0bF9leHBvcnQKKyAqIE91dHB1dDoKKyAqCU9uIHN1Y2Nlc3M6CXJldHVybnMgemVybworICoJT24gZXJyb3I6CXJldHVybiBjb2RlIGlzIG5lZ2F0aXZlIGVycm5vIHZhbHVlCisgKi8KIHN0YXRpYyBzc2l6ZV90IHdyaXRlX2V4cG9ydChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSkKIHsKIAlzdHJ1Y3QgbmZzY3RsX2V4cG9ydCAqZGF0YTsKQEAgLTIxNiw2ICszMDQsMzEgQEAKIAlyZXR1cm4gZXhwX2V4cG9ydChkYXRhKTsKIH0KIAorLyoqCisgKiB3cml0ZV91bmV4cG9ydCAtIFVuZXhwb3J0IGEgcHJldmlvdXNseSBleHBvcnRlZCBmaWxlIHN5c3RlbQorICoKKyAqIERlcHJlY2F0ZWQuICAvcHJvYy9uZXQvcnBjL3tuZnNkLmV4cG9ydCxuZnNkLmZofSBhcmUgcHJlZmVycmVkLgorICogRnVuY3Rpb24gcmVtYWlucyB0byBzdXBwb3J0IG9sZCB2ZXJzaW9ucyBvZiBuZnMtdXRpbHMuCisgKgorICogSW5wdXQ6CisgKgkJCWJ1ZjoJc3RydWN0IG5mc2N0bF9leHBvcnQKKyAqCQkJCWV4X2NsaWVudDoJJ1wwJy10ZXJtaW5hdGVkIEMgc3RyaW5nCisgKgkJCQkJCWNvbnRhaW5pbmcgZG9tYWluIG5hbWUKKyAqCQkJCQkJb2YgY2xpZW50IG5vIGxvbmdlciBhbGxvd2VkCisgKgkJCQkJCXRvIGFjY2VzcyB0aGlzIGV4cG9ydAorICoJCQkJZXhfcGF0aDoJJ1wwJy10ZXJtaW5hdGVkIEMgc3RyaW5nCisgKgkJCQkJCWNvbnRhaW5pbmcgcGF0aG5hbWUgb2YKKyAqCQkJCQkJZGlyZWN0b3J5IGluIGxvY2FsIGZpbGUgc3lzdGVtCisgKgkJCQlleF9kZXY6CQlpZ25vcmVkCisgKgkJCQlleF9pbm86CQlpZ25vcmVkCisgKgkJCQlleF9mbGFnczoJaWdub3JlZAorICoJCQkJZXhfYW5vbl91aWQ6CWlnbm9yZWQKKyAqCQkJCWV4X2Fub25fZ2lkOglpZ25vcmVkCisgKgkJCXNpemU6CXNpemUgaW4gYnl0ZXMgb2YgcGFzc2VkIGluIG5mc2N0bF9leHBvcnQKKyAqIE91dHB1dDoKKyAqCU9uIHN1Y2Nlc3M6CXJldHVybnMgemVybworICoJT24gZXJyb3I6CXJldHVybiBjb2RlIGlzIG5lZ2F0aXZlIGVycm5vIHZhbHVlCisgKi8KIHN0YXRpYyBzc2l6ZV90IHdyaXRlX3VuZXhwb3J0KHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyICpidWYsIHNpemVfdCBzaXplKQogewogCXN0cnVjdCBuZnNjdGxfZXhwb3J0ICpkYXRhOwpAQCAtMjI2LDYgKzMzOSwzMCBAQAogCXJldHVybiBleHBfdW5leHBvcnQoZGF0YSk7CiB9CiAKKy8qKgorICogd3JpdGVfZ2V0ZnMgLSBHZXQgYSB2YXJpYWJsZS1sZW5ndGggTkZTIGZpbGUgaGFuZGxlIGJ5IHBhdGgKKyAqCisgKiBEZXByZWNhdGVkLiAgL3Byb2MvZnMvbmZzZC9maWxlaGFuZGxlIGlzIHByZWZlcnJlZC4KKyAqIEZ1bmN0aW9uIHJlbWFpbnMgdG8gc3VwcG9ydCBvbGQgdmVyc2lvbnMgb2YgbmZzLXV0aWxzLgorICoKKyAqIElucHV0OgorICoJCQlidWY6CXN0cnVjdCBuZnNjdGxfZnNwYXJtCisgKgkJCQlnZF9hZGRyOglzb2NrZXQgYWRkcmVzcyBvZiBjbGllbnQKKyAqCQkJCWdkX3BhdGg6CSdcMCctdGVybWluYXRlZCBDIHN0cmluZworICoJCQkJCQljb250YWluaW5nIHBhdGhuYW1lIG9mCisgKgkJCQkJCWRpcmVjdG9yeSBpbiBsb2NhbCBmaWxlIHN5c3RlbQorICoJCQkJZ2RfbWF4bGVuOgltYXhpbXVtIHNpemUgb2YgcmV0dXJuZWQgZmlsZQorICoJCQkJCQloYW5kbGUKKyAqCQkJc2l6ZToJc2l6ZSBpbiBieXRlcyBvZiBwYXNzZWQgaW4gbmZzY3RsX2ZzcGFybQorICogT3V0cHV0OgorICoJT24gc3VjY2VzczoJcGFzc2VkLWluIGJ1ZmZlciBmaWxsZWQgd2l0aCBhIGtuZnNkX2ZoIHN0cnVjdHVyZQorICoJCQkoYSB2YXJpYWJsZS1sZW5ndGggcmF3IE5GUyBmaWxlIGhhbmRsZSk7CisgKgkJCXJldHVybiBjb2RlIGlzIHRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSBmaWxlIGhhbmRsZQorICoJT24gZXJyb3I6CXJldHVybiBjb2RlIGlzIG5lZ2F0aXZlIGVycm5vIHZhbHVlCisgKgorICogTm90ZTogT25seSBBRl9JTkVUIGNsaWVudCBhZGRyZXNzZXMgYXJlIHBhc3NlZCBpbiwgc2luY2UgZ2RfYWRkcgorICogaXMgdGhlIHNhbWUgc2l6ZSBhcyBhIHN0cnVjdCBzb2NrYWRkcl9pbi4KKyAqLwogc3RhdGljIHNzaXplX3Qgd3JpdGVfZ2V0ZnMoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpCiB7CiAJc3RydWN0IG5mc2N0bF9mc3Bhcm0gKmRhdGE7CkBAIC0yNjUsNiArNDAyLDI5IEBACiAJcmV0dXJuIGVycjsKIH0KIAorLyoqCisgKiB3cml0ZV9nZXRmZCAtIEdldCBhIGZpeGVkLWxlbmd0aCBORlMgZmlsZSBoYW5kbGUgYnkgcGF0aCAodXNlZCBieSBtb3VudGQpCisgKgorICogRGVwcmVjYXRlZC4gIC9wcm9jL2ZzL25mc2QvZmlsZWhhbmRsZSBpcyBwcmVmZXJyZWQuCisgKiBGdW5jdGlvbiByZW1haW5zIHRvIHN1cHBvcnQgb2xkIHZlcnNpb25zIG9mIG5mcy11dGlscy4KKyAqCisgKiBJbnB1dDoKKyAqCQkJYnVmOglzdHJ1Y3QgbmZzY3RsX2ZkcGFybQorICoJCQkJZ2RfYWRkcjoJc29ja2V0IGFkZHJlc3Mgb2YgY2xpZW50CisgKgkJCQlnZF9wYXRoOgknXDAnLXRlcm1pbmF0ZWQgQyBzdHJpbmcKKyAqCQkJCQkJY29udGFpbmluZyBwYXRobmFtZSBvZgorICoJCQkJCQlkaXJlY3RvcnkgaW4gbG9jYWwgZmlsZSBzeXN0ZW0KKyAqCQkJCWdkX3ZlcnNpb246CWZkcGFybSBzdHJ1Y3R1cmUgdmVyc2lvbgorICoJCQlzaXplOglzaXplIGluIGJ5dGVzIG9mIHBhc3NlZCBpbiBuZnNjdGxfZmRwYXJtCisgKiBPdXRwdXQ6CisgKglPbiBzdWNjZXNzOglwYXNzZWQtaW4gYnVmZmVyIGZpbGxlZCB3aXRoIG5mc2N0bF9yZXMKKyAqCQkJKGEgZml4ZWQtbGVuZ3RoIHJhdyBORlMgZmlsZSBoYW5kbGUpOworICoJCQlyZXR1cm4gY29kZSBpcyB0aGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgZmlsZSBoYW5kbGUKKyAqCU9uIGVycm9yOglyZXR1cm4gY29kZSBpcyBuZWdhdGl2ZSBlcnJubyB2YWx1ZQorICoKKyAqIE5vdGU6IE9ubHkgQUZfSU5FVCBjbGllbnQgYWRkcmVzc2VzIGFyZSBwYXNzZWQgaW4sIHNpbmNlIGdkX2FkZHIKKyAqIGlzIHRoZSBzYW1lIHNpemUgYXMgYSBzdHJ1Y3Qgc29ja2FkZHJfaW4uCisgKi8KIHN0YXRpYyBzc2l6ZV90IHdyaXRlX2dldGZkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyICpidWYsIHNpemVfdCBzaXplKQogewogCXN0cnVjdCBuZnNjdGxfZmRwYXJtICpkYXRhOwpAQCAtMzA5LDcgKzQ2OSwyMyBAQAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IGZhaWxvdmVyX3VubG9ja19pcChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSkKKy8qKgorICogd3JpdGVfdW5sb2NrX2lwIC0gUmVsZWFzZSBhbGwgbG9ja3MgdXNlZCBieSBhIGNsaWVudAorICoKKyAqIEV4cGVyaW1lbnRhbC4KKyAqCisgKiBJbnB1dDoKKyAqCQkJYnVmOgknXG4nLXRlcm1pbmF0ZWQgQyBzdHJpbmcgY29udGFpbmluZyBhCisgKgkJCQlwcmVzZW50YXRpb24gZm9ybWF0IElQdjQgYWRkcmVzcworICoJCQlzaXplOglsZW5ndGggb2YgQyBzdHJpbmcgaW4gQGJ1ZgorICogT3V0cHV0OgorICoJT24gc3VjY2VzczoJcmV0dXJucyB6ZXJvIGlmIGFsbCBzcGVjaWZpZWQgbG9ja3Mgd2VyZSByZWxlYXNlZDsKKyAqCQkJcmV0dXJucyBvbmUgaWYgb25lIG9yIG1vcmUgbG9ja3Mgd2VyZSBub3QgcmVsZWFzZWQKKyAqCU9uIGVycm9yOglyZXR1cm4gY29kZSBpcyBuZWdhdGl2ZSBlcnJubyB2YWx1ZQorICoKKyAqIE5vdGU6IE9ubHkgQUZfSU5FVCBjbGllbnQgYWRkcmVzc2VzIGFyZSBwYXNzZWQgaW4KKyAqLworc3RhdGljIHNzaXplX3Qgd3JpdGVfdW5sb2NrX2lwKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyICpidWYsIHNpemVfdCBzaXplKQogewogCXN0cnVjdCBzb2NrYWRkcl9pbiBzaW4gPSB7CiAJCS5zaW5fZmFtaWx5CT0gQUZfSU5FVCwKQEAgLTMzOSw3ICs1MTUsMjEgQEAKIAlyZXR1cm4gbmxtc3ZjX3VubG9ja19hbGxfYnlfaXAoKHN0cnVjdCBzb2NrYWRkciAqKSZzaW4pOwogfQogCi1zdGF0aWMgc3NpemVfdCBmYWlsb3Zlcl91bmxvY2tfZnMoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpCisvKioKKyAqIHdyaXRlX3VubG9ja19mcyAtIFJlbGVhc2UgYWxsIGxvY2tzIG9uIGEgbG9jYWwgZmlsZSBzeXN0ZW0KKyAqCisgKiBFeHBlcmltZW50YWwuCisgKgorICogSW5wdXQ6CisgKgkJCWJ1ZjoJJ1xuJy10ZXJtaW5hdGVkIEMgc3RyaW5nIGNvbnRhaW5pbmcgdGhlCisgKgkJCQlhYnNvbHV0ZSBwYXRobmFtZSBvZiBhIGxvY2FsIGZpbGUgc3lzdGVtCisgKgkJCXNpemU6CWxlbmd0aCBvZiBDIHN0cmluZyBpbiBAYnVmCisgKiBPdXRwdXQ6CisgKglPbiBzdWNjZXNzOglyZXR1cm5zIHplcm8gaWYgYWxsIHNwZWNpZmllZCBsb2NrcyB3ZXJlIHJlbGVhc2VkOworICoJCQlyZXR1cm5zIG9uZSBpZiBvbmUgb3IgbW9yZSBsb2NrcyB3ZXJlIG5vdCByZWxlYXNlZAorICoJT24gZXJyb3I6CXJldHVybiBjb2RlIGlzIG5lZ2F0aXZlIGVycm5vIHZhbHVlCisgKi8KK3N0YXRpYyBzc2l6ZV90IHdyaXRlX3VubG9ja19mcyhzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSkKIHsKIAlzdHJ1Y3QgcGF0aCBwYXRoOwogCWNoYXIgKmZvX3BhdGg7CkBAIC0zNjAsMjEgKzU1MCw0NCBAQAogCWlmIChlcnJvcikKIAkJcmV0dXJuIGVycm9yOwogCisJLyoKKwkgKiBYWFg6IE5lZWRzIGJldHRlciBzYW5pdHkgY2hlY2tpbmcuICBPdGhlcndpc2Ugd2UgY291bGQgZW5kIHVwCisJICogcmVsZWFzaW5nIGxvY2tzIG9uIHRoZSB3cm9uZyBmaWxlIHN5c3RlbS4KKwkgKgorCSAqIEZvciBleGFtcGxlOgorCSAqIDEuICBEb2VzIHRoZSBwYXRoIHJlZmVyIHRvIGEgZGlyZWN0b3J5PworCSAqIDIuICBJcyB0aGF0IGRpcmVjdG9yeSBhIG1vdW50IHBvaW50LCBvcgorCSAqIDMuICBJcyB0aGF0IGRpcmVjdG9yeSB0aGUgcm9vdCBvZiBhbiBleHBvcnRlZCBmaWxlIHN5c3RlbT8KKwkgKi8KIAllcnJvciA9IG5sbXN2Y191bmxvY2tfYWxsX2J5X3NiKHBhdGgubW50LT5tbnRfc2IpOwogCiAJcGF0aF9wdXQoJnBhdGgpOwogCXJldHVybiBlcnJvcjsKIH0KIAorLyoqCisgKiB3cml0ZV9maWxlaGFuZGxlIC0gR2V0IGEgdmFyaWFibGUtbGVuZ3RoIE5GUyBmaWxlIGhhbmRsZSBieSBwYXRoCisgKgorICogT24gaW5wdXQsIHRoZSBidWZmZXIgY29udGFpbnMgYSAnXG4nLXRlcm1pbmF0ZWQgQyBzdHJpbmcgY29tcHJpc2VkIG9mCisgKiB0aHJlZSBhbHBoYW51bWVyaWMgd29yZHMgc2VwYXJhdGVkIGJ5IHdoaXRlc3BhY2UuICBUaGUgc3RyaW5nIG1heQorICogY29udGFpbiBlc2NhcGUgc2VxdWVuY2VzLgorICoKKyAqIElucHV0OgorICoJCQlidWY6CisgKgkJCQlkb21haW46CQljbGllbnQgZG9tYWluIG5hbWUKKyAqCQkJCXBhdGg6CQlleHBvcnQgcGF0aG5hbWUKKyAqCQkJCW1heHNpemU6CW51bWVyaWMgbWF4aW11bSBzaXplIG9mCisgKgkJCQkJCUBidWYKKyAqCQkJc2l6ZToJbGVuZ3RoIG9mIEMgc3RyaW5nIGluIEBidWYKKyAqIE91dHB1dDoKKyAqCU9uIHN1Y2Nlc3M6CXBhc3NlZC1pbiBidWZmZXIgZmlsbGVkIHdpdGggJ1xuJy10ZXJtaW5hdGVkIEMKKyAqCQkJc3RyaW5nIGNvbnRhaW5pbmcgYSBBU0NJSSBoZXggdGV4dCB2ZXJzaW9uCisgKgkJCW9mIHRoZSBORlMgZmlsZSBoYW5kbGU7CisgKgkJCXJldHVybiBjb2RlIGlzIHRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSBzdHJpbmcKKyAqCU9uIGVycm9yOglyZXR1cm4gY29kZSBpcyBuZWdhdGl2ZSBlcnJubyB2YWx1ZQorICovCiBzdGF0aWMgc3NpemVfdCB3cml0ZV9maWxlaGFuZGxlKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyICpidWYsIHNpemVfdCBzaXplKQogewotCS8qIHJlcXVlc3QgaXM6Ci0JICogICBkb21haW4gcGF0aCBtYXhzaXplCi0JICogcmVzcG9uc2UgaXMKLQkgKiAgIGZpbGVoYW5kbGUKLQkgKgotCSAqIHF3b3JkIHF1b3RpbmcgaXMgdXNlZCwgc28gZmlsZWhhbmRsZSB3aWxsIGJlIFx4Li4uLgotCSAqLwogCWNoYXIgKmRuYW1lLCAqcGF0aDsKIAlpbnQgdW5pbml0aWFsaXplZF92YXIobWF4c2l6ZSk7CiAJY2hhciAqbWVzZyA9IGJ1ZjsKQEAgLTM5MSwxMSArNjA0LDEzIEBACiAKIAlkbmFtZSA9IG1lc2c7CiAJbGVuID0gcXdvcmRfZ2V0KCZtZXNnLCBkbmFtZSwgc2l6ZSk7Ci0JaWYgKGxlbiA8PSAwKSByZXR1cm4gLUVJTlZBTDsKKwlpZiAobGVuIDw9IDApCisJCXJldHVybiAtRUlOVkFMOwogCQogCXBhdGggPSBkbmFtZStsZW4rMTsKIAlsZW4gPSBxd29yZF9nZXQoJm1lc2csIHBhdGgsIHNpemUpOwotCWlmIChsZW4gPD0gMCkgcmV0dXJuIC1FSU5WQUw7CisJaWYgKGxlbiA8PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKIAogCWxlbiA9IGdldF9pbnQoJm1lc2csICZtYXhzaXplKTsKIAlpZiAobGVuKQpAQCAtNDE5LDE3ICs2MzQsNDMgQEAKIAlpZiAobGVuKQogCQlyZXR1cm4gbGVuOwogCQotCW1lc2cgPSBidWY7IGxlbiA9IFNJTVBMRV9UUkFOU0FDVElPTl9MSU1JVDsKKwltZXNnID0gYnVmOworCWxlbiA9IFNJTVBMRV9UUkFOU0FDVElPTl9MSU1JVDsKIAlxd29yZF9hZGRoZXgoJm1lc2csICZsZW4sIChjaGFyKikmZmguZmhfYmFzZSwgZmguZmhfc2l6ZSk7CiAJbWVzZ1stMV0gPSAnXG4nOwogCXJldHVybiBtZXNnIC0gYnVmOwkKIH0KIAorLyoqCisgKiB3cml0ZV90aHJlYWRzIC0gU3RhcnQgTkZTRCwgb3IgcmVwb3J0IHRoZSBjdXJyZW50IG51bWJlciBvZiBydW5uaW5nIHRocmVhZHMKKyAqCisgKiBJbnB1dDoKKyAqCQkJYnVmOgkJaWdub3JlZAorICoJCQlzaXplOgkJemVybworICogT3V0cHV0OgorICoJT24gc3VjY2VzczoJcGFzc2VkLWluIGJ1ZmZlciBmaWxsZWQgd2l0aCAnXG4nLXRlcm1pbmF0ZWQgQworICoJCQlzdHJpbmcgbnVtZXJpYyB2YWx1ZSByZXByZXNlbnRpbmcgdGhlIG51bWJlciBvZgorICoJCQlydW5uaW5nIE5GU0QgdGhyZWFkczsKKyAqCQkJcmV0dXJuIGNvZGUgaXMgdGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIHN0cmluZworICoJT24gZXJyb3I6CXJldHVybiBjb2RlIGlzIHplcm8KKyAqCisgKiBPUgorICoKKyAqIElucHV0OgorICoJCQlidWY6CQlDIHN0cmluZyBjb250YWluaW5nIGFuIHVuc2lnbmVkCisgKgkJCQkJaW50ZWdlciB2YWx1ZSByZXByZXNlbnRpbmcgdGhlCisgKgkJCQkJbnVtYmVyIG9mIE5GU0QgdGhyZWFkcyB0byBzdGFydAorICoJCQlzaXplOgkJbm9uLXplcm8gbGVuZ3RoIG9mIEMgc3RyaW5nIGluIEBidWYKKyAqIE91dHB1dDoKKyAqCU9uIHN1Y2Nlc3M6CU5GUyBzZXJ2aWNlIGlzIHN0YXJ0ZWQ7CisgKgkJCXBhc3NlZC1pbiBidWZmZXIgZmlsbGVkIHdpdGggJ1xuJy10ZXJtaW5hdGVkIEMKKyAqCQkJc3RyaW5nIG51bWVyaWMgdmFsdWUgcmVwcmVzZW50aW5nIHRoZSBudW1iZXIgb2YKKyAqCQkJcnVubmluZyBORlNEIHRocmVhZHM7CisgKgkJCXJldHVybiBjb2RlIGlzIHRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSBzdHJpbmcKKyAqCU9uIGVycm9yOglyZXR1cm4gY29kZSBpcyB6ZXJvIG9yIGEgbmVnYXRpdmUgZXJybm8gdmFsdWUKKyAqLwogc3RhdGljIHNzaXplX3Qgd3JpdGVfdGhyZWFkcyhzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSkKIHsKLQkvKiBpZiBzaXplID4gMCwgbG9vayBmb3IgYSBudW1iZXIgb2YgdGhyZWFkcyBhbmQgY2FsbCBuZnNkX3N2YwotCSAqIHRoZW4gd3JpdGUgb3V0IG51bWJlciBvZiB0aHJlYWRzIGFzIHJlcGx5Ci0JICovCiAJY2hhciAqbWVzZyA9IGJ1ZjsKIAlpbnQgcnY7CiAJaWYgKHNpemUgPiAwKSB7CkBAIC00MzcsOSArNjc4LDkgQEAKIAkJcnYgPSBnZXRfaW50KCZtZXNnLCAmbmV3dGhyZWFkcyk7CiAJCWlmIChydikKIAkJCXJldHVybiBydjsKLQkJaWYgKG5ld3RocmVhZHMgPDApCisJCWlmIChuZXd0aHJlYWRzIDwgMCkKIAkJCXJldHVybiAtRUlOVkFMOwotCQlydiA9IG5mc2Rfc3ZjKDIwNDksIG5ld3RocmVhZHMpOworCQlydiA9IG5mc2Rfc3ZjKE5GU19QT1JULCBuZXd0aHJlYWRzKTsKIAkJaWYgKHJ2KQogCQkJcmV0dXJuIHJ2OwogCX0KQEAgLTQ0Nyw2ICs2ODgsMjggQEAKIAlyZXR1cm4gc3RybGVuKGJ1Zik7CiB9CiAKKy8qKgorICogd3JpdGVfcG9vbF90aHJlYWRzIC0gU2V0IG9yIHJlcG9ydCB0aGUgY3VycmVudCBudW1iZXIgb2YgdGhyZWFkcyBwZXIgcG9vbAorICoKKyAqIElucHV0OgorICoJCQlidWY6CQlpZ25vcmVkCisgKgkJCXNpemU6CQl6ZXJvCisgKgorICogT1IKKyAqCisgKiBJbnB1dDoKKyAqIAkJCWJ1ZjoJCUMgc3RyaW5nIGNvbnRhaW5pbmcgd2hpdGVzcGFjZS0KKyAqIAkJCQkJc2VwYXJhdGVkIHVuc2lnbmVkIGludGVnZXIgdmFsdWVzCisgKgkJCQkJcmVwcmVzZW50aW5nIHRoZSBudW1iZXIgb2YgTkZTRAorICoJCQkJCXRocmVhZHMgdG8gc3RhcnQgaW4gZWFjaCBwb29sCisgKgkJCXNpemU6CQlub24temVybyBsZW5ndGggb2YgQyBzdHJpbmcgaW4gQGJ1ZgorICogT3V0cHV0OgorICoJT24gc3VjY2VzczoJcGFzc2VkLWluIGJ1ZmZlciBmaWxsZWQgd2l0aCAnXG4nLXRlcm1pbmF0ZWQgQworICoJCQlzdHJpbmcgY29udGFpbmluZyBpbnRlZ2VyIHZhbHVlcyByZXByZXNlbnRpbmcgdGhlCisgKgkJCW51bWJlciBvZiBORlNEIHRocmVhZHMgaW4gZWFjaCBwb29sOworICoJCQlyZXR1cm4gY29kZSBpcyB0aGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgc3RyaW5nCisgKglPbiBlcnJvcjoJcmV0dXJuIGNvZGUgaXMgemVybyBvciBhIG5lZ2F0aXZlIGVycm5vIHZhbHVlCisgKi8KIHN0YXRpYyBzc2l6ZV90IHdyaXRlX3Bvb2xfdGhyZWFkcyhzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSkKIHsKIAkvKiBpZiBzaXplID4gMCwgbG9vayBmb3IgYW4gYXJyYXkgb2YgbnVtYmVyIG9mIHRocmVhZHMgcGVyIG5vZGUKQEAgLTUxNywxMCArNzgwLDYgQEAKIAogc3RhdGljIHNzaXplX3QgX193cml0ZV92ZXJzaW9ucyhzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSkKIHsKLQkvKgotCSAqIEZvcm1hdDoKLQkgKiAgIFstLytddmVycyBbLS8rXXZlcnMgLi4uCi0JICovCiAJY2hhciAqbWVzZyA9IGJ1ZjsKIAljaGFyICp2ZXJzLCBzaWduOwogCWludCBsZW4sIG51bTsKQEAgLTU3OCw2ICs4MzcsMzggQEAKIAlyZXR1cm4gbGVuOwogfQogCisvKioKKyAqIHdyaXRlX3ZlcnNpb25zIC0gU2V0IG9yIHJlcG9ydCB0aGUgYXZhaWxhYmxlIE5GUyBwcm90b2NvbCB2ZXJzaW9ucworICoKKyAqIElucHV0OgorICoJCQlidWY6CQlpZ25vcmVkCisgKgkJCXNpemU6CQl6ZXJvCisgKiBPdXRwdXQ6CisgKglPbiBzdWNjZXNzOglwYXNzZWQtaW4gYnVmZmVyIGZpbGxlZCB3aXRoICdcbictdGVybWluYXRlZCBDCisgKgkJCXN0cmluZyBjb250YWluaW5nIHBvc2l0aXZlIG9yIG5lZ2F0aXZlIGludGVnZXIKKyAqCQkJdmFsdWVzIHJlcHJlc2VudGluZyB0aGUgY3VycmVudCBzdGF0dXMgb2YgZWFjaAorICoJCQlwcm90b2NvbCB2ZXJzaW9uOworICoJCQlyZXR1cm4gY29kZSBpcyB0aGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgc3RyaW5nCisgKglPbiBlcnJvcjoJcmV0dXJuIGNvZGUgaXMgemVybyBvciBhIG5lZ2F0aXZlIGVycm5vIHZhbHVlCisgKgorICogT1IKKyAqCisgKiBJbnB1dDoKKyAqIAkJCWJ1ZjoJCUMgc3RyaW5nIGNvbnRhaW5pbmcgd2hpdGVzcGFjZS0KKyAqIAkJCQkJc2VwYXJhdGVkIHBvc2l0aXZlIG9yIG5lZ2F0aXZlCisgKiAJCQkJCWludGVnZXIgdmFsdWVzIHJlcHJlc2VudGluZyBORlMKKyAqIAkJCQkJcHJvdG9jb2wgdmVyc2lvbnMgdG8gZW5hYmxlICgiK24iKQorICogCQkJCQlvciBkaXNhYmxlICgiLW4iKQorICoJCQlzaXplOgkJbm9uLXplcm8gbGVuZ3RoIG9mIEMgc3RyaW5nIGluIEBidWYKKyAqIE91dHB1dDoKKyAqCU9uIHN1Y2Nlc3M6CXN0YXR1cyBvZiB6ZXJvIG9yIG1vcmUgcHJvdG9jb2wgdmVyc2lvbnMgaGFzCisgKgkJCWJlZW4gdXBkYXRlZDsgcGFzc2VkLWluIGJ1ZmZlciBmaWxsZWQgd2l0aAorICoJCQknXG4nLXRlcm1pbmF0ZWQgQyBzdHJpbmcgY29udGFpbmluZyBwb3NpdGl2ZQorICoJCQlvciBuZWdhdGl2ZSBpbnRlZ2VyIHZhbHVlcyByZXByZXNlbnRpbmcgdGhlCisgKgkJCWN1cnJlbnQgc3RhdHVzIG9mIGVhY2ggcHJvdG9jb2wgdmVyc2lvbjsKKyAqCQkJcmV0dXJuIGNvZGUgaXMgdGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIHN0cmluZworICoJT24gZXJyb3I6CXJldHVybiBjb2RlIGlzIHplcm8gb3IgYSBuZWdhdGl2ZSBlcnJubyB2YWx1ZQorICovCiBzdGF0aWMgc3NpemVfdCB3cml0ZV92ZXJzaW9ucyhzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSkKIHsKIAlzc2l6ZV90IHJ2OwpAQCAtNjg3LDYgKzk3OCw3NSBAQAogCXJldHVybiAtRUlOVkFMOwogfQogCisvKioKKyAqIHdyaXRlX3BvcnRzIC0gUGFzcyBhIHNvY2tldCBmaWxlIGRlc2NyaXB0b3Igb3IgdHJhbnNwb3J0IG5hbWUgdG8gbGlzdGVuIG9uCisgKgorICogSW5wdXQ6CisgKgkJCWJ1ZjoJCWlnbm9yZWQKKyAqCQkJc2l6ZToJCXplcm8KKyAqIE91dHB1dDoKKyAqCU9uIHN1Y2Nlc3M6CXBhc3NlZC1pbiBidWZmZXIgZmlsbGVkIHdpdGggYSAnXG4nLXRlcm1pbmF0ZWQgQworICoJCQlzdHJpbmcgY29udGFpbmluZyBhIHdoaXRlc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YKKyAqCQkJbmFtZWQgTkZTRCBsaXN0ZW5lcnM7CisgKgkJCXJldHVybiBjb2RlIGlzIHRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSBzdHJpbmcKKyAqCU9uIGVycm9yOglyZXR1cm4gY29kZSBpcyB6ZXJvIG9yIGEgbmVnYXRpdmUgZXJybm8gdmFsdWUKKyAqCisgKiBPUgorICoKKyAqIElucHV0OgorICoJCQlidWY6CQlDIHN0cmluZyBjb250YWluaW5nIGFuIHVuc2lnbmVkCisgKgkJCQkJaW50ZWdlciB2YWx1ZSByZXByZXNlbnRpbmcgYSBib3VuZAorICoJCQkJCWJ1dCB1bmNvbm5lY3RlZCBzb2NrZXQgdGhhdCBpcyB0byBiZQorICoJCQkJCXVzZWQgYXMgYW4gTkZTRCBsaXN0ZW5lcgorICoJCQlzaXplOgkJbm9uLXplcm8gbGVuZ3RoIG9mIEMgc3RyaW5nIGluIEBidWYKKyAqIE91dHB1dDoKKyAqCU9uIHN1Y2Nlc3M6CU5GUyBzZXJ2aWNlIGlzIHN0YXJ0ZWQ7CisgKgkJCXBhc3NlZC1pbiBidWZmZXIgZmlsbGVkIHdpdGggYSAnXG4nLXRlcm1pbmF0ZWQgQworICoJCQlzdHJpbmcgY29udGFpbmluZyBhIHVuaXF1ZSBhbHBoYW51bWVyaWMgbmFtZSBvZgorICoJCQl0aGUgbGlzdGVuZXI7CisgKgkJCXJldHVybiBjb2RlIGlzIHRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSBzdHJpbmcKKyAqCU9uIGVycm9yOglyZXR1cm4gY29kZSBpcyBhIG5lZ2F0aXZlIGVycm5vIHZhbHVlCisgKgorICogT1IKKyAqCisgKiBJbnB1dDoKKyAqCQkJYnVmOgkJQyBzdHJpbmcgY29udGFpbmluZyBhICItIiBmb2xsb3dlZAorICoJCQkJCWJ5IGFuIGludGVnZXIgdmFsdWUgcmVwcmVzZW50aW5nIGEKKyAqCQkJCQlwcmV2aW91c2x5IHBhc3NlZCBpbiBzb2NrZXQgZmlsZQorICoJCQkJCWRlc2NyaXB0b3IKKyAqCQkJc2l6ZToJCW5vbi16ZXJvIGxlbmd0aCBvZiBDIHN0cmluZyBpbiBAYnVmCisgKiBPdXRwdXQ6CisgKglPbiBzdWNjZXNzOglORlMgc2VydmljZSBubyBsb25nZXIgbGlzdGVucyBvbiB0aGF0IHNvY2tldDsKKyAqCQkJcGFzc2VkLWluIGJ1ZmZlciBmaWxsZWQgd2l0aCBhICdcbictdGVybWluYXRlZCBDCisgKgkJCXN0cmluZyBjb250YWluaW5nIGEgdW5pcXVlIG5hbWUgb2YgdGhlIGxpc3RlbmVyOworICoJCQlyZXR1cm4gY29kZSBpcyB0aGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgc3RyaW5nCisgKglPbiBlcnJvcjoJcmV0dXJuIGNvZGUgaXMgYSBuZWdhdGl2ZSBlcnJubyB2YWx1ZQorICoKKyAqIE9SCisgKgorICogSW5wdXQ6CisgKgkJCWJ1ZjoJCUMgc3RyaW5nIGNvbnRhaW5pbmcgYSB0cmFuc3BvcnQKKyAqCQkJCQluYW1lIGFuZCBhbiB1bnNpZ25lZCBpbnRlZ2VyIHZhbHVlCisgKgkJCQkJcmVwcmVzZW50aW5nIHRoZSBwb3J0IHRvIGxpc3RlbiBvbiwKKyAqCQkJCQlzZXBhcmF0ZWQgYnkgd2hpdGVzcGFjZQorICoJCQlzaXplOgkJbm9uLXplcm8gbGVuZ3RoIG9mIEMgc3RyaW5nIGluIEBidWYKKyAqIE91dHB1dDoKKyAqCU9uIHN1Y2Nlc3M6CXJldHVybnMgemVybzsgTkZTIHNlcnZpY2UgaXMgc3RhcnRlZAorICoJT24gZXJyb3I6CXJldHVybiBjb2RlIGlzIGEgbmVnYXRpdmUgZXJybm8gdmFsdWUKKyAqCisgKiBPUgorICoKKyAqIElucHV0OgorICoJCQlidWY6CQlDIHN0cmluZyBjb250YWluaW5nIGEgIi0iIGZvbGxvd2VkCisgKgkJCQkJYnkgYSB0cmFuc3BvcnQgbmFtZSBhbmQgYW4gdW5zaWduZWQKKyAqCQkJCQlpbnRlZ2VyIHZhbHVlIHJlcHJlc2VudGluZyB0aGUgcG9ydAorICoJCQkJCXRvIGxpc3RlbiBvbiwgc2VwYXJhdGVkIGJ5IHdoaXRlc3BhY2UKKyAqCQkJc2l6ZToJCW5vbi16ZXJvIGxlbmd0aCBvZiBDIHN0cmluZyBpbiBAYnVmCisgKiBPdXRwdXQ6CisgKglPbiBzdWNjZXNzOglyZXR1cm5zIHplcm87IE5GUyBzZXJ2aWNlIG5vIGxvbmdlciBsaXN0ZW5zCisgKgkJCW9uIHRoYXQgdHJhbnNwb3J0CisgKglPbiBlcnJvcjoJcmV0dXJuIGNvZGUgaXMgYSBuZWdhdGl2ZSBlcnJubyB2YWx1ZQorICovCiBzdGF0aWMgc3NpemVfdCB3cml0ZV9wb3J0cyhzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSkKIHsKIAlzc2l6ZV90IHJ2OwpAQCAtNzAwLDYgKzEwNjAsMjcgQEAKIAogaW50IG5mc2RfbWF4X2Jsa3NpemU7CiAKKy8qKgorICogd3JpdGVfbWF4Ymxrc2l6ZSAtIFNldCBvciByZXBvcnQgdGhlIGN1cnJlbnQgTkZTIGJsa3NpemUKKyAqCisgKiBJbnB1dDoKKyAqCQkJYnVmOgkJaWdub3JlZAorICoJCQlzaXplOgkJemVybworICoKKyAqIE9SCisgKgorICogSW5wdXQ6CisgKiAJCQlidWY6CQlDIHN0cmluZyBjb250YWluaW5nIGFuIHVuc2lnbmVkCisgKiAJCQkJCWludGVnZXIgdmFsdWUgcmVwcmVzZW50aW5nIHRoZSBuZXcKKyAqIAkJCQkJTkZTIGJsa3NpemUKKyAqCQkJc2l6ZToJCW5vbi16ZXJvIGxlbmd0aCBvZiBDIHN0cmluZyBpbiBAYnVmCisgKiBPdXRwdXQ6CisgKglPbiBzdWNjZXNzOglwYXNzZWQtaW4gYnVmZmVyIGZpbGxlZCB3aXRoICdcbictdGVybWluYXRlZCBDIHN0cmluZworICoJCQljb250YWluaW5nIG51bWVyaWMgdmFsdWUgb2YgdGhlIGN1cnJlbnQgTkZTIGJsa3NpemUKKyAqCQkJc2V0dGluZzsKKyAqCQkJcmV0dXJuIGNvZGUgaXMgdGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIHN0cmluZworICoJT24gZXJyb3I6CXJldHVybiBjb2RlIGlzIHplcm8gb3IgYSBuZWdhdGl2ZSBlcnJubyB2YWx1ZQorICovCiBzdGF0aWMgc3NpemVfdCB3cml0ZV9tYXhibGtzaXplKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyICpidWYsIHNpemVfdCBzaXplKQogewogCWNoYXIgKm1lc2cgPSBidWY7CkBAIC03NTIsNiArMTEzMywyNyBAQAogCXJldHVybiBzdHJsZW4oYnVmKTsKIH0KIAorLyoqCisgKiB3cml0ZV9sZWFzZXRpbWUgLSBTZXQgb3IgcmVwb3J0IHRoZSBjdXJyZW50IE5GU3Y0IGxlYXNlIHRpbWUKKyAqCisgKiBJbnB1dDoKKyAqCQkJYnVmOgkJaWdub3JlZAorICoJCQlzaXplOgkJemVybworICoKKyAqIE9SCisgKgorICogSW5wdXQ6CisgKgkJCWJ1ZjoJCUMgc3RyaW5nIGNvbnRhaW5pbmcgYW4gdW5zaWduZWQKKyAqCQkJCQlpbnRlZ2VyIHZhbHVlIHJlcHJlc2VudGluZyB0aGUgbmV3CisgKgkJCQkJTkZTdjQgbGVhc2UgZXhwaXJ5IHRpbWUKKyAqCQkJc2l6ZToJCW5vbi16ZXJvIGxlbmd0aCBvZiBDIHN0cmluZyBpbiBAYnVmCisgKiBPdXRwdXQ6CisgKglPbiBzdWNjZXNzOglwYXNzZWQtaW4gYnVmZmVyIGZpbGxlZCB3aXRoICdcbictdGVybWluYXRlZCBDCisgKgkJCXN0cmluZyBjb250YWluaW5nIHVuc2lnbmVkIGludGVnZXIgdmFsdWUgb2YgdGhlCisgKgkJCWN1cnJlbnQgbGVhc2UgZXhwaXJ5IHRpbWU7CisgKgkJCXJldHVybiBjb2RlIGlzIHRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSBzdHJpbmcKKyAqCU9uIGVycm9yOglyZXR1cm4gY29kZSBpcyB6ZXJvIG9yIGEgbmVnYXRpdmUgZXJybm8gdmFsdWUKKyAqLwogc3RhdGljIHNzaXplX3Qgd3JpdGVfbGVhc2V0aW1lKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyICpidWYsIHNpemVfdCBzaXplKQogewogCXNzaXplX3QgcnY7CkBAIC03ODgsNiArMTE5MCwyNyBAQAogCXJldHVybiBzdHJsZW4oYnVmKTsKIH0KIAorLyoqCisgKiB3cml0ZV9yZWNvdmVyeWRpciAtIFNldCBvciByZXBvcnQgdGhlIHBhdGhuYW1lIG9mIHRoZSByZWNvdmVyeSBkaXJlY3RvcnkKKyAqCisgKiBJbnB1dDoKKyAqCQkJYnVmOgkJaWdub3JlZAorICoJCQlzaXplOgkJemVybworICoKKyAqIE9SCisgKgorICogSW5wdXQ6CisgKgkJCWJ1ZjoJCUMgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIHBhdGhuYW1lCisgKgkJCQkJb2YgdGhlIGRpcmVjdG9yeSBvbiBhIGxvY2FsIGZpbGUKKyAqCQkJCQlzeXN0ZW0gY29udGFpbmluZyBwZXJtYW5lbnQgTkZTdjQKKyAqCQkJCQlyZWNvdmVyeSBkYXRhCisgKgkJCXNpemU6CQlub24temVybyBsZW5ndGggb2YgQyBzdHJpbmcgaW4gQGJ1ZgorICogT3V0cHV0OgorICoJT24gc3VjY2VzczoJcGFzc2VkLWluIGJ1ZmZlciBmaWxsZWQgd2l0aCAnXG4nLXRlcm1pbmF0ZWQgQyBzdHJpbmcKKyAqCQkJY29udGFpbmluZyB0aGUgY3VycmVudCByZWNvdmVyeSBwYXRobmFtZSBzZXR0aW5nOworICoJCQlyZXR1cm4gY29kZSBpcyB0aGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgc3RyaW5nCisgKglPbiBlcnJvcjoJcmV0dXJuIGNvZGUgaXMgemVybyBvciBhIG5lZ2F0aXZlIGVycm5vIHZhbHVlCisgKi8KIHN0YXRpYyBzc2l6ZV90IHdyaXRlX3JlY292ZXJ5ZGlyKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyICpidWYsIHNpemVfdCBzaXplKQogewogCXNzaXplX3QgcnY7CmRpZmYgLS1naXQgYS9mcy9uZnNkL25mc2ZoLmMgYi9mcy9uZnNkL25mc2ZoLmMKaW5kZXggZjBkYTdkOS4uOWYxY2ExNyAxMDA2NDQKLS0tIGEvZnMvbmZzZC9uZnNmaC5jCisrKyBiL2ZzL25mc2QvbmZzZmguYwpAQCAtMjU4LDE0ICsyNTgsMzIgQEAKIAlyZXR1cm4gZXJyb3I7CiB9CiAKLS8qCi0gKiBQZXJmb3JtIHNhbml0eSBjaGVja3Mgb24gdGhlIGRlbnRyeSBpbiBhIGNsaWVudCdzIGZpbGUgaGFuZGxlLgorLyoqCisgKiBmaF92ZXJpZnkgLSBmaWxlaGFuZGxlIGxvb2t1cCBhbmQgYWNjZXNzIGNoZWNraW5nCisgKiBAcnFzdHA6IHBvaW50ZXIgdG8gY3VycmVudCBycGMgcmVxdWVzdAorICogQGZocDogZmlsZWhhbmRsZSB0byBiZSB2ZXJpZmllZAorICogQHR5cGU6IGV4cGVjdGVkIHR5cGUgb2Ygb2JqZWN0IHBvaW50ZWQgdG8gYnkgZmlsZWhhbmRsZQorICogQGFjY2VzczogdHlwZSBvZiBhY2Nlc3MgbmVlZGVkIHRvIG9iamVjdAogICoKLSAqIE5vdGUgdGhhdCB0aGUgZmlsZSBoYW5kbGUgZGVudHJ5IG1heSBuZWVkIHRvIGJlIGZyZWVkIGV2ZW4gYWZ0ZXIKLSAqIGFuIGVycm9yIHJldHVybi4KKyAqIExvb2sgdXAgYSBkZW50cnkgZnJvbSB0aGUgb24tdGhlLXdpcmUgZmlsZWhhbmRsZSwgY2hlY2sgdGhlIGNsaWVudCdzCisgKiBhY2Nlc3MgdG8gdGhlIGV4cG9ydCwgYW5kIHNldCB0aGUgY3VycmVudCB0YXNrJ3MgY3JlZGVudGlhbHMuCiAgKgotICogVGhpcyBpcyBvbmx5IGNhbGxlZCBhdCB0aGUgc3RhcnQgb2YgYW4gbmZzcHJvYyBjYWxsLCBzbyBmaHAgcG9pbnRzIHRvCi0gKiBhIHN2Y19maCB3aGljaCBpcyBhbGwgMCBleGNlcHQgZm9yIHRoZSBvdmVyLXRoZS13aXJlIGZpbGUgaGFuZGxlLgorICogUmVnYXJkbGVzcyBvZiBzdWNjZXNzIG9yIGZhaWx1cmUgb2YgZmhfdmVyaWZ5KCksIGZoX3B1dCgpIHNob3VsZCBiZQorICogY2FsbGVkIG9uIEBmaHAgd2hlbiB0aGUgY2FsbGVyIGlzIGZpbmlzaGVkIHdpdGggdGhlIGZpbGVoYW5kbGUuCisgKgorICogZmhfdmVyaWZ5KCkgbWF5IGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBvbiBhIGdpdmVuIGZpbGVoYW5kbGUsIGZvcgorICogZXhhbXBsZSwgd2hlbiBwcm9jZXNzaW5nIGFuIE5GU3Y0IGNvbXBvdW5kLiAgVGhlIGZpcnN0IGNhbGwgd2lsbCBsb29rCisgKiB1cCBhIGRlbnRyeSB1c2luZyB0aGUgb24tdGhlLXdpcmUgZmlsZWhhbmRsZS4gIFN1YnNlcXVlbnQgY2FsbHMgd2lsbAorICogc2tpcCB0aGUgbG9va3VwIGFuZCBqdXN0IHBlcmZvcm0gdGhlIG90aGVyIGNoZWNrcyBhbmQgcG9zc2libHkgY2hhbmdlCisgKiB0aGUgY3VycmVudCB0YXNrJ3MgY3JlZGVudGlhbHMuCisgKgorICogQHR5cGUgc3BlY2lmaWVzIHRoZSB0eXBlIG9mIG9iamVjdCBleHBlY3RlZCB1c2luZyBvbmUgb2YgdGhlIFNfSUYqCisgKiBjb25zdGFudHMgZGVmaW5lZCBpbiBpbmNsdWRlL2xpbnV4L3N0YXQuaC4gIFRoZSBjYWxsZXIgbWF5IHVzZSB6ZXJvCisgKiB0byBpbmRpY2F0ZSB0aGF0IGl0IGRvZXNuJ3QgY2FyZSwgb3IgYSBuZWdhdGl2ZSBpbnRlZ2VyIHRvIGluZGljYXRlCisgKiB0aGF0IGl0IGV4cGVjdHMgc29tZXRoaW5nIG5vdCBvZiB0aGUgZ2l2ZW4gdHlwZS4KKyAqCisgKiBAYWNjZXNzIGlzIGZvcm1lZCBmcm9tIHRoZSBORlNEX01BWV8qIGNvbnN0YW50cyBkZWZpbmVkIGluCisgKiBpbmNsdWRlL2xpbnV4L25mc2QvbmZzZC5oLgogICovCiBfX2JlMzIKIGZoX3ZlcmlmeShzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3Qgc3ZjX2ZoICpmaHAsIGludCB0eXBlLCBpbnQgYWNjZXNzKQpAQCAtNDY2LDYgKzQ4NCw4IEBACiAJCQkJZ290byByZXRyeTsKIAkJCWJyZWFrOwogCQl9CisJfSBlbHNlIGlmIChleHAtPmV4X2ZsYWdzICYgTkZTRVhQX0ZTSUQpIHsKKwkJZnNpZF90eXBlID0gRlNJRF9OVU07CiAJfSBlbHNlIGlmIChleHAtPmV4X3V1aWQpIHsKIAkJaWYgKGZocC0+ZmhfbWF4c2l6ZSA+PSA2NCkgewogCQkJaWYgKHJvb3RfZXhwb3J0KQpAQCAtNDc4LDkgKzQ5OCw3IEBACiAJCQllbHNlCiAJCQkJZnNpZF90eXBlID0gRlNJRF9VVUlENF9JTlVNOwogCQl9Ci0JfSBlbHNlIGlmIChleHAtPmV4X2ZsYWdzICYgTkZTRVhQX0ZTSUQpCi0JCWZzaWRfdHlwZSA9IEZTSURfTlVNOwotCWVsc2UgaWYgKCFvbGRfdmFsaWRfZGV2KGV4X2RldikpCisJfSBlbHNlIGlmICghb2xkX3ZhbGlkX2RldihleF9kZXYpKQogCQkvKiBmb3IgbmV3ZXIgZGV2aWNlIG51bWJlcnMsIHdlIG11c3QgdXNlIGEgbmV3ZXIgZnNpZCBmb3JtYXQgKi8KIAkJZnNpZF90eXBlID0gRlNJRF9FTkNPREVfREVWOwogCWVsc2UKZGlmZiAtLWdpdCBhL2ZzL25mc2QvbmZzcHJvYy5jIGIvZnMvbmZzZC9uZnNwcm9jLmMKaW5kZXggNWNmZmVjYS4uNmY3ZjI2MyAxMDA2NDQKLS0tIGEvZnMvbmZzZC9uZnNwcm9jLmMKKysrIGIvZnMvbmZzZC9uZnNwcm9jLmMKQEAgLTYyMiw2ICs2MjIsNyBAQAogCQl7IG5mc2Vycl9iYWRuYW1lLCAtRVNSQ0ggfSwKIAkJeyBuZnNlcnJfaW8sIC1FVFhUQlNZIH0sCiAJCXsgbmZzZXJyX25vdHN1cHAsIC1FT1BOT1RTVVBQIH0sCisJCXsgbmZzZXJyX3Rvb3NtYWxsLCAtRVRPT1NNQUxMIH0sCiAJfTsKIAlpbnQJaTsKIApkaWZmIC0tZ2l0IGEvZnMvbmZzZC92ZnMuYyBiL2ZzL25mc2QvdmZzLmMKaW5kZXggZDFjNWY3OC4uNmU1MGFhYSAxMDA2NDQKLS0tIGEvZnMvbmZzZC92ZnMuYworKysgYi9mcy9uZnNkL3Zmcy5jCkBAIC03NjQsNyArNzY0LDYgQEAKIAogCXJldHVybiBlcnI7CiB9Ci0JCiAKIHN0YXRpYyBpbnQKIG5mc2Rfc3luYyhzdHJ1Y3QgZmlsZSAqZmlscCkKQEAgLTEyMTEsNyArMTIxMCw3IEBACiAJZGlycCA9IGRlbnRyeS0+ZF9pbm9kZTsKIAogCWVyciA9IG5mc2Vycl9ub3RkaXI7Ci0JaWYoIWRpcnAtPmlfb3AgfHwgIWRpcnAtPmlfb3AtPmxvb2t1cCkKKwlpZiAoIWRpcnAtPmlfb3AtPmxvb2t1cCkKIAkJZ290byBvdXQ7CiAJLyoKIAkgKiBDaGVjayB3aGV0aGVyIHRoZSByZXNwb25zZSBmaWxlIGhhbmRsZSBoYXMgYmVlbiB2ZXJpZmllZCB5ZXQuCkBAIC0xMzQ3LDcgKzEzNDYsNyBAQAogCS8qIEdldCBhbGwgdGhlIHNhbml0eSBjaGVja3Mgb3V0IG9mIHRoZSB3YXkgYmVmb3JlCiAJICogd2UgbG9jayB0aGUgcGFyZW50LiAqLwogCWVyciA9IG5mc2Vycl9ub3RkaXI7Ci0JaWYoIWRpcnAtPmlfb3AgfHwgIWRpcnAtPmlfb3AtPmxvb2t1cCkKKwlpZiAoIWRpcnAtPmlfb3AtPmxvb2t1cCkKIAkJZ290byBvdXQ7CiAJZmhfbG9ja19uZXN0ZWQoZmhwLCBJX01VVEVYX1BBUkVOVCk7CiAKQEAgLTE0ODIsNyArMTQ4MSw3IEBACiAJaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CiAKIAllcnIgPSBuZnNlcnJfaW52YWw7Ci0JaWYgKCFpbm9kZS0+aV9vcCB8fCAhaW5vZGUtPmlfb3AtPnJlYWRsaW5rKQorCWlmICghaW5vZGUtPmlfb3AtPnJlYWRsaW5rKQogCQlnb3RvIG91dDsKIAogCXRvdWNoX2F0aW1lKGZocC0+ZmhfZXhwb3J0LT5leF9wYXRoLm1udCwgZGVudHJ5KTsKQEAgLTIxNjIsNyArMjE2MSw3IEBACiAJc2l6ZV90IHNpemU7CiAJaW50IGVycm9yOwogCi0JaWYgKCFJU19QT1NJWEFDTChpbm9kZSkgfHwgIWlub2RlLT5pX29wIHx8CisJaWYgKCFJU19QT1NJWEFDTChpbm9kZSkgfHwKIAkgICAgIWlub2RlLT5pX29wLT5zZXR4YXR0ciB8fCAhaW5vZGUtPmlfb3AtPnJlbW92ZXhhdHRyKQogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAJc3dpdGNoKHR5cGUpIHsKZGlmZiAtLWdpdCBhL2ZzL25vdGlmeS9pbm90aWZ5L2lub3RpZnlfdXNlci5jIGIvZnMvbm90aWZ5L2lub3RpZnkvaW5vdGlmeV91c2VyLmMKaW5kZXggNDAwZjgwNi4uODFiODY0NCAxMDA2NDQKLS0tIGEvZnMvbm90aWZ5L2lub3RpZnkvaW5vdGlmeV91c2VyLmMKKysrIGIvZnMvbm90aWZ5L2lub3RpZnkvaW5vdGlmeV91c2VyLmMKQEAgLTcwNCw3ICs3MDQsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLWFzbWxpbmthZ2UgbG9uZyBzeXNfaW5vdGlmeV9ybV93YXRjaChpbnQgZmQsIHUzMiB3ZCkKK2FzbWxpbmthZ2UgbG9uZyBzeXNfaW5vdGlmeV9ybV93YXRjaChpbnQgZmQsIF9fczMyIHdkKQogewogCXN0cnVjdCBmaWxlICpmaWxwOwogCXN0cnVjdCBpbm90aWZ5X2RldmljZSAqZGV2OwpkaWZmIC0tZ2l0IGEvZnMvbnRmcy9pbm9kZS5jIGIvZnMvbnRmcy9pbm9kZS5jCmluZGV4IGU5ZGEwOTIuLjg2YmVmMTUgMTAwNjQ0Ci0tLSBhL2ZzL250ZnMvaW5vZGUuYworKysgYi9mcy9udGZzL2lub2RlLmMKQEAgLTE0MDYsOSArMTQwNiw2IEBACiAJCW5pLT5hbGxvY2F0ZWRfc2l6ZSA9IHNsZTY0X3RvX2NwdSgKIAkJCQlhLT5kYXRhLm5vbl9yZXNpZGVudC5hbGxvY2F0ZWRfc2l6ZSk7CiAJfQotCS8qIFNldHVwIHRoZSBvcGVyYXRpb25zIGZvciB0aGlzIGF0dHJpYnV0ZSBpbm9kZS4gKi8KLQl2aS0+aV9vcCA9IE5VTEw7Ci0JdmktPmlfZm9wID0gTlVMTDsKIAlpZiAoTklub01zdFByb3RlY3RlZChuaSkpCiAJCXZpLT5pX21hcHBpbmctPmFfb3BzID0gJm50ZnNfbXN0X2FvcHM7CiAJZWxzZQpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvTWFrZWZpbGUgYi9mcy9vY2ZzMi9NYWtlZmlsZQppbmRleCA1ODlkY2RmLi4wMTU5NjA3IDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9NYWtlZmlsZQorKysgYi9mcy9vY2ZzMi9NYWtlZmlsZQpAQCAtMTIsNiArMTIsNyBAQAogb2NmczItb2JqcyA6PSBcCiAJYWxsb2MubyAJCVwKIAlhb3BzLm8gCQkJXAorCWJsb2NrY2hlY2subwkJXAogCWJ1ZmZlcl9oZWFkX2lvLm8JXAogCWRjYWNoZS5vIAkJXAogCWRpci5vIAkJCVwKQEAgLTM1LDggKzM2LDE0IEBACiAJc3lzZmlsZS5vIAkJXAogCXVwdG9kYXRlLm8JCVwKIAl2ZXIubwkJCVwKKwlxdW90YV9sb2NhbC5vCQlcCisJcXVvdGFfZ2xvYmFsLm8JCVwKIAl4YXR0ci5vCiAKK2lmZXEgKCQoQ09ORklHX09DRlMyX0ZTX1BPU0lYX0FDTCkseSkKK29jZnMyLW9ianMgKz0gYWNsLm8KK2VuZGlmCisKIG9jZnMyX3N0YWNrZ2x1ZS1vYmpzIDo9IHN0YWNrZ2x1ZS5vCiBvY2ZzMl9zdGFja19vMmNiLW9ianMgOj0gc3RhY2tfbzJjYi5vCiBvY2ZzMl9zdGFja191c2VyLW9ianMgOj0gc3RhY2tfdXNlci5vCmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9hY2wuYyBiL2ZzL29jZnMyL2FjbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyZGZiNDQKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9vY2ZzMi9hY2wuYwpAQCAtMCwwICsxLDQ3OSBAQAorLyogLSotIG1vZGU6IGM7IGMtYmFzaWMtb2Zmc2V0OiA4OyAtKi0KKyAqIHZpbTogbm9leHBhbmR0YWIgc3c9OCB0cz04IHN0cz0wOgorICoKKyAqIGFjbC5jCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0LCAyMDA4IE9yYWNsZS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQ1JFRElUUzoKKyAqIExvdHMgb2YgY29kZSBpbiB0aGlzIGZpbGUgaXMgY29weSBmcm9tIGxpbnV4L2ZzL2V4dDMvYWNsLmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwMyBBbmRyZWFzIEdydWVuYmFjaGVyLCA8YWdydWVuQHN1c2UuZGU+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisKKyNkZWZpbmUgTUxPR19NQVNLX1BSRUZJWCBNTF9JTk9ERQorI2luY2x1ZGUgPGNsdXN0ZXIvbWFza2xvZy5oPgorCisjaW5jbHVkZSAib2NmczIuaCIKKyNpbmNsdWRlICJhbGxvYy5oIgorI2luY2x1ZGUgImRsbWdsdWUuaCIKKyNpbmNsdWRlICJmaWxlLmgiCisjaW5jbHVkZSAib2NmczJfZnMuaCIKKworI2luY2x1ZGUgInhhdHRyLmgiCisjaW5jbHVkZSAiYWNsLmgiCisKKy8qCisgKiBDb252ZXJ0IGZyb20geGF0dHIgdmFsdWUgdG8gYWNsIHN0cnVjdC4KKyAqLworc3RhdGljIHN0cnVjdCBwb3NpeF9hY2wgKm9jZnMyX2FjbF9mcm9tX3hhdHRyKGNvbnN0IHZvaWQgKnZhbHVlLCBzaXplX3Qgc2l6ZSkKK3sKKwlpbnQgbiwgY291bnQ7CisJc3RydWN0IHBvc2l4X2FjbCAqYWNsOworCisJaWYgKCF2YWx1ZSkKKwkJcmV0dXJuIE5VTEw7CisJaWYgKHNpemUgPCBzaXplb2Yoc3RydWN0IHBvc2l4X2FjbF9lbnRyeSkpCisJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCisJY291bnQgPSBzaXplIC8gc2l6ZW9mKHN0cnVjdCBwb3NpeF9hY2xfZW50cnkpOworCWlmIChjb3VudCA8IDApCisJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCWlmIChjb3VudCA9PSAwKQorCQlyZXR1cm4gTlVMTDsKKworCWFjbCA9IHBvc2l4X2FjbF9hbGxvYyhjb3VudCwgR0ZQX05PRlMpOworCWlmICghYWNsKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwlmb3IgKG4gPSAwOyBuIDwgY291bnQ7IG4rKykgeworCQlzdHJ1Y3Qgb2NmczJfYWNsX2VudHJ5ICplbnRyeSA9CisJCQkoc3RydWN0IG9jZnMyX2FjbF9lbnRyeSAqKXZhbHVlOworCisJCWFjbC0+YV9lbnRyaWVzW25dLmVfdGFnICA9IGxlMTZfdG9fY3B1KGVudHJ5LT5lX3RhZyk7CisJCWFjbC0+YV9lbnRyaWVzW25dLmVfcGVybSA9IGxlMTZfdG9fY3B1KGVudHJ5LT5lX3Blcm0pOworCQlhY2wtPmFfZW50cmllc1tuXS5lX2lkICAgPSBsZTMyX3RvX2NwdShlbnRyeS0+ZV9pZCk7CisJCXZhbHVlICs9IHNpemVvZihzdHJ1Y3QgcG9zaXhfYWNsX2VudHJ5KTsKKworCX0KKwlyZXR1cm4gYWNsOworfQorCisvKgorICogQ29udmVydCBhY2wgc3RydWN0IHRvIHhhdHRyIHZhbHVlLgorICovCitzdGF0aWMgdm9pZCAqb2NmczJfYWNsX3RvX3hhdHRyKGNvbnN0IHN0cnVjdCBwb3NpeF9hY2wgKmFjbCwgc2l6ZV90ICpzaXplKQoreworCXN0cnVjdCBvY2ZzMl9hY2xfZW50cnkgKmVudHJ5ID0gTlVMTDsKKwljaGFyICpvY2ZzMl9hY2w7CisJc2l6ZV90IG47CisKKwkqc2l6ZSA9IGFjbC0+YV9jb3VudCAqIHNpemVvZihzdHJ1Y3QgcG9zaXhfYWNsX2VudHJ5KTsKKworCW9jZnMyX2FjbCA9IGttYWxsb2MoKnNpemUsIEdGUF9OT0ZTKTsKKwlpZiAoIW9jZnMyX2FjbCkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwllbnRyeSA9IChzdHJ1Y3Qgb2NmczJfYWNsX2VudHJ5ICopb2NmczJfYWNsOworCWZvciAobiA9IDA7IG4gPCBhY2wtPmFfY291bnQ7IG4rKywgZW50cnkrKykgeworCQllbnRyeS0+ZV90YWcgID0gY3B1X3RvX2xlMTYoYWNsLT5hX2VudHJpZXNbbl0uZV90YWcpOworCQllbnRyeS0+ZV9wZXJtID0gY3B1X3RvX2xlMTYoYWNsLT5hX2VudHJpZXNbbl0uZV9wZXJtKTsKKwkJZW50cnktPmVfaWQgICA9IGNwdV90b19sZTMyKGFjbC0+YV9lbnRyaWVzW25dLmVfaWQpOworCX0KKwlyZXR1cm4gb2NmczJfYWNsOworfQorCitzdGF0aWMgc3RydWN0IHBvc2l4X2FjbCAqb2NmczJfZ2V0X2FjbF9ub2xvY2soc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkJICAgICAgaW50IHR5cGUsCisJCQkJCSAgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqZGlfYmgpCit7CisJc3RydWN0IG9jZnMyX3N1cGVyICpvc2IgPSBPQ0ZTMl9TQihpbm9kZS0+aV9zYik7CisJaW50IG5hbWVfaW5kZXg7CisJY2hhciAqdmFsdWUgPSBOVUxMOworCXN0cnVjdCBwb3NpeF9hY2wgKmFjbDsKKwlpbnQgcmV0dmFsOworCisJaWYgKCEob3NiLT5zX21vdW50X29wdCAmIE9DRlMyX01PVU5UX1BPU0lYX0FDTCkpCisJCXJldHVybiBOVUxMOworCisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBBQ0xfVFlQRV9BQ0NFU1M6CisJCW5hbWVfaW5kZXggPSBPQ0ZTMl9YQVRUUl9JTkRFWF9QT1NJWF9BQ0xfQUNDRVNTOworCQlicmVhazsKKwljYXNlIEFDTF9UWVBFX0RFRkFVTFQ6CisJCW5hbWVfaW5kZXggPSBPQ0ZTMl9YQVRUUl9JTkRFWF9QT1NJWF9BQ0xfREVGQVVMVDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisJfQorCisJcmV0dmFsID0gb2NmczJfeGF0dHJfZ2V0X25vbG9jayhpbm9kZSwgZGlfYmgsIG5hbWVfaW5kZXgsICIiLCBOVUxMLCAwKTsKKwlpZiAocmV0dmFsID4gMCkgeworCQl2YWx1ZSA9IGttYWxsb2MocmV0dmFsLCBHRlBfTk9GUyk7CisJCWlmICghdmFsdWUpCisJCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwkJcmV0dmFsID0gb2NmczJfeGF0dHJfZ2V0X25vbG9jayhpbm9kZSwgZGlfYmgsIG5hbWVfaW5kZXgsCisJCQkJCQkiIiwgdmFsdWUsIHJldHZhbCk7CisJfQorCisJaWYgKHJldHZhbCA+IDApCisJCWFjbCA9IG9jZnMyX2FjbF9mcm9tX3hhdHRyKHZhbHVlLCByZXR2YWwpOworCWVsc2UgaWYgKHJldHZhbCA9PSAtRU5PREFUQSB8fCByZXR2YWwgPT0gMCkKKwkJYWNsID0gTlVMTDsKKwllbHNlCisJCWFjbCA9IEVSUl9QVFIocmV0dmFsKTsKKworCWtmcmVlKHZhbHVlKTsKKworCXJldHVybiBhY2w7Cit9CisKKworLyoKKyAqIEdldCBwb3NpeCBhY2wuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgcG9zaXhfYWNsICpvY2ZzMl9nZXRfYWNsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCB0eXBlKQoreworCXN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiID0gT0NGUzJfU0IoaW5vZGUtPmlfc2IpOworCXN0cnVjdCBidWZmZXJfaGVhZCAqZGlfYmggPSBOVUxMOworCXN0cnVjdCBwb3NpeF9hY2wgKmFjbDsKKwlpbnQgcmV0OworCisJaWYgKCEob3NiLT5zX21vdW50X29wdCAmIE9DRlMyX01PVU5UX1BPU0lYX0FDTCkpCisJCXJldHVybiBOVUxMOworCisJcmV0ID0gb2NmczJfaW5vZGVfbG9jayhpbm9kZSwgJmRpX2JoLCAwKTsKKwlpZiAocmV0IDwgMCkgeworCQltbG9nX2Vycm5vKHJldCk7CisJCWFjbCA9IEVSUl9QVFIocmV0KTsKKwkJcmV0dXJuIGFjbDsKKwl9CisKKwlhY2wgPSBvY2ZzMl9nZXRfYWNsX25vbG9jayhpbm9kZSwgdHlwZSwgZGlfYmgpOworCisJb2NmczJfaW5vZGVfdW5sb2NrKGlub2RlLCAwKTsKKworCWJyZWxzZShkaV9iaCk7CisKKwlyZXR1cm4gYWNsOworfQorCisvKgorICogU2V0IHRoZSBhY2Nlc3Mgb3IgZGVmYXVsdCBBQ0wgb2YgYW4gaW5vZGUuCisgKi8KK3N0YXRpYyBpbnQgb2NmczJfc2V0X2FjbChoYW5kbGVfdCAqaGFuZGxlLAorCQkJIHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkgc3RydWN0IGJ1ZmZlcl9oZWFkICpkaV9iaCwKKwkJCSBpbnQgdHlwZSwKKwkJCSBzdHJ1Y3QgcG9zaXhfYWNsICphY2wsCisJCQkgc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKm1ldGFfYWMsCisJCQkgc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKmRhdGFfYWMpCit7CisJaW50IG5hbWVfaW5kZXg7CisJdm9pZCAqdmFsdWUgPSBOVUxMOworCXNpemVfdCBzaXplID0gMDsKKwlpbnQgcmV0OworCisJaWYgKFNfSVNMTksoaW5vZGUtPmlfbW9kZSkpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgQUNMX1RZUEVfQUNDRVNTOgorCQluYW1lX2luZGV4ID0gT0NGUzJfWEFUVFJfSU5ERVhfUE9TSVhfQUNMX0FDQ0VTUzsKKwkJaWYgKGFjbCkgeworCQkJbW9kZV90IG1vZGUgPSBpbm9kZS0+aV9tb2RlOworCQkJcmV0ID0gcG9zaXhfYWNsX2VxdWl2X21vZGUoYWNsLCAmbW9kZSk7CisJCQlpZiAocmV0IDwgMCkKKwkJCQlyZXR1cm4gcmV0OworCQkJZWxzZSB7CisJCQkJaW5vZGUtPmlfbW9kZSA9IG1vZGU7CisJCQkJaWYgKHJldCA9PSAwKQorCQkJCQlhY2wgPSBOVUxMOworCQkJfQorCQl9CisJCWJyZWFrOworCWNhc2UgQUNMX1RZUEVfREVGQVVMVDoKKwkJbmFtZV9pbmRleCA9IE9DRlMyX1hBVFRSX0lOREVYX1BPU0lYX0FDTF9ERUZBVUxUOworCQlpZiAoIVNfSVNESVIoaW5vZGUtPmlfbW9kZSkpCisJCQlyZXR1cm4gYWNsID8gLUVBQ0NFUyA6IDA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChhY2wpIHsKKwkJdmFsdWUgPSBvY2ZzMl9hY2xfdG9feGF0dHIoYWNsLCAmc2l6ZSk7CisJCWlmIChJU19FUlIodmFsdWUpKQorCQkJcmV0dXJuIChpbnQpUFRSX0VSUih2YWx1ZSk7CisJfQorCisJaWYgKGhhbmRsZSkKKwkJcmV0ID0gb2NmczJfeGF0dHJfc2V0X2hhbmRsZShoYW5kbGUsIGlub2RlLCBkaV9iaCwgbmFtZV9pbmRleCwKKwkJCQkJICAgICAiIiwgdmFsdWUsIHNpemUsIDAsCisJCQkJCSAgICAgbWV0YV9hYywgZGF0YV9hYyk7CisJZWxzZQorCQlyZXQgPSBvY2ZzMl94YXR0cl9zZXQoaW5vZGUsIG5hbWVfaW5kZXgsICIiLCB2YWx1ZSwgc2l6ZSwgMCk7CisKKwlrZnJlZSh2YWx1ZSk7CisKKwlyZXR1cm4gcmV0OworfQorCitpbnQgb2NmczJfY2hlY2tfYWNsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBtYXNrKQoreworCXN0cnVjdCBwb3NpeF9hY2wgKmFjbCA9IG9jZnMyX2dldF9hY2woaW5vZGUsIEFDTF9UWVBFX0FDQ0VTUyk7CisKKwlpZiAoSVNfRVJSKGFjbCkpCisJCXJldHVybiBQVFJfRVJSKGFjbCk7CisJaWYgKGFjbCkgeworCQlpbnQgcmV0ID0gcG9zaXhfYWNsX3Blcm1pc3Npb24oaW5vZGUsIGFjbCwgbWFzayk7CisJCXBvc2l4X2FjbF9yZWxlYXNlKGFjbCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIC1FQUdBSU47Cit9CisKK2ludCBvY2ZzMl9hY2xfY2htb2Qoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiA9IE9DRlMyX1NCKGlub2RlLT5pX3NiKTsKKwlzdHJ1Y3QgcG9zaXhfYWNsICphY2wsICpjbG9uZTsKKwlpbnQgcmV0OworCisJaWYgKFNfSVNMTksoaW5vZGUtPmlfbW9kZSkpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCWlmICghKG9zYi0+c19tb3VudF9vcHQgJiBPQ0ZTMl9NT1VOVF9QT1NJWF9BQ0wpKQorCQlyZXR1cm4gMDsKKworCWFjbCA9IG9jZnMyX2dldF9hY2woaW5vZGUsIEFDTF9UWVBFX0FDQ0VTUyk7CisJaWYgKElTX0VSUihhY2wpIHx8ICFhY2wpCisJCXJldHVybiBQVFJfRVJSKGFjbCk7CisJY2xvbmUgPSBwb3NpeF9hY2xfY2xvbmUoYWNsLCBHRlBfS0VSTkVMKTsKKwlwb3NpeF9hY2xfcmVsZWFzZShhY2wpOworCWlmICghY2xvbmUpCisJCXJldHVybiAtRU5PTUVNOworCXJldCA9IHBvc2l4X2FjbF9jaG1vZF9tYXNxKGNsb25lLCBpbm9kZS0+aV9tb2RlKTsKKwlpZiAoIXJldCkKKwkJcmV0ID0gb2NmczJfc2V0X2FjbChOVUxMLCBpbm9kZSwgTlVMTCwgQUNMX1RZUEVfQUNDRVNTLAorCQkJCSAgICBjbG9uZSwgTlVMTCwgTlVMTCk7CisJcG9zaXhfYWNsX3JlbGVhc2UoY2xvbmUpOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBJbml0aWFsaXplIHRoZSBBQ0xzIG9mIGEgbmV3IGlub2RlLiBJZiBwYXJlbnQgZGlyZWN0b3J5IGhhcyBkZWZhdWx0IEFDTCwKKyAqIHRoZW4gY2xvbmUgdG8gbmV3IGlub2RlLiBDYWxsZWQgZnJvbSBvY2ZzMl9ta25vZC4KKyAqLworaW50IG9jZnMyX2luaXRfYWNsKGhhbmRsZV90ICpoYW5kbGUsCisJCSAgIHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCSAgIHN0cnVjdCBpbm9kZSAqZGlyLAorCQkgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRpX2JoLAorCQkgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRpcl9iaCwKKwkJICAgc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKm1ldGFfYWMsCisJCSAgIHN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICpkYXRhX2FjKQoreworCXN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiID0gT0NGUzJfU0IoaW5vZGUtPmlfc2IpOworCXN0cnVjdCBwb3NpeF9hY2wgKmFjbCA9IE5VTEw7CisJaW50IHJldCA9IDA7CisKKwlpZiAoIVNfSVNMTksoaW5vZGUtPmlfbW9kZSkpIHsKKwkJaWYgKG9zYi0+c19tb3VudF9vcHQgJiBPQ0ZTMl9NT1VOVF9QT1NJWF9BQ0wpIHsKKwkJCWFjbCA9IG9jZnMyX2dldF9hY2xfbm9sb2NrKGRpciwgQUNMX1RZUEVfREVGQVVMVCwKKwkJCQkJCSAgIGRpcl9iaCk7CisJCQlpZiAoSVNfRVJSKGFjbCkpCisJCQkJcmV0dXJuIFBUUl9FUlIoYWNsKTsKKwkJfQorCQlpZiAoIWFjbCkKKwkJCWlub2RlLT5pX21vZGUgJj0gfmN1cnJlbnQtPmZzLT51bWFzazsKKwl9CisJaWYgKChvc2ItPnNfbW91bnRfb3B0ICYgT0NGUzJfTU9VTlRfUE9TSVhfQUNMKSAmJiBhY2wpIHsKKwkJc3RydWN0IHBvc2l4X2FjbCAqY2xvbmU7CisJCW1vZGVfdCBtb2RlOworCisJCWlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpKSB7CisJCQlyZXQgPSBvY2ZzMl9zZXRfYWNsKGhhbmRsZSwgaW5vZGUsIGRpX2JoLAorCQkJCQkgICAgQUNMX1RZUEVfREVGQVVMVCwgYWNsLAorCQkJCQkgICAgbWV0YV9hYywgZGF0YV9hYyk7CisJCQlpZiAocmV0KQorCQkJCWdvdG8gY2xlYW51cDsKKwkJfQorCQljbG9uZSA9IHBvc2l4X2FjbF9jbG9uZShhY2wsIEdGUF9OT0ZTKTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJaWYgKCFjbG9uZSkKKwkJCWdvdG8gY2xlYW51cDsKKworCQltb2RlID0gaW5vZGUtPmlfbW9kZTsKKwkJcmV0ID0gcG9zaXhfYWNsX2NyZWF0ZV9tYXNxKGNsb25lLCAmbW9kZSk7CisJCWlmIChyZXQgPj0gMCkgeworCQkJaW5vZGUtPmlfbW9kZSA9IG1vZGU7CisJCQlpZiAocmV0ID4gMCkgeworCQkJCXJldCA9IG9jZnMyX3NldF9hY2woaGFuZGxlLCBpbm9kZSwKKwkJCQkJCSAgICBkaV9iaCwgQUNMX1RZUEVfQUNDRVNTLAorCQkJCQkJICAgIGNsb25lLCBtZXRhX2FjLCBkYXRhX2FjKTsKKwkJCX0KKwkJfQorCQlwb3NpeF9hY2xfcmVsZWFzZShjbG9uZSk7CisJfQorY2xlYW51cDoKKwlwb3NpeF9hY2xfcmVsZWFzZShhY2wpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzaXplX3Qgb2NmczJfeGF0dHJfbGlzdF9hY2xfYWNjZXNzKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJCSAgY2hhciAqbGlzdCwKKwkJCQkJICBzaXplX3QgbGlzdF9sZW4sCisJCQkJCSAgY29uc3QgY2hhciAqbmFtZSwKKwkJCQkJICBzaXplX3QgbmFtZV9sZW4pCit7CisJc3RydWN0IG9jZnMyX3N1cGVyICpvc2IgPSBPQ0ZTMl9TQihpbm9kZS0+aV9zYik7CisJY29uc3Qgc2l6ZV90IHNpemUgPSBzaXplb2YoUE9TSVhfQUNMX1hBVFRSX0FDQ0VTUyk7CisKKwlpZiAoIShvc2ItPnNfbW91bnRfb3B0ICYgT0NGUzJfTU9VTlRfUE9TSVhfQUNMKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAobGlzdCAmJiBzaXplIDw9IGxpc3RfbGVuKQorCQltZW1jcHkobGlzdCwgUE9TSVhfQUNMX1hBVFRSX0FDQ0VTUywgc2l6ZSk7CisJcmV0dXJuIHNpemU7Cit9CisKK3N0YXRpYyBzaXplX3Qgb2NmczJfeGF0dHJfbGlzdF9hY2xfZGVmYXVsdChzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCQkgICBjaGFyICpsaXN0LAorCQkJCQkgICBzaXplX3QgbGlzdF9sZW4sCisJCQkJCSAgIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJCSAgIHNpemVfdCBuYW1lX2xlbikKK3sKKwlzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiA9IE9DRlMyX1NCKGlub2RlLT5pX3NiKTsKKwljb25zdCBzaXplX3Qgc2l6ZSA9IHNpemVvZihQT1NJWF9BQ0xfWEFUVFJfREVGQVVMVCk7CisKKwlpZiAoIShvc2ItPnNfbW91bnRfb3B0ICYgT0NGUzJfTU9VTlRfUE9TSVhfQUNMKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAobGlzdCAmJiBzaXplIDw9IGxpc3RfbGVuKQorCQltZW1jcHkobGlzdCwgUE9TSVhfQUNMX1hBVFRSX0RFRkFVTFQsIHNpemUpOworCXJldHVybiBzaXplOworfQorCitzdGF0aWMgaW50IG9jZnMyX3hhdHRyX2dldF9hY2woc3RydWN0IGlub2RlICppbm9kZSwKKwkJCSAgICAgICBpbnQgdHlwZSwKKwkJCSAgICAgICB2b2lkICpidWZmZXIsCisJCQkgICAgICAgc2l6ZV90IHNpemUpCit7CisJc3RydWN0IG9jZnMyX3N1cGVyICpvc2IgPSBPQ0ZTMl9TQihpbm9kZS0+aV9zYik7CisJc3RydWN0IHBvc2l4X2FjbCAqYWNsOworCWludCByZXQ7CisKKwlpZiAoIShvc2ItPnNfbW91bnRfb3B0ICYgT0NGUzJfTU9VTlRfUE9TSVhfQUNMKSkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJYWNsID0gb2NmczJfZ2V0X2FjbChpbm9kZSwgdHlwZSk7CisJaWYgKElTX0VSUihhY2wpKQorCQlyZXR1cm4gUFRSX0VSUihhY2wpOworCWlmIChhY2wgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9EQVRBOworCXJldCA9IHBvc2l4X2FjbF90b194YXR0cihhY2wsIGJ1ZmZlciwgc2l6ZSk7CisJcG9zaXhfYWNsX3JlbGVhc2UoYWNsKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgb2NmczJfeGF0dHJfZ2V0X2FjbF9hY2Nlc3Moc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkgICAgICBjb25zdCBjaGFyICpuYW1lLAorCQkJCSAgICAgIHZvaWQgKmJ1ZmZlciwKKwkJCQkgICAgICBzaXplX3Qgc2l6ZSkKK3sKKwlpZiAoc3RyY21wKG5hbWUsICIiKSAhPSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gb2NmczJfeGF0dHJfZ2V0X2FjbChpbm9kZSwgQUNMX1RZUEVfQUNDRVNTLCBidWZmZXIsIHNpemUpOworfQorCitzdGF0aWMgaW50IG9jZnMyX3hhdHRyX2dldF9hY2xfZGVmYXVsdChzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCSAgICAgICBjb25zdCBjaGFyICpuYW1lLAorCQkJCSAgICAgICB2b2lkICpidWZmZXIsCisJCQkJICAgICAgIHNpemVfdCBzaXplKQoreworCWlmIChzdHJjbXAobmFtZSwgIiIpICE9IDApCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiBvY2ZzMl94YXR0cl9nZXRfYWNsKGlub2RlLCBBQ0xfVFlQRV9ERUZBVUxULCBidWZmZXIsIHNpemUpOworfQorCitzdGF0aWMgaW50IG9jZnMyX3hhdHRyX3NldF9hY2woc3RydWN0IGlub2RlICppbm9kZSwKKwkJCSAgICAgICBpbnQgdHlwZSwKKwkJCSAgICAgICBjb25zdCB2b2lkICp2YWx1ZSwKKwkJCSAgICAgICBzaXplX3Qgc2l6ZSkKK3sKKwlzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiA9IE9DRlMyX1NCKGlub2RlLT5pX3NiKTsKKwlzdHJ1Y3QgcG9zaXhfYWNsICphY2w7CisJaW50IHJldCA9IDA7CisKKwlpZiAoIShvc2ItPnNfbW91bnRfb3B0ICYgT0NGUzJfTU9VTlRfUE9TSVhfQUNMKSkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJaWYgKCFpc19vd25lcl9vcl9jYXAoaW5vZGUpKQorCQlyZXR1cm4gLUVQRVJNOworCisJaWYgKHZhbHVlKSB7CisJCWFjbCA9IHBvc2l4X2FjbF9mcm9tX3hhdHRyKHZhbHVlLCBzaXplKTsKKwkJaWYgKElTX0VSUihhY2wpKQorCQkJcmV0dXJuIFBUUl9FUlIoYWNsKTsKKwkJZWxzZSBpZiAoYWNsKSB7CisJCQlyZXQgPSBwb3NpeF9hY2xfdmFsaWQoYWNsKTsKKwkJCWlmIChyZXQpCisJCQkJZ290byBjbGVhbnVwOworCQl9CisJfSBlbHNlCisJCWFjbCA9IE5VTEw7CisKKwlyZXQgPSBvY2ZzMl9zZXRfYWNsKE5VTEwsIGlub2RlLCBOVUxMLCB0eXBlLCBhY2wsIE5VTEwsIE5VTEwpOworCitjbGVhbnVwOgorCXBvc2l4X2FjbF9yZWxlYXNlKGFjbCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBvY2ZzMl94YXR0cl9zZXRfYWNsX2FjY2VzcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCSAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJICAgICAgY29uc3Qgdm9pZCAqdmFsdWUsCisJCQkJICAgICAgc2l6ZV90IHNpemUsCisJCQkJICAgICAgaW50IGZsYWdzKQoreworCWlmIChzdHJjbXAobmFtZSwgIiIpICE9IDApCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiBvY2ZzMl94YXR0cl9zZXRfYWNsKGlub2RlLCBBQ0xfVFlQRV9BQ0NFU1MsIHZhbHVlLCBzaXplKTsKK30KKworc3RhdGljIGludCBvY2ZzMl94YXR0cl9zZXRfYWNsX2RlZmF1bHQoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkgICAgICAgY29uc3QgY2hhciAqbmFtZSwKKwkJCQkgICAgICAgY29uc3Qgdm9pZCAqdmFsdWUsCisJCQkJICAgICAgIHNpemVfdCBzaXplLAorCQkJCSAgICAgICBpbnQgZmxhZ3MpCit7CisJaWYgKHN0cmNtcChuYW1lLCAiIikgIT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIG9jZnMyX3hhdHRyX3NldF9hY2woaW5vZGUsIEFDTF9UWVBFX0RFRkFVTFQsIHZhbHVlLCBzaXplKTsKK30KKworc3RydWN0IHhhdHRyX2hhbmRsZXIgb2NmczJfeGF0dHJfYWNsX2FjY2Vzc19oYW5kbGVyID0geworCS5wcmVmaXgJPSBQT1NJWF9BQ0xfWEFUVFJfQUNDRVNTLAorCS5saXN0CT0gb2NmczJfeGF0dHJfbGlzdF9hY2xfYWNjZXNzLAorCS5nZXQJPSBvY2ZzMl94YXR0cl9nZXRfYWNsX2FjY2VzcywKKwkuc2V0CT0gb2NmczJfeGF0dHJfc2V0X2FjbF9hY2Nlc3MsCit9OworCitzdHJ1Y3QgeGF0dHJfaGFuZGxlciBvY2ZzMl94YXR0cl9hY2xfZGVmYXVsdF9oYW5kbGVyID0geworCS5wcmVmaXgJPSBQT1NJWF9BQ0xfWEFUVFJfREVGQVVMVCwKKwkubGlzdAk9IG9jZnMyX3hhdHRyX2xpc3RfYWNsX2RlZmF1bHQsCisJLmdldAk9IG9jZnMyX3hhdHRyX2dldF9hY2xfZGVmYXVsdCwKKwkuc2V0CT0gb2NmczJfeGF0dHJfc2V0X2FjbF9kZWZhdWx0LAorfTsKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2FjbC5oIGIvZnMvb2NmczIvYWNsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGY2Mzg5ZQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL29jZnMyL2FjbC5oCkBAIC0wLDAgKzEsNTggQEAKKy8qIC0qLSBtb2RlOiBjOyBjLWJhc2ljLW9mZnNldDogODsgLSotCisgKiB2aW06IG5vZXhwYW5kdGFiIHN3PTggdHM9OCBzdHM9MDoKKyAqCisgKiBhY2wuaAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNCwgMjAwOCBPcmFjbGUuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaWZuZGVmIE9DRlMyX0FDTF9ICisjZGVmaW5lIE9DRlMyX0FDTF9ICisKKyNpbmNsdWRlIDxsaW51eC9wb3NpeF9hY2xfeGF0dHIuaD4KKworc3RydWN0IG9jZnMyX2FjbF9lbnRyeSB7CisJX19sZTE2IGVfdGFnOworCV9fbGUxNiBlX3Blcm07CisJX19sZTMyIGVfaWQ7Cit9OworCisjaWZkZWYgQ09ORklHX09DRlMyX0ZTX1BPU0lYX0FDTAorCitleHRlcm4gaW50IG9jZnMyX2NoZWNrX2FjbChzdHJ1Y3QgaW5vZGUgKiwgaW50KTsKK2V4dGVybiBpbnQgb2NmczJfYWNsX2NobW9kKHN0cnVjdCBpbm9kZSAqKTsKK2V4dGVybiBpbnQgb2NmczJfaW5pdF9hY2woaGFuZGxlX3QgKiwgc3RydWN0IGlub2RlICosIHN0cnVjdCBpbm9kZSAqLAorCQkJICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiwgc3RydWN0IGJ1ZmZlcl9oZWFkICosCisJCQkgIHN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICosCisJCQkgIHN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICopOworCisjZWxzZSAvKiBDT05GSUdfT0NGUzJfRlNfUE9TSVhfQUNMKi8KKworI2RlZmluZSBvY2ZzMl9jaGVja19hY2wgTlVMTAorc3RhdGljIGlubGluZSBpbnQgb2NmczJfYWNsX2NobW9kKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJcmV0dXJuIDA7Cit9CitzdGF0aWMgaW5saW5lIGludCBvY2ZzMl9pbml0X2FjbChoYW5kbGVfdCAqaGFuZGxlLAorCQkJCSBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCSBzdHJ1Y3QgaW5vZGUgKmRpciwKKwkJCQkgc3RydWN0IGJ1ZmZlcl9oZWFkICpkaV9iaCwKKwkJCQkgc3RydWN0IGJ1ZmZlcl9oZWFkICpkaXJfYmgsCisJCQkJIHN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICptZXRhX2FjLAorCQkJCSBzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqZGF0YV9hYykKK3sKKwlyZXR1cm4gMDsKK30KKworI2VuZGlmIC8qIENPTkZJR19PQ0ZTMl9GU19QT1NJWF9BQ0wqLworCisjZW5kaWYgLyogT0NGUzJfQUNMX0ggKi8KZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2FsbG9jLmMgYi9mcy9vY2ZzMi9hbGxvYy5jCmluZGV4IDBjYzJkZWIuLmQ4NjEwOTYgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2FsbG9jLmMKKysrIGIvZnMvb2NmczIvYWxsb2MuYwpAQCAtMjgsNiArMjgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CiAjaW5jbHVkZSA8bGludXgvc3dhcC5oPgorI2luY2x1ZGUgPGxpbnV4L3F1b3Rhb3BzLmg+CiAKICNkZWZpbmUgTUxPR19NQVNLX1BSRUZJWCBNTF9ESVNLX0FMTE9DCiAjaW5jbHVkZSA8Y2x1c3Rlci9tYXNrbG9nLmg+CkBAIC0zNiw2ICszNyw3IEBACiAKICNpbmNsdWRlICJhbGxvYy5oIgogI2luY2x1ZGUgImFvcHMuaCIKKyNpbmNsdWRlICJibG9ja2NoZWNrLmgiCiAjaW5jbHVkZSAiZGxtZ2x1ZS5oIgogI2luY2x1ZGUgImV4dGVudF9tYXAuaCIKICNpbmNsdWRlICJpbm9kZS5oIgpAQCAtNDYsNiArNDgsNyBAQAogI2luY2x1ZGUgImZpbGUuaCIKICNpbmNsdWRlICJzdXBlci5oIgogI2luY2x1ZGUgInVwdG9kYXRlLmgiCisjaW5jbHVkZSAieGF0dHIuaCIKIAogI2luY2x1ZGUgImJ1ZmZlcl9oZWFkX2lvLmgiCiAKQEAgLTE4NywyMCArMTkwLDEyIEBACiBzdGF0aWMgaW50IG9jZnMyX2Rpbm9kZV9zYW5pdHlfY2hlY2soc3RydWN0IGlub2RlICppbm9kZSwKIAkJCQkgICAgIHN0cnVjdCBvY2ZzMl9leHRlbnRfdHJlZSAqZXQpCiB7Ci0JaW50IHJldCA9IDA7Ci0Jc3RydWN0IG9jZnMyX2Rpbm9kZSAqZGk7CisJc3RydWN0IG9jZnMyX2Rpbm9kZSAqZGkgPSBldC0+ZXRfb2JqZWN0OwogCiAJQlVHX09OKGV0LT5ldF9vcHMgIT0gJm9jZnMyX2Rpbm9kZV9ldF9vcHMpOworCUJVR19PTighT0NGUzJfSVNfVkFMSURfRElOT0RFKGRpKSk7CiAKLQlkaSA9IGV0LT5ldF9vYmplY3Q7Ci0JaWYgKCFPQ0ZTMl9JU19WQUxJRF9ESU5PREUoZGkpKSB7Ci0JCXJldCA9IC1FSU87Ci0JCW9jZnMyX2Vycm9yKGlub2RlLT5pX3NiLAotCQkJIklub2RlICVsbHUgaGFzIGludmFsaWQgcGF0aCByb290IiwKLQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpT0NGUzJfSShpbm9kZSktPmlwX2Jsa25vKTsKLQl9Ci0KLQlyZXR1cm4gcmV0OworCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBvY2ZzMl9kaW5vZGVfZmlsbF9yb290X2VsKHN0cnVjdCBvY2ZzMl9leHRlbnRfdHJlZSAqZXQpCkBAIC0yMTMsMzYgKzIwOCwzMyBAQAogCiBzdGF0aWMgdm9pZCBvY2ZzMl94YXR0cl92YWx1ZV9maWxsX3Jvb3RfZWwoc3RydWN0IG9jZnMyX2V4dGVudF90cmVlICpldCkKIHsKLQlzdHJ1Y3Qgb2NmczJfeGF0dHJfdmFsdWVfcm9vdCAqeHYgPSBldC0+ZXRfb2JqZWN0OworCXN0cnVjdCBvY2ZzMl94YXR0cl92YWx1ZV9idWYgKnZiID0gZXQtPmV0X29iamVjdDsKIAotCWV0LT5ldF9yb290X2VsID0gJnh2LT54cl9saXN0OworCWV0LT5ldF9yb290X2VsID0gJnZiLT52Yl94di0+eHJfbGlzdDsKIH0KIAogc3RhdGljIHZvaWQgb2NmczJfeGF0dHJfdmFsdWVfc2V0X2xhc3RfZWJfYmxrKHN0cnVjdCBvY2ZzMl9leHRlbnRfdHJlZSAqZXQsCiAJCQkJCSAgICAgIHU2NCBibGtubykKIHsKLQlzdHJ1Y3Qgb2NmczJfeGF0dHJfdmFsdWVfcm9vdCAqeHYgPQotCQkoc3RydWN0IG9jZnMyX3hhdHRyX3ZhbHVlX3Jvb3QgKilldC0+ZXRfb2JqZWN0OworCXN0cnVjdCBvY2ZzMl94YXR0cl92YWx1ZV9idWYgKnZiID0gZXQtPmV0X29iamVjdDsKIAotCXh2LT54cl9sYXN0X2ViX2JsayA9IGNwdV90b19sZTY0KGJsa25vKTsKKwl2Yi0+dmJfeHYtPnhyX2xhc3RfZWJfYmxrID0gY3B1X3RvX2xlNjQoYmxrbm8pOwogfQogCiBzdGF0aWMgdTY0IG9jZnMyX3hhdHRyX3ZhbHVlX2dldF9sYXN0X2ViX2JsayhzdHJ1Y3Qgb2NmczJfZXh0ZW50X3RyZWUgKmV0KQogewotCXN0cnVjdCBvY2ZzMl94YXR0cl92YWx1ZV9yb290ICp4diA9Ci0JCShzdHJ1Y3Qgb2NmczJfeGF0dHJfdmFsdWVfcm9vdCAqKSBldC0+ZXRfb2JqZWN0OworCXN0cnVjdCBvY2ZzMl94YXR0cl92YWx1ZV9idWYgKnZiID0gZXQtPmV0X29iamVjdDsKIAotCXJldHVybiBsZTY0X3RvX2NwdSh4di0+eHJfbGFzdF9lYl9ibGspOworCXJldHVybiBsZTY0X3RvX2NwdSh2Yi0+dmJfeHYtPnhyX2xhc3RfZWJfYmxrKTsKIH0KIAogc3RhdGljIHZvaWQgb2NmczJfeGF0dHJfdmFsdWVfdXBkYXRlX2NsdXN0ZXJzKHN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJCQkJCSAgICAgIHN0cnVjdCBvY2ZzMl9leHRlbnRfdHJlZSAqZXQsCiAJCQkJCSAgICAgIHUzMiBjbHVzdGVycykKIHsKLQlzdHJ1Y3Qgb2NmczJfeGF0dHJfdmFsdWVfcm9vdCAqeHYgPQotCQkoc3RydWN0IG9jZnMyX3hhdHRyX3ZhbHVlX3Jvb3QgKilldC0+ZXRfb2JqZWN0OworCXN0cnVjdCBvY2ZzMl94YXR0cl92YWx1ZV9idWYgKnZiID0gZXQtPmV0X29iamVjdDsKIAotCWxlMzJfYWRkX2NwdSgmeHYtPnhyX2NsdXN0ZXJzLCBjbHVzdGVycyk7CisJbGUzMl9hZGRfY3B1KCZ2Yi0+dmJfeHYtPnhyX2NsdXN0ZXJzLCBjbHVzdGVycyk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3Qgb2NmczJfZXh0ZW50X3RyZWVfb3BlcmF0aW9ucyBvY2ZzMl94YXR0cl92YWx1ZV9ldF9vcHMgPSB7CkBAIC0zMDQsMTEgKzI5NiwxMyBAQAogc3RhdGljIHZvaWQgX19vY2ZzMl9pbml0X2V4dGVudF90cmVlKHN0cnVjdCBvY2ZzMl9leHRlbnRfdHJlZSAqZXQsCiAJCQkJICAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlLAogCQkJCSAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwKKwkJCQkgICAgIG9jZnMyX2pvdXJuYWxfYWNjZXNzX2Z1bmMgYWNjZXNzLAogCQkJCSAgICAgdm9pZCAqb2JqLAogCQkJCSAgICAgc3RydWN0IG9jZnMyX2V4dGVudF90cmVlX29wZXJhdGlvbnMgKm9wcykKIHsKIAlldC0+ZXRfb3BzID0gb3BzOwogCWV0LT5ldF9yb290X2JoID0gYmg7CisJZXQtPmV0X3Jvb3Rfam91cm5hbF9hY2Nlc3MgPSBhY2Nlc3M7CiAJaWYgKCFvYmopCiAJCW9iaiA9ICh2b2lkICopYmgtPmJfZGF0YTsKIAlldC0+ZXRfb2JqZWN0ID0gb2JqOwpAQCAtMzI0LDIzICszMTgsMjMgQEAKIAkJCQkgICBzdHJ1Y3QgaW5vZGUgKmlub2RlLAogCQkJCSAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCiB7Ci0JX19vY2ZzMl9pbml0X2V4dGVudF90cmVlKGV0LCBpbm9kZSwgYmgsIE5VTEwsICZvY2ZzMl9kaW5vZGVfZXRfb3BzKTsKKwlfX29jZnMyX2luaXRfZXh0ZW50X3RyZWUoZXQsIGlub2RlLCBiaCwgb2NmczJfam91cm5hbF9hY2Nlc3NfZGksCisJCQkJIE5VTEwsICZvY2ZzMl9kaW5vZGVfZXRfb3BzKTsKIH0KIAogdm9pZCBvY2ZzMl9pbml0X3hhdHRyX3RyZWVfZXh0ZW50X3RyZWUoc3RydWN0IG9jZnMyX2V4dGVudF90cmVlICpldCwKIAkJCQkgICAgICAgc3RydWN0IGlub2RlICppbm9kZSwKIAkJCQkgICAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKIHsKLQlfX29jZnMyX2luaXRfZXh0ZW50X3RyZWUoZXQsIGlub2RlLCBiaCwgTlVMTCwKLQkJCQkgJm9jZnMyX3hhdHRyX3RyZWVfZXRfb3BzKTsKKwlfX29jZnMyX2luaXRfZXh0ZW50X3RyZWUoZXQsIGlub2RlLCBiaCwgb2NmczJfam91cm5hbF9hY2Nlc3NfeGIsCisJCQkJIE5VTEwsICZvY2ZzMl94YXR0cl90cmVlX2V0X29wcyk7CiB9CiAKIHZvaWQgb2NmczJfaW5pdF94YXR0cl92YWx1ZV9leHRlbnRfdHJlZShzdHJ1Y3Qgb2NmczJfZXh0ZW50X3RyZWUgKmV0LAogCQkJCQlzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCQkJCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLAotCQkJCQlzdHJ1Y3Qgb2NmczJfeGF0dHJfdmFsdWVfcm9vdCAqeHYpCisJCQkJCXN0cnVjdCBvY2ZzMl94YXR0cl92YWx1ZV9idWYgKnZiKQogewotCV9fb2NmczJfaW5pdF9leHRlbnRfdHJlZShldCwgaW5vZGUsIGJoLCB4diwKKwlfX29jZnMyX2luaXRfZXh0ZW50X3RyZWUoZXQsIGlub2RlLCB2Yi0+dmJfYmgsIHZiLT52Yl9hY2Nlc3MsIHZiLAogCQkJCSAmb2NmczJfeGF0dHJfdmFsdWVfZXRfb3BzKTsKIH0KIApAQCAtMzYyLDYgKzM1NiwxNSBAQAogCWV0LT5ldF9vcHMtPmVvX3VwZGF0ZV9jbHVzdGVycyhpbm9kZSwgZXQsIGNsdXN0ZXJzKTsKIH0KIAorc3RhdGljIGlubGluZSBpbnQgb2NmczJfZXRfcm9vdF9qb3VybmFsX2FjY2VzcyhoYW5kbGVfdCAqaGFuZGxlLAorCQkJCQkgICAgICAgc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkJICAgICAgIHN0cnVjdCBvY2ZzMl9leHRlbnRfdHJlZSAqZXQsCisJCQkJCSAgICAgICBpbnQgdHlwZSkKK3sKKwlyZXR1cm4gZXQtPmV0X3Jvb3Rfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwgZXQtPmV0X3Jvb3RfYmgsCisJCQkJCSAgdHlwZSk7Cit9CisKIHN0YXRpYyBpbmxpbmUgaW50IG9jZnMyX2V0X2luc2VydF9jaGVjayhzdHJ1Y3QgaW5vZGUgKmlub2RlLAogCQkJCQlzdHJ1Y3Qgb2NmczJfZXh0ZW50X3RyZWUgKmV0LAogCQkJCQlzdHJ1Y3Qgb2NmczJfZXh0ZW50X3JlYyAqcmVjKQpAQCAtNDAyLDEyICs0MDUsMTQgQEAKICNkZWZpbmUgT0NGUzJfTUFYX1BBVEhfREVQVEgJNQogCiBzdHJ1Y3Qgb2NmczJfcGF0aCB7Ci0JaW50CQkJcF90cmVlX2RlcHRoOwotCXN0cnVjdCBvY2ZzMl9wYXRoX2l0ZW0JcF9ub2RlW09DRlMyX01BWF9QQVRIX0RFUFRIXTsKKwlpbnQJCQkJcF90cmVlX2RlcHRoOworCW9jZnMyX2pvdXJuYWxfYWNjZXNzX2Z1bmMJcF9yb290X2FjY2VzczsKKwlzdHJ1Y3Qgb2NmczJfcGF0aF9pdGVtCQlwX25vZGVbT0NGUzJfTUFYX1BBVEhfREVQVEhdOwogfTsKIAogI2RlZmluZSBwYXRoX3Jvb3RfYmgoX3BhdGgpICgoX3BhdGgpLT5wX25vZGVbMF0uYmgpCiAjZGVmaW5lIHBhdGhfcm9vdF9lbChfcGF0aCkgKChfcGF0aCktPnBfbm9kZVswXS5lbCkKKyNkZWZpbmUgcGF0aF9yb290X2FjY2VzcyhfcGF0aCkoKF9wYXRoKS0+cF9yb290X2FjY2VzcykKICNkZWZpbmUgcGF0aF9sZWFmX2JoKF9wYXRoKSAoKF9wYXRoKS0+cF9ub2RlWyhfcGF0aCktPnBfdHJlZV9kZXB0aF0uYmgpCiAjZGVmaW5lIHBhdGhfbGVhZl9lbChfcGF0aCkgKChfcGF0aCktPnBfbm9kZVsoX3BhdGgpLT5wX3RyZWVfZGVwdGhdLmVsKQogI2RlZmluZSBwYXRoX251bV9pdGVtcyhfcGF0aCkgKChfcGF0aCktPnBfdHJlZV9kZXB0aCArIDEpCkBAIC00NDAsNiArNDQ1LDggQEAKIAkgKi8KIAlpZiAoa2VlcF9yb290KQogCQlkZXB0aCA9IGxlMTZfdG9fY3B1KHBhdGhfcm9vdF9lbChwYXRoKS0+bF90cmVlX2RlcHRoKTsKKwllbHNlCisJCXBhdGhfcm9vdF9hY2Nlc3MocGF0aCkgPSBOVUxMOwogCiAJcGF0aC0+cF90cmVlX2RlcHRoID0gZGVwdGg7CiB9CkBAIC00NjUsNiArNDcyLDcgQEAKIAogCUJVR19PTihwYXRoX3Jvb3RfYmgoZGVzdCkgIT0gcGF0aF9yb290X2JoKHNyYykpOwogCUJVR19PTihwYXRoX3Jvb3RfZWwoZGVzdCkgIT0gcGF0aF9yb290X2VsKHNyYykpOworCUJVR19PTihwYXRoX3Jvb3RfYWNjZXNzKGRlc3QpICE9IHBhdGhfcm9vdF9hY2Nlc3Moc3JjKSk7CiAKIAlvY2ZzMl9yZWluaXRfcGF0aChkZXN0LCAxKTsKIApAQCAtNDg2LDYgKzQ5NCw3IEBACiAJaW50IGk7CiAKIAlCVUdfT04ocGF0aF9yb290X2JoKGRlc3QpICE9IHBhdGhfcm9vdF9iaChzcmMpKTsKKwlCVUdfT04ocGF0aF9yb290X2FjY2VzcyhkZXN0KSAhPSBwYXRoX3Jvb3RfYWNjZXNzKHNyYykpOwogCiAJZm9yKGkgPSAxOyBpIDwgT0NGUzJfTUFYX1BBVEhfREVQVEg7IGkrKykgewogCQlicmVsc2UoZGVzdC0+cF9ub2RlW2ldLmJoKTsKQEAgLTUyMSw3ICs1MzAsOCBAQAogfQogCiBzdGF0aWMgc3RydWN0IG9jZnMyX3BhdGggKm9jZnMyX25ld19wYXRoKHN0cnVjdCBidWZmZXJfaGVhZCAqcm9vdF9iaCwKLQkJCQkJIHN0cnVjdCBvY2ZzMl9leHRlbnRfbGlzdCAqcm9vdF9lbCkKKwkJCQkJIHN0cnVjdCBvY2ZzMl9leHRlbnRfbGlzdCAqcm9vdF9lbCwKKwkJCQkJIG9jZnMyX2pvdXJuYWxfYWNjZXNzX2Z1bmMgYWNjZXNzKQogewogCXN0cnVjdCBvY2ZzMl9wYXRoICpwYXRoOwogCkBAIC01MzMsMTEgKzU0Myw0OCBAQAogCQlnZXRfYmgocm9vdF9iaCk7CiAJCXBhdGhfcm9vdF9iaChwYXRoKSA9IHJvb3RfYmg7CiAJCXBhdGhfcm9vdF9lbChwYXRoKSA9IHJvb3RfZWw7CisJCXBhdGhfcm9vdF9hY2Nlc3MocGF0aCkgPSBhY2Nlc3M7CiAJfQogCiAJcmV0dXJuIHBhdGg7CiB9CiAKK3N0YXRpYyBzdHJ1Y3Qgb2NmczJfcGF0aCAqb2NmczJfbmV3X3BhdGhfZnJvbV9wYXRoKHN0cnVjdCBvY2ZzMl9wYXRoICpwYXRoKQoreworCXJldHVybiBvY2ZzMl9uZXdfcGF0aChwYXRoX3Jvb3RfYmgocGF0aCksIHBhdGhfcm9vdF9lbChwYXRoKSwKKwkJCSAgICAgIHBhdGhfcm9vdF9hY2Nlc3MocGF0aCkpOworfQorCitzdGF0aWMgc3RydWN0IG9jZnMyX3BhdGggKm9jZnMyX25ld19wYXRoX2Zyb21fZXQoc3RydWN0IG9jZnMyX2V4dGVudF90cmVlICpldCkKK3sKKwlyZXR1cm4gb2NmczJfbmV3X3BhdGgoZXQtPmV0X3Jvb3RfYmgsIGV0LT5ldF9yb290X2VsLAorCQkJICAgICAgZXQtPmV0X3Jvb3Rfam91cm5hbF9hY2Nlc3MpOworfQorCisvKgorICogSm91cm5hbCB0aGUgYnVmZmVyIGF0IGRlcHRoIGlkeC4gIEFsbCBpZHg+MCBhcmUgZXh0ZW50X2Jsb2NrcywKKyAqIG90aGVyd2lzZSBpdCdzIHRoZSByb290X2FjY2VzcyBmdW5jdGlvbi4KKyAqCisgKiBJIGRvbid0IGxpa2UgdGhlIHdheSB0aGlzIGZ1bmN0aW9uJ3MgbmFtZSBsb29rcyBuZXh0IHRvCisgKiBvY2ZzMl9qb3VybmFsX2FjY2Vzc19wYXRoKCksIGJ1dCBJIGRvbid0IGhhdmUgYSBiZXR0ZXIgb25lLgorICovCitzdGF0aWMgaW50IG9jZnMyX3BhdGhfYmhfam91cm5hbF9hY2Nlc3MoaGFuZGxlX3QgKmhhbmRsZSwKKwkJCQkJc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkJc3RydWN0IG9jZnMyX3BhdGggKnBhdGgsCisJCQkJCWludCBpZHgpCit7CisJb2NmczJfam91cm5hbF9hY2Nlc3NfZnVuYyBhY2Nlc3MgPSBwYXRoX3Jvb3RfYWNjZXNzKHBhdGgpOworCisJaWYgKCFhY2Nlc3MpCisJCWFjY2VzcyA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzOworCisJaWYgKGlkeCkKKwkJYWNjZXNzID0gb2NmczJfam91cm5hbF9hY2Nlc3NfZWI7CisKKwlyZXR1cm4gYWNjZXNzKGhhbmRsZSwgaW5vZGUsIHBhdGgtPnBfbm9kZVtpZHhdLmJoLAorCQkgICAgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7Cit9CisKIC8qCiAgKiBDb252ZW5pZW5jZSBmdW5jdGlvbiB0byBqb3VybmFsIGFsbCBjb21wb25lbnRzIGluIGEgcGF0aC4KICAqLwpAQCAtNTUwLDggKzU5Nyw3IEBACiAJCWdvdG8gb3V0OwogCiAJZm9yKGkgPSAwOyBpIDwgcGF0aF9udW1faXRlbXMocGF0aCk7IGkrKykgewotCQlyZXQgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGlub2RlLCBwYXRoLT5wX25vZGVbaV0uYmgsCi0JCQkJCSAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKKwkJcmV0ID0gb2NmczJfcGF0aF9iaF9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGlub2RlLCBwYXRoLCBpKTsKIAkJaWYgKHJldCA8IDApIHsKIAkJCW1sb2dfZXJybm8ocmV0KTsKIAkJCWdvdG8gb3V0OwpAQCAtNjg2LDYgKzczMiw4MCBAQAogCWludAkJCWNfc3BsaXRfY292ZXJzX3JlYzsKIH07CiAKK3N0YXRpYyBpbnQgb2NmczJfdmFsaWRhdGVfZXh0ZW50X2Jsb2NrKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCQkJICAgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCit7CisJaW50IHJjOworCXN0cnVjdCBvY2ZzMl9leHRlbnRfYmxvY2sgKmViID0KKwkJKHN0cnVjdCBvY2ZzMl9leHRlbnRfYmxvY2sgKiliaC0+Yl9kYXRhOworCisJbWxvZygwLCAiVmFsaWRhdGluZyBleHRlbnQgYmxvY2sgJWxsdVxuIiwKKwkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpYmgtPmJfYmxvY2tucik7CisKKwlCVUdfT04oIWJ1ZmZlcl91cHRvZGF0ZShiaCkpOworCisJLyoKKwkgKiBJZiB0aGUgZWNjIGZhaWxzLCB3ZSByZXR1cm4gdGhlIGVycm9yIGJ1dCBvdGhlcndpc2UKKwkgKiBsZWF2ZSB0aGUgZmlsZXN5c3RlbSBydW5uaW5nLiAgV2Uga25vdyBhbnkgZXJyb3IgaXMKKwkgKiBsb2NhbCB0byB0aGlzIGJsb2NrLgorCSAqLworCXJjID0gb2NmczJfdmFsaWRhdGVfbWV0YV9lY2Moc2IsIGJoLT5iX2RhdGEsICZlYi0+aF9jaGVjayk7CisJaWYgKHJjKSB7CisJCW1sb2coTUxfRVJST1IsICJDaGVja3N1bSBmYWlsZWQgZm9yIGV4dGVudCBibG9jayAlbGx1XG4iLAorCQkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpYmgtPmJfYmxvY2tucik7CisJCXJldHVybiByYzsKKwl9CisKKwkvKgorCSAqIEVycm9ycyBhZnRlciBoZXJlIGFyZSBmYXRhbC4KKwkgKi8KKworCWlmICghT0NGUzJfSVNfVkFMSURfRVhURU5UX0JMT0NLKGViKSkgeworCQlvY2ZzMl9lcnJvcihzYiwKKwkJCSAgICAiRXh0ZW50IGJsb2NrICMlbGx1IGhhcyBiYWQgc2lnbmF0dXJlICUuKnMiLAorCQkJICAgICh1bnNpZ25lZCBsb25nIGxvbmcpYmgtPmJfYmxvY2tuciwgNywKKwkJCSAgICBlYi0+aF9zaWduYXR1cmUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAobGU2NF90b19jcHUoZWItPmhfYmxrbm8pICE9IGJoLT5iX2Jsb2NrbnIpIHsKKwkJb2NmczJfZXJyb3Ioc2IsCisJCQkgICAgIkV4dGVudCBibG9jayAjJWxsdSBoYXMgYW4gaW52YWxpZCBoX2Jsa25vICIKKwkJCSAgICAib2YgJWxsdSIsCisJCQkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyliaC0+Yl9ibG9ja25yLAorCQkJICAgICh1bnNpZ25lZCBsb25nIGxvbmcpbGU2NF90b19jcHUoZWItPmhfYmxrbm8pKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGxlMzJfdG9fY3B1KGViLT5oX2ZzX2dlbmVyYXRpb24pICE9IE9DRlMyX1NCKHNiKS0+ZnNfZ2VuZXJhdGlvbikgeworCQlvY2ZzMl9lcnJvcihzYiwKKwkJCSAgICAiRXh0ZW50IGJsb2NrICMlbGx1IGhhcyBhbiBpbnZhbGlkICIKKwkJCSAgICAiaF9mc19nZW5lcmF0aW9uIG9mICMldSIsCisJCQkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyliaC0+Yl9ibG9ja25yLAorCQkJICAgIGxlMzJfdG9fY3B1KGViLT5oX2ZzX2dlbmVyYXRpb24pKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCBvY2ZzMl9yZWFkX2V4dGVudF9ibG9jayhzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1NjQgZWJfYmxrbm8sCisJCQkgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICoqYmgpCit7CisJaW50IHJjOworCXN0cnVjdCBidWZmZXJfaGVhZCAqdG1wID0gKmJoOworCisJcmMgPSBvY2ZzMl9yZWFkX2Jsb2NrKGlub2RlLCBlYl9ibGtubywgJnRtcCwKKwkJCSAgICAgIG9jZnMyX3ZhbGlkYXRlX2V4dGVudF9ibG9jayk7CisKKwkvKiBJZiBvY2ZzMl9yZWFkX2Jsb2NrKCkgZ290IHVzIGEgbmV3IGJoLCBwYXNzIGl0IHVwLiAqLworCWlmICghcmMgJiYgISpiaCkKKwkJKmJoID0gdG1wOworCisJcmV0dXJuIHJjOworfQorCisKIC8qCiAgKiBIb3cgbWFueSBmcmVlIGV4dGVudHMgaGF2ZSB3ZSBnb3QgYmVmb3JlIHdlIG5lZWQgbW9yZSBtZXRhIGRhdGE/CiAgKi8KQEAgLTcwNSw4ICs4MjUsNyBAQAogCWxhc3RfZWJfYmxrID0gb2NmczJfZXRfZ2V0X2xhc3RfZWJfYmxrKGV0KTsKIAogCWlmIChsYXN0X2ViX2JsaykgewotCQlyZXR2YWwgPSBvY2ZzMl9yZWFkX2Jsb2NrKGlub2RlLCBsYXN0X2ViX2JsaywKLQkJCQkJICAmZWJfYmgpOworCQlyZXR2YWwgPSBvY2ZzMl9yZWFkX2V4dGVudF9ibG9jayhpbm9kZSwgbGFzdF9lYl9ibGssICZlYl9iaCk7CiAJCWlmIChyZXR2YWwgPCAwKSB7CiAJCQltbG9nX2Vycm5vKHJldHZhbCk7CiAJCQlnb3RvIGJhaWw7CkBAIC03NjgsOCArODg3LDggQEAKIAkJCX0KIAkJCW9jZnMyX3NldF9uZXdfYnVmZmVyX3VwdG9kYXRlKGlub2RlLCBiaHNbaV0pOwogCi0JCQlzdGF0dXMgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGlub2RlLCBiaHNbaV0sCi0JCQkJCQkgICAgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19DUkVBVEUpOworCQkJc3RhdHVzID0gb2NmczJfam91cm5hbF9hY2Nlc3NfZWIoaGFuZGxlLCBpbm9kZSwgYmhzW2ldLAorCQkJCQkJCSBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19DUkVBVEUpOwogCQkJaWYgKHN0YXR1cyA8IDApIHsKIAkJCQltbG9nX2Vycm5vKHN0YXR1cyk7CiAJCQkJZ290byBiYWlsOwpAQCAtOTA4LDE1ICsxMDI3LDEyIEBACiAJZm9yKGkgPSAwOyBpIDwgbmV3X2Jsb2NrczsgaSsrKSB7CiAJCWJoID0gbmV3X2ViX2Joc1tpXTsKIAkJZWIgPSAoc3RydWN0IG9jZnMyX2V4dGVudF9ibG9jayAqKSBiaC0+Yl9kYXRhOwotCQlpZiAoIU9DRlMyX0lTX1ZBTElEX0VYVEVOVF9CTE9DSyhlYikpIHsKLQkJCU9DRlMyX1JPX09OX0lOVkFMSURfRVhURU5UX0JMT0NLKGlub2RlLT5pX3NiLCBlYik7Ci0JCQlzdGF0dXMgPSAtRUlPOwotCQkJZ290byBiYWlsOwotCQl9CisJCS8qIG9jZnMyX2NyZWF0ZV9uZXdfbWV0YV9iaHMoKSBzaG91bGQgY3JlYXRlIGl0IHJpZ2h0ISAqLworCQlCVUdfT04oIU9DRlMyX0lTX1ZBTElEX0VYVEVOVF9CTE9DSyhlYikpOwogCQllYl9lbCA9ICZlYi0+aF9saXN0OwogCi0JCXN0YXR1cyA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgaW5vZGUsIGJoLAotCQkJCQkgICAgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19DUkVBVEUpOworCQlzdGF0dXMgPSBvY2ZzMl9qb3VybmFsX2FjY2Vzc19lYihoYW5kbGUsIGlub2RlLCBiaCwKKwkJCQkJCSBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19DUkVBVEUpOwogCQlpZiAoc3RhdHVzIDwgMCkgewogCQkJbWxvZ19lcnJubyhzdGF0dXMpOwogCQkJZ290byBiYWlsOwpAQCAtOTU1LDIxICsxMDcxLDIxIEBACiAJICogam91cm5hbF9kaXJ0eSBlcnJvcmluZyBhcyBpdCB3b24ndCB1bmxlc3Mgd2UndmUgYWJvcnRlZCB0aGUKIAkgKiBoYW5kbGUgKGluIHdoaWNoIGNhc2Ugd2Ugd291bGQgbmV2ZXIgYmUgaGVyZSkgc28gcmVzZXJ2aW5nCiAJICogdGhlIHdyaXRlIHdpdGggam91cm5hbF9hY2Nlc3MgaXMgYWxsIHdlIG5lZWQgdG8gZG8uICovCi0Jc3RhdHVzID0gb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwgKmxhc3RfZWJfYmgsCi0JCQkJICAgICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOworCXN0YXR1cyA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzX2ViKGhhbmRsZSwgaW5vZGUsICpsYXN0X2ViX2JoLAorCQkJCQkgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOwogCWlmIChzdGF0dXMgPCAwKSB7CiAJCW1sb2dfZXJybm8oc3RhdHVzKTsKIAkJZ290byBiYWlsOwogCX0KLQlzdGF0dXMgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGlub2RlLCBldC0+ZXRfcm9vdF9iaCwKLQkJCQkgICAgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CisJc3RhdHVzID0gb2NmczJfZXRfcm9vdF9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGlub2RlLCBldCwKKwkJCQkJICAgICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOwogCWlmIChzdGF0dXMgPCAwKSB7CiAJCW1sb2dfZXJybm8oc3RhdHVzKTsKIAkJZ290byBiYWlsOwogCX0KIAlpZiAoZWJfYmgpIHsKLQkJc3RhdHVzID0gb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwgZWJfYmgsCi0JCQkJCSAgICAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKKwkJc3RhdHVzID0gb2NmczJfam91cm5hbF9hY2Nlc3NfZWIoaGFuZGxlLCBpbm9kZSwgZWJfYmgsCisJCQkJCQkgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOwogCQlpZiAoc3RhdHVzIDwgMCkgewogCQkJbWxvZ19lcnJubyhzdGF0dXMpOwogCQkJZ290byBiYWlsOwpAQCAtMTA1MiwxNyArMTE2OCwxNCBAQAogCX0KIAogCWViID0gKHN0cnVjdCBvY2ZzMl9leHRlbnRfYmxvY2sgKikgbmV3X2ViX2JoLT5iX2RhdGE7Ci0JaWYgKCFPQ0ZTMl9JU19WQUxJRF9FWFRFTlRfQkxPQ0soZWIpKSB7Ci0JCU9DRlMyX1JPX09OX0lOVkFMSURfRVhURU5UX0JMT0NLKGlub2RlLT5pX3NiLCBlYik7Ci0JCXN0YXR1cyA9IC1FSU87Ci0JCWdvdG8gYmFpbDsKLQl9CisJLyogb2NmczJfY3JlYXRlX25ld19tZXRhX2JocygpIHNob3VsZCBjcmVhdGUgaXQgcmlnaHQhICovCisJQlVHX09OKCFPQ0ZTMl9JU19WQUxJRF9FWFRFTlRfQkxPQ0soZWIpKTsKIAogCWViX2VsID0gJmViLT5oX2xpc3Q7CiAJcm9vdF9lbCA9IGV0LT5ldF9yb290X2VsOwogCi0Jc3RhdHVzID0gb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwgbmV3X2ViX2JoLAotCQkJCSAgICAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX0NSRUFURSk7CisJc3RhdHVzID0gb2NmczJfam91cm5hbF9hY2Nlc3NfZWIoaGFuZGxlLCBpbm9kZSwgbmV3X2ViX2JoLAorCQkJCQkgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfQ1JFQVRFKTsKIAlpZiAoc3RhdHVzIDwgMCkgewogCQltbG9nX2Vycm5vKHN0YXR1cyk7CiAJCWdvdG8gYmFpbDsKQEAgLTEwODAsOCArMTE5Myw4IEBACiAJCWdvdG8gYmFpbDsKIAl9CiAKLQlzdGF0dXMgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGlub2RlLCBldC0+ZXRfcm9vdF9iaCwKLQkJCQkgICAgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CisJc3RhdHVzID0gb2NmczJfZXRfcm9vdF9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGlub2RlLCBldCwKKwkJCQkJICAgICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOwogCWlmIChzdGF0dXMgPCAwKSB7CiAJCW1sb2dfZXJybm8oc3RhdHVzKTsKIAkJZ290byBiYWlsOwpAQCAtMTE3NiwxOCArMTI4OSwxMyBAQAogCQlicmVsc2UoYmgpOwogCQliaCA9IE5VTEw7CiAKLQkJc3RhdHVzID0gb2NmczJfcmVhZF9ibG9jayhpbm9kZSwgYmxrbm8sICZiaCk7CisJCXN0YXR1cyA9IG9jZnMyX3JlYWRfZXh0ZW50X2Jsb2NrKGlub2RlLCBibGtubywgJmJoKTsKIAkJaWYgKHN0YXR1cyA8IDApIHsKIAkJCW1sb2dfZXJybm8oc3RhdHVzKTsKIAkJCWdvdG8gYmFpbDsKIAkJfQogCiAJCWViID0gKHN0cnVjdCBvY2ZzMl9leHRlbnRfYmxvY2sgKikgYmgtPmJfZGF0YTsKLQkJaWYgKCFPQ0ZTMl9JU19WQUxJRF9FWFRFTlRfQkxPQ0soZWIpKSB7Ci0JCQlPQ0ZTMl9ST19PTl9JTlZBTElEX0VYVEVOVF9CTE9DSyhpbm9kZS0+aV9zYiwgZWIpOwotCQkJc3RhdHVzID0gLUVJTzsKLQkJCWdvdG8gYmFpbDsKLQkJfQogCQllbCA9ICZlYi0+aF9saXN0OwogCiAJCWlmIChsZTE2X3RvX2NwdShlbC0+bF9uZXh0X2ZyZWVfcmVjKSA8CkBAIC0xNTQwLDcgKzE2NDgsNyBAQAogCiAJCWJyZWxzZShiaCk7CiAJCWJoID0gTlVMTDsKLQkJcmV0ID0gb2NmczJfcmVhZF9ibG9jayhpbm9kZSwgYmxrbm8sICZiaCk7CisJCXJldCA9IG9jZnMyX3JlYWRfZXh0ZW50X2Jsb2NrKGlub2RlLCBibGtubywgJmJoKTsKIAkJaWYgKHJldCkgewogCQkJbWxvZ19lcnJubyhyZXQpOwogCQkJZ290byBvdXQ7CkBAIC0xNTQ4LDExICsxNjU2LDYgQEAKIAogCQllYiA9IChzdHJ1Y3Qgb2NmczJfZXh0ZW50X2Jsb2NrICopIGJoLT5iX2RhdGE7CiAJCWVsID0gJmViLT5oX2xpc3Q7Ci0JCWlmICghT0NGUzJfSVNfVkFMSURfRVhURU5UX0JMT0NLKGViKSkgewotCQkJT0NGUzJfUk9fT05fSU5WQUxJRF9FWFRFTlRfQkxPQ0soaW5vZGUtPmlfc2IsIGViKTsKLQkJCXJldCA9IC1FSU87Ci0JCQlnb3RvIG91dDsKLQkJfQogCiAJCWlmIChsZTE2X3RvX2NwdShlbC0+bF9uZXh0X2ZyZWVfcmVjKSA+CiAJCSAgICBsZTE2X3RvX2NwdShlbC0+bF9jb3VudCkpIHsKQEAgLTE4NjAsMjUgKzE5NjMsMjMgQEAKIAlyb290X2JoID0gbGVmdF9wYXRoLT5wX25vZGVbc3VidHJlZV9pbmRleF0uYmg7CiAJQlVHX09OKHJvb3RfYmggIT0gcmlnaHRfcGF0aC0+cF9ub2RlW3N1YnRyZWVfaW5kZXhdLmJoKTsKIAotCXJldCA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgaW5vZGUsIHJvb3RfYmgsCi0JCQkJICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOworCXJldCA9IG9jZnMyX3BhdGhfYmhfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwgcmlnaHRfcGF0aCwKKwkJCQkJICAgc3VidHJlZV9pbmRleCk7CiAJaWYgKHJldCkgewogCQltbG9nX2Vycm5vKHJldCk7CiAJCWdvdG8gb3V0OwogCX0KIAogCWZvcihpID0gc3VidHJlZV9pbmRleCArIDE7IGkgPCBwYXRoX251bV9pdGVtcyhyaWdodF9wYXRoKTsgaSsrKSB7Ci0JCXJldCA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgaW5vZGUsCi0JCQkJCSAgIHJpZ2h0X3BhdGgtPnBfbm9kZVtpXS5iaCwKLQkJCQkJICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOworCQlyZXQgPSBvY2ZzMl9wYXRoX2JoX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgaW5vZGUsCisJCQkJCQkgICByaWdodF9wYXRoLCBpKTsKIAkJaWYgKHJldCkgewogCQkJbWxvZ19lcnJubyhyZXQpOwogCQkJZ290byBvdXQ7CiAJCX0KIAotCQlyZXQgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGlub2RlLAotCQkJCQkgICBsZWZ0X3BhdGgtPnBfbm9kZVtpXS5iaCwKLQkJCQkJICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOworCQlyZXQgPSBvY2ZzMl9wYXRoX2JoX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgaW5vZGUsCisJCQkJCQkgICBsZWZ0X3BhdGgsIGkpOwogCQlpZiAocmV0KSB7CiAJCQltbG9nX2Vycm5vKHJldCk7CiAJCQlnb3RvIG91dDsKQEAgLTIxMDIsOCArMjIwMyw3IEBACiAKIAkqcmV0X2xlZnRfcGF0aCA9IE5VTEw7CiAKLQlsZWZ0X3BhdGggPSBvY2ZzMl9uZXdfcGF0aChwYXRoX3Jvb3RfYmgocmlnaHRfcGF0aCksCi0JCQkJICAgcGF0aF9yb290X2VsKHJpZ2h0X3BhdGgpKTsKKwlsZWZ0X3BhdGggPSBvY2ZzMl9uZXdfcGF0aF9mcm9tX3BhdGgocmlnaHRfcGF0aCk7CiAJaWYgKCFsZWZ0X3BhdGgpIHsKIAkJcmV0ID0gLUVOT01FTTsKIAkJbWxvZ19lcnJubyhyZXQpOwpAQCAtMjM5OCw5ICsyNDk4LDkgQEAKIAkJCXJldHVybiAtRUFHQUlOOwogCiAJCWlmIChsZTE2X3RvX2NwdShyaWdodF9sZWFmX2VsLT5sX25leHRfZnJlZV9yZWMpID4gMSkgewotCQkJcmV0ID0gb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwKLQkJCQkJCSAgIHBhdGhfbGVhZl9iaChyaWdodF9wYXRoKSwKLQkJCQkJCSAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKKwkJCXJldCA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzX2ViKGhhbmRsZSwgaW5vZGUsCisJCQkJCQkgICAgICBwYXRoX2xlYWZfYmgocmlnaHRfcGF0aCksCisJCQkJCQkgICAgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CiAJCQlpZiAocmV0KSB7CiAJCQkJbWxvZ19lcnJubyhyZXQpOwogCQkJCWdvdG8gb3V0OwpAQCAtMjQxNyw4ICsyNTE3LDggQEAKIAkJICogV2UgaGF2ZSB0byB1cGRhdGUgaV9sYXN0X2ViX2JsayBkdXJpbmcgdGhlIG1ldGEKIAkJICogZGF0YSBkZWxldGUuCiAJCSAqLwotCQlyZXQgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGlub2RlLCBldF9yb290X2JoLAotCQkJCQkgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CisJCXJldCA9IG9jZnMyX2V0X3Jvb3Rfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwgZXQsCisJCQkJCQkgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CiAJCWlmIChyZXQpIHsKIAkJCW1sb2dfZXJybm8ocmV0KTsKIAkJCWdvdG8gb3V0OwpAQCAtMjQzMywyNSArMjUzMywyMyBAQAogCSAqLwogCUJVR19PTihyaWdodF9oYXNfZW1wdHkgJiYgIWRlbF9yaWdodF9zdWJ0cmVlKTsKIAotCXJldCA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgaW5vZGUsIHJvb3RfYmgsCi0JCQkJICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOworCXJldCA9IG9jZnMyX3BhdGhfYmhfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwgcmlnaHRfcGF0aCwKKwkJCQkJICAgc3VidHJlZV9pbmRleCk7CiAJaWYgKHJldCkgewogCQltbG9nX2Vycm5vKHJldCk7CiAJCWdvdG8gb3V0OwogCX0KIAogCWZvcihpID0gc3VidHJlZV9pbmRleCArIDE7IGkgPCBwYXRoX251bV9pdGVtcyhyaWdodF9wYXRoKTsgaSsrKSB7Ci0JCXJldCA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgaW5vZGUsCi0JCQkJCSAgIHJpZ2h0X3BhdGgtPnBfbm9kZVtpXS5iaCwKLQkJCQkJICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOworCQlyZXQgPSBvY2ZzMl9wYXRoX2JoX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgaW5vZGUsCisJCQkJCQkgICByaWdodF9wYXRoLCBpKTsKIAkJaWYgKHJldCkgewogCQkJbWxvZ19lcnJubyhyZXQpOwogCQkJZ290byBvdXQ7CiAJCX0KIAotCQlyZXQgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGlub2RlLAotCQkJCQkgICBsZWZ0X3BhdGgtPnBfbm9kZVtpXS5iaCwKLQkJCQkJICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOworCQlyZXQgPSBvY2ZzMl9wYXRoX2JoX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgaW5vZGUsCisJCQkJCQkgICBsZWZ0X3BhdGgsIGkpOwogCQlpZiAocmV0KSB7CiAJCQltbG9nX2Vycm5vKHJldCk7CiAJCQlnb3RvIG91dDsKQEAgLTI1OTYsMTYgKzI2OTQsMTcgQEAKIAogc3RhdGljIGludCBvY2ZzMl9yb3RhdGVfcmlnaHRtb3N0X2xlYWZfbGVmdChzdHJ1Y3QgaW5vZGUgKmlub2RlLAogCQkJCQkgICAgaGFuZGxlX3QgKmhhbmRsZSwKLQkJCQkJICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsCi0JCQkJCSAgICBzdHJ1Y3Qgb2NmczJfZXh0ZW50X2xpc3QgKmVsKQorCQkJCQkgICAgc3RydWN0IG9jZnMyX3BhdGggKnBhdGgpCiB7CiAJaW50IHJldDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gcGF0aF9sZWFmX2JoKHBhdGgpOworCXN0cnVjdCBvY2ZzMl9leHRlbnRfbGlzdCAqZWwgPSBwYXRoX2xlYWZfZWwocGF0aCk7CiAKIAlpZiAoIW9jZnMyX2lzX2VtcHR5X2V4dGVudCgmZWwtPmxfcmVjc1swXSkpCiAJCXJldHVybiAwOwogCi0JcmV0ID0gb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwgYmgsCi0JCQkJICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOworCXJldCA9IG9jZnMyX3BhdGhfYmhfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwgcGF0aCwKKwkJCQkJICAgcGF0aF9udW1faXRlbXMocGF0aCkgLSAxKTsKIAlpZiAocmV0KSB7CiAJCW1sb2dfZXJybm8ocmV0KTsKIAkJZ290byBvdXQ7CkBAIC0yNjQ0LDggKzI3NDMsNyBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQlsZWZ0X3BhdGggPSBvY2ZzMl9uZXdfcGF0aChwYXRoX3Jvb3RfYmgocGF0aCksCi0JCQkJICAgcGF0aF9yb290X2VsKHBhdGgpKTsKKwlsZWZ0X3BhdGggPSBvY2ZzMl9uZXdfcGF0aF9mcm9tX3BhdGgocGF0aCk7CiAJaWYgKCFsZWZ0X3BhdGgpIHsKIAkJcmV0ID0gLUVOT01FTTsKIAkJbWxvZ19lcnJubyhyZXQpOwpAQCAtMjY1NCw4ICsyNzUyLDcgQEAKIAogCW9jZnMyX2NwX3BhdGgobGVmdF9wYXRoLCBwYXRoKTsKIAotCXJpZ2h0X3BhdGggPSBvY2ZzMl9uZXdfcGF0aChwYXRoX3Jvb3RfYmgocGF0aCksCi0JCQkJICAgIHBhdGhfcm9vdF9lbChwYXRoKSk7CisJcmlnaHRfcGF0aCA9IG9jZnMyX25ld19wYXRoX2Zyb21fcGF0aChwYXRoKTsKIAlpZiAoIXJpZ2h0X3BhdGgpIHsKIAkJcmV0ID0gLUVOT01FTTsKIAkJbWxvZ19lcnJubyhyZXQpOwpAQCAtMjY4OSw5ICsyNzg2LDggQEAKIAkJICogQ2FsbGVyIG1pZ2h0IHN0aWxsIHdhbnQgdG8gbWFrZSBjaGFuZ2VzIHRvIHRoZQogCQkgKiB0cmVlIHJvb3QsIHNvIHJlLWFkZCBpdCB0byB0aGUgam91cm5hbCBoZXJlLgogCQkgKi8KLQkJcmV0ID0gb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwKLQkJCQkJICAgcGF0aF9yb290X2JoKGxlZnRfcGF0aCksCi0JCQkJCSAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKKwkJcmV0ID0gb2NmczJfcGF0aF9iaF9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGlub2RlLAorCQkJCQkJICAgbGVmdF9wYXRoLCAwKTsKIAkJaWYgKHJldCkgewogCQkJbWxvZ19lcnJubyhyZXQpOwogCQkJZ290byBvdXQ7CkBAIC0yNzg1LDggKzI4ODEsNyBAQAogCQkgKiBXZSBoYXZlIGEgcGF0aCB0byB0aGUgbGVmdCBvZiB0aGlzIG9uZSAtIGl0IG5lZWRzCiAJCSAqIGFuIHVwZGF0ZSB0b28uCiAJCSAqLwotCQlsZWZ0X3BhdGggPSBvY2ZzMl9uZXdfcGF0aChwYXRoX3Jvb3RfYmgocGF0aCksCi0JCQkJCSAgIHBhdGhfcm9vdF9lbChwYXRoKSk7CisJCWxlZnRfcGF0aCA9IG9jZnMyX25ld19wYXRoX2Zyb21fcGF0aChwYXRoKTsKIAkJaWYgKCFsZWZ0X3BhdGgpIHsKIAkJCXJldCA9IC1FTk9NRU07CiAJCQltbG9nX2Vycm5vKHJldCk7CkBAIC0yODc1LDggKzI5NzAsNyBAQAogCQkgKiBpdCB1cCBmcm9udC4KIAkJICovCiAJCXJldCA9IG9jZnMyX3JvdGF0ZV9yaWdodG1vc3RfbGVhZl9sZWZ0KGlub2RlLCBoYW5kbGUsCi0JCQkJCQkgICAgICAgcGF0aF9sZWFmX2JoKHBhdGgpLAotCQkJCQkJICAgICAgIHBhdGhfbGVhZl9lbChwYXRoKSk7CisJCQkJCQkgICAgICAgcGF0aCk7CiAJCWlmIChyZXQpCiAJCQltbG9nX2Vycm5vKHJldCk7CiAJCWdvdG8gb3V0OwpAQCAtMzAyNyw4ICszMTIxLDcgQEAKIAkvKiBUaGlzIGZ1bmN0aW9uIHNob3VsZG4ndCBiZSBjYWxsZWQgZm9yIHRoZSByaWdodG1vc3QgbGVhZi4gKi8KIAlCVUdfT04ocmlnaHRfY3BvcyA9PSAwKTsKIAotCXJpZ2h0X3BhdGggPSBvY2ZzMl9uZXdfcGF0aChwYXRoX3Jvb3RfYmgobGVmdF9wYXRoKSwKLQkJCQkgICAgcGF0aF9yb290X2VsKGxlZnRfcGF0aCkpOworCXJpZ2h0X3BhdGggPSBvY2ZzMl9uZXdfcGF0aF9mcm9tX3BhdGgobGVmdF9wYXRoKTsKIAlpZiAoIXJpZ2h0X3BhdGgpIHsKIAkJcmV0ID0gLUVOT01FTTsKIAkJbWxvZ19lcnJubyhyZXQpOwpAQCAtMzExMSw4ICszMjA0LDggQEAKIAkJcm9vdF9iaCA9IGxlZnRfcGF0aC0+cF9ub2RlW3N1YnRyZWVfaW5kZXhdLmJoOwogCQlCVUdfT04ocm9vdF9iaCAhPSByaWdodF9wYXRoLT5wX25vZGVbc3VidHJlZV9pbmRleF0uYmgpOwogCi0JCXJldCA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgaW5vZGUsIHJvb3RfYmgsCi0JCQkJCSAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKKwkJcmV0ID0gb2NmczJfcGF0aF9iaF9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGlub2RlLCByaWdodF9wYXRoLAorCQkJCQkJICAgc3VidHJlZV9pbmRleCk7CiAJCWlmIChyZXQpIHsKIAkJCW1sb2dfZXJybm8ocmV0KTsKIAkJCWdvdG8gb3V0OwpAQCAtMzEyMCwxNyArMzIxMywxNSBAQAogCiAJCWZvciAoaSA9IHN1YnRyZWVfaW5kZXggKyAxOwogCQkgICAgIGkgPCBwYXRoX251bV9pdGVtcyhyaWdodF9wYXRoKTsgaSsrKSB7Ci0JCQlyZXQgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGlub2RlLAotCQkJCQkJICAgcmlnaHRfcGF0aC0+cF9ub2RlW2ldLmJoLAotCQkJCQkJICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOworCQkJcmV0ID0gb2NmczJfcGF0aF9iaF9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGlub2RlLAorCQkJCQkJCSAgIHJpZ2h0X3BhdGgsIGkpOwogCQkJaWYgKHJldCkgewogCQkJCW1sb2dfZXJybm8ocmV0KTsKIAkJCQlnb3RvIG91dDsKIAkJCX0KIAotCQkJcmV0ID0gb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwKLQkJCQkJCSAgIGxlZnRfcGF0aC0+cF9ub2RlW2ldLmJoLAotCQkJCQkJICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOworCQkJcmV0ID0gb2NmczJfcGF0aF9iaF9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGlub2RlLAorCQkJCQkJCSAgIGxlZnRfcGF0aCwgaSk7CiAJCQlpZiAocmV0KSB7CiAJCQkJbWxvZ19lcnJubyhyZXQpOwogCQkJCWdvdG8gb3V0OwpAQCAtMzE0Miw4ICszMjMzLDggQEAKIAkJcmlnaHRfcmVjID0gJmVsLT5sX3JlY3NbaW5kZXggKyAxXTsKIAl9CiAKLQlyZXQgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGlub2RlLCBiaCwKLQkJCQkgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CisJcmV0ID0gb2NmczJfcGF0aF9iaF9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGlub2RlLCBsZWZ0X3BhdGgsCisJCQkJCSAgIHBhdGhfbnVtX2l0ZW1zKGxlZnRfcGF0aCkgLSAxKTsKIAlpZiAocmV0KSB7CiAJCW1sb2dfZXJybm8ocmV0KTsKIAkJZ290byBvdXQ7CkBAIC0zMTk5LDggKzMyOTAsNyBAQAogCS8qIFRoaXMgZnVuY3Rpb24gc2hvdWxkbid0IGJlIGNhbGxlZCBmb3IgdGhlIGxlZnRtb3N0IGxlYWYuICovCiAJQlVHX09OKGxlZnRfY3BvcyA9PSAwKTsKIAotCWxlZnRfcGF0aCA9IG9jZnMyX25ld19wYXRoKHBhdGhfcm9vdF9iaChyaWdodF9wYXRoKSwKLQkJCQkgICBwYXRoX3Jvb3RfZWwocmlnaHRfcGF0aCkpOworCWxlZnRfcGF0aCA9IG9jZnMyX25ld19wYXRoX2Zyb21fcGF0aChyaWdodF9wYXRoKTsKIAlpZiAoIWxlZnRfcGF0aCkgewogCQlyZXQgPSAtRU5PTUVNOwogCQltbG9nX2Vycm5vKHJldCk7CkBAIC0zMjgzLDggKzMzNzMsOCBAQAogCQlyb290X2JoID0gbGVmdF9wYXRoLT5wX25vZGVbc3VidHJlZV9pbmRleF0uYmg7CiAJCUJVR19PTihyb290X2JoICE9IHJpZ2h0X3BhdGgtPnBfbm9kZVtzdWJ0cmVlX2luZGV4XS5iaCk7CiAKLQkJcmV0ID0gb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwgcm9vdF9iaCwKLQkJCQkJICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOworCQlyZXQgPSBvY2ZzMl9wYXRoX2JoX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgaW5vZGUsIHJpZ2h0X3BhdGgsCisJCQkJCQkgICBzdWJ0cmVlX2luZGV4KTsKIAkJaWYgKHJldCkgewogCQkJbWxvZ19lcnJubyhyZXQpOwogCQkJZ290byBvdXQ7CkBAIC0zMjkyLDE3ICszMzgyLDE1IEBACiAKIAkJZm9yIChpID0gc3VidHJlZV9pbmRleCArIDE7CiAJCSAgICAgaSA8IHBhdGhfbnVtX2l0ZW1zKHJpZ2h0X3BhdGgpOyBpKyspIHsKLQkJCXJldCA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgaW5vZGUsCi0JCQkJCQkgICByaWdodF9wYXRoLT5wX25vZGVbaV0uYmgsCi0JCQkJCQkgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CisJCQlyZXQgPSBvY2ZzMl9wYXRoX2JoX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgaW5vZGUsCisJCQkJCQkJICAgcmlnaHRfcGF0aCwgaSk7CiAJCQlpZiAocmV0KSB7CiAJCQkJbWxvZ19lcnJubyhyZXQpOwogCQkJCWdvdG8gb3V0OwogCQkJfQogCi0JCQlyZXQgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGlub2RlLAotCQkJCQkJICAgbGVmdF9wYXRoLT5wX25vZGVbaV0uYmgsCi0JCQkJCQkgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CisJCQlyZXQgPSBvY2ZzMl9wYXRoX2JoX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgaW5vZGUsCisJCQkJCQkJICAgbGVmdF9wYXRoLCBpKTsKIAkJCWlmIChyZXQpIHsKIAkJCQltbG9nX2Vycm5vKHJldCk7CiAJCQkJZ290byBvdXQ7CkBAIC0zMzE0LDggKzM0MDIsOCBAQAogCQkJaGFzX2VtcHR5X2V4dGVudCA9IDE7CiAJfQogCi0JcmV0ID0gb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwgYmgsCi0JCQkJICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOworCXJldCA9IG9jZnMyX3BhdGhfYmhfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwgcmlnaHRfcGF0aCwKKwkJCQkJICAgcGF0aF9udW1faXRlbXMocmlnaHRfcGF0aCkgLSAxKTsKIAlpZiAocmV0KSB7CiAJCW1sb2dfZXJybm8ocmV0KTsKIAkJZ290byBvdXQ7CkBAIC0zNzMyLDggKzM4MjAsNyBAQAogCQkgKiBsZWZ0bW9zdCBsZWFmLgogCQkgKi8KIAkJaWYgKGxlZnRfY3BvcykgewotCQkJbGVmdF9wYXRoID0gb2NmczJfbmV3X3BhdGgocGF0aF9yb290X2JoKHJpZ2h0X3BhdGgpLAotCQkJCQkJICAgcGF0aF9yb290X2VsKHJpZ2h0X3BhdGgpKTsKKwkJCWxlZnRfcGF0aCA9IG9jZnMyX25ld19wYXRoX2Zyb21fcGF0aChyaWdodF9wYXRoKTsKIAkJCWlmICghbGVmdF9wYXRoKSB7CiAJCQkJcmV0ID0gLUVOT01FTTsKIAkJCQltbG9nX2Vycm5vKHJldCk7CkBAIC0zNzgxLDcgKzM4NjgsNyBAQAogCXN0cnVjdCBvY2ZzMl9leHRlbnRfbGlzdCAqbGVmdF9lbCA9IE5VTEwsICpyaWdodF9lbCwgKmluc2VydF9lbCwgKmVsOwogCXN0cnVjdCBvY2ZzMl9leHRlbnRfcmVjICpyZWMsICp0bXByZWM7CiAKLQlyaWdodF9lbCA9IHBhdGhfbGVhZl9lbChyaWdodF9wYXRoKTs7CisJcmlnaHRfZWwgPSBwYXRoX2xlYWZfZWwocmlnaHRfcGF0aCk7CiAJaWYgKGxlZnRfcGF0aCkKIAkJbGVmdF9lbCA9IHBhdGhfbGVhZl9lbChsZWZ0X3BhdGgpOwogCkBAIC0zOTU4LDggKzQwNDUsOCBAQAogCiAJZWwgPSBldC0+ZXRfcm9vdF9lbDsKIAotCXJldCA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgaW5vZGUsIGV0LT5ldF9yb290X2JoLAotCQkJCSAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKKwlyZXQgPSBvY2ZzMl9ldF9yb290X2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgaW5vZGUsIGV0LAorCQkJCQkgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CiAJaWYgKHJldCkgewogCQltbG9nX2Vycm5vKHJldCk7CiAJCWdvdG8gb3V0OwpAQCAtMzk3MCw3ICs0MDU3LDcgQEAKIAkJZ290byBvdXRfdXBkYXRlX2NsdXN0ZXJzOwogCX0KIAotCXJpZ2h0X3BhdGggPSBvY2ZzMl9uZXdfcGF0aChldC0+ZXRfcm9vdF9iaCwgZXQtPmV0X3Jvb3RfZWwpOworCXJpZ2h0X3BhdGggPSBvY2ZzMl9uZXdfcGF0aF9mcm9tX2V0KGV0KTsKIAlpZiAoIXJpZ2h0X3BhdGgpIHsKIAkJcmV0ID0gLUVOT01FTTsKIAkJbWxvZ19lcnJubyhyZXQpOwpAQCAtNDAyMCw4ICs0MTA3LDggQEAKIAkJICogb2NmczJfcm90YXRlX3RyZWVfcmlnaHQoKSBtaWdodCBoYXZlIGV4dGVuZGVkIHRoZQogCQkgKiB0cmFuc2FjdGlvbiB3aXRob3V0IHJlLWpvdXJuYWxpbmcgb3VyIHRyZWUgcm9vdC4KIAkJICovCi0JCXJldCA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgaW5vZGUsIGV0LT5ldF9yb290X2JoLAotCQkJCQkgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CisJCXJldCA9IG9jZnMyX2V0X3Jvb3Rfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwgZXQsCisJCQkJCQkgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CiAJCWlmIChyZXQpIHsKIAkJCW1sb2dfZXJybm8ocmV0KTsKIAkJCWdvdG8gb3V0OwpAQCAtNDA4Miw4ICs0MTY5LDcgQEAKIAkJCWdvdG8gb3V0OwogCiAJCWlmIChsZWZ0X2Nwb3MgIT0gMCkgewotCQkJbGVmdF9wYXRoID0gb2NmczJfbmV3X3BhdGgocGF0aF9yb290X2JoKHBhdGgpLAotCQkJCQkJICAgcGF0aF9yb290X2VsKHBhdGgpKTsKKwkJCWxlZnRfcGF0aCA9IG9jZnMyX25ld19wYXRoX2Zyb21fcGF0aChwYXRoKTsKIAkJCWlmICghbGVmdF9wYXRoKQogCQkJCWdvdG8gb3V0OwogCkBAIC00MDk3LDggKzQxODMsMTUgQEAKIAkJCSAgICBsZTE2X3RvX2NwdShuZXdfZWwtPmxfY291bnQpKSB7CiAJCQkJYmggPSBwYXRoX2xlYWZfYmgobGVmdF9wYXRoKTsKIAkJCQllYiA9IChzdHJ1Y3Qgb2NmczJfZXh0ZW50X2Jsb2NrICopYmgtPmJfZGF0YTsKLQkJCQlPQ0ZTMl9ST19PTl9JTlZBTElEX0VYVEVOVF9CTE9DSyhpbm9kZS0+aV9zYiwKLQkJCQkJCQkJIGViKTsKKwkJCQlvY2ZzMl9lcnJvcihpbm9kZS0+aV9zYiwKKwkJCQkJICAgICJFeHRlbnQgYmxvY2sgIyVsbHUgaGFzIGFuICIKKwkJCQkJICAgICJpbnZhbGlkIGxfbmV4dF9mcmVlX3JlYyBvZiAiCisJCQkJCSAgICAiJWQuICBJdCBzaG91bGQgaGF2ZSAiCisJCQkJCSAgICAibWF0Y2hlZCB0aGUgbF9jb3VudCBvZiAlZCIsCisJCQkJCSAgICAodW5zaWduZWQgbG9uZyBsb25nKWxlNjRfdG9fY3B1KGViLT5oX2Jsa25vKSwKKwkJCQkJICAgIGxlMTZfdG9fY3B1KG5ld19lbC0+bF9uZXh0X2ZyZWVfcmVjKSwKKwkJCQkJICAgIGxlMTZfdG9fY3B1KG5ld19lbC0+bF9jb3VudCkpOworCQkJCXN0YXR1cyA9IC1FSU5WQUw7CiAJCQkJZ290byBvdXQ7CiAJCQl9CiAJCQlyZWMgPSAmbmV3X2VsLT5sX3JlY3NbCkBAIC00MTMyLDggKzQyMjUsNyBAQAogCQlpZiAocmlnaHRfY3BvcyA9PSAwKQogCQkJZ290byBvdXQ7CiAKLQkJcmlnaHRfcGF0aCA9IG9jZnMyX25ld19wYXRoKHBhdGhfcm9vdF9iaChwYXRoKSwKLQkJCQkJICAgIHBhdGhfcm9vdF9lbChwYXRoKSk7CisJCXJpZ2h0X3BhdGggPSBvY2ZzMl9uZXdfcGF0aF9mcm9tX3BhdGgocGF0aCk7CiAJCWlmICghcmlnaHRfcGF0aCkKIAkJCWdvdG8gb3V0OwogCkBAIC00MTQ3LDggKzQyMzksMTIgQEAKIAkJCWlmIChsZTE2X3RvX2NwdShuZXdfZWwtPmxfbmV4dF9mcmVlX3JlYykgPD0gMSkgewogCQkJCWJoID0gcGF0aF9sZWFmX2JoKHJpZ2h0X3BhdGgpOwogCQkJCWViID0gKHN0cnVjdCBvY2ZzMl9leHRlbnRfYmxvY2sgKiliaC0+Yl9kYXRhOwotCQkJCU9DRlMyX1JPX09OX0lOVkFMSURfRVhURU5UX0JMT0NLKGlub2RlLT5pX3NiLAotCQkJCQkJCQkgZWIpOworCQkJCW9jZnMyX2Vycm9yKGlub2RlLT5pX3NiLAorCQkJCQkgICAgIkV4dGVudCBibG9jayAjJWxsdSBoYXMgYW4gIgorCQkJCQkgICAgImludmFsaWQgbF9uZXh0X2ZyZWVfcmVjIG9mICVkIiwKKwkJCQkJICAgICh1bnNpZ25lZCBsb25nIGxvbmcpbGU2NF90b19jcHUoZWItPmhfYmxrbm8pLAorCQkJCQkgICAgbGUxNl90b19jcHUobmV3X2VsLT5sX25leHRfZnJlZV9yZWMpKTsKKwkJCQlzdGF0dXMgPSAtRUlOVkFMOwogCQkJCWdvdG8gb3V0OwogCQkJfQogCQkJcmVjID0gJm5ld19lbC0+bF9yZWNzWzFdOwpAQCAtNDI5NCw3ICs0MzkwLDkgQEAKIAkJICogb2NmczJfZmlndXJlX2luc2VydF90eXBlKCkgYW5kIG9jZnMyX2FkZF9icmFuY2goKQogCQkgKiBtYXkgd2FudCBpdCBsYXRlci4KIAkJICovCi0JCXJldCA9IG9jZnMyX3JlYWRfYmxvY2soaW5vZGUsIG9jZnMyX2V0X2dldF9sYXN0X2ViX2JsayhldCksICZiaCk7CisJCXJldCA9IG9jZnMyX3JlYWRfZXh0ZW50X2Jsb2NrKGlub2RlLAorCQkJCQkgICAgICBvY2ZzMl9ldF9nZXRfbGFzdF9lYl9ibGsoZXQpLAorCQkJCQkgICAgICAmYmgpOwogCQlpZiAocmV0KSB7CiAJCQltbG9nX2V4aXQocmV0KTsKIAkJCWdvdG8gb3V0OwpAQCAtNDMyMCw3ICs0NDE4LDcgQEAKIAkJcmV0dXJuIDA7CiAJfQogCi0JcGF0aCA9IG9jZnMyX25ld19wYXRoKGV0LT5ldF9yb290X2JoLCBldC0+ZXRfcm9vdF9lbCk7CisJcGF0aCA9IG9jZnMyX25ld19wYXRoX2Zyb21fZXQoZXQpOwogCWlmICghcGF0aCkgewogCQlyZXQgPSAtRU5PTUVNOwogCQltbG9nX2Vycm5vKHJldCk7CkBAIC00NTMxLDkgKzQ2MjksOSBAQAogCiAJQlVHX09OKG51bV9iaXRzID4gY2x1c3RlcnNfdG9fYWRkKTsKIAotCS8qIHJlc2VydmUgb3VyIHdyaXRlIGVhcmx5IC0tIGluc2VydF9leHRlbnQgbWF5IHVwZGF0ZSB0aGUgaW5vZGUgKi8KLQlzdGF0dXMgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGlub2RlLCBldC0+ZXRfcm9vdF9iaCwKLQkJCQkgICAgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CisJLyogcmVzZXJ2ZSBvdXIgd3JpdGUgZWFybHkgLS0gaW5zZXJ0X2V4dGVudCBtYXkgdXBkYXRlIHRoZSB0cmVlIHJvb3QgKi8KKwlzdGF0dXMgPSBvY2ZzMl9ldF9yb290X2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgaW5vZGUsIGV0LAorCQkJCQkgICAgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CiAJaWYgKHN0YXR1cyA8IDApIHsKIAkJbWxvZ19lcnJubyhzdGF0dXMpOwogCQlnb3RvIGxlYXZlOwpAQCAtNDc2MCwyMCArNDg1OCwxNSBAQAogCWlmIChwYXRoLT5wX3RyZWVfZGVwdGgpIHsKIAkJc3RydWN0IG9jZnMyX2V4dGVudF9ibG9jayAqZWI7CiAKLQkJcmV0ID0gb2NmczJfcmVhZF9ibG9jayhpbm9kZSwgb2NmczJfZXRfZ2V0X2xhc3RfZWJfYmxrKGV0KSwKLQkJCQkgICAgICAgJmxhc3RfZWJfYmgpOworCQlyZXQgPSBvY2ZzMl9yZWFkX2V4dGVudF9ibG9jayhpbm9kZSwKKwkJCQkJICAgICAgb2NmczJfZXRfZ2V0X2xhc3RfZWJfYmxrKGV0KSwKKwkJCQkJICAgICAgJmxhc3RfZWJfYmgpOwogCQlpZiAocmV0KSB7CiAJCQltbG9nX2V4aXQocmV0KTsKIAkJCWdvdG8gb3V0OwogCQl9CiAKIAkJZWIgPSAoc3RydWN0IG9jZnMyX2V4dGVudF9ibG9jayAqKSBsYXN0X2ViX2JoLT5iX2RhdGE7Ci0JCWlmICghT0NGUzJfSVNfVkFMSURfRVhURU5UX0JMT0NLKGViKSkgewotCQkJT0NGUzJfUk9fT05fSU5WQUxJRF9FWFRFTlRfQkxPQ0soaW5vZGUtPmlfc2IsIGViKTsKLQkJCXJldCA9IC1FUk9GUzsKLQkJCWdvdG8gb3V0OwotCQl9Ci0KIAkJcmlnaHRtb3N0X2VsID0gJmViLT5oX2xpc3Q7CiAJfSBlbHNlCiAJCXJpZ2h0bW9zdF9lbCA9IHBhdGhfcm9vdF9lbChwYXRoKTsKQEAgLTQ4NTQsNyArNDk0Nyw3IEBACiAJaWYgKGV0LT5ldF9vcHMgPT0gJm9jZnMyX2Rpbm9kZV9ldF9vcHMpCiAJCW9jZnMyX2V4dGVudF9tYXBfdHJ1bmMoaW5vZGUsIDApOwogCi0JbGVmdF9wYXRoID0gb2NmczJfbmV3X3BhdGgoZXQtPmV0X3Jvb3RfYmgsIGV0LT5ldF9yb290X2VsKTsKKwlsZWZ0X3BhdGggPSBvY2ZzMl9uZXdfcGF0aF9mcm9tX2V0KGV0KTsKIAlpZiAoIWxlZnRfcGF0aCkgewogCQlyZXQgPSAtRU5PTUVNOwogCQltbG9nX2Vycm5vKHJldCk7CkBAIC00OTE4LDggKzUwMTEsOSBAQAogCiAJZGVwdGggPSBwYXRoLT5wX3RyZWVfZGVwdGg7CiAJaWYgKGRlcHRoID4gMCkgewotCQlyZXQgPSBvY2ZzMl9yZWFkX2Jsb2NrKGlub2RlLCBvY2ZzMl9ldF9nZXRfbGFzdF9lYl9ibGsoZXQpLAotCQkJCSAgICAgICAmbGFzdF9lYl9iaCk7CisJCXJldCA9IG9jZnMyX3JlYWRfZXh0ZW50X2Jsb2NrKGlub2RlLAorCQkJCQkgICAgICBvY2ZzMl9ldF9nZXRfbGFzdF9lYl9ibGsoZXQpLAorCQkJCQkgICAgICAmbGFzdF9lYl9iaCk7CiAJCWlmIChyZXQgPCAwKSB7CiAJCQltbG9nX2Vycm5vKHJldCk7CiAJCQlnb3RvIG91dDsKQEAgLTUwMjUsOCArNTExOSw3IEBACiAJCX0KIAogCQlpZiAobGVmdF9jcG9zICYmIGxlMTZfdG9fY3B1KGVsLT5sX25leHRfZnJlZV9yZWMpID4gMSkgewotCQkJbGVmdF9wYXRoID0gb2NmczJfbmV3X3BhdGgocGF0aF9yb290X2JoKHBhdGgpLAotCQkJCQkJICAgcGF0aF9yb290X2VsKHBhdGgpKTsKKwkJCWxlZnRfcGF0aCA9IG9jZnMyX25ld19wYXRoX2Zyb21fcGF0aChwYXRoKTsKIAkJCWlmICghbGVmdF9wYXRoKSB7CiAJCQkJcmV0ID0gLUVOT01FTTsKIAkJCQltbG9nX2Vycm5vKHJldCk7CkBAIC01MTM1LDcgKzUyMjgsNyBAQAogCiAJb2NmczJfZXh0ZW50X21hcF90cnVuYyhpbm9kZSwgMCk7CiAKLQlwYXRoID0gb2NmczJfbmV3X3BhdGgoZXQtPmV0X3Jvb3RfYmgsIGV0LT5ldF9yb290X2VsKTsKKwlwYXRoID0gb2NmczJfbmV3X3BhdGhfZnJvbV9ldChldCk7CiAJaWYgKCFwYXRoKSB7CiAJCXJldCA9IC1FTk9NRU07CiAJCW1sb2dfZXJybm8ocmV0KTsKQEAgLTUyNTUsNiArNTM0OCw3OCBAQAogCXJldHVybiByZXQ7CiB9CiAKK2ludCBvY2ZzMl9yZW1vdmVfYnRyZWVfcmFuZ2Uoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCSAgICAgc3RydWN0IG9jZnMyX2V4dGVudF90cmVlICpldCwKKwkJCSAgICAgdTMyIGNwb3MsIHUzMiBwaHlzX2Nwb3MsIHUzMiBsZW4sCisJCQkgICAgIHN0cnVjdCBvY2ZzMl9jYWNoZWRfZGVhbGxvY19jdHh0ICpkZWFsbG9jKQoreworCWludCByZXQ7CisJdTY0IHBoeXNfYmxrbm8gPSBvY2ZzMl9jbHVzdGVyc190b19ibG9ja3MoaW5vZGUtPmlfc2IsIHBoeXNfY3Bvcyk7CisJc3RydWN0IG9jZnMyX3N1cGVyICpvc2IgPSBPQ0ZTMl9TQihpbm9kZS0+aV9zYik7CisJc3RydWN0IGlub2RlICp0bF9pbm9kZSA9IG9zYi0+b3NiX3RsX2lub2RlOworCWhhbmRsZV90ICpoYW5kbGU7CisJc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKm1ldGFfYWMgPSBOVUxMOworCisJcmV0ID0gb2NmczJfbG9ja19hbGxvY2F0b3JzKGlub2RlLCBldCwgMCwgMSwgTlVMTCwgJm1ldGFfYWMpOworCWlmIChyZXQpIHsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCW11dGV4X2xvY2soJnRsX2lub2RlLT5pX211dGV4KTsKKworCWlmIChvY2ZzMl90cnVuY2F0ZV9sb2dfbmVlZHNfZmx1c2gob3NiKSkgeworCQlyZXQgPSBfX29jZnMyX2ZsdXNoX3RydW5jYXRlX2xvZyhvc2IpOworCQlpZiAocmV0IDwgMCkgeworCQkJbWxvZ19lcnJubyhyZXQpOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKwloYW5kbGUgPSBvY2ZzMl9zdGFydF90cmFucyhvc2IsIG9jZnMyX3JlbW92ZV9leHRlbnRfY3JlZGl0cyhvc2ItPnNiKSk7CisJaWYgKElTX0VSUihoYW5kbGUpKSB7CisJCXJldCA9IFBUUl9FUlIoaGFuZGxlKTsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dDsKKwl9CisKKwlyZXQgPSBvY2ZzMl9ldF9yb290X2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgaW5vZGUsIGV0LAorCQkJCQkgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CisJaWYgKHJldCkgeworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0OworCX0KKworCXJldCA9IG9jZnMyX3JlbW92ZV9leHRlbnQoaW5vZGUsIGV0LCBjcG9zLCBsZW4sIGhhbmRsZSwgbWV0YV9hYywKKwkJCQkgIGRlYWxsb2MpOworCWlmIChyZXQpIHsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dF9jb21taXQ7CisJfQorCisJb2NmczJfZXRfdXBkYXRlX2NsdXN0ZXJzKGlub2RlLCBldCwgLWxlbik7CisKKwlyZXQgPSBvY2ZzMl9qb3VybmFsX2RpcnR5KGhhbmRsZSwgZXQtPmV0X3Jvb3RfYmgpOworCWlmIChyZXQpIHsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dF9jb21taXQ7CisJfQorCisJcmV0ID0gb2NmczJfdHJ1bmNhdGVfbG9nX2FwcGVuZChvc2IsIGhhbmRsZSwgcGh5c19ibGtubywgbGVuKTsKKwlpZiAocmV0KQorCQltbG9nX2Vycm5vKHJldCk7CisKK291dF9jb21taXQ6CisJb2NmczJfY29tbWl0X3RyYW5zKG9zYiwgaGFuZGxlKTsKK291dDoKKwltdXRleF91bmxvY2soJnRsX2lub2RlLT5pX211dGV4KTsKKworCWlmIChtZXRhX2FjKQorCQlvY2ZzMl9mcmVlX2FsbG9jX2NvbnRleHQobWV0YV9hYyk7CisKKwlyZXR1cm4gcmV0OworfQorCiBpbnQgb2NmczJfdHJ1bmNhdGVfbG9nX25lZWRzX2ZsdXNoKHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiKQogewogCXN0cnVjdCBidWZmZXJfaGVhZCAqdGxfYmggPSBvc2ItPm9zYl90bF9iaDsKQEAgLTUzMDgsMTMgKzU0NzMsMTMgQEAKIAlzdGFydF9jbHVzdGVyID0gb2NmczJfYmxvY2tzX3RvX2NsdXN0ZXJzKG9zYi0+c2IsIHN0YXJ0X2Jsayk7CiAKIAlkaSA9IChzdHJ1Y3Qgb2NmczJfZGlub2RlICopIHRsX2JoLT5iX2RhdGE7Ci0JdGwgPSAmZGktPmlkMi5pX2RlYWxsb2M7Ci0JaWYgKCFPQ0ZTMl9JU19WQUxJRF9ESU5PREUoZGkpKSB7Ci0JCU9DRlMyX1JPX09OX0lOVkFMSURfRElOT0RFKG9zYi0+c2IsIGRpKTsKLQkJc3RhdHVzID0gLUVJTzsKLQkJZ290byBiYWlsOwotCX0KIAorCS8qIHRsX2JoIGlzIGxvYWRlZCBmcm9tIG9jZnMyX3RydW5jYXRlX2xvZ19pbml0KCkuICBJdCdzIHZhbGlkYXRlZAorCSAqIGJ5IHRoZSB1bmRlcmx5aW5nIGNhbGwgdG8gb2NmczJfcmVhZF9pbm9kZV9ibG9jaygpLCBzbyBhbnkKKwkgKiBjb3JydXB0aW9uIGlzIGEgY29kZSBidWcgKi8KKwlCVUdfT04oIU9DRlMyX0lTX1ZBTElEX0RJTk9ERShkaSkpOworCisJdGwgPSAmZGktPmlkMi5pX2RlYWxsb2M7CiAJdGxfY291bnQgPSBsZTE2X3RvX2NwdSh0bC0+dGxfY291bnQpOwogCW1sb2dfYnVnX29uX21zZyh0bF9jb3VudCA+IG9jZnMyX3RydW5jYXRlX3JlY3NfcGVyX2lub2RlKG9zYi0+c2IpIHx8CiAJCQl0bF9jb3VudCA9PSAwLApAQCAtNTMzMiw4ICs1NDk3LDggQEAKIAkJZ290byBiYWlsOwogCX0KIAotCXN0YXR1cyA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgdGxfaW5vZGUsIHRsX2JoLAotCQkJCSAgICAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKKwlzdGF0dXMgPSBvY2ZzMl9qb3VybmFsX2FjY2Vzc19kaShoYW5kbGUsIHRsX2lub2RlLCB0bF9iaCwKKwkJCQkJIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKIAlpZiAoc3RhdHVzIDwgMCkgewogCQltbG9nX2Vycm5vKHN0YXR1cyk7CiAJCWdvdG8gYmFpbDsKQEAgLTUzOTQsOCArNTU1OSw4IEBACiAJd2hpbGUgKGkgPj0gMCkgewogCQkvKiBDYWxsZXIgaGFzIGdpdmVuIHVzIGF0IGxlYXN0IGVub3VnaCBjcmVkaXRzIHRvCiAJCSAqIHVwZGF0ZSB0aGUgdHJ1bmNhdGUgbG9nIGRpbm9kZSAqLwotCQlzdGF0dXMgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIHRsX2lub2RlLCB0bF9iaCwKLQkJCQkJICAgICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOworCQlzdGF0dXMgPSBvY2ZzMl9qb3VybmFsX2FjY2Vzc19kaShoYW5kbGUsIHRsX2lub2RlLCB0bF9iaCwKKwkJCQkJCSBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CiAJCWlmIChzdGF0dXMgPCAwKSB7CiAJCQltbG9nX2Vycm5vKHN0YXR1cyk7CiAJCQlnb3RvIGJhaWw7CkBAIC01NDY0LDEzICs1NjI5LDEzIEBACiAJQlVHX09OKG11dGV4X3RyeWxvY2soJnRsX2lub2RlLT5pX211dGV4KSk7CiAKIAlkaSA9IChzdHJ1Y3Qgb2NmczJfZGlub2RlICopIHRsX2JoLT5iX2RhdGE7Ci0JdGwgPSAmZGktPmlkMi5pX2RlYWxsb2M7Ci0JaWYgKCFPQ0ZTMl9JU19WQUxJRF9ESU5PREUoZGkpKSB7Ci0JCU9DRlMyX1JPX09OX0lOVkFMSURfRElOT0RFKG9zYi0+c2IsIGRpKTsKLQkJc3RhdHVzID0gLUVJTzsKLQkJZ290byBvdXQ7Ci0JfQogCisJLyogdGxfYmggaXMgbG9hZGVkIGZyb20gb2NmczJfdHJ1bmNhdGVfbG9nX2luaXQoKS4gIEl0J3MgdmFsaWRhdGVkCisJICogYnkgdGhlIHVuZGVybHlpbmcgY2FsbCB0byBvY2ZzMl9yZWFkX2lub2RlX2Jsb2NrKCksIHNvIGFueQorCSAqIGNvcnJ1cHRpb24gaXMgYSBjb2RlIGJ1ZyAqLworCUJVR19PTighT0NGUzJfSVNfVkFMSURfRElOT0RFKGRpKSk7CisKKwl0bCA9ICZkaS0+aWQyLmlfZGVhbGxvYzsKIAludW1fdG9fZmx1c2ggPSBsZTE2X3RvX2NwdSh0bC0+dGxfdXNlZCk7CiAJbWxvZygwLCAiRmx1c2ggJXUgcmVjb3JkcyBmcm9tIHRydW5jYXRlIGxvZyAjJWxsdVxuIiwKIAkgICAgIG51bV90b19mbHVzaCwgKHVuc2lnbmVkIGxvbmcgbG9uZylPQ0ZTMl9JKHRsX2lub2RlKS0+aXBfYmxrbm8pOwpAQCAtNTU4Niw3ICs1NzUxLDcgQEAKIAkJZ290byBiYWlsOwogCX0KIAotCXN0YXR1cyA9IG9jZnMyX3JlYWRfYmxvY2soaW5vZGUsIE9DRlMyX0koaW5vZGUpLT5pcF9ibGtubywgJmJoKTsKKwlzdGF0dXMgPSBvY2ZzMl9yZWFkX2lub2RlX2Jsb2NrKGlub2RlLCAmYmgpOwogCWlmIChzdGF0dXMgPCAwKSB7CiAJCWlwdXQoaW5vZGUpOwogCQltbG9nX2Vycm5vKHN0YXR1cyk7CkBAIC01NjI1LDEzICs1NzkwLDEzIEBACiAJfQogCiAJZGkgPSAoc3RydWN0IG9jZnMyX2Rpbm9kZSAqKSB0bF9iaC0+Yl9kYXRhOwotCXRsID0gJmRpLT5pZDIuaV9kZWFsbG9jOwotCWlmICghT0NGUzJfSVNfVkFMSURfRElOT0RFKGRpKSkgewotCQlPQ0ZTMl9ST19PTl9JTlZBTElEX0RJTk9ERSh0bF9pbm9kZS0+aV9zYiwgZGkpOwotCQlzdGF0dXMgPSAtRUlPOwotCQlnb3RvIGJhaWw7Ci0JfQogCisJLyogdGxfYmggaXMgbG9hZGVkIGZyb20gb2NmczJfZ2V0X3RydW5jYXRlX2xvZ19pbmZvKCkuICBJdCdzCisJICogdmFsaWRhdGVkIGJ5IHRoZSB1bmRlcmx5aW5nIGNhbGwgdG8gb2NmczJfcmVhZF9pbm9kZV9ibG9jaygpLAorCSAqIHNvIGFueSBjb3JydXB0aW9uIGlzIGEgY29kZSBidWcgKi8KKwlCVUdfT04oIU9DRlMyX0lTX1ZBTElEX0RJTk9ERShkaSkpOworCisJdGwgPSAmZGktPmlkMi5pX2RlYWxsb2M7CiAJaWYgKGxlMTZfdG9fY3B1KHRsLT50bF91c2VkKSkgewogCQltbG9nKDAsICJXZSdsbCBoYXZlICV1IGxvZ3MgdG8gcmVjb3ZlclxuIiwKIAkJICAgICBsZTE2X3RvX2NwdSh0bC0+dGxfdXNlZCkpOwpAQCAtNTY1MSw2ICs1ODE2LDcgQEAKIAkJICogdGxfdXNlZC4gKi8KIAkJdGwtPnRsX3VzZWQgPSAwOwogCisJCW9jZnMyX2NvbXB1dGVfbWV0YV9lY2Mob3NiLT5zYiwgdGxfYmgtPmJfZGF0YSwgJmRpLT5pX2NoZWNrKTsKIAkJc3RhdHVzID0gb2NmczJfd3JpdGVfYmxvY2sob3NiLCB0bF9iaCwgdGxfaW5vZGUpOwogCQlpZiAoc3RhdHVzIDwgMCkgewogCQkJbWxvZ19lcnJubyhzdGF0dXMpOwpAQCAtNTgwMCw3ICs1OTY2LDEwIEBACiAgKi8KIAogLyoKLSAqIERlc2NyaWJlcyBhIHNpbmdsZSBibG9jayBmcmVlIGZyb20gYSBzdWJhbGxvY2F0b3IKKyAqIERlc2NyaWJlIGEgc2luZ2xlIGJpdCBmcmVlZCBmcm9tIGEgc3ViYWxsb2NhdG9yLiAgRm9yIHRoZSBibG9jaworICogc3ViYWxsb2NhdG9ycywgaXQgcmVwcmVzZW50cyBvbmUgYmxvY2suICBGb3IgdGhlIGdsb2JhbCBjbHVzdGVyCisgKiBhbGxvY2F0b3IsIGl0IHJlcHJlc2VudHMgc29tZSBjbHVzdGVycyBhbmQgZnJlZV9iaXQgaW5kaWNhdGVzCisgKiBjbHVzdGVycyBudW1iZXIuCiAgKi8KIHN0cnVjdCBvY2ZzMl9jYWNoZWRfYmxvY2tfZnJlZSB7CiAJc3RydWN0IG9jZnMyX2NhY2hlZF9ibG9ja19mcmVlCQkqZnJlZV9uZXh0OwpAQCAtNTgxNSwxMCArNTk4NCwxMCBAQAogCXN0cnVjdCBvY2ZzMl9jYWNoZWRfYmxvY2tfZnJlZQkJKmZfZmlyc3Q7CiB9OwogCi1zdGF0aWMgaW50IG9jZnMyX2ZyZWVfY2FjaGVkX2l0ZW1zKHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiLAotCQkJCSAgIGludCBzeXNmaWxlX3R5cGUsCi0JCQkJICAgaW50IHNsb3QsCi0JCQkJICAgc3RydWN0IG9jZnMyX2NhY2hlZF9ibG9ja19mcmVlICpoZWFkKQorc3RhdGljIGludCBvY2ZzMl9mcmVlX2NhY2hlZF9ibG9ja3Moc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsCisJCQkJICAgIGludCBzeXNmaWxlX3R5cGUsCisJCQkJICAgIGludCBzbG90LAorCQkJCSAgICBzdHJ1Y3Qgb2NmczJfY2FjaGVkX2Jsb2NrX2ZyZWUgKmhlYWQpCiB7CiAJaW50IHJldDsKIAl1NjQgYmdfYmxrbm87CkBAIC01ODkzLDYgKzYwNjIsODIgQEAKIAlyZXR1cm4gcmV0OwogfQogCitpbnQgb2NmczJfY2FjaGVfY2x1c3Rlcl9kZWFsbG9jKHN0cnVjdCBvY2ZzMl9jYWNoZWRfZGVhbGxvY19jdHh0ICpjdHh0LAorCQkJCXU2NCBibGtubywgdW5zaWduZWQgaW50IGJpdCkKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3Qgb2NmczJfY2FjaGVkX2Jsb2NrX2ZyZWUgKml0ZW07CisKKwlpdGVtID0ga21hbGxvYyhzaXplb2YoKml0ZW0pLCBHRlBfTk9GUyk7CisJaWYgKGl0ZW0gPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PTUVNOworCQltbG9nX2Vycm5vKHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJbWxvZygwLCAiSW5zZXJ0IGNsdXN0ZXJzOiAoYml0ICV1LCBibGsgJWxsdSlcbiIsCisJICAgICBiaXQsICh1bnNpZ25lZCBsb25nIGxvbmcpYmxrbm8pOworCisJaXRlbS0+ZnJlZV9ibGsgPSBibGtubzsKKwlpdGVtLT5mcmVlX2JpdCA9IGJpdDsKKwlpdGVtLT5mcmVlX25leHQgPSBjdHh0LT5jX2dsb2JhbF9hbGxvY2F0b3I7CisKKwljdHh0LT5jX2dsb2JhbF9hbGxvY2F0b3IgPSBpdGVtOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgb2NmczJfZnJlZV9jYWNoZWRfY2x1c3RlcnMoc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsCisJCQkJICAgICAgc3RydWN0IG9jZnMyX2NhY2hlZF9ibG9ja19mcmVlICpoZWFkKQoreworCXN0cnVjdCBvY2ZzMl9jYWNoZWRfYmxvY2tfZnJlZSAqdG1wOworCXN0cnVjdCBpbm9kZSAqdGxfaW5vZGUgPSBvc2ItPm9zYl90bF9pbm9kZTsKKwloYW5kbGVfdCAqaGFuZGxlOworCWludCByZXQgPSAwOworCisJbXV0ZXhfbG9jaygmdGxfaW5vZGUtPmlfbXV0ZXgpOworCisJd2hpbGUgKGhlYWQpIHsKKwkJaWYgKG9jZnMyX3RydW5jYXRlX2xvZ19uZWVkc19mbHVzaChvc2IpKSB7CisJCQlyZXQgPSBfX29jZnMyX2ZsdXNoX3RydW5jYXRlX2xvZyhvc2IpOworCQkJaWYgKHJldCA8IDApIHsKKwkJCQltbG9nX2Vycm5vKHJldCk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQloYW5kbGUgPSBvY2ZzMl9zdGFydF90cmFucyhvc2IsIE9DRlMyX1RSVU5DQVRFX0xPR19VUERBVEUpOworCQlpZiAoSVNfRVJSKGhhbmRsZSkpIHsKKwkJCXJldCA9IFBUUl9FUlIoaGFuZGxlKTsKKwkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCWJyZWFrOworCQl9CisKKwkJcmV0ID0gb2NmczJfdHJ1bmNhdGVfbG9nX2FwcGVuZChvc2IsIGhhbmRsZSwgaGVhZC0+ZnJlZV9ibGssCisJCQkJCQloZWFkLT5mcmVlX2JpdCk7CisKKwkJb2NmczJfY29tbWl0X3RyYW5zKG9zYiwgaGFuZGxlKTsKKwkJdG1wID0gaGVhZDsKKwkJaGVhZCA9IGhlYWQtPmZyZWVfbmV4dDsKKwkJa2ZyZWUodG1wKTsKKworCQlpZiAocmV0IDwgMCkgeworCQkJbWxvZ19lcnJubyhyZXQpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwltdXRleF91bmxvY2soJnRsX2lub2RlLT5pX211dGV4KTsKKworCXdoaWxlIChoZWFkKSB7CisJCS8qIFByZW1hdHVyZSBleGl0IG1heSBoYXZlIGxlZnQgc29tZSBkYW5nbGluZyBpdGVtcy4gKi8KKwkJdG1wID0gaGVhZDsKKwkJaGVhZCA9IGhlYWQtPmZyZWVfbmV4dDsKKwkJa2ZyZWUodG1wKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCiBpbnQgb2NmczJfcnVuX2RlYWxsb2NzKHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiLAogCQkgICAgICAgc3RydWN0IG9jZnMyX2NhY2hlZF9kZWFsbG9jX2N0eHQgKmN0eHQpCiB7CkBAIC01OTA4LDggKzYxNTMsMTAgQEAKIAkJaWYgKGZsLT5mX2ZpcnN0KSB7CiAJCQltbG9nKDAsICJGcmVlIGl0ZW1zOiAodHlwZSAldSwgc2xvdCAlZClcbiIsCiAJCQkgICAgIGZsLT5mX2lub2RlX3R5cGUsIGZsLT5mX3Nsb3QpOwotCQkJcmV0MiA9IG9jZnMyX2ZyZWVfY2FjaGVkX2l0ZW1zKG9zYiwgZmwtPmZfaW5vZGVfdHlwZSwKLQkJCQkJCSAgICAgICBmbC0+Zl9zbG90LCBmbC0+Zl9maXJzdCk7CisJCQlyZXQyID0gb2NmczJfZnJlZV9jYWNoZWRfYmxvY2tzKG9zYiwKKwkJCQkJCQlmbC0+Zl9pbm9kZV90eXBlLAorCQkJCQkJCWZsLT5mX3Nsb3QsCisJCQkJCQkJZmwtPmZfZmlyc3QpOwogCQkJaWYgKHJldDIpCiAJCQkJbWxvZ19lcnJubyhyZXQyKTsKIAkJCWlmICghcmV0KQpAQCAtNTkyMCw2ICs2MTY3LDE3IEBACiAJCWtmcmVlKGZsKTsKIAl9CiAKKwlpZiAoY3R4dC0+Y19nbG9iYWxfYWxsb2NhdG9yKSB7CisJCXJldDIgPSBvY2ZzMl9mcmVlX2NhY2hlZF9jbHVzdGVycyhvc2IsCisJCQkJCQkgIGN0eHQtPmNfZ2xvYmFsX2FsbG9jYXRvcik7CisJCWlmIChyZXQyKQorCQkJbWxvZ19lcnJubyhyZXQyKTsKKwkJaWYgKCFyZXQpCisJCQlyZXQgPSByZXQyOworCisJCWN0eHQtPmNfZ2xvYmFsX2FsbG9jYXRvciA9IE5VTEw7CisJfQorCiAJcmV0dXJuIHJldDsKIH0KIApAQCAtNjA3NSwxMSArNjMzMywxMCBAQAogCiAJZWIgPSAoc3RydWN0IG9jZnMyX2V4dGVudF9ibG9jayAqKSBiaC0+Yl9kYXRhOwogCWVsID0gJmViLT5oX2xpc3Q7Ci0JaWYgKCFPQ0ZTMl9JU19WQUxJRF9FWFRFTlRfQkxPQ0soZWIpKSB7Ci0JCU9DRlMyX1JPX09OX0lOVkFMSURfRVhURU5UX0JMT0NLKGlub2RlLT5pX3NiLCBlYik7Ci0JCXJldCA9IC1FUk9GUzsKLQkJZ290byBvdXQ7Ci0JfQorCisJLyogb2NmczJfZmluZF9sZWFmKCkgZ2V0cyB0aGUgZWIgZnJvbSBvY2ZzMl9yZWFkX2V4dGVudF9ibG9jaygpLgorCSAqIEFueSBjb3JydXB0aW9uIGlzIGEgY29kZSBidWcuICovCisJQlVHX09OKCFPQ0ZTMl9JU19WQUxJRF9FWFRFTlRfQkxPQ0soZWIpKTsKIAogCSpuZXdfbGFzdF9lYiA9IGJoOwogCWdldF9iaCgqbmV3X2xhc3RfZWIpOwpAQCAtNjMyNiw4ICs2NTgzLDggQEAKIAl9CiAKIAlpZiAobGFzdF9lYl9iaCkgewotCQlzdGF0dXMgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGlub2RlLCBsYXN0X2ViX2JoLAotCQkJCQkgICAgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CisJCXN0YXR1cyA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzX2ViKGhhbmRsZSwgaW5vZGUsIGxhc3RfZWJfYmgsCisJCQkJCQkgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOwogCQlpZiAoc3RhdHVzIDwgMCkgewogCQkJbWxvZ19lcnJubyhzdGF0dXMpOwogCQkJZ290byBiYWlsOwpAQCAtNjM1MCw2ICs2NjA3LDggQEAKIAkJZ290byBiYWlsOwogCX0KIAorCXZmc19kcV9mcmVlX3NwYWNlX25vZGlydHkoaW5vZGUsCisJCQlvY2ZzMl9jbHVzdGVyc190b19ieXRlcyhvc2ItPnNiLCBjbHVzdGVyc190b19kZWwpKTsKIAlzcGluX2xvY2soJk9DRlMyX0koaW5vZGUpLT5pcF9sb2NrKTsKIAlPQ0ZTMl9JKGlub2RlKS0+aXBfY2x1c3RlcnMgPSBsZTMyX3RvX2NwdShmZS0+aV9jbHVzdGVycykgLQogCQkJCSAgICAgIGNsdXN0ZXJzX3RvX2RlbDsKQEAgLTY0MzYsMTEgKzY2OTUsNiBAQAogCQltbG9nX2Vycm5vKHJldCk7CiAJZWxzZSBpZiAob2NmczJfc2hvdWxkX29yZGVyX2RhdGEoaW5vZGUpKSB7CiAJCXJldCA9IG9jZnMyX2piZDJfZmlsZV9pbm9kZShoYW5kbGUsIGlub2RlKTsKLSNpZmRlZiBDT05GSUdfT0NGUzJfQ09NUEFUX0pCRAotCQlyZXQgPSB3YWxrX3BhZ2VfYnVmZmVycyhoYW5kbGUsIHBhZ2VfYnVmZmVycyhwYWdlKSwKLQkJCQkJZnJvbSwgdG8sICZwYXJ0aWFsLAotCQkJCQlvY2ZzMl9qb3VybmFsX2RpcnR5X2RhdGEpOwotI2VuZGlmCiAJCWlmIChyZXQgPCAwKQogCQkJbWxvZ19lcnJubyhyZXQpOwogCX0KQEAgLTY2NjMsNiArNjkxNyw3IEBACiAJc3RydWN0IHBhZ2UgKipwYWdlcyA9IE5VTEw7CiAJbG9mZl90IGVuZCA9IG9zYi0+c19jbHVzdGVyc2l6ZTsKIAlzdHJ1Y3Qgb2NmczJfZXh0ZW50X3RyZWUgZXQ7CisJaW50IGRpZF9xdW90YSA9IDA7CiAKIAloYXNfZGF0YSA9IGlfc2l6ZV9yZWFkKGlub2RlKSA/IDEgOiAwOwogCkBAIC02NjgyLDE1ICs2OTM3LDE2IEBACiAJCX0KIAl9CiAKLQloYW5kbGUgPSBvY2ZzMl9zdGFydF90cmFucyhvc2IsIE9DRlMyX0lOTElORV9UT19FWFRFTlRTX0NSRURJVFMpOworCWhhbmRsZSA9IG9jZnMyX3N0YXJ0X3RyYW5zKG9zYiwKKwkJCQkgICBvY2ZzMl9pbmxpbmVfdG9fZXh0ZW50c19jcmVkaXRzKG9zYi0+c2IpKTsKIAlpZiAoSVNfRVJSKGhhbmRsZSkpIHsKIAkJcmV0ID0gUFRSX0VSUihoYW5kbGUpOwogCQltbG9nX2Vycm5vKHJldCk7CiAJCWdvdG8gb3V0X3VubG9jazsKIAl9CiAKLQlyZXQgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGlub2RlLCBkaV9iaCwKLQkJCQkgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CisJcmV0ID0gb2NmczJfam91cm5hbF9hY2Nlc3NfZGkoaGFuZGxlLCBpbm9kZSwgZGlfYmgsCisJCQkJICAgICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOwogCWlmIChyZXQpIHsKIAkJbWxvZ19lcnJubyhyZXQpOwogCQlnb3RvIG91dF9jb21taXQ7CkBAIC02NzAxLDYgKzY5NTcsMTMgQEAKIAkJdW5zaWduZWQgaW50IHBhZ2VfZW5kOwogCQl1NjQgcGh5czsKIAorCQlpZiAodmZzX2RxX2FsbG9jX3NwYWNlX25vZGlydHkoaW5vZGUsCisJCQkJICAgICAgIG9jZnMyX2NsdXN0ZXJzX3RvX2J5dGVzKG9zYi0+c2IsIDEpKSkgeworCQkJcmV0ID0gLUVEUVVPVDsKKwkJCWdvdG8gb3V0X2NvbW1pdDsKKwkJfQorCQlkaWRfcXVvdGEgPSAxOworCiAJCXJldCA9IG9jZnMyX2NsYWltX2NsdXN0ZXJzKG9zYiwgaGFuZGxlLCBkYXRhX2FjLCAxLCAmYml0X29mZiwKIAkJCQkJICAgJm51bSk7CiAJCWlmIChyZXQpIHsKQEAgLTY3NzQsNiArNzAzNywxMCBAQAogCX0KIAogb3V0X2NvbW1pdDoKKwlpZiAocmV0IDwgMCAmJiBkaWRfcXVvdGEpCisJCXZmc19kcV9mcmVlX3NwYWNlX25vZGlydHkoaW5vZGUsCisJCQkJCSAgb2NmczJfY2x1c3RlcnNfdG9fYnl0ZXMob3NiLT5zYiwgMSkpOworCiAJb2NmczJfY29tbWl0X3RyYW5zKG9zYiwgaGFuZGxlKTsKIAogb3V0X3VubG9jazoKQEAgLTY4MTMsNyArNzA4MCw4IEBACiAJbmV3X2hpZ2hlc3RfY3BvcyA9IG9jZnMyX2NsdXN0ZXJzX2Zvcl9ieXRlcyhvc2ItPnNiLAogCQkJCQkJICAgICBpX3NpemVfcmVhZChpbm9kZSkpOwogCi0JcGF0aCA9IG9jZnMyX25ld19wYXRoKGZlX2JoLCAmZGktPmlkMi5pX2xpc3QpOworCXBhdGggPSBvY2ZzMl9uZXdfcGF0aChmZV9iaCwgJmRpLT5pZDIuaV9saXN0LAorCQkJICAgICAgb2NmczJfam91cm5hbF9hY2Nlc3NfZGkpOwogCWlmICghcGF0aCkgewogCQlzdGF0dXMgPSAtRU5PTUVNOwogCQltbG9nX2Vycm5vKHN0YXR1cyk7CkBAIC02OTg0LDIwICs3MjUyLDE0IEBACiAJb2NmczJfaW5pdF9kZWFsbG9jX2N0eHQoJigqdGMpLT50Y19kZWFsbG9jKTsKIAogCWlmIChmZS0+aWQyLmlfbGlzdC5sX3RyZWVfZGVwdGgpIHsKLQkJc3RhdHVzID0gb2NmczJfcmVhZF9ibG9jayhpbm9kZSwgbGU2NF90b19jcHUoZmUtPmlfbGFzdF9lYl9ibGspLAotCQkJCQkgICZsYXN0X2ViX2JoKTsKKwkJc3RhdHVzID0gb2NmczJfcmVhZF9leHRlbnRfYmxvY2soaW5vZGUsCisJCQkJCQkgbGU2NF90b19jcHUoZmUtPmlfbGFzdF9lYl9ibGspLAorCQkJCQkJICZsYXN0X2ViX2JoKTsKIAkJaWYgKHN0YXR1cyA8IDApIHsKIAkJCW1sb2dfZXJybm8oc3RhdHVzKTsKIAkJCWdvdG8gYmFpbDsKIAkJfQogCQllYiA9IChzdHJ1Y3Qgb2NmczJfZXh0ZW50X2Jsb2NrICopIGxhc3RfZWJfYmgtPmJfZGF0YTsKLQkJaWYgKCFPQ0ZTMl9JU19WQUxJRF9FWFRFTlRfQkxPQ0soZWIpKSB7Ci0JCQlPQ0ZTMl9ST19PTl9JTlZBTElEX0VYVEVOVF9CTE9DSyhpbm9kZS0+aV9zYiwgZWIpOwotCi0JCQlicmVsc2UobGFzdF9lYl9iaCk7Ci0JCQlzdGF0dXMgPSAtRUlPOwotCQkJZ290byBiYWlsOwotCQl9CiAJfQogCiAJKCp0YyktPnRjX2xhc3RfZWJfYmggPSBsYXN0X2ViX2JoOwpAQCAtNzA1Miw4ICs3MzE0LDggQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JcmV0ID0gb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwgZGlfYmgsCi0JCQkJICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOworCXJldCA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzX2RpKGhhbmRsZSwgaW5vZGUsIGRpX2JoLAorCQkJCSAgICAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKIAlpZiAocmV0KSB7CiAJCW1sb2dfZXJybm8ocmV0KTsKIAkJZ290byBvdXRfY29tbWl0OwpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvYWxsb2MuaCBiL2ZzL29jZnMyL2FsbG9jLmgKaW5kZXggNzAyNTdjOC4uY2NlZmY1YyAxMDA2NDQKLS0tIGEvZnMvb2NmczIvYWxsb2MuaAorKysgYi9mcy9vY2ZzMi9hbGxvYy5oCkBAIC00NSw3ICs0NSw5IEBACiAgKgogICogb2NmczJfZXh0ZW50X3RyZWUgY29udGFpbnMgaW5mbyBmb3IgdGhlIHJvb3Qgb2YgdGhlIGItdHJlZSwgaXQgbXVzdCBoYXZlIGEKICAqIHJvb3Qgb2NmczJfZXh0ZW50X2xpc3QgYW5kIGEgcm9vdF9iaCBzbyB0aGF0IHRoZXkgY2FuIGJlIHVzZWQgaW4gdGhlIGItdHJlZQotICogZnVuY3Rpb25zLgorICogZnVuY3Rpb25zLiAgV2l0aCBtZXRhZGF0YSBlY2MsIHdlIG5vdyBjYWxsIGRpZmZlcmVudCBqb3VybmFsX2FjY2VzcworICogZnVuY3Rpb25zIGZvciBlYWNoIHR5cGUgb2YgbWV0YWRhdGEsIHNvIGl0IG11c3QgaGF2ZSB0aGUKKyAqIHJvb3Rfam91cm5hbF9hY2Nlc3MgZnVuY3Rpb24uCiAgKiBvY2ZzMl9leHRlbnRfdHJlZV9vcGVyYXRpb25zIGFic3RyYWN0IHRoZSBub3JtYWwgb3BlcmF0aW9ucyB3ZSBkbyBmb3IKICAqIHRoZSByb290IG9mIGV4dGVudCBiLXRyZWUuCiAgKi8KQEAgLTU0LDYgKzU2LDcgQEAKIAlzdHJ1Y3Qgb2NmczJfZXh0ZW50X3RyZWVfb3BlcmF0aW9ucwkqZXRfb3BzOwogCXN0cnVjdCBidWZmZXJfaGVhZAkJCSpldF9yb290X2JoOwogCXN0cnVjdCBvY2ZzMl9leHRlbnRfbGlzdAkJKmV0X3Jvb3RfZWw7CisJb2NmczJfam91cm5hbF9hY2Nlc3NfZnVuYwkJZXRfcm9vdF9qb3VybmFsX2FjY2VzczsKIAl2b2lkCQkJCQkqZXRfb2JqZWN0OwogCXVuc2lnbmVkIGludAkJCQlldF9tYXhfbGVhZl9jbHVzdGVyczsKIH07CkBAIC02OCwxMCArNzEsMTggQEAKIHZvaWQgb2NmczJfaW5pdF94YXR0cl90cmVlX2V4dGVudF90cmVlKHN0cnVjdCBvY2ZzMl9leHRlbnRfdHJlZSAqZXQsCiAJCQkJICAgICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJCQkJICAgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpOworc3RydWN0IG9jZnMyX3hhdHRyX3ZhbHVlX2J1ZjsKIHZvaWQgb2NmczJfaW5pdF94YXR0cl92YWx1ZV9leHRlbnRfdHJlZShzdHJ1Y3Qgb2NmczJfZXh0ZW50X3RyZWUgKmV0LAogCQkJCQlzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCQkJCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLAotCQkJCQlzdHJ1Y3Qgb2NmczJfeGF0dHJfdmFsdWVfcm9vdCAqeHYpOworCQkJCQlzdHJ1Y3Qgb2NmczJfeGF0dHJfdmFsdWVfYnVmICp2Yik7CisKKy8qCisgKiBSZWFkIGFuIGV4dGVudCBibG9jayBpbnRvICpiaC4gIElmICpiaCBpcyBOVUxMLCBhIGJoIHdpbGwgYmUKKyAqIGFsbG9jYXRlZC4gIFRoaXMgaXMgYSBjYWNoZWQgcmVhZC4gIFRoZSBleHRlbnQgYmxvY2sgd2lsbCBiZSB2YWxpZGF0ZWQKKyAqIHdpdGggb2NmczJfdmFsaWRhdGVfZXh0ZW50X2Jsb2NrKCkuCisgKi8KK2ludCBvY2ZzMl9yZWFkX2V4dGVudF9ibG9jayhzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1NjQgZWJfYmxrbm8sCisJCQkgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICoqYmgpOwogCiBzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dDsKIGludCBvY2ZzMl9pbnNlcnRfZXh0ZW50KHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiLApAQCAtMTEwLDYgKzEyMSwxMSBAQAogCQkJdTMyIGNwb3MsIHUzMiBsZW4sIGhhbmRsZV90ICpoYW5kbGUsCiAJCQlzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqbWV0YV9hYywKIAkJCXN0cnVjdCBvY2ZzMl9jYWNoZWRfZGVhbGxvY19jdHh0ICpkZWFsbG9jKTsKK2ludCBvY2ZzMl9yZW1vdmVfYnRyZWVfcmFuZ2Uoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCSAgICAgc3RydWN0IG9jZnMyX2V4dGVudF90cmVlICpldCwKKwkJCSAgICAgdTMyIGNwb3MsIHUzMiBwaHlzX2Nwb3MsIHUzMiBsZW4sCisJCQkgICAgIHN0cnVjdCBvY2ZzMl9jYWNoZWRfZGVhbGxvY19jdHh0ICpkZWFsbG9jKTsKKwogaW50IG9jZnMyX251bV9mcmVlX2V4dGVudHMoc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsCiAJCQkgICBzdHJ1Y3QgaW5vZGUgKmlub2RlLAogCQkJICAgc3RydWN0IG9jZnMyX2V4dGVudF90cmVlICpldCk7CkBAIC0xNjcsMTAgKzE4MywxOCBAQAogICovCiBzdHJ1Y3Qgb2NmczJfY2FjaGVkX2RlYWxsb2NfY3R4dCB7CiAJc3RydWN0IG9jZnMyX3Blcl9zbG90X2ZyZWVfbGlzdAkJKmNfZmlyc3Rfc3ViYWxsb2NhdG9yOworCXN0cnVjdCBvY2ZzMl9jYWNoZWRfYmxvY2tfZnJlZSAJCSpjX2dsb2JhbF9hbGxvY2F0b3I7CiB9Owogc3RhdGljIGlubGluZSB2b2lkIG9jZnMyX2luaXRfZGVhbGxvY19jdHh0KHN0cnVjdCBvY2ZzMl9jYWNoZWRfZGVhbGxvY19jdHh0ICpjKQogewogCWMtPmNfZmlyc3Rfc3ViYWxsb2NhdG9yID0gTlVMTDsKKwljLT5jX2dsb2JhbF9hbGxvY2F0b3IgPSBOVUxMOworfQoraW50IG9jZnMyX2NhY2hlX2NsdXN0ZXJfZGVhbGxvYyhzdHJ1Y3Qgb2NmczJfY2FjaGVkX2RlYWxsb2NfY3R4dCAqY3R4dCwKKwkJCQl1NjQgYmxrbm8sIHVuc2lnbmVkIGludCBiaXQpOworc3RhdGljIGlubGluZSBpbnQgb2NmczJfZGVhbGxvY19oYXNfY2x1c3RlcihzdHJ1Y3Qgb2NmczJfY2FjaGVkX2RlYWxsb2NfY3R4dCAqYykKK3sKKwlyZXR1cm4gYy0+Y19nbG9iYWxfYWxsb2NhdG9yICE9IE5VTEw7CiB9CiBpbnQgb2NmczJfcnVuX2RlYWxsb2NzKHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiLAogCQkgICAgICAgc3RydWN0IG9jZnMyX2NhY2hlZF9kZWFsbG9jX2N0eHQgKmN0eHQpOwpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvYW9wcy5jIGIvZnMvb2NmczIvYW9wcy5jCmluZGV4IGMyMjU0M2IuLmEwNjdhNmMgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2FvcHMuYworKysgYi9mcy9vY2ZzMi9hb3BzLmMKQEAgLTI3LDYgKzI3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zd2FwLmg+CiAjaW5jbHVkZSA8bGludXgvcGlwZV9mc19pLmg+CiAjaW5jbHVkZSA8bGludXgvbXBhZ2UuaD4KKyNpbmNsdWRlIDxsaW51eC9xdW90YW9wcy5oPgogCiAjZGVmaW5lIE1MT0dfTUFTS19QUkVGSVggTUxfRklMRV9JTwogI2luY2x1ZGUgPGNsdXN0ZXIvbWFza2xvZy5oPgpAQCAtNjgsMjAgKzY5LDEzIEBACiAJCWdvdG8gYmFpbDsKIAl9CiAKLQlzdGF0dXMgPSBvY2ZzMl9yZWFkX2Jsb2NrKGlub2RlLCBPQ0ZTMl9JKGlub2RlKS0+aXBfYmxrbm8sICZiaCk7CisJc3RhdHVzID0gb2NmczJfcmVhZF9pbm9kZV9ibG9jayhpbm9kZSwgJmJoKTsKIAlpZiAoc3RhdHVzIDwgMCkgewogCQltbG9nX2Vycm5vKHN0YXR1cyk7CiAJCWdvdG8gYmFpbDsKIAl9CiAJZmUgPSAoc3RydWN0IG9jZnMyX2Rpbm9kZSAqKSBiaC0+Yl9kYXRhOwogCi0JaWYgKCFPQ0ZTMl9JU19WQUxJRF9ESU5PREUoZmUpKSB7Ci0JCW1sb2coTUxfRVJST1IsICJJbnZhbGlkIGRpbm9kZSAjJWxsdTogc2lnbmF0dXJlID0gJS4qc1xuIiwKLQkJICAgICAodW5zaWduZWQgbG9uZyBsb25nKWxlNjRfdG9fY3B1KGZlLT5pX2Jsa25vKSwgNywKLQkJICAgICBmZS0+aV9zaWduYXR1cmUpOwotCQlnb3RvIGJhaWw7Ci0JfQotCiAJaWYgKCh1NjQpaWJsb2NrID49IG9jZnMyX2NsdXN0ZXJzX3RvX2Jsb2Nrcyhpbm9kZS0+aV9zYiwKIAkJCQkJCSAgICBsZTMyX3RvX2NwdShmZS0+aV9jbHVzdGVycykpKSB7CiAJCW1sb2coTUxfRVJST1IsICJibG9jayBvZmZzZXQgaXMgb3V0c2lkZSB0aGUgYWxsb2NhdGVkIHNpemU6ICIKQEAgLTI2Miw3ICsyNTYsNyBAQAogCUJVR19PTighUGFnZUxvY2tlZChwYWdlKSk7CiAJQlVHX09OKCEoT0NGUzJfSShpbm9kZSktPmlwX2R5bl9mZWF0dXJlcyAmIE9DRlMyX0lOTElORV9EQVRBX0ZMKSk7CiAKLQlyZXQgPSBvY2ZzMl9yZWFkX2Jsb2NrKGlub2RlLCBPQ0ZTMl9JKGlub2RlKS0+aXBfYmxrbm8sICZkaV9iaCk7CisJcmV0ID0gb2NmczJfcmVhZF9pbm9kZV9ibG9jayhpbm9kZSwgJmRpX2JoKTsKIAlpZiAocmV0KSB7CiAJCW1sb2dfZXJybm8ocmV0KTsKIAkJZ290byBvdXQ7CkBAIC00ODEsMTIgKzQ3NSw2IEBACiAKIAlpZiAob2NmczJfc2hvdWxkX29yZGVyX2RhdGEoaW5vZGUpKSB7CiAJCXJldCA9IG9jZnMyX2piZDJfZmlsZV9pbm9kZShoYW5kbGUsIGlub2RlKTsKLSNpZmRlZiBDT05GSUdfT0NGUzJfQ09NUEFUX0pCRAotCQlyZXQgPSB3YWxrX3BhZ2VfYnVmZmVycyhoYW5kbGUsCi0JCQkJCXBhZ2VfYnVmZmVycyhwYWdlKSwKLQkJCQkJZnJvbSwgdG8sIE5VTEwsCi0JCQkJCW9jZnMyX2pvdXJuYWxfZGlydHlfZGF0YSk7Ci0jZW5kaWYKIAkJaWYgKHJldCA8IDApCiAJCQltbG9nX2Vycm5vKHJldCk7CiAJfQpAQCAtMTA3MiwxNSArMTA2MCw4IEBACiAJCXRtcHBhZ2UgPSB3Yy0+d19wYWdlc1tpXTsKIAogCQlpZiAocGFnZV9oYXNfYnVmZmVycyh0bXBwYWdlKSkgewotCQkJaWYgKG9jZnMyX3Nob3VsZF9vcmRlcl9kYXRhKGlub2RlKSkgeworCQkJaWYgKG9jZnMyX3Nob3VsZF9vcmRlcl9kYXRhKGlub2RlKSkKIAkJCQlvY2ZzMl9qYmQyX2ZpbGVfaW5vZGUod2MtPndfaGFuZGxlLCBpbm9kZSk7Ci0jaWZkZWYgQ09ORklHX09DRlMyX0NPTVBBVF9KQkQKLQkJCQl3YWxrX3BhZ2VfYnVmZmVycyh3Yy0+d19oYW5kbGUsCi0JCQkJCQkgIHBhZ2VfYnVmZmVycyh0bXBwYWdlKSwKLQkJCQkJCSAgZnJvbSwgdG8sIE5VTEwsCi0JCQkJCQkgIG9jZnMyX2pvdXJuYWxfZGlydHlfZGF0YSk7Ci0jZW5kaWYKLQkJCX0KIAogCQkJYmxvY2tfY29tbWl0X3dyaXRlKHRtcHBhZ2UsIGZyb20sIHRvKTsKIAkJfQpAQCAtMTUzMSw4ICsxNTEyLDggQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JcmV0ID0gb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwgd2MtPndfZGlfYmgsCi0JCQkJICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOworCXJldCA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzX2RpKGhhbmRsZSwgaW5vZGUsIHdjLT53X2RpX2JoLAorCQkJCSAgICAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKIAlpZiAocmV0KSB7CiAJCW9jZnMyX2NvbW1pdF90cmFucyhvc2IsIGhhbmRsZSk7CiAKQEAgLTE3NTAsMTUgKzE3MzEsMjAgQEAKIAogCXdjLT53X2hhbmRsZSA9IGhhbmRsZTsKIAorCWlmIChjbHVzdGVyc190b19hbGxvYyAmJiB2ZnNfZHFfYWxsb2Nfc3BhY2Vfbm9kaXJ0eShpbm9kZSwKKwkJCW9jZnMyX2NsdXN0ZXJzX3RvX2J5dGVzKG9zYi0+c2IsIGNsdXN0ZXJzX3RvX2FsbG9jKSkpIHsKKwkJcmV0ID0gLUVEUVVPVDsKKwkJZ290byBvdXRfY29tbWl0OworCX0KIAkvKgogCSAqIFdlIGRvbid0IHdhbnQgdGhpcyB0byBmYWlsIGluIG9jZnMyX3dyaXRlX2VuZCgpLCBzbyBkbyBpdAogCSAqIGhlcmUuCiAJICovCi0JcmV0ID0gb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwgd2MtPndfZGlfYmgsCi0JCQkJICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOworCXJldCA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzX2RpKGhhbmRsZSwgaW5vZGUsIHdjLT53X2RpX2JoLAorCQkJCSAgICAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKIAlpZiAocmV0KSB7CiAJCW1sb2dfZXJybm8ocmV0KTsKLQkJZ290byBvdXRfY29tbWl0OworCQlnb3RvIG91dF9xdW90YTsKIAl9CiAKIAkvKgpAQCAtMTc3MSwxNCArMTc1NywxNCBAQAogCQkJCQkgbW1hcF9wYWdlKTsKIAlpZiAocmV0KSB7CiAJCW1sb2dfZXJybm8ocmV0KTsKLQkJZ290byBvdXRfY29tbWl0OworCQlnb3RvIG91dF9xdW90YTsKIAl9CiAKIAlyZXQgPSBvY2ZzMl93cml0ZV9jbHVzdGVyX2J5X2Rlc2MobWFwcGluZywgZGF0YV9hYywgbWV0YV9hYywgd2MsIHBvcywKIAkJCQkJICBsZW4pOwogCWlmIChyZXQpIHsKIAkJbWxvZ19lcnJubyhyZXQpOwotCQlnb3RvIG91dF9jb21taXQ7CisJCWdvdG8gb3V0X3F1b3RhOwogCX0KIAogCWlmIChkYXRhX2FjKQpAQCAtMTc5MCw2ICsxNzc2LDEwIEBACiAJKnBhZ2VwID0gd2MtPndfdGFyZ2V0X3BhZ2U7CiAJKmZzZGF0YSA9IHdjOwogCXJldHVybiAwOworb3V0X3F1b3RhOgorCWlmIChjbHVzdGVyc190b19hbGxvYykKKwkJdmZzX2RxX2ZyZWVfc3BhY2UoaW5vZGUsCisJCQkgIG9jZnMyX2NsdXN0ZXJzX3RvX2J5dGVzKG9zYi0+c2IsIGNsdXN0ZXJzX3RvX2FsbG9jKSk7CiBvdXRfY29tbWl0OgogCW9jZnMyX2NvbW1pdF90cmFucyhvc2IsIGhhbmRsZSk7CiAKQEAgLTE5MTksMTUgKzE5MDksOCBAQAogCQl9CiAKIAkJaWYgKHBhZ2VfaGFzX2J1ZmZlcnModG1wcGFnZSkpIHsKLQkJCWlmIChvY2ZzMl9zaG91bGRfb3JkZXJfZGF0YShpbm9kZSkpIHsKKwkJCWlmIChvY2ZzMl9zaG91bGRfb3JkZXJfZGF0YShpbm9kZSkpCiAJCQkJb2NmczJfamJkMl9maWxlX2lub2RlKHdjLT53X2hhbmRsZSwgaW5vZGUpOwotI2lmZGVmIENPTkZJR19PQ0ZTMl9DT01QQVRfSkJECi0JCQkJd2Fsa19wYWdlX2J1ZmZlcnMod2MtPndfaGFuZGxlLAotCQkJCQkJICBwYWdlX2J1ZmZlcnModG1wcGFnZSksCi0JCQkJCQkgIGZyb20sIHRvLCBOVUxMLAotCQkJCQkJICBvY2ZzMl9qb3VybmFsX2RpcnR5X2RhdGEpOwotI2VuZGlmCi0JCQl9CiAJCQlibG9ja19jb21taXRfd3JpdGUodG1wcGFnZSwgZnJvbSwgdG8pOwogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvYmxvY2tjaGVjay5jIGIvZnMvb2NmczIvYmxvY2tjaGVjay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhOTQ3YzQKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9vY2ZzMi9ibG9ja2NoZWNrLmMKQEAgLTAsMCArMSw0NzcgQEAKKy8qIC0qLSBtb2RlOiBjOyBjLWJhc2ljLW9mZnNldDogODsgLSotCisgKiB2aW06IG5vZXhwYW5kdGFiIHN3PTggdHM9OCBzdHM9MDoKKyAqCisgKiBibG9ja2NoZWNrLmMKKyAqCisgKiBDaGVja3N1bSBhbmQgRUNDIGNvZGVzIGZvciB0aGUgT0NGUzIgdXNlcnNwYWNlIGxpYnJhcnkuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA4IE9yYWNsZS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLCB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KKyNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKworI2luY2x1ZGUgPGNsdXN0ZXIvbWFza2xvZy5oPgorCisjaW5jbHVkZSAib2NmczIuaCIKKworI2luY2x1ZGUgImJsb2NrY2hlY2suaCIKKworCisvKgorICogV2UgdXNlIHRoZSBmb2xsb3dpbmcgY29udmVudGlvbnM6CisgKgorICogZCA9ICMgZGF0YSBiaXRzCisgKiBwID0gIyBwYXJpdHkgYml0cworICogYyA9ICMgdG90YWwgY29kZSBiaXRzIChkICsgcCkKKyAqLworCisKKy8qCisgKiBDYWxjdWxhdGUgdGhlIGJpdCBvZmZzZXQgaW4gdGhlIGhhbW1pbmcgY29kZSBidWZmZXIgYmFzZWQgb24gdGhlIGJpdCdzCisgKiBvZmZzZXQgaW4gdGhlIGRhdGEgYnVmZmVyLiAgU2luY2UgdGhlIGhhbW1pbmcgY29kZSByZXNlcnZlcyBhbGwKKyAqIHBvd2VyLW9mLXR3byBiaXRzIGZvciBwYXJpdHksIHRoZSBkYXRhIGJpdCBudW1iZXIgYW5kIHRoZSBjb2RlIGJpdAorICogbnVtYmVyIGFyZSBvZmZlc3QgYnkgYWxsIHRoZSBwYXJpdHkgYml0cyBiZWZvcmVoYW5kLgorICoKKyAqIFJlY2FsbCB0aGF0IGJpdCBudW1iZXJzIGluIGhhbW1pbmcgY29kZSBhcmUgMS1iYXNlZC4gIFRoaXMgZnVuY3Rpb24KKyAqIHRha2VzIHRoZSAwLWJhc2VkIGRhdGEgYml0IGZyb20gdGhlIGNhbGxlci4KKyAqCisgKiBBbiBleGFtcGxlLiAgVGFrZSBiaXQgMSBvZiB0aGUgZGF0YSBidWZmZXIuICAxIGlzIGEgcG93ZXIgb2YgdHdvICgyXjApLAorICogc28gaXQncyBhIHBhcml0eSBiaXQuICAyIGlzIGEgcG93ZXIgb2YgdHdvICgyXjEpLCBzbyBpdCdzIGEgcGFyaXR5IGJpdC4KKyAqIDMgaXMgbm90IGEgcG93ZXIgb2YgdHdvLiAgU28gYml0IDEgb2YgdGhlIGRhdGEgYnVmZmVyIGVuZHMgdXAgYXMgYml0IDMKKyAqIGluIHRoZSBjb2RlIGJ1ZmZlci4KKyAqCisgKiBUaGUgY2FsbGVyIGNhbiBwYXNzIGluICpwIGlmIGl0IHdhbnRzIHRvIGtlZXAgdHJhY2sgb2YgdGhlIG1vc3QgcmVjZW50CisgKiBudW1iZXIgb2YgcGFyaXR5IGJpdHMgYWRkZWQuICBUaGlzIGFsbG93cyB0aGUgZnVuY3Rpb24gdG8gc3RhcnQgdGhlCisgKiBjYWxjdWxhdGlvbiBhdCB0aGUgbGFzdCBwbGFjZS4KKyAqLworc3RhdGljIHVuc2lnbmVkIGludCBjYWxjX2NvZGVfYml0KHVuc2lnbmVkIGludCBpLCB1bnNpZ25lZCBpbnQgKnBfY2FjaGUpCit7CisJdW5zaWduZWQgaW50IGIsIHAgPSAwOworCisJLyoKKwkgKiBEYXRhIGJpdHMgYXJlIDAtYmFzZWQsIGJ1dCB3ZSdyZSB0YWxraW5nIGNvZGUgYml0cywgd2hpY2gKKwkgKiBhcmUgMS1iYXNlZC4KKwkgKi8KKwliID0gaSArIDE7CisKKwkvKiBVc2UgdGhlIGNhY2hlIGlmIGl0IGlzIHRoZXJlICovCisJaWYgKHBfY2FjaGUpCisJCXAgPSAqcF9jYWNoZTsKKyAgICAgICAgYiArPSBwOworCisJLyoKKwkgKiBGb3IgZXZlcnkgcG93ZXIgb2YgdHdvIGJlbG93IG91ciBiaXQgbnVtYmVyLCBidW1wIG91ciBiaXQuCisJICoKKwkgKiBXZSBjb21wYXJlIHdpdGggKGIgKyAxKSBiZWNhdXNlIHdlIGhhdmUgdG8gY29tcGFyZSB3aXRoIHdoYXQgYgorCSAqIHdvdWxkIGJlIF9pZl8gaXQgd2VyZSBidW1wZWQgdXAgYnkgdGhlIHBhcml0eSBiaXQuICBDYXBpY2U/CisJICoKKwkgKiBwIGlzIHNldCBhYm92ZS4KKwkgKi8KKwlmb3IgKDsgKDEgPDwgcCkgPCAoYiArIDEpOyBwKyspCisJCWIrKzsKKworCWlmIChwX2NhY2hlKQorCQkqcF9jYWNoZSA9IHA7CisKKwlyZXR1cm4gYjsKK30KKworLyoKKyAqIFRoaXMgaXMgdGhlIGxvdyBsZXZlbCBlbmNvZGVyIGZ1bmN0aW9uLiAgSXQgY2FuIGJlIGNhbGxlZCBhY3Jvc3MKKyAqIG11bHRpcGxlIGh1bmtzIGp1c3QgbGlrZSB0aGUgY3JjMzIgY29kZS4gICdkJyBpcyB0aGUgbnVtYmVyIG9mIGJpdHMKKyAqIF9pbl90aGlzX2h1bmtfLiAgbnIgaXMgdGhlIGJpdCBvZmZzZXQgb2YgdGhpcyBodW5rLiAgU28sIGlmIHlvdSBoYWQKKyAqIHR3byA1MTJCIGJ1ZmZlcnMsIHlvdSB3b3VsZCBkbyBpdCBsaWtlIHNvOgorICoKKyAqIHBhcml0eSA9IG9jZnMyX2hhbW1pbmdfZW5jb2RlKDAsIGJ1ZjEsIDUxMiAqIDgsIDApOworICogcGFyaXR5ID0gb2NmczJfaGFtbWluZ19lbmNvZGUocGFyaXR5LCBidWYyLCA1MTIgKiA4LCA1MTIgKiA4KTsKKyAqCisgKiBJZiB5b3UganVzdCBoYXZlIG9uZSBidWZmZXIsIHVzZSBvY2ZzMl9oYW1taW5nX2VuY29kZV9ibG9jaygpLgorICovCit1MzIgb2NmczJfaGFtbWluZ19lbmNvZGUodTMyIHBhcml0eSwgdm9pZCAqZGF0YSwgdW5zaWduZWQgaW50IGQsIHVuc2lnbmVkIGludCBucikKK3sKKwl1bnNpZ25lZCBpbnQgaSwgYiwgcCA9IDA7CisKKwlCVUdfT04oIWQpOworCisJLyoKKwkgKiBiIGlzIHRoZSBoYW1taW5nIGNvZGUgYml0IG51bWJlci4gIEhhbW1pbmcgY29kZSBzcGVjaWZpZXMgYQorCSAqIDEtYmFzZWQgYXJyYXksIGJ1dCBDIHVzZXMgMC1iYXNlZC4gIFNvICdpJyBpcyBmb3IgQywgYW5kICdiJyBpcworCSAqIGZvciB0aGUgYWxnb3JpdGhtLgorCSAqCisJICogVGhlIGkrKyBpbiB0aGUgZm9yIGxvb3AgaXMgc28gdGhhdCB0aGUgc3RhcnQgb2Zmc2V0IHBhc3NlZAorCSAqIHRvIG9jZnMyX2ZpbmRfbmV4dF9iaXRfc2V0KCkgaXMgb25lIGdyZWF0ZXIgdGhhbiB0aGUgcHJldmlvdXNseQorCSAqIGZvdW5kIGJpdC4KKwkgKi8KKwlmb3IgKGkgPSAwOyAoaSA9IG9jZnMyX2ZpbmRfbmV4dF9iaXQoZGF0YSwgZCwgaSkpIDwgZDsgaSsrKQorCXsKKwkJLyoKKwkJICogaSBpcyB0aGUgb2Zmc2V0IGluIHRoaXMgaHVuaywgbnIgKyBpIGlzIHRoZSB0b3RhbCBiaXQKKwkJICogb2Zmc2V0LgorCQkgKi8KKwkJYiA9IGNhbGNfY29kZV9iaXQobnIgKyBpLCAmcCk7CisKKwkJLyoKKwkJICogRGF0YSBiaXRzIGluIHRoZSByZXN1bHRhbnQgY29kZSBhcmUgY2hlY2tlZCBieQorCQkgKiBwYXJpdHkgYml0cyB0aGF0IGFyZSBwYXJ0IG9mIHRoZSBiaXQgbnVtYmVyCisJCSAqIHJlcHJlc2VudGF0aW9uLiAgSHVoPworCQkgKgorCQkgKiA8d2lraXBlZGlhIGhyZWY9Imh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSGFtbWluZ19jb2RlIj4KKwkJICogSW4gb3RoZXIgd29yZHMsIHRoZSBwYXJpdHkgYml0IGF0IHBvc2l0aW9uIDJeaworCQkgKiBjaGVja3MgYml0cyBpbiBwb3NpdGlvbnMgaGF2aW5nIGJpdCBrIHNldCBpbgorCQkgKiB0aGVpciBiaW5hcnkgcmVwcmVzZW50YXRpb24uICBDb252ZXJzZWx5LCBmb3IKKwkJICogaW5zdGFuY2UsIGJpdCAxMywgaS5lLiAxMTAxKDIpLCBpcyBjaGVja2VkIGJ5CisJCSAqIGJpdHMgMTAwMCgyKSA9IDgsIDAxMDAoMik9NCBhbmQgMDAwMSgyKSA9IDEuCisJCSAqIDwvd2lraXBlZGlhPgorCQkgKgorCQkgKiBOb3RlIHRoYXQgJ2snIGlzIHRoZSBfY29kZV8gYml0IG51bWJlci4gICdiJyBpbgorCQkgKiBvdXIgbG9vcC4KKwkJICovCisJCXBhcml0eSBePSBiOworCX0KKworCS8qIFdoaWxlIHRoZSBkYXRhIGJ1ZmZlciB3YXMgdHJlYXRlZCBhcyBsaXR0bGUgZW5kaWFuLCB0aGUKKwkgKiByZXR1cm4gdmFsdWUgaXMgaW4gaG9zdCBlbmRpYW4uICovCisJcmV0dXJuIHBhcml0eTsKK30KKwordTMyIG9jZnMyX2hhbW1pbmdfZW5jb2RlX2Jsb2NrKHZvaWQgKmRhdGEsIHVuc2lnbmVkIGludCBibG9ja3NpemUpCit7CisJcmV0dXJuIG9jZnMyX2hhbW1pbmdfZW5jb2RlKDAsIGRhdGEsIGJsb2Nrc2l6ZSAqIDgsIDApOworfQorCisvKgorICogTGlrZSBvY2ZzMl9oYW1taW5nX2VuY29kZSgpLCB0aGlzIGNhbiBoYW5kbGUgaHVua3MuICBuciBpcyB0aGUgYml0CisgKiBvZmZzZXQgb2YgdGhlIGN1cnJlbnQgaHVuay4gIElmIGJpdCB0byBiZSBmaXhlZCBpcyBub3QgcGFydCBvZiB0aGUKKyAqIGN1cnJlbnQgaHVuaywgdGhpcyBkb2VzIG5vdGhpbmcuCisgKgorICogSWYgeW91IG9ubHkgaGF2ZSBvbmUgaHVuaywgdXNlIG9jZnMyX2hhbW1pbmdfZml4X2Jsb2NrKCkuCisgKi8KK3ZvaWQgb2NmczJfaGFtbWluZ19maXgodm9pZCAqZGF0YSwgdW5zaWduZWQgaW50IGQsIHVuc2lnbmVkIGludCBuciwKKwkJICAgICAgIHVuc2lnbmVkIGludCBmaXgpCit7CisJdW5zaWduZWQgaW50IGksIGI7CisKKwlCVUdfT04oIWQpOworCisJLyoKKwkgKiBJZiB0aGUgYml0IHRvIGZpeCBoYXMgYW4gaHdlaWdodCBvZiAxLCBpdCdzIGEgcGFyaXR5IGJpdC4gIE9uZQorCSAqIGJ1c3RlZCBwYXJpdHkgYml0IGlzIGl0cyBvd24gZXJyb3IuICBOb3RoaW5nIHRvIGRvIGhlcmUuCisJICovCisJaWYgKGh3ZWlnaHQzMihmaXgpID09IDEpCisJCXJldHVybjsKKworCS8qCisJICogbnIgKyBkIGlzIHRoZSBiaXQgcmlnaHQgcGFzdCB0aGUgZGF0YSBodW5rIHdlJ3JlIGxvb2tpbmcgYXQuCisJICogSWYgZml4IGFmdGVyIHRoYXQsIG5vdGhpbmcgdG8gZG8KKwkgKi8KKwlpZiAoZml4ID49IGNhbGNfY29kZV9iaXQobnIgKyBkLCBOVUxMKSkKKwkJcmV0dXJuOworCisJLyoKKwkgKiBuciBpcyB0aGUgb2Zmc2V0IGluIHRoZSBkYXRhIGh1bmsgd2UncmUgc3RhcnRpbmcgYXQuICBMZXQncworCSAqIHN0YXJ0IGIgYXQgdGhlIG9mZnNldCBpbiB0aGUgY29kZSBidWZmZXIuICBTZWUgaGFtbWluZ19lbmNvZGUoKQorCSAqIGZvciBhIG1vcmUgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgJ2InLgorCSAqLworCWIgPSBjYWxjX2NvZGVfYml0KG5yLCBOVUxMKTsKKwkvKiBJZiB0aGUgZml4IGlzIGJlZm9yZSB0aGlzIGh1bmssIG5vdGhpbmcgdG8gZG8gKi8KKwlpZiAoZml4IDwgYikKKwkJcmV0dXJuOworCisJZm9yIChpID0gMDsgaSA8IGQ7IGkrKywgYisrKQorCXsKKwkJLyogU2tpcCBwYXN0IHBhcml0eSBiaXRzICovCisJCXdoaWxlIChod2VpZ2h0MzIoYikgPT0gMSkKKwkJCWIrKzsKKworCQkvKgorCQkgKiBpIGlzIHRoZSBvZmZzZXQgaW4gdGhpcyBkYXRhIGh1bmsuCisJCSAqIG5yICsgaSBpcyB0aGUgb2Zmc2V0IGluIHRoZSB0b3RhbCBkYXRhIGJ1ZmZlci4KKwkJICogYiBpcyB0aGUgb2Zmc2V0IGluIHRoZSB0b3RhbCBjb2RlIGJ1ZmZlci4KKwkJICoKKwkJICogVGh1cywgd2hlbiBiID09IGZpeCwgYml0IGkgaW4gdGhlIGN1cnJlbnQgaHVuayBuZWVkcworCQkgKiBmaXhpbmcuCisJCSAqLworCQlpZiAoYiA9PSBmaXgpCisJCXsKKwkJCWlmIChvY2ZzMl90ZXN0X2JpdChpLCBkYXRhKSkKKwkJCQlvY2ZzMl9jbGVhcl9iaXQoaSwgZGF0YSk7CisJCQllbHNlCisJCQkJb2NmczJfc2V0X2JpdChpLCBkYXRhKTsKKwkJCWJyZWFrOworCQl9CisJfQorfQorCit2b2lkIG9jZnMyX2hhbW1pbmdfZml4X2Jsb2NrKHZvaWQgKmRhdGEsIHVuc2lnbmVkIGludCBibG9ja3NpemUsCisJCQkgICAgIHVuc2lnbmVkIGludCBmaXgpCit7CisJb2NmczJfaGFtbWluZ19maXgoZGF0YSwgYmxvY2tzaXplICogOCwgMCwgZml4KTsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gZ2VuZXJhdGVzIGNoZWNrIGluZm9ybWF0aW9uIGZvciBhIGJsb2NrLgorICogZGF0YSBpcyB0aGUgYmxvY2sgdG8gYmUgY2hlY2tlZC4gIGJjIGlzIGEgcG9pbnRlciB0byB0aGUKKyAqIG9jZnMyX2Jsb2NrX2NoZWNrIHN0cnVjdHVyZSBkZXNjcmliaW5nIHRoZSBjcmMzMiBhbmQgdGhlIGVjYy4KKyAqCisgKiBiYyBzaG91bGQgYmUgYSBwb2ludGVyIGluc2lkZSBkYXRhLCBhcyB0aGUgZnVuY3Rpb24gd2lsbAorICogdGFrZSBjYXJlIG9mIHplcm9pbmcgaXQgYmVmb3JlIGNhbGN1bGF0aW5nIHRoZSBjaGVjayBpbmZvcm1hdGlvbi4gIElmCisgKiBiYyBkb2VzIG5vdCBwb2ludCBpbnNpZGUgZGF0YSwgdGhlIGNhbGxlciBtdXN0IG1ha2Ugc3VyZSBhbnkgaW5saW5lCisgKiBvY2ZzMl9ibG9ja19jaGVjayBzdHJ1Y3R1cmVzIGFyZSB6ZXJvZWQuCisgKgorICogVGhlIGRhdGEgYnVmZmVyIG11c3QgYmUgaW4gb24tZGlzayBlbmRpYW4gKGxpdHRsZSBlbmRpYW4gZm9yIG9jZnMyKS4KKyAqIGJjIHdpbGwgYmUgZmlsbGVkIHdpdGggbGl0dGxlLWVuZGlhbiB2YWx1ZXMgYW5kIHdpbGwgYmUgcmVhZHkgdG8gZ28gdG8KKyAqIGRpc2suCisgKi8KK3ZvaWQgb2NmczJfYmxvY2tfY2hlY2tfY29tcHV0ZSh2b2lkICpkYXRhLCBzaXplX3QgYmxvY2tzaXplLAorCQkJICAgICAgIHN0cnVjdCBvY2ZzMl9ibG9ja19jaGVjayAqYmMpCit7CisJdTMyIGNyYzsKKwl1MzIgZWNjOworCisJbWVtc2V0KGJjLCAwLCBzaXplb2Yoc3RydWN0IG9jZnMyX2Jsb2NrX2NoZWNrKSk7CisKKwljcmMgPSBjcmMzMl9sZSh+MCwgZGF0YSwgYmxvY2tzaXplKTsKKwllY2MgPSBvY2ZzMl9oYW1taW5nX2VuY29kZV9ibG9jayhkYXRhLCBibG9ja3NpemUpOworCisJLyoKKwkgKiBObyBlY2MnZCBvY2ZzMiBzdHJ1Y3R1cmUgaXMgbGFyZ2VyIHRoYW4gNEssIHNvIGVjYyB3aWxsIGJlIG5vCisJICogbGFyZ2VyIHRoYW4gMTYgYml0cy4KKwkgKi8KKwlCVUdfT04oZWNjID4gVVNIT1JUX01BWCk7CisKKwliYy0+YmNfY3JjMzJlID0gY3B1X3RvX2xlMzIoY3JjKTsKKwliYy0+YmNfZWNjID0gY3B1X3RvX2xlMTYoKHUxNillY2MpOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiB2YWxpZGF0ZXMgZXhpc3RpbmcgY2hlY2sgaW5mb3JtYXRpb24uICBMaWtlIF9jb21wdXRlLAorICogdGhlIGZ1bmN0aW9uIHdpbGwgdGFrZSBjYXJlIG9mIHplcm9pbmcgYmMgYmVmb3JlIGNhbGN1bGF0aW5nIGNoZWNrIGNvZGVzLgorICogSWYgYmMgaXMgbm90IGEgcG9pbnRlciBpbnNpZGUgZGF0YSwgdGhlIGNhbGxlciBtdXN0IGhhdmUgemVyb2VkIGFueQorICogaW5saW5lIG9jZnMyX2Jsb2NrX2NoZWNrIHN0cnVjdHVyZXMuCisgKgorICogQWdhaW4sIHRoZSBkYXRhIHBhc3NlZCBpbiBzaG91bGQgYmUgdGhlIG9uLWRpc2sgZW5kaWFuLgorICovCitpbnQgb2NmczJfYmxvY2tfY2hlY2tfdmFsaWRhdGUodm9pZCAqZGF0YSwgc2l6ZV90IGJsb2Nrc2l6ZSwKKwkJCSAgICAgICBzdHJ1Y3Qgb2NmczJfYmxvY2tfY2hlY2sgKmJjKQoreworCWludCByYyA9IDA7CisJc3RydWN0IG9jZnMyX2Jsb2NrX2NoZWNrIGNoZWNrOworCXUzMiBjcmMsIGVjYzsKKworCWNoZWNrLmJjX2NyYzMyZSA9IGxlMzJfdG9fY3B1KGJjLT5iY19jcmMzMmUpOworCWNoZWNrLmJjX2VjYyA9IGxlMTZfdG9fY3B1KGJjLT5iY19lY2MpOworCisJbWVtc2V0KGJjLCAwLCBzaXplb2Yoc3RydWN0IG9jZnMyX2Jsb2NrX2NoZWNrKSk7CisKKwkvKiBGYXN0IHBhdGggLSBpZiB0aGUgY3JjMzIgdmFsaWRhdGVzLCB3ZSdyZSBnb29kIHRvIGdvICovCisJY3JjID0gY3JjMzJfbGUofjAsIGRhdGEsIGJsb2Nrc2l6ZSk7CisJaWYgKGNyYyA9PSBjaGVjay5iY19jcmMzMmUpCisJCWdvdG8gb3V0OworCisJbWxvZyhNTF9FUlJPUiwKKwkgICAgICJDUkMzMiBmYWlsZWQ6IHN0b3JlZDogJXUsIGNvbXB1dGVkICV1LiAgQXBwbHlpbmcgRUNDLlxuIiwKKwkgICAgICh1bnNpZ25lZCBpbnQpY2hlY2suYmNfY3JjMzJlLCAodW5zaWduZWQgaW50KWNyYyk7CisKKwkvKiBPaywgdHJ5IEVDQyBmaXh1cHMgKi8KKwllY2MgPSBvY2ZzMl9oYW1taW5nX2VuY29kZV9ibG9jayhkYXRhLCBibG9ja3NpemUpOworCW9jZnMyX2hhbW1pbmdfZml4X2Jsb2NrKGRhdGEsIGJsb2Nrc2l6ZSwgZWNjIF4gY2hlY2suYmNfZWNjKTsKKworCS8qIEFuZCBjaGVjayB0aGUgY3JjMzIgYWdhaW4gKi8KKwljcmMgPSBjcmMzMl9sZSh+MCwgZGF0YSwgYmxvY2tzaXplKTsKKwlpZiAoY3JjID09IGNoZWNrLmJjX2NyYzMyZSkKKwkJZ290byBvdXQ7CisKKwltbG9nKE1MX0VSUk9SLCAiRml4ZWQgQ1JDMzIgZmFpbGVkOiBzdG9yZWQ6ICV1LCBjb21wdXRlZCAldVxuIiwKKwkgICAgICh1bnNpZ25lZCBpbnQpY2hlY2suYmNfY3JjMzJlLCAodW5zaWduZWQgaW50KWNyYyk7CisKKwlyYyA9IC1FSU87CisKK291dDoKKwliYy0+YmNfY3JjMzJlID0gY3B1X3RvX2xlMzIoY2hlY2suYmNfY3JjMzJlKTsKKwliYy0+YmNfZWNjID0gY3B1X3RvX2xlMTYoY2hlY2suYmNfZWNjKTsKKworCXJldHVybiByYzsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gZ2VuZXJhdGVzIGNoZWNrIGluZm9ybWF0aW9uIGZvciBhIGxpc3Qgb2YgYnVmZmVyX2hlYWRzLgorICogYmhzIGlzIHRoZSBibG9ja3MgdG8gYmUgY2hlY2tlZC4gIGJjIGlzIGEgcG9pbnRlciB0byB0aGUKKyAqIG9jZnMyX2Jsb2NrX2NoZWNrIHN0cnVjdHVyZSBkZXNjcmliaW5nIHRoZSBjcmMzMiBhbmQgdGhlIGVjYy4KKyAqCisgKiBiYyBzaG91bGQgYmUgYSBwb2ludGVyIGluc2lkZSBkYXRhLCBhcyB0aGUgZnVuY3Rpb24gd2lsbAorICogdGFrZSBjYXJlIG9mIHplcm9pbmcgaXQgYmVmb3JlIGNhbGN1bGF0aW5nIHRoZSBjaGVjayBpbmZvcm1hdGlvbi4gIElmCisgKiBiYyBkb2VzIG5vdCBwb2ludCBpbnNpZGUgZGF0YSwgdGhlIGNhbGxlciBtdXN0IG1ha2Ugc3VyZSBhbnkgaW5saW5lCisgKiBvY2ZzMl9ibG9ja19jaGVjayBzdHJ1Y3R1cmVzIGFyZSB6ZXJvZWQuCisgKgorICogVGhlIGRhdGEgYnVmZmVyIG11c3QgYmUgaW4gb24tZGlzayBlbmRpYW4gKGxpdHRsZSBlbmRpYW4gZm9yIG9jZnMyKS4KKyAqIGJjIHdpbGwgYmUgZmlsbGVkIHdpdGggbGl0dGxlLWVuZGlhbiB2YWx1ZXMgYW5kIHdpbGwgYmUgcmVhZHkgdG8gZ28gdG8KKyAqIGRpc2suCisgKi8KK3ZvaWQgb2NmczJfYmxvY2tfY2hlY2tfY29tcHV0ZV9iaHMoc3RydWN0IGJ1ZmZlcl9oZWFkICoqYmhzLCBpbnQgbnIsCisJCQkJICAgc3RydWN0IG9jZnMyX2Jsb2NrX2NoZWNrICpiYykKK3sKKwlpbnQgaTsKKwl1MzIgY3JjLCBlY2M7CisKKwlCVUdfT04obnIgPCAwKTsKKworCWlmICghbnIpCisJCXJldHVybjsKKworCW1lbXNldChiYywgMCwgc2l6ZW9mKHN0cnVjdCBvY2ZzMl9ibG9ja19jaGVjaykpOworCisJZm9yIChpID0gMCwgY3JjID0gfjAsIGVjYyA9IDA7IGkgPCBucjsgaSsrKSB7CisJCWNyYyA9IGNyYzMyX2xlKGNyYywgYmhzW2ldLT5iX2RhdGEsIGJoc1tpXS0+Yl9zaXplKTsKKwkJLyoKKwkJICogVGhlIG51bWJlciBvZiBiaXRzIGluIGEgYnVmZmVyIGlzIG9idmlvdXNseSBiX3NpemUqOC4KKwkJICogVGhlIG9mZnNldCBvZiB0aGlzIGJ1ZmZlciBpcyBiX3NpemUqaSwgc28gdGhlIGJpdCBvZmZzZXQKKwkJICogb2YgdGhpcyBidWZmZXIgaXMgYl9zaXplKjgqaS4KKwkJICovCisJCWVjYyA9ICh1MTYpb2NmczJfaGFtbWluZ19lbmNvZGUoZWNjLCBiaHNbaV0tPmJfZGF0YSwKKwkJCQkJCWJoc1tpXS0+Yl9zaXplICogOCwKKwkJCQkJCWJoc1tpXS0+Yl9zaXplICogOCAqIGkpOworCX0KKworCS8qCisJICogTm8gZWNjJ2Qgb2NmczIgc3RydWN0dXJlIGlzIGxhcmdlciB0aGFuIDRLLCBzbyBlY2Mgd2lsbCBiZSBubworCSAqIGxhcmdlciB0aGFuIDE2IGJpdHMuCisJICovCisJQlVHX09OKGVjYyA+IFVTSE9SVF9NQVgpOworCisJYmMtPmJjX2NyYzMyZSA9IGNwdV90b19sZTMyKGNyYyk7CisJYmMtPmJjX2VjYyA9IGNwdV90b19sZTE2KCh1MTYpZWNjKTsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gdmFsaWRhdGVzIGV4aXN0aW5nIGNoZWNrIGluZm9ybWF0aW9uIG9uIGEgbGlzdCBvZgorICogYnVmZmVyX2hlYWRzLiAgTGlrZSBfY29tcHV0ZV9iaHMsIHRoZSBmdW5jdGlvbiB3aWxsIHRha2UgY2FyZSBvZgorICogemVyb2luZyBiYyBiZWZvcmUgY2FsY3VsYXRpbmcgY2hlY2sgY29kZXMuICBJZiBiYyBpcyBub3QgYSBwb2ludGVyCisgKiBpbnNpZGUgZGF0YSwgdGhlIGNhbGxlciBtdXN0IGhhdmUgemVyb2VkIGFueSBpbmxpbmUKKyAqIG9jZnMyX2Jsb2NrX2NoZWNrIHN0cnVjdHVyZXMuCisgKgorICogQWdhaW4sIHRoZSBkYXRhIHBhc3NlZCBpbiBzaG91bGQgYmUgdGhlIG9uLWRpc2sgZW5kaWFuLgorICovCitpbnQgb2NmczJfYmxvY2tfY2hlY2tfdmFsaWRhdGVfYmhzKHN0cnVjdCBidWZmZXJfaGVhZCAqKmJocywgaW50IG5yLAorCQkJCSAgIHN0cnVjdCBvY2ZzMl9ibG9ja19jaGVjayAqYmMpCit7CisJaW50IGksIHJjID0gMDsKKwlzdHJ1Y3Qgb2NmczJfYmxvY2tfY2hlY2sgY2hlY2s7CisJdTMyIGNyYywgZWNjLCBmaXg7CisKKwlCVUdfT04obnIgPCAwKTsKKworCWlmICghbnIpCisJCXJldHVybiAwOworCisJY2hlY2suYmNfY3JjMzJlID0gbGUzMl90b19jcHUoYmMtPmJjX2NyYzMyZSk7CisJY2hlY2suYmNfZWNjID0gbGUxNl90b19jcHUoYmMtPmJjX2VjYyk7CisKKwltZW1zZXQoYmMsIDAsIHNpemVvZihzdHJ1Y3Qgb2NmczJfYmxvY2tfY2hlY2spKTsKKworCS8qIEZhc3QgcGF0aCAtIGlmIHRoZSBjcmMzMiB2YWxpZGF0ZXMsIHdlJ3JlIGdvb2QgdG8gZ28gKi8KKwlmb3IgKGkgPSAwLCBjcmMgPSB+MDsgaSA8IG5yOyBpKyspCisJCWNyYyA9IGNyYzMyX2xlKGNyYywgYmhzW2ldLT5iX2RhdGEsIGJoc1tpXS0+Yl9zaXplKTsKKwlpZiAoY3JjID09IGNoZWNrLmJjX2NyYzMyZSkKKwkJZ290byBvdXQ7CisKKwltbG9nKE1MX0VSUk9SLAorCSAgICAgIkNSQzMyIGZhaWxlZDogc3RvcmVkOiAldSwgY29tcHV0ZWQgJXUuICBBcHBseWluZyBFQ0MuXG4iLAorCSAgICAgKHVuc2lnbmVkIGludCljaGVjay5iY19jcmMzMmUsICh1bnNpZ25lZCBpbnQpY3JjKTsKKworCS8qIE9rLCB0cnkgRUNDIGZpeHVwcyAqLworCWZvciAoaSA9IDAsIGVjYyA9IDA7IGkgPCBucjsgaSsrKSB7CisJCS8qCisJCSAqIFRoZSBudW1iZXIgb2YgYml0cyBpbiBhIGJ1ZmZlciBpcyBvYnZpb3VzbHkgYl9zaXplKjguCisJCSAqIFRoZSBvZmZzZXQgb2YgdGhpcyBidWZmZXIgaXMgYl9zaXplKmksIHNvIHRoZSBiaXQgb2Zmc2V0CisJCSAqIG9mIHRoaXMgYnVmZmVyIGlzIGJfc2l6ZSo4KmkuCisJCSAqLworCQllY2MgPSAodTE2KW9jZnMyX2hhbW1pbmdfZW5jb2RlKGVjYywgYmhzW2ldLT5iX2RhdGEsCisJCQkJCQliaHNbaV0tPmJfc2l6ZSAqIDgsCisJCQkJCQliaHNbaV0tPmJfc2l6ZSAqIDggKiBpKTsKKwl9CisJZml4ID0gZWNjIF4gY2hlY2suYmNfZWNjOworCWZvciAoaSA9IDA7IGkgPCBucjsgaSsrKSB7CisJCS8qCisJCSAqIFRyeSB0aGUgZml4IGFnYWluc3QgZWFjaCBidWZmZXIuICBJdCB3aWxsIG9ubHkgYWZmZWN0CisJCSAqIG9uZSBvZiB0aGVtLgorCQkgKi8KKwkJb2NmczJfaGFtbWluZ19maXgoYmhzW2ldLT5iX2RhdGEsIGJoc1tpXS0+Yl9zaXplICogOCwKKwkJCQkgIGJoc1tpXS0+Yl9zaXplICogOCAqIGksIGZpeCk7CisJfQorCisJLyogQW5kIGNoZWNrIHRoZSBjcmMzMiBhZ2FpbiAqLworCWZvciAoaSA9IDAsIGNyYyA9IH4wOyBpIDwgbnI7IGkrKykKKwkJY3JjID0gY3JjMzJfbGUoY3JjLCBiaHNbaV0tPmJfZGF0YSwgYmhzW2ldLT5iX3NpemUpOworCWlmIChjcmMgPT0gY2hlY2suYmNfY3JjMzJlKQorCQlnb3RvIG91dDsKKworCW1sb2coTUxfRVJST1IsICJGaXhlZCBDUkMzMiBmYWlsZWQ6IHN0b3JlZDogJXUsIGNvbXB1dGVkICV1XG4iLAorCSAgICAgKHVuc2lnbmVkIGludCljaGVjay5iY19jcmMzMmUsICh1bnNpZ25lZCBpbnQpY3JjKTsKKworCXJjID0gLUVJTzsKKworb3V0OgorCWJjLT5iY19jcmMzMmUgPSBjcHVfdG9fbGUzMihjaGVjay5iY19jcmMzMmUpOworCWJjLT5iY19lY2MgPSBjcHVfdG9fbGUxNihjaGVjay5iY19lY2MpOworCisJcmV0dXJuIHJjOworfQorCisvKgorICogVGhlc2UgYXJlIHRoZSBtYWluIEFQSS4gIFRoZXkgY2hlY2sgdGhlIHN1cGVyYmxvY2sgZmxhZyBiZWZvcmUKKyAqIGNhbGxpbmcgdGhlIHVuZGVybHlpbmcgb3BlcmF0aW9ucy4KKyAqCisgKiBUaGV5IGV4cGVjdCB0aGUgYnVmZmVyKHMpIHRvIGJlIGluIGRpc2sgZm9ybWF0LgorICovCit2b2lkIG9jZnMyX2NvbXB1dGVfbWV0YV9lY2Moc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdm9pZCAqZGF0YSwKKwkJCSAgICBzdHJ1Y3Qgb2NmczJfYmxvY2tfY2hlY2sgKmJjKQoreworCWlmIChvY2ZzMl9tZXRhX2VjYyhPQ0ZTMl9TQihzYikpKQorCQlvY2ZzMl9ibG9ja19jaGVja19jb21wdXRlKGRhdGEsIHNiLT5zX2Jsb2Nrc2l6ZSwgYmMpOworfQorCitpbnQgb2NmczJfdmFsaWRhdGVfbWV0YV9lY2Moc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdm9pZCAqZGF0YSwKKwkJCSAgICBzdHJ1Y3Qgb2NmczJfYmxvY2tfY2hlY2sgKmJjKQoreworCWludCByYyA9IDA7CisKKwlpZiAob2NmczJfbWV0YV9lY2MoT0NGUzJfU0Ioc2IpKSkKKwkJcmMgPSBvY2ZzMl9ibG9ja19jaGVja192YWxpZGF0ZShkYXRhLCBzYi0+c19ibG9ja3NpemUsIGJjKTsKKworCXJldHVybiByYzsKK30KKwordm9pZCBvY2ZzMl9jb21wdXRlX21ldGFfZWNjX2JocyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQkJCXN0cnVjdCBidWZmZXJfaGVhZCAqKmJocywgaW50IG5yLAorCQkJCXN0cnVjdCBvY2ZzMl9ibG9ja19jaGVjayAqYmMpCit7CisJaWYgKG9jZnMyX21ldGFfZWNjKE9DRlMyX1NCKHNiKSkpCisJCW9jZnMyX2Jsb2NrX2NoZWNrX2NvbXB1dGVfYmhzKGJocywgbnIsIGJjKTsKK30KKworaW50IG9jZnMyX3ZhbGlkYXRlX21ldGFfZWNjX2JocyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQkJCXN0cnVjdCBidWZmZXJfaGVhZCAqKmJocywgaW50IG5yLAorCQkJCXN0cnVjdCBvY2ZzMl9ibG9ja19jaGVjayAqYmMpCit7CisJaW50IHJjID0gMDsKKworCWlmIChvY2ZzMl9tZXRhX2VjYyhPQ0ZTMl9TQihzYikpKQorCQlyYyA9IG9jZnMyX2Jsb2NrX2NoZWNrX3ZhbGlkYXRlX2JocyhiaHMsIG5yLCBiYyk7CisKKwlyZXR1cm4gcmM7Cit9CisKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2Jsb2NrY2hlY2suaCBiL2ZzL29jZnMyL2Jsb2NrY2hlY2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MGVjM2ZlCi0tLSAvZGV2L251bGwKKysrIGIvZnMvb2NmczIvYmxvY2tjaGVjay5oCkBAIC0wLDAgKzEsODIgQEAKKy8qIC0qLSBtb2RlOiBjOyBjLWJhc2ljLW9mZnNldDogODsgLSotCisgKiB2aW06IG5vZXhwYW5kdGFiIHN3PTggdHM9OCBzdHM9MDoKKyAqCisgKiBibG9ja2NoZWNrLmgKKyAqCisgKiBDaGVja3N1bSBhbmQgRUNDIGNvZGVzIGZvciB0aGUgT0NGUzIgdXNlcnNwYWNlIGxpYnJhcnkuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0LCAyMDA4IE9yYWNsZS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLCB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2lmbmRlZiBPQ0ZTMl9CTE9DS0NIRUNLX0gKKyNkZWZpbmUgT0NGUzJfQkxPQ0tDSEVDS19ICisKKworLyogSGlnaCBsZXZlbCBibG9jayBBUEkgKi8KK3ZvaWQgb2NmczJfY29tcHV0ZV9tZXRhX2VjYyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB2b2lkICpkYXRhLAorCQkJICAgIHN0cnVjdCBvY2ZzMl9ibG9ja19jaGVjayAqYmMpOworaW50IG9jZnMyX3ZhbGlkYXRlX21ldGFfZWNjKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHZvaWQgKmRhdGEsCisJCQkgICAgc3RydWN0IG9jZnMyX2Jsb2NrX2NoZWNrICpiYyk7Cit2b2lkIG9jZnMyX2NvbXB1dGVfbWV0YV9lY2NfYmhzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICoqYmhzLCBpbnQgbnIsCisJCQkJc3RydWN0IG9jZnMyX2Jsb2NrX2NoZWNrICpiYyk7CitpbnQgb2NmczJfdmFsaWRhdGVfbWV0YV9lY2NfYmhzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICoqYmhzLCBpbnQgbnIsCisJCQkJc3RydWN0IG9jZnMyX2Jsb2NrX2NoZWNrICpiYyk7CisKKy8qIExvd2VyIGxldmVsIEFQSSAqLwordm9pZCBvY2ZzMl9ibG9ja19jaGVja19jb21wdXRlKHZvaWQgKmRhdGEsIHNpemVfdCBibG9ja3NpemUsCisJCQkgICAgICAgc3RydWN0IG9jZnMyX2Jsb2NrX2NoZWNrICpiYyk7CitpbnQgb2NmczJfYmxvY2tfY2hlY2tfdmFsaWRhdGUodm9pZCAqZGF0YSwgc2l6ZV90IGJsb2Nrc2l6ZSwKKwkJCSAgICAgICBzdHJ1Y3Qgb2NmczJfYmxvY2tfY2hlY2sgKmJjKTsKK3ZvaWQgb2NmczJfYmxvY2tfY2hlY2tfY29tcHV0ZV9iaHMoc3RydWN0IGJ1ZmZlcl9oZWFkICoqYmhzLCBpbnQgbnIsCisJCQkJICAgc3RydWN0IG9jZnMyX2Jsb2NrX2NoZWNrICpiYyk7CitpbnQgb2NmczJfYmxvY2tfY2hlY2tfdmFsaWRhdGVfYmhzKHN0cnVjdCBidWZmZXJfaGVhZCAqKmJocywgaW50IG5yLAorCQkJCSAgIHN0cnVjdCBvY2ZzMl9ibG9ja19jaGVjayAqYmMpOworCisvKgorICogSGFtbWluZyBjb2RlIGZ1bmN0aW9ucworICovCisKKy8qCisgKiBFbmNvZGluZyBoYW1taW5nIGNvZGUgcGFyaXR5IGJpdHMgZm9yIGEgYnVmZmVyLgorICoKKyAqIFRoaXMgaXMgdGhlIGxvdyBsZXZlbCBlbmNvZGVyIGZ1bmN0aW9uLiAgSXQgY2FuIGJlIGNhbGxlZCBhY3Jvc3MKKyAqIG11bHRpcGxlIGh1bmtzIGp1c3QgbGlrZSB0aGUgY3JjMzIgY29kZS4gICdkJyBpcyB0aGUgbnVtYmVyIG9mIGJpdHMKKyAqIF9pbl90aGlzX2h1bmtfLiAgbnIgaXMgdGhlIGJpdCBvZmZzZXQgb2YgdGhpcyBodW5rLiAgU28sIGlmIHlvdSBoYWQKKyAqIHR3byA1MTJCIGJ1ZmZlcnMsIHlvdSB3b3VsZCBkbyBpdCBsaWtlIHNvOgorICoKKyAqIHBhcml0eSA9IG9jZnMyX2hhbW1pbmdfZW5jb2RlKDAsIGJ1ZjEsIDUxMiAqIDgsIDApOworICogcGFyaXR5ID0gb2NmczJfaGFtbWluZ19lbmNvZGUocGFyaXR5LCBidWYyLCA1MTIgKiA4LCA1MTIgKiA4KTsKKyAqCisgKiBJZiB5b3UganVzdCBoYXZlIG9uZSBidWZmZXIsIHVzZSBvY2ZzMl9oYW1taW5nX2VuY29kZV9ibG9jaygpLgorICovCit1MzIgb2NmczJfaGFtbWluZ19lbmNvZGUodTMyIHBhcml0eSwgdm9pZCAqZGF0YSwgdW5zaWduZWQgaW50IGQsCisJCQkgdW5zaWduZWQgaW50IG5yKTsKKy8qCisgKiBGaXggYSBidWZmZXIgd2l0aCBhIGJpdCBlcnJvci4gIFRoZSAnZml4JyBpcyB0aGUgb3JpZ2luYWwgcGFyaXR5CisgKiB4b3InZCB3aXRoIHRoZSBwYXJpdHkgY2FsY3VsYXRlZCBub3cuCisgKgorICogTGlrZSBvY2ZzMl9oYW1taW5nX2VuY29kZSgpLCB0aGlzIGNhbiBoYW5kbGUgaHVua3MuICBuciBpcyB0aGUgYml0CisgKiBvZmZzZXQgb2YgdGhlIGN1cnJlbnQgaHVuay4gIElmIGJpdCB0byBiZSBmaXhlZCBpcyBub3QgcGFydCBvZiB0aGUKKyAqIGN1cnJlbnQgaHVuaywgdGhpcyBkb2VzIG5vdGhpbmcuCisgKgorICogSWYgeW91IG9ubHkgaGF2ZSBvbmUgYnVmZmVyLCB1c2Ugb2NmczJfaGFtbWluZ19maXhfYmxvY2soKS4KKyAqLwordm9pZCBvY2ZzMl9oYW1taW5nX2ZpeCh2b2lkICpkYXRhLCB1bnNpZ25lZCBpbnQgZCwgdW5zaWduZWQgaW50IG5yLAorCQkgICAgICAgdW5zaWduZWQgaW50IGZpeCk7CisKKy8qIENvbnZlbmllbmNlIHdyYXBwZXJzIGZvciBhIHNpbmdsZSBidWZmZXIgb2YgZGF0YSAqLworZXh0ZXJuIHUzMiBvY2ZzMl9oYW1taW5nX2VuY29kZV9ibG9jayh2b2lkICpkYXRhLCB1bnNpZ25lZCBpbnQgYmxvY2tzaXplKTsKK2V4dGVybiB2b2lkIG9jZnMyX2hhbW1pbmdfZml4X2Jsb2NrKHZvaWQgKmRhdGEsIHVuc2lnbmVkIGludCBibG9ja3NpemUsCisJCQkJICAgIHVuc2lnbmVkIGludCBmaXgpOworI2VuZGlmCmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9idWZmZXJfaGVhZF9pby5jIGIvZnMvb2NmczIvYnVmZmVyX2hlYWRfaW8uYwppbmRleCAzYTE3OGVjLi4xNWM4ZTZkIDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9idWZmZXJfaGVhZF9pby5jCisrKyBiL2ZzL29jZnMyL2J1ZmZlcl9oZWFkX2lvLmMKQEAgLTM5LDYgKzM5LDE4IEBACiAKICNpbmNsdWRlICJidWZmZXJfaGVhZF9pby5oIgogCisvKgorICogQml0cyBvbiBiaC0+Yl9zdGF0ZSB1c2VkIGJ5IG9jZnMyLgorICoKKyAqIFRoZXNlIE1VU1QgYmUgYWZ0ZXIgdGhlIEpCRDIgYml0cy4gIEhlbmNlLCB3ZSB1c2UgQkhfSkJEUHJpdmF0ZVN0YXJ0LgorICovCitlbnVtIG9jZnMyX3N0YXRlX2JpdHMgeworCUJIX05lZWRzVmFsaWRhdGUgPSBCSF9KQkRQcml2YXRlU3RhcnQsCit9OworCisvKiBFeHBhbmQgdGhlIG1hZ2ljIGJfc3RhdGUgZnVuY3Rpb25zICovCitCVUZGRVJfRk5TKE5lZWRzVmFsaWRhdGUsIG5lZWRzX3ZhbGlkYXRlKTsKKwogaW50IG9jZnMyX3dyaXRlX2Jsb2NrKHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLAogCQkgICAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlKQogewpAQCAtMTY2LDcgKzE3OCw5IEBACiB9CiAKIGludCBvY2ZzMl9yZWFkX2Jsb2NrcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1NjQgYmxvY2ssIGludCBuciwKLQkJICAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaHNbXSwgaW50IGZsYWdzKQorCQkgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoc1tdLCBpbnQgZmxhZ3MsCisJCSAgICAgIGludCAoKnZhbGlkYXRlKShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQkJCSAgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpKQogewogCWludCBzdGF0dXMgPSAwOwogCWludCBpLCBpZ25vcmVfY2FjaGUgPSAwOwpAQCAtMjk4LDYgKzMxMiw4IEBACiAKIAkJCWNsZWFyX2J1ZmZlcl91cHRvZGF0ZShiaCk7CiAJCQlnZXRfYmgoYmgpOyAvKiBmb3IgZW5kX2J1ZmZlcl9yZWFkX3N5bmMoKSAqLworCQkJaWYgKHZhbGlkYXRlKQorCQkJCXNldF9idWZmZXJfbmVlZHNfdmFsaWRhdGUoYmgpOwogCQkJYmgtPmJfZW5kX2lvID0gZW5kX2J1ZmZlcl9yZWFkX3N5bmM7CiAJCQlzdWJtaXRfYmgoUkVBRCwgYmgpOwogCQkJY29udGludWU7CkBAIC0zMjgsNiArMzQ0LDIwIEBACiAJCQkJYmhzW2ldID0gTlVMTDsKIAkJCQljb250aW51ZTsKIAkJCX0KKworCQkJaWYgKGJ1ZmZlcl9uZWVkc192YWxpZGF0ZShiaCkpIHsKKwkJCQkvKiBXZSBuZXZlciBzZXQgTmVlZHNWYWxpZGF0ZSBpZiB0aGUKKwkJCQkgKiBidWZmZXIgd2FzIGhlbGQgYnkgdGhlIGpvdXJuYWwsIHNvCisJCQkJICogdGhhdCBiZXR0ZXIgbm90IGhhdmUgY2hhbmdlZCAqLworCQkJCUJVR19PTihidWZmZXJfamJkKGJoKSk7CisJCQkJY2xlYXJfYnVmZmVyX25lZWRzX3ZhbGlkYXRlKGJoKTsKKwkJCQlzdGF0dXMgPSB2YWxpZGF0ZShpbm9kZS0+aV9zYiwgYmgpOworCQkJCWlmIChzdGF0dXMpIHsKKwkJCQkJcHV0X2JoKGJoKTsKKwkJCQkJYmhzW2ldID0gTlVMTDsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJfQogCQl9CiAKIAkJLyogQWx3YXlzIHNldCB0aGUgYnVmZmVyIGluIHRoZSBjYWNoZSwgZXZlbiBpZiBpdCB3YXMKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2J1ZmZlcl9oZWFkX2lvLmggYi9mcy9vY2ZzMi9idWZmZXJfaGVhZF9pby5oCmluZGV4IDc1ZTFkY2IuLmM3NWQ2ODIgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2J1ZmZlcl9oZWFkX2lvLmgKKysrIGIvZnMvb2NmczIvYnVmZmVyX2hlYWRfaW8uaApAQCAtMzEsMjEgKzMxLDI0IEBACiB2b2lkIG9jZnMyX2VuZF9idWZmZXJfaW9fc3luYyhzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLAogCQkJICAgICBpbnQgdXB0b2RhdGUpOwogCi1zdGF0aWMgaW5saW5lIGludCBvY2ZzMl9yZWFkX2Jsb2NrKHN0cnVjdCBpbm9kZQkgICAgICAgKmlub2RlLAotCQkJCSAgIHU2NCAgICAgICAgICAgICAgICAgIG9mZiwKLQkJCQkgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKipiaCk7Ci0KIGludCBvY2ZzMl93cml0ZV9ibG9jayhzdHJ1Y3Qgb2NmczJfc3VwZXIgICAgICAgICAgKm9zYiwKIAkJICAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICAqYmgsCiAJCSAgICAgIHN0cnVjdCBpbm9kZSAgICAgICAgKmlub2RlKTsKLWludCBvY2ZzMl9yZWFkX2Jsb2NrcyhzdHJ1Y3QgaW5vZGUJICAqaW5vZGUsCi0JCSAgICAgIHU2NCAgICAgICAgICAgICAgICAgIGJsb2NrLAotCQkgICAgICBpbnQgICAgICAgICAgICAgICAgICBuciwKLQkJICAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICAqYmhzW10sCi0JCSAgICAgIGludCAgICAgICAgICAgICAgICAgIGZsYWdzKTsKIGludCBvY2ZzMl9yZWFkX2Jsb2Nrc19zeW5jKHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiLCB1NjQgYmxvY2ssCiAJCQkgICB1bnNpZ25lZCBpbnQgbnIsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmhzW10pOwogCisvKgorICogSWYgbm90IE5VTEwsIHZhbGlkYXRlKCkgd2lsbCBiZSBjYWxsZWQgb24gYSBidWZmZXIgdGhhdCBpcyBmcmVzaGx5CisgKiByZWFkIGZyb20gZGlzay4gIEl0IHdpbGwgbm90IGJlIGNhbGxlZCBpZiB0aGUgYnVmZmVyIHdhcyBpbiBjYWNoZS4KKyAqIE5vdGUgdGhhdCBpZiB2YWxpZGF0ZSgpIGlzIGJlaW5nIHVzZWQgZm9yIHRoaXMgYnVmZmVyLCBpdCBuZWVkcyB0bworICogYmUgc2V0IGV2ZW4gZm9yIGEgUkVBREFIRUFEIGNhbGwsIGFzIGl0IG1hcmtzIHRoZSBidWZmZXIgZm9yIGxhdGVyCisgKiB2YWxpZGF0aW9uLgorICovCitpbnQgb2NmczJfcmVhZF9ibG9ja3Moc3RydWN0IGlub2RlICppbm9kZSwgdTY0IGJsb2NrLCBpbnQgbnIsCisJCSAgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmhzW10sIGludCBmbGFncywKKwkJICAgICAgaW50ICgqdmFsaWRhdGUpKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCQkJICAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkpOworCiBpbnQgb2NmczJfd3JpdGVfc3VwZXJfb3JfYmFja3VwKHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiLAogCQkJCXN0cnVjdCBidWZmZXJfaGVhZCAqYmgpOwogCkBAIC01Myw3ICs1Niw5IEBACiAjZGVmaW5lIE9DRlMyX0JIX1JFQURBSEVBRCAgICAgICAgIDgKIAogc3RhdGljIGlubGluZSBpbnQgb2NmczJfcmVhZF9ibG9jayhzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1NjQgb2ZmLAotCQkJCSAgIHN0cnVjdCBidWZmZXJfaGVhZCAqKmJoKQorCQkJCSAgIHN0cnVjdCBidWZmZXJfaGVhZCAqKmJoLAorCQkJCSAgIGludCAoKnZhbGlkYXRlKShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQkJCQkJICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkpCiB7CiAJaW50IHN0YXR1cyA9IDA7CiAKQEAgLTYzLDcgKzY4LDcgQEAKIAkJZ290byBiYWlsOwogCX0KIAotCXN0YXR1cyA9IG9jZnMyX3JlYWRfYmxvY2tzKGlub2RlLCBvZmYsIDEsIGJoLCAwKTsKKwlzdGF0dXMgPSBvY2ZzMl9yZWFkX2Jsb2Nrcyhpbm9kZSwgb2ZmLCAxLCBiaCwgMCwgdmFsaWRhdGUpOwogCiBiYWlsOgogCXJldHVybiBzdGF0dXM7CmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9jbHVzdGVyL2hlYXJ0YmVhdC5jIGIvZnMvb2NmczIvY2x1c3Rlci9oZWFydGJlYXQuYwppbmRleCA2ZWJhYTU4Li4wNDY5N2JhIDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9jbHVzdGVyL2hlYXJ0YmVhdC5jCisrKyBiL2ZzL29jZnMyL2NsdXN0ZXIvaGVhcnRiZWF0LmMKQEAgLTg1NCw3ICs4NTQsNyBAQAogCiAJd2hpbGUgKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkgJiYgIXJlZy0+aHJfdW5jbGVhbl9zdG9wKSB7CiAJCS8qIFdlIHRyYWNrIHRoZSB0aW1lIHNwZW50IGluc2lkZQotCQkgKiBvMmhiX2RvX2Rpc2tfaGVhcnRiZWF0IHNvIHRoYXQgd2UgYXZvaWQgbW9yZSB0aGVuCisJCSAqIG8yaGJfZG9fZGlza19oZWFydGJlYXQgc28gdGhhdCB3ZSBhdm9pZCBtb3JlIHRoYW4KIAkJICogaHJfdGltZW91dF9tcyBiZXR3ZWVuIGRpc2sgd3JpdGVzLiBPbiBidXN5IHN5c3RlbXMKIAkJICogdGhpcyBzaG91bGQgcmVzdWx0IGluIGEgaGVhcnRiZWF0IHdoaWNoIGlzIGxlc3MKIAkJICogbGlrZWx5IHRvIHRpbWUgaXRzZWxmIG91dC4gKi8KZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2NsdXN0ZXIvbWFza2xvZy5jIGIvZnMvb2NmczIvY2x1c3Rlci9tYXNrbG9nLmMKaW5kZXggZDhhMGNiOS4uOTZkZjU0MSAxMDA2NDQKLS0tIGEvZnMvb2NmczIvY2x1c3Rlci9tYXNrbG9nLmMKKysrIGIvZnMvb2NmczIvY2x1c3Rlci9tYXNrbG9nLmMKQEAgLTExMCw2ICsxMTAsNyBAQAogCWRlZmluZV9tYXNrKFFVT1JVTSksCiAJZGVmaW5lX21hc2soRVhQT1JUKSwKIAlkZWZpbmVfbWFzayhYQVRUUiksCisJZGVmaW5lX21hc2soUVVPVEEpLAogCWRlZmluZV9tYXNrKEVSUk9SKSwKIAlkZWZpbmVfbWFzayhOT1RJQ0UpLAogCWRlZmluZV9tYXNrKEtUSFJFQUQpLApkaWZmIC0tZ2l0IGEvZnMvb2NmczIvY2x1c3Rlci9tYXNrbG9nLmggYi9mcy9vY2ZzMi9jbHVzdGVyL21hc2tsb2cuaAppbmRleCA1NzY3MGM2Li43ZTcyYTgxIDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9jbHVzdGVyL21hc2tsb2cuaAorKysgYi9mcy9vY2ZzMi9jbHVzdGVyL21hc2tsb2cuaApAQCAtMTEzLDYgKzExMyw3IEBACiAjZGVmaW5lIE1MX1FVT1JVTQkweDAwMDAwMDAwMDgwMDAwMDBVTEwgLyogbmV0IGNvbm5lY3Rpb24gcXVvcnVtICovCiAjZGVmaW5lIE1MX0VYUE9SVAkweDAwMDAwMDAwMTAwMDAwMDBVTEwgLyogb2NmczIgZXhwb3J0IG9wZXJhdGlvbnMgKi8KICNkZWZpbmUgTUxfWEFUVFIJMHgwMDAwMDAwMDIwMDAwMDAwVUxMIC8qIG9jZnMyIGV4dGVuZGVkIGF0dHJpYnV0ZXMgKi8KKyNkZWZpbmUgTUxfUVVPVEEJMHgwMDAwMDAwMDQwMDAwMDAwVUxMIC8qIG9jZnMyIHF1b3RhIG9wZXJhdGlvbnMgKi8KIC8qIGJpdHMgdGhhdCBhcmUgaW5mcmVxdWVudGx5IGdpdmVuIGFuZCBmcmVxdWVudGx5IG1hdGNoZWQgaW4gdGhlIGhpZ2ggd29yZCAqLwogI2RlZmluZSBNTF9FUlJPUgkweDAwMDAwMDAxMDAwMDAwMDBVTEwgLyogc2VudCB0byBLRVJOX0VSUiAqLwogI2RlZmluZSBNTF9OT1RJQ0UJMHgwMDAwMDAwMjAwMDAwMDAwVUxMIC8qIHNldG4gdG8gS0VSTl9OT1RJQ0UgKi8KZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2Rpci5jIGIvZnMvb2NmczIvZGlyLmMKaW5kZXggMDI2ZTZlYi4uZjJjNDA5OCAxMDA2NDQKLS0tIGEvZnMvb2NmczIvZGlyLmMKKysrIGIvZnMvb2NmczIvZGlyLmMKQEAgLTQwLDYgKzQwLDcgQEAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CisjaW5jbHVkZSA8bGludXgvcXVvdGFvcHMuaD4KIAogI2RlZmluZSBNTE9HX01BU0tfUFJFRklYIE1MX05BTUVJCiAjaW5jbHVkZSA8Y2x1c3Rlci9tYXNrbG9nLmg+CkBAIC00Nyw2ICs0OCw3IEBACiAjaW5jbHVkZSAib2NmczIuaCIKIAogI2luY2x1ZGUgImFsbG9jLmgiCisjaW5jbHVkZSAiYmxvY2tjaGVjay5oIgogI2luY2x1ZGUgImRpci5oIgogI2luY2x1ZGUgImRsbWdsdWUuaCIKICNpbmNsdWRlICJleHRlbnRfbWFwLmgiCkBAIC04Miw0NyArODQsNzIgQEAKIAkJCSAgICAgICBzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqbWV0YV9hYywKIAkJCSAgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKipuZXdfYmgpOwogCi1zdGF0aWMgc3RydWN0IGJ1ZmZlcl9oZWFkICpvY2ZzMl9icmVhZChzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCQkJCSAgICAgICBpbnQgYmxvY2ssIGludCAqZXJyLCBpbnQgcmVhZGEpCisvKgorICogVGhlc2UgYXJlIGRpc3RpbmN0IGNoZWNrcyBiZWNhdXNlIGZ1dHVyZSB2ZXJzaW9ucyBvZiB0aGUgZmlsZSBzeXN0ZW0gd2lsbAorICogd2FudCB0byBoYXZlIGEgdHJhaWxpbmcgZGlyZW50IHN0cnVjdHVyZSBpbmRlcGVuZGVudCBvZiBpbmRleGluZy4KKyAqLworc3RhdGljIGludCBvY2ZzMl9kaXJfaGFzX3RyYWlsZXIoc3RydWN0IGlub2RlICpkaXIpCiB7Ci0Jc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IE5VTEw7Ci0JaW50IHRtcGVycjsKLQl1NjQgcF9ibGtubzsKLQlpbnQgcmVhZGZsYWdzID0gMDsKKwlpZiAoT0NGUzJfSShkaXIpLT5pcF9keW5fZmVhdHVyZXMgJiBPQ0ZTMl9JTkxJTkVfREFUQV9GTCkKKwkJcmV0dXJuIDA7CiAKLQlpZiAocmVhZGEpCi0JCXJlYWRmbGFncyB8PSBPQ0ZTMl9CSF9SRUFEQUhFQUQ7CisJcmV0dXJuIG9jZnMyX21ldGFfZWNjKE9DRlMyX1NCKGRpci0+aV9zYikpOworfQogCi0JaWYgKCgodTY0KWJsb2NrIDw8IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzKSA+PQotCSAgICBpX3NpemVfcmVhZChpbm9kZSkpIHsKLQkJQlVHX09OKCFyZWFkYSk7Ci0JCXJldHVybiBOVUxMOwotCX0KK3N0YXRpYyBpbnQgb2NmczJfc3VwcG9ydHNfZGlyX3RyYWlsZXIoc3RydWN0IG9jZnMyX3N1cGVyICpvc2IpCit7CisJcmV0dXJuIG9jZnMyX21ldGFfZWNjKG9zYik7Cit9CiAKLQlkb3duX3JlYWQoJk9DRlMyX0koaW5vZGUpLT5pcF9hbGxvY19zZW0pOwotCXRtcGVyciA9IG9jZnMyX2V4dGVudF9tYXBfZ2V0X2Jsb2Nrcyhpbm9kZSwgYmxvY2ssICZwX2Jsa25vLCBOVUxMLAotCQkJCQkgICAgIE5VTEwpOwotCXVwX3JlYWQoJk9DRlMyX0koaW5vZGUpLT5pcF9hbGxvY19zZW0pOwotCWlmICh0bXBlcnIgPCAwKSB7Ci0JCW1sb2dfZXJybm8odG1wZXJyKTsKLQkJZ290byBmYWlsOwotCX0KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IG9jZnMyX2Rpcl90cmFpbGVyX2Jsa19vZmYoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlyZXR1cm4gc2ItPnNfYmxvY2tzaXplIC0gc2l6ZW9mKHN0cnVjdCBvY2ZzMl9kaXJfYmxvY2tfdHJhaWxlcik7Cit9CiAKLQl0bXBlcnIgPSBvY2ZzMl9yZWFkX2Jsb2Nrcyhpbm9kZSwgcF9ibGtubywgMSwgJmJoLCByZWFkZmxhZ3MpOwotCWlmICh0bXBlcnIgPCAwKQotCQlnb3RvIGZhaWw7CisjZGVmaW5lIG9jZnMyX3RyYWlsZXJfZnJvbV9iaChfYmgsIF9zYikgKChzdHJ1Y3Qgb2NmczJfZGlyX2Jsb2NrX3RyYWlsZXIgKikgKChfYmgpLT5iX2RhdGEgKyBvY2ZzMl9kaXJfdHJhaWxlcl9ibGtfb2ZmKChfc2IpKSkpCiAKLQl0bXBlcnIgPSAwOworLyogWFhYIG9jZnMyX2Jsb2NrX2RxdHJhaWxlcigpIGlzIHNpbWlsYXIgYnV0IG5vdCBxdWl0ZSAtIGNhbiB3ZSBtYWtlCisgKiB0aGVtIG1vcmUgY29uc2lzdGVudD8gKi8KK3N0cnVjdCBvY2ZzMl9kaXJfYmxvY2tfdHJhaWxlciAqb2NmczJfZGlyX3RyYWlsZXJfZnJvbV9zaXplKGludCBibG9ja3NpemUsCisJCQkJCQkJICAgIHZvaWQgKmRhdGEpCit7CisJY2hhciAqcCA9IGRhdGE7CiAKLQkqZXJyID0gMDsKLQlyZXR1cm4gYmg7CisJcCArPSBibG9ja3NpemUgLSBzaXplb2Yoc3RydWN0IG9jZnMyX2Rpcl9ibG9ja190cmFpbGVyKTsKKwlyZXR1cm4gKHN0cnVjdCBvY2ZzMl9kaXJfYmxvY2tfdHJhaWxlciAqKXA7Cit9CiAKLWZhaWw6Ci0JYnJlbHNlKGJoKTsKLQliaCA9IE5VTEw7CisvKgorICogWFhYOiBUaGlzIGlzIGV4ZWN1dGVkIG9uY2Ugb24gZXZlcnkgZGlyZW50LiBXZSBzaG91bGQgY29uc2lkZXIgb3B0aW1pemluZworICogaXQuCisgKi8KK3N0YXRpYyBpbnQgb2NmczJfc2tpcF9kaXJfdHJhaWxlcihzdHJ1Y3QgaW5vZGUgKmRpciwKKwkJCQkgIHN0cnVjdCBvY2ZzMl9kaXJfZW50cnkgKmRlLAorCQkJCSAgdW5zaWduZWQgbG9uZyBvZmZzZXQsCisJCQkJICB1bnNpZ25lZCBsb25nIGJsa2xlbikKK3sKKwl1bnNpZ25lZCBsb25nIHRvZmYgPSBibGtsZW4gLSBzaXplb2Yoc3RydWN0IG9jZnMyX2Rpcl9ibG9ja190cmFpbGVyKTsKIAotCSplcnIgPSAtRUlPOwotCXJldHVybiBOVUxMOworCWlmICghb2NmczJfZGlyX2hhc190cmFpbGVyKGRpcikpCisJCXJldHVybiAwOworCisJaWYgKG9mZnNldCAhPSB0b2ZmKQorCQlyZXR1cm4gMDsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBvY2ZzMl9pbml0X2Rpcl90cmFpbGVyKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKK3sKKwlzdHJ1Y3Qgb2NmczJfZGlyX2Jsb2NrX3RyYWlsZXIgKnRyYWlsZXI7CisKKwl0cmFpbGVyID0gb2NmczJfdHJhaWxlcl9mcm9tX2JoKGJoLCBpbm9kZS0+aV9zYik7CisJc3RyY3B5KHRyYWlsZXItPmRiX3NpZ25hdHVyZSwgT0NGUzJfRElSX1RSQUlMRVJfU0lHTkFUVVJFKTsKKwl0cmFpbGVyLT5kYl9jb21wYXRfcmVjX2xlbiA9CisJCQljcHVfdG9fbGUxNihzaXplb2Yoc3RydWN0IG9jZnMyX2Rpcl9ibG9ja190cmFpbGVyKSk7CisJdHJhaWxlci0+ZGJfcGFyZW50X2Rpbm9kZSA9IGNwdV90b19sZTY0KE9DRlMyX0koaW5vZGUpLT5pcF9ibGtubyk7CisJdHJhaWxlci0+ZGJfYmxrbm8gPSBjcHVfdG9fbGU2NChiaC0+Yl9ibG9ja25yKTsKIH0KIAogLyoKQEAgLTIzMSw3ICsyNTgsNyBAQAogCXN0cnVjdCBvY2ZzMl9kaW5vZGUgKmRpOwogCXN0cnVjdCBvY2ZzMl9pbmxpbmVfZGF0YSAqZGF0YTsKIAotCXJldCA9IG9jZnMyX3JlYWRfYmxvY2soZGlyLCBPQ0ZTMl9JKGRpciktPmlwX2Jsa25vLCAmZGlfYmgpOworCXJldCA9IG9jZnMyX3JlYWRfaW5vZGVfYmxvY2soZGlyLCAmZGlfYmgpOwogCWlmIChyZXQpIHsKIAkJbWxvZ19lcnJubyhyZXQpOwogCQlnb3RvIG91dDsKQEAgLTI1MCw2ICsyNzcsMTA4IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKK3N0YXRpYyBpbnQgb2NmczJfdmFsaWRhdGVfZGlyX2Jsb2NrKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCQkJICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCit7CisJaW50IHJjOworCXN0cnVjdCBvY2ZzMl9kaXJfYmxvY2tfdHJhaWxlciAqdHJhaWxlciA9CisJCW9jZnMyX3RyYWlsZXJfZnJvbV9iaChiaCwgc2IpOworCisKKwkvKgorCSAqIFdlIGRvbid0IHZhbGlkYXRlIGRpcmVudHMgaGVyZSwgdGhhdCdzIGhhbmRsZWQKKwkgKiBpbi1wbGFjZSB3aGVuIHRoZSBjb2RlIHdhbGtzIHRoZW0uCisJICovCisJbWxvZygwLCAiVmFsaWRhdGluZyBkaXJibG9jayAlbGx1XG4iLAorCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyliaC0+Yl9ibG9ja25yKTsKKworCUJVR19PTighYnVmZmVyX3VwdG9kYXRlKGJoKSk7CisKKwkvKgorCSAqIElmIHRoZSBlY2MgZmFpbHMsIHdlIHJldHVybiB0aGUgZXJyb3IgYnV0IG90aGVyd2lzZQorCSAqIGxlYXZlIHRoZSBmaWxlc3lzdGVtIHJ1bm5pbmcuICBXZSBrbm93IGFueSBlcnJvciBpcworCSAqIGxvY2FsIHRvIHRoaXMgYmxvY2suCisJICoKKwkgKiBOb3RlIHRoYXQgd2UgYXJlIHNhZmUgdG8gY2FsbCB0aGlzIGV2ZW4gaWYgdGhlIGRpcmVjdG9yeQorCSAqIGRvZXNuJ3QgaGF2ZSBhIHRyYWlsZXIuICBGaWxlc3lzdGVtcyB3aXRob3V0IG1ldGFlY2Mgd2lsbCBkbworCSAqIG5vdGhpbmcsIGFuZCBmaWxlc3lzdGVtcyB3aXRoIGl0IHdpbGwgaGF2ZSBvbmUuCisJICovCisJcmMgPSBvY2ZzMl92YWxpZGF0ZV9tZXRhX2VjYyhzYiwgYmgtPmJfZGF0YSwgJnRyYWlsZXItPmRiX2NoZWNrKTsKKwlpZiAocmMpCisJCW1sb2coTUxfRVJST1IsICJDaGVja3N1bSBmYWlsZWQgZm9yIGRpbm9kZSAlbGx1XG4iLAorCQkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpYmgtPmJfYmxvY2tucik7CisKKwlyZXR1cm4gcmM7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGZvcmNlcyBhbGwgZXJyb3JzIHRvIC1FSU8gZm9yIGNvbnNpc3RlbmN5IHdpdGggaXRzCisgKiBwcmVkZWNlc3Nvciwgb2NmczJfYnJlYWQoKS4gIFdlIGhhdmVuJ3QgYXVkaXRlZCB3aGF0IHJldHVybmluZyB0aGUKKyAqIHJlYWwgZXJyb3IgY29kZXMgd291bGQgZG8gdG8gY2FsbGVycy4gIFdlIGxvZyB0aGUgcmVhbCBjb2RlcyB3aXRoCisgKiBtbG9nX2Vycm5vKCkgYmVmb3JlIHdlIHNxdWFzaCB0aGVtLgorICovCitzdGF0aWMgaW50IG9jZnMyX3JlYWRfZGlyX2Jsb2NrKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHU2NCB2X2Jsb2NrLAorCQkJCXN0cnVjdCBidWZmZXJfaGVhZCAqKmJoLCBpbnQgZmxhZ3MpCit7CisJaW50IHJjID0gMDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKnRtcCA9ICpiaDsKKwlzdHJ1Y3Qgb2NmczJfZGlyX2Jsb2NrX3RyYWlsZXIgKnRyYWlsZXI7CisKKwlyYyA9IG9jZnMyX3JlYWRfdmlydF9ibG9ja3MoaW5vZGUsIHZfYmxvY2ssIDEsICZ0bXAsIGZsYWdzLAorCQkJCSAgICBvY2ZzMl92YWxpZGF0ZV9kaXJfYmxvY2spOworCWlmIChyYykgeworCQltbG9nX2Vycm5vKHJjKTsKKwkJZ290byBvdXQ7CisJfQorCisJLyoKKwkgKiBXZSBjaGVjayB0aGUgdHJhaWxlciBoZXJlIHJhdGhlciB0aGFuIGluCisJICogb2NmczJfdmFsaWRhdGVfZGlyX2Jsb2NrKCkgYmVjYXVzZSB0aGF0IGZ1bmN0aW9uIGRvZXNuJ3QgaGF2ZQorCSAqIHRoZSBpbm9kZSB0byB0ZXN0LgorCSAqLworCWlmICghKGZsYWdzICYgT0NGUzJfQkhfUkVBREFIRUFEKSAmJgorCSAgICBvY2ZzMl9kaXJfaGFzX3RyYWlsZXIoaW5vZGUpKSB7CisJCXRyYWlsZXIgPSBvY2ZzMl90cmFpbGVyX2Zyb21fYmgodG1wLCBpbm9kZS0+aV9zYik7CisJCWlmICghT0NGUzJfSVNfVkFMSURfRElSX1RSQUlMRVIodHJhaWxlcikpIHsKKwkJCXJjID0gLUVJTlZBTDsKKwkJCW9jZnMyX2Vycm9yKGlub2RlLT5pX3NiLAorCQkJCSAgICAiSW52YWxpZCBkaXJibG9jayAjJWxsdTogIgorCQkJCSAgICAic2lnbmF0dXJlID0gJS4qc1xuIiwKKwkJCQkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyl0bXAtPmJfYmxvY2tuciwgNywKKwkJCQkgICAgdHJhaWxlci0+ZGJfc2lnbmF0dXJlKTsKKwkJCWdvdG8gb3V0OworCQl9CisJCWlmIChsZTY0X3RvX2NwdSh0cmFpbGVyLT5kYl9ibGtubykgIT0gdG1wLT5iX2Jsb2NrbnIpIHsKKwkJCXJjID0gLUVJTlZBTDsKKwkJCW9jZnMyX2Vycm9yKGlub2RlLT5pX3NiLAorCQkJCSAgICAiRGlyZWN0b3J5IGJsb2NrICMlbGx1IGhhcyBhbiBpbnZhbGlkICIKKwkJCQkgICAgImRiX2Jsa25vIG9mICVsbHUiLAorCQkJCSAgICAodW5zaWduZWQgbG9uZyBsb25nKXRtcC0+Yl9ibG9ja25yLAorCQkJCSAgICAodW5zaWduZWQgbG9uZyBsb25nKWxlNjRfdG9fY3B1KHRyYWlsZXItPmRiX2Jsa25vKSk7CisJCQlnb3RvIG91dDsKKwkJfQorCQlpZiAobGU2NF90b19jcHUodHJhaWxlci0+ZGJfcGFyZW50X2Rpbm9kZSkgIT0KKwkJICAgIE9DRlMyX0koaW5vZGUpLT5pcF9ibGtubykgeworCQkJcmMgPSAtRUlOVkFMOworCQkJb2NmczJfZXJyb3IoaW5vZGUtPmlfc2IsCisJCQkJICAgICJEaXJlY3RvcnkgYmxvY2sgIyVsbHUgb24gZGlub2RlICIKKwkJCQkgICAgIiMlbGx1IGhhcyBhbiBpbnZhbGlkIHBhcmVudF9kaW5vZGUgIgorCQkJCSAgICAib2YgJWxsdSIsCisJCQkJICAgICh1bnNpZ25lZCBsb25nIGxvbmcpdG1wLT5iX2Jsb2NrbnIsCisJCQkJICAgICh1bnNpZ25lZCBsb25nIGxvbmcpT0NGUzJfSShpbm9kZSktPmlwX2Jsa25vLAorCQkJCSAgICAodW5zaWduZWQgbG9uZyBsb25nKWxlNjRfdG9fY3B1KHRyYWlsZXItPmRiX2Jsa25vKSk7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworCS8qIElmIG9jZnMyX3JlYWRfdmlydF9ibG9ja3MoKSBnb3QgdXMgYSBuZXcgYmgsIHBhc3MgaXQgdXAuICovCisJaWYgKCEqYmgpCisJCSpiaCA9IHRtcDsKKworb3V0OgorCXJldHVybiByYyA/IC1FSU8gOiAwOworfQorCiBzdGF0aWMgc3RydWN0IGJ1ZmZlcl9oZWFkICpvY2ZzMl9maW5kX2VudHJ5X2VsKGNvbnN0IGNoYXIgKm5hbWUsIGludCBuYW1lbGVuLAogCQkJCQkgICAgICAgc3RydWN0IGlub2RlICpkaXIsCiAJCQkJCSAgICAgICBzdHJ1Y3Qgb2NmczJfZGlyX2VudHJ5ICoqcmVzX2RpcikKQEAgLTI5NiwxNSArNDI1LDE3IEBACiAJCQkJfQogCQkJCW51bSsrOwogCi0JCQkJYmggPSBvY2ZzMl9icmVhZChkaXIsIGIrKywgJmVyciwgMSk7CisJCQkJYmggPSBOVUxMOworCQkJCWVyciA9IG9jZnMyX3JlYWRfZGlyX2Jsb2NrKGRpciwgYisrLCAmYmgsCisJCQkJCQkJICAgT0NGUzJfQkhfUkVBREFIRUFEKTsKIAkJCQliaF91c2VbcmFfbWF4XSA9IGJoOwogCQkJfQogCQl9CiAJCWlmICgoYmggPSBiaF91c2VbcmFfcHRyKytdKSA9PSBOVUxMKQogCQkJZ290byBuZXh0OwotCQlpZiAob2NmczJfcmVhZF9ibG9jayhkaXIsIGJsb2NrLCAmYmgpKSB7CisJCWlmIChvY2ZzMl9yZWFkX2Rpcl9ibG9jayhkaXIsIGJsb2NrLCAmYmgsIDApKSB7CiAJCQkvKiByZWFkIGVycm9yLCBza2lwIGJsb2NrICYgaG9wZSBmb3IgdGhlIGJlc3QuCi0JCQkgKiBvY2ZzMl9yZWFkX2Jsb2NrKCkgaGFzIHJlbGVhc2VkIHRoZSBiaC4gKi8KKwkJCSAqIG9jZnMyX3JlYWRfZGlyX2Jsb2NrKCkgaGFzIHJlbGVhc2VkIHRoZSBiaC4gKi8KIAkJCW9jZnMyX2Vycm9yKGRpci0+aV9zYiwgInJlYWRpbmcgZGlyZWN0b3J5ICVsbHUsICIKIAkJCQkgICAgIm9mZnNldCAlbHVcbiIsCiAJCQkJICAgICh1bnNpZ25lZCBsb25nIGxvbmcpT0NGUzJfSShkaXIpLT5pcF9ibGtubywKQEAgLTM4MSwxNCArNTEyLDE4IEBACiAJCSAgICAgICBzdHJ1Y3QgaW5vZGUgKm5ld19lbnRyeV9pbm9kZSkKIHsKIAlpbnQgcmV0OworCW9jZnMyX2pvdXJuYWxfYWNjZXNzX2Z1bmMgYWNjZXNzID0gb2NmczJfam91cm5hbF9hY2Nlc3NfZGI7CiAKIAkvKgogCSAqIFRoZSBzYW1lIGNvZGUgd29ya3MgZmluZSBmb3IgYm90aCBpbmxpbmUtZGF0YSBhbmQgZXh0ZW50Ci0JICogYmFzZWQgZGlyZWN0b3JpZXMsIHNvIG5vIG5lZWQgdG8gc3BsaXQgdGhpcyB1cC4KKwkgKiBiYXNlZCBkaXJlY3Rvcmllcywgc28gbm8gbmVlZCB0byBzcGxpdCB0aGlzIHVwLiAgVGhlIG9ubHkKKwkgKiBkaWZmZXJlbmNlIGlzIHRoZSBqb3VybmFsX2FjY2VzcyBmdW5jdGlvbi4KIAkgKi8KIAotCXJldCA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgZGlyLCBkZV9iaCwKLQkJCQkgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CisJaWYgKE9DRlMyX0koZGlyKS0+aXBfZHluX2ZlYXR1cmVzICYgT0NGUzJfSU5MSU5FX0RBVEFfRkwpCisJCWFjY2VzcyA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzX2RpOworCisJcmV0ID0gYWNjZXNzKGhhbmRsZSwgZGlyLCBkZV9iaCwgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOwogCWlmIChyZXQpIHsKIAkJbWxvZ19lcnJubyhyZXQpOwogCQlnb3RvIG91dDsKQEAgLTQxMCw5ICs1NDUsMTMgQEAKIHsKIAlzdHJ1Y3Qgb2NmczJfZGlyX2VudHJ5ICpkZSwgKnBkZTsKIAlpbnQgaSwgc3RhdHVzID0gLUVOT0VOVDsKKwlvY2ZzMl9qb3VybmFsX2FjY2Vzc19mdW5jIGFjY2VzcyA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzX2RiOwogCiAJbWxvZ19lbnRyeSgiKDB4JXAsIDB4JXAsIDB4JXAsIDB4JXApXG4iLCBoYW5kbGUsIGRpciwgZGVfZGVsLCBiaCk7CiAKKwlpZiAoT0NGUzJfSShkaXIpLT5pcF9keW5fZmVhdHVyZXMgJiBPQ0ZTMl9JTkxJTkVfREFUQV9GTCkKKwkJYWNjZXNzID0gb2NmczJfam91cm5hbF9hY2Nlc3NfZGk7CisKIAlpID0gMDsKIAlwZGUgPSBOVUxMOwogCWRlID0gKHN0cnVjdCBvY2ZzMl9kaXJfZW50cnkgKikgZmlyc3RfZGU7CkBAIC00MjMsOCArNTYyLDggQEAKIAkJCWdvdG8gYmFpbDsKIAkJfQogCQlpZiAoZGUgPT0gZGVfZGVsKSAgewotCQkJc3RhdHVzID0gb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBkaXIsIGJoLAotCQkJCQkJICAgICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOworCQkJc3RhdHVzID0gYWNjZXNzKGhhbmRsZSwgZGlyLCBiaCwKKwkJCQkJT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOwogCQkJaWYgKHN0YXR1cyA8IDApIHsKIAkJCQlzdGF0dXMgPSAtRUlPOwogCQkJCW1sb2dfZXJybm8oc3RhdHVzKTsKQEAgLTQ1OCw3ICs1OTcsNyBAQAogCXN0cnVjdCBvY2ZzMl9kaW5vZGUgKmRpOwogCXN0cnVjdCBvY2ZzMl9pbmxpbmVfZGF0YSAqZGF0YTsKIAotCXJldCA9IG9jZnMyX3JlYWRfYmxvY2soZGlyLCBPQ0ZTMl9JKGRpciktPmlwX2Jsa25vLCAmZGlfYmgpOworCXJldCA9IG9jZnMyX3JlYWRfaW5vZGVfYmxvY2soZGlyLCAmZGlfYmgpOwogCWlmIChyZXQpIHsKIAkJbWxvZ19lcnJubyhyZXQpOwogCQlnb3RvIG91dDsKQEAgLTU3Niw2ICs3MTUsMTYgQEAKIAkJCWdvdG8gYmFpbDsKIAkJfQogCisJCS8qIFdlJ3JlIGd1YXJhbnRlZWQgdGhhdCB3ZSBzaG91bGQgaGF2ZSBzcGFjZSwgc28gd2UKKwkJICogY2FuJ3QgcG9zc2libHkgaGF2ZSBoaXQgdGhlIHRyYWlsZXIuLi5yaWdodD8gKi8KKwkJbWxvZ19idWdfb25fbXNnKG9jZnMyX3NraXBfZGlyX3RyYWlsZXIoZGlyLCBkZSwgb2Zmc2V0LCBzaXplKSwKKwkJCQkiSGl0IGRpciB0cmFpbGVyIHRyeWluZyB0byBpbnNlcnQgJS4qcyAiCisJCQkgICAgICAgICIobmFtZWxlbiAlZCkgaW50byBkaXJlY3RvcnkgJWxsdS4gICIKKwkJCQkib2Zmc2V0IGlzICVsdSwgdHJhaWxlciBvZmZzZXQgaXMgJWRcbiIsCisJCQkJbmFtZWxlbiwgbmFtZSwgbmFtZWxlbiwKKwkJCQkodW5zaWduZWQgbG9uZyBsb25nKXBhcmVudF9mZV9iaC0+Yl9ibG9ja25yLAorCQkJCW9mZnNldCwgb2NmczJfZGlyX3RyYWlsZXJfYmxrX29mZihkaXItPmlfc2IpKTsKKwogCQlpZiAob2NmczJfZGlyZW50X3dvdWxkX2ZpdChkZSwgcmVjX2xlbikpIHsKIAkJCWRpci0+aV9tdGltZSA9IGRpci0+aV9jdGltZSA9IENVUlJFTlRfVElNRTsKIAkJCXJldHZhbCA9IG9jZnMyX21hcmtfaW5vZGVfZGlydHkoaGFuZGxlLCBkaXIsIHBhcmVudF9mZV9iaCk7CkBAIC01ODQsOCArNzMzLDE0IEBACiAJCQkJZ290byBiYWlsOwogCQkJfQogCi0JCQlzdGF0dXMgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGRpciwgaW5zZXJ0X2JoLAotCQkJCQkJICAgICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOworCQkJaWYgKGluc2VydF9iaCA9PSBwYXJlbnRfZmVfYmgpCisJCQkJc3RhdHVzID0gb2NmczJfam91cm5hbF9hY2Nlc3NfZGkoaGFuZGxlLCBkaXIsCisJCQkJCQkJCSBpbnNlcnRfYmgsCisJCQkJCQkJCSBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CisJCQllbHNlCisJCQkJc3RhdHVzID0gb2NmczJfam91cm5hbF9hY2Nlc3NfZGIoaGFuZGxlLCBkaXIsCisJCQkJCQkJCSBpbnNlcnRfYmgsCisJCQkJCQkJCSBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CiAJCQkvKiBCeSBub3cgdGhlIGJ1ZmZlciBpcyBtYXJrZWQgZm9yIGpvdXJuYWxpbmcgKi8KIAkJCW9mZnNldCArPSBsZTE2X3RvX2NwdShkZS0+cmVjX2xlbik7CiAJCQlpZiAobGU2NF90b19jcHUoZGUtPmlub2RlKSkgewpAQCAtNjExLDYgKzc2Niw3IEBACiAJCQlyZXR2YWwgPSAwOwogCQkJZ290byBiYWlsOwogCQl9CisKIAkJb2Zmc2V0ICs9IGxlMTZfdG9fY3B1KGRlLT5yZWNfbGVuKTsKIAkJZGUgPSAoc3RydWN0IG9jZnMyX2Rpcl9lbnRyeSAqKSAoKGNoYXIgKikgZGUgKyBsZTE2X3RvX2NwdShkZS0+cmVjX2xlbikpOwogCX0KQEAgLTYzNiw3ICs3OTIsNyBAQAogCXN0cnVjdCBvY2ZzMl9pbmxpbmVfZGF0YSAqZGF0YTsKIAlzdHJ1Y3Qgb2NmczJfZGlyX2VudHJ5ICpkZTsKIAotCXJldCA9IG9jZnMyX3JlYWRfYmxvY2soaW5vZGUsIE9DRlMyX0koaW5vZGUpLT5pcF9ibGtubywgJmRpX2JoKTsKKwlyZXQgPSBvY2ZzMl9yZWFkX2lub2RlX2Jsb2NrKGlub2RlLCAmZGlfYmgpOwogCWlmIChyZXQpIHsKIAkJbWxvZyhNTF9FUlJPUiwgIlVuYWJsZSB0byByZWFkIGlub2RlIGJsb2NrIGZvciBkaXIgJWxsdVxuIiwKIAkJICAgICAodW5zaWduZWQgbG9uZyBsb25nKU9DRlMyX0koaW5vZGUpLT5pcF9ibGtubyk7CkBAIC03MjQsNyArODgwLDYgQEAKIAlpbnQgaSwgc3RvcmVkOwogCXN0cnVjdCBidWZmZXJfaGVhZCAqIGJoLCAqIHRtcDsKIAlzdHJ1Y3Qgb2NmczJfZGlyX2VudHJ5ICogZGU7Ci0JaW50IGVycjsKIAlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYiA9IGlub2RlLT5pX3NiOwogCXVuc2lnbmVkIGludCByYV9zZWN0b3JzID0gMTY7CiAKQEAgLTczNSwxMiArODkwLDggQEAKIAogCXdoaWxlICghZXJyb3IgJiYgIXN0b3JlZCAmJiAqZl9wb3MgPCBpX3NpemVfcmVhZChpbm9kZSkpIHsKIAkJYmxrID0gKCpmX3BvcykgPj4gc2ItPnNfYmxvY2tzaXplX2JpdHM7Ci0JCWJoID0gb2NmczJfYnJlYWQoaW5vZGUsIGJsaywgJmVyciwgMCk7Ci0JCWlmICghYmgpIHsKLQkJCW1sb2coTUxfRVJST1IsCi0JCQkgICAgICJkaXJlY3RvcnkgIyVsbHUgY29udGFpbnMgYSBob2xlIGF0IG9mZnNldCAlbGxkXG4iLAotCQkJICAgICAodW5zaWduZWQgbG9uZyBsb25nKU9DRlMyX0koaW5vZGUpLT5pcF9ibGtubywKLQkJCSAgICAgKmZfcG9zKTsKKwkJaWYgKG9jZnMyX3JlYWRfZGlyX2Jsb2NrKGlub2RlLCBibGssICZiaCwgMCkpIHsKKwkJCS8qIFNraXAgdGhlIGNvcnJ1cHQgZGlyYmxvY2sgYW5kIGtlZXAgdHJ5aW5nICovCiAJCQkqZl9wb3MgKz0gc2ItPnNfYmxvY2tzaXplIC0gb2Zmc2V0OwogCQkJY29udGludWU7CiAJCX0KQEAgLTc1NCw4ICs5MDUsMTAgQEAKIAkJICAgIHx8ICgoKGxhc3RfcmFfYmxrIC0gYmxrKSA8PCA5KSA8PSAocmFfc2VjdG9ycyAvIDIpKSkgewogCQkJZm9yIChpID0gcmFfc2VjdG9ycyA+PiAoc2ItPnNfYmxvY2tzaXplX2JpdHMgLSA5KTsKIAkJCSAgICAgaSA+IDA7IGktLSkgewotCQkJCXRtcCA9IG9jZnMyX2JyZWFkKGlub2RlLCArK2JsaywgJmVyciwgMSk7Ci0JCQkJYnJlbHNlKHRtcCk7CisJCQkJdG1wID0gTlVMTDsKKwkJCQlpZiAoIW9jZnMyX3JlYWRfZGlyX2Jsb2NrKGlub2RlLCArK2JsaywgJnRtcCwKKwkJCQkJCQkgIE9DRlMyX0JIX1JFQURBSEVBRCkpCisJCQkJCWJyZWxzZSh0bXApOwogCQkJfQogCQkJbGFzdF9yYV9ibGsgPSBibGs7CiAJCQlyYV9zZWN0b3JzID0gODsKQEAgLTgyOCw2ICs5ODEsNyBAQAogCQl9CiAJCW9mZnNldCA9IDA7CiAJCWJyZWxzZShiaCk7CisJCWJoID0gTlVMTDsKIAl9CiAKIAlzdG9yZWQgPSAwOwpAQCAtMTA1MCw5ICsxMjA0LDE1IEBACiAJcmV0dXJuICFwcml2LnNlZW5fb3RoZXI7CiB9CiAKLXN0YXRpYyB2b2lkIG9jZnMyX2ZpbGxfaW5pdGlhbF9kaXJlbnRzKHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCQkJICAgICAgIHN0cnVjdCBpbm9kZSAqcGFyZW50LAotCQkJCSAgICAgICBjaGFyICpzdGFydCwgdW5zaWduZWQgaW50IHNpemUpCisvKgorICogRmlsbHMgIi4iIGFuZCAiLi4iIGRpcmVudHMgaW4gYSBuZXcgZGlyZWN0b3J5IGJsb2NrLiBSZXR1cm5zIGRpcmVudCBmb3IKKyAqICIuLiIsIHdoaWNoIG1pZ2h0IGJlIHVzZWQgZHVyaW5nIGNyZWF0aW9uIG9mIGEgZGlyZWN0b3J5IHdpdGggYSB0cmFpbGluZworICogaGVhZGVyLiBJdCBpcyBvdGhlcndpc2Ugc2FmZSB0byBpZ25vcmUgdGhlIHJldHVybiBjb2RlLgorICovCitzdGF0aWMgc3RydWN0IG9jZnMyX2Rpcl9lbnRyeSAqb2NmczJfZmlsbF9pbml0aWFsX2RpcmVudHMoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkJCQkgIHN0cnVjdCBpbm9kZSAqcGFyZW50LAorCQkJCQkJCSAgY2hhciAqc3RhcnQsCisJCQkJCQkJICB1bnNpZ25lZCBpbnQgc2l6ZSkKIHsKIAlzdHJ1Y3Qgb2NmczJfZGlyX2VudHJ5ICpkZSA9IChzdHJ1Y3Qgb2NmczJfZGlyX2VudHJ5ICopc3RhcnQ7CiAKQEAgLTEwNjksNiArMTIyOSw4IEBACiAJZGUtPm5hbWVfbGVuID0gMjsKIAlzdHJjcHkoZGUtPm5hbWUsICIuLiIpOwogCW9jZnMyX3NldF9kZV90eXBlKGRlLCBTX0lGRElSKTsKKworCXJldHVybiBkZTsKIH0KIAogLyoKQEAgLTEwODYsOCArMTI0OCw4IEBACiAJc3RydWN0IG9jZnMyX2lubGluZV9kYXRhICpkYXRhID0gJmRpLT5pZDIuaV9kYXRhOwogCXVuc2lnbmVkIGludCBzaXplID0gbGUxNl90b19jcHUoZGF0YS0+aWRfY291bnQpOwogCi0JcmV0ID0gb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwgZGlfYmgsCi0JCQkJICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOworCXJldCA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzX2RpKGhhbmRsZSwgaW5vZGUsIGRpX2JoLAorCQkJCSAgICAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKIAlpZiAocmV0KSB7CiAJCW1sb2dfZXJybm8ocmV0KTsKIAkJZ290byBvdXQ7CkBAIC0xMTIxLDEwICsxMjgzLDE1IEBACiAJCQkJIHN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICpkYXRhX2FjKQogewogCWludCBzdGF0dXM7CisJdW5zaWduZWQgaW50IHNpemUgPSBvc2ItPnNiLT5zX2Jsb2Nrc2l6ZTsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKm5ld19iaCA9IE5VTEw7CisJc3RydWN0IG9jZnMyX2Rpcl9lbnRyeSAqZGU7CiAKIAltbG9nX2VudHJ5X3ZvaWQoKTsKIAorCWlmIChvY2ZzMl9zdXBwb3J0c19kaXJfdHJhaWxlcihvc2IpKQorCQlzaXplID0gb2NmczJfZGlyX3RyYWlsZXJfYmxrX29mZihwYXJlbnQtPmlfc2IpOworCiAJc3RhdHVzID0gb2NmczJfZG9fZXh0ZW5kX2Rpcihvc2ItPnNiLCBoYW5kbGUsIGlub2RlLCBmZV9iaCwKIAkJCQkgICAgIGRhdGFfYWMsIE5VTEwsICZuZXdfYmgpOwogCWlmIChzdGF0dXMgPCAwKSB7CkBAIC0xMTM0LDE2ICsxMzAxLDE3IEBACiAKIAlvY2ZzMl9zZXRfbmV3X2J1ZmZlcl91cHRvZGF0ZShpbm9kZSwgbmV3X2JoKTsKIAotCXN0YXR1cyA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgaW5vZGUsIG5ld19iaCwKLQkJCQkgICAgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19DUkVBVEUpOworCXN0YXR1cyA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzX2RiKGhhbmRsZSwgaW5vZGUsIG5ld19iaCwKKwkJCQkJIE9DRlMyX0pPVVJOQUxfQUNDRVNTX0NSRUFURSk7CiAJaWYgKHN0YXR1cyA8IDApIHsKIAkJbWxvZ19lcnJubyhzdGF0dXMpOwogCQlnb3RvIGJhaWw7CiAJfQogCW1lbXNldChuZXdfYmgtPmJfZGF0YSwgMCwgb3NiLT5zYi0+c19ibG9ja3NpemUpOwogCi0Jb2NmczJfZmlsbF9pbml0aWFsX2RpcmVudHMoaW5vZGUsIHBhcmVudCwgbmV3X2JoLT5iX2RhdGEsCi0JCQkJICAgb3NiLT5zYi0+c19ibG9ja3NpemUpOworCWRlID0gb2NmczJfZmlsbF9pbml0aWFsX2RpcmVudHMoaW5vZGUsIHBhcmVudCwgbmV3X2JoLT5iX2RhdGEsIHNpemUpOworCWlmIChvY2ZzMl9zdXBwb3J0c19kaXJfdHJhaWxlcihvc2IpKQorCQlvY2ZzMl9pbml0X2Rpcl90cmFpbGVyKGlub2RlLCBuZXdfYmgpOwogCiAJc3RhdHVzID0gb2NmczJfam91cm5hbF9kaXJ0eShoYW5kbGUsIG5ld19iaCk7CiAJaWYgKHN0YXR1cyA8IDApIHsKQEAgLTExODQsMTMgKzEzNTIsMjcgQEAKIAkJCQkgICAgIGRhdGFfYWMpOwogfQogCisvKgorICogRXhwYW5kIHJlY19sZW4gb2YgdGhlIHJpZ2h0bW9zdCBkaXJlbnQgaW4gYSBkaXJlY3RvcnkgYmxvY2sgc28gdGhhdCBpdAorICogY29udGFpbnMgdGhlIGVuZCBvZiBvdXIgdmFsaWQgc3BhY2UgZm9yIGRpcmVudHMuIFdlIGRvIHRoaXMgZHVyaW5nCisgKiBleHBhbnNpb24gZnJvbSBhbiBpbmxpbmUgZGlyZWN0b3J5IHRvIG9uZSB3aXRoIGV4dGVudHMuIFRoZSBmaXJzdCBkaXIgYmxvY2sKKyAqIGluIHRoYXQgY2FzZSBpcyB0YWtlbiBmcm9tIHRoZSBpbmxpbmUgZGF0YSBwb3J0aW9uIG9mIHRoZSBpbm9kZSBibG9jay4KKyAqCisgKiBXZSBhZGQgdGhlIGRpciB0cmFpbGVyIGlmIHRoaXMgZmlsZXN5c3RlbSB3YW50cyBpdC4KKyAqLwogc3RhdGljIHZvaWQgb2NmczJfZXhwYW5kX2xhc3RfZGlyZW50KGNoYXIgKnN0YXJ0LCB1bnNpZ25lZCBpbnQgb2xkX3NpemUsCi0JCQkJICAgICB1bnNpZ25lZCBpbnQgbmV3X3NpemUpCisJCQkJICAgICBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQogewogCXN0cnVjdCBvY2ZzMl9kaXJfZW50cnkgKmRlOwogCXN0cnVjdCBvY2ZzMl9kaXJfZW50cnkgKnByZXZfZGU7CiAJY2hhciAqZGVfYnVmLCAqbGltaXQ7Ci0JdW5zaWduZWQgaW50IGJ5dGVzID0gbmV3X3NpemUgLSBvbGRfc2l6ZTsKKwl1bnNpZ25lZCBpbnQgbmV3X3NpemUgPSBzYi0+c19ibG9ja3NpemU7CisJdW5zaWduZWQgaW50IGJ5dGVzOworCisJaWYgKG9jZnMyX3N1cHBvcnRzX2Rpcl90cmFpbGVyKE9DRlMyX1NCKHNiKSkpCisJCW5ld19zaXplID0gb2NmczJfZGlyX3RyYWlsZXJfYmxrX29mZihzYik7CisKKwlieXRlcyA9IG5ld19zaXplIC0gb2xkX3NpemU7CiAKIAlsaW1pdCA9IHN0YXJ0ICsgb2xkX3NpemU7CiAJZGVfYnVmID0gc3RhcnQ7CkBAIC0xMjE2LDkgKzEzOTgsOSBAQAogCQkJCSAgIHVuc2lnbmVkIGludCBibG9ja3Nfd2FudGVkLAogCQkJCSAgIHN0cnVjdCBidWZmZXJfaGVhZCAqKmZpcnN0X2Jsb2NrX2JoKQogewotCWludCByZXQsIGNyZWRpdHMgPSBPQ0ZTMl9JTkxJTkVfVE9fRVhURU5UU19DUkVESVRTOwogCXUzMiBhbGxvYywgYml0X29mZiwgbGVuOwogCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBkaXItPmlfc2I7CisJaW50IHJldCwgY3JlZGl0cyA9IG9jZnMyX2lubGluZV90b19leHRlbnRzX2NyZWRpdHMoc2IpOwogCXU2NCBibGtubywgYnl0ZXMgPSBibG9ja3Nfd2FudGVkIDw8IHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzOwogCXN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiID0gT0NGUzJfU0IoZGlyLT5pX3NiKTsKIAlzdHJ1Y3Qgb2NmczJfaW5vZGVfaW5mbyAqb2kgPSBPQ0ZTMl9JKGRpcik7CkBAIC0xMjI3LDYgKzE0MDksNyBAQAogCXN0cnVjdCBvY2ZzMl9kaW5vZGUgKmRpID0gKHN0cnVjdCBvY2ZzMl9kaW5vZGUgKilkaV9iaC0+Yl9kYXRhOwogCWhhbmRsZV90ICpoYW5kbGU7CiAJc3RydWN0IG9jZnMyX2V4dGVudF90cmVlIGV0OworCWludCBkaWRfcXVvdGEgPSAwOwogCiAJb2NmczJfaW5pdF9kaW5vZGVfZXh0ZW50X3RyZWUoJmV0LCBkaXIsIGRpX2JoKTsKIApAQCAtMTI2NCw2ICsxNDQ3LDEyIEBACiAJCWdvdG8gb3V0X3NlbTsKIAl9CiAKKwlpZiAodmZzX2RxX2FsbG9jX3NwYWNlX25vZGlydHkoZGlyLAorCQkJCW9jZnMyX2NsdXN0ZXJzX3RvX2J5dGVzKG9zYi0+c2IsIGFsbG9jKSkpIHsKKwkJcmV0ID0gLUVEUVVPVDsKKwkJZ290byBvdXRfY29tbWl0OworCX0KKwlkaWRfcXVvdGEgPSAxOwogCS8qCiAJICogVHJ5IHRvIGNsYWltIGFzIG1hbnkgY2x1c3RlcnMgYXMgdGhlIGJpdG1hcCBjYW4gZ2l2ZSB0aG91Z2gKIAkgKiBpZiB3ZSBvbmx5IGdldCBvbmUgbm93LCB0aGF0J3MgZW5vdWdoIHRvIGNvbnRpbnVlLiBUaGUgcmVzdApAQCAtMTI5MCw4ICsxNDc5LDggQEAKIAogCW9jZnMyX3NldF9uZXdfYnVmZmVyX3VwdG9kYXRlKGRpciwgZGlyZGF0YV9iaCk7CiAKLQlyZXQgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGRpciwgZGlyZGF0YV9iaCwKLQkJCQkgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19DUkVBVEUpOworCXJldCA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzX2RiKGhhbmRsZSwgZGlyLCBkaXJkYXRhX2JoLAorCQkJCSAgICAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX0NSRUFURSk7CiAJaWYgKHJldCkgewogCQltbG9nX2Vycm5vKHJldCk7CiAJCWdvdG8gb3V0X2NvbW1pdDsKQEAgLTEzMDAsOCArMTQ4OSw5IEBACiAJbWVtY3B5KGRpcmRhdGFfYmgtPmJfZGF0YSwgZGktPmlkMi5pX2RhdGEuaWRfZGF0YSwgaV9zaXplX3JlYWQoZGlyKSk7CiAJbWVtc2V0KGRpcmRhdGFfYmgtPmJfZGF0YSArIGlfc2l6ZV9yZWFkKGRpciksIDAsCiAJICAgICAgIHNiLT5zX2Jsb2Nrc2l6ZSAtIGlfc2l6ZV9yZWFkKGRpcikpOwotCW9jZnMyX2V4cGFuZF9sYXN0X2RpcmVudChkaXJkYXRhX2JoLT5iX2RhdGEsIGlfc2l6ZV9yZWFkKGRpciksCi0JCQkJIHNiLT5zX2Jsb2Nrc2l6ZSk7CisJb2NmczJfZXhwYW5kX2xhc3RfZGlyZW50KGRpcmRhdGFfYmgtPmJfZGF0YSwgaV9zaXplX3JlYWQoZGlyKSwgc2IpOworCWlmIChvY2ZzMl9zdXBwb3J0c19kaXJfdHJhaWxlcihvc2IpKQorCQlvY2ZzMl9pbml0X2Rpcl90cmFpbGVyKGRpciwgZGlyZGF0YV9iaCk7CiAKIAlyZXQgPSBvY2ZzMl9qb3VybmFsX2RpcnR5KGhhbmRsZSwgZGlyZGF0YV9iaCk7CiAJaWYgKHJldCkgewpAQCAtMTMxNyw4ICsxNTA3LDggQEAKIAkgKiBXZSBsZXQgdGhlIGxhdGVyIGRpcmVudCBpbnNlcnQgbW9kaWZ5IGMvbXRpbWUgLSB0byB0aGUgdXNlcgogCSAqIHRoZSBkYXRhIGhhc24ndCBjaGFuZ2VkLgogCSAqLwotCXJldCA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgZGlyLCBkaV9iaCwKLQkJCQkgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19DUkVBVEUpOworCXJldCA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzX2RpKGhhbmRsZSwgZGlyLCBkaV9iaCwKKwkJCQkgICAgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19DUkVBVEUpOwogCWlmIChyZXQpIHsKIAkJbWxvZ19lcnJubyhyZXQpOwogCQlnb3RvIG91dF9jb21taXQ7CkBAIC0xMzg2LDYgKzE1NzYsOSBAQAogCWRpcmRhdGFfYmggPSBOVUxMOwogCiBvdXRfY29tbWl0OgorCWlmIChyZXQgPCAwICYmIGRpZF9xdW90YSkKKwkJdmZzX2RxX2ZyZWVfc3BhY2Vfbm9kaXJ0eShkaXIsCisJCQlvY2ZzMl9jbHVzdGVyc190b19ieXRlcyhvc2ItPnNiLCAyKSk7CiAJb2NmczJfY29tbWl0X3RyYW5zKG9zYiwgaGFuZGxlKTsKIAogb3V0X3NlbToKQEAgLTE0MTAsNyArMTYwMyw3IEBACiAJCQkgICAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICoqbmV3X2JoKQogewogCWludCBzdGF0dXM7Ci0JaW50IGV4dGVuZDsKKwlpbnQgZXh0ZW5kLCBkaWRfcXVvdGEgPSAwOwogCXU2NCBwX2Jsa25vLCB2X2Jsa25vOwogCiAJc3Bpbl9sb2NrKCZPQ0ZTMl9JKGRpciktPmlwX2xvY2spOwpAQCAtMTQyMCw2ICsxNjEzLDEzIEBACiAJaWYgKGV4dGVuZCkgewogCQl1MzIgb2Zmc2V0ID0gT0NGUzJfSShkaXIpLT5pcF9jbHVzdGVyczsKIAorCQlpZiAodmZzX2RxX2FsbG9jX3NwYWNlX25vZGlydHkoZGlyLAorCQkJCQlvY2ZzMl9jbHVzdGVyc190b19ieXRlcyhzYiwgMSkpKSB7CisJCQlzdGF0dXMgPSAtRURRVU9UOworCQkJZ290byBiYWlsOworCQl9CisJCWRpZF9xdW90YSA9IDE7CisKIAkJc3RhdHVzID0gb2NmczJfYWRkX2lub2RlX2RhdGEoT0NGUzJfU0Ioc2IpLCBkaXIsICZvZmZzZXQsCiAJCQkJCSAgICAgIDEsIDAsIHBhcmVudF9mZV9iaCwgaGFuZGxlLAogCQkJCQkgICAgICBkYXRhX2FjLCBtZXRhX2FjLCBOVUxMKTsKQEAgLTE0NDUsNiArMTY0NSw4IEBACiAJfQogCXN0YXR1cyA9IDA7CiBiYWlsOgorCWlmIChkaWRfcXVvdGEgJiYgc3RhdHVzIDwgMCkKKwkJdmZzX2RxX2ZyZWVfc3BhY2Vfbm9kaXJ0eShkaXIsIG9jZnMyX2NsdXN0ZXJzX3RvX2J5dGVzKHNiLCAxKSk7CiAJbWxvZ19leGl0KHN0YXR1cyk7CiAJcmV0dXJuIHN0YXR1czsKIH0KQEAgLTE1NjksMTYgKzE3NzEsMjIgQEAKIAogCW9jZnMyX3NldF9uZXdfYnVmZmVyX3VwdG9kYXRlKGRpciwgbmV3X2JoKTsKIAotCXN0YXR1cyA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgZGlyLCBuZXdfYmgsCi0JCQkJICAgICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfQ1JFQVRFKTsKKwlzdGF0dXMgPSBvY2ZzMl9qb3VybmFsX2FjY2Vzc19kYihoYW5kbGUsIGRpciwgbmV3X2JoLAorCQkJCQkgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfQ1JFQVRFKTsKIAlpZiAoc3RhdHVzIDwgMCkgewogCQltbG9nX2Vycm5vKHN0YXR1cyk7CiAJCWdvdG8gYmFpbDsKIAl9CiAJbWVtc2V0KG5ld19iaC0+Yl9kYXRhLCAwLCBzYi0+c19ibG9ja3NpemUpOworCiAJZGUgPSAoc3RydWN0IG9jZnMyX2Rpcl9lbnRyeSAqKSBuZXdfYmgtPmJfZGF0YTsKIAlkZS0+aW5vZGUgPSAwOwotCWRlLT5yZWNfbGVuID0gY3B1X3RvX2xlMTYoc2ItPnNfYmxvY2tzaXplKTsKKwlpZiAob2NmczJfZGlyX2hhc190cmFpbGVyKGRpcikpIHsKKwkJZGUtPnJlY19sZW4gPSBjcHVfdG9fbGUxNihvY2ZzMl9kaXJfdHJhaWxlcl9ibGtfb2ZmKHNiKSk7CisJCW9jZnMyX2luaXRfZGlyX3RyYWlsZXIoZGlyLCBuZXdfYmgpOworCX0gZWxzZSB7CisJCWRlLT5yZWNfbGVuID0gY3B1X3RvX2xlMTYoc2ItPnNfYmxvY2tzaXplKTsKKwl9CiAJc3RhdHVzID0gb2NmczJfam91cm5hbF9kaXJ0eShoYW5kbGUsIG5ld19iaCk7CiAJaWYgKHN0YXR1cyA8IDApIHsKIAkJbWxvZ19lcnJubyhzdGF0dXMpOwpAQCAtMTYyMCwxMSArMTgyOCwyMSBAQAogCQkJCSAgIHVuc2lnbmVkIGludCAqYmxvY2tzX3dhbnRlZCkKIHsKIAlpbnQgcmV0OworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBkaXItPmlfc2I7CiAJc3RydWN0IG9jZnMyX2Rpbm9kZSAqZGkgPSAoc3RydWN0IG9jZnMyX2Rpbm9kZSAqKWRpX2JoLT5iX2RhdGE7CiAJc3RydWN0IG9jZnMyX2Rpcl9lbnRyeSAqZGUsICpsYXN0X2RlID0gTlVMTDsKIAljaGFyICpkZV9idWYsICpsaW1pdDsKIAl1bnNpZ25lZCBsb25nIG9mZnNldCA9IDA7Ci0JdW5zaWduZWQgaW50IHJlY19sZW4sIG5ld19yZWNfbGVuOworCXVuc2lnbmVkIGludCByZWNfbGVuLCBuZXdfcmVjX2xlbiwgZnJlZV9zcGFjZSA9IGRpci0+aV9zYi0+c19ibG9ja3NpemU7CisKKwkvKgorCSAqIFRoaXMgY2FsY3VsYXRlcyBob3cgbWFueSBmcmVlIGJ5dGVzIHdlJ2QgaGF2ZSBpbiBibG9jayB6ZXJvLCBzaG91bGQKKwkgKiB0aGlzIGZ1bmN0aW9uIGZvcmNlIGV4cGFuc2lvbiB0byBhbiBleHRlbnQgdHJlZS4KKwkgKi8KKwlpZiAob2NmczJfc3VwcG9ydHNfZGlyX3RyYWlsZXIoT0NGUzJfU0Ioc2IpKSkKKwkJZnJlZV9zcGFjZSA9IG9jZnMyX2Rpcl90cmFpbGVyX2Jsa19vZmYoc2IpIC0gaV9zaXplX3JlYWQoZGlyKTsKKwllbHNlCisJCWZyZWVfc3BhY2UgPSBkaXItPmlfc2ItPnNfYmxvY2tzaXplIC0gaV9zaXplX3JlYWQoZGlyKTsKIAogCWRlX2J1ZiA9IGRpLT5pZDIuaV9kYXRhLmlkX2RhdGE7CiAJbGltaXQgPSBkZV9idWYgKyBpX3NpemVfcmVhZChkaXIpOwpAQCAtMTY0MSw2ICsxODU5LDExIEBACiAJCQlyZXQgPSAtRUVYSVNUOwogCQkJZ290byBvdXQ7CiAJCX0KKwkJLyoKKwkJICogTm8gbmVlZCB0byBjaGVjayBmb3IgYSB0cmFpbGluZyBkaXJlbnQgcmVjb3JkIGhlcmUgYXMKKwkJICogdGhleSdyZSBub3QgdXNlZCBmb3IgaW5saW5lIGRpcnMuCisJCSAqLworCiAJCWlmIChvY2ZzMl9kaXJlbnRfd291bGRfZml0KGRlLCByZWNfbGVuKSkgewogCQkJLyogT2ssIHdlIGZvdW5kIGEgc3BvdC4gUmV0dXJuIHRoaXMgYmggYW5kIGxldAogCQkJICogdGhlIGNhbGxlciBhY3R1YWxseSBmaWxsIGl0IGluLiAqLwpAQCAtMTY2MSw3ICsxODg0LDcgQEAKIAkgKiBkaXJlbnQgY2FuIGJlIGZvdW5kLgogCSAqLwogCSpibG9ja3Nfd2FudGVkID0gMTsKLQluZXdfcmVjX2xlbiA9IGxlMTZfdG9fY3B1KGxhc3RfZGUtPnJlY19sZW4pICsgKGRpci0+aV9zYi0+c19ibG9ja3NpemUgLSBpX3NpemVfcmVhZChkaXIpKTsKKwluZXdfcmVjX2xlbiA9IGxlMTZfdG9fY3B1KGxhc3RfZGUtPnJlY19sZW4pICsgZnJlZV9zcGFjZTsKIAlpZiAobmV3X3JlY19sZW4gPCAocmVjX2xlbiArIE9DRlMyX0RJUl9SRUNfTEVOKGxhc3RfZGUtPm5hbWVfbGVuKSkpCiAJCSpibG9ja3Nfd2FudGVkID0gMjsKIApAQCAtMTY3OSw5ICsxOTAyLDEwIEBACiAJc3RydWN0IG9jZnMyX2Rpcl9lbnRyeSAqZGU7CiAJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGRpci0+aV9zYjsKIAlpbnQgc3RhdHVzOworCWludCBibG9ja3NpemUgPSBkaXItPmlfc2ItPnNfYmxvY2tzaXplOwogCi0JYmggPSBvY2ZzMl9icmVhZChkaXIsIDAsICZzdGF0dXMsIDApOwotCWlmICghYmgpIHsKKwlzdGF0dXMgPSBvY2ZzMl9yZWFkX2Rpcl9ibG9jayhkaXIsIDAsICZiaCwgMCk7CisJaWYgKHN0YXR1cykgewogCQltbG9nX2Vycm5vKHN0YXR1cyk7CiAJCWdvdG8gYmFpbDsKIAl9CkBAIC0xNzAyLDExICsxOTI2LDEwIEBACiAJCQkJc3RhdHVzID0gLUVOT1NQQzsKIAkJCQlnb3RvIGJhaWw7CiAJCQl9Ci0JCQliaCA9IG9jZnMyX2JyZWFkKGRpciwKLQkJCQkJIG9mZnNldCA+PiBzYi0+c19ibG9ja3NpemVfYml0cywKLQkJCQkJICZzdGF0dXMsCi0JCQkJCSAwKTsKLQkJCWlmICghYmgpIHsKKwkJCXN0YXR1cyA9IG9jZnMyX3JlYWRfZGlyX2Jsb2NrKGRpciwKKwkJCQkJICAgICBvZmZzZXQgPj4gc2ItPnNfYmxvY2tzaXplX2JpdHMsCisJCQkJCSAgICAgJmJoLCAwKTsKKwkJCWlmIChzdGF0dXMpIHsKIAkJCQltbG9nX2Vycm5vKHN0YXR1cyk7CiAJCQkJZ290byBiYWlsOwogCQkJfQpAQCAtMTcyMSw2ICsxOTQ0LDExIEBACiAJCQlzdGF0dXMgPSAtRUVYSVNUOwogCQkJZ290byBiYWlsOwogCQl9CisKKwkJaWYgKG9jZnMyX3NraXBfZGlyX3RyYWlsZXIoZGlyLCBkZSwgb2Zmc2V0ICUgYmxvY2tzaXplLAorCQkJCQkgICBibG9ja3NpemUpKQorCQkJZ290byBuZXh0OworCiAJCWlmIChvY2ZzMl9kaXJlbnRfd291bGRfZml0KGRlLCByZWNfbGVuKSkgewogCQkJLyogT2ssIHdlIGZvdW5kIGEgc3BvdC4gUmV0dXJuIHRoaXMgYmggYW5kIGxldAogCQkJICogdGhlIGNhbGxlciBhY3R1YWxseSBmaWxsIGl0IGluLiAqLwpAQCAtMTcyOSw2ICsxOTU3LDcgQEAKIAkJCXN0YXR1cyA9IDA7CiAJCQlnb3RvIGJhaWw7CiAJCX0KK25leHQ6CiAJCW9mZnNldCArPSBsZTE2X3RvX2NwdShkZS0+cmVjX2xlbik7CiAJCWRlID0gKHN0cnVjdCBvY2ZzMl9kaXJfZW50cnkgKikoKGNoYXIgKikgZGUgKyBsZTE2X3RvX2NwdShkZS0+cmVjX2xlbikpOwogCX0KZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2Rpci5oIGIvZnMvb2NmczIvZGlyLmgKaW5kZXggY2U0OGI5MC4uYzUxMWUyZSAxMDA2NDQKLS0tIGEvZnMvb2NmczIvZGlyLmgKKysrIGIvZnMvb2NmczIvZGlyLmgKQEAgLTgzLDQgKzgzLDYgQEAKIAkJICAgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqZmVfYmgsCiAJCSAgICAgICBzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqZGF0YV9hYyk7CiAKK3N0cnVjdCBvY2ZzMl9kaXJfYmxvY2tfdHJhaWxlciAqb2NmczJfZGlyX3RyYWlsZXJfZnJvbV9zaXplKGludCBibG9ja3NpemUsCisJCQkJCQkJICAgIHZvaWQgKmRhdGEpOwogI2VuZGlmIC8qIE9DRlMyX0RJUl9IICovCmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9kbG0vZGxtYXN0LmMgYi9mcy9vY2ZzMi9kbG0vZGxtYXN0LmMKaW5kZXggNjQ0YmVlNS4uZDA3ZGRiZSAxMDA2NDQKLS0tIGEvZnMvb2NmczIvZGxtL2RsbWFzdC5jCisrKyBiL2ZzL29jZnMyL2RsbS9kbG1hc3QuYwpAQCAtMjc1LDYgKzI3NSw3IEBACiAJc3RydWN0IGxpc3RfaGVhZCAqaXRlciwgKmhlYWQ9TlVMTDsKIAl1NjQgY29va2llOwogCXUzMiBmbGFnczsKKwl1OCBub2RlOwogCiAJaWYgKCFkbG1fZ3JhYihkbG0pKSB7CiAJCWRsbV9lcnJvcihETE1fUkVKRUNURUQpOwpAQCAtMjg2LDE4ICsyODcsMjEgQEAKIAogCW5hbWUgPSBwYXN0LT5uYW1lOwogCWxvY2tsZW4gPSBwYXN0LT5uYW1lbGVuOwotCWNvb2tpZSA9IGJlNjRfdG9fY3B1KHBhc3QtPmNvb2tpZSk7CisJY29va2llID0gcGFzdC0+Y29va2llOwogCWZsYWdzID0gYmUzMl90b19jcHUocGFzdC0+ZmxhZ3MpOworCW5vZGUgPSBwYXN0LT5ub2RlX2lkeDsKIAogCWlmIChsb2NrbGVuID4gRExNX0xPQ0tJRF9OQU1FX01BWCkgewogCQlyZXQgPSBETE1fSVZCVUZMRU47Ci0JCW1sb2coTUxfRVJST1IsICJJbnZhbGlkIG5hbWUgbGVuZ3RoIGluIHByb3h5IGFzdCBoYW5kbGVyIVxuIik7CisJCW1sb2coTUxfRVJST1IsICJJbnZhbGlkIG5hbWUgbGVuZ3RoICglZCkgaW4gcHJveHkgYXN0ICIKKwkJICAgICAiaGFuZGxlciFcbiIsIGxvY2tsZW4pOwogCQlnb3RvIGxlYXZlOwogCX0KIAogCWlmICgoZmxhZ3MgJiAoTEtNX1BVVF9MVkJ8TEtNX0dFVF9MVkIpKSA9PQogCSAgICAgKExLTV9QVVRfTFZCfExLTV9HRVRfTFZCKSkgewotCQltbG9nKE1MX0VSUk9SLCAiYm90aCBQVVQgYW5kIEdFVCBsdmIgc3BlY2lmaWVkXG4iKTsKKwkJbWxvZyhNTF9FUlJPUiwgIkJvdGggUFVUIGFuZCBHRVQgbHZiIHNwZWNpZmllZCwgKDB4JXgpXG4iLAorCQkgICAgIGZsYWdzKTsKIAkJcmV0ID0gRExNX0JBREFSR1M7CiAJCWdvdG8gbGVhdmU7CiAJfQpAQCAtMzEwLDIyICszMTQsMjEgQEAKIAlpZiAocGFzdC0+dHlwZSAhPSBETE1fQVNUICYmCiAJICAgIHBhc3QtPnR5cGUgIT0gRExNX0JBU1QpIHsKIAkJbWxvZyhNTF9FUlJPUiwgIlVua25vd24gYXN0IHR5cGUhICVkLCBjb29raWU9JXU6JWxsdSIKLQkJICAgICAibmFtZT0lLipzXG4iLCBwYXN0LT50eXBlLCAKLQkJICAgICBkbG1fZ2V0X2xvY2tfY29va2llX25vZGUoY29va2llKSwKLQkJICAgICBkbG1fZ2V0X2xvY2tfY29va2llX3NlcShjb29raWUpLAotCQkgICAgIGxvY2tsZW4sIG5hbWUpOworCQkgICAgICJuYW1lPSUuKnMsIG5vZGU9JXVcbiIsIHBhc3QtPnR5cGUsCisJCSAgICAgZGxtX2dldF9sb2NrX2Nvb2tpZV9ub2RlKGJlNjRfdG9fY3B1KGNvb2tpZSkpLAorCQkgICAgIGRsbV9nZXRfbG9ja19jb29raWVfc2VxKGJlNjRfdG9fY3B1KGNvb2tpZSkpLAorCQkgICAgIGxvY2tsZW4sIG5hbWUsIG5vZGUpOwogCQlyZXQgPSBETE1fSVZMT0NLSUQ7CiAJCWdvdG8gbGVhdmU7CiAJfQogCiAJcmVzID0gZGxtX2xvb2t1cF9sb2NrcmVzKGRsbSwgbmFtZSwgbG9ja2xlbik7CiAJaWYgKCFyZXMpIHsKLQkJbWxvZygwLCAiZ290ICVzYXN0IGZvciB1bmtub3duIGxvY2tyZXMhICIKLQkJICAgICAiY29va2llPSV1OiVsbHUsIG5hbWU9JS4qcywgbmFtZWxlbj0ldVxuIiwKLQkJICAgICBwYXN0LT50eXBlID09IERMTV9BU1QgPyAiIiA6ICJiIiwKLQkJICAgICBkbG1fZ2V0X2xvY2tfY29va2llX25vZGUoY29va2llKSwKLQkJICAgICBkbG1fZ2V0X2xvY2tfY29va2llX3NlcShjb29raWUpLAotCQkgICAgIGxvY2tsZW4sIG5hbWUsIGxvY2tsZW4pOworCQltbG9nKDAsICJHb3QgJXNhc3QgZm9yIHVua25vd24gbG9ja3JlcyEgY29va2llPSV1OiVsbHUsICIKKwkJICAgICAibmFtZT0lLipzLCBub2RlPSV1XG4iLCAocGFzdC0+dHlwZSA9PSBETE1fQVNUID8gIiIgOiAiYiIpLAorCQkgICAgIGRsbV9nZXRfbG9ja19jb29raWVfbm9kZShiZTY0X3RvX2NwdShjb29raWUpKSwKKwkJICAgICBkbG1fZ2V0X2xvY2tfY29va2llX3NlcShiZTY0X3RvX2NwdShjb29raWUpKSwKKwkJICAgICBsb2NrbGVuLCBuYW1lLCBub2RlKTsKIAkJcmV0ID0gRExNX0lWTE9DS0lEOwogCQlnb3RvIGxlYXZlOwogCX0KQEAgLTMzNywxMiArMzQwLDEyIEBACiAKIAlzcGluX2xvY2soJnJlcy0+c3BpbmxvY2spOwogCWlmIChyZXMtPnN0YXRlICYgRExNX0xPQ0tfUkVTX1JFQ09WRVJJTkcpIHsKLQkJbWxvZygwLCAicmVzcG9uZGluZyB3aXRoIERMTV9SRUNPVkVSSU5HIVxuIik7CisJCW1sb2coMCwgIlJlc3BvbmRpbmcgd2l0aCBETE1fUkVDT1ZFUklORyFcbiIpOwogCQlyZXQgPSBETE1fUkVDT1ZFUklORzsKIAkJZ290byB1bmxvY2tfb3V0OwogCX0KIAlpZiAocmVzLT5zdGF0ZSAmIERMTV9MT0NLX1JFU19NSUdSQVRJTkcpIHsKLQkJbWxvZygwLCAicmVzcG9uZGluZyB3aXRoIERMTV9NSUdSQVRJTkchXG4iKTsKKwkJbWxvZygwLCAiUmVzcG9uZGluZyB3aXRoIERMTV9NSUdSQVRJTkchXG4iKTsKIAkJcmV0ID0gRExNX01JR1JBVElORzsKIAkJZ290byB1bmxvY2tfb3V0OwogCX0KQEAgLTM1MSw3ICszNTQsNyBAQAogCWxvY2sgPSBOVUxMOwogCWxpc3RfZm9yX2VhY2goaXRlciwgaGVhZCkgewogCQlsb2NrID0gbGlzdF9lbnRyeSAoaXRlciwgc3RydWN0IGRsbV9sb2NrLCBsaXN0KTsKLQkJaWYgKGJlNjRfdG9fY3B1KGxvY2stPm1sLmNvb2tpZSkgPT0gY29va2llKQorCQlpZiAobG9jay0+bWwuY29va2llID09IGNvb2tpZSkKIAkJCWdvdG8gZG9fYXN0OwogCX0KIApAQCAtMzYzLDE1ICszNjYsMTUgQEAKIAogCWxpc3RfZm9yX2VhY2goaXRlciwgaGVhZCkgewogCQlsb2NrID0gbGlzdF9lbnRyeSAoaXRlciwgc3RydWN0IGRsbV9sb2NrLCBsaXN0KTsKLQkJaWYgKGJlNjRfdG9fY3B1KGxvY2stPm1sLmNvb2tpZSkgPT0gY29va2llKQorCQlpZiAobG9jay0+bWwuY29va2llID09IGNvb2tpZSkKIAkJCWdvdG8gZG9fYXN0OwogCX0KIAotCW1sb2coMCwgImdvdCAlc2FzdCBmb3IgdW5rbm93biBsb2NrISAgY29va2llPSV1OiVsbHUsICIKLQkgICAgICJuYW1lPSUuKnMsIG5hbWVsZW49JXVcbiIsIHBhc3QtPnR5cGUgPT0gRExNX0FTVCA/ICIiIDogImIiLCAKLQkgICAgIGRsbV9nZXRfbG9ja19jb29raWVfbm9kZShjb29raWUpLAotCSAgICAgZGxtX2dldF9sb2NrX2Nvb2tpZV9zZXEoY29va2llKSwKLQkgICAgIGxvY2tsZW4sIG5hbWUsIGxvY2tsZW4pOworCW1sb2coMCwgIkdvdCAlc2FzdCBmb3IgdW5rbm93biBsb2NrISBjb29raWU9JXU6JWxsdSwgbmFtZT0lLipzLCAiCisJICAgICAibm9kZT0ldVxuIiwgcGFzdC0+dHlwZSA9PSBETE1fQVNUID8gIiIgOiAiYiIsCisJICAgICBkbG1fZ2V0X2xvY2tfY29va2llX25vZGUoYmU2NF90b19jcHUoY29va2llKSksCisJICAgICBkbG1fZ2V0X2xvY2tfY29va2llX3NlcShiZTY0X3RvX2NwdShjb29raWUpKSwKKwkgICAgIGxvY2tsZW4sIG5hbWUsIG5vZGUpOwogCiAJcmV0ID0gRExNX05PUk1BTDsKIHVubG9ja19vdXQ6CkBAIC0zODMsOCArMzg2LDggQEAKIAlpZiAocGFzdC0+dHlwZSA9PSBETE1fQVNUKSB7CiAJCS8qIGRvIG5vdCBhbHRlciBsb2NrIHJlZmNvdW50LiAgc3dpdGNoaW5nIGxpc3RzLiAqLwogCQlsaXN0X21vdmVfdGFpbCgmbG9jay0+bGlzdCwgJnJlcy0+Z3JhbnRlZCk7Ci0JCW1sb2coMCwgImFzdDogYWRkaW5nIHRvIGdyYW50ZWQgbGlzdC4uLiB0eXBlPSVkLCAiCi0JCQkgICJjb252ZXJ0X3R5cGU9JWRcbiIsIGxvY2stPm1sLnR5cGUsIGxvY2stPm1sLmNvbnZlcnRfdHlwZSk7CisJCW1sb2coMCwgImFzdDogQWRkaW5nIHRvIGdyYW50ZWQgbGlzdC4uLiB0eXBlPSVkLCAiCisJCSAgICAgImNvbnZlcnRfdHlwZT0lZFxuIiwgbG9jay0+bWwudHlwZSwgbG9jay0+bWwuY29udmVydF90eXBlKTsKIAkJaWYgKGxvY2stPm1sLmNvbnZlcnRfdHlwZSAhPSBMS01fSVZNT0RFKSB7CiAJCQlsb2NrLT5tbC50eXBlID0gbG9jay0+bWwuY29udmVydF90eXBlOwogCQkJbG9jay0+bWwuY29udmVydF90eXBlID0gTEtNX0lWTU9ERTsKQEAgLTQwOCw3ICs0MTEsNiBAQAogCQlkbG1fZG9fbG9jYWxfYmFzdChkbG0sIHJlcywgbG9jaywgcGFzdC0+YmxvY2tlZF90eXBlKTsKIAogbGVhdmU6Ci0KIAlpZiAocmVzKQogCQlkbG1fbG9ja3Jlc19wdXQocmVzKTsKIApkaWZmIC0tZ2l0IGEvZnMvb2NmczIvZGxtL2RsbWNvbW1vbi5oIGIvZnMvb2NmczIvZGxtL2RsbWNvbW1vbi5oCmluZGV4IGQ1YTg2ZmIuLmJiNTM3MTQgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2RsbS9kbG1jb21tb24uaAorKysgYi9mcy9vY2ZzMi9kbG0vZGxtY29tbW9uLmgKQEAgLTE0MCw2ICsxNDAsNyBAQAogCXVuc2lnbmVkIGludCBwdXJnZV9jb3VudDsKIAlzcGlubG9ja190IHNwaW5sb2NrOwogCXNwaW5sb2NrX3QgYXN0X2xvY2s7CisJc3BpbmxvY2tfdCB0cmFja19sb2NrOwogCWNoYXIgKm5hbWU7CiAJdTggbm9kZV9udW07CiAJdTMyIGtleTsKQEAgLTMxNiw2ICszMTcsOCBAQAogCSAqIHB1dCBvbiBhIGxpc3QgZm9yIHRoZSBkbG0gdGhyZWFkIHRvIHJ1bi4gKi8KIAl1bnNpZ25lZCBsb25nICAgIGxhc3RfdXNlZDsKIAorCXN0cnVjdCBkbG1fY3R4dCAqZGxtOworCiAJdW5zaWduZWQgbWlncmF0aW9uX3BlbmRpbmc6MTsKIAlhdG9taWNfdCBhc3RzX3Jlc2VydmVkOwogCXNwaW5sb2NrX3Qgc3BpbmxvY2s7CmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9kbG0vZGxtZGVidWcuYyBiL2ZzL29jZnMyL2RsbS9kbG1kZWJ1Zy5jCmluZGV4IDFiODFkY2IuLmIzMmY2MGEgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2RsbS9kbG1kZWJ1Zy5jCisrKyBiL2ZzL29jZnMyL2RsbS9kbG1kZWJ1Zy5jCkBAIC02MzAsNDMgKzYzMCwzOCBAQAogewogCXN0cnVjdCBkZWJ1Z19sb2NrcmVzICpkbCA9IG0tPnByaXZhdGU7CiAJc3RydWN0IGRsbV9jdHh0ICpkbG0gPSBkbC0+ZGxfY3R4dDsKKwlzdHJ1Y3QgZGxtX2xvY2tfcmVzb3VyY2UgKm9sZHJlcyA9IGRsLT5kbF9yZXM7CiAJc3RydWN0IGRsbV9sb2NrX3Jlc291cmNlICpyZXMgPSBOVUxMOworCXN0cnVjdCBsaXN0X2hlYWQgKnRyYWNrX2xpc3Q7CiAKLQlzcGluX2xvY2soJmRsbS0+c3BpbmxvY2spOworCXNwaW5fbG9jaygmZGxtLT50cmFja19sb2NrKTsKKwlpZiAob2xkcmVzKQorCQl0cmFja19saXN0ID0gJm9sZHJlcy0+dHJhY2tpbmc7CisJZWxzZQorCQl0cmFja19saXN0ID0gJmRsbS0+dHJhY2tpbmdfbGlzdDsKIAotCWlmIChkbC0+ZGxfcmVzKSB7Ci0JCWxpc3RfZm9yX2VhY2hfZW50cnkocmVzLCAmZGwtPmRsX3Jlcy0+dHJhY2tpbmcsIHRyYWNraW5nKSB7Ci0JCQlpZiAoZGwtPmRsX3JlcykgewotCQkJCWRsbV9sb2NrcmVzX3B1dChkbC0+ZGxfcmVzKTsKLQkJCQlkbC0+ZGxfcmVzID0gTlVMTDsKLQkJCX0KLQkJCWlmICgmcmVzLT50cmFja2luZyA9PSAmZGxtLT50cmFja2luZ19saXN0KSB7Ci0JCQkJbWxvZygwLCAiRW5kIG9mIGxpc3QgZm91bmQsICVwXG4iLCByZXMpOwotCQkJCWRsID0gTlVMTDsKLQkJCQlicmVhazsKLQkJCX0KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJlcywgdHJhY2tfbGlzdCwgdHJhY2tpbmcpIHsKKwkJaWYgKCZyZXMtPnRyYWNraW5nID09ICZkbG0tPnRyYWNraW5nX2xpc3QpCisJCQlyZXMgPSBOVUxMOworCQllbHNlCiAJCQlkbG1fbG9ja3Jlc19nZXQocmVzKTsKLQkJCWRsLT5kbF9yZXMgPSByZXM7Ci0JCQlicmVhazsKLQkJfQotCX0gZWxzZSB7Ci0JCWlmICghbGlzdF9lbXB0eSgmZGxtLT50cmFja2luZ19saXN0KSkgewotCQkJbGlzdF9mb3JfZWFjaF9lbnRyeShyZXMsICZkbG0tPnRyYWNraW5nX2xpc3QsIHRyYWNraW5nKQotCQkJCWJyZWFrOwotCQkJZGxtX2xvY2tyZXNfZ2V0KHJlcyk7Ci0JCQlkbC0+ZGxfcmVzID0gcmVzOwotCQl9IGVsc2UKLQkJCWRsID0gTlVMTDsKKwkJYnJlYWs7CiAJfQorCXNwaW5fdW5sb2NrKCZkbG0tPnRyYWNrX2xvY2spOwogCi0JaWYgKGRsKSB7Ci0JCXNwaW5fbG9jaygmZGwtPmRsX3Jlcy0+c3BpbmxvY2spOwotCQlkdW1wX2xvY2tyZXMoZGwtPmRsX3JlcywgZGwtPmRsX2J1ZiwgZGwtPmRsX2xlbiAtIDEpOwotCQlzcGluX3VubG9jaygmZGwtPmRsX3Jlcy0+c3BpbmxvY2spOwotCX0KKwlpZiAob2xkcmVzKQorCQlkbG1fbG9ja3Jlc19wdXQob2xkcmVzKTsKIAotCXNwaW5fdW5sb2NrKCZkbG0tPnNwaW5sb2NrKTsKKwlkbC0+ZGxfcmVzID0gcmVzOwogCisJaWYgKHJlcykgeworCQlzcGluX2xvY2soJnJlcy0+c3BpbmxvY2spOworCQlkdW1wX2xvY2tyZXMocmVzLCBkbC0+ZGxfYnVmLCBkbC0+ZGxfbGVuIC0gMSk7CisJCXNwaW5fdW5sb2NrKCZyZXMtPnNwaW5sb2NrKTsKKwl9IGVsc2UKKwkJZGwgPSBOVUxMOworCisJLyogcGFzc2VkIHRvIHNlcV9zaG93ICovCiAJcmV0dXJuIGRsOwogfQogCmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9kbG0vZGxtZG9tYWluLmMgYi9mcy9vY2ZzMi9kbG0vZGxtZG9tYWluLmMKaW5kZXggNjNmODEyNS4uZDhkNTc4ZiAxMDA2NDQKLS0tIGEvZnMvb2NmczIvZGxtL2RsbWRvbWFpbi5jCisrKyBiL2ZzL29jZnMyL2RsbS9kbG1kb21haW4uYwpAQCAtMTU1MCw2ICsxNTUwLDcgQEAKIAlzcGluX2xvY2tfaW5pdCgmZGxtLT5zcGlubG9jayk7CiAJc3Bpbl9sb2NrX2luaXQoJmRsbS0+bWFzdGVyX2xvY2spOwogCXNwaW5fbG9ja19pbml0KCZkbG0tPmFzdF9sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmZGxtLT50cmFja19sb2NrKTsKIAlJTklUX0xJU1RfSEVBRCgmZGxtLT5saXN0KTsKIAlJTklUX0xJU1RfSEVBRCgmZGxtLT5kaXJ0eV9saXN0KTsKIAlJTklUX0xJU1RfSEVBRCgmZGxtLT5yZWNvLnJlc291cmNlcyk7CmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9kbG0vZGxtZnMuYyBiL2ZzL29jZnMyL2RsbS9kbG1mcy5jCmluZGV4IDZmN2E3N2QuLjFjOWVmYjQgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2RsbS9kbG1mcy5jCisrKyBiL2ZzL29jZnMyL2RsbS9kbG1mcy5jCkBAIC0zNDEsNyArMzQxLDYgQEAKIAkJaW5vZGUtPmlfbW9kZSA9IG1vZGU7CiAJCWlub2RlLT5pX3VpZCA9IGN1cnJlbnRfZnN1aWQoKTsKIAkJaW5vZGUtPmlfZ2lkID0gY3VycmVudF9mc2dpZCgpOwotCQlpbm9kZS0+aV9ibG9ja3MgPSAwOwogCQlpbm9kZS0+aV9tYXBwaW5nLT5iYWNraW5nX2Rldl9pbmZvID0gJmRsbWZzX2JhY2tpbmdfZGV2X2luZm87CiAJCWlub2RlLT5pX2F0aW1lID0gaW5vZGUtPmlfbXRpbWUgPSBpbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRTsKIAkJaW5jX25saW5rKGlub2RlKTsKQEAgLTM2Nyw3ICszNjYsNiBAQAogCWlub2RlLT5pX21vZGUgPSBtb2RlOwogCWlub2RlLT5pX3VpZCA9IGN1cnJlbnRfZnN1aWQoKTsKIAlpbm9kZS0+aV9naWQgPSBjdXJyZW50X2ZzZ2lkKCk7Ci0JaW5vZGUtPmlfYmxvY2tzID0gMDsKIAlpbm9kZS0+aV9tYXBwaW5nLT5iYWNraW5nX2Rldl9pbmZvID0gJmRsbWZzX2JhY2tpbmdfZGV2X2luZm87CiAJaW5vZGUtPmlfYXRpbWUgPSBpbm9kZS0+aV9tdGltZSA9IGlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FOwogCmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9kbG0vZGxtbWFzdGVyLmMgYi9mcy9vY2ZzMi9kbG0vZGxtbWFzdGVyLmMKaW5kZXggNDRmODdjYS4uNTRlMTgyYSAxMDA2NDQKLS0tIGEvZnMvb2NmczIvZGxtL2RsbW1hc3Rlci5jCisrKyBiL2ZzL29jZnMyL2RsbS9kbG1tYXN0ZXIuYwpAQCAtNTA1LDggKzUwNSwxMCBAQAogc3RhdGljIHZvaWQgZGxtX2xvY2tyZXNfcmVsZWFzZShzdHJ1Y3Qga3JlZiAqa3JlZikKIHsKIAlzdHJ1Y3QgZGxtX2xvY2tfcmVzb3VyY2UgKnJlczsKKwlzdHJ1Y3QgZGxtX2N0eHQgKmRsbTsKIAogCXJlcyA9IGNvbnRhaW5lcl9vZihrcmVmLCBzdHJ1Y3QgZGxtX2xvY2tfcmVzb3VyY2UsIHJlZnMpOworCWRsbSA9IHJlcy0+ZGxtOwogCiAJLyogVGhpcyBzaG91bGQgbm90IGhhcHBlbiAtLSBhbGwgbG9ja3JlcycgaGF2ZSBhIG5hbWUKIAkgKiBhc3NvY2lhdGVkIHdpdGggdGhlbSBhdCBpbml0IHRpbWUuICovCkBAIC01MTUsNiArNTE3LDcgQEAKIAltbG9nKDAsICJkZXN0cm95aW5nIGxvY2tyZXMgJS4qc1xuIiwgcmVzLT5sb2NrbmFtZS5sZW4sCiAJICAgICByZXMtPmxvY2tuYW1lLm5hbWUpOwogCisJc3Bpbl9sb2NrKCZkbG0tPnRyYWNrX2xvY2spOwogCWlmICghbGlzdF9lbXB0eSgmcmVzLT50cmFja2luZykpCiAJCWxpc3RfZGVsX2luaXQoJnJlcy0+dHJhY2tpbmcpOwogCWVsc2UgewpAQCAtNTIyLDYgKzUyNSw5IEBACiAJCSAgICAgcmVzLT5sb2NrbmFtZS5sZW4sIHJlcy0+bG9ja25hbWUubmFtZSk7CiAJCWRsbV9wcmludF9vbmVfbG9ja19yZXNvdXJjZShyZXMpOwogCX0KKwlzcGluX3VubG9jaygmZGxtLT50cmFja19sb2NrKTsKKworCWRsbV9wdXQoZGxtKTsKIAogCWlmICghaGxpc3RfdW5oYXNoZWQoJnJlcy0+aGFzaF9ub2RlKSB8fAogCSAgICAhbGlzdF9lbXB0eSgmcmVzLT5ncmFudGVkKSB8fApAQCAtNTk1LDYgKzYwMSwxMCBAQAogCXJlcy0+bWlncmF0aW9uX3BlbmRpbmcgPSAwOwogCXJlcy0+aW5mbGlnaHRfbG9ja3MgPSAwOwogCisJLyogcHV0IGluIGRsbV9sb2NrcmVzX3JlbGVhc2UgKi8KKwlkbG1fZ3JhYihkbG0pOworCXJlcy0+ZGxtID0gZGxtOworCiAJa3JlZl9pbml0KCZyZXMtPnJlZnMpOwogCiAJLyoganVzdCBmb3IgY29uc2lzdGVuY3kgKi8KQEAgLTcyMiwxNCArNzMyLDIxIEBACiAJaWYgKHRtcHJlcykgewogCQlpbnQgZHJvcHBpbmdfcmVmID0gMDsKIAorCQlzcGluX3VubG9jaygmZGxtLT5zcGlubG9jayk7CisKIAkJc3Bpbl9sb2NrKCZ0bXByZXMtPnNwaW5sb2NrKTsKKwkJLyogV2Ugd2FpdCBmb3IgdGhlIG90aGVyIHRocmVhZCB0aGF0IGlzIG1hc3RlcmluZyB0aGUgcmVzb3VyY2UgKi8KKwkJaWYgKHRtcHJlcy0+b3duZXIgPT0gRExNX0xPQ0tfUkVTX09XTkVSX1VOS05PV04pIHsKKwkJCV9fZGxtX3dhaXRfb25fbG9ja3Jlcyh0bXByZXMpOworCQkJQlVHX09OKHRtcHJlcy0+b3duZXIgPT0gRExNX0xPQ0tfUkVTX09XTkVSX1VOS05PV04pOworCQl9CisKIAkJaWYgKHRtcHJlcy0+b3duZXIgPT0gZGxtLT5ub2RlX251bSkgewogCQkJQlVHX09OKHRtcHJlcy0+c3RhdGUgJiBETE1fTE9DS19SRVNfRFJPUFBJTkdfUkVGKTsKIAkJCWRsbV9sb2NrcmVzX2dyYWJfaW5mbGlnaHRfcmVmKGRsbSwgdG1wcmVzKTsKIAkJfSBlbHNlIGlmICh0bXByZXMtPnN0YXRlICYgRExNX0xPQ0tfUkVTX0RST1BQSU5HX1JFRikKIAkJCWRyb3BwaW5nX3JlZiA9IDE7CiAJCXNwaW5fdW5sb2NrKCZ0bXByZXMtPnNwaW5sb2NrKTsKLQkJc3Bpbl91bmxvY2soJmRsbS0+c3BpbmxvY2spOwogCiAJCS8qIHdhaXQgdW50aWwgZG9uZSBtZXNzYWdpbmcgdGhlIG1hc3RlciwgZHJvcCBvdXIgcmVmIHRvIGFsbG93CiAJCSAqIHRoZSBsb2NrcmVzIHRvIGJlIHB1cmdlZCwgc3RhcnQgb3Zlci4gKi8KQEAgLTI5NDksNyArMjk2Niw3IEBACiAJCQkJICBzdHJ1Y3QgZGxtX25vZGVfaXRlciAqaXRlcikKIHsKIAlzdHJ1Y3QgZGxtX21pZ3JhdGVfcmVxdWVzdCBtaWdyYXRlOwotCWludCByZXQsIHN0YXR1cyA9IDA7CisJaW50IHJldCwgc2tpcCwgc3RhdHVzID0gMDsKIAlpbnQgbm9kZW51bTsKIAogCW1lbXNldCgmbWlncmF0ZSwgMCwgc2l6ZW9mKG1pZ3JhdGUpKTsKQEAgLTI5NjYsMTIgKzI5ODMsMjcgQEAKIAkJICAgIG5vZGVudW0gPT0gbmV3X21hc3RlcikKIAkJCWNvbnRpbnVlOwogCisJCS8qIFdlIGNvdWxkIHJhY2UgZXhpdCBkb21haW4uIElmIGV4aXRlZCwgc2tpcC4gKi8KKwkJc3Bpbl9sb2NrKCZkbG0tPnNwaW5sb2NrKTsKKwkJc2tpcCA9ICghdGVzdF9iaXQobm9kZW51bSwgZGxtLT5kb21haW5fbWFwKSk7CisJCXNwaW5fdW5sb2NrKCZkbG0tPnNwaW5sb2NrKTsKKwkJaWYgKHNraXApIHsKKwkJCWNsZWFyX2JpdChub2RlbnVtLCBpdGVyLT5ub2RlX21hcCk7CisJCQljb250aW51ZTsKKwkJfQorCiAJCXJldCA9IG8ybmV0X3NlbmRfbWVzc2FnZShETE1fTUlHUkFURV9SRVFVRVNUX01TRywgZGxtLT5rZXksCiAJCQkJCSAmbWlncmF0ZSwgc2l6ZW9mKG1pZ3JhdGUpLCBub2RlbnVtLAogCQkJCQkgJnN0YXR1cyk7Ci0JCWlmIChyZXQgPCAwKQotCQkJbWxvZ19lcnJubyhyZXQpOwotCQllbHNlIGlmIChzdGF0dXMgPCAwKSB7CisJCWlmIChyZXQgPCAwKSB7CisJCQltbG9nKDAsICJtaWdyYXRlX3JlcXVlc3QgcmV0dXJuZWQgJWQhXG4iLCByZXQpOworCQkJaWYgKCFkbG1faXNfaG9zdF9kb3duKHJldCkpIHsKKwkJCQltbG9nKE1MX0VSUk9SLCAidW5oYW5kbGVkIGVycm9yPSVkIVxuIiwgcmV0KTsKKwkJCQlCVUcoKTsKKwkJCX0KKwkJCWNsZWFyX2JpdChub2RlbnVtLCBpdGVyLT5ub2RlX21hcCk7CisJCQlyZXQgPSAwOworCQl9IGVsc2UgaWYgKHN0YXR1cyA8IDApIHsKIAkJCW1sb2coMCwgIm1pZ3JhdGUgcmVxdWVzdCAobm9kZSAldSkgcmV0dXJuZWQgJWQhXG4iLAogCQkJICAgICBub2RlbnVtLCBzdGF0dXMpOwogCQkJcmV0ID0gc3RhdHVzOwpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvZGxtL2RsbXRocmVhZC5jIGIvZnMvb2NmczIvZGxtL2RsbXRocmVhZC5jCmluZGV4IDQwNjBiYjMuLmQxMjk1MjAgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2RsbS9kbG10aHJlYWQuYworKysgYi9mcy9vY2ZzMi9kbG0vZGxtdGhyZWFkLmMKQEAgLTE4MSw3ICsxODEsOCBAQAogCiAJCXNwaW5fbG9jaygmcmVzLT5zcGlubG9jayk7CiAJCS8qIFRoaXMgZW5zdXJlcyB0aGF0IGNsZWFyIHJlZm1hcCBpcyBzZW50IGFmdGVyIHRoZSBzZXQgKi8KLQkJX19kbG1fd2FpdF9vbl9sb2NrcmVzX2ZsYWdzKHJlcywgRExNX0xPQ0tfUkVTX1NFVFJFRl9JTlBST0cpOworCQlfX2RsbV93YWl0X29uX2xvY2tyZXNfZmxhZ3MocmVzLCAoRExNX0xPQ0tfUkVTX1NFVFJFRl9JTlBST0cgfAorCQkJCQkJICBETE1fTE9DS19SRVNfTUlHUkFUSU5HKSk7CiAJCXNwaW5fdW5sb2NrKCZyZXMtPnNwaW5sb2NrKTsKIAogCQkvKiBjbGVhciBvdXIgYml0IGZyb20gdGhlIG1hc3RlcidzIHJlZm1hcCwgaWdub3JlIGVycm9ycyAqLwpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvZGxtZ2x1ZS5jIGIvZnMvb2NmczIvZGxtZ2x1ZS5jCmluZGV4IDZlNmNjMGEuLmIwYzRjYWQgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2RsbWdsdWUuYworKysgYi9mcy9vY2ZzMi9kbG1nbHVlLmMKQEAgLTMyLDYgKzMyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvcXVvdGFvcHMuaD4KIAogI2RlZmluZSBNTE9HX01BU0tfUFJFRklYIE1MX0RMTV9HTFVFCiAjaW5jbHVkZSA8Y2x1c3Rlci9tYXNrbG9nLmg+CkBAIC01MSw2ICs1Miw3IEBACiAjaW5jbHVkZSAic2xvdF9tYXAuaCIKICNpbmNsdWRlICJzdXBlci5oIgogI2luY2x1ZGUgInVwdG9kYXRlLmgiCisjaW5jbHVkZSAicXVvdGEuaCIKIAogI2luY2x1ZGUgImJ1ZmZlcl9oZWFkX2lvLmgiCiAKQEAgLTY4LDYgKzcwLDcgQEAKIHN0YXRpYyBzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9jZnMyX2dldF9kZW50cnlfb3NiKHN0cnVjdCBvY2ZzMl9sb2NrX3JlcyAqbG9ja3Jlcyk7CiBzdGF0aWMgc3RydWN0IG9jZnMyX3N1cGVyICpvY2ZzMl9nZXRfaW5vZGVfb3NiKHN0cnVjdCBvY2ZzMl9sb2NrX3JlcyAqbG9ja3Jlcyk7CiBzdGF0aWMgc3RydWN0IG9jZnMyX3N1cGVyICpvY2ZzMl9nZXRfZmlsZV9vc2Ioc3RydWN0IG9jZnMyX2xvY2tfcmVzICpsb2NrcmVzKTsKK3N0YXRpYyBzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9jZnMyX2dldF9xaW5mb19vc2Ioc3RydWN0IG9jZnMyX2xvY2tfcmVzICpsb2NrcmVzKTsKIAogLyoKICAqIFJldHVybiB2YWx1ZSBmcm9tIC0+ZG93bmNvbnZlcnRfd29ya2VyIGZ1bmN0aW9ucy4KQEAgLTEwMiw2ICsxMDUsNyBAQAogc3RhdGljIHZvaWQgb2NmczJfZGVudHJ5X3Bvc3RfdW5sb2NrKHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiLAogCQkJCSAgICAgc3RydWN0IG9jZnMyX2xvY2tfcmVzICpsb2NrcmVzKTsKIAorc3RhdGljIHZvaWQgb2NmczJfc2V0X3FpbmZvX2x2YihzdHJ1Y3Qgb2NmczJfbG9ja19yZXMgKmxvY2tyZXMpOwogCiAjZGVmaW5lIG1sb2dfbWV0YV9sdmIoX19sZXZlbCwgX19sb2NrcmVzKSBvY2ZzMl9kdW1wX21ldGFfbHZiX2luZm8oX19sZXZlbCwgX19QUkVUVFlfRlVOQ1RJT05fXywgX19MSU5FX18sIF9fbG9ja3JlcykKIApAQCAtMTExLDggKzExNSw3IEBACiAJCQkJICAgICB1bnNpZ25lZCBpbnQgbGluZSwKIAkJCQkgICAgIHN0cnVjdCBvY2ZzMl9sb2NrX3JlcyAqbG9ja3JlcykKIHsKLQlzdHJ1Y3Qgb2NmczJfbWV0YV9sdmIgKmx2YiA9Ci0JCShzdHJ1Y3Qgb2NmczJfbWV0YV9sdmIgKilvY2ZzMl9kbG1fbHZiKCZsb2NrcmVzLT5sX2xrc2IpOworCXN0cnVjdCBvY2ZzMl9tZXRhX2x2YiAqbHZiID0gb2NmczJfZGxtX2x2YigmbG9ja3Jlcy0+bF9sa3NiKTsKIAogCW1sb2cobGV2ZWwsICJMVkIgaW5mb3JtYXRpb24gZm9yICVzIChjYWxsZWQgZnJvbSAlczoldSk6XG4iLAogCSAgICAgbG9ja3Jlcy0+bF9uYW1lLCBmdW5jdGlvbiwgbGluZSk7CkBAIC0yNTgsNiArMjYxLDEyIEBACiAJLmZsYWdzCQk9IDAsCiB9OwogCitzdGF0aWMgc3RydWN0IG9jZnMyX2xvY2tfcmVzX29wcyBvY2ZzMl9xaW5mb19sb3BzID0geworCS5zZXRfbHZiCT0gb2NmczJfc2V0X3FpbmZvX2x2YiwKKwkuZ2V0X29zYgk9IG9jZnMyX2dldF9xaW5mb19vc2IsCisJLmZsYWdzCQk9IExPQ0tfVFlQRV9SRVFVSVJFU19SRUZSRVNIIHwgTE9DS19UWVBFX1VTRVNfTFZCLAorfTsKKwogc3RhdGljIGlubGluZSBpbnQgb2NmczJfaXNfaW5vZGVfbG9jayhzdHJ1Y3Qgb2NmczJfbG9ja19yZXMgKmxvY2tyZXMpCiB7CiAJcmV0dXJuIGxvY2tyZXMtPmxfdHlwZSA9PSBPQ0ZTMl9MT0NLX1RZUEVfTUVUQSB8fApAQCAtMjc5LDYgKzI4OCwxMyBAQAogCXJldHVybiAoc3RydWN0IG9jZnMyX2RlbnRyeV9sb2NrICopbG9ja3Jlcy0+bF9wcml2OwogfQogCitzdGF0aWMgaW5saW5lIHN0cnVjdCBvY2ZzMl9tZW1fZHFpbmZvICpvY2ZzMl9sb2NrX3Jlc19xaW5mbyhzdHJ1Y3Qgb2NmczJfbG9ja19yZXMgKmxvY2tyZXMpCit7CisJQlVHX09OKGxvY2tyZXMtPmxfdHlwZSAhPSBPQ0ZTMl9MT0NLX1RZUEVfUUlORk8pOworCisJcmV0dXJuIChzdHJ1Y3Qgb2NmczJfbWVtX2RxaW5mbyAqKWxvY2tyZXMtPmxfcHJpdjsKK30KKwogc3RhdGljIGlubGluZSBzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9jZnMyX2dldF9sb2NrcmVzX29zYihzdHJ1Y3Qgb2NmczJfbG9ja19yZXMgKmxvY2tyZXMpCiB7CiAJaWYgKGxvY2tyZXMtPmxfb3BzLT5nZXRfb3NiKQpAQCAtNTA3LDYgKzUyMywxMyBAQAogCXJldHVybiBPQ0ZTMl9TQihpbm9kZS0+aV9zYik7CiB9CiAKK3N0YXRpYyBzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9jZnMyX2dldF9xaW5mb19vc2Ioc3RydWN0IG9jZnMyX2xvY2tfcmVzICpsb2NrcmVzKQoreworCXN0cnVjdCBvY2ZzMl9tZW1fZHFpbmZvICppbmZvID0gbG9ja3Jlcy0+bF9wcml2OworCisJcmV0dXJuIE9DRlMyX1NCKGluZm8tPmRxaV9naS5kcWlfc2IpOworfQorCiBzdGF0aWMgc3RydWN0IG9jZnMyX3N1cGVyICpvY2ZzMl9nZXRfZmlsZV9vc2Ioc3RydWN0IG9jZnMyX2xvY2tfcmVzICpsb2NrcmVzKQogewogCXN0cnVjdCBvY2ZzMl9maWxlX3ByaXZhdGUgKmZwID0gbG9ja3Jlcy0+bF9wcml2OwpAQCAtNjA5LDYgKzYzMiwxNyBAQAogCWxvY2tyZXMtPmxfZmxhZ3MgfD0gT0NGUzJfTE9DS19OT0NBQ0hFOwogfQogCit2b2lkIG9jZnMyX3FpbmZvX2xvY2tfcmVzX2luaXQoc3RydWN0IG9jZnMyX2xvY2tfcmVzICpsb2NrcmVzLAorCQkJICAgICAgIHN0cnVjdCBvY2ZzMl9tZW1fZHFpbmZvICppbmZvKQoreworCW9jZnMyX2xvY2tfcmVzX2luaXRfb25jZShsb2NrcmVzKTsKKwlvY2ZzMl9idWlsZF9sb2NrX25hbWUoT0NGUzJfTE9DS19UWVBFX1FJTkZPLCBpbmZvLT5kcWlfZ2kuZHFpX3R5cGUsCisJCQkgICAgICAwLCBsb2NrcmVzLT5sX25hbWUpOworCW9jZnMyX2xvY2tfcmVzX2luaXRfY29tbW9uKE9DRlMyX1NCKGluZm8tPmRxaV9naS5kcWlfc2IpLCBsb2NrcmVzLAorCQkJCSAgIE9DRlMyX0xPQ0tfVFlQRV9RSU5GTywgJm9jZnMyX3FpbmZvX2xvcHMsCisJCQkJICAgaW5mbyk7Cit9CisKIHZvaWQgb2NmczJfbG9ja19yZXNfZnJlZShzdHJ1Y3Qgb2NmczJfbG9ja19yZXMgKnJlcykKIHsKIAltbG9nX2VudHJ5X3ZvaWQoKTsKQEAgLTEyOTAsNyArMTMyNCw3IEBACiAJCQlnb3RvIG91dDsKIAkJfQogCi0JCW1sb2coMCwgImxvY2sgJXMsIHN1Y2Nlc3NmdWxsIHJldHVybiBmcm9tIG9jZnMyX2RsbV9sb2NrXG4iLAorCQltbG9nKDAsICJsb2NrICVzLCBzdWNjZXNzZnVsIHJldHVybiBmcm9tIG9jZnMyX2RsbV9sb2NrXG4iLAogCQkgICAgIGxvY2tyZXMtPmxfbmFtZSk7CiAKIAkJLyogQXQgdGhpcyBwb2ludCB3ZSd2ZSBnb25lIGluc2lkZSB0aGUgZGxtIGFuZCBuZWVkIHRvCkBAIC0xODI5LDcgKzE4NjMsNyBAQAogCiAJbWxvZ19lbnRyeV92b2lkKCk7CiAKLQlsdmIgPSAoc3RydWN0IG9jZnMyX21ldGFfbHZiICopb2NmczJfZGxtX2x2YigmbG9ja3Jlcy0+bF9sa3NiKTsKKwlsdmIgPSBvY2ZzMl9kbG1fbHZiKCZsb2NrcmVzLT5sX2xrc2IpOwogCiAJLyoKIAkgKiBJbnZhbGlkYXRlIHRoZSBMVkIgb2YgYSBkZWxldGVkIGlub2RlIC0gdGhpcyB3YXkgb3RoZXIKQEAgLTE4ODEsNyArMTkxNSw3IEBACiAKIAltbG9nX21ldGFfbHZiKDAsIGxvY2tyZXMpOwogCi0JbHZiID0gKHN0cnVjdCBvY2ZzMl9tZXRhX2x2YiAqKW9jZnMyX2RsbV9sdmIoJmxvY2tyZXMtPmxfbGtzYik7CisJbHZiID0gb2NmczJfZGxtX2x2YigmbG9ja3Jlcy0+bF9sa3NiKTsKIAogCS8qIFdlJ3JlIHNhZmUgaGVyZSB3aXRob3V0IHRoZSBsb2NrcmVzIGxvY2suLi4gKi8KIAlzcGluX2xvY2soJm9pLT5pcF9sb2NrKTsKQEAgLTE5MTYsOCArMTk1MCw3IEBACiBzdGF0aWMgaW5saW5lIGludCBvY2ZzMl9tZXRhX2x2Yl9pc190cnVzdGFibGUoc3RydWN0IGlub2RlICppbm9kZSwKIAkJCQkJICAgICAgc3RydWN0IG9jZnMyX2xvY2tfcmVzICpsb2NrcmVzKQogewotCXN0cnVjdCBvY2ZzMl9tZXRhX2x2YiAqbHZiID0KLQkJKHN0cnVjdCBvY2ZzMl9tZXRhX2x2YiAqKW9jZnMyX2RsbV9sdmIoJmxvY2tyZXMtPmxfbGtzYik7CisJc3RydWN0IG9jZnMyX21ldGFfbHZiICpsdmIgPSBvY2ZzMl9kbG1fbHZiKCZsb2NrcmVzLT5sX2xrc2IpOwogCiAJaWYgKGx2Yi0+bHZiX3ZlcnNpb24gPT0gT0NGUzJfTFZCX1ZFUlNJT04KIAkgICAgJiYgYmUzMl90b19jcHUobHZiLT5sdmJfaWdlbmVyYXRpb24pID09IGlub2RlLT5pX2dlbmVyYXRpb24pCkBAIC0yMDI0LDcgKzIwNTcsNyBAQAogCX0gZWxzZSB7CiAJCS8qIEJvbywgd2UgaGF2ZSB0byBnbyB0byBkaXNrLiAqLwogCQkvKiByZWFkIGJoLCBjYXN0LCBvY2ZzMl9yZWZyZXNoX2lub2RlICovCi0JCXN0YXR1cyA9IG9jZnMyX3JlYWRfYmxvY2soaW5vZGUsIG9pLT5pcF9ibGtubywgYmgpOworCQlzdGF0dXMgPSBvY2ZzMl9yZWFkX2lub2RlX2Jsb2NrKGlub2RlLCBiaCk7CiAJCWlmIChzdGF0dXMgPCAwKSB7CiAJCQltbG9nX2Vycm5vKHN0YXR1cyk7CiAJCQlnb3RvIGJhaWxfcmVmcmVzaDsKQEAgLTIwMzIsMTggKzIwNjUsMTQgQEAKIAkJZmUgPSAoc3RydWN0IG9jZnMyX2Rpbm9kZSAqKSAoKmJoKS0+Yl9kYXRhOwogCiAJCS8qIFRoaXMgaXMgYSBnb29kIGNoYW5jZSB0byBtYWtlIHN1cmUgd2UncmUgbm90Ci0JCSAqIGxvY2tpbmcgYW4gaW52YWxpZCBvYmplY3QuCisJCSAqIGxvY2tpbmcgYW4gaW52YWxpZCBvYmplY3QuICBvY2ZzMl9yZWFkX2lub2RlX2Jsb2NrKCkKKwkJICogYWxyZWFkeSBjaGVja2VkIHRoYXQgdGhlIGlub2RlIGJsb2NrIGlzIHNhbmUuCiAJCSAqCiAJCSAqIFdlIGJ1ZyBvbiBhIHN0YWxlIGlub2RlIGhlcmUgYmVjYXVzZSB3ZSBjaGVja2VkCiAJCSAqIGFib3ZlIHdoZXRoZXIgaXQgd2FzIHdpcGVkIGZyb20gZGlzay4gVGhlIHdpcGluZwogCQkgKiBub2RlIHByb3ZpZGVzIGEgZ3VhcmFudGVlIHRoYXQgd2UgcmVjZWl2ZSB0aGF0CiAJCSAqIG1lc3NhZ2UgYW5kIGNhbiBtYXJrIHRoZSBpbm9kZSBiZWZvcmUgZHJvcHBpbmcgYW55CiAJCSAqIGxvY2tzIGFzc29jaWF0ZWQgd2l0aCBpdC4gKi8KLQkJaWYgKCFPQ0ZTMl9JU19WQUxJRF9ESU5PREUoZmUpKSB7Ci0JCQlPQ0ZTMl9ST19PTl9JTlZBTElEX0RJTk9ERShpbm9kZS0+aV9zYiwgZmUpOwotCQkJc3RhdHVzID0gLUVJTzsKLQkJCWdvdG8gYmFpbF9yZWZyZXNoOwotCQl9CiAJCW1sb2dfYnVnX29uX21zZyhpbm9kZS0+aV9nZW5lcmF0aW9uICE9CiAJCQkJbGUzMl90b19jcHUoZmUtPmlfZ2VuZXJhdGlvbiksCiAJCQkJIkludmFsaWQgZGlub2RlICVsbHUgZGlzayBnZW5lcmF0aW9uOiAldSAiCkBAIC0yMDg1LDcgKzIxMTQsNyBAQAogCQlyZXR1cm4gMDsKIAl9CiAKLQlzdGF0dXMgPSBvY2ZzMl9yZWFkX2Jsb2NrKGlub2RlLCBPQ0ZTMl9JKGlub2RlKS0+aXBfYmxrbm8sIHJldF9iaCk7CisJc3RhdHVzID0gb2NmczJfcmVhZF9pbm9kZV9ibG9jayhpbm9kZSwgcmV0X2JoKTsKIAlpZiAoc3RhdHVzIDwgMCkKIAkJbWxvZ19lcnJubyhzdGF0dXMpOwogCkBAIC0yOTIyLDcgKzI5NTEsNyBAQAogCQlvY2ZzMl9kbG1fZHVtcF9sa3NiKCZsb2NrcmVzLT5sX2xrc2IpOwogCQlCVUcoKTsKIAl9Ci0JbWxvZygwLCAibG9jayAlcywgc3VjY2Vzc2Z1bGwgcmV0dXJuIGZyb20gb2NmczJfZGxtX3VubG9ja1xuIiwKKwltbG9nKDAsICJsb2NrICVzLCBzdWNjZXNzZnVsIHJldHVybiBmcm9tIG9jZnMyX2RsbV91bmxvY2tcbiIsCiAJICAgICBsb2NrcmVzLT5sX25hbWUpOwogCiAJb2NmczJfd2FpdF9vbl9idXN5X2xvY2sobG9ja3Jlcyk7CkBAIC0zNDQ5LDYgKzM0NzgsMTE3IEBACiAJcmV0dXJuIFVOQkxPQ0tfQ09OVElOVUVfUE9TVDsKIH0KIAorc3RhdGljIHZvaWQgb2NmczJfc2V0X3FpbmZvX2x2YihzdHJ1Y3Qgb2NmczJfbG9ja19yZXMgKmxvY2tyZXMpCit7CisJc3RydWN0IG9jZnMyX3FpbmZvX2x2YiAqbHZiOworCXN0cnVjdCBvY2ZzMl9tZW1fZHFpbmZvICpvaW5mbyA9IG9jZnMyX2xvY2tfcmVzX3FpbmZvKGxvY2tyZXMpOworCXN0cnVjdCBtZW1fZHFpbmZvICppbmZvID0gc2JfZHFpbmZvKG9pbmZvLT5kcWlfZ2kuZHFpX3NiLAorCQkJCQkgICAgb2luZm8tPmRxaV9naS5kcWlfdHlwZSk7CisKKwltbG9nX2VudHJ5X3ZvaWQoKTsKKworCWx2YiA9IG9jZnMyX2RsbV9sdmIoJmxvY2tyZXMtPmxfbGtzYik7CisJbHZiLT5sdmJfdmVyc2lvbiA9IE9DRlMyX1FJTkZPX0xWQl9WRVJTSU9OOworCWx2Yi0+bHZiX2JncmFjZSA9IGNwdV90b19iZTMyKGluZm8tPmRxaV9iZ3JhY2UpOworCWx2Yi0+bHZiX2lncmFjZSA9IGNwdV90b19iZTMyKGluZm8tPmRxaV9pZ3JhY2UpOworCWx2Yi0+bHZiX3N5bmNtcyA9IGNwdV90b19iZTMyKG9pbmZvLT5kcWlfc3luY21zKTsKKwlsdmItPmx2Yl9ibG9ja3MgPSBjcHVfdG9fYmUzMihvaW5mby0+ZHFpX2dpLmRxaV9ibG9ja3MpOworCWx2Yi0+bHZiX2ZyZWVfYmxrID0gY3B1X3RvX2JlMzIob2luZm8tPmRxaV9naS5kcWlfZnJlZV9ibGspOworCWx2Yi0+bHZiX2ZyZWVfZW50cnkgPSBjcHVfdG9fYmUzMihvaW5mby0+ZHFpX2dpLmRxaV9mcmVlX2VudHJ5KTsKKworCW1sb2dfZXhpdF92b2lkKCk7Cit9CisKK3ZvaWQgb2NmczJfcWluZm9fdW5sb2NrKHN0cnVjdCBvY2ZzMl9tZW1fZHFpbmZvICpvaW5mbywgaW50IGV4KQoreworCXN0cnVjdCBvY2ZzMl9sb2NrX3JlcyAqbG9ja3JlcyA9ICZvaW5mby0+ZHFpX2dxbG9jazsKKwlzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiA9IE9DRlMyX1NCKG9pbmZvLT5kcWlfZ2kuZHFpX3NiKTsKKwlpbnQgbGV2ZWwgPSBleCA/IERMTV9MT0NLX0VYIDogRExNX0xPQ0tfUFI7CisKKwltbG9nX2VudHJ5X3ZvaWQoKTsKKwlpZiAoIW9jZnMyX2lzX2hhcmRfcmVhZG9ubHkob3NiKSAmJiAhb2NmczJfbW91bnRfbG9jYWwob3NiKSkKKwkJb2NmczJfY2x1c3Rlcl91bmxvY2sob3NiLCBsb2NrcmVzLCBsZXZlbCk7CisJbWxvZ19leGl0X3ZvaWQoKTsKK30KKworc3RhdGljIGludCBvY2ZzMl9yZWZyZXNoX3FpbmZvKHN0cnVjdCBvY2ZzMl9tZW1fZHFpbmZvICpvaW5mbykKK3sKKwlzdHJ1Y3QgbWVtX2RxaW5mbyAqaW5mbyA9IHNiX2RxaW5mbyhvaW5mby0+ZHFpX2dpLmRxaV9zYiwKKwkJCQkJICAgIG9pbmZvLT5kcWlfZ2kuZHFpX3R5cGUpOworCXN0cnVjdCBvY2ZzMl9sb2NrX3JlcyAqbG9ja3JlcyA9ICZvaW5mby0+ZHFpX2dxbG9jazsKKwlzdHJ1Y3Qgb2NmczJfcWluZm9fbHZiICpsdmIgPSBvY2ZzMl9kbG1fbHZiKCZsb2NrcmVzLT5sX2xrc2IpOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSBOVUxMOworCXN0cnVjdCBvY2ZzMl9nbG9iYWxfZGlza19kcWluZm8gKmdkaW5mbzsKKwlpbnQgc3RhdHVzID0gMDsKKworCWlmIChsdmItPmx2Yl92ZXJzaW9uID09IE9DRlMyX1FJTkZPX0xWQl9WRVJTSU9OKSB7CisJCWluZm8tPmRxaV9iZ3JhY2UgPSBiZTMyX3RvX2NwdShsdmItPmx2Yl9iZ3JhY2UpOworCQlpbmZvLT5kcWlfaWdyYWNlID0gYmUzMl90b19jcHUobHZiLT5sdmJfaWdyYWNlKTsKKwkJb2luZm8tPmRxaV9zeW5jbXMgPSBiZTMyX3RvX2NwdShsdmItPmx2Yl9zeW5jbXMpOworCQlvaW5mby0+ZHFpX2dpLmRxaV9ibG9ja3MgPSBiZTMyX3RvX2NwdShsdmItPmx2Yl9ibG9ja3MpOworCQlvaW5mby0+ZHFpX2dpLmRxaV9mcmVlX2JsayA9IGJlMzJfdG9fY3B1KGx2Yi0+bHZiX2ZyZWVfYmxrKTsKKwkJb2luZm8tPmRxaV9naS5kcWlfZnJlZV9lbnRyeSA9CisJCQkJCWJlMzJfdG9fY3B1KGx2Yi0+bHZiX2ZyZWVfZW50cnkpOworCX0gZWxzZSB7CisJCXN0YXR1cyA9IG9jZnMyX3JlYWRfcXVvdGFfYmxvY2sob2luZm8tPmRxaV9ncWlub2RlLCAwLCAmYmgpOworCQlpZiAoc3RhdHVzKSB7CisJCQltbG9nX2Vycm5vKHN0YXR1cyk7CisJCQlnb3RvIGJhaWw7CisJCX0KKwkJZ2RpbmZvID0gKHN0cnVjdCBvY2ZzMl9nbG9iYWxfZGlza19kcWluZm8gKikKKwkJCQkJKGJoLT5iX2RhdGEgKyBPQ0ZTMl9HTE9CQUxfSU5GT19PRkYpOworCQlpbmZvLT5kcWlfYmdyYWNlID0gbGUzMl90b19jcHUoZ2RpbmZvLT5kcWlfYmdyYWNlKTsKKwkJaW5mby0+ZHFpX2lncmFjZSA9IGxlMzJfdG9fY3B1KGdkaW5mby0+ZHFpX2lncmFjZSk7CisJCW9pbmZvLT5kcWlfc3luY21zID0gbGUzMl90b19jcHUoZ2RpbmZvLT5kcWlfc3luY21zKTsKKwkJb2luZm8tPmRxaV9naS5kcWlfYmxvY2tzID0gbGUzMl90b19jcHUoZ2RpbmZvLT5kcWlfYmxvY2tzKTsKKwkJb2luZm8tPmRxaV9naS5kcWlfZnJlZV9ibGsgPSBsZTMyX3RvX2NwdShnZGluZm8tPmRxaV9mcmVlX2Jsayk7CisJCW9pbmZvLT5kcWlfZ2kuZHFpX2ZyZWVfZW50cnkgPQorCQkJCQlsZTMyX3RvX2NwdShnZGluZm8tPmRxaV9mcmVlX2VudHJ5KTsKKwkJYnJlbHNlKGJoKTsKKwkJb2NmczJfdHJhY2tfbG9ja19yZWZyZXNoKGxvY2tyZXMpOworCX0KKworYmFpbDoKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKiBMb2NrIHF1b3RhIGluZm8sIHRoaXMgZnVuY3Rpb24gZXhwZWN0cyBhdCBsZWFzdCBzaGFyZWQgbG9jayBvbiB0aGUgcXVvdGEgZmlsZQorICogc28gdGhhdCB3ZSBjYW4gc2FmZWx5IHJlZnJlc2ggcXVvdGEgaW5mbyBmcm9tIGRpc2suICovCitpbnQgb2NmczJfcWluZm9fbG9jayhzdHJ1Y3Qgb2NmczJfbWVtX2RxaW5mbyAqb2luZm8sIGludCBleCkKK3sKKwlzdHJ1Y3Qgb2NmczJfbG9ja19yZXMgKmxvY2tyZXMgPSAmb2luZm8tPmRxaV9ncWxvY2s7CisJc3RydWN0IG9jZnMyX3N1cGVyICpvc2IgPSBPQ0ZTMl9TQihvaW5mby0+ZHFpX2dpLmRxaV9zYik7CisJaW50IGxldmVsID0gZXggPyBETE1fTE9DS19FWCA6IERMTV9MT0NLX1BSOworCWludCBzdGF0dXMgPSAwOworCisJbWxvZ19lbnRyeV92b2lkKCk7CisKKwkvKiBPbiBSTyBkZXZpY2VzLCBsb2NraW5nIHJlYWxseSBpc24ndCBuZWVkZWQuLi4gKi8KKwlpZiAob2NmczJfaXNfaGFyZF9yZWFkb25seShvc2IpKSB7CisJCWlmIChleCkKKwkJCXN0YXR1cyA9IC1FUk9GUzsKKwkJZ290byBiYWlsOworCX0KKwlpZiAob2NmczJfbW91bnRfbG9jYWwob3NiKSkKKwkJZ290byBiYWlsOworCisJc3RhdHVzID0gb2NmczJfY2x1c3Rlcl9sb2NrKG9zYiwgbG9ja3JlcywgbGV2ZWwsIDAsIDApOworCWlmIChzdGF0dXMgPCAwKSB7CisJCW1sb2dfZXJybm8oc3RhdHVzKTsKKwkJZ290byBiYWlsOworCX0KKwlpZiAoIW9jZnMyX3Nob3VsZF9yZWZyZXNoX2xvY2tfcmVzKGxvY2tyZXMpKQorCQlnb3RvIGJhaWw7CisJLyogT0ssIHdlIGhhdmUgdGhlIGxvY2sgYnV0IHdlIG5lZWQgdG8gcmVmcmVzaCB0aGUgcXVvdGEgaW5mbyAqLworCXN0YXR1cyA9IG9jZnMyX3JlZnJlc2hfcWluZm8ob2luZm8pOworCWlmIChzdGF0dXMpCisJCW9jZnMyX3FpbmZvX3VubG9jayhvaW5mbywgZXgpOworCW9jZnMyX2NvbXBsZXRlX2xvY2tfcmVzX3JlZnJlc2gobG9ja3Jlcywgc3RhdHVzKTsKK2JhaWw6CisJbWxvZ19leGl0KHN0YXR1cyk7CisJcmV0dXJuIHN0YXR1czsKK30KKwogLyoKICAqIFRoaXMgaXMgdGhlIGZpbGVzeXN0ZW0gbG9ja2luZyBwcm90b2NvbC4gIEl0IHByb3ZpZGVzIHRoZSBsb2NrIGhhbmRsaW5nCiAgKiBob29rcyBmb3IgdGhlIHVuZGVybHlpbmcgRExNLiAgSXQgaGFzIGEgbWF4aW11bSB2ZXJzaW9uIG51bWJlci4KZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2RsbWdsdWUuaCBiL2ZzL29jZnMyL2RsbWdsdWUuaAppbmRleCAyYmIwMWYwLi4zZjhkOTk4IDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9kbG1nbHVlLmgKKysrIGIvZnMvb2NmczIvZGxtZ2x1ZS5oCkBAIC00OSw2ICs0OSwxOSBAQAogCV9fYmUzMiAgICAgICBsdmJfcmVzZXJ2ZWQyOwogfTsKIAorI2RlZmluZSBPQ0ZTMl9RSU5GT19MVkJfVkVSU0lPTiAxCisKK3N0cnVjdCBvY2ZzMl9xaW5mb19sdmIgeworCV9fdTgJbHZiX3ZlcnNpb247CisJX191OAlsdmJfcmVzZXJ2ZWRbM107CisJX19iZTMyCWx2Yl9iZ3JhY2U7CisJX19iZTMyCWx2Yl9pZ3JhY2U7CisJX19iZTMyCWx2Yl9zeW5jbXM7CisJX19iZTMyCWx2Yl9ibG9ja3M7CisJX19iZTMyCWx2Yl9mcmVlX2JsazsKKwlfX2JlMzIJbHZiX2ZyZWVfZW50cnk7Cit9OworCiAvKiBvY2ZzMl9pbm9kZV9sb2NrX2Z1bGwoKSAnYXJnX2ZsYWdzJyBmbGFncyAqLwogLyogZG9uJ3Qgd2FpdCBvbiByZWNvdmVyeS4gKi8KICNkZWZpbmUgT0NGUzJfTUVUQV9MT0NLX1JFQ09WRVJZCSgweDAxKQpAQCAtNjksNiArODIsOSBAQAogc3RydWN0IG9jZnMyX2ZpbGVfcHJpdmF0ZTsKIHZvaWQgb2NmczJfZmlsZV9sb2NrX3Jlc19pbml0KHN0cnVjdCBvY2ZzMl9sb2NrX3JlcyAqbG9ja3JlcywKIAkJCSAgICAgIHN0cnVjdCBvY2ZzMl9maWxlX3ByaXZhdGUgKmZwKTsKK3N0cnVjdCBvY2ZzMl9tZW1fZHFpbmZvOwordm9pZCBvY2ZzMl9xaW5mb19sb2NrX3Jlc19pbml0KHN0cnVjdCBvY2ZzMl9sb2NrX3JlcyAqbG9ja3JlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgb2NmczJfbWVtX2RxaW5mbyAqaW5mbyk7CiB2b2lkIG9jZnMyX2xvY2tfcmVzX2ZyZWUoc3RydWN0IG9jZnMyX2xvY2tfcmVzICpyZXMpOwogaW50IG9jZnMyX2NyZWF0ZV9uZXdfaW5vZGVfbG9ja3Moc3RydWN0IGlub2RlICppbm9kZSk7CiBpbnQgb2NmczJfZHJvcF9pbm9kZV9sb2NrcyhzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKQEAgLTEwMyw2ICsxMTksOSBAQAogdm9pZCBvY2ZzMl9kZW50cnlfdW5sb2NrKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IGV4KTsKIGludCBvY2ZzMl9maWxlX2xvY2soc3RydWN0IGZpbGUgKmZpbGUsIGludCBleCwgaW50IHRyeWxvY2spOwogdm9pZCBvY2ZzMl9maWxlX3VubG9jayhzdHJ1Y3QgZmlsZSAqZmlsZSk7CitpbnQgb2NmczJfcWluZm9fbG9jayhzdHJ1Y3Qgb2NmczJfbWVtX2RxaW5mbyAqb2luZm8sIGludCBleCk7Cit2b2lkIG9jZnMyX3FpbmZvX3VubG9jayhzdHJ1Y3Qgb2NmczJfbWVtX2RxaW5mbyAqb2luZm8sIGludCBleCk7CisKIAogdm9pZCBvY2ZzMl9tYXJrX2xvY2tyZXNfZnJlZWluZyhzdHJ1Y3Qgb2NmczJfbG9ja19yZXMgKmxvY2tyZXMpOwogdm9pZCBvY2ZzMl9zaW1wbGVfZHJvcF9sb2NrcmVzKHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiLApkaWZmIC0tZ2l0IGEvZnMvb2NmczIvZXh0ZW50X21hcC5jIGIvZnMvb2NmczIvZXh0ZW50X21hcC5jCmluZGV4IDJiYWVkYWMuLmYyYmIxYTAgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2V4dGVudF9tYXAuYworKysgYi9mcy9vY2ZzMi9leHRlbnRfbWFwLmMKQEAgLTI5Myw3ICsyOTMsNyBAQAogCXN0cnVjdCBvY2ZzMl9leHRlbnRfYmxvY2sgKmViOwogCXN0cnVjdCBvY2ZzMl9leHRlbnRfbGlzdCAqZWw7CiAKLQlyZXQgPSBvY2ZzMl9yZWFkX2Jsb2NrKGlub2RlLCBsYXN0X2ViX2JsaywgJmViX2JoKTsKKwlyZXQgPSBvY2ZzMl9yZWFkX2V4dGVudF9ibG9jayhpbm9kZSwgbGFzdF9lYl9ibGssICZlYl9iaCk7CiAJaWYgKHJldCkgewogCQltbG9nX2Vycm5vKHJldCk7CiAJCWdvdG8gb3V0OwpAQCAtMzAyLDEyICszMDIsNiBAQAogCWViID0gKHN0cnVjdCBvY2ZzMl9leHRlbnRfYmxvY2sgKikgZWJfYmgtPmJfZGF0YTsKIAllbCA9ICZlYi0+aF9saXN0OwogCi0JaWYgKCFPQ0ZTMl9JU19WQUxJRF9FWFRFTlRfQkxPQ0soZWIpKSB7Ci0JCXJldCA9IC1FUk9GUzsKLQkJT0NGUzJfUk9fT05fSU5WQUxJRF9FWFRFTlRfQkxPQ0soaW5vZGUtPmlfc2IsIGViKTsKLQkJZ290byBvdXQ7Ci0JfQotCiAJaWYgKGVsLT5sX3RyZWVfZGVwdGgpIHsKIAkJb2NmczJfZXJyb3IoaW5vZGUtPmlfc2IsCiAJCQkgICAgIklub2RlICVsdSBoYXMgbm9uIHplcm8gdHJlZSBkZXB0aCBpbiAiCkBAIC0zODEsMjMgKzM3NSwxNiBAQAogCQlpZiAobGU2NF90b19jcHUoZWItPmhfbmV4dF9sZWFmX2JsaykgPT0gMFVMTCkKIAkJCWdvdG8gbm9fbW9yZV9leHRlbnRzOwogCi0JCXJldCA9IG9jZnMyX3JlYWRfYmxvY2soaW5vZGUsCi0JCQkJICAgICAgIGxlNjRfdG9fY3B1KGViLT5oX25leHRfbGVhZl9ibGspLAotCQkJCSAgICAgICAmbmV4dF9lYl9iaCk7CisJCXJldCA9IG9jZnMyX3JlYWRfZXh0ZW50X2Jsb2NrKGlub2RlLAorCQkJCQkgICAgICBsZTY0X3RvX2NwdShlYi0+aF9uZXh0X2xlYWZfYmxrKSwKKwkJCQkJICAgICAgJm5leHRfZWJfYmgpOwogCQlpZiAocmV0KSB7CiAJCQltbG9nX2Vycm5vKHJldCk7CiAJCQlnb3RvIG91dDsKIAkJfQorCiAJCW5leHRfZWIgPSAoc3RydWN0IG9jZnMyX2V4dGVudF9ibG9jayAqKW5leHRfZWJfYmgtPmJfZGF0YTsKLQotCQlpZiAoIU9DRlMyX0lTX1ZBTElEX0VYVEVOVF9CTE9DSyhuZXh0X2ViKSkgewotCQkJcmV0ID0gLUVST0ZTOwotCQkJT0NGUzJfUk9fT05fSU5WQUxJRF9FWFRFTlRfQkxPQ0soaW5vZGUtPmlfc2IsIG5leHRfZWIpOwotCQkJZ290byBvdXQ7Ci0JCX0KLQogCQllbCA9ICZuZXh0X2ViLT5oX2xpc3Q7Ci0KIAkJaSA9IG9jZnMyX3NlYXJjaF9mb3JfaG9sZV9pbmRleChlbCwgdl9jbHVzdGVyKTsKIAl9CiAKQEAgLTYzMCw3ICs2MTcsNyBAQAogCWlmIChyZXQgPT0gMCkKIAkJZ290byBvdXQ7CiAKLQlyZXQgPSBvY2ZzMl9yZWFkX2Jsb2NrKGlub2RlLCBPQ0ZTMl9JKGlub2RlKS0+aXBfYmxrbm8sICZkaV9iaCk7CisJcmV0ID0gb2NmczJfcmVhZF9pbm9kZV9ibG9jayhpbm9kZSwgJmRpX2JoKTsKIAlpZiAocmV0KSB7CiAJCW1sb2dfZXJybm8ocmV0KTsKIAkJZ290byBvdXQ7CkBAIC04MTksMyArODA2LDc0IEBACiAKIAlyZXR1cm4gcmV0OwogfQorCitpbnQgb2NmczJfcmVhZF92aXJ0X2Jsb2NrcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1NjQgdl9ibG9jaywgaW50IG5yLAorCQkJICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaHNbXSwgaW50IGZsYWdzLAorCQkJICAgaW50ICgqdmFsaWRhdGUpKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCQkJCSAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpKQoreworCWludCByYyA9IDA7CisJdTY0IHBfYmxvY2ssIHBfY291bnQ7CisJaW50IGksIGNvdW50LCBkb25lID0gMDsKKworCW1sb2dfZW50cnkoIihpbm9kZSA9ICVwLCB2X2Jsb2NrID0gJWxsdSwgbnIgPSAlZCwgYmhzID0gJXAsICIKKwkJICAgImZsYWdzID0gJXgsIHZhbGlkYXRlID0gJXApXG4iLAorCQkgICBpbm9kZSwgKHVuc2lnbmVkIGxvbmcgbG9uZyl2X2Jsb2NrLCBuciwgYmhzLCBmbGFncywKKwkJICAgdmFsaWRhdGUpOworCisJaWYgKCgodl9ibG9jayArIG5yIC0gMSkgPDwgaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplX2JpdHMpID49CisJICAgIGlfc2l6ZV9yZWFkKGlub2RlKSkgeworCQlCVUdfT04oIShmbGFncyAmIE9DRlMyX0JIX1JFQURBSEVBRCkpOworCQlnb3RvIG91dDsKKwl9CisKKwl3aGlsZSAoZG9uZSA8IG5yKSB7CisJCWRvd25fcmVhZCgmT0NGUzJfSShpbm9kZSktPmlwX2FsbG9jX3NlbSk7CisJCXJjID0gb2NmczJfZXh0ZW50X21hcF9nZXRfYmxvY2tzKGlub2RlLCB2X2Jsb2NrICsgZG9uZSwKKwkJCQkJCSAmcF9ibG9jaywgJnBfY291bnQsIE5VTEwpOworCQl1cF9yZWFkKCZPQ0ZTMl9JKGlub2RlKS0+aXBfYWxsb2Nfc2VtKTsKKwkJaWYgKHJjKSB7CisJCQltbG9nX2Vycm5vKHJjKTsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKCFwX2Jsb2NrKSB7CisJCQlyYyA9IC1FSU87CisJCQltbG9nKE1MX0VSUk9SLAorCQkJICAgICAiSW5vZGUgIyVsbHUgY29udGFpbnMgYSBob2xlIGF0IG9mZnNldCAlbGx1XG4iLAorCQkJICAgICAodW5zaWduZWQgbG9uZyBsb25nKU9DRlMyX0koaW5vZGUpLT5pcF9ibGtubywKKwkJCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykodl9ibG9jayArIGRvbmUpIDw8CisJCQkgICAgIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzKTsKKwkJCWJyZWFrOworCQl9CisKKwkJY291bnQgPSBuciAtIGRvbmU7CisJCWlmIChwX2NvdW50IDwgY291bnQpCisJCQljb3VudCA9IHBfY291bnQ7CisKKwkJLyoKKwkJICogSWYgdGhlIGNhbGxlciBwYXNzZWQgdXMgYmhzLCB0aGV5IHNob3VsZCBoYXZlIGNvbWUKKwkJICogZnJvbSBhIHByZXZpb3VzIHJlYWRhaGVhZCBjYWxsIHRvIHRoaXMgZnVuY3Rpb24uICBUaHVzLAorCQkgKiB0aGV5IHNob3VsZCBoYXZlIHRoZSByaWdodCBiX2Jsb2NrbnIuCisJCSAqLworCQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCQkJaWYgKCFiaHNbZG9uZSArIGldKQorCQkJCWNvbnRpbnVlOworCQkJQlVHX09OKGJoc1tkb25lICsgaV0tPmJfYmxvY2tuciAhPSAocF9ibG9jayArIGkpKTsKKwkJfQorCisJCXJjID0gb2NmczJfcmVhZF9ibG9ja3MoaW5vZGUsIHBfYmxvY2ssIGNvdW50LCBiaHMgKyBkb25lLAorCQkJCSAgICAgICBmbGFncywgdmFsaWRhdGUpOworCQlpZiAocmMpIHsKKwkJCW1sb2dfZXJybm8ocmMpOworCQkJYnJlYWs7CisJCX0KKwkJZG9uZSArPSBjb3VudDsKKwl9CisKK291dDoKKwltbG9nX2V4aXQocmMpOworCXJldHVybiByYzsKK30KKworCmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9leHRlbnRfbWFwLmggYi9mcy9vY2ZzMi9leHRlbnRfbWFwLmgKaW5kZXggMWM0YWE4Yi4uYjdkZDk3MyAxMDA2NDQKLS0tIGEvZnMvb2NmczIvZXh0ZW50X21hcC5oCisrKyBiL2ZzL29jZnMyL2V4dGVudF9tYXAuaApAQCAtNTcsNCArNTcsMjggQEAKIAkJCSAgICAgdTMyICpwX2NsdXN0ZXIsIHUzMiAqbnVtX2NsdXN0ZXJzLAogCQkJICAgICBzdHJ1Y3Qgb2NmczJfZXh0ZW50X2xpc3QgKmVsKTsKIAoraW50IG9jZnMyX3JlYWRfdmlydF9ibG9ja3Moc3RydWN0IGlub2RlICppbm9kZSwgdTY0IHZfYmxvY2ssIGludCBuciwKKwkJCSAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmhzW10sIGludCBmbGFncywKKwkJCSAgIGludCAoKnZhbGlkYXRlKShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQkJCQkgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKSk7CitzdGF0aWMgaW5saW5lIGludCBvY2ZzMl9yZWFkX3ZpcnRfYmxvY2soc3RydWN0IGlub2RlICppbm9kZSwgdTY0IHZfYmxvY2ssCisJCQkJCXN0cnVjdCBidWZmZXJfaGVhZCAqKmJoLAorCQkJCQlpbnQgKCp2YWxpZGF0ZSkoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJCQkJCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKSkKK3sKKwlpbnQgc3RhdHVzID0gMDsKKworCWlmIChiaCA9PSBOVUxMKSB7CisJCXByaW50aygib2NmczI6IGJoID09IE5VTExcbiIpOworCQlzdGF0dXMgPSAtRUlOVkFMOworCQlnb3RvIGJhaWw7CisJfQorCisJc3RhdHVzID0gb2NmczJfcmVhZF92aXJ0X2Jsb2Nrcyhpbm9kZSwgdl9ibG9jaywgMSwgYmgsIDAsIHZhbGlkYXRlKTsKKworYmFpbDoKKwlyZXR1cm4gc3RhdHVzOworfQorCisKICNlbmRpZiAgLyogX0VYVEVOVF9NQVBfSCAqLwpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvZmlsZS5jIGIvZnMvb2NmczIvZmlsZS5jCmluZGV4IGUyNTcwYTMuLmE1ODg3ZGYgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2ZpbGUuYworKysgYi9mcy9vY2ZzMi9maWxlLmMKQEAgLTM1LDYgKzM1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tb3VudC5oPgogI2luY2x1ZGUgPGxpbnV4L3dyaXRlYmFjay5oPgogI2luY2x1ZGUgPGxpbnV4L2ZhbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L3F1b3Rhb3BzLmg+CiAKICNkZWZpbmUgTUxPR19NQVNLX1BSRUZJWCBNTF9JTk9ERQogI2luY2x1ZGUgPGNsdXN0ZXIvbWFza2xvZy5oPgpAQCAtNTYsNiArNTcsOCBAQAogI2luY2x1ZGUgInN1YmFsbG9jLmgiCiAjaW5jbHVkZSAic3VwZXIuaCIKICNpbmNsdWRlICJ4YXR0ci5oIgorI2luY2x1ZGUgImFjbC5oIgorI2luY2x1ZGUgInF1b3RhLmgiCiAKICNpbmNsdWRlICJidWZmZXJfaGVhZF9pby5oIgogCkBAIC0yNTMsOCArMjU2LDggQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JcmV0ID0gb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwgYmgsCi0JCQkJICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOworCXJldCA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzX2RpKGhhbmRsZSwgaW5vZGUsIGJoLAorCQkJCSAgICAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKIAlpZiAocmV0KSB7CiAJCW1sb2dfZXJybm8ocmV0KTsKIAkJZ290byBvdXRfY29tbWl0OwpAQCAtMzAzLDkgKzMwNiw5IEBACiAJcmV0dXJuIHN0YXR1czsKIH0KIAotc3RhdGljIGludCBvY2ZzMl9zaW1wbGVfc2l6ZV91cGRhdGUoc3RydWN0IGlub2RlICppbm9kZSwKLQkJCQkgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpkaV9iaCwKLQkJCQkgICAgdTY0IG5ld19pX3NpemUpCitpbnQgb2NmczJfc2ltcGxlX3NpemVfdXBkYXRlKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqZGlfYmgsCisJCQkgICAgIHU2NCBuZXdfaV9zaXplKQogewogCWludCByZXQ7CiAJc3RydWN0IG9jZnMyX3N1cGVyICpvc2IgPSBPQ0ZTMl9TQihpbm9kZS0+aV9zYik7CkBAIC0zNTAsOCArMzUzLDggQEAKIAkJZ290byBvdXQ7CiAJfQogCi0Jc3RhdHVzID0gb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwgZmVfYmgsCi0JCQkJICAgICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOworCXN0YXR1cyA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzX2RpKGhhbmRsZSwgaW5vZGUsIGZlX2JoLAorCQkJCQkgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOwogCWlmIChzdGF0dXMgPCAwKSB7CiAJCW1sb2dfZXJybm8oc3RhdHVzKTsKIAkJZ290byBvdXRfY29tbWl0OwpAQCAtNDAxLDEyICs0MDQsOSBAQAogCQkgICAodW5zaWduZWQgbG9uZyBsb25nKU9DRlMyX0koaW5vZGUpLT5pcF9ibGtubywKIAkJICAgKHVuc2lnbmVkIGxvbmcgbG9uZyluZXdfaV9zaXplKTsKIAorCS8qIFdlIHRydXN0IGRpX2JoIGJlY2F1c2UgaXQgY29tZXMgZnJvbSBvY2ZzMl9pbm9kZV9sb2NrKCksIHdoaWNoCisJICogYWxyZWFkeSB2YWxpZGF0ZWQgaXQgKi8KIAlmZSA9IChzdHJ1Y3Qgb2NmczJfZGlub2RlICopIGRpX2JoLT5iX2RhdGE7Ci0JaWYgKCFPQ0ZTMl9JU19WQUxJRF9ESU5PREUoZmUpKSB7Ci0JCU9DRlMyX1JPX09OX0lOVkFMSURfRElOT0RFKGlub2RlLT5pX3NiLCBmZSk7Ci0JCXN0YXR1cyA9IC1FSU87Ci0JCWdvdG8gYmFpbDsKLQl9CiAKIAltbG9nX2J1Z19vbl9tc2cobGU2NF90b19jcHUoZmUtPmlfc2l6ZSkgIT0gaV9zaXplX3JlYWQoaW5vZGUpLAogCQkJIklub2RlICVsbHUsIGlub2RlIGlfc2l6ZSA9ICVsbGQgIT0gZGkgIgpAQCAtNTM2LDYgKzUzNiw3IEBACiAJZW51bSBvY2ZzMl9hbGxvY19yZXN0YXJ0ZWQgd2h5OwogCXN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiID0gT0NGUzJfU0IoaW5vZGUtPmlfc2IpOwogCXN0cnVjdCBvY2ZzMl9leHRlbnRfdHJlZSBldDsKKwlpbnQgZGlkX3F1b3RhID0gMDsKIAogCW1sb2dfZW50cnkoIihjbHVzdGVyc190b19hZGQgPSAldSlcbiIsIGNsdXN0ZXJzX3RvX2FkZCk7CiAKQEAgLTU0NSwxOCArNTQ2LDEyIEBACiAJICovCiAJQlVHX09OKG1hcmtfdW53cml0dGVuICYmICFvY2ZzMl9zcGFyc2VfYWxsb2Mob3NiKSk7CiAKLQlzdGF0dXMgPSBvY2ZzMl9yZWFkX2Jsb2NrKGlub2RlLCBPQ0ZTMl9JKGlub2RlKS0+aXBfYmxrbm8sICZiaCk7CisJc3RhdHVzID0gb2NmczJfcmVhZF9pbm9kZV9ibG9jayhpbm9kZSwgJmJoKTsKIAlpZiAoc3RhdHVzIDwgMCkgewogCQltbG9nX2Vycm5vKHN0YXR1cyk7CiAJCWdvdG8gbGVhdmU7CiAJfQotCiAJZmUgPSAoc3RydWN0IG9jZnMyX2Rpbm9kZSAqKSBiaC0+Yl9kYXRhOwotCWlmICghT0NGUzJfSVNfVkFMSURfRElOT0RFKGZlKSkgewotCQlPQ0ZTMl9ST19PTl9JTlZBTElEX0RJTk9ERShpbm9kZS0+aV9zYiwgZmUpOwotCQlzdGF0dXMgPSAtRUlPOwotCQlnb3RvIGxlYXZlOwotCX0KIAogcmVzdGFydF9hbGw6CiAJQlVHX09OKGxlMzJfdG9fY3B1KGZlLT5pX2NsdXN0ZXJzKSAhPSBPQ0ZTMl9JKGlub2RlKS0+aXBfY2x1c3RlcnMpOwpAQCAtNTg1LDExICs1ODAsMTggQEAKIAl9CiAKIHJlc3RhcnRlZF90cmFuc2FjdGlvbjoKKwlpZiAodmZzX2RxX2FsbG9jX3NwYWNlX25vZGlydHkoaW5vZGUsIG9jZnMyX2NsdXN0ZXJzX3RvX2J5dGVzKG9zYi0+c2IsCisJICAgIGNsdXN0ZXJzX3RvX2FkZCkpKSB7CisJCXN0YXR1cyA9IC1FRFFVT1Q7CisJCWdvdG8gbGVhdmU7CisJfQorCWRpZF9xdW90YSA9IDE7CisKIAkvKiByZXNlcnZlIGEgd3JpdGUgdG8gdGhlIGZpbGUgZW50cnkgZWFybHkgb24gLSB0aGF0IHdlIGlmIHdlCiAJICogcnVuIG91dCBvZiBjcmVkaXRzIGluIHRoZSBhbGxvY2F0aW9uIHBhdGgsIHdlIGNhbiBzdGlsbAogCSAqIHVwZGF0ZSBpX3NpemUuICovCi0Jc3RhdHVzID0gb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwgYmgsCi0JCQkJICAgICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOworCXN0YXR1cyA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzX2RpKGhhbmRsZSwgaW5vZGUsIGJoLAorCQkJCQkgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOwogCWlmIChzdGF0dXMgPCAwKSB7CiAJCW1sb2dfZXJybm8oc3RhdHVzKTsKIAkJZ290byBsZWF2ZTsKQEAgLTYyMiw2ICs2MjQsMTAgQEAKIAlzcGluX2xvY2soJk9DRlMyX0koaW5vZGUpLT5pcF9sb2NrKTsKIAljbHVzdGVyc190b19hZGQgLT0gKE9DRlMyX0koaW5vZGUpLT5pcF9jbHVzdGVycyAtIHByZXZfY2x1c3RlcnMpOwogCXNwaW5fdW5sb2NrKCZPQ0ZTMl9JKGlub2RlKS0+aXBfbG9jayk7CisJLyogUmVsZWFzZSB1bnVzZWQgcXVvdGEgcmVzZXJ2YXRpb24gKi8KKwl2ZnNfZHFfZnJlZV9zcGFjZShpbm9kZSwKKwkJCW9jZnMyX2NsdXN0ZXJzX3RvX2J5dGVzKG9zYi0+c2IsIGNsdXN0ZXJzX3RvX2FkZCkpOworCWRpZF9xdW90YSA9IDA7CiAKIAlpZiAod2h5ICE9IFJFU1RBUlRfTk9ORSAmJiBjbHVzdGVyc190b19hZGQpIHsKIAkJaWYgKHdoeSA9PSBSRVNUQVJUX01FVEEpIHsKQEAgLTY1NCw2ICs2NjAsOSBAQAogCSAgICAgT0NGUzJfSShpbm9kZSktPmlwX2NsdXN0ZXJzLCAobG9uZyBsb25nKWlfc2l6ZV9yZWFkKGlub2RlKSk7CiAKIGxlYXZlOgorCWlmIChzdGF0dXMgPCAwICYmIGRpZF9xdW90YSkKKwkJdmZzX2RxX2ZyZWVfc3BhY2UoaW5vZGUsCisJCQlvY2ZzMl9jbHVzdGVyc190b19ieXRlcyhvc2ItPnNiLCBjbHVzdGVyc190b19hZGQpKTsKIAlpZiAoaGFuZGxlKSB7CiAJCW9jZnMyX2NvbW1pdF90cmFucyhvc2IsIGhhbmRsZSk7CiAJCWhhbmRsZSA9IE5VTEw7CkBAIC04ODUsNiArODk0LDkgQEAKIAlzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiA9IE9DRlMyX1NCKHNiKTsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gTlVMTDsKIAloYW5kbGVfdCAqaGFuZGxlID0gTlVMTDsKKwlpbnQgbG9ja2VkW01BWFFVT1RBU10gPSB7MCwgMH07CisJaW50IGNyZWRpdHMsIHF0eXBlOworCXN0cnVjdCBvY2ZzMl9tZW1fZHFpbmZvICpvaW5mbzsKIAogCW1sb2dfZW50cnkoIigweCVwLCAnJS4qcycpXG4iLCBkZW50cnksCiAJICAgICAgICAgICBkZW50cnktPmRfbmFtZS5sZW4sIGRlbnRyeS0+ZF9uYW1lLm5hbWUpOwpAQCAtOTU1LDExICs5NjcsNDcgQEAKIAkJfQogCX0KIAotCWhhbmRsZSA9IG9jZnMyX3N0YXJ0X3RyYW5zKG9zYiwgT0NGUzJfSU5PREVfVVBEQVRFX0NSRURJVFMpOwotCWlmIChJU19FUlIoaGFuZGxlKSkgewotCQlzdGF0dXMgPSBQVFJfRVJSKGhhbmRsZSk7Ci0JCW1sb2dfZXJybm8oc3RhdHVzKTsKLQkJZ290byBiYWlsX3VubG9jazsKKwlpZiAoKGF0dHItPmlhX3ZhbGlkICYgQVRUUl9VSUQgJiYgYXR0ci0+aWFfdWlkICE9IGlub2RlLT5pX3VpZCkgfHwKKwkgICAgKGF0dHItPmlhX3ZhbGlkICYgQVRUUl9HSUQgJiYgYXR0ci0+aWFfZ2lkICE9IGlub2RlLT5pX2dpZCkpIHsKKwkJY3JlZGl0cyA9IE9DRlMyX0lOT0RFX1VQREFURV9DUkVESVRTOworCQlpZiAoYXR0ci0+aWFfdmFsaWQgJiBBVFRSX1VJRCAmJiBhdHRyLT5pYV91aWQgIT0gaW5vZGUtPmlfdWlkCisJCSAgICAmJiBPQ0ZTMl9IQVNfUk9fQ09NUEFUX0ZFQVRVUkUoc2IsCisJCSAgICBPQ0ZTMl9GRUFUVVJFX1JPX0NPTVBBVF9VU1JRVU9UQSkpIHsKKwkJCW9pbmZvID0gc2JfZHFpbmZvKHNiLCBVU1JRVU9UQSktPmRxaV9wcml2OworCQkJc3RhdHVzID0gb2NmczJfbG9ja19nbG9iYWxfcWYob2luZm8sIDEpOworCQkJaWYgKHN0YXR1cyA8IDApCisJCQkJZ290byBiYWlsX3VubG9jazsKKwkJCWNyZWRpdHMgKz0gb2NmczJfY2FsY19xaW5pdF9jcmVkaXRzKHNiLCBVU1JRVU9UQSkgKworCQkJCW9jZnMyX2NhbGNfcWRlbF9jcmVkaXRzKHNiLCBVU1JRVU9UQSk7CisJCQlsb2NrZWRbVVNSUVVPVEFdID0gMTsKKwkJfQorCQlpZiAoYXR0ci0+aWFfdmFsaWQgJiBBVFRSX0dJRCAmJiBhdHRyLT5pYV9naWQgIT0gaW5vZGUtPmlfZ2lkCisJCSAgICAmJiBPQ0ZTMl9IQVNfUk9fQ09NUEFUX0ZFQVRVUkUoc2IsCisJCSAgICBPQ0ZTMl9GRUFUVVJFX1JPX0NPTVBBVF9HUlBRVU9UQSkpIHsKKwkJCW9pbmZvID0gc2JfZHFpbmZvKHNiLCBHUlBRVU9UQSktPmRxaV9wcml2OworCQkJc3RhdHVzID0gb2NmczJfbG9ja19nbG9iYWxfcWYob2luZm8sIDEpOworCQkJaWYgKHN0YXR1cyA8IDApCisJCQkJZ290byBiYWlsX3VubG9jazsKKwkJCWNyZWRpdHMgKz0gb2NmczJfY2FsY19xaW5pdF9jcmVkaXRzKHNiLCBHUlBRVU9UQSkgKworCQkJCSAgIG9jZnMyX2NhbGNfcWRlbF9jcmVkaXRzKHNiLCBHUlBRVU9UQSk7CisJCQlsb2NrZWRbR1JQUVVPVEFdID0gMTsKKwkJfQorCQloYW5kbGUgPSBvY2ZzMl9zdGFydF90cmFucyhvc2IsIGNyZWRpdHMpOworCQlpZiAoSVNfRVJSKGhhbmRsZSkpIHsKKwkJCXN0YXR1cyA9IFBUUl9FUlIoaGFuZGxlKTsKKwkJCW1sb2dfZXJybm8oc3RhdHVzKTsKKwkJCWdvdG8gYmFpbF91bmxvY2s7CisJCX0KKwkJc3RhdHVzID0gdmZzX2RxX3RyYW5zZmVyKGlub2RlLCBhdHRyKSA/IC1FRFFVT1QgOiAwOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gYmFpbF9jb21taXQ7CisJfSBlbHNlIHsKKwkJaGFuZGxlID0gb2NmczJfc3RhcnRfdHJhbnMob3NiLCBPQ0ZTMl9JTk9ERV9VUERBVEVfQ1JFRElUUyk7CisJCWlmIChJU19FUlIoaGFuZGxlKSkgeworCQkJc3RhdHVzID0gUFRSX0VSUihoYW5kbGUpOworCQkJbWxvZ19lcnJubyhzdGF0dXMpOworCQkJZ290byBiYWlsX3VubG9jazsKKwkJfQogCX0KIAogCS8qCkBAIC05ODIsNiArMTAzMCwxMiBAQAogYmFpbF9jb21taXQ6CiAJb2NmczJfY29tbWl0X3RyYW5zKG9zYiwgaGFuZGxlKTsKIGJhaWxfdW5sb2NrOgorCWZvciAocXR5cGUgPSAwOyBxdHlwZSA8IE1BWFFVT1RBUzsgcXR5cGUrKykgeworCQlpZiAoIWxvY2tlZFtxdHlwZV0pCisJCQljb250aW51ZTsKKwkJb2luZm8gPSBzYl9kcWluZm8oc2IsIHF0eXBlKS0+ZHFpX3ByaXY7CisJCW9jZnMyX3VubG9ja19nbG9iYWxfcWYob2luZm8sIDEpOworCX0KIAlvY2ZzMl9pbm9kZV91bmxvY2soaW5vZGUsIDEpOwogYmFpbF91bmxvY2tfcnc6CiAJaWYgKHNpemVfY2hhbmdlKQpAQCAtOTg5LDYgKzEwNDMsMTIgQEAKIGJhaWw6CiAJYnJlbHNlKGJoKTsKIAorCWlmICghc3RhdHVzICYmIGF0dHItPmlhX3ZhbGlkICYgQVRUUl9NT0RFKSB7CisJCXN0YXR1cyA9IG9jZnMyX2FjbF9jaG1vZChpbm9kZSk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJbWxvZ19lcnJubyhzdGF0dXMpOworCX0KKwogCW1sb2dfZXhpdChzdGF0dXMpOwogCXJldHVybiBzdGF0dXM7CiB9CkBAIC0xMDM1LDcgKzEwOTUsNyBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQlyZXQgPSBnZW5lcmljX3Blcm1pc3Npb24oaW5vZGUsIG1hc2ssIE5VTEwpOworCXJldCA9IGdlbmVyaWNfcGVybWlzc2lvbihpbm9kZSwgbWFzaywgb2NmczJfY2hlY2tfYWNsKTsKIAogCW9jZnMyX2lub2RlX3VubG9jayhpbm9kZSwgMCk7CiBvdXQ6CkBAIC0xMDYxLDggKzExMjEsOCBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQlyZXQgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGlub2RlLCBiaCwKLQkJCQkgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CisJcmV0ID0gb2NmczJfam91cm5hbF9hY2Nlc3NfZGkoaGFuZGxlLCBpbm9kZSwgYmgsCisJCQkJICAgICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOwogCWlmIChyZXQgPCAwKSB7CiAJCW1sb2dfZXJybm8ocmV0KTsKIAkJZ290byBvdXRfdHJhbnM7CkBAIC0xMTI4LDkgKzExODgsOCBAQAogewogCWludCByZXQ7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IE5VTEw7Ci0Jc3RydWN0IG9jZnMyX2lub2RlX2luZm8gKm9pID0gT0NGUzJfSShpbm9kZSk7CiAKLQlyZXQgPSBvY2ZzMl9yZWFkX2Jsb2NrKGlub2RlLCBvaS0+aXBfYmxrbm8sICZiaCk7CisJcmV0ID0gb2NmczJfcmVhZF9pbm9kZV9ibG9jayhpbm9kZSwgJmJoKTsKIAlpZiAocmV0IDwgMCkgewogCQltbG9nX2Vycm5vKHJldCk7CiAJCWdvdG8gb3V0OwpAQCAtMTE1Niw4ICsxMjE1LDcgQEAKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRpX2JoID0gTlVMTDsKIAogCWlmIChPQ0ZTMl9JKGlub2RlKS0+aXBfZHluX2ZlYXR1cmVzICYgT0NGUzJfSU5MSU5FX0RBVEFfRkwpIHsKLQkJcmV0ID0gb2NmczJfcmVhZF9ibG9jayhpbm9kZSwgT0NGUzJfSShpbm9kZSktPmlwX2Jsa25vLAotCQkJCSAgICAgICAmZGlfYmgpOworCQlyZXQgPSBvY2ZzMl9yZWFkX2lub2RlX2Jsb2NrKGlub2RlLCAmZGlfYmgpOwogCQlpZiAocmV0KSB7CiAJCQltbG9nX2Vycm5vKHJldCk7CiAJCQlnb3RvIG91dDsKQEAgLTEyMjYsODMgKzEyODQsNiBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgX19vY2ZzMl9yZW1vdmVfaW5vZGVfcmFuZ2Uoc3RydWN0IGlub2RlICppbm9kZSwKLQkJCQkgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRpX2JoLAotCQkJCSAgICAgIHUzMiBjcG9zLCB1MzIgcGh5c19jcG9zLCB1MzIgbGVuLAotCQkJCSAgICAgIHN0cnVjdCBvY2ZzMl9jYWNoZWRfZGVhbGxvY19jdHh0ICpkZWFsbG9jKQotewotCWludCByZXQ7Ci0JdTY0IHBoeXNfYmxrbm8gPSBvY2ZzMl9jbHVzdGVyc190b19ibG9ja3MoaW5vZGUtPmlfc2IsIHBoeXNfY3Bvcyk7Ci0Jc3RydWN0IG9jZnMyX3N1cGVyICpvc2IgPSBPQ0ZTMl9TQihpbm9kZS0+aV9zYik7Ci0Jc3RydWN0IGlub2RlICp0bF9pbm9kZSA9IG9zYi0+b3NiX3RsX2lub2RlOwotCWhhbmRsZV90ICpoYW5kbGU7Ci0Jc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKm1ldGFfYWMgPSBOVUxMOwotCXN0cnVjdCBvY2ZzMl9kaW5vZGUgKmRpID0gKHN0cnVjdCBvY2ZzMl9kaW5vZGUgKilkaV9iaC0+Yl9kYXRhOwotCXN0cnVjdCBvY2ZzMl9leHRlbnRfdHJlZSBldDsKLQotCW9jZnMyX2luaXRfZGlub2RlX2V4dGVudF90cmVlKCZldCwgaW5vZGUsIGRpX2JoKTsKLQotCXJldCA9IG9jZnMyX2xvY2tfYWxsb2NhdG9ycyhpbm9kZSwgJmV0LCAwLCAxLCBOVUxMLCAmbWV0YV9hYyk7Ci0JaWYgKHJldCkgewotCQltbG9nX2Vycm5vKHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JbXV0ZXhfbG9jaygmdGxfaW5vZGUtPmlfbXV0ZXgpOwotCi0JaWYgKG9jZnMyX3RydW5jYXRlX2xvZ19uZWVkc19mbHVzaChvc2IpKSB7Ci0JCXJldCA9IF9fb2NmczJfZmx1c2hfdHJ1bmNhdGVfbG9nKG9zYik7Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQltbG9nX2Vycm5vKHJldCk7Ci0JCQlnb3RvIG91dDsKLQkJfQotCX0KLQotCWhhbmRsZSA9IG9jZnMyX3N0YXJ0X3RyYW5zKG9zYiwgT0NGUzJfUkVNT1ZFX0VYVEVOVF9DUkVESVRTKTsKLQlpZiAoSVNfRVJSKGhhbmRsZSkpIHsKLQkJcmV0ID0gUFRSX0VSUihoYW5kbGUpOwotCQltbG9nX2Vycm5vKHJldCk7Ci0JCWdvdG8gb3V0OwotCX0KLQotCXJldCA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgaW5vZGUsIGRpX2JoLAotCQkJCSAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKLQlpZiAocmV0KSB7Ci0JCW1sb2dfZXJybm8ocmV0KTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JcmV0ID0gb2NmczJfcmVtb3ZlX2V4dGVudChpbm9kZSwgJmV0LCBjcG9zLCBsZW4sIGhhbmRsZSwgbWV0YV9hYywKLQkJCQkgIGRlYWxsb2MpOwotCWlmIChyZXQpIHsKLQkJbWxvZ19lcnJubyhyZXQpOwotCQlnb3RvIG91dF9jb21taXQ7Ci0JfQotCi0JT0NGUzJfSShpbm9kZSktPmlwX2NsdXN0ZXJzIC09IGxlbjsKLQlkaS0+aV9jbHVzdGVycyA9IGNwdV90b19sZTMyKE9DRlMyX0koaW5vZGUpLT5pcF9jbHVzdGVycyk7Ci0KLQlyZXQgPSBvY2ZzMl9qb3VybmFsX2RpcnR5KGhhbmRsZSwgZGlfYmgpOwotCWlmIChyZXQpIHsKLQkJbWxvZ19lcnJubyhyZXQpOwotCQlnb3RvIG91dF9jb21taXQ7Ci0JfQotCi0JcmV0ID0gb2NmczJfdHJ1bmNhdGVfbG9nX2FwcGVuZChvc2IsIGhhbmRsZSwgcGh5c19ibGtubywgbGVuKTsKLQlpZiAocmV0KQotCQltbG9nX2Vycm5vKHJldCk7Ci0KLW91dF9jb21taXQ6Ci0Jb2NmczJfY29tbWl0X3RyYW5zKG9zYiwgaGFuZGxlKTsKLW91dDoKLQltdXRleF91bmxvY2soJnRsX2lub2RlLT5pX211dGV4KTsKLQotCWlmIChtZXRhX2FjKQotCQlvY2ZzMl9mcmVlX2FsbG9jX2NvbnRleHQobWV0YV9hYyk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCiAvKgogICogVHJ1bmNhdGUgYSBieXRlIHJhbmdlLCBhdm9pZGluZyBwYWdlcyB3aXRoaW4gcGFydGlhbCBjbHVzdGVycy4gVGhpcwogICogcHJlc2VydmVzIHRob3NlIHBhZ2VzIGZvciB0aGUgemVyb2luZyBjb2RlIHRvIHdyaXRlIHRvLgpAQCAtMTQwMiw3ICsxMzgzLDkgQEAKIAlzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiA9IE9DRlMyX1NCKGlub2RlLT5pX3NiKTsKIAlzdHJ1Y3Qgb2NmczJfY2FjaGVkX2RlYWxsb2NfY3R4dCBkZWFsbG9jOwogCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gaW5vZGUtPmlfbWFwcGluZzsKKwlzdHJ1Y3Qgb2NmczJfZXh0ZW50X3RyZWUgZXQ7CiAKKwlvY2ZzMl9pbml0X2Rpbm9kZV9leHRlbnRfdHJlZSgmZXQsIGlub2RlLCBkaV9iaCk7CiAJb2NmczJfaW5pdF9kZWFsbG9jX2N0eHQoJmRlYWxsb2MpOwogCiAJaWYgKGJ5dGVfbGVuID09IDApCkBAIC0xNDU4LDkgKzE0NDEsOSBAQAogCiAJCS8qIE9ubHkgZG8gd29yayBmb3Igbm9uLWhvbGVzICovCiAJCWlmIChwaHlzX2Nwb3MgIT0gMCkgewotCQkJcmV0ID0gX19vY2ZzMl9yZW1vdmVfaW5vZGVfcmFuZ2UoaW5vZGUsIGRpX2JoLCBjcG9zLAotCQkJCQkJCSBwaHlzX2Nwb3MsIGFsbG9jX3NpemUsCi0JCQkJCQkJICZkZWFsbG9jKTsKKwkJCXJldCA9IG9jZnMyX3JlbW92ZV9idHJlZV9yYW5nZShpbm9kZSwgJmV0LCBjcG9zLAorCQkJCQkJICAgICAgIHBoeXNfY3BvcywgYWxsb2Nfc2l6ZSwKKwkJCQkJCSAgICAgICAmZGVhbGxvYyk7CiAJCQlpZiAocmV0KSB7CiAJCQkJbWxvZ19lcnJubyhyZXQpOwogCQkJCWdvdG8gb3V0OwpAQCAtMTYyMiw3ICsxNjA1LDcgQEAKIAkJCSAgICBzdHJ1Y3Qgb2NmczJfc3BhY2VfcmVzdiAqc3IpCiB7CiAJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7Ci0Jc3RydWN0IG9jZnMyX3N1cGVyICpvc2IgPSBPQ0ZTMl9TQihpbm9kZS0+aV9zYik7OworCXN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiID0gT0NGUzJfU0IoaW5vZGUtPmlfc2IpOwogCiAJaWYgKChjbWQgPT0gT0NGUzJfSU9DX1JFU1ZTUCB8fCBjbWQgPT0gT0NGUzJfSU9DX1JFU1ZTUDY0KSAmJgogCSAgICAhb2NmczJfd3JpdGVzX3Vud3JpdHRlbl9leHRlbnRzKG9zYikpCmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9maWxlLmggYi9mcy9vY2ZzMi9maWxlLmgKaW5kZXggZTkyMzgyYy4uMTcyZjlmYiAxMDA2NDQKLS0tIGEvZnMvb2NmczIvZmlsZS5oCisrKyBiL2ZzL29jZnMyL2ZpbGUuaApAQCAtNTEsNiArNTEsOSBAQAogCQkJIHN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICpkYXRhX2FjLAogCQkJIHN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICptZXRhX2FjLAogCQkJIGVudW0gb2NmczJfYWxsb2NfcmVzdGFydGVkICpyZWFzb25fcmV0KTsKK2ludCBvY2ZzMl9zaW1wbGVfc2l6ZV91cGRhdGUoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCSAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpkaV9iaCwKKwkJCSAgICAgdTY0IG5ld19pX3NpemUpOwogaW50IG9jZnMyX2V4dGVuZF9ub19ob2xlcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1NjQgbmV3X2lfc2l6ZSwKIAkJCSAgdTY0IHplcm9fdG8pOwogaW50IG9jZnMyX3NldGF0dHIoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgaWF0dHIgKmF0dHIpOwpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvaW5vZGUuYyBiL2ZzL29jZnMyL2lub2RlLmMKaW5kZXggN2FhMDBkNS4uMjI5ZTcwNyAxMDA2NDQKLS0tIGEvZnMvb2NmczIvaW5vZGUuYworKysgYi9mcy9vY2ZzMi9pbm9kZS5jCkBAIC0yOCw2ICsyOCw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KICNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvcXVvdGFvcHMuaD4KIAogI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KIApAQCAtMzcsNiArMzgsNyBAQAogI2luY2x1ZGUgIm9jZnMyLmgiCiAKICNpbmNsdWRlICJhbGxvYy5oIgorI2luY2x1ZGUgImJsb2NrY2hlY2suaCIKICNpbmNsdWRlICJkbG1nbHVlLmgiCiAjaW5jbHVkZSAiZXh0ZW50X21hcC5oIgogI2luY2x1ZGUgImZpbGUuaCIKQEAgLTIxNCwxMiArMjE2LDExIEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCBvY2ZzMl9wb3B1bGF0ZV9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3Qgb2NmczJfZGlub2RlICpmZSwKLQkJICAgICAJIGludCBjcmVhdGVfaW5vKQordm9pZCBvY2ZzMl9wb3B1bGF0ZV9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3Qgb2NmczJfZGlub2RlICpmZSwKKwkJCSAgaW50IGNyZWF0ZV9pbm8pCiB7CiAJc3RydWN0IHN1cGVyX2Jsb2NrICpzYjsKIAlzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYjsKLQlpbnQgc3RhdHVzID0gLUVJTlZBTDsKIAlpbnQgdXNlX3Bsb2NrcyA9IDE7CiAKIAltbG9nX2VudHJ5KCIoMHglcCwgc2l6ZTolbGx1KVxuIiwgaW5vZGUsCkBAIC0yMzIsMjUgKzIzMywxNyBAQAogCSAgICBvY2ZzMl9tb3VudF9sb2NhbChvc2IpIHx8ICFvY2ZzMl9zdGFja19zdXBwb3J0c19wbG9ja3MoKSkKIAkJdXNlX3Bsb2NrcyA9IDA7CiAKLQkvKiB0aGlzIG1lYW5zIHRoYXQgcmVhZF9pbm9kZSBjYW5ub3QgY3JlYXRlIGEgc3VwZXJibG9jayBpbm9kZQotCSAqIHRvZGF5LiAgY2hhbmdlIGlmIG5lZWRlZC4gKi8KLQlpZiAoIU9DRlMyX0lTX1ZBTElEX0RJTk9ERShmZSkgfHwKLQkgICAgIShmZS0+aV9mbGFncyAmIGNwdV90b19sZTMyKE9DRlMyX1ZBTElEX0ZMKSkpIHsKLQkJbWxvZygwLCAiSW52YWxpZCBkaW5vZGU6IGlfaW5vPSVsdSwgaV9ibGtubz0lbGx1LCAiCi0JCSAgICAgInNpZ25hdHVyZSA9ICUuKnMsIGZsYWdzID0gMHgleFxuIiwKLQkJICAgICBpbm9kZS0+aV9pbm8sCi0JCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylsZTY0X3RvX2NwdShmZS0+aV9ibGtubyksIDcsCi0JCSAgICAgZmUtPmlfc2lnbmF0dXJlLCBsZTMyX3RvX2NwdShmZS0+aV9mbGFncykpOwotCQlnb3RvIGJhaWw7Ci0JfQorCS8qCisJICogVGhlc2UgaGF2ZSBhbGwgYmVlbiBjaGVja2VkIGJ5IG9jZnMyX3JlYWRfaW5vZGVfYmxvY2soKSBvciBzZXQKKwkgKiBieSBvY2ZzMl9ta25vZF9sb2NrZWQoKSwgc28gYSBmYWlsdXJlIGlzIGEgY29kZSBidWcuCisJICovCisJQlVHX09OKCFPQ0ZTMl9JU19WQUxJRF9ESU5PREUoZmUpKTsgIC8qIFRoaXMgbWVhbnMgdGhhdCByZWFkX2lub2RlCisJCQkJCQljYW5ub3QgY3JlYXRlIGEgc3VwZXJibG9jaworCQkJCQkJaW5vZGUgdG9kYXkuICBjaGFuZ2UgaWYKKwkJCQkJCXRoYXQgaXMgbmVlZGVkLiAqLworCUJVR19PTighKGZlLT5pX2ZsYWdzICYgY3B1X3RvX2xlMzIoT0NGUzJfVkFMSURfRkwpKSk7CisJQlVHX09OKGxlMzJfdG9fY3B1KGZlLT5pX2ZzX2dlbmVyYXRpb24pICE9IG9zYi0+ZnNfZ2VuZXJhdGlvbik7CiAKLQlpZiAobGUzMl90b19jcHUoZmUtPmlfZnNfZ2VuZXJhdGlvbikgIT0gb3NiLT5mc19nZW5lcmF0aW9uKSB7Ci0JCW1sb2coTUxfRVJST1IsICJmaWxlIGVudHJ5IGdlbmVyYXRpb24gZG9lcyBub3QgbWF0Y2ggIgotCQkgICAgICJzdXBlcmJsb2NrISBvc2ItPmZzX2dlbmVyYXRpb249JXgsICIKLQkJICAgICAiZmUtPmlfZnNfZ2VuZXJhdGlvbj0leFxuIiwKLQkJICAgICBvc2ItPmZzX2dlbmVyYXRpb24sIGxlMzJfdG9fY3B1KGZlLT5pX2ZzX2dlbmVyYXRpb24pKTsKLQkJZ290byBiYWlsOwotCX0KIAogCU9DRlMyX0koaW5vZGUpLT5pcF9jbHVzdGVycyA9IGxlMzJfdG9fY3B1KGZlLT5pX2NsdXN0ZXJzKTsKIAlPQ0ZTMl9JKGlub2RlKS0+aXBfYXR0ciA9IGxlMzJfdG9fY3B1KGZlLT5pX2F0dHIpOwpAQCAtMjg0LDE0ICsyNzcsMTggQEAKIAogCWlub2RlLT5pX25saW5rID0gbGUxNl90b19jcHUoZmUtPmlfbGlua3NfY291bnQpOwogCi0JaWYgKGZlLT5pX2ZsYWdzICYgY3B1X3RvX2xlMzIoT0NGUzJfU1lTVEVNX0ZMKSkKKwlpZiAoZmUtPmlfZmxhZ3MgJiBjcHVfdG9fbGUzMihPQ0ZTMl9TWVNURU1fRkwpKSB7CiAJCU9DRlMyX0koaW5vZGUpLT5pcF9mbGFncyB8PSBPQ0ZTMl9JTk9ERV9TWVNURU1fRklMRTsKKwkJaW5vZGUtPmlfZmxhZ3MgfD0gU19OT1FVT1RBOworCX0KIAogCWlmIChmZS0+aV9mbGFncyAmIGNwdV90b19sZTMyKE9DRlMyX0xPQ0FMX0FMTE9DX0ZMKSkgewogCQlPQ0ZTMl9JKGlub2RlKS0+aXBfZmxhZ3MgfD0gT0NGUzJfSU5PREVfQklUTUFQOwogCQltbG9nKDAsICJsb2NhbCBhbGxvYyBpbm9kZTogaV9pbm89JWx1XG4iLCBpbm9kZS0+aV9pbm8pOwogCX0gZWxzZSBpZiAoZmUtPmlfZmxhZ3MgJiBjcHVfdG9fbGUzMihPQ0ZTMl9CSVRNQVBfRkwpKSB7CiAJCU9DRlMyX0koaW5vZGUpLT5pcF9mbGFncyB8PSBPQ0ZTMl9JTk9ERV9CSVRNQVA7CisJfSBlbHNlIGlmIChmZS0+aV9mbGFncyAmIGNwdV90b19sZTMyKE9DRlMyX1FVT1RBX0ZMKSkgeworCQlpbm9kZS0+aV9mbGFncyB8PSBTX05PUVVPVEE7CiAJfSBlbHNlIGlmIChmZS0+aV9mbGFncyAmIGNwdV90b19sZTMyKE9DRlMyX1NVUEVSX0JMT0NLX0ZMKSkgewogCQltbG9nKDAsICJzdXBlcmJsb2NrIGlub2RlOiBpX2lubz0lbHVcbiIsIGlub2RlLT5pX2lubyk7CiAJCS8qIHdlIGNhbid0IGFjdHVhbGx5IGhpdCB0aGlzIGFzIHJlYWRfaW5vZGUgY2FuJ3QKQEAgLTM1NCwxMCArMzUxLDcgQEAKIAogCW9jZnMyX3NldF9pbm9kZV9mbGFncyhpbm9kZSk7CiAKLQlzdGF0dXMgPSAwOwotYmFpbDoKLQltbG9nX2V4aXQoc3RhdHVzKTsKLQlyZXR1cm4gc3RhdHVzOworCW1sb2dfZXhpdF92b2lkKCk7CiB9CiAKIHN0YXRpYyBpbnQgb2NmczJfcmVhZF9sb2NrZWRfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSwKQEAgLTQ2MCwxMSArNDU0LDE0IEBACiAJCX0KIAl9CiAKLQlpZiAoY2FuX2xvY2spCi0JCXN0YXR1cyA9IG9jZnMyX3JlYWRfYmxvY2tzKGlub2RlLCBhcmdzLT5maV9ibGtubywgMSwgJmJoLAotCQkJCQkgICBPQ0ZTMl9CSF9JR05PUkVfQ0FDSEUpOwotCWVsc2UKKwlpZiAoY2FuX2xvY2spIHsKKwkJc3RhdHVzID0gb2NmczJfcmVhZF9pbm9kZV9ibG9ja19mdWxsKGlub2RlLCAmYmgsCisJCQkJCQkgICAgIE9DRlMyX0JIX0lHTk9SRV9DQUNIRSk7CisJfSBlbHNlIHsKIAkJc3RhdHVzID0gb2NmczJfcmVhZF9ibG9ja3Nfc3luYyhvc2IsIGFyZ3MtPmZpX2Jsa25vLCAxLCAmYmgpOworCQlpZiAoIXN0YXR1cykKKwkJCXN0YXR1cyA9IG9jZnMyX3ZhbGlkYXRlX2lub2RlX2Jsb2NrKG9zYi0+c2IsIGJoKTsKKwl9CiAJaWYgKHN0YXR1cyA8IDApIHsKIAkJbWxvZ19lcnJubyhzdGF0dXMpOwogCQlnb3RvIGJhaWw7CkBAIC00NzIsMTIgKzQ2OSw2IEBACiAKIAlzdGF0dXMgPSAtRUlOVkFMOwogCWZlID0gKHN0cnVjdCBvY2ZzMl9kaW5vZGUgKikgYmgtPmJfZGF0YTsKLQlpZiAoIU9DRlMyX0lTX1ZBTElEX0RJTk9ERShmZSkpIHsKLQkJbWxvZygwLCAiSW52YWxpZCBkaW5vZGUgIyVsbHU6IHNpZ25hdHVyZSA9ICUuKnNcbiIsCi0JCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylhcmdzLT5maV9ibGtubywgNywKLQkJICAgICBmZS0+aV9zaWduYXR1cmUpOwotCQlnb3RvIGJhaWw7Ci0JfQogCiAJLyoKIAkgKiBUaGlzIGlzIGEgY29kZSBidWcuIFJpZ2h0IG5vdyB0aGUgY2FsbGVyIG5lZWRzIHRvCkBAIC00OTEsMTAgKzQ4Miw5IEBACiAKIAlpZiAoU19JU0NIUihsZTE2X3RvX2NwdShmZS0+aV9tb2RlKSkgfHwKIAkgICAgU19JU0JMSyhsZTE2X3RvX2NwdShmZS0+aV9tb2RlKSkpCi0gICAgCQlpbm9kZS0+aV9yZGV2ID0gaHVnZV9kZWNvZGVfZGV2KGxlNjRfdG9fY3B1KGZlLT5pZDEuZGV2MS5pX3JkZXYpKTsKKwkJaW5vZGUtPmlfcmRldiA9IGh1Z2VfZGVjb2RlX2RldihsZTY0X3RvX2NwdShmZS0+aWQxLmRldjEuaV9yZGV2KSk7CiAKLQlpZiAob2NmczJfcG9wdWxhdGVfaW5vZGUoaW5vZGUsIGZlLCAwKSA8IDApCi0JCWdvdG8gYmFpbDsKKwlvY2ZzMl9wb3B1bGF0ZV9pbm9kZShpbm9kZSwgZmUsIDApOwogCiAJQlVHX09OKGFyZ3MtPmZpX2Jsa25vICE9IGxlNjRfdG9fY3B1KGZlLT5pX2Jsa25vKSk7CiAKQEAgLTU0Nyw4ICs1MzcsOCBAQAogCQkJZ290byBvdXQ7CiAJCX0KIAotCQlzdGF0dXMgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGlub2RlLCBmZV9iaCwKLQkJCQkJICAgICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOworCQlzdGF0dXMgPSBvY2ZzMl9qb3VybmFsX2FjY2Vzc19kaShoYW5kbGUsIGlub2RlLCBmZV9iaCwKKwkJCQkJCSBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CiAJCWlmIChzdGF0dXMgPCAwKSB7CiAJCQltbG9nX2Vycm5vKHN0YXR1cyk7CiAJCQlnb3RvIG91dDsKQEAgLTYxNSw3ICs2MDUsOCBAQAogCQlnb3RvIGJhaWw7CiAJfQogCi0JaGFuZGxlID0gb2NmczJfc3RhcnRfdHJhbnMob3NiLCBPQ0ZTMl9ERUxFVEVfSU5PREVfQ1JFRElUUyk7CisJaGFuZGxlID0gb2NmczJfc3RhcnRfdHJhbnMob3NiLCBPQ0ZTMl9ERUxFVEVfSU5PREVfQ1JFRElUUyArCisJCQkJCW9jZnMyX3F1b3RhX3RyYW5zX2NyZWRpdHMoaW5vZGUtPmlfc2IpKTsKIAlpZiAoSVNfRVJSKGhhbmRsZSkpIHsKIAkJc3RhdHVzID0gUFRSX0VSUihoYW5kbGUpOwogCQltbG9nX2Vycm5vKHN0YXR1cyk7CkBAIC02MzAsOCArNjIxLDggQEAKIAl9CiAKIAkvKiBzZXQgdGhlIGlub2RlcyBkdGltZSAqLwotCXN0YXR1cyA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgaW5vZGUsIGRpX2JoLAotCQkJCSAgICAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKKwlzdGF0dXMgPSBvY2ZzMl9qb3VybmFsX2FjY2Vzc19kaShoYW5kbGUsIGlub2RlLCBkaV9iaCwKKwkJCQkJIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKIAlpZiAoc3RhdHVzIDwgMCkgewogCQltbG9nX2Vycm5vKHN0YXR1cyk7CiAJCWdvdG8gYmFpbF9jb21taXQ7CkBAIC02NDcsNiArNjM4LDcgQEAKIAl9CiAKIAlvY2ZzMl9yZW1vdmVfZnJvbV9jYWNoZShpbm9kZSwgZGlfYmgpOworCXZmc19kcV9mcmVlX2lub2RlKGlub2RlKTsKIAogCXN0YXR1cyA9IG9jZnMyX2ZyZWVfZGlub2RlKGhhbmRsZSwgaW5vZGVfYWxsb2NfaW5vZGUsCiAJCQkJICAgaW5vZGVfYWxsb2NfYmgsIGRpKTsKQEAgLTkyOSw3ICs5MjEsMTAgQEAKIAogCW1sb2dfZW50cnkoIihpbm9kZS0+aV9pbm8gPSAlbHUpXG4iLCBpbm9kZS0+aV9pbm8pOwogCi0JaWYgKGlzX2JhZF9pbm9kZShpbm9kZSkpIHsKKwkvKiBXaGVuIHdlIGZhaWwgaW4gcmVhZF9pbm9kZSgpIHdlIG1hcmsgaW5vZGUgYXMgYmFkLiBUaGUgc2Vjb25kIHRlc3QKKwkgKiBjYXRjaGVzIHRoZSBjYXNlIHdoZW4gaW5vZGUgYWxsb2NhdGlvbiBmYWlscyBiZWZvcmUgYWxsb2NhdGluZworCSAqIGEgYmxvY2sgZm9yIGlub2RlLiAqLworCWlmIChpc19iYWRfaW5vZGUoaW5vZGUpIHx8ICFPQ0ZTMl9JKGlub2RlKS0+aXBfYmxrbm8pIHsKIAkJbWxvZygwLCAiU2tpcHBpbmcgZGVsZXRlIG9mIGJhZCBpbm9kZVxuIik7CiAJCWdvdG8gYmFpbDsKIAl9CkBAIC0xMTk1LDggKzExOTAsOCBAQAogCW1sb2dfZW50cnkoIihpbm9kZSAlbGx1KVxuIiwKIAkJICAgKHVuc2lnbmVkIGxvbmcgbG9uZylPQ0ZTMl9JKGlub2RlKS0+aXBfYmxrbm8pOwogCi0Jc3RhdHVzID0gb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwgYmgsCi0JCQkJICAgICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOworCXN0YXR1cyA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzX2RpKGhhbmRsZSwgaW5vZGUsIGJoLAorCQkJCQkgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOwogCWlmIChzdGF0dXMgPCAwKSB7CiAJCW1sb2dfZXJybm8oc3RhdHVzKTsKIAkJZ290byBsZWF2ZTsKQEAgLTEyNjQsMyArMTI1OSw4OSBAQAogCiAJc3Bpbl91bmxvY2soJk9DRlMyX0koaW5vZGUpLT5pcF9sb2NrKTsKIH0KKworaW50IG9jZnMyX3ZhbGlkYXRlX2lub2RlX2Jsb2NrKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCQkgICAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKK3sKKwlpbnQgcmM7CisJc3RydWN0IG9jZnMyX2Rpbm9kZSAqZGkgPSAoc3RydWN0IG9jZnMyX2Rpbm9kZSAqKWJoLT5iX2RhdGE7CisKKwltbG9nKDAsICJWYWxpZGF0aW5nIGRpbm9kZSAlbGx1XG4iLAorCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyliaC0+Yl9ibG9ja25yKTsKKworCUJVR19PTighYnVmZmVyX3VwdG9kYXRlKGJoKSk7CisKKwkvKgorCSAqIElmIHRoZSBlY2MgZmFpbHMsIHdlIHJldHVybiB0aGUgZXJyb3IgYnV0IG90aGVyd2lzZQorCSAqIGxlYXZlIHRoZSBmaWxlc3lzdGVtIHJ1bm5pbmcuICBXZSBrbm93IGFueSBlcnJvciBpcworCSAqIGxvY2FsIHRvIHRoaXMgYmxvY2suCisJICovCisJcmMgPSBvY2ZzMl92YWxpZGF0ZV9tZXRhX2VjYyhzYiwgYmgtPmJfZGF0YSwgJmRpLT5pX2NoZWNrKTsKKwlpZiAocmMpIHsKKwkJbWxvZyhNTF9FUlJPUiwgIkNoZWNrc3VtIGZhaWxlZCBmb3IgZGlub2RlICVsbHVcbiIsCisJCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyliaC0+Yl9ibG9ja25yKTsKKwkJZ290byBiYWlsOworCX0KKworCS8qCisJICogRXJyb3JzIGFmdGVyIGhlcmUgYXJlIGZhdGFsLgorCSAqLworCisJcmMgPSAtRUlOVkFMOworCisJaWYgKCFPQ0ZTMl9JU19WQUxJRF9ESU5PREUoZGkpKSB7CisJCW9jZnMyX2Vycm9yKHNiLCAiSW52YWxpZCBkaW5vZGUgIyVsbHU6IHNpZ25hdHVyZSA9ICUuKnNcbiIsCisJCQkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyliaC0+Yl9ibG9ja25yLCA3LAorCQkJICAgIGRpLT5pX3NpZ25hdHVyZSk7CisJCWdvdG8gYmFpbDsKKwl9CisKKwlpZiAobGU2NF90b19jcHUoZGktPmlfYmxrbm8pICE9IGJoLT5iX2Jsb2NrbnIpIHsKKwkJb2NmczJfZXJyb3Ioc2IsICJJbnZhbGlkIGRpbm9kZSAjJWxsdTogaV9ibGtubyBpcyAlbGx1XG4iLAorCQkJICAgICh1bnNpZ25lZCBsb25nIGxvbmcpYmgtPmJfYmxvY2tuciwKKwkJCSAgICAodW5zaWduZWQgbG9uZyBsb25nKWxlNjRfdG9fY3B1KGRpLT5pX2Jsa25vKSk7CisJCWdvdG8gYmFpbDsKKwl9CisKKwlpZiAoIShkaS0+aV9mbGFncyAmIGNwdV90b19sZTMyKE9DRlMyX1ZBTElEX0ZMKSkpIHsKKwkJb2NmczJfZXJyb3Ioc2IsCisJCQkgICAgIkludmFsaWQgZGlub2RlICMlbGx1OiBPQ0ZTMl9WQUxJRF9GTCBub3Qgc2V0XG4iLAorCQkJICAgICh1bnNpZ25lZCBsb25nIGxvbmcpYmgtPmJfYmxvY2tucik7CisJCWdvdG8gYmFpbDsKKwl9CisKKwlpZiAobGUzMl90b19jcHUoZGktPmlfZnNfZ2VuZXJhdGlvbikgIT0KKwkgICAgT0NGUzJfU0Ioc2IpLT5mc19nZW5lcmF0aW9uKSB7CisJCW9jZnMyX2Vycm9yKHNiLAorCQkJICAgICJJbnZhbGlkIGRpbm9kZSAjJWxsdTogZnNfZ2VuZXJhdGlvbiBpcyAldVxuIiwKKwkJCSAgICAodW5zaWduZWQgbG9uZyBsb25nKWJoLT5iX2Jsb2NrbnIsCisJCQkgICAgbGUzMl90b19jcHUoZGktPmlfZnNfZ2VuZXJhdGlvbikpOworCQlnb3RvIGJhaWw7CisJfQorCisJcmMgPSAwOworCitiYWlsOgorCXJldHVybiByYzsKK30KKworaW50IG9jZnMyX3JlYWRfaW5vZGVfYmxvY2tfZnVsbChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKipiaCwKKwkJCQlpbnQgZmxhZ3MpCit7CisJaW50IHJjOworCXN0cnVjdCBidWZmZXJfaGVhZCAqdG1wID0gKmJoOworCisJcmMgPSBvY2ZzMl9yZWFkX2Jsb2Nrcyhpbm9kZSwgT0NGUzJfSShpbm9kZSktPmlwX2Jsa25vLCAxLCAmdG1wLAorCQkJICAgICAgIGZsYWdzLCBvY2ZzMl92YWxpZGF0ZV9pbm9kZV9ibG9jayk7CisKKwkvKiBJZiBvY2ZzMl9yZWFkX2Jsb2NrcygpIGdvdCB1cyBhIG5ldyBiaCwgcGFzcyBpdCB1cC4gKi8KKwlpZiAoIXJjICYmICEqYmgpCisJCSpiaCA9IHRtcDsKKworCXJldHVybiByYzsKK30KKworaW50IG9jZnMyX3JlYWRfaW5vZGVfYmxvY2soc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGJ1ZmZlcl9oZWFkICoqYmgpCit7CisJcmV0dXJuIG9jZnMyX3JlYWRfaW5vZGVfYmxvY2tfZnVsbChpbm9kZSwgYmgsIDApOworfQpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvaW5vZGUuaCBiL2ZzL29jZnMyL2lub2RlLmgKaW5kZXggMmYzN2FmOS4uZWIzYzMwMiAxMDA2NDQKLS0tIGEvZnMvb2NmczIvaW5vZGUuaAorKysgYi9mcy9vY2ZzMi9pbm9kZS5oCkBAIC0xMjgsOCArMTI4LDggQEAKIAkJCSBpbnQgc3lzZmlsZV90eXBlKTsKIGludCBvY2ZzMl9pbm9kZV9pbml0X3ByaXZhdGUoc3RydWN0IGlub2RlICppbm9kZSk7CiBpbnQgb2NmczJfaW5vZGVfcmV2YWxpZGF0ZShzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpOwotaW50IG9jZnMyX3BvcHVsYXRlX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBvY2ZzMl9kaW5vZGUgKmZlLAotCQkJIGludCBjcmVhdGVfaW5vKTsKK3ZvaWQgb2NmczJfcG9wdWxhdGVfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IG9jZnMyX2Rpbm9kZSAqZmUsCisJCQkgIGludCBjcmVhdGVfaW5vKTsKIHZvaWQgb2NmczJfcmVhZF9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKIHZvaWQgb2NmczJfcmVhZF9pbm9kZTIoc3RydWN0IGlub2RlICppbm9kZSwgdm9pZCAqb3BhcXVlKTsKIHNzaXplX3Qgb2NmczJfcndfZGlyZWN0KGludCBydywgc3RydWN0IGZpbGUgKmZpbHAsIGNoYXIgKmJ1ZiwKQEAgLTE0Miw2ICsxNDIsOCBAQAogCQkJICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCk7CiBpbnQgb2NmczJfYWlvX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBraW9jYiAqcmVxLCBzdHJ1Y3QgaW9jYiAqaW9jYik7CiBpbnQgb2NmczJfYWlvX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qga2lvY2IgKnJlcSwgc3RydWN0IGlvY2IgKmlvY2IpOworc3RydWN0IGJ1ZmZlcl9oZWFkICpvY2ZzMl9icmVhZChzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCWludCBibG9jaywgaW50ICplcnIsIGludCByZWFkYSk7CiAKIHZvaWQgb2NmczJfc2V0X2lub2RlX2ZsYWdzKHN0cnVjdCBpbm9kZSAqaW5vZGUpOwogdm9pZCBvY2ZzMl9nZXRfaW5vZGVfZmxhZ3Moc3RydWN0IG9jZnMyX2lub2RlX2luZm8gKm9pKTsKQEAgLTE1Myw0ICsxNTUsMTYgQEAKIAlyZXR1cm4gKGJsa2NudF90KShPQ0ZTMl9JKGlub2RlKS0+aXBfY2x1c3RlcnMgPDwgY190b19zX2JpdHMpOwogfQogCisvKiBWYWxpZGF0ZSB0aGF0IGEgYmggY29udGFpbnMgYSB2YWxpZCBpbm9kZSAqLworaW50IG9jZnMyX3ZhbGlkYXRlX2lub2RlX2Jsb2NrKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCQkgICAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCk7CisvKgorICogUmVhZCBhbiBpbm9kZSBibG9jayBpbnRvICpiaC4gIElmICpiaCBpcyBOVUxMLCBhIGJoIHdpbGwgYmUgYWxsb2NhdGVkLgorICogVGhpcyBpcyBhIGNhY2hlZCByZWFkLiAgVGhlIGlub2RlIHdpbGwgYmUgdmFsaWRhdGVkIHdpdGgKKyAqIG9jZnMyX3ZhbGlkYXRlX2lub2RlX2Jsb2NrKCkuCisgKi8KK2ludCBvY2ZzMl9yZWFkX2lub2RlX2Jsb2NrKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBidWZmZXJfaGVhZCAqKmJoKTsKKy8qIFRoZSBzYW1lLCBidXQgY2FuIGJlIHBhc3NlZCBPQ0ZTMl9CSF8qIGZsYWdzICovCitpbnQgb2NmczJfcmVhZF9pbm9kZV9ibG9ja19mdWxsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBidWZmZXJfaGVhZCAqKmJoLAorCQkJCWludCBmbGFncyk7CiAjZW5kaWYgLyogT0NGUzJfSU5PREVfSCAqLwpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvam91cm5hbC5jIGIvZnMvb2NmczIvam91cm5hbC5jCmluZGV4IDk5ZmU5ZDUuLjU3ZDdkMjUgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2pvdXJuYWwuYworKysgYi9mcy9vY2ZzMi9qb3VybmFsLmMKQEAgLTM1LDYgKzM1LDcgQEAKICNpbmNsdWRlICJvY2ZzMi5oIgogCiAjaW5jbHVkZSAiYWxsb2MuaCIKKyNpbmNsdWRlICJibG9ja2NoZWNrLmgiCiAjaW5jbHVkZSAiZGlyLmgiCiAjaW5jbHVkZSAiZGxtZ2x1ZS5oIgogI2luY2x1ZGUgImV4dGVudF9tYXAuaCIKQEAgLTQ1LDYgKzQ2LDcgQEAKICNpbmNsdWRlICJzbG90X21hcC5oIgogI2luY2x1ZGUgInN1cGVyLmgiCiAjaW5jbHVkZSAic3lzZmlsZS5oIgorI2luY2x1ZGUgInF1b3RhLmgiCiAKICNpbmNsdWRlICJidWZmZXJfaGVhZF9pby5oIgogCkBAIC01MiwxMCArNTQsMTAgQEAKIAogc3RhdGljIGludCBvY2ZzMl9mb3JjZV9yZWFkX2pvdXJuYWwoc3RydWN0IGlub2RlICppbm9kZSk7CiBzdGF0aWMgaW50IG9jZnMyX3JlY292ZXJfbm9kZShzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiwKLQkJCSAgICAgIGludCBub2RlX251bSk7CisJCQkgICAgICBpbnQgbm9kZV9udW0sIGludCBzbG90X251bSk7CiBzdGF0aWMgaW50IF9fb2NmczJfcmVjb3ZlcnlfdGhyZWFkKHZvaWQgKmFyZyk7CiBzdGF0aWMgaW50IG9jZnMyX2NvbW1pdF9jYWNoZShzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYik7Ci1zdGF0aWMgaW50IG9jZnMyX3dhaXRfb25fbW91bnQoc3RydWN0IG9jZnMyX3N1cGVyICpvc2IpOworc3RhdGljIGludCBfX29jZnMyX3dhaXRfb25fbW91bnQoc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsIGludCBxdW90YSk7CiBzdGF0aWMgaW50IG9jZnMyX2pvdXJuYWxfdG9nZ2xlX2RpcnR5KHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiLAogCQkJCSAgICAgIGludCBkaXJ0eSwgaW50IHJlcGxheWVkKTsKIHN0YXRpYyBpbnQgb2NmczJfdHJ5bG9ja19qb3VybmFsKHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiLApAQCAtNjQsNiArNjYsMTcgQEAKIAkJCQkgaW50IHNsb3QpOwogc3RhdGljIGludCBvY2ZzMl9jb21taXRfdGhyZWFkKHZvaWQgKmFyZyk7CiAKK3N0YXRpYyBpbmxpbmUgaW50IG9jZnMyX3dhaXRfb25fbW91bnQoc3RydWN0IG9jZnMyX3N1cGVyICpvc2IpCit7CisJcmV0dXJuIF9fb2NmczJfd2FpdF9vbl9tb3VudChvc2IsIDApOworfQorCitzdGF0aWMgaW5saW5lIGludCBvY2ZzMl93YWl0X29uX3F1b3RhcyhzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYikKK3sKKwlyZXR1cm4gX19vY2ZzMl93YWl0X29uX21vdW50KG9zYiwgMSk7Cit9CisKKwogCiAvKgogICogVGhlIHJlY292ZXJ5X2xpc3QgaXMgYSBzaW1wbGUgbGlua2VkIGxpc3Qgb2Ygbm9kZSBudW1iZXJzIHRvIHJlY292ZXIuCkBAIC0yNTYsMTEgKzI2OSw5IEBACiAJQlVHX09OKG9zYi0+am91cm5hbC0+al9zdGF0ZSA9PSBPQ0ZTMl9KT1VSTkFMX0ZSRUUpOwogCUJVR19PTihtYXhfYnVmZnMgPD0gMCk7CiAKLQkvKiBKQkQgbWlnaHQgc3VwcG9ydCB0aGlzLCBidXQgb3VyIGpvdXJuYWxsaW5nIGNvZGUgZG9lc24ndCB5ZXQuICovCi0JaWYgKGpvdXJuYWxfY3VycmVudF9oYW5kbGUoKSkgewotCQltbG9nKE1MX0VSUk9SLCAiUmVjdXJzaXZlIHRyYW5zYWN0aW9uIGF0dGVtcHRlZCFcbiIpOwotCQlCVUcoKTsKLQl9CisJLyogTmVzdGVkIHRyYW5zYWN0aW9uPyBKdXN0IHJldHVybiB0aGUgaGFuZGxlLi4uICovCisJaWYgKGpvdXJuYWxfY3VycmVudF9oYW5kbGUoKSkKKwkJcmV0dXJuIGpiZDJfam91cm5hbF9zdGFydChqb3VybmFsLCBtYXhfYnVmZnMpOwogCiAJZG93bl9yZWFkKCZvc2ItPmpvdXJuYWwtPmpfdHJhbnNfYmFycmllcik7CiAKQEAgLTI4NSwxNiArMjk2LDE4IEBACiBpbnQgb2NmczJfY29tbWl0X3RyYW5zKHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiLAogCQkgICAgICAgaGFuZGxlX3QgKmhhbmRsZSkKIHsKLQlpbnQgcmV0OworCWludCByZXQsIG5lc3RlZDsKIAlzdHJ1Y3Qgb2NmczJfam91cm5hbCAqam91cm5hbCA9IG9zYi0+am91cm5hbDsKIAogCUJVR19PTighaGFuZGxlKTsKIAorCW5lc3RlZCA9IGhhbmRsZS0+aF9yZWYgPiAxOwogCXJldCA9IGpiZDJfam91cm5hbF9zdG9wKGhhbmRsZSk7CiAJaWYgKHJldCA8IDApCiAJCW1sb2dfZXJybm8ocmV0KTsKIAotCXVwX3JlYWQoJmpvdXJuYWwtPmpfdHJhbnNfYmFycmllcik7CisJaWYgKCFuZXN0ZWQpCisJCXVwX3JlYWQoJmpvdXJuYWwtPmpfdHJhbnNfYmFycmllcik7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtMzU3LDEwICszNzAsMTM3IEBACiAJcmV0dXJuIHN0YXR1czsKIH0KIAotaW50IG9jZnMyX2pvdXJuYWxfYWNjZXNzKGhhbmRsZV90ICpoYW5kbGUsCi0JCQkgc3RydWN0IGlub2RlICppbm9kZSwKLQkJCSBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLAotCQkJIGludCB0eXBlKQorc3RydWN0IG9jZnMyX3RyaWdnZXJzIHsKKwlzdHJ1Y3QgamJkMl9idWZmZXJfdHJpZ2dlcl90eXBlCW90X3RyaWdnZXJzOworCWludAkJCQlvdF9vZmZzZXQ7Cit9OworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBvY2ZzMl90cmlnZ2VycyAqdG9fb2NmczJfdHJpZ2dlcihzdHJ1Y3QgamJkMl9idWZmZXJfdHJpZ2dlcl90eXBlICp0cmlnZ2VycykKK3sKKwlyZXR1cm4gY29udGFpbmVyX29mKHRyaWdnZXJzLCBzdHJ1Y3Qgb2NmczJfdHJpZ2dlcnMsIG90X3RyaWdnZXJzKTsKK30KKworc3RhdGljIHZvaWQgb2NmczJfY29tbWl0X3RyaWdnZXIoc3RydWN0IGpiZDJfYnVmZmVyX3RyaWdnZXJfdHlwZSAqdHJpZ2dlcnMsCisJCQkJIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsCisJCQkJIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKQoreworCXN0cnVjdCBvY2ZzMl90cmlnZ2VycyAqb3QgPSB0b19vY2ZzMl90cmlnZ2VyKHRyaWdnZXJzKTsKKworCS8qCisJICogV2UgYXJlbid0IGd1YXJhbnRlZWQgdG8gaGF2ZSB0aGUgc3VwZXJibG9jayBoZXJlLCBzbyB3ZQorCSAqIG11c3QgdW5jb25kaXRpb25hbGx5IGNvbXB1dGUgdGhlIGVjYyBkYXRhLgorCSAqIF9fb2NmczJfam91cm5hbF9hY2Nlc3MoKSB3aWxsIG9ubHkgc2V0IHRoZSB0cmlnZ2VycyBpZgorCSAqIG1ldGFlY2MgaXMgZW5hYmxlZC4KKwkgKi8KKwlvY2ZzMl9ibG9ja19jaGVja19jb21wdXRlKGRhdGEsIHNpemUsIGRhdGEgKyBvdC0+b3Rfb2Zmc2V0KTsKK30KKworLyoKKyAqIFF1b3RhIGJsb2NrcyBoYXZlIHRoZWlyIG93biB0cmlnZ2VyIGJlY2F1c2UgdGhlIHN0cnVjdCBvY2ZzMl9ibG9ja19jaGVjaworICogb2Zmc2V0IGRlcGVuZHMgb24gdGhlIGJsb2Nrc2l6ZS4KKyAqLworc3RhdGljIHZvaWQgb2NmczJfZHFfY29tbWl0X3RyaWdnZXIoc3RydWN0IGpiZDJfYnVmZmVyX3RyaWdnZXJfdHlwZSAqdHJpZ2dlcnMsCisJCQkJIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsCisJCQkJIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKQoreworCXN0cnVjdCBvY2ZzMl9kaXNrX2RxdHJhaWxlciAqZHF0ID0KKwkJb2NmczJfYmxvY2tfZHF0cmFpbGVyKHNpemUsIGRhdGEpOworCisJLyoKKwkgKiBXZSBhcmVuJ3QgZ3VhcmFudGVlZCB0byBoYXZlIHRoZSBzdXBlcmJsb2NrIGhlcmUsIHNvIHdlCisJICogbXVzdCB1bmNvbmRpdGlvbmFsbHkgY29tcHV0ZSB0aGUgZWNjIGRhdGEuCisJICogX19vY2ZzMl9qb3VybmFsX2FjY2VzcygpIHdpbGwgb25seSBzZXQgdGhlIHRyaWdnZXJzIGlmCisJICogbWV0YWVjYyBpcyBlbmFibGVkLgorCSAqLworCW9jZnMyX2Jsb2NrX2NoZWNrX2NvbXB1dGUoZGF0YSwgc2l6ZSwgJmRxdC0+ZHFfY2hlY2spOworfQorCisvKgorICogRGlyZWN0b3J5IGJsb2NrcyBhbHNvIGhhdmUgdGhlaXIgb3duIHRyaWdnZXIgYmVjYXVzZSB0aGUKKyAqIHN0cnVjdCBvY2ZzMl9ibG9ja19jaGVjayBvZmZzZXQgZGVwZW5kcyBvbiB0aGUgYmxvY2tzaXplLgorICovCitzdGF0aWMgdm9pZCBvY2ZzMl9kYl9jb21taXRfdHJpZ2dlcihzdHJ1Y3QgamJkMl9idWZmZXJfdHJpZ2dlcl90eXBlICp0cmlnZ2VycywKKwkJCQkgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwKKwkJCQkgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpCit7CisJc3RydWN0IG9jZnMyX2Rpcl9ibG9ja190cmFpbGVyICp0cmFpbGVyID0KKwkJb2NmczJfZGlyX3RyYWlsZXJfZnJvbV9zaXplKHNpemUsIGRhdGEpOworCisJLyoKKwkgKiBXZSBhcmVuJ3QgZ3VhcmFudGVlZCB0byBoYXZlIHRoZSBzdXBlcmJsb2NrIGhlcmUsIHNvIHdlCisJICogbXVzdCB1bmNvbmRpdGlvbmFsbHkgY29tcHV0ZSB0aGUgZWNjIGRhdGEuCisJICogX19vY2ZzMl9qb3VybmFsX2FjY2VzcygpIHdpbGwgb25seSBzZXQgdGhlIHRyaWdnZXJzIGlmCisJICogbWV0YWVjYyBpcyBlbmFibGVkLgorCSAqLworCW9jZnMyX2Jsb2NrX2NoZWNrX2NvbXB1dGUoZGF0YSwgc2l6ZSwgJnRyYWlsZXItPmRiX2NoZWNrKTsKK30KKworc3RhdGljIHZvaWQgb2NmczJfYWJvcnRfdHJpZ2dlcihzdHJ1Y3QgamJkMl9idWZmZXJfdHJpZ2dlcl90eXBlICp0cmlnZ2VycywKKwkJCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQoreworCW1sb2coTUxfRVJST1IsCisJICAgICAib2NmczJfYWJvcnRfdHJpZ2dlciBjYWxsZWQgYnkgSkJEMi4gIGJoID0gMHglbHgsICIKKwkgICAgICJiaC0+Yl9ibG9ja25yID0gJWxsdVxuIiwKKwkgICAgICh1bnNpZ25lZCBsb25nKWJoLAorCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyliaC0+Yl9ibG9ja25yKTsKKworCS8qIFdlIGFyZW4ndCBndWFyYW50ZWVkIHRvIGhhdmUgdGhlIHN1cGVyYmxvY2sgaGVyZSAtIGJ1dCBpZiB3ZQorCSAqIGRvbid0LCBpdCdsbCBqdXN0IGNyYXNoLiAqLworCW9jZnMyX2Vycm9yKGJoLT5iX2Fzc29jX21hcC0+aG9zdC0+aV9zYiwKKwkJICAgICJKQkQyIGhhcyBhYm9ydGVkIG91ciBqb3VybmFsLCBvY2ZzMiBjYW5ub3QgY29udGludWVcbiIpOworfQorCitzdGF0aWMgc3RydWN0IG9jZnMyX3RyaWdnZXJzIGRpX3RyaWdnZXJzID0geworCS5vdF90cmlnZ2VycyA9IHsKKwkJLnRfY29tbWl0ID0gb2NmczJfY29tbWl0X3RyaWdnZXIsCisJCS50X2Fib3J0ID0gb2NmczJfYWJvcnRfdHJpZ2dlciwKKwl9LAorCS5vdF9vZmZzZXQJPSBvZmZzZXRvZihzdHJ1Y3Qgb2NmczJfZGlub2RlLCBpX2NoZWNrKSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgb2NmczJfdHJpZ2dlcnMgZWJfdHJpZ2dlcnMgPSB7CisJLm90X3RyaWdnZXJzID0geworCQkudF9jb21taXQgPSBvY2ZzMl9jb21taXRfdHJpZ2dlciwKKwkJLnRfYWJvcnQgPSBvY2ZzMl9hYm9ydF90cmlnZ2VyLAorCX0sCisJLm90X29mZnNldAk9IG9mZnNldG9mKHN0cnVjdCBvY2ZzMl9leHRlbnRfYmxvY2ssIGhfY2hlY2spLAorfTsKKworc3RhdGljIHN0cnVjdCBvY2ZzMl90cmlnZ2VycyBnZF90cmlnZ2VycyA9IHsKKwkub3RfdHJpZ2dlcnMgPSB7CisJCS50X2NvbW1pdCA9IG9jZnMyX2NvbW1pdF90cmlnZ2VyLAorCQkudF9hYm9ydCA9IG9jZnMyX2Fib3J0X3RyaWdnZXIsCisJfSwKKwkub3Rfb2Zmc2V0CT0gb2Zmc2V0b2Yoc3RydWN0IG9jZnMyX2dyb3VwX2Rlc2MsIGJnX2NoZWNrKSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgb2NmczJfdHJpZ2dlcnMgZGJfdHJpZ2dlcnMgPSB7CisJLm90X3RyaWdnZXJzID0geworCQkudF9jb21taXQgPSBvY2ZzMl9kYl9jb21taXRfdHJpZ2dlciwKKwkJLnRfYWJvcnQgPSBvY2ZzMl9hYm9ydF90cmlnZ2VyLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IG9jZnMyX3RyaWdnZXJzIHhiX3RyaWdnZXJzID0geworCS5vdF90cmlnZ2VycyA9IHsKKwkJLnRfY29tbWl0ID0gb2NmczJfY29tbWl0X3RyaWdnZXIsCisJCS50X2Fib3J0ID0gb2NmczJfYWJvcnRfdHJpZ2dlciwKKwl9LAorCS5vdF9vZmZzZXQJPSBvZmZzZXRvZihzdHJ1Y3Qgb2NmczJfeGF0dHJfYmxvY2ssIHhiX2NoZWNrKSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgb2NmczJfdHJpZ2dlcnMgZHFfdHJpZ2dlcnMgPSB7CisJLm90X3RyaWdnZXJzID0geworCQkudF9jb21taXQgPSBvY2ZzMl9kcV9jb21taXRfdHJpZ2dlciwKKwkJLnRfYWJvcnQgPSBvY2ZzMl9hYm9ydF90cmlnZ2VyLAorCX0sCit9OworCitzdGF0aWMgaW50IF9fb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlX3QgKmhhbmRsZSwKKwkJCQkgIHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLAorCQkJCSAgc3RydWN0IG9jZnMyX3RyaWdnZXJzICp0cmlnZ2VycywKKwkJCQkgIGludCB0eXBlKQogewogCWludCBzdGF0dXM7CiAKQEAgLTQwNiw2ICs1NDYsOCBAQAogCQlzdGF0dXMgPSAtRUlOVkFMOwogCQltbG9nKE1MX0VSUk9SLCAiVWtub3duIGFjY2VzcyB0eXBlIVxuIik7CiAJfQorCWlmICghc3RhdHVzICYmIG9jZnMyX21ldGFfZWNjKE9DRlMyX1NCKGlub2RlLT5pX3NiKSkgJiYgdHJpZ2dlcnMpCisJCWpiZDJfam91cm5hbF9zZXRfdHJpZ2dlcnMoYmgsICZ0cmlnZ2Vycy0+b3RfdHJpZ2dlcnMpOwogCW11dGV4X3VubG9jaygmT0NGUzJfSShpbm9kZSktPmlwX2lvX211dGV4KTsKIAogCWlmIChzdGF0dXMgPCAwKQpAQCAtNDE2LDYgKzU1OCw1NCBAQAogCXJldHVybiBzdGF0dXM7CiB9CiAKK2ludCBvY2ZzMl9qb3VybmFsX2FjY2Vzc19kaShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJICAgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsIGludCB0eXBlKQoreworCXJldHVybiBfX29jZnMyX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgaW5vZGUsIGJoLCAmZGlfdHJpZ2dlcnMsCisJCQkJICAgICAgdHlwZSk7Cit9CisKK2ludCBvY2ZzMl9qb3VybmFsX2FjY2Vzc19lYihoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsIGludCB0eXBlKQoreworCXJldHVybiBfX29jZnMyX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgaW5vZGUsIGJoLCAmZWJfdHJpZ2dlcnMsCisJCQkJICAgICAgdHlwZSk7Cit9CisKK2ludCBvY2ZzMl9qb3VybmFsX2FjY2Vzc19nZChoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsIGludCB0eXBlKQoreworCXJldHVybiBfX29jZnMyX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgaW5vZGUsIGJoLCAmZ2RfdHJpZ2dlcnMsCisJCQkJICAgICAgdHlwZSk7Cit9CisKK2ludCBvY2ZzMl9qb3VybmFsX2FjY2Vzc19kYihoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsIGludCB0eXBlKQoreworCXJldHVybiBfX29jZnMyX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgaW5vZGUsIGJoLCAmZGJfdHJpZ2dlcnMsCisJCQkJICAgICAgdHlwZSk7Cit9CisKK2ludCBvY2ZzMl9qb3VybmFsX2FjY2Vzc194YihoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsIGludCB0eXBlKQoreworCXJldHVybiBfX29jZnMyX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgaW5vZGUsIGJoLCAmeGJfdHJpZ2dlcnMsCisJCQkJICAgICAgdHlwZSk7Cit9CisKK2ludCBvY2ZzMl9qb3VybmFsX2FjY2Vzc19kcShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsIGludCB0eXBlKQoreworCXJldHVybiBfX29jZnMyX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgaW5vZGUsIGJoLCAmZHFfdHJpZ2dlcnMsCisJCQkJICAgICAgdHlwZSk7Cit9CisKK2ludCBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsIGludCB0eXBlKQoreworCXJldHVybiBfX29jZnMyX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgaW5vZGUsIGJoLCBOVUxMLCB0eXBlKTsKK30KKwogaW50IG9jZnMyX2pvdXJuYWxfZGlydHkoaGFuZGxlX3QgKmhhbmRsZSwKIAkJCXN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCiB7CkBAIC00MzQsMjAgKzYyNCw2IEBACiAJcmV0dXJuIHN0YXR1czsKIH0KIAotI2lmZGVmIENPTkZJR19PQ0ZTMl9DT01QQVRfSkJECi1pbnQgb2NmczJfam91cm5hbF9kaXJ0eV9kYXRhKGhhbmRsZV90ICpoYW5kbGUsCi0JCQkgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCi17Ci0JaW50IGVyciA9IGpvdXJuYWxfZGlydHlfZGF0YShoYW5kbGUsIGJoKTsKLQlpZiAoZXJyKQotCQltbG9nX2Vycm5vKGVycik7Ci0JLyogVE9ETzogV2hlbiB3ZSBjYW4gaGFuZGxlIGl0LCBhYm9ydCB0aGUgaGFuZGxlIGFuZCBnbyBSTyBvbgotCSAqIGVycm9yIGhlcmUuICovCi0KLQlyZXR1cm4gZXJyOwotfQotI2VuZGlmCi0KICNkZWZpbmUgT0NGUzJfREVGQVVMVF9DT01NSVRfSU5URVJWQUwJKEhaICogSkJEMl9ERUZBVUxUX01BWF9DT01NSVRfQUdFKQogCiB2b2lkIG9jZnMyX3NldF9qb3VybmFsX3BhcmFtcyhzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYikKQEAgLTU4NywxNyArNzYzLDExIEBACiAJbWxvZ19lbnRyeV92b2lkKCk7CiAKIAlmZSA9IChzdHJ1Y3Qgb2NmczJfZGlub2RlICopYmgtPmJfZGF0YTsKLQlpZiAoIU9DRlMyX0lTX1ZBTElEX0RJTk9ERShmZSkpIHsKLQkJLyogVGhpcyBpcyBjYWxsZWQgZnJvbSBzdGFydHVwL3NodXRkb3duIHdoaWNoIHdpbGwKLQkJICogaGFuZGxlIHRoZSBlcnJvcnMgaW4gYSBzcGVjaWZpYyBtYW5uZXIsIHNvIG5vIG5lZWQKLQkJICogdG8gY2FsbCBvY2ZzMl9lcnJvcigpIGhlcmUuICovCi0JCW1sb2coTUxfRVJST1IsICJKb3VybmFsIGRpbm9kZSAlbGx1ICBoYXMgaW52YWxpZCAiCi0JCSAgICAgInNpZ25hdHVyZTogJS4qcyIsCi0JCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylsZTY0X3RvX2NwdShmZS0+aV9ibGtubyksIDcsCi0JCSAgICAgZmUtPmlfc2lnbmF0dXJlKTsKLQkJc3RhdHVzID0gLUVJTzsKLQkJZ290byBvdXQ7Ci0JfQorCisJLyogVGhlIGpvdXJuYWwgYmggb24gdGhlIG9zYiBhbHdheXMgY29tZXMgZnJvbSBvY2ZzMl9qb3VybmFsX2luaXQoKQorCSAqIGFuZCB3YXMgdmFsaWRhdGVkIHRoZXJlIGluc2lkZSBvY2ZzMl9pbm9kZV9sb2NrX2Z1bGwoKS4gIEl0J3MgYQorCSAqIGNvZGUgYnVnIGlmIHdlIG1lc3MgaXQgdXAuICovCisJQlVHX09OKCFPQ0ZTMl9JU19WQUxJRF9ESU5PREUoZmUpKTsKIAogCWZsYWdzID0gbGUzMl90b19jcHUoZmUtPmlkMS5qb3VybmFsMS5pal9mbGFncyk7CiAJaWYgKGRpcnR5KQpAQCAtNjA5LDExICs3NzksMTEgQEAKIAlpZiAocmVwbGF5ZWQpCiAJCW9jZnMyX2J1bXBfcmVjb3ZlcnlfZ2VuZXJhdGlvbihmZSk7CiAKKwlvY2ZzMl9jb21wdXRlX21ldGFfZWNjKG9zYi0+c2IsIGJoLT5iX2RhdGEsICZmZS0+aV9jaGVjayk7CiAJc3RhdHVzID0gb2NmczJfd3JpdGVfYmxvY2sob3NiLCBiaCwgam91cm5hbC0+al9pbm9kZSk7CiAJaWYgKHN0YXR1cyA8IDApCiAJCW1sb2dfZXJybm8oc3RhdHVzKTsKIAotb3V0OgogCW1sb2dfZXhpdChzdGF0dXMpOwogCXJldHVybiBzdGF0dXM7CiB9CkBAIC04NzgsNiArMTA0OCw3IEBACiAJaW50CQkJbHJpX3Nsb3Q7CiAJc3RydWN0IG9jZnMyX2Rpbm9kZQkqbHJpX2xhX2Rpbm9kZTsKIAlzdHJ1Y3Qgb2NmczJfZGlub2RlCSpscmlfdGxfZGlub2RlOworCXN0cnVjdCBvY2ZzMl9xdW90YV9yZWNvdmVyeSAqbHJpX3FyZWM7CiB9OwogCiAvKiBEb2VzIHRoZSBzZWNvbmQgaGFsZiBvZiB0aGUgcmVjb3ZlcnkgcHJvY2Vzcy4gQnkgdGhpcyBwb2ludCwgdGhlCkBAIC04OTgsNiArMTA2OSw3IEBACiAJc3RydWN0IG9jZnMyX3N1cGVyICpvc2IgPSBqb3VybmFsLT5qX29zYjsKIAlzdHJ1Y3Qgb2NmczJfZGlub2RlICpsYV9kaW5vZGUsICp0bF9kaW5vZGU7CiAJc3RydWN0IG9jZnMyX2xhX3JlY292ZXJ5X2l0ZW0gKml0ZW0sICpuOworCXN0cnVjdCBvY2ZzMl9xdW90YV9yZWNvdmVyeSAqcXJlYzsKIAlMSVNUX0hFQUQodG1wX2xhX2xpc3QpOwogCiAJbWxvZ19lbnRyeV92b2lkKCk7CkBAIC05MTMsNiArMTA4NSw4IEBACiAKIAkJbWxvZygwLCAiQ29tcGxldGUgcmVjb3ZlcnkgZm9yIHNsb3QgJWRcbiIsIGl0ZW0tPmxyaV9zbG90KTsKIAorCQlvY2ZzMl93YWl0X29uX3F1b3Rhcyhvc2IpOworCiAJCWxhX2Rpbm9kZSA9IGl0ZW0tPmxyaV9sYV9kaW5vZGU7CiAJCWlmIChsYV9kaW5vZGUpIHsKIAkJCW1sb2coMCwgIkNsZWFuIHVwIGxvY2FsIGFsbG9jICVsbHVcbiIsCkBAIC05NDMsNiArMTExNywxNiBAQAogCQlpZiAocmV0IDwgMCkKIAkJCW1sb2dfZXJybm8ocmV0KTsKIAorCQlxcmVjID0gaXRlbS0+bHJpX3FyZWM7CisJCWlmIChxcmVjKSB7CisJCQltbG9nKDAsICJSZWNvdmVyaW5nIHF1b3RhIGZpbGVzIik7CisJCQlyZXQgPSBvY2ZzMl9maW5pc2hfcXVvdGFfcmVjb3Zlcnkob3NiLCBxcmVjLAorCQkJCQkJCSAgaXRlbS0+bHJpX3Nsb3QpOworCQkJaWYgKHJldCA8IDApCisJCQkJbWxvZ19lcnJubyhyZXQpOworCQkJLyogUmVjb3ZlcnkgaW5mbyBpcyBhbHJlYWR5IGZyZWVkIG5vdyAqLworCQl9CisKIAkJa2ZyZWUoaXRlbSk7CiAJfQogCkBAIC05NTYsNyArMTE0MCw4IEBACiBzdGF0aWMgdm9pZCBvY2ZzMl9xdWV1ZV9yZWNvdmVyeV9jb21wbGV0aW9uKHN0cnVjdCBvY2ZzMl9qb3VybmFsICpqb3VybmFsLAogCQkJCQkgICAgaW50IHNsb3RfbnVtLAogCQkJCQkgICAgc3RydWN0IG9jZnMyX2Rpbm9kZSAqbGFfZGlub2RlLAotCQkJCQkgICAgc3RydWN0IG9jZnMyX2Rpbm9kZSAqdGxfZGlub2RlKQorCQkJCQkgICAgc3RydWN0IG9jZnMyX2Rpbm9kZSAqdGxfZGlub2RlLAorCQkJCQkgICAgc3RydWN0IG9jZnMyX3F1b3RhX3JlY292ZXJ5ICpxcmVjKQogewogCXN0cnVjdCBvY2ZzMl9sYV9yZWNvdmVyeV9pdGVtICppdGVtOwogCkBAIC05NzEsNiArMTE1Niw5IEBACiAJCWlmICh0bF9kaW5vZGUpCiAJCQlrZnJlZSh0bF9kaW5vZGUpOwogCisJCWlmIChxcmVjKQorCQkJb2NmczJfZnJlZV9xdW90YV9yZWNvdmVyeShxcmVjKTsKKwogCQltbG9nX2Vycm5vKC1FTk9NRU0pOwogCQlyZXR1cm47CiAJfQpAQCAtOTc5LDYgKzExNjcsNyBAQAogCWl0ZW0tPmxyaV9sYV9kaW5vZGUgPSBsYV9kaW5vZGU7CiAJaXRlbS0+bHJpX3Nsb3QgPSBzbG90X251bTsKIAlpdGVtLT5scmlfdGxfZGlub2RlID0gdGxfZGlub2RlOworCWl0ZW0tPmxyaV9xcmVjID0gcXJlYzsKIAogCXNwaW5fbG9jaygmam91cm5hbC0+al9sb2NrKTsKIAlsaXN0X2FkZF90YWlsKCZpdGVtLT5scmlfbGlzdCwgJmpvdXJuYWwtPmpfbGFfY2xlYW51cHMpOwpAQCAtOTk4LDYgKzExODcsNyBAQAogCQlvY2ZzMl9xdWV1ZV9yZWNvdmVyeV9jb21wbGV0aW9uKGpvdXJuYWwsCiAJCQkJCQlvc2ItPnNsb3RfbnVtLAogCQkJCQkJb3NiLT5sb2NhbF9hbGxvY19jb3B5LAorCQkJCQkJTlVMTCwKIAkJCQkJCU5VTEwpOwogCQlvY2ZzMl9zY2hlZHVsZV90cnVuY2F0ZV9sb2dfZmx1c2gob3NiLCAwKTsKIApAQCAtMTAwNiwxMSArMTE5NiwyNiBAQAogCX0KIH0KIAordm9pZCBvY2ZzMl9jb21wbGV0ZV9xdW90YV9yZWNvdmVyeShzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYikKK3sKKwlpZiAob3NiLT5xdW90YV9yZWMpIHsKKwkJb2NmczJfcXVldWVfcmVjb3ZlcnlfY29tcGxldGlvbihvc2ItPmpvdXJuYWwsCisJCQkJCQlvc2ItPnNsb3RfbnVtLAorCQkJCQkJTlVMTCwKKwkJCQkJCU5VTEwsCisJCQkJCQlvc2ItPnF1b3RhX3JlYyk7CisJCW9zYi0+cXVvdGFfcmVjID0gTlVMTDsKKwl9Cit9CisKIHN0YXRpYyBpbnQgX19vY2ZzMl9yZWNvdmVyeV90aHJlYWQodm9pZCAqYXJnKQogewotCWludCBzdGF0dXMsIG5vZGVfbnVtOworCWludCBzdGF0dXMsIG5vZGVfbnVtLCBzbG90X251bTsKIAlzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiA9IGFyZzsKIAlzdHJ1Y3Qgb2NmczJfcmVjb3ZlcnlfbWFwICpybSA9IG9zYi0+cmVjb3ZlcnlfbWFwOworCWludCAqcm1fcXVvdGEgPSBOVUxMOworCWludCBybV9xdW90YV91c2VkID0gMCwgaTsKKwlzdHJ1Y3Qgb2NmczJfcXVvdGFfcmVjb3ZlcnkgKnFyZWM7CiAKIAltbG9nX2VudHJ5X3ZvaWQoKTsKIApAQCAtMTAxOSw2ICsxMjI0LDExIEBACiAJCWdvdG8gYmFpbDsKIAl9CiAKKwlybV9xdW90YSA9IGt6YWxsb2Mob3NiLT5tYXhfc2xvdHMgKiBzaXplb2YoaW50KSwgR0ZQX05PRlMpOworCWlmICghcm1fcXVvdGEpIHsKKwkJc3RhdHVzID0gLUVOT01FTTsKKwkJZ290byBiYWlsOworCX0KIHJlc3RhcnQ6CiAJc3RhdHVzID0gb2NmczJfc3VwZXJfbG9jayhvc2IsIDEpOwogCWlmIChzdGF0dXMgPCAwKSB7CkBAIC0xMDMyLDggKzEyNDIsMjggQEAKIAkJICogY2xlYXIgaXQgdW50aWwgb2NmczJfcmVjb3Zlcl9ub2RlKCkgaGFzIHN1Y2NlZWRlZC4gKi8KIAkJbm9kZV9udW0gPSBybS0+cm1fZW50cmllc1swXTsKIAkJc3Bpbl91bmxvY2soJm9zYi0+b3NiX2xvY2spOworCQltbG9nKDAsICJjaGVja2luZyBub2RlICVkXG4iLCBub2RlX251bSk7CisJCXNsb3RfbnVtID0gb2NmczJfbm9kZV9udW1fdG9fc2xvdChvc2IsIG5vZGVfbnVtKTsKKwkJaWYgKHNsb3RfbnVtID09IC1FTk9FTlQpIHsKKwkJCXN0YXR1cyA9IDA7CisJCQltbG9nKDAsICJubyBzbG90IGZvciB0aGlzIG5vZGUsIHNvIG5vIHJlY292ZXJ5IgorCQkJICAgICAicmVxdWlyZWQuXG4iKTsKKwkJCWdvdG8gc2tpcF9yZWNvdmVyeTsKKwkJfQorCQltbG9nKDAsICJub2RlICVkIHdhcyB1c2luZyBzbG90ICVkXG4iLCBub2RlX251bSwgc2xvdF9udW0pOwogCi0JCXN0YXR1cyA9IG9jZnMyX3JlY292ZXJfbm9kZShvc2IsIG5vZGVfbnVtKTsKKwkJLyogSXQgaXMgYSBiaXQgc3VidGxlIHdpdGggcXVvdGEgcmVjb3ZlcnkuIFdlIGNhbm5vdCBkbyBpdAorCQkgKiBpbW1lZGlhdGVseSBiZWNhdXNlIHdlIGhhdmUgdG8gb2J0YWluIGNsdXN0ZXIgbG9ja3MgZnJvbQorCQkgKiBxdW90YSBmaWxlcyBhbmQgd2UgYWxzbyBkb24ndCB3YW50IHRvIGp1c3Qgc2tpcCBpdCBiZWNhdXNlCisJCSAqIHRoZW4gcXVvdGEgdXNhZ2Ugd291bGQgYmUgb3V0IG9mIHN5bmMgdW50aWwgc29tZSBub2RlIHRha2VzCisJCSAqIHRoZSBzbG90LiBTbyB3ZSByZW1lbWJlciB3aGljaCBub2RlcyBuZWVkIHF1b3RhIHJlY292ZXJ5CisJCSAqIGFuZCB3aGVuIGV2ZXJ5dGhpbmcgZWxzZSBpcyBkb25lLCB3ZSByZWNvdmVyIHF1b3Rhcy4gKi8KKwkJZm9yIChpID0gMDsgaSA8IHJtX3F1b3RhX3VzZWQgJiYgcm1fcXVvdGFbaV0gIT0gc2xvdF9udW07IGkrKyk7CisJCWlmIChpID09IHJtX3F1b3RhX3VzZWQpCisJCQlybV9xdW90YVtybV9xdW90YV91c2VkKytdID0gc2xvdF9udW07CisKKwkJc3RhdHVzID0gb2NmczJfcmVjb3Zlcl9ub2RlKG9zYiwgbm9kZV9udW0sIHNsb3RfbnVtKTsKK3NraXBfcmVjb3Zlcnk6CiAJCWlmICghc3RhdHVzKSB7CiAJCQlvY2ZzMl9yZWNvdmVyeV9tYXBfY2xlYXIob3NiLCBub2RlX251bSk7CiAJCX0gZWxzZSB7CkBAIC0xMDU1LDEzICsxMjg1LDI3IEBACiAJaWYgKHN0YXR1cyA8IDApCiAJCW1sb2dfZXJybm8oc3RhdHVzKTsKIAorCS8qIE5vdyBpdCBpcyByaWdodCB0aW1lIHRvIHJlY292ZXIgcXVvdGFzLi4uIFdlIGhhdmUgdG8gZG8gdGhpcyB1bmRlcgorCSAqIHN1cGVyYmxvY2sgbG9jayBzbyB0aGF0IG5vb25lIGNhbiBzdGFydCB1c2luZyB0aGUgc2xvdCAoYW5kIGNyYXNoKQorCSAqIGJlZm9yZSB3ZSByZWNvdmVyIGl0ICovCisJZm9yIChpID0gMDsgaSA8IHJtX3F1b3RhX3VzZWQ7IGkrKykgeworCQlxcmVjID0gb2NmczJfYmVnaW5fcXVvdGFfcmVjb3Zlcnkob3NiLCBybV9xdW90YVtpXSk7CisJCWlmIChJU19FUlIocXJlYykpIHsKKwkJCXN0YXR1cyA9IFBUUl9FUlIocXJlYyk7CisJCQltbG9nX2Vycm5vKHN0YXR1cyk7CisJCQljb250aW51ZTsKKwkJfQorCQlvY2ZzMl9xdWV1ZV9yZWNvdmVyeV9jb21wbGV0aW9uKG9zYi0+am91cm5hbCwgcm1fcXVvdGFbaV0sCisJCQkJCQlOVUxMLCBOVUxMLCBxcmVjKTsKKwl9CisKIAlvY2ZzMl9zdXBlcl91bmxvY2sob3NiLCAxKTsKIAogCS8qIFdlIGFsd2F5cyBydW4gcmVjb3Zlcnkgb24gb3VyIG93biBvcnBoYW4gZGlyIC0gdGhlIGRlYWQKIAkgKiBub2RlKHMpIG1heSBoYXZlIGRpc2FsbG93ZCBhIHByZXZpb3MgaW5vZGUgZGVsZXRlLiBSZS1wcm9jZXNzaW5nCiAJICogaXMgdGhlcmVmb3JlIHJlcXVpcmVkLiAqLwogCW9jZnMyX3F1ZXVlX3JlY292ZXJ5X2NvbXBsZXRpb24ob3NiLT5qb3VybmFsLCBvc2ItPnNsb3RfbnVtLCBOVUxMLAotCQkJCQlOVUxMKTsKKwkJCQkJTlVMTCwgTlVMTCk7CiAKIGJhaWw6CiAJbXV0ZXhfbG9jaygmb3NiLT5yZWNvdmVyeV9sb2NrKTsKQEAgLTEwNzYsNiArMTMyMCw5IEBACiAKIAltdXRleF91bmxvY2soJm9zYi0+cmVjb3ZlcnlfbG9jayk7CiAKKwlpZiAocm1fcXVvdGEpCisJCWtmcmVlKHJtX3F1b3RhKTsKKwogCW1sb2dfZXhpdChzdGF0dXMpOwogCS8qIG5vIG9uZSBpcyBjYWxsaW50IGt0aHJlYWRfc3RvcCgpIGZvciB1cyBzbyB0aGUga3RocmVhZCgpIGFwaQogCSAqIHJlcXVpcmVzIHRoYXQgd2UgY2FsbCBkb19leGl0KCkuICBBbmQgaXQgaXNuJ3QgZXhwb3J0ZWQsIGJ1dApAQCAtMTEzNSw4ICsxMzgyLDcgQEAKIAl9CiAJU0VUX0lOT0RFX0pPVVJOQUwoaW5vZGUpOwogCi0Jc3RhdHVzID0gb2NmczJfcmVhZF9ibG9ja3MoaW5vZGUsIE9DRlMyX0koaW5vZGUpLT5pcF9ibGtubywgMSwgYmgsCi0JCQkJICAgT0NGUzJfQkhfSUdOT1JFX0NBQ0hFKTsKKwlzdGF0dXMgPSBvY2ZzMl9yZWFkX2lub2RlX2Jsb2NrX2Z1bGwoaW5vZGUsIGJoLCBPQ0ZTMl9CSF9JR05PUkVfQ0FDSEUpOwogCWlmIChzdGF0dXMgPCAwKSB7CiAJCW1sb2dfZXJybm8oc3RhdHVzKTsKIAkJZ290byBiYWlsOwpAQCAtMTI2OCw2ICsxNTE0LDcgQEAKIAlvc2ItPnNsb3RfcmVjb3ZlcnlfZ2VuZXJhdGlvbnNbc2xvdF9udW1dID0KIAkJCQkJb2NmczJfZ2V0X3JlY292ZXJ5X2dlbmVyYXRpb24oZmUpOwogCisJb2NmczJfY29tcHV0ZV9tZXRhX2VjYyhvc2ItPnNiLCBiaC0+Yl9kYXRhLCAmZmUtPmlfY2hlY2spOwogCXN0YXR1cyA9IG9jZnMyX3dyaXRlX2Jsb2NrKG9zYiwgYmgsIGlub2RlKTsKIAlpZiAoc3RhdHVzIDwgMCkKIAkJbWxvZ19lcnJubyhzdGF0dXMpOwpAQCAtMTMwNCwzMSArMTU1MSwxOSBAQAogICogZmFyIGxlc3MgY29uY2VybmluZy4KICAqLwogc3RhdGljIGludCBvY2ZzMl9yZWNvdmVyX25vZGUoc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsCi0JCQkgICAgICBpbnQgbm9kZV9udW0pCisJCQkgICAgICBpbnQgbm9kZV9udW0sIGludCBzbG90X251bSkKIHsKIAlpbnQgc3RhdHVzID0gMDsKLQlpbnQgc2xvdF9udW07CiAJc3RydWN0IG9jZnMyX2Rpbm9kZSAqbGFfY29weSA9IE5VTEw7CiAJc3RydWN0IG9jZnMyX2Rpbm9kZSAqdGxfY29weSA9IE5VTEw7CiAKLQltbG9nX2VudHJ5KCIobm9kZV9udW09JWQsIG9zYi0+bm9kZV9udW0gPSAlZClcbiIsCi0JCSAgIG5vZGVfbnVtLCBvc2ItPm5vZGVfbnVtKTsKLQotCW1sb2coMCwgImNoZWNraW5nIG5vZGUgJWRcbiIsIG5vZGVfbnVtKTsKKwltbG9nX2VudHJ5KCIobm9kZV9udW09JWQsIHNsb3RfbnVtPSVkLCBvc2ItPm5vZGVfbnVtID0gJWQpXG4iLAorCQkgICBub2RlX251bSwgc2xvdF9udW0sIG9zYi0+bm9kZV9udW0pOwogCiAJLyogU2hvdWxkIG5vdCBldmVyIGJlIGNhbGxlZCB0byByZWNvdmVyIG91cnNlbHZlcyAtLSBpbiB0aGF0CiAJICogY2FzZSB3ZSBzaG91bGQndmUgY2FsbGVkIG9jZnMyX2pvdXJuYWxfbG9hZCBpbnN0ZWFkLiAqLwogCUJVR19PTihvc2ItPm5vZGVfbnVtID09IG5vZGVfbnVtKTsKIAotCXNsb3RfbnVtID0gb2NmczJfbm9kZV9udW1fdG9fc2xvdChvc2IsIG5vZGVfbnVtKTsKLQlpZiAoc2xvdF9udW0gPT0gLUVOT0VOVCkgewotCQlzdGF0dXMgPSAwOwotCQltbG9nKDAsICJubyBzbG90IGZvciB0aGlzIG5vZGUsIHNvIG5vIHJlY292ZXJ5IHJlcXVpcmVkLlxuIik7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQltbG9nKDAsICJub2RlICVkIHdhcyB1c2luZyBzbG90ICVkXG4iLCBub2RlX251bSwgc2xvdF9udW0pOwotCiAJc3RhdHVzID0gb2NmczJfcmVwbGF5X2pvdXJuYWwob3NiLCBub2RlX251bSwgc2xvdF9udW0pOwogCWlmIChzdGF0dXMgPCAwKSB7CiAJCWlmIChzdGF0dXMgPT0gLUVCVVNZKSB7CkBAIC0xMzY0LDcgKzE1OTksNyBAQAogCiAJLyogVGhpcyB3aWxsIGtmcmVlIHRoZSBtZW1vcnkgcG9pbnRlZCB0byBieSBsYV9jb3B5IGFuZCB0bF9jb3B5ICovCiAJb2NmczJfcXVldWVfcmVjb3ZlcnlfY29tcGxldGlvbihvc2ItPmpvdXJuYWwsIHNsb3RfbnVtLCBsYV9jb3B5LAotCQkJCQl0bF9jb3B5KTsKKwkJCQkJdGxfY29weSwgTlVMTCk7CiAKIAlzdGF0dXMgPSAwOwogZG9uZToKQEAgLTE2NTksMTMgKzE4OTQsMTQgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IG9jZnMyX3dhaXRfb25fbW91bnQoc3RydWN0IG9jZnMyX3N1cGVyICpvc2IpCitzdGF0aWMgaW50IF9fb2NmczJfd2FpdF9vbl9tb3VudChzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiwgaW50IHF1b3RhKQogewogCS8qIFRoaXMgY2hlY2sgaXMgZ29vZCBiZWNhdXNlIG9jZnMyIHdpbGwgd2FpdCBvbiBvdXIgcmVjb3ZlcnkKIAkgKiB0aHJlYWQgYmVmb3JlIGNoYW5naW5nIGl0IHRvIHNvbWV0aGluZyBvdGhlciB0aGFuIE1PVU5URUQKIAkgKiBvciBESVNBQkxFRC4gKi8KIAl3YWl0X2V2ZW50KG9zYi0+b3NiX21vdW50X2V2ZW50LAotCQkgICBhdG9taWNfcmVhZCgmb3NiLT52b2xfc3RhdGUpID09IFZPTFVNRV9NT1VOVEVEIHx8CisJCSAgKCFxdW90YSAmJiBhdG9taWNfcmVhZCgmb3NiLT52b2xfc3RhdGUpID09IFZPTFVNRV9NT1VOVEVEKSB8fAorCQkgICBhdG9taWNfcmVhZCgmb3NiLT52b2xfc3RhdGUpID09IFZPTFVNRV9NT1VOVEVEX1FVT1RBUyB8fAogCQkgICBhdG9taWNfcmVhZCgmb3NiLT52b2xfc3RhdGUpID09IFZPTFVNRV9ESVNBQkxFRCk7CiAKIAkvKiBJZiB0aGVyZSdzIGFuIGVycm9yIG9uIG1vdW50LCB0aGVuIHdlIG1heSBuZXZlciBnZXQgdG8gdGhlCmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9qb3VybmFsLmggYi9mcy9vY2ZzMi9qb3VybmFsLmgKaW5kZXggZDRkMTRlOS4uM2MzNTMyZSAxMDA2NDQKLS0tIGEvZnMvb2NmczIvam91cm5hbC5oCisrKyBiL2ZzL29jZnMyL2pvdXJuYWwuaApAQCAtMjcsMTIgKzI3LDcgQEAKICNkZWZpbmUgT0NGUzJfSk9VUk5BTF9ICiAKICNpbmNsdWRlIDxsaW51eC9mcy5oPgotI2lmbmRlZiBDT05GSUdfT0NGUzJfQ09NUEFUX0pCRAotIyBpbmNsdWRlIDxsaW51eC9qYmQyLmg+Ci0jZWxzZQotIyBpbmNsdWRlIDxsaW51eC9qYmQuaD4KLSMgaW5jbHVkZSAib2NmczJfamJkX2NvbXBhdC5oIgotI2VuZGlmCisjaW5jbHVkZSA8bGludXgvamJkMi5oPgogCiBlbnVtIG9jZnMyX2pvdXJuYWxfc3RhdGUgewogCU9DRlMyX0pPVVJOQUxfRlJFRSA9IDAsCkBAIC0xNzMsNiArMTY4LDcgQEAKIAkJCSAgICAgaW50IG5vZGVfbnVtKTsKIGludCAgICBvY2ZzMl9tYXJrX2RlYWRfbm9kZXMoc3RydWN0IG9jZnMyX3N1cGVyICpvc2IpOwogdm9pZCAgIG9jZnMyX2NvbXBsZXRlX21vdW50X3JlY292ZXJ5KHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiKTsKK3ZvaWQgb2NmczJfY29tcGxldGVfcXVvdGFfcmVjb3Zlcnkoc3RydWN0IG9jZnMyX3N1cGVyICpvc2IpOwogCiBzdGF0aWMgaW5saW5lIHZvaWQgb2NmczJfc3RhcnRfY2hlY2twb2ludChzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYikKIHsKQEAgLTIxNiw5ICsyMTIsMTIgQEAKICAqICBvY2ZzMl9leHRlbmRfdHJhbnMgICAgIC0gRXh0ZW5kIGEgaGFuZGxlIGJ5IG5ibG9ja3MgY3JlZGl0cy4gVGhpcyBtYXkKICAqICAgICAgICAgICAgICAgICAgICAgICAgICBjb21taXQgdGhlIGhhbmRsZSB0byBkaXNrIGluIHRoZSBwcm9jZXNzLCBidXQgd2lsbAogICogICAgICAgICAgICAgICAgICAgICAgICAgIG5vdCByZWxlYXNlIGFueSBsb2NrcyB0YWtlbiBkdXJpbmcgdGhlIHRyYW5zYWN0aW9uLgotICogIG9jZnMyX2pvdXJuYWxfYWNjZXNzICAgLSBOb3RpZnkgdGhlIGhhbmRsZSB0aGF0IHdlIHdhbnQgdG8gam91cm5hbCB0aGlzCisgKiAgb2NmczJfam91cm5hbF9hY2Nlc3MqIC0gTm90aWZ5IHRoZSBoYW5kbGUgdGhhdCB3ZSB3YW50IHRvIGpvdXJuYWwgdGhpcwogICogICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci4gV2lsbCBoYXZlIHRvIGNhbGwgb2NmczJfam91cm5hbF9kaXJ0eSBvbmNlCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgd2UndmUgYWN0dWFsbHkgZGlydGllZCBpdC4gVHlwZSBpcyBvbmUgb2YgLiBvciAuCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgQWx3YXlzIGNhbGwgdGhlIHNwZWNpZmljIGZsYXZvciBvZgorICogICAgICAgICAgICAgICAgICAgICAgICAgIG9jZnMyX2pvdXJuYWxfYWNjZXNzXyooKSB1bmxlc3MgeW91IGludGVuZCB0bworICogICAgICAgICAgICAgICAgICAgICAgICAgIG1hbmFnZSB0aGUgY2hlY2tzdW0gYnkgaGFuZC4KICAqICBvY2ZzMl9qb3VybmFsX2RpcnR5ICAgIC0gTWFyayBhIGpvdXJuYWxsZWQgYnVmZmVyIGFzIGhhdmluZyBkaXJ0eSBkYXRhLgogICogIG9jZnMyX2piZDJfZmlsZV9pbm9kZSAgLSBNYXJrIGFuIGlub2RlIHNvIHRoYXQgaXRzIGRhdGEgZ29lcyBvdXQgYmVmb3JlCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBjdXJyZW50IGhhbmRsZSBjb21taXRzLgpAQCAtMjQ4LDEwICsyNDcsMjkgQEAKICNkZWZpbmUgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUgIDEKICNkZWZpbmUgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfVU5ETyAgIDIKIAotaW50ICAgICAgICAgICAgICAgICAgb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlX3QgKmhhbmRsZSwKLQkJCQkJICBzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCQkJCQkgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsCi0JCQkJCSAgaW50IHR5cGUpOworCisvKiBvY2ZzMl9pbm9kZSAqLworaW50IG9jZnMyX2pvdXJuYWxfYWNjZXNzX2RpKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgaW50IHR5cGUpOworLyogb2NmczJfZXh0ZW50X2Jsb2NrICovCitpbnQgb2NmczJfam91cm5hbF9hY2Nlc3NfZWIoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSwKKwkJCSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCBpbnQgdHlwZSk7CisvKiBvY2ZzMl9ncm91cF9kZXNjICovCitpbnQgb2NmczJfam91cm5hbF9hY2Nlc3NfZ2QoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSwKKwkJCSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCBpbnQgdHlwZSk7CisvKiBvY2ZzMl94YXR0cl9ibG9jayAqLworaW50IG9jZnMyX2pvdXJuYWxfYWNjZXNzX3hiKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgaW50IHR5cGUpOworLyogcXVvdGEgYmxvY2tzICovCitpbnQgb2NmczJfam91cm5hbF9hY2Nlc3NfZHEoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSwKKwkJCSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCBpbnQgdHlwZSk7CisvKiBkaXJibG9jayAqLworaW50IG9jZnMyX2pvdXJuYWxfYWNjZXNzX2RiKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgaW50IHR5cGUpOworLyogQW55dGhpbmcgdGhhdCBoYXMgbm8gZWNjICovCitpbnQgb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSwKKwkJCSBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCBpbnQgdHlwZSk7CisKIC8qCiAgKiBBIHdvcmQgYWJvdXQgdGhlIGpvdXJuYWxfYWNjZXNzL2pvdXJuYWxfZGlydHkgImRhbmNlIi4gSXQgaXMKICAqIGVudGlyZWx5IGxlZ2FsIHRvIGpvdXJuYWxfYWNjZXNzIGEgYnVmZmVyIG1vcmUgdGhhbiBvbmNlIChhcyBsb25nCkBAIC0yNzMsMTAgKzI5MSw2IEBACiAgKi8KIGludCAgICAgICAgICAgICAgICAgIG9jZnMyX2pvdXJuYWxfZGlydHkoaGFuZGxlX3QgKmhhbmRsZSwKIAkJCQkJIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpOwotI2lmZGVmIENPTkZJR19PQ0ZTMl9DT01QQVRfSkJECi1pbnQgICAgICAgICAgICAgICAgICBvY2ZzMl9qb3VybmFsX2RpcnR5X2RhdGEoaGFuZGxlX3QgKmhhbmRsZSwKLQkJCQkJICAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCk7Ci0jZW5kaWYKIAogLyoKICAqICBDcmVkaXQgTWFjcm9zOgpAQCAtMjkzLDYgKzMwNywzNyBAQAogLyogZXh0ZW5kZWQgYXR0cmlidXRlIGJsb2NrIHVwZGF0ZSAqLwogI2RlZmluZSBPQ0ZTMl9YQVRUUl9CTE9DS19VUERBVEVfQ1JFRElUUyAxCiAKKy8qIGdsb2JhbCBxdW90YWZpbGUgaW5vZGUgdXBkYXRlLCBkYXRhIGJsb2NrICovCisjZGVmaW5lIE9DRlMyX1FJTkZPX1dSSVRFX0NSRURJVFMgKE9DRlMyX0lOT0RFX1VQREFURV9DUkVESVRTICsgMSkKKworLyoKKyAqIFRoZSB0d28gd3JpdGVzIGJlbG93IGNhbiBhY2NpZGVudGFsbHkgc2VlIGdsb2JhbCBpbmZvIGRpcnR5IGR1ZQorICogdG8gc2V0X2luZm8oKSBxdW90YWN0bCBzbyBtYWtlIHRoZW0gcHJlcGFyZWQgZm9yIHRoZSB3cml0ZXMuCisgKi8KKy8qIHF1b3RhIGRhdGEgYmxvY2ssIGdsb2JhbCBpbmZvICovCisvKiBXcml0ZSB0byBsb2NhbCBxdW90YSBmaWxlICovCisjZGVmaW5lIE9DRlMyX1FXUklURV9DUkVESVRTIChPQ0ZTMl9RSU5GT19XUklURV9DUkVESVRTICsgMSkKKworLyogZ2xvYmFsIHF1b3RhIGRhdGEgYmxvY2ssIGxvY2FsIHF1b3RhIGRhdGEgYmxvY2ssIGdsb2JhbCBxdW90YSBpbm9kZSwKKyAqIGdsb2JhbCBxdW90YSBpbmZvICovCisjZGVmaW5lIE9DRlMyX1FTWU5DX0NSRURJVFMgKE9DRlMyX0lOT0RFX1VQREFURV9DUkVESVRTICsgMykKKworc3RhdGljIGlubGluZSBpbnQgb2NmczJfcXVvdGFfdHJhbnNfY3JlZGl0cyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCWludCBjcmVkaXRzID0gMDsKKworCWlmIChPQ0ZTMl9IQVNfUk9fQ09NUEFUX0ZFQVRVUkUoc2IsIE9DRlMyX0ZFQVRVUkVfUk9fQ09NUEFUX1VTUlFVT1RBKSkKKwkJY3JlZGl0cyArPSBPQ0ZTMl9RV1JJVEVfQ1JFRElUUzsKKwlpZiAoT0NGUzJfSEFTX1JPX0NPTVBBVF9GRUFUVVJFKHNiLCBPQ0ZTMl9GRUFUVVJFX1JPX0NPTVBBVF9HUlBRVU9UQSkpCisJCWNyZWRpdHMgKz0gT0NGUzJfUVdSSVRFX0NSRURJVFM7CisJcmV0dXJuIGNyZWRpdHM7Cit9CisKKy8qIE51bWJlciBvZiBjcmVkaXRzIG5lZWRlZCBmb3IgcmVtb3ZpbmcgcXVvdGEgc3RydWN0dXJlIGZyb20gZmlsZSAqLworaW50IG9jZnMyX2NhbGNfcWRlbF9jcmVkaXRzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCB0eXBlKTsKKy8qIE51bWJlciBvZiBjcmVkaXRzIG5lZWRlZCBmb3IgaW5pdGlhbGl6YXRpb24gb2YgbmV3IHF1b3RhIHN0cnVjdHVyZSAqLworaW50IG9jZnMyX2NhbGNfcWluaXRfY3JlZGl0cyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgdHlwZSk7CisKIC8qIGdyb3VwIGV4dGVuZC4gaW5vZGUgdXBkYXRlIGFuZCBsYXN0IGdyb3VwIHVwZGF0ZS4gKi8KICNkZWZpbmUgT0NGUzJfR1JPVVBfRVhURU5EX0NSRURJVFMJKE9DRlMyX0lOT0RFX1VQREFURV9DUkVESVRTICsgMSkKIApAQCAtMzAzLDggKzM0OCwxMSBAQAogICogcHJldi4gZ3JvdXAgZGVzYy4gaWYgd2UgcmVsaW5rLiAqLwogI2RlZmluZSBPQ0ZTMl9TVUJBTExPQ19BTExPQyAoMykKIAotI2RlZmluZSBPQ0ZTMl9JTkxJTkVfVE9fRVhURU5UU19DUkVESVRTIChPQ0ZTMl9TVUJBTExPQ19BTExPQwkJXAotCQkJCQkgKyBPQ0ZTMl9JTk9ERV9VUERBVEVfQ1JFRElUUykKK3N0YXRpYyBpbmxpbmUgaW50IG9jZnMyX2lubGluZV90b19leHRlbnRzX2NyZWRpdHMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlyZXR1cm4gT0NGUzJfU1VCQUxMT0NfQUxMT0MgKyBPQ0ZTMl9JTk9ERV9VUERBVEVfQ1JFRElUUyArCisJICAgICAgIG9jZnMyX3F1b3RhX3RyYW5zX2NyZWRpdHMoc2IpOworfQogCiAvKiBkaW5vZGUgKyBncm91cCBkZXNjcmlwdG9yIHVwZGF0ZS4gV2UgZG9uJ3QgcmVsaW5rIG9uIGZyZWUgeWV0LiAqLwogI2RlZmluZSBPQ0ZTMl9TVUJBTExPQ19GUkVFICAoMikKQEAgLTMxMywxNiArMzYxLDIzIEBACiAjZGVmaW5lIE9DRlMyX1RSVU5DQVRFX0xPR19GTFVTSF9PTkVfUkVDIChPQ0ZTMl9TVUJBTExPQ19GUkVFIAkJICAgICAgXAogCQkJCQkgKyBPQ0ZTMl9UUlVOQ0FURV9MT0dfVVBEQVRFKQogCi0jZGVmaW5lIE9DRlMyX1JFTU9WRV9FWFRFTlRfQ1JFRElUUyAoT0NGUzJfVFJVTkNBVEVfTE9HX1VQREFURSArIE9DRlMyX0lOT0RFX1VQREFURV9DUkVESVRTKQorc3RhdGljIGlubGluZSBpbnQgb2NmczJfcmVtb3ZlX2V4dGVudF9jcmVkaXRzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJcmV0dXJuIE9DRlMyX1RSVU5DQVRFX0xPR19VUERBVEUgKyBPQ0ZTMl9JTk9ERV9VUERBVEVfQ1JFRElUUyArCisJICAgICAgIG9jZnMyX3F1b3RhX3RyYW5zX2NyZWRpdHMoc2IpOworfQogCiAvKiBkYXRhIGJsb2NrIGZvciBuZXcgZGlyL3N5bWxpbmssIDIgZm9yIGJpdG1hcCB1cGRhdGVzIChiaXRtYXAgZmUgKwogICogYml0bWFwIGJsb2NrIGZvciB0aGUgbmV3IGJpdCkgKi8KICNkZWZpbmUgT0NGUzJfRElSX0xJTktfQURESVRJT05BTF9DUkVESVRTICgxICsgMikKIAogLyogcGFyZW50IGZlLCBwYXJlbnQgYmxvY2ssIG5ldyBmaWxlIGVudHJ5LCBpbm9kZSBhbGxvYyBmZSwgaW5vZGUgYWxsb2MKLSAqIGdyb3VwIGRlc2NyaXB0b3IgKyBta2Rpci9zeW1saW5rIGJsb2NrcyAqLwotI2RlZmluZSBPQ0ZTMl9NS05PRF9DUkVESVRTICgzICsgT0NGUzJfU1VCQUxMT0NfQUxMT0MgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkJICAgICsgT0NGUzJfRElSX0xJTktfQURESVRJT05BTF9DUkVESVRTKQorICogZ3JvdXAgZGVzY3JpcHRvciArIG1rZGlyL3N5bWxpbmsgYmxvY2tzICsgcXVvdGEgdXBkYXRlICovCitzdGF0aWMgaW5saW5lIGludCBvY2ZzMl9ta25vZF9jcmVkaXRzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJcmV0dXJuIDMgKyBPQ0ZTMl9TVUJBTExPQ19BTExPQyArIE9DRlMyX0RJUl9MSU5LX0FERElUSU9OQUxfQ1JFRElUUyArCisJICAgICAgIG9jZnMyX3F1b3RhX3RyYW5zX2NyZWRpdHMoc2IpOworfQogCiAvKiBsb2NhbCBhbGxvYyBtZXRhZGF0YSBjaGFuZ2UgKyBtYWluIGJpdG1hcCB1cGRhdGVzICovCiAjZGVmaW5lIE9DRlMyX1dJTkRPV19NT1ZFX0NSRURJVFMgKE9DRlMyX0lOT0RFX1VQREFURV9DUkVESVRTICAgICAgICAgICAgICAgICBcCkBAIC0zMzIsMTMgKzM4NywyMSBAQAogICogZm9yIHRoZSBkaW5vZGUsIG9uZSBmb3IgdGhlIG5ldyBibG9jay4gKi8KICNkZWZpbmUgT0NGUzJfU0lNUExFX0RJUl9FWFRFTkRfQ1JFRElUUyAoMikKIAotLyogZmlsZSB1cGRhdGUgKG5saW5rLCBldGMpICsgZGlyZWN0b3J5IG10aW1lL2N0aW1lICsgZGlyIGVudHJ5IGJsb2NrICovCi0jZGVmaW5lIE9DRlMyX0xJTktfQ1JFRElUUyAgKDIqT0NGUzJfSU5PREVfVVBEQVRFX0NSRURJVFMgKyAxKQorLyogZmlsZSB1cGRhdGUgKG5saW5rLCBldGMpICsgZGlyZWN0b3J5IG10aW1lL2N0aW1lICsgZGlyIGVudHJ5IGJsb2NrICsgcXVvdGEKKyAqIHVwZGF0ZSBvbiBkaXIgKi8KK3N0YXRpYyBpbmxpbmUgaW50IG9jZnMyX2xpbmtfY3JlZGl0cyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXJldHVybiAyKk9DRlMyX0lOT0RFX1VQREFURV9DUkVESVRTICsgMSArCisJICAgICAgIG9jZnMyX3F1b3RhX3RyYW5zX2NyZWRpdHMoc2IpOworfQogCiAvKiBpbm9kZSArIGRpciBpbm9kZSAoaWYgd2UgdW5saW5rIGEgZGlyKSwgKyBkaXIgZW50cnkgYmxvY2sgKyBvcnBoYW4KICAqIGRpciBpbm9kZSBsaW5rICovCi0jZGVmaW5lIE9DRlMyX1VOTElOS19DUkVESVRTICAoMiAqIE9DRlMyX0lOT0RFX1VQREFURV9DUkVESVRTICsgMSAgICAgICAgICAgICBcCi0JCQkgICAgICArIE9DRlMyX0xJTktfQ1JFRElUUykKK3N0YXRpYyBpbmxpbmUgaW50IG9jZnMyX3VubGlua19jcmVkaXRzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJLyogVGhlIHF1b3RhIHVwZGF0ZSBmcm9tIG9jZnMyX2xpbmtfY3JlZGl0cyBpcyB1bnVzZWQgaGVyZS4uLiAqLworCXJldHVybiAyICogT0NGUzJfSU5PREVfVVBEQVRFX0NSRURJVFMgKyAxICsgb2NmczJfbGlua19jcmVkaXRzKHNiKTsKK30KIAogLyogZGlub2RlICsgb3JwaGFuIGRpciBkaW5vZGUgKyBpbm9kZSBhbGxvYyBkaW5vZGUgKyBvcnBoYW4gZGlyIGVudHJ5ICsKICAqIGlub2RlIGFsbG9jIGdyb3VwIGRlc2NyaXB0b3IgKi8KQEAgLTM0Nyw4ICs0MTAsMTAgQEAKIC8qIGRpbm9kZSB1cGRhdGUsIG9sZCBkaXIgZGlub2RlIHVwZGF0ZSwgbmV3IGRpciBkaW5vZGUgdXBkYXRlLCBvbGQKICAqIGRpciBkaXIgZW50cnksIG5ldyBkaXIgZGlyIGVudHJ5LCBkaXIgZW50cnkgdXBkYXRlIGZvciByZW5hbWluZwogICogZGlyZWN0b3J5ICsgdGFyZ2V0IHVubGluayAqLwotI2RlZmluZSBPQ0ZTMl9SRU5BTUVfQ1JFRElUUyAoMyAqIE9DRlMyX0lOT0RFX1VQREFURV9DUkVESVRTICsgMyAgICAgICAgICAgICAgXAotCQkJICAgICArIE9DRlMyX1VOTElOS19DUkVESVRTKQorc3RhdGljIGlubGluZSBpbnQgb2NmczJfcmVuYW1lX2NyZWRpdHMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlyZXR1cm4gMyAqIE9DRlMyX0lOT0RFX1VQREFURV9DUkVESVRTICsgMyArIG9jZnMyX3VubGlua19jcmVkaXRzKHNiKTsKK30KIAogLyogZ2xvYmFsIGJpdG1hcCBkaW5vZGUsIGdyb3VwIGRlc2MuLCByZWxpbmtlZCBncm91cCwKICAqIHN1YmFsbG9jYXRvciBkaW5vZGUsIGdyb3VwIGRlc2MuLCByZWxpbmtlZCBncm91cCwKQEAgLTM4NiwxOCArNDUxLDE5IEBACiAJICogY3JlZGl0IGZvciB0aGUgZGlub2RlIHRoZXJlLiAqLwogCWV4dGVudF9ibG9ja3MgPSAxICsgMSArIGxlMTZfdG9fY3B1KHJvb3RfZWwtPmxfdHJlZV9kZXB0aCk7CiAKLQlyZXR1cm4gYml0bWFwX2Jsb2NrcyArIHN5c2ZpbGVfYml0bWFwX2Jsb2NrcyArIGV4dGVudF9ibG9ja3M7CisJcmV0dXJuIGJpdG1hcF9ibG9ja3MgKyBzeXNmaWxlX2JpdG1hcF9ibG9ja3MgKyBleHRlbnRfYmxvY2tzICsKKwkgICAgICAgb2NmczJfcXVvdGFfdHJhbnNfY3JlZGl0cyhzYik7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IG9jZnMyX2NhbGNfc3ltbGlua19jcmVkaXRzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCiB7Ci0JaW50IGJsb2NrcyA9IE9DRlMyX01LTk9EX0NSRURJVFM7CisJaW50IGJsb2NrcyA9IG9jZnMyX21rbm9kX2NyZWRpdHMoc2IpOwogCiAJLyogbGlua3MgY2FuIGJlIGxvbmdlciB0aGFuIG9uZSBibG9jayBzbyB3ZSBtYXkgdXBkYXRlIG1hbnkKIAkgKiB3aXRoaW4gb3VyIHNpbmdsZSBhbGxvY2F0ZWQgZXh0ZW50LiAqLwogCWJsb2NrcyArPSBvY2ZzMl9jbHVzdGVyc190b19ibG9ja3Moc2IsIDEpOwogCi0JcmV0dXJuIGJsb2NrczsKKwlyZXR1cm4gYmxvY2tzICsgb2NmczJfcXVvdGFfdHJhbnNfY3JlZGl0cyhzYik7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IG9jZnMyX2NhbGNfZ3JvdXBfYWxsb2NfY3JlZGl0cyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLApAQCAtNDM0LDYgKzUwMCw4IEBACiAJLyogdXBkYXRlIHRvIHRoZSB0cnVuY2F0ZSBsb2cuICovCiAJY3JlZGl0cyArPSBPQ0ZTMl9UUlVOQ0FURV9MT0dfVVBEQVRFOwogCisJY3JlZGl0cyArPSBvY2ZzMl9xdW90YV90cmFuc19jcmVkaXRzKHNiKTsKKwogCXJldHVybiBjcmVkaXRzOwogfQogCmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9sb2NhbGFsbG9jLmMgYi9mcy9vY2ZzMi9sb2NhbGFsbG9jLmMKaW5kZXggNjg3YjI4Ny4uZWM3MGNkYiAxMDA2NDQKLS0tIGEvZnMvb2NmczIvbG9jYWxhbGxvYy5jCisrKyBiL2ZzL29jZnMyL2xvY2FsYWxsb2MuYwpAQCAtMzYsNiArMzYsNyBAQAogI2luY2x1ZGUgIm9jZnMyLmgiCiAKICNpbmNsdWRlICJhbGxvYy5oIgorI2luY2x1ZGUgImJsb2NrY2hlY2suaCIKICNpbmNsdWRlICJkbG1nbHVlLmgiCiAjaW5jbHVkZSAiaW5vZGUuaCIKICNpbmNsdWRlICJqb3VybmFsLmgiCkBAIC0yNDgsOCArMjQ5LDggQEAKIAkJZ290byBiYWlsOwogCX0KIAotCXN0YXR1cyA9IG9jZnMyX3JlYWRfYmxvY2tzKGlub2RlLCBPQ0ZTMl9JKGlub2RlKS0+aXBfYmxrbm8sIDEsCi0JCQkJICAgJmFsbG9jX2JoLCBPQ0ZTMl9CSF9JR05PUkVfQ0FDSEUpOworCXN0YXR1cyA9IG9jZnMyX3JlYWRfaW5vZGVfYmxvY2tfZnVsbChpbm9kZSwgJmFsbG9jX2JoLAorCQkJCQkgICAgIE9DRlMyX0JIX0lHTk9SRV9DQUNIRSk7CiAJaWYgKHN0YXR1cyA8IDApIHsKIAkJbWxvZ19lcnJubyhzdGF0dXMpOwogCQlnb3RvIGJhaWw7CkBAIC0zODIsOCArMzgzLDggQEAKIAl9CiAJbWVtY3B5KGFsbG9jX2NvcHksIGFsbG9jLCBiaC0+Yl9zaXplKTsKIAotCXN0YXR1cyA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgbG9jYWxfYWxsb2NfaW5vZGUsIGJoLAotCQkJCSAgICAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKKwlzdGF0dXMgPSBvY2ZzMl9qb3VybmFsX2FjY2Vzc19kaShoYW5kbGUsIGxvY2FsX2FsbG9jX2lub2RlLCBiaCwKKwkJCQkJIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKIAlpZiAoc3RhdHVzIDwgMCkgewogCQltbG9nX2Vycm5vKHN0YXR1cyk7CiAJCWdvdG8gb3V0X2NvbW1pdDsKQEAgLTQ1OSw4ICs0NjAsOCBAQAogCiAJbXV0ZXhfbG9jaygmaW5vZGUtPmlfbXV0ZXgpOwogCi0Jc3RhdHVzID0gb2NmczJfcmVhZF9ibG9ja3MoaW5vZGUsIE9DRlMyX0koaW5vZGUpLT5pcF9ibGtubywgMSwKLQkJCQkgICAmYWxsb2NfYmgsIE9DRlMyX0JIX0lHTk9SRV9DQUNIRSk7CisJc3RhdHVzID0gb2NmczJfcmVhZF9pbm9kZV9ibG9ja19mdWxsKGlub2RlLCAmYWxsb2NfYmgsCisJCQkJCSAgICAgT0NGUzJfQkhfSUdOT1JFX0NBQ0hFKTsKIAlpZiAoc3RhdHVzIDwgMCkgewogCQltbG9nX2Vycm5vKHN0YXR1cyk7CiAJCWdvdG8gYmFpbDsKQEAgLTQ3Niw2ICs0NzcsNyBAQAogCWFsbG9jID0gKHN0cnVjdCBvY2ZzMl9kaW5vZGUgKikgYWxsb2NfYmgtPmJfZGF0YTsKIAlvY2ZzMl9jbGVhcl9sb2NhbF9hbGxvYyhhbGxvYyk7CiAKKwlvY2ZzMl9jb21wdXRlX21ldGFfZWNjKG9zYi0+c2IsIGFsbG9jX2JoLT5iX2RhdGEsICZhbGxvYy0+aV9jaGVjayk7CiAJc3RhdHVzID0gb2NmczJfd3JpdGVfYmxvY2sob3NiLCBhbGxvY19iaCwgaW5vZGUpOwogCWlmIChzdGF0dXMgPCAwKQogCQltbG9nX2Vycm5vKHN0YXR1cyk7CkBAIC03NjIsOSArNzY0LDkgQEAKIAkgKiBkZWxldGUgYml0cyBmcm9tIGl0ISAqLwogCSpudW1fYml0cyA9IGJpdHNfd2FudGVkOwogCi0Jc3RhdHVzID0gb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBsb2NhbF9hbGxvY19pbm9kZSwKLQkJCQkgICAgICBvc2ItPmxvY2FsX2FsbG9jX2JoLAotCQkJCSAgICAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKKwlzdGF0dXMgPSBvY2ZzMl9qb3VybmFsX2FjY2Vzc19kaShoYW5kbGUsIGxvY2FsX2FsbG9jX2lub2RlLAorCQkJCQkgb3NiLT5sb2NhbF9hbGxvY19iaCwKKwkJCQkJIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKIAlpZiAoc3RhdHVzIDwgMCkgewogCQltbG9nX2Vycm5vKHN0YXR1cyk7CiAJCWdvdG8gYmFpbDsKQEAgLTEyNDAsOSArMTI0Miw5IEBACiAJfQogCW1lbWNweShhbGxvY19jb3B5LCBhbGxvYywgb3NiLT5sb2NhbF9hbGxvY19iaC0+Yl9zaXplKTsKIAotCXN0YXR1cyA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgbG9jYWxfYWxsb2NfaW5vZGUsCi0JCQkJICAgICAgb3NiLT5sb2NhbF9hbGxvY19iaCwKLQkJCQkgICAgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CisJc3RhdHVzID0gb2NmczJfam91cm5hbF9hY2Nlc3NfZGkoaGFuZGxlLCBsb2NhbF9hbGxvY19pbm9kZSwKKwkJCQkJIG9zYi0+bG9jYWxfYWxsb2NfYmgsCisJCQkJCSBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CiAJaWYgKHN0YXR1cyA8IDApIHsKIAkJbWxvZ19lcnJubyhzdGF0dXMpOwogCQlnb3RvIGJhaWw7CmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9uYW1laS5jIGIvZnMvb2NmczIvbmFtZWkuYwppbmRleCAyNTQ1ZTc0Li4wODRhYmE4IDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9uYW1laS5jCisrKyBiL2ZzL29jZnMyL25hbWVpLmMKQEAgLTQwLDYgKzQwLDcgQEAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CisjaW5jbHVkZSA8bGludXgvcXVvdGFvcHMuaD4KIAogI2RlZmluZSBNTE9HX01BU0tfUFJFRklYIE1MX05BTUVJCiAjaW5jbHVkZSA8Y2x1c3Rlci9tYXNrbG9nLmg+CkBAIC02MSwxNyArNjIsMTggQEAKICNpbmNsdWRlICJzeXNmaWxlLmgiCiAjaW5jbHVkZSAidXB0b2RhdGUuaCIKICNpbmNsdWRlICJ4YXR0ci5oIgorI2luY2x1ZGUgImFjbC5oIgogCiAjaW5jbHVkZSAiYnVmZmVyX2hlYWRfaW8uaCIKIAogc3RhdGljIGludCBvY2ZzMl9ta25vZF9sb2NrZWQoc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsCiAJCQkgICAgICBzdHJ1Y3QgaW5vZGUgKmRpciwKLQkJCSAgICAgIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IG1vZGUsCisJCQkgICAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJICAgICAgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAogCQkJICAgICAgZGV2X3QgZGV2LAogCQkJICAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICoqbmV3X2ZlX2JoLAogCQkJICAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpwYXJlbnRfZmVfYmgsCiAJCQkgICAgICBoYW5kbGVfdCAqaGFuZGxlLAotCQkJICAgICAgc3RydWN0IGlub2RlICoqcmV0X2lub2RlLAogCQkJICAgICAgc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKmlub2RlX2FjKTsKIAogc3RhdGljIGludCBvY2ZzMl9wcmVwYXJlX29ycGhhbl9kaXIoc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsCkBAIC0xODYsNiArMTg4LDM1IEBACiAJcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIHN0cnVjdCBpbm9kZSAqb2NmczJfZ2V0X2luaXRfaW5vZGUoc3RydWN0IGlub2RlICpkaXIsIGludCBtb2RlKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisKKwlpbm9kZSA9IG5ld19pbm9kZShkaXItPmlfc2IpOworCWlmICghaW5vZGUpIHsKKwkJbWxvZyhNTF9FUlJPUiwgIm5ld19pbm9kZSBmYWlsZWQhXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJLyogcG9wdWxhdGUgYXMgbWFueSBmaWVsZHMgZWFybHkgb24gYXMgcG9zc2libGUgLSBtYW55IG9mCisJICogdGhlc2UgYXJlIHVzZWQgYnkgdGhlIHN1cHBvcnQgZnVuY3Rpb25zIGhlcmUgYW5kIGluCisJICogY2FsbGVycy4gKi8KKwlpZiAoU19JU0RJUihtb2RlKSkKKwkJaW5vZGUtPmlfbmxpbmsgPSAyOworCWVsc2UKKwkJaW5vZGUtPmlfbmxpbmsgPSAxOworCWlub2RlLT5pX3VpZCA9IGN1cnJlbnRfZnN1aWQoKTsKKwlpZiAoZGlyLT5pX21vZGUgJiBTX0lTR0lEKSB7CisJCWlub2RlLT5pX2dpZCA9IGRpci0+aV9naWQ7CisJCWlmIChTX0lTRElSKG1vZGUpKQorCQkJbW9kZSB8PSBTX0lTR0lEOworCX0gZWxzZQorCQlpbm9kZS0+aV9naWQgPSBjdXJyZW50X2ZzZ2lkKCk7CisJaW5vZGUtPmlfbW9kZSA9IG1vZGU7CisJdmZzX2RxX2luaXQoaW5vZGUpOworCXJldHVybiBpbm9kZTsKK30KKwogc3RhdGljIGludCBvY2ZzMl9ta25vZChzdHJ1Y3QgaW5vZGUgKmRpciwKIAkJICAgICAgIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKIAkJICAgICAgIGludCBtb2RlLApAQCAtMjAxLDYgKzIzMiwxMyBAQAogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBOVUxMOwogCXN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICppbm9kZV9hYyA9IE5VTEw7CiAJc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKmRhdGFfYWMgPSBOVUxMOworCXN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICp4YXR0cl9hYyA9IE5VTEw7CisJaW50IHdhbnRfY2x1c3RlcnMgPSAwOworCWludCB4YXR0cl9jcmVkaXRzID0gMDsKKwlzdHJ1Y3Qgb2NmczJfc2VjdXJpdHlfeGF0dHJfaW5mbyBzaSA9IHsKKwkJLmVuYWJsZSA9IDEsCisJfTsKKwlpbnQgZGlkX3F1b3RhX2lub2RlID0gMDsKIAogCW1sb2dfZW50cnkoIigweCVwLCAweCVwLCAlZCwgJWx1LCAnJS4qcycpXG4iLCBkaXIsIGRlbnRyeSwgbW9kZSwKIAkJICAgKHVuc2lnbmVkIGxvbmcpZGV2LCBkZW50cnktPmRfbmFtZS5sZW4sCkBAIC0yNTAsMTcgKzI4OCw0NiBAQAogCQlnb3RvIGxlYXZlOwogCX0KIAotCS8qIFJlc2VydmUgYSBjbHVzdGVyIGlmIGNyZWF0aW5nIGFuIGV4dGVudCBiYXNlZCBkaXJlY3RvcnkuICovCi0JaWYgKFNfSVNESVIobW9kZSkgJiYgIW9jZnMyX3N1cHBvcnRzX2lubGluZV9kYXRhKG9zYikpIHsKLQkJc3RhdHVzID0gb2NmczJfcmVzZXJ2ZV9jbHVzdGVycyhvc2IsIDEsICZkYXRhX2FjKTsKLQkJaWYgKHN0YXR1cyA8IDApIHsKLQkJCWlmIChzdGF0dXMgIT0gLUVOT1NQQykKLQkJCQltbG9nX2Vycm5vKHN0YXR1cyk7CisJaW5vZGUgPSBvY2ZzMl9nZXRfaW5pdF9pbm9kZShkaXIsIG1vZGUpOworCWlmICghaW5vZGUpIHsKKwkJc3RhdHVzID0gLUVOT01FTTsKKwkJbWxvZ19lcnJubyhzdGF0dXMpOworCQlnb3RvIGxlYXZlOworCX0KKworCS8qIGdldCBzZWN1cml0eSB4YXR0ciAqLworCXN0YXR1cyA9IG9jZnMyX2luaXRfc2VjdXJpdHlfZ2V0KGlub2RlLCBkaXIsICZzaSk7CisJaWYgKHN0YXR1cykgeworCQlpZiAoc3RhdHVzID09IC1FT1BOT1RTVVBQKQorCQkJc2kuZW5hYmxlID0gMDsKKwkJZWxzZSB7CisJCQltbG9nX2Vycm5vKHN0YXR1cyk7CiAJCQlnb3RvIGxlYXZlOwogCQl9CiAJfQogCi0JaGFuZGxlID0gb2NmczJfc3RhcnRfdHJhbnMob3NiLCBPQ0ZTMl9NS05PRF9DUkVESVRTKTsKKwkvKiBjYWxjdWxhdGUgbWV0YSBkYXRhL2NsdXN0ZXJzIGZvciBzZXR0aW5nIHNlY3VyaXR5IGFuZCBhY2wgeGF0dHIgKi8KKwlzdGF0dXMgPSBvY2ZzMl9jYWxjX3hhdHRyX2luaXQoZGlyLCBwYXJlbnRfZmVfYmgsIG1vZGUsCisJCQkJCSZzaSwgJndhbnRfY2x1c3RlcnMsCisJCQkJCSZ4YXR0cl9jcmVkaXRzLCAmeGF0dHJfYWMpOworCWlmIChzdGF0dXMgPCAwKSB7CisJCW1sb2dfZXJybm8oc3RhdHVzKTsKKwkJZ290byBsZWF2ZTsKKwl9CisKKwkvKiBSZXNlcnZlIGEgY2x1c3RlciBpZiBjcmVhdGluZyBhbiBleHRlbnQgYmFzZWQgZGlyZWN0b3J5LiAqLworCWlmIChTX0lTRElSKG1vZGUpICYmICFvY2ZzMl9zdXBwb3J0c19pbmxpbmVfZGF0YShvc2IpKQorCQl3YW50X2NsdXN0ZXJzICs9IDE7CisKKwlzdGF0dXMgPSBvY2ZzMl9yZXNlcnZlX2NsdXN0ZXJzKG9zYiwgd2FudF9jbHVzdGVycywgJmRhdGFfYWMpOworCWlmIChzdGF0dXMgPCAwKSB7CisJCWlmIChzdGF0dXMgIT0gLUVOT1NQQykKKwkJCW1sb2dfZXJybm8oc3RhdHVzKTsKKwkJZ290byBsZWF2ZTsKKwl9CisKKwloYW5kbGUgPSBvY2ZzMl9zdGFydF90cmFucyhvc2IsIG9jZnMyX21rbm9kX2NyZWRpdHMob3NiLT5zYikgKworCQkJCSAgIHhhdHRyX2NyZWRpdHMpOwogCWlmIChJU19FUlIoaGFuZGxlKSkgewogCQlzdGF0dXMgPSBQVFJfRVJSKGhhbmRsZSk7CiAJCWhhbmRsZSA9IE5VTEw7CkBAIC0yNjgsMTAgKzMzNSwxOSBAQAogCQlnb3RvIGxlYXZlOwogCX0KIAorCS8qIFdlIGRvbid0IHVzZSBzdGFuZGFyZCBWRlMgd3JhcHBlciBiZWNhdXNlIHdlIGRvbid0IHdhbnQgdmZzX2RxX2luaXQKKwkgKiB0byBiZSBjYWxsZWQuICovCisJaWYgKHNiX2FueV9xdW90YV9hY3RpdmUob3NiLT5zYikgJiYKKwkgICAgb3NiLT5zYi0+ZHFfb3AtPmFsbG9jX2lub2RlKGlub2RlLCAxKSA9PSBOT19RVU9UQSkgeworCQlzdGF0dXMgPSAtRURRVU9UOworCQlnb3RvIGxlYXZlOworCX0KKwlkaWRfcXVvdGFfaW5vZGUgPSAxOworCiAJLyogZG8gdGhlIHJlYWwgd29yayBub3cuICovCi0Jc3RhdHVzID0gb2NmczJfbWtub2RfbG9ja2VkKG9zYiwgZGlyLCBkZW50cnksIG1vZGUsIGRldiwKKwlzdGF0dXMgPSBvY2ZzMl9ta25vZF9sb2NrZWQob3NiLCBkaXIsIGlub2RlLCBkZW50cnksIGRldiwKIAkJCQkgICAgJm5ld19mZV9iaCwgcGFyZW50X2ZlX2JoLCBoYW5kbGUsCi0JCQkJICAgICZpbm9kZSwgaW5vZGVfYWMpOworCQkJCSAgICBpbm9kZV9hYyk7CiAJaWYgKHN0YXR1cyA8IDApIHsKIAkJbWxvZ19lcnJubyhzdGF0dXMpOwogCQlnb3RvIGxlYXZlOwpAQCAtMjg1LDggKzM2MSw4IEBACiAJCQlnb3RvIGxlYXZlOwogCQl9CiAKLQkJc3RhdHVzID0gb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBkaXIsIHBhcmVudF9mZV9iaCwKLQkJCQkJICAgICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOworCQlzdGF0dXMgPSBvY2ZzMl9qb3VybmFsX2FjY2Vzc19kaShoYW5kbGUsIGRpciwgcGFyZW50X2ZlX2JoLAorCQkJCQkJIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKIAkJaWYgKHN0YXR1cyA8IDApIHsKIAkJCW1sb2dfZXJybm8oc3RhdHVzKTsKIAkJCWdvdG8gbGVhdmU7CkBAIC0zMDAsNiArMzc2LDIyIEBACiAJCWluY19ubGluayhkaXIpOwogCX0KIAorCXN0YXR1cyA9IG9jZnMyX2luaXRfYWNsKGhhbmRsZSwgaW5vZGUsIGRpciwgbmV3X2ZlX2JoLCBwYXJlbnRfZmVfYmgsCisJCQkJeGF0dHJfYWMsIGRhdGFfYWMpOworCWlmIChzdGF0dXMgPCAwKSB7CisJCW1sb2dfZXJybm8oc3RhdHVzKTsKKwkJZ290byBsZWF2ZTsKKwl9CisKKwlpZiAoc2kuZW5hYmxlKSB7CisJCXN0YXR1cyA9IG9jZnMyX2luaXRfc2VjdXJpdHlfc2V0KGhhbmRsZSwgaW5vZGUsIG5ld19mZV9iaCwgJnNpLAorCQkJCQkJIHhhdHRyX2FjLCBkYXRhX2FjKTsKKwkJaWYgKHN0YXR1cyA8IDApIHsKKwkJCW1sb2dfZXJybm8oc3RhdHVzKTsKKwkJCWdvdG8gbGVhdmU7CisJCX0KKwl9CisKIAlzdGF0dXMgPSBvY2ZzMl9hZGRfZW50cnkoaGFuZGxlLCBkZW50cnksIGlub2RlLAogCQkJCSBPQ0ZTMl9JKGlub2RlKS0+aXBfYmxrbm8sIHBhcmVudF9mZV9iaCwKIAkJCQkgZGVfYmgpOwpAQCAtMzIwLDYgKzQxMiw4IEBACiAJZF9pbnN0YW50aWF0ZShkZW50cnksIGlub2RlKTsKIAlzdGF0dXMgPSAwOwogbGVhdmU6CisJaWYgKHN0YXR1cyA8IDAgJiYgZGlkX3F1b3RhX2lub2RlKQorCQl2ZnNfZHFfZnJlZV9pbm9kZShpbm9kZSk7CiAJaWYgKGhhbmRsZSkKIAkJb2NmczJfY29tbWl0X3RyYW5zKG9zYiwgaGFuZGxlKTsKIApAQCAtMzMxLDkgKzQyNSwxMyBAQAogCWJyZWxzZShuZXdfZmVfYmgpOwogCWJyZWxzZShkZV9iaCk7CiAJYnJlbHNlKHBhcmVudF9mZV9iaCk7CisJa2ZyZWUoc2kubmFtZSk7CisJa2ZyZWUoc2kudmFsdWUpOwogCi0JaWYgKChzdGF0dXMgPCAwKSAmJiBpbm9kZSkKKwlpZiAoKHN0YXR1cyA8IDApICYmIGlub2RlKSB7CisJCWNsZWFyX25saW5rKGlub2RlKTsKIAkJaXB1dChpbm9kZSk7CisJfQogCiAJaWYgKGlub2RlX2FjKQogCQlvY2ZzMl9mcmVlX2FsbG9jX2NvbnRleHQoaW5vZGVfYWMpOwpAQCAtMzQxLDYgKzQzOSw5IEBACiAJaWYgKGRhdGFfYWMpCiAJCW9jZnMyX2ZyZWVfYWxsb2NfY29udGV4dChkYXRhX2FjKTsKIAorCWlmICh4YXR0cl9hYykKKwkJb2NmczJfZnJlZV9hbGxvY19jb250ZXh0KHhhdHRyX2FjKTsKKwogCW1sb2dfZXhpdChzdGF0dXMpOwogCiAJcmV0dXJuIHN0YXR1czsKQEAgLTM0OCwxMiArNDQ5LDEyIEBACiAKIHN0YXRpYyBpbnQgb2NmczJfbWtub2RfbG9ja2VkKHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiLAogCQkJICAgICAgc3RydWN0IGlub2RlICpkaXIsCi0JCQkgICAgICBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGludCBtb2RlLAorCQkJICAgICAgc3RydWN0IGlub2RlICppbm9kZSwKKwkJCSAgICAgIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKIAkJCSAgICAgIGRldl90IGRldiwKIAkJCSAgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqKm5ld19mZV9iaCwKIAkJCSAgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqcGFyZW50X2ZlX2JoLAogCQkJICAgICAgaGFuZGxlX3QgKmhhbmRsZSwKLQkJCSAgICAgIHN0cnVjdCBpbm9kZSAqKnJldF9pbm9kZSwKIAkJCSAgICAgIHN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICppbm9kZV9hYykKIHsKIAlpbnQgc3RhdHVzID0gMDsKQEAgLTM2MSwxNCArNDYyLDEyIEBACiAJc3RydWN0IG9jZnMyX2V4dGVudF9saXN0ICpmZWw7CiAJdTY0IGZlX2Jsa25vID0gMDsKIAl1MTYgc3ViYWxsb2NfYml0OwotCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBOVUxMOwogCi0JbWxvZ19lbnRyeSgiKDB4JXAsIDB4JXAsICVkLCAlbHUsICclLipzJylcbiIsIGRpciwgZGVudHJ5LCBtb2RlLAotCQkgICAodW5zaWduZWQgbG9uZylkZXYsIGRlbnRyeS0+ZF9uYW1lLmxlbiwKKwltbG9nX2VudHJ5KCIoMHglcCwgMHglcCwgJWQsICVsdSwgJyUuKnMnKVxuIiwgZGlyLCBkZW50cnksCisJCSAgIGlub2RlLT5pX21vZGUsICh1bnNpZ25lZCBsb25nKWRldiwgZGVudHJ5LT5kX25hbWUubGVuLAogCQkgICBkZW50cnktPmRfbmFtZS5uYW1lKTsKIAogCSpuZXdfZmVfYmggPSBOVUxMOwotCSpyZXRfaW5vZGUgPSBOVUxMOwogCiAJc3RhdHVzID0gb2NmczJfY2xhaW1fbmV3X2lub2RlKG9zYiwgaGFuZGxlLCBpbm9kZV9hYywgJnN1YmFsbG9jX2JpdCwKIAkJCQkgICAgICAgJmZlX2Jsa25vKTsKQEAgLTM3NywyMyArNDc2LDExIEBACiAJCWdvdG8gbGVhdmU7CiAJfQogCi0JaW5vZGUgPSBuZXdfaW5vZGUoZGlyLT5pX3NiKTsKLQlpZiAoIWlub2RlKSB7Ci0JCXN0YXR1cyA9IC1FTk9NRU07Ci0JCW1sb2coTUxfRVJST1IsICJuZXdfaW5vZGUgZmFpbGVkIVxuIik7Ci0JCWdvdG8gbGVhdmU7Ci0JfQotCiAJLyogcG9wdWxhdGUgYXMgbWFueSBmaWVsZHMgZWFybHkgb24gYXMgcG9zc2libGUgLSBtYW55IG9mCiAJICogdGhlc2UgYXJlIHVzZWQgYnkgdGhlIHN1cHBvcnQgZnVuY3Rpb25zIGhlcmUgYW5kIGluCiAJICogY2FsbGVycy4gKi8KIAlpbm9kZS0+aV9pbm8gPSBpbm9fZnJvbV9ibGtubyhvc2ItPnNiLCBmZV9ibGtubyk7CiAJT0NGUzJfSShpbm9kZSktPmlwX2Jsa25vID0gZmVfYmxrbm87Ci0JaWYgKFNfSVNESVIobW9kZSkpCi0JCWlub2RlLT5pX25saW5rID0gMjsKLQllbHNlCi0JCWlub2RlLT5pX25saW5rID0gMTsKLQlpbm9kZS0+aV9tb2RlID0gbW9kZTsKIAlzcGluX2xvY2soJm9zYi0+b3NiX2xvY2spOwogCWlub2RlLT5pX2dlbmVyYXRpb24gPSBvc2ItPnNfbmV4dF9nZW5lcmF0aW9uKys7CiAJc3Bpbl91bmxvY2soJm9zYi0+b3NiX2xvY2spOwpAQCAtNDA2LDggKzQ5Myw4IEBACiAJfQogCW9jZnMyX3NldF9uZXdfYnVmZmVyX3VwdG9kYXRlKGlub2RlLCAqbmV3X2ZlX2JoKTsKIAotCXN0YXR1cyA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgaW5vZGUsICpuZXdfZmVfYmgsCi0JCQkJICAgICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfQ1JFQVRFKTsKKwlzdGF0dXMgPSBvY2ZzMl9qb3VybmFsX2FjY2Vzc19kaShoYW5kbGUsIGlub2RlLCAqbmV3X2ZlX2JoLAorCQkJCQkgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfQ1JFQVRFKTsKIAlpZiAoc3RhdHVzIDwgMCkgewogCQltbG9nX2Vycm5vKHN0YXR1cyk7CiAJCWdvdG8gbGVhdmU7CkBAIC00MjEsMTcgKzUwOCwxMSBAQAogCWZlLT5pX2Jsa25vID0gY3B1X3RvX2xlNjQoZmVfYmxrbm8pOwogCWZlLT5pX3N1YmFsbG9jX2JpdCA9IGNwdV90b19sZTE2KHN1YmFsbG9jX2JpdCk7CiAJZmUtPmlfc3ViYWxsb2Nfc2xvdCA9IGNwdV90b19sZTE2KGlub2RlX2FjLT5hY19hbGxvY19zbG90KTsKLQlmZS0+aV91aWQgPSBjcHVfdG9fbGUzMihjdXJyZW50X2ZzdWlkKCkpOwotCWlmIChkaXItPmlfbW9kZSAmIFNfSVNHSUQpIHsKLQkJZmUtPmlfZ2lkID0gY3B1X3RvX2xlMzIoZGlyLT5pX2dpZCk7Ci0JCWlmIChTX0lTRElSKG1vZGUpKQotCQkJbW9kZSB8PSBTX0lTR0lEOwotCX0gZWxzZQotCQlmZS0+aV9naWQgPSBjcHVfdG9fbGUzMihjdXJyZW50X2ZzZ2lkKCkpOwotCWZlLT5pX21vZGUgPSBjcHVfdG9fbGUxNihtb2RlKTsKLQlpZiAoU19JU0NIUihtb2RlKSB8fCBTX0lTQkxLKG1vZGUpKQorCWZlLT5pX3VpZCA9IGNwdV90b19sZTMyKGlub2RlLT5pX3VpZCk7CisJZmUtPmlfZ2lkID0gY3B1X3RvX2xlMzIoaW5vZGUtPmlfZ2lkKTsKKwlmZS0+aV9tb2RlID0gY3B1X3RvX2xlMTYoaW5vZGUtPmlfbW9kZSk7CisJaWYgKFNfSVNDSFIoaW5vZGUtPmlfbW9kZSkgfHwgU19JU0JMSyhpbm9kZS0+aV9tb2RlKSkKIAkJZmUtPmlkMS5kZXYxLmlfcmRldiA9IGNwdV90b19sZTY0KGh1Z2VfZW5jb2RlX2RldihkZXYpKTsKLQogCWZlLT5pX2xpbmtzX2NvdW50ID0gY3B1X3RvX2xlMTYoaW5vZGUtPmlfbmxpbmspOwogCiAJZmUtPmlfbGFzdF9lYl9ibGsgPSAwOwpAQCAtNDQ2LDcgKzUyNyw3IEBACiAJLyoKIAkgKiBJZiBzdXBwb3J0ZWQsIGRpcmVjdG9yaWVzIHN0YXJ0IHdpdGggaW5saW5lIGRhdGEuCiAJICovCi0JaWYgKFNfSVNESVIobW9kZSkgJiYgb2NmczJfc3VwcG9ydHNfaW5saW5lX2RhdGEob3NiKSkgeworCWlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpICYmIG9jZnMyX3N1cHBvcnRzX2lubGluZV9kYXRhKG9zYikpIHsKIAkJdTE2IGZlYXQgPSBsZTE2X3RvX2NwdShmZS0+aV9keW5fZmVhdHVyZXMpOwogCiAJCWZlLT5pX2R5bl9mZWF0dXJlcyA9IGNwdV90b19sZTE2KGZlYXQgfCBPQ0ZTMl9JTkxJTkVfREFUQV9GTCk7CkBAIC00NjUsMTUgKzU0Niw3IEBACiAJCWdvdG8gbGVhdmU7CiAJfQogCi0JaWYgKG9jZnMyX3BvcHVsYXRlX2lub2RlKGlub2RlLCBmZSwgMSkgPCAwKSB7Ci0JCW1sb2coTUxfRVJST1IsICJwb3B1bGF0ZSBpbm9kZSBmYWlsZWQhIGJoLT5iX2Jsb2NrbnI9JWxsdSwgIgotCQkgICAgICJpX2Jsa25vPSVsbHUsIGlfaW5vPSVsdVxuIiwKLQkJICAgICAodW5zaWduZWQgbG9uZyBsb25nKSgqbmV3X2ZlX2JoKS0+Yl9ibG9ja25yLAotCQkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpbGU2NF90b19jcHUoZmUtPmlfYmxrbm8pLAotCQkgICAgIGlub2RlLT5pX2lubyk7Ci0JCUJVRygpOwotCX0KLQorCW9jZnMyX3BvcHVsYXRlX2lub2RlKGlub2RlLCBmZSwgMSk7CiAJb2NmczJfaW5vZGVfc2V0X25ldyhvc2IsIGlub2RlKTsKIAlpZiAoIW9jZnMyX21vdW50X2xvY2FsKG9zYikpIHsKIAkJc3RhdHVzID0gb2NmczJfY3JlYXRlX25ld19pbm9kZV9sb2Nrcyhpbm9kZSk7CkBAIC00ODQsMTcgKzU1NywxMiBAQAogCXN0YXR1cyA9IDA7IC8qIGVycm9yIGluIG9jZnMyX2NyZWF0ZV9uZXdfaW5vZGVfbG9ja3MgaXMgbm90CiAJCSAgICAgKiBjcml0aWNhbCAqLwogCi0JKnJldF9pbm9kZSA9IGlub2RlOwogbGVhdmU6CiAJaWYgKHN0YXR1cyA8IDApIHsKIAkJaWYgKCpuZXdfZmVfYmgpIHsKIAkJCWJyZWxzZSgqbmV3X2ZlX2JoKTsKIAkJCSpuZXdfZmVfYmggPSBOVUxMOwogCQl9Ci0JCWlmIChpbm9kZSkgewotCQkJY2xlYXJfbmxpbmsoaW5vZGUpOwotCQkJaXB1dChpbm9kZSk7Ci0JCX0KIAl9CiAKIAltbG9nX2V4aXQoc3RhdHVzKTsKQEAgLTU4OCw3ICs2NTYsNyBAQAogCQlnb3RvIG91dF91bmxvY2tfaW5vZGU7CiAJfQogCi0JaGFuZGxlID0gb2NmczJfc3RhcnRfdHJhbnMob3NiLCBPQ0ZTMl9MSU5LX0NSRURJVFMpOworCWhhbmRsZSA9IG9jZnMyX3N0YXJ0X3RyYW5zKG9zYiwgb2NmczJfbGlua19jcmVkaXRzKG9zYi0+c2IpKTsKIAlpZiAoSVNfRVJSKGhhbmRsZSkpIHsKIAkJZXJyID0gUFRSX0VSUihoYW5kbGUpOwogCQloYW5kbGUgPSBOVUxMOwpAQCAtNTk2LDggKzY2NCw4IEBACiAJCWdvdG8gb3V0X3VubG9ja19pbm9kZTsKIAl9CiAKLQllcnIgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGlub2RlLCBmZV9iaCwKLQkJCQkgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CisJZXJyID0gb2NmczJfam91cm5hbF9hY2Nlc3NfZGkoaGFuZGxlLCBpbm9kZSwgZmVfYmgsCisJCQkJICAgICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOwogCWlmIChlcnIgPCAwKSB7CiAJCW1sb2dfZXJybm8oZXJyKTsKIAkJZ290byBvdXRfY29tbWl0OwpAQCAtNzc1LDcgKzg0Myw3IEBACiAJCX0KIAl9CiAKLQloYW5kbGUgPSBvY2ZzMl9zdGFydF90cmFucyhvc2IsIE9DRlMyX1VOTElOS19DUkVESVRTKTsKKwloYW5kbGUgPSBvY2ZzMl9zdGFydF90cmFucyhvc2IsIG9jZnMyX3VubGlua19jcmVkaXRzKG9zYi0+c2IpKTsKIAlpZiAoSVNfRVJSKGhhbmRsZSkpIHsKIAkJc3RhdHVzID0gUFRSX0VSUihoYW5kbGUpOwogCQloYW5kbGUgPSBOVUxMOwpAQCAtNzgzLDggKzg1MSw4IEBACiAJCWdvdG8gbGVhdmU7CiAJfQogCi0Jc3RhdHVzID0gb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwgZmVfYmgsCi0JCQkJICAgICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOworCXN0YXR1cyA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzX2RpKGhhbmRsZSwgaW5vZGUsIGZlX2JoLAorCQkJCQkgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOwogCWlmIChzdGF0dXMgPCAwKSB7CiAJCW1sb2dfZXJybm8oc3RhdHVzKTsKIAkJZ290byBsZWF2ZTsKQEAgLTExODEsNyArMTI0OSw3IEBACiAJCX0KIAl9CiAKLQloYW5kbGUgPSBvY2ZzMl9zdGFydF90cmFucyhvc2IsIE9DRlMyX1JFTkFNRV9DUkVESVRTKTsKKwloYW5kbGUgPSBvY2ZzMl9zdGFydF90cmFucyhvc2IsIG9jZnMyX3JlbmFtZV9jcmVkaXRzKG9zYi0+c2IpKTsKIAlpZiAoSVNfRVJSKGhhbmRsZSkpIHsKIAkJc3RhdHVzID0gUFRSX0VSUihoYW5kbGUpOwogCQloYW5kbGUgPSBOVUxMOwpAQCAtMTE5Nyw4ICsxMjY1LDggQEAKIAkJCQlnb3RvIGJhaWw7CiAJCQl9CiAJCX0KLQkJc3RhdHVzID0gb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBuZXdfaW5vZGUsIG5ld2ZlX2JoLAotCQkJCQkgICAgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CisJCXN0YXR1cyA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzX2RpKGhhbmRsZSwgbmV3X2lub2RlLCBuZXdmZV9iaCwKKwkJCQkJCSBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CiAJCWlmIChzdGF0dXMgPCAwKSB7CiAJCQltbG9nX2Vycm5vKHN0YXR1cyk7CiAJCQlnb3RvIGJhaWw7CkBAIC0xMjQ0LDggKzEzMTIsOCBAQAogCW9sZF9pbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRTsKIAltYXJrX2lub2RlX2RpcnR5KG9sZF9pbm9kZSk7CiAKLQlzdGF0dXMgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIG9sZF9pbm9kZSwgb2xkX2lub2RlX2JoLAotCQkJCSAgICAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKKwlzdGF0dXMgPSBvY2ZzMl9qb3VybmFsX2FjY2Vzc19kaShoYW5kbGUsIG9sZF9pbm9kZSwgb2xkX2lub2RlX2JoLAorCQkJCQkgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOwogCWlmIChzdGF0dXMgPj0gMCkgewogCQlvbGRfZGkgPSAoc3RydWN0IG9jZnMyX2Rpbm9kZSAqKSBvbGRfaW5vZGVfYmgtPmJfZGF0YTsKIApAQCAtMTMyMSw5ICsxMzg5LDkgQEAKIAkJCSAgICAgKGludClvbGRfZGlyX25saW5rLCBvbGRfZGlyLT5pX25saW5rKTsKIAkJfSBlbHNlIHsKIAkJCXN0cnVjdCBvY2ZzMl9kaW5vZGUgKmZlOwotCQkJc3RhdHVzID0gb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBvbGRfZGlyLAotCQkJCQkJICAgICAgb2xkX2Rpcl9iaCwKLQkJCQkJCSAgICAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKKwkJCXN0YXR1cyA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzX2RpKGhhbmRsZSwgb2xkX2RpciwKKwkJCQkJCQkgb2xkX2Rpcl9iaCwKKwkJCQkJCQkgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOwogCQkJZmUgPSAoc3RydWN0IG9jZnMyX2Rpbm9kZSAqKSBvbGRfZGlyX2JoLT5iX2RhdGE7CiAJCQlmZS0+aV9saW5rc19jb3VudCA9IGNwdV90b19sZTE2KG9sZF9kaXItPmlfbmxpbmspOwogCQkJc3RhdHVzID0gb2NmczJfam91cm5hbF9kaXJ0eShoYW5kbGUsIG9sZF9kaXJfYmgpOwpAQCAtMTQ5Niw2ICsxNTY0LDEzIEBACiAJaGFuZGxlX3QgKmhhbmRsZSA9IE5VTEw7CiAJc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKmlub2RlX2FjID0gTlVMTDsKIAlzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqZGF0YV9hYyA9IE5VTEw7CisJc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKnhhdHRyX2FjID0gTlVMTDsKKwlpbnQgd2FudF9jbHVzdGVycyA9IDA7CisJaW50IHhhdHRyX2NyZWRpdHMgPSAwOworCXN0cnVjdCBvY2ZzMl9zZWN1cml0eV94YXR0cl9pbmZvIHNpID0geworCQkuZW5hYmxlID0gMSwKKwl9OworCWludCBkaWRfcXVvdGEgPSAwLCBkaWRfcXVvdGFfaW5vZGUgPSAwOwogCiAJbWxvZ19lbnRyeSgiKDB4JXAsIDB4JXAsIHN5bW5hbWU9JyVzJyBhY3R1YWw9JyUuKnMnKVxuIiwgZGlyLAogCQkgICBkZW50cnksIHN5bW5hbWUsIGRlbnRyeS0+ZF9uYW1lLmxlbiwgZGVudHJ5LT5kX25hbWUubmFtZSk7CkBAIC0xNTQyLDE3ICsxNjE3LDQ2IEBACiAJCWdvdG8gYmFpbDsKIAl9CiAKLQkvKiBkb24ndCByZXNlcnZlIGJpdG1hcCBzcGFjZSBmb3IgZmFzdCBzeW1saW5rcy4gKi8KLQlpZiAobCA+IG9jZnMyX2Zhc3Rfc3ltbGlua19jaGFycyhzYikpIHsKLQkJc3RhdHVzID0gb2NmczJfcmVzZXJ2ZV9jbHVzdGVycyhvc2IsIDEsICZkYXRhX2FjKTsKLQkJaWYgKHN0YXR1cyA8IDApIHsKLQkJCWlmIChzdGF0dXMgIT0gLUVOT1NQQykKLQkJCQltbG9nX2Vycm5vKHN0YXR1cyk7CisJaW5vZGUgPSBvY2ZzMl9nZXRfaW5pdF9pbm9kZShkaXIsIFNfSUZMTksgfCBTX0lSV1hVR08pOworCWlmICghaW5vZGUpIHsKKwkJc3RhdHVzID0gLUVOT01FTTsKKwkJbWxvZ19lcnJubyhzdGF0dXMpOworCQlnb3RvIGJhaWw7CisJfQorCisJLyogZ2V0IHNlY3VyaXR5IHhhdHRyICovCisJc3RhdHVzID0gb2NmczJfaW5pdF9zZWN1cml0eV9nZXQoaW5vZGUsIGRpciwgJnNpKTsKKwlpZiAoc3RhdHVzKSB7CisJCWlmIChzdGF0dXMgPT0gLUVPUE5PVFNVUFApCisJCQlzaS5lbmFibGUgPSAwOworCQllbHNlIHsKKwkJCW1sb2dfZXJybm8oc3RhdHVzKTsKIAkJCWdvdG8gYmFpbDsKIAkJfQogCX0KIAotCWhhbmRsZSA9IG9jZnMyX3N0YXJ0X3RyYW5zKG9zYiwgY3JlZGl0cyk7CisJLyogY2FsY3VsYXRlIG1ldGEgZGF0YS9jbHVzdGVycyBmb3Igc2V0dGluZyBzZWN1cml0eSB4YXR0ciAqLworCWlmIChzaS5lbmFibGUpIHsKKwkJc3RhdHVzID0gb2NmczJfY2FsY19zZWN1cml0eV9pbml0KGRpciwgJnNpLCAmd2FudF9jbHVzdGVycywKKwkJCQkJCSAgJnhhdHRyX2NyZWRpdHMsICZ4YXR0cl9hYyk7CisJCWlmIChzdGF0dXMgPCAwKSB7CisJCQltbG9nX2Vycm5vKHN0YXR1cyk7CisJCQlnb3RvIGJhaWw7CisJCX0KKwl9CisKKwkvKiBkb24ndCByZXNlcnZlIGJpdG1hcCBzcGFjZSBmb3IgZmFzdCBzeW1saW5rcy4gKi8KKwlpZiAobCA+IG9jZnMyX2Zhc3Rfc3ltbGlua19jaGFycyhzYikpCisJCXdhbnRfY2x1c3RlcnMgKz0gMTsKKworCXN0YXR1cyA9IG9jZnMyX3Jlc2VydmVfY2x1c3RlcnMob3NiLCB3YW50X2NsdXN0ZXJzLCAmZGF0YV9hYyk7CisJaWYgKHN0YXR1cyA8IDApIHsKKwkJaWYgKHN0YXR1cyAhPSAtRU5PU1BDKQorCQkJbWxvZ19lcnJubyhzdGF0dXMpOworCQlnb3RvIGJhaWw7CisJfQorCisJaGFuZGxlID0gb2NmczJfc3RhcnRfdHJhbnMob3NiLCBjcmVkaXRzICsgeGF0dHJfY3JlZGl0cyk7CiAJaWYgKElTX0VSUihoYW5kbGUpKSB7CiAJCXN0YXR1cyA9IFBUUl9FUlIoaGFuZGxlKTsKIAkJaGFuZGxlID0gTlVMTDsKQEAgLTE1NjAsMTAgKzE2NjQsMTggQEAKIAkJZ290byBiYWlsOwogCX0KIAotCXN0YXR1cyA9IG9jZnMyX21rbm9kX2xvY2tlZChvc2IsIGRpciwgZGVudHJ5LAotCQkJCSAgICBTX0lGTE5LIHwgU19JUldYVUdPLCAwLAotCQkJCSAgICAmbmV3X2ZlX2JoLCBwYXJlbnRfZmVfYmgsIGhhbmRsZSwKLQkJCQkgICAgJmlub2RlLCBpbm9kZV9hYyk7CisJLyogV2UgZG9uJ3QgdXNlIHN0YW5kYXJkIFZGUyB3cmFwcGVyIGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCB2ZnNfZHFfaW5pdAorCSAqIHRvIGJlIGNhbGxlZC4gKi8KKwlpZiAoc2JfYW55X3F1b3RhX2FjdGl2ZShvc2ItPnNiKSAmJgorCSAgICBvc2ItPnNiLT5kcV9vcC0+YWxsb2NfaW5vZGUoaW5vZGUsIDEpID09IE5PX1FVT1RBKSB7CisJCXN0YXR1cyA9IC1FRFFVT1Q7CisJCWdvdG8gYmFpbDsKKwl9CisJZGlkX3F1b3RhX2lub2RlID0gMTsKKworCXN0YXR1cyA9IG9jZnMyX21rbm9kX2xvY2tlZChvc2IsIGRpciwgaW5vZGUsIGRlbnRyeSwKKwkJCQkgICAgMCwgJm5ld19mZV9iaCwgcGFyZW50X2ZlX2JoLCBoYW5kbGUsCisJCQkJICAgIGlub2RlX2FjKTsKIAlpZiAoc3RhdHVzIDwgMCkgewogCQltbG9nX2Vycm5vKHN0YXR1cyk7CiAJCWdvdG8gYmFpbDsKQEAgLTE1NzYsNiArMTY4OCwxMiBAQAogCQl1MzIgb2Zmc2V0ID0gMDsKIAogCQlpbm9kZS0+aV9vcCA9ICZvY2ZzMl9zeW1saW5rX2lub2RlX29wZXJhdGlvbnM7CisJCWlmICh2ZnNfZHFfYWxsb2Nfc3BhY2Vfbm9kaXJ0eShpbm9kZSwKKwkJICAgIG9jZnMyX2NsdXN0ZXJzX3RvX2J5dGVzKG9zYi0+c2IsIDEpKSkgeworCQkJc3RhdHVzID0gLUVEUVVPVDsKKwkJCWdvdG8gYmFpbDsKKwkJfQorCQlkaWRfcXVvdGEgPSAxOwogCQlzdGF0dXMgPSBvY2ZzMl9hZGRfaW5vZGVfZGF0YShvc2IsIGlub2RlLCAmb2Zmc2V0LCAxLCAwLAogCQkJCQkgICAgICBuZXdfZmVfYmgsCiAJCQkJCSAgICAgIGhhbmRsZSwgZGF0YV9hYywgTlVMTCwKQEAgLTE2MTQsNiArMTczMiwxNSBAQAogCQl9CiAJfQogCisJaWYgKHNpLmVuYWJsZSkgeworCQlzdGF0dXMgPSBvY2ZzMl9pbml0X3NlY3VyaXR5X3NldChoYW5kbGUsIGlub2RlLCBuZXdfZmVfYmgsICZzaSwKKwkJCQkJCSB4YXR0cl9hYywgZGF0YV9hYyk7CisJCWlmIChzdGF0dXMgPCAwKSB7CisJCQltbG9nX2Vycm5vKHN0YXR1cyk7CisJCQlnb3RvIGJhaWw7CisJCX0KKwl9CisKIAlzdGF0dXMgPSBvY2ZzMl9hZGRfZW50cnkoaGFuZGxlLCBkZW50cnksIGlub2RlLAogCQkJCSBsZTY0X3RvX2NwdShmZS0+aV9ibGtubyksIHBhcmVudF9mZV9iaCwKIAkJCQkgZGVfYmgpOwpAQCAtMTYzMiw2ICsxNzU5LDExIEBACiAJZGVudHJ5LT5kX29wID0gJm9jZnMyX2RlbnRyeV9vcHM7CiAJZF9pbnN0YW50aWF0ZShkZW50cnksIGlub2RlKTsKIGJhaWw6CisJaWYgKHN0YXR1cyA8IDAgJiYgZGlkX3F1b3RhKQorCQl2ZnNfZHFfZnJlZV9zcGFjZV9ub2RpcnR5KGlub2RlLAorCQkJCQlvY2ZzMl9jbHVzdGVyc190b19ieXRlcyhvc2ItPnNiLCAxKSk7CisJaWYgKHN0YXR1cyA8IDAgJiYgZGlkX3F1b3RhX2lub2RlKQorCQl2ZnNfZHFfZnJlZV9pbm9kZShpbm9kZSk7CiAJaWYgKGhhbmRsZSkKIAkJb2NmczJfY29tbWl0X3RyYW5zKG9zYiwgaGFuZGxlKTsKIApAQCAtMTY0MCwxMiArMTc3MiwxOCBAQAogCWJyZWxzZShuZXdfZmVfYmgpOwogCWJyZWxzZShwYXJlbnRfZmVfYmgpOwogCWJyZWxzZShkZV9iaCk7CisJa2ZyZWUoc2kubmFtZSk7CisJa2ZyZWUoc2kudmFsdWUpOwogCWlmIChpbm9kZV9hYykKIAkJb2NmczJfZnJlZV9hbGxvY19jb250ZXh0KGlub2RlX2FjKTsKIAlpZiAoZGF0YV9hYykKIAkJb2NmczJfZnJlZV9hbGxvY19jb250ZXh0KGRhdGFfYWMpOwotCWlmICgoc3RhdHVzIDwgMCkgJiYgaW5vZGUpCisJaWYgKHhhdHRyX2FjKQorCQlvY2ZzMl9mcmVlX2FsbG9jX2NvbnRleHQoeGF0dHJfYWMpOworCWlmICgoc3RhdHVzIDwgMCkgJiYgaW5vZGUpIHsKKwkJY2xlYXJfbmxpbmsoaW5vZGUpOwogCQlpcHV0KGlub2RlKTsKKwl9CiAKIAltbG9nX2V4aXQoc3RhdHVzKTsKIApAQCAtMTc1NCwxNiArMTg5MiwxNCBAQAogCiAJbWxvZ19lbnRyeSgiKGlub2RlLT5pX2lubyA9ICVsdSlcbiIsIGlub2RlLT5pX2lubyk7CiAKLQlzdGF0dXMgPSBvY2ZzMl9yZWFkX2Jsb2NrKG9ycGhhbl9kaXJfaW5vZGUsCi0JCQkJICBPQ0ZTMl9JKG9ycGhhbl9kaXJfaW5vZGUpLT5pcF9ibGtubywKLQkJCQkgICZvcnBoYW5fZGlyX2JoKTsKKwlzdGF0dXMgPSBvY2ZzMl9yZWFkX2lub2RlX2Jsb2NrKG9ycGhhbl9kaXJfaW5vZGUsICZvcnBoYW5fZGlyX2JoKTsKIAlpZiAoc3RhdHVzIDwgMCkgewogCQltbG9nX2Vycm5vKHN0YXR1cyk7CiAJCWdvdG8gbGVhdmU7CiAJfQogCi0Jc3RhdHVzID0gb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBvcnBoYW5fZGlyX2lub2RlLCBvcnBoYW5fZGlyX2JoLAotCQkJCSAgICAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKKwlzdGF0dXMgPSBvY2ZzMl9qb3VybmFsX2FjY2Vzc19kaShoYW5kbGUsIG9ycGhhbl9kaXJfaW5vZGUsIG9ycGhhbl9kaXJfYmgsCisJCQkJCSBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CiAJaWYgKHN0YXR1cyA8IDApIHsKIAkJbWxvZ19lcnJubyhzdGF0dXMpOwogCQlnb3RvIGxlYXZlOwpAQCAtMTg1MCw4ICsxOTg2LDggQEAKIAkJZ290byBsZWF2ZTsKIAl9CiAKLQlzdGF0dXMgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsb3JwaGFuX2Rpcl9pbm9kZSwgIG9ycGhhbl9kaXJfYmgsCi0JCQkJICAgICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOworCXN0YXR1cyA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzX2RpKGhhbmRsZSxvcnBoYW5fZGlyX2lub2RlLCAgb3JwaGFuX2Rpcl9iaCwKKwkJCQkJIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKIAlpZiAoc3RhdHVzIDwgMCkgewogCQltbG9nX2Vycm5vKHN0YXR1cyk7CiAJCWdvdG8gbGVhdmU7CmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9vY2ZzMi5oIGIvZnMvb2NmczIvb2NmczIuaAppbmRleCAzZmVkOWUzLi5hZDVjMjRhIDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9vY2ZzMi5oCisrKyBiL2ZzL29jZnMyL29jZnMyLmgKQEAgLTE2MSw2ICsxNjEsNyBAQAogewogCVZPTFVNRV9JTklUID0gMCwKIAlWT0xVTUVfTU9VTlRFRCwKKwlWT0xVTUVfTU9VTlRFRF9RVU9UQVMsCiAJVk9MVU1FX0RJU01PVU5URUQsCiAJVk9MVU1FX0RJU0FCTEVECiB9OwpAQCAtMTk1LDYgKzE5Niw5IEBACiAJT0NGUzJfTU9VTlRfTE9DQUxGTE9DS1MgPSAxIDw8IDUsIC8qIE5vIGNsdXN0ZXIgYXdhcmUgdXNlciBmaWxlIGxvY2tzICovCiAJT0NGUzJfTU9VTlRfTk9VU0VSWEFUVFIgPSAxIDw8IDYsIC8qIE5vIHVzZXIgeGF0dHIgKi8KIAlPQ0ZTMl9NT1VOVF9JTk9ERTY0ID0gMSA8PCA3LAkvKiBBbGxvdyBpbm9kZSBudW1iZXJzID4gMl4zMiAqLworCU9DRlMyX01PVU5UX1BPU0lYX0FDTCA9IDEgPDwgOCwJLyogUE9TSVggYWNjZXNzIGNvbnRyb2wgbGlzdHMgKi8KKwlPQ0ZTMl9NT1VOVF9VU1JRVU9UQSA9IDEgPDwgOSwgLyogV2Ugc3VwcG9ydCB1c2VyIHF1b3RhcyAqLworCU9DRlMyX01PVU5UX0dSUFFVT1RBID0gMSA8PCAxMCwgLyogV2Ugc3VwcG9ydCBncm91cCBxdW90YXMgKi8KIH07CiAKICNkZWZpbmUgT0NGUzJfT1NCX1NPRlRfUk8JMHgwMDAxCkBAIC0yMDUsNiArMjA5LDcgQEAKIHN0cnVjdCBvY2ZzMl9qb3VybmFsOwogc3RydWN0IG9jZnMyX3Nsb3RfaW5mbzsKIHN0cnVjdCBvY2ZzMl9yZWNvdmVyeV9tYXA7CitzdHJ1Y3Qgb2NmczJfcXVvdGFfcmVjb3Zlcnk7CiBzdHJ1Y3Qgb2NmczJfc3VwZXIKIHsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNvbW1pdF90YXNrOwpAQCAtMjg2LDEwICsyOTEsMTEgQEAKIAljaGFyICpsb2NhbF9hbGxvY19kZWJ1Z19idWY7CiAjZW5kaWYKIAotCS8qIE5leHQgdHdvIGZpZWxkcyBhcmUgZm9yIGxvY2FsIG5vZGUgc2xvdCByZWNvdmVyeSBkdXJpbmcKKwkvKiBOZXh0IHRocmVlIGZpZWxkcyBhcmUgZm9yIGxvY2FsIG5vZGUgc2xvdCByZWNvdmVyeSBkdXJpbmcKIAkgKiBtb3VudC4gKi8KIAlpbnQgZGlydHk7CiAJc3RydWN0IG9jZnMyX2Rpbm9kZSAqbG9jYWxfYWxsb2NfY29weTsKKwlzdHJ1Y3Qgb2NmczJfcXVvdGFfcmVjb3ZlcnkgKnF1b3RhX3JlYzsKIAogCXN0cnVjdCBvY2ZzMl9hbGxvY19zdGF0cyBhbGxvY19zdGF0czsKIAljaGFyIGRldl9zdHJbMjBdOwkJLyogIm1ham9yLG1pbm9yIiBvZiB0aGUgZGV2aWNlICovCkBAIC0zMzMsNiArMzM5LDEwIEBACiAKICNkZWZpbmUgT0NGUzJfU0Ioc2IpCSAgICAoKHN0cnVjdCBvY2ZzMl9zdXBlciAqKShzYiktPnNfZnNfaW5mbykKIAorLyogVXNlZnVsIHR5cGVkZWYgZm9yIHBhc3NpbmcgYXJvdW5kIGpvdXJuYWwgYWNjZXNzIGZ1bmN0aW9ucyAqLwordHlwZWRlZiBpbnQgKCpvY2ZzMl9qb3VybmFsX2FjY2Vzc19mdW5jKShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCQkgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgaW50IHR5cGUpOworCiBzdGF0aWMgaW5saW5lIGludCBvY2ZzMl9zaG91bGRfb3JkZXJfZGF0YShzdHJ1Y3QgaW5vZGUgKmlub2RlKQogewogCWlmICghU19JU1JFRyhpbm9kZS0+aV9tb2RlKSkKQEAgLTM3Niw2ICszODYsMTMgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGlubGluZSBpbnQgb2NmczJfbWV0YV9lY2Moc3RydWN0IG9jZnMyX3N1cGVyICpvc2IpCit7CisJaWYgKG9zYi0+c19mZWF0dXJlX2luY29tcGF0ICYgT0NGUzJfRkVBVFVSRV9JTkNPTVBBVF9NRVRBX0VDQykKKwkJcmV0dXJuIDE7CisJcmV0dXJuIDA7Cit9CisKIC8qIHNldCAvIGNsZWFyIGZ1bmN0aW9ucyBiZWNhdXNlIGNsdXN0ZXIgZXZlbnRzIGNhbiBtYWtlIHRoZXNlIGhhcHBlbgogICogaW4gcGFyYWxsZWwgc28gd2Ugd2FudCB0aGUgdHJhbnNpdGlvbnMgdG8gYmUgYXRvbWljLiB0aGlzIGFsc28KICAqIG1lYW5zIHRoYXQgYW55IGZ1dHVyZSBmbGFncyBvc2JfZmxhZ3MgbXVzdCBiZSBwcm90ZWN0ZWQgYnkgc3BpbmxvY2sKQEAgLTQ0MywzOSArNDYwLDE5IEBACiAjZGVmaW5lIE9DRlMyX0lTX1ZBTElEX0RJTk9ERShwdHIpCQkJCQlcCiAJKCFzdHJjbXAoKHB0ciktPmlfc2lnbmF0dXJlLCBPQ0ZTMl9JTk9ERV9TSUdOQVRVUkUpKQogCi0jZGVmaW5lIE9DRlMyX1JPX09OX0lOVkFMSURfRElOT0RFKF9fc2IsIF9fZGkpCWRvIHsJCQlcCi0JdHlwZW9mKF9fZGkpIF9fX19kaSA9IChfX2RpKTsJCQkJCVwKLQlvY2ZzMl9lcnJvcigoX19zYiksIAkJCQkJCVwKLQkJIkRpbm9kZSAjICVsbHUgaGFzIGJhZCBzaWduYXR1cmUgJS4qcyIsCQkJXAotCQkodW5zaWduZWQgbG9uZyBsb25nKWxlNjRfdG9fY3B1KChfX19fZGkpLT5pX2Jsa25vKSwgNywgCVwKLQkJKF9fX19kaSktPmlfc2lnbmF0dXJlKTsJCQkJCVwKLX0gd2hpbGUgKDApCi0KICNkZWZpbmUgT0NGUzJfSVNfVkFMSURfRVhURU5UX0JMT0NLKHB0cikJCQkJXAogCSghc3RyY21wKChwdHIpLT5oX3NpZ25hdHVyZSwgT0NGUzJfRVhURU5UX0JMT0NLX1NJR05BVFVSRSkpCiAKLSNkZWZpbmUgT0NGUzJfUk9fT05fSU5WQUxJRF9FWFRFTlRfQkxPQ0soX19zYiwgX19lYikJZG8gewkJXAotCXR5cGVvZihfX2ViKSBfX19fZWIgPSAoX19lYik7CQkJCQlcCi0Jb2NmczJfZXJyb3IoKF9fc2IpLCAJCQkJCQlcCi0JCSJFeHRlbnQgQmxvY2sgIyAlbGx1IGhhcyBiYWQgc2lnbmF0dXJlICUuKnMiLAkJXAotCQkodW5zaWduZWQgbG9uZyBsb25nKWxlNjRfdG9fY3B1KChfX19fZWIpLT5oX2Jsa25vKSwgNywJXAotCQkoX19fX2ViKS0+aF9zaWduYXR1cmUpOwkJCQkJXAotfSB3aGlsZSAoMCkKLQogI2RlZmluZSBPQ0ZTMl9JU19WQUxJRF9HUk9VUF9ERVNDKHB0cikJCQkJCVwKIAkoIXN0cmNtcCgocHRyKS0+Ymdfc2lnbmF0dXJlLCBPQ0ZTMl9HUk9VUF9ERVNDX1NJR05BVFVSRSkpCiAKLSNkZWZpbmUgT0NGUzJfUk9fT05fSU5WQUxJRF9HUk9VUF9ERVNDKF9fc2IsIF9fZ2QpCWRvIHsJCVwKLQl0eXBlb2YoX19nZCkgX19fX2dkID0gKF9fZ2QpOwkJCQkJXAotCQlvY2ZzMl9lcnJvcigoX19zYiksCQkJCQlcCi0JCSJHcm91cCBEZXNjcmlwdG9yICMgJWxsdSBoYXMgYmFkIHNpZ25hdHVyZSAlLipzIiwJXAotCQkodW5zaWduZWQgbG9uZyBsb25nKWxlNjRfdG9fY3B1KChfX19fZ2QpLT5iZ19ibGtubyksIDcsIFwKLQkJKF9fX19nZCktPmJnX3NpZ25hdHVyZSk7CQkJCVwKLX0gd2hpbGUgKDApCiAKICNkZWZpbmUgT0NGUzJfSVNfVkFMSURfWEFUVFJfQkxPQ0socHRyKQkJCQkJXAogCSghc3RyY21wKChwdHIpLT54Yl9zaWduYXR1cmUsIE9DRlMyX1hBVFRSX0JMT0NLX1NJR05BVFVSRSkpCiAKKyNkZWZpbmUgT0NGUzJfSVNfVkFMSURfRElSX1RSQUlMRVIocHRyKQkJCQkJXAorCSghc3RyY21wKChwdHIpLT5kYl9zaWduYXR1cmUsIE9DRlMyX0RJUl9UUkFJTEVSX1NJR05BVFVSRSkpCisKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBpbm9fZnJvbV9ibGtubyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAogCQkJCQkgICB1NjQgYmxrbm8pCiB7CkBAIC02MzIsNSArNjI5LDYgQEAKICNkZWZpbmUgb2NmczJfY2xlYXJfYml0IGV4dDJfY2xlYXJfYml0CiAjZGVmaW5lIG9jZnMyX3Rlc3RfYml0IGV4dDJfdGVzdF9iaXQKICNkZWZpbmUgb2NmczJfZmluZF9uZXh0X3plcm9fYml0IGV4dDJfZmluZF9uZXh0X3plcm9fYml0CisjZGVmaW5lIG9jZnMyX2ZpbmRfbmV4dF9iaXQgZXh0Ml9maW5kX25leHRfYml0CiAjZW5kaWYgIC8qIE9DRlMyX0ggKi8KIApkaWZmIC0tZ2l0IGEvZnMvb2NmczIvb2NmczJfZnMuaCBiL2ZzL29jZnMyL29jZnMyX2ZzLmgKaW5kZXggNWUwYzBkMC4uYzdhZTQ1YSAxMDA2NDQKLS0tIGEvZnMvb2NmczIvb2NmczJfZnMuaAorKysgYi9mcy9vY2ZzMi9vY2ZzMl9mcy5oCkBAIC02NSw2ICs2NSw3IEBACiAjZGVmaW5lIE9DRlMyX0VYVEVOVF9CTE9DS19TSUdOQVRVUkUJIkVYQkxLMDEiCiAjZGVmaW5lIE9DRlMyX0dST1VQX0RFU0NfU0lHTkFUVVJFICAgICAgIkdST1VQMDEiCiAjZGVmaW5lIE9DRlMyX1hBVFRSX0JMT0NLX1NJR05BVFVSRQkiWEFUVFIwMSIKKyNkZWZpbmUgT0NGUzJfRElSX1RSQUlMRVJfU0lHTkFUVVJFCSJESVJUUkwxIgogCiAvKiBDb21wYXRpYmlsaXR5IGZsYWdzICovCiAjZGVmaW5lIE9DRlMyX0hBU19DT01QQVRfRkVBVFVSRShzYixtYXNrKQkJCVwKQEAgLTkzLDggKzk0LDExIEBACiAJCQkJCSB8IE9DRlMyX0ZFQVRVUkVfSU5DT01QQVRfSU5MSU5FX0RBVEEgXAogCQkJCQkgfCBPQ0ZTMl9GRUFUVVJFX0lOQ09NUEFUX0VYVEVOREVEX1NMT1RfTUFQIFwKIAkJCQkJIHwgT0NGUzJfRkVBVFVSRV9JTkNPTVBBVF9VU0VSU1BBQ0VfU1RBQ0sgXAotCQkJCQkgfCBPQ0ZTMl9GRUFUVVJFX0lOQ09NUEFUX1hBVFRSKQotI2RlZmluZSBPQ0ZTMl9GRUFUVVJFX1JPX0NPTVBBVF9TVVBQCU9DRlMyX0ZFQVRVUkVfUk9fQ09NUEFUX1VOV1JJVFRFTgorCQkJCQkgfCBPQ0ZTMl9GRUFUVVJFX0lOQ09NUEFUX1hBVFRSIFwKKwkJCQkJIHwgT0NGUzJfRkVBVFVSRV9JTkNPTVBBVF9NRVRBX0VDQykKKyNkZWZpbmUgT0NGUzJfRkVBVFVSRV9ST19DT01QQVRfU1VQUAkoT0NGUzJfRkVBVFVSRV9ST19DT01QQVRfVU5XUklUVEVOIFwKKwkJCQkJIHwgT0NGUzJfRkVBVFVSRV9ST19DT01QQVRfVVNSUVVPVEEgXAorCQkJCQkgfCBPQ0ZTMl9GRUFUVVJFX1JPX0NPTVBBVF9HUlBRVU9UQSkKIAogLyoKICAqIEhlYXJ0YmVhdC1vbmx5IGRldmljZXMgYXJlIG1pc3Npbmcgam91cm5hbHMgYW5kIG90aGVyIGZpbGVzLiAgVGhlCkBAIC0xNDcsNiArMTUxLDkgQEAKIC8qIFN1cHBvcnQgZm9yIGV4dGVuZGVkIGF0dHJpYnV0ZXMgKi8KICNkZWZpbmUgT0NGUzJfRkVBVFVSRV9JTkNPTVBBVF9YQVRUUgkJMHgwMjAwCiAKKy8qIE1ldGFkYXRhIGNoZWNrc3VtIGFuZCBlcnJvciBjb3JyZWN0aW9uICovCisjZGVmaW5lIE9DRlMyX0ZFQVRVUkVfSU5DT01QQVRfTUVUQV9FQ0MJCTB4MDgwMAorCiAvKgogICogYmFja3VwIHN1cGVyYmxvY2sgZmxhZyBpcyB1c2VkIHRvIGluZGljYXRlIHRoYXQgdGhpcyB2b2x1bWUKICAqIGhhcyBiYWNrdXAgc3VwZXJibG9ja3MuCkBAIC0xNjMsNiArMTcwLDEyIEBACiAgKi8KICNkZWZpbmUgT0NGUzJfRkVBVFVSRV9ST19DT01QQVRfVU5XUklUVEVOCTB4MDAwMQogCisvKgorICogTWFpbnRhaW4gcXVvdGEgaW5mb3JtYXRpb24gZm9yIHRoaXMgZmlsZXN5c3RlbQorICovCisjZGVmaW5lIE9DRlMyX0ZFQVRVUkVfUk9fQ09NUEFUX1VTUlFVT1RBCTB4MDAwMgorI2RlZmluZSBPQ0ZTMl9GRUFUVVJFX1JPX0NPTVBBVF9HUlBRVU9UQQkweDAwMDQKKwogLyogVGhlIGJ5dGUgb2Zmc2V0IG9mIHRoZSBmaXJzdCBiYWNrdXAgYmxvY2sgd2lsbCBiZSAxRy4KICAqIFRoZSBmb2xsb3dpbmcgd2lsbCBiZSA0RywgMTZHLCA2NEcsIDI1NkcgYW5kIDFULgogICovCkBAIC0xOTIsNiArMjA1LDcgQEAKICNkZWZpbmUgT0NGUzJfSEVBUlRCRUFUX0ZMCSgweDAwMDAwMjAwKQkvKiBIZWFydGJlYXQgYXJlYSAqLwogI2RlZmluZSBPQ0ZTMl9DSEFJTl9GTAkJKDB4MDAwMDA0MDApCS8qIENoYWluIGFsbG9jYXRvciAqLwogI2RlZmluZSBPQ0ZTMl9ERUFMTE9DX0ZMCSgweDAwMDAwODAwKQkvKiBUcnVuY2F0ZSBsb2cgKi8KKyNkZWZpbmUgT0NGUzJfUVVPVEFfRkwJCSgweDAwMDAxMDAwKQkvKiBRdW90YSBmaWxlICovCiAKIC8qCiAgKiBGbGFncyBvbiBvY2ZzMl9kaW5vZGUuaV9keW5fZmVhdHVyZXMKQEAgLTMyOSwxMyArMzQzLDE3IEBACiAjZGVmaW5lIE9DRlMyX0ZJUlNUX09OTElORV9TWVNURU1fSU5PREUgU0xPVF9NQVBfU1lTVEVNX0lOT0RFCiAJSEVBUlRCRUFUX1NZU1RFTV9JTk9ERSwKIAlHTE9CQUxfQklUTUFQX1NZU1RFTV9JTk9ERSwKLSNkZWZpbmUgT0NGUzJfTEFTVF9HTE9CQUxfU1lTVEVNX0lOT0RFIEdMT0JBTF9CSVRNQVBfU1lTVEVNX0lOT0RFCisJVVNFUl9RVU9UQV9TWVNURU1fSU5PREUsCisJR1JPVVBfUVVPVEFfU1lTVEVNX0lOT0RFLAorI2RlZmluZSBPQ0ZTMl9MQVNUX0dMT0JBTF9TWVNURU1fSU5PREUgR1JPVVBfUVVPVEFfU1lTVEVNX0lOT0RFCiAJT1JQSEFOX0RJUl9TWVNURU1fSU5PREUsCiAJRVhURU5UX0FMTE9DX1NZU1RFTV9JTk9ERSwKIAlJTk9ERV9BTExPQ19TWVNURU1fSU5PREUsCiAJSk9VUk5BTF9TWVNURU1fSU5PREUsCiAJTE9DQUxfQUxMT0NfU1lTVEVNX0lOT0RFLAogCVRSVU5DQVRFX0xPR19TWVNURU1fSU5PREUsCisJTE9DQUxfVVNFUl9RVU9UQV9TWVNURU1fSU5PREUsCisJTE9DQUxfR1JPVVBfUVVPVEFfU1lTVEVNX0lOT0RFLAogCU5VTV9TWVNURU1fSU5PREVTCiB9OwogCkBAIC0zNDksNiArMzY3LDggQEAKIAlbU0xPVF9NQVBfU1lTVEVNX0lOT0RFXQkJCT0geyAic2xvdF9tYXAiLCAwLCBTX0lGUkVHIHwgMDY0NCB9LAogCVtIRUFSVEJFQVRfU1lTVEVNX0lOT0RFXQkJPSB7ICJoZWFydGJlYXQiLCBPQ0ZTMl9IRUFSVEJFQVRfRkwsIFNfSUZSRUcgfCAwNjQ0IH0sCiAJW0dMT0JBTF9CSVRNQVBfU1lTVEVNX0lOT0RFXQkJPSB7ICJnbG9iYWxfYml0bWFwIiwgMCwgU19JRlJFRyB8IDA2NDQgfSwKKwlbVVNFUl9RVU9UQV9TWVNURU1fSU5PREVdCQk9IHsgImFxdW90YS51c2VyIiwgT0NGUzJfUVVPVEFfRkwsIFNfSUZSRUcgfCAwNjQ0IH0sCisJW0dST1VQX1FVT1RBX1NZU1RFTV9JTk9ERV0JCT0geyAiYXF1b3RhLmdyb3VwIiwgT0NGUzJfUVVPVEFfRkwsIFNfSUZSRUcgfCAwNjQ0IH0sCiAKIAkvKiBTbG90LXNwZWNpZmljIHN5c3RlbSBpbm9kZXMgKG9uZSBjb3B5IHBlciBzbG90KSAqLwogCVtPUlBIQU5fRElSX1NZU1RFTV9JTk9ERV0JCT0geyAib3JwaGFuX2RpcjolMDRkIiwgMCwgU19JRkRJUiB8IDA3NTUgfSwKQEAgLTM1Niw3ICszNzYsOSBAQAogCVtJTk9ERV9BTExPQ19TWVNURU1fSU5PREVdCQk9IHsgImlub2RlX2FsbG9jOiUwNGQiLCBPQ0ZTMl9CSVRNQVBfRkwgfCBPQ0ZTMl9DSEFJTl9GTCwgU19JRlJFRyB8IDA2NDQgfSwKIAlbSk9VUk5BTF9TWVNURU1fSU5PREVdCQkJPSB7ICJqb3VybmFsOiUwNGQiLCBPQ0ZTMl9KT1VSTkFMX0ZMLCBTX0lGUkVHIHwgMDY0NCB9LAogCVtMT0NBTF9BTExPQ19TWVNURU1fSU5PREVdCQk9IHsgImxvY2FsX2FsbG9jOiUwNGQiLCBPQ0ZTMl9CSVRNQVBfRkwgfCBPQ0ZTMl9MT0NBTF9BTExPQ19GTCwgU19JRlJFRyB8IDA2NDQgfSwKLQlbVFJVTkNBVEVfTE9HX1NZU1RFTV9JTk9ERV0JCT0geyAidHJ1bmNhdGVfbG9nOiUwNGQiLCBPQ0ZTMl9ERUFMTE9DX0ZMLCBTX0lGUkVHIHwgMDY0NCB9CisJW1RSVU5DQVRFX0xPR19TWVNURU1fSU5PREVdCQk9IHsgInRydW5jYXRlX2xvZzolMDRkIiwgT0NGUzJfREVBTExPQ19GTCwgU19JRlJFRyB8IDA2NDQgfSwKKwlbTE9DQUxfVVNFUl9RVU9UQV9TWVNURU1fSU5PREVdCQk9IHsgImFxdW90YS51c2VyOiUwNGQiLCBPQ0ZTMl9RVU9UQV9GTCwgU19JRlJFRyB8IDA2NDQgfSwKKwlbTE9DQUxfR1JPVVBfUVVPVEFfU1lTVEVNX0lOT0RFXQk9IHsgImFxdW90YS5ncm91cDolMDRkIiwgT0NGUzJfUVVPVEFfRkwsIFNfSUZSRUcgfCAwNjQ0IH0sCiB9OwogCiAvKiBQYXJhbWV0ZXIgcGFzc2VkIGZyb20gbW91bnQub2NmczIgdG8gbW9kdWxlICovCkBAIC00MTAsNiArNDMyLDIyIEBACiAjZGVmaW5lIE9DRlMyX1JBV19TQihkaW5vZGUpCQkoJigoZGlub2RlKS0+aWQyLmlfc3VwZXIpKQogCiAvKgorICogQmxvY2sgY2hlY2tpbmcgc3RydWN0dXJlLiAgVGhpcyBpcyB1c2VkIGluIG1ldGFkYXRhIHRvIHZhbGlkYXRlIHRoZQorICogY29udGVudHMuICBJZiBPQ0ZTMl9GRUFUVVJFX0lOQ09NUEFUX01FVEFfRUNDIGlzIG5vdCBzZXQsIGl0IGlzIGFsbAorICogemVyb3MuCisgKi8KK3N0cnVjdCBvY2ZzMl9ibG9ja19jaGVjayB7CisvKjAwKi8JX19sZTMyIGJjX2NyYzMyZTsJLyogODAyLjMgRXRoZXJuZXQgSUkgQ1JDMzIgKi8KKwlfX2xlMTYgYmNfZWNjOwkJLyogU2luZ2xlLWVycm9yLWNvcnJlY3Rpb24gcGFyaXR5IHZlY3Rvci4KKwkJCQkgICBUaGlzIGlzIGEgc2ltcGxlIEhhbW1pbmcgY29kZSBkZXBlbmRhbnQKKwkJCQkgICBvbiB0aGUgYmxvY2tzaXplLiAgT0NGUzIncyBtYXhpbXVtCisJCQkJICAgYmxvY2tzaXplLCA0SywgcmVxdWlyZXMgMTYgcGFyaXR5IGJpdHMsCisJCQkJICAgc28gd2UgZml0IGluIF9fbGUxNi4gKi8KKwlfX2xlMTYgYmNfcmVzZXJ2ZWQxOworLyowOCovCit9OworCisvKgogICogT24gZGlzayBleHRlbnQgcmVjb3JkIGZvciBPQ0ZTMgogICogSXQgZGVzY3JpYmVzIGEgcmFuZ2Ugb2YgY2x1c3RlcnMgb24gZGlzay4KICAqCkBAIC00OTYsNyArNTM0LDcgQEAKIHN0cnVjdCBvY2ZzMl9leHRlbnRfYmxvY2sKIHsKIC8qMDAqLwlfX3U4IGhfc2lnbmF0dXJlWzhdOwkJLyogU2lnbmF0dXJlIGZvciB2ZXJpZmljYXRpb24gKi8KLQlfX2xlNjQgaF9yZXNlcnZlZDE7CisJc3RydWN0IG9jZnMyX2Jsb2NrX2NoZWNrIGhfY2hlY2s7CS8qIEVycm9yIGNoZWNraW5nICovCiAvKjEwKi8JX19sZTE2IGhfc3ViYWxsb2Nfc2xvdDsJCS8qIFNsb3Qgc3ViYWxsb2NhdG9yIHRoaXMKIAkJCQkJICAgZXh0ZW50X2hlYWRlciBiZWxvbmdzIHRvICovCiAJX19sZTE2IGhfc3ViYWxsb2NfYml0OwkJLyogQml0IG9mZnNldCBpbiBzdWJhbGxvY2F0b3IKQEAgLTY2Niw3ICs3MDQsOCBAQAogCQkJCQkgICB3YXMgc2V0IGluIGlfZmxhZ3MgKi8KIAlfX2xlMTYgaV9keW5fZmVhdHVyZXM7CiAJX19sZTY0IGlfeGF0dHJfbG9jOwotLyo4MCovCV9fbGU2NCBpX3Jlc2VydmVkMls3XTsKKy8qODAqLwlzdHJ1Y3Qgb2NmczJfYmxvY2tfY2hlY2sgaV9jaGVjazsJLyogRXJyb3IgY2hlY2tpbmcgKi8KKy8qODgqLwlfX2xlNjQgaV9yZXNlcnZlZDJbNl07CiAvKkI4Ki8JdW5pb24gewogCQlfX2xlNjQgaV9wYWQxOwkJLyogR2VuZXJpYyB3YXkgdG8gcmVmZXIgdG8gdGhpcwogCQkJCQkgICA2NGJpdCB1bmlvbiAqLwpAQCAtNzE1LDYgKzc1NCwzNCBAQAogfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CiAKIC8qCisgKiBQZXItYmxvY2sgcmVjb3JkIGZvciB0aGUgdW5pbmRleGVkIGRpcmVjdG9yeSBidHJlZS4gVGhpcyBpcyBjYXJlZnVsbHkKKyAqIGNyYWZ0ZWQgc28gdGhhdCB0aGUgcmVjX2xlbiBhbmQgbmFtZV9sZW4gcmVjb3JkcyBvZiBhbiBvY2ZzMl9kaXJfZW50cnkgYXJlCisgKiBtaXJyb3JlZC4gVGhhdCB3YXksIHRoZSBkaXJlY3RvcnkgbWFuaXB1bGF0aW9uIGNvZGUgbmVlZHMgYSBtaW5pbWFsIGFtb3VudAorICogb2YgdXBkYXRlLgorICoKKyAqIE5PVEU6IEtlZXAgdGhpcyBzdHJ1Y3R1cmUgYWxpZ25lZCB0byBhIG11bHRpcGxlIG9mIDQgYnl0ZXMuCisgKi8KK3N0cnVjdCBvY2ZzMl9kaXJfYmxvY2tfdHJhaWxlciB7CisvKjAwKi8JX19sZTY0CQlkYl9jb21wYXRfaW5vZGU7CS8qIEFsd2F5cyB6ZXJvLiBXYXMgaW5vZGUgKi8KKworCV9fbGUxNgkJZGJfY29tcGF0X3JlY19sZW47CS8qIEJhY2t3YXJkcyBjb21wYXRpYmxlIHdpdGgKKwkJCQkJCSAqIG9jZnMyX2Rpcl9lbnRyeS4gKi8KKwlfX3U4CQlkYl9jb21wYXRfbmFtZV9sZW47CS8qIEFsd2F5cyB6ZXJvLiBXYXMgbmFtZV9sZW4gKi8KKwlfX3U4CQlkYl9yZXNlcnZlZDA7CisJX19sZTE2CQlkYl9yZXNlcnZlZDE7CisJX19sZTE2CQlkYl9mcmVlX3JlY19sZW47CS8qIFNpemUgb2YgbGFyZ2VzdCBlbXB0eSBob2xlCisJCQkJCQkgKiBpbiB0aGlzIGJsb2NrLiAodW51c2VkKSAqLworLyoxMCovCV9fdTgJCWRiX3NpZ25hdHVyZVs4XTsJLyogU2lnbmF0dXJlIGZvciB2ZXJpZmljYXRpb24gKi8KKwlfX2xlNjQJCWRiX3Jlc2VydmVkMjsKKwlfX2xlNjQJCWRiX2ZyZWVfbmV4dDsJCS8qIE5leHQgYmxvY2sgaW4gbGlzdCAodW51c2VkKSAqLworLyoyMCovCV9fbGU2NAkJZGJfYmxrbm87CQkvKiBPZmZzZXQgb24gZGlzaywgaW4gYmxvY2tzICovCisJX19sZTY0CQlkYl9wYXJlbnRfZGlub2RlOwkvKiBkaW5vZGUgd2hpY2ggb3ducyBtZSwgaW4KKwkJCQkJCSAgIGJsb2NrcyAqLworLyozMCovCXN0cnVjdCBvY2ZzMl9ibG9ja19jaGVjayBkYl9jaGVjazsJLyogRXJyb3IgY2hlY2tpbmcgKi8KKy8qNDAqLworfTsKKworLyoKICAqIE9uIGRpc2sgYWxsb2NhdG9yIGdyb3VwIHN0cnVjdHVyZSBmb3IgT0NGUzIKICAqLwogc3RydWN0IG9jZnMyX2dyb3VwX2Rlc2MKQEAgLTczMyw3ICs4MDAsOCBAQAogLyoyMCovCV9fbGU2NCAgIGJnX3BhcmVudF9kaW5vZGU7ICAgICAgIC8qIGRpbm9kZSB3aGljaCBvd25zIG1lLCBpbgogCQkJCQkgICBibG9ja3MgKi8KIAlfX2xlNjQgICBiZ19ibGtubzsgICAgICAgICAgICAgICAvKiBPZmZzZXQgb24gZGlzaywgaW4gYmxvY2tzICovCi0vKjMwKi8JX19sZTY0ICAgYmdfcmVzZXJ2ZWQyWzJdOworLyozMCovCXN0cnVjdCBvY2ZzMl9ibG9ja19jaGVjayBiZ19jaGVjazsJLyogRXJyb3IgY2hlY2tpbmcgKi8KKwlfX2xlNjQgICBiZ19yZXNlcnZlZDI7CiAvKjQwKi8JX191OCAgICBiZ19iaXRtYXBbMF07CiB9OwogCkBAIC03NzYsNyArODQ0LDEyIEBACiAJCQkJCQkgICBpbiB0aGlzIGV4dGVudCByZWNvcmQsCiAJCQkJCQkgICBvbmx5IHZhbGlkIGluIHRoZSBmaXJzdAogCQkJCQkJICAgYnVja2V0LiAqLwotCV9fbGU2NCAgeGhfY3N1bTsKKwlzdHJ1Y3Qgb2NmczJfYmxvY2tfY2hlY2sgeGhfY2hlY2s7CS8qIEVycm9yIGNoZWNraW5nCisJCQkJCQkgICAoTm90ZSwgdGhpcyBpcyBvbmx5CisJCQkJCQkgICAgdXNlZCBmb3IgeGF0dHIKKwkJCQkJCSAgICBidWNrZXRzLiAgQSBibG9jayB1c2VzCisJCQkJCQkgICAgeGJfY2hlY2sgYW5kIHNldHMKKwkJCQkJCSAgICB0aGlzIGZpZWxkIHRvIHplcm8uKSAqLwogCXN0cnVjdCBvY2ZzMl94YXR0cl9lbnRyeSB4aF9lbnRyaWVzWzBdOyAvKiB4YXR0ciBlbnRyeSBsaXN0LiAqLwogfTsKIApAQCAtODI3LDcgKzkwMCw3IEBACiAJCQkJCWJsb2NrIGdyb3VwICovCiAJX19sZTMyCXhiX2ZzX2dlbmVyYXRpb247ICAgIC8qIE11c3QgbWF0Y2ggc3VwZXIgYmxvY2sgKi8KIC8qMTAqLwlfX2xlNjQJeGJfYmxrbm87ICAgICAgICAgICAgLyogT2Zmc2V0IG9uIGRpc2ssIGluIGJsb2NrcyAqLwotCV9fbGU2NAl4Yl9jc3VtOworCXN0cnVjdCBvY2ZzMl9ibG9ja19jaGVjayB4Yl9jaGVjazsJLyogRXJyb3IgY2hlY2tpbmcgKi8KIC8qMjAqLwlfX2xlMTYJeGJfZmxhZ3M7ICAgICAgICAgICAgLyogSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBibG9jayBjb250YWlucwogCQkJCQlyZWFsIHhhdHRyIG9yIGEgeGF0dHIgdHJlZS4gKi8KIAlfX2xlMTYJeGJfcmVzZXJ2ZWQwOwpAQCAtODY4LDYgKzk0MSwxMjggQEAKIAlyZXR1cm4geGUtPnhlX3R5cGUgJiBPQ0ZTMl9YQVRUUl9UWVBFX01BU0s7CiB9CiAKKy8qCisgKiAgT24gZGlzayBzdHJ1Y3R1cmVzIGZvciBnbG9iYWwgcXVvdGEgZmlsZQorICovCisKKy8qIE1hZ2ljIG51bWJlcnMgYW5kIGtub3duIHZlcnNpb25zIGZvciBnbG9iYWwgcXVvdGEgZmlsZXMgKi8KKyNkZWZpbmUgT0NGUzJfR0xPQkFMX1FNQUdJQ1Mge1wKKwkweDBjZjUyNDcwLCAvKiBVU1JRVU9UQSAqLyBcCisJMHgwY2Y1MjQ3MSAgLyogR1JQUVVPVEEgKi8gXAorfQorCisjZGVmaW5lIE9DRlMyX0dMT0JBTF9RVkVSU0lPTlMge1wKKwkwLCBcCisJMCwgXAorfQorCisKKy8qIEVhY2ggYmxvY2sgb2YgZWFjaCBxdW90YSBmaWxlIGhhcyBhIGNlcnRhaW4gZml4ZWQgbnVtYmVyIG9mIGJ5dGVzIHJlc2VydmVkCisgKiBmb3IgT0NGUzIgaW50ZXJuYWwgdXNlIGF0IGl0cyBlbmQuIE9DRlMyIGNhbiB1c2UgaXQgZm9yIHRoaW5ncyBsaWtlCisgKiBjaGVja3N1bXMsIGV0Yy4gKi8KKyNkZWZpbmUgT0NGUzJfUUJMS19SRVNFUlZFRF9TUEFDRSA4CisKKy8qIEdlbmVyaWMgaGVhZGVyIG9mIGFsbCBxdW90YSBmaWxlcyAqLworc3RydWN0IG9jZnMyX2Rpc2tfZHFoZWFkZXIgeworCV9fbGUzMiBkcWhfbWFnaWM7CS8qIE1hZ2ljIG51bWJlciBpZGVudGlmeWluZyBmaWxlICovCisJX19sZTMyIGRxaF92ZXJzaW9uOwkvKiBRdW90YSBmb3JtYXQgdmVyc2lvbiAqLworfTsKKworI2RlZmluZSBPQ0ZTMl9HTE9CQUxfSU5GT19PRkYgKHNpemVvZihzdHJ1Y3Qgb2NmczJfZGlza19kcWhlYWRlcikpCisKKy8qIEluZm9ybWF0aW9uIGhlYWRlciBvZiBnbG9iYWwgcXVvdGEgZmlsZSAoaW1tZWRpYXRlbHkgZm9sbG93cyB0aGUgZ2VuZXJpYworICogaGVhZGVyKSAqLworc3RydWN0IG9jZnMyX2dsb2JhbF9kaXNrX2RxaW5mbyB7CisvKjAwKi8JX19sZTMyIGRxaV9iZ3JhY2U7CS8qIEdyYWNlIHRpbWUgZm9yIHNwYWNlIHNvZnRsaW1pdCBleGNlc3MgKi8KKwlfX2xlMzIgZHFpX2lncmFjZTsJLyogR3JhY2UgdGltZSBmb3IgaW5vZGUgc29mdGxpbWl0IGV4Y2VzcyAqLworCV9fbGUzMiBkcWlfc3luY21zOwkvKiBUaW1lIGFmdGVyIHdoaWNoIHdlIHN5bmMgbG9jYWwgY2hhbmdlcyB0bworCQkJCSAqIGdsb2JhbCBxdW90YSBmaWxlICovCisJX19sZTMyIGRxaV9ibG9ja3M7CS8qIE51bWJlciBvZiBibG9ja3MgaW4gcXVvdGEgZmlsZSAqLworLyoxMCovCV9fbGUzMiBkcWlfZnJlZV9ibGs7CS8qIEZpcnN0IGZyZWUgYmxvY2sgaW4gcXVvdGEgZmlsZSAqLworCV9fbGUzMiBkcWlfZnJlZV9lbnRyeTsJLyogRmlyc3QgYmxvY2sgd2l0aCBmcmVlIGRxdW90IGVudHJ5IGluIHF1b3RhCisJCQkJICogZmlsZSAqLworfTsKKworLyogU3RydWN0dXJlIHdpdGggZ2xvYmFsIHVzZXIgLyBncm91cCBpbmZvcm1hdGlvbi4gV2UgcmVzZXJ2ZSBzb21lIHNwYWNlCisgKiBmb3IgZnV0dXJlIHVzZS4gKi8KK3N0cnVjdCBvY2ZzMl9nbG9iYWxfZGlza19kcWJsayB7CisvKjAwKi8JX19sZTMyIGRxYl9pZDsgICAgICAgICAgLyogSUQgdGhlIHN0cnVjdHVyZSBiZWxvbmdzIHRvICovCisJX19sZTMyIGRxYl91c2VfY291bnQ7ICAgLyogTnVtYmVyIG9mIG5vZGVzIGhhdmluZyByZWZlcmVuY2UgdG8gdGhpcyBzdHJ1Y3R1cmUgKi8KKwlfX2xlNjQgZHFiX2loYXJkbGltaXQ7ICAvKiBhYnNvbHV0ZSBsaW1pdCBvbiBhbGxvY2F0ZWQgaW5vZGVzICovCisvKjEwKi8JX19sZTY0IGRxYl9pc29mdGxpbWl0OyAgLyogcHJlZmVycmVkIGlub2RlIGxpbWl0ICovCisJX19sZTY0IGRxYl9jdXJpbm9kZXM7ICAgLyogY3VycmVudCAjIGFsbG9jYXRlZCBpbm9kZXMgKi8KKy8qMjAqLwlfX2xlNjQgZHFiX2JoYXJkbGltaXQ7ICAvKiBhYnNvbHV0ZSBsaW1pdCBvbiBkaXNrIHNwYWNlICovCisJX19sZTY0IGRxYl9ic29mdGxpbWl0OyAgLyogcHJlZmVycmVkIGxpbWl0IG9uIGRpc2sgc3BhY2UgKi8KKy8qMzAqLwlfX2xlNjQgZHFiX2N1cnNwYWNlOyAgICAvKiBjdXJyZW50IHNwYWNlIG9jY3VwaWVkICovCisJX19sZTY0IGRxYl9idGltZTsgICAgICAgLyogdGltZSBsaW1pdCBmb3IgZXhjZXNzaXZlIGRpc2sgdXNlICovCisvKjQwKi8JX19sZTY0IGRxYl9pdGltZTsgICAgICAgLyogdGltZSBsaW1pdCBmb3IgZXhjZXNzaXZlIGlub2RlIHVzZSAqLworCV9fbGU2NCBkcWJfcGFkMTsKKy8qNTAqLwlfX2xlNjQgZHFiX3BhZDI7Cit9OworCisvKgorICogIE9uLWRpc2sgc3RydWN0dXJlcyBmb3IgbG9jYWwgcXVvdGEgZmlsZQorICovCisKKy8qIE1hZ2ljIG51bWJlcnMgYW5kIGtub3duIHZlcnNpb25zIGZvciBsb2NhbCBxdW90YSBmaWxlcyAqLworI2RlZmluZSBPQ0ZTMl9MT0NBTF9RTUFHSUNTIHtcCisJMHgwY2Y1MjRjMCwgLyogVVNSUVVPVEEgKi8gXAorCTB4MGNmNTI0YzEgIC8qIEdSUFFVT1RBICovIFwKK30KKworI2RlZmluZSBPQ0ZTMl9MT0NBTF9RVkVSU0lPTlMge1wKKwkwLCBcCisJMCwgXAorfQorCisvKiBRdW90YSBmbGFncyBpbiBkcWluZm8gaGVhZGVyICovCisjZGVmaW5lIE9MUUZfQ0xFQU4JMHgwMDAxCS8qIFF1b3RhIGZpbGUgaXMgZW1wdHkgKHRoaXMgc2hvdWxkIGJlIGFmdGVyXAorCQkJCSAqIHF1b3RhIGhhcyBiZWVuIGNsZWFubHkgdHVybmVkIG9mZikgKi8KKworI2RlZmluZSBPQ0ZTMl9MT0NBTF9JTkZPX09GRiAoc2l6ZW9mKHN0cnVjdCBvY2ZzMl9kaXNrX2RxaGVhZGVyKSkKKworLyogSW5mb3JtYXRpb24gaGVhZGVyIG9mIGxvY2FsIHF1b3RhIGZpbGUgKGltbWVkaWF0ZWx5IGZvbGxvd3MgdGhlIGdlbmVyaWMKKyAqIGhlYWRlcikgKi8KK3N0cnVjdCBvY2ZzMl9sb2NhbF9kaXNrX2RxaW5mbyB7CisJX19sZTMyIGRxaV9mbGFnczsJLyogRmxhZ3MgZm9yIHF1b3RhIGZpbGUgKi8KKwlfX2xlMzIgZHFpX2NodW5rczsJLyogTnVtYmVyIG9mIGNodW5rcyBvZiBxdW90YSBzdHJ1Y3R1cmVzCisJCQkJICogd2l0aCBhIGJpdG1hcCAqLworCV9fbGUzMiBkcWlfYmxvY2tzOwkvKiBOdW1iZXIgb2YgYmxvY2tzIGFsbG9jYXRlZCBmb3IgcXVvdGEgZmlsZSAqLworfTsKKworLyogSGVhZGVyIG9mIG9uZSBjaHVuayBvZiBhIHF1b3RhIGZpbGUgKi8KK3N0cnVjdCBvY2ZzMl9sb2NhbF9kaXNrX2NodW5rIHsKKwlfX2xlMzIgZHFjX2ZyZWU7CS8qIE51bWJlciBvZiBmcmVlIGVudHJpZXMgaW4gdGhlIGJpdG1hcCAqLworCXU4IGRxY19iaXRtYXBbMF07CS8qIEJpdG1hcCBvZiBlbnRyaWVzIGluIHRoZSBjb3JyZXNwb25kaW5nCisJCQkJICogY2h1bmsgb2YgcXVvdGEgZmlsZSAqLworfTsKKworLyogT25lIGVudHJ5IGluIGxvY2FsIHF1b3RhIGZpbGUgKi8KK3N0cnVjdCBvY2ZzMl9sb2NhbF9kaXNrX2RxYmxrIHsKKy8qMDAqLwlfX2xlNjQgZHFiX2lkOwkJLyogaWQgdGhpcyBxdW90YSBhcHBsaWVzIHRvICovCisJX19sZTY0IGRxYl9zcGFjZW1vZDsJLyogQ2hhbmdlIGluIHRoZSBhbW91bnQgb2YgdXNlZCBzcGFjZSAqLworLyoxMCovCV9fbGU2NCBkcWJfaW5vZGVtb2Q7CS8qIENoYW5nZSBpbiB0aGUgYW1vdW50IG9mIHVzZWQgaW5vZGVzICovCit9OworCisKKy8qCisgKiBUaGUgcXVvdGEgdHJhaWxlciBsaXZlcyBhdCB0aGUgZW5kIG9mIGVhY2ggcXVvdGEgYmxvY2suCisgKi8KKworc3RydWN0IG9jZnMyX2Rpc2tfZHF0cmFpbGVyIHsKKy8qMDAqLwlzdHJ1Y3Qgb2NmczJfYmxvY2tfY2hlY2sgZHFfY2hlY2s7CS8qIEVycm9yIGNoZWNraW5nICovCisvKjA4Ki8JLyogQ2Fubm90IGJlIGxhcmdlciB0aGFuIE9DRlMyX1FCTEtfUkVTRVJWRURfU1BBQ0UgKi8KK307CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IG9jZnMyX2Rpc2tfZHF0cmFpbGVyICpvY2ZzMl9ibG9ja19kcXRyYWlsZXIoaW50IGJsb2Nrc2l6ZSwKKwkJCQkJCQkJIHZvaWQgKmJ1ZikKK3sKKwljaGFyICpwdHIgPSBidWY7CisJcHRyICs9IGJsb2Nrc2l6ZSAtIE9DRlMyX1FCTEtfUkVTRVJWRURfU1BBQ0U7CisKKwlyZXR1cm4gKHN0cnVjdCBvY2ZzMl9kaXNrX2RxdHJhaWxlciAqKXB0cjsKK30KKwogI2lmZGVmIF9fS0VSTkVMX18KIHN0YXRpYyBpbmxpbmUgaW50IG9jZnMyX2Zhc3Rfc3ltbGlua19jaGFycyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQogewpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvb2NmczJfamJkX2NvbXBhdC5oIGIvZnMvb2NmczIvb2NmczJfamJkX2NvbXBhdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTFjNzhmLi4wMDAwMDAwCi0tLSBhL2ZzL29jZnMyL29jZnMyX2piZF9jb21wYXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qIC0qLSBtb2RlOiBjOyBjLWJhc2ljLW9mZnNldDogODsgLSotCi0gKiB2aW06IG5vZXhwYW5kdGFiIHN3PTggdHM9OCBzdHM9MDoKLSAqCi0gKiBvY2ZzMl9qYmRfY29tcGF0LmgKLSAqCi0gKiBDb21wYXRpYmlsaXR5IGRlZmluZXMgZm9yIEpCRC4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggT3JhY2xlLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLQotI2lmbmRlZiBPQ0ZTMl9KQkRfQ09NUEFUX0gKLSNkZWZpbmUgT0NGUzJfSkJEX0NPTVBBVF9ICi0KLSNpZm5kZWYgQ09ORklHX09DRlMyX0NPTVBBVF9KQkQKLSMgZXJyb3IgU2hvdWxkIG5vdCBoYXZlIGJlZW4gaW5jbHVkZWQKLSNlbmRpZgotCi1zdHJ1Y3QgamJkMl9pbm9kZSB7Ci0JdW5zaWduZWQgaW50IGR1bW15OwotfTsKLQotI2RlZmluZSBKQkQyX0JBUlJJRVIJCQlKRlNfQkFSUklFUgotI2RlZmluZSBKQkQyX0RFRkFVTFRfTUFYX0NPTU1JVF9BR0UJSkJEX0RFRkFVTFRfTUFYX0NPTU1JVF9BR0UKLQotI2RlZmluZSBqYmQyX2pvdXJuYWxfYWNrX2VycgkJCWpvdXJuYWxfYWNrX2VycgotI2RlZmluZSBqYmQyX2pvdXJuYWxfY2xlYXJfZXJyCQkJam91cm5hbF9jbGVhcl9lcnIKLSNkZWZpbmUgamJkMl9qb3VybmFsX2Rlc3Ryb3kJCQlqb3VybmFsX2Rlc3Ryb3kKLSNkZWZpbmUgamJkMl9qb3VybmFsX2RpcnR5X21ldGFkYXRhCQlqb3VybmFsX2RpcnR5X21ldGFkYXRhCi0jZGVmaW5lIGpiZDJfam91cm5hbF9lcnJubwkJCWpvdXJuYWxfZXJybm8KLSNkZWZpbmUgamJkMl9qb3VybmFsX2V4dGVuZAkJCWpvdXJuYWxfZXh0ZW5kCi0jZGVmaW5lIGpiZDJfam91cm5hbF9mbHVzaAkJCWpvdXJuYWxfZmx1c2gKLSNkZWZpbmUgamJkMl9qb3VybmFsX2ZvcmNlX2NvbW1pdAkJam91cm5hbF9mb3JjZV9jb21taXQKLSNkZWZpbmUgamJkMl9qb3VybmFsX2dldF93cml0ZV9hY2Nlc3MJCWpvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcwotI2RlZmluZSBqYmQyX2pvdXJuYWxfZ2V0X3VuZG9fYWNjZXNzCQlqb3VybmFsX2dldF91bmRvX2FjY2VzcwotI2RlZmluZSBqYmQyX2pvdXJuYWxfaW5pdF9pbm9kZQkJCWpvdXJuYWxfaW5pdF9pbm9kZQotI2RlZmluZSBqYmQyX2pvdXJuYWxfaW52YWxpZGF0ZXBhZ2UJCWpvdXJuYWxfaW52YWxpZGF0ZXBhZ2UKLSNkZWZpbmUgamJkMl9qb3VybmFsX2xvYWQJCQlqb3VybmFsX2xvYWQKLSNkZWZpbmUgamJkMl9qb3VybmFsX2xvY2tfdXBkYXRlcwkJam91cm5hbF9sb2NrX3VwZGF0ZXMKLSNkZWZpbmUgamJkMl9qb3VybmFsX3Jlc3RhcnQJCQlqb3VybmFsX3Jlc3RhcnQKLSNkZWZpbmUgamJkMl9qb3VybmFsX3N0YXJ0CQkJam91cm5hbF9zdGFydAotI2RlZmluZSBqYmQyX2pvdXJuYWxfc3RhcnRfY29tbWl0CQlqb3VybmFsX3N0YXJ0X2NvbW1pdAotI2RlZmluZSBqYmQyX2pvdXJuYWxfc3RvcAkJCWpvdXJuYWxfc3RvcAotI2RlZmluZSBqYmQyX2pvdXJuYWxfdHJ5X3RvX2ZyZWVfYnVmZmVycwlqb3VybmFsX3RyeV90b19mcmVlX2J1ZmZlcnMKLSNkZWZpbmUgamJkMl9qb3VybmFsX3VubG9ja191cGRhdGVzCQlqb3VybmFsX3VubG9ja191cGRhdGVzCi0jZGVmaW5lIGpiZDJfam91cm5hbF93aXBlCQkJam91cm5hbF93aXBlCi0jZGVmaW5lIGpiZDJfbG9nX3dhaXRfY29tbWl0CQkJbG9nX3dhaXRfY29tbWl0Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGpiZDJfam91cm5hbF9maWxlX2lub2RlKGhhbmRsZV90ICpoYW5kbGUsCi0JCQkJCSAgc3RydWN0IGpiZDJfaW5vZGUgKmlub2RlKQotewotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBqYmQyX2pvdXJuYWxfYmVnaW5fb3JkZXJlZF90cnVuY2F0ZShzdHJ1Y3QgamJkMl9pbm9kZSAqaW5vZGUsCi0JCQkJCQkgICAgICBsb2ZmX3QgbmV3X3NpemUpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBqYmQyX2pvdXJuYWxfaW5pdF9qYmRfaW5vZGUoc3RydWN0IGpiZDJfaW5vZGUgKmppbm9kZSwKLQkJCQkJICAgICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUpCi17Ci0JcmV0dXJuOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgamJkMl9qb3VybmFsX3JlbGVhc2VfamJkX2lub2RlKGpvdXJuYWxfdCAqam91cm5hbCwKLQkJCQkJCSAgc3RydWN0IGpiZDJfaW5vZGUgKmppbm9kZSkKLXsKLQlyZXR1cm47Ci19Ci0KLQotI2VuZGlmICAvKiBPQ0ZTMl9KQkRfQ09NUEFUX0ggKi8KZGlmZiAtLWdpdCBhL2ZzL29jZnMyL29jZnMyX2xvY2tpZC5oIGIvZnMvb2NmczIvb2NmczJfbG9ja2lkLmgKaW5kZXggODJjMjAwZi4uZWI2ZjUwYyAxMDA2NDQKLS0tIGEvZnMvb2NmczIvb2NmczJfbG9ja2lkLmgKKysrIGIvZnMvb2NmczIvb2NmczJfbG9ja2lkLmgKQEAgLTQ2LDYgKzQ2LDcgQEAKIAlPQ0ZTMl9MT0NLX1RZUEVfREVOVFJZLAogCU9DRlMyX0xPQ0tfVFlQRV9PUEVOLAogCU9DRlMyX0xPQ0tfVFlQRV9GTE9DSywKKwlPQ0ZTMl9MT0NLX1RZUEVfUUlORk8sCiAJT0NGUzJfTlVNX0xPQ0tfVFlQRVMKIH07CiAKQEAgLTc3LDYgKzc4LDkgQEAKIAkJY2FzZSBPQ0ZTMl9MT0NLX1RZUEVfRkxPQ0s6CiAJCQljID0gJ0YnOwogCQkJYnJlYWs7CisJCWNhc2UgT0NGUzJfTE9DS19UWVBFX1FJTkZPOgorCQkJYyA9ICdRJzsKKwkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJYyA9ICdcMCc7CiAJfQpAQCAtOTUsNiArOTksNyBAQAogCVtPQ0ZTMl9MT0NLX1RZUEVfREVOVFJZXSA9ICJEZW50cnkiLAogCVtPQ0ZTMl9MT0NLX1RZUEVfT1BFTl0gPSAiT3BlbiIsCiAJW09DRlMyX0xPQ0tfVFlQRV9GTE9DS10gPSAiRmxvY2siLAorCVtPQ0ZTMl9MT0NLX1RZUEVfUUlORk9dID0gIlF1b3RhIiwKIH07CiAKIHN0YXRpYyBpbmxpbmUgY29uc3QgY2hhciAqb2NmczJfbG9ja190eXBlX3N0cmluZyhlbnVtIG9jZnMyX2xvY2tfdHlwZSB0eXBlKQpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvcXVvdGEuaCBiL2ZzL29jZnMyL3F1b3RhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzM2NWUyZQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL29jZnMyL3F1b3RhLmgKQEAgLTAsMCArMSwxMTkgQEAKKy8qCisgKiBxdW90YS5oIGZvciBPQ0ZTMgorICoKKyAqIE9uIGRpc2sgcXVvdGEgc3RydWN0dXJlcyBmb3IgbG9jYWwgYW5kIGdsb2JhbCBxdW90YSBmaWxlLCBpbi1tZW1vcnkKKyAqIHN0cnVjdHVyZXMuCisgKgorICovCisKKyNpZm5kZWYgX09DRlMyX1FVT1RBX0gKKyNkZWZpbmUgX09DRlMyX1FVT1RBX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3F1b3RhLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RxYmxrX3F0cmVlLmg+CisKKyNpbmNsdWRlICJvY2ZzMi5oIgorCisvKiBDb21tb24gc3R1ZmYgKi8KKy8qIGlkIG51bWJlciBvZiBxdW90YSBmb3JtYXQgKi8KKyNkZWZpbmUgUUZNVF9PQ0ZTMiAzCisKKy8qCisgKiBJbi1tZW1vcnkgc3RydWN0dXJlcworICovCitzdHJ1Y3Qgb2NmczJfZHF1b3QgeworCXN0cnVjdCBkcXVvdCBkcV9kcXVvdDsJLyogR2VuZXJpYyBWRlMgZHF1b3QgKi8KKwlsb2ZmX3QgZHFfbG9jYWxfb2ZmOwkvKiBPZmZzZXQgaW4gdGhlIGxvY2FsIHF1b3RhIGZpbGUgKi8KKwlzdHJ1Y3Qgb2NmczJfcXVvdGFfY2h1bmsgKmRxX2NodW5rOwkvKiBDaHVuayBkcXVvdCBpcyBpbiAqLworCXVuc2lnbmVkIGludCBkcV91c2VfY291bnQ7CS8qIE51bWJlciBvZiBub2RlcyBoYXZpbmcgcmVmZXJlbmNlIHRvIHRoaXMgZW50cnkgaW4gZ2xvYmFsIHF1b3RhIGZpbGUgKi8KKwlzNjQgZHFfb3JpZ3NwYWNlOwkvKiBMYXN0IGdsb2JhbGx5IHN5bmNlZCBzcGFjZSB1c2FnZSAqLworCXM2NCBkcV9vcmlnaW5vZGVzOwkvKiBMYXN0IGdsb2JhbGx5IHN5bmNlZCBpbm9kZSB1c2FnZSAqLworfTsKKworLyogRGVzY3JpcHRpb24gb2Ygb25lIGNodW5rIHRvIHJlY292ZXIgaW4gbWVtb3J5ICovCitzdHJ1Y3Qgb2NmczJfcmVjb3ZlcnlfY2h1bmsgeworCXN0cnVjdCBsaXN0X2hlYWQgcmNfbGlzdDsJLyogTGlzdCBvZiBjaHVua3MgKi8KKwlpbnQgcmNfY2h1bms7CQkJLyogQ2h1bmsgbnVtYmVyICovCisJdW5zaWduZWQgbG9uZyAqcmNfYml0bWFwOwkvKiBCaXRtYXAgb2YgZW50cmllcyB0byByZWNvdmVyICovCit9OworCitzdHJ1Y3Qgb2NmczJfcXVvdGFfcmVjb3ZlcnkgeworCXN0cnVjdCBsaXN0X2hlYWQgcl9saXN0W01BWFFVT1RBU107CS8qIExpc3Qgb2YgY2h1bmtzIHRvIHJlY292ZXIgKi8KK307CisKKy8qIEluLW1lbW9yeSBzdHJ1Y3R1cmUgd2l0aCBxdW90YSBoZWFkZXIgaW5mb3JtYXRpb24gKi8KK3N0cnVjdCBvY2ZzMl9tZW1fZHFpbmZvIHsKKwl1bnNpZ25lZCBpbnQgZHFpX3R5cGU7CQkvKiBRdW90YSB0eXBlIHRoaXMgc3RydWN0dXJlIGRlc2NyaWJlcyAqLworCXVuc2lnbmVkIGludCBkcWlfY2h1bmtzOwkvKiBOdW1iZXIgb2YgY2h1bmtzIGluIGxvY2FsIHF1b3RhIGZpbGUgKi8KKwl1bnNpZ25lZCBpbnQgZHFpX2Jsb2NrczsJLyogTnVtYmVyIG9mIGJsb2NrcyBhbGxvY2F0ZWQgZm9yIGxvY2FsIHF1b3RhIGZpbGUgKi8KKwl1bnNpZ25lZCBpbnQgZHFpX3N5bmNtczsJLyogSG93IG9mdGVuIHNob3VsZCB3ZSBzeW5jIHdpdGggb3RoZXIgbm9kZXMgKi8KKwl1bnNpZ25lZCBpbnQgZHFpX3N5bmNqaWZmOwkvKiBQcmVjb21wdXRlZCBkcWlfc3luY21zIGluIGppZmZpZXMgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGRxaV9jaHVuazsJLyogTGlzdCBvZiBjaHVua3MgKi8KKwlzdHJ1Y3QgaW5vZGUgKmRxaV9ncWlub2RlOwkvKiBHbG9iYWwgcXVvdGEgZmlsZSBpbm9kZSAqLworCXN0cnVjdCBvY2ZzMl9sb2NrX3JlcyBkcWlfZ3Fsb2NrOwkvKiBMb2NrIHByb3RlY3RpbmcgcXVvdGEgaW5mb3JtYXRpb24gc3RydWN0dXJlICovCisJc3RydWN0IGJ1ZmZlcl9oZWFkICpkcWlfZ3FpX2JoOwkvKiBCdWZmZXIgaGVhZCB3aXRoIGdsb2JhbCBxdW90YSBmaWxlIGlub2RlIC0gc2V0IG9ubHkgaWYgaW5vZGUgbG9jayBpcyBvYnRhaW5lZCAqLworCWludCBkcWlfZ3FpX2NvdW50OwkJLyogTnVtYmVyIG9mIGhvbGRlcnMgb2YgZHFpX2dxaV9iaCAqLworCXN0cnVjdCBidWZmZXJfaGVhZCAqZHFpX2xxaV9iaDsJLyogQnVmZmVyIGhlYWQgd2l0aCBsb2NhbCBxdW90YSBmaWxlIGlub2RlICovCisJc3RydWN0IGJ1ZmZlcl9oZWFkICpkcWlfaWJoOwkvKiBCdWZmZXIgd2l0aCBpbmZvcm1hdGlvbiBoZWFkZXIgKi8KKwlzdHJ1Y3QgcXRyZWVfbWVtX2RxaW5mbyBkcWlfZ2k7CS8qIEluZm8gYWJvdXQgZ2xvYmFsIGZpbGUgKi8KKwlzdHJ1Y3QgZGVsYXllZF93b3JrIGRxaV9zeW5jX3dvcms7CS8qIFdvcmsgZm9yIHN5bmNpbmcgZHF1b3RzICovCisJc3RydWN0IG9jZnMyX3F1b3RhX3JlY292ZXJ5ICpkcWlfcmVjOwkvKiBQb2ludGVyIHRvIHJlY292ZXJ5CisJCQkJCQkgKiBpbmZvcm1hdGlvbiwgaW4gY2FzZSB3ZQorCQkJCQkJICogZW5hYmxlIHF1b3RhcyBvbiBmaWxlCisJCQkJCQkgKiBuZWVkaW5nIGl0ICovCit9OworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBvY2ZzMl9kcXVvdCAqT0NGUzJfRFFVT1Qoc3RydWN0IGRxdW90ICpkcXVvdCkKK3sKKwlyZXR1cm4gY29udGFpbmVyX29mKGRxdW90LCBzdHJ1Y3Qgb2NmczJfZHF1b3QsIGRxX2RxdW90KTsKK30KKworc3RydWN0IG9jZnMyX3F1b3RhX2NodW5rIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHFjX2NodW5rOwkvKiBMaXN0IG9mIHF1b3RhZmlsZSBjaHVua3MgKi8KKwlpbnQgcWNfbnVtOwkJCS8qIE51bWJlciBvZiBxdW90YSBjaHVuayAqLworCXN0cnVjdCBidWZmZXJfaGVhZCAqcWNfaGVhZGVyYmg7CS8qIEJ1ZmZlciBoZWFkIHdpdGggY2h1bmsgaGVhZGVyICovCit9OworCitleHRlcm4gc3RydWN0IGttZW1fY2FjaGUgKm9jZnMyX2RxdW90X2NhY2hlcDsKK2V4dGVybiBzdHJ1Y3Qga21lbV9jYWNoZSAqb2NmczJfcWZfY2h1bmtfY2FjaGVwOworCitleHRlcm4gc3RydWN0IHF0cmVlX2ZtdF9vcGVyYXRpb25zIG9jZnMyX2dsb2JhbF9vcHM7CisKK3N0cnVjdCBvY2ZzMl9xdW90YV9yZWNvdmVyeSAqb2NmczJfYmVnaW5fcXVvdGFfcmVjb3ZlcnkoCisJCQkJc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsIGludCBzbG90X251bSk7CitpbnQgb2NmczJfZmluaXNoX3F1b3RhX3JlY292ZXJ5KHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiLAorCQkJCXN0cnVjdCBvY2ZzMl9xdW90YV9yZWNvdmVyeSAqcmVjLAorCQkJCWludCBzbG90X251bSk7Cit2b2lkIG9jZnMyX2ZyZWVfcXVvdGFfcmVjb3Zlcnkoc3RydWN0IG9jZnMyX3F1b3RhX3JlY292ZXJ5ICpyZWMpOworc3NpemVfdCBvY2ZzMl9xdW90YV9yZWFkKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCB0eXBlLCBjaGFyICpkYXRhLAorCQkJIHNpemVfdCBsZW4sIGxvZmZfdCBvZmYpOworc3NpemVfdCBvY2ZzMl9xdW90YV93cml0ZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgdHlwZSwKKwkJCSAgY29uc3QgY2hhciAqZGF0YSwgc2l6ZV90IGxlbiwgbG9mZl90IG9mZik7CitpbnQgb2NmczJfZ2xvYmFsX3JlYWRfaW5mbyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgdHlwZSk7CitpbnQgb2NmczJfZ2xvYmFsX3dyaXRlX2luZm8oc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHR5cGUpOworaW50IG9jZnMyX2dsb2JhbF9yZWFkX2RxdW90KHN0cnVjdCBkcXVvdCAqZHF1b3QpOworaW50IF9fb2NmczJfc3luY19kcXVvdChzdHJ1Y3QgZHF1b3QgKmRxdW90LCBpbnQgZnJlZWluZyk7CitzdGF0aWMgaW5saW5lIGludCBvY2ZzMl9zeW5jX2RxdW90KHN0cnVjdCBkcXVvdCAqZHF1b3QpCit7CisJcmV0dXJuIF9fb2NmczJfc3luY19kcXVvdChkcXVvdCwgMCk7Cit9CitzdGF0aWMgaW5saW5lIGludCBvY2ZzMl9nbG9iYWxfcmVsZWFzZV9kcXVvdChzdHJ1Y3QgZHF1b3QgKmRxdW90KQoreworCXJldHVybiBfX29jZnMyX3N5bmNfZHF1b3QoZHF1b3QsIDEpOworfQorCitpbnQgb2NmczJfbG9ja19nbG9iYWxfcWYoc3RydWN0IG9jZnMyX21lbV9kcWluZm8gKm9pbmZvLCBpbnQgZXgpOwordm9pZCBvY2ZzMl91bmxvY2tfZ2xvYmFsX3FmKHN0cnVjdCBvY2ZzMl9tZW1fZHFpbmZvICpvaW5mbywgaW50IGV4KTsKK2ludCBvY2ZzMl9yZWFkX3F1b3RhX2Jsb2NrKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHU2NCB2X2Jsb2NrLAorCQkJICAgc3RydWN0IGJ1ZmZlcl9oZWFkICoqYmgpOworCitleHRlcm4gc3RydWN0IGRxdW90X29wZXJhdGlvbnMgb2NmczJfcXVvdGFfb3BlcmF0aW9uczsKK2V4dGVybiBzdHJ1Y3QgcXVvdGFfZm9ybWF0X3R5cGUgb2NmczJfcXVvdGFfZm9ybWF0OworCitpbnQgb2NmczJfcXVvdGFfc2V0dXAodm9pZCk7Cit2b2lkIG9jZnMyX3F1b3RhX3NodXRkb3duKHZvaWQpOworCisjZW5kaWYgLyogX09DRlMyX1FVT1RBX0ggKi8KZGlmZiAtLWdpdCBhL2ZzL29jZnMyL3F1b3RhX2dsb2JhbC5jIGIvZnMvb2NmczIvcXVvdGFfZ2xvYmFsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFmZjhmMgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL29jZnMyL3F1b3RhX2dsb2JhbC5jCkBAIC0wLDAgKzEsMTAyNSBAQAorLyoKKyAqICBJbXBsZW1lbnRhdGlvbiBvZiBvcGVyYXRpb25zIG92ZXIgZ2xvYmFsIHF1b3RhIGZpbGUKKyAqLworI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9xdW90YS5oPgorI2luY2x1ZGUgPGxpbnV4L3F1b3Rhb3BzLmg+CisjaW5jbHVkZSA8bGludXgvZHFibGtfcXRyZWUuaD4KKyNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CisjaW5jbHVkZSA8bGludXgvd3JpdGViYWNrLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisKKyNkZWZpbmUgTUxPR19NQVNLX1BSRUZJWCBNTF9RVU9UQQorI2luY2x1ZGUgPGNsdXN0ZXIvbWFza2xvZy5oPgorCisjaW5jbHVkZSAib2NmczJfZnMuaCIKKyNpbmNsdWRlICJvY2ZzMi5oIgorI2luY2x1ZGUgImFsbG9jLmgiCisjaW5jbHVkZSAiYmxvY2tjaGVjay5oIgorI2luY2x1ZGUgImlub2RlLmgiCisjaW5jbHVkZSAiam91cm5hbC5oIgorI2luY2x1ZGUgImZpbGUuaCIKKyNpbmNsdWRlICJzeXNmaWxlLmgiCisjaW5jbHVkZSAiZGxtZ2x1ZS5oIgorI2luY2x1ZGUgInVwdG9kYXRlLmgiCisjaW5jbHVkZSAicXVvdGEuaCIKKworc3RhdGljIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICpvY2ZzMl9xdW90YV93cSA9IE5VTEw7CisKK3N0YXRpYyB2b2lkIHFzeW5jX3dvcmtfZm4oc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKKworc3RhdGljIHZvaWQgb2NmczJfZ2xvYmFsX2Rpc2sybWVtZHFiKHN0cnVjdCBkcXVvdCAqZHF1b3QsIHZvaWQgKmRwKQoreworCXN0cnVjdCBvY2ZzMl9nbG9iYWxfZGlza19kcWJsayAqZCA9IGRwOworCXN0cnVjdCBtZW1fZHFibGsgKm0gPSAmZHF1b3QtPmRxX2RxYjsKKworCS8qIFVwZGF0ZSBmcm9tIGRpc2sgb25seSBlbnRyaWVzIG5vdCBzZXQgYnkgdGhlIGFkbWluICovCisJaWYgKCF0ZXN0X2JpdChEUV9MQVNUU0VUX0IgKyBRSUZfSUxJTUlUU19CLCAmZHF1b3QtPmRxX2ZsYWdzKSkgeworCQltLT5kcWJfaWhhcmRsaW1pdCA9IGxlNjRfdG9fY3B1KGQtPmRxYl9paGFyZGxpbWl0KTsKKwkJbS0+ZHFiX2lzb2Z0bGltaXQgPSBsZTY0X3RvX2NwdShkLT5kcWJfaXNvZnRsaW1pdCk7CisJfQorCWlmICghdGVzdF9iaXQoRFFfTEFTVFNFVF9CICsgUUlGX0lOT0RFU19CLCAmZHF1b3QtPmRxX2ZsYWdzKSkKKwkJbS0+ZHFiX2N1cmlub2RlcyA9IGxlNjRfdG9fY3B1KGQtPmRxYl9jdXJpbm9kZXMpOworCWlmICghdGVzdF9iaXQoRFFfTEFTVFNFVF9CICsgUUlGX0JMSU1JVFNfQiwgJmRxdW90LT5kcV9mbGFncykpIHsKKwkJbS0+ZHFiX2JoYXJkbGltaXQgPSBsZTY0X3RvX2NwdShkLT5kcWJfYmhhcmRsaW1pdCk7CisJCW0tPmRxYl9ic29mdGxpbWl0ID0gbGU2NF90b19jcHUoZC0+ZHFiX2Jzb2Z0bGltaXQpOworCX0KKwlpZiAoIXRlc3RfYml0KERRX0xBU1RTRVRfQiArIFFJRl9TUEFDRV9CLCAmZHF1b3QtPmRxX2ZsYWdzKSkKKwkJbS0+ZHFiX2N1cnNwYWNlID0gbGU2NF90b19jcHUoZC0+ZHFiX2N1cnNwYWNlKTsKKwlpZiAoIXRlc3RfYml0KERRX0xBU1RTRVRfQiArIFFJRl9CVElNRV9CLCAmZHF1b3QtPmRxX2ZsYWdzKSkKKwkJbS0+ZHFiX2J0aW1lID0gbGU2NF90b19jcHUoZC0+ZHFiX2J0aW1lKTsKKwlpZiAoIXRlc3RfYml0KERRX0xBU1RTRVRfQiArIFFJRl9JVElNRV9CLCAmZHF1b3QtPmRxX2ZsYWdzKSkKKwkJbS0+ZHFiX2l0aW1lID0gbGU2NF90b19jcHUoZC0+ZHFiX2l0aW1lKTsKKwlPQ0ZTMl9EUVVPVChkcXVvdCktPmRxX3VzZV9jb3VudCA9IGxlMzJfdG9fY3B1KGQtPmRxYl91c2VfY291bnQpOworfQorCitzdGF0aWMgdm9pZCBvY2ZzMl9nbG9iYWxfbWVtMmRpc2tkcWIodm9pZCAqZHAsIHN0cnVjdCBkcXVvdCAqZHF1b3QpCit7CisJc3RydWN0IG9jZnMyX2dsb2JhbF9kaXNrX2RxYmxrICpkID0gZHA7CisJc3RydWN0IG1lbV9kcWJsayAqbSA9ICZkcXVvdC0+ZHFfZHFiOworCisJZC0+ZHFiX2lkID0gY3B1X3RvX2xlMzIoZHF1b3QtPmRxX2lkKTsKKwlkLT5kcWJfdXNlX2NvdW50ID0gY3B1X3RvX2xlMzIoT0NGUzJfRFFVT1QoZHF1b3QpLT5kcV91c2VfY291bnQpOworCWQtPmRxYl9paGFyZGxpbWl0ID0gY3B1X3RvX2xlNjQobS0+ZHFiX2loYXJkbGltaXQpOworCWQtPmRxYl9pc29mdGxpbWl0ID0gY3B1X3RvX2xlNjQobS0+ZHFiX2lzb2Z0bGltaXQpOworCWQtPmRxYl9jdXJpbm9kZXMgPSBjcHVfdG9fbGU2NChtLT5kcWJfY3VyaW5vZGVzKTsKKwlkLT5kcWJfYmhhcmRsaW1pdCA9IGNwdV90b19sZTY0KG0tPmRxYl9iaGFyZGxpbWl0KTsKKwlkLT5kcWJfYnNvZnRsaW1pdCA9IGNwdV90b19sZTY0KG0tPmRxYl9ic29mdGxpbWl0KTsKKwlkLT5kcWJfY3Vyc3BhY2UgPSBjcHVfdG9fbGU2NChtLT5kcWJfY3Vyc3BhY2UpOworCWQtPmRxYl9idGltZSA9IGNwdV90b19sZTY0KG0tPmRxYl9idGltZSk7CisJZC0+ZHFiX2l0aW1lID0gY3B1X3RvX2xlNjQobS0+ZHFiX2l0aW1lKTsKK30KKworc3RhdGljIGludCBvY2ZzMl9nbG9iYWxfaXNfaWQodm9pZCAqZHAsIHN0cnVjdCBkcXVvdCAqZHF1b3QpCit7CisJc3RydWN0IG9jZnMyX2dsb2JhbF9kaXNrX2RxYmxrICpkID0gZHA7CisJc3RydWN0IG9jZnMyX21lbV9kcWluZm8gKm9pbmZvID0KKwkJCXNiX2RxaW5mbyhkcXVvdC0+ZHFfc2IsIGRxdW90LT5kcV90eXBlKS0+ZHFpX3ByaXY7CisKKwlpZiAocXRyZWVfZW50cnlfdW51c2VkKCZvaW5mby0+ZHFpX2dpLCBkcCkpCisJCXJldHVybiAwOworCXJldHVybiBsZTMyX3RvX2NwdShkLT5kcWJfaWQpID09IGRxdW90LT5kcV9pZDsKK30KKworc3RydWN0IHF0cmVlX2ZtdF9vcGVyYXRpb25zIG9jZnMyX2dsb2JhbF9vcHMgPSB7CisJLm1lbTJkaXNrX2RxYmxrID0gb2NmczJfZ2xvYmFsX21lbTJkaXNrZHFiLAorCS5kaXNrMm1lbV9kcWJsayA9IG9jZnMyX2dsb2JhbF9kaXNrMm1lbWRxYiwKKwkuaXNfaWQgPSBvY2ZzMl9nbG9iYWxfaXNfaWQsCit9OworCitzdGF0aWMgaW50IG9jZnMyX3ZhbGlkYXRlX3F1b3RhX2Jsb2NrKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCQkJICAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKK3sKKwlzdHJ1Y3Qgb2NmczJfZGlza19kcXRyYWlsZXIgKmRxdCA9CisJCW9jZnMyX2Jsb2NrX2RxdHJhaWxlcihzYi0+c19ibG9ja3NpemUsIGJoLT5iX2RhdGEpOworCisJbWxvZygwLCAiVmFsaWRhdGluZyBxdW90YSBibG9jayAlbGx1XG4iLAorCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyliaC0+Yl9ibG9ja25yKTsKKworCUJVR19PTighYnVmZmVyX3VwdG9kYXRlKGJoKSk7CisKKwkvKgorCSAqIElmIHRoZSBlY2MgZmFpbHMsIHdlIHJldHVybiB0aGUgZXJyb3IgYnV0IG90aGVyd2lzZQorCSAqIGxlYXZlIHRoZSBmaWxlc3lzdGVtIHJ1bm5pbmcuICBXZSBrbm93IGFueSBlcnJvciBpcworCSAqIGxvY2FsIHRvIHRoaXMgYmxvY2suCisJICovCisJcmV0dXJuIG9jZnMyX3ZhbGlkYXRlX21ldGFfZWNjKHNiLCBiaC0+Yl9kYXRhLCAmZHF0LT5kcV9jaGVjayk7Cit9CisKK2ludCBvY2ZzMl9yZWFkX3F1b3RhX2Jsb2NrKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHU2NCB2X2Jsb2NrLAorCQkJICAgc3RydWN0IGJ1ZmZlcl9oZWFkICoqYmgpCit7CisJaW50IHJjID0gMDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKnRtcCA9ICpiaDsKKworCXJjID0gb2NmczJfcmVhZF92aXJ0X2Jsb2Nrcyhpbm9kZSwgdl9ibG9jaywgMSwgJnRtcCwgMCwKKwkJCQkgICAgb2NmczJfdmFsaWRhdGVfcXVvdGFfYmxvY2spOworCWlmIChyYykKKwkJbWxvZ19lcnJubyhyYyk7CisKKwkvKiBJZiBvY2ZzMl9yZWFkX3ZpcnRfYmxvY2tzKCkgZ290IHVzIGEgbmV3IGJoLCBwYXNzIGl0IHVwLiAqLworCWlmICghcmMgJiYgISpiaCkKKwkJKmJoID0gdG1wOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IG9jZnMyX2dldF9xdW90YV9ibG9jayhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgYmxvY2ssCisJCQkJIHN0cnVjdCBidWZmZXJfaGVhZCAqKmJoKQoreworCXU2NCBwYmxvY2ssIHBjb3VudDsKKwlpbnQgZXJyOworCisJZG93bl9yZWFkKCZPQ0ZTMl9JKGlub2RlKS0+aXBfYWxsb2Nfc2VtKTsKKwllcnIgPSBvY2ZzMl9leHRlbnRfbWFwX2dldF9ibG9ja3MoaW5vZGUsIGJsb2NrLCAmcGJsb2NrLCAmcGNvdW50LCBOVUxMKTsKKwl1cF9yZWFkKCZPQ0ZTMl9JKGlub2RlKS0+aXBfYWxsb2Nfc2VtKTsKKwlpZiAoZXJyKSB7CisJCW1sb2dfZXJybm8oZXJyKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJKmJoID0gc2JfZ2V0YmxrKGlub2RlLT5pX3NiLCBwYmxvY2spOworCWlmICghKmJoKSB7CisJCWVyciA9IC1FSU87CisJCW1sb2dfZXJybm8oZXJyKTsKKwl9CisJcmV0dXJuIGVycjs7Cit9CisKKy8qIFJlYWQgZGF0YSBmcm9tIGdsb2JhbCBxdW90YWZpbGUgLSBhdm9pZCBwYWdlY2FjaGUgYW5kIHN1Y2ggYmVjYXVzZSB3ZSBjYW5ub3QKKyAqIGFmZm9yZCBhY3F1aXJpbmcgdGhlIGxvY2tzLi4uIFdlIHVzZSBxdW90YSBjbHVzdGVyIGxvY2sgdG8gc2VyaWFsaXplCisgKiBvcGVyYXRpb25zLiBDYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGFjcXVpcmluZyBpdC4gKi8KK3NzaXplX3Qgb2NmczJfcXVvdGFfcmVhZChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgdHlwZSwgY2hhciAqZGF0YSwKKwkJCSBzaXplX3QgbGVuLCBsb2ZmX3Qgb2ZmKQoreworCXN0cnVjdCBvY2ZzMl9tZW1fZHFpbmZvICpvaW5mbyA9IHNiX2RxaW5mbyhzYiwgdHlwZSktPmRxaV9wcml2OworCXN0cnVjdCBpbm9kZSAqZ3Fpbm9kZSA9IG9pbmZvLT5kcWlfZ3Fpbm9kZTsKKwlsb2ZmX3QgaV9zaXplID0gaV9zaXplX3JlYWQoZ3Fpbm9kZSk7CisJaW50IG9mZnNldCA9IG9mZiAmIChzYi0+c19ibG9ja3NpemUgLSAxKTsKKwlzZWN0b3JfdCBibGsgPSBvZmYgPj4gc2ItPnNfYmxvY2tzaXplX2JpdHM7CisJaW50IGVyciA9IDA7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKwlzaXplX3QgdG9yZWFkLCB0b2NvcHk7CisKKwlpZiAob2ZmID4gaV9zaXplKQorCQlyZXR1cm4gMDsKKwlpZiAob2ZmICsgbGVuID4gaV9zaXplKQorCQlsZW4gPSBpX3NpemUgLSBvZmY7CisJdG9yZWFkID0gbGVuOworCXdoaWxlICh0b3JlYWQgPiAwKSB7CisJCXRvY29weSA9IG1pbl90KHNpemVfdCwgKHNiLT5zX2Jsb2Nrc2l6ZSAtIG9mZnNldCksIHRvcmVhZCk7CisJCWJoID0gTlVMTDsKKwkJZXJyID0gb2NmczJfcmVhZF9xdW90YV9ibG9jayhncWlub2RlLCBibGssICZiaCk7CisJCWlmIChlcnIpIHsKKwkJCW1sb2dfZXJybm8oZXJyKTsKKwkJCXJldHVybiBlcnI7CisJCX0KKwkJbWVtY3B5KGRhdGEsIGJoLT5iX2RhdGEgKyBvZmZzZXQsIHRvY29weSk7CisJCWJyZWxzZShiaCk7CisJCW9mZnNldCA9IDA7CisJCXRvcmVhZCAtPSB0b2NvcHk7CisJCWRhdGEgKz0gdG9jb3B5OworCQlibGsrKzsKKwl9CisJcmV0dXJuIGxlbjsKK30KKworLyogV3JpdGUgdG8gcXVvdGFmaWxlICh3ZSBrbm93IHRoZSB0cmFuc2FjdGlvbiBpcyBhbHJlYWR5IHN0YXJ0ZWQgYW5kIGhhcworICogZW5vdWdoIGNyZWRpdHMpICovCitzc2l6ZV90IG9jZnMyX3F1b3RhX3dyaXRlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCB0eXBlLAorCQkJICBjb25zdCBjaGFyICpkYXRhLCBzaXplX3QgbGVuLCBsb2ZmX3Qgb2ZmKQoreworCXN0cnVjdCBtZW1fZHFpbmZvICppbmZvID0gc2JfZHFpbmZvKHNiLCB0eXBlKTsKKwlzdHJ1Y3Qgb2NmczJfbWVtX2RxaW5mbyAqb2luZm8gPSBpbmZvLT5kcWlfcHJpdjsKKwlzdHJ1Y3QgaW5vZGUgKmdxaW5vZGUgPSBvaW5mby0+ZHFpX2dxaW5vZGU7CisJaW50IG9mZnNldCA9IG9mZiAmIChzYi0+c19ibG9ja3NpemUgLSAxKTsKKwlzZWN0b3JfdCBibGsgPSBvZmYgPj4gc2ItPnNfYmxvY2tzaXplX2JpdHM7CisJaW50IGVyciA9IDAsIG5ldyA9IDAsIGphX3R5cGU7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IE5VTEw7CisJaGFuZGxlX3QgKmhhbmRsZSA9IGpvdXJuYWxfY3VycmVudF9oYW5kbGUoKTsKKworCWlmICghaGFuZGxlKSB7CisJCW1sb2coTUxfRVJST1IsICJRdW90YSB3cml0ZSAob2ZmPSVsbHUsIGxlbj0lbGx1KSBjYW5jZWxsZWQgIgorCQkgICAgICJiZWNhdXNlIHRyYW5zYWN0aW9uIHdhcyBub3Qgc3RhcnRlZC5cbiIsCisJCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylvZmYsICh1bnNpZ25lZCBsb25nIGxvbmcpbGVuKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCWlmIChsZW4gPiBzYi0+c19ibG9ja3NpemUgLSBPQ0ZTMl9RQkxLX1JFU0VSVkVEX1NQQUNFIC0gb2Zmc2V0KSB7CisJCVdBUk5fT04oMSk7CisJCWxlbiA9IHNiLT5zX2Jsb2Nrc2l6ZSAtIE9DRlMyX1FCTEtfUkVTRVJWRURfU1BBQ0UgLSBvZmZzZXQ7CisJfQorCisJbXV0ZXhfbG9ja19uZXN0ZWQoJmdxaW5vZGUtPmlfbXV0ZXgsIElfTVVURVhfUVVPVEEpOworCWlmIChncWlub2RlLT5pX3NpemUgPCBvZmYgKyBsZW4pIHsKKwkJZG93bl93cml0ZSgmT0NGUzJfSShncWlub2RlKS0+aXBfYWxsb2Nfc2VtKTsKKwkJZXJyID0gb2NmczJfZXh0ZW5kX25vX2hvbGVzKGdxaW5vZGUsIG9mZiArIGxlbiwgb2ZmKTsKKwkJdXBfd3JpdGUoJk9DRlMyX0koZ3Fpbm9kZSktPmlwX2FsbG9jX3NlbSk7CisJCWlmIChlcnIgPCAwKQorCQkJZ290byBvdXQ7CisJCWVyciA9IG9jZnMyX3NpbXBsZV9zaXplX3VwZGF0ZShncWlub2RlLAorCQkJCQkgICAgICAgb2luZm8tPmRxaV9ncWlfYmgsCisJCQkJCSAgICAgICBvZmYgKyBsZW4pOworCQlpZiAoZXJyIDwgMCkKKwkJCWdvdG8gb3V0OworCQluZXcgPSAxOworCX0KKwkvKiBOb3QgcmV3cml0aW5nIHdob2xlIGJsb2NrPyAqLworCWlmICgob2Zmc2V0IHx8IGxlbiA8IHNiLT5zX2Jsb2Nrc2l6ZSAtIE9DRlMyX1FCTEtfUkVTRVJWRURfU1BBQ0UpICYmCisJICAgICFuZXcpIHsKKwkJZXJyID0gb2NmczJfcmVhZF9xdW90YV9ibG9jayhncWlub2RlLCBibGssICZiaCk7CisJCWphX3R5cGUgPSBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURTsKKwl9IGVsc2UgeworCQllcnIgPSBvY2ZzMl9nZXRfcXVvdGFfYmxvY2soZ3Fpbm9kZSwgYmxrLCAmYmgpOworCQlqYV90eXBlID0gT0NGUzJfSk9VUk5BTF9BQ0NFU1NfQ1JFQVRFOworCX0KKwlpZiAoZXJyKSB7CisJCW1sb2dfZXJybm8oZXJyKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJbG9ja19idWZmZXIoYmgpOworCWlmIChuZXcpCisJCW1lbXNldChiaC0+Yl9kYXRhLCAwLCBzYi0+c19ibG9ja3NpemUpOworCW1lbWNweShiaC0+Yl9kYXRhICsgb2Zmc2V0LCBkYXRhLCBsZW4pOworCWZsdXNoX2RjYWNoZV9wYWdlKGJoLT5iX3BhZ2UpOworCXNldF9idWZmZXJfdXB0b2RhdGUoYmgpOworCXVubG9ja19idWZmZXIoYmgpOworCW9jZnMyX3NldF9idWZmZXJfdXB0b2RhdGUoZ3Fpbm9kZSwgYmgpOworCWVyciA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzX2RxKGhhbmRsZSwgZ3Fpbm9kZSwgYmgsIGphX3R5cGUpOworCWlmIChlcnIgPCAwKSB7CisJCWJyZWxzZShiaCk7CisJCWdvdG8gb3V0OworCX0KKwllcnIgPSBvY2ZzMl9qb3VybmFsX2RpcnR5KGhhbmRsZSwgYmgpOworCWJyZWxzZShiaCk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gb3V0Oworb3V0OgorCWlmIChlcnIpIHsKKwkJbXV0ZXhfdW5sb2NrKCZncWlub2RlLT5pX211dGV4KTsKKwkJbWxvZ19lcnJubyhlcnIpOworCQlyZXR1cm4gZXJyOworCX0KKwlncWlub2RlLT5pX3ZlcnNpb24rKzsKKwlvY2ZzMl9tYXJrX2lub2RlX2RpcnR5KGhhbmRsZSwgZ3Fpbm9kZSwgb2luZm8tPmRxaV9ncWlfYmgpOworCW11dGV4X3VubG9jaygmZ3Fpbm9kZS0+aV9tdXRleCk7CisJcmV0dXJuIGxlbjsKK30KKworaW50IG9jZnMyX2xvY2tfZ2xvYmFsX3FmKHN0cnVjdCBvY2ZzMl9tZW1fZHFpbmZvICpvaW5mbywgaW50IGV4KQoreworCWludCBzdGF0dXM7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IE5VTEw7CisKKwlzdGF0dXMgPSBvY2ZzMl9pbm9kZV9sb2NrKG9pbmZvLT5kcWlfZ3Fpbm9kZSwgJmJoLCBleCk7CisJaWYgKHN0YXR1cyA8IDApCisJCXJldHVybiBzdGF0dXM7CisJc3Bpbl9sb2NrKCZkcV9kYXRhX2xvY2spOworCWlmICghb2luZm8tPmRxaV9ncWlfY291bnQrKykKKwkJb2luZm8tPmRxaV9ncWlfYmggPSBiaDsKKwllbHNlCisJCVdBUk5fT04oYmggIT0gb2luZm8tPmRxaV9ncWlfYmgpOworCXNwaW5fdW5sb2NrKCZkcV9kYXRhX2xvY2spOworCXJldHVybiAwOworfQorCit2b2lkIG9jZnMyX3VubG9ja19nbG9iYWxfcWYoc3RydWN0IG9jZnMyX21lbV9kcWluZm8gKm9pbmZvLCBpbnQgZXgpCit7CisJb2NmczJfaW5vZGVfdW5sb2NrKG9pbmZvLT5kcWlfZ3Fpbm9kZSwgZXgpOworCWJyZWxzZShvaW5mby0+ZHFpX2dxaV9iaCk7CisJc3Bpbl9sb2NrKCZkcV9kYXRhX2xvY2spOworCWlmICghLS1vaW5mby0+ZHFpX2dxaV9jb3VudCkKKwkJb2luZm8tPmRxaV9ncWlfYmggPSBOVUxMOworCXNwaW5fdW5sb2NrKCZkcV9kYXRhX2xvY2spOworfQorCisvKiBSZWFkIGluZm9ybWF0aW9uIGhlYWRlciBmcm9tIGdsb2JhbCBxdW90YSBmaWxlICovCitpbnQgb2NmczJfZ2xvYmFsX3JlYWRfaW5mbyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgdHlwZSkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmdxaW5vZGUgPSBOVUxMOworCXVuc2lnbmVkIGludCBpbm9bTUFYUVVPVEFTXSA9IHsgVVNFUl9RVU9UQV9TWVNURU1fSU5PREUsCisJCQkJCUdST1VQX1FVT1RBX1NZU1RFTV9JTk9ERSB9OworCXN0cnVjdCBvY2ZzMl9nbG9iYWxfZGlza19kcWluZm8gZGluZm87CisJc3RydWN0IG1lbV9kcWluZm8gKmluZm8gPSBzYl9kcWluZm8oc2IsIHR5cGUpOworCXN0cnVjdCBvY2ZzMl9tZW1fZHFpbmZvICpvaW5mbyA9IGluZm8tPmRxaV9wcml2OworCWludCBzdGF0dXM7CisKKwltbG9nX2VudHJ5X3ZvaWQoKTsKKworCS8qIFJlYWQgZ2xvYmFsIGhlYWRlciAqLworCWdxaW5vZGUgPSBvY2ZzMl9nZXRfc3lzdGVtX2ZpbGVfaW5vZGUoT0NGUzJfU0Ioc2IpLCBpbm9bdHlwZV0sCisJCQlPQ0ZTMl9JTlZBTElEX1NMT1QpOworCWlmICghZ3Fpbm9kZSkgeworCQltbG9nKE1MX0VSUk9SLCAiZmFpbGVkIHRvIGdldCBnbG9iYWwgcXVvdGEgaW5vZGUgKHR5cGU9JWQpXG4iLAorCQkJdHlwZSk7CisJCXN0YXR1cyA9IC1FSU5WQUw7CisJCWdvdG8gb3V0X2VycjsKKwl9CisJb2luZm8tPmRxaV9naS5kcWlfc2IgPSBzYjsKKwlvaW5mby0+ZHFpX2dpLmRxaV90eXBlID0gdHlwZTsKKwlvY2ZzMl9xaW5mb19sb2NrX3Jlc19pbml0KCZvaW5mby0+ZHFpX2dxbG9jaywgb2luZm8pOworCW9pbmZvLT5kcWlfZ2kuZHFpX2VudHJ5X3NpemUgPSBzaXplb2Yoc3RydWN0IG9jZnMyX2dsb2JhbF9kaXNrX2RxYmxrKTsKKwlvaW5mby0+ZHFpX2dpLmRxaV9vcHMgPSAmb2NmczJfZ2xvYmFsX29wczsKKwlvaW5mby0+ZHFpX2dxaV9iaCA9IE5VTEw7CisJb2luZm8tPmRxaV9ncWlfY291bnQgPSAwOworCW9pbmZvLT5kcWlfZ3Fpbm9kZSA9IGdxaW5vZGU7CisJc3RhdHVzID0gb2NmczJfbG9ja19nbG9iYWxfcWYob2luZm8sIDApOworCWlmIChzdGF0dXMgPCAwKSB7CisJCW1sb2dfZXJybm8oc3RhdHVzKTsKKwkJZ290byBvdXRfZXJyOworCX0KKwlzdGF0dXMgPSBzYi0+c19vcC0+cXVvdGFfcmVhZChzYiwgdHlwZSwgKGNoYXIgKikmZGluZm8sCisJCQkJICAgICAgc2l6ZW9mKHN0cnVjdCBvY2ZzMl9nbG9iYWxfZGlza19kcWluZm8pLAorCQkJCSAgICAgIE9DRlMyX0dMT0JBTF9JTkZPX09GRik7CisJb2NmczJfdW5sb2NrX2dsb2JhbF9xZihvaW5mbywgMCk7CisJaWYgKHN0YXR1cyAhPSBzaXplb2Yoc3RydWN0IG9jZnMyX2dsb2JhbF9kaXNrX2RxaW5mbykpIHsKKwkJbWxvZyhNTF9FUlJPUiwgIkNhbm5vdCByZWFkIGdsb2JhbCBxdW90YSBpbmZvICglZCkuXG4iLAorCQkgICAgIHN0YXR1cyk7CisJCWlmIChzdGF0dXMgPj0gMCkKKwkJCXN0YXR1cyA9IC1FSU87CisJCW1sb2dfZXJybm8oc3RhdHVzKTsKKwkJZ290byBvdXRfZXJyOworCX0KKwlpbmZvLT5kcWlfYmdyYWNlID0gbGUzMl90b19jcHUoZGluZm8uZHFpX2JncmFjZSk7CisJaW5mby0+ZHFpX2lncmFjZSA9IGxlMzJfdG9fY3B1KGRpbmZvLmRxaV9pZ3JhY2UpOworCW9pbmZvLT5kcWlfc3luY21zID0gbGUzMl90b19jcHUoZGluZm8uZHFpX3N5bmNtcyk7CisJb2luZm8tPmRxaV9zeW5jamlmZiA9IG1zZWNzX3RvX2ppZmZpZXMob2luZm8tPmRxaV9zeW5jbXMpOworCW9pbmZvLT5kcWlfZ2kuZHFpX2Jsb2NrcyA9IGxlMzJfdG9fY3B1KGRpbmZvLmRxaV9ibG9ja3MpOworCW9pbmZvLT5kcWlfZ2kuZHFpX2ZyZWVfYmxrID0gbGUzMl90b19jcHUoZGluZm8uZHFpX2ZyZWVfYmxrKTsKKwlvaW5mby0+ZHFpX2dpLmRxaV9mcmVlX2VudHJ5ID0gbGUzMl90b19jcHUoZGluZm8uZHFpX2ZyZWVfZW50cnkpOworCW9pbmZvLT5kcWlfZ2kuZHFpX2Jsb2Nrc2l6ZV9iaXRzID0gc2ItPnNfYmxvY2tzaXplX2JpdHM7CisJb2luZm8tPmRxaV9naS5kcWlfdXNhYmxlX2JzID0gc2ItPnNfYmxvY2tzaXplIC0KKwkJCQkJCU9DRlMyX1FCTEtfUkVTRVJWRURfU1BBQ0U7CisJb2luZm8tPmRxaV9naS5kcWlfcXRyZWVfZGVwdGggPSBxdHJlZV9kZXB0aCgmb2luZm8tPmRxaV9naSk7CisJSU5JVF9ERUxBWUVEX1dPUksoJm9pbmZvLT5kcWlfc3luY193b3JrLCBxc3luY193b3JrX2ZuKTsKKwlxdWV1ZV9kZWxheWVkX3dvcmsob2NmczJfcXVvdGFfd3EsICZvaW5mby0+ZHFpX3N5bmNfd29yaywKKwkJCSAgIG9pbmZvLT5kcWlfc3luY2ppZmYpOworCitvdXRfZXJyOgorCW1sb2dfZXhpdChzdGF0dXMpOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qIFdyaXRlIGluZm9ybWF0aW9uIHRvIGdsb2JhbCBxdW90YSBmaWxlLiBFeHBlY3RzIGV4bHVzaXZlIGxvY2sgb24gcXVvdGEKKyAqIGZpbGUgaW5vZGUgYW5kIHF1b3RhIGluZm8gKi8KK3N0YXRpYyBpbnQgX19vY2ZzMl9nbG9iYWxfd3JpdGVfaW5mbyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgdHlwZSkKK3sKKwlzdHJ1Y3QgbWVtX2RxaW5mbyAqaW5mbyA9IHNiX2RxaW5mbyhzYiwgdHlwZSk7CisJc3RydWN0IG9jZnMyX21lbV9kcWluZm8gKm9pbmZvID0gaW5mby0+ZHFpX3ByaXY7CisJc3RydWN0IG9jZnMyX2dsb2JhbF9kaXNrX2RxaW5mbyBkaW5mbzsKKwlzc2l6ZV90IHNpemU7CisKKwlzcGluX2xvY2soJmRxX2RhdGFfbG9jayk7CisJaW5mby0+ZHFpX2ZsYWdzICY9IH5EUUZfSU5GT19ESVJUWTsKKwlkaW5mby5kcWlfYmdyYWNlID0gY3B1X3RvX2xlMzIoaW5mby0+ZHFpX2JncmFjZSk7CisJZGluZm8uZHFpX2lncmFjZSA9IGNwdV90b19sZTMyKGluZm8tPmRxaV9pZ3JhY2UpOworCXNwaW5fdW5sb2NrKCZkcV9kYXRhX2xvY2spOworCWRpbmZvLmRxaV9zeW5jbXMgPSBjcHVfdG9fbGUzMihvaW5mby0+ZHFpX3N5bmNtcyk7CisJZGluZm8uZHFpX2Jsb2NrcyA9IGNwdV90b19sZTMyKG9pbmZvLT5kcWlfZ2kuZHFpX2Jsb2Nrcyk7CisJZGluZm8uZHFpX2ZyZWVfYmxrID0gY3B1X3RvX2xlMzIob2luZm8tPmRxaV9naS5kcWlfZnJlZV9ibGspOworCWRpbmZvLmRxaV9mcmVlX2VudHJ5ID0gY3B1X3RvX2xlMzIob2luZm8tPmRxaV9naS5kcWlfZnJlZV9lbnRyeSk7CisJc2l6ZSA9IHNiLT5zX29wLT5xdW90YV93cml0ZShzYiwgdHlwZSwgKGNoYXIgKikmZGluZm8sCisJCQkJICAgICBzaXplb2Yoc3RydWN0IG9jZnMyX2dsb2JhbF9kaXNrX2RxaW5mbyksCisJCQkJICAgICBPQ0ZTMl9HTE9CQUxfSU5GT19PRkYpOworCWlmIChzaXplICE9IHNpemVvZihzdHJ1Y3Qgb2NmczJfZ2xvYmFsX2Rpc2tfZHFpbmZvKSkgeworCQltbG9nKE1MX0VSUk9SLCAiQ2Fubm90IHdyaXRlIGdsb2JhbCBxdW90YSBpbmZvIHN0cnVjdHVyZVxuIik7CisJCWlmIChzaXplID49IDApCisJCQlzaXplID0gLUVJTzsKKwkJcmV0dXJuIHNpemU7CisJfQorCXJldHVybiAwOworfQorCitpbnQgb2NmczJfZ2xvYmFsX3dyaXRlX2luZm8oc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHR5cGUpCit7CisJaW50IGVycjsKKwlzdHJ1Y3Qgb2NmczJfbWVtX2RxaW5mbyAqaW5mbyA9IHNiX2RxaW5mbyhzYiwgdHlwZSktPmRxaV9wcml2OworCisJZXJyID0gb2NmczJfcWluZm9fbG9jayhpbmZvLCAxKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKwllcnIgPSBfX29jZnMyX2dsb2JhbF93cml0ZV9pbmZvKHNiLCB0eXBlKTsKKwlvY2ZzMl9xaW5mb191bmxvY2soaW5mbywgMSk7CisJcmV0dXJuIGVycjsKK30KKworLyogUmVhZCBpbiBpbmZvcm1hdGlvbiBmcm9tIGdsb2JhbCBxdW90YSBmaWxlIGFuZCBhY3F1aXJlIGEgcmVmZXJlbmNlIHRvIGl0LgorICogZHF1b3RfYWNxdWlyZSgpIGhhcyBhbHJlYWR5IHN0YXJ0ZWQgdGhlIHRyYW5zYWN0aW9uIGFuZCBsb2NrZWQgcXVvdGEgZmlsZSAqLworaW50IG9jZnMyX2dsb2JhbF9yZWFkX2RxdW90KHN0cnVjdCBkcXVvdCAqZHF1b3QpCit7CisJaW50IGVyciwgZXJyMiwgZXggPSAwOworCXN0cnVjdCBvY2ZzMl9tZW1fZHFpbmZvICppbmZvID0KKwkJCXNiX2RxaW5mbyhkcXVvdC0+ZHFfc2IsIGRxdW90LT5kcV90eXBlKS0+ZHFpX3ByaXY7CisKKwllcnIgPSBvY2ZzMl9xaW5mb19sb2NrKGluZm8sIDApOworCWlmIChlcnIgPCAwKQorCQlnb3RvIG91dDsKKwllcnIgPSBxdHJlZV9yZWFkX2RxdW90KCZpbmZvLT5kcWlfZ2ksIGRxdW90KTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBvdXRfcWxvY2s7CisJT0NGUzJfRFFVT1QoZHF1b3QpLT5kcV91c2VfY291bnQrKzsKKwlPQ0ZTMl9EUVVPVChkcXVvdCktPmRxX29yaWdzcGFjZSA9IGRxdW90LT5kcV9kcWIuZHFiX2N1cnNwYWNlOworCU9DRlMyX0RRVU9UKGRxdW90KS0+ZHFfb3JpZ2lub2RlcyA9IGRxdW90LT5kcV9kcWIuZHFiX2N1cmlub2RlczsKKwlpZiAoIWRxdW90LT5kcV9vZmYpIHsJLyogTm8gcmVhbCBxdW90YSBlbnRyeT8gKi8KKwkJLyogVXBncmFkZSB0byBleGNsdXNpdmUgbG9jayBmb3IgYWxsb2NhdGlvbiAqLworCQllcnIgPSBvY2ZzMl9xaW5mb19sb2NrKGluZm8sIDEpOworCQlpZiAoZXJyIDwgMCkKKwkJCWdvdG8gb3V0X3Fsb2NrOworCQlleCA9IDE7CisJfQorCWVyciA9IHF0cmVlX3dyaXRlX2RxdW90KCZpbmZvLT5kcWlfZ2ksIGRxdW90KTsKKwlpZiAoZXggJiYgaW5mb19kaXJ0eShzYl9kcWluZm8oZHF1b3QtPmRxX3NiLCBkcXVvdC0+ZHFfdHlwZSkpKSB7CisJCWVycjIgPSBfX29jZnMyX2dsb2JhbF93cml0ZV9pbmZvKGRxdW90LT5kcV9zYiwgZHF1b3QtPmRxX3R5cGUpOworCQlpZiAoIWVycikKKwkJCWVyciA9IGVycjI7CisJfQorb3V0X3Fsb2NrOgorCWlmIChleCkKKwkJb2NmczJfcWluZm9fdW5sb2NrKGluZm8sIDEpOworCW9jZnMyX3FpbmZvX3VubG9jayhpbmZvLCAwKTsKK291dDoKKwlpZiAoZXJyIDwgMCkKKwkJbWxvZ19lcnJubyhlcnIpOworCXJldHVybiBlcnI7Cit9CisKKy8qIFN5bmMgbG9jYWwgaW5mb3JtYXRpb24gYWJvdXQgcXVvdGEgbW9kaWZpY2F0aW9ucyB3aXRoIGdsb2JhbCBxdW90YSBmaWxlLgorICogQ2FsbGVyIG11c3QgaGF2ZSBzdGFydGVkIHRoZSB0cmFuc2FjdGlvbiBhbmQgb2J0YWluZWQgZXhjbHVzaXZlIGxvY2sgZm9yCisgKiBnbG9iYWwgcXVvdGEgZmlsZSBpbm9kZSAqLworaW50IF9fb2NmczJfc3luY19kcXVvdChzdHJ1Y3QgZHF1b3QgKmRxdW90LCBpbnQgZnJlZWluZykKK3sKKwlpbnQgZXJyLCBlcnIyOworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBkcXVvdC0+ZHFfc2I7CisJaW50IHR5cGUgPSBkcXVvdC0+ZHFfdHlwZTsKKwlzdHJ1Y3Qgb2NmczJfbWVtX2RxaW5mbyAqaW5mbyA9IHNiX2RxaW5mbyhzYiwgdHlwZSktPmRxaV9wcml2OworCXN0cnVjdCBvY2ZzMl9nbG9iYWxfZGlza19kcWJsayBkcWJsazsKKwlzNjQgc3BhY2VjaGFuZ2UsIGlub2RlY2hhbmdlOworCXRpbWVfdCBvbGRpdGltZSwgb2xkYnRpbWU7CisKKwllcnIgPSBzYi0+c19vcC0+cXVvdGFfcmVhZChzYiwgdHlwZSwgKGNoYXIgKikmZHFibGssCisJCQkJICAgc2l6ZW9mKHN0cnVjdCBvY2ZzMl9nbG9iYWxfZGlza19kcWJsayksCisJCQkJICAgZHF1b3QtPmRxX29mZik7CisJaWYgKGVyciAhPSBzaXplb2Yoc3RydWN0IG9jZnMyX2dsb2JhbF9kaXNrX2RxYmxrKSkgeworCQlpZiAoZXJyID49IDApIHsKKwkJCW1sb2coTUxfRVJST1IsICJTaG9ydCByZWFkIGZyb20gZ2xvYmFsIHF1b3RhIGZpbGUgIgorCQkJCSAgICAgICAiKCV1IHJlYWQpXG4iLCBlcnIpOworCQkJZXJyID0gLUVJTzsKKwkJfQorCQlnb3RvIG91dDsKKwl9CisKKwkvKiBVcGRhdGUgc3BhY2UgYW5kIGlub2RlIHVzYWdlLiBHZXQgYWxzbyBvdGhlciBpbmZvcm1hdGlvbiBmcm9tCisJICogZ2xvYmFsIHF1b3RhIGZpbGUgc28gdGhhdCB3ZSBkb24ndCBvdmVyd3JpdGUgYW55IGNoYW5nZXMgdGhlcmUuCisJICogV2UgYXJlICovCisJc3Bpbl9sb2NrKCZkcV9kYXRhX2xvY2spOworCXNwYWNlY2hhbmdlID0gZHF1b3QtPmRxX2RxYi5kcWJfY3Vyc3BhY2UgLQorCQkJCQlPQ0ZTMl9EUVVPVChkcXVvdCktPmRxX29yaWdzcGFjZTsKKwlpbm9kZWNoYW5nZSA9IGRxdW90LT5kcV9kcWIuZHFiX2N1cmlub2RlcyAtCisJCQkJCU9DRlMyX0RRVU9UKGRxdW90KS0+ZHFfb3JpZ2lub2RlczsKKwlvbGRpdGltZSA9IGRxdW90LT5kcV9kcWIuZHFiX2l0aW1lOworCW9sZGJ0aW1lID0gZHF1b3QtPmRxX2RxYi5kcWJfYnRpbWU7CisJb2NmczJfZ2xvYmFsX2Rpc2sybWVtZHFiKGRxdW90LCAmZHFibGspOworCW1sb2coMCwgIlN5bmNpbmcgZ2xvYmFsIGRxdW90ICV1IHNwYWNlICVsbGQrJWxsZCwgaW5vZGVzICVsbGQrJWxsZFxuIiwKKwkgICAgIGRxdW90LT5kcV9pZCwgZHF1b3QtPmRxX2RxYi5kcWJfY3Vyc3BhY2UsIChsb25nIGxvbmcpc3BhY2VjaGFuZ2UsCisJICAgICBkcXVvdC0+ZHFfZHFiLmRxYl9jdXJpbm9kZXMsIChsb25nIGxvbmcpaW5vZGVjaGFuZ2UpOworCWlmICghdGVzdF9iaXQoRFFfTEFTVFNFVF9CICsgUUlGX1NQQUNFX0IsICZkcXVvdC0+ZHFfZmxhZ3MpKQorCQlkcXVvdC0+ZHFfZHFiLmRxYl9jdXJzcGFjZSArPSBzcGFjZWNoYW5nZTsKKwlpZiAoIXRlc3RfYml0KERRX0xBU1RTRVRfQiArIFFJRl9JTk9ERVNfQiwgJmRxdW90LT5kcV9mbGFncykpCisJCWRxdW90LT5kcV9kcWIuZHFiX2N1cmlub2RlcyArPSBpbm9kZWNoYW5nZTsKKwkvKiBTZXQgcHJvcGVybHkgc3BhY2UgZ3JhY2UgdGltZS4uLiAqLworCWlmIChkcXVvdC0+ZHFfZHFiLmRxYl9ic29mdGxpbWl0ICYmCisJICAgIGRxdW90LT5kcV9kcWIuZHFiX2N1cnNwYWNlID4gZHF1b3QtPmRxX2RxYi5kcWJfYnNvZnRsaW1pdCkgeworCQlpZiAoIXRlc3RfYml0KERRX0xBU1RTRVRfQiArIFFJRl9CVElNRV9CLCAmZHF1b3QtPmRxX2ZsYWdzKSAmJgorCQkgICAgb2xkYnRpbWUgPiAwKSB7CisJCQlpZiAoZHF1b3QtPmRxX2RxYi5kcWJfYnRpbWUgPiAwKQorCQkJCWRxdW90LT5kcV9kcWIuZHFiX2J0aW1lID0KKwkJCQkJbWluKGRxdW90LT5kcV9kcWIuZHFiX2J0aW1lLCBvbGRidGltZSk7CisJCQllbHNlCisJCQkJZHF1b3QtPmRxX2RxYi5kcWJfYnRpbWUgPSBvbGRidGltZTsKKwkJfQorCX0gZWxzZSB7CisJCWRxdW90LT5kcV9kcWIuZHFiX2J0aW1lID0gMDsKKwkJY2xlYXJfYml0KERRX0JMS1NfQiwgJmRxdW90LT5kcV9mbGFncyk7CisJfQorCS8qIFNldCBwcm9wZXJseSBpbm9kZSBncmFjZSB0aW1lLi4uICovCisJaWYgKGRxdW90LT5kcV9kcWIuZHFiX2lzb2Z0bGltaXQgJiYKKwkgICAgZHF1b3QtPmRxX2RxYi5kcWJfY3VyaW5vZGVzID4gZHF1b3QtPmRxX2RxYi5kcWJfaXNvZnRsaW1pdCkgeworCQlpZiAoIXRlc3RfYml0KERRX0xBU1RTRVRfQiArIFFJRl9JVElNRV9CLCAmZHF1b3QtPmRxX2ZsYWdzKSAmJgorCQkgICAgb2xkaXRpbWUgPiAwKSB7CisJCQlpZiAoZHF1b3QtPmRxX2RxYi5kcWJfaXRpbWUgPiAwKQorCQkJCWRxdW90LT5kcV9kcWIuZHFiX2l0aW1lID0KKwkJCQkJbWluKGRxdW90LT5kcV9kcWIuZHFiX2l0aW1lLCBvbGRpdGltZSk7CisJCQllbHNlCisJCQkJZHF1b3QtPmRxX2RxYi5kcWJfaXRpbWUgPSBvbGRpdGltZTsKKwkJfQorCX0gZWxzZSB7CisJCWRxdW90LT5kcV9kcWIuZHFiX2l0aW1lID0gMDsKKwkJY2xlYXJfYml0KERRX0lOT0RFU19CLCAmZHF1b3QtPmRxX2ZsYWdzKTsKKwl9CisJLyogQWxsIGluZm9ybWF0aW9uIGlzIHByb3Blcmx5IHVwZGF0ZWQsIGNsZWFyIHRoZSBmbGFncyAqLworCV9fY2xlYXJfYml0KERRX0xBU1RTRVRfQiArIFFJRl9TUEFDRV9CLCAmZHF1b3QtPmRxX2ZsYWdzKTsKKwlfX2NsZWFyX2JpdChEUV9MQVNUU0VUX0IgKyBRSUZfSU5PREVTX0IsICZkcXVvdC0+ZHFfZmxhZ3MpOworCV9fY2xlYXJfYml0KERRX0xBU1RTRVRfQiArIFFJRl9CTElNSVRTX0IsICZkcXVvdC0+ZHFfZmxhZ3MpOworCV9fY2xlYXJfYml0KERRX0xBU1RTRVRfQiArIFFJRl9JTElNSVRTX0IsICZkcXVvdC0+ZHFfZmxhZ3MpOworCV9fY2xlYXJfYml0KERRX0xBU1RTRVRfQiArIFFJRl9CVElNRV9CLCAmZHF1b3QtPmRxX2ZsYWdzKTsKKwlfX2NsZWFyX2JpdChEUV9MQVNUU0VUX0IgKyBRSUZfSVRJTUVfQiwgJmRxdW90LT5kcV9mbGFncyk7CisJT0NGUzJfRFFVT1QoZHF1b3QpLT5kcV9vcmlnc3BhY2UgPSBkcXVvdC0+ZHFfZHFiLmRxYl9jdXJzcGFjZTsKKwlPQ0ZTMl9EUVVPVChkcXVvdCktPmRxX29yaWdpbm9kZXMgPSBkcXVvdC0+ZHFfZHFiLmRxYl9jdXJpbm9kZXM7CisJc3Bpbl91bmxvY2soJmRxX2RhdGFfbG9jayk7CisJZXJyID0gb2NmczJfcWluZm9fbG9jayhpbmZvLCBmcmVlaW5nKTsKKwlpZiAoZXJyIDwgMCkgeworCQltbG9nKE1MX0VSUk9SLCAiRmFpbGVkIHRvIGxvY2sgcXVvdGEgaW5mbywgbG9vc2luZyBxdW90YSB3cml0ZSIKKwkJCSAgICAgICAiICh0eXBlPSVkLCBpZD0ldSlcbiIsIGRxdW90LT5kcV90eXBlLAorCQkJICAgICAgICh1bnNpZ25lZClkcXVvdC0+ZHFfaWQpOworCQlnb3RvIG91dDsKKwl9CisJaWYgKGZyZWVpbmcpCisJCU9DRlMyX0RRVU9UKGRxdW90KS0+ZHFfdXNlX2NvdW50LS07CisJZXJyID0gcXRyZWVfd3JpdGVfZHF1b3QoJmluZm8tPmRxaV9naSwgZHF1b3QpOworCWlmIChlcnIgPCAwKQorCQlnb3RvIG91dF9xbG9jazsKKwlpZiAoZnJlZWluZyAmJiAhT0NGUzJfRFFVT1QoZHF1b3QpLT5kcV91c2VfY291bnQpIHsKKwkJZXJyID0gcXRyZWVfcmVsZWFzZV9kcXVvdCgmaW5mby0+ZHFpX2dpLCBkcXVvdCk7CisJCWlmIChpbmZvX2RpcnR5KHNiX2RxaW5mbyhzYiwgdHlwZSkpKSB7CisJCQllcnIyID0gX19vY2ZzMl9nbG9iYWxfd3JpdGVfaW5mbyhzYiwgdHlwZSk7CisJCQlpZiAoIWVycikKKwkJCQllcnIgPSBlcnIyOworCQl9CisJfQorb3V0X3Fsb2NrOgorCW9jZnMyX3FpbmZvX3VubG9jayhpbmZvLCBmcmVlaW5nKTsKK291dDoKKwlpZiAoZXJyIDwgMCkKKwkJbWxvZ19lcnJubyhlcnIpOworCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiAgRnVuY3Rpb25zIGZvciBwZXJpb2RpYyBzeW5jaW5nIG9mIGRxdW90cyB3aXRoIGdsb2JhbCBmaWxlCisgKi8KK3N0YXRpYyBpbnQgb2NmczJfc3luY19kcXVvdF9oZWxwZXIoc3RydWN0IGRxdW90ICpkcXVvdCwgdW5zaWduZWQgbG9uZyB0eXBlKQoreworCWhhbmRsZV90ICpoYW5kbGU7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGRxdW90LT5kcV9zYjsKKwlzdHJ1Y3Qgb2NmczJfbWVtX2RxaW5mbyAqb2luZm8gPSBzYl9kcWluZm8oc2IsIHR5cGUpLT5kcWlfcHJpdjsKKwlzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiA9IE9DRlMyX1NCKHNiKTsKKwlpbnQgc3RhdHVzID0gMDsKKworCW1sb2dfZW50cnkoImlkPSV1IHF0eXBlPSV1IHR5cGU9JWx1IGRldmljZT0lc1xuIiwgZHF1b3QtPmRxX2lkLAorCQkgICBkcXVvdC0+ZHFfdHlwZSwgdHlwZSwgc2ItPnNfaWQpOworCWlmICh0eXBlICE9IGRxdW90LT5kcV90eXBlKQorCQlnb3RvIG91dDsKKwlzdGF0dXMgPSBvY2ZzMl9sb2NrX2dsb2JhbF9xZihvaW5mbywgMSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gb3V0OworCisJaGFuZGxlID0gb2NmczJfc3RhcnRfdHJhbnMob3NiLCBPQ0ZTMl9RU1lOQ19DUkVESVRTKTsKKwlpZiAoSVNfRVJSKGhhbmRsZSkpIHsKKwkJc3RhdHVzID0gUFRSX0VSUihoYW5kbGUpOworCQltbG9nX2Vycm5vKHN0YXR1cyk7CisJCWdvdG8gb3V0X2lsb2NrOworCX0KKwltdXRleF9sb2NrKCZzYl9kcW9wdChzYiktPmRxaW9fbXV0ZXgpOworCXN0YXR1cyA9IG9jZnMyX3N5bmNfZHF1b3QoZHF1b3QpOworCW11dGV4X3VubG9jaygmc2JfZHFvcHQoc2IpLT5kcWlvX211dGV4KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJbWxvZ19lcnJubyhzdGF0dXMpOworCS8qIFdlIGhhdmUgdG8gd3JpdGUgbG9jYWwgc3RydWN0dXJlIGFzIHdlbGwuLi4gKi8KKwlkcXVvdF9tYXJrX2RxdW90X2RpcnR5KGRxdW90KTsKKwlzdGF0dXMgPSBkcXVvdF9jb21taXQoZHF1b3QpOworCWlmIChzdGF0dXMgPCAwKQorCQltbG9nX2Vycm5vKHN0YXR1cyk7CisJb2NmczJfY29tbWl0X3RyYW5zKG9zYiwgaGFuZGxlKTsKK291dF9pbG9jazoKKwlvY2ZzMl91bmxvY2tfZ2xvYmFsX3FmKG9pbmZvLCAxKTsKK291dDoKKwltbG9nX2V4aXQoc3RhdHVzKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgdm9pZCBxc3luY193b3JrX2ZuKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3Qgb2NmczJfbWVtX2RxaW5mbyAqb2luZm8gPSBjb250YWluZXJfb2Yod29yaywKKwkJCQkJCSAgICAgIHN0cnVjdCBvY2ZzMl9tZW1fZHFpbmZvLAorCQkJCQkJICAgICAgZHFpX3N5bmNfd29yay53b3JrKTsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gb2luZm8tPmRxaV9ncWlub2RlLT5pX3NiOworCisJZHF1b3Rfc2Nhbl9hY3RpdmUoc2IsIG9jZnMyX3N5bmNfZHF1b3RfaGVscGVyLCBvaW5mby0+ZHFpX3R5cGUpOworCXF1ZXVlX2RlbGF5ZWRfd29yayhvY2ZzMl9xdW90YV93cSwgJm9pbmZvLT5kcWlfc3luY193b3JrLAorCQkJICAgb2luZm8tPmRxaV9zeW5jamlmZik7Cit9CisKKy8qCisgKiAgV3JhcHBlcnMgZm9yIGdlbmVyaWMgcXVvdGEgZnVuY3Rpb25zCisgKi8KKworc3RhdGljIGludCBvY2ZzMl93cml0ZV9kcXVvdChzdHJ1Y3QgZHF1b3QgKmRxdW90KQoreworCWhhbmRsZV90ICpoYW5kbGU7CisJc3RydWN0IG9jZnMyX3N1cGVyICpvc2IgPSBPQ0ZTMl9TQihkcXVvdC0+ZHFfc2IpOworCWludCBzdGF0dXMgPSAwOworCisJbWxvZ19lbnRyeSgiaWQ9JXUsIHR5cGU9JWQiLCBkcXVvdC0+ZHFfaWQsIGRxdW90LT5kcV90eXBlKTsKKworCWhhbmRsZSA9IG9jZnMyX3N0YXJ0X3RyYW5zKG9zYiwgT0NGUzJfUVdSSVRFX0NSRURJVFMpOworCWlmIChJU19FUlIoaGFuZGxlKSkgeworCQlzdGF0dXMgPSBQVFJfRVJSKGhhbmRsZSk7CisJCW1sb2dfZXJybm8oc3RhdHVzKTsKKwkJZ290byBvdXQ7CisJfQorCXN0YXR1cyA9IGRxdW90X2NvbW1pdChkcXVvdCk7CisJb2NmczJfY29tbWl0X3RyYW5zKG9zYiwgaGFuZGxlKTsKK291dDoKKwltbG9nX2V4aXQoc3RhdHVzKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitpbnQgb2NmczJfY2FsY19xZGVsX2NyZWRpdHMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHR5cGUpCit7CisJc3RydWN0IG9jZnMyX21lbV9kcWluZm8gKm9pbmZvOworCWludCBmZWF0dXJlc1tNQVhRVU9UQVNdID0geyBPQ0ZTMl9GRUFUVVJFX1JPX0NPTVBBVF9VU1JRVU9UQSwKKwkJCQkgICAgT0NGUzJfRkVBVFVSRV9ST19DT01QQVRfR1JQUVVPVEEgfTsKKworCWlmICghT0NGUzJfSEFTX1JPX0NPTVBBVF9GRUFUVVJFKHNiLCBmZWF0dXJlc1t0eXBlXSkpCisJCXJldHVybiAwOworCisJb2luZm8gPSBzYl9kcWluZm8oc2IsIHR5cGUpLT5kcWlfcHJpdjsKKwkvKiBXZSBtb2RpZnkgdHJlZSwgbGVhZiBibG9jaywgZ2xvYmFsIGluZm8sIGxvY2FsIGNodW5rIGhlYWRlciwKKwkgKiBnbG9iYWwgYW5kIGxvY2FsIGlub2RlICovCisJcmV0dXJuIG9pbmZvLT5kcWlfZ2kuZHFpX3F0cmVlX2RlcHRoICsgMiArIDEgKworCSAgICAgICAyICogT0NGUzJfSU5PREVfVVBEQVRFX0NSRURJVFM7Cit9CisKK3N0YXRpYyBpbnQgb2NmczJfcmVsZWFzZV9kcXVvdChzdHJ1Y3QgZHF1b3QgKmRxdW90KQoreworCWhhbmRsZV90ICpoYW5kbGU7CisJc3RydWN0IG9jZnMyX21lbV9kcWluZm8gKm9pbmZvID0KKwkJCXNiX2RxaW5mbyhkcXVvdC0+ZHFfc2IsIGRxdW90LT5kcV90eXBlKS0+ZHFpX3ByaXY7CisJc3RydWN0IG9jZnMyX3N1cGVyICpvc2IgPSBPQ0ZTMl9TQihkcXVvdC0+ZHFfc2IpOworCWludCBzdGF0dXMgPSAwOworCisJbWxvZ19lbnRyeSgiaWQ9JXUsIHR5cGU9JWQiLCBkcXVvdC0+ZHFfaWQsIGRxdW90LT5kcV90eXBlKTsKKworCXN0YXR1cyA9IG9jZnMyX2xvY2tfZ2xvYmFsX3FmKG9pbmZvLCAxKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBvdXQ7CisJaGFuZGxlID0gb2NmczJfc3RhcnRfdHJhbnMob3NiLAorCQlvY2ZzMl9jYWxjX3FkZWxfY3JlZGl0cyhkcXVvdC0+ZHFfc2IsIGRxdW90LT5kcV90eXBlKSk7CisJaWYgKElTX0VSUihoYW5kbGUpKSB7CisJCXN0YXR1cyA9IFBUUl9FUlIoaGFuZGxlKTsKKwkJbWxvZ19lcnJubyhzdGF0dXMpOworCQlnb3RvIG91dF9pbG9jazsKKwl9CisJc3RhdHVzID0gZHF1b3RfcmVsZWFzZShkcXVvdCk7CisJb2NmczJfY29tbWl0X3RyYW5zKG9zYiwgaGFuZGxlKTsKK291dF9pbG9jazoKKwlvY2ZzMl91bmxvY2tfZ2xvYmFsX3FmKG9pbmZvLCAxKTsKK291dDoKKwltbG9nX2V4aXQoc3RhdHVzKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitpbnQgb2NmczJfY2FsY19xaW5pdF9jcmVkaXRzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCB0eXBlKQoreworCXN0cnVjdCBvY2ZzMl9tZW1fZHFpbmZvICpvaW5mbzsKKwlpbnQgZmVhdHVyZXNbTUFYUVVPVEFTXSA9IHsgT0NGUzJfRkVBVFVSRV9ST19DT01QQVRfVVNSUVVPVEEsCisJCQkJICAgIE9DRlMyX0ZFQVRVUkVfUk9fQ09NUEFUX0dSUFFVT1RBIH07CisJc3RydWN0IG9jZnMyX2Rpbm9kZSAqbGZlLCAqZ2ZlOworCisJaWYgKCFPQ0ZTMl9IQVNfUk9fQ09NUEFUX0ZFQVRVUkUoc2IsIGZlYXR1cmVzW3R5cGVdKSkKKwkJcmV0dXJuIDA7CisKKwlvaW5mbyA9IHNiX2RxaW5mbyhzYiwgdHlwZSktPmRxaV9wcml2OworCWdmZSA9IChzdHJ1Y3Qgb2NmczJfZGlub2RlICopb2luZm8tPmRxaV9ncWlfYmgtPmJfZGF0YTsKKwlsZmUgPSAoc3RydWN0IG9jZnMyX2Rpbm9kZSAqKW9pbmZvLT5kcWlfbHFpX2JoLT5iX2RhdGE7CisJLyogV2UgY2FuIGV4dGVuZCBsb2NhbCBmaWxlICsgZ2xvYmFsIGZpbGUuIEluIGxvY2FsIGZpbGUgd2UKKwkgKiBjYW4gbW9kaWZ5IGluZm8sIGNodW5rIGhlYWRlciBibG9jayBhbmQgZHF1b3QgYmxvY2suIEluCisJICogZ2xvYmFsIGZpbGUgd2UgY2FuIG1vZGlmeSBpbmZvLCB0cmVlIGFuZCBsZWFmIGJsb2NrICovCisJcmV0dXJuIG9jZnMyX2NhbGNfZXh0ZW5kX2NyZWRpdHMoc2IsICZsZmUtPmlkMi5pX2xpc3QsIDApICsKKwkgICAgICAgb2NmczJfY2FsY19leHRlbmRfY3JlZGl0cyhzYiwgJmdmZS0+aWQyLmlfbGlzdCwgMCkgKworCSAgICAgICAzICsgb2luZm8tPmRxaV9naS5kcWlfcXRyZWVfZGVwdGggKyAyOworfQorCitzdGF0aWMgaW50IG9jZnMyX2FjcXVpcmVfZHF1b3Qoc3RydWN0IGRxdW90ICpkcXVvdCkKK3sKKwloYW5kbGVfdCAqaGFuZGxlOworCXN0cnVjdCBvY2ZzMl9tZW1fZHFpbmZvICpvaW5mbyA9CisJCQlzYl9kcWluZm8oZHF1b3QtPmRxX3NiLCBkcXVvdC0+ZHFfdHlwZSktPmRxaV9wcml2OworCXN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiID0gT0NGUzJfU0IoZHF1b3QtPmRxX3NiKTsKKwlpbnQgc3RhdHVzID0gMDsKKworCW1sb2dfZW50cnkoImlkPSV1LCB0eXBlPSVkIiwgZHF1b3QtPmRxX2lkLCBkcXVvdC0+ZHFfdHlwZSk7CisJLyogV2UgbmVlZCBhbiBleGNsdXNpdmUgbG9jaywgYmVjYXVzZSB3ZSdyZSBnb2luZyB0byB1cGRhdGUgdXNlIGNvdW50CisJICogYW5kIGluc3RhbnRpYXRlIHBvc3NpYmx5IG5ldyBkcXVvdCBzdHJ1Y3R1cmUgKi8KKwlzdGF0dXMgPSBvY2ZzMl9sb2NrX2dsb2JhbF9xZihvaW5mbywgMSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gb3V0OworCWhhbmRsZSA9IG9jZnMyX3N0YXJ0X3RyYW5zKG9zYiwKKwkJb2NmczJfY2FsY19xaW5pdF9jcmVkaXRzKGRxdW90LT5kcV9zYiwgZHF1b3QtPmRxX3R5cGUpKTsKKwlpZiAoSVNfRVJSKGhhbmRsZSkpIHsKKwkJc3RhdHVzID0gUFRSX0VSUihoYW5kbGUpOworCQltbG9nX2Vycm5vKHN0YXR1cyk7CisJCWdvdG8gb3V0X2lsb2NrOworCX0KKwlzdGF0dXMgPSBkcXVvdF9hY3F1aXJlKGRxdW90KTsKKwlvY2ZzMl9jb21taXRfdHJhbnMob3NiLCBoYW5kbGUpOworb3V0X2lsb2NrOgorCW9jZnMyX3VubG9ja19nbG9iYWxfcWYob2luZm8sIDEpOworb3V0OgorCW1sb2dfZXhpdChzdGF0dXMpOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgb2NmczJfbWFya19kcXVvdF9kaXJ0eShzdHJ1Y3QgZHF1b3QgKmRxdW90KQoreworCXVuc2lnbmVkIGxvbmcgbWFzayA9ICgxIDw8IChEUV9MQVNUU0VUX0IgKyBRSUZfSUxJTUlUU19CKSkgfAorCQkJICAgICAoMSA8PCAoRFFfTEFTVFNFVF9CICsgUUlGX0JMSU1JVFNfQikpIHwKKwkJCSAgICAgKDEgPDwgKERRX0xBU1RTRVRfQiArIFFJRl9JTk9ERVNfQikpIHwKKwkJCSAgICAgKDEgPDwgKERRX0xBU1RTRVRfQiArIFFJRl9TUEFDRV9CKSkgfAorCQkJICAgICAoMSA8PCAoRFFfTEFTVFNFVF9CICsgUUlGX0JUSU1FX0IpKSB8CisJCQkgICAgICgxIDw8IChEUV9MQVNUU0VUX0IgKyBRSUZfSVRJTUVfQikpOworCWludCBzeW5jID0gMDsKKwlpbnQgc3RhdHVzOworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBkcXVvdC0+ZHFfc2I7CisJaW50IHR5cGUgPSBkcXVvdC0+ZHFfdHlwZTsKKwlzdHJ1Y3Qgb2NmczJfbWVtX2RxaW5mbyAqb2luZm8gPSBzYl9kcWluZm8oc2IsIHR5cGUpLT5kcWlfcHJpdjsKKwloYW5kbGVfdCAqaGFuZGxlOworCXN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiID0gT0NGUzJfU0Ioc2IpOworCisJbWxvZ19lbnRyeSgiaWQ9JXUsIHR5cGU9JWQiLCBkcXVvdC0+ZHFfaWQsIHR5cGUpOworCWRxdW90X21hcmtfZHF1b3RfZGlydHkoZHF1b3QpOworCisJLyogSW4gY2FzZSB1c2VyIHNldCBzb21lIGxpbWl0cywgc3luYyBkcXVvdCBpbW1lZGlhdGVseSB0byBnbG9iYWwKKwkgKiBxdW90YSBmaWxlIHNvIHRoYXQgaW5mb3JtYXRpb24gcHJvcGFnYXRlcyBxdWlja2VyICovCisJc3Bpbl9sb2NrKCZkcV9kYXRhX2xvY2spOworCWlmIChkcXVvdC0+ZHFfZmxhZ3MgJiBtYXNrKQorCQlzeW5jID0gMTsKKwlzcGluX3VubG9jaygmZHFfZGF0YV9sb2NrKTsKKwlpZiAoIXN5bmMpIHsKKwkJc3RhdHVzID0gb2NmczJfd3JpdGVfZHF1b3QoZHF1b3QpOworCQlnb3RvIG91dDsKKwl9CisJc3RhdHVzID0gb2NmczJfbG9ja19nbG9iYWxfcWYob2luZm8sIDEpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIG91dDsKKwloYW5kbGUgPSBvY2ZzMl9zdGFydF90cmFucyhvc2IsIE9DRlMyX1FTWU5DX0NSRURJVFMpOworCWlmIChJU19FUlIoaGFuZGxlKSkgeworCQlzdGF0dXMgPSBQVFJfRVJSKGhhbmRsZSk7CisJCW1sb2dfZXJybm8oc3RhdHVzKTsKKwkJZ290byBvdXRfaWxvY2s7CisJfQorCXN0YXR1cyA9IG9jZnMyX3N5bmNfZHF1b3QoZHF1b3QpOworCWlmIChzdGF0dXMgPCAwKSB7CisJCW1sb2dfZXJybm8oc3RhdHVzKTsKKwkJZ290byBvdXRfdHJhbnM7CisJfQorCS8qIE5vdyB3cml0ZSB1cGRhdGVkIGxvY2FsIGRxdW90IHN0cnVjdHVyZSAqLworCXN0YXR1cyA9IGRxdW90X2NvbW1pdChkcXVvdCk7CitvdXRfdHJhbnM6CisJb2NmczJfY29tbWl0X3RyYW5zKG9zYiwgaGFuZGxlKTsKK291dF9pbG9jazoKKwlvY2ZzMl91bmxvY2tfZ2xvYmFsX3FmKG9pbmZvLCAxKTsKK291dDoKKwltbG9nX2V4aXQoc3RhdHVzKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKiBUaGlzIHNob3VsZCBoYXBwZW4gb25seSBhZnRlciBzZXRfZHFpbmZvKCkuICovCitzdGF0aWMgaW50IG9jZnMyX3dyaXRlX2luZm8oc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHR5cGUpCit7CisJaGFuZGxlX3QgKmhhbmRsZTsKKwlpbnQgc3RhdHVzID0gMDsKKwlzdHJ1Y3Qgb2NmczJfbWVtX2RxaW5mbyAqb2luZm8gPSBzYl9kcWluZm8oc2IsIHR5cGUpLT5kcWlfcHJpdjsKKworCW1sb2dfZW50cnlfdm9pZCgpOworCisJc3RhdHVzID0gb2NmczJfbG9ja19nbG9iYWxfcWYob2luZm8sIDEpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIG91dDsKKwloYW5kbGUgPSBvY2ZzMl9zdGFydF90cmFucyhPQ0ZTMl9TQihzYiksIE9DRlMyX1FJTkZPX1dSSVRFX0NSRURJVFMpOworCWlmIChJU19FUlIoaGFuZGxlKSkgeworCQlzdGF0dXMgPSBQVFJfRVJSKGhhbmRsZSk7CisJCW1sb2dfZXJybm8oc3RhdHVzKTsKKwkJZ290byBvdXRfaWxvY2s7CisJfQorCXN0YXR1cyA9IGRxdW90X2NvbW1pdF9pbmZvKHNiLCB0eXBlKTsKKwlvY2ZzMl9jb21taXRfdHJhbnMoT0NGUzJfU0Ioc2IpLCBoYW5kbGUpOworb3V0X2lsb2NrOgorCW9jZnMyX3VubG9ja19nbG9iYWxfcWYob2luZm8sIDEpOworb3V0OgorCW1sb2dfZXhpdChzdGF0dXMpOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qIFRoaXMgaXMgZGlmZmljdWx0LiBXZSBoYXZlIHRvIGxvY2sgcXVvdGEgaW5vZGUgYW5kIHN0YXJ0IHRyYW5zYWN0aW9uCisgKiBpbiB0aGlzIGZ1bmN0aW9uIGJ1dCB3ZSBkb24ndCB3YW50IHRvIHRha2UgdGhlIHBlbmFsdHkgb2YgZXhsdXNpdmUKKyAqIHF1b3RhIGZpbGUgbG9jayB3aGVuIHdlIGFyZSBqdXN0IGdvaW5nIHRvIHVzZSBjYWNoZWQgc3RydWN0dXJlcy4gU28KKyAqIHdlIGp1c3QgdGFrZSByZWFkIGxvY2sgY2hlY2sgd2hldGhlciB3ZSBoYXZlIGRxdW90IGNhY2hlZCBhbmQgaWYgc28sCisgKiB3ZSBkb24ndCBoYXZlIHRvIHRha2UgdGhlIHdyaXRlIGxvY2suLi4gKi8KK3N0YXRpYyBpbnQgb2NmczJfZHF1b3RfaW5pdGlhbGl6ZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgdHlwZSkKK3sKKwloYW5kbGVfdCAqaGFuZGxlID0gTlVMTDsKKwlpbnQgc3RhdHVzID0gMDsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtPmlfc2I7CisJc3RydWN0IG9jZnMyX21lbV9kcWluZm8gKm9pbmZvOworCWludCBleGNsdXNpdmUgPSAwOworCWludCBjbnQ7CisJcWlkX3QgaWQ7CisKKwltbG9nX2VudHJ5X3ZvaWQoKTsKKworCWZvciAoY250ID0gMDsgY250IDwgTUFYUVVPVEFTOyBjbnQrKykgeworCQlpZiAodHlwZSAhPSAtMSAmJiBjbnQgIT0gdHlwZSkKKwkJCWNvbnRpbnVlOworCQlpZiAoIXNiX2hhc19xdW90YV9hY3RpdmUoc2IsIGNudCkpCisJCQljb250aW51ZTsKKwkJb2luZm8gPSBzYl9kcWluZm8oc2IsIGNudCktPmRxaV9wcml2OworCQlzdGF0dXMgPSBvY2ZzMl9sb2NrX2dsb2JhbF9xZihvaW5mbywgMCk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBvdXQ7CisJCS8qIFRoaXMgaXMganVzdCBhIHBlcmZvcm1hbmNlIG9wdGltaXphdGlvbiBub3QgYSByZWxpYWJsZSB0ZXN0LgorCQkgKiBTaW5jZSB3ZSBob2xkIGFuIGlub2RlIGxvY2ssIG5vb25lIGNhbiBhY3R1YWxseSByZWxlYXNlCisJCSAqIHRoZSBzdHJ1Y3R1cmUgdW50aWwgd2UgYXJlIGZpbmlzaGVkIHdpdGggaW5pdGlhbGl6YXRpb24uICovCisJCWlmIChpbm9kZS0+aV9kcXVvdFtjbnRdICE9IE5PRFFVT1QpIHsKKwkJCW9jZnMyX3VubG9ja19nbG9iYWxfcWYob2luZm8sIDApOworCQkJY29udGludWU7CisJCX0KKwkJLyogV2hlbiB3ZSBoYXZlIGlub2RlIGxvY2ssIHdlIGtub3cgdGhhdCBubyBkcXVvdF9yZWxlYXNlKCkgY2FuCisJCSAqIHJ1biBhbmQgdGh1cyB3ZSBjYW4gc2FmZWx5IGNoZWNrIHdoZXRoZXIgd2UgbmVlZCB0bworCQkgKiByZWFkK21vZGlmeSBnbG9iYWwgZmlsZSB0byBnZXQgcXVvdGEgaW5mb3JtYXRpb24gb3Igd2hldGhlcgorCQkgKiBvdXIgbm9kZSBhbHJlYWR5IGhhcyBpdC4gKi8KKwkJaWYgKGNudCA9PSBVU1JRVU9UQSkKKwkJCWlkID0gaW5vZGUtPmlfdWlkOworCQllbHNlIGlmIChjbnQgPT0gR1JQUVVPVEEpCisJCQlpZCA9IGlub2RlLT5pX2dpZDsKKwkJZWxzZQorCQkJQlVHKCk7CisJCS8qIE9idGFpbiBleGNsdXNpb24gZnJvbSBxdW90YSBvZmYuLi4gKi8KKwkJZG93bl93cml0ZSgmc2JfZHFvcHQoc2IpLT5kcXB0cl9zZW0pOworCQlleGNsdXNpdmUgPSAhZHF1b3RfaXNfY2FjaGVkKHNiLCBpZCwgY250KTsKKwkJdXBfd3JpdGUoJnNiX2Rxb3B0KHNiKS0+ZHFwdHJfc2VtKTsKKwkJaWYgKGV4Y2x1c2l2ZSkgeworCQkJc3RhdHVzID0gb2NmczJfbG9ja19nbG9iYWxfcWYob2luZm8sIDEpOworCQkJaWYgKHN0YXR1cyA8IDApIHsKKwkJCQlleGNsdXNpdmUgPSAwOworCQkJCW1sb2dfZXJybm8oc3RhdHVzKTsKKwkJCQlnb3RvIG91dF9pbG9jazsKKwkJCX0KKwkJCWhhbmRsZSA9IG9jZnMyX3N0YXJ0X3RyYW5zKE9DRlMyX1NCKHNiKSwKKwkJCQkJb2NmczJfY2FsY19xaW5pdF9jcmVkaXRzKHNiLCBjbnQpKTsKKwkJCWlmIChJU19FUlIoaGFuZGxlKSkgeworCQkJCXN0YXR1cyA9IFBUUl9FUlIoaGFuZGxlKTsKKwkJCQltbG9nX2Vycm5vKHN0YXR1cyk7CisJCQkJZ290byBvdXRfaWxvY2s7CisJCQl9CisJCX0KKwkJZHF1b3RfaW5pdGlhbGl6ZShpbm9kZSwgY250KTsKKwkJaWYgKGV4Y2x1c2l2ZSkgeworCQkJb2NmczJfY29tbWl0X3RyYW5zKE9DRlMyX1NCKHNiKSwgaGFuZGxlKTsKKwkJCW9jZnMyX3VubG9ja19nbG9iYWxfcWYob2luZm8sIDEpOworCQl9CisJCW9jZnMyX3VubG9ja19nbG9iYWxfcWYob2luZm8sIDApOworCX0KKwltbG9nX2V4aXQoMCk7CisJcmV0dXJuIDA7CitvdXRfaWxvY2s6CisJaWYgKGV4Y2x1c2l2ZSkKKwkJb2NmczJfdW5sb2NrX2dsb2JhbF9xZihvaW5mbywgMSk7CisJb2NmczJfdW5sb2NrX2dsb2JhbF9xZihvaW5mbywgMCk7CitvdXQ6CisJbWxvZ19leGl0KHN0YXR1cyk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBvY2ZzMl9kcXVvdF9kcm9wX3Nsb3coc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlpbnQgc3RhdHVzID0gMDsKKwlpbnQgY250OworCWludCBnb3RfbG9ja1tNQVhRVU9UQVNdID0gezAsIDB9OworCWhhbmRsZV90ICpoYW5kbGU7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLT5pX3NiOworCXN0cnVjdCBvY2ZzMl9tZW1fZHFpbmZvICpvaW5mbzsKKworCWZvciAoY250ID0gMDsgY250IDwgTUFYUVVPVEFTOyBjbnQrKykgeworCQlpZiAoIXNiX2hhc19xdW90YV9hY3RpdmUoc2IsIGNudCkpCisJCQljb250aW51ZTsKKwkJb2luZm8gPSBzYl9kcWluZm8oc2IsIGNudCktPmRxaV9wcml2OworCQlzdGF0dXMgPSBvY2ZzMl9sb2NrX2dsb2JhbF9xZihvaW5mbywgMSk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBvdXQ7CisJCWdvdF9sb2NrW2NudF0gPSAxOworCX0KKwloYW5kbGUgPSBvY2ZzMl9zdGFydF90cmFucyhPQ0ZTMl9TQihzYiksCisJCQlvY2ZzMl9jYWxjX3Fpbml0X2NyZWRpdHMoc2IsIFVTUlFVT1RBKSArCisJCQlvY2ZzMl9jYWxjX3Fpbml0X2NyZWRpdHMoc2IsIEdSUFFVT1RBKSk7CisJaWYgKElTX0VSUihoYW5kbGUpKSB7CisJCXN0YXR1cyA9IFBUUl9FUlIoaGFuZGxlKTsKKwkJbWxvZ19lcnJubyhzdGF0dXMpOworCQlnb3RvIG91dDsKKwl9CisJZHF1b3RfZHJvcChpbm9kZSk7CisJb2NmczJfY29tbWl0X3RyYW5zKE9DRlMyX1NCKHNiKSwgaGFuZGxlKTsKK291dDoKKwlmb3IgKGNudCA9IDA7IGNudCA8IE1BWFFVT1RBUzsgY250KyspCisJCWlmIChnb3RfbG9ja1tjbnRdKSB7CisJCQlvaW5mbyA9IHNiX2RxaW5mbyhzYiwgY250KS0+ZHFpX3ByaXY7CisJCQlvY2ZzMl91bmxvY2tfZ2xvYmFsX3FmKG9pbmZvLCAxKTsKKwkJfQorCXJldHVybiBzdGF0dXM7Cit9CisKKy8qIFNlZSB0aGUgY29tbWVudCBiZWZvcmUgb2NmczJfZHF1b3RfaW5pdGlhbGl6ZS4gKi8KK3N0YXRpYyBpbnQgb2NmczJfZHF1b3RfZHJvcChzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCWludCBzdGF0dXMgPSAwOworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS0+aV9zYjsKKwlzdHJ1Y3Qgb2NmczJfbWVtX2RxaW5mbyAqb2luZm87CisJaW50IGV4Y2x1c2l2ZSA9IDA7CisJaW50IGNudDsKKwlpbnQgZ290X2xvY2tbTUFYUVVPVEFTXSA9IHswLCAwfTsKKworCW1sb2dfZW50cnlfdm9pZCgpOworCWZvciAoY250ID0gMDsgY250IDwgTUFYUVVPVEFTOyBjbnQrKykgeworCQlpZiAoIXNiX2hhc19xdW90YV9hY3RpdmUoc2IsIGNudCkpCisJCQljb250aW51ZTsKKwkJb2luZm8gPSBzYl9kcWluZm8oc2IsIGNudCktPmRxaV9wcml2OworCQlzdGF0dXMgPSBvY2ZzMl9sb2NrX2dsb2JhbF9xZihvaW5mbywgMCk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBvdXQ7CisJCWdvdF9sb2NrW2NudF0gPSAxOworCX0KKwkvKiBMb2NrIGFnYWluc3QgYW55b25lIHJlbGVhc2luZyByZWZlcmVuY2VzIHNvIHRoYXQgd2hlbiB3aGVuIHdlIGNoZWNrCisJICogd2Uga25vdyB3ZSBhcmUgbm90IGdvaW5nIHRvIGJlIGxhc3Qgb25lcyB0byByZWxlYXNlIGRxdW90ICovCisJZG93bl93cml0ZSgmc2JfZHFvcHQoc2IpLT5kcXB0cl9zZW0pOworCS8qIFVyZ2gsIHRoaXMgaXMgYSB0ZXJyaWJsZSBoYWNrIDooICovCisJZm9yIChjbnQgPSAwOyBjbnQgPCBNQVhRVU9UQVM7IGNudCsrKSB7CisJCWlmIChpbm9kZS0+aV9kcXVvdFtjbnRdICE9IE5PRFFVT1QgJiYKKwkJICAgIGF0b21pY19yZWFkKCZpbm9kZS0+aV9kcXVvdFtjbnRdLT5kcV9jb3VudCkgPiAxKSB7CisJCQlleGNsdXNpdmUgPSAxOworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKCFleGNsdXNpdmUpCisJCWRxdW90X2Ryb3BfbG9ja2VkKGlub2RlKTsKKwl1cF93cml0ZSgmc2JfZHFvcHQoc2IpLT5kcXB0cl9zZW0pOworb3V0OgorCWZvciAoY250ID0gMDsgY250IDwgTUFYUVVPVEFTOyBjbnQrKykKKwkJaWYgKGdvdF9sb2NrW2NudF0pIHsKKwkJCW9pbmZvID0gc2JfZHFpbmZvKHNiLCBjbnQpLT5kcWlfcHJpdjsKKwkJCW9jZnMyX3VubG9ja19nbG9iYWxfcWYob2luZm8sIDApOworCQl9CisJLyogSW4gY2FzZSB3ZSBiYWlsZWQgb3V0IGJlY2F1c2Ugd2UgaGFkIHRvIGRvIGV4cGVuc2l2ZSBsb2NraW5nCisJICogZG8gaXQgbm93Li4uICovCisJaWYgKGV4Y2x1c2l2ZSkKKwkJc3RhdHVzID0gb2NmczJfZHF1b3RfZHJvcF9zbG93KGlub2RlKTsKKwltbG9nX2V4aXQoc3RhdHVzKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgc3RydWN0IGRxdW90ICpvY2ZzMl9hbGxvY19kcXVvdChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgdHlwZSkKK3sKKwlzdHJ1Y3Qgb2NmczJfZHF1b3QgKmRxdW90ID0KKwkJCQlrbWVtX2NhY2hlX3phbGxvYyhvY2ZzMl9kcXVvdF9jYWNoZXAsIEdGUF9OT0ZTKTsKKworCWlmICghZHF1b3QpCisJCXJldHVybiBOVUxMOworCXJldHVybiAmZHF1b3QtPmRxX2RxdW90OworfQorCitzdGF0aWMgdm9pZCBvY2ZzMl9kZXN0cm95X2RxdW90KHN0cnVjdCBkcXVvdCAqZHF1b3QpCit7CisJa21lbV9jYWNoZV9mcmVlKG9jZnMyX2RxdW90X2NhY2hlcCwgZHF1b3QpOworfQorCitzdHJ1Y3QgZHF1b3Rfb3BlcmF0aW9ucyBvY2ZzMl9xdW90YV9vcGVyYXRpb25zID0geworCS5pbml0aWFsaXplCT0gb2NmczJfZHF1b3RfaW5pdGlhbGl6ZSwKKwkuZHJvcAkJPSBvY2ZzMl9kcXVvdF9kcm9wLAorCS5hbGxvY19zcGFjZQk9IGRxdW90X2FsbG9jX3NwYWNlLAorCS5hbGxvY19pbm9kZQk9IGRxdW90X2FsbG9jX2lub2RlLAorCS5mcmVlX3NwYWNlCT0gZHF1b3RfZnJlZV9zcGFjZSwKKwkuZnJlZV9pbm9kZQk9IGRxdW90X2ZyZWVfaW5vZGUsCisJLnRyYW5zZmVyCT0gZHF1b3RfdHJhbnNmZXIsCisJLndyaXRlX2RxdW90CT0gb2NmczJfd3JpdGVfZHF1b3QsCisJLmFjcXVpcmVfZHF1b3QJPSBvY2ZzMl9hY3F1aXJlX2RxdW90LAorCS5yZWxlYXNlX2RxdW90CT0gb2NmczJfcmVsZWFzZV9kcXVvdCwKKwkubWFya19kaXJ0eQk9IG9jZnMyX21hcmtfZHF1b3RfZGlydHksCisJLndyaXRlX2luZm8JPSBvY2ZzMl93cml0ZV9pbmZvLAorCS5hbGxvY19kcXVvdAk9IG9jZnMyX2FsbG9jX2RxdW90LAorCS5kZXN0cm95X2RxdW90CT0gb2NmczJfZGVzdHJveV9kcXVvdCwKK307CisKK2ludCBvY2ZzMl9xdW90YV9zZXR1cCh2b2lkKQoreworCW9jZnMyX3F1b3RhX3dxID0gY3JlYXRlX3dvcmtxdWV1ZSgibzJxdW90Iik7CisJaWYgKCFvY2ZzMl9xdW90YV93cSkKKwkJcmV0dXJuIC1FTk9NRU07CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgb2NmczJfcXVvdGFfc2h1dGRvd24odm9pZCkKK3sKKwlpZiAob2NmczJfcXVvdGFfd3EpIHsKKwkJZmx1c2hfd29ya3F1ZXVlKG9jZnMyX3F1b3RhX3dxKTsKKwkJZGVzdHJveV93b3JrcXVldWUob2NmczJfcXVvdGFfd3EpOworCQlvY2ZzMl9xdW90YV93cSA9IE5VTEw7CisJfQorfQpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvcXVvdGFfbG9jYWwuYyBiL2ZzL29jZnMyL3F1b3RhX2xvY2FsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDdkZWVjNQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL29jZnMyL3F1b3RhX2xvY2FsLmMKQEAgLTAsMCArMSwxMjUzIEBACisvKgorICogIEltcGxlbWVudGF0aW9uIG9mIG9wZXJhdGlvbnMgb3ZlciBsb2NhbCBxdW90YSBmaWxlCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvcXVvdGEuaD4KKyNpbmNsdWRlIDxsaW51eC9xdW90YW9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjZGVmaW5lIE1MT0dfTUFTS19QUkVGSVggTUxfUVVPVEEKKyNpbmNsdWRlIDxjbHVzdGVyL21hc2tsb2cuaD4KKworI2luY2x1ZGUgIm9jZnMyX2ZzLmgiCisjaW5jbHVkZSAib2NmczIuaCIKKyNpbmNsdWRlICJpbm9kZS5oIgorI2luY2x1ZGUgImFsbG9jLmgiCisjaW5jbHVkZSAiZmlsZS5oIgorI2luY2x1ZGUgImJ1ZmZlcl9oZWFkX2lvLmgiCisjaW5jbHVkZSAiam91cm5hbC5oIgorI2luY2x1ZGUgInN5c2ZpbGUuaCIKKyNpbmNsdWRlICJkbG1nbHVlLmgiCisjaW5jbHVkZSAicXVvdGEuaCIKKworLyogTnVtYmVyIG9mIGxvY2FsIHF1b3RhIHN0cnVjdHVyZXMgcGVyIGJsb2NrICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBvbF9xdW90YV9lbnRyaWVzX3Blcl9ibG9jayhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXJldHVybiAoKHNiLT5zX2Jsb2Nrc2l6ZSAtIE9DRlMyX1FCTEtfUkVTRVJWRURfU1BBQ0UpIC8KKwkJc2l6ZW9mKHN0cnVjdCBvY2ZzMl9sb2NhbF9kaXNrX2RxYmxrKSk7Cit9CisKKy8qIE51bWJlciBvZiBibG9ja3Mgd2l0aCBlbnRyaWVzIGluIG9uZSBjaHVuayAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgb2xfY2h1bmtfYmxvY2tzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJcmV0dXJuICgoc2ItPnNfYmxvY2tzaXplIC0gc2l6ZW9mKHN0cnVjdCBvY2ZzMl9sb2NhbF9kaXNrX2NodW5rKSAtCisJCSBPQ0ZTMl9RQkxLX1JFU0VSVkVEX1NQQUNFKSA8PCAzKSAvCisJICAgICAgIG9sX3F1b3RhX2VudHJpZXNfcGVyX2Jsb2NrKHNiKTsKK30KKworLyogTnVtYmVyIG9mIGVudHJpZXMgaW4gYSBjaHVuayBiaXRtYXAgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgb2xfY2h1bmtfZW50cmllcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXJldHVybiBvbF9jaHVua19ibG9ja3Moc2IpICogb2xfcXVvdGFfZW50cmllc19wZXJfYmxvY2soc2IpOworfQorCisvKiBPZmZzZXQgb2YgdGhlIGNodW5rIGluIHF1b3RhIGZpbGUgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgb2xfcXVvdGFfY2h1bmtfYmxvY2soc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IGMpCit7CisJLyogMSBibG9jayBmb3IgbG9jYWwgcXVvdGEgZmlsZSBpbmZvLCAxIGJsb2NrIHBlciBjaHVuayBmb3IgY2h1bmsgaW5mbyAqLworCXJldHVybiAxICsgKG9sX2NodW5rX2Jsb2NrcyhzYikgKyAxKSAqIGM7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgb2xfZHFibGtfYmxvY2soc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IGMsIGludCBvZmYpCit7CisJaW50IGVwYiA9IG9sX3F1b3RhX2VudHJpZXNfcGVyX2Jsb2NrKHNiKTsKKworCXJldHVybiBvbF9xdW90YV9jaHVua19ibG9jayhzYiwgYykgKyAxICsgb2ZmIC8gZXBiOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IG9sX2RxYmxrX2Jsb2NrX29mZihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgYywgaW50IG9mZikKK3sKKwlpbnQgZXBiID0gb2xfcXVvdGFfZW50cmllc19wZXJfYmxvY2soc2IpOworCisJcmV0dXJuIChvZmYgJSBlcGIpICogc2l6ZW9mKHN0cnVjdCBvY2ZzMl9sb2NhbF9kaXNrX2RxYmxrKTsKK30KKworLyogT2Zmc2V0IG9mIHRoZSBkcXVvdCBzdHJ1Y3R1cmUgaW4gdGhlIHF1b3RhIGZpbGUgKi8KK3N0YXRpYyBsb2ZmX3Qgb2xfZHFibGtfb2ZmKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCBjLCBpbnQgb2ZmKQoreworCXJldHVybiAob2xfZHFibGtfYmxvY2soc2IsIGMsIG9mZikgPDwgc2ItPnNfYmxvY2tzaXplX2JpdHMpICsKKwkgICAgICAgb2xfZHFibGtfYmxvY2tfb2ZmKHNiLCBjLCBvZmYpOworfQorCisvKiBDb21wdXRlIGJsb2NrIG51bWJlciBmcm9tIGdpdmVuIG9mZnNldCAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgb2xfZHFibGtfZmlsZV9ibG9jayhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBsb2ZmX3Qgb2ZmKQoreworCXJldHVybiBvZmYgPj4gc2ItPnNfYmxvY2tzaXplX2JpdHM7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IG9sX2RxYmxrX2Jsb2NrX29mZnNldChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBsb2ZmX3Qgb2ZmKQoreworCXJldHVybiBvZmYgJiAoKDEgPDwgc2ItPnNfYmxvY2tzaXplX2JpdHMpIC0gMSk7Cit9CisKKy8qIENvbXB1dGUgb2Zmc2V0IGluIHRoZSBjaHVuayBvZiBhIHN0cnVjdHVyZSB3aXRoIHRoZSBnaXZlbiBvZmZzZXQgKi8KK3N0YXRpYyBpbnQgb2xfZHFibGtfY2h1bmtfb2ZmKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCBjLCBsb2ZmX3Qgb2ZmKQoreworCWludCBlcGIgPSBvbF9xdW90YV9lbnRyaWVzX3Blcl9ibG9jayhzYik7CisKKwlyZXR1cm4gKChvZmYgPj4gc2ItPnNfYmxvY2tzaXplX2JpdHMpIC0KKwkJCW9sX3F1b3RhX2NodW5rX2Jsb2NrKHNiLCBjKSAtIDEpICogZXBiCisJICAgICAgICsgKCh1bnNpZ25lZCBpbnQpKG9mZiAmICgoMSA8PCBzYi0+c19ibG9ja3NpemVfYml0cykgLSAxKSkpIC8KKwkJIHNpemVvZihzdHJ1Y3Qgb2NmczJfbG9jYWxfZGlza19kcWJsayk7Cit9CisKKy8qIFdyaXRlIGJ1ZmZlcmhlYWQgaW50byB0aGUgZnMgKi8KK3N0YXRpYyBpbnQgb2NmczJfbW9kaWZ5X2JoKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsCisJCXZvaWQgKCptb2RpZnkpKHN0cnVjdCBidWZmZXJfaGVhZCAqLCB2b2lkICopLCB2b2lkICpwcml2YXRlKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS0+aV9zYjsKKwloYW5kbGVfdCAqaGFuZGxlOworCWludCBzdGF0dXM7CisKKwloYW5kbGUgPSBvY2ZzMl9zdGFydF90cmFucyhPQ0ZTMl9TQihzYiksIDEpOworCWlmIChJU19FUlIoaGFuZGxlKSkgeworCQlzdGF0dXMgPSBQVFJfRVJSKGhhbmRsZSk7CisJCW1sb2dfZXJybm8oc3RhdHVzKTsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisJc3RhdHVzID0gb2NmczJfam91cm5hbF9hY2Nlc3NfZHEoaGFuZGxlLCBpbm9kZSwgYmgsCisJCQkJCSBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CisJaWYgKHN0YXR1cyA8IDApIHsKKwkJbWxvZ19lcnJubyhzdGF0dXMpOworCQlvY2ZzMl9jb21taXRfdHJhbnMoT0NGUzJfU0Ioc2IpLCBoYW5kbGUpOworCQlyZXR1cm4gc3RhdHVzOworCX0KKwlsb2NrX2J1ZmZlcihiaCk7CisJbW9kaWZ5KGJoLCBwcml2YXRlKTsKKwl1bmxvY2tfYnVmZmVyKGJoKTsKKwlzdGF0dXMgPSBvY2ZzMl9qb3VybmFsX2RpcnR5KGhhbmRsZSwgYmgpOworCWlmIChzdGF0dXMgPCAwKSB7CisJCW1sb2dfZXJybm8oc3RhdHVzKTsKKwkJb2NmczJfY29tbWl0X3RyYW5zKE9DRlMyX1NCKHNiKSwgaGFuZGxlKTsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisJc3RhdHVzID0gb2NmczJfY29tbWl0X3RyYW5zKE9DRlMyX1NCKHNiKSwgaGFuZGxlKTsKKwlpZiAoc3RhdHVzIDwgMCkgeworCQltbG9nX2Vycm5vKHN0YXR1cyk7CisJCXJldHVybiBzdGF0dXM7CisJfQorCXJldHVybiAwOworfQorCisvKiBDaGVjayB3aGV0aGVyIHdlIHVuZGVyc3RhbmQgZm9ybWF0IG9mIHF1b3RhIGZpbGVzICovCitzdGF0aWMgaW50IG9jZnMyX2xvY2FsX2NoZWNrX3F1b3RhX2ZpbGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHR5cGUpCit7CisJdW5zaWduZWQgaW50IGxtYWdpY3NbTUFYUVVPVEFTXSA9IE9DRlMyX0xPQ0FMX1FNQUdJQ1M7CisJdW5zaWduZWQgaW50IGx2ZXJzaW9uc1tNQVhRVU9UQVNdID0gT0NGUzJfTE9DQUxfUVZFUlNJT05TOworCXVuc2lnbmVkIGludCBnbWFnaWNzW01BWFFVT1RBU10gPSBPQ0ZTMl9HTE9CQUxfUU1BR0lDUzsKKwl1bnNpZ25lZCBpbnQgZ3ZlcnNpb25zW01BWFFVT1RBU10gPSBPQ0ZTMl9HTE9CQUxfUVZFUlNJT05TOworCXVuc2lnbmVkIGludCBpbm9bTUFYUVVPVEFTXSA9IHsgVVNFUl9RVU9UQV9TWVNURU1fSU5PREUsCisJCQkJCUdST1VQX1FVT1RBX1NZU1RFTV9JTk9ERSB9OworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSBOVUxMOworCXN0cnVjdCBpbm9kZSAqbGlub2RlID0gc2JfZHFvcHQoc2IpLT5maWxlc1t0eXBlXTsKKwlzdHJ1Y3QgaW5vZGUgKmdpbm9kZSA9IE5VTEw7CisJc3RydWN0IG9jZnMyX2Rpc2tfZHFoZWFkZXIgKmRxaGVhZDsKKwlpbnQgc3RhdHVzLCByZXQgPSAwOworCisJLyogRmlyc3QgY2hlY2sgd2hldGhlciB3ZSB1bmRlcnN0YW5kIGxvY2FsIHF1b3RhIGZpbGUgKi8KKwlzdGF0dXMgPSBvY2ZzMl9yZWFkX3F1b3RhX2Jsb2NrKGxpbm9kZSwgMCwgJmJoKTsKKwlpZiAoc3RhdHVzKSB7CisJCW1sb2dfZXJybm8oc3RhdHVzKTsKKwkJbWxvZyhNTF9FUlJPUiwgImZhaWxlZCB0byByZWFkIHF1b3RhIGZpbGUgaGVhZGVyICh0eXBlPSVkKVxuIiwKKwkJCXR5cGUpOworCQlnb3RvIG91dF9lcnI7CisJfQorCWRxaGVhZCA9IChzdHJ1Y3Qgb2NmczJfZGlza19kcWhlYWRlciAqKShiaC0+Yl9kYXRhKTsKKwlpZiAobGUzMl90b19jcHUoZHFoZWFkLT5kcWhfbWFnaWMpICE9IGxtYWdpY3NbdHlwZV0pIHsKKwkJbWxvZyhNTF9FUlJPUiwgInF1b3RhIGZpbGUgbWFnaWMgZG9lcyBub3QgbWF0Y2ggKCV1ICE9ICV1KSwiCisJCQkiIHR5cGU9JWRcbiIsIGxlMzJfdG9fY3B1KGRxaGVhZC0+ZHFoX21hZ2ljKSwKKwkJCWxtYWdpY3NbdHlwZV0sIHR5cGUpOworCQlnb3RvIG91dF9lcnI7CisJfQorCWlmIChsZTMyX3RvX2NwdShkcWhlYWQtPmRxaF92ZXJzaW9uKSAhPSBsdmVyc2lvbnNbdHlwZV0pIHsKKwkJbWxvZyhNTF9FUlJPUiwgInF1b3RhIGZpbGUgdmVyc2lvbiBkb2VzIG5vdCBtYXRjaCAoJXUgIT0gJXUpLCIKKwkJCSIgdHlwZT0lZFxuIiwgbGUzMl90b19jcHUoZHFoZWFkLT5kcWhfdmVyc2lvbiksCisJCQlsdmVyc2lvbnNbdHlwZV0sIHR5cGUpOworCQlnb3RvIG91dF9lcnI7CisJfQorCWJyZWxzZShiaCk7CisJYmggPSBOVUxMOworCisJLyogTmV4dCBjaGVjayB3aGV0aGVyIHdlIHVuZGVyc3RhbmQgZ2xvYmFsIHF1b3RhIGZpbGUgKi8KKwlnaW5vZGUgPSBvY2ZzMl9nZXRfc3lzdGVtX2ZpbGVfaW5vZGUoT0NGUzJfU0Ioc2IpLCBpbm9bdHlwZV0sCisJCQkJCQlPQ0ZTMl9JTlZBTElEX1NMT1QpOworCWlmICghZ2lub2RlKSB7CisJCW1sb2coTUxfRVJST1IsICJjYW5ub3QgZ2V0IGdsb2JhbCBxdW90YSBmaWxlIGlub2RlICIKKwkJCQkiKHR5cGU9JWQpXG4iLCB0eXBlKTsKKwkJZ290byBvdXRfZXJyOworCX0KKwkvKiBTaW5jZSB0aGUgaGVhZGVyIGlzIHJlYWQgb25seSwgd2UgZG9uJ3QgY2FyZSBhYm91dCBsb2NraW5nICovCisJc3RhdHVzID0gb2NmczJfcmVhZF9xdW90YV9ibG9jayhnaW5vZGUsIDAsICZiaCk7CisJaWYgKHN0YXR1cykgeworCQltbG9nX2Vycm5vKHN0YXR1cyk7CisJCW1sb2coTUxfRVJST1IsICJmYWlsZWQgdG8gcmVhZCBnbG9iYWwgcXVvdGEgZmlsZSBoZWFkZXIgIgorCQkJCSIodHlwZT0lZClcbiIsIHR5cGUpOworCQlnb3RvIG91dF9lcnI7CisJfQorCWRxaGVhZCA9IChzdHJ1Y3Qgb2NmczJfZGlza19kcWhlYWRlciAqKShiaC0+Yl9kYXRhKTsKKwlpZiAobGUzMl90b19jcHUoZHFoZWFkLT5kcWhfbWFnaWMpICE9IGdtYWdpY3NbdHlwZV0pIHsKKwkJbWxvZyhNTF9FUlJPUiwgImdsb2JhbCBxdW90YSBmaWxlIG1hZ2ljIGRvZXMgbm90IG1hdGNoICIKKwkJCSIoJXUgIT0gJXUpLCB0eXBlPSVkXG4iLAorCQkJbGUzMl90b19jcHUoZHFoZWFkLT5kcWhfbWFnaWMpLCBnbWFnaWNzW3R5cGVdLCB0eXBlKTsKKwkJZ290byBvdXRfZXJyOworCX0KKwlpZiAobGUzMl90b19jcHUoZHFoZWFkLT5kcWhfdmVyc2lvbikgIT0gZ3ZlcnNpb25zW3R5cGVdKSB7CisJCW1sb2coTUxfRVJST1IsICJnbG9iYWwgcXVvdGEgZmlsZSB2ZXJzaW9uIGRvZXMgbm90IG1hdGNoICIKKwkJCSIoJXUgIT0gJXUpLCB0eXBlPSVkXG4iLAorCQkJbGUzMl90b19jcHUoZHFoZWFkLT5kcWhfdmVyc2lvbiksIGd2ZXJzaW9uc1t0eXBlXSwKKwkJCXR5cGUpOworCQlnb3RvIG91dF9lcnI7CisJfQorCisJcmV0ID0gMTsKK291dF9lcnI6CisJYnJlbHNlKGJoKTsKKwlpcHV0KGdpbm9kZSk7CisJcmV0dXJuIHJldDsKK30KKworLyogUmVsZWFzZSBnaXZlbiBsaXN0IG9mIHF1b3RhIGZpbGUgY2h1bmtzICovCitzdGF0aWMgdm9pZCBvY2ZzMl9yZWxlYXNlX2xvY2FsX3F1b3RhX2JpdG1hcHMoc3RydWN0IGxpc3RfaGVhZCAqaGVhZCkKK3sKKwlzdHJ1Y3Qgb2NmczJfcXVvdGFfY2h1bmsgKnBvcywgKm5leHQ7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocG9zLCBuZXh0LCBoZWFkLCBxY19jaHVuaykgeworCQlsaXN0X2RlbCgmcG9zLT5xY19jaHVuayk7CisJCWJyZWxzZShwb3MtPnFjX2hlYWRlcmJoKTsKKwkJa21lbV9jYWNoZV9mcmVlKG9jZnMyX3FmX2NodW5rX2NhY2hlcCwgcG9zKTsKKwl9Cit9CisKKy8qIExvYWQgcXVvdGEgYml0bWFwcyBpbnRvIG1lbW9yeSAqLworc3RhdGljIGludCBvY2ZzMl9sb2FkX2xvY2FsX3F1b3RhX2JpdG1hcHMoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCXN0cnVjdCBvY2ZzMl9sb2NhbF9kaXNrX2RxaW5mbyAqbGRpbmZvLAorCQkJc3RydWN0IGxpc3RfaGVhZCAqaGVhZCkKK3sKKwlzdHJ1Y3Qgb2NmczJfcXVvdGFfY2h1bmsgKm5ld2NodW5rOworCWludCBpLCBzdGF0dXM7CisKKwlJTklUX0xJU1RfSEVBRChoZWFkKTsKKwlmb3IgKGkgPSAwOyBpIDwgbGUzMl90b19jcHUobGRpbmZvLT5kcWlfY2h1bmtzKTsgaSsrKSB7CisJCW5ld2NodW5rID0ga21lbV9jYWNoZV9hbGxvYyhvY2ZzMl9xZl9jaHVua19jYWNoZXAsIEdGUF9OT0ZTKTsKKwkJaWYgKCFuZXdjaHVuaykgeworCQkJb2NmczJfcmVsZWFzZV9sb2NhbF9xdW90YV9iaXRtYXBzKGhlYWQpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJbmV3Y2h1bmstPnFjX251bSA9IGk7CisJCW5ld2NodW5rLT5xY19oZWFkZXJiaCA9IE5VTEw7CisJCXN0YXR1cyA9IG9jZnMyX3JlYWRfcXVvdGFfYmxvY2soaW5vZGUsCisJCQkJb2xfcXVvdGFfY2h1bmtfYmxvY2soaW5vZGUtPmlfc2IsIGkpLAorCQkJCSZuZXdjaHVuay0+cWNfaGVhZGVyYmgpOworCQlpZiAoc3RhdHVzKSB7CisJCQltbG9nX2Vycm5vKHN0YXR1cyk7CisJCQlrbWVtX2NhY2hlX2ZyZWUob2NmczJfcWZfY2h1bmtfY2FjaGVwLCBuZXdjaHVuayk7CisJCQlvY2ZzMl9yZWxlYXNlX2xvY2FsX3F1b3RhX2JpdG1hcHMoaGVhZCk7CisJCQlyZXR1cm4gc3RhdHVzOworCQl9CisJCWxpc3RfYWRkX3RhaWwoJm5ld2NodW5rLT5xY19jaHVuaywgaGVhZCk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBvbHFfdXBkYXRlX2luZm8oc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgdm9pZCAqcHJpdmF0ZSkKK3sKKwlzdHJ1Y3QgbWVtX2RxaW5mbyAqaW5mbyA9IHByaXZhdGU7CisJc3RydWN0IG9jZnMyX21lbV9kcWluZm8gKm9pbmZvID0gaW5mby0+ZHFpX3ByaXY7CisJc3RydWN0IG9jZnMyX2xvY2FsX2Rpc2tfZHFpbmZvICpsZGluZm87CisKKwlsZGluZm8gPSAoc3RydWN0IG9jZnMyX2xvY2FsX2Rpc2tfZHFpbmZvICopKGJoLT5iX2RhdGEgKworCQkJCQkJT0NGUzJfTE9DQUxfSU5GT19PRkYpOworCXNwaW5fbG9jaygmZHFfZGF0YV9sb2NrKTsKKwlsZGluZm8tPmRxaV9mbGFncyA9IGNwdV90b19sZTMyKGluZm8tPmRxaV9mbGFncyAmIERRRl9NQVNLKTsKKwlsZGluZm8tPmRxaV9jaHVua3MgPSBjcHVfdG9fbGUzMihvaW5mby0+ZHFpX2NodW5rcyk7CisJbGRpbmZvLT5kcWlfYmxvY2tzID0gY3B1X3RvX2xlMzIob2luZm8tPmRxaV9ibG9ja3MpOworCXNwaW5fdW5sb2NrKCZkcV9kYXRhX2xvY2spOworfQorCitzdGF0aWMgaW50IG9jZnMyX2FkZF9yZWNvdmVyeV9jaHVuayhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQkJCSAgICBzdHJ1Y3Qgb2NmczJfbG9jYWxfZGlza19jaHVuayAqZGNodW5rLAorCQkJCSAgICBpbnQgY2h1bmssCisJCQkJICAgIHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpCit7CisJc3RydWN0IG9jZnMyX3JlY292ZXJ5X2NodW5rICpyYzsKKworCXJjID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IG9jZnMyX3JlY292ZXJ5X2NodW5rKSwgR0ZQX05PRlMpOworCWlmICghcmMpCisJCXJldHVybiAtRU5PTUVNOworCXJjLT5yY19jaHVuayA9IGNodW5rOworCXJjLT5yY19iaXRtYXAgPSBrbWFsbG9jKHNiLT5zX2Jsb2Nrc2l6ZSwgR0ZQX05PRlMpOworCWlmICghcmMtPnJjX2JpdG1hcCkgeworCQlrZnJlZShyYyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwltZW1jcHkocmMtPnJjX2JpdG1hcCwgZGNodW5rLT5kcWNfYml0bWFwLAorCSAgICAgICAob2xfY2h1bmtfZW50cmllcyhzYikgKyA3KSA+PiAzKTsKKwlsaXN0X2FkZF90YWlsKCZyYy0+cmNfbGlzdCwgaGVhZCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGZyZWVfcmVjb3ZlcnlfbGlzdChzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkKQoreworCXN0cnVjdCBvY2ZzMl9yZWNvdmVyeV9jaHVuayAqbmV4dDsKKwlzdHJ1Y3Qgb2NmczJfcmVjb3ZlcnlfY2h1bmsgKnJjaHVuazsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShyY2h1bmssIG5leHQsIGhlYWQsIHJjX2xpc3QpIHsKKwkJbGlzdF9kZWwoJnJjaHVuay0+cmNfbGlzdCk7CisJCWtmcmVlKHJjaHVuay0+cmNfYml0bWFwKTsKKwkJa2ZyZWUocmNodW5rKTsKKwl9Cit9CisKK3ZvaWQgb2NmczJfZnJlZV9xdW90YV9yZWNvdmVyeShzdHJ1Y3Qgb2NmczJfcXVvdGFfcmVjb3ZlcnkgKnJlYykKK3sKKwlpbnQgdHlwZTsKKworCWZvciAodHlwZSA9IDA7IHR5cGUgPCBNQVhRVU9UQVM7IHR5cGUrKykKKwkJZnJlZV9yZWNvdmVyeV9saXN0KCYocmVjLT5yX2xpc3RbdHlwZV0pKTsKKwlrZnJlZShyZWMpOworfQorCisvKiBMb2FkIGVudHJpZXMgaW4gb3VyIHF1b3RhIGZpbGUgd2UgaGF2ZSB0byByZWNvdmVyKi8KK3N0YXRpYyBpbnQgb2NmczJfcmVjb3ZlcnlfbG9hZF9xdW90YShzdHJ1Y3QgaW5vZGUgKmxxaW5vZGUsCisJCQkJICAgICBzdHJ1Y3Qgb2NmczJfbG9jYWxfZGlza19kcWluZm8gKmxkaW5mbywKKwkJCQkgICAgIGludCB0eXBlLAorCQkJCSAgICAgc3RydWN0IGxpc3RfaGVhZCAqaGVhZCkKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gbHFpbm9kZS0+aV9zYjsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmhiaDsKKwlzdHJ1Y3Qgb2NmczJfbG9jYWxfZGlza19jaHVuayAqZGNodW5rOworCWludCBpLCBjaHVua3MgPSBsZTMyX3RvX2NwdShsZGluZm8tPmRxaV9jaHVua3MpOworCWludCBzdGF0dXMgPSAwOworCisJZm9yIChpID0gMDsgaSA8IGNodW5rczsgaSsrKSB7CisJCWhiaCA9IE5VTEw7CisJCXN0YXR1cyA9IG9jZnMyX3JlYWRfcXVvdGFfYmxvY2sobHFpbm9kZSwKKwkJCQkJCW9sX3F1b3RhX2NodW5rX2Jsb2NrKHNiLCBpKSwKKwkJCQkJCSZoYmgpOworCQlpZiAoc3RhdHVzKSB7CisJCQltbG9nX2Vycm5vKHN0YXR1cyk7CisJCQlicmVhazsKKwkJfQorCQlkY2h1bmsgPSAoc3RydWN0IG9jZnMyX2xvY2FsX2Rpc2tfY2h1bmsgKiloYmgtPmJfZGF0YTsKKwkJaWYgKGxlMzJfdG9fY3B1KGRjaHVuay0+ZHFjX2ZyZWUpIDwgb2xfY2h1bmtfZW50cmllcyhzYikpCisJCQlzdGF0dXMgPSBvY2ZzMl9hZGRfcmVjb3ZlcnlfY2h1bmsoc2IsIGRjaHVuaywgaSwgaGVhZCk7CisJCWJyZWxzZShoYmgpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWJyZWFrOworCX0KKwlpZiAoc3RhdHVzIDwgMCkKKwkJZnJlZV9yZWNvdmVyeV9saXN0KGhlYWQpOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgb2NmczJfcXVvdGFfcmVjb3ZlcnkgKm9jZnMyX2FsbG9jX3F1b3RhX3JlY292ZXJ5KHZvaWQpCit7CisJaW50IHR5cGU7CisJc3RydWN0IG9jZnMyX3F1b3RhX3JlY292ZXJ5ICpyZWM7CisKKwlyZWMgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgb2NmczJfcXVvdGFfcmVjb3ZlcnkpLCBHRlBfTk9GUyk7CisJaWYgKCFyZWMpCisJCXJldHVybiBOVUxMOworCWZvciAodHlwZSA9IDA7IHR5cGUgPCBNQVhRVU9UQVM7IHR5cGUrKykKKwkJSU5JVF9MSVNUX0hFQUQoJihyZWMtPnJfbGlzdFt0eXBlXSkpOworCXJldHVybiByZWM7Cit9CisKKy8qIExvYWQgaW5mb3JtYXRpb24gd2UgbmVlZCBmb3IgcXVvdGEgcmVjb3ZlcnkgaW50byBtZW1vcnkgKi8KK3N0cnVjdCBvY2ZzMl9xdW90YV9yZWNvdmVyeSAqb2NmczJfYmVnaW5fcXVvdGFfcmVjb3ZlcnkoCisJCQkJCQlzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiwKKwkJCQkJCWludCBzbG90X251bSkKK3sKKwl1bnNpZ25lZCBpbnQgZmVhdHVyZVtNQVhRVU9UQVNdID0geyBPQ0ZTMl9GRUFUVVJFX1JPX0NPTVBBVF9VU1JRVU9UQSwKKwkJCQkJICAgIE9DRlMyX0ZFQVRVUkVfUk9fQ09NUEFUX0dSUFFVT1RBfTsKKwl1bnNpZ25lZCBpbnQgaW5vW01BWFFVT1RBU10gPSB7IExPQ0FMX1VTRVJfUVVPVEFfU1lTVEVNX0lOT0RFLAorCQkJCQlMT0NBTF9HUk9VUF9RVU9UQV9TWVNURU1fSU5PREUgfTsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gb3NiLT5zYjsKKwlzdHJ1Y3Qgb2NmczJfbG9jYWxfZGlza19kcWluZm8gKmxkaW5mbzsKKwlzdHJ1Y3QgaW5vZGUgKmxxaW5vZGU7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKwlpbnQgdHlwZTsKKwlpbnQgc3RhdHVzID0gMDsKKwlzdHJ1Y3Qgb2NmczJfcXVvdGFfcmVjb3ZlcnkgKnJlYzsKKworCW1sb2coTUxfTk9USUNFLCAiQmVnaW5uaW5nIHF1b3RhIHJlY292ZXJ5IGluIHNsb3QgJXVcbiIsIHNsb3RfbnVtKTsKKwlyZWMgPSBvY2ZzMl9hbGxvY19xdW90YV9yZWNvdmVyeSgpOworCWlmICghcmVjKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwkvKiBGaXJzdCBpbml0Li4uICovCisKKwlmb3IgKHR5cGUgPSAwOyB0eXBlIDwgTUFYUVVPVEFTOyB0eXBlKyspIHsKKwkJaWYgKCFPQ0ZTMl9IQVNfUk9fQ09NUEFUX0ZFQVRVUkUoc2IsIGZlYXR1cmVbdHlwZV0pKQorCQkJY29udGludWU7CisJCS8qIEF0IHRoaXMgcG9pbnQsIGpvdXJuYWwgb2YgdGhlIHNsb3QgaXMgYWxyZWFkeSByZXBsYXllZCBzbworCQkgKiB3ZSBjYW4gdHJ1c3QgbWV0YWRhdGEgYW5kIGRhdGEgb2YgdGhlIHF1b3RhIGZpbGUgKi8KKwkJbHFpbm9kZSA9IG9jZnMyX2dldF9zeXN0ZW1fZmlsZV9pbm9kZShvc2IsIGlub1t0eXBlXSwgc2xvdF9udW0pOworCQlpZiAoIWxxaW5vZGUpIHsKKwkJCXN0YXR1cyA9IC1FTk9FTlQ7CisJCQlnb3RvIG91dDsKKwkJfQorCQlzdGF0dXMgPSBvY2ZzMl9pbm9kZV9sb2NrX2Z1bGwobHFpbm9kZSwgTlVMTCwgMSwKKwkJCQkJICAgICAgIE9DRlMyX01FVEFfTE9DS19SRUNPVkVSWSk7CisJCWlmIChzdGF0dXMgPCAwKSB7CisJCQltbG9nX2Vycm5vKHN0YXR1cyk7CisJCQlnb3RvIG91dF9wdXQ7CisJCX0KKwkJLyogTm93IHJlYWQgbG9jYWwgaGVhZGVyICovCisJCWJoID0gTlVMTDsKKwkJc3RhdHVzID0gb2NmczJfcmVhZF9xdW90YV9ibG9jayhscWlub2RlLCAwLCAmYmgpOworCQlpZiAoc3RhdHVzKSB7CisJCQltbG9nX2Vycm5vKHN0YXR1cyk7CisJCQltbG9nKE1MX0VSUk9SLCAiZmFpbGVkIHRvIHJlYWQgcXVvdGEgZmlsZSBpbmZvIGhlYWRlciAiCisJCQkJIihzbG90PSVkIHR5cGU9JWQpXG4iLCBzbG90X251bSwgdHlwZSk7CisJCQlnb3RvIG91dF9sb2NrOworCQl9CisJCWxkaW5mbyA9IChzdHJ1Y3Qgb2NmczJfbG9jYWxfZGlza19kcWluZm8gKikoYmgtPmJfZGF0YSArCisJCQkJCQkJT0NGUzJfTE9DQUxfSU5GT19PRkYpOworCQlzdGF0dXMgPSBvY2ZzMl9yZWNvdmVyeV9sb2FkX3F1b3RhKGxxaW5vZGUsIGxkaW5mbywgdHlwZSwKKwkJCQkJCSAgICZyZWMtPnJfbGlzdFt0eXBlXSk7CisJCWJyZWxzZShiaCk7CitvdXRfbG9jazoKKwkJb2NmczJfaW5vZGVfdW5sb2NrKGxxaW5vZGUsIDEpOworb3V0X3B1dDoKKwkJaXB1dChscWlub2RlKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlicmVhazsKKwl9CitvdXQ6CisJaWYgKHN0YXR1cyA8IDApIHsKKwkJb2NmczJfZnJlZV9xdW90YV9yZWNvdmVyeShyZWMpOworCQlyZWMgPSBFUlJfUFRSKHN0YXR1cyk7CisJfQorCXJldHVybiByZWM7Cit9CisKKy8qIFN5bmMgY2hhbmdlcyBpbiBsb2NhbCBxdW90YSBmaWxlIGludG8gZ2xvYmFsIHF1b3RhIGZpbGUgYW5kCisgKiByZWluaXRpYWxpemUgbG9jYWwgcXVvdGEgZmlsZS4KKyAqIFRoZSBmdW5jdGlvbiBleHBlY3RzIGxvY2FsIHF1b3RhIGZpbGUgdG8gYmUgYWxyZWFkeSBsb2NrZWQgYW5kCisgKiBkcW9ub2ZmX211dGV4IGxvY2tlZC4gKi8KK3N0YXRpYyBpbnQgb2NmczJfcmVjb3Zlcl9sb2NhbF9xdW90YV9maWxlKHN0cnVjdCBpbm9kZSAqbHFpbm9kZSwKKwkJCQkJICBpbnQgdHlwZSwKKwkJCQkJICBzdHJ1Y3Qgb2NmczJfcXVvdGFfcmVjb3ZlcnkgKnJlYykKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gbHFpbm9kZS0+aV9zYjsKKwlzdHJ1Y3Qgb2NmczJfbWVtX2RxaW5mbyAqb2luZm8gPSBzYl9kcWluZm8oc2IsIHR5cGUpLT5kcWlfcHJpdjsKKwlzdHJ1Y3Qgb2NmczJfbG9jYWxfZGlza19jaHVuayAqZGNodW5rOworCXN0cnVjdCBvY2ZzMl9sb2NhbF9kaXNrX2RxYmxrICpkcWJsazsKKwlzdHJ1Y3QgZHF1b3QgKmRxdW90OworCWhhbmRsZV90ICpoYW5kbGU7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpoYmggPSBOVUxMLCAqcWJoID0gTlVMTDsKKwlpbnQgc3RhdHVzID0gMDsKKwlpbnQgYml0LCBjaHVuazsKKwlzdHJ1Y3Qgb2NmczJfcmVjb3ZlcnlfY2h1bmsgKnJjaHVuaywgKm5leHQ7CisJcXNpemVfdCBzcGFjZWNoYW5nZSwgaW5vZGVjaGFuZ2U7CisKKwltbG9nX2VudHJ5KCJpbm89JWx1IHR5cGU9JXUiLCAodW5zaWduZWQgbG9uZylscWlub2RlLT5pX2lubywgdHlwZSk7CisKKwlzdGF0dXMgPSBvY2ZzMl9sb2NrX2dsb2JhbF9xZihvaW5mbywgMSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gb3V0OworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHJjaHVuaywgbmV4dCwgJihyZWMtPnJfbGlzdFt0eXBlXSksIHJjX2xpc3QpIHsKKwkJY2h1bmsgPSByY2h1bmstPnJjX2NodW5rOworCQloYmggPSBOVUxMOworCQlzdGF0dXMgPSBvY2ZzMl9yZWFkX3F1b3RhX2Jsb2NrKGxxaW5vZGUsCisJCQkJCQlvbF9xdW90YV9jaHVua19ibG9jayhzYiwgY2h1bmspLAorCQkJCQkJJmhiaCk7CisJCWlmIChzdGF0dXMpIHsKKwkJCW1sb2dfZXJybm8oc3RhdHVzKTsKKwkJCWJyZWFrOworCQl9CisJCWRjaHVuayA9IChzdHJ1Y3Qgb2NmczJfbG9jYWxfZGlza19jaHVuayAqKWhiaC0+Yl9kYXRhOworCQlmb3JfZWFjaF9iaXQoYml0LCByY2h1bmstPnJjX2JpdG1hcCwgb2xfY2h1bmtfZW50cmllcyhzYikpIHsKKwkJCXFiaCA9IE5VTEw7CisJCQlzdGF0dXMgPSBvY2ZzMl9yZWFkX3F1b3RhX2Jsb2NrKGxxaW5vZGUsCisJCQkJCQlvbF9kcWJsa19ibG9jayhzYiwgY2h1bmssIGJpdCksCisJCQkJCQkmcWJoKTsKKwkJCWlmIChzdGF0dXMpIHsKKwkJCQltbG9nX2Vycm5vKHN0YXR1cyk7CisJCQkJYnJlYWs7CisJCQl9CisJCQlkcWJsayA9IChzdHJ1Y3Qgb2NmczJfbG9jYWxfZGlza19kcWJsayAqKShxYmgtPmJfZGF0YSArCisJCQkJb2xfZHFibGtfYmxvY2tfb2ZmKHNiLCBjaHVuaywgYml0KSk7CisJCQlkcXVvdCA9IGRxZ2V0KHNiLCBsZTY0X3RvX2NwdShkcWJsay0+ZHFiX2lkKSwgdHlwZSk7CisJCQlpZiAoIWRxdW90KSB7CisJCQkJc3RhdHVzID0gLUVJTzsKKwkJCQltbG9nKE1MX0VSUk9SLCAiRmFpbGVkIHRvIGdldCBxdW90YSBzdHJ1Y3R1cmUgIgorCQkJCSAgICAgImZvciBpZCAldSwgdHlwZSAlZC4gQ2Fubm90IGZpbmlzaCBxdW90YSAiCisJCQkJICAgICAiZmlsZSByZWNvdmVyeS5cbiIsCisJCQkJICAgICAodW5zaWduZWQpbGU2NF90b19jcHUoZHFibGstPmRxYl9pZCksCisJCQkJICAgICB0eXBlKTsKKwkJCQlnb3RvIG91dF9wdXRfYmg7CisJCQl9CisJCQloYW5kbGUgPSBvY2ZzMl9zdGFydF90cmFucyhPQ0ZTMl9TQihzYiksCisJCQkJCQkgICBPQ0ZTMl9RU1lOQ19DUkVESVRTKTsKKwkJCWlmIChJU19FUlIoaGFuZGxlKSkgeworCQkJCXN0YXR1cyA9IFBUUl9FUlIoaGFuZGxlKTsKKwkJCQltbG9nX2Vycm5vKHN0YXR1cyk7CisJCQkJZ290byBvdXRfcHV0X2RxdW90OworCQkJfQorCQkJbXV0ZXhfbG9jaygmc2JfZHFvcHQoc2IpLT5kcWlvX211dGV4KTsKKwkJCXNwaW5fbG9jaygmZHFfZGF0YV9sb2NrKTsKKwkJCS8qIEFkZCB1c2FnZSBmcm9tIHF1b3RhIGVudHJ5IGludG8gcXVvdGEgY2hhbmdlcworCQkJICogb2Ygb3VyIG5vZGUuIEF1eGlsaWFyeSB2YXJpYWJsZXMgYXJlIGltcG9ydGFudAorCQkJICogZHVlIHRvIHNpZ25lZG5lc3MgKi8KKwkJCXNwYWNlY2hhbmdlID0gbGU2NF90b19jcHUoZHFibGstPmRxYl9zcGFjZW1vZCk7CisJCQlpbm9kZWNoYW5nZSA9IGxlNjRfdG9fY3B1KGRxYmxrLT5kcWJfaW5vZGVtb2QpOworCQkJZHF1b3QtPmRxX2RxYi5kcWJfY3Vyc3BhY2UgKz0gc3BhY2VjaGFuZ2U7CisJCQlkcXVvdC0+ZHFfZHFiLmRxYl9jdXJpbm9kZXMgKz0gaW5vZGVjaGFuZ2U7CisJCQlzcGluX3VubG9jaygmZHFfZGF0YV9sb2NrKTsKKwkJCS8qIFdlIHdhbnQgdG8gZHJvcCByZWZlcmVuY2UgaGVsZCBieSB0aGUgY3Jhc2hlZAorCQkJICogbm9kZS4gU2luY2Ugd2UgaGF2ZSBvdXIgb3duIHJlZmVyZW5jZSB3ZSBrbm93CisJCQkgKiBnbG9iYWwgc3RydWN0dXJlIGFjdHVhbGx5IHdvbid0IGJlIGZyZWVkLiAqLworCQkJc3RhdHVzID0gb2NmczJfZ2xvYmFsX3JlbGVhc2VfZHF1b3QoZHF1b3QpOworCQkJaWYgKHN0YXR1cyA8IDApIHsKKwkJCQltbG9nX2Vycm5vKHN0YXR1cyk7CisJCQkJZ290byBvdXRfY29tbWl0OworCQkJfQorCQkJLyogUmVsZWFzZSBsb2NhbCBxdW90YSBmaWxlIGVudHJ5ICovCisJCQlzdGF0dXMgPSBvY2ZzMl9qb3VybmFsX2FjY2Vzc19kcShoYW5kbGUsIGxxaW5vZGUsCisJCQkJCXFiaCwgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOworCQkJaWYgKHN0YXR1cyA8IDApIHsKKwkJCQltbG9nX2Vycm5vKHN0YXR1cyk7CisJCQkJZ290byBvdXRfY29tbWl0OworCQkJfQorCQkJbG9ja19idWZmZXIocWJoKTsKKwkJCVdBUk5fT04oIW9jZnMyX3Rlc3RfYml0KGJpdCwgZGNodW5rLT5kcWNfYml0bWFwKSk7CisJCQlvY2ZzMl9jbGVhcl9iaXQoYml0LCBkY2h1bmstPmRxY19iaXRtYXApOworCQkJbGUzMl9hZGRfY3B1KCZkY2h1bmstPmRxY19mcmVlLCAxKTsKKwkJCXVubG9ja19idWZmZXIocWJoKTsKKwkJCXN0YXR1cyA9IG9jZnMyX2pvdXJuYWxfZGlydHkoaGFuZGxlLCBxYmgpOworCQkJaWYgKHN0YXR1cyA8IDApCisJCQkJbWxvZ19lcnJubyhzdGF0dXMpOworb3V0X2NvbW1pdDoKKwkJCW11dGV4X3VubG9jaygmc2JfZHFvcHQoc2IpLT5kcWlvX211dGV4KTsKKwkJCW9jZnMyX2NvbW1pdF90cmFucyhPQ0ZTMl9TQihzYiksIGhhbmRsZSk7CitvdXRfcHV0X2RxdW90OgorCQkJZHFwdXQoZHF1b3QpOworb3V0X3B1dF9iaDoKKwkJCWJyZWxzZShxYmgpOworCQkJaWYgKHN0YXR1cyA8IDApCisJCQkJYnJlYWs7CisJCX0KKwkJYnJlbHNlKGhiaCk7CisJCWxpc3RfZGVsKCZyY2h1bmstPnJjX2xpc3QpOworCQlrZnJlZShyY2h1bmstPnJjX2JpdG1hcCk7CisJCWtmcmVlKHJjaHVuayk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisJfQorCW9jZnMyX3VubG9ja19nbG9iYWxfcWYob2luZm8sIDEpOworb3V0OgorCWlmIChzdGF0dXMgPCAwKQorCQlmcmVlX3JlY292ZXJ5X2xpc3QoJihyZWMtPnJfbGlzdFt0eXBlXSkpOworCW1sb2dfZXhpdChzdGF0dXMpOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qIFJlY292ZXIgbG9jYWwgcXVvdGEgZmlsZXMgZm9yIGdpdmVuIG5vZGUgZGlmZmVyZW50IGZyb20gdXMgKi8KK2ludCBvY2ZzMl9maW5pc2hfcXVvdGFfcmVjb3Zlcnkoc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsCisJCQkJc3RydWN0IG9jZnMyX3F1b3RhX3JlY292ZXJ5ICpyZWMsCisJCQkJaW50IHNsb3RfbnVtKQoreworCXVuc2lnbmVkIGludCBpbm9bTUFYUVVPVEFTXSA9IHsgTE9DQUxfVVNFUl9RVU9UQV9TWVNURU1fSU5PREUsCisJCQkJCUxPQ0FMX0dST1VQX1FVT1RBX1NZU1RFTV9JTk9ERSB9OworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBvc2ItPnNiOworCXN0cnVjdCBvY2ZzMl9sb2NhbF9kaXNrX2RxaW5mbyAqbGRpbmZvOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJaGFuZGxlX3QgKmhhbmRsZTsKKwlpbnQgdHlwZTsKKwlpbnQgc3RhdHVzID0gMDsKKwlzdHJ1Y3QgaW5vZGUgKmxxaW5vZGU7CisJdW5zaWduZWQgaW50IGZsYWdzOworCisJbWxvZyhNTF9OT1RJQ0UsICJGaW5pc2hpbmcgcXVvdGEgcmVjb3ZlcnkgaW4gc2xvdCAldVxuIiwgc2xvdF9udW0pOworCW11dGV4X2xvY2soJnNiX2Rxb3B0KHNiKS0+ZHFvbm9mZl9tdXRleCk7CisJZm9yICh0eXBlID0gMDsgdHlwZSA8IE1BWFFVT1RBUzsgdHlwZSsrKSB7CisJCWlmIChsaXN0X2VtcHR5KCYocmVjLT5yX2xpc3RbdHlwZV0pKSkKKwkJCWNvbnRpbnVlOworCQltbG9nKDAsICJSZWNvdmVyaW5nIHF1b3RhIGluIHNsb3QgJWRcbiIsIHNsb3RfbnVtKTsKKwkJbHFpbm9kZSA9IG9jZnMyX2dldF9zeXN0ZW1fZmlsZV9pbm9kZShvc2IsIGlub1t0eXBlXSwgc2xvdF9udW0pOworCQlpZiAoIWxxaW5vZGUpIHsKKwkJCXN0YXR1cyA9IC1FTk9FTlQ7CisJCQlnb3RvIG91dDsKKwkJfQorCQlzdGF0dXMgPSBvY2ZzMl9pbm9kZV9sb2NrX2Z1bGwobHFpbm9kZSwgTlVMTCwgMSwKKwkJCQkJCSAgICAgICBPQ0ZTMl9NRVRBX0xPQ0tfTk9RVUVVRSk7CisJCS8qIFNvbWVvbmUgZWxzZSBpcyBob2xkaW5nIHRoZSBsb2NrPyBUaGVuIGhlIG11c3QgYmUKKwkJICogZG9pbmcgdGhlIHJlY292ZXJ5LiBKdXN0IHNraXAgdGhlIGZpbGUuLi4gKi8KKwkJaWYgKHN0YXR1cyA9PSAtRUFHQUlOKSB7CisJCQltbG9nKE1MX05PVElDRSwgInNraXBwaW5nIHF1b3RhIHJlY292ZXJ5IGZvciBzbG90ICVkICIKKwkJCSAgICAgImJlY2F1c2UgcXVvdGEgZmlsZSBpcyBsb2NrZWQuXG4iLCBzbG90X251bSk7CisJCQlzdGF0dXMgPSAwOworCQkJZ290byBvdXRfcHV0OworCQl9IGVsc2UgaWYgKHN0YXR1cyA8IDApIHsKKwkJCW1sb2dfZXJybm8oc3RhdHVzKTsKKwkJCWdvdG8gb3V0X3B1dDsKKwkJfQorCQkvKiBOb3cgcmVhZCBsb2NhbCBoZWFkZXIgKi8KKwkJYmggPSBOVUxMOworCQlzdGF0dXMgPSBvY2ZzMl9yZWFkX3F1b3RhX2Jsb2NrKGxxaW5vZGUsIDAsICZiaCk7CisJCWlmIChzdGF0dXMpIHsKKwkJCW1sb2dfZXJybm8oc3RhdHVzKTsKKwkJCW1sb2coTUxfRVJST1IsICJmYWlsZWQgdG8gcmVhZCBxdW90YSBmaWxlIGluZm8gaGVhZGVyICIKKwkJCQkiKHNsb3Q9JWQgdHlwZT0lZClcbiIsIHNsb3RfbnVtLCB0eXBlKTsKKwkJCWdvdG8gb3V0X2xvY2s7CisJCX0KKwkJbGRpbmZvID0gKHN0cnVjdCBvY2ZzMl9sb2NhbF9kaXNrX2RxaW5mbyAqKShiaC0+Yl9kYXRhICsKKwkJCQkJCQlPQ0ZTMl9MT0NBTF9JTkZPX09GRik7CisJCS8qIElzIHJlY292ZXJ5IHN0aWxsIG5lZWRlZD8gKi8KKwkJZmxhZ3MgPSBsZTMyX3RvX2NwdShsZGluZm8tPmRxaV9mbGFncyk7CisJCWlmICghKGZsYWdzICYgT0xRRl9DTEVBTikpCisJCQlzdGF0dXMgPSBvY2ZzMl9yZWNvdmVyX2xvY2FsX3F1b3RhX2ZpbGUobHFpbm9kZSwKKwkJCQkJCQkJdHlwZSwKKwkJCQkJCQkJcmVjKTsKKwkJLyogV2UgZG9uJ3Qgd2FudCB0byBtYXJrIGZpbGUgYXMgY2xlYW4gd2hlbiBpdCBpcyBhY3R1YWxseQorCQkgKiBhY3RpdmUgKi8KKwkJaWYgKHNsb3RfbnVtID09IG9zYi0+c2xvdF9udW0pCisJCQlnb3RvIG91dF9iaDsKKwkJLyogTWFyayBxdW90YSBmaWxlIGFzIGNsZWFuIGlmIHdlIGFyZSByZWNvdmVyaW5nIHF1b3RhIGZpbGUgb2YKKwkJICogc29tZSBvdGhlciBub2RlLiAqLworCQloYW5kbGUgPSBvY2ZzMl9zdGFydF90cmFucyhvc2IsIDEpOworCQlpZiAoSVNfRVJSKGhhbmRsZSkpIHsKKwkJCXN0YXR1cyA9IFBUUl9FUlIoaGFuZGxlKTsKKwkJCW1sb2dfZXJybm8oc3RhdHVzKTsKKwkJCWdvdG8gb3V0X2JoOworCQl9CisJCXN0YXR1cyA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzX2RxKGhhbmRsZSwgbHFpbm9kZSwgYmgsCisJCQkJCQkgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOworCQlpZiAoc3RhdHVzIDwgMCkgeworCQkJbWxvZ19lcnJubyhzdGF0dXMpOworCQkJZ290byBvdXRfdHJhbnM7CisJCX0KKwkJbG9ja19idWZmZXIoYmgpOworCQlsZGluZm8tPmRxaV9mbGFncyA9IGNwdV90b19sZTMyKGZsYWdzIHwgT0xRRl9DTEVBTik7CisJCXVubG9ja19idWZmZXIoYmgpOworCQlzdGF0dXMgPSBvY2ZzMl9qb3VybmFsX2RpcnR5KGhhbmRsZSwgYmgpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCW1sb2dfZXJybm8oc3RhdHVzKTsKK291dF90cmFuczoKKwkJb2NmczJfY29tbWl0X3RyYW5zKG9zYiwgaGFuZGxlKTsKK291dF9iaDoKKwkJYnJlbHNlKGJoKTsKK291dF9sb2NrOgorCQlvY2ZzMl9pbm9kZV91bmxvY2sobHFpbm9kZSwgMSk7CitvdXRfcHV0OgorCQlpcHV0KGxxaW5vZGUpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWJyZWFrOworCX0KK291dDoKKwltdXRleF91bmxvY2soJnNiX2Rxb3B0KHNiKS0+ZHFvbm9mZl9tdXRleCk7CisJa2ZyZWUocmVjKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKiBSZWFkIGluZm9ybWF0aW9uIGhlYWRlciBmcm9tIHF1b3RhIGZpbGUgKi8KK3N0YXRpYyBpbnQgb2NmczJfbG9jYWxfcmVhZF9pbmZvKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCB0eXBlKQoreworCXN0cnVjdCBvY2ZzMl9sb2NhbF9kaXNrX2RxaW5mbyAqbGRpbmZvOworCXN0cnVjdCBtZW1fZHFpbmZvICppbmZvID0gc2JfZHFpbmZvKHNiLCB0eXBlKTsKKwlzdHJ1Y3Qgb2NmczJfbWVtX2RxaW5mbyAqb2luZm87CisJc3RydWN0IGlub2RlICpscWlub2RlID0gc2JfZHFvcHQoc2IpLT5maWxlc1t0eXBlXTsKKwlpbnQgc3RhdHVzOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSBOVUxMOworCXN0cnVjdCBvY2ZzMl9xdW90YV9yZWNvdmVyeSAqcmVjOworCWludCBsb2NrZWQgPSAwOworCisJaW5mby0+ZHFpX21heGJsaW1pdCA9IDB4N2ZmZmZmZmZmZmZmZmZmZkxMOworCWluZm8tPmRxaV9tYXhpbGltaXQgPSAweDdmZmZmZmZmZmZmZmZmZmZMTDsKKwlvaW5mbyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBvY2ZzMl9tZW1fZHFpbmZvKSwgR0ZQX05PRlMpOworCWlmICghb2luZm8pIHsKKwkJbWxvZyhNTF9FUlJPUiwgImZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIG9jZnMyIHF1b3RhIgorCQkJICAgICAgICIgaW5mby4iKTsKKwkJZ290byBvdXRfZXJyOworCX0KKwlpbmZvLT5kcWlfcHJpdiA9IG9pbmZvOworCW9pbmZvLT5kcWlfdHlwZSA9IHR5cGU7CisJSU5JVF9MSVNUX0hFQUQoJm9pbmZvLT5kcWlfY2h1bmspOworCW9pbmZvLT5kcWlfcmVjID0gTlVMTDsKKwlvaW5mby0+ZHFpX2xxaV9iaCA9IE5VTEw7CisJb2luZm8tPmRxaV9pYmggPSBOVUxMOworCisJc3RhdHVzID0gb2NmczJfZ2xvYmFsX3JlYWRfaW5mbyhzYiwgdHlwZSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gb3V0X2VycjsKKworCXN0YXR1cyA9IG9jZnMyX2lub2RlX2xvY2sobHFpbm9kZSwgJm9pbmZvLT5kcWlfbHFpX2JoLCAxKTsKKwlpZiAoc3RhdHVzIDwgMCkgeworCQltbG9nX2Vycm5vKHN0YXR1cyk7CisJCWdvdG8gb3V0X2VycjsKKwl9CisJbG9ja2VkID0gMTsKKworCS8qIE5vdyByZWFkIGxvY2FsIGhlYWRlciAqLworCXN0YXR1cyA9IG9jZnMyX3JlYWRfcXVvdGFfYmxvY2sobHFpbm9kZSwgMCwgJmJoKTsKKwlpZiAoc3RhdHVzKSB7CisJCW1sb2dfZXJybm8oc3RhdHVzKTsKKwkJbWxvZyhNTF9FUlJPUiwgImZhaWxlZCB0byByZWFkIHF1b3RhIGZpbGUgaW5mbyBoZWFkZXIgIgorCQkJIih0eXBlPSVkKVxuIiwgdHlwZSk7CisJCWdvdG8gb3V0X2VycjsKKwl9CisJbGRpbmZvID0gKHN0cnVjdCBvY2ZzMl9sb2NhbF9kaXNrX2RxaW5mbyAqKShiaC0+Yl9kYXRhICsKKwkJCQkJCU9DRlMyX0xPQ0FMX0lORk9fT0ZGKTsKKwlpbmZvLT5kcWlfZmxhZ3MgPSBsZTMyX3RvX2NwdShsZGluZm8tPmRxaV9mbGFncyk7CisJb2luZm8tPmRxaV9jaHVua3MgPSBsZTMyX3RvX2NwdShsZGluZm8tPmRxaV9jaHVua3MpOworCW9pbmZvLT5kcWlfYmxvY2tzID0gbGUzMl90b19jcHUobGRpbmZvLT5kcWlfYmxvY2tzKTsKKwlvaW5mby0+ZHFpX2liaCA9IGJoOworCisJLyogV2UgY3Jhc2hlZCB3aGVuIHVzaW5nIGxvY2FsIHF1b3RhIGZpbGU/ICovCisJaWYgKCEoaW5mby0+ZHFpX2ZsYWdzICYgT0xRRl9DTEVBTikpIHsKKwkJcmVjID0gT0NGUzJfU0Ioc2IpLT5xdW90YV9yZWM7CisJCWlmICghcmVjKSB7CisJCQlyZWMgPSBvY2ZzMl9hbGxvY19xdW90YV9yZWNvdmVyeSgpOworCQkJaWYgKCFyZWMpIHsKKwkJCQlzdGF0dXMgPSAtRU5PTUVNOworCQkJCW1sb2dfZXJybm8oc3RhdHVzKTsKKwkJCQlnb3RvIG91dF9lcnI7CisJCQl9CisJCQlPQ0ZTMl9TQihzYiktPnF1b3RhX3JlYyA9IHJlYzsKKwkJfQorCisJCXN0YXR1cyA9IG9jZnMyX3JlY292ZXJ5X2xvYWRfcXVvdGEobHFpbm9kZSwgbGRpbmZvLCB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlYy0+cl9saXN0W3R5cGVdKTsKKwkJaWYgKHN0YXR1cyA8IDApIHsKKwkJCW1sb2dfZXJybm8oc3RhdHVzKTsKKwkJCWdvdG8gb3V0X2VycjsKKwkJfQorCX0KKworCXN0YXR1cyA9IG9jZnMyX2xvYWRfbG9jYWxfcXVvdGFfYml0bWFwcyhscWlub2RlLAorCQkJCQkJbGRpbmZvLAorCQkJCQkJJm9pbmZvLT5kcWlfY2h1bmspOworCWlmIChzdGF0dXMgPCAwKSB7CisJCW1sb2dfZXJybm8oc3RhdHVzKTsKKwkJZ290byBvdXRfZXJyOworCX0KKworCS8qIE5vdyBtYXJrIHF1b3RhIGZpbGUgYXMgdXNlZCAqLworCWluZm8tPmRxaV9mbGFncyAmPSB+T0xRRl9DTEVBTjsKKwlzdGF0dXMgPSBvY2ZzMl9tb2RpZnlfYmgobHFpbm9kZSwgYmgsIG9scV91cGRhdGVfaW5mbywgaW5mbyk7CisJaWYgKHN0YXR1cyA8IDApIHsKKwkJbWxvZ19lcnJubyhzdGF0dXMpOworCQlnb3RvIG91dF9lcnI7CisJfQorCisJcmV0dXJuIDA7CitvdXRfZXJyOgorCWlmIChvaW5mbykgeworCQlpcHV0KG9pbmZvLT5kcWlfZ3Fpbm9kZSk7CisJCW9jZnMyX3NpbXBsZV9kcm9wX2xvY2tyZXMoT0NGUzJfU0Ioc2IpLCAmb2luZm8tPmRxaV9ncWxvY2spOworCQlvY2ZzMl9sb2NrX3Jlc19mcmVlKCZvaW5mby0+ZHFpX2dxbG9jayk7CisJCWJyZWxzZShvaW5mby0+ZHFpX2xxaV9iaCk7CisJCWlmIChsb2NrZWQpCisJCQlvY2ZzMl9pbm9kZV91bmxvY2sobHFpbm9kZSwgMSk7CisJCW9jZnMyX3JlbGVhc2VfbG9jYWxfcXVvdGFfYml0bWFwcygmb2luZm8tPmRxaV9jaHVuayk7CisJCWtmcmVlKG9pbmZvKTsKKwl9CisJYnJlbHNlKGJoKTsKKwlyZXR1cm4gLTE7Cit9CisKKy8qIFdyaXRlIGxvY2FsIGluZm8gdG8gcXVvdGEgZmlsZSAqLworc3RhdGljIGludCBvY2ZzMl9sb2NhbF93cml0ZV9pbmZvKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCB0eXBlKQoreworCXN0cnVjdCBtZW1fZHFpbmZvICppbmZvID0gc2JfZHFpbmZvKHNiLCB0eXBlKTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gKChzdHJ1Y3Qgb2NmczJfbWVtX2RxaW5mbyAqKWluZm8tPmRxaV9wcml2KQorCQkJCQkJLT5kcWlfaWJoOworCWludCBzdGF0dXM7CisKKwlzdGF0dXMgPSBvY2ZzMl9tb2RpZnlfYmgoc2JfZHFvcHQoc2IpLT5maWxlc1t0eXBlXSwgYmgsIG9scV91cGRhdGVfaW5mbywKKwkJCQkgaW5mbyk7CisJaWYgKHN0YXR1cyA8IDApIHsKKwkJbWxvZ19lcnJubyhzdGF0dXMpOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIFJlbGVhc2UgaW5mbyBmcm9tIG1lbW9yeSAqLworc3RhdGljIGludCBvY2ZzMl9sb2NhbF9mcmVlX2luZm8oc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHR5cGUpCit7CisJc3RydWN0IG1lbV9kcWluZm8gKmluZm8gPSBzYl9kcWluZm8oc2IsIHR5cGUpOworCXN0cnVjdCBvY2ZzMl9tZW1fZHFpbmZvICpvaW5mbyA9IGluZm8tPmRxaV9wcml2OworCXN0cnVjdCBvY2ZzMl9xdW90YV9jaHVuayAqY2h1bms7CisJc3RydWN0IG9jZnMyX2xvY2FsX2Rpc2tfY2h1bmsgKmRjaHVuazsKKwlpbnQgbWFya19jbGVhbiA9IDEsIGxlbjsKKwlpbnQgc3RhdHVzOworCisJLyogQXQgdGhpcyBwb2ludCB3ZSBrbm93IHRoZXJlIGFyZSBubyBtb3JlIGRxdW90cyBhbmQgdGh1cworCSAqIGV2ZW4gaWYgdGhlcmUncyBzb21lIHN5bmMgaW4gdGhlIHBkZmx1c2ggcXVldWUsIGl0IHdvbid0CisJICogZmluZCBhbnkgZHF1b3RzIGFuZCByZXR1cm4gd2l0aG91dCBkb2luZyBhbnl0aGluZyAqLworCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmb2luZm8tPmRxaV9zeW5jX3dvcmspOworCWlwdXQob2luZm8tPmRxaV9ncWlub2RlKTsKKwlvY2ZzMl9zaW1wbGVfZHJvcF9sb2NrcmVzKE9DRlMyX1NCKHNiKSwgJm9pbmZvLT5kcWlfZ3Fsb2NrKTsKKwlvY2ZzMl9sb2NrX3Jlc19mcmVlKCZvaW5mby0+ZHFpX2dxbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShjaHVuaywgJm9pbmZvLT5kcWlfY2h1bmssIHFjX2NodW5rKSB7CisJCWRjaHVuayA9IChzdHJ1Y3Qgb2NmczJfbG9jYWxfZGlza19jaHVuayAqKQorCQkJCQkoY2h1bmstPnFjX2hlYWRlcmJoLT5iX2RhdGEpOworCQlpZiAoY2h1bmstPnFjX251bSA8IG9pbmZvLT5kcWlfY2h1bmtzIC0gMSkgeworCQkJbGVuID0gb2xfY2h1bmtfZW50cmllcyhzYik7CisJCX0gZWxzZSB7CisJCQlsZW4gPSAob2luZm8tPmRxaV9ibG9ja3MgLQorCQkJICAgICAgIG9sX3F1b3RhX2NodW5rX2Jsb2NrKHNiLCBjaHVuay0+cWNfbnVtKSAtIDEpCisJCQkgICAgICAqIG9sX3F1b3RhX2VudHJpZXNfcGVyX2Jsb2NrKHNiKTsKKwkJfQorCQkvKiBOb3QgYWxsIGVudHJpZXMgZnJlZT8gQnVnISAqLworCQlpZiAobGUzMl90b19jcHUoZGNodW5rLT5kcWNfZnJlZSkgIT0gbGVuKSB7CisJCQltbG9nKE1MX0VSUk9SLCAicmVsZWFzaW5nIHF1b3RhIGZpbGUgd2l0aCB1c2VkICIKKwkJCQkJImVudHJpZXMgKHR5cGU9JWQpXG4iLCB0eXBlKTsKKwkJCW1hcmtfY2xlYW4gPSAwOworCQl9CisJfQorCW9jZnMyX3JlbGVhc2VfbG9jYWxfcXVvdGFfYml0bWFwcygmb2luZm8tPmRxaV9jaHVuayk7CisKKwkvKiBkcW9ub2ZmX211dGV4IHByb3RlY3RzIHVzIGFnYWluc3QgcmFjaW5nIHdpdGggcmVjb3ZlcnkgdGhyZWFkLi4uICovCisJaWYgKG9pbmZvLT5kcWlfcmVjKSB7CisJCW9jZnMyX2ZyZWVfcXVvdGFfcmVjb3Zlcnkob2luZm8tPmRxaV9yZWMpOworCQltYXJrX2NsZWFuID0gMDsKKwl9CisKKwlpZiAoIW1hcmtfY2xlYW4pCisJCWdvdG8gb3V0OworCisJLyogTWFyayBsb2NhbCBmaWxlIGFzIGNsZWFuICovCisJaW5mby0+ZHFpX2ZsYWdzIHw9IE9MUUZfQ0xFQU47CisJc3RhdHVzID0gb2NmczJfbW9kaWZ5X2JoKHNiX2Rxb3B0KHNiKS0+ZmlsZXNbdHlwZV0sCisJCQkJIG9pbmZvLT5kcWlfaWJoLAorCQkJCSBvbHFfdXBkYXRlX2luZm8sCisJCQkJIGluZm8pOworCWlmIChzdGF0dXMgPCAwKSB7CisJCW1sb2dfZXJybm8oc3RhdHVzKTsKKwkJZ290byBvdXQ7CisJfQorCitvdXQ6CisJb2NmczJfaW5vZGVfdW5sb2NrKHNiX2Rxb3B0KHNiKS0+ZmlsZXNbdHlwZV0sIDEpOworCWJyZWxzZShvaW5mby0+ZHFpX2liaCk7CisJYnJlbHNlKG9pbmZvLT5kcWlfbHFpX2JoKTsKKwlrZnJlZShvaW5mbyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG9scV9zZXRfZHF1b3Qoc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgdm9pZCAqcHJpdmF0ZSkKK3sKKwlzdHJ1Y3Qgb2NmczJfZHF1b3QgKm9kID0gcHJpdmF0ZTsKKwlzdHJ1Y3Qgb2NmczJfbG9jYWxfZGlza19kcWJsayAqZHFibGs7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IG9kLT5kcV9kcXVvdC5kcV9zYjsKKworCWRxYmxrID0gKHN0cnVjdCBvY2ZzMl9sb2NhbF9kaXNrX2RxYmxrICopKGJoLT5iX2RhdGEKKwkJKyBvbF9kcWJsa19ibG9ja19vZmZzZXQoc2IsIG9kLT5kcV9sb2NhbF9vZmYpKTsKKworCWRxYmxrLT5kcWJfaWQgPSBjcHVfdG9fbGU2NChvZC0+ZHFfZHF1b3QuZHFfaWQpOworCXNwaW5fbG9jaygmZHFfZGF0YV9sb2NrKTsKKwlkcWJsay0+ZHFiX3NwYWNlbW9kID0gY3B1X3RvX2xlNjQob2QtPmRxX2RxdW90LmRxX2RxYi5kcWJfY3Vyc3BhY2UgLQorCQkJCQkgIG9kLT5kcV9vcmlnc3BhY2UpOworCWRxYmxrLT5kcWJfaW5vZGVtb2QgPSBjcHVfdG9fbGU2NChvZC0+ZHFfZHF1b3QuZHFfZHFiLmRxYl9jdXJpbm9kZXMgLQorCQkJCQkgIG9kLT5kcV9vcmlnaW5vZGVzKTsKKwlzcGluX3VubG9jaygmZHFfZGF0YV9sb2NrKTsKKwltbG9nKDAsICJXcml0aW5nIGxvY2FsIGRxdW90ICV1IHNwYWNlICVsbGQgaW5vZGVzICVsbGRcbiIsCisJICAgICBvZC0+ZHFfZHF1b3QuZHFfaWQsIChsb25nIGxvbmcpbGU2NF90b19jcHUoZHFibGstPmRxYl9zcGFjZW1vZCksCisJICAgICAobG9uZyBsb25nKWxlNjRfdG9fY3B1KGRxYmxrLT5kcWJfaW5vZGVtb2QpKTsKK30KKworLyogV3JpdGUgZHF1b3QgdG8gbG9jYWwgcXVvdGEgZmlsZSAqLworc3RhdGljIGludCBvY2ZzMl9sb2NhbF93cml0ZV9kcXVvdChzdHJ1Y3QgZHF1b3QgKmRxdW90KQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBkcXVvdC0+ZHFfc2I7CisJc3RydWN0IG9jZnMyX2RxdW90ICpvZCA9IE9DRlMyX0RRVU9UKGRxdW90KTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gTlVMTDsKKwlpbnQgc3RhdHVzOworCisJc3RhdHVzID0gb2NmczJfcmVhZF9xdW90YV9ibG9jayhzYl9kcW9wdChzYiktPmZpbGVzW2RxdW90LT5kcV90eXBlXSwKKwkJCQkgICAgb2xfZHFibGtfZmlsZV9ibG9jayhzYiwgb2QtPmRxX2xvY2FsX29mZiksCisJCQkJICAgICZiaCk7CisJaWYgKHN0YXR1cykgeworCQltbG9nX2Vycm5vKHN0YXR1cyk7CisJCWdvdG8gb3V0OworCX0KKwlzdGF0dXMgPSBvY2ZzMl9tb2RpZnlfYmgoc2JfZHFvcHQoc2IpLT5maWxlc1tkcXVvdC0+ZHFfdHlwZV0sIGJoLAorCQkJCSBvbHFfc2V0X2RxdW90LCBvZCk7CisJaWYgKHN0YXR1cyA8IDApIHsKKwkJbWxvZ19lcnJubyhzdGF0dXMpOworCQlnb3RvIG91dDsKKwl9CitvdXQ6CisJYnJlbHNlKGJoKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKiBGaW5kIGZyZWUgZW50cnkgaW4gbG9jYWwgcXVvdGEgZmlsZSAqLworc3RhdGljIHN0cnVjdCBvY2ZzMl9xdW90YV9jaHVuayAqb2NmczJfZmluZF9mcmVlX2VudHJ5KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCQkJCQkgICAgICAgaW50IHR5cGUsCisJCQkJCQkgICAgICAgaW50ICpvZmZzZXQpCit7CisJc3RydWN0IG1lbV9kcWluZm8gKmluZm8gPSBzYl9kcWluZm8oc2IsIHR5cGUpOworCXN0cnVjdCBvY2ZzMl9tZW1fZHFpbmZvICpvaW5mbyA9IGluZm8tPmRxaV9wcml2OworCXN0cnVjdCBvY2ZzMl9xdW90YV9jaHVuayAqY2h1bms7CisJc3RydWN0IG9jZnMyX2xvY2FsX2Rpc2tfY2h1bmsgKmRjaHVuazsKKwlpbnQgZm91bmQgPSAwLCBsZW47CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNodW5rLCAmb2luZm8tPmRxaV9jaHVuaywgcWNfY2h1bmspIHsKKwkJZGNodW5rID0gKHN0cnVjdCBvY2ZzMl9sb2NhbF9kaXNrX2NodW5rICopCisJCQkJCQljaHVuay0+cWNfaGVhZGVyYmgtPmJfZGF0YTsKKwkJaWYgKGxlMzJfdG9fY3B1KGRjaHVuay0+ZHFjX2ZyZWUpID4gMCkgeworCQkJZm91bmQgPSAxOworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKCFmb3VuZCkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoY2h1bmstPnFjX251bSA8IG9pbmZvLT5kcWlfY2h1bmtzIC0gMSkgeworCQlsZW4gPSBvbF9jaHVua19lbnRyaWVzKHNiKTsKKwl9IGVsc2UgeworCQlsZW4gPSAob2luZm8tPmRxaV9ibG9ja3MgLQorCQkgICAgICAgb2xfcXVvdGFfY2h1bmtfYmxvY2soc2IsIGNodW5rLT5xY19udW0pIC0gMSkKKwkJICAgICAgKiBvbF9xdW90YV9lbnRyaWVzX3Blcl9ibG9jayhzYik7CisJfQorCisJZm91bmQgPSBvY2ZzMl9maW5kX25leHRfemVyb19iaXQoZGNodW5rLT5kcWNfYml0bWFwLCBsZW4sIDApOworCS8qIFdlIGZhaWxlZD8gKi8KKwlpZiAoZm91bmQgPT0gbGVuKSB7CisJCW1sb2coTUxfRVJST1IsICJEaWQgbm90IGZpbmQgZW1wdHkgZW50cnkgaW4gY2h1bmsgJWQgd2l0aCAldSIKKwkJICAgICAiIGVudHJpZXMgZnJlZSAodHlwZT0lZClcbiIsIGNodW5rLT5xY19udW0sCisJCSAgICAgbGUzMl90b19jcHUoZGNodW5rLT5kcWNfZnJlZSksIHR5cGUpOworCQlyZXR1cm4gRVJSX1BUUigtRUlPKTsKKwl9CisJKm9mZnNldCA9IGZvdW5kOworCXJldHVybiBjaHVuazsKK30KKworLyogQWRkIG5ldyBjaHVuayB0byB0aGUgbG9jYWwgcXVvdGEgZmlsZSAqLworc3RhdGljIHN0cnVjdCBvY2ZzMl9xdW90YV9jaHVuayAqb2NmczJfbG9jYWxfcXVvdGFfYWRkX2NodW5rKAorCQkJCQkJCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCQkJCQkJaW50IHR5cGUsCisJCQkJCQkJaW50ICpvZmZzZXQpCit7CisJc3RydWN0IG1lbV9kcWluZm8gKmluZm8gPSBzYl9kcWluZm8oc2IsIHR5cGUpOworCXN0cnVjdCBvY2ZzMl9tZW1fZHFpbmZvICpvaW5mbyA9IGluZm8tPmRxaV9wcml2OworCXN0cnVjdCBpbm9kZSAqbHFpbm9kZSA9IHNiX2Rxb3B0KHNiKS0+ZmlsZXNbdHlwZV07CisJc3RydWN0IG9jZnMyX3F1b3RhX2NodW5rICpjaHVuayA9IE5VTEw7CisJc3RydWN0IG9jZnMyX2xvY2FsX2Rpc2tfY2h1bmsgKmRjaHVuazsKKwlpbnQgc3RhdHVzOworCWhhbmRsZV90ICpoYW5kbGU7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IE5VTEw7CisJdTY0IHBfYmxrbm87CisKKwkvKiBXZSBhcmUgcHJvdGVjdGVkIGJ5IGRxaW9fc2VtIHNvIG5vIGxvY2tpbmcgbmVlZGVkICovCisJc3RhdHVzID0gb2NmczJfZXh0ZW5kX25vX2hvbGVzKGxxaW5vZGUsCisJCQkJICAgICAgIGxxaW5vZGUtPmlfc2l6ZSArIDIgKiBzYi0+c19ibG9ja3NpemUsCisJCQkJICAgICAgIGxxaW5vZGUtPmlfc2l6ZSk7CisJaWYgKHN0YXR1cyA8IDApIHsKKwkJbWxvZ19lcnJubyhzdGF0dXMpOworCQlnb3RvIG91dDsKKwl9CisJc3RhdHVzID0gb2NmczJfc2ltcGxlX3NpemVfdXBkYXRlKGxxaW5vZGUsIG9pbmZvLT5kcWlfbHFpX2JoLAorCQkJCQkgIGxxaW5vZGUtPmlfc2l6ZSArIDIgKiBzYi0+c19ibG9ja3NpemUpOworCWlmIChzdGF0dXMgPCAwKSB7CisJCW1sb2dfZXJybm8oc3RhdHVzKTsKKwkJZ290byBvdXQ7CisJfQorCisJY2h1bmsgPSBrbWVtX2NhY2hlX2FsbG9jKG9jZnMyX3FmX2NodW5rX2NhY2hlcCwgR0ZQX05PRlMpOworCWlmICghY2h1bmspIHsKKwkJc3RhdHVzID0gLUVOT01FTTsKKwkJbWxvZ19lcnJubyhzdGF0dXMpOworCQlnb3RvIG91dDsKKwl9CisKKwlkb3duX3JlYWQoJk9DRlMyX0kobHFpbm9kZSktPmlwX2FsbG9jX3NlbSk7CisJc3RhdHVzID0gb2NmczJfZXh0ZW50X21hcF9nZXRfYmxvY2tzKGxxaW5vZGUsIG9pbmZvLT5kcWlfYmxvY2tzLAorCQkJCQkgICAgICZwX2Jsa25vLCBOVUxMLCBOVUxMKTsKKwl1cF9yZWFkKCZPQ0ZTMl9JKGxxaW5vZGUpLT5pcF9hbGxvY19zZW0pOworCWlmIChzdGF0dXMgPCAwKSB7CisJCW1sb2dfZXJybm8oc3RhdHVzKTsKKwkJZ290byBvdXQ7CisJfQorCWJoID0gc2JfZ2V0YmxrKHNiLCBwX2Jsa25vKTsKKwlpZiAoIWJoKSB7CisJCXN0YXR1cyA9IC1FTk9NRU07CisJCW1sb2dfZXJybm8oc3RhdHVzKTsKKwkJZ290byBvdXQ7CisJfQorCWRjaHVuayA9IChzdHJ1Y3Qgb2NmczJfbG9jYWxfZGlza19jaHVuayAqKWJoLT5iX2RhdGE7CisKKwloYW5kbGUgPSBvY2ZzMl9zdGFydF90cmFucyhPQ0ZTMl9TQihzYiksIDIpOworCWlmIChJU19FUlIoaGFuZGxlKSkgeworCQlzdGF0dXMgPSBQVFJfRVJSKGhhbmRsZSk7CisJCW1sb2dfZXJybm8oc3RhdHVzKTsKKwkJZ290byBvdXQ7CisJfQorCisJc3RhdHVzID0gb2NmczJfam91cm5hbF9hY2Nlc3NfZHEoaGFuZGxlLCBscWlub2RlLCBiaCwKKwkJCQkJIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKKwlpZiAoc3RhdHVzIDwgMCkgeworCQltbG9nX2Vycm5vKHN0YXR1cyk7CisJCWdvdG8gb3V0X3RyYW5zOworCX0KKwlsb2NrX2J1ZmZlcihiaCk7CisJZGNodW5rLT5kcWNfZnJlZSA9IGNwdV90b19sZTMyKG9sX3F1b3RhX2VudHJpZXNfcGVyX2Jsb2NrKHNiKSk7CisJbWVtc2V0KGRjaHVuay0+ZHFjX2JpdG1hcCwgMCwKKwkgICAgICAgc2ItPnNfYmxvY2tzaXplIC0gc2l6ZW9mKHN0cnVjdCBvY2ZzMl9sb2NhbF9kaXNrX2NodW5rKSAtCisJICAgICAgIE9DRlMyX1FCTEtfUkVTRVJWRURfU1BBQ0UpOworCXNldF9idWZmZXJfdXB0b2RhdGUoYmgpOworCXVubG9ja19idWZmZXIoYmgpOworCXN0YXR1cyA9IG9jZnMyX2pvdXJuYWxfZGlydHkoaGFuZGxlLCBiaCk7CisJaWYgKHN0YXR1cyA8IDApIHsKKwkJbWxvZ19lcnJubyhzdGF0dXMpOworCQlnb3RvIG91dF90cmFuczsKKwl9CisKKwlvaW5mby0+ZHFpX2Jsb2NrcyArPSAyOworCW9pbmZvLT5kcWlfY2h1bmtzKys7CisJc3RhdHVzID0gb2NmczJfbG9jYWxfd3JpdGVfaW5mbyhzYiwgdHlwZSk7CisJaWYgKHN0YXR1cyA8IDApIHsKKwkJbWxvZ19lcnJubyhzdGF0dXMpOworCQlnb3RvIG91dF90cmFuczsKKwl9CisJc3RhdHVzID0gb2NmczJfY29tbWl0X3RyYW5zKE9DRlMyX1NCKHNiKSwgaGFuZGxlKTsKKwlpZiAoc3RhdHVzIDwgMCkgeworCQltbG9nX2Vycm5vKHN0YXR1cyk7CisJCWdvdG8gb3V0OworCX0KKworCWxpc3RfYWRkX3RhaWwoJmNodW5rLT5xY19jaHVuaywgJm9pbmZvLT5kcWlfY2h1bmspOworCWNodW5rLT5xY19udW0gPSBsaXN0X2VudHJ5KGNodW5rLT5xY19jaHVuay5wcmV2LAorCQkJCSAgIHN0cnVjdCBvY2ZzMl9xdW90YV9jaHVuaywKKwkJCQkgICBxY19jaHVuayktPnFjX251bSArIDE7CisJY2h1bmstPnFjX2hlYWRlcmJoID0gYmg7CisJKm9mZnNldCA9IDA7CisJcmV0dXJuIGNodW5rOworb3V0X3RyYW5zOgorCW9jZnMyX2NvbW1pdF90cmFucyhPQ0ZTMl9TQihzYiksIGhhbmRsZSk7CitvdXQ6CisJYnJlbHNlKGJoKTsKKwlrbWVtX2NhY2hlX2ZyZWUob2NmczJfcWZfY2h1bmtfY2FjaGVwLCBjaHVuayk7CisJcmV0dXJuIEVSUl9QVFIoc3RhdHVzKTsKK30KKworLyogRmluZCBmcmVlIGVudHJ5IGluIGxvY2FsIHF1b3RhIGZpbGUgKi8KK3N0YXRpYyBzdHJ1Y3Qgb2NmczJfcXVvdGFfY2h1bmsgKm9jZnMyX2V4dGVuZF9sb2NhbF9xdW90YV9maWxlKAorCQkJCQkJICAgICAgIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCQkJCQkgICAgICAgaW50IHR5cGUsCisJCQkJCQkgICAgICAgaW50ICpvZmZzZXQpCit7CisJc3RydWN0IG1lbV9kcWluZm8gKmluZm8gPSBzYl9kcWluZm8oc2IsIHR5cGUpOworCXN0cnVjdCBvY2ZzMl9tZW1fZHFpbmZvICpvaW5mbyA9IGluZm8tPmRxaV9wcml2OworCXN0cnVjdCBvY2ZzMl9xdW90YV9jaHVuayAqY2h1bms7CisJc3RydWN0IGlub2RlICpscWlub2RlID0gc2JfZHFvcHQoc2IpLT5maWxlc1t0eXBlXTsKKwlzdHJ1Y3Qgb2NmczJfbG9jYWxfZGlza19jaHVuayAqZGNodW5rOworCWludCBlcGIgPSBvbF9xdW90YV9lbnRyaWVzX3Blcl9ibG9jayhzYik7CisJdW5zaWduZWQgaW50IGNodW5rX2Jsb2NrczsKKwlpbnQgc3RhdHVzOworCWhhbmRsZV90ICpoYW5kbGU7CisKKwlpZiAobGlzdF9lbXB0eSgmb2luZm8tPmRxaV9jaHVuaykpCisJCXJldHVybiBvY2ZzMl9sb2NhbF9xdW90YV9hZGRfY2h1bmsoc2IsIHR5cGUsIG9mZnNldCk7CisJLyogSXMgdGhlIGxhc3QgY2h1bmsgZnVsbD8gKi8KKwljaHVuayA9IGxpc3RfZW50cnkob2luZm8tPmRxaV9jaHVuay5wcmV2LAorCQkJc3RydWN0IG9jZnMyX3F1b3RhX2NodW5rLCBxY19jaHVuayk7CisJY2h1bmtfYmxvY2tzID0gb2luZm8tPmRxaV9ibG9ja3MgLQorCQkJb2xfcXVvdGFfY2h1bmtfYmxvY2soc2IsIGNodW5rLT5xY19udW0pIC0gMTsKKwlpZiAob2xfY2h1bmtfYmxvY2tzKHNiKSA9PSBjaHVua19ibG9ja3MpCisJCXJldHVybiBvY2ZzMl9sb2NhbF9xdW90YV9hZGRfY2h1bmsoc2IsIHR5cGUsIG9mZnNldCk7CisKKwkvKiBXZSBhcmUgcHJvdGVjdGVkIGJ5IGRxaW9fc2VtIHNvIG5vIGxvY2tpbmcgbmVlZGVkICovCisJc3RhdHVzID0gb2NmczJfZXh0ZW5kX25vX2hvbGVzKGxxaW5vZGUsCisJCQkJICAgICAgIGxxaW5vZGUtPmlfc2l6ZSArIHNiLT5zX2Jsb2Nrc2l6ZSwKKwkJCQkgICAgICAgbHFpbm9kZS0+aV9zaXplKTsKKwlpZiAoc3RhdHVzIDwgMCkgeworCQltbG9nX2Vycm5vKHN0YXR1cyk7CisJCWdvdG8gb3V0OworCX0KKwlzdGF0dXMgPSBvY2ZzMl9zaW1wbGVfc2l6ZV91cGRhdGUobHFpbm9kZSwgb2luZm8tPmRxaV9scWlfYmgsCisJCQkJCSAgbHFpbm9kZS0+aV9zaXplICsgc2ItPnNfYmxvY2tzaXplKTsKKwlpZiAoc3RhdHVzIDwgMCkgeworCQltbG9nX2Vycm5vKHN0YXR1cyk7CisJCWdvdG8gb3V0OworCX0KKwloYW5kbGUgPSBvY2ZzMl9zdGFydF90cmFucyhPQ0ZTMl9TQihzYiksIDIpOworCWlmIChJU19FUlIoaGFuZGxlKSkgeworCQlzdGF0dXMgPSBQVFJfRVJSKGhhbmRsZSk7CisJCW1sb2dfZXJybm8oc3RhdHVzKTsKKwkJZ290byBvdXQ7CisJfQorCXN0YXR1cyA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzX2RxKGhhbmRsZSwgbHFpbm9kZSwgY2h1bmstPnFjX2hlYWRlcmJoLAorCQkJCSBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CisJaWYgKHN0YXR1cyA8IDApIHsKKwkJbWxvZ19lcnJubyhzdGF0dXMpOworCQlnb3RvIG91dF90cmFuczsKKwl9CisKKwlkY2h1bmsgPSAoc3RydWN0IG9jZnMyX2xvY2FsX2Rpc2tfY2h1bmsgKiljaHVuay0+cWNfaGVhZGVyYmgtPmJfZGF0YTsKKwlsb2NrX2J1ZmZlcihjaHVuay0+cWNfaGVhZGVyYmgpOworCWxlMzJfYWRkX2NwdSgmZGNodW5rLT5kcWNfZnJlZSwgb2xfcXVvdGFfZW50cmllc19wZXJfYmxvY2soc2IpKTsKKwl1bmxvY2tfYnVmZmVyKGNodW5rLT5xY19oZWFkZXJiaCk7CisJc3RhdHVzID0gb2NmczJfam91cm5hbF9kaXJ0eShoYW5kbGUsIGNodW5rLT5xY19oZWFkZXJiaCk7CisJaWYgKHN0YXR1cyA8IDApIHsKKwkJbWxvZ19lcnJubyhzdGF0dXMpOworCQlnb3RvIG91dF90cmFuczsKKwl9CisJb2luZm8tPmRxaV9ibG9ja3MrKzsKKwlzdGF0dXMgPSBvY2ZzMl9sb2NhbF93cml0ZV9pbmZvKHNiLCB0eXBlKTsKKwlpZiAoc3RhdHVzIDwgMCkgeworCQltbG9nX2Vycm5vKHN0YXR1cyk7CisJCWdvdG8gb3V0X3RyYW5zOworCX0KKworCXN0YXR1cyA9IG9jZnMyX2NvbW1pdF90cmFucyhPQ0ZTMl9TQihzYiksIGhhbmRsZSk7CisJaWYgKHN0YXR1cyA8IDApIHsKKwkJbWxvZ19lcnJubyhzdGF0dXMpOworCQlnb3RvIG91dDsKKwl9CisJKm9mZnNldCA9IGNodW5rX2Jsb2NrcyAqIGVwYjsKKwlyZXR1cm4gY2h1bms7CitvdXRfdHJhbnM6CisJb2NmczJfY29tbWl0X3RyYW5zKE9DRlMyX1NCKHNiKSwgaGFuZGxlKTsKK291dDoKKwlyZXR1cm4gRVJSX1BUUihzdGF0dXMpOworfQorCitzdGF0aWMgdm9pZCBvbHFfYWxsb2NfZHF1b3Qoc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgdm9pZCAqcHJpdmF0ZSkKK3sKKwlpbnQgKm9mZnNldCA9IHByaXZhdGU7CisJc3RydWN0IG9jZnMyX2xvY2FsX2Rpc2tfY2h1bmsgKmRjaHVuazsKKworCWRjaHVuayA9IChzdHJ1Y3Qgb2NmczJfbG9jYWxfZGlza19jaHVuayAqKWJoLT5iX2RhdGE7CisJb2NmczJfc2V0X2JpdCgqb2Zmc2V0LCBkY2h1bmstPmRxY19iaXRtYXApOworCWxlMzJfYWRkX2NwdSgmZGNodW5rLT5kcWNfZnJlZSwgLTEpOworfQorCisvKiBDcmVhdGUgZHF1b3QgaW4gdGhlIGxvY2FsIGZpbGUgZm9yIGdpdmVuIGlkICovCitzdGF0aWMgaW50IG9jZnMyX2NyZWF0ZV9sb2NhbF9kcXVvdChzdHJ1Y3QgZHF1b3QgKmRxdW90KQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBkcXVvdC0+ZHFfc2I7CisJaW50IHR5cGUgPSBkcXVvdC0+ZHFfdHlwZTsKKwlzdHJ1Y3QgaW5vZGUgKmxxaW5vZGUgPSBzYl9kcW9wdChzYiktPmZpbGVzW3R5cGVdOworCXN0cnVjdCBvY2ZzMl9xdW90YV9jaHVuayAqY2h1bms7CisJc3RydWN0IG9jZnMyX2RxdW90ICpvZCA9IE9DRlMyX0RRVU9UKGRxdW90KTsKKwlpbnQgb2Zmc2V0OworCWludCBzdGF0dXM7CisKKwljaHVuayA9IG9jZnMyX2ZpbmRfZnJlZV9lbnRyeShzYiwgdHlwZSwgJm9mZnNldCk7CisJaWYgKCFjaHVuaykgeworCQljaHVuayA9IG9jZnMyX2V4dGVuZF9sb2NhbF9xdW90YV9maWxlKHNiLCB0eXBlLCAmb2Zmc2V0KTsKKwkJaWYgKElTX0VSUihjaHVuaykpCisJCQlyZXR1cm4gUFRSX0VSUihjaHVuayk7CisJfSBlbHNlIGlmIChJU19FUlIoY2h1bmspKSB7CisJCXJldHVybiBQVFJfRVJSKGNodW5rKTsKKwl9CisJb2QtPmRxX2xvY2FsX29mZiA9IG9sX2RxYmxrX29mZihzYiwgY2h1bmstPnFjX251bSwgb2Zmc2V0KTsKKwlvZC0+ZHFfY2h1bmsgPSBjaHVuazsKKworCS8qIEluaXRpYWxpemUgZHF1b3Qgc3RydWN0dXJlIG9uIGRpc2sgKi8KKwlzdGF0dXMgPSBvY2ZzMl9sb2NhbF93cml0ZV9kcXVvdChkcXVvdCk7CisJaWYgKHN0YXR1cyA8IDApIHsKKwkJbWxvZ19lcnJubyhzdGF0dXMpOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBNYXJrIHN0cnVjdHVyZSBhcyBhbGxvY2F0ZWQgKi8KKwlzdGF0dXMgPSBvY2ZzMl9tb2RpZnlfYmgobHFpbm9kZSwgY2h1bmstPnFjX2hlYWRlcmJoLCBvbHFfYWxsb2NfZHF1b3QsCisJCQkJICZvZmZzZXQpOworCWlmIChzdGF0dXMgPCAwKSB7CisJCW1sb2dfZXJybm8oc3RhdHVzKTsKKwkJZ290byBvdXQ7CisJfQorb3V0OgorCXJldHVybiBzdGF0dXM7Cit9CisKKy8qIENyZWF0ZSBlbnRyeSBpbiBsb2NhbCBmaWxlIGZvciBkcXVvdCwgbG9hZCBkYXRhIGZyb20gdGhlIGdsb2JhbCBmaWxlICovCitzdGF0aWMgaW50IG9jZnMyX2xvY2FsX3JlYWRfZHF1b3Qoc3RydWN0IGRxdW90ICpkcXVvdCkKK3sKKwlpbnQgc3RhdHVzOworCisJbWxvZ19lbnRyeSgiaWQ9JXUsIHR5cGU9JWRcbiIsIGRxdW90LT5kcV9pZCwgZHF1b3QtPmRxX3R5cGUpOworCisJc3RhdHVzID0gb2NmczJfZ2xvYmFsX3JlYWRfZHF1b3QoZHF1b3QpOworCWlmIChzdGF0dXMgPCAwKSB7CisJCW1sb2dfZXJybm8oc3RhdHVzKTsKKwkJZ290byBvdXRfZXJyOworCX0KKworCS8qIE5vdyBjcmVhdGUgZW50cnkgaW4gdGhlIGxvY2FsIHF1b3RhIGZpbGUgKi8KKwlzdGF0dXMgPSBvY2ZzMl9jcmVhdGVfbG9jYWxfZHF1b3QoZHF1b3QpOworCWlmIChzdGF0dXMgPCAwKSB7CisJCW1sb2dfZXJybm8oc3RhdHVzKTsKKwkJZ290byBvdXRfZXJyOworCX0KKwltbG9nX2V4aXQoMCk7CisJcmV0dXJuIDA7CitvdXRfZXJyOgorCW1sb2dfZXhpdChzdGF0dXMpOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qIFJlbGVhc2UgZHF1b3Qgc3RydWN0dXJlIGZyb20gbG9jYWwgcXVvdGEgZmlsZS4gb2NmczJfcmVsZWFzZV9kcXVvdCgpIGhhcworICogYWxyZWFkeSBzdGFydGVkIGEgdHJhbnNhY3Rpb24gYW5kIG9idGFpbmVkIGV4Y2x1c2l2ZSBsb2NrIGZvciBnbG9iYWwKKyAqIHF1b3RhIGZpbGUuICovCitzdGF0aWMgaW50IG9jZnMyX2xvY2FsX3JlbGVhc2VfZHF1b3Qoc3RydWN0IGRxdW90ICpkcXVvdCkKK3sKKwlpbnQgc3RhdHVzOworCWludCB0eXBlID0gZHF1b3QtPmRxX3R5cGU7CisJc3RydWN0IG9jZnMyX2RxdW90ICpvZCA9IE9DRlMyX0RRVU9UKGRxdW90KTsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gZHF1b3QtPmRxX3NiOworCXN0cnVjdCBvY2ZzMl9sb2NhbF9kaXNrX2NodW5rICpkY2h1bms7CisJaW50IG9mZnNldDsKKwloYW5kbGVfdCAqaGFuZGxlID0gam91cm5hbF9jdXJyZW50X2hhbmRsZSgpOworCisJQlVHX09OKCFoYW5kbGUpOworCS8qIEZpcnN0IHdyaXRlIGFsbCBsb2NhbCBjaGFuZ2VzIHRvIGdsb2JhbCBmaWxlICovCisJc3RhdHVzID0gb2NmczJfZ2xvYmFsX3JlbGVhc2VfZHF1b3QoZHF1b3QpOworCWlmIChzdGF0dXMgPCAwKSB7CisJCW1sb2dfZXJybm8oc3RhdHVzKTsKKwkJZ290byBvdXQ7CisJfQorCisJc3RhdHVzID0gb2NmczJfam91cm5hbF9hY2Nlc3NfZHEoaGFuZGxlLCBzYl9kcW9wdChzYiktPmZpbGVzW3R5cGVdLAorCQkJb2QtPmRxX2NodW5rLT5xY19oZWFkZXJiaCwgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOworCWlmIChzdGF0dXMgPCAwKSB7CisJCW1sb2dfZXJybm8oc3RhdHVzKTsKKwkJZ290byBvdXQ7CisJfQorCW9mZnNldCA9IG9sX2RxYmxrX2NodW5rX29mZihzYiwgb2QtPmRxX2NodW5rLT5xY19udW0sCisJCQkJCSAgICAgb2QtPmRxX2xvY2FsX29mZik7CisJZGNodW5rID0gKHN0cnVjdCBvY2ZzMl9sb2NhbF9kaXNrX2NodW5rICopCisJCQkob2QtPmRxX2NodW5rLT5xY19oZWFkZXJiaC0+Yl9kYXRhKTsKKwkvKiBNYXJrIHN0cnVjdHVyZSBhcyBmcmVlZCAqLworCWxvY2tfYnVmZmVyKG9kLT5kcV9jaHVuay0+cWNfaGVhZGVyYmgpOworCW9jZnMyX2NsZWFyX2JpdChvZmZzZXQsIGRjaHVuay0+ZHFjX2JpdG1hcCk7CisJbGUzMl9hZGRfY3B1KCZkY2h1bmstPmRxY19mcmVlLCAxKTsKKwl1bmxvY2tfYnVmZmVyKG9kLT5kcV9jaHVuay0+cWNfaGVhZGVyYmgpOworCXN0YXR1cyA9IG9jZnMyX2pvdXJuYWxfZGlydHkoaGFuZGxlLCBvZC0+ZHFfY2h1bmstPnFjX2hlYWRlcmJoKTsKKwlpZiAoc3RhdHVzIDwgMCkgeworCQltbG9nX2Vycm5vKHN0YXR1cyk7CisJCWdvdG8gb3V0OworCX0KKwlzdGF0dXMgPSAwOworb3V0OgorCS8qIENsZWFyIHRoZSByZWFkIGJpdCBzbyB0aGF0IG5leHQgdGltZSBzb21lb25lIHVzZXMgdGhpcworCSAqIGRxdW90IGhlIHJlYWRzIGZyZXNoIGluZm8gZnJvbSBkaXNrIGFuZCBhbGxvY2F0ZXMgbG9jYWwKKwkgKiBkcXVvdCBzdHJ1Y3R1cmUgKi8KKwljbGVhcl9iaXQoRFFfUkVBRF9CLCAmZHF1b3QtPmRxX2ZsYWdzKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgc3RydWN0IHF1b3RhX2Zvcm1hdF9vcHMgb2NmczJfZm9ybWF0X29wcyA9IHsKKwkuY2hlY2tfcXVvdGFfZmlsZQk9IG9jZnMyX2xvY2FsX2NoZWNrX3F1b3RhX2ZpbGUsCisJLnJlYWRfZmlsZV9pbmZvCQk9IG9jZnMyX2xvY2FsX3JlYWRfaW5mbywKKwkud3JpdGVfZmlsZV9pbmZvCT0gb2NmczJfZ2xvYmFsX3dyaXRlX2luZm8sCisJLmZyZWVfZmlsZV9pbmZvCQk9IG9jZnMyX2xvY2FsX2ZyZWVfaW5mbywKKwkucmVhZF9kcWJsawkJPSBvY2ZzMl9sb2NhbF9yZWFkX2RxdW90LAorCS5jb21taXRfZHFibGsJCT0gb2NmczJfbG9jYWxfd3JpdGVfZHF1b3QsCisJLnJlbGVhc2VfZHFibGsJCT0gb2NmczJfbG9jYWxfcmVsZWFzZV9kcXVvdCwKK307CisKK3N0cnVjdCBxdW90YV9mb3JtYXRfdHlwZSBvY2ZzMl9xdW90YV9mb3JtYXQgPSB7CisJLnFmX2ZtdF9pZCA9IFFGTVRfT0NGUzIsCisJLnFmX29wcyA9ICZvY2ZzMl9mb3JtYXRfb3BzLAorCS5xZl9vd25lciA9IFRISVNfTU9EVUxFCit9OwpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvcmVzaXplLmMgYi9mcy9vY2ZzMi9yZXNpemUuYwppbmRleCBmZmQ0OGRiLi40MjRhZGFhIDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9yZXNpemUuYworKysgYi9mcy9vY2ZzMi9yZXNpemUuYwpAQCAtMTA2LDggKzEwNiw4IEBACiAJbWxvZ19lbnRyeSgiKG5ld19jbHVzdGVycz0lZCwgZmlyc3RfbmV3X2NsdXN0ZXIgPSAldSlcbiIsCiAJCSAgIG5ld19jbHVzdGVycywgZmlyc3RfbmV3X2NsdXN0ZXIpOwogCi0JcmV0ID0gb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBibV9pbm9kZSwgZ3JvdXBfYmgsCi0JCQkJICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOworCXJldCA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzX2dkKGhhbmRsZSwgYm1faW5vZGUsIGdyb3VwX2JoLAorCQkJCSAgICAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKIAlpZiAocmV0IDwgMCkgewogCQltbG9nX2Vycm5vKHJldCk7CiAJCWdvdG8gb3V0OwpAQCAtMTQxLDggKzE0MSw4IEBACiAJfQogCiAJLyogdXBkYXRlIHRoZSBpbm9kZSBhY2NvcmRpbmdseS4gKi8KLQlyZXQgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGJtX2lub2RlLCBibV9iaCwKLQkJCQkgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CisJcmV0ID0gb2NmczJfam91cm5hbF9hY2Nlc3NfZGkoaGFuZGxlLCBibV9pbm9kZSwgYm1fYmgsCisJCQkJICAgICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOwogCWlmIChyZXQgPCAwKSB7CiAJCW1sb2dfZXJybm8ocmV0KTsKIAkJZ290byBvdXRfcm9sbGJhY2s7CkBAIC0zMTQsNiArMzE0LDEwIEBACiAKIAlmZSA9IChzdHJ1Y3Qgb2NmczJfZGlub2RlICopbWFpbl9ibV9iaC0+Yl9kYXRhOwogCisJLyogbWFpbl9ibV9iaCBpcyB2YWxpZGF0ZWQgYnkgaW5vZGUgcmVhZCBpbnNpZGUgb2NmczJfaW5vZGVfbG9jaygpLAorCSAqIHNvIGFueSBjb3JydXB0aW9uIGlzIGEgY29kZSBidWcuICovCisJQlVHX09OKCFPQ0ZTMl9JU19WQUxJRF9ESU5PREUoZmUpKTsKKwogCWlmIChsZTE2X3RvX2NwdShmZS0+aWQyLmlfY2hhaW4uY2xfY3BnKSAhPQogCQkJCSBvY2ZzMl9ncm91cF9iaXRtYXBfc2l6ZShvc2ItPnNiKSAqIDgpIHsKIAkJbWxvZyhNTF9FUlJPUiwgIlRoZSBkaXNrIGlzIHRvbyBvbGQgYW5kIHNtYWxsLiAiCkBAIC0zMjIsMzAgKzMyNiwxOCBAQAogCQlnb3RvIG91dF91bmxvY2s7CiAJfQogCi0JaWYgKCFPQ0ZTMl9JU19WQUxJRF9ESU5PREUoZmUpKSB7Ci0JCU9DRlMyX1JPX09OX0lOVkFMSURfRElOT0RFKG1haW5fYm1faW5vZGUtPmlfc2IsIGZlKTsKLQkJcmV0ID0gLUVJTzsKLQkJZ290byBvdXRfdW5sb2NrOwotCX0KLQogCWZpcnN0X25ld19jbHVzdGVyID0gbGUzMl90b19jcHUoZmUtPmlfY2x1c3RlcnMpOwogCWxnZF9ibGtubyA9IG9jZnMyX3doaWNoX2NsdXN0ZXJfZ3JvdXAobWFpbl9ibV9pbm9kZSwKIAkJCQkJICAgICAgZmlyc3RfbmV3X2NsdXN0ZXIgLSAxKTsKIAotCXJldCA9IG9jZnMyX3JlYWRfYmxvY2sobWFpbl9ibV9pbm9kZSwgbGdkX2Jsa25vLCAmZ3JvdXBfYmgpOworCXJldCA9IG9jZnMyX3JlYWRfZ3JvdXBfZGVzY3JpcHRvcihtYWluX2JtX2lub2RlLCBmZSwgbGdkX2Jsa25vLAorCQkJCQkgICZncm91cF9iaCk7CiAJaWYgKHJldCA8IDApIHsKIAkJbWxvZ19lcnJubyhyZXQpOwogCQlnb3RvIG91dF91bmxvY2s7CiAJfQotCiAJZ3JvdXAgPSAoc3RydWN0IG9jZnMyX2dyb3VwX2Rlc2MgKilncm91cF9iaC0+Yl9kYXRhOwogCi0JcmV0ID0gb2NmczJfY2hlY2tfZ3JvdXBfZGVzY3JpcHRvcihpbm9kZS0+aV9zYiwgZmUsIGdyb3VwKTsKLQlpZiAocmV0KSB7Ci0JCW1sb2dfZXJybm8ocmV0KTsKLQkJZ290byBvdXRfdW5sb2NrOwotCX0KLQogCWNsX2JwYyA9IGxlMTZfdG9fY3B1KGZlLT5pZDIuaV9jaGFpbi5jbF9icGMpOwogCWlmIChsZTE2X3RvX2NwdShncm91cC0+YmdfYml0cykgLyBjbF9icGMgKyBuZXdfY2x1c3RlcnMgPgogCQlsZTE2X3RvX2NwdShmZS0+aWQyLmlfY2hhaW4uY2xfY3BnKSkgewpAQCAtMzk4LDQxICszOTAsMTYgQEAKIAkJCQkgc3RydWN0IGJ1ZmZlcl9oZWFkICpncm91cF9iaCkKIHsKIAlpbnQgcmV0OwotCXN0cnVjdCBvY2ZzMl9ncm91cF9kZXNjICpnZDsKKwlzdHJ1Y3Qgb2NmczJfZ3JvdXBfZGVzYyAqZ2QgPQorCQkoc3RydWN0IG9jZnMyX2dyb3VwX2Rlc2MgKilncm91cF9iaC0+Yl9kYXRhOwogCXUxNiBjbF9icGMgPSBsZTE2X3RvX2NwdShkaS0+aWQyLmlfY2hhaW4uY2xfYnBjKTsKLQl1bnNpZ25lZCBpbnQgbWF4X2JpdHMgPSBsZTE2X3RvX2NwdShkaS0+aWQyLmlfY2hhaW4uY2xfY3BnKSAqCi0JCQkJbGUxNl90b19jcHUoZGktPmlkMi5pX2NoYWluLmNsX2JwYyk7CiAKKwlyZXQgPSBvY2ZzMl9jaGVja19ncm91cF9kZXNjcmlwdG9yKGlub2RlLT5pX3NiLCBkaSwgZ3JvdXBfYmgpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OwogCi0JZ2QgPSAoc3RydWN0IG9jZnMyX2dyb3VwX2Rlc2MgKilncm91cF9iaC0+Yl9kYXRhOwotCi0JcmV0ID0gLUVJTzsKLQlpZiAoIU9DRlMyX0lTX1ZBTElEX0dST1VQX0RFU0MoZ2QpKQotCQltbG9nKE1MX0VSUk9SLCAiR3JvdXAgZGVzY3JpcHRvciAjICVsbHUgaXNuJ3QgdmFsaWQuXG4iLAotCQkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpbGU2NF90b19jcHUoZ2QtPmJnX2Jsa25vKSk7Ci0JZWxzZSBpZiAoZGktPmlfYmxrbm8gIT0gZ2QtPmJnX3BhcmVudF9kaW5vZGUpCi0JCW1sb2coTUxfRVJST1IsICJHcm91cCBkZXNjcmlwdG9yICMgJWxsdSBoYXMgYmFkIHBhcmVudCAiCi0JCSAgICAgInBvaW50ZXIgKCVsbHUsIGV4cGVjdGVkICVsbHUpXG4iLAotCQkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpbGU2NF90b19jcHUoZ2QtPmJnX2Jsa25vKSwKLQkJICAgICAodW5zaWduZWQgbG9uZyBsb25nKWxlNjRfdG9fY3B1KGdkLT5iZ19wYXJlbnRfZGlub2RlKSwKLQkJICAgICAodW5zaWduZWQgbG9uZyBsb25nKWxlNjRfdG9fY3B1KGRpLT5pX2Jsa25vKSk7Ci0JZWxzZSBpZiAobGUxNl90b19jcHUoZ2QtPmJnX2JpdHMpID4gbWF4X2JpdHMpCi0JCW1sb2coTUxfRVJST1IsICJHcm91cCBkZXNjcmlwdG9yICMgJWxsdSBoYXMgYml0IGNvdW50IG9mICV1XG4iLAotCQkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpbGU2NF90b19jcHUoZ2QtPmJnX2Jsa25vKSwKLQkJICAgICBsZTE2X3RvX2NwdShnZC0+YmdfYml0cykpOwotCWVsc2UgaWYgKGxlMTZfdG9fY3B1KGdkLT5iZ19mcmVlX2JpdHNfY291bnQpID4gbGUxNl90b19jcHUoZ2QtPmJnX2JpdHMpKQotCQltbG9nKE1MX0VSUk9SLCAiR3JvdXAgZGVzY3JpcHRvciAjICVsbHUgaGFzIGJpdCBjb3VudCAldSBidXQgIgotCQkgICAgICJjbGFpbXMgdGhhdCAldSBhcmUgZnJlZVxuIiwKLQkJICAgICAodW5zaWduZWQgbG9uZyBsb25nKWxlNjRfdG9fY3B1KGdkLT5iZ19ibGtubyksCi0JCSAgICAgbGUxNl90b19jcHUoZ2QtPmJnX2JpdHMpLAotCQkgICAgIGxlMTZfdG9fY3B1KGdkLT5iZ19mcmVlX2JpdHNfY291bnQpKTsKLQllbHNlIGlmIChsZTE2X3RvX2NwdShnZC0+YmdfYml0cykgPiAoOCAqIGxlMTZfdG9fY3B1KGdkLT5iZ19zaXplKSkpCi0JCW1sb2coTUxfRVJST1IsICJHcm91cCBkZXNjcmlwdG9yICMgJWxsdSBoYXMgYml0IGNvdW50ICV1IGJ1dCAiCi0JCSAgICAgIm1heCBiaXRtYXAgYml0cyBvZiAldVxuIiwKLQkJICAgICAodW5zaWduZWQgbG9uZyBsb25nKWxlNjRfdG9fY3B1KGdkLT5iZ19ibGtubyksCi0JCSAgICAgbGUxNl90b19jcHUoZ2QtPmJnX2JpdHMpLAotCQkgICAgIDggKiBsZTE2X3RvX2NwdShnZC0+Ymdfc2l6ZSkpOwotCWVsc2UgaWYgKGxlMTZfdG9fY3B1KGdkLT5iZ19jaGFpbikgIT0gaW5wdXQtPmNoYWluKQorCXJldCA9IC1FSU5WQUw7CisJaWYgKGxlMTZfdG9fY3B1KGdkLT5iZ19jaGFpbikgIT0gaW5wdXQtPmNoYWluKQogCQltbG9nKE1MX0VSUk9SLCAiR3JvdXAgZGVzY3JpcHRvciAjICVsbHUgaGFzIGJhZCBjaGFpbiAldSAiCiAJCSAgICAgIndoaWxlIGlucHV0IGhhcyAldSBzZXQuXG4iLAogCQkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpbGU2NF90b19jcHUoZ2QtPmJnX2Jsa25vKSwKQEAgLTQ1MSw2ICs0MTgsNyBAQAogCWVsc2UKIAkJcmV0ID0gMDsKIAorb3V0OgogCXJldHVybiByZXQ7CiB9CiAKQEAgLTU2OCw4ICs1MzYsOCBAQAogCWNsID0gJmZlLT5pZDIuaV9jaGFpbjsKIAljciA9ICZjbC0+Y2xfcmVjc1tpbnB1dC0+Y2hhaW5dOwogCi0JcmV0ID0gb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBtYWluX2JtX2lub2RlLCBncm91cF9iaCwKLQkJCQkgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CisJcmV0ID0gb2NmczJfam91cm5hbF9hY2Nlc3NfZ2QoaGFuZGxlLCBtYWluX2JtX2lub2RlLCBncm91cF9iaCwKKwkJCQkgICAgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CiAJaWYgKHJldCA8IDApIHsKIAkJbWxvZ19lcnJubyhyZXQpOwogCQlnb3RvIG91dF9jb21taXQ7CkBAIC01ODQsOCArNTUyLDggQEAKIAkJZ290byBvdXRfY29tbWl0OwogCX0KIAotCXJldCA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgbWFpbl9ibV9pbm9kZSwgbWFpbl9ibV9iaCwKLQkJCQkgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CisJcmV0ID0gb2NmczJfam91cm5hbF9hY2Nlc3NfZGkoaGFuZGxlLCBtYWluX2JtX2lub2RlLCBtYWluX2JtX2JoLAorCQkJCSAgICAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKIAlpZiAocmV0IDwgMCkgewogCQltbG9nX2Vycm5vKHJldCk7CiAJCWdvdG8gb3V0X2NvbW1pdDsKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL3Nsb3RfbWFwLmMgYi9mcy9vY2ZzMi9zbG90X21hcC5jCmluZGV4IGJkZGEyZDguLjQwNjYxZTcgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL3Nsb3RfbWFwLmMKKysrIGIvZnMvb2NmczIvc2xvdF9tYXAuYwpAQCAtMTUxLDcgKzE1MSw3IEBACiAJICogdGhpcyBpcyBub3QgdHJ1ZSwgdGhlIHJlYWQgb2YgLTEgKFVJTlQ2NF9NQVgpIHdpbGwgZmFpbC4KIAkgKi8KIAlyZXQgPSBvY2ZzMl9yZWFkX2Jsb2NrcyhzaS0+c2lfaW5vZGUsIC0xLCBzaS0+c2lfYmxvY2tzLCBzaS0+c2lfYmgsCi0JCQkJT0NGUzJfQkhfSUdOT1JFX0NBQ0hFKTsKKwkJCQlPQ0ZTMl9CSF9JR05PUkVfQ0FDSEUsIE5VTEwpOwogCWlmIChyZXQgPT0gMCkgewogCQlzcGluX2xvY2soJm9zYi0+b3NiX2xvY2spOwogCQlvY2ZzMl91cGRhdGVfc2xvdF9pbmZvKHNpKTsKQEAgLTQwNSw3ICs0MDUsNyBAQAogCiAJCWJoID0gTlVMTDsgIC8qIEFjcXVpcmUgYSBmcmVzaCBiaCAqLwogCQlzdGF0dXMgPSBvY2ZzMl9yZWFkX2Jsb2NrcyhzaS0+c2lfaW5vZGUsIGJsa25vLCAxLCAmYmgsCi0JCQkJCSAgIE9DRlMyX0JIX0lHTk9SRV9DQUNIRSk7CisJCQkJCSAgIE9DRlMyX0JIX0lHTk9SRV9DQUNIRSwgTlVMTCk7CiAJCWlmIChzdGF0dXMgPCAwKSB7CiAJCQltbG9nX2Vycm5vKHN0YXR1cyk7CiAJCQlnb3RvIGJhaWw7CmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9zdWJhbGxvYy5jIGIvZnMvb2NmczIvc3ViYWxsb2MuYwppbmRleCBjNWZmMThiLi5hNjk2Mjg2IDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9zdWJhbGxvYy5jCisrKyBiL2ZzL29jZnMyL3N1YmFsbG9jLmMKQEAgLTM1LDYgKzM1LDcgQEAKICNpbmNsdWRlICJvY2ZzMi5oIgogCiAjaW5jbHVkZSAiYWxsb2MuaCIKKyNpbmNsdWRlICJibG9ja2NoZWNrLmgiCiAjaW5jbHVkZSAiZGxtZ2x1ZS5oIgogI2luY2x1ZGUgImlub2RlLmgiCiAjaW5jbHVkZSAiam91cm5hbC5oIgpAQCAtMTQ1LDY0ICsxNDYsMTg1IEBACiAJcmV0dXJuICh1MzIpbGUxNl90b19jcHUoY2wtPmNsX2NwZykgKiAodTMyKWxlMTZfdG9fY3B1KGNsLT5jbF9icGMpOwogfQogCi0vKiBzb21ld2hhdCBtb3JlIGV4cGVuc2l2ZSB0aGFuIG91ciBvdGhlciBjaGVja3MsIHNvIHVzZSBzcGFyaW5nbHkuICovCi1pbnQgb2NmczJfY2hlY2tfZ3JvdXBfZGVzY3JpcHRvcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAotCQkJCSBzdHJ1Y3Qgb2NmczJfZGlub2RlICpkaSwKLQkJCQkgc3RydWN0IG9jZnMyX2dyb3VwX2Rlc2MgKmdkKQorI2RlZmluZSBkb19lcnJvcihmbXQsIC4uLikJCQkJCQlcCisJZG97CQkJCQkJCQlcCisJCWlmIChjbGVhbl9lcnJvcikJCQkJCVwKKwkJCW1sb2coTUxfRVJST1IsIGZtdCAiXG4iLCAjI19fVkFfQVJHU19fKTsJXAorCQllbHNlCQkJCQkJCVwKKwkJCW9jZnMyX2Vycm9yKHNiLCBmbXQsICMjX19WQV9BUkdTX18pOwkJXAorCX0gd2hpbGUgKDApCisKK3N0YXRpYyBpbnQgb2NmczJfdmFsaWRhdGVfZ2Rfc2VsZihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQkJCSAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwKKwkJCQkgIGludCBjbGVhbl9lcnJvcikKIHsKLQl1bnNpZ25lZCBpbnQgbWF4X2JpdHM7CisJc3RydWN0IG9jZnMyX2dyb3VwX2Rlc2MgKmdkID0gKHN0cnVjdCBvY2ZzMl9ncm91cF9kZXNjICopYmgtPmJfZGF0YTsKIAogCWlmICghT0NGUzJfSVNfVkFMSURfR1JPVVBfREVTQyhnZCkpIHsKLQkJT0NGUzJfUk9fT05fSU5WQUxJRF9HUk9VUF9ERVNDKHNiLCBnZCk7Ci0JCXJldHVybiAtRUlPOworCQlkb19lcnJvcigiR3JvdXAgZGVzY3JpcHRvciAjJWxsdSBoYXMgYmFkIHNpZ25hdHVyZSAlLipzIiwKKwkJCSAodW5zaWduZWQgbG9uZyBsb25nKWJoLT5iX2Jsb2NrbnIsIDcsCisJCQkgZ2QtPmJnX3NpZ25hdHVyZSk7CisJCXJldHVybiAtRUlOVkFMOwogCX0KIAorCWlmIChsZTY0X3RvX2NwdShnZC0+YmdfYmxrbm8pICE9IGJoLT5iX2Jsb2NrbnIpIHsKKwkJZG9fZXJyb3IoIkdyb3VwIGRlc2NyaXB0b3IgIyVsbHUgaGFzIGFuIGludmFsaWQgYmdfYmxrbm8gIgorCQkJICJvZiAlbGx1IiwKKwkJCSAodW5zaWduZWQgbG9uZyBsb25nKWJoLT5iX2Jsb2NrbnIsCisJCQkgKHVuc2lnbmVkIGxvbmcgbG9uZylsZTY0X3RvX2NwdShnZC0+YmdfYmxrbm8pKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGxlMzJfdG9fY3B1KGdkLT5iZ19nZW5lcmF0aW9uKSAhPSBPQ0ZTMl9TQihzYiktPmZzX2dlbmVyYXRpb24pIHsKKwkJZG9fZXJyb3IoIkdyb3VwIGRlc2NyaXB0b3IgIyVsbHUgaGFzIGFuIGludmFsaWQgIgorCQkJICJmc19nZW5lcmF0aW9uIG9mICMldSIsCisJCQkgKHVuc2lnbmVkIGxvbmcgbG9uZyliaC0+Yl9ibG9ja25yLAorCQkJIGxlMzJfdG9fY3B1KGdkLT5iZ19nZW5lcmF0aW9uKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChsZTE2X3RvX2NwdShnZC0+YmdfZnJlZV9iaXRzX2NvdW50KSA+IGxlMTZfdG9fY3B1KGdkLT5iZ19iaXRzKSkgeworCQlkb19lcnJvcigiR3JvdXAgZGVzY3JpcHRvciAjJWxsdSBoYXMgYml0IGNvdW50ICV1IGJ1dCAiCisJCQkgImNsYWltcyB0aGF0ICV1IGFyZSBmcmVlIiwKKwkJCSAodW5zaWduZWQgbG9uZyBsb25nKWJoLT5iX2Jsb2NrbnIsCisJCQkgbGUxNl90b19jcHUoZ2QtPmJnX2JpdHMpLAorCQkJIGxlMTZfdG9fY3B1KGdkLT5iZ19mcmVlX2JpdHNfY291bnQpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGxlMTZfdG9fY3B1KGdkLT5iZ19iaXRzKSA+ICg4ICogbGUxNl90b19jcHUoZ2QtPmJnX3NpemUpKSkgeworCQlkb19lcnJvcigiR3JvdXAgZGVzY3JpcHRvciAjJWxsdSBoYXMgYml0IGNvdW50ICV1IGJ1dCAiCisJCQkgIm1heCBiaXRtYXAgYml0cyBvZiAldSIsCisJCQkgKHVuc2lnbmVkIGxvbmcgbG9uZyliaC0+Yl9ibG9ja25yLAorCQkJIGxlMTZfdG9fY3B1KGdkLT5iZ19iaXRzKSwKKwkJCSA4ICogbGUxNl90b19jcHUoZ2QtPmJnX3NpemUpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb2NmczJfdmFsaWRhdGVfZ2RfcGFyZW50KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCQkJICAgIHN0cnVjdCBvY2ZzMl9kaW5vZGUgKmRpLAorCQkJCSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLAorCQkJCSAgICBpbnQgY2xlYW5fZXJyb3IpCit7CisJdW5zaWduZWQgaW50IG1heF9iaXRzOworCXN0cnVjdCBvY2ZzMl9ncm91cF9kZXNjICpnZCA9IChzdHJ1Y3Qgb2NmczJfZ3JvdXBfZGVzYyAqKWJoLT5iX2RhdGE7CisKIAlpZiAoZGktPmlfYmxrbm8gIT0gZ2QtPmJnX3BhcmVudF9kaW5vZGUpIHsKLQkJb2NmczJfZXJyb3Ioc2IsICJHcm91cCBkZXNjcmlwdG9yICMgJWxsdSBoYXMgYmFkIHBhcmVudCAiCi0JCQkgICAgInBvaW50ZXIgKCVsbHUsIGV4cGVjdGVkICVsbHUpIiwKLQkJCSAgICAodW5zaWduZWQgbG9uZyBsb25nKWxlNjRfdG9fY3B1KGdkLT5iZ19ibGtubyksCi0JCQkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylsZTY0X3RvX2NwdShnZC0+YmdfcGFyZW50X2Rpbm9kZSksCi0JCQkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylsZTY0X3RvX2NwdShkaS0+aV9ibGtubykpOwotCQlyZXR1cm4gLUVJTzsKKwkJZG9fZXJyb3IoIkdyb3VwIGRlc2NyaXB0b3IgIyVsbHUgaGFzIGJhZCBwYXJlbnQgIgorCQkJICJwb2ludGVyICglbGx1LCBleHBlY3RlZCAlbGx1KSIsCisJCQkgKHVuc2lnbmVkIGxvbmcgbG9uZyliaC0+Yl9ibG9ja25yLAorCQkJICh1bnNpZ25lZCBsb25nIGxvbmcpbGU2NF90b19jcHUoZ2QtPmJnX3BhcmVudF9kaW5vZGUpLAorCQkJICh1bnNpZ25lZCBsb25nIGxvbmcpbGU2NF90b19jcHUoZGktPmlfYmxrbm8pKTsKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJbWF4X2JpdHMgPSBsZTE2X3RvX2NwdShkaS0+aWQyLmlfY2hhaW4uY2xfY3BnKSAqIGxlMTZfdG9fY3B1KGRpLT5pZDIuaV9jaGFpbi5jbF9icGMpOwogCWlmIChsZTE2X3RvX2NwdShnZC0+YmdfYml0cykgPiBtYXhfYml0cykgewotCQlvY2ZzMl9lcnJvcihzYiwgIkdyb3VwIGRlc2NyaXB0b3IgIyAlbGx1IGhhcyBiaXQgY291bnQgb2YgJXUiLAotCQkJICAgICh1bnNpZ25lZCBsb25nIGxvbmcpbGU2NF90b19jcHUoZ2QtPmJnX2Jsa25vKSwKLQkJCSAgICBsZTE2X3RvX2NwdShnZC0+YmdfYml0cykpOwotCQlyZXR1cm4gLUVJTzsKKwkJZG9fZXJyb3IoIkdyb3VwIGRlc2NyaXB0b3IgIyVsbHUgaGFzIGJpdCBjb3VudCBvZiAldSIsCisJCQkgKHVuc2lnbmVkIGxvbmcgbG9uZyliaC0+Yl9ibG9ja25yLAorCQkJIGxlMTZfdG9fY3B1KGdkLT5iZ19iaXRzKSk7CisJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCWlmIChsZTE2X3RvX2NwdShnZC0+YmdfY2hhaW4pID49CiAJICAgIGxlMTZfdG9fY3B1KGRpLT5pZDIuaV9jaGFpbi5jbF9uZXh0X2ZyZWVfcmVjKSkgewotCQlvY2ZzMl9lcnJvcihzYiwgIkdyb3VwIGRlc2NyaXB0b3IgIyAlbGx1IGhhcyBiYWQgY2hhaW4gJXUiLAotCQkJICAgICh1bnNpZ25lZCBsb25nIGxvbmcpbGU2NF90b19jcHUoZ2QtPmJnX2Jsa25vKSwKLQkJCSAgICBsZTE2X3RvX2NwdShnZC0+YmdfY2hhaW4pKTsKLQkJcmV0dXJuIC1FSU87Ci0JfQotCi0JaWYgKGxlMTZfdG9fY3B1KGdkLT5iZ19mcmVlX2JpdHNfY291bnQpID4gbGUxNl90b19jcHUoZ2QtPmJnX2JpdHMpKSB7Ci0JCW9jZnMyX2Vycm9yKHNiLCAiR3JvdXAgZGVzY3JpcHRvciAjICVsbHUgaGFzIGJpdCBjb3VudCAldSBidXQgIgotCQkJICAgICJjbGFpbXMgdGhhdCAldSBhcmUgZnJlZSIsCi0JCQkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylsZTY0X3RvX2NwdShnZC0+YmdfYmxrbm8pLAotCQkJICAgIGxlMTZfdG9fY3B1KGdkLT5iZ19iaXRzKSwKLQkJCSAgICBsZTE2X3RvX2NwdShnZC0+YmdfZnJlZV9iaXRzX2NvdW50KSk7Ci0JCXJldHVybiAtRUlPOwotCX0KLQotCWlmIChsZTE2X3RvX2NwdShnZC0+YmdfYml0cykgPiAoOCAqIGxlMTZfdG9fY3B1KGdkLT5iZ19zaXplKSkpIHsKLQkJb2NmczJfZXJyb3Ioc2IsICJHcm91cCBkZXNjcmlwdG9yICMgJWxsdSBoYXMgYml0IGNvdW50ICV1IGJ1dCAiCi0JCQkgICAgIm1heCBiaXRtYXAgYml0cyBvZiAldSIsCi0JCQkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylsZTY0X3RvX2NwdShnZC0+YmdfYmxrbm8pLAotCQkJICAgIGxlMTZfdG9fY3B1KGdkLT5iZ19iaXRzKSwKLQkJCSAgICA4ICogbGUxNl90b19jcHUoZ2QtPmJnX3NpemUpKTsKLQkJcmV0dXJuIC1FSU87CisJCWRvX2Vycm9yKCJHcm91cCBkZXNjcmlwdG9yICMlbGx1IGhhcyBiYWQgY2hhaW4gJXUiLAorCQkJICh1bnNpZ25lZCBsb25nIGxvbmcpYmgtPmJfYmxvY2tuciwKKwkJCSBsZTE2X3RvX2NwdShnZC0+YmdfY2hhaW4pKTsKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJcmV0dXJuIDA7CiB9CiAKKyN1bmRlZiBkb19lcnJvcgorCisvKgorICogVGhpcyB2ZXJzaW9uIG9ubHkgcHJpbnRzIGVycm9ycy4gIEl0IGRvZXMgbm90IGZhaWwgdGhlIGZpbGVzeXN0ZW0sIGFuZAorICogZXhpc3RzIG9ubHkgZm9yIHJlc2l6ZS4KKyAqLworaW50IG9jZnMyX2NoZWNrX2dyb3VwX2Rlc2NyaXB0b3Ioc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJCQkgc3RydWN0IG9jZnMyX2Rpbm9kZSAqZGksCisJCQkJIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCit7CisJaW50IHJjOworCXN0cnVjdCBvY2ZzMl9ncm91cF9kZXNjICpnZCA9IChzdHJ1Y3Qgb2NmczJfZ3JvdXBfZGVzYyAqKWJoLT5iX2RhdGE7CisKKwlCVUdfT04oIWJ1ZmZlcl91cHRvZGF0ZShiaCkpOworCisJLyoKKwkgKiBJZiB0aGUgZWNjIGZhaWxzLCB3ZSByZXR1cm4gdGhlIGVycm9yIGJ1dCBvdGhlcndpc2UKKwkgKiBsZWF2ZSB0aGUgZmlsZXN5c3RlbSBydW5uaW5nLiAgV2Uga25vdyBhbnkgZXJyb3IgaXMKKwkgKiBsb2NhbCB0byB0aGlzIGJsb2NrLgorCSAqLworCXJjID0gb2NmczJfdmFsaWRhdGVfbWV0YV9lY2Moc2IsIGJoLT5iX2RhdGEsICZnZC0+YmdfY2hlY2spOworCWlmIChyYykgeworCQltbG9nKE1MX0VSUk9SLAorCQkgICAgICJDaGVja3N1bSBmYWlsZWQgZm9yIGdyb3VwIGRlc2NyaXB0b3IgJWxsdVxuIiwKKwkJICAgICAodW5zaWduZWQgbG9uZyBsb25nKWJoLT5iX2Jsb2NrbnIpOworCX0gZWxzZQorCQlyYyA9IG9jZnMyX3ZhbGlkYXRlX2dkX3NlbGYoc2IsIGJoLCAxKTsKKwlpZiAoIXJjKQorCQlyYyA9IG9jZnMyX3ZhbGlkYXRlX2dkX3BhcmVudChzYiwgZGksIGJoLCAxKTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBvY2ZzMl92YWxpZGF0ZV9ncm91cF9kZXNjcmlwdG9yKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCQkJCSAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCit7CisJaW50IHJjOworCXN0cnVjdCBvY2ZzMl9ncm91cF9kZXNjICpnZCA9IChzdHJ1Y3Qgb2NmczJfZ3JvdXBfZGVzYyAqKWJoLT5iX2RhdGE7CisKKwltbG9nKDAsICJWYWxpZGF0aW5nIGdyb3VwIGRlc2NyaXB0b3IgJWxsdVxuIiwKKwkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpYmgtPmJfYmxvY2tucik7CisKKwlCVUdfT04oIWJ1ZmZlcl91cHRvZGF0ZShiaCkpOworCisJLyoKKwkgKiBJZiB0aGUgZWNjIGZhaWxzLCB3ZSByZXR1cm4gdGhlIGVycm9yIGJ1dCBvdGhlcndpc2UKKwkgKiBsZWF2ZSB0aGUgZmlsZXN5c3RlbSBydW5uaW5nLiAgV2Uga25vdyBhbnkgZXJyb3IgaXMKKwkgKiBsb2NhbCB0byB0aGlzIGJsb2NrLgorCSAqLworCXJjID0gb2NmczJfdmFsaWRhdGVfbWV0YV9lY2Moc2IsIGJoLT5iX2RhdGEsICZnZC0+YmdfY2hlY2spOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJLyoKKwkgKiBFcnJvcnMgYWZ0ZXIgaGVyZSBhcmUgZmF0YWwuCisJICovCisKKwlyZXR1cm4gb2NmczJfdmFsaWRhdGVfZ2Rfc2VsZihzYiwgYmgsIDApOworfQorCitpbnQgb2NmczJfcmVhZF9ncm91cF9kZXNjcmlwdG9yKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBvY2ZzMl9kaW5vZGUgKmRpLAorCQkJCXU2NCBnZF9ibGtubywgc3RydWN0IGJ1ZmZlcl9oZWFkICoqYmgpCit7CisJaW50IHJjOworCXN0cnVjdCBidWZmZXJfaGVhZCAqdG1wID0gKmJoOworCisJcmMgPSBvY2ZzMl9yZWFkX2Jsb2NrKGlub2RlLCBnZF9ibGtubywgJnRtcCwKKwkJCSAgICAgIG9jZnMyX3ZhbGlkYXRlX2dyb3VwX2Rlc2NyaXB0b3IpOworCWlmIChyYykKKwkJZ290byBvdXQ7CisKKwlyYyA9IG9jZnMyX3ZhbGlkYXRlX2dkX3BhcmVudChpbm9kZS0+aV9zYiwgZGksIHRtcCwgMCk7CisJaWYgKHJjKSB7CisJCWJyZWxzZSh0bXApOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBJZiBvY2ZzMl9yZWFkX2Jsb2NrKCkgZ290IHVzIGEgbmV3IGJoLCBwYXNzIGl0IHVwLiAqLworCWlmICghKmJoKQorCQkqYmggPSB0bXA7CisKK291dDoKKwlyZXR1cm4gcmM7Cit9CisKIHN0YXRpYyBpbnQgb2NmczJfYmxvY2tfZ3JvdXBfZmlsbChoYW5kbGVfdCAqaGFuZGxlLAogCQkJCSAgc3RydWN0IGlub2RlICphbGxvY19pbm9kZSwKIAkJCQkgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmdfYmgsCkBAIC0yMjUsMTAgKzM0NywxMCBAQAogCQlnb3RvIGJhaWw7CiAJfQogCi0Jc3RhdHVzID0gb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlLAotCQkJCSAgICAgIGFsbG9jX2lub2RlLAotCQkJCSAgICAgIGJnX2JoLAotCQkJCSAgICAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX0NSRUFURSk7CisJc3RhdHVzID0gb2NmczJfam91cm5hbF9hY2Nlc3NfZ2QoaGFuZGxlLAorCQkJCQkgYWxsb2NfaW5vZGUsCisJCQkJCSBiZ19iaCwKKwkJCQkJIE9DRlMyX0pPVVJOQUxfQUNDRVNTX0NSRUFURSk7CiAJaWYgKHN0YXR1cyA8IDApIHsKIAkJbWxvZ19lcnJubyhzdGF0dXMpOwogCQlnb3RvIGJhaWw7CkBAIC0zNTgsOCArNDgwLDggQEAKIAogCWJnID0gKHN0cnVjdCBvY2ZzMl9ncm91cF9kZXNjICopIGJnX2JoLT5iX2RhdGE7CiAKLQlzdGF0dXMgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGFsbG9jX2lub2RlLAotCQkJCSAgICAgIGJoLCBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CisJc3RhdHVzID0gb2NmczJfam91cm5hbF9hY2Nlc3NfZGkoaGFuZGxlLCBhbGxvY19pbm9kZSwKKwkJCQkJIGJoLCBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CiAJaWYgKHN0YXR1cyA8IDApIHsKIAkJbWxvZ19lcnJubyhzdGF0dXMpOwogCQlnb3RvIGJhaWw7CkBAIC00NDEsMTEgKzU2MywxMSBAQAogCWFjLT5hY19hbGxvY19zbG90ID0gc2xvdDsKIAogCWZlID0gKHN0cnVjdCBvY2ZzMl9kaW5vZGUgKikgYmgtPmJfZGF0YTsKLQlpZiAoIU9DRlMyX0lTX1ZBTElEX0RJTk9ERShmZSkpIHsKLQkJT0NGUzJfUk9fT05fSU5WQUxJRF9ESU5PREUoYWxsb2NfaW5vZGUtPmlfc2IsIGZlKTsKLQkJc3RhdHVzID0gLUVJTzsKLQkJZ290byBiYWlsOwotCX0KKworCS8qIFRoZSBiaCB3YXMgdmFsaWRhdGVkIGJ5IHRoZSBpbm9kZSByZWFkIGluc2lkZQorCSAqIG9jZnMyX2lub2RlX2xvY2soKS4gIEFueSBjb3JydXB0aW9uIGlzIGEgY29kZSBidWcuICovCisJQlVHX09OKCFPQ0ZTMl9JU19WQUxJRF9ESU5PREUoZmUpKTsKKwogCWlmICghKGZlLT5pX2ZsYWdzICYgY3B1X3RvX2xlMzIoT0NGUzJfQ0hBSU5fRkwpKSkgewogCQlvY2ZzMl9lcnJvcihhbGxvY19pbm9kZS0+aV9zYiwgIkludmFsaWQgY2hhaW4gYWxsb2NhdG9yICVsbHUiLAogCQkJICAgICh1bnNpZ25lZCBsb25nIGxvbmcpbGU2NF90b19jcHUoZmUtPmlfYmxrbm8pKTsKQEAgLTc5MCwxMCArOTEyLDkgQEAKIAlpbnQgb2Zmc2V0LCBzdGFydCwgZm91bmQsIHN0YXR1cyA9IDA7CiAJc3RydWN0IG9jZnMyX2dyb3VwX2Rlc2MgKmJnID0gKHN0cnVjdCBvY2ZzMl9ncm91cF9kZXNjICopIGJnX2JoLT5iX2RhdGE7CiAKLQlpZiAoIU9DRlMyX0lTX1ZBTElEX0dST1VQX0RFU0MoYmcpKSB7Ci0JCU9DRlMyX1JPX09OX0lOVkFMSURfR1JPVVBfREVTQyhvc2ItPnNiLCBiZyk7Ci0JCXJldHVybiAtRUlPOwotCX0KKwkvKiBDYWxsZXJzIGdvdCB0aGlzIGRlc2NyaXB0b3IgZnJvbQorCSAqIG9jZnMyX3JlYWRfZ3JvdXBfZGVzY3JpcHRvcigpLiAgQW55IGNvcnJ1cHRpb24gaXMgYSBjb2RlIGJ1Zy4gKi8KKwlCVUdfT04oIU9DRlMyX0lTX1ZBTElEX0dST1VQX0RFU0MoYmcpKTsKIAogCWZvdW5kID0gc3RhcnQgPSBiZXN0X29mZnNldCA9IGJlc3Rfc2l6ZSA9IDA7CiAJYml0bWFwID0gYmctPmJnX2JpdG1hcDsKQEAgLTg1OCwxMSArOTc5LDkgQEAKIAogCW1sb2dfZW50cnlfdm9pZCgpOwogCi0JaWYgKCFPQ0ZTMl9JU19WQUxJRF9HUk9VUF9ERVNDKGJnKSkgewotCQlPQ0ZTMl9ST19PTl9JTlZBTElEX0dST1VQX0RFU0MoYWxsb2NfaW5vZGUtPmlfc2IsIGJnKTsKLQkJc3RhdHVzID0gLUVJTzsKLQkJZ290byBiYWlsOwotCX0KKwkvKiBBbGwgY2FsbGVycyBnZXQgdGhlIGRlc2NyaXB0b3IgdmlhCisJICogb2NmczJfcmVhZF9ncm91cF9kZXNjcmlwdG9yKCkuICBBbnkgY29ycnVwdGlvbiBpcyBhIGNvZGUgYnVnLiAqLworCUJVR19PTighT0NGUzJfSVNfVkFMSURfR1JPVVBfREVTQyhiZykpOwogCUJVR19PTihsZTE2X3RvX2NwdShiZy0+YmdfZnJlZV9iaXRzX2NvdW50KSA8IG51bV9iaXRzKTsKIAogCW1sb2coMCwgImJsb2NrX2dyb3VwX3NldF9iaXRzOiBvZmYgPSAldSwgbnVtID0gJXVcbiIsIGJpdF9vZmYsCkBAIC04NzEsMTAgKzk5MCwxMCBAQAogCWlmIChvY2ZzMl9pc19jbHVzdGVyX2JpdG1hcChhbGxvY19pbm9kZSkpCiAJCWpvdXJuYWxfdHlwZSA9IE9DRlMyX0pPVVJOQUxfQUNDRVNTX1VORE87CiAKLQlzdGF0dXMgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsCi0JCQkJICAgICAgYWxsb2NfaW5vZGUsCi0JCQkJICAgICAgZ3JvdXBfYmgsCi0JCQkJICAgICAgam91cm5hbF90eXBlKTsKKwlzdGF0dXMgPSBvY2ZzMl9qb3VybmFsX2FjY2Vzc19nZChoYW5kbGUsCisJCQkJCSBhbGxvY19pbm9kZSwKKwkJCQkJIGdyb3VwX2JoLAorCQkJCQkgam91cm5hbF90eXBlKTsKIAlpZiAoc3RhdHVzIDwgMCkgewogCQltbG9nX2Vycm5vKHN0YXR1cyk7CiAJCWdvdG8gYmFpbDsKQEAgLTkzMSwyMSArMTA1MCwxMCBAQAogCXN0cnVjdCBvY2ZzMl9ncm91cF9kZXNjICpiZyA9IChzdHJ1Y3Qgb2NmczJfZ3JvdXBfZGVzYyAqKSBiZ19iaC0+Yl9kYXRhOwogCXN0cnVjdCBvY2ZzMl9ncm91cF9kZXNjICpwcmV2X2JnID0gKHN0cnVjdCBvY2ZzMl9ncm91cF9kZXNjICopIHByZXZfYmdfYmgtPmJfZGF0YTsKIAotCWlmICghT0NGUzJfSVNfVkFMSURfRElOT0RFKGZlKSkgewotCQlPQ0ZTMl9ST19PTl9JTlZBTElEX0RJTk9ERShhbGxvY19pbm9kZS0+aV9zYiwgZmUpOwotCQlzdGF0dXMgPSAtRUlPOwotCQlnb3RvIG91dDsKLQl9Ci0JaWYgKCFPQ0ZTMl9JU19WQUxJRF9HUk9VUF9ERVNDKGJnKSkgewotCQlPQ0ZTMl9ST19PTl9JTlZBTElEX0dST1VQX0RFU0MoYWxsb2NfaW5vZGUtPmlfc2IsIGJnKTsKLQkJc3RhdHVzID0gLUVJTzsKLQkJZ290byBvdXQ7Ci0JfQotCWlmICghT0NGUzJfSVNfVkFMSURfR1JPVVBfREVTQyhwcmV2X2JnKSkgewotCQlPQ0ZTMl9ST19PTl9JTlZBTElEX0dST1VQX0RFU0MoYWxsb2NfaW5vZGUtPmlfc2IsIHByZXZfYmcpOwotCQlzdGF0dXMgPSAtRUlPOwotCQlnb3RvIG91dDsKLQl9CisJLyogVGhlIGNhbGxlciBnb3QgdGhlc2UgZGVzY3JpcHRvcnMgZnJvbQorCSAqIG9jZnMyX3JlYWRfZ3JvdXBfZGVzY3JpcHRvcigpLiAgQW55IGNvcnJ1cHRpb24gaXMgYSBjb2RlIGJ1Zy4gKi8KKwlCVUdfT04oIU9DRlMyX0lTX1ZBTElEX0dST1VQX0RFU0MoYmcpKTsKKwlCVUdfT04oIU9DRlMyX0lTX1ZBTElEX0dST1VQX0RFU0MocHJldl9iZykpOwogCiAJbWxvZygwLCAiU3ViYWxsb2MgJWxsdSwgY2hhaW4gJXUsIG1vdmUgZ3JvdXAgJWxsdSB0byB0b3AsIHByZXYgPSAlbGx1XG4iLAogCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylsZTY0X3RvX2NwdShmZS0+aV9ibGtubyksIGNoYWluLApAQCAtOTU2LDggKzEwNjQsOCBAQAogCWJnX3B0ciA9IGxlNjRfdG9fY3B1KGJnLT5iZ19uZXh0X2dyb3VwKTsKIAlwcmV2X2JnX3B0ciA9IGxlNjRfdG9fY3B1KHByZXZfYmctPmJnX25leHRfZ3JvdXApOwogCi0Jc3RhdHVzID0gb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBhbGxvY19pbm9kZSwgcHJldl9iZ19iaCwKLQkJCQkgICAgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CisJc3RhdHVzID0gb2NmczJfam91cm5hbF9hY2Nlc3NfZ2QoaGFuZGxlLCBhbGxvY19pbm9kZSwgcHJldl9iZ19iaCwKKwkJCQkJIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKIAlpZiAoc3RhdHVzIDwgMCkgewogCQltbG9nX2Vycm5vKHN0YXR1cyk7CiAJCWdvdG8gb3V0X3JvbGxiYWNrOwpAQCAtOTcxLDggKzEwNzksOCBAQAogCQlnb3RvIG91dF9yb2xsYmFjazsKIAl9CiAKLQlzdGF0dXMgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGFsbG9jX2lub2RlLCBiZ19iaCwKLQkJCQkgICAgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CisJc3RhdHVzID0gb2NmczJfam91cm5hbF9hY2Nlc3NfZ2QoaGFuZGxlLCBhbGxvY19pbm9kZSwgYmdfYmgsCisJCQkJCSBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CiAJaWYgKHN0YXR1cyA8IDApIHsKIAkJbWxvZ19lcnJubyhzdGF0dXMpOwogCQlnb3RvIG91dF9yb2xsYmFjazsKQEAgLTk4Niw4ICsxMDk0LDggQEAKIAkJZ290byBvdXRfcm9sbGJhY2s7CiAJfQogCi0Jc3RhdHVzID0gb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBhbGxvY19pbm9kZSwgZmVfYmgsCi0JCQkJICAgICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOworCXN0YXR1cyA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzX2RpKGhhbmRsZSwgYWxsb2NfaW5vZGUsIGZlX2JoLAorCQkJCQkgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOwogCWlmIChzdGF0dXMgPCAwKSB7CiAJCW1sb2dfZXJybm8oc3RhdHVzKTsKIAkJZ290byBvdXRfcm9sbGJhY2s7CkBAIC0xMDA4LDcgKzExMTYsNyBAQAogCQliZy0+YmdfbmV4dF9ncm91cCA9IGNwdV90b19sZTY0KGJnX3B0cik7CiAJCXByZXZfYmctPmJnX25leHRfZ3JvdXAgPSBjcHVfdG9fbGU2NChwcmV2X2JnX3B0cik7CiAJfQotb3V0OgorCiAJbWxvZ19leGl0KHN0YXR1cyk7CiAJcmV0dXJuIHN0YXR1czsKIH0KQEAgLTExMzgsOCArMTI0Niw4IEBACiAJc3RydWN0IG9jZnMyX2Rpbm9kZSAqZGkgPSAoc3RydWN0IG9jZnMyX2Rpbm9kZSAqKSBkaV9iaC0+Yl9kYXRhOwogCXN0cnVjdCBvY2ZzMl9jaGFpbl9saXN0ICpjbCA9IChzdHJ1Y3Qgb2NmczJfY2hhaW5fbGlzdCAqKSAmZGktPmlkMi5pX2NoYWluOwogCi0JcmV0ID0gb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwgZGlfYmgsCi0JCQkJICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOworCXJldCA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzX2RpKGhhbmRsZSwgaW5vZGUsIGRpX2JoLAorCQkJCSAgICAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKIAlpZiAocmV0IDwgMCkgewogCQltbG9nX2Vycm5vKHJldCk7CiAJCWdvdG8gb3V0OwpAQCAtMTE3MCwyMSArMTI3OCwxNyBAQAogCXUxNiBmb3VuZDsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmdyb3VwX2JoID0gTlVMTDsKIAlzdHJ1Y3Qgb2NmczJfZ3JvdXBfZGVzYyAqZ2Q7CisJc3RydWN0IG9jZnMyX2Rpbm9kZSAqZGkgPSAoc3RydWN0IG9jZnMyX2Rpbm9kZSAqKWFjLT5hY19iaC0+Yl9kYXRhOwogCXN0cnVjdCBpbm9kZSAqYWxsb2NfaW5vZGUgPSBhYy0+YWNfaW5vZGU7CiAKLQlyZXQgPSBvY2ZzMl9yZWFkX2Jsb2NrKGFsbG9jX2lub2RlLCBnZF9ibGtubywgJmdyb3VwX2JoKTsKKwlyZXQgPSBvY2ZzMl9yZWFkX2dyb3VwX2Rlc2NyaXB0b3IoYWxsb2NfaW5vZGUsIGRpLCBnZF9ibGtubywKKwkJCQkJICAmZ3JvdXBfYmgpOwogCWlmIChyZXQgPCAwKSB7CiAJCW1sb2dfZXJybm8ocmV0KTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKIAlnZCA9IChzdHJ1Y3Qgb2NmczJfZ3JvdXBfZGVzYyAqKSBncm91cF9iaC0+Yl9kYXRhOwotCWlmICghT0NGUzJfSVNfVkFMSURfR1JPVVBfREVTQyhnZCkpIHsKLQkJT0NGUzJfUk9fT05fSU5WQUxJRF9HUk9VUF9ERVNDKGFsbG9jX2lub2RlLT5pX3NiLCBnZCk7Ci0JCXJldCA9IC1FSU87Ci0JCWdvdG8gb3V0OwotCX0KLQogCXJldCA9IGFjLT5hY19ncm91cF9zZWFyY2goYWxsb2NfaW5vZGUsIGdyb3VwX2JoLCBiaXRzX3dhbnRlZCwgbWluX2JpdHMsCiAJCQkJICBhYy0+YWNfbWF4X2Jsb2NrLCBiaXRfb2ZmLCAmZm91bmQpOwogCWlmIChyZXQgPCAwKSB7CkBAIC0xMjQxLDE5ICsxMzQ1LDE0IEBACiAJICAgICBiaXRzX3dhbnRlZCwgY2hhaW4sCiAJICAgICAodW5zaWduZWQgbG9uZyBsb25nKU9DRlMyX0koYWxsb2NfaW5vZGUpLT5pcF9ibGtubyk7CiAKLQlzdGF0dXMgPSBvY2ZzMl9yZWFkX2Jsb2NrKGFsbG9jX2lub2RlLAotCQkJCSAgbGU2NF90b19jcHUoY2wtPmNsX3JlY3NbY2hhaW5dLmNfYmxrbm8pLAotCQkJCSAgJmdyb3VwX2JoKTsKKwlzdGF0dXMgPSBvY2ZzMl9yZWFkX2dyb3VwX2Rlc2NyaXB0b3IoYWxsb2NfaW5vZGUsIGZlLAorCQkJCQkgICAgIGxlNjRfdG9fY3B1KGNsLT5jbF9yZWNzW2NoYWluXS5jX2Jsa25vKSwKKwkJCQkJICAgICAmZ3JvdXBfYmgpOwogCWlmIChzdGF0dXMgPCAwKSB7CiAJCW1sb2dfZXJybm8oc3RhdHVzKTsKIAkJZ290byBiYWlsOwogCX0KIAliZyA9IChzdHJ1Y3Qgb2NmczJfZ3JvdXBfZGVzYyAqKSBncm91cF9iaC0+Yl9kYXRhOwotCXN0YXR1cyA9IG9jZnMyX2NoZWNrX2dyb3VwX2Rlc2NyaXB0b3IoYWxsb2NfaW5vZGUtPmlfc2IsIGZlLCBiZyk7Ci0JaWYgKHN0YXR1cykgewotCQltbG9nX2Vycm5vKHN0YXR1cyk7Ci0JCWdvdG8gYmFpbDsKLQl9CiAKIAlzdGF0dXMgPSAtRU5PU1BDOwogCS8qIGZvciBub3csIHRoZSBjaGFpbiBzZWFyY2ggaXMgYSBiaXQgc2ltcGxpc3RpYy4gV2UganVzdCB1c2UKQEAgLTEyNzEsMTggKzEzNzAsMTMgQEAKIAkJbmV4dF9ncm91cCA9IGxlNjRfdG9fY3B1KGJnLT5iZ19uZXh0X2dyb3VwKTsKIAkJcHJldl9ncm91cF9iaCA9IGdyb3VwX2JoOwogCQlncm91cF9iaCA9IE5VTEw7Ci0JCXN0YXR1cyA9IG9jZnMyX3JlYWRfYmxvY2soYWxsb2NfaW5vZGUsCi0JCQkJCSAgbmV4dF9ncm91cCwgJmdyb3VwX2JoKTsKKwkJc3RhdHVzID0gb2NmczJfcmVhZF9ncm91cF9kZXNjcmlwdG9yKGFsbG9jX2lub2RlLCBmZSwKKwkJCQkJCSAgICAgbmV4dF9ncm91cCwgJmdyb3VwX2JoKTsKIAkJaWYgKHN0YXR1cyA8IDApIHsKIAkJCW1sb2dfZXJybm8oc3RhdHVzKTsKIAkJCWdvdG8gYmFpbDsKIAkJfQogCQliZyA9IChzdHJ1Y3Qgb2NmczJfZ3JvdXBfZGVzYyAqKSBncm91cF9iaC0+Yl9kYXRhOwotCQlzdGF0dXMgPSBvY2ZzMl9jaGVja19ncm91cF9kZXNjcmlwdG9yKGFsbG9jX2lub2RlLT5pX3NiLCBmZSwgYmcpOwotCQlpZiAoc3RhdHVzKSB7Ci0JCQltbG9nX2Vycm5vKHN0YXR1cyk7Ci0JCQlnb3RvIGJhaWw7Ci0JCX0KIAl9CiAJaWYgKHN0YXR1cyA8IDApIHsKIAkJaWYgKHN0YXR1cyAhPSAtRU5PU1BDKQpAQCAtMTMyNCwxMCArMTQxOCwxMCBAQAogCiAJLyogT2ssIGNsYWltIG91ciBiaXRzIG5vdzogc2V0IHRoZSBpbmZvIG9uIGRpbm9kZSwgY2hhaW5saXN0CiAJICogYW5kIHRoZW4gdGhlIGdyb3VwICovCi0Jc3RhdHVzID0gb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlLAotCQkJCSAgICAgIGFsbG9jX2lub2RlLAotCQkJCSAgICAgIGFjLT5hY19iaCwKLQkJCQkgICAgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CisJc3RhdHVzID0gb2NmczJfam91cm5hbF9hY2Nlc3NfZGkoaGFuZGxlLAorCQkJCQkgYWxsb2NfaW5vZGUsCisJCQkJCSBhYy0+YWNfYmgsCisJCQkJCSBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CiAJaWYgKHN0YXR1cyA8IDApIHsKIAkJbWxvZ19lcnJubyhzdGF0dXMpOwogCQlnb3RvIGJhaWw7CkBAIC0xMzkyLDExICsxNDg2LDExIEBACiAJQlVHX09OKCFhYy0+YWNfYmgpOwogCiAJZmUgPSAoc3RydWN0IG9jZnMyX2Rpbm9kZSAqKSBhYy0+YWNfYmgtPmJfZGF0YTsKLQlpZiAoIU9DRlMyX0lTX1ZBTElEX0RJTk9ERShmZSkpIHsKLQkJT0NGUzJfUk9fT05fSU5WQUxJRF9ESU5PREUob3NiLT5zYiwgZmUpOwotCQlzdGF0dXMgPSAtRUlPOwotCQlnb3RvIGJhaWw7Ci0JfQorCisJLyogVGhlIGJoIHdhcyB2YWxpZGF0ZWQgYnkgdGhlIGlub2RlIHJlYWQgZHVyaW5nCisJICogb2NmczJfcmVzZXJ2ZV9zdWJhbGxvY19iaXRzKCkuICBBbnkgY29ycnVwdGlvbiBpcyBhIGNvZGUgYnVnLiAqLworCUJVR19PTighT0NGUzJfSVNfVkFMSURfRElOT0RFKGZlKSk7CisKIAlpZiAobGUzMl90b19jcHUoZmUtPmlkMS5iaXRtYXAxLmlfdXNlZCkgPj0KIAkgICAgbGUzMl90b19jcHUoZmUtPmlkMS5iaXRtYXAxLmlfdG90YWwpKSB7CiAJCW9jZnMyX2Vycm9yKG9zYi0+c2IsICJDaGFpbiBhbGxvY2F0b3IgZGlub2RlICVsbHUgaGFzICV1IHVzZWQgIgpAQCAtMTcyNSwxOSArMTgxOSwxNyBAQAogCiAJbWxvZ19lbnRyeV92b2lkKCk7CiAKLQlpZiAoIU9DRlMyX0lTX1ZBTElEX0dST1VQX0RFU0MoYmcpKSB7Ci0JCU9DRlMyX1JPX09OX0lOVkFMSURfR1JPVVBfREVTQyhhbGxvY19pbm9kZS0+aV9zYiwgYmcpOwotCQlzdGF0dXMgPSAtRUlPOwotCQlnb3RvIGJhaWw7Ci0JfQorCS8qIFRoZSBjYWxsZXIgZ290IHRoaXMgZGVzY3JpcHRvciBmcm9tCisJICogb2NmczJfcmVhZF9ncm91cF9kZXNjcmlwdG9yKCkuICBBbnkgY29ycnVwdGlvbiBpcyBhIGNvZGUgYnVnLiAqLworCUJVR19PTighT0NGUzJfSVNfVkFMSURfR1JPVVBfREVTQyhiZykpOwogCiAJbWxvZygwLCAib2ZmID0gJXUsIG51bSA9ICV1XG4iLCBiaXRfb2ZmLCBudW1fYml0cyk7CiAKIAlpZiAob2NmczJfaXNfY2x1c3Rlcl9iaXRtYXAoYWxsb2NfaW5vZGUpKQogCQlqb3VybmFsX3R5cGUgPSBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19VTkRPOwogCi0Jc3RhdHVzID0gb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBhbGxvY19pbm9kZSwgZ3JvdXBfYmgsCi0JCQkJICAgICAgam91cm5hbF90eXBlKTsKKwlzdGF0dXMgPSBvY2ZzMl9qb3VybmFsX2FjY2Vzc19nZChoYW5kbGUsIGFsbG9jX2lub2RlLCBncm91cF9iaCwKKwkJCQkJIGpvdXJuYWxfdHlwZSk7CiAJaWYgKHN0YXR1cyA8IDApIHsKIAkJbWxvZ19lcnJubyhzdGF0dXMpOwogCQlnb3RvIGJhaWw7CkBAIC0xNzgyLDI5ICsxODc0LDI2IEBACiAKIAltbG9nX2VudHJ5X3ZvaWQoKTsKIAotCWlmICghT0NGUzJfSVNfVkFMSURfRElOT0RFKGZlKSkgewotCQlPQ0ZTMl9ST19PTl9JTlZBTElEX0RJTk9ERShhbGxvY19pbm9kZS0+aV9zYiwgZmUpOwotCQlzdGF0dXMgPSAtRUlPOwotCQlnb3RvIGJhaWw7Ci0JfQorCS8qIFRoZSBhbGxvY19iaCBjb21lcyBmcm9tIG9jZnMyX2ZyZWVfZGlub2RlKCkgb3IKKwkgKiBvY2ZzMl9mcmVlX2NsdXN0ZXJzKCkuICBUaGUgY2FsbGVycyBoYXZlIGFsbCBsb2NrZWQgdGhlCisJICogYWxsb2NhdG9yIGFuZCBnb3R0ZW4gYWxsb2NfYmggZnJvbSB0aGUgbG9jayBjYWxsLiAgVGhpcworCSAqIHZhbGlkYXRlcyB0aGUgZGlub2RlIGJ1ZmZlci4gIEFueSBjb3JydXB0aW9uIHRoYXQgaGFzIGhhcHBlbmRlZAorCSAqIGlzIGEgY29kZSBidWcuICovCisJQlVHX09OKCFPQ0ZTMl9JU19WQUxJRF9ESU5PREUoZmUpKTsKIAlCVUdfT04oKGNvdW50ICsgc3RhcnRfYml0KSA+IG9jZnMyX2JpdHNfcGVyX2dyb3VwKGNsKSk7CiAKIAltbG9nKDAsICIlbGx1OiBmcmVlaW5nICV1IGJpdHMgZnJvbSBncm91cCAlbGx1LCBzdGFydGluZyBhdCAldVxuIiwKIAkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpT0NGUzJfSShhbGxvY19pbm9kZSktPmlwX2Jsa25vLCBjb3VudCwKIAkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpYmdfYmxrbm8sIHN0YXJ0X2JpdCk7CiAKLQlzdGF0dXMgPSBvY2ZzMl9yZWFkX2Jsb2NrKGFsbG9jX2lub2RlLCBiZ19ibGtubywgJmdyb3VwX2JoKTsKKwlzdGF0dXMgPSBvY2ZzMl9yZWFkX2dyb3VwX2Rlc2NyaXB0b3IoYWxsb2NfaW5vZGUsIGZlLCBiZ19ibGtubywKKwkJCQkJICAgICAmZ3JvdXBfYmgpOwogCWlmIChzdGF0dXMgPCAwKSB7CiAJCW1sb2dfZXJybm8oc3RhdHVzKTsKIAkJZ290byBiYWlsOwogCX0KLQogCWdyb3VwID0gKHN0cnVjdCBvY2ZzMl9ncm91cF9kZXNjICopIGdyb3VwX2JoLT5iX2RhdGE7Ci0Jc3RhdHVzID0gb2NmczJfY2hlY2tfZ3JvdXBfZGVzY3JpcHRvcihhbGxvY19pbm9kZS0+aV9zYiwgZmUsIGdyb3VwKTsKLQlpZiAoc3RhdHVzKSB7Ci0JCW1sb2dfZXJybm8oc3RhdHVzKTsKLQkJZ290byBiYWlsOwotCX0KKwogCUJVR19PTigoY291bnQgKyBzdGFydF9iaXQpID4gbGUxNl90b19jcHUoZ3JvdXAtPmJnX2JpdHMpKTsKIAogCXN0YXR1cyA9IG9jZnMyX2Jsb2NrX2dyb3VwX2NsZWFyX2JpdHMoaGFuZGxlLCBhbGxvY19pbm9kZSwKQEAgLTE4MTUsOCArMTkwNCw4IEBACiAJCWdvdG8gYmFpbDsKIAl9CiAKLQlzdGF0dXMgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGFsbG9jX2lub2RlLCBhbGxvY19iaCwKLQkJCQkgICAgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CisJc3RhdHVzID0gb2NmczJfam91cm5hbF9hY2Nlc3NfZGkoaGFuZGxlLCBhbGxvY19pbm9kZSwgYWxsb2NfYmgsCisJCQkJCSBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CiAJaWYgKHN0YXR1cyA8IDApIHsKIAkJbWxvZ19lcnJubyhzdGF0dXMpOwogCQlnb3RvIGJhaWw7CmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9zdWJhbGxvYy5oIGIvZnMvb2NmczIvc3ViYWxsb2MuaAppbmRleCA0ZGYxNTlkLi5lM2MxM2M3IDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9zdWJhbGxvYy5oCisrKyBiL2ZzL29jZnMyL3N1YmFsbG9jLmgKQEAgLTE2NCwxMCArMTY0LDI0IEBACiAgKiBhbmQgcmV0dXJuIHRoYXQgYmxvY2sgb2Zmc2V0LiAqLwogdTY0IG9jZnMyX3doaWNoX2NsdXN0ZXJfZ3JvdXAoc3RydWN0IGlub2RlICppbm9kZSwgdTMyIGNsdXN0ZXIpOwogCi0vKiBzb21ld2hhdCBtb3JlIGV4cGVuc2l2ZSB0aGFuIG91ciBvdGhlciBjaGVja3MsIHNvIHVzZSBzcGFyaW5nbHkuICovCisvKgorICogQnkgZGVmYXVsdCwgb2NmczJfcmVhZF9ncm91cF9kZXNjcmlwdG9yKCkgY2FsbHMgb2NmczJfZXJyb3IoKSB3aGVuIGl0CisgKiBmaW5kcyBhIHByb2JsZW0uICBBIGNhbGxlciB0aGF0IHdhbnRzIHRvIGNoZWNrIGEgZ3JvdXAgZGVzY3JpcHRvcgorICogd2l0aG91dCBnb2luZyByZWFkb25seSBzaG91bGQgcmVhZCB0aGUgYmxvY2sgd2l0aCBvY2ZzMl9yZWFkX2Jsb2NrW3NdKCkKKyAqIGFuZCB0aGVuIGNoZWNraW5nIGl0IHdpdGggdGhpcyBmdW5jdGlvbi4gIFRoaXMgaXMgb25seSByZXNpemUsIHJlYWxseS4KKyAqIEV2ZXJ5b25lIGVsc2Ugc2hvdWxkIGJlIHVzaW5nIG9jZnMyX3JlYWRfZ3JvdXBfZGVzY3JpcHRvcigpLgorICovCiBpbnQgb2NmczJfY2hlY2tfZ3JvdXBfZGVzY3JpcHRvcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAogCQkJCSBzdHJ1Y3Qgb2NmczJfZGlub2RlICpkaSwKLQkJCQkgc3RydWN0IG9jZnMyX2dyb3VwX2Rlc2MgKmdkKTsKKwkJCQkgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCk7CisvKgorICogUmVhZCBhIGdyb3VwIGRlc2NyaXB0b3IgYmxvY2sgaW50byAqYmguICBJZiAqYmggaXMgTlVMTCwgYSBiaCB3aWxsIGJlCisgKiBhbGxvY2F0ZWQuICBUaGlzIGlzIGEgY2FjaGVkIHJlYWQuICBUaGUgZGVzY3JpcHRvciB3aWxsIGJlIHZhbGlkYXRlZCB3aXRoCisgKiBvY2ZzMl92YWxpZGF0ZV9ncm91cF9kZXNjcmlwdG9yKCkuCisgKi8KK2ludCBvY2ZzMl9yZWFkX2dyb3VwX2Rlc2NyaXB0b3Ioc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IG9jZnMyX2Rpbm9kZSAqZGksCisJCQkJdTY0IGdkX2Jsa25vLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKipiaCk7CisKIGludCBvY2ZzMl9sb2NrX2FsbG9jYXRvcnMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IG9jZnMyX2V4dGVudF90cmVlICpldCwKIAkJCSAgdTMyIGNsdXN0ZXJzX3RvX2FkZCwgdTMyIGV4dGVudHNfdG9fc3BsaXQsCiAJCQkgIHN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICoqZGF0YV9hYywKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL3N1cGVyLmMgYi9mcy9vY2ZzMi9zdXBlci5jCmluZGV4IDMwNGI2M2EuLjQzZWQxMTMgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL3N1cGVyLmMKKysrIGIvZnMvb2NmczIvc3VwZXIuYwpAQCAtNDEsNiArNDEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KICNpbmNsdWRlIDxsaW51eC9tb3VudC5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvcXVvdGFvcHMuaD4KIAogI2RlZmluZSBNTE9HX01BU0tfUFJFRklYIE1MX1NVUEVSCiAjaW5jbHVkZSA8Y2x1c3Rlci9tYXNrbG9nLmg+CkBAIC01MSw2ICs1Miw3IEBACiAjaW5jbHVkZSAib2NmczFfZnNfY29tcGF0LmgiCiAKICNpbmNsdWRlICJhbGxvYy5oIgorI2luY2x1ZGUgImJsb2NrY2hlY2suaCIKICNpbmNsdWRlICJkbG1nbHVlLmgiCiAjaW5jbHVkZSAiZXhwb3J0LmgiCiAjaW5jbHVkZSAiZXh0ZW50X21hcC5oIgpAQCAtNjUsMTAgKzY3LDEzIEBACiAjaW5jbHVkZSAidXB0b2RhdGUuaCIKICNpbmNsdWRlICJ2ZXIuaCIKICNpbmNsdWRlICJ4YXR0ci5oIgorI2luY2x1ZGUgInF1b3RhLmgiCiAKICNpbmNsdWRlICJidWZmZXJfaGVhZF9pby5oIgogCiBzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKm9jZnMyX2lub2RlX2NhY2hlcCA9IE5VTEw7CitzdHJ1Y3Qga21lbV9jYWNoZSAqb2NmczJfZHF1b3RfY2FjaGVwOworc3RydWN0IGttZW1fY2FjaGUgKm9jZnMyX3FmX2NodW5rX2NhY2hlcDsKIAogLyogT0NGUzIgbmVlZHMgdG8gc2NoZWR1bGUgc2V2ZXJhbCBkaWZmZXJudCB0eXBlcyBvZiB3b3JrIHdoaWNoCiAgKiByZXF1aXJlIGNsdXN0ZXIgbG9ja2luZywgZGlzayBJL08sIHJlY292ZXJ5IHdhaXRzLCBldGMuIFNpbmNlIHRoZXNlCkBAIC0xMjQsNiArMTI5LDkgQEAKIHN0YXRpYyB2b2lkIG9jZnMyX3dyaXRlX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpOwogc3RhdGljIHN0cnVjdCBpbm9kZSAqb2NmczJfYWxsb2NfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYik7CiBzdGF0aWMgdm9pZCBvY2ZzMl9kZXN0cm95X2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpOworc3RhdGljIGludCBvY2ZzMl9zdXNwX3F1b3RhcyhzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiwgaW50IHVuc3VzcGVuZCk7CitzdGF0aWMgaW50IG9jZnMyX2VuYWJsZV9xdW90YXMoc3RydWN0IG9jZnMyX3N1cGVyICpvc2IpOworc3RhdGljIHZvaWQgb2NmczJfZGlzYWJsZV9xdW90YXMoc3RydWN0IG9jZnMyX3N1cGVyICpvc2IpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHN1cGVyX29wZXJhdGlvbnMgb2NmczJfc29wcyA9IHsKIAkuc3RhdGZzCQk9IG9jZnMyX3N0YXRmcywKQEAgLTEzNyw2ICsxNDUsOCBAQAogCS5wdXRfc3VwZXIJPSBvY2ZzMl9wdXRfc3VwZXIsCiAJLnJlbW91bnRfZnMJPSBvY2ZzMl9yZW1vdW50LAogCS5zaG93X29wdGlvbnMgICA9IG9jZnMyX3Nob3dfb3B0aW9ucywKKwkucXVvdGFfcmVhZAk9IG9jZnMyX3F1b3RhX3JlYWQsCisJLnF1b3RhX3dyaXRlCT0gb2NmczJfcXVvdGFfd3JpdGUsCiB9OwogCiBlbnVtIHsKQEAgLTE1OCw2ICsxNjgsMTAgQEAKIAlPcHRfdXNlcl94YXR0ciwKIAlPcHRfbm91c2VyX3hhdHRyLAogCU9wdF9pbm9kZTY0LAorCU9wdF9hY2wsCisJT3B0X25vYWNsLAorCU9wdF91c3JxdW90YSwKKwlPcHRfZ3JwcXVvdGEsCiAJT3B0X2VyciwKIH07CiAKQEAgLTE4MCw2ICsxOTQsMTAgQEAKIAl7T3B0X3VzZXJfeGF0dHIsICJ1c2VyX3hhdHRyIn0sCiAJe09wdF9ub3VzZXJfeGF0dHIsICJub3VzZXJfeGF0dHIifSwKIAl7T3B0X2lub2RlNjQsICJpbm9kZTY0In0sCisJe09wdF9hY2wsICJhY2wifSwKKwl7T3B0X25vYWNsLCAibm9hY2wifSwKKwl7T3B0X3VzcnF1b3RhLCAidXNycXVvdGEifSwKKwl7T3B0X2dycHF1b3RhLCAiZ3JwcXVvdGEifSwKIAl7T3B0X2VyciwgTlVMTH0KIH07CiAKQEAgLTIyMSw2ICsyMzksMTkgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBvY2ZzMl9uZWVkX3N5c3RlbV9pbm9kZShzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiwgaW50IGlubykKK3sKKwlpZiAoIU9DRlMyX0hBU19ST19DT01QQVRfRkVBVFVSRShvc2ItPnNiLCBPQ0ZTMl9GRUFUVVJFX1JPX0NPTVBBVF9VU1JRVU9UQSkKKwkgICAgJiYgKGlubyA9PSBVU0VSX1FVT1RBX1NZU1RFTV9JTk9ERQorCQl8fCBpbm8gPT0gTE9DQUxfVVNFUl9RVU9UQV9TWVNURU1fSU5PREUpKQorCQlyZXR1cm4gMDsKKwlpZiAoIU9DRlMyX0hBU19ST19DT01QQVRfRkVBVFVSRShvc2ItPnNiLCBPQ0ZTMl9GRUFUVVJFX1JPX0NPTVBBVF9HUlBRVU9UQSkKKwkgICAgJiYgKGlubyA9PSBHUk9VUF9RVU9UQV9TWVNURU1fSU5PREUKKwkJfHwgaW5vID09IExPQ0FMX0dST1VQX1FVT1RBX1NZU1RFTV9JTk9ERSkpCisJCXJldHVybiAwOworCXJldHVybiAxOworfQorCiBzdGF0aWMgaW50IG9jZnMyX2luaXRfZ2xvYmFsX3N5c3RlbV9pbm9kZXMoc3RydWN0IG9jZnMyX3N1cGVyICpvc2IpCiB7CiAJc3RydWN0IGlub2RlICpuZXcgPSBOVUxMOwpAQCAtMjQ3LDYgKzI3OCw4IEBACiAKIAlmb3IgKGkgPSBPQ0ZTMl9GSVJTVF9PTkxJTkVfU1lTVEVNX0lOT0RFOwogCSAgICAgaSA8PSBPQ0ZTMl9MQVNUX0dMT0JBTF9TWVNURU1fSU5PREU7IGkrKykgeworCQlpZiAoIW9jZnMyX25lZWRfc3lzdGVtX2lub2RlKG9zYiwgaSkpCisJCQljb250aW51ZTsKIAkJbmV3ID0gb2NmczJfZ2V0X3N5c3RlbV9maWxlX2lub2RlKG9zYiwgaSwgb3NiLT5zbG90X251bSk7CiAJCWlmICghbmV3KSB7CiAJCQlvY2ZzMl9yZWxlYXNlX3N5c3RlbV9pbm9kZXMob3NiKTsKQEAgLTI3Nyw2ICszMTAsOCBAQAogCWZvciAoaSA9IE9DRlMyX0xBU1RfR0xPQkFMX1NZU1RFTV9JTk9ERSArIDE7CiAJICAgICBpIDwgTlVNX1NZU1RFTV9JTk9ERVM7CiAJICAgICBpKyspIHsKKwkJaWYgKCFvY2ZzMl9uZWVkX3N5c3RlbV9pbm9kZShvc2IsIGkpKQorCQkJY29udGludWU7CiAJCW5ldyA9IG9jZnMyX2dldF9zeXN0ZW1fZmlsZV9pbm9kZShvc2IsIGksIG9zYi0+c2xvdF9udW0pOwogCQlpZiAoIW5ldykgewogCQkJb2NmczJfcmVsZWFzZV9zeXN0ZW1faW5vZGVzKG9zYik7CkBAIC00MjYsNiArNDYxLDEyIEBACiAKIAkvKiBXZSdyZSBnb2luZyB0by9mcm9tIHJlYWRvbmx5IG1vZGUuICovCiAJaWYgKCgqZmxhZ3MgJiBNU19SRE9OTFkpICE9IChzYi0+c19mbGFncyAmIE1TX1JET05MWSkpIHsKKwkJLyogRGlzYWJsZSBxdW90YSBhY2NvdW50aW5nIGJlZm9yZSByZW1vdW50aW5nIFJPICovCisJCWlmICgqZmxhZ3MgJiBNU19SRE9OTFkpIHsKKwkJCXJldCA9IG9jZnMyX3N1c3BfcXVvdGFzKG9zYiwgMCk7CisJCQlpZiAocmV0IDwgMCkKKwkJCQlnb3RvIG91dDsKKwkJfQogCQkvKiBMb2NrIGhlcmUgc28gdGhlIGNoZWNrIG9mIEhBUkRfUk8gYW5kIHRoZSBwb3RlbnRpYWwKIAkJICogc2V0dGluZyBvZiBTT0ZUX1JPIGlzIGF0b21pYy4gKi8KIAkJc3Bpbl9sb2NrKCZvc2ItPm9zYl9sb2NrKTsKQEAgLTQ2MSwxMSArNTAyLDI4IEBACiAJCX0KIHVubG9ja19vc2I6CiAJCXNwaW5fdW5sb2NrKCZvc2ItPm9zYl9sb2NrKTsKKwkJLyogRW5hYmxlIHF1b3RhIGFjY291bnRpbmcgYWZ0ZXIgcmVtb3VudGluZyBSVyAqLworCQlpZiAoIXJldCAmJiAhKCpmbGFncyAmIE1TX1JET05MWSkpIHsKKwkJCWlmIChzYl9hbnlfcXVvdGFfc3VzcGVuZGVkKHNiKSkKKwkJCQlyZXQgPSBvY2ZzMl9zdXNwX3F1b3Rhcyhvc2IsIDEpOworCQkJZWxzZQorCQkJCXJldCA9IG9jZnMyX2VuYWJsZV9xdW90YXMob3NiKTsKKwkJCWlmIChyZXQgPCAwKSB7CisJCQkJLyogUmV0dXJuIGJhY2sgY2hhbmdlcy4uLiAqLworCQkJCXNwaW5fbG9jaygmb3NiLT5vc2JfbG9jayk7CisJCQkJc2ItPnNfZmxhZ3MgfD0gTVNfUkRPTkxZOworCQkJCW9zYi0+b3NiX2ZsYWdzIHw9IE9DRlMyX09TQl9TT0ZUX1JPOworCQkJCXNwaW5fdW5sb2NrKCZvc2ItPm9zYl9sb2NrKTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJfQogCX0KIAogCWlmICghcmV0KSB7CiAJCS8qIE9ubHkgc2F2ZSBvZmYgdGhlIG5ldyBtb3VudCBvcHRpb25zIGluIGNhc2Ugb2YgYSBzdWNjZXNzZnVsCiAJCSAqIHJlbW91bnQuICovCisJCWlmICghKG9zYi0+c19mZWF0dXJlX2luY29tcGF0ICYgT0NGUzJfRkVBVFVSRV9JTkNPTVBBVF9YQVRUUikpCisJCQlwYXJzZWRfb3B0aW9ucy5tb3VudF9vcHQgJj0gfk9DRlMyX01PVU5UX1BPU0lYX0FDTDsKIAkJb3NiLT5zX21vdW50X29wdCA9IHBhcnNlZF9vcHRpb25zLm1vdW50X29wdDsKIAkJb3NiLT5zX2F0aW1lX3F1YW50dW0gPSBwYXJzZWRfb3B0aW9ucy5hdGltZV9xdWFudHVtOwogCQlvc2ItPnByZWZlcnJlZF9zbG90ID0gcGFyc2VkX29wdGlvbnMuc2xvdDsKQEAgLTYxOSw2ICs2NzcsMTMxIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgb2NmczJfc3VzcF9xdW90YXMoc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsIGludCB1bnN1c3BlbmQpCit7CisJaW50IHR5cGU7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IG9zYi0+c2I7CisJdW5zaWduZWQgaW50IGZlYXR1cmVbTUFYUVVPVEFTXSA9IHsgT0NGUzJfRkVBVFVSRV9ST19DT01QQVRfVVNSUVVPVEEsCisJCQkJCSAgICAgT0NGUzJfRkVBVFVSRV9ST19DT01QQVRfR1JQUVVPVEF9OworCWludCBzdGF0dXMgPSAwOworCisJZm9yICh0eXBlID0gMDsgdHlwZSA8IE1BWFFVT1RBUzsgdHlwZSsrKSB7CisJCWlmICghT0NGUzJfSEFTX1JPX0NPTVBBVF9GRUFUVVJFKHNiLCBmZWF0dXJlW3R5cGVdKSkKKwkJCWNvbnRpbnVlOworCQlpZiAodW5zdXNwZW5kKQorCQkJc3RhdHVzID0gdmZzX3F1b3RhX2VuYWJsZSgKKwkJCQkJc2JfZHFvcHQoc2IpLT5maWxlc1t0eXBlXSwKKwkJCQkJdHlwZSwgUUZNVF9PQ0ZTMiwKKwkJCQkJRFFVT1RfU1VTUEVOREVEKTsKKwkJZWxzZQorCQkJc3RhdHVzID0gdmZzX3F1b3RhX2Rpc2FibGUoc2IsIHR5cGUsCisJCQkJCQkgICBEUVVPVF9TVVNQRU5ERUQpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWJyZWFrOworCX0KKwlpZiAoc3RhdHVzIDwgMCkKKwkJbWxvZyhNTF9FUlJPUiwgIkZhaWxlZCB0byBzdXNwZW5kL3Vuc3VzcGVuZCBxdW90YXMgb24gIgorCQkgICAgICJyZW1vdW50IChlcnJvciA9ICVkKS5cbiIsIHN0YXR1cyk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBvY2ZzMl9lbmFibGVfcXVvdGFzKHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGVbTUFYUVVPVEFTXSA9IHsgTlVMTCwgTlVMTCB9OworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBvc2ItPnNiOworCXVuc2lnbmVkIGludCBmZWF0dXJlW01BWFFVT1RBU10gPSB7IE9DRlMyX0ZFQVRVUkVfUk9fQ09NUEFUX1VTUlFVT1RBLAorCQkJCQkgICAgIE9DRlMyX0ZFQVRVUkVfUk9fQ09NUEFUX0dSUFFVT1RBfTsKKwl1bnNpZ25lZCBpbnQgaW5vW01BWFFVT1RBU10gPSB7IExPQ0FMX1VTRVJfUVVPVEFfU1lTVEVNX0lOT0RFLAorCQkJCQlMT0NBTF9HUk9VUF9RVU9UQV9TWVNURU1fSU5PREUgfTsKKwlpbnQgc3RhdHVzOworCWludCB0eXBlOworCisJc2JfZHFvcHQoc2IpLT5mbGFncyB8PSBEUVVPVF9RVU9UQV9TWVNfRklMRSB8IERRVU9UX05FR0FUSVZFX1VTQUdFOworCWZvciAodHlwZSA9IDA7IHR5cGUgPCBNQVhRVU9UQVM7IHR5cGUrKykgeworCQlpZiAoIU9DRlMyX0hBU19ST19DT01QQVRfRkVBVFVSRShzYiwgZmVhdHVyZVt0eXBlXSkpCisJCQljb250aW51ZTsKKwkJaW5vZGVbdHlwZV0gPSBvY2ZzMl9nZXRfc3lzdGVtX2ZpbGVfaW5vZGUob3NiLCBpbm9bdHlwZV0sCisJCQkJCQkJb3NiLT5zbG90X251bSk7CisJCWlmICghaW5vZGVbdHlwZV0pIHsKKwkJCXN0YXR1cyA9IC1FTk9FTlQ7CisJCQlnb3RvIG91dF9xdW90YV9vZmY7CisJCX0KKwkJc3RhdHVzID0gdmZzX3F1b3RhX2VuYWJsZShpbm9kZVt0eXBlXSwgdHlwZSwgUUZNVF9PQ0ZTMiwKKwkJCQkJCURRVU9UX1VTQUdFX0VOQUJMRUQpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gb3V0X3F1b3RhX29mZjsKKwl9CisKKwlmb3IgKHR5cGUgPSAwOyB0eXBlIDwgTUFYUVVPVEFTOyB0eXBlKyspCisJCWlwdXQoaW5vZGVbdHlwZV0pOworCXJldHVybiAwOworb3V0X3F1b3RhX29mZjoKKwlvY2ZzMl9kaXNhYmxlX3F1b3Rhcyhvc2IpOworCWZvciAodHlwZSA9IDA7IHR5cGUgPCBNQVhRVU9UQVM7IHR5cGUrKykKKwkJaXB1dChpbm9kZVt0eXBlXSk7CisJbWxvZ19lcnJubyhzdGF0dXMpOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyB2b2lkIG9jZnMyX2Rpc2FibGVfcXVvdGFzKHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiKQoreworCWludCB0eXBlOworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IG9zYi0+c2I7CisKKwkvKiBXZSBtb3N0bHkgaWdub3JlIGVycm9ycyBpbiB0aGlzIGZ1bmN0aW9uIGJlY2F1c2UgdGhlcmUncyBub3QgbXVjaAorCSAqIHdlIGNhbiBkbyB3aGVuIHdlIHNlZSB0aGVtICovCisJZm9yICh0eXBlID0gMDsgdHlwZSA8IE1BWFFVT1RBUzsgdHlwZSsrKSB7CisJCWlmICghc2JfaGFzX3F1b3RhX2xvYWRlZChzYiwgdHlwZSkpCisJCQljb250aW51ZTsKKwkJaW5vZGUgPSBpZ3JhYihzYi0+c19kcXVvdC5maWxlc1t0eXBlXSk7CisJCS8qIFR1cm4gb2ZmIHF1b3Rhcy4gVGhpcyB3aWxsIHJlbW92ZSBhbGwgZHF1b3Qgc3RydWN0dXJlcyBmcm9tCisJCSAqIG1lbW9yeSBhbmQgc28gdGhleSB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgc3luY2VkIHRvIGdsb2JhbAorCQkgKiBxdW90YSBmaWxlcyAqLworCQl2ZnNfcXVvdGFfZGlzYWJsZShzYiwgdHlwZSwgRFFVT1RfVVNBR0VfRU5BQkxFRCB8CisJCQkJCSAgICBEUVVPVF9MSU1JVFNfRU5BQkxFRCk7CisJCWlmICghaW5vZGUpCisJCQljb250aW51ZTsKKwkJaXB1dChpbm9kZSk7CisJfQorfQorCisvKiBIYW5kbGUgcXVvdGEgb24gcXVvdGFjdGwgKi8KK3N0YXRpYyBpbnQgb2NmczJfcXVvdGFfb24oc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHR5cGUsIGludCBmb3JtYXRfaWQsCisJCQkgIGNoYXIgKnBhdGgsIGludCByZW1vdW50KQoreworCXVuc2lnbmVkIGludCBmZWF0dXJlW01BWFFVT1RBU10gPSB7IE9DRlMyX0ZFQVRVUkVfUk9fQ09NUEFUX1VTUlFVT1RBLAorCQkJCQkgICAgIE9DRlMyX0ZFQVRVUkVfUk9fQ09NUEFUX0dSUFFVT1RBfTsKKworCWlmICghT0NGUzJfSEFTX1JPX0NPTVBBVF9GRUFUVVJFKHNiLCBmZWF0dXJlW3R5cGVdKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAocmVtb3VudCkKKwkJcmV0dXJuIDA7CS8qIEp1c3QgaWdub3JlIGl0IGhhcyBiZWVuIGhhbmRsZWQgaW4KKwkJCQkgKiBvY2ZzMl9yZW1vdW50KCkgKi8KKwlyZXR1cm4gdmZzX3F1b3RhX2VuYWJsZShzYl9kcW9wdChzYiktPmZpbGVzW3R5cGVdLCB0eXBlLAorCQkJCSAgICBmb3JtYXRfaWQsIERRVU9UX0xJTUlUU19FTkFCTEVEKTsKK30KKworLyogSGFuZGxlIHF1b3RhIG9mZiBxdW90YWN0bCAqLworc3RhdGljIGludCBvY2ZzMl9xdW90YV9vZmYoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHR5cGUsIGludCByZW1vdW50KQoreworCWlmIChyZW1vdW50KQorCQlyZXR1cm4gMDsJLyogSWdub3JlIG5vdyBhbmQgaGFuZGxlIGxhdGVyIGluCisJCQkJICogb2NmczJfcmVtb3VudCgpICovCisJcmV0dXJuIHZmc19xdW90YV9kaXNhYmxlKHNiLCB0eXBlLCBEUVVPVF9MSU1JVFNfRU5BQkxFRCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcXVvdGFjdGxfb3BzIG9jZnMyX3F1b3RhY3RsX29wcyA9IHsKKwkucXVvdGFfb24JPSBvY2ZzMl9xdW90YV9vbiwKKwkucXVvdGFfb2ZmCT0gb2NmczJfcXVvdGFfb2ZmLAorCS5xdW90YV9zeW5jCT0gdmZzX3F1b3RhX3N5bmMsCisJLmdldF9pbmZvCT0gdmZzX2dldF9kcWluZm8sCisJLnNldF9pbmZvCT0gdmZzX3NldF9kcWluZm8sCisJLmdldF9kcWJsawk9IHZmc19nZXRfZHFibGssCisJLnNldF9kcWJsawk9IHZmc19zZXRfZHFibGssCit9OworCiBzdGF0aWMgaW50IG9jZnMyX2ZpbGxfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdm9pZCAqZGF0YSwgaW50IHNpbGVudCkKIHsKIAlzdHJ1Y3QgZGVudHJ5ICpyb290OwpAQCAtNjUxLDEyICs4MzQsMzIgQEAKIAl9CiAJYnJlbHNlKGJoKTsKIAliaCA9IE5VTEw7CisKKwlpZiAoIShvc2ItPnNfZmVhdHVyZV9pbmNvbXBhdCAmIE9DRlMyX0ZFQVRVUkVfSU5DT01QQVRfWEFUVFIpKQorCQlwYXJzZWRfb3B0aW9ucy5tb3VudF9vcHQgJj0gfk9DRlMyX01PVU5UX1BPU0lYX0FDTDsKKwogCW9zYi0+c19tb3VudF9vcHQgPSBwYXJzZWRfb3B0aW9ucy5tb3VudF9vcHQ7CiAJb3NiLT5zX2F0aW1lX3F1YW50dW0gPSBwYXJzZWRfb3B0aW9ucy5hdGltZV9xdWFudHVtOwogCW9zYi0+cHJlZmVycmVkX3Nsb3QgPSBwYXJzZWRfb3B0aW9ucy5zbG90OwogCW9zYi0+b3NiX2NvbW1pdF9pbnRlcnZhbCA9IHBhcnNlZF9vcHRpb25zLmNvbW1pdF9pbnRlcnZhbDsKIAlvc2ItPmxvY2FsX2FsbG9jX2RlZmF1bHRfYml0cyA9IG9jZnMyX21lZ2FieXRlc190b19jbHVzdGVycyhzYiwgcGFyc2VkX29wdGlvbnMubG9jYWxhbGxvY19vcHQpOwogCW9zYi0+bG9jYWxfYWxsb2NfYml0cyA9IG9zYi0+bG9jYWxfYWxsb2NfZGVmYXVsdF9iaXRzOworCWlmIChvc2ItPnNfbW91bnRfb3B0ICYgT0NGUzJfTU9VTlRfVVNSUVVPVEEgJiYKKwkgICAgIU9DRlMyX0hBU19ST19DT01QQVRfRkVBVFVSRShzYiwKKwkJCQkJIE9DRlMyX0ZFQVRVUkVfUk9fQ09NUEFUX1VTUlFVT1RBKSkgeworCQlzdGF0dXMgPSAtRUlOVkFMOworCQltbG9nKE1MX0VSUk9SLCAiVXNlciBxdW90YXMgd2VyZSByZXF1ZXN0ZWQsIGJ1dCB0aGlzICIKKwkJICAgICAiZmlsZXN5c3RlbSBkb2VzIG5vdCBoYXZlIHRoZSBmZWF0dXJlIGVuYWJsZWQuXG4iKTsKKwkJZ290byByZWFkX3N1cGVyX2Vycm9yOworCX0KKwlpZiAob3NiLT5zX21vdW50X29wdCAmIE9DRlMyX01PVU5UX0dSUFFVT1RBICYmCisJICAgICFPQ0ZTMl9IQVNfUk9fQ09NUEFUX0ZFQVRVUkUoc2IsCisJCQkJCSBPQ0ZTMl9GRUFUVVJFX1JPX0NPTVBBVF9HUlBRVU9UQSkpIHsKKwkJc3RhdHVzID0gLUVJTlZBTDsKKwkJbWxvZyhNTF9FUlJPUiwgIkdyb3VwIHF1b3RhcyB3ZXJlIHJlcXVlc3RlZCwgYnV0IHRoaXMgIgorCQkgICAgICJmaWxlc3lzdGVtIGRvZXMgbm90IGhhdmUgdGhlIGZlYXR1cmUgZW5hYmxlZC5cbiIpOworCQlnb3RvIHJlYWRfc3VwZXJfZXJyb3I7CisJfQogCiAJc3RhdHVzID0gb2NmczJfdmVyaWZ5X3VzZXJzcGFjZV9zdGFjayhvc2IsICZwYXJzZWRfb3B0aW9ucyk7CiAJaWYgKHN0YXR1cykKQEAgLTY2NCw2ICs4NjcsOSBAQAogCiAJc2ItPnNfbWFnaWMgPSBPQ0ZTMl9TVVBFUl9NQUdJQzsKIAorCXNiLT5zX2ZsYWdzID0gKHNiLT5zX2ZsYWdzICYgfk1TX1BPU0lYQUNMKSB8CisJCSgob3NiLT5zX21vdW50X29wdCAmIE9DRlMyX01PVU5UX1BPU0lYX0FDTCkgPyBNU19QT1NJWEFDTCA6IDApOworCiAJLyogSGFyZCByZWFkb25seSBtb2RlIG9ubHkgaWY6IGJkZXZfcmVhZF9vbmx5LCBNU19SRE9OTFksCiAJICogaGVhcnRiZWF0PW5vbmUgKi8KIAlpZiAoYmRldl9yZWFkX29ubHkoc2ItPnNfYmRldikpIHsKQEAgLTc1OCw2ICs5NjQsMjggQEAKIAlhdG9taWNfc2V0KCZvc2ItPnZvbF9zdGF0ZSwgVk9MVU1FX01PVU5URUQpOwogCXdha2VfdXAoJm9zYi0+b3NiX21vdW50X2V2ZW50KTsKIAorCS8qIE5vdyB3ZSBjYW4gaW5pdGlhbGl6ZSBxdW90YXMgYmVjYXVzZSB3ZSBjYW4gYWZmb3JkIHRvIHdhaXQKKwkgKiBmb3IgY2x1c3RlciBsb2NrcyByZWNvdmVyeSBub3cuIFRoYXQgYWxzbyBtZWFucyB0aGF0IHRydW5jYXRpb24KKwkgKiBsb2cgcmVjb3ZlcnkgY2FuIGhhcHBlbiBidXQgdGhhdCB3YWl0cyBmb3IgcHJvcGVyIHF1b3RhIHNldHVwICovCisJaWYgKCEoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpKSB7CisJCXN0YXR1cyA9IG9jZnMyX2VuYWJsZV9xdW90YXMob3NiKTsKKwkJaWYgKHN0YXR1cyA8IDApIHsKKwkJCS8qIFdlIGhhdmUgdG8gZXJyLW91dCBzcGVjaWFsbHkgaGVyZSBiZWNhdXNlCisJCQkgKiBzX3Jvb3QgaXMgYWxyZWFkeSBzZXQgKi8KKwkJCW1sb2dfZXJybm8oc3RhdHVzKTsKKwkJCWF0b21pY19zZXQoJm9zYi0+dm9sX3N0YXRlLCBWT0xVTUVfRElTQUJMRUQpOworCQkJd2FrZV91cCgmb3NiLT5vc2JfbW91bnRfZXZlbnQpOworCQkJbWxvZ19leGl0KHN0YXR1cyk7CisJCQlyZXR1cm4gc3RhdHVzOworCQl9CisJfQorCisJb2NmczJfY29tcGxldGVfcXVvdGFfcmVjb3Zlcnkob3NiKTsKKworCS8qIE5vdyB3ZSB3YWtlIHVwIGFnYWluIGZvciBwcm9jZXNzZXMgd2FpdGluZyBmb3IgcXVvdGFzICovCisJYXRvbWljX3NldCgmb3NiLT52b2xfc3RhdGUsIFZPTFVNRV9NT1VOVEVEX1FVT1RBUyk7CisJd2FrZV91cCgmb3NiLT5vc2JfbW91bnRfZXZlbnQpOworCiAJbWxvZ19leGl0KHN0YXR1cyk7CiAJcmV0dXJuIHN0YXR1czsKIApAQCAtOTQ1LDYgKzExNzMsNDEgQEAKIAkJY2FzZSBPcHRfaW5vZGU2NDoKIAkJCW1vcHQtPm1vdW50X29wdCB8PSBPQ0ZTMl9NT1VOVF9JTk9ERTY0OwogCQkJYnJlYWs7CisJCWNhc2UgT3B0X3VzcnF1b3RhOgorCQkJLyogV2UgY2hlY2sgb25seSBvbiByZW1vdW50LCBvdGhlcndpc2UgZmVhdHVyZXMKKwkJCSAqIGFyZW4ndCB5ZXQgaW5pdGlhbGl6ZWQuICovCisJCQlpZiAoaXNfcmVtb3VudCAmJiAhT0NGUzJfSEFTX1JPX0NPTVBBVF9GRUFUVVJFKHNiLAorCQkJICAgIE9DRlMyX0ZFQVRVUkVfUk9fQ09NUEFUX1VTUlFVT1RBKSkgeworCQkJCW1sb2coTUxfRVJST1IsICJVc2VyIHF1b3RhIHJlcXVlc3RlZCBidXQgIgorCQkJCSAgICAgImZpbGVzeXN0ZW0gZmVhdHVyZSBpcyBub3Qgc2V0XG4iKTsKKwkJCQlzdGF0dXMgPSAwOworCQkJCWdvdG8gYmFpbDsKKwkJCX0KKwkJCW1vcHQtPm1vdW50X29wdCB8PSBPQ0ZTMl9NT1VOVF9VU1JRVU9UQTsKKwkJCWJyZWFrOworCQljYXNlIE9wdF9ncnBxdW90YToKKwkJCWlmIChpc19yZW1vdW50ICYmICFPQ0ZTMl9IQVNfUk9fQ09NUEFUX0ZFQVRVUkUoc2IsCisJCQkgICAgT0NGUzJfRkVBVFVSRV9ST19DT01QQVRfR1JQUVVPVEEpKSB7CisJCQkJbWxvZyhNTF9FUlJPUiwgIkdyb3VwIHF1b3RhIHJlcXVlc3RlZCBidXQgIgorCQkJCSAgICAgImZpbGVzeXN0ZW0gZmVhdHVyZSBpcyBub3Qgc2V0XG4iKTsKKwkJCQlzdGF0dXMgPSAwOworCQkJCWdvdG8gYmFpbDsKKwkJCX0KKwkJCW1vcHQtPm1vdW50X29wdCB8PSBPQ0ZTMl9NT1VOVF9HUlBRVU9UQTsKKwkJCWJyZWFrOworI2lmZGVmIENPTkZJR19PQ0ZTMl9GU19QT1NJWF9BQ0wKKwkJY2FzZSBPcHRfYWNsOgorCQkJbW9wdC0+bW91bnRfb3B0IHw9IE9DRlMyX01PVU5UX1BPU0lYX0FDTDsKKwkJCWJyZWFrOworCQljYXNlIE9wdF9ub2FjbDoKKwkJCW1vcHQtPm1vdW50X29wdCAmPSB+T0NGUzJfTU9VTlRfUE9TSVhfQUNMOworCQkJYnJlYWs7CisjZWxzZQorCQljYXNlIE9wdF9hY2w6CisJCWNhc2UgT3B0X25vYWNsOgorCQkJcHJpbnRrKEtFUk5fSU5GTyAib2NmczIgKG5vKWFjbCBvcHRpb25zIG5vdCBzdXBwb3J0ZWRcbiIpOworCQkJYnJlYWs7CisjZW5kaWYKIAkJZGVmYXVsdDoKIAkJCW1sb2coTUxfRVJST1IsCiAJCQkgICAgICJVbnJlY29nbml6ZWQgbW91bnQgb3B0aW9uIFwiJXNcIiAiCkBAIC0xMDA4LDYgKzEyNzEsMTAgQEAKIAlpZiAob3NiLT5vc2JfY2x1c3Rlcl9zdGFja1swXSkKIAkJc2VxX3ByaW50ZihzLCAiLGNsdXN0ZXJfc3RhY2s9JS4qcyIsIE9DRlMyX1NUQUNLX0xBQkVMX0xFTiwKIAkJCSAgIG9zYi0+b3NiX2NsdXN0ZXJfc3RhY2spOworCWlmIChvcHRzICYgT0NGUzJfTU9VTlRfVVNSUVVPVEEpCisJCXNlcV9wcmludGYocywgIix1c3JxdW90YSIpOworCWlmIChvcHRzICYgT0NGUzJfTU9VTlRfR1JQUVVPVEEpCisJCXNlcV9wcmludGYocywgIixncnBxdW90YSIpOwogCiAJaWYgKG9wdHMgJiBPQ0ZTMl9NT1VOVF9OT1VTRVJYQVRUUikKIAkJc2VxX3ByaW50ZihzLCAiLG5vdXNlcl94YXR0ciIpOwpAQCAtMTAxNyw2ICsxMjg0LDEzIEBACiAJaWYgKG9wdHMgJiBPQ0ZTMl9NT1VOVF9JTk9ERTY0KQogCQlzZXFfcHJpbnRmKHMsICIsaW5vZGU2NCIpOwogCisjaWZkZWYgQ09ORklHX09DRlMyX0ZTX1BPU0lYX0FDTAorCWlmIChvcHRzICYgT0NGUzJfTU9VTlRfUE9TSVhfQUNMKQorCQlzZXFfcHJpbnRmKHMsICIsYWNsIik7CisJZWxzZQorCQlzZXFfcHJpbnRmKHMsICIsbm9hY2wiKTsKKyNlbmRpZgorCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTEwNTIsMTAgKzEzMjYsMTYgQEAKIAkJbWxvZyhNTF9FUlJPUiwgIlVuYWJsZSB0byBjcmVhdGUgb2NmczIgZGVidWdmcyByb290LlxuIik7CiAJfQogCisJc3RhdHVzID0gb2NmczJfcXVvdGFfc2V0dXAoKTsKKwlpZiAoc3RhdHVzKQorCQlnb3RvIGxlYXZlOworCiAJb2NmczJfc2V0X2xvY2tpbmdfcHJvdG9jb2woKTsKIAorCXN0YXR1cyA9IHJlZ2lzdGVyX3F1b3RhX2Zvcm1hdCgmb2NmczJfcXVvdGFfZm9ybWF0KTsKIGxlYXZlOgogCWlmIChzdGF0dXMgPCAwKSB7CisJCW9jZnMyX3F1b3RhX3NodXRkb3duKCk7CiAJCW9jZnMyX2ZyZWVfbWVtX2NhY2hlcygpOwogCQlleGl0X29jZnMyX3VwdG9kYXRlX2NhY2hlKCk7CiAJfQpAQCAtMTA3MiwxMSArMTM1MiwxNSBAQAogewogCW1sb2dfZW50cnlfdm9pZCgpOwogCisJb2NmczJfcXVvdGFfc2h1dGRvd24oKTsKKwogCWlmIChvY2ZzMl93cSkgewogCQlmbHVzaF93b3JrcXVldWUob2NmczJfd3EpOwogCQlkZXN0cm95X3dvcmtxdWV1ZShvY2ZzMl93cSk7CiAJfQogCisJdW5yZWdpc3Rlcl9xdW90YV9mb3JtYXQoJm9jZnMyX3F1b3RhX2Zvcm1hdCk7CisKIAlkZWJ1Z2ZzX3JlbW92ZShvY2ZzMl9kZWJ1Z2ZzX3Jvb3QpOwogCiAJb2NmczJfZnJlZV9tZW1fY2FjaGVzKCk7CkBAIC0xMTkyLDggKzE0NzYsMjcgQEAKIAkJCQkgICAgICAgKFNMQUJfSFdDQUNIRV9BTElHTnxTTEFCX1JFQ0xBSU1fQUNDT1VOVHwKIAkJCQkJCVNMQUJfTUVNX1NQUkVBRCksCiAJCQkJICAgICAgIG9jZnMyX2lub2RlX2luaXRfb25jZSk7Ci0JaWYgKCFvY2ZzMl9pbm9kZV9jYWNoZXApCisJb2NmczJfZHF1b3RfY2FjaGVwID0ga21lbV9jYWNoZV9jcmVhdGUoIm9jZnMyX2RxdW90X2NhY2hlIiwKKwkJCQkJc2l6ZW9mKHN0cnVjdCBvY2ZzMl9kcXVvdCksCisJCQkJCTAsCisJCQkJCShTTEFCX0hXQ0FDSEVfQUxJR058U0xBQl9SRUNMQUlNX0FDQ09VTlR8CisJCQkJCQlTTEFCX01FTV9TUFJFQUQpLAorCQkJCQlOVUxMKTsKKwlvY2ZzMl9xZl9jaHVua19jYWNoZXAgPSBrbWVtX2NhY2hlX2NyZWF0ZSgib2NmczJfcWZfY2h1bmtfY2FjaGUiLAorCQkJCQlzaXplb2Yoc3RydWN0IG9jZnMyX3F1b3RhX2NodW5rKSwKKwkJCQkJMCwKKwkJCQkJKFNMQUJfUkVDTEFJTV9BQ0NPVU5UfFNMQUJfTUVNX1NQUkVBRCksCisJCQkJCU5VTEwpOworCWlmICghb2NmczJfaW5vZGVfY2FjaGVwIHx8ICFvY2ZzMl9kcXVvdF9jYWNoZXAgfHwKKwkgICAgIW9jZnMyX3FmX2NodW5rX2NhY2hlcCkgeworCQlpZiAob2NmczJfaW5vZGVfY2FjaGVwKQorCQkJa21lbV9jYWNoZV9kZXN0cm95KG9jZnMyX2lub2RlX2NhY2hlcCk7CisJCWlmIChvY2ZzMl9kcXVvdF9jYWNoZXApCisJCQlrbWVtX2NhY2hlX2Rlc3Ryb3kob2NmczJfZHF1b3RfY2FjaGVwKTsKKwkJaWYgKG9jZnMyX3FmX2NodW5rX2NhY2hlcCkKKwkJCWttZW1fY2FjaGVfZGVzdHJveShvY2ZzMl9xZl9jaHVua19jYWNoZXApOwogCQlyZXR1cm4gLUVOT01FTTsKKwl9CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTEyMDIsOCArMTUwNSwxNSBAQAogewogCWlmIChvY2ZzMl9pbm9kZV9jYWNoZXApCiAJCWttZW1fY2FjaGVfZGVzdHJveShvY2ZzMl9pbm9kZV9jYWNoZXApOwotCiAJb2NmczJfaW5vZGVfY2FjaGVwID0gTlVMTDsKKworCWlmIChvY2ZzMl9kcXVvdF9jYWNoZXApCisJCWttZW1fY2FjaGVfZGVzdHJveShvY2ZzMl9kcXVvdF9jYWNoZXApOworCW9jZnMyX2RxdW90X2NhY2hlcCA9IE5VTEw7CisKKwlpZiAob2NmczJfcWZfY2h1bmtfY2FjaGVwKQorCQlrbWVtX2NhY2hlX2Rlc3Ryb3kob2NmczJfcWZfY2h1bmtfY2FjaGVwKTsKKwlvY2ZzMl9xZl9jaHVua19jYWNoZXAgPSBOVUxMOwogfQogCiBzdGF0aWMgaW50IG9jZnMyX2dldF9zZWN0b3Ioc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKQEAgLTEzMDMsNiArMTYxMyw4IEBACiAJb3NiID0gT0NGUzJfU0Ioc2IpOwogCUJVR19PTighb3NiKTsKIAorCW9jZnMyX2Rpc2FibGVfcXVvdGFzKG9zYik7CisKIAlvY2ZzMl9zaHV0ZG93bl9sb2NhbF9hbGxvYyhvc2IpOwogCiAJb2NmczJfdHJ1bmNhdGVfbG9nX3NodXRkb3duKG9zYik7CkBAIC0xNDEzLDYgKzE3MjUsOCBAQAogCXNiLT5zX2ZzX2luZm8gPSBvc2I7CiAJc2ItPnNfb3AgPSAmb2NmczJfc29wczsKIAlzYi0+c19leHBvcnRfb3AgPSAmb2NmczJfZXhwb3J0X29wczsKKwlzYi0+c19xY29wID0gJm9jZnMyX3F1b3RhY3RsX29wczsKKwlzYi0+ZHFfb3AgPSAmb2NmczJfcXVvdGFfb3BlcmF0aW9uczsKIAlzYi0+c194YXR0ciA9IG9jZnMyX3hhdHRyX2hhbmRsZXJzOwogCXNiLT5zX3RpbWVfZ3JhbiA9IDE7CiAJc2ItPnNfZmxhZ3MgfD0gTVNfTk9BVElNRTsKQEAgLTE2NzYsNiArMTk5MCwxNSBAQAogCiAJaWYgKG1lbWNtcChkaS0+aV9zaWduYXR1cmUsIE9DRlMyX1NVUEVSX0JMT0NLX1NJR05BVFVSRSwKIAkJICAgc3RybGVuKE9DRlMyX1NVUEVSX0JMT0NLX1NJR05BVFVSRSkpID09IDApIHsKKwkJLyogV2UgaGF2ZSB0byBkbyBhIHJhdyBjaGVjayBvZiB0aGUgZmVhdHVyZSBoZXJlICovCisJCWlmIChsZTMyX3RvX2NwdShkaS0+aWQyLmlfc3VwZXIuc19mZWF0dXJlX2luY29tcGF0KSAmCisJCSAgICBPQ0ZTMl9GRUFUVVJFX0lOQ09NUEFUX01FVEFfRUNDKSB7CisJCQlzdGF0dXMgPSBvY2ZzMl9ibG9ja19jaGVja192YWxpZGF0ZShiaC0+Yl9kYXRhLAorCQkJCQkJCSAgICBiaC0+Yl9zaXplLAorCQkJCQkJCSAgICAmZGktPmlfY2hlY2spOworCQkJaWYgKHN0YXR1cykKKwkJCQlnb3RvIG91dDsKKwkJfQogCQlzdGF0dXMgPSAtRUlOVkFMOwogCQlpZiAoKDEgPDwgbGUzMl90b19jcHUoZGktPmlkMi5pX3N1cGVyLnNfYmxvY2tzaXplX2JpdHMpKSAhPSBibGtzeikgewogCQkJbWxvZyhNTF9FUlJPUiwgImZvdW5kIHN1cGVyYmxvY2sgd2l0aCBpbmNvcnJlY3QgYmxvY2sgIgpAQCAtMTcxNyw2ICsyMDQwLDcgQEAKIAkJfQogCX0KIAorb3V0OgogCW1sb2dfZXhpdChzdGF0dXMpOwogCXJldHVybiBzdGF0dXM7CiB9CmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9zeW1saW5rLmMgYi9mcy9vY2ZzMi9zeW1saW5rLmMKaW5kZXggY2JkMDNkZi4uZWQwYTBjZiAxMDA2NDQKLS0tIGEvZnMvb2NmczIvc3ltbGluay5jCisrKyBiL2ZzL29jZnMyL3N5bWxpbmsuYwpAQCAtODQsNyArODQsNyBAQAogCiAJbWxvZ19lbnRyeV92b2lkKCk7CiAKLQlzdGF0dXMgPSBvY2ZzMl9yZWFkX2Jsb2NrKGlub2RlLCBPQ0ZTMl9JKGlub2RlKS0+aXBfYmxrbm8sIGJoKTsKKwlzdGF0dXMgPSBvY2ZzMl9yZWFkX2lub2RlX2Jsb2NrKGlub2RlLCBiaCk7CiAJaWYgKHN0YXR1cyA8IDApIHsKIAkJbWxvZ19lcnJubyhzdGF0dXMpOwogCQlsaW5rID0gRVJSX1BUUihzdGF0dXMpOwpkaWZmIC0tZ2l0IGEvZnMvb2NmczIveGF0dHIuYyBiL2ZzL29jZnMyL3hhdHRyLmMKaW5kZXggNzRkNzM2Ny4uZTFkNjM4YSAxMDA2NDQKLS0tIGEvZnMvb2NmczIveGF0dHIuYworKysgYi9mcy9vY2ZzMi94YXR0ci5jCkBAIC0zNSwxMiArMzUsMTQgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc2VjdXJpdHkuaD4KIAogI2RlZmluZSBNTE9HX01BU0tfUFJFRklYIE1MX1hBVFRSCiAjaW5jbHVkZSA8Y2x1c3Rlci9tYXNrbG9nLmg+CiAKICNpbmNsdWRlICJvY2ZzMi5oIgogI2luY2x1ZGUgImFsbG9jLmgiCisjaW5jbHVkZSAiYmxvY2tjaGVjay5oIgogI2luY2x1ZGUgImRsbWdsdWUuaCIKICNpbmNsdWRlICJmaWxlLmgiCiAjaW5jbHVkZSAic3ltbGluay5oIgpAQCAtNjEsMTIgKzYzLDMyIEBACiB9OwogCiBzdHJ1Y3Qgb2NmczJfeGF0dHJfYnVja2V0IHsKLQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoc1tPQ0ZTMl9YQVRUUl9NQVhfQkxPQ0tTX1BFUl9CVUNLRVRdOwotCXN0cnVjdCBvY2ZzMl94YXR0cl9oZWFkZXIgKnhoOworCS8qIFRoZSBpbm9kZSB0aGVzZSB4YXR0cnMgYXJlIGFzc29jaWF0ZWQgd2l0aCAqLworCXN0cnVjdCBpbm9kZSAqYnVfaW5vZGU7CisKKwkvKiBUaGUgYWN0dWFsIGJ1ZmZlcnMgdGhhdCBtYWtlIHVwIHRoZSBidWNrZXQgKi8KKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJ1X2Joc1tPQ0ZTMl9YQVRUUl9NQVhfQkxPQ0tTX1BFUl9CVUNLRVRdOworCisJLyogSG93IG1hbnkgYmxvY2tzIG1ha2UgdXAgb25lIGJ1Y2tldCBmb3IgdGhpcyBmaWxlc3lzdGVtICovCisJaW50IGJ1X2Jsb2NrczsKK307CisKK3N0cnVjdCBvY2ZzMl94YXR0cl9zZXRfY3R4dCB7CisJaGFuZGxlX3QgKmhhbmRsZTsKKwlzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqbWV0YV9hYzsKKwlzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqZGF0YV9hYzsKKwlzdHJ1Y3Qgb2NmczJfY2FjaGVkX2RlYWxsb2NfY3R4dCBkZWFsbG9jOwogfTsKIAogI2RlZmluZSBPQ0ZTMl9YQVRUUl9ST09UX1NJWkUJKHNpemVvZihzdHJ1Y3Qgb2NmczJfeGF0dHJfZGVmX3ZhbHVlX3Jvb3QpKQogI2RlZmluZSBPQ0ZTMl9YQVRUUl9JTkxJTkVfU0laRQk4MAorI2RlZmluZSBPQ0ZTMl9YQVRUUl9GUkVFX0lOX0lCT0RZCShPQ0ZTMl9NSU5fWEFUVFJfSU5MSU5FX1NJWkUgXAorCQkJCQkgLSBzaXplb2Yoc3RydWN0IG9jZnMyX3hhdHRyX2hlYWRlcikgXAorCQkJCQkgLSBzaXplb2YoX191MzIpKQorI2RlZmluZSBPQ0ZTMl9YQVRUUl9GUkVFX0lOX0JMT0NLKHB0cikJKChwdHIpLT5pX3NiLT5zX2Jsb2Nrc2l6ZSBcCisJCQkJCSAtIHNpemVvZihzdHJ1Y3Qgb2NmczJfeGF0dHJfYmxvY2spIFwKKwkJCQkJIC0gc2l6ZW9mKHN0cnVjdCBvY2ZzMl94YXR0cl9oZWFkZXIpIFwKKwkJCQkJIC0gc2l6ZW9mKF9fdTMyKSkKIAogc3RhdGljIHN0cnVjdCBvY2ZzMl94YXR0cl9kZWZfdmFsdWVfcm9vdCBkZWZfeHYgPSB7CiAJLnh2LnhyX2xpc3QubF9jb3VudCA9IGNwdV90b19sZTE2KDEpLApAQCAtNzQsMTMgKzk2LDI1IEBACiAKIHN0cnVjdCB4YXR0cl9oYW5kbGVyICpvY2ZzMl94YXR0cl9oYW5kbGVyc1tdID0gewogCSZvY2ZzMl94YXR0cl91c2VyX2hhbmRsZXIsCisjaWZkZWYgQ09ORklHX09DRlMyX0ZTX1BPU0lYX0FDTAorCSZvY2ZzMl94YXR0cl9hY2xfYWNjZXNzX2hhbmRsZXIsCisJJm9jZnMyX3hhdHRyX2FjbF9kZWZhdWx0X2hhbmRsZXIsCisjZW5kaWYKIAkmb2NmczJfeGF0dHJfdHJ1c3RlZF9oYW5kbGVyLAorCSZvY2ZzMl94YXR0cl9zZWN1cml0eV9oYW5kbGVyLAogCU5VTEwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgeGF0dHJfaGFuZGxlciAqb2NmczJfeGF0dHJfaGFuZGxlcl9tYXBbT0NGUzJfWEFUVFJfTUFYXSA9IHsKIAlbT0NGUzJfWEFUVFJfSU5ERVhfVVNFUl0JPSAmb2NmczJfeGF0dHJfdXNlcl9oYW5kbGVyLAorI2lmZGVmIENPTkZJR19PQ0ZTMl9GU19QT1NJWF9BQ0wKKwlbT0NGUzJfWEFUVFJfSU5ERVhfUE9TSVhfQUNMX0FDQ0VTU10KKwkJCQkJPSAmb2NmczJfeGF0dHJfYWNsX2FjY2Vzc19oYW5kbGVyLAorCVtPQ0ZTMl9YQVRUUl9JTkRFWF9QT1NJWF9BQ0xfREVGQVVMVF0KKwkJCQkJPSAmb2NmczJfeGF0dHJfYWNsX2RlZmF1bHRfaGFuZGxlciwKKyNlbmRpZgogCVtPQ0ZTMl9YQVRUUl9JTkRFWF9UUlVTVEVEXQk9ICZvY2ZzMl94YXR0cl90cnVzdGVkX2hhbmRsZXIsCisJW09DRlMyX1hBVFRSX0lOREVYX1NFQ1VSSVRZXQk9ICZvY2ZzMl94YXR0cl9zZWN1cml0eV9oYW5kbGVyLAogfTsKIAogc3RydWN0IG9jZnMyX3hhdHRyX2luZm8gewpAQCAtOTgsNyArMTMyLDcgQEAKIAkgKi8KIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKnhhdHRyX2JoOwogCXN0cnVjdCBvY2ZzMl94YXR0cl9oZWFkZXIgKmhlYWRlcjsKLQlzdHJ1Y3Qgb2NmczJfeGF0dHJfYnVja2V0IGJ1Y2tldDsKKwlzdHJ1Y3Qgb2NmczJfeGF0dHJfYnVja2V0ICpidWNrZXQ7CiAJdm9pZCAqYmFzZTsKIAl2b2lkICplbmQ7CiAJc3RydWN0IG9jZnMyX3hhdHRyX2VudHJ5ICpoZXJlOwpAQCAtMTI3LDE0ICsxNjEsMjAgQEAKIAkJCQkJc2l6ZV90IGJ1ZmZlcl9zaXplKTsKIAogc3RhdGljIGludCBvY2ZzMl94YXR0cl9jcmVhdGVfaW5kZXhfYmxvY2soc3RydWN0IGlub2RlICppbm9kZSwKLQkJCQkJICBzdHJ1Y3Qgb2NmczJfeGF0dHJfc2VhcmNoICp4cyk7CisJCQkJCSAgc3RydWN0IG9jZnMyX3hhdHRyX3NlYXJjaCAqeHMsCisJCQkJCSAgc3RydWN0IG9jZnMyX3hhdHRyX3NldF9jdHh0ICpjdHh0KTsKIAogc3RhdGljIGludCBvY2ZzMl94YXR0cl9zZXRfZW50cnlfaW5kZXhfYmxvY2soc3RydWN0IGlub2RlICppbm9kZSwKIAkJCQkJICAgICBzdHJ1Y3Qgb2NmczJfeGF0dHJfaW5mbyAqeGksCi0JCQkJCSAgICAgc3RydWN0IG9jZnMyX3hhdHRyX3NlYXJjaCAqeHMpOworCQkJCQkgICAgIHN0cnVjdCBvY2ZzMl94YXR0cl9zZWFyY2ggKnhzLAorCQkJCQkgICAgIHN0cnVjdCBvY2ZzMl94YXR0cl9zZXRfY3R4dCAqY3R4dCk7CiAKIHN0YXRpYyBpbnQgb2NmczJfZGVsZXRlX3hhdHRyX2luZGV4X2Jsb2NrKHN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJCQkJCSAgc3RydWN0IGJ1ZmZlcl9oZWFkICp4Yl9iaCk7CitzdGF0aWMgaW50IG9jZnMyX212X3hhdHRyX2J1Y2tldHMoc3RydWN0IGlub2RlICppbm9kZSwgaGFuZGxlX3QgKmhhbmRsZSwKKwkJCQkgIHU2NCBzcmNfYmxrLCB1NjQgbGFzdF9ibGssIHU2NCB0b19ibGssCisJCQkJICB1bnNpZ25lZCBpbnQgc3RhcnRfYnVja2V0LAorCQkJCSAgdTMyICpmaXJzdF9oYXNoKTsKIAogc3RhdGljIGlubGluZSB1MTYgb2NmczJfeGF0dHJfYnVja2V0c19wZXJfY2x1c3RlcihzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYikKIHsKQEAgLTE1NCw2ICsxOTQsMjE2IEBACiAJcmV0dXJuIGxlbiAvIHNpemVvZihzdHJ1Y3Qgb2NmczJfeGF0dHJfZW50cnkpOwogfQogCisjZGVmaW5lIGJ1Y2tldF9ibGtubyhfYikgKChfYiktPmJ1X2Joc1swXS0+Yl9ibG9ja25yKQorI2RlZmluZSBidWNrZXRfYmxvY2soX2IsIF9uKSAoKF9iKS0+YnVfYmhzWyhfbildLT5iX2RhdGEpCisjZGVmaW5lIGJ1Y2tldF94aChfYikgKChzdHJ1Y3Qgb2NmczJfeGF0dHJfaGVhZGVyICopYnVja2V0X2Jsb2NrKChfYiksIDApKQorCitzdGF0aWMgc3RydWN0IG9jZnMyX3hhdHRyX2J1Y2tldCAqb2NmczJfeGF0dHJfYnVja2V0X25ldyhzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXN0cnVjdCBvY2ZzMl94YXR0cl9idWNrZXQgKmJ1Y2tldDsKKwlpbnQgYmxrcyA9IG9jZnMyX2Jsb2Nrc19wZXJfeGF0dHJfYnVja2V0KGlub2RlLT5pX3NiKTsKKworCUJVR19PTihibGtzID4gT0NGUzJfWEFUVFJfTUFYX0JMT0NLU19QRVJfQlVDS0VUKTsKKworCWJ1Y2tldCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBvY2ZzMl94YXR0cl9idWNrZXQpLCBHRlBfTk9GUyk7CisJaWYgKGJ1Y2tldCkgeworCQlidWNrZXQtPmJ1X2lub2RlID0gaW5vZGU7CisJCWJ1Y2tldC0+YnVfYmxvY2tzID0gYmxrczsKKwl9CisKKwlyZXR1cm4gYnVja2V0OworfQorCitzdGF0aWMgdm9pZCBvY2ZzMl94YXR0cl9idWNrZXRfcmVsc2Uoc3RydWN0IG9jZnMyX3hhdHRyX2J1Y2tldCAqYnVja2V0KQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGJ1Y2tldC0+YnVfYmxvY2tzOyBpKyspIHsKKwkJYnJlbHNlKGJ1Y2tldC0+YnVfYmhzW2ldKTsKKwkJYnVja2V0LT5idV9iaHNbaV0gPSBOVUxMOworCX0KK30KKworc3RhdGljIHZvaWQgb2NmczJfeGF0dHJfYnVja2V0X2ZyZWUoc3RydWN0IG9jZnMyX3hhdHRyX2J1Y2tldCAqYnVja2V0KQoreworCWlmIChidWNrZXQpIHsKKwkJb2NmczJfeGF0dHJfYnVja2V0X3JlbHNlKGJ1Y2tldCk7CisJCWJ1Y2tldC0+YnVfaW5vZGUgPSBOVUxMOworCQlrZnJlZShidWNrZXQpOworCX0KK30KKworLyoKKyAqIEEgYnVja2V0IHRoYXQgaGFzIG5ldmVyIGJlZW4gd3JpdHRlbiB0byBkaXNrIGRvZXNuJ3QgbmVlZCB0byBiZQorICogcmVhZC4gIFdlIGp1c3QgbmVlZCB0aGUgYnVmZmVyX2hlYWRzLiAgRG9uJ3QgY2FsbCB0aGlzIGZvcgorICogYnVja2V0cyB0aGF0IGFyZSBhbHJlYWR5IG9uIGRpc2suICBvY2ZzMl9yZWFkX3hhdHRyX2J1Y2tldCgpIGluaXRpYWxpemVzCisgKiB0aGVtIGZ1bGx5LgorICovCitzdGF0aWMgaW50IG9jZnMyX2luaXRfeGF0dHJfYnVja2V0KHN0cnVjdCBvY2ZzMl94YXR0cl9idWNrZXQgKmJ1Y2tldCwKKwkJCQkgICB1NjQgeGJfYmxrbm8pCit7CisJaW50IGksIHJjID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBidWNrZXQtPmJ1X2Jsb2NrczsgaSsrKSB7CisJCWJ1Y2tldC0+YnVfYmhzW2ldID0gc2JfZ2V0YmxrKGJ1Y2tldC0+YnVfaW5vZGUtPmlfc2IsCisJCQkJCSAgICAgIHhiX2Jsa25vICsgaSk7CisJCWlmICghYnVja2V0LT5idV9iaHNbaV0pIHsKKwkJCXJjID0gLUVJTzsKKwkJCW1sb2dfZXJybm8ocmMpOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoIW9jZnMyX2J1ZmZlcl91cHRvZGF0ZShidWNrZXQtPmJ1X2lub2RlLAorCQkJCQkgICBidWNrZXQtPmJ1X2Joc1tpXSkpCisJCQlvY2ZzMl9zZXRfbmV3X2J1ZmZlcl91cHRvZGF0ZShidWNrZXQtPmJ1X2lub2RlLAorCQkJCQkJICAgICAgYnVja2V0LT5idV9iaHNbaV0pOworCX0KKworCWlmIChyYykKKwkJb2NmczJfeGF0dHJfYnVja2V0X3JlbHNlKGJ1Y2tldCk7CisJcmV0dXJuIHJjOworfQorCisvKiBSZWFkIHRoZSB4YXR0ciBidWNrZXQgYXQgeGJfYmxrbm8gKi8KK3N0YXRpYyBpbnQgb2NmczJfcmVhZF94YXR0cl9idWNrZXQoc3RydWN0IG9jZnMyX3hhdHRyX2J1Y2tldCAqYnVja2V0LAorCQkJCSAgIHU2NCB4Yl9ibGtubykKK3sKKwlpbnQgcmM7CisKKwlyYyA9IG9jZnMyX3JlYWRfYmxvY2tzKGJ1Y2tldC0+YnVfaW5vZGUsIHhiX2Jsa25vLAorCQkJICAgICAgIGJ1Y2tldC0+YnVfYmxvY2tzLCBidWNrZXQtPmJ1X2JocywgMCwKKwkJCSAgICAgICBOVUxMKTsKKwlpZiAoIXJjKSB7CisJCXJjID0gb2NmczJfdmFsaWRhdGVfbWV0YV9lY2NfYmhzKGJ1Y2tldC0+YnVfaW5vZGUtPmlfc2IsCisJCQkJCQkgYnVja2V0LT5idV9iaHMsCisJCQkJCQkgYnVja2V0LT5idV9ibG9ja3MsCisJCQkJCQkgJmJ1Y2tldF94aChidWNrZXQpLT54aF9jaGVjayk7CisJCWlmIChyYykKKwkJCW1sb2dfZXJybm8ocmMpOworCX0KKworCWlmIChyYykKKwkJb2NmczJfeGF0dHJfYnVja2V0X3JlbHNlKGJ1Y2tldCk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IG9jZnMyX3hhdHRyX2J1Y2tldF9qb3VybmFsX2FjY2VzcyhoYW5kbGVfdCAqaGFuZGxlLAorCQkJCQkgICAgIHN0cnVjdCBvY2ZzMl94YXR0cl9idWNrZXQgKmJ1Y2tldCwKKwkJCQkJICAgICBpbnQgdHlwZSkKK3sKKwlpbnQgaSwgcmMgPSAwOworCisJZm9yIChpID0gMDsgaSA8IGJ1Y2tldC0+YnVfYmxvY2tzOyBpKyspIHsKKwkJcmMgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGJ1Y2tldC0+YnVfaW5vZGUsCisJCQkJCSAgYnVja2V0LT5idV9iaHNbaV0sIHR5cGUpOworCQlpZiAocmMpIHsKKwkJCW1sb2dfZXJybm8ocmMpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyB2b2lkIG9jZnMyX3hhdHRyX2J1Y2tldF9qb3VybmFsX2RpcnR5KGhhbmRsZV90ICpoYW5kbGUsCisJCQkJCSAgICAgc3RydWN0IG9jZnMyX3hhdHRyX2J1Y2tldCAqYnVja2V0KQoreworCWludCBpOworCisJb2NmczJfY29tcHV0ZV9tZXRhX2VjY19iaHMoYnVja2V0LT5idV9pbm9kZS0+aV9zYiwKKwkJCQkgICBidWNrZXQtPmJ1X2JocywgYnVja2V0LT5idV9ibG9ja3MsCisJCQkJICAgJmJ1Y2tldF94aChidWNrZXQpLT54aF9jaGVjayk7CisKKwlmb3IgKGkgPSAwOyBpIDwgYnVja2V0LT5idV9ibG9ja3M7IGkrKykKKwkJb2NmczJfam91cm5hbF9kaXJ0eShoYW5kbGUsIGJ1Y2tldC0+YnVfYmhzW2ldKTsKK30KKworc3RhdGljIHZvaWQgb2NmczJfeGF0dHJfYnVja2V0X2NvcHlfZGF0YShzdHJ1Y3Qgb2NmczJfeGF0dHJfYnVja2V0ICpkZXN0LAorCQkJCQkgc3RydWN0IG9jZnMyX3hhdHRyX2J1Y2tldCAqc3JjKQoreworCWludCBpOworCWludCBibG9ja3NpemUgPSBzcmMtPmJ1X2lub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZTsKKworCUJVR19PTihkZXN0LT5idV9ibG9ja3MgIT0gc3JjLT5idV9ibG9ja3MpOworCUJVR19PTihkZXN0LT5idV9pbm9kZSAhPSBzcmMtPmJ1X2lub2RlKTsKKworCWZvciAoaSA9IDA7IGkgPCBzcmMtPmJ1X2Jsb2NrczsgaSsrKSB7CisJCW1lbWNweShidWNrZXRfYmxvY2soZGVzdCwgaSksIGJ1Y2tldF9ibG9jayhzcmMsIGkpLAorCQkgICAgICAgYmxvY2tzaXplKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgb2NmczJfdmFsaWRhdGVfeGF0dHJfYmxvY2soc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJCQkgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQoreworCWludCByYzsKKwlzdHJ1Y3Qgb2NmczJfeGF0dHJfYmxvY2sgKnhiID0KKwkJKHN0cnVjdCBvY2ZzMl94YXR0cl9ibG9jayAqKWJoLT5iX2RhdGE7CisKKwltbG9nKDAsICJWYWxpZGF0aW5nIHhhdHRyIGJsb2NrICVsbHVcbiIsCisJICAgICAodW5zaWduZWQgbG9uZyBsb25nKWJoLT5iX2Jsb2NrbnIpOworCisJQlVHX09OKCFidWZmZXJfdXB0b2RhdGUoYmgpKTsKKworCS8qCisJICogSWYgdGhlIGVjYyBmYWlscywgd2UgcmV0dXJuIHRoZSBlcnJvciBidXQgb3RoZXJ3aXNlCisJICogbGVhdmUgdGhlIGZpbGVzeXN0ZW0gcnVubmluZy4gIFdlIGtub3cgYW55IGVycm9yIGlzCisJICogbG9jYWwgdG8gdGhpcyBibG9jay4KKwkgKi8KKwlyYyA9IG9jZnMyX3ZhbGlkYXRlX21ldGFfZWNjKHNiLCBiaC0+Yl9kYXRhLCAmeGItPnhiX2NoZWNrKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCS8qCisJICogRXJyb3JzIGFmdGVyIGhlcmUgYXJlIGZhdGFsCisJICovCisKKwlpZiAoIU9DRlMyX0lTX1ZBTElEX1hBVFRSX0JMT0NLKHhiKSkgeworCQlvY2ZzMl9lcnJvcihzYiwKKwkJCSAgICAiRXh0ZW5kZWQgYXR0cmlidXRlIGJsb2NrICMlbGx1IGhhcyBiYWQgIgorCQkJICAgICJzaWduYXR1cmUgJS4qcyIsCisJCQkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyliaC0+Yl9ibG9ja25yLCA3LAorCQkJICAgIHhiLT54Yl9zaWduYXR1cmUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAobGU2NF90b19jcHUoeGItPnhiX2Jsa25vKSAhPSBiaC0+Yl9ibG9ja25yKSB7CisJCW9jZnMyX2Vycm9yKHNiLAorCQkJICAgICJFeHRlbmRlZCBhdHRyaWJ1dGUgYmxvY2sgIyVsbHUgaGFzIGFuICIKKwkJCSAgICAiaW52YWxpZCB4Yl9ibGtubyBvZiAlbGx1IiwKKwkJCSAgICAodW5zaWduZWQgbG9uZyBsb25nKWJoLT5iX2Jsb2NrbnIsCisJCQkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylsZTY0X3RvX2NwdSh4Yi0+eGJfYmxrbm8pKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGxlMzJfdG9fY3B1KHhiLT54Yl9mc19nZW5lcmF0aW9uKSAhPSBPQ0ZTMl9TQihzYiktPmZzX2dlbmVyYXRpb24pIHsKKwkJb2NmczJfZXJyb3Ioc2IsCisJCQkgICAgIkV4dGVuZGVkIGF0dHJpYnV0ZSBibG9jayAjJWxsdSBoYXMgYW4gaW52YWxpZCAiCisJCQkgICAgInhiX2ZzX2dlbmVyYXRpb24gb2YgIyV1IiwKKwkJCSAgICAodW5zaWduZWQgbG9uZyBsb25nKWJoLT5iX2Jsb2NrbnIsCisJCQkgICAgbGUzMl90b19jcHUoeGItPnhiX2ZzX2dlbmVyYXRpb24pKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb2NmczJfcmVhZF94YXR0cl9ibG9jayhzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1NjQgeGJfYmxrbm8sCisJCQkJICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKipiaCkKK3sKKwlpbnQgcmM7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICp0bXAgPSAqYmg7CisKKwlyYyA9IG9jZnMyX3JlYWRfYmxvY2soaW5vZGUsIHhiX2Jsa25vLCAmdG1wLAorCQkJICAgICAgb2NmczJfdmFsaWRhdGVfeGF0dHJfYmxvY2spOworCisJLyogSWYgb2NmczJfcmVhZF9ibG9jaygpIGdvdCB1cyBhIG5ldyBiaCwgcGFzcyBpdCB1cC4gKi8KKwlpZiAoIXJjICYmICEqYmgpCisJCSpiaCA9IHRtcDsKKworCXJldHVybiByYzsKK30KKwogc3RhdGljIGlubGluZSBjb25zdCBjaGFyICpvY2ZzMl94YXR0cl9wcmVmaXgoaW50IG5hbWVfaW5kZXgpCiB7CiAJc3RydWN0IHhhdHRyX2hhbmRsZXIgKmhhbmRsZXIgPSBOVUxMOwpAQCAtMjAwLDU0ICs0NTAsMTYzIEBACiAJcmV0dXJuOwogfQogCitzdGF0aWMgaW50IG9jZnMyX3hhdHRyX2VudHJ5X3JlYWxfc2l6ZShpbnQgbmFtZV9sZW4sIHNpemVfdCB2YWx1ZV9sZW4pCit7CisJaW50IHNpemUgPSAwOworCisJaWYgKHZhbHVlX2xlbiA8PSBPQ0ZTMl9YQVRUUl9JTkxJTkVfU0laRSkKKwkJc2l6ZSA9IE9DRlMyX1hBVFRSX1NJWkUobmFtZV9sZW4pICsgT0NGUzJfWEFUVFJfU0laRSh2YWx1ZV9sZW4pOworCWVsc2UKKwkJc2l6ZSA9IE9DRlMyX1hBVFRSX1NJWkUobmFtZV9sZW4pICsgT0NGUzJfWEFUVFJfUk9PVF9TSVpFOworCXNpemUgKz0gc2l6ZW9mKHN0cnVjdCBvY2ZzMl94YXR0cl9lbnRyeSk7CisKKwlyZXR1cm4gc2l6ZTsKK30KKworaW50IG9jZnMyX2NhbGNfc2VjdXJpdHlfaW5pdChzdHJ1Y3QgaW5vZGUgKmRpciwKKwkJCSAgICAgc3RydWN0IG9jZnMyX3NlY3VyaXR5X3hhdHRyX2luZm8gKnNpLAorCQkJICAgICBpbnQgKndhbnRfY2x1c3RlcnMsCisJCQkgICAgIGludCAqeGF0dHJfY3JlZGl0cywKKwkJCSAgICAgc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKip4YXR0cl9hYykKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiA9IE9DRlMyX1NCKGRpci0+aV9zYik7CisJaW50IHNfc2l6ZSA9IG9jZnMyX3hhdHRyX2VudHJ5X3JlYWxfc2l6ZShzdHJsZW4oc2ktPm5hbWUpLAorCQkJCQkJIHNpLT52YWx1ZV9sZW4pOworCisJLyoKKwkgKiBUaGUgbWF4IHNwYWNlIG9mIHNlY3VyaXR5IHhhdHRyIHRha2VuIGlubGluZSBpcworCSAqIDI1NihuYW1lKSArIDgwKHZhbHVlKSArIDE2KGVudHJ5KSA9IDM1MiBieXRlcywKKwkgKiBTbyByZXNlcnZlIG9uZSBtZXRhZGF0YSBibG9jayBmb3IgaXQgaXMgb2suCisJICovCisJaWYgKGRpci0+aV9zYi0+c19ibG9ja3NpemUgPT0gT0NGUzJfTUlOX0JMT0NLU0laRSB8fAorCSAgICBzX3NpemUgPiBPQ0ZTMl9YQVRUUl9GUkVFX0lOX0lCT0RZKSB7CisJCXJldCA9IG9jZnMyX3Jlc2VydmVfbmV3X21ldGFkYXRhX2Jsb2Nrcyhvc2IsIDEsIHhhdHRyX2FjKTsKKwkJaWYgKHJldCkgeworCQkJbWxvZ19lcnJubyhyZXQpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCQkqeGF0dHJfY3JlZGl0cyArPSBPQ0ZTMl9YQVRUUl9CTE9DS19DUkVBVEVfQ1JFRElUUzsKKwl9CisKKwkvKiByZXNlcnZlIGNsdXN0ZXJzIGZvciB4YXR0ciB2YWx1ZSB3aGljaCB3aWxsIGJlIHNldCBpbiBCIHRyZWUqLworCWlmIChzaS0+dmFsdWVfbGVuID4gT0NGUzJfWEFUVFJfSU5MSU5FX1NJWkUpIHsKKwkJaW50IG5ld19jbHVzdGVycyA9IG9jZnMyX2NsdXN0ZXJzX2Zvcl9ieXRlcyhkaXItPmlfc2IsCisJCQkJCQkJICAgIHNpLT52YWx1ZV9sZW4pOworCisJCSp4YXR0cl9jcmVkaXRzICs9IG9jZnMyX2NsdXN0ZXJzX3RvX2Jsb2NrcyhkaXItPmlfc2IsCisJCQkJCQkJICAgbmV3X2NsdXN0ZXJzKTsKKwkJKndhbnRfY2x1c3RlcnMgKz0gbmV3X2NsdXN0ZXJzOworCX0KKwlyZXR1cm4gcmV0OworfQorCitpbnQgb2NmczJfY2FsY194YXR0cl9pbml0KHN0cnVjdCBpbm9kZSAqZGlyLAorCQkJICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRpcl9iaCwKKwkJCSAgaW50IG1vZGUsCisJCQkgIHN0cnVjdCBvY2ZzMl9zZWN1cml0eV94YXR0cl9pbmZvICpzaSwKKwkJCSAgaW50ICp3YW50X2NsdXN0ZXJzLAorCQkJICBpbnQgKnhhdHRyX2NyZWRpdHMsCisJCQkgIHN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICoqeGF0dHJfYWMpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IG9jZnMyX3N1cGVyICpvc2IgPSBPQ0ZTMl9TQihkaXItPmlfc2IpOworCWludCBzX3NpemUgPSAwLCBhX3NpemUgPSAwLCBhY2xfbGVuID0gMCwgbmV3X2NsdXN0ZXJzOworCisJaWYgKHNpLT5lbmFibGUpCisJCXNfc2l6ZSA9IG9jZnMyX3hhdHRyX2VudHJ5X3JlYWxfc2l6ZShzdHJsZW4oc2ktPm5hbWUpLAorCQkJCQkJICAgICBzaS0+dmFsdWVfbGVuKTsKKworCWlmIChvc2ItPnNfbW91bnRfb3B0ICYgT0NGUzJfTU9VTlRfUE9TSVhfQUNMKSB7CisJCWFjbF9sZW4gPSBvY2ZzMl94YXR0cl9nZXRfbm9sb2NrKGRpciwgZGlyX2JoLAorCQkJCQlPQ0ZTMl9YQVRUUl9JTkRFWF9QT1NJWF9BQ0xfREVGQVVMVCwKKwkJCQkJIiIsIE5VTEwsIDApOworCQlpZiAoYWNsX2xlbiA+IDApIHsKKwkJCWFfc2l6ZSA9IG9jZnMyX3hhdHRyX2VudHJ5X3JlYWxfc2l6ZSgwLCBhY2xfbGVuKTsKKwkJCWlmIChTX0lTRElSKG1vZGUpKQorCQkJCWFfc2l6ZSA8PD0gMTsKKwkJfSBlbHNlIGlmIChhY2xfbGVuICE9IDAgJiYgYWNsX2xlbiAhPSAtRU5PREFUQSkgeworCQkJbWxvZ19lcnJubyhyZXQpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKworCWlmICghKHNfc2l6ZSArIGFfc2l6ZSkpCisJCXJldHVybiByZXQ7CisKKwkvKgorCSAqIFRoZSBtYXggc3BhY2Ugb2Ygc2VjdXJpdHkgeGF0dHIgdGFrZW4gaW5saW5lIGlzCisJICogMjU2KG5hbWUpICsgODAodmFsdWUpICsgMTYoZW50cnkpID0gMzUyIGJ5dGVzLAorCSAqIFRoZSBtYXggc3BhY2Ugb2YgYWNsIHhhdHRyIHRha2VuIGlubGluZSBpcworCSAqIDgwKHZhbHVlKSArIDE2KGVudHJ5KSAqIDIoaWYgZGlyZWN0b3J5KSA9IDE5MiBieXRlcywKKwkgKiB3aGVuIGJsb2Nrc2l6ZSA9IDUxMiwgbWF5IHJlc2VydmUgb25lIG1vcmUgY2x1c2VyIGZvcgorCSAqIHhhdHRyIGJ1Y2tldCwgb3RoZXJ3aXNlIHJlc2VydmUgb25lIG1ldGFkYXRhIGJsb2NrCisJICogZm9yIHRoZW0gaXMgb2suCisJICovCisJaWYgKGRpci0+aV9zYi0+c19ibG9ja3NpemUgPT0gT0NGUzJfTUlOX0JMT0NLU0laRSB8fAorCSAgICAoc19zaXplICsgYV9zaXplKSA+IE9DRlMyX1hBVFRSX0ZSRUVfSU5fSUJPRFkpIHsKKwkJcmV0ID0gb2NmczJfcmVzZXJ2ZV9uZXdfbWV0YWRhdGFfYmxvY2tzKG9zYiwgMSwgeGF0dHJfYWMpOworCQlpZiAocmV0KSB7CisJCQltbG9nX2Vycm5vKHJldCk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJCSp4YXR0cl9jcmVkaXRzICs9IE9DRlMyX1hBVFRSX0JMT0NLX0NSRUFURV9DUkVESVRTOworCX0KKworCWlmIChkaXItPmlfc2ItPnNfYmxvY2tzaXplID09IE9DRlMyX01JTl9CTE9DS1NJWkUgJiYKKwkgICAgKHNfc2l6ZSArIGFfc2l6ZSkgPiBPQ0ZTMl9YQVRUUl9GUkVFX0lOX0JMT0NLKGRpcikpIHsKKwkJKndhbnRfY2x1c3RlcnMgKz0gMTsKKwkJKnhhdHRyX2NyZWRpdHMgKz0gb2NmczJfYmxvY2tzX3Blcl94YXR0cl9idWNrZXQoZGlyLT5pX3NiKTsKKwl9CisKKwkvKgorCSAqIHJlc2VydmUgY3JlZGl0cyBhbmQgY2x1c3RlcnMgZm9yIHhhdHRycyB3aGljaCBoYXMgbGFyZ2UgdmFsdWUKKwkgKiBhbmQgaGF2ZSB0byBiZSBzZXQgb3V0c2lkZQorCSAqLworCWlmIChzaS0+ZW5hYmxlICYmIHNpLT52YWx1ZV9sZW4gPiBPQ0ZTMl9YQVRUUl9JTkxJTkVfU0laRSkgeworCQluZXdfY2x1c3RlcnMgPSBvY2ZzMl9jbHVzdGVyc19mb3JfYnl0ZXMoZGlyLT5pX3NiLAorCQkJCQkJCXNpLT52YWx1ZV9sZW4pOworCQkqeGF0dHJfY3JlZGl0cyArPSBvY2ZzMl9jbHVzdGVyc190b19ibG9ja3MoZGlyLT5pX3NiLAorCQkJCQkJCSAgIG5ld19jbHVzdGVycyk7CisJCSp3YW50X2NsdXN0ZXJzICs9IG5ld19jbHVzdGVyczsKKwl9CisJaWYgKG9zYi0+c19tb3VudF9vcHQgJiBPQ0ZTMl9NT1VOVF9QT1NJWF9BQ0wgJiYKKwkgICAgYWNsX2xlbiA+IE9DRlMyX1hBVFRSX0lOTElORV9TSVpFKSB7CisJCS8qIGZvciBkaXJlY3RvcnksIGl0IGhhcyBERUZBVUxUIGFuZCBBQ0NFU1MgdHdvIHR5cGVzIG9mIGFjbHMgKi8KKwkJbmV3X2NsdXN0ZXJzID0gKFNfSVNESVIobW9kZSkgPyAyIDogMSkgKgorCQkJCW9jZnMyX2NsdXN0ZXJzX2Zvcl9ieXRlcyhkaXItPmlfc2IsIGFjbF9sZW4pOworCQkqeGF0dHJfY3JlZGl0cyArPSBvY2ZzMl9jbHVzdGVyc190b19ibG9ja3MoZGlyLT5pX3NiLAorCQkJCQkJCSAgIG5ld19jbHVzdGVycyk7CisJCSp3YW50X2NsdXN0ZXJzICs9IG5ld19jbHVzdGVyczsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCiBzdGF0aWMgaW50IG9jZnMyX3hhdHRyX2V4dGVuZF9hbGxvY2F0aW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJCQkJCSB1MzIgY2x1c3RlcnNfdG9fYWRkLAotCQkJCQkgc3RydWN0IGJ1ZmZlcl9oZWFkICp4YXR0cl9iaCwKLQkJCQkJIHN0cnVjdCBvY2ZzMl94YXR0cl92YWx1ZV9yb290ICp4dikKKwkJCQkJIHN0cnVjdCBvY2ZzMl94YXR0cl92YWx1ZV9idWYgKnZiLAorCQkJCQkgc3RydWN0IG9jZnMyX3hhdHRyX3NldF9jdHh0ICpjdHh0KQogewogCWludCBzdGF0dXMgPSAwOwotCWludCByZXN0YXJ0X2Z1bmMgPSAwOwotCWludCBjcmVkaXRzID0gMDsKLQloYW5kbGVfdCAqaGFuZGxlID0gTlVMTDsKLQlzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqZGF0YV9hYyA9IE5VTEw7Ci0Jc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKm1ldGFfYWMgPSBOVUxMOworCWhhbmRsZV90ICpoYW5kbGUgPSBjdHh0LT5oYW5kbGU7CiAJZW51bSBvY2ZzMl9hbGxvY19yZXN0YXJ0ZWQgd2h5OwogCXN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiID0gT0NGUzJfU0IoaW5vZGUtPmlfc2IpOwotCXUzMiBwcmV2X2NsdXN0ZXJzLCBsb2dpY2FsX3N0YXJ0ID0gbGUzMl90b19jcHUoeHYtPnhyX2NsdXN0ZXJzKTsKKwl1MzIgcHJldl9jbHVzdGVycywgbG9naWNhbF9zdGFydCA9IGxlMzJfdG9fY3B1KHZiLT52Yl94di0+eHJfY2x1c3RlcnMpOwogCXN0cnVjdCBvY2ZzMl9leHRlbnRfdHJlZSBldDsKIAogCW1sb2coMCwgIihjbHVzdGVyc190b19hZGQgZm9yIHhhdHRyPSAldSlcbiIsIGNsdXN0ZXJzX3RvX2FkZCk7CiAKLQlvY2ZzMl9pbml0X3hhdHRyX3ZhbHVlX2V4dGVudF90cmVlKCZldCwgaW5vZGUsIHhhdHRyX2JoLCB4dik7CisJb2NmczJfaW5pdF94YXR0cl92YWx1ZV9leHRlbnRfdHJlZSgmZXQsIGlub2RlLCB2Yik7CiAKLXJlc3RhcnRfYWxsOgotCi0Jc3RhdHVzID0gb2NmczJfbG9ja19hbGxvY2F0b3JzKGlub2RlLCAmZXQsIGNsdXN0ZXJzX3RvX2FkZCwgMCwKLQkJCQkgICAgICAgJmRhdGFfYWMsICZtZXRhX2FjKTsKLQlpZiAoc3RhdHVzKSB7Ci0JCW1sb2dfZXJybm8oc3RhdHVzKTsKLQkJZ290byBsZWF2ZTsKLQl9Ci0KLQljcmVkaXRzID0gb2NmczJfY2FsY19leHRlbmRfY3JlZGl0cyhvc2ItPnNiLCBldC5ldF9yb290X2VsLAotCQkJCQkgICAgY2x1c3RlcnNfdG9fYWRkKTsKLQloYW5kbGUgPSBvY2ZzMl9zdGFydF90cmFucyhvc2IsIGNyZWRpdHMpOwotCWlmIChJU19FUlIoaGFuZGxlKSkgewotCQlzdGF0dXMgPSBQVFJfRVJSKGhhbmRsZSk7Ci0JCWhhbmRsZSA9IE5VTEw7Ci0JCW1sb2dfZXJybm8oc3RhdHVzKTsKLQkJZ290byBsZWF2ZTsKLQl9Ci0KLXJlc3RhcnRlZF90cmFuc2FjdGlvbjoKLQlzdGF0dXMgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGlub2RlLCB4YXR0cl9iaCwKLQkJCQkgICAgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CisJc3RhdHVzID0gdmItPnZiX2FjY2VzcyhoYW5kbGUsIGlub2RlLCB2Yi0+dmJfYmgsCisJCQkgICAgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CiAJaWYgKHN0YXR1cyA8IDApIHsKIAkJbWxvZ19lcnJubyhzdGF0dXMpOwogCQlnb3RvIGxlYXZlOwogCX0KIAotCXByZXZfY2x1c3RlcnMgPSBsZTMyX3RvX2NwdSh4di0+eHJfY2x1c3RlcnMpOworCXByZXZfY2x1c3RlcnMgPSBsZTMyX3RvX2NwdSh2Yi0+dmJfeHYtPnhyX2NsdXN0ZXJzKTsKIAlzdGF0dXMgPSBvY2ZzMl9hZGRfY2x1c3RlcnNfaW5fYnRyZWUob3NiLAogCQkJCQkgICAgIGlub2RlLAogCQkJCQkgICAgICZsb2dpY2FsX3N0YXJ0LApAQCAtMjU1LDE1NyArNjE0LDg0IEBACiAJCQkJCSAgICAgMCwKIAkJCQkJICAgICAmZXQsCiAJCQkJCSAgICAgaGFuZGxlLAotCQkJCQkgICAgIGRhdGFfYWMsCi0JCQkJCSAgICAgbWV0YV9hYywKKwkJCQkJICAgICBjdHh0LT5kYXRhX2FjLAorCQkJCQkgICAgIGN0eHQtPm1ldGFfYWMsCiAJCQkJCSAgICAgJndoeSk7Ci0JaWYgKChzdGF0dXMgPCAwKSAmJiAoc3RhdHVzICE9IC1FQUdBSU4pKSB7Ci0JCWlmIChzdGF0dXMgIT0gLUVOT1NQQykKLQkJCW1sb2dfZXJybm8oc3RhdHVzKTsKLQkJZ290byBsZWF2ZTsKLQl9Ci0KLQlzdGF0dXMgPSBvY2ZzMl9qb3VybmFsX2RpcnR5KGhhbmRsZSwgeGF0dHJfYmgpOwogCWlmIChzdGF0dXMgPCAwKSB7CiAJCW1sb2dfZXJybm8oc3RhdHVzKTsKIAkJZ290byBsZWF2ZTsKIAl9CiAKLQljbHVzdGVyc190b19hZGQgLT0gbGUzMl90b19jcHUoeHYtPnhyX2NsdXN0ZXJzKSAtIHByZXZfY2x1c3RlcnM7Ci0KLQlpZiAod2h5ICE9IFJFU1RBUlRfTk9ORSAmJiBjbHVzdGVyc190b19hZGQpIHsKLQkJaWYgKHdoeSA9PSBSRVNUQVJUX01FVEEpIHsKLQkJCW1sb2coMCwgInJlc3RhcnRpbmcgZnVuY3Rpb24uXG4iKTsKLQkJCXJlc3RhcnRfZnVuYyA9IDE7Ci0JCX0gZWxzZSB7Ci0JCQlCVUdfT04od2h5ICE9IFJFU1RBUlRfVFJBTlMpOwotCi0JCQltbG9nKDAsICJyZXN0YXJ0aW5nIHRyYW5zYWN0aW9uLlxuIik7Ci0JCQkvKiBUT0RPOiBUaGlzIGNhbiBiZSBtb3JlIGludGVsbGlnZW50LiAqLwotCQkJY3JlZGl0cyA9IG9jZnMyX2NhbGNfZXh0ZW5kX2NyZWRpdHMob3NiLT5zYiwKLQkJCQkJCQkgICAgZXQuZXRfcm9vdF9lbCwKLQkJCQkJCQkgICAgY2x1c3RlcnNfdG9fYWRkKTsKLQkJCXN0YXR1cyA9IG9jZnMyX2V4dGVuZF90cmFucyhoYW5kbGUsIGNyZWRpdHMpOwotCQkJaWYgKHN0YXR1cyA8IDApIHsKLQkJCQkvKiBoYW5kbGUgc3RpbGwgaGFzIHRvIGJlIGNvbW1pdHRlZCBhdAotCQkJCSAqIHRoaXMgcG9pbnQuICovCi0JCQkJc3RhdHVzID0gLUVOT01FTTsKLQkJCQltbG9nX2Vycm5vKHN0YXR1cyk7Ci0JCQkJZ290byBsZWF2ZTsKLQkJCX0KLQkJCWdvdG8gcmVzdGFydGVkX3RyYW5zYWN0aW9uOwotCQl9CisJc3RhdHVzID0gb2NmczJfam91cm5hbF9kaXJ0eShoYW5kbGUsIHZiLT52Yl9iaCk7CisJaWYgKHN0YXR1cyA8IDApIHsKKwkJbWxvZ19lcnJubyhzdGF0dXMpOworCQlnb3RvIGxlYXZlOwogCX0KIAorCWNsdXN0ZXJzX3RvX2FkZCAtPSBsZTMyX3RvX2NwdSh2Yi0+dmJfeHYtPnhyX2NsdXN0ZXJzKSAtIHByZXZfY2x1c3RlcnM7CisKKwkvKgorCSAqIFdlIHNob3VsZCBoYXZlIGFscmVhZHkgYWxsb2NhdGVkIGVub3VnaCBzcGFjZSBiZWZvcmUgdGhlIHRyYW5zYWN0aW9uLAorCSAqIHNvIG5vIG5lZWQgdG8gcmVzdGFydC4KKwkgKi8KKwlCVUdfT04od2h5ICE9IFJFU1RBUlRfTk9ORSB8fCBjbHVzdGVyc190b19hZGQpOworCiBsZWF2ZToKLQlpZiAoaGFuZGxlKSB7Ci0JCW9jZnMyX2NvbW1pdF90cmFucyhvc2IsIGhhbmRsZSk7Ci0JCWhhbmRsZSA9IE5VTEw7Ci0JfQotCWlmIChkYXRhX2FjKSB7Ci0JCW9jZnMyX2ZyZWVfYWxsb2NfY29udGV4dChkYXRhX2FjKTsKLQkJZGF0YV9hYyA9IE5VTEw7Ci0JfQotCWlmIChtZXRhX2FjKSB7Ci0JCW9jZnMyX2ZyZWVfYWxsb2NfY29udGV4dChtZXRhX2FjKTsKLQkJbWV0YV9hYyA9IE5VTEw7Ci0JfQotCWlmICgoIXN0YXR1cykgJiYgcmVzdGFydF9mdW5jKSB7Ci0JCXJlc3RhcnRfZnVuYyA9IDA7Ci0JCWdvdG8gcmVzdGFydF9hbGw7Ci0JfQogCiAJcmV0dXJuIHN0YXR1czsKIH0KIAogc3RhdGljIGludCBfX29jZnMyX3JlbW92ZV94YXR0cl9yYW5nZShzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCQkJCSAgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqcm9vdF9iaCwKLQkJCQkgICAgICBzdHJ1Y3Qgb2NmczJfeGF0dHJfdmFsdWVfcm9vdCAqeHYsCisJCQkJICAgICAgc3RydWN0IG9jZnMyX3hhdHRyX3ZhbHVlX2J1ZiAqdmIsCiAJCQkJICAgICAgdTMyIGNwb3MsIHUzMiBwaHlzX2Nwb3MsIHUzMiBsZW4sCi0JCQkJICAgICAgc3RydWN0IG9jZnMyX2NhY2hlZF9kZWFsbG9jX2N0eHQgKmRlYWxsb2MpCisJCQkJICAgICAgc3RydWN0IG9jZnMyX3hhdHRyX3NldF9jdHh0ICpjdHh0KQogewogCWludCByZXQ7CiAJdTY0IHBoeXNfYmxrbm8gPSBvY2ZzMl9jbHVzdGVyc190b19ibG9ja3MoaW5vZGUtPmlfc2IsIHBoeXNfY3Bvcyk7Ci0Jc3RydWN0IG9jZnMyX3N1cGVyICpvc2IgPSBPQ0ZTMl9TQihpbm9kZS0+aV9zYik7Ci0Jc3RydWN0IGlub2RlICp0bF9pbm9kZSA9IG9zYi0+b3NiX3RsX2lub2RlOwotCWhhbmRsZV90ICpoYW5kbGU7Ci0Jc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKm1ldGFfYWMgPSBOVUxMOworCWhhbmRsZV90ICpoYW5kbGUgPSBjdHh0LT5oYW5kbGU7CiAJc3RydWN0IG9jZnMyX2V4dGVudF90cmVlIGV0OwogCi0Jb2NmczJfaW5pdF94YXR0cl92YWx1ZV9leHRlbnRfdHJlZSgmZXQsIGlub2RlLCByb290X2JoLCB4dik7CisJb2NmczJfaW5pdF94YXR0cl92YWx1ZV9leHRlbnRfdHJlZSgmZXQsIGlub2RlLCB2Yik7CiAKLQlyZXQgPSBvY2ZzMl9sb2NrX2FsbG9jYXRvcnMoaW5vZGUsICZldCwgMCwgMSwgTlVMTCwgJm1ldGFfYWMpOworCXJldCA9IHZiLT52Yl9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwgdmItPnZiX2JoLAorCQkJICAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKIAlpZiAocmV0KSB7CiAJCW1sb2dfZXJybm8ocmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQltdXRleF9sb2NrKCZ0bF9pbm9kZS0+aV9tdXRleCk7Ci0KLQlpZiAob2NmczJfdHJ1bmNhdGVfbG9nX25lZWRzX2ZsdXNoKG9zYikpIHsKLQkJcmV0ID0gX19vY2ZzMl9mbHVzaF90cnVuY2F0ZV9sb2cob3NiKTsKLQkJaWYgKHJldCA8IDApIHsKLQkJCW1sb2dfZXJybm8ocmV0KTsKLQkJCWdvdG8gb3V0OwotCQl9Ci0JfQotCi0JaGFuZGxlID0gb2NmczJfc3RhcnRfdHJhbnMob3NiLCBPQ0ZTMl9SRU1PVkVfRVhURU5UX0NSRURJVFMpOwotCWlmIChJU19FUlIoaGFuZGxlKSkgewotCQlyZXQgPSBQVFJfRVJSKGhhbmRsZSk7Ci0JCW1sb2dfZXJybm8ocmV0KTsKIAkJZ290byBvdXQ7CiAJfQogCi0JcmV0ID0gb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwgcm9vdF9iaCwKLQkJCQkgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CisJcmV0ID0gb2NmczJfcmVtb3ZlX2V4dGVudChpbm9kZSwgJmV0LCBjcG9zLCBsZW4sIGhhbmRsZSwgY3R4dC0+bWV0YV9hYywKKwkJCQkgICZjdHh0LT5kZWFsbG9jKTsKIAlpZiAocmV0KSB7CiAJCW1sb2dfZXJybm8ocmV0KTsKLQkJZ290byBvdXRfY29tbWl0OworCQlnb3RvIG91dDsKIAl9CiAKLQlyZXQgPSBvY2ZzMl9yZW1vdmVfZXh0ZW50KGlub2RlLCAmZXQsIGNwb3MsIGxlbiwgaGFuZGxlLCBtZXRhX2FjLAotCQkJCSAgZGVhbGxvYyk7CisJbGUzMl9hZGRfY3B1KCZ2Yi0+dmJfeHYtPnhyX2NsdXN0ZXJzLCAtbGVuKTsKKworCXJldCA9IG9jZnMyX2pvdXJuYWxfZGlydHkoaGFuZGxlLCB2Yi0+dmJfYmgpOwogCWlmIChyZXQpIHsKIAkJbWxvZ19lcnJubyhyZXQpOwotCQlnb3RvIG91dF9jb21taXQ7CisJCWdvdG8gb3V0OwogCX0KIAotCWxlMzJfYWRkX2NwdSgmeHYtPnhyX2NsdXN0ZXJzLCAtbGVuKTsKLQotCXJldCA9IG9jZnMyX2pvdXJuYWxfZGlydHkoaGFuZGxlLCByb290X2JoKTsKLQlpZiAocmV0KSB7Ci0JCW1sb2dfZXJybm8ocmV0KTsKLQkJZ290byBvdXRfY29tbWl0OwotCX0KLQotCXJldCA9IG9jZnMyX3RydW5jYXRlX2xvZ19hcHBlbmQob3NiLCBoYW5kbGUsIHBoeXNfYmxrbm8sIGxlbik7CisJcmV0ID0gb2NmczJfY2FjaGVfY2x1c3Rlcl9kZWFsbG9jKCZjdHh0LT5kZWFsbG9jLCBwaHlzX2Jsa25vLCBsZW4pOwogCWlmIChyZXQpCiAJCW1sb2dfZXJybm8ocmV0KTsKIAotb3V0X2NvbW1pdDoKLQlvY2ZzMl9jb21taXRfdHJhbnMob3NiLCBoYW5kbGUpOwogb3V0OgotCW11dGV4X3VubG9jaygmdGxfaW5vZGUtPmlfbXV0ZXgpOwotCi0JaWYgKG1ldGFfYWMpCi0JCW9jZnMyX2ZyZWVfYWxsb2NfY29udGV4dChtZXRhX2FjKTsKLQogCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgb2NmczJfeGF0dHJfc2hyaW5rX3NpemUoc3RydWN0IGlub2RlICppbm9kZSwKIAkJCQkgICB1MzIgb2xkX2NsdXN0ZXJzLAogCQkJCSAgIHUzMiBuZXdfY2x1c3RlcnMsCi0JCQkJICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpyb290X2JoLAotCQkJCSAgIHN0cnVjdCBvY2ZzMl94YXR0cl92YWx1ZV9yb290ICp4dikKKwkJCQkgICBzdHJ1Y3Qgb2NmczJfeGF0dHJfdmFsdWVfYnVmICp2YiwKKwkJCQkgICBzdHJ1Y3Qgb2NmczJfeGF0dHJfc2V0X2N0eHQgKmN0eHQpCiB7CiAJaW50IHJldCA9IDA7CiAJdTMyIHRydW5jX2xlbiwgY3BvcywgcGh5c19jcG9zLCBhbGxvY19zaXplOwogCXU2NCBibG9jazsKLQlzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiA9IE9DRlMyX1NCKGlub2RlLT5pX3NiKTsKLQlzdHJ1Y3Qgb2NmczJfY2FjaGVkX2RlYWxsb2NfY3R4dCBkZWFsbG9jOwotCi0Jb2NmczJfaW5pdF9kZWFsbG9jX2N0eHQoJmRlYWxsb2MpOwogCiAJaWYgKG9sZF9jbHVzdGVycyA8PSBuZXdfY2x1c3RlcnMpCiAJCXJldHVybiAwOwpAQCAtNDE0LDcgKzcwMCw4IEBACiAJdHJ1bmNfbGVuID0gb2xkX2NsdXN0ZXJzIC0gbmV3X2NsdXN0ZXJzOwogCXdoaWxlICh0cnVuY19sZW4pIHsKIAkJcmV0ID0gb2NmczJfeGF0dHJfZ2V0X2NsdXN0ZXJzKGlub2RlLCBjcG9zLCAmcGh5c19jcG9zLAotCQkJCQkgICAgICAgJmFsbG9jX3NpemUsICZ4di0+eHJfbGlzdCk7CisJCQkJCSAgICAgICAmYWxsb2Nfc2l6ZSwKKwkJCQkJICAgICAgICZ2Yi0+dmJfeHYtPnhyX2xpc3QpOwogCQlpZiAocmV0KSB7CiAJCQltbG9nX2Vycm5vKHJldCk7CiAJCQlnb3RvIG91dDsKQEAgLTQyMyw5ICs3MTAsOSBAQAogCQlpZiAoYWxsb2Nfc2l6ZSA+IHRydW5jX2xlbikKIAkJCWFsbG9jX3NpemUgPSB0cnVuY19sZW47CiAKLQkJcmV0ID0gX19vY2ZzMl9yZW1vdmVfeGF0dHJfcmFuZ2UoaW5vZGUsIHJvb3RfYmgsIHh2LCBjcG9zLAorCQlyZXQgPSBfX29jZnMyX3JlbW92ZV94YXR0cl9yYW5nZShpbm9kZSwgdmIsIGNwb3MsCiAJCQkJCQkgcGh5c19jcG9zLCBhbGxvY19zaXplLAotCQkJCQkJICZkZWFsbG9jKTsKKwkJCQkJCSBjdHh0KTsKIAkJaWYgKHJldCkgewogCQkJbWxvZ19lcnJubyhyZXQpOwogCQkJZ290byBvdXQ7CkBAIC00MzksMjAgKzcyNiwxNyBAQAogCX0KIAogb3V0OgotCW9jZnMyX3NjaGVkdWxlX3RydW5jYXRlX2xvZ19mbHVzaChvc2IsIDEpOwotCW9jZnMyX3J1bl9kZWFsbG9jcyhvc2IsICZkZWFsbG9jKTsKLQogCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgb2NmczJfeGF0dHJfdmFsdWVfdHJ1bmNhdGUoc3RydWN0IGlub2RlICppbm9kZSwKLQkJCQkgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKnJvb3RfYmgsCi0JCQkJICAgICAgc3RydWN0IG9jZnMyX3hhdHRyX3ZhbHVlX3Jvb3QgKnh2LAotCQkJCSAgICAgIGludCBsZW4pCisJCQkJICAgICAgc3RydWN0IG9jZnMyX3hhdHRyX3ZhbHVlX2J1ZiAqdmIsCisJCQkJICAgICAgaW50IGxlbiwKKwkJCQkgICAgICBzdHJ1Y3Qgb2NmczJfeGF0dHJfc2V0X2N0eHQgKmN0eHQpCiB7CiAJaW50IHJldDsKIAl1MzIgbmV3X2NsdXN0ZXJzID0gb2NmczJfY2x1c3RlcnNfZm9yX2J5dGVzKGlub2RlLT5pX3NiLCBsZW4pOwotCXUzMiBvbGRfY2x1c3RlcnMgPSBsZTMyX3RvX2NwdSh4di0+eHJfY2x1c3RlcnMpOworCXUzMiBvbGRfY2x1c3RlcnMgPSBsZTMyX3RvX2NwdSh2Yi0+dmJfeHYtPnhyX2NsdXN0ZXJzKTsKIAogCWlmIChuZXdfY2x1c3RlcnMgPT0gb2xkX2NsdXN0ZXJzKQogCQlyZXR1cm4gMDsKQEAgLTQ2MCwxMSArNzQ0LDExIEBACiAJaWYgKG5ld19jbHVzdGVycyA+IG9sZF9jbHVzdGVycykKIAkJcmV0ID0gb2NmczJfeGF0dHJfZXh0ZW5kX2FsbG9jYXRpb24oaW5vZGUsCiAJCQkJCQkgICAgbmV3X2NsdXN0ZXJzIC0gb2xkX2NsdXN0ZXJzLAotCQkJCQkJICAgIHJvb3RfYmgsIHh2KTsKKwkJCQkJCSAgICB2YiwgY3R4dCk7CiAJZWxzZQogCQlyZXQgPSBvY2ZzMl94YXR0cl9zaHJpbmtfc2l6ZShpbm9kZSwKIAkJCQkJICAgICAgb2xkX2NsdXN0ZXJzLCBuZXdfY2x1c3RlcnMsCi0JCQkJCSAgICAgIHJvb3RfYmgsIHh2KTsKKwkJCQkJICAgICAgdmIsIGN0eHQpOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTU1NCwxOCArODM4LDE0IEBACiAJaWYgKCFkaS0+aV94YXR0cl9sb2MpCiAJCXJldHVybiByZXQ7CiAKLQlyZXQgPSBvY2ZzMl9yZWFkX2Jsb2NrKGlub2RlLCBsZTY0X3RvX2NwdShkaS0+aV94YXR0cl9sb2MpLCAmYmxrX2JoKTsKKwlyZXQgPSBvY2ZzMl9yZWFkX3hhdHRyX2Jsb2NrKGlub2RlLCBsZTY0X3RvX2NwdShkaS0+aV94YXR0cl9sb2MpLAorCQkJCSAgICAgJmJsa19iaCk7CiAJaWYgKHJldCA8IDApIHsKIAkJbWxvZ19lcnJubyhyZXQpOwogCQlyZXR1cm4gcmV0OwogCX0KIAogCXhiID0gKHN0cnVjdCBvY2ZzMl94YXR0cl9ibG9jayAqKWJsa19iaC0+Yl9kYXRhOwotCWlmICghT0NGUzJfSVNfVkFMSURfWEFUVFJfQkxPQ0soeGIpKSB7Ci0JCXJldCA9IC1FSU87Ci0JCWdvdG8gY2xlYW51cDsKLQl9Ci0KIAlpZiAoIShsZTE2X3RvX2NwdSh4Yi0+eGJfZmxhZ3MpICYgT0NGUzJfWEFUVFJfSU5ERVhFRCkpIHsKIAkJc3RydWN0IG9jZnMyX3hhdHRyX2hlYWRlciAqaGVhZGVyID0gJnhiLT54Yl9hdHRycy54Yl9oZWFkZXI7CiAJCXJldCA9IG9jZnMyX3hhdHRyX2xpc3RfZW50cmllcyhpbm9kZSwgaGVhZGVyLApAQCAtNTc1LDcgKzg1NSw3IEBACiAJCXJldCA9IG9jZnMyX3hhdHRyX3RyZWVfbGlzdF9pbmRleF9ibG9jayhpbm9kZSwgeHQsCiAJCQkJCQkgICBidWZmZXIsIGJ1ZmZlcl9zaXplKTsKIAl9Ci1jbGVhbnVwOgorCiAJYnJlbHNlKGJsa19iaCk7CiAKIAlyZXR1cm4gcmV0OwpAQCAtNjg1LDcgKzk2NSw3IEBACiAJCWJsa25vID0gb2NmczJfY2x1c3RlcnNfdG9fYmxvY2tzKGlub2RlLT5pX3NiLCBwX2NsdXN0ZXIpOwogCQkvKiBDb3B5IG9jZnMyX3hhdHRyX3ZhbHVlICovCiAJCWZvciAoaSA9IDA7IGkgPCBudW1fY2x1c3RlcnMgKiBicGM7IGkrKywgYmxrbm8rKykgewotCQkJcmV0ID0gb2NmczJfcmVhZF9ibG9jayhpbm9kZSwgYmxrbm8sICZiaCk7CisJCQlyZXQgPSBvY2ZzMl9yZWFkX2Jsb2NrKGlub2RlLCBibGtubywgJmJoLCBOVUxMKTsKIAkJCWlmIChyZXQpIHsKIAkJCQltbG9nX2Vycm5vKHJldCk7CiAJCQkJZ290byBvdXQ7CkBAIC03NjksNyArMTA0OSwxMiBAQAogCXNpemVfdCBzaXplOwogCWludCByZXQgPSAtRU5PREFUQSwgbmFtZV9vZmZzZXQsIG5hbWVfbGVuLCBibG9ja19vZmYsIGk7CiAKLQltZW1zZXQoJnhzLT5idWNrZXQsIDAsIHNpemVvZih4cy0+YnVja2V0KSk7CisJeHMtPmJ1Y2tldCA9IG9jZnMyX3hhdHRyX2J1Y2tldF9uZXcoaW5vZGUpOworCWlmICgheHMtPmJ1Y2tldCkgeworCQlyZXQgPSAtRU5PTUVNOworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gY2xlYW51cDsKKwl9CiAKIAlyZXQgPSBvY2ZzMl94YXR0cl9ibG9ja19maW5kKGlub2RlLCBuYW1lX2luZGV4LCBuYW1lLCB4cyk7CiAJaWYgKHJldCkgewpAQCAtNzk1LDExICsxMDgwLDExIEBACiAKIAkJaWYgKGxlMTZfdG9fY3B1KHhiLT54Yl9mbGFncykgJiBPQ0ZTMl9YQVRUUl9JTkRFWEVEKSB7CiAJCQlyZXQgPSBvY2ZzMl94YXR0cl9idWNrZXRfZ2V0X25hbWVfdmFsdWUoaW5vZGUsCi0JCQkJCQkJCXhzLT5idWNrZXQueGgsCisJCQkJCQkJCWJ1Y2tldF94aCh4cy0+YnVja2V0KSwKIAkJCQkJCQkJaSwKIAkJCQkJCQkJJmJsb2NrX29mZiwKIAkJCQkJCQkJJm5hbWVfb2Zmc2V0KTsKLQkJCXhzLT5iYXNlID0geHMtPmJ1Y2tldC5iaHNbYmxvY2tfb2ZmXS0+Yl9kYXRhOworCQkJeHMtPmJhc2UgPSBidWNrZXRfYmxvY2soeHMtPmJ1Y2tldCwgYmxvY2tfb2ZmKTsKIAkJfQogCQlpZiAob2NmczJfeGF0dHJfaXNfbG9jYWwoeHMtPmhlcmUpKSB7CiAJCQltZW1jcHkoYnVmZmVyLCAodm9pZCAqKXhzLT5iYXNlICsKQEAgLTgxNywxNSArMTEwMiw1MCBAQAogCX0KIAlyZXQgPSBzaXplOwogY2xlYW51cDoKLQlmb3IgKGkgPSAwOyBpIDwgT0NGUzJfWEFUVFJfTUFYX0JMT0NLU19QRVJfQlVDS0VUOyBpKyspCi0JCWJyZWxzZSh4cy0+YnVja2V0LmJoc1tpXSk7Ci0JbWVtc2V0KCZ4cy0+YnVja2V0LCAwLCBzaXplb2YoeHMtPmJ1Y2tldCkpOworCW9jZnMyX3hhdHRyX2J1Y2tldF9mcmVlKHhzLT5idWNrZXQpOwogCiAJYnJlbHNlKHhzLT54YXR0cl9iaCk7CiAJeHMtPnhhdHRyX2JoID0gTlVMTDsKIAlyZXR1cm4gcmV0OwogfQogCitpbnQgb2NmczJfeGF0dHJfZ2V0X25vbG9jayhzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpkaV9iaCwKKwkJCSAgIGludCBuYW1lX2luZGV4LAorCQkJICAgY29uc3QgY2hhciAqbmFtZSwKKwkJCSAgIHZvaWQgKmJ1ZmZlciwKKwkJCSAgIHNpemVfdCBidWZmZXJfc2l6ZSkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBvY2ZzMl9kaW5vZGUgKmRpID0gTlVMTDsKKwlzdHJ1Y3Qgb2NmczJfaW5vZGVfaW5mbyAqb2kgPSBPQ0ZTMl9JKGlub2RlKTsKKwlzdHJ1Y3Qgb2NmczJfeGF0dHJfc2VhcmNoIHhpcyA9IHsKKwkJLm5vdF9mb3VuZCA9IC1FTk9EQVRBLAorCX07CisJc3RydWN0IG9jZnMyX3hhdHRyX3NlYXJjaCB4YnMgPSB7CisJCS5ub3RfZm91bmQgPSAtRU5PREFUQSwKKwl9OworCisJaWYgKCFvY2ZzMl9zdXBwb3J0c194YXR0cihPQ0ZTMl9TQihpbm9kZS0+aV9zYikpKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlpZiAoIShvaS0+aXBfZHluX2ZlYXR1cmVzICYgT0NGUzJfSEFTX1hBVFRSX0ZMKSkKKwkJcmV0ID0gLUVOT0RBVEE7CisKKwl4aXMuaW5vZGVfYmggPSB4YnMuaW5vZGVfYmggPSBkaV9iaDsKKwlkaSA9IChzdHJ1Y3Qgb2NmczJfZGlub2RlICopZGlfYmgtPmJfZGF0YTsKKworCWRvd25fcmVhZCgmb2ktPmlwX3hhdHRyX3NlbSk7CisJcmV0ID0gb2NmczJfeGF0dHJfaWJvZHlfZ2V0KGlub2RlLCBuYW1lX2luZGV4LCBuYW1lLCBidWZmZXIsCisJCQkJICAgIGJ1ZmZlcl9zaXplLCAmeGlzKTsKKwlpZiAocmV0ID09IC1FTk9EQVRBICYmIGRpLT5pX3hhdHRyX2xvYykKKwkJcmV0ID0gb2NmczJfeGF0dHJfYmxvY2tfZ2V0KGlub2RlLCBuYW1lX2luZGV4LCBuYW1lLCBidWZmZXIsCisJCQkJCSAgICBidWZmZXJfc2l6ZSwgJnhicyk7CisJdXBfcmVhZCgmb2ktPmlwX3hhdHRyX3NlbSk7CisKKwlyZXR1cm4gcmV0OworfQorCiAvKiBvY2ZzMl94YXR0cl9nZXQoKQogICoKICAqIENvcHkgYW4gZXh0ZW5kZWQgYXR0cmlidXRlIGludG8gdGhlIGJ1ZmZlciBwcm92aWRlZC4KQEAgLTgzOCwzNyArMTE1OCwxNiBAQAogCQkJICAgc2l6ZV90IGJ1ZmZlcl9zaXplKQogewogCWludCByZXQ7Ci0Jc3RydWN0IG9jZnMyX2Rpbm9kZSAqZGkgPSBOVUxMOwogCXN0cnVjdCBidWZmZXJfaGVhZCAqZGlfYmggPSBOVUxMOwotCXN0cnVjdCBvY2ZzMl9pbm9kZV9pbmZvICpvaSA9IE9DRlMyX0koaW5vZGUpOwotCXN0cnVjdCBvY2ZzMl94YXR0cl9zZWFyY2ggeGlzID0gewotCQkubm90X2ZvdW5kID0gLUVOT0RBVEEsCi0JfTsKLQlzdHJ1Y3Qgb2NmczJfeGF0dHJfc2VhcmNoIHhicyA9IHsKLQkJLm5vdF9mb3VuZCA9IC1FTk9EQVRBLAotCX07Ci0KLQlpZiAoIW9jZnMyX3N1cHBvcnRzX3hhdHRyKE9DRlMyX1NCKGlub2RlLT5pX3NiKSkpCi0JCXJldHVybiAtRU9QTk9UU1VQUDsKLQotCWlmICghKG9pLT5pcF9keW5fZmVhdHVyZXMgJiBPQ0ZTMl9IQVNfWEFUVFJfRkwpKQotCQlyZXQgPSAtRU5PREFUQTsKIAogCXJldCA9IG9jZnMyX2lub2RlX2xvY2soaW5vZGUsICZkaV9iaCwgMCk7CiAJaWYgKHJldCA8IDApIHsKIAkJbWxvZ19lcnJubyhyZXQpOwogCQlyZXR1cm4gcmV0OwogCX0KLQl4aXMuaW5vZGVfYmggPSB4YnMuaW5vZGVfYmggPSBkaV9iaDsKLQlkaSA9IChzdHJ1Y3Qgb2NmczJfZGlub2RlICopZGlfYmgtPmJfZGF0YTsKKwlyZXQgPSBvY2ZzMl94YXR0cl9nZXRfbm9sb2NrKGlub2RlLCBkaV9iaCwgbmFtZV9pbmRleCwKKwkJCQkgICAgIG5hbWUsIGJ1ZmZlciwgYnVmZmVyX3NpemUpOwogCi0JZG93bl9yZWFkKCZvaS0+aXBfeGF0dHJfc2VtKTsKLQlyZXQgPSBvY2ZzMl94YXR0cl9pYm9keV9nZXQoaW5vZGUsIG5hbWVfaW5kZXgsIG5hbWUsIGJ1ZmZlciwKLQkJCQkgICAgYnVmZmVyX3NpemUsICZ4aXMpOwotCWlmIChyZXQgPT0gLUVOT0RBVEEgJiYgZGktPmlfeGF0dHJfbG9jKQotCQlyZXQgPSBvY2ZzMl94YXR0cl9ibG9ja19nZXQoaW5vZGUsIG5hbWVfaW5kZXgsIG5hbWUsIGJ1ZmZlciwKLQkJCQkJICAgIGJ1ZmZlcl9zaXplLCAmeGJzKTsKLQl1cF9yZWFkKCZvaS0+aXBfeGF0dHJfc2VtKTsKIAlvY2ZzMl9pbm9kZV91bmxvY2soaW5vZGUsIDApOwogCiAJYnJlbHNlKGRpX2JoKTsKQEAgLTg3Nyw0NCArMTE3NiwzNiBAQAogfQogCiBzdGF0aWMgaW50IF9fb2NmczJfeGF0dHJfc2V0X3ZhbHVlX291dHNpZGUoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkJICAgaGFuZGxlX3QgKmhhbmRsZSwKIAkJCQkJICAgc3RydWN0IG9jZnMyX3hhdHRyX3ZhbHVlX3Jvb3QgKnh2LAogCQkJCQkgICBjb25zdCB2b2lkICp2YWx1ZSwKIAkJCQkJICAgaW50IHZhbHVlX2xlbikKIHsKLQlpbnQgcmV0ID0gMCwgaSwgY3BfbGVuLCBjcmVkaXRzOworCWludCByZXQgPSAwLCBpLCBjcF9sZW47CiAJdTE2IGJsb2Nrc2l6ZSA9IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZTsKIAl1MzIgcF9jbHVzdGVyLCBudW1fY2x1c3RlcnM7CiAJdTMyIGNwb3MgPSAwLCBicGMgPSBvY2ZzMl9jbHVzdGVyc190b19ibG9ja3MoaW5vZGUtPmlfc2IsIDEpOwogCXUzMiBjbHVzdGVycyA9IG9jZnMyX2NsdXN0ZXJzX2Zvcl9ieXRlcyhpbm9kZS0+aV9zYiwgdmFsdWVfbGVuKTsKIAl1NjQgYmxrbm87CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IE5VTEw7Ci0JaGFuZGxlX3QgKmhhbmRsZTsKIAogCUJVR19PTihjbHVzdGVycyA+IGxlMzJfdG9fY3B1KHh2LT54cl9jbHVzdGVycykpOwogCi0JY3JlZGl0cyA9IGNsdXN0ZXJzICogYnBjOwotCWhhbmRsZSA9IG9jZnMyX3N0YXJ0X3RyYW5zKE9DRlMyX1NCKGlub2RlLT5pX3NiKSwgY3JlZGl0cyk7Ci0JaWYgKElTX0VSUihoYW5kbGUpKSB7Ci0JCXJldCA9IFBUUl9FUlIoaGFuZGxlKTsKLQkJbWxvZ19lcnJubyhyZXQpOwotCQlnb3RvIG91dDsKLQl9Ci0KIAl3aGlsZSAoY3BvcyA8IGNsdXN0ZXJzKSB7CiAJCXJldCA9IG9jZnMyX3hhdHRyX2dldF9jbHVzdGVycyhpbm9kZSwgY3BvcywgJnBfY2x1c3RlciwKIAkJCQkJICAgICAgICZudW1fY2x1c3RlcnMsICZ4di0+eHJfbGlzdCk7CiAJCWlmIChyZXQpIHsKIAkJCW1sb2dfZXJybm8ocmV0KTsKLQkJCWdvdG8gb3V0X2NvbW1pdDsKKwkJCWdvdG8gb3V0OwogCQl9CiAKIAkJYmxrbm8gPSBvY2ZzMl9jbHVzdGVyc190b19ibG9ja3MoaW5vZGUtPmlfc2IsIHBfY2x1c3Rlcik7CiAKIAkJZm9yIChpID0gMDsgaSA8IG51bV9jbHVzdGVycyAqIGJwYzsgaSsrLCBibGtubysrKSB7Ci0JCQlyZXQgPSBvY2ZzMl9yZWFkX2Jsb2NrKGlub2RlLCBibGtubywgJmJoKTsKKwkJCXJldCA9IG9jZnMyX3JlYWRfYmxvY2soaW5vZGUsIGJsa25vLCAmYmgsIE5VTEwpOwogCQkJaWYgKHJldCkgewogCQkJCW1sb2dfZXJybm8ocmV0KTsKLQkJCQlnb3RvIG91dF9jb21taXQ7CisJCQkJZ290byBvdXQ7CiAJCQl9CiAKIAkJCXJldCA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwKQEAgLTkyMyw3ICsxMjE0LDcgQEAKIAkJCQkJCSAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKIAkJCWlmIChyZXQgPCAwKSB7CiAJCQkJbWxvZ19lcnJubyhyZXQpOwotCQkJCWdvdG8gb3V0X2NvbW1pdDsKKwkJCQlnb3RvIG91dDsKIAkJCX0KIAogCQkJY3BfbGVuID0gdmFsdWVfbGVuID4gYmxvY2tzaXplID8gYmxvY2tzaXplIDogdmFsdWVfbGVuOwpAQCAtOTM3LDcgKzEyMjgsNyBAQAogCQkJcmV0ID0gb2NmczJfam91cm5hbF9kaXJ0eShoYW5kbGUsIGJoKTsKIAkJCWlmIChyZXQgPCAwKSB7CiAJCQkJbWxvZ19lcnJubyhyZXQpOwotCQkJCWdvdG8gb3V0X2NvbW1pdDsKKwkJCQlnb3RvIG91dDsKIAkJCX0KIAkJCWJyZWxzZShiaCk7CiAJCQliaCA9IE5VTEw7CkBAIC05NTEsOCArMTI0Miw2IEBACiAJCX0KIAkJY3BvcyArPSBudW1fY2x1c3RlcnM7CiAJfQotb3V0X2NvbW1pdDoKLQlvY2ZzMl9jb21taXRfdHJhbnMoT0NGUzJfU0IoaW5vZGUtPmlfc2IpLCBoYW5kbGUpOwogb3V0OgogCWJyZWxzZShiaCk7CiAKQEAgLTk2MCwyOCArMTI0OSwyMiBAQAogfQogCiBzdGF0aWMgaW50IG9jZnMyX3hhdHRyX2NsZWFudXAoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCSAgICAgICBoYW5kbGVfdCAqaGFuZGxlLAogCQkJICAgICAgIHN0cnVjdCBvY2ZzMl94YXR0cl9pbmZvICp4aSwKIAkJCSAgICAgICBzdHJ1Y3Qgb2NmczJfeGF0dHJfc2VhcmNoICp4cywKKwkJCSAgICAgICBzdHJ1Y3Qgb2NmczJfeGF0dHJfdmFsdWVfYnVmICp2YiwKIAkJCSAgICAgICBzaXplX3Qgb2ZmcykKIHsKLQloYW5kbGVfdCAqaGFuZGxlID0gTlVMTDsKIAlpbnQgcmV0ID0gMDsKIAlzaXplX3QgbmFtZV9sZW4gPSBzdHJsZW4oeGktPm5hbWUpOwogCXZvaWQgKnZhbCA9IHhzLT5iYXNlICsgb2ZmczsKIAlzaXplX3Qgc2l6ZSA9IE9DRlMyX1hBVFRSX1NJWkUobmFtZV9sZW4pICsgT0NGUzJfWEFUVFJfUk9PVF9TSVpFOwogCi0JaGFuZGxlID0gb2NmczJfc3RhcnRfdHJhbnMoKE9DRlMyX1NCKGlub2RlLT5pX3NiKSksCi0JCQkJICAgT0NGUzJfWEFUVFJfQkxPQ0tfVVBEQVRFX0NSRURJVFMpOwotCWlmIChJU19FUlIoaGFuZGxlKSkgewotCQlyZXQgPSBQVFJfRVJSKGhhbmRsZSk7Ci0JCW1sb2dfZXJybm8ocmV0KTsKLQkJZ290byBvdXQ7Ci0JfQotCXJldCA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgaW5vZGUsIHhzLT54YXR0cl9iaCwKLQkJCQkgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CisJcmV0ID0gdmItPnZiX2FjY2VzcyhoYW5kbGUsIGlub2RlLCB2Yi0+dmJfYmgsCisJCQkgICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOwogCWlmIChyZXQpIHsKIAkJbWxvZ19lcnJubyhyZXQpOwotCQlnb3RvIG91dF9jb21taXQ7CisJCWdvdG8gb3V0OwogCX0KIAkvKiBEZWNyZWFzZSB4YXR0ciBjb3VudCAqLwogCWxlMTZfYWRkX2NwdSgmeHMtPmhlYWRlci0+eGhfY291bnQsIC0xKTsKQEAgLTk4OSwzNSArMTI3MiwyNyBAQAogCW1lbXNldCgodm9pZCAqKXhzLT5oZXJlLCAwLCBzaXplb2Yoc3RydWN0IG9jZnMyX3hhdHRyX2VudHJ5KSk7CiAJbWVtc2V0KHZhbCwgMCwgc2l6ZSk7CiAKLQlyZXQgPSBvY2ZzMl9qb3VybmFsX2RpcnR5KGhhbmRsZSwgeHMtPnhhdHRyX2JoKTsKKwlyZXQgPSBvY2ZzMl9qb3VybmFsX2RpcnR5KGhhbmRsZSwgdmItPnZiX2JoKTsKIAlpZiAocmV0IDwgMCkKIAkJbWxvZ19lcnJubyhyZXQpOwotb3V0X2NvbW1pdDoKLQlvY2ZzMl9jb21taXRfdHJhbnMoT0NGUzJfU0IoaW5vZGUtPmlfc2IpLCBoYW5kbGUpOwogb3V0OgogCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgb2NmczJfeGF0dHJfdXBkYXRlX2VudHJ5KHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJICAgIGhhbmRsZV90ICpoYW5kbGUsCiAJCQkJICAgIHN0cnVjdCBvY2ZzMl94YXR0cl9pbmZvICp4aSwKIAkJCQkgICAgc3RydWN0IG9jZnMyX3hhdHRyX3NlYXJjaCAqeHMsCisJCQkJICAgIHN0cnVjdCBvY2ZzMl94YXR0cl92YWx1ZV9idWYgKnZiLAogCQkJCSAgICBzaXplX3Qgb2ZmcykKIHsKLQloYW5kbGVfdCAqaGFuZGxlID0gTlVMTDsKLQlpbnQgcmV0ID0gMDsKKwlpbnQgcmV0OwogCi0JaGFuZGxlID0gb2NmczJfc3RhcnRfdHJhbnMoKE9DRlMyX1NCKGlub2RlLT5pX3NiKSksCi0JCQkJICAgT0NGUzJfWEFUVFJfQkxPQ0tfVVBEQVRFX0NSRURJVFMpOwotCWlmIChJU19FUlIoaGFuZGxlKSkgewotCQlyZXQgPSBQVFJfRVJSKGhhbmRsZSk7Ci0JCW1sb2dfZXJybm8ocmV0KTsKLQkJZ290byBvdXQ7Ci0JfQotCXJldCA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgaW5vZGUsIHhzLT54YXR0cl9iaCwKLQkJCQkgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CisJcmV0ID0gdmItPnZiX2FjY2VzcyhoYW5kbGUsIGlub2RlLCB2Yi0+dmJfYmgsCisJCQkgICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOwogCWlmIChyZXQpIHsKIAkJbWxvZ19lcnJubyhyZXQpOwotCQlnb3RvIG91dF9jb21taXQ7CisJCWdvdG8gb3V0OwogCX0KIAogCXhzLT5oZXJlLT54ZV9uYW1lX29mZnNldCA9IGNwdV90b19sZTE2KG9mZnMpOwpAQCAtMTAyOCwxMSArMTMwMyw5IEBACiAJCW9jZnMyX3hhdHRyX3NldF9sb2NhbCh4cy0+aGVyZSwgMCk7CiAJb2NmczJfeGF0dHJfaGFzaF9lbnRyeShpbm9kZSwgeHMtPmhlYWRlciwgeHMtPmhlcmUpOwogCi0JcmV0ID0gb2NmczJfam91cm5hbF9kaXJ0eShoYW5kbGUsIHhzLT54YXR0cl9iaCk7CisJcmV0ID0gb2NmczJfam91cm5hbF9kaXJ0eShoYW5kbGUsIHZiLT52Yl9iaCk7CiAJaWYgKHJldCA8IDApCiAJCW1sb2dfZXJybm8ocmV0KTsKLW91dF9jb21taXQ6Ci0Jb2NmczJfY29tbWl0X3RyYW5zKE9DRlMyX1NCKGlub2RlLT5pX3NiKSwgaGFuZGxlKTsKIG91dDoKIAlyZXR1cm4gcmV0OwogfQpAQCAtMTA0NSw2ICsxMzE4LDggQEAKIHN0YXRpYyBpbnQgb2NmczJfeGF0dHJfc2V0X3ZhbHVlX291dHNpZGUoc3RydWN0IGlub2RlICppbm9kZSwKIAkJCQkJIHN0cnVjdCBvY2ZzMl94YXR0cl9pbmZvICp4aSwKIAkJCQkJIHN0cnVjdCBvY2ZzMl94YXR0cl9zZWFyY2ggKnhzLAorCQkJCQkgc3RydWN0IG9jZnMyX3hhdHRyX3NldF9jdHh0ICpjdHh0LAorCQkJCQkgc3RydWN0IG9jZnMyX3hhdHRyX3ZhbHVlX2J1ZiAqdmIsCiAJCQkJCSBzaXplX3Qgb2ZmcykKIHsKIAlzaXplX3QgbmFtZV9sZW4gPSBzdHJsZW4oeGktPm5hbWUpOwpAQCAtMTA2MiwyMCArMTMzNywyMCBAQAogCXh2LT54cl9saXN0LmxfdHJlZV9kZXB0aCA9IDA7CiAJeHYtPnhyX2xpc3QubF9jb3VudCA9IGNwdV90b19sZTE2KDEpOwogCXh2LT54cl9saXN0LmxfbmV4dF9mcmVlX3JlYyA9IDA7CisJdmItPnZiX3h2ID0geHY7CiAKLQlyZXQgPSBvY2ZzMl94YXR0cl92YWx1ZV90cnVuY2F0ZShpbm9kZSwgeHMtPnhhdHRyX2JoLCB4diwKLQkJCQkJIHhpLT52YWx1ZV9sZW4pOworCXJldCA9IG9jZnMyX3hhdHRyX3ZhbHVlX3RydW5jYXRlKGlub2RlLCB2YiwgeGktPnZhbHVlX2xlbiwgY3R4dCk7CiAJaWYgKHJldCA8IDApIHsKIAkJbWxvZ19lcnJubyhyZXQpOwogCQlyZXR1cm4gcmV0OwogCX0KLQlyZXQgPSBfX29jZnMyX3hhdHRyX3NldF92YWx1ZV9vdXRzaWRlKGlub2RlLCB4diwgeGktPnZhbHVlLAotCQkJCQkgICAgICB4aS0+dmFsdWVfbGVuKTsKKwlyZXQgPSBvY2ZzMl94YXR0cl91cGRhdGVfZW50cnkoaW5vZGUsIGN0eHQtPmhhbmRsZSwgeGksIHhzLCB2Yiwgb2Zmcyk7CiAJaWYgKHJldCA8IDApIHsKIAkJbWxvZ19lcnJubyhyZXQpOwogCQlyZXR1cm4gcmV0OwogCX0KLQlyZXQgPSBvY2ZzMl94YXR0cl91cGRhdGVfZW50cnkoaW5vZGUsIHhpLCB4cywgb2Zmcyk7CisJcmV0ID0gX19vY2ZzMl94YXR0cl9zZXRfdmFsdWVfb3V0c2lkZShpbm9kZSwgY3R4dC0+aGFuZGxlLCB2Yi0+dmJfeHYsCisJCQkJCSAgICAgIHhpLT52YWx1ZSwgeGktPnZhbHVlX2xlbik7CiAJaWYgKHJldCA8IDApCiAJCW1sb2dfZXJybm8ocmV0KTsKIApAQCAtMTE5NSw2ICsxNDcwLDcgQEAKIHN0YXRpYyBpbnQgb2NmczJfeGF0dHJfc2V0X2VudHJ5KHN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJCQkJIHN0cnVjdCBvY2ZzMl94YXR0cl9pbmZvICp4aSwKIAkJCQkgc3RydWN0IG9jZnMyX3hhdHRyX3NlYXJjaCAqeHMsCisJCQkJIHN0cnVjdCBvY2ZzMl94YXR0cl9zZXRfY3R4dCAqY3R4dCwKIAkJCQkgaW50IGZsYWcpCiB7CiAJc3RydWN0IG9jZnMyX3hhdHRyX2VudHJ5ICpsYXN0OwpAQCAtMTIwMiw3ICsxNDc4LDcgQEAKIAlzdHJ1Y3Qgb2NmczJfZGlub2RlICpkaSA9IChzdHJ1Y3Qgb2NmczJfZGlub2RlICopeHMtPmlub2RlX2JoLT5iX2RhdGE7CiAJc2l6ZV90IG1pbl9vZmZzID0geHMtPmVuZCAtIHhzLT5iYXNlLCBuYW1lX2xlbiA9IHN0cmxlbih4aS0+bmFtZSk7CiAJc2l6ZV90IHNpemVfbCA9IDA7Ci0JaGFuZGxlX3QgKmhhbmRsZSA9IE5VTEw7CisJaGFuZGxlX3QgKmhhbmRsZSA9IGN0eHQtPmhhbmRsZTsKIAlpbnQgZnJlZSwgaSwgcmV0OwogCXN0cnVjdCBvY2ZzMl94YXR0cl9pbmZvIHhpX2wgPSB7CiAJCS5uYW1lX2luZGV4ID0geGktPm5hbWVfaW5kZXgsCkBAIC0xMjEwLDYgKzE0ODYsMTYgQEAKIAkJLnZhbHVlID0geGktPnZhbHVlLAogCQkudmFsdWVfbGVuID0geGktPnZhbHVlX2xlbiwKIAl9OworCXN0cnVjdCBvY2ZzMl94YXR0cl92YWx1ZV9idWYgdmIgPSB7CisJCS52Yl9iaCA9IHhzLT54YXR0cl9iaCwKKwkJLnZiX2FjY2VzcyA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzX2RpLAorCX07CisKKwlpZiAoIShmbGFnICYgT0NGUzJfSU5MSU5FX1hBVFRSX0ZMKSkgeworCQlCVUdfT04oeHMtPnhhdHRyX2JoID09IHhzLT5pbm9kZV9iaCk7CisJCXZiLnZiX2FjY2VzcyA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzX3hiOworCX0gZWxzZQorCQlCVUdfT04oeHMtPnhhdHRyX2JoICE9IHhzLT5pbm9kZV9iaCk7CiAKIAkvKiBDb21wdXRlIG1pbl9vZmZzLCBsYXN0IGFuZCBmcmVlIHNwYWNlLiAqLwogCWxhc3QgPSB4cy0+aGVhZGVyLT54aF9lbnRyaWVzOwpAQCAtMTI2NSwxNSArMTU1MSwxNCBAQAogCQlpZiAob2NmczJfeGF0dHJfaXNfbG9jYWwoeHMtPmhlcmUpICYmIHNpemUgPT0gc2l6ZV9sKSB7CiAJCQkvKiBSZXBsYWNlIGV4aXN0aW5nIGxvY2FsIHhhdHRyIHdpdGggdHJlZSByb290ICovCiAJCQlyZXQgPSBvY2ZzMl94YXR0cl9zZXRfdmFsdWVfb3V0c2lkZShpbm9kZSwgeGksIHhzLAotCQkJCQkJCSAgICBvZmZzKTsKKwkJCQkJCQkgICAgY3R4dCwgJnZiLCBvZmZzKTsKIAkJCWlmIChyZXQgPCAwKQogCQkJCW1sb2dfZXJybm8ocmV0KTsKIAkJCWdvdG8gb3V0OwogCQl9IGVsc2UgaWYgKCFvY2ZzMl94YXR0cl9pc19sb2NhbCh4cy0+aGVyZSkpIHsKIAkJCS8qIEZvciBleGlzdGluZyB4YXR0ciB3aGljaCBoYXMgdmFsdWUgb3V0c2lkZSAqLwotCQkJc3RydWN0IG9jZnMyX3hhdHRyX3ZhbHVlX3Jvb3QgKnh2ID0gTlVMTDsKLQkJCXh2ID0gKHN0cnVjdCBvY2ZzMl94YXR0cl92YWx1ZV9yb290ICopKHZhbCArCi0JCQkJT0NGUzJfWEFUVFJfU0laRShuYW1lX2xlbikpOworCQkJdmIudmJfeHYgPSAoc3RydWN0IG9jZnMyX3hhdHRyX3ZhbHVlX3Jvb3QgKikKKwkJCQkodmFsICsgT0NGUzJfWEFUVFJfU0laRShuYW1lX2xlbikpOwogCiAJCQlpZiAoeGktPnZhbHVlX2xlbiA+IE9DRlMyX1hBVFRSX0lOTElORV9TSVpFKSB7CiAJCQkJLyoKQEAgLTEyODIsMjcgKzE1NjcsMzAgQEAKIAkJCQkgKiB0aGVuIHNldCBuZXcgdmFsdWUgd2l0aCBzZXRfdmFsdWVfb3V0c2lkZSgpLgogCQkJCSAqLwogCQkJCXJldCA9IG9jZnMyX3hhdHRyX3ZhbHVlX3RydW5jYXRlKGlub2RlLAotCQkJCQkJCQkgeHMtPnhhdHRyX2JoLAotCQkJCQkJCQkgeHYsCi0JCQkJCQkJCSB4aS0+dmFsdWVfbGVuKTsKLQkJCQlpZiAocmV0IDwgMCkgewotCQkJCQltbG9nX2Vycm5vKHJldCk7Ci0JCQkJCWdvdG8gb3V0OwotCQkJCX0KLQotCQkJCXJldCA9IF9fb2NmczJfeGF0dHJfc2V0X3ZhbHVlX291dHNpZGUoaW5vZGUsCi0JCQkJCQkJCXh2LAotCQkJCQkJCQl4aS0+dmFsdWUsCi0JCQkJCQkJCXhpLT52YWx1ZV9sZW4pOworCQkJCQkJCQkgJnZiLAorCQkJCQkJCQkgeGktPnZhbHVlX2xlbiwKKwkJCQkJCQkJIGN0eHQpOwogCQkJCWlmIChyZXQgPCAwKSB7CiAJCQkJCW1sb2dfZXJybm8ocmV0KTsKIAkJCQkJZ290byBvdXQ7CiAJCQkJfQogCiAJCQkJcmV0ID0gb2NmczJfeGF0dHJfdXBkYXRlX2VudHJ5KGlub2RlLAorCQkJCQkJCSAgICAgICBoYW5kbGUsCiAJCQkJCQkJICAgICAgIHhpLAogCQkJCQkJCSAgICAgICB4cywKKwkJCQkJCQkgICAgICAgJnZiLAogCQkJCQkJCSAgICAgICBvZmZzKTsKKwkJCQlpZiAocmV0IDwgMCkgeworCQkJCQltbG9nX2Vycm5vKHJldCk7CisJCQkJCWdvdG8gb3V0OworCQkJCX0KKworCQkJCXJldCA9IF9fb2NmczJfeGF0dHJfc2V0X3ZhbHVlX291dHNpZGUoaW5vZGUsCisJCQkJCQkJCWhhbmRsZSwKKwkJCQkJCQkJdmIudmJfeHYsCisJCQkJCQkJCXhpLT52YWx1ZSwKKwkJCQkJCQkJeGktPnZhbHVlX2xlbik7CiAJCQkJaWYgKHJldCA8IDApCiAJCQkJCW1sb2dfZXJybm8ocmV0KTsKIAkJCQlnb3RvIG91dDsKQEAgLTEzMTIsNDQgKzE2MDAsMjggQEAKIAkJCQkgKiBqdXN0IHRydWNhdGUgb2xkIHZhbHVlIHRvIHplcm8uCiAJCQkJICovCiAJCQkJIHJldCA9IG9jZnMyX3hhdHRyX3ZhbHVlX3RydW5jYXRlKGlub2RlLAotCQkJCQkJCQkgeHMtPnhhdHRyX2JoLAotCQkJCQkJCQkgeHYsCi0JCQkJCQkJCSAwKTsKKwkJCQkJCQkJICAmdmIsCisJCQkJCQkJCSAgMCwKKwkJCQkJCQkJICBjdHh0KTsKIAkJCQlpZiAocmV0IDwgMCkKIAkJCQkJbWxvZ19lcnJubyhyZXQpOwogCQkJfQogCQl9CiAJfQogCi0JaGFuZGxlID0gb2NmczJfc3RhcnRfdHJhbnMoKE9DRlMyX1NCKGlub2RlLT5pX3NiKSksCi0JCQkJICAgT0NGUzJfSU5PREVfVVBEQVRFX0NSRURJVFMpOwotCWlmIChJU19FUlIoaGFuZGxlKSkgewotCQlyZXQgPSBQVFJfRVJSKGhhbmRsZSk7CisJcmV0ID0gb2NmczJfam91cm5hbF9hY2Nlc3NfZGkoaGFuZGxlLCBpbm9kZSwgeHMtPmlub2RlX2JoLAorCQkJCSAgICAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKKwlpZiAocmV0KSB7CiAJCW1sb2dfZXJybm8ocmV0KTsKIAkJZ290byBvdXQ7CiAJfQogCi0JcmV0ID0gb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwgeHMtPmlub2RlX2JoLAotCQkJCSAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKLQlpZiAocmV0KSB7Ci0JCW1sb2dfZXJybm8ocmV0KTsKLQkJZ290byBvdXRfY29tbWl0OwotCX0KLQogCWlmICghKGZsYWcgJiBPQ0ZTMl9JTkxJTkVfWEFUVFJfRkwpKSB7Ci0JCS8qIHNldCBleHRlbmRlZCBhdHRyaWJ1dGUgaW4gZXh0ZXJuYWwgYmxvY2suICovCi0JCXJldCA9IG9jZnMyX2V4dGVuZF90cmFucyhoYW5kbGUsCi0JCQkJCSBPQ0ZTMl9JTk9ERV9VUERBVEVfQ1JFRElUUyArCi0JCQkJCSBPQ0ZTMl9YQVRUUl9CTE9DS19VUERBVEVfQ1JFRElUUyk7CisJCXJldCA9IHZiLnZiX2FjY2VzcyhoYW5kbGUsIGlub2RlLCB2Yi52Yl9iaCwKKwkJCQkgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CiAJCWlmIChyZXQpIHsKIAkJCW1sb2dfZXJybm8ocmV0KTsKLQkJCWdvdG8gb3V0X2NvbW1pdDsKLQkJfQotCQlyZXQgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGlub2RlLCB4cy0+eGF0dHJfYmgsCi0JCQkJCSAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKLQkJaWYgKHJldCkgewotCQkJbWxvZ19lcnJubyhyZXQpOwotCQkJZ290byBvdXRfY29tbWl0OworCQkJZ290byBvdXQ7CiAJCX0KIAl9CiAKQEAgLTEzNjMsNyArMTYzNSw3IEBACiAJCXJldCA9IG9jZnMyX2pvdXJuYWxfZGlydHkoaGFuZGxlLCB4cy0+eGF0dHJfYmgpOwogCQlpZiAocmV0IDwgMCkgewogCQkJbWxvZ19lcnJubyhyZXQpOwotCQkJZ290byBvdXRfY29tbWl0OworCQkJZ290byBvdXQ7CiAJCX0KIAl9CiAKQEAgLTEzOTEsMjUgKzE2NjMsMTkgQEAKIAlvaS0+aXBfZHluX2ZlYXR1cmVzIHw9IGZsYWc7CiAJZGktPmlfZHluX2ZlYXR1cmVzID0gY3B1X3RvX2xlMTYob2ktPmlwX2R5bl9mZWF0dXJlcyk7CiAJc3Bpbl91bmxvY2soJm9pLT5pcF9sb2NrKTsKLQkvKiBVcGRhdGUgaW5vZGUgY3RpbWUgKi8KLQlpbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRTsKLQlkaS0+aV9jdGltZSA9IGNwdV90b19sZTY0KGlub2RlLT5pX2N0aW1lLnR2X3NlYyk7Ci0JZGktPmlfY3RpbWVfbnNlYyA9IGNwdV90b19sZTMyKGlub2RlLT5pX2N0aW1lLnR2X25zZWMpOwogCiAJcmV0ID0gb2NmczJfam91cm5hbF9kaXJ0eShoYW5kbGUsIHhzLT5pbm9kZV9iaCk7CiAJaWYgKHJldCA8IDApCiAJCW1sb2dfZXJybm8ocmV0KTsKIAotb3V0X2NvbW1pdDoKLQlvY2ZzMl9jb21taXRfdHJhbnMoT0NGUzJfU0IoaW5vZGUtPmlfc2IpLCBoYW5kbGUpOwotCiAJaWYgKCFyZXQgJiYgeGktPnZhbHVlX2xlbiA+IE9DRlMyX1hBVFRSX0lOTElORV9TSVpFKSB7CiAJCS8qCiAJCSAqIFNldCB2YWx1ZSBvdXRzaWRlIGluIEIgdHJlZS4KIAkJICogVGhpcyBpcyB0aGUgc2Vjb25kIHN0ZXAgZm9yIHZhbHVlIHNpemUgPiBJTkxJTkVfU0laRS4KIAkJICovCiAJCXNpemVfdCBvZmZzID0gbGUxNl90b19jcHUoeHMtPmhlcmUtPnhlX25hbWVfb2Zmc2V0KTsKLQkJcmV0ID0gb2NmczJfeGF0dHJfc2V0X3ZhbHVlX291dHNpZGUoaW5vZGUsIHhpLCB4cywgb2Zmcyk7CisJCXJldCA9IG9jZnMyX3hhdHRyX3NldF92YWx1ZV9vdXRzaWRlKGlub2RlLCB4aSwgeHMsIGN0eHQsCisJCQkJCQkgICAgJnZiLCBvZmZzKTsKIAkJaWYgKHJldCA8IDApIHsKIAkJCWludCByZXQyOwogCkBAIC0xNDE4LDQxICsxNjg0LDU2IEBACiAJCQkgKiBJZiBzZXQgdmFsdWUgb3V0c2lkZSBmYWlsZWQsIHdlIGhhdmUgdG8gY2xlYW4KIAkJCSAqIHRoZSBqdW5rIHRyZWUgcm9vdCB3ZSBoYXZlIGFscmVhZHkgc2V0IGluIGxvY2FsLgogCQkJICovCi0JCQlyZXQyID0gb2NmczJfeGF0dHJfY2xlYW51cChpbm9kZSwgeGksIHhzLCBvZmZzKTsKKwkJCXJldDIgPSBvY2ZzMl94YXR0cl9jbGVhbnVwKGlub2RlLCBjdHh0LT5oYW5kbGUsCisJCQkJCQkgICB4aSwgeHMsICZ2Yiwgb2Zmcyk7CiAJCQlpZiAocmV0MiA8IDApCiAJCQkJbWxvZ19lcnJubyhyZXQyKTsKIAkJfQogCX0KIG91dDoKIAlyZXR1cm4gcmV0OwotCiB9CiAKIHN0YXRpYyBpbnQgb2NmczJfcmVtb3ZlX3ZhbHVlX291dHNpZGUoc3RydWN0IGlub2RlKmlub2RlLAotCQkJCSAgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsCisJCQkJICAgICAgc3RydWN0IG9jZnMyX3hhdHRyX3ZhbHVlX2J1ZiAqdmIsCiAJCQkJICAgICAgc3RydWN0IG9jZnMyX3hhdHRyX2hlYWRlciAqaGVhZGVyKQogewogCWludCByZXQgPSAwLCBpOworCXN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiID0gT0NGUzJfU0IoaW5vZGUtPmlfc2IpOworCXN0cnVjdCBvY2ZzMl94YXR0cl9zZXRfY3R4dCBjdHh0ID0geyBOVUxMLCBOVUxMLCB9OworCisJb2NmczJfaW5pdF9kZWFsbG9jX2N0eHQoJmN0eHQuZGVhbGxvYyk7CisKKwljdHh0LmhhbmRsZSA9IG9jZnMyX3N0YXJ0X3RyYW5zKG9zYiwKKwkJCQkJb2NmczJfcmVtb3ZlX2V4dGVudF9jcmVkaXRzKG9zYi0+c2IpKTsKKwlpZiAoSVNfRVJSKGN0eHQuaGFuZGxlKSkgeworCQlyZXQgPSBQVFJfRVJSKGN0eHQuaGFuZGxlKTsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dDsKKwl9CiAKIAlmb3IgKGkgPSAwOyBpIDwgbGUxNl90b19jcHUoaGVhZGVyLT54aF9jb3VudCk7IGkrKykgewogCQlzdHJ1Y3Qgb2NmczJfeGF0dHJfZW50cnkgKmVudHJ5ID0gJmhlYWRlci0+eGhfZW50cmllc1tpXTsKIAogCQlpZiAoIW9jZnMyX3hhdHRyX2lzX2xvY2FsKGVudHJ5KSkgewotCQkJc3RydWN0IG9jZnMyX3hhdHRyX3ZhbHVlX3Jvb3QgKnh2OwogCQkJdm9pZCAqdmFsOwogCiAJCQl2YWwgPSAodm9pZCAqKWhlYWRlciArCiAJCQkJbGUxNl90b19jcHUoZW50cnktPnhlX25hbWVfb2Zmc2V0KTsKLQkJCXh2ID0gKHN0cnVjdCBvY2ZzMl94YXR0cl92YWx1ZV9yb290ICopCisJCQl2Yi0+dmJfeHYgPSAoc3RydWN0IG9jZnMyX3hhdHRyX3ZhbHVlX3Jvb3QgKikKIAkJCQkodmFsICsgT0NGUzJfWEFUVFJfU0laRShlbnRyeS0+eGVfbmFtZV9sZW4pKTsKLQkJCXJldCA9IG9jZnMyX3hhdHRyX3ZhbHVlX3RydW5jYXRlKGlub2RlLCBiaCwgeHYsIDApOworCQkJcmV0ID0gb2NmczJfeGF0dHJfdmFsdWVfdHJ1bmNhdGUoaW5vZGUsIHZiLCAwLCAmY3R4dCk7CiAJCQlpZiAocmV0IDwgMCkgewogCQkJCW1sb2dfZXJybm8ocmV0KTsKLQkJCQlyZXR1cm4gcmV0OworCQkJCWJyZWFrOwogCQkJfQogCQl9CiAJfQogCisJb2NmczJfY29tbWl0X3RyYW5zKG9zYiwgY3R4dC5oYW5kbGUpOworCW9jZnMyX3NjaGVkdWxlX3RydW5jYXRlX2xvZ19mbHVzaChvc2IsIDEpOworCW9jZnMyX3J1bl9kZWFsbG9jcyhvc2IsICZjdHh0LmRlYWxsb2MpOworb3V0OgogCXJldHVybiByZXQ7CiB9CiAKQEAgLTE0NjMsMTIgKzE3NDQsMTYgQEAKIAlzdHJ1Y3Qgb2NmczJfZGlub2RlICpkaSA9IChzdHJ1Y3Qgb2NmczJfZGlub2RlICopZGlfYmgtPmJfZGF0YTsKIAlzdHJ1Y3Qgb2NmczJfeGF0dHJfaGVhZGVyICpoZWFkZXI7CiAJaW50IHJldDsKKwlzdHJ1Y3Qgb2NmczJfeGF0dHJfdmFsdWVfYnVmIHZiID0geworCQkudmJfYmggPSBkaV9iaCwKKwkJLnZiX2FjY2VzcyA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzX2RpLAorCX07CiAKIAloZWFkZXIgPSAoc3RydWN0IG9jZnMyX3hhdHRyX2hlYWRlciAqKQogCQkgKCh2b2lkICopZGkgKyBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgLQogCQkgbGUxNl90b19jcHUoZGktPmlfeGF0dHJfaW5saW5lX3NpemUpKTsKIAotCXJldCA9IG9jZnMyX3JlbW92ZV92YWx1ZV9vdXRzaWRlKGlub2RlLCBkaV9iaCwgaGVhZGVyKTsKKwlyZXQgPSBvY2ZzMl9yZW1vdmVfdmFsdWVfb3V0c2lkZShpbm9kZSwgJnZiLCBoZWFkZXIpOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTE0NzgsMTEgKzE3NjMsMTUgQEAKIHsKIAlzdHJ1Y3Qgb2NmczJfeGF0dHJfYmxvY2sgKnhiOwogCWludCByZXQgPSAwOworCXN0cnVjdCBvY2ZzMl94YXR0cl92YWx1ZV9idWYgdmIgPSB7CisJCS52Yl9iaCA9IGJsa19iaCwKKwkJLnZiX2FjY2VzcyA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzX3hiLAorCX07CiAKIAl4YiA9IChzdHJ1Y3Qgb2NmczJfeGF0dHJfYmxvY2sgKilibGtfYmgtPmJfZGF0YTsKIAlpZiAoIShsZTE2X3RvX2NwdSh4Yi0+eGJfZmxhZ3MpICYgT0NGUzJfWEFUVFJfSU5ERVhFRCkpIHsKIAkJc3RydWN0IG9jZnMyX3hhdHRyX2hlYWRlciAqaGVhZGVyID0gJih4Yi0+eGJfYXR0cnMueGJfaGVhZGVyKTsKLQkJcmV0ID0gb2NmczJfcmVtb3ZlX3ZhbHVlX291dHNpZGUoaW5vZGUsIGJsa19iaCwgaGVhZGVyKTsKKwkJcmV0ID0gb2NmczJfcmVtb3ZlX3ZhbHVlX291dHNpZGUoaW5vZGUsICZ2YiwgaGVhZGVyKTsKIAl9IGVsc2UKIAkJcmV0ID0gb2NmczJfZGVsZXRlX3hhdHRyX2luZGV4X2Jsb2NrKGlub2RlLCBibGtfYmgpOwogCkBAIC0xNTAyLDI0ICsxNzkxLDE5IEBACiAJdTY0IGJsaywgYmdfYmxrbm87CiAJdTE2IGJpdDsKIAotCXJldCA9IG9jZnMyX3JlYWRfYmxvY2soaW5vZGUsIGJsb2NrLCAmYmxrX2JoKTsKKwlyZXQgPSBvY2ZzMl9yZWFkX3hhdHRyX2Jsb2NrKGlub2RlLCBibG9jaywgJmJsa19iaCk7CiAJaWYgKHJldCA8IDApIHsKIAkJbWxvZ19lcnJubyhyZXQpOwogCQlnb3RvIG91dDsKIAl9CiAKLQl4YiA9IChzdHJ1Y3Qgb2NmczJfeGF0dHJfYmxvY2sgKilibGtfYmgtPmJfZGF0YTsKLQlpZiAoIU9DRlMyX0lTX1ZBTElEX1hBVFRSX0JMT0NLKHhiKSkgewotCQlyZXQgPSAtRUlPOwotCQlnb3RvIG91dDsKLQl9Ci0KIAlyZXQgPSBvY2ZzMl94YXR0cl9ibG9ja19yZW1vdmUoaW5vZGUsIGJsa19iaCk7CiAJaWYgKHJldCA8IDApIHsKIAkJbWxvZ19lcnJubyhyZXQpOwogCQlnb3RvIG91dDsKIAl9CiAKKwl4YiA9IChzdHJ1Y3Qgb2NmczJfeGF0dHJfYmxvY2sgKilibGtfYmgtPmJfZGF0YTsKIAlibGsgPSBsZTY0X3RvX2NwdSh4Yi0+eGJfYmxrbm8pOwogCWJpdCA9IGxlMTZfdG9fY3B1KHhiLT54Yl9zdWJhbGxvY19iaXQpOwogCWJnX2Jsa25vID0gb2NmczJfd2hpY2hfc3ViYWxsb2NfZ3JvdXAoYmxrLCBiaXQpOwpAQCAtMTYwNiw4ICsxODkwLDggQEAKIAkJbWxvZ19lcnJubyhyZXQpOwogCQlnb3RvIG91dDsKIAl9Ci0JcmV0ID0gb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwgZGlfYmgsCi0JCQkJICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOworCXJldCA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzX2RpKGhhbmRsZSwgaW5vZGUsIGRpX2JoLAorCQkJCSAgICAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKIAlpZiAocmV0KSB7CiAJCW1sb2dfZXJybm8ocmV0KTsKIAkJZ290byBvdXRfY29tbWl0OwpAQCAtMTcxNCw3ICsxOTk4LDggQEAKICAqLwogc3RhdGljIGludCBvY2ZzMl94YXR0cl9pYm9keV9zZXQoc3RydWN0IGlub2RlICppbm9kZSwKIAkJCQkgc3RydWN0IG9jZnMyX3hhdHRyX2luZm8gKnhpLAotCQkJCSBzdHJ1Y3Qgb2NmczJfeGF0dHJfc2VhcmNoICp4cykKKwkJCQkgc3RydWN0IG9jZnMyX3hhdHRyX3NlYXJjaCAqeHMsCisJCQkJIHN0cnVjdCBvY2ZzMl94YXR0cl9zZXRfY3R4dCAqY3R4dCkKIHsKIAlzdHJ1Y3Qgb2NmczJfaW5vZGVfaW5mbyAqb2kgPSBPQ0ZTMl9JKGlub2RlKTsKIAlzdHJ1Y3Qgb2NmczJfZGlub2RlICpkaSA9IChzdHJ1Y3Qgb2NmczJfZGlub2RlICopeHMtPmlub2RlX2JoLT5iX2RhdGE7CkBAIC0xNzMxLDcgKzIwMTYsNyBAQAogCQl9CiAJfQogCi0JcmV0ID0gb2NmczJfeGF0dHJfc2V0X2VudHJ5KGlub2RlLCB4aSwgeHMsCisJcmV0ID0gb2NmczJfeGF0dHJfc2V0X2VudHJ5KGlub2RlLCB4aSwgeHMsIGN0eHQsCiAJCQkJKE9DRlMyX0lOTElORV9YQVRUUl9GTCB8IE9DRlMyX0hBU19YQVRUUl9GTCkpOwogb3V0OgogCXVwX3dyaXRlKCZvaS0+aXBfYWxsb2Nfc2VtKTsKQEAgLTE3NTgsMTkgKzIwNDMsMTUgQEAKIAlpZiAoIWRpLT5pX3hhdHRyX2xvYykKIAkJcmV0dXJuIHJldDsKIAotCXJldCA9IG9jZnMyX3JlYWRfYmxvY2soaW5vZGUsIGxlNjRfdG9fY3B1KGRpLT5pX3hhdHRyX2xvYyksICZibGtfYmgpOworCXJldCA9IG9jZnMyX3JlYWRfeGF0dHJfYmxvY2soaW5vZGUsIGxlNjRfdG9fY3B1KGRpLT5pX3hhdHRyX2xvYyksCisJCQkJICAgICAmYmxrX2JoKTsKIAlpZiAocmV0IDwgMCkgewogCQltbG9nX2Vycm5vKHJldCk7CiAJCXJldHVybiByZXQ7CiAJfQogCi0JeGIgPSAoc3RydWN0IG9jZnMyX3hhdHRyX2Jsb2NrICopYmxrX2JoLT5iX2RhdGE7Ci0JaWYgKCFPQ0ZTMl9JU19WQUxJRF9YQVRUUl9CTE9DSyh4YikpIHsKLQkJcmV0ID0gLUVJTzsKLQkJZ290byBjbGVhbnVwOwotCX0KLQogCXhzLT54YXR0cl9iaCA9IGJsa19iaDsKKwl4YiA9IChzdHJ1Y3Qgb2NmczJfeGF0dHJfYmxvY2sgKilibGtfYmgtPmJfZGF0YTsKIAogCWlmICghKGxlMTZfdG9fY3B1KHhiLT54Yl9mbGFncykgJiBPQ0ZTMl9YQVRUUl9JTkRFWEVEKSkgewogCQl4cy0+aGVhZGVyID0gJnhiLT54Yl9hdHRycy54Yl9oZWFkZXI7CkBAIC0xODA0LDEzICsyMDg1LDEzIEBACiAgKi8KIHN0YXRpYyBpbnQgb2NmczJfeGF0dHJfYmxvY2tfc2V0KHN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJCQkJIHN0cnVjdCBvY2ZzMl94YXR0cl9pbmZvICp4aSwKLQkJCQkgc3RydWN0IG9jZnMyX3hhdHRyX3NlYXJjaCAqeHMpCisJCQkJIHN0cnVjdCBvY2ZzMl94YXR0cl9zZWFyY2ggKnhzLAorCQkJCSBzdHJ1Y3Qgb2NmczJfeGF0dHJfc2V0X2N0eHQgKmN0eHQpCiB7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpuZXdfYmggPSBOVUxMOwogCXN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiID0gT0NGUzJfU0IoaW5vZGUtPmlfc2IpOwogCXN0cnVjdCBvY2ZzMl9kaW5vZGUgKmRpID0gIChzdHJ1Y3Qgb2NmczJfZGlub2RlICopeHMtPmlub2RlX2JoLT5iX2RhdGE7Ci0Jc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKm1ldGFfYWMgPSBOVUxMOwotCWhhbmRsZV90ICpoYW5kbGUgPSBOVUxMOworCWhhbmRsZV90ICpoYW5kbGUgPSBjdHh0LT5oYW5kbGU7CiAJc3RydWN0IG9jZnMyX3hhdHRyX2Jsb2NrICp4YmxrID0gTlVMTDsKIAl1MTYgc3ViYWxsb2NfYml0X3N0YXJ0OwogCXUzMiBudW1fZ290OwpAQCAtMTgxOCw0NSArMjA5OSwyOSBAQAogCWludCByZXQ7CiAKIAlpZiAoIXhzLT54YXR0cl9iaCkgewotCQkvKgotCQkgKiBBbGxvYyBvbmUgZXh0ZXJuYWwgYmxvY2sgZm9yIGV4dGVuZGVkIGF0dHJpYnV0ZQotCQkgKiBvdXRzaWRlIG9mIGlub2RlLgotCQkgKi8KLQkJcmV0ID0gb2NmczJfcmVzZXJ2ZV9uZXdfbWV0YWRhdGFfYmxvY2tzKG9zYiwgMSwgJm1ldGFfYWMpOworCQlyZXQgPSBvY2ZzMl9qb3VybmFsX2FjY2Vzc19kaShoYW5kbGUsIGlub2RlLCB4cy0+aW5vZGVfYmgsCisJCQkJCSAgICAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX0NSRUFURSk7CiAJCWlmIChyZXQgPCAwKSB7CiAJCQltbG9nX2Vycm5vKHJldCk7Ci0JCQlnb3RvIG91dDsKLQkJfQotCQloYW5kbGUgPSBvY2ZzMl9zdGFydF90cmFucyhvc2IsCi0JCQkJCSAgIE9DRlMyX1hBVFRSX0JMT0NLX0NSRUFURV9DUkVESVRTKTsKLQkJaWYgKElTX0VSUihoYW5kbGUpKSB7Ci0JCQlyZXQgPSBQVFJfRVJSKGhhbmRsZSk7Ci0JCQltbG9nX2Vycm5vKHJldCk7Ci0JCQlnb3RvIG91dDsKLQkJfQotCQlyZXQgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGlub2RlLCB4cy0+aW5vZGVfYmgsCi0JCQkJCSAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX0NSRUFURSk7Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQltbG9nX2Vycm5vKHJldCk7Ci0JCQlnb3RvIG91dF9jb21taXQ7CisJCQlnb3RvIGVuZDsKIAkJfQogCi0JCXJldCA9IG9jZnMyX2NsYWltX21ldGFkYXRhKG9zYiwgaGFuZGxlLCBtZXRhX2FjLCAxLAorCQlyZXQgPSBvY2ZzMl9jbGFpbV9tZXRhZGF0YShvc2IsIGhhbmRsZSwgY3R4dC0+bWV0YV9hYywgMSwKIAkJCQkJICAgJnN1YmFsbG9jX2JpdF9zdGFydCwgJm51bV9nb3QsCiAJCQkJCSAgICZmaXJzdF9ibGtubyk7CiAJCWlmIChyZXQgPCAwKSB7CiAJCQltbG9nX2Vycm5vKHJldCk7Ci0JCQlnb3RvIG91dF9jb21taXQ7CisJCQlnb3RvIGVuZDsKIAkJfQogCiAJCW5ld19iaCA9IHNiX2dldGJsayhpbm9kZS0+aV9zYiwgZmlyc3RfYmxrbm8pOwogCQlvY2ZzMl9zZXRfbmV3X2J1ZmZlcl91cHRvZGF0ZShpbm9kZSwgbmV3X2JoKTsKIAotCQlyZXQgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGlub2RlLCBuZXdfYmgsCi0JCQkJCSAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX0NSRUFURSk7CisJCXJldCA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzX3hiKGhhbmRsZSwgaW5vZGUsIG5ld19iaCwKKwkJCQkJICAgICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfQ1JFQVRFKTsKIAkJaWYgKHJldCA8IDApIHsKIAkJCW1sb2dfZXJybm8ocmV0KTsKLQkJCWdvdG8gb3V0X2NvbW1pdDsKKwkJCWdvdG8gZW5kOwogCQl9CiAKIAkJLyogSW5pdGlhbGl6ZSBvY2ZzMl94YXR0cl9ibG9jayAqLwpAQCAtMTg3NCw0NCArMjEzOSw1NTUgQEAKIAkJeHMtPmVuZCA9ICh2b2lkICopeGJsayArIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZTsKIAkJeHMtPmhlcmUgPSB4cy0+aGVhZGVyLT54aF9lbnRyaWVzOwogCi0KIAkJcmV0ID0gb2NmczJfam91cm5hbF9kaXJ0eShoYW5kbGUsIG5ld19iaCk7CiAJCWlmIChyZXQgPCAwKSB7CiAJCQltbG9nX2Vycm5vKHJldCk7Ci0JCQlnb3RvIG91dF9jb21taXQ7CisJCQlnb3RvIGVuZDsKIAkJfQogCQlkaS0+aV94YXR0cl9sb2MgPSBjcHVfdG9fbGU2NChmaXJzdF9ibGtubyk7Ci0JCXJldCA9IG9jZnMyX2pvdXJuYWxfZGlydHkoaGFuZGxlLCB4cy0+aW5vZGVfYmgpOwotCQlpZiAocmV0IDwgMCkKLQkJCW1sb2dfZXJybm8ocmV0KTsKLW91dF9jb21taXQ6Ci0JCW9jZnMyX2NvbW1pdF90cmFucyhvc2IsIGhhbmRsZSk7Ci1vdXQ6Ci0JCWlmIChtZXRhX2FjKQotCQkJb2NmczJfZnJlZV9hbGxvY19jb250ZXh0KG1ldGFfYWMpOwotCQlpZiAocmV0IDwgMCkKLQkJCXJldHVybiByZXQ7CisJCW9jZnMyX2pvdXJuYWxfZGlydHkoaGFuZGxlLCB4cy0+aW5vZGVfYmgpOwogCX0gZWxzZQogCQl4YmxrID0gKHN0cnVjdCBvY2ZzMl94YXR0cl9ibG9jayAqKXhzLT54YXR0cl9iaC0+Yl9kYXRhOwogCiAJaWYgKCEobGUxNl90b19jcHUoeGJsay0+eGJfZmxhZ3MpICYgT0NGUzJfWEFUVFJfSU5ERVhFRCkpIHsKIAkJLyogU2V0IGV4dGVuZGVkIGF0dHJpYnV0ZSBpbnRvIGV4dGVybmFsIGJsb2NrICovCi0JCXJldCA9IG9jZnMyX3hhdHRyX3NldF9lbnRyeShpbm9kZSwgeGksIHhzLCBPQ0ZTMl9IQVNfWEFUVFJfRkwpOworCQlyZXQgPSBvY2ZzMl94YXR0cl9zZXRfZW50cnkoaW5vZGUsIHhpLCB4cywgY3R4dCwKKwkJCQkJICAgIE9DRlMyX0hBU19YQVRUUl9GTCk7CiAJCWlmICghcmV0IHx8IHJldCAhPSAtRU5PU1BDKQogCQkJZ290byBlbmQ7CiAKLQkJcmV0ID0gb2NmczJfeGF0dHJfY3JlYXRlX2luZGV4X2Jsb2NrKGlub2RlLCB4cyk7CisJCXJldCA9IG9jZnMyX3hhdHRyX2NyZWF0ZV9pbmRleF9ibG9jayhpbm9kZSwgeHMsIGN0eHQpOwogCQlpZiAocmV0KQogCQkJZ290byBlbmQ7CiAJfQogCi0JcmV0ID0gb2NmczJfeGF0dHJfc2V0X2VudHJ5X2luZGV4X2Jsb2NrKGlub2RlLCB4aSwgeHMpOworCXJldCA9IG9jZnMyX3hhdHRyX3NldF9lbnRyeV9pbmRleF9ibG9jayhpbm9kZSwgeGksIHhzLCBjdHh0KTsKIAogZW5kOgogCiAJcmV0dXJuIHJldDsKIH0KIAorLyogQ2hlY2sgd2hldGhlciB0aGUgbmV3IHhhdHRyIGNhbiBiZSBpbnNlcnRlZCBpbnRvIHRoZSBpbm9kZS4gKi8KK3N0YXRpYyBpbnQgb2NmczJfeGF0dHJfY2FuX2JlX2luX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJICAgICAgIHN0cnVjdCBvY2ZzMl94YXR0cl9pbmZvICp4aSwKKwkJCQkgICAgICAgc3RydWN0IG9jZnMyX3hhdHRyX3NlYXJjaCAqeHMpCit7CisJdTY0IHZhbHVlX3NpemU7CisJc3RydWN0IG9jZnMyX3hhdHRyX2VudHJ5ICpsYXN0OworCWludCBmcmVlLCBpOworCXNpemVfdCBtaW5fb2ZmcyA9IHhzLT5lbmQgLSB4cy0+YmFzZTsKKworCWlmICgheHMtPmhlYWRlcikKKwkJcmV0dXJuIDA7CisKKwlsYXN0ID0geHMtPmhlYWRlci0+eGhfZW50cmllczsKKworCWZvciAoaSA9IDA7IGkgPCBsZTE2X3RvX2NwdSh4cy0+aGVhZGVyLT54aF9jb3VudCk7IGkrKykgeworCQlzaXplX3Qgb2ZmcyA9IGxlMTZfdG9fY3B1KGxhc3QtPnhlX25hbWVfb2Zmc2V0KTsKKwkJaWYgKG9mZnMgPCBtaW5fb2ZmcykKKwkJCW1pbl9vZmZzID0gb2ZmczsKKwkJbGFzdCArPSAxOworCX0KKworCWZyZWUgPSBtaW5fb2ZmcyAtICgodm9pZCAqKWxhc3QgLSB4cy0+YmFzZSkgLSBzaXplb2YoX191MzIpOworCWlmIChmcmVlIDwgMCkKKwkJcmV0dXJuIDA7CisKKwlCVUdfT04oIXhzLT5ub3RfZm91bmQpOworCisJaWYgKHhpLT52YWx1ZV9sZW4gPiBPQ0ZTMl9YQVRUUl9JTkxJTkVfU0laRSkKKwkJdmFsdWVfc2l6ZSA9IE9DRlMyX1hBVFRSX1JPT1RfU0laRTsKKwllbHNlCisJCXZhbHVlX3NpemUgPSBPQ0ZTMl9YQVRUUl9TSVpFKHhpLT52YWx1ZV9sZW4pOworCisJaWYgKGZyZWUgPj0gc2l6ZW9mKHN0cnVjdCBvY2ZzMl94YXR0cl9lbnRyeSkgKworCQkgICBPQ0ZTMl9YQVRUUl9TSVpFKHN0cmxlbih4aS0+bmFtZSkpICsgdmFsdWVfc2l6ZSkKKwkJcmV0dXJuIDE7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvY2ZzMl9jYWxjX3hhdHRyX3NldF9uZWVkKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJICAgICBzdHJ1Y3Qgb2NmczJfZGlub2RlICpkaSwKKwkJCQkgICAgIHN0cnVjdCBvY2ZzMl94YXR0cl9pbmZvICp4aSwKKwkJCQkgICAgIHN0cnVjdCBvY2ZzMl94YXR0cl9zZWFyY2ggKnhpcywKKwkJCQkgICAgIHN0cnVjdCBvY2ZzMl94YXR0cl9zZWFyY2ggKnhicywKKwkJCQkgICAgIGludCAqY2x1c3RlcnNfbmVlZCwKKwkJCQkgICAgIGludCAqbWV0YV9uZWVkLAorCQkJCSAgICAgaW50ICpjcmVkaXRzX25lZWQpCit7CisJaW50IHJldCA9IDAsIG9sZF9pbl94YiA9IDA7CisJaW50IGNsdXN0ZXJzX2FkZCA9IDAsIG1ldGFfYWRkID0gMCwgY3JlZGl0cyA9IDA7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IE5VTEw7CisJc3RydWN0IG9jZnMyX3hhdHRyX2Jsb2NrICp4YiA9IE5VTEw7CisJc3RydWN0IG9jZnMyX3hhdHRyX2VudHJ5ICp4ZSA9IE5VTEw7CisJc3RydWN0IG9jZnMyX3hhdHRyX3ZhbHVlX3Jvb3QgKnh2ID0gTlVMTDsKKwljaGFyICpiYXNlID0gTlVMTDsKKwlpbnQgbmFtZV9vZmZzZXQsIG5hbWVfbGVuID0gMDsKKwl1MzIgbmV3X2NsdXN0ZXJzID0gb2NmczJfY2x1c3RlcnNfZm9yX2J5dGVzKGlub2RlLT5pX3NiLAorCQkJCQkJICAgIHhpLT52YWx1ZV9sZW4pOworCXU2NCB2YWx1ZV9zaXplOworCisJLyoKKwkgKiBDYWxjdWxhdGUgdGhlIGNsdXN0ZXJzIHdlIG5lZWQgdG8gd3JpdGUuCisJICogTm8gbWF0dGVyIHdoZXRoZXIgd2UgcmVwbGFjZSBhbiBvbGQgb25lIG9yIGFkZCBhIG5ldyBvbmUsCisJICogd2UgbmVlZCB0aGlzIGZvciB3cml0aW5nLgorCSAqLworCWlmICh4aS0+dmFsdWVfbGVuID4gT0NGUzJfWEFUVFJfSU5MSU5FX1NJWkUpCisJCWNyZWRpdHMgKz0gbmV3X2NsdXN0ZXJzICoKKwkJCSAgIG9jZnMyX2NsdXN0ZXJzX3RvX2Jsb2Nrcyhpbm9kZS0+aV9zYiwgMSk7CisKKwlpZiAoeGlzLT5ub3RfZm91bmQgJiYgeGJzLT5ub3RfZm91bmQpIHsKKwkJY3JlZGl0cyArPSBvY2ZzMl9ibG9ja3NfcGVyX3hhdHRyX2J1Y2tldChpbm9kZS0+aV9zYik7CisKKwkJaWYgKHhpLT52YWx1ZV9sZW4gPiBPQ0ZTMl9YQVRUUl9JTkxJTkVfU0laRSkgeworCQkJY2x1c3RlcnNfYWRkICs9IG5ld19jbHVzdGVyczsKKwkJCWNyZWRpdHMgKz0gb2NmczJfY2FsY19leHRlbmRfY3JlZGl0cyhpbm9kZS0+aV9zYiwKKwkJCQkJCQkmZGVmX3h2Lnh2LnhyX2xpc3QsCisJCQkJCQkJbmV3X2NsdXN0ZXJzKTsKKwkJfQorCisJCWdvdG8gbWV0YV9ndWVzczsKKwl9CisKKwlpZiAoIXhpcy0+bm90X2ZvdW5kKSB7CisJCXhlID0geGlzLT5oZXJlOworCQluYW1lX29mZnNldCA9IGxlMTZfdG9fY3B1KHhlLT54ZV9uYW1lX29mZnNldCk7CisJCW5hbWVfbGVuID0gT0NGUzJfWEFUVFJfU0laRSh4ZS0+eGVfbmFtZV9sZW4pOworCQliYXNlID0geGlzLT5iYXNlOworCQljcmVkaXRzICs9IE9DRlMyX0lOT0RFX1VQREFURV9DUkVESVRTOworCX0gZWxzZSB7CisJCWludCBpLCBibG9ja19vZmYgPSAwOworCQl4YiA9IChzdHJ1Y3Qgb2NmczJfeGF0dHJfYmxvY2sgKil4YnMtPnhhdHRyX2JoLT5iX2RhdGE7CisJCXhlID0geGJzLT5oZXJlOworCQluYW1lX29mZnNldCA9IGxlMTZfdG9fY3B1KHhlLT54ZV9uYW1lX29mZnNldCk7CisJCW5hbWVfbGVuID0gT0NGUzJfWEFUVFJfU0laRSh4ZS0+eGVfbmFtZV9sZW4pOworCQlpID0geGJzLT5oZXJlIC0geGJzLT5oZWFkZXItPnhoX2VudHJpZXM7CisJCW9sZF9pbl94YiA9IDE7CisKKwkJaWYgKGxlMTZfdG9fY3B1KHhiLT54Yl9mbGFncykgJiBPQ0ZTMl9YQVRUUl9JTkRFWEVEKSB7CisJCQlyZXQgPSBvY2ZzMl94YXR0cl9idWNrZXRfZ2V0X25hbWVfdmFsdWUoaW5vZGUsCisJCQkJCQkJYnVja2V0X3hoKHhicy0+YnVja2V0KSwKKwkJCQkJCQlpLCAmYmxvY2tfb2ZmLAorCQkJCQkJCSZuYW1lX29mZnNldCk7CisJCQliYXNlID0gYnVja2V0X2Jsb2NrKHhicy0+YnVja2V0LCBibG9ja19vZmYpOworCQkJY3JlZGl0cyArPSBvY2ZzMl9ibG9ja3NfcGVyX3hhdHRyX2J1Y2tldChpbm9kZS0+aV9zYik7CisJCX0gZWxzZSB7CisJCQliYXNlID0geGJzLT5iYXNlOworCQkJY3JlZGl0cyArPSBPQ0ZTMl9YQVRUUl9CTE9DS19VUERBVEVfQ1JFRElUUzsKKwkJfQorCX0KKworCS8qCisJICogZGVsZXRlIGEgeGF0dHIgZG9lc24ndCBuZWVkIG1ldGFkYXRhIGFuZCBjbHVzdGVyIGFsbG9jYXRpb24uCisJICogc28ganVzdCBjYWxjdWxhdGUgdGhlIGNyZWRpdHMgYW5kIHJldHVybi4KKwkgKgorCSAqIFRoZSBjcmVkaXRzIGZvciByZW1vdmluZyB0aGUgdmFsdWUgdHJlZSB3aWxsIGJlIGV4dGVuZGVkCisJICogYnkgb2NmczJfcmVtb3ZlX2V4dGVudCBpdHNlbGYuCisJICovCisJaWYgKCF4aS0+dmFsdWUpIHsKKwkJaWYgKCFvY2ZzMl94YXR0cl9pc19sb2NhbCh4ZSkpCisJCQljcmVkaXRzICs9IG9jZnMyX3JlbW92ZV9leHRlbnRfY3JlZGl0cyhpbm9kZS0+aV9zYik7CisKKwkJZ290byBvdXQ7CisJfQorCisJLyogZG8gY2x1c3RlciBhbGxvY2F0aW9uIGd1ZXNzIGZpcnN0LiAqLworCXZhbHVlX3NpemUgPSBsZTY0X3RvX2NwdSh4ZS0+eGVfdmFsdWVfc2l6ZSk7CisKKwlpZiAob2xkX2luX3hiKSB7CisJCS8qCisJCSAqIEluIHhhdHRyIHNldCwgd2UgYWx3YXlzIHRyeSB0byBzZXQgdGhlIHhlIGluIGlub2RlIGZpcnN0LAorCQkgKiBzbyBpZiBpdCBjYW4gYmUgaW5zZXJ0ZWQgaW50byBpbm9kZSBzdWNjZXNzZnVsbHksIHRoZSBvbGQKKwkJICogb25lIHdpbGwgYmUgcmVtb3ZlZCBmcm9tIHRoZSB4YXR0ciBibG9jaywgYW5kIHRoaXMgeGF0dHIKKwkJICogd2lsbCBiZSBpbnNlcnRlZCBpbnRvIGlub2RlIGFzIGEgbmV3IHhhdHRyIGluIGlub2RlLgorCQkgKi8KKwkJaWYgKG9jZnMyX3hhdHRyX2Nhbl9iZV9pbl9pbm9kZShpbm9kZSwgeGksIHhpcykpIHsKKwkJCWNsdXN0ZXJzX2FkZCArPSBuZXdfY2x1c3RlcnM7CisJCQljcmVkaXRzICs9IG9jZnMyX3JlbW92ZV9leHRlbnRfY3JlZGl0cyhpbm9kZS0+aV9zYikgKworCQkJCSAgICBPQ0ZTMl9JTk9ERV9VUERBVEVfQ1JFRElUUzsKKwkJCWlmICghb2NmczJfeGF0dHJfaXNfbG9jYWwoeGUpKQorCQkJCWNyZWRpdHMgKz0gb2NmczJfY2FsY19leHRlbmRfY3JlZGl0cygKKwkJCQkJCQlpbm9kZS0+aV9zYiwKKwkJCQkJCQkmZGVmX3h2Lnh2LnhyX2xpc3QsCisJCQkJCQkJbmV3X2NsdXN0ZXJzKTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJaWYgKHhpLT52YWx1ZV9sZW4gPiBPQ0ZTMl9YQVRUUl9JTkxJTkVfU0laRSkgeworCQkvKiB0aGUgbmV3IHZhbHVlcyB3aWxsIGJlIHN0b3JlZCBvdXRzaWRlLiAqLworCQl1MzIgb2xkX2NsdXN0ZXJzID0gMDsKKworCQlpZiAoIW9jZnMyX3hhdHRyX2lzX2xvY2FsKHhlKSkgeworCQkJb2xkX2NsdXN0ZXJzID0Jb2NmczJfY2x1c3RlcnNfZm9yX2J5dGVzKGlub2RlLT5pX3NiLAorCQkJCQkJCQkgdmFsdWVfc2l6ZSk7CisJCQl4diA9IChzdHJ1Y3Qgb2NmczJfeGF0dHJfdmFsdWVfcm9vdCAqKQorCQkJICAgICAoYmFzZSArIG5hbWVfb2Zmc2V0ICsgbmFtZV9sZW4pOworCQkJdmFsdWVfc2l6ZSA9IE9DRlMyX1hBVFRSX1JPT1RfU0laRTsKKwkJfSBlbHNlCisJCQl4diA9ICZkZWZfeHYueHY7CisKKwkJaWYgKG9sZF9jbHVzdGVycyA+PSBuZXdfY2x1c3RlcnMpIHsKKwkJCWNyZWRpdHMgKz0gb2NmczJfcmVtb3ZlX2V4dGVudF9jcmVkaXRzKGlub2RlLT5pX3NiKTsKKwkJCWdvdG8gb3V0OworCQl9IGVsc2UgeworCQkJbWV0YV9hZGQgKz0gb2NmczJfZXh0ZW5kX21ldGFfbmVlZGVkKCZ4di0+eHJfbGlzdCk7CisJCQljbHVzdGVyc19hZGQgKz0gbmV3X2NsdXN0ZXJzIC0gb2xkX2NsdXN0ZXJzOworCQkJY3JlZGl0cyArPSBvY2ZzMl9jYWxjX2V4dGVuZF9jcmVkaXRzKGlub2RlLT5pX3NiLAorCQkJCQkJCSAgICAgJnh2LT54cl9saXN0LAorCQkJCQkJCSAgICAgbmV3X2NsdXN0ZXJzIC0KKwkJCQkJCQkgICAgIG9sZF9jbHVzdGVycyk7CisJCQlpZiAodmFsdWVfc2l6ZSA+PSBPQ0ZTMl9YQVRUUl9ST09UX1NJWkUpCisJCQkJZ290byBvdXQ7CisJCX0KKwl9IGVsc2UgeworCQkvKgorCQkgKiBOb3cgdGhlIG5ldyB2YWx1ZSB3aWxsIGJlIHN0b3JlZCBpbnNpZGUuIFNvIGlmIHRoZSBuZXcKKwkJICogdmFsdWUgaXMgc21hbGxlciB0aGFuIHRoZSBzaXplIG9mIHZhbHVlIHJvb3Qgb3IgdGhlIG9sZAorCQkgKiB2YWx1ZSwgd2UgZG9uJ3QgbmVlZCBhbnkgYWxsb2NhdGlvbiwgb3RoZXJ3aXNlIHdlIGhhdmUKKwkJICogdG8gZ3Vlc3MgbWV0YWRhdGEgYWxsb2NhdGlvbi4KKwkJICovCisJCWlmICgob2NmczJfeGF0dHJfaXNfbG9jYWwoeGUpICYmIHZhbHVlX3NpemUgPj0geGktPnZhbHVlX2xlbikgfHwKKwkJICAgICghb2NmczJfeGF0dHJfaXNfbG9jYWwoeGUpICYmCisJCSAgICAgT0NGUzJfWEFUVFJfUk9PVF9TSVpFID49IHhpLT52YWx1ZV9sZW4pKQorCQkJZ290byBvdXQ7CisJfQorCittZXRhX2d1ZXNzOgorCS8qIGNhbGN1bGF0ZSBtZXRhZGF0YSBhbGxvY2F0aW9uLiAqLworCWlmIChkaS0+aV94YXR0cl9sb2MpIHsKKwkJaWYgKCF4YnMtPnhhdHRyX2JoKSB7CisJCQlyZXQgPSBvY2ZzMl9yZWFkX3hhdHRyX2Jsb2NrKGlub2RlLAorCQkJCQkJICAgICBsZTY0X3RvX2NwdShkaS0+aV94YXR0cl9sb2MpLAorCQkJCQkJICAgICAmYmgpOworCQkJaWYgKHJldCkgeworCQkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKworCQkJeGIgPSAoc3RydWN0IG9jZnMyX3hhdHRyX2Jsb2NrICopYmgtPmJfZGF0YTsKKwkJfSBlbHNlCisJCQl4YiA9IChzdHJ1Y3Qgb2NmczJfeGF0dHJfYmxvY2sgKil4YnMtPnhhdHRyX2JoLT5iX2RhdGE7CisKKwkJLyoKKwkJICogSWYgdGhlcmUgaXMgYWxyZWFkeSBhbiB4YXR0ciB0cmVlLCBnb29kLCB3ZSBjYW4gY2FsY3VsYXRlCisJCSAqIGxpa2Ugb3RoZXIgYi10cmVlcy4gT3RoZXJ3aXNlIHdlIG1heSBoYXZlIHRoZSBjaGFuY2Ugb2YKKwkJICogY3JlYXRlIGEgdHJlZSwgdGhlIGNyZWRpdCBjYWxjdWxhdGlvbiBpcyBib3Jyb3dlZCBmcm9tCisJCSAqIG9jZnMyX2NhbGNfZXh0ZW5kX2NyZWRpdHMgd2l0aCByb290X2VsID0gTlVMTC4gQW5kIHRoZQorCQkgKiBuZXcgdHJlZSB3aWxsIGJlIGNsdXN0ZXIgYmFzZWQsIHNvIG5vIG1ldGEgaXMgbmVlZGVkLgorCQkgKi8KKwkJaWYgKGxlMTZfdG9fY3B1KHhiLT54Yl9mbGFncykgJiBPQ0ZTMl9YQVRUUl9JTkRFWEVEKSB7CisJCQlzdHJ1Y3Qgb2NmczJfZXh0ZW50X2xpc3QgKmVsID0KKwkJCQkgJnhiLT54Yl9hdHRycy54Yl9yb290Lnh0X2xpc3Q7CisJCQltZXRhX2FkZCArPSBvY2ZzMl9leHRlbmRfbWV0YV9uZWVkZWQoZWwpOworCQkJY3JlZGl0cyArPSBvY2ZzMl9jYWxjX2V4dGVuZF9jcmVkaXRzKGlub2RlLT5pX3NiLAorCQkJCQkJCSAgICAgZWwsIDEpOworCQl9IGVsc2UKKwkJCWNyZWRpdHMgKz0gT0NGUzJfU1VCQUxMT0NfQUxMT0MgKyAxOworCisJCS8qCisJCSAqIFRoaXMgY2x1c3RlciB3aWxsIGJlIHVzZWQgZWl0aGVyIGZvciBuZXcgYnVja2V0IG9yIGZvcgorCQkgKiBuZXcgeGF0dHIgYmxvY2suCisJCSAqIElmIHRoZSBjbHVzdGVyIHNpemUgaXMgdGhlIHNhbWUgYXMgdGhlIGJ1Y2tldCBzaXplLCBvbmUKKwkJICogbW9yZSBpcyBuZWVkZWQgc2luY2Ugd2UgbWF5IG5lZWQgdG8gZXh0ZW5kIHRoZSBidWNrZXQKKwkJICogYWxzby4KKwkJICovCisJCWNsdXN0ZXJzX2FkZCArPSAxOworCQljcmVkaXRzICs9IG9jZnMyX2Jsb2Nrc19wZXJfeGF0dHJfYnVja2V0KGlub2RlLT5pX3NiKTsKKwkJaWYgKE9DRlMyX1hBVFRSX0JVQ0tFVF9TSVpFID09CisJCQlPQ0ZTMl9TQihpbm9kZS0+aV9zYiktPnNfY2x1c3RlcnNpemUpIHsKKwkJCWNyZWRpdHMgKz0gb2NmczJfYmxvY2tzX3Blcl94YXR0cl9idWNrZXQoaW5vZGUtPmlfc2IpOworCQkJY2x1c3RlcnNfYWRkICs9IDE7CisJCX0KKwl9IGVsc2UgeworCQltZXRhX2FkZCArPSAxOworCQljcmVkaXRzICs9IE9DRlMyX1hBVFRSX0JMT0NLX0NSRUFURV9DUkVESVRTOworCX0KK291dDoKKwlpZiAoY2x1c3RlcnNfbmVlZCkKKwkJKmNsdXN0ZXJzX25lZWQgPSBjbHVzdGVyc19hZGQ7CisJaWYgKG1ldGFfbmVlZCkKKwkJKm1ldGFfbmVlZCA9IG1ldGFfYWRkOworCWlmIChjcmVkaXRzX25lZWQpCisJCSpjcmVkaXRzX25lZWQgPSBjcmVkaXRzOworCWJyZWxzZShiaCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBvY2ZzMl9pbml0X3hhdHRyX3NldF9jdHh0KHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJICAgICBzdHJ1Y3Qgb2NmczJfZGlub2RlICpkaSwKKwkJCQkgICAgIHN0cnVjdCBvY2ZzMl94YXR0cl9pbmZvICp4aSwKKwkJCQkgICAgIHN0cnVjdCBvY2ZzMl94YXR0cl9zZWFyY2ggKnhpcywKKwkJCQkgICAgIHN0cnVjdCBvY2ZzMl94YXR0cl9zZWFyY2ggKnhicywKKwkJCQkgICAgIHN0cnVjdCBvY2ZzMl94YXR0cl9zZXRfY3R4dCAqY3R4dCwKKwkJCQkgICAgIGludCAqY3JlZGl0cykKK3sKKwlpbnQgY2x1c3RlcnNfYWRkLCBtZXRhX2FkZCwgcmV0OworCXN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiID0gT0NGUzJfU0IoaW5vZGUtPmlfc2IpOworCisJbWVtc2V0KGN0eHQsIDAsIHNpemVvZihzdHJ1Y3Qgb2NmczJfeGF0dHJfc2V0X2N0eHQpKTsKKworCW9jZnMyX2luaXRfZGVhbGxvY19jdHh0KCZjdHh0LT5kZWFsbG9jKTsKKworCXJldCA9IG9jZnMyX2NhbGNfeGF0dHJfc2V0X25lZWQoaW5vZGUsIGRpLCB4aSwgeGlzLCB4YnMsCisJCQkJCSZjbHVzdGVyc19hZGQsICZtZXRhX2FkZCwgY3JlZGl0cyk7CisJaWYgKHJldCkgeworCQltbG9nX2Vycm5vKHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJbWxvZygwLCAiU2V0IHhhdHRyICVzLCByZXNlcnZlIG1ldGEgYmxvY2tzID0gJWQsIGNsdXN0ZXJzID0gJWQsICIKKwkgICAgICJjcmVkaXRzID0gJWRcbiIsIHhpLT5uYW1lLCBtZXRhX2FkZCwgY2x1c3RlcnNfYWRkLCAqY3JlZGl0cyk7CisKKwlpZiAobWV0YV9hZGQpIHsKKwkJcmV0ID0gb2NmczJfcmVzZXJ2ZV9uZXdfbWV0YWRhdGFfYmxvY2tzKG9zYiwgbWV0YV9hZGQsCisJCQkJCQkJJmN0eHQtPm1ldGFfYWMpOworCQlpZiAocmV0KSB7CisJCQltbG9nX2Vycm5vKHJldCk7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworCWlmIChjbHVzdGVyc19hZGQpIHsKKwkJcmV0ID0gb2NmczJfcmVzZXJ2ZV9jbHVzdGVycyhvc2IsIGNsdXN0ZXJzX2FkZCwgJmN0eHQtPmRhdGFfYWMpOworCQlpZiAocmV0KQorCQkJbWxvZ19lcnJubyhyZXQpOworCX0KK291dDoKKwlpZiAocmV0KSB7CisJCWlmIChjdHh0LT5tZXRhX2FjKSB7CisJCQlvY2ZzMl9mcmVlX2FsbG9jX2NvbnRleHQoY3R4dC0+bWV0YV9hYyk7CisJCQljdHh0LT5tZXRhX2FjID0gTlVMTDsKKwkJfQorCisJCS8qCisJCSAqIFdlIGNhbm5vdCBoYXZlIGFuIGVycm9yIGFuZCBhIG5vbiBudWxsIGN0eHQtPmRhdGFfYWMuCisJCSAqLworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19vY2ZzMl94YXR0cl9zZXRfaGFuZGxlKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJICAgIHN0cnVjdCBvY2ZzMl9kaW5vZGUgKmRpLAorCQkJCSAgICBzdHJ1Y3Qgb2NmczJfeGF0dHJfaW5mbyAqeGksCisJCQkJICAgIHN0cnVjdCBvY2ZzMl94YXR0cl9zZWFyY2ggKnhpcywKKwkJCQkgICAgc3RydWN0IG9jZnMyX3hhdHRyX3NlYXJjaCAqeGJzLAorCQkJCSAgICBzdHJ1Y3Qgb2NmczJfeGF0dHJfc2V0X2N0eHQgKmN0eHQpCit7CisJaW50IHJldCA9IDAsIGNyZWRpdHMsIG9sZF9mb3VuZDsKKworCWlmICgheGktPnZhbHVlKSB7CisJCS8qIFJlbW92ZSBleGlzdGluZyBleHRlbmRlZCBhdHRyaWJ1dGUgKi8KKwkJaWYgKCF4aXMtPm5vdF9mb3VuZCkKKwkJCXJldCA9IG9jZnMyX3hhdHRyX2lib2R5X3NldChpbm9kZSwgeGksIHhpcywgY3R4dCk7CisJCWVsc2UgaWYgKCF4YnMtPm5vdF9mb3VuZCkKKwkJCXJldCA9IG9jZnMyX3hhdHRyX2Jsb2NrX3NldChpbm9kZSwgeGksIHhicywgY3R4dCk7CisJfSBlbHNlIHsKKwkJLyogV2UgYWx3YXlzIHRyeSB0byBzZXQgZXh0ZW5kZWQgYXR0cmlidXRlIGludG8gaW5vZGUgZmlyc3QqLworCQlyZXQgPSBvY2ZzMl94YXR0cl9pYm9keV9zZXQoaW5vZGUsIHhpLCB4aXMsIGN0eHQpOworCQlpZiAoIXJldCAmJiAheGJzLT5ub3RfZm91bmQpIHsKKwkJCS8qCisJCQkgKiBJZiBzdWNjZWVkIGFuZCB0aGF0IGV4dGVuZGVkIGF0dHJpYnV0ZSBleGlzdGluZyBpbgorCQkJICogZXh0ZXJuYWwgYmxvY2ssIHRoZW4gd2Ugd2lsbCByZW1vdmUgaXQuCisJCQkgKi8KKwkJCXhpLT52YWx1ZSA9IE5VTEw7CisJCQl4aS0+dmFsdWVfbGVuID0gMDsKKworCQkJb2xkX2ZvdW5kID0geGlzLT5ub3RfZm91bmQ7CisJCQl4aXMtPm5vdF9mb3VuZCA9IC1FTk9EQVRBOworCQkJcmV0ID0gb2NmczJfY2FsY194YXR0cl9zZXRfbmVlZChpbm9kZSwKKwkJCQkJCQlkaSwKKwkJCQkJCQl4aSwKKwkJCQkJCQl4aXMsCisJCQkJCQkJeGJzLAorCQkJCQkJCU5VTEwsCisJCQkJCQkJTlVMTCwKKwkJCQkJCQkmY3JlZGl0cyk7CisJCQl4aXMtPm5vdF9mb3VuZCA9IG9sZF9mb3VuZDsKKwkJCWlmIChyZXQpIHsKKwkJCQltbG9nX2Vycm5vKHJldCk7CisJCQkJZ290byBvdXQ7CisJCQl9CisKKwkJCXJldCA9IG9jZnMyX2V4dGVuZF90cmFucyhjdHh0LT5oYW5kbGUsIGNyZWRpdHMgKworCQkJCQljdHh0LT5oYW5kbGUtPmhfYnVmZmVyX2NyZWRpdHMpOworCQkJaWYgKHJldCkgeworCQkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCXJldCA9IG9jZnMyX3hhdHRyX2Jsb2NrX3NldChpbm9kZSwgeGksIHhicywgY3R4dCk7CisJCX0gZWxzZSBpZiAocmV0ID09IC1FTk9TUEMpIHsKKwkJCWlmIChkaS0+aV94YXR0cl9sb2MgJiYgIXhicy0+eGF0dHJfYmgpIHsKKwkJCQlyZXQgPSBvY2ZzMl94YXR0cl9ibG9ja19maW5kKGlub2RlLAorCQkJCQkJCSAgICAgeGktPm5hbWVfaW5kZXgsCisJCQkJCQkJICAgICB4aS0+bmFtZSwgeGJzKTsKKwkJCQlpZiAocmV0KQorCQkJCQlnb3RvIG91dDsKKworCQkJCW9sZF9mb3VuZCA9IHhpcy0+bm90X2ZvdW5kOworCQkJCXhpcy0+bm90X2ZvdW5kID0gLUVOT0RBVEE7CisJCQkJcmV0ID0gb2NmczJfY2FsY194YXR0cl9zZXRfbmVlZChpbm9kZSwKKwkJCQkJCQkJZGksCisJCQkJCQkJCXhpLAorCQkJCQkJCQl4aXMsCisJCQkJCQkJCXhicywKKwkJCQkJCQkJTlVMTCwKKwkJCQkJCQkJTlVMTCwKKwkJCQkJCQkJJmNyZWRpdHMpOworCQkJCXhpcy0+bm90X2ZvdW5kID0gb2xkX2ZvdW5kOworCQkJCWlmIChyZXQpIHsKKwkJCQkJbWxvZ19lcnJubyhyZXQpOworCQkJCQlnb3RvIG91dDsKKwkJCQl9CisKKwkJCQlyZXQgPSBvY2ZzMl9leHRlbmRfdHJhbnMoY3R4dC0+aGFuZGxlLCBjcmVkaXRzICsKKwkJCQkJY3R4dC0+aGFuZGxlLT5oX2J1ZmZlcl9jcmVkaXRzKTsKKwkJCQlpZiAocmV0KSB7CisJCQkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCQkJZ290byBvdXQ7CisJCQkJfQorCQkJfQorCQkJLyoKKwkJCSAqIElmIG5vIHNwYWNlIGluIGlub2RlLCB3ZSB3aWxsIHNldCBleHRlbmRlZCBhdHRyaWJ1dGUKKwkJCSAqIGludG8gZXh0ZXJuYWwgYmxvY2suCisJCQkgKi8KKwkJCXJldCA9IG9jZnMyX3hhdHRyX2Jsb2NrX3NldChpbm9kZSwgeGksIHhicywgY3R4dCk7CisJCQlpZiAocmV0KQorCQkJCWdvdG8gb3V0OworCQkJaWYgKCF4aXMtPm5vdF9mb3VuZCkgeworCQkJCS8qCisJCQkJICogSWYgc3VjY2VlZCBhbmQgdGhhdCBleHRlbmRlZCBhdHRyaWJ1dGUKKwkJCQkgKiBleGlzdGluZyBpbiBpbm9kZSwgd2Ugd2lsbCByZW1vdmUgaXQuCisJCQkJICovCisJCQkJeGktPnZhbHVlID0gTlVMTDsKKwkJCQl4aS0+dmFsdWVfbGVuID0gMDsKKwkJCQl4YnMtPm5vdF9mb3VuZCA9IC1FTk9EQVRBOworCQkJCXJldCA9IG9jZnMyX2NhbGNfeGF0dHJfc2V0X25lZWQoaW5vZGUsCisJCQkJCQkJCWRpLAorCQkJCQkJCQl4aSwKKwkJCQkJCQkJeGlzLAorCQkJCQkJCQl4YnMsCisJCQkJCQkJCU5VTEwsCisJCQkJCQkJCU5VTEwsCisJCQkJCQkJCSZjcmVkaXRzKTsKKwkJCQlpZiAocmV0KSB7CisJCQkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCQkJZ290byBvdXQ7CisJCQkJfQorCisJCQkJcmV0ID0gb2NmczJfZXh0ZW5kX3RyYW5zKGN0eHQtPmhhbmRsZSwgY3JlZGl0cyArCisJCQkJCQljdHh0LT5oYW5kbGUtPmhfYnVmZmVyX2NyZWRpdHMpOworCQkJCWlmIChyZXQpIHsKKwkJCQkJbWxvZ19lcnJubyhyZXQpOworCQkJCQlnb3RvIG91dDsKKwkJCQl9CisJCQkJcmV0ID0gb2NmczJfeGF0dHJfaWJvZHlfc2V0KGlub2RlLCB4aSwKKwkJCQkJCQkgICAgeGlzLCBjdHh0KTsKKwkJCX0KKwkJfQorCX0KKworCWlmICghcmV0KSB7CisJCS8qIFVwZGF0ZSBpbm9kZSBjdGltZS4gKi8KKwkJcmV0ID0gb2NmczJfam91cm5hbF9hY2Nlc3MoY3R4dC0+aGFuZGxlLCBpbm9kZSwgeGlzLT5pbm9kZV9iaCwKKwkJCQkJICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOworCQlpZiAocmV0KSB7CisJCQltbG9nX2Vycm5vKHJldCk7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FOworCQlkaS0+aV9jdGltZSA9IGNwdV90b19sZTY0KGlub2RlLT5pX2N0aW1lLnR2X3NlYyk7CisJCWRpLT5pX2N0aW1lX25zZWMgPSBjcHVfdG9fbGUzMihpbm9kZS0+aV9jdGltZS50dl9uc2VjKTsKKwkJb2NmczJfam91cm5hbF9kaXJ0eShjdHh0LT5oYW5kbGUsIHhpcy0+aW5vZGVfYmgpOworCX0KK291dDoKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBvbmx5IGNhbGxlZCBkdWluZyBjcmVhdGluZyBpbm9kZQorICogZm9yIGluaXQgc2VjdXJpdHkvYWNsIHhhdHRycyBvZiB0aGUgbmV3IGlub2RlLgorICogQWxsIHRyYW5zYW5jdGlvbiBjcmVkaXRzIGhhdmUgYmVlbiByZXNlcnZlZCBpbiBta25vZC4KKyAqLworaW50IG9jZnMyX3hhdHRyX3NldF9oYW5kbGUoaGFuZGxlX3QgKmhhbmRsZSwKKwkJCSAgIHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRpX2JoLAorCQkJICAgaW50IG5hbWVfaW5kZXgsCisJCQkgICBjb25zdCBjaGFyICpuYW1lLAorCQkJICAgY29uc3Qgdm9pZCAqdmFsdWUsCisJCQkgICBzaXplX3QgdmFsdWVfbGVuLAorCQkJICAgaW50IGZsYWdzLAorCQkJICAgc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKm1ldGFfYWMsCisJCQkgICBzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqZGF0YV9hYykKK3sKKwlzdHJ1Y3Qgb2NmczJfZGlub2RlICpkaTsKKwlpbnQgcmV0OworCisJc3RydWN0IG9jZnMyX3hhdHRyX2luZm8geGkgPSB7CisJCS5uYW1lX2luZGV4ID0gbmFtZV9pbmRleCwKKwkJLm5hbWUgPSBuYW1lLAorCQkudmFsdWUgPSB2YWx1ZSwKKwkJLnZhbHVlX2xlbiA9IHZhbHVlX2xlbiwKKwl9OworCisJc3RydWN0IG9jZnMyX3hhdHRyX3NlYXJjaCB4aXMgPSB7CisJCS5ub3RfZm91bmQgPSAtRU5PREFUQSwKKwl9OworCisJc3RydWN0IG9jZnMyX3hhdHRyX3NlYXJjaCB4YnMgPSB7CisJCS5ub3RfZm91bmQgPSAtRU5PREFUQSwKKwl9OworCisJc3RydWN0IG9jZnMyX3hhdHRyX3NldF9jdHh0IGN0eHQgPSB7CisJCS5oYW5kbGUgPSBoYW5kbGUsCisJCS5tZXRhX2FjID0gbWV0YV9hYywKKwkJLmRhdGFfYWMgPSBkYXRhX2FjLAorCX07CisKKwlpZiAoIW9jZnMyX3N1cHBvcnRzX3hhdHRyKE9DRlMyX1NCKGlub2RlLT5pX3NiKSkpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCS8qCisJICogSW4gZXh0cmVtZSBzaXR1YXRpb24sIG1heSBuZWVkIHhhdHRyIGJ1Y2tldCB3aGVuCisJICogYmxvY2sgc2l6ZSBpcyB0b28gc21hbGwuIEFuZCB3ZSBoYXZlIGFscmVhZHkgcmVzZXJ2ZWQKKwkgKiB0aGUgY3JlZGl0cyBmb3IgYnVja2V0IGluIG1rbm9kLgorCSAqLworCWlmIChpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgPT0gT0NGUzJfTUlOX0JMT0NLU0laRSkgeworCQl4YnMuYnVja2V0ID0gb2NmczJfeGF0dHJfYnVja2V0X25ldyhpbm9kZSk7CisJCWlmICgheGJzLmJ1Y2tldCkgeworCQkJbWxvZ19lcnJubygtRU5PTUVNKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJfQorCisJeGlzLmlub2RlX2JoID0geGJzLmlub2RlX2JoID0gZGlfYmg7CisJZGkgPSAoc3RydWN0IG9jZnMyX2Rpbm9kZSAqKWRpX2JoLT5iX2RhdGE7CisKKwlkb3duX3dyaXRlKCZPQ0ZTMl9JKGlub2RlKS0+aXBfeGF0dHJfc2VtKTsKKworCXJldCA9IG9jZnMyX3hhdHRyX2lib2R5X2ZpbmQoaW5vZGUsIG5hbWVfaW5kZXgsIG5hbWUsICZ4aXMpOworCWlmIChyZXQpCisJCWdvdG8gY2xlYW51cDsKKwlpZiAoeGlzLm5vdF9mb3VuZCkgeworCQlyZXQgPSBvY2ZzMl94YXR0cl9ibG9ja19maW5kKGlub2RlLCBuYW1lX2luZGV4LCBuYW1lLCAmeGJzKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gY2xlYW51cDsKKwl9CisKKwlyZXQgPSBfX29jZnMyX3hhdHRyX3NldF9oYW5kbGUoaW5vZGUsIGRpLCAmeGksICZ4aXMsICZ4YnMsICZjdHh0KTsKKworY2xlYW51cDoKKwl1cF93cml0ZSgmT0NGUzJfSShpbm9kZSktPmlwX3hhdHRyX3NlbSk7CisJYnJlbHNlKHhicy54YXR0cl9iaCk7CisJb2NmczJfeGF0dHJfYnVja2V0X2ZyZWUoeGJzLmJ1Y2tldCk7CisKKwlyZXR1cm4gcmV0OworfQorCiAvKgogICogb2NmczJfeGF0dHJfc2V0KCkKICAqCkBAIC0xOTI4LDggKzI3MDQsMTAgQEAKIHsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRpX2JoID0gTlVMTDsKIAlzdHJ1Y3Qgb2NmczJfZGlub2RlICpkaTsKLQlpbnQgcmV0OwotCXUxNiBpLCBibGtfcGVyX2J1Y2tldCA9IG9jZnMyX2Jsb2Nrc19wZXJfeGF0dHJfYnVja2V0KGlub2RlLT5pX3NiKTsKKwlpbnQgcmV0LCBjcmVkaXRzOworCXN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiID0gT0NGUzJfU0IoaW5vZGUtPmlfc2IpOworCXN0cnVjdCBpbm9kZSAqdGxfaW5vZGUgPSBvc2ItPm9zYl90bF9pbm9kZTsKKwlzdHJ1Y3Qgb2NmczJfeGF0dHJfc2V0X2N0eHQgY3R4dCA9IHsgTlVMTCwgTlVMTCwgfTsKIAogCXN0cnVjdCBvY2ZzMl94YXR0cl9pbmZvIHhpID0gewogCQkubmFtZV9pbmRleCA9IG5hbWVfaW5kZXgsCkBAIC0xOTQ5LDEwICsyNzI3LDIwIEBACiAJaWYgKCFvY2ZzMl9zdXBwb3J0c194YXR0cihPQ0ZTMl9TQihpbm9kZS0+aV9zYikpKQogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAKKwkvKgorCSAqIE9ubHkgeGJzIHdpbGwgYmUgdXNlZCBvbiBpbmRleGVkIHRyZWVzLiAgeGlzIGRvZXNuJ3QgbmVlZCBhCisJICogYnVja2V0LgorCSAqLworCXhicy5idWNrZXQgPSBvY2ZzMl94YXR0cl9idWNrZXRfbmV3KGlub2RlKTsKKwlpZiAoIXhicy5idWNrZXQpIHsKKwkJbWxvZ19lcnJubygtRU5PTUVNKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCiAJcmV0ID0gb2NmczJfaW5vZGVfbG9jayhpbm9kZSwgJmRpX2JoLCAxKTsKIAlpZiAocmV0IDwgMCkgewogCQltbG9nX2Vycm5vKHJldCk7Ci0JCXJldHVybiByZXQ7CisJCWdvdG8gY2xlYW51cF9ub2xvY2s7CiAJfQogCXhpcy5pbm9kZV9iaCA9IHhicy5pbm9kZV9iaCA9IGRpX2JoOwogCWRpID0gKHN0cnVjdCBvY2ZzMl9kaW5vZGUgKilkaV9iaC0+Yl9kYXRhOwpAQCAtMTk4NCw1NSArMjc3Miw1MyBAQAogCQkJZ290byBjbGVhbnVwOwogCX0KIAotCWlmICghdmFsdWUpIHsKLQkJLyogUmVtb3ZlIGV4aXN0aW5nIGV4dGVuZGVkIGF0dHJpYnV0ZSAqLwotCQlpZiAoIXhpcy5ub3RfZm91bmQpCi0JCQlyZXQgPSBvY2ZzMl94YXR0cl9pYm9keV9zZXQoaW5vZGUsICZ4aSwgJnhpcyk7Ci0JCWVsc2UgaWYgKCF4YnMubm90X2ZvdW5kKQotCQkJcmV0ID0gb2NmczJfeGF0dHJfYmxvY2tfc2V0KGlub2RlLCAmeGksICZ4YnMpOwotCX0gZWxzZSB7Ci0JCS8qIFdlIGFsd2F5cyB0cnkgdG8gc2V0IGV4dGVuZGVkIGF0dHJpYnV0ZSBpbnRvIGlub2RlIGZpcnN0Ki8KLQkJcmV0ID0gb2NmczJfeGF0dHJfaWJvZHlfc2V0KGlub2RlLCAmeGksICZ4aXMpOwotCQlpZiAoIXJldCAmJiAheGJzLm5vdF9mb3VuZCkgewotCQkJLyoKLQkJCSAqIElmIHN1Y2NlZWQgYW5kIHRoYXQgZXh0ZW5kZWQgYXR0cmlidXRlIGV4aXN0aW5nIGluCi0JCQkgKiBleHRlcm5hbCBibG9jaywgdGhlbiB3ZSB3aWxsIHJlbW92ZSBpdC4KLQkJCSAqLwotCQkJeGkudmFsdWUgPSBOVUxMOwotCQkJeGkudmFsdWVfbGVuID0gMDsKLQkJCXJldCA9IG9jZnMyX3hhdHRyX2Jsb2NrX3NldChpbm9kZSwgJnhpLCAmeGJzKTsKLQkJfSBlbHNlIGlmIChyZXQgPT0gLUVOT1NQQykgewotCQkJaWYgKGRpLT5pX3hhdHRyX2xvYyAmJiAheGJzLnhhdHRyX2JoKSB7Ci0JCQkJcmV0ID0gb2NmczJfeGF0dHJfYmxvY2tfZmluZChpbm9kZSwgbmFtZV9pbmRleCwKLQkJCQkJCQkgICAgIG5hbWUsICZ4YnMpOwotCQkJCWlmIChyZXQpCi0JCQkJCWdvdG8gY2xlYW51cDsKLQkJCX0KLQkJCS8qCi0JCQkgKiBJZiBubyBzcGFjZSBpbiBpbm9kZSwgd2Ugd2lsbCBzZXQgZXh0ZW5kZWQgYXR0cmlidXRlCi0JCQkgKiBpbnRvIGV4dGVybmFsIGJsb2NrLgotCQkJICovCi0JCQlyZXQgPSBvY2ZzMl94YXR0cl9ibG9ja19zZXQoaW5vZGUsICZ4aSwgJnhicyk7Ci0JCQlpZiAocmV0KQotCQkJCWdvdG8gY2xlYW51cDsKLQkJCWlmICgheGlzLm5vdF9mb3VuZCkgewotCQkJCS8qCi0JCQkJICogSWYgc3VjY2VlZCBhbmQgdGhhdCBleHRlbmRlZCBhdHRyaWJ1dGUKLQkJCQkgKiBleGlzdGluZyBpbiBpbm9kZSwgd2Ugd2lsbCByZW1vdmUgaXQuCi0JCQkJICovCi0JCQkJeGkudmFsdWUgPSBOVUxMOwotCQkJCXhpLnZhbHVlX2xlbiA9IDA7Ci0JCQkJcmV0ID0gb2NmczJfeGF0dHJfaWJvZHlfc2V0KGlub2RlLCAmeGksICZ4aXMpOwotCQkJfQorCisJbXV0ZXhfbG9jaygmdGxfaW5vZGUtPmlfbXV0ZXgpOworCisJaWYgKG9jZnMyX3RydW5jYXRlX2xvZ19uZWVkc19mbHVzaChvc2IpKSB7CisJCXJldCA9IF9fb2NmczJfZmx1c2hfdHJ1bmNhdGVfbG9nKG9zYik7CisJCWlmIChyZXQgPCAwKSB7CisJCQltdXRleF91bmxvY2soJnRsX2lub2RlLT5pX211dGV4KTsKKwkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCWdvdG8gY2xlYW51cDsKIAkJfQogCX0KKwltdXRleF91bmxvY2soJnRsX2lub2RlLT5pX211dGV4KTsKKworCXJldCA9IG9jZnMyX2luaXRfeGF0dHJfc2V0X2N0eHQoaW5vZGUsIGRpLCAmeGksICZ4aXMsCisJCQkJCSZ4YnMsICZjdHh0LCAmY3JlZGl0cyk7CisJaWYgKHJldCkgeworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gY2xlYW51cDsKKwl9CisKKwkvKiB3ZSBuZWVkIHRvIHVwZGF0ZSBpbm9kZSdzIGN0aW1lIGZpZWxkLCBzbyBhZGQgY3JlZGl0IGZvciBpdC4gKi8KKwljcmVkaXRzICs9IE9DRlMyX0lOT0RFX1VQREFURV9DUkVESVRTOworCWN0eHQuaGFuZGxlID0gb2NmczJfc3RhcnRfdHJhbnMob3NiLCBjcmVkaXRzKTsKKwlpZiAoSVNfRVJSKGN0eHQuaGFuZGxlKSkgeworCQlyZXQgPSBQVFJfRVJSKGN0eHQuaGFuZGxlKTsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIGNsZWFudXA7CisJfQorCisJcmV0ID0gX19vY2ZzMl94YXR0cl9zZXRfaGFuZGxlKGlub2RlLCBkaSwgJnhpLCAmeGlzLCAmeGJzLCAmY3R4dCk7CisKKwlvY2ZzMl9jb21taXRfdHJhbnMob3NiLCBjdHh0LmhhbmRsZSk7CisKKwlpZiAoY3R4dC5kYXRhX2FjKQorCQlvY2ZzMl9mcmVlX2FsbG9jX2NvbnRleHQoY3R4dC5kYXRhX2FjKTsKKwlpZiAoY3R4dC5tZXRhX2FjKQorCQlvY2ZzMl9mcmVlX2FsbG9jX2NvbnRleHQoY3R4dC5tZXRhX2FjKTsKKwlpZiAob2NmczJfZGVhbGxvY19oYXNfY2x1c3RlcigmY3R4dC5kZWFsbG9jKSkKKwkJb2NmczJfc2NoZWR1bGVfdHJ1bmNhdGVfbG9nX2ZsdXNoKG9zYiwgMSk7CisJb2NmczJfcnVuX2RlYWxsb2NzKG9zYiwgJmN0eHQuZGVhbGxvYyk7CiBjbGVhbnVwOgogCXVwX3dyaXRlKCZPQ0ZTMl9JKGlub2RlKS0+aXBfeGF0dHJfc2VtKTsKIAlvY2ZzMl9pbm9kZV91bmxvY2soaW5vZGUsIDEpOworY2xlYW51cF9ub2xvY2s6CiAJYnJlbHNlKGRpX2JoKTsKIAlicmVsc2UoeGJzLnhhdHRyX2JoKTsKLQlmb3IgKGkgPSAwOyBpIDwgYmxrX3Blcl9idWNrZXQ7IGkrKykKLQkJYnJlbHNlKHhicy5idWNrZXQuYmhzW2ldKTsKKwlvY2ZzMl94YXR0cl9idWNrZXRfZnJlZSh4YnMuYnVja2V0KTsKIAogCXJldHVybiByZXQ7CiB9CkBAIC0yMTA3LDcgKzI4OTMsNyBAQAogCQkJCXZvaWQgKnBhcmEpOwogCiBzdGF0aWMgaW50IG9jZnMyX2ZpbmRfeGVfaW5fYnVja2V0KHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCQkJICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpoZWFkZXJfYmgsCisJCQkJICAgc3RydWN0IG9jZnMyX3hhdHRyX2J1Y2tldCAqYnVja2V0LAogCQkJCSAgIGludCBuYW1lX2luZGV4LAogCQkJCSAgIGNvbnN0IGNoYXIgKm5hbWUsCiAJCQkJICAgdTMyIG5hbWVfaGFzaCwKQEAgLTIxMTUsMTEgKzI5MDEsOSBAQAogCQkJCSAgIGludCAqZm91bmQpCiB7CiAJaW50IGksIHJldCA9IDAsIGNtcCA9IDEsIGJsb2NrX29mZiwgbmV3X29mZnNldDsKLQlzdHJ1Y3Qgb2NmczJfeGF0dHJfaGVhZGVyICp4aCA9Ci0JCQkoc3RydWN0IG9jZnMyX3hhdHRyX2hlYWRlciAqKWhlYWRlcl9iaC0+Yl9kYXRhOworCXN0cnVjdCBvY2ZzMl94YXR0cl9oZWFkZXIgKnhoID0gYnVja2V0X3hoKGJ1Y2tldCk7CiAJc2l6ZV90IG5hbWVfbGVuID0gc3RybGVuKG5hbWUpOwogCXN0cnVjdCBvY2ZzMl94YXR0cl9lbnRyeSAqeGUgPSBOVUxMOwotCXN0cnVjdCBidWZmZXJfaGVhZCAqbmFtZV9iaCA9IE5VTEw7CiAJY2hhciAqeGVfbmFtZTsKIAogCS8qCkBAIC0yMTUwLDE5ICsyOTM0LDkgQEAKIAkJCWJyZWFrOwogCQl9CiAKLQkJcmV0ID0gb2NmczJfcmVhZF9ibG9jayhpbm9kZSwgaGVhZGVyX2JoLT5iX2Jsb2NrbnIgKyBibG9ja19vZmYsCi0JCQkJICAgICAgICZuYW1lX2JoKTsKLQkJaWYgKHJldCkgewotCQkJbWxvZ19lcnJubyhyZXQpOwotCQkJYnJlYWs7Ci0JCX0KLQkJeGVfbmFtZSA9IG5hbWVfYmgtPmJfZGF0YSArIG5ld19vZmZzZXQ7CiAKLQkJY21wID0gbWVtY21wKG5hbWUsIHhlX25hbWUsIG5hbWVfbGVuKTsKLQkJYnJlbHNlKG5hbWVfYmgpOwotCQluYW1lX2JoID0gTlVMTDsKLQotCQlpZiAoY21wID09IDApIHsKKwkJeGVfbmFtZSA9IGJ1Y2tldF9ibG9jayhidWNrZXQsIGJsb2NrX29mZikgKyBuZXdfb2Zmc2V0OworCQlpZiAoIW1lbWNtcChuYW1lLCB4ZV9uYW1lLCBuYW1lX2xlbikpIHsKIAkJCSp4ZV9pbmRleCA9IGk7CiAJCQkqZm91bmQgPSAxOwogCQkJcmV0ID0gMDsKQEAgLTIxOTIsMzkgKzI5NjYsNDIgQEAKIAkJCQkgICBzdHJ1Y3Qgb2NmczJfeGF0dHJfc2VhcmNoICp4cykKIHsKIAlpbnQgcmV0LCBmb3VuZCA9IDA7Ci0Jc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IE5VTEw7Ci0Jc3RydWN0IGJ1ZmZlcl9oZWFkICpsb3dlcl9iaCA9IE5VTEw7CiAJc3RydWN0IG9jZnMyX3hhdHRyX2hlYWRlciAqeGggPSBOVUxMOwogCXN0cnVjdCBvY2ZzMl94YXR0cl9lbnRyeSAqeGUgPSBOVUxMOwogCXUxNiBpbmRleCA9IDA7CiAJdTE2IGJsa19wZXJfYnVja2V0ID0gb2NmczJfYmxvY2tzX3Blcl94YXR0cl9idWNrZXQoaW5vZGUtPmlfc2IpOwogCWludCBsb3dfYnVja2V0ID0gMCwgYnVja2V0LCBoaWdoX2J1Y2tldDsKKwlzdHJ1Y3Qgb2NmczJfeGF0dHJfYnVja2V0ICpzZWFyY2g7CiAJdTMyIGxhc3RfaGFzaDsKLQl1NjQgYmxrbm87CisJdTY0IGJsa25vLCBsb3dlcl9ibGtubyA9IDA7CiAKLQlyZXQgPSBvY2ZzMl9yZWFkX2Jsb2NrKGlub2RlLCBwX2Jsa25vLCAmYmgpOworCXNlYXJjaCA9IG9jZnMyX3hhdHRyX2J1Y2tldF9uZXcoaW5vZGUpOworCWlmICghc2VhcmNoKSB7CisJCXJldCA9IC1FTk9NRU07CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXQ7CisJfQorCisJcmV0ID0gb2NmczJfcmVhZF94YXR0cl9idWNrZXQoc2VhcmNoLCBwX2Jsa25vKTsKIAlpZiAocmV0KSB7CiAJCW1sb2dfZXJybm8ocmV0KTsKIAkJZ290byBvdXQ7CiAJfQogCi0JeGggPSAoc3RydWN0IG9jZnMyX3hhdHRyX2hlYWRlciAqKWJoLT5iX2RhdGE7CisJeGggPSBidWNrZXRfeGgoc2VhcmNoKTsKIAloaWdoX2J1Y2tldCA9IGxlMTZfdG9fY3B1KHhoLT54aF9udW1fYnVja2V0cykgLSAxOwotCiAJd2hpbGUgKGxvd19idWNrZXQgPD0gaGlnaF9idWNrZXQpIHsKLQkJYnJlbHNlKGJoKTsKLQkJYmggPSBOVUxMOworCQlvY2ZzMl94YXR0cl9idWNrZXRfcmVsc2Uoc2VhcmNoKTsKKwogCQlidWNrZXQgPSAobG93X2J1Y2tldCArIGhpZ2hfYnVja2V0KSAvIDI7Ci0KIAkJYmxrbm8gPSBwX2Jsa25vICsgYnVja2V0ICogYmxrX3Blcl9idWNrZXQ7Ci0KLQkJcmV0ID0gb2NmczJfcmVhZF9ibG9jayhpbm9kZSwgYmxrbm8sICZiaCk7CisJCXJldCA9IG9jZnMyX3JlYWRfeGF0dHJfYnVja2V0KHNlYXJjaCwgYmxrbm8pOwogCQlpZiAocmV0KSB7CiAJCQltbG9nX2Vycm5vKHJldCk7CiAJCQlnb3RvIG91dDsKIAkJfQogCi0JCXhoID0gKHN0cnVjdCBvY2ZzMl94YXR0cl9oZWFkZXIgKiliaC0+Yl9kYXRhOworCQl4aCA9IGJ1Y2tldF94aChzZWFyY2gpOwogCQl4ZSA9ICZ4aC0+eGhfZW50cmllc1swXTsKIAkJaWYgKG5hbWVfaGFzaCA8IGxlMzJfdG9fY3B1KHhlLT54ZV9uYW1lX2hhc2gpKSB7CiAJCQloaWdoX2J1Y2tldCA9IGJ1Y2tldCAtIDE7CkBAIC0yMjQxLDEwICszMDE4LDggQEAKIAogCQlsYXN0X2hhc2ggPSBsZTMyX3RvX2NwdSh4ZS0+eGVfbmFtZV9oYXNoKTsKIAotCQkvKiByZWNvcmQgbG93ZXJfYmggd2hpY2ggbWF5IGJlIHRoZSBpbnNlcnQgcGxhY2UuICovCi0JCWJyZWxzZShsb3dlcl9iaCk7Ci0JCWxvd2VyX2JoID0gYmg7Ci0JCWJoID0gTlVMTDsKKwkJLyogcmVjb3JkIGxvd2VyX2Jsa25vIHdoaWNoIG1heSBiZSB0aGUgaW5zZXJ0IHBsYWNlLiAqLworCQlsb3dlcl9ibGtubyA9IGJsa25vOwogCiAJCWlmIChuYW1lX2hhc2ggPiBsZTMyX3RvX2NwdSh4ZS0+eGVfbmFtZV9oYXNoKSkgewogCQkJbG93X2J1Y2tldCA9IGJ1Y2tldCArIDE7CkBAIC0yMjUyLDcgKzMwMjcsNyBAQAogCQl9CiAKIAkJLyogdGhlIHNlYXJjaGVkIHhhdHRyIHNob3VsZCByZXNpZGUgaW4gdGhpcyBidWNrZXQgaWYgZXhpc3RzLiAqLwotCQlyZXQgPSBvY2ZzMl9maW5kX3hlX2luX2J1Y2tldChpbm9kZSwgbG93ZXJfYmgsCisJCXJldCA9IG9jZnMyX2ZpbmRfeGVfaW5fYnVja2V0KGlub2RlLCBzZWFyY2gsCiAJCQkJCSAgICAgIG5hbWVfaW5kZXgsIG5hbWUsIG5hbWVfaGFzaCwKIAkJCQkJICAgICAgJmluZGV4LCAmZm91bmQpOwogCQlpZiAocmV0KSB7CkBAIC0yMjY3LDQ2ICszMDQyLDI5IEBACiAJICogV2hlbiB0aGUgeGF0dHIncyBoYXNoIHZhbHVlIGlzIGluIHRoZSBnYXAgb2YgMiBidWNrZXRzLCB3ZSB3aWxsCiAJICogYWx3YXlzIHNldCBpdCB0byB0aGUgcHJldmlvdXMgYnVja2V0LgogCSAqLwotCWlmICghbG93ZXJfYmgpIHsKLQkJLyoKLQkJICogV2UgY2FuJ3QgZmluZCBhbnkgYnVja2V0IHdob3NlIGZpcnN0IG5hbWVfaGFzaCBpcyBsZXNzCi0JCSAqIHRoYW4gdGhlIGZpbmQgbmFtZV9oYXNoLgotCQkgKi8KLQkJQlVHX09OKGJoLT5iX2Jsb2NrbnIgIT0gcF9ibGtubyk7Ci0JCWxvd2VyX2JoID0gYmg7Ci0JCWJoID0gTlVMTDsKLQl9Ci0JeHMtPmJ1Y2tldC5iaHNbMF0gPSBsb3dlcl9iaDsKLQl4cy0+YnVja2V0LnhoID0gKHN0cnVjdCBvY2ZzMl94YXR0cl9oZWFkZXIgKikKLQkJCQkJeHMtPmJ1Y2tldC5iaHNbMF0tPmJfZGF0YTsKLQlsb3dlcl9iaCA9IE5VTEw7CisJaWYgKCFsb3dlcl9ibGtubykKKwkJbG93ZXJfYmxrbm8gPSBwX2Jsa25vOwogCi0JeHMtPmhlYWRlciA9IHhzLT5idWNrZXQueGg7Ci0JeHMtPmJhc2UgPSB4cy0+YnVja2V0LmJoc1swXS0+Yl9kYXRhOworCS8qIFRoaXMgc2hvdWxkIGJlIGluIGNhY2hlIC0gd2UganVzdCByZWFkIGl0IGR1cmluZyB0aGUgc2VhcmNoICovCisJcmV0ID0gb2NmczJfcmVhZF94YXR0cl9idWNrZXQoeHMtPmJ1Y2tldCwgbG93ZXJfYmxrbm8pOworCWlmIChyZXQpIHsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dDsKKwl9CisKKwl4cy0+aGVhZGVyID0gYnVja2V0X3hoKHhzLT5idWNrZXQpOworCXhzLT5iYXNlID0gYnVja2V0X2Jsb2NrKHhzLT5idWNrZXQsIDApOwogCXhzLT5lbmQgPSB4cy0+YmFzZSArIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZTsKIAogCWlmIChmb3VuZCkgewotCQkvKgotCQkgKiBJZiB3ZSBoYXZlIGZvdW5kIHRoZSB4YXR0ciBlbnR5LCByZWFkIGFsbCB0aGUgYmxvY2tzIGluCi0JCSAqIHRoaXMgYnVja2V0LgotCQkgKi8KLQkJcmV0ID0gb2NmczJfcmVhZF9ibG9ja3MoaW5vZGUsIHhzLT5idWNrZXQuYmhzWzBdLT5iX2Jsb2NrbnIgKyAxLAotCQkJCQlibGtfcGVyX2J1Y2tldCAtIDEsICZ4cy0+YnVja2V0LmJoc1sxXSwKLQkJCQkJMCk7Ci0JCWlmIChyZXQpIHsKLQkJCW1sb2dfZXJybm8ocmV0KTsKLQkJCWdvdG8gb3V0OwotCQl9Ci0KIAkJeHMtPmhlcmUgPSAmeHMtPmhlYWRlci0+eGhfZW50cmllc1tpbmRleF07CiAJCW1sb2coMCwgImZpbmQgeGF0dHIgJXMgaW4gYnVja2V0ICVsbHUsIGVudHJ5ID0gJXVcbiIsIG5hbWUsCi0JCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyl4cy0+YnVja2V0LmJoc1swXS0+Yl9ibG9ja25yLCBpbmRleCk7CisJCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylidWNrZXRfYmxrbm8oeHMtPmJ1Y2tldCksIGluZGV4KTsKIAl9IGVsc2UKIAkJcmV0ID0gLUVOT0RBVEE7CiAKIG91dDoKLQlicmVsc2UoYmgpOwotCWJyZWxzZShsb3dlcl9iaCk7CisJb2NmczJfeGF0dHJfYnVja2V0X2ZyZWUoc2VhcmNoKTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0yMzU3LDUzICszMTE1LDUwIEBACiAJCQkJICAgICAgIHhhdHRyX2J1Y2tldF9mdW5jICpmdW5jLAogCQkJCSAgICAgICB2b2lkICpwYXJhKQogewotCWludCBpLCBqLCByZXQgPSAwOwotCWludCBibGtfcGVyX2J1Y2tldCA9IG9jZnMyX2Jsb2Nrc19wZXJfeGF0dHJfYnVja2V0KGlub2RlLT5pX3NiKTsKKwlpbnQgaSwgcmV0ID0gMDsKIAl1MzIgYnBjID0gb2NmczJfeGF0dHJfYnVja2V0c19wZXJfY2x1c3RlcihPQ0ZTMl9TQihpbm9kZS0+aV9zYikpOwogCXUzMiBudW1fYnVja2V0cyA9IGNsdXN0ZXJzICogYnBjOwotCXN0cnVjdCBvY2ZzMl94YXR0cl9idWNrZXQgYnVja2V0OworCXN0cnVjdCBvY2ZzMl94YXR0cl9idWNrZXQgKmJ1Y2tldDsKIAotCW1lbXNldCgmYnVja2V0LCAwLCBzaXplb2YoYnVja2V0KSk7CisJYnVja2V0ID0gb2NmczJfeGF0dHJfYnVja2V0X25ldyhpbm9kZSk7CisJaWYgKCFidWNrZXQpIHsKKwkJbWxvZ19lcnJubygtRU5PTUVNKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQogCiAJbWxvZygwLCAiaXRlcmF0aW5nIHhhdHRyIGJ1Y2tldHMgaW4gJXUgY2x1c3RlcnMgc3RhcnRpbmcgZnJvbSAlbGx1XG4iLAogCSAgICAgY2x1c3RlcnMsICh1bnNpZ25lZCBsb25nIGxvbmcpYmxrbm8pOwogCi0JZm9yIChpID0gMDsgaSA8IG51bV9idWNrZXRzOyBpKyssIGJsa25vICs9IGJsa19wZXJfYnVja2V0KSB7Ci0JCXJldCA9IG9jZnMyX3JlYWRfYmxvY2tzKGlub2RlLCBibGtubywgYmxrX3Blcl9idWNrZXQsCi0JCQkJCWJ1Y2tldC5iaHMsIDApOworCWZvciAoaSA9IDA7IGkgPCBudW1fYnVja2V0czsgaSsrLCBibGtubyArPSBidWNrZXQtPmJ1X2Jsb2NrcykgeworCQlyZXQgPSBvY2ZzMl9yZWFkX3hhdHRyX2J1Y2tldChidWNrZXQsIGJsa25vKTsKIAkJaWYgKHJldCkgewogCQkJbWxvZ19lcnJubyhyZXQpOwotCQkJZ290byBvdXQ7CisJCQlicmVhazsKIAkJfQogCi0JCWJ1Y2tldC54aCA9IChzdHJ1Y3Qgb2NmczJfeGF0dHJfaGVhZGVyICopYnVja2V0LmJoc1swXS0+Yl9kYXRhOwogCQkvKgogCQkgKiBUaGUgcmVhbCBidWNrZXQgbnVtIGluIHRoaXMgc2VyaWVzIG9mIGJsb2NrcyBpcyBzdG9yZWQKIAkJICogaW4gdGhlIDFzdCBidWNrZXQuCiAJCSAqLwogCQlpZiAoaSA9PSAwKQotCQkJbnVtX2J1Y2tldHMgPSBsZTE2X3RvX2NwdShidWNrZXQueGgtPnhoX251bV9idWNrZXRzKTsKKwkJCW51bV9idWNrZXRzID0gbGUxNl90b19jcHUoYnVja2V0X3hoKGJ1Y2tldCktPnhoX251bV9idWNrZXRzKTsKIAogCQltbG9nKDAsICJpdGVyYXRpbmcgeGF0dHIgYnVja2V0ICVsbHUsIGZpcnN0IGhhc2ggJXVcbiIsCiAJCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylibGtubywKLQkJICAgICBsZTMyX3RvX2NwdShidWNrZXQueGgtPnhoX2VudHJpZXNbMF0ueGVfbmFtZV9oYXNoKSk7CisJCSAgICAgbGUzMl90b19jcHUoYnVja2V0X3hoKGJ1Y2tldCktPnhoX2VudHJpZXNbMF0ueGVfbmFtZV9oYXNoKSk7CiAJCWlmIChmdW5jKSB7Ci0JCQlyZXQgPSBmdW5jKGlub2RlLCAmYnVja2V0LCBwYXJhKTsKLQkJCWlmIChyZXQpIHsKKwkJCXJldCA9IGZ1bmMoaW5vZGUsIGJ1Y2tldCwgcGFyYSk7CisJCQlpZiAocmV0KQogCQkJCW1sb2dfZXJybm8ocmV0KTsKLQkJCQlicmVhazsKLQkJCX0KKwkJCS8qIEZhbGwgdGhyb3VnaCB0byBidWNrZXRfcmVsc2UoKSAqLwogCQl9CiAKLQkJZm9yIChqID0gMDsgaiA8IGJsa19wZXJfYnVja2V0OyBqKyspCi0JCQlicmVsc2UoYnVja2V0LmJoc1tqXSk7Ci0JCW1lbXNldCgmYnVja2V0LCAwLCBzaXplb2YoYnVja2V0KSk7CisJCW9jZnMyX3hhdHRyX2J1Y2tldF9yZWxzZShidWNrZXQpOworCQlpZiAocmV0KQorCQkJYnJlYWs7CiAJfQogCi1vdXQ6Ci0JZm9yIChqID0gMDsgaiA8IGJsa19wZXJfYnVja2V0OyBqKyspCi0JCWJyZWxzZShidWNrZXQuYmhzW2pdKTsKLQorCW9jZnMyX3hhdHRyX2J1Y2tldF9mcmVlKGJ1Y2tldCk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMjQ0MSwyMSArMzE5NiwyMSBAQAogCWludCBpLCBibG9ja19vZmYsIG5ld19vZmZzZXQ7CiAJY29uc3QgY2hhciAqcHJlZml4LCAqbmFtZTsKIAotCWZvciAoaSA9IDAgOyBpIDwgbGUxNl90b19jcHUoYnVja2V0LT54aC0+eGhfY291bnQpOyBpKyspIHsKLQkJc3RydWN0IG9jZnMyX3hhdHRyX2VudHJ5ICplbnRyeSA9ICZidWNrZXQtPnhoLT54aF9lbnRyaWVzW2ldOworCWZvciAoaSA9IDAgOyBpIDwgbGUxNl90b19jcHUoYnVja2V0X3hoKGJ1Y2tldCktPnhoX2NvdW50KTsgaSsrKSB7CisJCXN0cnVjdCBvY2ZzMl94YXR0cl9lbnRyeSAqZW50cnkgPSAmYnVja2V0X3hoKGJ1Y2tldCktPnhoX2VudHJpZXNbaV07CiAJCXR5cGUgPSBvY2ZzMl94YXR0cl9nZXRfdHlwZShlbnRyeSk7CiAJCXByZWZpeCA9IG9jZnMyX3hhdHRyX3ByZWZpeCh0eXBlKTsKIAogCQlpZiAocHJlZml4KSB7CiAJCQlyZXQgPSBvY2ZzMl94YXR0cl9idWNrZXRfZ2V0X25hbWVfdmFsdWUoaW5vZGUsCi0JCQkJCQkJCWJ1Y2tldC0+eGgsCisJCQkJCQkJCWJ1Y2tldF94aChidWNrZXQpLAogCQkJCQkJCQlpLAogCQkJCQkJCQkmYmxvY2tfb2ZmLAogCQkJCQkJCQkmbmV3X29mZnNldCk7CiAJCQlpZiAocmV0KQogCQkJCWJyZWFrOwogCi0JCQluYW1lID0gKGNvbnN0IGNoYXIgKilidWNrZXQtPmJoc1tibG9ja19vZmZdLT5iX2RhdGEgKworCQkJbmFtZSA9IChjb25zdCBjaGFyICopYnVja2V0X2Jsb2NrKGJ1Y2tldCwgYmxvY2tfb2ZmKSArCiAJCQkJbmV3X29mZnNldDsKIAkJCXJldCA9IG9jZnMyX3hhdHRyX2xpc3RfZW50cnkoeGwtPmJ1ZmZlciwKIAkJCQkJCSAgICAgeGwtPmJ1ZmZlcl9zaXplLApAQCAtMjU0MCwzMiArMzI5NSwzNCBAQAogLyoKICAqIFdoZW4gdGhlIG9jZnMyX3hhdHRyX2Jsb2NrIGlzIGZpbGxlZCB1cCwgbmV3IGJ1Y2tldCB3aWxsIGJlIGNyZWF0ZWQKICAqIGFuZCBhbGwgdGhlIHhhdHRyIGVudHJpZXMgd2lsbCBiZSBtb3ZlZCB0byB0aGUgbmV3IGJ1Y2tldC4KKyAqIFRoZSBoZWFkZXIgZ29lcyBhdCB0aGUgc3RhcnQgb2YgdGhlIGJ1Y2tldCwgYW5kIHRoZSBuYW1lcyt2YWx1ZXMgYXJlCisgKiBmaWxsZWQgZnJvbSB0aGUgZW5kLiAgVGhpcyBpcyB3aHkgKnRhcmdldCBzdGFydHMgYXMgdGhlIGxhc3QgYnVmZmVyLgogICogTm90ZTogd2UgbmVlZCB0byBzb3J0IHRoZSBlbnRyaWVzIHNpbmNlIHRoZXkgYXJlIG5vdCBzYXZlZCBpbiBvcmRlcgogICogaW4gdGhlIG9jZnMyX3hhdHRyX2Jsb2NrLgogICovCiBzdGF0aWMgdm9pZCBvY2ZzMl9jcF94YXR0cl9ibG9ja190b19idWNrZXQoc3RydWN0IGlub2RlICppbm9kZSwKIAkJCQkJICAgc3RydWN0IGJ1ZmZlcl9oZWFkICp4Yl9iaCwKLQkJCQkJICAgc3RydWN0IGJ1ZmZlcl9oZWFkICp4aF9iaCwKLQkJCQkJICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpkYXRhX2JoKQorCQkJCQkgICBzdHJ1Y3Qgb2NmczJfeGF0dHJfYnVja2V0ICpidWNrZXQpCiB7CiAJaW50IGksIGJsb2Nrc2l6ZSA9IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZTsKKwlpbnQgYmxrcyA9IG9jZnMyX2Jsb2Nrc19wZXJfeGF0dHJfYnVja2V0KGlub2RlLT5pX3NiKTsKIAl1MTYgb2Zmc2V0LCBzaXplLCBvZmZfY2hhbmdlOwogCXN0cnVjdCBvY2ZzMl94YXR0cl9lbnRyeSAqeGU7CiAJc3RydWN0IG9jZnMyX3hhdHRyX2Jsb2NrICp4YiA9CiAJCQkJKHN0cnVjdCBvY2ZzMl94YXR0cl9ibG9jayAqKXhiX2JoLT5iX2RhdGE7CiAJc3RydWN0IG9jZnMyX3hhdHRyX2hlYWRlciAqeGJfeGggPSAmeGItPnhiX2F0dHJzLnhiX2hlYWRlcjsKLQlzdHJ1Y3Qgb2NmczJfeGF0dHJfaGVhZGVyICp4aCA9Ci0JCQkJKHN0cnVjdCBvY2ZzMl94YXR0cl9oZWFkZXIgKil4aF9iaC0+Yl9kYXRhOworCXN0cnVjdCBvY2ZzMl94YXR0cl9oZWFkZXIgKnhoID0gYnVja2V0X3hoKGJ1Y2tldCk7CiAJdTE2IGNvdW50ID0gbGUxNl90b19jcHUoeGJfeGgtPnhoX2NvdW50KTsKLQljaGFyICp0YXJnZXQgPSB4aF9iaC0+Yl9kYXRhLCAqc3JjID0geGJfYmgtPmJfZGF0YTsKKwljaGFyICpzcmMgPSB4Yl9iaC0+Yl9kYXRhOworCWNoYXIgKnRhcmdldCA9IGJ1Y2tldF9ibG9jayhidWNrZXQsIGJsa3MgLSAxKTsKIAogCW1sb2coMCwgImNwIHhhdHRyIGZyb20gYmxvY2sgJWxsdSB0byBidWNrZXQgJWxsdVxuIiwKIAkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpeGJfYmgtPmJfYmxvY2tuciwKLQkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpeGhfYmgtPmJfYmxvY2tucik7CisJICAgICAodW5zaWduZWQgbG9uZyBsb25nKWJ1Y2tldF9ibGtubyhidWNrZXQpKTsKIAotCW1lbXNldCh4aF9iaC0+Yl9kYXRhLCAwLCBibG9ja3NpemUpOwotCWlmIChkYXRhX2JoKQotCQltZW1zZXQoZGF0YV9iaC0+Yl9kYXRhLCAwLCBibG9ja3NpemUpOworCWZvciAoaSA9IDA7IGkgPCBibGtzOyBpKyspCisJCW1lbXNldChidWNrZXRfYmxvY2soYnVja2V0LCBpKSwgMCwgYmxvY2tzaXplKTsKKwogCS8qCiAJICogU2luY2UgdGhlIHhlX25hbWVfb2Zmc2V0IGlzIGJhc2VkIG9uIG9jZnMyX3hhdHRyX2hlYWRlciwKIAkgKiB0aGVyZSBpcyBhIG9mZnNldCBjaGFuZ2UgY29ycmVzcG9uZGluZyB0byB0aGUgY2hhbmdlIG9mCkBAIC0yNTc3LDggKzMzMzQsNiBAQAogCXNpemUgPSBibG9ja3NpemUgLSBvZmZzZXQ7CiAKIAkvKiBjb3B5IGFsbCB0aGUgbmFtZXMgYW5kIHZhbHVlcy4gKi8KLQlpZiAoZGF0YV9iaCkKLQkJdGFyZ2V0ID0gZGF0YV9iaC0+Yl9kYXRhOwogCW1lbWNweSh0YXJnZXQgKyBvZmZzZXQsIHNyYyArIG9mZnNldCwgc2l6ZSk7CiAKIAkvKiBJbml0IG5ldyBoZWFkZXIgbm93LiAqLwpAQCAtMjU4OCw3ICszMzQzLDcgQEAKIAl4aC0+eGhfZnJlZV9zdGFydCA9IGNwdV90b19sZTE2KE9DRlMyX1hBVFRSX0JVQ0tFVF9TSVpFIC0gc2l6ZSk7CiAKIAkvKiBjb3B5IGFsbCB0aGUgZW50cmllcy4gKi8KLQl0YXJnZXQgPSB4aF9iaC0+Yl9kYXRhOworCXRhcmdldCA9IGJ1Y2tldF9ibG9jayhidWNrZXQsIDApOwogCW9mZnNldCA9IG9mZnNldG9mKHN0cnVjdCBvY2ZzMl94YXR0cl9oZWFkZXIsIHhoX2VudHJpZXMpOwogCXNpemUgPSBjb3VudCAqIHNpemVvZihzdHJ1Y3Qgb2NmczJfeGF0dHJfZW50cnkpOwogCW1lbWNweSh0YXJnZXQgKyBvZmZzZXQsIChjaGFyICopeGJfeGggKyBvZmZzZXQsIHNpemUpOwpAQCAtMjYxNCw3MyArMzM2OSw0NyBAQAogICogV2hpbGUgaWYgdGhlIGVudHJ5IGlzIGluIGluZGV4IGItdHJlZSwgImJ1Y2tldCIgaW5kaWNhdGVzIHRoZQogICogcmVhbCBwbGFjZSBvZiB0aGUgeGF0dHIuCiAgKi8KLXN0YXRpYyBpbnQgb2NmczJfeGF0dHJfdXBkYXRlX3hhdHRyX3NlYXJjaChzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCQkJCQkgICBzdHJ1Y3Qgb2NmczJfeGF0dHJfc2VhcmNoICp4cywKLQkJCQkJICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpvbGRfYmgsCi0JCQkJCSAgIHN0cnVjdCBidWZmZXJfaGVhZCAqbmV3X2JoKQorc3RhdGljIHZvaWQgb2NmczJfeGF0dHJfdXBkYXRlX3hhdHRyX3NlYXJjaChzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCQkgICAgc3RydWN0IG9jZnMyX3hhdHRyX3NlYXJjaCAqeHMsCisJCQkJCSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKm9sZF9iaCkKIHsKLQlpbnQgcmV0ID0gMDsKIAljaGFyICpidWYgPSBvbGRfYmgtPmJfZGF0YTsKIAlzdHJ1Y3Qgb2NmczJfeGF0dHJfYmxvY2sgKm9sZF94YiA9IChzdHJ1Y3Qgb2NmczJfeGF0dHJfYmxvY2sgKilidWY7CiAJc3RydWN0IG9jZnMyX3hhdHRyX2hlYWRlciAqb2xkX3hoID0gJm9sZF94Yi0+eGJfYXR0cnMueGJfaGVhZGVyOwotCWludCBpLCBibG9ja3NpemUgPSBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemU7Ci0JdTE2IGJsa19wZXJfYnVja2V0ID0gb2NmczJfYmxvY2tzX3Blcl94YXR0cl9idWNrZXQoaW5vZGUtPmlfc2IpOworCWludCBpOwogCi0JeHMtPmJ1Y2tldC5iaHNbMF0gPSBuZXdfYmg7Ci0JZ2V0X2JoKG5ld19iaCk7Ci0JeHMtPmJ1Y2tldC54aCA9IChzdHJ1Y3Qgb2NmczJfeGF0dHJfaGVhZGVyICopeHMtPmJ1Y2tldC5iaHNbMF0tPmJfZGF0YTsKLQl4cy0+aGVhZGVyID0geHMtPmJ1Y2tldC54aDsKLQotCXhzLT5iYXNlID0gbmV3X2JoLT5iX2RhdGE7CisJeHMtPmhlYWRlciA9IGJ1Y2tldF94aCh4cy0+YnVja2V0KTsKKwl4cy0+YmFzZSA9IGJ1Y2tldF9ibG9jayh4cy0+YnVja2V0LCAwKTsKIAl4cy0+ZW5kID0geHMtPmJhc2UgKyBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemU7CiAKLQlpZiAoIXhzLT5ub3RfZm91bmQpIHsKLQkJaWYgKE9DRlMyX1hBVFRSX0JVQ0tFVF9TSVpFICE9IGJsb2Nrc2l6ZSkgewotCQkJcmV0ID0gb2NmczJfcmVhZF9ibG9ja3MoaW5vZGUsCi0JCQkJCXhzLT5idWNrZXQuYmhzWzBdLT5iX2Jsb2NrbnIgKyAxLAotCQkJCQlibGtfcGVyX2J1Y2tldCAtIDEsICZ4cy0+YnVja2V0LmJoc1sxXSwKLQkJCQkJMCk7Ci0JCQlpZiAocmV0KSB7Ci0JCQkJbWxvZ19lcnJubyhyZXQpOwotCQkJCXJldHVybiByZXQ7Ci0JCQl9CisJaWYgKHhzLT5ub3RfZm91bmQpCisJCXJldHVybjsKIAotCQl9Ci0JCWkgPSB4cy0+aGVyZSAtIG9sZF94aC0+eGhfZW50cmllczsKLQkJeHMtPmhlcmUgPSAmeHMtPmhlYWRlci0+eGhfZW50cmllc1tpXTsKLQl9Ci0KLQlyZXR1cm4gcmV0OworCWkgPSB4cy0+aGVyZSAtIG9sZF94aC0+eGhfZW50cmllczsKKwl4cy0+aGVyZSA9ICZ4cy0+aGVhZGVyLT54aF9lbnRyaWVzW2ldOwogfQogCiBzdGF0aWMgaW50IG9jZnMyX3hhdHRyX2NyZWF0ZV9pbmRleF9ibG9jayhzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCQkJCQkgIHN0cnVjdCBvY2ZzMl94YXR0cl9zZWFyY2ggKnhzKQorCQkJCQkgIHN0cnVjdCBvY2ZzMl94YXR0cl9zZWFyY2ggKnhzLAorCQkJCQkgIHN0cnVjdCBvY2ZzMl94YXR0cl9zZXRfY3R4dCAqY3R4dCkKIHsKLQlpbnQgcmV0LCBjcmVkaXRzID0gT0NGUzJfU1VCQUxMT0NfQUxMT0M7CisJaW50IHJldDsKIAl1MzIgYml0X29mZiwgbGVuOwogCXU2NCBibGtubzsKLQloYW5kbGVfdCAqaGFuZGxlOworCWhhbmRsZV90ICpoYW5kbGUgPSBjdHh0LT5oYW5kbGU7CiAJc3RydWN0IG9jZnMyX3N1cGVyICpvc2IgPSBPQ0ZTMl9TQihpbm9kZS0+aV9zYik7CiAJc3RydWN0IG9jZnMyX2lub2RlX2luZm8gKm9pID0gT0NGUzJfSShpbm9kZSk7Ci0Jc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKmRhdGFfYWM7Ci0Jc3RydWN0IGJ1ZmZlcl9oZWFkICp4aF9iaCA9IE5VTEwsICpkYXRhX2JoID0gTlVMTDsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKnhiX2JoID0geHMtPnhhdHRyX2JoOwogCXN0cnVjdCBvY2ZzMl94YXR0cl9ibG9jayAqeGIgPQogCQkJKHN0cnVjdCBvY2ZzMl94YXR0cl9ibG9jayAqKXhiX2JoLT5iX2RhdGE7CiAJc3RydWN0IG9jZnMyX3hhdHRyX3RyZWVfcm9vdCAqeHI7CiAJdTE2IHhiX2ZsYWdzID0gbGUxNl90b19jcHUoeGItPnhiX2ZsYWdzKTsKLQl1MTYgYnBiID0gb2NmczJfYmxvY2tzX3Blcl94YXR0cl9idWNrZXQoaW5vZGUtPmlfc2IpOwogCiAJbWxvZygwLCAiY3JlYXRlIHhhdHRyIGluZGV4IGJsb2NrIGZvciAlbGx1XG4iLAogCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyl4Yl9iaC0+Yl9ibG9ja25yKTsKIAogCUJVR19PTih4Yl9mbGFncyAmIE9DRlMyX1hBVFRSX0lOREVYRUQpOwotCi0JcmV0ID0gb2NmczJfcmVzZXJ2ZV9jbHVzdGVycyhvc2IsIDEsICZkYXRhX2FjKTsKLQlpZiAocmV0KSB7Ci0JCW1sb2dfZXJybm8ocmV0KTsKLQkJZ290byBvdXQ7Ci0JfQorCUJVR19PTigheHMtPmJ1Y2tldCk7CiAKIAkvKgogCSAqIFhYWDoKQEAgLTI2ODksMjkgKzM0MTgsMTggQEAKIAkgKi8KIAlkb3duX3dyaXRlKCZvaS0+aXBfYWxsb2Nfc2VtKTsKIAotCS8qCi0JICogMyBtb3JlIGNyZWRpdHMsIG9uZSBmb3IgeGF0dHIgYmxvY2sgdXBkYXRlLCBvbmUgZm9yIHRoZSAxc3QgYmxvY2sKLQkgKiBvZiB0aGUgbmV3IHhhdHRyIGJ1Y2tldCBhbmQgb25lIGZvciB0aGUgdmFsdWUvZGF0YS4KLQkgKi8KLQljcmVkaXRzICs9IDM7Ci0JaGFuZGxlID0gb2NmczJfc3RhcnRfdHJhbnMob3NiLCBjcmVkaXRzKTsKLQlpZiAoSVNfRVJSKGhhbmRsZSkpIHsKLQkJcmV0ID0gUFRSX0VSUihoYW5kbGUpOwotCQltbG9nX2Vycm5vKHJldCk7Ci0JCWdvdG8gb3V0X3NlbTsKLQl9Ci0KLQlyZXQgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGlub2RlLCB4Yl9iaCwKLQkJCQkgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CisJcmV0ID0gb2NmczJfam91cm5hbF9hY2Nlc3NfeGIoaGFuZGxlLCBpbm9kZSwgeGJfYmgsCisJCQkJICAgICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOwogCWlmIChyZXQpIHsKIAkJbWxvZ19lcnJubyhyZXQpOwotCQlnb3RvIG91dF9jb21taXQ7CisJCWdvdG8gb3V0OwogCX0KIAotCXJldCA9IG9jZnMyX2NsYWltX2NsdXN0ZXJzKG9zYiwgaGFuZGxlLCBkYXRhX2FjLCAxLCAmYml0X29mZiwgJmxlbik7CisJcmV0ID0gX19vY2ZzMl9jbGFpbV9jbHVzdGVycyhvc2IsIGhhbmRsZSwgY3R4dC0+ZGF0YV9hYywKKwkJCQkgICAgIDEsIDEsICZiaXRfb2ZmLCAmbGVuKTsKIAlpZiAocmV0KSB7CiAJCW1sb2dfZXJybm8ocmV0KTsKLQkJZ290byBvdXRfY29tbWl0OworCQlnb3RvIG91dDsKIAl9CiAKIAkvKgpAQCAtMjcyNCw1MiArMzQ0MiwyNCBAQAogCW1sb2coMCwgImFsbG9jYXRlIDEgY2x1c3RlciBmcm9tICVsbHUgdG8geGF0dHIgYmxvY2tcbiIsCiAJICAgICAodW5zaWduZWQgbG9uZyBsb25nKWJsa25vKTsKIAotCXhoX2JoID0gc2JfZ2V0YmxrKGlub2RlLT5pX3NiLCBibGtubyk7Ci0JaWYgKCF4aF9iaCkgewotCQlyZXQgPSAtRUlPOwotCQltbG9nX2Vycm5vKHJldCk7Ci0JCWdvdG8gb3V0X2NvbW1pdDsKLQl9Ci0KLQlvY2ZzMl9zZXRfbmV3X2J1ZmZlcl91cHRvZGF0ZShpbm9kZSwgeGhfYmgpOwotCi0JcmV0ID0gb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwgeGhfYmgsCi0JCQkJICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfQ1JFQVRFKTsKKwlyZXQgPSBvY2ZzMl9pbml0X3hhdHRyX2J1Y2tldCh4cy0+YnVja2V0LCBibGtubyk7CiAJaWYgKHJldCkgewogCQltbG9nX2Vycm5vKHJldCk7Ci0JCWdvdG8gb3V0X2NvbW1pdDsKKwkJZ290byBvdXQ7CiAJfQogCi0JaWYgKGJwYiA+IDEpIHsKLQkJZGF0YV9iaCA9IHNiX2dldGJsayhpbm9kZS0+aV9zYiwgYmxrbm8gKyBicGIgLSAxKTsKLQkJaWYgKCFkYXRhX2JoKSB7Ci0JCQlyZXQgPSAtRUlPOwotCQkJbWxvZ19lcnJubyhyZXQpOwotCQkJZ290byBvdXRfY29tbWl0OwotCQl9Ci0KLQkJb2NmczJfc2V0X25ld19idWZmZXJfdXB0b2RhdGUoaW5vZGUsIGRhdGFfYmgpOwotCi0JCXJldCA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgaW5vZGUsIGRhdGFfYmgsCi0JCQkJCSAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX0NSRUFURSk7Ci0JCWlmIChyZXQpIHsKLQkJCW1sb2dfZXJybm8ocmV0KTsKLQkJCWdvdG8gb3V0X2NvbW1pdDsKLQkJfQotCX0KLQotCW9jZnMyX2NwX3hhdHRyX2Jsb2NrX3RvX2J1Y2tldChpbm9kZSwgeGJfYmgsIHhoX2JoLCBkYXRhX2JoKTsKLQotCW9jZnMyX2pvdXJuYWxfZGlydHkoaGFuZGxlLCB4aF9iaCk7Ci0JaWYgKGRhdGFfYmgpCi0JCW9jZnMyX2pvdXJuYWxfZGlydHkoaGFuZGxlLCBkYXRhX2JoKTsKLQotCXJldCA9IG9jZnMyX3hhdHRyX3VwZGF0ZV94YXR0cl9zZWFyY2goaW5vZGUsIHhzLCB4Yl9iaCwgeGhfYmgpOworCXJldCA9IG9jZnMyX3hhdHRyX2J1Y2tldF9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIHhzLT5idWNrZXQsCisJCQkJCQlPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19DUkVBVEUpOwogCWlmIChyZXQpIHsKIAkJbWxvZ19lcnJubyhyZXQpOwotCQlnb3RvIG91dF9jb21taXQ7CisJCWdvdG8gb3V0OwogCX0KIAorCW9jZnMyX2NwX3hhdHRyX2Jsb2NrX3RvX2J1Y2tldChpbm9kZSwgeGJfYmgsIHhzLT5idWNrZXQpOworCW9jZnMyX3hhdHRyX2J1Y2tldF9qb3VybmFsX2RpcnR5KGhhbmRsZSwgeHMtPmJ1Y2tldCk7CisKKwlvY2ZzMl94YXR0cl91cGRhdGVfeGF0dHJfc2VhcmNoKGlub2RlLCB4cywgeGJfYmgpOworCiAJLyogQ2hhbmdlIGZyb20gb2NmczJfeGF0dHJfaGVhZGVyIHRvIG9jZnMyX3hhdHRyX3RyZWVfcm9vdCAqLwogCW1lbXNldCgmeGItPnhiX2F0dHJzLCAwLCBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgLQogCSAgICAgICBvZmZzZXRvZihzdHJ1Y3Qgb2NmczJfeGF0dHJfYmxvY2ssIHhiX2F0dHJzKSk7CkBAIC0yNzg3LDI0ICszNDc3LDEwIEBACiAKIAl4Yi0+eGJfZmxhZ3MgPSBjcHVfdG9fbGUxNih4Yl9mbGFncyB8IE9DRlMyX1hBVFRSX0lOREVYRUQpOwogCi0JcmV0ID0gb2NmczJfam91cm5hbF9kaXJ0eShoYW5kbGUsIHhiX2JoKTsKLQlpZiAocmV0KSB7Ci0JCW1sb2dfZXJybm8ocmV0KTsKLQkJZ290byBvdXRfY29tbWl0OwotCX0KLQotb3V0X2NvbW1pdDoKLQlvY2ZzMl9jb21taXRfdHJhbnMob3NiLCBoYW5kbGUpOwotCi1vdXRfc2VtOgotCXVwX3dyaXRlKCZvaS0+aXBfYWxsb2Nfc2VtKTsKKwlvY2ZzMl9qb3VybmFsX2RpcnR5KGhhbmRsZSwgeGJfYmgpOwogCiBvdXQ6Ci0JaWYgKGRhdGFfYWMpCi0JCW9jZnMyX2ZyZWVfYWxsb2NfY29udGV4dChkYXRhX2FjKTsKLQotCWJyZWxzZSh4aF9iaCk7Ci0JYnJlbHNlKGRhdGFfYmgpOworCXVwX3dyaXRlKCZvaS0+aXBfYWxsb2Nfc2VtKTsKIAogCXJldHVybiByZXQ7CiB9CkBAIC0yODI5LDI5ICszNTA1LDE4IEBACiAgKiBzbyB0aGF0IHdlIGNhbiBzcGFyZSBzb21lIHNwYWNlIGZvciBpbnNlcnRpb24uCiAgKi8KIHN0YXRpYyBpbnQgb2NmczJfZGVmcmFnX3hhdHRyX2J1Y2tldChzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCSAgICAgaGFuZGxlX3QgKmhhbmRsZSwKIAkJCQkgICAgIHN0cnVjdCBvY2ZzMl94YXR0cl9idWNrZXQgKmJ1Y2tldCkKIHsKIAlpbnQgcmV0LCBpOwogCXNpemVfdCBlbmQsIG9mZnNldCwgbGVuLCB2YWx1ZV9sZW47CiAJc3RydWN0IG9jZnMyX3hhdHRyX2hlYWRlciAqeGg7CiAJY2hhciAqZW50cmllcywgKmJ1ZiwgKmJ1Y2tldF9idWYgPSBOVUxMOwotCXU2NCBibGtubyA9IGJ1Y2tldC0+YmhzWzBdLT5iX2Jsb2NrbnI7Ci0JdTE2IGJsa19wZXJfYnVja2V0ID0gb2NmczJfYmxvY2tzX3Blcl94YXR0cl9idWNrZXQoaW5vZGUtPmlfc2IpOworCXU2NCBibGtubyA9IGJ1Y2tldF9ibGtubyhidWNrZXQpOwogCXUxNiB4aF9mcmVlX3N0YXJ0OwogCXNpemVfdCBibG9ja3NpemUgPSBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemU7Ci0JaGFuZGxlX3QgKmhhbmRsZTsKLQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKipiaHM7CiAJc3RydWN0IG9jZnMyX3hhdHRyX2VudHJ5ICp4ZTsKIAotCWJocyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBidWZmZXJfaGVhZCAqKSAqIGJsa19wZXJfYnVja2V0LAotCQkJR0ZQX05PRlMpOwotCWlmICghYmhzKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXJldCA9IG9jZnMyX3JlYWRfYmxvY2tzKGlub2RlLCBibGtubywgYmxrX3Blcl9idWNrZXQsIGJocywgMCk7Ci0JaWYgKHJldCkKLQkJZ290byBvdXQ7Ci0KIAkvKgogCSAqIEluIG9yZGVyIHRvIG1ha2UgdGhlIG9wZXJhdGlvbiBtb3JlIGVmZmljaWVudCBhbmQgZ2VuZXJpYywKIAkgKiB3ZSBjb3B5IGFsbCB0aGUgYmxvY2tzIGludG8gYSBjb250aWd1b3VzIG1lbW9yeSBhbmQgZG8gdGhlCkBAIC0yODY1LDI2ICszNTMwLDE2IEBACiAJfQogCiAJYnVmID0gYnVja2V0X2J1ZjsKLQlmb3IgKGkgPSAwOyBpIDwgYmxrX3Blcl9idWNrZXQ7IGkrKywgYnVmICs9IGJsb2Nrc2l6ZSkKLQkJbWVtY3B5KGJ1ZiwgYmhzW2ldLT5iX2RhdGEsIGJsb2Nrc2l6ZSk7CisJZm9yIChpID0gMDsgaSA8IGJ1Y2tldC0+YnVfYmxvY2tzOyBpKyssIGJ1ZiArPSBibG9ja3NpemUpCisJCW1lbWNweShidWYsIGJ1Y2tldF9ibG9jayhidWNrZXQsIGkpLCBibG9ja3NpemUpOwogCi0JaGFuZGxlID0gb2NmczJfc3RhcnRfdHJhbnMoKE9DRlMyX1NCKGlub2RlLT5pX3NiKSksIGJsa19wZXJfYnVja2V0KTsKLQlpZiAoSVNfRVJSKGhhbmRsZSkpIHsKLQkJcmV0ID0gUFRSX0VSUihoYW5kbGUpOwotCQloYW5kbGUgPSBOVUxMOworCXJldCA9IG9jZnMyX3hhdHRyX2J1Y2tldF9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGJ1Y2tldCwKKwkJCQkJCU9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKKwlpZiAocmV0IDwgMCkgewogCQltbG9nX2Vycm5vKHJldCk7CiAJCWdvdG8gb3V0OwogCX0KIAotCWZvciAoaSA9IDA7IGkgPCBibGtfcGVyX2J1Y2tldDsgaSsrKSB7Ci0JCXJldCA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgaW5vZGUsIGJoc1tpXSwKLQkJCQkJICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOwotCQlpZiAocmV0IDwgMCkgewotCQkJbWxvZ19lcnJubyhyZXQpOwotCQkJZ290byBjb21taXQ7Ci0JCX0KLQl9Ci0KIAl4aCA9IChzdHJ1Y3Qgb2NmczJfeGF0dHJfaGVhZGVyICopYnVja2V0X2J1ZjsKIAllbnRyaWVzID0gKGNoYXIgKil4aC0+eGhfZW50cmllczsKIAl4aF9mcmVlX3N0YXJ0ID0gbGUxNl90b19jcHUoeGgtPnhoX2ZyZWVfc3RhcnQpOwpAQCAtMjk0MCw3ICszNTk1LDcgQEAKIAkJCSJidWNrZXQgJWxsdVxuIiwgKHVuc2lnbmVkIGxvbmcgbG9uZylibGtubyk7CiAKIAlpZiAoeGhfZnJlZV9zdGFydCA9PSBlbmQpCi0JCWdvdG8gY29tbWl0OworCQlnb3RvIG91dDsKIAogCW1lbXNldChidWNrZXRfYnVmICsgeGhfZnJlZV9zdGFydCwgMCwgZW5kIC0geGhfZnJlZV9zdGFydCk7CiAJeGgtPnhoX2ZyZWVfc3RhcnQgPSBjcHVfdG9fbGUxNihlbmQpOwpAQCAtMjk1MSwxNjkgKzM2MDYsOTQgQEAKIAkgICAgIGNtcF94ZSwgc3dhcF94ZSk7CiAKIAlidWYgPSBidWNrZXRfYnVmOwotCWZvciAoaSA9IDA7IGkgPCBibGtfcGVyX2J1Y2tldDsgaSsrLCBidWYgKz0gYmxvY2tzaXplKSB7Ci0JCW1lbWNweShiaHNbaV0tPmJfZGF0YSwgYnVmLCBibG9ja3NpemUpOwotCQlvY2ZzMl9qb3VybmFsX2RpcnR5KGhhbmRsZSwgYmhzW2ldKTsKLQl9CisJZm9yIChpID0gMDsgaSA8IGJ1Y2tldC0+YnVfYmxvY2tzOyBpKyssIGJ1ZiArPSBibG9ja3NpemUpCisJCW1lbWNweShidWNrZXRfYmxvY2soYnVja2V0LCBpKSwgYnVmLCBibG9ja3NpemUpOworCW9jZnMyX3hhdHRyX2J1Y2tldF9qb3VybmFsX2RpcnR5KGhhbmRsZSwgYnVja2V0KTsKIAotY29tbWl0OgotCW9jZnMyX2NvbW1pdF90cmFucyhPQ0ZTMl9TQihpbm9kZS0+aV9zYiksIGhhbmRsZSk7CiBvdXQ6Ci0KLQlpZiAoYmhzKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBibGtfcGVyX2J1Y2tldDsgaSsrKQotCQkJYnJlbHNlKGJoc1tpXSk7Ci0JfQotCWtmcmVlKGJocyk7Ci0KIAlrZnJlZShidWNrZXRfYnVmKTsKIAlyZXR1cm4gcmV0OwogfQogCiAvKgotICogTW92ZSBoYWxmIG51bXMgb2YgdGhlIHhhdHRyIGJ1Y2tldCBpbiB0aGUgcHJldmlvdXMgY2x1c3RlciB0byB0aGlzIG5ldwotICogY2x1c3Rlci4gV2Ugb25seSB0b3VjaCB0aGUgbGFzdCBjbHVzdGVyIG9mIHRoZSBwcmV2aW91cyBleHRlbmQgcmVjb3JkLgorICogcHJldl9ibGtubyBwb2ludHMgdG8gdGhlIHN0YXJ0IG9mIGFuIGV4aXN0aW5nIGV4dGVudC4gIG5ld19ibGtubworICogcG9pbnRzIHRvIGEgbmV3bHkgYWxsb2NhdGVkIGV4dGVudC4gIEJlY2F1c2Ugd2Uga25vdyBlYWNoIG9mIG91cgorICogY2x1c3RlcnMgY29udGFpbnMgbW9yZSB0aGFuIGJ1Y2tldCwgd2UgY2FuIGVhc2lseSBzcGxpdCBvbmUgY2x1c3RlcgorICogYXQgYSBidWNrZXQgYm91bmRhcnkuICBTbyB3ZSB0YWtlIHRoZSBsYXN0IGNsdXN0ZXIgb2YgdGhlIGV4aXN0aW5nCisgKiBleHRlbnQgYW5kIHNwbGl0IGl0IGRvd24gdGhlIG1pZGRsZS4gIFdlIG1vdmUgdGhlIGxhc3QgaGFsZiBvZiB0aGUKKyAqIGJ1Y2tldHMgaW4gdGhlIGxhc3QgY2x1c3RlciBvZiB0aGUgZXhpc3RpbmcgZXh0ZW50IG92ZXIgdG8gdGhlIG5ldworICogZXh0ZW50LgogICoKLSAqIGZpcnN0X2JoIGlzIHRoZSBmaXJzdCBidWZmZXJfaGVhZCBvZiBhIHNlcmllcyBvZiBidWNrZXQgaW4gdGhlIHNhbWUKLSAqIGV4dGVudCByZWMgYW5kIGhlYWRlcl9iaCBpcyB0aGUgaGVhZGVyIG9mIG9uZSBidWNrZXQgaW4gdGhpcyBjbHVzdGVyLgotICogVGhleSB3aWxsIGJlIHVwZGF0ZWQgaWYgd2UgbW92ZSB0aGUgZGF0YSBoZWFkZXJfYmggY29udGFpbnMgdG8gdGhlIG5ldwotICogY2x1c3Rlci4gZmlyc3RfaGFzaCB3aWxsIGJlIHNldCBhcyB0aGUgMXN0IHhlJ3MgbmFtZV9oYXNoIG9mIHRoZSBuZXcgY2x1c3Rlci4KKyAqIGZpcnN0X2JoIGlzIHRoZSBidWZmZXIgYXQgcHJldl9ibGtubyBzbyB3ZSBjYW4gdXBkYXRlIHRoZSBleGlzdGluZworICogZXh0ZW50J3MgYnVja2V0IGNvdW50LiAgaGVhZGVyX2JoIGlzIHRoZSBidWNrZXQgd2VyZSB3ZSB3ZXJlIGhvcGluZworICogdG8gaW5zZXJ0IG91ciB4YXR0ci4gIElmIHRoZSBidWNrZXQgbW92ZSBwbGFjZXMgdGhlIHRhcmdldCBpbiB0aGUgbmV3CisgKiBleHRlbnQsIHdlJ2xsIHVwZGF0ZSBmaXJzdF9iaCBhbmQgaGVhZGVyX2JoIGFmdGVyIG1vZGlmeWluZyB0aGUgb2xkCisgKiBleHRlbnQuCisgKgorICogZmlyc3RfaGFzaCB3aWxsIGJlIHNldCBhcyB0aGUgMXN0IHhlJ3MgbmFtZV9oYXNoIGluIHRoZSBuZXcgZXh0ZW50LgogICovCiBzdGF0aWMgaW50IG9jZnMyX212X3hhdHRyX2J1Y2tldF9jcm9zc19jbHVzdGVyKHN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJCQkJCSAgICAgICBoYW5kbGVfdCAqaGFuZGxlLAotCQkJCQkgICAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICoqZmlyc3RfYmgsCi0JCQkJCSAgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKipoZWFkZXJfYmgsCisJCQkJCSAgICAgICBzdHJ1Y3Qgb2NmczJfeGF0dHJfYnVja2V0ICpmaXJzdCwKKwkJCQkJICAgICAgIHN0cnVjdCBvY2ZzMl94YXR0cl9idWNrZXQgKnRhcmdldCwKIAkJCQkJICAgICAgIHU2NCBuZXdfYmxrbm8sCi0JCQkJCSAgICAgICB1NjQgcHJldl9ibGtubywKIAkJCQkJICAgICAgIHUzMiBudW1fY2x1c3RlcnMsCiAJCQkJCSAgICAgICB1MzIgKmZpcnN0X2hhc2gpCiB7Ci0JaW50IGksIHJldCwgY3JlZGl0czsKLQlzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiA9IE9DRlMyX1NCKGlub2RlLT5pX3NiKTsKLQlpbnQgYnBjID0gb2NmczJfY2x1c3RlcnNfdG9fYmxvY2tzKGlub2RlLT5pX3NiLCAxKTsKLQlpbnQgbnVtX2J1Y2tldHMgPSBvY2ZzMl94YXR0cl9idWNrZXRzX3Blcl9jbHVzdGVyKG9zYik7Ci0JaW50IGJsb2Nrc2l6ZSA9IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZTsKLQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKm9sZF9iaCwgKm5ld19iaCwgKnByZXZfYmgsICpuZXdfZmlyc3RfYmggPSBOVUxMOwotCXN0cnVjdCBvY2ZzMl94YXR0cl9oZWFkZXIgKm5ld194aDsKLQlzdHJ1Y3Qgb2NmczJfeGF0dHJfaGVhZGVyICp4aCA9Ci0JCQkoc3RydWN0IG9jZnMyX3hhdHRyX2hlYWRlciAqKSgoKmZpcnN0X2JoKS0+Yl9kYXRhKTsKKwlpbnQgcmV0OworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS0+aV9zYjsKKwlpbnQgYmxrc19wZXJfYnVja2V0ID0gb2NmczJfYmxvY2tzX3Blcl94YXR0cl9idWNrZXQoc2IpOworCWludCBudW1fYnVja2V0cyA9IG9jZnMyX3hhdHRyX2J1Y2tldHNfcGVyX2NsdXN0ZXIoT0NGUzJfU0Ioc2IpKTsKKwlpbnQgdG9fbW92ZSA9IG51bV9idWNrZXRzIC8gMjsKKwl1NjQgc3JjX2Jsa25vOworCXU2NCBsYXN0X2NsdXN0ZXJfYmxrbm8gPSBidWNrZXRfYmxrbm8oZmlyc3QpICsKKwkJKChudW1fY2x1c3RlcnMgLSAxKSAqIG9jZnMyX2NsdXN0ZXJzX3RvX2Jsb2NrcyhzYiwgMSkpOwogCi0JQlVHX09OKGxlMTZfdG9fY3B1KHhoLT54aF9udW1fYnVja2V0cykgPCBudW1fYnVja2V0cyk7Ci0JQlVHX09OKE9DRlMyX1hBVFRSX0JVQ0tFVF9TSVpFID09IG9zYi0+c19jbHVzdGVyc2l6ZSk7Ci0KLQlwcmV2X2JoID0gKmZpcnN0X2JoOwotCWdldF9iaChwcmV2X2JoKTsKLQl4aCA9IChzdHJ1Y3Qgb2NmczJfeGF0dHJfaGVhZGVyICopcHJldl9iaC0+Yl9kYXRhOwotCi0JcHJldl9ibGtubyArPSAobnVtX2NsdXN0ZXJzIC0gMSkgKiBicGMgKyBicGMgLyAyOworCUJVR19PTihsZTE2X3RvX2NwdShidWNrZXRfeGgoZmlyc3QpLT54aF9udW1fYnVja2V0cykgPCBudW1fYnVja2V0cyk7CisJQlVHX09OKE9DRlMyX1hBVFRSX0JVQ0tFVF9TSVpFID09IE9DRlMyX1NCKHNiKS0+c19jbHVzdGVyc2l6ZSk7CiAKIAltbG9nKDAsICJtb3ZlIGhhbGYgb2YgeGF0dHJzIGluIGNsdXN0ZXIgJWxsdSB0byAlbGx1XG4iLAotCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylwcmV2X2Jsa25vLCAodW5zaWduZWQgbG9uZyBsb25nKW5ld19ibGtubyk7CisJICAgICAodW5zaWduZWQgbG9uZyBsb25nKWxhc3RfY2x1c3Rlcl9ibGtubywgKHVuc2lnbmVkIGxvbmcgbG9uZyluZXdfYmxrbm8pOworCisJcmV0ID0gb2NmczJfbXZfeGF0dHJfYnVja2V0cyhpbm9kZSwgaGFuZGxlLCBidWNrZXRfYmxrbm8oZmlyc3QpLAorCQkJCSAgICAgbGFzdF9jbHVzdGVyX2Jsa25vLCBuZXdfYmxrbm8sCisJCQkJICAgICB0b19tb3ZlLCBmaXJzdF9oYXNoKTsKKwlpZiAocmV0KSB7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXQ7CisJfQorCisJLyogVGhpcyBpcyB0aGUgZmlyc3QgYnVja2V0IHRoYXQgZ290IG1vdmVkICovCisJc3JjX2Jsa25vID0gbGFzdF9jbHVzdGVyX2Jsa25vICsgKHRvX21vdmUgKiBibGtzX3Blcl9idWNrZXQpOwogCiAJLyoKLQkgKiBXZSBuZWVkIHRvIHVwZGF0ZSB0aGUgMXN0IGhhbGYgb2YgdGhlIG5ldyBjbHVzdGVyIGFuZAotCSAqIDEgbW9yZSBmb3IgdGhlIHVwZGF0ZSBvZiB0aGUgMXN0IGJ1Y2tldCBvZiB0aGUgcHJldmlvdXMKLQkgKiBleHRlbnQgcmVjb3JkLgorCSAqIElmIHRoZSB0YXJnZXQgYnVja2V0IHdhcyBwYXJ0IG9mIHRoZSBtb3ZlZCBidWNrZXRzLCB3ZSBuZWVkIHRvCisJICogdXBkYXRlIGZpcnN0IGFuZCB0YXJnZXQuCiAJICovCi0JY3JlZGl0cyA9IGJwYyAvIDIgKyAxOwotCXJldCA9IG9jZnMyX2V4dGVuZF90cmFucyhoYW5kbGUsIGNyZWRpdHMpOwotCWlmIChyZXQpIHsKLQkJbWxvZ19lcnJubyhyZXQpOwotCQlnb3RvIG91dDsKLQl9CisJaWYgKGJ1Y2tldF9ibGtubyh0YXJnZXQpID49IHNyY19ibGtubykgeworCQkvKiBGaW5kIHRoZSBibG9jayBmb3IgdGhlIG5ldyB0YXJnZXQgYnVja2V0ICovCisJCXNyY19ibGtubyA9IG5ld19ibGtubyArCisJCQkoYnVja2V0X2Jsa25vKHRhcmdldCkgLSBzcmNfYmxrbm8pOwogCi0JcmV0ID0gb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwgcHJldl9iaCwKLQkJCQkgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7Ci0JaWYgKHJldCkgewotCQltbG9nX2Vycm5vKHJldCk7Ci0JCWdvdG8gb3V0OwotCX0KKwkJb2NmczJfeGF0dHJfYnVja2V0X3JlbHNlKGZpcnN0KTsKKwkJb2NmczJfeGF0dHJfYnVja2V0X3JlbHNlKHRhcmdldCk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgYnBjIC8gMjsgaSsrLCBwcmV2X2Jsa25vKyssIG5ld19ibGtubysrKSB7Ci0JCW9sZF9iaCA9IG5ld19iaCA9IE5VTEw7Ci0JCW5ld19iaCA9IHNiX2dldGJsayhpbm9kZS0+aV9zYiwgbmV3X2Jsa25vKTsKLQkJaWYgKCFuZXdfYmgpIHsKLQkJCXJldCA9IC1FSU87CisJCS8qCisJCSAqIFRoZXNlIHNob3VsZG4ndCBmYWlsIC0gdGhlIGJ1ZmZlcnMgYXJlIGluIHRoZQorCQkgKiBqb3VybmFsIGZyb20gb2NmczJfY3BfeGF0dHJfYnVja2V0KCkuCisJCSAqLworCQlyZXQgPSBvY2ZzMl9yZWFkX3hhdHRyX2J1Y2tldChmaXJzdCwgbmV3X2Jsa25vKTsKKwkJaWYgKHJldCkgewogCQkJbWxvZ19lcnJubyhyZXQpOwogCQkJZ290byBvdXQ7CiAJCX0KLQotCQlvY2ZzMl9zZXRfbmV3X2J1ZmZlcl91cHRvZGF0ZShpbm9kZSwgbmV3X2JoKTsKLQotCQlyZXQgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGlub2RlLCBuZXdfYmgsCi0JCQkJCSAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX0NSRUFURSk7Ci0JCWlmIChyZXQgPCAwKSB7CisJCXJldCA9IG9jZnMyX3JlYWRfeGF0dHJfYnVja2V0KHRhcmdldCwgc3JjX2Jsa25vKTsKKwkJaWYgKHJldCkKIAkJCW1sb2dfZXJybm8ocmV0KTsKLQkJCWJyZWxzZShuZXdfYmgpOwotCQkJZ290byBvdXQ7Ci0JCX0KIAotCQlyZXQgPSBvY2ZzMl9yZWFkX2Jsb2NrKGlub2RlLCBwcmV2X2Jsa25vLCAmb2xkX2JoKTsKLQkJaWYgKHJldCA8IDApIHsKLQkJCW1sb2dfZXJybm8ocmV0KTsKLQkJCWJyZWxzZShuZXdfYmgpOwotCQkJZ290byBvdXQ7Ci0JCX0KLQotCQltZW1jcHkobmV3X2JoLT5iX2RhdGEsIG9sZF9iaC0+Yl9kYXRhLCBibG9ja3NpemUpOwotCi0JCWlmIChpID09IDApIHsKLQkJCW5ld194aCA9IChzdHJ1Y3Qgb2NmczJfeGF0dHJfaGVhZGVyICopbmV3X2JoLT5iX2RhdGE7Ci0JCQluZXdfeGgtPnhoX251bV9idWNrZXRzID0gY3B1X3RvX2xlMTYobnVtX2J1Y2tldHMgLyAyKTsKLQotCQkJaWYgKGZpcnN0X2hhc2gpCi0JCQkJKmZpcnN0X2hhc2ggPSBsZTMyX3RvX2NwdSgKLQkJCQkJbmV3X3hoLT54aF9lbnRyaWVzWzBdLnhlX25hbWVfaGFzaCk7Ci0JCQluZXdfZmlyc3RfYmggPSBuZXdfYmg7Ci0JCQlnZXRfYmgobmV3X2ZpcnN0X2JoKTsKLQkJfQotCi0JCW9jZnMyX2pvdXJuYWxfZGlydHkoaGFuZGxlLCBuZXdfYmgpOwotCi0JCWlmICgqaGVhZGVyX2JoID09IG9sZF9iaCkgewotCQkJYnJlbHNlKCpoZWFkZXJfYmgpOwotCQkJKmhlYWRlcl9iaCA9IG5ld19iaDsKLQkJCWdldF9iaCgqaGVhZGVyX2JoKTsKLQotCQkJYnJlbHNlKCpmaXJzdF9iaCk7Ci0JCQkqZmlyc3RfYmggPSBuZXdfZmlyc3RfYmg7Ci0JCQlnZXRfYmgoKmZpcnN0X2JoKTsKLQkJfQotCQlicmVsc2UobmV3X2JoKTsKLQkJYnJlbHNlKG9sZF9iaCk7CiAJfQogCi0JbGUxNl9hZGRfY3B1KCZ4aC0+eGhfbnVtX2J1Y2tldHMsIC0obnVtX2J1Y2tldHMgLyAyKSk7Ci0KLQlvY2ZzMl9qb3VybmFsX2RpcnR5KGhhbmRsZSwgcHJldl9iaCk7CiBvdXQ6Ci0JYnJlbHNlKHByZXZfYmgpOwotCWJyZWxzZShuZXdfZmlyc3RfYmgpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgb2NmczJfcmVhZF94YXR0cl9idWNrZXQoc3RydWN0IGlub2RlICppbm9kZSwKLQkJCQkgICB1NjQgYmxrbm8sCi0JCQkJICAgc3RydWN0IGJ1ZmZlcl9oZWFkICoqYmhzLAotCQkJCSAgIGludCBuZXcpCi17Ci0JaW50IHJldCA9IDA7Ci0JdTE2IGksIGJsa19wZXJfYnVja2V0ID0gb2NmczJfYmxvY2tzX3Blcl94YXR0cl9idWNrZXQoaW5vZGUtPmlfc2IpOwotCi0JaWYgKCFuZXcpCi0JCXJldHVybiBvY2ZzMl9yZWFkX2Jsb2Nrcyhpbm9kZSwgYmxrbm8sCi0JCQkJCSBibGtfcGVyX2J1Y2tldCwgYmhzLCAwKTsKLQotCWZvciAoaSA9IDA7IGkgPCBibGtfcGVyX2J1Y2tldDsgaSsrKSB7Ci0JCWJoc1tpXSA9IHNiX2dldGJsayhpbm9kZS0+aV9zYiwgYmxrbm8gKyBpKTsKLQkJaWYgKGJoc1tpXSA9PSBOVUxMKSB7Ci0JCQlyZXQgPSAtRUlPOwotCQkJbWxvZ19lcnJubyhyZXQpOwotCQkJYnJlYWs7Ci0JCX0KLQkJb2NmczJfc2V0X25ld19idWZmZXJfdXB0b2RhdGUoaW5vZGUsIGJoc1tpXSk7Ci0JfQotCiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMzE3OCw4ICszNzU4LDcgQEAKIHsKIAlpbnQgcmV0LCBpOwogCWludCBjb3VudCwgc3RhcnQsIGxlbiwgbmFtZV92YWx1ZV9sZW4gPSAwLCB4ZV9sZW4sIG5hbWVfb2Zmc2V0ID0gMDsKLQl1MTYgYmxrX3Blcl9idWNrZXQgPSBvY2ZzMl9ibG9ja3NfcGVyX3hhdHRyX2J1Y2tldChpbm9kZS0+aV9zYik7Ci0Jc3RydWN0IGJ1ZmZlcl9oZWFkICoqc19iaHMsICoqdF9iaHMgPSBOVUxMOworCXN0cnVjdCBvY2ZzMl94YXR0cl9idWNrZXQgKnNfYnVja2V0ID0gTlVMTCwgKnRfYnVja2V0ID0gTlVMTDsKIAlzdHJ1Y3Qgb2NmczJfeGF0dHJfaGVhZGVyICp4aDsKIAlzdHJ1Y3Qgb2NmczJfeGF0dHJfZW50cnkgKnhlOwogCWludCBibG9ja3NpemUgPSBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemU7CkBAIC0zMTg3LDQ3ICszNzY2LDUyIEBACiAJbWxvZygwLCAibW92ZSBzb21lIG9mIHhhdHRycyBmcm9tIGJ1Y2tldCAlbGx1IHRvICVsbHVcbiIsCiAJICAgICAodW5zaWduZWQgbG9uZyBsb25nKWJsaywgKHVuc2lnbmVkIGxvbmcgbG9uZyluZXdfYmxrKTsKIAotCXNfYmhzID0ga2NhbGxvYyhibGtfcGVyX2J1Y2tldCwgc2l6ZW9mKHN0cnVjdCBidWZmZXJfaGVhZCAqKSwgR0ZQX05PRlMpOwotCWlmICghc19iaHMpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JcmV0ID0gb2NmczJfcmVhZF94YXR0cl9idWNrZXQoaW5vZGUsIGJsaywgc19iaHMsIDApOwotCWlmIChyZXQpIHsKLQkJbWxvZ19lcnJubyhyZXQpOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlyZXQgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGlub2RlLCBzX2Joc1swXSwKLQkJCQkgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7Ci0JaWYgKHJldCkgewotCQltbG9nX2Vycm5vKHJldCk7Ci0JCWdvdG8gb3V0OwotCX0KLQotCXRfYmhzID0ga2NhbGxvYyhibGtfcGVyX2J1Y2tldCwgc2l6ZW9mKHN0cnVjdCBidWZmZXJfaGVhZCAqKSwgR0ZQX05PRlMpOwotCWlmICghdF9iaHMpIHsKKwlzX2J1Y2tldCA9IG9jZnMyX3hhdHRyX2J1Y2tldF9uZXcoaW5vZGUpOworCXRfYnVja2V0ID0gb2NmczJfeGF0dHJfYnVja2V0X25ldyhpbm9kZSk7CisJaWYgKCFzX2J1Y2tldCB8fCAhdF9idWNrZXQpIHsKIAkJcmV0ID0gLUVOT01FTTsKKwkJbWxvZ19lcnJubyhyZXQpOwogCQlnb3RvIG91dDsKIAl9CiAKLQlyZXQgPSBvY2ZzMl9yZWFkX3hhdHRyX2J1Y2tldChpbm9kZSwgbmV3X2JsaywgdF9iaHMsIG5ld19idWNrZXRfaGVhZCk7CisJcmV0ID0gb2NmczJfcmVhZF94YXR0cl9idWNrZXQoc19idWNrZXQsIGJsayk7CiAJaWYgKHJldCkgewogCQltbG9nX2Vycm5vKHJldCk7CiAJCWdvdG8gb3V0OwogCX0KIAotCWZvciAoaSA9IDA7IGkgPCBibGtfcGVyX2J1Y2tldDsgaSsrKSB7Ci0JCXJldCA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgaW5vZGUsIHRfYmhzW2ldLAotCQkJCQkgICBuZXdfYnVja2V0X2hlYWQgPwotCQkJCQkgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19DUkVBVEUgOgotCQkJCQkgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7Ci0JCWlmIChyZXQpIHsKLQkJCW1sb2dfZXJybm8ocmV0KTsKLQkJCWdvdG8gb3V0OwotCQl9CisJcmV0ID0gb2NmczJfeGF0dHJfYnVja2V0X2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgc19idWNrZXQsCisJCQkJCQlPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CisJaWYgKHJldCkgeworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0OwogCX0KIAotCXhoID0gKHN0cnVjdCBvY2ZzMl94YXR0cl9oZWFkZXIgKilzX2Joc1swXS0+Yl9kYXRhOworCS8qCisJICogRXZlbiBpZiAhbmV3X2J1Y2tldF9oZWFkLCB3ZSdyZSBvdmVyd3JpdGluZyB0X2J1Y2tldC4gIFRodXMsCisJICogdGhlcmUncyBubyBuZWVkIHRvIHJlYWQgaXQuCisJICovCisJcmV0ID0gb2NmczJfaW5pdF94YXR0cl9idWNrZXQodF9idWNrZXQsIG5ld19ibGspOworCWlmIChyZXQpIHsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dDsKKwl9CisKKwkvKgorCSAqIEhleSwgaWYgd2UncmUgb3ZlcndyaXRpbmcgdF9idWNrZXQsIHdoYXQgZGlmZmVyZW5jZSBkb2VzCisJICogQUNDRVNTX0NSRUFURSB2cyBBQ0NFU1NfV1JJVEUgbWFrZT8gIFNlZSB0aGUgY29tbWVudCBpbiB0aGUKKwkgKiBzYW1lIHBhcnQgb2Ygb2NmczJfY3BfeGF0dHJfYnVja2V0KCkuCisJICovCisJcmV0ID0gb2NmczJfeGF0dHJfYnVja2V0X2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgdF9idWNrZXQsCisJCQkJCQluZXdfYnVja2V0X2hlYWQgPworCQkJCQkJT0NGUzJfSk9VUk5BTF9BQ0NFU1NfQ1JFQVRFIDoKKwkJCQkJCU9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKKwlpZiAocmV0KSB7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXQ7CisJfQorCisJeGggPSBidWNrZXRfeGgoc19idWNrZXQpOwogCWNvdW50ID0gbGUxNl90b19jcHUoeGgtPnhoX2NvdW50KTsKIAlzdGFydCA9IG9jZnMyX3hhdHRyX2ZpbmRfZGl2aWRlX3Bvcyh4aCk7CiAKQEAgLTMyMzksMTAgKzM4MjMsMTAgQEAKIAkJICogVGhlIGhhc2ggdmFsdWUgaXMgc2V0IGFzIG9uZSBsYXJnZXIgdGhhbgogCQkgKiB0aGF0IG9mIHRoZSBsYXN0IGVudHJ5IGluIHRoZSBwcmV2aW91cyBidWNrZXQuCiAJCSAqLwotCQlmb3IgKGkgPSAwOyBpIDwgYmxrX3Blcl9idWNrZXQ7IGkrKykKLQkJCW1lbXNldCh0X2Joc1tpXS0+Yl9kYXRhLCAwLCBibG9ja3NpemUpOworCQlmb3IgKGkgPSAwOyBpIDwgdF9idWNrZXQtPmJ1X2Jsb2NrczsgaSsrKQorCQkJbWVtc2V0KGJ1Y2tldF9ibG9jayh0X2J1Y2tldCwgaSksIDAsIGJsb2Nrc2l6ZSk7CiAKLQkJeGggPSAoc3RydWN0IG9jZnMyX3hhdHRyX2hlYWRlciAqKXRfYmhzWzBdLT5iX2RhdGE7CisJCXhoID0gYnVja2V0X3hoKHRfYnVja2V0KTsKIAkJeGgtPnhoX2ZyZWVfc3RhcnQgPSBjcHVfdG9fbGUxNihibG9ja3NpemUpOwogCQl4aC0+eGhfZW50cmllc1swXS54ZV9uYW1lX2hhc2ggPSB4ZS0+eGVfbmFtZV9oYXNoOwogCQlsZTMyX2FkZF9jcHUoJnhoLT54aF9lbnRyaWVzWzBdLnhlX25hbWVfaGFzaCwgMSk7CkBAIC0zMjUxLDExICszODM1LDEwIEBACiAJfQogCiAJLyogY29weSB0aGUgd2hvbGUgYnVja2V0IHRvIHRoZSBuZXcgZmlyc3QuICovCi0JZm9yIChpID0gMDsgaSA8IGJsa19wZXJfYnVja2V0OyBpKyspCi0JCW1lbWNweSh0X2Joc1tpXS0+Yl9kYXRhLCBzX2Joc1tpXS0+Yl9kYXRhLCBibG9ja3NpemUpOworCW9jZnMyX3hhdHRyX2J1Y2tldF9jb3B5X2RhdGEodF9idWNrZXQsIHNfYnVja2V0KTsKIAogCS8qIHVwZGF0ZSB0aGUgbmV3IGJ1Y2tldC4gKi8KLQl4aCA9IChzdHJ1Y3Qgb2NmczJfeGF0dHJfaGVhZGVyICopdF9iaHNbMF0tPmJfZGF0YTsKKwl4aCA9IGJ1Y2tldF94aCh0X2J1Y2tldCk7CiAKIAkvKgogCSAqIENhbGN1bGF0ZSB0aGUgdG90YWwgbmFtZS92YWx1ZSBsZW4gYW5kIHhoX2ZyZWVfc3RhcnQgZm9yCkBAIC0zMzE5LDExICszOTAyLDcgQEAKIAllbHNlCiAJCXhoLT54aF9udW1fYnVja2V0cyA9IDA7CiAKLQlmb3IgKGkgPSAwOyBpIDwgYmxrX3Blcl9idWNrZXQ7IGkrKykgewotCQlvY2ZzMl9qb3VybmFsX2RpcnR5KGhhbmRsZSwgdF9iaHNbaV0pOwotCQlpZiAocmV0KQotCQkJbWxvZ19lcnJubyhyZXQpOwotCX0KKwlvY2ZzMl94YXR0cl9idWNrZXRfam91cm5hbF9kaXJ0eShoYW5kbGUsIHRfYnVja2V0KTsKIAogCS8qIHN0b3JlIHRoZSBmaXJzdF9oYXNoIG9mIHRoZSBuZXcgYnVja2V0LiAqLwogCWlmIChmaXJzdF9oYXNoKQpAQCAtMzMzNywyOSArMzkxNiwxOCBAQAogCWlmIChzdGFydCA9PSBjb3VudCkKIAkJZ290byBvdXQ7CiAKLQl4aCA9IChzdHJ1Y3Qgb2NmczJfeGF0dHJfaGVhZGVyICopc19iaHNbMF0tPmJfZGF0YTsKKwl4aCA9IGJ1Y2tldF94aChzX2J1Y2tldCk7CiAJbWVtc2V0KCZ4aC0+eGhfZW50cmllc1tzdGFydF0sIDAsCiAJICAgICAgIHNpemVvZihzdHJ1Y3Qgb2NmczJfeGF0dHJfZW50cnkpICogKGNvdW50IC0gc3RhcnQpKTsKIAl4aC0+eGhfY291bnQgPSBjcHVfdG9fbGUxNihzdGFydCk7CiAJeGgtPnhoX2ZyZWVfc3RhcnQgPSBjcHVfdG9fbGUxNihuYW1lX29mZnNldCk7CiAJeGgtPnhoX25hbWVfdmFsdWVfbGVuID0gY3B1X3RvX2xlMTYobmFtZV92YWx1ZV9sZW4pOwogCi0Jb2NmczJfam91cm5hbF9kaXJ0eShoYW5kbGUsIHNfYmhzWzBdKTsKLQlpZiAocmV0KQotCQltbG9nX2Vycm5vKHJldCk7CisJb2NmczJfeGF0dHJfYnVja2V0X2pvdXJuYWxfZGlydHkoaGFuZGxlLCBzX2J1Y2tldCk7CiAKIG91dDoKLQlpZiAoc19iaHMpIHsKLQkJZm9yIChpID0gMDsgaSA8IGJsa19wZXJfYnVja2V0OyBpKyspCi0JCQlicmVsc2Uoc19iaHNbaV0pOwotCX0KLQlrZnJlZShzX2Jocyk7Ci0KLQlpZiAodF9iaHMpIHsKLQkJZm9yIChpID0gMDsgaSA8IGJsa19wZXJfYnVja2V0OyBpKyspCi0JCQlicmVsc2UodF9iaHNbaV0pOwotCX0KLQlrZnJlZSh0X2Jocyk7CisJb2NmczJfeGF0dHJfYnVja2V0X2ZyZWUoc19idWNrZXQpOworCW9jZnMyX3hhdHRyX2J1Y2tldF9mcmVlKHRfYnVja2V0KTsKIAogCXJldHVybiByZXQ7CiB9CkBAIC0zMzc2LDEwICszOTQ0LDggQEAKIAkJCQkgdTY0IHRfYmxrbm8sCiAJCQkJIGludCB0X2lzX25ldykKIHsKLQlpbnQgcmV0LCBpOwotCWludCBibGtfcGVyX2J1Y2tldCA9IG9jZnMyX2Jsb2Nrc19wZXJfeGF0dHJfYnVja2V0KGlub2RlLT5pX3NiKTsKLQlpbnQgYmxvY2tzaXplID0gaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplOwotCXN0cnVjdCBidWZmZXJfaGVhZCAqKnNfYmhzLCAqKnRfYmhzID0gTlVMTDsKKwlpbnQgcmV0OworCXN0cnVjdCBvY2ZzMl94YXR0cl9idWNrZXQgKnNfYnVja2V0ID0gTlVMTCwgKnRfYnVja2V0ID0gTlVMTDsKIAogCUJVR19PTihzX2Jsa25vID09IHRfYmxrbm8pOwogCkBAIC0zMzg3LDkyICszOTUzLDExNSBAQAogCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylzX2Jsa25vLCAodW5zaWduZWQgbG9uZyBsb25nKXRfYmxrbm8sCiAJICAgICB0X2lzX25ldyk7CiAKLQlzX2JocyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBidWZmZXJfaGVhZCAqKSAqIGJsa19wZXJfYnVja2V0LAotCQkJR0ZQX05PRlMpOwotCWlmICghc19iaHMpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JcmV0ID0gb2NmczJfcmVhZF94YXR0cl9idWNrZXQoaW5vZGUsIHNfYmxrbm8sIHNfYmhzLCAwKTsKLQlpZiAocmV0KQotCQlnb3RvIG91dDsKLQotCXRfYmhzID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGJ1ZmZlcl9oZWFkICopICogYmxrX3Blcl9idWNrZXQsCi0JCQlHRlBfTk9GUyk7Ci0JaWYgKCF0X2JocykgeworCXNfYnVja2V0ID0gb2NmczJfeGF0dHJfYnVja2V0X25ldyhpbm9kZSk7CisJdF9idWNrZXQgPSBvY2ZzMl94YXR0cl9idWNrZXRfbmV3KGlub2RlKTsKKwlpZiAoIXNfYnVja2V0IHx8ICF0X2J1Y2tldCkgewogCQlyZXQgPSAtRU5PTUVNOworCQltbG9nX2Vycm5vKHJldCk7CiAJCWdvdG8gb3V0OwogCX0KIAotCXJldCA9IG9jZnMyX3JlYWRfeGF0dHJfYnVja2V0KGlub2RlLCB0X2Jsa25vLCB0X2JocywgdF9pc19uZXcpOworCXJldCA9IG9jZnMyX3JlYWRfeGF0dHJfYnVja2V0KHNfYnVja2V0LCBzX2Jsa25vKTsKIAlpZiAocmV0KQogCQlnb3RvIG91dDsKIAotCWZvciAoaSA9IDA7IGkgPCBibGtfcGVyX2J1Y2tldDsgaSsrKSB7Ci0JCXJldCA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgaW5vZGUsIHRfYmhzW2ldLAotCQkJCQkgICB0X2lzX25ldyA/Ci0JCQkJCSAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX0NSRUFURSA6Ci0JCQkJCSAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKLQkJaWYgKHJldCkKLQkJCWdvdG8gb3V0OwotCX0KKwkvKgorCSAqIEV2ZW4gaWYgIXRfaXNfbmV3LCB3ZSdyZSBvdmVyd3JpdGluZyB0X2J1Y2tldC4gIFRodXMsCisJICogdGhlcmUncyBubyBuZWVkIHRvIHJlYWQgaXQuCisJICovCisJcmV0ID0gb2NmczJfaW5pdF94YXR0cl9idWNrZXQodF9idWNrZXQsIHRfYmxrbm8pOworCWlmIChyZXQpCisJCWdvdG8gb3V0OwogCi0JZm9yIChpID0gMDsgaSA8IGJsa19wZXJfYnVja2V0OyBpKyspIHsKLQkJbWVtY3B5KHRfYmhzW2ldLT5iX2RhdGEsIHNfYmhzW2ldLT5iX2RhdGEsIGJsb2Nrc2l6ZSk7Ci0JCW9jZnMyX2pvdXJuYWxfZGlydHkoaGFuZGxlLCB0X2Joc1tpXSk7Ci0JfQorCS8qCisJICogSGV5LCBpZiB3ZSdyZSBvdmVyd3JpdGluZyB0X2J1Y2tldCwgd2hhdCBkaWZmZXJlbmNlIGRvZXMKKwkgKiBBQ0NFU1NfQ1JFQVRFIHZzIEFDQ0VTU19XUklURSBtYWtlPyAgV2VsbCwgaWYgd2UgYWxsb2NhdGVkIGEgbmV3CisJICogY2x1c3RlciB0byBmaWxsLCB3ZSBjYW1lIGhlcmUgZnJvbQorCSAqIG9jZnMyX212X3hhdHRyX2J1Y2tldHMoKSwgYW5kIGl0IGlzIHJlYWxseSBuZXcgLQorCSAqIEFDQ0VTU19DUkVBVEUgaXMgcmVxdWlyZWQuICBCdXQgd2UgYWxzbyBtaWdodCBoYXZlIG1vdmVkIGRhdGEKKwkgKiBvdXQgb2YgdF9idWNrZXQgYmVmb3JlIGV4dGVuZGluZyBiYWNrIGludG8gaXQuCisJICogb2NmczJfYWRkX25ld194YXR0cl9idWNrZXQoKSBjYW4gZG8gdGhpcyAtIGl0cyBjYWxsIHRvCisJICogb2NmczJfYWRkX25ld194YXR0cl9jbHVzdGVyKCkgbWF5IGhhdmUgY3JlYXRlZCBhIG5ldyBleHRlbnQKKwkgKiBhbmQgY29waWVkIG91dCB0aGUgZW5kIG9mIHRoZSBvbGQgZXh0ZW50LiAgVGhlbiBpdCByZS1leHRlbmRzCisJICogdGhlIG9sZCBleHRlbnQgYmFjayB0byBjcmVhdGUgc3BhY2UgZm9yIG5ldyB4YXR0cnMuICBUaGF0J3MKKwkgKiBob3cgd2UgZ2V0IGhlcmUsIGFuZCB0aGUgYnVja2V0IGlzbid0IHJlYWxseSBuZXcuCisJICovCisJcmV0ID0gb2NmczJfeGF0dHJfYnVja2V0X2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgdF9idWNrZXQsCisJCQkJCQl0X2lzX25ldyA/CisJCQkJCQlPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19DUkVBVEUgOgorCQkJCQkJT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJb2NmczJfeGF0dHJfYnVja2V0X2NvcHlfZGF0YSh0X2J1Y2tldCwgc19idWNrZXQpOworCW9jZnMyX3hhdHRyX2J1Y2tldF9qb3VybmFsX2RpcnR5KGhhbmRsZSwgdF9idWNrZXQpOwogCiBvdXQ6Ci0JaWYgKHNfYmhzKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBibGtfcGVyX2J1Y2tldDsgaSsrKQotCQkJYnJlbHNlKHNfYmhzW2ldKTsKLQl9Ci0Ja2ZyZWUoc19iaHMpOwotCi0JaWYgKHRfYmhzKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBibGtfcGVyX2J1Y2tldDsgaSsrKQotCQkJYnJlbHNlKHRfYmhzW2ldKTsKLQl9Ci0Ja2ZyZWUodF9iaHMpOworCW9jZnMyX3hhdHRyX2J1Y2tldF9mcmVlKHRfYnVja2V0KTsKKwlvY2ZzMl94YXR0cl9idWNrZXRfZnJlZShzX2J1Y2tldCk7CiAKIAlyZXR1cm4gcmV0OwogfQogCiAvKgotICogQ29weSBvbmUgeGF0dHIgY2x1c3RlciBmcm9tIHNyY19ibGsgdG8gdG9fYmxrLgotICogVGhlIHRvX2JsayB3aWxsIGJlY29tZSB0aGUgZmlyc3QgYnVja2V0IGhlYWRlciBvZiB0aGUgY2x1c3Rlciwgc28gaXRzCi0gKiB4aF9udW1fYnVja2V0cyB3aWxsIGJlIGluaXRpYWxpemVkIGFzIHRoZSBidWNrZXQgbnVtIGluIHRoZSBjbHVzdGVyLgorICogc3JjX2JsayBwb2ludHMgdG8gdGhlIHN0YXJ0IG9mIGFuIGV4aXN0aW5nIGV4dGVudC4gIGxhc3RfYmxrIHBvaW50cyB0bworICogbGFzdCBjbHVzdGVyIGluIHRoYXQgZXh0ZW50LiAgdG9fYmxrIHBvaW50cyB0byBhIG5ld2x5IGFsbG9jYXRlZAorICogZXh0ZW50LiAgV2UgY29weSB0aGUgYnVja2V0cyBmcm9tIHRoZSBjbHVzdGVyIGF0IGxhc3RfYmxrIHRvIHRoZSBuZXcKKyAqIGV4dGVudC4gIElmIHN0YXJ0X2J1Y2tldCBpcyBub24temVybywgd2Ugc2tpcCB0aGF0IG1hbnkgYnVja2V0cyBiZWZvcmUKKyAqIHdlIHN0YXJ0IGNvcHlpbmcuICBUaGUgbmV3IGV4dGVudCdzIHhoX251bV9idWNrZXRzIGdldHMgc2V0IHRvIHRoZQorICogbnVtYmVyIG9mIGJ1Y2tldHMgd2UgY29waWVkLiAgVGhlIG9sZCBleHRlbnQncyB4aF9udW1fYnVja2V0cyBzaHJpbmtzCisgKiBieSB0aGUgc2FtZSBhbW91bnQuCiAgKi8KLXN0YXRpYyBpbnQgb2NmczJfY3BfeGF0dHJfY2x1c3RlcihzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCQkJCSAgaGFuZGxlX3QgKmhhbmRsZSwKLQkJCQkgIHN0cnVjdCBidWZmZXJfaGVhZCAqZmlyc3RfYmgsCi0JCQkJICB1NjQgc3JjX2JsaywKLQkJCQkgIHU2NCB0b19ibGssCitzdGF0aWMgaW50IG9jZnMyX212X3hhdHRyX2J1Y2tldHMoc3RydWN0IGlub2RlICppbm9kZSwgaGFuZGxlX3QgKmhhbmRsZSwKKwkJCQkgIHU2NCBzcmNfYmxrLCB1NjQgbGFzdF9ibGssIHU2NCB0b19ibGssCisJCQkJICB1bnNpZ25lZCBpbnQgc3RhcnRfYnVja2V0LAogCQkJCSAgdTMyICpmaXJzdF9oYXNoKQogewogCWludCBpLCByZXQsIGNyZWRpdHM7CiAJc3RydWN0IG9jZnMyX3N1cGVyICpvc2IgPSBPQ0ZTMl9TQihpbm9kZS0+aV9zYik7Ci0JaW50IGJwYyA9IG9jZnMyX2NsdXN0ZXJzX3RvX2Jsb2Nrcyhpbm9kZS0+aV9zYiwgMSk7CisJaW50IGJsa3NfcGVyX2J1Y2tldCA9IG9jZnMyX2Jsb2Nrc19wZXJfeGF0dHJfYnVja2V0KGlub2RlLT5pX3NiKTsKIAlpbnQgbnVtX2J1Y2tldHMgPSBvY2ZzMl94YXR0cl9idWNrZXRzX3Blcl9jbHVzdGVyKG9zYik7Ci0Jc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IE5VTEw7Ci0Jc3RydWN0IG9jZnMyX3hhdHRyX2hlYWRlciAqeGg7Ci0JdTY0IHRvX2Jsa19zdGFydCA9IHRvX2JsazsKKwlzdHJ1Y3Qgb2NmczJfeGF0dHJfYnVja2V0ICpvbGRfZmlyc3QsICpuZXdfZmlyc3Q7CiAKLQltbG9nKDAsICJjcCB4YXR0cnMgZnJvbSBjbHVzdGVyICVsbHUgdG8gJWxsdVxuIiwKLQkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpc3JjX2JsaywgKHVuc2lnbmVkIGxvbmcgbG9uZyl0b19ibGspOworCW1sb2coMCwgIm12IHhhdHRycyBmcm9tIGNsdXN0ZXIgJWxsdSB0byAlbGx1XG4iLAorCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylsYXN0X2JsaywgKHVuc2lnbmVkIGxvbmcgbG9uZyl0b19ibGspOworCisJQlVHX09OKHN0YXJ0X2J1Y2tldCA+PSBudW1fYnVja2V0cyk7CisJaWYgKHN0YXJ0X2J1Y2tldCkgeworCQludW1fYnVja2V0cyAtPSBzdGFydF9idWNrZXQ7CisJCWxhc3RfYmxrICs9IChzdGFydF9idWNrZXQgKiBibGtzX3Blcl9idWNrZXQpOworCX0KKworCS8qIFRoZSBmaXJzdCBidWNrZXQgb2YgdGhlIG9yaWdpbmFsIGV4dGVudCAqLworCW9sZF9maXJzdCA9IG9jZnMyX3hhdHRyX2J1Y2tldF9uZXcoaW5vZGUpOworCS8qIFRoZSBmaXJzdCBidWNrZXQgb2YgdGhlIG5ldyBleHRlbnQgKi8KKwluZXdfZmlyc3QgPSBvY2ZzMl94YXR0cl9idWNrZXRfbmV3KGlub2RlKTsKKwlpZiAoIW9sZF9maXJzdCB8fCAhbmV3X2ZpcnN0KSB7CisJCXJldCA9IC1FTk9NRU07CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXQ7CisJfQorCisJcmV0ID0gb2NmczJfcmVhZF94YXR0cl9idWNrZXQob2xkX2ZpcnN0LCBzcmNfYmxrKTsKKwlpZiAocmV0KSB7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXQ7CisJfQogCiAJLyoKLQkgKiBXZSBuZWVkIHRvIHVwZGF0ZSB0aGUgbmV3IGNsdXN0ZXIgYW5kIDEgbW9yZSBmb3IgdGhlIHVwZGF0ZSBvZgotCSAqIHRoZSAxc3QgYnVja2V0IG9mIHRoZSBwcmV2aW91cyBleHRlbnQgcmVjLgorCSAqIFdlIG5lZWQgdG8gdXBkYXRlIHRoZSBmaXJzdCBidWNrZXQgb2YgdGhlIG9sZCBleHRlbnQgYW5kIGFsbAorCSAqIHRoZSBidWNrZXRzIGdvaW5nIHRvIHRoZSBuZXcgZXh0ZW50LgogCSAqLwotCWNyZWRpdHMgPSBicGMgKyAxOworCWNyZWRpdHMgPSAoKG51bV9idWNrZXRzICsgMSkgKiBibGtzX3Blcl9idWNrZXQpICsKKwkJaGFuZGxlLT5oX2J1ZmZlcl9jcmVkaXRzOwogCXJldCA9IG9jZnMyX2V4dGVuZF90cmFucyhoYW5kbGUsIGNyZWRpdHMpOwogCWlmIChyZXQpIHsKIAkJbWxvZ19lcnJubyhyZXQpOwogCQlnb3RvIG91dDsKIAl9CiAKLQlyZXQgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGlub2RlLCBmaXJzdF9iaCwKLQkJCQkgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CisJcmV0ID0gb2NmczJfeGF0dHJfYnVja2V0X2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgb2xkX2ZpcnN0LAorCQkJCQkJT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOwogCWlmIChyZXQpIHsKIAkJbWxvZ19lcnJubyhyZXQpOwogCQlnb3RvIG91dDsKQEAgLTM0ODAsNDUgKzQwNjksNDUgQEAKIAogCWZvciAoaSA9IDA7IGkgPCBudW1fYnVja2V0czsgaSsrKSB7CiAJCXJldCA9IG9jZnMyX2NwX3hhdHRyX2J1Y2tldChpbm9kZSwgaGFuZGxlLAotCQkJCQkgICAgc3JjX2JsaywgdG9fYmxrLCAxKTsKKwkJCQkJICAgIGxhc3RfYmxrICsgKGkgKiBibGtzX3Blcl9idWNrZXQpLAorCQkJCQkgICAgdG9fYmxrICsgKGkgKiBibGtzX3Blcl9idWNrZXQpLAorCQkJCQkgICAgMSk7CiAJCWlmIChyZXQpIHsKIAkJCW1sb2dfZXJybm8ocmV0KTsKIAkJCWdvdG8gb3V0OwogCQl9Ci0KLQkJc3JjX2JsayArPSBvY2ZzMl9ibG9ja3NfcGVyX3hhdHRyX2J1Y2tldChpbm9kZS0+aV9zYik7Ci0JCXRvX2JsayArPSBvY2ZzMl9ibG9ja3NfcGVyX3hhdHRyX2J1Y2tldChpbm9kZS0+aV9zYik7CiAJfQogCi0JLyogdXBkYXRlIHRoZSBvbGQgYnVja2V0IGhlYWRlci4gKi8KLQl4aCA9IChzdHJ1Y3Qgb2NmczJfeGF0dHJfaGVhZGVyICopZmlyc3RfYmgtPmJfZGF0YTsKLQlsZTE2X2FkZF9jcHUoJnhoLT54aF9udW1fYnVja2V0cywgLW51bV9idWNrZXRzKTsKLQotCW9jZnMyX2pvdXJuYWxfZGlydHkoaGFuZGxlLCBmaXJzdF9iaCk7Ci0KLQkvKiB1cGRhdGUgdGhlIG5ldyBidWNrZXQgaGVhZGVyLiAqLwotCXJldCA9IG9jZnMyX3JlYWRfYmxvY2soaW5vZGUsIHRvX2Jsa19zdGFydCwgJmJoKTsKLQlpZiAocmV0IDwgMCkgeworCS8qCisJICogR2V0IHRoZSBuZXcgYnVja2V0IHJlYWR5IGJlZm9yZSB3ZSBkaXJ0eSBhbnl0aGluZworCSAqIChUaGlzIGFjdHVhbGx5IHNob3VsZG4ndCBmYWlsLCBiZWNhdXNlIHdlIGFscmVhZHkgZGlydGllZAorCSAqIGl0IG9uY2UgaW4gb2NmczJfY3BfeGF0dHJfYnVja2V0KCkpLgorCSAqLworCXJldCA9IG9jZnMyX3JlYWRfeGF0dHJfYnVja2V0KG5ld19maXJzdCwgdG9fYmxrKTsKKwlpZiAocmV0KSB7CiAJCW1sb2dfZXJybm8ocmV0KTsKIAkJZ290byBvdXQ7CiAJfQotCi0JcmV0ID0gb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwgYmgsCi0JCQkJICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOworCXJldCA9IG9jZnMyX3hhdHRyX2J1Y2tldF9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIG5ld19maXJzdCwKKwkJCQkJCU9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKIAlpZiAocmV0KSB7CiAJCW1sb2dfZXJybm8ocmV0KTsKIAkJZ290byBvdXQ7CiAJfQogCi0JeGggPSAoc3RydWN0IG9jZnMyX3hhdHRyX2hlYWRlciAqKWJoLT5iX2RhdGE7Ci0JeGgtPnhoX251bV9idWNrZXRzID0gY3B1X3RvX2xlMTYobnVtX2J1Y2tldHMpOworCS8qIE5vdyB1cGRhdGUgdGhlIGhlYWRlcnMgKi8KKwlsZTE2X2FkZF9jcHUoJmJ1Y2tldF94aChvbGRfZmlyc3QpLT54aF9udW1fYnVja2V0cywgLW51bV9idWNrZXRzKTsKKwlvY2ZzMl94YXR0cl9idWNrZXRfam91cm5hbF9kaXJ0eShoYW5kbGUsIG9sZF9maXJzdCk7CiAKLQlvY2ZzMl9qb3VybmFsX2RpcnR5KGhhbmRsZSwgYmgpOworCWJ1Y2tldF94aChuZXdfZmlyc3QpLT54aF9udW1fYnVja2V0cyA9IGNwdV90b19sZTE2KG51bV9idWNrZXRzKTsKKwlvY2ZzMl94YXR0cl9idWNrZXRfam91cm5hbF9kaXJ0eShoYW5kbGUsIG5ld19maXJzdCk7CiAKIAlpZiAoZmlyc3RfaGFzaCkKLQkJKmZpcnN0X2hhc2ggPSBsZTMyX3RvX2NwdSh4aC0+eGhfZW50cmllc1swXS54ZV9uYW1lX2hhc2gpOworCQkqZmlyc3RfaGFzaCA9IGxlMzJfdG9fY3B1KGJ1Y2tldF94aChuZXdfZmlyc3QpLT54aF9lbnRyaWVzWzBdLnhlX25hbWVfaGFzaCk7CisKIG91dDoKLQlicmVsc2UoYmgpOworCW9jZnMyX3hhdHRyX2J1Y2tldF9mcmVlKG5ld19maXJzdCk7CisJb2NmczJfeGF0dHJfYnVja2V0X2ZyZWUob2xkX2ZpcnN0KTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0zNTM0LDcgKzQxMjMsNyBAQAogCQkJCSAgICAgIHUzMiAqZmlyc3RfaGFzaCkKIHsKIAl1MTYgYmxrX3Blcl9idWNrZXQgPSBvY2ZzMl9ibG9ja3NfcGVyX3hhdHRyX2J1Y2tldChpbm9kZS0+aV9zYik7Ci0JaW50IHJldCwgY3JlZGl0cyA9IDIgKiBibGtfcGVyX2J1Y2tldDsKKwlpbnQgcmV0LCBjcmVkaXRzID0gMiAqIGJsa19wZXJfYnVja2V0ICsgaGFuZGxlLT5oX2J1ZmZlcl9jcmVkaXRzOwogCiAJQlVHX09OKE9DRlMyX1hBVFRSX0JVQ0tFVF9TSVpFIDwgT0NGUzJfU0IoaW5vZGUtPmlfc2IpLT5zX2NsdXN0ZXJzaXplKTsKIApAQCAtMzU3Nyw0MyArNDE2Niw0OSBAQAogICovCiBzdGF0aWMgaW50IG9jZnMyX2FkanVzdF94YXR0cl9jcm9zc19jbHVzdGVyKHN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJCQkJCSAgICBoYW5kbGVfdCAqaGFuZGxlLAotCQkJCQkgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICoqZmlyc3RfYmgsCi0JCQkJCSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKipoZWFkZXJfYmgsCisJCQkJCSAgICBzdHJ1Y3Qgb2NmczJfeGF0dHJfYnVja2V0ICpmaXJzdCwKKwkJCQkJICAgIHN0cnVjdCBvY2ZzMl94YXR0cl9idWNrZXQgKnRhcmdldCwKIAkJCQkJICAgIHU2NCBuZXdfYmxrLAotCQkJCQkgICAgdTY0IHByZXZfYmxrLAogCQkJCQkgICAgdTMyIHByZXZfY2x1c3RlcnMsCiAJCQkJCSAgICB1MzIgKnZfc3RhcnQsCiAJCQkJCSAgICBpbnQgKmV4dGVuZCkKIHsKLQlpbnQgcmV0ID0gMDsKLQlpbnQgYnBjID0gb2NmczJfY2x1c3RlcnNfdG9fYmxvY2tzKGlub2RlLT5pX3NiLCAxKTsKKwlpbnQgcmV0OwogCiAJbWxvZygwLCAiYWRqdXN0IHhhdHRycyBmcm9tIGNsdXN0ZXIgJWxsdSBsZW4gJXUgdG8gJWxsdVxuIiwKLQkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpcHJldl9ibGssIHByZXZfY2x1c3RlcnMsCisJICAgICAodW5zaWduZWQgbG9uZyBsb25nKWJ1Y2tldF9ibGtubyhmaXJzdCksIHByZXZfY2x1c3RlcnMsCiAJICAgICAodW5zaWduZWQgbG9uZyBsb25nKW5ld19ibGspOwogCi0JaWYgKG9jZnMyX3hhdHRyX2J1Y2tldHNfcGVyX2NsdXN0ZXIoT0NGUzJfU0IoaW5vZGUtPmlfc2IpKSA+IDEpCisJaWYgKG9jZnMyX3hhdHRyX2J1Y2tldHNfcGVyX2NsdXN0ZXIoT0NGUzJfU0IoaW5vZGUtPmlfc2IpKSA+IDEpIHsKIAkJcmV0ID0gb2NmczJfbXZfeGF0dHJfYnVja2V0X2Nyb3NzX2NsdXN0ZXIoaW5vZGUsCiAJCQkJCQkJICBoYW5kbGUsCi0JCQkJCQkJICBmaXJzdF9iaCwKLQkJCQkJCQkgIGhlYWRlcl9iaCwKKwkJCQkJCQkgIGZpcnN0LCB0YXJnZXQsCiAJCQkJCQkJICBuZXdfYmxrLAotCQkJCQkJCSAgcHJldl9ibGssCiAJCQkJCQkJICBwcmV2X2NsdXN0ZXJzLAogCQkJCQkJCSAgdl9zdGFydCk7Ci0JZWxzZSB7Ci0JCXU2NCBsYXN0X2JsayA9IHByZXZfYmxrICsgYnBjICogKHByZXZfY2x1c3RlcnMgLSAxKTsKKwkJaWYgKHJldCkKKwkJCW1sb2dfZXJybm8ocmV0KTsKKwl9IGVsc2UgeworCQkvKiBUaGUgc3RhcnQgb2YgdGhlIGxhc3QgY2x1c3RlciBpbiB0aGUgZmlyc3QgZXh0ZW50ICovCisJCXU2NCBsYXN0X2JsayA9IGJ1Y2tldF9ibGtubyhmaXJzdCkgKworCQkJKChwcmV2X2NsdXN0ZXJzIC0gMSkgKgorCQkJIG9jZnMyX2NsdXN0ZXJzX3RvX2Jsb2Nrcyhpbm9kZS0+aV9zYiwgMSkpOwogCi0JCWlmIChwcmV2X2NsdXN0ZXJzID4gMSAmJiAoKmhlYWRlcl9iaCktPmJfYmxvY2tuciAhPSBsYXN0X2JsaykKLQkJCXJldCA9IG9jZnMyX2NwX3hhdHRyX2NsdXN0ZXIoaW5vZGUsIGhhbmRsZSwgKmZpcnN0X2JoLAotCQkJCQkJICAgICBsYXN0X2JsaywgbmV3X2JsaywKKwkJaWYgKHByZXZfY2x1c3RlcnMgPiAxICYmIGJ1Y2tldF9ibGtubyh0YXJnZXQpICE9IGxhc3RfYmxrKSB7CisJCQlyZXQgPSBvY2ZzMl9tdl94YXR0cl9idWNrZXRzKGlub2RlLCBoYW5kbGUsCisJCQkJCQkgICAgIGJ1Y2tldF9ibGtubyhmaXJzdCksCisJCQkJCQkgICAgIGxhc3RfYmxrLCBuZXdfYmxrLCAwLAogCQkJCQkJICAgICB2X3N0YXJ0KTsKLQkJZWxzZSB7CisJCQlpZiAocmV0KQorCQkJCW1sb2dfZXJybm8ocmV0KTsKKwkJfSBlbHNlIHsKIAkJCXJldCA9IG9jZnMyX2RpdmlkZV94YXR0cl9jbHVzdGVyKGlub2RlLCBoYW5kbGUsCiAJCQkJCQkJIGxhc3RfYmxrLCBuZXdfYmxrLAogCQkJCQkJCSB2X3N0YXJ0KTsKKwkJCWlmIChyZXQpCisJCQkJbWxvZ19lcnJubyhyZXQpOwogCi0JCQlpZiAoKCpoZWFkZXJfYmgpLT5iX2Jsb2NrbnIgPT0gbGFzdF9ibGsgJiYgZXh0ZW5kKQorCQkJaWYgKChidWNrZXRfYmxrbm8odGFyZ2V0KSA9PSBsYXN0X2JsaykgJiYgZXh0ZW5kKQogCQkJCSpleHRlbmQgPSAwOwogCQl9CiAJfQpAQCAtMzYzOSw1NiArNDIzNCwzNyBAQAogICovCiBzdGF0aWMgaW50IG9jZnMyX2FkZF9uZXdfeGF0dHJfY2x1c3RlcihzdHJ1Y3QgaW5vZGUgKmlub2RlLAogCQkJCSAgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKnJvb3RfYmgsCi0JCQkJICAgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqKmZpcnN0X2JoLAotCQkJCSAgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKipoZWFkZXJfYmgsCisJCQkJICAgICAgIHN0cnVjdCBvY2ZzMl94YXR0cl9idWNrZXQgKmZpcnN0LAorCQkJCSAgICAgICBzdHJ1Y3Qgb2NmczJfeGF0dHJfYnVja2V0ICp0YXJnZXQsCiAJCQkJICAgICAgIHUzMiAqbnVtX2NsdXN0ZXJzLAogCQkJCSAgICAgICB1MzIgcHJldl9jcG9zLAotCQkJCSAgICAgICB1NjQgcHJldl9ibGtubywKLQkJCQkgICAgICAgaW50ICpleHRlbmQpCisJCQkJICAgICAgIGludCAqZXh0ZW5kLAorCQkJCSAgICAgICBzdHJ1Y3Qgb2NmczJfeGF0dHJfc2V0X2N0eHQgKmN0eHQpCiB7Ci0JaW50IHJldCwgY3JlZGl0czsKKwlpbnQgcmV0OwogCXUxNiBicGMgPSBvY2ZzMl9jbHVzdGVyc190b19ibG9ja3MoaW5vZGUtPmlfc2IsIDEpOwogCXUzMiBwcmV2X2NsdXN0ZXJzID0gKm51bV9jbHVzdGVyczsKIAl1MzIgY2x1c3RlcnNfdG9fYWRkID0gMSwgYml0X29mZiwgbnVtX2JpdHMsIHZfc3RhcnQgPSAwOwogCXU2NCBibG9jazsKLQloYW5kbGVfdCAqaGFuZGxlID0gTlVMTDsKLQlzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqZGF0YV9hYyA9IE5VTEw7Ci0Jc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKm1ldGFfYWMgPSBOVUxMOworCWhhbmRsZV90ICpoYW5kbGUgPSBjdHh0LT5oYW5kbGU7CiAJc3RydWN0IG9jZnMyX3N1cGVyICpvc2IgPSBPQ0ZTMl9TQihpbm9kZS0+aV9zYik7CiAJc3RydWN0IG9jZnMyX2V4dGVudF90cmVlIGV0OwogCiAJbWxvZygwLCAiQWRkIG5ldyB4YXR0ciBjbHVzdGVyIGZvciAlbGx1LCBwcmV2aW91cyB4YXR0ciBoYXNoID0gJXUsICIKIAkgICAgICJwcmV2aW91cyB4YXR0ciBibGtubyA9ICVsbHVcbiIsCiAJICAgICAodW5zaWduZWQgbG9uZyBsb25nKU9DRlMyX0koaW5vZGUpLT5pcF9ibGtubywKLQkgICAgIHByZXZfY3BvcywgKHVuc2lnbmVkIGxvbmcgbG9uZylwcmV2X2Jsa25vKTsKKwkgICAgIHByZXZfY3BvcywgKHVuc2lnbmVkIGxvbmcgbG9uZylidWNrZXRfYmxrbm8oZmlyc3QpKTsKIAogCW9jZnMyX2luaXRfeGF0dHJfdHJlZV9leHRlbnRfdHJlZSgmZXQsIGlub2RlLCByb290X2JoKTsKIAotCXJldCA9IG9jZnMyX2xvY2tfYWxsb2NhdG9ycyhpbm9kZSwgJmV0LCBjbHVzdGVyc190b19hZGQsIDAsCi0JCQkJICAgICZkYXRhX2FjLCAmbWV0YV9hYyk7Ci0JaWYgKHJldCkgewotCQltbG9nX2Vycm5vKHJldCk7Ci0JCWdvdG8gbGVhdmU7Ci0JfQotCi0JY3JlZGl0cyA9IG9jZnMyX2NhbGNfZXh0ZW5kX2NyZWRpdHMob3NiLT5zYiwgZXQuZXRfcm9vdF9lbCwKLQkJCQkJICAgIGNsdXN0ZXJzX3RvX2FkZCk7Ci0JaGFuZGxlID0gb2NmczJfc3RhcnRfdHJhbnMob3NiLCBjcmVkaXRzKTsKLQlpZiAoSVNfRVJSKGhhbmRsZSkpIHsKLQkJcmV0ID0gUFRSX0VSUihoYW5kbGUpOwotCQloYW5kbGUgPSBOVUxMOwotCQltbG9nX2Vycm5vKHJldCk7Ci0JCWdvdG8gbGVhdmU7Ci0JfQotCi0JcmV0ID0gb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwgcm9vdF9iaCwKLQkJCQkgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CisJcmV0ID0gb2NmczJfam91cm5hbF9hY2Nlc3NfeGIoaGFuZGxlLCBpbm9kZSwgcm9vdF9iaCwKKwkJCQkgICAgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CiAJaWYgKHJldCA8IDApIHsKIAkJbWxvZ19lcnJubyhyZXQpOwogCQlnb3RvIGxlYXZlOwogCX0KIAotCXJldCA9IF9fb2NmczJfY2xhaW1fY2x1c3RlcnMob3NiLCBoYW5kbGUsIGRhdGFfYWMsIDEsCisJcmV0ID0gX19vY2ZzMl9jbGFpbV9jbHVzdGVycyhvc2IsIGhhbmRsZSwgY3R4dC0+ZGF0YV9hYywgMSwKIAkJCQkgICAgIGNsdXN0ZXJzX3RvX2FkZCwgJmJpdF9vZmYsICZudW1fYml0cyk7CiAJaWYgKHJldCA8IDApIHsKIAkJaWYgKHJldCAhPSAtRU5PU1BDKQpAQCAtMzcwMiw3ICs0Mjc4LDcgQEAKIAltbG9nKDAsICJBbGxvY2F0aW5nICV1IGNsdXN0ZXJzIGF0IGJsb2NrICV1IGZvciB4YXR0ciBpbiBpbm9kZSAlbGx1XG4iLAogCSAgICAgbnVtX2JpdHMsIGJpdF9vZmYsICh1bnNpZ25lZCBsb25nIGxvbmcpT0NGUzJfSShpbm9kZSktPmlwX2Jsa25vKTsKIAotCWlmIChwcmV2X2Jsa25vICsgcHJldl9jbHVzdGVycyAqIGJwYyA9PSBibG9jayAmJgorCWlmIChidWNrZXRfYmxrbm8oZmlyc3QpICsgKHByZXZfY2x1c3RlcnMgKiBicGMpID09IGJsb2NrICYmCiAJICAgIChwcmV2X2NsdXN0ZXJzICsgbnVtX2JpdHMpIDw8IG9zYi0+c19jbHVzdGVyc2l6ZV9iaXRzIDw9CiAJICAgICBPQ0ZTMl9NQVhfWEFUVFJfVFJFRV9MRUFGX1NJWkUpIHsKIAkJLyoKQEAgLTM3MjEsMTAgKzQyOTcsOSBAQAogCX0gZWxzZSB7CiAJCXJldCA9IG9jZnMyX2FkanVzdF94YXR0cl9jcm9zc19jbHVzdGVyKGlub2RlLAogCQkJCQkJICAgICAgIGhhbmRsZSwKLQkJCQkJCSAgICAgICBmaXJzdF9iaCwKLQkJCQkJCSAgICAgICBoZWFkZXJfYmgsCisJCQkJCQkgICAgICAgZmlyc3QsCisJCQkJCQkgICAgICAgdGFyZ2V0LAogCQkJCQkJICAgICAgIGJsb2NrLAotCQkJCQkJICAgICAgIHByZXZfYmxrbm8sCiAJCQkJCQkgICAgICAgcHJldl9jbHVzdGVycywKIAkJCQkJCSAgICAgICAmdl9zdGFydCwKIAkJCQkJCSAgICAgICBleHRlbmQpOwpAQCAtMzczNCwxNDkgKzQzMDksMTM3IEBACiAJCX0KIAl9CiAKLQlpZiAoaGFuZGxlLT5oX2J1ZmZlcl9jcmVkaXRzIDwgY3JlZGl0cykgewotCQkvKgotCQkgKiBUaGUgam91cm5hbCBoYXMgYmVlbiByZXN0YXJ0ZWQgYmVmb3JlLCBhbmQgZG9uJ3QKLQkJICogaGF2ZSBlbm91Z2ggc3BhY2UgZm9yIHRoZSBpbnNlcnRpb24sIHNvIGV4dGVuZCBpdAotCQkgKiBoZXJlLgotCQkgKi8KLQkJcmV0ID0gb2NmczJfZXh0ZW5kX3RyYW5zKGhhbmRsZSwgY3JlZGl0cyk7Ci0JCWlmIChyZXQpIHsKLQkJCW1sb2dfZXJybm8ocmV0KTsKLQkJCWdvdG8gbGVhdmU7Ci0JCX0KLQl9CiAJbWxvZygwLCAiSW5zZXJ0ICV1IGNsdXN0ZXJzIGF0IGJsb2NrICVsbHUgZm9yIHhhdHRyIGF0ICV1XG4iLAogCSAgICAgbnVtX2JpdHMsICh1bnNpZ25lZCBsb25nIGxvbmcpYmxvY2ssIHZfc3RhcnQpOwogCXJldCA9IG9jZnMyX2luc2VydF9leHRlbnQob3NiLCBoYW5kbGUsIGlub2RlLCAmZXQsIHZfc3RhcnQsIGJsb2NrLAotCQkJCSAgbnVtX2JpdHMsIDAsIG1ldGFfYWMpOworCQkJCSAgbnVtX2JpdHMsIDAsIGN0eHQtPm1ldGFfYWMpOwogCWlmIChyZXQgPCAwKSB7CiAJCW1sb2dfZXJybm8ocmV0KTsKIAkJZ290byBsZWF2ZTsKIAl9CiAKIAlyZXQgPSBvY2ZzMl9qb3VybmFsX2RpcnR5KGhhbmRsZSwgcm9vdF9iaCk7Ci0JaWYgKHJldCA8IDApIHsKKwlpZiAocmV0IDwgMCkKIAkJbWxvZ19lcnJubyhyZXQpOwotCQlnb3RvIGxlYXZlOwotCX0KIAogbGVhdmU6Ci0JaWYgKGhhbmRsZSkKLQkJb2NmczJfY29tbWl0X3RyYW5zKG9zYiwgaGFuZGxlKTsKLQlpZiAoZGF0YV9hYykKLQkJb2NmczJfZnJlZV9hbGxvY19jb250ZXh0KGRhdGFfYWMpOwotCWlmIChtZXRhX2FjKQotCQlvY2ZzMl9mcmVlX2FsbG9jX2NvbnRleHQobWV0YV9hYyk7Ci0KIAlyZXR1cm4gcmV0OwogfQogCiAvKgotICogRXh0ZW5kIGEgbmV3IHhhdHRyIGJ1Y2tldCBhbmQgbW92ZSB4YXR0cnMgdG8gdGhlIGVuZCBvbmUgYnkgb25lIHVudGlsCi0gKiBXZSBtZWV0IHdpdGggc3RhcnRfYmguIE9ubHkgbW92ZSBoYWxmIG9mIHRoZSB4YXR0cnMgdG8gdGhlIGJ1Y2tldCBhZnRlciBpdC4KKyAqIFdlIGFyZSBnaXZlbiBhbiBleHRlbnQuICAnZmlyc3QnIGlzIHRoZSBidWNrZXQgYXQgdGhlIHZlcnkgZnJvbnQgb2YKKyAqIHRoZSBleHRlbnQuICBUaGUgZXh0ZW50IGhhcyBzcGFjZSBmb3IgYW4gYWRkaXRpb25hbCBidWNrZXQgcGFzdAorICogYnVja2V0X3hoKGZpcnN0KS0+eGhfbnVtX2J1Y2tldHMuICAndGFyZ2V0X2Jsa25vJyBpcyB0aGUgYmxvY2sgbnVtYmVyCisgKiBvZiB0aGUgdGFyZ2V0IGJ1Y2tldC4gIFdlIHdpc2ggdG8gc2hpZnQgZXZlcnkgYnVja2V0IHBhc3QgdGhlIHRhcmdldAorICogZG93biBvbmUsIGZpbGxpbmcgaW4gdGhhdCBhZGRpdGlvbmFsIHNwYWNlLiAgV2hlbiB3ZSBnZXQgYmFjayB0byB0aGUKKyAqIHRhcmdldCwgd2Ugc3BsaXQgdGhlIHRhcmdldCBiZXR3ZWVuIGl0c2VsZiBhbmQgdGhlIG5vdy1lbXB0eSBidWNrZXQKKyAqIGF0IHRhcmdldCsxIChha2EsIHRhcmdldF9ibGtubyArIGJsa3NfcGVyX2J1Y2tldCkuCiAgKi8KIHN0YXRpYyBpbnQgb2NmczJfZXh0ZW5kX3hhdHRyX2J1Y2tldChzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCQkJCSAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpmaXJzdF9iaCwKLQkJCQkgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqc3RhcnRfYmgsCisJCQkJICAgICBoYW5kbGVfdCAqaGFuZGxlLAorCQkJCSAgICAgc3RydWN0IG9jZnMyX3hhdHRyX2J1Y2tldCAqZmlyc3QsCisJCQkJICAgICB1NjQgdGFyZ2V0X2JsaywKIAkJCQkgICAgIHUzMiBudW1fY2x1c3RlcnMpCiB7CiAJaW50IHJldCwgY3JlZGl0czsKIAlzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiA9IE9DRlMyX1NCKGlub2RlLT5pX3NiKTsKIAl1MTYgYmxrX3Blcl9idWNrZXQgPSBvY2ZzMl9ibG9ja3NfcGVyX3hhdHRyX2J1Y2tldChpbm9kZS0+aV9zYik7Ci0JdTY0IHN0YXJ0X2JsayA9IHN0YXJ0X2JoLT5iX2Jsb2NrbnIsIGVuZF9ibGs7Ci0JdTMyIG51bV9idWNrZXRzID0gbnVtX2NsdXN0ZXJzICogb2NmczJfeGF0dHJfYnVja2V0c19wZXJfY2x1c3Rlcihvc2IpOwotCWhhbmRsZV90ICpoYW5kbGU7Ci0Jc3RydWN0IG9jZnMyX3hhdHRyX2hlYWRlciAqZmlyc3RfeGggPQotCQkJCShzdHJ1Y3Qgb2NmczJfeGF0dHJfaGVhZGVyICopZmlyc3RfYmgtPmJfZGF0YTsKLQl1MTYgYnVja2V0ID0gbGUxNl90b19jcHUoZmlyc3RfeGgtPnhoX251bV9idWNrZXRzKTsKKwl1NjQgZW5kX2JsazsKKwl1MTYgbmV3X2J1Y2tldCA9IGxlMTZfdG9fY3B1KGJ1Y2tldF94aChmaXJzdCktPnhoX251bV9idWNrZXRzKTsKIAogCW1sb2coMCwgImV4dGVuZCB4YXR0ciBidWNrZXQgaW4gJWxsdSwgeGF0dHIgZXh0ZW5kIHJlYyBzdGFydGluZyAiCi0JICAgICAiZnJvbSAlbGx1LCBsZW4gPSAldVxuIiwgKHVuc2lnbmVkIGxvbmcgbG9uZylzdGFydF9ibGssCi0JICAgICAodW5zaWduZWQgbG9uZyBsb25nKWZpcnN0X2JoLT5iX2Jsb2NrbnIsIG51bV9jbHVzdGVycyk7CisJICAgICAiZnJvbSAlbGx1LCBsZW4gPSAldVxuIiwgKHVuc2lnbmVkIGxvbmcgbG9uZyl0YXJnZXRfYmxrLAorCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylidWNrZXRfYmxrbm8oZmlyc3QpLCBudW1fY2x1c3RlcnMpOwogCi0JQlVHX09OKGJ1Y2tldCA+PSBudW1fYnVja2V0cyk7CisJLyogVGhlIGV4dGVudCBtdXN0IGhhdmUgcm9vbSBmb3IgYW4gYWRkaXRpb25hbCBidWNrZXQgKi8KKwlCVUdfT04obmV3X2J1Y2tldCA+PQorCSAgICAgICAobnVtX2NsdXN0ZXJzICogb2NmczJfeGF0dHJfYnVja2V0c19wZXJfY2x1c3Rlcihvc2IpKSk7CiAKLQllbmRfYmxrID0gZmlyc3RfYmgtPmJfYmxvY2tuciArIChidWNrZXQgLSAxKSAqIGJsa19wZXJfYnVja2V0OworCS8qIGVuZF9ibGsgcG9pbnRzIHRvIHRoZSBsYXN0IGV4aXN0aW5nIGJ1Y2tldCAqLworCWVuZF9ibGsgPSBidWNrZXRfYmxrbm8oZmlyc3QpICsgKChuZXdfYnVja2V0IC0gMSkgKiBibGtfcGVyX2J1Y2tldCk7CiAKIAkvKgotCSAqIFdlIHdpbGwgdG91Y2ggYWxsIHRoZSBidWNrZXRzIGFmdGVyIHRoZSBzdGFydF9iaChpbmNsdWRlIGl0KS4KLQkgKiBBZGQgb25lIG1vcmUgYnVja2V0IGFuZCBtb2RpZnkgdGhlIGZpcnN0X2JoLgorCSAqIGVuZF9ibGsgaXMgdGhlIHN0YXJ0IG9mIHRoZSBsYXN0IGV4aXN0aW5nIGJ1Y2tldC4KKwkgKiBUaHVzLCAoZW5kX2JsayAtIHRhcmdldF9ibGspIGNvdmVycyB0aGUgdGFyZ2V0IGJ1Y2tldCBhbmQKKwkgKiBldmVyeSBidWNrZXQgYWZ0ZXIgaXQgdXAgdG8sIGJ1dCBub3QgaW5jbHVkaW5nLCB0aGUgbGFzdAorCSAqIGV4aXN0aW5nIGJ1Y2tldC4gIFRoZW4gd2UgYWRkIHRoZSBsYXN0IGV4aXN0aW5nIGJ1Y2tldCwgdGhlCisJICogbmV3IGJ1Y2tldCwgYW5kIHRoZSBmaXJzdCBidWNrZXQgKDMgKiBibGtfcGVyX2J1Y2tldCkuCiAJICovCi0JY3JlZGl0cyA9IGVuZF9ibGsgLSBzdGFydF9ibGsgKyAyICogYmxrX3Blcl9idWNrZXQgKyAxOwotCWhhbmRsZSA9IG9jZnMyX3N0YXJ0X3RyYW5zKG9zYiwgY3JlZGl0cyk7Ci0JaWYgKElTX0VSUihoYW5kbGUpKSB7Ci0JCXJldCA9IFBUUl9FUlIoaGFuZGxlKTsKLQkJaGFuZGxlID0gTlVMTDsKKwljcmVkaXRzID0gKGVuZF9ibGsgLSB0YXJnZXRfYmxrKSArICgzICogYmxrX3Blcl9idWNrZXQpICsKKwkJICBoYW5kbGUtPmhfYnVmZmVyX2NyZWRpdHM7CisJcmV0ID0gb2NmczJfZXh0ZW5kX3RyYW5zKGhhbmRsZSwgY3JlZGl0cyk7CisJaWYgKHJldCkgewogCQltbG9nX2Vycm5vKHJldCk7CiAJCWdvdG8gb3V0OwogCX0KIAotCXJldCA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgaW5vZGUsIGZpcnN0X2JoLAotCQkJCSAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKKwlyZXQgPSBvY2ZzMl94YXR0cl9idWNrZXRfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBmaXJzdCwKKwkJCQkJCU9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKIAlpZiAocmV0KSB7CiAJCW1sb2dfZXJybm8ocmV0KTsKLQkJZ290byBjb21taXQ7CisJCWdvdG8gb3V0OwogCX0KIAotCXdoaWxlIChlbmRfYmxrICE9IHN0YXJ0X2JsaykgeworCXdoaWxlIChlbmRfYmxrICE9IHRhcmdldF9ibGspIHsKIAkJcmV0ID0gb2NmczJfY3BfeGF0dHJfYnVja2V0KGlub2RlLCBoYW5kbGUsIGVuZF9ibGssCiAJCQkJCSAgICBlbmRfYmxrICsgYmxrX3Blcl9idWNrZXQsIDApOwogCQlpZiAocmV0KQotCQkJZ290byBjb21taXQ7CisJCQlnb3RvIG91dDsKIAkJZW5kX2JsayAtPSBibGtfcGVyX2J1Y2tldDsKIAl9CiAKLQkvKiBNb3ZlIGhhbGYgb2YgdGhlIHhhdHRyIGluIHN0YXJ0X2JsayB0byB0aGUgbmV4dCBidWNrZXQuICovCi0JcmV0ID0gb2NmczJfZGl2aWRlX3hhdHRyX2J1Y2tldChpbm9kZSwgaGFuZGxlLCBzdGFydF9ibGssCi0JCQkJCXN0YXJ0X2JsayArIGJsa19wZXJfYnVja2V0LCBOVUxMLCAwKTsKKwkvKiBNb3ZlIGhhbGYgb2YgdGhlIHhhdHRyIGluIHRhcmdldF9ibGtubyB0byB0aGUgbmV4dCBidWNrZXQuICovCisJcmV0ID0gb2NmczJfZGl2aWRlX3hhdHRyX2J1Y2tldChpbm9kZSwgaGFuZGxlLCB0YXJnZXRfYmxrLAorCQkJCQl0YXJnZXRfYmxrICsgYmxrX3Blcl9idWNrZXQsIE5VTEwsIDApOwogCi0JbGUxNl9hZGRfY3B1KCZmaXJzdF94aC0+eGhfbnVtX2J1Y2tldHMsIDEpOwotCW9jZnMyX2pvdXJuYWxfZGlydHkoaGFuZGxlLCBmaXJzdF9iaCk7CisJbGUxNl9hZGRfY3B1KCZidWNrZXRfeGgoZmlyc3QpLT54aF9udW1fYnVja2V0cywgMSk7CisJb2NmczJfeGF0dHJfYnVja2V0X2pvdXJuYWxfZGlydHkoaGFuZGxlLCBmaXJzdCk7CiAKLWNvbW1pdDoKLQlvY2ZzMl9jb21taXRfdHJhbnMob3NiLCBoYW5kbGUpOwogb3V0OgogCXJldHVybiByZXQ7CiB9CiAKIC8qCi0gKiBBZGQgbmV3IHhhdHRyIGJ1Y2tldCBpbiBhbiBleHRlbnQgcmVjb3JkIGFuZCBhZGp1c3QgdGhlIGJ1Y2tldHMgYWNjb3JkaW5nbHkuCi0gKiB4Yl9iaCBpcyB0aGUgb2NmczJfeGF0dHJfYmxvY2suCi0gKiBXZSB3aWxsIG1vdmUgYWxsIHRoZSBidWNrZXRzIHN0YXJ0aW5nIGZyb20gaGVhZGVyX2JoIHRvIHRoZSBuZXh0IHBsYWNlLiBBcwotICogZm9yIHRoaXMgb25lLCBoYWxmIG51bSBvZiBpdHMgeGF0dHJzIHdpbGwgYmUgbW92ZWQgdG8gdGhlIG5leHQgb25lLgorICogQWRkIG5ldyB4YXR0ciBidWNrZXQgaW4gYW4gZXh0ZW50IHJlY29yZCBhbmQgYWRqdXN0IHRoZSBidWNrZXRzCisgKiBhY2NvcmRpbmdseS4gIHhiX2JoIGlzIHRoZSBvY2ZzMl94YXR0cl9ibG9jaywgYW5kIHRhcmdldCBpcyB0aGUKKyAqIGJ1Y2tldCB3ZSB3YW50IHRvIGluc2VydCBpbnRvLgogICoKLSAqIFdlIHdpbGwgYWxsb2NhdGUgYSBuZXcgY2x1c3RlciBpZiBjdXJyZW50IGNsdXN0ZXIgaXMgZnVsbCBhbmQgYWRqdXN0Ci0gKiBoZWFkZXJfYmggYW5kIGZpcnN0X2JoIGlmIHRoZSBpbnNlcnQgcGxhY2UgaXMgbW92ZWQgdG8gdGhlIG5ldyBjbHVzdGVyLgorICogSW4gdGhlIGVhc3kgY2FzZSwgd2Ugd2lsbCBtb3ZlIGFsbCB0aGUgYnVja2V0cyBhZnRlciB0YXJnZXQgZG93biBieQorICogb25lLiBIYWxmIG9mIHRhcmdldCdzIHhhdHRycyB3aWxsIGJlIG1vdmVkIHRvIHRoZSBuZXh0IGJ1Y2tldC4KKyAqCisgKiBJZiBjdXJyZW50IGNsdXN0ZXIgaXMgZnVsbCwgd2UnbGwgYWxsb2NhdGUgYSBuZXcgb25lLiAgVGhpcyBtYXkgbm90CisgKiBiZSBjb250aWd1b3VzLiAgVGhlIHVuZGVybHlpbmcgY2FsbHMgd2lsbCBtYWtlIHN1cmUgdGhhdCB0aGVyZSBpcworICogc3BhY2UgZm9yIHRoZSBpbnNlcnQsIHNoaWZ0aW5nIGJ1Y2tldHMgYXJvdW5kIGlmIG5lY2Vzc2FyeS4KKyAqICd0YXJnZXQnIG1heSBiZSBtb3ZlZCBieSB0aG9zZSBjYWxscy4KICAqLwogc3RhdGljIGludCBvY2ZzMl9hZGRfbmV3X3hhdHRyX2J1Y2tldChzdHJ1Y3QgaW5vZGUgKmlub2RlLAogCQkJCSAgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqeGJfYmgsCi0JCQkJICAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpoZWFkZXJfYmgpCisJCQkJICAgICAgc3RydWN0IG9jZnMyX3hhdHRyX2J1Y2tldCAqdGFyZ2V0LAorCQkJCSAgICAgIHN0cnVjdCBvY2ZzMl94YXR0cl9zZXRfY3R4dCAqY3R4dCkKIHsKLQlzdHJ1Y3Qgb2NmczJfeGF0dHJfaGVhZGVyICpmaXJzdF94aCA9IE5VTEw7Ci0Jc3RydWN0IGJ1ZmZlcl9oZWFkICpmaXJzdF9iaCA9IE5VTEw7CiAJc3RydWN0IG9jZnMyX3hhdHRyX2Jsb2NrICp4YiA9CiAJCQkoc3RydWN0IG9jZnMyX3hhdHRyX2Jsb2NrICopeGJfYmgtPmJfZGF0YTsKIAlzdHJ1Y3Qgb2NmczJfeGF0dHJfdHJlZV9yb290ICp4Yl9yb290ID0gJnhiLT54Yl9hdHRycy54Yl9yb290OwogCXN0cnVjdCBvY2ZzMl9leHRlbnRfbGlzdCAqZWwgPSAmeGJfcm9vdC0+eHRfbGlzdDsKLQlzdHJ1Y3Qgb2NmczJfeGF0dHJfaGVhZGVyICp4aCA9Ci0JCQkoc3RydWN0IG9jZnMyX3hhdHRyX2hlYWRlciAqKWhlYWRlcl9iaC0+Yl9kYXRhOwotCXUzMiBuYW1lX2hhc2ggPSBsZTMyX3RvX2NwdSh4aC0+eGhfZW50cmllc1swXS54ZV9uYW1lX2hhc2gpOwotCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS0+aV9zYjsKLQlzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiA9IE9DRlMyX1NCKHNiKTsKKwl1MzIgbmFtZV9oYXNoID0KKwkJbGUzMl90b19jcHUoYnVja2V0X3hoKHRhcmdldCktPnhoX2VudHJpZXNbMF0ueGVfbmFtZV9oYXNoKTsKKwlzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiA9IE9DRlMyX1NCKGlub2RlLT5pX3NiKTsKIAlpbnQgcmV0LCBudW1fYnVja2V0cywgZXh0ZW5kID0gMTsKIAl1NjQgcF9ibGtubzsKIAl1MzIgZV9jcG9zLCBudW1fY2x1c3RlcnM7CisJLyogVGhlIGJ1Y2tldCBhdCB0aGUgZnJvbnQgb2YgdGhlIGV4dGVudCAqLworCXN0cnVjdCBvY2ZzMl94YXR0cl9idWNrZXQgKmZpcnN0OwogCi0JbWxvZygwLCAiQWRkIG5ldyB4YXR0ciBidWNrZXQgc3RhcnRpbmcgZm9ybSAlbGx1XG4iLAotCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyloZWFkZXJfYmgtPmJfYmxvY2tucik7CisJbWxvZygwLCAiQWRkIG5ldyB4YXR0ciBidWNrZXQgc3RhcnRpbmcgZnJvbSAlbGx1XG4iLAorCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylidWNrZXRfYmxrbm8odGFyZ2V0KSk7CiAKLQkvKgotCSAqIEFkZCByZWZyZW5jZSBmb3IgaGVhZGVyX2JoIGhlcmUgYmVjYXVzZSBpdCBtYXkgYmUKLQkgKiBjaGFuZ2VkIGluIG9jZnMyX2FkZF9uZXdfeGF0dHJfY2x1c3RlciBhbmQgd2UgbmVlZAotCSAqIHRvIGZyZWUgaXQgaW4gdGhlIGVuZC4KLQkgKi8KLQlnZXRfYmgoaGVhZGVyX2JoKTsKKwkvKiBUaGUgZmlyc3QgYnVja2V0IG9mIHRoZSBvcmlnaW5hbCBleHRlbnQgKi8KKwlmaXJzdCA9IG9jZnMyX3hhdHRyX2J1Y2tldF9uZXcoaW5vZGUpOworCWlmICghZmlyc3QpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dDsKKwl9CiAKIAlyZXQgPSBvY2ZzMl94YXR0cl9nZXRfcmVjKGlub2RlLCBuYW1lX2hhc2gsICZwX2Jsa25vLCAmZV9jcG9zLAogCQkJCSAgJm51bV9jbHVzdGVycywgZWwpOwpAQCAtMzg4NSw0MCArNDQ0OCw0NSBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQlyZXQgPSBvY2ZzMl9yZWFkX2Jsb2NrKGlub2RlLCBwX2Jsa25vLCAmZmlyc3RfYmgpOworCXJldCA9IG9jZnMyX3JlYWRfeGF0dHJfYnVja2V0KGZpcnN0LCBwX2Jsa25vKTsKIAlpZiAocmV0KSB7CiAJCW1sb2dfZXJybm8ocmV0KTsKIAkJZ290byBvdXQ7CiAJfQogCiAJbnVtX2J1Y2tldHMgPSBvY2ZzMl94YXR0cl9idWNrZXRzX3Blcl9jbHVzdGVyKG9zYikgKiBudW1fY2x1c3RlcnM7Ci0JZmlyc3RfeGggPSAoc3RydWN0IG9jZnMyX3hhdHRyX2hlYWRlciAqKWZpcnN0X2JoLT5iX2RhdGE7Ci0KLQlpZiAobnVtX2J1Y2tldHMgPT0gbGUxNl90b19jcHUoZmlyc3RfeGgtPnhoX251bV9idWNrZXRzKSkgeworCWlmIChudW1fYnVja2V0cyA9PSBsZTE2X3RvX2NwdShidWNrZXRfeGgoZmlyc3QpLT54aF9udW1fYnVja2V0cykpIHsKKwkJLyoKKwkJICogVGhpcyBjYW4gbW92ZSBmaXJzdCt0YXJnZXQgaWYgdGhlIHRhcmdldCBidWNrZXQgbW92ZXMKKwkJICogdG8gdGhlIG5ldyBleHRlbnQuCisJCSAqLwogCQlyZXQgPSBvY2ZzMl9hZGRfbmV3X3hhdHRyX2NsdXN0ZXIoaW5vZGUsCiAJCQkJCQkgIHhiX2JoLAotCQkJCQkJICAmZmlyc3RfYmgsCi0JCQkJCQkgICZoZWFkZXJfYmgsCisJCQkJCQkgIGZpcnN0LAorCQkJCQkJICB0YXJnZXQsCiAJCQkJCQkgICZudW1fY2x1c3RlcnMsCiAJCQkJCQkgIGVfY3BvcywKLQkJCQkJCSAgcF9ibGtubywKLQkJCQkJCSAgJmV4dGVuZCk7CisJCQkJCQkgICZleHRlbmQsCisJCQkJCQkgIGN0eHQpOwogCQlpZiAocmV0KSB7CiAJCQltbG9nX2Vycm5vKHJldCk7CiAJCQlnb3RvIG91dDsKIAkJfQogCX0KIAotCWlmIChleHRlbmQpCisJaWYgKGV4dGVuZCkgewogCQlyZXQgPSBvY2ZzMl9leHRlbmRfeGF0dHJfYnVja2V0KGlub2RlLAotCQkJCQkJZmlyc3RfYmgsCi0JCQkJCQloZWFkZXJfYmgsCisJCQkJCQljdHh0LT5oYW5kbGUsCisJCQkJCQlmaXJzdCwKKwkJCQkJCWJ1Y2tldF9ibGtubyh0YXJnZXQpLAogCQkJCQkJbnVtX2NsdXN0ZXJzKTsKLQlpZiAocmV0KQotCQltbG9nX2Vycm5vKHJldCk7CisJCWlmIChyZXQpCisJCQltbG9nX2Vycm5vKHJldCk7CisJfQorCiBvdXQ6Ci0JYnJlbHNlKGZpcnN0X2JoKTsKLQlicmVsc2UoaGVhZGVyX2JoKTsKKwlvY2ZzMl94YXR0cl9idWNrZXRfZnJlZShmaXJzdCk7CisKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0zOTI5LDcgKzQ0OTcsNyBAQAogCWludCBibG9ja19vZmYgPSBvZmZzID4+IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzOwogCiAJb2ZmcyA9IG9mZnMgJSBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemU7Ci0JcmV0dXJuIGJ1Y2tldC0+YmhzW2Jsb2NrX29mZl0tPmJfZGF0YSArIG9mZnM7CisJcmV0dXJuIGJ1Y2tldF9ibG9jayhidWNrZXQsIGJsb2NrX29mZikgKyBvZmZzOwogfQogCiAvKgpAQCAtMzk4NCw3ICs0NTUyLDcgQEAKIAkJCQl4ZS0+eGVfdmFsdWVfc2l6ZSA9IDA7CiAKIAkJCXZhbCA9IG9jZnMyX3hhdHRyX2J1Y2tldF9nZXRfdmFsKGlub2RlLAotCQkJCQkJCSAmeHMtPmJ1Y2tldCwgb2Zmcyk7CisJCQkJCQkJIHhzLT5idWNrZXQsIG9mZnMpOwogCQkJbWVtc2V0KHZhbCArIE9DRlMyX1hBVFRSX1NJWkUobmFtZV9sZW4pLCAwLAogCQkJICAgICAgIHNpemUgLSBPQ0ZTMl9YQVRUUl9TSVpFKG5hbWVfbGVuKSk7CiAJCQlpZiAoT0NGUzJfWEFUVFJfU0laRSh4aS0+dmFsdWVfbGVuKSA+IDApCkBAIC00MDYyLDggKzQ2MzAsNyBAQAogCQl4aC0+eGhfZnJlZV9zdGFydCA9IGNwdV90b19sZTE2KG9mZnMpOwogCX0KIAotCXZhbCA9IG9jZnMyX3hhdHRyX2J1Y2tldF9nZXRfdmFsKGlub2RlLAotCQkJCQkgJnhzLT5idWNrZXQsIG9mZnMgLSBzaXplKTsKKwl2YWwgPSBvY2ZzMl94YXR0cl9idWNrZXRfZ2V0X3ZhbChpbm9kZSwgeHMtPmJ1Y2tldCwgb2ZmcyAtIHNpemUpOwogCXhlLT54ZV9uYW1lX29mZnNldCA9IGNwdV90b19sZTE2KG9mZnMgLSBzaXplKTsKIAogCW1lbXNldCh2YWwsIDAsIHNpemUpOwpAQCAtNDA3OSwxMjUgKzQ2NDYsNDUgQEAKIAlyZXR1cm47CiB9CiAKLXN0YXRpYyBpbnQgb2NmczJfeGF0dHJfYnVja2V0X2hhbmRsZV9qb3VybmFsKHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCQkJCSAgICAgaGFuZGxlX3QgKmhhbmRsZSwKLQkJCQkJICAgICBzdHJ1Y3Qgb2NmczJfeGF0dHJfc2VhcmNoICp4cywKLQkJCQkJICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKipiaHMsCi0JCQkJCSAgICAgdTE2IGJoX251bSkKLXsKLQlpbnQgcmV0ID0gMCwgb2ZmLCBibG9ja19vZmY7Ci0Jc3RydWN0IG9jZnMyX3hhdHRyX2VudHJ5ICp4ZSA9IHhzLT5oZXJlOwotCi0JLyoKLQkgKiBGaXJzdCBjYWxjdWxhdGUgYWxsIHRoZSBibG9ja3Mgd2Ugc2hvdWxkIGpvdXJuYWxfYWNjZXNzCi0JICogYW5kIGpvdXJuYWxfZGlydHkuIFRoZSBmaXJzdCBibG9jayBzaG91bGQgYWx3YXlzIGJlIHRvdWNoZWQuCi0JICovCi0JcmV0ID0gb2NmczJfam91cm5hbF9kaXJ0eShoYW5kbGUsIGJoc1swXSk7Ci0JaWYgKHJldCkKLQkJbWxvZ19lcnJubyhyZXQpOwotCi0JLyogY2FsYyB0aGUgZGF0YS4gKi8KLQlvZmYgPSBsZTE2X3RvX2NwdSh4ZS0+eGVfbmFtZV9vZmZzZXQpOwotCWJsb2NrX29mZiA9IG9mZiA+PiBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemVfYml0czsKLQlyZXQgPSBvY2ZzMl9qb3VybmFsX2RpcnR5KGhhbmRsZSwgYmhzW2Jsb2NrX29mZl0pOwotCWlmIChyZXQpCi0JCW1sb2dfZXJybm8ocmV0KTsKLQotCXJldHVybiByZXQ7Ci19Ci0KIC8qCiAgKiBTZXQgdGhlIHhhdHRyIGVudHJ5IGluIHRoZSBzcGVjaWZpZWQgYnVja2V0LgogICogVGhlIGJ1Y2tldCBpcyBpbmRpY2F0ZWQgYnkgeHMtPmJ1Y2tldCBhbmQgaXQgc2hvdWxkIGhhdmUgdGhlIGVub3VnaAogICogc3BhY2UgZm9yIHRoZSB4YXR0ciBpbnNlcnRpb24uCiAgKi8KIHN0YXRpYyBpbnQgb2NmczJfeGF0dHJfc2V0X2VudHJ5X2luX2J1Y2tldChzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCQkgICBoYW5kbGVfdCAqaGFuZGxlLAogCQkJCQkgICBzdHJ1Y3Qgb2NmczJfeGF0dHJfaW5mbyAqeGksCiAJCQkJCSAgIHN0cnVjdCBvY2ZzMl94YXR0cl9zZWFyY2ggKnhzLAogCQkJCQkgICB1MzIgbmFtZV9oYXNoLAogCQkJCQkgICBpbnQgbG9jYWwpCiB7Ci0JaW50IGksIHJldDsKLQloYW5kbGVfdCAqaGFuZGxlID0gTlVMTDsKLQl1MTYgYmxrX3Blcl9idWNrZXQgPSBvY2ZzMl9ibG9ja3NfcGVyX3hhdHRyX2J1Y2tldChpbm9kZS0+aV9zYik7Ci0Jc3RydWN0IG9jZnMyX3N1cGVyICpvc2IgPSBPQ0ZTMl9TQihpbm9kZS0+aV9zYik7CisJaW50IHJldDsKKwl1NjQgYmxrbm87CiAKIAltbG9nKDAsICJTZXQgeGF0dHIgZW50cnkgbGVuID0gJWx1IGluZGV4ID0gJWQgaW4gYnVja2V0ICVsbHVcbiIsCiAJICAgICAodW5zaWduZWQgbG9uZyl4aS0+dmFsdWVfbGVuLCB4aS0+bmFtZV9pbmRleCwKLQkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpeHMtPmJ1Y2tldC5iaHNbMF0tPmJfYmxvY2tucik7CisJICAgICAodW5zaWduZWQgbG9uZyBsb25nKWJ1Y2tldF9ibGtubyh4cy0+YnVja2V0KSk7CiAKLQlpZiAoIXhzLT5idWNrZXQuYmhzWzFdKSB7Ci0JCXJldCA9IG9jZnMyX3JlYWRfYmxvY2tzKGlub2RlLAotCQkJCQl4cy0+YnVja2V0LmJoc1swXS0+Yl9ibG9ja25yICsgMSwKLQkJCQkJYmxrX3Blcl9idWNrZXQgLSAxLCAmeHMtPmJ1Y2tldC5iaHNbMV0sCi0JCQkJCTApOworCWlmICgheHMtPmJ1Y2tldC0+YnVfYmhzWzFdKSB7CisJCWJsa25vID0gYnVja2V0X2Jsa25vKHhzLT5idWNrZXQpOworCQlvY2ZzMl94YXR0cl9idWNrZXRfcmVsc2UoeHMtPmJ1Y2tldCk7CisJCXJldCA9IG9jZnMyX3JlYWRfeGF0dHJfYnVja2V0KHhzLT5idWNrZXQsIGJsa25vKTsKIAkJaWYgKHJldCkgewogCQkJbWxvZ19lcnJubyhyZXQpOwogCQkJZ290byBvdXQ7CiAJCX0KIAl9CiAKLQloYW5kbGUgPSBvY2ZzMl9zdGFydF90cmFucyhvc2IsIGJsa19wZXJfYnVja2V0KTsKLQlpZiAoSVNfRVJSKGhhbmRsZSkpIHsKLQkJcmV0ID0gUFRSX0VSUihoYW5kbGUpOwotCQloYW5kbGUgPSBOVUxMOworCXJldCA9IG9jZnMyX3hhdHRyX2J1Y2tldF9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIHhzLT5idWNrZXQsCisJCQkJCQlPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CisJaWYgKHJldCA8IDApIHsKIAkJbWxvZ19lcnJubyhyZXQpOwogCQlnb3RvIG91dDsKIAl9CiAKLQlmb3IgKGkgPSAwOyBpIDwgYmxrX3Blcl9idWNrZXQ7IGkrKykgewotCQlyZXQgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGlub2RlLCB4cy0+YnVja2V0LmJoc1tpXSwKLQkJCQkJICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOwotCQlpZiAocmV0IDwgMCkgewotCQkJbWxvZ19lcnJubyhyZXQpOwotCQkJZ290byBvdXQ7Ci0JCX0KLQl9Ci0KIAlvY2ZzMl94YXR0cl9zZXRfZW50cnlfbm9ybWFsKGlub2RlLCB4aSwgeHMsIG5hbWVfaGFzaCwgbG9jYWwpOworCW9jZnMyX3hhdHRyX2J1Y2tldF9qb3VybmFsX2RpcnR5KGhhbmRsZSwgeHMtPmJ1Y2tldCk7CiAKLQkvKk9ubHkgZGlydHkgdGhlIGJsb2NrcyB3ZSBoYXZlIHRvdWNoZWQgaW4gc2V0IHhhdHRyLiAqLwotCXJldCA9IG9jZnMyX3hhdHRyX2J1Y2tldF9oYW5kbGVfam91cm5hbChpbm9kZSwgaGFuZGxlLCB4cywKLQkJCQkJCXhzLT5idWNrZXQuYmhzLCBibGtfcGVyX2J1Y2tldCk7Ci0JaWYgKHJldCkKLQkJbWxvZ19lcnJubyhyZXQpOwotb3V0OgotCW9jZnMyX2NvbW1pdF90cmFucyhvc2IsIGhhbmRsZSk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IG9jZnMyX3hhdHRyX3ZhbHVlX3VwZGF0ZV9zaXplKHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCQkJCSBzdHJ1Y3QgYnVmZmVyX2hlYWQgKnhlX2JoLAotCQkJCQkgc3RydWN0IG9jZnMyX3hhdHRyX2VudHJ5ICp4ZSwKLQkJCQkJIHU2NCBuZXdfc2l6ZSkKLXsKLQlpbnQgcmV0OwotCXN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiID0gT0NGUzJfU0IoaW5vZGUtPmlfc2IpOwotCWhhbmRsZV90ICpoYW5kbGUgPSBOVUxMOwotCi0JaGFuZGxlID0gb2NmczJfc3RhcnRfdHJhbnMob3NiLCAxKTsKLQlpZiAoSVNfRVJSKGhhbmRsZSkpIHsKLQkJcmV0ID0gLUVOT01FTTsKLQkJbWxvZ19lcnJubyhyZXQpOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlyZXQgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGlub2RlLCB4ZV9iaCwKLQkJCQkgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7Ci0JaWYgKHJldCA8IDApIHsKLQkJbWxvZ19lcnJubyhyZXQpOwotCQlnb3RvIG91dF9jb21taXQ7Ci0JfQotCi0JeGUtPnhlX3ZhbHVlX3NpemUgPSBjcHVfdG9fbGU2NChuZXdfc2l6ZSk7Ci0KLQlyZXQgPSBvY2ZzMl9qb3VybmFsX2RpcnR5KGhhbmRsZSwgeGVfYmgpOwotCWlmIChyZXQgPCAwKQotCQltbG9nX2Vycm5vKHJldCk7Ci0KLW91dF9jb21taXQ6Ci0Jb2NmczJfY29tbWl0X3RyYW5zKG9zYiwgaGFuZGxlKTsKIG91dDoKIAlyZXR1cm4gcmV0OwogfQpAQCAtNDIxMCwxOCArNDY5NywxOSBAQAogICogQ29weSB0aGUgbmV3IHVwZGF0ZWQgeGUgYW5kIHhlX3ZhbHVlX3Jvb3QgdG8gbmV3X3hlIGFuZCBuZXdfeHYgaWYgbmVlZGVkLgogICovCiBzdGF0aWMgaW50IG9jZnMyX3hhdHRyX2J1Y2tldF92YWx1ZV90cnVuY2F0ZShzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCQkJCQkgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqaGVhZGVyX2JoLAorCQkJCQkgICAgIHN0cnVjdCBvY2ZzMl94YXR0cl9idWNrZXQgKmJ1Y2tldCwKIAkJCQkJICAgICBpbnQgeGVfb2ZmLAotCQkJCQkgICAgIGludCBsZW4pCisJCQkJCSAgICAgaW50IGxlbiwKKwkJCQkJICAgICBzdHJ1Y3Qgb2NmczJfeGF0dHJfc2V0X2N0eHQgKmN0eHQpCiB7CiAJaW50IHJldCwgb2Zmc2V0OwogCXU2NCB2YWx1ZV9ibGs7Ci0Jc3RydWN0IGJ1ZmZlcl9oZWFkICp2YWx1ZV9iaCA9IE5VTEw7Ci0Jc3RydWN0IG9jZnMyX3hhdHRyX3ZhbHVlX3Jvb3QgKnh2OwogCXN0cnVjdCBvY2ZzMl94YXR0cl9lbnRyeSAqeGU7Ci0Jc3RydWN0IG9jZnMyX3hhdHRyX2hlYWRlciAqeGggPQotCQkJKHN0cnVjdCBvY2ZzMl94YXR0cl9oZWFkZXIgKiloZWFkZXJfYmgtPmJfZGF0YTsKKwlzdHJ1Y3Qgb2NmczJfeGF0dHJfaGVhZGVyICp4aCA9IGJ1Y2tldF94aChidWNrZXQpOwogCXNpemVfdCBibG9ja3NpemUgPSBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemU7CisJc3RydWN0IG9jZnMyX3hhdHRyX3ZhbHVlX2J1ZiB2YiA9IHsKKwkJLnZiX2FjY2VzcyA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzLAorCX07CiAKIAl4ZSA9ICZ4aC0+eGhfZW50cmllc1t4ZV9vZmZdOwogCkBAIC00MjM0LDQ5ICs0NzIyLDU4IEBACiAKIAkvKiBXZSBkb24ndCBhbGxvdyBvY2ZzMl94YXR0cl92YWx1ZSB0byBiZSBzdG9yZWQgaW4gZGlmZmVyZW50IGJsb2NrLiAqLwogCUJVR19PTih2YWx1ZV9ibGsgIT0gKG9mZnNldCArIE9DRlMyX1hBVFRSX1JPT1RfU0laRSAtIDEpIC8gYmxvY2tzaXplKTsKLQl2YWx1ZV9ibGsgKz0gaGVhZGVyX2JoLT5iX2Jsb2NrbnI7CiAKLQlyZXQgPSBvY2ZzMl9yZWFkX2Jsb2NrKGlub2RlLCB2YWx1ZV9ibGssICZ2YWx1ZV9iaCk7CisJdmIudmJfYmggPSBidWNrZXQtPmJ1X2Joc1t2YWx1ZV9ibGtdOworCUJVR19PTighdmIudmJfYmgpOworCisJdmIudmJfeHYgPSAoc3RydWN0IG9jZnMyX3hhdHRyX3ZhbHVlX3Jvb3QgKikKKwkJKHZiLnZiX2JoLT5iX2RhdGEgKyBvZmZzZXQgJSBibG9ja3NpemUpOworCisJcmV0ID0gb2NmczJfeGF0dHJfYnVja2V0X2pvdXJuYWxfYWNjZXNzKGN0eHQtPmhhbmRsZSwgYnVja2V0LAorCQkJCQkJT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOwogCWlmIChyZXQpIHsKIAkJbWxvZ19lcnJubyhyZXQpOwogCQlnb3RvIG91dDsKIAl9CiAKLQl4diA9IChzdHJ1Y3Qgb2NmczJfeGF0dHJfdmFsdWVfcm9vdCAqKQotCQkodmFsdWVfYmgtPmJfZGF0YSArIG9mZnNldCAlIGJsb2Nrc2l6ZSk7Ci0KKwkvKgorCSAqIEZyb20gaGVyZSBvbiBvdXQgd2UgaGF2ZSB0byBkaXJ0eSB0aGUgYnVja2V0LiAgVGhlIGdlbmVyaWMKKwkgKiB2YWx1ZSBjYWxscyBvbmx5IG1vZGlmeSBvbmUgb2YgdGhlIGJ1Y2tldCdzIGJocywgYnV0IHdlIG5lZWQKKwkgKiB0byBzZW5kIHRoZSBidWNrZXQgYXQgb25jZS4gIFNvIGlmIHRoZXkgZXJyb3IsIHRoZXkgKmNvdWxkKiBoYXZlCisJICogbW9kaWZpZWQgc29tZXRoaW5nLiAgV2UgaGF2ZSB0byBhc3N1bWUgdGhleSBkaWQsIGFuZCBkaXJ0eQorCSAqIHRoZSB3aG9sZSBidWNrZXQuICBUaGlzIGxlYXZlcyB1cyBpbiBhIGNvbnNpc3RlbnQgc3RhdGUuCisJICovCiAJbWxvZygwLCAidHJ1bmNhdGUgJXUgaW4geGF0dHIgYnVja2V0ICVsbHUgdG8gJWQgYnl0ZXMuXG4iLAotCSAgICAgeGVfb2ZmLCAodW5zaWduZWQgbG9uZyBsb25nKWhlYWRlcl9iaC0+Yl9ibG9ja25yLCBsZW4pOwotCXJldCA9IG9jZnMyX3hhdHRyX3ZhbHVlX3RydW5jYXRlKGlub2RlLCB2YWx1ZV9iaCwgeHYsIGxlbik7CisJICAgICB4ZV9vZmYsICh1bnNpZ25lZCBsb25nIGxvbmcpYnVja2V0X2Jsa25vKGJ1Y2tldCksIGxlbik7CisJcmV0ID0gb2NmczJfeGF0dHJfdmFsdWVfdHJ1bmNhdGUoaW5vZGUsICZ2YiwgbGVuLCBjdHh0KTsKIAlpZiAocmV0KSB7CiAJCW1sb2dfZXJybm8ocmV0KTsKLQkJZ290byBvdXQ7CisJCWdvdG8gb3V0X2RpcnR5OwogCX0KIAotCXJldCA9IG9jZnMyX3hhdHRyX3ZhbHVlX3VwZGF0ZV9zaXplKGlub2RlLCBoZWFkZXJfYmgsIHhlLCBsZW4pOwotCWlmIChyZXQpIHsKLQkJbWxvZ19lcnJubyhyZXQpOwotCQlnb3RvIG91dDsKLQl9CisJeGUtPnhlX3ZhbHVlX3NpemUgPSBjcHVfdG9fbGU2NChsZW4pOworCitvdXRfZGlydHk6CisJb2NmczJfeGF0dHJfYnVja2V0X2pvdXJuYWxfZGlydHkoY3R4dC0+aGFuZGxlLCBidWNrZXQpOwogCiBvdXQ6Ci0JYnJlbHNlKHZhbHVlX2JoKTsKIAlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IG9jZnMyX3hhdHRyX2J1Y2tldF92YWx1ZV90cnVuY2F0ZV94cyhzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCQkJCQkJc3RydWN0IG9jZnMyX3hhdHRyX3NlYXJjaCAqeHMsCi0JCQkJCQlpbnQgbGVuKQorCQkJCQlzdHJ1Y3Qgb2NmczJfeGF0dHJfc2VhcmNoICp4cywKKwkJCQkJaW50IGxlbiwKKwkJCQkJc3RydWN0IG9jZnMyX3hhdHRyX3NldF9jdHh0ICpjdHh0KQogewogCWludCByZXQsIG9mZnNldDsKIAlzdHJ1Y3Qgb2NmczJfeGF0dHJfZW50cnkgKnhlID0geHMtPmhlcmU7CiAJc3RydWN0IG9jZnMyX3hhdHRyX2hlYWRlciAqeGggPSAoc3RydWN0IG9jZnMyX3hhdHRyX2hlYWRlciAqKXhzLT5iYXNlOwogCi0JQlVHX09OKCF4cy0+YnVja2V0LmJoc1swXSB8fCAheGUgfHwgb2NmczJfeGF0dHJfaXNfbG9jYWwoeGUpKTsKKwlCVUdfT04oIXhzLT5idWNrZXQtPmJ1X2Joc1swXSB8fCAheGUgfHwgb2NmczJfeGF0dHJfaXNfbG9jYWwoeGUpKTsKIAogCW9mZnNldCA9IHhlIC0geGgtPnhoX2VudHJpZXM7Ci0JcmV0ID0gb2NmczJfeGF0dHJfYnVja2V0X3ZhbHVlX3RydW5jYXRlKGlub2RlLCB4cy0+YnVja2V0LmJoc1swXSwKLQkJCQkJCW9mZnNldCwgbGVuKTsKKwlyZXQgPSBvY2ZzMl94YXR0cl9idWNrZXRfdmFsdWVfdHJ1bmNhdGUoaW5vZGUsIHhzLT5idWNrZXQsCisJCQkJCQlvZmZzZXQsIGxlbiwgY3R4dCk7CiAJaWYgKHJldCkKIAkJbWxvZ19lcnJubyhyZXQpOwogCkBAIC00Mjg0LDYgKzQ3ODEsNyBAQAogfQogCiBzdGF0aWMgaW50IG9jZnMyX3hhdHRyX2J1Y2tldF9zZXRfdmFsdWVfb3V0c2lkZShzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCQkJaGFuZGxlX3QgKmhhbmRsZSwKIAkJCQkJCXN0cnVjdCBvY2ZzMl94YXR0cl9zZWFyY2ggKnhzLAogCQkJCQkJY2hhciAqdmFsLAogCQkJCQkJaW50IHZhbHVlX2xlbikKQEAgLTQyOTksNyArNDc5Nyw4IEBACiAKIAl4diA9IChzdHJ1Y3Qgb2NmczJfeGF0dHJfdmFsdWVfcm9vdCAqKSh4cy0+YmFzZSArIG9mZnNldCk7CiAKLQlyZXR1cm4gX19vY2ZzMl94YXR0cl9zZXRfdmFsdWVfb3V0c2lkZShpbm9kZSwgeHYsIHZhbCwgdmFsdWVfbGVuKTsKKwlyZXR1cm4gX19vY2ZzMl94YXR0cl9zZXRfdmFsdWVfb3V0c2lkZShpbm9kZSwgaGFuZGxlLAorCQkJCQkgICAgICAgeHYsIHZhbCwgdmFsdWVfbGVuKTsKIH0KIAogc3RhdGljIGludCBvY2ZzMl9ybV94YXR0cl9jbHVzdGVyKHN0cnVjdCBpbm9kZSAqaW5vZGUsCkBAIC00MzQzLDE1ICs0ODQyLDE1IEBACiAJCX0KIAl9CiAKLQloYW5kbGUgPSBvY2ZzMl9zdGFydF90cmFucyhvc2IsIE9DRlMyX1JFTU9WRV9FWFRFTlRfQ1JFRElUUyk7CisJaGFuZGxlID0gb2NmczJfc3RhcnRfdHJhbnMob3NiLCBvY2ZzMl9yZW1vdmVfZXh0ZW50X2NyZWRpdHMob3NiLT5zYikpOwogCWlmIChJU19FUlIoaGFuZGxlKSkgewogCQlyZXQgPSAtRU5PTUVNOwogCQltbG9nX2Vycm5vKHJldCk7CiAJCWdvdG8gb3V0OwogCX0KIAotCXJldCA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgaW5vZGUsIHJvb3RfYmgsCi0JCQkJICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOworCXJldCA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzX3hiKGhhbmRsZSwgaW5vZGUsIHJvb3RfYmgsCisJCQkJICAgICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOwogCWlmIChyZXQpIHsKIAkJbWxvZ19lcnJubyhyZXQpOwogCQlnb3RvIG91dF9jb21taXQ7CkBAIC00MzkyLDI2ICs0ODkxLDE5IEBACiB9CiAKIHN0YXRpYyB2b2lkIG9jZnMyX3hhdHRyX2J1Y2tldF9yZW1vdmVfeHMoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkJIGhhbmRsZV90ICpoYW5kbGUsCiAJCQkJCSBzdHJ1Y3Qgb2NmczJfeGF0dHJfc2VhcmNoICp4cykKIHsKLQloYW5kbGVfdCAqaGFuZGxlID0gTlVMTDsKLQlzdHJ1Y3Qgb2NmczJfeGF0dHJfaGVhZGVyICp4aCA9IHhzLT5idWNrZXQueGg7CisJc3RydWN0IG9jZnMyX3hhdHRyX2hlYWRlciAqeGggPSBidWNrZXRfeGgoeHMtPmJ1Y2tldCk7CiAJc3RydWN0IG9jZnMyX3hhdHRyX2VudHJ5ICpsYXN0ID0gJnhoLT54aF9lbnRyaWVzWwogCQkJCQkJbGUxNl90b19jcHUoeGgtPnhoX2NvdW50KSAtIDFdOwogCWludCByZXQgPSAwOwogCi0JaGFuZGxlID0gb2NmczJfc3RhcnRfdHJhbnMoKE9DRlMyX1NCKGlub2RlLT5pX3NiKSksIDEpOwotCWlmIChJU19FUlIoaGFuZGxlKSkgewotCQlyZXQgPSBQVFJfRVJSKGhhbmRsZSk7Ci0JCW1sb2dfZXJybm8ocmV0KTsKLQkJcmV0dXJuOwotCX0KLQotCXJldCA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgaW5vZGUsIHhzLT5idWNrZXQuYmhzWzBdLAotCQkJCSAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKKwlyZXQgPSBvY2ZzMl94YXR0cl9idWNrZXRfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCB4cy0+YnVja2V0LAorCQkJCQkJT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOwogCWlmIChyZXQpIHsKIAkJbWxvZ19lcnJubyhyZXQpOwotCQlnb3RvIG91dF9jb21taXQ7CisJCXJldHVybjsKIAl9CiAKIAkvKiBSZW1vdmUgdGhlIG9sZCBlbnRyeS4gKi8KQEAgLTQ0MjAsMTEgKzQ5MTIsNyBAQAogCW1lbXNldChsYXN0LCAwLCBzaXplb2Yoc3RydWN0IG9jZnMyX3hhdHRyX2VudHJ5KSk7CiAJbGUxNl9hZGRfY3B1KCZ4aC0+eGhfY291bnQsIC0xKTsKIAotCXJldCA9IG9jZnMyX2pvdXJuYWxfZGlydHkoaGFuZGxlLCB4cy0+YnVja2V0LmJoc1swXSk7Ci0JaWYgKHJldCA8IDApCi0JCW1sb2dfZXJybm8ocmV0KTsKLW91dF9jb21taXQ6Ci0Jb2NmczJfY29tbWl0X3RyYW5zKE9DRlMyX1NCKGlub2RlLT5pX3NiKSwgaGFuZGxlKTsKKwlvY2ZzMl94YXR0cl9idWNrZXRfam91cm5hbF9kaXJ0eShoYW5kbGUsIHhzLT5idWNrZXQpOwogfQogCiAvKgpAQCAtNDQ0MCw3ICs0OTI4LDggQEAKICAqLwogc3RhdGljIGludCBvY2ZzMl94YXR0cl9zZXRfaW5fYnVja2V0KHN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJCQkJICAgICBzdHJ1Y3Qgb2NmczJfeGF0dHJfaW5mbyAqeGksCi0JCQkJICAgICBzdHJ1Y3Qgb2NmczJfeGF0dHJfc2VhcmNoICp4cykKKwkJCQkgICAgIHN0cnVjdCBvY2ZzMl94YXR0cl9zZWFyY2ggKnhzLAorCQkJCSAgICAgc3RydWN0IG9jZnMyX3hhdHRyX3NldF9jdHh0ICpjdHh0KQogewogCWludCByZXQsIGxvY2FsID0gMTsKIAlzaXplX3QgdmFsdWVfbGVuOwpAQCAtNDQ2OCw3ICs0OTU3LDggQEAKIAkJCXZhbHVlX2xlbiA9IDA7CiAKIAkJcmV0ID0gb2NmczJfeGF0dHJfYnVja2V0X3ZhbHVlX3RydW5jYXRlX3hzKGlub2RlLCB4cywKLQkJCQkJCQkgICB2YWx1ZV9sZW4pOworCQkJCQkJCSAgIHZhbHVlX2xlbiwKKwkJCQkJCQkgICBjdHh0KTsKIAkJaWYgKHJldCkKIAkJCWdvdG8gb3V0OwogCkBAIC00NDg4LDcgKzQ5NzgsOCBAQAogCQl4aS0+dmFsdWVfbGVuID0gT0NGUzJfWEFUVFJfUk9PVF9TSVpFOwogCX0KIAotCXJldCA9IG9jZnMyX3hhdHRyX3NldF9lbnRyeV9pbl9idWNrZXQoaW5vZGUsIHhpLCB4cywgbmFtZV9oYXNoLCBsb2NhbCk7CisJcmV0ID0gb2NmczJfeGF0dHJfc2V0X2VudHJ5X2luX2J1Y2tldChpbm9kZSwgY3R4dC0+aGFuZGxlLCB4aSwgeHMsCisJCQkJCSAgICAgIG5hbWVfaGFzaCwgbG9jYWwpOwogCWlmIChyZXQpIHsKIAkJbWxvZ19lcnJubyhyZXQpOwogCQlnb3RvIG91dDsKQEAgLTQ0OTksNyArNDk5MCw3IEBACiAKIAkvKiBhbGxvY2F0ZSB0aGUgc3BhY2Ugbm93IGZvciB0aGUgb3V0c2lkZSBibG9jayBzdG9yYWdlLiAqLwogCXJldCA9IG9jZnMyX3hhdHRyX2J1Y2tldF92YWx1ZV90cnVuY2F0ZV94cyhpbm9kZSwgeHMsCi0JCQkJCQkgICB2YWx1ZV9sZW4pOworCQkJCQkJICAgdmFsdWVfbGVuLCBjdHh0KTsKIAlpZiAocmV0KSB7CiAJCW1sb2dfZXJybm8ocmV0KTsKIApAQCAtNDUwOSwxMyArNTAwMCwxNCBAQAogCQkJICogc3RvcmFnZSBhbmQgd2UgaGF2ZSBhbGxvY2F0ZWQgeGF0dHIgYWxyZWFkeSwKIAkJCSAqIHNvIG5lZWQgdG8gcmVtb3ZlIGl0LgogCQkJICovCi0JCQlvY2ZzMl94YXR0cl9idWNrZXRfcmVtb3ZlX3hzKGlub2RlLCB4cyk7CisJCQlvY2ZzMl94YXR0cl9idWNrZXRfcmVtb3ZlX3hzKGlub2RlLCBjdHh0LT5oYW5kbGUsIHhzKTsKIAkJfQogCQlnb3RvIG91dDsKIAl9CiAKIHNldF92YWx1ZV9vdXRzaWRlOgotCXJldCA9IG9jZnMyX3hhdHRyX2J1Y2tldF9zZXRfdmFsdWVfb3V0c2lkZShpbm9kZSwgeHMsIHZhbCwgdmFsdWVfbGVuKTsKKwlyZXQgPSBvY2ZzMl94YXR0cl9idWNrZXRfc2V0X3ZhbHVlX291dHNpZGUoaW5vZGUsIGN0eHQtPmhhbmRsZSwKKwkJCQkJCSAgIHhzLCB2YWwsIHZhbHVlX2xlbik7CiBvdXQ6CiAJcmV0dXJuIHJldDsKIH0KQEAgLTQ1MzAsNyArNTAyMiw3IEBACiAJCQkJCSAgICAgIHN0cnVjdCBvY2ZzMl94YXR0cl9idWNrZXQgKmJ1Y2tldCwKIAkJCQkJICAgICAgY29uc3QgY2hhciAqbmFtZSkKIHsKLQlzdHJ1Y3Qgb2NmczJfeGF0dHJfaGVhZGVyICp4aCA9IGJ1Y2tldC0+eGg7CisJc3RydWN0IG9jZnMyX3hhdHRyX2hlYWRlciAqeGggPSBidWNrZXRfeGgoYnVja2V0KTsKIAl1MzIgbmFtZV9oYXNoID0gb2NmczJfeGF0dHJfbmFtZV9oYXNoKGlub2RlLCBuYW1lLCBzdHJsZW4obmFtZSkpOwogCiAJaWYgKG5hbWVfaGFzaCAhPSBsZTMyX3RvX2NwdSh4aC0+eGhfZW50cmllc1swXS54ZV9uYW1lX2hhc2gpKQpAQCAtNDU0MCw3ICs1MDMyLDcgQEAKIAkgICAgeGgtPnhoX2VudHJpZXNbMF0ueGVfbmFtZV9oYXNoKSB7CiAJCW1sb2coTUxfRVJST1IsICJUb28gbXVjaCBoYXNoIGNvbGxpc2lvbiBpbiB4YXR0ciBidWNrZXQgJWxsdSwgIgogCQkgICAgICJoYXNoID0gJXVcbiIsCi0JCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylidWNrZXQtPmJoc1swXS0+Yl9ibG9ja25yLAorCQkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpYnVja2V0X2Jsa25vKGJ1Y2tldCksCiAJCSAgICAgbGUzMl90b19jcHUoeGgtPnhoX2VudHJpZXNbMF0ueGVfbmFtZV9oYXNoKSk7CiAJCXJldHVybiAtRU5PU1BDOwogCX0KQEAgLTQ1NTAsMTYgKzUwNDIsMTYgQEAKIAogc3RhdGljIGludCBvY2ZzMl94YXR0cl9zZXRfZW50cnlfaW5kZXhfYmxvY2soc3RydWN0IGlub2RlICppbm9kZSwKIAkJCQkJICAgICBzdHJ1Y3Qgb2NmczJfeGF0dHJfaW5mbyAqeGksCi0JCQkJCSAgICAgc3RydWN0IG9jZnMyX3hhdHRyX3NlYXJjaCAqeHMpCisJCQkJCSAgICAgc3RydWN0IG9jZnMyX3hhdHRyX3NlYXJjaCAqeHMsCisJCQkJCSAgICAgc3RydWN0IG9jZnMyX3hhdHRyX3NldF9jdHh0ICpjdHh0KQogewogCXN0cnVjdCBvY2ZzMl94YXR0cl9oZWFkZXIgKnhoOwogCXN0cnVjdCBvY2ZzMl94YXR0cl9lbnRyeSAqeGU7CiAJdTE2IGNvdW50LCBoZWFkZXJfc2l6ZSwgeGhfZnJlZV9zdGFydDsKLQlpbnQgaSwgZnJlZSwgbWF4X2ZyZWUsIG5lZWQsIG9sZDsKKwlpbnQgZnJlZSwgbWF4X2ZyZWUsIG5lZWQsIG9sZDsKIAlzaXplX3QgdmFsdWVfc2l6ZSA9IDAsIG5hbWVfbGVuID0gc3RybGVuKHhpLT5uYW1lKTsKIAlzaXplX3QgYmxvY2tzaXplID0gaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplOwogCWludCByZXQsIGFsbG9jYXRpb24gPSAwOwotCXUxNiBibGtfcGVyX2J1Y2tldCA9IG9jZnMyX2Jsb2Nrc19wZXJfeGF0dHJfYnVja2V0KGlub2RlLT5pX3NiKTsKIAogCW1sb2dfZW50cnkoIlNldCB4YXR0ciAlcyBpbiB4YXR0ciBpbmRleCBibG9ja1xuIiwgeGktPm5hbWUpOwogCkBAIC00NTc0LDcgKzUwNjYsNyBAQAogCiAJbWxvZ19idWdfb25fbXNnKGhlYWRlcl9zaXplID4gYmxvY2tzaXplLCAiYnVja2V0ICVsbHUgaGFzIGhlYWRlciBzaXplICIKIAkJCSJvZiAldSB3aGljaCBleGNlZWQgYmxvY2sgc2l6ZVxuIiwKLQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpeHMtPmJ1Y2tldC5iaHNbMF0tPmJfYmxvY2tuciwKKwkJCSh1bnNpZ25lZCBsb25nIGxvbmcpYnVja2V0X2Jsa25vKHhzLT5idWNrZXQpLAogCQkJaGVhZGVyX3NpemUpOwogCiAJaWYgKHhpLT52YWx1ZSAmJiB4aS0+dmFsdWVfbGVuID4gT0NGUzJfWEFUVFJfSU5MSU5FX1NJWkUpCkBAIC00NjE0LDExICs1MTA2LDEzIEBACiAJbWxvZygwLCAieHMtPm5vdF9mb3VuZCA9ICVkLCBpbiB4YXR0ciBidWNrZXQgJWxsdTogZnJlZSA9ICVkLCAiCiAJICAgICAibmVlZCA9ICVkLCBtYXhfZnJlZSA9ICVkLCB4aF9mcmVlX3N0YXJ0ID0gJXUsIHhoX25hbWVfdmFsdWVfbGVuID0iCiAJICAgICAiICV1XG4iLCB4cy0+bm90X2ZvdW5kLAotCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyl4cy0+YnVja2V0LmJoc1swXS0+Yl9ibG9ja25yLAorCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylidWNrZXRfYmxrbm8oeHMtPmJ1Y2tldCksCiAJICAgICBmcmVlLCBuZWVkLCBtYXhfZnJlZSwgbGUxNl90b19jcHUoeGgtPnhoX2ZyZWVfc3RhcnQpLAogCSAgICAgbGUxNl90b19jcHUoeGgtPnhoX25hbWVfdmFsdWVfbGVuKSk7CiAKLQlpZiAoZnJlZSA8IG5lZWQgfHwgY291bnQgPT0gb2NmczJfeGF0dHJfbWF4X3hlX2luX2J1Y2tldChpbm9kZS0+aV9zYikpIHsKKwlpZiAoZnJlZSA8IG5lZWQgfHwKKwkgICAgKHhzLT5ub3RfZm91bmQgJiYKKwkgICAgIGNvdW50ID09IG9jZnMyX3hhdHRyX21heF94ZV9pbl9idWNrZXQoaW5vZGUtPmlfc2IpKSkgewogCQlpZiAobmVlZCA8PSBtYXhfZnJlZSAmJgogCQkgICAgY291bnQgPCBvY2ZzMl94YXR0cl9tYXhfeGVfaW5fYnVja2V0KGlub2RlLT5pX3NiKSkgewogCQkJLyoKQEAgLTQ2MjYsNyArNTEyMCw4IEBACiAJCQkgKiBuYW1lL3ZhbHVlIHdpbGwgYmUgbW92ZWQsIHRoZSB4ZSBzaG91bGRuJ3QgYmUgY2hhbmdlZAogCQkJICogaW4geHMuCiAJCQkgKi8KLQkJCXJldCA9IG9jZnMyX2RlZnJhZ194YXR0cl9idWNrZXQoaW5vZGUsICZ4cy0+YnVja2V0KTsKKwkJCXJldCA9IG9jZnMyX2RlZnJhZ194YXR0cl9idWNrZXQoaW5vZGUsIGN0eHQtPmhhbmRsZSwKKwkJCQkJCQl4cy0+YnVja2V0KTsKIAkJCWlmIChyZXQpIHsKIAkJCQltbG9nX2Vycm5vKHJldCk7CiAJCQkJZ290byBvdXQ7CkBAIC00NjU4LDcgKzUxNTMsNyBAQAogCQkgKiBhZGQgYSBuZXcgYnVja2V0IGZvciB0aGUgaW5zZXJ0LgogCQkgKi8KIAkJcmV0ID0gb2NmczJfY2hlY2tfeGF0dHJfYnVja2V0X2NvbGxpc2lvbihpbm9kZSwKLQkJCQkJCQkgJnhzLT5idWNrZXQsCisJCQkJCQkJIHhzLT5idWNrZXQsCiAJCQkJCQkJIHhpLT5uYW1lKTsKIAkJaWYgKHJldCkgewogCQkJbWxvZ19lcnJubyhyZXQpOwpAQCAtNDY2NywxNyArNTE2MiwyMSBAQAogCiAJCXJldCA9IG9jZnMyX2FkZF9uZXdfeGF0dHJfYnVja2V0KGlub2RlLAogCQkJCQkJIHhzLT54YXR0cl9iaCwKLQkJCQkJCSB4cy0+YnVja2V0LmJoc1swXSk7CisJCQkJCQkgeHMtPmJ1Y2tldCwKKwkJCQkJCSBjdHh0KTsKIAkJaWYgKHJldCkgewogCQkJbWxvZ19lcnJubyhyZXQpOwogCQkJZ290byBvdXQ7CiAJCX0KIAotCQlmb3IgKGkgPSAwOyBpIDwgYmxrX3Blcl9idWNrZXQ7IGkrKykKLQkJCWJyZWxzZSh4cy0+YnVja2V0LmJoc1tpXSk7Ci0KLQkJbWVtc2V0KCZ4cy0+YnVja2V0LCAwLCBzaXplb2YoeHMtPmJ1Y2tldCkpOwotCisJCS8qCisJCSAqIG9jZnMyX2FkZF9uZXdfeGF0dHJfYnVja2V0KCkgd2lsbCBoYXZlIHVwZGF0ZWQKKwkJICogeHMtPmJ1Y2tldCBpZiBpdCBtb3ZlZCwgYnV0IGl0IHdpbGwgbm90IGhhdmUgdXBkYXRlZAorCQkgKiBhbnkgb2YgdGhlIG90aGVyIHNlYXJjaCBmaWVsZHMuICBUaHVzLCB3ZSBkcm9wIGl0IGFuZAorCQkgKiByZS1zZWFyY2guICBFdmVyeXRoaW5nIHNob3VsZCBiZSBjYWNoZWQsIHNvIGl0J2xsIGJlCisJCSAqIHF1aWNrLgorCQkgKi8KKwkJb2NmczJfeGF0dHJfYnVja2V0X3JlbHNlKHhzLT5idWNrZXQpOwogCQlyZXQgPSBvY2ZzMl94YXR0cl9pbmRleF9ibG9ja19maW5kKGlub2RlLCB4cy0+eGF0dHJfYmgsCiAJCQkJCQkgICB4aS0+bmFtZV9pbmRleCwKIAkJCQkJCSAgIHhpLT5uYW1lLCB4cyk7CkBAIC00Njg5LDcgKzUxODgsNyBAQAogCX0KIAogeGF0dHJfc2V0OgotCXJldCA9IG9jZnMyX3hhdHRyX3NldF9pbl9idWNrZXQoaW5vZGUsIHhpLCB4cyk7CisJcmV0ID0gb2NmczJfeGF0dHJfc2V0X2luX2J1Y2tldChpbm9kZSwgeGksIHhzLCBjdHh0KTsKIG91dDoKIAltbG9nX2V4aXQocmV0KTsKIAlyZXR1cm4gcmV0OwpAQCAtNDcwMCwyNCArNTE5OSw0MSBAQAogCQkJCQl2b2lkICpwYXJhKQogewogCWludCByZXQgPSAwOwotCXN0cnVjdCBvY2ZzMl94YXR0cl9oZWFkZXIgKnhoID0gYnVja2V0LT54aDsKKwlzdHJ1Y3Qgb2NmczJfeGF0dHJfaGVhZGVyICp4aCA9IGJ1Y2tldF94aChidWNrZXQpOwogCXUxNiBpOwogCXN0cnVjdCBvY2ZzMl94YXR0cl9lbnRyeSAqeGU7CisJc3RydWN0IG9jZnMyX3N1cGVyICpvc2IgPSBPQ0ZTMl9TQihpbm9kZS0+aV9zYik7CisJc3RydWN0IG9jZnMyX3hhdHRyX3NldF9jdHh0IGN0eHQgPSB7TlVMTCwgTlVMTCx9OworCWludCBjcmVkaXRzID0gb2NmczJfcmVtb3ZlX2V4dGVudF9jcmVkaXRzKG9zYi0+c2IpICsKKwkJb2NmczJfYmxvY2tzX3Blcl94YXR0cl9idWNrZXQoaW5vZGUtPmlfc2IpOworCisKKwlvY2ZzMl9pbml0X2RlYWxsb2NfY3R4dCgmY3R4dC5kZWFsbG9jKTsKIAogCWZvciAoaSA9IDA7IGkgPCBsZTE2X3RvX2NwdSh4aC0+eGhfY291bnQpOyBpKyspIHsKIAkJeGUgPSAmeGgtPnhoX2VudHJpZXNbaV07CiAJCWlmIChvY2ZzMl94YXR0cl9pc19sb2NhbCh4ZSkpCiAJCQljb250aW51ZTsKIAotCQlyZXQgPSBvY2ZzMl94YXR0cl9idWNrZXRfdmFsdWVfdHJ1bmNhdGUoaW5vZGUsCi0JCQkJCQkJYnVja2V0LT5iaHNbMF0sCi0JCQkJCQkJaSwgMCk7CisJCWN0eHQuaGFuZGxlID0gb2NmczJfc3RhcnRfdHJhbnMob3NiLCBjcmVkaXRzKTsKKwkJaWYgKElTX0VSUihjdHh0LmhhbmRsZSkpIHsKKwkJCXJldCA9IFBUUl9FUlIoY3R4dC5oYW5kbGUpOworCQkJbWxvZ19lcnJubyhyZXQpOworCQkJYnJlYWs7CisJCX0KKworCQlyZXQgPSBvY2ZzMl94YXR0cl9idWNrZXRfdmFsdWVfdHJ1bmNhdGUoaW5vZGUsIGJ1Y2tldCwKKwkJCQkJCQlpLCAwLCAmY3R4dCk7CisKKwkJb2NmczJfY29tbWl0X3RyYW5zKG9zYiwgY3R4dC5oYW5kbGUpOwogCQlpZiAocmV0KSB7CiAJCQltbG9nX2Vycm5vKHJldCk7CiAJCQlicmVhazsKIAkJfQogCX0KIAorCW9jZnMyX3NjaGVkdWxlX3RydW5jYXRlX2xvZ19mbHVzaChvc2IsIDEpOworCW9jZnMyX3J1bl9kZWFsbG9jcyhvc2IsICZjdHh0LmRlYWxsb2MpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTQ3NjgsNiArNTI4NCw3NCBAQAogfQogCiAvKgorICogJ3NlY3VyaXR5JyBhdHRyaWJ1dGVzIHN1cHBvcnQKKyAqLworc3RhdGljIHNpemVfdCBvY2ZzMl94YXR0cl9zZWN1cml0eV9saXN0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNoYXIgKmxpc3QsCisJCQkJCXNpemVfdCBsaXN0X3NpemUsIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJCXNpemVfdCBuYW1lX2xlbikKK3sKKwljb25zdCBzaXplX3QgcHJlZml4X2xlbiA9IFhBVFRSX1NFQ1VSSVRZX1BSRUZJWF9MRU47CisJY29uc3Qgc2l6ZV90IHRvdGFsX2xlbiA9IHByZWZpeF9sZW4gKyBuYW1lX2xlbiArIDE7CisKKwlpZiAobGlzdCAmJiB0b3RhbF9sZW4gPD0gbGlzdF9zaXplKSB7CisJCW1lbWNweShsaXN0LCBYQVRUUl9TRUNVUklUWV9QUkVGSVgsIHByZWZpeF9sZW4pOworCQltZW1jcHkobGlzdCArIHByZWZpeF9sZW4sIG5hbWUsIG5hbWVfbGVuKTsKKwkJbGlzdFtwcmVmaXhfbGVuICsgbmFtZV9sZW5dID0gJ1wwJzsKKwl9CisJcmV0dXJuIHRvdGFsX2xlbjsKK30KKworc3RhdGljIGludCBvY2ZzMl94YXR0cl9zZWN1cml0eV9nZXQoc3RydWN0IGlub2RlICppbm9kZSwgY29uc3QgY2hhciAqbmFtZSwKKwkJCQkgICAgdm9pZCAqYnVmZmVyLCBzaXplX3Qgc2l6ZSkKK3sKKwlpZiAoc3RyY21wKG5hbWUsICIiKSA9PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gb2NmczJfeGF0dHJfZ2V0KGlub2RlLCBPQ0ZTMl9YQVRUUl9JTkRFWF9TRUNVUklUWSwgbmFtZSwKKwkJCSAgICAgICBidWZmZXIsIHNpemUpOworfQorCitzdGF0aWMgaW50IG9jZnMyX3hhdHRyX3NlY3VyaXR5X3NldChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBjaGFyICpuYW1lLAorCQkJCSAgICBjb25zdCB2b2lkICp2YWx1ZSwgc2l6ZV90IHNpemUsIGludCBmbGFncykKK3sKKwlpZiAoc3RyY21wKG5hbWUsICIiKSA9PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiBvY2ZzMl94YXR0cl9zZXQoaW5vZGUsIE9DRlMyX1hBVFRSX0lOREVYX1NFQ1VSSVRZLCBuYW1lLCB2YWx1ZSwKKwkJCSAgICAgICBzaXplLCBmbGFncyk7Cit9CisKK2ludCBvY2ZzMl9pbml0X3NlY3VyaXR5X2dldChzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJICAgIHN0cnVjdCBpbm9kZSAqZGlyLAorCQkJICAgIHN0cnVjdCBvY2ZzMl9zZWN1cml0eV94YXR0cl9pbmZvICpzaSkKK3sKKwkvKiBjaGVjayB3aGV0aGVyIG9jZnMyIHN1cHBvcnQgZmVhdHVyZSB4YXR0ciAqLworCWlmICghb2NmczJfc3VwcG9ydHNfeGF0dHIoT0NGUzJfU0IoZGlyLT5pX3NiKSkpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwlyZXR1cm4gc2VjdXJpdHlfaW5vZGVfaW5pdF9zZWN1cml0eShpbm9kZSwgZGlyLCAmc2ktPm5hbWUsICZzaS0+dmFsdWUsCisJCQkJCSAgICAmc2ktPnZhbHVlX2xlbik7Cit9CisKK2ludCBvY2ZzMl9pbml0X3NlY3VyaXR5X3NldChoYW5kbGVfdCAqaGFuZGxlLAorCQkJICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpkaV9iaCwKKwkJCSAgICBzdHJ1Y3Qgb2NmczJfc2VjdXJpdHlfeGF0dHJfaW5mbyAqc2ksCisJCQkgICAgc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKnhhdHRyX2FjLAorCQkJICAgIHN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICpkYXRhX2FjKQoreworCXJldHVybiBvY2ZzMl94YXR0cl9zZXRfaGFuZGxlKGhhbmRsZSwgaW5vZGUsIGRpX2JoLAorCQkJCSAgICAgT0NGUzJfWEFUVFJfSU5ERVhfU0VDVVJJVFksCisJCQkJICAgICBzaS0+bmFtZSwgc2ktPnZhbHVlLCBzaS0+dmFsdWVfbGVuLCAwLAorCQkJCSAgICAgeGF0dHJfYWMsIGRhdGFfYWMpOworfQorCitzdHJ1Y3QgeGF0dHJfaGFuZGxlciBvY2ZzMl94YXR0cl9zZWN1cml0eV9oYW5kbGVyID0geworCS5wcmVmaXgJPSBYQVRUUl9TRUNVUklUWV9QUkVGSVgsCisJLmxpc3QJPSBvY2ZzMl94YXR0cl9zZWN1cml0eV9saXN0LAorCS5nZXQJPSBvY2ZzMl94YXR0cl9zZWN1cml0eV9nZXQsCisJLnNldAk9IG9jZnMyX3hhdHRyX3NlY3VyaXR5X3NldCwKK307CisKKy8qCiAgKiAndHJ1c3RlZCcgYXR0cmlidXRlcyBzdXBwb3J0CiAgKi8KIHN0YXRpYyBzaXplX3Qgb2NmczJfeGF0dHJfdHJ1c3RlZF9saXN0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNoYXIgKmxpc3QsCmRpZmYgLS1naXQgYS9mcy9vY2ZzMi94YXR0ci5oIGIvZnMvb2NmczIveGF0dHIuaAppbmRleCAxZDgzMTRjLi41YTFlYmM3IDEwMDY0NAotLS0gYS9mcy9vY2ZzMi94YXR0ci5oCisrKyBiL2ZzL29jZnMyL3hhdHRyLmgKQEAgLTMwLDEzICszMCw1OCBAQAogCU9DRlMyX1hBVFRSX01BWAogfTsKIAorc3RydWN0IG9jZnMyX3NlY3VyaXR5X3hhdHRyX2luZm8geworCWludCBlbmFibGU7CisJY2hhciAqbmFtZTsKKwl2b2lkICp2YWx1ZTsKKwlzaXplX3QgdmFsdWVfbGVuOworfTsKKwogZXh0ZXJuIHN0cnVjdCB4YXR0cl9oYW5kbGVyIG9jZnMyX3hhdHRyX3VzZXJfaGFuZGxlcjsKIGV4dGVybiBzdHJ1Y3QgeGF0dHJfaGFuZGxlciBvY2ZzMl94YXR0cl90cnVzdGVkX2hhbmRsZXI7CitleHRlcm4gc3RydWN0IHhhdHRyX2hhbmRsZXIgb2NmczJfeGF0dHJfc2VjdXJpdHlfaGFuZGxlcjsKKyNpZmRlZiBDT05GSUdfT0NGUzJfRlNfUE9TSVhfQUNMCitleHRlcm4gc3RydWN0IHhhdHRyX2hhbmRsZXIgb2NmczJfeGF0dHJfYWNsX2FjY2Vzc19oYW5kbGVyOworZXh0ZXJuIHN0cnVjdCB4YXR0cl9oYW5kbGVyIG9jZnMyX3hhdHRyX2FjbF9kZWZhdWx0X2hhbmRsZXI7CisjZW5kaWYKIGV4dGVybiBzdHJ1Y3QgeGF0dHJfaGFuZGxlciAqb2NmczJfeGF0dHJfaGFuZGxlcnNbXTsKIAogc3NpemVfdCBvY2ZzMl9saXN0eGF0dHIoc3RydWN0IGRlbnRyeSAqLCBjaGFyICosIHNpemVfdCk7CitpbnQgb2NmczJfeGF0dHJfZ2V0X25vbG9jayhzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGJ1ZmZlcl9oZWFkICosIGludCwKKwkJCSAgIGNvbnN0IGNoYXIgKiwgdm9pZCAqLCBzaXplX3QpOwogaW50IG9jZnMyX3hhdHRyX3NldChzdHJ1Y3QgaW5vZGUgKiwgaW50LCBjb25zdCBjaGFyICosIGNvbnN0IHZvaWQgKiwKIAkJICAgIHNpemVfdCwgaW50KTsKK2ludCBvY2ZzMl94YXR0cl9zZXRfaGFuZGxlKGhhbmRsZV90ICosIHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiwKKwkJCSAgIGludCwgY29uc3QgY2hhciAqLCBjb25zdCB2b2lkICosIHNpemVfdCwgaW50LAorCQkJICAgc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKiwKKwkJCSAgIHN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICopOwogaW50IG9jZnMyX3hhdHRyX3JlbW92ZShzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGJ1ZmZlcl9oZWFkICopOworaW50IG9jZnMyX2luaXRfc2VjdXJpdHlfZ2V0KHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgaW5vZGUgKiwKKwkJCSAgICBzdHJ1Y3Qgb2NmczJfc2VjdXJpdHlfeGF0dHJfaW5mbyAqKTsKK2ludCBvY2ZzMl9pbml0X3NlY3VyaXR5X3NldChoYW5kbGVfdCAqLCBzdHJ1Y3QgaW5vZGUgKiwKKwkJCSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiwKKwkJCSAgICBzdHJ1Y3Qgb2NmczJfc2VjdXJpdHlfeGF0dHJfaW5mbyAqLAorCQkJICAgIHN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICosCisJCQkgICAgc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKik7CitpbnQgb2NmczJfY2FsY19zZWN1cml0eV9pbml0KHN0cnVjdCBpbm9kZSAqLAorCQkJICAgICBzdHJ1Y3Qgb2NmczJfc2VjdXJpdHlfeGF0dHJfaW5mbyAqLAorCQkJICAgICBpbnQgKiwgaW50ICosIHN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICoqKTsKK2ludCBvY2ZzMl9jYWxjX3hhdHRyX2luaXQoc3RydWN0IGlub2RlICosIHN0cnVjdCBidWZmZXJfaGVhZCAqLAorCQkJICBpbnQsIHN0cnVjdCBvY2ZzMl9zZWN1cml0eV94YXR0cl9pbmZvICosCisJCQkgIGludCAqLCBpbnQgKiwgc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKiopOworCisvKgorICogeGF0dHJzIGNhbiBsaXZlIGluc2lkZSBhbiBpbm9kZSwgYXMgcGFydCBvZiBhbiBleHRlcm5hbCB4YXR0ciBibG9jaywKKyAqIG9yIGluc2lkZSBhbiB4YXR0ciBidWNrZXQsIHdoaWNoIGlzIHRoZSBsZWFmIG9mIGEgdHJlZSByb290ZWQgaW4gYW4KKyAqIHhhdHRyIGJsb2NrLiAgU29tZSBvZiB0aGUgeGF0dHIgY2FsbHMsIGVzcGVjaWFsbHkgdGhlIHZhbHVlIHNldHRpbmcKKyAqIGZ1bmN0aW9ucywgd2FudCB0byB0cmVhdCBlYWNoIG9mIHRoZXNlIGxvY2F0aW9ucyBhcyBlcXVhbC4gIExldCdzIHdyYXAKKyAqIHRoZW0gaW4gYSBzdHJ1Y3R1cmUgdGhhdCB3ZSBjYW4gcGFzcyBhcm91bmQgaW5zdGVhZCBvZiByYXcgYnVmZmVyX2hlYWRzLgorICovCitzdHJ1Y3Qgb2NmczJfeGF0dHJfdmFsdWVfYnVmIHsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQJCSp2Yl9iaDsKKwlvY2ZzMl9qb3VybmFsX2FjY2Vzc19mdW5jCXZiX2FjY2VzczsKKwlzdHJ1Y3Qgb2NmczJfeGF0dHJfdmFsdWVfcm9vdAkqdmJfeHY7Cit9OworCiAKICNlbmRpZiAvKiBPQ0ZTMl9YQVRUUl9IICovCmRpZmYgLS1naXQgYS9mcy9vbWZzL2lub2RlLmMgYi9mcy9vbWZzL2lub2RlLmMKaW5kZXggNmFmZTU3Yy4uNjMzZTlkYyAxMDA2NDQKLS0tIGEvZnMvb21mcy9pbm9kZS5jCisrKyBiL2ZzL29tZnMvaW5vZGUuYwpAQCAtMzksNyArMzksNiBAQAogCWlub2RlLT5pX21vZGUgPSBtb2RlOwogCWlub2RlLT5pX3VpZCA9IGN1cnJlbnRfZnN1aWQoKTsKIAlpbm9kZS0+aV9naWQgPSBjdXJyZW50X2ZzZ2lkKCk7Ci0JaW5vZGUtPmlfYmxvY2tzID0gMDsKIAlpbm9kZS0+aV9tYXBwaW5nLT5hX29wcyA9ICZvbWZzX2FvcHM7CiAKIAlpbm9kZS0+aV9hdGltZSA9IGlub2RlLT5pX210aW1lID0gaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUU7CmRpZmYgLS1naXQgYS9mcy9vcGVuLmMgYi9mcy9vcGVuLmMKaW5kZXggMWNkN2Q0MC4uZDg4MmZkMiAxMDA2NDQKLS0tIGEvZnMvb3Blbi5jCisrKyBiL2ZzL29wZW4uYwpAQCAtNDEyLDcgKzQxMiw3IEBACiAJaWYgKCgob2Zmc2V0ICsgbGVuKSA+IGlub2RlLT5pX3NiLT5zX21heGJ5dGVzKSB8fCAoKG9mZnNldCArIGxlbikgPCAwKSkKIAkJZ290byBvdXRfZnB1dDsKIAotCWlmIChpbm9kZS0+aV9vcCAmJiBpbm9kZS0+aV9vcC0+ZmFsbG9jYXRlKQorCWlmIChpbm9kZS0+aV9vcC0+ZmFsbG9jYXRlKQogCQlyZXQgPSBpbm9kZS0+aV9vcC0+ZmFsbG9jYXRlKGlub2RlLCBtb2RlLCBvZmZzZXQsIGxlbik7CiAJZWxzZQogCQlyZXQgPSAtRU9QTk9UU1VQUDsKZGlmZiAtLWdpdCBhL2ZzL29wZW5wcm9tZnMvaW5vZGUuYyBiL2ZzL29wZW5wcm9tZnMvaW5vZGUuYwppbmRleCBkNDFiZGM3Li5mZmNkMDRmIDEwMDY0NAotLS0gYS9mcy9vcGVucHJvbWZzL2lub2RlLmMKKysrIGIvZnMvb3BlbnByb21mcy9pbm9kZS5jCkBAIC0yNTYsOSArMjU2LDYgQEAKIAkJYnJlYWs7CiAJfQogCi0JaW5vZGUtPmlfZ2lkID0gMDsKLQlpbm9kZS0+aV91aWQgPSAwOwotCiAJZF9hZGQoZGVudHJ5LCBpbm9kZSk7CiAJcmV0dXJuIE5VTEw7CiB9CmRpZmYgLS1naXQgYS9mcy9wYXJ0aXRpb25zL2NoZWNrLmMgYi9mcy9wYXJ0aXRpb25zL2NoZWNrLmMKaW5kZXggNmQ1YjIxMy4uNTE5OGFkYSAxMDA2NDQKLS0tIGEvZnMvcGFydGl0aW9ucy9jaGVjay5jCisrKyBiL2ZzL3BhcnRpdGlvbnMvY2hlY2suYwpAQCAtMzg0LDkgKzM4NCw5IEBACiAKIAlkbmFtZSA9IGRldl9uYW1lKGRkZXYpOwogCWlmIChpc2RpZ2l0KGRuYW1lW3N0cmxlbihkbmFtZSkgLSAxXSkpCi0JCXNucHJpbnRmKHBkZXYtPmJ1c19pZCwgQlVTX0lEX1NJWkUsICIlc3AlZCIsIGRuYW1lLCBwYXJ0bm8pOworCQlkZXZfc2V0X25hbWUocGRldiwgIiVzcCVkIiwgZG5hbWUsIHBhcnRubyk7CiAJZWxzZQotCQlzbnByaW50ZihwZGV2LT5idXNfaWQsIEJVU19JRF9TSVpFLCAiJXMlZCIsIGRuYW1lLCBwYXJ0bm8pOworCQlkZXZfc2V0X25hbWUocGRldiwgIiVzJWQiLCBkbmFtZSwgcGFydG5vKTsKIAogCWRldmljZV9pbml0aWFsaXplKHBkZXYpOwogCXBkZXYtPmNsYXNzID0gJmJsb2NrX2NsYXNzOwpAQCAtNDQ3LDE2ICs0NDcsMTEgQEAKIAlzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2OwogCXN0cnVjdCBkaXNrX3BhcnRfaXRlciBwaXRlcjsKIAlzdHJ1Y3QgaGRfc3RydWN0ICpwYXJ0OwotCWNoYXIgKnM7CiAJaW50IGVycjsKIAogCWRkZXYtPnBhcmVudCA9IGRpc2stPmRyaXZlcmZzX2RldjsKIAotCXN0cmxjcHkoZGRldi0+YnVzX2lkLCBkaXNrLT5kaXNrX25hbWUsIEJVU19JRF9TSVpFKTsKLQkvKiBld3d3Li4uIHNvbWUgb2YgdGhlc2UgYnVnZ2VycyBoYXZlIC8gaW4gdGhlIG5hbWUuLi4gKi8KLQlzID0gc3RyY2hyKGRkZXYtPmJ1c19pZCwgJy8nKTsKLQlpZiAocykKLQkJKnMgPSAnISc7CisJZGV2X3NldF9uYW1lKGRkZXYsIGRpc2stPmRpc2tfbmFtZSk7CiAKIAkvKiBkZWxheSB1ZXZlbnRzLCB1bnRpbCB3ZSBzY2FubmVkIHBhcnRpdGlvbiB0YWJsZSAqLwogCWRkZXYtPnVldmVudF9zdXBwcmVzcyA9IDE7CmRpZmYgLS1naXQgYS9mcy9wcm9jL2Jhc2UuYyBiL2ZzL3Byb2MvYmFzZS5jCmluZGV4IGNhZDkyYzEuLjBjOWRlMTkgMTAwNjQ0Ci0tLSBhL2ZzL3Byb2MvYmFzZS5jCisrKyBiL2ZzL3Byb2MvYmFzZS5jCkBAIC02NSw2ICs2NSw3IEBACiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9yY3VwZGF0ZS5oPgogI2luY2x1ZGUgPGxpbnV4L2thbGxzeW1zLmg+CisjaW5jbHVkZSA8bGludXgvc3RhY2t0cmFjZS5oPgogI2luY2x1ZGUgPGxpbnV4L3Jlc291cmNlLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbW91bnQuaD4KQEAgLTEwOSwyNSArMTEwLDIyIEBACiAJLm9wICAgPSBPUCwJCQkJCVwKIH0KIAotI2RlZmluZSBESVIoTkFNRSwgTU9ERSwgT1RZUEUpCQkJCQkJCVwKLQlOT0QoTkFNRSwgKFNfSUZESVJ8KE1PREUpKSwJCQkJCQlcCi0JCSZwcm9jXyMjT1RZUEUjI19pbm9kZV9vcGVyYXRpb25zLCAmcHJvY18jI09UWVBFIyNfb3BlcmF0aW9ucywJXAotCQl7fSApCi0jZGVmaW5lIExOSyhOQU1FLCBPVFlQRSkJCQkJCVwKKyNkZWZpbmUgRElSKE5BTUUsIE1PREUsIGlvcHMsIGZvcHMpCVwKKwlOT0QoTkFNRSwgKFNfSUZESVJ8KE1PREUpKSwgJmlvcHMsICZmb3BzLCB7fSApCisjZGVmaW5lIExOSyhOQU1FLCBnZXRfbGluaykJCQkJCVwKIAlOT0QoTkFNRSwgKFNfSUZMTkt8U19JUldYVUdPKSwJCQkJXAogCQkmcHJvY19waWRfbGlua19pbm9kZV9vcGVyYXRpb25zLCBOVUxMLAkJXAotCQl7IC5wcm9jX2dldF9saW5rID0gJnByb2NfIyNPVFlQRSMjX2xpbmsgfSApCi0jZGVmaW5lIFJFRyhOQU1FLCBNT0RFLCBPVFlQRSkJCQkJXAotCU5PRChOQU1FLCAoU19JRlJFR3woTU9ERSkpLCBOVUxMLAkJXAotCQkmcHJvY18jI09UWVBFIyNfb3BlcmF0aW9ucywge30pCi0jZGVmaW5lIElORihOQU1FLCBNT0RFLCBPVFlQRSkJCQkJXAorCQl7IC5wcm9jX2dldF9saW5rID0gZ2V0X2xpbmsgfSApCisjZGVmaW5lIFJFRyhOQU1FLCBNT0RFLCBmb3BzKQkJCQlcCisJTk9EKE5BTUUsIChTX0lGUkVHfChNT0RFKSksIE5VTEwsICZmb3BzLCB7fSkKKyNkZWZpbmUgSU5GKE5BTUUsIE1PREUsIHJlYWQpCQkJCVwKIAlOT0QoTkFNRSwgKFNfSUZSRUd8KE1PREUpKSwgCQkJXAogCQlOVUxMLCAmcHJvY19pbmZvX2ZpbGVfb3BlcmF0aW9ucywJXAotCQl7IC5wcm9jX3JlYWQgPSAmcHJvY18jI09UWVBFIH0gKQotI2RlZmluZSBPTkUoTkFNRSwgTU9ERSwgT1RZUEUpCQkJCVwKKwkJeyAucHJvY19yZWFkID0gcmVhZCB9ICkKKyNkZWZpbmUgT05FKE5BTUUsIE1PREUsIHNob3cpCQkJCVwKIAlOT0QoTkFNRSwgKFNfSUZSRUd8KE1PREUpKSwgCQkJXAogCQlOVUxMLCAmcHJvY19zaW5nbGVfZmlsZV9vcGVyYXRpb25zLAlcCi0JCXsgLnByb2Nfc2hvdyA9ICZwcm9jXyMjT1RZUEUgfSApCisJCXsgLnByb2Nfc2hvdyA9IHNob3cgfSApCiAKIC8qCiAgKiBDb3VudCB0aGUgbnVtYmVyIG9mIGhhcmRsaW5rcyBmb3IgdGhlIHBpZF9lbnRyeSB0YWJsZSwgZXhjbHVkaW5nIHRoZSAuCkBAIC0zMDgsOSArMzA2LDkgQEAKIAlzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IGdldF90YXNrX21tKHRhc2spOwogCWlmIChtbSkgewogCQl1bnNpZ25lZCBpbnQgbndvcmRzID0gMDsKLQkJZG8KKwkJZG8gewogCQkJbndvcmRzICs9IDI7Ci0JCXdoaWxlIChtbS0+c2F2ZWRfYXV4dltud29yZHMgLSAyXSAhPSAwKTsgLyogQVRfTlVMTCAqLworCQl9IHdoaWxlIChtbS0+c2F2ZWRfYXV4dltud29yZHMgLSAyXSAhPSAwKTsgLyogQVRfTlVMTCAqLwogCQlyZXMgPSBud29yZHMgKiBzaXplb2YobW0tPnNhdmVkX2F1eHZbMF0pOwogCQlpZiAocmVzID4gUEFHRV9TSVpFKQogCQkJcmVzID0gUEFHRV9TSVpFOwpAQCAtMzQwLDYgKzMzOCwzNyBAQAogfQogI2VuZGlmIC8qIENPTkZJR19LQUxMU1lNUyAqLwogCisjaWZkZWYgQ09ORklHX1NUQUNLVFJBQ0UKKworI2RlZmluZSBNQVhfU1RBQ0tfVFJBQ0VfREVQVEgJNjQKKworc3RhdGljIGludCBwcm9jX3BpZF9zdGFjayhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHN0cnVjdCBwaWRfbmFtZXNwYWNlICpucywKKwkJCSAgc3RydWN0IHBpZCAqcGlkLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCit7CisJc3RydWN0IHN0YWNrX3RyYWNlIHRyYWNlOworCXVuc2lnbmVkIGxvbmcgKmVudHJpZXM7CisJaW50IGk7CisKKwllbnRyaWVzID0ga21hbGxvYyhNQVhfU1RBQ0tfVFJBQ0VfREVQVEggKiBzaXplb2YoKmVudHJpZXMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWVudHJpZXMpCisJCXJldHVybiAtRU5PTUVNOworCisJdHJhY2UubnJfZW50cmllcwk9IDA7CisJdHJhY2UubWF4X2VudHJpZXMJPSBNQVhfU1RBQ0tfVFJBQ0VfREVQVEg7CisJdHJhY2UuZW50cmllcwkJPSBlbnRyaWVzOworCXRyYWNlLnNraXAJCT0gMDsKKwlzYXZlX3N0YWNrX3RyYWNlX3Rzayh0YXNrLCAmdHJhY2UpOworCisJZm9yIChpID0gMDsgaSA8IHRyYWNlLm5yX2VudHJpZXM7IGkrKykgeworCQlzZXFfcHJpbnRmKG0sICJbPCVwPl0gJXBTXG4iLAorCQkJICAgKHZvaWQgKillbnRyaWVzW2ldLCAodm9pZCAqKWVudHJpZXNbaV0pOworCX0KKwlrZnJlZShlbnRyaWVzKTsKKworCXJldHVybiAwOworfQorI2VuZGlmCisKICNpZmRlZiBDT05GSUdfU0NIRURTVEFUUwogLyoKICAqIFByb3ZpZGVzIC9wcm9jL1BJRC9zY2hlZHN0YXQKQEAgLTExODYsOCArMTIxNSw2IEBACiAJc3RydWN0IGlub2RlICppbm9kZSA9IG0tPnByaXZhdGU7CiAJc3RydWN0IHRhc2tfc3RydWN0ICpwOwogCi0JV0FSTl9PTighaW5vZGUpOwotCiAJcCA9IGdldF9wcm9jX3Rhc2soaW5vZGUpOwogCWlmICghcCkKIAkJcmV0dXJuIC1FU1JDSDsKQEAgLTEyMDUsOCArMTIzMiw2IEBACiAJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7CiAJc3RydWN0IHRhc2tfc3RydWN0ICpwOwogCi0JV0FSTl9PTighaW5vZGUpOwotCiAJcCA9IGdldF9wcm9jX3Rhc2soaW5vZGUpOwogCWlmICghcCkKIAkJcmV0dXJuIC1FU1JDSDsKQEAgLTE0MjYsOCArMTQ1MSw2IEBACiAJaWYgKCFlaS0+cGlkKQogCQlnb3RvIG91dF91bmxvY2s7CiAKLQlpbm9kZS0+aV91aWQgPSAwOwotCWlub2RlLT5pX2dpZCA9IDA7CiAJaWYgKHRhc2tfZHVtcGFibGUodGFzaykpIHsKIAkJcmN1X3JlYWRfbG9jaygpOwogCQljcmVkID0gX190YXNrX2NyZWQodGFzayk7CkBAIC0xOTc2LDEzICsxOTk5LDExIEBACiAJCQkJCSBjb25zdCBzdHJ1Y3QgcGlkX2VudHJ5ICplbnRzLAogCQkJCQkgdW5zaWduZWQgaW50IG5lbnRzKQogewotCXN0cnVjdCBpbm9kZSAqaW5vZGU7CiAJc3RydWN0IGRlbnRyeSAqZXJyb3I7CiAJc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrID0gZ2V0X3Byb2NfdGFzayhkaXIpOwogCWNvbnN0IHN0cnVjdCBwaWRfZW50cnkgKnAsICpsYXN0OwogCiAJZXJyb3IgPSBFUlJfUFRSKC1FTk9FTlQpOwotCWlub2RlID0gTlVMTDsKIAogCWlmICghdGFzaykKIAkJZ290byBvdXRfbm9fdGFzazsKQEAgLTIxMzgsMTIgKzIxNTksMTIgQEAKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcGlkX2VudHJ5IGF0dHJfZGlyX3N0dWZmW10gPSB7Ci0JUkVHKCJjdXJyZW50IiwgICAgU19JUlVHT3xTX0lXVUdPLCBwaWRfYXR0ciksCi0JUkVHKCJwcmV2IiwgICAgICAgU19JUlVHTywJICAgcGlkX2F0dHIpLAotCVJFRygiZXhlYyIsICAgICAgIFNfSVJVR098U19JV1VHTywgcGlkX2F0dHIpLAotCVJFRygiZnNjcmVhdGUiLCAgIFNfSVJVR098U19JV1VHTywgcGlkX2F0dHIpLAotCVJFRygia2V5Y3JlYXRlIiwgIFNfSVJVR098U19JV1VHTywgcGlkX2F0dHIpLAotCVJFRygic29ja2NyZWF0ZSIsIFNfSVJVR098U19JV1VHTywgcGlkX2F0dHIpLAorCVJFRygiY3VycmVudCIsICAgIFNfSVJVR098U19JV1VHTywgcHJvY19waWRfYXR0cl9vcGVyYXRpb25zKSwKKwlSRUcoInByZXYiLCAgICAgICBTX0lSVUdPLAkgICBwcm9jX3BpZF9hdHRyX29wZXJhdGlvbnMpLAorCVJFRygiZXhlYyIsICAgICAgIFNfSVJVR098U19JV1VHTywgcHJvY19waWRfYXR0cl9vcGVyYXRpb25zKSwKKwlSRUcoImZzY3JlYXRlIiwgICBTX0lSVUdPfFNfSVdVR08sIHByb2NfcGlkX2F0dHJfb3BlcmF0aW9ucyksCisJUkVHKCJrZXljcmVhdGUiLCAgU19JUlVHT3xTX0lXVUdPLCBwcm9jX3BpZF9hdHRyX29wZXJhdGlvbnMpLAorCVJFRygic29ja2NyZWF0ZSIsIFNfSVJVR098U19JV1VHTywgcHJvY19waWRfYXR0cl9vcGVyYXRpb25zKSwKIH07CiAKIHN0YXRpYyBpbnQgcHJvY19hdHRyX2Rpcl9yZWFkZGlyKHN0cnVjdCBmaWxlICogZmlscCwKQEAgLTIzNDksOCArMjM3MCw2IEBACiAJaWYgKCFlaS0+cGlkKQogCQlnb3RvIG91dF9pcHV0OwogCi0JaW5vZGUtPmlfdWlkID0gMDsKLQlpbm9kZS0+aV9naWQgPSAwOwogCWlub2RlLT5pX21vZGUgPSBwLT5tb2RlOwogCWlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpKQogCQlpbm9kZS0+aV9ubGluayA9IDI7CkBAIC0yNDY1LDc0ICsyNDg0LDc3IEBACiBzdGF0aWMgY29uc3Qgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgcHJvY190YXNrX2lub2RlX29wZXJhdGlvbnM7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcGlkX2VudHJ5IHRnaWRfYmFzZV9zdHVmZltdID0gewotCURJUigidGFzayIsICAgICAgIFNfSVJVR098U19JWFVHTywgdGFzayksCi0JRElSKCJmZCIsICAgICAgICAgU19JUlVTUnxTX0lYVVNSLCBmZCksCi0JRElSKCJmZGluZm8iLCAgICAgU19JUlVTUnxTX0lYVVNSLCBmZGluZm8pLAorCURJUigidGFzayIsICAgICAgIFNfSVJVR098U19JWFVHTywgcHJvY190YXNrX2lub2RlX29wZXJhdGlvbnMsIHByb2NfdGFza19vcGVyYXRpb25zKSwKKwlESVIoImZkIiwgICAgICAgICBTX0lSVVNSfFNfSVhVU1IsIHByb2NfZmRfaW5vZGVfb3BlcmF0aW9ucywgcHJvY19mZF9vcGVyYXRpb25zKSwKKwlESVIoImZkaW5mbyIsICAgICBTX0lSVVNSfFNfSVhVU1IsIHByb2NfZmRpbmZvX2lub2RlX29wZXJhdGlvbnMsIHByb2NfZmRpbmZvX29wZXJhdGlvbnMpLAogI2lmZGVmIENPTkZJR19ORVQKLQlESVIoIm5ldCIsICAgICAgICBTX0lSVUdPfFNfSVhVR08sIG5ldCksCisJRElSKCJuZXQiLCAgICAgICAgU19JUlVHT3xTX0lYVUdPLCBwcm9jX25ldF9pbm9kZV9vcGVyYXRpb25zLCBwcm9jX25ldF9vcGVyYXRpb25zKSwKICNlbmRpZgotCVJFRygiZW52aXJvbiIsICAgIFNfSVJVU1IsIGVudmlyb24pLAotCUlORigiYXV4diIsICAgICAgIFNfSVJVU1IsIHBpZF9hdXh2KSwKLQlPTkUoInN0YXR1cyIsICAgICBTX0lSVUdPLCBwaWRfc3RhdHVzKSwKLQlPTkUoInBlcnNvbmFsaXR5IiwgU19JUlVTUiwgcGlkX3BlcnNvbmFsaXR5KSwKLQlJTkYoImxpbWl0cyIsCSAgU19JUlVTUiwgcGlkX2xpbWl0cyksCisJUkVHKCJlbnZpcm9uIiwgICAgU19JUlVTUiwgcHJvY19lbnZpcm9uX29wZXJhdGlvbnMpLAorCUlORigiYXV4diIsICAgICAgIFNfSVJVU1IsIHByb2NfcGlkX2F1eHYpLAorCU9ORSgic3RhdHVzIiwgICAgIFNfSVJVR08sIHByb2NfcGlkX3N0YXR1cyksCisJT05FKCJwZXJzb25hbGl0eSIsIFNfSVJVU1IsIHByb2NfcGlkX3BlcnNvbmFsaXR5KSwKKwlJTkYoImxpbWl0cyIsCSAgU19JUlVTUiwgcHJvY19waWRfbGltaXRzKSwKICNpZmRlZiBDT05GSUdfU0NIRURfREVCVUcKLQlSRUcoInNjaGVkIiwgICAgICBTX0lSVUdPfFNfSVdVU1IsIHBpZF9zY2hlZCksCisJUkVHKCJzY2hlZCIsICAgICAgU19JUlVHT3xTX0lXVVNSLCBwcm9jX3BpZF9zY2hlZF9vcGVyYXRpb25zKSwKICNlbmRpZgogI2lmZGVmIENPTkZJR19IQVZFX0FSQ0hfVFJBQ0VIT09LCi0JSU5GKCJzeXNjYWxsIiwgICAgU19JUlVTUiwgcGlkX3N5c2NhbGwpLAorCUlORigic3lzY2FsbCIsICAgIFNfSVJVU1IsIHByb2NfcGlkX3N5c2NhbGwpLAogI2VuZGlmCi0JSU5GKCJjbWRsaW5lIiwgICAgU19JUlVHTywgcGlkX2NtZGxpbmUpLAotCU9ORSgic3RhdCIsICAgICAgIFNfSVJVR08sIHRnaWRfc3RhdCksCi0JT05FKCJzdGF0bSIsICAgICAgU19JUlVHTywgcGlkX3N0YXRtKSwKLQlSRUcoIm1hcHMiLCAgICAgICBTX0lSVUdPLCBtYXBzKSwKKwlJTkYoImNtZGxpbmUiLCAgICBTX0lSVUdPLCBwcm9jX3BpZF9jbWRsaW5lKSwKKwlPTkUoInN0YXQiLCAgICAgICBTX0lSVUdPLCBwcm9jX3RnaWRfc3RhdCksCisJT05FKCJzdGF0bSIsICAgICAgU19JUlVHTywgcHJvY19waWRfc3RhdG0pLAorCVJFRygibWFwcyIsICAgICAgIFNfSVJVR08sIHByb2NfbWFwc19vcGVyYXRpb25zKSwKICNpZmRlZiBDT05GSUdfTlVNQQotCVJFRygibnVtYV9tYXBzIiwgIFNfSVJVR08sIG51bWFfbWFwcyksCisJUkVHKCJudW1hX21hcHMiLCAgU19JUlVHTywgcHJvY19udW1hX21hcHNfb3BlcmF0aW9ucyksCiAjZW5kaWYKLQlSRUcoIm1lbSIsICAgICAgICBTX0lSVVNSfFNfSVdVU1IsIG1lbSksCi0JTE5LKCJjd2QiLCAgICAgICAgY3dkKSwKLQlMTksoInJvb3QiLCAgICAgICByb290KSwKLQlMTksoImV4ZSIsICAgICAgICBleGUpLAotCVJFRygibW91bnRzIiwgICAgIFNfSVJVR08sIG1vdW50cyksCi0JUkVHKCJtb3VudGluZm8iLCAgU19JUlVHTywgbW91bnRpbmZvKSwKLQlSRUcoIm1vdW50c3RhdHMiLCBTX0lSVVNSLCBtb3VudHN0YXRzKSwKKwlSRUcoIm1lbSIsICAgICAgICBTX0lSVVNSfFNfSVdVU1IsIHByb2NfbWVtX29wZXJhdGlvbnMpLAorCUxOSygiY3dkIiwgICAgICAgIHByb2NfY3dkX2xpbmspLAorCUxOSygicm9vdCIsICAgICAgIHByb2Nfcm9vdF9saW5rKSwKKwlMTksoImV4ZSIsICAgICAgICBwcm9jX2V4ZV9saW5rKSwKKwlSRUcoIm1vdW50cyIsICAgICBTX0lSVUdPLCBwcm9jX21vdW50c19vcGVyYXRpb25zKSwKKwlSRUcoIm1vdW50aW5mbyIsICBTX0lSVUdPLCBwcm9jX21vdW50aW5mb19vcGVyYXRpb25zKSwKKwlSRUcoIm1vdW50c3RhdHMiLCBTX0lSVVNSLCBwcm9jX21vdW50c3RhdHNfb3BlcmF0aW9ucyksCiAjaWZkZWYgQ09ORklHX1BST0NfUEFHRV9NT05JVE9SCi0JUkVHKCJjbGVhcl9yZWZzIiwgU19JV1VTUiwgY2xlYXJfcmVmcyksCi0JUkVHKCJzbWFwcyIsICAgICAgU19JUlVHTywgc21hcHMpLAotCVJFRygicGFnZW1hcCIsICAgIFNfSVJVU1IsIHBhZ2VtYXApLAorCVJFRygiY2xlYXJfcmVmcyIsIFNfSVdVU1IsIHByb2NfY2xlYXJfcmVmc19vcGVyYXRpb25zKSwKKwlSRUcoInNtYXBzIiwgICAgICBTX0lSVUdPLCBwcm9jX3NtYXBzX29wZXJhdGlvbnMpLAorCVJFRygicGFnZW1hcCIsICAgIFNfSVJVU1IsIHByb2NfcGFnZW1hcF9vcGVyYXRpb25zKSwKICNlbmRpZgogI2lmZGVmIENPTkZJR19TRUNVUklUWQotCURJUigiYXR0ciIsICAgICAgIFNfSVJVR098U19JWFVHTywgYXR0cl9kaXIpLAorCURJUigiYXR0ciIsICAgICAgIFNfSVJVR098U19JWFVHTywgcHJvY19hdHRyX2Rpcl9pbm9kZV9vcGVyYXRpb25zLCBwcm9jX2F0dHJfZGlyX29wZXJhdGlvbnMpLAogI2VuZGlmCiAjaWZkZWYgQ09ORklHX0tBTExTWU1TCi0JSU5GKCJ3Y2hhbiIsICAgICAgU19JUlVHTywgcGlkX3djaGFuKSwKKwlJTkYoIndjaGFuIiwgICAgICBTX0lSVUdPLCBwcm9jX3BpZF93Y2hhbiksCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfU1RBQ0tUUkFDRQorCU9ORSgic3RhY2siLCAgICAgIFNfSVJVU1IsIHByb2NfcGlkX3N0YWNrKSwKICNlbmRpZgogI2lmZGVmIENPTkZJR19TQ0hFRFNUQVRTCi0JSU5GKCJzY2hlZHN0YXQiLCAgU19JUlVHTywgcGlkX3NjaGVkc3RhdCksCisJSU5GKCJzY2hlZHN0YXQiLCAgU19JUlVHTywgcHJvY19waWRfc2NoZWRzdGF0KSwKICNlbmRpZgogI2lmZGVmIENPTkZJR19MQVRFTkNZVE9QCi0JUkVHKCJsYXRlbmN5IiwgIFNfSVJVR08sIGxzdGF0cyksCisJUkVHKCJsYXRlbmN5IiwgIFNfSVJVR08sIHByb2NfbHN0YXRzX29wZXJhdGlvbnMpLAogI2VuZGlmCiAjaWZkZWYgQ09ORklHX1BST0NfUElEX0NQVVNFVAotCVJFRygiY3B1c2V0IiwgICAgIFNfSVJVR08sIGNwdXNldCksCisJUkVHKCJjcHVzZXQiLCAgICAgU19JUlVHTywgcHJvY19jcHVzZXRfb3BlcmF0aW9ucyksCiAjZW5kaWYKICNpZmRlZiBDT05GSUdfQ0dST1VQUwotCVJFRygiY2dyb3VwIiwgIFNfSVJVR08sIGNncm91cCksCisJUkVHKCJjZ3JvdXAiLCAgU19JUlVHTywgcHJvY19jZ3JvdXBfb3BlcmF0aW9ucyksCiAjZW5kaWYKLQlJTkYoIm9vbV9zY29yZSIsICBTX0lSVUdPLCBvb21fc2NvcmUpLAotCVJFRygib29tX2FkaiIsICAgIFNfSVJVR098U19JV1VTUiwgb29tX2FkanVzdCksCisJSU5GKCJvb21fc2NvcmUiLCAgU19JUlVHTywgcHJvY19vb21fc2NvcmUpLAorCVJFRygib29tX2FkaiIsICAgIFNfSVJVR098U19JV1VTUiwgcHJvY19vb21fYWRqdXN0X29wZXJhdGlvbnMpLAogI2lmZGVmIENPTkZJR19BVURJVFNZU0NBTEwKLQlSRUcoImxvZ2ludWlkIiwgICBTX0lXVVNSfFNfSVJVR08sIGxvZ2ludWlkKSwKLQlSRUcoInNlc3Npb25pZCIsICBTX0lSVUdPLCBzZXNzaW9uaWQpLAorCVJFRygibG9naW51aWQiLCAgIFNfSVdVU1J8U19JUlVHTywgcHJvY19sb2dpbnVpZF9vcGVyYXRpb25zKSwKKwlSRUcoInNlc3Npb25pZCIsICBTX0lSVUdPLCBwcm9jX3Nlc3Npb25pZF9vcGVyYXRpb25zKSwKICNlbmRpZgogI2lmZGVmIENPTkZJR19GQVVMVF9JTkpFQ1RJT04KLQlSRUcoIm1ha2UtaXQtZmFpbCIsIFNfSVJVR098U19JV1VTUiwgZmF1bHRfaW5qZWN0KSwKKwlSRUcoIm1ha2UtaXQtZmFpbCIsIFNfSVJVR098U19JV1VTUiwgcHJvY19mYXVsdF9pbmplY3Rfb3BlcmF0aW9ucyksCiAjZW5kaWYKICNpZiBkZWZpbmVkKFVTRV9FTEZfQ09SRV9EVU1QKSAmJiBkZWZpbmVkKENPTkZJR19FTEZfQ09SRSkKLQlSRUcoImNvcmVkdW1wX2ZpbHRlciIsIFNfSVJVR098U19JV1VTUiwgY29yZWR1bXBfZmlsdGVyKSwKKwlSRUcoImNvcmVkdW1wX2ZpbHRlciIsIFNfSVJVR098U19JV1VTUiwgcHJvY19jb3JlZHVtcF9maWx0ZXJfb3BlcmF0aW9ucyksCiAjZW5kaWYKICNpZmRlZiBDT05GSUdfVEFTS19JT19BQ0NPVU5USU5HCi0JSU5GKCJpbyIsCVNfSVJVR08sIHRnaWRfaW9fYWNjb3VudGluZyksCisJSU5GKCJpbyIsCVNfSVJVR08sIHByb2NfdGdpZF9pb19hY2NvdW50aW5nKSwKICNlbmRpZgogfTsKIApAQCAtMjgwNSw2NiArMjgyNyw2OSBAQAogICogVGFza3MKICAqLwogc3RhdGljIGNvbnN0IHN0cnVjdCBwaWRfZW50cnkgdGlkX2Jhc2Vfc3R1ZmZbXSA9IHsKLQlESVIoImZkIiwgICAgICAgIFNfSVJVU1J8U19JWFVTUiwgZmQpLAotCURJUigiZmRpbmZvIiwgICAgU19JUlVTUnxTX0lYVVNSLCBmZGluZm8pLAotCVJFRygiZW52aXJvbiIsICAgU19JUlVTUiwgZW52aXJvbiksCi0JSU5GKCJhdXh2IiwgICAgICBTX0lSVVNSLCBwaWRfYXV4diksCi0JT05FKCJzdGF0dXMiLCAgICBTX0lSVUdPLCBwaWRfc3RhdHVzKSwKLQlPTkUoInBlcnNvbmFsaXR5IiwgU19JUlVTUiwgcGlkX3BlcnNvbmFsaXR5KSwKLQlJTkYoImxpbWl0cyIsCSBTX0lSVVNSLCBwaWRfbGltaXRzKSwKKwlESVIoImZkIiwgICAgICAgIFNfSVJVU1J8U19JWFVTUiwgcHJvY19mZF9pbm9kZV9vcGVyYXRpb25zLCBwcm9jX2ZkX29wZXJhdGlvbnMpLAorCURJUigiZmRpbmZvIiwgICAgU19JUlVTUnxTX0lYVVNSLCBwcm9jX2ZkaW5mb19pbm9kZV9vcGVyYXRpb25zLCBwcm9jX2ZkX29wZXJhdGlvbnMpLAorCVJFRygiZW52aXJvbiIsICAgU19JUlVTUiwgcHJvY19lbnZpcm9uX29wZXJhdGlvbnMpLAorCUlORigiYXV4diIsICAgICAgU19JUlVTUiwgcHJvY19waWRfYXV4diksCisJT05FKCJzdGF0dXMiLCAgICBTX0lSVUdPLCBwcm9jX3BpZF9zdGF0dXMpLAorCU9ORSgicGVyc29uYWxpdHkiLCBTX0lSVVNSLCBwcm9jX3BpZF9wZXJzb25hbGl0eSksCisJSU5GKCJsaW1pdHMiLAkgU19JUlVTUiwgcHJvY19waWRfbGltaXRzKSwKICNpZmRlZiBDT05GSUdfU0NIRURfREVCVUcKLQlSRUcoInNjaGVkIiwgICAgIFNfSVJVR098U19JV1VTUiwgcGlkX3NjaGVkKSwKKwlSRUcoInNjaGVkIiwgICAgIFNfSVJVR098U19JV1VTUiwgcHJvY19waWRfc2NoZWRfb3BlcmF0aW9ucyksCiAjZW5kaWYKICNpZmRlZiBDT05GSUdfSEFWRV9BUkNIX1RSQUNFSE9PSwotCUlORigic3lzY2FsbCIsICAgU19JUlVTUiwgcGlkX3N5c2NhbGwpLAorCUlORigic3lzY2FsbCIsICAgU19JUlVTUiwgcHJvY19waWRfc3lzY2FsbCksCiAjZW5kaWYKLQlJTkYoImNtZGxpbmUiLCAgIFNfSVJVR08sIHBpZF9jbWRsaW5lKSwKLQlPTkUoInN0YXQiLCAgICAgIFNfSVJVR08sIHRpZF9zdGF0KSwKLQlPTkUoInN0YXRtIiwgICAgIFNfSVJVR08sIHBpZF9zdGF0bSksCi0JUkVHKCJtYXBzIiwgICAgICBTX0lSVUdPLCBtYXBzKSwKKwlJTkYoImNtZGxpbmUiLCAgIFNfSVJVR08sIHByb2NfcGlkX2NtZGxpbmUpLAorCU9ORSgic3RhdCIsICAgICAgU19JUlVHTywgcHJvY190aWRfc3RhdCksCisJT05FKCJzdGF0bSIsICAgICBTX0lSVUdPLCBwcm9jX3BpZF9zdGF0bSksCisJUkVHKCJtYXBzIiwgICAgICBTX0lSVUdPLCBwcm9jX21hcHNfb3BlcmF0aW9ucyksCiAjaWZkZWYgQ09ORklHX05VTUEKLQlSRUcoIm51bWFfbWFwcyIsIFNfSVJVR08sIG51bWFfbWFwcyksCisJUkVHKCJudW1hX21hcHMiLCBTX0lSVUdPLCBwcm9jX251bWFfbWFwc19vcGVyYXRpb25zKSwKICNlbmRpZgotCVJFRygibWVtIiwgICAgICAgU19JUlVTUnxTX0lXVVNSLCBtZW0pLAotCUxOSygiY3dkIiwgICAgICAgY3dkKSwKLQlMTksoInJvb3QiLCAgICAgIHJvb3QpLAotCUxOSygiZXhlIiwgICAgICAgZXhlKSwKLQlSRUcoIm1vdW50cyIsICAgIFNfSVJVR08sIG1vdW50cyksCi0JUkVHKCJtb3VudGluZm8iLCAgU19JUlVHTywgbW91bnRpbmZvKSwKKwlSRUcoIm1lbSIsICAgICAgIFNfSVJVU1J8U19JV1VTUiwgcHJvY19tZW1fb3BlcmF0aW9ucyksCisJTE5LKCJjd2QiLCAgICAgICBwcm9jX2N3ZF9saW5rKSwKKwlMTksoInJvb3QiLCAgICAgIHByb2Nfcm9vdF9saW5rKSwKKwlMTksoImV4ZSIsICAgICAgIHByb2NfZXhlX2xpbmspLAorCVJFRygibW91bnRzIiwgICAgU19JUlVHTywgcHJvY19tb3VudHNfb3BlcmF0aW9ucyksCisJUkVHKCJtb3VudGluZm8iLCAgU19JUlVHTywgcHJvY19tb3VudGluZm9fb3BlcmF0aW9ucyksCiAjaWZkZWYgQ09ORklHX1BST0NfUEFHRV9NT05JVE9SCi0JUkVHKCJjbGVhcl9yZWZzIiwgU19JV1VTUiwgY2xlYXJfcmVmcyksCi0JUkVHKCJzbWFwcyIsICAgICBTX0lSVUdPLCBzbWFwcyksCi0JUkVHKCJwYWdlbWFwIiwgICAgU19JUlVTUiwgcGFnZW1hcCksCisJUkVHKCJjbGVhcl9yZWZzIiwgU19JV1VTUiwgcHJvY19jbGVhcl9yZWZzX29wZXJhdGlvbnMpLAorCVJFRygic21hcHMiLCAgICAgU19JUlVHTywgcHJvY19zbWFwc19vcGVyYXRpb25zKSwKKwlSRUcoInBhZ2VtYXAiLCAgICBTX0lSVVNSLCBwcm9jX3BhZ2VtYXBfb3BlcmF0aW9ucyksCiAjZW5kaWYKICNpZmRlZiBDT05GSUdfU0VDVVJJVFkKLQlESVIoImF0dHIiLCAgICAgIFNfSVJVR098U19JWFVHTywgYXR0cl9kaXIpLAorCURJUigiYXR0ciIsICAgICAgU19JUlVHT3xTX0lYVUdPLCBwcm9jX2F0dHJfZGlyX2lub2RlX29wZXJhdGlvbnMsIHByb2NfYXR0cl9kaXJfb3BlcmF0aW9ucyksCiAjZW5kaWYKICNpZmRlZiBDT05GSUdfS0FMTFNZTVMKLQlJTkYoIndjaGFuIiwgICAgIFNfSVJVR08sIHBpZF93Y2hhbiksCisJSU5GKCJ3Y2hhbiIsICAgICBTX0lSVUdPLCBwcm9jX3BpZF93Y2hhbiksCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfU1RBQ0tUUkFDRQorCU9ORSgic3RhY2siLCAgICAgIFNfSVJVU1IsIHByb2NfcGlkX3N0YWNrKSwKICNlbmRpZgogI2lmZGVmIENPTkZJR19TQ0hFRFNUQVRTCi0JSU5GKCJzY2hlZHN0YXQiLCBTX0lSVUdPLCBwaWRfc2NoZWRzdGF0KSwKKwlJTkYoInNjaGVkc3RhdCIsIFNfSVJVR08sIHByb2NfcGlkX3NjaGVkc3RhdCksCiAjZW5kaWYKICNpZmRlZiBDT05GSUdfTEFURU5DWVRPUAotCVJFRygibGF0ZW5jeSIsICBTX0lSVUdPLCBsc3RhdHMpLAorCVJFRygibGF0ZW5jeSIsICBTX0lSVUdPLCBwcm9jX2xzdGF0c19vcGVyYXRpb25zKSwKICNlbmRpZgogI2lmZGVmIENPTkZJR19QUk9DX1BJRF9DUFVTRVQKLQlSRUcoImNwdXNldCIsICAgIFNfSVJVR08sIGNwdXNldCksCisJUkVHKCJjcHVzZXQiLCAgICBTX0lSVUdPLCBwcm9jX2NwdXNldF9vcGVyYXRpb25zKSwKICNlbmRpZgogI2lmZGVmIENPTkZJR19DR1JPVVBTCi0JUkVHKCJjZ3JvdXAiLCAgU19JUlVHTywgY2dyb3VwKSwKKwlSRUcoImNncm91cCIsICBTX0lSVUdPLCBwcm9jX2Nncm91cF9vcGVyYXRpb25zKSwKICNlbmRpZgotCUlORigib29tX3Njb3JlIiwgU19JUlVHTywgb29tX3Njb3JlKSwKLQlSRUcoIm9vbV9hZGoiLCAgIFNfSVJVR098U19JV1VTUiwgb29tX2FkanVzdCksCisJSU5GKCJvb21fc2NvcmUiLCBTX0lSVUdPLCBwcm9jX29vbV9zY29yZSksCisJUkVHKCJvb21fYWRqIiwgICBTX0lSVUdPfFNfSVdVU1IsIHByb2Nfb29tX2FkanVzdF9vcGVyYXRpb25zKSwKICNpZmRlZiBDT05GSUdfQVVESVRTWVNDQUxMCi0JUkVHKCJsb2dpbnVpZCIsICBTX0lXVVNSfFNfSVJVR08sIGxvZ2ludWlkKSwKLQlSRUcoInNlc3Npb25pZCIsICBTX0lSVVNSLCBzZXNzaW9uaWQpLAorCVJFRygibG9naW51aWQiLCAgU19JV1VTUnxTX0lSVUdPLCBwcm9jX2xvZ2ludWlkX29wZXJhdGlvbnMpLAorCVJFRygic2Vzc2lvbmlkIiwgIFNfSVJVU1IsIHByb2Nfc2Vzc2lvbmlkX29wZXJhdGlvbnMpLAogI2VuZGlmCiAjaWZkZWYgQ09ORklHX0ZBVUxUX0lOSkVDVElPTgotCVJFRygibWFrZS1pdC1mYWlsIiwgU19JUlVHT3xTX0lXVVNSLCBmYXVsdF9pbmplY3QpLAorCVJFRygibWFrZS1pdC1mYWlsIiwgU19JUlVHT3xTX0lXVVNSLCBwcm9jX2ZhdWx0X2luamVjdF9vcGVyYXRpb25zKSwKICNlbmRpZgogI2lmZGVmIENPTkZJR19UQVNLX0lPX0FDQ09VTlRJTkcKLQlJTkYoImlvIiwJU19JUlVHTywgdGlkX2lvX2FjY291bnRpbmcpLAorCUlORigiaW8iLAlTX0lSVUdPLCBwcm9jX3RpZF9pb19hY2NvdW50aW5nKSwKICNlbmRpZgogfTsKIApkaWZmIC0tZ2l0IGEvZnMvcHJvYy9nZW5lcmljLmMgYi9mcy9wcm9jL2dlbmVyaWMuYwppbmRleCA2MGEzNTliLi5kYjdmYTVjIDEwMDY0NAotLS0gYS9mcy9wcm9jL2dlbmVyaWMuYworKysgYi9mcy9wcm9jL2dlbmVyaWMuYwpAQCAtMTQsNyArMTQsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9tb3VudC5oPgotI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lkci5oPgogI2luY2x1ZGUgPGxpbnV4L25hbWVpLmg+CkBAIC0zNzksNyArMzc4LDYgQEAKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gTlVMTDsKIAlpbnQgZXJyb3IgPSAtRU5PRU5UOwogCi0JbG9ja19rZXJuZWwoKTsKIAlzcGluX2xvY2soJnByb2Nfc3ViZGlyX2xvY2spOwogCWZvciAoZGUgPSBkZS0+c3ViZGlyOyBkZSA7IGRlID0gZGUtPm5leHQpIHsKIAkJaWYgKGRlLT5uYW1lbGVuICE9IGRlbnRyeS0+ZF9uYW1lLmxlbikKQEAgLTM5Nyw3ICszOTUsNiBAQAogCX0KIAlzcGluX3VubG9jaygmcHJvY19zdWJkaXJfbG9jayk7CiBvdXRfdW5sb2NrOgotCXVubG9ja19rZXJuZWwoKTsKIAogCWlmIChpbm9kZSkgewogCQlkZW50cnktPmRfb3AgPSAmcHJvY19kZW50cnlfb3BlcmF0aW9uczsKQEAgLTQzMiw4ICs0MjksNiBAQAogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxwLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwogCWludCByZXQgPSAwOwogCi0JbG9ja19rZXJuZWwoKTsKLQogCWlubyA9IGlub2RlLT5pX2lubzsKIAlpID0gZmlscC0+Zl9wb3M7CiAJc3dpdGNoIChpKSB7CkBAIC00ODcsNyArNDgyLDcgQEAKIAkJCXNwaW5fdW5sb2NrKCZwcm9jX3N1YmRpcl9sb2NrKTsKIAl9CiAJcmV0ID0gMTsKLW91dDoJdW5sb2NrX2tlcm5lbCgpOworb3V0OgogCXJldHVybiByZXQ7CQogfQogCkBAIC01MDQsNiArNDk5LDcgQEAKICAqIHRoZSAvcHJvYyBkaXJlY3RvcnkuCiAgKi8KIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHByb2NfZGlyX29wZXJhdGlvbnMgPSB7CisJLmxsc2VlawkJCT0gZ2VuZXJpY19maWxlX2xsc2VlaywKIAkucmVhZAkJCT0gZ2VuZXJpY19yZWFkX2RpciwKIAkucmVhZGRpcgkJPSBwcm9jX3JlYWRkaXIsCiB9OwpkaWZmIC0tZ2l0IGEvZnMvcHJvYy9pbm9kZS5jIGIvZnMvcHJvYy9pbm9kZS5jCmluZGV4IDI1NDNmZDAuLjNlNzZiYjkgMTAwNjQ0Ci0tLSBhL2ZzL3Byb2MvaW5vZGUuYworKysgYi9mcy9wcm9jL2lub2RlLmMKQEAgLTM1LDE2ICszNSwxMyBAQAogICovCiB2b2lkIGRlX3B1dChzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmRlKQogewotCWxvY2tfa2VybmVsKCk7CiAJaWYgKCFhdG9taWNfcmVhZCgmZGUtPmNvdW50KSkgewogCQlwcmludGsoImRlX3B1dDogZW50cnkgJXMgYWxyZWFkeSBmcmVlIVxuIiwgZGUtPm5hbWUpOwotCQl1bmxvY2tfa2VybmVsKCk7CiAJCXJldHVybjsKIAl9CiAKIAlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmZGUtPmNvdW50KSkKIAkJZnJlZV9wcm9jX2VudHJ5KGRlKTsKLQl1bmxvY2tfa2VybmVsKCk7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9mcy9wcm9jL3Byb2NfbmV0LmMgYi9mcy9wcm9jL3Byb2NfbmV0LmMKaW5kZXggN2JjMjk2Zi4uMDRkMTI3MCAxMDA2NDQKLS0tIGEvZnMvcHJvYy9wcm9jX25ldC5jCisrKyBiL2ZzL3Byb2MvcHJvY19uZXQuYwpAQCAtMTgsNyArMTgsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+Ci0jaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KICNpbmNsdWRlIDxsaW51eC9tb3VudC5oPgogI2luY2x1ZGUgPGxpbnV4L25zcHJveHkuaD4KICNpbmNsdWRlIDxuZXQvbmV0X25hbWVzcGFjZS5oPgpAQCAtMTcyLDYgKzE3MSw3IEBACiB9CiAKIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHJvY19uZXRfb3BlcmF0aW9ucyA9IHsKKwkubGxzZWVrCQk9IGdlbmVyaWNfZmlsZV9sbHNlZWssCiAJLnJlYWQJCT0gZ2VuZXJpY19yZWFkX2RpciwKIAkucmVhZGRpcgk9IHByb2NfdGdpZF9uZXRfcmVhZGRpciwKIH07CmRpZmYgLS1naXQgYS9mcy9wcm9jL3Byb2Nfc3lzY3RsLmMgYi9mcy9wcm9jL3Byb2Nfc3lzY3RsLmMKaW5kZXggMDZlZDEwYi4uOTRmY2ZmZiAxMDA2NDQKLS0tIGEvZnMvcHJvYy9wcm9jX3N5c2N0bC5jCisrKyBiL2ZzL3Byb2MvcHJvY19zeXNjdGwuYwpAQCAtMzEsNyArMzEsNiBAQAogCWlub2RlLT5pX210aW1lID0gaW5vZGUtPmlfYXRpbWUgPSBpbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRTsKIAlpbm9kZS0+aV9mbGFncyB8PSBTX1BSSVZBVEU7IC8qIHRlbGwgc2VsaW51eCB0byBpZ25vcmUgdGhpcyBpbm9kZSAqLwogCWlub2RlLT5pX21vZGUgPSB0YWJsZS0+bW9kZTsKLQlpbm9kZS0+aV91aWQgPSBpbm9kZS0+aV9naWQgPSAwOwogCWlmICghdGFibGUtPmNoaWxkKSB7CiAJCWlub2RlLT5pX21vZGUgfD0gU19JRlJFRzsKIAkJaW5vZGUtPmlfb3AgPSAmcHJvY19zeXNfaW5vZGVfb3BlcmF0aW9uczsKZGlmZiAtLWdpdCBhL2ZzL3Byb2Mvcm9vdC5jIGIvZnMvcHJvYy9yb290LmMKaW5kZXggNzc2MTYwMi4uZjYyOTlhMiAxMDA2NDQKLS0tIGEvZnMvcHJvYy9yb290LmMKKysrIGIvZnMvcHJvYy9yb290LmMKQEAgLTE2LDcgKzE2LDYgQEAKICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgotI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvbW91bnQuaD4KICNpbmNsdWRlIDxsaW51eC9waWRfbmFtZXNwYWNlLmg+CiAKQEAgLTE2MiwxNyArMTYxLDEyIEBACiAJdW5zaWduZWQgaW50IG5yID0gZmlscC0+Zl9wb3M7CiAJaW50IHJldDsKIAotCWxvY2tfa2VybmVsKCk7Ci0KIAlpZiAobnIgPCBGSVJTVF9QUk9DRVNTX0VOVFJZKSB7CiAJCWludCBlcnJvciA9IHByb2NfcmVhZGRpcihmaWxwLCBkaXJlbnQsIGZpbGxkaXIpOwotCQlpZiAoZXJyb3IgPD0gMCkgewotCQkJdW5sb2NrX2tlcm5lbCgpOworCQlpZiAoZXJyb3IgPD0gMCkKIAkJCXJldHVybiBlcnJvcjsKLQkJfQogCQlmaWxwLT5mX3BvcyA9IEZJUlNUX1BST0NFU1NfRU5UUlk7CiAJfQotCXVubG9ja19rZXJuZWwoKTsKIAogCXJldCA9IHByb2NfcGlkX3JlYWRkaXIoZmlscCwgZGlyZW50LCBmaWxsZGlyKTsKIAlyZXR1cm4gcmV0OwpkaWZmIC0tZ2l0IGEvZnMvcHJvYy90YXNrX21tdS5jIGIvZnMvcHJvYy90YXNrX21tdS5jCmluZGV4IDNhOGJkZDcuLjk0MDYzODQgMTAwNjQ0Ci0tLSBhL2ZzL3Byb2MvdGFza19tbXUuYworKysgYi9mcy9wcm9jL3Rhc2tfbW11LmMKQEAgLTM5Niw3ICszOTYsOSBAQAogCQkgICAiUHJpdmF0ZV9DbGVhbjogICU4bHUga0JcbiIKIAkJICAgIlByaXZhdGVfRGlydHk6ICAlOGx1IGtCXG4iCiAJCSAgICJSZWZlcmVuY2VkOiAgICAgJThsdSBrQlxuIgotCQkgICAiU3dhcDogICAgICAgICAgICU4bHUga0JcbiIsCisJCSAgICJTd2FwOiAgICAgICAgICAgJThsdSBrQlxuIgorCQkgICAiS2VybmVsUGFnZVNpemU6ICU4bHUga0JcbiIKKwkJICAgIk1NVVBhZ2VTaXplOiAgICAlOGx1IGtCXG4iLAogCQkgICAodm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0KSA+PiAxMCwKIAkJICAgbXNzLnJlc2lkZW50ID4+IDEwLAogCQkgICAodW5zaWduZWQgbG9uZykobXNzLnBzcyA+PiAoMTAgKyBQU1NfU0hJRlQpKSwKQEAgLTQwNSw3ICs0MDcsOSBAQAogCQkgICBtc3MucHJpdmF0ZV9jbGVhbiA+PiAxMCwKIAkJICAgbXNzLnByaXZhdGVfZGlydHkgPj4gMTAsCiAJCSAgIG1zcy5yZWZlcmVuY2VkID4+IDEwLAotCQkgICBtc3Muc3dhcCA+PiAxMCk7CisJCSAgIG1zcy5zd2FwID4+IDEwLAorCQkgICB2bWFfa2VybmVsX3BhZ2VzaXplKHZtYSkgPj4gMTAsCisJCSAgIHZtYV9tbXVfcGFnZXNpemUodm1hKSA+PiAxMCk7CiAKIAlpZiAobS0+Y291bnQgPCBtLT5zaXplKSAgLyogdm1hIGlzIGNvcGllZCBzdWNjZXNzZnVsbHkgKi8KIAkJbS0+dmVyc2lvbiA9ICh2bWEgIT0gZ2V0X2dhdGVfdm1hKHRhc2spKSA/IHZtYS0+dm1fc3RhcnQgOiAwOwpkaWZmIC0tZ2l0IGEvZnMvcHJvYy90YXNrX25vbW11LmMgYi9mcy9wcm9jL3Rhc2tfbm9tbXUuYwppbmRleCAyMTliZDc5Li5kNGE4YmUzIDEwMDY0NAotLS0gYS9mcy9wcm9jL3Rhc2tfbm9tbXUuYworKysgYi9mcy9wcm9jL3Rhc2tfbm9tbXUuYwpAQCAtOSw3ICs5LDcgQEAKIAogLyoKICAqIExvZ2ljOiB3ZSd2ZSBnb3QgdHdvIG1lbW9yeSBzdW1zIGZvciBlYWNoIHByb2Nlc3MsICJzaGFyZWQiLCBhbmQKLSAqICJub24tc2hhcmVkIi4gU2hhcmVkIG1lbW9yeSBtYXkgZ2V0IGNvdW50ZWQgbW9yZSB0aGVuIG9uY2UsIGZvcgorICogIm5vbi1zaGFyZWQiLiBTaGFyZWQgbWVtb3J5IG1heSBnZXQgY291bnRlZCBtb3JlIHRoYW4gb25jZSwgZm9yCiAgKiBlYWNoIHByb2Nlc3MgdGhhdCBvd25zIGl0LiBOb24tc2hhcmVkIG1lbW9yeSBpcyBjb3VudGVkCiAgKiBhY2N1cmF0ZWx5LgogICovCmRpZmYgLS1naXQgYS9mcy9wcm9jL3ZtY29yZS5jIGIvZnMvcHJvYy92bWNvcmUuYwppbmRleCAwM2VjNTk1Li41ZWRjYzNmIDEwMDY0NAotLS0gYS9mcy9wcm9jL3ZtY29yZS5jCisrKyBiL2ZzL3Byb2Mvdm1jb3JlLmMKQEAgLTQ3LDggKzQ3LDYgQEAKIAogCW9mZnNldCA9ICh1bnNpZ25lZCBsb25nKSgqcHBvcyAlIFBBR0VfU0laRSk7CiAJcGZuID0gKHVuc2lnbmVkIGxvbmcpKCpwcG9zIC8gUEFHRV9TSVpFKTsKLQlpZiAocGZuID4gc2F2ZWRfbWF4X3BmbikKLQkJcmV0dXJuIC1FSU5WQUw7CiAKIAlkbyB7CiAJCWlmIChjb3VudCA+IChQQUdFX1NJWkUgLSBvZmZzZXQpKQpkaWZmIC0tZ2l0IGEvZnMvcXVvdGEuYyBiL2ZzL3F1b3RhLmMKaW5kZXggYjdmZTQ0ZS4uNGE4Yzk0ZiAxMDA2NDQKLS0tIGEvZnMvcXVvdGEuYworKysgYi9mcy9xdW90YS5jCkBAIC03Myw3ICs3Myw3IEBACiAJCWNhc2UgUV9TRVRRVU9UQToKIAkJY2FzZSBRX0dFVFFVT1RBOgogCQkJLyogVGhpcyBpcyBqdXN0IGluZm9ybWF0aXZlIHRlc3Qgc28gd2UgYXJlIHNhdGlzZmllZCB3aXRob3V0IGEgbG9jayAqLwotCQkJaWYgKCFzYl9oYXNfcXVvdGFfZW5hYmxlZChzYiwgdHlwZSkpCisJCQlpZiAoIXNiX2hhc19xdW90YV9hY3RpdmUoc2IsIHR5cGUpKQogCQkJCXJldHVybiAtRVNSQ0g7CiAJfQogCkBAIC0xNjAsNiArMTYwLDkgQEAKIAlpbnQgY250OwogCiAJc2ItPnNfcWNvcC0+cXVvdGFfc3luYyhzYiwgdHlwZSk7CisKKwlpZiAoc2JfZHFvcHQoc2IpLT5mbGFncyAmIERRVU9UX1FVT1RBX1NZU19GSUxFKQorCQlyZXR1cm47CiAJLyogVGhpcyBpcyBub3QgdmVyeSBjbGV2ZXIgKGFuZCBmYXN0KSBidXQgY3VycmVudGx5IEkgZG9uJ3Qga25vdyBhYm91dAogCSAqIGFueSBvdGhlciBzaW1wbGUgd2F5IG9mIGdldHRpbmcgcXVvdGEgZGF0YSB0byBkaXNrIGFuZCB3ZSBtdXN0IGdldAogCSAqIHRoZW0gdGhlcmUgZm9yIHVzZXJzcGFjZSB0byBiZSB2aXNpYmxlLi4uICovCkBAIC0xNzUsNyArMTc4LDcgQEAKIAlmb3IgKGNudCA9IDA7IGNudCA8IE1BWFFVT1RBUzsgY250KyspIHsKIAkJaWYgKHR5cGUgIT0gLTEgJiYgY250ICE9IHR5cGUpCiAJCQljb250aW51ZTsKLQkJaWYgKCFzYl9oYXNfcXVvdGFfZW5hYmxlZChzYiwgY250KSkKKwkJaWYgKCFzYl9oYXNfcXVvdGFfYWN0aXZlKHNiLCBjbnQpKQogCQkJY29udGludWU7CiAJCW11dGV4X2xvY2tfbmVzdGVkKCZzYl9kcW9wdChzYiktPmZpbGVzW2NudF0tPmlfbXV0ZXgsIElfTVVURVhfUVVPVEEpOwogCQl0cnVuY2F0ZV9pbm9kZV9wYWdlcygmc2JfZHFvcHQoc2IpLT5maWxlc1tjbnRdLT5pX2RhdGEsIDApOwpAQCAtMjAxLDcgKzIwNCw3IEBACiAJCWZvciAoY250ID0gMDsgY250IDwgTUFYUVVPVEFTOyBjbnQrKykgewogCQkJaWYgKHR5cGUgIT0gLTEgJiYgdHlwZSAhPSBjbnQpCiAJCQkJY29udGludWU7Ci0JCQlpZiAoIXNiX2hhc19xdW90YV9lbmFibGVkKHNiLCBjbnQpKQorCQkJaWYgKCFzYl9oYXNfcXVvdGFfYWN0aXZlKHNiLCBjbnQpKQogCQkJCWNvbnRpbnVlOwogCQkJaWYgKCFpbmZvX2RpcnR5KCZzYl9kcW9wdChzYiktPmluZm9bY250XSkgJiYKIAkJCSAgICBsaXN0X2VtcHR5KCZzYl9kcW9wdChzYiktPmluZm9bY250XS5kcWlfZGlydHlfbGlzdCkpCkBAIC0yNDUsNyArMjQ4LDcgQEAKIAkJCV9fdTMyIGZtdDsKIAogCQkJZG93bl9yZWFkKCZzYl9kcW9wdChzYiktPmRxcHRyX3NlbSk7Ci0JCQlpZiAoIXNiX2hhc19xdW90YV9lbmFibGVkKHNiLCB0eXBlKSkgeworCQkJaWYgKCFzYl9oYXNfcXVvdGFfYWN0aXZlKHNiLCB0eXBlKSkgewogCQkJCXVwX3JlYWQoJnNiX2Rxb3B0KHNiKS0+ZHFwdHJfc2VtKTsKIAkJCQlyZXR1cm4gLUVTUkNIOwogCQkJfQpkaWZmIC0tZ2l0IGEvZnMvcXVvdGFfdHJlZS5jIGIvZnMvcXVvdGFfdHJlZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1MzQwNGMKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9xdW90YV90cmVlLmMKQEAgLTAsMCArMSw2NDUgQEAKKy8qCisgKgl2ZnN2MCBxdW90YSBJTyBvcGVyYXRpb25zIG9uIGZpbGUKKyAqLworCisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L21vdW50Lmg+CisjaW5jbHVkZSA8bGludXgvZHFibGtfdjIuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3F1b3Rhb3BzLmg+CisKKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisKKyNpbmNsdWRlICJxdW90YV90cmVlLmgiCisKK01PRFVMRV9BVVRIT1IoIkphbiBLYXJhIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlF1b3RhIHRyaWUgc3VwcG9ydCIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisjZGVmaW5lIF9fUVVPVEFfUVRfUEFSQU5PSUEKKwordHlwZWRlZiBjaGFyICpkcWJ1Zl90OworCitzdGF0aWMgaW50IGdldF9pbmRleChzdHJ1Y3QgcXRyZWVfbWVtX2RxaW5mbyAqaW5mbywgcWlkX3QgaWQsIGludCBkZXB0aCkKK3sKKwl1bnNpZ25lZCBpbnQgZXBiID0gaW5mby0+ZHFpX3VzYWJsZV9icyA+PiAyOworCisJZGVwdGggPSBpbmZvLT5kcWlfcXRyZWVfZGVwdGggLSBkZXB0aCAtIDE7CisJd2hpbGUgKGRlcHRoLS0pCisJCWlkIC89IGVwYjsKKwlyZXR1cm4gaWQgJSBlcGI7Cit9CisKKy8qIE51bWJlciBvZiBlbnRyaWVzIGluIG9uZSBibG9ja3MgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHF0cmVlX2Rxc3RyX2luX2JsayhzdHJ1Y3QgcXRyZWVfbWVtX2RxaW5mbyAqaW5mbykKK3sKKwlyZXR1cm4gKGluZm8tPmRxaV91c2FibGVfYnMgLSBzaXplb2Yoc3RydWN0IHF0X2Rpc2tfZHFkYmhlYWRlcikpCisJICAgICAgIC8gaW5mby0+ZHFpX2VudHJ5X3NpemU7Cit9CisKK3N0YXRpYyBkcWJ1Zl90IGdldGRxYnVmKHNpemVfdCBzaXplKQoreworCWRxYnVmX3QgYnVmID0ga21hbGxvYyhzaXplLCBHRlBfTk9GUyk7CisJaWYgKCFidWYpCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIlZGUzogTm90IGVub3VnaCBtZW1vcnkgZm9yIHF1b3RhIGJ1ZmZlcnMuXG4iKTsKKwlyZXR1cm4gYnVmOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZnJlZWRxYnVmKGRxYnVmX3QgYnVmKQoreworCWtmcmVlKGJ1Zik7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3NpemVfdCByZWFkX2JsayhzdHJ1Y3QgcXRyZWVfbWVtX2RxaW5mbyAqaW5mbywgdWludCBibGssIGRxYnVmX3QgYnVmKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbmZvLT5kcWlfc2I7CisKKwltZW1zZXQoYnVmLCAwLCBpbmZvLT5kcWlfdXNhYmxlX2JzKTsKKwlyZXR1cm4gc2ItPnNfb3AtPnF1b3RhX3JlYWQoc2IsIGluZm8tPmRxaV90eXBlLCAoY2hhciAqKWJ1ZiwKKwkgICAgICAgaW5mby0+ZHFpX3VzYWJsZV9icywgYmxrIDw8IGluZm8tPmRxaV9ibG9ja3NpemVfYml0cyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3NpemVfdCB3cml0ZV9ibGsoc3RydWN0IHF0cmVlX21lbV9kcWluZm8gKmluZm8sIHVpbnQgYmxrLCBkcWJ1Zl90IGJ1ZikKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5mby0+ZHFpX3NiOworCisJcmV0dXJuIHNiLT5zX29wLT5xdW90YV93cml0ZShzYiwgaW5mby0+ZHFpX3R5cGUsIChjaGFyICopYnVmLAorCSAgICAgICBpbmZvLT5kcWlfdXNhYmxlX2JzLCBibGsgPDwgaW5mby0+ZHFpX2Jsb2Nrc2l6ZV9iaXRzKTsKK30KKworLyogUmVtb3ZlIGVtcHR5IGJsb2NrIGZyb20gbGlzdCBhbmQgcmV0dXJuIGl0ICovCitzdGF0aWMgaW50IGdldF9mcmVlX2RxYmxrKHN0cnVjdCBxdHJlZV9tZW1fZHFpbmZvICppbmZvKQoreworCWRxYnVmX3QgYnVmID0gZ2V0ZHFidWYoaW5mby0+ZHFpX3VzYWJsZV9icyk7CisJc3RydWN0IHF0X2Rpc2tfZHFkYmhlYWRlciAqZGggPSAoc3RydWN0IHF0X2Rpc2tfZHFkYmhlYWRlciAqKWJ1ZjsKKwlpbnQgcmV0LCBibGs7CisKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuIC1FTk9NRU07CisJaWYgKGluZm8tPmRxaV9mcmVlX2JsaykgeworCQlibGsgPSBpbmZvLT5kcWlfZnJlZV9ibGs7CisJCXJldCA9IHJlYWRfYmxrKGluZm8sIGJsaywgYnVmKTsKKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIG91dF9idWY7CisJCWluZm8tPmRxaV9mcmVlX2JsayA9IGxlMzJfdG9fY3B1KGRoLT5kcWRoX25leHRfZnJlZSk7CisJfQorCWVsc2UgeworCQltZW1zZXQoYnVmLCAwLCBpbmZvLT5kcWlfdXNhYmxlX2JzKTsKKwkJLyogQXNzdXJlIGJsb2NrIGFsbG9jYXRpb24uLi4gKi8KKwkJcmV0ID0gd3JpdGVfYmxrKGluZm8sIGluZm8tPmRxaV9ibG9ja3MsIGJ1Zik7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBvdXRfYnVmOworCQlibGsgPSBpbmZvLT5kcWlfYmxvY2tzKys7CisJfQorCW1hcmtfaW5mb19kaXJ0eShpbmZvLT5kcWlfc2IsIGluZm8tPmRxaV90eXBlKTsKKwlyZXQgPSBibGs7CitvdXRfYnVmOgorCWZyZWVkcWJ1ZihidWYpOworCXJldHVybiByZXQ7Cit9CisKKy8qIEluc2VydCBlbXB0eSBibG9jayB0byB0aGUgbGlzdCAqLworc3RhdGljIGludCBwdXRfZnJlZV9kcWJsayhzdHJ1Y3QgcXRyZWVfbWVtX2RxaW5mbyAqaW5mbywgZHFidWZfdCBidWYsIHVpbnQgYmxrKQoreworCXN0cnVjdCBxdF9kaXNrX2RxZGJoZWFkZXIgKmRoID0gKHN0cnVjdCBxdF9kaXNrX2RxZGJoZWFkZXIgKilidWY7CisJaW50IGVycjsKKworCWRoLT5kcWRoX25leHRfZnJlZSA9IGNwdV90b19sZTMyKGluZm8tPmRxaV9mcmVlX2Jsayk7CisJZGgtPmRxZGhfcHJldl9mcmVlID0gY3B1X3RvX2xlMzIoMCk7CisJZGgtPmRxZGhfZW50cmllcyA9IGNwdV90b19sZTE2KDApOworCWVyciA9IHdyaXRlX2JsayhpbmZvLCBibGssIGJ1Zik7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisJaW5mby0+ZHFpX2ZyZWVfYmxrID0gYmxrOworCW1hcmtfaW5mb19kaXJ0eShpbmZvLT5kcWlfc2IsIGluZm8tPmRxaV90eXBlKTsKKwlyZXR1cm4gMDsKK30KKworLyogUmVtb3ZlIGdpdmVuIGJsb2NrIGZyb20gdGhlIGxpc3Qgb2YgYmxvY2tzIHdpdGggZnJlZSBlbnRyaWVzICovCitzdGF0aWMgaW50IHJlbW92ZV9mcmVlX2RxZW50cnkoc3RydWN0IHF0cmVlX21lbV9kcWluZm8gKmluZm8sIGRxYnVmX3QgYnVmLCB1aW50IGJsaykKK3sKKwlkcWJ1Zl90IHRtcGJ1ZiA9IGdldGRxYnVmKGluZm8tPmRxaV91c2FibGVfYnMpOworCXN0cnVjdCBxdF9kaXNrX2RxZGJoZWFkZXIgKmRoID0gKHN0cnVjdCBxdF9kaXNrX2RxZGJoZWFkZXIgKilidWY7CisJdWludCBuZXh0YmxrID0gbGUzMl90b19jcHUoZGgtPmRxZGhfbmV4dF9mcmVlKTsKKwl1aW50IHByZXZibGsgPSBsZTMyX3RvX2NwdShkaC0+ZHFkaF9wcmV2X2ZyZWUpOworCWludCBlcnI7CisKKwlpZiAoIXRtcGJ1ZikKKwkJcmV0dXJuIC1FTk9NRU07CisJaWYgKG5leHRibGspIHsKKwkJZXJyID0gcmVhZF9ibGsoaW5mbywgbmV4dGJsaywgdG1wYnVmKTsKKwkJaWYgKGVyciA8IDApCisJCQlnb3RvIG91dF9idWY7CisJCSgoc3RydWN0IHF0X2Rpc2tfZHFkYmhlYWRlciAqKXRtcGJ1ZiktPmRxZGhfcHJldl9mcmVlID0KKwkJCQkJCQlkaC0+ZHFkaF9wcmV2X2ZyZWU7CisJCWVyciA9IHdyaXRlX2JsayhpbmZvLCBuZXh0YmxrLCB0bXBidWYpOworCQlpZiAoZXJyIDwgMCkKKwkJCWdvdG8gb3V0X2J1ZjsKKwl9CisJaWYgKHByZXZibGspIHsKKwkJZXJyID0gcmVhZF9ibGsoaW5mbywgcHJldmJsaywgdG1wYnVmKTsKKwkJaWYgKGVyciA8IDApCisJCQlnb3RvIG91dF9idWY7CisJCSgoc3RydWN0IHF0X2Rpc2tfZHFkYmhlYWRlciAqKXRtcGJ1ZiktPmRxZGhfbmV4dF9mcmVlID0KKwkJCQkJCQlkaC0+ZHFkaF9uZXh0X2ZyZWU7CisJCWVyciA9IHdyaXRlX2JsayhpbmZvLCBwcmV2YmxrLCB0bXBidWYpOworCQlpZiAoZXJyIDwgMCkKKwkJCWdvdG8gb3V0X2J1ZjsKKwl9IGVsc2UgeworCQlpbmZvLT5kcWlfZnJlZV9lbnRyeSA9IG5leHRibGs7CisJCW1hcmtfaW5mb19kaXJ0eShpbmZvLT5kcWlfc2IsIGluZm8tPmRxaV90eXBlKTsKKwl9CisJZnJlZWRxYnVmKHRtcGJ1Zik7CisJZGgtPmRxZGhfbmV4dF9mcmVlID0gZGgtPmRxZGhfcHJldl9mcmVlID0gY3B1X3RvX2xlMzIoMCk7CisJLyogTm8gbWF0dGVyIHdoZXRoZXIgd3JpdGUgc3VjY2VlZHMgYmxvY2sgaXMgb3V0IG9mIGxpc3QgKi8KKwlpZiAod3JpdGVfYmxrKGluZm8sIGJsaywgYnVmKSA8IDApCisJCXByaW50ayhLRVJOX0VSUiAiVkZTOiBDYW4ndCB3cml0ZSBibG9jayAoJXUpIHdpdGggZnJlZSBlbnRyaWVzLlxuIiwgYmxrKTsKKwlyZXR1cm4gMDsKK291dF9idWY6CisJZnJlZWRxYnVmKHRtcGJ1Zik7CisJcmV0dXJuIGVycjsKK30KKworLyogSW5zZXJ0IGdpdmVuIGJsb2NrIHRvIHRoZSBiZWdpbm5pbmcgb2YgbGlzdCB3aXRoIGZyZWUgZW50cmllcyAqLworc3RhdGljIGludCBpbnNlcnRfZnJlZV9kcWVudHJ5KHN0cnVjdCBxdHJlZV9tZW1fZHFpbmZvICppbmZvLCBkcWJ1Zl90IGJ1ZiwgdWludCBibGspCit7CisJZHFidWZfdCB0bXBidWYgPSBnZXRkcWJ1ZihpbmZvLT5kcWlfdXNhYmxlX2JzKTsKKwlzdHJ1Y3QgcXRfZGlza19kcWRiaGVhZGVyICpkaCA9IChzdHJ1Y3QgcXRfZGlza19kcWRiaGVhZGVyICopYnVmOworCWludCBlcnI7CisKKwlpZiAoIXRtcGJ1ZikKKwkJcmV0dXJuIC1FTk9NRU07CisJZGgtPmRxZGhfbmV4dF9mcmVlID0gY3B1X3RvX2xlMzIoaW5mby0+ZHFpX2ZyZWVfZW50cnkpOworCWRoLT5kcWRoX3ByZXZfZnJlZSA9IGNwdV90b19sZTMyKDApOworCWVyciA9IHdyaXRlX2JsayhpbmZvLCBibGssIGJ1Zik7CisJaWYgKGVyciA8IDApCisJCWdvdG8gb3V0X2J1ZjsKKwlpZiAoaW5mby0+ZHFpX2ZyZWVfZW50cnkpIHsKKwkJZXJyID0gcmVhZF9ibGsoaW5mbywgaW5mby0+ZHFpX2ZyZWVfZW50cnksIHRtcGJ1Zik7CisJCWlmIChlcnIgPCAwKQorCQkJZ290byBvdXRfYnVmOworCQkoKHN0cnVjdCBxdF9kaXNrX2RxZGJoZWFkZXIgKil0bXBidWYpLT5kcWRoX3ByZXZfZnJlZSA9CisJCQkJCQkJY3B1X3RvX2xlMzIoYmxrKTsKKwkJZXJyID0gd3JpdGVfYmxrKGluZm8sIGluZm8tPmRxaV9mcmVlX2VudHJ5LCB0bXBidWYpOworCQlpZiAoZXJyIDwgMCkKKwkJCWdvdG8gb3V0X2J1ZjsKKwl9CisJZnJlZWRxYnVmKHRtcGJ1Zik7CisJaW5mby0+ZHFpX2ZyZWVfZW50cnkgPSBibGs7CisJbWFya19pbmZvX2RpcnR5KGluZm8tPmRxaV9zYiwgaW5mby0+ZHFpX3R5cGUpOworCXJldHVybiAwOworb3V0X2J1ZjoKKwlmcmVlZHFidWYodG1wYnVmKTsKKwlyZXR1cm4gZXJyOworfQorCisvKiBJcyB0aGUgZW50cnkgaW4gdGhlIGJsb2NrIGZyZWU/ICovCitpbnQgcXRyZWVfZW50cnlfdW51c2VkKHN0cnVjdCBxdHJlZV9tZW1fZHFpbmZvICppbmZvLCBjaGFyICpkaXNrKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGluZm8tPmRxaV9lbnRyeV9zaXplOyBpKyspCisJCWlmIChkaXNrW2ldKQorCQkJcmV0dXJuIDA7CisJcmV0dXJuIDE7Cit9CitFWFBPUlRfU1lNQk9MKHF0cmVlX2VudHJ5X3VudXNlZCk7CisKKy8qIEZpbmQgc3BhY2UgZm9yIGRxdW90ICovCitzdGF0aWMgdWludCBmaW5kX2ZyZWVfZHFlbnRyeShzdHJ1Y3QgcXRyZWVfbWVtX2RxaW5mbyAqaW5mbywKKwkJCSAgICAgIHN0cnVjdCBkcXVvdCAqZHF1b3QsIGludCAqZXJyKQoreworCXVpbnQgYmxrLCBpOworCXN0cnVjdCBxdF9kaXNrX2RxZGJoZWFkZXIgKmRoOworCWRxYnVmX3QgYnVmID0gZ2V0ZHFidWYoaW5mby0+ZHFpX3VzYWJsZV9icyk7CisJY2hhciAqZGRxdW90OworCisJKmVyciA9IDA7CisJaWYgKCFidWYpIHsKKwkJKmVyciA9IC1FTk9NRU07CisJCXJldHVybiAwOworCX0KKwlkaCA9IChzdHJ1Y3QgcXRfZGlza19kcWRiaGVhZGVyICopYnVmOworCWlmIChpbmZvLT5kcWlfZnJlZV9lbnRyeSkgeworCQlibGsgPSBpbmZvLT5kcWlfZnJlZV9lbnRyeTsKKwkJKmVyciA9IHJlYWRfYmxrKGluZm8sIGJsaywgYnVmKTsKKwkJaWYgKCplcnIgPCAwKQorCQkJZ290byBvdXRfYnVmOworCX0gZWxzZSB7CisJCWJsayA9IGdldF9mcmVlX2RxYmxrKGluZm8pOworCQlpZiAoKGludClibGsgPCAwKSB7CisJCQkqZXJyID0gYmxrOworCQkJZnJlZWRxYnVmKGJ1Zik7CisJCQlyZXR1cm4gMDsKKwkJfQorCQltZW1zZXQoYnVmLCAwLCBpbmZvLT5kcWlfdXNhYmxlX2JzKTsKKwkJLyogVGhpcyBpcyBlbm91Z2ggYXMgYmxvY2sgaXMgYWxyZWFkeSB6ZXJvZWQgYW5kIGVudHJ5IGxpc3QgaXMgZW1wdHkuLi4gKi8KKwkJaW5mby0+ZHFpX2ZyZWVfZW50cnkgPSBibGs7CisJCW1hcmtfaW5mb19kaXJ0eShkcXVvdC0+ZHFfc2IsIGRxdW90LT5kcV90eXBlKTsKKwl9CisJLyogQmxvY2sgd2lsbCBiZSBmdWxsPyAqLworCWlmIChsZTE2X3RvX2NwdShkaC0+ZHFkaF9lbnRyaWVzKSArIDEgPj0gcXRyZWVfZHFzdHJfaW5fYmxrKGluZm8pKSB7CisJCSplcnIgPSByZW1vdmVfZnJlZV9kcWVudHJ5KGluZm8sIGJ1ZiwgYmxrKTsKKwkJaWYgKCplcnIgPCAwKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIlZGUzogZmluZF9mcmVlX2RxZW50cnkoKTogQ2FuJ3QgIgorCQkJICAgICAgICJyZW1vdmUgYmxvY2sgKCV1KSBmcm9tIGVudHJ5IGZyZWUgbGlzdC5cbiIsCisJCQkgICAgICAgYmxrKTsKKwkJCWdvdG8gb3V0X2J1ZjsKKwkJfQorCX0KKwlsZTE2X2FkZF9jcHUoJmRoLT5kcWRoX2VudHJpZXMsIDEpOworCS8qIEZpbmQgZnJlZSBzdHJ1Y3R1cmUgaW4gYmxvY2sgKi8KKwlmb3IgKGkgPSAwLCBkZHF1b3QgPSAoKGNoYXIgKilidWYpICsgc2l6ZW9mKHN0cnVjdCBxdF9kaXNrX2RxZGJoZWFkZXIpOworCSAgICAgaSA8IHF0cmVlX2Rxc3RyX2luX2JsayhpbmZvKSAmJiAhcXRyZWVfZW50cnlfdW51c2VkKGluZm8sIGRkcXVvdCk7CisJICAgICBpKyssIGRkcXVvdCArPSBpbmZvLT5kcWlfZW50cnlfc2l6ZSk7CisjaWZkZWYgX19RVU9UQV9RVF9QQVJBTk9JQQorCWlmIChpID09IHF0cmVlX2Rxc3RyX2luX2JsayhpbmZvKSkgeworCQlwcmludGsoS0VSTl9FUlIgIlZGUzogZmluZF9mcmVlX2RxZW50cnkoKTogRGF0YSBibG9jayBmdWxsICIKKwkJCQkiYnV0IGl0IHNob3VsZG4ndC5cbiIpOworCQkqZXJyID0gLUVJTzsKKwkJZ290byBvdXRfYnVmOworCX0KKyNlbmRpZgorCSplcnIgPSB3cml0ZV9ibGsoaW5mbywgYmxrLCBidWYpOworCWlmICgqZXJyIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgIlZGUzogZmluZF9mcmVlX2RxZW50cnkoKTogQ2FuJ3Qgd3JpdGUgcXVvdGEgIgorCQkJCSJkYXRhIGJsb2NrICV1LlxuIiwgYmxrKTsKKwkJZ290byBvdXRfYnVmOworCX0KKwlkcXVvdC0+ZHFfb2ZmID0gKGJsayA8PCBpbmZvLT5kcWlfYmxvY2tzaXplX2JpdHMpICsKKwkJCXNpemVvZihzdHJ1Y3QgcXRfZGlza19kcWRiaGVhZGVyKSArCisJCQlpICogaW5mby0+ZHFpX2VudHJ5X3NpemU7CisJZnJlZWRxYnVmKGJ1Zik7CisJcmV0dXJuIGJsazsKK291dF9idWY6CisJZnJlZWRxYnVmKGJ1Zik7CisJcmV0dXJuIDA7Cit9CisKKy8qIEluc2VydCByZWZlcmVuY2UgdG8gc3RydWN0dXJlIGludG8gdGhlIHRyaWUgKi8KK3N0YXRpYyBpbnQgZG9faW5zZXJ0X3RyZWUoc3RydWN0IHF0cmVlX21lbV9kcWluZm8gKmluZm8sIHN0cnVjdCBkcXVvdCAqZHF1b3QsCisJCQkgIHVpbnQgKnRyZWVibGssIGludCBkZXB0aCkKK3sKKwlkcWJ1Zl90IGJ1ZiA9IGdldGRxYnVmKGluZm8tPmRxaV91c2FibGVfYnMpOworCWludCByZXQgPSAwLCBuZXdzb24gPSAwLCBuZXdhY3QgPSAwOworCV9fbGUzMiAqcmVmOworCXVpbnQgbmV3YmxrOworCisJaWYgKCFidWYpCisJCXJldHVybiAtRU5PTUVNOworCWlmICghKnRyZWVibGspIHsKKwkJcmV0ID0gZ2V0X2ZyZWVfZHFibGsoaW5mbyk7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBvdXRfYnVmOworCQkqdHJlZWJsayA9IHJldDsKKwkJbWVtc2V0KGJ1ZiwgMCwgaW5mby0+ZHFpX3VzYWJsZV9icyk7CisJCW5ld2FjdCA9IDE7CisJfSBlbHNlIHsKKwkJcmV0ID0gcmVhZF9ibGsoaW5mbywgKnRyZWVibGssIGJ1Zik7CisJCWlmIChyZXQgPCAwKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIlZGUzogQ2FuJ3QgcmVhZCB0cmVlIHF1b3RhIGJsb2NrICIKKwkJCQkJIiV1LlxuIiwgKnRyZWVibGspOworCQkJZ290byBvdXRfYnVmOworCQl9CisJfQorCXJlZiA9IChfX2xlMzIgKilidWY7CisJbmV3YmxrID0gbGUzMl90b19jcHUocmVmW2dldF9pbmRleChpbmZvLCBkcXVvdC0+ZHFfaWQsIGRlcHRoKV0pOworCWlmICghbmV3YmxrKQorCQluZXdzb24gPSAxOworCWlmIChkZXB0aCA9PSBpbmZvLT5kcWlfcXRyZWVfZGVwdGggLSAxKSB7CisjaWZkZWYgX19RVU9UQV9RVF9QQVJBTk9JQQorCQlpZiAobmV3YmxrKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIlZGUzogSW5zZXJ0aW5nIGFscmVhZHkgcHJlc2VudCBxdW90YSAiCisJCQkJCSJlbnRyeSAoYmxvY2sgJXUpLlxuIiwKKwkJCSAgICAgICBsZTMyX3RvX2NwdShyZWZbZ2V0X2luZGV4KGluZm8sCisJCQkJCQlkcXVvdC0+ZHFfaWQsIGRlcHRoKV0pKTsKKwkJCXJldCA9IC1FSU87CisJCQlnb3RvIG91dF9idWY7CisJCX0KKyNlbmRpZgorCQluZXdibGsgPSBmaW5kX2ZyZWVfZHFlbnRyeShpbmZvLCBkcXVvdCwgJnJldCk7CisJfSBlbHNlIHsKKwkJcmV0ID0gZG9faW5zZXJ0X3RyZWUoaW5mbywgZHF1b3QsICZuZXdibGssIGRlcHRoKzEpOworCX0KKwlpZiAobmV3c29uICYmIHJldCA+PSAwKSB7CisJCXJlZltnZXRfaW5kZXgoaW5mbywgZHF1b3QtPmRxX2lkLCBkZXB0aCldID0KKwkJCQkJCQljcHVfdG9fbGUzMihuZXdibGspOworCQlyZXQgPSB3cml0ZV9ibGsoaW5mbywgKnRyZWVibGssIGJ1Zik7CisJfSBlbHNlIGlmIChuZXdhY3QgJiYgcmV0IDwgMCkgeworCQlwdXRfZnJlZV9kcWJsayhpbmZvLCBidWYsICp0cmVlYmxrKTsKKwl9CitvdXRfYnVmOgorCWZyZWVkcWJ1ZihidWYpOworCXJldHVybiByZXQ7Cit9CisKKy8qIFdyYXBwZXIgZm9yIGluc2VydGluZyBxdW90YSBzdHJ1Y3R1cmUgaW50byB0cmVlICovCitzdGF0aWMgaW5saW5lIGludCBkcV9pbnNlcnRfdHJlZShzdHJ1Y3QgcXRyZWVfbWVtX2RxaW5mbyAqaW5mbywKKwkJCQkgc3RydWN0IGRxdW90ICpkcXVvdCkKK3sKKwlpbnQgdG1wID0gUVRfVFJFRU9GRjsKKwlyZXR1cm4gZG9faW5zZXJ0X3RyZWUoaW5mbywgZHF1b3QsICZ0bXAsIDApOworfQorCisvKgorICoJV2UgZG9uJ3QgaGF2ZSB0byBiZSBhZnJhaWQgb2YgZGVhZGxvY2tzIGFzIHdlIG5ldmVyIGhhdmUgcXVvdGFzIG9uIHF1b3RhIGZpbGVzLi4uCisgKi8KK2ludCBxdHJlZV93cml0ZV9kcXVvdChzdHJ1Y3QgcXRyZWVfbWVtX2RxaW5mbyAqaW5mbywgc3RydWN0IGRxdW90ICpkcXVvdCkKK3sKKwlpbnQgdHlwZSA9IGRxdW90LT5kcV90eXBlOworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBkcXVvdC0+ZHFfc2I7CisJc3NpemVfdCByZXQ7CisJZHFidWZfdCBkZHF1b3QgPSBnZXRkcWJ1ZihpbmZvLT5kcWlfZW50cnlfc2l6ZSk7CisKKwlpZiAoIWRkcXVvdCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKiBkcV9vZmYgaXMgZ3VhcmRlZCBieSBkcWlvX211dGV4ICovCisJaWYgKCFkcXVvdC0+ZHFfb2ZmKSB7CisJCXJldCA9IGRxX2luc2VydF90cmVlKGluZm8sIGRxdW90KTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiVkZTOiBFcnJvciAlemQgb2NjdXJyZWQgd2hpbGUgIgorCQkJCQkiY3JlYXRpbmcgcXVvdGEuXG4iLCByZXQpOworCQkJZnJlZWRxYnVmKGRkcXVvdCk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCXNwaW5fbG9jaygmZHFfZGF0YV9sb2NrKTsKKwlpbmZvLT5kcWlfb3BzLT5tZW0yZGlza19kcWJsayhkZHF1b3QsIGRxdW90KTsKKwlzcGluX3VubG9jaygmZHFfZGF0YV9sb2NrKTsKKwlyZXQgPSBzYi0+c19vcC0+cXVvdGFfd3JpdGUoc2IsIHR5cGUsIChjaGFyICopZGRxdW90LAorCQkJCQlpbmZvLT5kcWlfZW50cnlfc2l6ZSwgZHF1b3QtPmRxX29mZik7CisJaWYgKHJldCAhPSBpbmZvLT5kcWlfZW50cnlfc2l6ZSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJWRlM6IGRxdW90YSB3cml0ZSBmYWlsZWQgb24gZGV2ICVzXG4iLAorCQkgICAgICAgc2ItPnNfaWQpOworCQlpZiAocmV0ID49IDApCisJCQlyZXQgPSAtRU5PU1BDOworCX0gZWxzZSB7CisJCXJldCA9IDA7CisJfQorCWRxc3RhdHMud3JpdGVzKys7CisJZnJlZWRxYnVmKGRkcXVvdCk7CisKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTChxdHJlZV93cml0ZV9kcXVvdCk7CisKKy8qIEZyZWUgZHF1b3QgZW50cnkgaW4gZGF0YSBibG9jayAqLworc3RhdGljIGludCBmcmVlX2RxZW50cnkoc3RydWN0IHF0cmVlX21lbV9kcWluZm8gKmluZm8sIHN0cnVjdCBkcXVvdCAqZHF1b3QsCisJCQl1aW50IGJsaykKK3sKKwlzdHJ1Y3QgcXRfZGlza19kcWRiaGVhZGVyICpkaDsKKwlkcWJ1Zl90IGJ1ZiA9IGdldGRxYnVmKGluZm8tPmRxaV91c2FibGVfYnMpOworCWludCByZXQgPSAwOworCisJaWYgKCFidWYpCisJCXJldHVybiAtRU5PTUVNOworCWlmIChkcXVvdC0+ZHFfb2ZmID4+IGluZm8tPmRxaV9ibG9ja3NpemVfYml0cyAhPSBibGspIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJWRlM6IFF1b3RhIHN0cnVjdHVyZSBoYXMgb2Zmc2V0IHRvIG90aGVyICIKKwkJICAiYmxvY2sgKCV1KSB0aGFuIGl0IHNob3VsZCAoJXUpLlxuIiwgYmxrLAorCQkgICh1aW50KShkcXVvdC0+ZHFfb2ZmID4+IGluZm8tPmRxaV9ibG9ja3NpemVfYml0cykpOworCQlnb3RvIG91dF9idWY7CisJfQorCXJldCA9IHJlYWRfYmxrKGluZm8sIGJsaywgYnVmKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgIlZGUzogQ2FuJ3QgcmVhZCBxdW90YSBkYXRhIGJsb2NrICV1XG4iLCBibGspOworCQlnb3RvIG91dF9idWY7CisJfQorCWRoID0gKHN0cnVjdCBxdF9kaXNrX2RxZGJoZWFkZXIgKilidWY7CisJbGUxNl9hZGRfY3B1KCZkaC0+ZHFkaF9lbnRyaWVzLCAtMSk7CisJaWYgKCFsZTE2X3RvX2NwdShkaC0+ZHFkaF9lbnRyaWVzKSkgewkvKiBCbG9jayBnb3QgZnJlZT8gKi8KKwkJcmV0ID0gcmVtb3ZlX2ZyZWVfZHFlbnRyeShpbmZvLCBidWYsIGJsayk7CisJCWlmIChyZXQgPj0gMCkKKwkJCXJldCA9IHB1dF9mcmVlX2RxYmxrKGluZm8sIGJ1ZiwgYmxrKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiVkZTOiBDYW4ndCBtb3ZlIHF1b3RhIGRhdGEgYmxvY2sgKCV1KSAiCisJCQkgICJ0byBmcmVlIGxpc3QuXG4iLCBibGspOworCQkJZ290byBvdXRfYnVmOworCQl9CisJfSBlbHNlIHsKKwkJbWVtc2V0KGJ1ZiArCisJCSAgICAgICAoZHF1b3QtPmRxX29mZiAmICgoMSA8PCBpbmZvLT5kcWlfYmxvY2tzaXplX2JpdHMpIC0gMSkpLAorCQkgICAgICAgMCwgaW5mby0+ZHFpX2VudHJ5X3NpemUpOworCQlpZiAobGUxNl90b19jcHUoZGgtPmRxZGhfZW50cmllcykgPT0KKwkJICAgIHF0cmVlX2Rxc3RyX2luX2JsayhpbmZvKSAtIDEpIHsKKwkJCS8qIEluc2VydCB3aWxsIHdyaXRlIGJsb2NrIGl0c2VsZiAqLworCQkJcmV0ID0gaW5zZXJ0X2ZyZWVfZHFlbnRyeShpbmZvLCBidWYsIGJsayk7CisJCQlpZiAocmV0IDwgMCkgeworCQkJCXByaW50ayhLRVJOX0VSUiAiVkZTOiBDYW4ndCBpbnNlcnQgcXVvdGEgZGF0YSAiCisJCQkJICAgICAgICJibG9jayAoJXUpIHRvIGZyZWUgZW50cnkgbGlzdC5cbiIsIGJsayk7CisJCQkJZ290byBvdXRfYnVmOworCQkJfQorCQl9IGVsc2UgeworCQkJcmV0ID0gd3JpdGVfYmxrKGluZm8sIGJsaywgYnVmKTsKKwkJCWlmIChyZXQgPCAwKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJWRlM6IENhbid0IHdyaXRlIHF1b3RhIGRhdGEgIgorCQkJCSAgImJsb2NrICV1XG4iLCBibGspOworCQkJCWdvdG8gb3V0X2J1ZjsKKwkJCX0KKwkJfQorCX0KKwlkcXVvdC0+ZHFfb2ZmID0gMDsJLyogUXVvdGEgaXMgbm93IHVuYXR0YWNoZWQgKi8KK291dF9idWY6CisJZnJlZWRxYnVmKGJ1Zik7CisJcmV0dXJuIHJldDsKK30KKworLyogUmVtb3ZlIHJlZmVyZW5jZSB0byBkcXVvdCBmcm9tIHRyZWUgKi8KK3N0YXRpYyBpbnQgcmVtb3ZlX3RyZWUoc3RydWN0IHF0cmVlX21lbV9kcWluZm8gKmluZm8sIHN0cnVjdCBkcXVvdCAqZHF1b3QsCisJCSAgICAgICB1aW50ICpibGssIGludCBkZXB0aCkKK3sKKwlkcWJ1Zl90IGJ1ZiA9IGdldGRxYnVmKGluZm8tPmRxaV91c2FibGVfYnMpOworCWludCByZXQgPSAwOworCXVpbnQgbmV3YmxrOworCV9fbGUzMiAqcmVmID0gKF9fbGUzMiAqKWJ1ZjsKKworCWlmICghYnVmKQorCQlyZXR1cm4gLUVOT01FTTsKKwlyZXQgPSByZWFkX2JsayhpbmZvLCAqYmxrLCBidWYpOworCWlmIChyZXQgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiVkZTOiBDYW4ndCByZWFkIHF1b3RhIGRhdGEgYmxvY2sgJXVcbiIsICpibGspOworCQlnb3RvIG91dF9idWY7CisJfQorCW5ld2JsayA9IGxlMzJfdG9fY3B1KHJlZltnZXRfaW5kZXgoaW5mbywgZHF1b3QtPmRxX2lkLCBkZXB0aCldKTsKKwlpZiAoZGVwdGggPT0gaW5mby0+ZHFpX3F0cmVlX2RlcHRoIC0gMSkgeworCQlyZXQgPSBmcmVlX2RxZW50cnkoaW5mbywgZHF1b3QsIG5ld2Jsayk7CisJCW5ld2JsayA9IDA7CisJfSBlbHNlIHsKKwkJcmV0ID0gcmVtb3ZlX3RyZWUoaW5mbywgZHF1b3QsICZuZXdibGssIGRlcHRoKzEpOworCX0KKwlpZiAocmV0ID49IDAgJiYgIW5ld2JsaykgeworCQlpbnQgaTsKKwkJcmVmW2dldF9pbmRleChpbmZvLCBkcXVvdC0+ZHFfaWQsIGRlcHRoKV0gPSBjcHVfdG9fbGUzMigwKTsKKwkJLyogQmxvY2sgZ290IGVtcHR5PyAqLworCQlmb3IgKGkgPSAwOworCQkgICAgIGkgPCAoaW5mby0+ZHFpX3VzYWJsZV9icyA+PiAyKSAmJiAhcmVmW2ldOworCQkgICAgIGkrKyk7CisJCS8qIERvbid0IHB1dCB0aGUgcm9vdCBibG9jayBpbnRvIHRoZSBmcmVlIGJsb2NrIGxpc3QgKi8KKwkJaWYgKGkgPT0gKGluZm8tPmRxaV91c2FibGVfYnMgPj4gMikKKwkJICAgICYmICpibGsgIT0gUVRfVFJFRU9GRikgeworCQkJcHV0X2ZyZWVfZHFibGsoaW5mbywgYnVmLCAqYmxrKTsKKwkJCSpibGsgPSAwOworCQl9IGVsc2UgeworCQkJcmV0ID0gd3JpdGVfYmxrKGluZm8sICpibGssIGJ1Zik7CisJCQlpZiAocmV0IDwgMCkKKwkJCQlwcmludGsoS0VSTl9FUlIgIlZGUzogQ2FuJ3Qgd3JpdGUgcXVvdGEgdHJlZSAiCisJCQkJICAiYmxvY2sgJXUuXG4iLCAqYmxrKTsKKwkJfQorCX0KK291dF9idWY6CisJZnJlZWRxYnVmKGJ1Zik7CisJcmV0dXJuIHJldDsKK30KKworLyogRGVsZXRlIGRxdW90IGZyb20gdHJlZSAqLworaW50IHF0cmVlX2RlbGV0ZV9kcXVvdChzdHJ1Y3QgcXRyZWVfbWVtX2RxaW5mbyAqaW5mbywgc3RydWN0IGRxdW90ICpkcXVvdCkKK3sKKwl1aW50IHRtcCA9IFFUX1RSRUVPRkY7CisKKwlpZiAoIWRxdW90LT5kcV9vZmYpCS8qIEV2ZW4gbm90IGFsbG9jYXRlZD8gKi8KKwkJcmV0dXJuIDA7CisJcmV0dXJuIHJlbW92ZV90cmVlKGluZm8sIGRxdW90LCAmdG1wLCAwKTsKK30KK0VYUE9SVF9TWU1CT0wocXRyZWVfZGVsZXRlX2RxdW90KTsKKworLyogRmluZCBlbnRyeSBpbiBibG9jayAqLworc3RhdGljIGxvZmZfdCBmaW5kX2Jsb2NrX2RxZW50cnkoc3RydWN0IHF0cmVlX21lbV9kcWluZm8gKmluZm8sCisJCQkJIHN0cnVjdCBkcXVvdCAqZHF1b3QsIHVpbnQgYmxrKQoreworCWRxYnVmX3QgYnVmID0gZ2V0ZHFidWYoaW5mby0+ZHFpX3VzYWJsZV9icyk7CisJbG9mZl90IHJldCA9IDA7CisJaW50IGk7CisJY2hhciAqZGRxdW90OworCisJaWYgKCFidWYpCisJCXJldHVybiAtRU5PTUVNOworCXJldCA9IHJlYWRfYmxrKGluZm8sIGJsaywgYnVmKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgIlZGUzogQ2FuJ3QgcmVhZCBxdW90YSB0cmVlIGJsb2NrICV1LlxuIiwgYmxrKTsKKwkJZ290byBvdXRfYnVmOworCX0KKwlmb3IgKGkgPSAwLCBkZHF1b3QgPSAoKGNoYXIgKilidWYpICsgc2l6ZW9mKHN0cnVjdCBxdF9kaXNrX2RxZGJoZWFkZXIpOworCSAgICAgaSA8IHF0cmVlX2Rxc3RyX2luX2JsayhpbmZvKSAmJiAhaW5mby0+ZHFpX29wcy0+aXNfaWQoZGRxdW90LCBkcXVvdCk7CisJICAgICBpKyssIGRkcXVvdCArPSBpbmZvLT5kcWlfZW50cnlfc2l6ZSk7CisJaWYgKGkgPT0gcXRyZWVfZHFzdHJfaW5fYmxrKGluZm8pKSB7CisJCXByaW50ayhLRVJOX0VSUiAiVkZTOiBRdW90YSBmb3IgaWQgJXUgcmVmZXJlbmNlZCAiCisJCSAgImJ1dCBub3QgcHJlc2VudC5cbiIsIGRxdW90LT5kcV9pZCk7CisJCXJldCA9IC1FSU87CisJCWdvdG8gb3V0X2J1ZjsKKwl9IGVsc2UgeworCQlyZXQgPSAoYmxrIDw8IGluZm8tPmRxaV9ibG9ja3NpemVfYml0cykgKyBzaXplb2Yoc3RydWN0CisJCSAgcXRfZGlza19kcWRiaGVhZGVyKSArIGkgKiBpbmZvLT5kcWlfZW50cnlfc2l6ZTsKKwl9CitvdXRfYnVmOgorCWZyZWVkcWJ1ZihidWYpOworCXJldHVybiByZXQ7Cit9CisKKy8qIEZpbmQgZW50cnkgZm9yIGdpdmVuIGlkIGluIHRoZSB0cmVlICovCitzdGF0aWMgbG9mZl90IGZpbmRfdHJlZV9kcWVudHJ5KHN0cnVjdCBxdHJlZV9tZW1fZHFpbmZvICppbmZvLAorCQkJCXN0cnVjdCBkcXVvdCAqZHF1b3QsIHVpbnQgYmxrLCBpbnQgZGVwdGgpCit7CisJZHFidWZfdCBidWYgPSBnZXRkcWJ1ZihpbmZvLT5kcWlfdXNhYmxlX2JzKTsKKwlsb2ZmX3QgcmV0ID0gMDsKKwlfX2xlMzIgKnJlZiA9IChfX2xlMzIgKilidWY7CisKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuIC1FTk9NRU07CisJcmV0ID0gcmVhZF9ibGsoaW5mbywgYmxrLCBidWYpOworCWlmIChyZXQgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiVkZTOiBDYW4ndCByZWFkIHF1b3RhIHRyZWUgYmxvY2sgJXUuXG4iLCBibGspOworCQlnb3RvIG91dF9idWY7CisJfQorCXJldCA9IDA7CisJYmxrID0gbGUzMl90b19jcHUocmVmW2dldF9pbmRleChpbmZvLCBkcXVvdC0+ZHFfaWQsIGRlcHRoKV0pOworCWlmICghYmxrKQkvKiBObyByZWZlcmVuY2U/ICovCisJCWdvdG8gb3V0X2J1ZjsKKwlpZiAoZGVwdGggPCBpbmZvLT5kcWlfcXRyZWVfZGVwdGggLSAxKQorCQlyZXQgPSBmaW5kX3RyZWVfZHFlbnRyeShpbmZvLCBkcXVvdCwgYmxrLCBkZXB0aCsxKTsKKwllbHNlCisJCXJldCA9IGZpbmRfYmxvY2tfZHFlbnRyeShpbmZvLCBkcXVvdCwgYmxrKTsKK291dF9idWY6CisJZnJlZWRxYnVmKGJ1Zik7CisJcmV0dXJuIHJldDsKK30KKworLyogRmluZCBlbnRyeSBmb3IgZ2l2ZW4gaWQgaW4gdGhlIHRyZWUgLSB3cmFwcGVyIGZ1bmN0aW9uICovCitzdGF0aWMgaW5saW5lIGxvZmZfdCBmaW5kX2RxZW50cnkoc3RydWN0IHF0cmVlX21lbV9kcWluZm8gKmluZm8sCisJCQkJICBzdHJ1Y3QgZHF1b3QgKmRxdW90KQoreworCXJldHVybiBmaW5kX3RyZWVfZHFlbnRyeShpbmZvLCBkcXVvdCwgUVRfVFJFRU9GRiwgMCk7Cit9CisKK2ludCBxdHJlZV9yZWFkX2RxdW90KHN0cnVjdCBxdHJlZV9tZW1fZHFpbmZvICppbmZvLCBzdHJ1Y3QgZHF1b3QgKmRxdW90KQoreworCWludCB0eXBlID0gZHF1b3QtPmRxX3R5cGU7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGRxdW90LT5kcV9zYjsKKwlsb2ZmX3Qgb2Zmc2V0OworCWRxYnVmX3QgZGRxdW90OworCWludCByZXQgPSAwOworCisjaWZkZWYgX19RVU9UQV9RVF9QQVJBTk9JQQorCS8qIEludmFsaWRhdGVkIHF1b3RhPyAqLworCWlmICghc2JfZHFvcHQoZHF1b3QtPmRxX3NiKS0+ZmlsZXNbdHlwZV0pIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJWRlM6IFF1b3RhIGludmFsaWRhdGVkIHdoaWxlIHJlYWRpbmchXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorI2VuZGlmCisJLyogRG8gd2Uga25vdyBvZmZzZXQgb2YgdGhlIGRxdW90IGVudHJ5IGluIHRoZSBxdW90YSBmaWxlPyAqLworCWlmICghZHF1b3QtPmRxX29mZikgeworCQlvZmZzZXQgPSBmaW5kX2RxZW50cnkoaW5mbywgZHF1b3QpOworCQlpZiAob2Zmc2V0IDw9IDApIHsJLyogRW50cnkgbm90IHByZXNlbnQ/ICovCisJCQlpZiAob2Zmc2V0IDwgMCkKKwkJCQlwcmludGsoS0VSTl9FUlIgIlZGUzogQ2FuJ3QgcmVhZCBxdW90YSAiCisJCQkJICAic3RydWN0dXJlIGZvciBpZCAldS5cbiIsIGRxdW90LT5kcV9pZCk7CisJCQlkcXVvdC0+ZHFfb2ZmID0gMDsKKwkJCXNldF9iaXQoRFFfRkFLRV9CLCAmZHF1b3QtPmRxX2ZsYWdzKTsKKwkJCW1lbXNldCgmZHF1b3QtPmRxX2RxYiwgMCwgc2l6ZW9mKHN0cnVjdCBtZW1fZHFibGspKTsKKwkJCXJldCA9IG9mZnNldDsKKwkJCWdvdG8gb3V0OworCQl9CisJCWRxdW90LT5kcV9vZmYgPSBvZmZzZXQ7CisJfQorCWRkcXVvdCA9IGdldGRxYnVmKGluZm8tPmRxaV9lbnRyeV9zaXplKTsKKwlpZiAoIWRkcXVvdCkKKwkJcmV0dXJuIC1FTk9NRU07CisJcmV0ID0gc2ItPnNfb3AtPnF1b3RhX3JlYWQoc2IsIHR5cGUsIChjaGFyICopZGRxdW90LAorCQkJCSAgIGluZm8tPmRxaV9lbnRyeV9zaXplLCBkcXVvdC0+ZHFfb2ZmKTsKKwlpZiAocmV0ICE9IGluZm8tPmRxaV9lbnRyeV9zaXplKSB7CisJCWlmIChyZXQgPj0gMCkKKwkJCXJldCA9IC1FSU87CisJCXByaW50ayhLRVJOX0VSUiAiVkZTOiBFcnJvciB3aGlsZSByZWFkaW5nIHF1b3RhICIKKwkJCQkic3RydWN0dXJlIGZvciBpZCAldS5cbiIsIGRxdW90LT5kcV9pZCk7CisJCXNldF9iaXQoRFFfRkFLRV9CLCAmZHF1b3QtPmRxX2ZsYWdzKTsKKwkJbWVtc2V0KCZkcXVvdC0+ZHFfZHFiLCAwLCBzaXplb2Yoc3RydWN0IG1lbV9kcWJsaykpOworCQlmcmVlZHFidWYoZGRxdW90KTsKKwkJZ290byBvdXQ7CisJfQorCXNwaW5fbG9jaygmZHFfZGF0YV9sb2NrKTsKKwlpbmZvLT5kcWlfb3BzLT5kaXNrMm1lbV9kcWJsayhkcXVvdCwgZGRxdW90KTsKKwlpZiAoIWRxdW90LT5kcV9kcWIuZHFiX2JoYXJkbGltaXQgJiYKKwkgICAgIWRxdW90LT5kcV9kcWIuZHFiX2Jzb2Z0bGltaXQgJiYKKwkgICAgIWRxdW90LT5kcV9kcWIuZHFiX2loYXJkbGltaXQgJiYKKwkgICAgIWRxdW90LT5kcV9kcWIuZHFiX2lzb2Z0bGltaXQpCisJCXNldF9iaXQoRFFfRkFLRV9CLCAmZHF1b3QtPmRxX2ZsYWdzKTsKKwlzcGluX3VubG9jaygmZHFfZGF0YV9sb2NrKTsKKwlmcmVlZHFidWYoZGRxdW90KTsKK291dDoKKwlkcXN0YXRzLnJlYWRzKys7CisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0wocXRyZWVfcmVhZF9kcXVvdCk7CisKKy8qIENoZWNrIHdoZXRoZXIgZHF1b3Qgc2hvdWxkIG5vdCBiZSBkZWxldGVkLiBXZSBrbm93IHdlIGFyZQorICogdGhlIG9ubHkgb25lIG9wZXJhdGluZyBvbiBkcXVvdCAodGhhbmtzIHRvIGRxX2xvY2spICovCitpbnQgcXRyZWVfcmVsZWFzZV9kcXVvdChzdHJ1Y3QgcXRyZWVfbWVtX2RxaW5mbyAqaW5mbywgc3RydWN0IGRxdW90ICpkcXVvdCkKK3sKKwlpZiAodGVzdF9iaXQoRFFfRkFLRV9CLCAmZHF1b3QtPmRxX2ZsYWdzKSAmJiAhKGRxdW90LT5kcV9kcWIuZHFiX2N1cmlub2RlcyB8IGRxdW90LT5kcV9kcWIuZHFiX2N1cnNwYWNlKSkKKwkJcmV0dXJuIHF0cmVlX2RlbGV0ZV9kcXVvdChpbmZvLCBkcXVvdCk7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKHF0cmVlX3JlbGVhc2VfZHF1b3QpOwpkaWZmIC0tZ2l0IGEvZnMvcXVvdGFfdHJlZS5oIGIvZnMvcXVvdGFfdHJlZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExYWI4ZGIKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9xdW90YV90cmVlLmgKQEAgLTAsMCArMSwyNSBAQAorLyoKKyAqCURlZmluaXRpb25zIG9mIHN0cnVjdHVyZXMgZm9yIHZmc3YwIHF1b3RhIGZvcm1hdAorICovCisKKyNpZm5kZWYgX0xJTlVYX1FVT1RBX1RSRUVfSAorI2RlZmluZSBfTElOVVhfUVVPVEFfVFJFRV9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3F1b3RhLmg+CisKKy8qCisgKiAgU3RydWN0dXJlIG9mIGhlYWRlciBvZiBibG9jayB3aXRoIHF1b3RhIHN0cnVjdHVyZXMuIEl0IGlzIHBhZGRlZCB0byAxNiBieXRlcyBzbworICogIHRoZXJlIHdpbGwgYmUgc3BhY2UgZm9yIGV4YWN0bHkgMjEgcXVvdGEtZW50cmllcyBpbiBhIGJsb2NrCisgKi8KK3N0cnVjdCBxdF9kaXNrX2RxZGJoZWFkZXIgeworCV9fbGUzMiBkcWRoX25leHRfZnJlZTsJLyogTnVtYmVyIG9mIG5leHQgYmxvY2sgd2l0aCBmcmVlIGVudHJ5ICovCisJX19sZTMyIGRxZGhfcHJldl9mcmVlOwkvKiBOdW1iZXIgb2YgcHJldmlvdXMgYmxvY2sgd2l0aCBmcmVlIGVudHJ5ICovCisJX19sZTE2IGRxZGhfZW50cmllczsJLyogTnVtYmVyIG9mIHZhbGlkIGVudHJpZXMgaW4gYmxvY2sgKi8KKwlfX2xlMTYgZHFkaF9wYWQxOworCV9fbGUzMiBkcWRoX3BhZDI7Cit9OworCisjZGVmaW5lIFFUX1RSRUVPRkYJMQkJLyogT2Zmc2V0IG9mIHRyZWUgaW4gZmlsZSBpbiBibG9ja3MgKi8KKworI2VuZGlmIC8qIF9MSU5VWF9RVU9UQUlPX1RSRUVfSCAqLwpkaWZmIC0tZ2l0IGEvZnMvcXVvdGFfdjEuYyBiL2ZzL3F1b3RhX3YxLmMKaW5kZXggNWFlMTViMS4uYjRhZjFjNiAxMDA2NDQKLS0tIGEvZnMvcXVvdGFfdjEuYworKysgYi9mcy9xdW90YV92MS5jCkBAIC0zLDI1ICszLDM5IEBACiAjaW5jbHVkZSA8bGludXgvcXVvdGEuaD4KICNpbmNsdWRlIDxsaW51eC9xdW90YW9wcy5oPgogI2luY2x1ZGUgPGxpbnV4L2RxYmxrX3YxLmg+Ci0jaW5jbHVkZSA8bGludXgvcXVvdGFpb192MS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KIAorI2luY2x1ZGUgInF1b3RhaW9fdjEuaCIKKwogTU9EVUxFX0FVVEhPUigiSmFuIEthcmEiKTsKIE1PRFVMRV9ERVNDUklQVElPTigiT2xkIHF1b3RhIGZvcm1hdCBzdXBwb3J0Iik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKKyNkZWZpbmUgUVVPVEFCTE9DS19CSVRTIDEwCisjZGVmaW5lIFFVT1RBQkxPQ0tfU0laRSAoMSA8PCBRVU9UQUJMT0NLX0JJVFMpCisKK3N0YXRpYyBpbmxpbmUgcXNpemVfdCB2MV9zdG9xYihxc2l6ZV90IHNwYWNlKQoreworCXJldHVybiAoc3BhY2UgKyBRVU9UQUJMT0NLX1NJWkUgLSAxKSA+PiBRVU9UQUJMT0NLX0JJVFM7Cit9CisKK3N0YXRpYyBpbmxpbmUgcXNpemVfdCB2MV9xYnRvcyhxc2l6ZV90IGJsb2NrcykKK3sKKwlyZXR1cm4gYmxvY2tzIDw8IFFVT1RBQkxPQ0tfQklUUzsKK30KKwogc3RhdGljIHZvaWQgdjFfZGlzazJtZW1fZHFibGsoc3RydWN0IG1lbV9kcWJsayAqbSwgc3RydWN0IHYxX2Rpc2tfZHFibGsgKmQpCiB7CiAJbS0+ZHFiX2loYXJkbGltaXQgPSBkLT5kcWJfaWhhcmRsaW1pdDsKIAltLT5kcWJfaXNvZnRsaW1pdCA9IGQtPmRxYl9pc29mdGxpbWl0OwogCW0tPmRxYl9jdXJpbm9kZXMgPSBkLT5kcWJfY3VyaW5vZGVzOwotCW0tPmRxYl9iaGFyZGxpbWl0ID0gZC0+ZHFiX2JoYXJkbGltaXQ7Ci0JbS0+ZHFiX2Jzb2Z0bGltaXQgPSBkLT5kcWJfYnNvZnRsaW1pdDsKLQltLT5kcWJfY3Vyc3BhY2UgPSAoKHFzaXplX3QpZC0+ZHFiX2N1cmJsb2NrcykgPDwgUVVPVEFCTE9DS19CSVRTOworCW0tPmRxYl9iaGFyZGxpbWl0ID0gdjFfcWJ0b3MoZC0+ZHFiX2JoYXJkbGltaXQpOworCW0tPmRxYl9ic29mdGxpbWl0ID0gdjFfcWJ0b3MoZC0+ZHFiX2Jzb2Z0bGltaXQpOworCW0tPmRxYl9jdXJzcGFjZSA9IHYxX3FidG9zKGQtPmRxYl9jdXJibG9ja3MpOwogCW0tPmRxYl9pdGltZSA9IGQtPmRxYl9pdGltZTsKIAltLT5kcWJfYnRpbWUgPSBkLT5kcWJfYnRpbWU7CiB9CkBAIC0zMSw5ICs0NSw5IEBACiAJZC0+ZHFiX2loYXJkbGltaXQgPSBtLT5kcWJfaWhhcmRsaW1pdDsKIAlkLT5kcWJfaXNvZnRsaW1pdCA9IG0tPmRxYl9pc29mdGxpbWl0OwogCWQtPmRxYl9jdXJpbm9kZXMgPSBtLT5kcWJfY3VyaW5vZGVzOwotCWQtPmRxYl9iaGFyZGxpbWl0ID0gbS0+ZHFiX2JoYXJkbGltaXQ7Ci0JZC0+ZHFiX2Jzb2Z0bGltaXQgPSBtLT5kcWJfYnNvZnRsaW1pdDsKLQlkLT5kcWJfY3VyYmxvY2tzID0gdG9xYihtLT5kcWJfY3Vyc3BhY2UpOworCWQtPmRxYl9iaGFyZGxpbWl0ID0gdjFfc3RvcWIobS0+ZHFiX2JoYXJkbGltaXQpOworCWQtPmRxYl9ic29mdGxpbWl0ID0gdjFfc3RvcWIobS0+ZHFiX2Jzb2Z0bGltaXQpOworCWQtPmRxYl9jdXJibG9ja3MgPSB2MV9zdG9xYihtLT5kcWJfY3Vyc3BhY2UpOwogCWQtPmRxYl9pdGltZSA9IG0tPmRxYl9pdGltZTsKIAlkLT5kcWJfYnRpbWUgPSBtLT5kcWJfYnRpbWU7CiB9CmRpZmYgLS1naXQgYS9mcy9xdW90YV92Mi5jIGIvZnMvcXVvdGFfdjIuYwppbmRleCBiNTM4MjdkLi5iNjE4YjU2IDEwMDY0NAotLS0gYS9mcy9xdW90YV92Mi5jCisrKyBiL2ZzL3F1b3RhX3YyLmMKQEAgLTYsNyArNiw2IEBACiAjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC9tb3VudC5oPgogI2luY2x1ZGUgPGxpbnV4L2RxYmxrX3YyLmg+Ci0jaW5jbHVkZSA8bGludXgvcXVvdGFpb192Mi5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KQEAgLTE1LDE2ICsxNCwzNyBAQAogCiAjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgogCisjaW5jbHVkZSAicXVvdGFfdHJlZS5oIgorI2luY2x1ZGUgInF1b3RhaW9fdjIuaCIKKwogTU9EVUxFX0FVVEhPUigiSmFuIEthcmEiKTsKIE1PRFVMRV9ERVNDUklQVElPTigiUXVvdGEgZm9ybWF0IHYyIHN1cHBvcnQiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIAogI2RlZmluZSBfX1FVT1RBX1YyX1BBUkFOT0lBCiAKLXR5cGVkZWYgY2hhciAqZHFidWZfdDsKK3N0YXRpYyB2b2lkIHYyX21lbTJkaXNrZHFiKHZvaWQgKmRwLCBzdHJ1Y3QgZHF1b3QgKmRxdW90KTsKK3N0YXRpYyB2b2lkIHYyX2Rpc2sybWVtZHFiKHN0cnVjdCBkcXVvdCAqZHF1b3QsIHZvaWQgKmRwKTsKK3N0YXRpYyBpbnQgdjJfaXNfaWQodm9pZCAqZHAsIHN0cnVjdCBkcXVvdCAqZHF1b3QpOwogCi0jZGVmaW5lIEdFVElESU5ERVgoaWQsIGRlcHRoKSAoKChpZCkgPj4gKChWMl9EUVRSRUVERVBUSC0oZGVwdGgpLTEpKjgpKSAmIDB4ZmYpCi0jZGVmaW5lIEdFVEVOVFJJRVMoYnVmKSAoKHN0cnVjdCB2Ml9kaXNrX2RxYmxrICopKCgoY2hhciAqKWJ1Zikrc2l6ZW9mKHN0cnVjdCB2Ml9kaXNrX2RxZGJoZWFkZXIpKSkKK3N0YXRpYyBzdHJ1Y3QgcXRyZWVfZm10X29wZXJhdGlvbnMgdjJfcXRyZWVfb3BzID0geworCS5tZW0yZGlza19kcWJsayA9IHYyX21lbTJkaXNrZHFiLAorCS5kaXNrMm1lbV9kcWJsayA9IHYyX2Rpc2sybWVtZHFiLAorCS5pc19pZCA9IHYyX2lzX2lkLAorfTsKKworI2RlZmluZSBRVU9UQUJMT0NLX0JJVFMgMTAKKyNkZWZpbmUgUVVPVEFCTE9DS19TSVpFICgxIDw8IFFVT1RBQkxPQ0tfQklUUykKKworc3RhdGljIGlubGluZSBxc2l6ZV90IHYyX3N0b3FiKHFzaXplX3Qgc3BhY2UpCit7CisJcmV0dXJuIChzcGFjZSArIFFVT1RBQkxPQ0tfU0laRSAtIDEpID4+IFFVT1RBQkxPQ0tfQklUUzsKK30KKworc3RhdGljIGlubGluZSBxc2l6ZV90IHYyX3FidG9zKHFzaXplX3QgYmxvY2tzKQoreworCXJldHVybiBibG9ja3MgPDwgUVVPVEFCTE9DS19CSVRTOworfQogCiAvKiBDaGVjayB3aGV0aGVyIGdpdmVuIGZpbGUgaXMgcmVhbGx5IHZmc3YwIHF1b3RhZmlsZSAqLwogc3RhdGljIGludCB2Ml9jaGVja19xdW90YV9maWxlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCB0eXBlKQpAQCAtNTAsNyArNzAsOCBAQAogc3RhdGljIGludCB2Ml9yZWFkX2ZpbGVfaW5mbyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgdHlwZSkKIHsKIAlzdHJ1Y3QgdjJfZGlza19kcWluZm8gZGluZm87Ci0Jc3RydWN0IG1lbV9kcWluZm8gKmluZm8gPSBzYl9kcW9wdChzYiktPmluZm8rdHlwZTsKKwlzdHJ1Y3QgbWVtX2RxaW5mbyAqaW5mbyA9IHNiX2RxaW5mbyhzYiwgdHlwZSk7CisJc3RydWN0IHF0cmVlX21lbV9kcWluZm8gKnFpbmZvOwogCXNzaXplX3Qgc2l6ZTsKIAogCXNpemUgPSBzYi0+c19vcC0+cXVvdGFfcmVhZChzYiwgdHlwZSwgKGNoYXIgKikmZGluZm8sCkBAIC02MCwxNSArODEsMjkgQEAKIAkJCXNiLT5zX2lkKTsKIAkJcmV0dXJuIC0xOwogCX0KKwlpbmZvLT5kcWlfcHJpdiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBxdHJlZV9tZW1fZHFpbmZvKSwgR0ZQX05PRlMpOworCWlmICghaW5mby0+ZHFpX3ByaXYpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkgICAgICAgIk5vdCBlbm91Z2ggbWVtb3J5IGZvciBxdW90YSBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUuXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKwlxaW5mbyA9IGluZm8tPmRxaV9wcml2OwogCS8qIGxpbWl0cyBhcmUgc3RvcmVkIGFzIHVuc2lnbmVkIDMyLWJpdCBkYXRhICovCiAJaW5mby0+ZHFpX21heGJsaW1pdCA9IDB4ZmZmZmZmZmY7CiAJaW5mby0+ZHFpX21heGlsaW1pdCA9IDB4ZmZmZmZmZmY7CiAJaW5mby0+ZHFpX2JncmFjZSA9IGxlMzJfdG9fY3B1KGRpbmZvLmRxaV9iZ3JhY2UpOwogCWluZm8tPmRxaV9pZ3JhY2UgPSBsZTMyX3RvX2NwdShkaW5mby5kcWlfaWdyYWNlKTsKIAlpbmZvLT5kcWlfZmxhZ3MgPSBsZTMyX3RvX2NwdShkaW5mby5kcWlfZmxhZ3MpOwotCWluZm8tPnUudjJfaS5kcWlfYmxvY2tzID0gbGUzMl90b19jcHUoZGluZm8uZHFpX2Jsb2Nrcyk7Ci0JaW5mby0+dS52Ml9pLmRxaV9mcmVlX2JsayA9IGxlMzJfdG9fY3B1KGRpbmZvLmRxaV9mcmVlX2Jsayk7Ci0JaW5mby0+dS52Ml9pLmRxaV9mcmVlX2VudHJ5ID0gbGUzMl90b19jcHUoZGluZm8uZHFpX2ZyZWVfZW50cnkpOworCXFpbmZvLT5kcWlfc2IgPSBzYjsKKwlxaW5mby0+ZHFpX3R5cGUgPSB0eXBlOworCXFpbmZvLT5kcWlfYmxvY2tzID0gbGUzMl90b19jcHUoZGluZm8uZHFpX2Jsb2Nrcyk7CisJcWluZm8tPmRxaV9mcmVlX2JsayA9IGxlMzJfdG9fY3B1KGRpbmZvLmRxaV9mcmVlX2Jsayk7CisJcWluZm8tPmRxaV9mcmVlX2VudHJ5ID0gbGUzMl90b19jcHUoZGluZm8uZHFpX2ZyZWVfZW50cnkpOworCXFpbmZvLT5kcWlfYmxvY2tzaXplX2JpdHMgPSBWMl9EUUJMS1NJWkVfQklUUzsKKwlxaW5mby0+ZHFpX3VzYWJsZV9icyA9IDEgPDwgVjJfRFFCTEtTSVpFX0JJVFM7CisJcWluZm8tPmRxaV9xdHJlZV9kZXB0aCA9IHF0cmVlX2RlcHRoKHFpbmZvKTsKKwlxaW5mby0+ZHFpX2VudHJ5X3NpemUgPSBzaXplb2Yoc3RydWN0IHYyX2Rpc2tfZHFibGspOworCXFpbmZvLT5kcWlfb3BzID0gJnYyX3F0cmVlX29wczsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNzYsNyArMTExLDggQEAKIHN0YXRpYyBpbnQgdjJfd3JpdGVfZmlsZV9pbmZvKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCB0eXBlKQogewogCXN0cnVjdCB2Ml9kaXNrX2RxaW5mbyBkaW5mbzsKLQlzdHJ1Y3QgbWVtX2RxaW5mbyAqaW5mbyA9IHNiX2Rxb3B0KHNiKS0+aW5mbyt0eXBlOworCXN0cnVjdCBtZW1fZHFpbmZvICppbmZvID0gc2JfZHFpbmZvKHNiLCB0eXBlKTsKKwlzdHJ1Y3QgcXRyZWVfbWVtX2RxaW5mbyAqcWluZm8gPSBpbmZvLT5kcWlfcHJpdjsKIAlzc2l6ZV90IHNpemU7CiAKIAlzcGluX2xvY2soJmRxX2RhdGFfbG9jayk7CkBAIC04NSw5ICsxMjEsOSBAQAogCWRpbmZvLmRxaV9pZ3JhY2UgPSBjcHVfdG9fbGUzMihpbmZvLT5kcWlfaWdyYWNlKTsKIAlkaW5mby5kcWlfZmxhZ3MgPSBjcHVfdG9fbGUzMihpbmZvLT5kcWlfZmxhZ3MgJiBEUUZfTUFTSyk7CiAJc3Bpbl91bmxvY2soJmRxX2RhdGFfbG9jayk7Ci0JZGluZm8uZHFpX2Jsb2NrcyA9IGNwdV90b19sZTMyKGluZm8tPnUudjJfaS5kcWlfYmxvY2tzKTsKLQlkaW5mby5kcWlfZnJlZV9ibGsgPSBjcHVfdG9fbGUzMihpbmZvLT51LnYyX2kuZHFpX2ZyZWVfYmxrKTsKLQlkaW5mby5kcWlfZnJlZV9lbnRyeSA9IGNwdV90b19sZTMyKGluZm8tPnUudjJfaS5kcWlfZnJlZV9lbnRyeSk7CisJZGluZm8uZHFpX2Jsb2NrcyA9IGNwdV90b19sZTMyKHFpbmZvLT5kcWlfYmxvY2tzKTsKKwlkaW5mby5kcWlfZnJlZV9ibGsgPSBjcHVfdG9fbGUzMihxaW5mby0+ZHFpX2ZyZWVfYmxrKTsKKwlkaW5mby5kcWlfZnJlZV9lbnRyeSA9IGNwdV90b19sZTMyKHFpbmZvLT5kcWlfZnJlZV9lbnRyeSk7CiAJc2l6ZSA9IHNiLT5zX29wLT5xdW90YV93cml0ZShzYiwgdHlwZSwgKGNoYXIgKikmZGluZm8sCiAJICAgICAgIHNpemVvZihzdHJ1Y3QgdjJfZGlza19kcWluZm8pLCBWMl9EUUlORk9PRkYpOwogCWlmIChzaXplICE9IHNpemVvZihzdHJ1Y3QgdjJfZGlza19kcWluZm8pKSB7CkBAIC05OCw1NzQgKzEzNCw3NSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBkaXNrMm1lbWRxYihzdHJ1Y3QgbWVtX2RxYmxrICptLCBzdHJ1Y3QgdjJfZGlza19kcWJsayAqZCkKK3N0YXRpYyB2b2lkIHYyX2Rpc2sybWVtZHFiKHN0cnVjdCBkcXVvdCAqZHF1b3QsIHZvaWQgKmRwKQogeworCXN0cnVjdCB2Ml9kaXNrX2RxYmxrICpkID0gZHAsIGVtcHR5OworCXN0cnVjdCBtZW1fZHFibGsgKm0gPSAmZHF1b3QtPmRxX2RxYjsKKwogCW0tPmRxYl9paGFyZGxpbWl0ID0gbGUzMl90b19jcHUoZC0+ZHFiX2loYXJkbGltaXQpOwogCW0tPmRxYl9pc29mdGxpbWl0ID0gbGUzMl90b19jcHUoZC0+ZHFiX2lzb2Z0bGltaXQpOwogCW0tPmRxYl9jdXJpbm9kZXMgPSBsZTMyX3RvX2NwdShkLT5kcWJfY3VyaW5vZGVzKTsKIAltLT5kcWJfaXRpbWUgPSBsZTY0X3RvX2NwdShkLT5kcWJfaXRpbWUpOwotCW0tPmRxYl9iaGFyZGxpbWl0ID0gbGUzMl90b19jcHUoZC0+ZHFiX2JoYXJkbGltaXQpOwotCW0tPmRxYl9ic29mdGxpbWl0ID0gbGUzMl90b19jcHUoZC0+ZHFiX2Jzb2Z0bGltaXQpOworCW0tPmRxYl9iaGFyZGxpbWl0ID0gdjJfcWJ0b3MobGUzMl90b19jcHUoZC0+ZHFiX2JoYXJkbGltaXQpKTsKKwltLT5kcWJfYnNvZnRsaW1pdCA9IHYyX3FidG9zKGxlMzJfdG9fY3B1KGQtPmRxYl9ic29mdGxpbWl0KSk7CiAJbS0+ZHFiX2N1cnNwYWNlID0gbGU2NF90b19jcHUoZC0+ZHFiX2N1cnNwYWNlKTsKIAltLT5kcWJfYnRpbWUgPSBsZTY0X3RvX2NwdShkLT5kcWJfYnRpbWUpOworCS8qIFdlIG5lZWQgdG8gZXNjYXBlIGJhY2sgYWxsLXplcm8gc3RydWN0dXJlICovCisJbWVtc2V0KCZlbXB0eSwgMCwgc2l6ZW9mKHN0cnVjdCB2Ml9kaXNrX2RxYmxrKSk7CisJZW1wdHkuZHFiX2l0aW1lID0gY3B1X3RvX2xlNjQoMSk7CisJaWYgKCFtZW1jbXAoJmVtcHR5LCBkcCwgc2l6ZW9mKHN0cnVjdCB2Ml9kaXNrX2RxYmxrKSkpCisJCW0tPmRxYl9pdGltZSA9IDA7CiB9CiAKLXN0YXRpYyB2b2lkIG1lbTJkaXNrZHFiKHN0cnVjdCB2Ml9kaXNrX2RxYmxrICpkLCBzdHJ1Y3QgbWVtX2RxYmxrICptLCBxaWRfdCBpZCkKK3N0YXRpYyB2b2lkIHYyX21lbTJkaXNrZHFiKHZvaWQgKmRwLCBzdHJ1Y3QgZHF1b3QgKmRxdW90KQogeworCXN0cnVjdCB2Ml9kaXNrX2RxYmxrICpkID0gZHA7CisJc3RydWN0IG1lbV9kcWJsayAqbSA9ICZkcXVvdC0+ZHFfZHFiOworCXN0cnVjdCBxdHJlZV9tZW1fZHFpbmZvICppbmZvID0KKwkJCXNiX2RxaW5mbyhkcXVvdC0+ZHFfc2IsIGRxdW90LT5kcV90eXBlKS0+ZHFpX3ByaXY7CisKIAlkLT5kcWJfaWhhcmRsaW1pdCA9IGNwdV90b19sZTMyKG0tPmRxYl9paGFyZGxpbWl0KTsKIAlkLT5kcWJfaXNvZnRsaW1pdCA9IGNwdV90b19sZTMyKG0tPmRxYl9pc29mdGxpbWl0KTsKIAlkLT5kcWJfY3VyaW5vZGVzID0gY3B1X3RvX2xlMzIobS0+ZHFiX2N1cmlub2Rlcyk7CiAJZC0+ZHFiX2l0aW1lID0gY3B1X3RvX2xlNjQobS0+ZHFiX2l0aW1lKTsKLQlkLT5kcWJfYmhhcmRsaW1pdCA9IGNwdV90b19sZTMyKG0tPmRxYl9iaGFyZGxpbWl0KTsKLQlkLT5kcWJfYnNvZnRsaW1pdCA9IGNwdV90b19sZTMyKG0tPmRxYl9ic29mdGxpbWl0KTsKKwlkLT5kcWJfYmhhcmRsaW1pdCA9IGNwdV90b19sZTMyKHYyX3N0b3FiKG0tPmRxYl9iaGFyZGxpbWl0KSk7CisJZC0+ZHFiX2Jzb2Z0bGltaXQgPSBjcHVfdG9fbGUzMih2Ml9zdG9xYihtLT5kcWJfYnNvZnRsaW1pdCkpOwogCWQtPmRxYl9jdXJzcGFjZSA9IGNwdV90b19sZTY0KG0tPmRxYl9jdXJzcGFjZSk7CiAJZC0+ZHFiX2J0aW1lID0gY3B1X3RvX2xlNjQobS0+ZHFiX2J0aW1lKTsKLQlkLT5kcWJfaWQgPSBjcHVfdG9fbGUzMihpZCk7CisJZC0+ZHFiX2lkID0gY3B1X3RvX2xlMzIoZHF1b3QtPmRxX2lkKTsKKwlpZiAocXRyZWVfZW50cnlfdW51c2VkKGluZm8sIGRwKSkKKwkJZC0+ZHFiX2l0aW1lID0gY3B1X3RvX2xlNjQoMSk7CiB9CiAKLXN0YXRpYyBkcWJ1Zl90IGdldGRxYnVmKHZvaWQpCitzdGF0aWMgaW50IHYyX2lzX2lkKHZvaWQgKmRwLCBzdHJ1Y3QgZHF1b3QgKmRxdW90KQogewotCWRxYnVmX3QgYnVmID0ga21hbGxvYyhWMl9EUUJMS1NJWkUsIEdGUF9OT0ZTKTsKLQlpZiAoIWJ1ZikKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiVkZTOiBOb3QgZW5vdWdoIG1lbW9yeSBmb3IgcXVvdGEgYnVmZmVycy5cbiIpOwotCXJldHVybiBidWY7Ci19CisJc3RydWN0IHYyX2Rpc2tfZHFibGsgKmQgPSBkcDsKKwlzdHJ1Y3QgcXRyZWVfbWVtX2RxaW5mbyAqaW5mbyA9CisJCQlzYl9kcWluZm8oZHF1b3QtPmRxX3NiLCBkcXVvdC0+ZHFfdHlwZSktPmRxaV9wcml2OwogCi1zdGF0aWMgaW5saW5lIHZvaWQgZnJlZWRxYnVmKGRxYnVmX3QgYnVmKQotewotCWtmcmVlKGJ1Zik7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgc3NpemVfdCByZWFkX2JsayhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgdHlwZSwgdWludCBibGssIGRxYnVmX3QgYnVmKQotewotCW1lbXNldChidWYsIDAsIFYyX0RRQkxLU0laRSk7Ci0JcmV0dXJuIHNiLT5zX29wLT5xdW90YV9yZWFkKHNiLCB0eXBlLCAoY2hhciAqKWJ1ZiwKLQkgICAgICAgVjJfRFFCTEtTSVpFLCBibGsgPDwgVjJfRFFCTEtTSVpFX0JJVFMpOwotfQotCi1zdGF0aWMgaW5saW5lIHNzaXplX3Qgd3JpdGVfYmxrKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCB0eXBlLCB1aW50IGJsaywgZHFidWZfdCBidWYpCi17Ci0JcmV0dXJuIHNiLT5zX29wLT5xdW90YV93cml0ZShzYiwgdHlwZSwgKGNoYXIgKilidWYsCi0JICAgICAgIFYyX0RRQkxLU0laRSwgYmxrIDw8IFYyX0RRQkxLU0laRV9CSVRTKTsKLX0KLQotLyogUmVtb3ZlIGVtcHR5IGJsb2NrIGZyb20gbGlzdCBhbmQgcmV0dXJuIGl0ICovCi1zdGF0aWMgaW50IGdldF9mcmVlX2RxYmxrKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCB0eXBlKQotewotCWRxYnVmX3QgYnVmID0gZ2V0ZHFidWYoKTsKLQlzdHJ1Y3QgbWVtX2RxaW5mbyAqaW5mbyA9IHNiX2RxaW5mbyhzYiwgdHlwZSk7Ci0Jc3RydWN0IHYyX2Rpc2tfZHFkYmhlYWRlciAqZGggPSAoc3RydWN0IHYyX2Rpc2tfZHFkYmhlYWRlciAqKWJ1ZjsKLQlpbnQgcmV0LCBibGs7Ci0KLQlpZiAoIWJ1ZikKLQkJcmV0dXJuIC1FTk9NRU07Ci0JaWYgKGluZm8tPnUudjJfaS5kcWlfZnJlZV9ibGspIHsKLQkJYmxrID0gaW5mby0+dS52Ml9pLmRxaV9mcmVlX2JsazsKLQkJaWYgKChyZXQgPSByZWFkX2JsayhzYiwgdHlwZSwgYmxrLCBidWYpKSA8IDApCi0JCQlnb3RvIG91dF9idWY7Ci0JCWluZm8tPnUudjJfaS5kcWlfZnJlZV9ibGsgPSBsZTMyX3RvX2NwdShkaC0+ZHFkaF9uZXh0X2ZyZWUpOwotCX0KLQllbHNlIHsKLQkJbWVtc2V0KGJ1ZiwgMCwgVjJfRFFCTEtTSVpFKTsKLQkJLyogQXNzdXJlIGJsb2NrIGFsbG9jYXRpb24uLi4gKi8KLQkJaWYgKChyZXQgPSB3cml0ZV9ibGsoc2IsIHR5cGUsIGluZm8tPnUudjJfaS5kcWlfYmxvY2tzLCBidWYpKSA8IDApCi0JCQlnb3RvIG91dF9idWY7Ci0JCWJsayA9IGluZm8tPnUudjJfaS5kcWlfYmxvY2tzKys7Ci0JfQotCW1hcmtfaW5mb19kaXJ0eShzYiwgdHlwZSk7Ci0JcmV0ID0gYmxrOwotb3V0X2J1ZjoKLQlmcmVlZHFidWYoYnVmKTsKLQlyZXR1cm4gcmV0OwotfQotCi0vKiBJbnNlcnQgZW1wdHkgYmxvY2sgdG8gdGhlIGxpc3QgKi8KLXN0YXRpYyBpbnQgcHV0X2ZyZWVfZHFibGsoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHR5cGUsIGRxYnVmX3QgYnVmLCB1aW50IGJsaykKLXsKLQlzdHJ1Y3QgbWVtX2RxaW5mbyAqaW5mbyA9IHNiX2RxaW5mbyhzYiwgdHlwZSk7Ci0Jc3RydWN0IHYyX2Rpc2tfZHFkYmhlYWRlciAqZGggPSAoc3RydWN0IHYyX2Rpc2tfZHFkYmhlYWRlciAqKWJ1ZjsKLQlpbnQgZXJyOwotCi0JZGgtPmRxZGhfbmV4dF9mcmVlID0gY3B1X3RvX2xlMzIoaW5mby0+dS52Ml9pLmRxaV9mcmVlX2Jsayk7Ci0JZGgtPmRxZGhfcHJldl9mcmVlID0gY3B1X3RvX2xlMzIoMCk7Ci0JZGgtPmRxZGhfZW50cmllcyA9IGNwdV90b19sZTE2KDApOwotCWluZm8tPnUudjJfaS5kcWlfZnJlZV9ibGsgPSBibGs7Ci0JbWFya19pbmZvX2RpcnR5KHNiLCB0eXBlKTsKLQkvKiBTb21lIHN0cmFuZ2UgYmxvY2suIFdlIGhhZCBiZXR0ZXIgbGVhdmUgaXQuLi4gKi8KLQlpZiAoKGVyciA9IHdyaXRlX2JsayhzYiwgdHlwZSwgYmxrLCBidWYpKSA8IDApCi0JCXJldHVybiBlcnI7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qIFJlbW92ZSBnaXZlbiBibG9jayBmcm9tIHRoZSBsaXN0IG9mIGJsb2NrcyB3aXRoIGZyZWUgZW50cmllcyAqLwotc3RhdGljIGludCByZW1vdmVfZnJlZV9kcWVudHJ5KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCB0eXBlLCBkcWJ1Zl90IGJ1ZiwgdWludCBibGspCi17Ci0JZHFidWZfdCB0bXBidWYgPSBnZXRkcWJ1ZigpOwotCXN0cnVjdCBtZW1fZHFpbmZvICppbmZvID0gc2JfZHFpbmZvKHNiLCB0eXBlKTsKLQlzdHJ1Y3QgdjJfZGlza19kcWRiaGVhZGVyICpkaCA9IChzdHJ1Y3QgdjJfZGlza19kcWRiaGVhZGVyICopYnVmOwotCXVpbnQgbmV4dGJsayA9IGxlMzJfdG9fY3B1KGRoLT5kcWRoX25leHRfZnJlZSksIHByZXZibGsgPSBsZTMyX3RvX2NwdShkaC0+ZHFkaF9wcmV2X2ZyZWUpOwotCWludCBlcnI7Ci0KLQlpZiAoIXRtcGJ1ZikKLQkJcmV0dXJuIC1FTk9NRU07Ci0JaWYgKG5leHRibGspIHsKLQkJaWYgKChlcnIgPSByZWFkX2JsayhzYiwgdHlwZSwgbmV4dGJsaywgdG1wYnVmKSkgPCAwKQotCQkJZ290byBvdXRfYnVmOwotCQkoKHN0cnVjdCB2Ml9kaXNrX2RxZGJoZWFkZXIgKil0bXBidWYpLT5kcWRoX3ByZXZfZnJlZSA9IGRoLT5kcWRoX3ByZXZfZnJlZTsKLQkJaWYgKChlcnIgPSB3cml0ZV9ibGsoc2IsIHR5cGUsIG5leHRibGssIHRtcGJ1ZikpIDwgMCkKLQkJCWdvdG8gb3V0X2J1ZjsKLQl9Ci0JaWYgKHByZXZibGspIHsKLQkJaWYgKChlcnIgPSByZWFkX2JsayhzYiwgdHlwZSwgcHJldmJsaywgdG1wYnVmKSkgPCAwKQotCQkJZ290byBvdXRfYnVmOwotCQkoKHN0cnVjdCB2Ml9kaXNrX2RxZGJoZWFkZXIgKil0bXBidWYpLT5kcWRoX25leHRfZnJlZSA9IGRoLT5kcWRoX25leHRfZnJlZTsKLQkJaWYgKChlcnIgPSB3cml0ZV9ibGsoc2IsIHR5cGUsIHByZXZibGssIHRtcGJ1ZikpIDwgMCkKLQkJCWdvdG8gb3V0X2J1ZjsKLQl9Ci0JZWxzZSB7Ci0JCWluZm8tPnUudjJfaS5kcWlfZnJlZV9lbnRyeSA9IG5leHRibGs7Ci0JCW1hcmtfaW5mb19kaXJ0eShzYiwgdHlwZSk7Ci0JfQotCWZyZWVkcWJ1Zih0bXBidWYpOwotCWRoLT5kcWRoX25leHRfZnJlZSA9IGRoLT5kcWRoX3ByZXZfZnJlZSA9IGNwdV90b19sZTMyKDApOwotCS8qIE5vIG1hdHRlciB3aGV0aGVyIHdyaXRlIHN1Y2NlZWRzIGJsb2NrIGlzIG91dCBvZiBsaXN0ICovCi0JaWYgKHdyaXRlX2JsayhzYiwgdHlwZSwgYmxrLCBidWYpIDwgMCkKLQkJcHJpbnRrKEtFUk5fRVJSICJWRlM6IENhbid0IHdyaXRlIGJsb2NrICgldSkgd2l0aCBmcmVlIGVudHJpZXMuXG4iLCBibGspOwotCXJldHVybiAwOwotb3V0X2J1ZjoKLQlmcmVlZHFidWYodG1wYnVmKTsKLQlyZXR1cm4gZXJyOwotfQotCi0vKiBJbnNlcnQgZ2l2ZW4gYmxvY2sgdG8gdGhlIGJlZ2lubmluZyBvZiBsaXN0IHdpdGggZnJlZSBlbnRyaWVzICovCi1zdGF0aWMgaW50IGluc2VydF9mcmVlX2RxZW50cnkoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHR5cGUsIGRxYnVmX3QgYnVmLCB1aW50IGJsaykKLXsKLQlkcWJ1Zl90IHRtcGJ1ZiA9IGdldGRxYnVmKCk7Ci0Jc3RydWN0IG1lbV9kcWluZm8gKmluZm8gPSBzYl9kcWluZm8oc2IsIHR5cGUpOwotCXN0cnVjdCB2Ml9kaXNrX2RxZGJoZWFkZXIgKmRoID0gKHN0cnVjdCB2Ml9kaXNrX2RxZGJoZWFkZXIgKilidWY7Ci0JaW50IGVycjsKLQotCWlmICghdG1wYnVmKQotCQlyZXR1cm4gLUVOT01FTTsKLQlkaC0+ZHFkaF9uZXh0X2ZyZWUgPSBjcHVfdG9fbGUzMihpbmZvLT51LnYyX2kuZHFpX2ZyZWVfZW50cnkpOwotCWRoLT5kcWRoX3ByZXZfZnJlZSA9IGNwdV90b19sZTMyKDApOwotCWlmICgoZXJyID0gd3JpdGVfYmxrKHNiLCB0eXBlLCBibGssIGJ1ZikpIDwgMCkKLQkJZ290byBvdXRfYnVmOwotCWlmIChpbmZvLT51LnYyX2kuZHFpX2ZyZWVfZW50cnkpIHsKLQkJaWYgKChlcnIgPSByZWFkX2JsayhzYiwgdHlwZSwgaW5mby0+dS52Ml9pLmRxaV9mcmVlX2VudHJ5LCB0bXBidWYpKSA8IDApCi0JCQlnb3RvIG91dF9idWY7Ci0JCSgoc3RydWN0IHYyX2Rpc2tfZHFkYmhlYWRlciAqKXRtcGJ1ZiktPmRxZGhfcHJldl9mcmVlID0gY3B1X3RvX2xlMzIoYmxrKTsKLQkJaWYgKChlcnIgPSB3cml0ZV9ibGsoc2IsIHR5cGUsIGluZm8tPnUudjJfaS5kcWlfZnJlZV9lbnRyeSwgdG1wYnVmKSkgPCAwKQotCQkJZ290byBvdXRfYnVmOwotCX0KLQlmcmVlZHFidWYodG1wYnVmKTsKLQlpbmZvLT51LnYyX2kuZHFpX2ZyZWVfZW50cnkgPSBibGs7Ci0JbWFya19pbmZvX2RpcnR5KHNiLCB0eXBlKTsKLQlyZXR1cm4gMDsKLW91dF9idWY6Ci0JZnJlZWRxYnVmKHRtcGJ1Zik7Ci0JcmV0dXJuIGVycjsKLX0KLQotLyogRmluZCBzcGFjZSBmb3IgZHF1b3QgKi8KLXN0YXRpYyB1aW50IGZpbmRfZnJlZV9kcWVudHJ5KHN0cnVjdCBkcXVvdCAqZHF1b3QsIGludCAqZXJyKQotewotCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBkcXVvdC0+ZHFfc2I7Ci0Jc3RydWN0IG1lbV9kcWluZm8gKmluZm8gPSBzYl9kcW9wdChzYiktPmluZm8rZHF1b3QtPmRxX3R5cGU7Ci0JdWludCBibGssIGk7Ci0Jc3RydWN0IHYyX2Rpc2tfZHFkYmhlYWRlciAqZGg7Ci0Jc3RydWN0IHYyX2Rpc2tfZHFibGsgKmRkcXVvdDsKLQlzdHJ1Y3QgdjJfZGlza19kcWJsayBmYWtlZHF1b3Q7Ci0JZHFidWZfdCBidWY7Ci0KLQkqZXJyID0gMDsKLQlpZiAoIShidWYgPSBnZXRkcWJ1ZigpKSkgewotCQkqZXJyID0gLUVOT01FTTsKKwlpZiAocXRyZWVfZW50cnlfdW51c2VkKGluZm8sIGRwKSkKIAkJcmV0dXJuIDA7Ci0JfQotCWRoID0gKHN0cnVjdCB2Ml9kaXNrX2RxZGJoZWFkZXIgKilidWY7Ci0JZGRxdW90ID0gR0VURU5UUklFUyhidWYpOwotCWlmIChpbmZvLT51LnYyX2kuZHFpX2ZyZWVfZW50cnkpIHsKLQkJYmxrID0gaW5mby0+dS52Ml9pLmRxaV9mcmVlX2VudHJ5OwotCQlpZiAoKCplcnIgPSByZWFkX2JsayhzYiwgZHF1b3QtPmRxX3R5cGUsIGJsaywgYnVmKSkgPCAwKQotCQkJZ290byBvdXRfYnVmOwotCX0KLQllbHNlIHsKLQkJYmxrID0gZ2V0X2ZyZWVfZHFibGsoc2IsIGRxdW90LT5kcV90eXBlKTsKLQkJaWYgKChpbnQpYmxrIDwgMCkgewotCQkJKmVyciA9IGJsazsKLQkJCWZyZWVkcWJ1ZihidWYpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJbWVtc2V0KGJ1ZiwgMCwgVjJfRFFCTEtTSVpFKTsKLQkJLyogVGhpcyBpcyBlbm91Z2ggYXMgYmxvY2sgaXMgYWxyZWFkeSB6ZXJvZWQgYW5kIGVudHJ5IGxpc3QgaXMgZW1wdHkuLi4gKi8KLQkJaW5mby0+dS52Ml9pLmRxaV9mcmVlX2VudHJ5ID0gYmxrOwotCQltYXJrX2luZm9fZGlydHkoc2IsIGRxdW90LT5kcV90eXBlKTsKLQl9Ci0JaWYgKGxlMTZfdG9fY3B1KGRoLT5kcWRoX2VudHJpZXMpKzEgPj0gVjJfRFFTVFJJTkJMSykJLyogQmxvY2sgd2lsbCBiZSBmdWxsPyAqLwotCQlpZiAoKCplcnIgPSByZW1vdmVfZnJlZV9kcWVudHJ5KHNiLCBkcXVvdC0+ZHFfdHlwZSwgYnVmLCBibGspKSA8IDApIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiVkZTOiBmaW5kX2ZyZWVfZHFlbnRyeSgpOiBDYW4ndCByZW1vdmUgYmxvY2sgKCV1KSBmcm9tIGVudHJ5IGZyZWUgbGlzdC5cbiIsIGJsayk7Ci0JCQlnb3RvIG91dF9idWY7Ci0JCX0KLQlsZTE2X2FkZF9jcHUoJmRoLT5kcWRoX2VudHJpZXMsIDEpOwotCW1lbXNldCgmZmFrZWRxdW90LCAwLCBzaXplb2Yoc3RydWN0IHYyX2Rpc2tfZHFibGspKTsKLQkvKiBGaW5kIGZyZWUgc3RydWN0dXJlIGluIGJsb2NrICovCi0JZm9yIChpID0gMDsgaSA8IFYyX0RRU1RSSU5CTEsgJiYgbWVtY21wKCZmYWtlZHF1b3QsIGRkcXVvdCtpLCBzaXplb2Yoc3RydWN0IHYyX2Rpc2tfZHFibGspKTsgaSsrKTsKLSNpZmRlZiBfX1FVT1RBX1YyX1BBUkFOT0lBCi0JaWYgKGkgPT0gVjJfRFFTVFJJTkJMSykgewotCQlwcmludGsoS0VSTl9FUlIgIlZGUzogZmluZF9mcmVlX2RxZW50cnkoKTogRGF0YSBibG9jayBmdWxsIGJ1dCBpdCBzaG91bGRuJ3QuXG4iKTsKLQkJKmVyciA9IC1FSU87Ci0JCWdvdG8gb3V0X2J1ZjsKLQl9Ci0jZW5kaWYKLQlpZiAoKCplcnIgPSB3cml0ZV9ibGsoc2IsIGRxdW90LT5kcV90eXBlLCBibGssIGJ1ZikpIDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgIlZGUzogZmluZF9mcmVlX2RxZW50cnkoKTogQ2FuJ3Qgd3JpdGUgcXVvdGEgZGF0YSBibG9jayAldS5cbiIsIGJsayk7Ci0JCWdvdG8gb3V0X2J1ZjsKLQl9Ci0JZHF1b3QtPmRxX29mZiA9IChibGs8PFYyX0RRQkxLU0laRV9CSVRTKStzaXplb2Yoc3RydWN0IHYyX2Rpc2tfZHFkYmhlYWRlcikraSpzaXplb2Yoc3RydWN0IHYyX2Rpc2tfZHFibGspOwotCWZyZWVkcWJ1ZihidWYpOwotCXJldHVybiBibGs7Ci1vdXRfYnVmOgotCWZyZWVkcWJ1ZihidWYpOwotCXJldHVybiAwOwotfQotCi0vKiBJbnNlcnQgcmVmZXJlbmNlIHRvIHN0cnVjdHVyZSBpbnRvIHRoZSB0cmllICovCi1zdGF0aWMgaW50IGRvX2luc2VydF90cmVlKHN0cnVjdCBkcXVvdCAqZHF1b3QsIHVpbnQgKnRyZWVibGssIGludCBkZXB0aCkKLXsKLQlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gZHF1b3QtPmRxX3NiOwotCWRxYnVmX3QgYnVmOwotCWludCByZXQgPSAwLCBuZXdzb24gPSAwLCBuZXdhY3QgPSAwOwotCV9fbGUzMiAqcmVmOwotCXVpbnQgbmV3YmxrOwotCi0JaWYgKCEoYnVmID0gZ2V0ZHFidWYoKSkpCi0JCXJldHVybiAtRU5PTUVNOwotCWlmICghKnRyZWVibGspIHsKLQkJcmV0ID0gZ2V0X2ZyZWVfZHFibGsoc2IsIGRxdW90LT5kcV90eXBlKTsKLQkJaWYgKHJldCA8IDApCi0JCQlnb3RvIG91dF9idWY7Ci0JCSp0cmVlYmxrID0gcmV0OwotCQltZW1zZXQoYnVmLCAwLCBWMl9EUUJMS1NJWkUpOwotCQluZXdhY3QgPSAxOwotCX0KLQllbHNlIHsKLQkJaWYgKChyZXQgPSByZWFkX2JsayhzYiwgZHF1b3QtPmRxX3R5cGUsICp0cmVlYmxrLCBidWYpKSA8IDApIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiVkZTOiBDYW4ndCByZWFkIHRyZWUgcXVvdGEgYmxvY2sgJXUuXG4iLCAqdHJlZWJsayk7Ci0JCQlnb3RvIG91dF9idWY7Ci0JCX0KLQl9Ci0JcmVmID0gKF9fbGUzMiAqKWJ1ZjsKLQluZXdibGsgPSBsZTMyX3RvX2NwdShyZWZbR0VUSURJTkRFWChkcXVvdC0+ZHFfaWQsIGRlcHRoKV0pOwotCWlmICghbmV3YmxrKQotCQluZXdzb24gPSAxOwotCWlmIChkZXB0aCA9PSBWMl9EUVRSRUVERVBUSC0xKSB7Ci0jaWZkZWYgX19RVU9UQV9WMl9QQVJBTk9JQQotCQlpZiAobmV3YmxrKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgIlZGUzogSW5zZXJ0aW5nIGFscmVhZHkgcHJlc2VudCBxdW90YSBlbnRyeSAoYmxvY2sgJXUpLlxuIiwgbGUzMl90b19jcHUocmVmW0dFVElESU5ERVgoZHF1b3QtPmRxX2lkLCBkZXB0aCldKSk7Ci0JCQlyZXQgPSAtRUlPOwotCQkJZ290byBvdXRfYnVmOwotCQl9Ci0jZW5kaWYKLQkJbmV3YmxrID0gZmluZF9mcmVlX2RxZW50cnkoZHF1b3QsICZyZXQpOwotCX0KLQllbHNlCi0JCXJldCA9IGRvX2luc2VydF90cmVlKGRxdW90LCAmbmV3YmxrLCBkZXB0aCsxKTsKLQlpZiAobmV3c29uICYmIHJldCA+PSAwKSB7Ci0JCXJlZltHRVRJRElOREVYKGRxdW90LT5kcV9pZCwgZGVwdGgpXSA9IGNwdV90b19sZTMyKG5ld2Jsayk7Ci0JCXJldCA9IHdyaXRlX2JsayhzYiwgZHF1b3QtPmRxX3R5cGUsICp0cmVlYmxrLCBidWYpOwotCX0KLQllbHNlIGlmIChuZXdhY3QgJiYgcmV0IDwgMCkKLQkJcHV0X2ZyZWVfZHFibGsoc2IsIGRxdW90LT5kcV90eXBlLCBidWYsICp0cmVlYmxrKTsKLW91dF9idWY6Ci0JZnJlZWRxYnVmKGJ1Zik7Ci0JcmV0dXJuIHJldDsKLX0KLQotLyogV3JhcHBlciBmb3IgaW5zZXJ0aW5nIHF1b3RhIHN0cnVjdHVyZSBpbnRvIHRyZWUgKi8KLXN0YXRpYyBpbmxpbmUgaW50IGRxX2luc2VydF90cmVlKHN0cnVjdCBkcXVvdCAqZHF1b3QpCi17Ci0JaW50IHRtcCA9IFYyX0RRVFJFRU9GRjsKLQlyZXR1cm4gZG9faW5zZXJ0X3RyZWUoZHF1b3QsICZ0bXAsIDApOwotfQotCi0vKgotICoJV2UgZG9uJ3QgaGF2ZSB0byBiZSBhZnJhaWQgb2YgZGVhZGxvY2tzIGFzIHdlIG5ldmVyIGhhdmUgcXVvdGFzIG9uIHF1b3RhIGZpbGVzLi4uCi0gKi8KLXN0YXRpYyBpbnQgdjJfd3JpdGVfZHF1b3Qoc3RydWN0IGRxdW90ICpkcXVvdCkKLXsKLQlpbnQgdHlwZSA9IGRxdW90LT5kcV90eXBlOwotCXNzaXplX3QgcmV0OwotCXN0cnVjdCB2Ml9kaXNrX2RxYmxrIGRkcXVvdCwgZW1wdHk7Ci0KLQkvKiBkcV9vZmYgaXMgZ3VhcmRlZCBieSBkcWlvX211dGV4ICovCi0JaWYgKCFkcXVvdC0+ZHFfb2ZmKQotCQlpZiAoKHJldCA9IGRxX2luc2VydF90cmVlKGRxdW90KSkgPCAwKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgIlZGUzogRXJyb3IgJXpkIG9jY3VycmVkIHdoaWxlIGNyZWF0aW5nIHF1b3RhLlxuIiwgcmV0KTsKLQkJCXJldHVybiByZXQ7Ci0JCX0KLQlzcGluX2xvY2soJmRxX2RhdGFfbG9jayk7Ci0JbWVtMmRpc2tkcWIoJmRkcXVvdCwgJmRxdW90LT5kcV9kcWIsIGRxdW90LT5kcV9pZCk7Ci0JLyogQXJnaC4uLiBXZSBtYXkgbmVlZCB0byB3cml0ZSBzdHJ1Y3R1cmUgZnVsbCBvZiB6ZXJvZXMgYnV0IHRoYXQgd291bGQgYmUKLQkgKiB0cmVhdGVkIGFzIGFuIGVtcHR5IHBsYWNlIGJ5IHRoZSByZXN0IG9mIHRoZSBjb2RlLiBGb3JtYXQgY2hhbmdlIHdvdWxkCi0JICogYmUgZGVmaW5pdGVseSBjbGVhbmVyIGJ1dCB0aGUgcHJvYmxlbXMgcHJvYmFibHkgYXJlIG5vdCB3b3J0aCBpdCAqLwotCW1lbXNldCgmZW1wdHksIDAsIHNpemVvZihzdHJ1Y3QgdjJfZGlza19kcWJsaykpOwotCWlmICghbWVtY21wKCZlbXB0eSwgJmRkcXVvdCwgc2l6ZW9mKHN0cnVjdCB2Ml9kaXNrX2RxYmxrKSkpCi0JCWRkcXVvdC5kcWJfaXRpbWUgPSBjcHVfdG9fbGU2NCgxKTsKLQlzcGluX3VubG9jaygmZHFfZGF0YV9sb2NrKTsKLQlyZXQgPSBkcXVvdC0+ZHFfc2ItPnNfb3AtPnF1b3RhX3dyaXRlKGRxdW90LT5kcV9zYiwgdHlwZSwKLQkgICAgICAoY2hhciAqKSZkZHF1b3QsIHNpemVvZihzdHJ1Y3QgdjJfZGlza19kcWJsayksIGRxdW90LT5kcV9vZmYpOwotCWlmIChyZXQgIT0gc2l6ZW9mKHN0cnVjdCB2Ml9kaXNrX2RxYmxrKSkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJWRlM6IGRxdW90YSB3cml0ZSBmYWlsZWQgb24gZGV2ICVzXG4iLCBkcXVvdC0+ZHFfc2ItPnNfaWQpOwotCQlpZiAocmV0ID49IDApCi0JCQlyZXQgPSAtRU5PU1BDOwotCX0KLQllbHNlCi0JCXJldCA9IDA7Ci0JZHFzdGF0cy53cml0ZXMrKzsKLQotCXJldHVybiByZXQ7Ci19Ci0KLS8qIEZyZWUgZHF1b3QgZW50cnkgaW4gZGF0YSBibG9jayAqLwotc3RhdGljIGludCBmcmVlX2RxZW50cnkoc3RydWN0IGRxdW90ICpkcXVvdCwgdWludCBibGspCi17Ci0Jc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGRxdW90LT5kcV9zYjsKLQlpbnQgdHlwZSA9IGRxdW90LT5kcV90eXBlOwotCXN0cnVjdCB2Ml9kaXNrX2RxZGJoZWFkZXIgKmRoOwotCWRxYnVmX3QgYnVmID0gZ2V0ZHFidWYoKTsKLQlpbnQgcmV0ID0gMDsKLQotCWlmICghYnVmKQotCQlyZXR1cm4gLUVOT01FTTsKLQlpZiAoZHF1b3QtPmRxX29mZiA+PiBWMl9EUUJMS1NJWkVfQklUUyAhPSBibGspIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJWRlM6IFF1b3RhIHN0cnVjdHVyZSBoYXMgb2Zmc2V0IHRvIG90aGVyICIKLQkJICAiYmxvY2sgKCV1KSB0aGFuIGl0IHNob3VsZCAoJXUpLlxuIiwgYmxrLAotCQkgICh1aW50KShkcXVvdC0+ZHFfb2ZmID4+IFYyX0RRQkxLU0laRV9CSVRTKSk7Ci0JCWdvdG8gb3V0X2J1ZjsKLQl9Ci0JaWYgKChyZXQgPSByZWFkX2JsayhzYiwgdHlwZSwgYmxrLCBidWYpKSA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJWRlM6IENhbid0IHJlYWQgcXVvdGEgZGF0YSBibG9jayAldVxuIiwgYmxrKTsKLQkJZ290byBvdXRfYnVmOwotCX0KLQlkaCA9IChzdHJ1Y3QgdjJfZGlza19kcWRiaGVhZGVyICopYnVmOwotCWxlMTZfYWRkX2NwdSgmZGgtPmRxZGhfZW50cmllcywgLTEpOwotCWlmICghbGUxNl90b19jcHUoZGgtPmRxZGhfZW50cmllcykpIHsJLyogQmxvY2sgZ290IGZyZWU/ICovCi0JCWlmICgocmV0ID0gcmVtb3ZlX2ZyZWVfZHFlbnRyeShzYiwgdHlwZSwgYnVmLCBibGspKSA8IDAgfHwKLQkJICAgIChyZXQgPSBwdXRfZnJlZV9kcWJsayhzYiwgdHlwZSwgYnVmLCBibGspKSA8IDApIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiVkZTOiBDYW4ndCBtb3ZlIHF1b3RhIGRhdGEgYmxvY2sgKCV1KSAiCi0JCQkgICJ0byBmcmVlIGxpc3QuXG4iLCBibGspOwotCQkJZ290byBvdXRfYnVmOwotCQl9Ci0JfQotCWVsc2UgewotCQltZW1zZXQoYnVmKyhkcXVvdC0+ZHFfb2ZmICYgKCgxIDw8IFYyX0RRQkxLU0laRV9CSVRTKS0xKSksIDAsCi0JCSAgc2l6ZW9mKHN0cnVjdCB2Ml9kaXNrX2RxYmxrKSk7Ci0JCWlmIChsZTE2X3RvX2NwdShkaC0+ZHFkaF9lbnRyaWVzKSA9PSBWMl9EUVNUUklOQkxLLTEpIHsKLQkJCS8qIEluc2VydCB3aWxsIHdyaXRlIGJsb2NrIGl0c2VsZiAqLwotCQkJaWYgKChyZXQgPSBpbnNlcnRfZnJlZV9kcWVudHJ5KHNiLCB0eXBlLCBidWYsIGJsaykpIDwgMCkgewotCQkJCXByaW50ayhLRVJOX0VSUiAiVkZTOiBDYW4ndCBpbnNlcnQgcXVvdGEgZGF0YSBibG9jayAoJXUpIHRvIGZyZWUgZW50cnkgbGlzdC5cbiIsIGJsayk7Ci0JCQkJZ290byBvdXRfYnVmOwotCQkJfQotCQl9Ci0JCWVsc2UKLQkJCWlmICgocmV0ID0gd3JpdGVfYmxrKHNiLCB0eXBlLCBibGssIGJ1ZikpIDwgMCkgewotCQkJCXByaW50ayhLRVJOX0VSUiAiVkZTOiBDYW4ndCB3cml0ZSBxdW90YSBkYXRhICIKLQkJCQkgICJibG9jayAldVxuIiwgYmxrKTsKLQkJCQlnb3RvIG91dF9idWY7Ci0JCQl9Ci0JfQotCWRxdW90LT5kcV9vZmYgPSAwOwkvKiBRdW90YSBpcyBub3cgdW5hdHRhY2hlZCAqLwotb3V0X2J1ZjoKLQlmcmVlZHFidWYoYnVmKTsKLQlyZXR1cm4gcmV0OwotfQotCi0vKiBSZW1vdmUgcmVmZXJlbmNlIHRvIGRxdW90IGZyb20gdHJlZSAqLwotc3RhdGljIGludCByZW1vdmVfdHJlZShzdHJ1Y3QgZHF1b3QgKmRxdW90LCB1aW50ICpibGssIGludCBkZXB0aCkKLXsKLQlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gZHF1b3QtPmRxX3NiOwotCWludCB0eXBlID0gZHF1b3QtPmRxX3R5cGU7Ci0JZHFidWZfdCBidWYgPSBnZXRkcWJ1ZigpOwotCWludCByZXQgPSAwOwotCXVpbnQgbmV3YmxrOwotCV9fbGUzMiAqcmVmID0gKF9fbGUzMiAqKWJ1ZjsKLQkKLQlpZiAoIWJ1ZikKLQkJcmV0dXJuIC1FTk9NRU07Ci0JaWYgKChyZXQgPSByZWFkX2JsayhzYiwgdHlwZSwgKmJsaywgYnVmKSkgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiVkZTOiBDYW4ndCByZWFkIHF1b3RhIGRhdGEgYmxvY2sgJXVcbiIsICpibGspOwotCQlnb3RvIG91dF9idWY7Ci0JfQotCW5ld2JsayA9IGxlMzJfdG9fY3B1KHJlZltHRVRJRElOREVYKGRxdW90LT5kcV9pZCwgZGVwdGgpXSk7Ci0JaWYgKGRlcHRoID09IFYyX0RRVFJFRURFUFRILTEpIHsKLQkJcmV0ID0gZnJlZV9kcWVudHJ5KGRxdW90LCBuZXdibGspOwotCQluZXdibGsgPSAwOwotCX0KLQllbHNlCi0JCXJldCA9IHJlbW92ZV90cmVlKGRxdW90LCAmbmV3YmxrLCBkZXB0aCsxKTsKLQlpZiAocmV0ID49IDAgJiYgIW5ld2JsaykgewotCQlpbnQgaTsKLQkJcmVmW0dFVElESU5ERVgoZHF1b3QtPmRxX2lkLCBkZXB0aCldID0gY3B1X3RvX2xlMzIoMCk7Ci0JCWZvciAoaSA9IDA7IGkgPCBWMl9EUUJMS1NJWkUgJiYgIWJ1ZltpXTsgaSsrKTsJLyogQmxvY2sgZ290IGVtcHR5PyAqLwotCQkvKiBEb24ndCBwdXQgdGhlIHJvb3QgYmxvY2sgaW50byB0aGUgZnJlZSBibG9jayBsaXN0ICovCi0JCWlmIChpID09IFYyX0RRQkxLU0laRSAmJiAqYmxrICE9IFYyX0RRVFJFRU9GRikgewotCQkJcHV0X2ZyZWVfZHFibGsoc2IsIHR5cGUsIGJ1ZiwgKmJsayk7Ci0JCQkqYmxrID0gMDsKLQkJfQotCQllbHNlCi0JCQlpZiAoKHJldCA9IHdyaXRlX2JsayhzYiwgdHlwZSwgKmJsaywgYnVmKSkgPCAwKQotCQkJCXByaW50ayhLRVJOX0VSUiAiVkZTOiBDYW4ndCB3cml0ZSBxdW90YSB0cmVlICIKLQkJCQkgICJibG9jayAldS5cbiIsICpibGspOwotCX0KLW91dF9idWY6Ci0JZnJlZWRxYnVmKGJ1Zik7Ci0JcmV0dXJuIHJldDsJCi19Ci0KLS8qIERlbGV0ZSBkcXVvdCBmcm9tIHRyZWUgKi8KLXN0YXRpYyBpbnQgdjJfZGVsZXRlX2RxdW90KHN0cnVjdCBkcXVvdCAqZHF1b3QpCi17Ci0JdWludCB0bXAgPSBWMl9EUVRSRUVPRkY7Ci0KLQlpZiAoIWRxdW90LT5kcV9vZmYpCS8qIEV2ZW4gbm90IGFsbG9jYXRlZD8gKi8KLQkJcmV0dXJuIDA7Ci0JcmV0dXJuIHJlbW92ZV90cmVlKGRxdW90LCAmdG1wLCAwKTsKLX0KLQotLyogRmluZCBlbnRyeSBpbiBibG9jayAqLwotc3RhdGljIGxvZmZfdCBmaW5kX2Jsb2NrX2RxZW50cnkoc3RydWN0IGRxdW90ICpkcXVvdCwgdWludCBibGspCi17Ci0JZHFidWZfdCBidWYgPSBnZXRkcWJ1ZigpOwotCWxvZmZfdCByZXQgPSAwOwotCWludCBpOwotCXN0cnVjdCB2Ml9kaXNrX2RxYmxrICpkZHF1b3QgPSBHRVRFTlRSSUVTKGJ1Zik7Ci0KLQlpZiAoIWJ1ZikKLQkJcmV0dXJuIC1FTk9NRU07Ci0JaWYgKChyZXQgPSByZWFkX2JsayhkcXVvdC0+ZHFfc2IsIGRxdW90LT5kcV90eXBlLCBibGssIGJ1ZikpIDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgIlZGUzogQ2FuJ3QgcmVhZCBxdW90YSB0cmVlIGJsb2NrICV1LlxuIiwgYmxrKTsKLQkJZ290byBvdXRfYnVmOwotCX0KLQlpZiAoZHF1b3QtPmRxX2lkKQotCQlmb3IgKGkgPSAwOyBpIDwgVjJfRFFTVFJJTkJMSyAmJgotCQkgICAgIGxlMzJfdG9fY3B1KGRkcXVvdFtpXS5kcWJfaWQpICE9IGRxdW90LT5kcV9pZDsgaSsrKTsKLQllbHNlIHsJLyogSUQgMCBhcyBhIGJpdCBtb3JlIGNvbXBsaWNhdGVkIHNlYXJjaGluZy4uLiAqLwotCQlzdHJ1Y3QgdjJfZGlza19kcWJsayBmYWtlZHF1b3Q7Ci0KLQkJbWVtc2V0KCZmYWtlZHF1b3QsIDAsIHNpemVvZihzdHJ1Y3QgdjJfZGlza19kcWJsaykpOwotCQlmb3IgKGkgPSAwOyBpIDwgVjJfRFFTVFJJTkJMSzsgaSsrKQotCQkJaWYgKCFsZTMyX3RvX2NwdShkZHF1b3RbaV0uZHFiX2lkKSAmJgotCQkJICAgIG1lbWNtcCgmZmFrZWRxdW90LCBkZHF1b3QraSwgc2l6ZW9mKHN0cnVjdCB2Ml9kaXNrX2RxYmxrKSkpCi0JCQkJYnJlYWs7Ci0JfQotCWlmIChpID09IFYyX0RRU1RSSU5CTEspIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJWRlM6IFF1b3RhIGZvciBpZCAldSByZWZlcmVuY2VkICIKLQkJICAiYnV0IG5vdCBwcmVzZW50LlxuIiwgZHF1b3QtPmRxX2lkKTsKLQkJcmV0ID0gLUVJTzsKLQkJZ290byBvdXRfYnVmOwotCX0KLQllbHNlCi0JCXJldCA9IChibGsgPDwgVjJfRFFCTEtTSVpFX0JJVFMpICsgc2l6ZW9mKHN0cnVjdAotCQkgIHYyX2Rpc2tfZHFkYmhlYWRlcikgKyBpICogc2l6ZW9mKHN0cnVjdCB2Ml9kaXNrX2RxYmxrKTsKLW91dF9idWY6Ci0JZnJlZWRxYnVmKGJ1Zik7Ci0JcmV0dXJuIHJldDsKLX0KLQotLyogRmluZCBlbnRyeSBmb3IgZ2l2ZW4gaWQgaW4gdGhlIHRyZWUgKi8KLXN0YXRpYyBsb2ZmX3QgZmluZF90cmVlX2RxZW50cnkoc3RydWN0IGRxdW90ICpkcXVvdCwgdWludCBibGssIGludCBkZXB0aCkKLXsKLQlkcWJ1Zl90IGJ1ZiA9IGdldGRxYnVmKCk7Ci0JbG9mZl90IHJldCA9IDA7Ci0JX19sZTMyICpyZWYgPSAoX19sZTMyICopYnVmOwotCi0JaWYgKCFidWYpCi0JCXJldHVybiAtRU5PTUVNOwotCWlmICgocmV0ID0gcmVhZF9ibGsoZHF1b3QtPmRxX3NiLCBkcXVvdC0+ZHFfdHlwZSwgYmxrLCBidWYpKSA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJWRlM6IENhbid0IHJlYWQgcXVvdGEgdHJlZSBibG9jayAldS5cbiIsIGJsayk7Ci0JCWdvdG8gb3V0X2J1ZjsKLQl9Ci0JcmV0ID0gMDsKLQlibGsgPSBsZTMyX3RvX2NwdShyZWZbR0VUSURJTkRFWChkcXVvdC0+ZHFfaWQsIGRlcHRoKV0pOwotCWlmICghYmxrKQkvKiBObyByZWZlcmVuY2U/ICovCi0JCWdvdG8gb3V0X2J1ZjsKLQlpZiAoZGVwdGggPCBWMl9EUVRSRUVERVBUSC0xKQotCQlyZXQgPSBmaW5kX3RyZWVfZHFlbnRyeShkcXVvdCwgYmxrLCBkZXB0aCsxKTsKLQllbHNlCi0JCXJldCA9IGZpbmRfYmxvY2tfZHFlbnRyeShkcXVvdCwgYmxrKTsKLW91dF9idWY6Ci0JZnJlZWRxYnVmKGJ1Zik7Ci0JcmV0dXJuIHJldDsKLX0KLQotLyogRmluZCBlbnRyeSBmb3IgZ2l2ZW4gaWQgaW4gdGhlIHRyZWUgLSB3cmFwcGVyIGZ1bmN0aW9uICovCi1zdGF0aWMgaW5saW5lIGxvZmZfdCBmaW5kX2RxZW50cnkoc3RydWN0IGRxdW90ICpkcXVvdCkKLXsKLQlyZXR1cm4gZmluZF90cmVlX2RxZW50cnkoZHF1b3QsIFYyX0RRVFJFRU9GRiwgMCk7CisJcmV0dXJuIGxlMzJfdG9fY3B1KGQtPmRxYl9pZCkgPT0gZHF1b3QtPmRxX2lkOwogfQogCiBzdGF0aWMgaW50IHYyX3JlYWRfZHF1b3Qoc3RydWN0IGRxdW90ICpkcXVvdCkKIHsKLQlpbnQgdHlwZSA9IGRxdW90LT5kcV90eXBlOwotCWxvZmZfdCBvZmZzZXQ7Ci0Jc3RydWN0IHYyX2Rpc2tfZHFibGsgZGRxdW90LCBlbXB0eTsKLQlpbnQgcmV0ID0gMDsKLQotI2lmZGVmIF9fUVVPVEFfVjJfUEFSQU5PSUEKLQkvKiBJbnZhbGlkYXRlZCBxdW90YT8gKi8KLQlpZiAoIWRxdW90LT5kcV9zYiB8fCAhc2JfZHFvcHQoZHF1b3QtPmRxX3NiKS0+ZmlsZXNbdHlwZV0pIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJWRlM6IFF1b3RhIGludmFsaWRhdGVkIHdoaWxlIHJlYWRpbmchXG4iKTsKLQkJcmV0dXJuIC1FSU87Ci0JfQotI2VuZGlmCi0Jb2Zmc2V0ID0gZmluZF9kcWVudHJ5KGRxdW90KTsKLQlpZiAob2Zmc2V0IDw9IDApIHsJLyogRW50cnkgbm90IHByZXNlbnQ/ICovCi0JCWlmIChvZmZzZXQgPCAwKQotCQkJcHJpbnRrKEtFUk5fRVJSICJWRlM6IENhbid0IHJlYWQgcXVvdGEgIgotCQkJICAic3RydWN0dXJlIGZvciBpZCAldS5cbiIsIGRxdW90LT5kcV9pZCk7Ci0JCWRxdW90LT5kcV9vZmYgPSAwOwotCQlzZXRfYml0KERRX0ZBS0VfQiwgJmRxdW90LT5kcV9mbGFncyk7Ci0JCW1lbXNldCgmZHF1b3QtPmRxX2RxYiwgMCwgc2l6ZW9mKHN0cnVjdCBtZW1fZHFibGspKTsKLQkJcmV0ID0gb2Zmc2V0OwotCX0KLQllbHNlIHsKLQkJZHF1b3QtPmRxX29mZiA9IG9mZnNldDsKLQkJaWYgKChyZXQgPSBkcXVvdC0+ZHFfc2ItPnNfb3AtPnF1b3RhX3JlYWQoZHF1b3QtPmRxX3NiLCB0eXBlLAotCQkgICAgKGNoYXIgKikmZGRxdW90LCBzaXplb2Yoc3RydWN0IHYyX2Rpc2tfZHFibGspLCBvZmZzZXQpKQotCQkgICAgIT0gc2l6ZW9mKHN0cnVjdCB2Ml9kaXNrX2RxYmxrKSkgewotCQkJaWYgKHJldCA+PSAwKQotCQkJCXJldCA9IC1FSU87Ci0JCQlwcmludGsoS0VSTl9FUlIgIlZGUzogRXJyb3Igd2hpbGUgcmVhZGluZyBxdW90YSAiCi0JCQkgICJzdHJ1Y3R1cmUgZm9yIGlkICV1LlxuIiwgZHF1b3QtPmRxX2lkKTsKLQkJCW1lbXNldCgmZGRxdW90LCAwLCBzaXplb2Yoc3RydWN0IHYyX2Rpc2tfZHFibGspKTsKLQkJfQotCQllbHNlIHsKLQkJCXJldCA9IDA7Ci0JCQkvKiBXZSBuZWVkIHRvIGVzY2FwZSBiYWNrIGFsbC16ZXJvIHN0cnVjdHVyZSAqLwotCQkJbWVtc2V0KCZlbXB0eSwgMCwgc2l6ZW9mKHN0cnVjdCB2Ml9kaXNrX2RxYmxrKSk7Ci0JCQllbXB0eS5kcWJfaXRpbWUgPSBjcHVfdG9fbGU2NCgxKTsKLQkJCWlmICghbWVtY21wKCZlbXB0eSwgJmRkcXVvdCwgc2l6ZW9mKHN0cnVjdCB2Ml9kaXNrX2RxYmxrKSkpCi0JCQkJZGRxdW90LmRxYl9pdGltZSA9IDA7Ci0JCX0KLQkJZGlzazJtZW1kcWIoJmRxdW90LT5kcV9kcWIsICZkZHF1b3QpOwotCQlpZiAoIWRxdW90LT5kcV9kcWIuZHFiX2JoYXJkbGltaXQgJiYKLQkJCSFkcXVvdC0+ZHFfZHFiLmRxYl9ic29mdGxpbWl0ICYmCi0JCQkhZHF1b3QtPmRxX2RxYi5kcWJfaWhhcmRsaW1pdCAmJgotCQkJIWRxdW90LT5kcV9kcWIuZHFiX2lzb2Z0bGltaXQpCi0JCQlzZXRfYml0KERRX0ZBS0VfQiwgJmRxdW90LT5kcV9mbGFncyk7Ci0JfQotCWRxc3RhdHMucmVhZHMrKzsKLQotCXJldHVybiByZXQ7CisJcmV0dXJuIHF0cmVlX3JlYWRfZHF1b3Qoc2JfZHFpbmZvKGRxdW90LT5kcV9zYiwgZHF1b3QtPmRxX3R5cGUpLT5kcWlfcHJpdiwgZHF1b3QpOwogfQogCi0vKiBDaGVjayB3aGV0aGVyIGRxdW90IHNob3VsZCBub3QgYmUgZGVsZXRlZC4gV2Uga25vdyB3ZSBhcmUKLSAqIHRoZSBvbmx5IG9uZSBvcGVyYXRpbmcgb24gZHF1b3QgKHRoYW5rcyB0byBkcV9sb2NrKSAqLworc3RhdGljIGludCB2Ml93cml0ZV9kcXVvdChzdHJ1Y3QgZHF1b3QgKmRxdW90KQoreworCXJldHVybiBxdHJlZV93cml0ZV9kcXVvdChzYl9kcWluZm8oZHF1b3QtPmRxX3NiLCBkcXVvdC0+ZHFfdHlwZSktPmRxaV9wcml2LCBkcXVvdCk7Cit9CisKIHN0YXRpYyBpbnQgdjJfcmVsZWFzZV9kcXVvdChzdHJ1Y3QgZHF1b3QgKmRxdW90KQogewotCWlmICh0ZXN0X2JpdChEUV9GQUtFX0IsICZkcXVvdC0+ZHFfZmxhZ3MpICYmICEoZHF1b3QtPmRxX2RxYi5kcWJfY3VyaW5vZGVzIHwgZHF1b3QtPmRxX2RxYi5kcWJfY3Vyc3BhY2UpKQotCQlyZXR1cm4gdjJfZGVsZXRlX2RxdW90KGRxdW90KTsKKwlyZXR1cm4gcXRyZWVfcmVsZWFzZV9kcXVvdChzYl9kcWluZm8oZHF1b3QtPmRxX3NiLCBkcXVvdC0+ZHFfdHlwZSktPmRxaV9wcml2LCBkcXVvdCk7Cit9CisKK3N0YXRpYyBpbnQgdjJfZnJlZV9maWxlX2luZm8oc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHR5cGUpCit7CisJa2ZyZWUoc2JfZHFpbmZvKHNiLCB0eXBlKS0+ZHFpX3ByaXYpOwogCXJldHVybiAwOwogfQogCkBAIC02NzMsNyArMjEwLDcgQEAKIAkuY2hlY2tfcXVvdGFfZmlsZQk9IHYyX2NoZWNrX3F1b3RhX2ZpbGUsCiAJLnJlYWRfZmlsZV9pbmZvCQk9IHYyX3JlYWRfZmlsZV9pbmZvLAogCS53cml0ZV9maWxlX2luZm8JPSB2Ml93cml0ZV9maWxlX2luZm8sCi0JLmZyZWVfZmlsZV9pbmZvCQk9IE5VTEwsCisJLmZyZWVfZmlsZV9pbmZvCQk9IHYyX2ZyZWVfZmlsZV9pbmZvLAogCS5yZWFkX2RxYmxrCQk9IHYyX3JlYWRfZHF1b3QsCiAJLmNvbW1pdF9kcWJsawkJPSB2Ml93cml0ZV9kcXVvdCwKIAkucmVsZWFzZV9kcWJsawkJPSB2Ml9yZWxlYXNlX2RxdW90LApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9xdW90YWlvX3YxLmggYi9mcy9xdW90YWlvX3YxLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvbGludXgvcXVvdGFpb192MS5oCnJlbmFtZSB0byBmcy9xdW90YWlvX3YxLmgKZGlmZiAtLWdpdCBhL2ZzL3F1b3RhaW9fdjIuaCBiL2ZzL3F1b3RhaW9fdjIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzBmZTU4Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvcXVvdGFpb192Mi5oCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgKglEZWZpbml0aW9ucyBvZiBzdHJ1Y3R1cmVzIGZvciB2ZnN2MCBxdW90YSBmb3JtYXQKKyAqLworCisjaWZuZGVmIF9MSU5VWF9RVU9UQUlPX1YyX0gKKyNkZWZpbmUgX0xJTlVYX1FVT1RBSU9fVjJfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9xdW90YS5oPgorCisvKgorICogRGVmaW5pdGlvbnMgb2YgbWFnaWNzIGFuZCB2ZXJzaW9ucyBvZiBjdXJyZW50IHF1b3RhIGZpbGVzCisgKi8KKyNkZWZpbmUgVjJfSU5JVFFNQUdJQ1Mge1wKKwkweGQ5YzAxZjExLAkvKiBVU1JRVU9UQSAqL1wKKwkweGQ5YzAxOTI3CS8qIEdSUFFVT1RBICovXAorfQorCisjZGVmaW5lIFYyX0lOSVRRVkVSU0lPTlMge1wKKwkwLAkJLyogVVNSUVVPVEEgKi9cCisJMAkJLyogR1JQUVVPVEEgKi9cCit9CisKKy8qIEZpcnN0IGdlbmVyaWMgaGVhZGVyICovCitzdHJ1Y3QgdjJfZGlza19kcWhlYWRlciB7CisJX19sZTMyIGRxaF9tYWdpYzsJLyogTWFnaWMgbnVtYmVyIGlkZW50aWZ5aW5nIGZpbGUgKi8KKwlfX2xlMzIgZHFoX3ZlcnNpb247CS8qIEZpbGUgdmVyc2lvbiAqLworfTsKKworLyoKKyAqIFRoZSBmb2xsb3dpbmcgc3RydWN0dXJlIGRlZmluZXMgdGhlIGZvcm1hdCBvZiB0aGUgZGlzayBxdW90YSBmaWxlCisgKiAoYXMgaXQgYXBwZWFycyBvbiBkaXNrKSAtIHRoZSBmaWxlIGlzIGEgcmFkaXggdHJlZSB3aG9zZSBsZWF2ZXMgcG9pbnQKKyAqIHRvIGJsb2NrcyBvZiB0aGVzZSBzdHJ1Y3R1cmVzLgorICovCitzdHJ1Y3QgdjJfZGlza19kcWJsayB7CisJX19sZTMyIGRxYl9pZDsJCS8qIGlkIHRoaXMgcXVvdGEgYXBwbGllcyB0byAqLworCV9fbGUzMiBkcWJfaWhhcmRsaW1pdDsJLyogYWJzb2x1dGUgbGltaXQgb24gYWxsb2NhdGVkIGlub2RlcyAqLworCV9fbGUzMiBkcWJfaXNvZnRsaW1pdDsJLyogcHJlZmVycmVkIGlub2RlIGxpbWl0ICovCisJX19sZTMyIGRxYl9jdXJpbm9kZXM7CS8qIGN1cnJlbnQgIyBhbGxvY2F0ZWQgaW5vZGVzICovCisJX19sZTMyIGRxYl9iaGFyZGxpbWl0OwkvKiBhYnNvbHV0ZSBsaW1pdCBvbiBkaXNrIHNwYWNlIChpbiBRVU9UQUJMT0NLX1NJWkUpICovCisJX19sZTMyIGRxYl9ic29mdGxpbWl0OwkvKiBwcmVmZXJyZWQgbGltaXQgb24gZGlzayBzcGFjZSAoaW4gUVVPVEFCTE9DS19TSVpFKSAqLworCV9fbGU2NCBkcWJfY3Vyc3BhY2U7CS8qIGN1cnJlbnQgc3BhY2Ugb2NjdXBpZWQgKGluIGJ5dGVzKSAqLworCV9fbGU2NCBkcWJfYnRpbWU7CS8qIHRpbWUgbGltaXQgZm9yIGV4Y2Vzc2l2ZSBkaXNrIHVzZSAqLworCV9fbGU2NCBkcWJfaXRpbWU7CS8qIHRpbWUgbGltaXQgZm9yIGV4Y2Vzc2l2ZSBpbm9kZSB1c2UgKi8KK307CisKKy8qIEhlYWRlciB3aXRoIHR5cGUgYW5kIHZlcnNpb24gc3BlY2lmaWMgaW5mb3JtYXRpb24gKi8KK3N0cnVjdCB2Ml9kaXNrX2RxaW5mbyB7CisJX19sZTMyIGRxaV9iZ3JhY2U7CS8qIFRpbWUgYmVmb3JlIGJsb2NrIHNvZnQgbGltaXQgYmVjb21lcyBoYXJkIGxpbWl0ICovCisJX19sZTMyIGRxaV9pZ3JhY2U7CS8qIFRpbWUgYmVmb3JlIGlub2RlIHNvZnQgbGltaXQgYmVjb21lcyBoYXJkIGxpbWl0ICovCisJX19sZTMyIGRxaV9mbGFnczsJLyogRmxhZ3MgZm9yIHF1b3RhZmlsZSAoRFFGXyopICovCisJX19sZTMyIGRxaV9ibG9ja3M7CS8qIE51bWJlciBvZiBibG9ja3MgaW4gZmlsZSAqLworCV9fbGUzMiBkcWlfZnJlZV9ibGs7CS8qIE51bWJlciBvZiBmaXJzdCBmcmVlIGJsb2NrIGluIHRoZSBsaXN0ICovCisJX19sZTMyIGRxaV9mcmVlX2VudHJ5OwkvKiBOdW1iZXIgb2YgYmxvY2sgd2l0aCBhdCBsZWFzdCBvbmUgZnJlZSBlbnRyeSAqLworfTsKKworI2RlZmluZSBWMl9EUUlORk9PRkYJc2l6ZW9mKHN0cnVjdCB2Ml9kaXNrX2RxaGVhZGVyKQkvKiBPZmZzZXQgb2YgaW5mbyBoZWFkZXIgaW4gZmlsZSAqLworI2RlZmluZSBWMl9EUUJMS1NJWkVfQklUUyAxMAkJCQkvKiBTaXplIG9mIGxlYWYgYmxvY2sgaW4gdHJlZSAqLworCisjZW5kaWYgLyogX0xJTlVYX1FVT1RBSU9fVjJfSCAqLwpkaWZmIC0tZ2l0IGEvZnMvcmFtZnMvaW5vZGUuYyBiL2ZzL3JhbWZzL2lub2RlLmMKaW5kZXggYTgzYTM1MS4uYjdlNmFjNyAxMDA2NDQKLS0tIGEvZnMvcmFtZnMvaW5vZGUuYworKysgYi9mcy9yYW1mcy9pbm9kZS5jCkBAIC01Nyw3ICs1Nyw2IEBACiAJCWlub2RlLT5pX21vZGUgPSBtb2RlOwogCQlpbm9kZS0+aV91aWQgPSBjdXJyZW50X2ZzdWlkKCk7CiAJCWlub2RlLT5pX2dpZCA9IGN1cnJlbnRfZnNnaWQoKTsKLQkJaW5vZGUtPmlfYmxvY2tzID0gMDsKIAkJaW5vZGUtPmlfbWFwcGluZy0+YV9vcHMgPSAmcmFtZnNfYW9wczsKIAkJaW5vZGUtPmlfbWFwcGluZy0+YmFja2luZ19kZXZfaW5mbyA9ICZyYW1mc19iYWNraW5nX2Rldl9pbmZvOwogCQltYXBwaW5nX3NldF9nZnBfbWFzayhpbm9kZS0+aV9tYXBwaW5nLCBHRlBfSElHSFVTRVIpOwpkaWZmIC0tZ2l0IGEvZnMvcmVhZF93cml0ZS5jIGIvZnMvcmVhZF93cml0ZS5jCmluZGV4IDk2OWE2ZDkuLjVjYzY5MjQgMTAwNjQ0Ci0tLSBhL2ZzL3JlYWRfd3JpdGUuYworKysgYi9mcy9yZWFkX3dyaXRlLmMKQEAgLTUwLDYgKzUwLDE0IEBACiAJCW9mZnNldCArPSBpbm9kZS0+aV9zaXplOwogCQlicmVhazsKIAljYXNlIFNFRUtfQ1VSOgorCQkvKgorCQkgKiBIZXJlIHdlIHNwZWNpYWwtY2FzZSB0aGUgbHNlZWsoZmQsIDAsIFNFRUtfQ1VSKQorCQkgKiBwb3NpdGlvbi1xdWVyeWluZyBvcGVyYXRpb24uICBBdm9pZCByZXdyaXRpbmcgdGhlICJzYW1lIgorCQkgKiBmX3BvcyB2YWx1ZSBiYWNrIHRvIHRoZSBmaWxlIGJlY2F1c2UgYSBjb25jdXJyZW50IHJlYWQoKSwKKwkJICogd3JpdGUoKSBvciBsc2VlaygpIG1pZ2h0IGhhdmUgYWx0ZXJlZCBpdAorCQkgKi8KKwkJaWYgKG9mZnNldCA9PSAwKQorCQkJcmV0dXJuIGZpbGUtPmZfcG9zOwogCQlvZmZzZXQgKz0gZmlsZS0+Zl9wb3M7CiAJCWJyZWFrOwogCX0KQEAgLTEwNSw2ICsxMTMsMTAgQEAKIAkJCW9mZnNldCArPSBpX3NpemVfcmVhZChmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlKTsKIAkJCWJyZWFrOwogCQljYXNlIFNFRUtfQ1VSOgorCQkJaWYgKG9mZnNldCA9PSAwKSB7CisJCQkJcmV0dmFsID0gZmlsZS0+Zl9wb3M7CisJCQkJZ290byBvdXQ7CisJCQl9CiAJCQlvZmZzZXQgKz0gZmlsZS0+Zl9wb3M7CiAJfQogCXJldHZhbCA9IC1FSU5WQUw7CkBAIC0xMTUsNiArMTI3LDcgQEAKIAkJfQogCQlyZXR2YWwgPSBvZmZzZXQ7CiAJfQorb3V0OgogCXVubG9ja19rZXJuZWwoKTsKIAlyZXR1cm4gcmV0dmFsOwogfQpkaWZmIC0tZ2l0IGEvZnMvcmVpc2VyZnMvaW5vZGUuYyBiL2ZzL3JlaXNlcmZzL2lub2RlLmMKaW5kZXggZWQwNGY0Ny4uNTVmY2U5MiAxMDA2NDQKLS0tIGEvZnMvcmVpc2VyZnMvaW5vZGUuYworKysgYi9mcy9yZWlzZXJmcy9pbm9kZS5jCkBAIC0xNzgyLDYgKzE3ODIsMTIgQEAKIAkJZ290byBvdXRfYmFkX2lub2RlOwogCX0KIAlhcmdzLm9iamVjdGlkID0gaW5vZGUtPmlfaW5vID0gbGUzMl90b19jcHUoaWguaWhfa2V5Lmtfb2JqZWN0aWQpOworCWlmIChvbGRfZm9ybWF0X29ubHkoc2IpKQorCQltYWtlX2xlX2l0ZW1faGVhZCgmaWgsIE5VTEwsIEtFWV9GT1JNQVRfM181LCBTRF9PRkZTRVQsCisJCQkJICBUWVBFX1NUQVRfREFUQSwgU0RfVjFfU0laRSwgTUFYX1VTX0lOVCk7CisJZWxzZQorCQltYWtlX2xlX2l0ZW1faGVhZCgmaWgsIE5VTEwsIEtFWV9GT1JNQVRfM182LCBTRF9PRkZTRVQsCisJCQkJICBUWVBFX1NUQVRfREFUQSwgU0RfU0laRSwgTUFYX1VTX0lOVCk7CiAJbWVtY3B5KElOT0RFX1BLRVkoaW5vZGUpLCAmKGloLmloX2tleSksIEtFWV9TSVpFKTsKIAlhcmdzLmRpcmlkID0gbGUzMl90b19jcHUoaWguaWhfa2V5LmtfZGlyX2lkKTsKIAlpZiAoaW5zZXJ0X2lub2RlX2xvY2tlZDQoaW5vZGUsIGFyZ3Mub2JqZWN0aWQsCkBAIC0xODM0LDEzICsxODQwLDYgQEAKIAlyZWlzZXJmc19pbml0X2FjbF9kZWZhdWx0KGlub2RlKTsKIAlyZWlzZXJmc19pbml0X3hhdHRyX3J3c2VtKGlub2RlKTsKIAotCWlmIChvbGRfZm9ybWF0X29ubHkoc2IpKQotCQltYWtlX2xlX2l0ZW1faGVhZCgmaWgsIE5VTEwsIEtFWV9GT1JNQVRfM181LCBTRF9PRkZTRVQsCi0JCQkJICBUWVBFX1NUQVRfREFUQSwgU0RfVjFfU0laRSwgTUFYX1VTX0lOVCk7Ci0JZWxzZQotCQltYWtlX2xlX2l0ZW1faGVhZCgmaWgsIE5VTEwsIEtFWV9GT1JNQVRfM182LCBTRF9PRkZTRVQsCi0JCQkJICBUWVBFX1NUQVRfREFUQSwgU0RfU0laRSwgTUFYX1VTX0lOVCk7Ci0KIAkvKiBrZXkgdG8gc2VhcmNoIGZvciBjb3JyZWN0IHBsYWNlIGZvciBuZXcgc3RhdCBkYXRhICovCiAJX21ha2VfY3B1X2tleSgma2V5LCBLRVlfRk9STUFUXzNfNiwgbGUzMl90b19jcHUoaWguaWhfa2V5LmtfZGlyX2lkKSwKIAkJICAgICAgbGUzMl90b19jcHUoaWguaWhfa2V5Lmtfb2JqZWN0aWQpLCBTRF9PRkZTRVQsCmRpZmYgLS1naXQgYS9mcy9yZWlzZXJmcy9zdXBlci5jIGIvZnMvcmVpc2VyZnMvc3VwZXIuYwppbmRleCA2NjNhOTFmLi5jNTU2NTFmIDEwMDY0NAotLS0gYS9mcy9yZWlzZXJmcy9zdXBlci5jCisrKyBiL2ZzL3JlaXNlcmZzL3N1cGVyLmMKQEAgLTY0OSw2ICs2NDksOCBAQAogCS5yZWxlYXNlX2RxdW90ID0gcmVpc2VyZnNfcmVsZWFzZV9kcXVvdCwKIAkubWFya19kaXJ0eSA9IHJlaXNlcmZzX21hcmtfZHF1b3RfZGlydHksCiAJLndyaXRlX2luZm8gPSByZWlzZXJmc193cml0ZV9pbmZvLAorCS5hbGxvY19kcXVvdAk9IGRxdW90X2FsbG9jLAorCS5kZXN0cm95X2RxdW90CT0gZHF1b3RfZGVzdHJveSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcXVvdGFjdGxfb3BzIHJlaXNlcmZzX3FjdGxfb3BlcmF0aW9ucyA9IHsKQEAgLTk5NCw4ICs5OTYsNyBAQAogCQlpZiAoYyA9PSAndScgfHwgYyA9PSAnZycpIHsKIAkJCWludCBxdHlwZSA9IGMgPT0gJ3UnID8gVVNSUVVPVEEgOiBHUlBRVU9UQTsKIAotCQkJaWYgKChzYl9hbnlfcXVvdGFfZW5hYmxlZChzKSB8fAotCQkJICAgICBzYl9hbnlfcXVvdGFfc3VzcGVuZGVkKHMpKSAmJgorCQkJaWYgKHNiX2FueV9xdW90YV9sb2FkZWQocykgJiYKIAkJCSAgICAoISphcmcgIT0gIVJFSVNFUkZTX1NCKHMpLT5zX3FmX25hbWVzW3F0eXBlXSkpIHsKIAkJCQlyZWlzZXJmc193YXJuaW5nKHMsCiAJCQkJCQkgInJlaXNlcmZzX3BhcnNlX29wdGlvbnM6IGNhbm5vdCBjaGFuZ2Ugam91cm5hbGVkIHF1b3RhIG9wdGlvbnMgd2hlbiBxdW90YSB0dXJuZWQgb24uIik7CkBAIC0xMDQxLDggKzEwNDIsNyBAQAogCQkJCQkJICJyZWlzZXJmc19wYXJzZV9vcHRpb25zOiB1bmtub3duIHF1b3RhIGZvcm1hdCBzcGVjaWZpZWQuIik7CiAJCQkJcmV0dXJuIDA7CiAJCQl9Ci0JCQlpZiAoKHNiX2FueV9xdW90YV9lbmFibGVkKHMpIHx8Ci0JCQkgICAgIHNiX2FueV9xdW90YV9zdXNwZW5kZWQocykpICYmCisJCQlpZiAoc2JfYW55X3F1b3RhX2xvYWRlZChzKSAmJgogCQkJICAgICpxZm10ICE9IFJFSVNFUkZTX1NCKHMpLT5zX2pxdW90YV9mbXQpIHsKIAkJCQlyZWlzZXJmc193YXJuaW5nKHMsCiAJCQkJCQkgInJlaXNlcmZzX3BhcnNlX29wdGlvbnM6IGNhbm5vdCBjaGFuZ2Ugam91cm5hbGVkIHF1b3RhIG9wdGlvbnMgd2hlbiBxdW90YSB0dXJuZWQgb24uIik7CkBAIC0xMDY3LDcgKzEwNjcsNyBAQAogCX0KIAkvKiBUaGlzIGNoZWNraW5nIGlzIG5vdCBwcmVjaXNlIHdydCB0aGUgcXVvdGEgdHlwZSBidXQgZm9yIG91ciBwdXJwb3NlcyBpdCBpcyBzdWZmaWNpZW50ICovCiAJaWYgKCEoKm1vdW50X29wdGlvbnMgJiAoMSA8PCBSRUlTRVJGU19RVU9UQSkpCi0JICAgICYmIHNiX2FueV9xdW90YV9lbmFibGVkKHMpKSB7CisJICAgICYmIHNiX2FueV9xdW90YV9sb2FkZWQocykpIHsKIAkJcmVpc2VyZnNfd2FybmluZyhzLAogCQkJCSAicmVpc2VyZnNfcGFyc2Vfb3B0aW9uczogcXVvdGEgb3B0aW9ucyBtdXN0IGJlIHByZXNlbnQgd2hlbiBxdW90YSBpcyB0dXJuZWQgb24uIik7CiAJCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZnMvcm9tZnMvaW5vZGUuYyBiL2ZzL3JvbWZzL2lub2RlLmMKaW5kZXggNjBkMmY4Mi4uOThhMjMyZiAxMDA2NDQKLS0tIGEvZnMvcm9tZnMvaW5vZGUuYworKysgYi9mcy9yb21mcy9pbm9kZS5jCkBAIC00OTAsNyArNDkwLDcgQEAKIHN0YXRpYyBzdHJ1Y3QgaW5vZGUgKgogcm9tZnNfaWdldChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB1bnNpZ25lZCBsb25nIGlubykKIHsKLQlpbnQgbmV4dGZoOworCWludCBuZXh0ZmgsIHJldDsKIAlzdHJ1Y3Qgcm9tZnNfaW5vZGUgcmk7CiAJc3RydWN0IGlub2RlICppOwogCkBAIC01MjQsMTQgKzUyNCwxMyBAQAogCWktPmlfc2l6ZSA9IGJlMzJfdG9fY3B1KHJpLnNpemUpOwogCWktPmlfbXRpbWUudHZfc2VjID0gaS0+aV9hdGltZS50dl9zZWMgPSBpLT5pX2N0aW1lLnR2X3NlYyA9IDA7CiAJaS0+aV9tdGltZS50dl9uc2VjID0gaS0+aV9hdGltZS50dl9uc2VjID0gaS0+aV9jdGltZS50dl9uc2VjID0gMDsKLQlpLT5pX3VpZCA9IGktPmlfZ2lkID0gMDsKIAogICAgICAgICAvKiBQcmVjYWxjdWxhdGUgdGhlIGRhdGEgb2Zmc2V0ICovCi0gICAgICAgIGlubyA9IHJvbWZzX3N0cm5sZW4oaSwgaW5vK1JPTUZIX1NJWkUsIFJPTUZTX01BWEZOKTsKLSAgICAgICAgaWYgKGlubyA+PSAwKQotICAgICAgICAgICAgICAgIGlubyA9ICgoUk9NRkhfU0laRStpbm8rMStST01GSF9QQUQpJlJPTUZIX01BU0spOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgaW5vID0gMDsKKwlyZXQgPSByb21mc19zdHJubGVuKGksIGlubyArIFJPTUZIX1NJWkUsIFJPTUZTX01BWEZOKTsKKwlpZiAocmV0ID49IDApCisJCWlubyA9IChST01GSF9TSVpFICsgcmV0ICsgMSArIFJPTUZIX1BBRCkgJiBST01GSF9NQVNLOworCWVsc2UKKwkJaW5vID0gMDsKIAogICAgICAgICBST01GU19JKGkpLT5pX21ldGFzaXplID0gaW5vOwogICAgICAgICBST01GU19JKGkpLT5pX2RhdGFvZmZzZXQgPSBpbm8rKGktPmlfaW5vJlJPTUZIX01BU0spOwpkaWZmIC0tZ2l0IGEvZnMvc2VsZWN0LmMgYi9mcy9zZWxlY3QuYwppbmRleCA4N2RmNTFlLi4wOGI5MWJlIDEwMDY0NAotLS0gYS9mcy9zZWxlY3QuYworKysgYi9mcy9zZWxlY3QuYwpAQCAtMTA5LDExICsxMDksMTEgQEAKIHZvaWQgcG9sbF9pbml0d2FpdChzdHJ1Y3QgcG9sbF93cXVldWVzICpwd3EpCiB7CiAJaW5pdF9wb2xsX2Z1bmNwdHIoJnB3cS0+cHQsIF9fcG9sbHdhaXQpOworCXB3cS0+cG9sbGluZ190YXNrID0gY3VycmVudDsKIAlwd3EtPmVycm9yID0gMDsKIAlwd3EtPnRhYmxlID0gTlVMTDsKIAlwd3EtPmlubGluZV9pbmRleCA9IDA7CiB9Ci0KIEVYUE9SVF9TWU1CT0wocG9sbF9pbml0d2FpdCk7CiAKIHN0YXRpYyB2b2lkIGZyZWVfcG9sbF9lbnRyeShzdHJ1Y3QgcG9sbF90YWJsZV9lbnRyeSAqZW50cnkpCkBAIC0xNDIsMTIgKzE0MiwxMCBAQAogCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpIG9sZCk7CiAJfQogfQotCiBFWFBPUlRfU1lNQk9MKHBvbGxfZnJlZXdhaXQpOwogCi1zdGF0aWMgc3RydWN0IHBvbGxfdGFibGVfZW50cnkgKnBvbGxfZ2V0X2VudHJ5KHBvbGxfdGFibGUgKl9wKQorc3RhdGljIHN0cnVjdCBwb2xsX3RhYmxlX2VudHJ5ICpwb2xsX2dldF9lbnRyeShzdHJ1Y3QgcG9sbF93cXVldWVzICpwKQogewotCXN0cnVjdCBwb2xsX3dxdWV1ZXMgKnAgPSBjb250YWluZXJfb2YoX3AsIHN0cnVjdCBwb2xsX3dxdWV1ZXMsIHB0KTsKIAlzdHJ1Y3QgcG9sbF90YWJsZV9wYWdlICp0YWJsZSA9IHAtPnRhYmxlOwogCiAJaWYgKHAtPmlubGluZV9pbmRleCA8IE5fSU5MSU5FX1BPTExfRU5UUklFUykKQEAgLTE1OSw3ICsxNTcsNiBAQAogCQluZXdfdGFibGUgPSAoc3RydWN0IHBvbGxfdGFibGVfcGFnZSAqKSBfX2dldF9mcmVlX3BhZ2UoR0ZQX0tFUk5FTCk7CiAJCWlmICghbmV3X3RhYmxlKSB7CiAJCQlwLT5lcnJvciA9IC1FTk9NRU07Ci0JCQlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CiAJCQlyZXR1cm4gTlVMTDsKIAkJfQogCQluZXdfdGFibGUtPmVudHJ5ID0gbmV3X3RhYmxlLT5lbnRyaWVzOwpAQCAtMTcxLDIwICsxNjgsNzUgQEAKIAlyZXR1cm4gdGFibGUtPmVudHJ5Kys7CiB9CiAKK3N0YXRpYyBpbnQgcG9sbHdha2Uod2FpdF9xdWV1ZV90ICp3YWl0LCB1bnNpZ25lZCBtb2RlLCBpbnQgc3luYywgdm9pZCAqa2V5KQoreworCXN0cnVjdCBwb2xsX3dxdWV1ZXMgKnB3cSA9IHdhaXQtPnByaXZhdGU7CisJREVDTEFSRV9XQUlUUVVFVUUoZHVtbXlfd2FpdCwgcHdxLT5wb2xsaW5nX3Rhc2spOworCisJLyoKKwkgKiBBbHRob3VnaCB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB1bmRlciB3YWl0cXVldWUgbG9jaywgTE9DSworCSAqIGRvZXNuJ3QgaW1wbHkgd3JpdGUgYmFycmllciBhbmQgdGhlIHVzZXJzIGV4cGVjdCB3cml0ZQorCSAqIGJhcnJpZXIgc2VtYW50aWNzIG9uIHdha2V1cCBmdW5jdGlvbnMuICBUaGUgZm9sbG93aW5nCisJICogc21wX3dtYigpIGlzIGVxdWl2YWxlbnQgdG8gc21wX3dtYigpIGluIHRyeV90b193YWtlX3VwKCkKKwkgKiBhbmQgaXMgcGFpcmVkIHdpdGggc2V0X21iKCkgaW4gcG9sbF9zY2hlZHVsZV90aW1lb3V0LgorCSAqLworCXNtcF93bWIoKTsKKwlwd3EtPnRyaWdnZXJlZCA9IDE7CisKKwkvKgorCSAqIFBlcmZvcm0gdGhlIGRlZmF1bHQgd2FrZSB1cCBvcGVyYXRpb24gdXNpbmcgYSBkdW1teQorCSAqIHdhaXRxdWV1ZS4KKwkgKgorCSAqIFRPRE86IFRoaXMgaXMgaGFja3kgYnV0IHRoZXJlIGN1cnJlbnRseSBpcyBubyBpbnRlcmZhY2UgdG8KKwkgKiBwYXNzIGluIEBzeW5jLiAgQHN5bmMgaXMgc2NoZWR1bGVkIHRvIGJlIHJlbW92ZWQgYW5kIG9uY2UKKwkgKiB0aGF0IGhhcHBlbnMsIHdha2VfdXBfcHJvY2VzcygpIGNhbiBiZSB1c2VkIGRpcmVjdGx5LgorCSAqLworCXJldHVybiBkZWZhdWx0X3dha2VfZnVuY3Rpb24oJmR1bW15X3dhaXQsIG1vZGUsIHN5bmMsIGtleSk7Cit9CisKIC8qIEFkZCBhIG5ldyBlbnRyeSAqLwogc3RhdGljIHZvaWQgX19wb2xsd2FpdChzdHJ1Y3QgZmlsZSAqZmlscCwgd2FpdF9xdWV1ZV9oZWFkX3QgKndhaXRfYWRkcmVzcywKIAkJCQlwb2xsX3RhYmxlICpwKQogewotCXN0cnVjdCBwb2xsX3RhYmxlX2VudHJ5ICplbnRyeSA9IHBvbGxfZ2V0X2VudHJ5KHApOworCXN0cnVjdCBwb2xsX3dxdWV1ZXMgKnB3cSA9IGNvbnRhaW5lcl9vZihwLCBzdHJ1Y3QgcG9sbF93cXVldWVzLCBwdCk7CisJc3RydWN0IHBvbGxfdGFibGVfZW50cnkgKmVudHJ5ID0gcG9sbF9nZXRfZW50cnkocHdxKTsKIAlpZiAoIWVudHJ5KQogCQlyZXR1cm47CiAJZ2V0X2ZpbGUoZmlscCk7CiAJZW50cnktPmZpbHAgPSBmaWxwOwogCWVudHJ5LT53YWl0X2FkZHJlc3MgPSB3YWl0X2FkZHJlc3M7Ci0JaW5pdF93YWl0cXVldWVfZW50cnkoJmVudHJ5LT53YWl0LCBjdXJyZW50KTsKKwlpbml0X3dhaXRxdWV1ZV9mdW5jX2VudHJ5KCZlbnRyeS0+d2FpdCwgcG9sbHdha2UpOworCWVudHJ5LT53YWl0LnByaXZhdGUgPSBwd3E7CiAJYWRkX3dhaXRfcXVldWUod2FpdF9hZGRyZXNzLCAmZW50cnktPndhaXQpOwogfQogCitpbnQgcG9sbF9zY2hlZHVsZV90aW1lb3V0KHN0cnVjdCBwb2xsX3dxdWV1ZXMgKnB3cSwgaW50IHN0YXRlLAorCQkJICBrdGltZV90ICpleHBpcmVzLCB1bnNpZ25lZCBsb25nIHNsYWNrKQoreworCWludCByYyA9IC1FSU5UUjsKKworCXNldF9jdXJyZW50X3N0YXRlKHN0YXRlKTsKKwlpZiAoIXB3cS0+dHJpZ2dlcmVkKQorCQlyYyA9IHNjaGVkdWxlX2hydGltZW91dF9yYW5nZShleHBpcmVzLCBzbGFjaywgSFJUSU1FUl9NT0RFX0FCUyk7CisJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCisJLyoKKwkgKiBQcmVwYXJlIGZvciB0aGUgbmV4dCBpdGVyYXRpb24uCisJICoKKwkgKiBUaGUgZm9sbG93aW5nIHNldF9tYigpIHNlcnZlcyB0d28gcHVycG9zZXMuICBGaXJzdCwgaXQncworCSAqIHRoZSBjb3VudGVycGFydCBybWIgb2YgdGhlIHdtYiBpbiBwb2xsd2FrZSgpIHN1Y2ggdGhhdCBkYXRhCisJICogd3JpdHRlbiBiZWZvcmUgd2FrZSB1cCBpcyBhbHdheXMgdmlzaWJsZSBhZnRlciB3YWtlIHVwLgorCSAqIFNlY29uZCwgdGhlIGZ1bGwgYmFycmllciBndWFyYW50ZWVzIHRoYXQgdHJpZ2dlcmVkIGNsZWFyaW5nCisJICogZG9lc24ndCBwYXNzIGV2ZW50IGNoZWNrIG9mIHRoZSBuZXh0IGl0ZXJhdGlvbi4gIE5vdGUgdGhhdAorCSAqIHRoaXMgcHJvYmxlbSBkb2Vzbid0IGV4aXN0IGZvciB0aGUgZmlyc3QgaXRlcmF0aW9uIGFzCisJICogYWRkX3dhaXRfcXVldWUoKSBoYXMgZnVsbCBiYXJyaWVyIHNlbWFudGljcy4KKwkgKi8KKwlzZXRfbWIocHdxLT50cmlnZ2VyZWQsIDApOworCisJcmV0dXJuIHJjOworfQorRVhQT1JUX1NZTUJPTChwb2xsX3NjaGVkdWxlX3RpbWVvdXQpOworCiAvKioKICAqIHBvbGxfc2VsZWN0X3NldF90aW1lb3V0IC0gaGVscGVyIGZ1bmN0aW9uIHRvIHNldHVwIHRoZSB0aW1lb3V0IHZhbHVlCiAgKiBAdG86CQlwb2ludGVyIHRvIHRpbWVzcGVjIHZhcmlhYmxlIGZvciB0aGUgZmluYWwgdGltZW91dApAQCAtMzQwLDggKzM5Miw2IEBACiAJZm9yICg7OykgewogCQl1bnNpZ25lZCBsb25nICpyaW5wLCAqcm91dHAsICpyZXhwLCAqaW5wLCAqb3V0cCwgKmV4cDsKIAotCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwotCiAJCWlucCA9IGZkcy0+aW47IG91dHAgPSBmZHMtPm91dDsgZXhwID0gZmRzLT5leDsKIAkJcmlucCA9IGZkcy0+cmVzX2luOyByb3V0cCA9IGZkcy0+cmVzX291dDsgcmV4cCA9IGZkcy0+cmVzX2V4OwogCkBAIC00MTEsMTAgKzQ2MSwxMCBAQAogCQkJdG8gPSAmZXhwaXJlOwogCQl9CiAKLQkJaWYgKCFzY2hlZHVsZV9ocnRpbWVvdXRfcmFuZ2UodG8sIHNsYWNrLCBIUlRJTUVSX01PREVfQUJTKSkKKwkJaWYgKCFwb2xsX3NjaGVkdWxlX3RpbWVvdXQoJnRhYmxlLCBUQVNLX0lOVEVSUlVQVElCTEUsCisJCQkJCSAgIHRvLCBzbGFjaykpCiAJCQl0aW1lZF9vdXQgPSAxOwogCX0KLQlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CiAKIAlwb2xsX2ZyZWV3YWl0KCZ0YWJsZSk7CiAKQEAgLTY2Niw3ICs3MTYsNiBAQAogCWZvciAoOzspIHsKIAkJc3RydWN0IHBvbGxfbGlzdCAqd2FsazsKIAotCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwogCQlmb3IgKHdhbGsgPSBsaXN0OyB3YWxrICE9IE5VTEw7IHdhbGsgPSB3YWxrLT5uZXh0KSB7CiAJCQlzdHJ1Y3QgcG9sbGZkICogcGZkLCAqIHBmZF9lbmQ7CiAKQEAgLTcwOSwxMCArNzU4LDkgQEAKIAkJCXRvID0gJmV4cGlyZTsKIAkJfQogCi0JCWlmICghc2NoZWR1bGVfaHJ0aW1lb3V0X3JhbmdlKHRvLCBzbGFjaywgSFJUSU1FUl9NT0RFX0FCUykpCisJCWlmICghcG9sbF9zY2hlZHVsZV90aW1lb3V0KHdhaXQsIFRBU0tfSU5URVJSVVBUSUJMRSwgdG8sIHNsYWNrKSkKIAkJCXRpbWVkX291dCA9IDE7CiAJfQotCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKIAlyZXR1cm4gY291bnQ7CiB9CiAKZGlmZiAtLWdpdCBhL2ZzL3NwbGljZS5jIGIvZnMvc3BsaWNlLmMKaW5kZXggMWFiYWI1Yy4uYTU0YjNlMyAxMDA2NDQKLS0tIGEvZnMvc3BsaWNlLmMKKysrIGIvZnMvc3BsaWNlLmMKQEAgLTIxLDYgKzIxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgogI2luY2x1ZGUgPGxpbnV4L3NwbGljZS5oPgorI2luY2x1ZGUgPGxpbnV4L21lbWNvbnRyb2wuaD4KICNpbmNsdWRlIDxsaW51eC9tbV9pbmxpbmUuaD4KICNpbmNsdWRlIDxsaW51eC9zd2FwLmg+CiAjaW5jbHVkZSA8bGludXgvd3JpdGViYWNrLmg+CmRpZmYgLS1naXQgYS9mcy9zdGF0LmMgYi9mcy9zdGF0LmMKaW5kZXggN2M0NmZiZS4uN2UxMmE2ZiAxMDA2NDQKLS0tIGEvZnMvc3RhdC5jCisrKyBiL2ZzL3N0YXQuYwpAQCAtMzA1LDcgKzMwNSw3IEBACiAJCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBwYXRoLmRlbnRyeS0+ZF9pbm9kZTsKIAogCQllcnJvciA9IC1FSU5WQUw7Ci0JCWlmIChpbm9kZS0+aV9vcCAmJiBpbm9kZS0+aV9vcC0+cmVhZGxpbmspIHsKKwkJaWYgKGlub2RlLT5pX29wLT5yZWFkbGluaykgewogCQkJZXJyb3IgPSBzZWN1cml0eV9pbm9kZV9yZWFkbGluayhwYXRoLmRlbnRyeSk7CiAJCQlpZiAoIWVycm9yKSB7CiAJCQkJdG91Y2hfYXRpbWUocGF0aC5tbnQsIHBhdGguZGVudHJ5KTsKZGlmZiAtLWdpdCBhL2ZzL3N1cGVyLmMgYi9mcy9zdXBlci5jCmluZGV4IGRkYmEwNjkuLmVkMDgwYzQgMTAwNjQ0Ci0tLSBhL2ZzL3N1cGVyLmMKKysrIGIvZnMvc3VwZXIuYwpAQCAtMzgsNiArMzgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tvYmplY3QuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9hc3luYy5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKIApAQCAtNzEsNiArNzIsNyBAQAogCQlJTklUX0hMSVNUX0hFQUQoJnMtPnNfYW5vbik7CiAJCUlOSVRfTElTVF9IRUFEKCZzLT5zX2lub2Rlcyk7CiAJCUlOSVRfTElTVF9IRUFEKCZzLT5zX2RlbnRyeV9scnUpOworCQlJTklUX0xJU1RfSEVBRCgmcy0+c19hc3luY19saXN0KTsKIAkJaW5pdF9yd3NlbSgmcy0+c191bW91bnQpOwogCQltdXRleF9pbml0KCZzLT5zX2xvY2spOwogCQlsb2NrZGVwX3NldF9jbGFzcygmcy0+c191bW91bnQsICZ0eXBlLT5zX3Vtb3VudF9rZXkpOwpAQCAtMjg5LDExICsyOTEsMTggQEAKIHsKIAljb25zdCBzdHJ1Y3Qgc3VwZXJfb3BlcmF0aW9ucyAqc29wID0gc2ItPnNfb3A7CiAKKwogCWlmIChzYi0+c19yb290KSB7CiAJCXNocmlua19kY2FjaGVfZm9yX3Vtb3VudChzYik7CiAJCWZzeW5jX3N1cGVyKHNiKTsKIAkJbG9ja19zdXBlcihzYik7CiAJCXNiLT5zX2ZsYWdzICY9IH5NU19BQ1RJVkU7CisKKwkJLyoKKwkJICogd2FpdCBmb3IgYXN5bmNocm9ub3VzIGZzIG9wZXJhdGlvbnMgdG8gZmluaXNoIGJlZm9yZSBnb2luZyBmdXJ0aGVyCisJCSAqLworCQlhc3luY19zeW5jaHJvbml6ZV9mdWxsX3NwZWNpYWwoJnNiLT5zX2FzeW5jX2xpc3QpOworCiAJCS8qIGJhZCBuYW1lIC0gaXQgc2hvdWxkIGJlIGV2aWN0X2lub2RlcygpICovCiAJCWludmFsaWRhdGVfaW5vZGVzKHNiKTsKIAkJbG9ja19rZXJuZWwoKTsKQEAgLTQ2MSw2ICs0NzAsNyBAQAogCQlzYi0+c19jb3VudCsrOwogCQlzcGluX3VubG9jaygmc2JfbG9jayk7CiAJCWRvd25fcmVhZCgmc2ItPnNfdW1vdW50KTsKKwkJYXN5bmNfc3luY2hyb25pemVfZnVsbF9zcGVjaWFsKCZzYi0+c19hc3luY19saXN0KTsKIAkJaWYgKHNiLT5zX3Jvb3QgJiYgKHdhaXQgfHwgc2ItPnNfZGlydCkpCiAJCQlzYi0+c19vcC0+c3luY19mcyhzYiwgd2FpdCk7CiAJCXVwX3JlYWQoJnNiLT5zX3Vtb3VudCk7CkBAIC04MDAsNiArODEwLDcgQEAKIAkJfQogCiAJCXMtPnNfZmxhZ3MgfD0gTVNfQUNUSVZFOworCQliZGV2LT5iZF9zdXBlciA9IHM7CiAJfQogCiAJcmV0dXJuIHNpbXBsZV9zZXRfbW50KG1udCwgcyk7CkBAIC04MTksNiArODMwLDcgQEAKIAlzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2ID0gc2ItPnNfYmRldjsKIAlmbW9kZV90IG1vZGUgPSBzYi0+c19tb2RlOwogCisJYmRldi0+YmRfc3VwZXIgPSAwOwogCWdlbmVyaWNfc2h1dGRvd25fc3VwZXIoc2IpOwogCXN5bmNfYmxvY2tkZXYoYmRldik7CiAJY2xvc2VfYmRldl9leGNsdXNpdmUoYmRldiwgbW9kZSk7CmRpZmYgLS1naXQgYS9mcy9zeW5jLmMgYi9mcy9zeW5jLmMKaW5kZXggMjk2NzU2Mi4uYWMwMmI1NiAxMDA2NDQKLS0tIGEvZnMvc3luYy5jCisrKyBiL2ZzL3N5bmMuYwpAQCAtNzUsMTQgKzc1LDM5IEBACiAJcmV0dXJuIHJldDsKIH0KIAotbG9uZyBkb19mc3luYyhzdHJ1Y3QgZmlsZSAqZmlsZSwgaW50IGRhdGFzeW5jKQorLyoqCisgKiB2ZnNfZnN5bmMgLSBwZXJmb3JtIGEgZnN5bmMgb3IgZmRhdGFzeW5jIG9uIGEgZmlsZQorICogQGZpbGU6CQlmaWxlIHRvIHN5bmMKKyAqIEBkZW50cnk6CQlkZW50cnkgb2YgQGZpbGUKKyAqIEBkYXRhOgkJb25seSBwZXJmb3JtIGEgZmRhdGFzeW5jIG9wZXJhdGlvbgorICoKKyAqIFdyaXRlIGJhY2sgZGF0YSBhbmQgbWV0YWRhdGEgZm9yIEBmaWxlIHRvIGRpc2suICBJZiBAZGF0YXN5bmMgaXMKKyAqIHNldCBvbmx5IG1ldGFkYXRhIG5lZWRlZCB0byBhY2Nlc3MgbW9kaWZpZWQgZmlsZSBkYXRhIGlzIHdyaXR0ZW4uCisgKgorICogSW4gY2FzZSB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9tIG5mc2QgQGZpbGUgbWF5IGJlICVOVUxMIGFuZAorICogb25seSBAZGVudHJ5IGlzIHNldC4gIFRoaXMgY2FuIG9ubHkgaGFwcGVuIHdoZW4gdGhlIGZpbGVzeXN0ZW0KKyAqIGltcGxlbWVudHMgdGhlIGV4cG9ydF9vcGVyYXRpb25zIEFQSS4KKyAqLworaW50IHZmc19mc3luYyhzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQgZGF0YXN5bmMpCiB7Ci0JaW50IHJldDsKLQlpbnQgZXJyOwotCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gZmlsZS0+Zl9tYXBwaW5nOworCWNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgKmZvcDsKKwlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZzsKKwlpbnQgZXJyLCByZXQ7CiAKLQlpZiAoIWZpbGUtPmZfb3AgfHwgIWZpbGUtPmZfb3AtPmZzeW5jKSB7Ci0JCS8qIFdoeT8gIFdlIGNhbiBzdGlsbCBjYWxsIGZpbGVtYXBfZmRhdGF3cml0ZSAqLworCS8qCisJICogR2V0IG1hcHBpbmcgYW5kIG9wZXJhdGlvbnMgZnJvbSB0aGUgZmlsZSBpbiBjYXNlIHdlIGhhdmUKKwkgKiBhcyBmaWxlLCBvciBnZXQgdGhlIGRlZmF1bHQgdmFsdWVzIGZvciB0aGVtIGluIGNhc2Ugd2UKKwkgKiBkb24ndCBoYXZlIGEgc3RydWN0IGZpbGUgYXZhaWxhYmxlLiAgRGFtbiBuZnNkLi4KKwkgKi8KKwlpZiAoZmlsZSkgeworCQltYXBwaW5nID0gZmlsZS0+Zl9tYXBwaW5nOworCQlmb3AgPSBmaWxlLT5mX29wOworCX0gZWxzZSB7CisJCW1hcHBpbmcgPSBkZW50cnktPmRfaW5vZGUtPmlfbWFwcGluZzsKKwkJZm9wID0gZGVudHJ5LT5kX2lub2RlLT5pX2ZvcDsKKwl9CisKKwlpZiAoIWZvcCB8fCAhZm9wLT5mc3luYykgewogCQlyZXQgPSAtRUlOVkFMOwogCQlnb3RvIG91dDsKIAl9CkBAIC05NCw3ICsxMTksNyBAQAogCSAqIGxpdmVsb2NrcyBpbiBmc3luY19idWZmZXJzX2xpc3QoKS4KIAkgKi8KIAltdXRleF9sb2NrKCZtYXBwaW5nLT5ob3N0LT5pX211dGV4KTsKLQllcnIgPSBmaWxlLT5mX29wLT5mc3luYyhmaWxlLCBmaWxlLT5mX3BhdGguZGVudHJ5LCBkYXRhc3luYyk7CisJZXJyID0gZm9wLT5mc3luYyhmaWxlLCBkZW50cnksIGRhdGFzeW5jKTsKIAlpZiAoIXJldCkKIAkJcmV0ID0gZXJyOwogCW11dGV4X3VubG9jaygmbWFwcGluZy0+aG9zdC0+aV9tdXRleCk7CkBAIC0xMDQsMTUgKzEyOSwxNiBAQAogb3V0OgogCXJldHVybiByZXQ7CiB9CitFWFBPUlRfU1lNQk9MKHZmc19mc3luYyk7CiAKLXN0YXRpYyBsb25nIF9fZG9fZnN5bmModW5zaWduZWQgaW50IGZkLCBpbnQgZGF0YXN5bmMpCitzdGF0aWMgaW50IGRvX2ZzeW5jKHVuc2lnbmVkIGludCBmZCwgaW50IGRhdGFzeW5jKQogewogCXN0cnVjdCBmaWxlICpmaWxlOwogCWludCByZXQgPSAtRUJBREY7CiAKIAlmaWxlID0gZmdldChmZCk7CiAJaWYgKGZpbGUpIHsKLQkJcmV0ID0gZG9fZnN5bmMoZmlsZSwgZGF0YXN5bmMpOworCQlyZXQgPSB2ZnNfZnN5bmMoZmlsZSwgZmlsZS0+Zl9wYXRoLmRlbnRyeSwgZGF0YXN5bmMpOwogCQlmcHV0KGZpbGUpOwogCX0KIAlyZXR1cm4gcmV0OwpAQCAtMTIwLDEyICsxNDYsMTIgQEAKIAogYXNtbGlua2FnZSBsb25nIHN5c19mc3luYyh1bnNpZ25lZCBpbnQgZmQpCiB7Ci0JcmV0dXJuIF9fZG9fZnN5bmMoZmQsIDApOworCXJldHVybiBkb19mc3luYyhmZCwgMCk7CiB9CiAKIGFzbWxpbmthZ2UgbG9uZyBzeXNfZmRhdGFzeW5jKHVuc2lnbmVkIGludCBmZCkKIHsKLQlyZXR1cm4gX19kb19mc3luYyhmZCwgMSk7CisJcmV0dXJuIGRvX2ZzeW5jKGZkLCAxKTsKIH0KIAogLyoKQEAgLTI2OSw3ICsyOTUsNyBAQAogCiAJaWYgKGZsYWdzICYgU1lOQ19GSUxFX1JBTkdFX1dSSVRFKSB7CiAJCXJldCA9IF9fZmlsZW1hcF9mZGF0YXdyaXRlX3JhbmdlKG1hcHBpbmcsIG9mZnNldCwgZW5kYnl0ZSwKLQkJCQkJCVdCX1NZTkNfTk9ORSk7CisJCQkJCQlXQl9TWU5DX0FMTCk7CiAJCWlmIChyZXQgPCAwKQogCQkJZ290byBvdXQ7CiAJfQpkaWZmIC0tZ2l0IGEvZnMvc3lzZnMvaW5vZGUuYyBiL2ZzL3N5c2ZzL2lub2RlLmMKaW5kZXggZWI1M2M2My4uZGZhM2Q5NCAxMDA2NDQKLS0tIGEvZnMvc3lzZnMvaW5vZGUuYworKysgYi9mcy9zeXNmcy9pbm9kZS5jCkBAIC0xMDcsOCArMTA3LDYgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBzZXRfZGVmYXVsdF9pbm9kZV9hdHRyKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBtb2RlX3QgbW9kZSkKIHsKIAlpbm9kZS0+aV9tb2RlID0gbW9kZTsKLQlpbm9kZS0+aV91aWQgPSAwOwotCWlub2RlLT5pX2dpZCA9IDA7CiAJaW5vZGUtPmlfYXRpbWUgPSBpbm9kZS0+aV9tdGltZSA9IGlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FOwogfQogCkBAIC0xNDksNyArMTQ3LDYgQEAKIHsKIAlzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqYmluX2F0dHI7CiAKLQlpbm9kZS0+aV9ibG9ja3MgPSAwOwogCWlub2RlLT5pX21hcHBpbmctPmFfb3BzID0gJnN5c2ZzX2FvcHM7CiAJaW5vZGUtPmlfbWFwcGluZy0+YmFja2luZ19kZXZfaW5mbyA9ICZzeXNmc19iYWNraW5nX2Rldl9pbmZvOwogCWlub2RlLT5pX29wID0gJnN5c2ZzX2lub2RlX29wZXJhdGlvbnM7CmRpZmYgLS1naXQgYS9mcy91Ymlmcy9LY29uZmlnIGIvZnMvdWJpZnMvS2NvbmZpZwppbmRleCA5MWNlZWRhLi5lMzViNTRkIDEwMDY0NAotLS0gYS9mcy91Ymlmcy9LY29uZmlnCisrKyBiL2ZzL3ViaWZzL0tjb25maWcKQEAgLTQwLDcgKzQwLDcgQEAKIAlkZXBlbmRzIG9uIFVCSUZTX0ZTCiAJZGVmYXVsdCB5CiAJaGVscAotCSAgWmxpYiBjb3ByZXNzZXMgYmV0dGVyIHRoZW4gTFpPIGJ1dCBpdCBpcyBzbG93ZXIuIFNheSAnWScgaWYgdW5zdXJlLgorCSAgWmxpYiBjb21wcmVzc2VzIGJldHRlciB0aGFuIExaTyBidXQgaXQgaXMgc2xvd2VyLiBTYXkgJ1knIGlmIHVuc3VyZS4KIAogIyBEZWJ1Z2dpbmctcmVsYXRlZCBzdHVmZgogY29uZmlnIFVCSUZTX0ZTX0RFQlVHCmRpZmYgLS1naXQgYS9mcy91Ymlmcy9idWRnZXQuYyBiL2ZzL3ViaWZzL2J1ZGdldC5jCmluZGV4IDBlNWU1NGQuLjE3NWY5YzUgMTAwNjQ0Ci0tLSBhL2ZzL3ViaWZzL2J1ZGdldC5jCisrKyBiL2ZzL3ViaWZzL2J1ZGdldC5jCkBAIC0xNDIsNyArMTQyLDcgQEAKICAqCiAgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGFuIG9wZXJhdGlvbiBjYW5ub3QgYmUgYnVkZ2V0ZWQgYmVjYXVzZSB0aGVyZQogICogaXMgc3VwcG9zZWRseSBubyBmcmVlIHNwYWNlLiBCdXQgaW4gbW9zdCBjYXNlcyB0aGVyZSBpcyBzb21lIGZyZWUgc3BhY2U6Ci0gKiAgIG8gYnVkZ2V0aW5nIGlzIHBlc3NpbWlzdGljLCBzbyBpdCBhbHdheXMgYnVkZ2V0cyBtb3JlIHRoZW4gaXQgaXMgYWN0dWFsbHkKKyAqICAgbyBidWRnZXRpbmcgaXMgcGVzc2ltaXN0aWMsIHNvIGl0IGFsd2F5cyBidWRnZXRzIG1vcmUgdGhhbiBpdCBpcyBhY3R1YWxseQogICogICAgIG5lZWRlZCwgc28gc2hyaW5raW5nIHRoZSBsaWFiaWxpdHkgaXMgb25lIHdheSB0byBtYWtlIGZyZWUgc3BhY2UgLSB0aGUKICAqICAgICBjYWNoZWQgZGF0YSB3aWxsIHRha2UgbGVzcyBzcGFjZSB0aGVuIGl0IHdhcyBidWRnZXRlZCBmb3I7CiAgKiAgIG8gR0MgbWF5IHR1cm4gc29tZSBkYXJrIHNwYWNlIGludG8gZnJlZSBzcGFjZSAoYnVkZ2V0aW5nIHRyZWF0cyBkYXJrIHNwYWNlCkBAIC02MDYsNyArNjA2LDcgQEAKICAqIEBjOiBVQklGUyBmaWxlLXN5c3RlbSBkZXNjcmlwdGlvbiBvYmplY3QKICAqCiAgKiBUaGlzIGZ1bmN0aW9uIGNvbnZlcnRzIGJ1ZGdldCB3aGljaCB3YXMgYWxsb2NhdGVkIGZvciBhIG5ldyBwYWdlIG9mIGRhdGEgdG8KLSAqIHRoZSBidWRnZXQgb2YgY2hhbmdpbmcgYW4gZXhpc3RpbmcgcGFnZSBvZiBkYXRhLiBUaGUgbGF0dGVyIGlzIHNtYWxsZXIgdGhlbgorICogdGhlIGJ1ZGdldCBvZiBjaGFuZ2luZyBhbiBleGlzdGluZyBwYWdlIG9mIGRhdGEuIFRoZSBsYXR0ZXIgaXMgc21hbGxlciB0aGFuCiAgKiB0aGUgZm9ybWVyLCBzbyB0aGlzIGZ1bmN0aW9uIG9ubHkgZG9lcyBzaW1wbGUgcmUtY2FsY3VsYXRpb24gYW5kIGRvZXMgbm90CiAgKiBpbnZvbHZlIGFueSB3cml0ZS1iYWNrLgogICovCmRpZmYgLS1naXQgYS9mcy91Ymlmcy9nYy5jIGIvZnMvdWJpZnMvZ2MuYwppbmRleCAwYmVmNjUwLi45ODMyZjlhIDEwMDY0NAotLS0gYS9mcy91Ymlmcy9nYy5jCisrKyBiL2ZzL3ViaWZzL2djLmMKQEAgLTQ1LDcgKzQ1LDcgQEAKICNkZWZpbmUgU01BTExfTk9ERV9XTSAgVUJJRlNfTUFYX0RFTlRfTk9ERV9TWgogCiAvKgotICogR0MgbWF5IG5lZWQgdG8gbW92ZSBtb3JlIHRoZW4gb25lIExFQiB0byBtYWtlIHByb2dyZXNzLiBUaGUgYmVsb3cgY29uc3RhbnRzCisgKiBHQyBtYXkgbmVlZCB0byBtb3ZlIG1vcmUgdGhhbiBvbmUgTEVCIHRvIG1ha2UgcHJvZ3Jlc3MuIFRoZSBiZWxvdyBjb25zdGFudHMKICAqIGRlZmluZSAic29mdCIgYW5kICJoYXJkIiBsaW1pdHMgb24gdGhlIG51bWJlciBvZiBMRUJzIHRoZSBnYXJiYWdlIGNvbGxlY3RvcgogICogbWF5IG1vdmUuCiAgKi8KZGlmZiAtLWdpdCBhL2ZzL3ViaWZzL2pvdXJuYWwuYyBiL2ZzL3ViaWZzL2pvdXJuYWwuYwppbmRleCAxMGFlMjViLi45YjdjNTRlIDEwMDY0NAotLS0gYS9mcy91Ymlmcy9qb3VybmFsLmMKKysrIGIvZnMvdWJpZnMvam91cm5hbC5jCkBAIC0xOTEsNyArMTkxLDcgQEAKIAlpZiAod2J1Zi0+bG51bSAhPSAtMSAmJiBhdmFpbCA+PSBsZW4pIHsKIAkJLyoKIAkJICogU29tZW9uZSBlbHNlIGhhcyBzd2l0Y2hlZCB0aGUgam91cm5hbCBoZWFkIGFuZCB3ZSBoYXZlCi0JCSAqIGVub3VnaCBzcGFjZSBub3cuIFRoaXMgaGFwcGVucyB3aGVuIG1vcmUgdGhlbiBvbmUgcHJvY2VzcyBpcworCQkgKiBlbm91Z2ggc3BhY2Ugbm93LiBUaGlzIGhhcHBlbnMgd2hlbiBtb3JlIHRoYW4gb25lIHByb2Nlc3MgaXMKIAkJICogdHJ5aW5nIHRvIHdyaXRlIHRvIHRoZSBzYW1lIGpvdXJuYWwgaGVhZCBhdCB0aGUgc2FtZSB0aW1lLgogCQkgKi8KIAkJZGJnX2pubCgicmV0dXJuIExFQiAlZCBiYWNrLCBhbHJlYWR5IGhhdmUgTEVCICVkOiVkIiwKZGlmZiAtLWdpdCBhL2ZzL3ViaWZzL3Nocmlua2VyLmMgYi9mcy91Ymlmcy9zaHJpbmtlci5jCmluZGV4IGYyNDg1MzMuLmU3YmFiNTIgMTAwNjQ0Ci0tLSBhL2ZzL3ViaWZzL3Nocmlua2VyLmMKKysrIGIvZnMvdWJpZnMvc2hyaW5rZXIuYwpAQCAtMTUxLDcgKzE1MSw3IEBACiAgKiBAY29udGVudGlvbjogaWYgYW55IGNvbnRlbnRpb24sIHRoaXMgaXMgc2V0IHRvICUxCiAgKgogICogVGhpcyBmdW5jdGlvbiB3YWxrcyB0aGUgbGlzdCBvZiBtb3VudGVkIFVCSUZTIGZpbGUtc3lzdGVtcyBhbmQgZnJlZXMgY2xlYW4KLSAqIHpub2RlcyB3aGljaCBhcmUgb2xkZXIgdGhlbiBAYWdlLCB1bnRpbCBhdCBsZWFzdCBAbnIgem5vZGVzIGFyZSBmcmVlZC4KKyAqIHpub2RlcyB3aGljaCBhcmUgb2xkZXIgdGhhbiBAYWdlLCB1bnRpbCBhdCBsZWFzdCBAbnIgem5vZGVzIGFyZSBmcmVlZC4KICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBmcmVlZCB6bm9kZXMuCiAgKi8KIHN0YXRpYyBpbnQgc2hyaW5rX3RuY190cmVlcyhpbnQgbnIsIGludCBhZ2UsIGludCAqY29udGVudGlvbikKZGlmZiAtLWdpdCBhL2ZzL3ViaWZzL3N1cGVyLmMgYi9mcy91Ymlmcy9zdXBlci5jCmluZGV4IDBkNzU2NGIuLjg5NTU2ZWUgMTAwNjQ0Ci0tLSBhL2ZzL3ViaWZzL3N1cGVyLmMKKysrIGIvZnMvdWJpZnMvc3VwZXIuYwpAQCAtNDMyLDEyICs0MzIsMTkgQEAKIAlpbnQgaSwgZXJyOwogCXN0cnVjdCB1Ymlmc19pbmZvICpjID0gc2ItPnNfZnNfaW5mbzsKIAlzdHJ1Y3Qgd3JpdGViYWNrX2NvbnRyb2wgd2JjID0gewotCQkuc3luY19tb2RlICAgPSB3YWl0ID8gV0JfU1lOQ19BTEwgOiBXQl9TWU5DX0hPTEQsCisJCS5zeW5jX21vZGUgICA9IHdhaXQgPyBXQl9TWU5DX0FMTCA6IFdCX1NZTkNfTk9ORSwKIAkJLnJhbmdlX3N0YXJ0ID0gMCwKIAkJLnJhbmdlX2VuZCAgID0gTExPTkdfTUFYLAogCQkubnJfdG9fd3JpdGUgPSBMT05HX01BWCwKIAl9OwogCisJLyoKKwkgKiBOb3RlIGJ5IGFrcG0gYWJvdXQgV0JfU1lOQ19OT05FIHVzZWQgYWJvdmU6IHplcm8gQHdhaXQgaXMganVzdCBhbgorCSAqIGFkdmlzb3J5IHRoaW5nIHRvIGhlbHAgdGhlIGZpbGUgc3lzdGVtIHNob3ZlIGxvdHMgb2YgZGF0YSBpbnRvIHRoZQorCSAqIHF1ZXVlcy4gSWYgc29tZSBnZXRzIG1pc3NlZCB0aGVuIGl0J2xsIGJlIHBpY2tlZCB1cCBvbiB0aGUgc2Vjb25kCisJICogJy0+c3luY19mcygpJyBjYWxsLCB3aXRoIG5vbi16ZXJvIEB3YWl0LgorCSAqLworCiAJaWYgKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKQogCQlyZXR1cm4gMDsKIApkaWZmIC0tZ2l0IGEvZnMveGF0dHIuYyBiL2ZzL3hhdHRyLmMKaW5kZXggNDY4Mzc3ZS4uMjM3ODA0YyAxMDA2NDQKLS0tIGEvZnMveGF0dHIuYworKysgYi9mcy94YXR0ci5jCkBAIC0xNzUsNyArMTc1LDcgQEAKIAlpZiAoZXJyb3IpCiAJCXJldHVybiBlcnJvcjsKIAllcnJvciA9IC1FT1BOT1RTVVBQOwotCWlmIChkLT5kX2lub2RlLT5pX29wICYmIGQtPmRfaW5vZGUtPmlfb3AtPmxpc3R4YXR0cikgeworCWlmIChkLT5kX2lub2RlLT5pX29wLT5saXN0eGF0dHIpIHsKIAkJZXJyb3IgPSBkLT5kX2lub2RlLT5pX29wLT5saXN0eGF0dHIoZCwgbGlzdCwgc2l6ZSk7CiAJfSBlbHNlIHsKIAkJZXJyb3IgPSBzZWN1cml0eV9pbm9kZV9saXN0c2VjdXJpdHkoZC0+ZF9pbm9kZSwgbGlzdCwgc2l6ZSk7CmRpZmYgLS1naXQgYS9mcy94ZnMvbGludXgtMi42L3hmc19zdXBlci5jIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfc3VwZXIuYwppbmRleCAzNmY2Y2M3Li5iZTg0NmQ2IDEwMDY0NAotLS0gYS9mcy94ZnMvbGludXgtMi42L3hmc19zdXBlci5jCisrKyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX3N1cGVyLmMKQEAgLTEzNDgsNyArMTM0OCw3IEBACiB7CiAJaW50CQkJcm9ubHkgPSAobXAtPm1fZmxhZ3MgJiBYRlNfTU9VTlRfUkRPTkxZKTsKIAotCS8qIEZhaWwgYSBtb3VudCB3aGVyZSB0aGUgbG9nYnVmIGlzIHNtYWxsZXIgdGhlbiB0aGUgbG9nIHN0cmlwZSAqLworCS8qIEZhaWwgYSBtb3VudCB3aGVyZSB0aGUgbG9nYnVmIGlzIHNtYWxsZXIgdGhhbiB0aGUgbG9nIHN0cmlwZSAqLwogCWlmICh4ZnNfc2JfdmVyc2lvbl9oYXNsb2d2MigmbXAtPm1fc2IpKSB7CiAJCWlmIChtcC0+bV9sb2dic2l6ZSA8PSAwICYmCiAJCSAgICBtcC0+bV9zYi5zYl9sb2dzdW5pdCA+IFhMT0dfQklHX1JFQ09SRF9CU0laRSkgewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL2FjbWFjcm9zLmggYi9pbmNsdWRlL2FjcGkvYWNtYWNyb3MuaAppbmRleCBhNTk3MjA3Li4xOTU0YzlkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FjcGkvYWNtYWNyb3MuaAorKysgYi9pbmNsdWRlL2FjcGkvYWNtYWNyb3MuaApAQCAtMzMzLDggKzMzMyw4IEBACiAjZGVmaW5lIEFDUElfSU5TRVJUX0JJVFModGFyZ2V0LCBtYXNrLCBzb3VyY2UpICAgICAgICAgIHRhcmdldCA9ICgodGFyZ2V0ICYgKH4obWFzaykpKSB8IChzb3VyY2UgJiBtYXNrKSkKIAogLyoKLSAqIEFuIHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlIGNhbiBhcHBlYXIgaW4gc29tZSBjb250ZXh0cwotICogd2hlcmUgYSBwb2ludGVyIHRvIGFuIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgY2FuIGFsc28KKyAqIEEgc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgY2FuIGFwcGVhciBpbiBzb21lIGNvbnRleHRzCisgKiB3aGVyZSBhIHBvaW50ZXIgdG8gYSB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0IGNhbiBhbHNvCiAgKiBhcHBlYXIuIFRoaXMgbWFjcm8gaXMgdXNlZCB0byBkaXN0aW5ndWlzaCB0aGVtLgogICoKICAqIFRoZSAiRGVzY3JpcHRvciIgZmllbGQgaXMgdGhlIGZpcnN0IGZpZWxkIGluIGJvdGggc3RydWN0dXJlcy4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9hY3R5cGVzLmggYi9pbmNsdWRlL2FjcGkvYWN0eXBlcy5oCmluZGV4IDcyMjAzNjEuLjgyMjJlOGQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9hY3R5cGVzLmgKKysrIGIvaW5jbHVkZS9hY3BpL2FjdHlwZXMuaApAQCAtNDY3LDcgKzQ2Nyw3IEBACiAKIC8qCiAgKiBUaGVzZSBhcmUgc3BlY2lhbCBvYmplY3QgdHlwZXMgdGhhdCBuZXZlciBhcHBlYXIgaW4KLSAqIGEgTmFtZXNwYWNlIG5vZGUsIG9ubHkgaW4gYW4gdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdAorICogYSBOYW1lc3BhY2Ugbm9kZSwgb25seSBpbiBhIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QKICAqLwogI2RlZmluZSBBQ1BJX1RZUEVfTE9DQUxfRVhUUkEgICAgICAgICAgIDB4MUMKICNkZWZpbmUgQUNQSV9UWVBFX0xPQ0FMX0RBVEEgICAgICAgICAgICAweDFECmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1mcnYvS2J1aWxkIGIvaW5jbHVkZS9hc20tZnJ2L0tidWlsZAppbmRleCAwZjg5NTZkLi4xZjQ0ZTdjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1mcnYvS2J1aWxkCisrKyBiL2luY2x1ZGUvYXNtLWZydi9LYnVpbGQKQEAgLTMsMyArMyw0IEBACiBoZWFkZXIteSArPSByZWdpc3RlcnMuaAogCiB1bmlmZGVmLXkgKz0gdGVybWlvcy5oCit1bmlmZGVmLXkgKz0gc3dhYi5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1mcnYvYXRvbWljLmggYi9pbmNsdWRlL2FzbS1mcnYvYXRvbWljLmgKaW5kZXggNDZkNjk2Yi4uMjk2YzM1YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tZnJ2L2F0b21pYy5oCisrKyBiL2luY2x1ZGUvYXNtLWZydi9hdG9taWMuaApAQCAtMzUsMTAgKzM1LDYgQEAKICNkZWZpbmUgc21wX21iX19iZWZvcmVfYXRvbWljX2luYygpCWJhcnJpZXIoKQogI2RlZmluZSBzbXBfbWJfX2FmdGVyX2F0b21pY19pbmMoKQliYXJyaWVyKCkKIAotdHlwZWRlZiBzdHJ1Y3QgewotCWludCBjb3VudGVyOwotfSBhdG9taWNfdDsKLQogI2RlZmluZSBBVE9NSUNfSU5JVChpKQkJeyAoaSkgfQogI2RlZmluZSBhdG9taWNfcmVhZCh2KQkJKCh2KS0+Y291bnRlcikKICNkZWZpbmUgYXRvbWljX3NldCh2LCBpKQkoKCh2KS0+Y291bnRlcikgPSAoaSkpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1mcnYvYnl0ZW9yZGVyLmggYi9pbmNsdWRlL2FzbS1mcnYvYnl0ZW9yZGVyLmgKaW5kZXggNDExYmVjMy4uMTE4N2U1MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tZnJ2L2J5dGVvcmRlci5oCisrKyBiL2luY2x1ZGUvYXNtLWZydi9ieXRlb3JkZXIuaApAQCAtMSwxMyArMSw3IEBACiAjaWZuZGVmIF9BU01fQllURU9SREVSX0gKICNkZWZpbmUgX0FTTV9CWVRFT1JERVJfSAogCi0jaW5jbHVkZSA8YXNtL3R5cGVzLmg+Ci0KLSNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAhZGVmaW5lZChfX1NUUklDVF9BTlNJX18pIHx8IGRlZmluZWQoX19LRVJORUxfXykKLSMgIGRlZmluZSBfX0JZVEVPUkRFUl9IQVNfVTY0X18KLSMgIGRlZmluZSBfX1NXQUJfNjRfVEhSVV8zMl9fCi0jZW5kaWYKLQorI2luY2x1ZGUgPGFzbS9zd2FiLmg+CiAjaW5jbHVkZSA8bGludXgvYnl0ZW9yZGVyL2JpZ19lbmRpYW4uaD4KIAogI2VuZGlmIC8qIF9BU01fQllURU9SREVSX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWZydi9zd2FiLmggYi9pbmNsdWRlL2FzbS1mcnYvc3dhYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmYjMzOTYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1mcnYvc3dhYi5oCkBAIC0wLDAgKzEsMTAgQEAKKyNpZm5kZWYgX0FTTV9TV0FCX0gKKyNkZWZpbmUgX0FTTV9TV0FCX0gKKworI2luY2x1ZGUgPGFzbS90eXBlcy5oPgorCisjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgIWRlZmluZWQoX19TVFJJQ1RfQU5TSV9fKSB8fCBkZWZpbmVkKF9fS0VSTkVMX18pCisjICBkZWZpbmUgX19TV0FCXzY0X1RIUlVfMzJfXworI2VuZGlmCisKKyNlbmRpZiAvKiBfQVNNX1NXQUJfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tZ2VuZXJpYy9idWcuaCBiL2luY2x1ZGUvYXNtLWdlbmVyaWMvYnVnLmgKaW5kZXggOGFmMjc2My4uMzdiODJjYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tZ2VuZXJpYy9idWcuaAorKysgYi9pbmNsdWRlL2FzbS1nZW5lcmljL2J1Zy5oCkBAIC0yOCw2ICsyOCwxNyBAQAogI2RlZmluZSBCVUdGTEFHX1dBUk5JTkcJKDE8PDApCiAjZW5kaWYJLyogQ09ORklHX0dFTkVSSUNfQlVHICovCiAKKy8qCisgKiBEb24ndCB1c2UgQlVHKCkgb3IgQlVHX09OKCkgdW5sZXNzIHRoZXJlJ3MgcmVhbGx5IG5vIHdheSBvdXQ7IG9uZQorICogZXhhbXBsZSBtaWdodCBiZSBkZXRlY3RpbmcgZGF0YSBzdHJ1Y3R1cmUgY29ycnVwdGlvbiBpbiB0aGUgbWlkZGxlCisgKiBvZiBhbiBvcGVyYXRpb24gdGhhdCBjYW4ndCBiZSBiYWNrZWQgb3V0IG9mLiAgSWYgdGhlIChzdWIpc3lzdGVtCisgKiBjYW4gc29tZWhvdyBjb250aW51ZSBvcGVyYXRpbmcsIHBlcmhhcHMgd2l0aCByZWR1Y2VkIGZ1bmN0aW9uYWxpdHksCisgKiBpdCdzIHByb2JhYmx5IG5vdCBCVUctd29ydGh5LgorICoKKyAqIElmIHlvdSdyZSB0ZW1wdGVkIHRvIEJVRygpLCB0aGluayBhZ2FpbjogIGlzIGNvbXBsZXRlbHkgZ2l2aW5nIHVwCisgKiByZWFsbHkgdGhlICpvbmx5KiBzb2x1dGlvbj8gIFRoZXJlIGFyZSB1c3VhbGx5IGJldHRlciBvcHRpb25zLCB3aGVyZQorICogdXNlcnMgZG9uJ3QgbmVlZCB0byByZWJvb3QgQVNBUCBhbmQgY2FuIG1vc3RseSBzaHV0IGRvd24gY2xlYW5seS4KKyAqLwogI2lmbmRlZiBIQVZFX0FSQ0hfQlVHCiAjZGVmaW5lIEJVRygpIGRvIHsgXAogCXByaW50aygiQlVHOiBmYWlsdXJlIGF0ICVzOiVkLyVzKCkhXG4iLCBfX0ZJTEVfXywgX19MSU5FX18sIF9fZnVuY19fKTsgXApAQCAtMzksNiArNTAsMTIgQEAKICNkZWZpbmUgQlVHX09OKGNvbmRpdGlvbikgZG8geyBpZiAodW5saWtlbHkoY29uZGl0aW9uKSkgQlVHKCk7IH0gd2hpbGUoMCkKICNlbmRpZgogCisvKgorICogV0FSTigpLCBXQVJOX09OKCksIFdBUk5fT05fT05DRSwgYW5kIHNvIG9uIGNhbiBiZSB1c2VkIHRvIHJlcG9ydAorICogc2lnbmlmaWNhbnQgaXNzdWVzIHRoYXQgbmVlZCBwcm9tcHQgYXR0ZW50aW9uIGlmIHRoZXkgc2hvdWxkIGV2ZXIKKyAqIGFwcGVhciBhdCBydW50aW1lLiAgVXNlIHRoZSB2ZXJzaW9ucyB3aXRoIHByaW50ayBmb3JtYXQgc3RyaW5ncworICogdG8gcHJvdmlkZSBiZXR0ZXIgZGlhZ25vc3RpY3MuCisgKi8KICNpZm5kZWYgX19XQVJOCiAjaWZuZGVmIF9fQVNTRU1CTFlfXwogZXh0ZXJuIHZvaWQgd2Fybl9zbG93cGF0aChjb25zdCBjaGFyICpmaWxlLCBjb25zdCBpbnQgbGluZSwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWdlbmVyaWMvbG9jYWwuaCBiL2luY2x1ZGUvYXNtLWdlbmVyaWMvbG9jYWwuaAppbmRleCAzM2Q3ZDA0Li5kYmQ2MTUwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1nZW5lcmljL2xvY2FsLmgKKysrIGIvaW5jbHVkZS9hc20tZ2VuZXJpYy9sb2NhbC5oCkBAIC0yLDcgKzIsNiBAQAogI2RlZmluZSBfQVNNX0dFTkVSSUNfTE9DQUxfSAogCiAjaW5jbHVkZSA8bGludXgvcGVyY3B1Lmg+Ci0jaW5jbHVkZSA8bGludXgvaGFyZGlycS5oPgogI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KICNpbmNsdWRlIDxhc20vdHlwZXMuaD4KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tZ2VuZXJpYy9tZW1vcnlfbW9kZWwuaCBiL2luY2x1ZGUvYXNtLWdlbmVyaWMvbWVtb3J5X21vZGVsLmgKaW5kZXggMzZmYTI4Ni4uNGM4ZDBhZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tZ2VuZXJpYy9tZW1vcnlfbW9kZWwuaAorKysgYi9pbmNsdWRlL2FzbS1nZW5lcmljL21lbW9yeV9tb2RlbC5oCkBAIC02OSwxNSArNjksOCBAQAogfSkKICNlbmRpZiAvKiBDT05GSUdfRkxBVE1FTS9ESVNDT05USUdNRU0vU1BBUlNFTUVNICovCiAKLSNpZmRlZiBDT05GSUdfT1VUX09GX0xJTkVfUEZOX1RPX1BBR0UKLXN0cnVjdCBwYWdlOwotLyogdGhpcyBpcyB1c2VmdWwgd2hlbiBpbmxpbmVkIHBmbl90b19wYWdlIGlzIHRvbyBiaWcgKi8KLWV4dGVybiBzdHJ1Y3QgcGFnZSAqcGZuX3RvX3BhZ2UodW5zaWduZWQgbG9uZyBwZm4pOwotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgcGFnZV90b19wZm4oc3RydWN0IHBhZ2UgKnBhZ2UpOwotI2Vsc2UKICNkZWZpbmUgcGFnZV90b19wZm4gX19wYWdlX3RvX3BmbgogI2RlZmluZSBwZm5fdG9fcGFnZSBfX3Bmbl90b19wYWdlCi0jZW5kaWYgLyogQ09ORklHX09VVF9PRl9MSU5FX1BGTl9UT19QQUdFICovCiAKICNlbmRpZiAvKiBfX0FTU0VNQkxZX18gKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTMyci9LYnVpbGQgYi9pbmNsdWRlL2FzbS1tMzJyL0tidWlsZAppbmRleCBjNjhlMTY4Li4yN2IxMDhhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1tMzJyL0tidWlsZAorKysgYi9pbmNsdWRlL2FzbS1tMzJyL0tidWlsZApAQCAtMSArMSwyIEBACiBpbmNsdWRlIGluY2x1ZGUvYXNtLWdlbmVyaWMvS2J1aWxkLmFzbQordW5pZmRlZi15ICs9IHN3YWIuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTMyci9hdG9taWMuaCBiL2luY2x1ZGUvYXNtLW0zMnIvYXRvbWljLmgKaW5kZXggM2EzOGZmZS4uMmVlZDMwZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbTMyci9hdG9taWMuaAorKysgYi9pbmNsdWRlL2FzbS1tMzJyL2F0b21pYy5oCkBAIC05LDYgKzksNyBAQAogICogICAgQ29weXJpZ2h0IChDKSAyMDA0ICBIaXJva2F6dSBUYWthdGEgPHRha2F0YSBhdCBsaW51eC1tMzJyLm9yZz4KICAqLwogCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vYXNzZW1ibGVyLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogCkBAIC0xNywxMyArMTgsNiBAQAogICogcmVzb3VyY2UgY291bnRpbmcgZXRjLi4KICAqLwogCi0vKgotICogTWFrZSBzdXJlIGdjYyBkb2Vzbid0IHRyeSB0byBiZSBjbGV2ZXIgYW5kIG1vdmUgdGhpbmdzIGFyb3VuZAotICogb24gdXMuIFdlIG5lZWQgdG8gdXNlIF9leGFjdGx5XyB0aGUgYWRkcmVzcyB0aGUgdXNlciBnYXZlIHVzLAotICogbm90IHNvbWUgYWxpYXMgdGhhdCBjb250YWlucyB0aGUgc2FtZSBpbmZvcm1hdGlvbi4KLSAqLwotdHlwZWRlZiBzdHJ1Y3QgeyB2b2xhdGlsZSBpbnQgY291bnRlcjsgfSBhdG9taWNfdDsKLQogI2RlZmluZSBBVE9NSUNfSU5JVChpKQl7IChpKSB9CiAKIC8qKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTMyci9ieXRlb3JkZXIuaCBiL2luY2x1ZGUvYXNtLW0zMnIvYnl0ZW9yZGVyLmgKaW5kZXggMTBiMmMxZC4uNjFmZjljZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbTMyci9ieXRlb3JkZXIuaAorKysgYi9pbmNsdWRlL2FzbS1tMzJyL2J5dGVvcmRlci5oCkBAIC0xLDEyICsxLDcgQEAKICNpZm5kZWYgX0FTTV9NMzJSX0JZVEVPUkRFUl9ICiAjZGVmaW5lIF9BU01fTTMyUl9CWVRFT1JERVJfSAogCi0jaW5jbHVkZSA8YXNtL3R5cGVzLmg+Ci0KLSNpZiAhZGVmaW5lZChfX1NUUklDVF9BTlNJX18pIHx8IGRlZmluZWQoX19LRVJORUxfXykKLSMgIGRlZmluZSBfX0JZVEVPUkRFUl9IQVNfVTY0X18KLSMgIGRlZmluZSBfX1NXQUJfNjRfVEhSVV8zMl9fCi0jZW5kaWYKKyNpbmNsdWRlIDxhc20vc3dhYi5oPgogCiAjaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU5fXykKICMgIGluY2x1ZGUgPGxpbnV4L2J5dGVvcmRlci9saXR0bGVfZW5kaWFuLmg+CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tMzJyL3N3YWIuaCBiL2luY2x1ZGUvYXNtLW0zMnIvc3dhYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3OTczZTEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1tMzJyL3N3YWIuaApAQCAtMCwwICsxLDEwIEBACisjaWZuZGVmIF9BU01fTTMyUl9TV0FCX0gKKyNkZWZpbmUgX0FTTV9NMzJSX1NXQUJfSAorCisjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CisKKyNpZiAhZGVmaW5lZChfX1NUUklDVF9BTlNJX18pIHx8IGRlZmluZWQoX19LRVJORUxfXykKKyMgIGRlZmluZSBfX1NXQUJfNjRfVEhSVV8zMl9fCisjZW5kaWYKKworI2VuZGlmIC8qIF9BU01fTTMyUl9TV0FCX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW02OGsvS2J1aWxkIGIvaW5jbHVkZS9hc20tbTY4ay9LYnVpbGQKaW5kZXggMWE5MjJmYS4uNTJmZDk2YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbTY4ay9LYnVpbGQKKysrIGIvaW5jbHVkZS9hc20tbTY4ay9LYnVpbGQKQEAgLTEsMiArMSwzIEBACiBpbmNsdWRlIGluY2x1ZGUvYXNtLWdlbmVyaWMvS2J1aWxkLmFzbQogaGVhZGVyLXkgKz0gY2FjaGVjdGwuaAordW5pZmRlZi15ICs9IHN3YWIuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTY4ay9hdG9taWMuaCBiL2luY2x1ZGUvYXNtLW02OGsvYXRvbWljLmgKaW5kZXggNDkxNTI5NC4uZWIwYWI5ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbTY4ay9hdG9taWMuaAorKysgYi9pbmNsdWRlL2FzbS1tNjhrL2F0b21pYy5oCkBAIC0xLDcgKzEsNyBAQAogI2lmbmRlZiBfX0FSQ0hfTTY4S19BVE9NSUNfXwogI2RlZmluZSBfX0FSQ0hfTTY4S19BVE9NSUNfXwogCi0KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KIAogLyoKQEAgLTEzLDcgKzEzLDYgQEAKICAqIFdlIGRvIG5vdCBoYXZlIFNNUCBtNjhrIHN5c3RlbXMsIHNvIHdlIGRvbid0IGhhdmUgdG8gZGVhbCB3aXRoIHRoYXQuCiAgKi8KIAotdHlwZWRlZiBzdHJ1Y3QgeyBpbnQgY291bnRlcjsgfSBhdG9taWNfdDsKICNkZWZpbmUgQVRPTUlDX0lOSVQoaSkJeyAoaSkgfQogCiAjZGVmaW5lIGF0b21pY19yZWFkKHYpCQkoKHYpLT5jb3VudGVyKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTY4ay9ieXRlb3JkZXIuaCBiL2luY2x1ZGUvYXNtLW02OGsvYnl0ZW9yZGVyLmgKaW5kZXggYjM1NGFjZC4uMzAwODY2NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbTY4ay9ieXRlb3JkZXIuaAorKysgYi9pbmNsdWRlL2FzbS1tNjhrL2J5dGVvcmRlci5oCkBAIC0xLDE5ICsxLDcgQEAKICNpZm5kZWYgX002OEtfQllURU9SREVSX0gKICNkZWZpbmUgX002OEtfQllURU9SREVSX0gKIAotI2luY2x1ZGUgPGFzbS90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+Ci0KLSNkZWZpbmUgX19CSUdfRU5ESUFOCi0jZGVmaW5lIF9fU1dBQl82NF9USFJVXzMyX18KLQotc3RhdGljIGlubGluZSBfX2F0dHJpYnV0ZV9jb25zdF9fIF9fdTMyIF9fYXJjaF9zd2FiMzIoX191MzIgdmFsKQotewotCV9fYXNtX18oInJvbHcgIzgsJTA7IHN3YXAgJTA7IHJvbHcgIzgsJTAiIDogIj1kIiAodmFsKSA6ICIwIiAodmFsKSk7Ci0JcmV0dXJuIHZhbDsKLX0KLSNkZWZpbmUgX19hcmNoX3N3YWIzMiBfX2FyY2hfc3dhYjMyCi0KLSNpbmNsdWRlIDxsaW51eC9ieXRlb3JkZXIuaD4KKyNpbmNsdWRlIDxhc20vc3dhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2J5dGVvcmRlci9iaWdfZW5kaWFuLmg+CiAKICNlbmRpZiAvKiBfTTY4S19CWVRFT1JERVJfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTY4ay9zd2FiLmggYi9pbmNsdWRlL2FzbS1tNjhrL3N3YWIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjIxZTMwCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tbTY4ay9zd2FiLmgKQEAgLTAsMCArMSwxNiBAQAorI2lmbmRlZiBfTTY4S19TV0FCX0gKKyNkZWZpbmUgX002OEtfU1dBQl9ICisKKyNpbmNsdWRlIDxhc20vdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgorCisjZGVmaW5lIF9fU1dBQl82NF9USFJVXzMyX18KKworc3RhdGljIGlubGluZSBfX2F0dHJpYnV0ZV9jb25zdF9fIF9fdTMyIF9fYXJjaF9zd2FiMzIoX191MzIgdmFsKQoreworCV9fYXNtX18oInJvbHcgIzgsJTA7IHN3YXAgJTA7IHJvbHcgIzgsJTAiIDogIj1kIiAodmFsKSA6ICIwIiAodmFsKSk7CisJcmV0dXJuIHZhbDsKK30KKyNkZWZpbmUgX19hcmNoX3N3YWIzMiBfX2FyY2hfc3dhYjMyCisKKyNlbmRpZiAvKiBfTTY4S19TV0FCX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1uMTAzMDAvS2J1aWxkIGIvaW5jbHVkZS9hc20tbW4xMDMwMC9LYnVpbGQKaW5kZXggYzY4ZTE2OC4uMjdiMTA4YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbW4xMDMwMC9LYnVpbGQKKysrIGIvaW5jbHVkZS9hc20tbW4xMDMwMC9LYnVpbGQKQEAgLTEgKzEsMiBAQAogaW5jbHVkZSBpbmNsdWRlL2FzbS1nZW5lcmljL0tidWlsZC5hc20KK3VuaWZkZWYteSArPSBzd2FiLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1uMTAzMDAvYXRvbWljLmggYi9pbmNsdWRlL2FzbS1tbjEwMzAwL2F0b21pYy5oCmluZGV4IDI3Yzk2OTAuLmJjMDY0ODIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1uMTAzMDAvYXRvbWljLmgKKysrIGIvaW5jbHVkZS9hc20tbW4xMDMwMC9hdG9taWMuaApAQCAtMjAsMTUgKzIwLDYgQEAKICAqIHJlc291cmNlIGNvdW50aW5nIGV0Yy4uCiAgKi8KIAotLyoKLSAqIE1ha2Ugc3VyZSBnY2MgZG9lc24ndCB0cnkgdG8gYmUgY2xldmVyIGFuZCBtb3ZlIHRoaW5ncyBhcm91bmQKLSAqIG9uIHVzLiBXZSBuZWVkIHRvIHVzZSBfZXhhY3RseV8gdGhlIGFkZHJlc3MgdGhlIHVzZXIgZ2F2ZSB1cywKLSAqIG5vdCBzb21lIGFsaWFzIHRoYXQgY29udGFpbnMgdGhlIHNhbWUgaW5mb3JtYXRpb24uCi0gKi8KLXR5cGVkZWYgc3RydWN0IHsKLQlpbnQJY291bnRlcjsKLX0gYXRvbWljX3Q7Ci0KICNkZWZpbmUgQVRPTUlDX0lOSVQoaSkJeyAoaSkgfQogCiAjaWZkZWYgX19LRVJORUxfXwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbW4xMDMwMC9ieXRlb3JkZXIuaCBiL2luY2x1ZGUvYXNtLW1uMTAzMDAvYnl0ZW9yZGVyLmgKaW5kZXggM2M5OTNjYy4uNDViMThkZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbW4xMDMwMC9ieXRlb3JkZXIuaAorKysgYi9pbmNsdWRlL2FzbS1tbjEwMzAwL2J5dGVvcmRlci5oCkBAIC0xLDQ2ICsxLDcgQEAKLS8qIE1OMTAzMDAgQnl0ZS1vcmRlciBwcmltaXRpdmUgY29uc3RydWN0aW9uCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5jZQotICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCi0gKiAyIG9mIHRoZSBMaWNlbmNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICovCiAjaWZuZGVmIF9BU01fQllURU9SREVSX0gKICNkZWZpbmUgX0FTTV9CWVRFT1JERVJfSAogCi0jaW5jbHVkZSA8YXNtL3R5cGVzLmg+Ci0KLSNpZmRlZiBfX0dOVUNfXwotCi1zdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX18oKGNvbnN0KSkKLV9fdTMyIF9fX2FyY2hfX3N3YWIzMihfX3UzMiB4KQotewotCV9fdTMyIHJldDsKLQlhc20oInN3YXAgJTEsJTAiIDogIj1yIiAocmV0KSA6ICJyIiAoeCkpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgX19hdHRyaWJ1dGVfXygoY29uc3QpKQotX191MTYgX19fYXJjaF9fc3dhYjE2KF9fdTE2IHgpCi17Ci0JX191MTYgcmV0OwotCWFzbSgic3dhcGggJTEsJTAiIDogIj1yIiAocmV0KSA6ICJyIiAoeCkpOwotCXJldHVybiByZXQ7Ci19Ci0KLSNkZWZpbmUgX19hcmNoX19zd2FiMzIoeCkgX19fYXJjaF9fc3dhYjMyKHgpCi0jZGVmaW5lIF9fYXJjaF9fc3dhYjE2KHgpIF9fX2FyY2hfX3N3YWIxNih4KQotCi0jaWYgIWRlZmluZWQoX19TVFJJQ1RfQU5TSV9fKSB8fCBkZWZpbmVkKF9fS0VSTkVMX18pCi0jICBkZWZpbmUgX19CWVRFT1JERVJfSEFTX1U2NF9fCi0jICBkZWZpbmUgX19TV0FCXzY0X1RIUlVfMzJfXwotI2VuZGlmCi0KLSNlbmRpZiAvKiBfX0dOVUNfXyAqLwotCisjaW5jbHVkZSA8YXNtL3N3YWIuaD4KICNpbmNsdWRlIDxsaW51eC9ieXRlb3JkZXIvbGl0dGxlX2VuZGlhbi5oPgogCiAjZW5kaWYgLyogX0FTTV9CWVRFT1JERVJfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbW4xMDMwMC9zd2FiLmggYi9pbmNsdWRlL2FzbS1tbjEwMzAwL3N3YWIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTA0ZDFiCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tbW4xMDMwMC9zd2FiLmgKQEAgLTAsMCArMSw0MiBAQAorLyogTU4xMDMwMCBCeXRlLW9yZGVyIHByaW1pdGl2ZSBjb25zdHJ1Y3Rpb24KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbmNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2VuY2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKyNpZm5kZWYgX0FTTV9TV0FCX0gKKyNkZWZpbmUgX0FTTV9TV0FCX0gKKworI2luY2x1ZGUgPGFzbS90eXBlcy5oPgorCisjaWZkZWYgX19HTlVDX18KKworc3RhdGljIGlubGluZSBfX2F0dHJpYnV0ZV9fKChjb25zdCkpCitfX3UzMiBfX2FyY2hfc3dhYjMyKF9fdTMyIHgpCit7CisJX191MzIgcmV0OworCWFzbSgic3dhcCAlMSwlMCIgOiAiPXIiIChyZXQpIDogInIiICh4KSk7CisJcmV0dXJuIHJldDsKK30KKyNkZWZpbmUgX19hcmNoX3N3YWIzMiBfX2FyY2hfc3dhYjMyCisKK3N0YXRpYyBpbmxpbmUgX19hdHRyaWJ1dGVfXygoY29uc3QpKQorX191MTYgX19hcmNoX3N3YWIxNihfX3UxNiB4KQoreworCV9fdTE2IHJldDsKKwlhc20oInN3YXBoICUxLCUwIiA6ICI9ciIgKHJldCkgOiAiciIgKHgpKTsKKwlyZXR1cm4gcmV0OworfQorI2RlZmluZSBfX2FyY2hfc3dhYjMyIF9fYXJjaF9zd2FiMzIKKworI2lmICFkZWZpbmVkKF9fU1RSSUNUX0FOU0lfXykgfHwgZGVmaW5lZChfX0tFUk5FTF9fKQorIyAgZGVmaW5lIF9fU1dBQl82NF9USFJVXzMyX18KKyNlbmRpZgorCisjZW5kaWYgLyogX19HTlVDX18gKi8KKworI2VuZGlmIC8qIF9BU01fU1dBQl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvS2J1aWxkIGIvaW5jbHVkZS9hc20teHRlbnNhL0tidWlsZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzY4ZTE2OC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FzbS14dGVuc2EvS2J1aWxkCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotaW5jbHVkZSBpbmNsdWRlL2FzbS1nZW5lcmljL0tidWlsZC5hc20KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9hc21tYWNyby5oIGIvaW5jbHVkZS9hc20teHRlbnNhL2FzbW1hY3JvLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2OTE1Y2EuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hc20teHRlbnNhL2FzbW1hY3JvLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNTMgKzAsMCBAQAotLyoKLSAqIGluY2x1ZGUvYXNtLXh0ZW5zYS9hc21tYWNyby5oCi0gKgotICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKLSAqIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDA1IFRlbnNpbGljYSBJbmMuCi0gKi8KLQotI2lmbmRlZiBfWFRFTlNBX0FTTU1BQ1JPX0gKLSNkZWZpbmUgX1hURU5TQV9BU01NQUNST19ICi0KLSNpbmNsdWRlIDxhc20vdmFyaWFudC9jb3JlLmg+Ci0KLS8qCi0gKiBTb21lIGxpdHRsZSBoZWxwZXJzIGZvciBsb29wcy4gVXNlIHplcm8tb3ZlcmhlYWQtbG9vcHMKLSAqIHdoZXJlIGFwcGxpY2FibGUgYW5kIGlmIHN1cHBvcnRlZCBieSB0aGUgcHJvY2Vzc29yLgotICoKLSAqIF9fbG9vcGkgYXIsIGF0LCBzaXplLCBpbmMKLSAqICAgICAgICAgYXIJcmVnaXN0ZXIgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgc3RhcnQgYWRkcmVzcwotICoJICAgYXQJc2NyYXRjaCByZWdpc3RlciB1c2VkIGJ5IG1hY3JvCi0gKgkgICBzaXplCXNpemUgaW1tZWRpYXRlIHZhbHVlCi0gKgkgICBpbmMJaW5jcmVtZW50Ci0gKgotICogX19sb29wcyBhciwgYXMsIGF0LCBpbmNfbG9nMlssIG1hc2tfbG9nMl1bLCBjb25kXVssIG5jb25kXQotICoJICAgYXIJcmVnaXN0ZXIgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgc3RhcnQgYWRkcmVzcwotICoJICAgYXMJcmVnaXN0ZXIgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgc2l6ZQotICoJICAgYXQJc2NyYXRjaCByZWdpc3RlciB1c2UgYnkgbWFjcm8KLSAqCSAgIGluY19sb2cyCWluY3JlbWVudCBbaW4gbG9nMl0KLSAqCSAgIG1hc2tfbG9nMgltYXNrIFtpbiBsb2cyXQotICoJICAgY29uZAkJdHJ1ZSBjb25kaXRpb24gKHVzZWQgaW4gbG9vcCdjb25kJykKLSAqCSAgIG5jb25kCWZhbHNlIGNvbmRpdGlvbiAodXNlZCBpbiBiJ25jb25kJykKLSAqCi0gKiBfX2xvb3AgIGFzCi0gKgkgICByZXN0YXJ0IGxvb3AuICdhcycgcmVnaXN0ZXIgbXVzdCBub3QgaGF2ZSBiZWVuIG1vZGlmaWVkIQotICoKLSAqIF9fZW5kbGEgYXIsIGF0LCBpbmNyCi0gKgkgICBhcglzdGFydCBhZGRyZXNzIChtb2RpZmllZCkKLSAqCSAgIGFzCXNjcmF0Y2ggcmVnaXN0ZXIgdXNlZCBieSBtYWNybwotICoJICAgaW5jCWluY3JlbWVudAotICovCi0KLS8qCi0gKiBsb29wIGZvciBnaXZlbiBzaXplIGFzIGltbWVkaWF0ZQotICovCi0KLQkubWFjcm8JX19sb29waSBhciwgYXQsIHNpemUsIGluY3IKLQotI2lmIFhDSEFMX0hBVkVfTE9PUFMKLQkJbW92aQlcYXQsICgoXHNpemUgKyBcaW5jciAtIDEpIC8gKFxpbmNyKSkKLQkJbG9vcAlcYXQsIDk5ZgotI2Vsc2UKLQkJYWRkaQlcYXQsIFxhciwgXHNpemUKLQkJOTg6Ci0jZW5kaWYKLQotCS5lbmRtCi0KLS8qCi0gKiBsb29wIGZvciBnaXZlbiBzaXplIGluIHJlZ2lzdGVyCi0gKi8KLQotCS5tYWNybwlfX2xvb3BzCWFyLCBhcywgYXQsIGluY3JfbG9nMiwgbWFza19sb2cyLCBjb25kLCBuY29uZAotCi0jaWYgWENIQUxfSEFWRV9MT09QUwotCQkuaWZndCBcaW5jcl9sb2cyIC0gMQotCQkJYWRkaQlcYXQsIFxhcywgKDEgPDwgXGluY3JfbG9nMikgLSAxCi0JCQkuaWZuYyBcbWFza19sb2cyLAotCQkJCWV4dHVpCVxhdCwgXGF0LCBcaW5jcl9sb2cyLCBcbWFza19sb2cyCi0JCQkuZWxzZQotCQkJCXNybGkJXGF0LCBcYXQsIFxpbmNyX2xvZzIKLQkJCS5lbmRpZgotCQkuZW5kaWYKLQkJbG9vcFxjb25kCVxhdCwgOTlmCi0jZWxzZQotCQkuaWZuYyBcbWFza19sb2cyLAotCQkJZXh0dWkJXGF0LCBcYXMsIFxpbmNyX2xvZzIsIFxtYXNrX2xvZzIKLQkJLmVsc2UKLQkJCS5pZm5jIFxuY29uZCwKLQkJCQlzcmxpCVxhdCwgXGFzLCBcaW5jcl9sb2cyCi0JCQkuZW5kaWYKLQkJLmVuZGlmCi0JCS5pZm5jIFxuY29uZCwKLQkJCWJcbmNvbmQJXGF0LCA5OWYKLQotCQkuZW5kaWYKLQkJLmlmbmMgXG1hc2tfbG9nMiwKLQkJCXNsbGkJXGF0LCBcYXQsIFxpbmNyX2xvZzIKLQkJCWFkZAlcYXQsIFxhciwgXGF0Ci0JCS5lbHNlCi0JCQlhZGQJXGF0LCBcYXIsIFxhcwotCQkuZW5kaWYKLSNlbmRpZgotCQk5ODoKLQotCS5lbmRtCi0KLS8qCi0gKiBsb29wIGZyb20gYXIgdG8gYXgKLSAqLwotCi0JLm1hY3JvCV9fbG9vcHQJYXIsIGFzLCBhdCwgaW5jcl9sb2cyCi0KLSNpZiBYQ0hBTF9IQVZFX0xPT1BTCi0JCXN1YglcYXQsIFxhcywgXGFyCi0JCS5pZmd0CVxpbmNyX2xvZzIgLSAxCi0JCQlhZGRpCVxhdCwgXGF0LCAoMSA8PCBcaW5jcl9sb2cyKSAtIDEKLQkJCXNybGkJXGF0LCBcYXQsIFxpbmNyX2xvZzIKLQkJLmVuZGlmCi0JCWxvb3AJXGF0LCA5OWYKLSNlbHNlCi0JCTk4OgotI2VuZGlmCi0KLQkuZW5kbQotCi0vKgotICogcmVzdGFydCBsb29wLiByZWdpc3RlcnMgbXVzdCBiZSB1bmNoYW5nZWQKLSAqLwotCi0JLm1hY3JvCV9fbG9vcAlhcwotCi0jaWYgWENIQUxfSEFWRV9MT09QUwotCQlsb29wCVxhcywgOTlmCi0jZWxzZQotCQk5ODoKLSNlbmRpZgotCi0JLmVuZG0KLQotLyoKLSAqIGVuZCBvZiBsb29wIHdpdGggbm8gaW5jcmVtZW50IG9mIHRoZSBhZGRyZXNzLgotICovCi0KLQkubWFjcm8JX19lbmRsCWFyLCBhcwotI2lmICFYQ0hBTF9IQVZFX0xPT1BTCi0JCWJsdHUJXGFyLCBcYXMsIDk4YgotI2VuZGlmCi0JCTk5OgotCS5lbmRtCi0KLS8qCi0gKiBlbmQgb2YgbG9vcCB3aXRoIGluY3JlbWVudCBvZiB0aGUgYWRkcmVzcy4KLSAqLwotCi0JLm1hY3JvCV9fZW5kbGEJYXIsIGFzLCBpbmNyCi0JCWFkZGkJXGFyLCBcYXIsIFxpbmNyCi0JCV9fZW5kbAlcYXIgXGFzCi0JLmVuZG0KLQotCi0jZW5kaWYgLyogX1hURU5TQV9BU01NQUNST19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvYXRvbWljLmggYi9pbmNsdWRlL2FzbS14dGVuc2EvYXRvbWljLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzYjIzNTQuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hc20teHRlbnNhL2F0b21pYy5oCisrKyAvZGV2L251bGwKQEAgLTEsMzAwICswLDAgQEAKLS8qCi0gKiBpbmNsdWRlL2FzbS14dGVuc2EvYXRvbWljLmgKLSAqCi0gKiBBdG9taWMgb3BlcmF0aW9ucyB0aGF0IEMgY2FuJ3QgZ3VhcmFudGVlIHVzLiAgVXNlZnVsIGZvciByZXNvdXJjZSBjb3VudGluZy4uCi0gKgotICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKLSAqIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDAxIC0gMjAwNSBUZW5zaWxpY2EgSW5jLgotICovCi0KLSNpZm5kZWYgX1hURU5TQV9BVE9NSUNfSAotI2RlZmluZSBfWFRFTlNBX0FUT01JQ19ICi0KLSNpbmNsdWRlIDxsaW51eC9zdHJpbmdpZnkuaD4KLQotdHlwZWRlZiBzdHJ1Y3QgeyB2b2xhdGlsZSBpbnQgY291bnRlcjsgfSBhdG9taWNfdDsKLQotI2lmZGVmIF9fS0VSTkVMX18KLSNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+Ci0jaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgotCi0jZGVmaW5lIEFUT01JQ19JTklUKGkpCXsgKGkpIH0KLQotLyoKLSAqIFRoaXMgWHRlbnNhIGltcGxlbWVudGF0aW9uIGFzc3VtZXMgdGhhdCB0aGUgcmlnaHQgbWVjaGFuaXNtCi0gKiBmb3IgZXhjbHVzaW9uIGlzIGZvciBsb2NraW5nIGludGVycnVwdHMgdG8gbGV2ZWwgMS4KLSAqCi0gKiBMb2NraW5nIGludGVycnVwdHMgbG9va3MgbGlrZSB0aGlzOgotICoKLSAqICAgIHJzaWwgYTE1LCAxCi0gKiAgICA8Y29kZT4KLSAqICAgIHdzciAgYTE1LCBQUwotICogICAgcnN5bmMKLSAqCi0gKiBOb3RlIHRoYXQgYTE1IGlzIHVzZWQgaGVyZSBiZWNhdXNlIHRoZSByZWdpc3RlciBhbGxvY2F0aW9uCi0gKiBkb25lIGJ5IHRoZSBjb21waWxlciBpcyBub3QgZ3VhcmFudGVlZCBhbmQgYSB3aW5kb3cgb3ZlcmZsb3cKLSAqIG1heSBub3Qgb2NjdXIgYmV0d2VlbiB0aGUgcnNpbCBhbmQgd3NyIGluc3RydWN0aW9ucy4gQnkgdXNpbmcKLSAqIGExNSBpbiB0aGUgcnNpbCwgdGhlIG1hY2hpbmUgaXMgZ3VhcmFudGVlZCB0byBiZSBpbiBhIHN0YXRlCi0gKiB3aGVyZSBubyByZWdpc3RlciByZWZlcmVuY2Ugd2lsbCBjYXVzZSBhbiBvdmVyZmxvdy4KLSAqLwotCi0vKioKLSAqIGF0b21pY19yZWFkIC0gcmVhZCBhdG9taWMgdmFyaWFibGUKLSAqIEB2OiBwb2ludGVyIG9mIHR5cGUgYXRvbWljX3QKLSAqCi0gKiBBdG9taWNhbGx5IHJlYWRzIHRoZSB2YWx1ZSBvZiBAdi4KLSAqLwotI2RlZmluZSBhdG9taWNfcmVhZCh2KQkJKCh2KS0+Y291bnRlcikKLQotLyoqCi0gKiBhdG9taWNfc2V0IC0gc2V0IGF0b21pYyB2YXJpYWJsZQotICogQHY6IHBvaW50ZXIgb2YgdHlwZSBhdG9taWNfdAotICogQGk6IHJlcXVpcmVkIHZhbHVlCi0gKgotICogQXRvbWljYWxseSBzZXRzIHRoZSB2YWx1ZSBvZiBAdiB0byBAaS4KLSAqLwotI2RlZmluZSBhdG9taWNfc2V0KHYsaSkJCSgodiktPmNvdW50ZXIgPSAoaSkpCi0KLS8qKgotICogYXRvbWljX2FkZCAtIGFkZCBpbnRlZ2VyIHRvIGF0b21pYyB2YXJpYWJsZQotICogQGk6IGludGVnZXIgdmFsdWUgdG8gYWRkCi0gKiBAdjogcG9pbnRlciBvZiB0eXBlIGF0b21pY190Ci0gKgotICogQXRvbWljYWxseSBhZGRzIEBpIHRvIEB2LgotICovCi1zdGF0aWMgaW5saW5lIHZvaWQgYXRvbWljX2FkZChpbnQgaSwgYXRvbWljX3QgKiB2KQotewotICAgIHVuc2lnbmVkIGludCB2dmFsOwotCi0gICAgX19hc21fXyBfX3ZvbGF0aWxlX18oCi0JInJzaWwgICAgYTE1LCAiX19zdHJpbmdpZnkoTE9DS0xFVkVMKSJcblx0IgotCSJsMzJpICAgICUwLCAlMiwgMCAgICAgICAgICAgICAgXG5cdCIKLQkiYWRkICAgICAlMCwgJTAsICUxICAgICAgICAgICAgIFxuXHQiCi0JInMzMmkgICAgJTAsICUyLCAwICAgICAgICAgICAgICBcblx0IgotCSJ3c3IgICAgIGExNSwgIl9fc3RyaW5naWZ5KFBTKSIgICAgICAgXG5cdCIKLQkicnN5bmMgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgotCTogIj0mYSIgKHZ2YWwpCi0JOiAiYSIgKGkpLCAiYSIgKHYpCi0JOiAiYTE1IiwgIm1lbW9yeSIKLQkpOwotfQotCi0vKioKLSAqIGF0b21pY19zdWIgLSBzdWJ0cmFjdCB0aGUgYXRvbWljIHZhcmlhYmxlCi0gKiBAaTogaW50ZWdlciB2YWx1ZSB0byBzdWJ0cmFjdAotICogQHY6IHBvaW50ZXIgb2YgdHlwZSBhdG9taWNfdAotICoKLSAqIEF0b21pY2FsbHkgc3VidHJhY3RzIEBpIGZyb20gQHYuCi0gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBhdG9taWNfc3ViKGludCBpLCBhdG9taWNfdCAqdikKLXsKLSAgICB1bnNpZ25lZCBpbnQgdnZhbDsKLQotICAgIF9fYXNtX18gX192b2xhdGlsZV9fKAotCSJyc2lsICAgIGExNSwgIl9fc3RyaW5naWZ5KExPQ0tMRVZFTCkiXG5cdCIKLQkibDMyaSAgICAlMCwgJTIsIDAgICAgICAgICAgICAgIFxuXHQiCi0JInN1YiAgICAgJTAsICUwLCAlMSAgICAgICAgICAgICBcblx0IgotCSJzMzJpICAgICUwLCAlMiwgMCAgICAgICAgICAgICAgXG5cdCIKLQkid3NyICAgICBhMTUsICJfX3N0cmluZ2lmeShQUykiICAgICAgIFxuXHQiCi0JInJzeW5jICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKLQk6ICI9JmEiICh2dmFsKQotCTogImEiIChpKSwgImEiICh2KQotCTogImExNSIsICJtZW1vcnkiCi0JKTsKLX0KLQotLyoKLSAqIFdlIHVzZSBhdG9taWNfe2FkZHxzdWJ9X3JldHVybiB0byBkZWZpbmUgb3RoZXIgZnVuY3Rpb25zLgotICovCi0KLXN0YXRpYyBpbmxpbmUgaW50IGF0b21pY19hZGRfcmV0dXJuKGludCBpLCBhdG9taWNfdCAqIHYpCi17Ci0gICAgIHVuc2lnbmVkIGludCB2dmFsOwotCi0gICAgX19hc21fXyBfX3ZvbGF0aWxlX18oCi0JInJzaWwgICAgYTE1LCJfX3N0cmluZ2lmeShMT0NLTEVWRUwpIlxuXHQiCi0JImwzMmkgICAgJTAsICUyLCAwICAgICAgICAgICAgIFxuXHQiCi0JImFkZCAgICAgJTAsICUwLCAlMSAgICAgICAgICAgIFxuXHQiCi0JInMzMmkgICAgJTAsICUyLCAwICAgICAgICAgICAgIFxuXHQiCi0JIndzciAgICAgYTE1LCAiX19zdHJpbmdpZnkoUFMpIiAgICAgIFxuXHQiCi0JInJzeW5jICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgotCTogIj0mYSIgKHZ2YWwpCi0JOiAiYSIgKGkpLCAiYSIgKHYpCi0JOiAiYTE1IiwgIm1lbW9yeSIKLQkpOwotCi0gICAgcmV0dXJuIHZ2YWw7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGF0b21pY19zdWJfcmV0dXJuKGludCBpLCBhdG9taWNfdCAqIHYpCi17Ci0gICAgdW5zaWduZWQgaW50IHZ2YWw7Ci0KLSAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXygKLQkicnNpbCAgICBhMTUsIl9fc3RyaW5naWZ5KExPQ0tMRVZFTCkiXG5cdCIKLQkibDMyaSAgICAlMCwgJTIsIDAgICAgICAgICAgICAgXG5cdCIKLQkic3ViICAgICAlMCwgJTAsICUxICAgICAgICAgICAgXG5cdCIKLQkiczMyaSAgICAlMCwgJTIsIDAgICAgICAgICAgICAgXG5cdCIKLQkid3NyICAgICBhMTUsICJfX3N0cmluZ2lmeShQUykiICAgICAgIFxuXHQiCi0JInJzeW5jICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgotCTogIj0mYSIgKHZ2YWwpCi0JOiAiYSIgKGkpLCAiYSIgKHYpCi0JOiAiYTE1IiwgIm1lbW9yeSIKLQkpOwotCi0gICAgcmV0dXJuIHZ2YWw7Ci19Ci0KLS8qKgotICogYXRvbWljX3N1Yl9hbmRfdGVzdCAtIHN1YnRyYWN0IHZhbHVlIGZyb20gdmFyaWFibGUgYW5kIHRlc3QgcmVzdWx0Ci0gKiBAaTogaW50ZWdlciB2YWx1ZSB0byBzdWJ0cmFjdAotICogQHY6IHBvaW50ZXIgb2YgdHlwZSBhdG9taWNfdAotICoKLSAqIEF0b21pY2FsbHkgc3VidHJhY3RzIEBpIGZyb20gQHYgYW5kIHJldHVybnMKLSAqIHRydWUgaWYgdGhlIHJlc3VsdCBpcyB6ZXJvLCBvciBmYWxzZSBmb3IgYWxsCi0gKiBvdGhlciBjYXNlcy4KLSAqLwotI2RlZmluZSBhdG9taWNfc3ViX2FuZF90ZXN0KGksdikgKGF0b21pY19zdWJfcmV0dXJuKChpKSwodikpID09IDApCi0KLS8qKgotICogYXRvbWljX2luYyAtIGluY3JlbWVudCBhdG9taWMgdmFyaWFibGUKLSAqIEB2OiBwb2ludGVyIG9mIHR5cGUgYXRvbWljX3QKLSAqCi0gKiBBdG9taWNhbGx5IGluY3JlbWVudHMgQHYgYnkgMS4KLSAqLwotI2RlZmluZSBhdG9taWNfaW5jKHYpIGF0b21pY19hZGQoMSwodikpCi0KLS8qKgotICogYXRvbWljX2luYyAtIGluY3JlbWVudCBhdG9taWMgdmFyaWFibGUKLSAqIEB2OiBwb2ludGVyIG9mIHR5cGUgYXRvbWljX3QKLSAqCi0gKiBBdG9taWNhbGx5IGluY3JlbWVudHMgQHYgYnkgMS4KLSAqLwotI2RlZmluZSBhdG9taWNfaW5jX3JldHVybih2KSBhdG9taWNfYWRkX3JldHVybigxLCh2KSkKLQotLyoqCi0gKiBhdG9taWNfZGVjIC0gZGVjcmVtZW50IGF0b21pYyB2YXJpYWJsZQotICogQHY6IHBvaW50ZXIgb2YgdHlwZSBhdG9taWNfdAotICoKLSAqIEF0b21pY2FsbHkgZGVjcmVtZW50cyBAdiBieSAxLgotICovCi0jZGVmaW5lIGF0b21pY19kZWModikgYXRvbWljX3N1YigxLCh2KSkKLQotLyoqCi0gKiBhdG9taWNfZGVjX3JldHVybiAtIGRlY3JlbWVudCBhdG9taWMgdmFyaWFibGUKLSAqIEB2OiBwb2ludGVyIG9mIHR5cGUgYXRvbWljX3QKLSAqCi0gKiBBdG9taWNhbGx5IGRlY3JlbWVudHMgQHYgYnkgMS4KLSAqLwotI2RlZmluZSBhdG9taWNfZGVjX3JldHVybih2KSBhdG9taWNfc3ViX3JldHVybigxLCh2KSkKLQotLyoqCi0gKiBhdG9taWNfZGVjX2FuZF90ZXN0IC0gZGVjcmVtZW50IGFuZCB0ZXN0Ci0gKiBAdjogcG9pbnRlciBvZiB0eXBlIGF0b21pY190Ci0gKgotICogQXRvbWljYWxseSBkZWNyZW1lbnRzIEB2IGJ5IDEgYW5kCi0gKiByZXR1cm5zIHRydWUgaWYgdGhlIHJlc3VsdCBpcyAwLCBvciBmYWxzZSBmb3IgYWxsIG90aGVyCi0gKiBjYXNlcy4KLSAqLwotI2RlZmluZSBhdG9taWNfZGVjX2FuZF90ZXN0KHYpIChhdG9taWNfc3ViX3JldHVybigxLCh2KSkgPT0gMCkKLQotLyoqCi0gKiBhdG9taWNfaW5jX2FuZF90ZXN0IC0gaW5jcmVtZW50IGFuZCB0ZXN0Ci0gKiBAdjogcG9pbnRlciBvZiB0eXBlIGF0b21pY190Ci0gKgotICogQXRvbWljYWxseSBpbmNyZW1lbnRzIEB2IGJ5IDEKLSAqIGFuZCByZXR1cm5zIHRydWUgaWYgdGhlIHJlc3VsdCBpcyB6ZXJvLCBvciBmYWxzZSBmb3IgYWxsCi0gKiBvdGhlciBjYXNlcy4KLSAqLwotI2RlZmluZSBhdG9taWNfaW5jX2FuZF90ZXN0KHYpIChhdG9taWNfYWRkX3JldHVybigxLCh2KSkgPT0gMCkKLQotLyoqCi0gKiBhdG9taWNfYWRkX25lZ2F0aXZlIC0gYWRkIGFuZCB0ZXN0IGlmIG5lZ2F0aXZlCi0gKiBAdjogcG9pbnRlciBvZiB0eXBlIGF0b21pY190Ci0gKiBAaTogaW50ZWdlciB2YWx1ZSB0byBhZGQKLSAqCi0gKiBBdG9taWNhbGx5IGFkZHMgQGkgdG8gQHYgYW5kIHJldHVybnMgdHJ1ZQotICogaWYgdGhlIHJlc3VsdCBpcyBuZWdhdGl2ZSwgb3IgZmFsc2Ugd2hlbgotICogcmVzdWx0IGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB6ZXJvLgotICovCi0jZGVmaW5lIGF0b21pY19hZGRfbmVnYXRpdmUoaSx2KSAoYXRvbWljX2FkZF9yZXR1cm4oKGkpLCh2KSkgPCAwKQotCi0jZGVmaW5lIGF0b21pY19jbXB4Y2hnKHYsIG8sIG4pICgoaW50KWNtcHhjaGcoJigodiktPmNvdW50ZXIpLCAobyksIChuKSkpCi0jZGVmaW5lIGF0b21pY194Y2hnKHYsIG5ldykgKHhjaGcoJigodiktPmNvdW50ZXIpLCBuZXcpKQotCi0vKioKLSAqIGF0b21pY19hZGRfdW5sZXNzIC0gYWRkIHVubGVzcyB0aGUgbnVtYmVyIGlzIGEgZ2l2ZW4gdmFsdWUKLSAqIEB2OiBwb2ludGVyIG9mIHR5cGUgYXRvbWljX3QKLSAqIEBhOiB0aGUgYW1vdW50IHRvIGFkZCB0byB2Li4uCi0gKiBAdTogLi4udW5sZXNzIHYgaXMgZXF1YWwgdG8gdS4KLSAqCi0gKiBBdG9taWNhbGx5IGFkZHMgQGEgdG8gQHYsIHNvIGxvbmcgYXMgaXQgd2FzIG5vdCBAdS4KLSAqIFJldHVybnMgbm9uLXplcm8gaWYgQHYgd2FzIG5vdCBAdSwgYW5kIHplcm8gb3RoZXJ3aXNlLgotICovCi1zdGF0aWMgX19pbmxpbmVfXyBpbnQgYXRvbWljX2FkZF91bmxlc3MoYXRvbWljX3QgKnYsIGludCBhLCBpbnQgdSkKLXsKLQlpbnQgYywgb2xkOwotCWMgPSBhdG9taWNfcmVhZCh2KTsKLQlmb3IgKDs7KSB7Ci0JCWlmICh1bmxpa2VseShjID09ICh1KSkpCi0JCQlicmVhazsKLQkJb2xkID0gYXRvbWljX2NtcHhjaGcoKHYpLCBjLCBjICsgKGEpKTsKLQkJaWYgKGxpa2VseShvbGQgPT0gYykpCi0JCQlicmVhazsKLQkJYyA9IG9sZDsKLQl9Ci0JcmV0dXJuIGMgIT0gKHUpOwotfQotCi0jZGVmaW5lIGF0b21pY19pbmNfbm90X3plcm8odikgYXRvbWljX2FkZF91bmxlc3MoKHYpLCAxLCAwKQotCi1zdGF0aWMgaW5saW5lIHZvaWQgYXRvbWljX2NsZWFyX21hc2sodW5zaWduZWQgaW50IG1hc2ssIGF0b21pY190ICp2KQotewotICAgIHVuc2lnbmVkIGludCBhbGxfZiA9IC0xOwotICAgIHVuc2lnbmVkIGludCB2dmFsOwotCi0gICAgX19hc21fXyBfX3ZvbGF0aWxlX18oCi0JInJzaWwgICAgYTE1LCJfX3N0cmluZ2lmeShMT0NLTEVWRUwpIlxuXHQiCi0JImwzMmkgICAgJTAsICUyLCAwICAgICAgICAgICAgIFxuXHQiCi0JInhvciAgICAgJTEsICU0LCAlMyAgICAgICAgICAgIFxuXHQiCi0JImFuZCAgICAgJTAsICUwLCAlNCAgICAgICAgICAgIFxuXHQiCi0JInMzMmkgICAgJTAsICUyLCAwICAgICAgICAgICAgIFxuXHQiCi0JIndzciAgICAgYTE1LCAiX19zdHJpbmdpZnkoUFMpIiAgICAgIFxuXHQiCi0JInJzeW5jICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgotCTogIj0mYSIgKHZ2YWwpLCAiPWEiIChtYXNrKQotCTogImEiICh2KSwgImEiIChhbGxfZiksICIxIiAobWFzaykKLQk6ICJhMTUiLCAibWVtb3J5IgotCSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBhdG9taWNfc2V0X21hc2sodW5zaWduZWQgaW50IG1hc2ssIGF0b21pY190ICp2KQotewotICAgIHVuc2lnbmVkIGludCB2dmFsOwotCi0gICAgX19hc21fXyBfX3ZvbGF0aWxlX18oCi0JInJzaWwgICAgYTE1LCJfX3N0cmluZ2lmeShMT0NLTEVWRUwpIlxuXHQiCi0JImwzMmkgICAgJTAsICUyLCAwICAgICAgICAgICAgIFxuXHQiCi0JIm9yICAgICAgJTAsICUwLCAlMSAgICAgICAgICAgIFxuXHQiCi0JInMzMmkgICAgJTAsICUyLCAwICAgICAgICAgICAgIFxuXHQiCi0JIndzciAgICAgYTE1LCAiX19zdHJpbmdpZnkoUFMpIiAgICAgICBcblx0IgotCSJyc3luYyAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKLQk6ICI9JmEiICh2dmFsKQotCTogImEiIChtYXNrKSwgImEiICh2KQotCTogImExNSIsICJtZW1vcnkiCi0JKTsKLX0KLQotLyogQXRvbWljIG9wZXJhdGlvbnMgYXJlIGFscmVhZHkgc2VyaWFsaXppbmcgKi8KLSNkZWZpbmUgc21wX21iX19iZWZvcmVfYXRvbWljX2RlYygpCWJhcnJpZXIoKQotI2RlZmluZSBzbXBfbWJfX2FmdGVyX2F0b21pY19kZWMoKQliYXJyaWVyKCkKLSNkZWZpbmUgc21wX21iX19iZWZvcmVfYXRvbWljX2luYygpCWJhcnJpZXIoKQotI2RlZmluZSBzbXBfbWJfX2FmdGVyX2F0b21pY19pbmMoKQliYXJyaWVyKCkKLQotI2luY2x1ZGUgPGFzbS1nZW5lcmljL2F0b21pYy5oPgotI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KLQotI2VuZGlmIC8qIF9YVEVOU0FfQVRPTUlDX0ggKi8KLQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL2J5dGVvcmRlci5oIGIvaW5jbHVkZS9hc20teHRlbnNhL2J5dGVvcmRlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjVlZGYxLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9ieXRlb3JkZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qCi0gKiBpbmNsdWRlL2FzbS14dGVuc2EvYnl0ZW9yZGVyLmgKLSAqCi0gKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQotICogZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDEgLSAyMDA1IFRlbnNpbGljYSBJbmMuCi0gKi8KLQotI2lmbmRlZiBfWFRFTlNBX0JZVEVPUkRFUl9ICi0jZGVmaW5lIF9YVEVOU0FfQllURU9SREVSX0gKLQotI2luY2x1ZGUgPGFzbS90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+Ci0KLXN0YXRpYyBfX2lubGluZV9fIF9fYXR0cmlidXRlX2NvbnN0X18gX191MzIgX19fYXJjaF9fc3dhYjMyKF9fdTMyIHgpCi17Ci0gICAgX191MzIgcmVzOwotICAgIC8qIGluc3RydWN0aW9uIHNlcXVlbmNlIGZyb20gWHRlbnNhIElTQSByZWxlYXNlIDIvMjAwMCAqLwotICAgIF9fYXNtX18oInNzYWkgICAgIDggICAgICAgICAgIFxuXHQiCi0JICAgICJzcmxpICAgICAlMCwgJTEsIDE2ICBcblx0IgotCSAgICAic3JjICAgICAgJTAsICUwLCAlMSAgXG5cdCIKLQkgICAgInNyYyAgICAgICUwLCAlMCwgJTAgIFxuXHQiCi0JICAgICJzcmMgICAgICAlMCwgJTEsICUwICBcbiIKLQkgICAgOiAiPSZhIiAocmVzKQotCSAgICA6ICJhIiAoeCkKLQkgICAgKTsKLSAgICByZXR1cm4gcmVzOwotfQotCi1zdGF0aWMgX19pbmxpbmVfXyBfX2F0dHJpYnV0ZV9jb25zdF9fIF9fdTE2IF9fX2FyY2hfX3N3YWIxNihfX3UxNiB4KQotewotICAgIC8qIEdpdmVuIHRoYXQgJ3Nob3J0JyB2YWx1ZXMgYXJlIHNpZ25lZCAoaS5lLiwgY2FuIGJlIG5lZ2F0aXZlKSwKLSAgICAgKiB3ZSBjYW5ub3QgYXNzdW1lIHRoYXQgdGhlIHVwcGVyIDE2LWJpdHMgb2YgdGhlIHJlZ2lzdGVyIGFyZQotICAgICAqIHplcm8uICBXZSBhcmUgY2FyZWZ1bCB0byBtYXNrIHZhbHVlcyBhZnRlciBzaGlmdGluZy4KLSAgICAgKi8KLQotICAgIC8qIFRoZXJlIGV4aXN0cyBhbiBhbm9tYWx5IGJldHdlZW4geHQtZ2NjIGFuZCB4dC14Y2MuICB4dC1nY2MKLSAgICAgKiBpbnNlcnRzIGFuIGV4dHVpIGluc3RydWN0aW9uIGFmdGVyIHB1dHRpbmcgdGhpcyBmdW5jdGlvbiBpbmxpbmUKLSAgICAgKiB0byBlbnN1cmUgdGhhdCBpdCB1c2VzIG9ubHkgdGhlIGxlYXN0LXNpZ25pZmljYW50IDE2IGJpdHMgb2YKLSAgICAgKiB0aGUgcmVzdWx0LiAgeHQteGNjIGRvZXNuJ3QgdXNlIGFuIGV4dHVpLCBidXQgYXNzdW1lcyB0aGUKLSAgICAgKiBfX2FzbV9fIG1hY3JvIGZvbGxvd3MgY29udmVudGlvbiB0aGF0IHRoZSB1cHBlciAxNiBiaXRzIG9mIGFuCi0gICAgICogJ3Vuc2lnbmVkIHNob3J0JyByZXN1bHQgYXJlIHN0aWxsIHplcm8uICBUaGlzIG1hY3JvIGRvZXNuJ3QKLSAgICAgKiBmb2xsb3cgY29udmVudGlvbjsgaW5kZWVkLCBpdCBsZWF2ZXMgZ2FyYmFnZSBpbiB0aGUgdXBwb3J0IDE2Ci0gICAgICogYml0cyBvZiB0aGUgcmVnaXN0ZXIuCi0KLSAgICAgKiBEZWNsYXJpbmcgdGhlIHRlbXBvcmFyeSB2YXJpYWJsZXMgJ3JlcycgYW5kICd0bXAnIHRvIGJlIDMyLWJpdAotICAgICAqIHR5cGVzIHdoaWxlIHRoZSByZXR1cm4gdHlwZSBvZiB0aGUgZnVuY3Rpb24gaXMgYSAxNi1iaXQgdHlwZQotICAgICAqIGZvcmNlcyBib3RoIGNvbXBpbGVycyB0byBpbnNlcnQgZXhhY3RseSBvbmUgZXh0dWkgaW5zdHJ1Y3Rpb24KLSAgICAgKiAob3IgZXF1aXZhbGVudCkgdG8gbWFzayBvZmYgdGhlIHVwcGVyIDE2IGJpdHMuICovCi0KLSAgICBfX3UzMiByZXM7Ci0gICAgX191MzIgdG1wOwotCi0gICAgX19hc21fXygiZXh0dWkgICAgJTEsICUyLCA4LCA4XG5cdCIKLQkgICAgInNsbGkgICAgICUwLCAlMiwgOCAgIFxuXHQiCi0JICAgICJvciAgICAgICAlMCwgJTAsICUxICBcbiIKLQkgICAgOiAiPSZhIiAocmVzKSwgIj0mYSIgKHRtcCkKLQkgICAgOiAiYSIgKHgpCi0JICAgICk7Ci0KLSAgICByZXR1cm4gcmVzOwotfQotCi0jZGVmaW5lIF9fYXJjaF9fc3dhYjMyKHgpIF9fX2FyY2hfX3N3YWIzMih4KQotI2RlZmluZSBfX2FyY2hfX3N3YWIxNih4KSBfX19hcmNoX19zd2FiMTYoeCkKLQotI2lmICFkZWZpbmVkKF9fU1RSSUNUX0FOU0lfXykgfHwgZGVmaW5lZChfX0tFUk5FTF9fKQotIyAgZGVmaW5lIF9fQllURU9SREVSX0hBU19VNjRfXwotIyAgZGVmaW5lIF9fU1dBQl82NF9USFJVXzMyX18KLSNlbmRpZgotCi0jaWZkZWYgX19YVEVOU0FfRUxfXwotIyBpbmNsdWRlIDxsaW51eC9ieXRlb3JkZXIvbGl0dGxlX2VuZGlhbi5oPgotI2VsaWYgZGVmaW5lZChfX1hURU5TQV9FQl9fKQotIyBpbmNsdWRlIDxsaW51eC9ieXRlb3JkZXIvYmlnX2VuZGlhbi5oPgotI2Vsc2UKLSMgZXJyb3IgcHJvY2Vzc29yIGJ5dGUgb3JkZXIgdW5kZWZpbmVkIQotI2VuZGlmCi0KLSNlbmRpZiAvKiBfWFRFTlNBX0JZVEVPUkRFUl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvY2FjaGUuaCBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9jYWNoZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYmJhMmE1Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9jYWNoZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoKLSAqIGluY2x1ZGUvYXNtLXh0ZW5zYS9jYWNoZS5oCi0gKgotICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKLSAqIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogKEMpIDIwMDEgLSAyMDA1IFRlbnNpbGljYSBJbmMuCi0gKi8KLQotI2lmbmRlZiBfWFRFTlNBX0NBQ0hFX0gKLSNkZWZpbmUgX1hURU5TQV9DQUNIRV9ICi0KLSNpbmNsdWRlIDxhc20vdmFyaWFudC9jb3JlLmg+Ci0KLSNkZWZpbmUgTDFfQ0FDSEVfU0hJRlQJWENIQUxfRENBQ0hFX0xJTkVXSURUSAotI2RlZmluZSBMMV9DQUNIRV9CWVRFUwlYQ0hBTF9EQ0FDSEVfTElORVNJWkUKLSNkZWZpbmUgU01QX0NBQ0hFX0JZVEVTCUwxX0NBQ0hFX0JZVEVTCi0KLSNkZWZpbmUgRENBQ0hFX1dBWV9TSVpFCShYQ0hBTF9EQ0FDSEVfU0laRS9YQ0hBTF9EQ0FDSEVfV0FZUykKLSNkZWZpbmUgSUNBQ0hFX1dBWV9TSVpFCShYQ0hBTF9JQ0FDSEVfU0laRS9YQ0hBTF9JQ0FDSEVfV0FZUykKLSNkZWZpbmUgRENBQ0hFX1dBWV9TSElGVCAoWENIQUxfRENBQ0hFX1NFVFdJRFRIICsgWENIQUxfRENBQ0hFX0xJTkVXSURUSCkKLSNkZWZpbmUgSUNBQ0hFX1dBWV9TSElGVCAoWENIQUxfSUNBQ0hFX1NFVFdJRFRIICsgWENIQUxfSUNBQ0hFX0xJTkVXSURUSCkKLQotLyogTWF4aW11bSBjYWNoZSBzaXplIHBlciB3YXkuICovCi0jaWYgRENBQ0hFX1dBWV9TSVpFID49IElDQUNIRV9XQVlfU0laRQotIyBkZWZpbmUgQ0FDSEVfV0FZX1NJWkUgRENBQ0hFX1dBWV9TSVpFCi0jZWxzZQotIyBkZWZpbmUgQ0FDSEVfV0FZX1NJWkUgSUNBQ0hFX1dBWV9TSVpFCi0jZW5kaWYKLQotCi0jZW5kaWYJLyogX1hURU5TQV9DQUNIRV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvY2hlY2tzdW0uaCBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9jaGVja3N1bS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzUzNGM2Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9jaGVja3N1bS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjUwICswLDAgQEAKLS8qCi0gKiBpbmNsdWRlL2FzbS14dGVuc2EvY2hlY2tzdW0uaAotICoKLSAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCi0gKiBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIENvcHlyaWdodCAoQykgMjAwMSAtIDIwMDUgVGVuc2lsaWNhIEluYy4KLSAqLwotCi0jaWZuZGVmIF9YVEVOU0FfQ0hFQ0tTVU1fSAotI2RlZmluZSBfWFRFTlNBX0NIRUNLU1VNX0gKLQotI2luY2x1ZGUgPGxpbnV4L2luNi5oPgotI2luY2x1ZGUgPGFzbS92YXJpYW50L2NvcmUuaD4KLQotLyoKLSAqIGNvbXB1dGVzIHRoZSBjaGVja3N1bSBvZiBhIG1lbW9yeSBibG9jayBhdCBidWZmLCBsZW5ndGggbGVuLAotICogYW5kIGFkZHMgaW4gInN1bSIgKDMyLWJpdCkKLSAqCi0gKiByZXR1cm5zIGEgMzItYml0IG51bWJlciBzdWl0YWJsZSBmb3IgZmVlZGluZyBpbnRvIGl0c2VsZgotICogb3IgY3N1bV90Y3B1ZHBfbWFnaWMKLSAqCi0gKiB0aGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIHdpdGggZXZlbiBsZW5ndGhzLCBleGNlcHQKLSAqIGZvciB0aGUgbGFzdCBmcmFnbWVudCwgd2hpY2ggbWF5IGJlIG9kZAotICoKLSAqIGl0J3MgYmVzdCB0byBoYXZlIGJ1ZmYgYWxpZ25lZCBvbiBhIDMyLWJpdCBib3VuZGFyeQotICovCi1hc21saW5rYWdlIF9fd3N1bSBjc3VtX3BhcnRpYWwoY29uc3Qgdm9pZCAqYnVmZiwgaW50IGxlbiwgX193c3VtIHN1bSk7Ci0KLS8qCi0gKiB0aGUgc2FtZSBhcyBjc3VtX3BhcnRpYWwsIGJ1dCBjb3BpZXMgZnJvbSBzcmMgd2hpbGUgaXQKLSAqIGNoZWNrc3VtcywgYW5kIGhhbmRsZXMgdXNlci1zcGFjZSBwb2ludGVyIGV4Y2VwdGlvbnMgY29ycmVjdGx5LCB3aGVuIG5lZWRlZC4KLSAqCi0gKiBoZXJlIGV2ZW4gbW9yZSBpbXBvcnRhbnQgdG8gYWxpZ24gc3JjIGFuZCBkc3Qgb24gYSAzMi1iaXQgKG9yIGV2ZW4KLSAqIGJldHRlciA2NC1iaXQpIGJvdW5kYXJ5Ci0gKi8KLQotYXNtbGlua2FnZSBfX3dzdW0gY3N1bV9wYXJ0aWFsX2NvcHlfZ2VuZXJpYyhjb25zdCB2b2lkICpzcmMsIHZvaWQgKmRzdCwgaW50IGxlbiwgX193c3VtIHN1bSwKLQkJCQkJCSAgIGludCAqc3JjX2Vycl9wdHIsIGludCAqZHN0X2Vycl9wdHIpOwotCi0vKgotICoJTm90ZTogd2hlbiB5b3UgZ2V0IGEgTlVMTCBwb2ludGVyIGV4Y2VwdGlvbiBoZXJlIHRoaXMgbWVhbnMgc29tZW9uZQotICoJcGFzc2VkIGluIGFuIGluY29ycmVjdCBrZXJuZWwgYWRkcmVzcyB0byBvbmUgb2YgdGhlc2UgZnVuY3Rpb25zLgotICoKLSAqCUlmIHlvdSB1c2UgdGhlc2UgZnVuY3Rpb25zIGRpcmVjdGx5IHBsZWFzZSBkb24ndCBmb3JnZXQgdGhlIGFjY2Vzc19vaygpLgotICovCi1zdGF0aWMgaW5saW5lCi1fX3dzdW0gY3N1bV9wYXJ0aWFsX2NvcHlfbm9jaGVjayhjb25zdCB2b2lkICpzcmMsIHZvaWQgKmRzdCwKLQkJCQkJaW50IGxlbiwgX193c3VtIHN1bSkKLXsKLQlyZXR1cm4gY3N1bV9wYXJ0aWFsX2NvcHlfZ2VuZXJpYyhzcmMsIGRzdCwgbGVuLCBzdW0sIE5VTEwsIE5VTEwpOwotfQotCi1zdGF0aWMgaW5saW5lCi1fX3dzdW0gY3N1bV9wYXJ0aWFsX2NvcHlfZnJvbV91c2VyKGNvbnN0IHZvaWQgX191c2VyICpzcmMsIHZvaWQgKmRzdCwKLQkJCQkJCWludCBsZW4sIF9fd3N1bSBzdW0sIGludCAqZXJyX3B0cikKLXsKLQlyZXR1cm4gY3N1bV9wYXJ0aWFsX2NvcHlfZ2VuZXJpYygoX19mb3JjZSBjb25zdCB2b2lkICopc3JjLCBkc3QsCi0JCQkJCWxlbiwgc3VtLCBlcnJfcHRyLCBOVUxMKTsKLX0KLQotLyoKLSAqCUZvbGQgYSBwYXJ0aWFsIGNoZWNrc3VtCi0gKi8KLQotc3RhdGljIF9faW5saW5lX18gX19zdW0xNiBjc3VtX2ZvbGQoX193c3VtIHN1bSkKLXsKLQl1bnNpZ25lZCBpbnQgX19kdW1teTsKLQlfX2FzbV9fKCJleHR1aQklMSwgJTAsIDE2LCAxNlxuXHQiCi0JCSJleHR1aQklMCAsJTAsIDAsIDE2XG5cdCIKLQkJImFkZAklMCwgJTAsICUxXG5cdCIKLQkJInNsbGkJJTEsICUwLCAxNlxuXHQiCi0JCSJhZGQJJTAsICUwLCAlMVxuXHQiCi0JCSJleHR1aQklMCwgJTAsIDE2LCAxNlxuXHQiCi0JCSJuZWcJJTAsICUwXG5cdCIKLQkJImFkZGkJJTAsICUwLCAtMVxuXHQiCi0JCSJleHR1aQklMCwgJTAsIDAsIDE2XG5cdCIKLQkJOiAiPXIiIChzdW0pLCAiPSZyIiAoX19kdW1teSkKLQkJOiAiMCIgKHN1bSkpOwotCXJldHVybiAoX19mb3JjZSBfX3N1bTE2KXN1bTsKLX0KLQotLyoKLSAqCVRoaXMgaXMgYSB2ZXJzaW9uIG9mIGlwX2NvbXB1dGVfY3N1bSgpIG9wdGltaXplZCBmb3IgSVAgaGVhZGVycywKLSAqCXdoaWNoIGFsd2F5cyBjaGVja3N1bSBvbiA0IG9jdGV0IGJvdW5kYXJpZXMuCi0gKi8KLXN0YXRpYyBfX2lubGluZV9fIF9fc3VtMTYgaXBfZmFzdF9jc3VtKGNvbnN0IHZvaWQgKmlwaCwgdW5zaWduZWQgaW50IGlobCkKLXsKLQl1bnNpZ25lZCBpbnQgc3VtLCB0bXAsIGVuZGFkZHI7Ci0KLQlfX2FzbV9fIF9fdm9sYXRpbGVfXygKLQkJInN1YgkJJTAsICUwLCAlMFxuXHQiCi0jaWYgWENIQUxfSEFWRV9MT09QUwotCQkibG9vcGd0egklMiwgMmZcblx0IgotI2Vsc2UKLQkJImJlcXoJCSUyLCAyZlxuXHQiCi0JCSJzbGxpCQklNCwgJTIsIDJcblx0IgotCQkiYWRkCQklNCwgJTQsICUxXG5cdCIKLQkJIjA6XHQiCi0jZW5kaWYKLQkJImwzMmkJCSUzLCAlMSwgMFxuXHQiCi0JCSJhZGQJCSUwLCAlMCwgJTNcblx0IgotCQkiYmdldQkJJTAsICUzLCAxZlxuXHQiCi0JCSJhZGRpCQklMCwgJTAsIDFcblx0IgotCQkiMTpcdCIKLQkJImFkZGkJCSUxLCAlMSwgNFxuXHQiCi0jaWYgIVhDSEFMX0hBVkVfTE9PUFMKLQkJImJsdAkJJTEsICU0LCAwYlxuXHQiCi0jZW5kaWYKLQkJIjI6XHQiCi0JLyogU2luY2UgdGhlIGlucHV0IHJlZ2lzdGVycyB3aGljaCBhcmUgbG9hZGVkIHdpdGggaXBoIGFuZCBpaGwKLQkgICBhcmUgbW9kaWZpZWQsIHdlIG11c3QgYWxzbyBzcGVjaWZ5IHRoZW0gYXMgb3V0cHV0cywgb3IgZ2NjCi0JICAgd2lsbCBhc3N1bWUgdGhleSBjb250YWluIHRoZWlyIG9yaWdpbmFsIHZhbHVlcy4gKi8KLQkJOiAiPXIiIChzdW0pLCAiPXIiIChpcGgpLCAiPXIiIChpaGwpLCAiPSZyIiAodG1wKSwgIj0mciIgKGVuZGFkZHIpCi0JCTogIjEiIChpcGgpLCAiMiIgKGlobCkpOwotCi0JcmV0dXJuCWNzdW1fZm9sZChzdW0pOwotfQotCi1zdGF0aWMgX19pbmxpbmVfXyBfX3dzdW0gY3N1bV90Y3B1ZHBfbm9mb2xkKF9fYmUzMiBzYWRkciwgX19iZTMyIGRhZGRyLAotCQkJCQkJICAgdW5zaWduZWQgc2hvcnQgbGVuLAotCQkJCQkJICAgdW5zaWduZWQgc2hvcnQgcHJvdG8sCi0JCQkJCQkgICBfX3dzdW0gc3VtKQotewotCi0jaWZkZWYgX19YVEVOU0FfRUxfXwotCXVuc2lnbmVkIGxvbmcgbGVuX3Byb3RvID0gKGxlbiArIHByb3RvKSA8PCA4OwotI2VsaWYgZGVmaW5lZChfX1hURU5TQV9FQl9fKQotCXVuc2lnbmVkIGxvbmcgbGVuX3Byb3RvID0gbGVuICsgcHJvdG87Ci0jZWxzZQotIyBlcnJvciBwcm9jZXNzb3IgYnl0ZSBvcmRlciB1bmRlZmluZWQhCi0jZW5kaWYKLQlfX2FzbV9fKCJhZGQJJTAsICUwLCAlMVxuXHQiCi0JCSJiZ2V1CSUwLCAlMSwgMWZcblx0IgotCQkiYWRkaQklMCwgJTAsIDFcblx0IgotCQkiMTpcdCIKLQkJImFkZAklMCwgJTAsICUyXG5cdCIKLQkJImJnZXUJJTAsICUyLCAxZlxuXHQiCi0JCSJhZGRpCSUwLCAlMCwgMVxuXHQiCi0JCSIxOlx0IgotCQkiYWRkCSUwLCAlMCwgJTNcblx0IgotCQkiYmdldQklMCwgJTMsIDFmXG5cdCIKLQkJImFkZGkJJTAsICUwLCAxXG5cdCIKLQkJIjE6XHQiCi0JCTogIj1yIiAoc3VtKSwgIj1yIiAobGVuX3Byb3RvKQotCQk6ICJyIiAoZGFkZHIpLCAiciIgKHNhZGRyKSwgIjEiIChsZW5fcHJvdG8pLCAiMCIgKHN1bSkpOwotCXJldHVybiBzdW07Ci19Ci0KLS8qCi0gKiBjb21wdXRlcyB0aGUgY2hlY2tzdW0gb2YgdGhlIFRDUC9VRFAgcHNldWRvLWhlYWRlcgotICogcmV0dXJucyBhIDE2LWJpdCBjaGVja3N1bSwgYWxyZWFkeSBjb21wbGVtZW50ZWQKLSAqLwotc3RhdGljIF9faW5saW5lX18gX19zdW0xNiBjc3VtX3RjcHVkcF9tYWdpYyhfX2JlMzIgc2FkZHIsIF9fYmUzMiBkYWRkciwKLQkJCQkJCSAgICAgICB1bnNpZ25lZCBzaG9ydCBsZW4sCi0JCQkJCQkgICAgICAgdW5zaWduZWQgc2hvcnQgcHJvdG8sCi0JCQkJCQkgICAgICAgX193c3VtIHN1bSkKLXsKLQlyZXR1cm4gY3N1bV9mb2xkKGNzdW1fdGNwdWRwX25vZm9sZChzYWRkcixkYWRkcixsZW4scHJvdG8sc3VtKSk7Ci19Ci0KLS8qCi0gKiB0aGlzIHJvdXRpbmUgaXMgdXNlZCBmb3IgbWlzY2VsbGFuZW91cyBJUC1saWtlIGNoZWNrc3VtcywgbWFpbmx5Ci0gKiBpbiBpY21wLmMKLSAqLwotCi1zdGF0aWMgX19pbmxpbmVfXyBfX3N1bTE2IGlwX2NvbXB1dGVfY3N1bShjb25zdCB2b2lkICpidWZmLCBpbnQgbGVuKQotewotICAgIHJldHVybiBjc3VtX2ZvbGQgKGNzdW1fcGFydGlhbChidWZmLCBsZW4sIDApKTsKLX0KLQotI2RlZmluZSBfSEFWRV9BUkNIX0lQVjZfQ1NVTQotc3RhdGljIF9faW5saW5lX18gX19zdW0xNiBjc3VtX2lwdjZfbWFnaWMoY29uc3Qgc3RydWN0IGluNl9hZGRyICpzYWRkciwKLQkJCQkJICBjb25zdCBzdHJ1Y3QgaW42X2FkZHIgKmRhZGRyLAotCQkJCQkgIF9fdTMyIGxlbiwgdW5zaWduZWQgc2hvcnQgcHJvdG8sCi0JCQkJCSAgX193c3VtIHN1bSkKLXsKLQl1bnNpZ25lZCBpbnQgX19kdW1teTsKLQlfX2FzbV9fKCJsMzJpCSUxLCAlMiwgMFxuXHQiCi0JCSJhZGQJJTAsICUwLCAlMVxuXHQiCi0JCSJiZ2V1CSUwLCAlMSwgMWZcblx0IgotCQkiYWRkaQklMCwgJTAsIDFcblx0IgotCQkiMTpcdCIKLQkJImwzMmkJJTEsICUyLCA0XG5cdCIKLQkJImFkZAklMCwgJTAsICUxXG5cdCIKLQkJImJnZXUJJTAsICUxLCAxZlxuXHQiCi0JCSJhZGRpCSUwLCAlMCwgMVxuXHQiCi0JCSIxOlx0IgotCQkibDMyaQklMSwgJTIsIDhcblx0IgotCQkiYWRkCSUwLCAlMCwgJTFcblx0IgotCQkiYmdldQklMCwgJTEsIDFmXG5cdCIKLQkJImFkZGkJJTAsICUwLCAxXG5cdCIKLQkJIjE6XHQiCi0JCSJsMzJpCSUxLCAlMiwgMTJcblx0IgotCQkiYWRkCSUwLCAlMCwgJTFcblx0IgotCQkiYmdldQklMCwgJTEsIDFmXG5cdCIKLQkJImFkZGkJJTAsICUwLCAxXG5cdCIKLQkJIjE6XHQiCi0JCSJsMzJpCSUxLCAlMywgMFxuXHQiCi0JCSJhZGQJJTAsICUwLCAlMVxuXHQiCi0JCSJiZ2V1CSUwLCAlMSwgMWZcblx0IgotCQkiYWRkaQklMCwgJTAsIDFcblx0IgotCQkiMTpcdCIKLQkJImwzMmkJJTEsICUzLCA0XG5cdCIKLQkJImFkZAklMCwgJTAsICUxXG5cdCIKLQkJImJnZXUJJTAsICUxLCAxZlxuXHQiCi0JCSJhZGRpCSUwLCAlMCwgMVxuXHQiCi0JCSIxOlx0IgotCQkibDMyaQklMSwgJTMsIDhcblx0IgotCQkiYWRkCSUwLCAlMCwgJTFcblx0IgotCQkiYmdldQklMCwgJTEsIDFmXG5cdCIKLQkJImFkZGkJJTAsICUwLCAxXG5cdCIKLQkJIjE6XHQiCi0JCSJsMzJpCSUxLCAlMywgMTJcblx0IgotCQkiYWRkCSUwLCAlMCwgJTFcblx0IgotCQkiYmdldQklMCwgJTEsIDFmXG5cdCIKLQkJImFkZGkJJTAsICUwLCAxXG5cdCIKLQkJIjE6XHQiCi0JCSJhZGQJJTAsICUwLCAlNFxuXHQiCi0JCSJiZ2V1CSUwLCAlNCwgMWZcblx0IgotCQkiYWRkaQklMCwgJTAsIDFcblx0IgotCQkiMTpcdCIKLQkJImFkZAklMCwgJTAsICU1XG5cdCIKLQkJImJnZXUJJTAsICU1LCAxZlxuXHQiCi0JCSJhZGRpCSUwLCAlMCwgMVxuXHQiCi0JCSIxOlx0IgotCQk6ICI9ciIgKHN1bSksICI9JnIiIChfX2R1bW15KQotCQk6ICJyIiAoc2FkZHIpLCAiciIgKGRhZGRyKSwKLQkJICAiciIgKGh0b25sKGxlbikpLCAiciIgKGh0b25sKHByb3RvKSksICIwIiAoc3VtKSk7Ci0KLQlyZXR1cm4gY3N1bV9mb2xkKHN1bSk7Ci19Ci0KLS8qCi0gKglDb3B5IGFuZCBjaGVja3N1bSB0byB1c2VyCi0gKi8KLSNkZWZpbmUgSEFWRV9DU1VNX0NPUFlfVVNFUgotc3RhdGljIF9faW5saW5lX18gX193c3VtIGNzdW1fYW5kX2NvcHlfdG9fdXNlcihjb25zdCB2b2lkICpzcmMsIHZvaWQgX191c2VyICpkc3QsCi0JCQkJICAgIGludCBsZW4sIF9fd3N1bSBzdW0sIGludCAqZXJyX3B0cikKLXsKLQlpZiAoYWNjZXNzX29rKFZFUklGWV9XUklURSwgZHN0LCBsZW4pKQotCQlyZXR1cm4gY3N1bV9wYXJ0aWFsX2NvcHlfZ2VuZXJpYyhzcmMsIGRzdCwgbGVuLCBzdW0sIE5VTEwsIGVycl9wdHIpOwotCi0JaWYgKGxlbikKLQkJKmVycl9wdHIgPSAtRUZBVUxUOwotCi0JcmV0dXJuIChfX2ZvcmNlIF9fd3N1bSktMTsgLyogaW52YWxpZCBjaGVja3N1bSAqLwotfQotI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvY29wcm9jZXNzb3IuaCBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9jb3Byb2Nlc3Nvci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxY2JjZjkwLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9jb3Byb2Nlc3Nvci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTc3ICswLDAgQEAKLS8qCi0gKiBpbmNsdWRlL2FzbS14dGVuc2EvY29wcm9jZXNzb3IuaAotICoKLSAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCi0gKiBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIENvcHlyaWdodCAoQykgMjAwMyAtIDIwMDcgVGVuc2lsaWNhIEluYy4KLSAqLwotCi0KLSNpZm5kZWYgX1hURU5TQV9DT1BST0NFU1NPUl9ICi0jZGVmaW5lIF9YVEVOU0FfQ09QUk9DRVNTT1JfSAotCi0jaW5jbHVkZSA8bGludXgvc3RyaW5naWZ5Lmg+Ci0jaW5jbHVkZSA8YXNtL3ZhcmlhbnQvdGllLmg+Ci0jaW5jbHVkZSA8YXNtL3R5cGVzLmg+Ci0KLSNpZmRlZiBfX0FTU0VNQkxZX18KLSMgaW5jbHVkZSA8YXNtL3ZhcmlhbnQvdGllLWFzbS5oPgotCi0ubWFjcm8JeGNoYWxfc2Ffc3RhcnQgIGEgYgotCS5zZXQgLkx4Y2hhbF9wb2ZzXywgMAotCS5zZXQgLkx4Y2hhbF9vZnNfLCAwCi0uZW5kbQotCi0ubWFjcm8JeGNoYWxfc2FfYWxpZ24gIHB0ciBtaW5vZnMgbWF4b2ZzIG9mc2FsaWduIHRvdGFsaWduCi0JLnNldAkuTHhjaGFsX29mc18sIC5MeGNoYWxfb2ZzXyArIC5MeGNoYWxfcG9mc18gKyBcdG90YWxpZ24gLSAxCi0JLnNldAkuTHhjaGFsX29mc18sICguTHhjaGFsX29mc18gJiAtXHRvdGFsaWduKSAtIC5MeGNoYWxfcG9mc18KLS5lbmRtCi0KLSNkZWZpbmUgX1NFTEVDVAkoICBYVEhBTF9TQVNfVElFIHwgWFRIQUxfU0FTX09QVCBcCi0JCSB8IFhUSEFMX1NBU19DQyBcCi0JCSB8IFhUSEFMX1NBU19DQUxSIHwgWFRIQUxfU0FTX0NBTEUgKQotCi0ubWFjcm8gc2F2ZV94dHJlZ3Nfb3B0IHB0ciBjbGIgYXQxIGF0MiBhdDMgYXQ0IG9mZnNldAotCS5pZiBYVFJFR1NfT1BUX1NJWkUgPiAwCi0JCWFkZGkJXGNsYiwgXHB0ciwgXG9mZnNldAotCQl4Y2hhbF9uY3Bfc3RvcmUgXGNsYiBcYXQxIFxhdDIgXGF0MyBcYXQ0IHNlbGVjdD1fU0VMRUNUCi0JLmVuZGlmCi0uZW5kbQotCi0ubWFjcm8gbG9hZF94dHJlZ3Nfb3B0IHB0ciBjbGIgYXQxIGF0MiBhdDMgYXQ0IG9mZnNldAotCS5pZiBYVFJFR1NfT1BUX1NJWkUgPiAwCi0JCWFkZGkJXGNsYiwgXHB0ciwgXG9mZnNldAotCQl4Y2hhbF9uY3BfbG9hZCBcY2xiIFxhdDEgXGF0MiBcYXQzIFxhdDQgc2VsZWN0PV9TRUxFQ1QKLQkuZW5kaWYKLS5lbmRtCi0jdW5kZWYgX1NFTEVDVAotCi0jZGVmaW5lIF9TRUxFQ1QJKCAgWFRIQUxfU0FTX1RJRSB8IFhUSEFMX1NBU19PUFQgXAotCQkgfCBYVEhBTF9TQVNfTk9DQyBcCi0JCSB8IFhUSEFMX1NBU19DQUxSIHwgWFRIQUxfU0FTX0NBTEUgfCBYVEhBTF9TQVNfR0xPQiApCi0KLS5tYWNybyBzYXZlX3h0cmVnc191c2VyIHB0ciBjbGIgYXQxIGF0MiBhdDMgYXQ0IG9mZnNldAotCS5pZiBYVFJFR1NfVVNFUl9TSVpFID4gMAotCQlhZGRpCVxjbGIsIFxwdHIsIFxvZmZzZXQKLQkJeGNoYWxfbmNwX3N0b3JlIFxjbGIgXGF0MSBcYXQyIFxhdDMgXGF0NCBzZWxlY3Q9X1NFTEVDVAotCS5lbmRpZgotLmVuZG0KLQotLm1hY3JvIGxvYWRfeHRyZWdzX3VzZXIgcHRyIGNsYiBhdDEgYXQyIGF0MyBhdDQgb2Zmc2V0Ci0JLmlmIFhUUkVHU19VU0VSX1NJWkUgPiAwCi0JCWFkZGkJXGNsYiwgXHB0ciwgXG9mZnNldAotCQl4Y2hhbF9uY3BfbG9hZCBcY2xiIFxhdDEgXGF0MiBcYXQzIFxhdDQgc2VsZWN0PV9TRUxFQ1QKLQkuZW5kaWYKLS5lbmRtCi0jdW5kZWYgX1NFTEVDVAotCi0KLQotI2VuZGlmCS8qIF9fQVNTRU1CTFlfXyAqLwotCi0vKgotICogWFRFTlNBX0hBVkVfQ09QUk9DRVNTT1IoeCkgcmV0dXJucyAxIGlmIGNvcHJvY2Vzc29yIHggaXMgY29uZmlndXJlZC4KLSAqCi0gKiBYVEVOU0FfSEFWRV9JT19QT1JUKHgpIHJldHVybnMgMSBpZiBpby1wb3J0IHggaXMgY29uZmlndXJlZC4KLSAqCi0gKi8KLQotI2RlZmluZSBYVEVOU0FfSEFWRV9DT1BST0NFU1NPUih4KQkJCQkJXAotCSgoWENIQUxfQ1BfTUFTSyBeIFhDSEFMX0NQX1BPUlRfTUFTSykgJiAoMSA8PCAoeCkpKQotI2RlZmluZSBYVEVOU0FfSEFWRV9DT1BST0NFU1NPUlMJCQkJCVwKLQkoWENIQUxfQ1BfTUFTSyBeIFhDSEFMX0NQX1BPUlRfTUFTSykKLSNkZWZpbmUgWFRFTlNBX0hBVkVfSU9fUE9SVCh4KQkJCQkJCVwKLQkoWENIQUxfQ1BfUE9SVF9NQVNLICYgKDEgPDwgKHgpKSkKLSNkZWZpbmUgWFRFTlNBX0hBVkVfSU9fUE9SVFMJCQkJCQlcCi0JWENIQUxfQ1BfUE9SVF9NQVNLCi0KLSNpZm5kZWYgX19BU1NFTUJMWV9fCi0KLQotI2lmIFhDSEFMX0hBVkVfQ1AKLQotI2RlZmluZSBSU1JfQ1BFTkFCTEUoeCkJZG8gewkJCQkJCSAgXAotCV9fYXNtX18gX192b2xhdGlsZV9fKCJyc3IgJTAsIiBfX3N0cmluZ2lmeShDUEVOQUJMRSkgOiAiPWEiICh4KSk7IFwKLQl9IHdoaWxlKDApOwotI2RlZmluZSBXU1JfQ1BFTkFCTEUoeCkJZG8gewkJCQkJCSAgXAotICAJX19hc21fXyBfX3ZvbGF0aWxlX18oIndzciAlMCwiIF9fc3RyaW5naWZ5KENQRU5BQkxFKSAiOyByc3luYyIgCSAgXAotCSAgICAJCSAgICAgOjogImEiICh4KSk7CQkJCSAgXAotCX0gd2hpbGUoMCk7Ci0KLSNlbmRpZiAvKiBYQ0hBTF9IQVZFX0NQICovCi0KLQotLyoKLSAqIEFkZGl0aW9uYWwgcmVnaXN0ZXJzLgotICogV2UgZGVmaW5lIHRocmVlIHR5cGVzIG9mIGFkZGl0aW9uYWwgcmVnaXN0ZXJzOgotICogIGV4dDogZXh0cmEgcmVnaXN0ZXJzIHRoYXQgYXJlIHVzZWQgYnkgdGhlIGNvbXBpbGVyCi0gKiAgY3BuOiBvcHRpb25hbCByZWdpc3RlcnMgdGhhdCBjYW4gYmUgdXNlZCBieSBhIHVzZXIgYXBwbGljYXRpb24KLSAqICBjcFg6IGNvcHJvY2Vzc29yIHJlZ2lzdGVycyB0aGF0IGNhbiBvbmx5IGJlIHVzZWQgaWYgdGhlIGNvcnJlc3BvbmRpbmcKLSAqICAgICAgIENQRU5BQkxFIGJpdCBpcyBzZXQuCi0gKi8KLQotI2RlZmluZSBYQ0hBTF9TQV9SRUcobGlzdCxjYyxhYmksdHlwZSx5LG5hbWUseixhbGlnbixzaXplLC4uLikJXAotCV9fUkVHICMjIGxpc3QgKGNjLCBhYmksIHR5cGUsIG5hbWUsIHNpemUsIGFsaWduKQotCi0jZGVmaW5lIF9fUkVHMChjYyxhYmksdCxuYW1lLHMsYSkJX19SRUcwXyAjIyBjYyAoYWJpLG5hbWUpCi0jZGVmaW5lIF9fUkVHMShjYyxhYmksdCxuYW1lLHMsYSkJX19SRUcxXyAjIyBjYyAobmFtZSkKLSNkZWZpbmUgX19SRUcyKGNjLGFiaSx0eXBlLC4uLikJCV9fUkVHMl8gIyMgdHlwZSAoX19WQV9BUkdTX18pCi0KLSNkZWZpbmUgX19SRUcwXzAoYWJpLG5hbWUpCi0jZGVmaW5lIF9fUkVHMF8xKGFiaSxuYW1lKQkJX19SRUcwXzEgIyMgYWJpIChuYW1lKQotI2RlZmluZSBfX1JFRzBfMTAobmFtZSkJX191MzIgbmFtZTsKLSNkZWZpbmUgX19SRUcwXzExKG5hbWUpCV9fdTMyIG5hbWU7Ci0jZGVmaW5lIF9fUkVHMF8xMihuYW1lKQotCi0jZGVmaW5lIF9fUkVHMV8wKG5hbWUpCV9fdTMyIG5hbWU7Ci0jZGVmaW5lIF9fUkVHMV8xKG5hbWUpCi0KLSNkZWZpbmUgX19SRUcyXzAobixzLGEpCV9fdTMyIG5hbWU7Ci0jZGVmaW5lIF9fUkVHMl8xKG4scyxhKQl1bnNpZ25lZCBjaGFyIG5bc10gX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQoYSkpKTsKLSNkZWZpbmUgX19SRUcyXzIobixzLGEpIHVuc2lnbmVkIGNoYXIgbltzXSBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZChhKSkpOwotCi10eXBlZGVmIHN0cnVjdCB7IFhDSEFMX05DUF9TQV9MSVNUKDApIH0geHRyZWdzX29wdF90Ci0JX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQgKFhDSEFMX05DUF9TQV9BTElHTikpKTsKLXR5cGVkZWYgc3RydWN0IHsgWENIQUxfTkNQX1NBX0xJU1QoMSkgfSB4dHJlZ3NfdXNlcl90Ci0JX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQgKFhDSEFMX05DUF9TQV9BTElHTikpKTsKLQotI2lmIFhURU5TQV9IQVZFX0NPUFJPQ0VTU09SUwotCi10eXBlZGVmIHN0cnVjdCB7IFhDSEFMX0NQMF9TQV9MSVNUKDIpIH0geHRyZWdzX2NwMF90Ci0JX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQgKFhDSEFMX0NQMF9TQV9BTElHTikpKTsKLXR5cGVkZWYgc3RydWN0IHsgWENIQUxfQ1AxX1NBX0xJU1QoMikgfSB4dHJlZ3NfY3AxX3QKLQlfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCAoWENIQUxfQ1AxX1NBX0FMSUdOKSkpOwotdHlwZWRlZiBzdHJ1Y3QgeyBYQ0hBTF9DUDJfU0FfTElTVCgyKSB9IHh0cmVnc19jcDJfdAotCV9fYXR0cmlidXRlX18gKChhbGlnbmVkIChYQ0hBTF9DUDJfU0FfQUxJR04pKSk7Ci10eXBlZGVmIHN0cnVjdCB7IFhDSEFMX0NQM19TQV9MSVNUKDIpIH0geHRyZWdzX2NwM190Ci0JX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQgKFhDSEFMX0NQM19TQV9BTElHTikpKTsKLXR5cGVkZWYgc3RydWN0IHsgWENIQUxfQ1A0X1NBX0xJU1QoMikgfSB4dHJlZ3NfY3A0X3QKLQlfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCAoWENIQUxfQ1A0X1NBX0FMSUdOKSkpOwotdHlwZWRlZiBzdHJ1Y3QgeyBYQ0hBTF9DUDVfU0FfTElTVCgyKSB9IHh0cmVnc19jcDVfdAotCV9fYXR0cmlidXRlX18gKChhbGlnbmVkIChYQ0hBTF9DUDVfU0FfQUxJR04pKSk7Ci10eXBlZGVmIHN0cnVjdCB7IFhDSEFMX0NQNl9TQV9MSVNUKDIpIH0geHRyZWdzX2NwNl90Ci0JX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQgKFhDSEFMX0NQNl9TQV9BTElHTikpKTsKLXR5cGVkZWYgc3RydWN0IHsgWENIQUxfQ1A3X1NBX0xJU1QoMikgfSB4dHJlZ3NfY3A3X3QKLQlfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCAoWENIQUxfQ1A3X1NBX0FMSUdOKSkpOwotCi1leHRlcm4gc3RydWN0IHRocmVhZF9pbmZvKiBjb3Byb2Nlc3Nvcl9vd25lcltYQ0hBTF9DUF9NQVhdOwotZXh0ZXJuIHZvaWQgY29wcm9jZXNzb3Jfc2F2ZSh2b2lkKiwgaW50KTsKLWV4dGVybiB2b2lkIGNvcHJvY2Vzc29yX2xvYWQodm9pZCosIGludCk7Ci1leHRlcm4gdm9pZCBjb3Byb2Nlc3Nvcl9mbHVzaChzdHJ1Y3QgdGhyZWFkX2luZm8qLCBpbnQpOwotZXh0ZXJuIHZvaWQgY29wcm9jZXNzb3JfcmVzdG9yZShzdHJ1Y3QgdGhyZWFkX2luZm8qLCBpbnQpOwotCi1leHRlcm4gdm9pZCBjb3Byb2Nlc3Nvcl9yZWxlYXNlX2FsbChzdHJ1Y3QgdGhyZWFkX2luZm8qKTsKLWV4dGVybiB2b2lkIGNvcHJvY2Vzc29yX2ZsdXNoX2FsbChzdHJ1Y3QgdGhyZWFkX2luZm8qKTsKLQotc3RhdGljIGlubGluZSB2b2lkIGNvcHJvY2Vzc29yX2NsZWFyX2NwZW5hYmxlKHZvaWQpCi17Ci0JdW5zaWduZWQgbG9uZyBpID0gMDsKLQlXU1JfQ1BFTkFCTEUoaSk7Ci19Ci0KLSNlbmRpZgkvKiBYVEVOU0FfSEFWRV9DT1BST0NFU1NPUlMgKi8KLQotI2VuZGlmCS8qICFfX0FTU0VNQkxZX18gKi8KLSNlbmRpZgkvKiBfWFRFTlNBX0NPUFJPQ0VTU09SX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9pcnEuaCBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9pcnEuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM3M2I3Zi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FzbS14dGVuc2EvaXJxLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKgotICogaW5jbHVkZS9hc20teHRlbnNhL2lycS5oCi0gKgotICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKLSAqIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDAxIC0gMjAwNSBUZW5zaWxpY2EgSW5jLgotICovCi0KLSNpZm5kZWYgX1hURU5TQV9JUlFfSAotI2RlZmluZSBfWFRFTlNBX0lSUV9ICi0KLSNpbmNsdWRlIDxhc20vcGxhdGZvcm0vaGFyZHdhcmUuaD4KLSNpbmNsdWRlIDxhc20vdmFyaWFudC9jb3JlLmg+Ci0KLSNpZm5kZWYgUExBVEZPUk1fTlJfSVJRUwotIyBkZWZpbmUgUExBVEZPUk1fTlJfSVJRUyAwCi0jZW5kaWYKLSNkZWZpbmUgWFRFTlNBX05SX0lSUVMgWENIQUxfTlVNX0lOVEVSUlVQVFMKLSNkZWZpbmUgTlJfSVJRUyAoWFRFTlNBX05SX0lSUVMgKyBQTEFURk9STV9OUl9JUlFTKQotCi1zdGF0aWMgX19pbmxpbmVfXyBpbnQgaXJxX2Nhbm9uaWNhbGl6ZShpbnQgaXJxKQotewotCXJldHVybiAoaXJxKTsKLX0KLQotc3RydWN0IGlycWFjdGlvbjsKLQotI2VuZGlmCS8qIF9YVEVOU0FfSVJRX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9wbGF0Zm9ybS5oIGIvaW5jbHVkZS9hc20teHRlbnNhL3BsYXRmb3JtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4MTM1YTkuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hc20teHRlbnNhL3BsYXRmb3JtLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKgotICogaW5jbHVkZS9hc20teHRlbnNhL3BsYXRmb3JtLmgKLSAqCi0gKiBQbGF0Zm9ybSBzcGVjaWZpYyBmdW5jdGlvbnMKLSAqCi0gKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsCi0gKiBQdWJsaWMgTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mCi0gKiB0aGlzIGFyY2hpdmUgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDEgLSAyMDA1IFRlbnNpbGljYSBJbmMuCi0gKi8KLQotI2lmbmRlZiBfWFRFTlNBX1BMQVRGT1JNX0gKLSNkZWZpbmUgX1hURU5TQV9QTEFURk9STV9ICi0KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotCi0jaW5jbHVkZSA8YXNtL2Jvb3RwYXJhbS5oPgotCi0vKgotICogcGxhdGZvcm1faW5pdCBpcyBjYWxsZWQgYmVmb3JlIHRoZSBtbXUgaXMgaW5pdGlhbGl6ZWQgdG8gZ2l2ZSB0aGUKLSAqIHBsYXRmb3JtIGEgZWFybHkgaG9vay11cC4gYnBfdGFnX3QgaXMgYSBsaXN0IG9mIGNvbmZpZ3VyYXRpb24gdGFncwotICogcGFzc2VkIGZyb20gdGhlIGJvb3QtbG9hZGVyLgotICovCi1leHRlcm4gdm9pZCBwbGF0Zm9ybV9pbml0KGJwX3RhZ190Kik7Ci0KLS8qCi0gKiBwbGF0Zm9ybV9zZXR1cCBpcyBjYWxsZWQgZnJvbSBzZXR1cF9hcmNoIHdpdGggYSBwb2ludGVyIHRvIHRoZSBjb21tYW5kLWxpbmUKLSAqIHN0cmluZy4KLSAqLwotZXh0ZXJuIHZvaWQgcGxhdGZvcm1fc2V0dXAgKGNoYXIgKiopOwotCi0vKgotICogcGxhdGZvcm1faW5pdF9pcnEgaXMgY2FsbGVkIGZyb20gaW5pdF9JUlEuCi0gKi8KLWV4dGVybiB2b2lkIHBsYXRmb3JtX2luaXRfaXJxICh2b2lkKTsKLQotLyoKLSAqIHBsYXRmb3JtX3Jlc3RhcnQgaXMgY2FsbGVkIHRvIHJlc3RhcnQgdGhlIHN5c3RlbS4KLSAqLwotZXh0ZXJuIHZvaWQgcGxhdGZvcm1fcmVzdGFydCAodm9pZCk7Ci0KLS8qCi0gKiBwbGF0Zm9ybV9oYWx0IGlzIGNhbGxlZCB0byBzdG9wIHRoZSBzeXN0ZW0gYW5kIGhhbHQuCi0gKi8KLWV4dGVybiB2b2lkIHBsYXRmb3JtX2hhbHQgKHZvaWQpOwotCi0vKgotICogcGxhdGZvcm1fcG93ZXJfb2ZmIGlzIGNhbGxlZCB0byBzdG9wIHRoZSBzeXN0ZW0gYW5kIHBvd2VyIGl0IG9mZi4KLSAqLwotZXh0ZXJuIHZvaWQgcGxhdGZvcm1fcG93ZXJfb2ZmICh2b2lkKTsKLQotLyoKLSAqIHBsYXRmb3JtX2lkbGUgaXMgY2FsbGVkIGZyb20gdGhlIGlkbGUgZnVuY3Rpb24uCi0gKi8KLWV4dGVybiB2b2lkIHBsYXRmb3JtX2lkbGUgKHZvaWQpOwotCi0vKgotICogcGxhdGZvcm1faGVhcnRiZWF0IGlzIGNhbGxlZCBldmVyeSBIWgotICovCi1leHRlcm4gdm9pZCBwbGF0Zm9ybV9oZWFydGJlYXQgKHZvaWQpOwotCi0vKgotICogcGxhdGZvcm1fcGNpYmlvc19pbml0IGlzIGNhbGxlZCB0byBhbGxvdyB0aGUgcGxhdGZvcm0gdG8gc2V0dXAgdGhlIHBjaSBidXMuCi0gKi8KLWV4dGVybiB2b2lkIHBsYXRmb3JtX3BjaWJpb3NfaW5pdCAodm9pZCk7Ci0KLS8qCi0gKiBwbGF0Zm9ybV9wY2liaW9zX2ZpeHVwIGFsbG93cyB0byBtb2RpZnkgdGhlIFBDSSBjb25maWd1cmF0aW9uLgotICovCi1leHRlcm4gaW50IHBsYXRmb3JtX3BjaWJpb3NfZml4dXAgKHZvaWQpOwotCi0vKgotICogcGxhdGZvcm1fY2FsaWJyYXRlX2Njb3VudCBjYWxpYnJhdGVzIGNwdSBjbG9jayBmcmVxIChDT05GSUdfWFRFTlNBX0NBTElCUkFURSkKLSAqLwotZXh0ZXJuIHZvaWQgcGxhdGZvcm1fY2FsaWJyYXRlX2Njb3VudCAodm9pZCk7Ci0KLS8qCi0gKiBwbGF0Zm9ybV9nZXRfcnRjX3RpbWUgcmV0dXJucyBSVEMgc2Vjb25kcyAocmV0dXJucyAwIGZvciBubyBlcnJvcikKLSAqLwotZXh0ZXJuIGludCBwbGF0Zm9ybV9nZXRfcnRjX3RpbWUodGltZV90Kik7Ci0KLS8qCi0gKiBwbGF0Zm9ybV9zZXRfcnRjX3RpbWUgc2V0IFJUQyBzZWNvbmRzIChyZXR1cm5zIDAgZm9yIG5vIGVycm9yKQotICovCi1leHRlcm4gaW50IHBsYXRmb3JtX3NldF9ydGNfdGltZSh0aW1lX3QpOwotCi0KLSNlbmRpZgkvKiBfWFRFTlNBX1BMQVRGT1JNX0ggKi8KLQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL3Byb2Nlc3Nvci5oIGIvaW5jbHVkZS9hc20teHRlbnNhL3Byb2Nlc3Nvci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTE4YTRlLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9wcm9jZXNzb3IuaAorKysgL2Rldi9udWxsCkBAIC0xLDE5MyArMCwwIEBACi0vKgotICogaW5jbHVkZS9hc20teHRlbnNhL3Byb2Nlc3Nvci5oCi0gKgotICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKLSAqIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDAxIC0gMjAwNSBUZW5zaWxpY2EgSW5jLgotICovCi0KLSNpZm5kZWYgX1hURU5TQV9QUk9DRVNTT1JfSAotI2RlZmluZSBfWFRFTlNBX1BST0NFU1NPUl9ICi0KLSNpbmNsdWRlIDxhc20vdmFyaWFudC9jb3JlLmg+Ci0jaW5jbHVkZSA8YXNtL2NvcHJvY2Vzc29yLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgotI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KLSNpbmNsdWRlIDxhc20vdHlwZXMuaD4KLSNpbmNsdWRlIDxhc20vcmVncy5oPgotCi0vKiBBc3NlcnRpb25zLiAqLwotCi0jaWYgKFhDSEFMX0hBVkVfV0lORE9XRUQgIT0gMSkKLSMgZXJyb3IgTGludXggcmVxdWlyZXMgdGhlIFh0ZW5zYSBXaW5kb3dlZCBSZWdpc3RlcnMgT3B0aW9uLgotI2VuZGlmCi0KLS8qCi0gKiBVc2VyIHNwYWNlIHByb2Nlc3Mgc2l6ZTogMSBHQi4KLSAqIFdpbmRvd2VkIGNhbGwgQUJJIHJlcXVpcmVzIGNhbGxlciBhbmQgY2FsbGVlIHRvIGJlIGxvY2F0ZWQgd2l0aGluIHRoZSBzYW1lCi0gKiAxIEdCIHJlZ2lvbi4gVGhlIEMgY29tcGlsZXIgcGxhY2VzIHRyYW1wb2xpbmUgY29kZSBvbiB0aGUgc3RhY2sgZm9yIHNvdXJjZXMKLSAqIHRoYXQgdGFrZSB0aGUgYWRkcmVzcyBvZiBhIG5lc3RlZCBDIGZ1bmN0aW9uIChhIGZlYXR1cmUgdXNlZCBieSBnbGliYyksIHNvCi0gKiB0aGUgMSBHQiByZXF1aXJlbWVudCBhcHBsaWVzIHRvIHRoZSBzdGFjayBhcyB3ZWxsLgotICovCi0KLSNkZWZpbmUgVEFTS19TSVpFCV9fWFRFTlNBX1VMX0NPTlNUKDB4NDAwMDAwMDApCi0jZGVmaW5lIFNUQUNLX1RPUAlUQVNLX1NJWkUKLSNkZWZpbmUgU1RBQ0tfVE9QX01BWAlTVEFDS19UT1AKLQotLyoKLSAqIEdlbmVyYWwgZXhjZXB0aW9uIGNhdXNlIGFzc2lnbmVkIHRvIGRlYnVnIGV4Y2VwdGlvbnMuIERlYnVnIGV4Y2VwdGlvbnMgZ28KLSAqIHRvIHRoZWlyIG93biB2ZWN0b3IsIHJhdGhlciB0aGFuIHRoZSBnZW5lcmFsIGV4Y2VwdGlvbiB2ZWN0b3JzICh1c2VyLAotICoga2VybmVsLCBkb3VibGUpOyBhbmQgdGhlaXIgc3BlY2lmaWMgY2F1c2VzIGFyZSByZXBvcnRlZCB2aWEgREVCVUdDQVVTRQotICogcmF0aGVyIHRoYW4gRVhDQ0FVU0UuICBIb3dldmVyIGl0IGlzIHNvbWV0aW1lcyBjb252ZW5pZW50IHRvIHJlZGlyZWN0IGRlYnVnCi0gKiBleGNlcHRpb25zIHRvIHRoZSBnZW5lcmFsIGV4Y2VwdGlvbiBtZWNoYW5pc20uICBUbyBkbyB0aGlzLCBhbiBvdGhlcndpc2UKLSAqIHVudXNlZCBFWENDQVVTRSB2YWx1ZSB3YXMgYXNzaWduZWQgdG8gZGVidWcgZXhjZXB0aW9ucyBmb3IgdGhpcyBwdXJwb3NlLgotICovCi0KLSNkZWZpbmUgRVhDQ0FVU0VfTUFQUEVEX0RFQlVHCTYzCi0KLS8qCi0gKiBXZSB1c2UgREVQQyBhbHNvIGFzIGEgZmxhZyB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIGRvdWJsZSBhbmQgcmVndWxhcgotICogZXhjZXB0aW9ucy4gRm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMsIERFUEMgbWlnaHQgY29udGFpbiB0aGUgdmFsdWUgb2YKLSAqIEVYQ0NBVVNFIGZvciByZWd1bGFyIGV4Y2VwdGlvbnMsIHNvIHdlIHVzZSB0aGlzIGRlZmluaXRpb24gdG8gbWFyayBhCi0gKiB2YWxpZCBkb3VibGUgZXhjZXB0aW9uIGFkZHJlc3MuCi0gKiAoTm90ZTogV2UgdXNlIGl0IGluIGJnZXVpLCBzbyBpdCBzaG91bGQgYmUgNjQsIDEyOCwgb3IgMjU2KQotICovCi0KLSNkZWZpbmUgVkFMSURfRE9VQkxFX0VYQ0VQVElPTl9BRERSRVNTCTY0Ci0KLS8qIExPQ0tMRVZFTCBkZWZpbmVzIHRoZSBpbnRlcnJ1cHQgbGV2ZWwgdGhhdCBtYXNrcyBhbGwKLSAqIGdlbmVyYWwtcHVycG9zZSBpbnRlcnJ1cHRzLgotICovCi0jZGVmaW5lIExPQ0tMRVZFTCAxCi0KLS8qIFdTQklUUyBhbmQgV0JCSVRTIGFyZSB0aGUgd2lkdGggb2YgdGhlIFdJTkRPV1NUQVJUIGFuZCBXSU5ET1dCQVNFCi0gKiByZWdpc3RlcnMKLSAqLwotI2RlZmluZSBXU0JJVFMgIChYQ0hBTF9OVU1fQVJFR1MgLyA0KSAgICAgIC8qIHdpZHRoIG9mIFdJTkRPV1NUQVJUIGluIGJpdHMgKi8KLSNkZWZpbmUgV0JCSVRTICAoWENIQUxfTlVNX0FSRUdTX0xPRzIgLSAyKSAvKiB3aWR0aCBvZiBXSU5ET1dCQVNFIGluIGJpdHMgKi8KLQotI2lmbmRlZiBfX0FTU0VNQkxZX18KLQotLyogQnVpbGQgYSB2YWxpZCByZXR1cm4gYWRkcmVzcyBmb3IgdGhlIHNwZWNpZmllZCBjYWxsIHdpbnNpemUuCi0gKiB3aW5zaXplIG11c3QgYmUgMSAoY2FsbDQpLCAyIChjYWxsOCksIG9yIDMgKGNhbGwxMikKLSAqLwotI2RlZmluZSBNQUtFX1JBX0ZPUl9DQUxMKHJhLHdzKSAgICgoKHJhKSAmIDB4M2ZmZmZmZmYpIHwgKHdzKSA8PCAzMCkKLQotLyogQ29udmVydCByZXR1cm4gYWRkcmVzcyB0byBhIHZhbGlkIHBjCi0gKiBOb3RlOiBXZSBhc3N1bWUgdGhhdCB0aGUgc3RhY2sgcG9pbnRlciBpcyBpbiB0aGUgc2FtZSAxR0IgcmFuZ2VzIGFzIHRoZSByYQotICovCi0jZGVmaW5lIE1BS0VfUENfRlJPTV9SQShyYSxzcCkgICAgKCgocmEpICYgMHgzZmZmZmZmZikgfCAoKHNwKSAmIDB4YzAwMDAwMDApKQotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgdW5zaWduZWQgbG9uZyBzZWc7Ci19IG1tX3NlZ21lbnRfdDsKLQotc3RydWN0IHRocmVhZF9zdHJ1Y3QgewotCi0JLyoga2VybmVsJ3MgcmV0dXJuIGFkZHJlc3MgYW5kIHN0YWNrIHBvaW50ZXIgZm9yIGNvbnRleHQgc3dpdGNoaW5nICovCi0JdW5zaWduZWQgbG9uZyByYTsgLyoga2VybmVsJ3MgYTA6IHJldHVybiBhZGRyZXNzIGFuZCB3aW5kb3cgY2FsbCBzaXplICovCi0JdW5zaWduZWQgbG9uZyBzcDsgLyoga2VybmVsJ3MgYTE6IHN0YWNrIHBvaW50ZXIgKi8KLQotCW1tX3NlZ21lbnRfdCBjdXJyZW50X2RzOyAgICAvKiBzZWUgdWFjY2Vzcy5oIGZvciBleGFtcGxlIHVzZXMgKi8KLQotCS8qIHN0cnVjdCB4dGVuc2FfY3B1aW5mbyBpbmZvOyAqLwotCi0JdW5zaWduZWQgbG9uZyBiYWRfdmFkZHI7IC8qIGxhc3QgdXNlciBmYXVsdCAqLwotCXVuc2lnbmVkIGxvbmcgYmFkX3VhZGRyOyAvKiBsYXN0IGtlcm5lbCBmYXVsdCBhY2Nlc3NpbmcgdXNlciBzcGFjZSAqLwotCXVuc2lnbmVkIGxvbmcgZXJyb3JfY29kZTsKLQotCXVuc2lnbmVkIGxvbmcgaWJyZWFrW1hDSEFMX05VTV9JQlJFQUtdOwotCXVuc2lnbmVkIGxvbmcgZGJyZWFrYVtYQ0hBTF9OVU1fREJSRUFLXTsKLQl1bnNpZ25lZCBsb25nIGRicmVha2NbWENIQUxfTlVNX0RCUkVBS107Ci0KLQkvKiBNYWtlIHN0cnVjdHVyZSAxNiBieXRlcyBhbGlnbmVkLiAqLwotCWludCBhbGlnblswXSBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCgxNikpKTsKLX07Ci0KLQotLyoKLSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgbWFjcm8gdGhhdCByZXR1cm5zIGN1cnJlbnQKLSAqIGluc3RydWN0aW9uIHBvaW50ZXIgKCJwcm9ncmFtIGNvdW50ZXIiKS4KLSAqLwotI2RlZmluZSBjdXJyZW50X3RleHRfYWRkcigpICAoeyBfX2xhYmVsX18gX2w7IF9sOiAmJl9sO30pCi0KLQotLyogVGhpcyBkZWNpZGVzIHdoZXJlIHRoZSBrZXJuZWwgd2lsbCBzZWFyY2ggZm9yIGEgZnJlZSBjaHVuayBvZiB2bQotICogc3BhY2UgZHVyaW5nIG1tYXAncy4KLSAqLwotI2RlZmluZSBUQVNLX1VOTUFQUEVEX0JBU0UJKFRBU0tfU0laRSAvIDIpCi0KLSNkZWZpbmUgSU5JVF9USFJFQUQgIFwKLXsJCQkJCQkJCQlcCi0JcmE6CQkwLCAJCQkJCQlcCi0Jc3A6CQlzaXplb2YoaW5pdF9zdGFjaykgKyAobG9uZykgJmluaXRfc3RhY2ssCVwKLQljdXJyZW50X2RzOgl7MH0sCQkJCQkJXAotCS8qaW5mbzoJCXswfSwgKi8JCQkJCQlcCi0JYmFkX3ZhZGRyOgkwLAkJCQkJCVwKLQliYWRfdWFkZHI6CTAsCQkJCQkJXAotCWVycm9yX2NvZGU6CTAsCQkJCQkJXAotfQotCi0KLS8qCi0gKiBEbyBuZWNlc3Nhcnkgc2V0dXAgdG8gc3RhcnQgdXAgYSBuZXdseSBleGVjdXRlZCB0aHJlYWQuCi0gKiBOb3RlOiBXZSBzZXQtdXAgcHMgYXMgaWYgd2UgZGlkIGEgY2FsbDQgdG8gdGhlIG5ldyBwYy4KLSAqICAgICAgIHNldF90aHJlYWRfc3RhdGUgaW4gc2lnbmFsLmMgZGVwZW5kcyBvbiBpdC4KLSAqLwotI2RlZmluZSBVU0VSX1BTX1ZBTFVFICgoMSA8PCBQU19XT0VfQklUKSB8CQkJCVwKLSAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgUFNfQ0FMTElOQ19TSElGVCkgfAkJCVwKLSAgICAgICAgICAgICAgICAgICAgICAgKFVTRVJfUklORyA8PCBQU19SSU5HX1NISUZUKSB8CQkJXAotICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCBQU19VTV9CSVQpIHwJCQkJXAotICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCBQU19FWENNX0JJVCkpCi0KLS8qIENsZWFyaW5nIGEwIHRlcm1pbmF0ZXMgdGhlIGJhY2t0cmFjZS4gKi8KLSNkZWZpbmUgc3RhcnRfdGhyZWFkKHJlZ3MsIG5ld19wYywgbmV3X3NwKSBcCi0JcmVncy0+cGMgPSBuZXdfcGM7IFwKLQlyZWdzLT5wcyA9IFVTRVJfUFNfVkFMVUU7IFwKLQlyZWdzLT5hcmVnWzFdID0gbmV3X3NwOyBcCi0JcmVncy0+YXJlZ1swXSA9IDA7IFwKLQlyZWdzLT53bWFzayA9IDE7IFwKLQlyZWdzLT5kZXBjID0gMDsgXAotCXJlZ3MtPndpbmRvd2Jhc2UgPSAwOyBcCi0JcmVncy0+d2luZG93c3RhcnQgPSAxOwotCi0vKiBGb3J3YXJkIGRlY2xhcmF0aW9uICovCi1zdHJ1Y3QgdGFza19zdHJ1Y3Q7Ci1zdHJ1Y3QgbW1fc3RydWN0OwotCi0vKiBGcmVlIGFsbCByZXNvdXJjZXMgaGVsZCBieSBhIHRocmVhZC4gKi8KLSNkZWZpbmUgcmVsZWFzZV90aHJlYWQodGhyZWFkKSBkbyB7IH0gd2hpbGUoMCkKLQotLyogUHJlcGFyZSB0byBjb3B5IHRocmVhZCBzdGF0ZSAtIHVubGF6eSBhbGwgbGF6eSBzdGF0dXMgKi8KLWV4dGVybiB2b2lkIHByZXBhcmVfdG9fY29weShzdHJ1Y3QgdGFza19zdHJ1Y3QqKTsKLQotLyogQ3JlYXRlIGEga2VybmVsIHRocmVhZCB3aXRob3V0IHJlbW92aW5nIGl0IGZyb20gdGFza2xpc3RzICovCi1leHRlcm4gaW50IGtlcm5lbF90aHJlYWQoaW50ICgqZm4pKHZvaWQgKiksIHZvaWQgKiBhcmcsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOwotCi0vKiBDb3B5IGFuZCByZWxlYXNlIGFsbCBzZWdtZW50IGluZm8gYXNzb2NpYXRlZCB3aXRoIGEgVk0gKi8KLSNkZWZpbmUgY29weV9zZWdtZW50cyhwLCBtbSkJZG8geyB9IHdoaWxlKDApCi0jZGVmaW5lIHJlbGVhc2Vfc2VnbWVudHMobW0pCWRvIHsgfSB3aGlsZSgwKQotI2RlZmluZSBmb3JnZXRfc2VnbWVudHMoKQlkbyB7IH0gd2hpbGUgKDApCi0KLSNkZWZpbmUgdGhyZWFkX3NhdmVkX3BjKHRzaykJKHRhc2tfcHRfcmVncyh0c2spLT5wYykKLQotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgZ2V0X3djaGFuKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCk7Ci0KLSNkZWZpbmUgS1NUS19FSVAodHNrKQkJKHRhc2tfcHRfcmVncyh0c2spLT5wYykKLSNkZWZpbmUgS1NUS19FU1AodHNrKQkJKHRhc2tfcHRfcmVncyh0c2spLT5hcmVnWzFdKQotCi0jZGVmaW5lIGNwdV9yZWxheCgpICBiYXJyaWVyKCkKLQotLyogU3BlY2lhbCByZWdpc3RlciBhY2Nlc3MuICovCi0KLSNkZWZpbmUgV1NSKHYsc3IpIF9fYXNtX18gX192b2xhdGlsZV9fICgid3NyICUwLCJfX3N0cmluZ2lmeShzcikgOjogImEiKHYpKTsKLSNkZWZpbmUgUlNSKHYsc3IpIF9fYXNtX18gX192b2xhdGlsZV9fICgicnNyICUwLCJfX3N0cmluZ2lmeShzcikgOiAiPWEiKHYpKTsKLQotI2RlZmluZSBzZXRfc3IoeCxzcikgKHt1bnNpZ25lZCBpbnQgdj0odW5zaWduZWQgaW50KXg7IFdTUih2LHNyKTt9KQotI2RlZmluZSBnZXRfc3Ioc3IpICh7dW5zaWduZWQgaW50IHY7IFJTUih2LHNyKTsgdjsgfSkKLQotI2VuZGlmCS8qIF9fQVNTRU1CTFlfXyAqLwotI2VuZGlmCS8qIF9YVEVOU0FfUFJPQ0VTU09SX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9wdHJhY2UuaCBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9wdHJhY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDg5YjBkYi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FzbS14dGVuc2EvcHRyYWNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyoKLSAqIGluY2x1ZGUvYXNtLXh0ZW5zYS9wdHJhY2UuaAotICoKLSAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCi0gKiBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIENvcHlyaWdodCAoQykgMjAwMSAtIDIwMDUgVGVuc2lsaWNhIEluYy4KLSAqLwotCi0jaWZuZGVmIF9YVEVOU0FfUFRSQUNFX0gKLSNkZWZpbmUgX1hURU5TQV9QVFJBQ0VfSAotCi0vKgotICogS2VybmVsIHN0YWNrCi0gKgotICogCQkrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rICAtLS0tLS0tLSBTVEFDS19TSVpFCi0gKiAJCXwgICAgIHJlZ2lzdGVyIGZpbGUgICAgIHwgIHwKLSAqIAkJKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKyAgfAotICogCQl8ICAgIHN0cnVjdCBwdF9yZWdzICAgICB8ICB8Ci0gKiAJCSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsgIHwgLS0tLS0tIFBUX1JFR1NfT0ZGU0VUCi0gKiBkb3VibGUgCTogIDE2IGJ5dGVzIHNwaWxsIGFyZWEgIDogIHwgIF4KLSAqIGV4Y2V0aW9uIAk6LSAtIC0gLSAtIC0gLSAtIC0gLSAtIC06ICB8ICB8Ci0gKiBmcmFtZQk6ICAgIHN0cnVjdCBwdF9yZWdzICAgICA6ICB8ICB8Ci0gKiAJCTotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLTogIHwgIHwKLSAqIAkJfCAgICAgICAgICAgICAgICAgICAgICAgfCAgfCAgfAotICogCQl8ICAgICBtZW1vcnkgc3RhY2sgICAgICB8ICB8ICB8Ci0gKiAJCXwgICAgICAgICAgICAgICAgICAgICAgIHwgIHwgIHwKLSAqIAkJfiAgICAgICAgICAgICAgICAgICAgICAgfiAgfiAgfgotICogCQl+ICAgICAgICAgICAgICAgICAgICAgICB+ICB+ICB+Ci0gKiAJCXwgICAgICAgICAgICAgICAgICAgICAgIHwgIHwgIHwKLSAqIAkJfCAgICAgICAgICAgICAgICAgICAgICAgfCAgfCAgfAotICogCQkrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rICB8ICB8IC0tLSBTVEFDS19CSUFTCi0gKiAJCXwgIHN0cnVjdCB0YXNrX3N0cnVjdCAgIHwgIHwgIHwgIF4KLSAqICBjdXJyZW50IC0tPiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rICB8ICB8ICB8Ci0gKiAJCXwgIHN0cnVjdCB0aHJlYWRfaW5mbyAgIHwgIHwgIHwgIHwKLSAqCQkrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rIC0tLS0tLS0tCi0gKi8KLQotI2RlZmluZSBLRVJORUxfU1RBQ0tfU0laRSAoMiAqIFBBR0VfU0laRSkKLQotLyogIE9mZnNldHMgZm9yIGV4Y2VwdGlvbl9oYW5kbGVyc1tdICgzIHggNjQtZW50cmllcyB4IDQtYnl0ZSB0YWJsZXMpLiAqLwotCi0jZGVmaW5lIEVYQ19UQUJMRV9LU1RLCQkweDAwNAkvKiBLZXJuZWwgU3RhY2sgKi8KLSNkZWZpbmUgRVhDX1RBQkxFX0RPVUJMRV9TQVZFCTB4MDA4CS8qIERvdWJsZSBleGNlcHRpb24gc2F2ZSBhcmVhIGZvciBhMCAqLwotI2RlZmluZSBFWENfVEFCTEVfRklYVVAJCTB4MDBjCS8qIEZpeHVwIGhhbmRsZXIgKi8KLSNkZWZpbmUgRVhDX1RBQkxFX1BBUkFNCQkweDAxMAkvKiBGb3IgcGFzc2luZyBhIHBhcmFtZXRlciB0byBmaXh1cCAqLwotI2RlZmluZSBFWENfVEFCTEVfU1lTQ0FMTF9TQVZFCTB4MDE0CS8qIEZvciBmYXN0IHN5c2NhbGwgaGFuZGxlciAqLwotI2RlZmluZSBFWENfVEFCTEVfRkFTVF9VU0VSCTB4MTAwCS8qIEZhc3QgdXNlciBleGNlcHRpb24gaGFuZGxlciAqLwotI2RlZmluZSBFWENfVEFCTEVfRkFTVF9LRVJORUwJMHgyMDAJLyogRmFzdCBrZXJuZWwgZXhjZXB0aW9uIGhhbmRsZXIgKi8KLSNkZWZpbmUgRVhDX1RBQkxFX0RFRkFVTFQJMHgzMDAJLyogRGVmYXVsdCBDLUhhbmRsZXIgKi8KLSNkZWZpbmUgRVhDX1RBQkxFX1NJWkUJCTB4NDAwCi0KLS8qIFJlZ2lzdGVycyB1c2VkIGJ5IHN0cmFjZSAqLwotCi0jZGVmaW5lIFJFR19BX0JBU0UJMHgwMDAwCi0jZGVmaW5lIFJFR19BUl9CQVNFCTB4MDEwMAotI2RlZmluZSBSRUdfUEMJCTB4MDAyMAotI2RlZmluZSBSRUdfUFMJCTB4MDJlNgotI2RlZmluZSBSRUdfV0IJCTB4MDI0OAotI2RlZmluZSBSRUdfV1MJCTB4MDI0OQotI2RlZmluZSBSRUdfTEJFRwkweDAyMDAKLSNkZWZpbmUgUkVHX0xFTkQJMHgwMjAxCi0jZGVmaW5lIFJFR19MQ09VTlQJMHgwMjAyCi0jZGVmaW5lIFJFR19TQVIJCTB4MDIwMwotCi0jZGVmaW5lIFNZU0NBTExfTlIJMHgwMGZmCi0KLS8qIE90aGVyIFBUUkFDRV8gdmFsdWVzIGRlZmluZWQgaW4gPGxpbnV4L3B0cmFjZS5oPiB1c2luZyB2YWx1ZXMgMC05LDE2LDE3LDI0ICovCi0KLSNkZWZpbmUgUFRSQUNFX0dFVFJFR1MJCTEyCi0jZGVmaW5lIFBUUkFDRV9TRVRSRUdTCQkxMwotI2RlZmluZSBQVFJBQ0VfR0VUWFRSRUdTCTE4Ci0jZGVmaW5lIFBUUkFDRV9TRVRYVFJFR1MJMTkKLQotI2lmZGVmIF9fS0VSTkVMX18KLQotI2lmbmRlZiBfX0FTU0VNQkxZX18KLQotLyoKLSAqIFRoaXMgc3RydWN0IGRlZmluZXMgdGhlIHdheSB0aGUgcmVnaXN0ZXJzIGFyZSBzdG9yZWQgb24gdGhlCi0gKiBrZXJuZWwgc3RhY2sgZHVyaW5nIGEgc3lzdGVtIGNhbGwgb3Igb3RoZXIga2VybmVsIGVudHJ5LgotICovCi1zdHJ1Y3QgcHRfcmVncyB7Ci0JdW5zaWduZWQgbG9uZyBwYzsJCS8qICAgNCAqLwotCXVuc2lnbmVkIGxvbmcgcHM7CQkvKiAgIDggKi8KLQl1bnNpZ25lZCBsb25nIGRlcGM7CQkvKiAgMTIgKi8KLQl1bnNpZ25lZCBsb25nIGV4Y2NhdXNlOwkJLyogIDE2ICovCi0JdW5zaWduZWQgbG9uZyBleGN2YWRkcjsJCS8qICAyMCAqLwotCXVuc2lnbmVkIGxvbmcgZGVidWdjYXVzZTsJLyogIDI0ICovCi0JdW5zaWduZWQgbG9uZyB3bWFzazsJCS8qICAyOCAqLwotCXVuc2lnbmVkIGxvbmcgbGJlZzsJCS8qICAzMiAqLwotCXVuc2lnbmVkIGxvbmcgbGVuZDsJCS8qICAzNiAqLwotCXVuc2lnbmVkIGxvbmcgbGNvdW50OwkJLyogIDQwICovCi0JdW5zaWduZWQgbG9uZyBzYXI7CQkvKiAgNDQgKi8KLQl1bnNpZ25lZCBsb25nIHdpbmRvd2Jhc2U7CS8qICA0OCAqLwotCXVuc2lnbmVkIGxvbmcgd2luZG93c3RhcnQ7CS8qICA1MiAqLwotCXVuc2lnbmVkIGxvbmcgc3lzY2FsbDsJCS8qICA1NiAqLwotCXVuc2lnbmVkIGxvbmcgaWNvdW50bGV2ZWw7CS8qICA2MCAqLwotCWludCByZXNlcnZlZFsxXTsJCS8qICA2NCAqLwotCi0JLyogQWRkaXRpb25hbCBjb25maWd1cmFibGUgcmVnaXN0ZXJzIHRoYXQgYXJlIHVzZWQgYnkgdGhlIGNvbXBpbGVyLiAqLwotCXh0cmVnc19vcHRfdCB4dHJlZ3Nfb3B0OwotCi0JLyogTWFrZSBzdXJlIHRoZSBhcmVnIGZpZWxkIGlzIDE2IGJ5dGVzIGFsaWduZWQuICovCi0JaW50IGFsaWduWzBdIF9fYXR0cmlidXRlX18gKChhbGlnbmVkKDE2KSkpOwotCi0JLyogY3VycmVudCByZWdpc3RlciBmcmFtZS4KLQkgKiBOb3RlOiBUaGUgRVNGIGZvciBrZXJuZWwgZXhjZXB0aW9ucyBlbmRzIGFmdGVyIDE2IHJlZ2lzdGVycyEKLQkgKi8KLQl1bnNpZ25lZCBsb25nIGFyZWdbMTZdOwkJLyogMTI4ICg2NCkgKi8KLX07Ci0KLSNpbmNsdWRlIDxhc20vdmFyaWFudC9jb3JlLmg+Ci0KLSMgZGVmaW5lIHRhc2tfcHRfcmVncyh0c2spICgoc3RydWN0IHB0X3JlZ3MqKSBcCi0gICh0YXNrX3N0YWNrX3BhZ2UodHNrKSArIEtFUk5FTF9TVEFDS19TSVpFIC0gKFhDSEFMX05VTV9BUkVHUy0xNikqNCkgLSAxKQotIyBkZWZpbmUgdXNlcl9tb2RlKHJlZ3MpICgoKHJlZ3MpLT5wcyAmIDB4MDAwMDAwMjApIT0wKQotIyBkZWZpbmUgaW5zdHJ1Y3Rpb25fcG9pbnRlcihyZWdzKSAoKHJlZ3MpLT5wYykKLWV4dGVybiB2b2lkIHNob3dfcmVncyhzdHJ1Y3QgcHRfcmVncyAqKTsKLQotIyBpZm5kZWYgQ09ORklHX1NNUAotIyAgZGVmaW5lIHByb2ZpbGVfcGMocmVncykgaW5zdHJ1Y3Rpb25fcG9pbnRlcihyZWdzKQotIyBlbmRpZgotCi0jZWxzZQkvKiBfX0FTU0VNQkxZX18gKi8KLQotIyBpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KLSNkZWZpbmUgUFRfUkVHU19PRkZTRVQJICAoS0VSTkVMX1NUQUNLX1NJWkUgLSBQVF9VU0VSX1NJWkUpCi0KLSNlbmRpZgkvKiAhX19BU1NFTUJMWV9fICovCi0KLSNlbmRpZiAgLyogX19LRVJORUxfXyAqLwotCi0jZW5kaWYJLyogX1hURU5TQV9QVFJBQ0VfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL3NlcmlhbC5oIGIvaW5jbHVkZS9hc20teHRlbnNhL3NlcmlhbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzA0MTE0Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9zZXJpYWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS8qCi0gKiBpbmNsdWRlL2FzbS14dGVuc2Evc2VyaWFsLmgKLSAqCi0gKiBDb25maWd1cmF0aW9uIGRldGFpbHMgZm9yIDgyNTAsIDE2NDUwLCAxNjU1MCwgZXRjLiBzZXJpYWwgcG9ydHMKLSAqCi0gKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQotICogZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDEgLSAyMDA1IFRlbnNpbGljYSBJbmMuCi0gKi8KLQotI2lmbmRlZiBfWFRFTlNBX1NFUklBTF9ICi0jZGVmaW5lIF9YVEVOU0FfU0VSSUFMX0gKLQotI2luY2x1ZGUgPGFzbS9wbGF0Zm9ybS9zZXJpYWwuaD4KLQotI2VuZGlmCS8qIF9YVEVOU0FfU0VSSUFMX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS91bmFsaWduZWQuaCBiL2luY2x1ZGUvYXNtLXh0ZW5zYS91bmFsaWduZWQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGYzNDI0Zi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FzbS14dGVuc2EvdW5hbGlnbmVkLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKgotICogWHRlbnNhIGRvZXNuJ3QgaGFuZGxlIHVuYWxpZ25lZCBhY2Nlc3NlcyBlZmZpY2llbnRseS4KLSAqCi0gKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQotICogZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDEgLSAyMDA1IFRlbnNpbGljYSBJbmMuCi0gKi8KLSNpZm5kZWYgX0FTTV9YVEVOU0FfVU5BTElHTkVEX0gKLSNkZWZpbmUgX0FTTV9YVEVOU0FfVU5BTElHTkVEX0gKLQotI2lmZGVmIF9fWFRFTlNBX0VMX18KLSMgaW5jbHVkZSA8bGludXgvdW5hbGlnbmVkL2xlX21lbW1vdmUuaD4KLSMgaW5jbHVkZSA8bGludXgvdW5hbGlnbmVkL2JlX2J5dGVzaGlmdC5oPgotIyBpbmNsdWRlIDxsaW51eC91bmFsaWduZWQvZ2VuZXJpYy5oPgotIyBkZWZpbmUgZ2V0X3VuYWxpZ25lZAlfX2dldF91bmFsaWduZWRfbGUKLSMgZGVmaW5lIHB1dF91bmFsaWduZWQJX19wdXRfdW5hbGlnbmVkX2xlCi0jZWxpZiBkZWZpbmVkKF9fWFRFTlNBX0VCX18pCi0jIGluY2x1ZGUgPGxpbnV4L3VuYWxpZ25lZC9iZV9tZW1tb3ZlLmg+Ci0jIGluY2x1ZGUgPGxpbnV4L3VuYWxpZ25lZC9sZV9ieXRlc2hpZnQuaD4KLSMgaW5jbHVkZSA8bGludXgvdW5hbGlnbmVkL2dlbmVyaWMuaD4KLSMgZGVmaW5lIGdldF91bmFsaWduZWQJX19nZXRfdW5hbGlnbmVkX2JlCi0jIGRlZmluZSBwdXRfdW5hbGlnbmVkCV9fcHV0X3VuYWxpZ25lZF9iZQotI2Vsc2UKLSMgZXJyb3IgcHJvY2Vzc29yIGJ5dGUgb3JkZXIgdW5kZWZpbmVkIQotI2VuZGlmCi0KLSNlbmRpZgkvKiBfQVNNX1hURU5TQV9VTkFMSUdORURfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9LYnVpbGQgYi9pbmNsdWRlL2xpbnV4L0tidWlsZAppbmRleCA5NWFjODIzLi4xMmU5YTI5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L0tidWlsZAorKysgYi9pbmNsdWRlL2xpbnV4L0tidWlsZApAQCAtNTYsOCArNTYsNiBAQAogaGVhZGVyLXkgKz0gZGxtX25ldGxpbmsuaAogaGVhZGVyLXkgKz0gZG0taW9jdGwuaAogaGVhZGVyLXkgKz0gZG4uaAotaGVhZGVyLXkgKz0gZHFibGtfdjEuaAotaGVhZGVyLXkgKz0gZHFibGtfdjIuaAogaGVhZGVyLXkgKz0gZHFibGtfeGZzLmgKIGhlYWRlci15ICs9IGVmc19mc19zYi5oCiBoZWFkZXIteSArPSBlbGYtZmRwaWMuaApAQCAtMTM0LDggKzEzMiw2IEBACiBoZWFkZXIteSArPSBwcGRldi5oCiBoZWFkZXIteSArPSBwcmN0bC5oCiBoZWFkZXIteSArPSBxbnh0eXBlcy5oCi1oZWFkZXIteSArPSBxdW90YWlvX3YxLmgKLWhlYWRlci15ICs9IHF1b3RhaW9fdjIuaAogaGVhZGVyLXkgKz0gcmFkZW9uZmIuaAogaGVhZGVyLXkgKz0gcmF3LmgKIGhlYWRlci15ICs9IHJlc291cmNlLmgKQEAgLTE4Myw3ICsxNzksNiBAQAogdW5pZmRlZi15ICs9IGF1eHZlYy5oCiB1bmlmZGVmLXkgKz0gYmluZm10cy5oCiB1bmlmZGVmLXkgKz0gYmxrdHJhY2VfYXBpLmgKLXVuaWZkZWYteSArPSBieXRlb3JkZXIuaAogdW5pZmRlZi15ICs9IGNhcGFiaWxpdHkuaAogdW5pZmRlZi15ICs9IGNhcGkuaAogdW5pZmRlZi15ICs9IGNjaXNzX2lvY3RsLmgKQEAgLTM3NiwzICszNzEsNSBAQAogdW5pZmRlZi15ICs9IHhmcm0uaAogCiBvYmpoZHIteSArPSB2ZXJzaW9uLmgKK2hlYWRlci15ICs9IHdpbWF4LmgKK2hlYWRlci15ICs9IHdpbWF4LwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9hc3luYy5oIGIvaW5jbHVkZS9saW51eC9hc3luYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0ZWNhY2QKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L2FzeW5jLmgKQEAgLTAsMCArMSwyNSBAQAorLyoKKyAqIGFzeW5jLmg6IEFzeW5jaHJvbm91cyBmdW5jdGlvbiBjYWxscyBmb3IgYm9vdCBwZXJmb3JtYW5jZQorICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwOSBJbnRlbCBDb3Jwb3JhdGlvbgorICogQXV0aG9yOiBBcmphbiB2YW4gZGUgVmVuIDxhcmphbkBsaW51eC5pbnRlbC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIKKyAqIG9mIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKwordHlwZWRlZiB1NjQgYXN5bmNfY29va2llX3Q7Cit0eXBlZGVmIHZvaWQgKGFzeW5jX2Z1bmNfcHRyKSAodm9pZCAqZGF0YSwgYXN5bmNfY29va2llX3QgY29va2llKTsKKworZXh0ZXJuIGFzeW5jX2Nvb2tpZV90IGFzeW5jX3NjaGVkdWxlKGFzeW5jX2Z1bmNfcHRyICpwdHIsIHZvaWQgKmRhdGEpOworZXh0ZXJuIGFzeW5jX2Nvb2tpZV90IGFzeW5jX3NjaGVkdWxlX3NwZWNpYWwoYXN5bmNfZnVuY19wdHIgKnB0ciwgdm9pZCAqZGF0YSwgc3RydWN0IGxpc3RfaGVhZCAqbGlzdCk7CitleHRlcm4gdm9pZCBhc3luY19zeW5jaHJvbml6ZV9mdWxsKHZvaWQpOworZXh0ZXJuIHZvaWQgYXN5bmNfc3luY2hyb25pemVfZnVsbF9zcGVjaWFsKHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QpOworZXh0ZXJuIHZvaWQgYXN5bmNfc3luY2hyb25pemVfY29va2llKGFzeW5jX2Nvb2tpZV90IGNvb2tpZSk7CitleHRlcm4gdm9pZCBhc3luY19zeW5jaHJvbml6ZV9jb29raWVfc3BlY2lhbChhc3luY19jb29raWVfdCBjb29raWUsIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QpOworCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2F0bWVsLW1jaS5oIGIvaW5jbHVkZS9saW51eC9hdG1lbC1tY2kuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjFmOTU3Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9hdG1lbC1tY2kuaApAQCAtMCwwICsxLDM5IEBACisjaWZuZGVmIF9fTElOVVhfQVRNRUxfTUNJX0gKKyNkZWZpbmUgX19MSU5VWF9BVE1FTF9NQ0lfSAorCisjZGVmaW5lIEFUTUVMX01DSV9NQVhfTlJfU0xPVFMJMgorCisjaW5jbHVkZSA8bGludXgvZHdfZG1hYy5oPgorCisvKioKKyAqIHN0cnVjdCBtY2lfc2xvdF9wZGF0YSAtIGJvYXJkLXNwZWNpZmljIHBlci1zbG90IGNvbmZpZ3VyYXRpb24KKyAqIEBidXNfd2lkdGg6IE51bWJlciBvZiBkYXRhIGxpbmVzIHdpcmVkIHVwIHRoZSBzbG90CisgKiBAZGV0ZWN0X3BpbjogR1BJTyBwaW4gd2lyZWQgdG8gdGhlIGNhcmQgZGV0ZWN0IHN3aXRjaAorICogQHdwX3BpbjogR1BJTyBwaW4gd2lyZWQgdG8gdGhlIHdyaXRlIHByb3RlY3Qgc2Vuc29yCisgKgorICogSWYgYSBnaXZlbiBzbG90IGlzIG5vdCBwcmVzZW50IG9uIHRoZSBib2FyZCwgQGJ1c193aWR0aCBzaG91bGQgYmUKKyAqIHNldCB0byAwLiBUaGUgb3RoZXIgZmllbGRzIGFyZSBpZ25vcmVkIGluIHRoaXMgY2FzZS4KKyAqCisgKiBBbnkgcGlucyB0aGF0IGFyZW4ndCBhdmFpbGFibGUgc2hvdWxkIGJlIHNldCB0byBhIG5lZ2F0aXZlIHZhbHVlLgorICoKKyAqIE5vdGUgdGhhdCBzdXBwb3J0IGZvciBtdWx0aXBsZSBzbG90cyBpcyBleHBlcmltZW50YWwgLS0gc29tZSBjYXJkcworICogbWlnaHQgZ2V0IHVwc2V0IGlmIHdlIGRvbid0IGdldCB0aGUgY2xvY2sgbWFuYWdlbWVudCBleGFjdGx5IHJpZ2h0LgorICogQnV0IGluIG1vc3QgY2FzZXMsIGl0IHNob3VsZCB3b3JrIGp1c3QgZmluZS4KKyAqLworc3RydWN0IG1jaV9zbG90X3BkYXRhIHsKKwl1bnNpZ25lZCBpbnQJCWJ1c193aWR0aDsKKwlpbnQJCQlkZXRlY3RfcGluOworCWludAkJCXdwX3BpbjsKK307CisKKy8qKgorICogc3RydWN0IG1jaV9wbGF0Zm9ybV9kYXRhIC0gYm9hcmQtc3BlY2lmaWMgTU1DL1NEY2FyZCBjb25maWd1cmF0aW9uCisgKiBAZG1hX3NsYXZlOiBETUEgc2xhdmUgaW50ZXJmYWNlIHRvIHVzZSBpbiBkYXRhIHRyYW5zZmVycy4KKyAqIEBzbG90OiBQZXItc2xvdCBjb25maWd1cmF0aW9uIGRhdGEuCisgKi8KK3N0cnVjdCBtY2lfcGxhdGZvcm1fZGF0YSB7CisJc3RydWN0IGR3X2RtYV9zbGF2ZQlkbWFfc2xhdmU7CisJc3RydWN0IG1jaV9zbG90X3BkYXRhCXNsb3RbQVRNRUxfTUNJX01BWF9OUl9TTE9UU107Cit9OworCisjZW5kaWYgLyogX19MSU5VWF9BVE1FTF9NQ0lfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9hdXRvX2Rldi1pb2N0bC5oIGIvaW5jbHVkZS9saW51eC9hdXRvX2Rldi1pb2N0bC5oCmluZGV4IGY0ZDA1Y2MuLjkxYTc3MzkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYXV0b19kZXYtaW9jdGwuaAorKysgYi9pbmNsdWRlL2xpbnV4L2F1dG9fZGV2LWlvY3RsLmgKQEAgLTEwLDYgKzEwLDcgQEAKICNpZm5kZWYgX0xJTlVYX0FVVE9fREVWX0lPQ1RMX0gKICNkZWZpbmUgX0xJTlVYX0FVVE9fREVWX0lPQ1RMX0gKIAorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAKICNkZWZpbmUgQVVUT0ZTX0RFVklDRV9OQU1FCQkiYXV0b2ZzIgpAQCAtMjUsNiArMjYsNjAgQEAKICAqIEFuIGlvY3RsIGludGVyZmFjZSBmb3IgYXV0b2ZzIG1vdW50IHBvaW50IGNvbnRyb2wuCiAgKi8KIAorc3RydWN0IGFyZ3NfcHJvdG92ZXIgeworCV9fdTMyCXZlcnNpb247Cit9OworCitzdHJ1Y3QgYXJnc19wcm90b3N1YnZlciB7CisJX191MzIJc3ViX3ZlcnNpb247Cit9OworCitzdHJ1Y3QgYXJnc19vcGVubW91bnQgeworCV9fdTMyCWRldmlkOworfTsKKworc3RydWN0IGFyZ3NfcmVhZHkgeworCV9fdTMyCXRva2VuOworfTsKKworc3RydWN0IGFyZ3NfZmFpbCB7CisJX191MzIJdG9rZW47CisJX19zMzIJc3RhdHVzOworfTsKKworc3RydWN0IGFyZ3Nfc2V0cGlwZWZkIHsKKwlfX3MzMglwaXBlZmQ7Cit9OworCitzdHJ1Y3QgYXJnc190aW1lb3V0IHsKKwlfX3U2NAl0aW1lb3V0OworfTsKKworc3RydWN0IGFyZ3NfcmVxdWVzdGVyIHsKKwlfX3UzMgl1aWQ7CisJX191MzIJZ2lkOworfTsKKworc3RydWN0IGFyZ3NfZXhwaXJlIHsKKwlfX3UzMglob3c7Cit9OworCitzdHJ1Y3QgYXJnc19hc2t1bW91bnQgeworCV9fdTMyCW1heV91bW91bnQ7Cit9OworCitzdHJ1Y3QgYXJnc19pc21vdW50cG9pbnQgeworCXVuaW9uIHsKKwkJc3RydWN0IGFyZ3NfaW4geworCQkJX191MzIJdHlwZTsKKwkJfSBpbjsKKwkJc3RydWN0IGFyZ3Nfb3V0IHsKKwkJCV9fdTMyCWRldmlkOworCQkJX191MzIJbWFnaWM7CisJCX0gb3V0OworCX07Cit9OworCiAvKgogICogQWxsIHRoZSBpb2N0bHMgdXNlIHRoaXMgc3RydWN0dXJlLgogICogV2hlbiBzZW5kaW5nIGEgcGF0aCBzaXplIG11c3QgYWNjb3VudCBmb3IgdGhlIHRvdGFsIGxlbmd0aApAQCAtMzksMjAgKzk0LDMyIEBACiAJCQkJICogaW5jbHVkaW5nIHRoaXMgc3RydWN0ICovCiAJX19zMzIgaW9jdGxmZDsJCS8qIGF1dG9tb3VudCBjb21tYW5kIGZkICovCiAKLQlfX3UzMiBhcmcxOwkJLyogQ29tbWFuZCBwYXJhbWV0ZXJzICovCi0JX191MzIgYXJnMjsKKwkvKiBDb21tYW5kIHBhcmFtZXRlcnMgKi8KKworCXVuaW9uIHsKKwkJc3RydWN0IGFyZ3NfcHJvdG92ZXIJCXByb3RvdmVyOworCQlzdHJ1Y3QgYXJnc19wcm90b3N1YnZlcgkJcHJvdG9zdWJ2ZXI7CisJCXN0cnVjdCBhcmdzX29wZW5tb3VudAkJb3Blbm1vdW50OworCQlzdHJ1Y3QgYXJnc19yZWFkeQkJcmVhZHk7CisJCXN0cnVjdCBhcmdzX2ZhaWwJCWZhaWw7CisJCXN0cnVjdCBhcmdzX3NldHBpcGVmZAkJc2V0cGlwZWZkOworCQlzdHJ1Y3QgYXJnc190aW1lb3V0CQl0aW1lb3V0OworCQlzdHJ1Y3QgYXJnc19yZXF1ZXN0ZXIJCXJlcXVlc3RlcjsKKwkJc3RydWN0IGFyZ3NfZXhwaXJlCQlleHBpcmU7CisJCXN0cnVjdCBhcmdzX2Fza3Vtb3VudAkJYXNrdW1vdW50OworCQlzdHJ1Y3QgYXJnc19pc21vdW50cG9pbnQJaXNtb3VudHBvaW50OworCX07CiAKIAljaGFyIHBhdGhbMF07CiB9OwogCiBzdGF0aWMgaW5saW5lIHZvaWQgaW5pdF9hdXRvZnNfZGV2X2lvY3RsKHN0cnVjdCBhdXRvZnNfZGV2X2lvY3RsICppbikKIHsKKwltZW1zZXQoaW4sIDAsIHNpemVvZihzdHJ1Y3QgYXV0b2ZzX2Rldl9pb2N0bCkpOwogCWluLT52ZXJfbWFqb3IgPSBBVVRPRlNfREVWX0lPQ1RMX1ZFUlNJT05fTUFKT1I7CiAJaW4tPnZlcl9taW5vciA9IEFVVE9GU19ERVZfSU9DVExfVkVSU0lPTl9NSU5PUjsKIAlpbi0+c2l6ZSA9IHNpemVvZihzdHJ1Y3QgYXV0b2ZzX2Rldl9pb2N0bCk7CiAJaW4tPmlvY3RsZmQgPSAtMTsKLQlpbi0+YXJnMSA9IDA7Ci0JaW4tPmFyZzIgPSAwOwogCXJldHVybjsKIH0KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9hdXRvX2ZzNC5oIGIvaW5jbHVkZS9saW51eC9hdXRvX2ZzNC5oCmluZGV4IDIyNTM3MTYuLjU1ZmE0NzggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYXV0b19mczQuaAorKysgYi9pbmNsdWRlL2xpbnV4L2F1dG9fZnM0LmgKQEAgLTI5LDEwICsyOSw2NCBAQAogI2RlZmluZSBBVVRPRlNfRVhQX0lNTUVESUFURQkJMQogI2RlZmluZSBBVVRPRlNfRVhQX0xFQVZFUwkJMgogCi0jZGVmaW5lIEFVVE9GU19UWVBFX0FOWQkJCTB4MDAwMAotI2RlZmluZSBBVVRPRlNfVFlQRV9JTkRJUkVDVAkJMHgwMDAxCi0jZGVmaW5lIEFVVE9GU19UWVBFX0RJUkVDVAkJMHgwMDAyCi0jZGVmaW5lIEFVVE9GU19UWVBFX09GRlNFVAkJMHgwMDA0CisjZGVmaW5lIEFVVE9GU19UWVBFX0FOWQkJCTBVCisjZGVmaW5lIEFVVE9GU19UWVBFX0lORElSRUNUCQkxVQorI2RlZmluZSBBVVRPRlNfVFlQRV9ESVJFQ1QJCTJVCisjZGVmaW5lIEFVVE9GU19UWVBFX09GRlNFVAkJNFUKKworc3RhdGljIGlubGluZSB2b2lkIHNldF9hdXRvZnNfdHlwZV9pbmRpcmVjdCh1bnNpZ25lZCBpbnQgKnR5cGUpCit7CisJKnR5cGUgPSBBVVRPRlNfVFlQRV9JTkRJUkVDVDsKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGF1dG9mc190eXBlX2luZGlyZWN0KHVuc2lnbmVkIGludCB0eXBlKQoreworCXJldHVybiAodHlwZSA9PSBBVVRPRlNfVFlQRV9JTkRJUkVDVCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfYXV0b2ZzX3R5cGVfZGlyZWN0KHVuc2lnbmVkIGludCAqdHlwZSkKK3sKKwkqdHlwZSA9IEFVVE9GU19UWVBFX0RJUkVDVDsKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGF1dG9mc190eXBlX2RpcmVjdCh1bnNpZ25lZCBpbnQgdHlwZSkKK3sKKwlyZXR1cm4gKHR5cGUgPT0gQVVUT0ZTX1RZUEVfRElSRUNUKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNldF9hdXRvZnNfdHlwZV9vZmZzZXQodW5zaWduZWQgaW50ICp0eXBlKQoreworCSp0eXBlID0gQVVUT0ZTX1RZUEVfT0ZGU0VUOworCXJldHVybjsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgYXV0b2ZzX3R5cGVfb2Zmc2V0KHVuc2lnbmVkIGludCB0eXBlKQoreworCXJldHVybiAodHlwZSA9PSBBVVRPRlNfVFlQRV9PRkZTRVQpOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBhdXRvZnNfdHlwZV90cmlnZ2VyKHVuc2lnbmVkIGludCB0eXBlKQoreworCXJldHVybiAodHlwZSA9PSBBVVRPRlNfVFlQRV9ESVJFQ1QgfHwgdHlwZSA9PSBBVVRPRlNfVFlQRV9PRkZTRVQpOworfQorCisvKgorICogVGhpcyBpc24ndCByZWFsbHkgYSB0eXBlIGFzIHdlIHVzZSBpdCB0byBzYXkgIm5vIHR5cGUgc2V0IiB0bworICogaW5kaWNhdGUgd2Ugd2FudCB0byBzZWFyY2ggZm9yICJhbnkiIG1vdW50IGluIHRoZQorICogYXV0b2ZzX2Rldl9pb2N0bF9pc21vdW50cG9pbnQoKSBkZXZpY2UgaW9jdGwgZnVuY3Rpb24uCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfYXV0b2ZzX3R5cGVfYW55KHVuc2lnbmVkIGludCAqdHlwZSkKK3sKKwkqdHlwZSA9IEFVVE9GU19UWVBFX0FOWTsKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGF1dG9mc190eXBlX2FueSh1bnNpZ25lZCBpbnQgdHlwZSkKK3sKKwlyZXR1cm4gKHR5cGUgPT0gQVVUT0ZTX1RZUEVfQU5ZKTsKK30KIAogLyogRGFlbW9uIG5vdGlmaWNhdGlvbiBwYWNrZXQgdHlwZXMgKi8KIGVudW0gYXV0b2ZzX25vdGlmeSB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2F1eHZlYy5oIGIvaW5jbHVkZS9saW51eC9hdXh2ZWMuaAppbmRleCBkN2FmYTlkLi5mM2I1ZDRlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2F1eHZlYy5oCisrKyBiL2luY2x1ZGUvbGludXgvYXV4dmVjLmgKQEAgLTIzLDE2ICsyMywxNiBAQAogI2RlZmluZSBBVF9QTEFURk9STSAxNSAgLyogc3RyaW5nIGlkZW50aWZ5aW5nIENQVSBmb3Igb3B0aW1pemF0aW9ucyAqLwogI2RlZmluZSBBVF9IV0NBUCAgMTYgICAgLyogYXJjaCBkZXBlbmRlbnQgaGludHMgYXQgQ1BVIGNhcGFiaWxpdGllcyAqLwogI2RlZmluZSBBVF9DTEtUQ0sgMTcJLyogZnJlcXVlbmN5IGF0IHdoaWNoIHRpbWVzKCkgaW5jcmVtZW50cyAqLwotCisvKiBBVF8qIHZhbHVlcyAxOCB0aHJvdWdoIDIyIGFyZSByZXNlcnZlZCAqLwogI2RlZmluZSBBVF9TRUNVUkUgMjMgICAvKiBzZWN1cmUgbW9kZSBib29sZWFuICovCi0KICNkZWZpbmUgQVRfQkFTRV9QTEFURk9STSAyNAkvKiBzdHJpbmcgaWRlbnRpZnlpbmcgcmVhbCBwbGF0Zm9ybSwgbWF5CiAJCQkJICogZGlmZmVyIGZyb20gQVRfUExBVEZPUk0uICovCisjZGVmaW5lIEFUX1JBTkRPTSAyNQkvKiBhZGRyZXNzIG9mIDE2IHJhbmRvbSBieXRlcyAqLwogCiAjZGVmaW5lIEFUX0VYRUNGTiAgMzEJLyogZmlsZW5hbWUgb2YgcHJvZ3JhbSAqLwogCiAjaWZkZWYgX19LRVJORUxfXwotI2RlZmluZSBBVF9WRUNUT1JfU0laRV9CQVNFIDE4IC8qIE5FV19BVVhfRU5UIGVudHJpZXMgaW4gYXV4aWxpYXJ5IHRhYmxlICovCisjZGVmaW5lIEFUX1ZFQ1RPUl9TSVpFX0JBU0UgMTkgLyogTkVXX0FVWF9FTlQgZW50cmllcyBpbiBhdXhpbGlhcnkgdGFibGUgKi8KICAgLyogbnVtYmVyIG9mICIjZGVmaW5lIEFUXy4qIiBhYm92ZSwgbWludXMge0FUX05VTEwsIEFUX0lHTk9SRSwgQVRfTk9URUxGfSAqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYmluZm10cy5oIGIvaW5jbHVkZS9saW51eC9iaW5mbXRzLmgKaW5kZXggNmNiZmJlMi4uNzdiNGE5ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9iaW5mbXRzLmgKKysrIGIvaW5jbHVkZS9saW51eC9iaW5mbXRzLmgKQEAgLTE4LDYgKzE4LDcgQEAKICNkZWZpbmUgQklOUFJNX0JVRl9TSVpFIDEyOAogCiAjaWZkZWYgX19LRVJORUxfXworI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KIAogI2RlZmluZSBDT1JFTkFNRV9NQVhfU0laRSAxMjgKIApAQCAtMTA2LDcgKzEwNyw3IEBACiBleHRlcm4gaW50IGJwcm1fbW1faW5pdChzdHJ1Y3QgbGludXhfYmlucHJtICpicHJtKTsKIGV4dGVybiBpbnQgY29weV9zdHJpbmdzX2tlcm5lbChpbnQgYXJnYyxjaGFyICoqIGFyZ3Ysc3RydWN0IGxpbnV4X2JpbnBybSAqYnBybSk7CiBleHRlcm4gdm9pZCBpbnN0YWxsX2V4ZWNfY3JlZHMoc3RydWN0IGxpbnV4X2JpbnBybSAqYnBybSk7Ci1leHRlcm4gaW50IGRvX2NvcmVkdW1wKGxvbmcgc2lnbnIsIGludCBleGl0X2NvZGUsIHN0cnVjdCBwdF9yZWdzICogcmVncyk7CitleHRlcm4gdm9pZCBkb19jb3JlZHVtcChsb25nIHNpZ25yLCBpbnQgZXhpdF9jb2RlLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CiBleHRlcm4gaW50IHNldF9iaW5mbXQoc3RydWN0IGxpbnV4X2JpbmZtdCAqbmV3KTsKIGV4dGVybiB2b2lkIGZyZWVfYnBybShzdHJ1Y3QgbGludXhfYmlucHJtICopOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2Jsa2Rldi5oIGIvaW5jbHVkZS9saW51eC9ibGtkZXYuaAppbmRleCA3MDM1Y2VjLi4wNDQ0NjdlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2Jsa2Rldi5oCisrKyBiL2luY2x1ZGUvbGludXgvYmxrZGV2LmgKQEAgLTY5MCw2ICs2OTAsOCBAQAogCXN0cnVjdCBwYWdlICoqcGFnZXM7CiAJaW50IHBhZ2Vfb3JkZXI7CiAJaW50IG5yX2VudHJpZXM7CisJdW5zaWduZWQgbG9uZyBvZmZzZXQ7CisJaW50IG51bGxfbWFwcGVkOwogfTsKIAogc3RydWN0IHJlcV9pdGVyYXRvciB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2J5dGVvcmRlci5oIGIvaW5jbHVkZS9saW51eC9ieXRlb3JkZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjlmMDAyZC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2xpbnV4L2J5dGVvcmRlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMzcyICswLDAgQEAKLSNpZm5kZWYgX0xJTlVYX0JZVEVPUkRFUl9ICi0jZGVmaW5lIF9MSU5VWF9CWVRFT1JERVJfSAotCi0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9zd2FiLmg+Ci0KLSNpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTikgJiYgZGVmaW5lZChfX0JJR19FTkRJQU4pCi0jIGVycm9yIEZpeCBhc20vYnl0ZW9yZGVyLmggdG8gZGVmaW5lIG9uZSBlbmRpYW5uZXNzCi0jZW5kaWYKLQotI2lmICFkZWZpbmVkKF9fTElUVExFX0VORElBTikgJiYgIWRlZmluZWQoX19CSUdfRU5ESUFOKQotIyBlcnJvciBGaXggYXNtL2J5dGVvcmRlci5oIHRvIGRlZmluZSBhcmNoIGVuZGlhbm5lc3MKLSNlbmRpZgotCi0jaWZkZWYgX19MSVRUTEVfRU5ESUFOCi0jIHVuZGVmIF9fTElUVExFX0VORElBTgotIyBkZWZpbmUgX19MSVRUTEVfRU5ESUFOIDEyMzQKLSNlbmRpZgotCi0jaWZkZWYgX19CSUdfRU5ESUFOCi0jIHVuZGVmIF9fQklHX0VORElBTgotIyBkZWZpbmUgX19CSUdfRU5ESUFOIDQzMjEKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pICYmICFkZWZpbmVkKF9fTElUVExFX0VORElBTl9CSVRGSUVMRCkKLSMgZGVmaW5lIF9fTElUVExFX0VORElBTl9CSVRGSUVMRAotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKF9fQklHX0VORElBTikgJiYgIWRlZmluZWQoX19CSUdfRU5ESUFOX0JJVEZJRUxEKQotIyBkZWZpbmUgX19CSUdfRU5ESUFOX0JJVEZJRUxECi0jZW5kaWYKLQotI2lmZGVmIF9fTElUVExFX0VORElBTgotIyBkZWZpbmUgX19sZTE2X3RvX2NwdSh4KSAoKF9fZm9yY2UgX191MTYpKF9fbGUxNikoeCkpCi0jIGRlZmluZSBfX2xlMzJfdG9fY3B1KHgpICgoX19mb3JjZSBfX3UzMikoX19sZTMyKSh4KSkKLSMgZGVmaW5lIF9fbGU2NF90b19jcHUoeCkgKChfX2ZvcmNlIF9fdTY0KShfX2xlNjQpKHgpKQotIyBkZWZpbmUgX19jcHVfdG9fbGUxNih4KSAoKF9fZm9yY2UgX19sZTE2KShfX3UxNikoeCkpCi0jIGRlZmluZSBfX2NwdV90b19sZTMyKHgpICgoX19mb3JjZSBfX2xlMzIpKF9fdTMyKSh4KSkKLSMgZGVmaW5lIF9fY3B1X3RvX2xlNjQoeCkgKChfX2ZvcmNlIF9fbGU2NCkoX191NjQpKHgpKQotCi0jIGRlZmluZSBfX2JlMTZfdG9fY3B1KHgpIF9fc3dhYjE2KChfX2ZvcmNlIF9fdTE2KShfX2JlMTYpKHgpKQotIyBkZWZpbmUgX19iZTMyX3RvX2NwdSh4KSBfX3N3YWIzMigoX19mb3JjZSBfX3UzMikoX19iZTMyKSh4KSkKLSMgZGVmaW5lIF9fYmU2NF90b19jcHUoeCkgX19zd2FiNjQoKF9fZm9yY2UgX191NjQpKF9fYmU2NCkoeCkpCi0jIGRlZmluZSBfX2NwdV90b19iZTE2KHgpICgoX19mb3JjZSBfX2JlMTYpX19zd2FiMTYoeCkpCi0jIGRlZmluZSBfX2NwdV90b19iZTMyKHgpICgoX19mb3JjZSBfX2JlMzIpX19zd2FiMzIoeCkpCi0jIGRlZmluZSBfX2NwdV90b19iZTY0KHgpICgoX19mb3JjZSBfX2JlNjQpX19zd2FiNjQoeCkpCi0jZW5kaWYKLQotI2lmZGVmIF9fQklHX0VORElBTgotIyBkZWZpbmUgX19iZTE2X3RvX2NwdSh4KSAoKF9fZm9yY2UgX191MTYpKF9fYmUxNikoeCkpCi0jIGRlZmluZSBfX2JlMzJfdG9fY3B1KHgpICgoX19mb3JjZSBfX3UzMikoX19iZTMyKSh4KSkKLSMgZGVmaW5lIF9fYmU2NF90b19jcHUoeCkgKChfX2ZvcmNlIF9fdTY0KShfX2JlNjQpKHgpKQotIyBkZWZpbmUgX19jcHVfdG9fYmUxNih4KSAoKF9fZm9yY2UgX19iZTE2KShfX3UxNikoeCkpCi0jIGRlZmluZSBfX2NwdV90b19iZTMyKHgpICgoX19mb3JjZSBfX2JlMzIpKF9fdTMyKSh4KSkKLSMgZGVmaW5lIF9fY3B1X3RvX2JlNjQoeCkgKChfX2ZvcmNlIF9fYmU2NCkoX191NjQpKHgpKQotCi0jIGRlZmluZSBfX2xlMTZfdG9fY3B1KHgpIF9fc3dhYjE2KChfX2ZvcmNlIF9fdTE2KShfX2xlMTYpKHgpKQotIyBkZWZpbmUgX19sZTMyX3RvX2NwdSh4KSBfX3N3YWIzMigoX19mb3JjZSBfX3UzMikoX19sZTMyKSh4KSkKLSMgZGVmaW5lIF9fbGU2NF90b19jcHUoeCkgX19zd2FiNjQoKF9fZm9yY2UgX191NjQpKF9fbGU2NCkoeCkpCi0jIGRlZmluZSBfX2NwdV90b19sZTE2KHgpICgoX19mb3JjZSBfX2xlMTYpX19zd2FiMTYoeCkpCi0jIGRlZmluZSBfX2NwdV90b19sZTMyKHgpICgoX19mb3JjZSBfX2xlMzIpX19zd2FiMzIoeCkpCi0jIGRlZmluZSBfX2NwdV90b19sZTY0KHgpICgoX19mb3JjZSBfX2xlNjQpX19zd2FiNjQoeCkpCi0jZW5kaWYKLQotLyoKLSAqIFRoZXNlIGhlbHBlcnMgY291bGQgYmUgcGhhc2VkIG91dCBvdmVyIHRpbWUgYXMgdGhlIGJhc2UgdmVyc2lvbgotICogaGFuZGxlcyBjb25zdGFudCBmb2xkaW5nLgotICovCi0jZGVmaW5lIF9fY29uc3RhbnRfaHRvbmwoeCkgX19jcHVfdG9fYmUzMih4KQotI2RlZmluZSBfX2NvbnN0YW50X250b2hsKHgpIF9fYmUzMl90b19jcHUoeCkKLSNkZWZpbmUgX19jb25zdGFudF9odG9ucyh4KSBfX2NwdV90b19iZTE2KHgpCi0jZGVmaW5lIF9fY29uc3RhbnRfbnRvaHMoeCkgX19iZTE2X3RvX2NwdSh4KQotCi0jZGVmaW5lIF9fY29uc3RhbnRfbGUxNl90b19jcHUoeCkgX19sZTE2X3RvX2NwdSh4KQotI2RlZmluZSBfX2NvbnN0YW50X2xlMzJfdG9fY3B1KHgpIF9fbGUzMl90b19jcHUoeCkKLSNkZWZpbmUgX19jb25zdGFudF9sZTY0X3RvX2NwdSh4KSBfX2xlNjRfdG9fY3B1KHgpCi0jZGVmaW5lIF9fY29uc3RhbnRfYmUxNl90b19jcHUoeCkgX19iZTE2X3RvX2NwdSh4KQotI2RlZmluZSBfX2NvbnN0YW50X2JlMzJfdG9fY3B1KHgpIF9fYmUzMl90b19jcHUoeCkKLSNkZWZpbmUgX19jb25zdGFudF9iZTY0X3RvX2NwdSh4KSBfX2JlNjRfdG9fY3B1KHgpCi0KLSNkZWZpbmUgX19jb25zdGFudF9jcHVfdG9fbGUxNih4KSBfX2NwdV90b19sZTE2KHgpCi0jZGVmaW5lIF9fY29uc3RhbnRfY3B1X3RvX2xlMzIoeCkgX19jcHVfdG9fbGUzMih4KQotI2RlZmluZSBfX2NvbnN0YW50X2NwdV90b19sZTY0KHgpIF9fY3B1X3RvX2xlNjQoeCkKLSNkZWZpbmUgX19jb25zdGFudF9jcHVfdG9fYmUxNih4KSBfX2NwdV90b19iZTE2KHgpCi0jZGVmaW5lIF9fY29uc3RhbnRfY3B1X3RvX2JlMzIoeCkgX19jcHVfdG9fYmUzMih4KQotI2RlZmluZSBfX2NvbnN0YW50X2NwdV90b19iZTY0KHgpIF9fY3B1X3RvX2JlNjQoeCkKLQotc3RhdGljIGlubGluZSB2b2lkIF9fbGUxNl90b19jcHVzKF9fdTE2ICpwKQotewotI2lmZGVmIF9fQklHX0VORElBTgotCV9fc3dhYjE2cyhwKTsKLSNlbmRpZgotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgX19jcHVfdG9fbGUxNnMoX191MTYgKnApCi17Ci0jaWZkZWYgX19CSUdfRU5ESUFOCi0JX19zd2FiMTZzKHApOwotI2VuZGlmCi19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBfX2xlMzJfdG9fY3B1cyhfX3UzMiAqcCkKLXsKLSNpZmRlZiBfX0JJR19FTkRJQU4KLQlfX3N3YWIzMnMocCk7Ci0jZW5kaWYKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIF9fY3B1X3RvX2xlMzJzKF9fdTMyICpwKQotewotI2lmZGVmIF9fQklHX0VORElBTgotCV9fc3dhYjMycyhwKTsKLSNlbmRpZgotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgX19sZTY0X3RvX2NwdXMoX191NjQgKnApCi17Ci0jaWZkZWYgX19CSUdfRU5ESUFOCi0JX19zd2FiNjRzKHApOwotI2VuZGlmCi19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBfX2NwdV90b19sZTY0cyhfX3U2NCAqcCkKLXsKLSNpZmRlZiBfX0JJR19FTkRJQU4KLQlfX3N3YWI2NHMocCk7Ci0jZW5kaWYKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIF9fYmUxNl90b19jcHVzKF9fdTE2ICpwKQotewotI2lmZGVmIF9fTElUVExFX0VORElBTgotCV9fc3dhYjE2cyhwKTsKLSNlbmRpZgotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgX19jcHVfdG9fYmUxNnMoX191MTYgKnApCi17Ci0jaWZkZWYgX19MSVRUTEVfRU5ESUFOCi0JX19zd2FiMTZzKHApOwotI2VuZGlmCi19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBfX2JlMzJfdG9fY3B1cyhfX3UzMiAqcCkKLXsKLSNpZmRlZiBfX0xJVFRMRV9FTkRJQU4KLQlfX3N3YWIzMnMocCk7Ci0jZW5kaWYKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIF9fY3B1X3RvX2JlMzJzKF9fdTMyICpwKQotewotI2lmZGVmIF9fTElUVExFX0VORElBTgotCV9fc3dhYjMycyhwKTsKLSNlbmRpZgotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgX19iZTY0X3RvX2NwdXMoX191NjQgKnApCi17Ci0jaWZkZWYgX19MSVRUTEVfRU5ESUFOCi0JX19zd2FiNjRzKHApOwotI2VuZGlmCi19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBfX2NwdV90b19iZTY0cyhfX3U2NCAqcCkKLXsKLSNpZmRlZiBfX0xJVFRMRV9FTkRJQU4KLQlfX3N3YWI2NHMocCk7Ci0jZW5kaWYKLX0KLQotc3RhdGljIGlubGluZSBfX3UxNiBfX2xlMTZfdG9fY3B1cChjb25zdCBfX2xlMTYgKnApCi17Ci0jaWZkZWYgX19MSVRUTEVfRU5ESUFOCi0JcmV0dXJuIChfX2ZvcmNlIF9fdTE2KSpwOwotI2Vsc2UKLQlyZXR1cm4gX19zd2FiMTZwKChfX2ZvcmNlIF9fdTE2ICopcCk7Ci0jZW5kaWYKLX0KLQotc3RhdGljIGlubGluZSBfX3UzMiBfX2xlMzJfdG9fY3B1cChjb25zdCBfX2xlMzIgKnApCi17Ci0jaWZkZWYgX19MSVRUTEVfRU5ESUFOCi0JcmV0dXJuIChfX2ZvcmNlIF9fdTMyKSpwOwotI2Vsc2UKLQlyZXR1cm4gX19zd2FiMzJwKChfX2ZvcmNlIF9fdTMyICopcCk7Ci0jZW5kaWYKLX0KLQotc3RhdGljIGlubGluZSBfX3U2NCBfX2xlNjRfdG9fY3B1cChjb25zdCBfX2xlNjQgKnApCi17Ci0jaWZkZWYgX19MSVRUTEVfRU5ESUFOCi0JcmV0dXJuIChfX2ZvcmNlIF9fdTY0KSpwOwotI2Vsc2UKLQlyZXR1cm4gX19zd2FiNjRwKChfX2ZvcmNlIF9fdTY0ICopcCk7Ci0jZW5kaWYKLX0KLQotc3RhdGljIGlubGluZSBfX2xlMTYgX19jcHVfdG9fbGUxNnAoY29uc3QgX191MTYgKnApCi17Ci0jaWZkZWYgX19MSVRUTEVfRU5ESUFOCi0JcmV0dXJuIChfX2ZvcmNlIF9fbGUxNikqcDsKLSNlbHNlCi0JcmV0dXJuIChfX2ZvcmNlIF9fbGUxNilfX3N3YWIxNnAocCk7Ci0jZW5kaWYKLX0KLQotc3RhdGljIGlubGluZSBfX2xlMzIgX19jcHVfdG9fbGUzMnAoY29uc3QgX191MzIgKnApCi17Ci0jaWZkZWYgX19MSVRUTEVfRU5ESUFOCi0JcmV0dXJuIChfX2ZvcmNlIF9fbGUzMikqcDsKLSNlbHNlCi0JcmV0dXJuIChfX2ZvcmNlIF9fbGUzMilfX3N3YWIzMnAocCk7Ci0jZW5kaWYKLX0KLQotc3RhdGljIGlubGluZSBfX2xlNjQgX19jcHVfdG9fbGU2NHAoY29uc3QgX191NjQgKnApCi17Ci0jaWZkZWYgX19MSVRUTEVfRU5ESUFOCi0JcmV0dXJuIChfX2ZvcmNlIF9fbGU2NCkqcDsKLSNlbHNlCi0JcmV0dXJuIChfX2ZvcmNlIF9fbGU2NClfX3N3YWI2NHAocCk7Ci0jZW5kaWYKLX0KLQotc3RhdGljIGlubGluZSBfX3UxNiBfX2JlMTZfdG9fY3B1cChjb25zdCBfX2JlMTYgKnApCi17Ci0jaWZkZWYgX19CSUdfRU5ESUFOCi0JcmV0dXJuIChfX2ZvcmNlIF9fdTE2KSpwOwotI2Vsc2UKLQlyZXR1cm4gX19zd2FiMTZwKChfX2ZvcmNlIF9fdTE2ICopcCk7Ci0jZW5kaWYKLX0KLQotc3RhdGljIGlubGluZSBfX3UzMiBfX2JlMzJfdG9fY3B1cChjb25zdCBfX2JlMzIgKnApCi17Ci0jaWZkZWYgX19CSUdfRU5ESUFOCi0JcmV0dXJuIChfX2ZvcmNlIF9fdTMyKSpwOwotI2Vsc2UKLQlyZXR1cm4gX19zd2FiMzJwKChfX2ZvcmNlIF9fdTMyICopcCk7Ci0jZW5kaWYKLX0KLQotc3RhdGljIGlubGluZSBfX3U2NCBfX2JlNjRfdG9fY3B1cChjb25zdCBfX2JlNjQgKnApCi17Ci0jaWZkZWYgX19CSUdfRU5ESUFOCi0JcmV0dXJuIChfX2ZvcmNlIF9fdTY0KSpwOwotI2Vsc2UKLQlyZXR1cm4gX19zd2FiNjRwKChfX2ZvcmNlIF9fdTY0ICopcCk7Ci0jZW5kaWYKLX0KLQotc3RhdGljIGlubGluZSBfX2JlMTYgX19jcHVfdG9fYmUxNnAoY29uc3QgX191MTYgKnApCi17Ci0jaWZkZWYgX19CSUdfRU5ESUFOCi0JcmV0dXJuIChfX2ZvcmNlIF9fYmUxNikqcDsKLSNlbHNlCi0JcmV0dXJuIChfX2ZvcmNlIF9fYmUxNilfX3N3YWIxNnAocCk7Ci0jZW5kaWYKLX0KLQotc3RhdGljIGlubGluZSBfX2JlMzIgX19jcHVfdG9fYmUzMnAoY29uc3QgX191MzIgKnApCi17Ci0jaWZkZWYgX19CSUdfRU5ESUFOCi0JcmV0dXJuIChfX2ZvcmNlIF9fYmUzMikqcDsKLSNlbHNlCi0JcmV0dXJuIChfX2ZvcmNlIF9fYmUzMilfX3N3YWIzMnAocCk7Ci0jZW5kaWYKLX0KLQotc3RhdGljIGlubGluZSBfX2JlNjQgX19jcHVfdG9fYmU2NHAoY29uc3QgX191NjQgKnApCi17Ci0jaWZkZWYgX19CSUdfRU5ESUFOCi0JcmV0dXJuIChfX2ZvcmNlIF9fYmU2NCkqcDsKLSNlbHNlCi0JcmV0dXJuIChfX2ZvcmNlIF9fYmU2NClfX3N3YWI2NHAocCk7Ci0jZW5kaWYKLX0KLQotI2lmZGVmIF9fS0VSTkVMX18KLQotIyBkZWZpbmUgbGUxNl90b19jcHUgX19sZTE2X3RvX2NwdQotIyBkZWZpbmUgbGUzMl90b19jcHUgX19sZTMyX3RvX2NwdQotIyBkZWZpbmUgbGU2NF90b19jcHUgX19sZTY0X3RvX2NwdQotIyBkZWZpbmUgYmUxNl90b19jcHUgX19iZTE2X3RvX2NwdQotIyBkZWZpbmUgYmUzMl90b19jcHUgX19iZTMyX3RvX2NwdQotIyBkZWZpbmUgYmU2NF90b19jcHUgX19iZTY0X3RvX2NwdQotIyBkZWZpbmUgY3B1X3RvX2xlMTYgX19jcHVfdG9fbGUxNgotIyBkZWZpbmUgY3B1X3RvX2xlMzIgX19jcHVfdG9fbGUzMgotIyBkZWZpbmUgY3B1X3RvX2xlNjQgX19jcHVfdG9fbGU2NAotIyBkZWZpbmUgY3B1X3RvX2JlMTYgX19jcHVfdG9fYmUxNgotIyBkZWZpbmUgY3B1X3RvX2JlMzIgX19jcHVfdG9fYmUzMgotIyBkZWZpbmUgY3B1X3RvX2JlNjQgX19jcHVfdG9fYmU2NAotCi0jIGRlZmluZSBsZTE2X3RvX2NwdXAgX19sZTE2X3RvX2NwdXAKLSMgZGVmaW5lIGxlMzJfdG9fY3B1cCBfX2xlMzJfdG9fY3B1cAotIyBkZWZpbmUgbGU2NF90b19jcHVwIF9fbGU2NF90b19jcHVwCi0jIGRlZmluZSBiZTE2X3RvX2NwdXAgX19iZTE2X3RvX2NwdXAKLSMgZGVmaW5lIGJlMzJfdG9fY3B1cCBfX2JlMzJfdG9fY3B1cAotIyBkZWZpbmUgYmU2NF90b19jcHVwIF9fYmU2NF90b19jcHVwCi0jIGRlZmluZSBjcHVfdG9fbGUxNnAgX19jcHVfdG9fbGUxNnAKLSMgZGVmaW5lIGNwdV90b19sZTMycCBfX2NwdV90b19sZTMycAotIyBkZWZpbmUgY3B1X3RvX2xlNjRwIF9fY3B1X3RvX2xlNjRwCi0jIGRlZmluZSBjcHVfdG9fYmUxNnAgX19jcHVfdG9fYmUxNnAKLSMgZGVmaW5lIGNwdV90b19iZTMycCBfX2NwdV90b19iZTMycAotIyBkZWZpbmUgY3B1X3RvX2JlNjRwIF9fY3B1X3RvX2JlNjRwCi0KLSMgZGVmaW5lIGxlMTZfdG9fY3B1cyBfX2xlMTZfdG9fY3B1cwotIyBkZWZpbmUgbGUzMl90b19jcHVzIF9fbGUzMl90b19jcHVzCi0jIGRlZmluZSBsZTY0X3RvX2NwdXMgX19sZTY0X3RvX2NwdXMKLSMgZGVmaW5lIGJlMTZfdG9fY3B1cyBfX2JlMTZfdG9fY3B1cwotIyBkZWZpbmUgYmUzMl90b19jcHVzIF9fYmUzMl90b19jcHVzCi0jIGRlZmluZSBiZTY0X3RvX2NwdXMgX19iZTY0X3RvX2NwdXMKLSMgZGVmaW5lIGNwdV90b19sZTE2cyBfX2NwdV90b19sZTE2cwotIyBkZWZpbmUgY3B1X3RvX2xlMzJzIF9fY3B1X3RvX2xlMzJzCi0jIGRlZmluZSBjcHVfdG9fbGU2NHMgX19jcHVfdG9fbGU2NHMKLSMgZGVmaW5lIGNwdV90b19iZTE2cyBfX2NwdV90b19iZTE2cwotIyBkZWZpbmUgY3B1X3RvX2JlMzJzIF9fY3B1X3RvX2JlMzJzCi0jIGRlZmluZSBjcHVfdG9fYmU2NHMgX19jcHVfdG9fYmU2NHMKLQotLyoKLSAqIFRoZXkgaGF2ZSB0byBiZSBtYWNyb3MgaW4gb3JkZXIgdG8gZG8gdGhlIGNvbnN0YW50IGZvbGRpbmcKLSAqIGNvcnJlY3RseSAtIGlmIHRoZSBhcmd1bWVudCBwYXNzZWQgaW50byBhIGlubGluZSBmdW5jdGlvbgotICogaXQgaXMgbm8gbG9uZ2VyIGNvbnN0YW50IGFjY29yZGluZyB0byBnY2MuLgotICovCi0jIHVuZGVmIG50b2hsCi0jIHVuZGVmIG50b2hzCi0jIHVuZGVmIGh0b25sCi0jIHVuZGVmIGh0b25zCi0KLSMgZGVmaW5lIF9fX2h0b25sKHgpIF9fY3B1X3RvX2JlMzIoeCkKLSMgZGVmaW5lIF9fX2h0b25zKHgpIF9fY3B1X3RvX2JlMTYoeCkKLSMgZGVmaW5lIF9fX250b2hsKHgpIF9fYmUzMl90b19jcHUoeCkKLSMgZGVmaW5lIF9fX250b2hzKHgpIF9fYmUxNl90b19jcHUoeCkKLQotIyBkZWZpbmUgaHRvbmwoeCkgX19faHRvbmwoeCkKLSMgZGVmaW5lIG50b2hsKHgpIF9fX250b2hsKHgpCi0jIGRlZmluZSBodG9ucyh4KSBfX19odG9ucyh4KQotIyBkZWZpbmUgbnRvaHMoeCkgX19fbnRvaHMoeCkKLQotc3RhdGljIGlubGluZSB2b2lkIGxlMTZfYWRkX2NwdShfX2xlMTYgKnZhciwgdTE2IHZhbCkKLXsKLQkqdmFyID0gY3B1X3RvX2xlMTYobGUxNl90b19jcHVwKHZhcikgKyB2YWwpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgbGUzMl9hZGRfY3B1KF9fbGUzMiAqdmFyLCB1MzIgdmFsKQotewotCSp2YXIgPSBjcHVfdG9fbGUzMihsZTMyX3RvX2NwdXAodmFyKSArIHZhbCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBsZTY0X2FkZF9jcHUoX19sZTY0ICp2YXIsIHU2NCB2YWwpCi17Ci0JKnZhciA9IGNwdV90b19sZTY0KGxlNjRfdG9fY3B1cCh2YXIpICsgdmFsKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGJlMTZfYWRkX2NwdShfX2JlMTYgKnZhciwgdTE2IHZhbCkKLXsKLQkqdmFyID0gY3B1X3RvX2JlMTYoYmUxNl90b19jcHVwKHZhcikgKyB2YWwpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgYmUzMl9hZGRfY3B1KF9fYmUzMiAqdmFyLCB1MzIgdmFsKQotewotCSp2YXIgPSBjcHVfdG9fYmUzMihiZTMyX3RvX2NwdXAodmFyKSArIHZhbCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBiZTY0X2FkZF9jcHUoX19iZTY0ICp2YXIsIHU2NCB2YWwpCi17Ci0JKnZhciA9IGNwdV90b19iZTY0KGJlNjRfdG9fY3B1cCh2YXIpICsgdmFsKTsKLX0KLQotI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KLSNlbmRpZiAvKiBfTElOVVhfQllURU9SREVSX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYnl0ZW9yZGVyL0tidWlsZCBiL2luY2x1ZGUvbGludXgvYnl0ZW9yZGVyL0tidWlsZAppbmRleCBmYmFhN2Y5Li4zODQzNzIyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2J5dGVvcmRlci9LYnVpbGQKKysrIGIvaW5jbHVkZS9saW51eC9ieXRlb3JkZXIvS2J1aWxkCkBAIC0xLDQgKzEsMiBAQAogdW5pZmRlZi15ICs9IGJpZ19lbmRpYW4uaAogdW5pZmRlZi15ICs9IGxpdHRsZV9lbmRpYW4uaAotdW5pZmRlZi15ICs9IHN3YWIuaAotdW5pZmRlZi15ICs9IHN3YWJiLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYnl0ZW9yZGVyL2JpZ19lbmRpYW4uaCBiL2luY2x1ZGUvbGludXgvYnl0ZW9yZGVyL2JpZ19lbmRpYW4uaAppbmRleCAxY2JhM2YzLi4zYzgwZmQ3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2J5dGVvcmRlci9iaWdfZW5kaWFuLmgKKysrIGIvaW5jbHVkZS9saW51eC9ieXRlb3JkZXIvYmlnX2VuZGlhbi5oCkBAIC05LDggKzksNyBAQAogI2VuZGlmCiAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L2J5dGVvcmRlci9zd2FiLmg+Ci0jaW5jbHVkZSA8bGludXgvYnl0ZW9yZGVyL3N3YWJiLmg+CisjaW5jbHVkZSA8bGludXgvc3dhYi5oPgogCiAjZGVmaW5lIF9fY29uc3RhbnRfaHRvbmwoeCkgKChfX2ZvcmNlIF9fYmUzMikoX191MzIpKHgpKQogI2RlZmluZSBfX2NvbnN0YW50X250b2hsKHgpICgoX19mb3JjZSBfX3UzMikoX19iZTMyKSh4KSkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYnl0ZW9yZGVyL2xpdHRsZV9lbmRpYW4uaCBiL2luY2x1ZGUvbGludXgvYnl0ZW9yZGVyL2xpdHRsZV9lbmRpYW4uaAppbmRleCBjZWRjMWI1Li44MzE5NWZiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2J5dGVvcmRlci9saXR0bGVfZW5kaWFuLmgKKysrIGIvaW5jbHVkZS9saW51eC9ieXRlb3JkZXIvbGl0dGxlX2VuZGlhbi5oCkBAIC05LDggKzksNyBAQAogI2VuZGlmCiAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L2J5dGVvcmRlci9zd2FiLmg+Ci0jaW5jbHVkZSA8bGludXgvYnl0ZW9yZGVyL3N3YWJiLmg+CisjaW5jbHVkZSA8bGludXgvc3dhYi5oPgogCiAjZGVmaW5lIF9fY29uc3RhbnRfaHRvbmwoeCkgKChfX2ZvcmNlIF9fYmUzMilfX19jb25zdGFudF9zd2FiMzIoKHgpKSkKICNkZWZpbmUgX19jb25zdGFudF9udG9obCh4KSBfX19jb25zdGFudF9zd2FiMzIoKF9fZm9yY2UgX19iZTMyKSh4KSkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYnl0ZW9yZGVyL3N3YWIuaCBiL2luY2x1ZGUvbGludXgvYnl0ZW9yZGVyL3N3YWIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQyMTM0Zi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2xpbnV4L2J5dGVvcmRlci9zd2FiLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMjIgKzAsMCBAQAotI2lmbmRlZiBfTElOVVhfQllURU9SREVSX1NXQUJfSAotI2RlZmluZSBfTElOVVhfQllURU9SREVSX1NXQUJfSAotCi0vKgotICogbGludXgvYnl0ZW9yZGVyL3N3YWIuaAotICogQnl0ZS1zd2FwcGluZywgaW5kZXBlbmRlbnRseSBmcm9tIENQVSBlbmRpYW5uZXNzCi0gKglzd2FiWFhbcHNdPyhmb28pCi0gKgotICogRnJhbmNvaXMtUmVuZSBSaWRlYXUgPGZhcmVAdHVuZXMub3JnPiAxOTk3MTIwNQotICogICAgc2VwYXJhdGVkIHN3YWIgZnVuY3Rpb25zIGZyb20gY3B1X3RvX1hYLAotICogICAgdG8gY2xlYW4gdXAgc3VwcG9ydCBmb3IgYml6YXJyZS1lbmRpYW4gYXJjaGl0ZWN0dXJlcy4KLSAqCi0gKiBUcmVudCBQaWVwaG8gPHh5enp5QHNwZWFrZWFzeS5vcmc+IDIwMDcxMTQKLSAqICAgIG1ha2UgY29uc3RhbnQtZm9sZGluZyB3b3JrLCBwcm92aWRlIEMgdmVyc2lvbnMgdGhhdAotICogICAgZ2NjIGNhbiBvcHRpbWl6ZSBiZXR0ZXIsIGV4cGxhaW4gZGlmZmVyZW50IHZlcnNpb25zCi0gKgotICogU2VlIGFzbS1pMzg2L2J5dGVvcmRlci5oIGFuZCBzdWNoZXMgZm9yIGV4YW1wbGVzIG9mIGhvdyB0byBwcm92aWRlCi0gKiBhcmNoaXRlY3R1cmUtZGVwZW5kZW50IG9wdGltaXplZCB2ZXJzaW9ucwotICoKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KLQotLyogRnVuY3Rpb25zL21hY3JvcyBkZWZpbmVkLCB0aGVyZSBhcmUgYSBsb3Q6Ci0gKgotICogX19fc3dhYlhYCi0gKiAgICBHZW5lcmljIEMgdmVyc2lvbnMgb2YgdGhlIHN3YWIgZnVuY3Rpb25zLgotICoKLSAqIF9fX2NvbnN0YW50X3N3YWJYWAotICogICAgQyB2ZXJzaW9ucyB0aGF0IGdjYyBjYW4gZm9sZCBpbnRvIGEgY29tcGlsZS10aW1lIGNvbnN0YW50IHdoZW4KLSAqICAgIHRoZSBhcmd1bWVudCBpcyBhIGNvbXBpbGUtdGltZSBjb25zdGFudC4KLSAqCi0gKiBfX2FyY2hfX3N3YWJYWFtzcF0/Ci0gKiAgICBBcmNoaXRlY3R1cmUgb3B0aW1pemVkIHZlcnNpb25zIG9mIGFsbCB0aGUgc3dhYiBmdW5jdGlvbnMKLSAqICAgIChpbmNsdWRpbmcgdGhlIHMgYW5kIHAgdmVyc2lvbnMpLiAgVGhlc2UgY2FuIGJlIGRlZmluZWQgaW4KLSAqICAgIGFzbS1hcmNoL2J5dGVvcmRlci5oLiAgQW55IHdoaWNoIGFyZSBub3QsIGFyZSBkZWZpbmVkIGhlcmUuCi0gKiAgICBfX2FyY2hfX3N3YWJYWHMoKSBpcyBkZWZpbmVkIGluIHRlcm1zIG9mIF9fYXJjaF9fc3dhYlhYcCgpLCB3aGljaAotICogICAgaXMgZGVmaW5lZCBpbiB0ZXJtcyBvZiBfX2FyY2hfX3N3YWJYWCgpLCB3aGljaCBpcyBpbiB0dXJuIGRlZmluZWQKLSAqICAgIGluIHRlcm1zIG9mIF9fX3N3YWJYWCh4KS4KLSAqICAgIFRoZXNlIG11c3QgYmUgbWFjcm9zLiAgVGhleSBtYXkgYmUgdW5zYWZlIGZvciBhcmd1bWVudHMgd2l0aAotICogICAgc2lkZS1lZmZlY3RzLgotICoKLSAqIF9fZnN3YWJYWAotICogICAgSW5saW5lIGZ1bmN0aW9uIHZlcnNpb25zIG9mIHRoZSBfX2FyY2hfXyBtYWNyb3MuICBUaGVzZSBfYXJlXyBzYWZlCi0gKiAgICBpZiB0aGUgYXJndW1lbnRzIGhhdmUgc2lkZS1lZmZlY3RzLiAgTm90ZSB0aGVyZSBhcmUgbm8gcyBhbmQgcAotICogICAgdmVyc2lvbnMgb2YgdGhlc2UuCi0gKgotICogX19zd2FiWFhbc2JdCi0gKiAgICBUaGVyZSBhcmUgdGhlIG9uZXMgeW91IHNob3VsZCBhY3R1YWxseSB1c2UuICBUaGUgX19zd2FiWFggdmVyc2lvbnMKLSAqICAgIHdpbGwgYmUgYSBjb25zdGFudCBnaXZlbiBhIGNvbnN0YW50IGFyZ3VtZW50IGFuZCB1c2UgdGhlIGFyY2gKLSAqICAgIHNwZWNpZmljIGNvZGUgKGlmIGFueSkgZm9yIG5vbi1jb25zdGFudCBhcmd1bWVudHMuICBUaGUgcyBhbmQgcAotICogICAgdmVyc2lvbnMgYWx3YXlzIHVzZSB0aGUgYXJjaCBzcGVjaWZpYyBjb2RlIChjb25zdGFudCBmb2xkaW5nCi0gKiAgICBkb2Vzbid0IGFwcGx5KS4gIFRoZXkgYXJlIHNhZmUgdG8gdXNlIHdpdGggYXJndW1lbnRzIHdpdGgKLSAqICAgIHNpZGUtZWZmZWN0cy4KLSAqCi0gKiBzd2FiWFhbc2JdCi0gKiAgICBOaWNrbmFtZXMgZm9yIF9fc3dhYlhYW3NiXSB0byB1c2UgaW4gdGhlIGtlcm5lbC4KLSAqLwotCi0vKiBjYXN0cyBhcmUgbmVjZXNzYXJ5IGZvciBjb25zdGFudHMsIGJlY2F1c2Ugd2UgbmV2ZXIga25vdyBob3cgZm9yIHN1cmUKLSAqIGhvdyBVL1VML1VMTCBtYXAgdG8gX191MTYsIF9fdTMyLCBfX3U2NC4gQXQgbGVhc3Qgbm90IGluIGEgcG9ydGFibGUgd2F5LgotICovCi0KLXN0YXRpYyBfX2lubGluZV9fIF9fYXR0cmlidXRlX2NvbnN0X18gX191MTYgX19fc3dhYjE2KF9fdTE2IHgpCi17Ci0JcmV0dXJuIHg8PDggfCB4Pj44OwotfQotc3RhdGljIF9faW5saW5lX18gX19hdHRyaWJ1dGVfY29uc3RfXyBfX3UzMiBfX19zd2FiMzIoX191MzIgeCkKLXsKLQlyZXR1cm4geDw8MjQgfCB4Pj4yNCB8Ci0JCSh4ICYgKF9fdTMyKTB4MDAwMGZmMDBVTCk8PDggfAotCQkoeCAmIChfX3UzMikweDAwZmYwMDAwVUwpPj44OwotfQotc3RhdGljIF9faW5saW5lX18gX19hdHRyaWJ1dGVfY29uc3RfXyBfX3U2NCBfX19zd2FiNjQoX191NjQgeCkKLXsKLQlyZXR1cm4geDw8NTYgfCB4Pj41NiB8Ci0JCSh4ICYgKF9fdTY0KTB4MDAwMDAwMDAwMDAwZmYwMFVMTCk8PDQwIHwKLQkJKHggJiAoX191NjQpMHgwMDAwMDAwMDAwZmYwMDAwVUxMKTw8MjQgfAotCQkoeCAmIChfX3U2NCkweDAwMDAwMDAwZmYwMDAwMDBVTEwpPDwgOCB8Ci0JICAgICAgICAoeCAmIChfX3U2NCkweDAwMDAwMGZmMDAwMDAwMDBVTEwpPj4gOCB8Ci0JCSh4ICYgKF9fdTY0KTB4MDAwMGZmMDAwMDAwMDAwMFVMTCk+PjI0IHwKLQkJKHggJiAoX191NjQpMHgwMGZmMDAwMDAwMDAwMDAwVUxMKT4+NDA7Ci19Ci0KLSNkZWZpbmUgX19fY29uc3RhbnRfc3dhYjE2KHgpIFwKLQkoKF9fdTE2KSggXAotCQkoKChfX3UxNikoeCkgJiAoX191MTYpMHgwMGZmVSkgPDwgOCkgfCBcCi0JCSgoKF9fdTE2KSh4KSAmIChfX3UxNikweGZmMDBVKSA+PiA4KSApKQotI2RlZmluZSBfX19jb25zdGFudF9zd2FiMzIoeCkgXAotCSgoX191MzIpKCBcCi0JCSgoKF9fdTMyKSh4KSAmIChfX3UzMikweDAwMDAwMGZmVUwpIDw8IDI0KSB8IFwKLQkJKCgoX191MzIpKHgpICYgKF9fdTMyKTB4MDAwMGZmMDBVTCkgPDwgIDgpIHwgXAotCQkoKChfX3UzMikoeCkgJiAoX191MzIpMHgwMGZmMDAwMFVMKSA+PiAgOCkgfCBcCi0JCSgoKF9fdTMyKSh4KSAmIChfX3UzMikweGZmMDAwMDAwVUwpID4+IDI0KSApKQotI2RlZmluZSBfX19jb25zdGFudF9zd2FiNjQoeCkgXAotCSgoX191NjQpKCBcCi0JCShfX3U2NCkoKChfX3U2NCkoeCkgJiAoX191NjQpMHgwMDAwMDAwMDAwMDAwMGZmVUxMKSA8PCA1NikgfCBcCi0JCShfX3U2NCkoKChfX3U2NCkoeCkgJiAoX191NjQpMHgwMDAwMDAwMDAwMDBmZjAwVUxMKSA8PCA0MCkgfCBcCi0JCShfX3U2NCkoKChfX3U2NCkoeCkgJiAoX191NjQpMHgwMDAwMDAwMDAwZmYwMDAwVUxMKSA8PCAyNCkgfCBcCi0JCShfX3U2NCkoKChfX3U2NCkoeCkgJiAoX191NjQpMHgwMDAwMDAwMGZmMDAwMDAwVUxMKSA8PCAgOCkgfCBcCi0JICAgICAgICAoX191NjQpKCgoX191NjQpKHgpICYgKF9fdTY0KTB4MDAwMDAwZmYwMDAwMDAwMFVMTCkgPj4gIDgpIHwgXAotCQkoX191NjQpKCgoX191NjQpKHgpICYgKF9fdTY0KTB4MDAwMGZmMDAwMDAwMDAwMFVMTCkgPj4gMjQpIHwgXAotCQkoX191NjQpKCgoX191NjQpKHgpICYgKF9fdTY0KTB4MDBmZjAwMDAwMDAwMDAwMFVMTCkgPj4gNDApIHwgXAotCQkoX191NjQpKCgoX191NjQpKHgpICYgKF9fdTY0KTB4ZmYwMDAwMDAwMDAwMDAwMFVMTCkgPj4gNTYpICkpCi0KLS8qCi0gKiBwcm92aWRlIGRlZmF1bHRzIHdoZW4gbm8gYXJjaGl0ZWN0dXJlLXNwZWNpZmljIG9wdGltaXphdGlvbiBpcyBkZXRlY3RlZAotICovCi0jaWZuZGVmIF9fYXJjaF9fc3dhYjE2Ci0jICBkZWZpbmUgX19hcmNoX19zd2FiMTYoeCkgX19fc3dhYjE2KHgpCi0jZW5kaWYKLSNpZm5kZWYgX19hcmNoX19zd2FiMzIKLSMgIGRlZmluZSBfX2FyY2hfX3N3YWIzMih4KSBfX19zd2FiMzIoeCkKLSNlbmRpZgotI2lmbmRlZiBfX2FyY2hfX3N3YWI2NAotIyAgZGVmaW5lIF9fYXJjaF9fc3dhYjY0KHgpIF9fX3N3YWI2NCh4KQotI2VuZGlmCi0KLSNpZm5kZWYgX19hcmNoX19zd2FiMTZwCi0jICBkZWZpbmUgX19hcmNoX19zd2FiMTZwKHgpIF9fYXJjaF9fc3dhYjE2KCooeCkpCi0jZW5kaWYKLSNpZm5kZWYgX19hcmNoX19zd2FiMzJwCi0jICBkZWZpbmUgX19hcmNoX19zd2FiMzJwKHgpIF9fYXJjaF9fc3dhYjMyKCooeCkpCi0jZW5kaWYKLSNpZm5kZWYgX19hcmNoX19zd2FiNjRwCi0jICBkZWZpbmUgX19hcmNoX19zd2FiNjRwKHgpIF9fYXJjaF9fc3dhYjY0KCooeCkpCi0jZW5kaWYKLQotI2lmbmRlZiBfX2FyY2hfX3N3YWIxNnMKLSMgIGRlZmluZSBfX2FyY2hfX3N3YWIxNnMoeCkgKCh2b2lkKSgqKHgpID0gX19hcmNoX19zd2FiMTZwKHgpKSkKLSNlbmRpZgotI2lmbmRlZiBfX2FyY2hfX3N3YWIzMnMKLSMgIGRlZmluZSBfX2FyY2hfX3N3YWIzMnMoeCkgKCh2b2lkKSgqKHgpID0gX19hcmNoX19zd2FiMzJwKHgpKSkKLSNlbmRpZgotI2lmbmRlZiBfX2FyY2hfX3N3YWI2NHMKLSMgIGRlZmluZSBfX2FyY2hfX3N3YWI2NHMoeCkgKCh2b2lkKSgqKHgpID0gX19hcmNoX19zd2FiNjRwKHgpKSkKLSNlbmRpZgotCi0KLS8qCi0gKiBBbGxvdyBjb25zdGFudCBmb2xkaW5nCi0gKi8KLSNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiBkZWZpbmVkKF9fT1BUSU1JWkVfXykKLSMgIGRlZmluZSBfX3N3YWIxNih4KSBcCi0oX19idWlsdGluX2NvbnN0YW50X3AoKF9fdTE2KSh4KSkgPyBcCi0gX19fY29uc3RhbnRfc3dhYjE2KCh4KSkgOiBcCi0gX19mc3dhYjE2KCh4KSkpCi0jICBkZWZpbmUgX19zd2FiMzIoeCkgXAotKF9fYnVpbHRpbl9jb25zdGFudF9wKChfX3UzMikoeCkpID8gXAotIF9fX2NvbnN0YW50X3N3YWIzMigoeCkpIDogXAotIF9fZnN3YWIzMigoeCkpKQotIyAgZGVmaW5lIF9fc3dhYjY0KHgpIFwKLShfX2J1aWx0aW5fY29uc3RhbnRfcCgoX191NjQpKHgpKSA/IFwKLSBfX19jb25zdGFudF9zd2FiNjQoKHgpKSA6IFwKLSBfX2Zzd2FiNjQoKHgpKSkKLSNlbHNlCi0jICBkZWZpbmUgX19zd2FiMTYoeCkgX19mc3dhYjE2KHgpCi0jICBkZWZpbmUgX19zd2FiMzIoeCkgX19mc3dhYjMyKHgpCi0jICBkZWZpbmUgX19zd2FiNjQoeCkgX19mc3dhYjY0KHgpCi0jZW5kaWYgLyogT1BUSU1JWkUgKi8KLQotCi1zdGF0aWMgX19pbmxpbmVfXyBfX2F0dHJpYnV0ZV9jb25zdF9fIF9fdTE2IF9fZnN3YWIxNihfX3UxNiB4KQotewotCXJldHVybiBfX2FyY2hfX3N3YWIxNih4KTsKLX0KLXN0YXRpYyBfX2lubGluZV9fIF9fdTE2IF9fc3dhYjE2cChjb25zdCBfX3UxNiAqeCkKLXsKLQlyZXR1cm4gX19hcmNoX19zd2FiMTZwKHgpOwotfQotc3RhdGljIF9faW5saW5lX18gdm9pZCBfX3N3YWIxNnMoX191MTYgKmFkZHIpCi17Ci0JX19hcmNoX19zd2FiMTZzKGFkZHIpOwotfQotCi1zdGF0aWMgX19pbmxpbmVfXyBfX2F0dHJpYnV0ZV9jb25zdF9fIF9fdTMyIF9fZnN3YWIzMihfX3UzMiB4KQotewotCXJldHVybiBfX2FyY2hfX3N3YWIzMih4KTsKLX0KLXN0YXRpYyBfX2lubGluZV9fIF9fdTMyIF9fc3dhYjMycChjb25zdCBfX3UzMiAqeCkKLXsKLQlyZXR1cm4gX19hcmNoX19zd2FiMzJwKHgpOwotfQotc3RhdGljIF9faW5saW5lX18gdm9pZCBfX3N3YWIzMnMoX191MzIgKmFkZHIpCi17Ci0JX19hcmNoX19zd2FiMzJzKGFkZHIpOwotfQotCi0jaWZkZWYgX19CWVRFT1JERVJfSEFTX1U2NF9fCi1zdGF0aWMgX19pbmxpbmVfXyBfX2F0dHJpYnV0ZV9jb25zdF9fIF9fdTY0IF9fZnN3YWI2NChfX3U2NCB4KQotewotIyAgaWZkZWYgX19TV0FCXzY0X1RIUlVfMzJfXwotCV9fdTMyIGggPSB4ID4+IDMyOwotICAgICAgICBfX3UzMiBsID0geCAmICgoMVVMTDw8MzIpLTEpOwotICAgICAgICByZXR1cm4gKCgoX191NjQpX19zd2FiMzIobCkpIDw8IDMyKSB8ICgoX191NjQpKF9fc3dhYjMyKGgpKSk7Ci0jICBlbHNlCi0JcmV0dXJuIF9fYXJjaF9fc3dhYjY0KHgpOwotIyAgZW5kaWYKLX0KLXN0YXRpYyBfX2lubGluZV9fIF9fdTY0IF9fc3dhYjY0cChjb25zdCBfX3U2NCAqeCkKLXsKLQlyZXR1cm4gX19hcmNoX19zd2FiNjRwKHgpOwotfQotc3RhdGljIF9faW5saW5lX18gdm9pZCBfX3N3YWI2NHMoX191NjQgKmFkZHIpCi17Ci0JX19hcmNoX19zd2FiNjRzKGFkZHIpOwotfQotI2VuZGlmIC8qIF9fQllURU9SREVSX0hBU19VNjRfXyAqLwotCi0jaWYgZGVmaW5lZChfX0tFUk5FTF9fKQotI2RlZmluZSBzd2FiMTYgX19zd2FiMTYKLSNkZWZpbmUgc3dhYjMyIF9fc3dhYjMyCi0jZGVmaW5lIHN3YWI2NCBfX3N3YWI2NAotI2RlZmluZSBzd2FiMTZwIF9fc3dhYjE2cAotI2RlZmluZSBzd2FiMzJwIF9fc3dhYjMycAotI2RlZmluZSBzd2FiNjRwIF9fc3dhYjY0cAotI2RlZmluZSBzd2FiMTZzIF9fc3dhYjE2cwotI2RlZmluZSBzd2FiMzJzIF9fc3dhYjMycwotI2RlZmluZSBzd2FiNjRzIF9fc3dhYjY0cwotI2VuZGlmCi0KLSNlbmRpZiAvKiBfTElOVVhfQllURU9SREVSX1NXQUJfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9ieXRlb3JkZXIvc3dhYmIuaCBiL2luY2x1ZGUvbGludXgvYnl0ZW9yZGVyL3N3YWJiLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjNzgwYzcuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9saW51eC9ieXRlb3JkZXIvc3dhYmIuaAorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0jaWZuZGVmIF9MSU5VWF9CWVRFT1JERVJfU1dBQkJfSAotI2RlZmluZSBfTElOVVhfQllURU9SREVSX1NXQUJCX0gKLQotLyoKLSAqIGxpbnV4L2J5dGVvcmRlci9zd2FiYi5oCi0gKiBTV0FwIEJ5dGVzIEJpemFycmVseQotICoJc3dhSEhYWFtwc10/KGZvbykKLSAqCi0gKiBTdXBwb3J0IGZvciBvYk5VWElvdXMgcGRwLWVuZGlhbiBhbmQgb3RoZXIgYml6YXJyZSBhcmNoaXRlY3R1cmVzLgotICogV2lsbCBMaW51eCBldmVyIHJ1biBvbiBzdWNoIGFuY2llbnQgYmVhc3RzPyBpZiBub3QsIHRoaXMgZmlsZQotICogd2lsbCBiZSBidXQgYSBwcm9ncmFtbWluZyBwZWFybC4gU3RpbGwsIGl0J3MgYSByZW1pbmRlciB0aGF0IHdlCi0gKiBzaG91bGRuJ3QgYmUgbWFraW5nIHRvbyBtYW55IGFzc3VtcHRpb25zIHdoZW4gdHJ5aW5nIHRvIGJlIHBvcnRhYmxlLgotICoKLSAqLwotCi0vKgotICogTWVhbmluZyBvZiB0aGUgbmFtZXMgSSBjaG9zZSAodmF4bGludXggcGVvcGxlIGZlZWwgZnJlZSB0byBjb3JyZWN0IHRoZW0pOgotICogc3dhaHczMglzd2FwIDE2LWJpdCBoYWxmLXdvcmRzIGluIGEgMzItYml0IHdvcmQKLSAqIHN3YWhiMzIJc3dhcCA4LWJpdCBoYWx2ZXMgb2YgZWFjaCAxNi1iaXQgaGFsZi13b3JkIGluIGEgMzItYml0IHdvcmQKLSAqCi0gKiBObyA2NC1iaXQgc3VwcG9ydCB5ZXQuIEkgZG9uJ3Qga25vdyBOVVhJIGNvbnZlbnRpb25zIGZvciBsb25nIGxvbmdzLgotICogSSBndWFyYW50ZWUgaXQgd2lsbCBiZSBhIG1lc3Mgd2hlbiBpdCdzIHRoZXJlLCB0aG91Z2ggOi0+Ci0gKiBJdCB3aWxsIGJlIGV2ZW4gd29yc2UgaWYgdGhlcmUgYXJlIGNvbmZsaWN0aW5nIDY0LWJpdCBjb252ZW50aW9ucy4KLSAqIEhvcGVmdWxseSwgbm8gb25lIGV2ZXIgdXNlZCA2NC1iaXQgb2JqZWN0cyBvbiBOVVhJIG1hY2hpbmVzLgotICoKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLQotI2RlZmluZSBfX19zd2FodzMyKHgpIFwKLSh7IFwKLQlfX3UzMiBfX3ggPSAoeCk7IFwKLQkoKF9fdTMyKSggXAotCQkoKChfX3UzMikoX194KSAmIChfX3UzMikweDAwMDBmZmZmVUwpIDw8IDE2KSB8IFwKLQkJKCgoX191MzIpKF9feCkgJiAoX191MzIpMHhmZmZmMDAwMFVMKSA+PiAxNikgKSk7IFwKLX0pCi0jZGVmaW5lIF9fX3N3YWhiMzIoeCkgXAotKHsgXAotCV9fdTMyIF9feCA9ICh4KTsgXAotCSgoX191MzIpKCBcCi0JCSgoKF9fdTMyKShfX3gpICYgKF9fdTMyKTB4MDBmZjAwZmZVTCkgPDwgOCkgfCBcCi0JCSgoKF9fdTMyKShfX3gpICYgKF9fdTMyKTB4ZmYwMGZmMDBVTCkgPj4gOCkgKSk7IFwKLX0pCi0KLSNkZWZpbmUgX19fY29uc3RhbnRfc3dhaHczMih4KSBcCi0JKChfX3UzMikoIFwKLQkJKCgoX191MzIpKHgpICYgKF9fdTMyKTB4MDAwMGZmZmZVTCkgPDwgMTYpIHwgXAotCQkoKChfX3UzMikoeCkgJiAoX191MzIpMHhmZmZmMDAwMFVMKSA+PiAxNikgKSkKLSNkZWZpbmUgX19fY29uc3RhbnRfc3dhaGIzMih4KSBcCi0JKChfX3UzMikoIFwKLQkJKCgoX191MzIpKHgpICYgKF9fdTMyKTB4MDBmZjAwZmZVTCkgPDwgOCkgfCBcCi0JCSgoKF9fdTMyKSh4KSAmIChfX3UzMikweGZmMDBmZjAwVUwpID4+IDgpICkpCi0KLS8qCi0gKiBwcm92aWRlIGRlZmF1bHRzIHdoZW4gbm8gYXJjaGl0ZWN0dXJlLXNwZWNpZmljIG9wdGltaXphdGlvbiBpcyBkZXRlY3RlZAotICovCi0jaWZuZGVmIF9fYXJjaF9fc3dhaHczMgotIyAgZGVmaW5lIF9fYXJjaF9fc3dhaHczMih4KSBfX19zd2FodzMyKHgpCi0jZW5kaWYKLSNpZm5kZWYgX19hcmNoX19zd2FoYjMyCi0jICBkZWZpbmUgX19hcmNoX19zd2FoYjMyKHgpIF9fX3N3YWhiMzIoeCkKLSNlbmRpZgotCi0jaWZuZGVmIF9fYXJjaF9fc3dhaHczMnAKLSMgIGRlZmluZSBfX2FyY2hfX3N3YWh3MzJwKHgpIF9fc3dhaHczMigqKHgpKQotI2VuZGlmCi0jaWZuZGVmIF9fYXJjaF9fc3dhaGIzMnAKLSMgIGRlZmluZSBfX2FyY2hfX3N3YWhiMzJwKHgpIF9fc3dhaGIzMigqKHgpKQotI2VuZGlmCi0KLSNpZm5kZWYgX19hcmNoX19zd2FodzMycwotIyAgZGVmaW5lIF9fYXJjaF9fc3dhaHczMnMoeCkgZG8geyAqKHgpID0gX19zd2FodzMycCgoeCkpOyB9IHdoaWxlICgwKQotI2VuZGlmCi0jaWZuZGVmIF9fYXJjaF9fc3dhaGIzMnMKLSMgIGRlZmluZSBfX2FyY2hfX3N3YWhiMzJzKHgpIGRvIHsgKih4KSA9IF9fc3dhaGIzMnAoKHgpKTsgfSB3aGlsZSAoMCkKLSNlbmRpZgotCi0KLS8qCi0gKiBBbGxvdyBjb25zdGFudCBmb2xkaW5nCi0gKi8KLSNkZWZpbmUgX19zd2FodzMyKHgpIFwKLShfX2J1aWx0aW5fY29uc3RhbnRfcCgoX191MzIpKHgpKSA/IFwKLSBfX19zd2FodzMyKCh4KSkgOiBcCi0gX19mc3dhaHczMigoeCkpKQotI2RlZmluZSBfX3N3YWhiMzIoeCkgXAotKF9fYnVpbHRpbl9jb25zdGFudF9wKChfX3UzMikoeCkpID8gXAotIF9fX3N3YWhiMzIoKHgpKSA6IFwKLSBfX2Zzd2FoYjMyKCh4KSkpCi0KLQotc3RhdGljIGlubGluZSBfX3UzMiBfX2Zzd2FodzMyKF9fdTMyIHgpCi17Ci0JcmV0dXJuIF9fYXJjaF9fc3dhaHczMih4KTsKLX0KLQotc3RhdGljIGlubGluZSBfX3UzMiBfX3N3YWh3MzJwKF9fdTMyICp4KQotewotCXJldHVybiBfX2FyY2hfX3N3YWh3MzJwKHgpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgX19zd2FodzMycyhfX3UzMiAqYWRkcikKLXsKLQlfX2FyY2hfX3N3YWh3MzJzKGFkZHIpOwotfQotCi1zdGF0aWMgaW5saW5lIF9fdTMyIF9fZnN3YWhiMzIoX191MzIgeCkKLXsKLQlyZXR1cm4gX19hcmNoX19zd2FoYjMyKHgpOwotfQotCi1zdGF0aWMgaW5saW5lIF9fdTMyIF9fc3dhaGIzMnAoX191MzIgKngpCi17Ci0JcmV0dXJuIF9fYXJjaF9fc3dhaGIzMnAoeCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBfX3N3YWhiMzJzKF9fdTMyICphZGRyKQotewotCV9fYXJjaF9fc3dhaGIzMnMoYWRkcik7Ci19Ci0KLSNpZmRlZiBfX0JZVEVPUkRFUl9IQVNfVTY0X18KLS8qCi0gKiBOb3Qgc3VwcG9ydGVkIHlldAotICovCi0jZW5kaWYgLyogX19CWVRFT1JERVJfSEFTX1U2NF9fICovCi0KLSNkZWZpbmUgc3dhaHczMiBfX3N3YWh3MzIKLSNkZWZpbmUgc3dhaGIzMiBfX3N3YWhiMzIKLSNkZWZpbmUgc3dhaHczMnAgX19zd2FodzMycAotI2RlZmluZSBzd2FoYjMycCBfX3N3YWhiMzJwCi0jZGVmaW5lIHN3YWh3MzJzIF9fc3dhaHczMnMKLSNkZWZpbmUgc3dhaGIzMnMgX19zd2FoYjMycwotCi0jZW5kaWYgLyogX0xJTlVYX0JZVEVPUkRFUl9TV0FCQl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2Nhbi9jb3JlLmggYi9pbmNsdWRlL2xpbnV4L2Nhbi9jb3JlLmgKaW5kZXggZjUwNzg1YS4uMjUwODVjYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9jYW4vY29yZS5oCisrKyBiL2luY2x1ZGUvbGludXgvY2FuL2NvcmUuaApAQCAtMTksNyArMTksNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgogCi0jZGVmaW5lIENBTl9WRVJTSU9OICIyMDA4MTEzMCIKKyNkZWZpbmUgQ0FOX1ZFUlNJT04gIjIwMDkwMTA1IgogCiAvKiBpbmNyZW1lbnQgdGhpcyBudW1iZXIgZWFjaCB0aW1lIHlvdSBjaGFuZ2Ugc29tZSB1c2VyLXNwYWNlIGludGVyZmFjZSAqLwogI2RlZmluZSBDQU5fQUJJX1ZFUlNJT04gIjgiCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2NhcGFiaWxpdHkuaCBiL2luY2x1ZGUvbGludXgvY2FwYWJpbGl0eS5oCmluZGV4IGUyMmY0OGMuLjAyYmRiNzYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvY2FwYWJpbGl0eS5oCisrKyBiL2luY2x1ZGUvbGludXgvY2FwYWJpbGl0eS5oCkBAIC01MjksOCArNTI5LDIxIEBACiAgKgogICogTm90ZSB0aGF0IHRoaXMgZG9lcyBub3Qgc2V0IFBGX1NVUEVSUFJJViBvbiB0aGUgdGFzay4KICAqLwotI2RlZmluZSBoYXNfY2FwYWJpbGl0eSh0LCBjYXApIChzZWN1cml0eV9jYXBhYmxlKCh0KSwgKGNhcCkpID09IDApCi0jZGVmaW5lIGhhc19jYXBhYmlsaXR5X25vYXVkaXQodCwgY2FwKSAoc2VjdXJpdHlfY2FwYWJsZV9ub2F1ZGl0KCh0KSwgKGNhcCkpID09IDApCisjZGVmaW5lIGhhc19jYXBhYmlsaXR5KHQsIGNhcCkgKHNlY3VyaXR5X3JlYWxfY2FwYWJsZSgodCksIChjYXApKSA9PSAwKQorCisvKioKKyAqIGhhc19jYXBhYmlsaXR5X25vYXVkaXQgLSBEZXRlcm1pbmUgaWYgYSB0YXNrIGhhcyBhIHN1cGVyaW9yIGNhcGFiaWxpdHkgYXZhaWxhYmxlICh1bmF1ZGl0ZWQpCisgKiBAdDogVGhlIHRhc2sgaW4gcXVlc3Rpb24KKyAqIEBjYXA6IFRoZSBjYXBhYmlsaXR5IHRvIGJlIHRlc3RlZCBmb3IKKyAqCisgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIHRhc2sgaGFzIHRoZSBnaXZlbiBzdXBlcmlvciBjYXBhYmlsaXR5CisgKiBjdXJyZW50bHkgaW4gZWZmZWN0LCBmYWxzZSBpZiBub3QsIGJ1dCBkb24ndCB3cml0ZSBhbiBhdWRpdCBtZXNzYWdlIGZvciB0aGUKKyAqIGNoZWNrLgorICoKKyAqIE5vdGUgdGhhdCB0aGlzIGRvZXMgbm90IHNldCBQRl9TVVBFUlBSSVYgb24gdGhlIHRhc2suCisgKi8KKyNkZWZpbmUgaGFzX2NhcGFiaWxpdHlfbm9hdWRpdCh0LCBjYXApIFwKKwkoc2VjdXJpdHlfcmVhbF9jYXBhYmxlX25vYXVkaXQoKHQpLCAoY2FwKSkgPT0gMCkKIAogZXh0ZXJuIGludCBjYXBhYmxlKGludCBjYXApOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2Nncm91cC5oIGIvaW5jbHVkZS9saW51eC9jZ3JvdXAuaAppbmRleCAxMTY0OTYzLi5lMjY3ZTYyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2Nncm91cC5oCisrKyBiL2luY2x1ZGUvbGludXgvY2dyb3VwLmgKQEAgLTUyLDkgKzUyLDkgQEAKIAkgKiBoaWVyYXJjaHkgc3RydWN0dXJlICovCiAJc3RydWN0IGNncm91cCAqY2dyb3VwOwogCi0JLyogU3RhdGUgbWFpbnRhaW5lZCBieSB0aGUgY2dyb3VwIHN5c3RlbSB0byBhbGxvdwotCSAqIHN1YnN5c3RlbXMgdG8gYmUgImJ1c3kiLiBTaG91bGQgYmUgYWNjZXNzZWQgdmlhIGNzc19nZXQoKQotCSAqIGFuZCBjc3NfcHV0KCkgKi8KKwkvKiBTdGF0ZSBtYWludGFpbmVkIGJ5IHRoZSBjZ3JvdXAgc3lzdGVtIHRvIGFsbG93IHN1YnN5c3RlbXMKKwkgKiB0byBiZSAiYnVzeSIuIFNob3VsZCBiZSBhY2Nlc3NlZCB2aWEgY3NzX2dldCgpLAorCSAqIGNzc190cnlnZXQoKSBhbmQgYW5kIGNzc19wdXQoKS4gKi8KIAogCWF0b21pY190IHJlZmNudDsKIApAQCAtNjQsMTEgKzY0LDE0IEBACiAvKiBiaXRzIGluIHN0cnVjdCBjZ3JvdXBfc3Vic3lzX3N0YXRlIGZsYWdzIGZpZWxkICovCiBlbnVtIHsKIAlDU1NfUk9PVCwgLyogVGhpcyBDU1MgaXMgdGhlIHJvb3Qgb2YgdGhlIHN1YnN5c3RlbSAqLworCUNTU19SRU1PVkVELCAvKiBUaGlzIENTUyBpcyBkZWFkICovCiB9OwogCiAvKgotICogQ2FsbCBjc3NfZ2V0KCkgdG8gaG9sZCBhIHJlZmVyZW5jZSBvbiB0aGUgY2dyb3VwOwotICoKKyAqIENhbGwgY3NzX2dldCgpIHRvIGhvbGQgYSByZWZlcmVuY2Ugb24gdGhlIGNzczsgaXQgY2FuIGJlIHVzZWQKKyAqIGZvciBhIHJlZmVyZW5jZSBvYnRhaW5lZCB2aWE6CisgKiAtIGFuIGV4aXN0aW5nIHJlZi1jb3VudGVkIHJlZmVyZW5jZSB0byB0aGUgY3NzCisgKiAtIHRhc2stPmNncm91cHMgZm9yIGEgbG9ja2VkIHRhc2sKICAqLwogCiBzdGF0aWMgaW5saW5lIHZvaWQgY3NzX2dldChzdHJ1Y3QgY2dyb3VwX3N1YnN5c19zdGF0ZSAqY3NzKQpAQCAtNzcsOSArODAsMzIgQEAKIAlpZiAoIXRlc3RfYml0KENTU19ST09ULCAmY3NzLT5mbGFncykpCiAJCWF0b21pY19pbmMoJmNzcy0+cmVmY250KTsKIH0KKworc3RhdGljIGlubGluZSBib29sIGNzc19pc19yZW1vdmVkKHN0cnVjdCBjZ3JvdXBfc3Vic3lzX3N0YXRlICpjc3MpCit7CisJcmV0dXJuIHRlc3RfYml0KENTU19SRU1PVkVELCAmY3NzLT5mbGFncyk7Cit9CisKKy8qCisgKiBDYWxsIGNzc190cnlnZXQoKSB0byB0YWtlIGEgcmVmZXJlbmNlIG9uIGEgY3NzIGlmIHlvdXIgZXhpc3RpbmcKKyAqIChrbm93bi12YWxpZCkgcmVmZXJlbmNlIGlzbid0IGFscmVhZHkgcmVmLWNvdW50ZWQuIFJldHVybnMgZmFsc2UgaWYKKyAqIHRoZSBjc3MgaGFzIGJlZW4gZGVzdHJveWVkLgorICovCisKK3N0YXRpYyBpbmxpbmUgYm9vbCBjc3NfdHJ5Z2V0KHN0cnVjdCBjZ3JvdXBfc3Vic3lzX3N0YXRlICpjc3MpCit7CisJaWYgKHRlc3RfYml0KENTU19ST09ULCAmY3NzLT5mbGFncykpCisJCXJldHVybiB0cnVlOworCXdoaWxlICghYXRvbWljX2luY19ub3RfemVybygmY3NzLT5yZWZjbnQpKSB7CisJCWlmICh0ZXN0X2JpdChDU1NfUkVNT1ZFRCwgJmNzcy0+ZmxhZ3MpKQorCQkJcmV0dXJuIGZhbHNlOworCX0KKwlyZXR1cm4gdHJ1ZTsKK30KKwogLyoKICAqIGNzc19wdXQoKSBzaG91bGQgYmUgY2FsbGVkIHRvIHJlbGVhc2UgYSByZWZlcmVuY2UgdGFrZW4gYnkKLSAqIGNzc19nZXQoKQorICogY3NzX2dldCgpIG9yIGNzc190cnlnZXQoKQogICovCiAKIGV4dGVybiB2b2lkIF9fY3NzX3B1dChzdHJ1Y3QgY2dyb3VwX3N1YnN5c19zdGF0ZSAqY3NzKTsKQEAgLTExNiw3ICsxNDIsNyBAQAogCXN0cnVjdCBsaXN0X2hlYWQgY2hpbGRyZW47CS8qIG15IGNoaWxkcmVuICovCiAKIAlzdHJ1Y3QgY2dyb3VwICpwYXJlbnQ7CS8qIG15IHBhcmVudCAqLwotCXN0cnVjdCBkZW50cnkgKmRlbnRyeTsJICAJLyogY2dyb3VwIGZzIGVudHJ5ICovCisJc3RydWN0IGRlbnRyeSAqZGVudHJ5OwkgIAkvKiBjZ3JvdXAgZnMgZW50cnksIFJDVSBwcm90ZWN0ZWQgKi8KIAogCS8qIFByaXZhdGUgcG9pbnRlcnMgZm9yIGVhY2ggcmVnaXN0ZXJlZCBzdWJzeXN0ZW0gKi8KIAlzdHJ1Y3QgY2dyb3VwX3N1YnN5c19zdGF0ZSAqc3Vic3lzW0NHUk9VUF9TVUJTWVNfQ09VTlRdOwpAQCAtMTQ1LDYgKzE3MSw5IEBACiAJaW50IHBpZHNfdXNlX2NvdW50OwogCS8qIExlbmd0aCBvZiB0aGUgY3VycmVudCB0YXNrc19waWRzIGFycmF5ICovCiAJaW50IHBpZHNfbGVuZ3RoOworCisJLyogRm9yIFJDVS1wcm90ZWN0ZWQgZGVsZXRpb24gKi8KKwlzdHJ1Y3QgcmN1X2hlYWQgcmN1X2hlYWQ7CiB9OwogCiAvKiBBIGNzc19zZXQgaXMgYSBzdHJ1Y3R1cmUgaG9sZGluZyBwb2ludGVycyB0byBhIHNldCBvZgpAQCAtMzI5LDEzICszNTgsNyBAQAogCQkJc3RydWN0IGNncm91cCAqY2dycCk7CiAJdm9pZCAoKnBvc3RfY2xvbmUpKHN0cnVjdCBjZ3JvdXBfc3Vic3lzICpzcywgc3RydWN0IGNncm91cCAqY2dycCk7CiAJdm9pZCAoKmJpbmQpKHN0cnVjdCBjZ3JvdXBfc3Vic3lzICpzcywgc3RydWN0IGNncm91cCAqcm9vdCk7Ci0JLyoKLQkgKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIHdpdGggdGhlIHRhc2tfbG9jayBvZiBtbS0+b3duZXIgaGVsZAotCSAqLwotCXZvaWQgKCptbV9vd25lcl9jaGFuZ2VkKShzdHJ1Y3QgY2dyb3VwX3N1YnN5cyAqc3MsCi0JCQkJCXN0cnVjdCBjZ3JvdXAgKm9sZCwKLQkJCQkJc3RydWN0IGNncm91cCAqbmV3LAotCQkJCQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApOworCiAJaW50IHN1YnN5c19pZDsKIAlpbnQgYWN0aXZlOwogCWludCBkaXNhYmxlZDsKQEAgLTM0Myw5ICszNjYsMjMgQEAKICNkZWZpbmUgTUFYX0NHUk9VUF9UWVBFX05BTUVMRU4gMzIKIAljb25zdCBjaGFyICpuYW1lOwogCi0JLyogUHJvdGVjdGVkIGJ5IFJDVSAqLwotCXN0cnVjdCBjZ3JvdXBmc19yb290ICpyb290OworCS8qCisJICogUHJvdGVjdHMgc2libGluZy9jaGlsZHJlbiBsaW5rcyBvZiBjZ3JvdXBzIGluIHRoaXMKKwkgKiBoaWVyYXJjaHksIHBsdXMgcHJvdGVjdHMgd2hpY2ggaGllcmFyY2h5IChvciBub25lKSB0aGUKKwkgKiBzdWJzeXN0ZW0gaXMgYSBwYXJ0IG9mIChpLmUuIHJvb3Qvc2libGluZykuICBUbyBhdm9pZAorCSAqIHBvdGVudGlhbCBkZWFkbG9ja3MsIHRoZSBmb2xsb3dpbmcgb3BlcmF0aW9ucyBzaG91bGQgbm90IGJlCisJICogdW5kZXJ0YWtlbiB3aGlsZSBob2xkaW5nIGFueSBoaWVyYXJjaHlfbXV0ZXg6CisJICoKKwkgKiAtIGFsbG9jYXRpbmcgbWVtb3J5CisJICogLSBpbml0aWF0aW5nIGhvdHBsdWcgZXZlbnRzCisJICovCisJc3RydWN0IG11dGV4IGhpZXJhcmNoeV9tdXRleDsKIAorCS8qCisJICogTGluayB0byBwYXJlbnQsIGFuZCBsaXN0IGVudHJ5IGluIHBhcmVudCdzIGNoaWxkcmVuLgorCSAqIFByb3RlY3RlZCBieSB0aGlzLT5oaWVyYXJjaHlfbXV0ZXggYW5kIGNncm91cF9sb2NrKCkKKwkgKi8KKwlzdHJ1Y3QgY2dyb3VwZnNfcm9vdCAqcm9vdDsKIAlzdHJ1Y3QgbGlzdF9oZWFkIHNpYmxpbmc7CiB9OwogCkBAIC00MDAsOSArNDM3LDYgQEAKIGludCBjZ3JvdXBfc2Nhbl90YXNrcyhzdHJ1Y3QgY2dyb3VwX3NjYW5uZXIgKnNjYW4pOwogaW50IGNncm91cF9hdHRhY2hfdGFzayhzdHJ1Y3QgY2dyb3VwICosIHN0cnVjdCB0YXNrX3N0cnVjdCAqKTsKIAotdm9pZCBjZ3JvdXBfbW1fb3duZXJfY2FsbGJhY2tzKHN0cnVjdCB0YXNrX3N0cnVjdCAqb2xkLAotCQkJICAgICAgIHN0cnVjdCB0YXNrX3N0cnVjdCAqbmV3KTsKLQogI2Vsc2UgLyogIUNPTkZJR19DR1JPVVBTICovCiAKIHN0YXRpYyBpbmxpbmUgaW50IGNncm91cF9pbml0X2Vhcmx5KHZvaWQpIHsgcmV0dXJuIDA7IH0KQEAgLTQyMCw5ICs0NTQsNiBAQAogCXJldHVybiAtRUlOVkFMOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgY2dyb3VwX21tX293bmVyX2NhbGxiYWNrcyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKm9sZCwKLQkJCQkJICAgICBzdHJ1Y3QgdGFza19zdHJ1Y3QgKm5ldykge30KLQogI2VuZGlmIC8qICFDT05GSUdfQ0dST1VQUyAqLwogCiAjZW5kaWYgLyogX0xJTlVYX0NHUk9VUF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2NwdWZyZXEuaCBiL2luY2x1ZGUvbGludXgvY3B1ZnJlcS5oCmluZGV4IDFlZTYwOGYuLjQ4NGIzYWIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvY3B1ZnJlcS5oCisrKyBiL2luY2x1ZGUvbGludXgvY3B1ZnJlcS5oCkBAIC0yMzQsNiArMjM0LDcgQEAKIAlpbnQJKCpzdXNwZW5kKQkoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3ksIHBtX21lc3NhZ2VfdCBwbXNnKTsKIAlpbnQJKCpyZXN1bWUpCShzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSk7CiAJc3RydWN0IGZyZXFfYXR0cgkqKmF0dHI7CisJYm9vbAkJCWhpZGVfaW50ZXJmYWNlOwogfTsKIAogLyogZmxhZ3MgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvY3B1c2V0LmggYi9pbmNsdWRlL2xpbnV4L2NwdXNldC5oCmluZGV4IDhlNTQwZDMuLjkwYzYwNzQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvY3B1c2V0LmgKKysrIGIvaW5jbHVkZS9saW51eC9jcHVzZXQuaApAQCAtMjAsOCArMjAsOSBAQAogZXh0ZXJuIGludCBjcHVzZXRfaW5pdF9lYXJseSh2b2lkKTsKIGV4dGVybiBpbnQgY3B1c2V0X2luaXQodm9pZCk7CiBleHRlcm4gdm9pZCBjcHVzZXRfaW5pdF9zbXAodm9pZCk7Ci1leHRlcm4gdm9pZCBjcHVzZXRfY3B1c19hbGxvd2VkKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgY3B1bWFza190ICptYXNrKTsKLWV4dGVybiB2b2lkIGNwdXNldF9jcHVzX2FsbG93ZWRfbG9ja2VkKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgY3B1bWFza190ICptYXNrKTsKK2V4dGVybiB2b2lkIGNwdXNldF9jcHVzX2FsbG93ZWQoc3RydWN0IHRhc2tfc3RydWN0ICpwLCBzdHJ1Y3QgY3B1bWFzayAqbWFzayk7CitleHRlcm4gdm9pZCBjcHVzZXRfY3B1c19hbGxvd2VkX2xvY2tlZChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsCisJCQkJICAgICAgIHN0cnVjdCBjcHVtYXNrICptYXNrKTsKIGV4dGVybiBub2RlbWFza190IGNwdXNldF9tZW1zX2FsbG93ZWQoc3RydWN0IHRhc2tfc3RydWN0ICpwKTsKICNkZWZpbmUgY3B1c2V0X2N1cnJlbnRfbWVtc19hbGxvd2VkIChjdXJyZW50LT5tZW1zX2FsbG93ZWQpCiB2b2lkIGNwdXNldF9pbml0X2N1cnJlbnRfbWVtc19hbGxvd2VkKHZvaWQpOwpAQCAtNzgsMTggKzc5LDIxIEBACiAKIGV4dGVybiB2b2lkIHJlYnVpbGRfc2NoZWRfZG9tYWlucyh2b2lkKTsKIAorZXh0ZXJuIHZvaWQgY3B1c2V0X3ByaW50X3Rhc2tfbWVtc19hbGxvd2VkKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCk7CisKICNlbHNlIC8qICFDT05GSUdfQ1BVU0VUUyAqLwogCiBzdGF0aWMgaW5saW5lIGludCBjcHVzZXRfaW5pdF9lYXJseSh2b2lkKSB7IHJldHVybiAwOyB9CiBzdGF0aWMgaW5saW5lIGludCBjcHVzZXRfaW5pdCh2b2lkKSB7IHJldHVybiAwOyB9CiBzdGF0aWMgaW5saW5lIHZvaWQgY3B1c2V0X2luaXRfc21wKHZvaWQpIHt9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBjcHVzZXRfY3B1c19hbGxvd2VkKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgY3B1bWFza190ICptYXNrKQorc3RhdGljIGlubGluZSB2b2lkIGNwdXNldF9jcHVzX2FsbG93ZWQoc3RydWN0IHRhc2tfc3RydWN0ICpwLAorCQkJCSAgICAgICBzdHJ1Y3QgY3B1bWFzayAqbWFzaykKIHsKIAkqbWFzayA9IGNwdV9wb3NzaWJsZV9tYXA7CiB9CiBzdGF0aWMgaW5saW5lIHZvaWQgY3B1c2V0X2NwdXNfYWxsb3dlZF9sb2NrZWQoc3RydWN0IHRhc2tfc3RydWN0ICpwLAotCQkJCQkJCQljcHVtYXNrX3QgKm1hc2spCisJCQkJCSAgICAgIHN0cnVjdCBjcHVtYXNrICptYXNrKQogewogCSptYXNrID0gY3B1X3Bvc3NpYmxlX21hcDsKIH0KQEAgLTE1OSw2ICsxNjMsMTAgQEAKIAlwYXJ0aXRpb25fc2NoZWRfZG9tYWlucygxLCBOVUxMLCBOVUxMKTsKIH0KIAorc3RhdGljIGlubGluZSB2b2lkIGNwdXNldF9wcmludF90YXNrX21lbXNfYWxsb3dlZChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCit7Cit9CisKICNlbmRpZiAvKiAhQ09ORklHX0NQVVNFVFMgKi8KIAogI2VuZGlmIC8qIF9MSU5VWF9DUFVTRVRfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9kZWJ1Z2ZzLmggYi9pbmNsdWRlL2xpbnV4L2RlYnVnZnMuaAppbmRleCBlMWE2YzA0Li4yMzkzNmIxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2RlYnVnZnMuaAorKysgYi9pbmNsdWRlL2xpbnV4L2RlYnVnZnMuaApAQCAtNjMsNiArNjMsOCBAQAogCQkJCSAgc3RydWN0IGRlbnRyeSAqcGFyZW50LCB1MTYgKnZhbHVlKTsKIHN0cnVjdCBkZW50cnkgKmRlYnVnZnNfY3JlYXRlX3gzMihjb25zdCBjaGFyICpuYW1lLCBtb2RlX3QgbW9kZSwKIAkJCQkgIHN0cnVjdCBkZW50cnkgKnBhcmVudCwgdTMyICp2YWx1ZSk7CitzdHJ1Y3QgZGVudHJ5ICpkZWJ1Z2ZzX2NyZWF0ZV9zaXplX3QoY29uc3QgY2hhciAqbmFtZSwgbW9kZV90IG1vZGUsCisJCQkJICAgICBzdHJ1Y3QgZGVudHJ5ICpwYXJlbnQsIHNpemVfdCAqdmFsdWUpOwogc3RydWN0IGRlbnRyeSAqZGVidWdmc19jcmVhdGVfYm9vbChjb25zdCBjaGFyICpuYW1lLCBtb2RlX3QgbW9kZSwKIAkJCQkgIHN0cnVjdCBkZW50cnkgKnBhcmVudCwgdTMyICp2YWx1ZSk7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZGV2aWNlLW1hcHBlci5oIGIvaW5jbHVkZS9saW51eC9kZXZpY2UtbWFwcGVyLmgKaW5kZXggYzE3ZmQzMy4uODIwOWUwOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9kZXZpY2UtbWFwcGVyLmgKKysrIGIvaW5jbHVkZS9saW51eC9kZXZpY2UtbWFwcGVyLmgKQEAgLTQ1LDYgKzQ1LDggQEAKICAqLwogdHlwZWRlZiBpbnQgKCpkbV9tYXBfZm4pIChzdHJ1Y3QgZG1fdGFyZ2V0ICp0aSwgc3RydWN0IGJpbyAqYmlvLAogCQkJICB1bmlvbiBtYXBfaW5mbyAqbWFwX2NvbnRleHQpOwordHlwZWRlZiBpbnQgKCpkbV9tYXBfcmVxdWVzdF9mbikgKHN0cnVjdCBkbV90YXJnZXQgKnRpLCBzdHJ1Y3QgcmVxdWVzdCAqY2xvbmUsCisJCQkJICB1bmlvbiBtYXBfaW5mbyAqbWFwX2NvbnRleHQpOwogCiAvKgogICogUmV0dXJuczoKQEAgLTU3LDYgKzU5LDkgQEAKIHR5cGVkZWYgaW50ICgqZG1fZW5kaW9fZm4pIChzdHJ1Y3QgZG1fdGFyZ2V0ICp0aSwKIAkJCSAgICBzdHJ1Y3QgYmlvICpiaW8sIGludCBlcnJvciwKIAkJCSAgICB1bmlvbiBtYXBfaW5mbyAqbWFwX2NvbnRleHQpOwordHlwZWRlZiBpbnQgKCpkbV9yZXF1ZXN0X2VuZGlvX2ZuKSAoc3RydWN0IGRtX3RhcmdldCAqdGksCisJCQkJICAgIHN0cnVjdCByZXF1ZXN0ICpjbG9uZSwgaW50IGVycm9yLAorCQkJCSAgICB1bmlvbiBtYXBfaW5mbyAqbWFwX2NvbnRleHQpOwogCiB0eXBlZGVmIHZvaWQgKCpkbV9mbHVzaF9mbikgKHN0cnVjdCBkbV90YXJnZXQgKnRpKTsKIHR5cGVkZWYgdm9pZCAoKmRtX3ByZXN1c3BlbmRfZm4pIChzdHJ1Y3QgZG1fdGFyZ2V0ICp0aSk7CkBAIC03NSw2ICs4MCwxMyBAQAogdHlwZWRlZiBpbnQgKCpkbV9tZXJnZV9mbikgKHN0cnVjdCBkbV90YXJnZXQgKnRpLCBzdHJ1Y3QgYnZlY19tZXJnZV9kYXRhICpidm0sCiAJCQkgICAgc3RydWN0IGJpb192ZWMgKmJpb3ZlYywgaW50IG1heF9zaXplKTsKIAorLyoKKyAqIFJldHVybnM6CisgKiAgICAwOiBUaGUgdGFyZ2V0IGNhbiBoYW5kbGUgdGhlIG5leHQgSS9PIGltbWVkaWF0ZWx5LgorICogICAgMTogVGhlIHRhcmdldCBjYW4ndCBoYW5kbGUgdGhlIG5leHQgSS9PIGltbWVkaWF0ZWx5LgorICovCit0eXBlZGVmIGludCAoKmRtX2J1c3lfZm4pIChzdHJ1Y3QgZG1fdGFyZ2V0ICp0aSk7CisKIHZvaWQgZG1fZXJyb3IoY29uc3QgY2hhciAqbWVzc2FnZSk7CiAKIC8qCkBAIC0xMDAsMTQgKzExMiwyMyBAQAogLyoKICAqIEluZm9ybWF0aW9uIGFib3V0IGEgdGFyZ2V0IHR5cGUKICAqLworCisvKgorICogVGFyZ2V0IGZlYXR1cmVzCisgKi8KKyNkZWZpbmUgRE1fVEFSR0VUX1NVUFBPUlRTX0JBUlJJRVJTIDB4MDAwMDAwMDEKKwogc3RydWN0IHRhcmdldF90eXBlIHsKKwl1aW50NjRfdCBmZWF0dXJlczsKIAljb25zdCBjaGFyICpuYW1lOwogCXN0cnVjdCBtb2R1bGUgKm1vZHVsZTsKIAl1bnNpZ25lZCB2ZXJzaW9uWzNdOwogCWRtX2N0cl9mbiBjdHI7CiAJZG1fZHRyX2ZuIGR0cjsKIAlkbV9tYXBfZm4gbWFwOworCWRtX21hcF9yZXF1ZXN0X2ZuIG1hcF9ycTsKIAlkbV9lbmRpb19mbiBlbmRfaW87CisJZG1fcmVxdWVzdF9lbmRpb19mbiBycV9lbmRfaW87CiAJZG1fZmx1c2hfZm4gZmx1c2g7CiAJZG1fcHJlc3VzcGVuZF9mbiBwcmVzdXNwZW5kOwogCWRtX3Bvc3RzdXNwZW5kX2ZuIHBvc3RzdXNwZW5kOwpAQCAtMTE3LDYgKzEzOCw3IEBACiAJZG1fbWVzc2FnZV9mbiBtZXNzYWdlOwogCWRtX2lvY3RsX2ZuIGlvY3RsOwogCWRtX21lcmdlX2ZuIG1lcmdlOworCWRtX2J1c3lfZm4gYnVzeTsKIH07CiAKIHN0cnVjdCBpb19yZXN0cmljdGlvbnMgewpAQCAtMTU3LDggKzE3OSw3IEBACiB9OwogCiBpbnQgZG1fcmVnaXN0ZXJfdGFyZ2V0KHN0cnVjdCB0YXJnZXRfdHlwZSAqdCk7Ci1pbnQgZG1fdW5yZWdpc3Rlcl90YXJnZXQoc3RydWN0IHRhcmdldF90eXBlICp0KTsKLQordm9pZCBkbV91bnJlZ2lzdGVyX3RhcmdldChzdHJ1Y3QgdGFyZ2V0X3R5cGUgKnQpOwogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiBGdW5jdGlvbnMgZm9yIGNyZWF0aW5nIGFuZCBtYW5pcHVsYXRpbmcgbWFwcGVkIGRldmljZXMuCkBAIC0yNzYsNiArMjk3LDkgQEAKICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICNkZWZpbmUgRE1fTkFNRSAiZGV2aWNlLW1hcHBlciIKIAorI2RlZmluZSBETUNSSVQoZiwgYXJnLi4uKSBcCisJcHJpbnRrKEtFUk5fQ1JJVCBETV9OQU1FICI6ICIgRE1fTVNHX1BSRUZJWCAiOiAiIGYgIlxuIiwgIyMgYXJnKQorCiAjZGVmaW5lIERNRVJSKGYsIGFyZy4uLikgXAogCXByaW50ayhLRVJOX0VSUiBETV9OQU1FICI6ICIgRE1fTVNHX1BSRUZJWCAiOiAiIGYgIlxuIiwgIyMgYXJnKQogI2RlZmluZSBETUVSUl9MSU1JVChmLCBhcmcuLi4pIFwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZGV2aWNlLmggYi9pbmNsdWRlL2xpbnV4L2RldmljZS5oCmluZGV4IDFhMzY4NmQuLjdkOWRhNGIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZGV2aWNlLmgKKysrIGIvaW5jbHVkZS9saW51eC9kZXZpY2UuaApAQCAtMjgsNiArMjgsNyBAQAogI2RlZmluZSBCVVNfSURfU0laRQkJMjAKIAogc3RydWN0IGRldmljZTsKK3N0cnVjdCBkZXZpY2VfcHJpdmF0ZTsKIHN0cnVjdCBkZXZpY2VfZHJpdmVyOwogc3RydWN0IGRyaXZlcl9wcml2YXRlOwogc3RydWN0IGNsYXNzOwpAQCAtNjUsNyArNjYsNyBAQAogCWludCAoKnJlc3VtZV9lYXJseSkoc3RydWN0IGRldmljZSAqZGV2KTsKIAlpbnQgKCpyZXN1bWUpKHN0cnVjdCBkZXZpY2UgKmRldik7CiAKLQlzdHJ1Y3QgcG1fZXh0X29wcyAqcG07CisJc3RydWN0IGRldl9wbV9vcHMgKnBtOwogCiAJc3RydWN0IGJ1c190eXBlX3ByaXZhdGUgKnA7CiB9OwpAQCAtMTMzLDcgKzEzNCw3IEBACiAJaW50ICgqcmVzdW1lKSAoc3RydWN0IGRldmljZSAqZGV2KTsKIAlzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwICoqZ3JvdXBzOwogCi0Jc3RydWN0IHBtX29wcyAqcG07CisJc3RydWN0IGRldl9wbV9vcHMgKnBtOwogCiAJc3RydWN0IGRyaXZlcl9wcml2YXRlICpwOwogfTsKQEAgLTE5OCw3ICsxOTksNyBAQAogCWludCAoKnN1c3BlbmQpKHN0cnVjdCBkZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlKTsKIAlpbnQgKCpyZXN1bWUpKHN0cnVjdCBkZXZpY2UgKmRldik7CiAKLQlzdHJ1Y3QgcG1fb3BzICpwbTsKKwlzdHJ1Y3QgZGV2X3BtX29wcyAqcG07CiAJc3RydWN0IGNsYXNzX3ByaXZhdGUgKnA7CiB9OwogCkBAIC0yOTEsNyArMjkyLDcgQEAKIAlpbnQgKCpzdXNwZW5kKShzdHJ1Y3QgZGV2aWNlICpkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSk7CiAJaW50ICgqcmVzdW1lKShzdHJ1Y3QgZGV2aWNlICpkZXYpOwogCi0Jc3RydWN0IHBtX29wcyAqcG07CisJc3RydWN0IGRldl9wbV9vcHMgKnBtOwogfTsKIAogLyogaW50ZXJmYWNlIGZvciBleHBvcnRpbmcgZGV2aWNlIGF0dHJpYnV0ZXMgKi8KQEAgLTM2NSwxNyArMzY2LDE1IEBACiB9OwogCiBzdHJ1Y3QgZGV2aWNlIHsKLQlzdHJ1Y3Qga2xpc3QJCWtsaXN0X2NoaWxkcmVuOwotCXN0cnVjdCBrbGlzdF9ub2RlCWtub2RlX3BhcmVudDsJLyogbm9kZSBpbiBzaWJsaW5nIGxpc3QgKi8KLQlzdHJ1Y3Qga2xpc3Rfbm9kZQlrbm9kZV9kcml2ZXI7Ci0Jc3RydWN0IGtsaXN0X25vZGUJa25vZGVfYnVzOwogCXN0cnVjdCBkZXZpY2UJCSpwYXJlbnQ7CiAKKwlzdHJ1Y3QgZGV2aWNlX3ByaXZhdGUJKnA7CisKIAlzdHJ1Y3Qga29iamVjdCBrb2JqOwogCWNoYXIJYnVzX2lkW0JVU19JRF9TSVpFXTsJLyogcG9zaXRpb24gb24gcGFyZW50IGJ1cyAqLworCXVuc2lnbmVkCQl1ZXZlbnRfc3VwcHJlc3M6MTsKIAljb25zdCBjaGFyCQkqaW5pdF9uYW1lOyAvKiBpbml0aWFsIG5hbWUgb2YgdGhlIGRldmljZSAqLwogCXN0cnVjdCBkZXZpY2VfdHlwZQkqdHlwZTsKLQl1bnNpZ25lZAkJdWV2ZW50X3N1cHByZXNzOjE7CiAKIAlzdHJ1Y3Qgc2VtYXBob3JlCXNlbTsJLyogc2VtYXBob3JlIHRvIHN5bmNocm9uaXplIGNhbGxzIHRvCiAJCQkJCSAqIGl0cyBkcml2ZXIuCkBAIC00MDgsMTIgKzQwNywxMyBAQAogCS8qIGFyY2ggc3BlY2lmaWMgYWRkaXRpb25zICovCiAJc3RydWN0IGRldl9hcmNoZGF0YQlhcmNoZGF0YTsKIAorCWRldl90CQkJZGV2dDsJLyogZGV2X3QsIGNyZWF0ZXMgdGhlIHN5c2ZzICJkZXYiICovCisKIAlzcGlubG9ja190CQlkZXZyZXNfbG9jazsKIAlzdHJ1Y3QgbGlzdF9oZWFkCWRldnJlc19oZWFkOwogCiAJc3RydWN0IGtsaXN0X25vZGUJa25vZGVfY2xhc3M7CiAJc3RydWN0IGNsYXNzCQkqY2xhc3M7Ci0JZGV2X3QJCQlkZXZ0OwkvKiBkZXZfdCwgY3JlYXRlcyB0aGUgc3lzZnMgImRldiIgKi8KIAlzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwCSoqZ3JvdXBzOwkvKiBvcHRpb25hbCBncm91cHMgKi8KIAogCXZvaWQJKCpyZWxlYXNlKShzdHJ1Y3QgZGV2aWNlICpkZXYpOwpAQCAtNDgzLDYgKzQ4MywxNyBAQAogZXh0ZXJuIGludCBkZXZpY2VfbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2UgKm5ld19wYXJlbnQpOwogCiAvKgorICogUm9vdCBkZXZpY2Ugb2JqZWN0cyBmb3IgZ3JvdXBpbmcgdW5kZXIgL3N5cy9kZXZpY2VzCisgKi8KK2V4dGVybiBzdHJ1Y3QgZGV2aWNlICpfX3Jvb3RfZGV2aWNlX3JlZ2lzdGVyKGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJCSAgICAgc3RydWN0IG1vZHVsZSAqb3duZXIpOworc3RhdGljIGlubGluZSBzdHJ1Y3QgZGV2aWNlICpyb290X2RldmljZV9yZWdpc3Rlcihjb25zdCBjaGFyICpuYW1lKQoreworCXJldHVybiBfX3Jvb3RfZGV2aWNlX3JlZ2lzdGVyKG5hbWUsIFRISVNfTU9EVUxFKTsKK30KK2V4dGVybiB2b2lkIHJvb3RfZGV2aWNlX3VucmVnaXN0ZXIoc3RydWN0IGRldmljZSAqcm9vdCk7CisKKy8qCiAgKiBNYW51YWwgYmluZGluZyBvZiBhIGRldmljZSB0byBkcml2ZXIuIFNlZSBkcml2ZXJzL2Jhc2UvYnVzLmMKICAqIGZvciBpbmZvcm1hdGlvbiBvbiB1c2UuCiAgKi8KQEAgLTU1MywxMyArNTY0LDEzIEBACiAjZGVmaW5lIGRldl9pbmZvKGRldiwgZm9ybWF0LCBhcmcuLi4pCQlcCiAJZGV2X3ByaW50ayhLRVJOX0lORk8gLCBkZXYgLCBmb3JtYXQgLCAjIyBhcmcpCiAKLSNpZiBkZWZpbmVkKENPTkZJR19EWU5BTUlDX1BSSU5US19ERUJVRykKKyNpZiBkZWZpbmVkKERFQlVHKQorI2RlZmluZSBkZXZfZGJnKGRldiwgZm9ybWF0LCBhcmcuLi4pCQlcCisJZGV2X3ByaW50ayhLRVJOX0RFQlVHICwgZGV2ICwgZm9ybWF0ICwgIyMgYXJnKQorI2VsaWYgZGVmaW5lZChDT05GSUdfRFlOQU1JQ19QUklOVEtfREVCVUcpCiAjZGVmaW5lIGRldl9kYmcoZGV2LCBmb3JtYXQsIC4uLikgZG8geyBcCiAJZHluYW1pY19kZXZfZGJnKGRldiwgZm9ybWF0LCAjI19fVkFfQVJHU19fKTsgXAogCX0gd2hpbGUgKDApCi0jZWxpZiBkZWZpbmVkKERFQlVHKQotI2RlZmluZSBkZXZfZGJnKGRldiwgZm9ybWF0LCBhcmcuLi4pCQlcCi0JZGV2X3ByaW50ayhLRVJOX0RFQlVHICwgZGV2ICwgZm9ybWF0ICwgIyMgYXJnKQogI2Vsc2UKICNkZWZpbmUgZGV2X2RiZyhkZXYsIGZvcm1hdCwgYXJnLi4uKQkJXAogCSh7IGlmICgwKSBkZXZfcHJpbnRrKEtFUk5fREVCVUcsIGRldiwgZm9ybWF0LCAjI2FyZyk7IDA7IH0pCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2RtYV9yZW1hcHBpbmcuaCBiL2luY2x1ZGUvbGludXgvZG1hX3JlbWFwcGluZy5oCmluZGV4IDEzNmYxNzAuLmFmMWRhYjQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZG1hX3JlbWFwcGluZy5oCisrKyBiL2luY2x1ZGUvbGludXgvZG1hX3JlbWFwcGluZy5oCkBAIC0xNyw3ICsxNywxNSBAQAogc3RydWN0IHJvb3RfZW50cnk7CiAKIGV4dGVybiB2b2lkIGZyZWVfZG1hcl9pb21tdShzdHJ1Y3QgaW50ZWxfaW9tbXUgKmlvbW11KTsKKworI2lmZGVmIENPTkZJR19ETUFSCiBleHRlcm4gaW50IGlvbW11X2NhbGN1bGF0ZV9hZ2F3KHN0cnVjdCBpbnRlbF9pb21tdSAqaW9tbXUpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgaW50IGlvbW11X2NhbGN1bGF0ZV9hZ2F3KHN0cnVjdCBpbnRlbF9pb21tdSAqaW9tbXUpCit7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKIAogZXh0ZXJuIGludCBkbWFyX2Rpc2FibGVkOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2RxYmxrX3F0cmVlLmggYi9pbmNsdWRlL2xpbnV4L2RxYmxrX3F0cmVlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODJhMTY1MgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvZHFibGtfcXRyZWUuaApAQCAtMCwwICsxLDU2IEBACisvKgorICoJRGVmaW5pdGlvbnMgb2Ygc3RydWN0dXJlcyBhbmQgZnVuY3Rpb25zIGZvciBxdW90YSBmb3JtYXRzIHVzaW5nIHRyaWUKKyAqLworCisjaWZuZGVmIF9MSU5VWF9EUUJMS19RVFJFRV9ICisjZGVmaW5lIF9MSU5VWF9EUUJMS19RVFJFRV9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisvKiBOdW1iZXJzIG9mIGJsb2NrcyBuZWVkZWQgZm9yIHVwZGF0ZXMgLSB3ZSBjb3VudCB3aXRoIHRoZSBzbWFsbGVzdAorICogcG9zc2libGUgYmxvY2sgc2l6ZSAoMTAyNCkgKi8KKyNkZWZpbmUgUVRSRUVfSU5JVF9BTExPQyA0CisjZGVmaW5lIFFUUkVFX0lOSVRfUkVXUklURSAyCisjZGVmaW5lIFFUUkVFX0RFTF9BTExPQyAwCisjZGVmaW5lIFFUUkVFX0RFTF9SRVdSSVRFIDYKKworc3RydWN0IGRxdW90OworCisvKiBPcGVyYXRpb25zICovCitzdHJ1Y3QgcXRyZWVfZm10X29wZXJhdGlvbnMgeworCXZvaWQgKCptZW0yZGlza19kcWJsaykodm9pZCAqZGlzaywgc3RydWN0IGRxdW90ICpkcXVvdCk7CS8qIENvbnZlcnQgZ2l2ZW4gZW50cnkgZnJvbSBpbiBtZW1vcnkgZm9ybWF0IHRvIGRpc2sgb25lICovCisJdm9pZCAoKmRpc2sybWVtX2RxYmxrKShzdHJ1Y3QgZHF1b3QgKmRxdW90LCB2b2lkICpkaXNrKTsJLyogQ29udmVydCBnaXZlbiBlbnRyeSBmcm9tIGRpc2sgZm9ybWF0IHRvIGluIG1lbW9yeSBvbmUgKi8KKwlpbnQgKCppc19pZCkodm9pZCAqZGlzaywgc3RydWN0IGRxdW90ICpkcXVvdCk7CS8qIElzIHRoaXMgc3RydWN0dXJlIGZvciBnaXZlbiBpZD8gKi8KK307CisKKy8qIElubWVtb3J5IGNvcHkgb2YgdmVyc2lvbiBzcGVjaWZpYyBpbmZvcm1hdGlvbiAqLworc3RydWN0IHF0cmVlX21lbV9kcWluZm8geworCXN0cnVjdCBzdXBlcl9ibG9jayAqZHFpX3NiOwkvKiBTYiBxdW90YSBpcyBvbiAqLworCWludCBkcWlfdHlwZTsJCQkvKiBRdW90YSB0eXBlICovCisJdW5zaWduZWQgaW50IGRxaV9ibG9ja3M7CS8qICMgb2YgYmxvY2tzIGluIHF1b3RhIGZpbGUgKi8KKwl1bnNpZ25lZCBpbnQgZHFpX2ZyZWVfYmxrOwkvKiBGaXJzdCBibG9jayBpbiBsaXN0IG9mIGZyZWUgYmxvY2tzICovCisJdW5zaWduZWQgaW50IGRxaV9mcmVlX2VudHJ5OwkvKiBGaXJzdCBibG9jayB3aXRoIGZyZWUgZW50cnkgKi8KKwl1bnNpZ25lZCBpbnQgZHFpX2Jsb2Nrc2l6ZV9iaXRzOwkvKiBCbG9jayBzaXplIG9mIHF1b3RhIGZpbGUgKi8KKwl1bnNpZ25lZCBpbnQgZHFpX2VudHJ5X3NpemU7CS8qIFNpemUgb2YgcXVvdGEgZW50cnkgaW4gcXVvdGEgZmlsZSAqLworCXVuc2lnbmVkIGludCBkcWlfdXNhYmxlX2JzOwkvKiBTcGFjZSB1c2FibGUgaW4gYmxvY2sgZm9yIHF1b3RhIGRhdGEgKi8KKwl1bnNpZ25lZCBpbnQgZHFpX3F0cmVlX2RlcHRoOwkvKiBQcmVjb21wdXRlZCBkZXB0aCBvZiBxdW90YSB0cmVlICovCisJc3RydWN0IHF0cmVlX2ZtdF9vcGVyYXRpb25zICpkcWlfb3BzOwkvKiBPcGVyYXRpb25zIGZvciBlbnRyeSBtYW5pcHVsYXRpb24gKi8KK307CisKK2ludCBxdHJlZV93cml0ZV9kcXVvdChzdHJ1Y3QgcXRyZWVfbWVtX2RxaW5mbyAqaW5mbywgc3RydWN0IGRxdW90ICpkcXVvdCk7CitpbnQgcXRyZWVfcmVhZF9kcXVvdChzdHJ1Y3QgcXRyZWVfbWVtX2RxaW5mbyAqaW5mbywgc3RydWN0IGRxdW90ICpkcXVvdCk7CitpbnQgcXRyZWVfZGVsZXRlX2RxdW90KHN0cnVjdCBxdHJlZV9tZW1fZHFpbmZvICppbmZvLCBzdHJ1Y3QgZHF1b3QgKmRxdW90KTsKK2ludCBxdHJlZV9yZWxlYXNlX2RxdW90KHN0cnVjdCBxdHJlZV9tZW1fZHFpbmZvICppbmZvLCBzdHJ1Y3QgZHF1b3QgKmRxdW90KTsKK2ludCBxdHJlZV9lbnRyeV91bnVzZWQoc3RydWN0IHF0cmVlX21lbV9kcWluZm8gKmluZm8sIGNoYXIgKmRpc2spOworc3RhdGljIGlubGluZSBpbnQgcXRyZWVfZGVwdGgoc3RydWN0IHF0cmVlX21lbV9kcWluZm8gKmluZm8pCit7CisJdW5zaWduZWQgaW50IGVwYiA9IGluZm8tPmRxaV91c2FibGVfYnMgPj4gMjsKKwl1bnNpZ25lZCBsb25nIGxvbmcgZW50cmllcyA9IGVwYjsKKwlpbnQgaTsKKworCWZvciAoaSA9IDE7IGVudHJpZXMgPCAoMVVMTCA8PCAzMik7IGkrKykKKwkJZW50cmllcyAqPSBlcGI7CisJcmV0dXJuIGk7Cit9CisKKyNlbmRpZiAvKiBfTElOVVhfRFFCTEtfUVRSRUVfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9kcWJsa192MS5oIGIvaW5jbHVkZS9saW51eC9kcWJsa192MS5oCmluZGV4IDU3ZjEyNTAuLjM3MTNhNzIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZHFibGtfdjEuaAorKysgYi9pbmNsdWRlL2xpbnV4L2RxYmxrX3YxLmgKQEAgLTUsOSArNSw2IEBACiAjaWZuZGVmIF9MSU5VWF9EUUJMS19WMV9ICiAjZGVmaW5lIF9MSU5VWF9EUUJMS19WMV9ICiAKLS8qIElkIG9mIHF1b3RhIGZvcm1hdCAqLwotI2RlZmluZSBRRk1UX1ZGU19PTEQgMQotCiAvKiBSb290IHNxdWFzaCB0dXJuZWQgb24gKi8KICNkZWZpbmUgVjFfRFFGX1JTUVVBU0ggMQogCkBAIC0xNyw4ICsxNCw0IEBACiAjZGVmaW5lIFYxX0RFTF9BTExPQyAwCiAjZGVmaW5lIFYxX0RFTF9SRVdSSVRFIDIKIAotLyogU3BlY2lhbCBpbmZvcm1hdGlvbiBhYm91dCBxdW90YWZpbGUgKi8KLXN0cnVjdCB2MV9tZW1fZHFpbmZvIHsKLX07Ci0KICNlbmRpZgkvKiBfTElOVVhfRFFCTEtfVjFfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9kcWJsa192Mi5oIGIvaW5jbHVkZS9saW51eC9kcWJsa192Mi5oCmluZGV4IDRmODUzMzIuLjE4MDAwYTUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZHFibGtfdjIuaAorKysgYi9pbmNsdWRlL2xpbnV4L2RxYmxrX3YyLmgKQEAgLTEsMjYgKzEsMTYgQEAKIC8qCi0gKglEZWZpbml0aW9ucyBvZiBzdHJ1Y3R1cmVzIGZvciB2ZnN2MCBxdW90YSBmb3JtYXQKKyAqICBEZWZpbml0aW9ucyBmb3IgdmZzdjAgcXVvdGEgZm9ybWF0CiAgKi8KIAogI2lmbmRlZiBfTElOVVhfRFFCTEtfVjJfSAogI2RlZmluZSBfTElOVVhfRFFCTEtfVjJfSAogCi0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLQotLyogaWQgbnVtYmVycyBvZiBxdW90YSBmb3JtYXQgKi8KLSNkZWZpbmUgUUZNVF9WRlNfVjAgMgorI2luY2x1ZGUgPGxpbnV4L2RxYmxrX3F0cmVlLmg+CiAKIC8qIE51bWJlcnMgb2YgYmxvY2tzIG5lZWRlZCBmb3IgdXBkYXRlcyAqLwotI2RlZmluZSBWMl9JTklUX0FMTE9DIDQKLSNkZWZpbmUgVjJfSU5JVF9SRVdSSVRFIDIKLSNkZWZpbmUgVjJfREVMX0FMTE9DIDAKLSNkZWZpbmUgVjJfREVMX1JFV1JJVEUgNgotCi0vKiBJbm1lbW9yeSBjb3B5IG9mIHZlcnNpb24gc3BlY2lmaWMgaW5mb3JtYXRpb24gKi8KLXN0cnVjdCB2Ml9tZW1fZHFpbmZvIHsKLQl1bnNpZ25lZCBpbnQgZHFpX2Jsb2NrczsKLQl1bnNpZ25lZCBpbnQgZHFpX2ZyZWVfYmxrOwotCXVuc2lnbmVkIGludCBkcWlfZnJlZV9lbnRyeTsKLX07CisjZGVmaW5lIFYyX0lOSVRfQUxMT0MgUVRSRUVfSU5JVF9BTExPQworI2RlZmluZSBWMl9JTklUX1JFV1JJVEUgUVRSRUVfSU5JVF9SRVdSSVRFCisjZGVmaW5lIFYyX0RFTF9BTExPQyBRVFJFRV9ERUxfQUxMT0MKKyNkZWZpbmUgVjJfREVMX1JFV1JJVEUgUVRSRUVfREVMX1JFV1JJVEUKIAogI2VuZGlmIC8qIF9MSU5VWF9EUUJMS19WMl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2V4dDJfZnMuaCBiL2luY2x1ZGUvbGludXgvZXh0Ml9mcy5oCmluZGV4IDc4Yzc3NWEuLjEyMTcyMGQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZXh0Ml9mcy5oCisrKyBiL2luY2x1ZGUvbGludXgvZXh0Ml9mcy5oCkBAIC0xOTQsNiArMTk0LDMwIEBACiAjZGVmaW5lIEVYVDJfRkxfVVNFUl9WSVNJQkxFCQlGU19GTF9VU0VSX1ZJU0lCTEUJLyogVXNlciB2aXNpYmxlIGZsYWdzICovCiAjZGVmaW5lIEVYVDJfRkxfVVNFUl9NT0RJRklBQkxFCQlGU19GTF9VU0VSX01PRElGSUFCTEUJLyogVXNlciBtb2RpZmlhYmxlIGZsYWdzICovCiAKKy8qIEZsYWdzIHRoYXQgc2hvdWxkIGJlIGluaGVyaXRlZCBieSBuZXcgaW5vZGVzIGZyb20gdGhlaXIgcGFyZW50LiAqLworI2RlZmluZSBFWFQyX0ZMX0lOSEVSSVRFRCAoRVhUMl9TRUNSTV9GTCB8IEVYVDJfVU5STV9GTCB8IEVYVDJfQ09NUFJfRkwgfFwKKwkJCSAgIEVYVDJfU1lOQ19GTCB8IEVYVDJfSU1NVVRBQkxFX0ZMIHwgRVhUMl9BUFBFTkRfRkwgfFwKKwkJCSAgIEVYVDJfTk9EVU1QX0ZMIHwgRVhUMl9OT0FUSU1FX0ZMIHwgRVhUMl9DT01QUkJMS19GTHxcCisJCQkgICBFWFQyX05PQ09NUF9GTCB8IEVYVDJfSk9VUk5BTF9EQVRBX0ZMIHxcCisJCQkgICBFWFQyX05PVEFJTF9GTCB8IEVYVDJfRElSU1lOQ19GTCkKKworLyogRmxhZ3MgdGhhdCBhcmUgYXBwcm9wcmlhdGUgZm9yIHJlZ3VsYXIgZmlsZXMgKGFsbCBidXQgZGlyLXNwZWNpZmljIG9uZXMpLiAqLworI2RlZmluZSBFWFQyX1JFR19GTE1BU0sgKH4oRVhUMl9ESVJTWU5DX0ZMIHwgRVhUMl9UT1BESVJfRkwpKQorCisvKiBGbGFncyB0aGF0IGFyZSBhcHByb3ByaWF0ZSBmb3Igbm9uLWRpcmVjdG9yaWVzL3JlZ3VsYXIgZmlsZXMuICovCisjZGVmaW5lIEVYVDJfT1RIRVJfRkxNQVNLIChFWFQyX05PRFVNUF9GTCB8IEVYVDJfTk9BVElNRV9GTCkKKworLyogTWFzayBvdXQgZmxhZ3MgdGhhdCBhcmUgaW5hcHByb3ByaWF0ZSBmb3IgdGhlIGdpdmVuIHR5cGUgb2YgaW5vZGUuICovCitzdGF0aWMgaW5saW5lIF9fdTMyIGV4dDJfbWFza19mbGFncyh1bW9kZV90IG1vZGUsIF9fdTMyIGZsYWdzKQoreworCWlmIChTX0lTRElSKG1vZGUpKQorCQlyZXR1cm4gZmxhZ3M7CisJZWxzZSBpZiAoU19JU1JFRyhtb2RlKSkKKwkJcmV0dXJuIGZsYWdzICYgRVhUMl9SRUdfRkxNQVNLOworCWVsc2UKKwkJcmV0dXJuIGZsYWdzICYgRVhUMl9PVEhFUl9GTE1BU0s7Cit9CisKIC8qCiAgKiBpb2N0bCBjb21tYW5kcwogICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2V4dDJfZnNfc2IuaCBiL2luY2x1ZGUvbGludXgvZXh0Ml9mc19zYi5oCmluZGV4IGRjNTQxZjMuLjFjZGI2NjMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZXh0Ml9mc19zYi5oCisrKyBiL2luY2x1ZGUvbGludXgvZXh0Ml9mc19zYi5oCkBAIC0xMDEsNyArMTAxLDcgQEAKIAlzdHJ1Y3QgcGVyY3B1X2NvdW50ZXIgc19mcmVlYmxvY2tzX2NvdW50ZXI7CiAJc3RydWN0IHBlcmNwdV9jb3VudGVyIHNfZnJlZWlub2Rlc19jb3VudGVyOwogCXN0cnVjdCBwZXJjcHVfY291bnRlciBzX2RpcnNfY291bnRlcjsKLQlzdHJ1Y3QgYmxvY2tncm91cF9sb2NrIHNfYmxvY2tncm91cF9sb2NrOworCXN0cnVjdCBibG9ja2dyb3VwX2xvY2sgKnNfYmxvY2tncm91cF9sb2NrOwogCS8qIHJvb3Qgb2YgdGhlIHBlciBmcyByZXNlcnZhdGlvbiB3aW5kb3cgdHJlZSAqLwogCXNwaW5sb2NrX3Qgc19yc3Zfd2luZG93X2xvY2s7CiAJc3RydWN0IHJiX3Jvb3Qgc19yc3Zfd2luZG93X3Jvb3Q7CkBAIC0xMTEsNyArMTExLDcgQEAKIHN0YXRpYyBpbmxpbmUgc3BpbmxvY2tfdCAqCiBzYl9iZ2xfbG9jayhzdHJ1Y3QgZXh0Ml9zYl9pbmZvICpzYmksIHVuc2lnbmVkIGludCBibG9ja19ncm91cCkKIHsKLQlyZXR1cm4gYmdsX2xvY2tfcHRyKCZzYmktPnNfYmxvY2tncm91cF9sb2NrLCBibG9ja19ncm91cCk7CisJcmV0dXJuIGJnbF9sb2NrX3B0cihzYmktPnNfYmxvY2tncm91cF9sb2NrLCBibG9ja19ncm91cCk7CiB9CiAKICNlbmRpZgkvKiBfTElOVVhfRVhUMl9GU19TQiAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9leHQzX2ZzLmggYi9pbmNsdWRlL2xpbnV4L2V4dDNfZnMuaAppbmRleCBkMTRmMDI5Li5kZDQ5NWI4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2V4dDNfZnMuaAorKysgYi9pbmNsdWRlL2xpbnV4L2V4dDNfZnMuaApAQCAtMTc4LDYgKzE3OCwzMCBAQAogI2RlZmluZSBFWFQzX0ZMX1VTRVJfVklTSUJMRQkJMHgwMDAzREZGRiAvKiBVc2VyIHZpc2libGUgZmxhZ3MgKi8KICNkZWZpbmUgRVhUM19GTF9VU0VSX01PRElGSUFCTEUJCTB4MDAwMzgwRkYgLyogVXNlciBtb2RpZmlhYmxlIGZsYWdzICovCiAKKy8qIEZsYWdzIHRoYXQgc2hvdWxkIGJlIGluaGVyaXRlZCBieSBuZXcgaW5vZGVzIGZyb20gdGhlaXIgcGFyZW50LiAqLworI2RlZmluZSBFWFQzX0ZMX0lOSEVSSVRFRCAoRVhUM19TRUNSTV9GTCB8IEVYVDNfVU5STV9GTCB8IEVYVDNfQ09NUFJfRkwgfFwKKwkJCSAgIEVYVDNfU1lOQ19GTCB8IEVYVDNfSU1NVVRBQkxFX0ZMIHwgRVhUM19BUFBFTkRfRkwgfFwKKwkJCSAgIEVYVDNfTk9EVU1QX0ZMIHwgRVhUM19OT0FUSU1FX0ZMIHwgRVhUM19DT01QUkJMS19GTHxcCisJCQkgICBFWFQzX05PQ09NUFJfRkwgfCBFWFQzX0pPVVJOQUxfREFUQV9GTCB8XAorCQkJICAgRVhUM19OT1RBSUxfRkwgfCBFWFQzX0RJUlNZTkNfRkwpCisKKy8qIEZsYWdzIHRoYXQgYXJlIGFwcHJvcHJpYXRlIGZvciByZWd1bGFyIGZpbGVzIChhbGwgYnV0IGRpci1zcGVjaWZpYyBvbmVzKS4gKi8KKyNkZWZpbmUgRVhUM19SRUdfRkxNQVNLICh+KEVYVDNfRElSU1lOQ19GTCB8IEVYVDNfVE9QRElSX0ZMKSkKKworLyogRmxhZ3MgdGhhdCBhcmUgYXBwcm9wcmlhdGUgZm9yIG5vbi1kaXJlY3Rvcmllcy9yZWd1bGFyIGZpbGVzLiAqLworI2RlZmluZSBFWFQzX09USEVSX0ZMTUFTSyAoRVhUM19OT0RVTVBfRkwgfCBFWFQzX05PQVRJTUVfRkwpCisKKy8qIE1hc2sgb3V0IGZsYWdzIHRoYXQgYXJlIGluYXBwcm9wcmlhdGUgZm9yIHRoZSBnaXZlbiB0eXBlIG9mIGlub2RlLiAqLworc3RhdGljIGlubGluZSBfX3UzMiBleHQzX21hc2tfZmxhZ3ModW1vZGVfdCBtb2RlLCBfX3UzMiBmbGFncykKK3sKKwlpZiAoU19JU0RJUihtb2RlKSkKKwkJcmV0dXJuIGZsYWdzOworCWVsc2UgaWYgKFNfSVNSRUcobW9kZSkpCisJCXJldHVybiBmbGFncyAmIEVYVDNfUkVHX0ZMTUFTSzsKKwllbHNlCisJCXJldHVybiBmbGFncyAmIEVYVDNfT1RIRVJfRkxNQVNLOworfQorCiAvKgogICogSW5vZGUgZHluYW1pYyBzdGF0ZSBmbGFncwogICovCkBAIC0zNTQsNiArMzc4LDEzIEBACiAjZGVmaW5lCUVYVDNfT1JQSEFOX0ZTCQkJMHgwMDA0CS8qIE9ycGhhbnMgYmVpbmcgcmVjb3ZlcmVkICovCiAKIC8qCisgKiBNaXNjLiBmaWxlc3lzdGVtIGZsYWdzCisgKi8KKyNkZWZpbmUgRVhUMl9GTEFHU19TSUdORURfSEFTSAkJMHgwMDAxICAvKiBTaWduZWQgZGlyaGFzaCBpbiB1c2UgKi8KKyNkZWZpbmUgRVhUMl9GTEFHU19VTlNJR05FRF9IQVNICTB4MDAwMiAgLyogVW5zaWduZWQgZGlyaGFzaCBpbiB1c2UgKi8KKyNkZWZpbmUgRVhUMl9GTEFHU19URVNUX0ZJTEVTWVMJCTB4MDAwNAkvKiB0byB0ZXN0IGRldmVsb3BtZW50IGNvZGUgKi8KKworLyoKICAqIE1vdW50IGZsYWdzCiAgKi8KICNkZWZpbmUgRVhUM19NT1VOVF9DSEVDSwkJMHgwMDAwMQkvKiBEbyBtb3VudC10aW1lIGNoZWNrcyAqLwpAQCAtNDg5LDcgKzUyMCwyMyBAQAogCV9fdTE2CXNfcmVzZXJ2ZWRfd29yZF9wYWQ7CiAJX19sZTMyCXNfZGVmYXVsdF9tb3VudF9vcHRzOwogCV9fbGUzMglzX2ZpcnN0X21ldGFfYmc7CS8qIEZpcnN0IG1ldGFibG9jayBibG9jayBncm91cCAqLwotCV9fdTMyCXNfcmVzZXJ2ZWRbMTkwXTsJLyogUGFkZGluZyB0byB0aGUgZW5kIG9mIHRoZSBibG9jayAqLworCV9fbGUzMglzX21rZnNfdGltZTsJCS8qIFdoZW4gdGhlIGZpbGVzeXN0ZW0gd2FzIGNyZWF0ZWQgKi8KKwlfX2xlMzIJc19qbmxfYmxvY2tzWzE3XTsJLyogQmFja3VwIG9mIHRoZSBqb3VybmFsIGlub2RlICovCisJLyogNjRiaXQgc3VwcG9ydCB2YWxpZCBpZiBFWFQ0X0ZFQVRVUkVfQ09NUEFUXzY0QklUICovCisvKjE1MCovCV9fbGUzMglzX2Jsb2Nrc19jb3VudF9oaTsJLyogQmxvY2tzIGNvdW50ICovCisJX19sZTMyCXNfcl9ibG9ja3NfY291bnRfaGk7CS8qIFJlc2VydmVkIGJsb2NrcyBjb3VudCAqLworCV9fbGUzMglzX2ZyZWVfYmxvY2tzX2NvdW50X2hpOwkvKiBGcmVlIGJsb2NrcyBjb3VudCAqLworCV9fbGUxNglzX21pbl9leHRyYV9pc2l6ZTsJLyogQWxsIGlub2RlcyBoYXZlIGF0IGxlYXN0ICMgYnl0ZXMgKi8KKwlfX2xlMTYJc193YW50X2V4dHJhX2lzaXplOyAJLyogTmV3IGlub2RlcyBzaG91bGQgcmVzZXJ2ZSAjIGJ5dGVzICovCisJX19sZTMyCXNfZmxhZ3M7CQkvKiBNaXNjZWxsYW5lb3VzIGZsYWdzICovCisJX19sZTE2ICBzX3JhaWRfc3RyaWRlOwkJLyogUkFJRCBzdHJpZGUgKi8KKwlfX2xlMTYgIHNfbW1wX2ludGVydmFsOyAgICAgICAgIC8qICMgc2Vjb25kcyB0byB3YWl0IGluIE1NUCBjaGVja2luZyAqLworCV9fbGU2NCAgc19tbXBfYmxvY2s7ICAgICAgICAgICAgLyogQmxvY2sgZm9yIG11bHRpLW1vdW50IHByb3RlY3Rpb24gKi8KKwlfX2xlMzIgIHNfcmFpZF9zdHJpcGVfd2lkdGg7ICAgIC8qIGJsb2NrcyBvbiBhbGwgZGF0YSBkaXNrcyAoTipzdHJpZGUpKi8KKwlfX3U4CXNfbG9nX2dyb3Vwc19wZXJfZmxleDsgIC8qIEZMRVhfQkcgZ3JvdXAgc2l6ZSAqLworCV9fdTgJc19yZXNlcnZlZF9jaGFyX3BhZDI7CisJX19sZTE2ICBzX3Jlc2VydmVkX3BhZDsKKwlfX3UzMiAgIHNfcmVzZXJ2ZWRbMTYyXTsgICAgICAgIC8qIFBhZGRpbmcgdG8gdGhlIGVuZCBvZiB0aGUgYmxvY2sgKi8KIH07CiAKICNpZmRlZiBfX0tFUk5FTF9fCkBAIC02OTQsNiArNzQxLDkgQEAKICNkZWZpbmUgRFhfSEFTSF9MRUdBQ1kJCTAKICNkZWZpbmUgRFhfSEFTSF9IQUxGX01ENAkxCiAjZGVmaW5lIERYX0hBU0hfVEVBCQkyCisjZGVmaW5lIERYX0hBU0hfTEVHQUNZX1VOU0lHTkVECTMKKyNkZWZpbmUgRFhfSEFTSF9IQUxGX01ENF9VTlNJR05FRAk0CisjZGVmaW5lIERYX0hBU0hfVEVBX1VOU0lHTkVECQk1CiAKICNpZmRlZiBfX0tFUk5FTF9fCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZXh0M19mc19zYi5oIGIvaW5jbHVkZS9saW51eC9leHQzX2ZzX3NiLmgKaW5kZXggZTAyNGUzOC4uZjA3ZjM0ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9leHQzX2ZzX3NiLmgKKysrIGIvaW5jbHVkZS9saW51eC9leHQzX2ZzX3NiLmgKQEAgLTU3LDEwICs1NywxMSBAQAogCXUzMiBzX25leHRfZ2VuZXJhdGlvbjsKIAl1MzIgc19oYXNoX3NlZWRbNF07CiAJaW50IHNfZGVmX2hhc2hfdmVyc2lvbjsKKwlpbnQgc19oYXNoX3Vuc2lnbmVkOwkvKiAzIGlmIGhhc2ggc2hvdWxkIGJlIHNpZ25lZCwgMCBpZiBub3QgKi8KIAlzdHJ1Y3QgcGVyY3B1X2NvdW50ZXIgc19mcmVlYmxvY2tzX2NvdW50ZXI7CiAJc3RydWN0IHBlcmNwdV9jb3VudGVyIHNfZnJlZWlub2Rlc19jb3VudGVyOwogCXN0cnVjdCBwZXJjcHVfY291bnRlciBzX2RpcnNfY291bnRlcjsKLQlzdHJ1Y3QgYmxvY2tncm91cF9sb2NrIHNfYmxvY2tncm91cF9sb2NrOworCXN0cnVjdCBibG9ja2dyb3VwX2xvY2sgKnNfYmxvY2tncm91cF9sb2NrOwogCiAJLyogcm9vdCBvZiB0aGUgcGVyIGZzIHJlc2VydmF0aW9uIHdpbmRvdyB0cmVlICovCiAJc3BpbmxvY2tfdCBzX3Jzdl93aW5kb3dfbG9jazsKQEAgLTg2LDcgKzg3LDcgQEAKIHN0YXRpYyBpbmxpbmUgc3BpbmxvY2tfdCAqCiBzYl9iZ2xfbG9jayhzdHJ1Y3QgZXh0M19zYl9pbmZvICpzYmksIHVuc2lnbmVkIGludCBibG9ja19ncm91cCkKIHsKLQlyZXR1cm4gYmdsX2xvY2tfcHRyKCZzYmktPnNfYmxvY2tncm91cF9sb2NrLCBibG9ja19ncm91cCk7CisJcmV0dXJuIGJnbF9sb2NrX3B0cihzYmktPnNfYmxvY2tncm91cF9sb2NrLCBibG9ja19ncm91cCk7CiB9CiAKICNlbmRpZgkvKiBfTElOVVhfRVhUM19GU19TQiAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9mcy5oIGIvaW5jbHVkZS9saW51eC9mcy5oCmluZGV4IGYyYTMwMTAxLi4wYjg3YjI5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2ZzLmgKKysrIGIvaW5jbHVkZS9saW51eC9mcy5oCkBAIC01NjUsNiArNTY1LDcgQEAKIHN0cnVjdCBibG9ja19kZXZpY2UgewogCWRldl90CQkJYmRfZGV2OyAgLyogbm90IGEga2Rldl90IC0gaXQncyBhIHNlYXJjaCBrZXkgKi8KIAlzdHJ1Y3QgaW5vZGUgKgkJYmRfaW5vZGU7CS8qIHdpbGwgZGllICovCisJc3RydWN0IHN1cGVyX2Jsb2NrICoJYmRfc3VwZXI7CiAJaW50CQkJYmRfb3BlbmVyczsKIAlzdHJ1Y3QgbXV0ZXgJCWJkX211dGV4OwkvKiBvcGVuL2Nsb3NlIG11dGV4ICovCiAJc3RydWN0IHNlbWFwaG9yZQliZF9tb3VudF9zZW07CkBAIC0xMTMzLDcgKzExMzQsNiBAQAogCXN0cnVjdCByd19zZW1hcGhvcmUJc191bW91bnQ7CiAJc3RydWN0IG11dGV4CQlzX2xvY2s7CiAJaW50CQkJc19jb3VudDsKLQlpbnQJCQlzX3N5bmNpbmc7CiAJaW50CQkJc19uZWVkX3N5bmNfZnM7CiAJYXRvbWljX3QJCXNfYWN0aXZlOwogI2lmZGVmIENPTkZJR19TRUNVUklUWQpAQCAtMTE4NSw2ICsxMTg1LDExIEBACiAJICogZ2VuZXJpY19zaG93X29wdGlvbnMoKQogCSAqLwogCWNoYXIgKnNfb3B0aW9uczsKKworCS8qCisJICogc3RvcmFnZSBmb3IgYXN5bmNocm9ub3VzIG9wZXJhdGlvbnMKKwkgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIHNfYXN5bmNfbGlzdDsKIH07CiAKIGV4dGVybiBzdHJ1Y3QgdGltZXNwZWMgY3VycmVudF9mc190aW1lKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpOwpAQCAtMTM4NSw2ICsxMzkwLDcgQEAKIAlzc2l6ZV90ICgqcXVvdGFfcmVhZCkoc3RydWN0IHN1cGVyX2Jsb2NrICosIGludCwgY2hhciAqLCBzaXplX3QsIGxvZmZfdCk7CiAJc3NpemVfdCAoKnF1b3RhX3dyaXRlKShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgaW50LCBjb25zdCBjaGFyICosIHNpemVfdCwgbG9mZl90KTsKICNlbmRpZgorCWludCAoKmJkZXZfdHJ5X3RvX2ZyZWVfcGFnZSkoc3RydWN0IHN1cGVyX2Jsb2NrKiwgc3RydWN0IHBhZ2UqLCBnZnBfdCk7CiB9OwogCiAvKgpAQCAtMTgzMCw3ICsxODM2LDcgQEAKIGV4dGVybiBpbnQgZmlsZW1hcF9mZGF0YXdyaXRlX3JhbmdlKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLAogCQkJCWxvZmZfdCBzdGFydCwgbG9mZl90IGVuZCk7CiAKLWV4dGVybiBsb25nIGRvX2ZzeW5jKHN0cnVjdCBmaWxlICpmaWxlLCBpbnQgZGF0YXN5bmMpOworZXh0ZXJuIGludCB2ZnNfZnN5bmMoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IGRhdGFzeW5jKTsKIGV4dGVybiB2b2lkIHN5bmNfc3VwZXJzKHZvaWQpOwogZXh0ZXJuIHZvaWQgc3luY19maWxlc3lzdGVtcyhpbnQgd2FpdCk7CiBleHRlcm4gdm9pZCBfX2ZzeW5jX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpOwpAQCAtMjA1OSw2ICsyMDY1LDkgQEAKIAogZXh0ZXJuIGludCBkb192ZnNfaW9jdGwoc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBmZCwgdW5zaWduZWQgaW50IGNtZCwKIAkJICAgIHVuc2lnbmVkIGxvbmcgYXJnKTsKK2V4dGVybiBpbnQgX19nZW5lcmljX2Jsb2NrX2ZpZW1hcChzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCSAgc3RydWN0IGZpZW1hcF9leHRlbnRfaW5mbyAqZmllaW5mbywgdTY0IHN0YXJ0LAorCQkJCSAgdTY0IGxlbiwgZ2V0X2Jsb2NrX3QgKmdldF9ibG9jayk7CiBleHRlcm4gaW50IGdlbmVyaWNfYmxvY2tfZmllbWFwKHN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJCQkJc3RydWN0IGZpZW1hcF9leHRlbnRfaW5mbyAqZmllaW5mbywgdTY0IHN0YXJ0LAogCQkJCXU2NCBsZW4sIGdldF9ibG9ja190ICpnZXRfYmxvY2spOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9mdXNlLmggYi9pbmNsdWRlL2xpbnV4L2Z1c2UuaAppbmRleCAzNTBmZTk3Li4xNjJlNWRlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2Z1c2UuaAorKysgYi9pbmNsdWRlL2xpbnV4L2Z1c2UuaApAQCAtMSw2ICsxLDYgQEAKIC8qCiAgICAgRlVTRTogRmlsZXN5c3RlbSBpbiBVc2Vyc3BhY2UKLSAgICBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNiAgTWlrbG9zIFN6ZXJlZGkgPG1pa2xvc0BzemVyZWRpLmh1PgorICAgIENvcHlyaWdodCAoQykgMjAwMS0yMDA4ICBNaWtsb3MgU3plcmVkaSA8bWlrbG9zQHN6ZXJlZGkuaHU+CiAKICAgICBUaGlzIHByb2dyYW0gY2FuIGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTC4KICAgICBTZWUgdGhlIGZpbGUgQ09QWUlORy4KQEAgLTIwLDI5ICsyMCwyNyBAQAogICoKICAqIDcuMTAKICAqICAtIGFkZCBub25zZWVrYWJsZSBvcGVuIGZsYWcKKyAqCisgKiA3LjExCisgKiAgLSBhZGQgSU9DVEwgbWVzc2FnZQorICogIC0gYWRkIHVuc29saWNpdGVkIG5vdGlmaWNhdGlvbiBzdXBwb3J0CisgKiAgLSBhZGQgUE9MTCBtZXNzYWdlIGFuZCBOT1RJRllfUE9MTCBub3RpZmljYXRpb24KICAqLwogCiAjaWZuZGVmIF9MSU5VWF9GVVNFX0gKICNkZWZpbmUgX0xJTlVYX0ZVU0VfSAogCi0jaW5jbHVkZSA8YXNtL3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogCiAvKiogVmVyc2lvbiBudW1iZXIgb2YgdGhpcyBpbnRlcmZhY2UgKi8KICNkZWZpbmUgRlVTRV9LRVJORUxfVkVSU0lPTiA3CiAKIC8qKiBNaW5vciB2ZXJzaW9uIG51bWJlciBvZiB0aGlzIGludGVyZmFjZSAqLwotI2RlZmluZSBGVVNFX0tFUk5FTF9NSU5PUl9WRVJTSU9OIDEwCisjZGVmaW5lIEZVU0VfS0VSTkVMX01JTk9SX1ZFUlNJT04gMTEKIAogLyoqIFRoZSBub2RlIElEIG9mIHRoZSByb290IGlub2RlICovCiAjZGVmaW5lIEZVU0VfUk9PVF9JRCAxCiAKLS8qKiBUaGUgbWFqb3IgbnVtYmVyIG9mIHRoZSBmdXNlIGNoYXJhY3RlciBkZXZpY2UgKi8KLSNkZWZpbmUgRlVTRV9NQUpPUiBNSVNDX01BSk9SCi0KLS8qKiBUaGUgbWlub3IgbnVtYmVyIG9mIHRoZSBmdXNlIGNoYXJhY3RlciBkZXZpY2UgKi8KLSNkZWZpbmUgRlVTRV9NSU5PUiAyMjkKLQogLyogTWFrZSBzdXJlIGFsbCBzdHJ1Y3R1cmVzIGFyZSBwYWRkZWQgdG8gNjRiaXQgYm91bmRhcnksIHNvIDMyYml0CiAgICB1c2Vyc3BhY2Ugd29ya3MgdW5kZXIgNjRiaXQga2VybmVscyAqLwogCkBAIC0xNTEsNiArMTQ5LDI4IEBACiAgKi8KICNkZWZpbmUgRlVTRV9SRUFEX0xPQ0tPV05FUgkoMSA8PCAxKQogCisvKioKKyAqIElvY3RsIGZsYWdzCisgKgorICogRlVTRV9JT0NUTF9DT01QQVQ6IDMyYml0IGNvbXBhdCBpb2N0bCBvbiA2NGJpdCBtYWNoaW5lCisgKiBGVVNFX0lPQ1RMX1VOUkVTVFJJQ1RFRDogbm90IHJlc3RyaWN0ZWQgdG8gd2VsbC1mb3JtZWQgaW9jdGxzLCByZXRyeSBhbGxvd2VkCisgKiBGVVNFX0lPQ1RMX1JFVFJZOiByZXRyeSB3aXRoIG5ldyBpb3ZlY3MKKyAqCisgKiBGVVNFX0lPQ1RMX01BWF9JT1Y6IG1heGltdW0gb2YgaW5faW92ZWNzICsgb3V0X2lvdmVjcworICovCisjZGVmaW5lIEZVU0VfSU9DVExfQ09NUEFUCSgxIDw8IDApCisjZGVmaW5lIEZVU0VfSU9DVExfVU5SRVNUUklDVEVECSgxIDw8IDEpCisjZGVmaW5lIEZVU0VfSU9DVExfUkVUUlkJKDEgPDwgMikKKworI2RlZmluZSBGVVNFX0lPQ1RMX01BWF9JT1YJMjU2CisKKy8qKgorICogUG9sbCBmbGFncworICoKKyAqIEZVU0VfUE9MTF9TQ0hFRFVMRV9OT1RJRlk6IHJlcXVlc3QgcG9sbCBub3RpZnkKKyAqLworI2RlZmluZSBGVVNFX1BPTExfU0NIRURVTEVfTk9USUZZICgxIDw8IDApCisKIGVudW0gZnVzZV9vcGNvZGUgewogCUZVU0VfTE9PS1VQCSAgID0gMSwKIAlGVVNFX0ZPUkdFVAkgICA9IDIsICAvKiBubyByZXBseSAqLwpAQCAtMTg4LDYgKzIwOCwxMyBAQAogCUZVU0VfSU5URVJSVVBUICAgICA9IDM2LAogCUZVU0VfQk1BUCAgICAgICAgICA9IDM3LAogCUZVU0VfREVTVFJPWSAgICAgICA9IDM4LAorCUZVU0VfSU9DVEwgICAgICAgICA9IDM5LAorCUZVU0VfUE9MTCAgICAgICAgICA9IDQwLAorfTsKKworZW51bSBmdXNlX25vdGlmeV9jb2RlIHsKKwlGVVNFX05PVElGWV9QT0xMICAgPSAxLAorCUZVU0VfTk9USUZZX0NPREVfTUFYLAogfTsKIAogLyogVGhlIHJlYWQgYnVmZmVyIGlzIHJlcXVpcmVkIHRvIGJlIGF0IGxlYXN0IDhrLCBidXQgbWF5IGJlIG11Y2ggbGFyZ2VyICovCkBAIC0zODgsNiArNDE1LDM4IEBACiAJX191NjQJYmxvY2s7CiB9OwogCitzdHJ1Y3QgZnVzZV9pb2N0bF9pbiB7CisJX191NjQJZmg7CisJX191MzIJZmxhZ3M7CisJX191MzIJY21kOworCV9fdTY0CWFyZzsKKwlfX3UzMglpbl9zaXplOworCV9fdTMyCW91dF9zaXplOworfTsKKworc3RydWN0IGZ1c2VfaW9jdGxfb3V0IHsKKwlfX3MzMglyZXN1bHQ7CisJX191MzIJZmxhZ3M7CisJX191MzIJaW5faW92czsKKwlfX3UzMglvdXRfaW92czsKK307CisKK3N0cnVjdCBmdXNlX3BvbGxfaW4geworCV9fdTY0CWZoOworCV9fdTY0CWtoOworCV9fdTMyCWZsYWdzOworCV9fdTMyICAgcGFkZGluZzsKK307CisKK3N0cnVjdCBmdXNlX3BvbGxfb3V0IHsKKwlfX3UzMglyZXZlbnRzOworCV9fdTMyCXBhZGRpbmc7Cit9OworCitzdHJ1Y3QgZnVzZV9ub3RpZnlfcG9sbF93YWtldXBfb3V0IHsKKwlfX3U2NAlraDsKK307CisKIHN0cnVjdCBmdXNlX2luX2hlYWRlciB7CiAJX191MzIJbGVuOwogCV9fdTMyCW9wY29kZTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZ2ZwLmggYi9pbmNsdWRlL2xpbnV4L2dmcC5oCmluZGV4IGU4MDAzYWYuLmRkMjBjZDcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZ2ZwLmgKKysrIGIvaW5jbHVkZS9saW51eC9nZnAuaApAQCAtNjksMTIgKzY5LDYgQEAKICNkZWZpbmUgR0ZQX0hJR0hVU0VSX01PVkFCTEUJKF9fR0ZQX1dBSVQgfCBfX0dGUF9JTyB8IF9fR0ZQX0ZTIHwgXAogCQkJCSBfX0dGUF9IQVJEV0FMTCB8IF9fR0ZQX0hJR0hNRU0gfCBcCiAJCQkJIF9fR0ZQX01PVkFCTEUpCi0jZGVmaW5lIEdGUF9OT0ZTX1BBR0VDQUNIRQkoX19HRlBfV0FJVCB8IF9fR0ZQX0lPIHwgX19HRlBfTU9WQUJMRSkKLSNkZWZpbmUgR0ZQX1VTRVJfUEFHRUNBQ0hFCShfX0dGUF9XQUlUIHwgX19HRlBfSU8gfCBfX0dGUF9GUyB8IFwKLQkJCQkgX19HRlBfSEFSRFdBTEwgfCBfX0dGUF9NT1ZBQkxFKQotI2RlZmluZSBHRlBfSElHSFVTRVJfUEFHRUNBQ0hFCShfX0dGUF9XQUlUIHwgX19HRlBfSU8gfCBfX0dGUF9GUyB8IFwKLQkJCQkgX19HRlBfSEFSRFdBTEwgfCBfX0dGUF9ISUdITUVNIHwgXAotCQkJCSBfX0dGUF9NT1ZBQkxFKQogCiAjaWZkZWYgQ09ORklHX05VTUEKICNkZWZpbmUgR0ZQX1RISVNOT0RFCShfX0dGUF9USElTTk9ERSB8IF9fR0ZQX05PV0FSTiB8IF9fR0ZQX05PUkVUUlkpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2dwaW9fa2V5cy5oIGIvaW5jbHVkZS9saW51eC9ncGlvX2tleXMuaAppbmRleCBlYzZlY2Q3Li4xMjg5ZmE3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2dwaW9fa2V5cy5oCisrKyBiL2luY2x1ZGUvbGludXgvZ3Bpb19rZXlzLmgKQEAgLTE1LDYgKzE1LDcgQEAKIHN0cnVjdCBncGlvX2tleXNfcGxhdGZvcm1fZGF0YSB7CiAJc3RydWN0IGdwaW9fa2V5c19idXR0b24gKmJ1dHRvbnM7CiAJaW50IG5idXR0b25zOworCXVuc2lnbmVkIGludCByZXA6MTsJCS8qIGVuYWJsZSBpbnB1dCBzdWJzeXN0ZW0gYXV0byByZXBlYXQgKi8KIH07CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9oaWQuaCBiL2luY2x1ZGUvbGludXgvaGlkLmgKaW5kZXggZTU3ODBmOC4uODFhYTg0ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9oaWQuaAorKysgYi9pbmNsdWRlL2xpbnV4L2hpZC5oCkBAIC00MDMsMTUgKzQwMyw2IEBACiAjZGVmaW5lIEhJRF9TVEFUX0FEREVECQkxCiAjZGVmaW5lIEhJRF9TVEFUX1BBUlNFRAkJMgogCi0jZGVmaW5lIEhJRF9DVFJMX1JVTk5JTkcJMQotI2RlZmluZSBISURfT1VUX1JVTk5JTkcJCTIKLSNkZWZpbmUgSElEX0lOX1JVTk5JTkcJCTMKLSNkZWZpbmUgSElEX1JFU0VUX1BFTkRJTkcJNAotI2RlZmluZSBISURfU1VTUEVOREVECQk1Ci0jZGVmaW5lIEhJRF9DTEVBUl9IQUxUCQk2Ci0jZGVmaW5lIEhJRF9ESVNDT05ORUNURUQJNwotI2RlZmluZSBISURfU1RBUlRFRAkJOAotCiBzdHJ1Y3QgaGlkX2lucHV0IHsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CiAJc3RydWN0IGhpZF9yZXBvcnQgKnJlcG9ydDsKQEAgLTU0MCw2ICs1MzEsOCBAQAogICogQG5hbWU6IGRyaXZlciBuYW1lIChlLmcuICJGb290ZWNoX2Jhci13aGVlbCIpCiAgKiBAaWRfdGFibGU6IHdoaWNoIGRldmljZXMgaXMgdGhpcyBkcml2ZXIgZm9yIChtdXN0IGJlIG5vbi1OVUxMIGZvciBwcm9iZQogICogCSAgICAgIHRvIGJlIGNhbGxlZCkKKyAqIEBkeW5fbGlzdDogbGlzdCBvZiBkeW5hbWljYWxseSBhZGRlZCBkZXZpY2UgaWRzCisgKiBAZHluX2xvY2s6IGxvY2sgcHJvdGVjdGluZyBAZHluX2xpc3QKICAqIEBwcm9iZTogbmV3IGRldmljZSBpbnNlcnRlZAogICogQHJlbW92ZTogZGV2aWNlIHJlbW92ZWQgKE5VTEwgaWYgbm90IGEgaG90LXBsdWcgY2FwYWJsZSBkcml2ZXIpCiAgKiBAcmVwb3J0X3RhYmxlOiBvbiB3aGljaCByZXBvcnRzIHRvIGNhbGwgcmF3X2V2ZW50IChOVUxMIG1lYW5zIGFsbCkKQEAgLTU2Nyw2ICs1NjAsOSBAQAogCWNoYXIgKm5hbWU7CiAJY29uc3Qgc3RydWN0IGhpZF9kZXZpY2VfaWQgKmlkX3RhYmxlOwogCisJc3RydWN0IGxpc3RfaGVhZCBkeW5fbGlzdDsKKwlzcGlubG9ja190IGR5bl9sb2NrOworCiAJaW50ICgqcHJvYmUpKHN0cnVjdCBoaWRfZGV2aWNlICpkZXYsIGNvbnN0IHN0cnVjdCBoaWRfZGV2aWNlX2lkICppZCk7CiAJdm9pZCAoKnJlbW92ZSkoc3RydWN0IGhpZF9kZXZpY2UgKmRldik7CiAKQEAgLTc5Nyw2ICs3OTMsOCBAQAogCiAjaWZkZWYgQ09ORklHX0hJRF9DT01QQVQKICNkZWZpbmUgSElEX0NPTVBBVF9MT0FEX0RSSVZFUihuYW1lKQlcCisvKiBwcm90b3R5cGUgdG8gYXZvaWQgc3BhcnNlIHdhcm5pbmcgKi8JXAorZXh0ZXJuIHZvaWQgaGlkX2NvbXBhdF8jI25hbWUodm9pZCk7CVwKIHZvaWQgaGlkX2NvbXBhdF8jI25hbWUodm9pZCkgeyB9CVwKIEVYUE9SVF9TWU1CT0woaGlkX2NvbXBhdF8jI25hbWUpCiAjZWxzZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9oaWRyYXcuaCBiL2luY2x1ZGUvbGludXgvaGlkcmF3LmgKaW5kZXggZGJiNWM4Yy4uZGQ4ZDY5MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9oaWRyYXcuaAorKysgYi9pbmNsdWRlL2xpbnV4L2hpZHJhdy5oCkBAIC0zMyw2ICszMyw4IEBACiAjZGVmaW5lIEhJRElPQ0dSREVTQ1NJWkUJX0lPUignSCcsIDB4MDEsIGludCkKICNkZWZpbmUgSElESU9DR1JERVNDCQlfSU9SKCdIJywgMHgwMiwgc3RydWN0IGhpZHJhd19yZXBvcnRfZGVzY3JpcHRvcikKICNkZWZpbmUgSElESU9DR1JBV0lORk8JCV9JT1IoJ0gnLCAweDAzLCBzdHJ1Y3QgaGlkcmF3X2RldmluZm8pCisjZGVmaW5lIEhJRElPQ0dSQVdOQU1FKGxlbikgICAgIF9JT0MoX0lPQ19SRUFELCAnSCcsIDB4MDQsIGxlbikKKyNkZWZpbmUgSElESU9DR1JBV1BIWVMobGVuKSAgICAgX0lPQyhfSU9DX1JFQUQsICdIJywgMHgwNSwgbGVuKQogCiAjZGVmaW5lIEhJRFJBV19GSVJTVF9NSU5PUiAwCiAjZGVmaW5lIEhJRFJBV19NQVhfREVWSUNFUyA2NApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9odWdldGxiLmggYi9pbmNsdWRlL2xpbnV4L2h1Z2V0bGIuaAppbmRleCBlMWM4YWZjLi5mMWQyZmJhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2h1Z2V0bGIuaAorKysgYi9pbmNsdWRlL2xpbnV4L2h1Z2V0bGIuaApAQCAtMjMzLDYgKzIzMywxMCBAQAogCXJldHVybiAodW5zaWduZWQgbG9uZylQQUdFX1NJWkUgPDwgaC0+b3JkZXI7CiB9CiAKK2V4dGVybiB1bnNpZ25lZCBsb25nIHZtYV9rZXJuZWxfcGFnZXNpemUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpOworCitleHRlcm4gdW5zaWduZWQgbG9uZyB2bWFfbW11X3BhZ2VzaXplKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKTsKKwogc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGh1Z2VfcGFnZV9tYXNrKHN0cnVjdCBoc3RhdGUgKmgpCiB7CiAJcmV0dXJuIGgtPm1hc2s7CkBAIC0yNzMsNiArMjc3LDggQEAKICNkZWZpbmUgaHN0YXRlX2lub2RlKGkpIE5VTEwKICNkZWZpbmUgaHVnZV9wYWdlX3NpemUoaCkgUEFHRV9TSVpFCiAjZGVmaW5lIGh1Z2VfcGFnZV9tYXNrKGgpIFBBR0VfTUFTSworI2RlZmluZSB2bWFfa2VybmVsX3BhZ2VzaXplKHYpIFBBR0VfU0laRQorI2RlZmluZSB2bWFfbW11X3BhZ2VzaXplKHYpIFBBR0VfU0laRQogI2RlZmluZSBodWdlX3BhZ2Vfb3JkZXIoaCkgMAogI2RlZmluZSBodWdlX3BhZ2Vfc2hpZnQoaCkgUEFHRV9TSElGVAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgcGFnZXNfcGVyX2h1Z2VfcGFnZShzdHJ1Y3QgaHN0YXRlICpoKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pMmMuaCBiL2luY2x1ZGUvbGludXgvaTJjLmgKaW5kZXggMzNhNTk5Mi4uMjA4NzNkNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pMmMuaAorKysgYi9pbmNsdWRlL2xpbnV4L2kyYy5oCkBAIC0zOTMsMTEgKzM5Myw3IEBACiAjZGVmaW5lIEkyQ19DTEFTU19UVl9BTkFMT0cJKDE8PDEpCS8qIGJ0dHYgKyBmcmllbmRzICovCiAjZGVmaW5lIEkyQ19DTEFTU19UVl9ESUdJVEFMCSgxPDwyKQkvKiBkdmIgY2FyZHMgKi8KICNkZWZpbmUgSTJDX0NMQVNTX0REQwkJKDE8PDMpCS8qIEREQyBidXMgb24gZ3JhcGhpY3MgYWRhcHRlcnMgKi8KLSNkZWZpbmUgSTJDX0NMQVNTX0NBTV9BTkFMT0cJKDE8PDQpCS8qIGNhbWVyYSB3aXRoIGFuYWxvZyBDQ0QgKi8KLSNkZWZpbmUgSTJDX0NMQVNTX0NBTV9ESUdJVEFMCSgxPDw1KQkvKiBtb3N0IHdlYmNhbXMgKi8KLSNkZWZpbmUgSTJDX0NMQVNTX1NPVU5ECQkoMTw8NikJLyogc291bmQgZGV2aWNlcyAqLwogI2RlZmluZSBJMkNfQ0xBU1NfU1BECQkoMTw8NykJLyogU1BEIEVFUFJPTXMgYW5kIHNpbWlsYXIgKi8KLSNkZWZpbmUgSTJDX0NMQVNTX0FMTAkJKFVJTlRfTUFYKSAvKiBhbGwgb2YgdGhlIGFib3ZlICovCiAKIC8qIGkyY19jbGllbnRfYWRkcmVzc19kYXRhIGlzIHRoZSBzdHJ1Y3QgZm9yIGhvbGRpbmcgZGVmYXVsdCBjbGllbnQKICAqIGFkZHJlc3NlcyBmb3IgYSBkcml2ZXIgYW5kIGZvciB0aGUgcGFyYW1ldGVycyBzdXBwbGllZCBvbiB0aGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaTJjL2RtMzU1ZXZtX21zcC5oIGIvaW5jbHVkZS9saW51eC9pMmMvZG0zNTVldm1fbXNwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzcyNDcwMwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvaTJjL2RtMzU1ZXZtX21zcC5oCkBAIC0wLDAgKzEsNzkgQEAKKy8qCisgKiBkbTM1NWV2bV9tc3AuaCAtIHN1cHBvcnQgTVNQNDMwIG1pY3JvY29udHJvbGxlciBvbiBETTM1NUVWTSBib2FyZAorICovCisjaWZuZGVmIF9fTElOVVhfSTJDX0RNMzU1RVZNX01TUAorI2RlZmluZSBfX0xJTlVYX0kyQ19ETTM1NUVWTV9NU1AKKworLyoKKyAqIFdyaXR0ZW4gYWdhaW5zdCBTcGVjdHJ1bSdzIHdyaXRldXAgZm9yIHRoZSBBNCBmaXJtd2FyZSByZXZpc2lvbiwKKyAqIGFuZCB0d2Vha2VkIHRvIG1hdGNoIHNvdXJjZSBhbmQgcmV2IEQyIHNjaGVtYXRpY3MgYnkgcmVtb3ZpbmcgQ1BMRAorICogYW5kIE5PUiBmbGFzaCBob29rcyAod2hpY2ggd2VyZSBsYXN0IGFwcHJvcHJpYXRlIGluIHJldiBCIGJvYXJkcykuCisgKgorICogTm90ZSB0aGF0IHRoZSBmaXJtd2FyZSBzdXBwb3J0cyBhIGZsYXZvciBvZiB3cml0ZSBwb3N0aW5nIC4uLiB0byBiZQorICogc3VyZSBhIHdyaXRlIGNvbXBsZXRlcywgaXNzdWUgYW5vdGhlciByZWFkIG9yIHdyaXRlLgorICovCisKKy8qIHV0aWxpdGllcyB0byBhY2Nlc3MgInJlZ2lzdGVycyIgZW11bGF0ZWQgYnkgbXNwNDMwIGZpcm13YXJlICovCitleHRlcm4gaW50IGRtMzU1ZXZtX21zcF93cml0ZSh1OCB2YWx1ZSwgdTggcmVnKTsKK2V4dGVybiBpbnQgZG0zNTVldm1fbXNwX3JlYWQodTggcmVnKTsKKworCisvKiBjb21tYW5kL2NvbnRyb2wgcmVnaXN0ZXJzICovCisjZGVmaW5lIERNMzU1RVZNX01TUF9DT01NQU5ECQkweDAwCisjCWRlZmluZSBNU1BfQ09NTUFORF9OVUxMCQkwCisjCWRlZmluZSBNU1BfQ09NTUFORF9SRVNFVF9DT0xECTEKKyMJZGVmaW5lIE1TUF9DT01NQU5EX1JFU0VUX1dBUk0JMgorIwlkZWZpbmUgTVNQX0NPTU1BTkRfUkVTRVRfV0FSTV9JCTMKKyMJZGVmaW5lIE1TUF9DT01NQU5EX1BPV0VST0ZGCTQKKyMJZGVmaW5lIE1TUF9DT01NQU5EX0lSX1JFSU5JVAk1CisjZGVmaW5lIERNMzU1RVZNX01TUF9TVEFUVVMJCTB4MDEKKyMJZGVmaW5lIE1TUF9TVEFUVVNfQkFEX09GRlNFVAlCSVQoMCkKKyMJZGVmaW5lIE1TUF9TVEFUVVNfQkFEX0NPTU1BTkQJQklUKDEpCisjCWRlZmluZSBNU1BfU1RBVFVTX1BPV0VSX0VSUk9SCUJJVCgyKQorIwlkZWZpbmUgTVNQX1NUQVRVU19SWEJVRl9PVkVSUlVOCUJJVCgzKQorI2RlZmluZSBETTM1NUVWTV9NU1BfUkVTRVQJCTB4MDIJLyogMCBiaXRzID09IGluIHJlc2V0ICovCisjCWRlZmluZSBNU1BfUkVTRVRfREM1CQlCSVQoMCkKKyMJZGVmaW5lIE1TUF9SRVNFVF9UVlA1MTU0CUJJVCgyKQorIwlkZWZpbmUgTVNQX1JFU0VUX0lNQUdFUgkJQklUKDMpCisjCWRlZmluZSBNU1BfUkVTRVRfRVRIRVJORVQJQklUKDQpCisjCWRlZmluZSBNU1BfUkVTRVRfU1lTCQlCSVQoNSkKKyMJZGVmaW5lIE1TUF9SRVNFVF9BSUMzMwkJQklUKDcpCisKKy8qIEdQSU8gcmVnaXN0ZXJzIC4uLiBiaXQgcGF0dGVybnMgbW9zdGx5IG1hdGNoIHRoZSBzb3VyY2UgTVNQIHBvcnRzICovCisjZGVmaW5lIERNMzU1RVZNX01TUF9MRUQJCTB4MDMJLyogYWN0aXZlIGxvdyAoTVNQIFA0KSAqLworI2RlZmluZSBETTM1NUVWTV9NU1BfU1dJVENIMQkJMHgwNAkvKiAoTVNQIFA1LCBtYXNrZWQpICovCisjCWRlZmluZSBNU1BfU1dJVENIMV9TVzZfMQlCSVQoMCkKKyMJZGVmaW5lIE1TUF9TV0lUQ0gxX1NXNl8yCUJJVCgxKQorIwlkZWZpbmUgTVNQX1NXSVRDSDFfU1c2XzMJQklUKDIpCisjCWRlZmluZSBNU1BfU1dJVENIMV9TVzZfNAlCSVQoMykKKyMJZGVmaW5lIE1TUF9TV0lUQ0gxX0oxCQlCSVQoNCkJLyogTlRTQy9QQUwgKi8KKyMJZGVmaW5lIE1TUF9TV0lUQ0gxX01TUF9JTlQJQklUKDUpCS8qIGFjdGl2ZSBsb3cgKi8KKyNkZWZpbmUgRE0zNTVFVk1fTVNQX1NXSVRDSDIJCTB4MDUJLyogKE1TUCBQNiwgbWFza2VkKSAqLworIwlkZWZpbmUgTVNQX1NXSVRDSDJfU1cxMAkJQklUKDMpCisjCWRlZmluZSBNU1BfU1dJVENIMl9TVzExCQlCSVQoNCkKKyMJZGVmaW5lIE1TUF9TV0lUQ0gyX1NXMTIJCUJJVCg1KQorIwlkZWZpbmUgTVNQX1NXSVRDSDJfU1cxMwkJQklUKDYpCisjCWRlZmluZSBNU1BfU1dJVENIMl9TVzE0CQlCSVQoNykKKyNkZWZpbmUgRE0zNTVFVk1fTVNQX1NETU1DCQkweDA2CS8qIChNU1AgUDIsIG1hc2tlZCkgKi8KKyMJZGVmaW5lIE1TUF9TRE1NQ18wX1dQCQlCSVQoMSkKKyMJZGVmaW5lIE1TUF9TRE1NQ18wX0NECQlCSVQoMikJLyogYWN0aXZlIGxvdyAqLworIwlkZWZpbmUgTVNQX1NETU1DXzFfV1AJCUJJVCgzKQorIwlkZWZpbmUgTVNQX1NETU1DXzFfQ0QJCUJJVCg0KQkvKiBhY3RpdmUgbG93ICovCisjZGVmaW5lIERNMzU1RVZNX01TUF9GSVJNUkVWCQkweDA3CS8qIG5vdCBhIEdQSU8gKG91dCBvZiBvcmRlcikgKi8KKyNkZWZpbmUgRE0zNTVFVk1fTVNQX1ZJREVPX0lOCQkweDA4CS8qIChNU1AgUDMsIG1hc2tlZCkgKi8KKyMJZGVmaW5lIE1TUF9WSURFT19JTUFHRVIJCUJJVCg3KQkvKiBsb3cgPT0gdHZwNTE0NiAqLworCisvKiBwb3dlciBzdXBwbHkgcmVnaXN0ZXJzIGFyZSBjdXJyZW50bHkgb21pdHRlZCAqLworCisvKiBSVEMgcmVnaXN0ZXJzICovCisjZGVmaW5lIERNMzU1RVZNX01TUF9SVENfMAkJMHgxMgkvKiBMU0IgKi8KKyNkZWZpbmUgRE0zNTVFVk1fTVNQX1JUQ18xCQkweDEzCisjZGVmaW5lIERNMzU1RVZNX01TUF9SVENfMgkJMHgxNAorI2RlZmluZSBETTM1NUVWTV9NU1BfUlRDXzMJCTB4MTUJLyogTVNCICovCisKKy8qIGlucHV0IGV2ZW50IHF1ZXVlIHJlZ2lzdGVyczsgY29kZSA9PSAoKEhJR0ggPDwgOCkgfCBMT1cpICovCisjZGVmaW5lIERNMzU1RVZNX01TUF9JTlBVVF9DT1VOVAkweDE2CS8qIGRlY3JlbWVudCBieSByZWFkaW5nIExPVyAqLworI2RlZmluZSBETTM1NUVWTV9NU1BfSU5QVVRfSElHSAkJMHgxNworI2RlZmluZSBETTM1NUVWTV9NU1BfSU5QVVRfTE9XCQkweDE4CisKKyNlbmRpZiAvKiBfX0xJTlVYX0kyQ19ETTM1NUVWTV9NU1AgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaTJjL3RzYzIwMDcuaCBiL2luY2x1ZGUvbGludXgvaTJjL3RzYzIwMDcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjM2MWZiCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9pMmMvdHNjMjAwNy5oCkBAIC0wLDAgKzEsMTcgQEAKKyNpZm5kZWYgX19MSU5VWF9JMkNfVFNDMjAwN19ICisjZGVmaW5lIF9fTElOVVhfSTJDX1RTQzIwMDdfSAorCisvKiBsaW51eC9pMmMvdHNjMjAwNy5oICovCisKK3N0cnVjdCB0c2MyMDA3X3BsYXRmb3JtX2RhdGEgeworCXUxNgltb2RlbDsJCQkJLyogMjAwNy4gKi8KKwl1MTYJeF9wbGF0ZV9vaG1zOworCisJaW50CSgqZ2V0X3BlbmRvd25fc3RhdGUpKHZvaWQpOworCXZvaWQJKCpjbGVhcl9wZW5pcnEpKHZvaWQpOwkJLyogSWYgbmVlZGVkLCBjbGVhciAybmQgbGV2ZWwKKwkJCQkJCSAgIGludGVycnVwdCBzb3VyY2UgKi8KKwlpbnQJKCppbml0X3BsYXRmb3JtX2h3KSh2b2lkKTsKKwl2b2lkCSgqZXhpdF9wbGF0Zm9ybV9odykodm9pZCk7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaTJjL3R3bDQwMzAuaCBiL2luY2x1ZGUvbGludXgvaTJjL3R3bDQwMzAuaAppbmRleCBmYjYwNGRjLi44MTM3ZjY2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2kyYy90d2w0MDMwLmgKKysrIGIvaW5jbHVkZS9saW51eC9pMmMvdHdsNDAzMC5oCkBAIC03OCw4ICs3OCw4IEBACiAgKiBJTVBPUlRBTlQ6ICBGb3IgdHdsNDAzMF9pMmNfd3JpdGUoKSwgYWxsb2NhdGUgbnVtX2J5dGVzICsgMQogICogZm9yIHRoZSB2YWx1ZSwgYW5kIHBvcHVsYXRlIHlvdXIgZGF0YSBzdGFydGluZyBhdCBvZmZzZXQgMS4KICAqLwotaW50IHR3bDQwMzBfaTJjX3dyaXRlKHU4IG1vZF9ubywgdTggKnZhbHVlLCB1OCByZWcsIHU4IG51bV9ieXRlcyk7Ci1pbnQgdHdsNDAzMF9pMmNfcmVhZCh1OCBtb2Rfbm8sIHU4ICp2YWx1ZSwgdTggcmVnLCB1OCBudW1fYnl0ZXMpOworaW50IHR3bDQwMzBfaTJjX3dyaXRlKHU4IG1vZF9ubywgdTggKnZhbHVlLCB1OCByZWcsIHVuc2lnbmVkIG51bV9ieXRlcyk7CitpbnQgdHdsNDAzMF9pMmNfcmVhZCh1OCBtb2Rfbm8sIHU4ICp2YWx1ZSwgdTggcmVnLCB1bnNpZ25lZCBudW1fYnl0ZXMpOwogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCkBAIC0yMzQsNiArMjM0LDkgQEAKIAkvKiBncGlvLW4gc2hvdWxkIGNvbnRyb2wgVk1NQyhuKzEpIGlmIEJJVChuKSBpbiBtbWNfY2QgaXMgc2V0ICovCiAJdTgJCW1tY19jZDsKIAorCS8qIGlmIEJJVChOKSBpcyBzZXQsIG9yIFZNTUMobisxKSBpcyBsaW5rZWQsIGRlYm91bmNlIEdQSU8tTiAqLworCXUzMgkJZGVib3VuY2U7CisKIAkvKiBGb3IgZ3Bpby1OLCBiaXQgKDEgPDwgTikgaW4gInB1bGx1cHMiIGlzIHNldCBpZiB0aGF0IHB1bGx1cAogCSAqIHNob3VsZCBiZSBlbmFibGVkLiAgRWxzZSwgaWYgdGhhdCBiaXQgaXMgc2V0IGluICJwdWxsZG93bnMiLAogCSAqIHRoYXQgcHVsbGRvd24gaXMgZW5hYmxlZC4gIERvbid0IHdhc3RlIHBvd2VyIGJ5IGxldHRpbmcgYW55CkBAIC0yNzgsNiArMjgxLDE4IEBACiAJc3RydWN0IHR3bDQwMzBfa2V5cGFkX2RhdGEJCSprZXlwYWQ7CiAJc3RydWN0IHR3bDQwMzBfdXNiX2RhdGEJCQkqdXNiOwogCisJLyogTERPIHJlZ3VsYXRvcnMgKi8KKwlzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YQkJKnZkYWM7CisJc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEJCSp2cGxsMTsKKwlzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YQkJKnZwbGwyOworCXN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhCQkqdm1tYzE7CisJc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEJCSp2bW1jMjsKKwlzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YQkJKnZzaW07CisJc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEJCSp2YXV4MTsKKwlzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YQkJKnZhdXgyOworCXN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhCQkqdmF1eDM7CisJc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEJCSp2YXV4NDsKKwogCS8qIFJFVklTSVQgbW9yZSB0byBjb21lIC4uLiBfbm90aGluZ18gc2hvdWxkIGJlIGhhcmQtd2lyZWQgKi8KIH07CiAKQEAgLTI4NSwzMyArMzAwLDYgQEAKIAogaW50IHR3bDQwMzBfc2loX3NldHVwKGludCBtb2R1bGUpOwogCi0vKgotICogRklYTUUgY29tcGxldGVseSBzdG9wIHVzaW5nIFRXTDQwMzBfSVJRX0JBU0UgLi4uIGluc3RlYWQsIHBhc3MgdGhlCi0gKiBJUlEgZGF0YSB0byBzdWJzaWRpYXJ5IGRldmljZXMgdXNpbmcgcGxhdGZvcm0gZGV2aWNlIHJlc291cmNlcy4KLSAqLwotCi0vKiBJUlEgaW5mb3JtYXRpb24tbmVlZCBiYXNlICovCi0jaW5jbHVkZSA8bWFjaC9pcnFzLmg+Ci0vKiBUV0w0MDMwIGludGVycnVwdHMgKi8KLQotLyogI2RlZmluZSBUV0w0MDMwX01PRElSUV9HUElPCQkoVFdMNDAzMF9JUlFfQkFTRSArIDApICovCi0jZGVmaW5lIFRXTDQwMzBfTU9ESVJRX0tFWVBBRAkJKFRXTDQwMzBfSVJRX0JBU0UgKyAxKQotI2RlZmluZSBUV0w0MDMwX01PRElSUV9CQ0kJCShUV0w0MDMwX0lSUV9CQVNFICsgMikKLSNkZWZpbmUgVFdMNDAzMF9NT0RJUlFfTUFEQwkJKFRXTDQwMzBfSVJRX0JBU0UgKyAzKQotLyogI2RlZmluZSBUV0w0MDMwX01PRElSUV9VU0IJCShUV0w0MDMwX0lSUV9CQVNFICsgNCkgKi8KLS8qICNkZWZpbmUgVFdMNDAzMF9NT0RJUlFfUFdSCQkoVFdMNDAzMF9JUlFfQkFTRSArIDUpICovCi0KLSNkZWZpbmUgVFdMNDAzMF9QV1JJUlFfUFdSQlROCQkoVFdMNDAzMF9QV1JfSVJRX0JBU0UgKyAwKQotLyogI2RlZmluZSBUV0w0MDMwX1BXUklSUV9DSEdfUFJFUwkJKFRXTDQwMzBfUFdSX0lSUV9CQVNFICsgMSkgKi8KLS8qICNkZWZpbmUgVFdMNDAzMF9QV1JJUlFfVVNCX1BSRVMJCShUV0w0MDMwX1BXUl9JUlFfQkFTRSArIDIpICovCi0vKiAjZGVmaW5lIFRXTDQwMzBfUFdSSVJRX1JUQwkJKFRXTDQwMzBfUFdSX0lSUV9CQVNFICsgMykgKi8KLS8qICNkZWZpbmUgVFdMNDAzMF9QV1JJUlFfSE9UX0RJRQkJKFRXTDQwMzBfUFdSX0lSUV9CQVNFICsgNCkgKi8KLS8qICNkZWZpbmUgVFdMNDAzMF9QV1JJUlFfUFdST0tfVElNRU9VVAkoVFdMNDAzMF9QV1JfSVJRX0JBU0UgKyA1KSAqLwotLyogI2RlZmluZSBUV0w0MDMwX1BXUklSUV9NQkNIRwkJKFRXTDQwMzBfUFdSX0lSUV9CQVNFICsgNikgKi8KLS8qICNkZWZpbmUgVFdMNDAzMF9QV1JJUlFfU0NfREVURUNUCShUV0w0MDMwX1BXUl9JUlFfQkFTRSArIDcpICovCi0KLS8qIFJlc3QgYXJlIHVuc3VlZCBjdXJyZW50bHkqLwotCiAvKiBPZmZzZXRzIHRvIFBvd2VyIFJlZ2lzdGVycyAqLwogI2RlZmluZSBUV0w0MDMwX1ZEQUNfREVWX0dSUAkJMHgzQgogI2RlZmluZSBUV0w0MDMwX1ZEQUNfREVESUNBVEVECQkweDNFCkBAIC0zMjIsMTYgKzMxMCw2IEBACiAjZGVmaW5lIFRXTDQwMzBfVkFVWDNfREVWX0dSUAkJMHgxRgogI2RlZmluZSBUV0w0MDMwX1ZBVVgzX0RFRElDQVRFRAkJMHgyMgogCi0vKiBUV0w0MDMwIEdQSU8gaW50ZXJydXB0IGRlZmluaXRpb25zICovCi0KLSNkZWZpbmUgVFdMNDAzMF9HUElPX0lSUV9OTyhuKQkJKFRXTDQwMzBfR1BJT19JUlFfQkFTRSArIChuKSkKLQotLyoKLSAqIEV4cG9ydGVkIFRXTDQwMzAgR1BJTyBBUElzCi0gKgotICogV0FSTklORyAtLSB1c2Ugc3RhbmRhcmQgR1BJTyBhbmQgSVJRIGNhbGxzIGluc3RlYWQ7IHRoZXNlIHdpbGwgdmFuaXNoLgotICovCi1pbnQgdHdsNDAzMF9zZXRfZ3Bpb19kZWJvdW5jZShpbnQgZ3BpbywgaW50IGVuYWJsZSk7CiAKICNpZiBkZWZpbmVkKENPTkZJR19UV0w0MDMwX0JDSV9CQVRURVJZKSB8fCBcCiAJZGVmaW5lZChDT05GSUdfVFdMNDAzMF9CQ0lfQkFUVEVSWV9NT0RVTEUpCkBAIC0zNDAsNCArMzE4LDM4IEBACiAJc3RhdGljIGlubGluZSBpbnQgdHdsNDAzMGNoYXJnZXJfdXNiX2VuKGludCBlbmFibGUpIHsgcmV0dXJuIDA7IH0KICNlbmRpZgogCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBMaW51eC1zcGVjaWZpYyByZWd1bGF0b3IgaWRlbnRpZmllcnMgLi4uIGZvciBub3csIHdlIG9ubHkgc3VwcG9ydAorICogdGhlIExET3MsIGFuZCBsZWF2ZSB0aGUgdGhyZWUgYnVjayBjb252ZXJ0ZXJzIGFsb25lLiAgVkREMSBhbmQgVkREMgorICogbmVlZCB0byB0aWUgaW50byBoYXJkd2FyZSBiYXNlZCB2b2x0YWdlIHNjYWxpbmcgKGNwdWZyZXEgZXRjKSwgd2hpbGUKKyAqIFZJTyBpcyBnZW5lcmFsbHkgZml4ZWQuCisgKi8KKworLyogRVhURVJOQUwgZGMtdG8tZGMgYnVjayBjb252ZXJ0ZXJzICovCisjZGVmaW5lIFRXTDQwMzBfUkVHX1ZERDEJMAorI2RlZmluZSBUV0w0MDMwX1JFR19WREQyCTEKKyNkZWZpbmUgVFdMNDAzMF9SRUdfVklPCQkyCisKKy8qIEVYVEVSTkFMIExET3MgKi8KKyNkZWZpbmUgVFdMNDAzMF9SRUdfVkRBQwkzCisjZGVmaW5lIFRXTDQwMzBfUkVHX1ZQTEwxCTQKKyNkZWZpbmUgVFdMNDAzMF9SRUdfVlBMTDIJNQkvKiBub3Qgb24gYWxsIGNoaXBzICovCisjZGVmaW5lIFRXTDQwMzBfUkVHX1ZNTUMxCTYKKyNkZWZpbmUgVFdMNDAzMF9SRUdfVk1NQzIJNwkvKiBub3Qgb24gYWxsIGNoaXBzICovCisjZGVmaW5lIFRXTDQwMzBfUkVHX1ZTSU0JOAkvKiBub3Qgb24gYWxsIGNoaXBzICovCisjZGVmaW5lIFRXTDQwMzBfUkVHX1ZBVVgxCTkJLyogbm90IG9uIGFsbCBjaGlwcyAqLworI2RlZmluZSBUV0w0MDMwX1JFR19WQVVYMl80MDMwCTEwCS8qICh0d2w0MDMwLXNwZWNpZmljKSAqLworI2RlZmluZSBUV0w0MDMwX1JFR19WQVVYMgkxMQkvKiAodHdsNTAzMCBhbmQgbmV3ZXIpICovCisjZGVmaW5lIFRXTDQwMzBfUkVHX1ZBVVgzCTEyCS8qIG5vdCBvbiBhbGwgY2hpcHMgKi8KKyNkZWZpbmUgVFdMNDAzMF9SRUdfVkFVWDQJMTMJLyogbm90IG9uIGFsbCBjaGlwcyAqLworCisvKiBJTlRFUk5BTCBMRE9zICovCisjZGVmaW5lIFRXTDQwMzBfUkVHX1ZJTlRBTkExCTE0CisjZGVmaW5lIFRXTDQwMzBfUkVHX1ZJTlRBTkEyCTE1CisjZGVmaW5lIFRXTDQwMzBfUkVHX1ZJTlRESUcJMTYKKyNkZWZpbmUgVFdMNDAzMF9SRUdfVlVTQjFWNQkxNworI2RlZmluZSBUV0w0MDMwX1JFR19WVVNCMVY4CTE4CisjZGVmaW5lIFRXTDQwMzBfUkVHX1ZVU0IzVjEJMTkKKwogI2VuZGlmIC8qIEVuZCBvZiBfX1RXTDQwMzBfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pZGUuaCBiL2luY2x1ZGUvbGludXgvaWRlLmgKaW5kZXggZGI1ZWY4YS4uMzY0NGY2MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pZGUuaAorKysgYi9pbmNsdWRlL2xpbnV4L2lkZS5oCkBAIC0zMiwxOCArMzIsMTQgQEAKICMgZGVmaW5lIFNVUFBPUlRfVkxCX1NZTkMgMQogI2VuZGlmCiAKLXR5cGVkZWYgdW5zaWduZWQgY2hhcglieXRlOwkvKiB1c2VkIGV2ZXJ5d2hlcmUgKi8KLQogLyoKICAqIFByb2JhYmx5IG5vdCB3aXNlIHRvIGZpZGRsZSB3aXRoIHRoZXNlCiAgKi8KKyNkZWZpbmUgSURFX0RFRkFVTFRfTUFYX0ZBSUxVUkVTCTEKICNkZWZpbmUgRVJST1JfTUFYCTgJLyogTWF4IHJlYWQvd3JpdGUgZXJyb3JzIHBlciBzZWN0b3IgKi8KICNkZWZpbmUgRVJST1JfUkVTRVQJMwkvKiBSZXNldCBjb250cm9sbGVyIGV2ZXJ5IDR0aCByZXRyeSAqLwogI2RlZmluZSBFUlJPUl9SRUNBTAkxCS8qIFJlY2FsaWJyYXRlIGV2ZXJ5IDJuZCByZXRyeSAqLwogCi0jZGVmaW5lIEhXSUYoZHJpdmUpCQkoKGlkZV9od2lmX3QgKikoKGRyaXZlKS0+aHdpZikpCi0jZGVmaW5lIEhXR1JPVVAoZHJpdmUpCQkoKGlkZV9od2dyb3VwX3QgKikoSFdJRihkcml2ZSktPmh3Z3JvdXApKQotCiAvKgogICogRGVmaW5pdGlvbnMgZm9yIGFjY2Vzc2luZyBJREUgY29udHJvbGxlciByZWdpc3RlcnMKICAqLwpAQCAtMTg1LDkgKzE4MSw2IEBACiAJdW5zaWduZWQgbG9uZwljb25maWc7CiB9IGh3X3JlZ3NfdDsKIAotdm9pZCBpZGVfaW5pdF9wb3J0X2RhdGEoc3RydWN0IGh3aWZfcyAqLCB1bnNpZ25lZCBpbnQpOwotdm9pZCBpZGVfaW5pdF9wb3J0X2h3KHN0cnVjdCBod2lmX3MgKiwgaHdfcmVnc190ICopOwotCiBzdGF0aWMgaW5saW5lIHZvaWQgaWRlX3N0ZF9pbml0X3BvcnRzKGh3X3JlZ3NfdCAqaHcsCiAJCQkJICAgICAgdW5zaWduZWQgbG9uZyBpb19hZGRyLAogCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgY3RsX2FkZHIpCkBAIC00MzMsMTggKzQyNiwxNCBAQAogCXN0cnVjdCBpZGV0YXBlX2JoICpiaDsKIAljaGFyICpiX2RhdGE7CiAKLQkvKiBpZGVzY3NpIG9ubHkgZm9yIG5vdyAqLwogCXN0cnVjdCBzY2F0dGVybGlzdCAqc2c7CiAJdW5zaWduZWQgaW50IHNnX2NudDsKIAotCXN0cnVjdCBzY3NpX2NtbmQgKnNjc2lfY21kOwotCXZvaWQgKCpkb25lKSAoc3RydWN0IHNjc2lfY21uZCAqKTsKLQogCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKIH07CiAKIHN0cnVjdCBpZGVfZGV2c2V0Owotc3RydWN0IGlkZV9kcml2ZXJfczsKK3N0cnVjdCBpZGVfZHJpdmVyOwogCiAjaWZkZWYgQ09ORklHX0JMS19ERVZfSURFQUNQSQogc3RydWN0IGlkZV9hY3BpX2RyaXZlX2xpbms7CkBAIC01ODgsNyArNTc3LDYgQEAKIAlzdHJ1Y3QgcmVxdWVzdF9xdWV1ZQkqcXVldWU7CS8qIHJlcXVlc3QgcXVldWUgKi8KIAogCXN0cnVjdCByZXF1ZXN0CQkqcnE7CS8qIGN1cnJlbnQgcmVxdWVzdCAqLwotCXN0cnVjdCBpZGVfZHJpdmVfcyAJKm5leHQ7CS8qIGNpcmN1bGFyIGxpc3Qgb2YgaHdncm91cCBkcml2ZXMgKi8KIAl2b2lkCQkqZHJpdmVyX2RhdGE7CS8qIGV4dHJhIGRyaXZlciBkYXRhICovCiAJdTE2CQkJKmlkOwkvKiBpZGVudGlmaWNhdGlvbiBpbmZvICovCiAjaWZkZWYgQ09ORklHX0lERV9QUk9DX0ZTCkBAIC02NjIsNiArNjUwLDggQEAKIAlpbnQgICgqcGNfaW9fYnVmZmVycykoc3RydWN0IGlkZV9kcml2ZV9zICosIHN0cnVjdCBpZGVfYXRhcGlfcGMgKiwKIAkJCSAgICAgIHVuc2lnbmVkIGludCwgaW50KTsKIAorCWlkZV9zdGFydHN0b3BfdCAoKmlycV9oYW5kbGVyKShzdHJ1Y3QgaWRlX2RyaXZlX3MgKik7CisKIAl1bnNpZ25lZCBsb25nIGF0YXBpX2ZsYWdzOwogCiAJc3RydWN0IGlkZV9hdGFwaV9wYyByZXF1ZXN0X3NlbnNlX3BjOwpAQCAtNjg0LDcgKzY3NCw2IEBACiAJdm9pZAkoKmV4ZWNfY29tbWFuZCkoc3RydWN0IGh3aWZfcyAqLCB1OCk7CiAJdTgJKCpyZWFkX3N0YXR1cykoc3RydWN0IGh3aWZfcyAqKTsKIAl1OAkoKnJlYWRfYWx0c3RhdHVzKShzdHJ1Y3QgaHdpZl9zICopOwotCXU4CSgqcmVhZF9zZmZfZG1hX3N0YXR1cykoc3RydWN0IGh3aWZfcyAqKTsKIAogCXZvaWQJKCpzZXRfaXJxKShzdHJ1Y3QgaHdpZl9zICosIGludCk7CiAKQEAgLTc0NSwxNCArNzM0LDE3IEBACiAJaW50CSgqZG1hX3Rlc3RfaXJxKShzdHJ1Y3QgaWRlX2RyaXZlX3MgKik7CiAJdm9pZAkoKmRtYV9sb3N0X2lycSkoc3RydWN0IGlkZV9kcml2ZV9zICopOwogCXZvaWQJKCpkbWFfdGltZW91dCkoc3RydWN0IGlkZV9kcml2ZV9zICopOworCS8qCisJICogVGhlIGZvbGxvd2luZyBtZXRob2QgaXMgb3B0aW9uYWwgYW5kIG9ubHkgcmVxdWlyZWQgdG8gYmUKKwkgKiBpbXBsZW1lbnRlZCBmb3IgdGhlIFNGRi04MDM4aSBjb21wYXRpYmxlIGNvbnRyb2xsZXJzLgorCSAqLworCXU4CSgqZG1hX3NmZl9yZWFkX3N0YXR1cykoc3RydWN0IGh3aWZfcyAqKTsKIH07CiAKIHN0cnVjdCBpZGVfaG9zdDsKIAogdHlwZWRlZiBzdHJ1Y3QgaHdpZl9zIHsKLQlzdHJ1Y3QgaHdpZl9zICpuZXh0OwkJLyogZm9yIGxpbmtlZC1saXN0IGluIGlkZV9od2dyb3VwX3QgKi8KIAlzdHJ1Y3QgaHdpZl9zICptYXRlOwkJLyogb3RoZXIgaHdpZiBmcm9tIHNhbWUgUENJIGNoaXAgKi8KLQlzdHJ1Y3QgaHdncm91cF9zICpod2dyb3VwOwkvKiBhY3R1YWxseSAoaWRlX2h3Z3JvdXBfdCAqKSAqLwogCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcHJvYzsJLyogL3Byb2MvaWRlLyBkaXJlY3RvcnkgZW50cnkgKi8KIAogCXN0cnVjdCBpZGVfaG9zdCAqaG9zdDsKQEAgLTc2Myw3ICs3NTUsNyBAQAogCiAJdW5zaWduZWQgbG9uZwlzYXRhX3NjcltTQVRBX05SX1BPUlRTXTsKIAotCWlkZV9kcml2ZV90CWRyaXZlc1tNQVhfRFJJVkVTXTsJLyogZHJpdmUgaW5mbyAqLworCWlkZV9kcml2ZV90CSpkZXZpY2VzW01BWF9EUklWRVMgKyAxXTsKIAogCXU4IG1ham9yOwkvKiBvdXIgbWFqb3IgbnVtYmVyICovCiAJdTggaW5kZXg7CS8qIDAgZm9yIGlkZTA7IDEgZm9yIGlkZTE7IC4uLiAqLwpAQCAtODI5LDcgKzgyMSw3IEBACiAJdW5zaWduZWQJZXh0cmFfcG9ydHM7CS8qIG51bWJlciBvZiBleHRyYSBkbWEgcG9ydHMgKi8KIAogCXVuc2lnbmVkCXByZXNlbnQgICAgOiAxOwkvKiB0aGlzIGludGVyZmFjZSBleGlzdHMgKi8KLQl1bnNpZ25lZAlzZ19tYXBwZWQgIDogMTsJLyogc2dfdGFibGUgYW5kIHNnX25lbnRzIGFyZSByZWFkeSAqLworCXVuc2lnbmVkCWJ1c3kJICAgOiAxOyAvKiBzZXJpYWxpemVzIGRldmljZXMgb24gYSBwb3J0ICovCiAKIAlzdHJ1Y3QgZGV2aWNlCQlnZW5kZXY7CiAJc3RydWN0IGRldmljZQkJKnBvcnRkZXY7CkBAIC04NDEsMTkgKzgzMyw0OSBAQAogI2lmZGVmIENPTkZJR19CTEtfREVWX0lERUFDUEkKIAlzdHJ1Y3QgaWRlX2FjcGlfaHdpZl9saW5rICphY3BpZGF0YTsKICNlbmRpZgorCisJLyogSVJRIGhhbmRsZXIsIGlmIGFjdGl2ZSAqLworCWlkZV9zdGFydHN0b3BfdAkoKmhhbmRsZXIpKGlkZV9kcml2ZV90ICopOworCisJLyogQk9PTDogcG9sbGluZyBhY3RpdmUgJiBwb2xsX3RpbWVvdXQgZmllbGQgdmFsaWQgKi8KKwl1bnNpZ25lZCBpbnQgcG9sbGluZyA6IDE7CisKKwkvKiBjdXJyZW50IGRyaXZlICovCisJaWRlX2RyaXZlX3QgKmN1cl9kZXY7CisKKwkvKiBjdXJyZW50IHJlcXVlc3QgKi8KKwlzdHJ1Y3QgcmVxdWVzdCAqcnE7CisKKwkvKiBmYWlsc2FmZSB0aW1lciAqLworCXN0cnVjdCB0aW1lcl9saXN0IHRpbWVyOworCS8qIHRpbWVvdXQgdmFsdWUgZHVyaW5nIGxvbmcgcG9sbHMgKi8KKwl1bnNpZ25lZCBsb25nIHBvbGxfdGltZW91dDsKKwkvKiBxdWVyaWVkIHVwb24gdGltZW91dHMgKi8KKwlpbnQgKCpleHBpcnkpKGlkZV9kcml2ZV90ICopOworCisJaW50IHJlcV9nZW47CisJaW50IHJlcV9nZW5fdGltZXI7CisKKwlzcGlubG9ja190IGxvY2s7CiB9IF9fX19jYWNoZWxpbmVfaW50ZXJub2RlYWxpZ25lZF9pbl9zbXAgaWRlX2h3aWZfdDsKIAogI2RlZmluZSBNQVhfSE9TVF9QT1JUUyA0CiAKIHN0cnVjdCBpZGVfaG9zdCB7Ci0JaWRlX2h3aWZfdAkqcG9ydHNbTUFYX0hPU1RfUE9SVFNdOworCWlkZV9od2lmX3QJKnBvcnRzW01BWF9IT1NUX1BPUlRTICsgMV07CiAJdW5zaWduZWQgaW50CW5fcG9ydHM7CiAJc3RydWN0IGRldmljZQkqZGV2WzJdOwogCXVuc2lnbmVkIGludAkoKmluaXRfY2hpcHNldCkoc3RydWN0IHBjaV9kZXYgKik7CiAJdW5zaWduZWQgbG9uZwlob3N0X2ZsYWdzOwogCXZvaWQJCSpob3N0X3ByaXY7CisJaWRlX2h3aWZfdAkqY3VyX3BvcnQ7CS8qIGZvciBob3N0cyByZXF1aXJpbmcgc2VyaWFsaXphdGlvbiAqLworCisJLyogdXNlZCBmb3IgaG9zdHMgcmVxdWlyaW5nIHNlcmlhbGl6YXRpb24gKi8KKwl2b2xhdGlsZSBsb25nCWhvc3RfYnVzeTsKIH07CiAKKyNkZWZpbmUgSURFX0hPU1RfQlVTWSAwCisKIC8qCiAgKiAgaW50ZXJuYWwgaWRlIGludGVycnVwdCBoYW5kbGVyIHR5cGUKICAqLwpAQCAtODYzLDM4ICs4ODUsNiBAQAogLyogdXNlZCBieSBpZGUtY2QsIGlkZS1mbG9wcHksIGV0Yy4gKi8KIHR5cGVkZWYgdm9pZCAoeGZlcl9mdW5jX3QpKGlkZV9kcml2ZV90ICosIHN0cnVjdCByZXF1ZXN0ICpycSwgdm9pZCAqLCB1bnNpZ25lZCk7CiAKLXR5cGVkZWYgc3RydWN0IGh3Z3JvdXBfcyB7Ci0JCS8qIGlycSBoYW5kbGVyLCBpZiBhY3RpdmUgKi8KLQlpZGVfc3RhcnRzdG9wX3QJKCpoYW5kbGVyKShpZGVfZHJpdmVfdCAqKTsKLQotCQkvKiBCT09MOiBwcm90ZWN0cyBhbGwgZmllbGRzIGJlbG93ICovCi0Jdm9sYXRpbGUgaW50IGJ1c3k7Ci0JCS8qIEJPT0w6IHBvbGxpbmcgYWN0aXZlICYgcG9sbF90aW1lb3V0IGZpZWxkIHZhbGlkICovCi0JdW5zaWduZWQgaW50IHBvbGxpbmcJOiAxOwotCi0JCS8qIGN1cnJlbnQgZHJpdmUgKi8KLQlpZGVfZHJpdmVfdCAqZHJpdmU7Ci0JCS8qIHB0ciB0byBjdXJyZW50IGh3aWYgaW4gbGlua2VkLWxpc3QgKi8KLQlpZGVfaHdpZl90ICpod2lmOwotCi0JCS8qIGN1cnJlbnQgcmVxdWVzdCAqLwotCXN0cnVjdCByZXF1ZXN0ICpycTsKLQotCQkvKiBmYWlsc2FmZSB0aW1lciAqLwotCXN0cnVjdCB0aW1lcl9saXN0IHRpbWVyOwotCQkvKiB0aW1lb3V0IHZhbHVlIGR1cmluZyBsb25nIHBvbGxzICovCi0JdW5zaWduZWQgbG9uZyBwb2xsX3RpbWVvdXQ7Ci0JCS8qIHF1ZXJpZWQgdXBvbiB0aW1lb3V0cyAqLwotCWludCAoKmV4cGlyeSkoaWRlX2RyaXZlX3QgKik7Ci0KLQlpbnQgcmVxX2dlbjsKLQlpbnQgcmVxX2dlbl90aW1lcjsKLQotCXNwaW5sb2NrX3QgbG9jazsKLX0gaWRlX2h3Z3JvdXBfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgaWRlX2RyaXZlcl9zIGlkZV9kcml2ZXJfdDsKLQogZXh0ZXJuIHN0cnVjdCBtdXRleCBpZGVfc2V0dGluZ19tdHg7CiAKIC8qCkBAIC0xMDIwLDggKzEwMTAsOCBAQAogdm9pZCBpZGVfcHJvY19wb3J0X3JlZ2lzdGVyX2RldmljZXMoaWRlX2h3aWZfdCAqKTsKIHZvaWQgaWRlX3Byb2NfdW5yZWdpc3Rlcl9kZXZpY2UoaWRlX2RyaXZlX3QgKik7CiB2b2lkIGlkZV9wcm9jX3VucmVnaXN0ZXJfcG9ydChpZGVfaHdpZl90ICopOwotdm9pZCBpZGVfcHJvY19yZWdpc3Rlcl9kcml2ZXIoaWRlX2RyaXZlX3QgKiwgaWRlX2RyaXZlcl90ICopOwotdm9pZCBpZGVfcHJvY191bnJlZ2lzdGVyX2RyaXZlcihpZGVfZHJpdmVfdCAqLCBpZGVfZHJpdmVyX3QgKik7Cit2b2lkIGlkZV9wcm9jX3JlZ2lzdGVyX2RyaXZlcihpZGVfZHJpdmVfdCAqLCBzdHJ1Y3QgaWRlX2RyaXZlciAqKTsKK3ZvaWQgaWRlX3Byb2NfdW5yZWdpc3Rlcl9kcml2ZXIoaWRlX2RyaXZlX3QgKiwgc3RydWN0IGlkZV9kcml2ZXIgKik7CiAKIHJlYWRfcHJvY190IHByb2NfaWRlX3JlYWRfY2FwYWNpdHk7CiByZWFkX3Byb2NfdCBwcm9jX2lkZV9yZWFkX2dlb21ldHJ5OwpAQCAtMTA0OCw4ICsxMDM4LDEwIEBACiBzdGF0aWMgaW5saW5lIHZvaWQgaWRlX3Byb2NfcG9ydF9yZWdpc3Rlcl9kZXZpY2VzKGlkZV9od2lmX3QgKmh3aWYpIHsgOyB9CiBzdGF0aWMgaW5saW5lIHZvaWQgaWRlX3Byb2NfdW5yZWdpc3Rlcl9kZXZpY2UoaWRlX2RyaXZlX3QgKmRyaXZlKSB7IDsgfQogc3RhdGljIGlubGluZSB2b2lkIGlkZV9wcm9jX3VucmVnaXN0ZXJfcG9ydChpZGVfaHdpZl90ICpod2lmKSB7IDsgfQotc3RhdGljIGlubGluZSB2b2lkIGlkZV9wcm9jX3JlZ2lzdGVyX2RyaXZlcihpZGVfZHJpdmVfdCAqZHJpdmUsIGlkZV9kcml2ZXJfdCAqZHJpdmVyKSB7IDsgfQotc3RhdGljIGlubGluZSB2b2lkIGlkZV9wcm9jX3VucmVnaXN0ZXJfZHJpdmVyKGlkZV9kcml2ZV90ICpkcml2ZSwgaWRlX2RyaXZlcl90ICpkcml2ZXIpIHsgOyB9CitzdGF0aWMgaW5saW5lIHZvaWQgaWRlX3Byb2NfcmVnaXN0ZXJfZHJpdmVyKGlkZV9kcml2ZV90ICpkcml2ZSwKKwkJCQkJICAgIHN0cnVjdCBpZGVfZHJpdmVyICpkcml2ZXIpIHsgOyB9CitzdGF0aWMgaW5saW5lIHZvaWQgaWRlX3Byb2NfdW5yZWdpc3Rlcl9kcml2ZXIoaWRlX2RyaXZlX3QgKmRyaXZlLAorCQkJCQkgICAgICBzdHJ1Y3QgaWRlX2RyaXZlciAqZHJpdmVyKSB7IDsgfQogI2RlZmluZSBQUk9DX0lERV9SRUFEX1JFVFVSTihwYWdlLHN0YXJ0LG9mZixjb3VudCxlb2YsbGVuKSByZXR1cm4gMDsKICNlbmRpZgogCkBAIC0xMTE4LDExICsxMTEwLDEwIEBACiAgKiBUaGUgZ2VuZHJpdmVyLm93bmVyIGZpZWxkIHNob3VsZCBiZSBzZXQgdG8gdGhlIG1vZHVsZSBvd25lciBvZiB0aGlzIGRyaXZlci4KICAqIFRoZSBnZW5kcml2ZXIubmFtZSBmaWVsZCBzaG91bGQgYmUgc2V0IHRvIHRoZSBuYW1lIG9mIHRoaXMgZHJpdmVyCiAgKi8KLXN0cnVjdCBpZGVfZHJpdmVyX3Mgeworc3RydWN0IGlkZV9kcml2ZXIgewogCWNvbnN0IGNoYXIJCQkqdmVyc2lvbjsKIAlpZGVfc3RhcnRzdG9wX3QJKCpkb19yZXF1ZXN0KShpZGVfZHJpdmVfdCAqLCBzdHJ1Y3QgcmVxdWVzdCAqLCBzZWN0b3JfdCk7CiAJaW50CQkoKmVuZF9yZXF1ZXN0KShpZGVfZHJpdmVfdCAqLCBpbnQsIGludCk7Ci0JaWRlX3N0YXJ0c3RvcF90CSgqZXJyb3IpKGlkZV9kcml2ZV90ICosIHN0cnVjdCByZXF1ZXN0ICpycSwgdTgsIHU4KTsKIAlzdHJ1Y3QgZGV2aWNlX2RyaXZlcglnZW5fZHJpdmVyOwogCWludAkJKCpwcm9iZSkoaWRlX2RyaXZlX3QgKik7CiAJdm9pZAkJKCpyZW1vdmUpKGlkZV9kcml2ZV90ICopOwpAQCAtMTEzNCw3ICsxMTI1LDcgQEAKICNlbmRpZgogfTsKIAotI2RlZmluZSB0b19pZGVfZHJpdmVyKGRydikgY29udGFpbmVyX29mKGRydiwgaWRlX2RyaXZlcl90LCBnZW5fZHJpdmVyKQorI2RlZmluZSB0b19pZGVfZHJpdmVyKGRydikgY29udGFpbmVyX29mKGRydiwgc3RydWN0IGlkZV9kcml2ZXIsIGdlbl9kcml2ZXIpCiAKIGludCBpZGVfZGV2aWNlX2dldChpZGVfZHJpdmVfdCAqKTsKIHZvaWQgaWRlX2RldmljZV9wdXQoaWRlX2RyaXZlX3QgKik7CkBAIC0xMTY2LDkgKzExNTcsNyBAQAogCiB2b2lkIGlkZV9wYWRfdHJhbnNmZXIoaWRlX2RyaXZlX3QgKiwgaW50LCBpbnQpOwogCi1pZGVfc3RhcnRzdG9wX3QgX19pZGVfZXJyb3IoaWRlX2RyaXZlX3QgKiwgc3RydWN0IHJlcXVlc3QgKiwgdTgsIHU4KTsKLQotaWRlX3N0YXJ0c3RvcF90IGlkZV9lcnJvciAoaWRlX2RyaXZlX3QgKmRyaXZlLCBjb25zdCBjaGFyICptc2csIGJ5dGUgc3RhdCk7CitpZGVfc3RhcnRzdG9wX3QgaWRlX2Vycm9yKGlkZV9kcml2ZV90ICosIGNvbnN0IGNoYXIgKiwgdTgpOwogCiB2b2lkIGlkZV9maXhfZHJpdmVpZCh1MTYgKik7CiAKQEAgLTExOTIsNyArMTE4MSw2IEBACiB2b2lkIGlkZV9leGVjX2NvbW1hbmQoaWRlX2h3aWZfdCAqLCB1OCk7CiB1OCBpZGVfcmVhZF9zdGF0dXMoaWRlX2h3aWZfdCAqKTsKIHU4IGlkZV9yZWFkX2FsdHN0YXR1cyhpZGVfaHdpZl90ICopOwotdTggaWRlX3JlYWRfc2ZmX2RtYV9zdGF0dXMoaWRlX2h3aWZfdCAqKTsKIAogdm9pZCBpZGVfc2V0X2lycShpZGVfaHdpZl90ICosIGludCk7CiAKQEAgLTEyNzIsMjYgKzEyNjAsNiBAQAogCiBleHRlcm4gdm9pZCBpZGVfdGltZXJfZXhwaXJ5KHVuc2lnbmVkIGxvbmcpOwogZXh0ZXJuIGlycXJldHVybl90IGlkZV9pbnRyKGludCBpcnEsIHZvaWQgKmRldl9pZCk7Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGlkZV9sb2NrX2h3Z3JvdXAoaWRlX2h3Z3JvdXBfdCAqaHdncm91cCkKLXsKLQlpZiAoaHdncm91cC0+YnVzeSkKLQkJcmV0dXJuIDE7Ci0KLQlod2dyb3VwLT5idXN5ID0gMTsKLQkvKiBmb3IgYXRhcmkgb25seSAqLwotCWlkZV9nZXRfbG9jayhpZGVfaW50ciwgaHdncm91cCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGlkZV91bmxvY2tfaHdncm91cChpZGVfaHdncm91cF90ICpod2dyb3VwKQotewotCS8qIGZvciBhdGFyaSBvbmx5ICovCi0JaWRlX3JlbGVhc2VfbG9jaygpOwotCWh3Z3JvdXAtPmJ1c3kgPSAwOwotfQotCiBleHRlcm4gdm9pZCBkb19pZGVfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqKTsKIAogdm9pZCBpZGVfaW5pdF9kaXNrKHN0cnVjdCBnZW5kaXNrICosIGlkZV9kcml2ZV90ICopOwpAQCAtMTMyNywxMSArMTI5NSwxMSBAQAogfQogI2VuZGlmCiAKLXR5cGVkZWYgc3RydWN0IGlkZV9wY2lfZW5hYmxlYml0X3Mgeworc3RydWN0IGlkZV9wY2lfZW5hYmxlYml0IHsKIAl1OAlyZWc7CS8qIGJ5dGUgcGNpIHJlZyBob2xkaW5nIHRoZSBlbmFibGUtYml0ICovCiAJdTgJbWFzazsJLyogbWFzayB0byBpc29sYXRlIHRoZSBlbmFibGUtYml0ICovCiAJdTgJdmFsOwkvKiB2YWx1ZSBvZiBtYXNrZWQgcmVnIHdoZW4gImVuYWJsZWQiICovCi19IGlkZV9wY2lfZW5hYmxlYml0X3Q7Cit9OwogCiBlbnVtIHsKIAkvKiBVc2VzIElTQSBjb250cm9sIHBvcnRzIG5vdCBQQ0kgb25lcy4gKi8KQEAgLTE0MjAsNyArMTM4OCw4IEBACiAJY29uc3Qgc3RydWN0IGlkZV9wb3J0X29wcwkqcG9ydF9vcHM7CiAJY29uc3Qgc3RydWN0IGlkZV9kbWFfb3BzCSpkbWFfb3BzOwogCi0JaWRlX3BjaV9lbmFibGViaXRfdAllbmFibGViaXRzWzJdOworCXN0cnVjdCBpZGVfcGNpX2VuYWJsZWJpdAllbmFibGViaXRzWzJdOworCiAJaHdpZl9jaGlwc2V0X3QJCWNoaXBzZXQ7CiAKIAl1MTYJCQltYXhfc2VjdG9yczsJLyogaWYgPCB0aGFuIHRoZSBkZWZhdWx0IG9uZSAqLwpAQCAtMTQ5Miw2ICsxNDYxLDcgQEAKIGV4dGVybiB2b2lkIGlkZV9kbWFfc3RhcnQoaWRlX2RyaXZlX3QgKik7CiBpbnQgaWRlX2RtYV9lbmQoaWRlX2RyaXZlX3QgKik7CiBpbnQgaWRlX2RtYV90ZXN0X2lycShpZGVfZHJpdmVfdCAqKTsKK3U4IGlkZV9kbWFfc2ZmX3JlYWRfc3RhdHVzKGlkZV9od2lmX3QgKik7CiBleHRlcm4gY29uc3Qgc3RydWN0IGlkZV9kbWFfb3BzIHNmZl9kbWFfb3BzOwogI2Vsc2UKIHN0YXRpYyBpbmxpbmUgaW50IGNvbmZpZ19kcml2ZV9mb3JfZG1hKGlkZV9kcml2ZV90ICpkcml2ZSkgeyByZXR1cm4gMDsgfQpAQCAtMTUyOSw5ICsxNDk5LDYgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBpZGVfYWNwaV9zZXRfc3RhdGUoaWRlX2h3aWZfdCAqaHdpZiwgaW50IG9uKSB7fQogI2VuZGlmCiAKLXZvaWQgaWRlX3JlbW92ZV9wb3J0X2Zyb21faHdncm91cChpZGVfaHdpZl90ICopOwotdm9pZCBpZGVfdW5yZWdpc3RlcihpZGVfaHdpZl90ICopOwotCiB2b2lkIGlkZV9yZWdpc3Rlcl9yZWdpb24oc3RydWN0IGdlbmRpc2sgKik7CiB2b2lkIGlkZV91bnJlZ2lzdGVyX3JlZ2lvbihzdHJ1Y3QgZ2VuZGlzayAqKTsKIApAQCAtMTYxNiwyMyArMTU4Myw2IEBACiAJaWRlX3NldF9waW8oZHJpdmUsIDI1NSk7CiB9CiAKLWV4dGVybiBzcGlubG9ja190IGlkZV9sb2NrOwotZXh0ZXJuIHN0cnVjdCBtdXRleCBpZGVfY2ZnX210eDsKLS8qCi0gKiBTdHJ1Y3R1cmUgbG9ja2luZzoKLSAqCi0gKiBpZGVfY2ZnX210eCBhbmQgaHdncm91cC0+bG9jayB0b2dldGhlciBwcm90ZWN0IGNoYW5nZXMgdG8KLSAqIGlkZV9od2lmX3QtPm5leHQKLSAqIGlkZV9kcml2ZV90LT5uZXh0Ci0gKgotICogaWRlX2h3Z3JvdXBfdC0+YnVzeTogaHdncm91cC0+bG9jawotICogaWRlX2h3Z3JvdXBfdC0+aHdpZjogaHdncm91cC0+bG9jawotICogaWRlX2h3aWZfdC0+e2h3Z3JvdXAsbWF0ZX06IGNvbnN0YW50LCBubyBsb2NraW5nCi0gKiBpZGVfZHJpdmVfdC0+aHdpZjogY29uc3RhbnQsIG5vIGxvY2tpbmcKLSAqLwotCi0jZGVmaW5lIGxvY2FsX2lycV9zZXQoZmxhZ3MpCWRvIHsgbG9jYWxfc2F2ZV9mbGFncygoZmxhZ3MpKTsgbG9jYWxfaXJxX2VuYWJsZV9pbl9oYXJkaXJxKCk7IH0gd2hpbGUgKDApCi0KIGNoYXIgKmlkZV9tZWRpYV9zdHJpbmcoaWRlX2RyaXZlX3QgKik7CiAKIGV4dGVybiBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBpZGVfZGV2X2F0dHJzW107CkBAIC0xNjUxLDggKzE2MDEsMTUgQEAKIAogc3RhdGljIGlubGluZSBpZGVfZHJpdmVfdCAqaWRlX2dldF9wYWlyX2RldihpZGVfZHJpdmVfdCAqZHJpdmUpCiB7Ci0JaWRlX2RyaXZlX3QgKnBlZXIgPSAmZHJpdmUtPmh3aWYtPmRyaXZlc1soZHJpdmUtPmRuIF4gMSkgJiAxXTsKKwlpZGVfZHJpdmVfdCAqcGVlciA9IGRyaXZlLT5od2lmLT5kZXZpY2VzWyhkcml2ZS0+ZG4gXiAxKSAmIDFdOwogCiAJcmV0dXJuIChwZWVyLT5kZXZfZmxhZ3MgJiBJREVfREZMQUdfUFJFU0VOVCkgPyBwZWVyIDogTlVMTDsKIH0KKworI2RlZmluZSBpZGVfcG9ydF9mb3JfZWFjaF9kZXYoaSwgZGV2LCBwb3J0KSBcCisJZm9yICgoaSkgPSAwOyAoKGRldikgPSAocG9ydCktPmRldmljZXNbaV0pIHx8IChpKSA8IE1BWF9EUklWRVM7IChpKSsrKQorCisjZGVmaW5lIGlkZV9ob3N0X2Zvcl9lYWNoX3BvcnQoaSwgcG9ydCwgaG9zdCkgXAorCWZvciAoKGkpID0gMDsgKChwb3J0KSA9IChob3N0KS0+cG9ydHNbaV0pIHx8IChpKSA8IE1BWF9IT1NUX1BPUlRTOyAoaSkrKykKKwogI2VuZGlmIC8qIF9JREVfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pZl92bGFuLmggYi9pbmNsdWRlL2xpbnV4L2lmX3ZsYW4uaAppbmRleCBhNWNiMGMzLi5mOGZmOTE4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2lmX3ZsYW4uaAorKysgYi9pbmNsdWRlL2xpbnV4L2lmX3ZsYW4uaApAQCAtMTE1LDYgKzExNSwxMSBAQAogZXh0ZXJuIGludCBfX3ZsYW5faHdhY2NlbF9yeChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgdmxhbl9ncm91cCAqZ3JwLAogCQkJICAgICB1MTYgdmxhbl90Y2ksIGludCBwb2xsaW5nKTsKIGV4dGVybiBpbnQgdmxhbl9od2FjY2VsX2RvX3JlY2VpdmUoc3RydWN0IHNrX2J1ZmYgKnNrYik7CitleHRlcm4gaW50IHZsYW5fZ3JvX3JlY2VpdmUoc3RydWN0IG5hcGlfc3RydWN0ICpuYXBpLCBzdHJ1Y3Qgdmxhbl9ncm91cCAqZ3JwLAorCQkJICAgIHVuc2lnbmVkIGludCB2bGFuX3RjaSwgc3RydWN0IHNrX2J1ZmYgKnNrYik7CitleHRlcm4gaW50IHZsYW5fZ3JvX2ZyYWdzKHN0cnVjdCBuYXBpX3N0cnVjdCAqbmFwaSwgc3RydWN0IHZsYW5fZ3JvdXAgKmdycCwKKwkJCSAgdW5zaWduZWQgaW50IHZsYW5fdGNpLAorCQkJICBzdHJ1Y3QgbmFwaV9ncm9fZnJhZ2luZm8gKmluZm8pOwogCiAjZWxzZQogc3RhdGljIGlubGluZSBzdHJ1Y3QgbmV0X2RldmljZSAqdmxhbl9kZXZfcmVhbF9kZXYoY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKQEAgLTE0MCw2ICsxNDUsMjAgQEAKIHsKIAlyZXR1cm4gMDsKIH0KKworc3RhdGljIGlubGluZSBpbnQgdmxhbl9ncm9fcmVjZWl2ZShzdHJ1Y3QgbmFwaV9zdHJ1Y3QgKm5hcGksCisJCQkJICAgc3RydWN0IHZsYW5fZ3JvdXAgKmdycCwKKwkJCQkgICB1bnNpZ25lZCBpbnQgdmxhbl90Y2ksIHN0cnVjdCBza19idWZmICpza2IpCit7CisJcmV0dXJuIE5FVF9SWF9EUk9QOworfQorCitzdGF0aWMgaW5saW5lIGludCB2bGFuX2dyb19mcmFncyhzdHJ1Y3QgbmFwaV9zdHJ1Y3QgKm5hcGksCisJCQkJIHN0cnVjdCB2bGFuX2dyb3VwICpncnAsIHVuc2lnbmVkIGludCB2bGFuX3RjaSwKKwkJCQkgc3RydWN0IG5hcGlfZ3JvX2ZyYWdpbmZvICppbmZvKQoreworCXJldHVybiBORVRfUlhfRFJPUDsKK30KICNlbmRpZgogCiAvKioKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaW50ZXJydXB0LmggYi9pbmNsdWRlL2xpbnV4L2ludGVycnVwdC5oCmluZGV4IDA3MDJjNGQuLjkxMjdmNmIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaW50ZXJydXB0LmgKKysrIGIvaW5jbHVkZS9saW51eC9pbnRlcnJ1cHQuaApAQCAtMTQsNyArMTQsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2lycWZsYWdzLmg+CiAjaW5jbHVkZSA8bGludXgvc21wLmg+CiAjaW5jbHVkZSA8bGludXgvcGVyY3B1Lmg+Ci0jaW5jbHVkZSA8bGludXgvaXJxbnIuaD4KIAogI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KICNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CkBAIC0yNTMsNyArMjUyLDggQEAKIAlCTE9DS19TT0ZUSVJRLAogCVRBU0tMRVRfU09GVElSUSwKIAlTQ0hFRF9TT0ZUSVJRLAotCVJDVV9TT0ZUSVJRLCAJLyogUHJlZmVyYWJsZSBSQ1Ugc2hvdWxkIGFsd2F5cyBiZSB0aGUgbGFzdCBzb2Z0aXJxICovCisJSFJUSU1FUl9TT0ZUSVJRLAorCVJDVV9TT0ZUSVJRLAkvKiBQcmVmZXJhYmxlIFJDVSBzaG91bGQgYWx3YXlzIGJlIHRoZSBsYXN0IHNvZnRpcnEgKi8KIAogCU5SX1NPRlRJUlFTCiB9OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pb3BvcnQuaCBiL2luY2x1ZGUvbGludXgvaW9wb3J0LmgKaW5kZXggMDQxZTk1YS4uZjZiYjJjYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pb3BvcnQuaAorKysgYi9pbmNsdWRlL2xpbnV4L2lvcG9ydC5oCkBAIC00OSw2ICs0OSw3IEBACiAjZGVmaW5lIElPUkVTT1VSQ0VfU0laRUFMSUdOCTB4MDAwMjAwMDAJLyogc2l6ZSBpbmRpY2F0ZXMgYWxpZ25tZW50ICovCiAjZGVmaW5lIElPUkVTT1VSQ0VfU1RBUlRBTElHTgkweDAwMDQwMDAwCS8qIHN0YXJ0IGZpZWxkIGlzIGFsaWdubWVudCAqLwogCisjZGVmaW5lIElPUkVTT1VSQ0VfRVhDTFVTSVZFCTB4MDgwMDAwMDAJLyogVXNlcmxhbmQgbWF5IG5vdCBtYXAgdGhpcyByZXNvdXJjZSAqLwogI2RlZmluZSBJT1JFU09VUkNFX0RJU0FCTEVECTB4MTAwMDAwMDAKICNkZWZpbmUgSU9SRVNPVVJDRV9VTlNFVAkweDIwMDAwMDAwCiAjZGVmaW5lIElPUkVTT1VSQ0VfQVVUTwkJMHg0MDAwMDAwMApAQCAtMTMzLDEzICsxMzQsMTYgQEAKIH0KIAogLyogQ29udmVuaWVuY2Ugc2hvcnRoYW5kIHdpdGggYWxsb2NhdGlvbiAqLwotI2RlZmluZSByZXF1ZXN0X3JlZ2lvbihzdGFydCxuLG5hbWUpCV9fcmVxdWVzdF9yZWdpb24oJmlvcG9ydF9yZXNvdXJjZSwgKHN0YXJ0KSwgKG4pLCAobmFtZSkpCi0jZGVmaW5lIHJlcXVlc3RfbWVtX3JlZ2lvbihzdGFydCxuLG5hbWUpIF9fcmVxdWVzdF9yZWdpb24oJmlvbWVtX3Jlc291cmNlLCAoc3RhcnQpLCAobiksIChuYW1lKSkKKyNkZWZpbmUgcmVxdWVzdF9yZWdpb24oc3RhcnQsbixuYW1lKQlfX3JlcXVlc3RfcmVnaW9uKCZpb3BvcnRfcmVzb3VyY2UsIChzdGFydCksIChuKSwgKG5hbWUpLCAwKQorI2RlZmluZSBfX3JlcXVlc3RfbWVtX3JlZ2lvbihzdGFydCxuLG5hbWUsIGV4Y2wpIF9fcmVxdWVzdF9yZWdpb24oJmlvbWVtX3Jlc291cmNlLCAoc3RhcnQpLCAobiksIChuYW1lKSwgZXhjbCkKKyNkZWZpbmUgcmVxdWVzdF9tZW1fcmVnaW9uKHN0YXJ0LG4sbmFtZSkgX19yZXF1ZXN0X3JlZ2lvbigmaW9tZW1fcmVzb3VyY2UsIChzdGFydCksIChuKSwgKG5hbWUpLCAwKQorI2RlZmluZSByZXF1ZXN0X21lbV9yZWdpb25fZXhjbHVzaXZlKHN0YXJ0LG4sbmFtZSkgXAorCV9fcmVxdWVzdF9yZWdpb24oJmlvbWVtX3Jlc291cmNlLCAoc3RhcnQpLCAobiksIChuYW1lKSwgSU9SRVNPVVJDRV9FWENMVVNJVkUpCiAjZGVmaW5lIHJlbmFtZV9yZWdpb24ocmVnaW9uLCBuZXduYW1lKSBkbyB7IChyZWdpb24pLT5uYW1lID0gKG5ld25hbWUpOyB9IHdoaWxlICgwKQogCiBleHRlcm4gc3RydWN0IHJlc291cmNlICogX19yZXF1ZXN0X3JlZ2lvbihzdHJ1Y3QgcmVzb3VyY2UgKiwKIAkJCQkJcmVzb3VyY2Vfc2l6ZV90IHN0YXJ0LAotCQkJCQlyZXNvdXJjZV9zaXplX3QgbiwgY29uc3QgY2hhciAqbmFtZSk7CisJCQkJCXJlc291cmNlX3NpemVfdCBuLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgcmVsYXhlZCk7CiAKIC8qIENvbXBhdGliaWxpdHkgY3J1ZnQgKi8KICNkZWZpbmUgcmVsZWFzZV9yZWdpb24oc3RhcnQsbikJX19yZWxlYXNlX3JlZ2lvbigmaW9wb3J0X3Jlc291cmNlLCAoc3RhcnQpLCAobikpCkBAIC0xNzUsNiArMTc5LDcgQEAKIGV4dGVybiB2b2lkIF9fZGV2bV9yZWxlYXNlX3JlZ2lvbihzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCByZXNvdXJjZSAqcGFyZW50LAogCQkJCSAgcmVzb3VyY2Vfc2l6ZV90IHN0YXJ0LCByZXNvdXJjZV9zaXplX3Qgbik7CiBleHRlcm4gaW50IGlvbWVtX21hcF9zYW5pdHlfY2hlY2socmVzb3VyY2Vfc2l6ZV90IGFkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSk7CitleHRlcm4gaW50IGlvbWVtX2lzX2V4Y2x1c2l2ZSh1NjQgYWRkcik7CiAKICNlbmRpZiAvKiBfX0FTU0VNQkxZX18gKi8KICNlbmRpZgkvKiBfTElOVVhfSU9QT1JUX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaW9wcmlvLmggYi9pbmNsdWRlL2xpbnV4L2lvcHJpby5oCmluZGV4IGY5OGE2NTYuLjc2ZGFkNDggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaW9wcmlvLmgKKysrIGIvaW5jbHVkZS9saW51eC9pb3ByaW8uaApAQCAtODYsNCArODYsNiBAQAogICovCiBleHRlcm4gaW50IGlvcHJpb19iZXN0KHVuc2lnbmVkIHNob3J0IGFwcmlvLCB1bnNpZ25lZCBzaG9ydCBicHJpbyk7CiAKK2V4dGVybiBpbnQgc2V0X3Rhc2tfaW9wcmlvKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgaW50IGlvcHJpbyk7CisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pcnFuci5oIGIvaW5jbHVkZS9saW51eC9pcnFuci5oCmluZGV4IDU1MDRhNWMuLjg2YWY5MmUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaXJxbnIuaAorKysgYi9pbmNsdWRlL2xpbnV4L2lycW5yLmgKQEAgLTgsNyArOCwxMiBAQAogCiAjaWZuZGVmIENPTkZJR19HRU5FUklDX0hBUkRJUlFTCiAjaW5jbHVkZSA8YXNtL2lycS5oPgotIyBkZWZpbmUgbnJfaXJxcwkJTlJfSVJRUworCisvKgorICogV3JhcHBlcnMgZm9yIG5vbi1nZW5pcnEgYXJjaGl0ZWN0dXJlczoKKyAqLworI2RlZmluZSBucl9pcnFzCQkJTlJfSVJRUworI2RlZmluZSBpcnFfdG9fZGVzYyhpcnEpCSgmaXJxX2Rlc2NbaXJxXSkKIAogIyBkZWZpbmUgZm9yX2VhY2hfaXJxX2Rlc2MoaXJxLCBkZXNjKQkJXAogCWZvciAoaXJxID0gMDsgaXJxIDwgbnJfaXJxczsgaXJxKyspCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2piZC5oIGIvaW5jbHVkZS9saW51eC9qYmQuaAppbmRleCAzNDZlMmI4Li42Mzg0YjE5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2piZC5oCisrKyBiL2luY2x1ZGUvbGludXgvamJkLmgKQEAgLTU0Myw2ICs1NDMsMTEgQEAKIAl1bnNpZ25lZCBsb25nCQl0X2V4cGlyZXM7CiAKIAkvKgorCSAqIFdoZW4gdGhpcyB0cmFuc2FjdGlvbiBzdGFydGVkLCBpbiBuYW5vc2Vjb25kcyBbbm8gbG9ja2luZ10KKwkgKi8KKwlrdGltZV90CQkJdF9zdGFydF90aW1lOworCisJLyoKIAkgKiBIb3cgbWFueSBoYW5kbGVzIHVzZWQgdGhpcyB0cmFuc2FjdGlvbj8gW3RfaGFuZGxlX2xvY2tdCiAJICovCiAJaW50IHRfaGFuZGxlX2NvdW50OwpAQCAtNzk4LDkgKzgwMywxOSBAQAogCXN0cnVjdCBidWZmZXJfaGVhZAkqKmpfd2J1ZjsKIAlpbnQJCQlqX3didWZzaXplOwogCisJLyoKKwkgKiB0aGlzIGlzIHRoZSBwaWQgb2YgdGhlIGxhc3QgcGVyc29uIHRvIHJ1biBhIHN5bmNocm9ub3VzIG9wZXJhdGlvbgorCSAqIHRocm91Z2ggdGhlIGpvdXJuYWwuCisJICovCiAJcGlkX3QJCQlqX2xhc3Rfc3luY193cml0ZXI7CiAKIAkvKgorCSAqIHRoZSBhdmVyYWdlIGFtb3VudCBvZiB0aW1lIGluIG5hbm9zZWNvbmRzIGl0IHRha2VzIHRvIGNvbW1pdCBhCisJICogdHJhbnNhY3Rpb24gdG8gdGhlIGRpc2suICBbal9zdGF0ZV9sb2NrXQorCSAqLworCXU2NAkJCWpfYXZlcmFnZV9jb21taXRfdGltZTsKKworCS8qCiAJICogQW4gb3BhcXVlIHBvaW50ZXIgdG8gZnMtcHJpdmF0ZSBpbmZvcm1hdGlvbi4gIGV4dDMgcHV0cyBpdHMKIAkgKiBzdXBlcmJsb2NrIHBvaW50ZXIgaGVyZQogCSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9qYmQyLmggYi9pbmNsdWRlL2xpbnV4L2piZDIuaAppbmRleCBjN2QxMDZlLi5iNDUxMDljIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2piZDIuaAorKysgYi9pbmNsdWRlL2xpbnV4L2piZDIuaApAQCAtMzI5LDYgKzMyOSw3IEBACiAJQkhfU3RhdGUsCQkvKiBQaW5zIG1vc3Qgam91cm5hbF9oZWFkIHN0YXRlICovCiAJQkhfSm91cm5hbEhlYWQsCQkvKiBQaW5zIGJoLT5iX3ByaXZhdGUgYW5kIGpoLT5iX2JoICovCiAJQkhfVW5zaGFkb3csCQkvKiBEdW1teSBiaXQsIGZvciBCSl9TaGFkb3cgd2FrZXVwIGZpbHRlcmluZyAqLworCUJIX0pCRFByaXZhdGVTdGFydCwJLyogRmlyc3QgYml0IGF2YWlsYWJsZSBmb3IgcHJpdmF0ZSB1c2UgYnkgRlMgKi8KIH07CiAKIEJVRkZFUl9GTlMoSkJELCBqYmQpCkBAIC02MzcsNiArNjM4LDExIEBACiAJdW5zaWduZWQgbG9uZwkJdF9leHBpcmVzOwogCiAJLyoKKwkgKiBXaGVuIHRoaXMgdHJhbnNhY3Rpb24gc3RhcnRlZCwgaW4gbmFub3NlY29uZHMgW25vIGxvY2tpbmddCisJICovCisJa3RpbWVfdAkJCXRfc3RhcnRfdGltZTsKKworCS8qCiAJICogSG93IG1hbnkgaGFuZGxlcyB1c2VkIHRoaXMgdHJhbnNhY3Rpb24/IFt0X2hhbmRsZV9sb2NrXQogCSAqLwogCWludCB0X2hhbmRsZV9jb3VudDsKQEAgLTY4MSw2ICs2ODcsOCBAQAogCXJldHVybiBlbmQgKyAoTUFYX0pJRkZZX09GRlNFVCAtIHN0YXJ0KTsKIH0KIAorI2RlZmluZSBKQkQyX05SX0JBVENICTY0CisKIC8qKgogICogc3RydWN0IGpvdXJuYWxfcyAtIFRoZSBqb3VybmFsX3MgdHlwZSBpcyB0aGUgY29uY3JldGUgdHlwZSBhc3NvY2lhdGVkIHdpdGgKICAqICAgICBqb3VybmFsX3QuCkBAIC04MjUsNiArODMzLDE0IEBACiAJc3RydWN0IG11dGV4CQlqX2NoZWNrcG9pbnRfbXV0ZXg7CiAKIAkvKgorCSAqIExpc3Qgb2YgYnVmZmVyIGhlYWRzIHVzZWQgYnkgdGhlIGNoZWNrcG9pbnQgcm91dGluZS4gIFRoaXMKKwkgKiB3YXMgbW92ZWQgZnJvbSBqYmQyX2xvZ19kb19jaGVja3BvaW50KCkgdG8gcmVkdWNlIHN0YWNrCisJICogdXNhZ2UuICBBY2Nlc3MgdG8gdGhpcyBhcnJheSBpcyBjb250cm9sbGVkIGJ5IHRoZQorCSAqIGpfY2hlY2twb2ludF9tdXRleC4gIFtqX2NoZWNrcG9pbnRfbXV0ZXhdCisJICovCisJc3RydWN0IGJ1ZmZlcl9oZWFkCSpqX2Noa3B0X2Joc1tKQkQyX05SX0JBVENIXTsKKwkKKwkvKgogCSAqIEpvdXJuYWwgaGVhZDogaWRlbnRpZmllcyB0aGUgZmlyc3QgdW51c2VkIGJsb2NrIGluIHRoZSBqb3VybmFsLgogCSAqIFtqX3N0YXRlX2xvY2tdCiAJICovCkBAIC05MzgsOCArOTU0LDI2IEBACiAJc3RydWN0IGJ1ZmZlcl9oZWFkCSoqal93YnVmOwogCWludAkJCWpfd2J1ZnNpemU7CiAKKwkvKgorCSAqIHRoaXMgaXMgdGhlIHBpZCBvZiBodGUgbGFzdCBwZXJzb24gdG8gcnVuIGEgc3luY2hyb25vdXMgb3BlcmF0aW9uCisJICogdGhyb3VnaCB0aGUgam91cm5hbAorCSAqLwogCXBpZF90CQkJal9sYXN0X3N5bmNfd3JpdGVyOwogCisJLyoKKwkgKiB0aGUgYXZlcmFnZSBhbW91bnQgb2YgdGltZSBpbiBuYW5vc2Vjb25kcyBpdCB0YWtlcyB0byBjb21taXQgYQorCSAqIHRyYW5zYWN0aW9uIHRvIGRpc2suIFtqX3N0YXRlX2xvY2tdCisJICovCisJdTY0CQkJal9hdmVyYWdlX2NvbW1pdF90aW1lOworCisJLyoKKwkgKiBtaW5pbXVtIGFuZCBtYXhpbXVtIHRpbWVzIHRoYXQgd2Ugc2hvdWxkIHdhaXQgZm9yCisJICogYWRkaXRpb25hbCBmaWxlc3lzdGVtIG9wZXJhdGlvbnMgdG8gZ2V0IGJhdGNoZWQgaW50byBhCisJICogc3luY2hyb25vdXMgaGFuZGxlIGluIG1pY3Jvc2Vjb25kcworCSAqLworCXUzMgkJCWpfbWluX2JhdGNoX3RpbWU7CisJdTMyCQkJal9tYXhfYmF0Y2hfdGltZTsKKwogCS8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gYSB0cmFuc2FjdGlvbiBpcyBjbG9zZWQgKi8KIAl2b2lkCQkJKCpqX2NvbW1pdF9jYWxsYmFjaykoam91cm5hbF90ICosCiAJCQkJCQkgICAgIHRyYW5zYWN0aW9uX3QgKik7CkBAIC0xMDA3LDYgKzEwNDEsMzUgQEAKIGludCBfX2piZDJfam91cm5hbF9yZW1vdmVfY2hlY2twb2ludChzdHJ1Y3Qgam91cm5hbF9oZWFkICopOwogdm9pZCBfX2piZDJfam91cm5hbF9pbnNlcnRfY2hlY2twb2ludChzdHJ1Y3Qgam91cm5hbF9oZWFkICosIHRyYW5zYWN0aW9uX3QgKik7CiAKKworLyoKKyAqIFRyaWdnZXJzCisgKi8KKworc3RydWN0IGpiZDJfYnVmZmVyX3RyaWdnZXJfdHlwZSB7CisJLyoKKwkgKiBGaXJlZCBqdXN0IGJlZm9yZSBhIGJ1ZmZlciBpcyB3cml0dGVuIHRvIHRoZSBqb3VybmFsLgorCSAqIG1hcHBlZF9kYXRhIGlzIGEgbWFwcGVkIGJ1ZmZlciB0aGF0IGlzIHRoZSBmcm96ZW4gZGF0YSBmb3IKKwkgKiBjb21taXQuCisJICovCisJdm9pZCAoKnRfY29tbWl0KShzdHJ1Y3QgamJkMl9idWZmZXJfdHJpZ2dlcl90eXBlICp0eXBlLAorCQkJIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsIHZvaWQgKm1hcHBlZF9kYXRhLAorCQkJIHNpemVfdCBzaXplKTsKKworCS8qCisJICogRmlyZWQgZHVyaW5nIGpvdXJuYWwgYWJvcnQgZm9yIGRpcnR5IGJ1ZmZlcnMgdGhhdCB3aWxsIG5vdCBiZQorCSAqIGNvbW1pdHRlZC4KKwkgKi8KKwl2b2lkICgqdF9hYm9ydCkoc3RydWN0IGpiZDJfYnVmZmVyX3RyaWdnZXJfdHlwZSAqdHlwZSwKKwkJCXN0cnVjdCBidWZmZXJfaGVhZCAqYmgpOworfTsKKworZXh0ZXJuIHZvaWQgamJkMl9idWZmZXJfY29tbWl0X3RyaWdnZXIoc3RydWN0IGpvdXJuYWxfaGVhZCAqamgsCisJCQkJICAgICAgIHZvaWQgKm1hcHBlZF9kYXRhLAorCQkJCSAgICAgICBzdHJ1Y3QgamJkMl9idWZmZXJfdHJpZ2dlcl90eXBlICp0cmlnZ2Vycyk7CitleHRlcm4gdm9pZCBqYmQyX2J1ZmZlcl9hYm9ydF90cmlnZ2VyKHN0cnVjdCBqb3VybmFsX2hlYWQgKmpoLAorCQkJCSAgICAgIHN0cnVjdCBqYmQyX2J1ZmZlcl90cmlnZ2VyX3R5cGUgKnRyaWdnZXJzKTsKKwogLyogQnVmZmVyIElPICovCiBleHRlcm4gaW50CiBqYmQyX2pvdXJuYWxfd3JpdGVfbWV0YWRhdGFfYnVmZmVyKHRyYW5zYWN0aW9uX3QJICAqdHJhbnNhY3Rpb24sCkBAIC0xMDQ1LDYgKzExMDgsOCBAQAogZXh0ZXJuIGludAkgamJkMl9qb3VybmFsX2dldF93cml0ZV9hY2Nlc3MoaGFuZGxlX3QgKiwgc3RydWN0IGJ1ZmZlcl9oZWFkICopOwogZXh0ZXJuIGludAkgamJkMl9qb3VybmFsX2dldF9jcmVhdGVfYWNjZXNzIChoYW5kbGVfdCAqLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKik7CiBleHRlcm4gaW50CSBqYmQyX2pvdXJuYWxfZ2V0X3VuZG9fYWNjZXNzKGhhbmRsZV90ICosIHN0cnVjdCBidWZmZXJfaGVhZCAqKTsKK3ZvaWQJCSBqYmQyX2pvdXJuYWxfc2V0X3RyaWdnZXJzKHN0cnVjdCBidWZmZXJfaGVhZCAqLAorCQkJCQkgICBzdHJ1Y3QgamJkMl9idWZmZXJfdHJpZ2dlcl90eXBlICp0eXBlKTsKIGV4dGVybiBpbnQJIGpiZDJfam91cm5hbF9kaXJ0eV9tZXRhZGF0YSAoaGFuZGxlX3QgKiwgc3RydWN0IGJ1ZmZlcl9oZWFkICopOwogZXh0ZXJuIHZvaWQJIGpiZDJfam91cm5hbF9yZWxlYXNlX2J1ZmZlciAoaGFuZGxlX3QgKiwgc3RydWN0IGJ1ZmZlcl9oZWFkICopOwogZXh0ZXJuIGludAkgamJkMl9qb3VybmFsX2ZvcmdldCAoaGFuZGxlX3QgKiwgc3RydWN0IGJ1ZmZlcl9oZWFkICopOwpAQCAtMTA3MCw3ICsxMTM1LDYgQEAKIAkJICAgKGpvdXJuYWxfdCAqLCB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nKTsKIGV4dGVybiB2b2lkCSAgIGpiZDJfam91cm5hbF9jbGVhcl9mZWF0dXJlcwogCQkgICAoam91cm5hbF90ICosIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcpOwotZXh0ZXJuIGludAkgICBqYmQyX2pvdXJuYWxfY3JlYXRlICAgICAoam91cm5hbF90ICopOwogZXh0ZXJuIGludAkgICBqYmQyX2pvdXJuYWxfbG9hZCAgICAgICAoam91cm5hbF90ICpqb3VybmFsKTsKIGV4dGVybiBpbnQJICAgamJkMl9qb3VybmFsX2Rlc3Ryb3kgICAgKGpvdXJuYWxfdCAqKTsKIGV4dGVybiBpbnQJICAgamJkMl9qb3VybmFsX3JlY292ZXIgICAgKGpvdXJuYWxfdCAqam91cm5hbCk7CkBAIC0xMTQ1LDggKzEyMDksOCBAQAogaW50IGpiZDJfbG9nX2RvX2NoZWNrcG9pbnQoam91cm5hbF90ICpqb3VybmFsKTsKIAogdm9pZCBfX2piZDJfbG9nX3dhaXRfZm9yX3NwYWNlKGpvdXJuYWxfdCAqam91cm5hbCk7Ci1leHRlcm4gdm9pZAlfX2piZDJfam91cm5hbF9kcm9wX3RyYW5zYWN0aW9uKGpvdXJuYWxfdCAqLCB0cmFuc2FjdGlvbl90ICopOwotZXh0ZXJuIGludAlqYmQyX2NsZWFudXBfam91cm5hbF90YWlsKGpvdXJuYWxfdCAqKTsKK2V4dGVybiB2b2lkIF9famJkMl9qb3VybmFsX2Ryb3BfdHJhbnNhY3Rpb24oam91cm5hbF90ICosIHRyYW5zYWN0aW9uX3QgKik7CitleHRlcm4gaW50IGpiZDJfY2xlYW51cF9qb3VybmFsX3RhaWwoam91cm5hbF90ICopOwogCiAvKiBEZWJ1Z2dpbmcgY29kZSBvbmx5OiAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2pvdXJuYWwtaGVhZC5oIGIvaW5jbHVkZS9saW51eC9qb3VybmFsLWhlYWQuaAppbmRleCBiYjcwZWJiLi41MjVhYWMzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2pvdXJuYWwtaGVhZC5oCisrKyBiL2luY2x1ZGUvbGludXgvam91cm5hbC1oZWFkLmgKQEAgLTEyLDYgKzEyLDggQEAKIAogdHlwZWRlZiB1bnNpZ25lZCBpbnQJCXRpZF90OwkJLyogVW5pcXVlIHRyYW5zYWN0aW9uIElEICovCiB0eXBlZGVmIHN0cnVjdCB0cmFuc2FjdGlvbl9zCXRyYW5zYWN0aW9uX3Q7CS8qIENvbXBvdW5kIHRyYW5zYWN0aW9uIHR5cGUgKi8KKworCiBzdHJ1Y3QgYnVmZmVyX2hlYWQ7CiAKIHN0cnVjdCBqb3VybmFsX2hlYWQgewpAQCAtODcsNiArODksMTIgQEAKIAkgKiBbal9saXN0X2xvY2tdCiAJICovCiAJc3RydWN0IGpvdXJuYWxfaGVhZCAqYl9jcG5leHQsICpiX2NwcHJldjsKKworCS8qIFRyaWdnZXIgdHlwZSAqLworCXN0cnVjdCBqYmQyX2J1ZmZlcl90cmlnZ2VyX3R5cGUgKmJfdHJpZ2dlcnM7CisKKwkvKiBUcmlnZ2VyIHR5cGUgZm9yIHRoZSBjb21taXR0aW5nIHRyYW5zYWN0aW9uJ3MgZnJvemVuIGRhdGEgKi8KKwlzdHJ1Y3QgamJkMl9idWZmZXJfdHJpZ2dlcl90eXBlICpiX2Zyb3plbl90cmlnZ2VyczsKIH07CiAKICNlbmRpZgkJLyogSk9VUk5BTF9IRUFEX0hfSU5DTFVERUQgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgva2VybmVsLmggYi9pbmNsdWRlL2xpbnV4L2tlcm5lbC5oCmluZGV4IGNhOWZmNjQuLjM0M2RmOWUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgva2VybmVsLmgKKysrIGIvaW5jbHVkZS9saW51eC9rZXJuZWwuaApAQCAtNDgsNiArNDgsMTIgQEAKICNkZWZpbmUgRklFTERfU0laRU9GKHQsIGYpIChzaXplb2YoKCh0KikwKS0+ZikpCiAjZGVmaW5lIERJVl9ST1VORF9VUChuLGQpICgoKG4pICsgKGQpIC0gMSkgLyAoZCkpCiAjZGVmaW5lIHJvdW5kdXAoeCwgeSkgKCgoKHgpICsgKCh5KSAtIDEpKSAvICh5KSkgKiAoeSkpCisjZGVmaW5lIERJVl9ST1VORF9DTE9TRVNUKHgsIGRpdmlzb3IpKAkJCVwKK3sJCQkJCQkJXAorCXR5cGVvZihkaXZpc29yKSBfX2Rpdmlzb3IgPSBkaXZpc29yOwkJXAorCSgoKHgpICsgKChfX2Rpdmlzb3IpIC8gMikpIC8gKF9fZGl2aXNvcikpOwlcCit9CQkJCQkJCVwKKykKIAogI2RlZmluZSBfUkVUX0lQXwkJKHVuc2lnbmVkIGxvbmcpX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApCiAjZGVmaW5lIF9USElTX0lQXyAgKHsgX19sYWJlbF9fIF9faGVyZTsgX19oZXJlOiAodW5zaWduZWQgbG9uZykmJl9faGVyZTsgfSkKQEAgLTM0OSwxMyArMzU1LDEzIEBACiAgICAgICAgIHByaW50ayhLRVJOX0lORk8gcHJfZm10KGZtdCksICMjX19WQV9BUkdTX18pCiAKIC8qIElmIHlvdSBhcmUgd3JpdGluZyBhIGRyaXZlciwgcGxlYXNlIHVzZSBkZXZfZGJnIGluc3RlYWQgKi8KLSNpZiBkZWZpbmVkKENPTkZJR19EWU5BTUlDX1BSSU5US19ERUJVRykKKyNpZiBkZWZpbmVkKERFQlVHKQorI2RlZmluZSBwcl9kZWJ1ZyhmbXQsIC4uLikgXAorCXByaW50ayhLRVJOX0RFQlVHIHByX2ZtdChmbXQpLCAjI19fVkFfQVJHU19fKQorI2VsaWYgZGVmaW5lZChDT05GSUdfRFlOQU1JQ19QUklOVEtfREVCVUcpCiAjZGVmaW5lIHByX2RlYnVnKGZtdCwgLi4uKSBkbyB7IFwKIAlkeW5hbWljX3ByX2RlYnVnKHByX2ZtdChmbXQpLCAjI19fVkFfQVJHU19fKTsgXAogCX0gd2hpbGUgKDApCi0jZWxpZiBkZWZpbmVkKERFQlVHKQotI2RlZmluZSBwcl9kZWJ1ZyhmbXQsIC4uLikgXAotCXByaW50ayhLRVJOX0RFQlVHIHByX2ZtdChmbXQpLCAjI19fVkFfQVJHU19fKQogI2Vsc2UKICNkZWZpbmUgcHJfZGVidWcoZm10LCAuLi4pIFwKIAkoeyBpZiAoMCkgcHJpbnRrKEtFUk5fREVCVUcgcHJfZm10KGZtdCksICMjX19WQV9BUkdTX18pOyAwOyB9KQpAQCAtNDcwLDYgKzQ3NiwxMiBAQAogCV9fdmFsID0gX192YWwgPCBfX21pbiA/IF9fbWluOiBfX3ZhbDsJXAogCV9fdmFsID4gX19tYXggPyBfX21heDogX192YWw7IH0pCiAKKworLyoKKyAqIHN3YXAgLSBzd2FwIHZhbHVlIG9mIEBhIGFuZCBAYgorICovCisjZGVmaW5lIHN3YXAoYSwgYikgKHsgdHlwZW9mKGEpIF9fdG1wID0gKGEpOyAoYSkgPSAoYik7IChiKSA9IF9fdG1wOyB9KQorCiAvKioKICAqIGNvbnRhaW5lcl9vZiAtIGNhc3QgYSBtZW1iZXIgb2YgYSBzdHJ1Y3R1cmUgb3V0IHRvIHRoZSBjb250YWluaW5nIHN0cnVjdHVyZQogICogQHB0cjoJdGhlIHBvaW50ZXIgdG8gdGhlIG1lbWJlci4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgva2xpc3QuaCBiL2luY2x1ZGUvbGludXgva2xpc3QuaAppbmRleCA4ZWE5OGRiLi5kNWEyN2FmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2tsaXN0LmgKKysrIGIvaW5jbHVkZS9saW51eC9rbGlzdC5oCkBAIC0xMyw3ICsxMyw2IEBACiAjZGVmaW5lIF9MSU5VWF9LTElTVF9ICiAKICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgotI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KICNpbmNsdWRlIDxsaW51eC9rcmVmLmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogCkBAIC00MSw3ICs0MCw2IEBACiAJdm9pZAkJCSpuX2tsaXN0OwkvKiBuZXZlciBhY2Nlc3MgZGlyZWN0bHkgKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkCW5fbm9kZTsKIAlzdHJ1Y3Qga3JlZgkJbl9yZWY7Ci0Jc3RydWN0IGNvbXBsZXRpb24Jbl9yZW1vdmVkOwogfTsKIAogZXh0ZXJuIHZvaWQga2xpc3RfYWRkX3RhaWwoc3RydWN0IGtsaXN0X25vZGUgKm4sIHN0cnVjdCBrbGlzdCAqayk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2twcm9iZXMuaCBiL2luY2x1ZGUvbGludXgva3Byb2Jlcy5oCmluZGV4IDQ5N2IxZDEuLmQ2ZWExOWUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgva3Byb2Jlcy5oCisrKyBiL2luY2x1ZGUvbGludXgva3Byb2Jlcy5oCkBAIC02OSw5ICs2OSw2IEBACiAJLyogbGlzdCBvZiBrcHJvYmVzIGZvciBtdWx0aS1oYW5kbGVyIHN1cHBvcnQgKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CiAKLQkvKiBJbmRpY2F0ZXMgdGhhdCB0aGUgY29ycmVzcG9uZGluZyBtb2R1bGUgaGFzIGJlZW4gcmVmIGNvdW50ZWQgKi8KLQl1bnNpZ25lZCBpbnQgbW9kX3JlZmNvdW50ZWQ7Ci0KIAkvKmNvdW50IHRoZSBudW1iZXIgb2YgdGltZXMgdGhpcyBwcm9iZSB3YXMgdGVtcG9yYXJpbHkgZGlzYXJtZWQgKi8KIAl1bnNpZ25lZCBsb25nIG5taXNzZWQ7CiAKQEAgLTEwMyw4ICsxMDAsMTkgQEAKIAogCS8qIGNvcHkgb2YgdGhlIG9yaWdpbmFsIGluc3RydWN0aW9uICovCiAJc3RydWN0IGFyY2hfc3BlY2lmaWNfaW5zbiBhaW5zbjsKKworCS8qIEluZGljYXRlcyB2YXJpb3VzIHN0YXR1cyBmbGFncy4gIFByb3RlY3RlZCBieSBrcHJvYmVfbXV0ZXguICovCisJdTMyIGZsYWdzOwogfTsKIAorLyogS3Byb2JlIHN0YXR1cyBmbGFncyAqLworI2RlZmluZSBLUFJPQkVfRkxBR19HT05FCTEgLyogYnJlYWtwb2ludCBoYXMgYWxyZWFkeSBnb25lICovCisKK3N0YXRpYyBpbmxpbmUgaW50IGtwcm9iZV9nb25lKHN0cnVjdCBrcHJvYmUgKnApCit7CisJcmV0dXJuIHAtPmZsYWdzICYgS1BST0JFX0ZMQUdfR09ORTsKK30KKwogLyoKICAqIFNwZWNpYWwgcHJvYmUgdHlwZSB0aGF0IHVzZXMgc2V0am1wLWxvbmdqbXAgdHlwZSB0cmlja3MgdG8gcmVzdW1lCiAgKiBleGVjdXRpb24gYXQgYSBzcGVjaWZpZWQgZW50cnkgd2l0aCBhIG1hdGNoaW5nIHByb3RvdHlwZSBjb3JyZXNwb25kaW5nCkBAIC0yMDEsNyArMjA5LDYgQEAKIH0KICNlbmRpZiAvKiBDT05GSUdfS1BST0JFU19TQU5JVFlfVEVTVCAqLwogCi1leHRlcm4gc3RydWN0IG11dGV4IGtwcm9iZV9tdXRleDsKIGV4dGVybiBpbnQgYXJjaF9wcmVwYXJlX2twcm9iZShzdHJ1Y3Qga3Byb2JlICpwKTsKIGV4dGVybiB2b2lkIGFyY2hfYXJtX2twcm9iZShzdHJ1Y3Qga3Byb2JlICpwKTsKIGV4dGVybiB2b2lkIGFyY2hfZGlzYXJtX2twcm9iZShzdHJ1Y3Qga3Byb2JlICpwKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbGliYXRhLmggYi9pbmNsdWRlL2xpbnV4L2xpYmF0YS5oCmluZGV4IDM0NDlkZTUuLjRmN2M4ZmIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbGliYXRhLmgKKysrIGIvaW5jbHVkZS9saW51eC9saWJhdGEuaApAQCAtMTUxOCw2ICsxNTE4LDcgQEAKIAogZXh0ZXJuIGNvbnN0IHN0cnVjdCBhdGFfcG9ydF9vcGVyYXRpb25zIGF0YV9zZmZfcG9ydF9vcHM7CiBleHRlcm4gY29uc3Qgc3RydWN0IGF0YV9wb3J0X29wZXJhdGlvbnMgYXRhX2JtZG1hX3BvcnRfb3BzOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBhdGFfcG9ydF9vcGVyYXRpb25zIGF0YV9ibWRtYTMyX3BvcnRfb3BzOwogCiAvKiBQSU8gb25seSwgc2dfdGFibGVzaXplIGFuZCBkbWFfYm91bmRhcnkgbGltaXRzIGNhbiBiZSByZW1vdmVkICovCiAjZGVmaW5lIEFUQV9QSU9fU0hUKGRydl9uYW1lKQkJCQkJXApAQCAtMTU0NSw2ICsxNTQ2LDggQEAKIAkJCQkgY29uc3Qgc3RydWN0IGF0YV90YXNrZmlsZSAqdGYpOwogZXh0ZXJuIHVuc2lnbmVkIGludCBhdGFfc2ZmX2RhdGFfeGZlcihzdHJ1Y3QgYXRhX2RldmljZSAqZGV2LAogCQkJdW5zaWduZWQgY2hhciAqYnVmLCB1bnNpZ25lZCBpbnQgYnVmbGVuLCBpbnQgcncpOworZXh0ZXJuIHVuc2lnbmVkIGludCBhdGFfc2ZmX2RhdGFfeGZlcjMyKHN0cnVjdCBhdGFfZGV2aWNlICpkZXYsCisJCQl1bnNpZ25lZCBjaGFyICpidWYsIHVuc2lnbmVkIGludCBidWZsZW4sIGludCBydyk7CiBleHRlcm4gdW5zaWduZWQgaW50IGF0YV9zZmZfZGF0YV94ZmVyX25vaXJxKHN0cnVjdCBhdGFfZGV2aWNlICpkZXYsCiAJCQl1bnNpZ25lZCBjaGFyICpidWYsIHVuc2lnbmVkIGludCBidWZsZW4sIGludCBydyk7CiBleHRlcm4gdTggYXRhX3NmZl9pcnFfb24oc3RydWN0IGF0YV9wb3J0ICphcCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2xpYnBzMi5oIGIvaW5jbHVkZS9saW51eC9saWJwczIuaAppbmRleCBhZmM0MTMzLi5iOTQ1MzRiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2xpYnBzMi5oCisrKyBiL2luY2x1ZGUvbGludXgvbGlicHMyLmgKQEAgLTE4LDExICsxOCwxMyBAQAogI2RlZmluZSBQUzJfUkVUX0lECQkweDAwCiAjZGVmaW5lIFBTMl9SRVRfQUNLCQkweGZhCiAjZGVmaW5lIFBTMl9SRVRfTkFLCQkweGZlCisjZGVmaW5lIFBTMl9SRVRfRVJSCQkweGZjCiAKICNkZWZpbmUgUFMyX0ZMQUdfQUNLCQkxCS8qIFdhaXRpbmcgZm9yIEFDSy9OQUsgKi8KICNkZWZpbmUgUFMyX0ZMQUdfQ01ECQkyCS8qIFdhaXRpbmcgZm9yIGNvbW1hbmQgdG8gZmluaXNoICovCiAjZGVmaW5lIFBTMl9GTEFHX0NNRDEJCTQJLyogV2FpdGluZyBmb3IgdGhlIGZpcnN0IGJ5dGUgb2YgY29tbWFuZCByZXNwb25zZSAqLwogI2RlZmluZSBQUzJfRkxBR19XQUlUSUQJCTgJLyogQ29tbWFuZCBleGVjaXRpbmcgaXMgR0VUIElEICovCisjZGVmaW5lIFBTMl9GTEFHX05BSwkJMTYJLyogTGFzdCB0cmFuc21pc3Npb24gd2FzIE5BS2VkICovCiAKIHN0cnVjdCBwczJkZXYgewogCXN0cnVjdCBzZXJpbyAqc2VyaW87CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2xvY2tkL2xvY2tkLmggYi9pbmNsdWRlL2xpbnV4L2xvY2tkL2xvY2tkLmgKaW5kZXggMjNkYTNmYS4uYWE2ZmU3MCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9sb2NrZC9sb2NrZC5oCisrKyBiL2luY2x1ZGUvbGludXgvbG9ja2QvbG9ja2QuaApAQCAtNDMsOCArNDMsOCBAQAogCXN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlCWhfYWRkcjsJCS8qIHBlZXIgYWRkcmVzcyAqLwogCXNpemVfdAkJCWhfYWRkcmxlbjsKIAlzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZQloX3NyY2FkZHI7CS8qIG91ciBhZGRyZXNzIChvcHRpb25hbCkgKi8KLQlzdHJ1Y3QgcnBjX2NsbnQJKgloX3JwY2NsbnQ7CS8qIFJQQyBjbGllbnQgdG8gdGFsayB0byBwZWVyICovCi0JY2hhciAqCQkJaF9uYW1lOwkJLyogcmVtb3RlIGhvc3RuYW1lICovCisJc3RydWN0IHJwY19jbG50CQkqaF9ycGNjbG50OwkvKiBSUEMgY2xpZW50IHRvIHRhbGsgdG8gcGVlciAqLworCWNoYXIJCQkqaF9uYW1lOwkJLyogcmVtb3RlIGhvc3RuYW1lICovCiAJdTMyCQkJaF92ZXJzaW9uOwkvKiBpbnRlcmZhY2UgdmVyc2lvbiAqLwogCXVuc2lnbmVkIHNob3J0CQloX3Byb3RvOwkvKiB0cmFuc3BvcnQgcHJvdG8gKi8KIAl1bnNpZ25lZCBzaG9ydAkJaF9yZWNsYWltaW5nIDogMSwKQEAgLTY0LDIxICs2NCwyOSBAQAogCXNwaW5sb2NrX3QJCWhfbG9jazsKIAlzdHJ1Y3QgbGlzdF9oZWFkCWhfZ3JhbnRlZDsJLyogTG9ja3MgaW4gR1JBTlRFRCBzdGF0ZSAqLwogCXN0cnVjdCBsaXN0X2hlYWQJaF9yZWNsYWltOwkvKiBMb2NrcyBpbiBSRUNMQUlNIHN0YXRlICovCi0Jc3RydWN0IG5zbV9oYW5kbGUgKgloX25zbWhhbmRsZTsJLyogTlNNIHN0YXR1cyBoYW5kbGUgKi8KLQotCWNoYXIJCQloX2FkZHJidWZbNDhdLAkvKiBhZGRyZXNzIGV5ZWNhdGNoZXJzICovCi0JCQkJaF9zcmNhZGRyYnVmWzQ4XTsKKwlzdHJ1Y3QgbnNtX2hhbmRsZQkqaF9uc21oYW5kbGU7CS8qIE5TTSBzdGF0dXMgaGFuZGxlICovCisJY2hhcgkJCSpoX2FkZHJidWY7CS8qIGFkZHJlc3MgZXllY2F0Y2hlciAqLwogfTsKIAorLyoKKyAqIFRoZSBsYXJnZXN0IHN0cmluZyBzbV9hZGRyYnVmIHNob3VsZCBob2xkIGlzIGEgZnVsbC1zaXplIElQdjYgYWRkcmVzcworICogKG5vICI6OiIgYW55d2hlcmUpIHdpdGggYSBzY29wZSBJRC4gIFRoZSBidWZmZXIgc2l6ZSBpcyBjb21wdXRlZCB0bworICogaG9sZCBlaWdodCBncm91cHMgb2YgY29sb24tc2VwYXJhdGVkIGZvdXItaGV4LWRpZ2l0IG51bWJlcnMsIGEKKyAqIHBlcmNlbnQgc2lnbiwgYSBzY29wZSBpZCAoYXQgbW9zdCAzMiBiaXRzLCBpbiBkZWNpbWFsKSwgYW5kIE5VTC4KKyAqLworI2RlZmluZSBOU01fQUREUkJVRgkJKCg4ICogNCArIDcpICsgKDEgKyAxMCkgKyAxKQorCiBzdHJ1Y3QgbnNtX2hhbmRsZSB7CiAJc3RydWN0IGxpc3RfaGVhZAlzbV9saW5rOwogCWF0b21pY190CQlzbV9jb3VudDsKLQljaGFyICoJCQlzbV9uYW1lOworCWNoYXIJCQkqc21fbW9uX25hbWU7CisJY2hhcgkJCSpzbV9uYW1lOwogCXN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlCXNtX2FkZHI7CiAJc2l6ZV90CQkJc21fYWRkcmxlbjsKIAl1bnNpZ25lZCBpbnQJCXNtX21vbml0b3JlZCA6IDEsCiAJCQkJc21fc3RpY2t5IDogMTsJLyogZG9uJ3QgdW5tb25pdG9yICovCi0JY2hhcgkJCXNtX2FkZHJidWZbNDhdOwkvKiBhZGRyZXNzIGV5ZWNhdGNoZXIgKi8KKwlzdHJ1Y3QgbnNtX3ByaXZhdGUJc21fcHJpdjsKKwljaGFyCQkJc21fYWRkcmJ1ZltOU01fQUREUkJVRl07CiB9OwogCiAvKgpAQCAtMTA0LDE2ICsxMTIsNiBAQAogCXJldHVybiAoc3RydWN0IHNvY2thZGRyICopJmhvc3QtPmhfc3JjYWRkcjsKIH0KIAotc3RhdGljIGlubGluZSBzdHJ1Y3Qgc29ja2FkZHJfaW4gKm5zbV9hZGRyX2luKGNvbnN0IHN0cnVjdCBuc21faGFuZGxlICpoYW5kbGUpCi17Ci0JcmV0dXJuIChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikmaGFuZGxlLT5zbV9hZGRyOwotfQotCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBzb2NrYWRkciAqbnNtX2FkZHIoY29uc3Qgc3RydWN0IG5zbV9oYW5kbGUgKmhhbmRsZSkKLXsKLQlyZXR1cm4gKHN0cnVjdCBzb2NrYWRkciAqKSZoYW5kbGUtPnNtX2FkZHI7Ci19Ci0KIC8qCiAgKiBNYXAgYW4gZmxfb3duZXJfdCBpbnRvIGEgdW5pcXVlIDMyLWJpdCAicGlkIgogICovCkBAIC0xOTcsNiArMTk1LDcgQEAKIGV4dGVybiBpbnQJCQlubG1zdmNfZ3JhY2VfcGVyaW9kOwogZXh0ZXJuIHVuc2lnbmVkIGxvbmcJCW5sbXN2Y190aW1lb3V0OwogZXh0ZXJuIGludAkJCW5zbV91c2VfaG9zdG5hbWVzOworZXh0ZXJuIGludAkJCW5zbV9sb2NhbF9zdGF0ZTsKIAogLyoKICAqIExvY2tkIGNsaWVudCBmdW5jdGlvbnMKQEAgLTIzMSwxMCArMjMwLDIwIEBACiBzdHJ1Y3QgbmxtX2hvc3QgKiBubG1fZ2V0X2hvc3Qoc3RydWN0IG5sbV9ob3N0ICopOwogdm9pZAkJICBubG1fcmVsZWFzZV9ob3N0KHN0cnVjdCBubG1faG9zdCAqKTsKIHZvaWQJCSAgbmxtX3NodXRkb3duX2hvc3RzKHZvaWQpOwotZXh0ZXJuIHZvaWQJICBubG1faG9zdF9yZWJvb3RlZChjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW4gKiwgY29uc3QgY2hhciAqLAotCQkJCQl1bnNpZ25lZCBpbnQsIHUzMik7Ci12b2lkCQkgIG5zbV9yZWxlYXNlKHN0cnVjdCBuc21faGFuZGxlICopOwordm9pZAkJICBubG1faG9zdF9yZWJvb3RlZChjb25zdCBzdHJ1Y3QgbmxtX3JlYm9vdCAqKTsKIAorLyoKKyAqIEhvc3QgbW9uaXRvcmluZworICovCitpbnQJCSAgbnNtX21vbml0b3IoY29uc3Qgc3RydWN0IG5sbV9ob3N0ICpob3N0KTsKK3ZvaWQJCSAgbnNtX3VubW9uaXRvcihjb25zdCBzdHJ1Y3QgbmxtX2hvc3QgKmhvc3QpOworCitzdHJ1Y3QgbnNtX2hhbmRsZSAqbnNtX2dldF9oYW5kbGUoY29uc3Qgc3RydWN0IHNvY2thZGRyICpzYXAsCisJCQkJCWNvbnN0IHNpemVfdCBzYWxlbiwKKwkJCQkJY29uc3QgY2hhciAqaG9zdG5hbWUsCisJCQkJCWNvbnN0IHNpemVfdCBob3N0bmFtZV9sZW4pOworc3RydWN0IG5zbV9oYW5kbGUgKm5zbV9yZWJvb3RfbG9va3VwKGNvbnN0IHN0cnVjdCBubG1fcmVib290ICppbmZvKTsKK3ZvaWQJCSAgbnNtX3JlbGVhc2Uoc3RydWN0IG5zbV9oYW5kbGUgKm5zbSk7CiAKIC8qCiAgKiBUaGlzIGlzIHVzZWQgaW4gZ2FyYmFnZSBjb2xsZWN0aW9uIGFuZCByZXNvdXJjZSByZWNsYWltCkBAIC0yODIsMTYgKzI5MSwyNSBAQAogc3RhdGljIGlubGluZSBpbnQgX19ubG1fcHJpdmlsZWdlZF9yZXF1ZXN0NChjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKnNhcCkKIHsKIAljb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNpbiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKilzYXA7Ci0JcmV0dXJuIChzaW4tPnNpbl9hZGRyLnNfYWRkciA9PSBodG9ubChJTkFERFJfTE9PUEJBQ0spKSAmJgotCQkJKG50b2hzKHNpbi0+c2luX3BvcnQpIDwgMTAyNCk7CisKKwlpZiAobnRvaHMoc2luLT5zaW5fcG9ydCkgPiAxMDIzKQorCQlyZXR1cm4gMDsKKworCXJldHVybiBpcHY0X2lzX2xvb3BiYWNrKHNpbi0+c2luX2FkZHIuc19hZGRyKTsKIH0KIAogI2lmIGRlZmluZWQoQ09ORklHX0lQVjYpIHx8IGRlZmluZWQoQ09ORklHX0lQVjZfTU9EVUxFKQogc3RhdGljIGlubGluZSBpbnQgX19ubG1fcHJpdmlsZWdlZF9yZXF1ZXN0Nihjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKnNhcCkKIHsKIAljb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW42ICpzaW42ID0gKHN0cnVjdCBzb2NrYWRkcl9pbjYgKilzYXA7Ci0JcmV0dXJuIChpcHY2X2FkZHJfdHlwZSgmc2luNi0+c2luNl9hZGRyKSAmIElQVjZfQUREUl9MT09QQkFDSykgJiYKLQkJCShudG9ocyhzaW42LT5zaW42X3BvcnQpIDwgMTAyNCk7CisKKwlpZiAobnRvaHMoc2luNi0+c2luNl9wb3J0KSA+IDEwMjMpCisJCXJldHVybiAwOworCisJaWYgKGlwdjZfYWRkcl90eXBlKCZzaW42LT5zaW42X2FkZHIpICYgSVBWNl9BRERSX01BUFBFRCkKKwkJcmV0dXJuIGlwdjRfaXNfbG9vcGJhY2soc2luNi0+c2luNl9hZGRyLnM2X2FkZHIzMlszXSk7CisKKwlyZXR1cm4gaXB2Nl9hZGRyX3R5cGUoJnNpbjYtPnNpbjZfYWRkcikgJiBJUFY2X0FERFJfTE9PUEJBQ0s7CiB9CiAjZWxzZQkvKiBkZWZpbmVkKENPTkZJR19JUFY2KSB8fCBkZWZpbmVkKENPTkZJR19JUFY2X01PRFVMRSkgKi8KIHN0YXRpYyBpbmxpbmUgaW50IF9fbmxtX3ByaXZpbGVnZWRfcmVxdWVzdDYoY29uc3Qgc3RydWN0IHNvY2thZGRyICpzYXApCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2xvY2tkL3NtX2ludGVyLmggYi9pbmNsdWRlL2xpbnV4L2xvY2tkL3NtX2ludGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhNTQ0OGIuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9saW51eC9sb2NrZC9zbV9pbnRlci5oCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoKLSAqIGxpbnV4L2luY2x1ZGUvbGludXgvbG9ja2Qvc21faW50ZXIuaAotICoKLSAqIERlY2xhcmF0aW9ucyBmb3IgdGhlIGtlcm5lbCBzdGF0ZCBjbGllbnQuCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTk2LCBPbGFmIEtpcmNoIDxva2lyQG1vbmFkLnN3Yi5kZT4KLSAqLwotCi0jaWZuZGVmIExJTlVYX0xPQ0tEX1NNX0lOVEVSX0gKLSNkZWZpbmUgTElOVVhfTE9DS0RfU01fSU5URVJfSAotCi0jZGVmaW5lIFNNX1BST0dSQU0JMTAwMDI0Ci0jZGVmaW5lIFNNX1ZFUlNJT04JMQotI2RlZmluZSBTTV9TVEFUCQkxCi0jZGVmaW5lIFNNX01PTgkJMgotI2RlZmluZSBTTV9VTk1PTgkzCi0jZGVmaW5lIFNNX1VOTU9OX0FMTAk0Ci0jZGVmaW5lIFNNX1NJTVVfQ1JBU0gJNQotI2RlZmluZSBTTV9OT1RJRlkJNgotCi0jZGVmaW5lIFNNX01BWFNUUkxFTgkxMDI0Ci0jZGVmaW5lIFNNX1BSSVZfU0laRQkxNgotCi0vKgotICogQXJndW1lbnRzIGZvciBhbGwgY2FsbHMgdG8gc3RhdGQKLSAqLwotc3RydWN0IG5zbV9hcmdzIHsKLQlfX2JlMzIJCWFkZHI7CQkvKiByZW1vdGUgYWRkcmVzcyAqLwotCXUzMgkJcHJvZzsJCS8qIFJQQyBjYWxsYmFjayBpbmZvICovCi0JdTMyCQl2ZXJzOwotCXUzMgkJcHJvYzsKLQotCWNoYXIgKgkJbW9uX25hbWU7Ci19OwotCi0vKgotICogUmVzdWx0IHJldHVybmVkIGJ5IHN0YXRkCi0gKi8KLXN0cnVjdCBuc21fcmVzIHsKLQl1MzIJCXN0YXR1czsKLQl1MzIJCXN0YXRlOwotfTsKLQotaW50CQluc21fbW9uaXRvcihzdHJ1Y3QgbmxtX2hvc3QgKik7Ci1pbnQJCW5zbV91bm1vbml0b3Ioc3RydWN0IG5sbV9ob3N0ICopOwotZXh0ZXJuIGludAluc21fbG9jYWxfc3RhdGU7Ci0KLSNlbmRpZiAvKiBMSU5VWF9MT0NLRF9TTV9JTlRFUl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2xvY2tkL3hkci5oIGIvaW5jbHVkZS9saW51eC9sb2NrZC94ZHIuaAppbmRleCBkNmIzYTgwLi43ZGM1YjZjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2xvY2tkL3hkci5oCisrKyBiL2luY2x1ZGUvbGludXgvbG9ja2QveGRyLmgKQEAgLTEzLDYgKzEzLDEzIEBACiAjaW5jbHVkZSA8bGludXgvbmZzLmg+CiAjaW5jbHVkZSA8bGludXgvc3VucnBjL3hkci5oPgogCisjZGVmaW5lIFNNX01BWFNUUkxFTgkJMTAyNAorI2RlZmluZSBTTV9QUklWX1NJWkUJCTE2CisKK3N0cnVjdCBuc21fcHJpdmF0ZSB7CisJdW5zaWduZWQgY2hhcgkJZGF0YVtTTV9QUklWX1NJWkVdOworfTsKKwogc3RydWN0IHN2Y19ycXN0OwogCiAjZGVmaW5lIE5MTV9NQVhDT09LSUVMRU4gICAgCTMyCkBAIC03NywxMCArODQsMTAgQEAKICAqIHN0YXRkIGNhbGxiYWNrIHdoZW4gY2xpZW50IGhhcyByZWJvb3RlZAogICovCiBzdHJ1Y3QgbmxtX3JlYm9vdCB7Ci0JY2hhciAqCQltb247Ci0JdW5zaWduZWQgaW50CWxlbjsKLQl1MzIJCXN0YXRlOwotCV9fYmUzMgkJYWRkcjsKKwljaGFyCQkJKm1vbjsKKwl1bnNpZ25lZCBpbnQJCWxlbjsKKwl1MzIJCQlzdGF0ZTsKKwlzdHJ1Y3QgbnNtX3ByaXZhdGUJcHJpdjsKIH07CiAKIC8qCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21hZ2ljLmggYi9pbmNsdWRlL2xpbnV4L21hZ2ljLmgKaW5kZXggZjdmM2ZkZC4uNDM5ZjZmMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tYWdpYy5oCisrKyBiL2luY2x1ZGUvbGludXgvbWFnaWMuaApAQCAtMTMsNiArMTMsNyBAQAogI2RlZmluZSBFRlNfU1VQRVJfTUFHSUMJCTB4NDE0QTUzCiAjZGVmaW5lIEVYVDJfU1VQRVJfTUFHSUMJMHhFRjUzCiAjZGVmaW5lIEVYVDNfU1VQRVJfTUFHSUMJMHhFRjUzCisjZGVmaW5lIFhFTkZTX1NVUEVSX01BR0lDCTB4YWJiYTE5NzQKICNkZWZpbmUgRVhUNF9TVVBFUl9NQUdJQwkweEVGNTMKICNkZWZpbmUgSFBGU19TVVBFUl9NQUdJQwkweGY5OTVlODQ5CiAjZGVmaW5lIElTT0ZTX1NVUEVSX01BR0lDCTB4OTY2MApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tYXBfdG9fN3NlZ21lbnQuaCBiL2luY2x1ZGUvbGludXgvbWFwX3RvXzdzZWdtZW50LmgKaW5kZXggN2RmODQzMi4uMTJkNjJhNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tYXBfdG9fN3NlZ21lbnQuaAorKysgYi9pbmNsdWRlL2xpbnV4L21hcF90b183c2VnbWVudC5oCkBAIC03NSw3ICs3NSw3IEBACiAJdW5zaWduZWQgY2hhcgl0YWJsZVsxMjhdOwogfTsKIAotc3RhdGljIGlubGluZSBpbnQgbWFwX3RvX3NlZzcoc3RydWN0IHNlZzdfY29udmVyc2lvbl9tYXAgKm1hcCwgaW50IGMpCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgbWFwX3RvX3NlZzcoc3RydWN0IHNlZzdfY29udmVyc2lvbl9tYXAgKm1hcCwgaW50IGMpCiB7CiAJcmV0dXJuIGMgPj0gMCAmJiBjIDwgc2l6ZW9mKG1hcC0+dGFibGUpID8gbWFwLT50YWJsZVtjXSA6IC1FSU5WQUw7CiB9CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21lbWNvbnRyb2wuaCBiL2luY2x1ZGUvbGludXgvbWVtY29udHJvbC5oCmluZGV4IDFmYmUxNGQuLjMyNmY0NWMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbWVtY29udHJvbC5oCisrKyBiL2luY2x1ZGUvbGludXgvbWVtY29udHJvbC5oCkBAIC0xOSwyMiArMTksNDUgQEAKIAogI2lmbmRlZiBfTElOVVhfTUVNQ09OVFJPTF9ICiAjZGVmaW5lIF9MSU5VWF9NRU1DT05UUk9MX0gKLQorI2luY2x1ZGUgPGxpbnV4L2Nncm91cC5oPgogc3RydWN0IG1lbV9jZ3JvdXA7CiBzdHJ1Y3QgcGFnZV9jZ3JvdXA7CiBzdHJ1Y3QgcGFnZTsKIHN0cnVjdCBtbV9zdHJ1Y3Q7CiAKICNpZmRlZiBDT05GSUdfQ0dST1VQX01FTV9SRVNfQ1RMUgorLyoKKyAqIEFsbCAiY2hhcmdlIiBmdW5jdGlvbnMgd2l0aCBnZnBfbWFzayBzaG91bGQgdXNlIEdGUF9LRVJORUwgb3IKKyAqIChnZnBfbWFzayAmIEdGUF9SRUNMQUlNX01BU0spLiBJbiBjdXJyZW50IGltcGxlbWVudGF0aW4sIG1lbWNnIGRvZXNuJ3QKKyAqIGFsbG9jIG1lbW9yeSBidXQgcmVjbGFpbXMgbWVtb3J5IGZyb20gYWxsIGF2YWlsYWJsZSB6b25lcy4gU28sICJ3aGVyZSBJIHdhbnQKKyAqIG1lbW9yeSBmcm9tIiBiaXRzIG9mIGdmcF9tYXNrIGhhcyBubyBtZWFuaW5nLiBTbyBhbnkgYml0cyBvZiB0aGF0IGZpZWxkIGlzCisgKiBhdmFpbGFibGUgYnV0IGFkZGluZyBhIHJ1bGUgaXMgYmV0dGVyLiBjaGFyZ2UgZnVuY3Rpb25zJyBnZnBfbWFzayBzaG91bGQKKyAqIGJlIHNldCB0byBHRlBfS0VSTkVMIG9yIGdmcF9tYXNrICYgR0ZQX1JFQ0xBSU1fTUFTSyBmb3IgYXZvaWRpbmcgYW1iaWd1b3VzCisgKiBjb2Rlcy4KKyAqIChPZiBjb3Vyc2UsIGlmIG1lbWNnIGRvZXMgbWVtb3J5IGFsbG9jYXRpb24gaW4gZnV0dXJlLCBHRlBfS0VSTkVMIGlzIHNhbmUuKQorICovCiAKLWV4dGVybiBpbnQgbWVtX2Nncm91cF9jaGFyZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsIHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAorZXh0ZXJuIGludCBtZW1fY2dyb3VwX25ld3BhZ2VfY2hhcmdlKHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3QgbW1fc3RydWN0ICptbSwKIAkJCQlnZnBfdCBnZnBfbWFzayk7CisvKiBmb3Igc3dhcCBoYW5kbGluZyAqLworZXh0ZXJuIGludCBtZW1fY2dyb3VwX3RyeV9jaGFyZ2Vfc3dhcGluKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAorCQlzdHJ1Y3QgcGFnZSAqcGFnZSwgZ2ZwX3QgbWFzaywgc3RydWN0IG1lbV9jZ3JvdXAgKipwdHIpOworZXh0ZXJuIHZvaWQgbWVtX2Nncm91cF9jb21taXRfY2hhcmdlX3N3YXBpbihzdHJ1Y3QgcGFnZSAqcGFnZSwKKwkJCQkJc3RydWN0IG1lbV9jZ3JvdXAgKnB0cik7CitleHRlcm4gdm9pZCBtZW1fY2dyb3VwX2NhbmNlbF9jaGFyZ2Vfc3dhcGluKHN0cnVjdCBtZW1fY2dyb3VwICpwdHIpOworCiBleHRlcm4gaW50IG1lbV9jZ3JvdXBfY2FjaGVfY2hhcmdlKHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3QgbW1fc3RydWN0ICptbSwKIAkJCQkJZ2ZwX3QgZ2ZwX21hc2spOwotZXh0ZXJuIHZvaWQgbWVtX2Nncm91cF9tb3ZlX2xpc3RzKHN0cnVjdCBwYWdlICpwYWdlLCBlbnVtIGxydV9saXN0IGxydSk7CitleHRlcm4gdm9pZCBtZW1fY2dyb3VwX2FkZF9scnVfbGlzdChzdHJ1Y3QgcGFnZSAqcGFnZSwgZW51bSBscnVfbGlzdCBscnUpOworZXh0ZXJuIHZvaWQgbWVtX2Nncm91cF9kZWxfbHJ1X2xpc3Qoc3RydWN0IHBhZ2UgKnBhZ2UsIGVudW0gbHJ1X2xpc3QgbHJ1KTsKK2V4dGVybiB2b2lkIG1lbV9jZ3JvdXBfcm90YXRlX2xydV9saXN0KHN0cnVjdCBwYWdlICpwYWdlLCBlbnVtIGxydV9saXN0IGxydSk7CitleHRlcm4gdm9pZCBtZW1fY2dyb3VwX2RlbF9scnUoc3RydWN0IHBhZ2UgKnBhZ2UpOworZXh0ZXJuIHZvaWQgbWVtX2Nncm91cF9tb3ZlX2xpc3RzKHN0cnVjdCBwYWdlICpwYWdlLAorCQkJCSAgZW51bSBscnVfbGlzdCBmcm9tLCBlbnVtIGxydV9saXN0IHRvKTsKIGV4dGVybiB2b2lkIG1lbV9jZ3JvdXBfdW5jaGFyZ2VfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSk7CiBleHRlcm4gdm9pZCBtZW1fY2dyb3VwX3VuY2hhcmdlX2NhY2hlX3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UpOwotZXh0ZXJuIGludCBtZW1fY2dyb3VwX3Nocmlua191c2FnZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgZ2ZwX3QgZ2ZwX21hc2spOworZXh0ZXJuIGludCBtZW1fY2dyb3VwX3Nocmlua191c2FnZShzdHJ1Y3QgcGFnZSAqcGFnZSwKKwkJCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBnZnBfdCBnZnBfbWFzayk7CiAKIGV4dGVybiB1bnNpZ25lZCBsb25nIG1lbV9jZ3JvdXBfaXNvbGF0ZV9wYWdlcyh1bnNpZ25lZCBsb25nIG5yX3RvX3NjYW4sCiAJCQkJCXN0cnVjdCBsaXN0X2hlYWQgKmRzdCwKQEAgLTQ3LDEyICs3MCwyMCBAQAogCiBleHRlcm4gc3RydWN0IG1lbV9jZ3JvdXAgKm1lbV9jZ3JvdXBfZnJvbV90YXNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCk7CiAKLSNkZWZpbmUgbW1fbWF0Y2hfY2dyb3VwKG1tLCBjZ3JvdXApCVwKLQkoKGNncm91cCkgPT0gbWVtX2Nncm91cF9mcm9tX3Rhc2soKG1tKS0+b3duZXIpKQorc3RhdGljIGlubGluZQoraW50IG1tX21hdGNoX2Nncm91cChjb25zdCBzdHJ1Y3QgbW1fc3RydWN0ICptbSwgY29uc3Qgc3RydWN0IG1lbV9jZ3JvdXAgKmNncm91cCkKK3sKKwlzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtOworCXJjdV9yZWFkX2xvY2soKTsKKwltZW0gPSBtZW1fY2dyb3VwX2Zyb21fdGFzaygobW0pLT5vd25lcik7CisJcmN1X3JlYWRfdW5sb2NrKCk7CisJcmV0dXJuIGNncm91cCA9PSBtZW07Cit9CiAKIGV4dGVybiBpbnQKLW1lbV9jZ3JvdXBfcHJlcGFyZV9taWdyYXRpb24oc3RydWN0IHBhZ2UgKnBhZ2UsIHN0cnVjdCBwYWdlICpuZXdwYWdlKTsKLWV4dGVybiB2b2lkIG1lbV9jZ3JvdXBfZW5kX21pZ3JhdGlvbihzdHJ1Y3QgcGFnZSAqcGFnZSk7CittZW1fY2dyb3VwX3ByZXBhcmVfbWlncmF0aW9uKHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3QgbWVtX2Nncm91cCAqKnB0cik7CitleHRlcm4gdm9pZCBtZW1fY2dyb3VwX2VuZF9taWdyYXRpb24oc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSwKKwlzdHJ1Y3QgcGFnZSAqb2xkcGFnZSwgc3RydWN0IHBhZ2UgKm5ld3BhZ2UpOwogCiAvKgogICogRm9yIG1lbW9yeSByZWNsYWltLgpAQCAtNjUsMTMgKzk2LDMyIEBACiAJCQkJCQkJaW50IHByaW9yaXR5KTsKIGV4dGVybiB2b2lkIG1lbV9jZ3JvdXBfcmVjb3JkX3JlY2xhaW1fcHJpb3JpdHkoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSwKIAkJCQkJCQlpbnQgcHJpb3JpdHkpOworaW50IG1lbV9jZ3JvdXBfaW5hY3RpdmVfYW5vbl9pc19sb3coc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnKTsKK3Vuc2lnbmVkIGxvbmcgbWVtX2Nncm91cF96b25lX25yX3BhZ2VzKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywKKwkJCQkgICAgICAgc3RydWN0IHpvbmUgKnpvbmUsCisJCQkJICAgICAgIGVudW0gbHJ1X2xpc3QgbHJ1KTsKK3N0cnVjdCB6b25lX3JlY2xhaW1fc3RhdCAqbWVtX2Nncm91cF9nZXRfcmVjbGFpbV9zdGF0KHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywKKwkJCQkJCSAgICAgIHN0cnVjdCB6b25lICp6b25lKTsKK3N0cnVjdCB6b25lX3JlY2xhaW1fc3RhdCoKK21lbV9jZ3JvdXBfZ2V0X3JlY2xhaW1fc3RhdF9mcm9tX3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UpOwogCi1leHRlcm4gbG9uZyBtZW1fY2dyb3VwX2NhbGNfcmVjbGFpbShzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtLCBzdHJ1Y3Qgem9uZSAqem9uZSwKLQkJCQkJaW50IHByaW9yaXR5LCBlbnVtIGxydV9saXN0IGxydSk7CisjaWZkZWYgQ09ORklHX0NHUk9VUF9NRU1fUkVTX0NUTFJfU1dBUAorZXh0ZXJuIGludCBkb19zd2FwX2FjY291bnQ7CisjZW5kaWYKIAorc3RhdGljIGlubGluZSBib29sIG1lbV9jZ3JvdXBfZGlzYWJsZWQodm9pZCkKK3sKKwlpZiAobWVtX2Nncm91cF9zdWJzeXMuZGlzYWJsZWQpCisJCXJldHVybiB0cnVlOworCXJldHVybiBmYWxzZTsKK30KKworZXh0ZXJuIGJvb2wgbWVtX2Nncm91cF9vb21fY2FsbGVkKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzayk7CiAKICNlbHNlIC8qIENPTkZJR19DR1JPVVBfTUVNX1JFU19DVExSICovCi1zdGF0aWMgaW5saW5lIGludCBtZW1fY2dyb3VwX2NoYXJnZShzdHJ1Y3QgcGFnZSAqcGFnZSwKK3N0cnVjdCBtZW1fY2dyb3VwOworCitzdGF0aWMgaW5saW5lIGludCBtZW1fY2dyb3VwX25ld3BhZ2VfY2hhcmdlKHN0cnVjdCBwYWdlICpwYWdlLAogCQkJCQlzdHJ1Y3QgbW1fc3RydWN0ICptbSwgZ2ZwX3QgZ2ZwX21hc2spCiB7CiAJcmV0dXJuIDA7CkBAIC04Myw2ICsxMzMsMjEgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGlubGluZSBpbnQgbWVtX2Nncm91cF90cnlfY2hhcmdlX3N3YXBpbihzdHJ1Y3QgbW1fc3RydWN0ICptbSwKKwkJc3RydWN0IHBhZ2UgKnBhZ2UsIGdmcF90IGdmcF9tYXNrLCBzdHJ1Y3QgbWVtX2Nncm91cCAqKnB0cikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG1lbV9jZ3JvdXBfY29tbWl0X2NoYXJnZV9zd2FwaW4oc3RydWN0IHBhZ2UgKnBhZ2UsCisJCQkJCSAgc3RydWN0IG1lbV9jZ3JvdXAgKnB0cikKK3sKK30KKworc3RhdGljIGlubGluZSB2b2lkIG1lbV9jZ3JvdXBfY2FuY2VsX2NoYXJnZV9zd2FwaW4oc3RydWN0IG1lbV9jZ3JvdXAgKnB0cikKK3sKK30KKwogc3RhdGljIGlubGluZSB2b2lkIG1lbV9jZ3JvdXBfdW5jaGFyZ2VfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSkKIHsKIH0KQEAgLTkxLDEyICsxNTYsMzMgQEAKIHsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgbWVtX2Nncm91cF9zaHJpbmtfdXNhZ2Uoc3RydWN0IG1tX3N0cnVjdCAqbW0sIGdmcF90IGdmcF9tYXNrKQorc3RhdGljIGlubGluZSBpbnQgbWVtX2Nncm91cF9zaHJpbmtfdXNhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsCisJCQlzdHJ1Y3QgbW1fc3RydWN0ICptbSwgZ2ZwX3QgZ2ZwX21hc2spCiB7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBtZW1fY2dyb3VwX21vdmVfbGlzdHMoc3RydWN0IHBhZ2UgKnBhZ2UsIGJvb2wgYWN0aXZlKQorc3RhdGljIGlubGluZSB2b2lkIG1lbV9jZ3JvdXBfYWRkX2xydV9saXN0KHN0cnVjdCBwYWdlICpwYWdlLCBpbnQgbHJ1KQoreworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbWVtX2Nncm91cF9kZWxfbHJ1X2xpc3Qoc3RydWN0IHBhZ2UgKnBhZ2UsIGludCBscnUpCit7CisJcmV0dXJuIDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG1lbV9jZ3JvdXBfcm90YXRlX2xydV9saXN0KHN0cnVjdCBwYWdlICpwYWdlLCBpbnQgbHJ1KQoreworCXJldHVybiA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtZW1fY2dyb3VwX2RlbF9scnUoc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJcmV0dXJuIDsKK30KKworc3RhdGljIGlubGluZSB2b2lkCittZW1fY2dyb3VwX21vdmVfbGlzdHMoc3RydWN0IHBhZ2UgKnBhZ2UsIGVudW0gbHJ1X2xpc3QgZnJvbSwgZW51bSBscnVfbGlzdCB0bykKIHsKIH0KIApAQCAtMTEyLDEyICsxOTgsMTQgQEAKIH0KIAogc3RhdGljIGlubGluZSBpbnQKLW1lbV9jZ3JvdXBfcHJlcGFyZV9taWdyYXRpb24oc3RydWN0IHBhZ2UgKnBhZ2UsIHN0cnVjdCBwYWdlICpuZXdwYWdlKQorbWVtX2Nncm91cF9wcmVwYXJlX21pZ3JhdGlvbihzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IG1lbV9jZ3JvdXAgKipwdHIpCiB7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBtZW1fY2dyb3VwX2VuZF9taWdyYXRpb24oc3RydWN0IHBhZ2UgKnBhZ2UpCitzdGF0aWMgaW5saW5lIHZvaWQgbWVtX2Nncm91cF9lbmRfbWlncmF0aW9uKHN0cnVjdCBtZW1fY2dyb3VwICptZW0sCisJCQkJCXN0cnVjdCBwYWdlICpvbGRwYWdlLAorCQkJCQlzdHJ1Y3QgcGFnZSAqbmV3cGFnZSkKIHsKIH0KIApAQCAtMTQ2LDEyICsyMzQsNDIgQEAKIHsKIH0KIAotc3RhdGljIGlubGluZSBsb25nIG1lbV9jZ3JvdXBfY2FsY19yZWNsYWltKHN0cnVjdCBtZW1fY2dyb3VwICptZW0sCi0JCQkJCXN0cnVjdCB6b25lICp6b25lLCBpbnQgcHJpb3JpdHksCi0JCQkJCWVudW0gbHJ1X2xpc3QgbHJ1KQorc3RhdGljIGlubGluZSBib29sIG1lbV9jZ3JvdXBfZGlzYWJsZWQodm9pZCkKK3sKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGlubGluZSBib29sIG1lbV9jZ3JvdXBfb29tX2NhbGxlZChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCit7CisJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgaW5saW5lIGludAorbWVtX2Nncm91cF9pbmFjdGl2ZV9hbm9uX2lzX2xvdyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cpCit7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZworbWVtX2Nncm91cF96b25lX25yX3BhZ2VzKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywgc3RydWN0IHpvbmUgKnpvbmUsCisJCQkgZW51bSBscnVfbGlzdCBscnUpCiB7CiAJcmV0dXJuIDA7CiB9CisKKworc3RhdGljIGlubGluZSBzdHJ1Y3Qgem9uZV9yZWNsYWltX3N0YXQqCittZW1fY2dyb3VwX2dldF9yZWNsYWltX3N0YXQoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLCBzdHJ1Y3Qgem9uZSAqem9uZSkKK3sKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3Qgem9uZV9yZWNsYWltX3N0YXQqCittZW1fY2dyb3VwX2dldF9yZWNsYWltX3N0YXRfZnJvbV9wYWdlKHN0cnVjdCBwYWdlICpwYWdlKQoreworCXJldHVybiBOVUxMOworfQorCiAjZW5kaWYgLyogQ09ORklHX0NHUk9VUF9NRU1fQ09OVCAqLwogCiAjZW5kaWYgLyogX0xJTlVYX01FTUNPTlRST0xfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tZW1vcnkuaCBiL2luY2x1ZGUvbGludXgvbWVtb3J5LmgKaW5kZXggMzZjODJjOS4uM2ZkYzEwOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tZW1vcnkuaAorKysgYi9pbmNsdWRlL2xpbnV4L21lbW9yeS5oCkBAIC03OSwxNCArNzksMTQgQEAKICNlbHNlCiBleHRlcm4gaW50IHJlZ2lzdGVyX21lbW9yeV9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iKTsKIGV4dGVybiB2b2lkIHVucmVnaXN0ZXJfbWVtb3J5X25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIpOwotZXh0ZXJuIGludCByZWdpc3Rlcl9uZXdfbWVtb3J5KHN0cnVjdCBtZW1fc2VjdGlvbiAqKTsKK2V4dGVybiBpbnQgcmVnaXN0ZXJfbmV3X21lbW9yeShpbnQsIHN0cnVjdCBtZW1fc2VjdGlvbiAqKTsKIGV4dGVybiBpbnQgdW5yZWdpc3Rlcl9tZW1vcnlfc2VjdGlvbihzdHJ1Y3QgbWVtX3NlY3Rpb24gKik7CiBleHRlcm4gaW50IG1lbW9yeV9kZXZfaW5pdCh2b2lkKTsKIGV4dGVybiBpbnQgcmVtb3ZlX21lbW9yeV9ibG9jayh1bnNpZ25lZCBsb25nLCBzdHJ1Y3QgbWVtX3NlY3Rpb24gKiwgaW50KTsKIGV4dGVybiBpbnQgbWVtb3J5X25vdGlmeSh1bnNpZ25lZCBsb25nIHZhbCwgdm9pZCAqdik7CitleHRlcm4gc3RydWN0IG1lbW9yeV9ibG9jayAqZmluZF9tZW1vcnlfYmxvY2soc3RydWN0IG1lbV9zZWN0aW9uICopOwogI2RlZmluZSBDT05GSUdfTUVNX0JMT0NLX1NJWkUJKFBBR0VTX1BFUl9TRUNUSU9OPDxQQUdFX1NISUZUKQotCi0KK2VudW0gbWVtX2FkZF9jb250ZXh0IHsgQk9PVCwgSE9UUExVRyB9OwogI2VuZGlmIC8qIENPTkZJR19NRU1PUllfSE9UUExVR19TUEFSU0UgKi8KIAogI2lmZGVmIENPTkZJR19NRU1PUllfSE9UUExVRwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tZW1vcnlfaG90cGx1Zy5oIGIvaW5jbHVkZS9saW51eC9tZW1vcnlfaG90cGx1Zy5oCmluZGV4IDc2M2JhODEuLmQ5NWY3MmUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbWVtb3J5X2hvdHBsdWcuaAorKysgYi9pbmNsdWRlL2xpbnV4L21lbW9yeV9ob3RwbHVnLmgKQEAgLTcyLDcgKzcyLDcgQEAKIGV4dGVybiBpbnQgb2ZmbGluZV9wYWdlcyh1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nKTsKIAogLyogcmVhc29uYWJseSBnZW5lcmljIGludGVyZmFjZSB0byBleHBhbmQgdGhlIHBoeXNpY2FsIHBhZ2VzIGluIGEgem9uZSAgKi8KLWV4dGVybiBpbnQgX19hZGRfcGFnZXMoc3RydWN0IHpvbmUgKnpvbmUsIHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLAorZXh0ZXJuIGludCBfX2FkZF9wYWdlcyhpbnQgbmlkLCBzdHJ1Y3Qgem9uZSAqem9uZSwgdW5zaWduZWQgbG9uZyBzdGFydF9wZm4sCiAJdW5zaWduZWQgbG9uZyBucl9wYWdlcyk7CiBleHRlcm4gaW50IF9fcmVtb3ZlX3BhZ2VzKHN0cnVjdCB6b25lICp6b25lLCB1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbiwKIAl1bnNpZ25lZCBsb25nIG5yX3BhZ2VzKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWZkL2RhOTAzeC5oIGIvaW5jbHVkZS9saW51eC9tZmQvZGE5MDN4LmgKaW5kZXggY2FkMzE0Yy4uMTE1ZGJlOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tZmQvZGE5MDN4LmgKKysrIGIvaW5jbHVkZS9saW51eC9tZmQvZGE5MDN4LmgKQEAgLTMyLDYgKzMyLDcgQEAKIAlEQTkwMzBfSURfTERPMTgsCiAJREE5MDMwX0lEX0xETzE5LAogCURBOTAzMF9JRF9MRE9fSU5ULAkvKiBMRE8gSW50ZXJuYWwgKi8KKwlEQTkwMzBfSURfQkFULAkJLyogYmF0dGVyeSBjaGFyZ2VyICovCiAKIAlEQTkwMzRfSURfTEVEXzEsCiAJREE5MDM0X0lEX0xFRF8yLApAQCAtOTMsNiArOTQsNDMgQEAKIAlpbnQJeV9pbnZlcnRlZDsKIH07CiAKKy8qIERBOTAzMCBiYXR0ZXJ5IGNoYXJnZXIgZGF0YSAqLworc3RydWN0IHBvd2VyX3N1cHBseV9pbmZvOworCitzdHJ1Y3QgZGE5MDMwX2JhdHRlcnlfaW5mbyB7CisJLyogYmF0dGVyeSBwYXJhbWV0ZXJzICovCisJc3RydWN0IHBvd2VyX3N1cHBseV9pbmZvICpiYXR0ZXJ5X2luZm87CisKKwkvKiBjdXJyZW50IGFuZCB2b2x0YWdlIHRvIHVzZSBmb3IgYmF0dGVyeSBjaGFyZ2luZyAqLworCXVuc2lnbmVkIGludCBjaGFyZ2VfbWlsbGlhbXA7CisJdW5zaWduZWQgaW50IGNoYXJnZV9taWxsaXZvbHQ7CisKKwkvKiB2b2x0YWdlIHRocmVzaG9sZHMgKGluIG1pbGxpdm9sdHMpICovCisJaW50IHZiYXRfbG93OworCWludCB2YmF0X2NyaXQ7CisJaW50IHZiYXRfY2hhcmdlX3N0YXJ0OworCWludCB2YmF0X2NoYXJnZV9zdG9wOworCWludCB2YmF0X2NoYXJnZV9yZXN0YXJ0OworCisJLyogYmF0dGVyeSBub21pbmFsIG1pbmltYWwgYW5kIG1heGltYWwgdm9sdGFnZXMgaW4gbWlsbGl2b2x0cyAqLworCWludCB2Y2hhcmdlX21pbjsKKwlpbnQgdmNoYXJnZV9tYXg7CisKKwkvKiBUZW1wZXJhdHVyZSB0aHJlc2hvbGRzLiBUaGVzZSBhcmUgREE5MDMwIHJlZ2lzdGVyIHZhbHVlcworCSAgICJhcyBpcyIgYW5kIHNob3VsZCBiZSBtZWFzdXJlZCBmb3IgZWFjaCBiYXR0ZXJ5IHR5cGUgKi8KKwlpbnQgdGJhdF9sb3c7CisJaW50IHRiYXRfaGlnaDsKKwlpbnQgdGJhdF9yZXN0YXJ0OworCisKKwkvKiBiYXR0ZXJ5IG1vbml0b3IgaW50ZXJ2YWwgKHNlY29uZHMpICovCisJdW5zaWduZWQgaW50IGJhdG1vbl9pbnRlcnZhbDsKKworCS8qIHBsYXRmb3JtIGNhbGxiYWNrcyBmb3IgYmF0dGVyeSBsb3cgYW5kIGNyaXRpY2FsIGV2ZW50cyAqLworCXZvaWQgKCpiYXR0ZXJ5X2xvdykodm9pZCk7CisJdm9pZCAoKmJhdHRlcnlfY3JpdGljYWwpKHZvaWQpOworfTsKKwogc3RydWN0IGRhOTAzeF9zdWJkZXZfaW5mbyB7CiAJaW50CQlpZDsKIAljb25zdCBjaGFyCSpuYW1lOwpAQCAtMTkwLDExICsyMjgsMTMgQEAKIGV4dGVybiBpbnQgZGE5MDN4X3F1ZXJ5X3N0YXR1cyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBzdGF0dXMpOwogCiAKLS8qIE5PVEU6IHRoZSB0d28gZnVuY3Rpb25zIGJlbG93IGFyZSBub3QgaW50ZW5kZWQgZm9yIHVzZSBvdXRzaWRlCi0gKiBvZiB0aGUgREE5MDM0IHN1Yi1kZXZpY2UgZHJpdmVycworLyogTk9URTogdGhlIGZ1bmN0aW9ucyBiZWxvdyBhcmUgbm90IGludGVuZGVkIGZvciB1c2Ugb3V0c2lkZQorICogb2YgdGhlIERBOTAzeCBzdWItZGV2aWNlIGRyaXZlcnMKICAqLwogZXh0ZXJuIGludCBkYTkwM3hfd3JpdGUoc3RydWN0IGRldmljZSAqZGV2LCBpbnQgcmVnLCB1aW50OF90IHZhbCk7CitleHRlcm4gaW50IGRhOTAzeF93cml0ZXMoc3RydWN0IGRldmljZSAqZGV2LCBpbnQgcmVnLCBpbnQgbGVuLCB1aW50OF90ICp2YWwpOwogZXh0ZXJuIGludCBkYTkwM3hfcmVhZChzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCByZWcsIHVpbnQ4X3QgKnZhbCk7CitleHRlcm4gaW50IGRhOTAzeF9yZWFkcyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCByZWcsIGludCBsZW4sIHVpbnQ4X3QgKnZhbCk7CiBleHRlcm4gaW50IGRhOTAzeF91cGRhdGUoc3RydWN0IGRldmljZSAqZGV2LCBpbnQgcmVnLCB1aW50OF90IHZhbCwgdWludDhfdCBtYXNrKTsKIGV4dGVybiBpbnQgZGE5MDN4X3NldF9iaXRzKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IHJlZywgdWludDhfdCBiaXRfbWFzayk7CiBleHRlcm4gaW50IGRhOTAzeF9jbHJfYml0cyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCByZWcsIHVpbnQ4X3QgYml0X21hc2spOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tZmQvd204MzUwL2NvbXBhcmF0b3IuaCBiL2luY2x1ZGUvbGludXgvbWZkL3dtODM1MC9jb21wYXJhdG9yLmgKaW5kZXggMDUzNzg4Ni4uNTRiYzVkMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tZmQvd204MzUwL2NvbXBhcmF0b3IuaAorKysgYi9pbmNsdWRlL2xpbnV4L21mZC93bTgzNTAvY29tcGFyYXRvci5oCkBAIC0xNjQsNCArMTY0LDEyIEBACiAjZGVmaW5lIFdNODM1MF9BVVhBRENfQkFUVAkJCTYKICNkZWZpbmUgV004MzUwX0FVWEFEQ19URU1QCQkJNwogCitzdHJ1Y3Qgd204MzUwOworCisvKgorICogQVVYIEFEQyBSZWFkYmFjaworICovCitpbnQgd204MzUwX3JlYWRfYXV4YWRjKHN0cnVjdCB3bTgzNTAgKndtODM1MCwgaW50IGNoYW5uZWwsIGludCBzY2FsZSwKKwkJICAgICAgIGludCB2cmVmKTsKKwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21mZC93bTgzNTAvY29yZS5oIGIvaW5jbHVkZS9saW51eC9tZmQvd204MzUwL2NvcmUuaAppbmRleCA2ZWJmOTdmLi45ODA2NjlkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21mZC93bTgzNTAvY29yZS5oCisrKyBiL2luY2x1ZGUvbGludXgvbWZkL3dtODM1MC9jb3JlLmgKQEAgLTI5LDYgKzI5LDcgQEAKICAqLwogI2RlZmluZSBXTTgzNTBfUkVTRVRfSUQgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMAogI2RlZmluZSBXTTgzNTBfSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBXTTgzNTBfUkVWSVNJT04JCQkJMHgwMgogI2RlZmluZSBXTTgzNTBfU1lTVEVNX0NPTlRST0xfMSAgICAgICAgICAgICAgICAgMHgwMwogI2RlZmluZSBXTTgzNTBfU1lTVEVNX0NPTlRST0xfMiAgICAgICAgICAgICAgICAgMHgwNAogI2RlZmluZSBXTTgzNTBfU1lTVEVNX0hJQkVSTkFURSAgICAgICAgICAgICAgICAgMHgwNQpAQCAtNTcsNiArNTgsMTAgQEAKICNkZWZpbmUgV004MzUwX09WRVJfQ1VSUkVOVF9JTlRfU1RBVFVTX01BU0sgICAgIDB4MjUKICNkZWZpbmUgV004MzUwX0dQSU9fSU5UX1NUQVRVU19NQVNLICAgICAgICAgICAgIDB4MjYKICNkZWZpbmUgV004MzUwX0NPTVBBUkFUT1JfSU5UX1NUQVRVU19NQVNLICAgICAgIDB4MjcKKyNkZWZpbmUgV004MzUwX0NIQVJHRVJfT1ZFUlJJREVTCQkweEUyCisjZGVmaW5lIFdNODM1MF9NSVNDX09WRVJSSURFUwkJCTB4RTMKKyNkZWZpbmUgV004MzUwX0NPTVBBUkFUT1JfT1ZFUlJJREVTCQkweEU3CisjZGVmaW5lIFdNODM1MF9TVEFURV9NQUNISU5FX1NUQVRVUwkJMHhFOQogCiAjZGVmaW5lIFdNODM1MF9NQVhfUkVHSVNURVIgICAgICAgICAgICAgICAgICAgICAweEZGCiAKQEAgLTc3LDYgKzgyLDExIEBACiAjZGVmaW5lIFdNODM1MF9DVVNUX0lEX01BU0sgICAgICAgICAgICAgICAgICAgICAweDAwRkYKIAogLyoKKyAqIFIyICgweDAyKSAtIFJldmlzaW9uCisgKi8KKyNkZWZpbmUgV004MzUwX01BU0tfUkVWX01BU0sJCQkweDAwRkYKKworLyoKICAqIFIzICgweDAzKSAtIFN5c3RlbSBDb250cm9sIDEKICAqLwogI2RlZmluZSBXTTgzNTBfQ0hJUF9PTiAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDAwCkBAIC01MjMsNiArNTMzLDM1IEBACiAjZGVmaW5lIFdNODM1MF9EQzJfU1RTICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDIKICNkZWZpbmUgV004MzUwX0RDMV9TVFMgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMQogCisvKgorICogUjIyNiAoMHhFMikgLSBDaGFyZ2VyIHN0YXR1cworICovCisjZGVmaW5lIFdNODM1MF9DSEdfQkFUVF9IT1RfT1ZSREUJCTB4ODAwMAorI2RlZmluZSBXTTgzNTBfQ0hHX0JBVFRfQ09MRF9PVlJERQkJMHg0MDAwCisKKy8qCisgKiBSMjI3ICgweEUzKSAtIE1pc2MgT3ZlcnJpZGVzCisgKi8KKyNkZWZpbmUgV004MzUwX1VTQl9MSU1JVF9PVlJERQkJCTB4MDQwMAorCisvKgorICogUjIyNyAoMHhFNykgLSBDb21wYXJhdG9yIE92ZXJyaWRlcworICovCisjZGVmaW5lIFdNODM1MF9VU0JfRkJfT1ZSREUJCQkweDgwMDAKKyNkZWZpbmUgV004MzUwX1dBTExfRkJfT1ZSREUJCQkweDQwMDAKKyNkZWZpbmUgV004MzUwX0JBVFRfRkJfT1ZSREUJCQkweDIwMDAKKworCisvKgorICogUjIzMyAoMHhFOSkgLSBTdGF0ZSBNYWNoaW5pbmUgU3RhdHVzCisgKi8KKyNkZWZpbmUgV004MzUwX1VTQl9TTV9NQVNLCQkJMHgwNzAwCisjZGVmaW5lIFdNODM1MF9VU0JfU01fU0hJRlQJCQk4CisKKyNkZWZpbmUgV004MzUwX1VTQl9TTV8xMDBfU0xWICAgMQorI2RlZmluZSBXTTgzNTBfVVNCX1NNXzUwMF9TTFYgICA1CisjZGVmaW5lIFdNODM1MF9VU0JfU01fU1REQllfU0xWIDcKKwogLyogV004MzUwIHdha2UgdXAgY29uZGl0aW9ucyAqLwogI2RlZmluZSBXTTgzNTBfSVJRX1dLVVBfT0ZGX1NUQVRFCQk0MwogI2RlZmluZSBXTTgzNTBfSVJRX1dLVVBfSElCX1NUQVRFCQk0NApAQCAtNTM2LDYgKzU3NSw3IEBACiAjZGVmaW5lIFdNODM1MF9SRVZfRQkJCQkweDQKICNkZWZpbmUgV004MzUwX1JFVl9GCQkJCTB4NQogI2RlZmluZSBXTTgzNTBfUkVWX0cJCQkJMHg2CisjZGVmaW5lIFdNODM1MF9SRVZfSAkJCQkweDcKIAogI2RlZmluZSBXTTgzNTBfTlVNX0lSUQkJCQk2MwogCkBAIC01NDksNiArNTg5LDE0IEBACiBleHRlcm4gY29uc3QgdTE2IHdtODM1MF9tb2RlMV9kZWZhdWx0c1tdOwogZXh0ZXJuIGNvbnN0IHUxNiB3bTgzNTBfbW9kZTJfZGVmYXVsdHNbXTsKIGV4dGVybiBjb25zdCB1MTYgd204MzUwX21vZGUzX2RlZmF1bHRzW107CitleHRlcm4gY29uc3QgdTE2IHdtODM1MV9tb2RlMF9kZWZhdWx0c1tdOworZXh0ZXJuIGNvbnN0IHUxNiB3bTgzNTFfbW9kZTFfZGVmYXVsdHNbXTsKK2V4dGVybiBjb25zdCB1MTYgd204MzUxX21vZGUyX2RlZmF1bHRzW107CitleHRlcm4gY29uc3QgdTE2IHdtODM1MV9tb2RlM19kZWZhdWx0c1tdOworZXh0ZXJuIGNvbnN0IHUxNiB3bTgzNTJfbW9kZTBfZGVmYXVsdHNbXTsKK2V4dGVybiBjb25zdCB1MTYgd204MzUyX21vZGUxX2RlZmF1bHRzW107CitleHRlcm4gY29uc3QgdTE2IHdtODM1Ml9tb2RlMl9kZWZhdWx0c1tdOworZXh0ZXJuIGNvbnN0IHUxNiB3bTgzNTJfbW9kZTNfZGVmYXVsdHNbXTsKIAogc3RydWN0IHdtODM1MDsKIApAQCAtNTU4LDggKzYwNiw2IEBACiB9OwogCiBzdHJ1Y3Qgd204MzUwIHsKLQlpbnQgcmV2OwkJLyogY2hpcCByZXZpc2lvbiAqLwotCiAJc3RydWN0IGRldmljZSAqZGV2OwogCiAJLyogZGV2aWNlIElPICovCkBAIC01NzIsNiArNjE4LDggQEAKIAkJCSB2b2lkICpzcmMpOwogCXUxNiAqcmVnX2NhY2hlOwogCisJc3RydWN0IG11dGV4IGF1eGFkY19tdXRleDsKKwogCS8qIEludGVycnVwdCBoYW5kbGluZyAqLwogCXN0cnVjdCB3b3JrX3N0cnVjdCBpcnFfd29yazsKIAlzdHJ1Y3QgbXV0ZXggaXJxX211dGV4OyAvKiBJUlEgdGFibGUgbXV0ZXggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWZkL3dtODM1MC9wbWljLmggYi9pbmNsdWRlL2xpbnV4L21mZC93bTgzNTAvcG1pYy5oCmluZGV4IDY5YjY5ZTAuLjk2YWNiZmMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbWZkL3dtODM1MC9wbWljLmgKKysrIGIvaW5jbHVkZS9saW51eC9tZmQvd204MzUwL3BtaWMuaApAQCAtNzAxLDYgKzcwMSwxMCBAQAogc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGE7CiAKIHN0cnVjdCB3bTgzNTBfcG1pYyB7CisJLyogTnVtYmVyIG9mIHJlZ3VsYXRvcnMgb2YgZWFjaCB0eXBlIG9uIHRoaXMgZGV2aWNlICovCisJaW50IG1heF9kY2RjOworCWludCBtYXhfaXNpbms7CisKIAkvKiBJU0lOSyB0byBEQ0RDIG1hcHBpbmcgKi8KIAlpbnQgaXNpbmtfQV9kY2RjOwogCWludCBpc2lua19CX2RjZGM7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21mZC93bTgzNTAvc3VwcGx5LmggYi9pbmNsdWRlL2xpbnV4L21mZC93bTgzNTAvc3VwcGx5LmgKaW5kZXggMWM4ZjNjZC4uMmI5NDc5MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tZmQvd204MzUwL3N1cHBseS5oCisrKyBiL2luY2x1ZGUvbGludXgvbWZkL3dtODM1MC9zdXBwbHkuaApAQCAtMTMsNyArMTMsOCBAQAogI2lmbmRlZiBfX0xJTlVYX01GRF9XTTgzNTBfU1VQUExZX0hfCiAjZGVmaW5lIF9fTElOVVhfTUZEX1dNODM1MF9TVVBQTFlfSF8KIAotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvcG93ZXJfc3VwcGx5Lmg+CiAKIC8qCiAgKiBDaGFyZ2VyIHJlZ2lzdGVycwpAQCAtMTA0LDggKzEwNSwzMCBAQAogI2RlZmluZSBXTTgzNTBfSVJRX0VYVF9XQUxMX0ZCCQkJMzcKICNkZWZpbmUgV004MzUwX0lSUV9FWFRfQkFUX0ZCCQkJMzgKIAorLyoKKyAqIFBvbGljeSB0byBjb250cm9sIGNoYXJnZXIgc3RhdGUgbWFjaGluZS4KKyAqLworc3RydWN0IHdtODM1MF9jaGFyZ2VyX3BvbGljeSB7CisKKwkvKiBjaGFyZ2VyIHN0YXRlIG1hY2hpbmUgcG9saWN5ICAtIHNldCBpbiBtYWNoaW5lIGRyaXZlciAqLworCWludCBlb2NfbUE7CQkvKiBlbmQgb2YgY2hhcmdlIGN1cnJlbnQgKG1BKSAgKi8KKwlpbnQgY2hhcmdlX21WOwkJLyogY2hhcmdlIHZvbHRhZ2UgKi8KKwlpbnQgZmFzdF9saW1pdF9tQTsJLyogZmFzdCBjaGFyZ2UgY3VycmVudCBsaW1pdCAqLworCWludCBmYXN0X2xpbWl0X1VTQl9tQTsJLyogVVNCIGZhc3QgY2hhcmdlIGN1cnJlbnQgbGltaXQgKi8KKwlpbnQgY2hhcmdlX3RpbWVvdXQ7CS8qIGNoYXJnZSB0aW1lb3V0IChtaW5zKSAqLworCWludCB0cmlja2xlX3N0YXJ0X21WOwkvKiB0cmlja2xlIGNoYXJnZSBzdGFydHMgYXQgbVYgKi8KKwlpbnQgdHJpY2tsZV9jaGFyZ2VfbUE7CS8qIHRyaWNrbGUgY2hhcmdlIGN1cnJlbnQgKi8KKwlpbnQgdHJpY2tsZV9jaGFyZ2VfVVNCX21BOwkvKiBVU0IgdHJpY2tsZSBjaGFyZ2UgY3VycmVudCAqLworfTsKKwogc3RydWN0IHdtODM1MF9wb3dlciB7CiAJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldjsKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5IGJhdHRlcnk7CisJc3RydWN0IHBvd2VyX3N1cHBseSB1c2I7CisJc3RydWN0IHBvd2VyX3N1cHBseSBhYzsKKwlzdHJ1Y3Qgd204MzUwX2NoYXJnZXJfcG9saWN5ICpwb2xpY3k7CisKKwlpbnQgcmV2X2dfY29lZmY7CiB9OwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWlncmF0ZS5oIGIvaW5jbHVkZS9saW51eC9taWdyYXRlLmgKaW5kZXggM2YzNDAwNS4uNTI3NjAyYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9taWdyYXRlLmgKKysrIGIvaW5jbHVkZS9saW51eC9taWdyYXRlLmgKQEAgLTcsNiArNyw4IEBACiB0eXBlZGVmIHN0cnVjdCBwYWdlICpuZXdfcGFnZV90KHN0cnVjdCBwYWdlICosIHVuc2lnbmVkIGxvbmcgcHJpdmF0ZSwgaW50ICoqKTsKIAogI2lmZGVmIENPTkZJR19NSUdSQVRJT04KKyNkZWZpbmUgUEFHRV9NSUdSQVRJT04gMQorCiBleHRlcm4gaW50IHB1dGJhY2tfbHJ1X3BhZ2VzKHN0cnVjdCBsaXN0X2hlYWQgKmwpOwogZXh0ZXJuIGludCBtaWdyYXRlX3BhZ2Uoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKiwKIAkJCXN0cnVjdCBwYWdlICosIHN0cnVjdCBwYWdlICopOwpAQCAtMjAsNiArMjIsOCBAQAogCQljb25zdCBub2RlbWFza190ICpmcm9tLCBjb25zdCBub2RlbWFza190ICp0bywKIAkJdW5zaWduZWQgbG9uZyBmbGFncyk7CiAjZWxzZQorI2RlZmluZSBQQUdFX01JR1JBVElPTiAwCisKIHN0YXRpYyBpbmxpbmUgaW50IHB1dGJhY2tfbHJ1X3BhZ2VzKHN0cnVjdCBsaXN0X2hlYWQgKmwpIHsgcmV0dXJuIDA7IH0KIHN0YXRpYyBpbmxpbmUgaW50IG1pZ3JhdGVfcGFnZXMoc3RydWN0IGxpc3RfaGVhZCAqbCwgbmV3X3BhZ2VfdCB4LAogCQl1bnNpZ25lZCBsb25nIHByaXZhdGUpIHsgcmV0dXJuIC1FTk9TWVM7IH0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWlzY2RldmljZS5oIGIvaW5jbHVkZS9saW51eC9taXNjZGV2aWNlLmgKaW5kZXggMjY0MzNlYy4uYTgyMGY4MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9taXNjZGV2aWNlLmgKKysrIGIvaW5jbHVkZS9saW51eC9taXNjZGV2aWNlLmgKQEAgLTMsMzMgKzMsMzMgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgogCi0jZGVmaW5lIFBTTU9VU0VfTUlOT1IgIDEKLSNkZWZpbmUgTVNfQlVTTU9VU0VfTUlOT1IgMgotI2RlZmluZSBBVElYTF9CVVNNT1VTRV9NSU5PUiAzCi0vKiNkZWZpbmUgQU1JR0FNT1VTRV9NSU5PUiA0CUZJWE1FIE9CU09MRVRFICovCi0jZGVmaW5lIEFUQVJJTU9VU0VfTUlOT1IgNQotI2RlZmluZSBTVU5fTU9VU0VfTUlOT1IgNgotI2RlZmluZSBBUE9MTE9fTU9VU0VfTUlOT1IgNwotI2RlZmluZSBQQzExMFBBRF9NSU5PUiA5Ci0vKiNkZWZpbmUgQURCX01PVVNFX01JTk9SIDEwCUZJWE1FIE9CU09MRVRFICovCisjZGVmaW5lIFBTTU9VU0VfTUlOT1IJCTEKKyNkZWZpbmUgTVNfQlVTTU9VU0VfTUlOT1IJMgorI2RlZmluZSBBVElYTF9CVVNNT1VTRV9NSU5PUgkzCisvKiNkZWZpbmUgQU1JR0FNT1VTRV9NSU5PUgk0CUZJWE1FIE9CU09MRVRFICovCisjZGVmaW5lIEFUQVJJTU9VU0VfTUlOT1IJNQorI2RlZmluZSBTVU5fTU9VU0VfTUlOT1IJCTYKKyNkZWZpbmUgQVBPTExPX01PVVNFX01JTk9SCTcKKyNkZWZpbmUgUEMxMTBQQURfTUlOT1IJCTkKKy8qI2RlZmluZSBBREJfTU9VU0VfTUlOT1IJMTAJRklYTUUgT0JTT0xFVEUgKi8KICNkZWZpbmUgV0FUQ0hET0dfTUlOT1IJCTEzMAkvKiBXYXRjaGRvZyB0aW1lciAgICAgKi8KICNkZWZpbmUgVEVNUF9NSU5PUgkJMTMxCS8qIFRlbXBlcmF0dXJlIFNlbnNvciAqLwotI2RlZmluZSBSVENfTUlOT1IgMTM1CisjZGVmaW5lIFJUQ19NSU5PUgkJMTM1CiAjZGVmaW5lIEVGSV9SVENfTUlOT1IJCTEzNgkvKiBFRkkgVGltZSBzZXJ2aWNlcyAqLwotI2RlZmluZSBTVU5fT1BFTlBST01fTUlOT1IgMTM5CisjZGVmaW5lIFNVTl9PUEVOUFJPTV9NSU5PUgkxMzkKICNkZWZpbmUgRE1BUElfTUlOT1IJCTE0MAkvKiBETUFQSSAqLwotI2RlZmluZSBOVlJBTV9NSU5PUiAxNDQKLSNkZWZpbmUgU0dJX01NVElNRVIgICAgICAgIDE1MworI2RlZmluZSBOVlJBTV9NSU5PUgkJMTQ0CisjZGVmaW5lIFNHSV9NTVRJTUVSCQkxNTMKICNkZWZpbmUgU1RPUkVfUVVFVUVfTUlOT1IJMTU1Ci0jZGVmaW5lIEkyT19NSU5PUiAxNjYKKyNkZWZpbmUgSTJPX01JTk9SCQkxNjYKICNkZWZpbmUgTUlDUk9DT0RFX01JTk9SCQkxODQKLSNkZWZpbmUgTVdBVkVfTUlOT1IJMjE5CQkvKiBBQ1AvTXdhdmUgTW9kZW0gKi8KLSNkZWZpbmUgTVBUX01JTk9SCTIyMAotI2RlZmluZSBNSVNDX0RZTkFNSUNfTUlOT1IgMjU1Ci0KLSNkZWZpbmUgVFVOX01JTk9SCSAgICAgMjAwCi0jZGVmaW5lCUhQRVRfTUlOT1IJICAgICAyMjgKLSNkZWZpbmUgS1ZNX01JTk9SICAgICAgICAgICAgMjMyCisjZGVmaW5lIFRVTl9NSU5PUgkJMjAwCisjZGVmaW5lIE1XQVZFX01JTk9SCQkyMTkJLyogQUNQL013YXZlIE1vZGVtICovCisjZGVmaW5lIE1QVF9NSU5PUgkJMjIwCisjZGVmaW5lIEhQRVRfTUlOT1IJCTIyOAorI2RlZmluZSBGVVNFX01JTk9SCQkyMjkKKyNkZWZpbmUgS1ZNX01JTk9SCQkyMzIKKyNkZWZpbmUgTUlTQ19EWU5BTUlDX01JTk9SCTI1NQogCiBzdHJ1Y3QgZGV2aWNlOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21tLmggYi9pbmNsdWRlL2xpbnV4L21tLmgKaW5kZXggYWFhOGI4NC4uNGEzZDI4YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tbS5oCisrKyBiL2luY2x1ZGUvbGludXgvbW0uaApAQCAtNzE3LDYgKzcxNywxMSBAQAogCiAjZGVmaW5lIFZNX0ZBVUxUX0VSUk9SCShWTV9GQVVMVF9PT00gfCBWTV9GQVVMVF9TSUdCVVMpCiAKKy8qCisgKiBDYW4gYmUgY2FsbGVkIGJ5IHRoZSBwYWdlZmF1bHQgaGFuZGxlciB3aGVuIGl0IGdldHMgYSBWTV9GQVVMVF9PT00uCisgKi8KK2V4dGVybiB2b2lkIHBhZ2VmYXVsdF9vdXRfb2ZfbWVtb3J5KHZvaWQpOworCiAjZGVmaW5lIG9mZnNldF9pbl9wYWdlKHApCSgodW5zaWduZWQgbG9uZykocCkgJiB+UEFHRV9NQVNLKQogCiBleHRlcm4gdm9pZCBzaG93X2ZyZWVfYXJlYXModm9pZCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21tX2lubGluZS5oIGIvaW5jbHVkZS9saW51eC9tbV9pbmxpbmUuaAppbmRleCBjOTQ4MzUwLi43ZmJiOTcyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21tX2lubGluZS5oCisrKyBiL2luY2x1ZGUvbGludXgvbW1faW5saW5lLmgKQEAgLTI4LDYgKzI4LDcgQEAKIHsKIAlsaXN0X2FkZCgmcGFnZS0+bHJ1LCAmem9uZS0+bHJ1W2xdLmxpc3QpOwogCV9faW5jX3pvbmVfc3RhdGUoem9uZSwgTlJfTFJVX0JBU0UgKyBsKTsKKwltZW1fY2dyb3VwX2FkZF9scnVfbGlzdChwYWdlLCBsKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkCkBAIC0zNSw2ICszNiw3IEBACiB7CiAJbGlzdF9kZWwoJnBhZ2UtPmxydSk7CiAJX19kZWNfem9uZV9zdGF0ZSh6b25lLCBOUl9MUlVfQkFTRSArIGwpOworCW1lbV9jZ3JvdXBfZGVsX2xydV9saXN0KHBhZ2UsIGwpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQKQEAgLTU0LDYgKzU2LDcgQEAKIAkJbCArPSBwYWdlX2lzX2ZpbGVfY2FjaGUocGFnZSk7CiAJfQogCV9fZGVjX3pvbmVfc3RhdGUoem9uZSwgTlJfTFJVX0JBU0UgKyBsKTsKKwltZW1fY2dyb3VwX2RlbF9scnVfbGlzdChwYWdlLCBsKTsKIH0KIAogLyoqCkBAIC03OCwyMyArODEsNCBAQAogCXJldHVybiBscnU7CiB9CiAKLS8qKgotICogaW5hY3RpdmVfYW5vbl9pc19sb3cgLSBjaGVjayBpZiBhbm9ueW1vdXMgcGFnZXMgbmVlZCB0byBiZSBkZWFjdGl2YXRlZAotICogQHpvbmU6IHpvbmUgdG8gY2hlY2sKLSAqCi0gKiBSZXR1cm5zIHRydWUgaWYgdGhlIHpvbmUgZG9lcyBub3QgaGF2ZSBlbm91Z2ggaW5hY3RpdmUgYW5vbiBwYWdlcywKLSAqIG1lYW5pbmcgc29tZSBhY3RpdmUgYW5vbiBwYWdlcyBuZWVkIHRvIGJlIGRlYWN0aXZhdGVkLgotICovCi1zdGF0aWMgaW5saW5lIGludCBpbmFjdGl2ZV9hbm9uX2lzX2xvdyhzdHJ1Y3Qgem9uZSAqem9uZSkKLXsKLQl1bnNpZ25lZCBsb25nIGFjdGl2ZSwgaW5hY3RpdmU7Ci0KLQlhY3RpdmUgPSB6b25lX3BhZ2Vfc3RhdGUoem9uZSwgTlJfQUNUSVZFX0FOT04pOwotCWluYWN0aXZlID0gem9uZV9wYWdlX3N0YXRlKHpvbmUsIE5SX0lOQUNUSVZFX0FOT04pOwotCi0JaWYgKGluYWN0aXZlICogem9uZS0+aW5hY3RpdmVfcmF0aW8gPCBhY3RpdmUpCi0JCXJldHVybiAxOwotCi0JcmV0dXJuIDA7Ci19CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbW16b25lLmggYi9pbmNsdWRlL2xpbnV4L21tem9uZS5oCmluZGV4IDM1YTdiNWUuLjA5YzE0ZTIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbW16b25lLmgKKysrIGIvaW5jbHVkZS9saW51eC9tbXpvbmUuaApAQCAtMjYzLDYgKzI2MywxOSBAQAogI2Vycm9yIFpPTkVTX1NISUZUIC0tIHRvbyBtYW55IHpvbmVzIGNvbmZpZ3VyZWQgYWRqdXN0IGNhbGN1bGF0aW9uCiAjZW5kaWYKIAorc3RydWN0IHpvbmVfcmVjbGFpbV9zdGF0IHsKKwkvKgorCSAqIFRoZSBwYWdlb3V0IGNvZGUgaW4gdm1zY2FuLmMga2VlcHMgdHJhY2sgb2YgaG93IG1hbnkgb2YgdGhlCisJICogbWVtL3N3YXAgYmFja2VkIGFuZCBmaWxlIGJhY2tlZCBwYWdlcyBhcmUgcmVmZWZlcmVuY2VkLgorCSAqIFRoZSBoaWdoZXIgdGhlIHJvdGF0ZWQvc2Nhbm5lZCByYXRpbywgdGhlIG1vcmUgdmFsdWFibGUKKwkgKiB0aGF0IGNhY2hlIGlzLgorCSAqCisJICogVGhlIGFub24gTFJVIHN0YXRzIGxpdmUgaW4gWzBdLCBmaWxlIExSVSBzdGF0cyBpbiBbMV0KKwkgKi8KKwl1bnNpZ25lZCBsb25nCQlyZWNlbnRfcm90YXRlZFsyXTsKKwl1bnNpZ25lZCBsb25nCQlyZWNlbnRfc2Nhbm5lZFsyXTsKK307CisKIHN0cnVjdCB6b25lIHsKIAkvKiBGaWVsZHMgY29tbW9ubHkgYWNjZXNzZWQgYnkgdGhlIHBhZ2UgYWxsb2NhdG9yICovCiAJdW5zaWduZWQgbG9uZwkJcGFnZXNfbWluLCBwYWdlc19sb3csIHBhZ2VzX2hpZ2g7CkBAIC0zMTUsMTYgKzMyOCw3IEBACiAJCXVuc2lnbmVkIGxvbmcgbnJfc2NhbjsKIAl9IGxydVtOUl9MUlVfTElTVFNdOwogCi0JLyoKLQkgKiBUaGUgcGFnZW91dCBjb2RlIGluIHZtc2Nhbi5jIGtlZXBzIHRyYWNrIG9mIGhvdyBtYW55IG9mIHRoZQotCSAqIG1lbS9zd2FwIGJhY2tlZCBhbmQgZmlsZSBiYWNrZWQgcGFnZXMgYXJlIHJlZmVmZXJlbmNlZC4KLQkgKiBUaGUgaGlnaGVyIHRoZSByb3RhdGVkL3NjYW5uZWQgcmF0aW8sIHRoZSBtb3JlIHZhbHVhYmxlCi0JICogdGhhdCBjYWNoZSBpcy4KLQkgKgotCSAqIFRoZSBhbm9uIExSVSBzdGF0cyBsaXZlIGluIFswXSwgZmlsZSBMUlUgc3RhdHMgaW4gWzFdCi0JICovCi0JdW5zaWduZWQgbG9uZwkJcmVjZW50X3JvdGF0ZWRbMl07Ci0JdW5zaWduZWQgbG9uZwkJcmVjZW50X3NjYW5uZWRbMl07CisJc3RydWN0IHpvbmVfcmVjbGFpbV9zdGF0IHJlY2xhaW1fc3RhdDsKIAogCXVuc2lnbmVkIGxvbmcJCXBhZ2VzX3NjYW5uZWQ7CSAgIC8qIHNpbmNlIGxhc3QgcmVjbGFpbSAqLwogCXVuc2lnbmVkIGxvbmcJCWZsYWdzOwkJICAgLyogem9uZSBmbGFncywgc2VlIGJlbG93ICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21vZHVsZS5oIGIvaW5jbHVkZS9saW51eC9tb2R1bGUuaAppbmRleCAzYmZlZDAxLi40ZjdlYTEyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21vZHVsZS5oCisrKyBiL2luY2x1ZGUvbGludXgvbW9kdWxlLmgKQEAgLTI5NCw5ICsyOTQsNiBAQAogCS8qIFRoZSBzaXplIG9mIHRoZSBleGVjdXRhYmxlIGNvZGUgaW4gZWFjaCBzZWN0aW9uLiAgKi8KIAl1bnNpZ25lZCBpbnQgaW5pdF90ZXh0X3NpemUsIGNvcmVfdGV4dF9zaXplOwogCi0JLyogVGhlIGhhbmRsZSByZXR1cm5lZCBmcm9tIHVud2luZF9hZGRfdGFibGUuICovCi0Jdm9pZCAqdW53aW5kX2luZm87Ci0KIAkvKiBBcmNoLXNwZWNpZmljIG1vZHVsZSB2YWx1ZXMgKi8KIAlzdHJ1Y3QgbW9kX2FyY2hfc3BlY2lmaWMgYXJjaDsKIApAQCAtMzY4LDYgKzM2NSwxOCBAQAogc3RydWN0IG1vZHVsZSAqX19tb2R1bGVfdGV4dF9hZGRyZXNzKHVuc2lnbmVkIGxvbmcgYWRkcik7CiBpbnQgaXNfbW9kdWxlX2FkZHJlc3ModW5zaWduZWQgbG9uZyBhZGRyKTsKIAorc3RhdGljIGlubGluZSBpbnQgd2l0aGluX21vZHVsZV9jb3JlKHVuc2lnbmVkIGxvbmcgYWRkciwgc3RydWN0IG1vZHVsZSAqbW9kKQoreworCXJldHVybiAodW5zaWduZWQgbG9uZyltb2QtPm1vZHVsZV9jb3JlIDw9IGFkZHIgJiYKKwkgICAgICAgYWRkciA8ICh1bnNpZ25lZCBsb25nKW1vZC0+bW9kdWxlX2NvcmUgKyBtb2QtPmNvcmVfc2l6ZTsKK30KKworc3RhdGljIGlubGluZSBpbnQgd2l0aGluX21vZHVsZV9pbml0KHVuc2lnbmVkIGxvbmcgYWRkciwgc3RydWN0IG1vZHVsZSAqbW9kKQoreworCXJldHVybiAodW5zaWduZWQgbG9uZyltb2QtPm1vZHVsZV9pbml0IDw9IGFkZHIgJiYKKwkgICAgICAgYWRkciA8ICh1bnNpZ25lZCBsb25nKW1vZC0+bW9kdWxlX2luaXQgKyBtb2QtPmluaXRfc2l6ZTsKK30KKwogLyogUmV0dXJucyAwIGFuZCBmaWxscyBpbiB2YWx1ZSwgZGVmaW5lZCBhbmQgbmFtZWJ1Ziwgb3IgLUVSQU5HRSBpZgogICAgc3ltbnVtIG91dCBvZiByYW5nZS4gKi8KIGludCBtb2R1bGVfZ2V0X2thbGxzeW0odW5zaWduZWQgaW50IHN5bW51bSwgdW5zaWduZWQgbG9uZyAqdmFsdWUsIGNoYXIgKnR5cGUsCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21vZHVsZWxvYWRlci5oIGIvaW5jbHVkZS9saW51eC9tb2R1bGVsb2FkZXIuaAppbmRleCBlYjEwMzM5Li5jMWY0MGMyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21vZHVsZWxvYWRlci5oCisrKyBiL2luY2x1ZGUvbGludXgvbW9kdWxlbG9hZGVyLmgKQEAgLTEzLDYgKzEzLDkgQEAKIAkJCSAgICAgIGNoYXIgKnNlY3N0cmluZ3MsCiAJCQkgICAgICBzdHJ1Y3QgbW9kdWxlICptb2QpOwogCisvKiBBZGRpdGlvbmFsIGJ5dGVzIG5lZWRlZCBieSBhcmNoIGluIGZyb250IG9mIGluZGl2aWR1YWwgc2VjdGlvbnMgKi8KK3Vuc2lnbmVkIGludCBhcmNoX21vZF9zZWN0aW9uX3ByZXBlbmQoc3RydWN0IG1vZHVsZSAqbW9kLCB1bnNpZ25lZCBpbnQgc2VjdGlvbik7CisKIC8qIEFsbG9jYXRvciB1c2VkIGZvciBhbGxvY2F0aW5nIHN0cnVjdCBtb2R1bGUsIGNvcmUgc2VjdGlvbnMgYW5kIGluaXQKICAgIHNlY3Rpb25zLiAgUmV0dXJucyBOVUxMIG9uIGZhaWx1cmUuICovCiB2b2lkICptb2R1bGVfYWxsb2ModW5zaWduZWQgbG9uZyBzaXplKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbXRkL2NvbmNhdC5oIGIvaW5jbHVkZS9saW51eC9tdGQvY29uY2F0LmgKaW5kZXggYzAyZjNkMi4uZTgwYzY3NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tdGQvY29uY2F0LmgKKysrIGIvaW5jbHVkZS9saW51eC9tdGQvY29uY2F0LmgKQEAgLTEzLDcgKzEzLDcgQEAKIHN0cnVjdCBtdGRfaW5mbyAqbXRkX2NvbmNhdF9jcmVhdGUoCiAgICAgc3RydWN0IG10ZF9pbmZvICpzdWJkZXZbXSwgIC8qIHN1YmRldmljZXMgdG8gY29uY2F0ZW5hdGUgKi8KICAgICBpbnQgbnVtX2RldnMsICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIHN1YmRldmljZXMgICAgICAqLwotICAgIGNoYXIgKm5hbWUpOyAgICAgICAgICAgICAgICAvKiBuYW1lIGZvciB0aGUgbmV3IGRldmljZSAgICovCisgICAgY29uc3QgY2hhciAqbmFtZSk7ICAgICAgICAgIC8qIG5hbWUgZm9yIHRoZSBuZXcgZGV2aWNlICAgKi8KIAogdm9pZCBtdGRfY29uY2F0X2Rlc3Ryb3koc3RydWN0IG10ZF9pbmZvICptdGQpOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L210ZC9tdGQuaCBiL2luY2x1ZGUvbGludXgvbXRkL210ZC5oCmluZGV4IGVhZTI2YmIuLjY0NDMzZWIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbXRkL210ZC5oCisrKyBiL2luY2x1ZGUvbGludXgvbXRkL210ZC5oCkBAIC04Myw3ICs4Myw3IEBACiAgKiBAZGF0YnVmOglkYXRhIGJ1ZmZlciAtIGlmIE5VTEwgb25seSBvb2IgZGF0YSBhcmUgcmVhZC93cml0dGVuCiAgKiBAb29iYnVmOglvb2IgZGF0YSBidWZmZXIKICAqCi0gKiBOb3RlLCBpdCBpcyBhbGxvd2VkIHRvIHJlYWQgbW9yZSB0aGVuIG9uZSBPT0IgYXJlYSBhdCBvbmUgZ28sIGJ1dCBub3Qgd3JpdGUuCisgKiBOb3RlLCBpdCBpcyBhbGxvd2VkIHRvIHJlYWQgbW9yZSB0aGFuIG9uZSBPT0IgYXJlYSBhdCBvbmUgZ28sIGJ1dCBub3Qgd3JpdGUuCiAgKiBUaGUgaW50ZXJmYWNlIGFzc3VtZXMgdGhhdCB0aGUgT09CIHdyaXRlIHJlcXVlc3RzIHByb2dyYW0gb25seSBvbmUgcGFnZSdzCiAgKiBPT0IgYXJlYS4KICAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uY3BfZnMuaCBiL2luY2x1ZGUvbGludXgvbmNwX2ZzLmgKaW5kZXggOWYyZDc2My4uZjY5ZTY2ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uY3BfZnMuaAorKysgYi9pbmNsdWRlL2xpbnV4L25jcF9mcy5oCkBAIC04Nyw3ICs4Nyw3IEBACiAjZGVmaW5lIE5DUF9BVVRIX05EUwkweDMyCiAJaW50CQlhdXRoX3R5cGU7CiAJc2l6ZV90CQlvYmplY3RfbmFtZV9sZW47Ci0Jdm9pZCBfX3VzZXIgKglvYmplY3RfbmFtZTsJLyogYW4gdXNlcnNwYWNlIGRhdGEsIGluIG1vc3QgY2FzZXMgdXNlciBuYW1lICovCisJdm9pZCBfX3VzZXIgKglvYmplY3RfbmFtZTsJLyogYSB1c2Vyc3BhY2UgZGF0YSwgaW4gbW9zdCBjYXNlcyB1c2VyIG5hbWUgKi8KIH07CiAKIHN0cnVjdCBuY3BfcHJpdmF0ZWRhdGFfaW9jdGwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZGV2aWNlLmggYi9pbmNsdWRlL2xpbnV4L25ldGRldmljZS5oCmluZGV4IGJhYzJjNDUuLmYyNDU1NjggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmV0ZGV2aWNlLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZXRkZXZpY2UuaApAQCAtMzEzLDEwICszMTMsMTEgQEAKICNpZmRlZiBDT05GSUdfTkVUUE9MTAogCXNwaW5sb2NrX3QJCXBvbGxfbG9jazsKIAlpbnQJCQlwb2xsX293bmVyOwotCXN0cnVjdCBuZXRfZGV2aWNlCSpkZXY7CiAjZW5kaWYKKwlzdHJ1Y3QgbmV0X2RldmljZQkqZGV2OwogCXN0cnVjdCBsaXN0X2hlYWQJZGV2X2xpc3Q7CiAJc3RydWN0IHNrX2J1ZmYJCSpncm9fbGlzdDsKKwlzdHJ1Y3Qgc2tfYnVmZgkJKnNrYjsKIH07CiAKIGVudW0KQEAgLTk5MCw2ICs5OTEsOSBAQAogCiAJLyogTnVtYmVyIG9mIHNlZ21lbnRzIGFnZ3JlZ2F0ZWQuICovCiAJaW50IGNvdW50OworCisJLyogRnJlZSB0aGUgc2tiPyAqLworCWludCBmcmVlOwogfTsKIAogI2RlZmluZSBOQVBJX0dST19DQihza2IpICgoc3RydWN0IG5hcGlfZ3JvX2NiICopKHNrYiktPmNiKQpAQCAtMTAxMSw2ICsxMDE1LDE0IEBACiAJc3RydWN0IGxpc3RfaGVhZAlsaXN0OwogfTsKIAorc3RydWN0IG5hcGlfZ3JvX2ZyYWdpbmZvIHsKKwlza2JfZnJhZ190IGZyYWdzW01BWF9TS0JfRlJBR1NdOworCXVuc2lnbmVkIGludCBucl9mcmFnczsKKwl1bnNpZ25lZCBpbnQgaXBfc3VtbWVkOworCXVuc2lnbmVkIGludCBsZW47CisJX193c3VtIGNzdW07Cit9OworCiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KIApAQCAtMTM1OCw4ICsxMzcwLDE2IEBACiAjZGVmaW5lIEhBVkVfTkVUSUZfUkVDRUlWRV9TS0IgMQogZXh0ZXJuIGludAkJbmV0aWZfcmVjZWl2ZV9za2Ioc3RydWN0IHNrX2J1ZmYgKnNrYik7CiBleHRlcm4gdm9pZAkJbmFwaV9ncm9fZmx1c2goc3RydWN0IG5hcGlfc3RydWN0ICpuYXBpKTsKK2V4dGVybiBpbnQJCWRldl9ncm9fcmVjZWl2ZShzdHJ1Y3QgbmFwaV9zdHJ1Y3QgKm5hcGksCisJCQkJCXN0cnVjdCBza19idWZmICpza2IpOwogZXh0ZXJuIGludAkJbmFwaV9ncm9fcmVjZWl2ZShzdHJ1Y3QgbmFwaV9zdHJ1Y3QgKm5hcGksCiAJCQkJCSBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK2V4dGVybiB2b2lkCQluYXBpX3JldXNlX3NrYihzdHJ1Y3QgbmFwaV9zdHJ1Y3QgKm5hcGksCisJCQkJICAgICAgIHN0cnVjdCBza19idWZmICpza2IpOworZXh0ZXJuIHN0cnVjdCBza19idWZmICoJbmFwaV9mcmFnaW5mb19za2Ioc3RydWN0IG5hcGlfc3RydWN0ICpuYXBpLAorCQkJCQkgIHN0cnVjdCBuYXBpX2dyb19mcmFnaW5mbyAqaW5mbyk7CitleHRlcm4gaW50CQluYXBpX2dyb19mcmFncyhzdHJ1Y3QgbmFwaV9zdHJ1Y3QgKm5hcGksCisJCQkJICAgICAgIHN0cnVjdCBuYXBpX2dyb19mcmFnaW5mbyAqaW5mbyk7CiBleHRlcm4gdm9pZAkJbmV0aWZfbml0X2RlbGl2ZXIoc3RydWN0IHNrX2J1ZmYgKnNrYik7CiBleHRlcm4gaW50CQlkZXZfdmFsaWRfbmFtZShjb25zdCBjaGFyICpuYW1lKTsKIGV4dGVybiBpbnQJCWRldl9pb2N0bChzdHJ1Y3QgbmV0ICpuZXQsIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgX191c2VyICopOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZnM0LmggYi9pbmNsdWRlL2xpbnV4L25mczQuaAppbmRleCBlYTAzNjY3Li5iOTEyMzExIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25mczQuaAorKysgYi9pbmNsdWRlL2xpbnV4L25mczQuaApAQCAtODgsNiArODgsOCBAQAogI2RlZmluZSBORlM0X0FDRV9HRU5FUklDX0VYRUNVVEUgICAgICAgICAgICAgIDB4MDAxMjAwQTAKICNkZWZpbmUgTkZTNF9BQ0VfTUFTS19BTEwgICAgICAgICAgICAgICAgICAgICAweDAwMUYwMUZGCiAKKyNkZWZpbmUgTkZTNF9NQVhfVUlOVDY0CSh+KHU2NCkwKQorCiBlbnVtIG5mczRfYWNsX3dob3R5cGUgewogCU5GUzRfQUNMX1dIT19OQU1FRCA9IDAsCiAJTkZTNF9BQ0xfV0hPX09XTkVSLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZnNkL25mc2QuaCBiL2luY2x1ZGUvbGludXgvbmZzZC9uZnNkLmgKaW5kZXggMjEyNjk0MC4uZTE5ZjQ1OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZnNkL25mc2QuaAorKysgYi9pbmNsdWRlL2xpbnV4L25mc2QvbmZzZC5oCkBAIC0yMyw3ICsyMyw2IEBACiAvKgogICogbmZzZCB2ZXJzaW9uCiAgKi8KLSNkZWZpbmUgTkZTRF9WRVJTSU9OCQkiMC41IgogI2RlZmluZSBORlNEX1NVUFBPUlRFRF9NSU5PUl9WRVJTSU9OCTAKIAogLyoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmZzZC9uZnNmaC5oIGIvaW5jbHVkZS9saW51eC9uZnNkL25mc2ZoLmgKaW5kZXggZDE5NDFjYi4uYjJlMDkzOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZnNkL25mc2ZoLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZnNkL25mc2ZoLmgKQEAgLTY4LDYgKzY4LDEwIEBACiAgKiAgICAgMSAgLSA0IGJ5dGUgdXNlciBzcGVjaWZpZWQgaWRlbnRpZmllcgogICogICAgIDIgIC0gNCBieXRlIG1ham9yLCA0IGJ5dGUgbWlub3IsIDQgYnl0ZSBpbm9kZSBudW1iZXIgLSBERVBSRUNBVEVECiAgKiAgICAgMyAgLSA0IGJ5dGUgZGV2aWNlIGlkLCBlbmNvZGVkIGZvciB1c2VyLXNwYWNlLCA0IGJ5dGUgaW5vZGUgbnVtYmVyCisgKiAgICAgNCAgLSA0IGJ5dGUgaW5vZGUgbnVtYmVyIGFuZCA0IGJ5dGUgdXVpZAorICogICAgIDUgIC0gOCBieXRlIHV1aWQKKyAqICAgICA2ICAtIDE2IGJ5dGUgdXVpZAorICogICAgIDcgIC0gOCBieXRlIGlub2RlIG51bWJlciBhbmQgMTYgYnl0ZSB1dWlkCiAgKgogICogVGhlIGZpbGVpZF90eXBlIGlkZW50aWZpZWQgaG93IHRoZSBmaWxlIHdpdGhpbiB0aGUgZmlsZXN5c3RlbSBpcyBlbmNvZGVkLgogICogVGhpcyBpcyAod2lsbCBiZSkgcGFzc2VkIHRvLCBhbmQgc2V0IGJ5LCB0aGUgdW5kZXJseWluZyBmaWxlc3lzdGVtIGlmIGl0IHN1cHBvcnRzCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25vZGUuaCBiL2luY2x1ZGUvbGludXgvbm9kZS5oCmluZGV4IGJjMDAxYmMuLjY4MWE2OTcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbm9kZS5oCisrKyBiL2luY2x1ZGUvbGludXgvbm9kZS5oCkBAIC0yNiw2ICsyNiw3IEBACiAJc3RydWN0IHN5c19kZXZpY2UJc3lzZGV2OwogfTsKIAorc3RydWN0IG1lbW9yeV9ibG9jazsKIGV4dGVybiBzdHJ1Y3Qgbm9kZSBub2RlX2RldmljZXNbXTsKIAogZXh0ZXJuIGludCByZWdpc3Rlcl9ub2RlKHN0cnVjdCBub2RlICosIGludCwgc3RydWN0IG5vZGUgKik7CkBAIC0zNSw2ICszNiw5IEBACiBleHRlcm4gdm9pZCB1bnJlZ2lzdGVyX29uZV9ub2RlKGludCBuaWQpOwogZXh0ZXJuIGludCByZWdpc3Rlcl9jcHVfdW5kZXJfbm9kZSh1bnNpZ25lZCBpbnQgY3B1LCB1bnNpZ25lZCBpbnQgbmlkKTsKIGV4dGVybiBpbnQgdW5yZWdpc3Rlcl9jcHVfdW5kZXJfbm9kZSh1bnNpZ25lZCBpbnQgY3B1LCB1bnNpZ25lZCBpbnQgbmlkKTsKK2V4dGVybiBpbnQgcmVnaXN0ZXJfbWVtX3NlY3RfdW5kZXJfbm9kZShzdHJ1Y3QgbWVtb3J5X2Jsb2NrICptZW1fYmxrLAorCQkJCQkJaW50IG5pZCk7CitleHRlcm4gaW50IHVucmVnaXN0ZXJfbWVtX3NlY3RfdW5kZXJfbm9kZXMoc3RydWN0IG1lbW9yeV9ibG9jayAqbWVtX2Jsayk7CiAjZWxzZQogc3RhdGljIGlubGluZSBpbnQgcmVnaXN0ZXJfb25lX25vZGUoaW50IG5pZCkKIHsKQEAgLTUyLDYgKzU2LDE1IEBACiB7CiAJcmV0dXJuIDA7CiB9CitzdGF0aWMgaW5saW5lIGludCByZWdpc3Rlcl9tZW1fc2VjdF91bmRlcl9ub2RlKHN0cnVjdCBtZW1vcnlfYmxvY2sgKm1lbV9ibGssCisJCQkJCQkJaW50IG5pZCkKK3sKKwlyZXR1cm4gMDsKK30KK3N0YXRpYyBpbmxpbmUgaW50IHVucmVnaXN0ZXJfbWVtX3NlY3RfdW5kZXJfbm9kZXMoc3RydWN0IG1lbW9yeV9ibG9jayAqbWVtX2JsaykKK3sKKwlyZXR1cm4gMDsKK30KICNlbmRpZgogCiAjZGVmaW5lIHRvX25vZGUoc3lzX2RldmljZSkgY29udGFpbmVyX29mKHN5c19kZXZpY2UsIHN0cnVjdCBub2RlLCBzeXNkZXYpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L253cHNlcmlhbC5oIGIvaW5jbHVkZS9saW51eC9ud3BzZXJpYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YWNiMjE1Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9ud3BzZXJpYWwuaApAQCAtMCwwICsxLDE4IEBACisvKgorICogIFNlcmlhbCBQb3J0IGRyaXZlciBmb3IgYSBOV1AgdWFydCBkZXZpY2UKKyAqCisgKiAgICBDb3B5cmlnaHQgKEMpIDIwMDggSUJNIENvcnAuLCBCZW5qYW1pbiBLcmlsbCA8YmVuQGNvZGllcnQub3JnPgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqICAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqLworI2lmbmRlZiBfTldQU0VSSUFMX0gKKyNkZWZpbmUgX05XUFNFUklBTF9ICisKK2ludCBud3BzZXJpYWxfcmVnaXN0ZXJfcG9ydChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KTsKK3ZvaWQgbndwc2VyaWFsX3VucmVnaXN0ZXJfcG9ydChpbnQgbGluZSk7CisKKyNlbmRpZiAvKiBfTldQU0VSSUFMX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvb3h1MjEwaHAuaCBiL2luY2x1ZGUvbGludXgvb3h1MjEwaHAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYmY5NmVhCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9veHUyMTBocC5oCkBAIC0wLDAgKzEsNyBAQAorLyogcGxhdGZvcm0gZGF0YSBmb3IgdGhlIE9YVTIxMEhQIEhDRCAqLworCitzdHJ1Y3Qgb3h1MjEwaHBfcGxhdGZvcm1fZGF0YSB7CisJdW5zaWduZWQgaW50IGJ1czE2OjE7CisJdW5zaWduZWQgaW50IHVzZV9oY2Rfb3RnOjE7CisJdW5zaWduZWQgaW50IHVzZV9oY2Rfc3BoOjE7Cit9OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wYWdlLWZsYWdzLmggYi9pbmNsdWRlL2xpbnV4L3BhZ2UtZmxhZ3MuaAppbmRleCBiMTJmOTNhLi4yMTlhNTIzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BhZ2UtZmxhZ3MuaAorKysgYi9pbmNsdWRlL2xpbnV4L3BhZ2UtZmxhZ3MuaApAQCAtMjI4LDYgKzIyOCw3IEBACiBQQUdFRkxBRyhTd2FwQ2FjaGUsIHN3YXBjYWNoZSkKICNlbHNlCiBQQUdFRkxBR19GQUxTRShTd2FwQ2FjaGUpCisJU0VUUEFHRUZMQUdfTk9PUChTd2FwQ2FjaGUpIENMRUFSUEFHRUZMQUdfTk9PUChTd2FwQ2FjaGUpCiAjZW5kaWYKIAogI2lmZGVmIENPTkZJR19VTkVWSUNUQUJMRV9MUlUKQEAgLTM3MiwzMSArMzczLDIyIEBACiAjZGVmaW5lIF9fUEdfTUxPQ0tFRAkJMAogI2VuZGlmCiAKLSNkZWZpbmUgUEFHRV9GTEFHUwkoMSA8PCBQR19scnUgICB8IDEgPDwgUEdfcHJpdmF0ZSAgIHwgMSA8PCBQR19sb2NrZWQgfCBcCi0JCQkgMSA8PCBQR19idWRkeSB8IDEgPDwgUEdfd3JpdGViYWNrIHwgXAotCQkJIDEgPDwgUEdfc2xhYiAgfCAxIDw8IFBHX3N3YXBjYWNoZSB8IDEgPDwgUEdfYWN0aXZlIHwgXAotCQkJIF9fUEdfVU5FVklDVEFCTEUgfCBfX1BHX01MT0NLRUQpCi0KLS8qCi0gKiBGbGFncyBjaGVja2VkIGluIGJhZF9wYWdlKCkuICBQYWdlcyBvbiB0aGUgZnJlZSBsaXN0IHNob3VsZCBub3QgaGF2ZQotICogdGhlc2UgZmxhZ3Mgc2V0LiAgSXQgdGhleSBhcmUsIHRoZXJlIGlzIGEgcHJvYmxlbS4KLSAqLwotI2RlZmluZSBQQUdFX0ZMQUdTX0NMRUFSX1dIRU5fQkFEIChQQUdFX0ZMQUdTIHwgXAotCQkxIDw8IFBHX3JlY2xhaW0gfCAxIDw8IFBHX2RpcnR5IHwgMSA8PCBQR19zd2FwYmFja2VkKQotCiAvKgogICogRmxhZ3MgY2hlY2tlZCB3aGVuIGEgcGFnZSBpcyBmcmVlZC4gIFBhZ2VzIGJlaW5nIGZyZWVkIHNob3VsZCBub3QgaGF2ZQogICogdGhlc2UgZmxhZ3Mgc2V0LiAgSXQgdGhleSBhcmUsIHRoZXJlIGlzIGEgcHJvYmxlbS4KICAqLwotI2RlZmluZSBQQUdFX0ZMQUdTX0NIRUNLX0FUX0ZSRUUgKFBBR0VfRkxBR1MgfCAxIDw8IFBHX3Jlc2VydmVkKQorI2RlZmluZSBQQUdFX0ZMQUdTX0NIRUNLX0FUX0ZSRUUgXAorCSgxIDw8IFBHX2xydSAgIHwgMSA8PCBQR19wcml2YXRlICAgfCAxIDw8IFBHX2xvY2tlZCB8IFwKKwkgMSA8PCBQR19idWRkeSB8IDEgPDwgUEdfd3JpdGViYWNrIHwgMSA8PCBQR19yZXNlcnZlZCB8IFwKKwkgMSA8PCBQR19zbGFiICB8IDEgPDwgUEdfc3dhcGNhY2hlIHwgMSA8PCBQR19hY3RpdmUgfCBcCisJIF9fUEdfVU5FVklDVEFCTEUgfCBfX1BHX01MT0NLRUQpCiAKIC8qCiAgKiBGbGFncyBjaGVja2VkIHdoZW4gYSBwYWdlIGlzIHByZXBwZWQgZm9yIHJldHVybiBieSB0aGUgcGFnZSBhbGxvY2F0b3IuCi0gKiBQYWdlcyBiZWluZyBwcmVwcGVkIHNob3VsZCBub3QgaGF2ZSB0aGVzZSBmbGFncyBzZXQuICBJdCB0aGV5IGFyZSwgdGhlcmUKLSAqIGlzIGEgcHJvYmxlbS4KKyAqIFBhZ2VzIGJlaW5nIHByZXBwZWQgc2hvdWxkIG5vdCBoYXZlIGFueSBmbGFncyBzZXQuICBJdCB0aGV5IGFyZSBzZXQsCisgKiB0aGVyZSBoYXMgYmVlbiBhIGtlcm5lbCBidWcgb3Igc3RydWN0IHBhZ2UgY29ycnVwdGlvbi4KICAqLwotI2RlZmluZSBQQUdFX0ZMQUdTX0NIRUNLX0FUX1BSRVAgKFBBR0VfRkxBR1MgfCBcCi0JCTEgPDwgUEdfcmVzZXJ2ZWQgfCAxIDw8IFBHX2RpcnR5IHwgMSA8PCBQR19zd2FwYmFja2VkKQorI2RlZmluZSBQQUdFX0ZMQUdTX0NIRUNLX0FUX1BSRVAJKCgxIDw8IE5SX1BBR0VGTEFHUykgLSAxKQogCiAjZW5kaWYgLyogIV9fR0VORVJBVElOR19CT1VORFNfSCAqLwogI2VuZGlmCS8qIFBBR0VfRkxBR1NfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wYWdlX2Nncm91cC5oIGIvaW5jbHVkZS9saW51eC9wYWdlX2Nncm91cC5oCmluZGV4IDFlNmQzNGIuLjYwMmNjMWYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcGFnZV9jZ3JvdXAuaAorKysgYi9pbmNsdWRlL2xpbnV4L3BhZ2VfY2dyb3VwLmgKQEAgLTI2LDEwICsyNiw2IEBACiAJUENHX0xPQ0ssICAvKiBwYWdlIGNncm91cCBpcyBsb2NrZWQgKi8KIAlQQ0dfQ0FDSEUsIC8qIGNoYXJnZWQgYXMgY2FjaGUgKi8KIAlQQ0dfVVNFRCwgLyogdGhpcyBvYmplY3QgaXMgaW4gdXNlLiAqLwotCS8qIGZsYWdzIGZvciBMUlUgcGxhY2VtZW50ICovCi0JUENHX0FDVElWRSwgLyogcGFnZSBpcyBhY3RpdmUgaW4gdGhpcyBjZ3JvdXAgKi8KLQlQQ0dfRklMRSwgLyogcGFnZSBpcyBmaWxlIHN5c3RlbSBiYWNrZWQgKi8KLQlQQ0dfVU5FVklDVEFCTEUsIC8qIHBhZ2UgaXMgdW5ldmljdGFibGVhYmxlICovCiB9OwogCiAjZGVmaW5lIFRFU1RQQ0dGTEFHKHVuYW1lLCBsbmFtZSkJCQlcCkBAIC01MCwxOSArNDYsNiBAQAogVEVTVFBDR0ZMQUcoVXNlZCwgVVNFRCkKIENMRUFSUENHRkxBRyhVc2VkLCBVU0VEKQogCi0vKiBMUlUgbWFuYWdlbWVudCBmbGFncyAoZnJvbSBnbG9iYWwtbHJ1IGRlZmluaXRpb24pICovCi1URVNUUENHRkxBRyhGaWxlLCBGSUxFKQotU0VUUENHRkxBRyhGaWxlLCBGSUxFKQotQ0xFQVJQQ0dGTEFHKEZpbGUsIEZJTEUpCi0KLVRFU1RQQ0dGTEFHKEFjdGl2ZSwgQUNUSVZFKQotU0VUUENHRkxBRyhBY3RpdmUsIEFDVElWRSkKLUNMRUFSUENHRkxBRyhBY3RpdmUsIEFDVElWRSkKLQotVEVTVFBDR0ZMQUcoVW5ldmljdGFibGUsIFVORVZJQ1RBQkxFKQotU0VUUENHRkxBRyhVbmV2aWN0YWJsZSwgVU5FVklDVEFCTEUpCi1DTEVBUlBDR0ZMQUcoVW5ldmljdGFibGUsIFVORVZJQ1RBQkxFKQotCiBzdGF0aWMgaW5saW5lIGludCBwYWdlX2Nncm91cF9uaWQoc3RydWN0IHBhZ2VfY2dyb3VwICpwYykKIHsKIAlyZXR1cm4gcGFnZV90b19uaWQocGMtPnBhZ2UpOwpAQCAtMTA1LDQgKzg4LDM5IEBACiB9CiAKICNlbmRpZgorCisjaWZkZWYgQ09ORklHX0NHUk9VUF9NRU1fUkVTX0NUTFJfU1dBUAorI2luY2x1ZGUgPGxpbnV4L3N3YXAuaD4KK2V4dGVybiBzdHJ1Y3QgbWVtX2Nncm91cCAqCitzd2FwX2Nncm91cF9yZWNvcmQoc3dwX2VudHJ5X3QgZW50LCBzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtKTsKK2V4dGVybiBzdHJ1Y3QgbWVtX2Nncm91cCAqbG9va3VwX3N3YXBfY2dyb3VwKHN3cF9lbnRyeV90IGVudCk7CitleHRlcm4gaW50IHN3YXBfY2dyb3VwX3N3YXBvbihpbnQgdHlwZSwgdW5zaWduZWQgbG9uZyBtYXhfcGFnZXMpOworZXh0ZXJuIHZvaWQgc3dhcF9jZ3JvdXBfc3dhcG9mZihpbnQgdHlwZSk7CisjZWxzZQorI2luY2x1ZGUgPGxpbnV4L3N3YXAuaD4KKworc3RhdGljIGlubGluZQorc3RydWN0IG1lbV9jZ3JvdXAgKnN3YXBfY2dyb3VwX3JlY29yZChzd3BfZW50cnlfdCBlbnQsIHN0cnVjdCBtZW1fY2dyb3VwICptZW0pCit7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbmxpbmUKK3N0cnVjdCBtZW1fY2dyb3VwICpsb29rdXBfc3dhcF9jZ3JvdXAoc3dwX2VudHJ5X3QgZW50KQoreworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW5saW5lIGludAorc3dhcF9jZ3JvdXBfc3dhcG9uKGludCB0eXBlLCB1bnNpZ25lZCBsb25nIG1heF9wYWdlcykKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHN3YXBfY2dyb3VwX3N3YXBvZmYoaW50IHR5cGUpCit7CisJcmV0dXJuOworfQorCisjZW5kaWYKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wYWdldmVjLmggYi9pbmNsdWRlL2xpbnV4L3BhZ2V2ZWMuaAppbmRleCBlOTBhMmNiLi43YjI4ODZmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BhZ2V2ZWMuaAorKysgYi9pbmNsdWRlL2xpbnV4L3BhZ2V2ZWMuaApAQCAtMjEsNyArMjEsNiBAQAogfTsKIAogdm9pZCBfX3BhZ2V2ZWNfcmVsZWFzZShzdHJ1Y3QgcGFnZXZlYyAqcHZlYyk7Ci12b2lkIF9fcGFnZXZlY19yZWxlYXNlX25vbmxydShzdHJ1Y3QgcGFnZXZlYyAqcHZlYyk7CiB2b2lkIF9fcGFnZXZlY19mcmVlKHN0cnVjdCBwYWdldmVjICpwdmVjKTsKIHZvaWQgX19fX3BhZ2V2ZWNfbHJ1X2FkZChzdHJ1Y3QgcGFnZXZlYyAqcHZlYywgZW51bSBscnVfbGlzdCBscnUpOwogdm9pZCBwYWdldmVjX3N0cmlwKHN0cnVjdCBwYWdldmVjICpwdmVjKTsKQEAgLTY5LDEyICs2OCw2IEBACiAJCV9fcGFnZXZlY19yZWxlYXNlKHB2ZWMpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgcGFnZXZlY19yZWxlYXNlX25vbmxydShzdHJ1Y3QgcGFnZXZlYyAqcHZlYykKLXsKLQlpZiAocGFnZXZlY19jb3VudChwdmVjKSkKLQkJX19wYWdldmVjX3JlbGVhc2Vfbm9ubHJ1KHB2ZWMpOwotfQotCiBzdGF0aWMgaW5saW5lIHZvaWQgcGFnZXZlY19mcmVlKHN0cnVjdCBwYWdldmVjICpwdmVjKQogewogCWlmIChwYWdldmVjX2NvdW50KHB2ZWMpKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wY2ktYWNwaS5oIGIvaW5jbHVkZS9saW51eC9wY2ktYWNwaS5oCmluZGV4IDg4Mzc5MjguLjA0MmMxNjYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcGNpLWFjcGkuaAorKysgYi9pbmNsdWRlL2xpbnV4L3BjaS1hY3BpLmgKQEAgLTgsNiArOCw4IEBACiAjaWZuZGVmIF9QQ0lfQUNQSV9IXwogI2RlZmluZSBfUENJX0FDUElfSF8KIAorI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KKwogI2RlZmluZSBPU0NfUVVFUllfVFlQRQkJCTAKICNkZWZpbmUgT1NDX1NVUFBPUlRfVFlQRSAJCTEKICNkZWZpbmUgT1NDX0NPTlRST0xfVFlQRQkJMgpAQCAtNDgsMTUgKzUwLDcgQEAKIAogI2lmZGVmIENPTkZJR19BQ1BJCiBleHRlcm4gYWNwaV9zdGF0dXMgcGNpX29zY19jb250cm9sX3NldChhY3BpX2hhbmRsZSBoYW5kbGUsIHUzMiBmbGFncyk7Ci1leHRlcm4gYWNwaV9zdGF0dXMgX19wY2lfb3NjX3N1cHBvcnRfc2V0KHUzMiBmbGFncywgY29uc3QgY2hhciAqaGlkKTsKLXN0YXRpYyBpbmxpbmUgYWNwaV9zdGF0dXMgcGNpX29zY19zdXBwb3J0X3NldCh1MzIgZmxhZ3MpCi17Ci0JcmV0dXJuIF9fcGNpX29zY19zdXBwb3J0X3NldChmbGFncywgUENJX1JPT1RfSElEX1NUUklORyk7Ci19Ci1zdGF0aWMgaW5saW5lIGFjcGlfc3RhdHVzIHBjaWVfb3NjX3N1cHBvcnRfc2V0KHUzMiBmbGFncykKLXsKLQlyZXR1cm4gX19wY2lfb3NjX3N1cHBvcnRfc2V0KGZsYWdzLCBQQ0lfRVhQUkVTU19ST09UX0hJRF9TVFJJTkcpOwotfQoraW50IHBjaV9hY3BpX29zY19zdXBwb3J0KGFjcGlfaGFuZGxlIGhhbmRsZSwgdTMyIGZsYWdzKTsKIHN0YXRpYyBpbmxpbmUgYWNwaV9oYW5kbGUgYWNwaV9maW5kX3Jvb3RfYnJpZGdlX2hhbmRsZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKIHsKIAkvKiBGaW5kIHJvb3QgaG9zdCBicmlkZ2UgKi8KQEAgLTY2LDYgKzYwLDE1IEBACiAJcmV0dXJuIGFjcGlfZ2V0X3BjaV9yb290YnJpZGdlX2hhbmRsZShwY2lfZG9tYWluX25yKHBkZXYtPmJ1cyksCiAJCQlwZGV2LT5idXMtPm51bWJlcik7CiB9CisKK3N0YXRpYyBpbmxpbmUgYWNwaV9oYW5kbGUgYWNwaV9wY2lfZ2V0X2JyaWRnZV9oYW5kbGUoc3RydWN0IHBjaV9idXMgKnBidXMpCit7CisJaW50IHNlZyA9IHBjaV9kb21haW5fbnIocGJ1cyksIGJ1c25yID0gcGJ1cy0+bnVtYmVyOworCXN0cnVjdCBwY2lfZGV2ICpicmlkZ2UgPSBwYnVzLT5zZWxmOworCWlmIChicmlkZ2UpCisJCXJldHVybiBERVZJQ0VfQUNQSV9IQU5ETEUoJihicmlkZ2UtPmRldikpOworCXJldHVybiBhY3BpX2dldF9wY2lfcm9vdGJyaWRnZV9oYW5kbGUoc2VnLCBidXNucik7Cit9CiAjZWxzZQogI2lmICFkZWZpbmVkKEFFX0VSUk9SKQogdHlwZWRlZiB1MzIgCQlhY3BpX3N0YXR1czsKQEAgLTczLDggKzc2LDYgQEAKICNlbmRpZiAgICAKIHN0YXRpYyBpbmxpbmUgYWNwaV9zdGF0dXMgcGNpX29zY19jb250cm9sX3NldChhY3BpX2hhbmRsZSBoYW5kbGUsIHUzMiBmbGFncykKIHtyZXR1cm4gQUVfRVJST1I7fQotc3RhdGljIGlubGluZSBhY3BpX3N0YXR1cyBwY2lfb3NjX3N1cHBvcnRfc2V0KHUzMiBmbGFncykge3JldHVybiBBRV9FUlJPUjt9IAotc3RhdGljIGlubGluZSBhY3BpX3N0YXR1cyBwY2llX29zY19zdXBwb3J0X3NldCh1MzIgZmxhZ3MpIHtyZXR1cm4gQUVfRVJST1I7fQogc3RhdGljIGlubGluZSBhY3BpX2hhbmRsZSBhY3BpX2ZpbmRfcm9vdF9icmlkZ2VfaGFuZGxlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQogeyByZXR1cm4gTlVMTDsgfQogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BjaS5oIGIvaW5jbHVkZS9saW51eC9wY2kuaAppbmRleCAwM2IwYjhjLi44MGY4YjhiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BjaS5oCisrKyBiL2luY2x1ZGUvbGludXgvcGNpLmgKQEAgLTgyLDcgKzgyLDMwIEBACiAjZGVmaW5lIFBDSV9ETUFfRlJPTURFVklDRQkyCiAjZGVmaW5lIFBDSV9ETUFfTk9ORQkJMwogCi0jZGVmaW5lIERFVklDRV9DT1VOVF9SRVNPVVJDRQkxMgorLyoKKyAqICBGb3IgUENJIGRldmljZXMsIHRoZSByZWdpb24gbnVtYmVycyBhcmUgYXNzaWduZWQgdGhpcyB3YXk6CisgKi8KK2VudW0geworCS8qICMwLTU6IHN0YW5kYXJkIFBDSSByZXNvdXJjZXMgKi8KKwlQQ0lfU1REX1JFU09VUkNFUywKKwlQQ0lfU1REX1JFU09VUkNFX0VORCA9IDUsCisKKwkvKiAjNjogZXhwYW5zaW9uIFJPTSByZXNvdXJjZSAqLworCVBDSV9ST01fUkVTT1VSQ0UsCisKKwkvKiByZXNvdXJjZXMgYXNzaWduZWQgdG8gYnVzZXMgYmVoaW5kIHRoZSBicmlkZ2UgKi8KKyNkZWZpbmUgUENJX0JSSURHRV9SRVNPVVJDRV9OVU0gNAorCisJUENJX0JSSURHRV9SRVNPVVJDRVMsCisJUENJX0JSSURHRV9SRVNPVVJDRV9FTkQgPSBQQ0lfQlJJREdFX1JFU09VUkNFUyArCisJCQkJICBQQ0lfQlJJREdFX1JFU09VUkNFX05VTSAtIDEsCisKKwkvKiB0b3RhbCByZXNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoIGEgUENJIGRldmljZSAqLworCVBDSV9OVU1fUkVTT1VSQ0VTLAorCisJLyogcHJlc2VydmUgdGhpcyBmb3IgY29tcGF0aWJpbGl0eSAqLworCURFVklDRV9DT1VOVF9SRVNPVVJDRQorfTsKIAogdHlwZWRlZiBpbnQgX19iaXR3aXNlIHBjaV9wb3dlcl90OwogCkBAIC0yNzQsMTggKzI5Nyw2IEBACiAJaGxpc3RfYWRkX2hlYWQoJm5ld19jYXAtPm5leHQsICZwY2lfZGV2LT5zYXZlZF9jYXBfc3BhY2UpOwogfQogCi0vKgotICogIEZvciBQQ0kgZGV2aWNlcywgdGhlIHJlZ2lvbiBudW1iZXJzIGFyZSBhc3NpZ25lZCB0aGlzIHdheToKLSAqCi0gKgkwLTUJc3RhbmRhcmQgUENJIHJlZ2lvbnMKLSAqCTYJZXhwYW5zaW9uIFJPTQotICoJNy0xMAlicmlkZ2VzOiBhZGRyZXNzIHNwYWNlIGFzc2lnbmVkIHRvIGJ1c2VzIGJlaGluZCB0aGUgYnJpZGdlCi0gKi8KLQotI2RlZmluZSBQQ0lfUk9NX1JFU09VUkNFCTYKLSNkZWZpbmUgUENJX0JSSURHRV9SRVNPVVJDRVMJNwotI2RlZmluZSBQQ0lfTlVNX1JFU09VUkNFUwkxMQotCiAjaWZuZGVmIFBDSV9CVVNfTlVNX1JFU09VUkNFUwogI2RlZmluZSBQQ0lfQlVTX05VTV9SRVNPVVJDRVMJMTYKICNlbmRpZgpAQCAtMzI1LDYgKzMzNiwxNSBAQAogI2RlZmluZSBwY2lfYnVzX2IobikJbGlzdF9lbnRyeShuLCBzdHJ1Y3QgcGNpX2J1cywgbm9kZSkKICNkZWZpbmUgdG9fcGNpX2J1cyhuKQljb250YWluZXJfb2Yobiwgc3RydWN0IHBjaV9idXMsIGRldikKIAorI2lmZGVmIENPTkZJR19QQ0lfTVNJCitzdGF0aWMgaW5saW5lIGJvb2wgcGNpX2Rldl9tc2lfZW5hYmxlZChzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldikKK3sKKwlyZXR1cm4gcGNpX2Rldi0+bXNpX2VuYWJsZWQgfHwgcGNpX2Rldi0+bXNpeF9lbmFibGVkOworfQorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgYm9vbCBwY2lfZGV2X21zaV9lbmFibGVkKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2KSB7IHJldHVybiBmYWxzZTsgfQorI2VuZGlmCisKIC8qCiAgKiBFcnJvciB2YWx1ZXMgdGhhdCBtYXkgYmUgcmV0dXJuZWQgYnkgUENJIGZ1bmN0aW9ucy4KICAqLwpAQCAtNDIxLDcgKzQ0MSw2IEBACiAJaW50ICAoKnJlc3VtZV9lYXJseSkgKHN0cnVjdCBwY2lfZGV2ICpkZXYpOwogCWludCAgKCpyZXN1bWUpIChzdHJ1Y3QgcGNpX2RldiAqZGV2KTsJICAgICAgICAgICAgICAgIC8qIERldmljZSB3b2tlbiB1cCAqLwogCXZvaWQgKCpzaHV0ZG93bikgKHN0cnVjdCBwY2lfZGV2ICpkZXYpOwotCXN0cnVjdCBwbV9leHRfb3BzICpwbTsKIAlzdHJ1Y3QgcGNpX2Vycm9yX2hhbmRsZXJzICplcnJfaGFuZGxlcjsKIAlzdHJ1Y3QgZGV2aWNlX2RyaXZlcglkcml2ZXI7CiAJc3RydWN0IHBjaV9keW5pZHMgZHluaWRzOwpAQCAtNTMzLDcgKzU1Miw5IEBACiB2b2lkIHBjaV9yZWFkX2JyaWRnZV9iYXNlcyhzdHJ1Y3QgcGNpX2J1cyAqY2hpbGQpOwogc3RydWN0IHJlc291cmNlICpwY2lfZmluZF9wYXJlbnRfcmVzb3VyY2UoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmRldiwKIAkJCQkJICBzdHJ1Y3QgcmVzb3VyY2UgKnJlcyk7Cit1OCBwY2lfc3dpenpsZV9pbnRlcnJ1cHRfcGluKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHBpbik7CiBpbnQgcGNpX2dldF9pbnRlcnJ1cHRfcGluKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHN0cnVjdCBwY2lfZGV2ICoqYnJpZGdlKTsKK3U4IHBjaV9jb21tb25fc3dpenpsZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCAqcGlucCk7CiBleHRlcm4gc3RydWN0IHBjaV9kZXYgKnBjaV9kZXZfZ2V0KHN0cnVjdCBwY2lfZGV2ICpkZXYpOwogZXh0ZXJuIHZvaWQgcGNpX2Rldl9wdXQoc3RydWN0IHBjaV9kZXYgKmRldik7CiBleHRlcm4gdm9pZCBwY2lfcmVtb3ZlX2J1cyhzdHJ1Y3QgcGNpX2J1cyAqYik7CkBAIC02MzAsNiArNjUxLDcgQEAKIAogdm9pZCBwY2lfZGlzYWJsZV9kZXZpY2Uoc3RydWN0IHBjaV9kZXYgKmRldik7CiB2b2lkIHBjaV9zZXRfbWFzdGVyKHN0cnVjdCBwY2lfZGV2ICpkZXYpOwordm9pZCBwY2lfY2xlYXJfbWFzdGVyKHN0cnVjdCBwY2lfZGV2ICpkZXYpOwogaW50IHBjaV9zZXRfcGNpZV9yZXNldF9zdGF0ZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBlbnVtIHBjaWVfcmVzZXRfc3RhdGUgc3RhdGUpOwogI2RlZmluZSBIQVZFX1BDSV9TRVRfTVdJCiBpbnQgX19tdXN0X2NoZWNrIHBjaV9zZXRfbXdpKHN0cnVjdCBwY2lfZGV2ICpkZXYpOwpAQCAtNjQ4LDcgKzY3MCw3IEBACiBpbnQgcGNpZV9zZXRfcmVhZHJxKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBycSk7CiBpbnQgcGNpX3Jlc2V0X2Z1bmN0aW9uKHN0cnVjdCBwY2lfZGV2ICpkZXYpOwogaW50IHBjaV9leGVjdXRlX3Jlc2V0X2Z1bmN0aW9uKHN0cnVjdCBwY2lfZGV2ICpkZXYpOwotdm9pZCBwY2lfdXBkYXRlX3Jlc291cmNlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHN0cnVjdCByZXNvdXJjZSAqcmVzLCBpbnQgcmVzbm8pOwordm9pZCBwY2lfdXBkYXRlX3Jlc291cmNlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCByZXNubyk7CiBpbnQgX19tdXN0X2NoZWNrIHBjaV9hc3NpZ25fcmVzb3VyY2Uoc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IGkpOwogaW50IHBjaV9zZWxlY3RfYmFycyhzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1bnNpZ25lZCBsb25nIGZsYWdzKTsKIApAQCAtNjc1LDYgKzY5NywxMSBAQAogLyogRnVuY3Rpb25zIGZvciBQQ0kgSG90cGx1ZyBkcml2ZXJzIHRvIHVzZSAqLwogaW50IHBjaV9idXNfZmluZF9jYXBhYmlsaXR5KHN0cnVjdCBwY2lfYnVzICpidXMsIHVuc2lnbmVkIGludCBkZXZmbiwgaW50IGNhcCk7CiAKKy8qIFZpdGFsIHByb2R1Y3QgZGF0YSByb3V0aW5lcyAqLworc3NpemVfdCBwY2lfcmVhZF92cGQoc3RydWN0IHBjaV9kZXYgKmRldiwgbG9mZl90IHBvcywgc2l6ZV90IGNvdW50LCB2b2lkICpidWYpOworc3NpemVfdCBwY2lfd3JpdGVfdnBkKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGxvZmZfdCBwb3MsIHNpemVfdCBjb3VudCwgY29uc3Qgdm9pZCAqYnVmKTsKK2ludCBwY2lfdnBkX3RydW5jYXRlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHNpemVfdCBzaXplKTsKKwogLyogSGVscGVyIGZ1bmN0aW9ucyBmb3IgbG93LWxldmVsIGNvZGUgKGRyaXZlcnMvcGNpL3NldHVwLVtidXMscmVzXS5jKSAqLwogdm9pZCBwY2lfYnVzX2Fzc2lnbl9yZXNvdXJjZXMoc3RydWN0IHBjaV9idXMgKmJ1cyk7CiB2b2lkIHBjaV9idXNfc2l6ZV9icmlkZ2VzKHN0cnVjdCBwY2lfYnVzICpidXMpOwpAQCAtNjg3LDEwICs3MTQsMTMgQEAKIAkJICAgIGludCAoKikoc3RydWN0IHBjaV9kZXYgKiwgdTgsIHU4KSk7CiAjZGVmaW5lIEhBVkVfUENJX1JFUV9SRUdJT05TCTIKIGludCBfX211c3RfY2hlY2sgcGNpX3JlcXVlc3RfcmVnaW9ucyhzdHJ1Y3QgcGNpX2RldiAqLCBjb25zdCBjaGFyICopOworaW50IF9fbXVzdF9jaGVjayBwY2lfcmVxdWVzdF9yZWdpb25zX2V4Y2x1c2l2ZShzdHJ1Y3QgcGNpX2RldiAqLCBjb25zdCBjaGFyICopOwogdm9pZCBwY2lfcmVsZWFzZV9yZWdpb25zKHN0cnVjdCBwY2lfZGV2ICopOwogaW50IF9fbXVzdF9jaGVjayBwY2lfcmVxdWVzdF9yZWdpb24oc3RydWN0IHBjaV9kZXYgKiwgaW50LCBjb25zdCBjaGFyICopOworaW50IF9fbXVzdF9jaGVjayBwY2lfcmVxdWVzdF9yZWdpb25fZXhjbHVzaXZlKHN0cnVjdCBwY2lfZGV2ICosIGludCwgY29uc3QgY2hhciAqKTsKIHZvaWQgcGNpX3JlbGVhc2VfcmVnaW9uKHN0cnVjdCBwY2lfZGV2ICosIGludCk7CiBpbnQgcGNpX3JlcXVlc3Rfc2VsZWN0ZWRfcmVnaW9ucyhzdHJ1Y3QgcGNpX2RldiAqLCBpbnQsIGNvbnN0IGNoYXIgKik7CitpbnQgcGNpX3JlcXVlc3Rfc2VsZWN0ZWRfcmVnaW9uc19leGNsdXNpdmUoc3RydWN0IHBjaV9kZXYgKiwgaW50LCBjb25zdCBjaGFyICopOwogdm9pZCBwY2lfcmVsZWFzZV9zZWxlY3RlZF9yZWdpb25zKHN0cnVjdCBwY2lfZGV2ICosIGludCk7CiAKIC8qIGRyaXZlcnMvcGNpL2J1cy5jICovCkBAIC03ODAsNiArODEwLDEwIEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBwY2lfcmVzdG9yZV9tc2lfc3RhdGUoc3RydWN0IHBjaV9kZXYgKmRldikKIHsgfQorc3RhdGljIGlubGluZSBpbnQgcGNpX21zaV9lbmFibGVkKHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CiAjZWxzZQogZXh0ZXJuIGludCBwY2lfZW5hYmxlX21zaShzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKIGV4dGVybiB2b2lkIHBjaV9tc2lfc2h1dGRvd24oc3RydWN0IHBjaV9kZXYgKmRldik7CkBAIC03OTAsNiArODI0LDE2IEBACiBleHRlcm4gdm9pZCBwY2lfZGlzYWJsZV9tc2l4KHN0cnVjdCBwY2lfZGV2ICpkZXYpOwogZXh0ZXJuIHZvaWQgbXNpX3JlbW92ZV9wY2lfaXJxX3ZlY3RvcnMoc3RydWN0IHBjaV9kZXYgKmRldik7CiBleHRlcm4gdm9pZCBwY2lfcmVzdG9yZV9tc2lfc3RhdGUoc3RydWN0IHBjaV9kZXYgKmRldik7CitleHRlcm4gaW50IHBjaV9tc2lfZW5hYmxlZCh2b2lkKTsKKyNlbmRpZgorCisjaWZuZGVmIENPTkZJR19QQ0lFQVNQTQorc3RhdGljIGlubGluZSBpbnQgcGNpZV9hc3BtX2VuYWJsZWQodm9pZCkKK3sKKwlyZXR1cm4gMDsKK30KKyNlbHNlCitleHRlcm4gaW50IHBjaWVfYXNwbV9lbmFibGVkKHZvaWQpOwogI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfSFRfSVJRCkBAIC0xMTQxLDIwICsxMTg1LDkgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBwY2lfbW1jZmdfbGF0ZV9pbml0KHZvaWQpIHsgfQogI2VuZGlmCiAKLSNpZmRlZiBDT05GSUdfSEFTX0lPTUVNCi1zdGF0aWMgaW5saW5lIHZvaWQgX19pb21lbSAqcGNpX2lvcmVtYXBfYmFyKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBpbnQgYmFyKQotewotCS8qCi0JICogTWFrZSBzdXJlIHRoZSBCQVIgaXMgYWN0dWFsbHkgYSBtZW1vcnkgcmVzb3VyY2UsIG5vdCBhbiBJTyByZXNvdXJjZQotCSAqLwotCWlmICghKHBjaV9yZXNvdXJjZV9mbGFncyhwZGV2LCBiYXIpICYgSU9SRVNPVVJDRV9NRU0pKSB7Ci0JCVdBUk5fT04oMSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gaW9yZW1hcF9ub2NhY2hlKHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCBiYXIpLAotCQkJCSAgICAgcGNpX3Jlc291cmNlX2xlbihwZGV2LCBiYXIpKTsKLX0KLSNlbmRpZgoraW50IHBjaV9leHRfY2ZnX2F2YWlsKHN0cnVjdCBwY2lfZGV2ICpkZXYpOworCit2b2lkIF9faW9tZW0gKnBjaV9pb3JlbWFwX2JhcihzdHJ1Y3QgcGNpX2RldiAqcGRldiwgaW50IGJhcik7CiAKICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCiAjZW5kaWYgLyogTElOVVhfUENJX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGNpX2hvdHBsdWcuaCBiL2luY2x1ZGUvbGludXgvcGNpX2hvdHBsdWcuaAppbmRleCBhMDBiZDFhLi5mN2NjMjA0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BjaV9ob3RwbHVnLmgKKysrIGIvaW5jbHVkZS9saW51eC9wY2lfaG90cGx1Zy5oCkBAIC0yMjgsNiArMjI4LDggQEAKIAkJCQlzdHJ1Y3QgaG90cGx1Z19wYXJhbXMgKmhwcCk7CiBpbnQgYWNwaV9nZXRfaHBfaHdfY29udHJvbF9mcm9tX2Zpcm13YXJlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHUzMiBmbGFncyk7CiBpbnQgYWNwaV9yb290X2JyaWRnZShhY3BpX2hhbmRsZSBoYW5kbGUpOworaW50IGFjcGlfcGNpX2NoZWNrX2VqZWN0YWJsZShzdHJ1Y3QgcGNpX2J1cyAqcGJ1cywgYWNwaV9oYW5kbGUgaGFuZGxlKTsKK2ludCBhY3BpX3BjaV9kZXRlY3RfZWplY3RhYmxlKHN0cnVjdCBwY2lfYnVzICpwYnVzKTsKICNlbmRpZgogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGNpX2lkcy5oIGIvaW5jbHVkZS9saW51eC9wY2lfaWRzLmgKaW5kZXggMjE4YzczYi4uZDU0MzM2NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wY2lfaWRzLmgKKysrIGIvaW5jbHVkZS9saW51eC9wY2lfaWRzLmgKQEAgLTE2NTgsNiArMTY1OCw3IEBACiAjZGVmaW5lIFBDSV9WRU5ET1JfSURfUk9DS1dFTEwJCTB4MTI3QQogCiAjZGVmaW5lIFBDSV9WRU5ET1JfSURfSVRFCQkweDEyODMKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JVEVfODE3MgkJMHg4MTcyCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSVRFXzgyMTEJCTB4ODIxMQogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lURV84MjEyCQkweDgyMTIKICNkZWZpbmUgUENJX0RFVklDRV9JRF9JVEVfODIxMwkJMHg4MjEzCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BjaV9yZWdzLmggYi9pbmNsdWRlL2xpbnV4L3BjaV9yZWdzLmgKaW5kZXggZTVlZmZkNC4uMDI3ODE1YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wY2lfcmVncy5oCisrKyBiL2luY2x1ZGUvbGludXgvcGNpX3JlZ3MuaApAQCAtMjEwLDYgKzIxMCw3IEBACiAjZGVmaW5lICBQQ0lfQ0FQX0lEX0FHUDMJMHgwRQkvKiBBR1AgVGFyZ2V0IFBDSS1QQ0kgYnJpZGdlICovCiAjZGVmaW5lICBQQ0lfQ0FQX0lEX0VYUCAJMHgxMAkvKiBQQ0kgRXhwcmVzcyAqLwogI2RlZmluZSAgUENJX0NBUF9JRF9NU0lYCTB4MTEJLyogTVNJLVggKi8KKyNkZWZpbmUgIFBDSV9DQVBfSURfQUYJCTB4MTMJLyogUENJIEFkdmFuY2VkIEZlYXR1cmVzICovCiAjZGVmaW5lIFBDSV9DQVBfTElTVF9ORVhUCTEJLyogTmV4dCBjYXBhYmlsaXR5IGluIHRoZSBsaXN0ICovCiAjZGVmaW5lIFBDSV9DQVBfRkxBR1MJCTIJLyogQ2FwYWJpbGl0eSBkZWZpbmVkIGZsYWdzICgxNiBiaXRzKSAqLwogI2RlZmluZSBQQ0lfQ0FQX1NJWkVPRgkJNApAQCAtMzE2LDYgKzMxNywxNyBAQAogI2RlZmluZSAgUENJX0NIU1dQX0VYVAkJMHg0MAkvKiBFTlVNIyBzdGF0dXMgLSBleHRyYWN0aW9uICovCiAjZGVmaW5lICBQQ0lfQ0hTV1BfSU5TCQkweDgwCS8qIEVOVU0jIHN0YXR1cyAtIGluc2VydGlvbiAqLwogCisvKiBQQ0kgQWR2YW5jZWQgRmVhdHVyZSByZWdpc3RlcnMgKi8KKworI2RlZmluZSBQQ0lfQUZfTEVOR1RICQkyCisjZGVmaW5lIFBDSV9BRl9DQVAJCTMKKyNkZWZpbmUgIFBDSV9BRl9DQVBfVFAJCTB4MDEKKyNkZWZpbmUgIFBDSV9BRl9DQVBfRkxSCQkweDAyCisjZGVmaW5lIFBDSV9BRl9DVFJMCQk0CisjZGVmaW5lICBQQ0lfQUZfQ1RSTF9GTFIJMHgwMQorI2RlZmluZSBQQ0lfQUZfU1RBVFVTCQk1CisjZGVmaW5lICBQQ0lfQUZfU1RBVFVTX1RQCTB4MDEKKwogLyogUENJLVggcmVnaXN0ZXJzICovCiAKICNkZWZpbmUgUENJX1hfQ01ECQkyCS8qIE1vZGVzICYgRmVhdHVyZXMgKi8KQEAgLTM5OSwyMCArNDExLDcwIEBACiAjZGVmaW5lICBQQ0lfRVhQX0RFVlNUQV9BVVhQRAkweDEwCS8qIEFVWCBQb3dlciBEZXRlY3RlZCAqLwogI2RlZmluZSAgUENJX0VYUF9ERVZTVEFfVFJQTkQJMHgyMAkvKiBUcmFuc2FjdGlvbnMgUGVuZGluZyAqLwogI2RlZmluZSBQQ0lfRVhQX0xOS0NBUAkJMTIJLyogTGluayBDYXBhYmlsaXRpZXMgKi8KLSNkZWZpbmUgIFBDSV9FWFBfTE5LQ0FQX0FTUE1TCTB4YzAwCS8qIEFTUE0gU3VwcG9ydCAqLwotI2RlZmluZSAgUENJX0VYUF9MTktDQVBfTDBTRUwJMHg3MDAwCS8qIEwwcyBFeGl0IExhdGVuY3kgKi8KLSNkZWZpbmUgIFBDSV9FWFBfTE5LQ0FQX0wxRUwJMHgzODAwMAkvKiBMMSBFeGl0IExhdGVuY3kgKi8KLSNkZWZpbmUgIFBDSV9FWFBfTE5LQ0FQX0NMS1BNCTB4NDAwMDAJLyogTDEgQ2xvY2sgUG93ZXIgTWFuYWdlbWVudCAqLworI2RlZmluZSAgUENJX0VYUF9MTktDQVBfU0xTCTB4MDAwMDAwMGYgLyogU3VwcG9ydGVkIExpbmsgU3BlZWRzICovCisjZGVmaW5lICBQQ0lfRVhQX0xOS0NBUF9NTFcJMHgwMDAwMDNmMCAvKiBNYXhpbXVtIExpbmsgV2lkdGggKi8KKyNkZWZpbmUgIFBDSV9FWFBfTE5LQ0FQX0FTUE1TCTB4MDAwMDBjMDAgLyogQVNQTSBTdXBwb3J0ICovCisjZGVmaW5lICBQQ0lfRVhQX0xOS0NBUF9MMFNFTAkweDAwMDA3MDAwIC8qIEwwcyBFeGl0IExhdGVuY3kgKi8KKyNkZWZpbmUgIFBDSV9FWFBfTE5LQ0FQX0wxRUwJMHgwMDAzODAwMCAvKiBMMSBFeGl0IExhdGVuY3kgKi8KKyNkZWZpbmUgIFBDSV9FWFBfTE5LQ0FQX0NMS1BNCTB4MDAwNDAwMDAgLyogTDEgQ2xvY2sgUG93ZXIgTWFuYWdlbWVudCAqLworI2RlZmluZSAgUENJX0VYUF9MTktDQVBfU0RFUkMJMHgwMDA4MDAwMCAvKiBTdXByaXNlIERvd24gRXJyb3IgUmVwb3J0aW5nIENhcGFibGUgKi8KKyNkZWZpbmUgIFBDSV9FWFBfTE5LQ0FQX0RMTExBUkMJMHgwMDEwMDAwMCAvKiBEYXRhIExpbmsgTGF5ZXIgTGluayBBY3RpdmUgUmVwb3J0aW5nIENhcGFibGUgKi8KKyNkZWZpbmUgIFBDSV9FWFBfTE5LQ0FQX0xCTkMJMHgwMDIwMDAwMCAvKiBMaW5rIEJhbmR3aWR0aCBOb3RpZmljYXRpb24gQ2FwYWJpbGl0eSAqLworI2RlZmluZSAgUENJX0VYUF9MTktDQVBfUE4JMHhmZjAwMDAwMCAvKiBQb3J0IE51bWJlciAqLwogI2RlZmluZSBQQ0lfRVhQX0xOS0NUTAkJMTYJLyogTGluayBDb250cm9sICovCi0jZGVmaW5lICBQQ0lfRVhQX0xOS0NUTF9STAkweDIwCS8qIFJldHJhaW4gTGluayAqLwotI2RlZmluZSAgUENJX0VYUF9MTktDVExfQ0NDCTB4NDAJLyogQ29tbW9uIENsb2NrIENPbmZpZ3VyYXRpb24gKi8KKyNkZWZpbmUgIFBDSV9FWFBfTE5LQ1RMX0FTUE1DCTB4MDAwMwkvKiBBU1BNIENvbnRyb2wgKi8KKyNkZWZpbmUgIFBDSV9FWFBfTE5LQ1RMX1JDQgkweDAwMDgJLyogUmVhZCBDb21wbGV0aW9uIEJvdW5kYXJ5ICovCisjZGVmaW5lICBQQ0lfRVhQX0xOS0NUTF9MRAkweDAwMTAJLyogTGluayBEaXNhYmxlICovCisjZGVmaW5lICBQQ0lfRVhQX0xOS0NUTF9STAkweDAwMjAJLyogUmV0cmFpbiBMaW5rICovCisjZGVmaW5lICBQQ0lfRVhQX0xOS0NUTF9DQ0MJMHgwMDQwCS8qIENvbW1vbiBDbG9jayBDb25maWd1cmF0aW9uICovCisjZGVmaW5lICBQQ0lfRVhQX0xOS0NUTF9FUwkweDAwODAJLyogRXh0ZW5kZWQgU3luY2ggKi8KICNkZWZpbmUgIFBDSV9FWFBfTE5LQ1RMX0NMS1JFUV9FTiAweDEwMAkvKiBFbmFibGUgY2xrcmVxICovCisjZGVmaW5lICBQQ0lfRVhQX0xOS0NUTF9IQVdECTB4MDIwMAkvKiBIYXJkd2FyZSBBdXRvbm9tb3VzIFdpZHRoIERpc2FibGUgKi8KKyNkZWZpbmUgIFBDSV9FWFBfTE5LQ1RMX0xCTUlFCTB4MDQwMAkvKiBMaW5rIEJhbmR3aWR0aCBNYW5hZ2VtZW50IEludGVycnVwdCBFbmFibGUgKi8KKyNkZWZpbmUgIFBDSV9FWFBfTE5LQ1RMX0xBQklFCTB4MDgwMAkvKiBMbmsgQXV0b25vbW91cyBCYW5kd2lkdGggSW50ZXJydXB0IEVuYWJsZSAqLwogI2RlZmluZSBQQ0lfRVhQX0xOS1NUQQkJMTgJLyogTGluayBTdGF0dXMgKi8KLSNkZWZpbmUgIFBDSV9FWFBfTE5LU1RBX0xUCTB4ODAwCS8qIExpbmsgVHJhaW5pbmcgKi8KKyNkZWZpbmUgIFBDSV9FWFBfTE5LU1RBX0NMUwkweDAwMGYJLyogQ3VycmVudCBMaW5rIFNwZWVkICovCisjZGVmaW5lICBQQ0lfRVhQX0xOS1NUQV9OTFcJMHgwM2YwCS8qIE5vZ290aWF0ZWQgTGluayBXaWR0aCAqLworI2RlZmluZSAgUENJX0VYUF9MTktTVEFfTFQJMHgwODAwCS8qIExpbmsgVHJhaW5pbmcgKi8KICNkZWZpbmUgIFBDSV9FWFBfTE5LU1RBX1NMQwkweDEwMDAJLyogU2xvdCBDbG9jayBDb25maWd1cmF0aW9uICovCisjZGVmaW5lICBQQ0lfRVhQX0xOS1NUQV9ETExMQQkweDIwMDAJLyogRGF0YSBMaW5rIExheWVyIExpbmsgQWN0aXZlICovCisjZGVmaW5lICBQQ0lfRVhQX0xOS1NUQV9MQk1TCTB4NDAwMAkvKiBMaW5rIEJhbmR3aWR0aCBNYW5hZ2VtZW50IFN0YXR1cyAqLworI2RlZmluZSAgUENJX0VYUF9MTktTVEFfTEFCUwkweDgwMDAJLyogTGluayBBdXRvbm9tb3VzIEJhbmR3aWR0aCBTdGF0dXMgKi8KICNkZWZpbmUgUENJX0VYUF9TTFRDQVAJCTIwCS8qIFNsb3QgQ2FwYWJpbGl0aWVzICovCisjZGVmaW5lICBQQ0lfRVhQX1NMVENBUF9BQlAJMHgwMDAwMDAwMSAvKiBBdHRlbnRpb24gQnV0dG9uIFByZXNlbnQgKi8KKyNkZWZpbmUgIFBDSV9FWFBfU0xUQ0FQX1BDUAkweDAwMDAwMDAyIC8qIFBvd2VyIENvbnRyb2xsZXIgUHJlc2VudCAqLworI2RlZmluZSAgUENJX0VYUF9TTFRDQVBfTVJMU1AJMHgwMDAwMDAwNCAvKiBNUkwgU2Vuc29yIFByZXNlbnQgKi8KKyNkZWZpbmUgIFBDSV9FWFBfU0xUQ0FQX0FJUAkweDAwMDAwMDA4IC8qIEF0dGVudGlvbiBJbmRpY2F0b3IgUHJlc2VudCAqLworI2RlZmluZSAgUENJX0VYUF9TTFRDQVBfUElQCTB4MDAwMDAwMTAgLyogUG93ZXIgSW5kaWNhdG9yIFByZXNlbnQgKi8KKyNkZWZpbmUgIFBDSV9FWFBfU0xUQ0FQX0hQUwkweDAwMDAwMDIwIC8qIEhvdC1QbHVnIFN1cnByaXNlICovCisjZGVmaW5lICBQQ0lfRVhQX1NMVENBUF9IUEMJMHgwMDAwMDA0MCAvKiBIb3QtUGx1ZyBDYXBhYmxlICovCisjZGVmaW5lICBQQ0lfRVhQX1NMVENBUF9TUExWCTB4MDAwMDdmODAgLyogU2xvdCBQb3dlciBMaW1pdCBWYWx1ZSAqLworI2RlZmluZSAgUENJX0VYUF9TTFRDQVBfU1BMUwkweDAwMDE4MDAwIC8qIFNsb3QgUG93ZXIgTGltaXQgU2NhbGUgKi8KKyNkZWZpbmUgIFBDSV9FWFBfU0xUQ0FQX0VJUAkweDAwMDIwMDAwIC8qIEVsZWN0cm9tZWNoYW5pY2FsIEludGVybG9jayBQcmVzZW50ICovCisjZGVmaW5lICBQQ0lfRVhQX1NMVENBUF9OQ0NTCTB4MDAwNDAwMDAgLyogTm8gQ29tbWFuZCBDb21wbGV0ZWQgU3VwcG9ydCAqLworI2RlZmluZSAgUENJX0VYUF9TTFRDQVBfUFNOCTB4ZmZmODAwMDAgLyogUGh5c2ljYWwgU2xvdCBOdW1iZXIgKi8KICNkZWZpbmUgUENJX0VYUF9TTFRDVEwJCTI0CS8qIFNsb3QgQ29udHJvbCAqLworI2RlZmluZSAgUENJX0VYUF9TTFRDVExfQUJQRQkweDAwMDEJLyogQXR0ZW50aW9uIEJ1dHRvbiBQcmVzc2VkIEVuYWJsZSAqLworI2RlZmluZSAgUENJX0VYUF9TTFRDVExfUEZERQkweDAwMDIJLyogUG93ZXIgRmF1bHQgRGV0ZWN0ZWQgRW5hYmxlICovCisjZGVmaW5lICBQQ0lfRVhQX1NMVENUTF9NUkxTQ0UJMHgwMDA0CS8qIE1STCBTZW5zb3IgQ2hhbmdlZCBFbmFibGUgKi8KKyNkZWZpbmUgIFBDSV9FWFBfU0xUQ1RMX1BEQ0UJMHgwMDA4CS8qIFByZXNlbmNlIERldGVjdCBDaGFuZ2VkIEVuYWJsZSAqLworI2RlZmluZSAgUENJX0VYUF9TTFRDVExfQ0NJRQkweDAwMTAJLyogQ29tbWFuZCBDb21wbGV0ZWQgSW50ZXJydXB0IEVuYWJsZSAqLworI2RlZmluZSAgUENJX0VYUF9TTFRDVExfSFBJRQkweDAwMjAJLyogSG90LVBsdWcgSW50ZXJydXB0IEVuYWJsZSAqLworI2RlZmluZSAgUENJX0VYUF9TTFRDVExfQUlDCTB4MDBjMAkvKiBBdHRlbnRpb24gSW5kaWNhdG9yIENvbnRyb2wgKi8KKyNkZWZpbmUgIFBDSV9FWFBfU0xUQ1RMX1BJQwkweDAzMDAJLyogUG93ZXIgSW5kaWNhdG9yIENvbnRyb2wgKi8KKyNkZWZpbmUgIFBDSV9FWFBfU0xUQ1RMX1BDQwkweDA0MDAJLyogUG93ZXIgQ29udHJvbGxlciBDb250cm9sICovCisjZGVmaW5lICBQQ0lfRVhQX1NMVENUTF9FSUMJMHgwODAwCS8qIEVsZWN0cm9tZWNoYW5pY2FsIEludGVybG9jayBDb250cm9sICovCisjZGVmaW5lICBQQ0lfRVhQX1NMVENUTF9ETExTQ0UJMHgxMDAwCS8qIERhdGEgTGluayBMYXllciBTdGF0ZSBDaGFuZ2VkIEVuYWJsZSAqLwogI2RlZmluZSBQQ0lfRVhQX1NMVFNUQQkJMjYJLyogU2xvdCBTdGF0dXMgKi8KKyNkZWZpbmUgIFBDSV9FWFBfU0xUU1RBX0FCUAkweDAwMDEJLyogQXR0ZW50aW9uIEJ1dHRvbiBQcmVzc2VkICovCisjZGVmaW5lICBQQ0lfRVhQX1NMVFNUQV9QRkQJMHgwMDAyCS8qIFBvd2VyIEZhdWx0IERldGVjdGVkICovCisjZGVmaW5lICBQQ0lfRVhQX1NMVFNUQV9NUkxTQwkweDAwMDQJLyogTVJMIFNlbnNvciBDaGFuZ2VkICovCisjZGVmaW5lICBQQ0lfRVhQX1NMVFNUQV9QREMJMHgwMDA4CS8qIFByZXNlbmNlIERldGVjdCBDaGFuZ2VkICovCisjZGVmaW5lICBQQ0lfRVhQX1NMVFNUQV9DQwkweDAwMTAJLyogQ29tbWFuZCBDb21wbGV0ZWQgKi8KKyNkZWZpbmUgIFBDSV9FWFBfU0xUU1RBX01STFNTCTB4MDAyMAkvKiBNUkwgU2Vuc29yIFN0YXRlICovCisjZGVmaW5lICBQQ0lfRVhQX1NMVFNUQV9QRFMJMHgwMDQwCS8qIFByZXNlbmNlIERldGVjdCBTdGF0ZSAqLworI2RlZmluZSAgUENJX0VYUF9TTFRTVEFfRUlTCTB4MDA4MAkvKiBFbGVjdHJvbWVjaGFuaWNhbCBJbnRlcmxvY2sgU3RhdHVzICovCisjZGVmaW5lICBQQ0lfRVhQX1NMVFNUQV9ETExTQwkweDAxMDAJLyogRGF0YSBMaW5rIExheWVyIFN0YXRlIENoYW5nZWQgKi8KICNkZWZpbmUgUENJX0VYUF9SVENUTAkJMjgJLyogUm9vdCBDb250cm9sICovCiAjZGVmaW5lICBQQ0lfRVhQX1JUQ1RMX1NFQ0VFCTB4MDEJLyogU3lzdGVtIEVycm9yIG9uIENvcnJlY3RhYmxlIEVycm9yICovCiAjZGVmaW5lICBQQ0lfRVhQX1JUQ1RMX1NFTkZFRQkweDAyCS8qIFN5c3RlbSBFcnJvciBvbiBOb24tRmF0YWwgRXJyb3IgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGVyY3B1X2NvdW50ZXIuaCBiL2luY2x1ZGUvbGludXgvcGVyY3B1X2NvdW50ZXIuaAppbmRleCA5MDA3Y2NkLi5hNzY4NGE1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BlcmNwdV9jb3VudGVyLmgKKysrIGIvaW5jbHVkZS9saW51eC9wZXJjcHVfY291bnRlci5oCkBAIC0yNCwxNCArMjQsMTggQEAKIAlzMzIgKmNvdW50ZXJzOwogfTsKIAotI2lmIE5SX0NQVVMgPj0gMTYKLSNkZWZpbmUgRkJDX0JBVENICShOUl9DUFVTKjIpCi0jZWxzZQotI2RlZmluZSBGQkNfQkFUQ0gJKE5SX0NQVVMqNCkKLSNlbmRpZgorZXh0ZXJuIGludCBwZXJjcHVfY291bnRlcl9iYXRjaDsKIAotaW50IHBlcmNwdV9jb3VudGVyX2luaXQoc3RydWN0IHBlcmNwdV9jb3VudGVyICpmYmMsIHM2NCBhbW91bnQpOwotaW50IHBlcmNwdV9jb3VudGVyX2luaXRfaXJxKHN0cnVjdCBwZXJjcHVfY291bnRlciAqZmJjLCBzNjQgYW1vdW50KTsKK2ludCBfX3BlcmNwdV9jb3VudGVyX2luaXQoc3RydWN0IHBlcmNwdV9jb3VudGVyICpmYmMsIHM2NCBhbW91bnQsCisJCQkgIHN0cnVjdCBsb2NrX2NsYXNzX2tleSAqa2V5KTsKKworI2RlZmluZSBwZXJjcHVfY291bnRlcl9pbml0KGZiYywgdmFsdWUpCQkJCQlcCisJKHsJCQkJCQkJCVwKKwkJc3RhdGljIHN0cnVjdCBsb2NrX2NsYXNzX2tleSBfX2tleTsJCQlcCisJCQkJCQkJCQlcCisJCV9fcGVyY3B1X2NvdW50ZXJfaW5pdChmYmMsIHZhbHVlLCAmX19rZXkpOwkJXAorCX0pCisKIHZvaWQgcGVyY3B1X2NvdW50ZXJfZGVzdHJveShzdHJ1Y3QgcGVyY3B1X2NvdW50ZXIgKmZiYyk7CiB2b2lkIHBlcmNwdV9jb3VudGVyX3NldChzdHJ1Y3QgcGVyY3B1X2NvdW50ZXIgKmZiYywgczY0IGFtb3VudCk7CiB2b2lkIF9fcGVyY3B1X2NvdW50ZXJfYWRkKHN0cnVjdCBwZXJjcHVfY291bnRlciAqZmJjLCBzNjQgYW1vdW50LCBzMzIgYmF0Y2gpOwpAQCAtMzksNyArNDMsNyBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQgcGVyY3B1X2NvdW50ZXJfYWRkKHN0cnVjdCBwZXJjcHVfY291bnRlciAqZmJjLCBzNjQgYW1vdW50KQogewotCV9fcGVyY3B1X2NvdW50ZXJfYWRkKGZiYywgYW1vdW50LCBGQkNfQkFUQ0gpOworCV9fcGVyY3B1X2NvdW50ZXJfYWRkKGZiYywgYW1vdW50LCBwZXJjcHVfY291bnRlcl9iYXRjaCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgczY0IHBlcmNwdV9jb3VudGVyX3N1bV9wb3NpdGl2ZShzdHJ1Y3QgcGVyY3B1X2NvdW50ZXIgKmZiYykKQEAgLTg1LDggKzg5LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotI2RlZmluZSBwZXJjcHVfY291bnRlcl9pbml0X2lycSBwZXJjcHVfY291bnRlcl9pbml0Ci0KIHN0YXRpYyBpbmxpbmUgdm9pZCBwZXJjcHVfY291bnRlcl9kZXN0cm95KHN0cnVjdCBwZXJjcHVfY291bnRlciAqZmJjKQogewogfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9waWQuaCBiL2luY2x1ZGUvbGludXgvcGlkLmgKaW5kZXggYmIyMDZjNS4uNDlmMWMyZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9waWQuaAorKysgYi9pbmNsdWRlL2xpbnV4L3BpZC5oCkBAIC0xMjMsNiArMTIzLDI0IEBACiBleHRlcm4gdm9pZCBmcmVlX3BpZChzdHJ1Y3QgcGlkICpwaWQpOwogCiAvKgorICogbnNfb2ZfcGlkKCkgcmV0dXJucyB0aGUgcGlkIG5hbWVzcGFjZSBpbiB3aGljaCB0aGUgc3BlY2lmaWVkIHBpZCB3YXMKKyAqIGFsbG9jYXRlZC4KKyAqCisgKiBOT1RFOgorICogCW5zX29mX3BpZCgpIGlzIGV4cGVjdGVkIHRvIGJlIGNhbGxlZCBmb3IgYSBwcm9jZXNzICh0YXNrKSB0aGF0IGhhcworICogCWFuIGF0dGFjaGVkICdzdHJ1Y3QgcGlkJyAoc2VlIGF0dGFjaF9waWQoKSwgZGV0YWNoX3BpZCgpKSBpLmUgQHBpZAorICogCWlzIGV4cGVjdGVkIHRvIGJlIG5vbi1OVUxMLiBJZiBAcGlkIGlzIE5VTEwsIGNhbGxlciBzaG91bGQgaGFuZGxlCisgKiAJdGhlIHJlc3VsdGluZyBOVUxMIHBpZC1ucy4KKyAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgcGlkX25hbWVzcGFjZSAqbnNfb2ZfcGlkKHN0cnVjdCBwaWQgKnBpZCkKK3sKKwlzdHJ1Y3QgcGlkX25hbWVzcGFjZSAqbnMgPSBOVUxMOworCWlmIChwaWQpCisJCW5zID0gcGlkLT5udW1iZXJzW3BpZC0+bGV2ZWxdLm5zOworCXJldHVybiBuczsKK30KKworLyoKICAqIHRoZSBoZWxwZXJzIHRvIGdldCB0aGUgcGlkJ3MgaWQgc2VlbiBmcm9tIGRpZmZlcmVudCBuYW1lc3BhY2VzCiAgKgogICogcGlkX25yKCkgICAgOiBnbG9iYWwgaWQsIGkuZS4gdGhlIGlkIHNlZW4gZnJvbSB0aGUgaW5pdCBuYW1lc3BhY2U7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BpZF9uYW1lc3BhY2UuaCBiL2luY2x1ZGUvbGludXgvcGlkX25hbWVzcGFjZS5oCmluZGV4IGQ4MmZlODIuLjM4ZDEwMzIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcGlkX25hbWVzcGFjZS5oCisrKyBiL2luY2x1ZGUvbGludXgvcGlkX25hbWVzcGFjZS5oCkBAIC03OSwxMSArNzksNyBAQAogfQogI2VuZGlmIC8qIENPTkZJR19QSURfTlMgKi8KIAotc3RhdGljIGlubGluZSBzdHJ1Y3QgcGlkX25hbWVzcGFjZSAqdGFza19hY3RpdmVfcGlkX25zKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKQotewotCXJldHVybiB0c2stPm5zcHJveHktPnBpZF9uczsKLX0KLQorZXh0ZXJuIHN0cnVjdCBwaWRfbmFtZXNwYWNlICp0YXNrX2FjdGl2ZV9waWRfbnMoc3RydWN0IHRhc2tfc3RydWN0ICp0c2spOwogdm9pZCBwaWRoYXNoX2luaXQodm9pZCk7CiB2b2lkIHBpZG1hcF9pbml0KHZvaWQpOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BsYXRmb3JtX2RldmljZS5oIGIvaW5jbHVkZS9saW51eC9wbGF0Zm9ybV9kZXZpY2UuaAppbmRleCA0YjhjYzZhLi45YTM0MjY5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BsYXRmb3JtX2RldmljZS5oCisrKyBiL2luY2x1ZGUvbGludXgvcGxhdGZvcm1fZGV2aWNlLmgKQEAgLTU1LDcgKzU1LDYgQEAKIAlpbnQgKCpzdXNwZW5kX2xhdGUpKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKiwgcG1fbWVzc2FnZV90IHN0YXRlKTsKIAlpbnQgKCpyZXN1bWVfZWFybHkpKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKik7CiAJaW50ICgqcmVzdW1lKShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICopOwotCXN0cnVjdCBwbV9leHRfb3BzICpwbTsKIAlzdHJ1Y3QgZGV2aWNlX2RyaXZlciBkcml2ZXI7CiB9OwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BtLmggYi9pbmNsdWRlL2xpbnV4L3BtLmgKaW5kZXggNDJkZTQwMC4uZGUyZTBhOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wbS5oCisrKyBiL2luY2x1ZGUvbGludXgvcG0uaApAQCAtNDEsNyArNDEsNyBAQAogfSBwbV9tZXNzYWdlX3Q7CiAKIC8qKgotICogc3RydWN0IHBtX29wcyAtIGRldmljZSBQTSBjYWxsYmFja3MKKyAqIHN0cnVjdCBkZXZfcG1fb3BzIC0gZGV2aWNlIFBNIGNhbGxiYWNrcwogICoKICAqIFNldmVyYWwgZHJpdmVyIHBvd2VyIHN0YXRlIHRyYW5zaXRpb25zIGFyZSBleHRlcm5hbGx5IHZpc2libGUsIGFmZmVjdGluZwogICogdGhlIHN0YXRlIG9mIHBlbmRpbmcgSS9PIHF1ZXVlcyBhbmQgKGZvciBkcml2ZXJzIHRoYXQgdG91Y2ggaGFyZHdhcmUpCkBAIC0xMjYsNDYgKzEyNiw2IEBACiAgKglPbiBtb3N0IHBsYXRmb3JtcywgdGhlcmUgYXJlIG5vIHJlc3RyaWN0aW9ucyBvbiBhdmFpbGFiaWxpdHkgb2YKICAqCXJlc291cmNlcyBsaWtlIGNsb2NrcyBkdXJpbmcgQHJlc3RvcmUoKS4KICAqCi0gKiBBbGwgb2YgdGhlIGFib3ZlIGNhbGxiYWNrcywgZXhjZXB0IGZvciBAY29tcGxldGUoKSwgcmV0dXJuIGVycm9yIGNvZGVzLgotICogSG93ZXZlciwgdGhlIGVycm9yIGNvZGVzIHJldHVybmVkIGJ5IHRoZSByZXN1bWUgb3BlcmF0aW9ucywgQHJlc3VtZSgpLAotICogQHRoYXcoKSwgYW5kIEByZXN0b3JlKCksIGRvIG5vdCBjYXVzZSB0aGUgUE0gY29yZSB0byBhYm9ydCB0aGUgcmVzdW1lCi0gKiB0cmFuc2l0aW9uIGR1cmluZyB3aGljaCB0aGV5IGFyZSByZXR1cm5lZC4gIFRoZSBlcnJvciBjb2RlcyByZXR1cm5lZCBpbgotICogdGhhdCBjYXNlcyBhcmUgb25seSBwcmludGVkIGJ5IHRoZSBQTSBjb3JlIHRvIHRoZSBzeXN0ZW0gbG9ncyBmb3IgZGVidWdnaW5nCi0gKiBwdXJwb3Nlcy4gIFN0aWxsLCBpdCBpcyByZWNvbW1lbmRlZCB0aGF0IGRyaXZlcnMgb25seSByZXR1cm4gZXJyb3IgY29kZXMKLSAqIGZyb20gdGhlaXIgcmVzdW1lIG1ldGhvZHMgaW4gY2FzZSBvZiBhbiB1bnJlY292ZXJhYmxlIGZhaWx1cmUgKGkuZS4gd2hlbiB0aGUKLSAqIGRldmljZSBiZWluZyBoYW5kbGVkIHJlZnVzZXMgdG8gcmVzdW1lIGFuZCBiZWNvbWVzIHVudXNhYmxlKSB0byBhbGxvdyB1cyB0bwotICogbW9kaWZ5IHRoZSBQTSBjb3JlIGluIHRoZSBmdXR1cmUsIHNvIHRoYXQgaXQgY2FuIGF2b2lkIGF0dGVtcHRpbmcgdG8gaGFuZGxlCi0gKiBkZXZpY2VzIHRoYXQgZmFpbGVkIHRvIHJlc3VtZSBhbmQgdGhlaXIgY2hpbGRyZW4uCi0gKgotICogSXQgaXMgYWxsb3dlZCB0byB1bnJlZ2lzdGVyIGRldmljZXMgd2hpbGUgdGhlIGFib3ZlIGNhbGxiYWNrcyBhcmUgYmVpbmcKLSAqIGV4ZWN1dGVkLiAgSG93ZXZlciwgaXQgaXMgbm90IGFsbG93ZWQgdG8gdW5yZWdpc3RlciBhIGRldmljZSBmcm9tIHdpdGhpbiBhbnkKLSAqIG9mIGl0cyBvd24gY2FsbGJhY2tzLgotICovCi0KLXN0cnVjdCBwbV9vcHMgewotCWludCAoKnByZXBhcmUpKHN0cnVjdCBkZXZpY2UgKmRldik7Ci0Jdm9pZCAoKmNvbXBsZXRlKShzdHJ1Y3QgZGV2aWNlICpkZXYpOwotCWludCAoKnN1c3BlbmQpKHN0cnVjdCBkZXZpY2UgKmRldik7Ci0JaW50ICgqcmVzdW1lKShzdHJ1Y3QgZGV2aWNlICpkZXYpOwotCWludCAoKmZyZWV6ZSkoc3RydWN0IGRldmljZSAqZGV2KTsKLQlpbnQgKCp0aGF3KShzdHJ1Y3QgZGV2aWNlICpkZXYpOwotCWludCAoKnBvd2Vyb2ZmKShzdHJ1Y3QgZGV2aWNlICpkZXYpOwotCWludCAoKnJlc3RvcmUpKHN0cnVjdCBkZXZpY2UgKmRldik7Ci19OwotCi0vKioKLSAqIHN0cnVjdCBwbV9leHRfb3BzIC0gZXh0ZW5kZWQgZGV2aWNlIFBNIGNhbGxiYWNrcwotICoKLSAqIFNvbWUgZGV2aWNlcyByZXF1aXJlIGNlcnRhaW4gb3BlcmF0aW9ucyByZWxhdGVkIHRvIHN1c3BlbmQgYW5kIGhpYmVybmF0aW9uCi0gKiB0byBiZSBjYXJyaWVkIG91dCB3aXRoIGludGVycnVwdHMgZGlzYWJsZWQuICBUaHVzLCAnc3RydWN0IHBtX2V4dF9vcHMnIGJlbG93Ci0gKiBpcyBkZWZpbmVkLCBhZGRpbmcgY2FsbGJhY2tzIHRvIGJlIGV4ZWN1dGVkIHdpdGggaW50ZXJydXB0cyBkaXNhYmxlZCB0bwotICogJ3N0cnVjdCBwbV9vcHMnLgotICoKLSAqIFRoZSBmb2xsb3dpbmcgY2FsbGJhY2tzIGluY2x1ZGVkIGluICdzdHJ1Y3QgcG1fZXh0X29wcycgYXJlIGV4ZWN1dGVkIHdpdGgKLSAqIHRoZSBub25ib290IENQVXMgc3dpdGNoZWQgb2ZmIGFuZCB3aXRoIGludGVycnVwdHMgZGlzYWJsZWQgb24gdGhlIG9ubHkKLSAqIGZ1bmN0aW9uYWwgQ1BVLiAgVGhleSBhbHNvIGFyZSBleGVjdXRlZCB3aXRoIHRoZSBQTSBjb3JlIGxpc3Qgb2YgZGV2aWNlcwotICogbG9ja2VkLCBzbyB0aGV5IG11c3QgTk9UIHVucmVnaXN0ZXIgYW55IGRldmljZXMuCi0gKgogICogQHN1c3BlbmRfbm9pcnE6IENvbXBsZXRlIHRoZSBvcGVyYXRpb25zIG9mIC0+c3VzcGVuZCgpIGJ5IGNhcnJ5aW5nIG91dCBhbnkKICAqCWFjdGlvbnMgcmVxdWlyZWQgZm9yIHN1c3BlbmRpbmcgdGhlIGRldmljZSB0aGF0IG5lZWQgaW50ZXJydXB0cyB0byBiZQogICoJZGlzYWJsZWQKQEAgLTE5MCwxOCArMTUwLDMyIEBACiAgKglhY3Rpb25zIHJlcXVpcmVkIGZvciByZXN0b3JpbmcgdGhlIG9wZXJhdGlvbnMgb2YgdGhlIGRldmljZSB0aGF0IG5lZWQKICAqCWludGVycnVwdHMgdG8gYmUgZGlzYWJsZWQKICAqCi0gKiBBbGwgb2YgdGhlIGFib3ZlIGNhbGxiYWNrcyByZXR1cm4gZXJyb3IgY29kZXMsIGJ1dCB0aGUgZXJyb3IgY29kZXMgcmV0dXJuZWQKLSAqIGJ5IHRoZSByZXN1bWUgb3BlcmF0aW9ucywgQHJlc3VtZV9ub2lycSgpLCBAdGhhd19ub2lycSgpLCBhbmQKLSAqIEByZXN0b3JlX25vaXJxKCksIGRvIG5vdCBjYXVzZSB0aGUgUE0gY29yZSB0byBhYm9ydCB0aGUgcmVzdW1lIHRyYW5zaXRpb24KLSAqIGR1cmluZyB3aGljaCB0aGV5IGFyZSByZXR1cm5lZC4gIFRoZSBlcnJvciBjb2RlcyByZXR1cm5lZCBpbiB0aGF0IGNhc2VzIGFyZQotICogb25seSBwcmludGVkIGJ5IHRoZSBQTSBjb3JlIHRvIHRoZSBzeXN0ZW0gbG9ncyBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLgotICogU3RpbGwsIGFzIHN0YXRlZCBhYm92ZSwgaXQgaXMgcmVjb21tZW5kZWQgdGhhdCBkcml2ZXJzIG9ubHkgcmV0dXJuIGVycm9yCi0gKiBjb2RlcyBmcm9tIHRoZWlyIHJlc3VtZSBtZXRob2RzIGlmIHRoZSBkZXZpY2UgYmVpbmcgaGFuZGxlZCBmYWlscyB0byByZXN1bWUKLSAqIGFuZCBpcyBub3QgdXNhYmxlIGFueSBtb3JlLgorICogQWxsIG9mIHRoZSBhYm92ZSBjYWxsYmFja3MsIGV4Y2VwdCBmb3IgQGNvbXBsZXRlKCksIHJldHVybiBlcnJvciBjb2Rlcy4KKyAqIEhvd2V2ZXIsIHRoZSBlcnJvciBjb2RlcyByZXR1cm5lZCBieSB0aGUgcmVzdW1lIG9wZXJhdGlvbnMsIEByZXN1bWUoKSwKKyAqIEB0aGF3KCksIEByZXN0b3JlKCksIEByZXN1bWVfbm9pcnEoKSwgQHRoYXdfbm9pcnEoKSwgYW5kIEByZXN0b3JlX25vaXJxKCkgZG8KKyAqIG5vdCBjYXVzZSB0aGUgUE0gY29yZSB0byBhYm9ydCB0aGUgcmVzdW1lIHRyYW5zaXRpb24gZHVyaW5nIHdoaWNoIHRoZXkgYXJlCisgKiByZXR1cm5lZC4gIFRoZSBlcnJvciBjb2RlcyByZXR1cm5lZCBpbiB0aGF0IGNhc2VzIGFyZSBvbmx5IHByaW50ZWQgYnkgdGhlIFBNCisgKiBjb3JlIHRvIHRoZSBzeXN0ZW0gbG9ncyBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLiAgU3RpbGwsIGl0IGlzIHJlY29tbWVuZGVkCisgKiB0aGF0IGRyaXZlcnMgb25seSByZXR1cm4gZXJyb3IgY29kZXMgZnJvbSB0aGVpciByZXN1bWUgbWV0aG9kcyBpbiBjYXNlIG9mIGFuCisgKiB1bnJlY292ZXJhYmxlIGZhaWx1cmUgKGkuZS4gd2hlbiB0aGUgZGV2aWNlIGJlaW5nIGhhbmRsZWQgcmVmdXNlcyB0byByZXN1bWUKKyAqIGFuZCBiZWNvbWVzIHVudXNhYmxlKSB0byBhbGxvdyB1cyB0byBtb2RpZnkgdGhlIFBNIGNvcmUgaW4gdGhlIGZ1dHVyZSwgc28KKyAqIHRoYXQgaXQgY2FuIGF2b2lkIGF0dGVtcHRpbmcgdG8gaGFuZGxlIGRldmljZXMgdGhhdCBmYWlsZWQgdG8gcmVzdW1lIGFuZAorICogdGhlaXIgY2hpbGRyZW4uCisgKgorICogSXQgaXMgYWxsb3dlZCB0byB1bnJlZ2lzdGVyIGRldmljZXMgd2hpbGUgdGhlIGFib3ZlIGNhbGxiYWNrcyBhcmUgYmVpbmcKKyAqIGV4ZWN1dGVkLiAgSG93ZXZlciwgaXQgaXMgbm90IGFsbG93ZWQgdG8gdW5yZWdpc3RlciBhIGRldmljZSBmcm9tIHdpdGhpbiBhbnkKKyAqIG9mIGl0cyBvd24gY2FsbGJhY2tzLgogICovCiAKLXN0cnVjdCBwbV9leHRfb3BzIHsKLQlzdHJ1Y3QgcG1fb3BzIGJhc2U7CitzdHJ1Y3QgZGV2X3BtX29wcyB7CisJaW50ICgqcHJlcGFyZSkoc3RydWN0IGRldmljZSAqZGV2KTsKKwl2b2lkICgqY29tcGxldGUpKHN0cnVjdCBkZXZpY2UgKmRldik7CisJaW50ICgqc3VzcGVuZCkoc3RydWN0IGRldmljZSAqZGV2KTsKKwlpbnQgKCpyZXN1bWUpKHN0cnVjdCBkZXZpY2UgKmRldik7CisJaW50ICgqZnJlZXplKShzdHJ1Y3QgZGV2aWNlICpkZXYpOworCWludCAoKnRoYXcpKHN0cnVjdCBkZXZpY2UgKmRldik7CisJaW50ICgqcG93ZXJvZmYpKHN0cnVjdCBkZXZpY2UgKmRldik7CisJaW50ICgqcmVzdG9yZSkoc3RydWN0IGRldmljZSAqZGV2KTsKIAlpbnQgKCpzdXNwZW5kX25vaXJxKShzdHJ1Y3QgZGV2aWNlICpkZXYpOwogCWludCAoKnJlc3VtZV9ub2lycSkoc3RydWN0IGRldmljZSAqZGV2KTsKIAlpbnQgKCpmcmVlemVfbm9pcnEpKHN0cnVjdCBkZXZpY2UgKmRldik7CkBAIC0yNzgsNyArMjUyLDcgQEAKICNkZWZpbmUgUE1fRVZFTlRfU0xFRVAJCShQTV9FVkVOVF9TVVNQRU5EIHwgUE1fRVZFTlRfSElCRVJOQVRFKQogI2RlZmluZSBQTV9FVkVOVF9VU0VSX1NVU1BFTkQJKFBNX0VWRU5UX1VTRVIgfCBQTV9FVkVOVF9TVVNQRU5EKQogI2RlZmluZSBQTV9FVkVOVF9VU0VSX1JFU1VNRQkoUE1fRVZFTlRfVVNFUiB8IFBNX0VWRU5UX1JFU1VNRSkKLSNkZWZpbmUgUE1fRVZFTlRfUkVNT1RFX1dBS0VVUAkoUE1fRVZFTlRfUkVNT1RFIHwgUE1fRVZFTlRfUkVTVU1FKQorI2RlZmluZSBQTV9FVkVOVF9SRU1PVEVfUkVTVU1FCShQTV9FVkVOVF9SRU1PVEUgfCBQTV9FVkVOVF9SRVNVTUUpCiAjZGVmaW5lIFBNX0VWRU5UX0FVVE9fU1VTUEVORAkoUE1fRVZFTlRfQVVUTyB8IFBNX0VWRU5UX1NVU1BFTkQpCiAjZGVmaW5lIFBNX0VWRU5UX0FVVE9fUkVTVU1FCShQTV9FVkVOVF9BVVRPIHwgUE1fRVZFTlRfUkVTVU1FKQogCkBAIC0yOTEsMTUgKzI2NSwxNSBAQAogI2RlZmluZSBQTVNHX1RIQVcJKChzdHJ1Y3QgcG1fbWVzc2FnZSl7IC5ldmVudCA9IFBNX0VWRU5UX1RIQVcsIH0pCiAjZGVmaW5lIFBNU0dfUkVTVE9SRQkoKHN0cnVjdCBwbV9tZXNzYWdlKXsgLmV2ZW50ID0gUE1fRVZFTlRfUkVTVE9SRSwgfSkKICNkZWZpbmUgUE1TR19SRUNPVkVSCSgoc3RydWN0IHBtX21lc3NhZ2UpeyAuZXZlbnQgPSBQTV9FVkVOVF9SRUNPVkVSLCB9KQotI2RlZmluZSBQTVNHX1VTRVJfU1VTUEVORAkoKHN0cnVjdCBwbV9tZXNzZ2UpIFwKKyNkZWZpbmUgUE1TR19VU0VSX1NVU1BFTkQJKChzdHJ1Y3QgcG1fbWVzc2FnZSkgXAogCQkJCQl7IC5ldmVudCA9IFBNX0VWRU5UX1VTRVJfU1VTUEVORCwgfSkKLSNkZWZpbmUgUE1TR19VU0VSX1JFU1VNRQkoKHN0cnVjdCBwbV9tZXNzZ2UpIFwKKyNkZWZpbmUgUE1TR19VU0VSX1JFU1VNRQkoKHN0cnVjdCBwbV9tZXNzYWdlKSBcCiAJCQkJCXsgLmV2ZW50ID0gUE1fRVZFTlRfVVNFUl9SRVNVTUUsIH0pCi0jZGVmaW5lIFBNU0dfUkVNT1RFX1JFU1VNRQkoKHN0cnVjdCBwbV9tZXNzZ2UpIFwKKyNkZWZpbmUgUE1TR19SRU1PVEVfUkVTVU1FCSgoc3RydWN0IHBtX21lc3NhZ2UpIFwKIAkJCQkJeyAuZXZlbnQgPSBQTV9FVkVOVF9SRU1PVEVfUkVTVU1FLCB9KQotI2RlZmluZSBQTVNHX0FVVE9fU1VTUEVORAkoKHN0cnVjdCBwbV9tZXNzZ2UpIFwKKyNkZWZpbmUgUE1TR19BVVRPX1NVU1BFTkQJKChzdHJ1Y3QgcG1fbWVzc2FnZSkgXAogCQkJCQl7IC5ldmVudCA9IFBNX0VWRU5UX0FVVE9fU1VTUEVORCwgfSkKLSNkZWZpbmUgUE1TR19BVVRPX1JFU1VNRQkJKChzdHJ1Y3QgcG1fbWVzc2dlKSBcCisjZGVmaW5lIFBNU0dfQVVUT19SRVNVTUUJKChzdHJ1Y3QgcG1fbWVzc2FnZSkgXAogCQkJCQl7IC5ldmVudCA9IFBNX0VWRU5UX0FVVE9fUkVTVU1FLCB9KQogCiAvKioKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcG9sbC5oIGIvaW5jbHVkZS9saW51eC9wb2xsLmgKaW5kZXggYmFkZDk4YS4uOGMyNGVmOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wb2xsLmgKKysrIGIvaW5jbHVkZS9saW51eC9wb2xsLmgKQEAgLTQ2LDkgKzQ2LDkgQEAKIH0KIAogc3RydWN0IHBvbGxfdGFibGVfZW50cnkgewotCXN0cnVjdCBmaWxlICogZmlscDsKKwlzdHJ1Y3QgZmlsZSAqZmlscDsKIAl3YWl0X3F1ZXVlX3Qgd2FpdDsKLQl3YWl0X3F1ZXVlX2hlYWRfdCAqIHdhaXRfYWRkcmVzczsKKwl3YWl0X3F1ZXVlX2hlYWRfdCAqd2FpdF9hZGRyZXNzOwogfTsKIAogLyoKQEAgLTU2LDcgKzU2LDkgQEAKICAqLwogc3RydWN0IHBvbGxfd3F1ZXVlcyB7CiAJcG9sbF90YWJsZSBwdDsKLQlzdHJ1Y3QgcG9sbF90YWJsZV9wYWdlICogdGFibGU7CisJc3RydWN0IHBvbGxfdGFibGVfcGFnZSAqdGFibGU7CisJc3RydWN0IHRhc2tfc3RydWN0ICpwb2xsaW5nX3Rhc2s7CisJaW50IHRyaWdnZXJlZDsKIAlpbnQgZXJyb3I7CiAJaW50IGlubGluZV9pbmRleDsKIAlzdHJ1Y3QgcG9sbF90YWJsZV9lbnRyeSBpbmxpbmVfZW50cmllc1tOX0lOTElORV9QT0xMX0VOVFJJRVNdOwpAQCAtNjQsNiArNjYsMTMgQEAKIAogZXh0ZXJuIHZvaWQgcG9sbF9pbml0d2FpdChzdHJ1Y3QgcG9sbF93cXVldWVzICpwd3EpOwogZXh0ZXJuIHZvaWQgcG9sbF9mcmVld2FpdChzdHJ1Y3QgcG9sbF93cXVldWVzICpwd3EpOworZXh0ZXJuIGludCBwb2xsX3NjaGVkdWxlX3RpbWVvdXQoc3RydWN0IHBvbGxfd3F1ZXVlcyAqcHdxLCBpbnQgc3RhdGUsCisJCQkJIGt0aW1lX3QgKmV4cGlyZXMsIHVuc2lnbmVkIGxvbmcgc2xhY2spOworCitzdGF0aWMgaW5saW5lIGludCBwb2xsX3NjaGVkdWxlKHN0cnVjdCBwb2xsX3dxdWV1ZXMgKnB3cSwgaW50IHN0YXRlKQoreworCXJldHVybiBwb2xsX3NjaGVkdWxlX3RpbWVvdXQocHdxLCBzdGF0ZSwgTlVMTCwgMCk7Cit9CiAKIC8qCiAgKiBTY2FsZWFibGUgdmVyc2lvbiBvZiB0aGUgZmRfc2V0LgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wb3dlcl9zdXBwbHkuaCBiL2luY2x1ZGUvbGludXgvcG93ZXJfc3VwcGx5LmgKaW5kZXggZjkzNDhjYi4uOGZmMjVlMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wb3dlcl9zdXBwbHkuaAorKysgYi9pbmNsdWRlL2xpbnV4L3Bvd2VyX3N1cHBseS5oCkBAIC00NSw2ICs0NSw3IEBACiAJUE9XRVJfU1VQUExZX0hFQUxUSF9ERUFELAogCVBPV0VSX1NVUFBMWV9IRUFMVEhfT1ZFUlZPTFRBR0UsCiAJUE9XRVJfU1VQUExZX0hFQUxUSF9VTlNQRUNfRkFJTFVSRSwKKwlQT1dFUl9TVVBQTFlfSEVBTFRIX0NPTEQsCiB9OwogCiBlbnVtIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcW54NF9mcy5oIGIvaW5jbHVkZS9saW51eC9xbng0X2ZzLmgKaW5kZXggMzRhMTk2ZS4uNzg3ZDE5ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9xbng0X2ZzLmgKKysrIGIvaW5jbHVkZS9saW51eC9xbng0X2ZzLmgKQEAgLTIsMTQgKzIsMTIgQEAKICAqICBOYW1lICAgICAgICAgICAgICAgICAgICAgICAgIDogcW54NF9mcy5oCiAgKiAgQXV0aG9yICAgICAgICAgICAgICAgICAgICAgICA6IFJpY2hhcmQgRnJvd2lqbgogICogIEZ1bmN0aW9uICAgICAgICAgICAgICAgICAgICAgOiBxbng0IGdsb2JhbCBmaWxlc3lzdGVtIGRlZmluaXRpb25zCi0gKiAgVmVyc2lvbiAgICAgICAgICAgICAgICAgICAgICA6IDEuMC4yCi0gKiAgTGFzdCBtb2RpZmllZCAgICAgICAgICAgICAgICA6IDIwMDAtMDEtMzEKLSAqCiAgKiAgSGlzdG9yeSAgICAgICAgICAgICAgICAgICAgICA6IDIzLTAzLTE5OTggY3JlYXRlZAogICovCiAjaWZuZGVmIF9MSU5VWF9RTlg0X0ZTX0gKICNkZWZpbmUgX0xJTlVYX1FOWDRfRlNfSAogCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9xbnh0eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L21hZ2ljLmg+CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcW54dHlwZXMuaCBiL2luY2x1ZGUvbGludXgvcW54dHlwZXMuaAppbmRleCBhM2ViMTEzLi5iZWJiZTVjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3FueHR5cGVzLmgKKysrIGIvaW5jbHVkZS9saW51eC9xbnh0eXBlcy5oCkBAIC0yLDkgKzIsNiBAQAogICogIE5hbWUgICAgICAgICAgICAgICAgICAgICAgICAgOiBxbnh0eXBlcy5oCiAgKiAgQXV0aG9yICAgICAgICAgICAgICAgICAgICAgICA6IFJpY2hhcmQgRnJvd2lqbgogICogIEZ1bmN0aW9uICAgICAgICAgICAgICAgICAgICAgOiBzdGFuZGFyZCBxbnggdHlwZXMKLSAqICBWZXJzaW9uICAgICAgICAgICAgICAgICAgICAgIDogMS4wLjIKLSAqICBMYXN0IG1vZGlmaWVkICAgICAgICAgICAgICAgIDogMjAwMC0wMS0wNgotICoKICAqICBIaXN0b3J5ICAgICAgICAgICAgICAgICAgICAgIDogMjItMDMtMTk5OCBjcmVhdGVkCiAgKgogICovCkBAIC0xMiw2ICs5LDggQEAKICNpZm5kZWYgX1FOWDRUWVBFU19ICiAjZGVmaW5lIF9RTlg0VFlQRVNfSAogCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKwogdHlwZWRlZiBfX2xlMTYgcW54NF9ueHRudF90OwogdHlwZWRlZiBfX3U4ICBxbng0X2Z0eXBlX3Q7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcXVvdGEuaCBiL2luY2x1ZGUvbGludXgvcXVvdGEuaAppbmRleCA0MDQwMWI1Li5kNzJkNWQ4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3F1b3RhLmgKKysrIGIvaW5jbHVkZS9saW51eC9xdW90YS5oCkBAIC0zNiwxNyArMzYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KIAotI2RlZmluZSBfX0RRVU9UX1ZFUlNJT05fXwkiZHF1b3RfNi41LjEiCi0jZGVmaW5lIF9fRFFVT1RfTlVNX1ZFUlNJT05fXwk2KjEwMDAwKzUqMTAwKzEKLQotLyogU2l6ZSBvZiBibG9ja3MgaW4gd2hpY2ggYXJlIGNvdW50ZWQgc2l6ZSBsaW1pdHMgKi8KLSNkZWZpbmUgUVVPVEFCTE9DS19CSVRTIDEwCi0jZGVmaW5lIFFVT1RBQkxPQ0tfU0laRSAoMSA8PCBRVU9UQUJMT0NLX0JJVFMpCi0KLS8qIENvbnZlcnNpb24gcm91dGluZXMgZnJvbSBhbmQgdG8gcXVvdGEgYmxvY2tzICovCi0jZGVmaW5lIHFiMmtiKHgpICgoeCkgPDwgKFFVT1RBQkxPQ0tfQklUUy0xMCkpCi0jZGVmaW5lIGtiMnFiKHgpICgoeCkgPj4gKFFVT1RBQkxPQ0tfQklUUy0xMCkpCi0jZGVmaW5lIHRvcWIoeCkgKCgoeCkgKyBRVU9UQUJMT0NLX1NJWkUgLSAxKSA+PiBRVU9UQUJMT0NLX0JJVFMpCisjZGVmaW5lIF9fRFFVT1RfVkVSU0lPTl9fCSJkcXVvdF82LjUuMiIKIAogI2RlZmluZSBNQVhRVU9UQVMgMgogI2RlZmluZSBVU1JRVU9UQSAgMAkJLyogZWxlbWVudCB1c2VkIGZvciB1c2VyIHF1b3RhcyAqLwpAQCAtODAsMTYgKzcwLDM0IEBACiAjZGVmaW5lIFFfR0VUUVVPVEEgMHg4MDAwMDcJLyogZ2V0IHVzZXIgcXVvdGEgc3RydWN0dXJlICovCiAjZGVmaW5lIFFfU0VUUVVPVEEgMHg4MDAwMDgJLyogc2V0IHVzZXIgcXVvdGEgc3RydWN0dXJlICovCiAKKy8qIFF1b3RhIGZvcm1hdCB0eXBlIElEcyAqLworI2RlZmluZQlRRk1UX1ZGU19PTEQgMQorI2RlZmluZQlRRk1UX1ZGU19WMCAyCisKKy8qIFNpemUgb2YgYmxvY2sgaW4gd2hpY2ggc3BhY2UgbGltaXRzIGFyZSBwYXNzZWQgdGhyb3VnaCB0aGUgcXVvdGEKKyAqIGludGVyZmFjZSAqLworI2RlZmluZSBRSUZfRFFCTEtTSVpFX0JJVFMgMTAKKyNkZWZpbmUgUUlGX0RRQkxLU0laRSAoMSA8PCBRSUZfRFFCTEtTSVpFX0JJVFMpCisKIC8qCiAgKiBRdW90YSBzdHJ1Y3R1cmUgdXNlZCBmb3IgY29tbXVuaWNhdGlvbiB3aXRoIHVzZXJzcGFjZSB2aWEgcXVvdGFjdGwKICAqIEZvbGxvd2luZyBmbGFncyBhcmUgdXNlZCB0byBzcGVjaWZ5IHdoaWNoIGZpZWxkcyBhcmUgdmFsaWQKICAqLwotI2RlZmluZSBRSUZfQkxJTUlUUwkxCi0jZGVmaW5lIFFJRl9TUEFDRQkyCi0jZGVmaW5lIFFJRl9JTElNSVRTCTQKLSNkZWZpbmUgUUlGX0lOT0RFUwk4Ci0jZGVmaW5lIFFJRl9CVElNRQkxNgotI2RlZmluZSBRSUZfSVRJTUUJMzIKK2VudW0geworCVFJRl9CTElNSVRTX0IgPSAwLAorCVFJRl9TUEFDRV9CLAorCVFJRl9JTElNSVRTX0IsCisJUUlGX0lOT0RFU19CLAorCVFJRl9CVElNRV9CLAorCVFJRl9JVElNRV9CLAorfTsKKworI2RlZmluZSBRSUZfQkxJTUlUUwkoMSA8PCBRSUZfQkxJTUlUU19CKQorI2RlZmluZSBRSUZfU1BBQ0UJKDEgPDwgUUlGX1NQQUNFX0IpCisjZGVmaW5lIFFJRl9JTElNSVRTCSgxIDw8IFFJRl9JTElNSVRTX0IpCisjZGVmaW5lIFFJRl9JTk9ERVMJKDEgPDwgUUlGX0lOT0RFU19CKQorI2RlZmluZSBRSUZfQlRJTUUJKDEgPDwgUUlGX0JUSU1FX0IpCisjZGVmaW5lIFFJRl9JVElNRQkoMSA8PCBRSUZfSVRJTUVfQikKICNkZWZpbmUgUUlGX0xJTUlUUwkoUUlGX0JMSU1JVFMgfCBRSUZfSUxJTUlUUykKICNkZWZpbmUgUUlGX1VTQUdFCShRSUZfU1BBQ0UgfCBRSUZfSU5PREVTKQogI2RlZmluZSBRSUZfVElNRVMJKFFJRl9CVElNRSB8IFFJRl9JVElNRSkKQEAgLTE3Miw3ICsxODAsNyBAQAogI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KIAogdHlwZWRlZiBfX2tlcm5lbF91aWQzMl90IHFpZF90OyAvKiBUeXBlIGluIHdoaWNoIHdlIHN0b3JlIGlkcyBpbiBtZW1vcnkgKi8KLXR5cGVkZWYgX191NjQgcXNpemVfdDsgICAgICAgICAgLyogVHlwZSBpbiB3aGljaCB3ZSBzdG9yZSBzaXplcyAqLwordHlwZWRlZiBsb25nIGxvbmcgcXNpemVfdDsJLyogVHlwZSBpbiB3aGljaCB3ZSBzdG9yZSBzaXplcyAqLwogCiBleHRlcm4gc3BpbmxvY2tfdCBkcV9kYXRhX2xvY2s7CiAKQEAgLTE4NywxMiArMTk1LDEyIEBACiAgKiBEYXRhIGZvciBvbmUgdXNlci9ncm91cCBrZXB0IGluIG1lbW9yeQogICovCiBzdHJ1Y3QgbWVtX2RxYmxrIHsKLQlfX3UzMiBkcWJfYmhhcmRsaW1pdDsJLyogYWJzb2x1dGUgbGltaXQgb24gZGlzayBibGtzIGFsbG9jICovCi0JX191MzIgZHFiX2Jzb2Z0bGltaXQ7CS8qIHByZWZlcnJlZCBsaW1pdCBvbiBkaXNrIGJsa3MgKi8KKwlxc2l6ZV90IGRxYl9iaGFyZGxpbWl0OwkvKiBhYnNvbHV0ZSBsaW1pdCBvbiBkaXNrIGJsa3MgYWxsb2MgKi8KKwlxc2l6ZV90IGRxYl9ic29mdGxpbWl0OwkvKiBwcmVmZXJyZWQgbGltaXQgb24gZGlzayBibGtzICovCiAJcXNpemVfdCBkcWJfY3Vyc3BhY2U7CS8qIGN1cnJlbnQgdXNlZCBzcGFjZSAqLwotCV9fdTMyIGRxYl9paGFyZGxpbWl0OwkvKiBhYnNvbHV0ZSBsaW1pdCBvbiBhbGxvY2F0ZWQgaW5vZGVzICovCi0JX191MzIgZHFiX2lzb2Z0bGltaXQ7CS8qIHByZWZlcnJlZCBpbm9kZSBsaW1pdCAqLwotCV9fdTMyIGRxYl9jdXJpbm9kZXM7CS8qIGN1cnJlbnQgIyBhbGxvY2F0ZWQgaW5vZGVzICovCisJcXNpemVfdCBkcWJfaWhhcmRsaW1pdDsJLyogYWJzb2x1dGUgbGltaXQgb24gYWxsb2NhdGVkIGlub2RlcyAqLworCXFzaXplX3QgZHFiX2lzb2Z0bGltaXQ7CS8qIHByZWZlcnJlZCBpbm9kZSBsaW1pdCAqLworCXFzaXplX3QgZHFiX2N1cmlub2RlczsJLyogY3VycmVudCAjIGFsbG9jYXRlZCBpbm9kZXMgKi8KIAl0aW1lX3QgZHFiX2J0aW1lOwkvKiB0aW1lIGxpbWl0IGZvciBleGNlc3NpdmUgZGlzayB1c2UgKi8KIAl0aW1lX3QgZHFiX2l0aW1lOwkvKiB0aW1lIGxpbWl0IGZvciBleGNlc3NpdmUgaW5vZGUgdXNlICovCiB9OwpAQCAtMjEyLDEwICsyMjAsNyBAQAogCXVuc2lnbmVkIGludCBkcWlfaWdyYWNlOwogCXFzaXplX3QgZHFpX21heGJsaW1pdDsKIAlxc2l6ZV90IGRxaV9tYXhpbGltaXQ7Ci0JdW5pb24gewotCQlzdHJ1Y3QgdjFfbWVtX2RxaW5mbyB2MV9pOwotCQlzdHJ1Y3QgdjJfbWVtX2RxaW5mbyB2Ml9pOwotCX0gdTsKKwl2b2lkICpkcWlfcHJpdjsKIH07CiAKIHN0cnVjdCBzdXBlcl9ibG9jazsKQEAgLTI0OSw2ICsyNTQsMTEgQEAKICNkZWZpbmUgRFFfRkFLRV9CCTMJLyogbm8gbGltaXRzIG9ubHkgdXNhZ2UgKi8KICNkZWZpbmUgRFFfUkVBRF9CCTQJLyogZHF1b3Qgd2FzIHJlYWQgaW50byBtZW1vcnkgKi8KICNkZWZpbmUgRFFfQUNUSVZFX0IJNQkvKiBkcXVvdCBpcyBhY3RpdmUgKGRxdW90X3JlbGVhc2Ugbm90IGNhbGxlZCkgKi8KKyNkZWZpbmUgRFFfTEFTVFNFVF9CCTYJLyogRm9sbG93aW5nIDYgYml0cyAoc2VlIFFJRl8pIGFyZSByZXNlcnZlZFwKKwkJCQkgKiBmb3IgdGhlIG1hc2sgb2YgZW50cmllcyBzZXQgdmlhIFNFVFFVT1RBXAorCQkJCSAqIHF1b3RhY3RsLiBUaGV5IGFyZSBzZXQgdW5kZXIgZHFfZGF0YV9sb2NrXAorCQkJCSAqIGFuZCB0aGUgcXVvdGEgZm9ybWF0IGhhbmRsaW5nIGRxdW90IGNhblwKKwkJCQkgKiBjbGVhciB0aGVtIHdoZW4gaXQgc2VlcyBmaXQuICovCiAKIHN0cnVjdCBkcXVvdCB7CiAJc3RydWN0IGhsaXN0X25vZGUgZHFfaGFzaDsJLyogSGFzaCBsaXN0IGluIG1lbW9yeSAqLwpAQCAtMjg3LDExICsyOTcsMTMgQEAKIAlpbnQgKCppbml0aWFsaXplKSAoc3RydWN0IGlub2RlICosIGludCk7CiAJaW50ICgqZHJvcCkgKHN0cnVjdCBpbm9kZSAqKTsKIAlpbnQgKCphbGxvY19zcGFjZSkgKHN0cnVjdCBpbm9kZSAqLCBxc2l6ZV90LCBpbnQpOwotCWludCAoKmFsbG9jX2lub2RlKSAoY29uc3Qgc3RydWN0IGlub2RlICosIHVuc2lnbmVkIGxvbmcpOworCWludCAoKmFsbG9jX2lub2RlKSAoY29uc3Qgc3RydWN0IGlub2RlICosIHFzaXplX3QpOwogCWludCAoKmZyZWVfc3BhY2UpIChzdHJ1Y3QgaW5vZGUgKiwgcXNpemVfdCk7Ci0JaW50ICgqZnJlZV9pbm9kZSkgKGNvbnN0IHN0cnVjdCBpbm9kZSAqLCB1bnNpZ25lZCBsb25nKTsKKwlpbnQgKCpmcmVlX2lub2RlKSAoY29uc3Qgc3RydWN0IGlub2RlICosIHFzaXplX3QpOwogCWludCAoKnRyYW5zZmVyKSAoc3RydWN0IGlub2RlICosIHN0cnVjdCBpYXR0ciAqKTsKIAlpbnQgKCp3cml0ZV9kcXVvdCkgKHN0cnVjdCBkcXVvdCAqKTsJCS8qIE9yZGluYXJ5IGRxdW90IHdyaXRlICovCisJc3RydWN0IGRxdW90ICooKmFsbG9jX2RxdW90KShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgaW50KTsJLyogQWxsb2NhdGUgbWVtb3J5IGZvciBuZXcgZHF1b3QgKi8KKwl2b2lkICgqZGVzdHJveV9kcXVvdCkoc3RydWN0IGRxdW90ICopOwkJLyogRnJlZSBtZW1vcnkgZm9yIGRxdW90ICovCiAJaW50ICgqYWNxdWlyZV9kcXVvdCkgKHN0cnVjdCBkcXVvdCAqKTsJCS8qIFF1b3RhIGlzIGdvaW5nIHRvIGJlIGNyZWF0ZWQgb24gZGlzayAqLwogCWludCAoKnJlbGVhc2VfZHF1b3QpIChzdHJ1Y3QgZHF1b3QgKik7CQkvKiBRdW90YSBpcyBnb2luZyB0byBiZSBkZWxldGVkIGZyb20gZGlzayAqLwogCWludCAoKm1hcmtfZGlydHkpIChzdHJ1Y3QgZHF1b3QgKik7CQkvKiBEcXVvdCBpcyBtYXJrZWQgZGlydHkgKi8KQEAgLTMyMCwxMiArMzMyLDQyIEBACiAJc3RydWN0IHF1b3RhX2Zvcm1hdF90eXBlICpxZl9uZXh0OwogfTsKIAotI2RlZmluZSBEUVVPVF9VU1JfRU5BQkxFRAkweDAxCQkvKiBVc2VyIGRpc2txdW90YXMgZW5hYmxlZCAqLwotI2RlZmluZSBEUVVPVF9HUlBfRU5BQkxFRAkweDAyCQkvKiBHcm91cCBkaXNrcXVvdGFzIGVuYWJsZWQgKi8KLSNkZWZpbmUgRFFVT1RfVVNSX1NVU1BFTkRFRAkweDA0CQkvKiBVc2VyIGRpc2txdW90YXMgYXJlIG9mZiwgYnV0CisvKiBRdW90YSBzdGF0ZSBmbGFncyAtIHRoZXkgYWN0dWFsbHkgY29tZSBpbiB0d28gZmxhdm9ycyAtIGZvciB1c2VycyBhbmQgZ3JvdXBzICovCitlbnVtIHsKKwlfRFFVT1RfVVNBR0VfRU5BQkxFRCA9IDAsCQkvKiBUcmFjayBkaXNrIHVzYWdlIGZvciB1c2VycyAqLworCV9EUVVPVF9MSU1JVFNfRU5BQkxFRCwJCQkvKiBFbmZvcmNlIHF1b3RhIGxpbWl0cyBmb3IgdXNlcnMgKi8KKwlfRFFVT1RfU1VTUEVOREVELAkJCS8qIFVzZXIgZGlza3F1b3RhcyBhcmUgb2ZmLCBidXQKIAkJCQkJCSAqIHdlIGhhdmUgbmVjZXNzYXJ5IGluZm8gaW4KIAkJCQkJCSAqIG1lbW9yeSB0byB0dXJuIHRoZW0gb24gKi8KLSNkZWZpbmUgRFFVT1RfR1JQX1NVU1BFTkRFRAkweDA4CQkvKiBUaGUgc2FtZSBmb3IgZ3JvdXAgcXVvdGFzICovCisJX0RRVU9UX1NUQVRFX0ZMQUdTCit9OworI2RlZmluZSBEUVVPVF9VU0FHRV9FTkFCTEVECSgxIDw8IF9EUVVPVF9VU0FHRV9FTkFCTEVEKQorI2RlZmluZSBEUVVPVF9MSU1JVFNfRU5BQkxFRAkoMSA8PCBfRFFVT1RfTElNSVRTX0VOQUJMRUQpCisjZGVmaW5lIERRVU9UX1NVU1BFTkRFRAkJKDEgPDwgX0RRVU9UX1NVU1BFTkRFRCkKKyNkZWZpbmUgRFFVT1RfU1RBVEVfRkxBR1MJKERRVU9UX1VTQUdFX0VOQUJMRUQgfCBEUVVPVF9MSU1JVFNfRU5BQkxFRCB8IFwKKwkJCQkgRFFVT1RfU1VTUEVOREVEKQorLyogT3RoZXIgcXVvdGEgZmxhZ3MgKi8KKyNkZWZpbmUgRFFVT1RfUVVPVEFfU1lTX0ZJTEUJKDEgPDwgNikJLyogUXVvdGEgZmlsZSBpcyBhIHNwZWNpYWwKKwkJCQkJCSAqIHN5c3RlbSBmaWxlIGFuZCB1c2VyIGNhbm5vdAorCQkJCQkJICogdG91Y2ggaXQuIEZpbGVzeXN0ZW0gaXMKKwkJCQkJCSAqIHJlc3BvbnNpYmxlIGZvciBzZXR0aW5nCisJCQkJCQkgKiBTX05PUVVPVEEsIFNfTk9BVElNRSBmbGFncworCQkJCQkJICovCisjZGVmaW5lIERRVU9UX05FR0FUSVZFX1VTQUdFCSgxIDw8IDcpCS8qIEFsbG93IG5lZ2F0aXZlIHF1b3RhIHVzYWdlICovCisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGRxdW90X3N0YXRlX2ZsYWcodW5zaWduZWQgaW50IGZsYWdzLCBpbnQgdHlwZSkKK3sKKwlpZiAodHlwZSA9PSBVU1JRVU9UQSkKKwkJcmV0dXJuIGZsYWdzOworCXJldHVybiBmbGFncyA8PCBfRFFVT1RfU1RBVEVfRkxBR1M7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGRxdW90X2dlbmVyaWNfZmxhZyh1bnNpZ25lZCBpbnQgZmxhZ3MsIGludCB0eXBlKQoreworCWlmICh0eXBlID09IFVTUlFVT1RBKQorCQlyZXR1cm4gZmxhZ3M7CisJcmV0dXJuIGZsYWdzID4+IF9EUVVPVF9TVEFURV9GTEFHUzsKK30KIAogc3RydWN0IHF1b3RhX2luZm8gewogCXVuc2lnbmVkIGludCBmbGFnczsJCQkvKiBGbGFncyBmb3IgZGlza3F1b3RhcyBvbiB0aGlzIGRldmljZSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9xdW90YWlvX3YyLmggYi9pbmNsdWRlL2xpbnV4L3F1b3RhaW9fdjIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzAzZDdjYi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2xpbnV4L3F1b3RhaW9fdjIuaAorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qCi0gKglEZWZpbml0aW9ucyBvZiBzdHJ1Y3R1cmVzIGZvciB2ZnN2MCBxdW90YSBmb3JtYXQKLSAqLwotCi0jaWZuZGVmIF9MSU5VWF9RVU9UQUlPX1YyX0gKLSNkZWZpbmUgX0xJTlVYX1FVT1RBSU9fVjJfSAotCi0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9xdW90YS5oPgotCi0vKgotICogRGVmaW5pdGlvbnMgb2YgbWFnaWNzIGFuZCB2ZXJzaW9ucyBvZiBjdXJyZW50IHF1b3RhIGZpbGVzCi0gKi8KLSNkZWZpbmUgVjJfSU5JVFFNQUdJQ1Mge1wKLQkweGQ5YzAxZjExLAkvKiBVU1JRVU9UQSAqL1wKLQkweGQ5YzAxOTI3CS8qIEdSUFFVT1RBICovXAotfQotCi0jZGVmaW5lIFYyX0lOSVRRVkVSU0lPTlMge1wKLQkwLAkJLyogVVNSUVVPVEEgKi9cCi0JMAkJLyogR1JQUVVPVEEgKi9cCi19Ci0KLS8qCi0gKiBUaGUgZm9sbG93aW5nIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSBmb3JtYXQgb2YgdGhlIGRpc2sgcXVvdGEgZmlsZQotICogKGFzIGl0IGFwcGVhcnMgb24gZGlzaykgLSB0aGUgZmlsZSBpcyBhIHJhZGl4IHRyZWUgd2hvc2UgbGVhdmVzIHBvaW50Ci0gKiB0byBibG9ja3Mgb2YgdGhlc2Ugc3RydWN0dXJlcy4KLSAqLwotc3RydWN0IHYyX2Rpc2tfZHFibGsgewotCV9fbGUzMiBkcWJfaWQ7CQkvKiBpZCB0aGlzIHF1b3RhIGFwcGxpZXMgdG8gKi8KLQlfX2xlMzIgZHFiX2loYXJkbGltaXQ7CS8qIGFic29sdXRlIGxpbWl0IG9uIGFsbG9jYXRlZCBpbm9kZXMgKi8KLQlfX2xlMzIgZHFiX2lzb2Z0bGltaXQ7CS8qIHByZWZlcnJlZCBpbm9kZSBsaW1pdCAqLwotCV9fbGUzMiBkcWJfY3VyaW5vZGVzOwkvKiBjdXJyZW50ICMgYWxsb2NhdGVkIGlub2RlcyAqLwotCV9fbGUzMiBkcWJfYmhhcmRsaW1pdDsJLyogYWJzb2x1dGUgbGltaXQgb24gZGlzayBzcGFjZSAoaW4gUVVPVEFCTE9DS19TSVpFKSAqLwotCV9fbGUzMiBkcWJfYnNvZnRsaW1pdDsJLyogcHJlZmVycmVkIGxpbWl0IG9uIGRpc2sgc3BhY2UgKGluIFFVT1RBQkxPQ0tfU0laRSkgKi8KLQlfX2xlNjQgZHFiX2N1cnNwYWNlOwkvKiBjdXJyZW50IHNwYWNlIG9jY3VwaWVkIChpbiBieXRlcykgKi8KLQlfX2xlNjQgZHFiX2J0aW1lOwkvKiB0aW1lIGxpbWl0IGZvciBleGNlc3NpdmUgZGlzayB1c2UgKi8KLQlfX2xlNjQgZHFiX2l0aW1lOwkvKiB0aW1lIGxpbWl0IGZvciBleGNlc3NpdmUgaW5vZGUgdXNlICovCi19OwotCi0vKgotICogSGVyZSBhcmUgaGVhZGVyIHN0cnVjdHVyZXMgYXMgd3JpdHRlbiBvbiBkaXNrIGFuZCB0aGVpciBpbi1tZW1vcnkgY29waWVzCi0gKi8KLS8qIEZpcnN0IGdlbmVyaWMgaGVhZGVyICovCi1zdHJ1Y3QgdjJfZGlza19kcWhlYWRlciB7Ci0JX19sZTMyIGRxaF9tYWdpYzsJLyogTWFnaWMgbnVtYmVyIGlkZW50aWZ5aW5nIGZpbGUgKi8KLQlfX2xlMzIgZHFoX3ZlcnNpb247CS8qIEZpbGUgdmVyc2lvbiAqLwotfTsKLQotLyogSGVhZGVyIHdpdGggdHlwZSBhbmQgdmVyc2lvbiBzcGVjaWZpYyBpbmZvcm1hdGlvbiAqLwotc3RydWN0IHYyX2Rpc2tfZHFpbmZvIHsKLQlfX2xlMzIgZHFpX2JncmFjZTsJLyogVGltZSBiZWZvcmUgYmxvY2sgc29mdCBsaW1pdCBiZWNvbWVzIGhhcmQgbGltaXQgKi8KLQlfX2xlMzIgZHFpX2lncmFjZTsJLyogVGltZSBiZWZvcmUgaW5vZGUgc29mdCBsaW1pdCBiZWNvbWVzIGhhcmQgbGltaXQgKi8KLQlfX2xlMzIgZHFpX2ZsYWdzOwkvKiBGbGFncyBmb3IgcXVvdGFmaWxlIChEUUZfKikgKi8KLQlfX2xlMzIgZHFpX2Jsb2NrczsJLyogTnVtYmVyIG9mIGJsb2NrcyBpbiBmaWxlICovCi0JX19sZTMyIGRxaV9mcmVlX2JsazsJLyogTnVtYmVyIG9mIGZpcnN0IGZyZWUgYmxvY2sgaW4gdGhlIGxpc3QgKi8KLQlfX2xlMzIgZHFpX2ZyZWVfZW50cnk7CS8qIE51bWJlciBvZiBibG9jayB3aXRoIGF0IGxlYXN0IG9uZSBmcmVlIGVudHJ5ICovCi19OwotCi0vKgotICogIFN0cnVjdHVyZSBvZiBoZWFkZXIgb2YgYmxvY2sgd2l0aCBxdW90YSBzdHJ1Y3R1cmVzLiBJdCBpcyBwYWRkZWQgdG8gMTYgYnl0ZXMgc28KLSAqICB0aGVyZSB3aWxsIGJlIHNwYWNlIGZvciBleGFjdGx5IDIxIHF1b3RhLWVudHJpZXMgaW4gYSBibG9jawotICovCi1zdHJ1Y3QgdjJfZGlza19kcWRiaGVhZGVyIHsKLQlfX2xlMzIgZHFkaF9uZXh0X2ZyZWU7CS8qIE51bWJlciBvZiBuZXh0IGJsb2NrIHdpdGggZnJlZSBlbnRyeSAqLwotCV9fbGUzMiBkcWRoX3ByZXZfZnJlZTsJLyogTnVtYmVyIG9mIHByZXZpb3VzIGJsb2NrIHdpdGggZnJlZSBlbnRyeSAqLwotCV9fbGUxNiBkcWRoX2VudHJpZXM7CS8qIE51bWJlciBvZiB2YWxpZCBlbnRyaWVzIGluIGJsb2NrICovCi0JX19sZTE2IGRxZGhfcGFkMTsKLQlfX2xlMzIgZHFkaF9wYWQyOwotfTsKLQotI2RlZmluZSBWMl9EUUlORk9PRkYJc2l6ZW9mKHN0cnVjdCB2Ml9kaXNrX2RxaGVhZGVyKQkvKiBPZmZzZXQgb2YgaW5mbyBoZWFkZXIgaW4gZmlsZSAqLwotI2RlZmluZSBWMl9EUUJMS1NJWkVfQklUUwkxMAotI2RlZmluZSBWMl9EUUJMS1NJWkUJKDEgPDwgVjJfRFFCTEtTSVpFX0JJVFMpCS8qIFNpemUgb2YgYmxvY2sgd2l0aCBxdW90YSBzdHJ1Y3R1cmVzICovCi0jZGVmaW5lIFYyX0RRVFJFRU9GRgkxCQkvKiBPZmZzZXQgb2YgdHJlZSBpbiBmaWxlIGluIGJsb2NrcyAqLwotI2RlZmluZSBWMl9EUVRSRUVERVBUSAk0CQkvKiBEZXB0aCBvZiBxdW90YSB0cmVlICovCi0jZGVmaW5lIFYyX0RRU1RSSU5CTEsJKChWMl9EUUJMS1NJWkUgLSBzaXplb2Yoc3RydWN0IHYyX2Rpc2tfZHFkYmhlYWRlcikpIC8gc2l6ZW9mKHN0cnVjdCB2Ml9kaXNrX2RxYmxrKSkJLyogTnVtYmVyIG9mIGVudHJpZXMgaW4gb25lIGJsb2NrcyAqLwotCi0jZW5kaWYgLyogX0xJTlVYX1FVT1RBSU9fVjJfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9xdW90YW9wcy5oIGIvaW5jbHVkZS9saW51eC9xdW90YW9wcy5oCmluZGV4IGE1NThhNGMuLjIxYjc4MWEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcXVvdGFvcHMuaAorKysgYi9pbmNsdWRlL2xpbnV4L3F1b3Rhb3BzLmgKQEAgLTI0LDEyICsyNCwyMSBAQAogCiBpbnQgZHF1b3RfaW5pdGlhbGl6ZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgdHlwZSk7CiBpbnQgZHF1b3RfZHJvcChzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKK2ludCBkcXVvdF9kcm9wX2xvY2tlZChzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKK3N0cnVjdCBkcXVvdCAqZHFnZXQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdW5zaWduZWQgaW50IGlkLCBpbnQgdHlwZSk7Cit2b2lkIGRxcHV0KHN0cnVjdCBkcXVvdCAqZHF1b3QpOworaW50IGRxdW90X2lzX2NhY2hlZChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB1bnNpZ25lZCBpbnQgaWQsIGludCB0eXBlKTsKK2ludCBkcXVvdF9zY2FuX2FjdGl2ZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQkgICAgICBpbnQgKCpmbikoc3RydWN0IGRxdW90ICpkcXVvdCwgdW5zaWduZWQgbG9uZyBwcml2KSwKKwkJICAgICAgdW5zaWduZWQgbG9uZyBwcml2KTsKK3N0cnVjdCBkcXVvdCAqZHF1b3RfYWxsb2Moc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHR5cGUpOwordm9pZCBkcXVvdF9kZXN0cm95KHN0cnVjdCBkcXVvdCAqZHF1b3QpOwogCiBpbnQgZHF1b3RfYWxsb2Nfc3BhY2Uoc3RydWN0IGlub2RlICppbm9kZSwgcXNpemVfdCBudW1iZXIsIGludCBwcmVhbGxvYyk7Ci1pbnQgZHF1b3RfYWxsb2NfaW5vZGUoY29uc3Qgc3RydWN0IGlub2RlICppbm9kZSwgdW5zaWduZWQgbG9uZyBudW1iZXIpOworaW50IGRxdW90X2FsbG9jX2lub2RlKGNvbnN0IHN0cnVjdCBpbm9kZSAqaW5vZGUsIHFzaXplX3QgbnVtYmVyKTsKIAogaW50IGRxdW90X2ZyZWVfc3BhY2Uoc3RydWN0IGlub2RlICppbm9kZSwgcXNpemVfdCBudW1iZXIpOwotaW50IGRxdW90X2ZyZWVfaW5vZGUoY29uc3Qgc3RydWN0IGlub2RlICppbm9kZSwgdW5zaWduZWQgbG9uZyBudW1iZXIpOworaW50IGRxdW90X2ZyZWVfaW5vZGUoY29uc3Qgc3RydWN0IGlub2RlICppbm9kZSwgcXNpemVfdCBudW1iZXIpOwogCiBpbnQgZHF1b3RfdHJhbnNmZXIoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGlhdHRyICppYXR0cik7CiBpbnQgZHF1b3RfY29tbWl0KHN0cnVjdCBkcXVvdCAqZHF1b3QpOwpAQCAtNDAsMTEgKzQ5LDE0IEBACiAKIGludCB2ZnNfcXVvdGFfb24oc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHR5cGUsIGludCBmb3JtYXRfaWQsCiAgCWNoYXIgKnBhdGgsIGludCByZW1vdW50KTsKK2ludCB2ZnNfcXVvdGFfZW5hYmxlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCB0eXBlLCBpbnQgZm9ybWF0X2lkLAorCXVuc2lnbmVkIGludCBmbGFncyk7CiBpbnQgdmZzX3F1b3RhX29uX3BhdGgoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHR5cGUsIGludCBmb3JtYXRfaWQsCiAgCXN0cnVjdCBwYXRoICpwYXRoKTsKIGludCB2ZnNfcXVvdGFfb25fbW91bnQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgY2hhciAqcWZfbmFtZSwKICAJaW50IGZvcm1hdF9pZCwgaW50IHR5cGUpOwogaW50IHZmc19xdW90YV9vZmYoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHR5cGUsIGludCByZW1vdW50KTsKK2ludCB2ZnNfcXVvdGFfZGlzYWJsZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgdHlwZSwgdW5zaWduZWQgaW50IGZsYWdzKTsKIGludCB2ZnNfcXVvdGFfc3luYyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgdHlwZSk7CiBpbnQgdmZzX2dldF9kcWluZm8oc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHR5cGUsIHN0cnVjdCBpZl9kcWluZm8gKmlpKTsKIGludCB2ZnNfc2V0X2RxaW5mbyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgdHlwZSwgc3RydWN0IGlmX2RxaW5mbyAqaWkpOwpAQCAtNjQsMjQgKzc2LDIyIEBACiAgKiBGdW5jdGlvbnMgZm9yIGNoZWNraW5nIHN0YXR1cyBvZiBxdW90YQogICovCiAKLXN0YXRpYyBpbmxpbmUgaW50IHNiX2hhc19xdW90YV9lbmFibGVkKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCB0eXBlKQorc3RhdGljIGlubGluZSBpbnQgc2JfaGFzX3F1b3RhX3VzYWdlX2VuYWJsZWQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHR5cGUpCiB7Ci0JaWYgKHR5cGUgPT0gVVNSUVVPVEEpCi0JCXJldHVybiBzYl9kcW9wdChzYiktPmZsYWdzICYgRFFVT1RfVVNSX0VOQUJMRUQ7Ci0JcmV0dXJuIHNiX2Rxb3B0KHNiKS0+ZmxhZ3MgJiBEUVVPVF9HUlBfRU5BQkxFRDsKKwlyZXR1cm4gc2JfZHFvcHQoc2IpLT5mbGFncyAmCisJCQkJZHF1b3Rfc3RhdGVfZmxhZyhEUVVPVF9VU0FHRV9FTkFCTEVELCB0eXBlKTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgc2JfYW55X3F1b3RhX2VuYWJsZWQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3N0YXRpYyBpbmxpbmUgaW50IHNiX2hhc19xdW90YV9saW1pdHNfZW5hYmxlZChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgdHlwZSkKIHsKLQlyZXR1cm4gc2JfaGFzX3F1b3RhX2VuYWJsZWQoc2IsIFVTUlFVT1RBKSB8fAotCQlzYl9oYXNfcXVvdGFfZW5hYmxlZChzYiwgR1JQUVVPVEEpOworCXJldHVybiBzYl9kcW9wdChzYiktPmZsYWdzICYKKwkJCQlkcXVvdF9zdGF0ZV9mbGFnKERRVU9UX0xJTUlUU19FTkFCTEVELCB0eXBlKTsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgc2JfaGFzX3F1b3RhX3N1c3BlbmRlZChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgdHlwZSkKIHsKLQlpZiAodHlwZSA9PSBVU1JRVU9UQSkKLQkJcmV0dXJuIHNiX2Rxb3B0KHNiKS0+ZmxhZ3MgJiBEUVVPVF9VU1JfU1VTUEVOREVEOwotCXJldHVybiBzYl9kcW9wdChzYiktPmZsYWdzICYgRFFVT1RfR1JQX1NVU1BFTkRFRDsKKwlyZXR1cm4gc2JfZHFvcHQoc2IpLT5mbGFncyAmCisJCQkJZHF1b3Rfc3RhdGVfZmxhZyhEUVVPVF9TVVNQRU5ERUQsIHR5cGUpOwogfQogCiBzdGF0aWMgaW5saW5lIGludCBzYl9hbnlfcXVvdGFfc3VzcGVuZGVkKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCkBAIC05MCw2ICsxMDAsMzEgQEAKIAkJc2JfaGFzX3F1b3RhX3N1c3BlbmRlZChzYiwgR1JQUVVPVEEpOwogfQogCisvKiBEb2VzIGtlcm5lbCBrbm93IGFib3V0IGFueSBxdW90YSBpbmZvcm1hdGlvbiBmb3IgZ2l2ZW4gc2IgKyB0eXBlPyAqLworc3RhdGljIGlubGluZSBpbnQgc2JfaGFzX3F1b3RhX2xvYWRlZChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgdHlwZSkKK3sKKwkvKiBDdXJyZW50bHkgaWYgYW55dGhpbmcgaXMgb24sIHRoZW4gcXVvdGEgdXNhZ2UgaXMgb24gYXMgd2VsbCAqLworCXJldHVybiBzYl9oYXNfcXVvdGFfdXNhZ2VfZW5hYmxlZChzYiwgdHlwZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHNiX2FueV9xdW90YV9sb2FkZWQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlyZXR1cm4gc2JfaGFzX3F1b3RhX2xvYWRlZChzYiwgVVNSUVVPVEEpIHx8CisJCXNiX2hhc19xdW90YV9sb2FkZWQoc2IsIEdSUFFVT1RBKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgc2JfaGFzX3F1b3RhX2FjdGl2ZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgdHlwZSkKK3sKKwlyZXR1cm4gc2JfaGFzX3F1b3RhX2xvYWRlZChzYiwgdHlwZSkgJiYKKwkgICAgICAgIXNiX2hhc19xdW90YV9zdXNwZW5kZWQoc2IsIHR5cGUpOworfQorCitzdGF0aWMgaW5saW5lIGludCBzYl9hbnlfcXVvdGFfYWN0aXZlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJcmV0dXJuIHNiX2hhc19xdW90YV9hY3RpdmUoc2IsIFVTUlFVT1RBKSB8fAorCSAgICAgICBzYl9oYXNfcXVvdGFfYWN0aXZlKHNiLCBHUlBRVU9UQSk7Cit9CisKIC8qCiAgKiBPcGVyYXRpb25zIHN1cHBvcnRlZCBmb3IgZGlza3F1b3Rhcy4KICAqLwpAQCAtMTA0LDcgKzEzOSw3IEBACiBzdGF0aWMgaW5saW5lIHZvaWQgdmZzX2RxX2luaXQoc3RydWN0IGlub2RlICppbm9kZSkKIHsKIAlCVUdfT04oIWlub2RlLT5pX3NiKTsKLQlpZiAoc2JfYW55X3F1b3RhX2VuYWJsZWQoaW5vZGUtPmlfc2IpICYmICFJU19OT1FVT1RBKGlub2RlKSkKKwlpZiAoc2JfYW55X3F1b3RhX2FjdGl2ZShpbm9kZS0+aV9zYikgJiYgIUlTX05PUVVPVEEoaW5vZGUpKQogCQlpbm9kZS0+aV9zYi0+ZHFfb3AtPmluaXRpYWxpemUoaW5vZGUsIC0xKTsKIH0KIApAQCAtMTEyLDcgKzE0Nyw3IEBACiAgKiBhIHRyYW5zYWN0aW9uIChkZWFkbG9ja3MgcG9zc2libGUgb3RoZXJ3aXNlKSAqLwogc3RhdGljIGlubGluZSBpbnQgdmZzX2RxX3ByZWFsbG9jX3NwYWNlX25vZGlydHkoc3RydWN0IGlub2RlICppbm9kZSwgcXNpemVfdCBucikKIHsKLQlpZiAoc2JfYW55X3F1b3RhX2VuYWJsZWQoaW5vZGUtPmlfc2IpKSB7CisJaWYgKHNiX2FueV9xdW90YV9hY3RpdmUoaW5vZGUtPmlfc2IpKSB7CiAJCS8qIFVzZWQgc3BhY2UgaXMgdXBkYXRlZCBpbiBhbGxvY19zcGFjZSgpICovCiAJCWlmIChpbm9kZS0+aV9zYi0+ZHFfb3AtPmFsbG9jX3NwYWNlKGlub2RlLCBuciwgMSkgPT0gTk9fUVVPVEEpCiAJCQlyZXR1cm4gMTsKQEAgLTEzMiw3ICsxNjcsNyBAQAogCiBzdGF0aWMgaW5saW5lIGludCB2ZnNfZHFfYWxsb2Nfc3BhY2Vfbm9kaXJ0eShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBxc2l6ZV90IG5yKQogewotCWlmIChzYl9hbnlfcXVvdGFfZW5hYmxlZChpbm9kZS0+aV9zYikpIHsKKwlpZiAoc2JfYW55X3F1b3RhX2FjdGl2ZShpbm9kZS0+aV9zYikpIHsKIAkJLyogVXNlZCBzcGFjZSBpcyB1cGRhdGVkIGluIGFsbG9jX3NwYWNlKCkgKi8KIAkJaWYgKGlub2RlLT5pX3NiLT5kcV9vcC0+YWxsb2Nfc3BhY2UoaW5vZGUsIG5yLCAwKSA9PSBOT19RVU9UQSkKIAkJCXJldHVybiAxOwpAQCAtMTUyLDcgKzE4Nyw3IEBACiAKIHN0YXRpYyBpbmxpbmUgaW50IHZmc19kcV9hbGxvY19pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQogewotCWlmIChzYl9hbnlfcXVvdGFfZW5hYmxlZChpbm9kZS0+aV9zYikpIHsKKwlpZiAoc2JfYW55X3F1b3RhX2FjdGl2ZShpbm9kZS0+aV9zYikpIHsKIAkJdmZzX2RxX2luaXQoaW5vZGUpOwogCQlpZiAoaW5vZGUtPmlfc2ItPmRxX29wLT5hbGxvY19pbm9kZShpbm9kZSwgMSkgPT0gTk9fUVVPVEEpCiAJCQlyZXR1cm4gMTsKQEAgLTE2Miw3ICsxOTcsNyBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQgdmZzX2RxX2ZyZWVfc3BhY2Vfbm9kaXJ0eShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBxc2l6ZV90IG5yKQogewotCWlmIChzYl9hbnlfcXVvdGFfZW5hYmxlZChpbm9kZS0+aV9zYikpCisJaWYgKHNiX2FueV9xdW90YV9hY3RpdmUoaW5vZGUtPmlfc2IpKQogCQlpbm9kZS0+aV9zYi0+ZHFfb3AtPmZyZWVfc3BhY2UoaW5vZGUsIG5yKTsKIAllbHNlCiAJCWlub2RlX3N1Yl9ieXRlcyhpbm9kZSwgbnIpOwpAQCAtMTc2LDcgKzIxMSw3IEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCB2ZnNfZHFfZnJlZV9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQogewotCWlmIChzYl9hbnlfcXVvdGFfZW5hYmxlZChpbm9kZS0+aV9zYikpCisJaWYgKHNiX2FueV9xdW90YV9hY3RpdmUoaW5vZGUtPmlfc2IpKQogCQlpbm9kZS0+aV9zYi0+ZHFfb3AtPmZyZWVfaW5vZGUoaW5vZGUsIDEpOwogfQogCkBAIC0xOTcsMTIgKzIzMiwxMiBAQAogCiAjZWxzZQogCi1zdGF0aWMgaW5saW5lIGludCBzYl9oYXNfcXVvdGFfZW5hYmxlZChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgdHlwZSkKK3N0YXRpYyBpbmxpbmUgaW50IHNiX2hhc19xdW90YV91c2FnZV9lbmFibGVkKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCB0eXBlKQogewogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBzYl9hbnlfcXVvdGFfZW5hYmxlZChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQorc3RhdGljIGlubGluZSBpbnQgc2JfaGFzX3F1b3RhX2xpbWl0c19lbmFibGVkKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCB0eXBlKQogewogCXJldHVybiAwOwogfQpAQCAtMjE3LDYgKzI1MiwyNyBAQAogCXJldHVybiAwOwogfQogCisvKiBEb2VzIGtlcm5lbCBrbm93IGFib3V0IGFueSBxdW90YSBpbmZvcm1hdGlvbiBmb3IgZ2l2ZW4gc2IgKyB0eXBlPyAqLworc3RhdGljIGlubGluZSBpbnQgc2JfaGFzX3F1b3RhX2xvYWRlZChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgdHlwZSkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgc2JfYW55X3F1b3RhX2xvYWRlZChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBzYl9oYXNfcXVvdGFfYWN0aXZlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCB0eXBlKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBzYl9hbnlfcXVvdGFfYWN0aXZlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJcmV0dXJuIDA7Cit9CisKIC8qCiAgKiBOTy1PUCB3aGVuIHF1b3RhIG5vdCBjb25maWd1cmVkLgogICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3JhZGl4LXRyZWUuaCBiL2luY2x1ZGUvbGludXgvcmFkaXgtdHJlZS5oCmluZGV4IGE5MTZjNjYuLjM1NWY2ZTggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcmFkaXgtdHJlZS5oCisrKyBiL2luY2x1ZGUvbGludXgvcmFkaXgtdHJlZS5oCkBAIC0xMzYsNyArMTM2LDcgQEAKICAqLwogc3RhdGljIGlubGluZSB2b2lkICpyYWRpeF90cmVlX2RlcmVmX3Nsb3Qodm9pZCAqKnBzbG90KQogewotCXZvaWQgKnJldCA9ICpwc2xvdDsKKwl2b2lkICpyZXQgPSByY3VfZGVyZWZlcmVuY2UoKnBzbG90KTsKIAlpZiAodW5saWtlbHkocmFkaXhfdHJlZV9pc19pbmRpcmVjdF9wdHIocmV0KSkpCiAJCXJldCA9IFJBRElYX1RSRUVfUkVUUlk7CiAJcmV0dXJuIHJldDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcmFpZC9tZF9rLmggYi9pbmNsdWRlL2xpbnV4L3JhaWQvbWRfay5oCmluZGV4IDhmYzkwOWUuLjk3NDNlNGQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcmFpZC9tZF9rLmgKKysrIGIvaW5jbHVkZS9saW51eC9yYWlkL21kX2suaApAQCAtMTM3LDYgKzEzNyw5IEBACiAJc3RydWN0IGdlbmRpc2sJCQkqZ2VuZGlzazsKIAogCXN0cnVjdCBrb2JqZWN0CQkJa29iajsKKwlpbnQJCQkJaG9sZF9hY3RpdmU7CisjZGVmaW5lCVVOVElMX0lPQ1RMCTEKKyNkZWZpbmUJVU5USUxfU1RPUAkyCiAKIAkvKiBTdXBlcmJsb2NrIGluZm9ybWF0aW9uICovCiAJaW50CQkJCW1ham9yX3ZlcnNpb24sCkBAIC0yMTUsNiArMjE4LDkgQEAKICNkZWZpbmUJTURfUkVDT1ZFUllfRlJPWkVOCTkKIAogCXVuc2lnbmVkIGxvbmcJCQlyZWNvdmVyeTsKKwlpbnQJCQkJcmVjb3ZlcnlfZGlzYWJsZWQ7IC8qIGlmIHdlIGRldGVjdCB0aGF0IHJlY292ZXJ5CisJCQkJCQkJICAgICogd2lsbCBhbHdheXMgZmFpbCwgc2V0IHRoaXMKKwkJCQkJCQkgICAgKiBzbyB3ZSBkb24ndCBsb29wIHRyeWluZyAqLwogCiAJaW50CQkJCWluX3N5bmM7CS8qIGtub3cgdG8gbm90IG5lZWQgcmVzeW5jICovCiAJc3RydWN0IG11dGV4CQkJcmVjb25maWdfbXV0ZXg7CkBAIC0yNDQsNiArMjUwLDkgQEAKIAlzdHJ1Y3Qgc3lzZnNfZGlyZW50CQkqc3lzZnNfc3RhdGU7CS8qIGhhbmRsZSBmb3IgJ2FycmF5X3N0YXRlJwogCQkJCQkJCSAqIGZpbGUgaW4gc3lzZnMuCiAJCQkJCQkJICovCisJc3RydWN0IHN5c2ZzX2RpcmVudAkJKnN5c2ZzX2FjdGlvbjsgIC8qIGhhbmRsZSBmb3IgJ3N5bmNfYWN0aW9uJyAqLworCisJc3RydWN0IHdvcmtfc3RydWN0IGRlbF93b3JrOwkvKiB1c2VkIGZvciBkZWxheWVkIHN5c2ZzIHJlbW92YWwgKi8KIAogCXNwaW5sb2NrX3QJCQl3cml0ZV9sb2NrOwogCXdhaXRfcXVldWVfaGVhZF90CQlzYl93YWl0OwkvKiBmb3Igd2FpdGluZyBvbiBzdXBlcmJsb2NrIHVwZGF0ZXMgKi8KQEAgLTMzNCwxNyArMzQzLDE0IEBACiAgKiBpdGVyYXRlcyB0aHJvdWdoIHNvbWUgcmRldiByaW5nbGlzdC4gSXQncyBzYWZlIHRvIHJlbW92ZSB0aGUKICAqIGN1cnJlbnQgJ3JkZXYnLiBEb250IHRvdWNoICd0bXAnIHRob3VnaC4KICAqLwotI2RlZmluZSByZGV2X2Zvcl9lYWNoX2xpc3QocmRldiwgdG1wLCBsaXN0KQkJCQlcCi0JCQkJCQkJCQlcCi0JZm9yICgodG1wKSA9IChsaXN0KS5uZXh0OwkJCQkJXAotCQkocmRldikgPSAobGlzdF9lbnRyeSgodG1wKSwgbWRrX3JkZXZfdCwgc2FtZV9zZXQpKSwJXAotCQkJKHRtcCkgPSAodG1wKS0+bmV4dCwgKHRtcCktPnByZXYgIT0gJihsaXN0KQlcCi0JCTsgKQorI2RlZmluZSByZGV2X2Zvcl9lYWNoX2xpc3QocmRldiwgdG1wLCBoZWFkKQkJCQlcCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHJkZXYsIHRtcCwgaGVhZCwgc2FtZV9zZXQpCisKIC8qCiAgKiBpdGVyYXRlcyB0aHJvdWdoIHRoZSAnc2FtZSBhcnJheSBkaXNrcycgcmluZ2xpc3QKICAqLwogI2RlZmluZSByZGV2X2Zvcl9lYWNoKHJkZXYsIHRtcCwgbWRkZXYpCQkJCVwKLQlyZGV2X2Zvcl9lYWNoX2xpc3QocmRldiwgdG1wLCAobWRkZXYpLT5kaXNrcykKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocmRldiwgdG1wLCAmKChtZGRldiktPmRpc2tzKSwgc2FtZV9zZXQpCiAKICNkZWZpbmUgcmRldl9mb3JfZWFjaF9yY3UocmRldiwgbWRkZXYpCQkJCVwKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShyZGV2LCAmKChtZGRldiktPmRpc2tzKSwgc2FtZV9zZXQpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3JhaWQvbWRfcC5oIGIvaW5jbHVkZS9saW51eC9yYWlkL21kX3AuaAppbmRleCA4YjRkZTRhLi45NDkxMDI2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3JhaWQvbWRfcC5oCisrKyBiL2luY2x1ZGUvbGludXgvcmFpZC9tZF9wLmgKQEAgLTE5NCw2ICsxOTQsOCBAQAogCXJldHVybiAoZXY8PDMyKXwgc2ItPmV2ZW50c19sbzsKIH0KIAorI2RlZmluZSBNRF9TVVBFUkJMT0NLXzFfVElNRV9TRUNfTUFTSyAoKDFVTEw8PDQwKSAtIDEpCisKIC8qCiAgKiBUaGUgdmVyc2lvbi0xIHN1cGVyYmxvY2sgOgogICogQWxsIG51bWVyaWMgZmllbGRzIGFyZSBsaXR0bGUtZW5kaWFuLgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9yYWlkL3JhaWQwLmggYi9pbmNsdWRlL2xpbnV4L3JhaWQvcmFpZDAuaAppbmRleCAxYjJkZGEwLi5mZDQyYWE4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3JhaWQvcmFpZDAuaAorKysgYi9pbmNsdWRlL2xpbnV4L3JhaWQvcmFpZDAuaApAQCAtNSw5ICs1LDkgQEAKIAogc3RydWN0IHN0cmlwX3pvbmUKIHsKLQlzZWN0b3JfdCB6b25lX29mZnNldDsJLyogWm9uZSBvZmZzZXQgaW4gbWRfZGV2ICovCi0Jc2VjdG9yX3QgZGV2X29mZnNldDsJLyogWm9uZSBvZmZzZXQgaW4gcmVhbCBkZXYgKi8KLQlzZWN0b3JfdCBzaXplOwkJLyogWm9uZSBzaXplICovCisJc2VjdG9yX3Qgem9uZV9zdGFydDsJLyogWm9uZSBvZmZzZXQgaW4gbWRfZGV2IChpbiBzZWN0b3JzKSAqLworCXNlY3Rvcl90IGRldl9zdGFydDsJLyogWm9uZSBvZmZzZXQgaW4gcmVhbCBkZXYgKGluIHNlY3RvcnMpICovCisJc2VjdG9yX3Qgc2VjdG9yczsJLyogWm9uZSBzaXplIGluIHNlY3RvcnMgKi8KIAlpbnQgbmJfZGV2OwkJLyogIyBvZiBkZXZpY2VzIGF0dGFjaGVkIHRvIHRoZSB6b25lICovCiAJbWRrX3JkZXZfdCAqKmRldjsJLyogRGV2aWNlcyBhdHRhY2hlZCB0byB0aGUgem9uZSAqLwogfTsKQEAgLTE5LDggKzE5LDggQEAKIAltZGtfcmRldl90ICoqZGV2bGlzdDsgLyogbGlzdHMgb2YgcmRldnMsIHBvaW50ZWQgdG8gYnkgc3RyaXBfem9uZS0+ZGV2ICovCiAJaW50IG5yX3N0cmlwX3pvbmVzOwogCi0Jc2VjdG9yX3QgaGFzaF9zcGFjaW5nOwotCWludCBwcmVzaGlmdDsJCQkvKiBzaGlmdCB0aGlzIGJlZm9yZSBkaXZpZGUgYnkgaGFzaF9zcGFjaW5nICovCisJc2VjdG9yX3Qgc3BhY2luZzsKKwlpbnQgc2VjdG9yX3NoaWZ0OyAvKiBzaGlmdCB0aGlzIGJlZm9yZSBkaXZpZGUgYnkgc3BhY2luZyAqLwogfTsKIAogdHlwZWRlZiBzdHJ1Y3QgcmFpZDBfcHJpdmF0ZV9kYXRhIHJhaWQwX2NvbmZfdDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcmN1cGRhdGUuaCBiL2luY2x1ZGUvbGludXgvcmN1cGRhdGUuaAppbmRleCAxMTY4ZmJjLi45MjEzNDBhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3JjdXBkYXRlLmgKKysrIGIvaW5jbHVkZS9saW51eC9yY3VwZGF0ZS5oCkBAIC0yMDQsMTggKzIwNCw2IEBACiAKIGV4dGVybiB2b2lkIHdha2VtZV9hZnRlcl9yY3Uoc3RydWN0IHJjdV9oZWFkICAqaGVhZCk7CiAKLSNkZWZpbmUgc3luY2hyb25pemVfcmN1X3h4eChuYW1lLCBmdW5jKSBcCi12b2lkIG5hbWUodm9pZCkgXAoteyBcCi0Jc3RydWN0IHJjdV9zeW5jaHJvbml6ZSByY3U7IFwKLQlcCi0JaW5pdF9jb21wbGV0aW9uKCZyY3UuY29tcGxldGlvbik7IFwKLQkvKiBXaWxsIHdha2UgbWUgYWZ0ZXIgUkNVIGZpbmlzaGVkLiAqLyBcCi0JZnVuYygmcmN1LmhlYWQsIHdha2VtZV9hZnRlcl9yY3UpOyBcCi0JLyogV2FpdCBmb3IgaXQuICovIFwKLQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZyY3UuY29tcGxldGlvbik7IFwKLX0KLQogLyoqCiAgKiBzeW5jaHJvbml6ZV9zY2hlZCAtIGJsb2NrIHVudGlsIGFsbCBDUFVzIGhhdmUgZXhpdGVkIGFueSBub24tcHJlZW1wdGl2ZQogICoga2VybmVsIGNvZGUgc2VxdWVuY2VzLgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9yZWd1bGF0b3IvY29uc3VtZXIuaCBiL2luY2x1ZGUvbGludXgvcmVndWxhdG9yL2NvbnN1bWVyLmgKaW5kZXggYWZkYzQ1NS4uODAxYmY3NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9yZWd1bGF0b3IvY29uc3VtZXIuaAorKysgYi9pbmNsdWRlL2xpbnV4L3JlZ3VsYXRvci9jb25zdW1lci5oCkBAIC0xMDQsMTAgKzEwNCwxMCBAQAogLyoqCiAgKiBzdHJ1Y3QgcmVndWxhdG9yX2J1bGtfZGF0YSAtIERhdGEgdXNlZCBmb3IgYnVsayByZWd1bGF0b3Igb3BlcmF0aW9ucy4KICAqCi0gKiBAc3VwcGx5ICAgVGhlIG5hbWUgb2YgdGhlIHN1cHBseS4gIEluaXRpYWxpc2VkIGJ5IHRoZSB1c2VyIGJlZm9yZQotICogICAgICAgICAgIHVzaW5nIHRoZSBidWxrIHJlZ3VsYXRvciBBUElzLgotICogQGNvbnN1bWVyIFRoZSByZWd1bGF0b3IgY29uc3VtZXIgZm9yIHRoZSBzdXBwbHkuICBUaGlzIHdpbGwgYmUgbWFuYWdlZAotICogICAgICAgICAgIGJ5IHRoZSBidWxrIEFQSS4KKyAqIEBzdXBwbHk6ICAgVGhlIG5hbWUgb2YgdGhlIHN1cHBseS4gIEluaXRpYWxpc2VkIGJ5IHRoZSB1c2VyIGJlZm9yZQorICogICAgICAgICAgICB1c2luZyB0aGUgYnVsayByZWd1bGF0b3IgQVBJcy4KKyAqIEBjb25zdW1lcjogVGhlIHJlZ3VsYXRvciBjb25zdW1lciBmb3IgdGhlIHN1cHBseS4gIFRoaXMgd2lsbCBiZSBtYW5hZ2VkCisgKiAgICAgICAgICAgIGJ5IHRoZSBidWxrIEFQSS4KICAqCiAgKiBUaGUgcmVndWxhdG9yIEFQSXMgcHJvdmlkZSBhIHNlcmllcyBvZiByZWd1bGF0b3JfYnVsa18oKSBBUEkgY2FsbHMgYXMKICAqIGEgY29udmVuaWVuY2UgdG8gY29uc3VtZXJzIHdoaWNoIHJlcXVpcmUgbXVsdGlwbGUgc3VwcGxpZXMuICBUaGlzCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3JlZ3VsYXRvci9kcml2ZXIuaCBiL2luY2x1ZGUvbGludXgvcmVndWxhdG9yL2RyaXZlci5oCmluZGV4IGUzN2Q4MDUuLjJkYWUwNTcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcmVndWxhdG9yL2RyaXZlci5oCisrKyBiL2luY2x1ZGUvbGludXgvcmVndWxhdG9yL2RyaXZlci5oCkBAIC0yNCw3ICsyNCwzMyBAQAogLyoqCiAgKiBzdHJ1Y3QgcmVndWxhdG9yX29wcyAtIHJlZ3VsYXRvciBvcGVyYXRpb25zLgogICoKLSAqIFRoaXMgc3RydWN0IGRlc2NyaWJlcyByZWd1bGF0b3Igb3BlcmF0aW9ucy4KKyAqIFRoaXMgc3RydWN0IGRlc2NyaWJlcyByZWd1bGF0b3Igb3BlcmF0aW9ucyB3aGljaCBjYW4gYmUgaW1wbGVtZW50ZWQgYnkKKyAqIHJlZ3VsYXRvciBjaGlwIGRyaXZlcnMuCisgKgorICogQGVuYWJsZTogRW5hYmxlIHRoZSByZWd1bGF0b3IuCisgKiBAZGlzYWJsZTogRGlzYWJsZSB0aGUgcmVndWxhdG9yLgorICogQGlzX2VuYWJsZWQ6IFJldHVybiAxIGlmIHRoZSByZWd1bGF0b3IgaXMgZW5hYmxlZCwgMCBvdGhlcndpc2UuCisgKgorICogQHNldF92b2x0YWdlOiBTZXQgdGhlIHZvbHRhZ2UgZm9yIHRoZSByZWd1bGF0b3Igd2l0aGluIHRoZSByYW5nZSBzcGVjaWZpZWQuCisgKiAgICAgICAgICAgICAgIFRoZSBkcml2ZXIgc2hvdWxkIHNlbGVjdCB0aGUgdm9sdGFnZSBjbG9zZXN0IHRvIG1pbl91Vi4KKyAqIEBnZXRfdm9sdGFnZTogUmV0dXJuIHRoZSBjdXJyZW50bHkgY29uZmlndXJlZCB2b2x0YWdlIGZvciB0aGUgcmVndWxhdG9yLgorICoKKyAqIEBzZXRfY3VycmVudF9saW1pdDogQ29uZmlndXJlIGEgbGltaXQgZm9yIGEgY3VycmVudC1saW1pdGVkIHJlZ3VsYXRvci4KKyAqIEBnZXRfY3VycmVudF9saW1pdDogR2V0IHRoZSBsaW1pdCBmb3IgYSBjdXJyZW50LWxpbWl0ZWQgcmVndWxhdG9yLgorICoKKyAqIEBzZXRfbW9kZTogU2V0IHRoZSBvcGVyYXRpbmcgbW9kZSBmb3IgdGhlIHJlZ3VsYXRvci4KKyAqIEBnZXRfbW9kZTogR2V0IHRoZSBjdXJyZW50IG9wZXJhdGluZyBtb2RlIGZvciB0aGUgcmVndWxhdG9yLgorICogQGdldF9vcHRpbXVtX21vZGU6IEdldCB0aGUgbW9zdCBlZmZpY2llbnQgb3BlcmF0aW5nIG1vZGUgZm9yIHRoZSByZWd1bGF0b3IKKyAqICAgICAgICAgICAgICAgICAgICB3aGVuIHJ1bm5pbmcgd2l0aCB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMuCisgKgorICogQHNldF9zdXNwZW5kX3ZvbHRhZ2U6IFNldCB0aGUgdm9sdGFnZSBmb3IgdGhlIHJlZ3VsYXRvciB3aGVuIHRoZSBzeXN0ZW0KKyAqICAgICAgICAgICAgICAgICAgICAgICBpcyBzdXNwZW5kZWQuCisgKiBAc2V0X3N1c3BlbmRfZW5hYmxlOiBNYXJrIHRoZSByZWd1bGF0b3IgYXMgZW5hYmxlZCB3aGVuIHRoZSBzeXN0ZW0gaXMKKyAqICAgICAgICAgICAgICAgICAgICAgIHN1c3BlbmRlZC4KKyAqIEBzZXRfc3VzcGVuZF9kaXNhYmxlOiBNYXJrIHRoZSByZWd1bGF0b3IgYXMgZGlzYWJsZWQgd2hlbiB0aGUgc3lzdGVtIGlzCisgKiAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVuZGVkLgorICogQHNldF9zdXNwZW5kX21vZGU6IFNldCB0aGUgb3BlcmF0aW5nIG1vZGUgZm9yIHRoZSByZWd1bGF0b3Igd2hlbiB0aGUKKyAqICAgICAgICAgICAgICAgICAgICBzeXN0ZW0gaXMgc3VzcGVuZGVkLgogICovCiBzdHJ1Y3QgcmVndWxhdG9yX29wcyB7CiAKQEAgLTc1LDYgKzEwMSwxNSBAQAogLyoqCiAgKiBzdHJ1Y3QgcmVndWxhdG9yX2Rlc2MgLSBSZWd1bGF0b3IgZGVzY3JpcHRvcgogICoKKyAqIEVhY2ggcmVndWxhdG9yIHJlZ2lzdGVyZWQgd2l0aCB0aGUgY29yZSBpcyBkZXNjcmliZWQgd2l0aCBhIHN0cnVjdHVyZSBvZgorICogdGhpcyB0eXBlLgorICoKKyAqIEBuYW1lOiBJZGVudGlmeWluZyBuYW1lIGZvciB0aGUgcmVndWxhdG9yLgorICogQGlkOiBOdW1lcmljYWwgaWRlbnRpZmllciBmb3IgdGhlIHJlZ3VsYXRvci4KKyAqIEBvcHM6IFJlZ3VsYXRvciBvcGVyYXRpb25zIHRhYmxlLgorICogQGlycTogSW50ZXJydXB0IG51bWJlciBmb3IgdGhlIHJlZ3VsYXRvci4KKyAqIEB0eXBlOiBJbmRpY2F0ZXMgaWYgdGhlIHJlZ3VsYXRvciBpcyBhIHZvbHRhZ2Ugb3IgY3VycmVudCByZWd1bGF0b3IuCisgKiBAb3duZXI6IE1vZHVsZSBwcm92aWRpbmcgdGhlIHJlZ3VsYXRvciwgdXNlZCBmb3IgcmVmY291bnRpbmcuCiAgKi8KIHN0cnVjdCByZWd1bGF0b3JfZGVzYyB7CiAJY29uc3QgY2hhciAqbmFtZTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcmVndWxhdG9yL21hY2hpbmUuaCBiL2luY2x1ZGUvbGludXgvcmVndWxhdG9yL21hY2hpbmUuaAppbmRleCBjNmQ2OTMzLi4zNzk0NzczIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3JlZ3VsYXRvci9tYWNoaW5lLmgKKysrIGIvaW5jbHVkZS9saW51eC9yZWd1bGF0b3IvbWFjaGluZS5oCkBAIC00NCw2ICs0NCwxMCBAQAogICogc3RydWN0IHJlZ3VsYXRvcl9zdGF0ZSAtIHJlZ3VsYXRvciBzdGF0ZSBkdXJpbmcgbG93IHBvd2VyIHN5YXRlbSBzdGF0ZXMKICAqCiAgKiBUaGlzIGRlc2NyaWJlcyBhIHJlZ3VsYXRvcnMgc3RhdGUgZHVyaW5nIGEgc3lzdGVtIHdpZGUgbG93IHBvd2VyIHN0YXRlLgorICoKKyAqIEB1VjogT3BlcmF0aW5nIHZvbHRhZ2UgZHVyaW5nIHN1c3BlbmQuCisgKiBAbW9kZTogT3BlcmF0aW5nIG1vZGUgZHVyaW5nIHN1c3BlbmQuCisgKiBAZW5hYmxlZDogRW5hYmxlZCBkdXJpbmcgc3VzcGVuZC4KICAqLwogc3RydWN0IHJlZ3VsYXRvcl9zdGF0ZSB7CiAJaW50IHVWOwkvKiBzdXNwZW5kIHZvbHRhZ2UgKi8KQEAgLTU1LDYgKzU5LDMwIEBACiAgKiBzdHJ1Y3QgcmVndWxhdGlvbl9jb25zdHJhaW50cyAtIHJlZ3VsYXRvciBvcGVyYXRpbmcgY29uc3RyYWludHMuCiAgKgogICogVGhpcyBzdHJ1Y3QgZGVzY3JpYmVzIHJlZ3VsYXRvciBhbmQgYm9hcmQvbWFjaGluZSBzcGVjaWZpYyBjb25zdHJhaW50cy4KKyAqCisgKiBAbmFtZTogRGVzY3JpcHRpdmUgbmFtZSBmb3IgdGhlIGNvbnN0cmFpbnRzLCB1c2VkIGZvciBkaXNwbGF5IHB1cnBvc2VzLgorICoKKyAqIEBtaW5fdVY6IFNtYWxsZXN0IHZvbHRhZ2UgY29uc3VtZXJzIG1heSBzZXQuCisgKiBAbWF4X3VWOiBMYXJnZXN0IHZvbHRhZ2UgY29uc3VtZXJzIG1heSBzZXQuCisgKgorICogQG1pbl91QTogU21hbGxlc3QgY29uc3VtZXJzIGNvbnN1bWVycyBtYXkgc2V0LgorICogQG1heF91QTogTGFyZ2VzdCBjdXJyZW50IGNvbnN1bWVycyBtYXkgc2V0LgorICoKKyAqIEB2YWxpZF9tb2Rlc19tYXNrOiBNYXNrIG9mIG1vZGVzIHdoaWNoIG1heSBiZSBjb25maWd1cmVkIGJ5IGNvbnN1bWVycy4KKyAqIEB2YWxpZF9vcHNfbWFzazogT3BlcmF0aW9ucyB3aGljaCBtYXkgYmUgcGVyZm9ybWVkIGJ5IGNvbnN1bWVycy4KKyAqCisgKiBAYWx3YXlzX29uOiBTZXQgaWYgdGhlIHJlZ3VsYXRvciBzaG91bGQgbmV2ZXIgYmUgZGlzYWJsZWQuCisgKiBAYm9vdF9vbjogU2V0IGlmIHRoZSByZWd1bGF0b3IgaXMgZW5hYmxlZCB3aGVuIHRoZSBzeXN0ZW0gaXMgaW5pdGlhbGx5CisgKiAgICAgICAgICAgc3RhcnRlZC4KKyAqIEBhcHBseV91VjogQXBwbHkgdGhlIHZvbHRhZ2UgY29uc3RyYWludCB3aGVuIGluaXRpYWxpc2luZy4KKyAqCisgKiBAaW5wdXRfdVY6IElucHV0IHZvbHRhZ2UgZm9yIHJlZ3VsYXRvciB3aGVuIHN1cHBsaWVkIGJ5IGFub3RoZXIgcmVndWxhdG9yLgorICoKKyAqIEBzdGF0ZV9kaXNrOiBTdGF0ZSBmb3IgcmVndWxhdG9yIHdoZW4gc3lzdGVtIGlzIHN1c3BlbmRlZCBpbiBkaXNrIG1vZGUuCisgKiBAc3RhdGVfbWVtOiBTdGF0ZSBmb3IgcmVndWxhdG9yIHdoZW4gc3lzdGVtIGlzIHN1c3BlbmRlZCBpbiBtZW0gbW9kZS4KKyAqIEBzdGF0ZV9zdGFuZGJ5OiBTdGF0ZSBmb3IgcmVndWxhdG9yIHdoZW4gc3lzdGVtIGlzIHN1c3BlbmRlZCBpbiBzdGFuZGJ5CisgKiAgICAgICAgICAgICAgICAgbW9kZS4KKyAqIEBpbml0aWFsX3N0YXRlOiBTdXNwZW5kIHN0YXRlIHRvIHNldCBieSBkZWZhdWx0LgogICovCiBzdHJ1Y3QgcmVndWxhdGlvbl9jb25zdHJhaW50cyB7CiAKQEAgLTkzLDYgKzEyMSw5IEBACiAgKiBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSAtIHN1cHBseSAtPiBkZXZpY2UgbWFwcGluZwogICoKICAqIFRoaXMgbWFwcyBhIHN1cHBseSBuYW1lIHRvIGEgZGV2aWNlLgorICoKKyAqIEBkZXY6IERldmljZSBzdHJ1Y3R1cmUgZm9yIHRoZSBjb25zdW1lci4KKyAqIEBzdXBwbHk6IE5hbWUgZm9yIHRoZSBzdXBwbHkuCiAgKi8KIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IHsKIAlzdHJ1Y3QgZGV2aWNlICpkZXY7CS8qIGNvbnN1bWVyICovCkBAIC0xMDMsNiArMTM0LDE2IEBACiAgKiBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSAtIHJlZ3VsYXRvciBwbGF0Zm9ybSBpbml0aWFsaXNhdGlvbiBkYXRhLgogICoKICAqIEluaXRpYWxpc2F0aW9uIGNvbnN0cmFpbnRzLCBvdXIgc3VwcGx5IGFuZCBjb25zdW1lcnMgc3VwcGxpZXMuCisgKgorICogQHN1cHBseV9yZWd1bGF0b3JfZGV2OiBQYXJlbnQgcmVndWxhdG9yIChpZiBhbnkpLgorICoKKyAqIEBjb25zdHJhaW50czogQ29uc3RyYWludHMuICBUaGVzZSBtdXN0IGJlIHNwZWNpZmllZCBmb3IgdGhlIHJlZ3VsYXRvciB0bworICogICAgICAgICAgICAgICBiZSB1c2FibGUuCisgKiBAbnVtX2NvbnN1bWVyX3N1cHBsaWVzOiBOdW1iZXIgb2YgY29uc3VtZXIgZGV2aWNlIHN1cHBsaWVzLgorICogQGNvbnN1bWVyX3N1cHBsaWVzOiBDb25zdW1lciBkZXZpY2Ugc3VwcGx5IGNvbmZpZ3VyYXRpb24uCisgKgorICogQHJlZ3VsYXRvcl9pbml0OiBDYWxsYmFjayBpbnZva2VkIHdoZW4gdGhlIHJlZ3VsYXRvciBoYXMgYmVlbiByZWdpc3RlcmVkLgorICogQGRyaXZlcl9kYXRhOiBEYXRhIHBhc3NlZCB0byByZWd1bGF0b3JfaW5pdC4KICAqLwogc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgewogCXN0cnVjdCBkZXZpY2UgKnN1cHBseV9yZWd1bGF0b3JfZGV2OyAvKiBvciBOVUxMIGZvciBMSU5FICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3Jlc19jb3VudGVyLmggYi9pbmNsdWRlL2xpbnV4L3Jlc19jb3VudGVyLmgKaW5kZXggMjcxYzFjMi4uZGVkZTBhMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9yZXNfY291bnRlci5oCisrKyBiL2luY2x1ZGUvbGludXgvcmVzX2NvdW50ZXIuaApAQCAtNDMsNiArNDMsMTAgQEAKIAkgKiB0aGUgcm91dGluZXMgYmVsb3cgY29uc2lkZXIgdGhpcyB0byBiZSBJUlEtc2FmZQogCSAqLwogCXNwaW5sb2NrX3QgbG9jazsKKwkvKgorCSAqIFBhcmVudCBjb3VudGVyLCB1c2VkIGZvciBoaWVyYXJjaGlhbCByZXNvdXJjZSBhY2NvdW50aW5nCisJICovCisJc3RydWN0IHJlc19jb3VudGVyICpwYXJlbnQ7CiB9OwogCiAvKioKQEAgLTg3LDcgKzkxLDcgQEAKICAqIGhlbHBlcnMgZm9yIGFjY291bnRpbmcKICAqLwogCi12b2lkIHJlc19jb3VudGVyX2luaXQoc3RydWN0IHJlc19jb3VudGVyICpjb3VudGVyKTsKK3ZvaWQgcmVzX2NvdW50ZXJfaW5pdChzdHJ1Y3QgcmVzX2NvdW50ZXIgKmNvdW50ZXIsIHN0cnVjdCByZXNfY291bnRlciAqcGFyZW50KTsKIAogLyoKICAqIGNoYXJnZSAtIHRyeSB0byBjb25zdW1lIG1vcmUgcmVzb3VyY2UuCkBAIC0xMDMsNyArMTA3LDcgQEAKIGludCBfX211c3RfY2hlY2sgcmVzX2NvdW50ZXJfY2hhcmdlX2xvY2tlZChzdHJ1Y3QgcmVzX2NvdW50ZXIgKmNvdW50ZXIsCiAJCXVuc2lnbmVkIGxvbmcgdmFsKTsKIGludCBfX211c3RfY2hlY2sgcmVzX2NvdW50ZXJfY2hhcmdlKHN0cnVjdCByZXNfY291bnRlciAqY291bnRlciwKLQkJdW5zaWduZWQgbG9uZyB2YWwpOworCQl1bnNpZ25lZCBsb25nIHZhbCwgc3RydWN0IHJlc19jb3VudGVyICoqbGltaXRfZmFpbF9hdCk7CiAKIC8qCiAgKiB1bmNoYXJnZSAtIHRlbGwgdGhhdCBzb21lIHBvcnRpb24gb2YgdGhlIHJlc291cmNlIGlzIHJlbGVhc2VkCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3Jpb19kcnYuaCBiL2luY2x1ZGUvbGludXgvcmlvX2Rydi5oCmluZGV4IDMyYzA1NDcuLmM5M2E1OGEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcmlvX2Rydi5oCisrKyBiL2luY2x1ZGUvbGludXgvcmlvX2Rydi5oCkBAIC0zOTEsNyArMzkxLDYgQEAKICAqIHJpb19nZXRfaW5iX21lc3NhZ2UgLSBHZXQgQSBSSU8gbWVzc2FnZSBmcm9tIGFuIGluYm91bmQgbWFpbGJveCBxdWV1ZQogICogQG1wb3J0OiBNYXN0ZXIgcG9ydCBjb250YWluaW5nIHRoZSBpbmJvdW5kIG1haWxib3gKICAqIEBtYm94OiBUaGUgaW5ib3VuZCBtYWlsYm94IG51bWJlcgotICogQGJ1ZmZlcjogUG9pbnRlciB0byB0aGUgbWVzc2FnZSBidWZmZXIKICAqCiAgKiBHZXQgYSBSSU8gbWVzc2FnZSBmcm9tIGFuIGluYm91bmQgbWFpbGJveCBxdWV1ZS4gUmV0dXJucyAwIG9uIHN1Y2Nlc3MuCiAgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcm1hcC5oIGIvaW5jbHVkZS9saW51eC9ybWFwLmgKaW5kZXggODlmMDU2NC4uYjM1YmMwZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9ybWFwLmgKKysrIGIvaW5jbHVkZS9saW51eC9ybWFwLmgKQEAgLTYzLDE2ICs2MywxMyBAQAogdm9pZCBhbm9uX3ZtYV9saW5rKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqKTsKIHZvaWQgX19hbm9uX3ZtYV9saW5rKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqKTsKIAotZXh0ZXJuIHN0cnVjdCBhbm9uX3ZtYSAqcGFnZV9sb2NrX2Fub25fdm1hKHN0cnVjdCBwYWdlICpwYWdlKTsKLWV4dGVybiB2b2lkIHBhZ2VfdW5sb2NrX2Fub25fdm1hKHN0cnVjdCBhbm9uX3ZtYSAqYW5vbl92bWEpOwotCiAvKgogICogcm1hcCBpbnRlcmZhY2VzIGNhbGxlZCB3aGVuIGFkZGluZyBvciByZW1vdmluZyBwdGUgb2YgcGFnZQogICovCiB2b2lkIHBhZ2VfYWRkX2Fub25fcm1hcChzdHJ1Y3QgcGFnZSAqLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKiwgdW5zaWduZWQgbG9uZyk7CiB2b2lkIHBhZ2VfYWRkX25ld19hbm9uX3JtYXAoc3RydWN0IHBhZ2UgKiwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICosIHVuc2lnbmVkIGxvbmcpOwogdm9pZCBwYWdlX2FkZF9maWxlX3JtYXAoc3RydWN0IHBhZ2UgKik7Ci12b2lkIHBhZ2VfcmVtb3ZlX3JtYXAoc3RydWN0IHBhZ2UgKiwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICopOwordm9pZCBwYWdlX3JlbW92ZV9ybWFwKHN0cnVjdCBwYWdlICopOwogCiAjaWZkZWYgQ09ORklHX0RFQlVHX1ZNCiB2b2lkIHBhZ2VfZHVwX3JtYXAoc3RydWN0IHBhZ2UgKnBhZ2UsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zY2hlZC5oIGIvaW5jbHVkZS9saW51eC9zY2hlZC5oCmluZGV4IDM4YTNmNGIuLjRjYWU5YjggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc2NoZWQuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NjaGVkLmgKQEAgLTM4Niw2ICszODYsOSBAQAogCQkobW0pLT5oaXdhdGVyX3ZtID0gKG1tKS0+dG90YWxfdm07CVwKIH0gd2hpbGUgKDApCiAKKyNkZWZpbmUgZ2V0X21tX2hpd2F0ZXJfcnNzKG1tKQltYXgoKG1tKS0+aGl3YXRlcl9yc3MsIGdldF9tbV9yc3MobW0pKQorI2RlZmluZSBnZXRfbW1faGl3YXRlcl92bShtbSkJbWF4KChtbSktPmhpd2F0ZXJfdm0sIChtbSktPnRvdGFsX3ZtKQorCiBleHRlcm4gdm9pZCBzZXRfZHVtcGFibGUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIGludCB2YWx1ZSk7CiBleHRlcm4gaW50IGdldF9kdW1wYWJsZShzdHJ1Y3QgbW1fc3RydWN0ICptbSk7CiAKQEAgLTkxMiw3ICs5MTUsNiBAQAogCiBleHRlcm4gdm9pZCBwYXJ0aXRpb25fc2NoZWRfZG9tYWlucyhpbnQgbmRvbXNfbmV3LCBzdHJ1Y3QgY3B1bWFzayAqZG9tc19uZXcsCiAJCQkJICAgIHN0cnVjdCBzY2hlZF9kb21haW5fYXR0ciAqZGF0dHJfbmV3KTsKLWV4dGVybiBpbnQgYXJjaF9yZWluaXRfc2NoZWRfZG9tYWlucyh2b2lkKTsKIAogLyogVGVzdCBhIGZsYWcgaW4gcGFyZW50IHNjaGVkIGRvbWFpbiAqLwogc3RhdGljIGlubGluZSBpbnQgdGVzdF9zZF9wYXJlbnQoc3RydWN0IHNjaGVkX2RvbWFpbiAqc2QsIGludCBmbGFnKQpAQCAtMTcwNCwxNiArMTcwNiwxNiBAQAogc3RhdGljIGlubGluZSB2b2lkIHdha2VfdXBfaWRsZV9jcHUoaW50IGNwdSkgeyB9CiAjZW5kaWYKIAotI2lmZGVmIENPTkZJR19TQ0hFRF9ERUJVRwogZXh0ZXJuIHVuc2lnbmVkIGludCBzeXNjdGxfc2NoZWRfbGF0ZW5jeTsKIGV4dGVybiB1bnNpZ25lZCBpbnQgc3lzY3RsX3NjaGVkX21pbl9ncmFudWxhcml0eTsKIGV4dGVybiB1bnNpZ25lZCBpbnQgc3lzY3RsX3NjaGVkX3dha2V1cF9ncmFudWxhcml0eTsKK2V4dGVybiB1bnNpZ25lZCBpbnQgc3lzY3RsX3NjaGVkX3NoYXJlc19yYXRlbGltaXQ7CitleHRlcm4gdW5zaWduZWQgaW50IHN5c2N0bF9zY2hlZF9zaGFyZXNfdGhyZXNoOworI2lmZGVmIENPTkZJR19TQ0hFRF9ERUJVRwogZXh0ZXJuIHVuc2lnbmVkIGludCBzeXNjdGxfc2NoZWRfY2hpbGRfcnVuc19maXJzdDsKIGV4dGVybiB1bnNpZ25lZCBpbnQgc3lzY3RsX3NjaGVkX2ZlYXR1cmVzOwogZXh0ZXJuIHVuc2lnbmVkIGludCBzeXNjdGxfc2NoZWRfbWlncmF0aW9uX2Nvc3Q7CiBleHRlcm4gdW5zaWduZWQgaW50IHN5c2N0bF9zY2hlZF9ucl9taWdyYXRlOwotZXh0ZXJuIHVuc2lnbmVkIGludCBzeXNjdGxfc2NoZWRfc2hhcmVzX3JhdGVsaW1pdDsKLWV4dGVybiB1bnNpZ25lZCBpbnQgc3lzY3RsX3NjaGVkX3NoYXJlc190aHJlc2g7CiAKIGludCBzY2hlZF9ucl9sYXRlbmN5X2hhbmRsZXIoc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSwKIAkJc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqbGVuZ3RoLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zZWN1cml0eS5oIGIvaW5jbHVkZS9saW51eC9zZWN1cml0eS5oCmluZGV4IGI5MmI1ZTQuLjFmMmFiNjMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc2VjdXJpdHkuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NlY3VyaXR5LmgKQEAgLTQ4LDcgKzQ4LDggQEAKICAqIFRoZXNlIGZ1bmN0aW9ucyBhcmUgaW4gc2VjdXJpdHkvY2FwYWJpbGl0eS5jIGFuZCBhcmUgdXNlZAogICogYXMgdGhlIGRlZmF1bHQgY2FwYWJpbGl0aWVzIGZ1bmN0aW9ucwogICovCi1leHRlcm4gaW50IGNhcF9jYXBhYmxlKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCBpbnQgY2FwLCBpbnQgYXVkaXQpOworZXh0ZXJuIGludCBjYXBfY2FwYWJsZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgY29uc3Qgc3RydWN0IGNyZWQgKmNyZWQsCisJCSAgICAgICBpbnQgY2FwLCBpbnQgYXVkaXQpOwogZXh0ZXJuIGludCBjYXBfc2V0dGltZShzdHJ1Y3QgdGltZXNwZWMgKnRzLCBzdHJ1Y3QgdGltZXpvbmUgKnR6KTsKIGV4dGVybiBpbnQgY2FwX3B0cmFjZV9tYXlfYWNjZXNzKHN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQsIHVuc2lnbmVkIGludCBtb2RlKTsKIGV4dGVybiBpbnQgY2FwX3B0cmFjZV90cmFjZW1lKHN0cnVjdCB0YXNrX3N0cnVjdCAqcGFyZW50KTsKQEAgLTEyNTEsOSArMTI1MiwxMiBAQAogICoJQHBlcm1pdHRlZCBjb250YWlucyB0aGUgcGVybWl0dGVkIGNhcGFiaWxpdHkgc2V0LgogICoJUmV0dXJuIDAgYW5kIHVwZGF0ZSBAbmV3IGlmIHBlcm1pc3Npb24gaXMgZ3JhbnRlZC4KICAqIEBjYXBhYmxlOgotICoJQ2hlY2sgd2hldGhlciB0aGUgQHRzayBwcm9jZXNzIGhhcyB0aGUgQGNhcCBjYXBhYmlsaXR5LgorICoJQ2hlY2sgd2hldGhlciB0aGUgQHRzayBwcm9jZXNzIGhhcyB0aGUgQGNhcCBjYXBhYmlsaXR5IGluIHRoZSBpbmRpY2F0ZWQKKyAqCWNyZWRlbnRpYWxzLgogICoJQHRzayBjb250YWlucyB0aGUgdGFza19zdHJ1Y3QgZm9yIHRoZSBwcm9jZXNzLgorICoJQGNyZWQgY29udGFpbnMgdGhlIGNyZWRlbnRpYWxzIHRvIHVzZS4KICAqCUBjYXAgY29udGFpbnMgdGhlIGNhcGFiaWxpdHkgPGluY2x1ZGUvbGludXgvY2FwYWJpbGl0eS5oPi4KKyAqCUBhdWRpdDogV2hldGhlciB0byB3cml0ZSBhbiBhdWRpdCBtZXNzYWdlIG9yIG5vdAogICoJUmV0dXJuIDAgaWYgdGhlIGNhcGFiaWxpdHkgaXMgZ3JhbnRlZCBmb3IgQHRzay4KICAqIEBhY2N0OgogICoJQ2hlY2sgcGVybWlzc2lvbiBiZWZvcmUgZW5hYmxpbmcgb3IgZGlzYWJsaW5nIHByb2Nlc3MgYWNjb3VudGluZy4gIElmCkBAIC0xMzQ2LDcgKzEzNTAsOCBAQAogCQkgICAgICAgY29uc3Qga2VybmVsX2NhcF90ICplZmZlY3RpdmUsCiAJCSAgICAgICBjb25zdCBrZXJuZWxfY2FwX3QgKmluaGVyaXRhYmxlLAogCQkgICAgICAgY29uc3Qga2VybmVsX2NhcF90ICpwZXJtaXR0ZWQpOwotCWludCAoKmNhcGFibGUpIChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgaW50IGNhcCwgaW50IGF1ZGl0KTsKKwlpbnQgKCpjYXBhYmxlKSAoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIGNvbnN0IHN0cnVjdCBjcmVkICpjcmVkLAorCQkJaW50IGNhcCwgaW50IGF1ZGl0KTsKIAlpbnQgKCphY2N0KSAoc3RydWN0IGZpbGUgKmZpbGUpOwogCWludCAoKnN5c2N0bCkgKHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgb3ApOwogCWludCAoKnF1b3RhY3RsKSAoaW50IGNtZHMsIGludCB0eXBlLCBpbnQgaWQsIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpOwpAQCAtMTYyOCw4ICsxNjMzLDkgQEAKIAkJICAgIGNvbnN0IGtlcm5lbF9jYXBfdCAqZWZmZWN0aXZlLAogCQkgICAgY29uc3Qga2VybmVsX2NhcF90ICppbmhlcml0YWJsZSwKIAkJICAgIGNvbnN0IGtlcm5lbF9jYXBfdCAqcGVybWl0dGVkKTsKLWludCBzZWN1cml0eV9jYXBhYmxlKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCBpbnQgY2FwKTsKLWludCBzZWN1cml0eV9jYXBhYmxlX25vYXVkaXQoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIGludCBjYXApOworaW50IHNlY3VyaXR5X2NhcGFibGUoaW50IGNhcCk7CitpbnQgc2VjdXJpdHlfcmVhbF9jYXBhYmxlKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCBpbnQgY2FwKTsKK2ludCBzZWN1cml0eV9yZWFsX2NhcGFibGVfbm9hdWRpdChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgaW50IGNhcCk7CiBpbnQgc2VjdXJpdHlfYWNjdChzdHJ1Y3QgZmlsZSAqZmlsZSk7CiBpbnQgc2VjdXJpdHlfc3lzY3RsKHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgb3ApOwogaW50IHNlY3VyaXR5X3F1b3RhY3RsKGludCBjbWRzLCBpbnQgdHlwZSwgaW50IGlkLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKTsKQEAgLTE4MjYsMTQgKzE4MzIsMzEgQEAKIAlyZXR1cm4gY2FwX2NhcHNldChuZXcsIG9sZCwgZWZmZWN0aXZlLCBpbmhlcml0YWJsZSwgcGVybWl0dGVkKTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgc2VjdXJpdHlfY2FwYWJsZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgaW50IGNhcCkKK3N0YXRpYyBpbmxpbmUgaW50IHNlY3VyaXR5X2NhcGFibGUoaW50IGNhcCkKIHsKLQlyZXR1cm4gY2FwX2NhcGFibGUodHNrLCBjYXAsIFNFQ1VSSVRZX0NBUF9BVURJVCk7CisJcmV0dXJuIGNhcF9jYXBhYmxlKGN1cnJlbnQsIGN1cnJlbnRfY3JlZCgpLCBjYXAsIFNFQ1VSSVRZX0NBUF9BVURJVCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IHNlY3VyaXR5X2NhcGFibGVfbm9hdWRpdChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgaW50IGNhcCkKK3N0YXRpYyBpbmxpbmUgaW50IHNlY3VyaXR5X3JlYWxfY2FwYWJsZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgaW50IGNhcCkKIHsKLQlyZXR1cm4gY2FwX2NhcGFibGUodHNrLCBjYXAsIFNFQ1VSSVRZX0NBUF9OT0FVRElUKTsKKwlpbnQgcmV0OworCisJcmN1X3JlYWRfbG9jaygpOworCXJldCA9IGNhcF9jYXBhYmxlKHRzaywgX190YXNrX2NyZWQodHNrKSwgY2FwLCBTRUNVUklUWV9DQVBfQVVESVQpOworCXJjdV9yZWFkX3VubG9jaygpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUKK2ludCBzZWN1cml0eV9yZWFsX2NhcGFibGVfbm9hdWRpdChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgaW50IGNhcCkKK3sKKwlpbnQgcmV0OworCisJcmN1X3JlYWRfbG9jaygpOworCXJldCA9IGNhcF9jYXBhYmxlKHRzaywgX190YXNrX2NyZWQodHNrKSwgY2FwLAorCQkJICAgICAgIFNFQ1VSSVRZX0NBUF9OT0FVRElUKTsKKwlyY3VfcmVhZF91bmxvY2soKTsKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW5saW5lIGludCBzZWN1cml0eV9hY2N0KHN0cnVjdCBmaWxlICpmaWxlKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zZXJpYWxfY29yZS5oIGIvaW5jbHVkZS9saW51eC9zZXJpYWxfY29yZS5oCmluZGV4IGI0MTk5ODQuLjkwYmJiZjAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc2VyaWFsX2NvcmUuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NlcmlhbF9jb3JlLmgKQEAgLTE2MSw2ICsxNjEsOSBAQAogCiAjZGVmaW5lIFBPUlRfUzNDNjQwMAk4NAogCisvKiBOV1BTRVJJQUwgKi8KKyNkZWZpbmUgUE9SVF9OV1BTRVJJQUwJODUKKwogI2lmZGVmIF9fS0VSTkVMX18KIAogI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NlcmlvLmggYi9pbmNsdWRlL2xpbnV4L3NlcmlvLmgKaW5kZXggMjU2NDFkOS4uMWJjYjM1NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zZXJpby5oCisrKyBiL2luY2x1ZGUvbGludXgvc2VyaW8uaApAQCAtMjEzLDUgKzIxMyw2IEBACiAjZGVmaW5lIFNFUklPX1pIRU5IVUEJMHgzNgogI2RlZmluZSBTRVJJT19JTkVYSU8JMHgzNwogI2RlZmluZSBTRVJJT19UT1VDSElUMjEzCTB4MzcKKyNkZWZpbmUgU0VSSU9fVzgwMDEJMHgzOQogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3BpL3NwaS5oIGIvaW5jbHVkZS9saW51eC9zcGkvc3BpLmgKaW5kZXggODIyMjkzMS4uNjhiYjFjNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zcGkvc3BpLmgKKysrIGIvaW5jbHVkZS9saW51eC9zcGkvc3BpLmgKQEAgLTMyNyw5ICszMjcsOSBAQAogICogQHR4X2RtYTogRE1BIGFkZHJlc3Mgb2YgdHhfYnVmLCBpZiBAc3BpX21lc3NhZ2UuaXNfZG1hX21hcHBlZAogICogQHJ4X2RtYTogRE1BIGFkZHJlc3Mgb2YgcnhfYnVmLCBpZiBAc3BpX21lc3NhZ2UuaXNfZG1hX21hcHBlZAogICogQGxlbjogc2l6ZSBvZiByeCBhbmQgdHggYnVmZmVycyAoaW4gYnl0ZXMpCi0gKiBAc3BlZWRfaHo6IFNlbGVjdCBhIHNwZWVkIG90aGVyIHRoZW4gdGhlIGRldmljZSBkZWZhdWx0IGZvciB0aGlzCisgKiBAc3BlZWRfaHo6IFNlbGVjdCBhIHNwZWVkIG90aGVyIHRoYW4gdGhlIGRldmljZSBkZWZhdWx0IGZvciB0aGlzCiAgKiAgICAgIHRyYW5zZmVyLiBJZiAwIHRoZSBkZWZhdWx0IChmcm9tIEBzcGlfZGV2aWNlKSBpcyB1c2VkLgotICogQGJpdHNfcGVyX3dvcmQ6IHNlbGVjdCBhIGJpdHNfcGVyX3dvcmQgb3RoZXIgdGhlbiB0aGUgZGV2aWNlIGRlZmF1bHQKKyAqIEBiaXRzX3Blcl93b3JkOiBzZWxlY3QgYSBiaXRzX3Blcl93b3JkIG90aGVyIHRoYW4gdGhlIGRldmljZSBkZWZhdWx0CiAgKiAgICAgIGZvciB0aGlzIHRyYW5zZmVyLiBJZiAwIHRoZSBkZWZhdWx0IChmcm9tIEBzcGlfZGV2aWNlKSBpcyB1c2VkLgogICogQGNzX2NoYW5nZTogYWZmZWN0cyBjaGlwc2VsZWN0IGFmdGVyIHRoaXMgdHJhbnNmZXIgY29tcGxldGVzCiAgKiBAZGVsYXlfdXNlY3M6IG1pY3Jvc2Vjb25kcyB0byBkZWxheSBhZnRlciB0aGlzIHRyYW5zZmVyIGJlZm9yZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zcGkvc3BpX2dwaW8uaCBiL2luY2x1ZGUvbGludXgvc3BpL3NwaV9ncGlvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGYwMWEwZgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvc3BpL3NwaV9ncGlvLmgKQEAgLTAsMCArMSw2MCBAQAorI2lmbmRlZiBfX0xJTlVYX1NQSV9HUElPX0gKKyNkZWZpbmUgX19MSU5VWF9TUElfR1BJT19ICisKKy8qCisgKiBGb3IgZWFjaCBiaXRiYW5nZWQgU1BJIGJ1cywgc2V0IHVwIGEgcGxhdGZvcm1fZGV2aWNlIG5vZGUgd2l0aDoKKyAqICAgLSBuYW1lICJzcGlfZ3BpbyIKKyAqICAgLSBpZCB0aGUgc2FtZSBhcyB0aGUgU1BJIGJ1cyBudW1iZXIgaXQgaW1wbGVtZW50cworICogICAtIGRldi5wbGF0Zm9ybSBkYXRhIHBvaW50aW5nIHRvIGEgc3RydWN0IHNwaV9ncGlvX3BsYXRmb3JtX2RhdGEKKyAqCisgKiBPciwgc2VlIHRoZSBkcml2ZXIgY29kZSBmb3IgaW5mb3JtYXRpb24gYWJvdXQgc3BlZWR1cHMgdGhhdCBhcmUKKyAqIHBvc3NpYmxlIG9uIHBsYXRmb3JtcyB0aGF0IHN1cHBvcnQgaW5saW5lZCBhY2Nlc3MgZm9yIEdQSU9zIChubworICogc3BpX2dwaW9fcGxhdGZvcm1fZGF0YSBpcyB1c2VkKS4KKyAqCisgKiBVc2Ugc3BpX2JvYXJkX2luZm8gd2l0aCB0aGVzZSBidXNzZXMgaW4gdGhlIHVzdWFsIHdheSwgYmVpbmcgc3VyZQorICogdGhhdCB0aGUgY29udHJvbGxlcl9kYXRhIGJlaW5nIHRoZSBHUElPIHVzZWQgZm9yIGVhY2ggZGV2aWNlJ3MKKyAqIGNoaXBzZWxlY3Q6CisgKgorICoJc3RhdGljIHN0cnVjdCBzcGlfYm9hcmRfaW5mbyAuLi4gW10gPSB7CisgKgkuLi4KKyAqCQkvLyB0aGlzIHNsYXZlIHVzZXMgR1BJTyA0MiBmb3IgaXRzIGNoaXBzZWxlY3QKKyAqCQkuY29udHJvbGxlcl9kYXRhID0gKHZvaWQgKikgNDIsCisgKgkuLi4KKyAqCQkvLyB0aGlzIG9uZSB1c2VzIEdQSU8gODYgZm9yIGl0cyBjaGlwc2VsZWN0CisgKgkJLmNvbnRyb2xsZXJfZGF0YSA9ICh2b2lkICopIDg2LAorICoJLi4uCisgKgl9OworICoKKyAqIElmIHRoZSBiaXRiYW5nZWQgYnVzIGlzIGxhdGVyIHN3aXRjaGVkIHRvIGEgIm5hdGl2ZSIgY29udHJvbGxlciwKKyAqIHRoYXQgcGxhdGZvcm1fZGV2aWNlIGFuZCBjb250cm9sbGVyX2RhdGEgc2hvdWxkIGJlIHJlbW92ZWQuCisgKi8KKworLyoqCisgKiBzdHJ1Y3Qgc3BpX2dwaW9fcGxhdGZvcm1fZGF0YSAtIHBhcmFtZXRlciBmb3IgYml0YmFuZ2VkIFNQSSBtYXN0ZXIKKyAqIEBzY2s6IG51bWJlciBvZiB0aGUgR1BJTyB1c2VkIGZvciBjbG9jayBvdXRwdXQKKyAqIEBtb3NpOiBudW1iZXIgb2YgdGhlIEdQSU8gdXNlZCBmb3IgTWFzdGVyIE91dHB1dCwgU2xhdmUgSW4gKE1PU0kpIGRhdGEKKyAqIEBtaXNvOiBudW1iZXIgb2YgdGhlIEdQSU8gdXNlZCBmb3IgTWFzdGVyIElucHV0LCBTbGF2ZSBPdXRwdXQgKE1JU08pIGRhdGEKKyAqIEBudW1fY2hpcHNlbGVjdDogaG93IG1hbnkgc2xhdmVzIHRvIGFsbG93CisgKgorICogQWxsIEdQSU8gc2lnbmFscyB1c2VkIHdpdGggdGhlIFNQSSBidXMgbWFuYWdlZCB0aHJvdWdoIHRoaXMgZHJpdmVyCisgKiAoY2hpcHNlbGVjdHMsIE1PU0ksIE1JU08sIFNDSykgbXVzdCBiZSBjb25maWd1cmVkIGFzIEdQSU9zLCBpbnN0ZWFkCisgKiBvZiBzb21lIGFsdGVybmF0ZSBmdW5jdGlvbi4KKyAqCisgKiBJdCBjYW4gYmUgY29udmVuaWVudCB0byB1c2UgdGhpcyBkcml2ZXIgd2l0aCBwaW5zIHRoYXQgaGF2ZSBhbHRlcm5hdGUKKyAqIGZ1bmN0aW9ucyBhc3NvY2lhdGVkIHdpdGggYSAibmF0aXZlIiBTUEkgY29udHJvbGxlciBpZiBhIGRyaXZlciBmb3IgdGhhdAorICogY29udHJvbGxlciBpcyBub3QgYXZhaWxhYmxlLCBvciBpcyBtaXNzaW5nIGltcG9ydGFudCBmdW5jdGlvbmFsaXR5LgorICoKKyAqIE9uIHBsYXRmb3JtcyB3aGljaCBjYW4gZG8gc28sIGNvbmZpZ3VyZSBNSVNPIHdpdGggYSB3ZWFrIHB1bGx1cCB1bmxlc3MKKyAqIHRoZXJlJ3MgYW4gZXh0ZXJuYWwgcHVsbHVwIG9uIHRoYXQgc2lnbmFsLiAgVGhhdCBzYXZlcyBwb3dlciBieSBhdm9pZGluZworICogZmxvYXRpbmcgc2lnbmFscy4gIChBIHdlYWsgcHVsbGRvd24gd291bGQgc2F2ZSBwb3dlciB0b28sIGJ1dCBtYW55CisgKiBkcml2ZXJzIGV4cGVjdCB0byBzZWUgYWxsLW9uZXMgZGF0YSBhcyB0aGUgbm8gc2xhdmUgInJlc3BvbnNlIi4pCisgKi8KK3N0cnVjdCBzcGlfZ3Bpb19wbGF0Zm9ybV9kYXRhIHsKKwl1bnNpZ25lZAlzY2s7CisJdW5zaWduZWQJbW9zaTsKKwl1bnNpZ25lZAltaXNvOworCisJdTE2CQludW1fY2hpcHNlbGVjdDsKK307CisKKyNlbmRpZiAvKiBfX0xJTlVYX1NQSV9HUElPX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3RvcF9tYWNoaW5lLmggYi9pbmNsdWRlL2xpbnV4L3N0b3BfbWFjaGluZS5oCmluZGV4IDc0ZDU5YTYuLmJhYmEzYTIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc3RvcF9tYWNoaW5lLmgKKysrIGIvaW5jbHVkZS9saW51eC9zdG9wX21hY2hpbmUuaApAQCAtMzUsNiArMzUsMjQgQEAKICAqIHdvbid0IGNvbWUgb3IgZ28gd2hpbGUgaXQncyBiZWluZyBjYWxsZWQuICBVc2VkIGJ5IGhvdHBsdWcgY3B1LgogICovCiBpbnQgX19zdG9wX21hY2hpbmUoaW50ICgqZm4pKHZvaWQgKiksIHZvaWQgKmRhdGEsIGNvbnN0IHN0cnVjdCBjcHVtYXNrICpjcHVzKTsKKworLyoqCisgKiBzdG9wX21hY2hpbmVfY3JlYXRlOiBjcmVhdGUgYWxsIHN0b3BfbWFjaGluZSB0aHJlYWRzCisgKgorICogRGVzY3JpcHRpb246IFRoaXMgY2F1c2VzIGFsbCBzdG9wX21hY2hpbmUgdGhyZWFkcyB0byBiZSBjcmVhdGVkIGJlZm9yZQorICogc3RvcF9tYWNoaW5lIGFjdHVhbGx5IGdldHMgY2FsbGVkLiBUaGlzIGNhbiBiZSB1c2VkIGJ5IHN1YnN5c3RlbXMgdGhhdAorICogbmVlZCBhIG5vbiBmYWlsaW5nIHN0b3BfbWFjaGluZSBpbmZyYXN0cnVjdHVyZS4KKyAqLworaW50IHN0b3BfbWFjaGluZV9jcmVhdGUodm9pZCk7CisKKy8qKgorICogc3RvcF9tYWNoaW5lX2Rlc3Ryb3k6IGRlc3Ryb3kgYWxsIHN0b3BfbWFjaGluZSB0aHJlYWRzCisgKgorICogRGVzY3JpcHRpb246IFRoaXMgY2F1c2VzIGFsbCBzdG9wX21hY2hpbmUgdGhyZWFkcyB3aGljaCB3ZXJlIGNyZWF0ZWQgd2l0aAorICogc3RvcF9tYWNoaW5lX2NyZWF0ZSB0byBiZSBkZXN0cm95ZWQgYWdhaW4uCisgKi8KK3ZvaWQgc3RvcF9tYWNoaW5lX2Rlc3Ryb3kodm9pZCk7CisKICNlbHNlCiAKIHN0YXRpYyBpbmxpbmUgaW50IHN0b3BfbWFjaGluZShpbnQgKCpmbikodm9pZCAqKSwgdm9pZCAqZGF0YSwKQEAgLTQ2LDUgKzY0LDkgQEAKIAlsb2NhbF9pcnFfZW5hYmxlKCk7CiAJcmV0dXJuIHJldDsKIH0KKworc3RhdGljIGlubGluZSBpbnQgc3RvcF9tYWNoaW5lX2NyZWF0ZSh2b2lkKSB7IHJldHVybiAwOyB9CitzdGF0aWMgaW5saW5lIHZvaWQgc3RvcF9tYWNoaW5lX2Rlc3Ryb3kodm9pZCkgeyB9CisKICNlbmRpZiAvKiBDT05GSUdfU01QICovCiAjZW5kaWYgLyogX0xJTlVYX1NUT1BfTUFDSElORSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zdW5ycGMvc3ZjLmggYi9pbmNsdWRlL2xpbnV4L3N1bnJwYy9zdmMuaAppbmRleCAzYWZlN2ZiLi4zNDM1ZDI0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3N1bnJwYy9zdmMuaAorKysgYi9pbmNsdWRlL2xpbnV4L3N1bnJwYy9zdmMuaApAQCAtNTgsMTAgKzU4LDEzIEBACiAJc3RydWN0IHN2Y19zdGF0ICoJc3Zfc3RhdHM7CS8qIFJQQyBzdGF0aXN0aWNzICovCiAJc3BpbmxvY2tfdAkJc3ZfbG9jazsKIAl1bnNpZ25lZCBpbnQJCXN2X25ydGhyZWFkczsJLyogIyBvZiBzZXJ2ZXIgdGhyZWFkcyAqLworCXVuc2lnbmVkIGludAkJc3ZfbWF4Y29ubjsJLyogbWF4IGNvbm5lY3Rpb25zIGFsbG93ZWQgb3IKKwkJCQkJCSAqICcwJyBjYXVzaW5nIG1heCB0byBiZSBiYXNlZAorCQkJCQkJICogb24gbnVtYmVyIG9mIHRocmVhZHMuICovCisKIAl1bnNpZ25lZCBpbnQJCXN2X21heF9wYXlsb2FkOwkvKiBkYXRhZ3JhbSBwYXlsb2FkIHNpemUgKi8KIAl1bnNpZ25lZCBpbnQJCXN2X21heF9tZXNnOwkvKiBtYXhfcGF5bG9hZCArIDEgcGFnZSBmb3Igb3ZlcmhlYWRzICovCiAJdW5zaWduZWQgaW50CQlzdl94ZHJzaXplOwkvKiBYRFIgYnVmZmVyIHNpemUgKi8KLQogCXN0cnVjdCBsaXN0X2hlYWQJc3ZfcGVybXNvY2tzOwkvKiBhbGwgcGVybWFuZW50IHNvY2tldHMgKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkCXN2X3RlbXBzb2NrczsJLyogYWxsIHRlbXBvcmFyeSBzb2NrZXRzICovCiAJaW50CQkJc3ZfdG1wY250OwkvKiBjb3VudCBvZiB0ZW1wb3Jhcnkgc29ja2V0cyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zd2FiLmggYi9pbmNsdWRlL2xpbnV4L3N3YWIuaAppbmRleCBiYmVkMjc5Li5iZTUyODRkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3N3YWIuaAorKysgYi9pbmNsdWRlL2xpbnV4L3N3YWIuaApAQCAtOSwxNyArOSwxNyBAQAogICogY2FzdHMgYXJlIG5lY2Vzc2FyeSBmb3IgY29uc3RhbnRzLCBiZWNhdXNlIHdlIG5ldmVyIGtub3cgaG93IGZvciBzdXJlCiAgKiBob3cgVS9VTC9VTEwgbWFwIHRvIF9fdTE2LCBfX3UzMiwgX191NjQuIEF0IGxlYXN0IG5vdCBpbiBhIHBvcnRhYmxlIHdheS4KICAqLwotI2RlZmluZSBfX2NvbnN0X3N3YWIxNih4KSAoKF9fdTE2KSgJCQkJXAorI2RlZmluZSBfX19jb25zdGFudF9zd2FiMTYoeCkgKChfX3UxNikoCQkJCVwKIAkoKChfX3UxNikoeCkgJiAoX191MTYpMHgwMGZmVSkgPDwgOCkgfAkJCVwKIAkoKChfX3UxNikoeCkgJiAoX191MTYpMHhmZjAwVSkgPj4gOCkpKQogCi0jZGVmaW5lIF9fY29uc3Rfc3dhYjMyKHgpICgoX191MzIpKAkJCQlcCisjZGVmaW5lIF9fX2NvbnN0YW50X3N3YWIzMih4KSAoKF9fdTMyKSgJCQkJXAogCSgoKF9fdTMyKSh4KSAmIChfX3UzMikweDAwMDAwMGZmVUwpIDw8IDI0KSB8CQlcCiAJKCgoX191MzIpKHgpICYgKF9fdTMyKTB4MDAwMGZmMDBVTCkgPDwgIDgpIHwJCVwKIAkoKChfX3UzMikoeCkgJiAoX191MzIpMHgwMGZmMDAwMFVMKSA+PiAgOCkgfAkJXAogCSgoKF9fdTMyKSh4KSAmIChfX3UzMikweGZmMDAwMDAwVUwpID4+IDI0KSkpCiAKLSNkZWZpbmUgX19jb25zdF9zd2FiNjQoeCkgKChfX3U2NCkoCQkJCVwKKyNkZWZpbmUgX19fY29uc3RhbnRfc3dhYjY0KHgpICgoX191NjQpKAkJCQlcCiAJKCgoX191NjQpKHgpICYgKF9fdTY0KTB4MDAwMDAwMDAwMDAwMDBmZlVMTCkgPDwgNTYpIHwJXAogCSgoKF9fdTY0KSh4KSAmIChfX3U2NCkweDAwMDAwMDAwMDAwMGZmMDBVTEwpIDw8IDQwKSB8CVwKIAkoKChfX3U2NCkoeCkgJiAoX191NjQpMHgwMDAwMDAwMDAwZmYwMDAwVUxMKSA8PCAyNCkgfAlcCkBAIC0yOSwxMSArMjksMTEgQEAKIAkoKChfX3U2NCkoeCkgJiAoX191NjQpMHgwMGZmMDAwMDAwMDAwMDAwVUxMKSA+PiA0MCkgfAlcCiAJKCgoX191NjQpKHgpICYgKF9fdTY0KTB4ZmYwMDAwMDAwMDAwMDAwMFVMTCkgPj4gNTYpKSkKIAotI2RlZmluZSBfX2NvbnN0X3N3YWh3MzIoeCkgKChfX3UzMikoCQkJCVwKKyNkZWZpbmUgX19fY29uc3RhbnRfc3dhaHczMih4KSAoKF9fdTMyKSgJCQlcCiAJKCgoX191MzIpKHgpICYgKF9fdTMyKTB4MDAwMGZmZmZVTCkgPDwgMTYpIHwJCVwKIAkoKChfX3UzMikoeCkgJiAoX191MzIpMHhmZmZmMDAwMFVMKSA+PiAxNikpKQogCi0jZGVmaW5lIF9fY29uc3Rfc3dhaGIzMih4KSAoKF9fdTMyKSgJCQkJXAorI2RlZmluZSBfX19jb25zdGFudF9zd2FoYjMyKHgpICgoX191MzIpKAkJCVwKIAkoKChfX3UzMikoeCkgJiAoX191MzIpMHgwMGZmMDBmZlVMKSA8PCA4KSB8CQlcCiAJKCgoX191MzIpKHgpICYgKF9fdTMyKTB4ZmYwMGZmMDBVTCkgPj4gOCkpKQogCkBAIC00Myw1MiArNDMsNTIgQEAKICAqIF9fX3N3YWIxNiwgX19fc3dhYjMyLCBfX19zd2FiNjQsIF9fX3N3YWh3MzIsIF9fX3N3YWhiMzIKICAqLwogCi1zdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX2NvbnN0X18gX191MTYgX19fc3dhYjE2KF9fdTE2IHZhbCkKK3N0YXRpYyBpbmxpbmUgX19hdHRyaWJ1dGVfY29uc3RfXyBfX3UxNiBfX2Zzd2FiMTYoX191MTYgdmFsKQogewogI2lmZGVmIF9fYXJjaF9zd2FiMTYKIAlyZXR1cm4gX19hcmNoX3N3YWIxNih2YWwpOwogI2Vsc2UKLQlyZXR1cm4gX19jb25zdF9zd2FiMTYodmFsKTsKKwlyZXR1cm4gX19fY29uc3RhbnRfc3dhYjE2KHZhbCk7CiAjZW5kaWYKIH0KIAotc3RhdGljIGlubGluZSBfX2F0dHJpYnV0ZV9jb25zdF9fIF9fdTMyIF9fX3N3YWIzMihfX3UzMiB2YWwpCitzdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX2NvbnN0X18gX191MzIgX19mc3dhYjMyKF9fdTMyIHZhbCkKIHsKICNpZmRlZiBfX2FyY2hfc3dhYjMyCiAJcmV0dXJuIF9fYXJjaF9zd2FiMzIodmFsKTsKICNlbHNlCi0JcmV0dXJuIF9fY29uc3Rfc3dhYjMyKHZhbCk7CisJcmV0dXJuIF9fX2NvbnN0YW50X3N3YWIzMih2YWwpOwogI2VuZGlmCiB9CiAKLXN0YXRpYyBpbmxpbmUgX19hdHRyaWJ1dGVfY29uc3RfXyBfX3U2NCBfX19zd2FiNjQoX191NjQgdmFsKQorc3RhdGljIGlubGluZSBfX2F0dHJpYnV0ZV9jb25zdF9fIF9fdTY0IF9fZnN3YWI2NChfX3U2NCB2YWwpCiB7CiAjaWZkZWYgX19hcmNoX3N3YWI2NAogCXJldHVybiBfX2FyY2hfc3dhYjY0KHZhbCk7CiAjZWxpZiBkZWZpbmVkKF9fU1dBQl82NF9USFJVXzMyX18pCiAJX191MzIgaCA9IHZhbCA+PiAzMjsKIAlfX3UzMiBsID0gdmFsICYgKCgxVUxMIDw8IDMyKSAtIDEpOwotCXJldHVybiAoKChfX3U2NClfX19zd2FiMzIobCkpIDw8IDMyKSB8ICgoX191NjQpKF9fX3N3YWIzMihoKSkpOworCXJldHVybiAoKChfX3U2NClfX2Zzd2FiMzIobCkpIDw8IDMyKSB8ICgoX191NjQpKF9fZnN3YWIzMihoKSkpOwogI2Vsc2UKLQlyZXR1cm4gX19jb25zdF9zd2FiNjQodmFsKTsKKwlyZXR1cm4gX19fY29uc3RhbnRfc3dhYjY0KHZhbCk7CiAjZW5kaWYKIH0KIAotc3RhdGljIGlubGluZSBfX2F0dHJpYnV0ZV9jb25zdF9fIF9fdTMyIF9fX3N3YWh3MzIoX191MzIgdmFsKQorc3RhdGljIGlubGluZSBfX2F0dHJpYnV0ZV9jb25zdF9fIF9fdTMyIF9fZnN3YWh3MzIoX191MzIgdmFsKQogewogI2lmZGVmIF9fYXJjaF9zd2FodzMyCiAJcmV0dXJuIF9fYXJjaF9zd2FodzMyKHZhbCk7CiAjZWxzZQotCXJldHVybiBfX2NvbnN0X3N3YWh3MzIodmFsKTsKKwlyZXR1cm4gX19fY29uc3RhbnRfc3dhaHczMih2YWwpOwogI2VuZGlmCiB9CiAKLXN0YXRpYyBpbmxpbmUgX19hdHRyaWJ1dGVfY29uc3RfXyBfX3UzMiBfX19zd2FoYjMyKF9fdTMyIHZhbCkKK3N0YXRpYyBpbmxpbmUgX19hdHRyaWJ1dGVfY29uc3RfXyBfX3UzMiBfX2Zzd2FoYjMyKF9fdTMyIHZhbCkKIHsKICNpZmRlZiBfX2FyY2hfc3dhaGIzMgogCXJldHVybiBfX2FyY2hfc3dhaGIzMih2YWwpOwogI2Vsc2UKLQlyZXR1cm4gX19jb25zdF9zd2FoYjMyKHZhbCk7CisJcmV0dXJuIF9fX2NvbnN0YW50X3N3YWhiMzIodmFsKTsKICNlbmRpZgogfQogCkBAIC05OCw4ICs5OCw4IEBACiAgKi8KICNkZWZpbmUgX19zd2FiMTYoeCkJCQkJXAogCShfX2J1aWx0aW5fY29uc3RhbnRfcCgoX191MTYpKHgpKSA/CVwKLQlfX2NvbnN0X3N3YWIxNigoeCkpIDoJCQlcCi0JX19fc3dhYjE2KCh4KSkpCisJX19fY29uc3RhbnRfc3dhYjE2KHgpIDoJCQlcCisJX19mc3dhYjE2KHgpKQogCiAvKioKICAqIF9fc3dhYjMyIC0gcmV0dXJuIGEgYnl0ZXN3YXBwZWQgMzItYml0IHZhbHVlCkBAIC0xMDcsOCArMTA3LDggQEAKICAqLwogI2RlZmluZSBfX3N3YWIzMih4KQkJCQlcCiAJKF9fYnVpbHRpbl9jb25zdGFudF9wKChfX3UzMikoeCkpID8JXAotCV9fY29uc3Rfc3dhYjMyKCh4KSkgOgkJCVwKLQlfX19zd2FiMzIoKHgpKSkKKwlfX19jb25zdGFudF9zd2FiMzIoeCkgOgkJCVwKKwlfX2Zzd2FiMzIoeCkpCiAKIC8qKgogICogX19zd2FiNjQgLSByZXR1cm4gYSBieXRlc3dhcHBlZCA2NC1iaXQgdmFsdWUKQEAgLTExNiw4ICsxMTYsOCBAQAogICovCiAjZGVmaW5lIF9fc3dhYjY0KHgpCQkJCVwKIAkoX19idWlsdGluX2NvbnN0YW50X3AoKF9fdTY0KSh4KSkgPwlcCi0JX19jb25zdF9zd2FiNjQoKHgpKSA6CQkJXAotCV9fX3N3YWI2NCgoeCkpKQorCV9fX2NvbnN0YW50X3N3YWI2NCh4KSA6CQkJXAorCV9fZnN3YWI2NCh4KSkKIAogLyoqCiAgKiBfX3N3YWh3MzIgLSByZXR1cm4gYSB3b3JkLXN3YXBwZWQgMzItYml0IHZhbHVlCkBAIC0xMjcsOCArMTI3LDggQEAKICAqLwogI2RlZmluZSBfX3N3YWh3MzIoeCkJCQkJXAogCShfX2J1aWx0aW5fY29uc3RhbnRfcCgoX191MzIpKHgpKSA/CVwKLQlfX2NvbnN0X3N3YWh3MzIoKHgpKSA6CQkJXAotCV9fX3N3YWh3MzIoKHgpKSkKKwlfX19jb25zdGFudF9zd2FodzMyKHgpIDoJCVwKKwlfX2Zzd2FodzMyKHgpKQogCiAvKioKICAqIF9fc3dhaGIzMiAtIHJldHVybiBhIGhpZ2ggYW5kIGxvdyBieXRlLXN3YXBwZWQgMzItYml0IHZhbHVlCkBAIC0xMzgsOCArMTM4LDggQEAKICAqLwogI2RlZmluZSBfX3N3YWhiMzIoeCkJCQkJXAogCShfX2J1aWx0aW5fY29uc3RhbnRfcCgoX191MzIpKHgpKSA/CVwKLQlfX2NvbnN0X3N3YWhiMzIoKHgpKSA6CQkJXAotCV9fX3N3YWhiMzIoKHgpKSkKKwlfX19jb25zdGFudF9zd2FoYjMyKHgpIDoJCVwKKwlfX2Zzd2FoYjMyKHgpKQogCiAvKioKICAqIF9fc3dhYjE2cCAtIHJldHVybiBhIGJ5dGVzd2FwcGVkIDE2LWJpdCB2YWx1ZSBmcm9tIGEgcG9pbnRlcgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zd2FwLmggYi9pbmNsdWRlL2xpbnV4L3N3YXAuaAppbmRleCBhM2FmOTViLi5kMzAyMTU1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3N3YXAuaAorKysgYi9pbmNsdWRlL2xpbnV4L3N3YXAuaApAQCAtMTIwLDcgKzEyMCw5IEBACiBlbnVtIHsKIAlTV1BfVVNFRAk9ICgxIDw8IDApLAkvKiBpcyBzbG90IGluIHN3YXBfaW5mb1tdIHVzZWQ/ICovCiAJU1dQX1dSSVRFT0sJPSAoMSA8PCAxKSwJLyogb2sgdG8gd3JpdGUgdG8gdGhpcyBzd2FwPwkqLwotCVNXUF9BQ1RJVkUJPSAoU1dQX1VTRUQgfCBTV1BfV1JJVEVPSyksCisJU1dQX0RJU0NBUkRBQkxFID0gKDEgPDwgMiksCS8qIGJsa2RldiBzdXBwb3J0cyBkaXNjYXJkICovCisJU1dQX0RJU0NBUkRJTkcJPSAoMSA8PCAzKSwJLyogbm93IGRpc2NhcmRpbmcgYSBmcmVlIGNsdXN0ZXIgKi8KKwlTV1BfU09MSURTVEFURQk9ICgxIDw8IDQpLAkvKiBibGtkZXYgc2Vla3MgYXJlIGNoZWFwICovCiAJCQkJCS8qIGFkZCBvdGhlcnMgaGVyZSBiZWZvcmUuLi4gKi8KIAlTV1BfU0NBTk5JTkcJPSAoMSA8PCA4KSwJLyogcmVmY291bnQgaW4gc2Nhbl9zd2FwX21hcCAqLwogfTsKQEAgLTEzNCwyMiArMTM2LDI0IEBACiAgKiBUaGUgaW4tbWVtb3J5IHN0cnVjdHVyZSB1c2VkIHRvIHRyYWNrIHN3YXAgYXJlYXMuCiAgKi8KIHN0cnVjdCBzd2FwX2luZm9fc3RydWN0IHsKLQl1bnNpZ25lZCBpbnQgZmxhZ3M7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgcHJpbzsJCQkvKiBzd2FwIHByaW9yaXR5ICovCisJaW50IG5leHQ7CQkJLyogbmV4dCBlbnRyeSBvbiBzd2FwIGxpc3QgKi8KIAlzdHJ1Y3QgZmlsZSAqc3dhcF9maWxlOwogCXN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXY7CiAJc3RydWN0IGxpc3RfaGVhZCBleHRlbnRfbGlzdDsKIAlzdHJ1Y3Qgc3dhcF9leHRlbnQgKmN1cnJfc3dhcF9leHRlbnQ7Ci0JdW5zaWduZWQgb2xkX2Jsb2NrX3NpemU7Ci0JdW5zaWduZWQgc2hvcnQgKiBzd2FwX21hcDsKKwl1bnNpZ25lZCBzaG9ydCAqc3dhcF9tYXA7CiAJdW5zaWduZWQgaW50IGxvd2VzdF9iaXQ7CiAJdW5zaWduZWQgaW50IGhpZ2hlc3RfYml0OworCXVuc2lnbmVkIGludCBsb3dlc3RfYWxsb2M7CS8qIHdoaWxlIHByZXBhcmluZyBkaXNjYXJkIGNsdXN0ZXIgKi8KKwl1bnNpZ25lZCBpbnQgaGlnaGVzdF9hbGxvYzsJLyogd2hpbGUgcHJlcGFyaW5nIGRpc2NhcmQgY2x1c3RlciAqLwogCXVuc2lnbmVkIGludCBjbHVzdGVyX25leHQ7CiAJdW5zaWduZWQgaW50IGNsdXN0ZXJfbnI7CiAJdW5zaWduZWQgaW50IHBhZ2VzOwogCXVuc2lnbmVkIGludCBtYXg7CiAJdW5zaWduZWQgaW50IGludXNlX3BhZ2VzOwotCWludCBuZXh0OwkJCS8qIG5leHQgZW50cnkgb24gc3dhcCBsaXN0ICovCisJdW5zaWduZWQgaW50IG9sZF9ibG9ja19zaXplOwogfTsKIAogc3RydWN0IHN3YXBfbGlzdF90IHsKQEAgLTE2Myw3ICsxNjcsNiBAQAogLyogbGludXgvbW0vcGFnZV9hbGxvYy5jICovCiBleHRlcm4gdW5zaWduZWQgbG9uZyB0b3RhbHJhbV9wYWdlczsKIGV4dGVybiB1bnNpZ25lZCBsb25nIHRvdGFscmVzZXJ2ZV9wYWdlczsKLWV4dGVybiBsb25nIG5yX3N3YXBfcGFnZXM7CiBleHRlcm4gdW5zaWduZWQgaW50IG5yX2ZyZWVfYnVmZmVyX3BhZ2VzKHZvaWQpOwogZXh0ZXJuIHVuc2lnbmVkIGludCBucl9mcmVlX3BhZ2VjYWNoZV9wYWdlcyh2b2lkKTsKIApAQCAtMTc0LDggKzE3Nyw2IEBACiAvKiBsaW51eC9tbS9zd2FwLmMgKi8KIGV4dGVybiB2b2lkIF9fbHJ1X2NhY2hlX2FkZChzdHJ1Y3QgcGFnZSAqLCBlbnVtIGxydV9saXN0IGxydSk7CiBleHRlcm4gdm9pZCBscnVfY2FjaGVfYWRkX2xydShzdHJ1Y3QgcGFnZSAqLCBlbnVtIGxydV9saXN0IGxydSk7Ci1leHRlcm4gdm9pZCBscnVfY2FjaGVfYWRkX2FjdGl2ZV9vcl91bmV2aWN0YWJsZShzdHJ1Y3QgcGFnZSAqLAotCQkJCQlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKik7CiBleHRlcm4gdm9pZCBhY3RpdmF0ZV9wYWdlKHN0cnVjdCBwYWdlICopOwogZXh0ZXJuIHZvaWQgbWFya19wYWdlX2FjY2Vzc2VkKHN0cnVjdCBwYWdlICopOwogZXh0ZXJuIHZvaWQgbHJ1X2FkZF9kcmFpbih2b2lkKTsKQEAgLTIxMyw3ICsyMTQsOCBAQAogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgdHJ5X3RvX2ZyZWVfcGFnZXMoc3RydWN0IHpvbmVsaXN0ICp6b25lbGlzdCwgaW50IG9yZGVyLAogCQkJCQlnZnBfdCBnZnBfbWFzayk7CiBleHRlcm4gdW5zaWduZWQgbG9uZyB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKHN0cnVjdCBtZW1fY2dyb3VwICptZW0sCi0JCQkJCQkJZ2ZwX3QgZ2ZwX21hc2spOworCQkJCQkJICBnZnBfdCBnZnBfbWFzaywgYm9vbCBub3N3YXAsCisJCQkJCQkgIHVuc2lnbmVkIGludCBzd2FwcGluZXNzKTsKIGV4dGVybiBpbnQgX19pc29sYXRlX2xydV9wYWdlKHN0cnVjdCBwYWdlICpwYWdlLCBpbnQgbW9kZSwgaW50IGZpbGUpOwogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgc2hyaW5rX2FsbF9tZW1vcnkodW5zaWduZWQgbG9uZyBucl9wYWdlcyk7CiBleHRlcm4gaW50IHZtX3N3YXBwaW5lc3M7CkBAIC0yODAsNyArMjgyLDcgQEAKIGV4dGVybiBzdHJ1Y3QgYWRkcmVzc19zcGFjZSBzd2FwcGVyX3NwYWNlOwogI2RlZmluZSB0b3RhbF9zd2FwY2FjaGVfcGFnZXMgIHN3YXBwZXJfc3BhY2UubnJwYWdlcwogZXh0ZXJuIHZvaWQgc2hvd19zd2FwX2NhY2hlX2luZm8odm9pZCk7Ci1leHRlcm4gaW50IGFkZF90b19zd2FwKHN0cnVjdCBwYWdlICosIGdmcF90KTsKK2V4dGVybiBpbnQgYWRkX3RvX3N3YXAoc3RydWN0IHBhZ2UgKik7CiBleHRlcm4gaW50IGFkZF90b19zd2FwX2NhY2hlKHN0cnVjdCBwYWdlICosIHN3cF9lbnRyeV90LCBnZnBfdCk7CiBleHRlcm4gdm9pZCBfX2RlbGV0ZV9mcm9tX3N3YXBfY2FjaGUoc3RydWN0IHBhZ2UgKik7CiBleHRlcm4gdm9pZCBkZWxldGVfZnJvbV9zd2FwX2NhY2hlKHN0cnVjdCBwYWdlICopOwpAQCAtMjkzLDYgKzI5NSw3IEBACiAJCQlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyKTsKIAogLyogbGludXgvbW0vc3dhcGZpbGUuYyAqLworZXh0ZXJuIGxvbmcgbnJfc3dhcF9wYWdlczsKIGV4dGVybiBsb25nIHRvdGFsX3N3YXBfcGFnZXM7CiBleHRlcm4gdm9pZCBzaV9zd2FwaW5mbyhzdHJ1Y3Qgc3lzaW5mbyAqKTsKIGV4dGVybiBzd3BfZW50cnlfdCBnZXRfc3dhcF9wYWdlKHZvaWQpOwpAQCAtMzAwLDE1ICszMDMsMTQgQEAKIGV4dGVybiBpbnQgc3dhcF9kdXBsaWNhdGUoc3dwX2VudHJ5X3QpOwogZXh0ZXJuIGludCB2YWxpZF9zd2FwaGFuZGxlcyhzd3BfZW50cnlfdCwgdW5zaWduZWQgbG9uZyAqKTsKIGV4dGVybiB2b2lkIHN3YXBfZnJlZShzd3BfZW50cnlfdCk7Ci1leHRlcm4gdm9pZCBmcmVlX3N3YXBfYW5kX2NhY2hlKHN3cF9lbnRyeV90KTsKK2V4dGVybiBpbnQgZnJlZV9zd2FwX2FuZF9jYWNoZShzd3BfZW50cnlfdCk7CiBleHRlcm4gaW50IHN3YXBfdHlwZV9vZihkZXZfdCwgc2VjdG9yX3QsIHN0cnVjdCBibG9ja19kZXZpY2UgKiopOwogZXh0ZXJuIHVuc2lnbmVkIGludCBjb3VudF9zd2FwX3BhZ2VzKGludCwgaW50KTsKIGV4dGVybiBzZWN0b3JfdCBtYXBfc3dhcF9wYWdlKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICosIHBnb2ZmX3QpOwogZXh0ZXJuIHNlY3Rvcl90IHN3YXBkZXZfYmxvY2soaW50LCBwZ29mZl90KTsKIGV4dGVybiBzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqZ2V0X3N3YXBfaW5mb19zdHJ1Y3QodW5zaWduZWQpOwotZXh0ZXJuIGludCBjYW5fc2hhcmVfc3dhcF9wYWdlKHN0cnVjdCBwYWdlICopOwotZXh0ZXJuIGludCByZW1vdmVfZXhjbHVzaXZlX3N3YXBfcGFnZShzdHJ1Y3QgcGFnZSAqKTsKLWV4dGVybiBpbnQgcmVtb3ZlX2V4Y2x1c2l2ZV9zd2FwX3BhZ2VfcmVmKHN0cnVjdCBwYWdlICopOworZXh0ZXJuIGludCByZXVzZV9zd2FwX3BhZ2Uoc3RydWN0IHBhZ2UgKik7CitleHRlcm4gaW50IHRyeV90b19mcmVlX3N3YXAoc3RydWN0IHBhZ2UgKik7CiBzdHJ1Y3QgYmFja2luZ19kZXZfaW5mbzsKIAogLyogbGludXgvbW0vdGhyYXNoLmMgKi8KQEAgLTMzMiw5ICszMzQsMjYgQEAKIAlwdXRfc3dhcF90b2tlbihzd2FwX3Rva2VuX21tKTsKIH0KIAorI2lmZGVmIENPTkZJR19DR1JPVVBfTUVNX1JFU19DVExSCitleHRlcm4gdm9pZCBtZW1fY2dyb3VwX3VuY2hhcmdlX3N3YXBjYWNoZShzdHJ1Y3QgcGFnZSAqcGFnZSwgc3dwX2VudHJ5X3QgZW50KTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQKK21lbV9jZ3JvdXBfdW5jaGFyZ2Vfc3dhcGNhY2hlKHN0cnVjdCBwYWdlICpwYWdlLCBzd3BfZW50cnlfdCBlbnQpCit7Cit9CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQ0dST1VQX01FTV9SRVNfQ1RMUl9TV0FQCitleHRlcm4gdm9pZCBtZW1fY2dyb3VwX3VuY2hhcmdlX3N3YXAoc3dwX2VudHJ5X3QgZW50KTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgbWVtX2Nncm91cF91bmNoYXJnZV9zd2FwKHN3cF9lbnRyeV90IGVudCkKK3sKK30KKyNlbmRpZgorCiAjZWxzZSAvKiBDT05GSUdfU1dBUCAqLwogCi0jZGVmaW5lIHRvdGFsX3N3YXBfcGFnZXMJCQkwCisjZGVmaW5lIG5yX3N3YXBfcGFnZXMJCQkJMEwKKyNkZWZpbmUgdG90YWxfc3dhcF9wYWdlcwkJCTBMCiAjZGVmaW5lIHRvdGFsX3N3YXBjYWNoZV9wYWdlcwkJCTBVTAogCiAjZGVmaW5lIHNpX3N3YXBpbmZvKHZhbCkgXApAQCAtMzUwLDE0ICszNjksOCBAQAogewogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgZnJlZV9zd2FwX2FuZF9jYWNoZShzd3BfZW50cnlfdCBzd3ApCi17Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IHN3YXBfZHVwbGljYXRlKHN3cF9lbnRyeV90IHN3cCkKLXsKLQlyZXR1cm4gMDsKLX0KKyNkZWZpbmUgZnJlZV9zd2FwX2FuZF9jYWNoZShzd3ApCWlzX21pZ3JhdGlvbl9lbnRyeShzd3ApCisjZGVmaW5lIHN3YXBfZHVwbGljYXRlKHN3cCkJCWlzX21pZ3JhdGlvbl9lbnRyeShzd3ApCiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBzd2FwX2ZyZWUoc3dwX2VudHJ5X3Qgc3dwKQogewpAQCAtMzc0LDcgKzM4NywxMCBAQAogCXJldHVybiBOVUxMOwogfQogCi0jZGVmaW5lIGNhbl9zaGFyZV9zd2FwX3BhZ2UocCkJCQkocGFnZV9tYXBjb3VudChwKSA9PSAxKQorc3RhdGljIGlubGluZSBpbnQgYWRkX3RvX3N3YXAoc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJcmV0dXJuIDA7Cit9CiAKIHN0YXRpYyBpbmxpbmUgaW50IGFkZF90b19zd2FwX2NhY2hlKHN0cnVjdCBwYWdlICpwYWdlLCBzd3BfZW50cnlfdCBlbnRyeSwKIAkJCQkJCQlnZnBfdCBnZnBfbWFzaykKQEAgLTM5MCwxNCArNDA2LDkgQEAKIHsKIH0KIAotI2RlZmluZSBzd2FwX3Rva2VuX2RlZmF1bHRfdGltZW91dAkJMAorI2RlZmluZSByZXVzZV9zd2FwX3BhZ2UocGFnZSkJKHBhZ2VfbWFwY291bnQocGFnZSkgPT0gMSkKIAotc3RhdGljIGlubGluZSBpbnQgcmVtb3ZlX2V4Y2x1c2l2ZV9zd2FwX3BhZ2Uoc3RydWN0IHBhZ2UgKnApCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IHJlbW92ZV9leGNsdXNpdmVfc3dhcF9wYWdlX3JlZihzdHJ1Y3QgcGFnZSAqcGFnZSkKK3N0YXRpYyBpbmxpbmUgaW50IHRyeV90b19mcmVlX3N3YXAoc3RydWN0IHBhZ2UgKnBhZ2UpCiB7CiAJcmV0dXJuIDA7CiB9CkBAIC00MTUsNiArNDI2LDEyIEBACiAjZGVmaW5lIGhhc19zd2FwX3Rva2VuKHgpIDAKICNkZWZpbmUgZGlzYWJsZV9zd2FwX3Rva2VuKCkgZG8geyB9IHdoaWxlKDApCiAKK3N0YXRpYyBpbmxpbmUgaW50IG1lbV9jZ3JvdXBfY2FjaGVfY2hhcmdlX3N3YXBpbihzdHJ1Y3QgcGFnZSAqcGFnZSwKKwkJCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBnZnBfdCBtYXNrLCBib29sIGxvY2tlZCkKK3sKKwlyZXR1cm4gMDsKK30KKwogI2VuZGlmIC8qIENPTkZJR19TV0FQICovCiAjZW5kaWYgLyogX19LRVJORUxfXyovCiAjZW5kaWYgLyogX0xJTlVYX1NXQVBfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zd2lvdGxiLmggYi9pbmNsdWRlL2xpbnV4L3N3aW90bGIuaAppbmRleCAzMjVhZjFkLi5kZWRkM2MwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3N3aW90bGIuaAorKysgYi9pbmNsdWRlL2xpbnV4L3N3aW90bGIuaApAQCAtMjcsNyArMjcsOCBAQAogZXh0ZXJuIHZvaWQgKnN3aW90bGJfYWxsb2NfYm9vdChzaXplX3QgYnl0ZXMsIHVuc2lnbmVkIGxvbmcgbnNsYWJzKTsKIGV4dGVybiB2b2lkICpzd2lvdGxiX2FsbG9jKHVuc2lnbmVkIG9yZGVyLCB1bnNpZ25lZCBsb25nIG5zbGFicyk7CiAKLWV4dGVybiBkbWFfYWRkcl90IHN3aW90bGJfcGh5c190b19idXMocGh5c19hZGRyX3QgYWRkcmVzcyk7CitleHRlcm4gZG1hX2FkZHJfdCBzd2lvdGxiX3BoeXNfdG9fYnVzKHN0cnVjdCBkZXZpY2UgKmh3ZGV2LAorCQkJCSAgICAgIHBoeXNfYWRkcl90IGFkZHJlc3MpOwogZXh0ZXJuIHBoeXNfYWRkcl90IHN3aW90bGJfYnVzX3RvX3BoeXMoZG1hX2FkZHJfdCBhZGRyZXNzKTsKIAogZXh0ZXJuIGludCBzd2lvdGxiX2FyY2hfcmFuZ2VfbmVlZHNfbWFwcGluZyh2b2lkICpwdHIsIHNpemVfdCBzaXplKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3lzY2FsbHMuaCBiL2luY2x1ZGUvbGludXgvc3lzY2FsbHMuaAppbmRleCAwNGZiNDdiLi4xOGQwYTI0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3N5c2NhbGxzLmgKKysrIGIvaW5jbHVkZS9saW51eC9zeXNjYWxscy5oCkBAIC01NDksNyArNTQ5LDcgQEAKIGFzbWxpbmthZ2UgbG9uZyBzeXNfaW5vdGlmeV9pbml0MShpbnQgZmxhZ3MpOwogYXNtbGlua2FnZSBsb25nIHN5c19pbm90aWZ5X2FkZF93YXRjaChpbnQgZmQsIGNvbnN0IGNoYXIgX191c2VyICpwYXRoLAogCQkJCQl1MzIgbWFzayk7Ci1hc21saW5rYWdlIGxvbmcgc3lzX2lub3RpZnlfcm1fd2F0Y2goaW50IGZkLCB1MzIgd2QpOworYXNtbGlua2FnZSBsb25nIHN5c19pbm90aWZ5X3JtX3dhdGNoKGludCBmZCwgX19zMzIgd2QpOwogCiBhc21saW5rYWdlIGxvbmcgc3lzX3NwdV9ydW4oaW50IGZkLCBfX3UzMiBfX3VzZXIgKnVucGMsCiAJCQkJIF9fdTMyIF9fdXNlciAqdXN0YXR1cyk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3RpbWUuaCBiL2luY2x1ZGUvbGludXgvdGltZS5oCmluZGV4IGNlMzIxYWMuLmZiYmQyYTEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdGltZS5oCisrKyBiL2luY2x1ZGUvbGludXgvdGltZS5oCkBAIC0xMDUsNiArMTA1LDcgQEAKIGV4dGVybiBpbnQgdXBkYXRlX3BlcnNpc3RlbnRfY2xvY2soc3RydWN0IHRpbWVzcGVjIG5vdyk7CiBleHRlcm4gaW50IG5vX3N5bmNfY21vc19jbG9jayBfX3JlYWRfbW9zdGx5Owogdm9pZCB0aW1la2VlcGluZ19pbml0KHZvaWQpOworZXh0ZXJuIGludCB0aW1la2VlcGluZ19zdXNwZW5kZWQ7CiAKIHVuc2lnbmVkIGxvbmcgZ2V0X3NlY29uZHModm9pZCk7CiBzdHJ1Y3QgdGltZXNwZWMgY3VycmVudF9rZXJuZWxfdGltZSh2b2lkKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdHlwZXMuaCBiL2luY2x1ZGUvbGludXgvdHlwZXMuaAppbmRleCAxMjFmMzQ5Li43MTJjYTUzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3R5cGVzLmgKKysrIGIvaW5jbHVkZS9saW51eC90eXBlcy5oCkBAIC0xNzYsMTAgKzE3Niw5IEBACiB0eXBlZGVmIF9fdTE2IF9fYml0d2lzZSBfX2JlMTY7CiB0eXBlZGVmIF9fdTMyIF9fYml0d2lzZSBfX2xlMzI7CiB0eXBlZGVmIF9fdTMyIF9fYml0d2lzZSBfX2JlMzI7Ci0jaWYgZGVmaW5lZChfX0dOVUNfXykKIHR5cGVkZWYgX191NjQgX19iaXR3aXNlIF9fbGU2NDsKIHR5cGVkZWYgX191NjQgX19iaXR3aXNlIF9fYmU2NDsKLSNlbmRpZgorCiB0eXBlZGVmIF9fdTE2IF9fYml0d2lzZSBfX3N1bTE2OwogdHlwZWRlZiBfX3UzMiBfX2JpdHdpc2UgX193c3VtOwogCkBAIC0xOTUsNiArMTk0LDE2IEBACiAKIHR5cGVkZWYgcGh5c19hZGRyX3QgcmVzb3VyY2Vfc2l6ZV90OwogCit0eXBlZGVmIHN0cnVjdCB7CisJdm9sYXRpbGUgaW50IGNvdW50ZXI7Cit9IGF0b21pY190OworCisjaWZkZWYgQ09ORklHXzY0QklUCit0eXBlZGVmIHN0cnVjdCB7CisJdm9sYXRpbGUgbG9uZyBjb3VudGVyOworfSBhdG9taWM2NF90OworI2VuZGlmCisKIHN0cnVjdCB1c3RhdCB7CiAJX19rZXJuZWxfZGFkZHJfdAlmX3RmcmVlOwogCV9fa2VybmVsX2lub190CQlmX3Rpbm9kZTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdWlvX2RyaXZlci5oIGIvaW5jbHVkZS9saW51eC91aW9fZHJpdmVyLmgKaW5kZXggY2RmMzM4ZC4uYTBiYjZiZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC91aW9fZHJpdmVyLmgKKysrIGIvaW5jbHVkZS9saW51eC91aW9fZHJpdmVyLmgKQEAgLTM4LDYgKzM4LDI0IEBACiAKICNkZWZpbmUgTUFYX1VJT19NQVBTCTUKIAorc3RydWN0IHVpb19wb3J0aW87CisKKy8qKgorICogc3RydWN0IHVpb19wb3J0IC0gZGVzY3JpcHRpb24gb2YgYSBVSU8gcG9ydCByZWdpb24KKyAqIEBzdGFydDoJCXN0YXJ0IG9mIHBvcnQgcmVnaW9uCisgKiBAc2l6ZToJCXNpemUgb2YgcG9ydCByZWdpb24KKyAqIEBwb3J0dHlwZToJCXR5cGUgb2YgcG9ydCAoc2VlIFVJT19QT1JUXyogYmVsb3cpCisgKiBAcG9ydGlvOgkJZm9yIHVzZSBieSB0aGUgVUlPIGNvcmUgb25seS4KKyAqLworc3RydWN0IHVpb19wb3J0IHsKKwl1bnNpZ25lZCBsb25nCQlzdGFydDsKKwl1bnNpZ25lZCBsb25nCQlzaXplOworCWludAkJCXBvcnR0eXBlOworCXN0cnVjdCB1aW9fcG9ydGlvCSpwb3J0aW87Cit9OworCisjZGVmaW5lIE1BWF9VSU9fUE9SVF9SRUdJT05TCTUKKwogc3RydWN0IHVpb19kZXZpY2U7CiAKIC8qKgpAQCAtNDYsNiArNjQsNyBAQAogICogQG5hbWU6CQlkZXZpY2UgbmFtZQogICogQHZlcnNpb246CQlkZXZpY2UgZHJpdmVyIHZlcnNpb24KICAqIEBtZW06CQlsaXN0IG9mIG1hcHBhYmxlIG1lbW9yeSByZWdpb25zLCBzaXplPT0wIGZvciBlbmQgb2YgbGlzdAorICogQHBvcnQ6CQlsaXN0IG9mIHBvcnQgcmVnaW9ucywgc2l6ZT09MCBmb3IgZW5kIG9mIGxpc3QKICAqIEBpcnE6CQlpbnRlcnJ1cHQgbnVtYmVyIG9yIFVJT19JUlFfQ1VTVE9NCiAgKiBAaXJxX2ZsYWdzOgkJZmxhZ3MgZm9yIHJlcXVlc3RfaXJxKCkKICAqIEBwcml2OgkJb3B0aW9uYWwgcHJpdmF0ZSBkYXRhCkBAIC01Nyw5ICs3NiwxMCBAQAogICovCiBzdHJ1Y3QgdWlvX2luZm8gewogCXN0cnVjdCB1aW9fZGV2aWNlCSp1aW9fZGV2OwotCWNoYXIJCQkqbmFtZTsKLQljaGFyCQkJKnZlcnNpb247CisJY29uc3QgY2hhcgkJKm5hbWU7CisJY29uc3QgY2hhcgkJKnZlcnNpb247CiAJc3RydWN0IHVpb19tZW0JCW1lbVtNQVhfVUlPX01BUFNdOworCXN0cnVjdCB1aW9fcG9ydAkJcG9ydFtNQVhfVUlPX1BPUlRfUkVHSU9OU107CiAJbG9uZwkJCWlycTsKIAl1bnNpZ25lZCBsb25nCQlpcnFfZmxhZ3M7CiAJdm9pZAkJCSpwcml2OwpAQCAtOTIsNCArMTEyLDEwIEBACiAjZGVmaW5lIFVJT19NRU1fTE9HSUNBTAkyCiAjZGVmaW5lIFVJT19NRU1fVklSVFVBTCAzCiAKKy8qIGRlZmluZXMgZm9yIHVpb19wb3J0LT5wb3J0dHlwZSAqLworI2RlZmluZSBVSU9fUE9SVF9OT05FCTAKKyNkZWZpbmUgVUlPX1BPUlRfWDg2CTEKKyNkZWZpbmUgVUlPX1BPUlRfR1BJTwkyCisjZGVmaW5lIFVJT19QT1JUX09USEVSCTMKKwogI2VuZGlmIC8qIF9MSU5VWF9VSU9fRFJJVkVSX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3Vud2luZC5oIGIvaW5jbHVkZS9saW51eC91bndpbmQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzc2MDg2MC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2xpbnV4L3Vud2luZC5oCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotI2lmbmRlZiBfTElOVVhfVU5XSU5EX0gKLSNkZWZpbmUgX0xJTlVYX1VOV0lORF9ICi0KLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNiBOb3ZlbGwsIEluYy4KLSAqCUphbiBCZXVsaWNoIDxqYmV1bGljaEBub3ZlbGwuY29tPgotICogVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIHZlcnNpb24gMiBvZiB0aGUgR05VIEdQTC4KLSAqCi0gKiBBIHNpbXBsZSBBUEkgZm9yIHVud2luZGluZyBrZXJuZWwgc3RhY2tzLiAgVGhpcyBpcyB1c2VkIGZvcgotICogZGVidWdnaW5nIGFuZCBlcnJvciByZXBvcnRpbmcgcHVycG9zZXMuICBUaGUga2VybmVsIGRvZXNuJ3QgbmVlZAotICogZnVsbC1ibG93biBzdGFjayB1bndpbmRpbmcgd2l0aCBhbGwgdGhlIGJlbGxzIGFuZCB3aGlzdGxlcywgc28gdGhlcmUKLSAqIGlzIG5vdCBtdWNoIHBvaW50IGluIGltcGxlbWVudGluZyB0aGUgZnVsbCBEd2FyZjIgdW53aW5kIEFQSS4KLSAqLwotCi1zdHJ1Y3QgbW9kdWxlOwotCi1zdHJ1Y3QgdW53aW5kX2ZyYW1lX2luZm8ge307Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCB1bndpbmRfaW5pdCh2b2lkKSB7fQotc3RhdGljIGlubGluZSB2b2lkIHVud2luZF9zZXR1cCh2b2lkKSB7fQotCi0jaWZkZWYgQ09ORklHX01PRFVMRVMKLQotc3RhdGljIGlubGluZSB2b2lkICp1bndpbmRfYWRkX3RhYmxlKHN0cnVjdCBtb2R1bGUgKm1vZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICp0YWJsZV9zdGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIHRhYmxlX3NpemUpCi17Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCB1bndpbmRfcmVtb3ZlX3RhYmxlKHZvaWQgKmhhbmRsZSwgaW50IGluaXRfb25seSkKLXsKLX0KLQotI2VuZGlmCi0KLXN0YXRpYyBpbmxpbmUgaW50IHVud2luZF9pbml0X2ZyYW1lX2luZm8oc3RydWN0IHVud2luZF9mcmFtZV9pbmZvICppbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCi17Ci0JcmV0dXJuIC1FTk9TWVM7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IHVud2luZF9pbml0X2Jsb2NrZWQoc3RydWN0IHVud2luZF9mcmFtZV9pbmZvICppbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKLXsKLQlyZXR1cm4gLUVOT1NZUzsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgdW53aW5kX2luaXRfcnVubmluZyhzdHJ1Y3QgdW53aW5kX2ZyYW1lX2luZm8gKmluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzbWxpbmthZ2UgaW50ICgqY2IpKHN0cnVjdCB1bndpbmRfZnJhbWVfaW5mbyAqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICphcmcpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICphcmcpCi17Ci0JcmV0dXJuIC1FTk9TWVM7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IHVud2luZChzdHJ1Y3QgdW53aW5kX2ZyYW1lX2luZm8gKmluZm8pCi17Ci0JcmV0dXJuIC1FTk9TWVM7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IHVud2luZF90b191c2VyKHN0cnVjdCB1bndpbmRfZnJhbWVfaW5mbyAqaW5mbykKLXsKLQlyZXR1cm4gLUVOT1NZUzsKLX0KLQotI2VuZGlmIC8qIF9MSU5VWF9VTldJTkRfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC91c2IuaCBiL2luY2x1ZGUvbGludXgvdXNiLmgKaW5kZXggZjcyYWE1MS4uODVlZTliZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC91c2IuaAorKysgYi9pbmNsdWRlL2xpbnV4L3VzYi5oCkBAIC0xMDgsNiArMTA4LDcgQEAKICAqCShpbiBwcm9iZSgpKSwgYm91bmQgdG8gYSBkcml2ZXIsIG9yIHVuYmluZGluZyAoaW4gZGlzY29ubmVjdCgpKQogICogQGlzX2FjdGl2ZTogZmxhZyBzZXQgd2hlbiB0aGUgaW50ZXJmYWNlIGlzIGJvdW5kIGFuZCBub3Qgc3VzcGVuZGVkLgogICogQHN5c2ZzX2ZpbGVzX2NyZWF0ZWQ6IHN5c2ZzIGF0dHJpYnV0ZXMgZXhpc3QKKyAqIEBlcF9kZXZzX2NyZWF0ZWQ6IGVuZHBvaW50IGNoaWxkIHBzZXVkby1kZXZpY2VzIGV4aXN0CiAgKiBAdW5yZWdpc3RlcmluZzogZmxhZyBzZXQgd2hlbiB0aGUgaW50ZXJmYWNlIGlzIGJlaW5nIHVucmVnaXN0ZXJlZAogICogQG5lZWRzX3JlbW90ZV93YWtldXA6IGZsYWcgc2V0IHdoZW4gdGhlIGRyaXZlciByZXF1aXJlcyByZW1vdGUtd2FrZXVwCiAgKgljYXBhYmlsaXR5IGR1cmluZyBhdXRvc3VzcGVuZC4KQEAgLTEyMCw2ICsxMjEsMTEgQEAKICAqCXRvIHRoZSBzeXNmcyByZXByZXNlbnRhdGlvbiBmb3IgdGhhdCBkZXZpY2UuCiAgKiBAcG1fdXNhZ2VfY250OiBQTSB1c2FnZSBjb3VudGVyIGZvciB0aGlzIGludGVyZmFjZTsgYXV0b3N1c3BlbmQgaXMgbm90CiAgKglhbGxvd2VkIHVubGVzcyB0aGUgY291bnRlciBpcyAwLgorICogQHJlc2V0X3dzOiBVc2VkIGZvciBzY2hlZHVsaW5nIHJlc2V0cyBmcm9tIGF0b21pYyBjb250ZXh0LgorICogQHJlc2V0X3J1bm5pbmc6IHNldCB0byAxIGlmIHRoZSBpbnRlcmZhY2UgaXMgY3VycmVudGx5IHJ1bm5pbmcgYQorICogICAgICBxdWV1ZWQgcmVzZXQgc28gdGhhdCB1c2JfY2FuY2VsX3F1ZXVlZF9yZXNldCgpIGRvZXNuJ3QgdHJ5IHRvCisgKiAgICAgIHJlbW92ZSBmcm9tIHRoZSB3b3JrcXVldWUgd2hlbiBydW5uaW5nIGluc2lkZSB0aGUgd29ya2VyCisgKiAgICAgIHRocmVhZC4gU2VlIF9fdXNiX3F1ZXVlX3Jlc2V0X2RldmljZSgpLgogICoKICAqIFVTQiBkZXZpY2UgZHJpdmVycyBhdHRhY2ggdG8gaW50ZXJmYWNlcyBvbiBhIHBoeXNpY2FsIGRldmljZS4gIEVhY2gKICAqIGludGVyZmFjZSBlbmNhcHN1bGF0ZXMgYSBzaW5nbGUgaGlnaCBsZXZlbCBmdW5jdGlvbiwgc3VjaCBhcyBmZWVkaW5nCkBAIC0xNjQsMTQgKzE3MCwxNyBAQAogCWVudW0gdXNiX2ludGVyZmFjZV9jb25kaXRpb24gY29uZGl0aW9uOwkJLyogc3RhdGUgb2YgYmluZGluZyAqLwogCXVuc2lnbmVkIGlzX2FjdGl2ZToxOwkJLyogdGhlIGludGVyZmFjZSBpcyBub3Qgc3VzcGVuZGVkICovCiAJdW5zaWduZWQgc3lzZnNfZmlsZXNfY3JlYXRlZDoxOwkvKiB0aGUgc3lzZnMgYXR0cmlidXRlcyBleGlzdCAqLworCXVuc2lnbmVkIGVwX2RldnNfY3JlYXRlZDoxOwkvKiBlbmRwb2ludCAiZGV2aWNlcyIgZXhpc3QgKi8KIAl1bnNpZ25lZCB1bnJlZ2lzdGVyaW5nOjE7CS8qIHVucmVnaXN0cmF0aW9uIGlzIGluIHByb2dyZXNzICovCiAJdW5zaWduZWQgbmVlZHNfcmVtb3RlX3dha2V1cDoxOwkvKiBkcml2ZXIgcmVxdWlyZXMgcmVtb3RlIHdha2V1cCAqLwogCXVuc2lnbmVkIG5lZWRzX2FsdHNldHRpbmcwOjE7CS8qIHN3aXRjaCB0byBhbHRzZXR0aW5nIDAgaXMgcGVuZGluZyAqLwogCXVuc2lnbmVkIG5lZWRzX2JpbmRpbmc6MTsJLyogbmVlZHMgZGVsYXllZCB1bmJpbmQvcmViaW5kICovCisJdW5zaWduZWQgcmVzZXRfcnVubmluZzoxOwogCiAJc3RydWN0IGRldmljZSBkZXY7CQkvKiBpbnRlcmZhY2Ugc3BlY2lmaWMgZGV2aWNlIGluZm8gKi8KIAlzdHJ1Y3QgZGV2aWNlICp1c2JfZGV2OwogCWludCBwbV91c2FnZV9jbnQ7CQkvKiB1c2FnZSBjb3VudGVyIGZvciBhdXRvc3VzcGVuZCAqLworCXN0cnVjdCB3b3JrX3N0cnVjdCByZXNldF93czsJLyogZm9yIHJlc2V0cyBpbiBhdG9taWMgY29udGV4dCAqLwogfTsKICNkZWZpbmUJdG9fdXNiX2ludGVyZmFjZShkKSBjb250YWluZXJfb2YoZCwgc3RydWN0IHVzYl9pbnRlcmZhY2UsIGRldikKICNkZWZpbmUJaW50ZXJmYWNlX3RvX3VzYmRldihpbnRmKSBcCkBAIC0zMjksNyArMzM4LDcgQEAKICNlbmRpZgogCXN0cnVjdCBkZXZpY2UgKmRldjsJCS8qIGRldmljZSBmb3IgdGhpcyBidXMgKi8KIAotI2lmIGRlZmluZWQoQ09ORklHX1VTQl9NT04pCisjaWYgZGVmaW5lZChDT05GSUdfVVNCX01PTikgfHwgZGVmaW5lZChDT05GSUdfVVNCX01PTl9NT0RVTEUpCiAJc3RydWN0IG1vbl9idXMgKm1vbl9idXM7CS8qIG5vbi1udWxsIHdoZW4gYXNzb2NpYXRlZCAqLwogCWludCBtb25pdG9yZWQ7CQkJLyogbm9uLXplcm8gd2hlbiBtb25pdG9yZWQgKi8KICNlbmRpZgpAQCAtMzk4LDYgKzQwNyw3IEBACiAgKiBAdXJibnVtOiBudW1iZXIgb2YgVVJCcyBzdWJtaXR0ZWQgZm9yIHRoZSB3aG9sZSBkZXZpY2UKICAqIEBhY3RpdmVfZHVyYXRpb246IHRvdGFsIHRpbWUgZGV2aWNlIGlzIG5vdCBzdXNwZW5kZWQKICAqIEBhdXRvc3VzcGVuZDogZm9yIGRlbGF5ZWQgYXV0b3N1c3BlbmRzCisgKiBAYXV0b3Jlc3VtZTogZm9yIGF1dG9yZXN1bWVzIHJlcXVlc3RlZCB3aGlsZSBpbl9pbnRlcnJ1cHQKICAqIEBwbV9tdXRleDogcHJvdGVjdHMgUE0gb3BlcmF0aW9ucwogICogQGxhc3RfYnVzeTogdGltZSBvZiBsYXN0IHVzZQogICogQGF1dG9zdXNwZW5kX2RlbGF5OiBpbiBqaWZmaWVzCkBAIC00NzYsNiArNDg2LDcgQEAKIAogI2lmZGVmIENPTkZJR19QTQogCXN0cnVjdCBkZWxheWVkX3dvcmsgYXV0b3N1c3BlbmQ7CisJc3RydWN0IHdvcmtfc3RydWN0IGF1dG9yZXN1bWU7CiAJc3RydWN0IG11dGV4IHBtX211dGV4OwogCiAJdW5zaWduZWQgbG9uZyBsYXN0X2J1c3k7CkBAIC01MDUsNiArNTE2LDcgQEAKIAogLyogVVNCIHBvcnQgcmVzZXQgZm9yIGRldmljZSByZWluaXRpYWxpemF0aW9uICovCiBleHRlcm4gaW50IHVzYl9yZXNldF9kZXZpY2Uoc3RydWN0IHVzYl9kZXZpY2UgKmRldik7CitleHRlcm4gdm9pZCB1c2JfcXVldWVfcmVzZXRfZGV2aWNlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICpkZXYpOwogCiBleHRlcm4gc3RydWN0IHVzYl9kZXZpY2UgKnVzYl9maW5kX2RldmljZSh1MTYgdmVuZG9yX2lkLCB1MTYgcHJvZHVjdF9pZCk7CiAKQEAgLTUxMyw2ICs1MjUsOCBAQAogZXh0ZXJuIGludCB1c2JfYXV0b3BtX3NldF9pbnRlcmZhY2Uoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpOwogZXh0ZXJuIGludCB1c2JfYXV0b3BtX2dldF9pbnRlcmZhY2Uoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpOwogZXh0ZXJuIHZvaWQgdXNiX2F1dG9wbV9wdXRfaW50ZXJmYWNlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKTsKK2V4dGVybiBpbnQgdXNiX2F1dG9wbV9nZXRfaW50ZXJmYWNlX2FzeW5jKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKTsKK2V4dGVybiB2b2lkIHVzYl9hdXRvcG1fcHV0X2ludGVyZmFjZV9hc3luYyhzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50Zik7CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCB1c2JfYXV0b3BtX2VuYWJsZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKIHsKQEAgLTUzOSw4ICs1NTMsMTMgQEAKIHN0YXRpYyBpbmxpbmUgaW50IHVzYl9hdXRvcG1fZ2V0X2ludGVyZmFjZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKIHsgcmV0dXJuIDA7IH0KIAorc3RhdGljIGlubGluZSBpbnQgdXNiX2F1dG9wbV9nZXRfaW50ZXJmYWNlX2FzeW5jKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQoreyByZXR1cm4gMDsgfQorCiBzdGF0aWMgaW5saW5lIHZvaWQgdXNiX2F1dG9wbV9wdXRfaW50ZXJmYWNlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQogeyB9CitzdGF0aWMgaW5saW5lIHZvaWQgdXNiX2F1dG9wbV9wdXRfaW50ZXJmYWNlX2FzeW5jKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQoreyB9CiBzdGF0aWMgaW5saW5lIHZvaWQgdXNiX2F1dG9wbV9lbmFibGUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCiB7IH0KIHN0YXRpYyBpbmxpbmUgdm9pZCB1c2JfYXV0b3BtX2Rpc2FibGUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCkBAIC0xMDUwLDcgKzEwNjksNyBAQAogCXZvaWQgKCpkaXNjb25uZWN0KSAoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYpOwogCiAJaW50ICgqc3VzcGVuZCkgKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2LCBwbV9tZXNzYWdlX3QgbWVzc2FnZSk7Ci0JaW50ICgqcmVzdW1lKSAoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYpOworCWludCAoKnJlc3VtZSkgKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2LCBwbV9tZXNzYWdlX3QgbWVzc2FnZSk7CiAJc3RydWN0IHVzYmRydl93cmFwIGRydndyYXA7CiAJdW5zaWduZWQgaW50IHN1cHBvcnRzX2F1dG9zdXNwZW5kOjE7CiB9OwpAQCAtMTMyMSw3ICsxMzQwLDcgQEAKIAlzdHJ1Y3Qga3JlZiBrcmVmOwkJLyogcmVmZXJlbmNlIGNvdW50IG9mIHRoZSBVUkIgKi8KIAl2b2lkICpoY3ByaXY7CQkJLyogcHJpdmF0ZSBkYXRhIGZvciBob3N0IGNvbnRyb2xsZXIgKi8KIAlhdG9taWNfdCB1c2VfY291bnQ7CQkvKiBjb25jdXJyZW50IHN1Ym1pc3Npb25zIGNvdW50ZXIgKi8KLQl1OCByZWplY3Q7CQkJLyogc3VibWlzc2lvbnMgd2lsbCBmYWlsICovCisJYXRvbWljX3QgcmVqZWN0OwkJLyogc3VibWlzc2lvbnMgd2lsbCBmYWlsICovCiAJaW50IHVubGlua2VkOwkJCS8qIHVubGluayBlcnJvciBjb2RlICovCiAKIAkvKiBwdWJsaWM6IGRvY3VtZW50ZWQgZmllbGRzIGluIHRoZSB1cmIgdGhhdCBjYW4gYmUgdXNlZCBieSBkcml2ZXJzICovCkBAIC0xNDY2LDYgKzE0ODUsNyBAQAogZXh0ZXJuIHZvaWQgdXNiX3VucG9pc29uX3VyYihzdHJ1Y3QgdXJiICp1cmIpOwogZXh0ZXJuIHZvaWQgdXNiX2tpbGxfYW5jaG9yZWRfdXJicyhzdHJ1Y3QgdXNiX2FuY2hvciAqYW5jaG9yKTsKIGV4dGVybiB2b2lkIHVzYl9wb2lzb25fYW5jaG9yZWRfdXJicyhzdHJ1Y3QgdXNiX2FuY2hvciAqYW5jaG9yKTsKK2V4dGVybiB2b2lkIHVzYl91bnBvaXNvbl9hbmNob3JlZF91cmJzKHN0cnVjdCB1c2JfYW5jaG9yICphbmNob3IpOwogZXh0ZXJuIHZvaWQgdXNiX3VubGlua19hbmNob3JlZF91cmJzKHN0cnVjdCB1c2JfYW5jaG9yICphbmNob3IpOwogZXh0ZXJuIHZvaWQgdXNiX2FuY2hvcl91cmIoc3RydWN0IHVyYiAqdXJiLCBzdHJ1Y3QgdXNiX2FuY2hvciAqYW5jaG9yKTsKIGV4dGVybiB2b2lkIHVzYl91bmFuY2hvcl91cmIoc3RydWN0IHVyYiAqdXJiKTsKQEAgLTE3MjIsMTAgKzE3NDIsNiBAQAogCiAjZGVmaW5lIGVycihmb3JtYXQsIGFyZy4uLikgcHJpbnRrKEtFUk5fRVJSIEtCVUlMRF9NT0ROQU1FICI6ICIgXAogCWZvcm1hdCAiXG4iICwgIyMgYXJnKQotI2RlZmluZSBpbmZvKGZvcm1hdCwgYXJnLi4uKSBwcmludGsoS0VSTl9JTkZPIEtCVUlMRF9NT0ROQU1FICI6ICIgXAotCWZvcm1hdCAiXG4iICwgIyMgYXJnKQotI2RlZmluZSB3YXJuKGZvcm1hdCwgYXJnLi4uKSBwcmludGsoS0VSTl9XQVJOSU5HIEtCVUlMRF9NT0ROQU1FICI6ICIgXAotCWZvcm1hdCAiXG4iICwgIyMgYXJnKQogCiAjZW5kaWYgIC8qIF9fS0VSTkVMX18gKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC91c2IvYXNzb2NpYXRpb24uaCBiL2luY2x1ZGUvbGludXgvdXNiL2Fzc29jaWF0aW9uLmgKaW5kZXggMDdjNWUzYy4uMGE0YTE4YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC91c2IvYXNzb2NpYXRpb24uaAorKysgYi9pbmNsdWRlL2xpbnV4L3VzYi9hc3NvY2lhdGlvbi5oCkBAIC0yOCwxNyArMjgsMTcgQEAKIH07CiAKIC8qIERpZmZlcmVudCBmaWVsZHMgZGVmaW5lZCBieSB0aGUgc3BlYyAqLwotI2RlZmluZSBXVVNCX0FSX0Fzc29jaWF0aW9uVHlwZUlkCXsgLmlkID0gMHgwMDAwLCAubGVuID0gIDIgfQotI2RlZmluZSBXVVNCX0FSX0Fzc29jaWF0aW9uU3ViVHlwZUlkCXsgLmlkID0gMHgwMDAxLCAubGVuID0gIDIgfQotI2RlZmluZSBXVVNCX0FSX0xlbmd0aAkJCXsgLmlkID0gMHgwMDAyLCAubGVuID0gIDQgfQotI2RlZmluZSBXVVNCX0FSX0Fzc29jaWF0aW9uU3RhdHVzCXsgLmlkID0gMHgwMDA0LCAubGVuID0gIDQgfQotI2RlZmluZSBXVVNCX0FSX0xhbmdJRAkJCXsgLmlkID0gMHgwMDA4LCAubGVuID0gIDIgfQotI2RlZmluZSBXVVNCX0FSX0RldmljZUZyaWVuZGx5TmFtZQl7IC5pZCA9IDB4MDAwYiwgLmxlbiA9IDY0IH0gLyogbWF4ICovCi0jZGVmaW5lIFdVU0JfQVJfSG9zdEZyaWVuZGx5TmFtZQl7IC5pZCA9IDB4MDAwYywgLmxlbiA9IDY0IH0gLyogbWF4ICovCi0jZGVmaW5lIFdVU0JfQVJfQ0hJRAkJCXsgLmlkID0gMHgxMDAwLCAubGVuID0gMTYgfQotI2RlZmluZSBXVVNCX0FSX0NESUQJCQl7IC5pZCA9IDB4MTAwMSwgLmxlbiA9IDE2IH0KLSNkZWZpbmUgV1VTQl9BUl9Db25uZWN0aW9uQ29udGV4dAl7IC5pZCA9IDB4MTAwMiwgLmxlbiA9IDQ4IH0KLSNkZWZpbmUgV1VTQl9BUl9CYW5kR3JvdXBzCQl7IC5pZCA9IDB4MTAwNCwgLmxlbiA9ICAyIH0KKyNkZWZpbmUgV1VTQl9BUl9Bc3NvY2lhdGlvblR5cGVJZAl7IC5pZCA9IGNwdV90b19sZTE2KDB4MDAwMCksIC5sZW4gPSBjcHVfdG9fbGUxNigyKSB9CisjZGVmaW5lIFdVU0JfQVJfQXNzb2NpYXRpb25TdWJUeXBlSWQJeyAuaWQgPSBjcHVfdG9fbGUxNigweDAwMDEpLCAubGVuID0gY3B1X3RvX2xlMTYoMikgfQorI2RlZmluZSBXVVNCX0FSX0xlbmd0aAkJCXsgLmlkID0gY3B1X3RvX2xlMTYoMHgwMDAyKSwgLmxlbiA9IGNwdV90b19sZTE2KDQpIH0KKyNkZWZpbmUgV1VTQl9BUl9Bc3NvY2lhdGlvblN0YXR1cwl7IC5pZCA9IGNwdV90b19sZTE2KDB4MDAwNCksIC5sZW4gPSBjcHVfdG9fbGUxNig0KSB9CisjZGVmaW5lIFdVU0JfQVJfTGFuZ0lECQkJeyAuaWQgPSBjcHVfdG9fbGUxNigweDAwMDgpLCAubGVuID0gY3B1X3RvX2xlMTYoMikgfQorI2RlZmluZSBXVVNCX0FSX0RldmljZUZyaWVuZGx5TmFtZQl7IC5pZCA9IGNwdV90b19sZTE2KDB4MDAwYiksIC5sZW4gPSBjcHVfdG9fbGUxNig2NCkgfSAvKiBtYXggKi8KKyNkZWZpbmUgV1VTQl9BUl9Ib3N0RnJpZW5kbHlOYW1lCXsgLmlkID0gY3B1X3RvX2xlMTYoMHgwMDBjKSwgLmxlbiA9IGNwdV90b19sZTE2KDY0KSB9IC8qIG1heCAqLworI2RlZmluZSBXVVNCX0FSX0NISUQJCQl7IC5pZCA9IGNwdV90b19sZTE2KDB4MTAwMCksIC5sZW4gPSBjcHVfdG9fbGUxNigxNikgfQorI2RlZmluZSBXVVNCX0FSX0NESUQJCQl7IC5pZCA9IGNwdV90b19sZTE2KDB4MTAwMSksIC5sZW4gPSBjcHVfdG9fbGUxNigxNikgfQorI2RlZmluZSBXVVNCX0FSX0Nvbm5lY3Rpb25Db250ZXh0CXsgLmlkID0gY3B1X3RvX2xlMTYoMHgxMDAyKSwgLmxlbiA9IGNwdV90b19sZTE2KDQ4KSB9CisjZGVmaW5lIFdVU0JfQVJfQmFuZEdyb3VwcwkJeyAuaWQgPSBjcHVfdG9fbGUxNigweDEwMDQpLCAubGVuID0gY3B1X3RvX2xlMTYoMikgfQogCiAvKiBDQkFGIENvbnRyb2wgUmVxdWVzdHMgKEFNUzEuMFtUNC0xXSAqLwogZW51bSB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3VzYi9ncGlvX3ZidXMuaCBiL2luY2x1ZGUvbGludXgvdXNiL2dwaW9fdmJ1cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5ZjAzY2MKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L3VzYi9ncGlvX3ZidXMuaApAQCAtMCwwICsxLDMwIEBACisvKgorICogQSBzaW1wbGUgR1BJTyBWQlVTIHNlbnNpbmcgZHJpdmVyIGZvciBCIHBlcmlwaGVyYWwgb25seSBkZXZpY2VzCisgKiB3aXRoIGludGVybmFsIHRyYW5zY2VpdmVycy4KKyAqIE9wdGlvbmFsbHkgRCsgcHVsbHVwIGNhbiBiZSBjb250cm9sbGVkIGJ5IGEgc2Vjb25kIEdQSU8uCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA4IFBoaWxpcHAgWmFiZWwgPHBoaWxpcHAuemFiZWxAZ21haWwuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICovCisKKy8qKgorICogc3RydWN0IGdwaW9fdmJ1c19tYWNoX2luZm8gLSBjb25maWd1cmF0aW9uIGZvciBncGlvX3ZidXMKKyAqIEBncGlvX3ZidXM6IFZCVVMgc2Vuc2luZyBHUElPCisgKiBAZ3Bpb19wdWxsdXA6IG9wdGlvbmFsIEQrIG9yIEQtIHB1bGx1cCBHUElPIChlbHNlIG5lZ2F0aXZlL2ludmFsaWQpCisgKiBAZ3Bpb192YnVzX2ludmVydGVkOiB0cnVlIGlmIGdwaW9fdmJ1cyBpcyBhY3RpdmUgbG93CisgKiBAZ3Bpb19wdWxsdXBfaW52ZXJ0ZWQ6IHRydWUgaWYgZ3Bpb19wdWxsdXAgaXMgYWN0aXZlIGxvdworICoKKyAqIFRoZSBWQlVTIHNlbnNpbmcgR1BJTyBzaG91bGQgaGF2ZSBhIHB1bGxkb3duLCB3aGljaCB3aWxsIG5vcm1hbGx5IGJlCisgKiBwYXJ0IG9mIGEgcmVzaXN0b3IgbGFkZGVyIHR1cm5pbmcgYSA0LjBWLTUuMjVWIGxldmVsIG9uIFZCVVMgaW50byBhCisgKiB2YWx1ZSB0aGUgR1BJTyBkZXRlY3RzIGFzIGFjdGl2ZS4gIFNvbWUgc3lzdGVtcyB3aWxsIHVzZSBjb21wYXJhdG9ycy4KKyAqLworc3RydWN0IGdwaW9fdmJ1c19tYWNoX2luZm8geworCWludCBncGlvX3ZidXM7CisJaW50IGdwaW9fcHVsbHVwOworCWJvb2wgZ3Bpb192YnVzX2ludmVydGVkOworCWJvb2wgZ3Bpb19wdWxsdXBfaW52ZXJ0ZWQ7Cit9OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC91c2IvbXVzYi5oIGIvaW5jbHVkZS9saW51eC91c2IvbXVzYi5oCmluZGV4IDYzMDk2MmMuLmQ2YWFkMGUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdXNiL211c2IuaAorKysgYi9pbmNsdWRlL2xpbnV4L3VzYi9tdXNiLmgKQEAgLTQ3LDYgKzQ3LDExIEBACiAJdTgJCXJhbV9iaXRzOwkvKiByYW0gYWRkcmVzcyBzaXplICovCiAKIAlzdHJ1Y3QgbXVzYl9oZHJjX2Vwc19iaXRzICplcHNfYml0czsKKyNpZmRlZiBDT05GSUdfQkxBQ0tGSU4KKyAgICAgICAgLyogQSBHUElPIGNvbnRyb2xsaW5nIFZSU0VMIGluIEJsYWNrZmluICovCisgICAgICAgIHVuc2lnbmVkIGludCAgICBncGlvX3Zyc2VsOworI2VuZGlmCisKIH07CiAKIHN0cnVjdCBtdXNiX2hkcmNfcGxhdGZvcm1fZGF0YSB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3VzYi9vdGcuaCBiL2luY2x1ZGUvbGludXgvdXNiL290Zy5oCmluZGV4IDFkYjI1ZDEuLjk0ZGY0ZmUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdXNiL290Zy5oCisrKyBiL2luY2x1ZGUvbGludXgvdXNiL290Zy5oCkBAIC04NCw2ICs4NCw3IEBACiAKIC8qIGZvciB1c2IgaG9zdCBhbmQgcGVyaXBoZXJhbCBjb250cm9sbGVyIGRyaXZlcnMgKi8KIGV4dGVybiBzdHJ1Y3Qgb3RnX3RyYW5zY2VpdmVyICpvdGdfZ2V0X3RyYW5zY2VpdmVyKHZvaWQpOworZXh0ZXJuIHZvaWQgb3RnX3B1dF90cmFuc2NlaXZlcihzdHJ1Y3Qgb3RnX3RyYW5zY2VpdmVyICopOwogCiBzdGF0aWMgaW5saW5lIGludAogb3RnX3N0YXJ0X2hucChzdHJ1Y3Qgb3RnX3RyYW5zY2VpdmVyICpvdGcpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3VzYl91c3VhbC5oIGIvaW5jbHVkZS9saW51eC91c2JfdXN1YWwuaAppbmRleCBkOWEzYmJlLi4xZWVhMWFiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3VzYl91c3VhbC5oCisrKyBiL2luY2x1ZGUvbGludXgvdXNiX3VzdWFsLmgKQEAgLTUyLDggKzUyLDExIEBACiAJVVNfRkxBRyhNQVhfU0VDVE9SU19NSU4sMHgwMDAwMjAwMCkJCQlcCiAJCS8qIFNldHMgbWF4X3NlY3RvcnMgdG8gYXJjaCBtaW4gKi8JCVwKIAlVU19GTEFHKEJVTEtfSUdOT1JFX1RBRywweDAwMDA0MDAwKQkJCVwKLQkJLyogSWdub3JlIHRhZyBtaXNtYXRjaCBpbiBidWxrIG9wZXJhdGlvbnMgKi8KLQorCQkvKiBJZ25vcmUgdGFnIG1pc21hdGNoIGluIGJ1bGsgb3BlcmF0aW9ucyAqLyAgICBcCisJVVNfRkxBRyhTQU5FX1NFTlNFLCAgICAgMHgwMDAwODAwMCkJCQlcCisJCS8qIFNhbmUgU2Vuc2UgKD4gMTggYnl0ZXMpICovCQkJXAorCVVTX0ZMQUcoQ0FQQUNJVFlfT0ssCTB4MDAwMTAwMDApCQkJXAorCQkvKiBSRUFEIENBUEFDSVRZIHJlc3BvbnNlIGlzIGNvcnJlY3QgKi8KIAogI2RlZmluZSBVU19GTEFHKG5hbWUsIHZhbHVlKQlVU19GTF8jI25hbWUgPSB2YWx1ZSAsCiBlbnVtIHsgVVNfRE9fQUxMX0ZMQUdTIH07CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3ZtYWxsb2MuaCBiL2luY2x1ZGUvbGludXgvdm1hbGxvYy5oCmluZGV4IDMwN2I4ODUuLjUwNmU3NjIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdm1hbGxvYy5oCisrKyBiL2luY2x1ZGUvbGludXgvdm1hbGxvYy5oCkBAIC05Nyw2ICs5NywxMCBAQAogZXh0ZXJuIHN0cnVjdCB2bV9zdHJ1Y3QgKmFsbG9jX3ZtX2FyZWEoc2l6ZV90IHNpemUpOwogZXh0ZXJuIHZvaWQgZnJlZV92bV9hcmVhKHN0cnVjdCB2bV9zdHJ1Y3QgKmFyZWEpOwogCisvKiBmb3IgL2Rldi9rbWVtICovCitleHRlcm4gbG9uZyB2cmVhZChjaGFyICpidWYsIGNoYXIgKmFkZHIsIHVuc2lnbmVkIGxvbmcgY291bnQpOworZXh0ZXJuIGxvbmcgdndyaXRlKGNoYXIgKmJ1ZiwgY2hhciAqYWRkciwgdW5zaWduZWQgbG9uZyBjb3VudCk7CisKIC8qCiAgKglJbnRlcm5hbHMuICBEb250J3QgdXNlLi4KICAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC93aW1heC5oIGIvaW5jbHVkZS9saW51eC93aW1heC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4OWRlN2YKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L3dpbWF4LmgKQEAgLTAsMCArMSwyMzQgQEAKKy8qCisgKiBMaW51eCBXaU1heAorICogQVBJIGZvciB1c2VyIHNwYWNlCisgKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgICBkaXN0cmlidXRpb24uCisgKiAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqCisgKiBJbnRlbCBDb3Jwb3JhdGlvbiA8bGludXgtd2ltYXhAaW50ZWwuY29tPgorICogSW5ha3kgUGVyZXotR29uemFsZXogPGluYWt5LnBlcmV6LWdvbnphbGV6QGludGVsLmNvbT4KKyAqICAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqCisgKgorICogVGhpcyBmaWxlIGRlY2xhcmVzIHRoZSB1c2VyL2tlcm5lbCBwcm90b2NvbCB0aGF0IGlzIHNwb2tlbiBvdmVyCisgKiBHZW5lcmljIE5ldGxpbmssIGFzIHdlbGwgYXMgYW55IHR5cGUgZGVjbGFyYXRpb24gdGhhdCBpcyB0byBiZSB1c2VkCisgKiBieSBrZXJuZWwgYW5kIHVzZXIgc3BhY2UuCisgKgorICogSXQgaXMgaW50ZW5kZWQgZm9yIHVzZXIgc3BhY2UgdG8gY2xvbmUgaXQgdmVyYmF0aW0gdG8gdXNlIGl0IGFzIGEKKyAqIHByaW1hcnkgcmVmZXJlbmNlIGZvciBkZWZpbml0aW9ucy4KKyAqCisgKiBTdHVmZiBpbnRlbmRlZCBmb3Iga2VybmVsIHVzYWdlIGFzIHdlbGwgYXMgZnVsbCBwcm90b2NvbCBhbmQgc3RhY2sKKyAqIGRvY3VtZW50YXRpb24gaXMgcm9vdGVkIGluIGluY2x1ZGUvbmV0L3dpbWF4LmguCisgKi8KKworI2lmbmRlZiBfX0xJTlVYX19XSU1BWF9IX18KKyNkZWZpbmUgX19MSU5VWF9fV0lNQVhfSF9fCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCitlbnVtIHsKKwkvKioKKwkgKiBWZXJzaW9uIG9mIHRoZSBpbnRlcmZhY2UgKHVuc2lnbmVkIGRlY2ltYWwsIE1NbSwgbWF4IDI1LjUpCisJICogTSAtIE1ham9yOiBjaGFuZ2UgaWYgcmVtb3Zpbmcgb3IgbW9kaWZ5aW5nIGFuIGV4aXN0aW5nIGNhbGwuCisJICogbSAtIG1pbm9yOiBjaGFuZ2Ugd2hlbiBhZGRpbmcgYSBuZXcgY2FsbAorCSAqLworCVdJTUFYX0dOTF9WRVJTSU9OID0gMDAsCisJLyogR2VuZXJpYyBOZXRMaW5rIGF0dHJpYnV0ZXMgKi8KKwlXSU1BWF9HTkxfQVRUUl9JTlZBTElEID0gMHgwMCwKKwlXSU1BWF9HTkxfQVRUUl9NQVggPSAxMCwKK307CisKKworLyoKKyAqIEdlbmVyaWMgTmV0TGluayBvcGVyYXRpb25zCisgKgorICogTW9zdCBvZiB0aGVzZSBtYXAgdG8gYW4gQVBJIGNhbGw7IF9PUF8gc3RhbmRzIGZvciBvcGVyYXRpb24sIF9SUF8KKyAqIGZvciByZXBseSBhbmQgX1JFXyBmb3IgcmVwb3J0IChha2E6IHNpZ25hbCkuCisgKi8KK2VudW0geworCVdJTUFYX0dOTF9PUF9NU0dfRlJPTV9VU0VSLAkvKiBVc2VyIHRvIGtlcm5lbCBtZXNzYWdlICovCisJV0lNQVhfR05MX09QX01TR19UT19VU0VSLAkvKiBLZXJuZWwgdG8gdXNlciBtZXNzYWdlICovCisJV0lNQVhfR05MX09QX1JGS0lMTCwJLyogUnVuIHdpbWF4X3Jma2lsbCgpICovCisJV0lNQVhfR05MX09QX1JFU0VULAkvKiBSdW4gd2ltYXhfcmZraWxsKCkgKi8KKwlXSU1BWF9HTkxfUkVfU1RBVEVfQ0hBTkdFLAkvKiBSZXBvcnQ6IHN0YXR1cyBjaGFuZ2UgKi8KK307CisKKworLyogTWVzc2FnZSBmcm9tIHVzZXIgLyB0byB1c2VyICovCitlbnVtIHsKKwlXSU1BWF9HTkxfTVNHX0lGSURYID0gMSwKKwlXSU1BWF9HTkxfTVNHX1BJUEVfTkFNRSwKKwlXSU1BWF9HTkxfTVNHX0RBVEEsCit9OworCisKKy8qCisgKiB3aW1heF9yZmtpbGwoKQorICoKKyAqIFRoZSBzdGF0ZSBvZiB0aGUgcmFkaW8gKE9OL09GRikgaXMgbWFwcGVkIHRvIHRoZSByZmtpbGwgc3Vic3lzdGVtJ3MKKyAqIHN3aXRjaCBzdGF0ZSAoRElTQUJMRUQvRU5BQkxFRCkuCisgKi8KK2VudW0gd2ltYXhfcmZfc3RhdGUgeworCVdJTUFYX1JGX09GRiA9IDAsCS8qIFJhZGlvIGlzIG9mZiwgcmZraWxsIG9uL2VuYWJsZWQgKi8KKwlXSU1BWF9SRl9PTiA9IDEsCS8qIFJhZGlvIGlzIG9uLCByZmtpbGwgb2ZmL2Rpc2FibGVkICovCisJV0lNQVhfUkZfUVVFUlkgPSAyLAorfTsKKworLyogQXR0cmlidXRlcyAqLworZW51bSB7CisJV0lNQVhfR05MX1JGS0lMTF9JRklEWCA9IDEsCisJV0lNQVhfR05MX1JGS0lMTF9TVEFURSwKK307CisKKworLyogQXR0cmlidXRlcyBmb3Igd2ltYXhfcmVzZXQoKSAqLworZW51bSB7CisJV0lNQVhfR05MX1JFU0VUX0lGSURYID0gMSwKK307CisKKworLyoKKyAqIEF0dHJpYnV0ZXMgZm9yIHRoZSBSZXBvcnQgU3RhdGUgQ2hhbmdlCisgKgorICogRm9yIG5vdyB3ZSBqdXN0IGhhdmUgdGhlIG9sZCBhbmQgbmV3IHN0YXRlczsgbmV3IGF0dHJpYnV0ZXMgbWlnaHQKKyAqIGJlIGFkZGVkIGxhdGVyIG9uLgorICovCitlbnVtIHsKKwlXSU1BWF9HTkxfU1RDSF9JRklEWCA9IDEsCisJV0lNQVhfR05MX1NUQ0hfU1RBVEVfT0xELAorCVdJTUFYX0dOTF9TVENIX1NUQVRFX05FVywKK307CisKKworLyoqCisgKiBlbnVtIHdpbWF4X3N0IC0gVGhlIGRpZmZlcmVudCBzdGF0ZXMgb2YgYSBXaU1BWCBkZXZpY2UKKyAqIEBfX1dJTUFYX1NUX05VTEw6IFRoZSBkZXZpY2Ugc3RydWN0dXJlIGhhcyBiZWVuIGFsbG9jYXRlZCBhbmQgemVyb2VkLAorICogICAgIGJ1dCBzdGlsbCB3aW1heF9kZXZfYWRkKCkgaGFzbid0IGJlZW4gY2FsbGVkLiBUaGVyZSBpcyBubyBzdGF0ZS4KKyAqCisgKiBAV0lNQVhfU1RfRE9XTjogVGhlIGRldmljZSBoYXMgYmVlbiByZWdpc3RlcmVkIHdpdGggdGhlIFdpTUFYIGFuZAorICogICAgIG5ldHdvcmtpbmcgc3RhY2tzLCBidXQgaXQgaXMgbm90IGluaXRpYWxpemVkIChub3JtYWxseSB0aGF0IGlzCisgKiAgICAgZG9uZSB3aXRoICdpZmNvbmZpZyBERVYgdXAnIFtvciBlcXVpdmFsZW50XSwgd2hpY2ggY2FuIHVwbG9hZAorICogICAgIGZpcm13YXJlIGFuZCBlbmFibGUgY29tbXVuaWNhdGlvbnMgd2l0aCB0aGUgZGV2aWNlKS4KKyAqICAgICBJbiB0aGlzIHN0YXRlLCB0aGUgZGV2aWNlIGlzIHBvd2VyZWQgZG93biBhbmQgdXNpbmcgYXMgbGVzcworICogICAgIHBvd2VyIGFzIHBvc3NpYmxlLgorICogICAgIFRoaXMgc3RhdGUgaXMgdGhlIGRlZmF1bHQgYWZ0ZXIgYSBjYWxsIHRvIHdpbWF4X2Rldl9hZGQoKS4gSXQKKyAqICAgICBpcyBvayB0byBoYXZlIGRyaXZlcnMgbW92ZSBkaXJlY3RseSB0byAlV0lNQVhfU1RfVU5JTklUSUFMSVpFRAorICogICAgIG9yICVXSU1BWF9TVF9SQURJT19PRkYgaW4gX3Byb2JlKCkgYWZ0ZXIgdGhlIGNhbGwgdG8KKyAqICAgICB3aW1heF9kZXZfYWRkKCkuCisgKiAgICAgSXQgaXMgcmVjb21tZW5kZWQgdGhhdCB0aGUgZHJpdmVyIGxlYXZlcyB0aGlzIHN0YXRlIHdoZW4KKyAqICAgICBjYWxsaW5nICdpZmNvbmZpZyBERVYgdXAnIGFuZCBlbnRlcnMgaXQgYmFjayBvbiAnaWZjb25maWcgREVWCisgKiAgICAgZG93bicuCisgKgorICogQF9fV0lNQVhfU1RfUVVJRVNDSU5HOiBUaGUgZGV2aWNlIGlzIGJlaW5nIHRvcm4gZG93biwgc28gbm8gQVBJCisgKiAgICAgb3BlcmF0aW9ucyBhcmUgYWxsb3dlZCB0byBwcm9jZWVkIGV4Y2VwdCB0aGUgb25lcyBuZWVkZWQgdG8KKyAqICAgICBjb21wbGV0ZSB0aGUgZGV2aWNlIGNsZWFuIHVwIHByb2Nlc3MuCisgKgorICogQFdJTUFYX1NUX1VOSU5JVElBTElaRUQ6IFtvcHRpb25hbF0gQ29tbXVuaWNhdGlvbiB3aXRoIHRoZSBkZXZpY2UKKyAqICAgICBpcyBzZXR1cCwgYnV0IHRoZSBkZXZpY2Ugc3RpbGwgcmVxdWlyZXMgc29tZSBjb25maWd1cmF0aW9uCisgKiAgICAgYmVmb3JlIGJlaW5nIG9wZXJhdGlvbmFsLgorICogICAgIFNvbWUgV2lNQVggQVBJIGNhbGxzIG1pZ2h0IHdvcmsuCisgKgorICogQFdJTUFYX1NUX1JBRElPX09GRjogVGhlIGRldmljZSBpcyBmdWxseSB1cDsgcmFkaW8gaXMgb2ZmICh3ZXRoZXIKKyAqICAgICBieSBoYXJkd2FyZSBvciBzb2Z0d2FyZSBzd2l0Y2hlcykuCisgKiAgICAgSXQgaXMgcmVjb21tZW5kZWQgdG8gYWx3YXlzIGxlYXZlIHRoZSBkZXZpY2UgaW4gdGhpcyBzdGF0ZQorICogICAgIGFmdGVyIGluaXRpYWxpemF0aW9uLgorICoKKyAqIEBXSU1BWF9TVF9SRUFEWTogVGhlIGRldmljZSBpcyBmdWxseSB1cCBhbmQgcmFkaW8gaXMgb24uCisgKgorICogQFdJTUFYX1NUX1NDQU5OSU5HOiBbb3B0aW9uYWxdIFRoZSBkZXZpY2UgaGFzIGJlZW4gaW5zdHJ1Y3RlZCB0bworICogICAgIHNjYW4uIEluIHRoaXMgc3RhdGUsIHRoZSBkZXZpY2UgY2Fubm90IGJlIGFjdGl2ZWx5IGNvbm5lY3RlZCB0bworICogICAgIGEgbmV0d29yay4KKyAqCisgKiBAV0lNQVhfU1RfQ09OTkVDVElORzogVGhlIGRldmljZSBpcyBjb25uZWN0aW5nIHRvIGEgbmV0d29yay4gVGhpcworICogICAgIHN0YXRlIGV4aXN0cyBiZWNhdXNlIGluIHNvbWUgZGV2aWNlcywgdGhlIGNvbm5lY3QgcHJvY2VzcyBjYW4KKyAqICAgICBpbmNsdWRlIGEgbnVtYmVyIG9mIG5lZ290aWF0aW9ucyBiZXR3ZWVuIHVzZXIgc3BhY2UsIGtlcm5lbAorICogICAgIHNwYWNlIGFuZCB0aGUgZGV2aWNlLiBVc2VyIHNwYWNlIG5lZWRzIHRvIGtub3cgd2hhdCB0aGUgZGV2aWNlCisgKiAgICAgaXMgZG9pbmcuIElmIHRoZSBjb25uZWN0IHNlcXVlbmNlIGluIGEgZGV2aWNlIGlzIGF0b21pYyBhbmQKKyAqICAgICBmYXN0LCB0aGUgZGV2aWNlIGNhbiB0cmFuc2l0aW9uIGRpcmVjdGx5IHRvIENPTk5FQ1RFRAorICoKKyAqIEBXSU1BWF9TVF9DT05ORUNURUQ6IFRoZSBkZXZpY2UgaXMgY29ubmVjdGVkIHRvIGEgbmV0d29yay4KKyAqCisgKiBAX19XSU1BWF9TVF9JTlZBTElEOiBUaGlzIGlzIGFuIGludmFsaWQgc3RhdGUgdXNlZCB0byBtYXJrIHRoZQorICogICAgIG1heGltdW0gbnVtZXJpYyB2YWx1ZSBvZiBzdGF0ZXMuCisgKgorICogRGVzY3JpcHRpb246CisgKgorICogVHJhbnNpdGlvbnMgZnJvbSBvbmUgc3RhdGUgdG8gYW5vdGhlciBvbmUgYXJlIGF0b21pYyBhbmQgY2FuIG9ubHkKKyAqIGJlIGNhdXNlZCBpbiBrZXJuZWwgc3BhY2Ugd2l0aCB3aW1heF9zdGF0ZV9jaGFuZ2UoKS4gVG8gcmVhZCB0aGUKKyAqIHN0YXRlLCB1c2Ugd2ltYXhfc3RhdGVfZ2V0KCkuCisgKgorICogU3RhdGVzIHN0YXJ0aW5nIHdpdGggX18gYXJlIGludGVybmFsIGFuZCBzaGFsbCBub3QgYmUgdXNlZCBvcgorICogcmVmZXJyZWQgdG8gYnkgZHJpdmVycyBvciB1c2Vyc3BhY2UuIFRoZXkgbG9vayB1Z2x5LCBidXQgdGhhdCdzIHRoZQorICogcG9pbnQgLS0gaWYgYW55IHVzZSBpcyBtYWRlIG5vbi1pbnRlcm5hbCB0byB0aGUgc3RhY2ssIGl0IGlzIGVhc2llcgorICogdG8gY2F0Y2ggb24gcmV2aWV3LgorICoKKyAqIEFsbCBBUEkgb3BlcmF0aW9ucyBbd2l0aCB3ZWxsIGRlZmluZWQgZXhjZXB0aW9uc10gd2lsbCB0YWtlIHRoZQorICogZGV2aWNlIG11dGV4IGJlZm9yZSBzdGFydGluZyBhbmQgdGhlbiBjaGVjayB0aGUgc3RhdGUuIElmIHRoZSBzdGF0ZQorICogaXMgJV9fV0lNQVhfU1RfTlVMTCwgJVdJTUFYX1NUX0RPV04sICVXSU1BWF9TVF9VTklOSVRJQUxJWkVEIG9yCisgKiAlX19XSU1BWF9TVF9RVUlFU0NJTkcsIGl0IHdpbGwgZHJvcCB0aGUgbG9jayBhbmQgcXVpdCB3aXRoCisgKiAtJUVJTlZBTCwgLSVFTk9NRURJVU0sIC0lRU5PVENPTk4gb3IgLSVFU0hVVERPV04uCisgKgorICogVGhlIG9yZGVyIG9mIHRoZSBkZWZpbml0aW9ucyBpcyBpbXBvcnRhbnQsIHNvIHdlIGNhbiBkbyBudW1lcmljYWwKKyAqIGNvbXBhcmlzb25zIChlZzogPCAlV0lNQVhfU1RfUkFESU9fT0ZGIG1lYW5zIHRoZSBkZXZpY2UgaXMgbm90IHJlYWR5CisgKiB0byBvcGVyYXRlKS4KKyAqLworLyoKKyAqIFRoZSBhbGxvd2VkIHN0YXRlIHRyYW5zaXRpb25zIGFyZSBkZXNjcmliZWQgaW4gdGhlIHRhYmxlIGJlbG93CisgKiAoc3RhdGVzIGluIHJvd3MgY2FuIGdvIHRvIHN0YXRlcyBpbiBjb2x1bW5zIHdoZXJlIHRoZXJlIGlzIGFuIFgpOgorICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOSU5JICAgUkFESU8gUkVBRFkgU0NBTiBDT05ORUMgQ09OTkVDCisgKiAgICAgICAgICAgICBOVUxMIERPV04gUVVJRVNDSU5HIFRJQUxJWkVEICBPRkYgICAgICAgIE5JTkcgIFRJTkcgICBURUQKKyAqIE5VTEwgICAgICAgICAtICAgIHgKKyAqIERPV04gICAgICAgICAgICAgIC0gICAgICB4ICAgICAgICB4ICAgICAgIHgKKyAqIFFVSUVTQ0lORyAgICAgICAgIHggICAgICAtCisgKiBVTklOSVRJQUxJWkVEICAgICAgICAgICAgeCAgICAgICAgLSAgICAgICB4CisgKiBSQURJT19PRkYgICAgICAgICAgICAgICAgeCAgICAgICAgICAgICAgICAtICAgICB4CisgKiBSRUFEWSAgICAgICAgICAgICAgICAgICAgeCAgICAgICAgICAgICAgICB4ICAgICAtICAgICB4ICAgICB4ICAgICAgeAorICogU0NBTk5JTkcgICAgICAgICAgICAgICAgIHggICAgICAgICAgICAgICAgeCAgICAgeCAgICAgLSAgICAgeCAgICAgIHgKKyAqIENPTk5FQ1RJTkcgICAgICAgICAgICAgICB4ICAgICAgICAgICAgICAgIHggICAgIHggICAgIHggICAgIC0gICAgICB4CisgKiBDT05ORUNURUQgICAgICAgICAgICAgICAgeCAgICAgICAgICAgICAgICB4ICAgICB4ICAgICAgICAgICAgICAgICAgLQorICoKKyAqIFRoaXMgdGFibGUgbm90IGF2YWlsYWJsZSBpbiBrZXJuZWwtZG9jIGJlY2F1c2UgdGhlIGZvcm1hdHRpbmcgbWVzc2VzIGl0IHVwLgorICovCisgZW51bSB3aW1heF9zdCB7CisJX19XSU1BWF9TVF9OVUxMID0gMCwKKwlXSU1BWF9TVF9ET1dOLAorCV9fV0lNQVhfU1RfUVVJRVNDSU5HLAorCVdJTUFYX1NUX1VOSU5JVElBTElaRUQsCisJV0lNQVhfU1RfUkFESU9fT0ZGLAorCVdJTUFYX1NUX1JFQURZLAorCVdJTUFYX1NUX1NDQU5OSU5HLAorCVdJTUFYX1NUX0NPTk5FQ1RJTkcsCisJV0lNQVhfU1RfQ09OTkVDVEVELAorCV9fV0lNQVhfU1RfSU5WQUxJRAkJCS8qIEFsd2F5cyBrZWVwIGxhc3QgKi8KK307CisKKworI2VuZGlmIC8qICNpZm5kZWYgX19MSU5VWF9fV0lNQVhfSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3dpbWF4L0tidWlsZCBiL2luY2x1ZGUvbGludXgvd2ltYXgvS2J1aWxkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjYjRmMjYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L3dpbWF4L0tidWlsZApAQCAtMCwwICsxIEBACitoZWFkZXIteSArPSBpMjQwMG0uaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC93aW1heC9kZWJ1Zy5oIGIvaW5jbHVkZS9saW51eC93aW1heC9kZWJ1Zy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhMGM0OTMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L3dpbWF4L2RlYnVnLmgKQEAgLTAsMCArMSw0NTMgQEAKKy8qCisgKiBMaW51eCBXaU1BWAorICogQ29sbGVjdGlvbiBvZiB0b29scyB0byBtYW5hZ2UgZGVidWcgb3BlcmF0aW9ucy4KKyAqCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1LTIwMDcgSW50ZWwgQ29ycG9yYXRpb24KKyAqIEluYWt5IFBlcmV6LUdvbnphbGV6IDxpbmFreS5wZXJlei1nb256YWxlekBpbnRlbC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBLgorICoKKyAqCisgKiBEb24ndCAjaW5jbHVkZSB0aGlzIGZpbGUgZGlyZWN0bHksIHJlYWQgb24hCisgKgorICoKKyAqIEVYRUNVVElORyBERUJVR0dJTkcgQUNUSU9OUyBPUiBOT1QKKyAqCisgKiBUaGUgbWFpbiB0aGluZyB0aGlzIGZyYW1ld29yayBwcm92aWRlcyBpcyBkZWNpc3Npb24gcG93ZXIgdG8gdGFrZSBhCisgKiBkZWJ1ZyBhY3Rpb24gKGxpa2UgcHJpbnRpbmcgYSBtZXNzYWdlKSBpZiB0aGUgY3VycmVudCBkZWJ1ZyBsZXZlbAorICogYWxsb3dzIGl0LgorICoKKyAqIFRoZSBkZWNpc3Npb24gcG93ZXIgaXMgYXQgdHdvIGxldmVsczogYXQgY29tcGlsZS10aW1lICh3aGF0IGRvZXMKKyAqIG5vdCBtYWtlIGl0IGlzIGNvbXBpbGVkIG91dCkgYW5kIGF0IHJ1bi10aW1lLiBUaGUgcnVuLXRpbWUKKyAqIHNlbGVjdGlvbiBpcyBkb25lIHBlci1zdWJtb2R1bGUgKGFzIHRoZXkgYXJlIGRlY2xhcmVkIGJ5IHRoZSB1c2VyCisgKiBvZiB0aGUgZnJhbWV3b3JrKS4KKyAqCisgKiBBIGNhbGwgdG8gZF90ZXN0KEwpIChMIGJlaW5nIHRoZSB0YXJnZXQgZGVidWcgbGV2ZWwpIHJldHVybnMgdHJ1ZQorICogaWYgdGhlIGFjdGlvbiBzaG91bGQgYmUgdGFrZW4gYmVjYXVzZSB0aGUgY3VycmVudCBkZWJ1ZyBsZXZlbHMKKyAqIGFsbG93IGl0IChib3RoIGNvbXBpbGUgYW5kIHJ1biB0aW1lKS4KKyAqCisgKiBJdCBmb2xsb3dzIHRoYXQgYSBjYWxsIHRvIGRfdGVzdCgpIHRoYXQgY2FuIGJlIGRldGVybWluZWQgdG8gYmUKKyAqIGFsd2F5cyBmYWxzZSBhdCBjb21waWxlIHRpbWUgd2lsbCBnZXQgdGhlIGNvZGUgZGVwZW5kaW5nIG9uIGl0CisgKiBjb21waWxlZCBvdXQgYnkgb3B0aW1pemF0aW9uLgorICoKKyAqCisgKiBERUJVRyBMRVZFTFMKKyAqCisgKiBJdCBpcyB1cCB0byB0aGUgY2FsbGVyIHRvIGRlZmluZSBob3cgbXVjaCBhIGRlYnVnZ2luZyBsZXZlbCBpcy4KKyAqCisgKiBDb252ZW50aW9uIHNldHMgMCBhcyAibm8gZGVidWciIChzbyBhbiBhY3Rpb24gbWFya2VkIGFzIGRlYnVnIGxldmVsIDAKKyAqIHdpbGwgYWx3YXlzIGJlIHRha2VuKS4gVGhlIGluY3JlYXNpbmcgZGVidWcgbGV2ZWxzIGFyZSB1c2VkIGZvcgorICogaW5jcmVhc2VkIHZlcmJvc2l0eS4KKyAqCisgKgorICogVVNBR0UKKyAqCisgKiBHcm91cCB0aGUgY29kZSBpbiBtb2R1bGVzIGFuZCBzdWJtb2R1bGVzIGluc2lkZSBlYWNoIG1vZHVsZSBbd2hpY2gKKyAqIGluIG1vc3QgY2FzZXMgbWFwcyB0byBMaW51eCBtb2R1bGVzIGFuZCAuYyBmaWxlcyB0aGF0IGNvbXBvc2UKKyAqIHRob3NlXS4KKyAqCisgKgorICogRm9yIGVhY2ggbW9kdWxlLCB0aGVyZSBpczoKKyAqCisgKiAgLSBhIE1PRFVMRU5BTUUgKHNpbmdsZSB3b3JkLCBsZWdhbCBDIGlkZW50aWZpZXIpCisgKgorICogIC0gYSBkZWJ1Zy1sZXZlbHMuaCBoZWFkZXIgZmlsZSB0aGF0IGRlY2xhcmVzIHRoZSBsaXN0IG9mCisgKiAgICBzdWJtb2R1bGVzIGFuZCB0aGF0IGlzIGluY2x1ZGVkIGJ5IGFsbCAuYyBmaWxlcyB0aGF0IHVzZQorICogICAgdGhlIGRlYnVnZ2luZyB0b29scy4gVGhlIGZpbGUgbmFtZSBjYW4gYmUgYW55dGhpbmcuCisgKgorICogIC0gc29tZSAob3B0aW9uYWwpIC5jIGNvZGUgdG8gbWFuaXB1bGF0ZSB0aGUgcnVudGltZSBkZWJ1ZyBsZXZlbHMKKyAqICAgIHRocm91Z2ggZGVidWdmcy4KKyAqCisgKiBUaGUgZGVidWctbGV2ZWxzLmggZmlsZSB3b3VsZCBsb29rIGxpa2U6CisgKgorICogICAgICNpZm5kZWYgX19kZWJ1Z19sZXZlbHNfX2hfXworICogICAgICNkZWZpbmUgX19kZWJ1Z19sZXZlbHNfX2hfXworICoKKyAqICAgICAjZGVmaW5lIERfTU9EVUxFTkFNRSBtb2R1bGVuYW1lCisgKiAgICAgI2RlZmluZSBEX01BU1RFUiAxMAorICoKKyAqICAgICAjaW5jbHVkZSA8bGludXgvd2ltYXgvZGVidWcuaD4KKyAqCisgKiAgICAgZW51bSBkX21vZHVsZSB7CisgKiAgICAgICAgICAgICBEX1NVQk1PRFVMRV9ERUNMQVJFKHN1Ym1vZHVsZV8xKSwKKyAqICAgICAgICAgICAgIERfU1VCTU9EVUxFX0RFQ0xBUkUoc3VibW9kdWxlXzIpLAorICogICAgICAgICAgICAgLi4uCisgKiAgICAgICAgICAgICBEX1NVQk1PRFVMRV9ERUNMQVJFKHN1Ym1vZHVsZV9OKQorICogICAgIH07CisgKgorICogICAgICNlbmRpZgorICoKKyAqIERfTUFTVEVSIGlzIHRoZSBtYXhpbXVtIGNvbXBpbGUtdGltZSBkZWJ1ZyBsZXZlbDsgYW55IGRlYnVnIGFjdGlvbnMKKyAqIGFib3ZlIHRoaXMgd2lsbCBiZSBvdXQuIERfTU9EVUxFTkFNRSBpcyB0aGUgbW9kdWxlIG5hbWUgKGxlZ2FsIEMKKyAqIGlkZW50aWZpZXIpLCB3aGljaCBoYXMgdG8gYmUgdW5pcXVlIGZvciBlYWNoIG1vZHVsZSAodG8gYXZvaWQKKyAqIG5hbWVzcGFjZSBjb2xsaXNpb25zIGR1cmluZyBsaW5rYWdlKS4gTm90ZSB0aG9zZSAjZGVmaW5lcyBuZWVkIHRvCisgKiBiZSBkb25lIGJlZm9yZSAjaW5jbHVkaW5nIGRlYnVnLmgKKyAqCisgKiBXZSBkZWNsYXJlIE4gZGlmZmVyZW50IHN1Ym1vZHVsZXMgd2hvc2UgZGVidWcgbGV2ZWwgY2FuIGJlCisgKiBpbmRlcGVuZGVudGx5IGNvbnRyb2xsZWQgZHVyaW5nIHJ1bnRpbWUuCisgKgorICogSW4gYSAuYyBmaWxlIG9mIHRoZSBtb2R1bGUgKGFuZCBvbmx5IGluIG9uZSBvZiB0aGVtKSwgZGVmaW5lIHRoZQorICogZm9sbG93aW5nIGNvZGU6CisgKgorICogICAgIHN0cnVjdCBkX2xldmVsIERfTEVWRUxbXSA9IHsKKyAqICAgICAgICAgICAgIERfU1VCTU9EVUxFX0RFRklORShzdWJtb2R1bGVfMSksCisgKiAgICAgICAgICAgICBEX1NVQk1PRFVMRV9ERUZJTkUoc3VibW9kdWxlXzIpLAorICogICAgICAgICAgICAgLi4uCisgKiAgICAgICAgICAgICBEX1NVQk1PRFVMRV9ERUZJTkUoc3VibW9kdWxlX04pLAorICogICAgIH07CisgKiAgICAgc2l6ZV90IERfTEVWRUxfU0laRSA9IEFSUkFZX1NJWkUoRF9MRVZFTCk7CisgKgorICogRXh0ZXJucyBmb3IgZF9sZXZlbF9NT0RVTEVOQU1FIGFuZCBkX2xldmVsX3NpemVfTU9EVUxFTkFNRSBhcmUgdXNlZAorICogYW5kIGRlY2xhcmVkIGluIHRoaXMgZmlsZSB1c2luZyB0aGUgRF9MRVZFTCBhbmQgRF9MRVZFTF9TSVpFIG1hY3JvcworICogI2RlZmluZWQgYWxzbyBpbiB0aGlzIGZpbGUuCisgKgorICogVG8gbWFuaXB1bGF0ZSBmcm9tIHVzZXIgc3BhY2UgdGhlIGxldmVscywgY3JlYXRlIGEgZGVidWdmcyBkZW50cnkKKyAqIGFuZCB0aGVuIHJlZ2lzdGVyIGVhY2ggc3VibW9kdWxlIHdpdGg6CisgKgorICogICAgIHJlc3VsdCA9IGRfbGV2ZWxfcmVnaXN0ZXJfZGVidWdmcygiUFJFRklYXyIsIHN1Ym1vZHVsZV9YLCBwYXJlbnQpOworICogICAgIGlmIChyZXN1bHQgPCAwKQorICogICAgICAgICAgICBnb3RvIGVycm9yOworICoKKyAqIFdoZXJlIFBSRUZJWF8gaXMgYSBuYW1lIG9mIHlvdXIgY2hvc2luZy4gVGhpcyB3aWxsIGNyZWF0ZSBkZWJ1Z2ZzCisgKiBmaWxlIHdpdGggYSBzaW5nbGUgbnVtZXJpYyB2YWx1ZSB0aGF0IGNhbiBiZSB1c2UgdG8gdHdlYWsgaXQuIFRvCisgKiByZW1vdmUgdGhlIGVudGlyZXMsIGp1c3QgdXNlIGRlYnVnZnNfcmVtb3ZlX3JlY3Vyc2l2ZSgpIG9uICdwYXJlbnQnLgorICoKKyAqIE5PVEU6IHJlbWVtYmVyIHRoYXQgZXZlbiBpZiB0aGlzIHdpbGwgc2hvdyBhdHRhY2hlZCB0byBzb21lCisgKiAgICAgcGFydGljdWxhciBpbnN0YW5jZSBvZiBhIGRldmljZSwgdGhlIHNldHRpbmdzIGFyZSAqZ2xvYmFsKi4KKyAqCisgKgorICogT24gZWFjaCBzdWJtb2R1bGUgKGZvciBleGFtcGxlLCAuYyBmaWxlcyksIHRoZSBkZWJ1ZyBpbmZyYXN0cnVjdHVyZQorICogc2hvdWxkIGJlIGluY2x1ZGVkIGxpa2UgdGhpczoKKyAqCisgKiAgICAgI2RlZmluZSBEX1NVQk1PRFVMRSBzdWJtb2R1bGVfeCAgICAgLy8gbWF0Y2hlcyBvbmUgaW4gZGVidWctbGV2ZWxzLmgKKyAqICAgICAjaW5jbHVkZSAiZGVidWctbGV2ZWxzLmgiCisgKgorICogYWZ0ZXIgI2luY2x1ZGluZyBhbGwgeW91ciBpbmNsdWRlIGZpbGVzLgorICoKKyAqCisgKiBOb3cgeW91IGNhbiB1c2UgdGhlIGRfKigpIG1hY3JvcyBiZWxvdyBbZF90ZXN0KCksIGRfZm5zdGFydCgpLAorICogZF9mbmVuZCgpLCBkX3ByaW50ZigpLCBkX2R1bXAoKV0uCisgKgorICogSWYgdGhlaXIgZGVidWcgbGV2ZWwgaXMgZ3JlYXRlciB0aGFuIERfTUFTVEVSLCB0aGV5IHdpbGwgYmUKKyAqIGNvbXBpbGVkIG91dC4KKyAqCisgKiBJZiB0aGVpciBkZWJ1ZyBsZXZlbCBpcyBsb3dlciBvciBlcXVhbCB0aGFuIERfTUFTVEVSIGJ1dCBncmVhdGVyCisgKiB0aGFuIHRoZSBjdXJyZW50IGRlYnVnIGxldmVsIG9mIHRoZWlyIHN1Ym1vZHVsZSwgdGhleSdsbCBiZQorICogaWdub3JlZC4KKyAqCisgKiBPdGhlcndpc2UsIHRoZSBhY3Rpb24gd2lsbCBiZSBwZXJmb3JtZWQuCisgKi8KKyNpZm5kZWYgX19kZWJ1Z19faF9fCisjZGVmaW5lIF9fZGVidWdfX2hfXworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKworCisvKiBCYWNrZW5kIHN0dWZmICovCisKKy8qCisgKiBEZWJ1ZyBiYWNrZW5kOiBnZW5lcmF0ZSBhIG1lc3NhZ2UgaGVhZGVyIGZyb20gYSAnc3RydWN0IGRldmljZScKKyAqCisgKiBAaGVhZDogYnVmZmVyIHdoZXJlIHRvIHBsYWNlIHRoZSBoZWFkZXIKKyAqIEBoZWFkX3NpemU6IGxlbmd0aCBvZiBAaGVhZAorICogQGRldjogcG9pbnRlciB0byBkZXZpY2UgdXNlZCB0byBnZW5lcmF0ZSBhIGhlYWRlciBmcm9tLiBJZiBOVUxMLAorICogICAgIGFuIGVtcHR5ICgiIikgaGVhZGVyIGlzIGdlbmVyYXRlZC4KKyAqLworc3RhdGljIGlubGluZQordm9pZCBfX2RfaGVhZChjaGFyICpoZWFkLCBzaXplX3QgaGVhZF9zaXplLAorCSAgICAgIHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlpZiAoZGV2ID09IE5VTEwpCisJCWhlYWRbMF0gPSAwOworCWVsc2UgaWYgKCh1bnNpZ25lZCBsb25nKWRldiA8IDQwOTYpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJFOiBDb3JydXB0IGRldiAlcFxuIiwgZGV2KTsKKwkJV0FSTl9PTigxKTsKKwl9IGVsc2UKKwkJc25wcmludGYoaGVhZCwgaGVhZF9zaXplLCAiJXMgJXM6ICIsCisJCQkgZGV2X2RyaXZlcl9zdHJpbmcoZGV2KSwgZGV2LT5idXNfaWQpOworfQorCisKKy8qCisgKiBEZWJ1ZyBiYWNrZW5kOiBsb2cgc29tZSBtZXNzYWdlIGlmIGRlYnVnZ2luZyBpcyBlbmFibGVkCisgKgorICogQGw6IGludGVuZGVkIGRlYnVnIGxldmVsCisgKiBAdGFnOiB0YWcgdG8gcHJlZml4IHRoZSBtZXNzYWdlIHdpdGgKKyAqIEBkZXY6ICdzdHJ1Y3QgZGV2aWNlJyBhc3NvY2lhdGVkIHRvIHRoaXMgbWVzc2FnZQorICogQGY6IHByaW50Zi1saWtlIGZvcm1hdCBhbmQgYXJndW1lbnRzCisgKgorICogTm90ZSB0aGlzIGlzIG9wdGltaXplZCBvdXQgaWYgaXQgZG9lc24ndCBwYXNzIHRoZSBjb21waWxlLXRpbWUKKyAqIGNoZWNrOyBob3dldmVyLCBpdCBpcyAqYWx3YXlzKiBjb21waWxlZC4gVGhpcyBpcyB1c2VmdWwgdG8gbWFrZQorICogc3VyZSB0aGUgcHJpbnRmLWxpa2UgZm9ybWF0cyBhbmQgdmFyaWFibGVzIGFyZSBhbHdheXMgY2hlY2tlZCBhbmQKKyAqIHRoZXkgZG9uJ3QgZ2V0IGJpdCByb3QgaWYgeW91IGhhdmUgYWxsIHRoZSBkZWJ1Z2dpbmcgZGlzYWJsZWQuCisgKi8KKyNkZWZpbmUgX2RfcHJpbnRmKGwsIHRhZywgZGV2LCBmLCBhLi4uKQkJCQkJXAorZG8gewkJCQkJCQkJCVwKKwljaGFyIGhlYWRbNjRdOwkJCQkJCQlcCisJaWYgKCFkX3Rlc3QobCkpCQkJCQkJCVwKKwkJYnJlYWs7CQkJCQkJCVwKKwlfX2RfaGVhZChoZWFkLCBzaXplb2YoaGVhZCksIGRldik7CQkJCVwKKwlwcmludGsoS0VSTl9FUlIgIiVzJXMlczogIiBmLCBoZWFkLCBfX2Z1bmNfXywgdGFnLCAjI2EpOwlcCit9IHdoaWxlICgwKQorCisKKy8qCisgKiBDUFAgc2ludGF0aWMgc3VnYXIgdG8gZ2VuZXJhdGUgQV9CIGxpa2Ugc3ltYm9sIG5hbWVzIHdoZW4gb25lIG9mCisgKiB0aGUgYXJndW1lbnRzIGlzIGEgYSBwcmVwcm9jZXNzb3IgI2RlZmluZS4KKyAqLworI2RlZmluZSBfX0RfUEFTVEVfXyh2YXJuYW1lLCBtb2R1bGVuYW1lKSB2YXJuYW1lIyNfIyNtb2R1bGVuYW1lCisjZGVmaW5lIF9fRF9QQVNURSh2YXJuYW1lLCBtb2R1bGVuYW1lKSAoX19EX1BBU1RFX18odmFybmFtZSwgbW9kdWxlbmFtZSkpCisjZGVmaW5lIF9EX1NVQk1PRFVMRV9JTkRFWChfbmFtZSkgKERfU1VCTU9EVUxFX0RFQ0xBUkUoX25hbWUpKQorCisKKy8qCisgKiBTdG9yZSBhIHN1Ym1vZHVsZSdzIHJ1bnRpbWUgZGVidWcgbGV2ZWwgYW5kIG5hbWUKKyAqLworc3RydWN0IGRfbGV2ZWwgeworCXU4IGxldmVsOworCWNvbnN0IGNoYXIgKm5hbWU7Cit9OworCisKKy8qCisgKiBMaXN0IG9mIGF2YWlsYWJsZSBzdWJtb2R1bGVzIGFuZCB0aGVpciBkZWJ1ZyBsZXZlbHMKKyAqCisgKiBXZSBjYWxsIHRoZW0gZF9sZXZlbF9NT0RVTEVOQU1FIGFuZCBkX2xldmVsX3NpemVfTU9EVUxFTkFNRTsgdGhlCisgKiBtYWNyb3MgRF9MRVZFTCBhbmQgRF9MRVZFTF9TSVpFIGNvbnRhaW4gdGhlIG5hbWUgYWxyZWFkeSBmb3IKKyAqIGNvbnZlbmllbmNlLgorICoKKyAqIFRoaXMgYXJyYXkgYW5kIHRoZSBzaXplIGFyZSBkZWZpbmVkIG9uIHNvbWUgLmMgZmlsZSB0aGF0IGlzIHBhcnQgb2YKKyAqIHRoZSBjdXJyZW50IG1vZHVsZS4KKyAqLworI2RlZmluZSBEX0xFVkVMIF9fRF9QQVNURShkX2xldmVsLCBEX01PRFVMRU5BTUUpCisjZGVmaW5lIERfTEVWRUxfU0laRSBfX0RfUEFTVEUoZF9sZXZlbF9zaXplLCBEX01PRFVMRU5BTUUpCisKK2V4dGVybiBzdHJ1Y3QgZF9sZXZlbCBEX0xFVkVMW107CitleHRlcm4gc2l6ZV90IERfTEVWRUxfU0laRTsKKworCisvKgorICogRnJvbnRlbmQgc3R1ZmYKKyAqCisgKgorICogU3R1ZmYgeW91IG5lZWQgdG8gZGVjbGFyZSBwcmlvciB0byB1c2luZyB0aGUgYWN0dWFsICJkZWJ1ZyIgYWN0aW9ucworICogKGRlZmluZWQgYmVsb3cpLgorICovCisKKyNpZm5kZWYgRF9NT0RVTEVOQU1FCisjZXJyb3IgRF9NT0RVTEVOQU1FIGlzIG5vdCBkZWZpbmVkIGluIHlvdXIgZGVidWctbGV2ZWxzLmggZmlsZQorLyoqCisgKiBEX01PRFVMRSAtIE5hbWUgb2YgdGhlIGN1cnJlbnQgbW9kdWxlCisgKgorICogI2RlZmluZSBpbiB5b3VyIG1vZHVsZSdzIGRlYnVnLWxldmVscy5oLCBtYWtpbmcgc3VyZSBpdCBpcworICogdW5pcXVlLiBUaGlzIGhhcyB0byBiZSBhIGxlZ2FsIEMgaWRlbnRpZmllci4KKyAqLworI2RlZmluZSBEX01PRFVMRU5BTUUgdW5kZWZpbmVkX21vZHVsZW5hbWUKKyNlbmRpZgorCisKKyNpZm5kZWYgRF9NQVNURVIKKyN3YXJuaW5nIERfTUFTVEVSIG5vdCBkZWZpbmVkLCBidXQgZGVidWcuaCBpbmNsdWRlZCEgW3NlZSBkb2NzXQorLyoqCisgKiBEX01BU1RFUiAtIENvbXBpbGUgdGltZSBtYXhpbXVtIGRlYnVnIGxldmVsCisgKgorICogI2RlZmluZSBpbiB5b3VyIGRlYnVnLWxldmVscy5oIGZpbGUgdG8gdGhlIG1heGltdW0gZGVidWcgbGV2ZWwgdGhlCisgKiBydW50aW1lIGNvZGUgd2lsbCBiZSBhbGxvd2VkIHRvIGhhdmUuIFRoaXMgYWxsb3dzIHlvdSB0byBwcm92aWRlIGEKKyAqIG1haW4ga25vYi4KKyAqCisgKiBBbnl0aGluZyBhYm92ZSB0aGF0IGxldmVsIHdpbGwgYmUgb3B0aW1pemVkIG91dCBvZiB0aGUgY29tcGlsZS4KKyAqCisgKiBEZWZhdWx0cyB0byB6ZXJvIChubyBkZWJ1ZyBjb2RlIGNvbXBpbGVkIGluKS4KKyAqCisgKiBNYXhpbXVtIG9uZSBkZWZpbml0aW9uIHBlciBtb2R1bGUgKGF0IHRoZSBkZWJ1Zy1sZXZlbHMuaCBmaWxlKS4KKyAqLworI2RlZmluZSBEX01BU1RFUiAwCisjZW5kaWYKKworI2lmbmRlZiBEX1NVQk1PRFVMRQorI2Vycm9yIERfU1VCTU9EVUxFIG5vdCBkZWZpbmVkLCBidXQgZGVidWcuaCBpbmNsdWRlZCEgW3NlZSBkb2NzXQorLyoqCisgKiBEX1NVQk1PRFVMRSAtIE5hbWUgb2YgdGhlIGN1cnJlbnQgc3VibW9kdWxlCisgKgorICogI2RlZmluZSBpbiB5b3VyIHN1Ym1vZHVsZSAuYyBmaWxlIGJlZm9yZSAjaW5jbHVkaW5nIGRlYnVnLWxldmVscy5oCisgKiB0byB0aGUgbmFtZSBvZiB0aGUgY3VycmVudCBzdWJtb2R1bGUgYXMgcHJldmlvdXNseSBkZWNsYXJlZCBhbmQKKyAqIGRlZmluZWQgd2l0aCBEX1NVQk1PRFVMRV9ERUNMQVJFKCkgKGluIHlvdXIgbW9kdWxlJ3MKKyAqIGRlYnVnLWxldmVscy5oKSBhbmQgRF9TVUJNT0RVTEVfREVGSU5FKCkuCisgKgorICogVGhpcyBpcyB1c2VkIHRvIHByb3ZpZGUgcnVudGltZS1jb250cm9sIG92ZXIgdGhlIGRlYnVnIGxldmVscy4KKyAqCisgKiBNYXhpbXVtIG9uZSBwZXIgLmMgZmlsZSEgQ2FuIGJlIHNoYXJlZCBhbW9uZyBkaWZmZXJlbnQgLmMgZmlsZXMKKyAqIChtZWFuaW5nIHRoZXkgYmVsb25nIHRvIHRoZSBzYW1lIHN1Ym1vZHVsZSBjYXRlZ29yaXphdGlvbikuCisgKi8KKyNkZWZpbmUgRF9TVUJNT0RVTEUgdW5kZWZpbmVkX21vZHVsZQorI2VuZGlmCisKKworLyoqCisgKiBEX1NVQk1PRFVMRV9ERUNMQVJFIC0gRGVjbGFyZSBhIHN1Ym1vZHVsZSBmb3IgcnVudGltZSBkZWJ1ZyBsZXZlbCBjb250cm9sCisgKgorICogQF9uYW1lOiBuYW1lIG9mIHRoZSBzdWJtb2R1bGUsIHJlc3RyaWN0ZWQgdG8gdGhlIGNoYXJzIHRoYXQgbWFrZSB1cCBhCisgKiAgICAgdmFsaWQgQyBpZGVudGlmaWVyIChbYS16QS1aMC05X10pLgorICoKKyAqIERlY2xhcmUgaW4gdGhlIG1vZHVsZSdzIGRlYnVnLWxldmVscy5oIGhlYWRlciBmaWxlIGFzOgorICoKKyAqIGVudW0gZF9tb2R1bGUgeworICogICAgICAgICBEX1NVQk1PRFVMRV9ERUNMQVJFKHN1Ym1vZHVsZV8xKSwKKyAqICAgICAgICAgRF9TVUJNT0RVTEVfREVDTEFSRShzdWJtb2R1bGVfMiksCisgKiAgICAgICAgIERfU1VCTU9EVUxFX0RFQ0xBUkUoc3VibW9kdWxlXzMpLAorICogfTsKKyAqCisgKiBTb21lIGNvcnJlc3BvbmRpbmcgLmMgZmlsZSBuZWVkcyB0byBoYXZlIGEgbWF0Y2hpbmcKKyAqIERfU1VCTU9EVUxFX0RFRklORSgpLgorICovCisjZGVmaW5lIERfU1VCTU9EVUxFX0RFQ0xBUkUoX25hbWUpIF9fRF9TVUJNT0RVTEVfIyNfbmFtZQorCisKKy8qKgorICogRF9TVUJNT0RVTEVfREVGSU5FIC0gRGVmaW5lIGEgc3VibW9kdWxlIGZvciBydW50aW1lIGRlYnVnIGxldmVsIGNvbnRyb2wKKyAqCisgKiBAX25hbWU6IG5hbWUgb2YgdGhlIHN1Ym1vZHVsZSwgcmVzdHJpY3RlZCB0byB0aGUgY2hhcnMgdGhhdCBtYWtlIHVwIGEKKyAqICAgICB2YWxpZCBDIGlkZW50aWZpZXIgKFthLXpBLVowLTlfXSkuCisgKgorICogVXNlIG9uY2UgcGVyIG1vZHVsZSAoaW4gc29tZSAuYyBmaWxlKSBhczoKKyAqCisgKiBzdGF0aWMKKyAqIHN0cnVjdCBkX2xldmVsIGRfbGV2ZWxfU1VCTU9EVUxFTkFNRVtdID0geworICogICAgICAgICBEX1NVQk1PRFVMRV9ERUZJTkUoc3VibW9kdWxlXzEpLAorICogICAgICAgICBEX1NVQk1PRFVMRV9ERUZJTkUoc3VibW9kdWxlXzIpLAorICogICAgICAgICBEX1NVQk1PRFVMRV9ERUZJTkUoc3VibW9kdWxlXzMpLAorICogfTsKKyAqIHNpemVfdCBkX2xldmVsX3NpemVfU1VCRE1PRFVMRU5BTUUgPSBBUlJBWV9TSVpFKGRfbGV2ZWxfU1VCRE1PRFVMRU5BTUUpOworICoKKyAqIE1hdGNoaW5nIERfU1VCTU9EVUxFX0RFQ0xBUkUoKXMgaGF2ZSB0byBiZSBwcmVzZW50IGluIGEKKyAqIGRlYnVnLWxldmVscy5oIGhlYWRlciBmaWxlLgorICovCisjZGVmaW5lIERfU1VCTU9EVUxFX0RFRklORShfbmFtZSkJCVwKK1tfX0RfU1VCTU9EVUxFXyMjX25hbWVdID0gewkJCVwKKwkubGV2ZWwgPSAwLAkJCQlcCisJLm5hbWUgPSAjX25hbWUJCQkJXAorfQorCisKKworLyogVGhlIGFjdHVhbCAiZGVidWciIG9wZXJhdGlvbnMgKi8KKworCisvKioKKyAqIGRfdGVzdCAtIFJldHVybnMgdHJ1ZSBpZiBkZWJ1Z2dpbmcgc2hvdWxkIGJlIGVuYWJsZWQKKyAqCisgKiBAbDogaW50ZW5kZWQgZGVidWcgbGV2ZWwgKHVuc2lnbmVkKQorICoKKyAqIElmIHRoZSBtYXN0ZXIgZGVidWcgc3dpdGNoIGlzIGVuYWJsZWQgYW5kIHRoZSBjdXJyZW50IHNldHRpbmdzIGFyZQorICogaGlnaGVyIG9yIGVxdWFsIHRvIHRoZSByZXF1ZXN0ZWQgbGV2ZWwsIHRoZW4gZGVidWdnaW5nCisgKiBvdXRwdXQvYWN0aW9ucyBzaG91bGQgYmUgZW5hYmxlZC4KKyAqCisgKiBOT1RFOgorICoKKyAqIFRoaXMgbmVlZHMgdG8gYmUgY29kZWQgc28gdGhhdCBpdCBjYW4gYmUgZXZhbHVhdGVkIGluIGNvbXBpbGUKKyAqIHRpbWU7IHRoaXMgaXMgd2h5IHRoZSB1Z2x5IEJVR19PTigpIGlzIHBsYWNlZCBpbiB0aGVyZSwgc28gdGhlCisgKiBEX01BU1RFUiBldmFsdWF0aW9uIGNvbXBpbGVzIGFsbCBvdXQgaWYgaXQgaXMgY29tcGlsZS10aW1lIGZhbHNlLgorICovCisjZGVmaW5lIGRfdGVzdChsKQkJCQkJCQlcCisoewkJCQkJCQkJCVwKKwl1bnNpZ25lZCBfX2wgPSBsOwkvKiB0eXBlIGVuZm9yY2VyICovCQkJXAorCShEX01BU1RFUikgPj0gX19sCQkJCQkJXAorCSYmICh7CQkJCQkJCQlcCisJCUJVR19PTihfRF9TVUJNT0RVTEVfSU5ERVgoRF9TVUJNT0RVTEUpID49IERfTEVWRUxfU0laRSk7XAorCQlEX0xFVkVMW19EX1NVQk1PRFVMRV9JTkRFWChEX1NVQk1PRFVMRSldLmxldmVsID49IF9fbDsJXAorCX0pOwkJCQkJCQkJXAorfSkKKworCisvKioKKyAqIGRfZm5zdGFydCAtIGxvZyBtZXNzYWdlIGF0IGZ1bmN0aW9uIHN0YXJ0IGlmIGRlYnVnZ2luZyBlbmFibGVkCisgKgorICogQGw6IGludGVuZGVkIGRlYnVnIGxldmVsCisgKiBAX2RldjogJ3N0cnVjdCBkZXZpY2UnIHBvaW50ZXIsIE5VTEwgaWYgbm9uZSAoZm9yIGNvbnRleHQpCisgKiBAZjogcHJpbnRmLWxpa2UgZm9ybWF0IGFuZCBhcmd1bWVudHMKKyAqLworI2RlZmluZSBkX2Zuc3RhcnQobCwgX2RldiwgZiwgYS4uLikgX2RfcHJpbnRmKGwsICIgRk5TVEFSVCIsIF9kZXYsIGYsICMjIGEpCisKKworLyoqCisgKiBkX2ZuZW5kIC0gbG9nIG1lc3NhZ2UgYXQgZnVuY3Rpb24gZW5kIGlmIGRlYnVnZ2luZyBlbmFibGVkCisgKgorICogQGw6IGludGVuZGVkIGRlYnVnIGxldmVsCisgKiBAX2RldjogJ3N0cnVjdCBkZXZpY2UnIHBvaW50ZXIsIE5VTEwgaWYgbm9uZSAoZm9yIGNvbnRleHQpCisgKiBAZjogcHJpbnRmLWxpa2UgZm9ybWF0IGFuZCBhcmd1bWVudHMKKyAqLworI2RlZmluZSBkX2ZuZW5kKGwsIF9kZXYsIGYsIGEuLi4pIF9kX3ByaW50ZihsLCAiIEZORU5EIiwgX2RldiwgZiwgIyMgYSkKKworCisvKioKKyAqIGRfcHJpbnRmIC0gbG9nIG1lc3NhZ2UgaWYgZGVidWdnaW5nIGVuYWJsZWQKKyAqCisgKiBAbDogaW50ZW5kZWQgZGVidWcgbGV2ZWwKKyAqIEBfZGV2OiAnc3RydWN0IGRldmljZScgcG9pbnRlciwgTlVMTCBpZiBub25lIChmb3IgY29udGV4dCkKKyAqIEBmOiBwcmludGYtbGlrZSBmb3JtYXQgYW5kIGFyZ3VtZW50cworICovCisjZGVmaW5lIGRfcHJpbnRmKGwsIF9kZXYsIGYsIGEuLi4pIF9kX3ByaW50ZihsLCAiIiwgX2RldiwgZiwgIyMgYSkKKworCisvKioKKyAqIGRfZHVtcCAtIGxvZyBidWZmZXIgaGV4IGR1bXAgaWYgZGVidWdnaW5nIGVuYWJsZWQKKyAqCisgKiBAbDogaW50ZW5kZWQgZGVidWcgbGV2ZWwKKyAqIEBfZGV2OiAnc3RydWN0IGRldmljZScgcG9pbnRlciwgTlVMTCBpZiBub25lIChmb3IgY29udGV4dCkKKyAqIEBmOiBwcmludGYtbGlrZSBmb3JtYXQgYW5kIGFyZ3VtZW50cworICovCisjZGVmaW5lIGRfZHVtcChsLCBkZXYsIHB0ciwgc2l6ZSkJCQlcCitkbyB7CQkJCQkJCVwKKwljaGFyIGhlYWRbNjRdOwkJCQkJXAorCWlmICghZF90ZXN0KGwpKQkJCQkJXAorCQlicmVhazsJCQkJCVwKKwlfX2RfaGVhZChoZWFkLCBzaXplb2YoaGVhZCksIGRldik7CQlcCisJcHJpbnRfaGV4X2R1bXAoS0VSTl9FUlIsIGhlYWQsIDAsIDE2LCAxLAlcCisJCSAgICAgICAoKHZvaWQgKikgcHRyKSwgKHNpemUpLCAwKTsJXAorfSB3aGlsZSAoMCkKKworCisvKioKKyAqIEV4cG9ydCBhIHN1Ym1vZHVsZSdzIGRlYnVnIGxldmVsIG92ZXIgZGVidWdmcyBhcyBQUkVGSVhTVUJNT0RVTEUKKyAqCisgKiBAcHJlZml4OiBzdHJpbmcgdG8gcHJlZml4IHRoZSBuYW1lIHdpdGgKKyAqIEBzdWJtb2R1bGU6IG5hbWUgb2Ygc3VibW9kdWxlIChub3QgYSBzdHJpbmcsIGp1c3QgdGhlIG5hbWUpCisgKiBAZGVudHJ5OiBkZWJ1Z2ZzIHBhcmVudCBkZW50cnkKKyAqCisgKiBSZXR1cm5zOiAwIGlmIG9rLCA8IDAgZXJybm8gb24gZXJyb3IuCisgKgorICogRm9yIHJlbW92aW5nLCBqdXN0IHVzZSBkZWJ1Z2ZzX3JlbW92ZV9yZWN1cnNpdmUoKSBvbiB0aGUgcGFyZW50LgorICovCisjZGVmaW5lIGRfbGV2ZWxfcmVnaXN0ZXJfZGVidWdmcyhwcmVmaXgsIG5hbWUsIHBhcmVudCkJCQlcCisoewkJCQkJCQkJCVwKKwlpbnQgcmM7CQkJCQkJCQlcCisJc3RydWN0IGRlbnRyeSAqZmQ7CQkJCQkJXAorCXN0cnVjdCBkZW50cnkgKnZlcmlmeV9wYXJlbnRfdHlwZSA9IHBhcmVudDsJCQlcCisJZmQgPSBkZWJ1Z2ZzX2NyZWF0ZV91OCgJCQkJCQlcCisJCXByZWZpeCAjbmFtZSwgMDYwMCwgdmVyaWZ5X3BhcmVudF90eXBlLAkJCVwKKwkJJihEX0xFVkVMW19fRF9TVUJNT0RVTEVfICMjIG5hbWVdLmxldmVsKSk7CQlcCisJcmMgPSBQVFJfRVJSKGZkKTsJCQkJCQlcCisJaWYgKElTX0VSUihmZCkgJiYgcmMgIT0gLUVOT0RFVikJCQkJXAorCQlwcmludGsoS0VSTl9FUlIgIiVzOiBDYW4ndCBjcmVhdGUgZGVidWdmcyBlbnRyeSAlczogIglcCisJCSAgICAgICAiJWRcbiIsIF9fZnVuY19fLCBwcmVmaXggI25hbWUsIHJjKTsJCVwKKwllbHNlCQkJCQkJCQlcCisJCXJjID0gMDsJCQkJCQkJXAorCXJjOwkJCQkJCQkJXAorfSkKKworCisjZW5kaWYgLyogI2lmbmRlZiBfX2RlYnVnX19oX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvd2ltYXgvaTI0MDBtLmggYi9pbmNsdWRlL2xpbnV4L3dpbWF4L2kyNDAwbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0MTk4ZjUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L3dpbWF4L2kyNDAwbS5oCkBAIC0wLDAgKzEsNTEyIEBACisvKgorICogSW50ZWwgV2lyZWxlc3MgV2lNYXggQ29ubmVjdGlvbiAyNDAwbQorICogSG9zdC1EZXZpY2UgcHJvdG9jb2wgaW50ZXJmYWNlIGRlZmluaXRpb25zCisgKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgICBkaXN0cmlidXRpb24uCisgKiAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqCisgKiBJbnRlbCBDb3Jwb3JhdGlvbiA8bGludXgtd2ltYXhAaW50ZWwuY29tPgorICogSW5ha3kgUGVyZXotR29uemFsZXogPGluYWt5LnBlcmV6LWdvbnphbGV6QGludGVsLmNvbT4KKyAqICAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqCisgKgorICogVGhpcyBoZWFkZXIgZGVmaW5lcyB0aGUgZGF0YSBzdHJ1Y3R1cmVzIGFuZCBjb25zdGFudHMgdXNlZCB0bworICogY29tbXVuaWNhdGUgd2l0aCB0aGUgZGV2aWNlLgorICoKKyAqIEJPT1RNT0RFL0JPT1RST00vRklSTVdBUkUgVVBMT0FEIFBST1RPQ09MCisgKgorICogVGhlIGZpcm13YXJlIHVwbG9hZCBwcm90b2NvbCBpcyBxdWl0ZSBzaW1wbGUgYW5kIG9ubHkgcmVxdWlyZXMgYQorICogaGFuZGZ1bCBvZiBjb21tYW5kcy4gU2VlIGRyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS9mdy5jIGZvciBtb3JlCisgKiBkZXRhaWxzLgorICoKKyAqIFRoZSBCQ0YgZGF0YSBzdHJ1Y3R1cmUgaXMgZm9yIHRoZSBmaXJtd2FyZSBmaWxlIGhlYWRlci4KKyAqCisgKgorICogVEhFIERBVEEgLyBDT05UUk9MIFBST1RPQ09MCisgKgorICogVGhpcyBpcyB0aGUgbm9ybWFsIHByb3RvY29sIHNwb2tlbiB3aXRoIHRoZSBkZXZpY2Ugb25jZSB0aGUKKyAqIGZpcm13YXJlIGlzIHVwbG9hZGVkLiBJdCB0cmFuc3BvcnRzIGRhdGEgcGF5bG9hZHMgYW5kIGNvbnRyb2wKKyAqIG1lc3NhZ2VzIGJhY2sgYW5kIGZvcnRoLgorICoKKyAqIEl0IGNvbnNpc3RzICdtZXNzYWdlcycgdGhhdCBwYWNrIG9uZSBvciBtb3JlIHBheWxvYWRzIGVhY2guIFRoZQorICogZm9ybWF0IGlzIGRlc2NyaWJlZCBpbiBkZXRhaWwgaW4gZHJpdmVycy9uZXQvd2ltYXgvaTI0MDBtL3J4LmMgYW5kCisgKiB0eC5jLgorICoKKyAqCisgKiBUSEUgTDNMNCBQUk9UT0NPTAorICoKKyAqIFRoZSB0ZXJtIEwzTDQgcmVmZXJzIHRvIExheWVyIDMgKHRoZSBkZXZpY2UpLCBMYXllciA0ICh0aGUKKyAqIGRyaXZlci9ob3N0IHNvZnR3YXJlKS4KKyAqCisgKiBUaGlzIGlzIHRoZSBjb250cm9sIHByb3RvY29sIHVzZWQgYnkgdGhlIGhvc3QgdG8gY29udHJvbCB0aGUgaTI0MDBtCisgKiBkZXZpY2UgKHNjYW4sIGNvbm5lY3QsIGRpc2Nvbm5lY3QuLi4pLiBUaGlzIGlzIHNlbnQgdG8gLyByZWNlaXZlZAorICogYXMgY29udHJvbCBmcmFtZXMuIFRoZXNlIGZyYW1lcyBjb25zaXN0IG9mIGEgaGVhZGVyIGFuZCB6ZXJvIG9yCisgKiBtb3JlIFRMVnMgd2l0aCBpbmZvcm1hdGlvbi4gV2UgY2FsbCBlYWNoIGNvbnRyb2wgZnJhbWUgYSAibWVzc2FnZSIuCisgKgorICogRWFjaCBtZXNzYWdlIGlzIGNvbXBvc2VkIG9mOgorICoKKyAqIEhFQURFUgorICogW1RMVjAgKyBQQVlMT0FEMF0KKyAqIFtUTFYxICsgUEFZTE9BRDFdCisgKiBbLi4uXQorICogW1RMVk4gKyBQQVlMT0FETl0KKyAqCisgKiBUaGUgSEVBREVSIGlzIGRlZmluZWQgYnkgJ3N0cnVjdCBpMjQwMG1fbDNsNF9oZHInLiBUaGUgcGF5bG9hZHMgYXJlCisgKiBkZWZpbmVkIGJ5IGEgVExWIHN0cnVjdHVyZSAoVHlwZSBMZW5ndGggVmFsdWUpIHdoaWNoIGlzIGEgJ2hlYWRlcicKKyAqIChzdHJ1Y3QgaTI0MDBtX3Rsdl9oZHIpIGFuZCB0aGVuIHRoZSBwYXlsb2FkLgorICoKKyAqIEFsbCBpbnRlZ2VycyBhcmUgcmVwcmVzZW50ZWQgYXMgTGl0dGxlIEVuZGlhbi4KKyAqCisgKiAtIFJFUVVFU1RTIEFORCBFVkVOVFMKKyAqCisgKiBUaGUgcmVxdWVzdHMgY2FuIGJlIGNsYXNpZmllZCBhcyBmb2xsb3dzOgorICoKKyAqICAgQ09NTUFORDogIGltcGxpZXMgYSByZXF1ZXN0IGZyb20gdGhlIGhvc3QgdG8gdGhlIGRldmljZSByZXF1ZXN0aW5nCisgKiAgICAgICAgICAgICBhbiBhY3Rpb24gYmVpbmcgcGVyZm9ybWVkLiBUaGUgZGV2aWNlIHdpbGwgcmVwbHkgd2l0aCBhCisgKiAgICAgICAgICAgICBtZXNzYWdlICh3aXRoIHRoZSBzYW1lIHR5cGUgYXMgdGhlIGNvbW1hbmQpLCBzdGF0dXMgYW5kCisgKiAgICAgICAgICAgICBubyAoVExWKSBwYXlsb2FkLiBFeGVjdXRpb24gb2YgYSBjb21tYW5kIG1pZ2h0IGNhdXNlCisgKiAgICAgICAgICAgICBldmVudHMgKG9mIGRpZmZlcmVudCB0eXBlKSB0byBiZSBzZW50IGxhdGVyIG9uIGFzCisgKiAgICAgICAgICAgICBkZXZpY2UncyBzdGF0ZSBjaGFuZ2VzLgorICoKKyAqICAgR0VUL1NFVDogIHNpbWlsYXIgdG8gQ09NTUFORCwgYnV0IHdpbGwgbm90IGNhdXNlIG90aGVyCisgKiAgICAgICAgICAgICBFVkVOVHMuIFRoZSByZXBseSwgaW4gdGhlIGNhc2Ugb2YgR0VULCB3aWxsIGNvbnRhaW4KKyAqICAgICAgICAgICAgIFRMVnMgd2l0aCB0aGUgcmVxdWVzdGVkIGluZm9ybWF0aW9uLgorICoKKyAqICAgRVZFTlQ6ICAgIGFzeW5jaHJvbm91cyBtZXNzYWdlcyBzZW50IGZyb20gdGhlIGRldmljZSwgbWF5YmUgYXMgYQorICogICAgICAgICAgICAgY29uc2VxdWVuY2Ugb2YgcHJldmlvdXMgQ09NTUFORHMgYnV0IGRpc2Fzc29jaWF0ZWQgZnJvbQorICogICAgICAgICAgICAgdGhlbS4KKyAqCisgKiBPbmx5IG9uZSByZXF1ZXN0IG1pZ2h0IGJlIHBlbmRpbmcgYXQgdGhlIHNhbWUgdGltZSAoaWU6IGRvbid0CisgKiBwYXJhbGxlbGl6ZSBub3IgcG9zdCBhbm90aGVyIEdFVCByZXF1ZXN0IGJlZm9yZSB0aGUgcHJldmlvdXMKKyAqIENPTU1BTkQgaGFzIGJlZW4gYWNrbm93bGVkZ2VkIHdpdGggaXQncyBjb3JyZXNwb25kaW5nIHJlcGx5IGJ5IHRoZQorICogZGV2aWNlKS4KKyAqCisgKiBUaGUgZGlmZmVyZW50IHJlcXVlc3RzIGFuZCB0aGVpciBmb3JtYXRzIGFyZSBkZXNjcmliZWQgYmVsb3c6CisgKgorICogIEkyNDAwTV9NVF8qICAgTWVzc2FnZSB0eXBlcworICogIEkyNDAwTV9NU18qICAgTWVzc2FnZSBzdGF0dXMgKGZvciByZXBsaWVzLCBldmVudHMpCisgKiAgaTI0MDBtX3Rsdl8qICBUTFZzCisgKgorICogZGF0YSB0eXBlcyBhcmUgbmFtZWQgJ3N0cnVjdCBpMjQwMG1fbXNnX09QTkFNRScsIE9QTkFNRSBtYXRjaGluZyB0aGUKKyAqIG9wZXJhdGlvbi4KKyAqLworCisjaWZuZGVmIF9fTElOVVhfX1dJTUFYX19JMjQwME1fSF9fCisjZGVmaW5lIF9fTElOVVhfX1dJTUFYX19JMjQwME1fSF9fCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisKKy8qCisgKiBIb3N0IERldmljZSBJbnRlcmZhY2UgKEhESSkgY29tbW9uIHRvIGFsbCBidXNzZXMKKyAqLworCisvKiBCb290LW1vZGUgKGZpcm13YXJlIHVwbG9hZCBtb2RlKSBjb21tYW5kcyAqLworCisvKiBIZWFkZXIgZm9yIHRoZSBmaXJtd2FyZSBmaWxlICovCitzdHJ1Y3QgaTI0MDBtX2JjZl9oZHIgeworCV9fbGUzMiBtb2R1bGVfdHlwZTsKKwlfX2xlMzIgaGVhZGVyX2xlbjsKKwlfX2xlMzIgaGVhZGVyX3ZlcnNpb247CisJX19sZTMyIG1vZHVsZV9pZDsKKwlfX2xlMzIgbW9kdWxlX3ZlbmRvcjsKKwlfX2xlMzIgZGF0ZTsJCS8qIEJDRCBZWVlNTUREICovCisJX19sZTMyIHNpemU7CisJX19sZTMyIGtleV9zaXplOwkvKiBpbiBkd29yZHMgKi8KKwlfX2xlMzIgbW9kdWx1c19zaXplOwkvKiBpbiBkd29yZHMgKi8KKwlfX2xlMzIgZXhwb25lbnRfc2l6ZTsJLyogaW4gZHdvcmRzICovCisJX191OCByZXNlcnZlZFs4OF07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyogQm9vdCBtb2RlIG9wY29kZXMgKi8KK2VudW0gaTI0MDBtX2JyaF9vcGNvZGUgeworCUkyNDAwTV9CUkhfUkVBRCA9IDEsCisJSTI0MDBNX0JSSF9XUklURSA9IDIsCisJSTI0MDBNX0JSSF9KVU1QID0gMywKKwlJMjQwME1fQlJIX1NJR05FRF9KVU1QID0gOCwKKwlJMjQwME1fQlJIX0hBU0hfUEFZTE9BRF9PTkxZID0gOSwKK307CisKKy8qIEJvb3QgbW9kZSBjb21tYW5kIG1hc2tzIGFuZCBzdHVmZiAqLworZW51bSBpMjQwMG1fYnJoIHsKKwlJMjQwME1fQlJIX1NJR05BVFVSRSA9IDB4Y2JiYzAwMDAsCisJSTI0MDBNX0JSSF9TSUdOQVRVUkVfTUFTSyA9IDB4ZmZmZjAwMDAsCisJSTI0MDBNX0JSSF9TSUdOQVRVUkVfU0hJRlQgPSAxNiwKKwlJMjQwME1fQlJIX09QQ09ERV9NQVNLID0gMHgwMDAwMDAwZiwKKwlJMjQwME1fQlJIX1JFU1BPTlNFX01BU0sgPSAweDAwMDAwMGYwLAorCUkyNDAwTV9CUkhfUkVTUE9OU0VfU0hJRlQgPSA0LAorCUkyNDAwTV9CUkhfRElSRUNUX0FDQ0VTUyA9IDB4MDAwMDA0MDAsCisJSTI0MDBNX0JSSF9SRVNQT05TRV9SRVFVSVJFRCA9IDB4MDAwMDAyMDAsCisJSTI0MDBNX0JSSF9VU0VfQ0hFQ0tTVU0gPSAweDAwMDAwMTAwLAorfTsKKworCisvKiBDb25zdGFudHMgZm9yIGJjZi0+bW9kdWxlX2lkICovCitlbnVtIGkyNDAwbV9iY2ZfbW9kX2lkIHsKKwkvKiBGaXJtd2FyZSBmaWxlIGNhcnJpZXMgaXRzIG93biBwb2tlcyAtLSBwb2tlcyBhcmUgYSBzZXQgb2YKKwkgKiBtYWdpY2FsIHZhbHVlcyB0aGF0IGhhdmUgdG8gYmUgd3JpdHRlbiBpbiBjZXJ0YWluIG1lbW9yeQorCSAqIGFkZHJlc3NlcyB0byBnZXQgdGhlIGRldmljZSB1cCBhbmQgcmVhZHkgZm9yIGZpcm13YXJlCisJICogZG93bmxvYWQgd2hlbiBpdCBpcyBpbiBub24tc2lnbmVkIGJvb3QgbW9kZS4gKi8KKwlJMjQwME1fQkNGX01PRF9JRF9QT0tFUyA9IDB4MDAwMDAwMDAxLAorfTsKKworCisvKioKKyAqIGkyNDAwbV9ib290cm9tX2hlYWRlciAtIEhlYWRlciBmb3IgYSBib290LW1vZGUgY29tbWFuZAorICoKKyAqIEBjbWQ6IHRoZSBhYm92ZSBjb21tYW5kIGRlc2NyaXB0b3IKKyAqIEB0YXJnZXRfYWRkcjogd2hlcmUgb24gdGhlIGRldmljZSBtZW1vcnkgc2hvdWxkIHRoZSBhY3Rpb24gYmUgcGVyZm9ybWVkLgorICogQGRhdGFfc2l6ZTogZm9yIHJlYWQvd3JpdGUsIGFtb3VudCBvZiBkYXRhIHRvIGJlIHJlYWQvd3JpdHRlbgorICogQGJsb2NrX2NoZWNrc3VtOiBjaGVja3N1bSB2YWx1ZSAoaWYgYXBwbGljYWJsZSkKKyAqIEBwYXlsb2FkOiB0aGUgYmVnaW5uaW5nIG9mIGRhdGEgYXR0YWNoZWQgdG8gdGhpcyBoZWFkZXIKKyAqLworc3RydWN0IGkyNDAwbV9ib290cm9tX2hlYWRlciB7CisJX19sZTMyIGNvbW1hbmQ7CQkvKiBDb21wb3NlIHdpdGggZW51bSBpMjQwMF9icmggKi8KKwlfX2xlMzIgdGFyZ2V0X2FkZHI7CisJX19sZTMyIGRhdGFfc2l6ZTsKKwlfX2xlMzIgYmxvY2tfY2hlY2tzdW07CisJY2hhciBwYXlsb2FkWzBdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKworLyoKKyAqIERhdGEgLyBjb250cm9sIHByb3RvY29sCisgKi8KKworLyogUGFja2V0IHR5cGVzIGZvciB0aGUgaG9zdC1kZXZpY2UgaW50ZXJmYWNlICovCitlbnVtIGkyNDAwbV9wdCB7CisJSTI0MDBNX1BUX0RBVEEgPSAwLAorCUkyNDAwTV9QVF9DVFJMLAorCUkyNDAwTV9QVF9UUkFDRSwJLyogRm9yIGRldmljZSBkZWJ1ZyAqLworCUkyNDAwTV9QVF9SRVNFVF9XQVJNLAkvKiBkZXZpY2UgcmVzZXQgKi8KKwlJMjQwME1fUFRfUkVTRVRfQ09MRCwJLyogVVNCW3RyYW5zcG9ydF0gcmVzZXQsIGxpa2UgcmVjb25uZWN0ICovCisJSTI0MDBNX1BUX0lMTEVHQUwKK307CisKKworLyoKKyAqIFBheWxvYWQgZm9yIGEgZGF0YSBwYWNrZXQKKyAqCisgKiBUaGlzIGlzIHByZWZpeGVkIHRvIGVhY2ggYW5kIGV2ZXJ5IG91dGdvaW5nIERBVEEgdHlwZS4KKyAqLworc3RydWN0IGkyNDAwbV9wbF9kYXRhX2hkciB7CisJX19sZTMyIHJlc2VydmVkOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworCisvKiBNaXNjIGNvbnN0YW50cyAqLworZW51bSB7CisJSTI0MDBNX1BMX1BBRCA9IDE2LAkvKiBQYXlsb2FkIGRhdGEgc2l6ZSBhbGlnbm1lbnQgKi8KKwlJMjQwME1fUExfU0laRV9NQVggPSAweDNFRkYsCisJSTI0MDBNX01BWF9QTFNfSU5fTVNHID0gNjAsCisJLyogcHJvdG9jb2wgYmFya2Vyczogc3luYyBzZXF1ZW5jZXM7IGZvciBub3RpZmljYXRpb25zIHRoZXkKKwkgKiBhcmUgc2VudCBpbiBncm91cHMgb2YgZm91ci4gKi8KKwlJMjQwME1fSDJEX1BSRVZJRVdfQkFSS0VSID0gMHhjYWZlOTAwZCwKKwlJMjQwME1fQ09MRF9SRVNFVF9CQVJLRVIgPSAweGMwMWRjMDFkLAorCUkyNDAwTV9XQVJNX1JFU0VUX0JBUktFUiA9IDB4NTBmNzUwZjcsCisJSTI0MDBNX05CT09UX0JBUktFUiA9IDB4ZGVhZGJlZWYsCisJSTI0MDBNX1NCT09UX0JBUktFUiA9IDB4MGZmMWMxYTEsCisJSTI0MDBNX0FDS19CQVJLRVIgPSAweGZlZWRiYWJlLAorCUkyNDAwTV9EMkhfTVNHX0JBUktFUiA9IDB4YmVlZmJhYmUsCit9OworCisKKy8qCisgKiBIYXJkd2FyZSBwYXlsb2FkIGRlc2NyaXB0b3IKKyAqCisgKiBCaXRmaWVsZHMgZW5jb2RlZCBpbiBhIHN0cnVjdCB0byBlbmZvcmNlIHR5cGluZyBzZW1hbnRpY3MuCisgKgorICogTG9vayBpbiByeC5jIGFuZCB0eC5jIGZvciBhIGZ1bGwgZGVzY3JpcHRpb24gb2YgdGhlIGZvcm1hdC4KKyAqLworc3RydWN0IGkyNDAwbV9wbGQgeworCV9fbGUzMiB2YWw7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworI2RlZmluZSBJMjQwME1fUExEX1NJWkVfTUFTSyAweDAwMDAzZmZmCisjZGVmaW5lIEkyNDAwTV9QTERfVFlQRV9TSElGVCAxNgorI2RlZmluZSBJMjQwME1fUExEX1RZUEVfTUFTSyAweDAwMGYwMDAwCisKKy8qCisgKiBIZWFkZXIgZm9yIGEgVFggbWVzc2FnZSBvciBSWCBtZXNzYWdlCisgKgorICogQGJhcmtlcjogcHJlYW1ibGUKKyAqIEBzaXplOiB1c2VkIGZvciBtYW5hZ2VtZW50IG9mIHRoZSBGSUZPIHF1ZXVlIGJ1ZmZlcjsgYmVmb3JlCisgKiAgICAgc2VuZGluZywgdGhpcyBpcyBjb252ZXJ0ZWQgdG8gYmUgYSByZWFsIHByZWFtYmxlLiBUaGlzCisgKiAgICAgaW5kaWNhdGVzIHRoZSByZWFsIHNpemUgb2YgdGhlIFRYIG1lc3NhZ2UgdGhhdCBzdGFydHMgYXQgdGhpcworICogICAgIHBvaW50LiBJZiB0aGUgaGlnaGVzdCBiaXQgaXMgc2V0LCB0aGVuIHRoaXMgbWVzc2FnZSBpcyB0byBiZQorICogICAgIHNraXBwZWQuCisgKiBAc2VxdWVuY2U6IHNlcXVlbmNlIG51bWJlciBvZiB0aGlzIG1lc3NhZ2UKKyAqIEBvZmZzZXQ6IG9mZnNldCB3aGVyZSB0aGUgbWVzc2FnZSBpdHNlbGYgc3RhcnRzIC0tIHNlZSB0aGUgY29tbWVudHMKKyAqICAgICBpbiB0aGUgZmlsZSBoZWFkZXIgYWJvdXQgbWVzc2FnZSBoZWFkZXIgYW5kIHBheWxvYWQgZGVzY3JpcHRvcgorICogICAgIGFsaWdubWVudC4KKyAqIEBudW1fcGxzOiBudW1iZXIgb2YgcGF5bG9hZHMgaW4gdGhpcyBtZXNzYWdlCisgKiBAcGFkZGluZzogYW1vdW50IG9mIHBhZGRpbmcgYnl0ZXMgYXQgdGhlIGVuZCBvZiB0aGUgbWVzc2FnZSB0byBtYWtlCisgKiAgICAgICAgICAgaXQgYmUgb2YgYmxvY2stc2l6ZSBhbGlnbmVkCisgKgorICogTG9vayBpbiByeC5jIGFuZCB0eC5jIGZvciBhIGZ1bGwgZGVzY3JpcHRpb24gb2YgdGhlIGZvcm1hdC4KKyAqLworc3RydWN0IGkyNDAwbV9tc2dfaGRyIHsKKwl1bmlvbiB7CisJCV9fbGUzMiBiYXJrZXI7CisJCV9fdTMyIHNpemU7CS8qIHNhbWUgc2l6ZSB0eXBlIGFzIGJhcmtlciEhICovCisJfTsKKwl1bmlvbiB7CisJCV9fbGUzMiBzZXF1ZW5jZTsKKwkJX191MzIgb2Zmc2V0OwkvKiBzYW1lIHNpemUgdHlwZSBhcyBiYXJrZXIhISAqLworCX07CisJX19sZTE2IG51bV9wbHM7CisJX19sZTE2IHJzdjE7CisJX19sZTE2IHBhZGRpbmc7CisJX19sZTE2IHJzdjI7CisJc3RydWN0IGkyNDAwbV9wbGQgcGxkWzBdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKworCisvKgorICogTDMvTDQgY29udHJvbCBwcm90b2NvbAorICovCisKK2VudW0geworCS8qIEludGVyZmFjZSB2ZXJzaW9uICovCisJSTI0MDBNX0wzTDRfVkVSU0lPTiAgICAgICAgICAgICA9IDB4MDEwMCwKK307CisKKy8qIE1lc3NhZ2UgdHlwZXMgKi8KK2VudW0gaTI0MDBtX210IHsKKwlJMjQwME1fTVRfUkVTRVJWRUQgICAgICAgICAgICAgID0gMHgwMDAwLAorCUkyNDAwTV9NVF9JTlZBTElEICAgICAgICAgICAgICAgPSAweGZmZmYsCisJSTI0MDBNX01UX1JFUE9SVF9NQVNLCQk9IDB4ODAwMCwKKworCUkyNDAwTV9NVF9HRVRfU0NBTl9SRVNVTFQgIAk9IDB4NDIwMiwKKwlJMjQwME1fTVRfU0VUX1NDQU5fUEFSQU0gICAJPSAweDQ0MDIsCisJSTI0MDBNX01UX0NNRF9SRl9DT05UUk9MICAgCT0gMHg0NjAyLAorCUkyNDAwTV9NVF9DTURfU0NBTiAgICAgICAgIAk9IDB4NDYwMywKKwlJMjQwME1fTVRfQ01EX0NPTk5FQ1QgICAgICAJPSAweDQ2MDQsCisJSTI0MDBNX01UX0NNRF9ESVNDT05ORUNUICAgCT0gMHg0NjA1LAorCUkyNDAwTV9NVF9DTURfRVhJVF9JRExFICAgCT0gMHg0NjA2LAorCUkyNDAwTV9NVF9HRVRfTE1fVkVSU0lPTiAgIAk9IDB4NTIwMSwKKwlJMjQwME1fTVRfR0VUX0RFVklDRV9JTkZPICAJPSAweDUyMDIsCisJSTI0MDBNX01UX0dFVF9MSU5LX1NUQVRVUyAgCT0gMHg1MjAzLAorCUkyNDAwTV9NVF9HRVRfU1RBVElTVElDUyAgIAk9IDB4NTIwNCwKKwlJMjQwME1fTVRfR0VUX1NUQVRFICAgICAgICAJPSAweDUyMDUsCisJSTI0MDBNX01UX0dFVF9NRURJQV9TVEFUVVMJPSAweDUyMDYsCisJSTI0MDBNX01UX1NFVF9JTklUX0NPTkZJRwk9IDB4NTQwNCwKKwlJMjQwME1fTVRfQ01EX0lOSVQJICAgICAgICA9IDB4NTYwMSwKKwlJMjQwME1fTVRfQ01EX1RFUk1JTkFURQkJPSAweDU2MDIsCisJSTI0MDBNX01UX0NNRF9NT0RFX09GX09QCT0gMHg1NjAzLAorCUkyNDAwTV9NVF9DTURfUkVTRVRfREVWSUNFCT0gMHg1NjA0LAorCUkyNDAwTV9NVF9DTURfTU9OSVRPUl9DT05UUk9MICAgPSAweDU2MDUsCisJSTI0MDBNX01UX0NNRF9FTlRFUl9QT1dFUlNBVkUgICA9IDB4NTYwNiwKKwlJMjQwME1fTVRfR0VUX1RMU19PUEVSQVRJT05fUkVTVUxUID0gMHg2MjAxLAorCUkyNDAwTV9NVF9TRVRfRUFQX1NVQ0NFU1MgICAgICAgPSAweDY0MDIsCisJSTI0MDBNX01UX1NFVF9FQVBfRkFJTCAgICAgICAgICA9IDB4NjQwMywKKwlJMjQwME1fTVRfU0VUX0VBUF9LRVkgICAgICAgICAgCT0gMHg2NDA0LAorCUkyNDAwTV9NVF9DTURfU0VORF9FQVBfUkVTUE9OU0UgPSAweDY2MDIsCisJSTI0MDBNX01UX1JFUE9SVF9TQ0FOX1JFU1VMVCAgICA9IDB4YzAwMiwKKwlJMjQwME1fTVRfUkVQT1JUX1NUQVRFCQk9IDB4ZDAwMiwKKwlJMjQwME1fTVRfUkVQT1JUX1BPV0VSU0FWRV9SRUFEWSA9IDB4ZDAwNSwKKwlJMjQwME1fTVRfUkVQT1JUX0VBUF9SRVFVRVNUICAgID0gMHhlMDAyLAorCUkyNDAwTV9NVF9SRVBPUlRfRUFQX1JFU1RBUlQgICAgPSAweGUwMDMsCisJSTI0MDBNX01UX1JFUE9SVF9BTFRfQUNDRVBUICAgIAk9IDB4ZTAwNCwKKwlJMjQwME1fTVRfUkVQT1JUX0tFWV9SRVFVRVNUIAk9IDB4ZTAwNSwKK307CisKKworLyoKKyAqIE1lc3NhZ2UgQWNrIFN0YXR1cyBjb2RlcworICoKKyAqIFdoZW4gYSBtZXNzYWdlIGlzIHJlcGxpZWQtdG8sIHRoaXMgc3RhdHVzIGlzIHJlcG9ydGVkLgorICovCitlbnVtIGkyNDAwbV9tcyB7CisJSTI0MDBNX01TX0RPTkVfT0sgICAgICAgICAgICAgICAgICA9IDAsCisJSTI0MDBNX01TX0RPTkVfSU5fUFJPR1JFU1MgICAgICAgICA9IDEsCisJSTI0MDBNX01TX0lOVkFMSURfT1AgICAgICAgICAgICAgICA9IDIsCisJSTI0MDBNX01TX0JBRF9TVEFURSAgICAgICAgICAgICAgICA9IDMsCisJSTI0MDBNX01TX0lMTEVHQUxfVkFMVUUgICAgICAgICAgICA9IDQsCisJSTI0MDBNX01TX01JU1NJTkdfUEFSQU1TICAgICAgICAgICA9IDUsCisJSTI0MDBNX01TX1ZFUlNJT05fRVJST1IgICAgICAgICAgICA9IDYsCisJSTI0MDBNX01TX0FDQ0VTU0lCSUxJVFlfRVJST1IgICAgICA9IDcsCisJSTI0MDBNX01TX0JVU1kgICAgICAgICAgICAgICAgICAgICA9IDgsCisJSTI0MDBNX01TX0NPUlJVUFRFRF9UTFYgICAgICAgICAgICA9IDksCisJSTI0MDBNX01TX1VOSU5JVElBTElaRUQgICAgICAgICAgICA9IDEwLAorCUkyNDAwTV9NU19VTktOT1dOX0VSUk9SICAgICAgICAgICAgPSAxMSwKKwlJMjQwME1fTVNfUFJPRFVDVElPTl9FUlJPUiAgICAgICAgID0gMTIsCisJSTI0MDBNX01TX05PX1JGICAgICAgICAgICAgICAgICAgICA9IDEzLAorCUkyNDAwTV9NU19OT1RfUkVBRFlfRk9SX1BPV0VSU0FWRSAgPSAxNCwKKwlJMjQwME1fTVNfVEhFUk1BTF9DUklUSUNBTCAgICAgICAgID0gMTUsCisJSTI0MDBNX01TX01BWAorfTsKKworCisvKioKKyAqIGkyNDAwbV90bHYgLSBlbnVtZXJhdGlvbiBvZiB0aGUgZGlmZmVyZW50IHR5cGVzIG9mIFRMVnMKKyAqCisgKiBUTFZzIHN0YW5kIGZvciB0eXBlLWxlbmd0aC12YWx1ZSBhbmQgYXJlIHRoZSBoZWFkZXIgZm9yIGEgcGF5bG9hZAorICogY29tcG9zZWQgb2YgYWxtb3N0IGFueXRoaW5nLiBFYWNoIHBheWxvYWQgaGFzIGEgdHlwZSBhc3NpZ25lZAorICogYW5kIGEgbGVuZ3RoLgorICovCitlbnVtIGkyNDAwbV90bHYgeworCUkyNDAwTV9UTFZfTDRfTUVTU0FHRV9WRVJTSU9OUyA9IDEyOSwKKwlJMjQwME1fVExWX1NZU1RFTV9TVEFURSA9IDE0MSwKKwlJMjQwME1fVExWX01FRElBX1NUQVRVUyA9IDE2MSwKKwlJMjQwME1fVExWX1JGX09QRVJBVElPTiA9IDE2MiwKKwlJMjQwME1fVExWX1JGX1NUQVRVUyA9IDE2MywKKwlJMjQwME1fVExWX0RFVklDRV9SRVNFVF9UWVBFID0gMTMyLAorCUkyNDAwTV9UTFZfQ09ORklHX0lETEVfUEFSQU1FVEVSUyA9IDYwMSwKK307CisKKworc3RydWN0IGkyNDAwbV90bHZfaGRyIHsKKwlfX2xlMTYgdHlwZTsKKwlfX2xlMTYgbGVuZ3RoOwkJLyogcGF5bG9hZCdzICovCisJX191OCAgIHBsWzBdOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworCitzdHJ1Y3QgaTI0MDBtX2wzbDRfaGRyIHsKKwlfX2xlMTYgdHlwZTsKKwlfX2xlMTYgbGVuZ3RoOwkJLyogcGF5bG9hZCdzICovCisJX19sZTE2IHZlcnNpb247CisJX19sZTE2IHJlc3YxOworCV9fbGUxNiBzdGF0dXM7CisJX19sZTE2IHJlc3YyOworCXN0cnVjdCBpMjQwMG1fdGx2X2hkciBwbFswXTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKworLyoqCisgKiBpMjQwMG1fc3lzdGVtX3N0YXRlIC0gZGlmZmVyZW50IHN0YXRlcyBvZiB0aGUgZGV2aWNlCisgKi8KK2VudW0gaTI0MDBtX3N5c3RlbV9zdGF0ZSB7CisJSTI0MDBNX1NTX1VOSU5JVElBTElaRUQgPSAxLAorCUkyNDAwTV9TU19JTklULAorCUkyNDAwTV9TU19SRUFEWSwKKwlJMjQwME1fU1NfU0NBTiwKKwlJMjQwME1fU1NfU1RBTkRCWSwKKwlJMjQwME1fU1NfQ09OTkVDVElORywKKwlJMjQwME1fU1NfV0lNQVhfQ09OTkVDVEVELAorCUkyNDAwTV9TU19EQVRBX1BBVEhfQ09OTkVDVEVELAorCUkyNDAwTV9TU19JRExFLAorCUkyNDAwTV9TU19ESVNDT05ORUNUSU5HLAorCUkyNDAwTV9TU19PVVRfT0ZfWk9ORSwKKwlJMjQwME1fU1NfU0xFRVBBQ1RJVkUsCisJSTI0MDBNX1NTX1BST0RVQ1RJT04sCisJSTI0MDBNX1NTX0NPTkZJRywKKwlJMjQwME1fU1NfUkZfT0ZGLAorCUkyNDAwTV9TU19SRl9TSFVURE9XTiwKKwlJMjQwME1fU1NfREVWSUNFX0RJU0NPTk5FQ1QsCisJSTI0MDBNX1NTX01BWCwKK307CisKKworLyoqCisgKiBpMjQwMG1fdGx2X3N5c3RlbV9zdGF0ZSAtIHJlcG9ydCBvbiB0aGUgc3RhdGUgb2YgdGhlIHN5c3RlbQorICoKKyAqIEBzdGF0ZTogc2VlIGVudW0gaTI0MDBtX3N5c3RlbV9zdGF0ZQorICovCitzdHJ1Y3QgaTI0MDBtX3Rsdl9zeXN0ZW1fc3RhdGUgeworCXN0cnVjdCBpMjQwMG1fdGx2X2hkciBoZHI7CisJX19sZTMyIHN0YXRlOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworCitzdHJ1Y3QgaTI0MDBtX3Rsdl9sNF9tZXNzYWdlX3ZlcnNpb25zIHsKKwlzdHJ1Y3QgaTI0MDBtX3Rsdl9oZHIgaGRyOworCV9fbGUxNiBtYWpvcjsKKwlfX2xlMTYgbWlub3I7CisJX19sZTE2IGJyYW5jaDsKKwlfX2xlMTYgcmVzZXJ2ZWQ7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisKK3N0cnVjdCBpMjQwMG1fdGx2X2RldGFpbGVkX2RldmljZV9pbmZvIHsKKwlzdHJ1Y3QgaTI0MDBtX3Rsdl9oZHIgaGRyOworCV9fdTggcmVzZXJ2ZWQxWzQwMF07CisJX191OCBtYWNfYWRkcmVzc1s2XTsKKwlfX3U4IHJlc2VydmVkMlsyXTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKworZW51bSBpMjQwMG1fcmZfc3dpdGNoX3N0YXR1cyB7CisJSTI0MDBNX1JGX1NXSVRDSF9PTiA9IDEsCisJSTI0MDBNX1JGX1NXSVRDSF9PRkYgPSAyLAorfTsKKworc3RydWN0IGkyNDAwbV90bHZfcmZfc3dpdGNoZXNfc3RhdHVzIHsKKwlzdHJ1Y3QgaTI0MDBtX3Rsdl9oZHIgaGRyOworCV9fdTggc3dfcmZfc3dpdGNoOwkvKiAxIE9OLCAyIE9GRiAqLworCV9fdTggaHdfcmZfc3dpdGNoOwkvKiAxIE9OLCAyIE9GRiAqLworCV9fdTggcmVzZXJ2ZWRbMl07Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisKK2VudW0geworCWkyNDAwbV9yZl9vcGVyYXRpb25fb24gPSAxLAorCWkyNDAwbV9yZl9vcGVyYXRpb25fb2ZmID0gMgorfTsKKworc3RydWN0IGkyNDAwbV90bHZfcmZfb3BlcmF0aW9uIHsKKwlzdHJ1Y3QgaTI0MDBtX3Rsdl9oZHIgaGRyOworCV9fbGUzMiBzdGF0dXM7CS8qIDEgT04sIDIgT0ZGICovCit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisKK2VudW0gaTI0MDBtX3Rsdl9yZXNldF90eXBlIHsKKwlJMjQwME1fUkVTRVRfVFlQRV9DT0xEID0gMSwKKwlJMjQwME1fUkVTRVRfVFlQRV9XQVJNCit9OworCitzdHJ1Y3QgaTI0MDBtX3Rsdl9kZXZpY2VfcmVzZXRfdHlwZSB7CisJc3RydWN0IGkyNDAwbV90bHZfaGRyIGhkcjsKKwlfX2xlMzIgcmVzZXRfdHlwZTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKworc3RydWN0IGkyNDAwbV90bHZfY29uZmlnX2lkbGVfcGFyYW1ldGVycyB7CisJc3RydWN0IGkyNDAwbV90bHZfaGRyIGhkcjsKKwlfX2xlMzIgaWRsZV90aW1lb3V0OwkvKiAxMDAgdG8gMzAwMDAwIG1zIFs1bWluXSwgMTAwIGluY3JlbWVudHMKKwkJCQkgKiAwIGRpc2FibGVkICovCisJX19sZTMyIGlkbGVfcGFnaW5nX2ludGVydmFsOwkvKiBmcmFtZXMgKi8KK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKworZW51bSBpMjQwMG1fbWVkaWFfc3RhdHVzIHsKKwlJMjQwME1fTUVESUFfU1RBVFVTX0xJTktfVVAgPSAxLAorCUkyNDAwTV9NRURJQV9TVEFUVVNfTElOS19ET1dOLAorCUkyNDAwTV9NRURJQV9TVEFUVVNfTElOS19SRU5FVywKK307CisKK3N0cnVjdCBpMjQwMG1fdGx2X21lZGlhX3N0YXR1cyB7CisJc3RydWN0IGkyNDAwbV90bHZfaGRyIGhkcjsKKwlfX2xlMzIgbWVkaWFfc3RhdHVzOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworI2VuZGlmIC8qICNpZm5kZWYgX19MSU5VWF9fV0lNQVhfX0kyNDAwTV9IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvd3JpdGViYWNrLmggYi9pbmNsdWRlL2xpbnV4L3dyaXRlYmFjay5oCmluZGV4IGU1ODU2NTcuLjczMDBlY2QgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvd3JpdGViYWNrLmgKKysrIGIvaW5jbHVkZS9saW51eC93cml0ZWJhY2suaApAQCAtMzAsNyArMzAsNiBAQAogZW51bSB3cml0ZWJhY2tfc3luY19tb2RlcyB7CiAJV0JfU1lOQ19OT05FLAkvKiBEb24ndCB3YWl0IG9uIGFueXRoaW5nICovCiAJV0JfU1lOQ19BTEwsCS8qIFdhaXQgb24gZXZlcnkgbWFwcGluZyAqLwotCVdCX1NZTkNfSE9MRCwJLyogSG9sZCB0aGUgaW5vZGUgb24gc2JfZGlydHkgZm9yIHN5c19zeW5jKCkgKi8KIH07CiAKIC8qCkBAIC0xMDcsNyArMTA2LDkgQEAKIAogLyogVGhlc2UgYXJlIGV4cG9ydGVkIHRvIHN5c2N0bC4gKi8KIGV4dGVybiBpbnQgZGlydHlfYmFja2dyb3VuZF9yYXRpbzsKK2V4dGVybiB1bnNpZ25lZCBsb25nIGRpcnR5X2JhY2tncm91bmRfYnl0ZXM7CiBleHRlcm4gaW50IHZtX2RpcnR5X3JhdGlvOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgdm1fZGlydHlfYnl0ZXM7CiBleHRlcm4gaW50IGRpcnR5X3dyaXRlYmFja19pbnRlcnZhbDsKIGV4dGVybiBpbnQgZGlydHlfZXhwaXJlX2ludGVydmFsOwogZXh0ZXJuIGludCB2bV9oaWdobWVtX2lzX2RpcnR5YWJsZTsKQEAgLTExNiwxNyArMTE3LDI2IEBACiAKIGV4dGVybiB1bnNpZ25lZCBsb25nIGRldGVybWluZV9kaXJ0eWFibGVfbWVtb3J5KHZvaWQpOwogCitleHRlcm4gaW50IGRpcnR5X2JhY2tncm91bmRfcmF0aW9faGFuZGxlcihzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLAorCQlzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90ICpsZW5wLAorCQlsb2ZmX3QgKnBwb3MpOworZXh0ZXJuIGludCBkaXJ0eV9iYWNrZ3JvdW5kX2J5dGVzX2hhbmRsZXIoc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSwKKwkJc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqbGVucCwKKwkJbG9mZl90ICpwcG9zKTsKIGV4dGVybiBpbnQgZGlydHlfcmF0aW9faGFuZGxlcihzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLAogCQlzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90ICpsZW5wLAogCQlsb2ZmX3QgKnBwb3MpOworZXh0ZXJuIGludCBkaXJ0eV9ieXRlc19oYW5kbGVyKHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsCisJCXN0cnVjdCBmaWxlICpmaWxwLCB2b2lkIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgKmxlbnAsCisJCWxvZmZfdCAqcHBvcyk7CiAKIHN0cnVjdCBjdGxfdGFibGU7CiBzdHJ1Y3QgZmlsZTsKIGludCBkaXJ0eV93cml0ZWJhY2tfY2VudGlzZWNzX2hhbmRsZXIoc3RydWN0IGN0bF90YWJsZSAqLCBpbnQsIHN0cnVjdCBmaWxlICosCiAJCQkJICAgICAgdm9pZCBfX3VzZXIgKiwgc2l6ZV90ICosIGxvZmZfdCAqKTsKIAotdm9pZCBnZXRfZGlydHlfbGltaXRzKGxvbmcgKnBiYWNrZ3JvdW5kLCBsb25nICpwZGlydHksIGxvbmcgKnBiZGlfZGlydHksCi0JCSBzdHJ1Y3QgYmFja2luZ19kZXZfaW5mbyAqYmRpKTsKK3ZvaWQgZ2V0X2RpcnR5X2xpbWl0cyh1bnNpZ25lZCBsb25nICpwYmFja2dyb3VuZCwgdW5zaWduZWQgbG9uZyAqcGRpcnR5LAorCQkgICAgICB1bnNpZ25lZCBsb25nICpwYmRpX2RpcnR5LCBzdHJ1Y3QgYmFja2luZ19kZXZfaW5mbyAqYmRpKTsKIAogdm9pZCBwYWdlX3dyaXRlYmFja19pbml0KHZvaWQpOwogdm9pZCBiYWxhbmNlX2RpcnR5X3BhZ2VzX3JhdGVsaW1pdGVkX25yKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tdGQvdWJpLXVzZXIuaCBiL2luY2x1ZGUvbXRkL3ViaS11c2VyLmgKaW5kZXggY2NkYzU2Mi4uMmRjMmViMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tdGQvdWJpLXVzZXIuaAorKysgYi9pbmNsdWRlL210ZC91YmktdXNlci5oCkBAIC0yNTMsNyArMjUzLDcgQEAKICAqCiAgKiBSZS1zaXppbmcgaXMgcG9zc2libGUgZm9yIGJvdGggZHluYW1pYyBhbmQgc3RhdGljIHZvbHVtZXMuIEJ1dCB3aGlsZSBkeW5hbWljCiAgKiB2b2x1bWVzIG1heSBiZSByZS1zaXplZCBhcmJpdHJhcmlseSwgc3RhdGljIHZvbHVtZXMgY2Fubm90IGJlIG1hZGUgdG8gYmUKLSAqIHNtYWxsZXIgdGhlbiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoZXkgYmVhci4gVG8gYXJiaXRyYXJpbHkgc2hyaW5rIGEgc3RhdGljCisgKiBzbWFsbGVyIHRoYW4gdGhlIG51bWJlciBvZiBieXRlcyB0aGV5IGJlYXIuIFRvIGFyYml0cmFyaWx5IHNocmluayBhIHN0YXRpYwogICogdm9sdW1lLCBpdCBtdXN0IGJlIHdpcGVkIG91dCBmaXJzdCAoYnkgbWVhbnMgb2Ygdm9sdW1lIHVwZGF0ZSBvcGVyYXRpb24gd2l0aAogICogemVybyBudW1iZXIgb2YgYnl0ZXMpLgogICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9jaXBzb19pcHY0LmggYi9pbmNsdWRlL25ldC9jaXBzb19pcHY0LmgKaW5kZXggOTkwOTc3NC4uYmVkYzdmNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvY2lwc29faXB2NC5oCisrKyBiL2luY2x1ZGUvbmV0L2NpcHNvX2lwdjQuaApAQCAtMTMxLDcgKzEzMSw4IEBACiAgKi8KIAogI2lmZGVmIENPTkZJR19ORVRMQUJFTAotaW50IGNpcHNvX3Y0X2RvaV9hZGQoc3RydWN0IGNpcHNvX3Y0X2RvaSAqZG9pX2RlZik7CitpbnQgY2lwc29fdjRfZG9pX2FkZChzdHJ1Y3QgY2lwc29fdjRfZG9pICpkb2lfZGVmLAorCQkgICAgIHN0cnVjdCBuZXRsYmxfYXVkaXQgKmF1ZGl0X2luZm8pOwogdm9pZCBjaXBzb192NF9kb2lfZnJlZShzdHJ1Y3QgY2lwc29fdjRfZG9pICpkb2lfZGVmKTsKIGludCBjaXBzb192NF9kb2lfcmVtb3ZlKHUzMiBkb2ksIHN0cnVjdCBuZXRsYmxfYXVkaXQgKmF1ZGl0X2luZm8pOwogc3RydWN0IGNpcHNvX3Y0X2RvaSAqY2lwc29fdjRfZG9pX2dldGRlZih1MzIgZG9pKTsKQEAgLTE0MCw3ICsxNDEsOCBAQAogCQkgICAgIGludCAoKmNhbGxiYWNrKSAoc3RydWN0IGNpcHNvX3Y0X2RvaSAqZG9pX2RlZiwgdm9pZCAqYXJnKSwKIAkgICAgICAgICAgICAgdm9pZCAqY2JfYXJnKTsKICNlbHNlCi1zdGF0aWMgaW5saW5lIGludCBjaXBzb192NF9kb2lfYWRkKHN0cnVjdCBjaXBzb192NF9kb2kgKmRvaV9kZWYpCitzdGF0aWMgaW5saW5lIGludCBjaXBzb192NF9kb2lfYWRkKHN0cnVjdCBjaXBzb192NF9kb2kgKmRvaV9kZWYsCisJCQkJICAgc3RydWN0IG5ldGxibF9hdWRpdCAqYXVkaXRfaW5mbykKIHsKIAlyZXR1cm4gLUVOT1NZUzsKIH0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L25kaXNjLmggYi9pbmNsdWRlL25ldC9uZGlzYy5oCmluZGV4IGNlNTMyZjIuLjE0NTllZDMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L25kaXNjLmgKKysrIGIvaW5jbHVkZS9uZXQvbmRpc2MuaApAQCAtMTU1LDkgKzE1NSw5IEBACiB7CiAKIAlpZiAoZGV2KQotCQlyZXR1cm4gX19uZWlnaF9sb29rdXAoJm5kX3RibCwgYWRkciwgZGV2LCAxKTsKKwkJcmV0dXJuIF9fbmVpZ2hfbG9va3VwX2Vycm5vKCZuZF90YmwsIGFkZHIsIGRldik7CiAKLQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gRVJSX1BUUigtRU5PREVWKTsKIH0KIAogCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9uZXRsYWJlbC5oIGIvaW5jbHVkZS9uZXQvbmV0bGFiZWwuaAppbmRleCAxN2M0NDJhLi43NDkwMTFlIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9uZXRsYWJlbC5oCisrKyBiL2luY2x1ZGUvbmV0L25ldGxhYmVsLmgKQEAgLTMzLDYgKzMzLDggQEAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L25ldC5oPgogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvaW42Lmg+CiAjaW5jbHVkZSA8bmV0L25ldGxpbmsuaD4KICNpbmNsdWRlIDxhc20vYXRvbWljLmg+CiAKQEAgLTM1MywxMyArMzU1LDM3IEBACiAvKgogICogTFNNIGNvbmZpZ3VyYXRpb24gb3BlcmF0aW9ucwogICovCi1pbnQgbmV0bGJsX2NmZ19tYXBfZGVsKGNvbnN0IGNoYXIgKmRvbWFpbiwgc3RydWN0IG5ldGxibF9hdWRpdCAqYXVkaXRfaW5mbyk7Ci1pbnQgbmV0bGJsX2NmZ191bmxibF9hZGRfbWFwKGNvbnN0IGNoYXIgKmRvbWFpbiwKK2ludCBuZXRsYmxfY2ZnX21hcF9kZWwoY29uc3QgY2hhciAqZG9tYWluLAorCQkgICAgICAgdTE2IGZhbWlseSwKKwkJICAgICAgIGNvbnN0IHZvaWQgKmFkZHIsCisJCSAgICAgICBjb25zdCB2b2lkICptYXNrLAorCQkgICAgICAgc3RydWN0IG5ldGxibF9hdWRpdCAqYXVkaXRfaW5mbyk7CitpbnQgbmV0bGJsX2NmZ191bmxibF9tYXBfYWRkKGNvbnN0IGNoYXIgKmRvbWFpbiwKKwkJCSAgICAgdTE2IGZhbWlseSwKKwkJCSAgICAgY29uc3Qgdm9pZCAqYWRkciwKKwkJCSAgICAgY29uc3Qgdm9pZCAqbWFzaywKIAkJCSAgICAgc3RydWN0IG5ldGxibF9hdWRpdCAqYXVkaXRfaW5mbyk7Ci1pbnQgbmV0bGJsX2NmZ19jaXBzb3Y0X2FkZF9tYXAoc3RydWN0IGNpcHNvX3Y0X2RvaSAqZG9pX2RlZiwKK2ludCBuZXRsYmxfY2ZnX3VubGJsX3N0YXRpY19hZGQoc3RydWN0IG5ldCAqbmV0LAorCQkJCWNvbnN0IGNoYXIgKmRldl9uYW1lLAorCQkJCWNvbnN0IHZvaWQgKmFkZHIsCisJCQkJY29uc3Qgdm9pZCAqbWFzaywKKwkJCQl1MTYgZmFtaWx5LAorCQkJCXUzMiBzZWNpZCwKKwkJCQlzdHJ1Y3QgbmV0bGJsX2F1ZGl0ICphdWRpdF9pbmZvKTsKK2ludCBuZXRsYmxfY2ZnX3VubGJsX3N0YXRpY19kZWwoc3RydWN0IG5ldCAqbmV0LAorCQkJCWNvbnN0IGNoYXIgKmRldl9uYW1lLAorCQkJCWNvbnN0IHZvaWQgKmFkZHIsCisJCQkJY29uc3Qgdm9pZCAqbWFzaywKKwkJCQl1MTYgZmFtaWx5LAorCQkJCXN0cnVjdCBuZXRsYmxfYXVkaXQgKmF1ZGl0X2luZm8pOworaW50IG5ldGxibF9jZmdfY2lwc292NF9hZGQoc3RydWN0IGNpcHNvX3Y0X2RvaSAqZG9pX2RlZiwKKwkJCSAgIHN0cnVjdCBuZXRsYmxfYXVkaXQgKmF1ZGl0X2luZm8pOwordm9pZCBuZXRsYmxfY2ZnX2NpcHNvdjRfZGVsKHUzMiBkb2ksIHN0cnVjdCBuZXRsYmxfYXVkaXQgKmF1ZGl0X2luZm8pOworaW50IG5ldGxibF9jZmdfY2lwc292NF9tYXBfYWRkKHUzMiBkb2ksCiAJCQkgICAgICAgY29uc3QgY2hhciAqZG9tYWluLAorCQkJICAgICAgIGNvbnN0IHN0cnVjdCBpbl9hZGRyICphZGRyLAorCQkJICAgICAgIGNvbnN0IHN0cnVjdCBpbl9hZGRyICptYXNrLAogCQkJICAgICAgIHN0cnVjdCBuZXRsYmxfYXVkaXQgKmF1ZGl0X2luZm8pOwotCiAvKgogICogTFNNIHNlY3VyaXR5IGF0dHJpYnV0ZSBvcGVyYXRpb25zCiAgKi8KQEAgLTQwMSwxOSArNDI3LDYyIEBACiB2b2lkIG5ldGxibF9jYWNoZV9pbnZhbGlkYXRlKHZvaWQpOwogaW50IG5ldGxibF9jYWNoZV9hZGQoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJICAgICBjb25zdCBzdHJ1Y3QgbmV0bGJsX2xzbV9zZWNhdHRyICpzZWNhdHRyKTsKKworLyoKKyAqIFByb3RvY29sIGVuZ2luZSBvcGVyYXRpb25zCisgKi8KK3N0cnVjdCBhdWRpdF9idWZmZXIgKm5ldGxibF9hdWRpdF9zdGFydChpbnQgdHlwZSwKKwkJCQkJc3RydWN0IG5ldGxibF9hdWRpdCAqYXVkaXRfaW5mbyk7CiAjZWxzZQogc3RhdGljIGlubGluZSBpbnQgbmV0bGJsX2NmZ19tYXBfZGVsKGNvbnN0IGNoYXIgKmRvbWFpbiwKKwkJCQkgICAgIHUxNiBmYW1pbHksCisJCQkJICAgICBjb25zdCB2b2lkICphZGRyLAorCQkJCSAgICAgY29uc3Qgdm9pZCAqbWFzaywKIAkJCQkgICAgIHN0cnVjdCBuZXRsYmxfYXVkaXQgKmF1ZGl0X2luZm8pCiB7CiAJcmV0dXJuIC1FTk9TWVM7CiB9Ci1zdGF0aWMgaW5saW5lIGludCBuZXRsYmxfY2ZnX3VubGJsX2FkZF9tYXAoY29uc3QgY2hhciAqZG9tYWluLAorc3RhdGljIGlubGluZSBpbnQgbmV0bGJsX2NmZ191bmxibF9tYXBfYWRkKGNvbnN0IGNoYXIgKmRvbWFpbiwKKwkJCQkJICAgdTE2IGZhbWlseSwKKwkJCQkJICAgdm9pZCAqYWRkciwKKwkJCQkJICAgdm9pZCAqbWFzaywKIAkJCQkJICAgc3RydWN0IG5ldGxibF9hdWRpdCAqYXVkaXRfaW5mbykKIHsKIAlyZXR1cm4gLUVOT1NZUzsKIH0KLXN0YXRpYyBpbmxpbmUgaW50IG5ldGxibF9jZmdfY2lwc292NF9hZGRfbWFwKHN0cnVjdCBjaXBzb192NF9kb2kgKmRvaV9kZWYsCitzdGF0aWMgaW5saW5lIGludCBuZXRsYmxfY2ZnX3VubGJsX3N0YXRpY19hZGQoc3RydWN0IG5ldCAqbmV0LAorCQkJCQkgICAgICBjb25zdCBjaGFyICpkZXZfbmFtZSwKKwkJCQkJICAgICAgY29uc3Qgdm9pZCAqYWRkciwKKwkJCQkJICAgICAgY29uc3Qgdm9pZCAqbWFzaywKKwkJCQkJICAgICAgdTE2IGZhbWlseSwKKwkJCQkJICAgICAgdTMyIHNlY2lkLAorCQkJCQkgICAgICBzdHJ1Y3QgbmV0bGJsX2F1ZGl0ICphdWRpdF9pbmZvKQoreworCXJldHVybiAtRU5PU1lTOworfQorc3RhdGljIGlubGluZSBpbnQgbmV0bGJsX2NmZ191bmxibF9zdGF0aWNfZGVsKHN0cnVjdCBuZXQgKm5ldCwKKwkJCQkJICAgICAgY29uc3QgY2hhciAqZGV2X25hbWUsCisJCQkJCSAgICAgIGNvbnN0IHZvaWQgKmFkZHIsCisJCQkJCSAgICAgIGNvbnN0IHZvaWQgKm1hc2ssCisJCQkJCSAgICAgIHUxNiBmYW1pbHksCisJCQkJCSAgICAgIHN0cnVjdCBuZXRsYmxfYXVkaXQgKmF1ZGl0X2luZm8pCit7CisJcmV0dXJuIC1FTk9TWVM7Cit9CitzdGF0aWMgaW5saW5lIGludCBuZXRsYmxfY2ZnX2NpcHNvdjRfYWRkKHN0cnVjdCBjaXBzb192NF9kb2kgKmRvaV9kZWYsCisJCQkJCSBzdHJ1Y3QgbmV0bGJsX2F1ZGl0ICphdWRpdF9pbmZvKQoreworCXJldHVybiAtRU5PU1lTOworfQorc3RhdGljIGlubGluZSB2b2lkIG5ldGxibF9jZmdfY2lwc292NF9kZWwodTMyIGRvaSwKKwkJCQkJICBzdHJ1Y3QgbmV0bGJsX2F1ZGl0ICphdWRpdF9pbmZvKQoreworCXJldHVybjsKK30KK3N0YXRpYyBpbmxpbmUgaW50IG5ldGxibF9jZmdfY2lwc292NF9tYXBfYWRkKHUzMiBkb2ksCiAJCQkJCSAgICAgY29uc3QgY2hhciAqZG9tYWluLAorCQkJCQkgICAgIGNvbnN0IHN0cnVjdCBpbl9hZGRyICphZGRyLAorCQkJCQkgICAgIGNvbnN0IHN0cnVjdCBpbl9hZGRyICptYXNrLAogCQkJCQkgICAgIHN0cnVjdCBuZXRsYmxfYXVkaXQgKmF1ZGl0X2luZm8pCiB7CiAJcmV0dXJuIC1FTk9TWVM7CkBAIC00OTUsNiArNTY0LDExIEBACiB7CiAJcmV0dXJuIDA7CiB9CitzdGF0aWMgaW5saW5lIHN0cnVjdCBhdWRpdF9idWZmZXIgKm5ldGxibF9hdWRpdF9zdGFydChpbnQgdHlwZSwKKwkJCQkJCXN0cnVjdCBuZXRsYmxfYXVkaXQgKmF1ZGl0X2luZm8pCit7CisJcmV0dXJuIE5VTEw7Cit9CiAjZW5kaWYgLyogQ09ORklHX05FVExBQkVMICovCiAKICNlbmRpZiAvKiBfTkVUTEFCRUxfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvcHJvdG9jb2wuaCBiL2luY2x1ZGUvbmV0L3Byb3RvY29sLmgKaW5kZXggY2IyOTY1YS4uZmZhNWI4YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvcHJvdG9jb2wuaAorKysgYi9pbmNsdWRlL25ldC9wcm90b2NvbC5oCkBAIC01OSw2ICs1OSw5IEBACiAJaW50CSgqZ3NvX3NlbmRfY2hlY2spKHN0cnVjdCBza19idWZmICpza2IpOwogCXN0cnVjdCBza19idWZmICooKmdzb19zZWdtZW50KShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJCSAgICAgICBpbnQgZmVhdHVyZXMpOworCXN0cnVjdCBza19idWZmICoqKCpncm9fcmVjZWl2ZSkoc3RydWN0IHNrX2J1ZmYgKipoZWFkLAorCQkJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKKwlpbnQJKCpncm9fY29tcGxldGUpKHN0cnVjdCBza19idWZmICpza2IpOwogCiAJdW5zaWduZWQgaW50CWZsYWdzOwkvKiBJTkVUNl9QUk9UT194eHggKi8KIH07CmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC93aW1heC5oIGIvaW5jbHVkZS9uZXQvd2ltYXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzM4MDljCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9uZXQvd2ltYXguaApAQCAtMCwwICsxLDUyMyBAQAorLyoKKyAqIExpbnV4IFdpTUFYCisgKiBLZXJuZWwgc3BhY2UgQVBJIGZvciBhY2Nlc3NpbmcgV2lNQVggZGV2aWNlcworICoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBJbnRlbCBDb3Jwb3JhdGlvbiA8bGludXgtd2ltYXhAaW50ZWwuY29tPgorICogSW5ha3kgUGVyZXotR29uemFsZXogPGluYWt5LnBlcmV6LWdvbnphbGV6QGludGVsLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EuCisgKgorICoKKyAqIFRoZSBXaU1BWCBzdGFjayBwcm92aWRlcyBhbiBBUEkgZm9yIGNvbnRyb2xsaW5nIGFuZCBtYW5hZ2luZyB0aGUKKyAqIHN5c3RlbSdzIFdpTUFYIGRldmljZXMuIFRoaXMgQVBJIGFmZmVjdHMgdGhlIGNvbnRyb2wgcGxhbmU7IHRoZQorICogZGF0YSBwbGFuZSBpcyBhY2Nlc3NlZCB2aWEgdGhlIG5ldHdvcmsgc3RhY2sgKG5ldGRldikuCisgKgorICogUGFydHMgb2YgdGhlIFdpTUFYIHN0YWNrIEFQSSBhbmQgbm90aWZpY2F0aW9ucyBhcmUgZXhwb3J0ZWQgdG8KKyAqIHVzZXIgc3BhY2UgdmlhIEdlbmVyaWMgTmV0bGluay4gSW4gdXNlciBzcGFjZSwgbGlid2ltYXggKHBhcnQgb2YKKyAqIHRoZSB3aW1heC10b29scyBwYWNrYWdlKSBwcm92aWRlcyBhIHNoaW0gbGF5ZXIgZm9yIGFjY2Vzc2luZyB0aG9zZQorICogY2FsbHMuCisgKgorICogVGhlIEFQSSBpcyBzdGFuZGFyaXplZCBmb3IgYWxsIFdpTUFYIGRldmljZXMgYW5kIGRpZmZlcmVudCBkcml2ZXJzCisgKiBpbXBsZW1lbnQgdGhlIGJhY2tlbmQgc3VwcG9ydCBmb3IgaXQuIEhvd2V2ZXIsIGRldmljZS1zcGVjaWZpYworICogbWVzc2FnaW5nIHBpcGVzIGFyZSBwcm92aWRlZCB0aGF0IGNhbiBiZSB1c2VkIHRvIGlzc3VlIGNvbW1hbmRzIGFuZAorICogcmVjZWl2ZSBub3RpZmljYXRpb25zIGluIGZyZWUgZm9ybS4KKyAqCisgKiBDdXJyZW50bHkgdGhlIG1lc3NhZ2luZyBwaXBlcyBhcmUgdGhlIG9ubHkgbWVhbnMgb2YgY29udHJvbCBhcyBpdAorICogaXMgbm90IGtub3duIChkdWUgdG8gdGhlIGxhY2sgb2YgbW9yZSBkZXZpY2VzIGluIHRoZSBtYXJrZXQpIHdoYXQKKyAqIHdpbGwgYmUgYSBnb29kIGFic3RyYWN0aW9uIGxheWVyLiBFeHBlY3QgdGhpcyB0byBjaGFuZ2UgYXMgbW9yZQorICogZGV2aWNlcyBzaG93IGluIHRoZSBtYXJrZXQuIFRoaXMgQVBJIGlzIGRlc2lnbmVkIHRvIGJlIGdyb3dhYmxlIGluCisgKiBvcmRlciB0byBhZGRyZXNzIHRoaXMgcHJvYmxlbS4KKyAqCisgKiBVU0FHRQorICoKKyAqIEVtYmVkIGEgYHN0cnVjdCB3aW1heF9kZXZgIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHRoZSBkZXZpY2UncworICogcHJpdmF0ZSBzdHJ1Y3R1cmUsIGluaXRpYWxpemUgYW5kIHJlZ2lzdGVyIGl0LiBGb3IgZGV0YWlscywgc2VlCisgKiBgc3RydWN0IHdpbWF4X2RldmBzIGRvY3VtZW50YXRpb24uCisgKgorICogT25jZSB0aGlzIGlzIGRvbmUsIHdpbWF4LXRvb2xzJ3MgbGlid2ltYXhsbCBjYW4gYmUgdXNlZCB0bworICogY29tbXVuaWNhdGUgd2l0aCB0aGUgZHJpdmVyIGZyb20gdXNlciBzcGFjZS4gWW91IHVzZXIgc3BhY2UKKyAqIGFwcGxpY2F0aW9uIGRvZXMgbm90IGhhdmUgdG8gZm9yY2liaWx5IHVzZSBsaWJ3aW1heGxsIGFuZCBjYW4gdGFsaworICogdGhlIGdlbmVyaWMgbmV0bGluayBwcm90b2NvbCBkaXJlY3RseSBpZiBkZXNpcmVkLgorICoKKyAqIFJlbWVtYmVyIHRoaXMgaXMgYSB2ZXJ5IGxvdyBsZXZlbCBBUEkgdGhhdCB3aWxsIHRvIHByb3ZpZGUgYWxsIG9mCisgKiBXaU1BWCBmZWF0dXJlcy4gT3RoZXIgZGFlbW9ucyBhbmQgc2VydmljZXMgcnVubmluZyBpbiB1c2VyIHNwYWNlCisgKiBhcmUgdGhlIGV4cGVjdGVkIGNsaWVudHMgb2YgaXQuIFRoZXkgb2ZmZXIgYSBoaWdoZXIgbGV2ZWwgQVBJIHRoYXQKKyAqIGFwcGxpY2F0aW9ucyBzaG91bGQgdXNlIChhbiBleGFtcGxlIG9mIHRoaXMgaXMgdGhlIEludGVsJ3MgV2lNQVgKKyAqIE5ldHdvcmsgU2VydmljZSBmb3IgdGhlIGkyNDAwbSkuCisgKgorICogREVTSUdOCisgKgorICogQWx0aG91Z2ggbm90IHNldCBvbiBmaW5hbCBzdG9uZSwgdGhpcyB2ZXJ5IGJhc2ljIGludGVyZmFjZSBpcworICogbW9zdGx5IGNvbXBsZXRlZC4gUmVtZW1iZXIgdGhpcyBpcyBtZWFudCB0byBncm93IGFzIG5ldyBjb21tb24KKyAqIG9wZXJhdGlvbnMgYXJlIGRlY2lkZWQgdXBvbi4gTmV3IG9wZXJhdGlvbnMgd2lsbCBiZSBhZGRlZCB0byB0aGUKKyAqIGludGVyZmFjZSwgaW50ZW50IGJlaW5nIG9uIGtlZXBpbmcgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgYXMgbXVjaAorICogYXMgcG9zc2libGUuCisgKgorICogVGhpcyBsYXllciBpbXBsZW1lbnRzIGEgc2V0IG9mIGNhbGxzIHRvIGNvbnRyb2wgYSBXaU1BWCBkZXZpY2UsCisgKiBleHBvc2luZyBhIGZyb250ZW5kIHRvIHRoZSByZXN0IG9mIHRoZSBrZXJuZWwgYW5kIHVzZXIgc3BhY2UgKHZpYQorICogZ2VuZXJpYyBuZXRsaW5rKSBhbmQgYSBiYWNrZW5kIGltcGxlbWVudGF0aW9uIGluIHRoZSBkcml2ZXIgdGhyb3VnaAorICogZnVuY3Rpb24gcG9pbnRlcnMuCisgKgorICogV2lNQVggZGV2aWNlcyBoYXZlIGEgc3RhdGUsIGFuZCBhIGtlcm5lbC1vbmx5IEFQSSBhbGxvd3MgdGhlCisgKiBkcml2ZXJzIHRvIG1hbmlwdWxhdGUgdGhhdCBzdGF0ZS4gU3RhdGUgdHJhbnNpdGlvbnMgYXJlIGF0b21pYywgYW5kCisgKiBvbmx5IHNvbWUgb2YgdGhlbSBhcmUgYWxsb3dlZCAoc2VlIGBlbnVtIHdpbWF4X3N0YCkuCisgKgorICogTW9zdCBBUEkgY2FsbHMgd2lsbCBzZXQgdGhlIHN0YXRlIGF1dG9tYXRpY2FsbHk7IGluIG1vc3QgY2FzZXMKKyAqIGRyaXZlcnMgaGF2ZSB0byBvbmx5IHJlcG9ydCBzdGF0ZSBjaGFuZ2VzIGR1ZSB0byBleHRlcm5hbAorICogY29uZGl0aW9ucy4KKyAqCisgKiBBbGwgQVBJIG9wZXJhdGlvbnMgYXJlICdhdG9taWMnLCBzZXJpYWxpemVkIHRob3JvdWdoIGEgbXV0ZXggaW4gdGhlCisgKiBgc3RydWN0IHdpbWF4X2RldmAuCisgKgorICogRVhQT1JUSU5HIFRPIFVTRVIgU1BBQ0UgVEhST1VHSCBHRU5FUklDIE5FVExJTksKKyAqCisgKiBUaGUgQVBJIGlzIGV4cG9ydGVkIHRvIHVzZXIgc3BhY2UgdXNpbmcgZ2VuZXJpYyBuZXRsaW5rIChvdGhlcgorICogbWV0aG9kcyBjYW4gYmUgYWRkZWQgYXMgbmVlZGVkKS4KKyAqCisgKiBUaGVyZSBpcyBhIEdlbmVyaWMgTmV0bGluayBGYW1pbHkgbmFtZWQgIldpTUFYIiwgd2hlcmUgaW50ZXJmYWNlcworICogc3VwcG9ydGluZyB0aGUgV2lNQVggaW50ZXJmYWNlIHJlY2VpdmUgY29tbWFuZHMgYW5kIGJyb2FkY2FzdCB0aGVpcgorICogc2lnbmFscyBvdmVyIGEgbXVsdGljYXN0IGdyb3VwIG5hbWVkICJtc2ciLgorICoKKyAqIE1hcHBpbmcgdG8gdGhlIHNvdXJjZS9kZXN0aW5hdGlvbiBpbnRlcmZhY2UgaXMgZG9uZSBieSBhbiBpbnRlcmZhY2UKKyAqIGluZGV4IGF0dHJpYnV0ZS4KKyAqCisgKiBGb3IgdXNlci10by1rZXJuZWwgdHJhZmZpYyAoY29tbWFuZHMpIHdlIHVzZSBhIGZ1bmN0aW9uIGNhbGwKKyAqIG1hcnNoYWxsaW5nIG1lY2hhbmlzbSwgd2hlcmUgYSBtZXNzYWdlIFggd2l0aCBhdHRyaWJ1dGVzIEEsIEIsIEMKKyAqIHNlbnQgZnJvbSB1c2VyIHNwYWNlIHRvIGtlcm5lbCBzcGFjZSBtZWFucyBleGVjdXRpbmcgdGhlIFdpTUFYIEFQSQorICogY2FsbCB3aW1heF9YKEEsIEIsIEMpLCBzZW5kaW5nIHRoZSByZXN1bHRzIGJhY2sgYXMgYSBtZXNzYWdlLgorICoKKyAqIEtlcm5lbC10by11c2VyIChub3RpZmljYXRpb25zIG9yIHNpZ25hbHMpIGNvbW11bmljYXRpb24gaXMgc2VudAorICogb3ZlciBtdWx0aWNhc3QgZ3JvdXBzLiBUaGlzIGFsbG93cyB0byBoYXZlIG11bHRpcGxlIGFwcGxpY2F0aW9ucworICogbW9uaXRvcmluZyB0aGVtLgorICoKKyAqIEVhY2ggY29tbWFuZC9zaWduYWwgZ2V0cyBhc3NpZ25lZCBpdCdzIG93biBhdHRyaWJ1dGUgcG9saWN5LiBUaGlzCisgKiB3YXkgdGhlIHZhbGlkYXRvciB3aWxsIHZlcmlmeSB0aGF0IGFsbCB0aGUgYXR0cmlidXRlcyBpbiB0aGVyZSBhcmUKKyAqIG9ubHkgdGhlIG9uZXMgdGhhdCBzaG91bGQgYmUgZm9yIGVhY2ggY29tbWFuZC9zaWduYWwuIFRoaW5nIG9mIGFuCisgKiBhdHRyaWJ1dGUgbWFwcGluZyB0byBhIHR5cGUrYXJndW1lbnRuYW1lIGZvciBlYWNoIGNvbW1hbmQvc2lnbmFsLgorICoKKyAqIElmIHdlIGhhZCBhIHNpbmdsZSBwb2xpY3kgZm9yICphbGwqIGNvbW1hbmRzL3NpZ25hbHMsIGFmdGVyIHJ1bm5pbmcKKyAqIHRoZSB2YWxpZGF0b3Igd2UnZCBoYXZlIHRvIGNoZWNrICJkb2VzIHRoaXMgYXR0cmlidXRlIGJlbG9uZyBpbgorICogaGVyZSI/ICBmb3IgZWFjaCBvbmUuIEl0IGNhbiBiZSBkb25lIG1hbnVhbGx5LCBidXQgaXQncyBqdXN0IGVhc2llcgorICogdG8gaGF2ZSB0aGUgdmFsaWRhdG9yIGRvIHRoYXQgam9iIHdpdGggbXVsdGlwbGUgcG9saWNpZXMuIEFzIHdlbGwsCisgKiBpdCBtYWtlcyBpdCBlYXNpZXIgdG8gbGF0ZXIgZXhwYW5kIGVhY2ggY29tbWFuZC9zaWduYWwgc2lnbmF0dXJlCisgKiB3aXRob3V0IGFmZmVjdGluZyBvdGhlcnMgYW5kIGtlZXBpbmcgdGhlIG5hbWVzcGFjZSBtb3JlIG9yIGxlc3MKKyAqIHNhbmUuIE5vdCB0aGF0IGl0IGlzIHRvbyBjb21wbGljYXRlZCwgYnV0IGl0IG1ha2VzIGl0IGV2ZW4gZWFzaWVyLgorICoKKyAqIE5vIHN0YXRlIGluZm9ybWF0aW9uIGlzIG1haW50YWluZWQgaW4gdGhlIGtlcm5lbCBmb3IgZWFjaCB1c2VyCisgKiBzcGFjZSBjb25uZWN0aW9uICh0aGUgY29ubmVjdGlvbiBpcyBzdGF0ZWxlc3MpLgorICoKKyAqIFRFU1RJTkcgRk9SIFRIRSBJTlRFUkZBQ0UgQU5EIFZFUlNJT05JTkcKKyAqCisgKiBJZiBuZXR3b3JrIGludGVyZmFjZSBYIGlzIGEgV2lNQVggZGV2aWNlLCB0aGVyZSB3aWxsIGJlIGEgR2VuZXJpYworICogTmV0bGluayBmYW1pbHkgbmFtZWQgIldpTUFYIFgiIGFuZCB0aGUgZGV2aWNlIHdpbGwgcHJlc2VudCBhCisgKiAid2ltYXgiIGRpcmVjdG9yeSBpbiBpdCdzIG5ldHdvcmsgc3lzZnMgZGlyZWN0b3J5CisgKiAoL3N5cy9jbGFzcy9uZXQvREVWSUNFL3dpbWF4KSBbdXNlZCBieSBIQUxdLgorICoKKyAqIFRoZSBpbmV4aXN0ZW5jZSBvZiBhbnkgb2YgdGhlc2UgbWVhbnMgdGhlIGRldmljZSBkb2VzIG5vdCBzdXBwb3J0CisgKiB0aGlzIFdpTUFYIEFQSS4KKyAqCisgKiBCeSBxdWVyeWluZyB0aGUgZ2VuZXJpYyBuZXRsaW5rIGNvbnRyb2xsZXIsIHZlcnNpb25pbmcgaW5mb3JtYXRpb24KKyAqIGFuZCB0aGUgbXVsdGljYXN0IGdyb3VwcyBhdmFpbGFibGUgY2FuIGJlIGZvdW5kLiBBcHBsaWNhdGlvbnMgdXNpbmcKKyAqIHRoZSBpbnRlcmZhY2UgY2FuIGVpdGhlciByZWx5IG9uIHRoYXQgb3IgdXNlIHRoZSBnZW5lcmljIG5ldGxpbmsKKyAqIGNvbnRyb2xsZXIgdG8gZmlndXJlIG91dCB3aGljaCBnZW5lcmljIG5ldGxpbmsgY29tbWFuZHMvc2lnbmFscyBhcmUKKyAqIHN1cHBvcnRlZC4KKyAqCisgKiBOT1RFOiB0aGlzIHZlcnNpb25pbmcgaXMgYSBsYXN0IHJlc29ydCB0byBhdm9pZCBoYXJkCisgKiAgICBpbmNvbXBhdGliaWxpdGllcy4gSXQgaXMgdGhlIGludGVudGlvbiBvZiB0aGUgZGVzaWduIG9mIHRoaXMKKyAqICAgIHN0YWNrIG5vdCB0byBpbnRyb2R1Y2UgYmFja3dhcmQgaW5jb21wYXRpYmxlIGNoYW5nZXMuCisgKgorICogVGhlIHZlcnNpb24gY29kZSBoYXMgdG8gZml0IGluIG9uZSBieXRlIChyZXN0cmljdGlvbnMgaW1wb3NlZCBieQorICogZ2VuZXJpYyBuZXRsaW5rKTsgd2UgdXNlIGB2ZXJzaW9uIC8gMTBgIGZvciB0aGUgbWFqb3IgdmVyc2lvbiBhbmQKKyAqIGB2ZXJzaW9uICUgMTBgIGZvciB0aGUgbWlub3IuIFRoaXMgZ2l2ZXMgOSBtaW5vcnMgZm9yIGVhY2ggbWFqb3IKKyAqIGFuZCAyNSBtYWpvcnMuCisgKgorICogVGhlIHZlcnNpb24gY2hhbmdlIHByb3RvY29sIGlzIGFzIGZvbGxvdzoKKyAqCisgKiAtIE1ham9yIHZlcnNpb25zOiBuZWVkcyB0byBiZSBpbmNyZWFzZWQgaWYgYW4gZXhpc3RpbmcgbWVzc2FnZS9BUEkKKyAqICAgY2FsbCBpcyBjaGFuZ2VkIG9yIHJlbW92ZWQuIERvZXNuJ3QgbmVlZCB0byBiZSBjaGFuZ2VkIGlmIGEgbmV3CisgKiAgIG1lc3NhZ2UgaXMgYWRkZWQuCisgKgorICogLSBNaW5vciB2ZXJzaW9uOiBuZWVkcyB0byBiZSBpbmNyZWFzZWQgaWYgbmV3IG1lc3NhZ2VzL0FQSSBjYWxscyBhcmUKKyAqICAgYmVpbmcgYWRkZWQgb3Igc29tZSBvdGhlciBjb25zaWRlcmF0aW9uIHRoYXQgZG9lc24ndCBpbXBhY3QgdGhlCisgKiAgIHVzZXIta2VybmVsIGludGVyZmFjZSB0b28gbXVjaCAobGlrZSBzb21lIGtpbmQgb2YgYnVnIGZpeCkgYW5kCisgKiAgIHRoYXQgaXMga2luZCBvZiBsZWZ0IHVwIGluIHRoZSBhaXIgdG8gY29tbW9uIHNlbnNlLgorICoKKyAqIFVzZXIgc3BhY2UgY29kZSBzaG91bGQgbm90IHRyeSB0byB3b3JrIGlmIHRoZSBtYWpvciB2ZXJzaW9uIGl0IHdhcworICogY29tcGlsZWQgZm9yIGRpZmZlcnMgZnJvbSB3aGF0IHRoZSBrZXJuZWwgb2ZmZXJzLiBBcyB3ZWxsLCBpZiB0aGUKKyAqIG1pbm9yIHZlcnNpb24gb2YgdGhlIGtlcm5lbCBpbnRlcmZhY2UgaXMgbG93ZXIgdGhhbiB0aGUgb25lIHVzZXIKKyAqIHNwYWNlIGlzIGV4cGVjdGluZyAodGhlIG9uZSBpdCB3YXMgY29tcGlsZWQgZm9yKSwgdGhlIGtlcm5lbAorICogbWlnaHQgYmUgbWlzc2luZyBBUEkgY2FsbHM7IHVzZXIgc3BhY2Ugc2hhbGwgYmUgcmVhZHkgdG8gaGFuZGxlCisgKiBzYWlkIGNvbmRpdGlvbi4gVXNlIHRoZSBnZW5lcmljIG5ldGxpbmsgY29udHJvbGxlciBvcGVyYXRpb25zIHRvCisgKiBmaW5kIHdoaWNoIG9uZXMgYXJlIHN1cHBvcnRlZCBhbmQgd2hpY2ggbm90LgorICoKKyAqIGxpYndpbWF4bGw6d2ltYXhsbF9vcGVuKCkgdGFrZXMgY2FyZSBvZiBjaGVja2luZyB2ZXJzaW9ucy4KKyAqCisgKiBUSEUgT1BFUkFUSU9OUzoKKyAqCisgKiBFYWNoIG9wZXJhdGlvbiBpcyBkZWZpbmVkIGluIGl0cyBvbiBmaWxlIChkcml2ZXJzL25ldC93aW1heC9vcC0qLmMpCisgKiBmb3IgY2xhcml0eS4gVGhlIHBhcnRzIG5lZWRlZCBmb3IgYW4gb3BlcmF0aW9uIGFyZToKKyAqCisgKiAgLSBhIGZ1bmN0aW9uIHBvaW50ZXIgaW4gYHN0cnVjdCB3aW1heF9kZXZgOiBvcHRpb25hbCwgYXMgdGhlCisgKiAgICBvcGVyYXRpb24gbWlnaHQgYmUgaW1wbGVtZW50ZWQgYnkgdGhlIHN0YWNrIGFuZCBub3QgYnkgdGhlCisgKiAgICBkcml2ZXIuCisgKgorICogICAgQWxsIGZ1bmN0aW9uIHBvaW50ZXJzIGFyZSBuYW1lZCB3aW1heF9kZXYtPm9wXyooKSwgYW5kIGRyaXZlcnMKKyAqICAgIG11c3QgaW1wbGVtZW50IHRoZW0gZXhjZXB0IHdoZXJlIG5vdGVkIG90aGVyd2lzZS4KKyAqCisgKiAgLSBXaGVuIGV4cG9ydGVkIHRvIHVzZXIgc3BhY2UsIGEgYHN0cnVjdCBubGFfcG9saWN5YCB0byBkZWZpbmUgdGhlCisgKiAgICBhdHRyaWJ1dGVzIG9mIHRoZSBnZW5lcmljIG5ldGxpbmsgY29tbWFuZCBhbmQgYSBgc3RydWN0IGdlbmxfb3BzYAorICogICAgdG8gZGVmaW5lIHRoZSBvcGVyYXRpb24uCisgKgorICogQWxsIHRoZSBkZWNsYXJhdGlvbnMgZm9yIHRoZSBvcGVyYXRpb24gY29kZXMgKFdJTUFYX0dOTF9PUF88TkFNRT4pCisgKiBhbmQgZ2VuZXJpYyBuZXRsaW5rIGF0dHJpYnV0ZXMgKFdJTUFYX0dOTF88TkFNRT5fKikgYXJlIGRlY2xhcmVkIGluCisgKiBpbmNsdWRlL2xpbnV4L3dpbWF4Lmg7IHRoaXMgZmlsZSBpcyBpbnRlbmRlZCB0byBiZSBjbG9uZWQgYnkgdXNlcgorICogc3BhY2UgdG8gZ2FpbiBhY2Nlc3MgdG8gdGhvc2UgZGVjbGFyYXRpb25zLgorICoKKyAqIEEgZmV3IGNhdmVhdHMgdG8gcmVtZW1iZXI6CisgKgorICogIC0gTmVlZCB0byBkZWZpbmUgYXR0cmlidXRlIG51bWJlcnMgc3RhcnRpbmcgaW4gMTsgb3RoZXJ3aXNlIGl0CisgKiAgICBmYWlscy4KKyAqCisgKiAgLSB0aGUgYHN0cnVjdCBnZW5sX2ZhbWlseWAgcmVxdWlyZXMgYSBtYXhpbXVtIGF0dHJpYnV0ZSBpZDsgd2hlbgorICogICAgZGVmaW5pbmcgdGhlIGBzdHJ1Y3QgbmxhX3BvbGljeWAgZm9yIGVhY2ggbWVzc2FnZSwgaXQgaGFzIHRvIGhhdmUKKyAqICAgIGFuIGFycmF5IHNpemUgb2YgV0lNQVhfR05MX0FUVFJfTUFYKzEuCisgKgorICogVEhFIFBJUEUgSU5URVJGQUNFOgorICoKKyAqIFRoaXMgaW50ZXJmYWNlIGlzIGtlcHQgaW50ZW50aW9uYWxseSBzaW1wbGUuIFRoZSBkcml2ZXIgY2FuIHNlbmQKKyAqIGFuZCByZWNlaXZlIGZyZWUtZm9ybSBtZXNzYWdlcyB0by9mcm9tIHVzZXIgc3BhY2UgdGhyb3VnaCBhCisgKiBwaXBlLiBTZWUgZHJpdmVycy9uZXQvd2ltYXgvb3AtbXNnLmMgZm9yIGRldGFpbHMuCisgKgorICogVGhlIGtlcm5lbC10by11c2VyIG1lc3NhZ2VzIGFyZSBzZW50IHdpdGgKKyAqIHdpbWF4X21zZygpLiB1c2VyLXRvLWtlcm5lbCBtZXNzYWdlcyBhcmUgZGVsaXZlcmVkIHZpYQorICogd2ltYXhfZGV2LT5vcF9tc2dfZnJvbV91c2VyKCkuCisgKgorICogUkZLSUxMOgorICoKKyAqIFJGS0lMTCBzdXBwb3J0IGlzIGJ1aWx0IGludG8gdGhlIHdpbWF4X2RldiBsYXllcjsgdGhlIGRyaXZlciBqdXN0CisgKiBuZWVkcyB0byBjYWxsIHdpbWF4X3JlcG9ydF9yZmtpbGxfe2h3LHN3fSgpIHRvIGluZm9ybSBvZiBjaGFuZ2VzIGluCisgKiB0aGUgaGFyZHdhcmUgb3Igc29mdHdhcmUgUkYga2lsbCBzd2l0Y2hlcy4gV2hlbiB0aGUgc3RhY2sgd2FudHMgdG8KKyAqIHR1cm4gdGhlIHJhZGlvIG9mZiwgaXQgd2lsbCBjYWxsIHdpbWF4X2Rldi0+b3BfcmZraWxsX3N3X3RvZ2dsZSgpLAorICogd2hpY2ggdGhlIGRyaXZlciBpbXBsZW1lbnRzLgorICoKKyAqIFVzZXIgc3BhY2UgY2FuIHNldCB0aGUgc29mdHdhcmUgUkYgS2lsbCBzd2l0Y2ggYnkgY2FsbGluZworICogd2ltYXhfcmZraWxsKCkuCisgKgorICogVGhlIGNvZGUgZm9yIG5vdyBvbmx5IHN1cHBvcnRzIGRldmljZXMgdGhhdCBkb24ndCByZXF1aXJlIHBvbGxpbmc7CisgKiBJZiB0aGUgZGV2aWNlIG5lZWRzIHRvIGJlIHBvbGxlZCwgY3JlYXRlIGEgc2VsZi1yZWFybWluZyBkZWxheWVkCisgKiB3b3JrIHN0cnVjdCBmb3IgcG9sbGluZyBvciBsb29rIGludG8gYWRkaW5nIHBvbGxlZCBzdXBwb3J0IHRvIHRoZQorICogV2lNQVggc3RhY2suCisgKgorICogV2hlbiBpbml0aWFsaXppbmcgdGhlIGhhcmR3YXJlIChfcHJvYmUpLCBhZnRlciBjYWxsaW5nCisgKiB3aW1heF9kZXZfYWRkKCksIHF1ZXJ5IHRoZSBkZXZpY2UgZm9yIGl0J3MgUkYgS2lsbCBzd2l0Y2hlcyBzdGF0dXMKKyAqIGFuZCBmZWVkIGl0IGJhY2sgdG8gdGhlIFdpTUFYIHN0YWNrIHVzaW5nCisgKiB3aW1heF9yZXBvcnRfcmZraWxsX3todyxzd30oKS4gSWYgYW55IHN3aXRjaCBpcyBtaXNzaW5nLCBhbHdheXMKKyAqIHJlcG9ydCBpdCBhcyBPTi4KKyAqCisgKiBOT1RFOiB0aGUgd2ltYXggc3RhY2sgdXNlcyBhbiBpbnZlcnRlZCB0ZXJtaW5vbG9neSB0byB0aGF0IG9mIHRoZQorICogUkZLSUxMIHN1YnN5c3RlbToKKyAqCisgKiAgLSBPTjogcmFkaW8gaXMgT04sIFJGS0lMTCBpcyBESVNBQkxFRCBvciBPRkYuCisgKiAgLSBPRkY6IHJhZGlvIGlzIE9GRiwgUkZLSUxMIGlzIEVOQUJMRUQgb3IgT04uCisgKgorICogTUlTQ0VMTEFORU9VUyBPUFM6CisgKgorICogd2ltYXhfcmVzZXQoKSBjYW4gYmUgdXNlZCB0byByZXNldCB0aGUgZGV2aWNlIHRvIHBvd2VyIG9uIHN0YXRlOyBieQorICogZGVmYXVsdCBpdCBpc3N1ZXMgYSB3YXJtIHJlc2V0IHRoYXQgbWFpbnRhaW5zIHRoZSBzYW1lIGRldmljZQorICogbm9kZS4gSWYgdGhhdCBpcyBub3QgcG9zc2libGUsIGl0IGZhbGxzIGJhY2sgdG8gYSBjb2xkIHJlc2V0CisgKiAoZGV2aWNlIHJlY29ubmVjdCkuIFRoZSBkcml2ZXIgaW1wbGVtZW50cyB0aGUgYmFja2VuZCB0byB0aGlzCisgKiB0aHJvdWdoIHdpbWF4X2Rldi0+b3BfcmVzZXQoKS4KKyAqLworCisjaWZuZGVmIF9fTkVUX19XSU1BWF9IX18KKyNkZWZpbmUgX19ORVRfX1dJTUFYX0hfXworI2lmZGVmIF9fS0VSTkVMX18KKworI2luY2x1ZGUgPGxpbnV4L3dpbWF4Lmg+CisjaW5jbHVkZSA8bmV0L2dlbmV0bGluay5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorCitzdHJ1Y3QgbmV0X2RldmljZTsKK3N0cnVjdCBnZW5sX2luZm87CitzdHJ1Y3Qgd2ltYXhfZGV2Oworc3RydWN0IGlucHV0X2RldjsKKworLyoqCisgKiBzdHJ1Y3Qgd2ltYXhfZGV2IC0gR2VuZXJpYyBXaU1BWCBkZXZpY2UKKyAqCisgKiBAbmV0X2RldjogW2ZpbGxdIFBvaW50ZXIgdG8gdGhlICZzdHJ1Y3QgbmV0X2RldmljZSB0aGlzIFdpTUFYCisgKiAgICAgZGV2aWNlIGltcGxlbWVudHMuCisgKgorICogQG9wX21zZ19mcm9tX3VzZXI6IFtmaWxsXSBEcml2ZXItc3BlY2lmaWMgb3BlcmF0aW9uIHRvCisgKiAgICAgaGFuZGxlIGEgcmF3IG1lc3NhZ2UgZnJvbSB1c2VyIHNwYWNlIHRvIHRoZSBkcml2ZXIuIFRoZQorICogICAgIGRyaXZlciBjYW4gc2VuZCBtZXNzYWdlcyB0byB1c2VyIHNwYWNlIHVzaW5nIHdpdGgKKyAqICAgICB3aW1heF9tc2dfdG9fdXNlcigpLgorICoKKyAqIEBvcF9yZmtpbGxfc3dfdG9nZ2xlOiBbZmlsbF0gRHJpdmVyLXNwZWNpZmljIG9wZXJhdGlvbiB0byBhY3Qgb24KKyAqICAgICB1c2Vyc3BhY2UgKG9yIGFueSBvdGhlciBhZ2VudCkgcmVxdWVzdGluZyB0aGUgV2lNQVggZGV2aWNlIHRvCisgKiAgICAgY2hhbmdlIHRoZSBSRiBLaWxsIHNvZnR3YXJlIHN3aXRjaCAoV0lNQVhfUkZfT04gb3IKKyAqICAgICBXSU1BWF9SRl9PRkYpLgorICogICAgIElmIHN1Y2ggaGFyZHdhcmUgc3VwcG9ydCBpcyBub3QgcHJlc2VudCwgaXQgaXMgYXNzdW1lZCB0aGUKKyAqICAgICByYWRpbyBjYW5ub3QgYmUgc3dpdGNoZWQgb2ZmIGFuZCBpdCBpcyBhbHdheXMgb24gKGFuZCB0aGUgc3RhY2sKKyAqICAgICB3aWxsIGVycm9yIG91dCB3aGVuIHRyeWluZyB0byBzd2l0Y2ggaXQgb2ZmKS4gSW4gc3VjaCBjYXNlLAorICogICAgIHRoaXMgZnVuY3Rpb24gcG9pbnRlciBjYW4gYmUgbGVmdCBhcyBOVUxMLgorICoKKyAqIEBvcF9yZXNldDogW2ZpbGxdIERyaXZlciBzcGVjaWZpYyBvcGVyYXRpb24gdG8gcmVzZXQgdGhlCisgKiAgICAgZGV2aWNlLgorICogICAgIFRoaXMgb3BlcmF0aW9uIHNob3VsZCBhbHdheXMgYXR0ZW1wdCBmaXJzdCBhIHdhcm0gcmVzZXQgdGhhdAorICogICAgIGRvZXMgbm90IGRpc2Nvbm5lY3QgdGhlIGRldmljZSBmcm9tIHRoZSBidXMgYW5kIHJldHVybiAwLgorICogICAgIElmIHRoYXQgZmFpbHMsIGl0IHNob3VsZCByZXNvcnQgdG8gc29tZSBzb3J0IG9mIGNvbGQgb3IgYnVzCisgKiAgICAgcmVzZXQgKGV2ZW4gaWYgaXQgaW1wbGllcyBhIGJ1cyBkaXNjb25uZWN0aW9uIGFuZCBkZXZpY2UKKyAqICAgICBkaXNzYXBlYXJhbmNlKS4gSW4gdGhhdCBjYXNlLCAtRU5PREVWIHNob3VsZCBiZSByZXR1cm5lZCB0bworICogICAgIGluZGljYXRlIHRoZSBkZXZpY2UgaXMgZ29uZS4KKyAqICAgICBUaGlzIG9wZXJhdGlvbiBoYXMgdG8gYmUgc3luY2hyb25vdXMsIGFuZCByZXR1cm4gb25seSB3aGVuIHRoZQorICogICAgIHJlc2V0IGlzIGNvbXBsZXRlLiBJbiBjYXNlIG9mIGhhdmluZyBoYWQgdG8gcmVzb3J0IHRvIGJ1cy9jb2xkCisgKiAgICAgcmVzZXQgaW1wbHlpbmcgYSBkZXZpY2UgZGlzY29ubmVjdGlvbiwgdGhlIGNhbGwgaXMgYWxsb3dlZCB0bworICogICAgIHJldHVybiBpbm1lZGlhdGVseS4KKyAqICAgICBOT1RFOiB3aW1heF9kZXYtPm11dGV4IGlzIE5PVCBsb2NrZWQgd2hlbiB0aGlzIG9wIGlzIGJlaW5nCisgKiAgICAgY2FsbGVkOyBob3dldmVyLCB3aW1heF9kZXYtPm11dGV4X3Jlc2V0IElTIGxvY2tlZCB0byBlbnN1cmUKKyAqICAgICBzZXJpYWxpemF0aW9uIG9mIGNhbGxzIHRvIHdpbWF4X3Jlc2V0KCkuCisgKiAgICAgU2VlIHdpbWF4X3Jlc2V0KCkncyBkb2N1bWVudGF0aW9uLgorICoKKyAqIEBuYW1lOiBbZmlsbF0gQSB3YXkgdG8gaWRlbnRpZnkgdGhpcyBkZXZpY2UuIFdlIG5lZWQgdG8gcmVnaXN0ZXIgYQorICogICAgIG5hbWUgd2l0aCBtYW55IHN1YnN5c3RlbXMgKGlucHV0IGZvciBSRktJTEwsIHdvcmtxdWV1ZQorICogICAgIGNyZWF0aW9uLCBldGMpLiBXZSBjYW4ndCB1c2UgdGhlIG5ldHdvcmsgZGV2aWNlIG5hbWUgYXMgdGhhdAorICogICAgIG1pZ2h0IGNoYW5nZSBhbmQgaW4gc29tZSBpbnN0YW5jZXMgd2UgZG9uJ3Qga25vdyBpdCB5ZXQgKHVudGlsCisgKiAgICAgd2UgZG9uJ3QgY2FsbCByZWdpc3Rlcl9uZXRkZXYoKSkuIFNvIHdlIGdlbmVyYXRlIGFuIHVuaXF1ZSBvbmUKKyAqICAgICB1c2luZyB0aGUgZHJpdmVyIG5hbWUgYW5kIGRldmljZSBidXMgaWQsIHBsYWNlIGl0IGhlcmUgYW5kIHVzZQorICogICAgIGl0IGFjcm9zcyB0aGUgYm9hcmQuIFJlY29tbWVuZGVkIG5hbWluZzoKKyAqICAgICBEUklWRVJOQU1FLUJVU05BTUU6QlVTSUQgKGRldi0+YnVzLT5uYW1lLCBkZXYtPmJ1c19pZCkuCisgKgorICogQGlkX3RhYmxlX25vZGU6IFtwcml2YXRlXSBsaW5rIHRvIHRoZSBsaXN0IG9mIHdpbWF4IGRldmljZXMga2VwdCBieQorICogICAgIGlkLXRhYmxlLmMuIFByb3RlY3RlZCBieSBpdCdzIG93biBzcGlubG9jay4KKyAqCisgKiBAbXV0ZXg6IFtwcml2YXRlXSBTZXJpYWxpemVzIGFsbCBjb25jdXJyZW50IGFjY2VzcyBhbmQgZXhlY3V0aW9uIG9mCisgKiAgICAgb3BlcmF0aW9ucy4KKyAqCisgKiBAbXV0ZXhfcmVzZXQ6IFtwcml2YXRlXSBTZXJpYWxpemVzIHJlc2V0IG9wZXJhdGlvbnMuIE5lZWRzIHRvIGJlIGEKKyAqICAgICBkaWZmZXJlbnQgbXV0ZXggYmVjYXVzZSBhcyBwYXJ0IG9mIHRoZSByZXNldCBvcGVyYXRpb24sIHRoZQorICogICAgIGRyaXZlciBoYXMgdG8gY2FsbCBiYWNrIGludG8gdGhlIHN0YWNrIHRvIGRvIHRoaW5ncyBzdWNoIGFzCisgKiAgICAgc3RhdGUgY2hhbmdlLCB0aGF0IHJlcXVpcmUgd2ltYXhfZGV2LT5tdXRleC4KKyAqCisgKiBAc3RhdGU6IFtwcml2YXRlXSBDdXJyZW50IHN0YXRlIG9mIHRoZSBXaU1BWCBkZXZpY2UuCisgKgorICogQHJma2lsbDogW3ByaXZhdGVdIGludGVncmF0aW9uIGludG8gdGhlIFJGLUtpbGwgaW5mcmFzdHJ1Y3R1cmUuCisgKgorICogQHJma2lsbF9pbnB1dDogW3ByaXZhdGVdIHZpcnR1YWwgaW5wdXQgZGV2aWNlIHRvIHByb2Nlc3MgdGhlCisgKiAgICAgaGFyZHdhcmUgUkYgS2lsbCBzd2l0Y2hlcy4KKyAqCisgKiBAcmZfc3c6IFtwcml2YXRlXSBTdGF0ZSBvZiB0aGUgc29mdHdhcmUgcmFkaW8gc3dpdGNoIChPRkYvT04pCisgKgorICogQHJmX2h3OiBbcHJpdmF0ZV0gU3RhdGUgb2YgdGhlIGhhcmR3YXJlIHJhZGlvIHN3aXRjaCAoT0ZGL09OKQorICoKKyAqIEBkZWJ1ZnNfZGVudHJ5OiBbcHJpdmF0ZV0gVXNlZCB0byBob29rIHVwIGEgZGVidWdmcyBlbnRyeS4gVGhpcworICogICAgIHNob3dzIHVwIGluIHRoZSBkZWJ1Z2ZzIHJvb3QgYXMgd2ltYXg6REVWSUNFTkFNRS4KKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgYSBjb21tb24gaW50ZXJmYWNlIHRvIGFjY2VzcyBhbGwgV2lNQVgKKyAqIGRldmljZXMgZnJvbSBkaWZmZXJlbnQgdmVuZG9ycyBhbmQgcHJvdmlkZXMgYSBjb21tb24gQVBJIGFzIHdlbGwgYXMKKyAqIGEgZnJlZS1mb3JtIGRldmljZS1zcGVjaWZpYyBtZXNzYWdpbmcgY2hhbm5lbC4KKyAqCisgKiBVc2FnZToKKyAqICAxLiBFbWJlZCBhICZzdHJ1Y3Qgd2ltYXhfZGV2IGF0ICp0aGUgYmVnaW5uaW5nKiB0aGUgbmV0d29yaworICogICAgIGRldmljZSBzdHJ1Y3R1cmUgc28gdGhhdCBuZXRkZXZfcHJpdigpIHBvaW50cyB0byBpdC4KKyAqCisgKiAgMi4gbWVtc2V0KCkgaXQgdG8gemVybworICoKKyAqICAzLiBJbml0aWFsaXplIHdpdGggd2ltYXhfZGV2X2luaXQoKS4gVGhpcyB3aWxsIGxlYXZlIHRoZSBXaU1BWAorICogICAgIGRldmljZSBpbiB0aGUgJV9fV0lNQVhfU1RfTlVMTCBzdGF0ZS4KKyAqCisgKiAgNC4gRmlsbCBhbGwgdGhlIGZpZWxkcyBtYXJrZWQgd2l0aCBbZmlsbF07IG9uY2UgY2FsbGVkCisgKiAgICAgd2ltYXhfZGV2X2FkZCgpLCB0aG9zZSBmaWVsZHMgQ0FOTk9UIGJlIG1vZGlmaWVkLgorICoKKyAqICA1LiBDYWxsIHdpbWF4X2Rldl9hZGQoKSAqYWZ0ZXIqIHJlZ2lzdGVyaW5nIHRoZSBuZXR3b3JrCisgKiAgICAgZGV2aWNlLiBUaGlzIHdpbGwgbGVhdmUgdGhlIFdpTUFYIGRldmljZSBpbiB0aGUgJVdJTUFYX1NUX0RPV04KKyAqICAgICBzdGF0ZS4KKyAqICAgICBQcm90ZWN0IHRoZSBkcml2ZXIncyBuZXRfZGV2aWNlLT5vcGVuKCkgYWdhaW5zdCBzdWNjZWVkaW5nIGlmCisgKiAgICAgdGhlIHdpbWF4IGRldmljZSBzdGF0ZSBpcyBsb3dlciB0aGFuICVXSU1BWF9TVF9ET1dOLgorICoKKyAqICA2LiBTZWxlY3Qgd2hlbiB0aGUgZGV2aWNlIGlzIGdvaW5nIHRvIGJlIHR1cm5lZCBvbi9pbml0aWFsaXplZDsKKyAqICAgICBmb3IgZXhhbXBsZSwgaXQgY291bGQgYmUgaW5pdGlhbGl6ZWQgb24gJ2lmY29uZmlnIHVwJyAod2hlbiB0aGUKKyAqICAgICBuZXRkZXYgb3AgJ29wZW4oKScgaXMgY2FsbGVkIG9uIHRoZSBkcml2ZXIpLgorICoKKyAqIFdoZW4gdGhlIGRldmljZSBpcyBpbml0aWFsaXplZCAoYXQgYGlmY29uZmlnIHVwYCB0aW1lLCBvciByaWdodAorICogYWZ0ZXIgY2FsbGluZyB3aW1heF9kZXZfYWRkKCkgZnJvbSBfcHJvYmUoKSwgbWFrZSBzdXJlIHRoZQorICogZm9sbG93aW5nIHN0ZXBzIGFyZSB0YWtlbgorICoKKyAqICBhLiBNb3ZlIHRoZSBkZXZpY2UgdG8gJVdJTUFYX1NUX1VOSU5JVElBTElaRUQuIFRoaXMgaXMgbmVlZGVkIHNvCisgKiAgICAgc29tZSBBUEkgY2FsbHMgdGhhdCBzaG91bGRuJ3Qgd29yayB1bnRpbCB0aGUgZGV2aWNlIGlzIHJlYWR5CisgKiAgICAgY2FuIGJlIGJsb2NrZWQuCisgKgorICogIGIuIEluaXRpYWxpemUgdGhlIGRldmljZS4gTWFrZSBzdXJlIHRvIHR1cm4gdGhlIFNXIHJhZGlvIHN3aXRjaAorICogICAgIG9mZiBhbmQgbW92ZSB0aGUgZGV2aWNlIHRvIHN0YXRlICVXSU1BWF9TVF9SQURJT19PRkYgd2hlbgorICogICAgIGRvbmUuIFdoZW4ganVzdCBpbml0aWFsaXplZCwgYSBkZXZpY2Ugc2hvdWxkIGJlIGxlZnQgaW4gUkFESU8KKyAqICAgICBPRkYgc3RhdGUgdW50aWwgdXNlciBzcGFjZSBkZXZpY2VzIHRvIHR1cm4gaXQgb24uCisgKgorICogIGMuIFF1ZXJ5IHRoZSBkZXZpY2UgZm9yIHRoZSBzdGF0ZSBvZiB0aGUgaGFyZHdhcmUgcmZraWxsIHN3aXRjaAorICogICAgIGFuZCBjYWxsIHdpbWF4X3Jma2lsbF9yZXBvcnRfaHcoKSBhbmQgd2ltYXhfcmZraWxsX3JlcG9ydF9zdygpCisgKiAgICAgYXMgbmVlZGVkLiBTZWUgYmVsb3cuCisgKgorICogd2ltYXhfZGV2X3JtKCkgdW5kb2VzIGJlZm9yZSB1bnJlZ2lzdGVyaW5nIHRoZSBuZXR3b3JrIGRldmljZS4gT25jZQorICogd2ltYXhfZGV2X2FkZCgpIGlzIGNhbGxlZCwgdGhlIGRyaXZlciBjYW4gZ2V0IGNhbGxlZCBvbiB0aGUKKyAqIHdpbWF4X2Rldi0+b3BfKiBmdW5jdGlvbiBwb2ludGVycworICoKKyAqIENPTkNVUlJFTkNZOgorICoKKyAqIFRoZSBzdGFjayBwcm92aWRlcyBhIG11dGV4IGZvciBlYWNoIGRldmljZSB0aGF0IHdpbGwgZGlzYWxsb3cgQVBJCisgKiBjYWxscyBoYXBwZW5pbmcgY29uY3VycmVudGx5OyB0aHVzLCBvcCBjYWxscyBpbnRvIHRoZSBkcml2ZXIKKyAqIHRocm91Z2ggdGhlIHdpbWF4X2Rldi0+b3AqKCkgZnVuY3Rpb24gcG9pbnRlcnMgd2lsbCBhbHdheXMgYmUKKyAqIHNlcmlhbGl6ZWQgYW5kICpuZXZlciogY29uY3VycmVudC4KKyAqCisgKiBGb3IgbG9ja2luZywgdGFrZSB3aW1heF9kZXYtPm11dGV4IGlzIHRha2VuOyAobW9zdCkgb3BlcmF0aW9ucyBpbgorICogdGhlIEFQSSBoYXZlIHRvIGNoZWNrIGZvciB3aW1heF9kZXZfaXNfcmVhZHkoKSB0byByZXR1cm4gMCBiZWZvcmUKKyAqIGNvbnRpbnVpbmcgKHRoaXMgaXMgZG9uZSBpbnRlcm5hbGx5KS4KKyAqCisgKiBSRUZFUkVOQ0UgQ09VTlRJTkc6CisgKgorICogVGhlIFdpTUFYIGRldmljZSBpcyByZWZlcmVuY2UgY291bnRlZCBieSB0aGUgYXNzb2NpYXRlZCBuZXR3b3JrCisgKiBkZXZpY2UuIFRoZSBvbmx5IG9wZXJhdGlvbiB0aGF0IGNhbiBiZSB1c2VkIHRvIHJlZmVyZW5jZSB0aGUgZGV2aWNlCisgKiBpcyB3aW1heF9kZXZfZ2V0X2J5X2dlbmxfaW5mbygpLCBhbmQgdGhlIHJlZmVyZW5jZSBpdCBhY3F1aXJlcyBoYXMKKyAqIHRvIGJlIHJlbGVhc2VkIHdpdGggZGV2X3B1dCh3aW1heF9kZXYtPm5ldF9kZXYpLgorICoKKyAqIFJGS0lMTDoKKyAqCisgKiBBdCBzdGFydHVwLCBib3RoIEhXIGFuZCBTVyByYWRpbyBzd2l0Y2hlc3MgYXJlIGFzc3VtZWQgdG8gYmUgb2ZmLgorICoKKyAqIEF0IGluaXRpYWxpemF0aW9uIHRpbWUgW2FmdGVyIGNhbGxpbmcgd2ltYXhfZGV2X2FkZCgpXSwgaGF2ZSB0aGUKKyAqIGRyaXZlciBxdWVyeSB0aGUgZGV2aWNlIGZvciB0aGUgc3RhdHVzIG9mIHRoZSBzb2Z0d2FyZSBhbmQgaGFyZHdhcmUKKyAqIFJGIGtpbGwgc3dpdGNoZXMgYW5kIGNhbGwgd2ltYXhfcmVwb3J0X3Jma2lsbF9odygpIGFuZAorICogd2ltYXhfcmZraWxsX3JlcG9ydF9zdygpIHRvIGluZGljYXRlIHRoZWlyIHN0YXRlLiBJZiBhbnkgaXMKKyAqIG1pc3NpbmcsIGp1c3QgY2FsbCBpdCB0byBpbmRpY2F0ZSBpdCBpcyBPTiAocmFkaW8gYWx3YXlzIG9uKS4KKyAqCisgKiBXaGVuZXZlciB0aGUgZHJpdmVyIGRldGVjdHMgYSBjaGFuZ2UgaW4gdGhlIHN0YXRlIG9mIHRoZSBSRiBraWxsCisgKiBzd2l0Y2hlcywgaXQgc2hvdWxkIGNhbGwgd2ltYXhfcmVwb3J0X3Jma2lsbF9odygpIG9yCisgKiB3aW1heF9yZXBvcnRfcmZraWxsX3N3KCkgdG8gcmVwb3J0IGl0IHRvIHRoZSBzdGFjay4KKyAqLworc3RydWN0IHdpbWF4X2RldiB7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXY7CisJc3RydWN0IGxpc3RfaGVhZCBpZF90YWJsZV9ub2RlOworCXN0cnVjdCBtdXRleCBtdXRleDsJCS8qIFByb3RlY3RzIGFsbCBtZW1iZXJzIGFuZCBBUEkgY2FsbHMgKi8KKwlzdHJ1Y3QgbXV0ZXggbXV0ZXhfcmVzZXQ7CisJZW51bSB3aW1heF9zdCBzdGF0ZTsKKworCWludCAoKm9wX21zZ19mcm9tX3VzZXIpKHN0cnVjdCB3aW1heF9kZXYgKndpbWF4X2RldiwKKwkJCQljb25zdCBjaGFyICosCisJCQkJY29uc3Qgdm9pZCAqLCBzaXplX3QsCisJCQkJY29uc3Qgc3RydWN0IGdlbmxfaW5mbyAqaW5mbyk7CisJaW50ICgqb3BfcmZraWxsX3N3X3RvZ2dsZSkoc3RydWN0IHdpbWF4X2RldiAqd2ltYXhfZGV2LAorCQkJCSAgIGVudW0gd2ltYXhfcmZfc3RhdGUpOworCWludCAoKm9wX3Jlc2V0KShzdHJ1Y3Qgd2ltYXhfZGV2ICp3aW1heF9kZXYpOworCisJc3RydWN0IHJma2lsbCAqcmZraWxsOworCXN0cnVjdCBpbnB1dF9kZXYgKnJma2lsbF9pbnB1dDsKKwl1bnNpZ25lZCByZl9odzsKKwl1bnNpZ25lZCByZl9zdzsKKwljaGFyIG5hbWVbMzJdOworCisJc3RydWN0IGRlbnRyeSAqZGVidWdmc19kZW50cnk7Cit9OworCisKKworLyoKKyAqIFdpTUFYIHN0YWNrIHB1YmxpYyBBUEkgZm9yIGRldmljZSBkcml2ZXJzCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIFRoZXNlIGZ1bmN0aW9ucyBhcmUgbm90IGV4cG9ydGVkIHRvIHVzZXIgc3BhY2UuCisgKi8KK2V4dGVybiB2b2lkIHdpbWF4X2Rldl9pbml0KHN0cnVjdCB3aW1heF9kZXYgKik7CitleHRlcm4gaW50IHdpbWF4X2Rldl9hZGQoc3RydWN0IHdpbWF4X2RldiAqLCBzdHJ1Y3QgbmV0X2RldmljZSAqKTsKK2V4dGVybiB2b2lkIHdpbWF4X2Rldl9ybShzdHJ1Y3Qgd2ltYXhfZGV2ICopOworCitzdGF0aWMgaW5saW5lCitzdHJ1Y3Qgd2ltYXhfZGV2ICpuZXRfZGV2X3RvX3dpbWF4KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2KQoreworCXJldHVybiBuZXRkZXZfcHJpdihuZXRfZGV2KTsKK30KKworc3RhdGljIGlubGluZQorc3RydWN0IGRldmljZSAqd2ltYXhfZGV2X3RvX2RldihzdHJ1Y3Qgd2ltYXhfZGV2ICp3aW1heF9kZXYpCit7CisJcmV0dXJuIHdpbWF4X2Rldi0+bmV0X2Rldi0+ZGV2LnBhcmVudDsKK30KKworZXh0ZXJuIHZvaWQgd2ltYXhfc3RhdGVfY2hhbmdlKHN0cnVjdCB3aW1heF9kZXYgKiwgZW51bSB3aW1heF9zdCk7CitleHRlcm4gZW51bSB3aW1heF9zdCB3aW1heF9zdGF0ZV9nZXQoc3RydWN0IHdpbWF4X2RldiAqKTsKKworLyoKKyAqIFJhZGlvIFN3aXRjaCBzdGF0ZSByZXBvcnRpbmcuCisgKgorICogZW51bSB3aW1heF9yZl9zdGF0ZSBpcyBkZWNsYXJlZCBpbiBsaW51eC93aW1heC5oIHNvIHRoZSBleHBvcnRzCisgKiB0byB1c2VyIHNwYWNlIGNhbiB1c2UgaXQuCisgKi8KK2V4dGVybiB2b2lkIHdpbWF4X3JlcG9ydF9yZmtpbGxfaHcoc3RydWN0IHdpbWF4X2RldiAqLCBlbnVtIHdpbWF4X3JmX3N0YXRlKTsKK2V4dGVybiB2b2lkIHdpbWF4X3JlcG9ydF9yZmtpbGxfc3coc3RydWN0IHdpbWF4X2RldiAqLCBlbnVtIHdpbWF4X3JmX3N0YXRlKTsKKworCisvKgorICogRnJlZS1mb3JtIG1lc3NhZ2luZyB0by9mcm9tIHVzZXIgc3BhY2UKKyAqCisgKiBTZW5kaW5nIGEgbWVzc2FnZToKKyAqCisgKiAgIHdpbWF4X21zZyh3aW1heF9kZXYsIHBpcGVfbmFtZSwgYnVmLCBidWZfc2l6ZSwgR0ZQX0tFUk5FTCk7CisgKgorICogQnJva2VuIHVwOgorICoKKyAqICAgc2tiID0gd2ltYXhfbXNnX2FsbG9jKHdpbWF4X2RldiwgcGlwZV9uYW1lLCBidWZfc2l6ZSwgR0ZQX0tFUk5FTCk7CisgKiAgIC4uLmZpbGwgdXAgc2tiLi4uCisgKiAgIHdpbWF4X21zZ19zZW5kKHdpbWF4X2RldiwgcGlwZV9uYW1lLCBza2IpOworICoKKyAqIEJlIHN1cmUgbm90IHRvIG1vZGlmeSBza2ItPmRhdGEgaW4gdGhlIG1pZGRsZSAoaWU6IGRvbid0IHVzZQorICogc2tiX3B1c2goKS9za2JfcHVsbCgpL3NrYl9yZXNlcnZlKCkgb24gdGhlIHNrYikuCisgKgorICogInBpcGVfbmFtZSIgaXMgYW55IHN0cmluZywgdGhhbiBjYW4gYmUgaW50ZXJwcmV0ZWQgYXMgdGhlIG5hbWUgb2YKKyAqIHRoZSBwaXBlIG9yIGRlc3RpbmF0YXJ5OyB0aGUgaW50ZXJwcmV0YXRpb24gb2YgaXQgaXMgZHJpdmVyCisgKiBzcGVjaWZpYywgc28gdGhlIHJlY2lwaWVudCBjYW4gbXVsdGlwbGV4IGl0IGFzIHdpc2hlZC4gSXQgY2FuIGJlCisgKiBOVUxMLCBpdCB3b24ndCBiZSB1c2VkIC0gYW4gZXhhbXBsZSBpcyB1c2luZyBhICJkaWFnbm9zdGljcyIgdGFnIHRvCisgKiBzZW5kIGRpYWdub3N0aWNzIGluZm9ybWF0aW9uIHRoYXQgYSBkZXZpY2Utc3BlY2lmaWMgZGlhZ25vc3RpY3MKKyAqIHRvb2wgd291bGQgYmUgaW50ZXJlc3RlZCBpbi4KKyAqLworZXh0ZXJuIHN0cnVjdCBza19idWZmICp3aW1heF9tc2dfYWxsb2Moc3RydWN0IHdpbWF4X2RldiAqLCBjb25zdCBjaGFyICosCisJCQkJICAgICAgIGNvbnN0IHZvaWQgKiwgc2l6ZV90LCBnZnBfdCk7CitleHRlcm4gaW50IHdpbWF4X21zZ19zZW5kKHN0cnVjdCB3aW1heF9kZXYgKiwgc3RydWN0IHNrX2J1ZmYgKik7CitleHRlcm4gaW50IHdpbWF4X21zZyhzdHJ1Y3Qgd2ltYXhfZGV2ICosIGNvbnN0IGNoYXIgKiwKKwkJICAgICBjb25zdCB2b2lkICosIHNpemVfdCwgZ2ZwX3QpOworCitleHRlcm4gY29uc3Qgdm9pZCAqd2ltYXhfbXNnX2RhdGFfbGVuKHN0cnVjdCBza19idWZmICosIHNpemVfdCAqKTsKK2V4dGVybiBjb25zdCB2b2lkICp3aW1heF9tc2dfZGF0YShzdHJ1Y3Qgc2tfYnVmZiAqKTsKK2V4dGVybiBzc2l6ZV90IHdpbWF4X21zZ19sZW4oc3RydWN0IHNrX2J1ZmYgKik7CisKKworLyoKKyAqIFdpTUFYIHN0YWNrIHVzZXIgc3BhY2UgQVBJCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIFRoaXMgQVBJIGlzIHdoYXQgZ2V0cyBleHBvcnRlZCB0byB1c2VyIHNwYWNlIGZvciBnZW5lcmFsCisgKiBvcGVyYXRpb25zLiBBcyB3ZWxsLCB0aGV5IGNhbiBiZSBjYWxsZWQgZnJvbSB3aXRoaW4gdGhlIGtlcm5lbCwKKyAqICh3aXRoIGEgcHJvcGVybHkgcmVmZXJlbmNlZCBgc3RydWN0IHdpbWF4X2RldmApLgorICoKKyAqIFByb3Blcmx5IHJlZmVyZW5jZWQgbWVhbnM6IHRoZSAnc3RydWN0IG5ldF9kZXZpY2UnIHRoYXQgZW1iZWRzIHRoZQorICogZGV2aWNlJ3MgY29udHJvbCBzdHJ1Y3R1cmUgYW5kIChhcyBzdWNoKSB0aGUgJ3N0cnVjdCB3aW1heF9kZXYnIGlzCisgKiByZWZlcmVuY2VkIGJ5IHRoZSBjYWxsZXIuCisgKi8KK2V4dGVybiBpbnQgd2ltYXhfcmZraWxsKHN0cnVjdCB3aW1heF9kZXYgKiwgZW51bSB3aW1heF9yZl9zdGF0ZSk7CitleHRlcm4gaW50IHdpbWF4X3Jlc2V0KHN0cnVjdCB3aW1heF9kZXYgKik7CisKKyNlbHNlCisvKiBZb3UgbWlnaHQgYmUgbG9va2luZyBmb3IgbGludXgvd2ltYXguaCAqLworI2Vycm9yIFRoaXMgZmlsZSBzaG91bGQgbm90IGJlIGluY2x1ZGVkIGZyb20gdXNlciBzcGFjZS4KKyNlbmRpZiAvKiAjaWZkZWYgX19LRVJORUxfXyAqLworI2VuZGlmIC8qICNpZm5kZWYgX19ORVRfX1dJTUFYX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zY3NpL3Njc2lfdHJhbnNwb3J0X2ZjLmggYi9pbmNsdWRlL3Njc2kvc2NzaV90cmFuc3BvcnRfZmMuaAppbmRleCA2ZTA0ZTZmLi5jOTE4NGY3IDEwMDY0NAotLS0gYS9pbmNsdWRlL3Njc2kvc2NzaV90cmFuc3BvcnRfZmMuaAorKysgYi9pbmNsdWRlL3Njc2kvc2NzaV90cmFuc3BvcnRfZmMuaApAQCAtMzU4LDYgKzM1OCw3IEBACiAjZGVmaW5lIEZDX1JQT1JUX0RFVkxPU1NfUEVORElORwkweDAxCiAjZGVmaW5lIEZDX1JQT1JUX1NDQU5fUEVORElORwkJMHgwMgogI2RlZmluZSBGQ19SUE9SVF9GQVNUX0ZBSUxfVElNRURPVVQJMHgwNAorI2RlZmluZSBGQ19SUE9SVF9ERVZMT1NTX0NBTExCS19ET05FCTB4MDgKIAogI2RlZmluZQlkZXZfdG9fcnBvcnQoZCkJCQkJXAogCWNvbnRhaW5lcl9vZihkLCBzdHJ1Y3QgZmNfcnBvcnQsIGRldikKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc291bmQvc29jLWRhcG0uaCBiL2luY2x1ZGUvc291bmQvc29jLWRhcG0uaAppbmRleCA3ZWUyZjcwLi40YWYxMDgzIDEwMDY0NAotLS0gYS9pbmNsdWRlL3NvdW5kL3NvYy1kYXBtLmgKKysrIGIvaW5jbHVkZS9zb3VuZC9zb2MtZGFwbS5oCkBAIC04NSw2ICs4NSwxMCBAQAogI2RlZmluZSBTTkRfU09DX0RBUE1fTVVYKHduYW1lLCB3cmVnLCB3c2hpZnQsIHdpbnZlcnQsIHdjb250cm9scykgXAogewkuaWQgPSBzbmRfc29jX2RhcG1fbXV4LCAubmFtZSA9IHduYW1lLCAucmVnID0gd3JlZywgLnNoaWZ0ID0gd3NoaWZ0LCBcCiAJLmludmVydCA9IHdpbnZlcnQsIC5rY29udHJvbHMgPSB3Y29udHJvbHMsIC5udW1fa2NvbnRyb2xzID0gMX0KKyNkZWZpbmUgU05EX1NPQ19EQVBNX1ZBTFVFX01VWCh3bmFtZSwgd3JlZywgd3NoaWZ0LCB3aW52ZXJ0LCB3Y29udHJvbHMpIFwKK3sJLmlkID0gc25kX3NvY19kYXBtX3ZhbHVlX211eCwgLm5hbWUgPSB3bmFtZSwgLnJlZyA9IHdyZWcsIFwKKwkuc2hpZnQgPSB3c2hpZnQsIC5pbnZlcnQgPSB3aW52ZXJ0LCAua2NvbnRyb2xzID0gd2NvbnRyb2xzLCBcCisJLm51bV9rY29udHJvbHMgPSAxfQogCiAvKiBwYXRoIGRvbWFpbiB3aXRoIGV2ZW50IC0gZXZlbnQgaGFuZGxlciBtdXN0IHJldHVybiAwIGZvciBzdWNjZXNzICovCiAjZGVmaW5lIFNORF9TT0NfREFQTV9QR0FfRSh3bmFtZSwgd3JlZywgd3NoaWZ0LCB3aW52ZXJ0LCB3Y29udHJvbHMsIFwKQEAgLTE3Miw2ICsxNzYsMTIgQEAKICAJLmdldCA9IHNuZF9zb2NfZGFwbV9nZXRfZW51bV9kb3VibGUsIFwKICAJLnB1dCA9IHNuZF9zb2NfZGFwbV9wdXRfZW51bV9kb3VibGUsIFwKICAgCS5wcml2YXRlX3ZhbHVlID0gKHVuc2lnbmVkIGxvbmcpJnhlbnVtIH0KKyNkZWZpbmUgU09DX0RBUE1fVkFMVUVfRU5VTSh4bmFtZSwgeGVudW0pIFwKK3sJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsIC5uYW1lID0geG5hbWUsIFwKKwkuaW5mbyA9IHNuZF9zb2NfaW5mb192YWx1ZV9lbnVtX2RvdWJsZSwgXAorCS5nZXQgPSBzbmRfc29jX2RhcG1fZ2V0X3ZhbHVlX2VudW1fZG91YmxlLCBcCisJLnB1dCA9IHNuZF9zb2NfZGFwbV9wdXRfdmFsdWVfZW51bV9kb3VibGUsIFwKKwkucHJpdmF0ZV92YWx1ZSA9ICh1bnNpZ25lZCBsb25nKSZ4ZW51bSB9CiAKIC8qIGRhcG0gc3RyZWFtIG9wZXJhdGlvbnMgKi8KICNkZWZpbmUgU05EX1NPQ19EQVBNX1NUUkVBTV9OT1AJCQkweDAKQEAgLTIxNCw2ICsyMjQsMTAgQEAKIAlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCk7CiBpbnQgc25kX3NvY19kYXBtX3B1dF9lbnVtX2RvdWJsZShzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKIAlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCk7CitpbnQgc25kX3NvY19kYXBtX2dldF92YWx1ZV9lbnVtX2RvdWJsZShzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCk7CitpbnQgc25kX3NvY19kYXBtX3B1dF92YWx1ZV9lbnVtX2RvdWJsZShzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCk7CiBpbnQgc25kX3NvY19kYXBtX25ld19jb250cm9sKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKIAljb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqd2lkZ2V0KTsKIGludCBzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKQEAgLTI0Nyw2ICsyNjEsNyBAQAogCXNuZF9zb2NfZGFwbV9pbnB1dCA9IDAsCQkvKiBpbnB1dCBwaW4gKi8KIAlzbmRfc29jX2RhcG1fb3V0cHV0LAkJLyogb3V0cHV0IHBpbiAqLwogCXNuZF9zb2NfZGFwbV9tdXgsCQkJLyogc2VsZWN0cyAxIGFuYWxvZyBzaWduYWwgZnJvbSBtYW55IGlucHV0cyAqLworCXNuZF9zb2NfZGFwbV92YWx1ZV9tdXgsCQkJLyogc2VsZWN0cyAxIGFuYWxvZyBzaWduYWwgZnJvbSBtYW55IGlucHV0cyAqLwogCXNuZF9zb2NfZGFwbV9taXhlciwJCQkvKiBtaXhlcyBzZXZlcmFsIGFuYWxvZyBzaWduYWxzIHRvZ2V0aGVyICovCiAJc25kX3NvY19kYXBtX3BnYSwJCQkvKiBwcm9ncmFtbWFibGUgZ2Fpbi9hdHRlbnVhdGlvbiAodm9sdW1lKSAqLwogCXNuZF9zb2NfZGFwbV9hZGMsCQkJLyogYW5hbG9nIHRvIGRpZ2l0YWwgY29udmVydGVyICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3NvdW5kL3NvYy5oIGIvaW5jbHVkZS9zb3VuZC9zb2MuaAppbmRleCBmODZlNDU1Li45YjkzMGQzIDEwMDY0NAotLS0gYS9pbmNsdWRlL3NvdW5kL3NvYy5oCisrKyBiL2luY2x1ZGUvc291bmQvc29jLmgKQEAgLTk0LDExICs5NCwyMiBAQAogCVNPQ19FTlVNX0RPVUJMRSh4cmVnLCB4c2hpZnQsIHhzaGlmdCwgeG1heCwgeHRleHRzKQogI2RlZmluZSBTT0NfRU5VTV9TSU5HTEVfRVhUKHhtYXgsIHh0ZXh0cykgXAogewkubWF4ID0geG1heCwgLnRleHRzID0geHRleHRzIH0KKyNkZWZpbmUgU09DX1ZBTFVFX0VOVU1fRE9VQkxFKHhyZWcsIHhzaGlmdF9sLCB4c2hpZnRfciwgeG1hc2ssIHhtYXgsIHh0ZXh0cywgeHZhbHVlcykgXAorewkucmVnID0geHJlZywgLnNoaWZ0X2wgPSB4c2hpZnRfbCwgLnNoaWZ0X3IgPSB4c2hpZnRfciwgXAorCS5tYXNrID0geG1hc2ssIC5tYXggPSB4bWF4LCAudGV4dHMgPSB4dGV4dHMsIC52YWx1ZXMgPSB4dmFsdWVzfQorI2RlZmluZSBTT0NfVkFMVUVfRU5VTV9TSU5HTEUoeHJlZywgeHNoaWZ0LCB4bWFzaywgeG1heCwgeHRleHRzLCB4dmFsdWVzKSBcCisJU09DX1ZBTFVFX0VOVU1fRE9VQkxFKHhyZWcsIHhzaGlmdCwgeHNoaWZ0LCB4bWFzaywgeG1heCwgeHRleHRzLCB4dmFsdWVzKQogI2RlZmluZSBTT0NfRU5VTSh4bmFtZSwgeGVudW0pIFwKIHsJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsIC5uYW1lID0geG5hbWUsXAogCS5pbmZvID0gc25kX3NvY19pbmZvX2VudW1fZG91YmxlLCBcCiAJLmdldCA9IHNuZF9zb2NfZ2V0X2VudW1fZG91YmxlLCAucHV0ID0gc25kX3NvY19wdXRfZW51bV9kb3VibGUsIFwKIAkucHJpdmF0ZV92YWx1ZSA9ICh1bnNpZ25lZCBsb25nKSZ4ZW51bSB9CisjZGVmaW5lIFNPQ19WQUxVRV9FTlVNKHhuYW1lLCB4ZW51bSkgXAorewkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwgLm5hbWUgPSB4bmFtZSxcCisJLmluZm8gPSBzbmRfc29jX2luZm9fdmFsdWVfZW51bV9kb3VibGUsIFwKKwkuZ2V0ID0gc25kX3NvY19nZXRfdmFsdWVfZW51bV9kb3VibGUsIFwKKwkucHV0ID0gc25kX3NvY19wdXRfdmFsdWVfZW51bV9kb3VibGUsIFwKKwkucHJpdmF0ZV92YWx1ZSA9ICh1bnNpZ25lZCBsb25nKSZ4ZW51bSB9CiAjZGVmaW5lIFNPQ19TSU5HTEVfRVhUKHhuYW1lLCB4cmVnLCB4c2hpZnQsIHhtYXgsIHhpbnZlcnQsXAogCSB4aGFuZGxlcl9nZXQsIHhoYW5kbGVyX3B1dCkgXAogewkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwgLm5hbWUgPSB4bmFtZSwgXApAQCAtMjAwLDYgKzIxMSwxMiBAQAogCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKTsKIGludCBzbmRfc29jX3B1dF9lbnVtX2RvdWJsZShzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKIAlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCk7CitpbnQgc25kX3NvY19pbmZvX3ZhbHVlX2VudW1fZG91YmxlKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCXN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyAqdWluZm8pOworaW50IHNuZF9zb2NfZ2V0X3ZhbHVlX2VudW1fZG91YmxlKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKTsKK2ludCBzbmRfc29jX3B1dF92YWx1ZV9lbnVtX2RvdWJsZShzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCk7CiBpbnQgc25kX3NvY19pbmZvX3ZvbHN3KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAogCXN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyAqdWluZm8pOwogaW50IHNuZF9zb2NfaW5mb192b2xzd19leHQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCkBAIC00MDYsNiArNDIzLDE5IEBACiAJdm9pZCAqZGFwbTsKIH07CiAKKy8qIHNlbWkgZW51bWVyYXRlZCBrY29udHJvbCAqLworc3RydWN0IHNvY192YWx1ZV9lbnVtIHsKKwl1bnNpZ25lZCBzaG9ydCByZWc7CisJdW5zaWduZWQgc2hvcnQgcmVnMjsKKwl1bnNpZ25lZCBjaGFyIHNoaWZ0X2w7CisJdW5zaWduZWQgY2hhciBzaGlmdF9yOworCXVuc2lnbmVkIGludCBtYXg7CisJdW5zaWduZWQgaW50IG1hc2s7CisJY29uc3QgY2hhciAqKnRleHRzOworCWNvbnN0IHVuc2lnbmVkIGludCAqdmFsdWVzOworCXZvaWQgKmRhcG07Cit9OworCiAjaW5jbHVkZSA8c291bmQvc29jLWRhaS5oPgogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUveGVuL3hlbmJ1cy5oIGIvaW5jbHVkZS94ZW4veGVuYnVzLmgKaW5kZXggNjM2OWQ4OS4uZjg3Zjk2MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS94ZW4veGVuYnVzLmgKKysrIGIvaW5jbHVkZS94ZW4veGVuYnVzLmgKQEAgLTEzNiw4ICsxMzYsNiBAQAogLyogTmlsIHRyYW5zYWN0aW9uIElELiAqLwogI2RlZmluZSBYQlRfTklMICgoc3RydWN0IHhlbmJ1c190cmFuc2FjdGlvbikgeyAwIH0pCiAKLWludCBfX2luaXQgeGVuYnVzX2Rldl9pbml0KHZvaWQpOwotCiBjaGFyICoqeGVuYnVzX2RpcmVjdG9yeShzdHJ1Y3QgeGVuYnVzX3RyYW5zYWN0aW9uIHQsCiAJCQljb25zdCBjaGFyICpkaXIsIGNvbnN0IGNoYXIgKm5vZGUsIHVuc2lnbmVkIGludCAqbnVtKTsKIHZvaWQgKnhlbmJ1c19yZWFkKHN0cnVjdCB4ZW5idXNfdHJhbnNhY3Rpb24gdCwKZGlmZiAtLWdpdCBhL2luaXQvS2NvbmZpZyBiL2luaXQvS2NvbmZpZwppbmRleCBmNjI4MTcxLi5hNzI0YTE0IDEwMDY0NAotLS0gYS9pbml0L0tjb25maWcKKysrIGIvaW5pdC9LY29uZmlnCkBAIC0yNzEsMTEgKzI3MSw3NSBAQAogCQkgICAgIDEzID0+ICA4IEtCCiAJCSAgICAgMTIgPT4gIDQgS0IKIAorIworIyBBcmNoaXRlY3R1cmVzIHdpdGggYW4gdW5yZWxpYWJsZSBzY2hlZF9jbG9jaygpIHNob3VsZCBzZWxlY3QgdGhpczoKKyMKK2NvbmZpZyBIQVZFX1VOU1RBQkxFX1NDSEVEX0NMT0NLCisJYm9vbAorCitjb25maWcgR1JPVVBfU0NIRUQKKwlib29sICJHcm91cCBDUFUgc2NoZWR1bGVyIgorCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMCisJZGVmYXVsdCBuCisJaGVscAorCSAgVGhpcyBmZWF0dXJlIGxldHMgQ1BVIHNjaGVkdWxlciByZWNvZ25pemUgdGFzayBncm91cHMgYW5kIGNvbnRyb2wgQ1BVCisJICBiYW5kd2lkdGggYWxsb2NhdGlvbiB0byBzdWNoIHRhc2sgZ3JvdXBzLgorCSAgSW4gb3JkZXIgdG8gY3JlYXRlIGEgZ3JvdXAgZnJvbSBhcmJpdHJhcnkgc2V0IG9mIHByb2Nlc3NlcywgdXNlCisJICBDT05GSUdfQ0dST1VQUy4gKFNlZSBDb250cm9sIEdyb3VwIHN1cHBvcnQuKQorCitjb25maWcgRkFJUl9HUk9VUF9TQ0hFRAorCWJvb2wgIkdyb3VwIHNjaGVkdWxpbmcgZm9yIFNDSEVEX09USEVSIgorCWRlcGVuZHMgb24gR1JPVVBfU0NIRUQKKwlkZWZhdWx0IEdST1VQX1NDSEVECisKK2NvbmZpZyBSVF9HUk9VUF9TQ0hFRAorCWJvb2wgIkdyb3VwIHNjaGVkdWxpbmcgZm9yIFNDSEVEX1JSL0ZJRk8iCisJZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwKKwlkZXBlbmRzIG9uIEdST1VQX1NDSEVECisJZGVmYXVsdCBuCisJaGVscAorCSAgVGhpcyBmZWF0dXJlIGxldHMgeW91IGV4cGxpY2l0bHkgYWxsb2NhdGUgcmVhbCBDUFUgYmFuZHdpZHRoCisJICB0byB1c2VycyBvciBjb250cm9sIGdyb3VwcyAoZGVwZW5kaW5nIG9uIHRoZSAiQmFzaXMgZm9yIGdyb3VwaW5nIHRhc2tzIgorCSAgc2V0dGluZyBiZWxvdy4gSWYgZW5hYmxlZCwgaXQgd2lsbCBhbHNvIG1ha2UgaXQgaW1wb3NzaWJsZSB0bworCSAgc2NoZWR1bGUgcmVhbHRpbWUgdGFza3MgZm9yIG5vbi1yb290IHVzZXJzIHVudGlsIHlvdSBhbGxvY2F0ZQorCSAgcmVhbHRpbWUgYmFuZHdpZHRoIGZvciB0aGVtLgorCSAgU2VlIERvY3VtZW50YXRpb24vc2NoZWR1bGVyL3NjaGVkLXJ0LWdyb3VwLnR4dCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKworY2hvaWNlCisJZGVwZW5kcyBvbiBHUk9VUF9TQ0hFRAorCXByb21wdCAiQmFzaXMgZm9yIGdyb3VwaW5nIHRhc2tzIgorCWRlZmF1bHQgVVNFUl9TQ0hFRAorCitjb25maWcgVVNFUl9TQ0hFRAorCWJvb2wgInVzZXIgaWQiCisJaGVscAorCSAgVGhpcyBvcHRpb24gd2lsbCBjaG9vc2UgdXNlcmlkIGFzIHRoZSBiYXNpcyBmb3IgZ3JvdXBpbmcKKwkgIHRhc2tzLCB0aHVzIHByb3ZpZGluZyBlcXVhbCBDUFUgYmFuZHdpZHRoIHRvIGVhY2ggdXNlci4KKworY29uZmlnIENHUk9VUF9TQ0hFRAorCWJvb2wgIkNvbnRyb2wgZ3JvdXBzIgorIAlkZXBlbmRzIG9uIENHUk9VUFMKKyAJaGVscAorCSAgVGhpcyBvcHRpb24gYWxsb3dzIHlvdSB0byBjcmVhdGUgYXJiaXRyYXJ5IHRhc2sgZ3JvdXBzCisJICB1c2luZyB0aGUgImNncm91cCIgcHNldWRvIGZpbGVzeXN0ZW0gYW5kIGNvbnRyb2wKKwkgIHRoZSBjcHUgYmFuZHdpZHRoIGFsbG9jYXRlZCB0byBlYWNoIHN1Y2ggdGFzayBncm91cC4KKwkgIFJlZmVyIHRvIERvY3VtZW50YXRpb24vY2dyb3Vwcy50eHQgZm9yIG1vcmUgaW5mb3JtYXRpb24KKwkgIG9uICJjZ3JvdXAiIHBzZXVkbyBmaWxlc3lzdGVtLgorCitlbmRjaG9pY2UKKworbWVudSAiQ29udHJvbCBHcm91cCBzdXBwb3J0IgogY29uZmlnIENHUk9VUFMKIAlib29sICJDb250cm9sIEdyb3VwIHN1cHBvcnQiCiAJaGVscAotCSAgVGhpcyBvcHRpb24gd2lsbCBsZXQgeW91IHVzZSBwcm9jZXNzIGNncm91cCBzdWJzeXN0ZW1zCi0JICBzdWNoIGFzIENwdXNldHMKKwkgIFRoaXMgb3B0aW9uIGFkZCBzdXBwb3J0IGZvciBncm91cGluZyBzZXRzIG9mIHByb2Nlc3NlcyB0b2dldGhlciwgZm9yCisJICB1c2Ugd2l0aCBwcm9jZXNzIGNvbnRyb2wgc3Vic3lzdGVtcyBzdWNoIGFzIENwdXNldHMsIENGUywgbWVtb3J5CisJICBjb250cm9scyBvciBkZXZpY2UgaXNvbGF0aW9uLgorCSAgU2VlCisJCS0gRG9jdW1lbnRhdGlvbi9jcHVzZXRzLnR4dAkoQ3B1c2V0cykKKwkJLSBEb2N1bWVudGF0aW9uL3NjaGVkdWxlci9zY2hlZC1kZXNpZ24tQ0ZTLnR4dAkoQ0ZTKQorCQktIERvY3VtZW50YXRpb24vY2dyb3Vwcy8gKGZlYXR1cmVzIGZvciBncm91cGluZywgaXNvbGF0aW9uKQorCQktIERvY3VtZW50YXRpb24vY29udHJvbGxlcnMvIChmZWF0dXJlcyBmb3IgcmVzb3VyY2UgY29udHJvbCkKIAogCSAgU2F5IE4gaWYgdW5zdXJlLgogCkBAIC0zMjQsNjEgKzM4OCw2IEBACiAKIAkgIFNheSBOIGlmIHVuc3VyZS4KIAotIwotIyBBcmNoaXRlY3R1cmVzIHdpdGggYW4gdW5yZWxpYWJsZSBzY2hlZF9jbG9jaygpIHNob3VsZCBzZWxlY3QgdGhpczoKLSMKLWNvbmZpZyBIQVZFX1VOU1RBQkxFX1NDSEVEX0NMT0NLCi0JYm9vbAotCi1jb25maWcgR1JPVVBfU0NIRUQKLQlib29sICJHcm91cCBDUFUgc2NoZWR1bGVyIgotCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMCi0JZGVmYXVsdCBuCi0JaGVscAotCSAgVGhpcyBmZWF0dXJlIGxldHMgQ1BVIHNjaGVkdWxlciByZWNvZ25pemUgdGFzayBncm91cHMgYW5kIGNvbnRyb2wgQ1BVCi0JICBiYW5kd2lkdGggYWxsb2NhdGlvbiB0byBzdWNoIHRhc2sgZ3JvdXBzLgotCi1jb25maWcgRkFJUl9HUk9VUF9TQ0hFRAotCWJvb2wgIkdyb3VwIHNjaGVkdWxpbmcgZm9yIFNDSEVEX09USEVSIgotCWRlcGVuZHMgb24gR1JPVVBfU0NIRUQKLQlkZWZhdWx0IEdST1VQX1NDSEVECi0KLWNvbmZpZyBSVF9HUk9VUF9TQ0hFRAotCWJvb2wgIkdyb3VwIHNjaGVkdWxpbmcgZm9yIFNDSEVEX1JSL0ZJRk8iCi0JZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwKLQlkZXBlbmRzIG9uIEdST1VQX1NDSEVECi0JZGVmYXVsdCBuCi0JaGVscAotCSAgVGhpcyBmZWF0dXJlIGxldHMgeW91IGV4cGxpY2l0bHkgYWxsb2NhdGUgcmVhbCBDUFUgYmFuZHdpZHRoCi0JICB0byB1c2VycyBvciBjb250cm9sIGdyb3VwcyAoZGVwZW5kaW5nIG9uIHRoZSAiQmFzaXMgZm9yIGdyb3VwaW5nIHRhc2tzIgotCSAgc2V0dGluZyBiZWxvdy4gSWYgZW5hYmxlZCwgaXQgd2lsbCBhbHNvIG1ha2UgaXQgaW1wb3NzaWJsZSB0bwotCSAgc2NoZWR1bGUgcmVhbHRpbWUgdGFza3MgZm9yIG5vbi1yb290IHVzZXJzIHVudGlsIHlvdSBhbGxvY2F0ZQotCSAgcmVhbHRpbWUgYmFuZHdpZHRoIGZvciB0aGVtLgotCSAgU2VlIERvY3VtZW50YXRpb24vc2NoZWR1bGVyL3NjaGVkLXJ0LWdyb3VwLnR4dCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLQotY2hvaWNlCi0JZGVwZW5kcyBvbiBHUk9VUF9TQ0hFRAotCXByb21wdCAiQmFzaXMgZm9yIGdyb3VwaW5nIHRhc2tzIgotCWRlZmF1bHQgVVNFUl9TQ0hFRAotCi1jb25maWcgVVNFUl9TQ0hFRAotCWJvb2wgInVzZXIgaWQiCi0JaGVscAotCSAgVGhpcyBvcHRpb24gd2lsbCBjaG9vc2UgdXNlcmlkIGFzIHRoZSBiYXNpcyBmb3IgZ3JvdXBpbmcKLQkgIHRhc2tzLCB0aHVzIHByb3ZpZGluZyBlcXVhbCBDUFUgYmFuZHdpZHRoIHRvIGVhY2ggdXNlci4KLQotY29uZmlnIENHUk9VUF9TQ0hFRAotCWJvb2wgIkNvbnRyb2wgZ3JvdXBzIgotIAlkZXBlbmRzIG9uIENHUk9VUFMKLSAJaGVscAotCSAgVGhpcyBvcHRpb24gYWxsb3dzIHlvdSB0byBjcmVhdGUgYXJiaXRyYXJ5IHRhc2sgZ3JvdXBzCi0JICB1c2luZyB0aGUgImNncm91cCIgcHNldWRvIGZpbGVzeXN0ZW0gYW5kIGNvbnRyb2wKLQkgIHRoZSBjcHUgYmFuZHdpZHRoIGFsbG9jYXRlZCB0byBlYWNoIHN1Y2ggdGFzayBncm91cC4KLQkgIFJlZmVyIHRvIERvY3VtZW50YXRpb24vY2dyb3Vwcy50eHQgZm9yIG1vcmUgaW5mb3JtYXRpb24KLQkgIG9uICJjZ3JvdXAiIHBzZXVkbyBmaWxlc3lzdGVtLgotCi1lbmRjaG9pY2UKLQogY29uZmlnIENHUk9VUF9DUFVBQ0NUCiAJYm9vbCAiU2ltcGxlIENQVSBhY2NvdW50aW5nIGNncm91cCBzdWJzeXN0ZW0iCiAJZGVwZW5kcyBvbiBDR1JPVVBTCkBAIC0zOTMsOSArNDAyLDYgQEAKICAgICAgICAgICBpbmZyYXN0cnVjdHVyZSB0aGF0IHdvcmtzIHdpdGggY2dyb3VwcwogCWRlcGVuZHMgb24gQ0dST1VQUwogCi1jb25maWcgTU1fT1dORVIKLQlib29sCi0KIGNvbmZpZyBDR1JPVVBfTUVNX1JFU19DVExSCiAJYm9vbCAiTWVtb3J5IFJlc291cmNlIENvbnRyb2xsZXIgZm9yIENvbnRyb2wgR3JvdXBzIgogCWRlcGVuZHMgb24gQ0dST1VQUyAmJiBSRVNPVVJDRV9DT1VOVEVSUwpAQCAtNDE0LDM2ICs0MjAsNjggQEAKIAkgIHN1cmUgeW91IG5lZWQgdGhlIG1lbW9yeSByZXNvdXJjZSBjb250cm9sbGVyLiBFdmVuIHdoZW4geW91IGVuYWJsZQogCSAgdGhpcywgeW91IGNhbiBzZXQgImNncm91cF9kaXNhYmxlPW1lbW9yeSIgYXQgeW91ciBib290IG9wdGlvbiB0bwogCSAgZGlzYWJsZSBtZW1vcnkgcmVzb3VyY2UgY29udHJvbGxlciBhbmQgeW91IGNhbiBhdm9pZCBvdmVyaGVhZHMuCi0JICAoYW5kIGxvc2UgYmVuZWZpdHMgb2YgbWVtb3J5IHJlc291cmNlIGNvbnRvbGxlcikKKwkgIChhbmQgbG9zZSBiZW5lZml0cyBvZiBtZW1vcnkgcmVzb3VyY2UgY29udHJvbGxlcikKIAogCSAgVGhpcyBjb25maWcgb3B0aW9uIGFsc28gc2VsZWN0cyBNTV9PV05FUiBjb25maWcgb3B0aW9uLCB3aGljaAogCSAgY291bGQgaW4gdHVybiBhZGQgc29tZSBmb3JrL2V4aXQgb3ZlcmhlYWQuCiAKK2NvbmZpZyBNTV9PV05FUgorCWJvb2wKKworY29uZmlnIENHUk9VUF9NRU1fUkVTX0NUTFJfU1dBUAorCWJvb2wgIk1lbW9yeSBSZXNvdXJjZSBDb250cm9sbGVyIFN3YXAgRXh0ZW5zaW9uKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBDR1JPVVBfTUVNX1JFU19DVExSICYmIFNXQVAgJiYgRVhQRVJJTUVOVEFMCisJaGVscAorCSAgQWRkIHN3YXAgbWFuYWdlbWVudCBmZWF0dXJlIHRvIG1lbW9yeSByZXNvdXJjZSBjb250cm9sbGVyLiBXaGVuIHlvdQorCSAgZW5hYmxlIHRoaXMsIHlvdSBjYW4gbGltaXQgbWVtK3N3YXAgdXNhZ2UgcGVyIGNncm91cC4gSW4gb3RoZXIgd29yZHMsCisJICB3aGVuIHlvdSBkaXNhYmxlIHRoaXMsIG1lbW9yeSByZXNvdXJjZSBjb250cm9sbGVyIGhhcyBubyBjYXJlcyB0bworCSAgdXNhZ2Ugb2Ygc3dhcC4uLmEgcHJvY2VzcyBjYW4gZXhoYXVzdCBhbGwgb2YgdGhlIHN3YXAuIFRoaXMgZXh0ZW5zaW9uCisJICBpcyB1c2VmdWwgd2hlbiB5b3Ugd2FudCB0byBhdm9pZCBleGhhdXN0aW9uIHN3YXAgYnV0IHRoaXMgaXRzZWxmCisJICBhZGRzIG1vcmUgb3ZlcmhlYWRzIGFuZCBjb25zdW1lcyBtZW1vcnkgZm9yIHJlbWVtYmVyaW5nIGluZm9ybWF0aW9uLgorCSAgRXNwZWNpYWxseSBpZiB5b3UgdXNlIDMyYml0IHN5c3RlbSBvciBzbWFsbCBtZW1vcnkgc3lzdGVtLCBwbGVhc2UKKwkgIGJlIGNhcmVmdWwgYWJvdXQgZW5hYmxpbmcgdGhpcy4gV2hlbiBtZW1vcnkgcmVzb3VyY2UgY29udHJvbGxlcgorCSAgaXMgZGlzYWJsZWQgYnkgYm9vdCBvcHRpb24sIHRoaXMgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGRpc2FibGVkIGFuZAorCSAgdGhlcmUgd2lsbCBiZSBubyBvdmVyaGVhZCBmcm9tIHRoaXMuIEV2ZW4gd2hlbiB5b3Ugc2V0IHRoaXMgY29uZmlnPXksCisJICBpZiBib290IG9wdGlvbiAibm9zd2FwYWNjb3VudCIgaXMgc2V0LCBzd2FwIHdpbGwgbm90IGJlIGFjY291bnRlZC4KKworCitlbmRtZW51CisKIGNvbmZpZyBTWVNGU19ERVBSRUNBVEVECiAJYm9vbAogCiBjb25maWcgU1lTRlNfREVQUkVDQVRFRF9WMgotCWJvb2wgIkNyZWF0ZSBkZXByZWNhdGVkIHN5c2ZzIGZpbGVzIgorCWJvb2wgIkNyZWF0ZSBkZXByZWNhdGVkIHN5c2ZzIGxheW91dCBmb3Igb2xkZXIgdXNlcnNwYWNlIHRvb2xzIgogCWRlcGVuZHMgb24gU1lTRlMKIAlkZWZhdWx0IHkKIAlzZWxlY3QgU1lTRlNfREVQUkVDQVRFRAogCWhlbHAKLQkgIFRoaXMgb3B0aW9uIGNyZWF0ZXMgZGVwcmVjYXRlZCBzeW1saW5rcyBzdWNoIGFzIHRoZQotCSAgImRldmljZSItbGluaywgdGhlIDxzdWJzeXN0ZW0+OjxuYW1lPi1saW5rLCBhbmQgdGhlCi0JICAiYnVzIi1saW5rLiBJdCBtYXkgYWxzbyBhZGQgZGVwcmVjYXRlZCBrZXkgaW4gdGhlCi0JICB1ZXZlbnQgZW52aXJvbm1lbnQuCi0JICBOb25lIG9mIHRoZXNlIGZlYXR1cmVzIG9yIHZhbHVlcyBzaG91bGQgYmUgdXNlZCB0b2RheSwgYXMKLQkgIHRoZXkgZXhwb3J0IGRyaXZlciBjb3JlIGltcGxlbWVudGF0aW9uIGRldGFpbHMgdG8gdXNlcnNwYWNlCi0JICBvciBleHBvcnQgcHJvcGVydGllcyB3aGljaCBjYW4ndCBiZSBrZXB0IHN0YWJsZSBhY3Jvc3Mga2VybmVsCi0JICByZWxlYXNlcy4KKwkgIFRoaXMgb3B0aW9uIHN3aXRjaGVzIHRoZSBsYXlvdXQgb2Ygc3lzZnMgdG8gdGhlIGRlcHJlY2F0ZWQKKwkgIHZlcnNpb24uCiAKLQkgIElmIGVuYWJsZWQsIHRoaXMgb3B0aW9uIHdpbGwgYWxzbyBtb3ZlIGFueSBkZXZpY2Ugc3RydWN0dXJlcwotCSAgdGhhdCBiZWxvbmcgdG8gYSBjbGFzcywgYmFjayBpbnRvIHRoZSAvc3lzL2NsYXNzIGhpZXJhcmNoeSwgaW4KLQkgIG9yZGVyIHRvIHN1cHBvcnQgb2xkZXIgdmVyc2lvbnMgb2YgdWRldiBhbmQgc29tZSB1c2Vyc3BhY2UKLQkgIHByb2dyYW1zLgorCSAgVGhlIGN1cnJlbnQgc3lzZnMgbGF5b3V0IGZlYXR1cmVzIGEgdW5pZmllZCBkZXZpY2UgdHJlZSBhdAorCSAgL3N5cy9kZXZpY2VzLywgd2hpY2ggaXMgYWJsZSB0byBleHByZXNzIGEgaGllcmFyY2h5IGJldHdlZW4KKwkgIGNsYXNzIGRldmljZXMuIElmIHRoZSBkZXByZWNhdGVkIG9wdGlvbiBpcyBzZXQgdG8gWSwgdGhlCisJICB1bmlmaWVkIGRldmljZSB0cmVlIGlzIHNwbGl0IGludG8gYSBidXMgZGV2aWNlIHRyZWUgYXQKKwkgIC9zeXMvZGV2aWNlcy8gYW5kIHNldmVyYWwgaW5kaXZpZHVhbCBjbGFzcyBkZXZpY2UgdHJlZXMgYXQKKwkgIC9zeXMvY2xhc3MvLiBUaGUgY2xhc3MgYW5kIGJ1cyBkZXZpY2VzIHdpbGwgYmUgY29ubmVjdGVkIGJ5CisJICAiPHN1YnN5c3RlbT46PG5hbWU+IiBhbmQgdGhlICJkZXZpY2UiIGxpbmtzLiBUaGUgImJsb2NrIgorCSAgY2xhc3MgZGV2aWNlcywgd2lsbCBub3Qgc2hvdyB1cCBpbiAvc3lzL2NsYXNzL2Jsb2NrLy4gU29tZQorCSAgc3Vic3lzdGVtcyB3aWxsIHN1cHByZXNzIHRoZSBjcmVhdGlvbiBvZiBzb21lIGRldmljZXMgd2hpY2gKKwkgIGRlcGVuZCBvbiB0aGUgdW5pZmllZCBkZXZpY2UgdHJlZS4KIAotCSAgSWYgeW91IGFyZSB1c2luZyBhIGRpc3RybyB3aXRoIHRoZSBtb3N0IHJlY2VudCB1c2Vyc3BhY2UKLQkgIHBhY2thZ2VzLCBpdCBzaG91bGQgYmUgc2FmZSB0byBzYXkgTiBoZXJlLgorCSAgVGhpcyBvcHRpb24gaXMgbm90IGEgcHVyZSBjb21wYXRpYmlsaXR5IG9wdGlvbiB0aGF0IGNhbgorCSAgYmUgc2FmZWx5IGVuYWJsZWQgb24gbmV3ZXIgZGlzdHJpYnV0aW9ucy4gSXQgd2lsbCBjaGFuZ2UgdGhlCisJICBsYXlvdXQgb2Ygc3lzZnMgdG8gdGhlIG5vbi1leHRlbnNpYmxlIGRlcHJlY2F0ZWQgdmVyc2lvbiwKKwkgIGFuZCBkaXNhYmxlIHNvbWUgZmVhdHVyZXMsIHdoaWNoIGNhbiBub3QgYmUgZXhwb3J0ZWQgd2l0aG91dAorCSAgY29uZnVzaW5nIG9sZGVyIHVzZXJzcGFjZSB0b29scy4gU2luY2UgMjAwNy8yMDA4IGFsbCBtYWpvcgorCSAgZGlzdHJpYnV0aW9ucyBkbyBub3QgZW5hYmxlIHRoaXMgb3B0aW9uLCBhbmQgc2hpcCBubyB0b29scyB3aGljaAorCSAgZGVwZW5kIG9uIHRoZSBkZXByZWNhdGVkIGxheW91dCBvciB0aGlzIG9wdGlvbi4KKworCSAgSWYgeW91IGFyZSB1c2luZyBhIG5ldyBrZXJuZWwgb24gYW4gb2xkZXIgZGlzdHJpYnV0aW9uLCBvciB1c2UKKwkgIG9sZGVyIHVzZXJzcGFjZSB0b29scywgeW91IG1pZ2h0IG5lZWQgdG8gc2F5IFkgaGVyZS4gRG8gbm90IHNheSBZLAorCSAgaWYgdGhlIG9yaWdpbmFsIGtlcm5lbCwgdGhhdCBjYW1lIHdpdGggeW91ciBkaXN0cmlidXRpb24sIGhhcworCSAgdGhpcyBvcHRpb24gc2V0IHRvIE4uCiAKIGNvbmZpZyBQUk9DX1BJRF9DUFVTRVQKIAlib29sICJJbmNsdWRlIGxlZ2FjeSAvcHJvYy88cGlkPi9jcHVzZXQgZmlsZSIKQEAgLTgzOCwxMCArODc2LDYgQEAKIAlib29sZWFuCiAJc2VsZWN0IFBMSVNUCiAKLWNvbmZpZyBUSU5ZX1NITUVNCi0JZGVmYXVsdCAhU0hNRU0KLQlib29sCi0KIGNvbmZpZyBCQVNFX1NNQUxMCiAJaW50CiAJZGVmYXVsdCAwIGlmIEJBU0VfRlVMTApAQCAtOTE2LDEyICs5NTAsNiBAQAogCSAgdGhlIHZlcnNpb24pLiAgV2l0aCB0aGlzIG9wdGlvbiwgc3VjaCBhICJzcmN2ZXJzaW9uIiBmaWVsZAogCSAgd2lsbCBiZSBjcmVhdGVkIGZvciBhbGwgbW9kdWxlcy4gIElmIHVuc3VyZSwgc2F5IE4uCiAKLWNvbmZpZyBLTU9ECi0JZGVmX2Jvb2wgeQotCWhlbHAKLQkgIFRoaXMgaXMgYmVpbmcgcmVtb3ZlZCBzb29uLiAgVGhlc2UgZGF5cywgQ09ORklHX01PRFVMRVMKLQkgIGltcGxpZXMgQ09ORklHX0tNT0QsIHNvIHVzZSB0aGF0IGluc3RlYWQuCi0KIGVuZGlmICMgTU9EVUxFUwogCiBjb25maWcgSU5JVF9BTExfUE9TU0lCTEUKZGlmZiAtLWdpdCBhL2luaXQvZG9fbW91bnRzLmMgYi9pbml0L2RvX21vdW50cy5jCmluZGV4IGQwNTViMTkuLjcwODEwNWUgMTAwNjQ0Ci0tLSBhL2luaXQvZG9fbW91bnRzLmMKKysrIGIvaW5pdC9kb19tb3VudHMuYwpAQCAtMTMsNiArMTMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXRyZC5oPgorI2luY2x1ZGUgPGxpbnV4L2FzeW5jLmg+CiAKICNpbmNsdWRlIDxsaW51eC9uZnNfZnMuaD4KICNpbmNsdWRlIDxsaW51eC9uZnNfZnNfc2IuaD4KQEAgLTIyMCwxMCArMjIxLDEwIEBACiAKIAlzeXNfY2hkaXIoIi9yb290Iik7CiAJUk9PVF9ERVYgPSBjdXJyZW50LT5mcy0+cHdkLm1udC0+bW50X3NiLT5zX2RldjsKLQlwcmludGsoIlZGUzogTW91bnRlZCByb290ICglcyBmaWxlc3lzdGVtKSVzLlxuIiwKKwlwcmludGsoIlZGUzogTW91bnRlZCByb290ICglcyBmaWxlc3lzdGVtKSVzIG9uIGRldmljZSAldToldS5cbiIsCiAJICAgICAgIGN1cnJlbnQtPmZzLT5wd2QubW50LT5tbnRfc2ItPnNfdHlwZS0+bmFtZSwKIAkgICAgICAgY3VycmVudC0+ZnMtPnB3ZC5tbnQtPm1udF9zYi0+c19mbGFncyAmIE1TX1JET05MWSA/Ci0JICAgICAgICIgcmVhZG9ubHkiIDogIiIpOworCSAgICAgICAiIHJlYWRvbmx5IiA6ICIiLCBNQUpPUihST09UX0RFViksIE1JTk9SKFJPT1RfREVWKSk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTM3Miw2ICszNzMsNyBAQAogCS8qIHdhaXQgZm9yIHRoZSBrbm93biBkZXZpY2VzIHRvIGNvbXBsZXRlIHRoZWlyIHByb2JpbmcgKi8KIAl3aGlsZSAoZHJpdmVyX3Byb2JlX2RvbmUoKSAhPSAwKQogCQltc2xlZXAoMTAwKTsKKwlhc3luY19zeW5jaHJvbml6ZV9mdWxsKCk7CiAKIAltZF9ydW5fc2V0dXAoKTsKIApkaWZmIC0tZ2l0IGEvaW5pdC9kb19tb3VudHNfbWQuYyBiL2luaXQvZG9fbW91bnRzX21kLmMKaW5kZXggZDZkYTVjZC4uZmY5NWUzMSAxMDA2NDQKLS0tIGEvaW5pdC9kb19tb3VudHNfbWQuYworKysgYi9pbml0L2RvX21vdW50c19tZC5jCkBAIC0yNzEsNyArMjcxLDcgQEAKIF9fc2V0dXAoInJhaWQ9IiwgcmFpZF9zZXR1cCk7CiBfX3NldHVwKCJtZD0iLCBtZF9zZXR1cCk7CiAKLXN0YXRpYyB2b2lkIGF1dG9kZXRlY3RfcmFpZCh2b2lkKQorc3RhdGljIHZvaWQgX19pbml0IGF1dG9kZXRlY3RfcmFpZCh2b2lkKQogewogCWludCBmZDsKIApkaWZmIC0tZ2l0IGEvaW5pdC9tYWluLmMgYi9pbml0L21haW4uYwppbmRleCBjZDE2OGViLi44NDQyMDk0IDEwMDY0NAotLS0gYS9pbml0L21haW4uYworKysgYi9pbml0L21haW4uYwpAQCAtNTAsNyArNTAsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3JtYXAuaD4KICNpbmNsdWRlIDxsaW51eC9tZW1wb2xpY3kuaD4KICNpbmNsdWRlIDxsaW51eC9rZXkuaD4KLSNpbmNsdWRlIDxsaW51eC91bndpbmQuaD4KICNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgogI2luY2x1ZGUgPGxpbnV4L3BhZ2VfY2dyb3VwLmg+CiAjaW5jbHVkZSA8bGludXgvZGVidWdfbG9ja3MuaD4KQEAgLTYzLDYgKzYyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KICNpbmNsdWRlIDxsaW51eC9pZHIuaD4KICNpbmNsdWRlIDxsaW51eC9mdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9hc3luYy5oPgogI2luY2x1ZGUgPHRyYWNlL2Jvb3QuaD4KIAogI2luY2x1ZGUgPGFzbS9pby5oPgpAQCAtMTA4LDcgKzEwOCw3IEBACiAKIGV4dGVybiB2b2lkIHRpbWVfaW5pdCh2b2lkKTsKIC8qIERlZmF1bHQgbGF0ZSB0aW1lIGluaXQgaXMgTlVMTC4gYXJjaHMgY2FuIG92ZXJyaWRlIHRoaXMgbGF0ZXIuICovCi12b2lkICgqbGF0ZV90aW1lX2luaXQpKHZvaWQpOwordm9pZCAoKl9faW5pdGRhdGEgbGF0ZV90aW1lX2luaXQpKHZvaWQpOwogZXh0ZXJuIHZvaWQgc29mdGlycV9pbml0KHZvaWQpOwogCiAvKiBVbnRvdWNoZWQgY29tbWFuZCBsaW5lIHNhdmVkIGJ5IGFyY2gtc3BlY2lmaWMgY29kZS4gKi8KQEAgLTQ0Nyw3ICs0NDcsNyBAQAogICogZ2NjLTMuNCBhY2NpZGVudGFsbHkgaW5saW5lcyB0aGlzIGZ1bmN0aW9uLCBzbyB1c2Ugbm9pbmxpbmUuCiAgKi8KIAotc3RhdGljIHZvaWQgbm9pbmxpbmUgX19pbml0X3JlZm9rIHJlc3RfaW5pdCh2b2lkKQorc3RhdGljIG5vaW5saW5lIHZvaWQgX19pbml0X3JlZm9rIHJlc3RfaW5pdCh2b2lkKQogCV9fcmVsZWFzZXMoa2VybmVsX2xvY2spCiB7CiAJaW50IHBpZDsKQEAgLTUzNyw3ICs1MzcsNiBAQAogCSAqIE5lZWQgdG8gcnVuIGFzIGVhcmx5IGFzIHBvc3NpYmxlLCB0byBpbml0aWFsaXplIHRoZQogCSAqIGxvY2tkZXAgaGFzaDoKIAkgKi8KLQl1bndpbmRfaW5pdCgpOwogCWxvY2tkZXBfaW5pdCgpOwogCWRlYnVnX29iamVjdHNfZWFybHlfaW5pdCgpOwogCWNncm91cF9pbml0X2Vhcmx5KCk7CkBAIC01NTksNyArNTU4LDYgQEAKIAlzZXR1cF9hcmNoKCZjb21tYW5kX2xpbmUpOwogCW1tX2luaXRfb3duZXIoJmluaXRfbW0sICZpbml0X3Rhc2spOwogCXNldHVwX2NvbW1hbmRfbGluZShjb21tYW5kX2xpbmUpOwotCXVud2luZF9zZXR1cCgpOwogCXNldHVwX3Blcl9jcHVfYXJlYXMoKTsKIAlzZXR1cF9ucl9jcHVfaWRzKCk7CiAJc21wX3ByZXBhcmVfYm9vdF9jcHUoKTsJLyogYXJjaC1zcGVjaWZpYyBib290LWNwdSBob29rcyAqLwpAQCAtNjAyLDcgKzYwMCw4IEBACiAJc2NoZWRfY2xvY2tfaW5pdCgpOwogCXByb2ZpbGVfaW5pdCgpOwogCWlmICghaXJxc19kaXNhYmxlZCgpKQotCQlwcmludGsoInN0YXJ0X2tlcm5lbCgpOiBidWc6IGludGVycnVwdHMgd2VyZSBlbmFibGVkIGVhcmx5XG4iKTsKKwkJcHJpbnRrKEtFUk5fQ1JJVCAic3RhcnRfa2VybmVsKCk6IGJ1ZzogaW50ZXJydXB0cyB3ZXJlICIKKwkJCQkgImVuYWJsZWQgZWFybHlcbiIpOwogCWVhcmx5X2Jvb3RfaXJxc19vbigpOwogCWxvY2FsX2lycV9lbmFibGUoKTsKIApAQCAtNjg3LDcgKzY4Niw3IEBACiAJcmVzdF9pbml0KCk7CiB9CiAKLXN0YXRpYyBpbnQgaW5pdGNhbGxfZGVidWc7CitpbnQgaW5pdGNhbGxfZGVidWc7CiBjb3JlX3BhcmFtKGluaXRjYWxsX2RlYnVnLCBpbml0Y2FsbF9kZWJ1ZywgYm9vbCwgMDY0NCk7CiAKIGludCBkb19vbmVfaW5pdGNhbGwoaW5pdGNhbGxfdCBmbikKQEAgLTc4Niw4ICs3ODUsMTAgQEAKIC8qIFRoaXMgaXMgYSBub24gX19pbml0IGZ1bmN0aW9uLiBGb3JjZSBpdCB0byBiZSBub2lubGluZSBvdGhlcndpc2UgZ2NjCiAgKiBtYWtlcyBpdCBpbmxpbmUgdG8gaW5pdCgpIGFuZCBpdCBiZWNvbWVzIHBhcnQgb2YgaW5pdC50ZXh0IHNlY3Rpb24KICAqLwotc3RhdGljIGludCBub2lubGluZSBpbml0X3Bvc3Qodm9pZCkKK3N0YXRpYyBub2lubGluZSBpbnQgaW5pdF9wb3N0KHZvaWQpCiB7CisJLyogbmVlZCB0byBmaW5pc2ggYWxsIGFzeW5jIF9faW5pdCBjb2RlIGJlZm9yZSBmcmVlaW5nIHRoZSBtZW1vcnkgKi8KKwlhc3luY19zeW5jaHJvbml6ZV9mdWxsKCk7CiAJZnJlZV9pbml0bWVtKCk7CiAJdW5sb2NrX2tlcm5lbCgpOwogCW1hcmtfcm9kYXRhX3JvKCk7CmRpZmYgLS1naXQgYS9pcGMvaXBjX3N5c2N0bC5jIGIvaXBjL2lwY19zeXNjdGwuYwppbmRleCAwZGZlYmM1Li40YTdhMTJjIDEwMDY0NAotLS0gYS9pcGMvaXBjX3N5c2N0bC5jCisrKyBiL2lwYy9pcGNfc3lzY3RsLmMKQEAgLTI2LDI5ICsyNiw2IEBACiAJcmV0dXJuIHdoaWNoOwogfQogCi0vKgotICogUm91dGluZSB0aGF0IGlzIGNhbGxlZCB3aGVuIHRoZSBmaWxlICJhdXRvX21zZ21uaSIgaGFzIHN1Y2Nlc3NmdWxseSBiZWVuCi0gKiB3cml0dGVuLgotICogVHdvIHZhbHVlcyBhcmUgYWxsb3dlZDoKLSAqIDA6IHVucmVnaXN0ZXIgbXNnbW5pJ3MgY2FsbGJhY2sgcm91dGluZSBmcm9tIHRoZSBpcGMgbmFtZXNwYWNlIG5vdGlmaWVyCi0gKiAgICBjaGFpbi4gVGhpcyBtZWFucyB0aGF0IG1zZ21uaSB3b24ndCBiZSByZWNvbXB1dGVkIGFueW1vcmUgdXBvbiBtZW1vcnkKLSAqICAgIGFkZC9yZW1vdmUgb3IgaXBjIG5hbWVzcGFjZSBjcmVhdGlvbi9yZW1vdmFsLgotICogMTogcmVnaXN0ZXIgYmFjayB0aGUgY2FsbGJhY2sgcm91dGluZS4KLSAqLwotc3RhdGljIHZvaWQgaXBjX2F1dG9fY2FsbGJhY2soaW50IHZhbCkKLXsKLQlpZiAoIXZhbCkKLQkJdW5yZWdpc3Rlcl9pcGNuc19ub3RpZmllcihjdXJyZW50LT5uc3Byb3h5LT5pcGNfbnMpOwotCWVsc2UgewotCQkvKgotCQkgKiBSZS1lbmFibGUgYXV0b21hdGljIHJlY29tcHV0aW5nIG9ubHkgaWYgbm90IGFscmVhZHkKLQkJICogZW5hYmxlZC4KLQkJICovCi0JCXJlY29tcHV0ZV9tc2dtbmkoY3VycmVudC0+bnNwcm94eS0+aXBjX25zKTsKLQkJY29uZF9yZWdpc3Rlcl9pcGNuc19ub3RpZmllcihjdXJyZW50LT5uc3Byb3h5LT5pcGNfbnMpOwotCX0KLX0KLQogI2lmZGVmIENPTkZJR19QUk9DX0ZTCiBzdGF0aWMgaW50IHByb2NfaXBjX2RvaW50dmVjKGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSwgc3RydWN0IGZpbGUgKmZpbHAsCiAJdm9pZCBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90ICpsZW5wLCBsb2ZmX3QgKnBwb3MpCkBAIC05NCw2ICs3MSwyOSBAQAogCQkJCQlsZW5wLCBwcG9zKTsKIH0KIAorLyoKKyAqIFJvdXRpbmUgdGhhdCBpcyBjYWxsZWQgd2hlbiB0aGUgZmlsZSAiYXV0b19tc2dtbmkiIGhhcyBzdWNjZXNzZnVsbHkgYmVlbgorICogd3JpdHRlbi4KKyAqIFR3byB2YWx1ZXMgYXJlIGFsbG93ZWQ6CisgKiAwOiB1bnJlZ2lzdGVyIG1zZ21uaSdzIGNhbGxiYWNrIHJvdXRpbmUgZnJvbSB0aGUgaXBjIG5hbWVzcGFjZSBub3RpZmllcgorICogICAgY2hhaW4uIFRoaXMgbWVhbnMgdGhhdCBtc2dtbmkgd29uJ3QgYmUgcmVjb21wdXRlZCBhbnltb3JlIHVwb24gbWVtb3J5CisgKiAgICBhZGQvcmVtb3ZlIG9yIGlwYyBuYW1lc3BhY2UgY3JlYXRpb24vcmVtb3ZhbC4KKyAqIDE6IHJlZ2lzdGVyIGJhY2sgdGhlIGNhbGxiYWNrIHJvdXRpbmUuCisgKi8KK3N0YXRpYyB2b2lkIGlwY19hdXRvX2NhbGxiYWNrKGludCB2YWwpCit7CisJaWYgKCF2YWwpCisJCXVucmVnaXN0ZXJfaXBjbnNfbm90aWZpZXIoY3VycmVudC0+bnNwcm94eS0+aXBjX25zKTsKKwllbHNlIHsKKwkJLyoKKwkJICogUmUtZW5hYmxlIGF1dG9tYXRpYyByZWNvbXB1dGluZyBvbmx5IGlmIG5vdCBhbHJlYWR5CisJCSAqIGVuYWJsZWQuCisJCSAqLworCQlyZWNvbXB1dGVfbXNnbW5pKGN1cnJlbnQtPm5zcHJveHktPmlwY19ucyk7CisJCWNvbmRfcmVnaXN0ZXJfaXBjbnNfbm90aWZpZXIoY3VycmVudC0+bnNwcm94eS0+aXBjX25zKTsKKwl9Cit9CisKIHN0YXRpYyBpbnQgcHJvY19pcGNhdXRvX2RvaW50dmVjX21pbm1heChjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsCiAJc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqbGVucCwgbG9mZl90ICpwcG9zKQogewpkaWZmIC0tZ2l0IGEvaXBjL21xdWV1ZS5jIGIvaXBjL21xdWV1ZS5jCmluZGV4IGQ0NDhiNjkuLjIzZmRiODQgMTAwNjQ0Ci0tLSBhL2lwYy9tcXVldWUuYworKysgYi9pcGMvbXF1ZXVlLmMKQEAgLTEyMCw3ICsxMjAsNiBAQAogCQlpbm9kZS0+aV9tb2RlID0gbW9kZTsKIAkJaW5vZGUtPmlfdWlkID0gY3VycmVudF9mc3VpZCgpOwogCQlpbm9kZS0+aV9naWQgPSBjdXJyZW50X2ZzZ2lkKCk7Ci0JCWlub2RlLT5pX2Jsb2NrcyA9IDA7CiAJCWlub2RlLT5pX210aW1lID0gaW5vZGUtPmlfY3RpbWUgPSBpbm9kZS0+aV9hdGltZSA9CiAJCQkJQ1VSUkVOVF9USU1FOwogCkBAIC01MDYsNyArNTA1LDggQEAKIAkJCXNpZ19pLnNpX2Vycm5vID0gMDsKIAkJCXNpZ19pLnNpX2NvZGUgPSBTSV9NRVNHUTsKIAkJCXNpZ19pLnNpX3ZhbHVlID0gaW5mby0+bm90aWZ5LnNpZ2V2X3ZhbHVlOwotCQkJc2lnX2kuc2lfcGlkID0gdGFza190Z2lkX3ZucihjdXJyZW50KTsKKwkJCXNpZ19pLnNpX3BpZCA9IHRhc2tfdGdpZF9ucl9ucyhjdXJyZW50LAorCQkJCQkJbnNfb2ZfcGlkKGluZm8tPm5vdGlmeV9vd25lcikpOwogCQkJc2lnX2kuc2lfdWlkID0gY3VycmVudF91aWQoKTsKIAogCQkJa2lsbF9waWRfaW5mbyhpbmZvLT5ub3RpZnkuc2lnZXZfc2lnbm8sCmRpZmYgLS1naXQgYS9pcGMvc2VtLmMgYi9pcGMvc2VtLmMKaW5kZXggMDgyMTIyNC4uYzY4Y2QzZiAxMDA2NDQKLS0tIGEvaXBjL3NlbS5jCisrKyBiL2lwYy9zZW0uYwpAQCAtNTgsNyArNTgsNyBAQAogICogU01QLXRocmVhZGVkLCBzeXNjdGwncyBhZGRlZAogICogKGMpIDE5OTkgTWFuZnJlZCBTcHJhdWwgPG1hbmZyZWRAY29sb3JmdWxsaWZlLmNvbT4KICAqIEVuZm9yY2VkIHJhbmdlIGxpbWl0IG9uIFNFTV9VTkRPCi0gKiAoYykgMjAwMSBSZWQgSGF0IEluYyA8YWxhbkByZWRoYXQuY29tPgorICogKGMpIDIwMDEgUmVkIEhhdCBJbmMKICAqIExvY2tsZXNzIHdha2V1cAogICogKGMpIDIwMDMgTWFuZnJlZCBTcHJhdWwgPG1hbmZyZWRAY29sb3JmdWxsaWZlLmNvbT4KICAqCkBAIC0xMjE2LDcgKzEyMTYsNiBAQAogCWlmICh0aW1lb3V0ICYmIGppZmZpZXNfbGVmdCA9PSAwKQogCQllcnJvciA9IC1FQUdBSU47CiAJbGlzdF9kZWwoJnF1ZXVlLmxpc3QpOwotCWdvdG8gb3V0X3VubG9ja19mcmVlOwogCiBvdXRfdW5sb2NrX2ZyZWU6CiAJc2VtX3VubG9jayhzbWEpOwpkaWZmIC0tZ2l0IGEvaXBjL3NobS5jIGIvaXBjL3NobS5jCmluZGV4IDU3ZGQ1MDAuLmIxMjViNTYgMTAwNjQ0Ci0tLSBhL2lwYy9zaG0uYworKysgYi9pcGMvc2htLmMKQEAgLTc1LDcgKzc1LDcgQEAKIAlucy0+c2htX2N0bGFsbCA9IFNITUFMTDsKIAlucy0+c2htX2N0bG1uaSA9IFNITU1OSTsKIAlucy0+c2htX3RvdCA9IDA7Ci0JaXBjX2luaXRfaWRzKCZucy0+aWRzW0lQQ19TSE1fSURTXSk7CisJaXBjX2luaXRfaWRzKCZzaG1faWRzKG5zKSk7CiB9CiAKIC8qCkBAIC02NDQsNyArNjQ0LDcgQEAKIAkJaWYgKGVycikKIAkJCXJldHVybiBlcnI7CiAKLQkJbWVtc2V0KCZzaG1pbmZvLDAsc2l6ZW9mKHNobWluZm8pKTsKKwkJbWVtc2V0KCZzaG1pbmZvLCAwLCBzaXplb2Yoc2htaW5mbykpOwogCQlzaG1pbmZvLnNobW1uaSA9IHNobWluZm8uc2htc2VnID0gbnMtPnNobV9jdGxtbmk7CiAJCXNobWluZm8uc2htbWF4ID0gbnMtPnNobV9jdGxtYXg7CiAJCXNobWluZm8uc2htYWxsID0gbnMtPnNobV9jdGxhbGw7CkBAIC02NjksNyArNjY5LDcgQEAKIAkJaWYgKGVycikKIAkJCXJldHVybiBlcnI7CiAKLQkJbWVtc2V0KCZzaG1faW5mbywwLHNpemVvZihzaG1faW5mbykpOworCQltZW1zZXQoJnNobV9pbmZvLCAwLCBzaXplb2Yoc2htX2luZm8pKTsKIAkJZG93bl9yZWFkKCZzaG1faWRzKG5zKS5yd19tdXRleCk7CiAJCXNobV9pbmZvLnVzZWRfaWRzID0gc2htX2lkcyhucykuaW5fdXNlOwogCQlzaG1fZ2V0X3N0YXQgKG5zLCAmc2htX2luZm8uc2htX3JzcywgJnNobV9pbmZvLnNobV9zd3ApOwpAQCAtNjc4LDcgKzY3OCw3IEBACiAJCXNobV9pbmZvLnN3YXBfc3VjY2Vzc2VzID0gMDsKIAkJZXJyID0gaXBjX2dldF9tYXhpZCgmc2htX2lkcyhucykpOwogCQl1cF9yZWFkKCZzaG1faWRzKG5zKS5yd19tdXRleCk7Ci0JCWlmKGNvcHlfdG9fdXNlciAoYnVmLCAmc2htX2luZm8sIHNpemVvZihzaG1faW5mbykpKSB7CisJCWlmIChjb3B5X3RvX3VzZXIoYnVmLCAmc2htX2luZm8sIHNpemVvZihzaG1faW5mbykpKSB7CiAJCQllcnIgPSAtRUZBVUxUOwogCQkJZ290byBvdXQ7CiAJCX0KQEAgLTY5MiwxMSArNjkyLDYgQEAKIAkJc3RydWN0IHNobWlkNjRfZHMgdGJ1ZjsKIAkJaW50IHJlc3VsdDsKIAotCQlpZiAoIWJ1ZikgewotCQkJZXJyID0gLUVGQVVMVDsKLQkJCWdvdG8gb3V0OwotCQl9Ci0KIAkJaWYgKGNtZCA9PSBTSE1fU1RBVCkgewogCQkJc2hwID0gc2htX2xvY2sobnMsIHNobWlkKTsKIAkJCWlmIChJU19FUlIoc2hwKSkgewpAQCAtNzEyLDcgKzcwNyw3IEBACiAJCQl9CiAJCQlyZXN1bHQgPSAwOwogCQl9Ci0JCWVycj0tRUFDQ0VTOworCQllcnIgPSAtRUFDQ0VTOwogCQlpZiAoaXBjcGVybXMgKCZzaHAtPnNobV9wZXJtLCBTX0lSVUdPKSkKIAkJCWdvdG8gb3V0X3VubG9jazsKIAkJZXJyID0gc2VjdXJpdHlfc2htX3NobWN0bChzaHAsIGNtZCk7CmRpZmYgLS1naXQgYS9rZXJuZWwvTWFrZWZpbGUgYi9rZXJuZWwvTWFrZWZpbGUKaW5kZXggZTFjNWJmMy4uMjkyMWQ5MCAxMDA2NDQKLS0tIGEva2VybmVsL01ha2VmaWxlCisrKyBiL2tlcm5lbC9NYWtlZmlsZQpAQCAtOSw3ICs5LDggQEAKIAkgICAgcmN1cGRhdGUubyBleHRhYmxlLm8gcGFyYW1zLm8gcG9zaXgtdGltZXJzLm8gXAogCSAgICBrdGhyZWFkLm8gd2FpdC5vIGtmaWZvLm8gc3lzX25pLm8gcG9zaXgtY3B1LXRpbWVycy5vIG11dGV4Lm8gXAogCSAgICBocnRpbWVyLm8gcndzZW0ubyBuc3Byb3h5Lm8gc3JjdS5vIHNlbWFwaG9yZS5vIFwKLQkgICAgbm90aWZpZXIubyBrc3lzZnMubyBwbV9xb3NfcGFyYW1zLm8gc2NoZWRfY2xvY2subyBjcmVkLm8KKwkgICAgbm90aWZpZXIubyBrc3lzZnMubyBwbV9xb3NfcGFyYW1zLm8gc2NoZWRfY2xvY2subyBjcmVkLm8gXAorCSAgICBhc3luYy5vCiAKIGlmZGVmIENPTkZJR19GVU5DVElPTl9UUkFDRVIKICMgRG8gbm90IHRyYWNlIGRlYnVnIGZpbGVzIGFuZCBpbnRlcm5hbCBmdHJhY2UgZmlsZXMKZGlmZiAtLWdpdCBhL2tlcm5lbC9hc3luYy5jIGIva2VybmVsL2FzeW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjRjYzkxNgotLS0gL2Rldi9udWxsCisrKyBiL2tlcm5lbC9hc3luYy5jCkBAIC0wLDAgKzEsMzIzIEBACisvKgorICogYXN5bmMuYzogQXN5bmNocm9ub3VzIGZ1bmN0aW9uIGNhbGxzIGZvciBib290IHBlcmZvcm1hbmNlCisgKgorICogKEMpIENvcHlyaWdodCAyMDA5IEludGVsIENvcnBvcmF0aW9uCisgKiBBdXRob3I6IEFyamFuIHZhbiBkZSBWZW4gPGFyamFuQGxpbnV4LmludGVsLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMgorICogb2YgdGhlIExpY2Vuc2UuCisgKi8KKworCisvKgorCitHb2FscyBhbmQgVGhlb3J5IG9mIE9wZXJhdGlvbgorCitUaGUgcHJpbWFyeSBnb2FsIG9mIHRoaXMgZmVhdHVyZSBpcyB0byByZWR1Y2UgdGhlIGtlcm5lbCBib290IHRpbWUsCitieSBkb2luZyB2YXJpb3VzIGluZGVwZW5kZW50IGhhcmR3YXJlIGRlbGF5cyBhbmQgZGlzY292ZXJ5IG9wZXJhdGlvbnMKK2RlY291cGxlZCBhbmQgbm90IHN0cmljdGx5IHNlcmlhbGl6ZWQuCisKK01vcmUgc3BlY2lmaWNhbGx5LCB0aGUgYXN5bmNocm9ub3VzIGZ1bmN0aW9uIGNhbGwgY29uY2VwdCBhbGxvd3MKK2NlcnRhaW4gb3BlcmF0aW9ucyAocHJpbWFyaWx5IGR1cmluZyBzeXN0ZW0gYm9vdCkgdG8gaGFwcGVuCithc3luY2hyb25vdXNseSwgb3V0IG9mIG9yZGVyLCB3aGlsZSB0aGVzZSBvcGVyYXRpb25zIHN0aWxsCitoYXZlIHRoZWlyIGV4dGVybmFsbHkgdmlzaWJsZSBwYXJ0cyBoYXBwZW4gc2VxdWVudGlhbGx5IGFuZCBpbi1vcmRlci4KKyhub3QgdW5saWtlIGhvdyBvdXQtb2Ytb3JkZXIgQ1BVcyByZXRpcmUgdGhlaXIgaW5zdHJ1Y3Rpb25zIGluIG9yZGVyKQorCitLZXkgdG8gdGhlIGFzeW5jaHJvbm91cyBmdW5jdGlvbiBjYWxsIGltcGxlbWVudGF0aW9uIGlzIHRoZSBjb25jZXB0IG9mCithICJzZXF1ZW5jZSBjb29raWUiICh3aGljaCwgYWx0aG91Z2ggaXQgaGFzIGFuIGFic3RyYWN0ZWQgdHlwZSwgY2FuIGJlCit0aG91Z2h0IG9mIGFzIGEgbW9ub3RvbmljYWxseSBpbmNyZW1lbnRpbmcgbnVtYmVyKS4KKworVGhlIGFzeW5jIGNvcmUgd2lsbCBhc3NpZ24gZWFjaCBzY2hlZHVsZWQgZXZlbnQgc3VjaCBhIHNlcXVlbmNlIGNvb2tpZSBhbmQKK3Bhc3MgdGhpcyB0byB0aGUgY2FsbGVkIGZ1bmN0aW9ucy4KKworVGhlIGFzeW5jaHJvbm91c2x5IGNhbGxlZCBmdW5jdGlvbiBzaG91bGQgYmVmb3JlIGRvaW5nIGEgZ2xvYmFsbHkgdmlzaWJsZQorb3BlcmF0aW9uLCBzdWNoIGFzIHJlZ2lzdGVyaW5nIGRldmljZSBudW1iZXJzLCBjYWxsIHRoZQorYXN5bmNfc3luY2hyb25pemVfY29va2llKCkgZnVuY3Rpb24gYW5kIHBhc3MgaW4gaXRzIG93biBjb29raWUuIFRoZQorYXN5bmNfc3luY2hyb25pemVfY29va2llKCkgZnVuY3Rpb24gd2lsbCBtYWtlIHN1cmUgdGhhdCBhbGwgYXN5bmNocm9ub3VzCitvcGVyYXRpb25zIHRoYXQgd2VyZSBzY2hlZHVsZWQgcHJpb3IgdG8gdGhlIG9wZXJhdGlvbiBjb3JyZXNwb25kaW5nIHdpdGggdGhlCitjb29raWUgaGF2ZSBjb21wbGV0ZWQuCisKK1N1YnN5c3RlbS9kcml2ZXIgaW5pdGlhbGl6YXRpb24gY29kZSB0aGF0IHNjaGVkdWxlZCBhc3luY2hyb25vdXMgcHJvYmUKK2Z1bmN0aW9ucywgYnV0IHdoaWNoIHNoYXJlcyBnbG9iYWwgcmVzb3VyY2VzIHdpdGggb3RoZXIgZHJpdmVycy9zdWJzeXN0ZW1zCit0aGF0IGRvIG5vdCB1c2UgdGhlIGFzeW5jaHJvbm91cyBjYWxsIGZlYXR1cmUsIG5lZWQgdG8gZG8gYSBmdWxsCitzeW5jaHJvbml6YXRpb24gd2l0aCB0aGUgYXN5bmNfc3luY2hyb25pemVfZnVsbCgpIGZ1bmN0aW9uLCBiZWZvcmUgcmV0dXJuaW5nCitmcm9tIHRoZWlyIGluaXQgZnVuY3Rpb24uIFRoaXMgaXMgdG8gbWFpbnRhaW4gc3RyaWN0IG9yZGVyaW5nIGJldHdlZW4gdGhlCithc3luY2hyb25vdXMgYW5kIHN5bmNocm9ub3VzIHBhcnRzIG9mIHRoZSBrZXJuZWwuCisKKyovCisKKyNpbmNsdWRlIDxsaW51eC9hc3luYy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CisjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgorCitzdGF0aWMgYXN5bmNfY29va2llX3QgbmV4dF9jb29raWUgPSAxOworCisjZGVmaW5lIE1BWF9USFJFQURTCTI1NgorI2RlZmluZSBNQVhfV09SSwkzMjc2OAorCitzdGF0aWMgTElTVF9IRUFEKGFzeW5jX3BlbmRpbmcpOworc3RhdGljIExJU1RfSEVBRChhc3luY19ydW5uaW5nKTsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soYXN5bmNfbG9jayk7CisKK3N0cnVjdCBhc3luY19lbnRyeSB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCWFzeW5jX2Nvb2tpZV90ICAgY29va2llOworCWFzeW5jX2Z1bmNfcHRyCSAqZnVuYzsKKwl2b2lkICAgICAgICAgICAgICpkYXRhOworCXN0cnVjdCBsaXN0X2hlYWQgKnJ1bm5pbmc7Cit9OworCitzdGF0aWMgREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQoYXN5bmNfZG9uZSk7CitzdGF0aWMgREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQoYXN5bmNfbmV3KTsKKworc3RhdGljIGF0b21pY190IGVudHJ5X2NvdW50Oworc3RhdGljIGF0b21pY190IHRocmVhZF9jb3VudDsKKworZXh0ZXJuIGludCBpbml0Y2FsbF9kZWJ1ZzsKKworCisvKgorICogTVVTVCBiZSBjYWxsZWQgd2l0aCB0aGUgbG9jayBoZWxkIQorICovCitzdGF0aWMgYXN5bmNfY29va2llX3QgIF9fbG93ZXN0X2luX3Byb2dyZXNzKHN0cnVjdCBsaXN0X2hlYWQgKnJ1bm5pbmcpCit7CisJc3RydWN0IGFzeW5jX2VudHJ5ICplbnRyeTsKKwlpZiAoIWxpc3RfZW1wdHkoJmFzeW5jX3BlbmRpbmcpKSB7CisJCWVudHJ5ID0gbGlzdF9maXJzdF9lbnRyeSgmYXN5bmNfcGVuZGluZywKKwkJCXN0cnVjdCBhc3luY19lbnRyeSwgbGlzdCk7CisJCXJldHVybiBlbnRyeS0+Y29va2llOworCX0gZWxzZSBpZiAoIWxpc3RfZW1wdHkocnVubmluZykpIHsKKwkJZW50cnkgPSBsaXN0X2ZpcnN0X2VudHJ5KHJ1bm5pbmcsCisJCQlzdHJ1Y3QgYXN5bmNfZW50cnksIGxpc3QpOworCQlyZXR1cm4gZW50cnktPmNvb2tpZTsKKwl9IGVsc2UgeworCQkvKiBub3RoaW5nIGluIHByb2dyZXNzLi4uIG5leHRfY29va2llIGlzICJpbmZpbml0eSIgKi8KKwkJcmV0dXJuIG5leHRfY29va2llOworCX0KKworfQorLyoKKyAqIHBpY2sgdGhlIGZpcnN0IHBlbmRpbmcgZW50cnkgYW5kIHJ1biBpdAorICovCitzdGF0aWMgdm9pZCBydW5fb25lX2VudHJ5KHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgYXN5bmNfZW50cnkgKmVudHJ5OworCWt0aW1lX3QgY2FsbHRpbWUsIGRlbHRhLCByZXR0aW1lOworCisJLyogMSkgcGljayBvbmUgdGFzayBmcm9tIHRoZSBwZW5kaW5nIHF1ZXVlICovCisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYXN5bmNfbG9jaywgZmxhZ3MpOworCWlmIChsaXN0X2VtcHR5KCZhc3luY19wZW5kaW5nKSkKKwkJZ290byBvdXQ7CisJZW50cnkgPSBsaXN0X2ZpcnN0X2VudHJ5KCZhc3luY19wZW5kaW5nLCBzdHJ1Y3QgYXN5bmNfZW50cnksIGxpc3QpOworCisJLyogMikgbW92ZSBpdCB0byB0aGUgcnVubmluZyBxdWV1ZSAqLworCWxpc3RfZGVsKCZlbnRyeS0+bGlzdCk7CisJbGlzdF9hZGRfdGFpbCgmZW50cnktPmxpc3QsICZhc3luY19ydW5uaW5nKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhc3luY19sb2NrLCBmbGFncyk7CisKKwkvKiAzKSBydW4gaXQgKGFuZCBwcmludCBkdXJhdGlvbikqLworCWlmIChpbml0Y2FsbF9kZWJ1ZyAmJiBzeXN0ZW1fc3RhdGUgPT0gU1lTVEVNX0JPT1RJTkcpIHsKKwkJcHJpbnRrKCJjYWxsaW5nICAlbGxpXyVwRiBAICVpXG4iLCBlbnRyeS0+Y29va2llLCBlbnRyeS0+ZnVuYywgdGFza19waWRfbnIoY3VycmVudCkpOworCQljYWxsdGltZSA9IGt0aW1lX2dldCgpOworCX0KKwllbnRyeS0+ZnVuYyhlbnRyeS0+ZGF0YSwgZW50cnktPmNvb2tpZSk7CisJaWYgKGluaXRjYWxsX2RlYnVnICYmIHN5c3RlbV9zdGF0ZSA9PSBTWVNURU1fQk9PVElORykgeworCQlyZXR0aW1lID0ga3RpbWVfZ2V0KCk7CisJCWRlbHRhID0ga3RpbWVfc3ViKHJldHRpbWUsIGNhbGx0aW1lKTsKKwkJcHJpbnRrKCJpbml0Y2FsbCAlbGxpXyVwRiByZXR1cm5lZCAwIGFmdGVyICVsbGQgdXNlY3NcbiIsIGVudHJ5LT5jb29raWUsCisJCQllbnRyeS0+ZnVuYywga3RpbWVfdG9fbnMoZGVsdGEpID4+IDEwKTsKKwl9CisKKwkvKiA0KSByZW1vdmUgaXQgZnJvbSB0aGUgcnVubmluZyBxdWV1ZSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZhc3luY19sb2NrLCBmbGFncyk7CisJbGlzdF9kZWwoJmVudHJ5LT5saXN0KTsKKworCS8qIDUpIGZyZWUgdGhlIGVudHJ5ICAqLworCWtmcmVlKGVudHJ5KTsKKwlhdG9taWNfZGVjKCZlbnRyeV9jb3VudCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhc3luY19sb2NrLCBmbGFncyk7CisKKwkvKiA2KSB3YWtlIHVwIGFueSB3YWl0ZXJzLiAqLworCXdha2VfdXAoJmFzeW5jX2RvbmUpOworCXJldHVybjsKKworb3V0OgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFzeW5jX2xvY2ssIGZsYWdzKTsKK30KKworCitzdGF0aWMgYXN5bmNfY29va2llX3QgX19hc3luY19zY2hlZHVsZShhc3luY19mdW5jX3B0ciAqcHRyLCB2b2lkICpkYXRhLCBzdHJ1Y3QgbGlzdF9oZWFkICpydW5uaW5nKQoreworCXN0cnVjdCBhc3luY19lbnRyeSAqZW50cnk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlhc3luY19jb29raWVfdCBuZXdjb29raWU7CisJCisKKwkvKiBhbGxvdyBpcnEtb2ZmIGNhbGxlcnMgKi8KKwllbnRyeSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhc3luY19lbnRyeSksIEdGUF9BVE9NSUMpOworCisJLyoKKwkgKiBJZiB3ZSdyZSBvdXQgb2YgbWVtb3J5IG9yIGlmIHRoZXJlJ3MgdG9vIG11Y2ggd29yaworCSAqIHBlbmRpbmcgYWxyZWFkeSwgd2UgZXhlY3V0ZSBzeW5jaHJvbm91c2x5LgorCSAqLworCWlmICghZW50cnkgfHwgYXRvbWljX3JlYWQoJmVudHJ5X2NvdW50KSA+IE1BWF9XT1JLKSB7CisJCWtmcmVlKGVudHJ5KTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmFzeW5jX2xvY2ssIGZsYWdzKTsKKwkJbmV3Y29va2llID0gbmV4dF9jb29raWUrKzsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXN5bmNfbG9jaywgZmxhZ3MpOworCisJCS8qIGxvdyBvbiBtZW1vcnkuLiBydW4gc3luY2hyb25vdXNseSAqLworCQlwdHIoZGF0YSwgbmV3Y29va2llKTsKKwkJcmV0dXJuIG5ld2Nvb2tpZTsKKwl9CisJZW50cnktPmZ1bmMgPSBwdHI7CisJZW50cnktPmRhdGEgPSBkYXRhOworCWVudHJ5LT5ydW5uaW5nID0gcnVubmluZzsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZhc3luY19sb2NrLCBmbGFncyk7CisJbmV3Y29va2llID0gZW50cnktPmNvb2tpZSA9IG5leHRfY29va2llKys7CisJbGlzdF9hZGRfdGFpbCgmZW50cnktPmxpc3QsICZhc3luY19wZW5kaW5nKTsKKwlhdG9taWNfaW5jKCZlbnRyeV9jb3VudCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXN5bmNfbG9jaywgZmxhZ3MpOworCXdha2VfdXAoJmFzeW5jX25ldyk7CisJcmV0dXJuIG5ld2Nvb2tpZTsKK30KKworYXN5bmNfY29va2llX3QgYXN5bmNfc2NoZWR1bGUoYXN5bmNfZnVuY19wdHIgKnB0ciwgdm9pZCAqZGF0YSkKK3sKKwlyZXR1cm4gX19hc3luY19zY2hlZHVsZShwdHIsIGRhdGEsICZhc3luY19wZW5kaW5nKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGFzeW5jX3NjaGVkdWxlKTsKKworYXN5bmNfY29va2llX3QgYXN5bmNfc2NoZWR1bGVfc3BlY2lhbChhc3luY19mdW5jX3B0ciAqcHRyLCB2b2lkICpkYXRhLCBzdHJ1Y3QgbGlzdF9oZWFkICpydW5uaW5nKQoreworCXJldHVybiBfX2FzeW5jX3NjaGVkdWxlKHB0ciwgZGF0YSwgcnVubmluZyk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChhc3luY19zY2hlZHVsZV9zcGVjaWFsKTsKKwordm9pZCBhc3luY19zeW5jaHJvbml6ZV9mdWxsKHZvaWQpCit7CisJZG8geworCQlhc3luY19zeW5jaHJvbml6ZV9jb29raWUobmV4dF9jb29raWUpOworCX0gd2hpbGUgKCFsaXN0X2VtcHR5KCZhc3luY19ydW5uaW5nKSB8fCAhbGlzdF9lbXB0eSgmYXN5bmNfcGVuZGluZykpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoYXN5bmNfc3luY2hyb25pemVfZnVsbCk7CisKK3ZvaWQgYXN5bmNfc3luY2hyb25pemVfZnVsbF9zcGVjaWFsKHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QpCit7CisJYXN5bmNfc3luY2hyb25pemVfY29va2llX3NwZWNpYWwobmV4dF9jb29raWUsIGxpc3QpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoYXN5bmNfc3luY2hyb25pemVfZnVsbF9zcGVjaWFsKTsKKwordm9pZCBhc3luY19zeW5jaHJvbml6ZV9jb29raWVfc3BlY2lhbChhc3luY19jb29raWVfdCBjb29raWUsIHN0cnVjdCBsaXN0X2hlYWQgKnJ1bm5pbmcpCit7CisJa3RpbWVfdCBzdGFydHRpbWUsIGRlbHRhLCBlbmR0aW1lOworCisJaWYgKGluaXRjYWxsX2RlYnVnICYmIHN5c3RlbV9zdGF0ZSA9PSBTWVNURU1fQk9PVElORykgeworCQlwcmludGsoImFzeW5jX3dhaXRpbmcgQCAlaVxuIiwgdGFza19waWRfbnIoY3VycmVudCkpOworCQlzdGFydHRpbWUgPSBrdGltZV9nZXQoKTsKKwl9CisKKwl3YWl0X2V2ZW50KGFzeW5jX2RvbmUsIF9fbG93ZXN0X2luX3Byb2dyZXNzKHJ1bm5pbmcpID49IGNvb2tpZSk7CisKKwlpZiAoaW5pdGNhbGxfZGVidWcgJiYgc3lzdGVtX3N0YXRlID09IFNZU1RFTV9CT09USU5HKSB7CisJCWVuZHRpbWUgPSBrdGltZV9nZXQoKTsKKwkJZGVsdGEgPSBrdGltZV9zdWIoZW5kdGltZSwgc3RhcnR0aW1lKTsKKworCQlwcmludGsoImFzeW5jX2NvbnRpbnVpbmcgQCAlaSBhZnRlciAlbGxpIHVzZWNcbiIsCisJCQl0YXNrX3BpZF9ucihjdXJyZW50KSwga3RpbWVfdG9fbnMoZGVsdGEpID4+IDEwKTsKKwl9Cit9CitFWFBPUlRfU1lNQk9MX0dQTChhc3luY19zeW5jaHJvbml6ZV9jb29raWVfc3BlY2lhbCk7CisKK3ZvaWQgYXN5bmNfc3luY2hyb25pemVfY29va2llKGFzeW5jX2Nvb2tpZV90IGNvb2tpZSkKK3sKKwlhc3luY19zeW5jaHJvbml6ZV9jb29raWVfc3BlY2lhbChjb29raWUsICZhc3luY19ydW5uaW5nKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGFzeW5jX3N5bmNocm9uaXplX2Nvb2tpZSk7CisKKworc3RhdGljIGludCBhc3luY190aHJlYWQodm9pZCAqdW51c2VkKQoreworCURFQ0xBUkVfV0FJVFFVRVVFKHdxLCBjdXJyZW50KTsKKwlhZGRfd2FpdF9xdWV1ZSgmYXN5bmNfbmV3LCAmd3EpOworCisJd2hpbGUgKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkpIHsKKwkJaW50IHJldCA9IEhaOworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQkvKgorCQkgKiBjaGVjayB0aGUgbGlzdCBoZWFkIHdpdGhvdXQgbG9jay4uIGZhbHNlIHBvc2l0aXZlcworCQkgKiBhcmUgZGVhbHQgd2l0aCBpbnNpZGUgcnVuX29uZV9lbnRyeSgpIHdoaWxlIGhvbGRpbmcKKwkJICogdGhlIGxvY2suCisJCSAqLworCQlybWIoKTsKKwkJaWYgKCFsaXN0X2VtcHR5KCZhc3luY19wZW5kaW5nKSkKKwkJCXJ1bl9vbmVfZW50cnkoKTsKKwkJZWxzZQorCQkJcmV0ID0gc2NoZWR1bGVfdGltZW91dChIWik7CisKKwkJaWYgKHJldCA9PSAwKSB7CisJCQkvKgorCQkJICogd2UgdGltZWQgb3V0LCB0aGlzIG1lYW5zIHdlIGFzIHRocmVhZCBhcmUgcmVkdW5kYW50LgorCQkJICogd2Ugc2lnbiBvZmYgYW5kIGRpZSwgYnV0IHdlIHRvIGF2b2lkIGFueSByYWNlcyB0aGVyZQorCQkJICogaXMgYSBsYXN0LXN0cmF3IGNoZWNrIHRvIHNlZSBpZiB3b3JrIHNudWNrIGluLgorCQkJICovCisJCQlhdG9taWNfZGVjKCZ0aHJlYWRfY291bnQpOworCQkJd21iKCk7IC8qIG1hbmFnZXIgbXVzdCBzZWUgb3VyIGRlcGFydHVyZSBmaXJzdCAqLworCQkJaWYgKGxpc3RfZW1wdHkoJmFzeW5jX3BlbmRpbmcpKQorCQkJCWJyZWFrOworCQkJLyoKKwkJCSAqIHdvb3BzIHdvcmsgY2FtZSBpbiBiZXR3ZWVuIHVzIHRpbWluZyBvdXQgYW5kIHVzCisJCQkgKiBzaWduaW5nIG9mZjsgd2UgbmVlZCB0byBzdGF5IGFsaXZlIGFuZCBrZWVwIHdvcmtpbmcuCisJCQkgKi8KKwkJCWF0b21pY19pbmMoJnRocmVhZF9jb3VudCk7CisJCX0KKwl9CisJcmVtb3ZlX3dhaXRfcXVldWUoJmFzeW5jX25ldywgJndxKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFzeW5jX21hbmFnZXJfdGhyZWFkKHZvaWQgKnVudXNlZCkKK3sKKwlERUNMQVJFX1dBSVRRVUVVRSh3cSwgY3VycmVudCk7CisJYWRkX3dhaXRfcXVldWUoJmFzeW5jX25ldywgJndxKTsKKworCXdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpKSB7CisJCWludCB0YywgZWM7CisKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKworCQl0YyA9IGF0b21pY19yZWFkKCZ0aHJlYWRfY291bnQpOworCQlybWIoKTsKKwkJZWMgPSBhdG9taWNfcmVhZCgmZW50cnlfY291bnQpOworCisJCXdoaWxlICh0YyA8IGVjICYmIHRjIDwgTUFYX1RIUkVBRFMpIHsKKwkJCWt0aHJlYWRfcnVuKGFzeW5jX3RocmVhZCwgTlVMTCwgImFzeW5jLyVpIiwgdGMpOworCQkJYXRvbWljX2luYygmdGhyZWFkX2NvdW50KTsKKwkJCXRjKys7CisJCX0KKworCQlzY2hlZHVsZSgpOworCX0KKwlyZW1vdmVfd2FpdF9xdWV1ZSgmYXN5bmNfbmV3LCAmd3EpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGFzeW5jX2luaXQodm9pZCkKK3sKKwlrdGhyZWFkX3J1bihhc3luY19tYW5hZ2VyX3RocmVhZCwgTlVMTCwgImFzeW5jL21nciIpOworCXJldHVybiAwOworfQorCitjb3JlX2luaXRjYWxsKGFzeW5jX2luaXQpOwpkaWZmIC0tZ2l0IGEva2VybmVsL2NhcGFiaWxpdHkuYyBiL2tlcm5lbC9jYXBhYmlsaXR5LmMKaW5kZXggYzU5OGQ5ZC4uNjg4OTI2ZSAxMDA2NDQKLS0tIGEva2VybmVsL2NhcGFiaWxpdHkuYworKysgYi9rZXJuZWwvY2FwYWJpbGl0eS5jCkBAIC0zMDYsNyArMzA2LDcgQEAKIAkJQlVHKCk7CiAJfQogCi0JaWYgKGhhc19jYXBhYmlsaXR5KGN1cnJlbnQsIGNhcCkpIHsKKwlpZiAoc2VjdXJpdHlfY2FwYWJsZShjYXApID09IDApIHsKIAkJY3VycmVudC0+ZmxhZ3MgfD0gUEZfU1VQRVJQUklWOwogCQlyZXR1cm4gMTsKIAl9CmRpZmYgLS1naXQgYS9rZXJuZWwvY2dyb3VwLmMgYi9rZXJuZWwvY2dyb3VwLmMKaW5kZXggODkxYTg0ZS4uYzI5ODMxMCAxMDA2NDQKLS0tIGEva2VybmVsL2Nncm91cC5jCisrKyBiL2tlcm5lbC9jZ3JvdXAuYwpAQCAtODQsNyArODQsNyBAQAogCS8qIFRyYWNrcyBob3cgbWFueSBjZ3JvdXBzIGFyZSBjdXJyZW50bHkgZGVmaW5lZCBpbiBoaWVyYXJjaHkuKi8KIAlpbnQgbnVtYmVyX29mX2Nncm91cHM7CiAKLQkvKiBBIGxpc3QgcnVubmluZyB0aHJvdWdoIHRoZSBtb3VudGVkIGhpZXJhcmNoaWVzICovCisJLyogQSBsaXN0IHJ1bm5pbmcgdGhyb3VnaCB0aGUgYWN0aXZlIGhpZXJhcmNoaWVzICovCiAJc3RydWN0IGxpc3RfaGVhZCByb290X2xpc3Q7CiAKIAkvKiBIaWVyYXJjaHktc3BlY2lmaWMgZmxhZ3MgKi8KQEAgLTExNiw3ICsxMTYsNiBAQAogICogYmUgY2FsbGVkLgogICovCiBzdGF0aWMgaW50IG5lZWRfZm9ya2V4aXRfY2FsbGJhY2sgX19yZWFkX21vc3RseTsKLXN0YXRpYyBpbnQgbmVlZF9tbV9vd25lcl9jYWxsYmFjayBfX3JlYWRfbW9zdGx5OwogCiAvKiBjb252ZW5pZW50IHRlc3RzIGZvciB0aGVzZSBiaXRzICovCiBpbmxpbmUgaW50IGNncm91cF9pc19yZW1vdmVkKGNvbnN0IHN0cnVjdCBjZ3JvdXAgKmNncnApCkBAIC0xNDksOCArMTQ4LDggQEAKICNkZWZpbmUgZm9yX2VhY2hfc3Vic3lzKF9yb290LCBfc3MpIFwKIGxpc3RfZm9yX2VhY2hfZW50cnkoX3NzLCAmX3Jvb3QtPnN1YnN5c19saXN0LCBzaWJsaW5nKQogCi0vKiBmb3JfZWFjaF9yb290KCkgYWxsb3dzIHlvdSB0byBpdGVyYXRlIGFjcm9zcyB0aGUgYWN0aXZlIGhpZXJhcmNoaWVzICovCi0jZGVmaW5lIGZvcl9lYWNoX3Jvb3QoX3Jvb3QpIFwKKy8qIGZvcl9lYWNoX2FjdGl2ZV9yb290KCkgYWxsb3dzIHlvdSB0byBpdGVyYXRlIGFjcm9zcyB0aGUgYWN0aXZlIGhpZXJhcmNoaWVzICovCisjZGVmaW5lIGZvcl9lYWNoX2FjdGl2ZV9yb290KF9yb290KSBcCiBsaXN0X2Zvcl9lYWNoX2VudHJ5KF9yb290LCAmcm9vdHMsIHJvb3RfbGlzdCkKIAogLyogdGhlIGxpc3Qgb2YgY2dyb3VwcyBlbGlnaWJsZSBmb3IgYXV0b21hdGljIHJlbGVhc2UuIFByb3RlY3RlZCBieQpAQCAtMjcyLDcgKzI3MSw3IEBACiAKIAlyY3VfcmVhZF9sb2NrKCk7CiAJZm9yIChpID0gMDsgaSA8IENHUk9VUF9TVUJTWVNfQ09VTlQ7IGkrKykgewotCQlzdHJ1Y3QgY2dyb3VwICpjZ3JwID0gY2ctPnN1YnN5c1tpXS0+Y2dyb3VwOworCQlzdHJ1Y3QgY2dyb3VwICpjZ3JwID0gcmN1X2RlcmVmZXJlbmNlKGNnLT5zdWJzeXNbaV0tPmNncm91cCk7CiAJCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZjZ3JwLT5jb3VudCkgJiYKIAkJICAgIG5vdGlmeV9vbl9yZWxlYXNlKGNncnApKSB7CiAJCQlpZiAodGFza2V4aXQpCkBAIC0zODUsNiArMzg0LDI1IEBACiAJcmV0dXJuIDA7CiB9CiAKKy8qKgorICogbGlua19jc3Nfc2V0IC0gYSBoZWxwZXIgZnVuY3Rpb24gdG8gbGluayBhIGNzc19zZXQgdG8gYSBjZ3JvdXAKKyAqIEB0bXBfY2dfbGlua3M6IGNnX2Nncm91cF9saW5rIG9iamVjdHMgYWxsb2NhdGVkIGJ5IGFsbG9jYXRlX2NnX2xpbmtzKCkKKyAqIEBjZzogdGhlIGNzc19zZXQgdG8gYmUgbGlua2VkCisgKiBAY2dycDogdGhlIGRlc3RpbmF0aW9uIGNncm91cAorICovCitzdGF0aWMgdm9pZCBsaW5rX2Nzc19zZXQoc3RydWN0IGxpc3RfaGVhZCAqdG1wX2NnX2xpbmtzLAorCQkJIHN0cnVjdCBjc3Nfc2V0ICpjZywgc3RydWN0IGNncm91cCAqY2dycCkKK3sKKwlzdHJ1Y3QgY2dfY2dyb3VwX2xpbmsgKmxpbms7CisKKwlCVUdfT04obGlzdF9lbXB0eSh0bXBfY2dfbGlua3MpKTsKKwlsaW5rID0gbGlzdF9maXJzdF9lbnRyeSh0bXBfY2dfbGlua3MsIHN0cnVjdCBjZ19jZ3JvdXBfbGluaywKKwkJCQljZ3JwX2xpbmtfbGlzdCk7CisJbGluay0+Y2cgPSBjZzsKKwlsaXN0X21vdmUoJmxpbmstPmNncnBfbGlua19saXN0LCAmY2dycC0+Y3NzX3NldHMpOworCWxpc3RfYWRkKCZsaW5rLT5jZ19saW5rX2xpc3QsICZjZy0+Y2dfbGlua3MpOworfQorCiAvKgogICogZmluZF9jc3Nfc2V0KCkgdGFrZXMgYW4gZXhpc3RpbmcgY2dyb3VwIGdyb3VwIGFuZCBhCiAgKiBjZ3JvdXAgb2JqZWN0LCBhbmQgcmV0dXJucyBhIGNzc19zZXQgb2JqZWN0IHRoYXQncwpAQCAtNDAwLDcgKzQxOCw2IEBACiAJaW50IGk7CiAKIAlzdHJ1Y3QgbGlzdF9oZWFkIHRtcF9jZ19saW5rczsKLQlzdHJ1Y3QgY2dfY2dyb3VwX2xpbmsgKmxpbms7CiAKIAlzdHJ1Y3QgaGxpc3RfaGVhZCAqaGhlYWQ7CiAKQEAgLTQ0NSwyNiArNDYyLDExIEBACiAJCSAqIG9ubHkgZG8gaXQgZm9yIHRoZSBmaXJzdCBzdWJzeXN0ZW0gaW4gZWFjaAogCQkgKiBoaWVyYXJjaHkKIAkJICovCi0JCWlmIChzcy0+cm9vdC0+c3Vic3lzX2xpc3QubmV4dCA9PSAmc3MtPnNpYmxpbmcpIHsKLQkJCUJVR19PTihsaXN0X2VtcHR5KCZ0bXBfY2dfbGlua3MpKTsKLQkJCWxpbmsgPSBsaXN0X2VudHJ5KHRtcF9jZ19saW5rcy5uZXh0LAotCQkJCQkgIHN0cnVjdCBjZ19jZ3JvdXBfbGluaywKLQkJCQkJICBjZ3JwX2xpbmtfbGlzdCk7Ci0JCQlsaXN0X2RlbCgmbGluay0+Y2dycF9saW5rX2xpc3QpOwotCQkJbGlzdF9hZGQoJmxpbmstPmNncnBfbGlua19saXN0LCAmY2dycC0+Y3NzX3NldHMpOwotCQkJbGluay0+Y2cgPSByZXM7Ci0JCQlsaXN0X2FkZCgmbGluay0+Y2dfbGlua19saXN0LCAmcmVzLT5jZ19saW5rcyk7Ci0JCX0KKwkJaWYgKHNzLT5yb290LT5zdWJzeXNfbGlzdC5uZXh0ID09ICZzcy0+c2libGluZykKKwkJCWxpbmtfY3NzX3NldCgmdG1wX2NnX2xpbmtzLCByZXMsIGNncnApOwogCX0KLQlpZiAobGlzdF9lbXB0eSgmcm9vdG5vZGUuc3Vic3lzX2xpc3QpKSB7Ci0JCWxpbmsgPSBsaXN0X2VudHJ5KHRtcF9jZ19saW5rcy5uZXh0LAotCQkJCSAgc3RydWN0IGNnX2Nncm91cF9saW5rLAotCQkJCSAgY2dycF9saW5rX2xpc3QpOwotCQlsaXN0X2RlbCgmbGluay0+Y2dycF9saW5rX2xpc3QpOwotCQlsaXN0X2FkZCgmbGluay0+Y2dycF9saW5rX2xpc3QsICZkdW1teXRvcC0+Y3NzX3NldHMpOwotCQlsaW5rLT5jZyA9IHJlczsKLQkJbGlzdF9hZGQoJmxpbmstPmNnX2xpbmtfbGlzdCwgJnJlcy0+Y2dfbGlua3MpOwotCX0KKwlpZiAobGlzdF9lbXB0eSgmcm9vdG5vZGUuc3Vic3lzX2xpc3QpKQorCQlsaW5rX2Nzc19zZXQoJnRtcF9jZ19saW5rcywgcmVzLCBkdW1teXRvcCk7CiAKIAlCVUdfT04oIWxpc3RfZW1wdHkoJnRtcF9jZ19saW5rcykpOwogCkBAIC01NzMsNyArNTc1LDYgQEAKIAkJaW5vZGUtPmlfbW9kZSA9IG1vZGU7CiAJCWlub2RlLT5pX3VpZCA9IGN1cnJlbnRfZnN1aWQoKTsKIAkJaW5vZGUtPmlfZ2lkID0gY3VycmVudF9mc2dpZCgpOwotCQlpbm9kZS0+aV9ibG9ja3MgPSAwOwogCQlpbm9kZS0+aV9hdGltZSA9IGlub2RlLT5pX210aW1lID0gaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUU7CiAJCWlub2RlLT5pX21hcHBpbmctPmJhY2tpbmdfZGV2X2luZm8gPSAmY2dyb3VwX2JhY2tpbmdfZGV2X2luZm87CiAJfQpAQCAtNTg4LDExICs1ODksMTggQEAKIHsKIAlzdHJ1Y3QgY2dyb3VwX3N1YnN5cyAqc3M7CiAJZm9yX2VhY2hfc3Vic3lzKGNncnAtPnJvb3QsIHNzKQotCQlpZiAoc3MtPnByZV9kZXN0cm95ICYmIGNncnAtPnN1YnN5c1tzcy0+c3Vic3lzX2lkXSkKKwkJaWYgKHNzLT5wcmVfZGVzdHJveSkKIAkJCXNzLT5wcmVfZGVzdHJveShzcywgY2dycCk7CiAJcmV0dXJuOwogfQogCitzdGF0aWMgdm9pZCBmcmVlX2Nncm91cF9yY3Uoc3RydWN0IHJjdV9oZWFkICpvYmopCit7CisJc3RydWN0IGNncm91cCAqY2dycCA9IGNvbnRhaW5lcl9vZihvYmosIHN0cnVjdCBjZ3JvdXAsIHJjdV9oZWFkKTsKKworCWtmcmVlKGNncnApOworfQorCiBzdGF0aWMgdm9pZCBjZ3JvdXBfZGlwdXQoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgaW5vZGUgKmlub2RlKQogewogCS8qIGlzIGRlbnRyeSBhIGRpcmVjdG9yeSA/IGlmIHNvLCBrZnJlZSgpIGFzc29jaWF0ZWQgY2dyb3VwICovCkBAIC02MTIsMTkgKzYyMCwxOSBAQAogCQkvKgogCQkgKiBSZWxlYXNlIHRoZSBzdWJzeXN0ZW0gc3RhdGUgb2JqZWN0cy4KIAkJICovCi0JCWZvcl9lYWNoX3N1YnN5cyhjZ3JwLT5yb290LCBzcykgewotCQkJaWYgKGNncnAtPnN1YnN5c1tzcy0+c3Vic3lzX2lkXSkKLQkJCQlzcy0+ZGVzdHJveShzcywgY2dycCk7Ci0JCX0KKwkJZm9yX2VhY2hfc3Vic3lzKGNncnAtPnJvb3QsIHNzKQorCQkJc3MtPmRlc3Ryb3koc3MsIGNncnApOwogCiAJCWNncnAtPnJvb3QtPm51bWJlcl9vZl9jZ3JvdXBzLS07CiAJCW11dGV4X3VubG9jaygmY2dyb3VwX211dGV4KTsKIAotCQkvKiBEcm9wIHRoZSBhY3RpdmUgc3VwZXJibG9jayByZWZlcmVuY2UgdGhhdCB3ZSB0b29rIHdoZW4gd2UKLQkJICogY3JlYXRlZCB0aGUgY2dyb3VwICovCisJCS8qCisJCSAqIERyb3AgdGhlIGFjdGl2ZSBzdXBlcmJsb2NrIHJlZmVyZW5jZSB0aGF0IHdlIHRvb2sgd2hlbiB3ZQorCQkgKiBjcmVhdGVkIHRoZSBjZ3JvdXAKKwkJICovCiAJCWRlYWN0aXZhdGVfc3VwZXIoY2dycC0+cm9vdC0+c2IpOwogCi0JCWtmcmVlKGNncnApOworCQljYWxsX3JjdSgmY2dycC0+cmN1X2hlYWQsIGZyZWVfY2dyb3VwX3JjdSk7CiAJfQogCWlwdXQoaW5vZGUpOwogfQpAQCAtNzE0LDIzICs3MjIsMjYgQEAKIAkJCUJVR19PTihjZ3JwLT5zdWJzeXNbaV0pOwogCQkJQlVHX09OKCFkdW1teXRvcC0+c3Vic3lzW2ldKTsKIAkJCUJVR19PTihkdW1teXRvcC0+c3Vic3lzW2ldLT5jZ3JvdXAgIT0gZHVtbXl0b3ApOworCQkJbXV0ZXhfbG9jaygmc3MtPmhpZXJhcmNoeV9tdXRleCk7CiAJCQljZ3JwLT5zdWJzeXNbaV0gPSBkdW1teXRvcC0+c3Vic3lzW2ldOwogCQkJY2dycC0+c3Vic3lzW2ldLT5jZ3JvdXAgPSBjZ3JwOwotCQkJbGlzdF9hZGQoJnNzLT5zaWJsaW5nLCAmcm9vdC0+c3Vic3lzX2xpc3QpOwotCQkJcmN1X2Fzc2lnbl9wb2ludGVyKHNzLT5yb290LCByb290KTsKKwkJCWxpc3RfbW92ZSgmc3MtPnNpYmxpbmcsICZyb290LT5zdWJzeXNfbGlzdCk7CisJCQlzcy0+cm9vdCA9IHJvb3Q7CiAJCQlpZiAoc3MtPmJpbmQpCiAJCQkJc3MtPmJpbmQoc3MsIGNncnApOwotCisJCQltdXRleF91bmxvY2soJnNzLT5oaWVyYXJjaHlfbXV0ZXgpOwogCQl9IGVsc2UgaWYgKGJpdCAmIHJlbW92ZWRfYml0cykgewogCQkJLyogV2UncmUgcmVtb3ZpbmcgdGhpcyBzdWJzeXN0ZW0gKi8KIAkJCUJVR19PTihjZ3JwLT5zdWJzeXNbaV0gIT0gZHVtbXl0b3AtPnN1YnN5c1tpXSk7CiAJCQlCVUdfT04oY2dycC0+c3Vic3lzW2ldLT5jZ3JvdXAgIT0gY2dycCk7CisJCQltdXRleF9sb2NrKCZzcy0+aGllcmFyY2h5X211dGV4KTsKIAkJCWlmIChzcy0+YmluZCkKIAkJCQlzcy0+YmluZChzcywgZHVtbXl0b3ApOwogCQkJZHVtbXl0b3AtPnN1YnN5c1tpXS0+Y2dyb3VwID0gZHVtbXl0b3A7CiAJCQljZ3JwLT5zdWJzeXNbaV0gPSBOVUxMOwotCQkJcmN1X2Fzc2lnbl9wb2ludGVyKHN1YnN5c1tpXS0+cm9vdCwgJnJvb3Rub2RlKTsKLQkJCWxpc3RfZGVsKCZzcy0+c2libGluZyk7CisJCQlzdWJzeXNbaV0tPnJvb3QgPSAmcm9vdG5vZGU7CisJCQlsaXN0X21vdmUoJnNzLT5zaWJsaW5nLCAmcm9vdG5vZGUuc3Vic3lzX2xpc3QpOworCQkJbXV0ZXhfdW5sb2NrKCZzcy0+aGllcmFyY2h5X211dGV4KTsKIAkJfSBlbHNlIGlmIChiaXQgJiBmaW5hbF9iaXRzKSB7CiAJCQkvKiBTdWJzeXN0ZW0gc3RhdGUgc2hvdWxkIGFscmVhZHkgZXhpc3QgKi8KIAkJCUJVR19PTighY2dycC0+c3Vic3lzW2ldKTsKQEAgLTk5Miw3ICsxMDAzLDcgQEAKIAkJcm9vdCA9IE5VTEw7CiAJfSBlbHNlIHsKIAkJLyogTmV3IHN1cGVyYmxvY2sgKi8KLQkJc3RydWN0IGNncm91cCAqY2dycCA9ICZyb290LT50b3BfY2dyb3VwOworCQlzdHJ1Y3QgY2dyb3VwICpyb290X2NncnAgPSAmcm9vdC0+dG9wX2Nncm91cDsKIAkJc3RydWN0IGlub2RlICppbm9kZTsKIAkJaW50IGk7CiAKQEAgLTEwMzMsNyArMTA0NCw3IEBACiAJCWxpc3RfYWRkKCZyb290LT5yb290X2xpc3QsICZyb290cyk7CiAJCXJvb3RfY291bnQrKzsKIAotCQlzYi0+c19yb290LT5kX2ZzZGF0YSA9ICZyb290LT50b3BfY2dyb3VwOworCQlzYi0+c19yb290LT5kX2ZzZGF0YSA9IHJvb3RfY2dycDsKIAkJcm9vdC0+dG9wX2Nncm91cC5kZW50cnkgPSBzYi0+c19yb290OwogCiAJCS8qIExpbmsgdGhlIHRvcCBjZ3JvdXAgaW4gdGhpcyBoaWVyYXJjaHkgaW50byBhbGwKQEAgLTEwNDQsMjkgKzEwNTUsMTggQEAKIAkJCXN0cnVjdCBobGlzdF9ub2RlICpub2RlOwogCQkJc3RydWN0IGNzc19zZXQgKmNnOwogCi0JCQlobGlzdF9mb3JfZWFjaF9lbnRyeShjZywgbm9kZSwgaGhlYWQsIGhsaXN0KSB7Ci0JCQkJc3RydWN0IGNnX2Nncm91cF9saW5rICpsaW5rOwotCi0JCQkJQlVHX09OKGxpc3RfZW1wdHkoJnRtcF9jZ19saW5rcykpOwotCQkJCWxpbmsgPSBsaXN0X2VudHJ5KHRtcF9jZ19saW5rcy5uZXh0LAotCQkJCQkJICBzdHJ1Y3QgY2dfY2dyb3VwX2xpbmssCi0JCQkJCQkgIGNncnBfbGlua19saXN0KTsKLQkJCQlsaXN0X2RlbCgmbGluay0+Y2dycF9saW5rX2xpc3QpOwotCQkJCWxpbmstPmNnID0gY2c7Ci0JCQkJbGlzdF9hZGQoJmxpbmstPmNncnBfbGlua19saXN0LAotCQkJCQkgJnJvb3QtPnRvcF9jZ3JvdXAuY3NzX3NldHMpOwotCQkJCWxpc3RfYWRkKCZsaW5rLT5jZ19saW5rX2xpc3QsICZjZy0+Y2dfbGlua3MpOwotCQkJfQorCQkJaGxpc3RfZm9yX2VhY2hfZW50cnkoY2csIG5vZGUsIGhoZWFkLCBobGlzdCkKKwkJCQlsaW5rX2Nzc19zZXQoJnRtcF9jZ19saW5rcywgY2csIHJvb3RfY2dycCk7CiAJCX0KIAkJd3JpdGVfdW5sb2NrKCZjc3Nfc2V0X2xvY2spOwogCiAJCWZyZWVfY2dfbGlua3MoJnRtcF9jZ19saW5rcyk7CiAKLQkJQlVHX09OKCFsaXN0X2VtcHR5KCZjZ3JwLT5zaWJsaW5nKSk7Ci0JCUJVR19PTighbGlzdF9lbXB0eSgmY2dycC0+Y2hpbGRyZW4pKTsKKwkJQlVHX09OKCFsaXN0X2VtcHR5KCZyb290X2NncnAtPnNpYmxpbmcpKTsKKwkJQlVHX09OKCFsaXN0X2VtcHR5KCZyb290X2NncnAtPmNoaWxkcmVuKSk7CiAJCUJVR19PTihyb290LT5udW1iZXJfb2ZfY2dyb3VwcyAhPSAxKTsKIAotCQljZ3JvdXBfcG9wdWxhdGVfZGlyKGNncnApOworCQljZ3JvdXBfcG9wdWxhdGVfZGlyKHJvb3RfY2dycCk7CiAJCW11dGV4X3VubG9jaygmaW5vZGUtPmlfbXV0ZXgpOwogCQltdXRleF91bmxvY2soJmNncm91cF9tdXRleCk7CiAJfQpAQCAtMTExNSwxMCArMTExNSw5IEBACiAJfQogCXdyaXRlX3VubG9jaygmY3NzX3NldF9sb2NrKTsKIAotCWlmICghbGlzdF9lbXB0eSgmcm9vdC0+cm9vdF9saXN0KSkgewotCQlsaXN0X2RlbCgmcm9vdC0+cm9vdF9saXN0KTsKLQkJcm9vdF9jb3VudC0tOwotCX0KKwlsaXN0X2RlbCgmcm9vdC0+cm9vdF9saXN0KTsKKwlyb290X2NvdW50LS07CisKIAltdXRleF91bmxvY2soJmNncm91cF9tdXRleCk7CiAKIAlrZnJlZShyb290KTsKQEAgLTExNDcsMTQgKzExNDYsMTYgQEAKICAqIEBidWY6IHRoZSBidWZmZXIgdG8gd3JpdGUgdGhlIHBhdGggaW50bwogICogQGJ1ZmxlbjogdGhlIGxlbmd0aCBvZiB0aGUgYnVmZmVyCiAgKgotICogQ2FsbGVkIHdpdGggY2dyb3VwX211dGV4IGhlbGQuIFdyaXRlcyBwYXRoIG9mIGNncm91cCBpbnRvIGJ1Zi4KLSAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCAtZXJybm8gb24gZXJyb3IuCisgKiBDYWxsZWQgd2l0aCBjZ3JvdXBfbXV0ZXggaGVsZCBvciBlbHNlIHdpdGggYW4gUkNVLXByb3RlY3RlZCBjZ3JvdXAKKyAqIHJlZmVyZW5jZS4gIFdyaXRlcyBwYXRoIG9mIGNncm91cCBpbnRvIGJ1Zi4gIFJldHVybnMgMCBvbiBzdWNjZXNzLAorICogLWVycm5vIG9uIGVycm9yLgogICovCiBpbnQgY2dyb3VwX3BhdGgoY29uc3Qgc3RydWN0IGNncm91cCAqY2dycCwgY2hhciAqYnVmLCBpbnQgYnVmbGVuKQogewogCWNoYXIgKnN0YXJ0OworCXN0cnVjdCBkZW50cnkgKmRlbnRyeSA9IHJjdV9kZXJlZmVyZW5jZShjZ3JwLT5kZW50cnkpOwogCi0JaWYgKGNncnAgPT0gZHVtbXl0b3ApIHsKKwlpZiAoIWRlbnRyeSB8fCBjZ3JwID09IGR1bW15dG9wKSB7CiAJCS8qCiAJCSAqIEluYWN0aXZlIHN1YnN5c3RlbXMgaGF2ZSBubyBkZW50cnkgZm9yIHRoZWlyIHJvb3QKIAkJICogY2dyb3VwCkBAIC0xMTY3LDEzICsxMTY4LDE0IEBACiAKIAkqLS1zdGFydCA9ICdcMCc7CiAJZm9yICg7OykgewotCQlpbnQgbGVuID0gY2dycC0+ZGVudHJ5LT5kX25hbWUubGVuOworCQlpbnQgbGVuID0gZGVudHJ5LT5kX25hbWUubGVuOwogCQlpZiAoKHN0YXJ0IC09IGxlbikgPCBidWYpCiAJCQlyZXR1cm4gLUVOQU1FVE9PTE9ORzsKIAkJbWVtY3B5KHN0YXJ0LCBjZ3JwLT5kZW50cnktPmRfbmFtZS5uYW1lLCBsZW4pOwogCQljZ3JwID0gY2dycC0+cGFyZW50OwogCQlpZiAoIWNncnApCiAJCQlicmVhazsKKwkJZGVudHJ5ID0gcmN1X2RlcmVmZXJlbmNlKGNncnAtPmRlbnRyeSk7CiAJCWlmICghY2dycC0+cGFyZW50KQogCQkJY29udGludWU7CiAJCWlmICgtLXN0YXJ0IDwgYnVmKQpAQCAtMTIxOCw3ICsxMjIwLDcgQEAKIAlpbnQgcmV0dmFsID0gMDsKIAlzdHJ1Y3QgY2dyb3VwX3N1YnN5cyAqc3M7CiAJc3RydWN0IGNncm91cCAqb2xkY2dycDsKLQlzdHJ1Y3QgY3NzX3NldCAqY2cgPSB0c2stPmNncm91cHM7CisJc3RydWN0IGNzc19zZXQgKmNnOwogCXN0cnVjdCBjc3Nfc2V0ICpuZXdjZzsKIAlzdHJ1Y3QgY2dyb3VwZnNfcm9vdCAqcm9vdCA9IGNncnAtPnJvb3Q7CiAJaW50IHN1YnN5c19pZDsKQEAgLTEyMzgsMTEgKzEyNDAsMTYgQEAKIAkJfQogCX0KIAorCXRhc2tfbG9jayh0c2spOworCWNnID0gdHNrLT5jZ3JvdXBzOworCWdldF9jc3Nfc2V0KGNnKTsKKwl0YXNrX3VubG9jayh0c2spOwogCS8qCiAJICogTG9jYXRlIG9yIGFsbG9jYXRlIGEgbmV3IGNzc19zZXQgZm9yIHRoaXMgdGFzaywKIAkgKiBiYXNlZCBvbiBpdHMgZmluYWwgc2V0IG9mIGNncm91cHMKIAkgKi8KIAluZXdjZyA9IGZpbmRfY3NzX3NldChjZywgY2dycCk7CisJcHV0X2Nzc19zZXQoY2cpOwogCWlmICghbmV3Y2cpCiAJCXJldHVybiAtRU5PTUVNOwogCkBAIC0xNDQ3LDcgKzE0NTQsNyBAQAogCXN0cnVjdCBjZnR5cGUgKmNmdCA9IF9fZF9jZnQoZmlsZS0+Zl9kZW50cnkpOwogCXN0cnVjdCBjZ3JvdXAgKmNncnAgPSBfX2RfY2dycChmaWxlLT5mX2RlbnRyeS0+ZF9wYXJlbnQpOwogCi0JaWYgKCFjZnQgfHwgY2dyb3VwX2lzX3JlbW92ZWQoY2dycCkpCisJaWYgKGNncm91cF9pc19yZW1vdmVkKGNncnApKQogCQlyZXR1cm4gLUVOT0RFVjsKIAlpZiAoY2Z0LT53cml0ZSkKIAkJcmV0dXJuIGNmdC0+d3JpdGUoY2dycCwgY2Z0LCBmaWxlLCBidWYsIG5ieXRlcywgcHBvcyk7CkBAIC0xNDkyLDcgKzE0OTksNyBAQAogCXN0cnVjdCBjZnR5cGUgKmNmdCA9IF9fZF9jZnQoZmlsZS0+Zl9kZW50cnkpOwogCXN0cnVjdCBjZ3JvdXAgKmNncnAgPSBfX2RfY2dycChmaWxlLT5mX2RlbnRyeS0+ZF9wYXJlbnQpOwogCi0JaWYgKCFjZnQgfHwgY2dyb3VwX2lzX3JlbW92ZWQoY2dycCkpCisJaWYgKGNncm91cF9pc19yZW1vdmVkKGNncnApKQogCQlyZXR1cm4gLUVOT0RFVjsKIAogCWlmIChjZnQtPnJlYWQpCkBAIC0xNTU2LDEwICsxNTYzLDggQEAKIAllcnIgPSBnZW5lcmljX2ZpbGVfb3Blbihpbm9kZSwgZmlsZSk7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKLQogCWNmdCA9IF9fZF9jZnQoZmlsZS0+Zl9kZW50cnkpOwotCWlmICghY2Z0KQotCQlyZXR1cm4gLUVOT0RFVjsKKwogCWlmIChjZnQtPnJlYWRfbWFwIHx8IGNmdC0+cmVhZF9zZXFfc3RyaW5nKSB7CiAJCXN0cnVjdCBjZ3JvdXBfc2VxZmlsZV9zdGF0ZSAqc3RhdGUgPQogCQkJa3phbGxvYyhzaXplb2YoKnN0YXRlKSwgR0ZQX1VTRVIpOwpAQCAtMTY3Myw3ICsxNjc4LDcgQEAKIAlpZiAoIWVycm9yKSB7CiAJCWRlbnRyeS0+ZF9mc2RhdGEgPSBjZ3JwOwogCQlpbmNfbmxpbmsocGFyZW50LT5kX2lub2RlKTsKLQkJY2dycC0+ZGVudHJ5ID0gZGVudHJ5OworCQlyY3VfYXNzaWduX3BvaW50ZXIoY2dycC0+ZGVudHJ5LCBkZW50cnkpOwogCQlkZ2V0KGRlbnRyeSk7CiAJfQogCWRwdXQoZGVudHJ5KTsKQEAgLTE4MTQsNiArMTgxOSw3IEBACiB7CiAJc3RydWN0IHRhc2tfc3RydWN0ICpyZXM7CiAJc3RydWN0IGxpc3RfaGVhZCAqbCA9IGl0LT50YXNrOworCXN0cnVjdCBjZ19jZ3JvdXBfbGluayAqbGluazsKIAogCS8qIElmIHRoZSBpdGVyYXRvciBjZyBpcyBOVUxMLCB3ZSBoYXZlIG5vIHRhc2tzICovCiAJaWYgKCFpdC0+Y2dfbGluaykKQEAgLTE4MjEsNyArMTgyNyw4IEBACiAJcmVzID0gbGlzdF9lbnRyeShsLCBzdHJ1Y3QgdGFza19zdHJ1Y3QsIGNnX2xpc3QpOwogCS8qIEFkdmFuY2UgaXRlcmF0b3IgdG8gZmluZCBuZXh0IGVudHJ5ICovCiAJbCA9IGwtPm5leHQ7Ci0JaWYgKGwgPT0gJnJlcy0+Y2dyb3Vwcy0+dGFza3MpIHsKKwlsaW5rID0gbGlzdF9lbnRyeShpdC0+Y2dfbGluaywgc3RydWN0IGNnX2Nncm91cF9saW5rLCBjZ3JwX2xpbmtfbGlzdCk7CisJaWYgKGwgPT0gJmxpbmstPmNnLT50YXNrcykgewogCQkvKiBXZSByZWFjaGVkIHRoZSBlbmQgb2YgdGhpcyB0YXNrIGxpc3QgLSBtb3ZlIG9uIHRvCiAJCSAqIHRoZSBuZXh0IGNnX2Nncm91cF9saW5rICovCiAJCWNncm91cF9hZHZhbmNlX2l0ZXIoY2dycCwgaXQpOwpAQCAtMjAxNSwxNCArMjAyMiwxNiBAQAogICovCiBzdGF0aWMgaW50IHBpZF9hcnJheV9sb2FkKHBpZF90ICpwaWRhcnJheSwgaW50IG5waWRzLCBzdHJ1Y3QgY2dyb3VwICpjZ3JwKQogewotCWludCBuID0gMDsKKwlpbnQgbiA9IDAsIHBpZDsKIAlzdHJ1Y3QgY2dyb3VwX2l0ZXIgaXQ7CiAJc3RydWN0IHRhc2tfc3RydWN0ICp0c2s7CiAJY2dyb3VwX2l0ZXJfc3RhcnQoY2dycCwgJml0KTsKIAl3aGlsZSAoKHRzayA9IGNncm91cF9pdGVyX25leHQoY2dycCwgJml0KSkpIHsKIAkJaWYgKHVubGlrZWx5KG4gPT0gbnBpZHMpKQogCQkJYnJlYWs7Ci0JCXBpZGFycmF5W24rK10gPSB0YXNrX3BpZF92bnIodHNrKTsKKwkJcGlkID0gdGFza19waWRfdm5yKHRzayk7CisJCWlmIChwaWQgPiAwKQorCQkJcGlkYXJyYXlbbisrXSA9IHBpZDsKIAl9CiAJY2dyb3VwX2l0ZXJfZW5kKGNncnAsICZpdCk7CiAJcmV0dXJuIG47CkBAIC0yMDU0LDcgKzIwNjMsNiBAQAogCiAJcmV0ID0gMDsKIAljZ3JwID0gZGVudHJ5LT5kX2ZzZGF0YTsKLQlyY3VfcmVhZF9sb2NrKCk7CiAKIAljZ3JvdXBfaXRlcl9zdGFydChjZ3JwLCAmaXQpOwogCXdoaWxlICgodHNrID0gY2dyb3VwX2l0ZXJfbmV4dChjZ3JwLCAmaXQpKSkgewpAQCAtMjA3OSw3ICsyMDg3LDYgQEAKIAl9CiAJY2dyb3VwX2l0ZXJfZW5kKGNncnAsICZpdCk7CiAKLQlyY3VfcmVhZF91bmxvY2soKTsKIGVycjoKIAlyZXR1cm4gcmV0OwogfQpAQCAtMjMyNiw3ICsyMzMzLDcgQEAKIAkJCSAgICAgICBzdHJ1Y3QgY2dyb3VwICpjZ3JwKQogewogCWNzcy0+Y2dyb3VwID0gY2dycDsKLQlhdG9taWNfc2V0KCZjc3MtPnJlZmNudCwgMCk7CisJYXRvbWljX3NldCgmY3NzLT5yZWZjbnQsIDEpOwogCWNzcy0+ZmxhZ3MgPSAwOwogCWlmIChjZ3JwID09IGR1bW15dG9wKQogCQlzZXRfYml0KENTU19ST09ULCAmY3NzLT5mbGFncyk7CkBAIC0yMzM0LDYgKzIzNDEsMjkgQEAKIAljZ3JwLT5zdWJzeXNbc3MtPnN1YnN5c19pZF0gPSBjc3M7CiB9CiAKK3N0YXRpYyB2b2lkIGNncm91cF9sb2NrX2hpZXJhcmNoeShzdHJ1Y3QgY2dyb3VwZnNfcm9vdCAqcm9vdCkKK3sKKwkvKiBXZSBuZWVkIHRvIHRha2UgZWFjaCBoaWVyYXJjaHlfbXV0ZXggaW4gYSBjb25zaXN0ZW50IG9yZGVyICovCisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQ0dST1VQX1NVQlNZU19DT1VOVDsgaSsrKSB7CisJCXN0cnVjdCBjZ3JvdXBfc3Vic3lzICpzcyA9IHN1YnN5c1tpXTsKKwkJaWYgKHNzLT5yb290ID09IHJvb3QpCisJCQltdXRleF9sb2NrX25lc3RlZCgmc3MtPmhpZXJhcmNoeV9tdXRleCwgaSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBjZ3JvdXBfdW5sb2NrX2hpZXJhcmNoeShzdHJ1Y3QgY2dyb3VwZnNfcm9vdCAqcm9vdCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBDR1JPVVBfU1VCU1lTX0NPVU5UOyBpKyspIHsKKwkJc3RydWN0IGNncm91cF9zdWJzeXMgKnNzID0gc3Vic3lzW2ldOworCQlpZiAoc3MtPnJvb3QgPT0gcm9vdCkKKwkJCW11dGV4X3VubG9jaygmc3MtPmhpZXJhcmNoeV9tdXRleCk7CisJfQorfQorCiAvKgogICogY2dyb3VwX2NyZWF0ZSAtIGNyZWF0ZSBhIGNncm91cAogICogQHBhcmVudDogY2dyb3VwIHRoYXQgd2lsbCBiZSBwYXJlbnQgb2YgdGhlIG5ldyBjZ3JvdXAKQEAgLTIzODIsNyArMjQxMiw5IEBACiAJCWluaXRfY2dyb3VwX2Nzcyhjc3MsIHNzLCBjZ3JwKTsKIAl9CiAKKwljZ3JvdXBfbG9ja19oaWVyYXJjaHkocm9vdCk7CiAJbGlzdF9hZGQoJmNncnAtPnNpYmxpbmcsICZjZ3JwLT5wYXJlbnQtPmNoaWxkcmVuKTsKKwljZ3JvdXBfdW5sb2NrX2hpZXJhcmNoeShyb290KTsKIAlyb290LT5udW1iZXJfb2ZfY2dyb3VwcysrOwogCiAJZXJyID0gY2dyb3VwX2NyZWF0ZV9kaXIoY2dycCwgZGVudHJ5LCBtb2RlKTsKQEAgLTI0MzMsNyArMjQ2NSw3IEBACiB7CiAJLyogQ2hlY2sgdGhlIHJlZmVyZW5jZSBjb3VudCBvbiBlYWNoIHN1YnN5c3RlbS4gU2luY2Ugd2UKIAkgKiBhbHJlYWR5IGVzdGFibGlzaGVkIHRoYXQgdGhlcmUgYXJlIG5vIHRhc2tzIGluIHRoZQotCSAqIGNncm91cCwgaWYgdGhlIGNzcyByZWZjb3VudCBpcyBhbHNvIDAsIHRoZW4gdGhlcmUgc2hvdWxkCisJICogY2dyb3VwLCBpZiB0aGUgY3NzIHJlZmNvdW50IGlzIGFsc28gMSwgdGhlbiB0aGVyZSBzaG91bGQKIAkgKiBiZSBubyBvdXRzdGFuZGluZyByZWZlcmVuY2VzLCBzbyB0aGUgc3Vic3lzdGVtIGlzIHNhZmUgdG8KIAkgKiBkZXN0cm95LiBXZSBzY2FuIGFjcm9zcyBhbGwgc3Vic3lzdGVtcyByYXRoZXIgdGhhbiB1c2luZwogCSAqIHRoZSBwZXItaGllcmFyY2h5IGxpbmtlZCBsaXN0IG9mIG1vdW50ZWQgc3Vic3lzdGVtcyBzaW5jZQpAQCAtMjQ1NCwxOSArMjQ4Niw2NyBAQAogCQkgKiBtYXR0ZXIsIHNpbmNlIGl0IGNhbiBvbmx5IGhhcHBlbiBpZiB0aGUgY2dyb3VwCiAJCSAqIGhhcyBiZWVuIGRlbGV0ZWQgYW5kIGhlbmNlIG5vIGxvbmdlciBuZWVkcyB0aGUKIAkJICogcmVsZWFzZSBhZ2VudCB0byBiZSBjYWxsZWQgYW55d2F5LiAqLwotCQlpZiAoY3NzICYmIGF0b21pY19yZWFkKCZjc3MtPnJlZmNudCkpCisJCWlmIChjc3MgJiYgKGF0b21pY19yZWFkKCZjc3MtPnJlZmNudCkgPiAxKSkKIAkJCXJldHVybiAxOwogCX0KIAlyZXR1cm4gMDsKIH0KIAorLyoKKyAqIEF0b21pY2FsbHkgbWFyayBhbGwgKG9yIGVsc2Ugbm9uZSkgb2YgdGhlIGNncm91cCdzIENTUyBvYmplY3RzIGFzCisgKiBDU1NfUkVNT1ZFRC4gUmV0dXJuIHRydWUgb24gc3VjY2Vzcywgb3IgZmFsc2UgaWYgdGhlIGNncm91cCBoYXMKKyAqIGJ1c3kgc3Vic3lzdGVtcy4gQ2FsbCB3aXRoIGNncm91cF9tdXRleCBoZWxkCisgKi8KKworc3RhdGljIGludCBjZ3JvdXBfY2xlYXJfY3NzX3JlZnMoc3RydWN0IGNncm91cCAqY2dycCkKK3sKKwlzdHJ1Y3QgY2dyb3VwX3N1YnN5cyAqc3M7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlib29sIGZhaWxlZCA9IGZhbHNlOworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlmb3JfZWFjaF9zdWJzeXMoY2dycC0+cm9vdCwgc3MpIHsKKwkJc3RydWN0IGNncm91cF9zdWJzeXNfc3RhdGUgKmNzcyA9IGNncnAtPnN1YnN5c1tzcy0+c3Vic3lzX2lkXTsKKwkJaW50IHJlZmNudDsKKwkJZG8geworCQkJLyogV2UgY2FuIG9ubHkgcmVtb3ZlIGEgQ1NTIHdpdGggYSByZWZjbnQ9PTEgKi8KKwkJCXJlZmNudCA9IGF0b21pY19yZWFkKCZjc3MtPnJlZmNudCk7CisJCQlpZiAocmVmY250ID4gMSkgeworCQkJCWZhaWxlZCA9IHRydWU7CisJCQkJZ290byBkb25lOworCQkJfQorCQkJQlVHX09OKCFyZWZjbnQpOworCQkJLyoKKwkJCSAqIERyb3AgdGhlIHJlZmNudCB0byAwIHdoaWxlIHdlIGNoZWNrIG90aGVyCisJCQkgKiBzdWJzeXN0ZW1zLiBUaGlzIHdpbGwgY2F1c2UgYW55IHJhY2luZworCQkJICogY3NzX3RyeWdldCgpIHRvIHNwaW4gdW50aWwgd2Ugc2V0IHRoZQorCQkJICogQ1NTX1JFTU9WRUQgYml0cyBvciBhYm9ydAorCQkJICovCisJCX0gd2hpbGUgKGF0b21pY19jbXB4Y2hnKCZjc3MtPnJlZmNudCwgcmVmY250LCAwKSAhPSByZWZjbnQpOworCX0KKyBkb25lOgorCWZvcl9lYWNoX3N1YnN5cyhjZ3JwLT5yb290LCBzcykgeworCQlzdHJ1Y3QgY2dyb3VwX3N1YnN5c19zdGF0ZSAqY3NzID0gY2dycC0+c3Vic3lzW3NzLT5zdWJzeXNfaWRdOworCQlpZiAoZmFpbGVkKSB7CisJCQkvKgorCQkJICogUmVzdG9yZSBvbGQgcmVmY250IGlmIHdlIHByZXZpb3VzbHkgbWFuYWdlZAorCQkJICogdG8gY2xlYXIgaXQgZnJvbSAxIHRvIDAKKwkJCSAqLworCQkJaWYgKCFhdG9taWNfcmVhZCgmY3NzLT5yZWZjbnQpKQorCQkJCWF0b21pY19zZXQoJmNzcy0+cmVmY250LCAxKTsKKwkJfSBlbHNlIHsKKwkJCS8qIENvbW1pdCB0aGUgZmFjdCB0aGF0IHRoZSBDU1MgaXMgcmVtb3ZlZCAqLworCQkJc2V0X2JpdChDU1NfUkVNT1ZFRCwgJmNzcy0+ZmxhZ3MpOworCQl9CisJfQorCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwlyZXR1cm4gIWZhaWxlZDsKK30KKwogc3RhdGljIGludCBjZ3JvdXBfcm1kaXIoc3RydWN0IGlub2RlICp1bnVzZWRfZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCiB7CiAJc3RydWN0IGNncm91cCAqY2dycCA9IGRlbnRyeS0+ZF9mc2RhdGE7CiAJc3RydWN0IGRlbnRyeSAqZDsKIAlzdHJ1Y3QgY2dyb3VwICpwYXJlbnQ7Ci0Jc3RydWN0IHN1cGVyX2Jsb2NrICpzYjsKLQlzdHJ1Y3QgY2dyb3VwZnNfcm9vdCAqcm9vdDsKIAogCS8qIHRoZSB2ZnMgaG9sZHMgYm90aCBpbm9kZS0+aV9tdXRleCBhbHJlYWR5ICovCiAKQEAgLTI0ODksMTIgKzI1NjksMTAgQEAKIAogCW11dGV4X2xvY2soJmNncm91cF9tdXRleCk7CiAJcGFyZW50ID0gY2dycC0+cGFyZW50OwotCXJvb3QgPSBjZ3JwLT5yb290OwotCXNiID0gcm9vdC0+c2I7CiAKIAlpZiAoYXRvbWljX3JlYWQoJmNncnAtPmNvdW50KQogCSAgICB8fCAhbGlzdF9lbXB0eSgmY2dycC0+Y2hpbGRyZW4pCi0JICAgIHx8IGNncm91cF9oYXNfY3NzX3JlZnMoY2dycCkpIHsKKwkgICAgfHwgIWNncm91cF9jbGVhcl9jc3NfcmVmcyhjZ3JwKSkgewogCQltdXRleF91bmxvY2soJmNncm91cF9tdXRleCk7CiAJCXJldHVybiAtRUJVU1k7CiAJfQpAQCAtMjUwNCw4ICsyNTgyLDEyIEBACiAJaWYgKCFsaXN0X2VtcHR5KCZjZ3JwLT5yZWxlYXNlX2xpc3QpKQogCQlsaXN0X2RlbCgmY2dycC0+cmVsZWFzZV9saXN0KTsKIAlzcGluX3VubG9jaygmcmVsZWFzZV9saXN0X2xvY2spOwotCS8qIGRlbGV0ZSBteSBzaWJsaW5nIGZyb20gcGFyZW50LT5jaGlsZHJlbiAqLworCisJY2dyb3VwX2xvY2tfaGllcmFyY2h5KGNncnAtPnJvb3QpOworCS8qIGRlbGV0ZSB0aGlzIGNncm91cCBmcm9tIHBhcmVudC0+Y2hpbGRyZW4gKi8KIAlsaXN0X2RlbCgmY2dycC0+c2libGluZyk7CisJY2dyb3VwX3VubG9ja19oaWVyYXJjaHkoY2dycC0+cm9vdCk7CisKIAlzcGluX2xvY2soJmNncnAtPmRlbnRyeS0+ZF9sb2NrKTsKIAlkID0gZGdldChjZ3JwLT5kZW50cnkpOwogCXNwaW5fdW5sb2NrKCZkLT5kX2xvY2spOwpAQCAtMjUyNyw2ICsyNjA5LDcgQEAKIAlwcmludGsoS0VSTl9JTkZPICJJbml0aWFsaXppbmcgY2dyb3VwIHN1YnN5cyAlc1xuIiwgc3MtPm5hbWUpOwogCiAJLyogQ3JlYXRlIHRoZSB0b3AgY2dyb3VwIHN0YXRlIGZvciB0aGlzIHN1YnN5c3RlbSAqLworCWxpc3RfYWRkKCZzcy0+c2libGluZywgJnJvb3Rub2RlLnN1YnN5c19saXN0KTsKIAlzcy0+cm9vdCA9ICZyb290bm9kZTsKIAljc3MgPSBzcy0+Y3JlYXRlKHNzLCBkdW1teXRvcCk7CiAJLyogV2UgZG9uJ3QgaGFuZGxlIGVhcmx5IGZhaWx1cmVzIGdyYWNlZnVsbHkgKi8KQEAgLTI1NDAsMTMgKzI2MjMsMTMgQEAKIAlpbml0X2Nzc19zZXQuc3Vic3lzW3NzLT5zdWJzeXNfaWRdID0gZHVtbXl0b3AtPnN1YnN5c1tzcy0+c3Vic3lzX2lkXTsKIAogCW5lZWRfZm9ya2V4aXRfY2FsbGJhY2sgfD0gc3MtPmZvcmsgfHwgc3MtPmV4aXQ7Ci0JbmVlZF9tbV9vd25lcl9jYWxsYmFjayB8PSAhIXNzLT5tbV9vd25lcl9jaGFuZ2VkOwogCiAJLyogQXQgc3lzdGVtIGJvb3QsIGJlZm9yZSBhbGwgc3Vic3lzdGVtcyBoYXZlIGJlZW4KIAkgKiByZWdpc3RlcmVkLCBubyB0YXNrcyBoYXZlIGJlZW4gZm9ya2VkLCBzbyB3ZSBkb24ndAogCSAqIG5lZWQgdG8gaW52b2tlIGZvcmsgY2FsbGJhY2tzIGhlcmUuICovCiAJQlVHX09OKCFsaXN0X2VtcHR5KCZpbml0X3Rhc2sudGFza3MpKTsKIAorCW11dGV4X2luaXQoJnNzLT5oaWVyYXJjaHlfbXV0ZXgpOwogCXNzLT5hY3RpdmUgPSAxOwogfQogCkBAIC0yNTY1LDcgKzI2NDgsNiBAQAogCUlOSVRfSExJU1RfTk9ERSgmaW5pdF9jc3Nfc2V0LmhsaXN0KTsKIAljc3Nfc2V0X2NvdW50ID0gMTsKIAlpbml0X2Nncm91cF9yb290KCZyb290bm9kZSk7Ci0JbGlzdF9hZGQoJnJvb3Rub2RlLnJvb3RfbGlzdCwgJnJvb3RzKTsKIAlyb290X2NvdW50ID0gMTsKIAlpbml0X3Rhc2suY2dyb3VwcyA9ICZpbml0X2Nzc19zZXQ7CiAKQEAgLTI2NzIsMTUgKzI3NTQsMTIgQEAKIAogCW11dGV4X2xvY2soJmNncm91cF9tdXRleCk7CiAKLQlmb3JfZWFjaF9yb290KHJvb3QpIHsKKwlmb3JfZWFjaF9hY3RpdmVfcm9vdChyb290KSB7CiAJCXN0cnVjdCBjZ3JvdXBfc3Vic3lzICpzczsKIAkJc3RydWN0IGNncm91cCAqY2dycDsKIAkJaW50IHN1YnN5c19pZDsKIAkJaW50IGNvdW50ID0gMDsKIAotCQkvKiBTa2lwIHRoaXMgaGllcmFyY2h5IGlmIGl0IGhhcyBubyBhY3RpdmUgc3Vic3lzdGVtcyAqLwotCQlpZiAoIXJvb3QtPmFjdHVhbF9zdWJzeXNfYml0cykKLQkJCWNvbnRpbnVlOwogCQlzZXFfcHJpbnRmKG0sICIlbHU6Iiwgcm9vdC0+c3Vic3lzX2JpdHMpOwogCQlmb3JfZWFjaF9zdWJzeXMocm9vdCwgc3MpCiAJCQlzZXFfcHJpbnRmKG0sICIlcyVzIiwgY291bnQrKyA/ICIsIiA6ICIiLCBzcy0+bmFtZSk7CkBAIC0yNzkwLDM3ICsyODY5LDYgQEAKIAl9CiB9CiAKLSNpZmRlZiBDT05GSUdfTU1fT1dORVIKLS8qKgotICogY2dyb3VwX21tX293bmVyX2NhbGxiYWNrcyAtIHJ1biBjYWxsYmFja3Mgd2hlbiB0aGUgbW0tPm93bmVyIGNoYW5nZXMKLSAqIEBwOiB0aGUgbmV3IG93bmVyCi0gKgotICogQ2FsbGVkIG9uIGV2ZXJ5IGNoYW5nZSB0byBtbS0+b3duZXIuIG1tX2luaXRfb3duZXIoKSBkb2VzIG5vdAotICogaW52b2tlIHRoaXMgcm91dGluZSwgc2luY2UgaXQgYXNzaWducyB0aGUgbW0tPm93bmVyIHRoZSBmaXJzdCB0aW1lCi0gKiBhbmQgZG9lcyBub3QgY2hhbmdlIGl0LgotICoKLSAqIFRoZSBjYWxsYmFja3MgYXJlIGludm9rZWQgd2l0aCBtbWFwX3NlbSBoZWxkIGluIHJlYWQgbW9kZS4KLSAqLwotdm9pZCBjZ3JvdXBfbW1fb3duZXJfY2FsbGJhY2tzKHN0cnVjdCB0YXNrX3N0cnVjdCAqb2xkLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKm5ldykKLXsKLQlzdHJ1Y3QgY2dyb3VwICpvbGRjZ3JwLCAqbmV3Y2dycCA9IE5VTEw7Ci0KLQlpZiAobmVlZF9tbV9vd25lcl9jYWxsYmFjaykgewotCQlpbnQgaTsKLQkJZm9yIChpID0gMDsgaSA8IENHUk9VUF9TVUJTWVNfQ09VTlQ7IGkrKykgewotCQkJc3RydWN0IGNncm91cF9zdWJzeXMgKnNzID0gc3Vic3lzW2ldOwotCQkJb2xkY2dycCA9IHRhc2tfY2dyb3VwKG9sZCwgc3MtPnN1YnN5c19pZCk7Ci0JCQlpZiAobmV3KQotCQkJCW5ld2NncnAgPSB0YXNrX2Nncm91cChuZXcsIHNzLT5zdWJzeXNfaWQpOwotCQkJaWYgKG9sZGNncnAgPT0gbmV3Y2dycCkKLQkJCQljb250aW51ZTsKLQkJCWlmIChzcy0+bW1fb3duZXJfY2hhbmdlZCkKLQkJCQlzcy0+bW1fb3duZXJfY2hhbmdlZChzcywgb2xkY2dycCwgbmV3Y2dycCwgbmV3KTsKLQkJfQotCX0KLX0KLSNlbmRpZiAvKiBDT05GSUdfTU1fT1dORVIgKi8KLQogLyoqCiAgKiBjZ3JvdXBfcG9zdF9mb3JrIC0gY2FsbGVkIG9uIGEgbmV3IHRhc2sgYWZ0ZXIgYWRkaW5nIGl0IHRvIHRoZSB0YXNrIGxpc3QKICAqIEBjaGlsZDogdGhlIHRhc2sgaW4gcXVlc3Rpb24KQEAgLTI4MzQsOCArMjg4MiwxMCBAQAogewogCWlmICh1c2VfdGFza19jc3Nfc2V0X2xpbmtzKSB7CiAJCXdyaXRlX2xvY2soJmNzc19zZXRfbG9jayk7CisJCXRhc2tfbG9jayhjaGlsZCk7CiAJCWlmIChsaXN0X2VtcHR5KCZjaGlsZC0+Y2dfbGlzdCkpCiAJCQlsaXN0X2FkZCgmY2hpbGQtPmNnX2xpc3QsICZjaGlsZC0+Y2dyb3Vwcy0+dGFza3MpOworCQl0YXNrX3VubG9jayhjaGlsZCk7CiAJCXdyaXRlX3VubG9jaygmY3NzX3NldF9sb2NrKTsKIAl9CiB9CkBAIC0yOTQxLDYgKzI5OTEsNyBAQAogCQltdXRleF91bmxvY2soJmNncm91cF9tdXRleCk7CiAJCXJldHVybiAwOwogCX0KKwl0YXNrX2xvY2sodHNrKTsKIAljZyA9IHRzay0+Y2dyb3VwczsKIAlwYXJlbnQgPSB0YXNrX2Nncm91cCh0c2ssIHN1YnN5cy0+c3Vic3lzX2lkKTsKIApAQCAtMjk1Myw2ICszMDA0LDcgQEAKIAogCS8qIEtlZXAgdGhlIGNncm91cCBhbGl2ZSAqLwogCWdldF9jc3Nfc2V0KGNnKTsKKwl0YXNrX3VubG9jayh0c2spOwogCW11dGV4X3VubG9jaygmY2dyb3VwX211dGV4KTsKIAogCS8qIE5vdyBkbyB0aGUgVkZTIHdvcmsgdG8gY3JlYXRlIGEgY2dyb3VwICovCkBAIC0yOTcxLDcgKzMwMjMsNyBAQAogCX0KIAogCS8qIENyZWF0ZSB0aGUgY2dyb3VwIGRpcmVjdG9yeSwgd2hpY2ggYWxzbyBjcmVhdGVzIHRoZSBjZ3JvdXAgKi8KLQlyZXQgPSB2ZnNfbWtkaXIoaW5vZGUsIGRlbnRyeSwgU19JRkRJUiB8IDA3NTUpOworCXJldCA9IHZmc19ta2Rpcihpbm9kZSwgZGVudHJ5LCAwNzU1KTsKIAljaGlsZCA9IF9fZF9jZ3JwKGRlbnRyeSk7CiAJZHB1dChkZW50cnkpOwogCWlmIChyZXQpIHsKQEAgLTI5ODEsMTMgKzMwMzMsNiBAQAogCQlnb3RvIG91dF9yZWxlYXNlOwogCX0KIAotCWlmICghY2hpbGQpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTwotCQkgICAgICAgIkNvdWxkbid0IGZpbmQgbmV3IGNncm91cCAlc1xuIiwgbm9kZW5hbWUpOwotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIG91dF9yZWxlYXNlOwotCX0KLQogCS8qIFRoZSBjZ3JvdXAgbm93IGV4aXN0cy4gUmV0YWtlIGNncm91cF9tdXRleCBhbmQgY2hlY2sKIAkgKiB0aGF0IHdlJ3JlIHN0aWxsIGluIHRoZSBzYW1lIHN0YXRlIHRoYXQgd2UgdGhvdWdodCB3ZQogCSAqIHdlcmUuICovCkBAIC0zMDgzLDcgKzMxMjgsOCBAQAogewogCXN0cnVjdCBjZ3JvdXAgKmNncnAgPSBjc3MtPmNncm91cDsKIAlyY3VfcmVhZF9sb2NrKCk7Ci0JaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmNzcy0+cmVmY250KSAmJiBub3RpZnlfb25fcmVsZWFzZShjZ3JwKSkgeworCWlmICgoYXRvbWljX2RlY19yZXR1cm4oJmNzcy0+cmVmY250KSA9PSAxKSAmJgorCSAgICBub3RpZnlfb25fcmVsZWFzZShjZ3JwKSkgewogCQlzZXRfYml0KENHUlBfUkVMRUFTQUJMRSwgJmNncnAtPmZsYWdzKTsKIAkJY2hlY2tfZm9yX3JlbGVhc2UoY2dycCk7CiAJfQpkaWZmIC0tZ2l0IGEva2VybmVsL2NvbXBhdC5jIGIva2VybmVsL2NvbXBhdC5jCmluZGV4IGQ1MmUyZWMuLjQyZDU2NTQgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9jb21wYXQuYworKysgYi9rZXJuZWwvY29tcGF0LmMKQEAgLTI0LDYgKzI0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9taWdyYXRlLmg+CiAjaW5jbHVkZSA8bGludXgvcG9zaXgtdGltZXJzLmg+CiAjaW5jbHVkZSA8bGludXgvdGltZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KIAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAKQEAgLTIyOSw2ICsyMzAsNyBAQAogCQlpZiAoY29weV90b191c2VyKHRidWYsICZ0bXAsIHNpemVvZih0bXApKSkKIAkJCXJldHVybiAtRUZBVUxUOwogCX0KKwlmb3JjZV9zdWNjZXNzZnVsX3N5c2NhbGxfcmV0dXJuKCk7CiAJcmV0dXJuIGNvbXBhdF9qaWZmaWVzX3RvX2Nsb2NrX3QoamlmZmllcyk7CiB9CiAKQEAgLTg5NCw4ICs4OTYsOSBAQAogCiAJaWYgKHRsb2MpIHsKIAkJaWYgKHB1dF91c2VyKGksdGxvYykpCi0JCQlpID0gLUVGQVVMVDsKKwkJCXJldHVybiAtRUZBVUxUOwogCX0KKwlmb3JjZV9zdWNjZXNzZnVsX3N5c2NhbGxfcmV0dXJuKCk7CiAJcmV0dXJuIGk7CiB9CiAKZGlmZiAtLWdpdCBhL2tlcm5lbC9jcHUuYyBiL2tlcm5lbC9jcHUuYwppbmRleCA0N2ZmZjNiLi43OWU0MGYwIDEwMDY0NAotLS0gYS9rZXJuZWwvY3B1LmMKKysrIGIva2VybmVsL2NwdS5jCkBAIC0yNjksOCArMjY5LDExIEBACiAKIGludCBfX3JlZiBjcHVfZG93bih1bnNpZ25lZCBpbnQgY3B1KQogewotCWludCBlcnIgPSAwOworCWludCBlcnI7CiAKKwllcnIgPSBzdG9wX21hY2hpbmVfY3JlYXRlKCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKIAljcHVfbWFwc191cGRhdGVfYmVnaW4oKTsKIAogCWlmIChjcHVfaG90cGx1Z19kaXNhYmxlZCkgewpAQCAtMjk3LDYgKzMwMCw3IEBACiAKIG91dDoKIAljcHVfbWFwc191cGRhdGVfZG9uZSgpOworCXN0b3BfbWFjaGluZV9kZXN0cm95KCk7CiAJcmV0dXJuIGVycjsKIH0KIEVYUE9SVF9TWU1CT0woY3B1X2Rvd24pOwpAQCAtMzc1LDggKzM3OSwxMSBAQAogCiBpbnQgZGlzYWJsZV9ub25ib290X2NwdXModm9pZCkKIHsKLQlpbnQgY3B1LCBmaXJzdF9jcHUsIGVycm9yID0gMDsKKwlpbnQgY3B1LCBmaXJzdF9jcHUsIGVycm9yOwogCisJZXJyb3IgPSBzdG9wX21hY2hpbmVfY3JlYXRlKCk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CiAJY3B1X21hcHNfdXBkYXRlX2JlZ2luKCk7CiAJZmlyc3RfY3B1ID0gY3B1bWFza19maXJzdChjcHVfb25saW5lX21hc2spOwogCS8qIFdlIHRha2UgZG93biBhbGwgb2YgdGhlIG5vbi1ib290IENQVXMgaW4gb25lIHNob3QgdG8gYXZvaWQgcmFjZXMKQEAgLTQwNSw2ICs0MTIsNyBAQAogCQlwcmludGsoS0VSTl9FUlIgIk5vbi1ib290IENQVXMgYXJlIG5vdCBkaXNhYmxlZFxuIik7CiAJfQogCWNwdV9tYXBzX3VwZGF0ZV9kb25lKCk7CisJc3RvcF9tYWNoaW5lX2Rlc3Ryb3koKTsKIAlyZXR1cm4gZXJyb3I7CiB9CiAKZGlmZiAtLWdpdCBhL2tlcm5lbC9jcHVzZXQuYyBiL2tlcm5lbC9jcHVzZXQuYwppbmRleCAzOWMxYTRjLi42NDdjNzdhIDEwMDY0NAotLS0gYS9rZXJuZWwvY3B1c2V0LmMKKysrIGIva2VybmVsL2NwdXNldC5jCkBAIC04NCw3ICs4NCw3IEBACiAJc3RydWN0IGNncm91cF9zdWJzeXNfc3RhdGUgY3NzOwogCiAJdW5zaWduZWQgbG9uZyBmbGFnczsJCS8qICJ1bnNpZ25lZCBsb25nIiBzbyBiaXRvcHMgd29yayAqLwotCWNwdW1hc2tfdCBjcHVzX2FsbG93ZWQ7CQkvKiBDUFVzIGFsbG93ZWQgdG8gdGFza3MgaW4gY3B1c2V0ICovCisJY3B1bWFza192YXJfdCBjcHVzX2FsbG93ZWQ7CS8qIENQVXMgYWxsb3dlZCB0byB0YXNrcyBpbiBjcHVzZXQgKi8KIAlub2RlbWFza190IG1lbXNfYWxsb3dlZDsJLyogTWVtb3J5IE5vZGVzIGFsbG93ZWQgdG8gdGFza3MgKi8KIAogCXN0cnVjdCBjcHVzZXQgKnBhcmVudDsJCS8qIG15IHBhcmVudCAqLwpAQCAtMTk1LDggKzE5NSw2IEBACiAKIHN0YXRpYyBzdHJ1Y3QgY3B1c2V0IHRvcF9jcHVzZXQgPSB7CiAJLmZsYWdzID0gKCgxIDw8IENTX0NQVV9FWENMVVNJVkUpIHwgKDEgPDwgQ1NfTUVNX0VYQ0xVU0lWRSkpLAotCS5jcHVzX2FsbG93ZWQgPSBDUFVfTUFTS19BTEwsCi0JLm1lbXNfYWxsb3dlZCA9IE5PREVfTUFTS19BTEwsCiB9OwogCiAvKgpAQCAtMjQwLDYgKzIzOCwxNyBAQAogc3RhdGljIERFRklORV9NVVRFWChjYWxsYmFja19tdXRleCk7CiAKIC8qCisgKiBjcHVzZXRfYnVmZmVyX2xvY2sgcHJvdGVjdHMgYm90aCB0aGUgY3B1c2V0X25hbWUgYW5kIGNwdXNldF9ub2RlbGlzdAorICogYnVmZmVycy4gIFRoZXkgYXJlIHN0YXRpY2FsbHkgYWxsb2NhdGVkIHRvIHByZXZlbnQgdXNpbmcgZXhjZXNzIHN0YWNrCisgKiB3aGVuIGNhbGxpbmcgY3B1c2V0X3ByaW50X3Rhc2tfbWVtc19hbGxvd2VkKCkuCisgKi8KKyNkZWZpbmUgQ1BVU0VUX05BTUVfTEVOCQkoMTI4KQorI2RlZmluZQlDUFVTRVRfTk9ERUxJU1RfTEVOCSgyNTYpCitzdGF0aWMgY2hhciBjcHVzZXRfbmFtZVtDUFVTRVRfTkFNRV9MRU5dOworc3RhdGljIGNoYXIgY3B1c2V0X25vZGVsaXN0W0NQVVNFVF9OT0RFTElTVF9MRU5dOworc3RhdGljIERFRklORV9TUElOTE9DSyhjcHVzZXRfYnVmZmVyX2xvY2spOworCisvKgogICogVGhpcyBpcyB1Z2x5LCBidXQgcHJlc2VydmVzIHRoZSB1c2Vyc3BhY2UgQVBJIGZvciBleGlzdGluZyBjcHVzZXQKICAqIHVzZXJzLiBJZiBzb21lb25lIHRyaWVzIHRvIG1vdW50IHRoZSAiY3B1c2V0IiBmaWxlc3lzdGVtLCB3ZQogICogc2lsZW50bHkgc3dpdGNoIGl0IHRvIG1vdW50ICJjZ3JvdXAiIGluc3RlYWQKQEAgLTI2Nyw3ICsyNzYsNyBAQAogfTsKIAogLyoKLSAqIFJldHVybiBpbiAqcG1hc2sgdGhlIHBvcnRpb24gb2YgYSBjcHVzZXRzJ3MgY3B1c19hbGxvd2VkIHRoYXQKKyAqIFJldHVybiBpbiBwbWFzayB0aGUgcG9ydGlvbiBvZiBhIGNwdXNldHMncyBjcHVzX2FsbG93ZWQgdGhhdAogICogYXJlIG9ubGluZS4gIElmIG5vbmUgYXJlIG9ubGluZSwgd2FsayB1cCB0aGUgY3B1c2V0IGhpZXJhcmNoeQogICogdW50aWwgd2UgZmluZCBvbmUgdGhhdCBkb2VzIGhhdmUgc29tZSBvbmxpbmUgY3B1cy4gIElmIHdlIGdldAogICogYWxsIHRoZSB3YXkgdG8gdGhlIHRvcCBhbmQgc3RpbGwgaGF2ZW4ndCBmb3VuZCBhbnkgb25saW5lIGNwdXMsCkBAIC0yODAsMTUgKzI4OSwxNiBAQAogICogQ2FsbCB3aXRoIGNhbGxiYWNrX211dGV4IGhlbGQuCiAgKi8KIAotc3RhdGljIHZvaWQgZ3VhcmFudGVlX29ubGluZV9jcHVzKGNvbnN0IHN0cnVjdCBjcHVzZXQgKmNzLCBjcHVtYXNrX3QgKnBtYXNrKQorc3RhdGljIHZvaWQgZ3VhcmFudGVlX29ubGluZV9jcHVzKGNvbnN0IHN0cnVjdCBjcHVzZXQgKmNzLAorCQkJCSAgc3RydWN0IGNwdW1hc2sgKnBtYXNrKQogewotCXdoaWxlIChjcyAmJiAhY3B1c19pbnRlcnNlY3RzKGNzLT5jcHVzX2FsbG93ZWQsIGNwdV9vbmxpbmVfbWFwKSkKKwl3aGlsZSAoY3MgJiYgIWNwdW1hc2tfaW50ZXJzZWN0cyhjcy0+Y3B1c19hbGxvd2VkLCBjcHVfb25saW5lX21hc2spKQogCQljcyA9IGNzLT5wYXJlbnQ7CiAJaWYgKGNzKQotCQljcHVzX2FuZCgqcG1hc2ssIGNzLT5jcHVzX2FsbG93ZWQsIGNwdV9vbmxpbmVfbWFwKTsKKwkJY3B1bWFza19hbmQocG1hc2ssIGNzLT5jcHVzX2FsbG93ZWQsIGNwdV9vbmxpbmVfbWFzayk7CiAJZWxzZQotCQkqcG1hc2sgPSBjcHVfb25saW5lX21hcDsKLQlCVUdfT04oIWNwdXNfaW50ZXJzZWN0cygqcG1hc2ssIGNwdV9vbmxpbmVfbWFwKSk7CisJCWNwdW1hc2tfY29weShwbWFzaywgY3B1X29ubGluZV9tYXNrKTsKKwlCVUdfT04oIWNwdW1hc2tfaW50ZXJzZWN0cyhwbWFzaywgY3B1X29ubGluZV9tYXNrKSk7CiB9CiAKIC8qCkBAIC0zNjQsMTQgKzM3NCw5IEBACiAJc3RydWN0IHRhc2tfc3RydWN0ICp0c2sgPSBjdXJyZW50OwogCXN0cnVjdCBjcHVzZXQgKmNzOwogCi0JaWYgKHRhc2tfY3ModHNrKSA9PSAmdG9wX2NwdXNldCkgewotCQkvKiBEb24ndCBuZWVkIHJjdSBmb3IgdG9wX2NwdXNldC4gIEl0J3MgbmV2ZXIgZnJlZWQuICovCi0JCW15X2NwdXNldHNfbWVtX2dlbiA9IHRvcF9jcHVzZXQubWVtc19nZW5lcmF0aW9uOwotCX0gZWxzZSB7Ci0JCXJjdV9yZWFkX2xvY2soKTsKLQkJbXlfY3B1c2V0c19tZW1fZ2VuID0gdGFza19jcyh0c2spLT5tZW1zX2dlbmVyYXRpb247Ci0JCXJjdV9yZWFkX3VubG9jaygpOwotCX0KKwlyY3VfcmVhZF9sb2NrKCk7CisJbXlfY3B1c2V0c19tZW1fZ2VuID0gdGFza19jcyh0c2spLT5tZW1zX2dlbmVyYXRpb247CisJcmN1X3JlYWRfdW5sb2NrKCk7CiAKIAlpZiAobXlfY3B1c2V0c19tZW1fZ2VuICE9IHRzay0+Y3B1c2V0X21lbXNfZ2VuZXJhdGlvbikgewogCQltdXRleF9sb2NrKCZjYWxsYmFja19tdXRleCk7CkBAIC00MDMsMTIgKzQwOCw0MyBAQAogCiBzdGF0aWMgaW50IGlzX2NwdXNldF9zdWJzZXQoY29uc3Qgc3RydWN0IGNwdXNldCAqcCwgY29uc3Qgc3RydWN0IGNwdXNldCAqcSkKIHsKLQlyZXR1cm4JY3B1c19zdWJzZXQocC0+Y3B1c19hbGxvd2VkLCBxLT5jcHVzX2FsbG93ZWQpICYmCisJcmV0dXJuCWNwdW1hc2tfc3Vic2V0KHAtPmNwdXNfYWxsb3dlZCwgcS0+Y3B1c19hbGxvd2VkKSAmJgogCQlub2Rlc19zdWJzZXQocC0+bWVtc19hbGxvd2VkLCBxLT5tZW1zX2FsbG93ZWQpICYmCiAJCWlzX2NwdV9leGNsdXNpdmUocCkgPD0gaXNfY3B1X2V4Y2x1c2l2ZShxKSAmJgogCQlpc19tZW1fZXhjbHVzaXZlKHApIDw9IGlzX21lbV9leGNsdXNpdmUocSk7CiB9CiAKKy8qKgorICogYWxsb2NfdHJpYWxfY3B1c2V0IC0gYWxsb2NhdGUgYSB0cmlhbCBjcHVzZXQKKyAqIEBjczogdGhlIGNwdXNldCB0aGF0IHRoZSB0cmlhbCBjcHVzZXQgZHVwbGljYXRlcworICovCitzdGF0aWMgc3RydWN0IGNwdXNldCAqYWxsb2NfdHJpYWxfY3B1c2V0KGNvbnN0IHN0cnVjdCBjcHVzZXQgKmNzKQoreworCXN0cnVjdCBjcHVzZXQgKnRyaWFsOworCisJdHJpYWwgPSBrbWVtZHVwKGNzLCBzaXplb2YoKmNzKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCF0cmlhbCkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoIWFsbG9jX2NwdW1hc2tfdmFyKCZ0cmlhbC0+Y3B1c19hbGxvd2VkLCBHRlBfS0VSTkVMKSkgeworCQlrZnJlZSh0cmlhbCk7CisJCXJldHVybiBOVUxMOworCX0KKwljcHVtYXNrX2NvcHkodHJpYWwtPmNwdXNfYWxsb3dlZCwgY3MtPmNwdXNfYWxsb3dlZCk7CisKKwlyZXR1cm4gdHJpYWw7Cit9CisKKy8qKgorICogZnJlZV90cmlhbF9jcHVzZXQgLSBmcmVlIHRoZSB0cmlhbCBjcHVzZXQKKyAqIEB0cmlhbDogdGhlIHRyaWFsIGNwdXNldCB0byBiZSBmcmVlZAorICovCitzdGF0aWMgdm9pZCBmcmVlX3RyaWFsX2NwdXNldChzdHJ1Y3QgY3B1c2V0ICp0cmlhbCkKK3sKKwlmcmVlX2NwdW1hc2tfdmFyKHRyaWFsLT5jcHVzX2FsbG93ZWQpOworCWtmcmVlKHRyaWFsKTsKK30KKwogLyoKICAqIHZhbGlkYXRlX2NoYW5nZSgpIC0gVXNlZCB0byB2YWxpZGF0ZSB0aGF0IGFueSBwcm9wb3NlZCBjcHVzZXQgY2hhbmdlCiAgKgkJICAgICAgIGZvbGxvd3MgdGhlIHN0cnVjdHVyYWwgcnVsZXMgZm9yIGNwdXNldHMuCkBAIC00NTgsNyArNDk0LDcgQEAKIAkJYyA9IGNncm91cF9jcyhjb250KTsKIAkJaWYgKChpc19jcHVfZXhjbHVzaXZlKHRyaWFsKSB8fCBpc19jcHVfZXhjbHVzaXZlKGMpKSAmJgogCQkgICAgYyAhPSBjdXIgJiYKLQkJICAgIGNwdXNfaW50ZXJzZWN0cyh0cmlhbC0+Y3B1c19hbGxvd2VkLCBjLT5jcHVzX2FsbG93ZWQpKQorCQkgICAgY3B1bWFza19pbnRlcnNlY3RzKHRyaWFsLT5jcHVzX2FsbG93ZWQsIGMtPmNwdXNfYWxsb3dlZCkpCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJaWYgKChpc19tZW1fZXhjbHVzaXZlKHRyaWFsKSB8fCBpc19tZW1fZXhjbHVzaXZlKGMpKSAmJgogCQkgICAgYyAhPSBjdXIgJiYKQEAgLTQ2OCw3ICs1MDQsNyBAQAogCiAJLyogQ3B1c2V0cyB3aXRoIHRhc2tzIGNhbid0IGhhdmUgZW1wdHkgY3B1c19hbGxvd2VkIG9yIG1lbXNfYWxsb3dlZCAqLwogCWlmIChjZ3JvdXBfdGFza19jb3VudChjdXItPmNzcy5jZ3JvdXApKSB7Ci0JCWlmIChjcHVzX2VtcHR5KHRyaWFsLT5jcHVzX2FsbG93ZWQpIHx8CisJCWlmIChjcHVtYXNrX2VtcHR5KHRyaWFsLT5jcHVzX2FsbG93ZWQpIHx8CiAJCSAgICBub2Rlc19lbXB0eSh0cmlhbC0+bWVtc19hbGxvd2VkKSkgewogCQkJcmV0dXJuIC1FTk9TUEM7CiAJCX0KQEAgLTQ4Myw3ICs1MTksNyBAQAogICovCiBzdGF0aWMgaW50IGNwdXNldHNfb3ZlcmxhcChzdHJ1Y3QgY3B1c2V0ICphLCBzdHJ1Y3QgY3B1c2V0ICpiKQogewotCXJldHVybiBjcHVzX2ludGVyc2VjdHMoYS0+Y3B1c19hbGxvd2VkLCBiLT5jcHVzX2FsbG93ZWQpOworCXJldHVybiBjcHVtYXNrX2ludGVyc2VjdHMoYS0+Y3B1c19hbGxvd2VkLCBiLT5jcHVzX2FsbG93ZWQpOwogfQogCiBzdGF0aWMgdm9pZApAQCAtNTA4LDcgKzU0NCw3IEBACiAJCWNwID0gbGlzdF9maXJzdF9lbnRyeSgmcSwgc3RydWN0IGNwdXNldCwgc3RhY2tfbGlzdCk7CiAJCWxpc3RfZGVsKHEubmV4dCk7CiAKLQkJaWYgKGNwdXNfZW1wdHkoY3AtPmNwdXNfYWxsb3dlZCkpCisJCWlmIChjcHVtYXNrX2VtcHR5KGNwLT5jcHVzX2FsbG93ZWQpKQogCQkJY29udGludWU7CiAKIAkJaWYgKGlzX3NjaGVkX2xvYWRfYmFsYW5jZShjcCkpCkBAIC01NzUsNyArNjExLDggQEAKICAqCWVsZW1lbnQgb2YgdGhlIHBhcnRpdGlvbiAob25lIHNjaGVkIGRvbWFpbikgdG8gYmUgcGFzc2VkIHRvCiAgKglwYXJ0aXRpb25fc2NoZWRfZG9tYWlucygpLgogICovCi1zdGF0aWMgaW50IGdlbmVyYXRlX3NjaGVkX2RvbWFpbnMoY3B1bWFza190ICoqZG9tYWlucywKKy8qIEZJWE1FOiBzZWUgdGhlIEZJWE1FIGluIHBhcnRpdGlvbl9zY2hlZF9kb21haW5zKCkgKi8KK3N0YXRpYyBpbnQgZ2VuZXJhdGVfc2NoZWRfZG9tYWlucyhzdHJ1Y3QgY3B1bWFzayAqKmRvbWFpbnMsCiAJCQlzdHJ1Y3Qgc2NoZWRfZG9tYWluX2F0dHIgKiphdHRyaWJ1dGVzKQogewogCUxJU1RfSEVBRChxKTsJCS8qIHF1ZXVlIG9mIGNwdXNldHMgdG8gYmUgc2Nhbm5lZCAqLwpAQCAtNTgzLDEwICs2MjAsMTAgQEAKIAlzdHJ1Y3QgY3B1c2V0ICoqY3NhOwkvKiBhcnJheSBvZiBhbGwgY3B1c2V0IHB0cnMgKi8KIAlpbnQgY3NuOwkJLyogaG93IG1hbnkgY3B1c2V0IHB0cnMgaW4gY3NhIHNvIGZhciAqLwogCWludCBpLCBqLCBrOwkJLyogaW5kaWNlcyBmb3IgcGFydGl0aW9uIGZpbmRpbmcgbG9vcHMgKi8KLQljcHVtYXNrX3QgKmRvbXM7CS8qIHJlc3VsdGluZyBwYXJ0aXRpb247IGkuZS4gc2NoZWQgZG9tYWlucyAqLworCXN0cnVjdCBjcHVtYXNrICpkb21zOwkvKiByZXN1bHRpbmcgcGFydGl0aW9uOyBpLmUuIHNjaGVkIGRvbWFpbnMgKi8KIAlzdHJ1Y3Qgc2NoZWRfZG9tYWluX2F0dHIgKmRhdHRyOyAgLyogYXR0cmlidXRlcyBmb3IgY3VzdG9tIGRvbWFpbnMgKi8KIAlpbnQgbmRvbXMgPSAwOwkJLyogbnVtYmVyIG9mIHNjaGVkIGRvbWFpbnMgaW4gcmVzdWx0ICovCi0JaW50IG5zbG90OwkJLyogbmV4dCBlbXB0eSBkb21zW10gY3B1bWFza190IHNsb3QgKi8KKwlpbnQgbnNsb3Q7CQkvKiBuZXh0IGVtcHR5IGRvbXNbXSBzdHJ1Y3QgY3B1bWFzayBzbG90ICovCiAKIAlkb21zID0gTlVMTDsKIAlkYXR0ciA9IE5VTEw7CkBAIC01OTQsNyArNjMxLDcgQEAKIAogCS8qIFNwZWNpYWwgY2FzZSBmb3IgdGhlIDk5JSBvZiBzeXN0ZW1zIHdpdGggb25lLCBmdWxsLCBzY2hlZCBkb21haW4gKi8KIAlpZiAoaXNfc2NoZWRfbG9hZF9iYWxhbmNlKCZ0b3BfY3B1c2V0KSkgewotCQlkb21zID0ga21hbGxvYyhzaXplb2YoY3B1bWFza190KSwgR0ZQX0tFUk5FTCk7CisJCWRvbXMgPSBrbWFsbG9jKGNwdW1hc2tfc2l6ZSgpLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCFkb21zKQogCQkJZ290byBkb25lOwogCkBAIC02MDMsNyArNjQwLDcgQEAKIAkJCSpkYXR0ciA9IFNEX0FUVFJfSU5JVDsKIAkJCXVwZGF0ZV9kb21haW5fYXR0cl90cmVlKGRhdHRyLCAmdG9wX2NwdXNldCk7CiAJCX0KLQkJKmRvbXMgPSB0b3BfY3B1c2V0LmNwdXNfYWxsb3dlZDsKKwkJY3B1bWFza19jb3B5KGRvbXMsIHRvcF9jcHVzZXQuY3B1c19hbGxvd2VkKTsKIAogCQluZG9tcyA9IDE7CiAJCWdvdG8gZG9uZTsKQEAgLTYyMiw3ICs2NTksNyBAQAogCQljcCA9IGxpc3RfZmlyc3RfZW50cnkoJnEsIHN0cnVjdCBjcHVzZXQsIHN0YWNrX2xpc3QpOwogCQlsaXN0X2RlbChxLm5leHQpOwogCi0JCWlmIChjcHVzX2VtcHR5KGNwLT5jcHVzX2FsbG93ZWQpKQorCQlpZiAoY3B1bWFza19lbXB0eShjcC0+Y3B1c19hbGxvd2VkKSkKIAkJCWNvbnRpbnVlOwogCiAJCS8qCkBAIC02NzMsNyArNzEwLDcgQEAKIAkgKiBOb3cgd2Uga25vdyBob3cgbWFueSBkb21haW5zIHRvIGNyZWF0ZS4KIAkgKiBDb252ZXJ0IDxjc24sIGNzYT4gdG8gPG5kb21zLCBkb21zPiBhbmQgcG9wdWxhdGUgY3B1IG1hc2tzLgogCSAqLwotCWRvbXMgPSBrbWFsbG9jKG5kb21zICogc2l6ZW9mKGNwdW1hc2tfdCksIEdGUF9LRVJORUwpOworCWRvbXMgPSBrbWFsbG9jKG5kb21zICogY3B1bWFza19zaXplKCksIEdGUF9LRVJORUwpOwogCWlmICghZG9tcykKIAkJZ290byBkb25lOwogCkBAIC02ODUsNyArNzIyLDcgQEAKIAogCWZvciAobnNsb3QgPSAwLCBpID0gMDsgaSA8IGNzbjsgaSsrKSB7CiAJCXN0cnVjdCBjcHVzZXQgKmEgPSBjc2FbaV07Ci0JCWNwdW1hc2tfdCAqZHA7CisJCXN0cnVjdCBjcHVtYXNrICpkcDsKIAkJaW50IGFwbiA9IGEtPnBuOwogCiAJCWlmIChhcG4gPCAwKSB7CkBAIC03MDgsMTQgKzc0NSwxNCBAQAogCQkJY29udGludWU7CiAJCX0KIAotCQljcHVzX2NsZWFyKCpkcCk7CisJCWNwdW1hc2tfY2xlYXIoZHApOwogCQlpZiAoZGF0dHIpCiAJCQkqKGRhdHRyICsgbnNsb3QpID0gU0RfQVRUUl9JTklUOwogCQlmb3IgKGogPSBpOyBqIDwgY3NuOyBqKyspIHsKIAkJCXN0cnVjdCBjcHVzZXQgKmIgPSBjc2Fbal07CiAKIAkJCWlmIChhcG4gPT0gYi0+cG4pIHsKLQkJCQljcHVzX29yKCpkcCwgKmRwLCBiLT5jcHVzX2FsbG93ZWQpOworCQkJCWNwdW1hc2tfb3IoZHAsIGRwLCBiLT5jcHVzX2FsbG93ZWQpOwogCQkJCWlmIChkYXR0cikKIAkJCQkJdXBkYXRlX2RvbWFpbl9hdHRyX3RyZWUoZGF0dHIgKyBuc2xvdCwgYik7CiAKQEAgLTc1NSw3ICs3OTIsNyBAQAogc3RhdGljIHZvaWQgZG9fcmVidWlsZF9zY2hlZF9kb21haW5zKHN0cnVjdCB3b3JrX3N0cnVjdCAqdW51c2VkKQogewogCXN0cnVjdCBzY2hlZF9kb21haW5fYXR0ciAqYXR0cjsKLQljcHVtYXNrX3QgKmRvbXM7CisJc3RydWN0IGNwdW1hc2sgKmRvbXM7CiAJaW50IG5kb21zOwogCiAJZ2V0X29ubGluZV9jcHVzKCk7CkBAIC04MjQsNyArODYxLDcgQEAKIHN0YXRpYyBpbnQgY3B1c2V0X3Rlc3RfY3B1bWFzayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywKIAkJCSAgICAgICBzdHJ1Y3QgY2dyb3VwX3NjYW5uZXIgKnNjYW4pCiB7Ci0JcmV0dXJuICFjcHVzX2VxdWFsKHRzay0+Y3B1c19hbGxvd2VkLAorCXJldHVybiAhY3B1bWFza19lcXVhbCgmdHNrLT5jcHVzX2FsbG93ZWQsCiAJCQkoY2dyb3VwX2NzKHNjYW4tPmNnKSktPmNwdXNfYWxsb3dlZCk7CiB9CiAKQEAgLTg0Miw3ICs4NzksNyBAQAogc3RhdGljIHZvaWQgY3B1c2V0X2NoYW5nZV9jcHVtYXNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLAogCQkJCSAgc3RydWN0IGNncm91cF9zY2FubmVyICpzY2FuKQogewotCXNldF9jcHVzX2FsbG93ZWRfcHRyKHRzaywgJigoY2dyb3VwX2NzKHNjYW4tPmNnKSktPmNwdXNfYWxsb3dlZCkpOworCXNldF9jcHVzX2FsbG93ZWRfcHRyKHRzaywgKChjZ3JvdXBfY3Moc2Nhbi0+Y2cpKS0+Y3B1c19hbGxvd2VkKSk7CiB9CiAKIC8qKgpAQCAtODc0LDEwICs5MTEsMTAgQEAKICAqIEBjczogdGhlIGNwdXNldCB0byBjb25zaWRlcgogICogQGJ1ZjogYnVmZmVyIG9mIGNwdSBudW1iZXJzIHdyaXR0ZW4gdG8gdGhpcyBjcHVzZXQKICAqLwotc3RhdGljIGludCB1cGRhdGVfY3B1bWFzayhzdHJ1Y3QgY3B1c2V0ICpjcywgY29uc3QgY2hhciAqYnVmKQorc3RhdGljIGludCB1cGRhdGVfY3B1bWFzayhzdHJ1Y3QgY3B1c2V0ICpjcywgc3RydWN0IGNwdXNldCAqdHJpYWxjcywKKwkJCSAgY29uc3QgY2hhciAqYnVmKQogewogCXN0cnVjdCBwdHJfaGVhcCBoZWFwOwotCXN0cnVjdCBjcHVzZXQgdHJpYWxjczsKIAlpbnQgcmV0dmFsOwogCWludCBpc19sb2FkX2JhbGFuY2VkOwogCkBAIC04ODUsOCArOTIyLDYgQEAKIAlpZiAoY3MgPT0gJnRvcF9jcHVzZXQpCiAJCXJldHVybiAtRUFDQ0VTOwogCi0JdHJpYWxjcyA9ICpjczsKLQogCS8qCiAJICogQW4gZW1wdHkgY3B1c19hbGxvd2VkIGlzIG9rIG9ubHkgaWYgdGhlIGNwdXNldCBoYXMgbm8gdGFza3MuCiAJICogU2luY2UgY3B1bGlzdF9wYXJzZSgpIGZhaWxzIG9uIGFuIGVtcHR5IG1hc2ssIHdlIHNwZWNpYWwgY2FzZQpAQCAtODk0LDMxICs5MjksMzEgQEAKIAkgKiB3aXRoIHRhc2tzIGhhdmUgY3B1cy4KIAkgKi8KIAlpZiAoISpidWYpIHsKLQkJY3B1c19jbGVhcih0cmlhbGNzLmNwdXNfYWxsb3dlZCk7CisJCWNwdW1hc2tfY2xlYXIodHJpYWxjcy0+Y3B1c19hbGxvd2VkKTsKIAl9IGVsc2UgewotCQlyZXR2YWwgPSBjcHVsaXN0X3BhcnNlKGJ1ZiwgJnRyaWFsY3MuY3B1c19hbGxvd2VkKTsKKwkJcmV0dmFsID0gY3B1bGlzdF9wYXJzZShidWYsIHRyaWFsY3MtPmNwdXNfYWxsb3dlZCk7CiAJCWlmIChyZXR2YWwgPCAwKQogCQkJcmV0dXJuIHJldHZhbDsKIAotCQlpZiAoIWNwdXNfc3Vic2V0KHRyaWFsY3MuY3B1c19hbGxvd2VkLCBjcHVfb25saW5lX21hcCkpCisJCWlmICghY3B1bWFza19zdWJzZXQodHJpYWxjcy0+Y3B1c19hbGxvd2VkLCBjcHVfb25saW5lX21hc2spKQogCQkJcmV0dXJuIC1FSU5WQUw7CiAJfQotCXJldHZhbCA9IHZhbGlkYXRlX2NoYW5nZShjcywgJnRyaWFsY3MpOworCXJldHZhbCA9IHZhbGlkYXRlX2NoYW5nZShjcywgdHJpYWxjcyk7CiAJaWYgKHJldHZhbCA8IDApCiAJCXJldHVybiByZXR2YWw7CiAKIAkvKiBOb3RoaW5nIHRvIGRvIGlmIHRoZSBjcHVzIGRpZG4ndCBjaGFuZ2UgKi8KLQlpZiAoY3B1c19lcXVhbChjcy0+Y3B1c19hbGxvd2VkLCB0cmlhbGNzLmNwdXNfYWxsb3dlZCkpCisJaWYgKGNwdW1hc2tfZXF1YWwoY3MtPmNwdXNfYWxsb3dlZCwgdHJpYWxjcy0+Y3B1c19hbGxvd2VkKSkKIAkJcmV0dXJuIDA7CiAKIAlyZXR2YWwgPSBoZWFwX2luaXQoJmhlYXAsIFBBR0VfU0laRSwgR0ZQX0tFUk5FTCwgTlVMTCk7CiAJaWYgKHJldHZhbCkKIAkJcmV0dXJuIHJldHZhbDsKIAotCWlzX2xvYWRfYmFsYW5jZWQgPSBpc19zY2hlZF9sb2FkX2JhbGFuY2UoJnRyaWFsY3MpOworCWlzX2xvYWRfYmFsYW5jZWQgPSBpc19zY2hlZF9sb2FkX2JhbGFuY2UodHJpYWxjcyk7CiAKIAltdXRleF9sb2NrKCZjYWxsYmFja19tdXRleCk7Ci0JY3MtPmNwdXNfYWxsb3dlZCA9IHRyaWFsY3MuY3B1c19hbGxvd2VkOworCWNwdW1hc2tfY29weShjcy0+Y3B1c19hbGxvd2VkLCB0cmlhbGNzLT5jcHVzX2FsbG93ZWQpOwogCW11dGV4X3VubG9jaygmY2FsbGJhY2tfbXV0ZXgpOwogCiAJLyoKQEAgLTEwMDYsNyArMTA0MSw3IEBACiAJY3B1c2V0X2JlaW5nX3JlYm91bmQgPSBjczsJCS8qIGNhdXNlcyBtcG9sX2R1cCgpIHJlYmluZCAqLwogCiAJZnVkZ2UgPSAxMDsJCQkJLyogc3BhcmUgbW1hcnJheVtdIHNsb3RzICovCi0JZnVkZ2UgKz0gY3B1c193ZWlnaHQoY3MtPmNwdXNfYWxsb3dlZCk7CS8qIGltYWdpbmUgb25lIGZvcmstYm9tYi9jcHUgKi8KKwlmdWRnZSArPSBjcHVtYXNrX3dlaWdodChjcy0+Y3B1c19hbGxvd2VkKTsvKiBpbWFnaW5lIDEgZm9yay1ib21iL2NwdSAqLwogCXJldHZhbCA9IC1FTk9NRU07CiAKIAkvKgpAQCAtMTA5Myw5ICsxMTI4LDkgQEAKICAqIGxvY2sgZWFjaCBzdWNoIHRhc2tzIG1tLT5tbWFwX3NlbSwgc2NhbiBpdHMgdm1hJ3MgYW5kIHJlYmluZAogICogdGhlaXIgbWVtcG9saWNpZXMgdG8gdGhlIGNwdXNldHMgbmV3IG1lbXNfYWxsb3dlZC4KICAqLwotc3RhdGljIGludCB1cGRhdGVfbm9kZW1hc2soc3RydWN0IGNwdXNldCAqY3MsIGNvbnN0IGNoYXIgKmJ1ZikKK3N0YXRpYyBpbnQgdXBkYXRlX25vZGVtYXNrKHN0cnVjdCBjcHVzZXQgKmNzLCBzdHJ1Y3QgY3B1c2V0ICp0cmlhbGNzLAorCQkJICAgY29uc3QgY2hhciAqYnVmKQogewotCXN0cnVjdCBjcHVzZXQgdHJpYWxjczsKIAlub2RlbWFza190IG9sZG1lbTsKIAlpbnQgcmV0dmFsOwogCkBAIC0xMTA2LDggKzExNDEsNiBAQAogCWlmIChjcyA9PSAmdG9wX2NwdXNldCkKIAkJcmV0dXJuIC1FQUNDRVM7CiAKLQl0cmlhbGNzID0gKmNzOwotCiAJLyoKIAkgKiBBbiBlbXB0eSBtZW1zX2FsbG93ZWQgaXMgb2sgaWZmIHRoZXJlIGFyZSBubyB0YXNrcyBpbiB0aGUgY3B1c2V0LgogCSAqIFNpbmNlIG5vZGVsaXN0X3BhcnNlKCkgZmFpbHMgb24gYW4gZW1wdHkgbWFzaywgd2Ugc3BlY2lhbCBjYXNlCkBAIC0xMTE1LDI3ICsxMTQ4LDI3IEBACiAJICogd2l0aCB0YXNrcyBoYXZlIG1lbW9yeS4KIAkgKi8KIAlpZiAoISpidWYpIHsKLQkJbm9kZXNfY2xlYXIodHJpYWxjcy5tZW1zX2FsbG93ZWQpOworCQlub2Rlc19jbGVhcih0cmlhbGNzLT5tZW1zX2FsbG93ZWQpOwogCX0gZWxzZSB7Ci0JCXJldHZhbCA9IG5vZGVsaXN0X3BhcnNlKGJ1ZiwgdHJpYWxjcy5tZW1zX2FsbG93ZWQpOworCQlyZXR2YWwgPSBub2RlbGlzdF9wYXJzZShidWYsIHRyaWFsY3MtPm1lbXNfYWxsb3dlZCk7CiAJCWlmIChyZXR2YWwgPCAwKQogCQkJZ290byBkb25lOwogCi0JCWlmICghbm9kZXNfc3Vic2V0KHRyaWFsY3MubWVtc19hbGxvd2VkLAorCQlpZiAoIW5vZGVzX3N1YnNldCh0cmlhbGNzLT5tZW1zX2FsbG93ZWQsCiAJCQkJbm9kZV9zdGF0ZXNbTl9ISUdIX01FTU9SWV0pKQogCQkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCW9sZG1lbSA9IGNzLT5tZW1zX2FsbG93ZWQ7Ci0JaWYgKG5vZGVzX2VxdWFsKG9sZG1lbSwgdHJpYWxjcy5tZW1zX2FsbG93ZWQpKSB7CisJaWYgKG5vZGVzX2VxdWFsKG9sZG1lbSwgdHJpYWxjcy0+bWVtc19hbGxvd2VkKSkgewogCQlyZXR2YWwgPSAwOwkJLyogVG9vIGVhc3kgLSBub3RoaW5nIHRvIGRvICovCiAJCWdvdG8gZG9uZTsKIAl9Ci0JcmV0dmFsID0gdmFsaWRhdGVfY2hhbmdlKGNzLCAmdHJpYWxjcyk7CisJcmV0dmFsID0gdmFsaWRhdGVfY2hhbmdlKGNzLCB0cmlhbGNzKTsKIAlpZiAocmV0dmFsIDwgMCkKIAkJZ290byBkb25lOwogCiAJbXV0ZXhfbG9jaygmY2FsbGJhY2tfbXV0ZXgpOwotCWNzLT5tZW1zX2FsbG93ZWQgPSB0cmlhbGNzLm1lbXNfYWxsb3dlZDsKKwljcy0+bWVtc19hbGxvd2VkID0gdHJpYWxjcy0+bWVtc19hbGxvd2VkOwogCWNzLT5tZW1zX2dlbmVyYXRpb24gPSBjcHVzZXRfbWVtc19nZW5lcmF0aW9uKys7CiAJbXV0ZXhfdW5sb2NrKCZjYWxsYmFja19tdXRleCk7CiAKQEAgLTExNTYsNyArMTE4OSw4IEBACiAKIAlpZiAodmFsICE9IGNzLT5yZWxheF9kb21haW5fbGV2ZWwpIHsKIAkJY3MtPnJlbGF4X2RvbWFpbl9sZXZlbCA9IHZhbDsKLQkJaWYgKCFjcHVzX2VtcHR5KGNzLT5jcHVzX2FsbG93ZWQpICYmIGlzX3NjaGVkX2xvYWRfYmFsYW5jZShjcykpCisJCWlmICghY3B1bWFza19lbXB0eShjcy0+Y3B1c19hbGxvd2VkKSAmJgorCQkgICAgaXNfc2NoZWRfbG9hZF9iYWxhbmNlKGNzKSkKIAkJCWFzeW5jX3JlYnVpbGRfc2NoZWRfZG9tYWlucygpOwogCX0KIApAQCAtMTE3NSwzMSArMTIwOSwzNiBAQAogc3RhdGljIGludCB1cGRhdGVfZmxhZyhjcHVzZXRfZmxhZ2JpdHNfdCBiaXQsIHN0cnVjdCBjcHVzZXQgKmNzLAogCQkgICAgICAgaW50IHR1cm5pbmdfb24pCiB7Ci0Jc3RydWN0IGNwdXNldCB0cmlhbGNzOworCXN0cnVjdCBjcHVzZXQgKnRyaWFsY3M7CiAJaW50IGVycjsKIAlpbnQgYmFsYW5jZV9mbGFnX2NoYW5nZWQ7CiAKLQl0cmlhbGNzID0gKmNzOwotCWlmICh0dXJuaW5nX29uKQotCQlzZXRfYml0KGJpdCwgJnRyaWFsY3MuZmxhZ3MpOwotCWVsc2UKLQkJY2xlYXJfYml0KGJpdCwgJnRyaWFsY3MuZmxhZ3MpOworCXRyaWFsY3MgPSBhbGxvY190cmlhbF9jcHVzZXQoY3MpOworCWlmICghdHJpYWxjcykKKwkJcmV0dXJuIC1FTk9NRU07CiAKLQllcnIgPSB2YWxpZGF0ZV9jaGFuZ2UoY3MsICZ0cmlhbGNzKTsKKwlpZiAodHVybmluZ19vbikKKwkJc2V0X2JpdChiaXQsICZ0cmlhbGNzLT5mbGFncyk7CisJZWxzZQorCQljbGVhcl9iaXQoYml0LCAmdHJpYWxjcy0+ZmxhZ3MpOworCisJZXJyID0gdmFsaWRhdGVfY2hhbmdlKGNzLCB0cmlhbGNzKTsKIAlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIGVycjsKKwkJZ290byBvdXQ7CiAKIAliYWxhbmNlX2ZsYWdfY2hhbmdlZCA9IChpc19zY2hlZF9sb2FkX2JhbGFuY2UoY3MpICE9Ci0JCSAJCQlpc19zY2hlZF9sb2FkX2JhbGFuY2UoJnRyaWFsY3MpKTsKKwkJCQlpc19zY2hlZF9sb2FkX2JhbGFuY2UodHJpYWxjcykpOwogCiAJbXV0ZXhfbG9jaygmY2FsbGJhY2tfbXV0ZXgpOwotCWNzLT5mbGFncyA9IHRyaWFsY3MuZmxhZ3M7CisJY3MtPmZsYWdzID0gdHJpYWxjcy0+ZmxhZ3M7CiAJbXV0ZXhfdW5sb2NrKCZjYWxsYmFja19tdXRleCk7CiAKLQlpZiAoIWNwdXNfZW1wdHkodHJpYWxjcy5jcHVzX2FsbG93ZWQpICYmIGJhbGFuY2VfZmxhZ19jaGFuZ2VkKQorCWlmICghY3B1bWFza19lbXB0eSh0cmlhbGNzLT5jcHVzX2FsbG93ZWQpICYmIGJhbGFuY2VfZmxhZ19jaGFuZ2VkKQogCQlhc3luY19yZWJ1aWxkX3NjaGVkX2RvbWFpbnMoKTsKIAotCXJldHVybiAwOworb3V0OgorCWZyZWVfdHJpYWxfY3B1c2V0KHRyaWFsY3MpOworCXJldHVybiBlcnI7CiB9CiAKIC8qCkBAIC0xMzAwLDQyICsxMzM5LDQ3IEBACiAJcmV0dXJuIHZhbDsKIH0KIAorLyogUHJvdGVjdGVkIGJ5IGNncm91cF9sb2NrICovCitzdGF0aWMgY3B1bWFza192YXJfdCBjcHVzX2F0dGFjaDsKKwogLyogQ2FsbGVkIGJ5IGNncm91cHMgdG8gZGV0ZXJtaW5lIGlmIGEgY3B1c2V0IGlzIHVzYWJsZTsgY2dyb3VwX211dGV4IGhlbGQgKi8KIHN0YXRpYyBpbnQgY3B1c2V0X2Nhbl9hdHRhY2goc3RydWN0IGNncm91cF9zdWJzeXMgKnNzLAogCQkJICAgICBzdHJ1Y3QgY2dyb3VwICpjb250LCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKIHsKIAlzdHJ1Y3QgY3B1c2V0ICpjcyA9IGNncm91cF9jcyhjb250KTsKKwlpbnQgcmV0ID0gMDsKIAotCWlmIChjcHVzX2VtcHR5KGNzLT5jcHVzX2FsbG93ZWQpIHx8IG5vZGVzX2VtcHR5KGNzLT5tZW1zX2FsbG93ZWQpKQorCWlmIChjcHVtYXNrX2VtcHR5KGNzLT5jcHVzX2FsbG93ZWQpIHx8IG5vZGVzX2VtcHR5KGNzLT5tZW1zX2FsbG93ZWQpKQogCQlyZXR1cm4gLUVOT1NQQzsKLQlpZiAodHNrLT5mbGFncyAmIFBGX1RIUkVBRF9CT1VORCkgewotCQljcHVtYXNrX3QgbWFzazsKIAorCWlmICh0c2stPmZsYWdzICYgUEZfVEhSRUFEX0JPVU5EKSB7CiAJCW11dGV4X2xvY2soJmNhbGxiYWNrX211dGV4KTsKLQkJbWFzayA9IGNzLT5jcHVzX2FsbG93ZWQ7CisJCWlmICghY3B1bWFza19lcXVhbCgmdHNrLT5jcHVzX2FsbG93ZWQsIGNzLT5jcHVzX2FsbG93ZWQpKQorCQkJcmV0ID0gLUVJTlZBTDsKIAkJbXV0ZXhfdW5sb2NrKCZjYWxsYmFja19tdXRleCk7Ci0JCWlmICghY3B1c19lcXVhbCh0c2stPmNwdXNfYWxsb3dlZCwgbWFzaykpCi0JCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlyZXR1cm4gc2VjdXJpdHlfdGFza19zZXRzY2hlZHVsZXIodHNrLCAwLCBOVUxMKTsKKwlyZXR1cm4gcmV0IDwgMCA/IHJldCA6IHNlY3VyaXR5X3Rhc2tfc2V0c2NoZWR1bGVyKHRzaywgMCwgTlVMTCk7CiB9CiAKIHN0YXRpYyB2b2lkIGNwdXNldF9hdHRhY2goc3RydWN0IGNncm91cF9zdWJzeXMgKnNzLAogCQkJICBzdHJ1Y3QgY2dyb3VwICpjb250LCBzdHJ1Y3QgY2dyb3VwICpvbGRjb250LAogCQkJICBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKIHsKLQljcHVtYXNrX3QgY3B1czsKIAlub2RlbWFza190IGZyb20sIHRvOwogCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tOwogCXN0cnVjdCBjcHVzZXQgKmNzID0gY2dyb3VwX2NzKGNvbnQpOwogCXN0cnVjdCBjcHVzZXQgKm9sZGNzID0gY2dyb3VwX2NzKG9sZGNvbnQpOwogCWludCBlcnI7CiAKLQltdXRleF9sb2NrKCZjYWxsYmFja19tdXRleCk7Ci0JZ3VhcmFudGVlX29ubGluZV9jcHVzKGNzLCAmY3B1cyk7Ci0JZXJyID0gc2V0X2NwdXNfYWxsb3dlZF9wdHIodHNrLCAmY3B1cyk7Ci0JbXV0ZXhfdW5sb2NrKCZjYWxsYmFja19tdXRleCk7CisJaWYgKGNzID09ICZ0b3BfY3B1c2V0KSB7CisJCWNwdW1hc2tfY29weShjcHVzX2F0dGFjaCwgY3B1X3Bvc3NpYmxlX21hc2spOworCX0gZWxzZSB7CisJCW11dGV4X2xvY2soJmNhbGxiYWNrX211dGV4KTsKKwkJZ3VhcmFudGVlX29ubGluZV9jcHVzKGNzLCBjcHVzX2F0dGFjaCk7CisJCW11dGV4X3VubG9jaygmY2FsbGJhY2tfbXV0ZXgpOworCX0KKwllcnIgPSBzZXRfY3B1c19hbGxvd2VkX3B0cih0c2ssIGNwdXNfYXR0YWNoKTsKIAlpZiAoZXJyKQogCQlyZXR1cm47CiAKQEAgLTEzNDgsNyArMTM5Miw2IEBACiAJCQljcHVzZXRfbWlncmF0ZV9tbShtbSwgJmZyb20sICZ0byk7CiAJCW1tcHV0KG1tKTsKIAl9Ci0KIH0KIAogLyogVGhlIHZhcmlvdXMgdHlwZXMgb2YgZmlsZXMgYW5kIGRpcmVjdG9yaWVzIGluIGEgY3B1c2V0IGZpbGUgc3lzdGVtICovCkBAIC0xNDQzLDIxICsxNDg2LDI5IEBACiAJCQkJY29uc3QgY2hhciAqYnVmKQogewogCWludCByZXR2YWwgPSAwOworCXN0cnVjdCBjcHVzZXQgKmNzID0gY2dyb3VwX2NzKGNncnApOworCXN0cnVjdCBjcHVzZXQgKnRyaWFsY3M7CiAKIAlpZiAoIWNncm91cF9sb2NrX2xpdmVfZ3JvdXAoY2dycCkpCiAJCXJldHVybiAtRU5PREVWOwogCisJdHJpYWxjcyA9IGFsbG9jX3RyaWFsX2NwdXNldChjcyk7CisJaWYgKCF0cmlhbGNzKQorCQlyZXR1cm4gLUVOT01FTTsKKwogCXN3aXRjaCAoY2Z0LT5wcml2YXRlKSB7CiAJY2FzZSBGSUxFX0NQVUxJU1Q6Ci0JCXJldHZhbCA9IHVwZGF0ZV9jcHVtYXNrKGNncm91cF9jcyhjZ3JwKSwgYnVmKTsKKwkJcmV0dmFsID0gdXBkYXRlX2NwdW1hc2soY3MsIHRyaWFsY3MsIGJ1Zik7CiAJCWJyZWFrOwogCWNhc2UgRklMRV9NRU1MSVNUOgotCQlyZXR2YWwgPSB1cGRhdGVfbm9kZW1hc2soY2dyb3VwX2NzKGNncnApLCBidWYpOworCQlyZXR2YWwgPSB1cGRhdGVfbm9kZW1hc2soY3MsIHRyaWFsY3MsIGJ1Zik7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXJldHZhbCA9IC1FSU5WQUw7CiAJCWJyZWFrOwogCX0KKworCWZyZWVfdHJpYWxfY3B1c2V0KHRyaWFsY3MpOwogCWNncm91cF91bmxvY2soKTsKIAlyZXR1cm4gcmV0dmFsOwogfQpAQCAtMTQ3NiwxMyArMTUyNywxMyBAQAogCiBzdGF0aWMgaW50IGNwdXNldF9zcHJpbnRmX2NwdWxpc3QoY2hhciAqcGFnZSwgc3RydWN0IGNwdXNldCAqY3MpCiB7Ci0JY3B1bWFza190IG1hc2s7CisJaW50IHJldDsKIAogCW11dGV4X2xvY2soJmNhbGxiYWNrX211dGV4KTsKLQltYXNrID0gY3MtPmNwdXNfYWxsb3dlZDsKKwlyZXQgPSBjcHVsaXN0X3NjbnByaW50ZihwYWdlLCBQQUdFX1NJWkUsIGNzLT5jcHVzX2FsbG93ZWQpOwogCW11dGV4X3VubG9jaygmY2FsbGJhY2tfbXV0ZXgpOwogCi0JcmV0dXJuIGNwdWxpc3Rfc2NucHJpbnRmKHBhZ2UsIFBBR0VfU0laRSwgJm1hc2spOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgY3B1c2V0X3NwcmludGZfbWVtbGlzdChjaGFyICpwYWdlLCBzdHJ1Y3QgY3B1c2V0ICpjcykKQEAgLTE3MTgsNyArMTc2OSw3IEBACiAJcGFyZW50X2NzID0gY2dyb3VwX2NzKHBhcmVudCk7CiAKIAljcy0+bWVtc19hbGxvd2VkID0gcGFyZW50X2NzLT5tZW1zX2FsbG93ZWQ7Ci0JY3MtPmNwdXNfYWxsb3dlZCA9IHBhcmVudF9jcy0+Y3B1c19hbGxvd2VkOworCWNwdW1hc2tfY29weShjcy0+Y3B1c19hbGxvd2VkLCBwYXJlbnRfY3MtPmNwdXNfYWxsb3dlZCk7CiAJcmV0dXJuOwogfQogCkBAIC0xNzQ0LDYgKzE3OTUsMTAgQEAKIAljcyA9IGttYWxsb2Moc2l6ZW9mKCpjcyksIEdGUF9LRVJORUwpOwogCWlmICghY3MpCiAJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCWlmICghYWxsb2NfY3B1bWFza192YXIoJmNzLT5jcHVzX2FsbG93ZWQsIEdGUF9LRVJORUwpKSB7CisJCWtmcmVlKGNzKTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisJfQogCiAJY3B1c2V0X3VwZGF0ZV90YXNrX21lbW9yeV9zdGF0ZSgpOwogCWNzLT5mbGFncyA9IDA7CkBAIC0xNzUyLDcgKzE4MDcsNyBAQAogCWlmIChpc19zcHJlYWRfc2xhYihwYXJlbnQpKQogCQlzZXRfYml0KENTX1NQUkVBRF9TTEFCLCAmY3MtPmZsYWdzKTsKIAlzZXRfYml0KENTX1NDSEVEX0xPQURfQkFMQU5DRSwgJmNzLT5mbGFncyk7Ci0JY3B1c19jbGVhcihjcy0+Y3B1c19hbGxvd2VkKTsKKwljcHVtYXNrX2NsZWFyKGNzLT5jcHVzX2FsbG93ZWQpOwogCW5vZGVzX2NsZWFyKGNzLT5tZW1zX2FsbG93ZWQpOwogCWNzLT5tZW1zX2dlbmVyYXRpb24gPSBjcHVzZXRfbWVtc19nZW5lcmF0aW9uKys7CiAJZm1ldGVyX2luaXQoJmNzLT5mbWV0ZXIpOwpAQCAtMTc3OSw2ICsxODM0LDcgQEAKIAkJdXBkYXRlX2ZsYWcoQ1NfU0NIRURfTE9BRF9CQUxBTkNFLCBjcywgMCk7CiAKIAludW1iZXJfb2ZfY3B1c2V0cy0tOworCWZyZWVfY3B1bWFza192YXIoY3MtPmNwdXNfYWxsb3dlZCk7CiAJa2ZyZWUoY3MpOwogfQogCkBAIC0xODAyLDYgKzE4NTgsOCBAQAogCiBpbnQgX19pbml0IGNwdXNldF9pbml0X2Vhcmx5KHZvaWQpCiB7CisJYWxsb2NfYm9vdG1lbV9jcHVtYXNrX3ZhcigmdG9wX2NwdXNldC5jcHVzX2FsbG93ZWQpOworCiAJdG9wX2NwdXNldC5tZW1zX2dlbmVyYXRpb24gPSBjcHVzZXRfbWVtc19nZW5lcmF0aW9uKys7CiAJcmV0dXJuIDA7CiB9CkBAIC0xODE3LDcgKzE4NzUsNyBAQAogewogCWludCBlcnIgPSAwOwogCi0JY3B1c19zZXRhbGwodG9wX2NwdXNldC5jcHVzX2FsbG93ZWQpOworCWNwdW1hc2tfc2V0YWxsKHRvcF9jcHVzZXQuY3B1c19hbGxvd2VkKTsKIAlub2Rlc19zZXRhbGwodG9wX2NwdXNldC5tZW1zX2FsbG93ZWQpOwogCiAJZm1ldGVyX2luaXQoJnRvcF9jcHVzZXQuZm1ldGVyKTsKQEAgLTE4MjksNiArMTg4Nyw5IEBACiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAKKwlpZiAoIWFsbG9jX2NwdW1hc2tfdmFyKCZjcHVzX2F0dGFjaCwgR0ZQX0tFUk5FTCkpCisJCUJVRygpOworCiAJbnVtYmVyX29mX2NwdXNldHMgPSAxOwogCXJldHVybiAwOwogfQpAQCAtMTkwMyw3ICsxOTY0LDcgQEAKIAkgKiBoYXMgb25saW5lIGNwdXMsIHNvIGNhbid0IGJlIGVtcHR5KS4KIAkgKi8KIAlwYXJlbnQgPSBjcy0+cGFyZW50OwotCXdoaWxlIChjcHVzX2VtcHR5KHBhcmVudC0+Y3B1c19hbGxvd2VkKSB8fAorCXdoaWxlIChjcHVtYXNrX2VtcHR5KHBhcmVudC0+Y3B1c19hbGxvd2VkKSB8fAogCQkJbm9kZXNfZW1wdHkocGFyZW50LT5tZW1zX2FsbG93ZWQpKQogCQlwYXJlbnQgPSBwYXJlbnQtPnBhcmVudDsKIApAQCAtMTk0NCw3ICsyMDA1LDcgQEAKIAkJfQogCiAJCS8qIENvbnRpbnVlIHBhc3QgY3B1c2V0cyB3aXRoIGFsbCBjcHVzLCBtZW1zIG9ubGluZSAqLwotCQlpZiAoY3B1c19zdWJzZXQoY3AtPmNwdXNfYWxsb3dlZCwgY3B1X29ubGluZV9tYXApICYmCisJCWlmIChjcHVtYXNrX3N1YnNldChjcC0+Y3B1c19hbGxvd2VkLCBjcHVfb25saW5lX21hc2spICYmCiAJCSAgICBub2Rlc19zdWJzZXQoY3AtPm1lbXNfYWxsb3dlZCwgbm9kZV9zdGF0ZXNbTl9ISUdIX01FTU9SWV0pKQogCQkJY29udGludWU7CiAKQEAgLTE5NTIsMTMgKzIwMTMsMTQgQEAKIAogCQkvKiBSZW1vdmUgb2ZmbGluZSBjcHVzIGFuZCBtZW1zIGZyb20gdGhpcyBjcHVzZXQuICovCiAJCW11dGV4X2xvY2soJmNhbGxiYWNrX211dGV4KTsKLQkJY3B1c19hbmQoY3AtPmNwdXNfYWxsb3dlZCwgY3AtPmNwdXNfYWxsb3dlZCwgY3B1X29ubGluZV9tYXApOworCQljcHVtYXNrX2FuZChjcC0+Y3B1c19hbGxvd2VkLCBjcC0+Y3B1c19hbGxvd2VkLAorCQkJICAgIGNwdV9vbmxpbmVfbWFzayk7CiAJCW5vZGVzX2FuZChjcC0+bWVtc19hbGxvd2VkLCBjcC0+bWVtc19hbGxvd2VkLAogCQkJCQkJbm9kZV9zdGF0ZXNbTl9ISUdIX01FTU9SWV0pOwogCQltdXRleF91bmxvY2soJmNhbGxiYWNrX211dGV4KTsKIAogCQkvKiBNb3ZlIHRhc2tzIGZyb20gdGhlIGVtcHR5IGNwdXNldCB0byBhIHBhcmVudCAqLwotCQlpZiAoY3B1c19lbXB0eShjcC0+Y3B1c19hbGxvd2VkKSB8fAorCQlpZiAoY3B1bWFza19lbXB0eShjcC0+Y3B1c19hbGxvd2VkKSB8fAogCQkgICAgIG5vZGVzX2VtcHR5KGNwLT5tZW1zX2FsbG93ZWQpKQogCQkJcmVtb3ZlX3Rhc2tzX2luX2VtcHR5X2NwdXNldChjcCk7CiAJCWVsc2UgewpAQCAtMTk4NCw3ICsyMDQ2LDcgQEAKIAkJCQl1bnNpZ25lZCBsb25nIHBoYXNlLCB2b2lkICp1bnVzZWRfY3B1KQogewogCXN0cnVjdCBzY2hlZF9kb21haW5fYXR0ciAqYXR0cjsKLQljcHVtYXNrX3QgKmRvbXM7CisJc3RydWN0IGNwdW1hc2sgKmRvbXM7CiAJaW50IG5kb21zOwogCiAJc3dpdGNoIChwaGFzZSkgewpAQCAtMTk5OSw3ICsyMDYxLDcgQEAKIAl9CiAKIAljZ3JvdXBfbG9jaygpOwotCXRvcF9jcHVzZXQuY3B1c19hbGxvd2VkID0gY3B1X29ubGluZV9tYXA7CisJY3B1bWFza19jb3B5KHRvcF9jcHVzZXQuY3B1c19hbGxvd2VkLCBjcHVfb25saW5lX21hc2spOwogCXNjYW5fZm9yX2VtcHR5X2NwdXNldHMoJnRvcF9jcHVzZXQpOwogCW5kb21zID0gZ2VuZXJhdGVfc2NoZWRfZG9tYWlucygmZG9tcywgJmF0dHIpOwogCWNncm91cF91bmxvY2soKTsKQEAgLTIwNDQsNyArMjEwNiw3IEBACiAKIHZvaWQgX19pbml0IGNwdXNldF9pbml0X3NtcCh2b2lkKQogewotCXRvcF9jcHVzZXQuY3B1c19hbGxvd2VkID0gY3B1X29ubGluZV9tYXA7CisJY3B1bWFza19jb3B5KHRvcF9jcHVzZXQuY3B1c19hbGxvd2VkLCBjcHVfb25saW5lX21hc2spOwogCXRvcF9jcHVzZXQubWVtc19hbGxvd2VkID0gbm9kZV9zdGF0ZXNbTl9ISUdIX01FTU9SWV07CiAKIAlob3RjcHVfbm90aWZpZXIoY3B1c2V0X3RyYWNrX29ubGluZV9jcHVzLCAwKTsKQEAgLTIwNTQsMTUgKzIxMTYsMTUgQEAKIC8qKgogICogY3B1c2V0X2NwdXNfYWxsb3dlZCAtIHJldHVybiBjcHVzX2FsbG93ZWQgbWFzayBmcm9tIGEgdGFza3MgY3B1c2V0LgogICogQHRzazogcG9pbnRlciB0byB0YXNrX3N0cnVjdCBmcm9tIHdoaWNoIHRvIG9idGFpbiBjcHVzZXQtPmNwdXNfYWxsb3dlZC4KLSAqIEBwbWFzazogcG9pbnRlciB0byBjcHVtYXNrX3QgdmFyaWFibGUgdG8gcmVjZWl2ZSBjcHVzX2FsbG93ZWQgc2V0LgorICogQHBtYXNrOiBwb2ludGVyIHRvIHN0cnVjdCBjcHVtYXNrIHZhcmlhYmxlIHRvIHJlY2VpdmUgY3B1c19hbGxvd2VkIHNldC4KICAqCi0gKiBEZXNjcmlwdGlvbjogUmV0dXJucyB0aGUgY3B1bWFza190IGNwdXNfYWxsb3dlZCBvZiB0aGUgY3B1c2V0CisgKiBEZXNjcmlwdGlvbjogUmV0dXJucyB0aGUgY3B1bWFza192YXJfdCBjcHVzX2FsbG93ZWQgb2YgdGhlIGNwdXNldAogICogYXR0YWNoZWQgdG8gdGhlIHNwZWNpZmllZCBAdHNrLiAgR3VhcmFudGVlZCB0byByZXR1cm4gc29tZSBub24tZW1wdHkKICAqIHN1YnNldCBvZiBjcHVfb25saW5lX21hcCwgZXZlbiBpZiB0aGlzIG1lYW5zIGdvaW5nIG91dHNpZGUgdGhlCiAgKiB0YXNrcyBjcHVzZXQuCiAgKiovCiAKLXZvaWQgY3B1c2V0X2NwdXNfYWxsb3dlZChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgY3B1bWFza190ICpwbWFzaykKK3ZvaWQgY3B1c2V0X2NwdXNfYWxsb3dlZChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgc3RydWN0IGNwdW1hc2sgKnBtYXNrKQogewogCW11dGV4X2xvY2soJmNhbGxiYWNrX211dGV4KTsKIAljcHVzZXRfY3B1c19hbGxvd2VkX2xvY2tlZCh0c2ssIHBtYXNrKTsKQEAgLTIwNzMsNyArMjEzNSw3IEBACiAgKiBjcHVzZXRfY3B1c19hbGxvd2VkX2xvY2tlZCAtIHJldHVybiBjcHVzX2FsbG93ZWQgbWFzayBmcm9tIGEgdGFza3MgY3B1c2V0LgogICogTXVzdCBiZSBjYWxsZWQgd2l0aCBjYWxsYmFja19tdXRleCBoZWxkLgogICoqLwotdm9pZCBjcHVzZXRfY3B1c19hbGxvd2VkX2xvY2tlZChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgY3B1bWFza190ICpwbWFzaykKK3ZvaWQgY3B1c2V0X2NwdXNfYWxsb3dlZF9sb2NrZWQoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIHN0cnVjdCBjcHVtYXNrICpwbWFzaykKIHsKIAl0YXNrX2xvY2sodHNrKTsKIAlndWFyYW50ZWVfb25saW5lX2NwdXModGFza19jcyh0c2spLCBwbWFzayk7CkBAIC0yMzU2LDYgKzI0MTgsMjkgQEAKIAlyZXR1cm4gbm9kZXNfaW50ZXJzZWN0cyh0c2sxLT5tZW1zX2FsbG93ZWQsIHRzazItPm1lbXNfYWxsb3dlZCk7CiB9CiAKKy8qKgorICogY3B1c2V0X3ByaW50X3Rhc2tfbWVtc19hbGxvd2VkIC0gcHJpbnRzIHRhc2sncyBjcHVzZXQgYW5kIG1lbXNfYWxsb3dlZAorICogQHRhc2s6IHBvaW50ZXIgdG8gdGFza19zdHJ1Y3Qgb2Ygc29tZSB0YXNrLgorICoKKyAqIERlc2NyaXB0aW9uOiBQcmludHMgQHRhc2sncyBuYW1lLCBjcHVzZXQgbmFtZSwgYW5kIGNhY2hlZCBjb3B5IG9mIGl0cworICogbWVtc19hbGxvd2VkIHRvIHRoZSBrZXJuZWwgbG9nLiAgTXVzdCBob2xkIHRhc2tfbG9jayh0YXNrKSB0byBhbGxvdworICogZGVyZWZlcmVuY2luZyB0YXNrX2NzKHRhc2spLgorICovCit2b2lkIGNwdXNldF9wcmludF90YXNrX21lbXNfYWxsb3dlZChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKK3sKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnk7CisKKwlkZW50cnkgPSB0YXNrX2NzKHRzayktPmNzcy5jZ3JvdXAtPmRlbnRyeTsKKwlzcGluX2xvY2soJmNwdXNldF9idWZmZXJfbG9jayk7CisJc25wcmludGYoY3B1c2V0X25hbWUsIENQVVNFVF9OQU1FX0xFTiwKKwkJIGRlbnRyeSA/IChjb25zdCBjaGFyICopZGVudHJ5LT5kX25hbWUubmFtZSA6ICIvIik7CisJbm9kZWxpc3Rfc2NucHJpbnRmKGNwdXNldF9ub2RlbGlzdCwgQ1BVU0VUX05PREVMSVNUX0xFTiwKKwkJCSAgIHRzay0+bWVtc19hbGxvd2VkKTsKKwlwcmludGsoS0VSTl9JTkZPICIlcyBjcHVzZXQ9JXMgbWVtc19hbGxvd2VkPSVzXG4iLAorCSAgICAgICB0c2stPmNvbW0sIGNwdXNldF9uYW1lLCBjcHVzZXRfbm9kZWxpc3QpOworCXNwaW5fdW5sb2NrKCZjcHVzZXRfYnVmZmVyX2xvY2spOworfQorCiAvKgogICogQ29sbGVjdGlvbiBvZiBtZW1vcnlfcHJlc3N1cmUgaXMgc3VwcHJlc3NlZCB1bmxlc3MKICAqIHRoaXMgZmxhZyBpcyBlbmFibGVkIGJ5IHdyaXRpbmcgIjEiIHRvIHRoZSBzcGVjaWFsCmRpZmYgLS1naXQgYS9rZXJuZWwvZG1hLWNvaGVyZW50LmMgYi9rZXJuZWwvZG1hLWNvaGVyZW50LmMKaW5kZXggZjAxM2EwYy4uMDM4NzA3NCAxMDA2NDQKLS0tIGEva2VybmVsL2RtYS1jb2hlcmVudC5jCisrKyBiL2tlcm5lbC9kbWEtY29oZXJlbnQuYwpAQCAtMTA5LDIwICsxMDksNDAgQEAKIGludCBkbWFfYWxsb2NfZnJvbV9jb2hlcmVudChzdHJ1Y3QgZGV2aWNlICpkZXYsIHNzaXplX3Qgc2l6ZSwKIAkJCQkgICAgICAgZG1hX2FkZHJfdCAqZG1hX2hhbmRsZSwgdm9pZCAqKnJldCkKIHsKLQlzdHJ1Y3QgZG1hX2NvaGVyZW50X21lbSAqbWVtID0gZGV2ID8gZGV2LT5kbWFfbWVtIDogTlVMTDsKKwlzdHJ1Y3QgZG1hX2NvaGVyZW50X21lbSAqbWVtOwogCWludCBvcmRlciA9IGdldF9vcmRlcihzaXplKTsKKwlpbnQgcGFnZW5vOwogCi0JaWYgKG1lbSkgewotCQlpbnQgcGFnZSA9IGJpdG1hcF9maW5kX2ZyZWVfcmVnaW9uKG1lbS0+Yml0bWFwLCBtZW0tPnNpemUsCi0JCQkJCQkgICAgIG9yZGVyKTsKLQkJaWYgKHBhZ2UgPj0gMCkgewotCQkJKmRtYV9oYW5kbGUgPSBtZW0tPmRldmljZV9iYXNlICsgKHBhZ2UgPDwgUEFHRV9TSElGVCk7Ci0JCQkqcmV0ID0gbWVtLT52aXJ0X2Jhc2UgKyAocGFnZSA8PCBQQUdFX1NISUZUKTsKLQkJCW1lbXNldCgqcmV0LCAwLCBzaXplKTsKLQkJfSBlbHNlIGlmIChtZW0tPmZsYWdzICYgRE1BX01FTU9SWV9FWENMVVNJVkUpCi0JCQkqcmV0ID0gTlVMTDsKKwlpZiAoIWRldikKKwkJcmV0dXJuIDA7CisJbWVtID0gZGV2LT5kbWFfbWVtOworCWlmICghbWVtKQorCQlyZXR1cm4gMDsKKwlpZiAodW5saWtlbHkoc2l6ZSA+IG1lbS0+c2l6ZSkpCisgCQlyZXR1cm4gMDsKKworCXBhZ2VubyA9IGJpdG1hcF9maW5kX2ZyZWVfcmVnaW9uKG1lbS0+Yml0bWFwLCBtZW0tPnNpemUsIG9yZGVyKTsKKwlpZiAocGFnZW5vID49IDApIHsKKwkJLyoKKwkJICogTWVtb3J5IHdhcyBmb3VuZCBpbiB0aGUgcGVyLWRldmljZSBhcmVuYS4KKwkJICovCisJCSpkbWFfaGFuZGxlID0gbWVtLT5kZXZpY2VfYmFzZSArIChwYWdlbm8gPDwgUEFHRV9TSElGVCk7CisJCSpyZXQgPSBtZW0tPnZpcnRfYmFzZSArIChwYWdlbm8gPDwgUEFHRV9TSElGVCk7CisJCW1lbXNldCgqcmV0LCAwLCBzaXplKTsKKwl9IGVsc2UgaWYgKG1lbS0+ZmxhZ3MgJiBETUFfTUVNT1JZX0VYQ0xVU0lWRSkgeworCQkvKgorCQkgKiBUaGUgcGVyLWRldmljZSBhcmVuYSBpcyBleGhhdXN0ZWQgYW5kIHdlIGFyZSBub3QKKwkJICogcGVybWl0dGVkIHRvIGZhbGwgYmFjayB0byBnZW5lcmljIG1lbW9yeS4KKwkJICovCisJCSpyZXQgPSBOVUxMOworCX0gZWxzZSB7CisJCS8qCisJCSAqIFRoZSBwZXItZGV2aWNlIGFyZW5hIGlzIGV4aGF1c3RlZCBhbmQgd2UgYXJlCisJCSAqIHBlcm1pdHRlZCB0byBmYWxsIGJhY2sgdG8gZ2VuZXJpYyBtZW1vcnkuCisJCSAqLworCQkgcmV0dXJuIDA7CiAJfQotCXJldHVybiAobWVtICE9IE5VTEwpOworCXJldHVybiAxOwogfQogRVhQT1JUX1NZTUJPTChkbWFfYWxsb2NfZnJvbV9jb2hlcmVudCk7CiAKZGlmZiAtLWdpdCBhL2tlcm5lbC9leGl0LmMgYi9rZXJuZWwvZXhpdC5jCmluZGV4IGM5ZTVhMWMuLmM3NzQwZmEzIDEwMDY0NAotLS0gYS9rZXJuZWwvZXhpdC5jCisrKyBiL2tlcm5lbC9leGl0LmMKQEAgLTY0MiwzNSArNjQyLDMxIEBACiAJLyoKIAkgKiBXZSBmb3VuZCBubyBvd25lciB5ZXQgbW1fdXNlcnMgPiAxOiB0aGlzIGltcGxpZXMgdGhhdCB3ZSBhcmUKIAkgKiBtb3N0IGxpa2VseSByYWNpbmcgd2l0aCBzd2Fwb2ZmICh0cnlfdG9fdW51c2UoKSkgb3IgL3Byb2Mgb3IKLQkgKiBwdHJhY2Ugb3IgcGFnZSBtaWdyYXRpb24gKGdldF90YXNrX21tKCkpLiAgTWFyayBvd25lciBhcyBOVUxMLAotCSAqIHNvIHRoYXQgc3Vic3lzdGVtcyBjYW4gdW5kZXJzdGFuZCB0aGUgY2FsbGJhY2sgYW5kIHRha2UgYWN0aW9uLgorCSAqIHB0cmFjZSBvciBwYWdlIG1pZ3JhdGlvbiAoZ2V0X3Rhc2tfbW0oKSkuICBNYXJrIG93bmVyIGFzIE5VTEwuCiAJICovCi0JZG93bl93cml0ZSgmbW0tPm1tYXBfc2VtKTsKLQljZ3JvdXBfbW1fb3duZXJfY2FsbGJhY2tzKG1tLT5vd25lciwgTlVMTCk7CiAJbW0tPm93bmVyID0gTlVMTDsKLQl1cF93cml0ZSgmbW0tPm1tYXBfc2VtKTsKIAlyZXR1cm47CiAKIGFzc2lnbl9uZXdfb3duZXI6CiAJQlVHX09OKGMgPT0gcCk7CiAJZ2V0X3Rhc2tfc3RydWN0KGMpOwotCXJlYWRfdW5sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKLQlkb3duX3dyaXRlKCZtbS0+bW1hcF9zZW0pOwogCS8qCiAJICogVGhlIHRhc2tfbG9jayBwcm90ZWN0cyBjLT5tbSBmcm9tIGNoYW5naW5nLgogCSAqIFdlIGFsd2F5cyB3YW50IG1tLT5vd25lci0+bW0gPT0gbW0KIAkgKi8KIAl0YXNrX2xvY2soYyk7CisJLyoKKwkgKiBEZWxheSByZWFkX3VubG9jaygpIHRpbGwgd2UgaGF2ZSB0aGUgdGFza19sb2NrKCkKKwkgKiB0byBlbnN1cmUgdGhhdCBjIGRvZXMgbm90IHNsaXAgYXdheSB1bmRlcm5lYXRoIHVzCisJICovCisJcmVhZF91bmxvY2soJnRhc2tsaXN0X2xvY2spOwogCWlmIChjLT5tbSAhPSBtbSkgewogCQl0YXNrX3VubG9jayhjKTsKLQkJdXBfd3JpdGUoJm1tLT5tbWFwX3NlbSk7CiAJCXB1dF90YXNrX3N0cnVjdChjKTsKIAkJZ290byByZXRyeTsKIAl9Ci0JY2dyb3VwX21tX293bmVyX2NhbGxiYWNrcyhtbS0+b3duZXIsIGMpOwogCW1tLT5vd25lciA9IGM7CiAJdGFza191bmxvY2soYyk7Ci0JdXBfd3JpdGUoJm1tLT5tbWFwX3NlbSk7CiAJcHV0X3Rhc2tfc3RydWN0KGMpOwogfQogI2VuZGlmIC8qIENPTkZJR19NTV9PV05FUiAqLwpAQCAtMTA1NSwxMCArMTA1MSw3IEBACiAJCQkJcHJlZW1wdF9jb3VudCgpKTsKIAogCWFjY3RfdXBkYXRlX2ludGVncmFscyh0c2spOwotCWlmICh0c2stPm1tKSB7Ci0JCXVwZGF0ZV9oaXdhdGVyX3Jzcyh0c2stPm1tKTsKLQkJdXBkYXRlX2hpd2F0ZXJfdm0odHNrLT5tbSk7Ci0JfQorCiAJZ3JvdXBfZGVhZCA9IGF0b21pY19kZWNfYW5kX3Rlc3QoJnRzay0+c2lnbmFsLT5saXZlKTsKIAlpZiAoZ3JvdXBfZGVhZCkgewogCQlocnRpbWVyX2NhbmNlbCgmdHNrLT5zaWduYWwtPnJlYWxfdGltZXIpOwpkaWZmIC0tZ2l0IGEva2VybmVsL2ZvcmsuYyBiL2tlcm5lbC9mb3JrLmMKaW5kZXggNDNjYmYzMC4uNDAxODMwOCAxMDA2NDQKLS0tIGEva2VybmVsL2ZvcmsuYworKysgYi9rZXJuZWwvZm9yay5jCkBAIC00MDAsNiArNDAwLDE4IEBACiAjZGVmaW5lIGFsbG9jYXRlX21tKCkJKGttZW1fY2FjaGVfYWxsb2MobW1fY2FjaGVwLCBHRlBfS0VSTkVMKSkKICNkZWZpbmUgZnJlZV9tbShtbSkJKGttZW1fY2FjaGVfZnJlZShtbV9jYWNoZXAsIChtbSkpKQogCitzdGF0aWMgdW5zaWduZWQgbG9uZyBkZWZhdWx0X2R1bXBfZmlsdGVyID0gTU1GX0RVTVBfRklMVEVSX0RFRkFVTFQ7CisKK3N0YXRpYyBpbnQgX19pbml0IGNvcmVkdW1wX2ZpbHRlcl9zZXR1cChjaGFyICpzKQoreworCWRlZmF1bHRfZHVtcF9maWx0ZXIgPQorCQkoc2ltcGxlX3N0cnRvdWwocywgTlVMTCwgMCkgPDwgTU1GX0RVTVBfRklMVEVSX1NISUZUKSAmCisJCU1NRl9EVU1QX0ZJTFRFUl9NQVNLOworCXJldHVybiAxOworfQorCitfX3NldHVwKCJjb3JlZHVtcF9maWx0ZXI9IiwgY29yZWR1bXBfZmlsdGVyX3NldHVwKTsKKwogI2luY2x1ZGUgPGxpbnV4L2luaXRfdGFzay5oPgogCiBzdGF0aWMgc3RydWN0IG1tX3N0cnVjdCAqIG1tX2luaXQoc3RydWN0IG1tX3N0cnVjdCAqIG1tLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCkBAIC00MDgsOCArNDIwLDcgQEAKIAlhdG9taWNfc2V0KCZtbS0+bW1fY291bnQsIDEpOwogCWluaXRfcndzZW0oJm1tLT5tbWFwX3NlbSk7CiAJSU5JVF9MSVNUX0hFQUQoJm1tLT5tbWxpc3QpOwotCW1tLT5mbGFncyA9IChjdXJyZW50LT5tbSkgPyBjdXJyZW50LT5tbS0+ZmxhZ3MKLQkJCQkgIDogTU1GX0RVTVBfRklMVEVSX0RFRkFVTFQ7CisJbW0tPmZsYWdzID0gKGN1cnJlbnQtPm1tKSA/IGN1cnJlbnQtPm1tLT5mbGFncyA6IGRlZmF1bHRfZHVtcF9maWx0ZXI7CiAJbW0tPmNvcmVfc3RhdGUgPSBOVUxMOwogCW1tLT5ucl9wdGVzID0gMDsKIAlzZXRfbW1fY291bnRlcihtbSwgZmlsZV9yc3MsIDApOwpAQCAtNzU4LDcgKzc2OSw3IEBACiB7CiAJc3RydWN0IHNpZ2hhbmRfc3RydWN0ICpzaWc7CiAKLQlpZiAoY2xvbmVfZmxhZ3MgJiAoQ0xPTkVfU0lHSEFORCB8IENMT05FX1RIUkVBRCkpIHsKKwlpZiAoY2xvbmVfZmxhZ3MgJiBDTE9ORV9TSUdIQU5EKSB7CiAJCWF0b21pY19pbmMoJmN1cnJlbnQtPnNpZ2hhbmQtPmNvdW50KTsKIAkJcmV0dXJuIDA7CiAJfQpAQCAtMTExNSwxMiArMTEyNiwxMiBAQAogCiAJaWYgKHBpZCAhPSAmaW5pdF9zdHJ1Y3RfcGlkKSB7CiAJCXJldHZhbCA9IC1FTk9NRU07Ci0JCXBpZCA9IGFsbG9jX3BpZCh0YXNrX2FjdGl2ZV9waWRfbnMocCkpOworCQlwaWQgPSBhbGxvY19waWQocC0+bnNwcm94eS0+cGlkX25zKTsKIAkJaWYgKCFwaWQpCiAJCQlnb3RvIGJhZF9mb3JrX2NsZWFudXBfaW87CiAKIAkJaWYgKGNsb25lX2ZsYWdzICYgQ0xPTkVfTkVXUElEKSB7Ci0JCQlyZXR2YWwgPSBwaWRfbnNfcHJlcGFyZV9wcm9jKHRhc2tfYWN0aXZlX3BpZF9ucyhwKSk7CisJCQlyZXR2YWwgPSBwaWRfbnNfcHJlcGFyZV9wcm9jKHAtPm5zcHJveHktPnBpZF9ucyk7CiAJCQlpZiAocmV0dmFsIDwgMCkKIAkJCQlnb3RvIGJhZF9mb3JrX2ZyZWVfcGlkOwogCQl9CmRpZmYgLS1naXQgYS9rZXJuZWwvZnV0ZXguYyBiL2tlcm5lbC9mdXRleC5jCmluZGV4IDdjNmNiYWIuLjAwMmFhMTggMTAwNjQ0Ci0tLSBhL2tlcm5lbC9mdXRleC5jCisrKyBiL2tlcm5lbC9mdXRleC5jCkBAIC0xNzAsOCArMTcwLDExIEBACiAgKi8KIHN0YXRpYyB2b2lkIGRyb3BfZnV0ZXhfa2V5X3JlZnModW5pb24gZnV0ZXhfa2V5ICprZXkpCiB7Ci0JaWYgKCFrZXktPmJvdGgucHRyKQorCWlmICgha2V5LT5ib3RoLnB0cikgeworCQkvKiBJZiB3ZSdyZSBoZXJlIHRoZW4gd2UgdHJpZWQgdG8gcHV0IGEga2V5IHdlIGZhaWxlZCB0byBnZXQgKi8KKwkJV0FSTl9PTl9PTkNFKDEpOwogCQlyZXR1cm47CisJfQogCiAJc3dpdGNoIChrZXktPmJvdGgub2Zmc2V0ICYgKEZVVF9PRkZfSU5PREV8RlVUX09GRl9NTVNIQVJFRCkpIHsKIAljYXNlIEZVVF9PRkZfSU5PREU6CkBAIC03MzAsOCArNzMzLDggQEAKIAl9CiAKIAlzcGluX3VubG9jaygmaGItPmxvY2spOwotb3V0OgogCXB1dF9mdXRleF9rZXkoZnNoYXJlZCwgJmtleSk7CitvdXQ6CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtNzU1LDcgKzc1OCw3IEBACiAJCWdvdG8gb3V0OwogCXJldCA9IGdldF9mdXRleF9rZXkodWFkZHIyLCBmc2hhcmVkLCAma2V5Mik7CiAJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkKLQkJZ290byBvdXQ7CisJCWdvdG8gb3V0X3B1dF9rZXkxOwogCiAJaGIxID0gaGFzaF9mdXRleCgma2V5MSk7CiAJaGIyID0gaGFzaF9mdXRleCgma2V5Mik7CkBAIC03NzcsMTIgKzc4MCwxMiBAQAogCQkgKiBidXQgd2UgbWlnaHQgZ2V0IHRoZW0gZnJvbSByYW5nZSBjaGVja2luZwogCQkgKi8KIAkJcmV0ID0gb3BfcmV0OwotCQlnb3RvIG91dDsKKwkJZ290byBvdXRfcHV0X2tleXM7CiAjZW5kaWYKIAogCQlpZiAodW5saWtlbHkob3BfcmV0ICE9IC1FRkFVTFQpKSB7CiAJCQlyZXQgPSBvcF9yZXQ7Ci0JCQlnb3RvIG91dDsKKwkJCWdvdG8gb3V0X3B1dF9rZXlzOwogCQl9CiAKIAkJLyoKQEAgLTc5Niw3ICs3OTksNyBAQAogCQkJcmV0ID0gZnV0ZXhfaGFuZGxlX2ZhdWx0KCh1bnNpZ25lZCBsb25nKXVhZGRyMiwKIAkJCQkJCSBhdHRlbXB0KTsKIAkJCWlmIChyZXQpCi0JCQkJZ290byBvdXQ7CisJCQkJZ290byBvdXRfcHV0X2tleXM7CiAJCQlnb3RvIHJldHJ5OwogCQl9CiAKQEAgLTgzNCwxMCArODM3LDExIEBACiAJc3Bpbl91bmxvY2soJmhiMS0+bG9jayk7CiAJaWYgKGhiMSAhPSBoYjIpCiAJCXNwaW5fdW5sb2NrKCZoYjItPmxvY2spOwotb3V0Ogorb3V0X3B1dF9rZXlzOgogCXB1dF9mdXRleF9rZXkoZnNoYXJlZCwgJmtleTIpOworb3V0X3B1dF9rZXkxOgogCXB1dF9mdXRleF9rZXkoZnNoYXJlZCwgJmtleTEpOwotCitvdXQ6CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtODU0LDEzICs4NTgsMTMgQEAKIAlzdHJ1Y3QgZnV0ZXhfcSAqdGhpcywgKm5leHQ7CiAJaW50IHJldCwgZHJvcF9jb3VudCA9IDA7CiAKLSByZXRyeToKK3JldHJ5OgogCXJldCA9IGdldF9mdXRleF9rZXkodWFkZHIxLCBmc2hhcmVkLCAma2V5MSk7CiAJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkKIAkJZ290byBvdXQ7CiAJcmV0ID0gZ2V0X2Z1dGV4X2tleSh1YWRkcjIsIGZzaGFyZWQsICZrZXkyKTsKIAlpZiAodW5saWtlbHkocmV0ICE9IDApKQotCQlnb3RvIG91dDsKKwkJZ290byBvdXRfcHV0X2tleTE7CiAKIAloYjEgPSBoYXNoX2Z1dGV4KCZrZXkxKTsKIAloYjIgPSBoYXNoX2Z1dGV4KCZrZXkyKTsKQEAgLTg4Miw3ICs4ODYsNyBAQAogCQkJaWYgKCFyZXQpCiAJCQkJZ290byByZXRyeTsKIAotCQkJcmV0dXJuIHJldDsKKwkJCWdvdG8gb3V0X3B1dF9rZXlzOwogCQl9CiAJCWlmIChjdXJ2YWwgIT0gKmNtcHZhbCkgewogCQkJcmV0ID0gLUVBR0FJTjsKQEAgLTkyNyw5ICs5MzEsMTEgQEAKIAl3aGlsZSAoLS1kcm9wX2NvdW50ID49IDApCiAJCWRyb3BfZnV0ZXhfa2V5X3JlZnMoJmtleTEpOwogCi1vdXQ6CitvdXRfcHV0X2tleXM6CiAJcHV0X2Z1dGV4X2tleShmc2hhcmVkLCAma2V5Mik7CitvdXRfcHV0X2tleTE6CiAJcHV0X2Z1dGV4X2tleShmc2hhcmVkLCAma2V5MSk7CitvdXQ6CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtOTkwLDcgKzk5Niw3IEBACiAJaW50IHJldCA9IDA7CiAKIAkvKiBJbiB0aGUgY29tbW9uIGNhc2Ugd2UgZG9uJ3QgdGFrZSB0aGUgc3BpbmxvY2ssIHdoaWNoIGlzIG5pY2UuICovCi0gcmV0cnk6CityZXRyeToKIAlsb2NrX3B0ciA9IHEtPmxvY2tfcHRyOwogCWJhcnJpZXIoKTsKIAlpZiAobG9ja19wdHIgIT0gTlVMTCkgewpAQCAtMTE3MiwxMSArMTE3OCwxMSBAQAogCiAJcS5waV9zdGF0ZSA9IE5VTEw7CiAJcS5iaXRzZXQgPSBiaXRzZXQ7Ci0gcmV0cnk6CityZXRyeToKIAlxLmtleSA9IEZVVEVYX0tFWV9JTklUOwogCXJldCA9IGdldF9mdXRleF9rZXkodWFkZHIsIGZzaGFyZWQsICZxLmtleSk7CiAJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkKLQkJZ290byBvdXRfcmVsZWFzZV9zZW07CisJCWdvdG8gb3V0OwogCiAJaGIgPSBxdWV1ZV9sb2NrKCZxKTsKIApAQCAtMTIwNCw2ICsxMjEwLDcgQEAKIAogCWlmICh1bmxpa2VseShyZXQpKSB7CiAJCXF1ZXVlX3VubG9jaygmcSwgaGIpOworCQlwdXRfZnV0ZXhfa2V5KGZzaGFyZWQsICZxLmtleSk7CiAKIAkJcmV0ID0gZ2V0X3VzZXIodXZhbCwgdWFkZHIpOwogCkBAIC0xMjEzLDcgKzEyMjAsNyBAQAogCX0KIAlyZXQgPSAtRVdPVUxEQkxPQ0s7CiAJaWYgKHV2YWwgIT0gdmFsKQotCQlnb3RvIG91dF91bmxvY2tfcmVsZWFzZV9zZW07CisJCWdvdG8gb3V0X3VubG9ja19wdXRfa2V5OwogCiAJLyogT25seSBhY3R1YWxseSBxdWV1ZSBpZiAqdWFkZHIgY29udGFpbmVkIHZhbC4gICovCiAJcXVldWVfbWUoJnEsIGhiKTsKQEAgLTEzMDUsMTEgKzEzMTIsMTEgQEAKIAkJcmV0dXJuIC1FUkVTVEFSVF9SRVNUQVJUQkxPQ0s7CiAJfQogCi0gb3V0X3VubG9ja19yZWxlYXNlX3NlbToKK291dF91bmxvY2tfcHV0X2tleToKIAlxdWV1ZV91bmxvY2soJnEsIGhiKTsKLQotIG91dF9yZWxlYXNlX3NlbToKIAlwdXRfZnV0ZXhfa2V5KGZzaGFyZWQsICZxLmtleSk7CisKK291dDoKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0xMzU4LDE2ICsxMzY1LDE2IEBACiAJfQogCiAJcS5waV9zdGF0ZSA9IE5VTEw7Ci0gcmV0cnk6CityZXRyeToKIAlxLmtleSA9IEZVVEVYX0tFWV9JTklUOwogCXJldCA9IGdldF9mdXRleF9rZXkodWFkZHIsIGZzaGFyZWQsICZxLmtleSk7CiAJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkKLQkJZ290byBvdXRfcmVsZWFzZV9zZW07CisJCWdvdG8gb3V0OwogCi0gcmV0cnlfdW5sb2NrZWQ6CityZXRyeV91bmxvY2tlZDoKIAloYiA9IHF1ZXVlX2xvY2soJnEpOwogCi0gcmV0cnlfbG9ja2VkOgorcmV0cnlfbG9ja2VkOgogCXJldCA9IGxvY2tfdGFrZW4gPSAwOwogCiAJLyoKQEAgLTEzODgsMTQgKzEzOTUsMTQgQEAKIAkgKi8KIAlpZiAodW5saWtlbHkoKGN1cnZhbCAmIEZVVEVYX1RJRF9NQVNLKSA9PSB0YXNrX3BpZF92bnIoY3VycmVudCkpKSB7CiAJCXJldCA9IC1FREVBRExLOwotCQlnb3RvIG91dF91bmxvY2tfcmVsZWFzZV9zZW07CisJCWdvdG8gb3V0X3VubG9ja19wdXRfa2V5OwogCX0KIAogCS8qCiAJICogU3VycHJpc2UgLSB3ZSBnb3QgdGhlIGxvY2suIEp1c3QgcmV0dXJuIHRvIHVzZXJzcGFjZToKIAkgKi8KIAlpZiAodW5saWtlbHkoIWN1cnZhbCkpCi0JCWdvdG8gb3V0X3VubG9ja19yZWxlYXNlX3NlbTsKKwkJZ290byBvdXRfdW5sb2NrX3B1dF9rZXk7CiAKIAl1dmFsID0gY3VydmFsOwogCkBAIC0xNDMxLDcgKzE0MzgsNyBAQAogCSAqIFdlIHRvb2sgdGhlIGxvY2sgZHVlIHRvIG93bmVyIGRpZWQgdGFrZSBvdmVyLgogCSAqLwogCWlmICh1bmxpa2VseShsb2NrX3Rha2VuKSkKLQkJZ290byBvdXRfdW5sb2NrX3JlbGVhc2Vfc2VtOworCQlnb3RvIG91dF91bmxvY2tfcHV0X2tleTsKIAogCS8qCiAJICogV2UgZG9udCBoYXZlIHRoZSBsb2NrLiBMb29rIHVwIHRoZSBQSSBzdGF0ZSAob3IgY3JlYXRlIGl0IGlmCkBAIC0xNDcwLDcgKzE0NzcsNyBAQAogCQkJCWdvdG8gcmV0cnlfbG9ja2VkOwogCQkJfQogCQlkZWZhdWx0OgotCQkJZ290byBvdXRfdW5sb2NrX3JlbGVhc2Vfc2VtOworCQkJZ290byBvdXRfdW5sb2NrX3B1dF9rZXk7CiAJCX0KIAl9CiAKQEAgLTE1NjEsMTYgKzE1NjgsMTcgQEAKIAkJZGVzdHJveV9ocnRpbWVyX29uX3N0YWNrKCZ0by0+dGltZXIpOwogCXJldHVybiByZXQgIT0gLUVJTlRSID8gcmV0IDogLUVSRVNUQVJUTk9JTlRSOwogCi0gb3V0X3VubG9ja19yZWxlYXNlX3NlbToKK291dF91bmxvY2tfcHV0X2tleToKIAlxdWV1ZV91bmxvY2soJnEsIGhiKTsKIAotIG91dF9yZWxlYXNlX3NlbToKK291dF9wdXRfa2V5OgogCXB1dF9mdXRleF9rZXkoZnNoYXJlZCwgJnEua2V5KTsKK291dDoKIAlpZiAodG8pCiAJCWRlc3Ryb3lfaHJ0aW1lcl9vbl9zdGFjaygmdG8tPnRpbWVyKTsKIAlyZXR1cm4gcmV0OwogCi0gdWFkZHJfZmF1bHRlZDoKK3VhZGRyX2ZhdWx0ZWQ6CiAJLyoKIAkgKiBXZSBoYXZlIHRvIHIvdyAgKihpbnQgX191c2VyICopdWFkZHIsIGFuZCB3ZSBoYXZlIHRvIG1vZGlmeSBpdAogCSAqIGF0b21pY2FsbHkuICBUaGVyZWZvcmUsIGlmIHdlIGNvbnRpbnVlIHRvIGZhdWx0IGFmdGVyIGdldF91c2VyKCkKQEAgLTE1ODMsNyArMTU5MSw3IEBACiAJaWYgKGF0dGVtcHQrKykgewogCQlyZXQgPSBmdXRleF9oYW5kbGVfZmF1bHQoKHVuc2lnbmVkIGxvbmcpdWFkZHIsIGF0dGVtcHQpOwogCQlpZiAocmV0KQotCQkJZ290byBvdXRfcmVsZWFzZV9zZW07CisJCQlnb3RvIG91dF9wdXRfa2V5OwogCQlnb3RvIHJldHJ5X3VubG9ja2VkOwogCX0KIApAQCAtMTY3NSw5ICsxNjgzLDkgQEAKIAogb3V0X3VubG9jazoKIAlzcGluX3VubG9jaygmaGItPmxvY2spOwotb3V0OgogCXB1dF9mdXRleF9rZXkoZnNoYXJlZCwgJmtleSk7CiAKK291dDoKIAlyZXR1cm4gcmV0OwogCiBwaV9mYXVsdGVkOgpkaWZmIC0tZ2l0IGEva2VybmVsL2hydGltZXIuYyBiL2tlcm5lbC9ocnRpbWVyLmMKaW5kZXggZWIyYmZlZi4uMTQ1NWI3NiAxMDA2NDQKLS0tIGEva2VybmVsL2hydGltZXIuYworKysgYi9rZXJuZWwvaHJ0aW1lci5jCkBAIC02MzQsNyArNjM0LDYgQEAKIHsKIH0KIAotc3RhdGljIHZvaWQgX19ydW5faHJ0aW1lcihzdHJ1Y3QgaHJ0aW1lciAqdGltZXIpOwogCiAvKgogICogV2hlbiBIaWdoIHJlc29sdXRpb24gdGltZXJzIGFyZSBhY3RpdmUsIHRyeSB0byByZXByb2dyYW0uIE5vdGUsIHRoYXQgaW4gY2FzZQpAQCAtNjQ2LDEzICs2NDUsOSBAQAogCQkJCQkgICAgc3RydWN0IGhydGltZXJfY2xvY2tfYmFzZSAqYmFzZSkKIHsKIAlpZiAoYmFzZS0+Y3B1X2Jhc2UtPmhyZXNfYWN0aXZlICYmIGhydGltZXJfcmVwcm9ncmFtKHRpbWVyLCBiYXNlKSkgewotCQkvKgotCQkgKiBYWFg6IHJlY3Vyc2lvbiBjaGVjaz8KLQkJICogaHJ0aW1lcl9mb3J3YXJkKCkgc2hvdWxkIHJvdW5kIHVwIHdpdGggdGltZXIgZ3JhbnVsYXJpdHkKLQkJICogc28gdGhhdCB3ZSBuZXZlciBnZXQgaW50byBpbmYgcmVjdXJzaW9uIGhlcmUsCi0JCSAqIGl0IGRvZXNuJ3QgZG8gdGhhdCB0aG91Z2gKLQkJICovCi0JCV9fcnVuX2hydGltZXIodGltZXIpOworCQlzcGluX3VubG9jaygmYmFzZS0+Y3B1X2Jhc2UtPmxvY2spOworCQlyYWlzZV9zb2Z0aXJxX2lycW9mZihIUlRJTUVSX1NPRlRJUlEpOworCQlzcGluX2xvY2soJmJhc2UtPmNwdV9iYXNlLT5sb2NrKTsKIAkJcmV0dXJuIDE7CiAJfQogCXJldHVybiAwOwpAQCAtNzA1LDExICs3MDAsNiBAQAogfQogc3RhdGljIGlubGluZSB2b2lkIGhydGltZXJfaW5pdF9ocmVzKHN0cnVjdCBocnRpbWVyX2NwdV9iYXNlICpiYXNlKSB7IH0KIHN0YXRpYyBpbmxpbmUgdm9pZCBocnRpbWVyX2luaXRfdGltZXJfaHJlcyhzdHJ1Y3QgaHJ0aW1lciAqdGltZXIpIHsgfQotc3RhdGljIGlubGluZSBpbnQgaHJ0aW1lcl9yZXByb2dyYW0oc3RydWN0IGhydGltZXIgKnRpbWVyLAotCQkJCSAgICBzdHJ1Y3QgaHJ0aW1lcl9jbG9ja19iYXNlICpiYXNlKQotewotCXJldHVybiAwOwotfQogCiAjZW5kaWYgLyogQ09ORklHX0hJR0hfUkVTX1RJTUVSUyAqLwogCkBAIC03ODAsOSArNzcwLDExIEBACiAgKgogICogVGhlIHRpbWVyIGlzIGluc2VydGVkIGluIGV4cGlyeSBvcmRlci4gSW5zZXJ0aW9uIGludG8gdGhlCiAgKiByZWQgYmxhY2sgdHJlZSBpcyBPKGxvZyhuKSkuIE11c3QgaG9sZCB0aGUgYmFzZSBsb2NrLgorICoKKyAqIFJldHVybnMgMSB3aGVuIHRoZSBuZXcgdGltZXIgaXMgdGhlIGxlZnRtb3N0IHRpbWVyIGluIHRoZSB0cmVlLgogICovCi1zdGF0aWMgdm9pZCBlbnF1ZXVlX2hydGltZXIoc3RydWN0IGhydGltZXIgKnRpbWVyLAotCQkJICAgIHN0cnVjdCBocnRpbWVyX2Nsb2NrX2Jhc2UgKmJhc2UsIGludCByZXByb2dyYW0pCitzdGF0aWMgaW50IGVucXVldWVfaHJ0aW1lcihzdHJ1Y3QgaHJ0aW1lciAqdGltZXIsCisJCQkgICBzdHJ1Y3QgaHJ0aW1lcl9jbG9ja19iYXNlICpiYXNlKQogewogCXN0cnVjdCByYl9ub2RlICoqbGluayA9ICZiYXNlLT5hY3RpdmUucmJfbm9kZTsKIAlzdHJ1Y3QgcmJfbm9kZSAqcGFyZW50ID0gTlVMTDsKQEAgLTgxNCwyMCArODA2LDggQEAKIAkgKiBJbnNlcnQgdGhlIHRpbWVyIHRvIHRoZSByYnRyZWUgYW5kIGNoZWNrIHdoZXRoZXIgaXQKIAkgKiByZXBsYWNlcyB0aGUgZmlyc3QgcGVuZGluZyB0aW1lcgogCSAqLwotCWlmIChsZWZ0bW9zdCkgewotCQkvKgotCQkgKiBSZXByb2dyYW0gdGhlIGNsb2NrIGV2ZW50IGRldmljZS4gV2hlbiB0aGUgdGltZXIgaXMgYWxyZWFkeQotCQkgKiBleHBpcmVkIGhydGltZXJfZW5xdWV1ZV9yZXByb2dyYW0gaGFzIGVpdGhlciBjYWxsZWQgdGhlCi0JCSAqIGNhbGxiYWNrIG9yIGFkZGVkIGl0IHRvIHRoZSBwZW5kaW5nIGxpc3QgYW5kIHJhaXNlZCB0aGUKLQkJICogc29mdGlycS4KLQkJICoKLQkJICogVGhpcyBpcyBhIE5PUCBmb3IgIUhJR0hSRVMKLQkJICovCi0JCWlmIChyZXByb2dyYW0gJiYgaHJ0aW1lcl9lbnF1ZXVlX3JlcHJvZ3JhbSh0aW1lciwgYmFzZSkpCi0JCQlyZXR1cm47Ci0KKwlpZiAobGVmdG1vc3QpCiAJCWJhc2UtPmZpcnN0ID0gJnRpbWVyLT5ub2RlOwotCX0KIAogCXJiX2xpbmtfbm9kZSgmdGltZXItPm5vZGUsIHBhcmVudCwgbGluayk7CiAJcmJfaW5zZXJ0X2NvbG9yKCZ0aW1lci0+bm9kZSwgJmJhc2UtPmFjdGl2ZSk7CkBAIC04MzYsNiArODE2LDggQEAKIAkgKiBzdGF0ZSBvZiBhIHBvc3NpYmx5IHJ1bm5pbmcgY2FsbGJhY2suCiAJICovCiAJdGltZXItPnN0YXRlIHw9IEhSVElNRVJfU1RBVEVfRU5RVUVVRUQ7CisKKwlyZXR1cm4gbGVmdG1vc3Q7CiB9CiAKIC8qCkBAIC05MTIsNyArODk0LDcgQEAKIHsKIAlzdHJ1Y3QgaHJ0aW1lcl9jbG9ja19iYXNlICpiYXNlLCAqbmV3X2Jhc2U7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgcmV0OworCWludCByZXQsIGxlZnRtb3N0OwogCiAJYmFzZSA9IGxvY2tfaHJ0aW1lcl9iYXNlKHRpbWVyLCAmZmxhZ3MpOwogCkBAIC05NDAsMTIgKzkyMiwxNiBAQAogCiAJdGltZXJfc3RhdHNfaHJ0aW1lcl9zZXRfc3RhcnRfaW5mbyh0aW1lcik7CiAKKwlsZWZ0bW9zdCA9IGVucXVldWVfaHJ0aW1lcih0aW1lciwgbmV3X2Jhc2UpOworCiAJLyoKIAkgKiBPbmx5IGFsbG93IHJlcHJvZ3JhbW1pbmcgaWYgdGhlIG5ldyBiYXNlIGlzIG9uIHRoaXMgQ1BVLgogCSAqIChpdCBtaWdodCBzdGlsbCBiZSBvbiBhbm90aGVyIENQVSBpZiB0aGUgdGltZXIgd2FzIHBlbmRpbmcpCisJICoKKwkgKiBYWFggc2VuZF9yZW1vdGVfc29mdGlycSgpID8KIAkgKi8KLQllbnF1ZXVlX2hydGltZXIodGltZXIsIG5ld19iYXNlLAotCQkJbmV3X2Jhc2UtPmNwdV9iYXNlID09ICZfX2dldF9jcHVfdmFyKGhydGltZXJfYmFzZXMpKTsKKwlpZiAobGVmdG1vc3QgJiYgbmV3X2Jhc2UtPmNwdV9iYXNlID09ICZfX2dldF9jcHVfdmFyKGhydGltZXJfYmFzZXMpKQorCQlocnRpbWVyX2VucXVldWVfcmVwcm9ncmFtKHRpbWVyLCBuZXdfYmFzZSk7CiAKIAl1bmxvY2tfaHJ0aW1lcl9iYXNlKHRpbWVyLCAmZmxhZ3MpOwogCkBAIC0xMTU3LDEzICsxMTQzLDEzIEBACiAJc3Bpbl9sb2NrKCZjcHVfYmFzZS0+bG9jayk7CiAKIAkvKgotCSAqIE5vdGU6IFdlIGNsZWFyIHRoZSBDQUxMQkFDSyBiaXQgYWZ0ZXIgZW5xdWV1ZV9ocnRpbWVyIHRvIGF2b2lkCi0JICogcmVwcm9ncmFtbWluZyBvZiB0aGUgZXZlbnQgaGFyZHdhcmUuIFRoaXMgaGFwcGVucyBhdCB0aGUgZW5kIG9mIHRoaXMKLQkgKiBmdW5jdGlvbiBhbnl3YXkuCisJICogTm90ZTogV2UgY2xlYXIgdGhlIENBTExCQUNLIGJpdCBhZnRlciBlbnF1ZXVlX2hydGltZXIgYW5kCisJICogd2UgZG8gbm90IHJlcHJvZ3JhbW0gdGhlIGV2ZW50IGhhcmR3YXJlLiBIYXBwZW5zIGVpdGhlciBpbgorCSAqIGhydGltZXJfc3RhcnRfcmFuZ2VfbnMoKSBvciBpbiBocnRpbWVyX2ludGVycnVwdCgpCiAJICovCiAJaWYgKHJlc3RhcnQgIT0gSFJUSU1FUl9OT1JFU1RBUlQpIHsKIAkJQlVHX09OKHRpbWVyLT5zdGF0ZSAhPSBIUlRJTUVSX1NUQVRFX0NBTExCQUNLKTsKLQkJZW5xdWV1ZV9ocnRpbWVyKHRpbWVyLCBiYXNlLCAwKTsKKwkJZW5xdWV1ZV9ocnRpbWVyKHRpbWVyLCBiYXNlKTsKIAl9CiAJdGltZXItPnN0YXRlICY9IH5IUlRJTUVSX1NUQVRFX0NBTExCQUNLOwogfQpAQCAtMTI0Myw2ICsxMjI5LDIyIEBACiAJfQogfQogCisvKgorICogbG9jYWwgdmVyc2lvbiBvZiBocnRpbWVyX3BlZWtfYWhlYWRfdGltZXJzKCkgY2FsbGVkIHdpdGggaW50ZXJydXB0cworICogZGlzYWJsZWQuCisgKi8KK3N0YXRpYyB2b2lkIF9faHJ0aW1lcl9wZWVrX2FoZWFkX3RpbWVycyh2b2lkKQoreworCXN0cnVjdCB0aWNrX2RldmljZSAqdGQ7CisKKwlpZiAoIWhydGltZXJfaHJlc19hY3RpdmUoKSkKKwkJcmV0dXJuOworCisJdGQgPSAmX19nZXRfY3B1X3Zhcih0aWNrX2NwdV9kZXZpY2UpOworCWlmICh0ZCAmJiB0ZC0+ZXZ0ZGV2KQorCQlocnRpbWVyX2ludGVycnVwdCh0ZC0+ZXZ0ZGV2KTsKK30KKwogLyoqCiAgKiBocnRpbWVyX3BlZWtfYWhlYWRfdGltZXJzIC0tIHJ1biBzb2Z0LWV4cGlyZWQgdGltZXJzIG5vdwogICoKQEAgLTEyNTQsMjAgKzEyNTYsMjMgQEAKICAqLwogdm9pZCBocnRpbWVyX3BlZWtfYWhlYWRfdGltZXJzKHZvaWQpCiB7Ci0Jc3RydWN0IHRpY2tfZGV2aWNlICp0ZDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JaWYgKCFocnRpbWVyX2hyZXNfYWN0aXZlKCkpCi0JCXJldHVybjsKLQogCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQl0ZCA9ICZfX2dldF9jcHVfdmFyKHRpY2tfY3B1X2RldmljZSk7Ci0JaWYgKHRkICYmIHRkLT5ldnRkZXYpCi0JCWhydGltZXJfaW50ZXJydXB0KHRkLT5ldnRkZXYpOworCV9faHJ0aW1lcl9wZWVrX2FoZWFkX3RpbWVycygpOwogCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIH0KIAotI2VuZGlmCS8qIENPTkZJR19ISUdIX1JFU19USU1FUlMgKi8KK3N0YXRpYyB2b2lkIHJ1bl9ocnRpbWVyX3NvZnRpcnEoc3RydWN0IHNvZnRpcnFfYWN0aW9uICpoKQoreworCWhydGltZXJfcGVla19haGVhZF90aW1lcnMoKTsKK30KKworI2Vsc2UgLyogQ09ORklHX0hJR0hfUkVTX1RJTUVSUyAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgX19ocnRpbWVyX3BlZWtfYWhlYWRfdGltZXJzKHZvaWQpIHsgfQorCisjZW5kaWYJLyogIUNPTkZJR19ISUdIX1JFU19USU1FUlMgKi8KIAogLyoKICAqIENhbGxlZCBmcm9tIHRpbWVyIHNvZnRpcnEgZXZlcnkgamlmZnksIGV4cGlyZSBocnRpbWVyczoKQEAgLTE1MTMsMzkgKzE1MTgsMzYgQEAKIAkJX19yZW1vdmVfaHJ0aW1lcih0aW1lciwgb2xkX2Jhc2UsIEhSVElNRVJfU1RBVEVfTUlHUkFURSwgMCk7CiAJCXRpbWVyLT5iYXNlID0gbmV3X2Jhc2U7CiAJCS8qCi0JCSAqIEVucXVldWUgdGhlIHRpbWVycyBvbiB0aGUgbmV3IGNwdSwgYnV0IGRvIG5vdCByZXByb2dyYW0gCi0JCSAqIHRoZSB0aW1lciBhcyB0aGF0IHdvdWxkIGVuYWJsZSBhIGRlYWRsb2NrIGJldHdlZW4KLQkJICogaHJ0aW1lcl9lbnF1ZXVlX3JlcHJvZ3JhbW0oKSBydW5uaW5nIHRoZSB0aW1lciBhbmQgdXMgc3RpbGwKLQkJICogaG9sZGluZyBhIG5lc3RlZCBiYXNlIGxvY2suCi0JCSAqCi0JCSAqIEluc3RlYWQgd2UgdGlja2xlIHRoZSBocnRpbWVyIGludGVycnVwdCBhZnRlciB0aGUgbWlncmF0aW9uCi0JCSAqIGlzIGRvbmUsIHdoaWNoIHdpbGwgcnVuIGFsbCBleHBpcmVkIHRpbWVycyBhbmQgcmUtcHJvZ3JhbW0KLQkJICogdGhlIHRpbWVyIGRldmljZS4KKwkJICogRW5xdWV1ZSB0aGUgdGltZXJzIG9uIHRoZSBuZXcgY3B1LiBUaGlzIGRvZXMgbm90CisJCSAqIHJlcHJvZ3JhbSB0aGUgZXZlbnQgZGV2aWNlIGluIGNhc2UgdGhlIHRpbWVyCisJCSAqIGV4cGlyZXMgYmVmb3JlIHRoZSBlYXJsaWVzdCBvbiB0aGlzIENQVSwgYnV0IHdlIHJ1bgorCQkgKiBocnRpbWVyX2ludGVycnVwdCBhZnRlciB3ZSBtaWdyYXRlZCBldmVyeXRoaW5nIHRvCisJCSAqIHNvcnQgb3V0IGFscmVhZHkgZXhwaXJlZCB0aW1lcnMgYW5kIHJlcHJvZ3JhbSB0aGUKKwkJICogZXZlbnQgZGV2aWNlLgogCQkgKi8KLQkJZW5xdWV1ZV9ocnRpbWVyKHRpbWVyLCBuZXdfYmFzZSwgMCk7CisJCWVucXVldWVfaHJ0aW1lcih0aW1lciwgbmV3X2Jhc2UpOwogCiAJCS8qIENsZWFyIHRoZSBtaWdyYXRpb24gc3RhdGUgYml0ICovCiAJCXRpbWVyLT5zdGF0ZSAmPSB+SFJUSU1FUl9TVEFURV9NSUdSQVRFOwogCX0KIH0KIAotc3RhdGljIGludCBtaWdyYXRlX2hydGltZXJzKGludCBzY3B1KQorc3RhdGljIHZvaWQgbWlncmF0ZV9ocnRpbWVycyhpbnQgc2NwdSkKIHsKIAlzdHJ1Y3QgaHJ0aW1lcl9jcHVfYmFzZSAqb2xkX2Jhc2UsICpuZXdfYmFzZTsKLQlpbnQgZGNwdSwgaTsKKwlpbnQgaTsKIAogCUJVR19PTihjcHVfb25saW5lKHNjcHUpKTsKLQlvbGRfYmFzZSA9ICZwZXJfY3B1KGhydGltZXJfYmFzZXMsIHNjcHUpOwotCW5ld19iYXNlID0gJmdldF9jcHVfdmFyKGhydGltZXJfYmFzZXMpOwotCi0JZGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKLQogCXRpY2tfY2FuY2VsX3NjaGVkX3RpbWVyKHNjcHUpOworCisJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKwlvbGRfYmFzZSA9ICZwZXJfY3B1KGhydGltZXJfYmFzZXMsIHNjcHUpOworCW5ld19iYXNlID0gJl9fZ2V0X2NwdV92YXIoaHJ0aW1lcl9iYXNlcyk7CiAJLyoKIAkgKiBUaGUgY2FsbGVyIGlzIGdsb2JhbGx5IHNlcmlhbGl6ZWQgYW5kIG5vYm9keSBlbHNlCiAJICogdGFrZXMgdHdvIGxvY2tzIGF0IG9uY2UsIGRlYWRsb2NrIGlzIG5vdCBwb3NzaWJsZS4KIAkgKi8KLQlzcGluX2xvY2tfaXJxKCZuZXdfYmFzZS0+bG9jayk7CisJc3Bpbl9sb2NrKCZuZXdfYmFzZS0+bG9jayk7CiAJc3Bpbl9sb2NrX25lc3RlZCgmb2xkX2Jhc2UtPmxvY2ssIFNJTkdMRV9ERVBUSF9ORVNUSU5HKTsKIAogCWZvciAoaSA9IDA7IGkgPCBIUlRJTUVSX01BWF9DTE9DS19CQVNFUzsgaSsrKSB7CkBAIC0xNTU0LDE1ICsxNTU2LDExIEBACiAJfQogCiAJc3Bpbl91bmxvY2soJm9sZF9iYXNlLT5sb2NrKTsKLQlzcGluX3VubG9ja19pcnEoJm5ld19iYXNlLT5sb2NrKTsKLQlwdXRfY3B1X3ZhcihocnRpbWVyX2Jhc2VzKTsKKwlzcGluX3VubG9jaygmbmV3X2Jhc2UtPmxvY2spOwogCi0JcmV0dXJuIGRjcHU7Ci19Ci0KLXN0YXRpYyB2b2lkIHRpY2tsZV90aW1lcnModm9pZCAqYXJnKQotewotCWhydGltZXJfcGVla19haGVhZF90aW1lcnMoKTsKKwkvKiBDaGVjaywgaWYgd2UgZ290IGV4cGlyZWQgd29yayB0byBkbyAqLworCV9faHJ0aW1lcl9wZWVrX2FoZWFkX3RpbWVycygpOworCWxvY2FsX2lycV9lbmFibGUoKTsKIH0KIAogI2VuZGlmIC8qIENPTkZJR19IT1RQTFVHX0NQVSAqLwpAQCAtMTU4MywxMSArMTU4MSw4IEBACiAJY2FzZSBDUFVfREVBRDoKIAljYXNlIENQVV9ERUFEX0ZST1pFTjoKIAl7Ci0JCWludCBkY3B1OwotCiAJCWNsb2NrZXZlbnRzX25vdGlmeShDTE9DS19FVlRfTk9USUZZX0NQVV9ERUFELCAmc2NwdSk7Ci0JCWRjcHUgPSBtaWdyYXRlX2hydGltZXJzKHNjcHUpOwotCQlzbXBfY2FsbF9mdW5jdGlvbl9zaW5nbGUoZGNwdSwgdGlja2xlX3RpbWVycywgTlVMTCwgMCk7CisJCW1pZ3JhdGVfaHJ0aW1lcnMoc2NwdSk7CiAJCWJyZWFrOwogCX0KICNlbmRpZgpAQCAtMTYwOCw2ICsxNjAzLDkgQEAKIAlocnRpbWVyX2NwdV9ub3RpZnkoJmhydGltZXJzX25iLCAodW5zaWduZWQgbG9uZylDUFVfVVBfUFJFUEFSRSwKIAkJCSAgKHZvaWQgKikobG9uZylzbXBfcHJvY2Vzc29yX2lkKCkpOwogCXJlZ2lzdGVyX2NwdV9ub3RpZmllcigmaHJ0aW1lcnNfbmIpOworI2lmZGVmIENPTkZJR19ISUdIX1JFU19USU1FUlMKKwlvcGVuX3NvZnRpcnEoSFJUSU1FUl9TT0ZUSVJRLCBydW5faHJ0aW1lcl9zb2Z0aXJxKTsKKyNlbmRpZgogfQogCiAvKioKZGlmZiAtLWdpdCBhL2tlcm5lbC9pcnEvYXV0b3Byb2JlLmMgYi9rZXJuZWwvaXJxL2F1dG9wcm9iZS5jCmluZGV4IGNjMGY3MzIuLjFkZTk3MDAgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9pcnEvYXV0b3Byb2JlLmMKKysrIGIva2VybmVsL2lycS9hdXRvcHJvYmUuYwpAQCAtMTAsNiArMTAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvYXN5bmMuaD4KIAogI2luY2x1ZGUgImludGVybmFscy5oIgogCkBAIC0zNCw2ICszNSwxMCBAQAogCXVuc2lnbmVkIGludCBzdGF0dXM7CiAJaW50IGk7CiAKKwkvKgorCSAqIHF1aWVzY2UgdGhlIGtlcm5lbCwgb3IgYXQgbGVhc3QgdGhlIGFzeW5jaHJvbm91cyBwb3J0aW9uCisJICovCisJYXN5bmNfc3luY2hyb25pemVfZnVsbCgpOwogCW11dGV4X2xvY2soJnByb2JpbmdfYWN0aXZlKTsKIAkvKgogCSAqIHNvbWV0aGluZyBtYXkgaGF2ZSBnZW5lcmF0ZWQgYW4gaXJxIGxvbmcgYWdvIGFuZCB3ZSB3YW50IHRvCmRpZmYgLS1naXQgYS9rZXJuZWwva21vZC5jIGIva2VybmVsL2ttb2QuYwppbmRleCBiNDZkYmI5Li5hMjdhNWY2IDEwMDY0NAotLS0gYS9rZXJuZWwva21vZC5jCisrKyBiL2tlcm5lbC9rbW9kLmMKQEAgLTUxLDggKzUxLDggQEAKIAogLyoqCiAgKiByZXF1ZXN0X21vZHVsZSAtIHRyeSB0byBsb2FkIGEga2VybmVsIG1vZHVsZQotICogQGZtdDogICAgIHByaW50ZiBzdHlsZSBmb3JtYXQgc3RyaW5nIGZvciB0aGUgbmFtZSBvZiB0aGUgbW9kdWxlCi0gKiBAdmFyYXJnczogYXJndWVtZW50cyBhcyBzcGVjaWZpZWQgaW4gdGhlIGZvcm1hdCBzdHJpbmcKKyAqIEBmbXQ6IHByaW50ZiBzdHlsZSBmb3JtYXQgc3RyaW5nIGZvciB0aGUgbmFtZSBvZiB0aGUgbW9kdWxlCisgKiBALi4uOiBhcmd1bWVudHMgYXMgc3BlY2lmaWVkIGluIHRoZSBmb3JtYXQgc3RyaW5nCiAgKgogICogTG9hZCBhIG1vZHVsZSB1c2luZyB0aGUgdXNlciBtb2RlIG1vZHVsZSBsb2FkZXIuIFRoZSBmdW5jdGlvbiByZXR1cm5zCiAgKiB6ZXJvIG9uIHN1Y2Nlc3Mgb3IgYSBuZWdhdGl2ZSBlcnJubyBjb2RlIG9uIGZhaWx1cmUuIE5vdGUgdGhhdCBhCmRpZmYgLS1naXQgYS9rZXJuZWwva3Byb2Jlcy5jIGIva2VybmVsL2twcm9iZXMuYwppbmRleCA5ZjhhM2YyLi4xYjljYmRjIDEwMDY0NAotLS0gYS9rZXJuZWwva3Byb2Jlcy5jCisrKyBiL2tlcm5lbC9rcHJvYmVzLmMKQEAgLTY5LDcgKzY5LDcgQEAKIC8qIE5PVEU6IGNoYW5nZSB0aGlzIHZhbHVlIG9ubHkgd2l0aCBrcHJvYmVfbXV0ZXggaGVsZCAqLwogc3RhdGljIGJvb2wga3Byb2JlX2VuYWJsZWQ7CiAKLURFRklORV9NVVRFWChrcHJvYmVfbXV0ZXgpOwkJLyogUHJvdGVjdHMga3Byb2JlX3RhYmxlICovCitzdGF0aWMgREVGSU5FX01VVEVYKGtwcm9iZV9tdXRleCk7CS8qIFByb3RlY3RzIGtwcm9iZV90YWJsZSAqLwogc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBrcHJvYmUgKiwga3Byb2JlX2luc3RhbmNlKSA9IE5VTEw7CiBzdGF0aWMgc3RydWN0IHsKIAlzcGlubG9ja190IGxvY2sgX19fX2NhY2hlbGluZV9hbGlnbmVkX2luX3NtcDsKQEAgLTExNSw2ICsxMTUsNyBAQAogCVNMT1RfVVNFRCA9IDIsCiB9OwogCitzdGF0aWMgREVGSU5FX01VVEVYKGtwcm9iZV9pbnNuX211dGV4KTsJLyogUHJvdGVjdHMga3Byb2JlX2luc25fcGFnZXMgKi8KIHN0YXRpYyBzdHJ1Y3QgaGxpc3RfaGVhZCBrcHJvYmVfaW5zbl9wYWdlczsKIHN0YXRpYyBpbnQga3Byb2JlX2dhcmJhZ2Vfc2xvdHM7CiBzdGF0aWMgaW50IGNvbGxlY3RfZ2FyYmFnZV9zbG90cyh2b2lkKTsKQEAgLTE0NCwxMCArMTQ1LDEwIEBACiB9CiAKIC8qKgotICogZ2V0X2luc25fc2xvdCgpIC0gRmluZCBhIHNsb3Qgb24gYW4gZXhlY3V0YWJsZSBwYWdlIGZvciBhbiBpbnN0cnVjdGlvbi4KKyAqIF9fZ2V0X2luc25fc2xvdCgpIC0gRmluZCBhIHNsb3Qgb24gYW4gZXhlY3V0YWJsZSBwYWdlIGZvciBhbiBpbnN0cnVjdGlvbi4KICAqIFdlIGFsbG9jYXRlIGFuIGV4ZWN1dGFibGUgcGFnZSBpZiB0aGVyZSdzIG5vIHJvb20gb24gZXhpc3Rpbmcgb25lcy4KICAqLwota3Byb2JlX29wY29kZV90IF9fa3Byb2JlcyAqZ2V0X2luc25fc2xvdCh2b2lkKQorc3RhdGljIGtwcm9iZV9vcGNvZGVfdCBfX2twcm9iZXMgKl9fZ2V0X2luc25fc2xvdCh2b2lkKQogewogCXN0cnVjdCBrcHJvYmVfaW5zbl9wYWdlICpraXA7CiAJc3RydWN0IGhsaXN0X25vZGUgKnBvczsKQEAgLTE5Niw2ICsxOTcsMTUgQEAKIAlyZXR1cm4ga2lwLT5pbnNuczsKIH0KIAora3Byb2JlX29wY29kZV90IF9fa3Byb2JlcyAqZ2V0X2luc25fc2xvdCh2b2lkKQoreworCWtwcm9iZV9vcGNvZGVfdCAqcmV0OworCW11dGV4X2xvY2soJmtwcm9iZV9pbnNuX211dGV4KTsKKwlyZXQgPSBfX2dldF9pbnNuX3Nsb3QoKTsKKwltdXRleF91bmxvY2soJmtwcm9iZV9pbnNuX211dGV4KTsKKwlyZXR1cm4gcmV0OworfQorCiAvKiBSZXR1cm4gMSBpZiBhbGwgZ2FyYmFnZXMgYXJlIGNvbGxlY3RlZCwgb3RoZXJ3aXNlIDAuICovCiBzdGF0aWMgaW50IF9fa3Byb2JlcyBjb2xsZWN0X29uZV9zbG90KHN0cnVjdCBrcHJvYmVfaW5zbl9wYWdlICpraXAsIGludCBpZHgpCiB7CkBAIC0yMjYsOSArMjM2LDEzIEBACiB7CiAJc3RydWN0IGtwcm9iZV9pbnNuX3BhZ2UgKmtpcDsKIAlzdHJ1Y3QgaGxpc3Rfbm9kZSAqcG9zLCAqbmV4dDsKKwlpbnQgc2FmZXR5OwogCiAJLyogRW5zdXJlIG5vLW9uZSBpcyBwcmVlcG10ZWQgb24gdGhlIGdhcmJhZ2VzICovCi0JaWYgKGNoZWNrX3NhZmV0eSgpICE9IDApCisJbXV0ZXhfdW5sb2NrKCZrcHJvYmVfaW5zbl9tdXRleCk7CisJc2FmZXR5ID0gY2hlY2tfc2FmZXR5KCk7CisJbXV0ZXhfbG9jaygma3Byb2JlX2luc25fbXV0ZXgpOworCWlmIChzYWZldHkgIT0gMCkKIAkJcmV0dXJuIC1FQUdBSU47CiAKIAlobGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGtpcCwgcG9zLCBuZXh0LCAma3Byb2JlX2luc25fcGFnZXMsIGhsaXN0KSB7CkBAIC0yNTEsNiArMjY1LDcgQEAKIAlzdHJ1Y3Qga3Byb2JlX2luc25fcGFnZSAqa2lwOwogCXN0cnVjdCBobGlzdF9ub2RlICpwb3M7CiAKKwltdXRleF9sb2NrKCZrcHJvYmVfaW5zbl9tdXRleCk7CiAJaGxpc3RfZm9yX2VhY2hfZW50cnkoa2lwLCBwb3MsICZrcHJvYmVfaW5zbl9wYWdlcywgaGxpc3QpIHsKIAkJaWYgKGtpcC0+aW5zbnMgPD0gc2xvdCAmJgogCQkgICAgc2xvdCA8IGtpcC0+aW5zbnMgKyAoSU5TTlNfUEVSX1BBR0UgKiBNQVhfSU5TTl9TSVpFKSkgewpAQCAtMjY3LDYgKzI4Miw4IEBACiAKIAlpZiAoZGlydHkgJiYgKytrcHJvYmVfZ2FyYmFnZV9zbG90cyA+IElOU05TX1BFUl9QQUdFKQogCQljb2xsZWN0X2dhcmJhZ2Vfc2xvdHMoKTsKKworCW11dGV4X3VubG9jaygma3Byb2JlX2luc25fbXV0ZXgpOwogfQogI2VuZGlmCiAKQEAgLTMxMCw3ICszMjcsNyBAQAogCXN0cnVjdCBrcHJvYmUgKmtwOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3Uoa3AsICZwLT5saXN0LCBsaXN0KSB7Ci0JCWlmIChrcC0+cHJlX2hhbmRsZXIpIHsKKwkJaWYgKGtwLT5wcmVfaGFuZGxlciAmJiAha3Byb2JlX2dvbmUoa3ApKSB7CiAJCQlzZXRfa3Byb2JlX2luc3RhbmNlKGtwKTsKIAkJCWlmIChrcC0+cHJlX2hhbmRsZXIoa3AsIHJlZ3MpKQogCQkJCXJldHVybiAxOwpAQCAtMzI2LDcgKzM0Myw3IEBACiAJc3RydWN0IGtwcm9iZSAqa3A7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShrcCwgJnAtPmxpc3QsIGxpc3QpIHsKLQkJaWYgKGtwLT5wb3N0X2hhbmRsZXIpIHsKKwkJaWYgKGtwLT5wb3N0X2hhbmRsZXIgJiYgIWtwcm9iZV9nb25lKGtwKSkgewogCQkJc2V0X2twcm9iZV9pbnN0YW5jZShrcCk7CiAJCQlrcC0+cG9zdF9oYW5kbGVyKGtwLCByZWdzLCBmbGFncyk7CiAJCQlyZXNldF9rcHJvYmVfaW5zdGFuY2UoKTsKQEAgLTM5Myw3ICs0MTAsNyBAQAogCQlobGlzdF9hZGRfaGVhZCgmcmktPmhsaXN0LCBoZWFkKTsKIH0KIAotdm9pZCBrcmV0cHJvYmVfaGFzaF9sb2NrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLAordm9pZCBfX2twcm9iZXMga3JldHByb2JlX2hhc2hfbG9jayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywKIAkJCSBzdHJ1Y3QgaGxpc3RfaGVhZCAqKmhlYWQsIHVuc2lnbmVkIGxvbmcgKmZsYWdzKQogewogCXVuc2lnbmVkIGxvbmcgaGFzaCA9IGhhc2hfcHRyKHRzaywgS1BST0JFX0hBU0hfQklUUyk7CkBAIC00MDQsMTMgKzQyMSwxNSBAQAogCXNwaW5fbG9ja19pcnFzYXZlKGhsaXN0X2xvY2ssICpmbGFncyk7CiB9CiAKLXN0YXRpYyB2b2lkIGtyZXRwcm9iZV90YWJsZV9sb2NrKHVuc2lnbmVkIGxvbmcgaGFzaCwgdW5zaWduZWQgbG9uZyAqZmxhZ3MpCitzdGF0aWMgdm9pZCBfX2twcm9iZXMga3JldHByb2JlX3RhYmxlX2xvY2sodW5zaWduZWQgbG9uZyBoYXNoLAorCXVuc2lnbmVkIGxvbmcgKmZsYWdzKQogewogCXNwaW5sb2NrX3QgKmhsaXN0X2xvY2sgPSBrcmV0cHJvYmVfdGFibGVfbG9ja19wdHIoaGFzaCk7CiAJc3Bpbl9sb2NrX2lycXNhdmUoaGxpc3RfbG9jaywgKmZsYWdzKTsKIH0KIAotdm9pZCBrcmV0cHJvYmVfaGFzaF91bmxvY2soc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIHVuc2lnbmVkIGxvbmcgKmZsYWdzKQordm9pZCBfX2twcm9iZXMga3JldHByb2JlX2hhc2hfdW5sb2NrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLAorCXVuc2lnbmVkIGxvbmcgKmZsYWdzKQogewogCXVuc2lnbmVkIGxvbmcgaGFzaCA9IGhhc2hfcHRyKHRzaywgS1BST0JFX0hBU0hfQklUUyk7CiAJc3BpbmxvY2tfdCAqaGxpc3RfbG9jazsKQEAgLTQxOSw3ICs0MzgsNyBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoaGxpc3RfbG9jaywgKmZsYWdzKTsKIH0KIAotdm9pZCBrcmV0cHJvYmVfdGFibGVfdW5sb2NrKHVuc2lnbmVkIGxvbmcgaGFzaCwgdW5zaWduZWQgbG9uZyAqZmxhZ3MpCit2b2lkIF9fa3Byb2JlcyBrcmV0cHJvYmVfdGFibGVfdW5sb2NrKHVuc2lnbmVkIGxvbmcgaGFzaCwgdW5zaWduZWQgbG9uZyAqZmxhZ3MpCiB7CiAJc3BpbmxvY2tfdCAqaGxpc3RfbG9jayA9IGtyZXRwcm9iZV90YWJsZV9sb2NrX3B0cihoYXNoKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKGhsaXN0X2xvY2ssICpmbGFncyk7CkBAIC01MjYsOSArNTQ1LDEwIEBACiAJYXAtPmFkZHIgPSBwLT5hZGRyOwogCWFwLT5wcmVfaGFuZGxlciA9IGFnZ3JfcHJlX2hhbmRsZXI7CiAJYXAtPmZhdWx0X2hhbmRsZXIgPSBhZ2dyX2ZhdWx0X2hhbmRsZXI7Ci0JaWYgKHAtPnBvc3RfaGFuZGxlcikKKwkvKiBXZSBkb24ndCBjYXJlIHRoZSBrcHJvYmUgd2hpY2ggaGFzIGdvbmUuICovCisJaWYgKHAtPnBvc3RfaGFuZGxlciAmJiAha3Byb2JlX2dvbmUocCkpCiAJCWFwLT5wb3N0X2hhbmRsZXIgPSBhZ2dyX3Bvc3RfaGFuZGxlcjsKLQlpZiAocC0+YnJlYWtfaGFuZGxlcikKKwlpZiAocC0+YnJlYWtfaGFuZGxlciAmJiAha3Byb2JlX2dvbmUocCkpCiAJCWFwLT5icmVha19oYW5kbGVyID0gYWdncl9icmVha19oYW5kbGVyOwogCiAJSU5JVF9MSVNUX0hFQUQoJmFwLT5saXN0KTsKQEAgLTU0NywxNyArNTY3LDQxIEBACiAJaW50IHJldCA9IDA7CiAJc3RydWN0IGtwcm9iZSAqYXA7CiAKKwlpZiAoa3Byb2JlX2dvbmUob2xkX3ApKSB7CisJCS8qCisJCSAqIEF0dGVtcHRpbmcgdG8gaW5zZXJ0IG5ldyBwcm9iZSBhdCB0aGUgc2FtZSBsb2NhdGlvbiB0aGF0CisJCSAqIGhhZCBhIHByb2JlIGluIHRoZSBtb2R1bGUgdmFkZHIgYXJlYSB3aGljaCBhbHJlYWR5CisJCSAqIGZyZWVkLiBTbywgdGhlIGluc3RydWN0aW9uIHNsb3QgaGFzIGFscmVhZHkgYmVlbgorCQkgKiByZWxlYXNlZC4gV2UgbmVlZCBhIG5ldyBzbG90IGZvciB0aGUgbmV3IHByb2JlLgorCQkgKi8KKwkJcmV0ID0gYXJjaF9wcmVwYXJlX2twcm9iZShvbGRfcCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCX0KIAlpZiAob2xkX3AtPnByZV9oYW5kbGVyID09IGFnZ3JfcHJlX2hhbmRsZXIpIHsKIAkJY29weV9rcHJvYmUob2xkX3AsIHApOwogCQlyZXQgPSBhZGRfbmV3X2twcm9iZShvbGRfcCwgcCk7CisJCWFwID0gb2xkX3A7CiAJfSBlbHNlIHsKIAkJYXAgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qga3Byb2JlKSwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghYXApCisJCWlmICghYXApIHsKKwkJCWlmIChrcHJvYmVfZ29uZShvbGRfcCkpCisJCQkJYXJjaF9yZW1vdmVfa3Byb2JlKG9sZF9wKTsKIAkJCXJldHVybiAtRU5PTUVNOworCQl9CiAJCWFkZF9hZ2dyX2twcm9iZShhcCwgb2xkX3ApOwogCQljb3B5X2twcm9iZShhcCwgcCk7CiAJCXJldCA9IGFkZF9uZXdfa3Byb2JlKGFwLCBwKTsKIAl9CisJaWYgKGtwcm9iZV9nb25lKG9sZF9wKSkgeworCQkvKgorCQkgKiBJZiB0aGUgb2xkX3AgaGFzIGdvbmUsIGl0cyBicmVha3BvaW50IGhhcyBiZWVuIGRpc2FybWVkLgorCQkgKiBXZSBoYXZlIHRvIGFybSBpdCBhZ2FpbiBhZnRlciBwcmVwYXJpbmcgcmVhbCBrcHJvYmVzLgorCQkgKi8KKwkJYXAtPmZsYWdzICY9IH5LUFJPQkVfRkxBR19HT05FOworCQlpZiAoa3Byb2JlX2VuYWJsZWQpCisJCQlhcmNoX2FybV9rcHJvYmUoYXApOworCX0KIAlyZXR1cm4gcmV0OwogfQogCkBAIC02MDAsOCArNjQ0LDcgQEAKIAlyZXR1cm4gKGtwcm9iZV9vcGNvZGVfdCAqKSgoKGNoYXIgKilhZGRyKSArIHAtPm9mZnNldCk7CiB9CiAKLXN0YXRpYyBpbnQgX19rcHJvYmVzIF9fcmVnaXN0ZXJfa3Byb2JlKHN0cnVjdCBrcHJvYmUgKnAsCi0JdW5zaWduZWQgbG9uZyBjYWxsZWRfZnJvbSkKK2ludCBfX2twcm9iZXMgcmVnaXN0ZXJfa3Byb2JlKHN0cnVjdCBrcHJvYmUgKnApCiB7CiAJaW50IHJldCA9IDA7CiAJc3RydWN0IGtwcm9iZSAqb2xkX3A7CkBAIC02MjAsMjggKzY2MywzMCBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlwLT5tb2RfcmVmY291bnRlZCA9IDA7Ci0KKwlwLT5mbGFncyA9IDA7CiAJLyoKIAkgKiBDaGVjayBpZiBhcmUgd2UgcHJvYmluZyBhIG1vZHVsZS4KIAkgKi8KIAlwcm9iZWRfbW9kID0gX19tb2R1bGVfdGV4dF9hZGRyZXNzKCh1bnNpZ25lZCBsb25nKSBwLT5hZGRyKTsKIAlpZiAocHJvYmVkX21vZCkgewotCQlzdHJ1Y3QgbW9kdWxlICpjYWxsaW5nX21vZDsKLQkJY2FsbGluZ19tb2QgPSBfX21vZHVsZV90ZXh0X2FkZHJlc3MoY2FsbGVkX2Zyb20pOwogCQkvKgotCQkgKiBXZSBtdXN0IGFsbG93IG1vZHVsZXMgdG8gcHJvYmUgdGhlbXNlbGYgYW5kIGluIHRoaXMgY2FzZQotCQkgKiBhdm9pZCBpbmNyZW1lbnRpbmcgdGhlIG1vZHVsZSByZWZjb3VudCwgc28gYXMgdG8gYWxsb3cKLQkJICogdW5sb2FkaW5nIG9mIHNlbGYgcHJvYmluZyBtb2R1bGVzLgorCQkgKiBXZSBtdXN0IGhvbGQgYSByZWZjb3VudCBvZiB0aGUgcHJvYmVkIG1vZHVsZSB3aGlsZSB1cGRhdGluZworCQkgKiBpdHMgY29kZSB0byBwcm9oaWJpdCB1bmV4cGVjdGVkIHVubG9hZGluZy4KIAkJICovCi0JCWlmIChjYWxsaW5nX21vZCAmJiBjYWxsaW5nX21vZCAhPSBwcm9iZWRfbW9kKSB7Ci0JCQlpZiAodW5saWtlbHkoIXRyeV9tb2R1bGVfZ2V0KHByb2JlZF9tb2QpKSkgewotCQkJCXByZWVtcHRfZW5hYmxlKCk7Ci0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQl9Ci0JCQlwLT5tb2RfcmVmY291bnRlZCA9IDE7Ci0JCX0gZWxzZQotCQkJcHJvYmVkX21vZCA9IE5VTEw7CisJCWlmICh1bmxpa2VseSghdHJ5X21vZHVsZV9nZXQocHJvYmVkX21vZCkpKSB7CisJCQlwcmVlbXB0X2VuYWJsZSgpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJLyoKKwkJICogSWYgdGhlIG1vZHVsZSBmcmVlZCAuaW5pdC50ZXh0LCB3ZSBjb3VsZG4ndCBpbnNlcnQKKwkJICoga3Byb2JlcyBpbiB0aGVyZS4KKwkJICovCisJCWlmICh3aXRoaW5fbW9kdWxlX2luaXQoKHVuc2lnbmVkIGxvbmcpcC0+YWRkciwgcHJvYmVkX21vZCkgJiYKKwkJICAgIHByb2JlZF9tb2QtPnN0YXRlICE9IE1PRFVMRV9TVEFURV9DT01JTkcpIHsKKwkJCW1vZHVsZV9wdXQocHJvYmVkX21vZCk7CisJCQlwcmVlbXB0X2VuYWJsZSgpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KIAl9CiAJcHJlZW1wdF9lbmFibGUoKTsKIApAQCAtNjY4LDggKzcxMyw5IEBACiBvdXQ6CiAJbXV0ZXhfdW5sb2NrKCZrcHJvYmVfbXV0ZXgpOwogCi0JaWYgKHJldCAmJiBwcm9iZWRfbW9kKQorCWlmIChwcm9iZWRfbW9kKQogCQltb2R1bGVfcHV0KHByb2JlZF9tb2QpOworCiAJcmV0dXJuIHJldDsKIH0KIApAQCAtNjk3LDE2ICs3NDMsMTYgQEAKIAkgICAgIGxpc3RfaXNfc2luZ3VsYXIoJm9sZF9wLT5saXN0KSkpIHsKIAkJLyoKIAkJICogT25seSBwcm9iZSBvbiB0aGUgaGFzaCBsaXN0LiBEaXNhcm0gb25seSBpZiBrcHJvYmVzIGFyZQotCQkgKiBlbmFibGVkIC0gb3RoZXJ3aXNlLCB0aGUgYnJlYWtwb2ludCB3b3VsZCBhbHJlYWR5IGhhdmUKLQkJICogYmVlbiByZW1vdmVkLiBXZSBzYXZlIG9uIGZsdXNoaW5nIGljYWNoZS4KKwkJICogZW5hYmxlZCBhbmQgbm90IGdvbmUgLSBvdGhlcndpc2UsIHRoZSBicmVha3BvaW50IHdvdWxkCisJCSAqIGFscmVhZHkgaGF2ZSBiZWVuIHJlbW92ZWQuIFdlIHNhdmUgb24gZmx1c2hpbmcgaWNhY2hlLgogCQkgKi8KLQkJaWYgKGtwcm9iZV9lbmFibGVkKQorCQlpZiAoa3Byb2JlX2VuYWJsZWQgJiYgIWtwcm9iZV9nb25lKG9sZF9wKSkKIAkJCWFyY2hfZGlzYXJtX2twcm9iZShwKTsKIAkJaGxpc3RfZGVsX3JjdSgmb2xkX3AtPmhsaXN0KTsKIAl9IGVsc2UgewotCQlpZiAocC0+YnJlYWtfaGFuZGxlcikKKwkJaWYgKHAtPmJyZWFrX2hhbmRsZXIgJiYgIWtwcm9iZV9nb25lKHApKQogCQkJb2xkX3AtPmJyZWFrX2hhbmRsZXIgPSBOVUxMOwotCQlpZiAocC0+cG9zdF9oYW5kbGVyKSB7CisJCWlmIChwLT5wb3N0X2hhbmRsZXIgJiYgIWtwcm9iZV9nb25lKHApKSB7CiAJCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShsaXN0X3AsICZvbGRfcC0+bGlzdCwgbGlzdCkgewogCQkJCWlmICgobGlzdF9wICE9IHApICYmIChsaXN0X3AtPnBvc3RfaGFuZGxlcikpCiAJCQkJCWdvdG8gbm9jbGVhbjsKQEAgLTcyMSwzOSArNzY3LDI3IEBACiAKIHN0YXRpYyB2b2lkIF9fa3Byb2JlcyBfX3VucmVnaXN0ZXJfa3Byb2JlX2JvdHRvbShzdHJ1Y3Qga3Byb2JlICpwKQogewotCXN0cnVjdCBtb2R1bGUgKm1vZDsKIAlzdHJ1Y3Qga3Byb2JlICpvbGRfcDsKIAotCWlmIChwLT5tb2RfcmVmY291bnRlZCkgewotCQkvKgotCQkgKiBTaW5jZSB3ZSd2ZSBhbHJlYWR5IGluY3JlbWVudGVkIHJlZmNvdW50LAotCQkgKiB3ZSBkb24ndCBuZWVkIHRvIGRpc2FibGUgcHJlZW1wdGlvbi4KLQkJICovCi0JCW1vZCA9IG1vZHVsZV90ZXh0X2FkZHJlc3MoKHVuc2lnbmVkIGxvbmcpcC0+YWRkcik7Ci0JCWlmIChtb2QpCi0JCQltb2R1bGVfcHV0KG1vZCk7Ci0JfQotCi0JaWYgKGxpc3RfZW1wdHkoJnAtPmxpc3QpIHx8IGxpc3RfaXNfc2luZ3VsYXIoJnAtPmxpc3QpKSB7Ci0JCWlmICghbGlzdF9lbXB0eSgmcC0+bGlzdCkpIHsKLQkJCS8qICJwIiBpcyB0aGUgbGFzdCBjaGlsZCBvZiBhbiBhZ2dyX2twcm9iZSAqLwotCQkJb2xkX3AgPSBsaXN0X2VudHJ5KHAtPmxpc3QubmV4dCwgc3RydWN0IGtwcm9iZSwgbGlzdCk7Ci0JCQlsaXN0X2RlbCgmcC0+bGlzdCk7Ci0JCQlrZnJlZShvbGRfcCk7Ci0JCX0KKwlpZiAobGlzdF9lbXB0eSgmcC0+bGlzdCkpCiAJCWFyY2hfcmVtb3ZlX2twcm9iZShwKTsKKwllbHNlIGlmIChsaXN0X2lzX3Npbmd1bGFyKCZwLT5saXN0KSkgeworCQkvKiAicCIgaXMgdGhlIGxhc3QgY2hpbGQgb2YgYW4gYWdncl9rcHJvYmUgKi8KKwkJb2xkX3AgPSBsaXN0X2VudHJ5KHAtPmxpc3QubmV4dCwgc3RydWN0IGtwcm9iZSwgbGlzdCk7CisJCWxpc3RfZGVsKCZwLT5saXN0KTsKKwkJYXJjaF9yZW1vdmVfa3Byb2JlKG9sZF9wKTsKKwkJa2ZyZWUob2xkX3ApOwogCX0KIH0KIAotc3RhdGljIGludCBfX3JlZ2lzdGVyX2twcm9iZXMoc3RydWN0IGtwcm9iZSAqKmtwcywgaW50IG51bSwKLQl1bnNpZ25lZCBsb25nIGNhbGxlZF9mcm9tKQoraW50IF9fa3Byb2JlcyByZWdpc3Rlcl9rcHJvYmVzKHN0cnVjdCBrcHJvYmUgKiprcHMsIGludCBudW0pCiB7CiAJaW50IGksIHJldCA9IDA7CiAKIAlpZiAobnVtIDw9IDApCiAJCXJldHVybiAtRUlOVkFMOwogCWZvciAoaSA9IDA7IGkgPCBudW07IGkrKykgewotCQlyZXQgPSBfX3JlZ2lzdGVyX2twcm9iZShrcHNbaV0sIGNhbGxlZF9mcm9tKTsKKwkJcmV0ID0gcmVnaXN0ZXJfa3Byb2JlKGtwc1tpXSk7CiAJCWlmIChyZXQgPCAwKSB7CiAJCQlpZiAoaSA+IDApCiAJCQkJdW5yZWdpc3Rlcl9rcHJvYmVzKGtwcywgaSk7CkBAIC03NjMsMjYgKzc5NywxMSBAQAogCXJldHVybiByZXQ7CiB9CiAKLS8qCi0gKiBSZWdpc3RyYXRpb24gYW5kIHVucmVnaXN0cmF0aW9uIGZ1bmN0aW9ucyBmb3Iga3Byb2JlLgotICovCi1pbnQgX19rcHJvYmVzIHJlZ2lzdGVyX2twcm9iZShzdHJ1Y3Qga3Byb2JlICpwKQotewotCXJldHVybiBfX3JlZ2lzdGVyX2twcm9iZXMoJnAsIDEsCi0JCQkJICAodW5zaWduZWQgbG9uZylfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCkpOwotfQotCiB2b2lkIF9fa3Byb2JlcyB1bnJlZ2lzdGVyX2twcm9iZShzdHJ1Y3Qga3Byb2JlICpwKQogewogCXVucmVnaXN0ZXJfa3Byb2JlcygmcCwgMSk7CiB9CiAKLWludCBfX2twcm9iZXMgcmVnaXN0ZXJfa3Byb2JlcyhzdHJ1Y3Qga3Byb2JlICoqa3BzLCBpbnQgbnVtKQotewotCXJldHVybiBfX3JlZ2lzdGVyX2twcm9iZXMoa3BzLCBudW0sCi0JCQkJICAodW5zaWduZWQgbG9uZylfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCkpOwotfQotCiB2b2lkIF9fa3Byb2JlcyB1bnJlZ2lzdGVyX2twcm9iZXMoc3RydWN0IGtwcm9iZSAqKmtwcywgaW50IG51bSkKIHsKIAlpbnQgaTsKQEAgLTgxMSw4ICs4MzAsNyBAQAogCXJldHVybiAodW5zaWduZWQgbG9uZyllbnRyeTsKIH0KIAotc3RhdGljIGludCBfX3JlZ2lzdGVyX2pwcm9iZXMoc3RydWN0IGpwcm9iZSAqKmpwcywgaW50IG51bSwKLQl1bnNpZ25lZCBsb25nIGNhbGxlZF9mcm9tKQoraW50IF9fa3Byb2JlcyByZWdpc3Rlcl9qcHJvYmVzKHN0cnVjdCBqcHJvYmUgKipqcHMsIGludCBudW0pCiB7CiAJc3RydWN0IGpwcm9iZSAqanA7CiAJaW50IHJldCA9IDAsIGk7CkBAIC04MzAsNyArODQ4LDcgQEAKIAkJCS8qIFRvZG86IFZlcmlmeSBwcm9iZXBvaW50IGlzIGEgZnVuY3Rpb24gZW50cnkgcG9pbnQgKi8KIAkJCWpwLT5rcC5wcmVfaGFuZGxlciA9IHNldGptcF9wcmVfaGFuZGxlcjsKIAkJCWpwLT5rcC5icmVha19oYW5kbGVyID0gbG9uZ2ptcF9icmVha19oYW5kbGVyOwotCQkJcmV0ID0gX19yZWdpc3Rlcl9rcHJvYmUoJmpwLT5rcCwgY2FsbGVkX2Zyb20pOworCQkJcmV0ID0gcmVnaXN0ZXJfa3Byb2JlKCZqcC0+a3ApOwogCQl9CiAJCWlmIChyZXQgPCAwKSB7CiAJCQlpZiAoaSA+IDApCkBAIC04NDMsOCArODYxLDcgQEAKIAogaW50IF9fa3Byb2JlcyByZWdpc3Rlcl9qcHJvYmUoc3RydWN0IGpwcm9iZSAqanApCiB7Ci0JcmV0dXJuIF9fcmVnaXN0ZXJfanByb2JlcygmanAsIDEsCi0JCSh1bnNpZ25lZCBsb25nKV9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKSk7CisJcmV0dXJuIHJlZ2lzdGVyX2pwcm9iZXMoJmpwLCAxKTsKIH0KIAogdm9pZCBfX2twcm9iZXMgdW5yZWdpc3Rlcl9qcHJvYmUoc3RydWN0IGpwcm9iZSAqanApCkBAIC04NTIsMTIgKzg2OSw2IEBACiAJdW5yZWdpc3Rlcl9qcHJvYmVzKCZqcCwgMSk7CiB9CiAKLWludCBfX2twcm9iZXMgcmVnaXN0ZXJfanByb2JlcyhzdHJ1Y3QganByb2JlICoqanBzLCBpbnQgbnVtKQotewotCXJldHVybiBfX3JlZ2lzdGVyX2pwcm9iZXMoanBzLCBudW0sCi0JCSh1bnNpZ25lZCBsb25nKV9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKSk7Ci19Ci0KIHZvaWQgX19rcHJvYmVzIHVucmVnaXN0ZXJfanByb2JlcyhzdHJ1Y3QganByb2JlICoqanBzLCBpbnQgbnVtKQogewogCWludCBpOwpAQCAtOTIwLDggKzkzMSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgX19rcHJvYmVzIF9fcmVnaXN0ZXJfa3JldHByb2JlKHN0cnVjdCBrcmV0cHJvYmUgKnJwLAotCQkJCQkgIHVuc2lnbmVkIGxvbmcgY2FsbGVkX2Zyb20pCitpbnQgX19rcHJvYmVzIHJlZ2lzdGVyX2tyZXRwcm9iZShzdHJ1Y3Qga3JldHByb2JlICpycCkKIHsKIAlpbnQgcmV0ID0gMDsKIAlzdHJ1Y3Qga3JldHByb2JlX2luc3RhbmNlICppbnN0OwpAQCAtOTY3LDIxICs5NzcsMjAgQEAKIAogCXJwLT5ubWlzc2VkID0gMDsKIAkvKiBFc3RhYmxpc2ggZnVuY3Rpb24gZW50cnkgcHJvYmUgcG9pbnQgKi8KLQlyZXQgPSBfX3JlZ2lzdGVyX2twcm9iZSgmcnAtPmtwLCBjYWxsZWRfZnJvbSk7CisJcmV0ID0gcmVnaXN0ZXJfa3Byb2JlKCZycC0+a3ApOwogCWlmIChyZXQgIT0gMCkKIAkJZnJlZV9ycF9pbnN0KHJwKTsKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IF9fcmVnaXN0ZXJfa3JldHByb2JlcyhzdHJ1Y3Qga3JldHByb2JlICoqcnBzLCBpbnQgbnVtLAotCXVuc2lnbmVkIGxvbmcgY2FsbGVkX2Zyb20pCitpbnQgX19rcHJvYmVzIHJlZ2lzdGVyX2tyZXRwcm9iZXMoc3RydWN0IGtyZXRwcm9iZSAqKnJwcywgaW50IG51bSkKIHsKIAlpbnQgcmV0ID0gMCwgaTsKIAogCWlmIChudW0gPD0gMCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAJZm9yIChpID0gMDsgaSA8IG51bTsgaSsrKSB7Ci0JCXJldCA9IF9fcmVnaXN0ZXJfa3JldHByb2JlKHJwc1tpXSwgY2FsbGVkX2Zyb20pOworCQlyZXQgPSByZWdpc3Rlcl9rcmV0cHJvYmUocnBzW2ldKTsKIAkJaWYgKHJldCA8IDApIHsKIAkJCWlmIChpID4gMCkKIAkJCQl1bnJlZ2lzdGVyX2tyZXRwcm9iZXMocnBzLCBpKTsKQEAgLTk5MSwyMyArMTAwMCwxMSBAQAogCXJldHVybiByZXQ7CiB9CiAKLWludCBfX2twcm9iZXMgcmVnaXN0ZXJfa3JldHByb2JlKHN0cnVjdCBrcmV0cHJvYmUgKnJwKQotewotCXJldHVybiBfX3JlZ2lzdGVyX2tyZXRwcm9iZXMoJnJwLCAxLAotCQkJKHVuc2lnbmVkIGxvbmcpX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApKTsKLX0KLQogdm9pZCBfX2twcm9iZXMgdW5yZWdpc3Rlcl9rcmV0cHJvYmUoc3RydWN0IGtyZXRwcm9iZSAqcnApCiB7CiAJdW5yZWdpc3Rlcl9rcmV0cHJvYmVzKCZycCwgMSk7CiB9CiAKLWludCBfX2twcm9iZXMgcmVnaXN0ZXJfa3JldHByb2JlcyhzdHJ1Y3Qga3JldHByb2JlICoqcnBzLCBpbnQgbnVtKQotewotCXJldHVybiBfX3JlZ2lzdGVyX2tyZXRwcm9iZXMocnBzLCBudW0sCi0JCQkodW5zaWduZWQgbG9uZylfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCkpOwotfQotCiB2b2lkIF9fa3Byb2JlcyB1bnJlZ2lzdGVyX2tyZXRwcm9iZXMoc3RydWN0IGtyZXRwcm9iZSAqKnJwcywgaW50IG51bSkKIHsKIAlpbnQgaTsKQEAgLTEwNTUsNiArMTA1Miw3MiBAQAogCiAjZW5kaWYgLyogQ09ORklHX0tSRVRQUk9CRVMgKi8KIAorLyogU2V0IHRoZSBrcHJvYmUgZ29uZSBhbmQgcmVtb3ZlIGl0cyBpbnN0cnVjdGlvbiBidWZmZXIuICovCitzdGF0aWMgdm9pZCBfX2twcm9iZXMga2lsbF9rcHJvYmUoc3RydWN0IGtwcm9iZSAqcCkKK3sKKwlzdHJ1Y3Qga3Byb2JlICprcDsKKwlwLT5mbGFncyB8PSBLUFJPQkVfRkxBR19HT05FOworCWlmIChwLT5wcmVfaGFuZGxlciA9PSBhZ2dyX3ByZV9oYW5kbGVyKSB7CisJCS8qCisJCSAqIElmIHRoaXMgaXMgYW4gYWdncl9rcHJvYmUsIHdlIGhhdmUgdG8gbGlzdCBhbGwgdGhlCisJCSAqIGNoYWluZWQgcHJvYmVzIGFuZCBtYXJrIHRoZW0gR09ORS4KKwkJICovCisJCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGtwLCAmcC0+bGlzdCwgbGlzdCkKKwkJCWtwLT5mbGFncyB8PSBLUFJPQkVfRkxBR19HT05FOworCQlwLT5wb3N0X2hhbmRsZXIgPSBOVUxMOworCQlwLT5icmVha19oYW5kbGVyID0gTlVMTDsKKwl9CisJLyoKKwkgKiBIZXJlLCB3ZSBjYW4gcmVtb3ZlIGluc25fc2xvdCBzYWZlbHksIGJlY2F1c2Ugbm8gdGhyZWFkIGNhbGxzCisJICogdGhlIG9yaWdpbmFsIHByb2JlZCBmdW5jdGlvbiAod2hpY2ggd2lsbCBiZSBmcmVlZCBzb29uKSBhbnkgbW9yZS4KKwkgKi8KKwlhcmNoX3JlbW92ZV9rcHJvYmUocCk7Cit9CisKKy8qIE1vZHVsZSBub3RpZmllciBjYWxsIGJhY2ssIGNoZWNraW5nIGtwcm9iZXMgb24gdGhlIG1vZHVsZSAqLworc3RhdGljIGludCBfX2twcm9iZXMga3Byb2Jlc19tb2R1bGVfY2FsbGJhY2soc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwKKwkJCQkJICAgICB1bnNpZ25lZCBsb25nIHZhbCwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgbW9kdWxlICptb2QgPSBkYXRhOworCXN0cnVjdCBobGlzdF9oZWFkICpoZWFkOworCXN0cnVjdCBobGlzdF9ub2RlICpub2RlOworCXN0cnVjdCBrcHJvYmUgKnA7CisJdW5zaWduZWQgaW50IGk7CisJaW50IGNoZWNrY29yZSA9ICh2YWwgPT0gTU9EVUxFX1NUQVRFX0dPSU5HKTsKKworCWlmICh2YWwgIT0gTU9EVUxFX1NUQVRFX0dPSU5HICYmIHZhbCAhPSBNT0RVTEVfU1RBVEVfTElWRSkKKwkJcmV0dXJuIE5PVElGWV9ET05FOworCisJLyoKKwkgKiBXaGVuIE1PRFVMRV9TVEFURV9HT0lORyB3YXMgbm90aWZpZWQsIGJvdGggb2YgbW9kdWxlIC50ZXh0IGFuZAorCSAqIC5pbml0LnRleHQgc2VjdGlvbnMgd291bGQgYmUgZnJlZWQuIFdoZW4gTU9EVUxFX1NUQVRFX0xJVkUgd2FzCisJICogbm90aWZpZWQsIG9ubHkgLmluaXQudGV4dCBzZWN0aW9uIHdvdWxkIGJlIGZyZWVkLiBXZSBuZWVkIHRvCisJICogZGlzYWJsZSBrcHJvYmVzIHdoaWNoIGhhdmUgYmVlbiBpbnNlcnRlZCBpbiB0aGUgc2VjdGlvbnMuCisJICovCisJbXV0ZXhfbG9jaygma3Byb2JlX211dGV4KTsKKwlmb3IgKGkgPSAwOyBpIDwgS1BST0JFX1RBQkxFX1NJWkU7IGkrKykgeworCQloZWFkID0gJmtwcm9iZV90YWJsZVtpXTsKKwkJaGxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHAsIG5vZGUsIGhlYWQsIGhsaXN0KQorCQkJaWYgKHdpdGhpbl9tb2R1bGVfaW5pdCgodW5zaWduZWQgbG9uZylwLT5hZGRyLCBtb2QpIHx8CisJCQkgICAgKGNoZWNrY29yZSAmJgorCQkJICAgICB3aXRoaW5fbW9kdWxlX2NvcmUoKHVuc2lnbmVkIGxvbmcpcC0+YWRkciwgbW9kKSkpIHsKKwkJCQkvKgorCQkJCSAqIFRoZSB2YWRkciB0aGlzIHByb2JlIGlzIGluc3RhbGxlZCB3aWxsIHNvb24KKwkJCQkgKiBiZSB2ZnJlZWQgYnV5IG5vdCBzeW5jZWQgdG8gZGlzay4gSGVuY2UsCisJCQkJICogZGlzYXJtaW5nIHRoZSBicmVha3BvaW50IGlzbid0IG5lZWRlZC4KKwkJCQkgKi8KKwkJCQlraWxsX2twcm9iZShwKTsKKwkJCX0KKwl9CisJbXV0ZXhfdW5sb2NrKCZrcHJvYmVfbXV0ZXgpOworCXJldHVybiBOT1RJRllfRE9ORTsKK30KKworc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBrcHJvYmVfbW9kdWxlX25iID0geworCS5ub3RpZmllcl9jYWxsID0ga3Byb2Jlc19tb2R1bGVfY2FsbGJhY2ssCisJLnByaW9yaXR5ID0gMAorfTsKKwogc3RhdGljIGludCBfX2luaXQgaW5pdF9rcHJvYmVzKHZvaWQpCiB7CiAJaW50IGksIGVyciA9IDA7CkBAIC0xMTExLDYgKzExNzQsOSBAQAogCWVyciA9IGFyY2hfaW5pdF9rcHJvYmVzKCk7CiAJaWYgKCFlcnIpCiAJCWVyciA9IHJlZ2lzdGVyX2RpZV9ub3RpZmllcigma3Byb2JlX2V4Y2VwdGlvbnNfbmIpOworCWlmICghZXJyKQorCQllcnIgPSByZWdpc3Rlcl9tb2R1bGVfbm90aWZpZXIoJmtwcm9iZV9tb2R1bGVfbmIpOworCiAJa3Byb2Jlc19pbml0aWFsaXplZCA9IChlcnIgPT0gMCk7CiAKIAlpZiAoIWVycikKQEAgLTExMzEsMTAgKzExOTcsMTIgQEAKIAllbHNlCiAJCWtwcm9iZV90eXBlID0gImsiOwogCWlmIChzeW0pCi0JCXNlcV9wcmludGYocGksICIlcCAgJXMgICVzKzB4JXggICVzXG4iLCBwLT5hZGRyLCBrcHJvYmVfdHlwZSwKLQkJCXN5bSwgb2Zmc2V0LCAobW9kbmFtZSA/IG1vZG5hbWUgOiAiICIpKTsKKwkJc2VxX3ByaW50ZihwaSwgIiVwICAlcyAgJXMrMHgleCAgJXMgJXNcbiIsIHAtPmFkZHIsIGtwcm9iZV90eXBlLAorCQkJc3ltLCBvZmZzZXQsIChtb2RuYW1lID8gbW9kbmFtZSA6ICIgIiksCisJCQkoa3Byb2JlX2dvbmUocCkgPyAiW0dPTkVdIiA6ICIiKSk7CiAJZWxzZQotCQlzZXFfcHJpbnRmKHBpLCAiJXAgICVzICAlcFxuIiwgcC0+YWRkciwga3Byb2JlX3R5cGUsIHAtPmFkZHIpOworCQlzZXFfcHJpbnRmKHBpLCAiJXAgICVzICAlcCAlc1xuIiwgcC0+YWRkciwga3Byb2JlX3R5cGUsIHAtPmFkZHIsCisJCQkoa3Byb2JlX2dvbmUocCkgPyAiW0dPTkVdIiA6ICIiKSk7CiB9CiAKIHN0YXRpYyB2b2lkIF9fa3Byb2JlcyAqa3Byb2JlX3NlcV9zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKmYsIGxvZmZfdCAqcG9zKQpAQCAtMTIxNSw3ICsxMjgzLDggQEAKIAlmb3IgKGkgPSAwOyBpIDwgS1BST0JFX1RBQkxFX1NJWkU7IGkrKykgewogCQloZWFkID0gJmtwcm9iZV90YWJsZVtpXTsKIAkJaGxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHAsIG5vZGUsIGhlYWQsIGhsaXN0KQotCQkJYXJjaF9hcm1fa3Byb2JlKHApOworCQkJaWYgKCFrcHJvYmVfZ29uZShwKSkKKwkJCQlhcmNoX2FybV9rcHJvYmUocCk7CiAJfQogCiAJa3Byb2JlX2VuYWJsZWQgPSB0cnVlOwpAQCAtMTI0NCw3ICsxMzEzLDcgQEAKIAlmb3IgKGkgPSAwOyBpIDwgS1BST0JFX1RBQkxFX1NJWkU7IGkrKykgewogCQloZWFkID0gJmtwcm9iZV90YWJsZVtpXTsKIAkJaGxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHAsIG5vZGUsIGhlYWQsIGhsaXN0KSB7Ci0JCQlpZiAoIWFyY2hfdHJhbXBvbGluZV9rcHJvYmUocCkpCisJCQlpZiAoIWFyY2hfdHJhbXBvbGluZV9rcHJvYmUocCkgJiYgIWtwcm9iZV9nb25lKHApKQogCQkJCWFyY2hfZGlzYXJtX2twcm9iZShwKTsKIAkJfQogCX0KZGlmZiAtLWdpdCBhL2tlcm5lbC9rc3lzZnMuYyBiL2tlcm5lbC9rc3lzZnMuYwppbmRleCAwOGRkOGVkLi41MjhkZDc4IDEwMDY0NAotLS0gYS9rZXJuZWwva3N5c2ZzLmMKKysrIGIva2VybmVsL2tzeXNmcy5jCkBAIC0yNCw3ICsyNCw3IEBACiBzdGF0aWMgc3RydWN0IGtvYmpfYXR0cmlidXRlIF9uYW1lIyNfYXR0ciA9IFwKIAlfX0FUVFIoX25hbWUsIDA2NDQsIF9uYW1lIyNfc2hvdywgX25hbWUjI19zdG9yZSkKIAotI2lmIGRlZmluZWQoQ09ORklHX0hPVFBMVUcpICYmIGRlZmluZWQoQ09ORklHX05FVCkKKyNpZiBkZWZpbmVkKENPTkZJR19IT1RQTFVHKQogLyogY3VycmVudCB1ZXZlbnQgc2VxdWVuY2UgbnVtYmVyICovCiBzdGF0aWMgc3NpemVfdCB1ZXZlbnRfc2VxbnVtX3Nob3coc3RydWN0IGtvYmplY3QgKmtvYmosCiAJCQkJICBzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKQEAgLTEzNyw3ICsxMzcsNyBAQAogRVhQT1JUX1NZTUJPTF9HUEwoa2VybmVsX2tvYmopOwogCiBzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqIGtlcm5lbF9hdHRyc1tdID0gewotI2lmIGRlZmluZWQoQ09ORklHX0hPVFBMVUcpICYmIGRlZmluZWQoQ09ORklHX05FVCkKKyNpZiBkZWZpbmVkKENPTkZJR19IT1RQTFVHKQogCSZ1ZXZlbnRfc2VxbnVtX2F0dHIuYXR0ciwKIAkmdWV2ZW50X2hlbHBlcl9hdHRyLmF0dHIsCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2tlcm5lbC9tb2R1bGUuYyBiL2tlcm5lbC9tb2R1bGUuYwppbmRleCBkZDJhNTQxLi5jOTMzMmM5IDEwMDY0NAotLS0gYS9rZXJuZWwvbW9kdWxlLmMKKysrIGIva2VybmVsL21vZHVsZS5jCkBAIC00Myw3ICs0Myw2IEBACiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KLSNpbmNsdWRlIDxsaW51eC91bndpbmQuaD4KICNpbmNsdWRlIDxsaW51eC9yY3VsaXN0Lmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgpAQCAtNTEsNiArNTAsNyBAQAogI2luY2x1ZGUgPGFzbS9zZWN0aW9ucy5oPgogI2luY2x1ZGUgPGxpbnV4L3RyYWNlcG9pbnQuaD4KICNpbmNsdWRlIDxsaW51eC9mdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9hc3luYy5oPgogCiAjaWYgMAogI2RlZmluZSBERUJVR1AgcHJpbnRrCkBAIC03NTcsOCArNzU3LDE2IEBACiAJCXJldHVybiAtRUZBVUxUOwogCW5hbWVbTU9EVUxFX05BTUVfTEVOLTFdID0gJ1wwJzsKIAotCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJm1vZHVsZV9tdXRleCkgIT0gMCkKLQkJcmV0dXJuIC1FSU5UUjsKKwkvKiBDcmVhdGUgc3RvcF9tYWNoaW5lIHRocmVhZHMgc2luY2UgZnJlZV9tb2R1bGUgcmVsaWVzIG9uCisJICogYSBub24tZmFpbGluZyBzdG9wX21hY2hpbmUgY2FsbC4gKi8KKwlyZXQgPSBzdG9wX21hY2hpbmVfY3JlYXRlKCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJm1vZHVsZV9tdXRleCkgIT0gMCkgeworCQlyZXQgPSAtRUlOVFI7CisJCWdvdG8gb3V0X3N0b3A7CisJfQogCiAJbW9kID0gZmluZF9tb2R1bGUobmFtZSk7CiAJaWYgKCFtb2QpIHsKQEAgLTgwOSw2ICs4MTcsNyBAQAogCQltb2QtPmV4aXQoKTsKIAlibG9ja2luZ19ub3RpZmllcl9jYWxsX2NoYWluKCZtb2R1bGVfbm90aWZ5X2xpc3QsCiAJCQkJICAgICBNT0RVTEVfU1RBVEVfR09JTkcsIG1vZCk7CisJYXN5bmNfc3luY2hyb25pemVfZnVsbCgpOwogCW11dGV4X2xvY2soJm1vZHVsZV9tdXRleCk7CiAJLyogU3RvcmUgdGhlIG5hbWUgb2YgdGhlIGxhc3QgdW5sb2FkZWQgbW9kdWxlIGZvciBkaWFnbm9zdGljIHB1cnBvc2VzICovCiAJc3RybGNweShsYXN0X3VubG9hZGVkX21vZHVsZSwgbW9kLT5uYW1lLCBzaXplb2YobGFzdF91bmxvYWRlZF9tb2R1bGUpKTsKQEAgLTgxNywxMCArODI2LDEyIEBACiAKICBvdXQ6CiAJbXV0ZXhfdW5sb2NrKCZtb2R1bGVfbXV0ZXgpOworb3V0X3N0b3A6CisJc3RvcF9tYWNoaW5lX2Rlc3Ryb3koKTsKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgdm9pZCBwcmludF91bmxvYWRfaW5mbyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHN0cnVjdCBtb2R1bGUgKm1vZCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBwcmludF91bmxvYWRfaW5mbyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHN0cnVjdCBtb2R1bGUgKm1vZCkKIHsKIAlzdHJ1Y3QgbW9kdWxlX3VzZSAqdXNlOwogCWludCBwcmludGVkX3NvbWV0aGluZyA9IDA7CkBAIC04OTMsNyArOTA0LDcgQEAKIEVYUE9SVF9TWU1CT0wobW9kdWxlX3B1dCk7CiAKICNlbHNlIC8qICFDT05GSUdfTU9EVUxFX1VOTE9BRCAqLwotc3RhdGljIHZvaWQgcHJpbnRfdW5sb2FkX2luZm8oc3RydWN0IHNlcV9maWxlICptLCBzdHJ1Y3QgbW9kdWxlICptb2QpCitzdGF0aWMgaW5saW5lIHZvaWQgcHJpbnRfdW5sb2FkX2luZm8oc3RydWN0IHNlcV9maWxlICptLCBzdHJ1Y3QgbW9kdWxlICptb2QpCiB7CiAJLyogV2UgZG9uJ3Qga25vdyB0aGUgdXNhZ2UgY291bnQsIG9yIHdoYXQgbW9kdWxlcyBhcmUgdXNpbmcuICovCiAJc2VxX3ByaW50ZihtLCAiIC0gLSIpOwpAQCAtMTQzOSw4ICsxNDUwLDYgQEAKIAlyZW1vdmVfc2VjdF9hdHRycyhtb2QpOwogCW1vZF9rb2JqZWN0X3JlbW92ZShtb2QpOwogCi0JdW53aW5kX3JlbW92ZV90YWJsZShtb2QtPnVud2luZF9pbmZvLCAwKTsKLQogCS8qIEFyY2gtc3BlY2lmaWMgY2xlYW51cC4gKi8KIAltb2R1bGVfYXJjaF9jbGVhbnVwKG1vZCk7CiAKQEAgLTE1NzgsMTEgKzE1ODcsMjEgQEAKIAlyZXR1cm4gcmV0OwogfQogCisvKiBBZGRpdGlvbmFsIGJ5dGVzIG5lZWRlZCBieSBhcmNoIGluIGZyb250IG9mIGluZGl2aWR1YWwgc2VjdGlvbnMgKi8KK3Vuc2lnbmVkIGludCBfX3dlYWsgYXJjaF9tb2Rfc2VjdGlvbl9wcmVwZW5kKHN0cnVjdCBtb2R1bGUgKm1vZCwKKwkJCQkJICAgICB1bnNpZ25lZCBpbnQgc2VjdGlvbikKK3sKKwkvKiBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGp1c3QgcmV0dXJucyB6ZXJvICovCisJcmV0dXJuIDA7Cit9CisKIC8qIFVwZGF0ZSBzaXplIHdpdGggdGhpcyBzZWN0aW9uOiByZXR1cm4gb2Zmc2V0LiAqLwotc3RhdGljIGxvbmcgZ2V0X29mZnNldCh1bnNpZ25lZCBpbnQgKnNpemUsIEVsZl9TaGRyICpzZWNoZHIpCitzdGF0aWMgbG9uZyBnZXRfb2Zmc2V0KHN0cnVjdCBtb2R1bGUgKm1vZCwgdW5zaWduZWQgaW50ICpzaXplLAorCQkgICAgICAgRWxmX1NoZHIgKnNlY2hkciwgdW5zaWduZWQgaW50IHNlY3Rpb24pCiB7CiAJbG9uZyByZXQ7CiAKKwkqc2l6ZSArPSBhcmNoX21vZF9zZWN0aW9uX3ByZXBlbmQobW9kLCBzZWN0aW9uKTsKIAlyZXQgPSBBTElHTigqc2l6ZSwgc2VjaGRyLT5zaF9hZGRyYWxpZ24gPzogMSk7CiAJKnNpemUgPSByZXQgKyBzZWNoZHItPnNoX3NpemU7CiAJcmV0dXJuIHJldDsKQEAgLTE2MjIsNyArMTY0MSw3IEBACiAJCQkgICAgfHwgc3RybmNtcChzZWNzdHJpbmdzICsgcy0+c2hfbmFtZSwKIAkJCQkgICAgICAgIi5pbml0IiwgNSkgPT0gMCkKIAkJCQljb250aW51ZTsKLQkJCXMtPnNoX2VudHNpemUgPSBnZXRfb2Zmc2V0KCZtb2QtPmNvcmVfc2l6ZSwgcyk7CisJCQlzLT5zaF9lbnRzaXplID0gZ2V0X29mZnNldChtb2QsICZtb2QtPmNvcmVfc2l6ZSwgcywgaSk7CiAJCQlERUJVR1AoIlx0JXNcbiIsIHNlY3N0cmluZ3MgKyBzLT5zaF9uYW1lKTsKIAkJfQogCQlpZiAobSA9PSAwKQpAQCAtMTY0MCw3ICsxNjU5LDcgQEAKIAkJCSAgICB8fCBzdHJuY21wKHNlY3N0cmluZ3MgKyBzLT5zaF9uYW1lLAogCQkJCSAgICAgICAiLmluaXQiLCA1KSAhPSAwKQogCQkJCWNvbnRpbnVlOwotCQkJcy0+c2hfZW50c2l6ZSA9IChnZXRfb2Zmc2V0KCZtb2QtPmluaXRfc2l6ZSwgcykKKwkJCXMtPnNoX2VudHNpemUgPSAoZ2V0X29mZnNldChtb2QsICZtb2QtPmluaXRfc2l6ZSwgcywgaSkKIAkJCQkJIHwgSU5JVF9PRkZTRVRfTUFTSyk7CiAJCQlERUJVR1AoIlx0JXNcbiIsIHNlY3N0cmluZ3MgKyBzLT5zaF9uYW1lKTsKIAkJfQpAQCAtMTcyNSwxNSArMTc0NCwxNSBAQAogCXJldHVybiBOVUxMOwogfQogCi1zdGF0aWMgaW50IGlzX2V4cG9ydGVkKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IHN0cnVjdCBtb2R1bGUgKm1vZCkKK3N0YXRpYyBpbnQgaXNfZXhwb3J0ZWQoY29uc3QgY2hhciAqbmFtZSwgdW5zaWduZWQgbG9uZyB2YWx1ZSwKKwkJICAgICAgIGNvbnN0IHN0cnVjdCBtb2R1bGUgKm1vZCkKIHsKLQlpZiAoIW1vZCAmJiBsb29rdXBfc3ltYm9sKG5hbWUsIF9fc3RhcnRfX19rc3ltdGFiLCBfX3N0b3BfX19rc3ltdGFiKSkKLQkJcmV0dXJuIDE7CisJY29uc3Qgc3RydWN0IGtlcm5lbF9zeW1ib2wgKmtzOworCWlmICghbW9kKQorCQlrcyA9IGxvb2t1cF9zeW1ib2wobmFtZSwgX19zdGFydF9fX2tzeW10YWIsIF9fc3RvcF9fX2tzeW10YWIpOwogCWVsc2UKLQkJaWYgKG1vZCAmJiBsb29rdXBfc3ltYm9sKG5hbWUsIG1vZC0+c3ltcywgbW9kLT5zeW1zICsgbW9kLT5udW1fc3ltcykpCi0JCQlyZXR1cm4gMTsKLQkJZWxzZQotCQkJcmV0dXJuIDA7CisJCWtzID0gbG9va3VwX3N5bWJvbChuYW1lLCBtb2QtPnN5bXMsIG1vZC0+c3ltcyArIG1vZC0+bnVtX3N5bXMpOworCXJldHVybiBrcyAhPSBOVUxMICYmIGtzLT52YWx1ZSA9PSB2YWx1ZTsKIH0KIAogLyogQXMgcGVyIG5tICovCkBAIC0xODQ3LDcgKzE4NjYsNiBAQAogCXVuc2lnbmVkIGludCBzeW1pbmRleCA9IDA7CiAJdW5zaWduZWQgaW50IHN0cmluZGV4ID0gMDsKIAl1bnNpZ25lZCBpbnQgbW9kaW5kZXgsIHZlcnNpbmRleCwgaW5mb2luZGV4LCBwY3B1aW5kZXg7Ci0JdW5zaWduZWQgaW50IHVud2luZGV4ID0gMDsKIAl1bnNpZ25lZCBpbnQgbnVtX2twLCBudW1fbWNvdW50OwogCXN0cnVjdCBrZXJuZWxfcGFyYW0gKmtwOwogCXN0cnVjdCBtb2R1bGUgKm1vZDsKQEAgLTE4NjUsNiArMTg4MywxMyBAQAogCS8qIHZtYWxsb2MgYmFyZnMgb24gInVudXN1YWwiIG51bWJlcnMuICBDaGVjayBoZXJlICovCiAJaWYgKGxlbiA+IDY0ICogMTAyNCAqIDEwMjQgfHwgKGhkciA9IHZtYWxsb2MobGVuKSkgPT0gTlVMTCkKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwkvKiBDcmVhdGUgc3RvcF9tYWNoaW5lIHRocmVhZHMgc2luY2UgdGhlIGVycm9yIHBhdGggcmVsaWVzIG9uCisJICogYSBub24tZmFpbGluZyBzdG9wX21hY2hpbmUgY2FsbC4gKi8KKwllcnIgPSBzdG9wX21hY2hpbmVfY3JlYXRlKCk7CisJaWYgKGVycikKKwkJZ290byBmcmVlX2hkcjsKKwogCWlmIChjb3B5X2Zyb21fdXNlcihoZHIsIHVtb2QsIGxlbikgIT0gMCkgewogCQllcnIgPSAtRUZBVUxUOwogCQlnb3RvIGZyZWVfaGRyOwpAQCAtMTkzMCw5ICsxOTU1LDYgQEAKIAl2ZXJzaW5kZXggPSBmaW5kX3NlYyhoZHIsIHNlY2hkcnMsIHNlY3N0cmluZ3MsICJfX3ZlcnNpb25zIik7CiAJaW5mb2luZGV4ID0gZmluZF9zZWMoaGRyLCBzZWNoZHJzLCBzZWNzdHJpbmdzLCAiLm1vZGluZm8iKTsKIAlwY3B1aW5kZXggPSBmaW5kX3BjcHVzZWMoaGRyLCBzZWNoZHJzLCBzZWNzdHJpbmdzKTsKLSNpZmRlZiBBUkNIX1VOV0lORF9TRUNUSU9OX05BTUUKLQl1bndpbmRleCA9IGZpbmRfc2VjKGhkciwgc2VjaGRycywgc2Vjc3RyaW5ncywgQVJDSF9VTldJTkRfU0VDVElPTl9OQU1FKTsKLSNlbmRpZgogCiAJLyogRG9uJ3Qga2VlcCBtb2RpbmZvIGFuZCB2ZXJzaW9uIHNlY3Rpb25zLiAqLwogCXNlY2hkcnNbaW5mb2luZGV4XS5zaF9mbGFncyAmPSB+KHVuc2lnbmVkIGxvbmcpU0hGX0FMTE9DOwpAQCAtMTk0Miw4ICsxOTY0LDYgQEAKIAlzZWNoZHJzW3N5bWluZGV4XS5zaF9mbGFncyB8PSBTSEZfQUxMT0M7CiAJc2VjaGRyc1tzdHJpbmRleF0uc2hfZmxhZ3MgfD0gU0hGX0FMTE9DOwogI2VuZGlmCi0JaWYgKHVud2luZGV4KQotCQlzZWNoZHJzW3Vud2luZGV4XS5zaF9mbGFncyB8PSBTSEZfQUxMT0M7CiAKIAkvKiBDaGVjayBtb2R1bGUgc3RydWN0IHZlcnNpb24gbm93LCBiZWZvcmUgd2UgdHJ5IHRvIHVzZSBtb2R1bGUuICovCiAJaWYgKCFjaGVja19tb2RzdHJ1Y3RfdmVyc2lvbihzZWNoZHJzLCB2ZXJzaW5kZXgsIG1vZCkpIHsKQEAgLTIyNDAsMTQgKzIyNjAsMTAgQEAKIAlhZGRfc2VjdF9hdHRycyhtb2QsIGhkci0+ZV9zaG51bSwgc2Vjc3RyaW5ncywgc2VjaGRycyk7CiAJYWRkX25vdGVzX2F0dHJzKG1vZCwgaGRyLT5lX3NobnVtLCBzZWNzdHJpbmdzLCBzZWNoZHJzKTsKIAotCS8qIFNpemUgb2Ygc2VjdGlvbiAwIGlzIDAsIHNvIHRoaXMgd29ya3Mgd2VsbCBpZiBubyB1bndpbmQgaW5mby4gKi8KLQltb2QtPnVud2luZF9pbmZvID0gdW53aW5kX2FkZF90YWJsZShtb2QsCi0JCQkJCSAgICAodm9pZCAqKXNlY2hkcnNbdW53aW5kZXhdLnNoX2FkZHIsCi0JCQkJCSAgICBzZWNoZHJzW3Vud2luZGV4XS5zaF9zaXplKTsKLQogCS8qIEdldCByaWQgb2YgdGVtcG9yYXJ5IGNvcHkgKi8KIAl2ZnJlZShoZHIpOwogCisJc3RvcF9tYWNoaW5lX2Rlc3Ryb3koKTsKIAkvKiBEb25lISAqLwogCXJldHVybiBtb2Q7CiAKQEAgLTIyNzAsNiArMjI4Niw3IEBACiAJa2ZyZWUoYXJncyk7CiAgZnJlZV9oZHI6CiAJdmZyZWUoaGRyKTsKKwlzdG9wX21hY2hpbmVfZGVzdHJveSgpOwogCXJldHVybiBFUlJfUFRSKGVycik7CiAKICB0cnVuY2F0ZWQ6CkBAIC0yMzM3LDExICsyMzU0LDEyIEBACiAJLyogTm93IGl0J3MgYSBmaXJzdCBjbGFzcyBjaXRpemVuISAgV2FrZSB1cCBhbnlvbmUgd2FpdGluZyBmb3IgaXQuICovCiAJbW9kLT5zdGF0ZSA9IE1PRFVMRV9TVEFURV9MSVZFOwogCXdha2VfdXAoJm1vZHVsZV93cSk7CisJYmxvY2tpbmdfbm90aWZpZXJfY2FsbF9jaGFpbigmbW9kdWxlX25vdGlmeV9saXN0LAorCQkJCSAgICAgTU9EVUxFX1NUQVRFX0xJVkUsIG1vZCk7CiAKIAltdXRleF9sb2NrKCZtb2R1bGVfbXV0ZXgpOwogCS8qIERyb3AgaW5pdGlhbCByZWZlcmVuY2UuICovCiAJbW9kdWxlX3B1dChtb2QpOwotCXVud2luZF9yZW1vdmVfdGFibGUobW9kLT51bndpbmRfaW5mbywgMSk7CiAJbW9kdWxlX2ZyZWUobW9kLCBtb2QtPm1vZHVsZV9pbml0KTsKIAltb2QtPm1vZHVsZV9pbml0ID0gTlVMTDsKIAltb2QtPmluaXRfc2l6ZSA9IDA7CkBAIC0yMzc2LDcgKzIzOTQsNyBAQAogCXVuc2lnbmVkIGxvbmcgbmV4dHZhbDsKIAogCS8qIEF0IHdvcnNlLCBuZXh0IHZhbHVlIGlzIGF0IGVuZCBvZiBtb2R1bGUgKi8KLQlpZiAod2l0aGluKGFkZHIsIG1vZC0+bW9kdWxlX2luaXQsIG1vZC0+aW5pdF9zaXplKSkKKwlpZiAod2l0aGluX21vZHVsZV9pbml0KGFkZHIsIG1vZCkpCiAJCW5leHR2YWwgPSAodW5zaWduZWQgbG9uZyltb2QtPm1vZHVsZV9pbml0K21vZC0+aW5pdF90ZXh0X3NpemU7CiAJZWxzZQogCQluZXh0dmFsID0gKHVuc2lnbmVkIGxvbmcpbW9kLT5tb2R1bGVfY29yZSttb2QtPmNvcmVfdGV4dF9zaXplOwpAQCAtMjQyNCw4ICsyNDQyLDggQEAKIAogCXByZWVtcHRfZGlzYWJsZSgpOwogCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KG1vZCwgJm1vZHVsZXMsIGxpc3QpIHsKLQkJaWYgKHdpdGhpbihhZGRyLCBtb2QtPm1vZHVsZV9pbml0LCBtb2QtPmluaXRfc2l6ZSkKLQkJICAgIHx8IHdpdGhpbihhZGRyLCBtb2QtPm1vZHVsZV9jb3JlLCBtb2QtPmNvcmVfc2l6ZSkpIHsKKwkJaWYgKHdpdGhpbl9tb2R1bGVfaW5pdChhZGRyLCBtb2QpIHx8CisJCSAgICB3aXRoaW5fbW9kdWxlX2NvcmUoYWRkciwgbW9kKSkgewogCQkJaWYgKG1vZG5hbWUpCiAJCQkJKm1vZG5hbWUgPSBtb2QtPm5hbWU7CiAJCQlyZXQgPSBnZXRfa3N5bWJvbChtb2QsIGFkZHIsIHNpemUsIG9mZnNldCk7CkBAIC0yNDQ3LDggKzI0NjUsOCBAQAogCiAJcHJlZW1wdF9kaXNhYmxlKCk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UobW9kLCAmbW9kdWxlcywgbGlzdCkgewotCQlpZiAod2l0aGluKGFkZHIsIG1vZC0+bW9kdWxlX2luaXQsIG1vZC0+aW5pdF9zaXplKSB8fAotCQkgICAgd2l0aGluKGFkZHIsIG1vZC0+bW9kdWxlX2NvcmUsIG1vZC0+Y29yZV9zaXplKSkgeworCQlpZiAod2l0aGluX21vZHVsZV9pbml0KGFkZHIsIG1vZCkgfHwKKwkJICAgIHdpdGhpbl9tb2R1bGVfY29yZShhZGRyLCBtb2QpKSB7CiAJCQljb25zdCBjaGFyICpzeW07CiAKIAkJCXN5bSA9IGdldF9rc3ltYm9sKG1vZCwgYWRkciwgTlVMTCwgTlVMTCk7CkBAIC0yNDcxLDggKzI0ODksOCBAQAogCiAJcHJlZW1wdF9kaXNhYmxlKCk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UobW9kLCAmbW9kdWxlcywgbGlzdCkgewotCQlpZiAod2l0aGluKGFkZHIsIG1vZC0+bW9kdWxlX2luaXQsIG1vZC0+aW5pdF9zaXplKSB8fAotCQkgICAgd2l0aGluKGFkZHIsIG1vZC0+bW9kdWxlX2NvcmUsIG1vZC0+Y29yZV9zaXplKSkgeworCQlpZiAod2l0aGluX21vZHVsZV9pbml0KGFkZHIsIG1vZCkgfHwKKwkJICAgIHdpdGhpbl9tb2R1bGVfY29yZShhZGRyLCBtb2QpKSB7CiAJCQljb25zdCBjaGFyICpzeW07CiAKIAkJCXN5bSA9IGdldF9rc3ltYm9sKG1vZCwgYWRkciwgc2l6ZSwgb2Zmc2V0KTsKQEAgLTI1MDQsNyArMjUyMiw3IEBACiAJCQlzdHJsY3B5KG5hbWUsIG1vZC0+c3RydGFiICsgbW9kLT5zeW10YWJbc3ltbnVtXS5zdF9uYW1lLAogCQkJCUtTWU1fTkFNRV9MRU4pOwogCQkJc3RybGNweShtb2R1bGVfbmFtZSwgbW9kLT5uYW1lLCBNT0RVTEVfTkFNRV9MRU4pOwotCQkJKmV4cG9ydGVkID0gaXNfZXhwb3J0ZWQobmFtZSwgbW9kKTsKKwkJCSpleHBvcnRlZCA9IGlzX2V4cG9ydGVkKG5hbWUsICp2YWx1ZSwgbW9kKTsKIAkJCXByZWVtcHRfZW5hYmxlKCk7CiAJCQlyZXR1cm4gMDsKIAkJfQpAQCAtMjY5MSw3ICsyNzA5LDcgQEAKIAlwcmVlbXB0X2Rpc2FibGUoKTsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KG1vZCwgJm1vZHVsZXMsIGxpc3QpIHsKLQkJaWYgKHdpdGhpbihhZGRyLCBtb2QtPm1vZHVsZV9jb3JlLCBtb2QtPmNvcmVfc2l6ZSkpIHsKKwkJaWYgKHdpdGhpbl9tb2R1bGVfY29yZShhZGRyLCBtb2QpKSB7CiAJCQlwcmVlbXB0X2VuYWJsZSgpOwogCQkJcmV0dXJuIDE7CiAJCX0KZGlmZiAtLWdpdCBhL2tlcm5lbC9uc19jZ3JvdXAuYyBiL2tlcm5lbC9uc19jZ3JvdXAuYwppbmRleCA0M2MyMTExLi43OGJjM2ZkIDEwMDY0NAotLS0gYS9rZXJuZWwvbnNfY2dyb3VwLmMKKysrIGIva2VybmVsL25zX2Nncm91cC5jCkBAIC0xMyw3ICsxMyw2IEBACiAKIHN0cnVjdCBuc19jZ3JvdXAgewogCXN0cnVjdCBjZ3JvdXBfc3Vic3lzX3N0YXRlIGNzczsKLQlzcGlubG9ja190IGxvY2s7CiB9OwogCiBzdHJ1Y3QgY2dyb3VwX3N1YnN5cyBuc19zdWJzeXM7CkBAIC04NCw3ICs4Myw2IEBACiAJbnNfY2dyb3VwID0ga3phbGxvYyhzaXplb2YoKm5zX2Nncm91cCksIEdGUF9LRVJORUwpOwogCWlmICghbnNfY2dyb3VwKQogCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKLQlzcGluX2xvY2tfaW5pdCgmbnNfY2dyb3VwLT5sb2NrKTsKIAlyZXR1cm4gJm5zX2Nncm91cC0+Y3NzOwogfQogCmRpZmYgLS1naXQgYS9rZXJuZWwvcGFuaWMuYyBiL2tlcm5lbC9wYW5pYy5jCmluZGV4IDEzZjA2MzQuLjJhMmZmMzYgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9wYW5pYy5jCisrKyBiL2tlcm5lbC9wYW5pYy5jCkBAIC0yOTksNiArMjk5LDggQEAKIHsKIAlpZiAoIW9vcHNfaWQpCiAJCWdldF9yYW5kb21fYnl0ZXMoJm9vcHNfaWQsIHNpemVvZihvb3BzX2lkKSk7CisJZWxzZQorCQlvb3BzX2lkKys7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2tlcm5lbC9waWQuYyBiL2tlcm5lbC9waWQuYwppbmRleCAwNjRlNzZhLi4xYjM1ODZmIDEwMDY0NAotLS0gYS9rZXJuZWwvcGlkLmMKKysrIGIva2VybmVsL3BpZC5jCkBAIC00NzQsOCArNDc0LDE0IEBACiB9CiBFWFBPUlRfU1lNQk9MKHRhc2tfc2Vzc2lvbl9ucl9ucyk7CiAKK3N0cnVjdCBwaWRfbmFtZXNwYWNlICp0YXNrX2FjdGl2ZV9waWRfbnMoc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCit7CisJcmV0dXJuIG5zX29mX3BpZCh0YXNrX3BpZCh0c2spKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHRhc2tfYWN0aXZlX3BpZF9ucyk7CisKIC8qCi0gKiBVc2VkIGJ5IHByb2MgdG8gZmluZCB0aGUgZmlyc3QgcGlkIHRoYXQgaXMgZ3JlYXRlciB0aGVuIG9yIGVxdWFsIHRvIG5yLgorICogVXNlZCBieSBwcm9jIHRvIGZpbmQgdGhlIGZpcnN0IHBpZCB0aGF0IGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBuci4KICAqCiAgKiBJZiB0aGVyZSBpcyBhIHBpZCBhdCBuciB0aGlzIGZ1bmN0aW9uIGlzIGV4YWN0bHkgdGhlIHNhbWUgYXMgZmluZF9waWRfbnMuCiAgKi8KZGlmZiAtLWdpdCBhL2tlcm5lbC9wb3dlci9tYWluLmMgYi9rZXJuZWwvcG93ZXIvbWFpbi5jCmluZGV4IDYxM2YxNjkuLjIzOTk4ODggMTAwNjQ0Ci0tLSBhL2tlcm5lbC9wb3dlci9tYWluLmMKKysrIGIva2VybmVsL3Bvd2VyL21haW4uYwpAQCAtNjE1LDcgKzYxNSw3IEBACiAJLyogdGhpcyBtYXkgZmFpbCBpZiB0aGUgUlRDIGhhc24ndCBiZWVuIGluaXRpYWxpemVkICovCiAJc3RhdHVzID0gcnRjX3JlYWRfdGltZShydGMsICZhbG0udGltZSk7CiAJaWYgKHN0YXR1cyA8IDApIHsKLQkJcHJpbnRrKGVycl9yZWFkdGltZSwgcnRjLT5kZXYuYnVzX2lkLCBzdGF0dXMpOworCQlwcmludGsoZXJyX3JlYWR0aW1lLCBkZXZfbmFtZSgmcnRjLT5kZXYpLCBzdGF0dXMpOwogCQlyZXR1cm47CiAJfQogCXJ0Y190bV90b190aW1lKCZhbG0udGltZSwgJm5vdyk7CkBAIC02MjYsNyArNjI2LDcgQEAKIAogCXN0YXR1cyA9IHJ0Y19zZXRfYWxhcm0ocnRjLCAmYWxtKTsKIAlpZiAoc3RhdHVzIDwgMCkgewotCQlwcmludGsoZXJyX3dha2VhbGFybSwgcnRjLT5kZXYuYnVzX2lkLCBzdGF0dXMpOworCQlwcmludGsoZXJyX3dha2VhbGFybSwgZGV2X25hbWUoJnJ0Yy0+ZGV2KSwgc3RhdHVzKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtNjYwLDcgKzY2MCw3IEBACiAJaWYgKCFkZXZpY2VfbWF5X3dha2V1cChjYW5kaWRhdGUtPmRldi5wYXJlbnQpKQogCQlyZXR1cm4gMDsKIAotCSooY2hhciAqKiluYW1lX3B0ciA9IGRldi0+YnVzX2lkOworCSooY29uc3QgY2hhciAqKiluYW1lX3B0ciA9IGRldl9uYW1lKGRldik7CiAJcmV0dXJuIDE7CiB9CiAKZGlmZiAtLWdpdCBhL2tlcm5lbC9wcmludGsuYyBiL2tlcm5lbC9wcmludGsuYwppbmRleCBlNjUxYWIwLi43MDE1NzMzIDEwMDY0NAotLS0gYS9rZXJuZWwvcHJpbnRrLmMKKysrIGIva2VybmVsL3ByaW50ay5jCkBAIC02MTksNyArNjE5LDcgQEAKIHN0YXRpYyBjb25zdCBjaGFyIHJlY3Vyc2lvbl9idWdfbXNnIFtdID0KIAkJS0VSTl9DUklUICJCVUc6IHJlY2VudCBwcmludGsgcmVjdXJzaW9uIVxuIjsKIHN0YXRpYyBpbnQgcmVjdXJzaW9uX2J1ZzsKLQlzdGF0aWMgaW50IG5ld190ZXh0X2xpbmUgPSAxOworc3RhdGljIGludCBuZXdfdGV4dF9saW5lID0gMTsKIHN0YXRpYyBjaGFyIHByaW50a19idWZbMTAyNF07CiAKIGFzbWxpbmthZ2UgaW50IHZwcmludGsoY29uc3QgY2hhciAqZm10LCB2YV9saXN0IGFyZ3MpCmRpZmYgLS1naXQgYS9rZXJuZWwvcHJvZmlsZS5jIGIva2VybmVsL3Byb2ZpbGUuYwppbmRleCBkMThlMmQyLi43ODQ5MzNhIDEwMDY0NAotLS0gYS9rZXJuZWwvcHJvZmlsZS5jCisrKyBiL2tlcm5lbC9wcm9maWxlLmMKQEAgLTQ0NSw3ICs0NDUsNiBAQAogI2lmZGVmIENPTkZJR19QUk9DX0ZTCiAjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+Ci0jaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgogCiBzdGF0aWMgaW50IHByb2ZfY3B1X21hc2tfcmVhZF9wcm9jKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLAogCQkJaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKZGlmZiAtLWdpdCBhL2tlcm5lbC9yY3VwZGF0ZS5jIGIva2VybmVsL3JjdXBkYXRlLmMKaW5kZXggYWQ2M2FmOC4uZDkyYTc2YSAxMDA2NDQKLS0tIGEva2VybmVsL3JjdXBkYXRlLmMKKysrIGIva2VybmVsL3JjdXBkYXRlLmMKQEAgLTc3LDggKzc3LDE1IEBACiAgKiBzZWN0aW9ucyBhcmUgZGVsaW1pdGVkIGJ5IHJjdV9yZWFkX2xvY2soKSBhbmQgcmN1X3JlYWRfdW5sb2NrKCksCiAgKiBhbmQgbWF5IGJlIG5lc3RlZC4KICAqLwotdm9pZCBzeW5jaHJvbml6ZV9yY3Uodm9pZCk7CS8qIE1ha2VzIGtlcm5lbC1kb2MgdG9vbHMgaGFwcHkgKi8KLXN5bmNocm9uaXplX3JjdV94eHgoc3luY2hyb25pemVfcmN1LCBjYWxsX3JjdSkKK3ZvaWQgc3luY2hyb25pemVfcmN1KHZvaWQpCit7CisJc3RydWN0IHJjdV9zeW5jaHJvbml6ZSByY3U7CisJaW5pdF9jb21wbGV0aW9uKCZyY3UuY29tcGxldGlvbik7CisJLyogV2lsbCB3YWtlIG1lIGFmdGVyIFJDVSBmaW5pc2hlZC4gKi8KKwljYWxsX3JjdSgmcmN1LmhlYWQsIHdha2VtZV9hZnRlcl9yY3UpOworCS8qIFdhaXQgZm9yIGl0LiAqLworCXdhaXRfZm9yX2NvbXBsZXRpb24oJnJjdS5jb21wbGV0aW9uKTsKK30KIEVYUE9SVF9TWU1CT0xfR1BMKHN5bmNocm9uaXplX3JjdSk7CiAKIHN0YXRpYyB2b2lkIHJjdV9iYXJyaWVyX2NhbGxiYWNrKHN0cnVjdCByY3VfaGVhZCAqbm90dXNlZCkKZGlmZiAtLWdpdCBhL2tlcm5lbC9yY3VwcmVlbXB0LmMgYi9rZXJuZWwvcmN1cHJlZW1wdC5jCmluZGV4IGY5ZGM4ZjMuLjMzY2ZjNTAgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9yY3VwcmVlbXB0LmMKKysrIGIva2VybmVsL3JjdXByZWVtcHQuYwpAQCAtMTE3Nyw3ICsxMTc3LDE2IEBACiAgKiBpbiAtcnQgdGhpcyBkb2VzIC1ub3QtIG5lY2Vzc2FyaWx5IHJlc3VsdCBpbiBhbGwgY3VycmVudGx5IGV4ZWN1dGluZwogICogaW50ZXJydXB0IC1oYW5kbGVycy0gaGF2aW5nIGNvbXBsZXRlZC4KICAqLwotc3luY2hyb25pemVfcmN1X3h4eChfX3N5bmNocm9uaXplX3NjaGVkLCBjYWxsX3JjdV9zY2hlZCkKK3ZvaWQgX19zeW5jaHJvbml6ZV9zY2hlZCh2b2lkKQoreworCXN0cnVjdCByY3Vfc3luY2hyb25pemUgcmN1OworCisJaW5pdF9jb21wbGV0aW9uKCZyY3UuY29tcGxldGlvbik7CisJLyogV2lsbCB3YWtlIG1lIGFmdGVyIFJDVSBmaW5pc2hlZC4gKi8KKwljYWxsX3JjdV9zY2hlZCgmcmN1LmhlYWQsIHdha2VtZV9hZnRlcl9yY3UpOworCS8qIFdhaXQgZm9yIGl0LiAqLworCXdhaXRfZm9yX2NvbXBsZXRpb24oJnJjdS5jb21wbGV0aW9uKTsKK30KIEVYUE9SVF9TWU1CT0xfR1BMKF9fc3luY2hyb25pemVfc2NoZWQpOwogCiAvKgpkaWZmIC0tZ2l0IGEva2VybmVsL3JjdXRvcnR1cmUuYyBiL2tlcm5lbC9yY3V0b3J0dXJlLmMKaW5kZXggMzI0NWI0MC4uMWNmZjI4ZCAxMDA2NDQKLS0tIGEva2VybmVsL3JjdXRvcnR1cmUuYworKysgYi9rZXJuZWwvcmN1dG9ydHVyZS5jCkBAIC0xMzYsNyArMTM2LDcgQEAKICNlbmRpZgogaW50IHJjdXRvcnR1cmVfcnVubmFibGUgPSBSQ1VUT1JUVVJFX1JVTk5BQkxFX0lOSVQ7CiAKLSNkZWZpbmUgRlVMTFNUT1BfU0lHTkFMRUQgMQkvKiBCYWlsIGR1ZSB0byBzaWduYWwuICovCisjZGVmaW5lIEZVTExTVE9QX1NIVVRET1dOIDEJLyogQmFpbCBkdWUgdG8gc3lzdGVtIHNodXRkb3duL3BhbmljLiAqLwogI2RlZmluZSBGVUxMU1RPUF9DTEVBTlVQICAyCS8qIE9yZGVybHkgc2h1dGRvd24uICovCiBzdGF0aWMgaW50IGZ1bGxzdG9wOwkJLyogc3RvcCBnZW5lcmF0aW5nIGNhbGxiYWNrcyBhdCB0ZXN0IGVuZC4gKi8KIERFRklORV9NVVRFWChmdWxsc3RvcF9tdXRleCk7CS8qIHByb3RlY3QgZnVsbHN0b3AgdHJhbnNpdGlvbnMgYW5kICovCkBAIC0xNTEsMTIgKzE1MSwxMCBAQAogewogCWlmIChmdWxsc3RvcCkKIAkJcmV0dXJuIE5PVElGWV9ET05FOwotCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgewotCQltdXRleF9sb2NrKCZmdWxsc3RvcF9tdXRleCk7Ci0JCWlmICghQUNDRVNTX09OQ0UoZnVsbHN0b3ApKQotCQkJZnVsbHN0b3AgPSBGVUxMU1RPUF9TSUdOQUxFRDsKLQkJbXV0ZXhfdW5sb2NrKCZmdWxsc3RvcF9tdXRleCk7Ci0JfQorCW11dGV4X2xvY2soJmZ1bGxzdG9wX211dGV4KTsKKwlpZiAoIWZ1bGxzdG9wKQorCQlmdWxsc3RvcCA9IEZVTExTVE9QX1NIVVRET1dOOworCW11dGV4X3VubG9jaygmZnVsbHN0b3BfbXV0ZXgpOwogCXJldHVybiBOT1RJRllfRE9ORTsKIH0KIApAQCAtNjI0LDcgKzYyMiw3IEBACiAJCXJjdV9zdHV0dGVyX3dhaXQoKTsKIAl9IHdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpICYmICFmdWxsc3RvcCk7CiAJVkVSQk9TRV9QUklOVEtfU1RSSU5HKCJyY3VfdG9ydHVyZV93cml0ZXIgdGFzayBzdG9wcGluZyIpOwotCXdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpICYmIGZ1bGxzdG9wICE9IEZVTExTVE9QX1NJR05BTEVEKQorCXdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpICYmIGZ1bGxzdG9wICE9IEZVTExTVE9QX1NIVVRET1dOKQogCQlzY2hlZHVsZV90aW1lb3V0X3VuaW50ZXJydXB0aWJsZSgxKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTY0OSw3ICs2NDcsNyBAQAogCX0gd2hpbGUgKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkgJiYgIWZ1bGxzdG9wKTsKIAogCVZFUkJPU0VfUFJJTlRLX1NUUklORygicmN1X3RvcnR1cmVfZmFrZXdyaXRlciB0YXNrIHN0b3BwaW5nIik7Ci0Jd2hpbGUgKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkgJiYgZnVsbHN0b3AgIT0gRlVMTFNUT1BfU0lHTkFMRUQpCisJd2hpbGUgKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkgJiYgZnVsbHN0b3AgIT0gRlVMTFNUT1BfU0hVVERPV04pCiAJCXNjaGVkdWxlX3RpbWVvdXRfdW5pbnRlcnJ1cHRpYmxlKDEpOwogCXJldHVybiAwOwogfQpAQCAtNzU5LDcgKzc1Nyw3IEBACiAJVkVSQk9TRV9QUklOVEtfU1RSSU5HKCJyY3VfdG9ydHVyZV9yZWFkZXIgdGFzayBzdG9wcGluZyIpOwogCWlmIChpcnFyZWFkZXIgJiYgY3VyX29wcy0+aXJxY2FwYWJsZSkKIAkJZGVsX3RpbWVyX3N5bmMoJnQpOwotCXdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpICYmIGZ1bGxzdG9wICE9IEZVTExTVE9QX1NJR05BTEVEKQorCXdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpICYmIGZ1bGxzdG9wICE9IEZVTExTVE9QX1NIVVRET1dOKQogCQlzY2hlZHVsZV90aW1lb3V0X3VuaW50ZXJydXB0aWJsZSgxKTsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2tlcm5lbC9yY3V0cmVlLmMgYi9rZXJuZWwvcmN1dHJlZS5jCmluZGV4IGEzNDJiMDMuLmYyZDg2MzggMTAwNjQ0Ci0tLSBhL2tlcm5lbC9yY3V0cmVlLmMKKysrIGIva2VybmVsL3JjdXRyZWUuYwpAQCAtNzksNyArNzksMTAgQEAKIERFRklORV9QRVJfQ1BVKHN0cnVjdCByY3VfZGF0YSwgcmN1X2JoX2RhdGEpOwogCiAjaWZkZWYgQ09ORklHX05PX0haCi1ERUZJTkVfUEVSX0NQVShzdHJ1Y3QgcmN1X2R5bnRpY2tzLCByY3VfZHludGlja3MpOworREVGSU5FX1BFUl9DUFUoc3RydWN0IHJjdV9keW50aWNrcywgcmN1X2R5bnRpY2tzKSA9IHsKKwkuZHludGlja3NfbmVzdGluZyA9IDEsCisJLmR5bnRpY2tzID0gMSwKK307CiAjZW5kaWYgLyogI2lmZGVmIENPTkZJR19OT19IWiAqLwogCiBzdGF0aWMgaW50IGJsaW1pdCA9IDEwOwkJLyogTWF4aW11bSBjYWxsYmFja3MgcGVyIHNvZnRpcnEuICovCkBAIC01NzIsNiArNTc1LDcgQEAKIAkvKiBTcGVjaWFsLWNhc2UgdGhlIGNvbW1vbiBzaW5nbGUtbGV2ZWwgY2FzZS4gKi8KIAlpZiAoTlVNX1JDVV9OT0RFUyA9PSAxKSB7CiAJCXJucC0+cXNtYXNrID0gcm5wLT5xc21hc2tpbml0OworCQlyc3AtPnNpZ25hbGVkID0gUkNVX1NJR05BTF9JTklUOyAvKiBmb3JjZV9xdWllc2NlbnRfc3RhdGUgT0suICovCiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJucC0+bG9jaywgZmxhZ3MpOwogCQlyZXR1cm47CiAJfQpAQCAtMTM3OSwxMyArMTM4Myw2IEBACiAKIHN0YXRpYyB2b2lkIF9fY3B1aW5pdCByY3Vfb25saW5lX2NwdShpbnQgY3B1KQogewotI2lmZGVmIENPTkZJR19OT19IWgotCXN0cnVjdCByY3VfZHludGlja3MgKnJkdHAgPSAmcGVyX2NwdShyY3VfZHludGlja3MsIGNwdSk7Ci0KLQlyZHRwLT5keW50aWNrc19uZXN0aW5nID0gMTsKLQlyZHRwLT5keW50aWNrcyB8PSAxOyAJLyogbmVlZCBjb25zZWN1dGl2ZSAjcyBldmVuIGZvciBob3RwbHVnLiAqLwotCXJkdHAtPmR5bnRpY2tzX25taSA9IChyZHRwLT5keW50aWNrc19ubWkgKyAxKSAmIH4weDE7Ci0jZW5kaWYgLyogI2lmZGVmIENPTkZJR19OT19IWiAqLwogCXJjdV9pbml0X3BlcmNwdV9kYXRhKGNwdSwgJnJjdV9zdGF0ZSk7CiAJcmN1X2luaXRfcGVyY3B1X2RhdGEoY3B1LCAmcmN1X2JoX3N0YXRlKTsKIAlvcGVuX3NvZnRpcnEoUkNVX1NPRlRJUlEsIHJjdV9wcm9jZXNzX2NhbGxiYWNrcyk7CmRpZmYgLS1naXQgYS9rZXJuZWwvcmVzX2NvdW50ZXIuYyBiL2tlcm5lbC9yZXNfY291bnRlci5jCmluZGV4IGYyNzVjOGUuLmJmOGU3NTMgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9yZXNfY291bnRlci5jCisrKyBiL2tlcm5lbC9yZXNfY291bnRlci5jCkBAIC0xNSwxMCArMTUsMTEgQEAKICNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KIAotdm9pZCByZXNfY291bnRlcl9pbml0KHN0cnVjdCByZXNfY291bnRlciAqY291bnRlcikKK3ZvaWQgcmVzX2NvdW50ZXJfaW5pdChzdHJ1Y3QgcmVzX2NvdW50ZXIgKmNvdW50ZXIsIHN0cnVjdCByZXNfY291bnRlciAqcGFyZW50KQogewogCXNwaW5fbG9ja19pbml0KCZjb3VudGVyLT5sb2NrKTsKIAljb3VudGVyLT5saW1pdCA9ICh1bnNpZ25lZCBsb25nIGxvbmcpTExPTkdfTUFYOworCWNvdW50ZXItPnBhcmVudCA9IHBhcmVudDsKIH0KIAogaW50IHJlc19jb3VudGVyX2NoYXJnZV9sb2NrZWQoc3RydWN0IHJlc19jb3VudGVyICpjb3VudGVyLCB1bnNpZ25lZCBsb25nIHZhbCkKQEAgLTM0LDE0ICszNSwzNCBAQAogCXJldHVybiAwOwogfQogCi1pbnQgcmVzX2NvdW50ZXJfY2hhcmdlKHN0cnVjdCByZXNfY291bnRlciAqY291bnRlciwgdW5zaWduZWQgbG9uZyB2YWwpCitpbnQgcmVzX2NvdW50ZXJfY2hhcmdlKHN0cnVjdCByZXNfY291bnRlciAqY291bnRlciwgdW5zaWduZWQgbG9uZyB2YWwsCisJCQlzdHJ1Y3QgcmVzX2NvdW50ZXIgKipsaW1pdF9mYWlsX2F0KQogewogCWludCByZXQ7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgcmVzX2NvdW50ZXIgKmMsICp1OwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmNvdW50ZXItPmxvY2ssIGZsYWdzKTsKLQlyZXQgPSByZXNfY291bnRlcl9jaGFyZ2VfbG9ja2VkKGNvdW50ZXIsIHZhbCk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY291bnRlci0+bG9jaywgZmxhZ3MpOworCSpsaW1pdF9mYWlsX2F0ID0gTlVMTDsKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJZm9yIChjID0gY291bnRlcjsgYyAhPSBOVUxMOyBjID0gYy0+cGFyZW50KSB7CisJCXNwaW5fbG9jaygmYy0+bG9jayk7CisJCXJldCA9IHJlc19jb3VudGVyX2NoYXJnZV9sb2NrZWQoYywgdmFsKTsKKwkJc3Bpbl91bmxvY2soJmMtPmxvY2spOworCQlpZiAocmV0IDwgMCkgeworCQkJKmxpbWl0X2ZhaWxfYXQgPSBjOworCQkJZ290byB1bmRvOworCQl9CisJfQorCXJldCA9IDA7CisJZ290byBkb25lOwordW5kbzoKKwlmb3IgKHUgPSBjb3VudGVyOyB1ICE9IGM7IHUgPSB1LT5wYXJlbnQpIHsKKwkJc3Bpbl9sb2NrKCZ1LT5sb2NrKTsKKwkJcmVzX2NvdW50ZXJfdW5jaGFyZ2VfbG9ja2VkKHUsIHZhbCk7CisJCXNwaW5fdW5sb2NrKCZ1LT5sb2NrKTsKKwl9Citkb25lOgorCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC01NiwxMCArNzcsMTUgQEAKIHZvaWQgcmVzX2NvdW50ZXJfdW5jaGFyZ2Uoc3RydWN0IHJlc19jb3VudGVyICpjb3VudGVyLCB1bnNpZ25lZCBsb25nIHZhbCkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCByZXNfY291bnRlciAqYzsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZjb3VudGVyLT5sb2NrLCBmbGFncyk7Ci0JcmVzX2NvdW50ZXJfdW5jaGFyZ2VfbG9ja2VkKGNvdW50ZXIsIHZhbCk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY291bnRlci0+bG9jaywgZmxhZ3MpOworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlmb3IgKGMgPSBjb3VudGVyOyBjICE9IE5VTEw7IGMgPSBjLT5wYXJlbnQpIHsKKwkJc3Bpbl9sb2NrKCZjLT5sb2NrKTsKKwkJcmVzX2NvdW50ZXJfdW5jaGFyZ2VfbG9ja2VkKGMsIHZhbCk7CisJCXNwaW5fdW5sb2NrKCZjLT5sb2NrKTsKKwl9CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogfQogCiAKZGlmZiAtLWdpdCBhL2tlcm5lbC9yZXNvdXJjZS5jIGIva2VybmVsL3Jlc291cmNlLmMKaW5kZXggZTYzMzEwNi4uY2E2YTE1MyAxMDA2NDQKLS0tIGEva2VybmVsL3Jlc291cmNlLmMKKysrIGIva2VybmVsL3Jlc291cmNlLmMKQEAgLTYyMyw3ICs2MjMsNyBAQAogICovCiBzdHJ1Y3QgcmVzb3VyY2UgKiBfX3JlcXVlc3RfcmVnaW9uKHN0cnVjdCByZXNvdXJjZSAqcGFyZW50LAogCQkJCSAgIHJlc291cmNlX3NpemVfdCBzdGFydCwgcmVzb3VyY2Vfc2l6ZV90IG4sCi0JCQkJICAgY29uc3QgY2hhciAqbmFtZSkKKwkJCQkgICBjb25zdCBjaGFyICpuYW1lLCBpbnQgZmxhZ3MpCiB7CiAJc3RydWN0IHJlc291cmNlICpyZXMgPSBremFsbG9jKHNpemVvZigqcmVzKSwgR0ZQX0tFUk5FTCk7CiAKQEAgLTYzNCw2ICs2MzQsNyBAQAogCXJlcy0+c3RhcnQgPSBzdGFydDsKIAlyZXMtPmVuZCA9IHN0YXJ0ICsgbiAtIDE7CiAJcmVzLT5mbGFncyA9IElPUkVTT1VSQ0VfQlVTWTsKKwlyZXMtPmZsYWdzIHw9IGZsYWdzOwogCiAJd3JpdGVfbG9jaygmcmVzb3VyY2VfbG9jayk7CiAKQEAgLTY3OSw3ICs2ODAsNyBAQAogewogCXN0cnVjdCByZXNvdXJjZSAqIHJlczsKIAotCXJlcyA9IF9fcmVxdWVzdF9yZWdpb24ocGFyZW50LCBzdGFydCwgbiwgImNoZWNrLXJlZ2lvbiIpOworCXJlcyA9IF9fcmVxdWVzdF9yZWdpb24ocGFyZW50LCBzdGFydCwgbiwgImNoZWNrLXJlZ2lvbiIsIDApOwogCWlmICghcmVzKQogCQlyZXR1cm4gLUVCVVNZOwogCkBAIC03NzYsNyArNzc3LDcgQEAKIAlkci0+c3RhcnQgPSBzdGFydDsKIAlkci0+biA9IG47CiAKLQlyZXMgPSBfX3JlcXVlc3RfcmVnaW9uKHBhcmVudCwgc3RhcnQsIG4sIG5hbWUpOworCXJlcyA9IF9fcmVxdWVzdF9yZWdpb24ocGFyZW50LCBzdGFydCwgbiwgbmFtZSwgMCk7CiAJaWYgKHJlcykKIAkJZGV2cmVzX2FkZChkZXYsIGRyKTsKIAllbHNlCkBAIC04NzYsMyArODc3LDU3IEBACiAKIAlyZXR1cm4gZXJyOwogfQorCisjaWZkZWYgQ09ORklHX1NUUklDVF9ERVZNRU0KK3N0YXRpYyBpbnQgc3RyaWN0X2lvbWVtX2NoZWNrcyA9IDE7CisjZWxzZQorc3RhdGljIGludCBzdHJpY3RfaW9tZW1fY2hlY2tzOworI2VuZGlmCisKKy8qCisgKiBjaGVjayBpZiBhbiBhZGRyZXNzIGlzIHJlc2VydmVkIGluIHRoZSBpb21lbSByZXNvdXJjZSB0cmVlCisgKiByZXR1cm5zIDEgaWYgcmVzZXJ2ZWQsIDAgaWYgbm90IHJlc2VydmVkLgorICovCitpbnQgaW9tZW1faXNfZXhjbHVzaXZlKHU2NCBhZGRyKQoreworCXN0cnVjdCByZXNvdXJjZSAqcCA9ICZpb21lbV9yZXNvdXJjZTsKKwlpbnQgZXJyID0gMDsKKwlsb2ZmX3QgbDsKKwlpbnQgc2l6ZSA9IFBBR0VfU0laRTsKKworCWlmICghc3RyaWN0X2lvbWVtX2NoZWNrcykKKwkJcmV0dXJuIDA7CisKKwlhZGRyID0gYWRkciAmIFBBR0VfTUFTSzsKKworCXJlYWRfbG9jaygmcmVzb3VyY2VfbG9jayk7CisJZm9yIChwID0gcC0+Y2hpbGQ7IHAgOyBwID0gcl9uZXh0KE5VTEwsIHAsICZsKSkgeworCQkvKgorCQkgKiBXZSBjYW4gcHJvYmFibHkgc2tpcCB0aGUgcmVzb3VyY2VzIHdpdGhvdXQKKwkJICogSU9SRVNPVVJDRV9JTyBhdHRyaWJ1dGU/CisJCSAqLworCQlpZiAocC0+c3RhcnQgPj0gYWRkciArIHNpemUpCisJCQlicmVhazsKKwkJaWYgKHAtPmVuZCA8IGFkZHIpCisJCQljb250aW51ZTsKKwkJaWYgKHAtPmZsYWdzICYgSU9SRVNPVVJDRV9CVVNZICYmCisJCSAgICAgcC0+ZmxhZ3MgJiBJT1JFU09VUkNFX0VYQ0xVU0lWRSkgeworCQkJZXJyID0gMTsKKwkJCWJyZWFrOworCQl9CisJfQorCXJlYWRfdW5sb2NrKCZyZXNvdXJjZV9sb2NrKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHN0cmljdF9pb21lbShjaGFyICpzdHIpCit7CisJaWYgKHN0cnN0cihzdHIsICJyZWxheGVkIikpCisJCXN0cmljdF9pb21lbV9jaGVja3MgPSAwOworCWlmIChzdHJzdHIoc3RyLCAic3RyaWN0IikpCisJCXN0cmljdF9pb21lbV9jaGVja3MgPSAxOworCXJldHVybiAxOworfQorCitfX3NldHVwKCJpb21lbT0iLCBzdHJpY3RfaW9tZW0pOwpkaWZmIC0tZ2l0IGEva2VybmVsL3NjaGVkLmMgYi9rZXJuZWwvc2NoZWQuYwppbmRleCA1NDVjNmZjLi5kZWI1YWM4IDEwMDY0NAotLS0gYS9rZXJuZWwvc2NoZWQuYworKysgYi9rZXJuZWwvc2NoZWQuYwpAQCAtMzcyOCw4ICszNzI4LDEzIEBACiAJCX0KIAogCQlkb3VibGVfdW5sb2NrX2JhbGFuY2UodGhpc19ycSwgYnVzaWVzdCk7CisJCS8qCisJCSAqIFNob3VsZCBub3QgY2FsbCB0dHd1IHdoaWxlIGhvbGRpbmcgYSBycS0+bG9jaworCQkgKi8KKwkJc3Bpbl91bmxvY2soJnRoaXNfcnEtPmxvY2spOwogCQlpZiAoYWN0aXZlX2JhbGFuY2UpCiAJCQl3YWtlX3VwX3Byb2Nlc3MoYnVzaWVzdC0+bWlncmF0aW9uX3RocmVhZCk7CisJCXNwaW5fbG9jaygmdGhpc19ycS0+bG9jayk7CiAKIAl9IGVsc2UKIAkJc2QtPm5yX2JhbGFuY2VfZmFpbGVkID0gMDsKQEAgLTY5NTcsNyArNjk2Miw3IEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnEtPmxvY2ssIGZsYWdzKTsKIH0KIAotc3RhdGljIGludCBpbml0X3Jvb3Rkb21haW4oc3RydWN0IHJvb3RfZG9tYWluICpyZCwgYm9vbCBib290bWVtKQorc3RhdGljIGludCBfX2luaXRfcmVmb2sgaW5pdF9yb290ZG9tYWluKHN0cnVjdCByb290X2RvbWFpbiAqcmQsIGJvb2wgYm9vdG1lbSkKIHsKIAltZW1zZXQocmQsIDAsIHNpemVvZigqcmQpKTsKIApAQCAtNjk3MCw3ICs2OTc1LDcgQEAKIAl9CiAKIAlpZiAoIWFsbG9jX2NwdW1hc2tfdmFyKCZyZC0+c3BhbiwgR0ZQX0tFUk5FTCkpCi0JCWdvdG8gZnJlZV9yZDsKKwkJZ290byBvdXQ7CiAJaWYgKCFhbGxvY19jcHVtYXNrX3ZhcigmcmQtPm9ubGluZSwgR0ZQX0tFUk5FTCkpCiAJCWdvdG8gZnJlZV9zcGFuOwogCWlmICghYWxsb2NfY3B1bWFza192YXIoJnJkLT5ydG9fbWFzaywgR0ZQX0tFUk5FTCkpCkBAIC02OTg2LDggKzY5OTEsNyBAQAogCWZyZWVfY3B1bWFza192YXIocmQtPm9ubGluZSk7CiBmcmVlX3NwYW46CiAJZnJlZV9jcHVtYXNrX3ZhcihyZC0+c3Bhbik7Ci1mcmVlX3JkOgotCWtmcmVlKHJkKTsKK291dDoKIAlyZXR1cm4gLUVOT01FTTsKIH0KIApAQCAtNzk4Nyw3ICs3OTkxLDcgQEAKIH0KIAogI2lmIGRlZmluZWQoQ09ORklHX1NDSEVEX01DKSB8fCBkZWZpbmVkKENPTkZJR19TQ0hFRF9TTVQpCi1pbnQgYXJjaF9yZWluaXRfc2NoZWRfZG9tYWlucyh2b2lkKQorc3RhdGljIHZvaWQgYXJjaF9yZWluaXRfc2NoZWRfZG9tYWlucyh2b2lkKQogewogCWdldF9vbmxpbmVfY3B1cygpOwogCkBAIC03OTk2LDEzICs4MDAwLDEwIEBACiAKIAlyZWJ1aWxkX3NjaGVkX2RvbWFpbnMoKTsKIAlwdXRfb25saW5lX2NwdXMoKTsKLQotCXJldHVybiAwOwogfQogCiBzdGF0aWMgc3NpemVfdCBzY2hlZF9wb3dlcl9zYXZpbmdzX3N0b3JlKGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBpbnQgc210KQogewotCWludCByZXQ7CiAJdW5zaWduZWQgaW50IGxldmVsID0gMDsKIAogCWlmIChzc2NhbmYoYnVmLCAiJXUiLCAmbGV2ZWwpICE9IDEpCkBAIC04MDIzLDkgKzgwMjQsOSBAQAogCWVsc2UKIAkJc2NoZWRfbWNfcG93ZXJfc2F2aW5ncyA9IGxldmVsOwogCi0JcmV0ID0gYXJjaF9yZWluaXRfc2NoZWRfZG9tYWlucygpOworCWFyY2hfcmVpbml0X3NjaGVkX2RvbWFpbnMoKTsKIAotCXJldHVybiByZXQgPyByZXQgOiBjb3VudDsKKwlyZXR1cm4gY291bnQ7CiB9CiAKICNpZmRlZiBDT05GSUdfU0NIRURfTUMKQEAgLTgwNjAsNyArODA2MSw3IEBACiAJCSAgIHNjaGVkX3NtdF9wb3dlcl9zYXZpbmdzX3N0b3JlKTsKICNlbmRpZgogCi1pbnQgc2NoZWRfY3JlYXRlX3N5c2ZzX3Bvd2VyX3NhdmluZ3NfZW50cmllcyhzdHJ1Y3Qgc3lzZGV2X2NsYXNzICpjbHMpCitpbnQgX19pbml0IHNjaGVkX2NyZWF0ZV9zeXNmc19wb3dlcl9zYXZpbmdzX2VudHJpZXMoc3RydWN0IHN5c2Rldl9jbGFzcyAqY2xzKQogewogCWludCBlcnIgPSAwOwogCmRpZmYgLS1naXQgYS9rZXJuZWwvc2NoZWRfY2xvY2suYyBiL2tlcm5lbC9zY2hlZF9jbG9jay5jCmluZGV4IGU4YWIwOTYuLmEwYjA4NTIgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zY2hlZF9jbG9jay5jCisrKyBiL2tlcm5lbC9zY2hlZF9jbG9jay5jCkBAIC0xMjQsNyArMTI0LDcgQEAKIAogCWNsb2NrID0gc2NkLT50aWNrX2d0b2QgKyBkZWx0YTsKIAltaW5fY2xvY2sgPSB3cmFwX21heChzY2QtPnRpY2tfZ3RvZCwgc2NkLT5jbG9jayk7Ci0JbWF4X2Nsb2NrID0gc2NkLT50aWNrX2d0b2QgKyBUSUNLX05TRUM7CisJbWF4X2Nsb2NrID0gd3JhcF9tYXgoc2NkLT5jbG9jaywgc2NkLT50aWNrX2d0b2QgKyBUSUNLX05TRUMpOwogCiAJY2xvY2sgPSB3cmFwX21heChjbG9jaywgbWluX2Nsb2NrKTsKIAljbG9jayA9IHdyYXBfbWluKGNsb2NrLCBtYXhfY2xvY2spOwpAQCAtMjI3LDYgKzIyNyw5IEBACiAgKi8KIHZvaWQgc2NoZWRfY2xvY2tfaWRsZV93YWtldXBfZXZlbnQodTY0IGRlbHRhX25zKQogeworCWlmICh0aW1la2VlcGluZ19zdXNwZW5kZWQpCisJCXJldHVybjsKKwogCXNjaGVkX2Nsb2NrX3RpY2soKTsKIAl0b3VjaF9zb2Z0bG9ja3VwX3dhdGNoZG9nKCk7CiB9CmRpZmYgLS1naXQgYS9rZXJuZWwvc2NoZWRfY3B1cHJpLmMgYi9rZXJuZWwvc2NoZWRfY3B1cHJpLmMKaW5kZXggMDE4YjdiZS4uMWUwMGJmYSAxMDA2NDQKLS0tIGEva2VybmVsL3NjaGVkX2NwdXByaS5jCisrKyBiL2tlcm5lbC9zY2hlZF9jcHVwcmkuYwpAQCAtMTUxLDcgKzE1MSw3IEBACiAgKgogICogUmV0dXJuczogLUVOT01FTSBpZiBtZW1vcnkgZmFpbHMuCiAgKi8KLWludCBjcHVwcmlfaW5pdChzdHJ1Y3QgY3B1cHJpICpjcCwgYm9vbCBib290bWVtKQoraW50IF9faW5pdF9yZWZvayBjcHVwcmlfaW5pdChzdHJ1Y3QgY3B1cHJpICpjcCwgYm9vbCBib290bWVtKQogewogCWludCBpOwogCmRpZmYgLS1naXQgYS9rZXJuZWwvc2NoZWRfZmFpci5jIGIva2VybmVsL3NjaGVkX2ZhaXIuYwppbmRleCA1NmMwZWZlLi44ZTEzNTJjIDEwMDY0NAotLS0gYS9rZXJuZWwvc2NoZWRfZmFpci5jCisrKyBiL2tlcm5lbC9zY2hlZF9mYWlyLmMKQEAgLTM4NiwyMCArMzg2LDYgQEAKICNlbmRpZgogCiAvKgotICogZGVsdGEgKj0gUFt3IC8gcnddCi0gKi8KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZwotY2FsY19kZWx0YV93ZWlnaHQodW5zaWduZWQgbG9uZyBkZWx0YSwgc3RydWN0IHNjaGVkX2VudGl0eSAqc2UpCi17Ci0JZm9yX2VhY2hfc2NoZWRfZW50aXR5KHNlKSB7Ci0JCWRlbHRhID0gY2FsY19kZWx0YV9taW5lKGRlbHRhLAotCQkJCXNlLT5sb2FkLndlaWdodCwgJmNmc19ycV9vZihzZSktPmxvYWQpOwotCX0KLQotCXJldHVybiBkZWx0YTsKLX0KLQotLyoKICAqIGRlbHRhIC89IHcKICAqLwogc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nCkBAIC00NDAsMTIgKzQyNiwyMCBAQAogICovCiBzdGF0aWMgdTY0IHNjaGVkX3NsaWNlKHN0cnVjdCBjZnNfcnEgKmNmc19ycSwgc3RydWN0IHNjaGVkX2VudGl0eSAqc2UpCiB7Ci0JdW5zaWduZWQgbG9uZyBucl9ydW5uaW5nID0gY2ZzX3JxLT5ucl9ydW5uaW5nOworCXU2NCBzbGljZSA9IF9fc2NoZWRfcGVyaW9kKGNmc19ycS0+bnJfcnVubmluZyArICFzZS0+b25fcnEpOwogCi0JaWYgKHVubGlrZWx5KCFzZS0+b25fcnEpKQotCQlucl9ydW5uaW5nKys7CisJZm9yX2VhY2hfc2NoZWRfZW50aXR5KHNlKSB7CisJCXN0cnVjdCBsb2FkX3dlaWdodCAqbG9hZCA9ICZjZnNfcnEtPmxvYWQ7CiAKLQlyZXR1cm4gY2FsY19kZWx0YV93ZWlnaHQoX19zY2hlZF9wZXJpb2QobnJfcnVubmluZyksIHNlKTsKKwkJaWYgKHVubGlrZWx5KCFzZS0+b25fcnEpKSB7CisJCQlzdHJ1Y3QgbG9hZF93ZWlnaHQgbHcgPSBjZnNfcnEtPmxvYWQ7CisKKwkJCXVwZGF0ZV9sb2FkX2FkZCgmbHcsIHNlLT5sb2FkLndlaWdodCk7CisJCQlsb2FkID0gJmx3OworCQl9CisJCXNsaWNlID0gY2FsY19kZWx0YV9taW5lKHNsaWNlLCBzZS0+bG9hZC53ZWlnaHQsIGxvYWQpOworCX0KKwlyZXR1cm4gc2xpY2U7CiB9CiAKIC8qCkBAIC0xNjIzLDggKzE2MTcsNiBAQAogCX0KIH0KIAotI2RlZmluZSBzd2FwKGEsIGIpIGRvIHsgdHlwZW9mKGEpIHRtcCA9IChhKTsgKGEpID0gKGIpOyAoYikgPSB0bXA7IH0gd2hpbGUgKDApCi0KIC8qCiAgKiBTaGFyZSB0aGUgZmFpcm5lc3MgcnVudGltZSBiZXR3ZWVuIHBhcmVudCBhbmQgY2hpbGQsIHRodXMgdGhlCiAgKiB0b3RhbCBhbW91bnQgb2YgcHJlc3N1cmUgZm9yIENQVSBzdGF5cyBlcXVhbCAtIG5ldyB0YXNrcwpkaWZmIC0tZ2l0IGEva2VybmVsL3NpZ25hbC5jIGIva2VybmVsL3NpZ25hbC5jCmluZGV4IDhlOTU4NTUuLjMxNTJhYzMgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zaWduYWwuYworKysgYi9rZXJuZWwvc2lnbmFsLmMKQEAgLTg1OCw3ICs4NTgsOCBAQAogCQkJcS0+aW5mby5zaV9zaWdubyA9IHNpZzsKIAkJCXEtPmluZm8uc2lfZXJybm8gPSAwOwogCQkJcS0+aW5mby5zaV9jb2RlID0gU0lfVVNFUjsKLQkJCXEtPmluZm8uc2lfcGlkID0gdGFza19waWRfdm5yKGN1cnJlbnQpOworCQkJcS0+aW5mby5zaV9waWQgPSB0YXNrX3RnaWRfbnJfbnMoY3VycmVudCwKKwkJCQkJCQl0YXNrX2FjdGl2ZV9waWRfbnModCkpOwogCQkJcS0+aW5mby5zaV91aWQgPSBjdXJyZW50X3VpZCgpOwogCQkJYnJlYWs7CiAJCWNhc2UgKHVuc2lnbmVkIGxvbmcpIFNFTkRfU0lHX1BSSVY6CmRpZmYgLS1naXQgYS9rZXJuZWwvc3RvcF9tYWNoaW5lLmMgYi9rZXJuZWwvc3RvcF9tYWNoaW5lLmMKaW5kZXggMjg2YzQxNy4uMGNkNDE1ZSAxMDA2NDQKLS0tIGEva2VybmVsL3N0b3BfbWFjaGluZS5jCisrKyBiL2tlcm5lbC9zdG9wX21hY2hpbmUuYwpAQCAtMzgsNyArMzgsMTAgQEAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgbnVtX3RocmVhZHM7CiBzdGF0aWMgYXRvbWljX3QgdGhyZWFkX2FjazsKIHN0YXRpYyBERUZJTkVfTVVURVgobG9jayk7Ci0KKy8qIHNldHVwX2xvY2sgcHJvdGVjdHMgcmVmY291bnQsIHN0b3BfbWFjaGluZV93cSBhbmQgc3RvcF9tYWNoaW5lX3dvcmsuICovCitzdGF0aWMgREVGSU5FX01VVEVYKHNldHVwX2xvY2spOworLyogVXNlcnMgb2Ygc3RvcF9tYWNoaW5lLiAqLworc3RhdGljIGludCByZWZjb3VudDsKIHN0YXRpYyBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqc3RvcF9tYWNoaW5lX3dxOwogc3RhdGljIHN0cnVjdCBzdG9wX21hY2hpbmVfZGF0YSBhY3RpdmUsIGlkbGU7CiBzdGF0aWMgY29uc3QgY3B1bWFza190ICphY3RpdmVfY3B1czsKQEAgLTEwOSw2ICsxMTIsNDMgQEAKIAlyZXR1cm4gMDsKIH0KIAoraW50IHN0b3BfbWFjaGluZV9jcmVhdGUodm9pZCkKK3sKKwltdXRleF9sb2NrKCZzZXR1cF9sb2NrKTsKKwlpZiAocmVmY291bnQpCisJCWdvdG8gZG9uZTsKKwlzdG9wX21hY2hpbmVfd3EgPSBjcmVhdGVfcnRfd29ya3F1ZXVlKCJrc3RvcCIpOworCWlmICghc3RvcF9tYWNoaW5lX3dxKQorCQlnb3RvIGVycl9vdXQ7CisJc3RvcF9tYWNoaW5lX3dvcmsgPSBhbGxvY19wZXJjcHUoc3RydWN0IHdvcmtfc3RydWN0KTsKKwlpZiAoIXN0b3BfbWFjaGluZV93b3JrKQorCQlnb3RvIGVycl9vdXQ7Citkb25lOgorCXJlZmNvdW50Kys7CisJbXV0ZXhfdW5sb2NrKCZzZXR1cF9sb2NrKTsKKwlyZXR1cm4gMDsKKworZXJyX291dDoKKwlpZiAoc3RvcF9tYWNoaW5lX3dxKQorCQlkZXN0cm95X3dvcmtxdWV1ZShzdG9wX21hY2hpbmVfd3EpOworCW11dGV4X3VubG9jaygmc2V0dXBfbG9jayk7CisJcmV0dXJuIC1FTk9NRU07Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzdG9wX21hY2hpbmVfY3JlYXRlKTsKKwordm9pZCBzdG9wX21hY2hpbmVfZGVzdHJveSh2b2lkKQoreworCW11dGV4X2xvY2soJnNldHVwX2xvY2spOworCXJlZmNvdW50LS07CisJaWYgKHJlZmNvdW50KQorCQlnb3RvIGRvbmU7CisJZGVzdHJveV93b3JrcXVldWUoc3RvcF9tYWNoaW5lX3dxKTsKKwlmcmVlX3BlcmNwdShzdG9wX21hY2hpbmVfd29yayk7Citkb25lOgorCW11dGV4X3VubG9jaygmc2V0dXBfbG9jayk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzdG9wX21hY2hpbmVfZGVzdHJveSk7CisKIGludCBfX3N0b3BfbWFjaGluZShpbnQgKCpmbikodm9pZCAqKSwgdm9pZCAqZGF0YSwgY29uc3Qgc3RydWN0IGNwdW1hc2sgKmNwdXMpCiB7CiAJc3RydWN0IHdvcmtfc3RydWN0ICpzbV93b3JrOwpAQCAtMTQ2LDE5ICsxODYsMTQgQEAKIHsKIAlpbnQgcmV0OwogCisJcmV0ID0gc3RvcF9tYWNoaW5lX2NyZWF0ZSgpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CiAJLyogTm8gQ1BVcyBjYW4gY29tZSB1cCBvciBkb3duIGR1cmluZyB0aGlzLiAqLwogCWdldF9vbmxpbmVfY3B1cygpOwogCXJldCA9IF9fc3RvcF9tYWNoaW5lKGZuLCBkYXRhLCBjcHVzKTsKIAlwdXRfb25saW5lX2NwdXMoKTsKLQorCXN0b3BfbWFjaGluZV9kZXN0cm95KCk7CiAJcmV0dXJuIHJldDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHN0b3BfbWFjaGluZSk7Ci0KLXN0YXRpYyBpbnQgX19pbml0IHN0b3BfbWFjaGluZV9pbml0KHZvaWQpCi17Ci0Jc3RvcF9tYWNoaW5lX3dxID0gY3JlYXRlX3J0X3dvcmtxdWV1ZSgia3N0b3AiKTsKLQlzdG9wX21hY2hpbmVfd29yayA9IGFsbG9jX3BlcmNwdShzdHJ1Y3Qgd29ya19zdHJ1Y3QpOwotCXJldHVybiAwOwotfQotY29yZV9pbml0Y2FsbChzdG9wX21hY2hpbmVfaW5pdCk7CmRpZmYgLS1naXQgYS9rZXJuZWwvc3lzLmMgYi9rZXJuZWwvc3lzLmMKaW5kZXggZDM1NmQ3OS4uNzYzYzNjMSAxMDA2NDQKLS0tIGEva2VybmVsL3N5cy5jCisrKyBiL2tlcm5lbC9zeXMuYwpAQCAtMzMsNiArMzMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3Rhc2tfaW9fYWNjb3VudGluZ19vcHMuaD4KICNpbmNsdWRlIDxsaW51eC9zZWNjb21wLmg+CiAjaW5jbHVkZSA8bGludXgvY3B1Lmg+CisjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CiAKICNpbmNsdWRlIDxsaW51eC9jb21wYXQuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNjYWxscy5oPgpAQCAtOTI3LDYgKzkyOCw3IEBACiAJCWlmIChjb3B5X3RvX3VzZXIodGJ1ZiwgJnRtcCwgc2l6ZW9mKHN0cnVjdCB0bXMpKSkKIAkJCXJldHVybiAtRUZBVUxUOwogCX0KKwlmb3JjZV9zdWNjZXNzZnVsX3N5c2NhbGxfcmV0dXJuKCk7CiAJcmV0dXJuIChsb25nKSBqaWZmaWVzXzY0X3RvX2Nsb2NrX3QoZ2V0X2ppZmZpZXNfNjQoKSk7CiB9CiAKQEAgLTE2MjcsNiArMTYyOSw4IEBACiAJdXRpbWUgPSBzdGltZSA9IGNwdXRpbWVfemVybzsKIAogCWlmICh3aG8gPT0gUlVTQUdFX1RIUkVBRCkgeworCQl1dGltZSA9IHRhc2tfdXRpbWUoY3VycmVudCk7CisJCXN0aW1lID0gdGFza19zdGltZShjdXJyZW50KTsKIAkJYWNjdW11bGF0ZV90aHJlYWRfcnVzYWdlKHAsIHIpOwogCQlnb3RvIG91dDsKIAl9CmRpZmYgLS1naXQgYS9rZXJuZWwvc3lzY3RsLmMgYi9rZXJuZWwvc3lzY3RsLmMKaW5kZXggZmY2ZDQ1Yy4uOTJmNmU1YiAxMDA2NDQKLS0tIGEva2VybmVsL3N5c2N0bC5jCisrKyBiL2tlcm5lbC9zeXNjdGwuYwpAQCAtODcsMTAgKzg3LDYgQEAKICNlbmRpZiAvKiAjaWZkZWYgQ09ORklHX1JDVV9UT1JUVVJFX1RFU1QgKi8KIAogLyogQ29uc3RhbnRzIHVzZWQgZm9yIG1pbmltdW0gYW5kICBtYXhpbXVtICovCi0jaWYgZGVmaW5lZChDT05GSUdfSElHSE1FTSkgfHwgZGVmaW5lZChDT05GSUdfREVURUNUX1NPRlRMT0NLVVApCi1zdGF0aWMgaW50IG9uZSA9IDE7Ci0jZW5kaWYKLQogI2lmZGVmIENPTkZJR19ERVRFQ1RfU09GVExPQ0tVUAogc3RhdGljIGludCBzaXh0eSA9IDYwOwogc3RhdGljIGludCBuZWdfb25lID0gLTE7CkBAIC0xMDEsNiArOTcsNyBAQAogI2VuZGlmCiAKIHN0YXRpYyBpbnQgemVybzsKK3N0YXRpYyBpbnQgb25lID0gMTsKIHN0YXRpYyBpbnQgb25lX2h1bmRyZWQgPSAxMDA7CiAKIC8qIHRoaXMgaXMgbmVlZGVkIGZvciB0aGUgcHJvY19kb2ludHZlY19taW5tYXggZm9yIFtmc19db3ZlcmZsb3cgVUlEIGFuZCBHSUQgKi8KQEAgLTk1MiwxMiArOTQ5LDIyIEBACiAJCS5kYXRhCQk9ICZkaXJ0eV9iYWNrZ3JvdW5kX3JhdGlvLAogCQkubWF4bGVuCQk9IHNpemVvZihkaXJ0eV9iYWNrZ3JvdW5kX3JhdGlvKSwKIAkJLm1vZGUJCT0gMDY0NCwKLQkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjX21pbm1heCwKKwkJLnByb2NfaGFuZGxlcgk9ICZkaXJ0eV9iYWNrZ3JvdW5kX3JhdGlvX2hhbmRsZXIsCiAJCS5zdHJhdGVneQk9ICZzeXNjdGxfaW50dmVjLAogCQkuZXh0cmExCQk9ICZ6ZXJvLAogCQkuZXh0cmEyCQk9ICZvbmVfaHVuZHJlZCwKIAl9LAogCXsKKwkJLmN0bF9uYW1lCT0gQ1RMX1VOTlVNQkVSRUQsCisJCS5wcm9jbmFtZQk9ICJkaXJ0eV9iYWNrZ3JvdW5kX2J5dGVzIiwKKwkJLmRhdGEJCT0gJmRpcnR5X2JhY2tncm91bmRfYnl0ZXMsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKGRpcnR5X2JhY2tncm91bmRfYnl0ZXMpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJmRpcnR5X2JhY2tncm91bmRfYnl0ZXNfaGFuZGxlciwKKwkJLnN0cmF0ZWd5CT0gJnN5c2N0bF9pbnR2ZWMsCisJCS5leHRyYTEJCT0gJm9uZSwKKwl9LAorCXsKIAkJLmN0bF9uYW1lCT0gVk1fRElSVFlfUkFUSU8sCiAJCS5wcm9jbmFtZQk9ICJkaXJ0eV9yYXRpbyIsCiAJCS5kYXRhCQk9ICZ2bV9kaXJ0eV9yYXRpbywKQEAgLTk2OSw2ICs5NzYsMTYgQEAKIAkJLmV4dHJhMgkJPSAmb25lX2h1bmRyZWQsCiAJfSwKIAl7CisJCS5jdGxfbmFtZQk9IENUTF9VTk5VTUJFUkVELAorCQkucHJvY25hbWUJPSAiZGlydHlfYnl0ZXMiLAorCQkuZGF0YQkJPSAmdm1fZGlydHlfYnl0ZXMsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKHZtX2RpcnR5X2J5dGVzKSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZkaXJ0eV9ieXRlc19oYW5kbGVyLAorCQkuc3RyYXRlZ3kJPSAmc3lzY3RsX2ludHZlYywKKwkJLmV4dHJhMQkJPSAmb25lLAorCX0sCisJewogCQkucHJvY25hbWUJPSAiZGlydHlfd3JpdGViYWNrX2NlbnRpc2VjcyIsCiAJCS5kYXRhCQk9ICZkaXJ0eV93cml0ZWJhY2tfaW50ZXJ2YWwsCiAJCS5tYXhsZW4JCT0gc2l6ZW9mKGRpcnR5X3dyaXRlYmFja19pbnRlcnZhbCksCmRpZmYgLS1naXQgYS9rZXJuZWwvdGVzdF9rcHJvYmVzLmMgYi9rZXJuZWwvdGVzdF9rcHJvYmVzLmMKaW5kZXggMDZiNjM5NS4uNGYxMDQ1MSAxMDA2NDQKLS0tIGEva2VybmVsL3Rlc3Rfa3Byb2Jlcy5jCisrKyBiL2tlcm5lbC90ZXN0X2twcm9iZXMuYwpAQCAtMjIsMjEgKzIyLDExIEBACiAKIHN0YXRpYyB1MzIgcmFuZDEsIHByZWhfdmFsLCBwb3N0aF92YWwsIGpwaF92YWw7CiBzdGF0aWMgaW50IGVycm9ycywgaGFuZGxlcl9lcnJvcnMsIG51bV90ZXN0czsKK3N0YXRpYyB1MzIgKCp0YXJnZXQpKHUzMiB2YWx1ZSk7CitzdGF0aWMgdTMyICgqdGFyZ2V0MikodTMyIHZhbHVlKTsKIAogc3RhdGljIG5vaW5saW5lIHUzMiBrcHJvYmVfdGFyZ2V0KHUzMiB2YWx1ZSkKIHsKLQkvKgotCSAqIGdjYyBpZ25vcmVzIG5vaW5saW5lIG9uIHNvbWUgYXJjaGl0ZWN0dXJlcyB1bmxlc3Mgd2Ugc3R1ZmYKLQkgKiBzdWZmaWNpZW50IGxhcmQgaW50byB0aGUgZnVuY3Rpb24uIFRoZSBnZXRfa3Byb2JlKCkgaGVyZSBpcwotCSAqIGp1c3QgZm9yIHRoYXQuCi0JICoKLQkgKiBOT1RFOiBXZSBhcmVuJ3QgY29uY2VybmVkIGFib3V0IHRoZSBjb3JyZWN0bmVzcyBvZiBnZXRfa3Byb2JlKCkKLQkgKiBoZXJlOyBoZW5jZSwgdGhpcyBjYWxsIGlzIG5laXRoZXIgdW5kZXIgIXByZWVtcHQgbm9yIHdpdGggdGhlCi0JICoga3Byb2JlX211dGV4IGhlbGQuIFRoaXMgaXMgZmluZSh0bSkKLQkgKi8KLQlpZiAoZ2V0X2twcm9iZSgodm9pZCAqKTB4ZGVhZGJlZWYpKQotCQlwcmludGsoS0VSTl9JTkZPICJLcHJvYmUgc21va2UgdGVzdDogcHJvYmUgb24gMHhkZWFkYmVlZiFcbiIpOwotCiAJcmV0dXJuICh2YWx1ZSAvIGRpdl9mYWN0b3IpOwogfQogCkBAIC03NCw3ICs2NCw3IEBACiAJCXJldHVybiByZXQ7CiAJfQogCi0JcmV0ID0ga3Byb2JlX3RhcmdldChyYW5kMSk7CisJcmV0ID0gdGFyZ2V0KHJhbmQxKTsKIAl1bnJlZ2lzdGVyX2twcm9iZSgma3ApOwogCiAJaWYgKHByZWhfdmFsID09IDApIHsKQEAgLTkyLDYgKzgyLDg0IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBub2lubGluZSB1MzIga3Byb2JlX3RhcmdldDIodTMyIHZhbHVlKQoreworCXJldHVybiAodmFsdWUgLyBkaXZfZmFjdG9yKSArIDE7Cit9CisKK3N0YXRpYyBpbnQga3BfcHJlX2hhbmRsZXIyKHN0cnVjdCBrcHJvYmUgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXByZWhfdmFsID0gKHJhbmQxIC8gZGl2X2ZhY3RvcikgKyAxOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBrcF9wb3N0X2hhbmRsZXIyKHN0cnVjdCBrcHJvYmUgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzLAorCQl1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCWlmIChwcmVoX3ZhbCAhPSAocmFuZDEgLyBkaXZfZmFjdG9yKSArIDEpIHsKKwkJaGFuZGxlcl9lcnJvcnMrKzsKKwkJcHJpbnRrKEtFUk5fRVJSICJLcHJvYmUgc21va2UgdGVzdCBmYWlsZWQ6ICIKKwkJCQkiaW5jb3JyZWN0IHZhbHVlIGluIHBvc3RfaGFuZGxlcjJcbiIpOworCX0KKwlwb3N0aF92YWwgPSBwcmVoX3ZhbCArIGRpdl9mYWN0b3I7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qga3Byb2JlIGtwMiA9IHsKKwkuc3ltYm9sX25hbWUgPSAia3Byb2JlX3RhcmdldDIiLAorCS5wcmVfaGFuZGxlciA9IGtwX3ByZV9oYW5kbGVyMiwKKwkucG9zdF9oYW5kbGVyID0ga3BfcG9zdF9oYW5kbGVyMgorfTsKKworc3RhdGljIGludCB0ZXN0X2twcm9iZXModm9pZCkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBrcHJvYmUgKmtwc1syXSA9IHsma3AsICZrcDJ9OworCisJa3AuYWRkciA9IDA7IC8qIGFkZHIgc2hvdWxkIGJlIGNsZWFyZCBmb3IgcmV1c2luZyBrcHJvYmUuICovCisJcmV0ID0gcmVnaXN0ZXJfa3Byb2JlcyhrcHMsIDIpOworCWlmIChyZXQgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiS3Byb2JlIHNtb2tlIHRlc3QgZmFpbGVkOiAiCisJCQkJInJlZ2lzdGVyX2twcm9iZXMgcmV0dXJuZWQgJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcHJlaF92YWwgPSAwOworCXBvc3RoX3ZhbCA9IDA7CisJcmV0ID0gdGFyZ2V0KHJhbmQxKTsKKworCWlmIChwcmVoX3ZhbCA9PSAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiS3Byb2JlIHNtb2tlIHRlc3QgZmFpbGVkOiAiCisJCQkJImtwcm9iZSBwcmVfaGFuZGxlciBub3QgY2FsbGVkXG4iKTsKKwkJaGFuZGxlcl9lcnJvcnMrKzsKKwl9CisKKwlpZiAocG9zdGhfdmFsID09IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJLcHJvYmUgc21va2UgdGVzdCBmYWlsZWQ6ICIKKwkJCQkia3Byb2JlIHBvc3RfaGFuZGxlciBub3QgY2FsbGVkXG4iKTsKKwkJaGFuZGxlcl9lcnJvcnMrKzsKKwl9CisKKwlwcmVoX3ZhbCA9IDA7CisJcG9zdGhfdmFsID0gMDsKKwlyZXQgPSB0YXJnZXQyKHJhbmQxKTsKKworCWlmIChwcmVoX3ZhbCA9PSAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiS3Byb2JlIHNtb2tlIHRlc3QgZmFpbGVkOiAiCisJCQkJImtwcm9iZSBwcmVfaGFuZGxlcjIgbm90IGNhbGxlZFxuIik7CisJCWhhbmRsZXJfZXJyb3JzKys7CisJfQorCisJaWYgKHBvc3RoX3ZhbCA9PSAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiS3Byb2JlIHNtb2tlIHRlc3QgZmFpbGVkOiAiCisJCQkJImtwcm9iZSBwb3N0X2hhbmRsZXIyIG5vdCBjYWxsZWRcbiIpOworCQloYW5kbGVyX2Vycm9ycysrOworCX0KKworCXVucmVnaXN0ZXJfa3Byb2JlcyhrcHMsIDIpOworCXJldHVybiAwOworCit9CisKIHN0YXRpYyB1MzIgal9rcHJvYmVfdGFyZ2V0KHUzMiB2YWx1ZSkKIHsKIAlpZiAodmFsdWUgIT0gcmFuZDEpIHsKQEAgLTEyMSw3ICsxODksNyBAQAogCQlyZXR1cm4gcmV0OwogCX0KIAotCXJldCA9IGtwcm9iZV90YXJnZXQocmFuZDEpOworCXJldCA9IHRhcmdldChyYW5kMSk7CiAJdW5yZWdpc3Rlcl9qcHJvYmUoJmpwKTsKIAlpZiAoanBoX3ZhbCA9PSAwKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiS3Byb2JlIHNtb2tlIHRlc3QgZmFpbGVkOiAiCkBAIC0xMzIsNiArMjAwLDQzIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBzdHJ1Y3QganByb2JlIGpwMiA9IHsKKwkuZW50cnkgICAgICAgICAgPSBqX2twcm9iZV90YXJnZXQsCisJLmtwLnN5bWJvbF9uYW1lID0gImtwcm9iZV90YXJnZXQyIgorfTsKKworc3RhdGljIGludCB0ZXN0X2pwcm9iZXModm9pZCkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBqcHJvYmUgKmpwc1syXSA9IHsmanAsICZqcDJ9OworCisJanAua3AuYWRkciA9IDA7IC8qIGFkZHIgc2hvdWxkIGJlIGNsZWFyZCBmb3IgcmV1c2luZyBrcHJvYmUuICovCisJcmV0ID0gcmVnaXN0ZXJfanByb2JlcyhqcHMsIDIpOworCWlmIChyZXQgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiS3Byb2JlIHNtb2tlIHRlc3QgZmFpbGVkOiAiCisJCQkJInJlZ2lzdGVyX2pwcm9iZXMgcmV0dXJuZWQgJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJanBoX3ZhbCA9IDA7CisJcmV0ID0gdGFyZ2V0KHJhbmQxKTsKKwlpZiAoanBoX3ZhbCA9PSAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiS3Byb2JlIHNtb2tlIHRlc3QgZmFpbGVkOiAiCisJCQkJImpwcm9iZSBoYW5kbGVyIG5vdCBjYWxsZWRcbiIpOworCQloYW5kbGVyX2Vycm9ycysrOworCX0KKworCWpwaF92YWwgPSAwOworCXJldCA9IHRhcmdldDIocmFuZDEpOworCWlmIChqcGhfdmFsID09IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJLcHJvYmUgc21va2UgdGVzdCBmYWlsZWQ6ICIKKwkJCQkianByb2JlIGhhbmRsZXIyIG5vdCBjYWxsZWRcbiIpOworCQloYW5kbGVyX2Vycm9ycysrOworCX0KKwl1bnJlZ2lzdGVyX2pwcm9iZXMoanBzLCAyKTsKKworCXJldHVybiAwOworfQogI2lmZGVmIENPTkZJR19LUkVUUFJPQkVTCiBzdGF0aWMgdTMyIGtycGhfdmFsOwogCkBAIC0xNzcsNyArMjgyLDcgQEAKIAkJcmV0dXJuIHJldDsKIAl9CiAKLQlyZXQgPSBrcHJvYmVfdGFyZ2V0KHJhbmQxKTsKKwlyZXQgPSB0YXJnZXQocmFuZDEpOwogCXVucmVnaXN0ZXJfa3JldHByb2JlKCZycCk7CiAJaWYgKGtycGhfdmFsICE9IHJhbmQxKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiS3Byb2JlIHNtb2tlIHRlc3QgZmFpbGVkOiAiCkBAIC0xODcsMTIgKzI5Miw3MiBAQAogCiAJcmV0dXJuIDA7CiB9CisKK3N0YXRpYyBpbnQgcmV0dXJuX2hhbmRsZXIyKHN0cnVjdCBrcmV0cHJvYmVfaW5zdGFuY2UgKnJpLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwl1bnNpZ25lZCBsb25nIHJldCA9IHJlZ3NfcmV0dXJuX3ZhbHVlKHJlZ3MpOworCisJaWYgKHJldCAhPSAocmFuZDEgLyBkaXZfZmFjdG9yKSArIDEpIHsKKwkJaGFuZGxlcl9lcnJvcnMrKzsKKwkJcHJpbnRrKEtFUk5fRVJSICJLcHJvYmUgc21va2UgdGVzdCBmYWlsZWQ6ICIKKwkJCQkiaW5jb3JyZWN0IHZhbHVlIGluIGtyZXRwcm9iZSBoYW5kbGVyMlxuIik7CisJfQorCWlmIChrcnBoX3ZhbCA9PSAwKSB7CisJCWhhbmRsZXJfZXJyb3JzKys7CisJCXByaW50ayhLRVJOX0VSUiAiS3Byb2JlIHNtb2tlIHRlc3QgZmFpbGVkOiAiCisJCQkJImNhbGwgdG8ga3JldHByb2JlIGVudHJ5IGhhbmRsZXIgZmFpbGVkXG4iKTsKKwl9CisKKwlrcnBoX3ZhbCA9IHJhbmQxOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGtyZXRwcm9iZSBycDIgPSB7CisJLmhhbmRsZXIJPSByZXR1cm5faGFuZGxlcjIsCisJLmVudHJ5X2hhbmRsZXIgID0gZW50cnlfaGFuZGxlciwKKwkua3Auc3ltYm9sX25hbWUgPSAia3Byb2JlX3RhcmdldDIiCit9OworCitzdGF0aWMgaW50IHRlc3Rfa3JldHByb2Jlcyh2b2lkKQoreworCWludCByZXQ7CisJc3RydWN0IGtyZXRwcm9iZSAqcnBzWzJdID0geyZycCwgJnJwMn07CisKKwlycC5rcC5hZGRyID0gMDsgLyogYWRkciBzaG91bGQgYmUgY2xlYXJkIGZvciByZXVzaW5nIGtwcm9iZS4gKi8KKwlyZXQgPSByZWdpc3Rlcl9rcmV0cHJvYmVzKHJwcywgMik7CisJaWYgKHJldCA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJLcHJvYmUgc21va2UgdGVzdCBmYWlsZWQ6ICIKKwkJCQkicmVnaXN0ZXJfa3JldHByb2JlIHJldHVybmVkICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCWtycGhfdmFsID0gMDsKKwlyZXQgPSB0YXJnZXQocmFuZDEpOworCWlmIChrcnBoX3ZhbCAhPSByYW5kMSkgeworCQlwcmludGsoS0VSTl9FUlIgIktwcm9iZSBzbW9rZSB0ZXN0IGZhaWxlZDogIgorCQkJCSJrcmV0cHJvYmUgaGFuZGxlciBub3QgY2FsbGVkXG4iKTsKKwkJaGFuZGxlcl9lcnJvcnMrKzsKKwl9CisKKwlrcnBoX3ZhbCA9IDA7CisJcmV0ID0gdGFyZ2V0MihyYW5kMSk7CisJaWYgKGtycGhfdmFsICE9IHJhbmQxKSB7CisJCXByaW50ayhLRVJOX0VSUiAiS3Byb2JlIHNtb2tlIHRlc3QgZmFpbGVkOiAiCisJCQkJImtyZXRwcm9iZSBoYW5kbGVyMiBub3QgY2FsbGVkXG4iKTsKKwkJaGFuZGxlcl9lcnJvcnMrKzsKKwl9CisJdW5yZWdpc3Rlcl9rcmV0cHJvYmVzKHJwcywgMik7CisJcmV0dXJuIDA7Cit9CiAjZW5kaWYgLyogQ09ORklHX0tSRVRQUk9CRVMgKi8KIAogaW50IGluaXRfdGVzdF9wcm9iZXModm9pZCkKIHsKIAlpbnQgcmV0OwogCisJdGFyZ2V0ID0ga3Byb2JlX3RhcmdldDsKKwl0YXJnZXQyID0ga3Byb2JlX3RhcmdldDI7CisKIAlkbyB7CiAJCXJhbmQxID0gcmFuZG9tMzIoKTsKIAl9IHdoaWxlIChyYW5kMSA8PSBkaXZfZmFjdG9yKTsKQEAgLTIwNCwxNSArMzY5LDMwIEBACiAJCWVycm9ycysrOwogCiAJbnVtX3Rlc3RzKys7CisJcmV0ID0gdGVzdF9rcHJvYmVzKCk7CisJaWYgKHJldCA8IDApCisJCWVycm9ycysrOworCisJbnVtX3Rlc3RzKys7CiAJcmV0ID0gdGVzdF9qcHJvYmUoKTsKIAlpZiAocmV0IDwgMCkKIAkJZXJyb3JzKys7CiAKKwludW1fdGVzdHMrKzsKKwlyZXQgPSB0ZXN0X2pwcm9iZXMoKTsKKwlpZiAocmV0IDwgMCkKKwkJZXJyb3JzKys7CisKICNpZmRlZiBDT05GSUdfS1JFVFBST0JFUwogCW51bV90ZXN0cysrOwogCXJldCA9IHRlc3Rfa3JldHByb2JlKCk7CiAJaWYgKHJldCA8IDApCiAJCWVycm9ycysrOworCisJbnVtX3Rlc3RzKys7CisJcmV0ID0gdGVzdF9rcmV0cHJvYmVzKCk7CisJaWYgKHJldCA8IDApCisJCWVycm9ycysrOwogI2VuZGlmIC8qIENPTkZJR19LUkVUUFJPQkVTICovCiAKIAlpZiAoZXJyb3JzKQpkaWZmIC0tZ2l0IGEva2VybmVsL3RpbWUuYyBiL2tlcm5lbC90aW1lLmMKaW5kZXggZDYzYTQzMy4uNDg4NmUzYyAxMDA2NDQKLS0tIGEva2VybmVsL3RpbWUuYworKysgYi9rZXJuZWwvdGltZS5jCkBAIC0zNyw2ICszNyw3IEBACiAjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvbWF0aDY0Lmg+CisjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CiAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS91bmlzdGQuaD4KQEAgLTY1LDggKzY2LDkgQEAKIAogCWlmICh0bG9jKSB7CiAJCWlmIChwdXRfdXNlcihpLHRsb2MpKQotCQkJaSA9IC1FRkFVTFQ7CisJCQlyZXR1cm4gLUVGQVVMVDsKIAl9CisJZm9yY2Vfc3VjY2Vzc2Z1bF9zeXNjYWxsX3JldHVybigpOwogCXJldHVybiBpOwogfQogCmRpZmYgLS1naXQgYS9rZXJuZWwvdGltZS9qaWZmaWVzLmMgYi9rZXJuZWwvdGltZS9qaWZmaWVzLmMKaW5kZXggMWNhOTk1NS4uMDZmMTk3NSAxMDA2NDQKLS0tIGEva2VybmVsL3RpbWUvamlmZmllcy5jCisrKyBiL2tlcm5lbC90aW1lL2ppZmZpZXMuYwpAQCAtNDUsNyArNDUsNyBAQAogICoKICAqIFRoZSB2YWx1ZSA4IGlzIHNvbWV3aGF0IGNhcmVmdWxseSBjaG9zZW4sIGFzIGFueXRoaW5nCiAgKiBsYXJnZXIgY2FuIHJlc3VsdCBpbiBvdmVyZmxvd3MuIE5TRUNfUEVSX0pJRkZZIGdyb3dzIGFzCi0gKiBIWiBzaHJpbmtzLCBzbyB2YWx1ZXMgZ3JlYXRlciB0aGVuIDggb3ZlcmZsb3cgMzJiaXRzIHdoZW4KKyAqIEhaIHNocmlua3MsIHNvIHZhbHVlcyBncmVhdGVyIHRoYW4gOCBvdmVyZmxvdyAzMmJpdHMgd2hlbgogICogSFo9MTAwLgogICovCiAjZGVmaW5lIEpJRkZJRVNfU0hJRlQJOApkaWZmIC0tZ2l0IGEva2VybmVsL3RpbWUvdGltZWtlZXBpbmcuYyBiL2tlcm5lbC90aW1lL3RpbWVrZWVwaW5nLmMKaW5kZXggZmEwNWU4OC4uOTAwZjFiNiAxMDA2NDQKLS0tIGEva2VybmVsL3RpbWUvdGltZWtlZXBpbmcuYworKysgYi9rZXJuZWwvdGltZS90aW1la2VlcGluZy5jCkBAIC00Niw2ICs0Niw5IEBACiBzdHJ1Y3QgdGltZXNwZWMgd2FsbF90b19tb25vdG9uaWMgX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQgKDE2KSkpOwogc3RhdGljIHVuc2lnbmVkIGxvbmcgdG90YWxfc2xlZXBfdGltZTsJCS8qIHNlY29uZHMgKi8KIAorLyogZmxhZyBmb3IgaWYgdGltZWtlZXBpbmcgaXMgc3VzcGVuZGVkICovCitpbnQgX19yZWFkX21vc3RseSB0aW1la2VlcGluZ19zdXNwZW5kZWQ7CisKIHN0YXRpYyBzdHJ1Y3QgdGltZXNwZWMgeHRpbWVfY2FjaGUgX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQgKDE2KSkpOwogdm9pZCB1cGRhdGVfeHRpbWVfY2FjaGUodTY0IG5zZWMpCiB7CkBAIC05Miw2ICs5NSw4IEBACiAJdW5zaWduZWQgbG9uZyBzZXE7CiAJczY0IG5zZWNzOwogCisJV0FSTl9PTih0aW1la2VlcGluZ19zdXNwZW5kZWQpOworCiAJZG8gewogCQlzZXEgPSByZWFkX3NlcWJlZ2luKCZ4dGltZV9sb2NrKTsKIApAQCAtMjk5LDggKzMwNCw2IEBACiAJd3JpdGVfc2VxdW5sb2NrX2lycXJlc3RvcmUoJnh0aW1lX2xvY2ssIGZsYWdzKTsKIH0KIAotLyogZmxhZyBmb3IgaWYgdGltZWtlZXBpbmcgaXMgc3VzcGVuZGVkICovCi1zdGF0aWMgaW50IHRpbWVrZWVwaW5nX3N1c3BlbmRlZDsKIC8qIHRpbWUgaW4gc2Vjb25kcyB3aGVuIHN1c3BlbmQgYmVnYW4gKi8KIHN0YXRpYyB1bnNpZ25lZCBsb25nIHRpbWVrZWVwaW5nX3N1c3BlbmRfdGltZTsKIApkaWZmIC0tZ2l0IGEva2VybmVsL3RzYWNjdC5jIGIva2VybmVsL3RzYWNjdC5jCmluZGV4IDJkYzA2YWIuLjQzZjg5MWIgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90c2FjY3QuYworKysgYi9rZXJuZWwvdHNhY2N0LmMKQEAgLTkyLDggKzkyLDggQEAKIAltbSA9IGdldF90YXNrX21tKHApOwogCWlmIChtbSkgewogCQkvKiBhZGp1c3QgdG8gS0IgdW5pdCAqLwotCQlzdGF0cy0+aGl3YXRlcl9yc3MgICA9IG1tLT5oaXdhdGVyX3JzcyAqIFBBR0VfU0laRSAvIEtCOwotCQlzdGF0cy0+aGl3YXRlcl92bSAgICA9IG1tLT5oaXdhdGVyX3ZtICogUEFHRV9TSVpFIC8gS0I7CisJCXN0YXRzLT5oaXdhdGVyX3JzcyAgID0gZ2V0X21tX2hpd2F0ZXJfcnNzKG1tKSAqIFBBR0VfU0laRSAvIEtCOworCQlzdGF0cy0+aGl3YXRlcl92bSAgICA9IGdldF9tbV9oaXdhdGVyX3ZtKG1tKSAgKiBQQUdFX1NJWkUgLyBLQjsKIAkJbW1wdXQobW0pOwogCX0KIAlzdGF0cy0+cmVhZF9jaGFyCT0gcC0+aW9hYy5yY2hhcjsKZGlmZiAtLWdpdCBhL2xpYi9idXN0X3NwaW5sb2Nrcy5jIGIvbGliL2J1c3Rfc3BpbmxvY2tzLmMKaW5kZXggNDg2ZGE2Mi4uOTY4MWQ1NCAxMDA2NDQKLS0tIGEvbGliL2J1c3Rfc3BpbmxvY2tzLmMKKysrIGIvbGliL2J1c3Rfc3BpbmxvY2tzLmMKQEAgLTEyLDYgKzEyLDcgQEAKICNpbmNsdWRlIDxsaW51eC90dHkuaD4KICNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CiAjaW5jbHVkZSA8bGludXgvdnRfa2Vybi5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbnNvbGUuaD4KIAogCiB2b2lkIF9fYXR0cmlidXRlX18oKHdlYWspKSBidXN0X3NwaW5sb2NrcyhpbnQgeWVzKQpAQCAtMjIsNiArMjMsNyBAQAogI2lmZGVmIENPTkZJR19WVAogCQl1bmJsYW5rX3NjcmVlbigpOwogI2VuZGlmCisJCWNvbnNvbGVfdW5ibGFuaygpOwogCQlpZiAoLS1vb3BzX2luX3Byb2dyZXNzID09IDApCiAJCQl3YWtlX3VwX2tsb2dkKCk7CiAJfQpkaWZmIC0tZ2l0IGEvbGliL2R5bmFtaWNfcHJpbnRrLmMgYi9saWIvZHluYW1pY19wcmludGsuYwppbmRleCA4ZTMwMjk1Li4xNjVhMTk3IDEwMDY0NAotLS0gYS9saWIvZHluYW1pY19wcmludGsuYworKysgYi9saWIvZHluYW1pY19wcmludGsuYwpAQCAtMjc3LDQwICsyNzcsMzQgQEAKIAkJCQlkeW5hbWljX2VuYWJsZWQgPSBEWU5BTUlDX0VOQUJMRURfTk9ORTsKIAkJCX0KIAkJCWVyciA9IDA7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoZWxlbSkgewotCQkJCWlmICh2YWx1ZSAmJiAoZWxlbS0+ZW5hYmxlID09IDApKSB7Ci0JCQkJCWR5bmFtaWNfcHJpbnRrX2VuYWJsZWQgfD0KLQkJCQkJCQkoMUxMIDw8IGVsZW0tPmhhc2gxKTsKLQkJCQkJZHluYW1pY19wcmludGtfZW5hYmxlZDIgfD0KLQkJCQkJCQkoMUxMIDw8IGVsZW0tPmhhc2gyKTsKLQkJCQkJZWxlbS0+ZW5hYmxlID0gMTsKLQkJCQkJbnVtX2VuYWJsZWQrKzsKLQkJCQkJZHluYW1pY19lbmFibGVkID0gRFlOQU1JQ19FTkFCTEVEX1NPTUU7Ci0JCQkJCWVyciA9IDA7Ci0JCQkJCXByaW50ayhLRVJOX0RFQlVHCi0JCQkJCSAgICAgICAiZGVidWdnaW5nIGVuYWJsZWQgZm9yIG1vZHVsZSAlc1xuIiwKLQkJCQkJICAgICAgIGVsZW0tPm5hbWUpOwotCQkJCX0gZWxzZSBpZiAoIXZhbHVlICYmIChlbGVtLT5lbmFibGUgPT0gMSkpIHsKLQkJCQkJZWxlbS0+ZW5hYmxlID0gMDsKLQkJCQkJbnVtX2VuYWJsZWQtLTsKLQkJCQkJaWYgKGRpc2FibGVkX2hhc2goZWxlbS0+aGFzaDEsIHRydWUpKQotCQkJCQkJZHluYW1pY19wcmludGtfZW5hYmxlZCAmPQorCQl9IGVsc2UgaWYgKGVsZW0pIHsKKwkJCWlmICh2YWx1ZSAmJiAoZWxlbS0+ZW5hYmxlID09IDApKSB7CisJCQkJZHluYW1pY19wcmludGtfZW5hYmxlZCB8PSAoMUxMIDw8IGVsZW0tPmhhc2gxKTsKKwkJCQlkeW5hbWljX3ByaW50a19lbmFibGVkMiB8PSAoMUxMIDw8IGVsZW0tPmhhc2gyKTsKKwkJCQllbGVtLT5lbmFibGUgPSAxOworCQkJCW51bV9lbmFibGVkKys7CisJCQkJZHluYW1pY19lbmFibGVkID0gRFlOQU1JQ19FTkFCTEVEX1NPTUU7CisJCQkJZXJyID0gMDsKKwkJCQlwcmludGsoS0VSTl9ERUJVRworCQkJCQkiZGVidWdnaW5nIGVuYWJsZWQgZm9yIG1vZHVsZSAlc1xuIiwKKwkJCQkJZWxlbS0+bmFtZSk7CisJCQl9IGVsc2UgaWYgKCF2YWx1ZSAmJiAoZWxlbS0+ZW5hYmxlID09IDEpKSB7CisJCQkJZWxlbS0+ZW5hYmxlID0gMDsKKwkJCQludW1fZW5hYmxlZC0tOworCQkJCWlmIChkaXNhYmxlZF9oYXNoKGVsZW0tPmhhc2gxLCB0cnVlKSkKKwkJCQkJZHluYW1pY19wcmludGtfZW5hYmxlZCAmPQogCQkJCQkJCX4oMUxMIDw8IGVsZW0tPmhhc2gxKTsKLQkJCQkJaWYgKGRpc2FibGVkX2hhc2goZWxlbS0+aGFzaDIsIGZhbHNlKSkKLQkJCQkJCWR5bmFtaWNfcHJpbnRrX2VuYWJsZWQyICY9CisJCQkJaWYgKGRpc2FibGVkX2hhc2goZWxlbS0+aGFzaDIsIGZhbHNlKSkKKwkJCQkJZHluYW1pY19wcmludGtfZW5hYmxlZDIgJj0KIAkJCQkJCQl+KDFMTCA8PCBlbGVtLT5oYXNoMik7Ci0JCQkJCWlmIChudW1fZW5hYmxlZCkKLQkJCQkJCWR5bmFtaWNfZW5hYmxlZCA9Ci0JCQkJCQkJRFlOQU1JQ19FTkFCTEVEX1NPTUU7Ci0JCQkJCWVsc2UKLQkJCQkJCWR5bmFtaWNfZW5hYmxlZCA9Ci0JCQkJCQkJRFlOQU1JQ19FTkFCTEVEX05PTkU7Ci0JCQkJCWVyciA9IDA7Ci0JCQkJCXByaW50ayhLRVJOX0RFQlVHCi0JCQkJCSAgICAgICAiZGVidWdnaW5nIGRpc2FibGVkIGZvciBtb2R1bGUgIgotCQkJCQkgICAgICAgIiVzXG4iLCBlbGVtLT5uYW1lKTsKLQkJCQl9CisJCQkJaWYgKG51bV9lbmFibGVkKQorCQkJCQlkeW5hbWljX2VuYWJsZWQgPSBEWU5BTUlDX0VOQUJMRURfU09NRTsKKwkJCQllbHNlCisJCQkJCWR5bmFtaWNfZW5hYmxlZCA9IERZTkFNSUNfRU5BQkxFRF9OT05FOworCQkJCWVyciA9IDA7CisJCQkJcHJpbnRrKEtFUk5fREVCVUcKKwkJCQkJImRlYnVnZ2luZyBkaXNhYmxlZCBmb3IgbW9kdWxlICVzXG4iLAorCQkJCQllbGVtLT5uYW1lKTsKIAkJCX0KIAkJfQogCX0KZGlmZiAtLWdpdCBhL2xpYi9mYXVsdC1pbmplY3QuYyBiL2xpYi9mYXVsdC1pbmplY3QuYwppbmRleCBhNTBhMzExLi5mOTdhZjU1YiAxMDA2NDQKLS0tIGEvbGliL2ZhdWx0LWluamVjdC5jCisrKyBiL2xpYi9mYXVsdC1pbmplY3QuYwpAQCAtNiw3ICs2LDYgQEAKICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L3Vud2luZC5oPgogI2luY2x1ZGUgPGxpbnV4L3N0YWNrdHJhY2UuaD4KICNpbmNsdWRlIDxsaW51eC9rYWxsc3ltcy5oPgogI2luY2x1ZGUgPGxpbnV4L2ZhdWx0LWluamVjdC5oPgpkaWZmIC0tZ2l0IGEvbGliL2tsaXN0LmMgYi9saWIva2xpc3QuYwppbmRleCBiYmRkMzAxLi41NzNkNjA2IDEwMDY0NAotLS0gYS9saWIva2xpc3QuYworKysgYi9saWIva2xpc3QuYwpAQCAtMzYsNiArMzYsNyBAQAogCiAjaW5jbHVkZSA8bGludXgva2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogCiAvKgogICogVXNlIHRoZSBsb3dlc3QgYml0IG9mIG5fa2xpc3QgdG8gbWFyayBkZWxldGVkIG5vZGVzIGFuZCBleGNsdWRlCkBAIC0xMDgsNyArMTA5LDYgQEAKIHN0YXRpYyB2b2lkIGtsaXN0X25vZGVfaW5pdChzdHJ1Y3Qga2xpc3QgKmssIHN0cnVjdCBrbGlzdF9ub2RlICpuKQogewogCUlOSVRfTElTVF9IRUFEKCZuLT5uX25vZGUpOwotCWluaXRfY29tcGxldGlvbigmbi0+bl9yZW1vdmVkKTsKIAlrcmVmX2luaXQoJm4tPm5fcmVmKTsKIAlrbm9kZV9zZXRfa2xpc3Qobiwgayk7CiAJaWYgKGstPmdldCkKQEAgLTE3MSwxMyArMTcxLDM0IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChrbGlzdF9hZGRfYmVmb3JlKTsKIAorc3RydWN0IGtsaXN0X3dhaXRlciB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXN0cnVjdCBrbGlzdF9ub2RlICpub2RlOworCXN0cnVjdCB0YXNrX3N0cnVjdCAqcHJvY2VzczsKKwlpbnQgd29rZW47Cit9OworCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGtsaXN0X3JlbW92ZV9sb2NrKTsKK3N0YXRpYyBMSVNUX0hFQUQoa2xpc3RfcmVtb3ZlX3dhaXRlcnMpOworCiBzdGF0aWMgdm9pZCBrbGlzdF9yZWxlYXNlKHN0cnVjdCBrcmVmICprcmVmKQogeworCXN0cnVjdCBrbGlzdF93YWl0ZXIgKndhaXRlciwgKnRtcDsKIAlzdHJ1Y3Qga2xpc3Rfbm9kZSAqbiA9IGNvbnRhaW5lcl9vZihrcmVmLCBzdHJ1Y3Qga2xpc3Rfbm9kZSwgbl9yZWYpOwogCiAJV0FSTl9PTigha25vZGVfZGVhZChuKSk7CiAJbGlzdF9kZWwoJm4tPm5fbm9kZSk7Ci0JY29tcGxldGUoJm4tPm5fcmVtb3ZlZCk7CisJc3Bpbl9sb2NrKCZrbGlzdF9yZW1vdmVfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHdhaXRlciwgdG1wLCAma2xpc3RfcmVtb3ZlX3dhaXRlcnMsIGxpc3QpIHsKKwkJaWYgKHdhaXRlci0+bm9kZSAhPSBuKQorCQkJY29udGludWU7CisKKwkJd2FpdGVyLT53b2tlbiA9IDE7CisJCW1iKCk7CisJCXdha2VfdXBfcHJvY2Vzcyh3YWl0ZXItPnByb2Nlc3MpOworCQlsaXN0X2RlbCgmd2FpdGVyLT5saXN0KTsKKwl9CisJc3Bpbl91bmxvY2soJmtsaXN0X3JlbW92ZV9sb2NrKTsKIAlrbm9kZV9zZXRfa2xpc3QobiwgTlVMTCk7CiB9CiAKQEAgLTIxNyw4ICsyMzgsMjQgQEAKICAqLwogdm9pZCBrbGlzdF9yZW1vdmUoc3RydWN0IGtsaXN0X25vZGUgKm4pCiB7CisJc3RydWN0IGtsaXN0X3dhaXRlciB3YWl0ZXI7CisKKwl3YWl0ZXIubm9kZSA9IG47CisJd2FpdGVyLnByb2Nlc3MgPSBjdXJyZW50OworCXdhaXRlci53b2tlbiA9IDA7CisJc3Bpbl9sb2NrKCZrbGlzdF9yZW1vdmVfbG9jayk7CisJbGlzdF9hZGQoJndhaXRlci5saXN0LCAma2xpc3RfcmVtb3ZlX3dhaXRlcnMpOworCXNwaW5fdW5sb2NrKCZrbGlzdF9yZW1vdmVfbG9jayk7CisKIAlrbGlzdF9kZWwobik7Ci0Jd2FpdF9mb3JfY29tcGxldGlvbigmbi0+bl9yZW1vdmVkKTsKKworCWZvciAoOzspIHsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworCQlpZiAod2FpdGVyLndva2VuKQorCQkJYnJlYWs7CisJCXNjaGVkdWxlKCk7CisJfQorCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGtsaXN0X3JlbW92ZSk7CiAKZGlmZiAtLWdpdCBhL2xpYi9rb2JqZWN0X3VldmVudC5jIGIvbGliL2tvYmplY3RfdWV2ZW50LmMKaW5kZXggM2Y5MTQ3Mi4uMzE4MzI4ZCAxMDA2NDQKLS0tIGEvbGliL2tvYmplY3RfdWV2ZW50LmMKKysrIGIvbGliL2tvYmplY3RfdWV2ZW50LmMKQEAgLTE2NSw3ICsxNjUsNyBAQAogCS8qIGtleXMgcGFzc2VkIGluIGZyb20gdGhlIGNhbGxlciAqLwogCWlmIChlbnZwX2V4dCkgewogCQlmb3IgKGkgPSAwOyBlbnZwX2V4dFtpXTsgaSsrKSB7Ci0JCQlyZXR2YWwgPSBhZGRfdWV2ZW50X3ZhcihlbnYsIGVudnBfZXh0W2ldKTsKKwkJCXJldHZhbCA9IGFkZF91ZXZlbnRfdmFyKGVudiwgIiVzIiwgZW52cF9leHRbaV0pOwogCQkJaWYgKHJldHZhbCkKIAkJCQlnb3RvIGV4aXQ7CiAJCX0KQEAgLTIyNSw4ICsyMjUsMTAgQEAKIAkJCX0KIAogCQkJTkVUTElOS19DQihza2IpLmRzdF9ncm91cCA9IDE7Ci0JCQluZXRsaW5rX2Jyb2FkY2FzdCh1ZXZlbnRfc29jaywgc2tiLCAwLCAxLCBHRlBfS0VSTkVMKTsKLQkJfQorCQkJcmV0dmFsID0gbmV0bGlua19icm9hZGNhc3QodWV2ZW50X3NvY2ssIHNrYiwgMCwgMSwKKwkJCQkJCSAgIEdGUF9LRVJORUwpOworCQl9IGVsc2UKKwkJCXJldHZhbCA9IC1FTk9NRU07CiAJfQogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2xpYi9wZXJjcHVfY291bnRlci5jIGIvbGliL3BlcmNwdV9jb3VudGVyLmMKaW5kZXggYjI1NWI5My4uYWVhYTZkNyAxMDA2NDQKLS0tIGEvbGliL3BlcmNwdV9jb3VudGVyLmMKKysrIGIvbGliL3BlcmNwdV9jb3VudGVyLmMKQEAgLTksMTAgKzksOCBAQAogI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCi0jaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCiBzdGF0aWMgTElTVF9IRUFEKHBlcmNwdV9jb3VudGVycyk7CiBzdGF0aWMgREVGSU5FX01VVEVYKHBlcmNwdV9jb3VudGVyc19sb2NrKTsKLSNlbmRpZgogCiB2b2lkIHBlcmNwdV9jb3VudGVyX3NldChzdHJ1Y3QgcGVyY3B1X2NvdW50ZXIgKmZiYywgczY0IGFtb3VudCkKIHsKQEAgLTY4LDExICs2NiwxMSBAQAogfQogRVhQT1JUX1NZTUJPTChfX3BlcmNwdV9jb3VudGVyX3N1bSk7CiAKLXN0YXRpYyBzdHJ1Y3QgbG9ja19jbGFzc19rZXkgcGVyY3B1X2NvdW50ZXJfaXJxc2FmZTsKLQotaW50IHBlcmNwdV9jb3VudGVyX2luaXQoc3RydWN0IHBlcmNwdV9jb3VudGVyICpmYmMsIHM2NCBhbW91bnQpCitpbnQgX19wZXJjcHVfY291bnRlcl9pbml0KHN0cnVjdCBwZXJjcHVfY291bnRlciAqZmJjLCBzNjQgYW1vdW50LAorCQkJICBzdHJ1Y3QgbG9ja19jbGFzc19rZXkgKmtleSkKIHsKIAlzcGluX2xvY2tfaW5pdCgmZmJjLT5sb2NrKTsKKwlsb2NrZGVwX3NldF9jbGFzcygmZmJjLT5sb2NrLCBrZXkpOwogCWZiYy0+Y291bnQgPSBhbW91bnQ7CiAJZmJjLT5jb3VudGVycyA9IGFsbG9jX3BlcmNwdShzMzIpOwogCWlmICghZmJjLT5jb3VudGVycykKQEAgLTg0LDE3ICs4Miw3IEBACiAjZW5kaWYKIAlyZXR1cm4gMDsKIH0KLUVYUE9SVF9TWU1CT0wocGVyY3B1X2NvdW50ZXJfaW5pdCk7Ci0KLWludCBwZXJjcHVfY291bnRlcl9pbml0X2lycShzdHJ1Y3QgcGVyY3B1X2NvdW50ZXIgKmZiYywgczY0IGFtb3VudCkKLXsKLQlpbnQgZXJyOwotCi0JZXJyID0gcGVyY3B1X2NvdW50ZXJfaW5pdChmYmMsIGFtb3VudCk7Ci0JaWYgKCFlcnIpCi0JCWxvY2tkZXBfc2V0X2NsYXNzKCZmYmMtPmxvY2ssICZwZXJjcHVfY291bnRlcl9pcnFzYWZlKTsKLQlyZXR1cm4gZXJyOwotfQorRVhQT1JUX1NZTUJPTChfX3BlcmNwdV9jb3VudGVyX2luaXQpOwogCiB2b2lkIHBlcmNwdV9jb3VudGVyX2Rlc3Ryb3koc3RydWN0IHBlcmNwdV9jb3VudGVyICpmYmMpCiB7CkBAIC0xMTEsMTMgKzk5LDI0IEBACiB9CiBFWFBPUlRfU1lNQk9MKHBlcmNwdV9jb3VudGVyX2Rlc3Ryb3kpOwogCi0jaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCitpbnQgcGVyY3B1X2NvdW50ZXJfYmF0Y2ggX19yZWFkX21vc3RseSA9IDMyOworRVhQT1JUX1NZTUJPTChwZXJjcHVfY291bnRlcl9iYXRjaCk7CisKK3N0YXRpYyB2b2lkIGNvbXB1dGVfYmF0Y2hfdmFsdWUodm9pZCkKK3sKKwlpbnQgbnIgPSBudW1fb25saW5lX2NwdXMoKTsKKworCXBlcmNwdV9jb3VudGVyX2JhdGNoID0gbWF4KDMyLCBucioyKTsKK30KKwogc3RhdGljIGludCBfX2NwdWluaXQgcGVyY3B1X2NvdW50ZXJfaG90Y3B1X2NhbGxiYWNrKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIsCiAJCQkJCXVuc2lnbmVkIGxvbmcgYWN0aW9uLCB2b2lkICpoY3B1KQogeworI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQogCXVuc2lnbmVkIGludCBjcHU7CiAJc3RydWN0IHBlcmNwdV9jb3VudGVyICpmYmM7CiAKKwljb21wdXRlX2JhdGNoX3ZhbHVlKCk7CiAJaWYgKGFjdGlvbiAhPSBDUFVfREVBRCkKIAkJcmV0dXJuIE5PVElGWV9PSzsKIApAQCAtMTM0LDEzICsxMzMsMTQgQEAKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZmJjLT5sb2NrLCBmbGFncyk7CiAJfQogCW11dGV4X3VubG9jaygmcGVyY3B1X2NvdW50ZXJzX2xvY2spOworI2VuZGlmCiAJcmV0dXJuIE5PVElGWV9PSzsKIH0KIAogc3RhdGljIGludCBfX2luaXQgcGVyY3B1X2NvdW50ZXJfc3RhcnR1cCh2b2lkKQogeworCWNvbXB1dGVfYmF0Y2hfdmFsdWUoKTsKIAlob3RjcHVfbm90aWZpZXIocGVyY3B1X2NvdW50ZXJfaG90Y3B1X2NhbGxiYWNrLCAwKTsKIAlyZXR1cm4gMDsKIH0KIG1vZHVsZV9pbml0KHBlcmNwdV9jb3VudGVyX3N0YXJ0dXApOwotI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvcHJpb19oZWFwLmMgYi9saWIvcHJpb19oZWFwLmMKaW5kZXggNDcxOTQ0YS4uYTdhZjZmOCAxMDA2NDQKLS0tIGEvbGliL3ByaW9faGVhcC5jCisrKyBiL2xpYi9wcmlvX2hlYXAuYwpAQCAtMzEsNyArMzEsNyBAQAogCiAJaWYgKGhlYXAtPnNpemUgPCBoZWFwLT5tYXgpIHsKIAkJLyogSGVhcCBpbnNlcnRpb24gKi8KLQkJaW50IHBvcyA9IGhlYXAtPnNpemUrKzsKKwkJcG9zID0gaGVhcC0+c2l6ZSsrOwogCQl3aGlsZSAocG9zID4gMCAmJiBoZWFwLT5ndChwLCBwdHJzWyhwb3MtMSkvMl0pKSB7CiAJCQlwdHJzW3Bvc10gPSBwdHJzWyhwb3MtMSkvMl07CiAJCQlwb3MgPSAocG9zLTEpLzI7CmRpZmYgLS1naXQgYS9saWIvcHJvcG9ydGlvbnMuYyBiL2xpYi9wcm9wb3J0aW9ucy5jCmluZGV4IDRmMzg3YTYuLmQ1MDc0NmEgMTAwNjQ0Ci0tLSBhL2xpYi9wcm9wb3J0aW9ucy5jCisrKyBiL2xpYi9wcm9wb3J0aW9ucy5jCkBAIC04MywxMSArODMsMTEgQEAKIAlwZC0+aW5kZXggPSAwOwogCXBkLT5wZ1swXS5zaGlmdCA9IHNoaWZ0OwogCW11dGV4X2luaXQoJnBkLT5tdXRleCk7Ci0JZXJyID0gcGVyY3B1X2NvdW50ZXJfaW5pdF9pcnEoJnBkLT5wZ1swXS5ldmVudHMsIDApOworCWVyciA9IHBlcmNwdV9jb3VudGVyX2luaXQoJnBkLT5wZ1swXS5ldmVudHMsIDApOwogCWlmIChlcnIpCiAJCWdvdG8gb3V0OwogCi0JZXJyID0gcGVyY3B1X2NvdW50ZXJfaW5pdF9pcnEoJnBkLT5wZ1sxXS5ldmVudHMsIDApOworCWVyciA9IHBlcmNwdV9jb3VudGVyX2luaXQoJnBkLT5wZ1sxXS5ldmVudHMsIDApOwogCWlmIChlcnIpCiAJCXBlcmNwdV9jb3VudGVyX2Rlc3Ryb3koJnBkLT5wZ1swXS5ldmVudHMpOwogCkBAIC0xNDcsNiArMTQ3LDcgQEAKICAqIHRoaXMgaXMgdXNlZCB0byB0cmFjayB0aGUgYWN0aXZlIHJlZmVyZW5jZXMuCiAgKi8KIHN0YXRpYyBzdHJ1Y3QgcHJvcF9nbG9iYWwgKnByb3BfZ2V0X2dsb2JhbChzdHJ1Y3QgcHJvcF9kZXNjcmlwdG9yICpwZCkKK19fYWNxdWlyZXMoUkNVKQogewogCWludCBpbmRleDsKIApAQCAtMTYwLDYgKzE2MSw3IEBACiB9CiAKIHN0YXRpYyB2b2lkIHByb3BfcHV0X2dsb2JhbChzdHJ1Y3QgcHJvcF9kZXNjcmlwdG9yICpwZCwgc3RydWN0IHByb3BfZ2xvYmFsICpwZykKK19fcmVsZWFzZXMoUkNVKQogewogCXJjdV9yZWFkX3VubG9jaygpOwogfQpAQCAtMTkxLDcgKzE5Myw3IEBACiAJc3Bpbl9sb2NrX2luaXQoJnBsLT5sb2NrKTsKIAlwbC0+c2hpZnQgPSAwOwogCXBsLT5wZXJpb2QgPSAwOwotCXJldHVybiBwZXJjcHVfY291bnRlcl9pbml0X2lycSgmcGwtPmV2ZW50cywgMCk7CisJcmV0dXJuIHBlcmNwdV9jb3VudGVyX2luaXQoJnBsLT5ldmVudHMsIDApOwogfQogCiB2b2lkIHByb3BfbG9jYWxfZGVzdHJveV9wZXJjcHUoc3RydWN0IHByb3BfbG9jYWxfcGVyY3B1ICpwbCkKZGlmZiAtLWdpdCBhL2xpYi9yYWRpeC10cmVlLmMgYi9saWIvcmFkaXgtdHJlZS5jCmluZGV4IGJlODZiMzIuLjRiYjQyYTAgMTAwNjQ0Ci0tLSBhL2xpYi9yYWRpeC10cmVlLmMKKysrIGIvbGliL3JhZGl4LXRyZWUuYwpAQCAtODEsNyArODEsNyBAQAogCWludCBucjsKIAlzdHJ1Y3QgcmFkaXhfdHJlZV9ub2RlICpub2Rlc1tSQURJWF9UUkVFX01BWF9QQVRIXTsKIH07Ci1ERUZJTkVfUEVSX0NQVShzdHJ1Y3QgcmFkaXhfdHJlZV9wcmVsb2FkLCByYWRpeF90cmVlX3ByZWxvYWRzKSA9IHsgMCwgfTsKK3N0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgcmFkaXhfdHJlZV9wcmVsb2FkLCByYWRpeF90cmVlX3ByZWxvYWRzKSA9IHsgMCwgfTsKIAogc3RhdGljIGlubGluZSBnZnBfdCByb290X2dmcF9tYXNrKHN0cnVjdCByYWRpeF90cmVlX3Jvb3QgKnJvb3QpCiB7CkBAIC02NDAsMTMgKzY0MCwxNCBAQAogICoKICAqCVJldHVybnM6IHRoZSBpbmRleCBvZiB0aGUgaG9sZSBpZiBmb3VuZCwgb3RoZXJ3aXNlIHJldHVybnMgYW4gaW5kZXgKICAqCW91dHNpZGUgb2YgdGhlIHNldCBzcGVjaWZpZWQgKGluIHdoaWNoIGNhc2UgJ3JldHVybiAtIGluZGV4ID49IG1heF9zY2FuJwotICoJd2lsbCBiZSB0cnVlKS4KKyAqCXdpbGwgYmUgdHJ1ZSkuIEluIHJhcmUgY2FzZXMgb2YgaW5kZXggd3JhcC1hcm91bmQsIDAgd2lsbCBiZSByZXR1cm5lZC4KICAqCiAgKglyYWRpeF90cmVlX25leHRfaG9sZSBtYXkgYmUgY2FsbGVkIHVuZGVyIHJjdV9yZWFkX2xvY2suIEhvd2V2ZXIsIGxpa2UKLSAqCXJhZGl4X3RyZWVfZ2FuZ19sb29rdXAsIHRoaXMgd2lsbCBub3QgYXRvbWljYWxseSBzZWFyY2ggYSBzbmFwc2hvdCBvZiB0aGUKLSAqCXRyZWUgYXQgYSBzaW5nbGUgcG9pbnQgaW4gdGltZS4gRm9yIGV4YW1wbGUsIGlmIGEgaG9sZSBpcyBjcmVhdGVkIGF0IGluZGV4Ci0gKgk1LCB0aGVuIHN1YnNlcXVlbnRseSBhIGhvbGUgaXMgY3JlYXRlZCBhdCBpbmRleCAxMCwgcmFkaXhfdHJlZV9uZXh0X2hvbGUKLSAqCWNvdmVyaW5nIGJvdGggaW5kZXhlcyBtYXkgcmV0dXJuIDEwIGlmIGNhbGxlZCB1bmRlciByY3VfcmVhZF9sb2NrLgorICoJcmFkaXhfdHJlZV9nYW5nX2xvb2t1cCwgdGhpcyB3aWxsIG5vdCBhdG9taWNhbGx5IHNlYXJjaCBhIHNuYXBzaG90IG9mCisgKgl0aGUgdHJlZSBhdCBhIHNpbmdsZSBwb2ludCBpbiB0aW1lLiBGb3IgZXhhbXBsZSwgaWYgYSBob2xlIGlzIGNyZWF0ZWQKKyAqCWF0IGluZGV4IDUsIHRoZW4gc3Vic2VxdWVudGx5IGEgaG9sZSBpcyBjcmVhdGVkIGF0IGluZGV4IDEwLAorICoJcmFkaXhfdHJlZV9uZXh0X2hvbGUgY292ZXJpbmcgYm90aCBpbmRleGVzIG1heSByZXR1cm4gMTAgaWYgY2FsbGVkCisgKgl1bmRlciByY3VfcmVhZF9sb2NrLgogICovCiB1bnNpZ25lZCBsb25nIHJhZGl4X3RyZWVfbmV4dF9ob2xlKHN0cnVjdCByYWRpeF90cmVlX3Jvb3QgKnJvb3QsCiAJCQkJdW5zaWduZWQgbG9uZyBpbmRleCwgdW5zaWduZWQgbG9uZyBtYXhfc2NhbikKZGlmZiAtLWdpdCBhL2xpYi9zb3J0LmMgYi9saWIvc29ydC5jCmluZGV4IDZhYmJhZjMuLjkyNmQwMDQgMTAwNjQ0Ci0tLSBhL2xpYi9zb3J0LmMKKysrIGIvbGliL3NvcnQuYwpAQCAtMzIsMTEgKzMyLDExIEBACiAgKiBAYmFzZTogcG9pbnRlciB0byBkYXRhIHRvIHNvcnQKICAqIEBudW06IG51bWJlciBvZiBlbGVtZW50cwogICogQHNpemU6IHNpemUgb2YgZWFjaCBlbGVtZW50Ci0gKiBAY21wOiBwb2ludGVyIHRvIGNvbXBhcmlzb24gZnVuY3Rpb24KLSAqIEBzd2FwOiBwb2ludGVyIHRvIHN3YXAgZnVuY3Rpb24gb3IgTlVMTAorICogQGNtcF9mdW5jOiBwb2ludGVyIHRvIGNvbXBhcmlzb24gZnVuY3Rpb24KKyAqIEBzd2FwX2Z1bmM6IHBvaW50ZXIgdG8gc3dhcCBmdW5jdGlvbiBvciBOVUxMCiAgKgogICogVGhpcyBmdW5jdGlvbiBkb2VzIGEgaGVhcHNvcnQgb24gdGhlIGdpdmVuIGFycmF5LiBZb3UgbWF5IHByb3ZpZGUgYQotICogc3dhcCBmdW5jdGlvbiBvcHRpbWl6ZWQgdG8geW91ciBlbGVtZW50IHR5cGUuCisgKiBzd2FwX2Z1bmMgZnVuY3Rpb24gb3B0aW1pemVkIHRvIHlvdXIgZWxlbWVudCB0eXBlLgogICoKICAqIFNvcnRpbmcgdGltZSBpcyBPKG4gbG9nIG4pIGJvdGggb24gYXZlcmFnZSBhbmQgd29yc3QtY2FzZS4gV2hpbGUKICAqIHFzb3J0IGlzIGFib3V0IDIwJSBmYXN0ZXIgb24gYXZlcmFnZSwgaXQgc3VmZmVycyBmcm9tIGV4cGxvaXRhYmxlCkBAIC00NSwzNyArNDUsMzkgQEAKICAqLwogCiB2b2lkIHNvcnQodm9pZCAqYmFzZSwgc2l6ZV90IG51bSwgc2l6ZV90IHNpemUsCi0JICBpbnQgKCpjbXApKGNvbnN0IHZvaWQgKiwgY29uc3Qgdm9pZCAqKSwKLQkgIHZvaWQgKCpzd2FwKSh2b2lkICosIHZvaWQgKiwgaW50IHNpemUpKQorCSAgaW50ICgqY21wX2Z1bmMpKGNvbnN0IHZvaWQgKiwgY29uc3Qgdm9pZCAqKSwKKwkgIHZvaWQgKCpzd2FwX2Z1bmMpKHZvaWQgKiwgdm9pZCAqLCBpbnQgc2l6ZSkpCiB7CiAJLyogcHJlLXNjYWxlIGNvdW50ZXJzIGZvciBwZXJmb3JtYW5jZSAqLwogCWludCBpID0gKG51bS8yIC0gMSkgKiBzaXplLCBuID0gbnVtICogc2l6ZSwgYywgcjsKIAotCWlmICghc3dhcCkKLQkJc3dhcCA9IChzaXplID09IDQgPyB1MzJfc3dhcCA6IGdlbmVyaWNfc3dhcCk7CisJaWYgKCFzd2FwX2Z1bmMpCisJCXN3YXBfZnVuYyA9IChzaXplID09IDQgPyB1MzJfc3dhcCA6IGdlbmVyaWNfc3dhcCk7CiAKIAkvKiBoZWFwaWZ5ICovCiAJZm9yICggOyBpID49IDA7IGkgLT0gc2l6ZSkgewogCQlmb3IgKHIgPSBpOyByICogMiArIHNpemUgPCBuOyByICA9IGMpIHsKIAkJCWMgPSByICogMiArIHNpemU7Ci0JCQlpZiAoYyA8IG4gLSBzaXplICYmIGNtcChiYXNlICsgYywgYmFzZSArIGMgKyBzaXplKSA8IDApCisJCQlpZiAoYyA8IG4gLSBzaXplICYmCisJCQkJCWNtcF9mdW5jKGJhc2UgKyBjLCBiYXNlICsgYyArIHNpemUpIDwgMCkKIAkJCQljICs9IHNpemU7Ci0JCQlpZiAoY21wKGJhc2UgKyByLCBiYXNlICsgYykgPj0gMCkKKwkJCWlmIChjbXBfZnVuYyhiYXNlICsgciwgYmFzZSArIGMpID49IDApCiAJCQkJYnJlYWs7Ci0JCQlzd2FwKGJhc2UgKyByLCBiYXNlICsgYywgc2l6ZSk7CisJCQlzd2FwX2Z1bmMoYmFzZSArIHIsIGJhc2UgKyBjLCBzaXplKTsKIAkJfQogCX0KIAogCS8qIHNvcnQgKi8KIAlmb3IgKGkgPSBuIC0gc2l6ZTsgaSA+IDA7IGkgLT0gc2l6ZSkgewotCQlzd2FwKGJhc2UsIGJhc2UgKyBpLCBzaXplKTsKKwkJc3dhcF9mdW5jKGJhc2UsIGJhc2UgKyBpLCBzaXplKTsKIAkJZm9yIChyID0gMDsgciAqIDIgKyBzaXplIDwgaTsgciA9IGMpIHsKIAkJCWMgPSByICogMiArIHNpemU7Ci0JCQlpZiAoYyA8IGkgLSBzaXplICYmIGNtcChiYXNlICsgYywgYmFzZSArIGMgKyBzaXplKSA8IDApCisJCQlpZiAoYyA8IGkgLSBzaXplICYmCisJCQkJCWNtcF9mdW5jKGJhc2UgKyBjLCBiYXNlICsgYyArIHNpemUpIDwgMCkKIAkJCQljICs9IHNpemU7Ci0JCQlpZiAoY21wKGJhc2UgKyByLCBiYXNlICsgYykgPj0gMCkKKwkJCWlmIChjbXBfZnVuYyhiYXNlICsgciwgYmFzZSArIGMpID49IDApCiAJCQkJYnJlYWs7Ci0JCQlzd2FwKGJhc2UgKyByLCBiYXNlICsgYywgc2l6ZSk7CisJCQlzd2FwX2Z1bmMoYmFzZSArIHIsIGJhc2UgKyBjLCBzaXplKTsKIAkJfQogCX0KIH0KZGlmZiAtLWdpdCBhL2xpYi9zd2lvdGxiLmMgYi9saWIvc3dpb3RsYi5jCmluZGV4IGZhMmRjNGUuLjFmOTkxYWMgMTAwNjQ0Ci0tLSBhL2xpYi9zd2lvdGxiLmMKKysrIGIvbGliL3N3aW90bGIuYwpAQCAtMTQsNiArMTQsNyBAQAogICogMDQvMDcvLi4gYWsJCUJldHRlciBvdmVyZmxvdyBoYW5kbGluZy4gQXNzb3J0ZWQgZml4ZXMuCiAgKiAwNS8wOS8xMCBsaW52aWxsZQlBZGQgc3VwcG9ydCBmb3Igc3luY2luZyByYW5nZXMsIHN1cHBvcnQgc3luY2luZyBmb3IKICAqCQkJRE1BX0JJRElSRUNUSU9OQUwgbWFwcGluZ3MsIG1pc2NlbGxhbmVvdXMgY2xlYW51cC4KKyAqIDA4LzEyLzExIGJlY2t5YglBZGQgaGlnaG1lbSBzdXBwb3J0CiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2NhY2hlLmg+CkBAIC0yMSw5ICsyMiw5IEBACiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgotI2luY2x1ZGUgPGxpbnV4L3N3aW90bGIuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9zd2lvdGxiLmg+CisjaW5jbHVkZSA8bGludXgvcGZuLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgogI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KQEAgLTg5LDEwICs5MCw3IEBACiAgKiBXZSBuZWVkIHRvIHNhdmUgYXdheSB0aGUgb3JpZ2luYWwgYWRkcmVzcyBjb3JyZXNwb25kaW5nIHRvIGEgbWFwcGVkIGVudHJ5CiAgKiBmb3IgdGhlIHN5bmMgb3BlcmF0aW9ucy4KICAqLwotc3RhdGljIHN0cnVjdCBzd2lvdGxiX3BoeXNfYWRkciB7Ci0Jc3RydWN0IHBhZ2UgKnBhZ2U7Ci0JdW5zaWduZWQgaW50IG9mZnNldDsKLX0gKmlvX3RsYl9vcmlnX2FkZHI7CitzdGF0aWMgcGh5c19hZGRyX3QgKmlvX3RsYl9vcmlnX2FkZHI7CiAKIC8qCiAgKiBQcm90ZWN0IHRoZSBhYm92ZSBkYXRhIHN0cnVjdHVyZXMgaW4gdGhlIG1hcCBhbmQgdW5tYXAgY2FsbHMKQEAgLTExNiw3ICsxMTQsNyBAQAogX19zZXR1cCgic3dpb3RsYj0iLCBzZXR1cF9pb190bGJfbnBhZ2VzKTsKIC8qIG1ha2UgaW9fdGxiX292ZXJmbG93IHR1bmFibGUgdG9vPyAqLwogCi12b2lkICogX193ZWFrIHN3aW90bGJfYWxsb2NfYm9vdChzaXplX3Qgc2l6ZSwgdW5zaWduZWQgbG9uZyBuc2xhYnMpCit2b2lkICogX193ZWFrIF9faW5pdCBzd2lvdGxiX2FsbG9jX2Jvb3Qoc2l6ZV90IHNpemUsIHVuc2lnbmVkIGxvbmcgbnNsYWJzKQogewogCXJldHVybiBhbGxvY19ib290bWVtX2xvd19wYWdlcyhzaXplKTsKIH0KQEAgLTEyNiw3ICsxMjQsNyBAQAogCXJldHVybiAodm9pZCAqKV9fZ2V0X2ZyZWVfcGFnZXMoR0ZQX0RNQSB8IF9fR0ZQX05PV0FSTiwgb3JkZXIpOwogfQogCi1kbWFfYWRkcl90IF9fd2VhayBzd2lvdGxiX3BoeXNfdG9fYnVzKHBoeXNfYWRkcl90IHBhZGRyKQorZG1hX2FkZHJfdCBfX3dlYWsgc3dpb3RsYl9waHlzX3RvX2J1cyhzdHJ1Y3QgZGV2aWNlICpod2RldiwgcGh5c19hZGRyX3QgcGFkZHIpCiB7CiAJcmV0dXJuIHBhZGRyOwogfQpAQCAtMTM2LDkgKzEzNCwxMCBAQAogCXJldHVybiBiYWRkcjsKIH0KIAotc3RhdGljIGRtYV9hZGRyX3Qgc3dpb3RsYl92aXJ0X3RvX2J1cyh2b2xhdGlsZSB2b2lkICphZGRyZXNzKQorc3RhdGljIGRtYV9hZGRyX3Qgc3dpb3RsYl92aXJ0X3RvX2J1cyhzdHJ1Y3QgZGV2aWNlICpod2RldiwKKwkJCQkgICAgICB2b2xhdGlsZSB2b2lkICphZGRyZXNzKQogewotCXJldHVybiBzd2lvdGxiX3BoeXNfdG9fYnVzKHZpcnRfdG9fcGh5cyhhZGRyZXNzKSk7CisJcmV0dXJuIHN3aW90bGJfcGh5c190b19idXMoaHdkZXYsIHZpcnRfdG9fcGh5cyhhZGRyZXNzKSk7CiB9CiAKIHN0YXRpYyB2b2lkICpzd2lvdGxiX2J1c190b192aXJ0KGRtYV9hZGRyX3QgYWRkcmVzcykKQEAgLTE1MSwzNSArMTUwLDE4IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBkbWFfYWRkcl90IHN3aW90bGJfc2dfdG9fYnVzKHN0cnVjdCBzY2F0dGVybGlzdCAqc2cpCi17Ci0JcmV0dXJuIHN3aW90bGJfcGh5c190b19idXMocGFnZV90b19waHlzKHNnX3BhZ2Uoc2cpKSArIHNnLT5vZmZzZXQpOwotfQotCiBzdGF0aWMgdm9pZCBzd2lvdGxiX3ByaW50X2luZm8odW5zaWduZWQgbG9uZyBieXRlcykKIHsKIAlwaHlzX2FkZHJfdCBwc3RhcnQsIHBlbmQ7Ci0JZG1hX2FkZHJfdCBic3RhcnQsIGJlbmQ7CiAKIAlwc3RhcnQgPSB2aXJ0X3RvX3BoeXMoaW9fdGxiX3N0YXJ0KTsKIAlwZW5kID0gdmlydF90b19waHlzKGlvX3RsYl9lbmQpOwogCi0JYnN0YXJ0ID0gc3dpb3RsYl9waHlzX3RvX2J1cyhwc3RhcnQpOwotCWJlbmQgPSBzd2lvdGxiX3BoeXNfdG9fYnVzKHBlbmQpOwotCiAJcHJpbnRrKEtFUk5fSU5GTyAiUGxhY2luZyAlbHVNQiBzb2Z0d2FyZSBJTyBUTEIgYmV0d2VlbiAlcCAtICVwXG4iLAogCSAgICAgICBieXRlcyA+PiAyMCwgaW9fdGxiX3N0YXJ0LCBpb190bGJfZW5kKTsKLQlpZiAocHN0YXJ0ICE9IGJzdGFydCB8fCBwZW5kICE9IGJlbmQpCi0JCXByaW50ayhLRVJOX0lORk8gInNvZnR3YXJlIElPIFRMQiBhdCBwaHlzICUjbGx4IC0gJSNsbHgiCi0JCSAgICAgICAiIGJ1cyAlI2xseCAtICUjbGx4XG4iLAotCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylwc3RhcnQsCi0JCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKXBlbmQsCi0JCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWJzdGFydCwKLQkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpYmVuZCk7Ci0JZWxzZQotCQlwcmludGsoS0VSTl9JTkZPICJzb2Z0d2FyZSBJTyBUTEIgYXQgcGh5cyAlI2xseCAtICUjbGx4XG4iLAotCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylwc3RhcnQsCi0JCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKXBlbmQpOworCXByaW50ayhLRVJOX0lORk8gInNvZnR3YXJlIElPIFRMQiBhdCBwaHlzICUjbGx4IC0gJSNsbHhcbiIsCisJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpcHN0YXJ0LAorCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKXBlbmQpOwogfQogCiAvKgpAQCAtMjE1LDcgKzE5Nyw3IEBACiAJZm9yIChpID0gMDsgaSA8IGlvX3RsYl9uc2xhYnM7IGkrKykKICAJCWlvX3RsYl9saXN0W2ldID0gSU9fVExCX1NFR1NJWkUgLSBPRkZTRVQoaSwgSU9fVExCX1NFR1NJWkUpOwogCWlvX3RsYl9pbmRleCA9IDA7Ci0JaW9fdGxiX29yaWdfYWRkciA9IGFsbG9jX2Jvb3RtZW0oaW9fdGxiX25zbGFicyAqIHNpemVvZihzdHJ1Y3Qgc3dpb3RsYl9waHlzX2FkZHIpKTsKKwlpb190bGJfb3JpZ19hZGRyID0gYWxsb2NfYm9vdG1lbShpb190bGJfbnNsYWJzICogc2l6ZW9mKHBoeXNfYWRkcl90KSk7CiAKIAkvKgogCSAqIEdldCB0aGUgb3ZlcmZsb3cgZW1lcmdlbmN5IGJ1ZmZlcgpAQCAtMjg5LDEyICsyNzEsMTQgQEAKICAJCWlvX3RsYl9saXN0W2ldID0gSU9fVExCX1NFR1NJWkUgLSBPRkZTRVQoaSwgSU9fVExCX1NFR1NJWkUpOwogCWlvX3RsYl9pbmRleCA9IDA7CiAKLQlpb190bGJfb3JpZ19hZGRyID0gKHN0cnVjdCBzd2lvdGxiX3BoeXNfYWRkciAqKV9fZ2V0X2ZyZWVfcGFnZXMoR0ZQX0tFUk5FTCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfb3JkZXIoaW9fdGxiX25zbGFicyAqIHNpemVvZihzdHJ1Y3Qgc3dpb3RsYl9waHlzX2FkZHIpKSk7CisJaW9fdGxiX29yaWdfYWRkciA9IChwaHlzX2FkZHJfdCAqKQorCQlfX2dldF9mcmVlX3BhZ2VzKEdGUF9LRVJORUwsCisJCQkJIGdldF9vcmRlcihpb190bGJfbnNsYWJzICoKKwkJCQkJICAgc2l6ZW9mKHBoeXNfYWRkcl90KSkpOwogCWlmICghaW9fdGxiX29yaWdfYWRkcikKIAkJZ290byBjbGVhbnVwMzsKIAotCW1lbXNldChpb190bGJfb3JpZ19hZGRyLCAwLCBpb190bGJfbnNsYWJzICogc2l6ZW9mKHN0cnVjdCBzd2lvdGxiX3BoeXNfYWRkcikpOworCW1lbXNldChpb190bGJfb3JpZ19hZGRyLCAwLCBpb190bGJfbnNsYWJzICogc2l6ZW9mKHBoeXNfYWRkcl90KSk7CiAKIAkvKgogCSAqIEdldCB0aGUgb3ZlcmZsb3cgZW1lcmdlbmN5IGJ1ZmZlcgpAQCAtMzA5LDggKzI5Myw4IEBACiAJcmV0dXJuIDA7CiAKIGNsZWFudXA0OgotCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpaW9fdGxiX29yaWdfYWRkciwgZ2V0X29yZGVyKGlvX3RsYl9uc2xhYnMgKgotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihjaGFyICopKSk7CisJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZylpb190bGJfb3JpZ19hZGRyLAorCQkgICBnZXRfb3JkZXIoaW9fdGxiX25zbGFicyAqIHNpemVvZihwaHlzX2FkZHJfdCkpKTsKIAlpb190bGJfb3JpZ19hZGRyID0gTlVMTDsKIGNsZWFudXAzOgogCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpaW9fdGxiX2xpc3QsIGdldF9vcmRlcihpb190bGJfbnNsYWJzICoKQEAgLTM0MSw1MSArMzI1LDQ0IEBACiAJcmV0dXJuIGFkZHIgPj0gaW9fdGxiX3N0YXJ0ICYmIGFkZHIgPCBpb190bGJfZW5kOwogfQogCi1zdGF0aWMgc3RydWN0IHN3aW90bGJfcGh5c19hZGRyIHN3aW90bGJfYnVzX3RvX3BoeXNfYWRkcihjaGFyICpkbWFfYWRkcikKKy8qCisgKiBCb3VuY2U6IGNvcHkgdGhlIHN3aW90bGIgYnVmZmVyIGJhY2sgdG8gdGhlIG9yaWdpbmFsIGRtYSBsb2NhdGlvbgorICovCitzdGF0aWMgdm9pZCBzd2lvdGxiX2JvdW5jZShwaHlzX2FkZHJfdCBwaHlzLCBjaGFyICpkbWFfYWRkciwgc2l6ZV90IHNpemUsCisJCQkgICBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIpCiB7Ci0JaW50IGluZGV4ID0gKGRtYV9hZGRyIC0gaW9fdGxiX3N0YXJ0KSA+PiBJT19UTEJfU0hJRlQ7Ci0Jc3RydWN0IHN3aW90bGJfcGh5c19hZGRyIGJ1ZmZlciA9IGlvX3RsYl9vcmlnX2FkZHJbaW5kZXhdOwotCWJ1ZmZlci5vZmZzZXQgKz0gKGxvbmcpZG1hX2FkZHIgJiAoKDEgPDwgSU9fVExCX1NISUZUKSAtIDEpOwotCWJ1ZmZlci5wYWdlICs9IGJ1ZmZlci5vZmZzZXQgPj4gUEFHRV9TSElGVDsKLQlidWZmZXIub2Zmc2V0ICY9IFBBR0VfU0laRSAtIDE7Ci0JcmV0dXJuIGJ1ZmZlcjsKLX0KKwl1bnNpZ25lZCBsb25nIHBmbiA9IFBGTl9ET1dOKHBoeXMpOwogCi1zdGF0aWMgdm9pZAotX19zeW5jX3NpbmdsZShzdHJ1Y3Qgc3dpb3RsYl9waHlzX2FkZHIgYnVmZmVyLCBjaGFyICpkbWFfYWRkciwgc2l6ZV90IHNpemUsIGludCBkaXIpCi17Ci0JaWYgKFBhZ2VIaWdoTWVtKGJ1ZmZlci5wYWdlKSkgewotCQlzaXplX3QgbGVuLCBieXRlczsKLQkJY2hhciAqZGV2LCAqaG9zdCwgKmttcDsKKwlpZiAoUGFnZUhpZ2hNZW0ocGZuX3RvX3BhZ2UocGZuKSkpIHsKKwkJLyogVGhlIGJ1ZmZlciBkb2VzIG5vdCBoYXZlIGEgbWFwcGluZy4gIE1hcCBpdCBpbiBhbmQgY29weSAqLworCQl1bnNpZ25lZCBpbnQgb2Zmc2V0ID0gcGh5cyAmIH5QQUdFX01BU0s7CisJCWNoYXIgKmJ1ZmZlcjsKKwkJdW5zaWduZWQgaW50IHN6ID0gMDsKKwkJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCQlsZW4gPSBzaXplOwotCQl3aGlsZSAobGVuICE9IDApIHsKLQkJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCXdoaWxlIChzaXplKSB7CisJCQlzeiA9IG1pbihQQUdFX1NJWkUgLSBvZmZzZXQsIHNpemUpOwogCi0JCQlieXRlcyA9IGxlbjsKLQkJCWlmICgoYnl0ZXMgKyBidWZmZXIub2Zmc2V0KSA+IFBBR0VfU0laRSkKLQkJCQlieXRlcyA9IFBBR0VfU0laRSAtIGJ1ZmZlci5vZmZzZXQ7Ci0JCQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7IC8qIHByb3RlY3RzIEtNX0JPVU5DRV9SRUFEICovCi0JCQlrbXAgID0ga21hcF9hdG9taWMoYnVmZmVyLnBhZ2UsIEtNX0JPVU5DRV9SRUFEKTsKLQkJCWRldiAgPSBkbWFfYWRkciArIHNpemUgLSBsZW47Ci0JCQlob3N0ID0ga21wICsgYnVmZmVyLm9mZnNldDsKLQkJCWlmIChkaXIgPT0gRE1BX0ZST01fREVWSUNFKQotCQkJCW1lbWNweShob3N0LCBkZXYsIGJ5dGVzKTsKKwkJCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwkJCWJ1ZmZlciA9IGttYXBfYXRvbWljKHBmbl90b19wYWdlKHBmbiksCisJCQkJCSAgICAgS01fQk9VTkNFX1JFQUQpOworCQkJaWYgKGRpciA9PSBETUFfVE9fREVWSUNFKQorCQkJCW1lbWNweShkbWFfYWRkciwgYnVmZmVyICsgb2Zmc2V0LCBzeik7CiAJCQllbHNlCi0JCQkJbWVtY3B5KGRldiwgaG9zdCwgYnl0ZXMpOwotCQkJa3VubWFwX2F0b21pYyhrbXAsIEtNX0JPVU5DRV9SRUFEKTsKKwkJCQltZW1jcHkoYnVmZmVyICsgb2Zmc2V0LCBkbWFfYWRkciwgc3opOworCQkJa3VubWFwX2F0b21pYyhidWZmZXIsIEtNX0JPVU5DRV9SRUFEKTsKIAkJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLQkJCWxlbiAtPSBieXRlczsKLQkJCWJ1ZmZlci5wYWdlKys7Ci0JCQlidWZmZXIub2Zmc2V0ID0gMDsKKworCQkJc2l6ZSAtPSBzejsKKwkJCXBmbisrOworCQkJZG1hX2FkZHIgKz0gc3o7CisJCQlvZmZzZXQgPSAwOwogCQl9CiAJfSBlbHNlIHsKLQkJdm9pZCAqdiA9IHBhZ2VfYWRkcmVzcyhidWZmZXIucGFnZSkgKyBidWZmZXIub2Zmc2V0OwotCiAJCWlmIChkaXIgPT0gRE1BX1RPX0RFVklDRSkKLQkJCW1lbWNweShkbWFfYWRkciwgdiwgc2l6ZSk7CisJCQltZW1jcHkoZG1hX2FkZHIsIHBoeXNfdG9fdmlydChwaHlzKSwgc2l6ZSk7CiAJCWVsc2UKLQkJCW1lbWNweSh2LCBkbWFfYWRkciwgc2l6ZSk7CisJCQltZW1jcHkocGh5c190b192aXJ0KHBoeXMpLCBkbWFfYWRkciwgc2l6ZSk7CiAJfQogfQogCkBAIC0zOTMsNyArMzcwLDcgQEAKICAqIEFsbG9jYXRlcyBib3VuY2UgYnVmZmVyIGFuZCByZXR1cm5zIGl0cyBrZXJuZWwgdmlydHVhbCBhZGRyZXNzLgogICovCiBzdGF0aWMgdm9pZCAqCi1tYXBfc2luZ2xlKHN0cnVjdCBkZXZpY2UgKmh3ZGV2LCBzdHJ1Y3Qgc3dpb3RsYl9waHlzX2FkZHIgYnVmZmVyLCBzaXplX3Qgc2l6ZSwgaW50IGRpcikKK21hcF9zaW5nbGUoc3RydWN0IGRldmljZSAqaHdkZXYsIHBoeXNfYWRkcl90IHBoeXMsIHNpemVfdCBzaXplLCBpbnQgZGlyKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJY2hhciAqZG1hX2FkZHI7CkBAIC00MDMsMTAgKzM4MCw5IEBACiAJdW5zaWduZWQgbG9uZyBtYXNrOwogCXVuc2lnbmVkIGxvbmcgb2Zmc2V0X3Nsb3RzOwogCXVuc2lnbmVkIGxvbmcgbWF4X3Nsb3RzOwotCXN0cnVjdCBzd2lvdGxiX3BoeXNfYWRkciBzbG90X2J1ZjsKIAogCW1hc2sgPSBkbWFfZ2V0X3NlZ19ib3VuZGFyeShod2Rldik7Ci0Jc3RhcnRfZG1hX2FkZHIgPSBzd2lvdGxiX3ZpcnRfdG9fYnVzKGlvX3RsYl9zdGFydCkgJiBtYXNrOworCXN0YXJ0X2RtYV9hZGRyID0gc3dpb3RsYl92aXJ0X3RvX2J1cyhod2RldiwgaW9fdGxiX3N0YXJ0KSAmIG1hc2s7CiAKIAlvZmZzZXRfc2xvdHMgPSBBTElHTihzdGFydF9kbWFfYWRkciwgMSA8PCBJT19UTEJfU0hJRlQpID4+IElPX1RMQl9TSElGVDsKIApAQCAtNDg4LDE1ICs0NjQsMTAgQEAKIAkgKiBUaGlzIGlzIG5lZWRlZCB3aGVuIHdlIHN5bmMgdGhlIG1lbW9yeS4gIFRoZW4gd2Ugc3luYyB0aGUgYnVmZmVyIGlmCiAJICogbmVlZGVkLgogCSAqLwotCXNsb3RfYnVmID0gYnVmZmVyOwotCWZvciAoaSA9IDA7IGkgPCBuc2xvdHM7IGkrKykgewotCQlzbG90X2J1Zi5wYWdlICs9IHNsb3RfYnVmLm9mZnNldCA+PiBQQUdFX1NISUZUOwotCQlzbG90X2J1Zi5vZmZzZXQgJj0gUEFHRV9TSVpFIC0gMTsKLQkJaW9fdGxiX29yaWdfYWRkcltpbmRleCtpXSA9IHNsb3RfYnVmOwotCQlzbG90X2J1Zi5vZmZzZXQgKz0gMSA8PCBJT19UTEJfU0hJRlQ7Ci0JfQorCWZvciAoaSA9IDA7IGkgPCBuc2xvdHM7IGkrKykKKwkJaW9fdGxiX29yaWdfYWRkcltpbmRleCtpXSA9IHBoeXMgKyAoaSA8PCBJT19UTEJfU0hJRlQpOwogCWlmIChkaXIgPT0gRE1BX1RPX0RFVklDRSB8fCBkaXIgPT0gRE1BX0JJRElSRUNUSU9OQUwpCi0JCV9fc3luY19zaW5nbGUoYnVmZmVyLCBkbWFfYWRkciwgc2l6ZSwgRE1BX1RPX0RFVklDRSk7CisJCXN3aW90bGJfYm91bmNlKHBoeXMsIGRtYV9hZGRyLCBzaXplLCBETUFfVE9fREVWSUNFKTsKIAogCXJldHVybiBkbWFfYWRkcjsKIH0KQEAgLTUxMCwxNyArNDgxLDEzIEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgaSwgY291bnQsIG5zbG90cyA9IEFMSUdOKHNpemUsIDEgPDwgSU9fVExCX1NISUZUKSA+PiBJT19UTEJfU0hJRlQ7CiAJaW50IGluZGV4ID0gKGRtYV9hZGRyIC0gaW9fdGxiX3N0YXJ0KSA+PiBJT19UTEJfU0hJRlQ7Ci0Jc3RydWN0IHN3aW90bGJfcGh5c19hZGRyIGJ1ZmZlciA9IHN3aW90bGJfYnVzX3RvX3BoeXNfYWRkcihkbWFfYWRkcik7CisJcGh5c19hZGRyX3QgcGh5cyA9IGlvX3RsYl9vcmlnX2FkZHJbaW5kZXhdOwogCiAJLyoKIAkgKiBGaXJzdCwgc3luYyB0aGUgbWVtb3J5IGJlZm9yZSB1bm1hcHBpbmcgdGhlIGVudHJ5CiAJICovCi0JaWYgKChkaXIgPT0gRE1BX0ZST01fREVWSUNFKSB8fCAoZGlyID09IERNQV9CSURJUkVDVElPTkFMKSkKLQkJLyoKLQkJICogYm91bmNlLi4uIGNvcHkgdGhlIGRhdGEgYmFjayBpbnRvIHRoZSBvcmlnaW5hbCBidWZmZXIgKiBhbmQKLQkJICogZGVsZXRlIHRoZSBib3VuY2UgYnVmZmVyLgotCQkgKi8KLQkJX19zeW5jX3NpbmdsZShidWZmZXIsIGRtYV9hZGRyLCBzaXplLCBETUFfRlJPTV9ERVZJQ0UpOworCWlmIChwaHlzICYmICgoZGlyID09IERNQV9GUk9NX0RFVklDRSkgfHwgKGRpciA9PSBETUFfQklESVJFQ1RJT05BTCkpKQorCQlzd2lvdGxiX2JvdW5jZShwaHlzLCBkbWFfYWRkciwgc2l6ZSwgRE1BX0ZST01fREVWSUNFKTsKIAogCS8qCiAJICogUmV0dXJuIHRoZSBidWZmZXIgdG8gdGhlIGZyZWUgbGlzdCBieSBzZXR0aW5nIHRoZSBjb3JyZXNwb25kaW5nCkBAIC01NTIsMTggKzUxOSwyMSBAQAogc3luY19zaW5nbGUoc3RydWN0IGRldmljZSAqaHdkZXYsIGNoYXIgKmRtYV9hZGRyLCBzaXplX3Qgc2l6ZSwKIAkgICAgaW50IGRpciwgaW50IHRhcmdldCkKIHsKLQlzdHJ1Y3Qgc3dpb3RsYl9waHlzX2FkZHIgYnVmZmVyID0gc3dpb3RsYl9idXNfdG9fcGh5c19hZGRyKGRtYV9hZGRyKTsKKwlpbnQgaW5kZXggPSAoZG1hX2FkZHIgLSBpb190bGJfc3RhcnQpID4+IElPX1RMQl9TSElGVDsKKwlwaHlzX2FkZHJfdCBwaHlzID0gaW9fdGxiX29yaWdfYWRkcltpbmRleF07CisKKwlwaHlzICs9ICgodW5zaWduZWQgbG9uZylkbWFfYWRkciAmICgoMSA8PCBJT19UTEJfU0hJRlQpIC0gMSkpOwogCiAJc3dpdGNoICh0YXJnZXQpIHsKIAljYXNlIFNZTkNfRk9SX0NQVToKIAkJaWYgKGxpa2VseShkaXIgPT0gRE1BX0ZST01fREVWSUNFIHx8IGRpciA9PSBETUFfQklESVJFQ1RJT05BTCkpCi0JCQlfX3N5bmNfc2luZ2xlKGJ1ZmZlciwgZG1hX2FkZHIsIHNpemUsIERNQV9GUk9NX0RFVklDRSk7CisJCQlzd2lvdGxiX2JvdW5jZShwaHlzLCBkbWFfYWRkciwgc2l6ZSwgRE1BX0ZST01fREVWSUNFKTsKIAkJZWxzZQogCQkJQlVHX09OKGRpciAhPSBETUFfVE9fREVWSUNFKTsKIAkJYnJlYWs7CiAJY2FzZSBTWU5DX0ZPUl9ERVZJQ0U6CiAJCWlmIChsaWtlbHkoZGlyID09IERNQV9UT19ERVZJQ0UgfHwgZGlyID09IERNQV9CSURJUkVDVElPTkFMKSkKLQkJCV9fc3luY19zaW5nbGUoYnVmZmVyLCBkbWFfYWRkciwgc2l6ZSwgRE1BX1RPX0RFVklDRSk7CisJCQlzd2lvdGxiX2JvdW5jZShwaHlzLCBkbWFfYWRkciwgc2l6ZSwgRE1BX1RPX0RFVklDRSk7CiAJCWVsc2UKIAkJCUJVR19PTihkaXIgIT0gRE1BX0ZST01fREVWSUNFKTsKIAkJYnJlYWs7CkBAIC01ODUsNyArNTU1LDkgQEAKIAkJZG1hX21hc2sgPSBod2Rldi0+Y29oZXJlbnRfZG1hX21hc2s7CiAKIAlyZXQgPSAodm9pZCAqKV9fZ2V0X2ZyZWVfcGFnZXMoZmxhZ3MsIG9yZGVyKTsKLQlpZiAocmV0ICYmICFpc19idWZmZXJfZG1hX2NhcGFibGUoZG1hX21hc2ssIHN3aW90bGJfdmlydF90b19idXMocmV0KSwgc2l6ZSkpIHsKKwlpZiAocmV0ICYmCisJICAgICFpc19idWZmZXJfZG1hX2NhcGFibGUoZG1hX21hc2ssIHN3aW90bGJfdmlydF90b19idXMoaHdkZXYsIHJldCksCisJCQkJICAgc2l6ZSkpIHsKIAkJLyoKIAkJICogVGhlIGFsbG9jYXRlZCBtZW1vcnkgaXNuJ3QgcmVhY2hhYmxlIGJ5IHRoZSBkZXZpY2UuCiAJCSAqIEZhbGwgYmFjayBvbiBzd2lvdGxiX21hcF9zaW5nbGUoKS4KQEAgLTYwMCwxNiArNTcyLDEzIEBACiAJCSAqIHN3aW90bGJfbWFwX3NpbmdsZSgpLCB3aGljaCB3aWxsIGdyYWIgbWVtb3J5IGZyb20KIAkJICogdGhlIGxvd2VzdCBhdmFpbGFibGUgYWRkcmVzcyByYW5nZS4KIAkJICovCi0JCXN0cnVjdCBzd2lvdGxiX3BoeXNfYWRkciBidWZmZXI7Ci0JCWJ1ZmZlci5wYWdlID0gdmlydF90b19wYWdlKE5VTEwpOwotCQlidWZmZXIub2Zmc2V0ID0gMDsKLQkJcmV0ID0gbWFwX3NpbmdsZShod2RldiwgYnVmZmVyLCBzaXplLCBETUFfRlJPTV9ERVZJQ0UpOworCQlyZXQgPSBtYXBfc2luZ2xlKGh3ZGV2LCAwLCBzaXplLCBETUFfRlJPTV9ERVZJQ0UpOwogCQlpZiAoIXJldCkKIAkJCXJldHVybiBOVUxMOwogCX0KIAogCW1lbXNldChyZXQsIDAsIHNpemUpOwotCWRldl9hZGRyID0gc3dpb3RsYl92aXJ0X3RvX2J1cyhyZXQpOworCWRldl9hZGRyID0gc3dpb3RsYl92aXJ0X3RvX2J1cyhod2RldiwgcmV0KTsKIAogCS8qIENvbmZpcm0gYWRkcmVzcyBjYW4gYmUgRE1BJ2QgYnkgZGV2aWNlICovCiAJaWYgKCFpc19idWZmZXJfZG1hX2NhcGFibGUoZG1hX21hc2ssIGRldl9hZGRyLCBzaXplKSkgewpAQCAtNjI0LDYgKzU5Myw3IEBACiAJKmRtYV9oYW5kbGUgPSBkZXZfYWRkcjsKIAlyZXR1cm4gcmV0OwogfQorRVhQT1JUX1NZTUJPTChzd2lvdGxiX2FsbG9jX2NvaGVyZW50KTsKIAogdm9pZAogc3dpb3RsYl9mcmVlX2NvaGVyZW50KHN0cnVjdCBkZXZpY2UgKmh3ZGV2LCBzaXplX3Qgc2l6ZSwgdm9pZCAqdmFkZHIsCkBAIC02MzYsNiArNjA2LDcgQEAKIAkJLyogRE1BX1RPX0RFVklDRSB0byBhdm9pZCBtZW1jcHkgaW4gdW5tYXBfc2luZ2xlICovCiAJCXVubWFwX3NpbmdsZShod2RldiwgdmFkZHIsIHNpemUsIERNQV9UT19ERVZJQ0UpOwogfQorRVhQT1JUX1NZTUJPTChzd2lvdGxiX2ZyZWVfY29oZXJlbnQpOwogCiBzdGF0aWMgdm9pZAogc3dpb3RsYl9mdWxsKHN0cnVjdCBkZXZpY2UgKmRldiwgc2l6ZV90IHNpemUsIGludCBkaXIsIGludCBkb19wYW5pYykKQEAgLTY0OCw3ICs2MTksNyBAQAogCSAqIHRoZSBkYW1hZ2UsIG9yIHBhbmljIHdoZW4gdGhlIHRyYW5zZmVyIGlzIHRvbyBiaWcuCiAJICovCiAJcHJpbnRrKEtFUk5fRVJSICJETUE6IE91dCBvZiBTVy1JT01NVSBzcGFjZSBmb3IgJXp1IGJ5dGVzIGF0ICIKLQkgICAgICAgImRldmljZSAlc1xuIiwgc2l6ZSwgZGV2ID8gZGV2LT5idXNfaWQgOiAiPyIpOworCSAgICAgICAiZGV2aWNlICVzXG4iLCBzaXplLCBkZXYgPyBkZXZfbmFtZShkZXYpIDogIj8iKTsKIAogCWlmIChzaXplID4gaW9fdGxiX292ZXJmbG93ICYmIGRvX3BhbmljKSB7CiAJCWlmIChkaXIgPT0gRE1BX0ZST01fREVWSUNFIHx8IGRpciA9PSBETUFfQklESVJFQ1RJT05BTCkKQEAgLTY2OSw5ICs2NDAsOCBAQAogc3dpb3RsYl9tYXBfc2luZ2xlX2F0dHJzKHN0cnVjdCBkZXZpY2UgKmh3ZGV2LCB2b2lkICpwdHIsIHNpemVfdCBzaXplLAogCQkJIGludCBkaXIsIHN0cnVjdCBkbWFfYXR0cnMgKmF0dHJzKQogewotCWRtYV9hZGRyX3QgZGV2X2FkZHIgPSBzd2lvdGxiX3ZpcnRfdG9fYnVzKHB0cik7CisJZG1hX2FkZHJfdCBkZXZfYWRkciA9IHN3aW90bGJfdmlydF90b19idXMoaHdkZXYsIHB0cik7CiAJdm9pZCAqbWFwOwotCXN0cnVjdCBzd2lvdGxiX3BoeXNfYWRkciBidWZmZXI7CiAKIAlCVUdfT04oZGlyID09IERNQV9OT05FKTsKIAkvKgpAQCAtNjg2LDE1ICs2NTYsMTMgQEAKIAkvKgogCSAqIE9oIHdlbGwsIGhhdmUgdG8gYWxsb2NhdGUgYW5kIG1hcCBhIGJvdW5jZSBidWZmZXIuCiAJICovCi0JYnVmZmVyLnBhZ2UgICA9IHZpcnRfdG9fcGFnZShwdHIpOwotCWJ1ZmZlci5vZmZzZXQgPSAodW5zaWduZWQgbG9uZylwdHIgJiB+UEFHRV9NQVNLOwotCW1hcCA9IG1hcF9zaW5nbGUoaHdkZXYsIGJ1ZmZlciwgc2l6ZSwgZGlyKTsKKwltYXAgPSBtYXBfc2luZ2xlKGh3ZGV2LCB2aXJ0X3RvX3BoeXMocHRyKSwgc2l6ZSwgZGlyKTsKIAlpZiAoIW1hcCkgewogCQlzd2lvdGxiX2Z1bGwoaHdkZXYsIHNpemUsIGRpciwgMSk7CiAJCW1hcCA9IGlvX3RsYl9vdmVyZmxvd19idWZmZXI7CiAJfQogCi0JZGV2X2FkZHIgPSBzd2lvdGxiX3ZpcnRfdG9fYnVzKG1hcCk7CisJZGV2X2FkZHIgPSBzd2lvdGxiX3ZpcnRfdG9fYnVzKGh3ZGV2LCBtYXApOwogCiAJLyoKIAkgKiBFbnN1cmUgdGhhdCB0aGUgYWRkcmVzcyByZXR1cm5lZCBpcyBETUEnYmxlCkBAIC03MTEsNiArNjc5LDcgQEAKIHsKIAlyZXR1cm4gc3dpb3RsYl9tYXBfc2luZ2xlX2F0dHJzKGh3ZGV2LCBwdHIsIHNpemUsIGRpciwgTlVMTCk7CiB9CitFWFBPUlRfU1lNQk9MKHN3aW90bGJfbWFwX3NpbmdsZSk7CiAKIC8qCiAgKiBVbm1hcCBhIHNpbmdsZSBzdHJlYW1pbmcgbW9kZSBETUEgdHJhbnNsYXRpb24uICBUaGUgZG1hX2FkZHIgYW5kIHNpemUgbXVzdApAQCAtNzQwLDYgKzcwOSw4IEBACiB7CiAJcmV0dXJuIHN3aW90bGJfdW5tYXBfc2luZ2xlX2F0dHJzKGh3ZGV2LCBkZXZfYWRkciwgc2l6ZSwgZGlyLCBOVUxMKTsKIH0KK0VYUE9SVF9TWU1CT0woc3dpb3RsYl91bm1hcF9zaW5nbGUpOworCiAvKgogICogTWFrZSBwaHlzaWNhbCBtZW1vcnkgY29uc2lzdGVudCBmb3IgYSBzaW5nbGUgc3RyZWFtaW5nIG1vZGUgRE1BIHRyYW5zbGF0aW9uCiAgKiBhZnRlciBhIHRyYW5zZmVyLgpAQCAtNzY5LDYgKzc0MCw3IEBACiB7CiAJc3dpb3RsYl9zeW5jX3NpbmdsZShod2RldiwgZGV2X2FkZHIsIHNpemUsIGRpciwgU1lOQ19GT1JfQ1BVKTsKIH0KK0VYUE9SVF9TWU1CT0woc3dpb3RsYl9zeW5jX3NpbmdsZV9mb3JfY3B1KTsKIAogdm9pZAogc3dpb3RsYl9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmh3ZGV2LCBkbWFfYWRkcl90IGRldl9hZGRyLApAQCAtNzc2LDYgKzc0OCw3IEBACiB7CiAJc3dpb3RsYl9zeW5jX3NpbmdsZShod2RldiwgZGV2X2FkZHIsIHNpemUsIGRpciwgU1lOQ19GT1JfREVWSUNFKTsKIH0KK0VYUE9SVF9TWU1CT0woc3dpb3RsYl9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKTsKIAogLyoKICAqIFNhbWUgYXMgYWJvdmUsIGJ1dCBmb3IgYSBzdWItcmFuZ2Ugb2YgdGhlIG1hcHBpbmcuCkBAIC04MDEsNiArNzc0LDcgQEAKIAlzd2lvdGxiX3N5bmNfc2luZ2xlX3JhbmdlKGh3ZGV2LCBkZXZfYWRkciwgb2Zmc2V0LCBzaXplLCBkaXIsCiAJCQkJICBTWU5DX0ZPUl9DUFUpOwogfQorRVhQT1JUX1NZTUJPTF9HUEwoc3dpb3RsYl9zeW5jX3NpbmdsZV9yYW5nZV9mb3JfY3B1KTsKIAogdm9pZAogc3dpb3RsYl9zeW5jX3NpbmdsZV9yYW5nZV9mb3JfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmh3ZGV2LCBkbWFfYWRkcl90IGRldl9hZGRyLApAQCAtODA5LDkgKzc4Myw4IEBACiAJc3dpb3RsYl9zeW5jX3NpbmdsZV9yYW5nZShod2RldiwgZGV2X2FkZHIsIG9mZnNldCwgc2l6ZSwgZGlyLAogCQkJCSAgU1lOQ19GT1JfREVWSUNFKTsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKHN3aW90bGJfc3luY19zaW5nbGVfcmFuZ2VfZm9yX2RldmljZSk7CiAKLXZvaWQgc3dpb3RsYl91bm1hcF9zZ19hdHRycyhzdHJ1Y3QgZGV2aWNlICosIHN0cnVjdCBzY2F0dGVybGlzdCAqLCBpbnQsIGludCwKLQkJCSAgICBzdHJ1Y3QgZG1hX2F0dHJzICopOwogLyoKICAqIE1hcCBhIHNldCBvZiBidWZmZXJzIGRlc2NyaWJlZCBieSBzY2F0dGVybGlzdCBpbiBzdHJlYW1pbmcgbW9kZSBmb3IgRE1BLgogICogVGhpcyBpcyB0aGUgc2NhdHRlci1nYXRoZXIgdmVyc2lvbiBvZiB0aGUgYWJvdmUgc3dpb3RsYl9tYXBfc2luZ2xlCkBAIC04MzMsMjAgKzgwNiwxOCBAQAogCQkgICAgIGludCBkaXIsIHN0cnVjdCBkbWFfYXR0cnMgKmF0dHJzKQogewogCXN0cnVjdCBzY2F0dGVybGlzdCAqc2c7Ci0Jc3RydWN0IHN3aW90bGJfcGh5c19hZGRyIGJ1ZmZlcjsKLQlkbWFfYWRkcl90IGRldl9hZGRyOwogCWludCBpOwogCiAJQlVHX09OKGRpciA9PSBETUFfTk9ORSk7CiAKIAlmb3JfZWFjaF9zZyhzZ2wsIHNnLCBuZWxlbXMsIGkpIHsKLQkJZGV2X2FkZHIgPSBzd2lvdGxiX3NnX3RvX2J1cyhzZyk7Ci0JCWlmIChyYW5nZV9uZWVkc19tYXBwaW5nKHNnX3ZpcnQoc2cpLCBzZy0+bGVuZ3RoKSB8fAorCQl2b2lkICphZGRyID0gc2dfdmlydChzZyk7CisJCWRtYV9hZGRyX3QgZGV2X2FkZHIgPSBzd2lvdGxiX3ZpcnRfdG9fYnVzKGh3ZGV2LCBhZGRyKTsKKworCQlpZiAocmFuZ2VfbmVlZHNfbWFwcGluZyhhZGRyLCBzZy0+bGVuZ3RoKSB8fAogCQkgICAgYWRkcmVzc19uZWVkc19tYXBwaW5nKGh3ZGV2LCBkZXZfYWRkciwgc2ctPmxlbmd0aCkpIHsKLQkJCXZvaWQgKm1hcDsKLQkJCWJ1ZmZlci5wYWdlICAgPSBzZ19wYWdlKHNnKTsKLQkJCWJ1ZmZlci5vZmZzZXQgPSBzZy0+b2Zmc2V0OwotCQkJbWFwID0gbWFwX3NpbmdsZShod2RldiwgYnVmZmVyLCBzZy0+bGVuZ3RoLCBkaXIpOworCQkJdm9pZCAqbWFwID0gbWFwX3NpbmdsZShod2Rldiwgc2dfcGh5cyhzZyksCisJCQkJCSAgICAgICBzZy0+bGVuZ3RoLCBkaXIpOwogCQkJaWYgKCFtYXApIHsKIAkJCQkvKiBEb24ndCBwYW5pYyBoZXJlLCB3ZSBleHBlY3QgbWFwX3NnIHVzZXJzCiAJCQkJICAgdG8gZG8gcHJvcGVyIGVycm9yIGhhbmRsaW5nLiAqLwpAQCAtODU2LDcgKzgyNyw3IEBACiAJCQkJc2dsWzBdLmRtYV9sZW5ndGggPSAwOwogCQkJCXJldHVybiAwOwogCQkJfQotCQkJc2ctPmRtYV9hZGRyZXNzID0gc3dpb3RsYl92aXJ0X3RvX2J1cyhtYXApOworCQkJc2ctPmRtYV9hZGRyZXNzID0gc3dpb3RsYl92aXJ0X3RvX2J1cyhod2RldiwgbWFwKTsKIAkJfSBlbHNlCiAJCQlzZy0+ZG1hX2FkZHJlc3MgPSBkZXZfYWRkcjsKIAkJc2ctPmRtYV9sZW5ndGggPSBzZy0+bGVuZ3RoOwpAQCAtODcxLDYgKzg0Miw3IEBACiB7CiAJcmV0dXJuIHN3aW90bGJfbWFwX3NnX2F0dHJzKGh3ZGV2LCBzZ2wsIG5lbGVtcywgZGlyLCBOVUxMKTsKIH0KK0VYUE9SVF9TWU1CT0woc3dpb3RsYl9tYXBfc2cpOwogCiAvKgogICogVW5tYXAgYSBzZXQgb2Ygc3RyZWFtaW5nIG1vZGUgRE1BIHRyYW5zbGF0aW9ucy4gIEFnYWluLCBjcHUgcmVhZCBydWxlcwpAQCAtODg2LDExICs4NTgsMTEgQEAKIAlCVUdfT04oZGlyID09IERNQV9OT05FKTsKIAogCWZvcl9lYWNoX3NnKHNnbCwgc2csIG5lbGVtcywgaSkgewotCQlpZiAoc2ctPmRtYV9hZGRyZXNzICE9IHN3aW90bGJfc2dfdG9fYnVzKHNnKSkKKwkJaWYgKHNnLT5kbWFfYWRkcmVzcyAhPSBzd2lvdGxiX3ZpcnRfdG9fYnVzKGh3ZGV2LCBzZ192aXJ0KHNnKSkpCiAJCQl1bm1hcF9zaW5nbGUoaHdkZXYsIHN3aW90bGJfYnVzX3RvX3ZpcnQoc2ctPmRtYV9hZGRyZXNzKSwKIAkJCQkgICAgIHNnLT5kbWFfbGVuZ3RoLCBkaXIpOwogCQllbHNlIGlmIChkaXIgPT0gRE1BX0ZST01fREVWSUNFKQotCQkJZG1hX21hcmtfY2xlYW4oc3dpb3RsYl9idXNfdG9fdmlydChzZy0+ZG1hX2FkZHJlc3MpLCBzZy0+ZG1hX2xlbmd0aCk7CisJCQlkbWFfbWFya19jbGVhbihzZ192aXJ0KHNnKSwgc2ctPmRtYV9sZW5ndGgpOwogCX0KIH0KIEVYUE9SVF9TWU1CT0woc3dpb3RsYl91bm1hcF9zZ19hdHRycyk7CkBAIC05MDEsNiArODczLDcgQEAKIHsKIAlyZXR1cm4gc3dpb3RsYl91bm1hcF9zZ19hdHRycyhod2Rldiwgc2dsLCBuZWxlbXMsIGRpciwgTlVMTCk7CiB9CitFWFBPUlRfU1lNQk9MKHN3aW90bGJfdW5tYXBfc2cpOwogCiAvKgogICogTWFrZSBwaHlzaWNhbCBtZW1vcnkgY29uc2lzdGVudCBmb3IgYSBzZXQgb2Ygc3RyZWFtaW5nIG1vZGUgRE1BIHRyYW5zbGF0aW9ucwpAQCAtOTE5LDExICs4OTIsMTEgQEAKIAlCVUdfT04oZGlyID09IERNQV9OT05FKTsKIAogCWZvcl9lYWNoX3NnKHNnbCwgc2csIG5lbGVtcywgaSkgewotCQlpZiAoc2ctPmRtYV9hZGRyZXNzICE9IHN3aW90bGJfc2dfdG9fYnVzKHNnKSkKKwkJaWYgKHNnLT5kbWFfYWRkcmVzcyAhPSBzd2lvdGxiX3ZpcnRfdG9fYnVzKGh3ZGV2LCBzZ192aXJ0KHNnKSkpCiAJCQlzeW5jX3NpbmdsZShod2Rldiwgc3dpb3RsYl9idXNfdG9fdmlydChzZy0+ZG1hX2FkZHJlc3MpLAogCQkJCSAgICBzZy0+ZG1hX2xlbmd0aCwgZGlyLCB0YXJnZXQpOwogCQllbHNlIGlmIChkaXIgPT0gRE1BX0ZST01fREVWSUNFKQotCQkJZG1hX21hcmtfY2xlYW4oc3dpb3RsYl9idXNfdG9fdmlydChzZy0+ZG1hX2FkZHJlc3MpLCBzZy0+ZG1hX2xlbmd0aCk7CisJCQlkbWFfbWFya19jbGVhbihzZ192aXJ0KHNnKSwgc2ctPmRtYV9sZW5ndGgpOwogCX0KIH0KIApAQCAtOTMzLDYgKzkwNiw3IEBACiB7CiAJc3dpb3RsYl9zeW5jX3NnKGh3ZGV2LCBzZywgbmVsZW1zLCBkaXIsIFNZTkNfRk9SX0NQVSk7CiB9CitFWFBPUlRfU1lNQk9MKHN3aW90bGJfc3luY19zZ19mb3JfY3B1KTsKIAogdm9pZAogc3dpb3RsYl9zeW5jX3NnX2Zvcl9kZXZpY2Uoc3RydWN0IGRldmljZSAqaHdkZXYsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csCkBAIC05NDAsMTIgKzkxNCwxNCBAQAogewogCXN3aW90bGJfc3luY19zZyhod2Rldiwgc2csIG5lbGVtcywgZGlyLCBTWU5DX0ZPUl9ERVZJQ0UpOwogfQorRVhQT1JUX1NZTUJPTChzd2lvdGxiX3N5bmNfc2dfZm9yX2RldmljZSk7CiAKIGludAogc3dpb3RsYl9kbWFfbWFwcGluZ19lcnJvcihzdHJ1Y3QgZGV2aWNlICpod2RldiwgZG1hX2FkZHJfdCBkbWFfYWRkcikKIHsKLQlyZXR1cm4gKGRtYV9hZGRyID09IHN3aW90bGJfdmlydF90b19idXMoaW9fdGxiX292ZXJmbG93X2J1ZmZlcikpOworCXJldHVybiAoZG1hX2FkZHIgPT0gc3dpb3RsYl92aXJ0X3RvX2J1cyhod2RldiwgaW9fdGxiX292ZXJmbG93X2J1ZmZlcikpOwogfQorRVhQT1JUX1NZTUJPTChzd2lvdGxiX2RtYV9tYXBwaW5nX2Vycm9yKTsKIAogLyoKICAqIFJldHVybiB3aGV0aGVyIHRoZSBnaXZlbiBkZXZpY2UgRE1BIGFkZHJlc3MgbWFzayBjYW4gYmUgc3VwcG9ydGVkCkBAIC05NTYsMjAgKzkzMiw2IEBACiBpbnQKIHN3aW90bGJfZG1hX3N1cHBvcnRlZChzdHJ1Y3QgZGV2aWNlICpod2RldiwgdTY0IG1hc2spCiB7Ci0JcmV0dXJuIHN3aW90bGJfdmlydF90b19idXMoaW9fdGxiX2VuZCAtIDEpIDw9IG1hc2s7CisJcmV0dXJuIHN3aW90bGJfdmlydF90b19idXMoaHdkZXYsIGlvX3RsYl9lbmQgLSAxKSA8PSBtYXNrOwogfQotCi1FWFBPUlRfU1lNQk9MKHN3aW90bGJfbWFwX3NpbmdsZSk7Ci1FWFBPUlRfU1lNQk9MKHN3aW90bGJfdW5tYXBfc2luZ2xlKTsKLUVYUE9SVF9TWU1CT0woc3dpb3RsYl9tYXBfc2cpOwotRVhQT1JUX1NZTUJPTChzd2lvdGxiX3VubWFwX3NnKTsKLUVYUE9SVF9TWU1CT0woc3dpb3RsYl9zeW5jX3NpbmdsZV9mb3JfY3B1KTsKLUVYUE9SVF9TWU1CT0woc3dpb3RsYl9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKTsKLUVYUE9SVF9TWU1CT0xfR1BMKHN3aW90bGJfc3luY19zaW5nbGVfcmFuZ2VfZm9yX2NwdSk7Ci1FWFBPUlRfU1lNQk9MX0dQTChzd2lvdGxiX3N5bmNfc2luZ2xlX3JhbmdlX2Zvcl9kZXZpY2UpOwotRVhQT1JUX1NZTUJPTChzd2lvdGxiX3N5bmNfc2dfZm9yX2NwdSk7Ci1FWFBPUlRfU1lNQk9MKHN3aW90bGJfc3luY19zZ19mb3JfZGV2aWNlKTsKLUVYUE9SVF9TWU1CT0woc3dpb3RsYl9kbWFfbWFwcGluZ19lcnJvcik7Ci1FWFBPUlRfU1lNQk9MKHN3aW90bGJfYWxsb2NfY29oZXJlbnQpOwotRVhQT1JUX1NZTUJPTChzd2lvdGxiX2ZyZWVfY29oZXJlbnQpOwogRVhQT1JUX1NZTUJPTChzd2lvdGxiX2RtYV9zdXBwb3J0ZWQpOwpkaWZmIC0tZ2l0IGEvbGliL3ZzcHJpbnRmLmMgYi9saWIvdnNwcmludGYuYwppbmRleCA5OGQ2MzIyLi4wZmJkMDEyIDEwMDY0NAotLS0gYS9saWIvdnNwcmludGYuYworKysgYi9saWIvdnNwcmludGYuYwpAQCAtMTcwLDYgKzE3MCw4IEBACiAJCXJldHVybiAtRUlOVkFMOwogCiAJdmFsID0gc2ltcGxlX3N0cnRvdWwoY3AsICZ0YWlsLCBiYXNlKTsKKwlpZiAodGFpbCA9PSBjcCkKKwkJcmV0dXJuIC1FSU5WQUw7CiAJaWYgKCgqdGFpbCA9PSAnXDAnKSB8fAogCQkoKGxlbiA9PSAoc2l6ZV90KSh0YWlsIC0gY3ApICsgMSkgJiYgKCp0YWlsID09ICdcbicpKSkgewogCQkqcmVzID0gdmFsOwpAQCAtMjQxLDYgKzI0Myw4IEBACiAJCXJldHVybiAtRUlOVkFMOwogCiAJdmFsID0gc2ltcGxlX3N0cnRvdWxsKGNwLCAmdGFpbCwgYmFzZSk7CisJaWYgKHRhaWwgPT0gY3ApCisJCXJldHVybiAtRUlOVkFMOwogCWlmICgoKnRhaWwgPT0gJ1wwJykgfHwKIAkJKChsZW4gPT0gKHNpemVfdCkodGFpbCAtIGNwKSArIDEpICYmICgqdGFpbCA9PSAnXG4nKSkpIHsKIAkJKnJlcyA9IHZhbDsKZGlmZiAtLWdpdCBhL21tL0tjb25maWcgYi9tbS9LY29uZmlnCmluZGV4IDViNTc5MGYuLmE1Yjc3ODEgMTAwNjQ0Ci0tLSBhL21tL0tjb25maWcKKysrIGIvbW0vS2NvbmZpZwpAQCAtMTgxLDEyICsxODEsNiBAQAogCSAgZXhhbXBsZSBvbiBOVU1BIHN5c3RlbXMgdG8gcHV0IHBhZ2VzIG5lYXJlciB0byB0aGUgcHJvY2Vzc29ycyBhY2Nlc3NpbmcKIAkgIHRoZSBwYWdlLgogCi1jb25maWcgUkVTT1VSQ0VTXzY0QklUCi0JYm9vbCAiNjQgYml0IE1lbW9yeSBhbmQgSU8gcmVzb3VyY2VzIChFWFBFUklNRU5UQUwpIiBpZiAoITY0QklUICYmIEVYUEVSSU1FTlRBTCkKLQlkZWZhdWx0IDY0QklUCi0JaGVscAotCSAgVGhpcyBvcHRpb24gYWxsb3dzIG1lbW9yeSBhbmQgSU8gcmVzb3VyY2VzIHRvIGJlIDY0IGJpdC4KLQogY29uZmlnIFBIWVNfQUREUl9UXzY0QklUCiAJZGVmX2Jvb2wgNjRCSVQgfHwgQVJDSF9QSFlTX0FERFJfVF82NEJJVAogCmRpZmYgLS1naXQgYS9tbS9NYWtlZmlsZSBiL21tL01ha2VmaWxlCmluZGV4IDUxYzI3NzAuLjcyMjU1YmUgMTAwNjQ0Ci0tLSBhL21tL01ha2VmaWxlCisrKyBiL21tL01ha2VmaWxlCkBAIC05LDcgKzksNyBAQAogCiBvYmoteQkJCTo9IGJvb3RtZW0ubyBmaWxlbWFwLm8gbWVtcG9vbC5vIG9vbV9raWxsLm8gZmFkdmlzZS5vIFwKIAkJCSAgIG1hY2Nlc3MubyBwYWdlX2FsbG9jLm8gcGFnZS13cml0ZWJhY2subyBwZGZsdXNoLm8gXAotCQkJICAgcmVhZGFoZWFkLm8gc3dhcC5vIHRydW5jYXRlLm8gdm1zY2FuLm8gXAorCQkJICAgcmVhZGFoZWFkLm8gc3dhcC5vIHRydW5jYXRlLm8gdm1zY2FuLm8gc2htZW0ubyBcCiAJCQkgICBwcmlvX3RyZWUubyB1dGlsLm8gbW16b25lLm8gdm1zdGF0Lm8gYmFja2luZy1kZXYubyBcCiAJCQkgICBwYWdlX2lzb2xhdGlvbi5vIG1tX2luaXQubyAkKG1tdS15KQogCkBAIC0yMSw5ICsyMSw3IEBACiBvYmotJChDT05GSUdfTlVNQSkgCSs9IG1lbXBvbGljeS5vCiBvYmotJChDT05GSUdfU1BBUlNFTUVNKQkrPSBzcGFyc2Uubwogb2JqLSQoQ09ORklHX1NQQVJTRU1FTV9WTUVNTUFQKSArPSBzcGFyc2Utdm1lbW1hcC5vCi1vYmotJChDT05GSUdfU0hNRU0pICs9IHNobWVtLm8KIG9iai0kKENPTkZJR19UTVBGU19QT1NJWF9BQ0wpICs9IHNobWVtX2FjbC5vCi1vYmotJChDT05GSUdfVElOWV9TSE1FTSkgKz0gdGlueS1zaG1lbS5vCiBvYmotJChDT05GSUdfU0xPQikgKz0gc2xvYi5vCiBvYmotJChDT05GSUdfTU1VX05PVElGSUVSKSArPSBtbXVfbm90aWZpZXIubwogb2JqLSQoQ09ORklHX1NMQUIpICs9IHNsYWIubwpkaWZmIC0tZ2l0IGEvbW0vYmFja2luZy1kZXYuYyBiL21tL2JhY2tpbmctZGV2LmMKaW5kZXggODAxYzA4Yi4uOGU4NTg3NCAxMDA2NDQKLS0tIGEvbW0vYmFja2luZy1kZXYuYworKysgYi9tbS9iYWNraW5nLWRldi5jCkBAIC0yNCw5ICsyNCw5IEBACiBzdGF0aWMgaW50IGJkaV9kZWJ1Z19zdGF0c19zaG93KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdikKIHsKIAlzdHJ1Y3QgYmFja2luZ19kZXZfaW5mbyAqYmRpID0gbS0+cHJpdmF0ZTsKLQlsb25nIGJhY2tncm91bmRfdGhyZXNoOwotCWxvbmcgZGlydHlfdGhyZXNoOwotCWxvbmcgYmRpX3RocmVzaDsKKwl1bnNpZ25lZCBsb25nIGJhY2tncm91bmRfdGhyZXNoOworCXVuc2lnbmVkIGxvbmcgZGlydHlfdGhyZXNoOworCXVuc2lnbmVkIGxvbmcgYmRpX3RocmVzaDsKIAogCWdldF9kaXJ0eV9saW1pdHMoJmJhY2tncm91bmRfdGhyZXNoLCAmZGlydHlfdGhyZXNoLCAmYmRpX3RocmVzaCwgYmRpKTsKIApAQCAtMjIzLDcgKzIyMyw3IEBACiAJYmRpLT5tYXhfcHJvcF9mcmFjID0gUFJPUF9GUkFDX0JBU0U7CiAKIAlmb3IgKGkgPSAwOyBpIDwgTlJfQkRJX1NUQVRfSVRFTVM7IGkrKykgewotCQllcnIgPSBwZXJjcHVfY291bnRlcl9pbml0X2lycSgmYmRpLT5iZGlfc3RhdFtpXSwgMCk7CisJCWVyciA9IHBlcmNwdV9jb3VudGVyX2luaXQoJmJkaS0+YmRpX3N0YXRbaV0sIDApOwogCQlpZiAoZXJyKQogCQkJZ290byBlcnI7CiAJfQpkaWZmIC0tZ2l0IGEvbW0vYm9vdG1lbS5jIGIvbW0vYm9vdG1lbS5jCmluZGV4IGFjNWE4OTEuLjUxYTBjY2YgMTAwNjQ0Ci0tLSBhL21tL2Jvb3RtZW0uYworKysgYi9tbS9ib290bWVtLmMKQEAgLTQzNSw2ICs0MzUsMTAgQEAKIAl1bnNpZ25lZCBsb25nIGZhbGxiYWNrID0gMDsKIAl1bnNpZ25lZCBsb25nIG1pbiwgbWF4LCBzdGFydCwgc2lkeCwgbWlkeCwgc3RlcDsKIAorCWJkZWJ1ZygibmlkPSV0ZCBzaXplPSVseCBbJWx1IHBhZ2VzXSBhbGlnbj0lbHggZ29hbD0lbHggbGltaXQ9JWx4XG4iLAorCQliZGF0YSAtIGJvb3RtZW1fbm9kZV9kYXRhLCBzaXplLCBQQUdFX0FMSUdOKHNpemUpID4+IFBBR0VfU0hJRlQsCisJCWFsaWduLCBnb2FsLCBsaW1pdCk7CisKIAlCVUdfT04oIXNpemUpOwogCUJVR19PTihhbGlnbiAmIChhbGlnbiAtIDEpKTsKIAlCVUdfT04obGltaXQgJiYgZ29hbCArIHNpemUgPiBsaW1pdCk7CkBAIC00NDIsMTAgKzQ0Niw2IEBACiAJaWYgKCFiZGF0YS0+bm9kZV9ib290bWVtX21hcCkKIAkJcmV0dXJuIE5VTEw7CiAKLQliZGVidWcoIm5pZD0ldGQgc2l6ZT0lbHggWyVsdSBwYWdlc10gYWxpZ249JWx4IGdvYWw9JWx4IGxpbWl0PSVseFxuIiwKLQkJYmRhdGEgLSBib290bWVtX25vZGVfZGF0YSwgc2l6ZSwgUEFHRV9BTElHTihzaXplKSA+PiBQQUdFX1NISUZULAotCQlhbGlnbiwgZ29hbCwgbGltaXQpOwotCiAJbWluID0gYmRhdGEtPm5vZGVfbWluX3BmbjsKIAltYXggPSBiZGF0YS0+bm9kZV9sb3dfcGZuOwogCmRpZmYgLS1naXQgYS9tbS9maWxlbWFwLmMgYi9tbS9maWxlbWFwLmMKaW5kZXggZjhjNjkyNy4uY2ViYTBiZCAxMDA2NDQKLS0tIGEvbW0vZmlsZW1hcC5jCisrKyBiL21tL2ZpbGVtYXAuYwpAQCAtMjEwLDcgKzIxMCw3IEBACiAJaW50IHJldDsKIAlzdHJ1Y3Qgd3JpdGViYWNrX2NvbnRyb2wgd2JjID0gewogCQkuc3luY19tb2RlID0gc3luY19tb2RlLAotCQkubnJfdG9fd3JpdGUgPSBtYXBwaW5nLT5ucnBhZ2VzICogMiwKKwkJLm5yX3RvX3dyaXRlID0gTE9OR19NQVgsCiAJCS5yYW5nZV9zdGFydCA9IHN0YXJ0LAogCQkucmFuZ2VfZW5kID0gZW5kLAogCX07CkBAIC00NjAsNyArNDYwLDcgQEAKIAlWTV9CVUdfT04oIVBhZ2VMb2NrZWQocGFnZSkpOwogCiAJZXJyb3IgPSBtZW1fY2dyb3VwX2NhY2hlX2NoYXJnZShwYWdlLCBjdXJyZW50LT5tbSwKLQkJCQkJZ2ZwX21hc2sgJiB+X19HRlBfSElHSE1FTSk7CisJCQkJCWdmcF9tYXNrICYgR0ZQX1JFQ0xBSU1fTUFTSyk7CiAJaWYgKGVycm9yKQogCQlnb3RvIG91dDsKIApAQCAtNzQxLDcgKzc0MSwxNCBAQAogCQlwYWdlID0gX19wYWdlX2NhY2hlX2FsbG9jKGdmcF9tYXNrKTsKIAkJaWYgKCFwYWdlKQogCQkJcmV0dXJuIE5VTEw7Ci0JCWVyciA9IGFkZF90b19wYWdlX2NhY2hlX2xydShwYWdlLCBtYXBwaW5nLCBpbmRleCwgZ2ZwX21hc2spOworCQkvKgorCQkgKiBXZSB3YW50IGEgcmVndWxhciBrZXJuZWwgbWVtb3J5IChub3QgaGlnaG1lbSBvciBETUEgZXRjKQorCQkgKiBhbGxvY2F0aW9uIGZvciB0aGUgcmFkaXggdHJlZSBub2RlcywgYnV0IHdlIG5lZWQgdG8gaG9ub3VyCisJCSAqIHRoZSBjb250ZXh0LXNwZWNpZmljIHJlcXVpcmVtZW50cyB0aGUgY2FsbGVyIGhhcyBhc2tlZCBmb3IuCisJCSAqIEdGUF9SRUNMQUlNX01BU0sgY29sbGVjdHMgdGhvc2UgcmVxdWlyZW1lbnRzLgorCQkgKi8KKwkJZXJyID0gYWRkX3RvX3BhZ2VfY2FjaGVfbHJ1KHBhZ2UsIG1hcHBpbmcsIGluZGV4LAorCQkJKGdmcF9tYXNrICYgR0ZQX1JFQ0xBSU1fTUFTSykpOwogCQlpZiAodW5saWtlbHkoZXJyKSkgewogCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOwogCQkJcGFnZSA9IE5VTEw7CkBAIC05NTAsNyArOTU3LDcgQEAKIAkJcmV0dXJuIE5VTEw7CiAJfQogCXBhZ2UgPSBfX3BhZ2VfY2FjaGVfYWxsb2MobWFwcGluZ19nZnBfbWFzayhtYXBwaW5nKSAmIH5fX0dGUF9GUyk7Ci0JaWYgKHBhZ2UgJiYgYWRkX3RvX3BhZ2VfY2FjaGVfbHJ1KHBhZ2UsIG1hcHBpbmcsIGluZGV4LCBHRlBfS0VSTkVMKSkgeworCWlmIChwYWdlICYmIGFkZF90b19wYWdlX2NhY2hlX2xydShwYWdlLCBtYXBwaW5nLCBpbmRleCwgR0ZQX05PRlMpKSB7CiAJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKIAkJcGFnZSA9IE5VTEw7CiAJfQpAQCAtMTMxNyw3ICsxMzI0LDggQEAKIAkJCWdvdG8gb3V0OyAvKiBza2lwIGF0aW1lICovCiAJCXNpemUgPSBpX3NpemVfcmVhZChpbm9kZSk7CiAJCWlmIChwb3MgPCBzaXplKSB7Ci0JCQlyZXR2YWwgPSBmaWxlbWFwX3dyaXRlX2FuZF93YWl0KG1hcHBpbmcpOworCQkJcmV0dmFsID0gZmlsZW1hcF93cml0ZV9hbmRfd2FpdF9yYW5nZShtYXBwaW5nLCBwb3MsCisJCQkJCXBvcyArIGlvdl9sZW5ndGgoaW92LCBucl9zZWdzKSAtIDEpOwogCQkJaWYgKCFyZXR2YWwpIHsKIAkJCQlyZXR2YWwgPSBtYXBwaW5nLT5hX29wcy0+ZGlyZWN0X0lPKFJFQUQsIGlvY2IsCiAJCQkJCQkJaW92LCBwb3MsIG5yX3NlZ3MpOwpAQCAtMTUzMCw3ICsxNTM4LDYgQEAKIAkvKgogCSAqIEZvdW5kIHRoZSBwYWdlIGFuZCBoYXZlIGEgcmVmZXJlbmNlIG9uIGl0LgogCSAqLwotCW1hcmtfcGFnZV9hY2Nlc3NlZChwYWdlKTsKIAlyYS0+cHJldl9wb3MgPSAobG9mZl90KXBhZ2UtPmluZGV4IDw8IFBBR0VfQ0FDSEVfU0hJRlQ7CiAJdm1mLT5wYWdlID0gcGFnZTsKIAlyZXR1cm4gcmV0IHwgVk1fRkFVTFRfTE9DS0VEOwpAQCAtMTc2Niw3ICsxNzczLDcgQEAKIAlpZiAodW5saWtlbHkoKG1vZGUgJiBTX0lTR0lEKSAmJiAobW9kZSAmIFNfSVhHUlApKSkKIAkJa2lsbCB8PSBBVFRSX0tJTExfU0dJRDsKIAotCWlmICh1bmxpa2VseShraWxsICYmICFjYXBhYmxlKENBUF9GU0VUSUQpKSkKKwlpZiAodW5saWtlbHkoa2lsbCAmJiAhY2FwYWJsZShDQVBfRlNFVElEKSAmJiBTX0lTUkVHKG1vZGUpKSkKIAkJcmV0dXJuIGtpbGw7CiAKIAlyZXR1cm4gMDsKQEAgLTIwNjAsMTggKzIwNjcsMTAgQEAKIAlpZiAoY291bnQgIT0gb2NvdW50KQogCQkqbnJfc2VncyA9IGlvdl9zaG9ydGVuKChzdHJ1Y3QgaW92ZWMgKilpb3YsICpucl9zZWdzLCBjb3VudCk7CiAKLQkvKgotCSAqIFVubWFwIGFsbCBtbWFwcGluZ3Mgb2YgdGhlIGZpbGUgdXAtZnJvbnQuCi0JICoKLQkgKiBUaGlzIHdpbGwgY2F1c2UgYW55IHB0ZSBkaXJ0eSBiaXRzIHRvIGJlIHByb3BhZ2F0ZWQgaW50byB0aGUKLQkgKiBwYWdlZnJhbWVzIGZvciB0aGUgc3Vic2VxdWVudCBmaWxlbWFwX3dyaXRlX2FuZF93YWl0KCkuCi0JICovCiAJd3JpdGVfbGVuID0gaW92X2xlbmd0aChpb3YsICpucl9zZWdzKTsKIAllbmQgPSAocG9zICsgd3JpdGVfbGVuIC0gMSkgPj4gUEFHRV9DQUNIRV9TSElGVDsKLQlpZiAobWFwcGluZ19tYXBwZWQobWFwcGluZykpCi0JCXVubWFwX21hcHBpbmdfcmFuZ2UobWFwcGluZywgcG9zLCB3cml0ZV9sZW4sIDApOwogCi0Jd3JpdHRlbiA9IGZpbGVtYXBfd3JpdGVfYW5kX3dhaXQobWFwcGluZyk7CisJd3JpdHRlbiA9IGZpbGVtYXBfd3JpdGVfYW5kX3dhaXRfcmFuZ2UobWFwcGluZywgcG9zLCBwb3MgKyB3cml0ZV9sZW4gLSAxKTsKIAlpZiAod3JpdHRlbikKIAkJZ290byBvdXQ7CiAKQEAgLTIyOTEsNyArMjI5MCw4IEBACiAJICogdGhlIGZpbGUgZGF0YSBoZXJlLCB0byB0cnkgdG8gaG9ub3VyIE9fRElSRUNUIGV4cGVjdGF0aW9ucy4KIAkgKi8KIAlpZiAodW5saWtlbHkoZmlsZS0+Zl9mbGFncyAmIE9fRElSRUNUKSAmJiB3cml0dGVuKQotCQlzdGF0dXMgPSBmaWxlbWFwX3dyaXRlX2FuZF93YWl0KG1hcHBpbmcpOworCQlzdGF0dXMgPSBmaWxlbWFwX3dyaXRlX2FuZF93YWl0X3JhbmdlKG1hcHBpbmcsCisJCQkJCXBvcywgcG9zICsgd3JpdHRlbiAtIDEpOwogCiAJcmV0dXJuIHdyaXR0ZW4gPyB3cml0dGVuIDogc3RhdHVzOwogfQpkaWZmIC0tZ2l0IGEvbW0vZmlsZW1hcF94aXAuYyBiL21tL2ZpbGVtYXBfeGlwLmMKaW5kZXggYjUxNjdkZi4uMGMwNDYxNSAxMDA2NDQKLS0tIGEvbW0vZmlsZW1hcF94aXAuYworKysgYi9tbS9maWxlbWFwX3hpcC5jCkBAIC0xOTMsNyArMTkzLDcgQEAKIAkJCS8qIE51a2UgdGhlIHBhZ2UgdGFibGUgZW50cnkuICovCiAJCQlmbHVzaF9jYWNoZV9wYWdlKHZtYSwgYWRkcmVzcywgcHRlX3BmbigqcHRlKSk7CiAJCQlwdGV2YWwgPSBwdGVwX2NsZWFyX2ZsdXNoX25vdGlmeSh2bWEsIGFkZHJlc3MsIHB0ZSk7Ci0JCQlwYWdlX3JlbW92ZV9ybWFwKHBhZ2UsIHZtYSk7CisJCQlwYWdlX3JlbW92ZV9ybWFwKHBhZ2UpOwogCQkJZGVjX21tX2NvdW50ZXIobW0sIGZpbGVfcnNzKTsKIAkJCUJVR19PTihwdGVfZGlydHkocHRldmFsKSk7CiAJCQlwdGVfdW5tYXBfdW5sb2NrKHB0ZSwgcHRsKTsKZGlmZiAtLWdpdCBhL21tL2ZyZW1hcC5jIGIvbW0vZnJlbWFwLmMKaW5kZXggN2QxMmNhNy4uNjJkNWJiZCAxMDA2NDQKLS0tIGEvbW0vZnJlbWFwLmMKKysrIGIvbW0vZnJlbWFwLmMKQEAgLTM3LDcgKzM3LDcgQEAKIAkJaWYgKHBhZ2UpIHsKIAkJCWlmIChwdGVfZGlydHkocHRlKSkKIAkJCQlzZXRfcGFnZV9kaXJ0eShwYWdlKTsKLQkJCXBhZ2VfcmVtb3ZlX3JtYXAocGFnZSwgdm1hKTsKKwkJCXBhZ2VfcmVtb3ZlX3JtYXAocGFnZSk7CiAJCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CiAJCQl1cGRhdGVfaGl3YXRlcl9yc3MobW0pOwogCQkJZGVjX21tX2NvdW50ZXIobW0sIGZpbGVfcnNzKTsKZGlmZiAtLWdpdCBhL21tL2h1Z2V0bGIuYyBiL21tL2h1Z2V0bGIuYwppbmRleCA2MDU4YjUzLi42MThlOTgzIDEwMDY0NAotLS0gYS9tbS9odWdldGxiLmMKKysrIGIvbW0vaHVnZXRsYi5jCkBAIC0yMjAsNiArMjIwLDM1IEBACiB9CiAKIC8qCisgKiBSZXR1cm4gdGhlIHNpemUgb2YgdGhlIHBhZ2VzIGFsbG9jYXRlZCB3aGVuIGJhY2tpbmcgYSBWTUEuIEluIHRoZSBtYWpvcml0eQorICogY2FzZXMgdGhpcyB3aWxsIGJlIHNhbWUgc2l6ZSBhcyB1c2VkIGJ5IHRoZSBwYWdlIHRhYmxlIGVudHJpZXMuCisgKi8KK3Vuc2lnbmVkIGxvbmcgdm1hX2tlcm5lbF9wYWdlc2l6ZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwlzdHJ1Y3QgaHN0YXRlICpoc3RhdGU7CisKKwlpZiAoIWlzX3ZtX2h1Z2V0bGJfcGFnZSh2bWEpKQorCQlyZXR1cm4gUEFHRV9TSVpFOworCisJaHN0YXRlID0gaHN0YXRlX3ZtYSh2bWEpOworCisJcmV0dXJuIDFVTCA8PCAoaHN0YXRlLT5vcmRlciArIFBBR0VfU0hJRlQpOworfQorCisvKgorICogUmV0dXJuIHRoZSBwYWdlIHNpemUgYmVpbmcgdXNlZCBieSB0aGUgTU1VIHRvIGJhY2sgYSBWTUEuIEluIHRoZSBtYWpvcml0eQorICogb2YgY2FzZXMsIHRoZSBwYWdlIHNpemUgdXNlZCBieSB0aGUga2VybmVsIG1hdGNoZXMgdGhlIE1NVSBzaXplLiBPbgorICogYXJjaGl0ZWN0dXJlcyB3aGVyZSBpdCBkaWZmZXJzLCBhbiBhcmNoaXRlY3R1cmUtc3BlY2lmaWMgdmVyc2lvbiBvZiB0aGlzCisgKiBmdW5jdGlvbiBpcyByZXF1aXJlZC4KKyAqLworI2lmbmRlZiB2bWFfbW11X3BhZ2VzaXplCit1bnNpZ25lZCBsb25nIHZtYV9tbXVfcGFnZXNpemUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJcmV0dXJuIHZtYV9rZXJuZWxfcGFnZXNpemUodm1hKTsKK30KKyNlbmRpZgorCisvKgogICogRmxhZ3MgZm9yIE1BUF9QUklWQVRFIHJlc2VydmF0aW9ucy4gIFRoZXNlIGFyZSBzdG9yZWQgaW4gdGhlIGJvdHRvbQogICogYml0cyBvZiB0aGUgcmVzZXJ2YXRpb24gbWFwIHBvaW50ZXIsIHdoaWNoIGFyZSBhbHdheXMgY2xlYXIgZHVlIHRvCiAgKiBhbGlnbm1lbnQuCkBAIC0zNzEsOCArNDAwLDEwIEBACiB7CiAJaW50IGk7CiAKLQlpZiAodW5saWtlbHkoc3ogPiBNQVhfT1JERVJfTlJfUEFHRVMpKQotCQlyZXR1cm4gY2xlYXJfZ2lnYW50aWNfcGFnZShwYWdlLCBhZGRyLCBzeik7CisJaWYgKHVubGlrZWx5KHN6ID4gTUFYX09SREVSX05SX1BBR0VTKSkgeworCQljbGVhcl9naWdhbnRpY19wYWdlKHBhZ2UsIGFkZHIsIHN6KTsKKwkJcmV0dXJuOworCX0KIAogCW1pZ2h0X3NsZWVwKCk7CiAJZm9yIChpID0gMDsgaSA8IHN6L1BBR0VfU0laRTsgaSsrKSB7CkBAIC00MDQsOCArNDM1LDEwIEBACiAJaW50IGk7CiAJc3RydWN0IGhzdGF0ZSAqaCA9IGhzdGF0ZV92bWEodm1hKTsKIAotCWlmICh1bmxpa2VseShwYWdlc19wZXJfaHVnZV9wYWdlKGgpID4gTUFYX09SREVSX05SX1BBR0VTKSkKLQkJcmV0dXJuIGNvcHlfZ2lnYW50aWNfcGFnZShkc3QsIHNyYywgYWRkciwgdm1hKTsKKwlpZiAodW5saWtlbHkocGFnZXNfcGVyX2h1Z2VfcGFnZShoKSA+IE1BWF9PUkRFUl9OUl9QQUdFUykpIHsKKwkJY29weV9naWdhbnRpY19wYWdlKGRzdCwgc3JjLCBhZGRyLCB2bWEpOworCQlyZXR1cm47CisJfQogCiAJbWlnaHRfc2xlZXAoKTsKIAlmb3IgKGkgPSAwOyBpIDwgcGFnZXNfcGVyX2h1Z2VfcGFnZShoKTsgaSsrKSB7CkBAIC05NzIsNyArMTAwNSw3IEBACiAJcmV0dXJuIHBhZ2U7CiB9CiAKLV9fYXR0cmlidXRlX18oKHdlYWspKSBpbnQgYWxsb2NfYm9vdG1lbV9odWdlX3BhZ2Uoc3RydWN0IGhzdGF0ZSAqaCkKK2ludCBfX3dlYWsgYWxsb2NfYm9vdG1lbV9odWdlX3BhZ2Uoc3RydWN0IGhzdGF0ZSAqaCkKIHsKIAlzdHJ1Y3QgaHVnZV9ib290bWVtX3BhZ2UgKm07CiAJaW50IG5yX25vZGVzID0gbm9kZXNfd2VpZ2h0KG5vZGVfb25saW5lX21hcCk7CkBAIC05OTEsOCArMTAyNCw3IEBACiAJCQkgKiBwdXRzIHRoZW0gaW50byB0aGUgbWVtX21hcCkuCiAJCQkgKi8KIAkJCW0gPSBhZGRyOwotCQkJaWYgKG0pCi0JCQkJZ290byBmb3VuZDsKKwkJCWdvdG8gZm91bmQ7CiAJCX0KIAkJaHN0YXRlX25leHRfbm9kZShoKTsKIAkJbnJfbm9kZXMtLTsKZGlmZiAtLWdpdCBhL21tL2ludGVybmFsLmggYi9tbS9pbnRlcm5hbC5oCmluZGV4IDEzMzMzYmMuLjQ3ODIyM2IgMTAwNjQ0Ci0tLSBhL21tL2ludGVybmFsLmgKKysrIGIvbW0vaW50ZXJuYWwuaApAQCAtNDksNiArNDksNyBAQAogLyoKICAqIGluIG1tL3BhZ2VfYWxsb2MuYwogICovCitleHRlcm4gdW5zaWduZWQgbG9uZyBoaWdoZXN0X21lbW1hcF9wZm47CiBleHRlcm4gdm9pZCBfX2ZyZWVfcGFnZXNfYm9vdG1lbShzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgaW50IG9yZGVyKTsKIAogLyoKQEAgLTI3NSw2ICsyNzYsNyBAQAogI2RlZmluZSBHVVBfRkxBR1NfV1JJVEUgICAgICAgICAgICAgICAgICAweDEKICNkZWZpbmUgR1VQX0ZMQUdTX0ZPUkNFICAgICAgICAgICAgICAgICAgMHgyCiAjZGVmaW5lIEdVUF9GTEFHU19JR05PUkVfVk1BX1BFUk1JU1NJT05TIDB4NAorI2RlZmluZSBHVVBfRkxBR1NfSUdOT1JFX1NJR0tJTEwgICAgICAgICAweDgKIAogaW50IF9fZ2V0X3VzZXJfcGFnZXMoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAogCQkgICAgIHVuc2lnbmVkIGxvbmcgc3RhcnQsIGludCBsZW4sIGludCBmbGFncywKZGlmZiAtLWdpdCBhL21tL21lbWNvbnRyb2wuYyBiL21tL21lbWNvbnRyb2wuYwppbmRleCA4NjZkY2M3Li5lMjk5NmI4IDEwMDY0NAotLS0gYS9tbS9tZW1jb250cm9sLmMKKysrIGIvbW0vbWVtY29udHJvbC5jCkBAIC0yMSwxMSArMjEsMTMgQEAKICNpbmNsdWRlIDxsaW51eC9tZW1jb250cm9sLmg+CiAjaW5jbHVkZSA8bGludXgvY2dyb3VwLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CiAjaW5jbHVkZSA8bGludXgvc21wLmg+CiAjaW5jbHVkZSA8bGludXgvcGFnZS1mbGFncy5oPgogI2luY2x1ZGUgPGxpbnV4L2JhY2tpbmctZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvYml0X3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvcmN1cGRhdGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9zd2FwLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KQEAgLTM0LDEyICszNiwyMyBAQAogI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KICNpbmNsdWRlIDxsaW51eC9tbV9pbmxpbmUuaD4KICNpbmNsdWRlIDxsaW51eC9wYWdlX2Nncm91cC5oPgorI2luY2x1ZGUgImludGVybmFsLmgiCiAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogCiBzdHJ1Y3QgY2dyb3VwX3N1YnN5cyBtZW1fY2dyb3VwX3N1YnN5cyBfX3JlYWRfbW9zdGx5OwogI2RlZmluZSBNRU1fQ0dST1VQX1JFQ0xBSU1fUkVUUklFUwk1CiAKKyNpZmRlZiBDT05GSUdfQ0dST1VQX01FTV9SRVNfQ1RMUl9TV0FQCisvKiBUdXJuZWQgb24gb25seSB3aGVuIG1lbW9yeSBjZ3JvdXAgaXMgZW5hYmxlZCAmJiByZWFsbHlfZG9fc3dhcF9hY2NvdW50ID0gMCAqLworaW50IGRvX3N3YXBfYWNjb3VudCBfX3JlYWRfbW9zdGx5Oworc3RhdGljIGludCByZWFsbHlfZG9fc3dhcF9hY2NvdW50IF9faW5pdGRhdGEgPSAxOyAvKiBmb3IgcmVtZW1iZXIgYm9vdCBvcHRpb24qLworI2Vsc2UKKyNkZWZpbmUgZG9fc3dhcF9hY2NvdW50CQkoMCkKKyNlbmRpZgorCitzdGF0aWMgREVGSU5FX01VVEVYKG1lbWNnX3Rhc2tsaXN0KTsJLyogY2FuIGJlIGhvbGQgdW5kZXIgY2dyb3VwX211dGV4ICovCisKIC8qCiAgKiBTdGF0aXN0aWNzIGZvciBtZW1vcnkgY2dyb3VwLgogICovCkBAIC02MCw3ICs3Myw3IEBACiB9IF9fX19jYWNoZWxpbmVfYWxpZ25lZF9pbl9zbXA7CiAKIHN0cnVjdCBtZW1fY2dyb3VwX3N0YXQgewotCXN0cnVjdCBtZW1fY2dyb3VwX3N0YXRfY3B1IGNwdXN0YXRbTlJfQ1BVU107CisJc3RydWN0IG1lbV9jZ3JvdXBfc3RhdF9jcHUgY3B1c3RhdFswXTsKIH07CiAKIC8qCkBAIC04OSw5ICsxMDIsMTAgQEAKIAkvKgogCSAqIHNwaW5fbG9jayB0byBwcm90ZWN0IHRoZSBwZXIgY2dyb3VwIExSVQogCSAqLwotCXNwaW5sb2NrX3QJCWxydV9sb2NrOwogCXN0cnVjdCBsaXN0X2hlYWQJbGlzdHNbTlJfTFJVX0xJU1RTXTsKIAl1bnNpZ25lZCBsb25nCQljb3VudFtOUl9MUlVfTElTVFNdOworCisJc3RydWN0IHpvbmVfcmVjbGFpbV9zdGF0IHJlY2xhaW1fc3RhdDsKIH07CiAvKiBNYWNybyBmb3IgYWNjZXNzaW5nIGNvdW50ZXIgKi8KICNkZWZpbmUgTUVNX0NHUk9VUF9aU1RBVChteiwgaWR4KQkoKG16KS0+Y291bnRbKGlkeCldKQpAQCAtMTIyLDQ0ICsxMzYsNzMgQEAKIAkgKi8KIAlzdHJ1Y3QgcmVzX2NvdW50ZXIgcmVzOwogCS8qCisJICogdGhlIGNvdW50ZXIgdG8gYWNjb3VudCBmb3IgbWVtK3N3YXAgdXNhZ2UuCisJICovCisJc3RydWN0IHJlc19jb3VudGVyIG1lbXN3OworCS8qCiAJICogUGVyIGNncm91cCBhY3RpdmUgYW5kIGluYWN0aXZlIGxpc3QsIHNpbWlsYXIgdG8gdGhlCiAJICogcGVyIHpvbmUgTFJVIGxpc3RzLgogCSAqLwogCXN0cnVjdCBtZW1fY2dyb3VwX2xydV9pbmZvIGluZm87CiAKLQlpbnQJcHJldl9wcmlvcml0eTsJLyogZm9yIHJlY29yZGluZyByZWNsYWltIHByaW9yaXR5ICovCiAJLyoKLQkgKiBzdGF0aXN0aWNzLgorCSAgcHJvdGVjdCBhZ2FpbnN0IHJlY2xhaW0gcmVsYXRlZCBtZW1iZXIuCisJKi8KKwlzcGlubG9ja190IHJlY2xhaW1fcGFyYW1fbG9jazsKKworCWludAlwcmV2X3ByaW9yaXR5OwkvKiBmb3IgcmVjb3JkaW5nIHJlY2xhaW0gcHJpb3JpdHkgKi8KKworCS8qCisJICogV2hpbGUgcmVjbGFpbWluZyBpbiBhIGhpZWFyY2h5LCB3ZSBjYWNoZSB0aGUgbGFzdCBjaGlsZCB3ZQorCSAqIHJlY2xhaW1lZCBmcm9tLiBQcm90ZWN0ZWQgYnkgaGllcmFyY2h5X211dGV4CisJICovCisJc3RydWN0IG1lbV9jZ3JvdXAgKmxhc3Rfc2Nhbm5lZF9jaGlsZDsKKwkvKgorCSAqIFNob3VsZCB0aGUgYWNjb3VudGluZyBhbmQgY29udHJvbCBiZSBoaWVyYXJjaGljYWwsIHBlciBzdWJ0cmVlPworCSAqLworCWJvb2wgdXNlX2hpZXJhcmNoeTsKKwl1bnNpZ25lZCBsb25nCWxhc3Rfb29tX2ppZmZpZXM7CisJYXRvbWljX3QJcmVmY250OworCisJdW5zaWduZWQgaW50CXN3YXBwaW5lc3M7CisKKwkvKgorCSAqIHN0YXRpc3RpY3MuIFRoaXMgbXVzdCBiZSBwbGFjZWQgYXQgdGhlIGVuZCBvZiBtZW1jZy4KIAkgKi8KIAlzdHJ1Y3QgbWVtX2Nncm91cF9zdGF0IHN0YXQ7CiB9Owotc3RhdGljIHN0cnVjdCBtZW1fY2dyb3VwIGluaXRfbWVtX2Nncm91cDsKIAogZW51bSBjaGFyZ2VfdHlwZSB7CiAJTUVNX0NHUk9VUF9DSEFSR0VfVFlQRV9DQUNIRSA9IDAsCiAJTUVNX0NHUk9VUF9DSEFSR0VfVFlQRV9NQVBQRUQsCiAJTUVNX0NHUk9VUF9DSEFSR0VfVFlQRV9TSE1FTSwJLyogdXNlZCBieSBwYWdlIG1pZ3JhdGlvbiBvZiBzaG1lbSAqLwogCU1FTV9DR1JPVVBfQ0hBUkdFX1RZUEVfRk9SQ0UsCS8qIHVzZWQgYnkgZm9yY2VfZW1wdHkgKi8KKwlNRU1fQ0dST1VQX0NIQVJHRV9UWVBFX1NXQVBPVVQsCS8qIGZvciBhY2NvdW50aW5nIHN3YXBjYWNoZSAqLwogCU5SX0NIQVJHRV9UWVBFLAogfTsKIAogLyogb25seSBmb3IgaGVyZSAoZm9yIGVhc3kgcmVhZGluZy4pICovCiAjZGVmaW5lIFBDR0ZfQ0FDSEUJKDFVTCA8PCBQQ0dfQ0FDSEUpCiAjZGVmaW5lIFBDR0ZfVVNFRAkoMVVMIDw8IFBDR19VU0VEKQotI2RlZmluZSBQQ0dGX0FDVElWRQkoMVVMIDw8IFBDR19BQ1RJVkUpCiAjZGVmaW5lIFBDR0ZfTE9DSwkoMVVMIDw8IFBDR19MT0NLKQotI2RlZmluZSBQQ0dGX0ZJTEUJKDFVTCA8PCBQQ0dfRklMRSkKIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nCiBwY2dfZGVmYXVsdF9mbGFnc1tOUl9DSEFSR0VfVFlQRV0gPSB7Ci0JUENHRl9DQUNIRSB8IFBDR0ZfRklMRSB8IFBDR0ZfVVNFRCB8IFBDR0ZfTE9DSywgLyogRmlsZSBDYWNoZSAqLwotCVBDR0ZfQUNUSVZFIHwgUENHRl9VU0VEIHwgUENHRl9MT0NLLCAvKiBBbm9uICovCi0JUENHRl9BQ1RJVkUgfCBQQ0dGX0NBQ0hFIHwgUENHRl9VU0VEIHwgUENHRl9MT0NLLCAvKiBTaG1lbSAqLworCVBDR0ZfQ0FDSEUgfCBQQ0dGX1VTRUQgfCBQQ0dGX0xPQ0ssIC8qIEZpbGUgQ2FjaGUgKi8KKwlQQ0dGX1VTRUQgfCBQQ0dGX0xPQ0ssIC8qIEFub24gKi8KKwlQQ0dGX0NBQ0hFIHwgUENHRl9VU0VEIHwgUENHRl9MT0NLLCAvKiBTaG1lbSAqLwogCTAsIC8qIEZPUkNFICovCiB9OwogCi0vKgotICogQWx3YXlzIG1vZGlmaWVkIHVuZGVyIGxydSBsb2NrLiBUaGVuLCBub3QgbmVjZXNzYXJ5IHRvIHByZWVtcHRfZGlzYWJsZSgpCi0gKi8KKy8qIGZvciBlbmNvZGluZyBjZnQtPnByaXZhdGUgdmFsdWUgb24gZmlsZSAqLworI2RlZmluZSBfTUVNCQkJKDApCisjZGVmaW5lIF9NRU1TV0FQCQkoMSkKKyNkZWZpbmUgTUVNRklMRV9QUklWQVRFKHgsIHZhbCkJKCgoeCkgPDwgMTYpIHwgKHZhbCkpCisjZGVmaW5lIE1FTUZJTEVfVFlQRSh2YWwpCSgoKHZhbCkgPj4gMTYpICYgMHhmZmZmKQorI2RlZmluZSBNRU1GSUxFX0FUVFIodmFsKQkoKHZhbCkgJiAweGZmZmYpCisKK3N0YXRpYyB2b2lkIG1lbV9jZ3JvdXBfZ2V0KHN0cnVjdCBtZW1fY2dyb3VwICptZW0pOworc3RhdGljIHZvaWQgbWVtX2Nncm91cF9wdXQoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSk7CisKIHN0YXRpYyB2b2lkIG1lbV9jZ3JvdXBfY2hhcmdlX3N0YXRpc3RpY3Moc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSwKIAkJCQkJIHN0cnVjdCBwYWdlX2Nncm91cCAqcGMsCiAJCQkJCSBib29sIGNoYXJnZSkKQEAgLTE2NywxMCArMjEwLDkgQEAKIAlpbnQgdmFsID0gKGNoYXJnZSk/IDEgOiAtMTsKIAlzdHJ1Y3QgbWVtX2Nncm91cF9zdGF0ICpzdGF0ID0gJm1lbS0+c3RhdDsKIAlzdHJ1Y3QgbWVtX2Nncm91cF9zdGF0X2NwdSAqY3B1c3RhdDsKKwlpbnQgY3B1ID0gZ2V0X2NwdSgpOwogCi0JVk1fQlVHX09OKCFpcnFzX2Rpc2FibGVkKCkpOwotCi0JY3B1c3RhdCA9ICZzdGF0LT5jcHVzdGF0W3NtcF9wcm9jZXNzb3JfaWQoKV07CisJY3B1c3RhdCA9ICZzdGF0LT5jcHVzdGF0W2NwdV07CiAJaWYgKFBhZ2VDZ3JvdXBDYWNoZShwYykpCiAJCV9fbWVtX2Nncm91cF9zdGF0X2FkZF9zYWZlKGNwdXN0YXQsIE1FTV9DR1JPVVBfU1RBVF9DQUNIRSwgdmFsKTsKIAllbHNlCkBAIC0xODIsNiArMjI0LDcgQEAKIAllbHNlCiAJCV9fbWVtX2Nncm91cF9zdGF0X2FkZF9zYWZlKGNwdXN0YXQsCiAJCQkJTUVNX0NHUk9VUF9TVEFUX1BHUEdPVVRfQ09VTlQsIDEpOworCXB1dF9jcHUoKTsKIH0KIAogc3RhdGljIHN0cnVjdCBtZW1fY2dyb3VwX3Blcl96b25lICoKQEAgLTE5Nyw2ICsyNDAsOSBAQAogCWludCBuaWQgPSBwYWdlX2Nncm91cF9uaWQocGMpOwogCWludCB6aWQgPSBwYWdlX2Nncm91cF96aWQocGMpOwogCisJaWYgKCFtZW0pCisJCXJldHVybiBOVUxMOworCiAJcmV0dXJuIG1lbV9jZ3JvdXBfem9uZWluZm8obWVtLCBuaWQsIHppZCk7CiB9CiAKQEAgLTIzNiw3OSArMjgyLDE1NCBAQAogCQkJCXN0cnVjdCBtZW1fY2dyb3VwLCBjc3MpOwogfQogCi1zdGF0aWMgdm9pZCBfX21lbV9jZ3JvdXBfcmVtb3ZlX2xpc3Qoc3RydWN0IG1lbV9jZ3JvdXBfcGVyX3pvbmUgKm16LAotCQkJc3RydWN0IHBhZ2VfY2dyb3VwICpwYykKK3N0YXRpYyBzdHJ1Y3QgbWVtX2Nncm91cCAqdHJ5X2dldF9tZW1fY2dyb3VwX2Zyb21fbW0oc3RydWN0IG1tX3N0cnVjdCAqbW0pCiB7Ci0JaW50IGxydSA9IExSVV9CQVNFOworCXN0cnVjdCBtZW1fY2dyb3VwICptZW0gPSBOVUxMOworCS8qCisJICogQmVjYXVzZSB3ZSBoYXZlIG5vIGxvY2tzLCBtbS0+b3duZXIncyBtYXkgYmUgYmVpbmcgbW92ZWQgdG8gb3RoZXIKKwkgKiBjZ3JvdXAuIFdlIHVzZSBjc3NfdHJ5Z2V0KCkgaGVyZSBldmVuIGlmIHRoaXMgbG9va3MKKwkgKiBwZXNzaW1pc3RpYyAocmF0aGVyIHRoYW4gYWRkaW5nIGxvY2tzIGhlcmUpLgorCSAqLworCXJjdV9yZWFkX2xvY2soKTsKKwlkbyB7CisJCW1lbSA9IG1lbV9jZ3JvdXBfZnJvbV90YXNrKHJjdV9kZXJlZmVyZW5jZShtbS0+b3duZXIpKTsKKwkJaWYgKHVubGlrZWx5KCFtZW0pKQorCQkJYnJlYWs7CisJfSB3aGlsZSAoIWNzc190cnlnZXQoJm1lbS0+Y3NzKSk7CisJcmN1X3JlYWRfdW5sb2NrKCk7CisJcmV0dXJuIG1lbTsKK30KIAotCWlmIChQYWdlQ2dyb3VwVW5ldmljdGFibGUocGMpKQotCQlscnUgPSBMUlVfVU5FVklDVEFCTEU7Ci0JZWxzZSB7Ci0JCWlmIChQYWdlQ2dyb3VwQWN0aXZlKHBjKSkKLQkJCWxydSArPSBMUlVfQUNUSVZFOwotCQlpZiAoUGFnZUNncm91cEZpbGUocGMpKQotCQkJbHJ1ICs9IExSVV9GSUxFOwotCX0KK3N0YXRpYyBib29sIG1lbV9jZ3JvdXBfaXNfb2Jzb2xldGUoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSkKK3sKKwlpZiAoIW1lbSkKKwkJcmV0dXJuIHRydWU7CisJcmV0dXJuIGNzc19pc19yZW1vdmVkKCZtZW0tPmNzcyk7Cit9CiAKKy8qCisgKiBGb2xsb3dpbmcgTFJVIGZ1bmN0aW9ucyBhcmUgYWxsb3dlZCB0byBiZSB1c2VkIHdpdGhvdXQgUENHX0xPQ0suCisgKiBPcGVyYXRpb25zIGFyZSBjYWxsZWQgYnkgcm91dGluZSBvZiBnbG9iYWwgTFJVIGluZGVwZW5kZW50bHkgZnJvbSBtZW1jZy4KKyAqIFdoYXQgd2UgaGF2ZSB0byB0YWtlIGNhcmUgb2YgaGVyZSBpcyB2YWxpZG5lc3Mgb2YgcGMtPm1lbV9jZ3JvdXAuCisgKgorICogQ2hhbmdlcyB0byBwYy0+bWVtX2Nncm91cCBoYXBwZW5zIHdoZW4KKyAqIDEuIGNoYXJnZQorICogMi4gbW92aW5nIGFjY291bnQKKyAqIEluIHR5cGljYWwgY2FzZSwgImNoYXJnZSIgaXMgZG9uZSBiZWZvcmUgYWRkLXRvLWxydS4gRXhjZXB0aW9uIGlzIFN3YXBDYWNoZS4KKyAqIEl0IGlzIGFkZGVkIHRvIExSVSBiZWZvcmUgY2hhcmdlLgorICogSWYgUENHX1VTRUQgYml0IGlzIG5vdCBzZXQsIHBhZ2VfY2dyb3VwIGlzIG5vdCBhZGRlZCB0byB0aGlzIHByaXZhdGUgTFJVLgorICogV2hlbiBtb3ZpbmcgYWNjb3VudCwgdGhlIHBhZ2UgaXMgbm90IG9uIExSVS4gSXQncyBpc29sYXRlZC4KKyAqLworCit2b2lkIG1lbV9jZ3JvdXBfZGVsX2xydV9saXN0KHN0cnVjdCBwYWdlICpwYWdlLCBlbnVtIGxydV9saXN0IGxydSkKK3sKKwlzdHJ1Y3QgcGFnZV9jZ3JvdXAgKnBjOworCXN0cnVjdCBtZW1fY2dyb3VwICptZW07CisJc3RydWN0IG1lbV9jZ3JvdXBfcGVyX3pvbmUgKm16OworCisJaWYgKG1lbV9jZ3JvdXBfZGlzYWJsZWQoKSkKKwkJcmV0dXJuOworCXBjID0gbG9va3VwX3BhZ2VfY2dyb3VwKHBhZ2UpOworCS8qIGNhbiBoYXBwZW4gd2hpbGUgd2UgaGFuZGxlIHN3YXBjYWNoZS4gKi8KKwlpZiAobGlzdF9lbXB0eSgmcGMtPmxydSkgfHwgIXBjLT5tZW1fY2dyb3VwKQorCQlyZXR1cm47CisJLyoKKwkgKiBXZSBkb24ndCBjaGVjayBQQ0dfVVNFRCBiaXQuIEl0J3MgY2xlYXJlZCB3aGVuIHRoZSAicGFnZSIgaXMgZmluYWxseQorCSAqIHJlbW92ZWQgZnJvbSBnbG9iYWwgTFJVLgorCSAqLworCW16ID0gcGFnZV9jZ3JvdXBfem9uZWluZm8ocGMpOworCW1lbSA9IHBjLT5tZW1fY2dyb3VwOwogCU1FTV9DR1JPVVBfWlNUQVQobXosIGxydSkgLT0gMTsKLQotCW1lbV9jZ3JvdXBfY2hhcmdlX3N0YXRpc3RpY3MocGMtPm1lbV9jZ3JvdXAsIHBjLCBmYWxzZSk7Ci0JbGlzdF9kZWwoJnBjLT5scnUpOworCWxpc3RfZGVsX2luaXQoJnBjLT5scnUpOworCXJldHVybjsKIH0KIAotc3RhdGljIHZvaWQgX19tZW1fY2dyb3VwX2FkZF9saXN0KHN0cnVjdCBtZW1fY2dyb3VwX3Blcl96b25lICpteiwKLQkJCQlzdHJ1Y3QgcGFnZV9jZ3JvdXAgKnBjKQordm9pZCBtZW1fY2dyb3VwX2RlbF9scnUoc3RydWN0IHBhZ2UgKnBhZ2UpCiB7Ci0JaW50IGxydSA9IExSVV9CQVNFOwotCi0JaWYgKFBhZ2VDZ3JvdXBVbmV2aWN0YWJsZShwYykpCi0JCWxydSA9IExSVV9VTkVWSUNUQUJMRTsKLQllbHNlIHsKLQkJaWYgKFBhZ2VDZ3JvdXBBY3RpdmUocGMpKQotCQkJbHJ1ICs9IExSVV9BQ1RJVkU7Ci0JCWlmIChQYWdlQ2dyb3VwRmlsZShwYykpCi0JCQlscnUgKz0gTFJVX0ZJTEU7Ci0JfQotCi0JTUVNX0NHUk9VUF9aU1RBVChteiwgbHJ1KSArPSAxOwotCWxpc3RfYWRkKCZwYy0+bHJ1LCAmbXotPmxpc3RzW2xydV0pOwotCi0JbWVtX2Nncm91cF9jaGFyZ2Vfc3RhdGlzdGljcyhwYy0+bWVtX2Nncm91cCwgcGMsIHRydWUpOworCW1lbV9jZ3JvdXBfZGVsX2xydV9saXN0KHBhZ2UsIHBhZ2VfbHJ1KHBhZ2UpKTsKIH0KIAotc3RhdGljIHZvaWQgX19tZW1fY2dyb3VwX21vdmVfbGlzdHMoc3RydWN0IHBhZ2VfY2dyb3VwICpwYywgZW51bSBscnVfbGlzdCBscnUpCit2b2lkIG1lbV9jZ3JvdXBfcm90YXRlX2xydV9saXN0KHN0cnVjdCBwYWdlICpwYWdlLCBlbnVtIGxydV9saXN0IGxydSkKIHsKLQlzdHJ1Y3QgbWVtX2Nncm91cF9wZXJfem9uZSAqbXogPSBwYWdlX2Nncm91cF96b25laW5mbyhwYyk7Ci0JaW50IGFjdGl2ZSAgICA9IFBhZ2VDZ3JvdXBBY3RpdmUocGMpOwotCWludCBmaWxlICAgICAgPSBQYWdlQ2dyb3VwRmlsZShwYyk7Ci0JaW50IHVuZXZpY3RhYmxlID0gUGFnZUNncm91cFVuZXZpY3RhYmxlKHBjKTsKLQllbnVtIGxydV9saXN0IGZyb20gPSB1bmV2aWN0YWJsZSA/IExSVV9VTkVWSUNUQUJMRSA6Ci0JCQkJKExSVV9GSUxFICogISFmaWxlICsgISFhY3RpdmUpOworCXN0cnVjdCBtZW1fY2dyb3VwX3Blcl96b25lICptejsKKwlzdHJ1Y3QgcGFnZV9jZ3JvdXAgKnBjOwogCi0JaWYgKGxydSA9PSBmcm9tKQorCWlmIChtZW1fY2dyb3VwX2Rpc2FibGVkKCkpCiAJCXJldHVybjsKIAotCU1FTV9DR1JPVVBfWlNUQVQobXosIGZyb20pIC09IDE7Ci0JLyoKLQkgKiBIb3dldmVyIHRoaXMgaXMgZG9uZSB1bmRlciBtei0+bHJ1X2xvY2ssIGFub3RoZXIgZmxhZ3MsIHdoaWNoCi0JICogYXJlIG5vdCByZWxhdGVkIHRvIExSVSwgd2lsbCBiZSBtb2RpZmllZCBmcm9tIG91dC1vZi1sb2NrLgotCSAqIFdlIGhhdmUgdG8gdXNlIGF0b21pYyBzZXQvY2xlYXIgZmxhZ3MuCi0JICovCi0JaWYgKGlzX3VuZXZpY3RhYmxlX2xydShscnUpKSB7Ci0JCUNsZWFyUGFnZUNncm91cEFjdGl2ZShwYyk7Ci0JCVNldFBhZ2VDZ3JvdXBVbmV2aWN0YWJsZShwYyk7Ci0JfSBlbHNlIHsKLQkJaWYgKGlzX2FjdGl2ZV9scnUobHJ1KSkKLQkJCVNldFBhZ2VDZ3JvdXBBY3RpdmUocGMpOwotCQllbHNlCi0JCQlDbGVhclBhZ2VDZ3JvdXBBY3RpdmUocGMpOwotCQlDbGVhclBhZ2VDZ3JvdXBVbmV2aWN0YWJsZShwYyk7Ci0JfQotCi0JTUVNX0NHUk9VUF9aU1RBVChteiwgbHJ1KSArPSAxOworCXBjID0gbG9va3VwX3BhZ2VfY2dyb3VwKHBhZ2UpOworCXNtcF9ybWIoKTsKKwkvKiB1bnVzZWQgcGFnZSBpcyBub3Qgcm90YXRlZC4gKi8KKwlpZiAoIVBhZ2VDZ3JvdXBVc2VkKHBjKSkKKwkJcmV0dXJuOworCW16ID0gcGFnZV9jZ3JvdXBfem9uZWluZm8ocGMpOwogCWxpc3RfbW92ZSgmcGMtPmxydSwgJm16LT5saXN0c1tscnVdKTsKIH0KIAordm9pZCBtZW1fY2dyb3VwX2FkZF9scnVfbGlzdChzdHJ1Y3QgcGFnZSAqcGFnZSwgZW51bSBscnVfbGlzdCBscnUpCit7CisJc3RydWN0IHBhZ2VfY2dyb3VwICpwYzsKKwlzdHJ1Y3QgbWVtX2Nncm91cF9wZXJfem9uZSAqbXo7CisKKwlpZiAobWVtX2Nncm91cF9kaXNhYmxlZCgpKQorCQlyZXR1cm47CisJcGMgPSBsb29rdXBfcGFnZV9jZ3JvdXAocGFnZSk7CisJLyogYmFycmllciB0byBzeW5jIHdpdGggImNoYXJnZSIgKi8KKwlzbXBfcm1iKCk7CisJaWYgKCFQYWdlQ2dyb3VwVXNlZChwYykpCisJCXJldHVybjsKKworCW16ID0gcGFnZV9jZ3JvdXBfem9uZWluZm8ocGMpOworCU1FTV9DR1JPVVBfWlNUQVQobXosIGxydSkgKz0gMTsKKwlsaXN0X2FkZCgmcGMtPmxydSwgJm16LT5saXN0c1tscnVdKTsKK30KKworLyoKKyAqIEF0IGhhbmRsaW5nIFN3YXBDYWNoZSwgcGMtPm1lbV9jZ3JvdXAgbWF5IGJlIGNoYW5nZWQgd2hpbGUgaXQncyBsaW5rZWQgdG8KKyAqIGxydSBiZWNhdXNlIHRoZSBwYWdlIG1heS5iZSByZXVzZWQgYWZ0ZXIgaXQncyBmdWxseSB1bmNoYXJnZWQgKGJlY2F1c2Ugb2YKKyAqIFN3YXBDYWNoZSBiZWhhdmlvcikuVG8gaGFuZGxlIHRoYXQsIHVubGluayBwYWdlX2Nncm91cCBmcm9tIExSVSB3aGVuIGNoYXJnZQorICogaXQgYWdhaW4uIFRoaXMgZnVuY3Rpb24gaXMgb25seSB1c2VkIHRvIGNoYXJnZSBTd2FwQ2FjaGUuIEl0J3MgZG9uZSB1bmRlcgorICogbG9ja19wYWdlIGFuZCBleHBlY3RlZCB0aGF0IHpvbmUtPmxydV9sb2NrIGlzIG5ldmVyIGhlbGQuCisgKi8KK3N0YXRpYyB2b2lkIG1lbV9jZ3JvdXBfbHJ1X2RlbF9iZWZvcmVfY29tbWl0X3N3YXBjYWNoZShzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCB6b25lICp6b25lID0gcGFnZV96b25lKHBhZ2UpOworCXN0cnVjdCBwYWdlX2Nncm91cCAqcGMgPSBsb29rdXBfcGFnZV9jZ3JvdXAocGFnZSk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmem9uZS0+bHJ1X2xvY2ssIGZsYWdzKTsKKwkvKgorCSAqIEZvcmdldCBvbGQgTFJVIHdoZW4gdGhpcyBwYWdlX2Nncm91cCBpcyAqbm90KiB1c2VkLiBUaGlzIFVzZWQgYml0CisJICogaXMgZ3VhcmRlZCBieSBsb2NrX3BhZ2UoKSBiZWNhdXNlIHRoZSBwYWdlIGlzIFN3YXBDYWNoZS4KKwkgKi8KKwlpZiAoIVBhZ2VDZ3JvdXBVc2VkKHBjKSkKKwkJbWVtX2Nncm91cF9kZWxfbHJ1X2xpc3QocGFnZSwgcGFnZV9scnUocGFnZSkpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnpvbmUtPmxydV9sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIG1lbV9jZ3JvdXBfbHJ1X2FkZF9hZnRlcl9jb21taXRfc3dhcGNhY2hlKHN0cnVjdCBwYWdlICpwYWdlKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHpvbmUgKnpvbmUgPSBwYWdlX3pvbmUocGFnZSk7CisJc3RydWN0IHBhZ2VfY2dyb3VwICpwYyA9IGxvb2t1cF9wYWdlX2Nncm91cChwYWdlKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ6b25lLT5scnVfbG9jaywgZmxhZ3MpOworCS8qIGxpbmsgd2hlbiB0aGUgcGFnZSBpcyBsaW5rZWQgdG8gTFJVIGJ1dCBwYWdlX2Nncm91cCBpc24ndCAqLworCWlmIChQYWdlTFJVKHBhZ2UpICYmIGxpc3RfZW1wdHkoJnBjLT5scnUpKQorCQltZW1fY2dyb3VwX2FkZF9scnVfbGlzdChwYWdlLCBwYWdlX2xydShwYWdlKSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmem9uZS0+bHJ1X2xvY2ssIGZsYWdzKTsKK30KKworCit2b2lkIG1lbV9jZ3JvdXBfbW92ZV9saXN0cyhzdHJ1Y3QgcGFnZSAqcGFnZSwKKwkJCSAgIGVudW0gbHJ1X2xpc3QgZnJvbSwgZW51bSBscnVfbGlzdCB0bykKK3sKKwlpZiAobWVtX2Nncm91cF9kaXNhYmxlZCgpKQorCQlyZXR1cm47CisJbWVtX2Nncm91cF9kZWxfbHJ1X2xpc3QocGFnZSwgZnJvbSk7CisJbWVtX2Nncm91cF9hZGRfbHJ1X2xpc3QocGFnZSwgdG8pOworfQorCiBpbnQgdGFza19pbl9tZW1fY2dyb3VwKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgY29uc3Qgc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSkKIHsKIAlpbnQgcmV0OwpAQCAtMzIwLDM3ICs0NDEsNiBAQAogfQogCiAvKgotICogVGhpcyByb3V0aW5lIGFzc3VtZXMgdGhhdCB0aGUgYXBwcm9wcmlhdGUgem9uZSdzIGxydSBsb2NrIGlzIGFscmVhZHkgaGVsZAotICovCi12b2lkIG1lbV9jZ3JvdXBfbW92ZV9saXN0cyhzdHJ1Y3QgcGFnZSAqcGFnZSwgZW51bSBscnVfbGlzdCBscnUpCi17Ci0Jc3RydWN0IHBhZ2VfY2dyb3VwICpwYzsKLQlzdHJ1Y3QgbWVtX2Nncm91cF9wZXJfem9uZSAqbXo7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWlmIChtZW1fY2dyb3VwX3N1YnN5cy5kaXNhYmxlZCkKLQkJcmV0dXJuOwotCi0JLyoKLQkgKiBXZSBjYW5ub3QgbG9ja19wYWdlX2Nncm91cCB3aGlsZSBob2xkaW5nIHpvbmUncyBscnVfbG9jaywKLQkgKiBiZWNhdXNlIG90aGVyIGhvbGRlcnMgb2YgbG9ja19wYWdlX2Nncm91cCBjYW4gYmUgaW50ZXJydXB0ZWQKLQkgKiB3aXRoIGFuIGF0dGVtcHQgdG8gcm90YXRlX3JlY2xhaW1hYmxlX3BhZ2UuICBCdXQgd2UgY2Fubm90Ci0JICogc2FmZWx5IGdldCB0byBwYWdlX2Nncm91cCB3aXRob3V0IGl0LCBzbyBqdXN0IHRyeV9sb2NrIGl0OgotCSAqIG1lbV9jZ3JvdXBfaXNvbGF0ZV9wYWdlcyBhbGxvd3MgZm9yIHBhZ2UgbGVmdCBvbiB3cm9uZyBsaXN0LgotCSAqLwotCXBjID0gbG9va3VwX3BhZ2VfY2dyb3VwKHBhZ2UpOwotCWlmICghdHJ5bG9ja19wYWdlX2Nncm91cChwYykpCi0JCXJldHVybjsKLQlpZiAocGMgJiYgUGFnZUNncm91cFVzZWQocGMpKSB7Ci0JCW16ID0gcGFnZV9jZ3JvdXBfem9uZWluZm8ocGMpOwotCQlzcGluX2xvY2tfaXJxc2F2ZSgmbXotPmxydV9sb2NrLCBmbGFncyk7Ci0JCV9fbWVtX2Nncm91cF9tb3ZlX2xpc3RzKHBjLCBscnUpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtei0+bHJ1X2xvY2ssIGZsYWdzKTsKLQl9Ci0JdW5sb2NrX3BhZ2VfY2dyb3VwKHBjKTsKLX0KLQotLyoKICAqIENhbGN1bGF0ZSBtYXBwZWRfcmF0aW8gdW5kZXIgbWVtb3J5IGNvbnRyb2xsZXIuIFRoaXMgd2lsbCBiZSB1c2VkIGluCiAgKiB2bXNjYW4uYyBmb3IgZGV0ZXJlbWluaW5nIHdlIGhhdmUgdG8gcmVjbGFpbSBtYXBwZWQgcGFnZXMuCiAgKi8KQEAgLTM3MiwzOSArNDYyLDEwOCBAQAogICovCiBpbnQgbWVtX2Nncm91cF9nZXRfcmVjbGFpbV9wcmlvcml0eShzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtKQogewotCXJldHVybiBtZW0tPnByZXZfcHJpb3JpdHk7CisJaW50IHByZXZfcHJpb3JpdHk7CisKKwlzcGluX2xvY2soJm1lbS0+cmVjbGFpbV9wYXJhbV9sb2NrKTsKKwlwcmV2X3ByaW9yaXR5ID0gbWVtLT5wcmV2X3ByaW9yaXR5OworCXNwaW5fdW5sb2NrKCZtZW0tPnJlY2xhaW1fcGFyYW1fbG9jayk7CisKKwlyZXR1cm4gcHJldl9wcmlvcml0eTsKIH0KIAogdm9pZCBtZW1fY2dyb3VwX25vdGVfcmVjbGFpbV9wcmlvcml0eShzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtLCBpbnQgcHJpb3JpdHkpCiB7CisJc3Bpbl9sb2NrKCZtZW0tPnJlY2xhaW1fcGFyYW1fbG9jayk7CiAJaWYgKHByaW9yaXR5IDwgbWVtLT5wcmV2X3ByaW9yaXR5KQogCQltZW0tPnByZXZfcHJpb3JpdHkgPSBwcmlvcml0eTsKKwlzcGluX3VubG9jaygmbWVtLT5yZWNsYWltX3BhcmFtX2xvY2spOwogfQogCiB2b2lkIG1lbV9jZ3JvdXBfcmVjb3JkX3JlY2xhaW1fcHJpb3JpdHkoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSwgaW50IHByaW9yaXR5KQogeworCXNwaW5fbG9jaygmbWVtLT5yZWNsYWltX3BhcmFtX2xvY2spOwogCW1lbS0+cHJldl9wcmlvcml0eSA9IHByaW9yaXR5OworCXNwaW5fdW5sb2NrKCZtZW0tPnJlY2xhaW1fcGFyYW1fbG9jayk7CiB9CiAKLS8qCi0gKiBDYWxjdWxhdGUgIyBvZiBwYWdlcyB0byBiZSBzY2FubmVkIGluIHRoaXMgcHJpb3JpdHkvem9uZS4KLSAqIFNlZSBhbHNvIHZtc2Nhbi5jCi0gKgotICogcHJpb3JpdHkgc3RhcnRzIGZyb20gIkRFRl9QUklPUklUWSIgYW5kIGRlY3JlbWVudGVkIGluIGVhY2ggbG9vcC4KLSAqIChzZWUgaW5jbHVkZS9saW51eC9tbXpvbmUuaCkKLSAqLwotCi1sb25nIG1lbV9jZ3JvdXBfY2FsY19yZWNsYWltKHN0cnVjdCBtZW1fY2dyb3VwICptZW0sIHN0cnVjdCB6b25lICp6b25lLAotCQkJCQlpbnQgcHJpb3JpdHksIGVudW0gbHJ1X2xpc3QgbHJ1KQorc3RhdGljIGludCBjYWxjX2luYWN0aXZlX3JhdGlvKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywgdW5zaWduZWQgbG9uZyAqcHJlc2VudF9wYWdlcykKIHsKLQlsb25nIG5yX3BhZ2VzOworCXVuc2lnbmVkIGxvbmcgYWN0aXZlOworCXVuc2lnbmVkIGxvbmcgaW5hY3RpdmU7CisJdW5zaWduZWQgbG9uZyBnYjsKKwl1bnNpZ25lZCBsb25nIGluYWN0aXZlX3JhdGlvOworCisJaW5hY3RpdmUgPSBtZW1fY2dyb3VwX2dldF9hbGxfem9uZXN0YXQobWVtY2csIExSVV9JTkFDVElWRV9BTk9OKTsKKwlhY3RpdmUgPSBtZW1fY2dyb3VwX2dldF9hbGxfem9uZXN0YXQobWVtY2csIExSVV9BQ1RJVkVfQU5PTik7CisKKwlnYiA9IChpbmFjdGl2ZSArIGFjdGl2ZSkgPj4gKDMwIC0gUEFHRV9TSElGVCk7CisJaWYgKGdiKQorCQlpbmFjdGl2ZV9yYXRpbyA9IGludF9zcXJ0KDEwICogZ2IpOworCWVsc2UKKwkJaW5hY3RpdmVfcmF0aW8gPSAxOworCisJaWYgKHByZXNlbnRfcGFnZXMpIHsKKwkJcHJlc2VudF9wYWdlc1swXSA9IGluYWN0aXZlOworCQlwcmVzZW50X3BhZ2VzWzFdID0gYWN0aXZlOworCX0KKworCXJldHVybiBpbmFjdGl2ZV9yYXRpbzsKK30KKworaW50IG1lbV9jZ3JvdXBfaW5hY3RpdmVfYW5vbl9pc19sb3coc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnKQoreworCXVuc2lnbmVkIGxvbmcgYWN0aXZlOworCXVuc2lnbmVkIGxvbmcgaW5hY3RpdmU7CisJdW5zaWduZWQgbG9uZyBwcmVzZW50X3BhZ2VzWzJdOworCXVuc2lnbmVkIGxvbmcgaW5hY3RpdmVfcmF0aW87CisKKwlpbmFjdGl2ZV9yYXRpbyA9IGNhbGNfaW5hY3RpdmVfcmF0aW8obWVtY2csIHByZXNlbnRfcGFnZXMpOworCisJaW5hY3RpdmUgPSBwcmVzZW50X3BhZ2VzWzBdOworCWFjdGl2ZSA9IHByZXNlbnRfcGFnZXNbMV07CisKKwlpZiAoaW5hY3RpdmUgKiBpbmFjdGl2ZV9yYXRpbyA8IGFjdGl2ZSkKKwkJcmV0dXJuIDE7CisKKwlyZXR1cm4gMDsKK30KKwordW5zaWduZWQgbG9uZyBtZW1fY2dyb3VwX3pvbmVfbnJfcGFnZXMoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLAorCQkJCSAgICAgICBzdHJ1Y3Qgem9uZSAqem9uZSwKKwkJCQkgICAgICAgZW51bSBscnVfbGlzdCBscnUpCit7CiAJaW50IG5pZCA9IHpvbmUtPnpvbmVfcGdkYXQtPm5vZGVfaWQ7CiAJaW50IHppZCA9IHpvbmVfaWR4KHpvbmUpOwotCXN0cnVjdCBtZW1fY2dyb3VwX3Blcl96b25lICpteiA9IG1lbV9jZ3JvdXBfem9uZWluZm8obWVtLCBuaWQsIHppZCk7CisJc3RydWN0IG1lbV9jZ3JvdXBfcGVyX3pvbmUgKm16ID0gbWVtX2Nncm91cF96b25laW5mbyhtZW1jZywgbmlkLCB6aWQpOwogCi0JbnJfcGFnZXMgPSBNRU1fQ0dST1VQX1pTVEFUKG16LCBscnUpOworCXJldHVybiBNRU1fQ0dST1VQX1pTVEFUKG16LCBscnUpOworfQogCi0JcmV0dXJuIChucl9wYWdlcyA+PiBwcmlvcml0eSk7CitzdHJ1Y3Qgem9uZV9yZWNsYWltX3N0YXQgKm1lbV9jZ3JvdXBfZ2V0X3JlY2xhaW1fc3RhdChzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csCisJCQkJCQkgICAgICBzdHJ1Y3Qgem9uZSAqem9uZSkKK3sKKwlpbnQgbmlkID0gem9uZS0+em9uZV9wZ2RhdC0+bm9kZV9pZDsKKwlpbnQgemlkID0gem9uZV9pZHgoem9uZSk7CisJc3RydWN0IG1lbV9jZ3JvdXBfcGVyX3pvbmUgKm16ID0gbWVtX2Nncm91cF96b25laW5mbyhtZW1jZywgbmlkLCB6aWQpOworCisJcmV0dXJuICZtei0+cmVjbGFpbV9zdGF0OworfQorCitzdHJ1Y3Qgem9uZV9yZWNsYWltX3N0YXQgKgorbWVtX2Nncm91cF9nZXRfcmVjbGFpbV9zdGF0X2Zyb21fcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwlzdHJ1Y3QgcGFnZV9jZ3JvdXAgKnBjOworCXN0cnVjdCBtZW1fY2dyb3VwX3Blcl96b25lICptejsKKworCWlmIChtZW1fY2dyb3VwX2Rpc2FibGVkKCkpCisJCXJldHVybiBOVUxMOworCisJcGMgPSBsb29rdXBfcGFnZV9jZ3JvdXAocGFnZSk7CisJbXogPSBwYWdlX2Nncm91cF96b25laW5mbyhwYyk7CisJaWYgKCFteikKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXR1cm4gJm16LT5yZWNsYWltX3N0YXQ7CiB9CiAKIHVuc2lnbmVkIGxvbmcgbWVtX2Nncm91cF9pc29sYXRlX3BhZ2VzKHVuc2lnbmVkIGxvbmcgbnJfdG9fc2NhbiwKQEAgLTQyOSw0NCArNTg4LDQ2MyBAQAogCW16ID0gbWVtX2Nncm91cF96b25laW5mbyhtZW1fY29udCwgbmlkLCB6aWQpOwogCXNyYyA9ICZtei0+bGlzdHNbbHJ1XTsKIAotCXNwaW5fbG9jaygmbXotPmxydV9sb2NrKTsKIAlzY2FuID0gMDsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmVfcmV2ZXJzZShwYywgdG1wLCBzcmMsIGxydSkgewogCQlpZiAoc2NhbiA+PSBucl90b19zY2FuKQogCQkJYnJlYWs7CisKKwkJcGFnZSA9IHBjLT5wYWdlOwogCQlpZiAodW5saWtlbHkoIVBhZ2VDZ3JvdXBVc2VkKHBjKSkpCiAJCQljb250aW51ZTsKLQkJcGFnZSA9IHBjLT5wYWdlOwotCiAJCWlmICh1bmxpa2VseSghUGFnZUxSVShwYWdlKSkpCiAJCQljb250aW51ZTsKIAotCQkvKgotCQkgKiBUT0RPOiBwbGF5IGJldHRlciB3aXRoIGx1bXB5IHJlY2xhaW0sIGdyYWJiaW5nIGFueXRoaW5nLgotCQkgKi8KLQkJaWYgKFBhZ2VVbmV2aWN0YWJsZShwYWdlKSB8fAotCQkgICAgKFBhZ2VBY3RpdmUocGFnZSkgJiYgIWFjdGl2ZSkgfHwKLQkJICAgICghUGFnZUFjdGl2ZShwYWdlKSAmJiBhY3RpdmUpKSB7Ci0JCQlfX21lbV9jZ3JvdXBfbW92ZV9saXN0cyhwYywgcGFnZV9scnUocGFnZSkpOwotCQkJY29udGludWU7Ci0JCX0KLQogCQlzY2FuKys7Ci0JCWxpc3RfbW92ZSgmcGMtPmxydSwgJnBjX2xpc3QpOwotCiAJCWlmIChfX2lzb2xhdGVfbHJ1X3BhZ2UocGFnZSwgbW9kZSwgZmlsZSkgPT0gMCkgewogCQkJbGlzdF9tb3ZlKCZwYWdlLT5scnUsIGRzdCk7CiAJCQlucl90YWtlbisrOwogCQl9CiAJfQogCi0JbGlzdF9zcGxpY2UoJnBjX2xpc3QsIHNyYyk7Ci0Jc3Bpbl91bmxvY2soJm16LT5scnVfbG9jayk7Ci0KIAkqc2Nhbm5lZCA9IHNjYW47CiAJcmV0dXJuIG5yX3Rha2VuOwogfQogCisjZGVmaW5lIG1lbV9jZ3JvdXBfZnJvbV9yZXNfY291bnRlcihjb3VudGVyLCBtZW1iZXIpCVwKKwljb250YWluZXJfb2YoY291bnRlciwgc3RydWN0IG1lbV9jZ3JvdXAsIG1lbWJlcikKKworLyoKKyAqIFRoaXMgcm91dGluZSBmaW5kcyB0aGUgREZTIHdhbGsgc3VjY2Vzc29yLiBUaGlzIHJvdXRpbmUgc2hvdWxkIGJlCisgKiBjYWxsZWQgd2l0aCBoaWVyYXJjaHlfbXV0ZXggaGVsZAorICovCitzdGF0aWMgc3RydWN0IG1lbV9jZ3JvdXAgKgorbWVtX2Nncm91cF9nZXRfbmV4dF9ub2RlKHN0cnVjdCBtZW1fY2dyb3VwICpjdXJyLCBzdHJ1Y3QgbWVtX2Nncm91cCAqcm9vdF9tZW0pCit7CisJc3RydWN0IGNncm91cCAqY2dyb3VwLCAqY3Vycl9jZ3JvdXAsICpyb290X2Nncm91cDsKKworCWN1cnJfY2dyb3VwID0gY3Vyci0+Y3NzLmNncm91cDsKKwlyb290X2Nncm91cCA9IHJvb3RfbWVtLT5jc3MuY2dyb3VwOworCisJaWYgKCFsaXN0X2VtcHR5KCZjdXJyX2Nncm91cC0+Y2hpbGRyZW4pKSB7CisJCS8qCisJCSAqIFdhbGsgZG93biB0byBjaGlsZHJlbgorCQkgKi8KKwkJbWVtX2Nncm91cF9wdXQoY3Vycik7CisJCWNncm91cCA9IGxpc3RfZW50cnkoY3Vycl9jZ3JvdXAtPmNoaWxkcmVuLm5leHQsCisJCQkJCQlzdHJ1Y3QgY2dyb3VwLCBzaWJsaW5nKTsKKwkJY3VyciA9IG1lbV9jZ3JvdXBfZnJvbV9jb250KGNncm91cCk7CisJCW1lbV9jZ3JvdXBfZ2V0KGN1cnIpOworCQlnb3RvIGRvbmU7CisJfQorCit2aXNpdF9wYXJlbnQ6CisJaWYgKGN1cnJfY2dyb3VwID09IHJvb3RfY2dyb3VwKSB7CisJCW1lbV9jZ3JvdXBfcHV0KGN1cnIpOworCQljdXJyID0gcm9vdF9tZW07CisJCW1lbV9jZ3JvdXBfZ2V0KGN1cnIpOworCQlnb3RvIGRvbmU7CisJfQorCisJLyoKKwkgKiBHb3RvIG5leHQgc2libGluZworCSAqLworCWlmIChjdXJyX2Nncm91cC0+c2libGluZy5uZXh0ICE9ICZjdXJyX2Nncm91cC0+cGFyZW50LT5jaGlsZHJlbikgeworCQltZW1fY2dyb3VwX3B1dChjdXJyKTsKKwkJY2dyb3VwID0gbGlzdF9lbnRyeShjdXJyX2Nncm91cC0+c2libGluZy5uZXh0LCBzdHJ1Y3QgY2dyb3VwLAorCQkJCQkJc2libGluZyk7CisJCWN1cnIgPSBtZW1fY2dyb3VwX2Zyb21fY29udChjZ3JvdXApOworCQltZW1fY2dyb3VwX2dldChjdXJyKTsKKwkJZ290byBkb25lOworCX0KKworCS8qCisJICogR28gdXAgdG8gbmV4dCBwYXJlbnQgYW5kIG5leHQgcGFyZW50J3Mgc2libGluZyBpZiBuZWVkIGJlCisJICovCisJY3Vycl9jZ3JvdXAgPSBjdXJyX2Nncm91cC0+cGFyZW50OworCWdvdG8gdmlzaXRfcGFyZW50OworCitkb25lOgorCXJvb3RfbWVtLT5sYXN0X3NjYW5uZWRfY2hpbGQgPSBjdXJyOworCXJldHVybiBjdXJyOworfQorCisvKgorICogVmlzaXQgdGhlIGZpcnN0IGNoaWxkIChuZWVkIG5vdCBiZSB0aGUgZmlyc3QgY2hpbGQgYXMgcGVyIHRoZSBvcmRlcmluZworICogb2YgdGhlIGNncm91cCBsaXN0LCBzaW5jZSB3ZSB0cmFjayBsYXN0X3NjYW5uZWRfY2hpbGQpIG9mIEBtZW0gYW5kIHVzZQorICogdGhhdCB0byByZWNsYWltIGZyZWUgcGFnZXMgZnJvbS4KKyAqLworc3RhdGljIHN0cnVjdCBtZW1fY2dyb3VwICoKK21lbV9jZ3JvdXBfZ2V0X2ZpcnN0X25vZGUoc3RydWN0IG1lbV9jZ3JvdXAgKnJvb3RfbWVtKQoreworCXN0cnVjdCBjZ3JvdXAgKmNncm91cDsKKwlzdHJ1Y3QgbWVtX2Nncm91cCAqcmV0OworCWJvb2wgb2Jzb2xldGU7CisKKwlvYnNvbGV0ZSA9IG1lbV9jZ3JvdXBfaXNfb2Jzb2xldGUocm9vdF9tZW0tPmxhc3Rfc2Nhbm5lZF9jaGlsZCk7CisKKwkvKgorCSAqIFNjYW4gYWxsIGNoaWxkcmVuIHVuZGVyIHRoZSBtZW1fY2dyb3VwIG1lbQorCSAqLworCW11dGV4X2xvY2soJm1lbV9jZ3JvdXBfc3Vic3lzLmhpZXJhcmNoeV9tdXRleCk7CisJaWYgKGxpc3RfZW1wdHkoJnJvb3RfbWVtLT5jc3MuY2dyb3VwLT5jaGlsZHJlbikpIHsKKwkJcmV0ID0gcm9vdF9tZW07CisJCWdvdG8gZG9uZTsKKwl9CisKKwlpZiAoIXJvb3RfbWVtLT5sYXN0X3NjYW5uZWRfY2hpbGQgfHwgb2Jzb2xldGUpIHsKKworCQlpZiAob2Jzb2xldGUgJiYgcm9vdF9tZW0tPmxhc3Rfc2Nhbm5lZF9jaGlsZCkKKwkJCW1lbV9jZ3JvdXBfcHV0KHJvb3RfbWVtLT5sYXN0X3NjYW5uZWRfY2hpbGQpOworCisJCWNncm91cCA9IGxpc3RfZmlyc3RfZW50cnkoJnJvb3RfbWVtLT5jc3MuY2dyb3VwLT5jaGlsZHJlbiwKKwkJCQlzdHJ1Y3QgY2dyb3VwLCBzaWJsaW5nKTsKKwkJcmV0ID0gbWVtX2Nncm91cF9mcm9tX2NvbnQoY2dyb3VwKTsKKwkJbWVtX2Nncm91cF9nZXQocmV0KTsKKwl9IGVsc2UKKwkJcmV0ID0gbWVtX2Nncm91cF9nZXRfbmV4dF9ub2RlKHJvb3RfbWVtLT5sYXN0X3NjYW5uZWRfY2hpbGQsCisJCQkJCQlyb290X21lbSk7CisKK2RvbmU6CisJcm9vdF9tZW0tPmxhc3Rfc2Nhbm5lZF9jaGlsZCA9IHJldDsKKwltdXRleF91bmxvY2soJm1lbV9jZ3JvdXBfc3Vic3lzLmhpZXJhcmNoeV9tdXRleCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGJvb2wgbWVtX2Nncm91cF9jaGVja191bmRlcl9saW1pdChzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtKQoreworCWlmIChkb19zd2FwX2FjY291bnQpIHsKKwkJaWYgKHJlc19jb3VudGVyX2NoZWNrX3VuZGVyX2xpbWl0KCZtZW0tPnJlcykgJiYKKwkJCXJlc19jb3VudGVyX2NoZWNrX3VuZGVyX2xpbWl0KCZtZW0tPm1lbXN3KSkKKwkJCXJldHVybiB0cnVlOworCX0gZWxzZQorCQlpZiAocmVzX2NvdW50ZXJfY2hlY2tfdW5kZXJfbGltaXQoJm1lbS0+cmVzKSkKKwkJCXJldHVybiB0cnVlOworCXJldHVybiBmYWxzZTsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBnZXRfc3dhcHBpbmVzcyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cpCit7CisJc3RydWN0IGNncm91cCAqY2dycCA9IG1lbWNnLT5jc3MuY2dyb3VwOworCXVuc2lnbmVkIGludCBzd2FwcGluZXNzOworCisJLyogcm9vdCA/ICovCisJaWYgKGNncnAtPnBhcmVudCA9PSBOVUxMKQorCQlyZXR1cm4gdm1fc3dhcHBpbmVzczsKKworCXNwaW5fbG9jaygmbWVtY2ctPnJlY2xhaW1fcGFyYW1fbG9jayk7CisJc3dhcHBpbmVzcyA9IG1lbWNnLT5zd2FwcGluZXNzOworCXNwaW5fdW5sb2NrKCZtZW1jZy0+cmVjbGFpbV9wYXJhbV9sb2NrKTsKKworCXJldHVybiBzd2FwcGluZXNzOworfQorCisvKgorICogRGFuY2UgZG93biB0aGUgaGllcmFyY2h5IGlmIG5lZWRlZCB0byByZWNsYWltIG1lbW9yeS4gV2UgcmVtZW1iZXIgdGhlCisgKiBsYXN0IGNoaWxkIHdlIHJlY2xhaW1lZCBmcm9tLCBzbyB0aGF0IHdlIGRvbid0IGVuZCB1cCBwZW5hbGl6aW5nCisgKiBvbmUgY2hpbGQgZXh0ZW5zaXZlbHkgYmFzZWQgb24gaXRzIHBvc2l0aW9uIGluIHRoZSBjaGlsZHJlbiBsaXN0LgorICoKKyAqIHJvb3RfbWVtIGlzIHRoZSBvcmlnaW5hbCBhbmNlc3RvciB0aGF0IHdlJ3ZlIGJlZW4gcmVjbGFpbSBmcm9tLgorICovCitzdGF0aWMgaW50IG1lbV9jZ3JvdXBfaGllcmFyY2hpY2FsX3JlY2xhaW0oc3RydWN0IG1lbV9jZ3JvdXAgKnJvb3RfbWVtLAorCQkJCQkJZ2ZwX3QgZ2ZwX21hc2ssIGJvb2wgbm9zd2FwKQoreworCXN0cnVjdCBtZW1fY2dyb3VwICpuZXh0X21lbTsKKwlpbnQgcmV0ID0gMDsKKworCS8qCisJICogUmVjbGFpbSB1bmNvbmRpdGlvbmFsbHkgYW5kIGRvbid0IGNoZWNrIGZvciByZXR1cm4gdmFsdWUuCisJICogV2UgbmVlZCB0byByZWNsYWltIGluIHRoZSBjdXJyZW50IGdyb3VwIGFuZCBkb3duIHRoZSB0cmVlLgorCSAqIE9uZSBtaWdodCB0aGluayBhYm91dCBjaGVja2luZyBmb3IgY2hpbGRyZW4gYmVmb3JlIHJlY2xhaW1pbmcsCisJICogYnV0IHRoZXJlIG1pZ2h0IGJlIGxlZnQgb3ZlciBhY2NvdW50aW5nLCBldmVuIGFmdGVyIGNoaWxkcmVuCisJICogaGF2ZSBsZWZ0LgorCSAqLworCXJldCA9IHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMocm9vdF9tZW0sIGdmcF9tYXNrLCBub3N3YXAsCisJCQkJCSAgIGdldF9zd2FwcGluZXNzKHJvb3RfbWVtKSk7CisJaWYgKG1lbV9jZ3JvdXBfY2hlY2tfdW5kZXJfbGltaXQocm9vdF9tZW0pKQorCQlyZXR1cm4gMDsKKwlpZiAoIXJvb3RfbWVtLT51c2VfaGllcmFyY2h5KQorCQlyZXR1cm4gcmV0OworCisJbmV4dF9tZW0gPSBtZW1fY2dyb3VwX2dldF9maXJzdF9ub2RlKHJvb3RfbWVtKTsKKworCXdoaWxlIChuZXh0X21lbSAhPSByb290X21lbSkgeworCQlpZiAobWVtX2Nncm91cF9pc19vYnNvbGV0ZShuZXh0X21lbSkpIHsKKwkJCW1lbV9jZ3JvdXBfcHV0KG5leHRfbWVtKTsKKwkJCW5leHRfbWVtID0gbWVtX2Nncm91cF9nZXRfZmlyc3Rfbm9kZShyb290X21lbSk7CisJCQljb250aW51ZTsKKwkJfQorCQlyZXQgPSB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKG5leHRfbWVtLCBnZnBfbWFzaywgbm9zd2FwLAorCQkJCQkJICAgZ2V0X3N3YXBwaW5lc3MobmV4dF9tZW0pKTsKKwkJaWYgKG1lbV9jZ3JvdXBfY2hlY2tfdW5kZXJfbGltaXQocm9vdF9tZW0pKQorCQkJcmV0dXJuIDA7CisJCW11dGV4X2xvY2soJm1lbV9jZ3JvdXBfc3Vic3lzLmhpZXJhcmNoeV9tdXRleCk7CisJCW5leHRfbWVtID0gbWVtX2Nncm91cF9nZXRfbmV4dF9ub2RlKG5leHRfbWVtLCByb290X21lbSk7CisJCW11dGV4X3VubG9jaygmbWVtX2Nncm91cF9zdWJzeXMuaGllcmFyY2h5X211dGV4KTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworYm9vbCBtZW1fY2dyb3VwX29vbV9jYWxsZWQoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKQoreworCWJvb2wgcmV0ID0gZmFsc2U7CisJc3RydWN0IG1lbV9jZ3JvdXAgKm1lbTsKKwlzdHJ1Y3QgbW1fc3RydWN0ICptbTsKKworCXJjdV9yZWFkX2xvY2soKTsKKwltbSA9IHRhc2stPm1tOworCWlmICghbW0pCisJCW1tID0gJmluaXRfbW07CisJbWVtID0gbWVtX2Nncm91cF9mcm9tX3Rhc2socmN1X2RlcmVmZXJlbmNlKG1tLT5vd25lcikpOworCWlmIChtZW0gJiYgdGltZV9iZWZvcmUoamlmZmllcywgbWVtLT5sYXN0X29vbV9qaWZmaWVzICsgSFovMTApKQorCQlyZXQgPSB0cnVlOworCXJjdV9yZWFkX3VubG9jaygpOworCXJldHVybiByZXQ7Cit9CisvKgorICogVW5saWtlIGV4cG9ydGVkIGludGVyZmFjZSwgIm9vbSIgcGFyYW1ldGVyIGlzIGFkZGVkLiBpZiBvb209PXRydWUsCisgKiBvb20ta2lsbGVyIGNhbiBiZSBpbnZva2VkLgorICovCitzdGF0aWMgaW50IF9fbWVtX2Nncm91cF90cnlfY2hhcmdlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAorCQkJZ2ZwX3QgZ2ZwX21hc2ssIHN0cnVjdCBtZW1fY2dyb3VwICoqbWVtY2csCisJCQlib29sIG9vbSkKK3sKKwlzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtLCAqbWVtX292ZXJfbGltaXQ7CisJaW50IG5yX3JldHJpZXMgPSBNRU1fQ0dST1VQX1JFQ0xBSU1fUkVUUklFUzsKKwlzdHJ1Y3QgcmVzX2NvdW50ZXIgKmZhaWxfcmVzOworCisJaWYgKHVubGlrZWx5KHRlc3RfdGhyZWFkX2ZsYWcoVElGX01FTURJRSkpKSB7CisJCS8qIERvbid0IGFjY291bnQgdGhpcyEgKi8KKwkJKm1lbWNnID0gTlVMTDsKKwkJcmV0dXJuIDA7CisJfQorCisJLyoKKwkgKiBXZSBhbHdheXMgY2hhcmdlIHRoZSBjZ3JvdXAgdGhlIG1tX3N0cnVjdCBiZWxvbmdzIHRvLgorCSAqIFRoZSBtbV9zdHJ1Y3QncyBtZW1fY2dyb3VwIGNoYW5nZXMgb24gdGFzayBtaWdyYXRpb24gaWYgdGhlCisJICogdGhyZWFkIGdyb3VwIGxlYWRlciBtaWdyYXRlcy4gSXQncyBwb3NzaWJsZSB0aGF0IG1tIGlzIG5vdAorCSAqIHNldCwgaWYgc28gY2hhcmdlIHRoZSBpbml0X21tIChoYXBwZW5zIGZvciBwYWdlY2FjaGUgdXNhZ2UpLgorCSAqLworCW1lbSA9ICptZW1jZzsKKwlpZiAobGlrZWx5KCFtZW0pKSB7CisJCW1lbSA9IHRyeV9nZXRfbWVtX2Nncm91cF9mcm9tX21tKG1tKTsKKwkJKm1lbWNnID0gbWVtOworCX0gZWxzZSB7CisJCWNzc19nZXQoJm1lbS0+Y3NzKTsKKwl9CisJaWYgKHVubGlrZWx5KCFtZW0pKQorCQlyZXR1cm4gMDsKKworCVZNX0JVR19PTihtZW1fY2dyb3VwX2lzX29ic29sZXRlKG1lbSkpOworCisJd2hpbGUgKDEpIHsKKwkJaW50IHJldDsKKwkJYm9vbCBub3N3YXAgPSBmYWxzZTsKKworCQlyZXQgPSByZXNfY291bnRlcl9jaGFyZ2UoJm1lbS0+cmVzLCBQQUdFX1NJWkUsICZmYWlsX3Jlcyk7CisJCWlmIChsaWtlbHkoIXJldCkpIHsKKwkJCWlmICghZG9fc3dhcF9hY2NvdW50KQorCQkJCWJyZWFrOworCQkJcmV0ID0gcmVzX2NvdW50ZXJfY2hhcmdlKCZtZW0tPm1lbXN3LCBQQUdFX1NJWkUsCisJCQkJCQkJJmZhaWxfcmVzKTsKKwkJCWlmIChsaWtlbHkoIXJldCkpCisJCQkJYnJlYWs7CisJCQkvKiBtZW0rc3dhcCBjb3VudGVyIGZhaWxzICovCisJCQlyZXNfY291bnRlcl91bmNoYXJnZSgmbWVtLT5yZXMsIFBBR0VfU0laRSk7CisJCQlub3N3YXAgPSB0cnVlOworCQkJbWVtX292ZXJfbGltaXQgPSBtZW1fY2dyb3VwX2Zyb21fcmVzX2NvdW50ZXIoZmFpbF9yZXMsCisJCQkJCQkJCQltZW1zdyk7CisJCX0gZWxzZQorCQkJLyogbWVtIGNvdW50ZXIgZmFpbHMgKi8KKwkJCW1lbV9vdmVyX2xpbWl0ID0gbWVtX2Nncm91cF9mcm9tX3Jlc19jb3VudGVyKGZhaWxfcmVzLAorCQkJCQkJCQkJcmVzKTsKKworCQlpZiAoIShnZnBfbWFzayAmIF9fR0ZQX1dBSVQpKQorCQkJZ290byBub21lbTsKKworCQlyZXQgPSBtZW1fY2dyb3VwX2hpZXJhcmNoaWNhbF9yZWNsYWltKG1lbV9vdmVyX2xpbWl0LCBnZnBfbWFzaywKKwkJCQkJCQlub3N3YXApOworCisJCS8qCisJCSAqIHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoKSBtaWdodCBub3QgZ2l2ZSB1cyBhIGZ1bGwKKwkJICogcGljdHVyZSBvZiByZWNsYWltLiBTb21lIHBhZ2VzIGFyZSByZWNsYWltZWQgYW5kIG1pZ2h0IGJlCisJCSAqIG1vdmVkIHRvIHN3YXAgY2FjaGUgb3IganVzdCB1bm1hcHBlZCBmcm9tIHRoZSBjZ3JvdXAuCisJCSAqIENoZWNrIHRoZSBsaW1pdCBhZ2FpbiB0byBzZWUgaWYgdGhlIHJlY2xhaW0gcmVkdWNlZCB0aGUKKwkJICogY3VycmVudCB1c2FnZSBvZiB0aGUgY2dyb3VwIGJlZm9yZSBnaXZpbmcgdXAKKwkJICoKKwkJICovCisJCWlmIChtZW1fY2dyb3VwX2NoZWNrX3VuZGVyX2xpbWl0KG1lbV9vdmVyX2xpbWl0KSkKKwkJCWNvbnRpbnVlOworCisJCWlmICghbnJfcmV0cmllcy0tKSB7CisJCQlpZiAob29tKSB7CisJCQkJbXV0ZXhfbG9jaygmbWVtY2dfdGFza2xpc3QpOworCQkJCW1lbV9jZ3JvdXBfb3V0X29mX21lbW9yeShtZW1fb3Zlcl9saW1pdCwgZ2ZwX21hc2spOworCQkJCW11dGV4X3VubG9jaygmbWVtY2dfdGFza2xpc3QpOworCQkJCW1lbV9vdmVyX2xpbWl0LT5sYXN0X29vbV9qaWZmaWVzID0gamlmZmllczsKKwkJCX0KKwkJCWdvdG8gbm9tZW07CisJCX0KKwl9CisJcmV0dXJuIDA7Citub21lbToKKwljc3NfcHV0KCZtZW0tPmNzcyk7CisJcmV0dXJuIC1FTk9NRU07Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbWVtX2Nncm91cCAqdHJ5X2dldF9tZW1fY2dyb3VwX2Zyb21fc3dhcGNhY2hlKHN0cnVjdCBwYWdlICpwYWdlKQoreworCXN0cnVjdCBtZW1fY2dyb3VwICptZW07CisJc3dwX2VudHJ5X3QgZW50OworCisJaWYgKCFQYWdlU3dhcENhY2hlKHBhZ2UpKQorCQlyZXR1cm4gTlVMTDsKKworCWVudC52YWwgPSBwYWdlX3ByaXZhdGUocGFnZSk7CisJbWVtID0gbG9va3VwX3N3YXBfY2dyb3VwKGVudCk7CisJaWYgKCFtZW0pCisJCXJldHVybiBOVUxMOworCWlmICghY3NzX3RyeWdldCgmbWVtLT5jc3MpKQorCQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gbWVtOworfQorCisvKgorICogY29tbWl0IGEgY2hhcmdlIGdvdCBieSBfX21lbV9jZ3JvdXBfdHJ5X2NoYXJnZSgpIGFuZCBtYWtlcyBwYWdlX2Nncm91cCB0byBiZQorICogVVNFRCBzdGF0ZS4gSWYgYWxyZWFkeSBVU0VELCB1bmNoYXJnZSBhbmQgcmV0dXJuLgorICovCisKK3N0YXRpYyB2b2lkIF9fbWVtX2Nncm91cF9jb21taXRfY2hhcmdlKHN0cnVjdCBtZW1fY2dyb3VwICptZW0sCisJCQkJICAgICBzdHJ1Y3QgcGFnZV9jZ3JvdXAgKnBjLAorCQkJCSAgICAgZW51bSBjaGFyZ2VfdHlwZSBjdHlwZSkKK3sKKwkvKiB0cnlfY2hhcmdlKCkgY2FuIHJldHVybiBOVUxMIHRvICptZW1jZywgdGFraW5nIGNhcmUgb2YgaXQuICovCisJaWYgKCFtZW0pCisJCXJldHVybjsKKworCWxvY2tfcGFnZV9jZ3JvdXAocGMpOworCWlmICh1bmxpa2VseShQYWdlQ2dyb3VwVXNlZChwYykpKSB7CisJCXVubG9ja19wYWdlX2Nncm91cChwYyk7CisJCXJlc19jb3VudGVyX3VuY2hhcmdlKCZtZW0tPnJlcywgUEFHRV9TSVpFKTsKKwkJaWYgKGRvX3N3YXBfYWNjb3VudCkKKwkJCXJlc19jb3VudGVyX3VuY2hhcmdlKCZtZW0tPm1lbXN3LCBQQUdFX1NJWkUpOworCQljc3NfcHV0KCZtZW0tPmNzcyk7CisJCXJldHVybjsKKwl9CisJcGMtPm1lbV9jZ3JvdXAgPSBtZW07CisJc21wX3dtYigpOworCXBjLT5mbGFncyA9IHBjZ19kZWZhdWx0X2ZsYWdzW2N0eXBlXTsKKworCW1lbV9jZ3JvdXBfY2hhcmdlX3N0YXRpc3RpY3MobWVtLCBwYywgdHJ1ZSk7CisKKwl1bmxvY2tfcGFnZV9jZ3JvdXAocGMpOworfQorCisvKioKKyAqIG1lbV9jZ3JvdXBfbW92ZV9hY2NvdW50IC0gbW92ZSBhY2NvdW50IG9mIHRoZSBwYWdlCisgKiBAcGM6CXBhZ2VfY2dyb3VwIG9mIHRoZSBwYWdlLgorICogQGZyb206IG1lbV9jZ3JvdXAgd2hpY2ggdGhlIHBhZ2UgaXMgbW92ZWQgZnJvbS4KKyAqIEB0bzoJbWVtX2Nncm91cCB3aGljaCB0aGUgcGFnZSBpcyBtb3ZlZCB0by4gQGZyb20gIT0gQHRvLgorICoKKyAqIFRoZSBjYWxsZXIgbXVzdCBjb25maXJtIGZvbGxvd2luZy4KKyAqIC0gcGFnZSBpcyBub3Qgb24gTFJVIChpc29sYXRlX3BhZ2UoKSBpcyB1c2VmdWwuKQorICoKKyAqIHJldHVybnMgMCBhdCBzdWNjZXNzLAorICogcmV0dXJucyAtRUJVU1kgd2hlbiBsb2NrIGlzIGJ1c3kgb3IgInBjIiBpcyB1bnN0YWJsZS4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGRvZXMgInVuY2hhcmdlIiBmcm9tIG9sZCBjZ3JvdXAgYnV0IGRvZXNuJ3QgZG8gImNoYXJnZSIgdG8KKyAqIG5ldyBjZ3JvdXAuIEl0IHNob3VsZCBiZSBkb25lIGJ5IGEgY2FsbGVyLgorICovCisKK3N0YXRpYyBpbnQgbWVtX2Nncm91cF9tb3ZlX2FjY291bnQoc3RydWN0IHBhZ2VfY2dyb3VwICpwYywKKwlzdHJ1Y3QgbWVtX2Nncm91cCAqZnJvbSwgc3RydWN0IG1lbV9jZ3JvdXAgKnRvKQoreworCXN0cnVjdCBtZW1fY2dyb3VwX3Blcl96b25lICpmcm9tX216LCAqdG9fbXo7CisJaW50IG5pZCwgemlkOworCWludCByZXQgPSAtRUJVU1k7CisKKwlWTV9CVUdfT04oZnJvbSA9PSB0byk7CisJVk1fQlVHX09OKFBhZ2VMUlUocGMtPnBhZ2UpKTsKKworCW5pZCA9IHBhZ2VfY2dyb3VwX25pZChwYyk7CisJemlkID0gcGFnZV9jZ3JvdXBfemlkKHBjKTsKKwlmcm9tX216ID0gIG1lbV9jZ3JvdXBfem9uZWluZm8oZnJvbSwgbmlkLCB6aWQpOworCXRvX216ID0gIG1lbV9jZ3JvdXBfem9uZWluZm8odG8sIG5pZCwgemlkKTsKKworCWlmICghdHJ5bG9ja19wYWdlX2Nncm91cChwYykpCisJCXJldHVybiByZXQ7CisKKwlpZiAoIVBhZ2VDZ3JvdXBVc2VkKHBjKSkKKwkJZ290byBvdXQ7CisKKwlpZiAocGMtPm1lbV9jZ3JvdXAgIT0gZnJvbSkKKwkJZ290byBvdXQ7CisKKwljc3NfcHV0KCZmcm9tLT5jc3MpOworCXJlc19jb3VudGVyX3VuY2hhcmdlKCZmcm9tLT5yZXMsIFBBR0VfU0laRSk7CisJbWVtX2Nncm91cF9jaGFyZ2Vfc3RhdGlzdGljcyhmcm9tLCBwYywgZmFsc2UpOworCWlmIChkb19zd2FwX2FjY291bnQpCisJCXJlc19jb3VudGVyX3VuY2hhcmdlKCZmcm9tLT5tZW1zdywgUEFHRV9TSVpFKTsKKwlwYy0+bWVtX2Nncm91cCA9IHRvOworCW1lbV9jZ3JvdXBfY2hhcmdlX3N0YXRpc3RpY3ModG8sIHBjLCB0cnVlKTsKKwljc3NfZ2V0KCZ0by0+Y3NzKTsKKwlyZXQgPSAwOworb3V0OgorCXVubG9ja19wYWdlX2Nncm91cChwYyk7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIG1vdmUgY2hhcmdlcyB0byBpdHMgcGFyZW50LgorICovCisKK3N0YXRpYyBpbnQgbWVtX2Nncm91cF9tb3ZlX3BhcmVudChzdHJ1Y3QgcGFnZV9jZ3JvdXAgKnBjLAorCQkJCSAgc3RydWN0IG1lbV9jZ3JvdXAgKmNoaWxkLAorCQkJCSAgZ2ZwX3QgZ2ZwX21hc2spCit7CisJc3RydWN0IHBhZ2UgKnBhZ2UgPSBwYy0+cGFnZTsKKwlzdHJ1Y3QgY2dyb3VwICpjZyA9IGNoaWxkLT5jc3MuY2dyb3VwOworCXN0cnVjdCBjZ3JvdXAgKnBjZyA9IGNnLT5wYXJlbnQ7CisJc3RydWN0IG1lbV9jZ3JvdXAgKnBhcmVudDsKKwlpbnQgcmV0OworCisJLyogSXMgUk9PVCA/ICovCisJaWYgKCFwY2cpCisJCXJldHVybiAtRUlOVkFMOworCisKKwlwYXJlbnQgPSBtZW1fY2dyb3VwX2Zyb21fY29udChwY2cpOworCisKKwlyZXQgPSBfX21lbV9jZ3JvdXBfdHJ5X2NoYXJnZShOVUxMLCBnZnBfbWFzaywgJnBhcmVudCwgZmFsc2UpOworCWlmIChyZXQgfHwgIXBhcmVudCkKKwkJcmV0dXJuIHJldDsKKworCWlmICghZ2V0X3BhZ2VfdW5sZXNzX3plcm8ocGFnZSkpCisJCXJldHVybiAtRUJVU1k7CisKKwlyZXQgPSBpc29sYXRlX2xydV9wYWdlKHBhZ2UpOworCisJaWYgKHJldCkKKwkJZ290byBjYW5jZWw7CisKKwlyZXQgPSBtZW1fY2dyb3VwX21vdmVfYWNjb3VudChwYywgY2hpbGQsIHBhcmVudCk7CisKKwkvKiBkcm9wIGV4dHJhIHJlZmNudCBieSB0cnlfY2hhcmdlKCkgKG1vdmVfYWNjb3VudCBpbmNyZW1lbnQgb25lKSAqLworCWNzc19wdXQoJnBhcmVudC0+Y3NzKTsKKwlwdXRiYWNrX2xydV9wYWdlKHBhZ2UpOworCWlmICghcmV0KSB7CisJCXB1dF9wYWdlKHBhZ2UpOworCQlyZXR1cm4gMDsKKwl9CisJLyogdW5jaGFyZ2UgaWYgbW92ZSBmYWlscyAqLworY2FuY2VsOgorCXJlc19jb3VudGVyX3VuY2hhcmdlKCZwYXJlbnQtPnJlcywgUEFHRV9TSVpFKTsKKwlpZiAoZG9fc3dhcF9hY2NvdW50KQorCQlyZXNfY291bnRlcl91bmNoYXJnZSgmcGFyZW50LT5tZW1zdywgUEFHRV9TSVpFKTsKKwlwdXRfcGFnZShwYWdlKTsKKwlyZXR1cm4gcmV0OworfQorCiAvKgogICogQ2hhcmdlIHRoZSBtZW1vcnkgY29udHJvbGxlciBmb3IgcGFnZSB1c2FnZS4KICAqIFJldHVybgpAQCAtNDc5LDk1ICsxMDU3LDI3IEBACiB7CiAJc3RydWN0IG1lbV9jZ3JvdXAgKm1lbTsKIAlzdHJ1Y3QgcGFnZV9jZ3JvdXAgKnBjOwotCXVuc2lnbmVkIGxvbmcgbnJfcmV0cmllcyA9IE1FTV9DR1JPVVBfUkVDTEFJTV9SRVRSSUVTOwotCXN0cnVjdCBtZW1fY2dyb3VwX3Blcl96b25lICptejsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQ7CiAKIAlwYyA9IGxvb2t1cF9wYWdlX2Nncm91cChwYWdlKTsKIAkvKiBjYW4gaGFwcGVuIGF0IGJvb3QgKi8KIAlpZiAodW5saWtlbHkoIXBjKSkKIAkJcmV0dXJuIDA7CiAJcHJlZmV0Y2h3KHBjKTsKLQkvKgotCSAqIFdlIGFsd2F5cyBjaGFyZ2UgdGhlIGNncm91cCB0aGUgbW1fc3RydWN0IGJlbG9uZ3MgdG8uCi0JICogVGhlIG1tX3N0cnVjdCdzIG1lbV9jZ3JvdXAgY2hhbmdlcyBvbiB0YXNrIG1pZ3JhdGlvbiBpZiB0aGUKLQkgKiB0aHJlYWQgZ3JvdXAgbGVhZGVyIG1pZ3JhdGVzLiBJdCdzIHBvc3NpYmxlIHRoYXQgbW0gaXMgbm90Ci0JICogc2V0LCBpZiBzbyBjaGFyZ2UgdGhlIGluaXRfbW0gKGhhcHBlbnMgZm9yIHBhZ2VjYWNoZSB1c2FnZSkuCi0JICovCiAKLQlpZiAobGlrZWx5KCFtZW1jZykpIHsKLQkJcmN1X3JlYWRfbG9jaygpOwotCQltZW0gPSBtZW1fY2dyb3VwX2Zyb21fdGFzayhyY3VfZGVyZWZlcmVuY2UobW0tPm93bmVyKSk7Ci0JCWlmICh1bmxpa2VseSghbWVtKSkgewotCQkJcmN1X3JlYWRfdW5sb2NrKCk7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQkvKgotCQkgKiBGb3IgZXZlcnkgY2hhcmdlIGZyb20gdGhlIGNncm91cCwgaW5jcmVtZW50IHJlZmVyZW5jZSBjb3VudAotCQkgKi8KLQkJY3NzX2dldCgmbWVtLT5jc3MpOwotCQlyY3VfcmVhZF91bmxvY2soKTsKLQl9IGVsc2UgewotCQltZW0gPSBtZW1jZzsKLQkJY3NzX2dldCgmbWVtY2ctPmNzcyk7Ci0JfQorCW1lbSA9IG1lbWNnOworCXJldCA9IF9fbWVtX2Nncm91cF90cnlfY2hhcmdlKG1tLCBnZnBfbWFzaywgJm1lbSwgdHJ1ZSk7CisJaWYgKHJldCB8fCAhbWVtKQorCQlyZXR1cm4gcmV0OwogCi0Jd2hpbGUgKHVubGlrZWx5KHJlc19jb3VudGVyX2NoYXJnZSgmbWVtLT5yZXMsIFBBR0VfU0laRSkpKSB7Ci0JCWlmICghKGdmcF9tYXNrICYgX19HRlBfV0FJVCkpCi0JCQlnb3RvIG91dDsKLQotCQlpZiAodHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyhtZW0sIGdmcF9tYXNrKSkKLQkJCWNvbnRpbnVlOwotCi0JCS8qCi0JCSAqIHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoKSBtaWdodCBub3QgZ2l2ZSB1cyBhIGZ1bGwKLQkJICogcGljdHVyZSBvZiByZWNsYWltLiBTb21lIHBhZ2VzIGFyZSByZWNsYWltZWQgYW5kIG1pZ2h0IGJlCi0JCSAqIG1vdmVkIHRvIHN3YXAgY2FjaGUgb3IganVzdCB1bm1hcHBlZCBmcm9tIHRoZSBjZ3JvdXAuCi0JCSAqIENoZWNrIHRoZSBsaW1pdCBhZ2FpbiB0byBzZWUgaWYgdGhlIHJlY2xhaW0gcmVkdWNlZCB0aGUKLQkJICogY3VycmVudCB1c2FnZSBvZiB0aGUgY2dyb3VwIGJlZm9yZSBnaXZpbmcgdXAKLQkJICovCi0JCWlmIChyZXNfY291bnRlcl9jaGVja191bmRlcl9saW1pdCgmbWVtLT5yZXMpKQotCQkJY29udGludWU7Ci0KLQkJaWYgKCFucl9yZXRyaWVzLS0pIHsKLQkJCW1lbV9jZ3JvdXBfb3V0X29mX21lbW9yeShtZW0sIGdmcF9tYXNrKTsKLQkJCWdvdG8gb3V0OwotCQl9Ci0JfQotCi0KLQlsb2NrX3BhZ2VfY2dyb3VwKHBjKTsKLQlpZiAodW5saWtlbHkoUGFnZUNncm91cFVzZWQocGMpKSkgewotCQl1bmxvY2tfcGFnZV9jZ3JvdXAocGMpOwotCQlyZXNfY291bnRlcl91bmNoYXJnZSgmbWVtLT5yZXMsIFBBR0VfU0laRSk7Ci0JCWNzc19wdXQoJm1lbS0+Y3NzKTsKLQotCQlnb3RvIGRvbmU7Ci0JfQotCXBjLT5tZW1fY2dyb3VwID0gbWVtOwotCS8qCi0JICogSWYgYSBwYWdlIGlzIGFjY291bnRlZCBhcyBhIHBhZ2UgY2FjaGUsIGluc2VydCB0byBpbmFjdGl2ZSBsaXN0LgotCSAqIElmIGFub24sIGluc2VydCB0byBhY3RpdmUgbGlzdC4KLQkgKi8KLQlwYy0+ZmxhZ3MgPSBwY2dfZGVmYXVsdF9mbGFnc1tjdHlwZV07Ci0KLQlteiA9IHBhZ2VfY2dyb3VwX3pvbmVpbmZvKHBjKTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZtei0+bHJ1X2xvY2ssIGZsYWdzKTsKLQlfX21lbV9jZ3JvdXBfYWRkX2xpc3QobXosIHBjKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtei0+bHJ1X2xvY2ssIGZsYWdzKTsKLQl1bmxvY2tfcGFnZV9jZ3JvdXAocGMpOwotCi1kb25lOgorCV9fbWVtX2Nncm91cF9jb21taXRfY2hhcmdlKG1lbSwgcGMsIGN0eXBlKTsKIAlyZXR1cm4gMDsKLW91dDoKLQljc3NfcHV0KCZtZW0tPmNzcyk7Ci0JcmV0dXJuIC1FTk9NRU07CiB9CiAKLWludCBtZW1fY2dyb3VwX2NoYXJnZShzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IG1tX3N0cnVjdCAqbW0sIGdmcF90IGdmcF9tYXNrKQoraW50IG1lbV9jZ3JvdXBfbmV3cGFnZV9jaGFyZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsCisJCQkgICAgICBzdHJ1Y3QgbW1fc3RydWN0ICptbSwgZ2ZwX3QgZ2ZwX21hc2spCiB7Ci0JaWYgKG1lbV9jZ3JvdXBfc3Vic3lzLmRpc2FibGVkKQorCWlmIChtZW1fY2dyb3VwX2Rpc2FibGVkKCkpCiAJCXJldHVybiAwOwogCWlmIChQYWdlQ29tcG91bmQocGFnZSkpCiAJCXJldHVybiAwOwpAQCAtNTg5LDcgKzEwOTksMTAgQEAKIGludCBtZW1fY2dyb3VwX2NhY2hlX2NoYXJnZShzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IG1tX3N0cnVjdCAqbW0sCiAJCQkJZ2ZwX3QgZ2ZwX21hc2spCiB7Ci0JaWYgKG1lbV9jZ3JvdXBfc3Vic3lzLmRpc2FibGVkKQorCXN0cnVjdCBtZW1fY2dyb3VwICptZW0gPSBOVUxMOworCWludCByZXQ7CisKKwlpZiAobWVtX2Nncm91cF9kaXNhYmxlZCgpKQogCQlyZXR1cm4gMDsKIAlpZiAoUGFnZUNvbXBvdW5kKHBhZ2UpKQogCQlyZXR1cm4gMDsKQEAgLTYwMSw2ICsxMTE0LDggQEAKIAkgKiBGb3IgR0ZQX05PV0FJVCBjYXNlLCB0aGUgcGFnZSBtYXkgYmUgcHJlLWNoYXJnZWQgYmVmb3JlIGNhbGxpbmcKIAkgKiBhZGRfdG9fcGFnZV9jYWNoZSgpLiAoU2VlIHNobWVtLmMpIGNoZWNrIGl0IGhlcmUgYW5kIGF2b2lkIHRvIGNhbGwKIAkgKiBjaGFyZ2UgdHdpY2UuIChJdCB3b3JrcyBidXQgaGFzIHRvIHBheSBhIGJpdCBsYXJnZXIgY29zdC4pCisJICogQW5kIHdoZW4gdGhlIHBhZ2UgaXMgU3dhcENhY2hlLCBpdCBzaG91bGQgdGFrZSBzd2FwIGluZm9ybWF0aW9uCisJICogaW50byBhY2NvdW50LiBUaGlzIGlzIHVuZGVyIGxvY2tfcGFnZSgpIG5vdy4KIAkgKi8KIAlpZiAoIShnZnBfbWFzayAmIF9fR0ZQX1dBSVQpKSB7CiAJCXN0cnVjdCBwYWdlX2Nncm91cCAqcGM7CkBAIC02MTcsNTggKzExMzIsMTk4IEBACiAJCXVubG9ja19wYWdlX2Nncm91cChwYyk7CiAJfQogCi0JaWYgKHVubGlrZWx5KCFtbSkpCisJaWYgKGRvX3N3YXBfYWNjb3VudCAmJiBQYWdlU3dhcENhY2hlKHBhZ2UpKSB7CisJCW1lbSA9IHRyeV9nZXRfbWVtX2Nncm91cF9mcm9tX3N3YXBjYWNoZShwYWdlKTsKKwkJaWYgKG1lbSkKKwkJCW1tID0gTlVMTDsKKwkJICBlbHNlCisJCQltZW0gPSBOVUxMOworCQkvKiBTd2FwQ2FjaGUgbWF5IGJlIHN0aWxsIGxpbmtlZCB0byBMUlUgbm93LiAqLworCQltZW1fY2dyb3VwX2xydV9kZWxfYmVmb3JlX2NvbW1pdF9zd2FwY2FjaGUocGFnZSk7CisJfQorCisJaWYgKHVubGlrZWx5KCFtbSAmJiAhbWVtKSkKIAkJbW0gPSAmaW5pdF9tbTsKIAogCWlmIChwYWdlX2lzX2ZpbGVfY2FjaGUocGFnZSkpCiAJCXJldHVybiBtZW1fY2dyb3VwX2NoYXJnZV9jb21tb24ocGFnZSwgbW0sIGdmcF9tYXNrLAogCQkJCU1FTV9DR1JPVVBfQ0hBUkdFX1RZUEVfQ0FDSEUsIE5VTEwpOwotCWVsc2UKLQkJcmV0dXJuIG1lbV9jZ3JvdXBfY2hhcmdlX2NvbW1vbihwYWdlLCBtbSwgZ2ZwX21hc2ssCi0JCQkJTUVNX0NHUk9VUF9DSEFSR0VfVFlQRV9TSE1FTSwgTlVMTCk7CisKKwlyZXQgPSBtZW1fY2dyb3VwX2NoYXJnZV9jb21tb24ocGFnZSwgbW0sIGdmcF9tYXNrLAorCQkJCU1FTV9DR1JPVVBfQ0hBUkdFX1RZUEVfU0hNRU0sIG1lbSk7CisJaWYgKG1lbSkKKwkJY3NzX3B1dCgmbWVtLT5jc3MpOworCWlmIChQYWdlU3dhcENhY2hlKHBhZ2UpKQorCQltZW1fY2dyb3VwX2xydV9hZGRfYWZ0ZXJfY29tbWl0X3N3YXBjYWNoZShwYWdlKTsKKworCWlmIChkb19zd2FwX2FjY291bnQgJiYgIXJldCAmJiBQYWdlU3dhcENhY2hlKHBhZ2UpKSB7CisJCXN3cF9lbnRyeV90IGVudCA9IHsudmFsID0gcGFnZV9wcml2YXRlKHBhZ2UpfTsKKwkJLyogYXZvaWQgZG91YmxlIGNvdW50aW5nICovCisJCW1lbSA9IHN3YXBfY2dyb3VwX3JlY29yZChlbnQsIE5VTEwpOworCQlpZiAobWVtKSB7CisJCQlyZXNfY291bnRlcl91bmNoYXJnZSgmbWVtLT5tZW1zdywgUEFHRV9TSVpFKTsKKwkJCW1lbV9jZ3JvdXBfcHV0KG1lbSk7CisJCX0KKwl9CisJcmV0dXJuIHJldDsKIH0KIAogLyoKKyAqIFdoaWxlIHN3YXAtaW4sIHRyeV9jaGFyZ2UgLT4gY29tbWl0IG9yIGNhbmNlbCwgdGhlIHBhZ2UgaXMgbG9ja2VkLgorICogQW5kIHdoZW4gdHJ5X2NoYXJnZSgpIHN1Y2Nlc3NmdWxseSByZXR1cm5zLCBvbmUgcmVmY250IHRvIG1lbWNnIHdpdGhvdXQKKyAqIHN0cnVjdCBwYWdlX2Nncm91cCBpcyBhcXVpcmVkLiBUaGlzIHJlZmNudCB3aWxsIGJlIGN1bXN1bWVkIGJ5CisgKiAiY29tbWl0KCkiIG9yIHJlbW92ZWQgYnkgImNhbmNlbCgpIgorICovCitpbnQgbWVtX2Nncm91cF90cnlfY2hhcmdlX3N3YXBpbihzdHJ1Y3QgbW1fc3RydWN0ICptbSwKKwkJCQkgc3RydWN0IHBhZ2UgKnBhZ2UsCisJCQkJIGdmcF90IG1hc2ssIHN0cnVjdCBtZW1fY2dyb3VwICoqcHRyKQoreworCXN0cnVjdCBtZW1fY2dyb3VwICptZW07CisJaW50IHJldDsKKworCWlmIChtZW1fY2dyb3VwX2Rpc2FibGVkKCkpCisJCXJldHVybiAwOworCisJaWYgKCFkb19zd2FwX2FjY291bnQpCisJCWdvdG8gY2hhcmdlX2N1cl9tbTsKKwkvKgorCSAqIEEgcmFjaW5nIHRocmVhZCdzIGZhdWx0LCBvciBzd2Fwb2ZmLCBtYXkgaGF2ZSBhbHJlYWR5IHVwZGF0ZWQKKwkgKiB0aGUgcHRlLCBhbmQgZXZlbiByZW1vdmVkIHBhZ2UgZnJvbSBzd2FwIGNhY2hlOiByZXR1cm4gc3VjY2VzcworCSAqIHRvIGdvIG9uIHRvIGRvX3N3YXBfcGFnZSgpJ3MgcHRlX3NhbWUoKSB0ZXN0LCB3aGljaCBzaG91bGQgZmFpbC4KKwkgKi8KKwlpZiAoIVBhZ2VTd2FwQ2FjaGUocGFnZSkpCisJCXJldHVybiAwOworCW1lbSA9IHRyeV9nZXRfbWVtX2Nncm91cF9mcm9tX3N3YXBjYWNoZShwYWdlKTsKKwlpZiAoIW1lbSkKKwkJZ290byBjaGFyZ2VfY3VyX21tOworCSpwdHIgPSBtZW07CisJcmV0ID0gX19tZW1fY2dyb3VwX3RyeV9jaGFyZ2UoTlVMTCwgbWFzaywgcHRyLCB0cnVlKTsKKwkvKiBkcm9wIGV4dHJhIHJlZmNudCBmcm9tIHRyeWdldCAqLworCWNzc19wdXQoJm1lbS0+Y3NzKTsKKwlyZXR1cm4gcmV0OworY2hhcmdlX2N1cl9tbToKKwlpZiAodW5saWtlbHkoIW1tKSkKKwkJbW0gPSAmaW5pdF9tbTsKKwlyZXR1cm4gX19tZW1fY2dyb3VwX3RyeV9jaGFyZ2UobW0sIG1hc2ssIHB0ciwgdHJ1ZSk7Cit9CisKK3ZvaWQgbWVtX2Nncm91cF9jb21taXRfY2hhcmdlX3N3YXBpbihzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IG1lbV9jZ3JvdXAgKnB0cikKK3sKKwlzdHJ1Y3QgcGFnZV9jZ3JvdXAgKnBjOworCisJaWYgKG1lbV9jZ3JvdXBfZGlzYWJsZWQoKSkKKwkJcmV0dXJuOworCWlmICghcHRyKQorCQlyZXR1cm47CisJcGMgPSBsb29rdXBfcGFnZV9jZ3JvdXAocGFnZSk7CisJbWVtX2Nncm91cF9scnVfZGVsX2JlZm9yZV9jb21taXRfc3dhcGNhY2hlKHBhZ2UpOworCV9fbWVtX2Nncm91cF9jb21taXRfY2hhcmdlKHB0ciwgcGMsIE1FTV9DR1JPVVBfQ0hBUkdFX1RZUEVfTUFQUEVEKTsKKwltZW1fY2dyb3VwX2xydV9hZGRfYWZ0ZXJfY29tbWl0X3N3YXBjYWNoZShwYWdlKTsKKwkvKgorCSAqIE5vdyBzd2FwIGlzIG9uLW1lbW9yeS4gVGhpcyBtZWFucyB0aGlzIHBhZ2UgbWF5IGJlCisJICogY291bnRlZCBib3RoIGFzIG1lbSBhbmQgc3dhcC4uLi5kb3VibGUgY291bnQuCisJICogRml4IGl0IGJ5IHVuY2hhcmdpbmcgZnJvbSBtZW1zdy4gQmFzaWNhbGx5LCB0aGlzIFN3YXBDYWNoZSBpcyBzdGFibGUKKwkgKiB1bmRlciBsb2NrX3BhZ2UoKS4gQnV0IGluIGRvX3N3YXBfcGFnZSgpOjptZW1vcnkuYywgcmV1c2Vfc3dhcF9wYWdlKCkKKwkgKiBtYXkgY2FsbCBkZWxldGVfZnJvbV9zd2FwX2NhY2hlKCkgYmVmb3JlIHJlYWNoIGhlcmUuCisJICovCisJaWYgKGRvX3N3YXBfYWNjb3VudCAmJiBQYWdlU3dhcENhY2hlKHBhZ2UpKSB7CisJCXN3cF9lbnRyeV90IGVudCA9IHsudmFsID0gcGFnZV9wcml2YXRlKHBhZ2UpfTsKKwkJc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnOworCQltZW1jZyA9IHN3YXBfY2dyb3VwX3JlY29yZChlbnQsIE5VTEwpOworCQlpZiAobWVtY2cpIHsKKwkJCXJlc19jb3VudGVyX3VuY2hhcmdlKCZtZW1jZy0+bWVtc3csIFBBR0VfU0laRSk7CisJCQltZW1fY2dyb3VwX3B1dChtZW1jZyk7CisJCX0KKworCX0KKwkvKiBhZGQgdGhpcyBwYWdlKHBhZ2VfY2dyb3VwKSB0byB0aGUgTFJVIHdlIHdhbnQuICovCisKK30KKwordm9pZCBtZW1fY2dyb3VwX2NhbmNlbF9jaGFyZ2Vfc3dhcGluKHN0cnVjdCBtZW1fY2dyb3VwICptZW0pCit7CisJaWYgKG1lbV9jZ3JvdXBfZGlzYWJsZWQoKSkKKwkJcmV0dXJuOworCWlmICghbWVtKQorCQlyZXR1cm47CisJcmVzX2NvdW50ZXJfdW5jaGFyZ2UoJm1lbS0+cmVzLCBQQUdFX1NJWkUpOworCWlmIChkb19zd2FwX2FjY291bnQpCisJCXJlc19jb3VudGVyX3VuY2hhcmdlKCZtZW0tPm1lbXN3LCBQQUdFX1NJWkUpOworCWNzc19wdXQoJm1lbS0+Y3NzKTsKK30KKworCisvKgogICogdW5jaGFyZ2UgaWYgIXBhZ2VfbWFwcGVkKHBhZ2UpCiAgKi8KLXN0YXRpYyB2b2lkCitzdGF0aWMgc3RydWN0IG1lbV9jZ3JvdXAgKgogX19tZW1fY2dyb3VwX3VuY2hhcmdlX2NvbW1vbihzdHJ1Y3QgcGFnZSAqcGFnZSwgZW51bSBjaGFyZ2VfdHlwZSBjdHlwZSkKIHsKIAlzdHJ1Y3QgcGFnZV9jZ3JvdXAgKnBjOwotCXN0cnVjdCBtZW1fY2dyb3VwICptZW07CisJc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSA9IE5VTEw7CiAJc3RydWN0IG1lbV9jZ3JvdXBfcGVyX3pvbmUgKm16OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlpZiAobWVtX2Nncm91cF9zdWJzeXMuZGlzYWJsZWQpCi0JCXJldHVybjsKKwlpZiAobWVtX2Nncm91cF9kaXNhYmxlZCgpKQorCQlyZXR1cm4gTlVMTDsKKworCWlmIChQYWdlU3dhcENhY2hlKHBhZ2UpKQorCQlyZXR1cm4gTlVMTDsKIAogCS8qCiAJICogQ2hlY2sgaWYgb3VyIHBhZ2VfY2dyb3VwIGlzIHZhbGlkCiAJICovCiAJcGMgPSBsb29rdXBfcGFnZV9jZ3JvdXAocGFnZSk7CiAJaWYgKHVubGlrZWx5KCFwYyB8fCAhUGFnZUNncm91cFVzZWQocGMpKSkKLQkJcmV0dXJuOworCQlyZXR1cm4gTlVMTDsKIAogCWxvY2tfcGFnZV9jZ3JvdXAocGMpOwotCWlmICgoY3R5cGUgPT0gTUVNX0NHUk9VUF9DSEFSR0VfVFlQRV9NQVBQRUQgJiYgcGFnZV9tYXBwZWQocGFnZSkpCi0JICAgICB8fCAhUGFnZUNncm91cFVzZWQocGMpKSB7Ci0JCS8qIFRoaXMgaGFwcGVucyBhdCByYWNlIGluIHphcF9wdGVfcmFuZ2UoKSBhbmQgZG9fc3dhcF9wYWdlKCkqLwotCQl1bmxvY2tfcGFnZV9jZ3JvdXAocGMpOwotCQlyZXR1cm47Ci0JfQotCUNsZWFyUGFnZUNncm91cFVzZWQocGMpOworCiAJbWVtID0gcGMtPm1lbV9jZ3JvdXA7CiAKLQlteiA9IHBhZ2VfY2dyb3VwX3pvbmVpbmZvKHBjKTsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmbXotPmxydV9sb2NrLCBmbGFncyk7Ci0JX19tZW1fY2dyb3VwX3JlbW92ZV9saXN0KG16LCBwYyk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbXotPmxydV9sb2NrLCBmbGFncyk7Ci0JdW5sb2NrX3BhZ2VfY2dyb3VwKHBjKTsKKwlpZiAoIVBhZ2VDZ3JvdXBVc2VkKHBjKSkKKwkJZ290byB1bmxvY2tfb3V0OworCisJc3dpdGNoIChjdHlwZSkgeworCWNhc2UgTUVNX0NHUk9VUF9DSEFSR0VfVFlQRV9NQVBQRUQ6CisJCWlmIChwYWdlX21hcHBlZChwYWdlKSkKKwkJCWdvdG8gdW5sb2NrX291dDsKKwkJYnJlYWs7CisJY2FzZSBNRU1fQ0dST1VQX0NIQVJHRV9UWVBFX1NXQVBPVVQ6CisJCWlmICghUGFnZUFub24ocGFnZSkpIHsJLyogU2hhcmVkIG1lbW9yeSAqLworCQkJaWYgKHBhZ2UtPm1hcHBpbmcgJiYgIXBhZ2VfaXNfZmlsZV9jYWNoZShwYWdlKSkKKwkJCQlnb3RvIHVubG9ja19vdXQ7CisJCX0gZWxzZSBpZiAocGFnZV9tYXBwZWQocGFnZSkpIC8qIEFub24gKi8KKwkJCQlnb3RvIHVubG9ja19vdXQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KIAogCXJlc19jb3VudGVyX3VuY2hhcmdlKCZtZW0tPnJlcywgUEFHRV9TSVpFKTsKLQljc3NfcHV0KCZtZW0tPmNzcyk7CisJaWYgKGRvX3N3YXBfYWNjb3VudCAmJiAoY3R5cGUgIT0gTUVNX0NHUk9VUF9DSEFSR0VfVFlQRV9TV0FQT1VUKSkKKwkJcmVzX2NvdW50ZXJfdW5jaGFyZ2UoJm1lbS0+bWVtc3csIFBBR0VfU0laRSk7CiAKLQlyZXR1cm47CisJbWVtX2Nncm91cF9jaGFyZ2Vfc3RhdGlzdGljcyhtZW0sIHBjLCBmYWxzZSk7CisJQ2xlYXJQYWdlQ2dyb3VwVXNlZChwYyk7CisJLyoKKwkgKiBwYy0+bWVtX2Nncm91cCBpcyBub3QgY2xlYXJlZCBoZXJlLiBJdCB3aWxsIGJlIGFjY2Vzc2VkIHdoZW4gaXQncworCSAqIGZyZWVkIGZyb20gTFJVLiBUaGlzIGlzIHNhZmUgYmVjYXVzZSB1bmNoYXJnZWQgcGFnZSBpcyBleHBlY3RlZCBub3QKKwkgKiB0byBiZSByZXVzZWQgKGZyZWVkIHNvb24pLiBFeGNlcHRpb24gaXMgU3dhcENhY2hlLCBpdCdzIGhhbmRsZWQgYnkKKwkgKiBzcGVjaWFsIGZ1bmN0aW9ucy4KKwkgKi8KKworCW16ID0gcGFnZV9jZ3JvdXBfem9uZWluZm8ocGMpOworCXVubG9ja19wYWdlX2Nncm91cChwYyk7CisKKwkvKiBhdCBzd2Fwb3V0LCB0aGlzIG1lbWNnIHdpbGwgYmUgYWNjZXNzZWQgdG8gcmVjb3JkIHRvIHN3YXAgKi8KKwlpZiAoY3R5cGUgIT0gTUVNX0NHUk9VUF9DSEFSR0VfVFlQRV9TV0FQT1VUKQorCQljc3NfcHV0KCZtZW0tPmNzcyk7CisKKwlyZXR1cm4gbWVtOworCit1bmxvY2tfb3V0OgorCXVubG9ja19wYWdlX2Nncm91cChwYyk7CisJcmV0dXJuIE5VTEw7CiB9CiAKIHZvaWQgbWVtX2Nncm91cF91bmNoYXJnZV9wYWdlKHN0cnVjdCBwYWdlICpwYWdlKQpAQCAtNjg5LDE2ICsxMzQ0LDU1IEBACiB9CiAKIC8qCi0gKiBCZWZvcmUgc3RhcnRpbmcgbWlncmF0aW9uLCBhY2NvdW50IGFnYWluc3QgbmV3IHBhZ2UuCisgKiBjYWxsZWQgZnJvbSBfX2RlbGV0ZV9mcm9tX3N3YXBfY2FjaGUoKSBhbmQgZHJvcCAicGFnZSIgYWNjb3VudC4KKyAqIG1lbWNnIGluZm9ybWF0aW9uIGlzIHJlY29yZGVkIHRvIHN3YXBfY2dyb3VwIG9mICJlbnQiCiAgKi8KLWludCBtZW1fY2dyb3VwX3ByZXBhcmVfbWlncmF0aW9uKHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3QgcGFnZSAqbmV3cGFnZSkKK3ZvaWQgbWVtX2Nncm91cF91bmNoYXJnZV9zd2FwY2FjaGUoc3RydWN0IHBhZ2UgKnBhZ2UsIHN3cF9lbnRyeV90IGVudCkKK3sKKwlzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2c7CisKKwltZW1jZyA9IF9fbWVtX2Nncm91cF91bmNoYXJnZV9jb21tb24ocGFnZSwKKwkJCQkJTUVNX0NHUk9VUF9DSEFSR0VfVFlQRV9TV0FQT1VUKTsKKwkvKiByZWNvcmQgbWVtY2cgaW5mb3JtYXRpb24gKi8KKwlpZiAoZG9fc3dhcF9hY2NvdW50ICYmIG1lbWNnKSB7CisJCXN3YXBfY2dyb3VwX3JlY29yZChlbnQsIG1lbWNnKTsKKwkJbWVtX2Nncm91cF9nZXQobWVtY2cpOworCX0KKwlpZiAobWVtY2cpCisJCWNzc19wdXQoJm1lbWNnLT5jc3MpOworfQorCisjaWZkZWYgQ09ORklHX0NHUk9VUF9NRU1fUkVTX0NUTFJfU1dBUAorLyoKKyAqIGNhbGxlZCBmcm9tIHN3YXBfZW50cnlfZnJlZSgpLiByZW1vdmUgcmVjb3JkIGluIHN3YXBfY2dyb3VwIGFuZAorICogdW5jaGFyZ2UgIm1lbXN3IiBhY2NvdW50LgorICovCit2b2lkIG1lbV9jZ3JvdXBfdW5jaGFyZ2Vfc3dhcChzd3BfZW50cnlfdCBlbnQpCit7CisJc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnOworCisJaWYgKCFkb19zd2FwX2FjY291bnQpCisJCXJldHVybjsKKworCW1lbWNnID0gc3dhcF9jZ3JvdXBfcmVjb3JkKGVudCwgTlVMTCk7CisJaWYgKG1lbWNnKSB7CisJCXJlc19jb3VudGVyX3VuY2hhcmdlKCZtZW1jZy0+bWVtc3csIFBBR0VfU0laRSk7CisJCW1lbV9jZ3JvdXBfcHV0KG1lbWNnKTsKKwl9Cit9CisjZW5kaWYKKworLyoKKyAqIEJlZm9yZSBzdGFydGluZyBtaWdyYXRpb24sIGFjY291bnQgUEFHRV9TSVpFIHRvIG1lbV9jZ3JvdXAgdGhhdCB0aGUgb2xkCisgKiBwYWdlIGJlbG9uZ3MgdG8uCisgKi8KK2ludCBtZW1fY2dyb3VwX3ByZXBhcmVfbWlncmF0aW9uKHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3QgbWVtX2Nncm91cCAqKnB0cikKIHsKIAlzdHJ1Y3QgcGFnZV9jZ3JvdXAgKnBjOwogCXN0cnVjdCBtZW1fY2dyb3VwICptZW0gPSBOVUxMOwotCWVudW0gY2hhcmdlX3R5cGUgY3R5cGUgPSBNRU1fQ0dST1VQX0NIQVJHRV9UWVBFX01BUFBFRDsKIAlpbnQgcmV0ID0gMDsKIAotCWlmIChtZW1fY2dyb3VwX3N1YnN5cy5kaXNhYmxlZCkKKwlpZiAobWVtX2Nncm91cF9kaXNhYmxlZCgpKQogCQlyZXR1cm4gMDsKIAogCXBjID0gbG9va3VwX3BhZ2VfY2dyb3VwKHBhZ2UpOwpAQCAtNzA2LDQxICsxNDAwLDY3IEBACiAJaWYgKFBhZ2VDZ3JvdXBVc2VkKHBjKSkgewogCQltZW0gPSBwYy0+bWVtX2Nncm91cDsKIAkJY3NzX2dldCgmbWVtLT5jc3MpOwotCQlpZiAoUGFnZUNncm91cENhY2hlKHBjKSkgewotCQkJaWYgKHBhZ2VfaXNfZmlsZV9jYWNoZShwYWdlKSkKLQkJCQljdHlwZSA9IE1FTV9DR1JPVVBfQ0hBUkdFX1RZUEVfQ0FDSEU7Ci0JCQllbHNlCi0JCQkJY3R5cGUgPSBNRU1fQ0dST1VQX0NIQVJHRV9UWVBFX1NITUVNOwotCQl9CiAJfQogCXVubG9ja19wYWdlX2Nncm91cChwYyk7CisKIAlpZiAobWVtKSB7Ci0JCXJldCA9IG1lbV9jZ3JvdXBfY2hhcmdlX2NvbW1vbihuZXdwYWdlLCBOVUxMLCBHRlBfS0VSTkVMLAotCQkJY3R5cGUsIG1lbSk7CisJCXJldCA9IF9fbWVtX2Nncm91cF90cnlfY2hhcmdlKE5VTEwsIEdGUF9LRVJORUwsICZtZW0sIGZhbHNlKTsKIAkJY3NzX3B1dCgmbWVtLT5jc3MpOwogCX0KKwkqcHRyID0gbWVtOwogCXJldHVybiByZXQ7CiB9CiAKIC8qIHJlbW92ZSByZWR1bmRhbnQgY2hhcmdlIGlmIG1pZ3JhdGlvbiBmYWlsZWQqLwotdm9pZCBtZW1fY2dyb3VwX2VuZF9taWdyYXRpb24oc3RydWN0IHBhZ2UgKm5ld3BhZ2UpCit2b2lkIG1lbV9jZ3JvdXBfZW5kX21pZ3JhdGlvbihzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtLAorCQlzdHJ1Y3QgcGFnZSAqb2xkcGFnZSwgc3RydWN0IHBhZ2UgKm5ld3BhZ2UpCiB7CisJc3RydWN0IHBhZ2UgKnRhcmdldCwgKnVudXNlZDsKKwlzdHJ1Y3QgcGFnZV9jZ3JvdXAgKnBjOworCWVudW0gY2hhcmdlX3R5cGUgY3R5cGU7CisKKwlpZiAoIW1lbSkKKwkJcmV0dXJuOworCisJLyogYXQgbWlncmF0aW9uIHN1Y2Nlc3MsIG9sZHBhZ2UtPm1hcHBpbmcgaXMgTlVMTC4gKi8KKwlpZiAob2xkcGFnZS0+bWFwcGluZykgeworCQl0YXJnZXQgPSBvbGRwYWdlOworCQl1bnVzZWQgPSBOVUxMOworCX0gZWxzZSB7CisJCXRhcmdldCA9IG5ld3BhZ2U7CisJCXVudXNlZCA9IG9sZHBhZ2U7CisJfQorCisJaWYgKFBhZ2VBbm9uKHRhcmdldCkpCisJCWN0eXBlID0gTUVNX0NHUk9VUF9DSEFSR0VfVFlQRV9NQVBQRUQ7CisJZWxzZSBpZiAocGFnZV9pc19maWxlX2NhY2hlKHRhcmdldCkpCisJCWN0eXBlID0gTUVNX0NHUk9VUF9DSEFSR0VfVFlQRV9DQUNIRTsKKwllbHNlCisJCWN0eXBlID0gTUVNX0NHUk9VUF9DSEFSR0VfVFlQRV9TSE1FTTsKKworCS8qIHVudXNlZCBwYWdlIGlzIG5vdCBvbiByYWRpeC10cmVlIG5vdy4gKi8KKwlpZiAodW51c2VkKQorCQlfX21lbV9jZ3JvdXBfdW5jaGFyZ2VfY29tbW9uKHVudXNlZCwgY3R5cGUpOworCisJcGMgPSBsb29rdXBfcGFnZV9jZ3JvdXAodGFyZ2V0KTsKIAkvKgotCSAqIEF0IHN1Y2Nlc3MsIHBhZ2UtPm1hcHBpbmcgaXMgbm90IE5VTEwuCi0JICogc3BlY2lhbCByb2xsYmFjayBjYXJlIGlzIG5lY2Vzc2FyeSB3aGVuCi0JICogMS4gYXQgbWlncmF0aW9uIGZhaWx1cmUuIChuZXdwYWdlLT5tYXBwaW5nIGlzIGNsZWFyZWQgaW4gdGhpcyBjYXNlKQotCSAqIDIuIHRoZSBuZXdwYWdlIHdhcyBtb3ZlZCBidXQgbm90IHJlbWFwcGVkIGFnYWluIGJlY2F1c2UgdGhlIHRhc2sKLQkgKiAgICBleGl0cyBhbmQgdGhlIG5ld3BhZ2UgaXMgb2Jzb2xldGUuIEluIHRoaXMgY2FzZSwgdGhlIG5ldyBwYWdlCi0JICogICAgbWF5IGJlIGEgc3dhcGNhY2hlLiBTbywgd2UganVzdCBjYWxsIG1lbV9jZ3JvdXBfdW5jaGFyZ2VfcGFnZSgpCi0JICogICAgYWx3YXlzIGZvciBhdm9pZGluZyBtZXNzLiBUaGUgIHBhZ2VfY2dyb3VwIHdpbGwgYmUgcmVtb3ZlZCBpZgotCSAqICAgIHVubmVjZXNzYXJ5LiBGaWxlIGNhY2hlIHBhZ2VzIGlzIHN0aWxsIG9uIHJhZGl4LXRyZWUuIERvbid0Ci0JICogICAgY2FyZSBpdC4KKwkgKiBfX21lbV9jZ3JvdXBfY29tbWl0X2NoYXJnZSgpIGNoZWNrIFBDR19VU0VEIGJpdCBvZiBwYWdlX2Nncm91cC4KKwkgKiBTbywgZG91YmxlLWNvdW50aW5nIGlzIGVmZmVjdGl2ZWx5IGF2b2lkZWQuCiAJICovCi0JaWYgKCFuZXdwYWdlLT5tYXBwaW5nKQotCQlfX21lbV9jZ3JvdXBfdW5jaGFyZ2VfY29tbW9uKG5ld3BhZ2UsCi0JCQkJTUVNX0NHUk9VUF9DSEFSR0VfVFlQRV9GT1JDRSk7Ci0JZWxzZSBpZiAoUGFnZUFub24obmV3cGFnZSkpCi0JCW1lbV9jZ3JvdXBfdW5jaGFyZ2VfcGFnZShuZXdwYWdlKTsKKwlfX21lbV9jZ3JvdXBfY29tbWl0X2NoYXJnZShtZW0sIHBjLCBjdHlwZSk7CisKKwkvKgorCSAqIEJvdGggb2Ygb2xkcGFnZSBhbmQgbmV3cGFnZSBhcmUgc3RpbGwgdW5kZXIgbG9ja19wYWdlKCkuCisJICogVGhlbiwgd2UgZG9uJ3QgaGF2ZSB0byBjYXJlIGFib3V0IHJhY2UgaW4gcmFkaXgtdHJlZS4KKwkgKiBCdXQgd2UgaGF2ZSB0byBiZSBjYXJlZnVsIHRoYXQgdGhpcyBwYWdlIGlzIHVubWFwcGVkIG9yIG5vdC4KKwkgKgorCSAqIFRoZXJlIGlzIGEgY2FzZSBmb3IgIXBhZ2VfbWFwcGVkKCkuIEF0IHRoZSBzdGFydCBvZgorCSAqIG1pZ3JhdGlvbiwgb2xkcGFnZSB3YXMgbWFwcGVkLiBCdXQgbm93LCBpdCdzIHphcHBlZC4KKwkgKiBCdXQgd2Uga25vdyAqdGFyZ2V0KiBwYWdlIGlzIG5vdCBmcmVlZC9yZXVzZWQgdW5kZXIgdXMuCisJICogbWVtX2Nncm91cF91bmNoYXJnZV9wYWdlKCkgZG9lcyBhbGwgbmVjZXNzYXJ5IGNoZWNrcy4KKwkgKi8KKwlpZiAoY3R5cGUgPT0gTUVNX0NHUk9VUF9DSEFSR0VfVFlQRV9NQVBQRUQpCisJCW1lbV9jZ3JvdXBfdW5jaGFyZ2VfcGFnZSh0YXJnZXQpOwogfQogCiAvKgpAQCAtNzQ4LDI5ICsxNDY4LDI2IEBACiAgKiBUaGlzIGlzIHR5cGljYWxseSB1c2VkIGZvciBwYWdlIHJlY2xhaW1pbmcgZm9yIHNobWVtIGZvciByZWR1Y2luZyBzaWRlCiAgKiBlZmZlY3Qgb2YgcGFnZSBhbGxvY2F0aW9uIGZyb20gc2htZW0sIHdoaWNoIGlzIHVzZWQgYnkgc29tZSBtZW1fY2dyb3VwLgogICovCi1pbnQgbWVtX2Nncm91cF9zaHJpbmtfdXNhZ2Uoc3RydWN0IG1tX3N0cnVjdCAqbW0sIGdmcF90IGdmcF9tYXNrKQoraW50IG1lbV9jZ3JvdXBfc2hyaW5rX3VzYWdlKHN0cnVjdCBwYWdlICpwYWdlLAorCQkJICAgIHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAorCQkJICAgIGdmcF90IGdmcF9tYXNrKQogewotCXN0cnVjdCBtZW1fY2dyb3VwICptZW07CisJc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSA9IE5VTEw7CiAJaW50IHByb2dyZXNzID0gMDsKIAlpbnQgcmV0cnkgPSBNRU1fQ0dST1VQX1JFQ0xBSU1fUkVUUklFUzsKIAotCWlmIChtZW1fY2dyb3VwX3N1YnN5cy5kaXNhYmxlZCkKKwlpZiAobWVtX2Nncm91cF9kaXNhYmxlZCgpKQogCQlyZXR1cm4gMDsKLQlpZiAoIW1tKQorCWlmIChwYWdlKQorCQltZW0gPSB0cnlfZ2V0X21lbV9jZ3JvdXBfZnJvbV9zd2FwY2FjaGUocGFnZSk7CisJaWYgKCFtZW0gJiYgbW0pCisJCW1lbSA9IHRyeV9nZXRfbWVtX2Nncm91cF9mcm9tX21tKG1tKTsKKwlpZiAodW5saWtlbHkoIW1lbSkpCiAJCXJldHVybiAwOwogCi0JcmN1X3JlYWRfbG9jaygpOwotCW1lbSA9IG1lbV9jZ3JvdXBfZnJvbV90YXNrKHJjdV9kZXJlZmVyZW5jZShtbS0+b3duZXIpKTsKLQlpZiAodW5saWtlbHkoIW1lbSkpIHsKLQkJcmN1X3JlYWRfdW5sb2NrKCk7Ci0JCXJldHVybiAwOwotCX0KLQljc3NfZ2V0KCZtZW0tPmNzcyk7Ci0JcmN1X3JlYWRfdW5sb2NrKCk7Ci0KIAlkbyB7Ci0JCXByb2dyZXNzID0gdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyhtZW0sIGdmcF9tYXNrKTsKLQkJcHJvZ3Jlc3MgKz0gcmVzX2NvdW50ZXJfY2hlY2tfdW5kZXJfbGltaXQoJm1lbS0+cmVzKTsKKwkJcHJvZ3Jlc3MgPSBtZW1fY2dyb3VwX2hpZXJhcmNoaWNhbF9yZWNsYWltKG1lbSwgZ2ZwX21hc2ssIHRydWUpOworCQlwcm9ncmVzcyArPSBtZW1fY2dyb3VwX2NoZWNrX3VuZGVyX2xpbWl0KG1lbSk7CiAJfSB3aGlsZSAoIXByb2dyZXNzICYmIC0tcmV0cnkpOwogCiAJY3NzX3B1dCgmbWVtLT5jc3MpOwpAQCAtNzc5LDExNiArMTQ5NiwyOTUgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IG1lbV9jZ3JvdXBfcmVzaXplX2xpbWl0KHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywgdW5zaWduZWQgbG9uZyBsb25nIHZhbCkKK3N0YXRpYyBERUZJTkVfTVVURVgoc2V0X2xpbWl0X211dGV4KTsKKworc3RhdGljIGludCBtZW1fY2dyb3VwX3Jlc2l6ZV9saW1pdChzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csCisJCQkJdW5zaWduZWQgbG9uZyBsb25nIHZhbCkKIHsKIAogCWludCByZXRyeV9jb3VudCA9IE1FTV9DR1JPVVBfUkVDTEFJTV9SRVRSSUVTOwogCWludCBwcm9ncmVzczsKKwl1NjQgbWVtc3dsaW1pdDsKIAlpbnQgcmV0ID0gMDsKIAotCXdoaWxlIChyZXNfY291bnRlcl9zZXRfbGltaXQoJm1lbWNnLT5yZXMsIHZhbCkpIHsKKwl3aGlsZSAocmV0cnlfY291bnQpIHsKIAkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CiAJCQlyZXQgPSAtRUlOVFI7CiAJCQlicmVhazsKIAkJfQotCQlpZiAoIXJldHJ5X2NvdW50KSB7Ci0JCQlyZXQgPSAtRUJVU1k7CisJCS8qCisJCSAqIFJhdGhlciB0aGFuIGhpZGUgYWxsIGluIHNvbWUgZnVuY3Rpb24sIEkgZG8gdGhpcyBpbgorCQkgKiBvcGVuIGNvZGVkIG1hbm5lci4gWW91IHNlZSB3aGF0IHRoaXMgcmVhbGx5IGRvZXMuCisJCSAqIFdlIGhhdmUgdG8gZ3VhcmFudGVlIG1lbS0+cmVzLmxpbWl0IDwgbWVtLT5tZW1zdy5saW1pdC4KKwkJICovCisJCW11dGV4X2xvY2soJnNldF9saW1pdF9tdXRleCk7CisJCW1lbXN3bGltaXQgPSByZXNfY291bnRlcl9yZWFkX3U2NCgmbWVtY2ctPm1lbXN3LCBSRVNfTElNSVQpOworCQlpZiAobWVtc3dsaW1pdCA8IHZhbCkgeworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCW11dGV4X3VubG9jaygmc2V0X2xpbWl0X211dGV4KTsKIAkJCWJyZWFrOwogCQl9Ci0JCXByb2dyZXNzID0gdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyhtZW1jZywgR0ZQX0tFUk5FTCk7Ci0JCWlmICghcHJvZ3Jlc3MpCisJCXJldCA9IHJlc19jb3VudGVyX3NldF9saW1pdCgmbWVtY2ctPnJlcywgdmFsKTsKKwkJbXV0ZXhfdW5sb2NrKCZzZXRfbGltaXRfbXV0ZXgpOworCisJCWlmICghcmV0KQorCQkJYnJlYWs7CisKKwkJcHJvZ3Jlc3MgPSBtZW1fY2dyb3VwX2hpZXJhcmNoaWNhbF9yZWNsYWltKG1lbWNnLCBHRlBfS0VSTkVMLAorCQkJCQkJCSAgIGZhbHNlKTsKKyAgCQlpZiAoIXByb2dyZXNzKQkJCXJldHJ5X2NvdW50LS07CisJfQorCisJcmV0dXJuIHJldDsKK30KKworaW50IG1lbV9jZ3JvdXBfcmVzaXplX21lbXN3X2xpbWl0KHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywKKwkJCQl1bnNpZ25lZCBsb25nIGxvbmcgdmFsKQoreworCWludCByZXRyeV9jb3VudCA9IE1FTV9DR1JPVVBfUkVDTEFJTV9SRVRSSUVTOworCXU2NCBtZW1saW1pdCwgb2xkdXNhZ2UsIGN1cnVzYWdlOworCWludCByZXQ7CisKKwlpZiAoIWRvX3N3YXBfYWNjb3VudCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl3aGlsZSAocmV0cnlfY291bnQpIHsKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQlyZXQgPSAtRUlOVFI7CisJCQlicmVhazsKKwkJfQorCQkvKgorCQkgKiBSYXRoZXIgdGhhbiBoaWRlIGFsbCBpbiBzb21lIGZ1bmN0aW9uLCBJIGRvIHRoaXMgaW4KKwkJICogb3BlbiBjb2RlZCBtYW5uZXIuIFlvdSBzZWUgd2hhdCB0aGlzIHJlYWxseSBkb2VzLgorCQkgKiBXZSBoYXZlIHRvIGd1YXJhbnRlZSBtZW0tPnJlcy5saW1pdCA8IG1lbS0+bWVtc3cubGltaXQuCisJCSAqLworCQltdXRleF9sb2NrKCZzZXRfbGltaXRfbXV0ZXgpOworCQltZW1saW1pdCA9IHJlc19jb3VudGVyX3JlYWRfdTY0KCZtZW1jZy0+cmVzLCBSRVNfTElNSVQpOworCQlpZiAobWVtbGltaXQgPiB2YWwpIHsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQltdXRleF91bmxvY2soJnNldF9saW1pdF9tdXRleCk7CisJCQlicmVhazsKKwkJfQorCQlyZXQgPSByZXNfY291bnRlcl9zZXRfbGltaXQoJm1lbWNnLT5tZW1zdywgdmFsKTsKKwkJbXV0ZXhfdW5sb2NrKCZzZXRfbGltaXRfbXV0ZXgpOworCisJCWlmICghcmV0KQorCQkJYnJlYWs7CisKKwkJb2xkdXNhZ2UgPSByZXNfY291bnRlcl9yZWFkX3U2NCgmbWVtY2ctPm1lbXN3LCBSRVNfVVNBR0UpOworCQltZW1fY2dyb3VwX2hpZXJhcmNoaWNhbF9yZWNsYWltKG1lbWNnLCBHRlBfS0VSTkVMLCB0cnVlKTsKKwkJY3VydXNhZ2UgPSByZXNfY291bnRlcl9yZWFkX3U2NCgmbWVtY2ctPm1lbXN3LCBSRVNfVVNBR0UpOworCQlpZiAoY3VydXNhZ2UgPj0gb2xkdXNhZ2UpCiAJCQlyZXRyeV9jb3VudC0tOwogCX0KIAlyZXR1cm4gcmV0OwogfQogCi0KIC8qCiAgKiBUaGlzIHJvdXRpbmUgdHJhdmVyc2UgcGFnZV9jZ3JvdXAgaW4gZ2l2ZW4gbGlzdCBhbmQgZHJvcCB0aGVtIGFsbC4KICAqICpBbmQqIHRoaXMgcm91dGluZSBkb2Vzbid0IHJlY2xhaW0gcGFnZSBpdHNlbGYsIGp1c3QgcmVtb3ZlcyBwYWdlX2Nncm91cC4KICAqLwotI2RlZmluZSBGT1JDRV9VTkNIQVJHRV9CQVRDSAkoMTI4KQotc3RhdGljIHZvaWQgbWVtX2Nncm91cF9mb3JjZV9lbXB0eV9saXN0KHN0cnVjdCBtZW1fY2dyb3VwICptZW0sCi0JCQkgICAgc3RydWN0IG1lbV9jZ3JvdXBfcGVyX3pvbmUgKm16LAotCQkJICAgIGVudW0gbHJ1X2xpc3QgbHJ1KQorc3RhdGljIGludCBtZW1fY2dyb3VwX2ZvcmNlX2VtcHR5X2xpc3Qoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSwKKwkJCQlpbnQgbm9kZSwgaW50IHppZCwgZW51bSBscnVfbGlzdCBscnUpCiB7Ci0Jc3RydWN0IHBhZ2VfY2dyb3VwICpwYzsKLQlzdHJ1Y3QgcGFnZSAqcGFnZTsKLQlpbnQgY291bnQgPSBGT1JDRV9VTkNIQVJHRV9CQVRDSDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCB6b25lICp6b25lOworCXN0cnVjdCBtZW1fY2dyb3VwX3Blcl96b25lICptejsKKwlzdHJ1Y3QgcGFnZV9jZ3JvdXAgKnBjLCAqYnVzeTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzLCBsb29wOwogCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3Q7CisJaW50IHJldCA9IDA7CiAKKwl6b25lID0gJk5PREVfREFUQShub2RlKS0+bm9kZV96b25lc1t6aWRdOworCW16ID0gbWVtX2Nncm91cF96b25laW5mbyhtZW0sIG5vZGUsIHppZCk7CiAJbGlzdCA9ICZtei0+bGlzdHNbbHJ1XTsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZtei0+bHJ1X2xvY2ssIGZsYWdzKTsKLQl3aGlsZSAoIWxpc3RfZW1wdHkobGlzdCkpIHsKLQkJcGMgPSBsaXN0X2VudHJ5KGxpc3QtPnByZXYsIHN0cnVjdCBwYWdlX2Nncm91cCwgbHJ1KTsKLQkJcGFnZSA9IHBjLT5wYWdlOwotCQlpZiAoIVBhZ2VDZ3JvdXBVc2VkKHBjKSkKLQkJCWJyZWFrOwotCQlnZXRfcGFnZShwYWdlKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbXotPmxydV9sb2NrLCBmbGFncyk7Ci0JCS8qCi0JCSAqIENoZWNrIGlmIHRoaXMgcGFnZSBpcyBvbiBMUlUuICFMUlUgcGFnZSBjYW4gYmUgZm91bmQKLQkJICogaWYgaXQncyB1bmRlciBwYWdlIG1pZ3JhdGlvbi4KLQkJICovCi0JCWlmIChQYWdlTFJVKHBhZ2UpKSB7Ci0JCQlfX21lbV9jZ3JvdXBfdW5jaGFyZ2VfY29tbW9uKHBhZ2UsCi0JCQkJCU1FTV9DR1JPVVBfQ0hBUkdFX1RZUEVfRk9SQ0UpOwotCQkJcHV0X3BhZ2UocGFnZSk7Ci0JCQlpZiAoLS1jb3VudCA8PSAwKSB7Ci0JCQkJY291bnQgPSBGT1JDRV9VTkNIQVJHRV9CQVRDSDsKLQkJCQljb25kX3Jlc2NoZWQoKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXNwaW5fbG9ja19pcnFzYXZlKCZtei0+bHJ1X2xvY2ssIGZsYWdzKTsKKwlsb29wID0gTUVNX0NHUk9VUF9aU1RBVChteiwgbHJ1KTsKKwkvKiBnaXZlIHNvbWUgbWFyZ2luIGFnYWluc3QgRUJVU1kgZXRjLi4uKi8KKwlsb29wICs9IDI1NjsKKwlidXN5ID0gTlVMTDsKKwl3aGlsZSAobG9vcC0tKSB7CisJCXJldCA9IDA7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZ6b25lLT5scnVfbG9jaywgZmxhZ3MpOworCQlpZiAobGlzdF9lbXB0eShsaXN0KSkgeworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmem9uZS0+bHJ1X2xvY2ssIGZsYWdzKTsKIAkJCWJyZWFrOwogCQl9Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZtei0+bHJ1X2xvY2ssIGZsYWdzKTsKKwkJcGMgPSBsaXN0X2VudHJ5KGxpc3QtPnByZXYsIHN0cnVjdCBwYWdlX2Nncm91cCwgbHJ1KTsKKwkJaWYgKGJ1c3kgPT0gcGMpIHsKKwkJCWxpc3RfbW92ZSgmcGMtPmxydSwgbGlzdCk7CisJCQlidXN5ID0gMDsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnpvbmUtPmxydV9sb2NrLCBmbGFncyk7CisJCQljb250aW51ZTsKKwkJfQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ6b25lLT5scnVfbG9jaywgZmxhZ3MpOworCisJCXJldCA9IG1lbV9jZ3JvdXBfbW92ZV9wYXJlbnQocGMsIG1lbSwgR0ZQX0tFUk5FTCk7CisJCWlmIChyZXQgPT0gLUVOT01FTSkKKwkJCWJyZWFrOworCisJCWlmIChyZXQgPT0gLUVCVVNZIHx8IHJldCA9PSAtRUlOVkFMKSB7CisJCQkvKiBmb3VuZCBsb2NrIGNvbnRlbnRpb24gb3IgInBjIiBpcyBvYnNvbGV0ZS4gKi8KKwkJCWJ1c3kgPSBwYzsKKwkJCWNvbmRfcmVzY2hlZCgpOworCQl9IGVsc2UKKwkJCWJ1c3kgPSBOVUxMOwogCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtei0+bHJ1X2xvY2ssIGZsYWdzKTsKKworCWlmICghcmV0ICYmICFsaXN0X2VtcHR5KGxpc3QpKQorCQlyZXR1cm4gLUVCVVNZOworCXJldHVybiByZXQ7CiB9CiAKIC8qCiAgKiBtYWtlIG1lbV9jZ3JvdXAncyBjaGFyZ2UgdG8gYmUgMCBpZiB0aGVyZSBpcyBubyB0YXNrLgogICogVGhpcyBlbmFibGVzIGRlbGV0aW5nIHRoaXMgbWVtX2Nncm91cC4KICAqLwotc3RhdGljIGludCBtZW1fY2dyb3VwX2ZvcmNlX2VtcHR5KHN0cnVjdCBtZW1fY2dyb3VwICptZW0pCitzdGF0aWMgaW50IG1lbV9jZ3JvdXBfZm9yY2VfZW1wdHkoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSwgYm9vbCBmcmVlX2FsbCkKIHsKLQlpbnQgcmV0ID0gLUVCVVNZOwotCWludCBub2RlLCB6aWQ7CisJaW50IHJldDsKKwlpbnQgbm9kZSwgemlkLCBzaHJpbms7CisJaW50IG5yX3JldHJpZXMgPSBNRU1fQ0dST1VQX1JFQ0xBSU1fUkVUUklFUzsKKwlzdHJ1Y3QgY2dyb3VwICpjZ3JwID0gbWVtLT5jc3MuY2dyb3VwOwogCiAJY3NzX2dldCgmbWVtLT5jc3MpOwotCS8qCi0JICogcGFnZSByZWNsYWltIGNvZGUgKGtzd2FwZCBldGMuLikgd2lsbCBtb3ZlIHBhZ2VzIGJldHdlZW4KLQkgKiBhY3RpdmVfbGlzdCA8LT4gaW5hY3RpdmVfbGlzdCB3aGlsZSB3ZSBkb24ndCB0YWtlIGEgbG9jay4KLQkgKiBTbywgd2UgaGF2ZSB0byBkbyBsb29wIGhlcmUgdW50aWwgYWxsIGxpc3RzIGFyZSBlbXB0eS4KLQkgKi8KKworCXNocmluayA9IDA7CisJLyogc2hvdWxkIGZyZWUgYWxsID8gKi8KKwlpZiAoZnJlZV9hbGwpCisJCWdvdG8gdHJ5X3RvX2ZyZWU7Cittb3ZlX2FjY291bnQ6CiAJd2hpbGUgKG1lbS0+cmVzLnVzYWdlID4gMCkgewotCQlpZiAoYXRvbWljX3JlYWQoJm1lbS0+Y3NzLmNncm91cC0+Y291bnQpID4gMCkKKwkJcmV0ID0gLUVCVVNZOworCQlpZiAoY2dyb3VwX3Rhc2tfY291bnQoY2dycCkgfHwgIWxpc3RfZW1wdHkoJmNncnAtPmNoaWxkcmVuKSkKKwkJCWdvdG8gb3V0OworCQlyZXQgPSAtRUlOVFI7CisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKIAkJCWdvdG8gb3V0OwogCQkvKiBUaGlzIGlzIGZvciBtYWtpbmcgYWxsICp1c2VkKiBwYWdlcyB0byBiZSBvbiBMUlUuICovCiAJCWxydV9hZGRfZHJhaW5fYWxsKCk7Ci0JCWZvcl9lYWNoX25vZGVfc3RhdGUobm9kZSwgTl9QT1NTSUJMRSkKLQkJCWZvciAoemlkID0gMDsgemlkIDwgTUFYX05SX1pPTkVTOyB6aWQrKykgewotCQkJCXN0cnVjdCBtZW1fY2dyb3VwX3Blcl96b25lICptejsKKwkJcmV0ID0gMDsKKwkJZm9yX2VhY2hfbm9kZV9zdGF0ZShub2RlLCBOX1BPU1NJQkxFKSB7CisJCQlmb3IgKHppZCA9IDA7ICFyZXQgJiYgemlkIDwgTUFYX05SX1pPTkVTOyB6aWQrKykgewogCQkJCWVudW0gbHJ1X2xpc3QgbDsKLQkJCQlteiA9IG1lbV9jZ3JvdXBfem9uZWluZm8obWVtLCBub2RlLCB6aWQpOwotCQkJCWZvcl9lYWNoX2xydShsKQotCQkJCQltZW1fY2dyb3VwX2ZvcmNlX2VtcHR5X2xpc3QobWVtLCBteiwgbCk7CisJCQkJZm9yX2VhY2hfbHJ1KGwpIHsKKwkJCQkJcmV0ID0gbWVtX2Nncm91cF9mb3JjZV9lbXB0eV9saXN0KG1lbSwKKwkJCQkJCQlub2RlLCB6aWQsIGwpOworCQkJCQlpZiAocmV0KQorCQkJCQkJYnJlYWs7CisJCQkJfQogCQkJfQorCQkJaWYgKHJldCkKKwkJCQlicmVhazsKKwkJfQorCQkvKiBpdCBzZWVtcyBwYXJlbnQgY2dyb3VwIGRvZXNuJ3QgaGF2ZSBlbm91Z2ggbWVtICovCisJCWlmIChyZXQgPT0gLUVOT01FTSkKKwkJCWdvdG8gdHJ5X3RvX2ZyZWU7CiAJCWNvbmRfcmVzY2hlZCgpOwogCX0KIAlyZXQgPSAwOwogb3V0OgogCWNzc19wdXQoJm1lbS0+Y3NzKTsKIAlyZXR1cm4gcmV0OworCit0cnlfdG9fZnJlZToKKwkvKiByZXR1cm5zIEVCVVNZIGlmIHRoZXJlIGlzIGEgdGFzayBvciBpZiB3ZSBjb21lIGhlcmUgdHdpY2UuICovCisJaWYgKGNncm91cF90YXNrX2NvdW50KGNncnApIHx8ICFsaXN0X2VtcHR5KCZjZ3JwLT5jaGlsZHJlbikgfHwgc2hyaW5rKSB7CisJCXJldCA9IC1FQlVTWTsKKwkJZ290byBvdXQ7CisJfQorCS8qIHdlIGNhbGwgdHJ5LXRvLWZyZWUgcGFnZXMgZm9yIG1ha2UgdGhpcyBjZ3JvdXAgZW1wdHkgKi8KKwlscnVfYWRkX2RyYWluX2FsbCgpOworCS8qIHRyeSB0byBmcmVlIGFsbCBwYWdlcyBpbiB0aGlzIGNncm91cCAqLworCXNocmluayA9IDE7CisJd2hpbGUgKG5yX3JldHJpZXMgJiYgbWVtLT5yZXMudXNhZ2UgPiAwKSB7CisJCWludCBwcm9ncmVzczsKKworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCXJldCA9IC1FSU5UUjsKKwkJCWdvdG8gb3V0OworCQl9CisJCXByb2dyZXNzID0gdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyhtZW0sIEdGUF9LRVJORUwsCisJCQkJCQlmYWxzZSwgZ2V0X3N3YXBwaW5lc3MobWVtKSk7CisJCWlmICghcHJvZ3Jlc3MpIHsKKwkJCW5yX3JldHJpZXMtLTsKKwkJCS8qIG1heWJlIHNvbWUgd3JpdGViYWNrIGlzIG5lY2Vzc2FyeSAqLworCQkJY29uZ2VzdGlvbl93YWl0KFdSSVRFLCBIWi8xMCk7CisJCX0KKworCX0KKwlscnVfYWRkX2RyYWluKCk7CisJLyogdHJ5IG1vdmVfYWNjb3VudC4uLnRoZXJlIG1heSBiZSBzb21lICpsb2NrZWQqIHBhZ2VzLiAqLworCWlmIChtZW0tPnJlcy51c2FnZSkKKwkJZ290byBtb3ZlX2FjY291bnQ7CisJcmV0ID0gMDsKKwlnb3RvIG91dDsKK30KKworaW50IG1lbV9jZ3JvdXBfZm9yY2VfZW1wdHlfd3JpdGUoc3RydWN0IGNncm91cCAqY29udCwgdW5zaWduZWQgaW50IGV2ZW50KQoreworCXJldHVybiBtZW1fY2dyb3VwX2ZvcmNlX2VtcHR5KG1lbV9jZ3JvdXBfZnJvbV9jb250KGNvbnQpLCB0cnVlKTsKK30KKworCitzdGF0aWMgdTY0IG1lbV9jZ3JvdXBfaGllcmFyY2h5X3JlYWQoc3RydWN0IGNncm91cCAqY29udCwgc3RydWN0IGNmdHlwZSAqY2Z0KQoreworCXJldHVybiBtZW1fY2dyb3VwX2Zyb21fY29udChjb250KS0+dXNlX2hpZXJhcmNoeTsKK30KKworc3RhdGljIGludCBtZW1fY2dyb3VwX2hpZXJhcmNoeV93cml0ZShzdHJ1Y3QgY2dyb3VwICpjb250LCBzdHJ1Y3QgY2Z0eXBlICpjZnQsCisJCQkJCXU2NCB2YWwpCit7CisJaW50IHJldHZhbCA9IDA7CisJc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSA9IG1lbV9jZ3JvdXBfZnJvbV9jb250KGNvbnQpOworCXN0cnVjdCBjZ3JvdXAgKnBhcmVudCA9IGNvbnQtPnBhcmVudDsKKwlzdHJ1Y3QgbWVtX2Nncm91cCAqcGFyZW50X21lbSA9IE5VTEw7CisKKwlpZiAocGFyZW50KQorCQlwYXJlbnRfbWVtID0gbWVtX2Nncm91cF9mcm9tX2NvbnQocGFyZW50KTsKKworCWNncm91cF9sb2NrKCk7CisJLyoKKwkgKiBJZiBwYXJlbnQncyB1c2VfaGllYXJjaHkgaXMgc2V0LCB3ZSBjYW4ndCBtYWtlIGFueSBtb2RpZmljYXRpb25zCisJICogaW4gdGhlIGNoaWxkIHN1YnRyZWVzLiBJZiBpdCBpcyB1bnNldCwgdGhlbiB0aGUgY2hhbmdlIGNhbgorCSAqIG9jY3VyLCBwcm92aWRlZCB0aGUgY3VycmVudCBjZ3JvdXAgaGFzIG5vIGNoaWxkcmVuLgorCSAqCisJICogRm9yIHRoZSByb290IGNncm91cCwgcGFyZW50X21lbSBpcyBOVUxMLCB3ZSBhbGxvdyB2YWx1ZSB0byBiZQorCSAqIHNldCBpZiB0aGVyZSBhcmUgbm8gY2hpbGRyZW4uCisJICovCisJaWYgKCghcGFyZW50X21lbSB8fCAhcGFyZW50X21lbS0+dXNlX2hpZXJhcmNoeSkgJiYKKwkJCQkodmFsID09IDEgfHwgdmFsID09IDApKSB7CisJCWlmIChsaXN0X2VtcHR5KCZjb250LT5jaGlsZHJlbikpCisJCQltZW0tPnVzZV9oaWVyYXJjaHkgPSB2YWw7CisJCWVsc2UKKwkJCXJldHZhbCA9IC1FQlVTWTsKKwl9IGVsc2UKKwkJcmV0dmFsID0gLUVJTlZBTDsKKwljZ3JvdXBfdW5sb2NrKCk7CisKKwlyZXR1cm4gcmV0dmFsOwogfQogCiBzdGF0aWMgdTY0IG1lbV9jZ3JvdXBfcmVhZChzdHJ1Y3QgY2dyb3VwICpjb250LCBzdHJ1Y3QgY2Z0eXBlICpjZnQpCiB7Ci0JcmV0dXJuIHJlc19jb3VudGVyX3JlYWRfdTY0KCZtZW1fY2dyb3VwX2Zyb21fY29udChjb250KS0+cmVzLAotCQkJCSAgICBjZnQtPnByaXZhdGUpOworCXN0cnVjdCBtZW1fY2dyb3VwICptZW0gPSBtZW1fY2dyb3VwX2Zyb21fY29udChjb250KTsKKwl1NjQgdmFsID0gMDsKKwlpbnQgdHlwZSwgbmFtZTsKKworCXR5cGUgPSBNRU1GSUxFX1RZUEUoY2Z0LT5wcml2YXRlKTsKKwluYW1lID0gTUVNRklMRV9BVFRSKGNmdC0+cHJpdmF0ZSk7CisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBfTUVNOgorCQl2YWwgPSByZXNfY291bnRlcl9yZWFkX3U2NCgmbWVtLT5yZXMsIG5hbWUpOworCQlicmVhazsKKwljYXNlIF9NRU1TV0FQOgorCQlpZiAoZG9fc3dhcF9hY2NvdW50KQorCQkJdmFsID0gcmVzX2NvdW50ZXJfcmVhZF91NjQoJm1lbS0+bWVtc3csIG5hbWUpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwkJYnJlYWs7CisJfQorCXJldHVybiB2YWw7CiB9CiAvKgogICogVGhlIHVzZXIgb2YgdGhpcyBmdW5jdGlvbiBpcy4uLgpAQCAtODk4LDE1ICsxNzk0LDIyIEBACiAJCQkgICAgY29uc3QgY2hhciAqYnVmZmVyKQogewogCXN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyA9IG1lbV9jZ3JvdXBfZnJvbV9jb250KGNvbnQpOworCWludCB0eXBlLCBuYW1lOwogCXVuc2lnbmVkIGxvbmcgbG9uZyB2YWw7CiAJaW50IHJldDsKIAotCXN3aXRjaCAoY2Z0LT5wcml2YXRlKSB7CisJdHlwZSA9IE1FTUZJTEVfVFlQRShjZnQtPnByaXZhdGUpOworCW5hbWUgPSBNRU1GSUxFX0FUVFIoY2Z0LT5wcml2YXRlKTsKKwlzd2l0Y2ggKG5hbWUpIHsKIAljYXNlIFJFU19MSU1JVDoKIAkJLyogVGhpcyBmdW5jdGlvbiBkb2VzIGFsbCBuZWNlc3NhcnkgcGFyc2UuLi5yZXVzZSBpdCAqLwogCQlyZXQgPSByZXNfY291bnRlcl9tZW1wYXJzZV93cml0ZV9zdHJhdGVneShidWZmZXIsICZ2YWwpOwotCQlpZiAoIXJldCkKKwkJaWYgKHJldCkKKwkJCWJyZWFrOworCQlpZiAodHlwZSA9PSBfTUVNKQogCQkJcmV0ID0gbWVtX2Nncm91cF9yZXNpemVfbGltaXQobWVtY2csIHZhbCk7CisJCWVsc2UKKwkJCXJldCA9IG1lbV9jZ3JvdXBfcmVzaXplX21lbXN3X2xpbWl0KG1lbWNnLCB2YWwpOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlyZXQgPSAtRUlOVkFMOyAvKiBzaG91bGQgYmUgQlVHKCkgPyAqLwpAQCAtOTE1LDI3ICsxODE4LDU5IEBACiAJcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIHZvaWQgbWVtY2dfZ2V0X2hpZXJhcmNoaWNhbF9saW1pdChzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csCisJCXVuc2lnbmVkIGxvbmcgbG9uZyAqbWVtX2xpbWl0LCB1bnNpZ25lZCBsb25nIGxvbmcgKm1lbXN3X2xpbWl0KQoreworCXN0cnVjdCBjZ3JvdXAgKmNncm91cDsKKwl1bnNpZ25lZCBsb25nIGxvbmcgbWluX2xpbWl0LCBtaW5fbWVtc3dfbGltaXQsIHRtcDsKKworCW1pbl9saW1pdCA9IHJlc19jb3VudGVyX3JlYWRfdTY0KCZtZW1jZy0+cmVzLCBSRVNfTElNSVQpOworCW1pbl9tZW1zd19saW1pdCA9IHJlc19jb3VudGVyX3JlYWRfdTY0KCZtZW1jZy0+bWVtc3csIFJFU19MSU1JVCk7CisJY2dyb3VwID0gbWVtY2ctPmNzcy5jZ3JvdXA7CisJaWYgKCFtZW1jZy0+dXNlX2hpZXJhcmNoeSkKKwkJZ290byBvdXQ7CisKKwl3aGlsZSAoY2dyb3VwLT5wYXJlbnQpIHsKKwkJY2dyb3VwID0gY2dyb3VwLT5wYXJlbnQ7CisJCW1lbWNnID0gbWVtX2Nncm91cF9mcm9tX2NvbnQoY2dyb3VwKTsKKwkJaWYgKCFtZW1jZy0+dXNlX2hpZXJhcmNoeSkKKwkJCWJyZWFrOworCQl0bXAgPSByZXNfY291bnRlcl9yZWFkX3U2NCgmbWVtY2ctPnJlcywgUkVTX0xJTUlUKTsKKwkJbWluX2xpbWl0ID0gbWluKG1pbl9saW1pdCwgdG1wKTsKKwkJdG1wID0gcmVzX2NvdW50ZXJfcmVhZF91NjQoJm1lbWNnLT5tZW1zdywgUkVTX0xJTUlUKTsKKwkJbWluX21lbXN3X2xpbWl0ID0gbWluKG1pbl9tZW1zd19saW1pdCwgdG1wKTsKKwl9CitvdXQ6CisJKm1lbV9saW1pdCA9IG1pbl9saW1pdDsKKwkqbWVtc3dfbGltaXQgPSBtaW5fbWVtc3dfbGltaXQ7CisJcmV0dXJuOworfQorCiBzdGF0aWMgaW50IG1lbV9jZ3JvdXBfcmVzZXQoc3RydWN0IGNncm91cCAqY29udCwgdW5zaWduZWQgaW50IGV2ZW50KQogewogCXN0cnVjdCBtZW1fY2dyb3VwICptZW07CisJaW50IHR5cGUsIG5hbWU7CiAKIAltZW0gPSBtZW1fY2dyb3VwX2Zyb21fY29udChjb250KTsKLQlzd2l0Y2ggKGV2ZW50KSB7CisJdHlwZSA9IE1FTUZJTEVfVFlQRShldmVudCk7CisJbmFtZSA9IE1FTUZJTEVfQVRUUihldmVudCk7CisJc3dpdGNoIChuYW1lKSB7CiAJY2FzZSBSRVNfTUFYX1VTQUdFOgotCQlyZXNfY291bnRlcl9yZXNldF9tYXgoJm1lbS0+cmVzKTsKKwkJaWYgKHR5cGUgPT0gX01FTSkKKwkJCXJlc19jb3VudGVyX3Jlc2V0X21heCgmbWVtLT5yZXMpOworCQllbHNlCisJCQlyZXNfY291bnRlcl9yZXNldF9tYXgoJm1lbS0+bWVtc3cpOwogCQlicmVhazsKIAljYXNlIFJFU19GQUlMQ05UOgotCQlyZXNfY291bnRlcl9yZXNldF9mYWlsY250KCZtZW0tPnJlcyk7CisJCWlmICh0eXBlID09IF9NRU0pCisJCQlyZXNfY291bnRlcl9yZXNldF9mYWlsY250KCZtZW0tPnJlcyk7CisJCWVsc2UKKwkJCXJlc19jb3VudGVyX3Jlc2V0X2ZhaWxjbnQoJm1lbS0+bWVtc3cpOwogCQlicmVhazsKIAl9CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgbWVtX2ZvcmNlX2VtcHR5X3dyaXRlKHN0cnVjdCBjZ3JvdXAgKmNvbnQsIHVuc2lnbmVkIGludCBldmVudCkKLXsKLQlyZXR1cm4gbWVtX2Nncm91cF9mb3JjZV9lbXB0eShtZW1fY2dyb3VwX2Zyb21fY29udChjb250KSk7Ci19Ci0KIHN0YXRpYyBjb25zdCBzdHJ1Y3QgbWVtX2Nncm91cF9zdGF0X2Rlc2MgewogCWNvbnN0IGNoYXIgKm1zZzsKIAl1NjQgdW5pdDsKQEAgLTk4NCw0MyArMTkxOSwxNjMgQEAKIAkJY2ItPmZpbGwoY2IsICJ1bmV2aWN0YWJsZSIsIHVuZXZpY3RhYmxlICogUEFHRV9TSVpFKTsKIAogCX0KKwl7CisJCXVuc2lnbmVkIGxvbmcgbG9uZyBsaW1pdCwgbWVtc3dfbGltaXQ7CisJCW1lbWNnX2dldF9oaWVyYXJjaGljYWxfbGltaXQobWVtX2NvbnQsICZsaW1pdCwgJm1lbXN3X2xpbWl0KTsKKwkJY2ItPmZpbGwoY2IsICJoaWVyYXJjaGljYWxfbWVtb3J5X2xpbWl0IiwgbGltaXQpOworCQlpZiAoZG9fc3dhcF9hY2NvdW50KQorCQkJY2ItPmZpbGwoY2IsICJoaWVyYXJjaGljYWxfbWVtc3dfbGltaXQiLCBtZW1zd19saW1pdCk7CisJfQorCisjaWZkZWYgQ09ORklHX0RFQlVHX1ZNCisJY2ItPmZpbGwoY2IsICJpbmFjdGl2ZV9yYXRpbyIsIGNhbGNfaW5hY3RpdmVfcmF0aW8obWVtX2NvbnQsIE5VTEwpKTsKKworCXsKKwkJaW50IG5pZCwgemlkOworCQlzdHJ1Y3QgbWVtX2Nncm91cF9wZXJfem9uZSAqbXo7CisJCXVuc2lnbmVkIGxvbmcgcmVjZW50X3JvdGF0ZWRbMl0gPSB7MCwgMH07CisJCXVuc2lnbmVkIGxvbmcgcmVjZW50X3NjYW5uZWRbMl0gPSB7MCwgMH07CisKKwkJZm9yX2VhY2hfb25saW5lX25vZGUobmlkKQorCQkJZm9yICh6aWQgPSAwOyB6aWQgPCBNQVhfTlJfWk9ORVM7IHppZCsrKSB7CisJCQkJbXogPSBtZW1fY2dyb3VwX3pvbmVpbmZvKG1lbV9jb250LCBuaWQsIHppZCk7CisKKwkJCQlyZWNlbnRfcm90YXRlZFswXSArPQorCQkJCQltei0+cmVjbGFpbV9zdGF0LnJlY2VudF9yb3RhdGVkWzBdOworCQkJCXJlY2VudF9yb3RhdGVkWzFdICs9CisJCQkJCW16LT5yZWNsYWltX3N0YXQucmVjZW50X3JvdGF0ZWRbMV07CisJCQkJcmVjZW50X3NjYW5uZWRbMF0gKz0KKwkJCQkJbXotPnJlY2xhaW1fc3RhdC5yZWNlbnRfc2Nhbm5lZFswXTsKKwkJCQlyZWNlbnRfc2Nhbm5lZFsxXSArPQorCQkJCQltei0+cmVjbGFpbV9zdGF0LnJlY2VudF9zY2FubmVkWzFdOworCQkJfQorCQljYi0+ZmlsbChjYiwgInJlY2VudF9yb3RhdGVkX2Fub24iLCByZWNlbnRfcm90YXRlZFswXSk7CisJCWNiLT5maWxsKGNiLCAicmVjZW50X3JvdGF0ZWRfZmlsZSIsIHJlY2VudF9yb3RhdGVkWzFdKTsKKwkJY2ItPmZpbGwoY2IsICJyZWNlbnRfc2Nhbm5lZF9hbm9uIiwgcmVjZW50X3NjYW5uZWRbMF0pOworCQljYi0+ZmlsbChjYiwgInJlY2VudF9zY2FubmVkX2ZpbGUiLCByZWNlbnRfc2Nhbm5lZFsxXSk7CisJfQorI2VuZGlmCisKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHU2NCBtZW1fY2dyb3VwX3N3YXBwaW5lc3NfcmVhZChzdHJ1Y3QgY2dyb3VwICpjZ3JwLCBzdHJ1Y3QgY2Z0eXBlICpjZnQpCit7CisJc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnID0gbWVtX2Nncm91cF9mcm9tX2NvbnQoY2dycCk7CisKKwlyZXR1cm4gZ2V0X3N3YXBwaW5lc3MobWVtY2cpOworfQorCitzdGF0aWMgaW50IG1lbV9jZ3JvdXBfc3dhcHBpbmVzc193cml0ZShzdHJ1Y3QgY2dyb3VwICpjZ3JwLCBzdHJ1Y3QgY2Z0eXBlICpjZnQsCisJCQkJICAgICAgIHU2NCB2YWwpCit7CisJc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnID0gbWVtX2Nncm91cF9mcm9tX2NvbnQoY2dycCk7CisJc3RydWN0IG1lbV9jZ3JvdXAgKnBhcmVudDsKKwlpZiAodmFsID4gMTAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChjZ3JwLT5wYXJlbnQgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlwYXJlbnQgPSBtZW1fY2dyb3VwX2Zyb21fY29udChjZ3JwLT5wYXJlbnQpOworCS8qIElmIHVuZGVyIGhpZXJhcmNoeSwgb25seSBlbXB0eS1yb290IGNhbiBzZXQgdGhpcyB2YWx1ZSAqLworCWlmICgocGFyZW50LT51c2VfaGllcmFyY2h5KSB8fAorCSAgICAobWVtY2ctPnVzZV9oaWVyYXJjaHkgJiYgIWxpc3RfZW1wdHkoJmNncnAtPmNoaWxkcmVuKSkpCisJCXJldHVybiAtRUlOVkFMOworCisJc3Bpbl9sb2NrKCZtZW1jZy0+cmVjbGFpbV9wYXJhbV9sb2NrKTsKKwltZW1jZy0+c3dhcHBpbmVzcyA9IHZhbDsKKwlzcGluX3VubG9jaygmbWVtY2ctPnJlY2xhaW1fcGFyYW1fbG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworCiBzdGF0aWMgc3RydWN0IGNmdHlwZSBtZW1fY2dyb3VwX2ZpbGVzW10gPSB7CiAJewogCQkubmFtZSA9ICJ1c2FnZV9pbl9ieXRlcyIsCi0JCS5wcml2YXRlID0gUkVTX1VTQUdFLAorCQkucHJpdmF0ZSA9IE1FTUZJTEVfUFJJVkFURShfTUVNLCBSRVNfVVNBR0UpLAogCQkucmVhZF91NjQgPSBtZW1fY2dyb3VwX3JlYWQsCiAJfSwKIAl7CiAJCS5uYW1lID0gIm1heF91c2FnZV9pbl9ieXRlcyIsCi0JCS5wcml2YXRlID0gUkVTX01BWF9VU0FHRSwKKwkJLnByaXZhdGUgPSBNRU1GSUxFX1BSSVZBVEUoX01FTSwgUkVTX01BWF9VU0FHRSksCiAJCS50cmlnZ2VyID0gbWVtX2Nncm91cF9yZXNldCwKIAkJLnJlYWRfdTY0ID0gbWVtX2Nncm91cF9yZWFkLAogCX0sCiAJewogCQkubmFtZSA9ICJsaW1pdF9pbl9ieXRlcyIsCi0JCS5wcml2YXRlID0gUkVTX0xJTUlULAorCQkucHJpdmF0ZSA9IE1FTUZJTEVfUFJJVkFURShfTUVNLCBSRVNfTElNSVQpLAogCQkud3JpdGVfc3RyaW5nID0gbWVtX2Nncm91cF93cml0ZSwKIAkJLnJlYWRfdTY0ID0gbWVtX2Nncm91cF9yZWFkLAogCX0sCiAJewogCQkubmFtZSA9ICJmYWlsY250IiwKLQkJLnByaXZhdGUgPSBSRVNfRkFJTENOVCwKKwkJLnByaXZhdGUgPSBNRU1GSUxFX1BSSVZBVEUoX01FTSwgUkVTX0ZBSUxDTlQpLAogCQkudHJpZ2dlciA9IG1lbV9jZ3JvdXBfcmVzZXQsCiAJCS5yZWFkX3U2NCA9IG1lbV9jZ3JvdXBfcmVhZCwKIAl9LAogCXsKLQkJLm5hbWUgPSAiZm9yY2VfZW1wdHkiLAotCQkudHJpZ2dlciA9IG1lbV9mb3JjZV9lbXB0eV93cml0ZSwKLQl9LAotCXsKIAkJLm5hbWUgPSAic3RhdCIsCiAJCS5yZWFkX21hcCA9IG1lbV9jb250cm9sX3N0YXRfc2hvdywKIAl9LAorCXsKKwkJLm5hbWUgPSAiZm9yY2VfZW1wdHkiLAorCQkudHJpZ2dlciA9IG1lbV9jZ3JvdXBfZm9yY2VfZW1wdHlfd3JpdGUsCisJfSwKKwl7CisJCS5uYW1lID0gInVzZV9oaWVyYXJjaHkiLAorCQkud3JpdGVfdTY0ID0gbWVtX2Nncm91cF9oaWVyYXJjaHlfd3JpdGUsCisJCS5yZWFkX3U2NCA9IG1lbV9jZ3JvdXBfaGllcmFyY2h5X3JlYWQsCisJfSwKKwl7CisJCS5uYW1lID0gInN3YXBwaW5lc3MiLAorCQkucmVhZF91NjQgPSBtZW1fY2dyb3VwX3N3YXBwaW5lc3NfcmVhZCwKKwkJLndyaXRlX3U2NCA9IG1lbV9jZ3JvdXBfc3dhcHBpbmVzc193cml0ZSwKKwl9LAogfTsKIAorI2lmZGVmIENPTkZJR19DR1JPVVBfTUVNX1JFU19DVExSX1NXQVAKK3N0YXRpYyBzdHJ1Y3QgY2Z0eXBlIG1lbXN3X2Nncm91cF9maWxlc1tdID0geworCXsKKwkJLm5hbWUgPSAibWVtc3cudXNhZ2VfaW5fYnl0ZXMiLAorCQkucHJpdmF0ZSA9IE1FTUZJTEVfUFJJVkFURShfTUVNU1dBUCwgUkVTX1VTQUdFKSwKKwkJLnJlYWRfdTY0ID0gbWVtX2Nncm91cF9yZWFkLAorCX0sCisJeworCQkubmFtZSA9ICJtZW1zdy5tYXhfdXNhZ2VfaW5fYnl0ZXMiLAorCQkucHJpdmF0ZSA9IE1FTUZJTEVfUFJJVkFURShfTUVNU1dBUCwgUkVTX01BWF9VU0FHRSksCisJCS50cmlnZ2VyID0gbWVtX2Nncm91cF9yZXNldCwKKwkJLnJlYWRfdTY0ID0gbWVtX2Nncm91cF9yZWFkLAorCX0sCisJeworCQkubmFtZSA9ICJtZW1zdy5saW1pdF9pbl9ieXRlcyIsCisJCS5wcml2YXRlID0gTUVNRklMRV9QUklWQVRFKF9NRU1TV0FQLCBSRVNfTElNSVQpLAorCQkud3JpdGVfc3RyaW5nID0gbWVtX2Nncm91cF93cml0ZSwKKwkJLnJlYWRfdTY0ID0gbWVtX2Nncm91cF9yZWFkLAorCX0sCisJeworCQkubmFtZSA9ICJtZW1zdy5mYWlsY250IiwKKwkJLnByaXZhdGUgPSBNRU1GSUxFX1BSSVZBVEUoX01FTVNXQVAsIFJFU19GQUlMQ05UKSwKKwkJLnRyaWdnZXIgPSBtZW1fY2dyb3VwX3Jlc2V0LAorCQkucmVhZF91NjQgPSBtZW1fY2dyb3VwX3JlYWQsCisJfSwKK307CisKK3N0YXRpYyBpbnQgcmVnaXN0ZXJfbWVtc3dfZmlsZXMoc3RydWN0IGNncm91cCAqY29udCwgc3RydWN0IGNncm91cF9zdWJzeXMgKnNzKQoreworCWlmICghZG9fc3dhcF9hY2NvdW50KQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gY2dyb3VwX2FkZF9maWxlcyhjb250LCBzcywgbWVtc3dfY2dyb3VwX2ZpbGVzLAorCQkJCUFSUkFZX1NJWkUobWVtc3dfY2dyb3VwX2ZpbGVzKSk7Cit9OworI2Vsc2UKK3N0YXRpYyBpbnQgcmVnaXN0ZXJfbWVtc3dfZmlsZXMoc3RydWN0IGNncm91cCAqY29udCwgc3RydWN0IGNncm91cF9zdWJzeXMgKnNzKQoreworCXJldHVybiAwOworfQorI2VuZGlmCisKIHN0YXRpYyBpbnQgYWxsb2NfbWVtX2Nncm91cF9wZXJfem9uZV9pbmZvKHN0cnVjdCBtZW1fY2dyb3VwICptZW0sIGludCBub2RlKQogewogCXN0cnVjdCBtZW1fY2dyb3VwX3Blcl9ub2RlICpwbjsKQEAgLTEwNDYsNyArMjEwMSw2IEBACiAKIAlmb3IgKHpvbmUgPSAwOyB6b25lIDwgTUFYX05SX1pPTkVTOyB6b25lKyspIHsKIAkJbXogPSAmcG4tPnpvbmVpbmZvW3pvbmVdOwotCQlzcGluX2xvY2tfaW5pdCgmbXotPmxydV9sb2NrKTsKIAkJZm9yX2VhY2hfbHJ1KGwpCiAJCQlJTklUX0xJU1RfSEVBRCgmbXotPmxpc3RzW2xdKTsKIAl9CkBAIC0xMDU4LDU1ICsyMTEyLDExMyBAQAogCWtmcmVlKG1lbS0+aW5mby5ub2RlaW5mb1tub2RlXSk7CiB9CiAKK3N0YXRpYyBpbnQgbWVtX2Nncm91cF9zaXplKHZvaWQpCit7CisJaW50IGNwdXN0YXRfc2l6ZSA9IG5yX2NwdV9pZHMgKiBzaXplb2Yoc3RydWN0IG1lbV9jZ3JvdXBfc3RhdF9jcHUpOworCXJldHVybiBzaXplb2Yoc3RydWN0IG1lbV9jZ3JvdXApICsgY3B1c3RhdF9zaXplOworfQorCiBzdGF0aWMgc3RydWN0IG1lbV9jZ3JvdXAgKm1lbV9jZ3JvdXBfYWxsb2Modm9pZCkKIHsKIAlzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtOworCWludCBzaXplID0gbWVtX2Nncm91cF9zaXplKCk7CiAKLQlpZiAoc2l6ZW9mKCptZW0pIDwgUEFHRV9TSVpFKQotCQltZW0gPSBrbWFsbG9jKHNpemVvZigqbWVtKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHNpemUgPCBQQUdFX1NJWkUpCisJCW1lbSA9IGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CiAJZWxzZQotCQltZW0gPSB2bWFsbG9jKHNpemVvZigqbWVtKSk7CisJCW1lbSA9IHZtYWxsb2Moc2l6ZSk7CiAKIAlpZiAobWVtKQotCQltZW1zZXQobWVtLCAwLCBzaXplb2YoKm1lbSkpOworCQltZW1zZXQobWVtLCAwLCBzaXplKTsKIAlyZXR1cm4gbWVtOwogfQogCi1zdGF0aWMgdm9pZCBtZW1fY2dyb3VwX2ZyZWUoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSkKKy8qCisgKiBBdCBkZXN0cm95aW5nIG1lbV9jZ3JvdXAsIHJlZmVyZW5jZXMgZnJvbSBzd2FwX2Nncm91cCBjYW4gcmVtYWluLgorICogKHNjYW5uaW5nIGFsbCBhdCBmb3JjZV9lbXB0eSBpcyB0b28gY29zdGx5Li4uKQorICoKKyAqIEluc3RlYWQgb2YgY2xlYXJpbmcgYWxsIHJlZmVyZW5jZXMgYXQgZm9yY2VfZW1wdHksIHdlIHJlbWVtYmVyCisgKiB0aGUgbnVtYmVyIG9mIHJlZmVyZW5jZSBmcm9tIHN3YXBfY2dyb3VwIGFuZCBmcmVlIG1lbV9jZ3JvdXAgd2hlbgorICogaXQgZ29lcyBkb3duIHRvIDAuCisgKgorICogUmVtb3ZhbCBvZiBjZ3JvdXAgaXRzZWxmIHN1Y2NlZWRzIHJlZ2FyZGxlc3Mgb2YgcmVmcyBmcm9tIHN3YXAuCisgKi8KKworc3RhdGljIHZvaWQgX19tZW1fY2dyb3VwX2ZyZWUoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSkKIHsKLQlpZiAoc2l6ZW9mKCptZW0pIDwgUEFHRV9TSVpFKQorCWludCBub2RlOworCisJZm9yX2VhY2hfbm9kZV9zdGF0ZShub2RlLCBOX1BPU1NJQkxFKQorCQlmcmVlX21lbV9jZ3JvdXBfcGVyX3pvbmVfaW5mbyhtZW0sIG5vZGUpOworCisJaWYgKG1lbV9jZ3JvdXBfc2l6ZSgpIDwgUEFHRV9TSVpFKQogCQlrZnJlZShtZW0pOwogCWVsc2UKIAkJdmZyZWUobWVtKTsKIH0KIAorc3RhdGljIHZvaWQgbWVtX2Nncm91cF9nZXQoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSkKK3sKKwlhdG9taWNfaW5jKCZtZW0tPnJlZmNudCk7Cit9CisKK3N0YXRpYyB2b2lkIG1lbV9jZ3JvdXBfcHV0KHN0cnVjdCBtZW1fY2dyb3VwICptZW0pCit7CisJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJm1lbS0+cmVmY250KSkKKwkJX19tZW1fY2dyb3VwX2ZyZWUobWVtKTsKK30KKworCisjaWZkZWYgQ09ORklHX0NHUk9VUF9NRU1fUkVTX0NUTFJfU1dBUAorc3RhdGljIHZvaWQgX19pbml0IGVuYWJsZV9zd2FwX2Nncm91cCh2b2lkKQoreworCWlmICghbWVtX2Nncm91cF9kaXNhYmxlZCgpICYmIHJlYWxseV9kb19zd2FwX2FjY291bnQpCisJCWRvX3N3YXBfYWNjb3VudCA9IDE7Cit9CisjZWxzZQorc3RhdGljIHZvaWQgX19pbml0IGVuYWJsZV9zd2FwX2Nncm91cCh2b2lkKQoreworfQorI2VuZGlmCiAKIHN0YXRpYyBzdHJ1Y3QgY2dyb3VwX3N1YnN5c19zdGF0ZSAqCiBtZW1fY2dyb3VwX2NyZWF0ZShzdHJ1Y3QgY2dyb3VwX3N1YnN5cyAqc3MsIHN0cnVjdCBjZ3JvdXAgKmNvbnQpCiB7Ci0Jc3RydWN0IG1lbV9jZ3JvdXAgKm1lbTsKKwlzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtLCAqcGFyZW50OwogCWludCBub2RlOwogCi0JaWYgKHVubGlrZWx5KChjb250LT5wYXJlbnQpID09IE5VTEwpKSB7Ci0JCW1lbSA9ICZpbml0X21lbV9jZ3JvdXA7Ci0JfSBlbHNlIHsKLQkJbWVtID0gbWVtX2Nncm91cF9hbGxvYygpOwotCQlpZiAoIW1lbSkKLQkJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwotCX0KLQotCXJlc19jb3VudGVyX2luaXQoJm1lbS0+cmVzKTsKKwltZW0gPSBtZW1fY2dyb3VwX2FsbG9jKCk7CisJaWYgKCFtZW0pCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwogCiAJZm9yX2VhY2hfbm9kZV9zdGF0ZShub2RlLCBOX1BPU1NJQkxFKQogCQlpZiAoYWxsb2NfbWVtX2Nncm91cF9wZXJfem9uZV9pbmZvKG1lbSwgbm9kZSkpCiAJCQlnb3RvIGZyZWVfb3V0OworCS8qIHJvb3QgPyAqLworCWlmIChjb250LT5wYXJlbnQgPT0gTlVMTCkgeworCQllbmFibGVfc3dhcF9jZ3JvdXAoKTsKKwkJcGFyZW50ID0gTlVMTDsKKwl9IGVsc2UgeworCQlwYXJlbnQgPSBtZW1fY2dyb3VwX2Zyb21fY29udChjb250LT5wYXJlbnQpOworCQltZW0tPnVzZV9oaWVyYXJjaHkgPSBwYXJlbnQtPnVzZV9oaWVyYXJjaHk7CisJfQogCisJaWYgKHBhcmVudCAmJiBwYXJlbnQtPnVzZV9oaWVyYXJjaHkpIHsKKwkJcmVzX2NvdW50ZXJfaW5pdCgmbWVtLT5yZXMsICZwYXJlbnQtPnJlcyk7CisJCXJlc19jb3VudGVyX2luaXQoJm1lbS0+bWVtc3csICZwYXJlbnQtPm1lbXN3KTsKKwl9IGVsc2UgeworCQlyZXNfY291bnRlcl9pbml0KCZtZW0tPnJlcywgTlVMTCk7CisJCXJlc19jb3VudGVyX2luaXQoJm1lbS0+bWVtc3csIE5VTEwpOworCX0KKwltZW0tPmxhc3Rfc2Nhbm5lZF9jaGlsZCA9IE5VTEw7CisJc3Bpbl9sb2NrX2luaXQoJm1lbS0+cmVjbGFpbV9wYXJhbV9sb2NrKTsKKworCWlmIChwYXJlbnQpCisJCW1lbS0+c3dhcHBpbmVzcyA9IGdldF9zd2FwcGluZXNzKHBhcmVudCk7CisJYXRvbWljX3NldCgmbWVtLT5yZWZjbnQsIDEpOwogCXJldHVybiAmbWVtLT5jc3M7CiBmcmVlX291dDoKLQlmb3JfZWFjaF9ub2RlX3N0YXRlKG5vZGUsIE5fUE9TU0lCTEUpCi0JCWZyZWVfbWVtX2Nncm91cF9wZXJfem9uZV9pbmZvKG1lbSwgbm9kZSk7Ci0JaWYgKGNvbnQtPnBhcmVudCAhPSBOVUxMKQotCQltZW1fY2dyb3VwX2ZyZWUobWVtKTsKKwlfX21lbV9jZ3JvdXBfZnJlZShtZW0pOwogCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwogfQogCkBAIC0xMTE0LDI2ICsyMjI2LDI2IEBACiAJCQkJCXN0cnVjdCBjZ3JvdXAgKmNvbnQpCiB7CiAJc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSA9IG1lbV9jZ3JvdXBfZnJvbV9jb250KGNvbnQpOwotCW1lbV9jZ3JvdXBfZm9yY2VfZW1wdHkobWVtKTsKKwltZW1fY2dyb3VwX2ZvcmNlX2VtcHR5KG1lbSwgZmFsc2UpOwogfQogCiBzdGF0aWMgdm9pZCBtZW1fY2dyb3VwX2Rlc3Ryb3koc3RydWN0IGNncm91cF9zdWJzeXMgKnNzLAogCQkJCXN0cnVjdCBjZ3JvdXAgKmNvbnQpCiB7Ci0JaW50IG5vZGU7Ci0Jc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSA9IG1lbV9jZ3JvdXBfZnJvbV9jb250KGNvbnQpOwotCi0JZm9yX2VhY2hfbm9kZV9zdGF0ZShub2RlLCBOX1BPU1NJQkxFKQotCQlmcmVlX21lbV9jZ3JvdXBfcGVyX3pvbmVfaW5mbyhtZW0sIG5vZGUpOwotCi0JbWVtX2Nncm91cF9mcmVlKG1lbV9jZ3JvdXBfZnJvbV9jb250KGNvbnQpKTsKKwltZW1fY2dyb3VwX3B1dChtZW1fY2dyb3VwX2Zyb21fY29udChjb250KSk7CiB9CiAKIHN0YXRpYyBpbnQgbWVtX2Nncm91cF9wb3B1bGF0ZShzdHJ1Y3QgY2dyb3VwX3N1YnN5cyAqc3MsCiAJCQkJc3RydWN0IGNncm91cCAqY29udCkKIHsKLQlyZXR1cm4gY2dyb3VwX2FkZF9maWxlcyhjb250LCBzcywgbWVtX2Nncm91cF9maWxlcywKLQkJCQkJQVJSQVlfU0laRShtZW1fY2dyb3VwX2ZpbGVzKSk7CisJaW50IHJldDsKKworCXJldCA9IGNncm91cF9hZGRfZmlsZXMoY29udCwgc3MsIG1lbV9jZ3JvdXBfZmlsZXMsCisJCQkJQVJSQVlfU0laRShtZW1fY2dyb3VwX2ZpbGVzKSk7CisKKwlpZiAoIXJldCkKKwkJcmV0ID0gcmVnaXN0ZXJfbWVtc3dfZmlsZXMoY29udCwgc3MpOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyB2b2lkIG1lbV9jZ3JvdXBfbW92ZV90YXNrKHN0cnVjdCBjZ3JvdXBfc3Vic3lzICpzcywKQEAgLTExNDEsMjUgKzIyNTMsMTIgQEAKIAkJCQlzdHJ1Y3QgY2dyb3VwICpvbGRfY29udCwKIAkJCQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCiB7Ci0Jc3RydWN0IG1tX3N0cnVjdCAqbW07Ci0Jc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSwgKm9sZF9tZW07Ci0KLQltbSA9IGdldF90YXNrX21tKHApOwotCWlmIChtbSA9PSBOVUxMKQotCQlyZXR1cm47Ci0KLQltZW0gPSBtZW1fY2dyb3VwX2Zyb21fY29udChjb250KTsKLQlvbGRfbWVtID0gbWVtX2Nncm91cF9mcm9tX2NvbnQob2xkX2NvbnQpOwotCisJbXV0ZXhfbG9jaygmbWVtY2dfdGFza2xpc3QpOwogCS8qCi0JICogT25seSB0aHJlYWQgZ3JvdXAgbGVhZGVycyBhcmUgYWxsb3dlZCB0byBtaWdyYXRlLCB0aGUgbW1fc3RydWN0IGlzCi0JICogaW4gZWZmZWN0IG93bmVkIGJ5IHRoZSBsZWFkZXIKKwkgKiBGSVhNRTogSXQncyBiZXR0ZXIgdG8gbW92ZSBjaGFyZ2VzIG9mIHRoaXMgcHJvY2VzcyBmcm9tIG9sZAorCSAqIG1lbWNnIHRvIG5ldyBtZW1jZy4gQnV0IGl0J3MganVzdCBvbiBUT0RPLUxpc3Qgbm93LgogCSAqLwotCWlmICghdGhyZWFkX2dyb3VwX2xlYWRlcihwKSkKLQkJZ290byBvdXQ7Ci0KLW91dDoKLQltbXB1dChtbSk7CisJbXV0ZXhfdW5sb2NrKCZtZW1jZ190YXNrbGlzdCk7CiB9CiAKIHN0cnVjdCBjZ3JvdXBfc3Vic3lzIG1lbV9jZ3JvdXBfc3Vic3lzID0gewpAQCAtMTE3MiwzICsyMjcxLDEzIEBACiAJLmF0dGFjaCA9IG1lbV9jZ3JvdXBfbW92ZV90YXNrLAogCS5lYXJseV9pbml0ID0gMCwKIH07CisKKyNpZmRlZiBDT05GSUdfQ0dST1VQX01FTV9SRVNfQ1RMUl9TV0FQCisKK3N0YXRpYyBpbnQgX19pbml0IGRpc2FibGVfc3dhcF9hY2NvdW50KGNoYXIgKnMpCit7CisJcmVhbGx5X2RvX3N3YXBfYWNjb3VudCA9IDA7CisJcmV0dXJuIDE7Cit9CitfX3NldHVwKCJub3N3YXBhY2NvdW50IiwgZGlzYWJsZV9zd2FwX2FjY291bnQpOworI2VuZGlmCmRpZmYgLS1naXQgYS9tbS9tZW1vcnkuYyBiL21tL21lbW9yeS5jCmluZGV4IDBhMjAxMGEuLmUwMDljZTggMTAwNjQ0Ci0tLSBhL21tL21lbW9yeS5jCisrKyBiL21tL21lbW9yeS5jCkBAIC01Miw2ICs1Miw5IEBACiAjaW5jbHVkZSA8bGludXgvd3JpdGViYWNrLmg+CiAjaW5jbHVkZSA8bGludXgvbWVtY29udHJvbC5oPgogI2luY2x1ZGUgPGxpbnV4L21tdV9ub3RpZmllci5oPgorI2luY2x1ZGUgPGxpbnV4L2thbGxzeW1zLmg+CisjaW5jbHVkZSA8bGludXgvc3dhcG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L2VsZi5oPgogCiAjaW5jbHVkZSA8YXNtL3BnYWxsb2MuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgpAQCAtNTksOSArNjIsNiBAQAogI2luY2x1ZGUgPGFzbS90bGJmbHVzaC5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CiAKLSNpbmNsdWRlIDxsaW51eC9zd2Fwb3BzLmg+Ci0jaW5jbHVkZSA8bGludXgvZWxmLmg+Ci0KICNpbmNsdWRlICJpbnRlcm5hbC5oIgogCiAjaWZuZGVmIENPTkZJR19ORUVEX01VTFRJUExFX05PREVTCkBAIC0zNzUsMTUgKzM3NSw2NSBAQAogICoKICAqIFRoZSBjYWxsaW5nIGZ1bmN0aW9uIG11c3Qgc3RpbGwgaGFuZGxlIHRoZSBlcnJvci4KICAqLwotc3RhdGljIHZvaWQgcHJpbnRfYmFkX3B0ZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgcHRlX3QgcHRlLAotCQkJICB1bnNpZ25lZCBsb25nIHZhZGRyKQorc3RhdGljIHZvaWQgcHJpbnRfYmFkX3B0ZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyLAorCQkJICBwdGVfdCBwdGUsIHN0cnVjdCBwYWdlICpwYWdlKQogewotCXByaW50ayhLRVJOX0VSUiAiQmFkIHB0ZSA9ICUwOGxseCwgcHJvY2VzcyA9ICVzLCAiCi0JCQkidm1fZmxhZ3MgPSAlbHgsIHZhZGRyID0gJWx4XG4iLAotCQkobG9uZyBsb25nKXB0ZV92YWwocHRlKSwKLQkJKHZtYS0+dm1fbW0gPT0gY3VycmVudC0+bW0gPyBjdXJyZW50LT5jb21tIDogIj8/PyIpLAotCQl2bWEtPnZtX2ZsYWdzLCB2YWRkcik7CisJcGdkX3QgKnBnZCA9IHBnZF9vZmZzZXQodm1hLT52bV9tbSwgYWRkcik7CisJcHVkX3QgKnB1ZCA9IHB1ZF9vZmZzZXQocGdkLCBhZGRyKTsKKwlwbWRfdCAqcG1kID0gcG1kX29mZnNldChwdWQsIGFkZHIpOworCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nOworCXBnb2ZmX3QgaW5kZXg7CisJc3RhdGljIHVuc2lnbmVkIGxvbmcgcmVzdW1lOworCXN0YXRpYyB1bnNpZ25lZCBsb25nIG5yX3Nob3duOworCXN0YXRpYyB1bnNpZ25lZCBsb25nIG5yX3Vuc2hvd247CisKKwkvKgorCSAqIEFsbG93IGEgYnVyc3Qgb2YgNjAgcmVwb3J0cywgdGhlbiBrZWVwIHF1aWV0IGZvciB0aGF0IG1pbnV0ZTsKKwkgKiBvciBhbGxvdyBhIHN0ZWFkeSBkcmlwIG9mIG9uZSByZXBvcnQgcGVyIHNlY29uZC4KKwkgKi8KKwlpZiAobnJfc2hvd24gPT0gNjApIHsKKwkJaWYgKHRpbWVfYmVmb3JlKGppZmZpZXMsIHJlc3VtZSkpIHsKKwkJCW5yX3Vuc2hvd24rKzsKKwkJCXJldHVybjsKKwkJfQorCQlpZiAobnJfdW5zaG93bikgeworCQkJcHJpbnRrKEtFUk5fQUxFUlQKKwkJCQkiQlVHOiBCYWQgcGFnZSBtYXA6ICVsdSBtZXNzYWdlcyBzdXBwcmVzc2VkXG4iLAorCQkJCW5yX3Vuc2hvd24pOworCQkJbnJfdW5zaG93biA9IDA7CisJCX0KKwkJbnJfc2hvd24gPSAwOworCX0KKwlpZiAobnJfc2hvd24rKyA9PSAwKQorCQlyZXN1bWUgPSBqaWZmaWVzICsgNjAgKiBIWjsKKworCW1hcHBpbmcgPSB2bWEtPnZtX2ZpbGUgPyB2bWEtPnZtX2ZpbGUtPmZfbWFwcGluZyA6IE5VTEw7CisJaW5kZXggPSBsaW5lYXJfcGFnZV9pbmRleCh2bWEsIGFkZHIpOworCisJcHJpbnRrKEtFUk5fQUxFUlQKKwkJIkJVRzogQmFkIHBhZ2UgbWFwIGluIHByb2Nlc3MgJXMgIHB0ZTolMDhsbHggcG1kOiUwOGxseFxuIiwKKwkJY3VycmVudC0+Y29tbSwKKwkJKGxvbmcgbG9uZylwdGVfdmFsKHB0ZSksIChsb25nIGxvbmcpcG1kX3ZhbCgqcG1kKSk7CisJaWYgKHBhZ2UpIHsKKwkJcHJpbnRrKEtFUk5fQUxFUlQKKwkJInBhZ2U6JXAgZmxhZ3M6JXAgY291bnQ6JWQgbWFwY291bnQ6JWQgbWFwcGluZzolcCBpbmRleDolbHhcbiIsCisJCXBhZ2UsICh2b2lkICopcGFnZS0+ZmxhZ3MsIHBhZ2VfY291bnQocGFnZSksCisJCXBhZ2VfbWFwY291bnQocGFnZSksIHBhZ2UtPm1hcHBpbmcsIHBhZ2UtPmluZGV4KTsKKwl9CisJcHJpbnRrKEtFUk5fQUxFUlQKKwkJImFkZHI6JXAgdm1fZmxhZ3M6JTA4bHggYW5vbl92bWE6JXAgbWFwcGluZzolcCBpbmRleDolbHhcbiIsCisJCSh2b2lkICopYWRkciwgdm1hLT52bV9mbGFncywgdm1hLT5hbm9uX3ZtYSwgbWFwcGluZywgaW5kZXgpOworCS8qCisJICogQ2hvb3NlIHRleHQgYmVjYXVzZSBkYXRhIHN5bWJvbHMgZGVwZW5kIG9uIENPTkZJR19LQUxMU1lNU19BTEw9eQorCSAqLworCWlmICh2bWEtPnZtX29wcykKKwkJcHJpbnRfc3ltYm9sKEtFUk5fQUxFUlQgInZtYS0+dm1fb3BzLT5mYXVsdDogJXNcbiIsCisJCQkJKHVuc2lnbmVkIGxvbmcpdm1hLT52bV9vcHMtPmZhdWx0KTsKKwlpZiAodm1hLT52bV9maWxlICYmIHZtYS0+dm1fZmlsZS0+Zl9vcCkKKwkJcHJpbnRfc3ltYm9sKEtFUk5fQUxFUlQgInZtYS0+dm1fZmlsZS0+Zl9vcC0+bW1hcDogJXNcbiIsCisJCQkJKHVuc2lnbmVkIGxvbmcpdm1hLT52bV9maWxlLT5mX29wLT5tbWFwKTsKIAlkdW1wX3N0YWNrKCk7CisJYWRkX3RhaW50KFRBSU5UX0JBRF9QQUdFKTsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgaXNfY293X21hcHBpbmcodW5zaWduZWQgaW50IGZsYWdzKQpAQCAtNDQxLDIxICs0OTEsMTggQEAKIHN0cnVjdCBwYWdlICp2bV9ub3JtYWxfcGFnZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyLAogCQkJCXB0ZV90IHB0ZSkKIHsKLQl1bnNpZ25lZCBsb25nIHBmbjsKKwl1bnNpZ25lZCBsb25nIHBmbiA9IHB0ZV9wZm4ocHRlKTsKIAogCWlmIChIQVZFX1BURV9TUEVDSUFMKSB7Ci0JCWlmIChsaWtlbHkoIXB0ZV9zcGVjaWFsKHB0ZSkpKSB7Ci0JCQlWTV9CVUdfT04oIXBmbl92YWxpZChwdGVfcGZuKHB0ZSkpKTsKLQkJCXJldHVybiBwdGVfcGFnZShwdGUpOwotCQl9Ci0JCVZNX0JVR19PTighKHZtYS0+dm1fZmxhZ3MgJiAoVk1fUEZOTUFQIHwgVk1fTUlYRURNQVApKSk7CisJCWlmIChsaWtlbHkoIXB0ZV9zcGVjaWFsKHB0ZSkpKQorCQkJZ290byBjaGVja19wZm47CisJCWlmICghKHZtYS0+dm1fZmxhZ3MgJiAoVk1fUEZOTUFQIHwgVk1fTUlYRURNQVApKSkKKwkJCXByaW50X2JhZF9wdGUodm1hLCBhZGRyLCBwdGUsIE5VTEwpOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAKIAkvKiAhSEFWRV9QVEVfU1BFQ0lBTCBjYXNlIGZvbGxvd3M6ICovCiAKLQlwZm4gPSBwdGVfcGZuKHB0ZSk7Ci0KIAlpZiAodW5saWtlbHkodm1hLT52bV9mbGFncyAmIChWTV9QRk5NQVB8Vk1fTUlYRURNQVApKSkgewogCQlpZiAodm1hLT52bV9mbGFncyAmIFZNX01JWEVETUFQKSB7CiAJCQlpZiAoIXBmbl92YWxpZChwZm4pKQpAQCAtNDcxLDExICs1MTgsMTQgQEAKIAkJfQogCX0KIAotCVZNX0JVR19PTighcGZuX3ZhbGlkKHBmbikpOworY2hlY2tfcGZuOgorCWlmICh1bmxpa2VseShwZm4gPiBoaWdoZXN0X21lbW1hcF9wZm4pKSB7CisJCXByaW50X2JhZF9wdGUodm1hLCBhZGRyLCBwdGUsIE5VTEwpOworCQlyZXR1cm4gTlVMTDsKKwl9CiAKIAkvKgogCSAqIE5PVEUhIFdlIHN0aWxsIGhhdmUgUGFnZVJlc2VydmVkKCkgcGFnZXMgaW4gdGhlIHBhZ2UgdGFibGVzLgotCSAqCiAJICogZWcuIFZEU08gbWFwcGluZ3MgY2FuIGNhdXNlIHRoZW0gdG8gZXhpc3QuCiAJICovCiBvdXQ6CkBAIC03NjcsMTEgKzgxNywxNCBAQAogCQkJZWxzZSB7CiAJCQkJaWYgKHB0ZV9kaXJ0eShwdGVudCkpCiAJCQkJCXNldF9wYWdlX2RpcnR5KHBhZ2UpOwotCQkJCWlmIChwdGVfeW91bmcocHRlbnQpKQotCQkJCQlTZXRQYWdlUmVmZXJlbmNlZChwYWdlKTsKKwkJCQlpZiAocHRlX3lvdW5nKHB0ZW50KSAmJgorCQkJCSAgICBsaWtlbHkoIVZNX1NlcXVlbnRpYWxSZWFkSGludCh2bWEpKSkKKwkJCQkJbWFya19wYWdlX2FjY2Vzc2VkKHBhZ2UpOwogCQkJCWZpbGVfcnNzLS07CiAJCQl9Ci0JCQlwYWdlX3JlbW92ZV9ybWFwKHBhZ2UsIHZtYSk7CisJCQlwYWdlX3JlbW92ZV9ybWFwKHBhZ2UpOworCQkJaWYgKHVubGlrZWx5KHBhZ2VfbWFwY291bnQocGFnZSkgPCAwKSkKKwkJCQlwcmludF9iYWRfcHRlKHZtYSwgYWRkciwgcHRlbnQsIHBhZ2UpOwogCQkJdGxiX3JlbW92ZV9wYWdlKHRsYiwgcGFnZSk7CiAJCQljb250aW51ZTsKIAkJfQpAQCAtNzgxLDggKzgzNCwxMiBAQAogCQkgKi8KIAkJaWYgKHVubGlrZWx5KGRldGFpbHMpKQogCQkJY29udGludWU7Ci0JCWlmICghcHRlX2ZpbGUocHRlbnQpKQotCQkJZnJlZV9zd2FwX2FuZF9jYWNoZShwdGVfdG9fc3dwX2VudHJ5KHB0ZW50KSk7CisJCWlmIChwdGVfZmlsZShwdGVudCkpIHsKKwkJCWlmICh1bmxpa2VseSghKHZtYS0+dm1fZmxhZ3MgJiBWTV9OT05MSU5FQVIpKSkKKwkJCQlwcmludF9iYWRfcHRlKHZtYSwgYWRkciwgcHRlbnQsIE5VTEwpOworCQl9IGVsc2UgaWYKKwkJICAodW5saWtlbHkoIWZyZWVfc3dhcF9hbmRfY2FjaGUocHRlX3RvX3N3cF9lbnRyeShwdGVudCkpKSkKKwkJCXByaW50X2JhZF9wdGUodm1hLCBhZGRyLCBwdGVudCwgTlVMTCk7CiAJCXB0ZV9jbGVhcl9ub3RfcHJlc2VudF9mdWxsKG1tLCBhZGRyLCBwdGUsIHRsYi0+ZnVsbG1tKTsKIAl9IHdoaWxlIChwdGUrKywgYWRkciArPSBQQUdFX1NJWkUsIChhZGRyICE9IGVuZCAmJiAqemFwX3dvcmsgPiAwKSk7CiAKQEAgLTExNTMsNiArMTIxMCw3IEBACiAJaW50IHdyaXRlID0gISEoZmxhZ3MgJiBHVVBfRkxBR1NfV1JJVEUpOwogCWludCBmb3JjZSA9ICEhKGZsYWdzICYgR1VQX0ZMQUdTX0ZPUkNFKTsKIAlpbnQgaWdub3JlID0gISEoZmxhZ3MgJiBHVVBfRkxBR1NfSUdOT1JFX1ZNQV9QRVJNSVNTSU9OUyk7CisJaW50IGlnbm9yZV9zaWdraWxsID0gISEoZmxhZ3MgJiBHVVBfRkxBR1NfSUdOT1JFX1NJR0tJTEwpOwogCiAJaWYgKGxlbiA8PSAwKQogCQlyZXR1cm4gMDsKQEAgLTEyMzEsMTIgKzEyODksMTUgQEAKIAkJCXN0cnVjdCBwYWdlICpwYWdlOwogCiAJCQkvKgotCQkJICogSWYgdHNrIGlzIG9vbWluZywgY3V0IG9mZiBpdHMgYWNjZXNzIHRvIGxhcmdlIG1lbW9yeQotCQkJICogYWxsb2NhdGlvbnMuIEl0IGhhcyBhIHBlbmRpbmcgU0lHS0lMTCwgYnV0IGl0IGNhbid0Ci0JCQkgKiBiZSBwcm9jZXNzZWQgdW50aWwgcmV0dXJuaW5nIHRvIHVzZXIgc3BhY2UuCisJCQkgKiBJZiB3ZSBoYXZlIGEgcGVuZGluZyBTSUdLSUxMLCBkb24ndCBrZWVwIGZhdWx0aW5nCisJCQkgKiBwYWdlcyBhbmQgcG90ZW50aWFsbHkgYWxsb2NhdGluZyBtZW1vcnksIHVubGVzcworCQkJICogY3VycmVudCBpcyBoYW5kbGluZyBtdW5sb2NrLS1lLmcuLCBvbiBleGl0LiBJbgorCQkJICogdGhhdCBjYXNlLCB3ZSBhcmUgbm90IGFsbG9jYXRpbmcgbWVtb3J5LiAgUmF0aGVyLAorCQkJICogd2UncmUgb25seSB1bmxvY2tpbmcgYWxyZWFkeSByZXNpZGVudC9tYXBwZWQgcGFnZXMuCiAJCQkgKi8KLQkJCWlmICh1bmxpa2VseSh0ZXN0X3Rza190aHJlYWRfZmxhZyh0c2ssIFRJRl9NRU1ESUUpKSkKLQkJCQlyZXR1cm4gaSA/IGkgOiAtRU5PTUVNOworCQkJaWYgKHVubGlrZWx5KCFpZ25vcmVfc2lna2lsbCAmJgorCQkJCQlmYXRhbF9zaWduYWxfcGVuZGluZyhjdXJyZW50KSkpCisJCQkJcmV0dXJuIGkgPyBpIDogLUVSRVNUQVJUU1lTOwogCiAJCQlpZiAod3JpdGUpCiAJCQkJZm9sbF9mbGFncyB8PSBGT0xMX1dSSVRFOwpAQCAtMTI2Myw5ICsxMzI0LDE1IEBACiAJCQkJICogZG9fd3BfcGFnZSBoYXMgYnJva2VuIENPVyB3aGVuIG5lY2Vzc2FyeSwKIAkJCQkgKiBldmVuIGlmIG1heWJlX21rd3JpdGUgZGVjaWRlZCBub3QgdG8gc2V0CiAJCQkJICogcHRlX3dyaXRlLiBXZSBjYW4gdGh1cyBzYWZlbHkgZG8gc3Vic2VxdWVudAotCQkJCSAqIHBhZ2UgbG9va3VwcyBhcyBpZiB0aGV5IHdlcmUgcmVhZHMuCisJCQkJICogcGFnZSBsb29rdXBzIGFzIGlmIHRoZXkgd2VyZSByZWFkcy4gQnV0IG9ubHkKKwkJCQkgKiBkbyBzbyB3aGVuIGxvb3BpbmcgZm9yIHB0ZV93cml0ZSBpcyBmdXRpbGU6CisJCQkJICogaW4gc29tZSBjYXNlcyB1c2Vyc3BhY2UgbWF5IGFsc28gYmUgd2FudGluZworCQkJCSAqIHRvIHdyaXRlIHRvIHRoZSBnb3R0ZW4gdXNlciBwYWdlLCB3aGljaCBhCisJCQkJICogcmVhZCBmYXVsdCBoZXJlIG1pZ2h0IHByZXZlbnQgKGEgcmVhZG9ubHkKKwkJCQkgKiBwYWdlIG1pZ2h0IGdldCByZUNPV2VkIGJ5IHVzZXJzcGFjZSB3cml0ZSkuCiAJCQkJICovCi0JCQkJaWYgKHJldCAmIFZNX0ZBVUxUX1dSSVRFKQorCQkJCWlmICgocmV0ICYgVk1fRkFVTFRfV1JJVEUpICYmCisJCQkJICAgICEodm1hLT52bV9mbGFncyAmIFZNX1dSSVRFKSkKIAkJCQkJZm9sbF9mbGFncyAmPSB+Rk9MTF9XUklURTsKIAogCQkJCWNvbmRfcmVzY2hlZCgpOwpAQCAtMTY0NCw2ICsxNzExLDggQEAKIAogCUJVR19PTihwbWRfaHVnZSgqcG1kKSk7CiAKKwlhcmNoX2VudGVyX2xhenlfbW11X21vZGUoKTsKKwogCXRva2VuID0gcG1kX3BndGFibGUoKnBtZCk7CiAKIAlkbyB7CkBAIC0xNjUyLDYgKzE3MjEsOCBAQAogCQkJYnJlYWs7CiAJfSB3aGlsZSAocHRlKyssIGFkZHIgKz0gUEFHRV9TSVpFLCBhZGRyICE9IGVuZCk7CiAKKwlhcmNoX2xlYXZlX2xhenlfbW11X21vZGUoKTsKKwogCWlmIChtbSAhPSAmaW5pdF9tbSkKIAkJcHRlX3VubWFwX3VubG9jayhwdGUtMSwgcHRsKTsKIAlyZXR1cm4gZXJyOwpAQCAtMTgzNywxMCArMTkwOCwyMSBAQAogCSAqIG5vdCBkaXJ0eSBhY2NvdW50YWJsZS4KIAkgKi8KIAlpZiAoUGFnZUFub24ob2xkX3BhZ2UpKSB7Ci0JCWlmICh0cnlsb2NrX3BhZ2Uob2xkX3BhZ2UpKSB7Ci0JCQlyZXVzZSA9IGNhbl9zaGFyZV9zd2FwX3BhZ2Uob2xkX3BhZ2UpOwotCQkJdW5sb2NrX3BhZ2Uob2xkX3BhZ2UpOworCQlpZiAoIXRyeWxvY2tfcGFnZShvbGRfcGFnZSkpIHsKKwkJCXBhZ2VfY2FjaGVfZ2V0KG9sZF9wYWdlKTsKKwkJCXB0ZV91bm1hcF91bmxvY2socGFnZV90YWJsZSwgcHRsKTsKKwkJCWxvY2tfcGFnZShvbGRfcGFnZSk7CisJCQlwYWdlX3RhYmxlID0gcHRlX29mZnNldF9tYXBfbG9jayhtbSwgcG1kLCBhZGRyZXNzLAorCQkJCQkJCSAmcHRsKTsKKwkJCWlmICghcHRlX3NhbWUoKnBhZ2VfdGFibGUsIG9yaWdfcHRlKSkgeworCQkJCXVubG9ja19wYWdlKG9sZF9wYWdlKTsKKwkJCQlwYWdlX2NhY2hlX3JlbGVhc2Uob2xkX3BhZ2UpOworCQkJCWdvdG8gdW5sb2NrOworCQkJfQorCQkJcGFnZV9jYWNoZV9yZWxlYXNlKG9sZF9wYWdlKTsKIAkJfQorCQlyZXVzZSA9IHJldXNlX3N3YXBfcGFnZShvbGRfcGFnZSk7CisJCXVubG9ja19wYWdlKG9sZF9wYWdlKTsKIAl9IGVsc2UgaWYgKHVubGlrZWx5KCh2bWEtPnZtX2ZsYWdzICYgKFZNX1dSSVRFfFZNX1NIQVJFRCkpID09CiAJCQkJCShWTV9XUklURXxWTV9TSEFSRUQpKSkgewogCQkvKgpAQCAtMTkxOCw3ICsyMDAwLDcgQEAKIAljb3dfdXNlcl9wYWdlKG5ld19wYWdlLCBvbGRfcGFnZSwgYWRkcmVzcywgdm1hKTsKIAlfX1NldFBhZ2VVcHRvZGF0ZShuZXdfcGFnZSk7CiAKLQlpZiAobWVtX2Nncm91cF9jaGFyZ2UobmV3X3BhZ2UsIG1tLCBHRlBfS0VSTkVMKSkKKwlpZiAobWVtX2Nncm91cF9uZXdwYWdlX2NoYXJnZShuZXdfcGFnZSwgbW0sIEdGUF9LRVJORUwpKQogCQlnb3RvIG9vbV9mcmVlX25ldzsKIAogCS8qCkBAIC0xOTQzLDExICsyMDI1LDcgQEAKIAkJICogdGhyZWFkIGRvaW5nIENPVy4KIAkJICovCiAJCXB0ZXBfY2xlYXJfZmx1c2hfbm90aWZ5KHZtYSwgYWRkcmVzcywgcGFnZV90YWJsZSk7Ci0JCVNldFBhZ2VTd2FwQmFja2VkKG5ld19wYWdlKTsKLQkJbHJ1X2NhY2hlX2FkZF9hY3RpdmVfb3JfdW5ldmljdGFibGUobmV3X3BhZ2UsIHZtYSk7CiAJCXBhZ2VfYWRkX25ld19hbm9uX3JtYXAobmV3X3BhZ2UsIHZtYSwgYWRkcmVzcyk7Ci0KLS8vVE9ETzogIGlzIHRoaXMgc2FmZT8gIGRvX2Fub255bW91c19wYWdlKCkgZG9lcyBpdCB0aGlzIHdheS4KIAkJc2V0X3B0ZV9hdChtbSwgYWRkcmVzcywgcGFnZV90YWJsZSwgZW50cnkpOwogCQl1cGRhdGVfbW11X2NhY2hlKHZtYSwgYWRkcmVzcywgZW50cnkpOwogCQlpZiAob2xkX3BhZ2UpIHsKQEAgLTE5NzMsNyArMjA1MSw3IEBACiAJCQkgKiBtYXBjb3VudCBpcyB2aXNpYmxlLiBTbyB0cmFuc2l0aXZlbHksIFRMQnMgdG8KIAkJCSAqIG9sZCBwYWdlIHdpbGwgYmUgZmx1c2hlZCBiZWZvcmUgaXQgY2FuIGJlIHJldXNlZC4KIAkJCSAqLwotCQkJcGFnZV9yZW1vdmVfcm1hcChvbGRfcGFnZSwgdm1hKTsKKwkJCXBhZ2VfcmVtb3ZlX3JtYXAob2xkX3BhZ2UpOwogCQl9CiAKIAkJLyogRnJlZSB0aGUgb2xkIHBhZ2UuLiAqLwpAQCAtMjI2Niw3ICsyMzQ0LDcgQEAKIAkJdW5tYXBfbWFwcGluZ19yYW5nZShtYXBwaW5nLCBvZmZzZXQgKyBQQUdFX1NJWkUgLSAxLCAwLCAxKTsKIAl9CiAKLQlpZiAoaW5vZGUtPmlfb3AgJiYgaW5vZGUtPmlfb3AtPnRydW5jYXRlKQorCWlmIChpbm9kZS0+aV9vcC0+dHJ1bmNhdGUpCiAJCWlub2RlLT5pX29wLT50cnVuY2F0ZShpbm9kZSk7CiAJcmV0dXJuIDA7CiAKQEAgLTIyODYsNyArMjM2NCw3IEBACiAJICogYSB3YXkgdG8gdHJ1bmNhdGUgYSByYW5nZSBvZiBibG9ja3MgKHB1bmNoIGEgaG9sZSkgLQogCSAqIHdlIHNob3VsZCByZXR1cm4gZmFpbHVyZSByaWdodCBub3cuCiAJICovCi0JaWYgKCFpbm9kZS0+aV9vcCB8fCAhaW5vZGUtPmlfb3AtPnRydW5jYXRlX3JhbmdlKQorCWlmICghaW5vZGUtPmlfb3AtPnRydW5jYXRlX3JhbmdlKQogCQlyZXR1cm4gLUVOT1NZUzsKIAogCW11dGV4X2xvY2soJmlub2RlLT5pX211dGV4KTsKQEAgLTIzMTQsNiArMjM5Miw3IEBACiAJc3RydWN0IHBhZ2UgKnBhZ2U7CiAJc3dwX2VudHJ5X3QgZW50cnk7CiAJcHRlX3QgcHRlOworCXN0cnVjdCBtZW1fY2dyb3VwICpwdHIgPSBOVUxMOwogCWludCByZXQgPSAwOwogCiAJaWYgKCFwdGVfdW5tYXBfc2FtZShtbSwgcG1kLCBwYWdlX3RhYmxlLCBvcmlnX3B0ZSkpCkBAIC0yMzUyLDcgKzI0MzEsNyBAQAogCWxvY2tfcGFnZShwYWdlKTsKIAlkZWxheWFjY3RfY2xlYXJfZmxhZyhERUxBWUFDQ1RfUEZfU1dBUElOKTsKIAotCWlmIChtZW1fY2dyb3VwX2NoYXJnZShwYWdlLCBtbSwgR0ZQX0tFUk5FTCkpIHsKKwlpZiAobWVtX2Nncm91cF90cnlfY2hhcmdlX3N3YXBpbihtbSwgcGFnZSwgR0ZQX0tFUk5FTCwgJnB0cikpIHsKIAkJcmV0ID0gVk1fRkFVTFRfT09NOwogCQl1bmxvY2tfcGFnZShwYWdlKTsKIAkJZ290byBvdXQ7CkBAIC0yMzcwLDIyICsyNDQ5LDM1IEBACiAJCWdvdG8gb3V0X25vbWFwOwogCX0KIAotCS8qIFRoZSBwYWdlIGlzbid0IHByZXNlbnQgeWV0LCBnbyBhaGVhZCB3aXRoIHRoZSBmYXVsdC4gKi8KKwkvKgorCSAqIFRoZSBwYWdlIGlzbid0IHByZXNlbnQgeWV0LCBnbyBhaGVhZCB3aXRoIHRoZSBmYXVsdC4KKwkgKgorCSAqIEJlIGNhcmVmdWwgYWJvdXQgdGhlIHNlcXVlbmNlIG9mIG9wZXJhdGlvbnMgaGVyZS4KKwkgKiBUbyBnZXQgaXRzIGFjY291bnRpbmcgcmlnaHQsIHJldXNlX3N3YXBfcGFnZSgpIG11c3QgYmUgY2FsbGVkCisJICogd2hpbGUgdGhlIHBhZ2UgaXMgY291bnRlZCBvbiBzd2FwIGJ1dCBub3QgeWV0IGluIG1hcGNvdW50IGkuZS4KKwkgKiBiZWZvcmUgcGFnZV9hZGRfYW5vbl9ybWFwKCkgYW5kIHN3YXBfZnJlZSgpOyB0cnlfdG9fZnJlZV9zd2FwKCkKKwkgKiBtdXN0IGJlIGNhbGxlZCBhZnRlciB0aGUgc3dhcF9mcmVlKCksIG9yIGl0IHdpbGwgbmV2ZXIgc3VjY2VlZC4KKwkgKiBCZWNhdXNlIGRlbGV0ZV9mcm9tX3N3YXBfcGFnZSgpIG1heSBiZSBjYWxsZWQgYnkgcmV1c2Vfc3dhcF9wYWdlKCksCisJICogbWVtX2Nncm91cF9jb21taXRfY2hhcmdlX3N3YXBpbigpIG1heSBub3QgYmUgYWJsZSB0byBmaW5kIHN3cF9lbnRyeQorCSAqIGluIHBhZ2UtPnByaXZhdGUuIEluIHRoaXMgY2FzZSwgYSByZWNvcmQgaW4gc3dhcF9jZ3JvdXAgIGlzIHNpbGVudGx5CisJICogZGlzY2FyZGVkIGF0IHN3YXBfZnJlZSgpLgorCSAqLwogCiAJaW5jX21tX2NvdW50ZXIobW0sIGFub25fcnNzKTsKIAlwdGUgPSBta19wdGUocGFnZSwgdm1hLT52bV9wYWdlX3Byb3QpOwotCWlmICh3cml0ZV9hY2Nlc3MgJiYgY2FuX3NoYXJlX3N3YXBfcGFnZShwYWdlKSkgeworCWlmICh3cml0ZV9hY2Nlc3MgJiYgcmV1c2Vfc3dhcF9wYWdlKHBhZ2UpKSB7CiAJCXB0ZSA9IG1heWJlX21rd3JpdGUocHRlX21rZGlydHkocHRlKSwgdm1hKTsKIAkJd3JpdGVfYWNjZXNzID0gMDsKIAl9Ci0KIAlmbHVzaF9pY2FjaGVfcGFnZSh2bWEsIHBhZ2UpOwogCXNldF9wdGVfYXQobW0sIGFkZHJlc3MsIHBhZ2VfdGFibGUsIHB0ZSk7CiAJcGFnZV9hZGRfYW5vbl9ybWFwKHBhZ2UsIHZtYSwgYWRkcmVzcyk7CisJLyogSXQncyBiZXR0ZXIgdG8gY2FsbCBjb21taXQtY2hhcmdlIGFmdGVyIHJtYXAgaXMgZXN0YWJsaXNoZWQgKi8KKwltZW1fY2dyb3VwX2NvbW1pdF9jaGFyZ2Vfc3dhcGluKHBhZ2UsIHB0cik7CiAKIAlzd2FwX2ZyZWUoZW50cnkpOwogCWlmICh2bV9zd2FwX2Z1bGwoKSB8fCAodm1hLT52bV9mbGFncyAmIFZNX0xPQ0tFRCkgfHwgUGFnZU1sb2NrZWQocGFnZSkpCi0JCXJlbW92ZV9leGNsdXNpdmVfc3dhcF9wYWdlKHBhZ2UpOworCQl0cnlfdG9fZnJlZV9zd2FwKHBhZ2UpOwogCXVubG9ja19wYWdlKHBhZ2UpOwogCiAJaWYgKHdyaXRlX2FjY2VzcykgewpAQCAtMjQwMiw3ICsyNDk0LDcgQEAKIG91dDoKIAlyZXR1cm4gcmV0Owogb3V0X25vbWFwOgotCW1lbV9jZ3JvdXBfdW5jaGFyZ2VfcGFnZShwYWdlKTsKKwltZW1fY2dyb3VwX2NhbmNlbF9jaGFyZ2Vfc3dhcGluKHB0cik7CiAJcHRlX3VubWFwX3VubG9jayhwYWdlX3RhYmxlLCBwdGwpOwogCXVubG9ja19wYWdlKHBhZ2UpOwogCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKQEAgLTI0MzIsNyArMjUyNCw3IEBACiAJCWdvdG8gb29tOwogCV9fU2V0UGFnZVVwdG9kYXRlKHBhZ2UpOwogCi0JaWYgKG1lbV9jZ3JvdXBfY2hhcmdlKHBhZ2UsIG1tLCBHRlBfS0VSTkVMKSkKKwlpZiAobWVtX2Nncm91cF9uZXdwYWdlX2NoYXJnZShwYWdlLCBtbSwgR0ZQX0tFUk5FTCkpCiAJCWdvdG8gb29tX2ZyZWVfcGFnZTsKIAogCWVudHJ5ID0gbWtfcHRlKHBhZ2UsIHZtYS0+dm1fcGFnZV9wcm90KTsKQEAgLTI0NDIsOCArMjUzNCw2IEBACiAJaWYgKCFwdGVfbm9uZSgqcGFnZV90YWJsZSkpCiAJCWdvdG8gcmVsZWFzZTsKIAlpbmNfbW1fY291bnRlcihtbSwgYW5vbl9yc3MpOwotCVNldFBhZ2VTd2FwQmFja2VkKHBhZ2UpOwotCWxydV9jYWNoZV9hZGRfYWN0aXZlX29yX3VuZXZpY3RhYmxlKHBhZ2UsIHZtYSk7CiAJcGFnZV9hZGRfbmV3X2Fub25fcm1hcChwYWdlLCB2bWEsIGFkZHJlc3MpOwogCXNldF9wdGVfYXQobW0sIGFkZHJlc3MsIHBhZ2VfdGFibGUsIGVudHJ5KTsKIApAQCAtMjUyNSw3ICsyNjE1LDcgQEAKIAkJCQlyZXQgPSBWTV9GQVVMVF9PT007CiAJCQkJZ290byBvdXQ7CiAJCQl9Ci0JCQlpZiAobWVtX2Nncm91cF9jaGFyZ2UocGFnZSwgbW0sIEdGUF9LRVJORUwpKSB7CisJCQlpZiAobWVtX2Nncm91cF9uZXdwYWdlX2NoYXJnZShwYWdlLCBtbSwgR0ZQX0tFUk5FTCkpIHsKIAkJCQlyZXQgPSBWTV9GQVVMVF9PT007CiAJCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOwogCQkJCWdvdG8gb3V0OwpAQCAtMjU5MSw4ICsyNjgxLDYgQEAKIAkJCWVudHJ5ID0gbWF5YmVfbWt3cml0ZShwdGVfbWtkaXJ0eShlbnRyeSksIHZtYSk7CiAJCWlmIChhbm9uKSB7CiAJCQlpbmNfbW1fY291bnRlcihtbSwgYW5vbl9yc3MpOwotCQkJU2V0UGFnZVN3YXBCYWNrZWQocGFnZSk7Ci0JCQlscnVfY2FjaGVfYWRkX2FjdGl2ZV9vcl91bmV2aWN0YWJsZShwYWdlLCB2bWEpOwogCQkJcGFnZV9hZGRfbmV3X2Fub25fcm1hcChwYWdlLCB2bWEsIGFkZHJlc3MpOwogCQl9IGVsc2UgewogCQkJaW5jX21tX2NvdW50ZXIobW0sIGZpbGVfcnNzKTsKQEAgLTI2MDIsNyArMjY5MCw2IEBACiAJCQkJZ2V0X3BhZ2UoZGlydHlfcGFnZSk7CiAJCQl9CiAJCX0KLS8vVE9ETzogIGlzIHRoaXMgc2FmZT8gIGRvX2Fub255bW91c19wYWdlKCkgZG9lcyBpdCB0aGlzIHdheS4KIAkJc2V0X3B0ZV9hdChtbSwgYWRkcmVzcywgcGFnZV90YWJsZSwgZW50cnkpOwogCiAJCS8qIG5vIG5lZWQgdG8gaW52YWxpZGF0ZTogYSBub3QtcHJlc2VudCBwYWdlIHdvbid0IGJlIGNhY2hlZCAqLwpAQCAtMjY2NiwxMiArMjc1MywxMSBAQAogCWlmICghcHRlX3VubWFwX3NhbWUobW0sIHBtZCwgcGFnZV90YWJsZSwgb3JpZ19wdGUpKQogCQlyZXR1cm4gMDsKIAotCWlmICh1bmxpa2VseSghKHZtYS0+dm1fZmxhZ3MgJiBWTV9OT05MSU5FQVIpIHx8Ci0JCQkhKHZtYS0+dm1fZmxhZ3MgJiBWTV9DQU5fTk9OTElORUFSKSkpIHsKKwlpZiAodW5saWtlbHkoISh2bWEtPnZtX2ZsYWdzICYgVk1fTk9OTElORUFSKSkpIHsKIAkJLyoKIAkJICogUGFnZSB0YWJsZSBjb3JydXB0ZWQ6IHNob3cgcHRlIGFuZCBraWxsIHByb2Nlc3MuCiAJCSAqLwotCQlwcmludF9iYWRfcHRlKHZtYSwgb3JpZ19wdGUsIGFkZHJlc3MpOworCQlwcmludF9iYWRfcHRlKHZtYSwgYWRkcmVzcywgb3JpZ19wdGUsIE5VTEwpOwogCQlyZXR1cm4gVk1fRkFVTFRfT09NOwogCX0KIApAQCAtMjk1Myw3ICszMDM5LDcgQEAKIHsKIAlyZXNvdXJjZV9zaXplX3QgcGh5c19hZGRyOwogCXVuc2lnbmVkIGxvbmcgcHJvdCA9IDA7Ci0Jdm9pZCAqbWFkZHI7CisJdm9pZCBfX2lvbWVtICptYWRkcjsKIAlpbnQgb2Zmc2V0ID0gYWRkciAmIChQQUdFX1NJWkUtMSk7CiAKIAlpZiAoZm9sbG93X3BoeXModm1hLCBhZGRyLCB3cml0ZSwgJnByb3QsICZwaHlzX2FkZHIpKQpkaWZmIC0tZ2l0IGEvbW0vbWVtb3J5X2hvdHBsdWcuYyBiL21tL21lbW9yeV9ob3RwbHVnLmMKaW5kZXggYjE3MzcxMS4uYzA4M2NmNSAxMDA2NDQKLS0tIGEvbW0vbWVtb3J5X2hvdHBsdWcuYworKysgYi9tbS9tZW1vcnlfaG90cGx1Zy5jCkBAIC0yMTYsNyArMjE2LDggQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBfX21lbWluaXQgX19hZGRfc2VjdGlvbihzdHJ1Y3Qgem9uZSAqem9uZSwgdW5zaWduZWQgbG9uZyBwaHlzX3N0YXJ0X3BmbikKK3N0YXRpYyBpbnQgX19tZW1pbml0IF9fYWRkX3NlY3Rpb24oaW50IG5pZCwgc3RydWN0IHpvbmUgKnpvbmUsCisJCQkJCXVuc2lnbmVkIGxvbmcgcGh5c19zdGFydF9wZm4pCiB7CiAJaW50IG5yX3BhZ2VzID0gUEFHRVNfUEVSX1NFQ1RJT047CiAJaW50IHJldDsKQEAgLTIzNCw3ICsyMzUsNyBAQAogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCi0JcmV0dXJuIHJlZ2lzdGVyX25ld19tZW1vcnkoX19wZm5fdG9fc2VjdGlvbihwaHlzX3N0YXJ0X3BmbikpOworCXJldHVybiByZWdpc3Rlcl9uZXdfbWVtb3J5KG5pZCwgX19wZm5fdG9fc2VjdGlvbihwaHlzX3N0YXJ0X3BmbikpOwogfQogCiAjaWZkZWYgQ09ORklHX1NQQVJTRU1FTV9WTUVNTUFQCkBAIC0yNzMsOCArMjc0LDggQEAKICAqIGNhbGwgdGhpcyBmdW5jdGlvbiBhZnRlciBkZWNpZGluZyB0aGUgem9uZSB0byB3aGljaCB0bwogICogYWRkIHRoZSBuZXcgcGFnZXMuCiAgKi8KLWludCBfX3JlZiBfX2FkZF9wYWdlcyhzdHJ1Y3Qgem9uZSAqem9uZSwgdW5zaWduZWQgbG9uZyBwaHlzX3N0YXJ0X3BmbiwKLQkJIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMpCitpbnQgX19yZWYgX19hZGRfcGFnZXMoaW50IG5pZCwgc3RydWN0IHpvbmUgKnpvbmUsIHVuc2lnbmVkIGxvbmcgcGh5c19zdGFydF9wZm4sCisJCQl1bnNpZ25lZCBsb25nIG5yX3BhZ2VzKQogewogCXVuc2lnbmVkIGxvbmcgaTsKIAlpbnQgZXJyID0gMDsKQEAgLTI4NCw3ICsyODUsNyBAQAogCWVuZF9zZWMgPSBwZm5fdG9fc2VjdGlvbl9ucihwaHlzX3N0YXJ0X3BmbiArIG5yX3BhZ2VzIC0gMSk7CiAKIAlmb3IgKGkgPSBzdGFydF9zZWM7IGkgPD0gZW5kX3NlYzsgaSsrKSB7Ci0JCWVyciA9IF9fYWRkX3NlY3Rpb24oem9uZSwgaSA8PCBQRk5fU0VDVElPTl9TSElGVCk7CisJCWVyciA9IF9fYWRkX3NlY3Rpb24obmlkLCB6b25lLCBpIDw8IFBGTl9TRUNUSU9OX1NISUZUKTsKIAogCQkvKgogCQkgKiBFRVhJU1QgaXMgZmluYWxseSBkZWFsdCB3aXRoIGJ5IGlvcmVzb3VyY2UgY29sbGlzaW9uCkBAIC02MjYsMTUgKzYyNywxMiBAQAogfQogCiBzdGF0aWMgc3RydWN0IHBhZ2UgKgotaG90cmVtb3ZlX21pZ3JhdGVfYWxsb2Moc3RydWN0IHBhZ2UgKnBhZ2UsCi0JCQl1bnNpZ25lZCBsb25nIHByaXZhdGUsCi0JCQlpbnQgKip4KQoraG90cmVtb3ZlX21pZ3JhdGVfYWxsb2Moc3RydWN0IHBhZ2UgKnBhZ2UsIHVuc2lnbmVkIGxvbmcgcHJpdmF0ZSwgaW50ICoqeCkKIHsKLQkvKiBUaGlzIHNob3VsZCBiZSBpbXByb29vb29vdmVkISEgKi8KLQlyZXR1cm4gYWxsb2NfcGFnZShHRlBfSElHSFVTRVJfUEFHRUNBQ0hFKTsKKwkvKiBUaGlzIHNob3VsZCBiZSBpbXByb29vb292ZWQhISAqLworCXJldHVybiBhbGxvY19wYWdlKEdGUF9ISUdIVVNFUl9NT1ZBQkxFKTsKIH0KIAotCiAjZGVmaW5lIE5SX09GRkxJTkVfQVRfT05DRV9QQUdFUwkoMjU2KQogc3RhdGljIGludAogZG9fbWlncmF0ZV9yYW5nZSh1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbiwgdW5zaWduZWQgbG9uZyBlbmRfcGZuKQpkaWZmIC0tZ2l0IGEvbW0vbWlncmF0ZS5jIGIvbW0vbWlncmF0ZS5jCmluZGV4IDIxNjMxYWIuLmEzMGVhNWYgMTAwNjQ0Ci0tLSBhL21tL21pZ3JhdGUuYworKysgYi9tbS9taWdyYXRlLmMKQEAgLTEyMSwyMCArMTIxLDYgQEAKIAlpZiAoIWlzX21pZ3JhdGlvbl9lbnRyeShlbnRyeSkgfHwgbWlncmF0aW9uX2VudHJ5X3RvX3BhZ2UoZW50cnkpICE9IG9sZCkKIAkJZ290byBvdXQ7CiAKLQkvKgotCSAqIFllcywgaWdub3JlIHRoZSByZXR1cm4gdmFsdWUgZnJvbSBhIEdGUF9BVE9NSUMgbWVtX2Nncm91cF9jaGFyZ2UuCi0JICogRmFpbHVyZSBpcyBub3QgYW4gb3B0aW9uIGhlcmU6IHdlJ3JlIG5vdyBleHBlY3RlZCB0byByZW1vdmUgZXZlcnkKLQkgKiBtaWdyYXRpb24gcHRlLCBhbmQgd2lsbCBjYXVzZSBjcmFzaGVzIG90aGVyd2lzZS4gIE5vcm1hbGx5IHRoaXMKLQkgKiBpcyBub3QgYW4gaXNzdWU6IG1lbV9jZ3JvdXBfcHJlcGFyZV9taWdyYXRpb24gYnVtcGVkIHVwIHRoZSBvbGQKLQkgKiBwYWdlX2Nncm91cCBjb3VudCBmb3Igc2FmZXR5LCB0aGF0J3Mgbm93IGF0dGFjaGVkIHRvIHRoZSBuZXcgcGFnZSwKLQkgKiBzbyB0aGlzIGNoYXJnZSBzaG91bGQganVzdCBiZSBhbm90aGVyIGluY3JlbWVudGF0aW9uIG9mIHRoZSBjb3VudCwKLQkgKiB0byBrZWVwIGluIGJhbGFuY2Ugd2l0aCBybWFwLmMncyBtZW1fY2dyb3VwX3VuY2hhcmdpbmcuICBCdXQgaWYKLQkgKiB0aGVyZSdzIGJlZW4gYSBmb3JjZV9lbXB0eSwgdGhvc2UgcmVmZXJlbmNlIGNvdW50cyBtYXkgbm8gbG9uZ2VyCi0JICogYmUgcmVsaWFibGUsIGFuZCB0aGlzIGNoYXJnZSBjYW4gYWN0dWFsbHkgZmFpbDogb2ggd2VsbCwgd2UgZG9uJ3QKLQkgKiBtYWtlIHRoZSBzaXR1YXRpb24gYW55IHdvcnNlIGJ5IHByb2NlZWRpbmcgYXMgaWYgaXQgaGFkIHN1Y2NlZWRlZC4KLQkgKi8KLQltZW1fY2dyb3VwX2NoYXJnZShuZXcsIG1tLCBHRlBfQVRPTUlDKTsKLQogCWdldF9wYWdlKG5ldyk7CiAJcHRlID0gcHRlX21rb2xkKG1rX3B0ZShuZXcsIHZtYS0+dm1fcGFnZV9wcm90KSk7CiAJaWYgKGlzX3dyaXRlX21pZ3JhdGlvbl9lbnRyeShlbnRyeSkpCkBAIC0zMDAsMTIgKzI4NiwxMCBAQAogCSAqIE5vdyB3ZSBrbm93IHRoYXQgbm8gb25lIGVsc2UgaXMgbG9va2luZyBhdCB0aGUgcGFnZS4KIAkgKi8KIAlnZXRfcGFnZShuZXdwYWdlKTsJLyogYWRkIGNhY2hlIHJlZmVyZW5jZSAqLwotI2lmZGVmIENPTkZJR19TV0FQCiAJaWYgKFBhZ2VTd2FwQ2FjaGUocGFnZSkpIHsKIAkJU2V0UGFnZVN3YXBDYWNoZShuZXdwYWdlKTsKIAkJc2V0X3BhZ2VfcHJpdmF0ZShuZXdwYWdlLCBwYWdlX3ByaXZhdGUocGFnZSkpOwogCX0KLSNlbmRpZgogCiAJcmFkaXhfdHJlZV9yZXBsYWNlX3Nsb3QocHNsb3QsIG5ld3BhZ2UpOwogCkBAIC0zNzMsMTggKzM1NywxMyBAQAogCiAJbWxvY2tfbWlncmF0ZV9wYWdlKG5ld3BhZ2UsIHBhZ2UpOwogCi0jaWZkZWYgQ09ORklHX1NXQVAKIAlDbGVhclBhZ2VTd2FwQ2FjaGUocGFnZSk7Ci0jZW5kaWYKIAlDbGVhclBhZ2VQcml2YXRlKHBhZ2UpOwogCXNldF9wYWdlX3ByaXZhdGUocGFnZSwgMCk7CiAJLyogcGFnZS0+bWFwcGluZyBjb250YWlucyBhIGZsYWcgZm9yIFBhZ2VBbm9uKCkgKi8KIAlhbm9uID0gUGFnZUFub24ocGFnZSk7CiAJcGFnZS0+bWFwcGluZyA9IE5VTEw7CiAKLQlpZiAoIWFub24pIC8qIFRoaXMgcGFnZSB3YXMgcmVtb3ZlZCBmcm9tIHJhZGl4LXRyZWUuICovCi0JCW1lbV9jZ3JvdXBfdW5jaGFyZ2VfY2FjaGVfcGFnZShwYWdlKTsKLQogCS8qCiAJICogSWYgYW55IHdhaXRlcnMgaGF2ZSBhY2N1bXVsYXRlZCBvbiB0aGUgbmV3IHBhZ2UgdGhlbgogCSAqIHdha2UgdGhlbSB1cC4KQEAgLTYxOCw2ICs1OTcsNyBAQAogCXN0cnVjdCBwYWdlICpuZXdwYWdlID0gZ2V0X25ld19wYWdlKHBhZ2UsIHByaXZhdGUsICZyZXN1bHQpOwogCWludCByY3VfbG9ja2VkID0gMDsKIAlpbnQgY2hhcmdlID0gMDsKKwlzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtOwogCiAJaWYgKCFuZXdwYWdlKQogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTYyNywyNCArNjA3LDI2IEBACiAJCWdvdG8gbW92ZV9uZXdwYWdlOwogCX0KIAotCWNoYXJnZSA9IG1lbV9jZ3JvdXBfcHJlcGFyZV9taWdyYXRpb24ocGFnZSwgbmV3cGFnZSk7Ci0JaWYgKGNoYXJnZSA9PSAtRU5PTUVNKSB7Ci0JCXJjID0gLUVOT01FTTsKLQkJZ290byBtb3ZlX25ld3BhZ2U7Ci0JfQogCS8qIHByZXBhcmUgY2dyb3VwIGp1c3QgcmV0dXJucyAwIG9yIC1FTk9NRU0gKi8KLQlCVUdfT04oY2hhcmdlKTsKLQogCXJjID0gLUVBR0FJTjsKKwogCWlmICghdHJ5bG9ja19wYWdlKHBhZ2UpKSB7CiAJCWlmICghZm9yY2UpCiAJCQlnb3RvIG1vdmVfbmV3cGFnZTsKIAkJbG9ja19wYWdlKHBhZ2UpOwogCX0KIAorCS8qIGNoYXJnZSBhZ2FpbnN0IG5ldyBwYWdlICovCisJY2hhcmdlID0gbWVtX2Nncm91cF9wcmVwYXJlX21pZ3JhdGlvbihwYWdlLCAmbWVtKTsKKwlpZiAoY2hhcmdlID09IC1FTk9NRU0pIHsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIHVubG9jazsKKwl9CisJQlVHX09OKGNoYXJnZSk7CisKIAlpZiAoUGFnZVdyaXRlYmFjayhwYWdlKSkgewogCQlpZiAoIWZvcmNlKQotCQkJZ290byB1bmxvY2s7CisJCQlnb3RvIHVuY2hhcmdlOwogCQl3YWl0X29uX3BhZ2Vfd3JpdGViYWNrKHBhZ2UpOwogCX0KIAkvKgpAQCAtNjk3LDcgKzY3OSw5IEBACiByY3VfdW5sb2NrOgogCWlmIChyY3VfbG9ja2VkKQogCQlyY3VfcmVhZF91bmxvY2soKTsKLQordW5jaGFyZ2U6CisJaWYgKCFjaGFyZ2UpCisJCW1lbV9jZ3JvdXBfZW5kX21pZ3JhdGlvbihtZW0sIHBhZ2UsIG5ld3BhZ2UpOwogdW5sb2NrOgogCXVubG9ja19wYWdlKHBhZ2UpOwogCkBAIC03MTMsOCArNjk3LDYgQEAKIAl9CiAKIG1vdmVfbmV3cGFnZToKLQlpZiAoIWNoYXJnZSkKLQkJbWVtX2Nncm91cF9lbmRfbWlncmF0aW9uKG5ld3BhZ2UpOwogCiAJLyoKIAkgKiBNb3ZlIHRoZSBuZXcgcGFnZSB0byB0aGUgTFJVLiBJZiBtaWdyYXRpb24gd2FzIG5vdCBzdWNjZXNzZnVsCkBAIC04NDgsMTIgKzgzMCw2IEBACiAJCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hOwogCQlzdHJ1Y3QgcGFnZSAqcGFnZTsKIAotCQkvKgotCQkgKiBBIHZhbGlkIHBhZ2UgcG9pbnRlciB0aGF0IHdpbGwgbm90IG1hdGNoIGFueSBvZiB0aGUKLQkJICogcGFnZXMgdGhhdCB3aWxsIGJlIG1vdmVkLgotCQkgKi8KLQkJcHAtPnBhZ2UgPSBaRVJPX1BBR0UoMCk7Ci0KIAkJZXJyID0gLUVGQVVMVDsKIAkJdm1hID0gZmluZF92bWEobW0sIHBwLT5hZGRyKTsKIAkJaWYgKCF2bWEgfHwgIXZtYV9taWdyYXRhYmxlKHZtYSkpCkBAIC05MTksNDEgKzg5NSw0MyBAQAogCQkJIGNvbnN0IGludCBfX3VzZXIgKm5vZGVzLAogCQkJIGludCBfX3VzZXIgKnN0YXR1cywgaW50IGZsYWdzKQogewotCXN0cnVjdCBwYWdlX3RvX25vZGUgKnBtID0gTlVMTDsKKwlzdHJ1Y3QgcGFnZV90b19ub2RlICpwbTsKIAlub2RlbWFza190IHRhc2tfbm9kZXM7Ci0JaW50IGVyciA9IDA7Ci0JaW50IGk7CisJdW5zaWduZWQgbG9uZyBjaHVua19ucl9wYWdlczsKKwl1bnNpZ25lZCBsb25nIGNodW5rX3N0YXJ0OworCWludCBlcnI7CiAKIAl0YXNrX25vZGVzID0gY3B1c2V0X21lbXNfYWxsb3dlZCh0YXNrKTsKIAotCS8qIExpbWl0IG5yX3BhZ2VzIHNvIHRoYXQgdGhlIG11bHRpcGxpY2F0aW9uIG1heSBub3Qgb3ZlcmZsb3cgKi8KLQlpZiAobnJfcGFnZXMgPj0gVUxPTkdfTUFYIC8gc2l6ZW9mKHN0cnVjdCBwYWdlX3RvX25vZGUpIC0gMSkgewotCQllcnIgPSAtRTJCSUc7CisJZXJyID0gLUVOT01FTTsKKwlwbSA9IChzdHJ1Y3QgcGFnZV90b19ub2RlICopX19nZXRfZnJlZV9wYWdlKEdGUF9LRVJORUwpOworCWlmICghcG0pCiAJCWdvdG8gb3V0OwotCX0KLQotCXBtID0gdm1hbGxvYygobnJfcGFnZXMgKyAxKSAqIHNpemVvZihzdHJ1Y3QgcGFnZV90b19ub2RlKSk7Ci0JaWYgKCFwbSkgewotCQllcnIgPSAtRU5PTUVNOwotCQlnb3RvIG91dDsKLQl9Ci0KIAkvKgotCSAqIEdldCBwYXJhbWV0ZXJzIGZyb20gdXNlciBzcGFjZSBhbmQgaW5pdGlhbGl6ZSB0aGUgcG0KLQkgKiBhcnJheS4gUmV0dXJuIHZhcmlvdXMgZXJyb3JzIGlmIHRoZSB1c2VyIGRpZCBzb21ldGhpbmcgd3JvbmcuCisJICogU3RvcmUgYSBjaHVuayBvZiBwYWdlX3RvX25vZGUgYXJyYXkgaW4gYSBwYWdlLAorCSAqIGJ1dCBrZWVwIHRoZSBsYXN0IG9uZSBhcyBhIG1hcmtlcgogCSAqLwotCWZvciAoaSA9IDA7IGkgPCBucl9wYWdlczsgaSsrKSB7Ci0JCWNvbnN0IHZvaWQgX191c2VyICpwOworCWNodW5rX25yX3BhZ2VzID0gKFBBR0VfU0laRSAvIHNpemVvZihzdHJ1Y3QgcGFnZV90b19ub2RlKSkgLSAxOwogCi0JCWVyciA9IC1FRkFVTFQ7Ci0JCWlmIChnZXRfdXNlcihwLCBwYWdlcyArIGkpKQotCQkJZ290byBvdXRfcG07CisJZm9yIChjaHVua19zdGFydCA9IDA7CisJICAgICBjaHVua19zdGFydCA8IG5yX3BhZ2VzOworCSAgICAgY2h1bmtfc3RhcnQgKz0gY2h1bmtfbnJfcGFnZXMpIHsKKwkJaW50IGo7CiAKLQkJcG1baV0uYWRkciA9ICh1bnNpZ25lZCBsb25nKXA7Ci0JCWlmIChub2RlcykgeworCQlpZiAoY2h1bmtfc3RhcnQgKyBjaHVua19ucl9wYWdlcyA+IG5yX3BhZ2VzKQorCQkJY2h1bmtfbnJfcGFnZXMgPSBucl9wYWdlcyAtIGNodW5rX3N0YXJ0OworCisJCS8qIGZpbGwgdGhlIGNodW5rIHBtIHdpdGggYWRkcnMgYW5kIG5vZGVzIGZyb20gdXNlci1zcGFjZSAqLworCQlmb3IgKGogPSAwOyBqIDwgY2h1bmtfbnJfcGFnZXM7IGorKykgeworCQkJY29uc3Qgdm9pZCBfX3VzZXIgKnA7CiAJCQlpbnQgbm9kZTsKIAotCQkJaWYgKGdldF91c2VyKG5vZGUsIG5vZGVzICsgaSkpCisJCQllcnIgPSAtRUZBVUxUOworCQkJaWYgKGdldF91c2VyKHAsIHBhZ2VzICsgaiArIGNodW5rX3N0YXJ0KSkKKwkJCQlnb3RvIG91dF9wbTsKKwkJCXBtW2pdLmFkZHIgPSAodW5zaWduZWQgbG9uZykgcDsKKworCQkJaWYgKGdldF91c2VyKG5vZGUsIG5vZGVzICsgaiArIGNodW5rX3N0YXJ0KSkKIAkJCQlnb3RvIG91dF9wbTsKIAogCQkJZXJyID0gLUVOT0RFVjsKQEAgLTk2NCwyMiArOTQyLDI5IEBACiAJCQlpZiAoIW5vZGVfaXNzZXQobm9kZSwgdGFza19ub2RlcykpCiAJCQkJZ290byBvdXRfcG07CiAKLQkJCXBtW2ldLm5vZGUgPSBub2RlOwotCQl9IGVsc2UKLQkJCXBtW2ldLm5vZGUgPSAwOwkvKiBhbnl0aGluZyB0byBub3QgbWF0Y2ggTUFYX05VTU5PREVTICovCi0JfQotCS8qIEVuZCBtYXJrZXIgKi8KLQlwbVtucl9wYWdlc10ubm9kZSA9IE1BWF9OVU1OT0RFUzsKKwkJCXBtW2pdLm5vZGUgPSBub2RlOworCQl9CiAKLQllcnIgPSBkb19tb3ZlX3BhZ2VfdG9fbm9kZV9hcnJheShtbSwgcG0sIGZsYWdzICYgTVBPTF9NRl9NT1ZFX0FMTCk7Ci0JaWYgKGVyciA+PSAwKQorCQkvKiBFbmQgbWFya2VyIGZvciB0aGlzIGNodW5rICovCisJCXBtW2NodW5rX25yX3BhZ2VzXS5ub2RlID0gTUFYX05VTU5PREVTOworCisJCS8qIE1pZ3JhdGUgdGhpcyBjaHVuayAqLworCQllcnIgPSBkb19tb3ZlX3BhZ2VfdG9fbm9kZV9hcnJheShtbSwgcG0sCisJCQkJCQkgZmxhZ3MgJiBNUE9MX01GX01PVkVfQUxMKTsKKwkJaWYgKGVyciA8IDApCisJCQlnb3RvIG91dF9wbTsKKwogCQkvKiBSZXR1cm4gc3RhdHVzIGluZm9ybWF0aW9uICovCi0JCWZvciAoaSA9IDA7IGkgPCBucl9wYWdlczsgaSsrKQotCQkJaWYgKHB1dF91c2VyKHBtW2ldLnN0YXR1cywgc3RhdHVzICsgaSkpCisJCWZvciAoaiA9IDA7IGogPCBjaHVua19ucl9wYWdlczsgaisrKQorCQkJaWYgKHB1dF91c2VyKHBtW2pdLnN0YXR1cywgc3RhdHVzICsgaiArIGNodW5rX3N0YXJ0KSkgewogCQkJCWVyciA9IC1FRkFVTFQ7CisJCQkJZ290byBvdXRfcG07CisJCQl9CisJfQorCWVyciA9IDA7CiAKIG91dF9wbToKLQl2ZnJlZShwbSk7CisJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKXBtKTsKIG91dDoKIAlyZXR1cm4gZXJyOwogfQpkaWZmIC0tZ2l0IGEvbW0vbWxvY2suYyBiL21tL21sb2NrLmMKaW5kZXggMzAzNWE1Ni4uZTEyNTE1NiAxMDA2NDQKLS0tIGEvbW0vbWxvY2suYworKysgYi9tbS9tbG9jay5jCkBAIC0xNzMsMTIgKzE3MywxMyBAQAogCQkgIChhdG9taWNfcmVhZCgmbW0tPm1tX3VzZXJzKSAhPSAwKSk7CiAKIAkvKgotCSAqIG1sb2NrOiAgIGRvbid0IHBhZ2UgcG9wdWxhdGUgaWYgcGFnZSBoYXMgUFJPVF9OT05FIHBlcm1pc3Npb24uCi0JICogbXVubG9jazogdGhlIHBhZ2VzIGFsd2F5cyBkbyBtdW5sb2NrIGFsdGhyb3VnaAotCSAqICAgICAgICAgIGl0cyBoYXMgUFJPVF9OT05FIHBlcm1pc3Npb24uCisJICogbWxvY2s6ICAgZG9uJ3QgcGFnZSBwb3B1bGF0ZSBpZiB2bWEgaGFzIFBST1RfTk9ORSBwZXJtaXNzaW9uLgorCSAqIG11bmxvY2s6IGFsd2F5cyBkbyBtdW5sb2NrIGFsdGhvdWdoIHRoZSB2bWEgaGFzIFBST1RfTk9ORQorCSAqICAgICAgICAgIHBlcm1pc3Npb24sIG9yIFNJR0tJTEwgaXMgcGVuZGluZy4KIAkgKi8KIAlpZiAoIW1sb2NrKQotCQlndXBfZmxhZ3MgfD0gR1VQX0ZMQUdTX0lHTk9SRV9WTUFfUEVSTUlTU0lPTlM7CisJCWd1cF9mbGFncyB8PSBHVVBfRkxBR1NfSUdOT1JFX1ZNQV9QRVJNSVNTSU9OUyB8CisJCQkgICAgIEdVUF9GTEFHU19JR05PUkVfU0lHS0lMTDsKIAogCWlmICh2bWEtPnZtX2ZsYWdzICYgVk1fV1JJVEUpCiAJCWd1cF9mbGFncyB8PSBHVVBfRkxBR1NfV1JJVEU7CmRpZmYgLS1naXQgYS9tbS9tbWFwLmMgYi9tbS9tbWFwLmMKaW5kZXggZDQ4NTVhNi4uYTkxMGMwNDUgMTAwNjQ0Ci0tLSBhL21tL21tYXAuYworKysgYi9tbS9tbWFwLmMKQEAgLTMsNyArMyw3IEBACiAgKgogICogV3JpdHRlbiBieSBvYnouCiAgKgotICogQWRkcmVzcyBzcGFjZSBhY2NvdW50aW5nIGNvZGUJPGFsYW5AcmVkaGF0LmNvbT4KKyAqIEFkZHJlc3Mgc3BhY2UgYWNjb3VudGluZyBjb2RlCTxhbGFuQGx4b3JndWsudWt1dS5vcmcudWs+CiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KQEAgLTQxMyw3ICs0MTMsNyBAQAogCiBzdGF0aWMgdm9pZCBfX3ZtYV9saW5rX2ZpbGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCiB7Ci0Jc3RydWN0IGZpbGUgKiBmaWxlOworCXN0cnVjdCBmaWxlICpmaWxlOwogCiAJZmlsZSA9IHZtYS0+dm1fZmlsZTsKIAlpZiAoZmlsZSkgewpAQCAtNDc0LDExICs0NzQsMTAgQEAKICAqIGluc2VydCB2bSBzdHJ1Y3R1cmUgaW50byBsaXN0IGFuZCByYnRyZWUgYW5kIGFub25fdm1hLAogICogYnV0IGl0IGhhcyBhbHJlYWR5IGJlZW4gaW5zZXJ0ZWQgaW50byBwcmlvX3RyZWUgZWFybGllci4KICAqLwotc3RhdGljIHZvaWQKLV9faW5zZXJ0X3ZtX3N0cnVjdChzdHJ1Y3QgbW1fc3RydWN0ICogbW0sIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqIHZtYSkKK3N0YXRpYyB2b2lkIF9faW5zZXJ0X3ZtX3N0cnVjdChzdHJ1Y3QgbW1fc3RydWN0ICptbSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCiB7Ci0Jc3RydWN0IHZtX2FyZWFfc3RydWN0ICogX192bWEsICogcHJldjsKLQlzdHJ1Y3QgcmJfbm9kZSAqKiByYl9saW5rLCAqIHJiX3BhcmVudDsKKwlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKl9fdm1hLCAqcHJldjsKKwlzdHJ1Y3QgcmJfbm9kZSAqKnJiX2xpbmssICpyYl9wYXJlbnQ7CiAKIAlfX3ZtYSA9IGZpbmRfdm1hX3ByZXBhcmUobW0sIHZtYS0+dm1fc3RhcnQsJnByZXYsICZyYl9saW5rLCAmcmJfcGFyZW50KTsKIAlCVUdfT04oX192bWEgJiYgX192bWEtPnZtX3N0YXJ0IDwgdm1hLT52bV9lbmQpOwpAQCAtOTA4LDcgKzkwNyw3IEBACiAgKiBUaGUgY2FsbGVyIG11c3QgaG9sZCBkb3duX3dyaXRlKGN1cnJlbnQtPm1tLT5tbWFwX3NlbSkuCiAgKi8KIAotdW5zaWduZWQgbG9uZyBkb19tbWFwX3Bnb2ZmKHN0cnVjdCBmaWxlICogZmlsZSwgdW5zaWduZWQgbG9uZyBhZGRyLAordW5zaWduZWQgbG9uZyBkb19tbWFwX3Bnb2ZmKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBsb25nIGFkZHIsCiAJCQl1bnNpZ25lZCBsb25nIGxlbiwgdW5zaWduZWQgbG9uZyBwcm90LAogCQkJdW5zaWduZWQgbG9uZyBmbGFncywgdW5zaWduZWQgbG9uZyBwZ29mZikKIHsKQEAgLTE0NjQsNyArMTQ2Myw3IEBACiBFWFBPUlRfU1lNQk9MKGdldF91bm1hcHBlZF9hcmVhKTsKIAogLyogTG9vayB1cCB0aGUgZmlyc3QgVk1BIHdoaWNoIHNhdGlzZmllcyAgYWRkciA8IHZtX2VuZCwgIE5VTEwgaWYgbm9uZS4gKi8KLXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqIGZpbmRfdm1hKHN0cnVjdCBtbV9zdHJ1Y3QgKiBtbSwgdW5zaWduZWQgbG9uZyBhZGRyKQorc3RydWN0IHZtX2FyZWFfc3RydWN0ICpmaW5kX3ZtYShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyKQogewogCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hID0gTlVMTDsKIApAQCAtMTUwNyw3ICsxNTA2LDcgQEAKIAkJCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqKnBwcmV2KQogewogCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hID0gTlVMTCwgKnByZXYgPSBOVUxMOwotCXN0cnVjdCByYl9ub2RlICogcmJfbm9kZTsKKwlzdHJ1Y3QgcmJfbm9kZSAqcmJfbm9kZTsKIAlpZiAoIW1tKQogCQlnb3RvIG91dDsKIApAQCAtMTU0MSw3ICsxNTQwLDcgQEAKICAqIHVwZGF0ZSBhY2NvdW50aW5nLiBUaGlzIGlzIHNoYXJlZCB3aXRoIGJvdGggdGhlCiAgKiBncm93LXVwIGFuZCBncm93LWRvd24gY2FzZXMuCiAgKi8KLXN0YXRpYyBpbnQgYWNjdF9zdGFja19ncm93dGgoc3RydWN0IHZtX2FyZWFfc3RydWN0ICogdm1hLCB1bnNpZ25lZCBsb25nIHNpemUsIHVuc2lnbmVkIGxvbmcgZ3JvdykKK3N0YXRpYyBpbnQgYWNjdF9zdGFja19ncm93dGgoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQgbG9uZyBncm93KQogewogCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gdm1hLT52bV9tbTsKIAlzdHJ1Y3QgcmxpbWl0ICpybGltID0gY3VycmVudC0+c2lnbmFsLT5ybGltOwpAQCAtMjA5MSw2ICsyMDkwLDkgQEAKIAlhcmNoX2V4aXRfbW1hcChtbSk7CiAJbW11X25vdGlmaWVyX3JlbGVhc2UobW0pOwogCisJaWYgKCFtbS0+bW1hcCkJLyogQ2FuIGhhcHBlbiBpZiBkdXBfbW1hcCgpIHJlY2VpdmVkIGFuIE9PTSAqLworCQlyZXR1cm47CisKIAlpZiAobW0tPmxvY2tlZF92bSkgewogCQl2bWEgPSBtbS0+bW1hcDsKIAkJd2hpbGUgKHZtYSkgewpAQCAtMjEwMyw3ICsyMTA1LDcgQEAKIAlscnVfYWRkX2RyYWluKCk7CiAJZmx1c2hfY2FjaGVfbW0obW0pOwogCXRsYiA9IHRsYl9nYXRoZXJfbW11KG1tLCAxKTsKLQkvKiBEb24ndCB1cGRhdGVfaGl3YXRlcl9yc3MobW0pIGhlcmUsIGRvX2V4aXQgYWxyZWFkeSBkaWQgKi8KKwkvKiB1cGRhdGVfaGl3YXRlcl9yc3MobW0pIGhlcmU/IGJ1dCBub2JvZHkgc2hvdWxkIGJlIGxvb2tpbmcgKi8KIAkvKiBVc2UgLTEgaGVyZSB0byBlbnN1cmUgYWxsIFZNQXMgaW4gdGhlIG1tIGFyZSB1bm1hcHBlZCAqLwogCWVuZCA9IHVubWFwX3ZtYXMoJnRsYiwgdm1hLCAwLCAtMSwgJm5yX2FjY291bnRlZCwgTlVMTCk7CiAJdm1fdW5hY2N0X21lbW9yeShucl9hY2NvdW50ZWQpOwpkaWZmIC0tZ2l0IGEvbW0vbXByb3RlY3QuYyBiL21tL21wcm90ZWN0LmMKaW5kZXggZmRlZDA2Zi4uZDBmNmU3YyAxMDA2NDQKLS0tIGEvbW0vbXByb3RlY3QuYworKysgYi9tbS9tcHJvdGVjdC5jCkBAIC00LDcgKzQsNyBAQAogICogIChDKSBDb3B5cmlnaHQgMTk5NCBMaW51cyBUb3J2YWxkcwogICogIChDKSBDb3B5cmlnaHQgMjAwMiBDaHJpc3RvcGggSGVsbHdpZwogICoKLSAqICBBZGRyZXNzIHNwYWNlIGFjY291bnRpbmcgY29kZQk8YWxhbkByZWRoYXQuY29tPgorICogIEFkZHJlc3Mgc3BhY2UgYWNjb3VudGluZyBjb2RlCTxhbGFuQGx4b3JndWsudWt1dS5vcmcudWs+CiAgKiAgKEMpIENvcHlyaWdodCAyMDAyIFJlZCBIYXQgSW5jLCBBbGwgUmlnaHRzIFJlc2VydmVkCiAgKi8KIApAQCAtMjIsNiArMjIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3N3YXAuaD4KICNpbmNsdWRlIDxsaW51eC9zd2Fwb3BzLmg+CiAjaW5jbHVkZSA8bGludXgvbW11X25vdGlmaWVyLmg+CisjaW5jbHVkZSA8bGludXgvbWlncmF0ZS5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KICNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgpAQCAtNTksOCArNjAsNyBAQAogCQkJCXB0ZW50ID0gcHRlX21rd3JpdGUocHRlbnQpOwogCiAJCQlwdGVwX21vZGlmeV9wcm90X2NvbW1pdChtbSwgYWRkciwgcHRlLCBwdGVudCk7Ci0jaWZkZWYgQ09ORklHX01JR1JBVElPTgotCQl9IGVsc2UgaWYgKCFwdGVfZmlsZShvbGRwdGUpKSB7CisJCX0gZWxzZSBpZiAoUEFHRV9NSUdSQVRJT04gJiYgIXB0ZV9maWxlKG9sZHB0ZSkpIHsKIAkJCXN3cF9lbnRyeV90IGVudHJ5ID0gcHRlX3RvX3N3cF9lbnRyeShvbGRwdGUpOwogCiAJCQlpZiAoaXNfd3JpdGVfbWlncmF0aW9uX2VudHJ5KGVudHJ5KSkgewpAQCAtNzIsOSArNzIsNyBAQAogCQkJCXNldF9wdGVfYXQobW0sIGFkZHIsIHB0ZSwKIAkJCQkJc3dwX2VudHJ5X3RvX3B0ZShlbnRyeSkpOwogCQkJfQotI2VuZGlmCiAJCX0KLQogCX0gd2hpbGUgKHB0ZSsrLCBhZGRyICs9IFBBR0VfU0laRSwgYWRkciAhPSBlbmQpOwogCWFyY2hfbGVhdmVfbGF6eV9tbXVfbW9kZSgpOwogCXB0ZV91bm1hcF91bmxvY2socHRlIC0gMSwgcHRsKTsKZGlmZiAtLWdpdCBhL21tL21yZW1hcC5jIGIvbW0vbXJlbWFwLmMKaW5kZXggNThhMjkwOC4uNjQ2ZGU5NSAxMDA2NDQKLS0tIGEvbW0vbXJlbWFwLmMKKysrIGIvbW0vbXJlbWFwLmMKQEAgLTMsNyArMyw3IEBACiAgKgogICoJKEMpIENvcHlyaWdodCAxOTk2IExpbnVzIFRvcnZhbGRzCiAgKgotICoJQWRkcmVzcyBzcGFjZSBhY2NvdW50aW5nIGNvZGUJPGFsYW5AcmVkaGF0LmNvbT4KKyAqCUFkZHJlc3Mgc3BhY2UgYWNjb3VudGluZyBjb2RlCTxhbGFuQGx4b3JndWsudWt1dS5vcmcudWs+CiAgKgkoQykgQ29weXJpZ2h0IDIwMDIgUmVkIEhhdCBJbmMsIEFsbCBSaWdodHMgUmVzZXJ2ZWQKICAqLwogCmRpZmYgLS1naXQgYS9tbS9tc3luYy5jIGIvbW0vbXN5bmMuYwppbmRleCAxNDRhNzU3Li4wN2RhZTA4IDEwMDY0NAotLS0gYS9tbS9tc3luYy5jCisrKyBiL21tL21zeW5jLmMKQEAgLTgyLDcgKzgyLDcgQEAKIAkJCQkodm1hLT52bV9mbGFncyAmIFZNX1NIQVJFRCkpIHsKIAkJCWdldF9maWxlKGZpbGUpOwogCQkJdXBfcmVhZCgmbW0tPm1tYXBfc2VtKTsKLQkJCWVycm9yID0gZG9fZnN5bmMoZmlsZSwgMCk7CisJCQllcnJvciA9IHZmc19mc3luYyhmaWxlLCBmaWxlLT5mX3BhdGguZGVudHJ5LCAwKTsKIAkJCWZwdXQoZmlsZSk7CiAJCQlpZiAoZXJyb3IgfHwgc3RhcnQgPj0gZW5kKQogCQkJCWdvdG8gb3V0OwpkaWZmIC0tZ2l0IGEvbW0vbm9tbXUuYyBiL21tL25vbW11LmMKaW5kZXggNzY5NWRjOC4uMWMyOGVhMyAxMDA2NDQKLS0tIGEvbW0vbm9tbXUuYworKysgYi9tbS9ub21tdS5jCkBAIC04Niw3ICs4Niw3IEBACiAJaV9zaXplX3dyaXRlKGlub2RlLCBvZmZzZXQpOwogCiBvdXRfdHJ1bmNhdGU6Ci0JaWYgKGlub2RlLT5pX29wICYmIGlub2RlLT5pX29wLT50cnVuY2F0ZSkKKwlpZiAoaW5vZGUtPmlfb3AtPnRydW5jYXRlKQogCQlpbm9kZS0+aV9vcC0+dHJ1bmNhdGUoaW5vZGUpOwogCXJldHVybiAwOwogb3V0X3NpZzoKZGlmZiAtLWdpdCBhL21tL29vbV9raWxsLmMgYi9tbS9vb21fa2lsbC5jCmluZGV4IDU1OGY5YWYuLjQwYmEwNTAgMTAwNjQ0Ci0tLSBhL21tL29vbV9raWxsLmMKKysrIGIvbW0vb29tX2tpbGwuYwpAQCAtMzEsNyArMzEsNyBAQAogaW50IHN5c2N0bF9wYW5pY19vbl9vb207CiBpbnQgc3lzY3RsX29vbV9raWxsX2FsbG9jYXRpbmdfdGFzazsKIGludCBzeXNjdGxfb29tX2R1bXBfdGFza3M7Ci1zdGF0aWMgREVGSU5FX1NQSU5MT0NLKHpvbmVfc2Nhbl9tdXRleCk7CitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHpvbmVfc2Nhbl9sb2NrKTsKIC8qICNkZWZpbmUgREVCVUcgKi8KIAogLyoqCkBAIC0zOTIsNiArMzkyLDkgQEAKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXMgaW52b2tlZCBvb20ta2lsbGVyOiAiCiAJCQkiZ2ZwX21hc2s9MHgleCwgb3JkZXI9JWQsIG9vbWtpbGxhZGo9JWRcbiIsCiAJCQljdXJyZW50LT5jb21tLCBnZnBfbWFzaywgb3JkZXIsIGN1cnJlbnQtPm9vbWtpbGxhZGopOworCQl0YXNrX2xvY2soY3VycmVudCk7CisJCWNwdXNldF9wcmludF90YXNrX21lbXNfYWxsb3dlZChjdXJyZW50KTsKKwkJdGFza191bmxvY2soY3VycmVudCk7CiAJCWR1bXBfc3RhY2soKTsKIAkJc2hvd19tZW0oKTsKIAkJaWYgKHN5c2N0bF9vb21fZHVtcF90YXNrcykKQEAgLTQyNiw3ICs0MjksNiBAQAogCXVuc2lnbmVkIGxvbmcgcG9pbnRzID0gMDsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnA7CiAKLQljZ3JvdXBfbG9jaygpOwogCXJlYWRfbG9jaygmdGFza2xpc3RfbG9jayk7CiByZXRyeToKIAlwID0gc2VsZWN0X2JhZF9wcm9jZXNzKCZwb2ludHMsIG1lbSk7CkBAIC00NDEsNyArNDQzLDYgQEAKIAkJZ290byByZXRyeTsKIG91dDoKIAlyZWFkX3VubG9jaygmdGFza2xpc3RfbG9jayk7Ci0JY2dyb3VwX3VubG9jaygpOwogfQogI2VuZGlmCiAKQEAgLTQ3MCw3ICs0NzEsNyBAQAogCXN0cnVjdCB6b25lICp6b25lOwogCWludCByZXQgPSAxOwogCi0Jc3Bpbl9sb2NrKCZ6b25lX3NjYW5fbXV0ZXgpOworCXNwaW5fbG9jaygmem9uZV9zY2FuX2xvY2spOwogCWZvcl9lYWNoX3pvbmVfem9uZWxpc3Qoem9uZSwgeiwgem9uZWxpc3QsIGdmcF96b25lKGdmcF9tYXNrKSkgewogCQlpZiAoem9uZV9pc19vb21fbG9ja2VkKHpvbmUpKSB7CiAJCQlyZXQgPSAwOwpAQCAtNDgwLDcgKzQ4MSw3IEBACiAKIAlmb3JfZWFjaF96b25lX3pvbmVsaXN0KHpvbmUsIHosIHpvbmVsaXN0LCBnZnBfem9uZShnZnBfbWFzaykpIHsKIAkJLyoKLQkJICogTG9jayBlYWNoIHpvbmUgaW4gdGhlIHpvbmVsaXN0IHVuZGVyIHpvbmVfc2Nhbl9tdXRleCBzbyBhCisJCSAqIExvY2sgZWFjaCB6b25lIGluIHRoZSB6b25lbGlzdCB1bmRlciB6b25lX3NjYW5fbG9jayBzbyBhCiAJCSAqIHBhcmFsbGVsIGludm9jYXRpb24gb2YgdHJ5X3NldF96b25lX29vbSgpIGRvZXNuJ3Qgc3VjY2VlZAogCQkgKiB3aGVuIGl0IHNob3VsZG4ndC4KIAkJICovCkBAIC00ODgsNyArNDg5LDcgQEAKIAl9CiAKIG91dDoKLQlzcGluX3VubG9jaygmem9uZV9zY2FuX211dGV4KTsKKwlzcGluX3VubG9jaygmem9uZV9zY2FuX2xvY2spOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTUwMiwxMSArNTAzLDgyIEBACiAJc3RydWN0IHpvbmVyZWYgKno7CiAJc3RydWN0IHpvbmUgKnpvbmU7CiAKLQlzcGluX2xvY2soJnpvbmVfc2Nhbl9tdXRleCk7CisJc3Bpbl9sb2NrKCZ6b25lX3NjYW5fbG9jayk7CiAJZm9yX2VhY2hfem9uZV96b25lbGlzdCh6b25lLCB6LCB6b25lbGlzdCwgZ2ZwX3pvbmUoZ2ZwX21hc2spKSB7CiAJCXpvbmVfY2xlYXJfZmxhZyh6b25lLCBaT05FX09PTV9MT0NLRUQpOwogCX0KLQlzcGluX3VubG9jaygmem9uZV9zY2FuX211dGV4KTsKKwlzcGluX3VubG9jaygmem9uZV9zY2FuX2xvY2spOworfQorCisvKgorICogTXVzdCBiZSBjYWxsZWQgd2l0aCB0YXNrbGlzdF9sb2NrIGhlbGQgZm9yIHJlYWQuCisgKi8KK3N0YXRpYyB2b2lkIF9fb3V0X29mX21lbW9yeShnZnBfdCBnZnBfbWFzaywgaW50IG9yZGVyKQoreworCWlmIChzeXNjdGxfb29tX2tpbGxfYWxsb2NhdGluZ190YXNrKSB7CisJCW9vbV9raWxsX3Byb2Nlc3MoY3VycmVudCwgZ2ZwX21hc2ssIG9yZGVyLCAwLCBOVUxMLAorCQkJCSJPdXQgb2YgbWVtb3J5IChvb21fa2lsbF9hbGxvY2F0aW5nX3Rhc2spIik7CisKKwl9IGVsc2UgeworCQl1bnNpZ25lZCBsb25nIHBvaW50czsKKwkJc3RydWN0IHRhc2tfc3RydWN0ICpwOworCityZXRyeToKKwkJLyoKKwkJICogUmFtYm8gbW9kZTogU2hvb3QgZG93biBhIHByb2Nlc3MgYW5kIGhvcGUgaXQgc29sdmVzIHdoYXRldmVyCisJCSAqIGlzc3VlcyB3ZSBtYXkgaGF2ZS4KKwkJICovCisJCXAgPSBzZWxlY3RfYmFkX3Byb2Nlc3MoJnBvaW50cywgTlVMTCk7CisKKwkJaWYgKFBUUl9FUlIocCkgPT0gLTFVTCkKKwkJCXJldHVybjsKKworCQkvKiBGb3VuZCBub3RoaW5nPyE/ISBFaXRoZXIgd2UgaGFuZyBmb3JldmVyLCBvciB3ZSBwYW5pYy4gKi8KKwkJaWYgKCFwKSB7CisJCQlyZWFkX3VubG9jaygmdGFza2xpc3RfbG9jayk7CisJCQlwYW5pYygiT3V0IG9mIG1lbW9yeSBhbmQgbm8ga2lsbGFibGUgcHJvY2Vzc2VzLi4uXG4iKTsKKwkJfQorCisJCWlmIChvb21fa2lsbF9wcm9jZXNzKHAsIGdmcF9tYXNrLCBvcmRlciwgcG9pbnRzLCBOVUxMLAorCQkJCSAgICAgIk91dCBvZiBtZW1vcnkiKSkKKwkJCWdvdG8gcmV0cnk7CisJfQorfQorCisvKgorICogcGFnZWZhdWx0IGhhbmRsZXIgY2FsbHMgaW50byBoZXJlIGJlY2F1c2UgaXQgaXMgb3V0IG9mIG1lbW9yeSBidXQKKyAqIGRvZXNuJ3Qga25vdyBleGFjdGx5IGhvdyBvciB3aHkuCisgKi8KK3ZvaWQgcGFnZWZhdWx0X291dF9vZl9tZW1vcnkodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZyZWVkID0gMDsKKworCWJsb2NraW5nX25vdGlmaWVyX2NhbGxfY2hhaW4oJm9vbV9ub3RpZnlfbGlzdCwgMCwgJmZyZWVkKTsKKwlpZiAoZnJlZWQgPiAwKQorCQkvKiBHb3Qgc29tZSBtZW1vcnkgYmFjayBpbiB0aGUgbGFzdCBzZWNvbmQuICovCisJCXJldHVybjsKKworCS8qCisJICogSWYgdGhpcyBpcyBmcm9tIG1lbWNnLCBvb20ta2lsbGVyIGlzIGFscmVhZHkgaW52b2tlZC4KKwkgKiBhbmQgbm90IHdvcnRoIHRvIGdvIHN5c3RlbS13aWRlLW9vbS4KKwkgKi8KKwlpZiAobWVtX2Nncm91cF9vb21fY2FsbGVkKGN1cnJlbnQpKQorCQlnb3RvIHJlc3RfYW5kX3JldHVybjsKKworCWlmIChzeXNjdGxfcGFuaWNfb25fb29tKQorCQlwYW5pYygib3V0IG9mIG1lbW9yeSBmcm9tIHBhZ2UgZmF1bHQuIHBhbmljX29uX29vbSBpcyBzZWxlY3RlZC5cbiIpOworCisJcmVhZF9sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKKwlfX291dF9vZl9tZW1vcnkoMCwgMCk7IC8qIHVua25vd24gZ2ZwX21hc2sgYW5kIG9yZGVyICovCisJcmVhZF91bmxvY2soJnRhc2tsaXN0X2xvY2spOworCisJLyoKKwkgKiBHaXZlICJwIiBhIGdvb2QgY2hhbmNlIG9mIGtpbGxpbmcgaXRzZWxmIGJlZm9yZSB3ZQorCSAqIHJldHJ5IHRvIGFsbG9jYXRlIG1lbW9yeS4KKwkgKi8KK3Jlc3RfYW5kX3JldHVybjoKKwlpZiAoIXRlc3RfdGhyZWFkX2ZsYWcoVElGX01FTURJRSkpCisJCXNjaGVkdWxlX3RpbWVvdXRfdW5pbnRlcnJ1cHRpYmxlKDEpOwogfQogCiAvKioKQEAgLTUyMiw4ICs1OTQsNiBAQAogICovCiB2b2lkIG91dF9vZl9tZW1vcnkoc3RydWN0IHpvbmVsaXN0ICp6b25lbGlzdCwgZ2ZwX3QgZ2ZwX21hc2ssIGludCBvcmRlcikKIHsKLQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnA7Ci0JdW5zaWduZWQgbG9uZyBwb2ludHMgPSAwOwogCXVuc2lnbmVkIGxvbmcgZnJlZWQgPSAwOwogCWVudW0gb29tX2NvbnN0cmFpbnQgY29uc3RyYWludDsKIApAQCAtNTQ0LDcgKzYxNCw3IEBACiAKIAlzd2l0Y2ggKGNvbnN0cmFpbnQpIHsKIAljYXNlIENPTlNUUkFJTlRfTUVNT1JZX1BPTElDWToKLQkJb29tX2tpbGxfcHJvY2VzcyhjdXJyZW50LCBnZnBfbWFzaywgb3JkZXIsIHBvaW50cywgTlVMTCwKKwkJb29tX2tpbGxfcHJvY2VzcyhjdXJyZW50LCBnZnBfbWFzaywgb3JkZXIsIDAsIE5VTEwsCiAJCQkJIk5vIGF2YWlsYWJsZSBtZW1vcnkgKE1QT0xfQklORCkiKTsKIAkJYnJlYWs7CiAKQEAgLTU1MywzNSArNjIzLDEwIEBACiAJCQlwYW5pYygib3V0IG9mIG1lbW9yeS4gcGFuaWNfb25fb29tIGlzIHNlbGVjdGVkXG4iKTsKIAkJLyogRmFsbC10aHJvdWdoICovCiAJY2FzZSBDT05TVFJBSU5UX0NQVVNFVDoKLQkJaWYgKHN5c2N0bF9vb21fa2lsbF9hbGxvY2F0aW5nX3Rhc2spIHsKLQkJCW9vbV9raWxsX3Byb2Nlc3MoY3VycmVudCwgZ2ZwX21hc2ssIG9yZGVyLCBwb2ludHMsIE5VTEwsCi0JCQkJCSJPdXQgb2YgbWVtb3J5IChvb21fa2lsbF9hbGxvY2F0aW5nX3Rhc2spIik7Ci0JCQlicmVhazsKLQkJfQotcmV0cnk6Ci0JCS8qCi0JCSAqIFJhbWJvIG1vZGU6IFNob290IGRvd24gYSBwcm9jZXNzIGFuZCBob3BlIGl0IHNvbHZlcyB3aGF0ZXZlcgotCQkgKiBpc3N1ZXMgd2UgbWF5IGhhdmUuCi0JCSAqLwotCQlwID0gc2VsZWN0X2JhZF9wcm9jZXNzKCZwb2ludHMsIE5VTEwpOwotCi0JCWlmIChQVFJfRVJSKHApID09IC0xVUwpCi0JCQlnb3RvIG91dDsKLQotCQkvKiBGb3VuZCBub3RoaW5nPyE/ISBFaXRoZXIgd2UgaGFuZyBmb3JldmVyLCBvciB3ZSBwYW5pYy4gKi8KLQkJaWYgKCFwKSB7Ci0JCQlyZWFkX3VubG9jaygmdGFza2xpc3RfbG9jayk7Ci0JCQlwYW5pYygiT3V0IG9mIG1lbW9yeSBhbmQgbm8ga2lsbGFibGUgcHJvY2Vzc2VzLi4uXG4iKTsKLQkJfQotCi0JCWlmIChvb21fa2lsbF9wcm9jZXNzKHAsIGdmcF9tYXNrLCBvcmRlciwgcG9pbnRzLCBOVUxMLAotCQkJCSAgICAgIk91dCBvZiBtZW1vcnkiKSkKLQkJCWdvdG8gcmV0cnk7Ci0KKwkJX19vdXRfb2ZfbWVtb3J5KGdmcF9tYXNrLCBvcmRlcik7CiAJCWJyZWFrOwogCX0KIAotb3V0OgogCXJlYWRfdW5sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKIAogCS8qCmRpZmYgLS1naXQgYS9tbS9wYWdlLXdyaXRlYmFjay5jIGIvbW0vcGFnZS13cml0ZWJhY2suYwppbmRleCAyOTcwZTM1Li5iNDkzZGI3IDEwMDY0NAotLS0gYS9tbS9wYWdlLXdyaXRlYmFjay5jCisrKyBiL21tL3BhZ2Utd3JpdGViYWNrLmMKQEAgLTY5LDYgKzY5LDEyIEBACiBpbnQgZGlydHlfYmFja2dyb3VuZF9yYXRpbyA9IDU7CiAKIC8qCisgKiBkaXJ0eV9iYWNrZ3JvdW5kX2J5dGVzIHN0YXJ0cyBhdCAwIChkaXNhYmxlZCkgc28gdGhhdCBpdCBpcyBhIGZ1bmN0aW9uIG9mCisgKiBkaXJ0eV9iYWNrZ3JvdW5kX3JhdGlvICogdGhlIGFtb3VudCBvZiBkaXJ0eWFibGUgbWVtb3J5CisgKi8KK3Vuc2lnbmVkIGxvbmcgZGlydHlfYmFja2dyb3VuZF9ieXRlczsKKworLyoKICAqIGZyZWUgaGlnaG1lbSB3aWxsIG5vdCBiZSBzdWJ0cmFjdGVkIGZyb20gdGhlIHRvdGFsIGZyZWUgbWVtb3J5CiAgKiBmb3IgY2FsY3VsYXRpbmcgZnJlZSByYXRpb3MgaWYgdm1faGlnaG1lbV9pc19kaXJ0eWFibGUgaXMgdHJ1ZQogICovCkBAIC04MCw2ICs4NiwxMiBAQAogaW50IHZtX2RpcnR5X3JhdGlvID0gMTA7CiAKIC8qCisgKiB2bV9kaXJ0eV9ieXRlcyBzdGFydHMgYXQgMCAoZGlzYWJsZWQpIHNvIHRoYXQgaXQgaXMgYSBmdW5jdGlvbiBvZgorICogdm1fZGlydHlfcmF0aW8gKiB0aGUgYW1vdW50IG9mIGRpcnR5YWJsZSBtZW1vcnkKKyAqLwordW5zaWduZWQgbG9uZyB2bV9kaXJ0eV9ieXRlczsKKworLyoKICAqIFRoZSBpbnRlcnZhbCBiZXR3ZWVuIGBrdXBkYXRlJy1zdHlsZSB3cml0ZWJhY2tzLCBpbiBqaWZmaWVzCiAgKi8KIGludCBkaXJ0eV93cml0ZWJhY2tfaW50ZXJ2YWwgPSA1ICogSFo7CkBAIC0xMzUsMjMgKzE0Nyw3NSBAQAogewogCXVuc2lnbmVkIGxvbmcgZGlydHlfdG90YWw7CiAKLQlkaXJ0eV90b3RhbCA9ICh2bV9kaXJ0eV9yYXRpbyAqIGRldGVybWluZV9kaXJ0eWFibGVfbWVtb3J5KCkpIC8gMTAwOworCWlmICh2bV9kaXJ0eV9ieXRlcykKKwkJZGlydHlfdG90YWwgPSB2bV9kaXJ0eV9ieXRlcyAvIFBBR0VfU0laRTsKKwllbHNlCisJCWRpcnR5X3RvdGFsID0gKHZtX2RpcnR5X3JhdGlvICogZGV0ZXJtaW5lX2RpcnR5YWJsZV9tZW1vcnkoKSkgLworCQkJCTEwMDsKIAlyZXR1cm4gMiArIGlsb2cyKGRpcnR5X3RvdGFsIC0gMSk7CiB9CiAKIC8qCi0gKiB1cGRhdGUgdGhlIHBlcmlvZCB3aGVuIHRoZSBkaXJ0eSByYXRpbyBjaGFuZ2VzLgorICogdXBkYXRlIHRoZSBwZXJpb2Qgd2hlbiB0aGUgZGlydHkgdGhyZXNob2xkIGNoYW5nZXMuCiAgKi8KK3N0YXRpYyB2b2lkIHVwZGF0ZV9jb21wbGV0aW9uX3BlcmlvZCh2b2lkKQoreworCWludCBzaGlmdCA9IGNhbGNfcGVyaW9kX3NoaWZ0KCk7CisJcHJvcF9jaGFuZ2Vfc2hpZnQoJnZtX2NvbXBsZXRpb25zLCBzaGlmdCk7CisJcHJvcF9jaGFuZ2Vfc2hpZnQoJnZtX2RpcnRpZXMsIHNoaWZ0KTsKK30KKworaW50IGRpcnR5X2JhY2tncm91bmRfcmF0aW9faGFuZGxlcihzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLAorCQlzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90ICpsZW5wLAorCQlsb2ZmX3QgKnBwb3MpCit7CisJaW50IHJldDsKKworCXJldCA9IHByb2NfZG9pbnR2ZWNfbWlubWF4KHRhYmxlLCB3cml0ZSwgZmlscCwgYnVmZmVyLCBsZW5wLCBwcG9zKTsKKwlpZiAocmV0ID09IDAgJiYgd3JpdGUpCisJCWRpcnR5X2JhY2tncm91bmRfYnl0ZXMgPSAwOworCXJldHVybiByZXQ7Cit9CisKK2ludCBkaXJ0eV9iYWNrZ3JvdW5kX2J5dGVzX2hhbmRsZXIoc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSwKKwkJc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqbGVucCwKKwkJbG9mZl90ICpwcG9zKQoreworCWludCByZXQ7CisKKwlyZXQgPSBwcm9jX2RvdWxvbmd2ZWNfbWlubWF4KHRhYmxlLCB3cml0ZSwgZmlscCwgYnVmZmVyLCBsZW5wLCBwcG9zKTsKKwlpZiAocmV0ID09IDAgJiYgd3JpdGUpCisJCWRpcnR5X2JhY2tncm91bmRfcmF0aW8gPSAwOworCXJldHVybiByZXQ7Cit9CisKIGludCBkaXJ0eV9yYXRpb19oYW5kbGVyKHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsCiAJCXN0cnVjdCBmaWxlICpmaWxwLCB2b2lkIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgKmxlbnAsCiAJCWxvZmZfdCAqcHBvcykKIHsKIAlpbnQgb2xkX3JhdGlvID0gdm1fZGlydHlfcmF0aW87Ci0JaW50IHJldCA9IHByb2NfZG9pbnR2ZWNfbWlubWF4KHRhYmxlLCB3cml0ZSwgZmlscCwgYnVmZmVyLCBsZW5wLCBwcG9zKTsKKwlpbnQgcmV0OworCisJcmV0ID0gcHJvY19kb2ludHZlY19taW5tYXgodGFibGUsIHdyaXRlLCBmaWxwLCBidWZmZXIsIGxlbnAsIHBwb3MpOwogCWlmIChyZXQgPT0gMCAmJiB3cml0ZSAmJiB2bV9kaXJ0eV9yYXRpbyAhPSBvbGRfcmF0aW8pIHsKLQkJaW50IHNoaWZ0ID0gY2FsY19wZXJpb2Rfc2hpZnQoKTsKLQkJcHJvcF9jaGFuZ2Vfc2hpZnQoJnZtX2NvbXBsZXRpb25zLCBzaGlmdCk7Ci0JCXByb3BfY2hhbmdlX3NoaWZ0KCZ2bV9kaXJ0aWVzLCBzaGlmdCk7CisJCXVwZGF0ZV9jb21wbGV0aW9uX3BlcmlvZCgpOworCQl2bV9kaXJ0eV9ieXRlcyA9IDA7CisJfQorCXJldHVybiByZXQ7Cit9CisKKworaW50IGRpcnR5X2J5dGVzX2hhbmRsZXIoc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSwKKwkJc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqbGVucCwKKwkJbG9mZl90ICpwcG9zKQoreworCWludCBvbGRfYnl0ZXMgPSB2bV9kaXJ0eV9ieXRlczsKKwlpbnQgcmV0OworCisJcmV0ID0gcHJvY19kb3Vsb25ndmVjX21pbm1heCh0YWJsZSwgd3JpdGUsIGZpbHAsIGJ1ZmZlciwgbGVucCwgcHBvcyk7CisJaWYgKHJldCA9PSAwICYmIHdyaXRlICYmIHZtX2RpcnR5X2J5dGVzICE9IG9sZF9ieXRlcykgeworCQl1cGRhdGVfY29tcGxldGlvbl9wZXJpb2QoKTsKKwkJdm1fZGlydHlfcmF0aW8gPSAwOwogCX0KIAlyZXR1cm4gcmV0OwogfQpAQCAtMzYyLDI2ICs0MjYsMzIgQEAKIH0KIAogdm9pZAotZ2V0X2RpcnR5X2xpbWl0cyhsb25nICpwYmFja2dyb3VuZCwgbG9uZyAqcGRpcnR5LCBsb25nICpwYmRpX2RpcnR5LAotCQkgc3RydWN0IGJhY2tpbmdfZGV2X2luZm8gKmJkaSkKK2dldF9kaXJ0eV9saW1pdHModW5zaWduZWQgbG9uZyAqcGJhY2tncm91bmQsIHVuc2lnbmVkIGxvbmcgKnBkaXJ0eSwKKwkJIHVuc2lnbmVkIGxvbmcgKnBiZGlfZGlydHksIHN0cnVjdCBiYWNraW5nX2Rldl9pbmZvICpiZGkpCiB7Ci0JaW50IGJhY2tncm91bmRfcmF0aW87CQkvKiBQZXJjZW50YWdlcyAqLwotCWludCBkaXJ0eV9yYXRpbzsKLQlsb25nIGJhY2tncm91bmQ7Ci0JbG9uZyBkaXJ0eTsKKwl1bnNpZ25lZCBsb25nIGJhY2tncm91bmQ7CisJdW5zaWduZWQgbG9uZyBkaXJ0eTsKIAl1bnNpZ25lZCBsb25nIGF2YWlsYWJsZV9tZW1vcnkgPSBkZXRlcm1pbmVfZGlydHlhYmxlX21lbW9yeSgpOwogCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrOwogCi0JZGlydHlfcmF0aW8gPSB2bV9kaXJ0eV9yYXRpbzsKLQlpZiAoZGlydHlfcmF0aW8gPCA1KQotCQlkaXJ0eV9yYXRpbyA9IDU7CisJaWYgKHZtX2RpcnR5X2J5dGVzKQorCQlkaXJ0eSA9IERJVl9ST1VORF9VUCh2bV9kaXJ0eV9ieXRlcywgUEFHRV9TSVpFKTsKKwllbHNlIHsKKwkJaW50IGRpcnR5X3JhdGlvOwogCi0JYmFja2dyb3VuZF9yYXRpbyA9IGRpcnR5X2JhY2tncm91bmRfcmF0aW87Ci0JaWYgKGJhY2tncm91bmRfcmF0aW8gPj0gZGlydHlfcmF0aW8pCi0JCWJhY2tncm91bmRfcmF0aW8gPSBkaXJ0eV9yYXRpbyAvIDI7CisJCWRpcnR5X3JhdGlvID0gdm1fZGlydHlfcmF0aW87CisJCWlmIChkaXJ0eV9yYXRpbyA8IDUpCisJCQlkaXJ0eV9yYXRpbyA9IDU7CisJCWRpcnR5ID0gKGRpcnR5X3JhdGlvICogYXZhaWxhYmxlX21lbW9yeSkgLyAxMDA7CisJfQogCi0JYmFja2dyb3VuZCA9IChiYWNrZ3JvdW5kX3JhdGlvICogYXZhaWxhYmxlX21lbW9yeSkgLyAxMDA7Ci0JZGlydHkgPSAoZGlydHlfcmF0aW8gKiBhdmFpbGFibGVfbWVtb3J5KSAvIDEwMDsKKwlpZiAoZGlydHlfYmFja2dyb3VuZF9ieXRlcykKKwkJYmFja2dyb3VuZCA9IERJVl9ST1VORF9VUChkaXJ0eV9iYWNrZ3JvdW5kX2J5dGVzLCBQQUdFX1NJWkUpOworCWVsc2UKKwkJYmFja2dyb3VuZCA9IChkaXJ0eV9iYWNrZ3JvdW5kX3JhdGlvICogYXZhaWxhYmxlX21lbW9yeSkgLyAxMDA7CisKKwlpZiAoYmFja2dyb3VuZCA+PSBkaXJ0eSkKKwkJYmFja2dyb3VuZCA9IGRpcnR5IC8gMjsKIAl0c2sgPSBjdXJyZW50OwogCWlmICh0c2stPmZsYWdzICYgUEZfTEVTU19USFJPVFRMRSB8fCBydF90YXNrKHRzaykpIHsKIAkJYmFja2dyb3VuZCArPSBiYWNrZ3JvdW5kIC8gNDsKQEAgLTQyMyw5ICs0OTMsOSBAQAogewogCWxvbmcgbnJfcmVjbGFpbWFibGUsIGJkaV9ucl9yZWNsYWltYWJsZTsKIAlsb25nIG5yX3dyaXRlYmFjaywgYmRpX25yX3dyaXRlYmFjazsKLQlsb25nIGJhY2tncm91bmRfdGhyZXNoOwotCWxvbmcgZGlydHlfdGhyZXNoOwotCWxvbmcgYmRpX3RocmVzaDsKKwl1bnNpZ25lZCBsb25nIGJhY2tncm91bmRfdGhyZXNoOworCXVuc2lnbmVkIGxvbmcgZGlydHlfdGhyZXNoOworCXVuc2lnbmVkIGxvbmcgYmRpX3RocmVzaDsKIAl1bnNpZ25lZCBsb25nIHBhZ2VzX3dyaXR0ZW4gPSAwOwogCXVuc2lnbmVkIGxvbmcgd3JpdGVfY2h1bmsgPSBzeW5jX3dyaXRlYmFja19wYWdlcygpOwogCkBAIC01ODAsOCArNjUwLDggQEAKIAogdm9pZCB0aHJvdHRsZV92bV93cml0ZW91dChnZnBfdCBnZnBfbWFzaykKIHsKLQlsb25nIGJhY2tncm91bmRfdGhyZXNoOwotCWxvbmcgZGlydHlfdGhyZXNoOworCXVuc2lnbmVkIGxvbmcgYmFja2dyb3VuZF90aHJlc2g7CisJdW5zaWduZWQgbG9uZyBkaXJ0eV90aHJlc2g7CiAKICAgICAgICAgZm9yICggOyA7ICkgewogCQlnZXRfZGlydHlfbGltaXRzKCZiYWNrZ3JvdW5kX3RocmVzaCwgJmRpcnR5X3RocmVzaCwgTlVMTCwgTlVMTCk7CkBAIC02MjQsOCArNjk0LDggQEAKIAl9OwogCiAJZm9yICggOyA7ICkgewotCQlsb25nIGJhY2tncm91bmRfdGhyZXNoOwotCQlsb25nIGRpcnR5X3RocmVzaDsKKwkJdW5zaWduZWQgbG9uZyBiYWNrZ3JvdW5kX3RocmVzaDsKKwkJdW5zaWduZWQgbG9uZyBkaXJ0eV90aHJlc2g7CiAKIAkJZ2V0X2RpcnR5X2xpbWl0cygmYmFja2dyb3VuZF90aHJlc2gsICZkaXJ0eV90aHJlc2gsIE5VTEwsIE5VTEwpOwogCQlpZiAoZ2xvYmFsX3BhZ2Vfc3RhdGUoTlJfRklMRV9ESVJUWSkgKwpAQCAtODY4LDkgKzkzOCwxMSBAQAogCWludCBkb25lID0gMDsKIAlzdHJ1Y3QgcGFnZXZlYyBwdmVjOwogCWludCBucl9wYWdlczsKKwlwZ29mZl90IHVuaW5pdGlhbGl6ZWRfdmFyKHdyaXRlYmFja19pbmRleCk7CiAJcGdvZmZfdCBpbmRleDsKIAlwZ29mZl90IGVuZDsJCS8qIEluY2x1c2l2ZSAqLwotCWludCBzY2FubmVkID0gMDsKKwlwZ29mZl90IGRvbmVfaW5kZXg7CisJaW50IGN5Y2xlZDsKIAlpbnQgcmFuZ2Vfd2hvbGUgPSAwOwogCWxvbmcgbnJfdG9fd3JpdGUgPSB3YmMtPm5yX3RvX3dyaXRlOwogCkBAIC04ODEsODMgKzk1MywxMzQgQEAKIAogCXBhZ2V2ZWNfaW5pdCgmcHZlYywgMCk7CiAJaWYgKHdiYy0+cmFuZ2VfY3ljbGljKSB7Ci0JCWluZGV4ID0gbWFwcGluZy0+d3JpdGViYWNrX2luZGV4OyAvKiBTdGFydCBmcm9tIHByZXYgb2Zmc2V0ICovCisJCXdyaXRlYmFja19pbmRleCA9IG1hcHBpbmctPndyaXRlYmFja19pbmRleDsgLyogcHJldiBvZmZzZXQgKi8KKwkJaW5kZXggPSB3cml0ZWJhY2tfaW5kZXg7CisJCWlmIChpbmRleCA9PSAwKQorCQkJY3ljbGVkID0gMTsKKwkJZWxzZQorCQkJY3ljbGVkID0gMDsKIAkJZW5kID0gLTE7CiAJfSBlbHNlIHsKIAkJaW5kZXggPSB3YmMtPnJhbmdlX3N0YXJ0ID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CiAJCWVuZCA9IHdiYy0+cmFuZ2VfZW5kID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CiAJCWlmICh3YmMtPnJhbmdlX3N0YXJ0ID09IDAgJiYgd2JjLT5yYW5nZV9lbmQgPT0gTExPTkdfTUFYKQogCQkJcmFuZ2Vfd2hvbGUgPSAxOwotCQlzY2FubmVkID0gMTsKKwkJY3ljbGVkID0gMTsgLyogaWdub3JlIHJhbmdlX2N5Y2xpYyB0ZXN0cyAqLwogCX0KIHJldHJ5OgotCXdoaWxlICghZG9uZSAmJiAoaW5kZXggPD0gZW5kKSAmJgotCSAgICAgICAobnJfcGFnZXMgPSBwYWdldmVjX2xvb2t1cF90YWcoJnB2ZWMsIG1hcHBpbmcsICZpbmRleCwKLQkJCQkJICAgICAgUEFHRUNBQ0hFX1RBR19ESVJUWSwKLQkJCQkJICAgICAgbWluKGVuZCAtIGluZGV4LCAocGdvZmZfdClQQUdFVkVDX1NJWkUtMSkgKyAxKSkpIHsKLQkJdW5zaWduZWQgaTsKKwlkb25lX2luZGV4ID0gaW5kZXg7CisJd2hpbGUgKCFkb25lICYmIChpbmRleCA8PSBlbmQpKSB7CisJCWludCBpOwogCi0JCXNjYW5uZWQgPSAxOworCQlucl9wYWdlcyA9IHBhZ2V2ZWNfbG9va3VwX3RhZygmcHZlYywgbWFwcGluZywgJmluZGV4LAorCQkJICAgICAgUEFHRUNBQ0hFX1RBR19ESVJUWSwKKwkJCSAgICAgIG1pbihlbmQgLSBpbmRleCwgKHBnb2ZmX3QpUEFHRVZFQ19TSVpFLTEpICsgMSk7CisJCWlmIChucl9wYWdlcyA9PSAwKQorCQkJYnJlYWs7CisKIAkJZm9yIChpID0gMDsgaSA8IG5yX3BhZ2VzOyBpKyspIHsKIAkJCXN0cnVjdCBwYWdlICpwYWdlID0gcHZlYy5wYWdlc1tpXTsKIAogCQkJLyoKLQkJCSAqIEF0IHRoaXMgcG9pbnQgd2UgaG9sZCBuZWl0aGVyIG1hcHBpbmctPnRyZWVfbG9jayBub3IKLQkJCSAqIGxvY2sgb24gdGhlIHBhZ2UgaXRzZWxmOiB0aGUgcGFnZSBtYXkgYmUgdHJ1bmNhdGVkIG9yCi0JCQkgKiBpbnZhbGlkYXRlZCAoY2hhbmdpbmcgcGFnZS0+bWFwcGluZyB0byBOVUxMKSwgb3IgZXZlbgotCQkJICogc3dpenpsZWQgYmFjayBmcm9tIHN3YXBwZXJfc3BhY2UgdG8gdG1wZnMgZmlsZQotCQkJICogbWFwcGluZworCQkJICogQXQgdGhpcyBwb2ludCwgdGhlIHBhZ2UgbWF5IGJlIHRydW5jYXRlZCBvcgorCQkJICogaW52YWxpZGF0ZWQgKGNoYW5naW5nIHBhZ2UtPm1hcHBpbmcgdG8gTlVMTCksIG9yCisJCQkgKiBldmVuIHN3aXp6bGVkIGJhY2sgZnJvbSBzd2FwcGVyX3NwYWNlIHRvIHRtcGZzIGZpbGUKKwkJCSAqIG1hcHBpbmcuIEhvd2V2ZXIsIHBhZ2UtPmluZGV4IHdpbGwgbm90IGNoYW5nZQorCQkJICogYmVjYXVzZSB3ZSBoYXZlIGEgcmVmZXJlbmNlIG9uIHRoZSBwYWdlLgogCQkJICovCisJCQlpZiAocGFnZS0+aW5kZXggPiBlbmQpIHsKKwkJCQkvKgorCQkJCSAqIGNhbid0IGJlIHJhbmdlX2N5Y2xpYyAoMXN0IHBhc3MpIGJlY2F1c2UKKwkJCQkgKiBlbmQgPT0gLTEgaW4gdGhhdCBjYXNlLgorCQkJCSAqLworCQkJCWRvbmUgPSAxOworCQkJCWJyZWFrOworCQkJfQorCisJCQlkb25lX2luZGV4ID0gcGFnZS0+aW5kZXggKyAxOworCiAJCQlsb2NrX3BhZ2UocGFnZSk7CiAKKwkJCS8qCisJCQkgKiBQYWdlIHRydW5jYXRlZCBvciBpbnZhbGlkYXRlZC4gV2UgY2FuIGZyZWVseSBza2lwIGl0CisJCQkgKiB0aGVuLCBldmVuIGZvciBkYXRhIGludGVncml0eSBvcGVyYXRpb25zOiB0aGUgcGFnZQorCQkJICogaGFzIGRpc2FwcGVhcmVkIGNvbmN1cnJlbnRseSwgc28gdGhlcmUgY291bGQgYmUgbm8KKwkJCSAqIHJlYWwgZXhwZWN0YXRpb24gb2YgdGhpcyBkYXRhIGludGVyaXR5IG9wZXJhdGlvbgorCQkJICogZXZlbiBpZiB0aGVyZSBpcyBub3cgYSBuZXcsIGRpcnR5IHBhZ2UgYXQgdGhlIHNhbWUKKwkJCSAqIHBhZ2VjYWNoZSBhZGRyZXNzLgorCQkJICovCiAJCQlpZiAodW5saWtlbHkocGFnZS0+bWFwcGluZyAhPSBtYXBwaW5nKSkgeworY29udGludWVfdW5sb2NrOgogCQkJCXVubG9ja19wYWdlKHBhZ2UpOwogCQkJCWNvbnRpbnVlOwogCQkJfQogCi0JCQlpZiAoIXdiYy0+cmFuZ2VfY3ljbGljICYmIHBhZ2UtPmluZGV4ID4gZW5kKSB7Ci0JCQkJZG9uZSA9IDE7Ci0JCQkJdW5sb2NrX3BhZ2UocGFnZSk7Ci0JCQkJY29udGludWU7CisJCQlpZiAoIVBhZ2VEaXJ0eShwYWdlKSkgeworCQkJCS8qIHNvbWVvbmUgd3JvdGUgaXQgZm9yIHVzICovCisJCQkJZ290byBjb250aW51ZV91bmxvY2s7CiAJCQl9CiAKLQkJCWlmICh3YmMtPnN5bmNfbW9kZSAhPSBXQl9TWU5DX05PTkUpCi0JCQkJd2FpdF9vbl9wYWdlX3dyaXRlYmFjayhwYWdlKTsKLQotCQkJaWYgKFBhZ2VXcml0ZWJhY2socGFnZSkgfHwKLQkJCSAgICAhY2xlYXJfcGFnZV9kaXJ0eV9mb3JfaW8ocGFnZSkpIHsKLQkJCQl1bmxvY2tfcGFnZShwYWdlKTsKLQkJCQljb250aW51ZTsKKwkJCWlmIChQYWdlV3JpdGViYWNrKHBhZ2UpKSB7CisJCQkJaWYgKHdiYy0+c3luY19tb2RlICE9IFdCX1NZTkNfTk9ORSkKKwkJCQkJd2FpdF9vbl9wYWdlX3dyaXRlYmFjayhwYWdlKTsKKwkJCQllbHNlCisJCQkJCWdvdG8gY29udGludWVfdW5sb2NrOwogCQkJfQogCisJCQlCVUdfT04oUGFnZVdyaXRlYmFjayhwYWdlKSk7CisJCQlpZiAoIWNsZWFyX3BhZ2VfZGlydHlfZm9yX2lvKHBhZ2UpKQorCQkJCWdvdG8gY29udGludWVfdW5sb2NrOworCiAJCQlyZXQgPSAoKndyaXRlcGFnZSkocGFnZSwgd2JjLCBkYXRhKTsKKwkJCWlmICh1bmxpa2VseShyZXQpKSB7CisJCQkJaWYgKHJldCA9PSBBT1BfV1JJVEVQQUdFX0FDVElWQVRFKSB7CisJCQkJCXVubG9ja19wYWdlKHBhZ2UpOworCQkJCQlyZXQgPSAwOworCQkJCX0gZWxzZSB7CisJCQkJCS8qCisJCQkJCSAqIGRvbmVfaW5kZXggaXMgc2V0IHBhc3QgdGhpcyBwYWdlLAorCQkJCQkgKiBzbyBtZWRpYSBlcnJvcnMgd2lsbCBub3QgY2hva2UKKwkJCQkJICogYmFja2dyb3VuZCB3cml0ZW91dCBmb3IgdGhlIGVudGlyZQorCQkJCQkgKiBmaWxlLiBUaGlzIGhhcyBjb25zZXF1ZW5jZXMgZm9yCisJCQkJCSAqIHJhbmdlX2N5Y2xpYyBzZW1hbnRpY3MgKGllLiBpdCBtYXkKKwkJCQkJICogbm90IGJlIHN1aXRhYmxlIGZvciBkYXRhIGludGVncml0eQorCQkJCQkgKiB3cml0ZW91dCkuCisJCQkJCSAqLworCQkJCQlkb25lID0gMTsKKwkJCQkJYnJlYWs7CisJCQkJfQorIAkJCX0KIAotCQkJaWYgKHVubGlrZWx5KHJldCA9PSBBT1BfV1JJVEVQQUdFX0FDVElWQVRFKSkgewotCQkJCXVubG9ja19wYWdlKHBhZ2UpOwotCQkJCXJldCA9IDA7CisJCQlpZiAod2JjLT5zeW5jX21vZGUgPT0gV0JfU1lOQ19OT05FKSB7CisJCQkJd2JjLT5ucl90b193cml0ZS0tOworCQkJCWlmICh3YmMtPm5yX3RvX3dyaXRlIDw9IDApIHsKKwkJCQkJZG9uZSA9IDE7CisJCQkJCWJyZWFrOworCQkJCX0KIAkJCX0KLQkJCWlmIChyZXQgfHwgKC0tbnJfdG9fd3JpdGUgPD0gMCkpCi0JCQkJZG9uZSA9IDE7CiAJCQlpZiAod2JjLT5ub25ibG9ja2luZyAmJiBiZGlfd3JpdGVfY29uZ2VzdGVkKGJkaSkpIHsKIAkJCQl3YmMtPmVuY291bnRlcmVkX2Nvbmdlc3Rpb24gPSAxOwogCQkJCWRvbmUgPSAxOworCQkJCWJyZWFrOwogCQkJfQogCQl9CiAJCXBhZ2V2ZWNfcmVsZWFzZSgmcHZlYyk7CiAJCWNvbmRfcmVzY2hlZCgpOwogCX0KLQlpZiAoIXNjYW5uZWQgJiYgIWRvbmUpIHsKKwlpZiAoIWN5Y2xlZCkgewogCQkvKgorCQkgKiByYW5nZV9jeWNsaWM6CiAJCSAqIFdlIGhpdCB0aGUgbGFzdCBwYWdlIGFuZCB0aGVyZSBpcyBtb3JlIHdvcmsgdG8gYmUgZG9uZTogd3JhcAogCQkgKiBiYWNrIHRvIHRoZSBzdGFydCBvZiB0aGUgZmlsZQogCQkgKi8KLQkJc2Nhbm5lZCA9IDE7CisJCWN5Y2xlZCA9IDE7CiAJCWluZGV4ID0gMDsKKwkJZW5kID0gd3JpdGViYWNrX2luZGV4IC0gMTsKIAkJZ290byByZXRyeTsKIAl9CiAJaWYgKCF3YmMtPm5vX25yd3JpdGVfaW5kZXhfdXBkYXRlKSB7CiAJCWlmICh3YmMtPnJhbmdlX2N5Y2xpYyB8fCAocmFuZ2Vfd2hvbGUgJiYgbnJfdG9fd3JpdGUgPiAwKSkKLQkJCW1hcHBpbmctPndyaXRlYmFja19pbmRleCA9IGluZGV4OworCQkJbWFwcGluZy0+d3JpdGViYWNrX2luZGV4ID0gZG9uZV9pbmRleDsKIAkJd2JjLT5ucl90b193cml0ZSA9IG5yX3RvX3dyaXRlOwogCX0KIApkaWZmIC0tZ2l0IGEvbW0vcGFnZV9hbGxvYy5jIGIvbW0vcGFnZV9hbGxvYy5jCmluZGV4IGQ4YWMwMTQuLjU2NzViMzAgMTAwNjQ0Ci0tLSBhL21tL3BhZ2VfYWxsb2MuYworKysgYi9tbS9wYWdlX2FsbG9jLmMKQEAgLTY5LDcgKzY5LDcgQEAKIAogdW5zaWduZWQgbG9uZyB0b3RhbHJhbV9wYWdlcyBfX3JlYWRfbW9zdGx5OwogdW5zaWduZWQgbG9uZyB0b3RhbHJlc2VydmVfcGFnZXMgX19yZWFkX21vc3RseTsKLWxvbmcgbnJfc3dhcF9wYWdlczsKK3Vuc2lnbmVkIGxvbmcgaGlnaGVzdF9tZW1tYXBfcGZuIF9fcmVhZF9tb3N0bHk7CiBpbnQgcGVyY3B1X3BhZ2VsaXN0X2ZyYWN0aW9uOwogCiAjaWZkZWYgQ09ORklHX0hVR0VUTEJfUEFHRV9TSVpFX1ZBUklBQkxFCkBAIC0yMjMsMTkgKzIyMyw0MSBAQAogCiBzdGF0aWMgdm9pZCBiYWRfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSkKIHsKLQlwcmludGsoS0VSTl9FTUVSRyAiQmFkIHBhZ2Ugc3RhdGUgaW4gcHJvY2VzcyAnJXMnXG4iIEtFUk5fRU1FUkcKLQkJInBhZ2U6JXAgZmxhZ3M6MHglMCpseCBtYXBwaW5nOiVwIG1hcGNvdW50OiVkIGNvdW50OiVkXG4iLAotCQljdXJyZW50LT5jb21tLCBwYWdlLCAoaW50KSgyKnNpemVvZih1bnNpZ25lZCBsb25nKSksCi0JCSh1bnNpZ25lZCBsb25nKXBhZ2UtPmZsYWdzLCBwYWdlLT5tYXBwaW5nLAotCQlwYWdlX21hcGNvdW50KHBhZ2UpLCBwYWdlX2NvdW50KHBhZ2UpKTsKKwlzdGF0aWMgdW5zaWduZWQgbG9uZyByZXN1bWU7CisJc3RhdGljIHVuc2lnbmVkIGxvbmcgbnJfc2hvd247CisJc3RhdGljIHVuc2lnbmVkIGxvbmcgbnJfdW5zaG93bjsKIAotCXByaW50ayhLRVJOX0VNRVJHICJUcnlpbmcgdG8gZml4IGl0IHVwLCBidXQgYSByZWJvb3QgaXMgbmVlZGVkXG4iCi0JCUtFUk5fRU1FUkcgIkJhY2t0cmFjZTpcbiIpOworCS8qCisJICogQWxsb3cgYSBidXJzdCBvZiA2MCByZXBvcnRzLCB0aGVuIGtlZXAgcXVpZXQgZm9yIHRoYXQgbWludXRlOworCSAqIG9yIGFsbG93IGEgc3RlYWR5IGRyaXAgb2Ygb25lIHJlcG9ydCBwZXIgc2Vjb25kLgorCSAqLworCWlmIChucl9zaG93biA9PSA2MCkgeworCQlpZiAodGltZV9iZWZvcmUoamlmZmllcywgcmVzdW1lKSkgeworCQkJbnJfdW5zaG93bisrOworCQkJZ290byBvdXQ7CisJCX0KKwkJaWYgKG5yX3Vuc2hvd24pIHsKKwkJCXByaW50ayhLRVJOX0FMRVJUCisJCQkgICAgICAiQlVHOiBCYWQgcGFnZSBzdGF0ZTogJWx1IG1lc3NhZ2VzIHN1cHByZXNzZWRcbiIsCisJCQkJbnJfdW5zaG93bik7CisJCQlucl91bnNob3duID0gMDsKKwkJfQorCQlucl9zaG93biA9IDA7CisJfQorCWlmIChucl9zaG93bisrID09IDApCisJCXJlc3VtZSA9IGppZmZpZXMgKyA2MCAqIEhaOworCisJcHJpbnRrKEtFUk5fQUxFUlQgIkJVRzogQmFkIHBhZ2Ugc3RhdGUgaW4gcHJvY2VzcyAlcyAgcGZuOiUwNWx4XG4iLAorCQljdXJyZW50LT5jb21tLCBwYWdlX3RvX3BmbihwYWdlKSk7CisJcHJpbnRrKEtFUk5fQUxFUlQKKwkJInBhZ2U6JXAgZmxhZ3M6JXAgY291bnQ6JWQgbWFwY291bnQ6JWQgbWFwcGluZzolcCBpbmRleDolbHhcbiIsCisJCXBhZ2UsICh2b2lkICopcGFnZS0+ZmxhZ3MsIHBhZ2VfY291bnQocGFnZSksCisJCXBhZ2VfbWFwY291bnQocGFnZSksIHBhZ2UtPm1hcHBpbmcsIHBhZ2UtPmluZGV4KTsKKwogCWR1bXBfc3RhY2soKTsKLQlwYWdlLT5mbGFncyAmPSB+UEFHRV9GTEFHU19DTEVBUl9XSEVOX0JBRDsKLQlzZXRfcGFnZV9jb3VudChwYWdlLCAwKTsKLQlyZXNldF9wYWdlX21hcGNvdW50KHBhZ2UpOwotCXBhZ2UtPm1hcHBpbmcgPSBOVUxMOworb3V0OgorCS8qIExlYXZlIGJhZCBmaWVsZHMgZm9yIGRlYnVnLCBleGNlcHQgUGFnZUJ1ZGR5IGNvdWxkIG1ha2UgdHJvdWJsZSAqLworCV9fQ2xlYXJQYWdlQnVkZHkocGFnZSk7CiAJYWRkX3RhaW50KFRBSU5UX0JBRF9QQUdFKTsKIH0KIApAQCAtMjkyLDI1ICszMTQsMzEgQEAKIH0KICNlbmRpZgogCi1zdGF0aWMgdm9pZCBkZXN0cm95X2NvbXBvdW5kX3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsIHVuc2lnbmVkIGxvbmcgb3JkZXIpCitzdGF0aWMgaW50IGRlc3Ryb3lfY29tcG91bmRfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgbG9uZyBvcmRlcikKIHsKIAlpbnQgaTsKIAlpbnQgbnJfcGFnZXMgPSAxIDw8IG9yZGVyOworCWludCBiYWQgPSAwOwogCi0JaWYgKHVubGlrZWx5KGNvbXBvdW5kX29yZGVyKHBhZ2UpICE9IG9yZGVyKSkKKwlpZiAodW5saWtlbHkoY29tcG91bmRfb3JkZXIocGFnZSkgIT0gb3JkZXIpIHx8CisJICAgIHVubGlrZWx5KCFQYWdlSGVhZChwYWdlKSkpIHsKIAkJYmFkX3BhZ2UocGFnZSk7CisJCWJhZCsrOworCX0KIAotCWlmICh1bmxpa2VseSghUGFnZUhlYWQocGFnZSkpKQotCQkJYmFkX3BhZ2UocGFnZSk7CiAJX19DbGVhclBhZ2VIZWFkKHBhZ2UpOworCiAJZm9yIChpID0gMTsgaSA8IG5yX3BhZ2VzOyBpKyspIHsKIAkJc3RydWN0IHBhZ2UgKnAgPSBwYWdlICsgaTsKIAotCQlpZiAodW5saWtlbHkoIVBhZ2VUYWlsKHApIHwKLQkJCQkocC0+Zmlyc3RfcGFnZSAhPSBwYWdlKSkpCisJCWlmICh1bmxpa2VseSghUGFnZVRhaWwocCkgfCAocC0+Zmlyc3RfcGFnZSAhPSBwYWdlKSkpIHsKIAkJCWJhZF9wYWdlKHBhZ2UpOworCQkJYmFkKys7CisJCX0KIAkJX19DbGVhclBhZ2VUYWlsKHApOwogCX0KKworCXJldHVybiBiYWQ7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBwcmVwX3plcm9fcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSwgaW50IG9yZGVyLCBnZnBfdCBnZnBfZmxhZ3MpCkBAIC00MzAsNyArNDU4LDggQEAKIAlpbnQgbWlncmF0ZXR5cGUgPSBnZXRfcGFnZWJsb2NrX21pZ3JhdGV0eXBlKHBhZ2UpOwogCiAJaWYgKHVubGlrZWx5KFBhZ2VDb21wb3VuZChwYWdlKSkpCi0JCWRlc3Ryb3lfY29tcG91bmRfcGFnZShwYWdlLCBvcmRlcik7CisJCWlmICh1bmxpa2VseShkZXN0cm95X2NvbXBvdW5kX3BhZ2UocGFnZSwgb3JkZXIpKSkKKwkJCXJldHVybjsKIAogCXBhZ2VfaWR4ID0gcGFnZV90b19wZm4ocGFnZSkgJiAoKDEgPDwgTUFYX09SREVSKSAtIDEpOwogCkBAIC00NjcsMTggKzQ5NiwxMyBAQAogCWlmICh1bmxpa2VseShwYWdlX21hcGNvdW50KHBhZ2UpIHwKIAkJKHBhZ2UtPm1hcHBpbmcgIT0gTlVMTCkgIHwKIAkJKHBhZ2VfY291bnQocGFnZSkgIT0gMCkgIHwKLQkJKHBhZ2UtPmZsYWdzICYgUEFHRV9GTEFHU19DSEVDS19BVF9GUkVFKSkpCisJCShwYWdlLT5mbGFncyAmIFBBR0VfRkxBR1NfQ0hFQ0tfQVRfRlJFRSkpKSB7CiAJCWJhZF9wYWdlKHBhZ2UpOwotCWlmIChQYWdlRGlydHkocGFnZSkpCi0JCV9fQ2xlYXJQYWdlRGlydHkocGFnZSk7Ci0JaWYgKFBhZ2VTd2FwQmFja2VkKHBhZ2UpKQotCQlfX0NsZWFyUGFnZVN3YXBCYWNrZWQocGFnZSk7Ci0JLyoKLQkgKiBGb3Igbm93LCB3ZSByZXBvcnQgaWYgUEdfcmVzZXJ2ZWQgd2FzIGZvdW5kIHNldCwgYnV0IGRvIG5vdAotCSAqIGNsZWFyIGl0LCBhbmQgZG8gbm90IGZyZWUgdGhlIHBhZ2UuICBCdXQgd2Ugc2hhbGwgc29vbiBuZWVkCi0JICogdG8gZG8gbW9yZSwgZm9yIHdoZW4gdGhlIFpFUk9fUEFHRSBjb3VudCB3cmFwcyBuZWdhdGl2ZS4KLQkgKi8KLQlyZXR1cm4gUGFnZVJlc2VydmVkKHBhZ2UpOworCQlyZXR1cm4gMTsKKwl9CisJaWYgKHBhZ2UtPmZsYWdzICYgUEFHRV9GTEFHU19DSEVDS19BVF9QUkVQKQorCQlwYWdlLT5mbGFncyAmPSB+UEFHRV9GTEFHU19DSEVDS19BVF9QUkVQOworCXJldHVybiAwOwogfQogCiAvKgpAQCAtNTIzLDExICs1NDcsMTEgQEAKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBpOwotCWludCByZXNlcnZlZCA9IDA7CisJaW50IGJhZCA9IDA7CiAKIAlmb3IgKGkgPSAwIDsgaSA8ICgxIDw8IG9yZGVyKSA7ICsraSkKLQkJcmVzZXJ2ZWQgKz0gZnJlZV9wYWdlc19jaGVjayhwYWdlICsgaSk7Ci0JaWYgKHJlc2VydmVkKQorCQliYWQgKz0gZnJlZV9wYWdlc19jaGVjayhwYWdlICsgaSk7CisJaWYgKGJhZCkKIAkJcmV0dXJuOwogCiAJaWYgKCFQYWdlSGlnaE1lbShwYWdlKSkgewpAQCAtNjEyLDIzICs2MzYsMTEgQEAKIAlpZiAodW5saWtlbHkocGFnZV9tYXBjb3VudChwYWdlKSB8CiAJCShwYWdlLT5tYXBwaW5nICE9IE5VTEwpICB8CiAJCShwYWdlX2NvdW50KHBhZ2UpICE9IDApICB8Ci0JCShwYWdlLT5mbGFncyAmIFBBR0VfRkxBR1NfQ0hFQ0tfQVRfUFJFUCkpKQorCQkocGFnZS0+ZmxhZ3MgJiBQQUdFX0ZMQUdTX0NIRUNLX0FUX1BSRVApKSkgewogCQliYWRfcGFnZShwYWdlKTsKLQotCS8qCi0JICogRm9yIG5vdywgd2UgcmVwb3J0IGlmIFBHX3Jlc2VydmVkIHdhcyBmb3VuZCBzZXQsIGJ1dCBkbyBub3QKLQkgKiBjbGVhciBpdCwgYW5kIGRvIG5vdCBhbGxvY2F0ZSB0aGUgcGFnZTogYXMgYSBzYWZldHkgbmV0LgotCSAqLwotCWlmIChQYWdlUmVzZXJ2ZWQocGFnZSkpCiAJCXJldHVybiAxOworCX0KIAotCXBhZ2UtPmZsYWdzICY9IH4oMSA8PCBQR191cHRvZGF0ZSB8IDEgPDwgUEdfZXJyb3IgfCAxIDw8IFBHX3JlY2xhaW0gfAotCQkJMSA8PCBQR19yZWZlcmVuY2VkIHwgMSA8PCBQR19hcmNoXzEgfAotCQkJMSA8PCBQR19vd25lcl9wcml2XzEgfCAxIDw8IFBHX21hcHBlZHRvZGlzawotI2lmZGVmIENPTkZJR19VTkVWSUNUQUJMRV9MUlUKLQkJCXwgMSA8PCBQR19tbG9ja2VkCi0jZW5kaWYKLQkJCSk7CiAJc2V0X3BhZ2VfcHJpdmF0ZShwYWdlLCAwKTsKIAlzZXRfcGFnZV9yZWZjb3VudGVkKHBhZ2UpOwogCkBAIC0yNjA5LDYgKzI2MjEsOSBAQAogCXVuc2lnbmVkIGxvbmcgcGZuOwogCXN0cnVjdCB6b25lICp6OwogCisJaWYgKGhpZ2hlc3RfbWVtbWFwX3BmbiA8IGVuZF9wZm4gLSAxKQorCQloaWdoZXN0X21lbW1hcF9wZm4gPSBlbmRfcGZuIC0gMTsKKwogCXogPSAmTk9ERV9EQVRBKG5pZCktPm5vZGVfem9uZXNbem9uZV07CiAJZm9yIChwZm4gPSBzdGFydF9wZm47IHBmbiA8IGVuZF9wZm47IHBmbisrKSB7CiAJCS8qCkBAIC0zMzgxLDEwICszMzk2LDggQEAKIHsKIAl1bnNpZ25lZCBsb25nIHVzZW1hcHNpemUgPSB1c2VtYXBfc2l6ZSh6b25lc2l6ZSk7CiAJem9uZS0+cGFnZWJsb2NrX2ZsYWdzID0gTlVMTDsKLQlpZiAodXNlbWFwc2l6ZSkgeworCWlmICh1c2VtYXBzaXplKQogCQl6b25lLT5wYWdlYmxvY2tfZmxhZ3MgPSBhbGxvY19ib290bWVtX25vZGUocGdkYXQsIHVzZW1hcHNpemUpOwotCQltZW1zZXQoem9uZS0+cGFnZWJsb2NrX2ZsYWdzLCAwLCB1c2VtYXBzaXplKTsKLQl9CiB9CiAjZWxzZQogc3RhdGljIHZvaWQgaW5saW5lIHNldHVwX3VzZW1hcChzdHJ1Y3QgcGdsaXN0X2RhdGEgKnBnZGF0LApAQCAtMzQ2OSw5ICszNDgyLDEwIEBACiAJCQlQQUdFX0FMSUdOKHNpemUgKiBzaXplb2Yoc3RydWN0IHBhZ2UpKSA+PiBQQUdFX1NISUZUOwogCQlpZiAocmVhbHNpemUgPj0gbWVtbWFwX3BhZ2VzKSB7CiAJCQlyZWFsc2l6ZSAtPSBtZW1tYXBfcGFnZXM7Ci0JCQlwcmludGsoS0VSTl9ERUJVRwotCQkJCSIgICVzIHpvbmU6ICVsdSBwYWdlcyB1c2VkIGZvciBtZW1tYXBcbiIsCi0JCQkJem9uZV9uYW1lc1tqXSwgbWVtbWFwX3BhZ2VzKTsKKwkJCWlmIChtZW1tYXBfcGFnZXMpCisJCQkJcHJpbnRrKEtFUk5fREVCVUcKKwkJCQkgICAgICAgIiAgJXMgem9uZTogJWx1IHBhZ2VzIHVzZWQgZm9yIG1lbW1hcFxuIiwKKwkJCQkgICAgICAgem9uZV9uYW1lc1tqXSwgbWVtbWFwX3BhZ2VzKTsKIAkJfSBlbHNlCiAJCQlwcmludGsoS0VSTl9XQVJOSU5HCiAJCQkJIiAgJXMgem9uZTogJWx1IHBhZ2VzIGV4Y2VlZHMgcmVhbHNpemUgJWx1XG4iLApAQCAtMzUwOSwxMCArMzUyMywxMCBAQAogCQkJSU5JVF9MSVNUX0hFQUQoJnpvbmUtPmxydVtsXS5saXN0KTsKIAkJCXpvbmUtPmxydVtsXS5ucl9zY2FuID0gMDsKIAkJfQotCQl6b25lLT5yZWNlbnRfcm90YXRlZFswXSA9IDA7Ci0JCXpvbmUtPnJlY2VudF9yb3RhdGVkWzFdID0gMDsKLQkJem9uZS0+cmVjZW50X3NjYW5uZWRbMF0gPSAwOwotCQl6b25lLT5yZWNlbnRfc2Nhbm5lZFsxXSA9IDA7CisJCXpvbmUtPnJlY2xhaW1fc3RhdC5yZWNlbnRfcm90YXRlZFswXSA9IDA7CisJCXpvbmUtPnJlY2xhaW1fc3RhdC5yZWNlbnRfcm90YXRlZFsxXSA9IDA7CisJCXpvbmUtPnJlY2xhaW1fc3RhdC5yZWNlbnRfc2Nhbm5lZFswXSA9IDA7CisJCXpvbmUtPnJlY2xhaW1fc3RhdC5yZWNlbnRfc2Nhbm5lZFsxXSA9IDA7CiAJCXphcF96b25lX3ZtX3N0YXRzKHpvbmUpOwogCQl6b25lLT5mbGFncyA9IDA7CiAJCWlmICghc2l6ZSkKQEAgLTQzMTYsNyArNDMzMCw3IEBACiAgKiAgICAxVEIgICAgIDEwMSAgICAgICAgMTBHQgogICogICAxMFRCICAgICAzMjAgICAgICAgIDMyR0IKICAqLwotdm9pZCBzZXR1cF9wZXJfem9uZV9pbmFjdGl2ZV9yYXRpbyh2b2lkKQorc3RhdGljIHZvaWQgc2V0dXBfcGVyX3pvbmVfaW5hY3RpdmVfcmF0aW8odm9pZCkKIHsKIAlzdHJ1Y3Qgem9uZSAqem9uZTsKIApAQCAtNDU3MywxOSArNDU4Nyw2IEBACiAJcmV0dXJuIHRhYmxlOwogfQogCi0jaWZkZWYgQ09ORklHX09VVF9PRl9MSU5FX1BGTl9UT19QQUdFCi1zdHJ1Y3QgcGFnZSAqcGZuX3RvX3BhZ2UodW5zaWduZWQgbG9uZyBwZm4pCi17Ci0JcmV0dXJuIF9fcGZuX3RvX3BhZ2UocGZuKTsKLX0KLXVuc2lnbmVkIGxvbmcgcGFnZV90b19wZm4oc3RydWN0IHBhZ2UgKnBhZ2UpCi17Ci0JcmV0dXJuIF9fcGFnZV90b19wZm4ocGFnZSk7Ci19Ci1FWFBPUlRfU1lNQk9MKHBmbl90b19wYWdlKTsKLUVYUE9SVF9TWU1CT0wocGFnZV90b19wZm4pOwotI2VuZGlmIC8qIENPTkZJR19PVVRfT0ZfTElORV9QRk5fVE9fUEFHRSAqLwotCiAvKiBSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBiaXRtYXAgc3RvcmluZyBiaXRzIGFmZmVjdGluZyBhIGJsb2NrIG9mIHBhZ2VzICovCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgKmdldF9wYWdlYmxvY2tfYml0bWFwKHN0cnVjdCB6b25lICp6b25lLAogCQkJCQkJCXVuc2lnbmVkIGxvbmcgcGZuKQpkaWZmIC0tZ2l0IGEvbW0vcGFnZV9jZ3JvdXAuYyBiL21tL3BhZ2VfY2dyb3VwLmMKaW5kZXggYWIyN2ZmNy4uNzAwNmExMSAxMDA2NDQKLS0tIGEvbW0vcGFnZV9jZ3JvdXAuYworKysgYi9tbS9wYWdlX2Nncm91cC5jCkBAIC04LDYgKzgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21lbW9yeS5oPgogI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KICNpbmNsdWRlIDxsaW51eC9jZ3JvdXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zd2Fwb3BzLmg+CiAKIHN0YXRpYyB2b2lkIF9fbWVtaW5pdAogX19pbml0X3BhZ2VfY2dyb3VwKHN0cnVjdCBwYWdlX2Nncm91cCAqcGMsIHVuc2lnbmVkIGxvbmcgcGZuKQpAQCAtMTUsNiArMTYsNyBAQAogCXBjLT5mbGFncyA9IDA7CiAJcGMtPm1lbV9jZ3JvdXAgPSBOVUxMOwogCXBjLT5wYWdlID0gcGZuX3RvX3BhZ2UocGZuKTsKKwlJTklUX0xJU1RfSEVBRCgmcGMtPmxydSk7CiB9CiBzdGF0aWMgdW5zaWduZWQgbG9uZyB0b3RhbF91c2FnZTsKIApAQCAtNzIsNyArNzQsNyBAQAogCiAJaW50IG5pZCwgZmFpbDsKIAotCWlmIChtZW1fY2dyb3VwX3N1YnN5cy5kaXNhYmxlZCkKKwlpZiAobWVtX2Nncm91cF9kaXNhYmxlZCgpKQogCQlyZXR1cm47CiAKIAlmb3JfZWFjaF9vbmxpbmVfbm9kZShuaWQpICB7CkBAIC0xMDEsMTUgKzEwMywxMyBAQAogfQogCiAvKiBfX2FsbG9jX2Jvb3RtZW0uLi4oKSBpcyBwcm90ZWN0ZWQgYnkgIXNsYWJfYXZhaWxhYmxlKCkgKi8KLWludCBfX2luaXRfcmVmb2sgaW5pdF9zZWN0aW9uX3BhZ2VfY2dyb3VwKHVuc2lnbmVkIGxvbmcgcGZuKQorc3RhdGljIGludCBfX2luaXRfcmVmb2sgaW5pdF9zZWN0aW9uX3BhZ2VfY2dyb3VwKHVuc2lnbmVkIGxvbmcgcGZuKQogewotCXN0cnVjdCBtZW1fc2VjdGlvbiAqc2VjdGlvbjsKKwlzdHJ1Y3QgbWVtX3NlY3Rpb24gKnNlY3Rpb24gPSBfX3Bmbl90b19zZWN0aW9uKHBmbik7CiAJc3RydWN0IHBhZ2VfY2dyb3VwICpiYXNlLCAqcGM7CiAJdW5zaWduZWQgbG9uZyB0YWJsZV9zaXplOwogCWludCBuaWQsIGluZGV4OwogCi0Jc2VjdGlvbiA9IF9fcGZuX3RvX3NlY3Rpb24ocGZuKTsKLQogCWlmICghc2VjdGlvbi0+cGFnZV9jZ3JvdXApIHsKIAkJbmlkID0gcGFnZV90b19uaWQocGZuX3RvX3BhZ2UocGZuKSk7CiAJCXRhYmxlX3NpemUgPSBzaXplb2Yoc3RydWN0IHBhZ2VfY2dyb3VwKSAqIFBBR0VTX1BFUl9TRUNUSU9OOwpAQCAtMTQ1LDcgKzE0NSw2IEBACiAJCV9faW5pdF9wYWdlX2Nncm91cChwYywgcGZuICsgaW5kZXgpOwogCX0KIAotCXNlY3Rpb24gPSBfX3Bmbl90b19zZWN0aW9uKHBmbik7CiAJc2VjdGlvbi0+cGFnZV9jZ3JvdXAgPSBiYXNlIC0gcGZuOwogCXRvdGFsX3VzYWdlICs9IHRhYmxlX3NpemU7CiAJcmV0dXJuIDA7CkBAIC0yNDgsNyArMjQ3LDcgQEAKIAl1bnNpZ25lZCBsb25nIHBmbjsKIAlpbnQgZmFpbCA9IDA7CiAKLQlpZiAobWVtX2Nncm91cF9zdWJzeXMuZGlzYWJsZWQpCisJaWYgKG1lbV9jZ3JvdXBfZGlzYWJsZWQoKSkKIAkJcmV0dXJuOwogCiAJZm9yIChwZm4gPSAwOyAhZmFpbCAmJiBwZm4gPCBtYXhfcGZuOyBwZm4gKz0gUEFHRVNfUEVSX1NFQ1RJT04pIHsKQEAgLTI3MywzICsyNzIsMTk5IEBACiB9CiAKICNlbmRpZgorCisKKyNpZmRlZiBDT05GSUdfQ0dST1VQX01FTV9SRVNfQ1RMUl9TV0FQCisKK3N0YXRpYyBERUZJTkVfTVVURVgoc3dhcF9jZ3JvdXBfbXV0ZXgpOworc3RydWN0IHN3YXBfY2dyb3VwX2N0cmwgeworCXN0cnVjdCBwYWdlICoqbWFwOworCXVuc2lnbmVkIGxvbmcgbGVuZ3RoOworfTsKKworc3RydWN0IHN3YXBfY2dyb3VwX2N0cmwgc3dhcF9jZ3JvdXBfY3RybFtNQVhfU1dBUEZJTEVTXTsKKworLyoKKyAqIFRoaXMgOGJ5dGVzIHNlZW1zIGJpZy4ubWF5YmUgd2UgY2FuIHJlZHVjZSB0aGlzIHdoZW4gd2UgY2FuIHVzZSAiaWQiIGZvcgorICogY2dyb3VwIHJhdGhlciB0aGFuIHBvaW50ZXIuCisgKi8KK3N0cnVjdCBzd2FwX2Nncm91cCB7CisJc3RydWN0IG1lbV9jZ3JvdXAJKnZhbDsKK307CisjZGVmaW5lIFNDX1BFUl9QQUdFCShQQUdFX1NJWkUvc2l6ZW9mKHN0cnVjdCBzd2FwX2Nncm91cCkpCisjZGVmaW5lIFNDX1BPU19NQVNLCShTQ19QRVJfUEFHRSAtIDEpCisKKy8qCisgKiBTd2FwQ2dyb3VwIGltcGxlbWVudHMgImxvb2t1cCIgYW5kICJleGNoYW5nZSIgb3BlcmF0aW9ucy4KKyAqIEluIHR5cGljYWwgdXNhZ2UsIHRoaXMgc3dhcF9jZ3JvdXAgaXMgYWNjZXNzZWQgdmlhIG1lbWNnJ3MgY2hhcmdlL3VuY2hhcmdlCisgKiBhZ2FpbnN0IFN3YXBDYWNoZS4gQXQgc3dhcF9mcmVlKCksIHRoaXMgaXMgYWNjZXNzZWQgZGlyZWN0bHkgZnJvbSBzd2FwLgorICoKKyAqIFRoaXMgbWVhbnMsCisgKiAgLSB3ZSBoYXZlIG5vIHJhY2UgaW4gImV4Y2hhbmdlIiB3aGVuIHdlJ3JlIGFjY2Vzc2VkIHZpYSBTd2FwQ2FjaGUgYmVjYXVzZQorICogICAgU3dhcENhY2hlKGFuZCBpdHMgc3dwX2VudHJ5KSBpcyB1bmRlciBsb2NrLgorICogIC0gV2hlbiBjYWxsZWQgdmlhIHN3YXBfZnJlZSgpLCB0aGVyZSBpcyBubyB1c2VyIG9mIHRoaXMgZW50cnkgYW5kIG5vIHJhY2UuCisgKiBUaGVuLCB3ZSBkb24ndCBuZWVkIGxvY2sgYXJvdW5kICJleGNoYW5nZSIuCisgKgorICogVE9ETzogd2UgY2FuIHB1c2ggdGhlc2UgYnVmZmVycyBvdXQgdG8gSElHSE1FTS4KKyAqLworCisvKgorICogYWxsb2NhdGUgYnVmZmVyIGZvciBzd2FwX2Nncm91cC4KKyAqLworc3RhdGljIGludCBzd2FwX2Nncm91cF9wcmVwYXJlKGludCB0eXBlKQoreworCXN0cnVjdCBwYWdlICpwYWdlOworCXN0cnVjdCBzd2FwX2Nncm91cF9jdHJsICpjdHJsOworCXVuc2lnbmVkIGxvbmcgaWR4LCBtYXg7CisKKwlpZiAoIWRvX3N3YXBfYWNjb3VudCkKKwkJcmV0dXJuIDA7CisJY3RybCA9ICZzd2FwX2Nncm91cF9jdHJsW3R5cGVdOworCisJZm9yIChpZHggPSAwOyBpZHggPCBjdHJsLT5sZW5ndGg7IGlkeCsrKSB7CisJCXBhZ2UgPSBhbGxvY19wYWdlKEdGUF9LRVJORUwgfCBfX0dGUF9aRVJPKTsKKwkJaWYgKCFwYWdlKQorCQkJZ290byBub3RfZW5vdWdoX3BhZ2U7CisJCWN0cmwtPm1hcFtpZHhdID0gcGFnZTsKKwl9CisJcmV0dXJuIDA7Citub3RfZW5vdWdoX3BhZ2U6CisJbWF4ID0gaWR4OworCWZvciAoaWR4ID0gMDsgaWR4IDwgbWF4OyBpZHgrKykKKwkJX19mcmVlX3BhZ2UoY3RybC0+bWFwW2lkeF0pOworCisJcmV0dXJuIC1FTk9NRU07Cit9CisKKy8qKgorICogc3dhcF9jZ3JvdXBfcmVjb3JkIC0gcmVjb3JkIG1lbV9jZ3JvdXAgZm9yIHRoaXMgc3dwX2VudHJ5LgorICogQGVudDogc3dhcCBlbnRyeSB0byBiZSByZWNvcmRlZCBpbnRvCisgKiBAbWVtOiBtZW1fY2dyb3VwIHRvIGJlIHJlY29yZGVkCisgKgorICogUmV0dXJucyBvbGQgdmFsdWUgYXQgc3VjY2VzcywgTlVMTCBhdCBmYWlsdXJlLgorICogKE9mIGNvdXJzZSwgb2xkIHZhbHVlIGNhbiBiZSBOVUxMLikKKyAqLworc3RydWN0IG1lbV9jZ3JvdXAgKnN3YXBfY2dyb3VwX3JlY29yZChzd3BfZW50cnlfdCBlbnQsIHN0cnVjdCBtZW1fY2dyb3VwICptZW0pCit7CisJaW50IHR5cGUgPSBzd3BfdHlwZShlbnQpOworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0ID0gc3dwX29mZnNldChlbnQpOworCXVuc2lnbmVkIGxvbmcgaWR4ID0gb2Zmc2V0IC8gU0NfUEVSX1BBR0U7CisJdW5zaWduZWQgbG9uZyBwb3MgPSBvZmZzZXQgJiBTQ19QT1NfTUFTSzsKKwlzdHJ1Y3Qgc3dhcF9jZ3JvdXBfY3RybCAqY3RybDsKKwlzdHJ1Y3QgcGFnZSAqbWFwcGFnZTsKKwlzdHJ1Y3Qgc3dhcF9jZ3JvdXAgKnNjOworCXN0cnVjdCBtZW1fY2dyb3VwICpvbGQ7CisKKwlpZiAoIWRvX3N3YXBfYWNjb3VudCkKKwkJcmV0dXJuIE5VTEw7CisKKwljdHJsID0gJnN3YXBfY2dyb3VwX2N0cmxbdHlwZV07CisKKwltYXBwYWdlID0gY3RybC0+bWFwW2lkeF07CisJc2MgPSBwYWdlX2FkZHJlc3MobWFwcGFnZSk7CisJc2MgKz0gcG9zOworCW9sZCA9IHNjLT52YWw7CisJc2MtPnZhbCA9IG1lbTsKKworCXJldHVybiBvbGQ7Cit9CisKKy8qKgorICogbG9va3VwX3N3YXBfY2dyb3VwIC0gbG9va3VwIG1lbV9jZ3JvdXAgdGllZCB0byBzd2FwIGVudHJ5CisgKiBAZW50OiBzd2FwIGVudHJ5IHRvIGJlIGxvb2tlZCB1cC4KKyAqCisgKiBSZXR1cm5zIHBvaW50ZXIgdG8gbWVtX2Nncm91cCBhdCBzdWNjZXNzLiBOVUxMIGF0IGZhaWx1cmUuCisgKi8KK3N0cnVjdCBtZW1fY2dyb3VwICpsb29rdXBfc3dhcF9jZ3JvdXAoc3dwX2VudHJ5X3QgZW50KQoreworCWludCB0eXBlID0gc3dwX3R5cGUoZW50KTsKKwl1bnNpZ25lZCBsb25nIG9mZnNldCA9IHN3cF9vZmZzZXQoZW50KTsKKwl1bnNpZ25lZCBsb25nIGlkeCA9IG9mZnNldCAvIFNDX1BFUl9QQUdFOworCXVuc2lnbmVkIGxvbmcgcG9zID0gb2Zmc2V0ICYgU0NfUE9TX01BU0s7CisJc3RydWN0IHN3YXBfY2dyb3VwX2N0cmwgKmN0cmw7CisJc3RydWN0IHBhZ2UgKm1hcHBhZ2U7CisJc3RydWN0IHN3YXBfY2dyb3VwICpzYzsKKwlzdHJ1Y3QgbWVtX2Nncm91cCAqcmV0OworCisJaWYgKCFkb19zd2FwX2FjY291bnQpCisJCXJldHVybiBOVUxMOworCisJY3RybCA9ICZzd2FwX2Nncm91cF9jdHJsW3R5cGVdOworCW1hcHBhZ2UgPSBjdHJsLT5tYXBbaWR4XTsKKwlzYyA9IHBhZ2VfYWRkcmVzcyhtYXBwYWdlKTsKKwlzYyArPSBwb3M7CisJcmV0ID0gc2MtPnZhbDsKKwlyZXR1cm4gcmV0OworfQorCitpbnQgc3dhcF9jZ3JvdXBfc3dhcG9uKGludCB0eXBlLCB1bnNpZ25lZCBsb25nIG1heF9wYWdlcykKK3sKKwl2b2lkICphcnJheTsKKwl1bnNpZ25lZCBsb25nIGFycmF5X3NpemU7CisJdW5zaWduZWQgbG9uZyBsZW5ndGg7CisJc3RydWN0IHN3YXBfY2dyb3VwX2N0cmwgKmN0cmw7CisKKwlpZiAoIWRvX3N3YXBfYWNjb3VudCkKKwkJcmV0dXJuIDA7CisKKwlsZW5ndGggPSAoKG1heF9wYWdlcy9TQ19QRVJfUEFHRSkgKyAxKTsKKwlhcnJheV9zaXplID0gbGVuZ3RoICogc2l6ZW9mKHZvaWQgKik7CisKKwlhcnJheSA9IHZtYWxsb2MoYXJyYXlfc2l6ZSk7CisJaWYgKCFhcnJheSkKKwkJZ290byBub21lbTsKKworCW1lbXNldChhcnJheSwgMCwgYXJyYXlfc2l6ZSk7CisJY3RybCA9ICZzd2FwX2Nncm91cF9jdHJsW3R5cGVdOworCW11dGV4X2xvY2soJnN3YXBfY2dyb3VwX211dGV4KTsKKwljdHJsLT5sZW5ndGggPSBsZW5ndGg7CisJY3RybC0+bWFwID0gYXJyYXk7CisJaWYgKHN3YXBfY2dyb3VwX3ByZXBhcmUodHlwZSkpIHsKKwkJLyogbWVtb3J5IHNob3J0YWdlICovCisJCWN0cmwtPm1hcCA9IE5VTEw7CisJCWN0cmwtPmxlbmd0aCA9IDA7CisJCXZmcmVlKGFycmF5KTsKKwkJbXV0ZXhfdW5sb2NrKCZzd2FwX2Nncm91cF9tdXRleCk7CisJCWdvdG8gbm9tZW07CisJfQorCW11dGV4X3VubG9jaygmc3dhcF9jZ3JvdXBfbXV0ZXgpOworCisJcHJpbnRrKEtFUk5fSU5GTworCQkic3dhcF9jZ3JvdXA6IHVzZXMgJWxkIGJ5dGVzIG9mIHZtYWxsb2MgZm9yIHBvaW50ZXIgYXJyYXkgc3BhY2UiCisJCSIgYW5kICVsZCBieXRlcyB0byBob2xkIG1lbV9jZ3JvdXAgcG9pbnRlcnMgb24gc3dhcFxuIiwKKwkJYXJyYXlfc2l6ZSwgbGVuZ3RoICogUEFHRV9TSVpFKTsKKwlwcmludGsoS0VSTl9JTkZPCisJInN3YXBfY2dyb3VwIGNhbiBiZSBkaXNhYmxlZCBieSBub3N3YXBhY2NvdW50IGJvb3Qgb3B0aW9uLlxuIik7CisKKwlyZXR1cm4gMDsKK25vbWVtOgorCXByaW50ayhLRVJOX0lORk8gImNvdWxkbid0IGFsbG9jYXRlIGVub3VnaCBtZW1vcnkgZm9yIHN3YXBfY2dyb3VwLlxuIik7CisJcHJpbnRrKEtFUk5fSU5GTworCQkic3dhcF9jZ3JvdXAgY2FuIGJlIGRpc2FibGVkIGJ5IG5vc3dhcGFjY291bnQgYm9vdCBvcHRpb25cbiIpOworCXJldHVybiAtRU5PTUVNOworfQorCit2b2lkIHN3YXBfY2dyb3VwX3N3YXBvZmYoaW50IHR5cGUpCit7CisJaW50IGk7CisJc3RydWN0IHN3YXBfY2dyb3VwX2N0cmwgKmN0cmw7CisKKwlpZiAoIWRvX3N3YXBfYWNjb3VudCkKKwkJcmV0dXJuOworCisJbXV0ZXhfbG9jaygmc3dhcF9jZ3JvdXBfbXV0ZXgpOworCWN0cmwgPSAmc3dhcF9jZ3JvdXBfY3RybFt0eXBlXTsKKwlpZiAoY3RybC0+bWFwKSB7CisJCWZvciAoaSA9IDA7IGkgPCBjdHJsLT5sZW5ndGg7IGkrKykgeworCQkJc3RydWN0IHBhZ2UgKnBhZ2UgPSBjdHJsLT5tYXBbaV07CisJCQlpZiAocGFnZSkKKwkJCQlfX2ZyZWVfcGFnZShwYWdlKTsKKwkJfQorCQl2ZnJlZShjdHJsLT5tYXApOworCQljdHJsLT5tYXAgPSBOVUxMOworCQljdHJsLT5sZW5ndGggPSAwOworCX0KKwltdXRleF91bmxvY2soJnN3YXBfY2dyb3VwX211dGV4KTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9tbS9wYWdlX2lvLmMgYi9tbS9wYWdlX2lvLmMKaW5kZXggMDY1YzQ0OC4uZGM2Y2UwYSAxMDA2NDQKLS0tIGEvbW0vcGFnZV9pby5jCisrKyBiL21tL3BhZ2VfaW8uYwpAQCAtOTgsNyArOTgsNyBAQAogCXN0cnVjdCBiaW8gKmJpbzsKIAlpbnQgcmV0ID0gMCwgcncgPSBXUklURTsKIAotCWlmIChyZW1vdmVfZXhjbHVzaXZlX3N3YXBfcGFnZShwYWdlKSkgeworCWlmICh0cnlfdG9fZnJlZV9zd2FwKHBhZ2UpKSB7CiAJCXVubG9ja19wYWdlKHBhZ2UpOwogCQlnb3RvIG91dDsKIAl9CkBAIC0xMjUsOCArMTI1LDggQEAKIAlzdHJ1Y3QgYmlvICpiaW87CiAJaW50IHJldCA9IDA7CiAKLQlCVUdfT04oIVBhZ2VMb2NrZWQocGFnZSkpOwotCUJVR19PTihQYWdlVXB0b2RhdGUocGFnZSkpOworCVZNX0JVR19PTighUGFnZUxvY2tlZChwYWdlKSk7CisJVk1fQlVHX09OKFBhZ2VVcHRvZGF0ZShwYWdlKSk7CiAJYmlvID0gZ2V0X3N3YXBfYmlvKEdGUF9LRVJORUwsIHBhZ2VfcHJpdmF0ZShwYWdlKSwgcGFnZSwKIAkJCQllbmRfc3dhcF9iaW9fcmVhZCk7CiAJaWYgKGJpbyA9PSBOVUxMKSB7CmRpZmYgLS1naXQgYS9tbS9ybWFwLmMgYi9tbS9ybWFwLmMKaW5kZXggMTA5OTM5NC4uYWM0YWY4YyAxMDA2NDQKLS0tIGEvbW0vcm1hcC5jCisrKyBiL21tL3JtYXAuYwpAQCAtNDcsOSArNDcsOSBAQAogI2luY2x1ZGUgPGxpbnV4L3JtYXAuaD4KICNpbmNsdWRlIDxsaW51eC9yY3VwZGF0ZS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2thbGxzeW1zLmg+CiAjaW5jbHVkZSA8bGludXgvbWVtY29udHJvbC5oPgogI2luY2x1ZGUgPGxpbnV4L21tdV9ub3RpZmllci5oPgorI2luY2x1ZGUgPGxpbnV4L21pZ3JhdGUuaD4KIAogI2luY2x1ZGUgPGFzbS90bGJmbHVzaC5oPgogCkBAIC0xOTEsNyArMTkxLDcgQEAKICAqIEdldHRpbmcgYSBsb2NrIG9uIGEgc3RhYmxlIGFub25fdm1hIGZyb20gYSBwYWdlIG9mZiB0aGUgTFJVIGlzCiAgKiB0cmlja3k6IHBhZ2VfbG9ja19hbm9uX3ZtYSByZWx5IG9uIFJDVSB0byBndWFyZCBhZ2FpbnN0IHRoZSByYWNlcy4KICAqLwotc3RydWN0IGFub25fdm1hICpwYWdlX2xvY2tfYW5vbl92bWEoc3RydWN0IHBhZ2UgKnBhZ2UpCitzdGF0aWMgc3RydWN0IGFub25fdm1hICpwYWdlX2xvY2tfYW5vbl92bWEoc3RydWN0IHBhZ2UgKnBhZ2UpCiB7CiAJc3RydWN0IGFub25fdm1hICphbm9uX3ZtYTsKIAl1bnNpZ25lZCBsb25nIGFub25fbWFwcGluZzsKQEAgLTIxMSw3ICsyMTEsNyBAQAogCXJldHVybiBOVUxMOwogfQogCi12b2lkIHBhZ2VfdW5sb2NrX2Fub25fdm1hKHN0cnVjdCBhbm9uX3ZtYSAqYW5vbl92bWEpCitzdGF0aWMgdm9pZCBwYWdlX3VubG9ja19hbm9uX3ZtYShzdHJ1Y3QgYW5vbl92bWEgKmFub25fdm1hKQogewogCXNwaW5fdW5sb2NrKCZhbm9uX3ZtYS0+bG9jayk7CiAJcmN1X3JlYWRfdW5sb2NrKCk7CkBAIC0zNTksOCArMzU5LDE3IEBACiAJCWdvdG8gb3V0X3VubWFwOwogCX0KIAotCWlmIChwdGVwX2NsZWFyX2ZsdXNoX3lvdW5nX25vdGlmeSh2bWEsIGFkZHJlc3MsIHB0ZSkpCi0JCXJlZmVyZW5jZWQrKzsKKwlpZiAocHRlcF9jbGVhcl9mbHVzaF95b3VuZ19ub3RpZnkodm1hLCBhZGRyZXNzLCBwdGUpKSB7CisJCS8qCisJCSAqIERvbid0IHRyZWF0IGEgcmVmZXJlbmNlIHRocm91Z2ggYSBzZXF1ZW50aWFsbHkgcmVhZAorCQkgKiBtYXBwaW5nIGFzIHN1Y2guICBJZiB0aGUgcGFnZSBoYXMgYmVlbiB1c2VkIGluCisJCSAqIGFub3RoZXIgbWFwcGluZywgd2Ugd2lsbCBjYXRjaCBpdDsgaWYgdGhpcyBvdGhlcgorCQkgKiBtYXBwaW5nIGlzIGFscmVhZHkgZ29uZSwgdGhlIHVubWFwIHBhdGggd2lsbCBoYXZlCisJCSAqIHNldCBQR19yZWZlcmVuY2VkIG9yIGFjdGl2YXRlZCB0aGUgcGFnZS4KKwkJICovCisJCWlmIChsaWtlbHkoIVZNX1NlcXVlbnRpYWxSZWFkSGludCh2bWEpKSkKKwkJCXJlZmVyZW5jZWQrKzsKKwl9CiAKIAkvKiBQcmV0ZW5kIHRoZSBwYWdlIGlzIHJlZmVyZW5jZWQgaWYgdGhlIHRhc2sgaGFzIHRoZQogCSAgIHN3YXAgdG9rZW4gYW5kIGlzIGluIHRoZSBtaWRkbGUgb2YgYSBwYWdlIGZhdWx0LiAqLwpAQCAtNjYxLDkgKzY3MCwxNCBAQAogdm9pZCBwYWdlX2FkZF9uZXdfYW5vbl9ybWFwKHN0cnVjdCBwYWdlICpwYWdlLAogCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MpCiB7Ci0JQlVHX09OKGFkZHJlc3MgPCB2bWEtPnZtX3N0YXJ0IHx8IGFkZHJlc3MgPj0gdm1hLT52bV9lbmQpOwotCWF0b21pY19zZXQoJnBhZ2UtPl9tYXBjb3VudCwgMCk7IC8qIGVsZXZhdGUgY291bnQgYnkgMSAoc3RhcnRzIGF0IC0xKSAqLworCVZNX0JVR19PTihhZGRyZXNzIDwgdm1hLT52bV9zdGFydCB8fCBhZGRyZXNzID49IHZtYS0+dm1fZW5kKTsKKwlTZXRQYWdlU3dhcEJhY2tlZChwYWdlKTsKKwlhdG9taWNfc2V0KCZwYWdlLT5fbWFwY291bnQsIDApOyAvKiBpbmNyZW1lbnQgY291bnQgKHN0YXJ0cyBhdCAtMSkgKi8KIAlfX3BhZ2Vfc2V0X2Fub25fcm1hcChwYWdlLCB2bWEsIGFkZHJlc3MpOworCWlmIChwYWdlX2V2aWN0YWJsZShwYWdlLCB2bWEpKQorCQlscnVfY2FjaGVfYWRkX2xydShwYWdlLCBMUlVfQUNUSVZFX0FOT04pOworCWVsc2UKKwkJYWRkX3BhZ2VfdG9fdW5ldmljdGFibGVfbGlzdChwYWdlKTsKIH0KIAogLyoqCkBAIC02OTMsNyArNzA3LDYgQEAKICAqLwogdm9pZCBwYWdlX2R1cF9ybWFwKHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzKQogewotCUJVR19PTihwYWdlX21hcGNvdW50KHBhZ2UpID09IDApOwogCWlmIChQYWdlQW5vbihwYWdlKSkKIAkJX19wYWdlX2NoZWNrX2Fub25fcm1hcChwYWdlLCB2bWEsIGFkZHJlc3MpOwogCWF0b21pY19pbmMoJnBhZ2UtPl9tYXBjb3VudCk7CkBAIC03MDMsMjggKzcxNiwxMiBAQAogLyoqCiAgKiBwYWdlX3JlbW92ZV9ybWFwIC0gdGFrZSBkb3duIHB0ZSBtYXBwaW5nIGZyb20gYSBwYWdlCiAgKiBAcGFnZTogcGFnZSB0byByZW1vdmUgbWFwcGluZyBmcm9tCi0gKiBAdm1hOiB0aGUgdm0gYXJlYSBpbiB3aGljaCB0aGUgbWFwcGluZyBpcyByZW1vdmVkCiAgKgogICogVGhlIGNhbGxlciBuZWVkcyB0byBob2xkIHRoZSBwdGUgbG9jay4KICAqLwotdm9pZCBwYWdlX3JlbW92ZV9ybWFwKHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3ZvaWQgcGFnZV9yZW1vdmVfcm1hcChzdHJ1Y3QgcGFnZSAqcGFnZSkKIHsKIAlpZiAoYXRvbWljX2FkZF9uZWdhdGl2ZSgtMSwgJnBhZ2UtPl9tYXBjb3VudCkpIHsKLQkJaWYgKHVubGlrZWx5KHBhZ2VfbWFwY291bnQocGFnZSkgPCAwKSkgewotCQkJcHJpbnRrIChLRVJOX0VNRVJHICJFZWVrISBwYWdlX21hcGNvdW50KHBhZ2UpIHdlbnQgbmVnYXRpdmUhICglZClcbiIsIHBhZ2VfbWFwY291bnQocGFnZSkpOwotCQkJcHJpbnRrIChLRVJOX0VNRVJHICIgIHBhZ2UgcGZuID0gJWx4XG4iLCBwYWdlX3RvX3BmbihwYWdlKSk7Ci0JCQlwcmludGsgKEtFUk5fRU1FUkcgIiAgcGFnZS0+ZmxhZ3MgPSAlbHhcbiIsIHBhZ2UtPmZsYWdzKTsKLQkJCXByaW50ayAoS0VSTl9FTUVSRyAiICBwYWdlLT5jb3VudCA9ICV4XG4iLCBwYWdlX2NvdW50KHBhZ2UpKTsKLQkJCXByaW50ayAoS0VSTl9FTUVSRyAiICBwYWdlLT5tYXBwaW5nID0gJXBcbiIsIHBhZ2UtPm1hcHBpbmcpOwotCQkJcHJpbnRfc3ltYm9sIChLRVJOX0VNRVJHICIgIHZtYS0+dm1fb3BzID0gJXNcbiIsICh1bnNpZ25lZCBsb25nKXZtYS0+dm1fb3BzKTsKLQkJCWlmICh2bWEtPnZtX29wcykgewotCQkJCXByaW50X3N5bWJvbCAoS0VSTl9FTUVSRyAiICB2bWEtPnZtX29wcy0+ZmF1bHQgPSAlc1xuIiwgKHVuc2lnbmVkIGxvbmcpdm1hLT52bV9vcHMtPmZhdWx0KTsKLQkJCX0KLQkJCWlmICh2bWEtPnZtX2ZpbGUgJiYgdm1hLT52bV9maWxlLT5mX29wKQotCQkJCXByaW50X3N5bWJvbCAoS0VSTl9FTUVSRyAiICB2bWEtPnZtX2ZpbGUtPmZfb3AtPm1tYXAgPSAlc1xuIiwgKHVuc2lnbmVkIGxvbmcpdm1hLT52bV9maWxlLT5mX29wLT5tbWFwKTsKLQkJCUJVRygpOwotCQl9Ci0KIAkJLyoKIAkJICogTm93IHRoYXQgdGhlIGxhc3QgcHRlIGhhcyBnb25lLCBzMzkwIG11c3QgdHJhbnNmZXIgZGlydHkKIAkJICogZmxhZyBmcm9tIHN0b3JhZ2Uga2V5IHRvIHN0cnVjdCBwYWdlLiAgV2UgY2FuIHVzdWFsbHkgc2tpcApAQCAtODE4LDggKzgxNSw3IEBACiAJCQkJc3Bpbl91bmxvY2soJm1tbGlzdF9sb2NrKTsKIAkJCX0KIAkJCWRlY19tbV9jb3VudGVyKG1tLCBhbm9uX3Jzcyk7Ci0jaWZkZWYgQ09ORklHX01JR1JBVElPTgotCQl9IGVsc2UgeworCQl9IGVsc2UgaWYgKFBBR0VfTUlHUkFUSU9OKSB7CiAJCQkvKgogCQkJICogU3RvcmUgdGhlIHBmbiBvZiB0aGUgcGFnZSBpbiBhIHNwZWNpYWwgbWlncmF0aW9uCiAJCQkgKiBwdGUuIGRvX3N3YXBfcGFnZSgpIHdpbGwgd2FpdCB1bnRpbCB0aGUgbWlncmF0aW9uCkBAIC04MjcsMjMgKzgyMywxOSBAQAogCQkJICovCiAJCQlCVUdfT04oIW1pZ3JhdGlvbik7CiAJCQllbnRyeSA9IG1ha2VfbWlncmF0aW9uX2VudHJ5KHBhZ2UsIHB0ZV93cml0ZShwdGV2YWwpKTsKLSNlbmRpZgogCQl9CiAJCXNldF9wdGVfYXQobW0sIGFkZHJlc3MsIHB0ZSwgc3dwX2VudHJ5X3RvX3B0ZShlbnRyeSkpOwogCQlCVUdfT04ocHRlX2ZpbGUoKnB0ZSkpOwotCX0gZWxzZQotI2lmZGVmIENPTkZJR19NSUdSQVRJT04KLQlpZiAobWlncmF0aW9uKSB7CisJfSBlbHNlIGlmIChQQUdFX01JR1JBVElPTiAmJiBtaWdyYXRpb24pIHsKIAkJLyogRXN0YWJsaXNoIG1pZ3JhdGlvbiBlbnRyeSBmb3IgYSBmaWxlIHBhZ2UgKi8KIAkJc3dwX2VudHJ5X3QgZW50cnk7CiAJCWVudHJ5ID0gbWFrZV9taWdyYXRpb25fZW50cnkocGFnZSwgcHRlX3dyaXRlKHB0ZXZhbCkpOwogCQlzZXRfcHRlX2F0KG1tLCBhZGRyZXNzLCBwdGUsIHN3cF9lbnRyeV90b19wdGUoZW50cnkpKTsKIAl9IGVsc2UKLSNlbmRpZgogCQlkZWNfbW1fY291bnRlcihtbSwgZmlsZV9yc3MpOwogCiAKLQlwYWdlX3JlbW92ZV9ybWFwKHBhZ2UsIHZtYSk7CisJcGFnZV9yZW1vdmVfcm1hcChwYWdlKTsKIAlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CiAKIG91dF91bm1hcDoKQEAgLTk1OCw3ICs5NTAsNyBAQAogCQlpZiAocHRlX2RpcnR5KHB0ZXZhbCkpCiAJCQlzZXRfcGFnZV9kaXJ0eShwYWdlKTsKIAotCQlwYWdlX3JlbW92ZV9ybWFwKHBhZ2UsIHZtYSk7CisJCXBhZ2VfcmVtb3ZlX3JtYXAocGFnZSk7CiAJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKIAkJZGVjX21tX2NvdW50ZXIobW0sIGZpbGVfcnNzKTsKIAkJKCptYXBjb3VudCktLTsKZGlmZiAtLWdpdCBhL21tL3NobWVtLmMgYi9tbS9zaG1lbS5jCmluZGV4IGYxYjBkNDguLjVkMGRlOTYgMTAwNjQ0Ci0tLSBhL21tL3NobWVtLmMKKysrIGIvbW0vc2htZW0uYwpAQCAtMTQsMzEgKzE0LDM5IEBACiAgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIEx1a2UgS2VubmV0aCBDYXNzb24gTGVpZ2h0b24gPGxrY2xAbGtjbC5uZXQ+CiAgKiBDb3B5cmlnaHQgKGMpIDIwMDQgUmVkIEhhdCwgSW5jLiwgSmFtZXMgTW9ycmlzIDxqbW9ycmlzQHJlZGhhdC5jb20+CiAgKgorICogdGlueS1zaG1lbToKKyAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBNYXR0IE1hY2thbGwgPG1wbUBzZWxlbmljLmNvbT4KKyAqCiAgKiBUaGlzIGZpbGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIEdQTC4KICAqLwogCisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvdmZzLmg+CisjaW5jbHVkZSA8bGludXgvbW91bnQuaD4KKyNpbmNsdWRlIDxsaW51eC9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zd2FwLmg+CisKK3N0YXRpYyBzdHJ1Y3QgdmZzbW91bnQgKnNobV9tbnQ7CisKKyNpZmRlZiBDT05GSUdfU0hNRU0KIC8qCiAgKiBUaGlzIHZpcnR1YWwgbWVtb3J5IGZpbGVzeXN0ZW0gaXMgaGVhdmlseSBiYXNlZCBvbiB0aGUgcmFtZnMuIEl0CiAgKiBleHRlbmRzIHJhbWZzIGJ5IHRoZSBhYmlsaXR5IHRvIHVzZSBzd2FwIGFuZCBob25vciByZXNvdXJjZSBsaW1pdHMKICAqIHdoaWNoIG1ha2VzIGl0IGEgY29tcGxldGVseSB1c2FibGUgZmlsZXN5c3RlbS4KICAqLwogCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgveGF0dHIuaD4KICNpbmNsdWRlIDxsaW51eC9leHBvcnRmcy5oPgogI2luY2x1ZGUgPGxpbnV4L2dlbmVyaWNfYWNsLmg+Ci0jaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9tbWFuLmg+Ci0jaW5jbHVkZSA8bGludXgvZmlsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3N3YXAuaD4KICNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2JhY2tpbmctZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvc2htZW1fZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9tb3VudC5oPgogI2luY2x1ZGUgPGxpbnV4L3dyaXRlYmFjay5oPgogI2luY2x1ZGUgPGxpbnV4L3Zmcy5oPgogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgpAQCAtOTIwLDcgKzkyOCwxMSBAQAogCWVycm9yID0gMTsKIAlpZiAoIWlub2RlKQogCQlnb3RvIG91dDsKLQkvKiBQcmVjaGFyZ2UgcGFnZSB1c2luZyBHRlBfS0VSTkVMIHdoaWxlIHdlIGNhbiB3YWl0ICovCisJLyoKKwkgKiBDaGFyZ2UgcGFnZSB1c2luZyBHRlBfS0VSTkVMIHdoaWxlIHdlIGNhbiB3YWl0LgorCSAqIENoYXJnZWQgYmFjayB0byB0aGUgdXNlcihub3QgdG8gY2FsbGVyKSB3aGVuIHN3YXAgYWNjb3VudCBpcyB1c2VkLgorCSAqIGFkZF90b19wYWdlX2NhY2hlKCkgd2lsbCBiZSBjYWxsZWQgd2l0aCBHRlBfTk9XQUlULgorCSAqLwogCWVycm9yID0gbWVtX2Nncm91cF9jYWNoZV9jaGFyZ2UocGFnZSwgY3VycmVudC0+bW0sIEdGUF9LRVJORUwpOwogCWlmIChlcnJvcikKIAkJZ290byBvdXQ7CkBAIC0xMzEyLDE1ICsxMzI0LDE5IEBACiAJCX0gZWxzZSB7CiAJCQlzaG1lbV9zd3BfdW5tYXAoZW50cnkpOwogCQkJc3Bpbl91bmxvY2soJmluZm8tPmxvY2spOwotCQkJdW5sb2NrX3BhZ2Uoc3dhcHBhZ2UpOwotCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHN3YXBwYWdlKTsKIAkJCWlmIChlcnJvciA9PSAtRU5PTUVNKSB7CiAJCQkJLyogYWxsb3cgcmVjbGFpbSBmcm9tIHRoaXMgbWVtb3J5IGNncm91cCAqLwotCQkJCWVycm9yID0gbWVtX2Nncm91cF9zaHJpbmtfdXNhZ2UoY3VycmVudC0+bW0sCisJCQkJZXJyb3IgPSBtZW1fY2dyb3VwX3Nocmlua191c2FnZShzd2FwcGFnZSwKKwkJCQkJCQkJY3VycmVudC0+bW0sCiAJCQkJCQkJCWdmcCk7Ci0JCQkJaWYgKGVycm9yKQorCQkJCWlmIChlcnJvcikgeworCQkJCQl1bmxvY2tfcGFnZShzd2FwcGFnZSk7CisJCQkJCXBhZ2VfY2FjaGVfcmVsZWFzZShzd2FwcGFnZSk7CiAJCQkJCWdvdG8gZmFpbGVkOworCQkJCX0KIAkJCX0KKwkJCXVubG9ja19wYWdlKHN3YXBwYWdlKTsKKwkJCXBhZ2VfY2FjaGVfcmVsZWFzZShzd2FwcGFnZSk7CiAJCQlnb3RvIHJlcGVhdDsKIAkJfQogCX0gZWxzZSBpZiAoc2dwID09IFNHUF9SRUFEICYmICFmaWxlcGFnZSkgewpAQCAtMTM3MSw3ICsxMzg3LDcgQEAKIAogCQkJLyogUHJlY2hhcmdlIHBhZ2Ugd2hpbGUgd2UgY2FuIHdhaXQsIGNvbXBlbnNhdGUgYWZ0ZXIgKi8KIAkJCWVycm9yID0gbWVtX2Nncm91cF9jYWNoZV9jaGFyZ2UoZmlsZXBhZ2UsIGN1cnJlbnQtPm1tLAotCQkJCQkJCWdmcCAmIH5fX0dGUF9ISUdITUVNKTsKKwkJCQkJR0ZQX0tFUk5FTCk7CiAJCQlpZiAoZXJyb3IpIHsKIAkJCQlwYWdlX2NhY2hlX3JlbGVhc2UoZmlsZXBhZ2UpOwogCQkJCXNobWVtX3VuYWNjdF9ibG9ja3MoaW5mby0+ZmxhZ3MsIDEpOwpAQCAtMTQ0NCw3ICsxNDYwLDYgQEAKIAlpZiAoZXJyb3IpCiAJCXJldHVybiAoKGVycm9yID09IC1FTk9NRU0pID8gVk1fRkFVTFRfT09NIDogVk1fRkFVTFRfU0lHQlVTKTsKIAotCW1hcmtfcGFnZV9hY2Nlc3NlZCh2bWYtPnBhZ2UpOwogCXJldHVybiByZXQgfCBWTV9GQVVMVF9MT0NLRUQ7CiB9CiAKQEAgLTI0ODYsNyArMjUwMSw2IEBACiAJLmdldF9zYgkJPSBzaG1lbV9nZXRfc2IsCiAJLmtpbGxfc2IJPSBraWxsX2xpdHRlcl9zdXBlciwKIH07Ci1zdGF0aWMgc3RydWN0IHZmc21vdW50ICpzaG1fbW50OwogCiBzdGF0aWMgaW50IF9faW5pdCBpbml0X3RtcGZzKHZvaWQpCiB7CkBAIC0yNTI1LDcgKzI1MzksNTEgQEAKIAlzaG1fbW50ID0gRVJSX1BUUihlcnJvcik7CiAJcmV0dXJuIGVycm9yOwogfQotbW9kdWxlX2luaXQoaW5pdF90bXBmcykKKworI2Vsc2UgLyogIUNPTkZJR19TSE1FTSAqLworCisvKgorICogdGlueS1zaG1lbTogc2ltcGxlIHNobWVtZnMgYW5kIHRtcGZzIHVzaW5nIHJhbWZzIGNvZGUKKyAqCisgKiBUaGlzIGlzIGludGVuZGVkIGZvciBzbWFsbCBzeXN0ZW0gd2hlcmUgdGhlIGJlbmVmaXRzIG9mIHRoZSBmdWxsCisgKiBzaG1lbSBjb2RlIChzd2FwLWJhY2tlZCBhbmQgcmVzb3VyY2UtbGltaXRlZCkgYXJlIG91dHdlaWdoZWQgYnkKKyAqIHRoZWlyIGNvbXBsZXhpdHkuIE9uIHN5c3RlbXMgd2l0aG91dCBzd2FwIHRoaXMgY29kZSBzaG91bGQgYmUKKyAqIGVmZmVjdGl2ZWx5IGVxdWl2YWxlbnQsIGJ1dCBtdWNoIGxpZ2h0ZXIgd2VpZ2h0LgorICovCisKKyNpbmNsdWRlIDxsaW51eC9yYW1mcy5oPgorCitzdGF0aWMgc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgdG1wZnNfZnNfdHlwZSA9IHsKKwkubmFtZQkJPSAidG1wZnMiLAorCS5nZXRfc2IJCT0gcmFtZnNfZ2V0X3NiLAorCS5raWxsX3NiCT0ga2lsbF9saXR0ZXJfc3VwZXIsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X3RtcGZzKHZvaWQpCit7CisJQlVHX09OKHJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJnRtcGZzX2ZzX3R5cGUpICE9IDApOworCisJc2htX21udCA9IGtlcm5fbW91bnQoJnRtcGZzX2ZzX3R5cGUpOworCUJVR19PTihJU19FUlIoc2htX21udCkpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBzaG1lbV91bnVzZShzd3BfZW50cnlfdCBlbnRyeSwgc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgc2htZW1fZmlsZV9vcGVyYXRpb25zIHJhbWZzX2ZpbGVfb3BlcmF0aW9ucworI2RlZmluZSBzaG1lbV92bV9vcHMgZ2VuZXJpY19maWxlX3ZtX29wcworI2RlZmluZSBzaG1lbV9nZXRfaW5vZGUgcmFtZnNfZ2V0X2lub2RlCisjZGVmaW5lIHNobWVtX2FjY3Rfc2l6ZShhLCBiKSAwCisjZGVmaW5lIHNobWVtX3VuYWNjdF9zaXplKGEsIGIpIGRvIHt9IHdoaWxlICgwKQorI2RlZmluZSBTSE1FTV9NQVhfQllURVMgTExPTkdfTUFYCisKKyNlbmRpZiAvKiBDT05GSUdfU0hNRU0gKi8KKworLyogY29tbW9uIGNvZGUgKi8KIAogLyoqCiAgKiBzaG1lbV9maWxlX3NldHVwIC0gZ2V0IGFuIHVubGlua2VkIGZpbGUgbGl2aW5nIGluIHRtcGZzCkBAIC0yNTY5LDEyICsyNjI3LDIwIEBACiAJaWYgKCFpbm9kZSkKIAkJZ290byBjbG9zZV9maWxlOwogCisjaWZkZWYgQ09ORklHX1NITUVNCiAJU0hNRU1fSShpbm9kZSktPmZsYWdzID0gZmxhZ3MgJiBWTV9BQ0NPVU5UOworI2VuZGlmCiAJZF9pbnN0YW50aWF0ZShkZW50cnksIGlub2RlKTsKIAlpbm9kZS0+aV9zaXplID0gc2l6ZTsKIAlpbm9kZS0+aV9ubGluayA9IDA7CS8qIEl0IGlzIHVubGlua2VkICovCiAJaW5pdF9maWxlKGZpbGUsIHNobV9tbnQsIGRlbnRyeSwgRk1PREVfV1JJVEUgfCBGTU9ERV9SRUFELAotCQkJJnNobWVtX2ZpbGVfb3BlcmF0aW9ucyk7CisJCSAgJnNobWVtX2ZpbGVfb3BlcmF0aW9ucyk7CisKKyNpZm5kZWYgQ09ORklHX01NVQorCWVycm9yID0gcmFtZnNfbm9tbXVfZXhwYW5kX2Zvcl9tYXBwaW5nKGlub2RlLCBzaXplKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gY2xvc2VfZmlsZTsKKyNlbmRpZgogCXJldHVybiBmaWxlOwogCiBjbG9zZV9maWxlOgpAQCAtMjYwNiwzICsyNjcyLDUgQEAKIAl2bWEtPnZtX29wcyA9ICZzaG1lbV92bV9vcHM7CiAJcmV0dXJuIDA7CiB9CisKK21vZHVsZV9pbml0KGluaXRfdG1wZnMpCmRpZmYgLS1naXQgYS9tbS9zbHViLmMgYi9tbS9zbHViLmMKaW5kZXggZjBlMjg5Mi4uNjM5MmFlNSAxMDA2NDQKLS0tIGEvbW0vc2x1Yi5jCisrKyBiL21tL3NsdWIuYwpAQCAtMjI1NCw3ICsyMjU0LDcgQEAKIAkJICogQWRkIHNvbWUgZW1wdHkgcGFkZGluZyBzbyB0aGF0IHdlIGNhbiBjYXRjaAogCQkgKiBvdmVyd3JpdGVzIGZyb20gZWFybGllciBvYmplY3RzIHJhdGhlciB0aGFuIGxldAogCQkgKiB0cmFja2luZyBpbmZvcm1hdGlvbiBvciB0aGUgZnJlZSBwb2ludGVyIGJlCi0JCSAqIGNvcnJ1cHRlZCBpZiBhbiB1c2VyIHdyaXRlcyBiZWZvcmUgdGhlIHN0YXJ0CisJCSAqIGNvcnJ1cHRlZCBpZiBhIHVzZXIgd3JpdGVzIGJlZm9yZSB0aGUgc3RhcnQKIAkJICogb2YgdGhlIG9iamVjdC4KIAkJICovCiAJCXNpemUgKz0gc2l6ZW9mKHZvaWQgKik7CmRpZmYgLS1naXQgYS9tbS9zd2FwLmMgYi9tbS9zd2FwLmMKaW5kZXggYjEzNWVjOS4uOGFkYjlmZSAxMDA2NDQKLS0tIGEvbW0vc3dhcC5jCisrKyBiL21tL3N3YXAuYwpAQCAtMTUxLDYgKzE1MSwyNiBAQAogCX0KIH0KIAorc3RhdGljIHZvaWQgdXBkYXRlX3BhZ2VfcmVjbGFpbV9zdGF0KHN0cnVjdCB6b25lICp6b25lLCBzdHJ1Y3QgcGFnZSAqcGFnZSwKKwkJCQkgICAgIGludCBmaWxlLCBpbnQgcm90YXRlZCkKK3sKKwlzdHJ1Y3Qgem9uZV9yZWNsYWltX3N0YXQgKnJlY2xhaW1fc3RhdCA9ICZ6b25lLT5yZWNsYWltX3N0YXQ7CisJc3RydWN0IHpvbmVfcmVjbGFpbV9zdGF0ICptZW1jZ19yZWNsYWltX3N0YXQ7CisKKwltZW1jZ19yZWNsYWltX3N0YXQgPSBtZW1fY2dyb3VwX2dldF9yZWNsYWltX3N0YXRfZnJvbV9wYWdlKHBhZ2UpOworCisJcmVjbGFpbV9zdGF0LT5yZWNlbnRfc2Nhbm5lZFtmaWxlXSsrOworCWlmIChyb3RhdGVkKQorCQlyZWNsYWltX3N0YXQtPnJlY2VudF9yb3RhdGVkW2ZpbGVdKys7CisKKwlpZiAoIW1lbWNnX3JlY2xhaW1fc3RhdCkKKwkJcmV0dXJuOworCisJbWVtY2dfcmVjbGFpbV9zdGF0LT5yZWNlbnRfc2Nhbm5lZFtmaWxlXSsrOworCWlmIChyb3RhdGVkKQorCQltZW1jZ19yZWNsYWltX3N0YXQtPnJlY2VudF9yb3RhdGVkW2ZpbGVdKys7Cit9CisKIC8qCiAgKiBGSVhNRTogc3BlZWQgdGhpcyB1cD8KICAqLwpAQCAtMTY4LDEwICsxODgsOCBAQAogCQlscnUgKz0gTFJVX0FDVElWRTsKIAkJYWRkX3BhZ2VfdG9fbHJ1X2xpc3Qoem9uZSwgcGFnZSwgbHJ1KTsKIAkJX19jb3VudF92bV9ldmVudChQR0FDVElWQVRFKTsKLQkJbWVtX2Nncm91cF9tb3ZlX2xpc3RzKHBhZ2UsIGxydSk7CiAKLQkJem9uZS0+cmVjZW50X3JvdGF0ZWRbISFmaWxlXSsrOwotCQl6b25lLT5yZWNlbnRfc2Nhbm5lZFshIWZpbGVdKys7CisJCXVwZGF0ZV9wYWdlX3JlY2xhaW1fc3RhdCh6b25lLCBwYWdlLCAhIWZpbGUsIDEpOwogCX0KIAlzcGluX3VubG9ja19pcnEoJnpvbmUtPmxydV9sb2NrKTsKIH0KQEAgLTI0NiwyNSArMjY0LDYgQEAKIAlzcGluX3VubG9ja19pcnEoJnpvbmUtPmxydV9sb2NrKTsKIH0KIAotLyoqCi0gKiBscnVfY2FjaGVfYWRkX2FjdGl2ZV9vcl91bmV2aWN0YWJsZQotICogQHBhZ2U6ICB0aGUgcGFnZSB0byBiZSBhZGRlZCB0byBMUlUKLSAqIEB2bWE6ICAgdm1hIGluIHdoaWNoIHBhZ2UgaXMgbWFwcGVkIGZvciBkZXRlcm1pbmluZyByZWNsYWltYWJpbGl0eQotICoKLSAqIHBsYWNlIEBwYWdlIG9uIGFjdGl2ZSBvciB1bmV2aWN0YWJsZSBMUlUgbGlzdCwgZGVwZW5kaW5nIG9uCi0gKiBwYWdlX2V2aWN0YWJsZSgpLiAgTm90ZSB0aGF0IGlmIHRoZSBwYWdlIGlzIG5vdCBldmljdGFibGUsCi0gKiBpdCBnb2VzIGRpcmVjdGx5IGJhY2sgb250byBpdCdzIHpvbmUncyB1bmV2aWN0YWJsZSBsaXN0LiAgSXQgZG9lcwotICogTk9UIHVzZSBhIHBlciBjcHUgcGFnZXZlYy4KLSAqLwotdm9pZCBscnVfY2FjaGVfYWRkX2FjdGl2ZV9vcl91bmV2aWN0YWJsZShzdHJ1Y3QgcGFnZSAqcGFnZSwKLQkJCQkJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCi17Ci0JaWYgKHBhZ2VfZXZpY3RhYmxlKHBhZ2UsIHZtYSkpCi0JCWxydV9jYWNoZV9hZGRfbHJ1KHBhZ2UsIExSVV9BQ1RJVkUgKyBwYWdlX2lzX2ZpbGVfY2FjaGUocGFnZSkpOwotCWVsc2UKLQkJYWRkX3BhZ2VfdG9fdW5ldmljdGFibGVfbGlzdChwYWdlKTsKLX0KLQogLyoKICAqIERyYWluIHBhZ2VzIG91dCBvZiB0aGUgY3B1J3MgcGFnZXZlY3MuCiAgKiBFaXRoZXIgImNwdSIgaXMgdGhlIGN1cnJlbnQgQ1BVLCBhbmQgcHJlZW1wdGlvbiBoYXMgYWxyZWFkeSBiZWVuCkBAIC0zOTgsMjggKzM5Nyw2IEBACiBFWFBPUlRfU1lNQk9MKF9fcGFnZXZlY19yZWxlYXNlKTsKIAogLyoKLSAqIHBhZ2V2ZWNfcmVsZWFzZSgpIGZvciBwYWdlcyB3aGljaCBhcmUga25vd24gdG8gbm90IGJlIG9uIHRoZSBMUlUKLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIHJlaW5pdGlhbGlzZXMgdGhlIGNhbGxlcidzIHBhZ2V2ZWMuCi0gKi8KLXZvaWQgX19wYWdldmVjX3JlbGVhc2Vfbm9ubHJ1KHN0cnVjdCBwYWdldmVjICpwdmVjKQotewotCWludCBpOwotCXN0cnVjdCBwYWdldmVjIHBhZ2VzX3RvX2ZyZWU7Ci0KLQlwYWdldmVjX2luaXQoJnBhZ2VzX3RvX2ZyZWUsIHB2ZWMtPmNvbGQpOwotCWZvciAoaSA9IDA7IGkgPCBwYWdldmVjX2NvdW50KHB2ZWMpOyBpKyspIHsKLQkJc3RydWN0IHBhZ2UgKnBhZ2UgPSBwdmVjLT5wYWdlc1tpXTsKLQotCQlWTV9CVUdfT04oUGFnZUxSVShwYWdlKSk7Ci0JCWlmIChwdXRfcGFnZV90ZXN0emVybyhwYWdlKSkKLQkJCXBhZ2V2ZWNfYWRkKCZwYWdlc190b19mcmVlLCBwYWdlKTsKLQl9Ci0JcGFnZXZlY19mcmVlKCZwYWdlc190b19mcmVlKTsKLQlwYWdldmVjX3JlaW5pdChwdmVjKTsKLX0KLQotLyoKICAqIEFkZCB0aGUgcGFzc2VkIHBhZ2VzIHRvIHRoZSBMUlUsIHRoZW4gZHJvcCB0aGUgY2FsbGVyJ3MgcmVmY291bnQKICAqIG9uIHRoZW0uICBSZWluaXRpYWxpc2VzIHRoZSBjYWxsZXIncyBwYWdldmVjLgogICovCkBAIC00MjcsMTIgKzQwNCwxNCBAQAogewogCWludCBpOwogCXN0cnVjdCB6b25lICp6b25lID0gTlVMTDsKKwogCVZNX0JVR19PTihpc191bmV2aWN0YWJsZV9scnUobHJ1KSk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgcGFnZXZlY19jb3VudChwdmVjKTsgaSsrKSB7CiAJCXN0cnVjdCBwYWdlICpwYWdlID0gcHZlYy0+cGFnZXNbaV07CiAJCXN0cnVjdCB6b25lICpwYWdlem9uZSA9IHBhZ2Vfem9uZShwYWdlKTsKIAkJaW50IGZpbGU7CisJCWludCBhY3RpdmU7CiAKIAkJaWYgKHBhZ2V6b25lICE9IHpvbmUpIHsKIAkJCWlmICh6b25lKQpAQCAtNDQ0LDEyICs0MjMsMTEgQEAKIAkJVk1fQlVHX09OKFBhZ2VVbmV2aWN0YWJsZShwYWdlKSk7CiAJCVZNX0JVR19PTihQYWdlTFJVKHBhZ2UpKTsKIAkJU2V0UGFnZUxSVShwYWdlKTsKKwkJYWN0aXZlID0gaXNfYWN0aXZlX2xydShscnUpOwogCQlmaWxlID0gaXNfZmlsZV9scnUobHJ1KTsKLQkJem9uZS0+cmVjZW50X3NjYW5uZWRbZmlsZV0rKzsKLQkJaWYgKGlzX2FjdGl2ZV9scnUobHJ1KSkgeworCQlpZiAoYWN0aXZlKQogCQkJU2V0UGFnZUFjdGl2ZShwYWdlKTsKLQkJCXpvbmUtPnJlY2VudF9yb3RhdGVkW2ZpbGVdKys7Ci0JCX0KKwkJdXBkYXRlX3BhZ2VfcmVjbGFpbV9zdGF0KHpvbmUsIHBhZ2UsIGZpbGUsIGFjdGl2ZSk7CiAJCWFkZF9wYWdlX3RvX2xydV9saXN0KHpvbmUsIHBhZ2UsIGxydSk7CiAJfQogCWlmICh6b25lKQpAQCAtNDk1LDggKzQ3Myw3IEBACiAJCXN0cnVjdCBwYWdlICpwYWdlID0gcHZlYy0+cGFnZXNbaV07CiAKIAkJaWYgKFBhZ2VTd2FwQ2FjaGUocGFnZSkgJiYgdHJ5bG9ja19wYWdlKHBhZ2UpKSB7Ci0JCQlpZiAoUGFnZVN3YXBDYWNoZShwYWdlKSkKLQkJCQlyZW1vdmVfZXhjbHVzaXZlX3N3YXBfcGFnZV9yZWYocGFnZSk7CisJCQl0cnlfdG9fZnJlZV9zd2FwKHBhZ2UpOwogCQkJdW5sb2NrX3BhZ2UocGFnZSk7CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9tbS9zd2FwX3N0YXRlLmMgYi9tbS9zd2FwX3N0YXRlLmMKaW5kZXggMzM1M2M5MC4uM2VjZWE5OCAxMDA2NDQKLS0tIGEvbW0vc3dhcF9zdGF0ZS5jCisrKyBiL21tL3N3YXBfc3RhdGUuYwpAQCAtMTcsNiArMTcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2JhY2tpbmctZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvcGFnZXZlYy5oPgogI2luY2x1ZGUgPGxpbnV4L21pZ3JhdGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlX2Nncm91cC5oPgogCiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KIApAQCAtNzIsMTAgKzczLDEwIEBACiB7CiAJaW50IGVycm9yOwogCi0JQlVHX09OKCFQYWdlTG9ja2VkKHBhZ2UpKTsKLQlCVUdfT04oUGFnZVN3YXBDYWNoZShwYWdlKSk7Ci0JQlVHX09OKFBhZ2VQcml2YXRlKHBhZ2UpKTsKLQlCVUdfT04oIVBhZ2VTd2FwQmFja2VkKHBhZ2UpKTsKKwlWTV9CVUdfT04oIVBhZ2VMb2NrZWQocGFnZSkpOworCVZNX0JVR19PTihQYWdlU3dhcENhY2hlKHBhZ2UpKTsKKwlWTV9CVUdfT04oIVBhZ2VTd2FwQmFja2VkKHBhZ2UpKTsKKwogCWVycm9yID0gcmFkaXhfdHJlZV9wcmVsb2FkKGdmcF9tYXNrKTsKIAlpZiAoIWVycm9yKSB7CiAJCXBhZ2VfY2FjaGVfZ2V0KHBhZ2UpOwpAQCAtMTA4LDEwICsxMDksMTEgQEAKICAqLwogdm9pZCBfX2RlbGV0ZV9mcm9tX3N3YXBfY2FjaGUoc3RydWN0IHBhZ2UgKnBhZ2UpCiB7Ci0JQlVHX09OKCFQYWdlTG9ja2VkKHBhZ2UpKTsKLQlCVUdfT04oIVBhZ2VTd2FwQ2FjaGUocGFnZSkpOwotCUJVR19PTihQYWdlV3JpdGViYWNrKHBhZ2UpKTsKLQlCVUdfT04oUGFnZVByaXZhdGUocGFnZSkpOworCXN3cF9lbnRyeV90IGVudCA9IHsudmFsID0gcGFnZV9wcml2YXRlKHBhZ2UpfTsKKworCVZNX0JVR19PTighUGFnZUxvY2tlZChwYWdlKSk7CisJVk1fQlVHX09OKCFQYWdlU3dhcENhY2hlKHBhZ2UpKTsKKwlWTV9CVUdfT04oUGFnZVdyaXRlYmFjayhwYWdlKSk7CiAKIAlyYWRpeF90cmVlX2RlbGV0ZSgmc3dhcHBlcl9zcGFjZS5wYWdlX3RyZWUsIHBhZ2VfcHJpdmF0ZShwYWdlKSk7CiAJc2V0X3BhZ2VfcHJpdmF0ZShwYWdlLCAwKTsKQEAgLTExOSw2ICsxMjEsNyBAQAogCXRvdGFsX3N3YXBjYWNoZV9wYWdlcy0tOwogCV9fZGVjX3pvbmVfcGFnZV9zdGF0ZShwYWdlLCBOUl9GSUxFX1BBR0VTKTsKIAlJTkNfQ0FDSEVfSU5GTyhkZWxfdG90YWwpOworCW1lbV9jZ3JvdXBfdW5jaGFyZ2Vfc3dhcGNhY2hlKHBhZ2UsIGVudCk7CiB9CiAKIC8qKgpAQCAtMTI5LDEzICsxMzIsMTMgQEAKICAqIEFsbG9jYXRlIHN3YXAgc3BhY2UgZm9yIHRoZSBwYWdlIGFuZCBhZGQgdGhlIHBhZ2UgdG8gdGhlCiAgKiBzd2FwIGNhY2hlLiAgQ2FsbGVyIG5lZWRzIHRvIGhvbGQgdGhlIHBhZ2UgbG9jay4gCiAgKi8KLWludCBhZGRfdG9fc3dhcChzdHJ1Y3QgcGFnZSAqIHBhZ2UsIGdmcF90IGdmcF9tYXNrKQoraW50IGFkZF90b19zd2FwKHN0cnVjdCBwYWdlICpwYWdlKQogewogCXN3cF9lbnRyeV90IGVudHJ5OwogCWludCBlcnI7CiAKLQlCVUdfT04oIVBhZ2VMb2NrZWQocGFnZSkpOwotCUJVR19PTighUGFnZVVwdG9kYXRlKHBhZ2UpKTsKKwlWTV9CVUdfT04oIVBhZ2VMb2NrZWQocGFnZSkpOworCVZNX0JVR19PTighUGFnZVVwdG9kYXRlKHBhZ2UpKTsKIAogCWZvciAoOzspIHsKIAkJZW50cnkgPSBnZXRfc3dhcF9wYWdlKCk7CkBAIC0xNTQsNyArMTU3LDcgQEAKIAkJICogQWRkIGl0IHRvIHRoZSBzd2FwIGNhY2hlIGFuZCBtYXJrIGl0IGRpcnR5CiAJCSAqLwogCQllcnIgPSBhZGRfdG9fc3dhcF9jYWNoZShwYWdlLCBlbnRyeSwKLQkJCQlnZnBfbWFza3xfX0dGUF9OT01FTUFMTE9DfF9fR0ZQX05PV0FSTik7CisJCQkJX19HRlBfSElHSHxfX0dGUF9OT01FTUFMTE9DfF9fR0ZQX05PV0FSTik7CiAKIAkJc3dpdGNoIChlcnIpIHsKIAkJY2FzZSAwOgkJCQkvKiBTdWNjZXNzICovCkBAIC0xOTYsMTQgKzE5OSwxNCBAQAogICogSWYgd2UgYXJlIHRoZSBvbmx5IHVzZXIsIHRoZW4gdHJ5IHRvIGZyZWUgdXAgdGhlIHN3YXAgY2FjaGUuIAogICogCiAgKiBJdHMgb2sgdG8gY2hlY2sgZm9yIFBhZ2VTd2FwQ2FjaGUgd2l0aG91dCB0aGUgcGFnZSBsb2NrCi0gKiBoZXJlIGJlY2F1c2Ugd2UgYXJlIGdvaW5nIHRvIHJlY2hlY2sgYWdhaW4gaW5zaWRlIAotICogZXhjbHVzaXZlX3N3YXBfcGFnZSgpIF93aXRoXyB0aGUgbG9jay4gCisgKiBoZXJlIGJlY2F1c2Ugd2UgYXJlIGdvaW5nIHRvIHJlY2hlY2sgYWdhaW4gaW5zaWRlCisgKiB0cnlfdG9fZnJlZV9zd2FwKCkgX3dpdGhfIHRoZSBsb2NrLgogICogCQkJCQktIE1hcmNlbG8KICAqLwogc3RhdGljIGlubGluZSB2b2lkIGZyZWVfc3dhcF9jYWNoZShzdHJ1Y3QgcGFnZSAqcGFnZSkKIHsKLQlpZiAoUGFnZVN3YXBDYWNoZShwYWdlKSAmJiB0cnlsb2NrX3BhZ2UocGFnZSkpIHsKLQkJcmVtb3ZlX2V4Y2x1c2l2ZV9zd2FwX3BhZ2UocGFnZSk7CisJaWYgKFBhZ2VTd2FwQ2FjaGUocGFnZSkgJiYgIXBhZ2VfbWFwcGVkKHBhZ2UpICYmIHRyeWxvY2tfcGFnZShwYWdlKSkgeworCQl0cnlfdG9fZnJlZV9zd2FwKHBhZ2UpOwogCQl1bmxvY2tfcGFnZShwYWdlKTsKIAl9CiB9CmRpZmYgLS1naXQgYS9tbS9zd2FwZmlsZS5jIGIvbW0vc3dhcGZpbGUuYwppbmRleCA1NGE5Zjg3Li5kYTQyMmM0IDEwMDY0NAotLS0gYS9tbS9zd2FwZmlsZS5jCisrKyBiL21tL3N3YXBmaWxlLmMKQEAgLTE2LDYgKzE2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9uYW1laS5oPgogI2luY2x1ZGUgPGxpbnV4L3NobS5oPgogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgogI2luY2x1ZGUgPGxpbnV4L3dyaXRlYmFjay5oPgogI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgpAQCAtMzIsOSArMzMsMTEgQEAKICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgogI2luY2x1ZGUgPGFzbS90bGJmbHVzaC5oPgogI2luY2x1ZGUgPGxpbnV4L3N3YXBvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlX2Nncm91cC5oPgogCiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHN3YXBfbG9jayk7CiBzdGF0aWMgdW5zaWduZWQgaW50IG5yX3N3YXBmaWxlczsKK2xvbmcgbnJfc3dhcF9wYWdlczsKIGxvbmcgdG90YWxfc3dhcF9wYWdlczsKIHN0YXRpYyBpbnQgc3dhcF9vdmVyZmxvdzsKIHN0YXRpYyBpbnQgbGVhc3RfcHJpb3JpdHk7CkBAIC04MywxNSArODYsOTYgQEAKIAl1cF9yZWFkKCZzd2FwX3VucGx1Z19zZW0pOwogfQogCisvKgorICogc3dhcG9uIHRlbGwgZGV2aWNlIHRoYXQgYWxsIHRoZSBvbGQgc3dhcCBjb250ZW50cyBjYW4gYmUgZGlzY2FyZGVkLAorICogdG8gYWxsb3cgdGhlIHN3YXAgZGV2aWNlIHRvIG9wdGltaXplIGl0cyB3ZWFyLWxldmVsbGluZy4KKyAqLworc3RhdGljIGludCBkaXNjYXJkX3N3YXAoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpKQoreworCXN0cnVjdCBzd2FwX2V4dGVudCAqc2U7CisJaW50IGVyciA9IDA7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHNlLCAmc2ktPmV4dGVudF9saXN0LCBsaXN0KSB7CisJCXNlY3Rvcl90IHN0YXJ0X2Jsb2NrID0gc2UtPnN0YXJ0X2Jsb2NrIDw8IChQQUdFX1NISUZUIC0gOSk7CisJCXNlY3Rvcl90IG5yX2Jsb2NrcyA9IChzZWN0b3JfdClzZS0+bnJfcGFnZXMgPDwgKFBBR0VfU0hJRlQgLSA5KTsKKworCQlpZiAoc2UtPnN0YXJ0X3BhZ2UgPT0gMCkgeworCQkJLyogRG8gbm90IGRpc2NhcmQgdGhlIHN3YXAgaGVhZGVyIHBhZ2UhICovCisJCQlzdGFydF9ibG9jayArPSAxIDw8IChQQUdFX1NISUZUIC0gOSk7CisJCQlucl9ibG9ja3MgLT0gMSA8PCAoUEFHRV9TSElGVCAtIDkpOworCQkJaWYgKCFucl9ibG9ja3MpCisJCQkJY29udGludWU7CisJCX0KKworCQllcnIgPSBibGtkZXZfaXNzdWVfZGlzY2FyZChzaS0+YmRldiwgc3RhcnRfYmxvY2ssCisJCQkJCQlucl9ibG9ja3MsIEdGUF9LRVJORUwpOworCQlpZiAoZXJyKQorCQkJYnJlYWs7CisKKwkJY29uZF9yZXNjaGVkKCk7CisJfQorCXJldHVybiBlcnI7CQkvKiBUaGF0IHdpbGwgb2Z0ZW4gYmUgLUVPUE5PVFNVUFAgKi8KK30KKworLyoKKyAqIHN3YXAgYWxsb2NhdGlvbiB0ZWxsIGRldmljZSB0aGF0IGEgY2x1c3RlciBvZiBzd2FwIGNhbiBub3cgYmUgZGlzY2FyZGVkLAorICogdG8gYWxsb3cgdGhlIHN3YXAgZGV2aWNlIHRvIG9wdGltaXplIGl0cyB3ZWFyLWxldmVsbGluZy4KKyAqLworc3RhdGljIHZvaWQgZGlzY2FyZF9zd2FwX2NsdXN0ZXIoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLAorCQkJCSBwZ29mZl90IHN0YXJ0X3BhZ2UsIHBnb2ZmX3QgbnJfcGFnZXMpCit7CisJc3RydWN0IHN3YXBfZXh0ZW50ICpzZSA9IHNpLT5jdXJyX3N3YXBfZXh0ZW50OworCWludCBmb3VuZF9leHRlbnQgPSAwOworCisJd2hpbGUgKG5yX3BhZ2VzKSB7CisJCXN0cnVjdCBsaXN0X2hlYWQgKmxoOworCisJCWlmIChzZS0+c3RhcnRfcGFnZSA8PSBzdGFydF9wYWdlICYmCisJCSAgICBzdGFydF9wYWdlIDwgc2UtPnN0YXJ0X3BhZ2UgKyBzZS0+bnJfcGFnZXMpIHsKKwkJCXBnb2ZmX3Qgb2Zmc2V0ID0gc3RhcnRfcGFnZSAtIHNlLT5zdGFydF9wYWdlOworCQkJc2VjdG9yX3Qgc3RhcnRfYmxvY2sgPSBzZS0+c3RhcnRfYmxvY2sgKyBvZmZzZXQ7CisJCQlzZWN0b3JfdCBucl9ibG9ja3MgPSBzZS0+bnJfcGFnZXMgLSBvZmZzZXQ7CisKKwkJCWlmIChucl9ibG9ja3MgPiBucl9wYWdlcykKKwkJCQlucl9ibG9ja3MgPSBucl9wYWdlczsKKwkJCXN0YXJ0X3BhZ2UgKz0gbnJfYmxvY2tzOworCQkJbnJfcGFnZXMgLT0gbnJfYmxvY2tzOworCisJCQlpZiAoIWZvdW5kX2V4dGVudCsrKQorCQkJCXNpLT5jdXJyX3N3YXBfZXh0ZW50ID0gc2U7CisKKwkJCXN0YXJ0X2Jsb2NrIDw8PSBQQUdFX1NISUZUIC0gOTsKKwkJCW5yX2Jsb2NrcyA8PD0gUEFHRV9TSElGVCAtIDk7CisJCQlpZiAoYmxrZGV2X2lzc3VlX2Rpc2NhcmQoc2ktPmJkZXYsIHN0YXJ0X2Jsb2NrLAorCQkJCQkJCW5yX2Jsb2NrcywgR0ZQX05PSU8pKQorCQkJCWJyZWFrOworCQl9CisKKwkJbGggPSBzZS0+bGlzdC5uZXh0OworCQlpZiAobGggPT0gJnNpLT5leHRlbnRfbGlzdCkKKwkJCWxoID0gbGgtPm5leHQ7CisJCXNlID0gbGlzdF9lbnRyeShsaCwgc3RydWN0IHN3YXBfZXh0ZW50LCBsaXN0KTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgd2FpdF9mb3JfZGlzY2FyZCh2b2lkICp3b3JkKQoreworCXNjaGVkdWxlKCk7CisJcmV0dXJuIDA7Cit9CisKICNkZWZpbmUgU1dBUEZJTEVfQ0xVU1RFUgkyNTYKICNkZWZpbmUgTEFURU5DWV9MSU1JVAkJMjU2CiAKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBzY2FuX3N3YXBfbWFwKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSkKIHsKLQl1bnNpZ25lZCBsb25nIG9mZnNldCwgbGFzdF9pbl9jbHVzdGVyOworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OworCXVuc2lnbmVkIGxvbmcgc2Nhbl9iYXNlOworCXVuc2lnbmVkIGxvbmcgbGFzdF9pbl9jbHVzdGVyID0gMDsKIAlpbnQgbGF0ZW5jeV9yYXRpb24gPSBMQVRFTkNZX0xJTUlUOworCWludCBmb3VuZF9mcmVlX2NsdXN0ZXIgPSAwOwogCi0JLyogCisJLyoKIAkgKiBXZSB0cnkgdG8gY2x1c3RlciBzd2FwIHBhZ2VzIGJ5IGFsbG9jYXRpbmcgdGhlbSBzZXF1ZW50aWFsbHkKIAkgKiBpbiBzd2FwLiAgT25jZSB3ZSd2ZSBhbGxvY2F0ZWQgU1dBUEZJTEVfQ0xVU1RFUiBwYWdlcyB0aGlzCiAJICogd2F5LCBob3dldmVyLCB3ZSByZXNvcnQgdG8gZmlyc3QtZnJlZSBhbGxvY2F0aW9uLCBzdGFydGluZwpAQCAtOTksMTYgKzE4Myw0MiBAQAogCSAqIGFsbCBvdmVyIHRoZSBlbnRpcmUgc3dhcCBwYXJ0aXRpb24sIHNvIHRoYXQgd2UgcmVkdWNlCiAJICogb3ZlcmFsbCBkaXNrIHNlZWsgdGltZXMgYmV0d2VlbiBzd2FwIHBhZ2VzLiAgLS0gc2N0CiAJICogQnV0IHdlIGRvIG5vdyB0cnkgdG8gZmluZCBhbiBlbXB0eSBjbHVzdGVyLiAgLUFuZHJlYQorCSAqIEFuZCB3ZSBsZXQgc3dhcCBwYWdlcyBnbyBhbGwgb3ZlciBhbiBTU0QgcGFydGl0aW9uLiAgSHVnaAogCSAqLwogCiAJc2ktPmZsYWdzICs9IFNXUF9TQ0FOTklORzsKLQlpZiAodW5saWtlbHkoIXNpLT5jbHVzdGVyX25yKSkgewotCQlzaS0+Y2x1c3Rlcl9uciA9IFNXQVBGSUxFX0NMVVNURVIgLSAxOwotCQlpZiAoc2ktPnBhZ2VzIC0gc2ktPmludXNlX3BhZ2VzIDwgU1dBUEZJTEVfQ0xVU1RFUikKLQkJCWdvdG8gbG93ZXN0OworCXNjYW5fYmFzZSA9IG9mZnNldCA9IHNpLT5jbHVzdGVyX25leHQ7CisKKwlpZiAodW5saWtlbHkoIXNpLT5jbHVzdGVyX25yLS0pKSB7CisJCWlmIChzaS0+cGFnZXMgLSBzaS0+aW51c2VfcGFnZXMgPCBTV0FQRklMRV9DTFVTVEVSKSB7CisJCQlzaS0+Y2x1c3Rlcl9uciA9IFNXQVBGSUxFX0NMVVNURVIgLSAxOworCQkJZ290byBjaGVja3M7CisJCX0KKwkJaWYgKHNpLT5mbGFncyAmIFNXUF9ESVNDQVJEQUJMRSkgeworCQkJLyoKKwkJCSAqIFN0YXJ0IHJhbmdlIGNoZWNrIG9uIHJhY2luZyBhbGxvY2F0aW9ucywgaW4gY2FzZQorCQkJICogdGhleSBvdmVybGFwIHRoZSBjbHVzdGVyIHdlIGV2ZW50dWFsbHkgZGVjaWRlIG9uCisJCQkgKiAod2Ugc2NhbiB3aXRob3V0IHN3YXBfbG9jayB0byBhbGxvdyBwcmVlbXB0aW9uKS4KKwkJCSAqIEl0J3MgaGFyZGx5IGNvbmNlaXZhYmxlIHRoYXQgY2x1c3Rlcl9uciBjb3VsZCBiZQorCQkJICogd3JhcHBlZCBkdXJpbmcgb3VyIHNjYW4sIGJ1dCBkb24ndCBkZXBlbmQgb24gaXQuCisJCQkgKi8KKwkJCWlmIChzaS0+bG93ZXN0X2FsbG9jKQorCQkJCWdvdG8gY2hlY2tzOworCQkJc2ktPmxvd2VzdF9hbGxvYyA9IHNpLT5tYXg7CisJCQlzaS0+aGlnaGVzdF9hbGxvYyA9IDA7CisJCX0KIAkJc3Bpbl91bmxvY2soJnN3YXBfbG9jayk7CiAKLQkJb2Zmc2V0ID0gc2ktPmxvd2VzdF9iaXQ7CisJCS8qCisJCSAqIElmIHNlZWsgaXMgZXhwZW5zaXZlLCBzdGFydCBzZWFyY2hpbmcgZm9yIG5ldyBjbHVzdGVyIGZyb20KKwkJICogc3RhcnQgb2YgcGFydGl0aW9uLCB0byBtaW5pbWl6ZSB0aGUgc3BhbiBvZiBhbGxvY2F0ZWQgc3dhcC4KKwkJICogQnV0IGlmIHNlZWsgaXMgY2hlYXAsIHNlYXJjaCBmcm9tIG91ciBjdXJyZW50IHBvc2l0aW9uLCBzbworCQkgKiB0aGF0IHN3YXAgaXMgYWxsb2NhdGVkIGZyb20gYWxsIG92ZXIgdGhlIHBhcnRpdGlvbjogaWYgdGhlCisJCSAqIEZsYXNoIFRyYW5zbGF0aW9uIExheWVyIG9ubHkgcmVtYXBzIHdpdGhpbiBsaW1pdGVkIHpvbmVzLAorCQkgKiB3ZSBkb24ndCB3YW50IHRvIHdlYXIgb3V0IHRoZSBmaXJzdCB6b25lIHRvbyBxdWlja2x5LgorCQkgKi8KKwkJaWYgKCEoc2ktPmZsYWdzICYgU1dQX1NPTElEU1RBVEUpKQorCQkJc2Nhbl9iYXNlID0gb2Zmc2V0ID0gc2ktPmxvd2VzdF9iaXQ7CiAJCWxhc3RfaW5fY2x1c3RlciA9IG9mZnNldCArIFNXQVBGSUxFX0NMVVNURVIgLSAxOwogCiAJCS8qIExvY2F0ZSB0aGUgZmlyc3QgZW1wdHkgKHVuYWxpZ25lZCkgY2x1c3RlciAqLwpAQCAtMTE3LDQzICsyMjcsMTI0IEBACiAJCQkJbGFzdF9pbl9jbHVzdGVyID0gb2Zmc2V0ICsgU1dBUEZJTEVfQ0xVU1RFUjsKIAkJCWVsc2UgaWYgKG9mZnNldCA9PSBsYXN0X2luX2NsdXN0ZXIpIHsKIAkJCQlzcGluX2xvY2soJnN3YXBfbG9jayk7Ci0JCQkJc2ktPmNsdXN0ZXJfbmV4dCA9IG9mZnNldC1TV0FQRklMRV9DTFVTVEVSKzE7Ci0JCQkJZ290byBjbHVzdGVyOworCQkJCW9mZnNldCAtPSBTV0FQRklMRV9DTFVTVEVSIC0gMTsKKwkJCQlzaS0+Y2x1c3Rlcl9uZXh0ID0gb2Zmc2V0OworCQkJCXNpLT5jbHVzdGVyX25yID0gU1dBUEZJTEVfQ0xVU1RFUiAtIDE7CisJCQkJZm91bmRfZnJlZV9jbHVzdGVyID0gMTsKKwkJCQlnb3RvIGNoZWNrczsKIAkJCX0KIAkJCWlmICh1bmxpa2VseSgtLWxhdGVuY3lfcmF0aW9uIDwgMCkpIHsKIAkJCQljb25kX3Jlc2NoZWQoKTsKIAkJCQlsYXRlbmN5X3JhdGlvbiA9IExBVEVOQ1lfTElNSVQ7CiAJCQl9CiAJCX0KKworCQlvZmZzZXQgPSBzaS0+bG93ZXN0X2JpdDsKKwkJbGFzdF9pbl9jbHVzdGVyID0gb2Zmc2V0ICsgU1dBUEZJTEVfQ0xVU1RFUiAtIDE7CisKKwkJLyogTG9jYXRlIHRoZSBmaXJzdCBlbXB0eSAodW5hbGlnbmVkKSBjbHVzdGVyICovCisJCWZvciAoOyBsYXN0X2luX2NsdXN0ZXIgPCBzY2FuX2Jhc2U7IG9mZnNldCsrKSB7CisJCQlpZiAoc2ktPnN3YXBfbWFwW29mZnNldF0pCisJCQkJbGFzdF9pbl9jbHVzdGVyID0gb2Zmc2V0ICsgU1dBUEZJTEVfQ0xVU1RFUjsKKwkJCWVsc2UgaWYgKG9mZnNldCA9PSBsYXN0X2luX2NsdXN0ZXIpIHsKKwkJCQlzcGluX2xvY2soJnN3YXBfbG9jayk7CisJCQkJb2Zmc2V0IC09IFNXQVBGSUxFX0NMVVNURVIgLSAxOworCQkJCXNpLT5jbHVzdGVyX25leHQgPSBvZmZzZXQ7CisJCQkJc2ktPmNsdXN0ZXJfbnIgPSBTV0FQRklMRV9DTFVTVEVSIC0gMTsKKwkJCQlmb3VuZF9mcmVlX2NsdXN0ZXIgPSAxOworCQkJCWdvdG8gY2hlY2tzOworCQkJfQorCQkJaWYgKHVubGlrZWx5KC0tbGF0ZW5jeV9yYXRpb24gPCAwKSkgeworCQkJCWNvbmRfcmVzY2hlZCgpOworCQkJCWxhdGVuY3lfcmF0aW9uID0gTEFURU5DWV9MSU1JVDsKKwkJCX0KKwkJfQorCisJCW9mZnNldCA9IHNjYW5fYmFzZTsKIAkJc3Bpbl9sb2NrKCZzd2FwX2xvY2spOwotCQlnb3RvIGxvd2VzdDsKKwkJc2ktPmNsdXN0ZXJfbnIgPSBTV0FQRklMRV9DTFVTVEVSIC0gMTsKKwkJc2ktPmxvd2VzdF9hbGxvYyA9IDA7CiAJfQogCi0Jc2ktPmNsdXN0ZXJfbnItLTsKLWNsdXN0ZXI6Ci0Jb2Zmc2V0ID0gc2ktPmNsdXN0ZXJfbmV4dDsKLQlpZiAob2Zmc2V0ID4gc2ktPmhpZ2hlc3RfYml0KQotbG93ZXN0OgkJb2Zmc2V0ID0gc2ktPmxvd2VzdF9iaXQ7Ci1jaGVja3M6CWlmICghKHNpLT5mbGFncyAmIFNXUF9XUklURU9LKSkKK2NoZWNrczoKKwlpZiAoIShzaS0+ZmxhZ3MgJiBTV1BfV1JJVEVPSykpCiAJCWdvdG8gbm9fcGFnZTsKIAlpZiAoIXNpLT5oaWdoZXN0X2JpdCkKIAkJZ290byBub19wYWdlOwotCWlmICghc2ktPnN3YXBfbWFwW29mZnNldF0pIHsKLQkJaWYgKG9mZnNldCA9PSBzaS0+bG93ZXN0X2JpdCkKLQkJCXNpLT5sb3dlc3RfYml0Kys7Ci0JCWlmIChvZmZzZXQgPT0gc2ktPmhpZ2hlc3RfYml0KQotCQkJc2ktPmhpZ2hlc3RfYml0LS07Ci0JCXNpLT5pbnVzZV9wYWdlcysrOwotCQlpZiAoc2ktPmludXNlX3BhZ2VzID09IHNpLT5wYWdlcykgewotCQkJc2ktPmxvd2VzdF9iaXQgPSBzaS0+bWF4OwotCQkJc2ktPmhpZ2hlc3RfYml0ID0gMDsKLQkJfQotCQlzaS0+c3dhcF9tYXBbb2Zmc2V0XSA9IDE7Ci0JCXNpLT5jbHVzdGVyX25leHQgPSBvZmZzZXQgKyAxOwotCQlzaS0+ZmxhZ3MgLT0gU1dQX1NDQU5OSU5HOwotCQlyZXR1cm4gb2Zmc2V0OwotCX0KKwlpZiAob2Zmc2V0ID4gc2ktPmhpZ2hlc3RfYml0KQorCQlzY2FuX2Jhc2UgPSBvZmZzZXQgPSBzaS0+bG93ZXN0X2JpdDsKKwlpZiAoc2ktPnN3YXBfbWFwW29mZnNldF0pCisJCWdvdG8gc2NhbjsKIAorCWlmIChvZmZzZXQgPT0gc2ktPmxvd2VzdF9iaXQpCisJCXNpLT5sb3dlc3RfYml0Kys7CisJaWYgKG9mZnNldCA9PSBzaS0+aGlnaGVzdF9iaXQpCisJCXNpLT5oaWdoZXN0X2JpdC0tOworCXNpLT5pbnVzZV9wYWdlcysrOworCWlmIChzaS0+aW51c2VfcGFnZXMgPT0gc2ktPnBhZ2VzKSB7CisJCXNpLT5sb3dlc3RfYml0ID0gc2ktPm1heDsKKwkJc2ktPmhpZ2hlc3RfYml0ID0gMDsKKwl9CisJc2ktPnN3YXBfbWFwW29mZnNldF0gPSAxOworCXNpLT5jbHVzdGVyX25leHQgPSBvZmZzZXQgKyAxOworCXNpLT5mbGFncyAtPSBTV1BfU0NBTk5JTkc7CisKKwlpZiAoc2ktPmxvd2VzdF9hbGxvYykgeworCQkvKgorCQkgKiBPbmx5IHNldCB3aGVuIFNXUF9ESVNDQVJEQUJMRSwgYW5kIHRoZXJlJ3MgYSBzY2FuCisJCSAqIGZvciBhIGZyZWUgY2x1c3RlciBpbiBwcm9ncmVzcyBvciBqdXN0IGNvbXBsZXRlZC4KKwkJICovCisJCWlmIChmb3VuZF9mcmVlX2NsdXN0ZXIpIHsKKwkJCS8qCisJCQkgKiBUbyBvcHRpbWl6ZSB3ZWFyLWxldmVsbGluZywgZGlzY2FyZCB0aGUKKwkJCSAqIG9sZCBkYXRhIG9mIHRoZSBjbHVzdGVyLCB0YWtpbmcgY2FyZSBub3QgdG8KKwkJCSAqIGRpc2NhcmQgYW55IG9mIGl0cyBwYWdlcyB0aGF0IGhhdmUgYWxyZWFkeQorCQkJICogYmVlbiBhbGxvY2F0ZWQgYnkgcmFjaW5nIHRhc2tzIChvZmZzZXQgaGFzCisJCQkgKiBhbHJlYWR5IHN0ZXBwZWQgb3ZlciBhbnkgYXQgdGhlIGJlZ2lubmluZykuCisJCQkgKi8KKwkJCWlmIChvZmZzZXQgPCBzaS0+aGlnaGVzdF9hbGxvYyAmJgorCQkJICAgIHNpLT5sb3dlc3RfYWxsb2MgPD0gbGFzdF9pbl9jbHVzdGVyKQorCQkJCWxhc3RfaW5fY2x1c3RlciA9IHNpLT5sb3dlc3RfYWxsb2MgLSAxOworCQkJc2ktPmZsYWdzIHw9IFNXUF9ESVNDQVJESU5HOworCQkJc3Bpbl91bmxvY2soJnN3YXBfbG9jayk7CisKKwkJCWlmIChvZmZzZXQgPCBsYXN0X2luX2NsdXN0ZXIpCisJCQkJZGlzY2FyZF9zd2FwX2NsdXN0ZXIoc2ksIG9mZnNldCwKKwkJCQkJbGFzdF9pbl9jbHVzdGVyIC0gb2Zmc2V0ICsgMSk7CisKKwkJCXNwaW5fbG9jaygmc3dhcF9sb2NrKTsKKwkJCXNpLT5sb3dlc3RfYWxsb2MgPSAwOworCQkJc2ktPmZsYWdzICY9IH5TV1BfRElTQ0FSRElORzsKKworCQkJc21wX21iKCk7CS8qIHdha2VfdXBfYml0IGFkdmlzZXMgdGhpcyAqLworCQkJd2FrZV91cF9iaXQoJnNpLT5mbGFncywgaWxvZzIoU1dQX0RJU0NBUkRJTkcpKTsKKworCQl9IGVsc2UgaWYgKHNpLT5mbGFncyAmIFNXUF9ESVNDQVJESU5HKSB7CisJCQkvKgorCQkJICogRGVsYXkgdXNpbmcgcGFnZXMgYWxsb2NhdGVkIGJ5IHJhY2luZyB0YXNrcworCQkJICogdW50aWwgdGhlIHdob2xlIGRpc2NhcmQgaGFzIGJlZW4gaXNzdWVkLiBXZQorCQkJICogY291bGQgZGVmZXIgdGhhdCBkZWxheSB1bnRpbCBzd2FwX3dyaXRlcGFnZSwKKwkJCSAqIGJ1dCBpdCdzIGVhc2llciB0byBrZWVwIHRoaXMgc2VsZi1jb250YWluZWQuCisJCQkgKi8KKwkJCXNwaW5fdW5sb2NrKCZzd2FwX2xvY2spOworCQkJd2FpdF9vbl9iaXQoJnNpLT5mbGFncywgaWxvZzIoU1dQX0RJU0NBUkRJTkcpLAorCQkJCXdhaXRfZm9yX2Rpc2NhcmQsIFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJCXNwaW5fbG9jaygmc3dhcF9sb2NrKTsKKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBOb3RlIHBhZ2VzIGFsbG9jYXRlZCBieSByYWNpbmcgdGFza3Mgd2hpbGUKKwkJCSAqIHNjYW4gZm9yIGEgZnJlZSBjbHVzdGVyIGlzIGluIHByb2dyZXNzLCBzbworCQkJICogdGhhdCBpdHMgZmluYWwgZGlzY2FyZCBjYW4gZXhjbHVkZSB0aGVtLgorCQkJICovCisJCQlpZiAob2Zmc2V0IDwgc2ktPmxvd2VzdF9hbGxvYykKKwkJCQlzaS0+bG93ZXN0X2FsbG9jID0gb2Zmc2V0OworCQkJaWYgKG9mZnNldCA+IHNpLT5oaWdoZXN0X2FsbG9jKQorCQkJCXNpLT5oaWdoZXN0X2FsbG9jID0gb2Zmc2V0OworCQl9CisJfQorCXJldHVybiBvZmZzZXQ7CisKK3NjYW46CiAJc3Bpbl91bmxvY2soJnN3YXBfbG9jayk7CiAJd2hpbGUgKCsrb2Zmc2V0IDw9IHNpLT5oaWdoZXN0X2JpdCkgewogCQlpZiAoIXNpLT5zd2FwX21hcFtvZmZzZXRdKSB7CkBAIC0xNjUsOCArMzU2LDE4IEBACiAJCQlsYXRlbmN5X3JhdGlvbiA9IExBVEVOQ1lfTElNSVQ7CiAJCX0KIAl9CisJb2Zmc2V0ID0gc2ktPmxvd2VzdF9iaXQ7CisJd2hpbGUgKCsrb2Zmc2V0IDwgc2Nhbl9iYXNlKSB7CisJCWlmICghc2ktPnN3YXBfbWFwW29mZnNldF0pIHsKKwkJCXNwaW5fbG9jaygmc3dhcF9sb2NrKTsKKwkJCWdvdG8gY2hlY2tzOworCQl9CisJCWlmICh1bmxpa2VseSgtLWxhdGVuY3lfcmF0aW9uIDwgMCkpIHsKKwkJCWNvbmRfcmVzY2hlZCgpOworCQkJbGF0ZW5jeV9yYXRpb24gPSBMQVRFTkNZX0xJTUlUOworCQl9CisJfQogCXNwaW5fbG9jaygmc3dhcF9sb2NrKTsKLQlnb3RvIGxvd2VzdDsKIAogbm9fcGFnZToKIAlzaS0+ZmxhZ3MgLT0gU1dQX1NDQU5OSU5HOwpAQCAtMjY4LDEwICs0NjksMTEgQEAKIAlwcmludGsoS0VSTl9FUlIgInN3YXBfZnJlZTogJXMlMDhseFxuIiwgQmFkX2ZpbGUsIGVudHJ5LnZhbCk7CiBvdXQ6CiAJcmV0dXJuIE5VTEw7Ci19CQorfQogCi1zdGF0aWMgaW50IHN3YXBfZW50cnlfZnJlZShzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqcCwgdW5zaWduZWQgbG9uZyBvZmZzZXQpCitzdGF0aWMgaW50IHN3YXBfZW50cnlfZnJlZShzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqcCwgc3dwX2VudHJ5X3QgZW50KQogeworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0ID0gc3dwX29mZnNldChlbnQpOwogCWludCBjb3VudCA9IHAtPnN3YXBfbWFwW29mZnNldF07CiAKIAlpZiAoY291bnQgPCBTV0FQX01BUF9NQVgpIHsKQEAgLTI4Niw2ICs0ODgsNyBAQAogCQkJCXN3YXBfbGlzdC5uZXh0ID0gcCAtIHN3YXBfaW5mbzsKIAkJCW5yX3N3YXBfcGFnZXMrKzsKIAkJCXAtPmludXNlX3BhZ2VzLS07CisJCQltZW1fY2dyb3VwX3VuY2hhcmdlX3N3YXAoZW50KTsKIAkJfQogCX0KIAlyZXR1cm4gY291bnQ7CkBAIC0zMDEsNyArNTA0LDcgQEAKIAogCXAgPSBzd2FwX2luZm9fZ2V0KGVudHJ5KTsKIAlpZiAocCkgewotCQlzd2FwX2VudHJ5X2ZyZWUocCwgc3dwX29mZnNldChlbnRyeSkpOworCQlzd2FwX2VudHJ5X2ZyZWUocCwgZW50cnkpOwogCQlzcGluX3VubG9jaygmc3dhcF9sb2NrKTsKIAl9CiB9CkBAIC0zMjYsMTAxICs1MjksNjIgQEAKIH0KIAogLyoKLSAqIFdlIGNhbiB1c2UgdGhpcyBzd2FwIGNhY2hlIGVudHJ5IGRpcmVjdGx5Ci0gKiBpZiB0aGVyZSBhcmUgbm8gb3RoZXIgcmVmZXJlbmNlcyB0byBpdC4KKyAqIFdlIGNhbiB3cml0ZSB0byBhbiBhbm9uIHBhZ2Ugd2l0aG91dCBDT1cgaWYgdGhlcmUgYXJlIG5vIG90aGVyIHJlZmVyZW5jZXMKKyAqIHRvIGl0LiAgQW5kIGFzIGEgc2lkZS1lZmZlY3QsIGZyZWUgdXAgaXRzIHN3YXA6IGJlY2F1c2UgdGhlIG9sZCBjb250ZW50CisgKiBvbiBkaXNrIHdpbGwgbmV2ZXIgYmUgcmVhZCwgYW5kIHNlZWtpbmcgYmFjayB0aGVyZSB0byB3cml0ZSBuZXcgY29udGVudAorICogbGF0ZXIgd291bGQgb25seSB3YXN0ZSB0aW1lIGF3YXkgZnJvbSBjbHVzdGVyaW5nLgogICovCi1pbnQgY2FuX3NoYXJlX3N3YXBfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSkKK2ludCByZXVzZV9zd2FwX3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UpCiB7CiAJaW50IGNvdW50OwogCi0JQlVHX09OKCFQYWdlTG9ja2VkKHBhZ2UpKTsKKwlWTV9CVUdfT04oIVBhZ2VMb2NrZWQocGFnZSkpOwogCWNvdW50ID0gcGFnZV9tYXBjb3VudChwYWdlKTsKLQlpZiAoY291bnQgPD0gMSAmJiBQYWdlU3dhcENhY2hlKHBhZ2UpKQorCWlmIChjb3VudCA8PSAxICYmIFBhZ2VTd2FwQ2FjaGUocGFnZSkpIHsKIAkJY291bnQgKz0gcGFnZV9zd2FwY291bnQocGFnZSk7CisJCWlmIChjb3VudCA9PSAxICYmICFQYWdlV3JpdGViYWNrKHBhZ2UpKSB7CisJCQlkZWxldGVfZnJvbV9zd2FwX2NhY2hlKHBhZ2UpOworCQkJU2V0UGFnZURpcnR5KHBhZ2UpOworCQl9CisJfQogCXJldHVybiBjb3VudCA9PSAxOwogfQogCiAvKgotICogV29yayBvdXQgaWYgdGhlcmUgYXJlIGFueSBvdGhlciBwcm9jZXNzZXMgc2hhcmluZyB0aGlzCi0gKiBzd2FwIGNhY2hlIHBhZ2UuIEZyZWUgaXQgaWYgeW91IGNhbi4gUmV0dXJuIHN1Y2Nlc3MuCisgKiBJZiBzd2FwIGlzIGdldHRpbmcgZnVsbCwgb3IgaWYgdGhlcmUgYXJlIG5vIG1vcmUgbWFwcGluZ3Mgb2YgdGhpcyBwYWdlLAorICogdGhlbiB0cnlfdG9fZnJlZV9zd2FwIGlzIGNhbGxlZCB0byBmcmVlIGl0cyBzd2FwIHNwYWNlLgogICovCi1zdGF0aWMgaW50IHJlbW92ZV9leGNsdXNpdmVfc3dhcF9wYWdlX2NvdW50KHN0cnVjdCBwYWdlICpwYWdlLCBpbnQgY291bnQpCitpbnQgdHJ5X3RvX2ZyZWVfc3dhcChzdHJ1Y3QgcGFnZSAqcGFnZSkKIHsKLQlpbnQgcmV0dmFsOwotCXN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICogcDsKLQlzd3BfZW50cnlfdCBlbnRyeTsKLQotCUJVR19PTihQYWdlUHJpdmF0ZShwYWdlKSk7Ci0JQlVHX09OKCFQYWdlTG9ja2VkKHBhZ2UpKTsKKwlWTV9CVUdfT04oIVBhZ2VMb2NrZWQocGFnZSkpOwogCiAJaWYgKCFQYWdlU3dhcENhY2hlKHBhZ2UpKQogCQlyZXR1cm4gMDsKIAlpZiAoUGFnZVdyaXRlYmFjayhwYWdlKSkKIAkJcmV0dXJuIDA7Ci0JaWYgKHBhZ2VfY291bnQocGFnZSkgIT0gY291bnQpIC8qIHVzICsgY2FjaGUgKyBwdGVzICovCisJaWYgKHBhZ2Vfc3dhcGNvdW50KHBhZ2UpKQogCQlyZXR1cm4gMDsKIAotCWVudHJ5LnZhbCA9IHBhZ2VfcHJpdmF0ZShwYWdlKTsKLQlwID0gc3dhcF9pbmZvX2dldChlbnRyeSk7Ci0JaWYgKCFwKQotCQlyZXR1cm4gMDsKLQotCS8qIElzIHRoZSBvbmx5IHN3YXAgY2FjaGUgdXNlciB0aGUgY2FjaGUgaXRzZWxmPyAqLwotCXJldHZhbCA9IDA7Ci0JaWYgKHAtPnN3YXBfbWFwW3N3cF9vZmZzZXQoZW50cnkpXSA9PSAxKSB7Ci0JCS8qIFJlY2hlY2sgdGhlIHBhZ2UgY291bnQgd2l0aCB0aGUgc3dhcGNhY2hlIGxvY2sgaGVsZC4uICovCi0JCXNwaW5fbG9ja19pcnEoJnN3YXBwZXJfc3BhY2UudHJlZV9sb2NrKTsKLQkJaWYgKChwYWdlX2NvdW50KHBhZ2UpID09IGNvdW50KSAmJiAhUGFnZVdyaXRlYmFjayhwYWdlKSkgewotCQkJX19kZWxldGVfZnJvbV9zd2FwX2NhY2hlKHBhZ2UpOwotCQkJU2V0UGFnZURpcnR5KHBhZ2UpOwotCQkJcmV0dmFsID0gMTsKLQkJfQotCQlzcGluX3VubG9ja19pcnEoJnN3YXBwZXJfc3BhY2UudHJlZV9sb2NrKTsKLQl9Ci0Jc3Bpbl91bmxvY2soJnN3YXBfbG9jayk7Ci0KLQlpZiAocmV0dmFsKSB7Ci0JCXN3YXBfZnJlZShlbnRyeSk7Ci0JCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKLQl9Ci0KLQlyZXR1cm4gcmV0dmFsOwotfQotCi0vKgotICogTW9zdCBvZiB0aGUgdGltZSB0aGUgcGFnZSBzaG91bGQgaGF2ZSB0d28gcmVmZXJlbmNlczogb25lIGZvciB0aGUKLSAqIHByb2Nlc3MgYW5kIG9uZSBmb3IgdGhlIHN3YXAgY2FjaGUuCi0gKi8KLWludCByZW1vdmVfZXhjbHVzaXZlX3N3YXBfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSkKLXsKLQlyZXR1cm4gcmVtb3ZlX2V4Y2x1c2l2ZV9zd2FwX3BhZ2VfY291bnQocGFnZSwgMik7Ci19Ci0KLS8qCi0gKiBUaGUgcGFnZW91dCBjb2RlIGhvbGRzIGFuIGV4dHJhIHJlZmVyZW5jZSB0byB0aGUgcGFnZS4gIFRoYXQgcmFpc2VzCi0gKiB0aGUgcmVmZXJlbmNlIGNvdW50IHRvIHRlc3QgZm9yIHRvIDIgZm9yIGEgcGFnZSB0aGF0IGlzIG9ubHkgaW4gdGhlCi0gKiBzd2FwIGNhY2hlIHBsdXMgMSBmb3IgZWFjaCBwcm9jZXNzIHRoYXQgbWFwcyB0aGUgcGFnZS4KLSAqLwotaW50IHJlbW92ZV9leGNsdXNpdmVfc3dhcF9wYWdlX3JlZihzdHJ1Y3QgcGFnZSAqcGFnZSkKLXsKLQlyZXR1cm4gcmVtb3ZlX2V4Y2x1c2l2ZV9zd2FwX3BhZ2VfY291bnQocGFnZSwgMiArIHBhZ2VfbWFwY291bnQocGFnZSkpOworCWRlbGV0ZV9mcm9tX3N3YXBfY2FjaGUocGFnZSk7CisJU2V0UGFnZURpcnR5KHBhZ2UpOworCXJldHVybiAxOwogfQogCiAvKgogICogRnJlZSB0aGUgc3dhcCBlbnRyeSBsaWtlIGFib3ZlLCBidXQgYWxzbyB0cnkgdG8KICAqIGZyZWUgdGhlIHBhZ2UgY2FjaGUgZW50cnkgaWYgaXQgaXMgdGhlIGxhc3QgdXNlci4KICAqLwotdm9pZCBmcmVlX3N3YXBfYW5kX2NhY2hlKHN3cF9lbnRyeV90IGVudHJ5KQoraW50IGZyZWVfc3dhcF9hbmRfY2FjaGUoc3dwX2VudHJ5X3QgZW50cnkpCiB7Ci0Jc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKiBwOworCXN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpwOwogCXN0cnVjdCBwYWdlICpwYWdlID0gTlVMTDsKIAogCWlmIChpc19taWdyYXRpb25fZW50cnkoZW50cnkpKQotCQlyZXR1cm47CisJCXJldHVybiAxOwogCiAJcCA9IHN3YXBfaW5mb19nZXQoZW50cnkpOwogCWlmIChwKSB7Ci0JCWlmIChzd2FwX2VudHJ5X2ZyZWUocCwgc3dwX29mZnNldChlbnRyeSkpID09IDEpIHsKKwkJaWYgKHN3YXBfZW50cnlfZnJlZShwLCBlbnRyeSkgPT0gMSkgewogCQkJcGFnZSA9IGZpbmRfZ2V0X3BhZ2UoJnN3YXBwZXJfc3BhY2UsIGVudHJ5LnZhbCk7CiAJCQlpZiAocGFnZSAmJiAhdHJ5bG9ja19wYWdlKHBhZ2UpKSB7CiAJCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOwpAQCAtNDMwLDIwICs1OTQsMTkgQEAKIAkJc3Bpbl91bmxvY2soJnN3YXBfbG9jayk7CiAJfQogCWlmIChwYWdlKSB7Ci0JCWludCBvbmVfdXNlcjsKLQotCQlCVUdfT04oUGFnZVByaXZhdGUocGFnZSkpOwotCQlvbmVfdXNlciA9IChwYWdlX2NvdW50KHBhZ2UpID09IDIpOwotCQkvKiBPbmx5IGNhY2hlIHVzZXIgKCt1cyksIG9yIHN3YXAgc3BhY2UgZnVsbD8gRnJlZSBpdCEgKi8KLQkJLyogQWxzbyByZWNoZWNrIFBhZ2VTd2FwQ2FjaGUgYWZ0ZXIgcGFnZSBpcyBsb2NrZWQgKGFib3ZlKSAqLworCQkvKgorCQkgKiBOb3QgbWFwcGVkIGVsc2V3aGVyZSwgb3Igc3dhcCBzcGFjZSBmdWxsPyBGcmVlIGl0IQorCQkgKiBBbHNvIHJlY2hlY2sgUGFnZVN3YXBDYWNoZSBub3cgcGFnZSBpcyBsb2NrZWQgKGFib3ZlKS4KKwkJICovCiAJCWlmIChQYWdlU3dhcENhY2hlKHBhZ2UpICYmICFQYWdlV3JpdGViYWNrKHBhZ2UpICYmCi0JCQkJCShvbmVfdXNlciB8fCB2bV9zd2FwX2Z1bGwoKSkpIHsKKwkJCQkoIXBhZ2VfbWFwcGVkKHBhZ2UpIHx8IHZtX3N3YXBfZnVsbCgpKSkgewogCQkJZGVsZXRlX2Zyb21fc3dhcF9jYWNoZShwYWdlKTsKIAkJCVNldFBhZ2VEaXJ0eShwYWdlKTsKIAkJfQogCQl1bmxvY2tfcGFnZShwYWdlKTsKIAkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOwogCX0KKwlyZXR1cm4gcCAhPSBOVUxMOwogfQogCiAjaWZkZWYgQ09ORklHX0hJQkVSTkFUSU9OCkBAIC01MzAsMTcgKzY5MywxOCBAQAogc3RhdGljIGludCB1bnVzZV9wdGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHBtZF90ICpwbWQsCiAJCXVuc2lnbmVkIGxvbmcgYWRkciwgc3dwX2VudHJ5X3QgZW50cnksIHN0cnVjdCBwYWdlICpwYWdlKQogeworCXN0cnVjdCBtZW1fY2dyb3VwICpwdHIgPSBOVUxMOwogCXNwaW5sb2NrX3QgKnB0bDsKIAlwdGVfdCAqcHRlOwogCWludCByZXQgPSAxOwogCi0JaWYgKG1lbV9jZ3JvdXBfY2hhcmdlKHBhZ2UsIHZtYS0+dm1fbW0sIEdGUF9LRVJORUwpKQorCWlmIChtZW1fY2dyb3VwX3RyeV9jaGFyZ2Vfc3dhcGluKHZtYS0+dm1fbW0sIHBhZ2UsIEdGUF9LRVJORUwsICZwdHIpKQogCQlyZXQgPSAtRU5PTUVNOwogCiAJcHRlID0gcHRlX29mZnNldF9tYXBfbG9jayh2bWEtPnZtX21tLCBwbWQsIGFkZHIsICZwdGwpOwogCWlmICh1bmxpa2VseSghcHRlX3NhbWUoKnB0ZSwgc3dwX2VudHJ5X3RvX3B0ZShlbnRyeSkpKSkgewogCQlpZiAocmV0ID4gMCkKLQkJCW1lbV9jZ3JvdXBfdW5jaGFyZ2VfcGFnZShwYWdlKTsKKwkJCW1lbV9jZ3JvdXBfY2FuY2VsX2NoYXJnZV9zd2FwaW4ocHRyKTsKIAkJcmV0ID0gMDsKIAkJZ290byBvdXQ7CiAJfQpAQCAtNTUwLDYgKzcxNCw3IEBACiAJc2V0X3B0ZV9hdCh2bWEtPnZtX21tLCBhZGRyLCBwdGUsCiAJCSAgIHB0ZV9ta29sZChta19wdGUocGFnZSwgdm1hLT52bV9wYWdlX3Byb3QpKSk7CiAJcGFnZV9hZGRfYW5vbl9ybWFwKHBhZ2UsIHZtYSwgYWRkcik7CisJbWVtX2Nncm91cF9jb21taXRfY2hhcmdlX3N3YXBpbihwYWdlLCBwdHIpOwogCXN3YXBfZnJlZShlbnRyeSk7CiAJLyoKIAkgKiBNb3ZlIHRoZSBwYWdlIHRvIHRoZSBhY3RpdmUgbGlzdCBzbyBpdCBpcyBub3QKQEAgLTc3NiwxMCArOTQxLDEwIEBACiAJCQlicmVhazsKIAkJfQogCi0JCS8qIAorCQkvKgogCQkgKiBHZXQgYSBwYWdlIGZvciB0aGUgZW50cnksIHVzaW5nIHRoZSBleGlzdGluZyBzd2FwCiAJCSAqIGNhY2hlIHBhZ2UgaWYgdGhlcmUgaXMgb25lLiAgT3RoZXJ3aXNlLCBnZXQgYSBjbGVhbgotCQkgKiBwYWdlIGFuZCByZWFkIHRoZSBzd2FwIGludG8gaXQuIAorCQkgKiBwYWdlIGFuZCByZWFkIHRoZSBzd2FwIGludG8gaXQuCiAJCSAqLwogCQlzd2FwX21hcCA9ICZzaS0+c3dhcF9tYXBbaV07CiAJCWVudHJ5ID0gc3dwX2VudHJ5KHR5cGUsIGkpOwpAQCAtOTMwLDcgKzEwOTUsMTYgQEAKIAkJCWxvY2tfcGFnZShwYWdlKTsKIAkJCXdhaXRfb25fcGFnZV93cml0ZWJhY2socGFnZSk7CiAJCX0KLQkJaWYgKFBhZ2VTd2FwQ2FjaGUocGFnZSkpCisKKwkJLyoKKwkJICogSXQgaXMgY29uY2VpdmFibGUgdGhhdCBhIHJhY2luZyB0YXNrIHJlbW92ZWQgdGhpcyBwYWdlIGZyb20KKwkJICogc3dhcCBjYWNoZSBqdXN0IGJlZm9yZSB3ZSBhY3F1aXJlZCB0aGUgcGFnZSBsb2NrIGF0IHRoZSB0b3AsCisJCSAqIG9yIHdoaWxlIHdlIGRyb3BwZWQgaXQgaW4gdW51c2VfbW0oKS4gIFRoZSBwYWdlIG1pZ2h0IGV2ZW4KKwkJICogYmUgYmFjayBpbiBzd2FwIGNhY2hlIG9uIGFub3RoZXIgc3dhcCBhcmVhOiB0aGF0IHdlIG11c3Qgbm90CisJCSAqIGRlbGV0ZSwgc2luY2UgaXQgbWF5IG5vdCBoYXZlIGJlZW4gd3JpdHRlbiBvdXQgdG8gc3dhcCB5ZXQuCisJCSAqLworCQlpZiAoUGFnZVN3YXBDYWNoZShwYWdlKSAmJgorCQkgICAgbGlrZWx5KHBhZ2VfcHJpdmF0ZShwYWdlKSA9PSBlbnRyeS52YWwpKQogCQkJZGVsZXRlX2Zyb21fc3dhcF9jYWNoZShwYWdlKTsKIAogCQkvKgpAQCAtMTIwMywyNiArMTM3Nyw2IEBACiAJcmV0dXJuIHJldDsKIH0KIAotI2lmIDAJLyogV2UgZG9uJ3QgbmVlZCB0aGlzIHlldCAqLwotI2luY2x1ZGUgPGxpbnV4L2JhY2tpbmctZGV2Lmg+Ci1pbnQgcGFnZV9xdWV1ZV9jb25nZXN0ZWQoc3RydWN0IHBhZ2UgKnBhZ2UpCi17Ci0Jc3RydWN0IGJhY2tpbmdfZGV2X2luZm8gKmJkaTsKLQotCUJVR19PTighUGFnZUxvY2tlZChwYWdlKSk7CS8qIEl0IHBpbnMgdGhlIHN3YXBfaW5mb19zdHJ1Y3QgKi8KLQotCWlmIChQYWdlU3dhcENhY2hlKHBhZ2UpKSB7Ci0JCXN3cF9lbnRyeV90IGVudHJ5ID0geyAudmFsID0gcGFnZV9wcml2YXRlKHBhZ2UpIH07Ci0JCXN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaXM7Ci0KLQkJc2lzID0gZ2V0X3N3YXBfaW5mb19zdHJ1Y3Qoc3dwX3R5cGUoZW50cnkpKTsKLQkJYmRpID0gc2lzLT5iZGV2LT5iZF9pbm9kZS0+aV9tYXBwaW5nLT5iYWNraW5nX2Rldl9pbmZvOwotCX0gZWxzZQotCQliZGkgPSBwYWdlLT5tYXBwaW5nLT5iYWNraW5nX2Rldl9pbmZvOwotCXJldHVybiBiZGlfd3JpdGVfY29uZ2VzdGVkKGJkaSk7Ci19Ci0jZW5kaWYKLQogYXNtbGlua2FnZSBsb25nIHN5c19zd2Fwb2ZmKGNvbnN0IGNoYXIgX191c2VyICogc3BlY2lhbGZpbGUpCiB7CiAJc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKiBwID0gTlVMTDsKQEAgLTEyMzMsNyArMTM4Nyw3IEBACiAJY2hhciAqIHBhdGhuYW1lOwogCWludCBpLCB0eXBlLCBwcmV2OwogCWludCBlcnI7Ci0JCisKIAlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCiAJCXJldHVybiAtRVBFUk07CiAKQEAgLTEyNTMsNyArMTQwNyw3IEBACiAJc3Bpbl9sb2NrKCZzd2FwX2xvY2spOwogCWZvciAodHlwZSA9IHN3YXBfbGlzdC5oZWFkOyB0eXBlID49IDA7IHR5cGUgPSBzd2FwX2luZm9bdHlwZV0ubmV4dCkgewogCQlwID0gc3dhcF9pbmZvICsgdHlwZTsKLQkJaWYgKChwLT5mbGFncyAmIFNXUF9BQ1RJVkUpID09IFNXUF9BQ1RJVkUpIHsKKwkJaWYgKHAtPmZsYWdzICYgU1dQX1dSSVRFT0spIHsKIAkJCWlmIChwLT5zd2FwX2ZpbGUtPmZfbWFwcGluZyA9PSBtYXBwaW5nKQogCQkJCWJyZWFrOwogCQl9CkBAIC0xMzQzLDYgKzE0OTcsOSBAQAogCXNwaW5fdW5sb2NrKCZzd2FwX2xvY2spOwogCW11dGV4X3VubG9jaygmc3dhcG9uX211dGV4KTsKIAl2ZnJlZShzd2FwX21hcCk7CisJLyogRGVzdHJveSBzd2FwIGFjY291bnQgaW5mb3JtYXRpbiAqLworCXN3YXBfY2dyb3VwX3N3YXBvZmYodHlwZSk7CisKIAlpbm9kZSA9IG1hcHBpbmctPmhvc3Q7CiAJaWYgKFNfSVNCTEsoaW5vZGUtPmlfbW9kZSkpIHsKIAkJc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiA9IElfQkRFVihpbm9kZSk7CkBAIC0xNDI2LDEyICsxNTgzLDEyIEBACiAJZmlsZSA9IHB0ci0+c3dhcF9maWxlOwogCWxlbiA9IHNlcV9wYXRoKHN3YXAsICZmaWxlLT5mX3BhdGgsICIgXHRcblxcIik7CiAJc2VxX3ByaW50Zihzd2FwLCAiJSpzJXNcdCV1XHQldVx0JWRcbiIsCi0JCSAgICAgICBsZW4gPCA0MCA/IDQwIC0gbGVuIDogMSwgIiAiLAotCQkgICAgICAgU19JU0JMSyhmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlLT5pX21vZGUpID8KKwkJCWxlbiA8IDQwID8gNDAgLSBsZW4gOiAxLCAiICIsCisJCQlTX0lTQkxLKGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUtPmlfbW9kZSkgPwogCQkJCSJwYXJ0aXRpb24iIDogImZpbGVcdCIsCi0JCSAgICAgICBwdHItPnBhZ2VzIDw8IChQQUdFX1NISUZUIC0gMTApLAotCQkgICAgICAgcHRyLT5pbnVzZV9wYWdlcyA8PCAoUEFHRV9TSElGVCAtIDEwKSwKLQkJICAgICAgIHB0ci0+cHJpbyk7CisJCQlwdHItPnBhZ2VzIDw8IChQQUdFX1NISUZUIC0gMTApLAorCQkJcHRyLT5pbnVzZV9wYWdlcyA8PCAoUEFHRV9TSElGVCAtIDEwKSwKKwkJCXB0ci0+cHJpbyk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE0ODcsMTIgKzE2NDQsMTEgQEAKIAlpbnQgaSwgcHJldjsKIAlpbnQgZXJyb3I7CiAJdW5pb24gc3dhcF9oZWFkZXIgKnN3YXBfaGVhZGVyID0gTlVMTDsKLQlpbnQgc3dhcF9oZWFkZXJfdmVyc2lvbjsKIAl1bnNpZ25lZCBpbnQgbnJfZ29vZF9wYWdlcyA9IDA7CiAJaW50IG5yX2V4dGVudHMgPSAwOwogCXNlY3Rvcl90IHNwYW47CiAJdW5zaWduZWQgbG9uZyBtYXhwYWdlcyA9IDE7Ci0JaW50IHN3YXBmaWxlc2l6ZTsKKwl1bnNpZ25lZCBsb25nIHN3YXBmaWxlcGFnZXM7CiAJdW5zaWduZWQgc2hvcnQgKnN3YXBfbWFwID0gTlVMTDsKIAlzdHJ1Y3QgcGFnZSAqcGFnZSA9IE5VTEw7CiAJc3RydWN0IGlub2RlICppbm9kZSA9IE5VTEw7CkBAIC0xNTcwLDcgKzE3MjYsNyBAQAogCQlnb3RvIGJhZF9zd2FwOwogCX0KIAotCXN3YXBmaWxlc2l6ZSA9IGlfc2l6ZV9yZWFkKGlub2RlKSA+PiBQQUdFX1NISUZUOworCXN3YXBmaWxlcGFnZXMgPSBpX3NpemVfcmVhZChpbm9kZSkgPj4gUEFHRV9TSElGVDsKIAogCS8qCiAJICogUmVhZCB0aGUgc3dhcCBoZWFkZXIuCkBAIC0xNTg0LDEwMiArMTc0MCw5MiBAQAogCQllcnJvciA9IFBUUl9FUlIocGFnZSk7CiAJCWdvdG8gYmFkX3N3YXA7CiAJfQotCWttYXAocGFnZSk7Ci0Jc3dhcF9oZWFkZXIgPSBwYWdlX2FkZHJlc3MocGFnZSk7CisJc3dhcF9oZWFkZXIgPSBrbWFwKHBhZ2UpOwogCi0JaWYgKCFtZW1jbXAoIlNXQVAtU1BBQ0UiLHN3YXBfaGVhZGVyLT5tYWdpYy5tYWdpYywxMCkpCi0JCXN3YXBfaGVhZGVyX3ZlcnNpb24gPSAxOwotCWVsc2UgaWYgKCFtZW1jbXAoIlNXQVBTUEFDRTIiLHN3YXBfaGVhZGVyLT5tYWdpYy5tYWdpYywxMCkpCi0JCXN3YXBfaGVhZGVyX3ZlcnNpb24gPSAyOwotCWVsc2UgeworCWlmIChtZW1jbXAoIlNXQVBTUEFDRTIiLCBzd2FwX2hlYWRlci0+bWFnaWMubWFnaWMsIDEwKSkgewogCQlwcmludGsoS0VSTl9FUlIgIlVuYWJsZSB0byBmaW5kIHN3YXAtc3BhY2Ugc2lnbmF0dXJlXG4iKTsKIAkJZXJyb3IgPSAtRUlOVkFMOwogCQlnb3RvIGJhZF9zd2FwOwogCX0KLQkKLQlzd2l0Y2ggKHN3YXBfaGVhZGVyX3ZlcnNpb24pIHsKLQljYXNlIDE6Ci0JCXByaW50ayhLRVJOX0VSUiAidmVyc2lvbiAwIHN3YXAgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZC4gIgotCQkJIlVzZSBta3N3YXAgLXYxICVzXG4iLCBuYW1lKTsKKworCS8qIHN3YXAgcGFydGl0aW9uIGVuZGlhbmVzcyBoYWNrLi4uICovCisJaWYgKHN3YWIzMihzd2FwX2hlYWRlci0+aW5mby52ZXJzaW9uKSA9PSAxKSB7CisJCXN3YWIzMnMoJnN3YXBfaGVhZGVyLT5pbmZvLnZlcnNpb24pOworCQlzd2FiMzJzKCZzd2FwX2hlYWRlci0+aW5mby5sYXN0X3BhZ2UpOworCQlzd2FiMzJzKCZzd2FwX2hlYWRlci0+aW5mby5ucl9iYWRwYWdlcyk7CisJCWZvciAoaSA9IDA7IGkgPCBzd2FwX2hlYWRlci0+aW5mby5ucl9iYWRwYWdlczsgaSsrKQorCQkJc3dhYjMycygmc3dhcF9oZWFkZXItPmluZm8uYmFkcGFnZXNbaV0pOworCX0KKwkvKiBDaGVjayB0aGUgc3dhcCBoZWFkZXIncyBzdWItdmVyc2lvbiAqLworCWlmIChzd2FwX2hlYWRlci0+aW5mby52ZXJzaW9uICE9IDEpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkgICAgICAgIlVuYWJsZSB0byBoYW5kbGUgc3dhcCBoZWFkZXIgdmVyc2lvbiAlZFxuIiwKKwkJICAgICAgIHN3YXBfaGVhZGVyLT5pbmZvLnZlcnNpb24pOwogCQllcnJvciA9IC1FSU5WQUw7CiAJCWdvdG8gYmFkX3N3YXA7Ci0JY2FzZSAyOgotCQkvKiBzd2FwIHBhcnRpdGlvbiBlbmRpYW5lc3MgaGFjay4uLiAqLwotCQlpZiAoc3dhYjMyKHN3YXBfaGVhZGVyLT5pbmZvLnZlcnNpb24pID09IDEpIHsKLQkJCXN3YWIzMnMoJnN3YXBfaGVhZGVyLT5pbmZvLnZlcnNpb24pOwotCQkJc3dhYjMycygmc3dhcF9oZWFkZXItPmluZm8ubGFzdF9wYWdlKTsKLQkJCXN3YWIzMnMoJnN3YXBfaGVhZGVyLT5pbmZvLm5yX2JhZHBhZ2VzKTsKLQkJCWZvciAoaSA9IDA7IGkgPCBzd2FwX2hlYWRlci0+aW5mby5ucl9iYWRwYWdlczsgaSsrKQotCQkJCXN3YWIzMnMoJnN3YXBfaGVhZGVyLT5pbmZvLmJhZHBhZ2VzW2ldKTsKLQkJfQotCQkvKiBDaGVjayB0aGUgc3dhcCBoZWFkZXIncyBzdWItdmVyc2lvbiBhbmQgdGhlIHNpemUgb2YKLSAgICAgICAgICAgICAgICAgICB0aGUgc3dhcCBmaWxlIGFuZCBiYWQgYmxvY2sgbGlzdHMgKi8KLQkJaWYgKHN3YXBfaGVhZGVyLT5pbmZvLnZlcnNpb24gIT0gMSkgewotCQkJcHJpbnRrKEtFUk5fV0FSTklORwotCQkJICAgICAgICJVbmFibGUgdG8gaGFuZGxlIHN3YXAgaGVhZGVyIHZlcnNpb24gJWRcbiIsCi0JCQkgICAgICAgc3dhcF9oZWFkZXItPmluZm8udmVyc2lvbik7CisJfQorCisJcC0+bG93ZXN0X2JpdCAgPSAxOworCXAtPmNsdXN0ZXJfbmV4dCA9IDE7CisKKwkvKgorCSAqIEZpbmQgb3V0IGhvdyBtYW55IHBhZ2VzIGFyZSBhbGxvd2VkIGZvciBhIHNpbmdsZSBzd2FwCisJICogZGV2aWNlLiBUaGVyZSBhcmUgdHdvIGxpbWl0aW5nIGZhY3RvcnM6IDEpIHRoZSBudW1iZXIgb2YKKwkgKiBiaXRzIGZvciB0aGUgc3dhcCBvZmZzZXQgaW4gdGhlIHN3cF9lbnRyeV90IHR5cGUgYW5kCisJICogMikgdGhlIG51bWJlciBvZiBiaXRzIGluIHRoZSBhIHN3YXAgcHRlIGFzIGRlZmluZWQgYnkKKwkgKiB0aGUgZGlmZmVyZW50IGFyY2hpdGVjdHVyZXMuIEluIG9yZGVyIHRvIGZpbmQgdGhlCisJICogbGFyZ2VzdCBwb3NzaWJsZSBiaXQgbWFzayBhIHN3YXAgZW50cnkgd2l0aCBzd2FwIHR5cGUgMAorCSAqIGFuZCBzd2FwIG9mZnNldCB+MFVMIGlzIGNyZWF0ZWQsIGVuY29kZWQgdG8gYSBzd2FwIHB0ZSwKKwkgKiBkZWNvZGVkIHRvIGEgc3dwX2VudHJ5X3QgYWdhaW4gYW5kIGZpbmFsbHkgdGhlIHN3YXAKKwkgKiBvZmZzZXQgaXMgZXh0cmFjdGVkLiBUaGlzIHdpbGwgbWFzayBhbGwgdGhlIGJpdHMgZnJvbQorCSAqIHRoZSBpbml0aWFsIH4wVUwgbWFzayB0aGF0IGNhbid0IGJlIGVuY29kZWQgaW4gZWl0aGVyCisJICogdGhlIHN3cF9lbnRyeV90IG9yIHRoZSBhcmNoaXRlY3R1cmUgZGVmaW5pdGlvbiBvZiBhCisJICogc3dhcCBwdGUuCisJICovCisJbWF4cGFnZXMgPSBzd3Bfb2Zmc2V0KHB0ZV90b19zd3BfZW50cnkoCisJCQlzd3BfZW50cnlfdG9fcHRlKHN3cF9lbnRyeSgwLCB+MFVMKSkpKSAtIDE7CisJaWYgKG1heHBhZ2VzID4gc3dhcF9oZWFkZXItPmluZm8ubGFzdF9wYWdlKQorCQltYXhwYWdlcyA9IHN3YXBfaGVhZGVyLT5pbmZvLmxhc3RfcGFnZTsKKwlwLT5oaWdoZXN0X2JpdCA9IG1heHBhZ2VzIC0gMTsKKworCWVycm9yID0gLUVJTlZBTDsKKwlpZiAoIW1heHBhZ2VzKQorCQlnb3RvIGJhZF9zd2FwOworCWlmIChzd2FwZmlsZXBhZ2VzICYmIG1heHBhZ2VzID4gc3dhcGZpbGVwYWdlcykgeworCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCSAgICAgICAiU3dhcCBhcmVhIHNob3J0ZXIgdGhhbiBzaWduYXR1cmUgaW5kaWNhdGVzXG4iKTsKKwkJZ290byBiYWRfc3dhcDsKKwl9CisJaWYgKHN3YXBfaGVhZGVyLT5pbmZvLm5yX2JhZHBhZ2VzICYmIFNfSVNSRUcoaW5vZGUtPmlfbW9kZSkpCisJCWdvdG8gYmFkX3N3YXA7CisJaWYgKHN3YXBfaGVhZGVyLT5pbmZvLm5yX2JhZHBhZ2VzID4gTUFYX1NXQVBfQkFEUEFHRVMpCisJCWdvdG8gYmFkX3N3YXA7CisKKwkvKiBPSywgc2V0IHVwIHRoZSBzd2FwIG1hcCBhbmQgYXBwbHkgdGhlIGJhZCBibG9jayBsaXN0ICovCisJc3dhcF9tYXAgPSB2bWFsbG9jKG1heHBhZ2VzICogc2l6ZW9mKHNob3J0KSk7CisJaWYgKCFzd2FwX21hcCkgeworCQllcnJvciA9IC1FTk9NRU07CisJCWdvdG8gYmFkX3N3YXA7CisJfQorCisJbWVtc2V0KHN3YXBfbWFwLCAwLCBtYXhwYWdlcyAqIHNpemVvZihzaG9ydCkpOworCWZvciAoaSA9IDA7IGkgPCBzd2FwX2hlYWRlci0+aW5mby5ucl9iYWRwYWdlczsgaSsrKSB7CisJCWludCBwYWdlX25yID0gc3dhcF9oZWFkZXItPmluZm8uYmFkcGFnZXNbaV07CisJCWlmIChwYWdlX25yIDw9IDAgfHwgcGFnZV9uciA+PSBzd2FwX2hlYWRlci0+aW5mby5sYXN0X3BhZ2UpIHsKIAkJCWVycm9yID0gLUVJTlZBTDsKIAkJCWdvdG8gYmFkX3N3YXA7CiAJCX0KLQotCQlwLT5sb3dlc3RfYml0ICA9IDE7Ci0JCXAtPmNsdXN0ZXJfbmV4dCA9IDE7Ci0KLQkJLyoKLQkJICogRmluZCBvdXQgaG93IG1hbnkgcGFnZXMgYXJlIGFsbG93ZWQgZm9yIGEgc2luZ2xlIHN3YXAKLQkJICogZGV2aWNlLiBUaGVyZSBhcmUgdHdvIGxpbWl0aW5nIGZhY3RvcnM6IDEpIHRoZSBudW1iZXIgb2YKLQkJICogYml0cyBmb3IgdGhlIHN3YXAgb2Zmc2V0IGluIHRoZSBzd3BfZW50cnlfdCB0eXBlIGFuZAotCQkgKiAyKSB0aGUgbnVtYmVyIG9mIGJpdHMgaW4gdGhlIGEgc3dhcCBwdGUgYXMgZGVmaW5lZCBieQotCQkgKiB0aGUgZGlmZmVyZW50IGFyY2hpdGVjdHVyZXMuIEluIG9yZGVyIHRvIGZpbmQgdGhlCi0JCSAqIGxhcmdlc3QgcG9zc2libGUgYml0IG1hc2sgYSBzd2FwIGVudHJ5IHdpdGggc3dhcCB0eXBlIDAKLQkJICogYW5kIHN3YXAgb2Zmc2V0IH4wVUwgaXMgY3JlYXRlZCwgZW5jb2RlZCB0byBhIHN3YXAgcHRlLAotCQkgKiBkZWNvZGVkIHRvIGEgc3dwX2VudHJ5X3QgYWdhaW4gYW5kIGZpbmFsbHkgdGhlIHN3YXAKLQkJICogb2Zmc2V0IGlzIGV4dHJhY3RlZC4gVGhpcyB3aWxsIG1hc2sgYWxsIHRoZSBiaXRzIGZyb20KLQkJICogdGhlIGluaXRpYWwgfjBVTCBtYXNrIHRoYXQgY2FuJ3QgYmUgZW5jb2RlZCBpbiBlaXRoZXIKLQkJICogdGhlIHN3cF9lbnRyeV90IG9yIHRoZSBhcmNoaXRlY3R1cmUgZGVmaW5pdGlvbiBvZiBhCi0JCSAqIHN3YXAgcHRlLgotCQkgKi8KLQkJbWF4cGFnZXMgPSBzd3Bfb2Zmc2V0KHB0ZV90b19zd3BfZW50cnkoc3dwX2VudHJ5X3RvX3B0ZShzd3BfZW50cnkoMCx+MFVMKSkpKSAtIDE7Ci0JCWlmIChtYXhwYWdlcyA+IHN3YXBfaGVhZGVyLT5pbmZvLmxhc3RfcGFnZSkKLQkJCW1heHBhZ2VzID0gc3dhcF9oZWFkZXItPmluZm8ubGFzdF9wYWdlOwotCQlwLT5oaWdoZXN0X2JpdCA9IG1heHBhZ2VzIC0gMTsKLQotCQllcnJvciA9IC1FSU5WQUw7Ci0JCWlmICghbWF4cGFnZXMpCi0JCQlnb3RvIGJhZF9zd2FwOwotCQlpZiAoc3dhcGZpbGVzaXplICYmIG1heHBhZ2VzID4gc3dhcGZpbGVzaXplKSB7Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HCi0JCQkgICAgICAgIlN3YXAgYXJlYSBzaG9ydGVyIHRoYW4gc2lnbmF0dXJlIGluZGljYXRlc1xuIik7Ci0JCQlnb3RvIGJhZF9zd2FwOwotCQl9Ci0JCWlmIChzd2FwX2hlYWRlci0+aW5mby5ucl9iYWRwYWdlcyAmJiBTX0lTUkVHKGlub2RlLT5pX21vZGUpKQotCQkJZ290byBiYWRfc3dhcDsKLQkJaWYgKHN3YXBfaGVhZGVyLT5pbmZvLm5yX2JhZHBhZ2VzID4gTUFYX1NXQVBfQkFEUEFHRVMpCi0JCQlnb3RvIGJhZF9zd2FwOwotCi0JCS8qIE9LLCBzZXQgdXAgdGhlIHN3YXAgbWFwIGFuZCBhcHBseSB0aGUgYmFkIGJsb2NrIGxpc3QgKi8KLQkJc3dhcF9tYXAgPSB2bWFsbG9jKG1heHBhZ2VzICogc2l6ZW9mKHNob3J0KSk7Ci0JCWlmICghc3dhcF9tYXApIHsKLQkJCWVycm9yID0gLUVOT01FTTsKLQkJCWdvdG8gYmFkX3N3YXA7Ci0JCX0KLQotCQllcnJvciA9IDA7Ci0JCW1lbXNldChzd2FwX21hcCwgMCwgbWF4cGFnZXMgKiBzaXplb2Yoc2hvcnQpKTsKLQkJZm9yIChpID0gMDsgaSA8IHN3YXBfaGVhZGVyLT5pbmZvLm5yX2JhZHBhZ2VzOyBpKyspIHsKLQkJCWludCBwYWdlX25yID0gc3dhcF9oZWFkZXItPmluZm8uYmFkcGFnZXNbaV07Ci0JCQlpZiAocGFnZV9uciA8PSAwIHx8IHBhZ2VfbnIgPj0gc3dhcF9oZWFkZXItPmluZm8ubGFzdF9wYWdlKQotCQkJCWVycm9yID0gLUVJTlZBTDsKLQkJCWVsc2UKLQkJCQlzd2FwX21hcFtwYWdlX25yXSA9IFNXQVBfTUFQX0JBRDsKLQkJfQotCQlucl9nb29kX3BhZ2VzID0gc3dhcF9oZWFkZXItPmluZm8ubGFzdF9wYWdlIC0KLQkJCQlzd2FwX2hlYWRlci0+aW5mby5ucl9iYWRwYWdlcyAtCi0JCQkJMSAvKiBoZWFkZXIgcGFnZSAqLzsKLQkJaWYgKGVycm9yKQotCQkJZ290byBiYWRfc3dhcDsKKwkJc3dhcF9tYXBbcGFnZV9ucl0gPSBTV0FQX01BUF9CQUQ7CiAJfQogCisJZXJyb3IgPSBzd2FwX2Nncm91cF9zd2Fwb24odHlwZSwgbWF4cGFnZXMpOworCWlmIChlcnJvcikKKwkJZ290byBiYWRfc3dhcDsKKworCW5yX2dvb2RfcGFnZXMgPSBzd2FwX2hlYWRlci0+aW5mby5sYXN0X3BhZ2UgLQorCQkJc3dhcF9oZWFkZXItPmluZm8ubnJfYmFkcGFnZXMgLQorCQkJMSAvKiBoZWFkZXIgcGFnZSAqLzsKKwogCWlmIChucl9nb29kX3BhZ2VzKSB7CiAJCXN3YXBfbWFwWzBdID0gU1dBUF9NQVBfQkFEOwogCQlwLT5tYXggPSBtYXhwYWdlczsKQEAgLTE2OTcsNiArMTg0MywxMyBAQAogCQlnb3RvIGJhZF9zd2FwOwogCX0KIAorCWlmIChibGtfcXVldWVfbm9ucm90KGJkZXZfZ2V0X3F1ZXVlKHAtPmJkZXYpKSkgeworCQlwLT5mbGFncyB8PSBTV1BfU09MSURTVEFURTsKKwkJcC0+Y2x1c3Rlcl9uZXh0ID0gMSArIChyYW5kb20zMigpICUgcC0+aGlnaGVzdF9iaXQpOworCX0KKwlpZiAoZGlzY2FyZF9zd2FwKHApID09IDApCisJCXAtPmZsYWdzIHw9IFNXUF9ESVNDQVJEQUJMRTsKKwogCW11dGV4X2xvY2soJnN3YXBvbl9tdXRleCk7CiAJc3Bpbl9sb2NrKCZzd2FwX2xvY2spOwogCWlmIChzd2FwX2ZsYWdzICYgU1dBUF9GTEFHX1BSRUZFUikKQEAgLTE3MDUsMTQgKzE4NTgsMTYgQEAKIAllbHNlCiAJCXAtPnByaW8gPSAtLWxlYXN0X3ByaW9yaXR5OwogCXAtPnN3YXBfbWFwID0gc3dhcF9tYXA7Ci0JcC0+ZmxhZ3MgPSBTV1BfQUNUSVZFOworCXAtPmZsYWdzIHw9IFNXUF9XUklURU9LOwogCW5yX3N3YXBfcGFnZXMgKz0gbnJfZ29vZF9wYWdlczsKIAl0b3RhbF9zd2FwX3BhZ2VzICs9IG5yX2dvb2RfcGFnZXM7CiAKIAlwcmludGsoS0VSTl9JTkZPICJBZGRpbmcgJXVrIHN3YXAgb24gJXMuICAiCi0JCQkiUHJpb3JpdHk6JWQgZXh0ZW50czolZCBhY3Jvc3M6JWxsdWtcbiIsCisJCQkiUHJpb3JpdHk6JWQgZXh0ZW50czolZCBhY3Jvc3M6JWxsdWsgJXMlc1xuIiwKIAkJbnJfZ29vZF9wYWdlczw8KFBBR0VfU0hJRlQtMTApLCBuYW1lLCBwLT5wcmlvLAotCQlucl9leHRlbnRzLCAodW5zaWduZWQgbG9uZyBsb25nKXNwYW48PChQQUdFX1NISUZULTEwKSk7CisJCW5yX2V4dGVudHMsICh1bnNpZ25lZCBsb25nIGxvbmcpc3Bhbjw8KFBBR0VfU0hJRlQtMTApLAorCQkocC0+ZmxhZ3MgJiBTV1BfU09MSURTVEFURSkgPyAiU1MiIDogIiIsCisJCShwLT5mbGFncyAmIFNXUF9ESVNDQVJEQUJMRSkgPyAiRCIgOiAiIik7CiAKIAkvKiBpbnNlcnQgc3dhcCBzcGFjZSBpbnRvIHN3YXBfbGlzdDogKi8KIAlwcmV2ID0gLTE7CkBAIC0xNzM4LDYgKzE4OTMsNyBAQAogCQliZF9yZWxlYXNlKGJkZXYpOwogCX0KIAlkZXN0cm95X3N3YXBfZXh0ZW50cyhwKTsKKwlzd2FwX2Nncm91cF9zd2Fwb2ZmKHR5cGUpOwogYmFkX3N3YXBfMjoKIAlzcGluX2xvY2soJnN3YXBfbG9jayk7CiAJcC0+c3dhcF9maWxlID0gTlVMTDsKZGlmZiAtLWdpdCBhL21tL3Rpbnktc2htZW0uYyBiL21tL3Rpbnktc2htZW0uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2U2N2Q1Ny4uMDAwMDAwMAotLS0gYS9tbS90aW55LXNobWVtLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotLyoKLSAqIHRpbnktc2htZW0uYzogc2ltcGxlIHNobWVtZnMgYW5kIHRtcGZzIHVzaW5nIHJhbWZzIGNvZGUKLSAqCi0gKiBNYXR0IE1hY2thbGwgPG1wbUBzZWxlbmljLmNvbT4gSmFudWFyeSwgMjAwNAotICogZGVyaXZlZCBmcm9tIG1tL3NobWVtLmMgYW5kIGZzL3JhbWZzL2lub2RlLmMKLSAqCi0gKiBUaGlzIGlzIGludGVuZGVkIGZvciBzbWFsbCBzeXN0ZW0gd2hlcmUgdGhlIGJlbmVmaXRzIG9mIHRoZSBmdWxsCi0gKiBzaG1lbSBjb2RlIChzd2FwLWJhY2tlZCBhbmQgcmVzb3VyY2UtbGltaXRlZCkgYXJlIG91dHdlaWdoZWQgYnkKLSAqIHRoZWlyIGNvbXBsZXhpdHkuIE9uIHN5c3RlbXMgd2l0aG91dCBzd2FwIHRoaXMgY29kZSBzaG91bGQgYmUKLSAqIGVmZmVjdGl2ZWx5IGVxdWl2YWxlbnQsIGJ1dCBtdWNoIGxpZ2h0ZXIgd2VpZ2h0LgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9mcy5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC92ZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9tb3VudC5oPgotI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KLSNpbmNsdWRlIDxsaW51eC9tbS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3N3YXAuaD4KLSNpbmNsdWRlIDxsaW51eC9yYW1mcy5oPgotCi1zdGF0aWMgc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgdG1wZnNfZnNfdHlwZSA9IHsKLQkubmFtZQkJPSAidG1wZnMiLAotCS5nZXRfc2IJCT0gcmFtZnNfZ2V0X3NiLAotCS5raWxsX3NiCT0ga2lsbF9saXR0ZXJfc3VwZXIsCi19OwotCi1zdGF0aWMgc3RydWN0IHZmc21vdW50ICpzaG1fbW50OwotCi1zdGF0aWMgaW50IF9faW5pdCBpbml0X3RtcGZzKHZvaWQpCi17Ci0JQlVHX09OKHJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJnRtcGZzX2ZzX3R5cGUpICE9IDApOwotCi0Jc2htX21udCA9IGtlcm5fbW91bnQoJnRtcGZzX2ZzX3R5cGUpOwotCUJVR19PTihJU19FUlIoc2htX21udCkpOwotCi0JcmV0dXJuIDA7Ci19Ci1tb2R1bGVfaW5pdChpbml0X3RtcGZzKQotCi0vKioKLSAqIHNobWVtX2ZpbGVfc2V0dXAgLSBnZXQgYW4gdW5saW5rZWQgZmlsZSBsaXZpbmcgaW4gdG1wZnMKLSAqIEBuYW1lOiBuYW1lIGZvciBkZW50cnkgKHRvIGJlIHNlZW4gaW4gL3Byb2MvPHBpZD4vbWFwcwotICogQHNpemU6IHNpemUgdG8gYmUgc2V0IGZvciB0aGUgZmlsZQotICogQGZsYWdzOiB2bV9mbGFncwotICovCi1zdHJ1Y3QgZmlsZSAqc2htZW1fZmlsZV9zZXR1cChjaGFyICpuYW1lLCBsb2ZmX3Qgc2l6ZSwgdW5zaWduZWQgbG9uZyBmbGFncykKLXsKLQlpbnQgZXJyb3I7Ci0Jc3RydWN0IGZpbGUgKmZpbGU7Ci0Jc3RydWN0IGlub2RlICppbm9kZTsKLQlzdHJ1Y3QgZGVudHJ5ICpkZW50cnksICpyb290OwotCXN0cnVjdCBxc3RyIHRoaXM7Ci0KLQlpZiAoSVNfRVJSKHNobV9tbnQpKQotCQlyZXR1cm4gKHZvaWQgKilzaG1fbW50OwotCi0JZXJyb3IgPSAtRU5PTUVNOwotCXRoaXMubmFtZSA9IG5hbWU7Ci0JdGhpcy5sZW4gPSBzdHJsZW4obmFtZSk7Ci0JdGhpcy5oYXNoID0gMDsgLyogd2lsbCBnbyAqLwotCXJvb3QgPSBzaG1fbW50LT5tbnRfcm9vdDsKLQlkZW50cnkgPSBkX2FsbG9jKHJvb3QsICZ0aGlzKTsKLQlpZiAoIWRlbnRyeSkKLQkJZ290byBwdXRfbWVtb3J5OwotCi0JZXJyb3IgPSAtRU5GSUxFOwotCWZpbGUgPSBnZXRfZW1wdHlfZmlscCgpOwotCWlmICghZmlsZSkKLQkJZ290byBwdXRfZGVudHJ5OwotCi0JZXJyb3IgPSAtRU5PU1BDOwotCWlub2RlID0gcmFtZnNfZ2V0X2lub2RlKHJvb3QtPmRfc2IsIFNfSUZSRUcgfCBTX0lSV1hVR08sIDApOwotCWlmICghaW5vZGUpCi0JCWdvdG8gY2xvc2VfZmlsZTsKLQotCWRfaW5zdGFudGlhdGUoZGVudHJ5LCBpbm9kZSk7Ci0JaW5vZGUtPmlfc2l6ZSA9IHNpemU7Ci0JaW5vZGUtPmlfbmxpbmsgPSAwOwkvKiBJdCBpcyB1bmxpbmtlZCAqLwotCWluaXRfZmlsZShmaWxlLCBzaG1fbW50LCBkZW50cnksIEZNT0RFX1dSSVRFIHwgRk1PREVfUkVBRCwKLQkJCSZyYW1mc19maWxlX29wZXJhdGlvbnMpOwotCi0jaWZuZGVmIENPTkZJR19NTVUKLQllcnJvciA9IHJhbWZzX25vbW11X2V4cGFuZF9mb3JfbWFwcGluZyhpbm9kZSwgc2l6ZSk7Ci0JaWYgKGVycm9yKQotCQlnb3RvIGNsb3NlX2ZpbGU7Ci0jZW5kaWYKLQlyZXR1cm4gZmlsZTsKLQotY2xvc2VfZmlsZToKLQlwdXRfZmlscChmaWxlKTsKLXB1dF9kZW50cnk6Ci0JZHB1dChkZW50cnkpOwotcHV0X21lbW9yeToKLQlyZXR1cm4gRVJSX1BUUihlcnJvcik7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChzaG1lbV9maWxlX3NldHVwKTsKLQotLyoqCi0gKiBzaG1lbV96ZXJvX3NldHVwIC0gc2V0dXAgYSBzaGFyZWQgYW5vbnltb3VzIG1hcHBpbmcKLSAqIEB2bWE6IHRoZSB2bWEgdG8gYmUgbW1hcHBlZCBpcyBwcmVwYXJlZCBieSBkb19tbWFwX3Bnb2ZmCi0gKi8KLWludCBzaG1lbV96ZXJvX3NldHVwKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQotewotCXN0cnVjdCBmaWxlICpmaWxlOwotCWxvZmZfdCBzaXplID0gdm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0OwotCi0JZmlsZSA9IHNobWVtX2ZpbGVfc2V0dXAoImRldi96ZXJvIiwgc2l6ZSwgdm1hLT52bV9mbGFncyk7Ci0JaWYgKElTX0VSUihmaWxlKSkKLQkJcmV0dXJuIFBUUl9FUlIoZmlsZSk7Ci0KLQlpZiAodm1hLT52bV9maWxlKQotCQlmcHV0KHZtYS0+dm1fZmlsZSk7Ci0Jdm1hLT52bV9maWxlID0gZmlsZTsKLQl2bWEtPnZtX29wcyA9ICZnZW5lcmljX2ZpbGVfdm1fb3BzOwotCXJldHVybiAwOwotfQotCi1pbnQgc2htZW1fdW51c2Uoc3dwX2VudHJ5X3QgZW50cnksIHN0cnVjdCBwYWdlICpwYWdlKQotewotCXJldHVybiAwOwotfQotCi0jaWZuZGVmIENPTkZJR19NTVUKLXVuc2lnbmVkIGxvbmcgc2htZW1fZ2V0X3VubWFwcGVkX2FyZWEoc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkJICAgICAgdW5zaWduZWQgbG9uZyBhZGRyLAotCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgbGVuLAotCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgcGdvZmYsCi0JCQkJICAgICAgdW5zaWduZWQgbG9uZyBmbGFncykKLXsKLQlyZXR1cm4gcmFtZnNfbm9tbXVfZ2V0X3VubWFwcGVkX2FyZWEoZmlsZSwgYWRkciwgbGVuLCBwZ29mZiwgZmxhZ3MpOwotfQotI2VuZGlmCmRpZmYgLS1naXQgYS9tbS92bWFsbG9jLmMgYi9tbS92bWFsbG9jLmMKaW5kZXggNzQ2NWYyMi4uYzVkYjlhNyAxMDA2NDQKLS0tIGEvbW0vdm1hbGxvYy5jCisrKyBiL21tL3ZtYWxsb2MuYwpAQCAtMTQsNiArMTQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgpAQCAtMzgxLDggKzM4Miw5IEBACiAJCQlnb3RvIHJldHJ5OwogCQl9CiAJCWlmIChwcmludGtfcmF0ZWxpbWl0KCkpCi0JCQlwcmludGsoS0VSTl9XQVJOSU5HICJ2bWFwIGFsbG9jYXRpb24gZmFpbGVkOiAiCi0JCQkJICJ1c2Ugdm1hbGxvYz08c2l6ZT4gdG8gaW5jcmVhc2Ugc2l6ZS5cbiIpOworCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJCSJ2bWFwIGFsbG9jYXRpb24gZm9yIHNpemUgJWx1IGZhaWxlZDogIgorCQkJCSJ1c2Ugdm1hbGxvYz08c2l6ZT4gdG8gaW5jcmVhc2Ugc2l6ZS5cbiIsIHNpemUpOwogCQlyZXR1cm4gRVJSX1BUUigtRUJVU1kpOwogCX0KIApAQCAtNDMyLDYgKzQzNCwyNyBAQAogCXZ1bm1hcF9wYWdlX3JhbmdlKHZhLT52YV9zdGFydCwgdmEtPnZhX2VuZCk7CiB9CiAKK3N0YXRpYyB2b2lkIHZtYXBfZGVidWdfZnJlZV9yYW5nZSh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCkKK3sKKwkvKgorCSAqIFVubWFwIHBhZ2UgdGFibGVzIGFuZCBmb3JjZSBhIFRMQiBmbHVzaCBpbW1lZGlhdGVseSBpZgorCSAqIENPTkZJR19ERUJVR19QQUdFQUxMT0MgaXMgc2V0LiBUaGlzIGNhdGNoZXMgdXNlIGFmdGVyIGZyZWUKKwkgKiBidWdzIHNpbWlsYXJseSB0byB0aG9zZSBpbiBsaW5lYXIga2VybmVsIHZpcnR1YWwgYWRkcmVzcworCSAqIHNwYWNlIGFmdGVyIGEgcGFnZSBoYXMgYmVlbiBmcmVlZC4KKwkgKgorCSAqIEFsbCB0aGUgbGF6eSBmcmVlaW5nIGxvZ2ljIGlzIHN0aWxsIHJldGFpbmVkLCBpbiBvcmRlciB0bworCSAqIG1pbmltaXNlIGludHJ1c2l2ZW5lc3Mgb2YgdGhpcyBkZWJ1Z2dpbmcgZmVhdHVyZS4KKwkgKgorCSAqIFRoaXMgaXMgZ29pbmcgdG8gYmUgKnNsb3cqIChsaW5lYXIga2VybmVsIHZpcnR1YWwgYWRkcmVzcworCSAqIGRlYnVnZ2luZyBkb2Vzbid0IGRvIGEgYnJvYWRjYXN0IFRMQiBmbHVzaCBzbyBpdCBpcyBhIGxvdAorCSAqIGZhc3RlcikuCisJICovCisjaWZkZWYgQ09ORklHX0RFQlVHX1BBR0VBTExPQworCXZ1bm1hcF9wYWdlX3JhbmdlKHN0YXJ0LCBlbmQpOworCWZsdXNoX3RsYl9rZXJuZWxfcmFuZ2Uoc3RhcnQsIGVuZCk7CisjZW5kaWYKK30KKwogLyoKICAqIGxhenlfbWF4X3BhZ2VzIGlzIHRoZSBtYXhpbXVtIGFtb3VudCBvZiB2aXJ0dWFsIGFkZHJlc3Mgc3BhY2Ugd2UgZ2F0aGVyIHVwCiAgKiBiZWZvcmUgYXR0ZW1wdGluZyB0byBwdXJnZSB3aXRoIGEgVExCIGZsdXNoLgpAQCAtNDcyLDcgKzQ5NSw3IEBACiBzdGF0aWMgdm9pZCBfX3B1cmdlX3ZtYXBfYXJlYV9sYXp5KHVuc2lnbmVkIGxvbmcgKnN0YXJ0LCB1bnNpZ25lZCBsb25nICplbmQsCiAJCQkJCWludCBzeW5jLCBpbnQgZm9yY2VfZmx1c2gpCiB7Ci0Jc3RhdGljIERFRklORV9TUElOTE9DSyhwdXJnZV9sb2NrKTsKKwlzdGF0aWMgREVGSU5FX01VVEVYKHB1cmdlX2xvY2spOwogCUxJU1RfSEVBRCh2YWxpc3QpOwogCXN0cnVjdCB2bWFwX2FyZWEgKnZhOwogCWludCBuciA9IDA7CkBAIC00ODMsMTAgKzUwNiwxMCBAQAogCSAqIHRoZSBjYXNlIHRoYXQgaXNuJ3QgYWN0dWFsbHkgdXNlZCBhdCB0aGUgbW9tZW50IGFueXdheS4KIAkgKi8KIAlpZiAoIXN5bmMgJiYgIWZvcmNlX2ZsdXNoKSB7Ci0JCWlmICghc3Bpbl90cnlsb2NrKCZwdXJnZV9sb2NrKSkKKwkJaWYgKCFtdXRleF90cnlsb2NrKCZwdXJnZV9sb2NrKSkKIAkJCXJldHVybjsKIAl9IGVsc2UKLQkJc3Bpbl9sb2NrKCZwdXJnZV9sb2NrKTsKKwkJbXV0ZXhfbG9jaygmcHVyZ2VfbG9jayk7CiAKIAlyY3VfcmVhZF9sb2NrKCk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UodmEsICZ2bWFwX2FyZWFfbGlzdCwgbGlzdCkgewpAQCAtNTE4LDcgKzU0MSw3IEBACiAJCQlfX2ZyZWVfdm1hcF9hcmVhKHZhKTsKIAkJc3Bpbl91bmxvY2soJnZtYXBfYXJlYV9sb2NrKTsKIAl9Ci0Jc3Bpbl91bmxvY2soJnB1cmdlX2xvY2spOworCW11dGV4X3VubG9jaygmcHVyZ2VfbG9jayk7CiB9CiAKIC8qCkBAIC05MTIsNiArOTM1LDcgQEAKIAlCVUdfT04oYWRkciAmIChQQUdFX1NJWkUtMSkpOwogCiAJZGVidWdfY2hlY2tfbm9fbG9ja3NfZnJlZWQobWVtLCBzaXplKTsKKwl2bWFwX2RlYnVnX2ZyZWVfcmFuZ2UoYWRkciwgYWRkcitzaXplKTsKIAogCWlmIChsaWtlbHkoY291bnQgPD0gVk1BUF9NQVhfQUxMT0MpKQogCQl2Yl9mcmVlKG1lbSwgc2l6ZSk7CkBAIC0xMTI4LDYgKzExNTIsOCBAQAogCWlmICh2YSAmJiB2YS0+ZmxhZ3MgJiBWTV9WTV9BUkVBKSB7CiAJCXN0cnVjdCB2bV9zdHJ1Y3QgKnZtID0gdmEtPnByaXZhdGU7CiAJCXN0cnVjdCB2bV9zdHJ1Y3QgKnRtcCwgKipwOworCisJCXZtYXBfZGVidWdfZnJlZV9yYW5nZSh2YS0+dmFfc3RhcnQsIHZhLT52YV9lbmQpOwogCQlmcmVlX3VubWFwX3ZtYXBfYXJlYSh2YSk7CiAJCXZtLT5zaXplIC09IFBBR0VfU0laRTsKIApAQCAtMTM3NSw3ICsxNDAxLDggQEAKIAlzdHJ1Y3Qgdm1fc3RydWN0ICphcmVhOwogCXZvaWQgKnJldDsKIAotCXJldCA9IF9fdm1hbGxvYyhzaXplLCBHRlBfS0VSTkVMIHwgX19HRlBfSElHSE1FTSB8IF9fR0ZQX1pFUk8sIFBBR0VfS0VSTkVMKTsKKwlyZXQgPSBfX3ZtYWxsb2Nfbm9kZShzaXplLCBHRlBfS0VSTkVMIHwgX19HRlBfSElHSE1FTSB8IF9fR0ZQX1pFUk8sCisJCQkgICAgIFBBR0VfS0VSTkVMLCAtMSwgX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApKTsKIAlpZiAocmV0KSB7CiAJCWFyZWEgPSBmaW5kX3ZtX2FyZWEocmV0KTsKIAkJYXJlYS0+ZmxhZ3MgfD0gVk1fVVNFUk1BUDsKQEAgLTE0MjAsNyArMTQ0Nyw4IEBACiAKIHZvaWQgKnZtYWxsb2NfZXhlYyh1bnNpZ25lZCBsb25nIHNpemUpCiB7Ci0JcmV0dXJuIF9fdm1hbGxvYyhzaXplLCBHRlBfS0VSTkVMIHwgX19HRlBfSElHSE1FTSwgUEFHRV9LRVJORUxfRVhFQyk7CisJcmV0dXJuIF9fdm1hbGxvY19ub2RlKHNpemUsIEdGUF9LRVJORUwgfCBfX0dGUF9ISUdITUVNLCBQQUdFX0tFUk5FTF9FWEVDLAorCQkJICAgICAgLTEsIF9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKSk7CiB9CiAKICNpZiBkZWZpbmVkKENPTkZJR182NEJJVCkgJiYgZGVmaW5lZChDT05GSUdfWk9ORV9ETUEzMikKQEAgLTE0NDAsNyArMTQ2OCw4IEBACiAgKi8KIHZvaWQgKnZtYWxsb2NfMzIodW5zaWduZWQgbG9uZyBzaXplKQogewotCXJldHVybiBfX3ZtYWxsb2Moc2l6ZSwgR0ZQX1ZNQUxMT0MzMiwgUEFHRV9LRVJORUwpOworCXJldHVybiBfX3ZtYWxsb2Nfbm9kZShzaXplLCBHRlBfVk1BTExPQzMyLCBQQUdFX0tFUk5FTCwKKwkJCSAgICAgIC0xLCBfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCkpOwogfQogRVhQT1JUX1NZTUJPTCh2bWFsbG9jXzMyKTsKIApAQCAtMTQ1Niw3ICsxNDg1LDggQEAKIAlzdHJ1Y3Qgdm1fc3RydWN0ICphcmVhOwogCXZvaWQgKnJldDsKIAotCXJldCA9IF9fdm1hbGxvYyhzaXplLCBHRlBfVk1BTExPQzMyIHwgX19HRlBfWkVSTywgUEFHRV9LRVJORUwpOworCXJldCA9IF9fdm1hbGxvY19ub2RlKHNpemUsIEdGUF9WTUFMTE9DMzIgfCBfX0dGUF9aRVJPLCBQQUdFX0tFUk5FTCwKKwkJCSAgICAgLTEsIF9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKSk7CiAJaWYgKHJldCkgewogCQlhcmVhID0gZmluZF92bV9hcmVhKHJldCk7CiAJCWFyZWEtPmZsYWdzIHw9IFZNX1VTRVJNQVA7CmRpZmYgLS1naXQgYS9tbS92bXNjYW4uYyBiL21tL3Ztc2Nhbi5jCmluZGV4IGQxOTZmNDYuLjlhMjdjNDQgMTAwNjQ0Ci0tLSBhL21tL3Ztc2Nhbi5jCisrKyBiL21tL3Ztc2Nhbi5jCkBAIC01Miw2ICs1Miw5IEBACiAJLyogSW5jcmVtZW50ZWQgYnkgdGhlIG51bWJlciBvZiBpbmFjdGl2ZSBwYWdlcyB0aGF0IHdlcmUgc2Nhbm5lZCAqLwogCXVuc2lnbmVkIGxvbmcgbnJfc2Nhbm5lZDsKIAorCS8qIE51bWJlciBvZiBwYWdlcyBmcmVlZCBzbyBmYXIgZHVyaW5nIGEgY2FsbCB0byBzaHJpbmtfem9uZXMoKSAqLworCXVuc2lnbmVkIGxvbmcgbnJfcmVjbGFpbWVkOworCiAJLyogVGhpcyBjb250ZXh0J3MgR0ZQIG1hc2sgKi8KIAlnZnBfdCBnZnBfbWFzazsKIApAQCAtMTIyLDExICsxMjUsMzAgQEAKIHN0YXRpYyBERUNMQVJFX1JXU0VNKHNocmlua2VyX3J3c2VtKTsKIAogI2lmZGVmIENPTkZJR19DR1JPVVBfTUVNX1JFU19DVExSCi0jZGVmaW5lIHNjYW5fZ2xvYmFsX2xydShzYykJKCEoc2MpLT5tZW1fY2dyb3VwKQorI2RlZmluZSBzY2FubmluZ19nbG9iYWxfbHJ1KHNjKQkoIShzYyktPm1lbV9jZ3JvdXApCiAjZWxzZQotI2RlZmluZSBzY2FuX2dsb2JhbF9scnUoc2MpCSgxKQorI2RlZmluZSBzY2FubmluZ19nbG9iYWxfbHJ1KHNjKQkoMSkKICNlbmRpZgogCitzdGF0aWMgc3RydWN0IHpvbmVfcmVjbGFpbV9zdGF0ICpnZXRfcmVjbGFpbV9zdGF0KHN0cnVjdCB6b25lICp6b25lLAorCQkJCQkJICBzdHJ1Y3Qgc2Nhbl9jb250cm9sICpzYykKK3sKKwlpZiAoIXNjYW5uaW5nX2dsb2JhbF9scnUoc2MpKQorCQlyZXR1cm4gbWVtX2Nncm91cF9nZXRfcmVjbGFpbV9zdGF0KHNjLT5tZW1fY2dyb3VwLCB6b25lKTsKKworCXJldHVybiAmem9uZS0+cmVjbGFpbV9zdGF0OworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyB6b25lX25yX3BhZ2VzKHN0cnVjdCB6b25lICp6b25lLCBzdHJ1Y3Qgc2Nhbl9jb250cm9sICpzYywKKwkJCQkgICBlbnVtIGxydV9saXN0IGxydSkKK3sKKwlpZiAoIXNjYW5uaW5nX2dsb2JhbF9scnUoc2MpKQorCQlyZXR1cm4gbWVtX2Nncm91cF96b25lX25yX3BhZ2VzKHNjLT5tZW1fY2dyb3VwLCB6b25lLCBscnUpOworCisJcmV0dXJuIHpvbmVfcGFnZV9zdGF0ZSh6b25lLCBOUl9MUlVfQkFTRSArIGxydSk7Cit9CisKKwogLyoKICAqIEFkZCBhIHNocmlua2VyIGNhbGxiYWNrIHRvIGJlIGNhbGxlZCBmcm9tIHRoZSB2bQogICovCkBAIC01MDksNyArNTMxLDYgQEAKIAkJbHJ1ID0gTFJVX1VORVZJQ1RBQkxFOwogCQlhZGRfcGFnZV90b191bmV2aWN0YWJsZV9saXN0KHBhZ2UpOwogCX0KLQltZW1fY2dyb3VwX21vdmVfbGlzdHMocGFnZSwgbHJ1KTsKIAogCS8qCiAJICogcGFnZSdzIHN0YXR1cyBjYW4gY2hhbmdlIHdoaWxlIHdlIG1vdmUgaXQgYW1vbmcgbHJ1LiBJZiBhbiBldmljdGFibGUKQEAgLTU0NCw3ICs1NjUsNiBAQAogCiAJbHJ1ID0gISFUZXN0Q2xlYXJQYWdlQWN0aXZlKHBhZ2UpICsgcGFnZV9pc19maWxlX2NhY2hlKHBhZ2UpOwogCWxydV9jYWNoZV9hZGRfbHJ1KHBhZ2UsIGxydSk7Ci0JbWVtX2Nncm91cF9tb3ZlX2xpc3RzKHBhZ2UsIGxydSk7CiAJcHV0X3BhZ2UocGFnZSk7CiB9CiAjZW5kaWYgLyogQ09ORklHX1VORVZJQ1RBQkxFX0xSVSAqLwpAQCAtNjE3LDcgKzYzNyw2IEBACiAJCQkJCXJlZmVyZW5jZWQgJiYgcGFnZV9tYXBwaW5nX2ludXNlKHBhZ2UpKQogCQkJZ290byBhY3RpdmF0ZV9sb2NrZWQ7CiAKLSNpZmRlZiBDT05GSUdfU1dBUAogCQkvKgogCQkgKiBBbm9ueW1vdXMgcHJvY2VzcyBtZW1vcnkgaGFzIGJhY2tpbmcgc3RvcmU/CiAJCSAqIFRyeSB0byBhbGxvY2F0ZSBpdCBzb21lIHN3YXAgc3BhY2UgaGVyZS4KQEAgLTYyNSwyMCArNjQ0LDEwIEBACiAJCWlmIChQYWdlQW5vbihwYWdlKSAmJiAhUGFnZVN3YXBDYWNoZShwYWdlKSkgewogCQkJaWYgKCEoc2MtPmdmcF9tYXNrICYgX19HRlBfSU8pKQogCQkJCWdvdG8ga2VlcF9sb2NrZWQ7Ci0JCQlzd2l0Y2ggKHRyeV90b19tdW5sb2NrKHBhZ2UpKSB7Ci0JCQljYXNlIFNXQVBfRkFJTDoJCS8qIHNob3VsZG4ndCBoYXBwZW4gKi8KLQkJCWNhc2UgU1dBUF9BR0FJTjoKLQkJCQlnb3RvIGtlZXBfbG9ja2VkOwotCQkJY2FzZSBTV0FQX01MT0NLOgotCQkJCWdvdG8gY3VsbF9tbG9ja2VkOwotCQkJY2FzZSBTV0FQX1NVQ0NFU1M6Ci0JCQkJOyAvKiBmYWxsIHRocnUnOyBhZGQgdG8gc3dhcCBjYWNoZSAqLwotCQkJfQotCQkJaWYgKCFhZGRfdG9fc3dhcChwYWdlLCBHRlBfQVRPTUlDKSkKKwkJCWlmICghYWRkX3RvX3N3YXAocGFnZSkpCiAJCQkJZ290byBhY3RpdmF0ZV9sb2NrZWQ7CiAJCQltYXlfZW50ZXJfZnMgPSAxOwogCQl9Ci0jZW5kaWYgLyogQ09ORklHX1NXQVAgKi8KIAogCQltYXBwaW5nID0gcGFnZV9tYXBwaW5nKHBhZ2UpOwogCkBAIC03NTIsNiArNzYxLDggQEAKIAkJY29udGludWU7CiAKIGN1bGxfbWxvY2tlZDoKKwkJaWYgKFBhZ2VTd2FwQ2FjaGUocGFnZSkpCisJCQl0cnlfdG9fZnJlZV9zd2FwKHBhZ2UpOwogCQl1bmxvY2tfcGFnZShwYWdlKTsKIAkJcHV0YmFja19scnVfcGFnZShwYWdlKTsKIAkJY29udGludWU7CkBAIC03NTksNyArNzcwLDcgQEAKIGFjdGl2YXRlX2xvY2tlZDoKIAkJLyogTm90IGEgY2FuZGlkYXRlIGZvciBzd2FwcGluZywgc28gcmVjbGFpbSBzd2FwIHNwYWNlLiAqLwogCQlpZiAoUGFnZVN3YXBDYWNoZShwYWdlKSAmJiB2bV9zd2FwX2Z1bGwoKSkKLQkJCXJlbW92ZV9leGNsdXNpdmVfc3dhcF9wYWdlX3JlZihwYWdlKTsKKwkJCXRyeV90b19mcmVlX3N3YXAocGFnZSk7CiAJCVZNX0JVR19PTihQYWdlQWN0aXZlKHBhZ2UpKTsKIAkJU2V0UGFnZUFjdGl2ZShwYWdlKTsKIAkJcGdhY3RpdmF0ZSsrOwpAQCAtODE5LDYgKzgzMCw3IEBACiAJCXJldHVybiByZXQ7CiAKIAlyZXQgPSAtRUJVU1k7CisKIAlpZiAobGlrZWx5KGdldF9wYWdlX3VubGVzc196ZXJvKHBhZ2UpKSkgewogCQkvKgogCQkgKiBCZSBjYXJlZnVsIG5vdCB0byBjbGVhciBQYWdlTFJVIHVudGlsIGFmdGVyIHdlJ3JlCkBAIC04MjcsNiArODM5LDcgQEAKIAkJICovCiAJCUNsZWFyUGFnZUxSVShwYWdlKTsKIAkJcmV0ID0gMDsKKwkJbWVtX2Nncm91cF9kZWxfbHJ1KHBhZ2UpOwogCX0KIAogCXJldHVybiByZXQ7CkBAIC0xMDM1LDYgKzEwNDgsNyBAQAogCXN0cnVjdCBwYWdldmVjIHB2ZWM7CiAJdW5zaWduZWQgbG9uZyBucl9zY2FubmVkID0gMDsKIAl1bnNpZ25lZCBsb25nIG5yX3JlY2xhaW1lZCA9IDA7CisJc3RydWN0IHpvbmVfcmVjbGFpbV9zdGF0ICpyZWNsYWltX3N0YXQgPSBnZXRfcmVjbGFpbV9zdGF0KHpvbmUsIHNjKTsKIAogCXBhZ2V2ZWNfaW5pdCgmcHZlYywgMSk7CiAKQEAgLTEwNzYsMTMgKzEwOTAsMTQgQEAKIAkJX19tb2Rfem9uZV9wYWdlX3N0YXRlKHpvbmUsIE5SX0lOQUNUSVZFX0FOT04sCiAJCQkJCQktY291bnRbTFJVX0lOQUNUSVZFX0FOT05dKTsKIAotCQlpZiAoc2Nhbl9nbG9iYWxfbHJ1KHNjKSkgeworCQlpZiAoc2Nhbm5pbmdfZ2xvYmFsX2xydShzYykpCiAJCQl6b25lLT5wYWdlc19zY2FubmVkICs9IG5yX3NjYW47Ci0JCQl6b25lLT5yZWNlbnRfc2Nhbm5lZFswXSArPSBjb3VudFtMUlVfSU5BQ1RJVkVfQU5PTl07Ci0JCQl6b25lLT5yZWNlbnRfc2Nhbm5lZFswXSArPSBjb3VudFtMUlVfQUNUSVZFX0FOT05dOwotCQkJem9uZS0+cmVjZW50X3NjYW5uZWRbMV0gKz0gY291bnRbTFJVX0lOQUNUSVZFX0ZJTEVdOwotCQkJem9uZS0+cmVjZW50X3NjYW5uZWRbMV0gKz0gY291bnRbTFJVX0FDVElWRV9GSUxFXTsKLQkJfQorCisJCXJlY2xhaW1fc3RhdC0+cmVjZW50X3NjYW5uZWRbMF0gKz0gY291bnRbTFJVX0lOQUNUSVZFX0FOT05dOworCQlyZWNsYWltX3N0YXQtPnJlY2VudF9zY2FubmVkWzBdICs9IGNvdW50W0xSVV9BQ1RJVkVfQU5PTl07CisJCXJlY2xhaW1fc3RhdC0+cmVjZW50X3NjYW5uZWRbMV0gKz0gY291bnRbTFJVX0lOQUNUSVZFX0ZJTEVdOworCQlyZWNsYWltX3N0YXQtPnJlY2VudF9zY2FubmVkWzFdICs9IGNvdW50W0xSVV9BQ1RJVkVfRklMRV07CisKIAkJc3Bpbl91bmxvY2tfaXJxKCZ6b25lLT5scnVfbG9jayk7CiAKIAkJbnJfc2Nhbm5lZCArPSBucl9zY2FuOwpAQCAtMTExNCw3ICsxMTI5LDcgQEAKIAkJaWYgKGN1cnJlbnRfaXNfa3N3YXBkKCkpIHsKIAkJCV9fY291bnRfem9uZV92bV9ldmVudHMoUEdTQ0FOX0tTV0FQRCwgem9uZSwgbnJfc2Nhbik7CiAJCQlfX2NvdW50X3ZtX2V2ZW50cyhLU1dBUERfU1RFQUwsIG5yX2ZyZWVkKTsKLQkJfSBlbHNlIGlmIChzY2FuX2dsb2JhbF9scnUoc2MpKQorCQl9IGVsc2UgaWYgKHNjYW5uaW5nX2dsb2JhbF9scnUoc2MpKQogCQkJX19jb3VudF96b25lX3ZtX2V2ZW50cyhQR1NDQU5fRElSRUNULCB6b25lLCBucl9zY2FuKTsKIAogCQlfX2NvdW50X3pvbmVfdm1fZXZlbnRzKFBHU1RFQUwsIHpvbmUsIG5yX2ZyZWVkKTsKQEAgLTExNDAsMTAgKzExNTUsOSBAQAogCQkJU2V0UGFnZUxSVShwYWdlKTsKIAkJCWxydSA9IHBhZ2VfbHJ1KHBhZ2UpOwogCQkJYWRkX3BhZ2VfdG9fbHJ1X2xpc3Qoem9uZSwgcGFnZSwgbHJ1KTsKLQkJCW1lbV9jZ3JvdXBfbW92ZV9saXN0cyhwYWdlLCBscnUpOwotCQkJaWYgKFBhZ2VBY3RpdmUocGFnZSkgJiYgc2Nhbl9nbG9iYWxfbHJ1KHNjKSkgeworCQkJaWYgKFBhZ2VBY3RpdmUocGFnZSkpIHsKIAkJCQlpbnQgZmlsZSA9ICEhcGFnZV9pc19maWxlX2NhY2hlKHBhZ2UpOwotCQkJCXpvbmUtPnJlY2VudF9yb3RhdGVkW2ZpbGVdKys7CisJCQkJcmVjbGFpbV9zdGF0LT5yZWNlbnRfcm90YXRlZFtmaWxlXSsrOwogCQkJfQogCQkJaWYgKCFwYWdldmVjX2FkZCgmcHZlYywgcGFnZSkpIHsKIAkJCQlzcGluX3VubG9ja19pcnEoJnpvbmUtPmxydV9sb2NrKTsKQEAgLTExNzMsMTEgKzExODcsNiBAQAogCQl6b25lLT5wcmV2X3ByaW9yaXR5ID0gcHJpb3JpdHk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IHpvbmVfaXNfbmVhcl9vb20oc3RydWN0IHpvbmUgKnpvbmUpCi17Ci0JcmV0dXJuIHpvbmUtPnBhZ2VzX3NjYW5uZWQgPj0gKHpvbmVfbHJ1X3BhZ2VzKHpvbmUpICogMyk7Ci19Ci0KIC8qCiAgKiBUaGlzIG1vdmVzIHBhZ2VzIGZyb20gdGhlIGFjdGl2ZSBsaXN0IHRvIHRoZSBpbmFjdGl2ZSBsaXN0LgogICoKQEAgLTEyMDgsNiArMTIxNyw3IEBACiAJc3RydWN0IHBhZ2UgKnBhZ2U7CiAJc3RydWN0IHBhZ2V2ZWMgcHZlYzsKIAllbnVtIGxydV9saXN0IGxydTsKKwlzdHJ1Y3Qgem9uZV9yZWNsYWltX3N0YXQgKnJlY2xhaW1fc3RhdCA9IGdldF9yZWNsYWltX3N0YXQoem9uZSwgc2MpOwogCiAJbHJ1X2FkZF9kcmFpbigpOwogCXNwaW5fbG9ja19pcnEoJnpvbmUtPmxydV9sb2NrKTsKQEAgLTEyMTgsMTAgKzEyMjgsMTAgQEAKIAkgKiB6b25lLT5wYWdlc19zY2FubmVkIGlzIHVzZWQgZm9yIGRldGVjdCB6b25lJ3Mgb29tCiAJICogbWVtX2Nncm91cCByZW1lbWJlcnMgbnJfc2NhbiBieSBpdHNlbGYuCiAJICovCi0JaWYgKHNjYW5fZ2xvYmFsX2xydShzYykpIHsKKwlpZiAoc2Nhbm5pbmdfZ2xvYmFsX2xydShzYykpIHsKIAkJem9uZS0+cGFnZXNfc2Nhbm5lZCArPSBwZ3NjYW5uZWQ7Ci0JCXpvbmUtPnJlY2VudF9zY2FubmVkWyEhZmlsZV0gKz0gcGdtb3ZlZDsKIAl9CisJcmVjbGFpbV9zdGF0LT5yZWNlbnRfc2Nhbm5lZFshIWZpbGVdICs9IHBnbW92ZWQ7CiAKIAlpZiAoZmlsZSkKIAkJX19tb2Rfem9uZV9wYWdlX3N0YXRlKHpvbmUsIE5SX0FDVElWRV9GSUxFLCAtcGdtb3ZlZCk7CkBAIC0xMjQ4LDYgKzEyNTgsMTMgQEAKIAkJbGlzdF9hZGQoJnBhZ2UtPmxydSwgJmxfaW5hY3RpdmUpOwogCX0KIAorCS8qCisJICogTW92ZSB0aGUgcGFnZXMgdG8gdGhlIFtmaWxlIG9yIGFub25dIGluYWN0aXZlIGxpc3QuCisJICovCisJcGFnZXZlY19pbml0KCZwdmVjLCAxKTsKKwlwZ21vdmVkID0gMDsKKwlscnUgPSBMUlVfQkFTRSArIGZpbGUgKiBMUlVfRklMRTsKKwogCXNwaW5fbG9ja19pcnEoJnpvbmUtPmxydV9sb2NrKTsKIAkvKgogCSAqIENvdW50IHJlZmVyZW5jZWQgcGFnZXMgZnJvbSBjdXJyZW50bHkgdXNlZCBtYXBwaW5ncyBhcwpAQCAtMTI1NSwxNSArMTI3Miw4IEBACiAJICogVGhpcyBoZWxwcyBiYWxhbmNlIHNjYW4gcHJlc3N1cmUgYmV0d2VlbiBmaWxlIGFuZCBhbm9ueW1vdXMKIAkgKiBwYWdlcyBpbiBnZXRfc2Nhbl9yYXRpby4KIAkgKi8KLQl6b25lLT5yZWNlbnRfcm90YXRlZFshIWZpbGVdICs9IHBnbW92ZWQ7CisJcmVjbGFpbV9zdGF0LT5yZWNlbnRfcm90YXRlZFshIWZpbGVdICs9IHBnbW92ZWQ7CiAKLQkvKgotCSAqIE1vdmUgdGhlIHBhZ2VzIHRvIHRoZSBbZmlsZSBvciBhbm9uXSBpbmFjdGl2ZSBsaXN0LgotCSAqLwotCXBhZ2V2ZWNfaW5pdCgmcHZlYywgMSk7Ci0KLQlwZ21vdmVkID0gMDsKLQlscnUgPSBMUlVfQkFTRSArIGZpbGUgKiBMUlVfRklMRTsKIAl3aGlsZSAoIWxpc3RfZW1wdHkoJmxfaW5hY3RpdmUpKSB7CiAJCXBhZ2UgPSBscnVfdG9fcGFnZSgmbF9pbmFjdGl2ZSk7CiAJCXByZWZldGNod19wcmV2X2xydV9wYWdlKHBhZ2UsICZsX2luYWN0aXZlLCBmbGFncyk7CkBAIC0xMjczLDcgKzEyODMsNyBAQAogCQlDbGVhclBhZ2VBY3RpdmUocGFnZSk7CiAKIAkJbGlzdF9tb3ZlKCZwYWdlLT5scnUsICZ6b25lLT5scnVbbHJ1XS5saXN0KTsKLQkJbWVtX2Nncm91cF9tb3ZlX2xpc3RzKHBhZ2UsIGxydSk7CisJCW1lbV9jZ3JvdXBfYWRkX2xydV9saXN0KHBhZ2UsIGxydSk7CiAJCXBnbW92ZWQrKzsKIAkJaWYgKCFwYWdldmVjX2FkZCgmcHZlYywgcGFnZSkpIHsKIAkJCV9fbW9kX3pvbmVfcGFnZV9zdGF0ZSh6b25lLCBOUl9MUlVfQkFTRSArIGxydSwgcGdtb3ZlZCk7CkBAIC0xMzAyLDYgKzEzMTIsMzggQEAKIAlwYWdldmVjX3JlbGVhc2UoJnB2ZWMpOwogfQogCitzdGF0aWMgaW50IGluYWN0aXZlX2Fub25faXNfbG93X2dsb2JhbChzdHJ1Y3Qgem9uZSAqem9uZSkKK3sKKwl1bnNpZ25lZCBsb25nIGFjdGl2ZSwgaW5hY3RpdmU7CisKKwlhY3RpdmUgPSB6b25lX3BhZ2Vfc3RhdGUoem9uZSwgTlJfQUNUSVZFX0FOT04pOworCWluYWN0aXZlID0gem9uZV9wYWdlX3N0YXRlKHpvbmUsIE5SX0lOQUNUSVZFX0FOT04pOworCisJaWYgKGluYWN0aXZlICogem9uZS0+aW5hY3RpdmVfcmF0aW8gPCBhY3RpdmUpCisJCXJldHVybiAxOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogaW5hY3RpdmVfYW5vbl9pc19sb3cgLSBjaGVjayBpZiBhbm9ueW1vdXMgcGFnZXMgbmVlZCB0byBiZSBkZWFjdGl2YXRlZAorICogQHpvbmU6IHpvbmUgdG8gY2hlY2sKKyAqIEBzYzogICBzY2FuIGNvbnRyb2wgb2YgdGhpcyBjb250ZXh0CisgKgorICogUmV0dXJucyB0cnVlIGlmIHRoZSB6b25lIGRvZXMgbm90IGhhdmUgZW5vdWdoIGluYWN0aXZlIGFub24gcGFnZXMsCisgKiBtZWFuaW5nIHNvbWUgYWN0aXZlIGFub24gcGFnZXMgbmVlZCB0byBiZSBkZWFjdGl2YXRlZC4KKyAqLworc3RhdGljIGludCBpbmFjdGl2ZV9hbm9uX2lzX2xvdyhzdHJ1Y3Qgem9uZSAqem9uZSwgc3RydWN0IHNjYW5fY29udHJvbCAqc2MpCit7CisJaW50IGxvdzsKKworCWlmIChzY2FubmluZ19nbG9iYWxfbHJ1KHNjKSkKKwkJbG93ID0gaW5hY3RpdmVfYW5vbl9pc19sb3dfZ2xvYmFsKHpvbmUpOworCWVsc2UKKwkJbG93ID0gbWVtX2Nncm91cF9pbmFjdGl2ZV9hbm9uX2lzX2xvdyhzYy0+bWVtX2Nncm91cCk7CisJcmV0dXJuIGxvdzsKK30KKwogc3RhdGljIHVuc2lnbmVkIGxvbmcgc2hyaW5rX2xpc3QoZW51bSBscnVfbGlzdCBscnUsIHVuc2lnbmVkIGxvbmcgbnJfdG9fc2NhbiwKIAlzdHJ1Y3Qgem9uZSAqem9uZSwgc3RydWN0IHNjYW5fY29udHJvbCAqc2MsIGludCBwcmlvcml0eSkKIHsKQEAgLTEzMTIsOCArMTM1NCw3IEBACiAJCXJldHVybiAwOwogCX0KIAotCWlmIChscnUgPT0gTFJVX0FDVElWRV9BTk9OICYmCi0JICAgICghc2Nhbl9nbG9iYWxfbHJ1KHNjKSB8fCBpbmFjdGl2ZV9hbm9uX2lzX2xvdyh6b25lKSkpIHsKKwlpZiAobHJ1ID09IExSVV9BQ1RJVkVfQU5PTiAmJiBpbmFjdGl2ZV9hbm9uX2lzX2xvdyh6b25lLCBzYykpIHsKIAkJc2hyaW5rX2FjdGl2ZV9saXN0KG5yX3RvX3NjYW4sIHpvbmUsIHNjLCBwcmlvcml0eSwgZmlsZSk7CiAJCXJldHVybiAwOwogCX0KQEAgLTEzMzUsMTIgKzEzNzYsNyBAQAogCXVuc2lnbmVkIGxvbmcgYW5vbiwgZmlsZSwgZnJlZTsKIAl1bnNpZ25lZCBsb25nIGFub25fcHJpbywgZmlsZV9wcmlvOwogCXVuc2lnbmVkIGxvbmcgYXAsIGZwOwotCi0JYW5vbiAgPSB6b25lX3BhZ2Vfc3RhdGUoem9uZSwgTlJfQUNUSVZFX0FOT04pICsKLQkJem9uZV9wYWdlX3N0YXRlKHpvbmUsIE5SX0lOQUNUSVZFX0FOT04pOwotCWZpbGUgID0gem9uZV9wYWdlX3N0YXRlKHpvbmUsIE5SX0FDVElWRV9GSUxFKSArCi0JCXpvbmVfcGFnZV9zdGF0ZSh6b25lLCBOUl9JTkFDVElWRV9GSUxFKTsKLQlmcmVlICA9IHpvbmVfcGFnZV9zdGF0ZSh6b25lLCBOUl9GUkVFX1BBR0VTKTsKKwlzdHJ1Y3Qgem9uZV9yZWNsYWltX3N0YXQgKnJlY2xhaW1fc3RhdCA9IGdldF9yZWNsYWltX3N0YXQoem9uZSwgc2MpOwogCiAJLyogSWYgd2UgaGF2ZSBubyBzd2FwIHNwYWNlLCBkbyBub3QgYm90aGVyIHNjYW5uaW5nIGFub24gcGFnZXMuICovCiAJaWYgKG5yX3N3YXBfcGFnZXMgPD0gMCkgewpAQCAtMTM0OSwxMSArMTM4NSwyMCBAQAogCQlyZXR1cm47CiAJfQogCi0JLyogSWYgd2UgaGF2ZSB2ZXJ5IGZldyBwYWdlIGNhY2hlIHBhZ2VzLCBmb3JjZS1zY2FuIGFub24gcGFnZXMuICovCi0JaWYgKHVubGlrZWx5KGZpbGUgKyBmcmVlIDw9IHpvbmUtPnBhZ2VzX2hpZ2gpKSB7Ci0JCXBlcmNlbnRbMF0gPSAxMDA7Ci0JCXBlcmNlbnRbMV0gPSAwOwotCQlyZXR1cm47CisJYW5vbiAgPSB6b25lX25yX3BhZ2VzKHpvbmUsIHNjLCBMUlVfQUNUSVZFX0FOT04pICsKKwkJem9uZV9ucl9wYWdlcyh6b25lLCBzYywgTFJVX0lOQUNUSVZFX0FOT04pOworCWZpbGUgID0gem9uZV9ucl9wYWdlcyh6b25lLCBzYywgTFJVX0FDVElWRV9GSUxFKSArCisJCXpvbmVfbnJfcGFnZXMoem9uZSwgc2MsIExSVV9JTkFDVElWRV9GSUxFKTsKKworCWlmIChzY2FubmluZ19nbG9iYWxfbHJ1KHNjKSkgeworCQlmcmVlICA9IHpvbmVfcGFnZV9zdGF0ZSh6b25lLCBOUl9GUkVFX1BBR0VTKTsKKwkJLyogSWYgd2UgaGF2ZSB2ZXJ5IGZldyBwYWdlIGNhY2hlIHBhZ2VzLAorCQkgICBmb3JjZS1zY2FuIGFub24gcGFnZXMuICovCisJCWlmICh1bmxpa2VseShmaWxlICsgZnJlZSA8PSB6b25lLT5wYWdlc19oaWdoKSkgeworCQkJcGVyY2VudFswXSA9IDEwMDsKKwkJCXBlcmNlbnRbMV0gPSAwOworCQkJcmV0dXJuOworCQl9CiAJfQogCiAJLyoKQEAgLTEzNjcsMTcgKzE0MTIsMTcgQEAKIAkgKgogCSAqIGFub24gaW4gWzBdLCBmaWxlIGluIFsxXQogCSAqLwotCWlmICh1bmxpa2VseSh6b25lLT5yZWNlbnRfc2Nhbm5lZFswXSA+IGFub24gLyA0KSkgeworCWlmICh1bmxpa2VseShyZWNsYWltX3N0YXQtPnJlY2VudF9zY2FubmVkWzBdID4gYW5vbiAvIDQpKSB7CiAJCXNwaW5fbG9ja19pcnEoJnpvbmUtPmxydV9sb2NrKTsKLQkJem9uZS0+cmVjZW50X3NjYW5uZWRbMF0gLz0gMjsKLQkJem9uZS0+cmVjZW50X3JvdGF0ZWRbMF0gLz0gMjsKKwkJcmVjbGFpbV9zdGF0LT5yZWNlbnRfc2Nhbm5lZFswXSAvPSAyOworCQlyZWNsYWltX3N0YXQtPnJlY2VudF9yb3RhdGVkWzBdIC89IDI7CiAJCXNwaW5fdW5sb2NrX2lycSgmem9uZS0+bHJ1X2xvY2spOwogCX0KIAotCWlmICh1bmxpa2VseSh6b25lLT5yZWNlbnRfc2Nhbm5lZFsxXSA+IGZpbGUgLyA0KSkgeworCWlmICh1bmxpa2VseShyZWNsYWltX3N0YXQtPnJlY2VudF9zY2FubmVkWzFdID4gZmlsZSAvIDQpKSB7CiAJCXNwaW5fbG9ja19pcnEoJnpvbmUtPmxydV9sb2NrKTsKLQkJem9uZS0+cmVjZW50X3NjYW5uZWRbMV0gLz0gMjsKLQkJem9uZS0+cmVjZW50X3JvdGF0ZWRbMV0gLz0gMjsKKwkJcmVjbGFpbV9zdGF0LT5yZWNlbnRfc2Nhbm5lZFsxXSAvPSAyOworCQlyZWNsYWltX3N0YXQtPnJlY2VudF9yb3RhdGVkWzFdIC89IDI7CiAJCXNwaW5fdW5sb2NrX2lycSgmem9uZS0+bHJ1X2xvY2spOwogCX0KIApAQCAtMTM5MywxMSArMTQzOCwxMSBAQAogCSAqIHByb3BvcnRpb25hbCB0byB0aGUgZnJhY3Rpb24gb2YgcmVjZW50bHkgc2Nhbm5lZCBwYWdlcyBvbgogCSAqIGVhY2ggbGlzdCB0aGF0IHdlcmUgcmVjZW50bHkgcmVmZXJlbmNlZCBhbmQgaW4gYWN0aXZlIHVzZS4KIAkgKi8KLQlhcCA9IChhbm9uX3ByaW8gKyAxKSAqICh6b25lLT5yZWNlbnRfc2Nhbm5lZFswXSArIDEpOwotCWFwIC89IHpvbmUtPnJlY2VudF9yb3RhdGVkWzBdICsgMTsKKwlhcCA9IChhbm9uX3ByaW8gKyAxKSAqIChyZWNsYWltX3N0YXQtPnJlY2VudF9zY2FubmVkWzBdICsgMSk7CisJYXAgLz0gcmVjbGFpbV9zdGF0LT5yZWNlbnRfcm90YXRlZFswXSArIDE7CiAKLQlmcCA9IChmaWxlX3ByaW8gKyAxKSAqICh6b25lLT5yZWNlbnRfc2Nhbm5lZFsxXSArIDEpOwotCWZwIC89IHpvbmUtPnJlY2VudF9yb3RhdGVkWzFdICsgMTsKKwlmcCA9IChmaWxlX3ByaW8gKyAxKSAqIChyZWNsYWltX3N0YXQtPnJlY2VudF9zY2FubmVkWzFdICsgMSk7CisJZnAgLz0gcmVjbGFpbV9zdGF0LT5yZWNlbnRfcm90YXRlZFsxXSArIDE7CiAKIAkvKiBOb3JtYWxpemUgdG8gcGVyY2VudGFnZXMgKi8KIAlwZXJjZW50WzBdID0gMTAwICogYXAgLyAoYXAgKyBmcCArIDEpOwpAQCAtMTQwOCw2OSArMTQ1Myw3MiBAQAogLyoKICAqIFRoaXMgaXMgYSBiYXNpYyBwZXItem9uZSBwYWdlIGZyZWVyLiAgVXNlZCBieSBib3RoIGtzd2FwZCBhbmQgZGlyZWN0IHJlY2xhaW0uCiAgKi8KLXN0YXRpYyB1bnNpZ25lZCBsb25nIHNocmlua196b25lKGludCBwcmlvcml0eSwgc3RydWN0IHpvbmUgKnpvbmUsCitzdGF0aWMgdm9pZCBzaHJpbmtfem9uZShpbnQgcHJpb3JpdHksIHN0cnVjdCB6b25lICp6b25lLAogCQkJCXN0cnVjdCBzY2FuX2NvbnRyb2wgKnNjKQogewogCXVuc2lnbmVkIGxvbmcgbnJbTlJfTFJVX0xJU1RTXTsKIAl1bnNpZ25lZCBsb25nIG5yX3RvX3NjYW47Ci0JdW5zaWduZWQgbG9uZyBucl9yZWNsYWltZWQgPSAwOwogCXVuc2lnbmVkIGxvbmcgcGVyY2VudFsyXTsJLyogYW5vbiBAIDA7IGZpbGUgQCAxICovCiAJZW51bSBscnVfbGlzdCBsOworCXVuc2lnbmVkIGxvbmcgbnJfcmVjbGFpbWVkID0gc2MtPm5yX3JlY2xhaW1lZDsKKwl1bnNpZ25lZCBsb25nIHN3YXBfY2x1c3Rlcl9tYXggPSBzYy0+c3dhcF9jbHVzdGVyX21heDsKIAogCWdldF9zY2FuX3JhdGlvKHpvbmUsIHNjLCBwZXJjZW50KTsKIAogCWZvcl9lYWNoX2V2aWN0YWJsZV9scnUobCkgewotCQlpZiAoc2Nhbl9nbG9iYWxfbHJ1KHNjKSkgewotCQkJaW50IGZpbGUgPSBpc19maWxlX2xydShsKTsKLQkJCWludCBzY2FuOworCQlpbnQgZmlsZSA9IGlzX2ZpbGVfbHJ1KGwpOworCQlpbnQgc2NhbjsKIAotCQkJc2NhbiA9IHpvbmVfcGFnZV9zdGF0ZSh6b25lLCBOUl9MUlVfQkFTRSArIGwpOwotCQkJaWYgKHByaW9yaXR5KSB7Ci0JCQkJc2NhbiA+Pj0gcHJpb3JpdHk7Ci0JCQkJc2NhbiA9IChzY2FuICogcGVyY2VudFtmaWxlXSkgLyAxMDA7Ci0JCQl9CisJCXNjYW4gPSB6b25lX3BhZ2Vfc3RhdGUoem9uZSwgTlJfTFJVX0JBU0UgKyBsKTsKKwkJaWYgKHByaW9yaXR5KSB7CisJCQlzY2FuID4+PSBwcmlvcml0eTsKKwkJCXNjYW4gPSAoc2NhbiAqIHBlcmNlbnRbZmlsZV0pIC8gMTAwOworCQl9CisJCWlmIChzY2FubmluZ19nbG9iYWxfbHJ1KHNjKSkgewogCQkJem9uZS0+bHJ1W2xdLm5yX3NjYW4gKz0gc2NhbjsKIAkJCW5yW2xdID0gem9uZS0+bHJ1W2xdLm5yX3NjYW47Ci0JCQlpZiAobnJbbF0gPj0gc2MtPnN3YXBfY2x1c3Rlcl9tYXgpCisJCQlpZiAobnJbbF0gPj0gc3dhcF9jbHVzdGVyX21heCkKIAkJCQl6b25lLT5scnVbbF0ubnJfc2NhbiA9IDA7CiAJCQllbHNlCiAJCQkJbnJbbF0gPSAwOwotCQl9IGVsc2UgewotCQkJLyoKLQkJCSAqIFRoaXMgcmVjbGFpbSBvY2N1cnMgbm90IGJlY2F1c2Ugem9uZSBtZW1vcnkgc2hvcnRhZ2UKLQkJCSAqIGJ1dCBiZWNhdXNlIG1lbW9yeSBjb250cm9sbGVyIGhpdHMgaXRzIGxpbWl0LgotCQkJICogRG9uJ3QgbW9kaWZ5IHpvbmUgcmVjbGFpbSByZWxhdGVkIGRhdGEuCi0JCQkgKi8KLQkJCW5yW2xdID0gbWVtX2Nncm91cF9jYWxjX3JlY2xhaW0oc2MtPm1lbV9jZ3JvdXAsIHpvbmUsCi0JCQkJCQkJCXByaW9yaXR5LCBsKTsKLQkJfQorCQl9IGVsc2UKKwkJCW5yW2xdID0gc2NhbjsKIAl9CiAKIAl3aGlsZSAobnJbTFJVX0lOQUNUSVZFX0FOT05dIHx8IG5yW0xSVV9BQ1RJVkVfRklMRV0gfHwKIAkJCQkJbnJbTFJVX0lOQUNUSVZFX0ZJTEVdKSB7CiAJCWZvcl9lYWNoX2V2aWN0YWJsZV9scnUobCkgewogCQkJaWYgKG5yW2xdKSB7Ci0JCQkJbnJfdG9fc2NhbiA9IG1pbihucltsXSwKLQkJCQkJKHVuc2lnbmVkIGxvbmcpc2MtPnN3YXBfY2x1c3Rlcl9tYXgpOworCQkJCW5yX3RvX3NjYW4gPSBtaW4obnJbbF0sIHN3YXBfY2x1c3Rlcl9tYXgpOwogCQkJCW5yW2xdIC09IG5yX3RvX3NjYW47CiAKIAkJCQlucl9yZWNsYWltZWQgKz0gc2hyaW5rX2xpc3QobCwgbnJfdG9fc2NhbiwKLQkJCQkJCQl6b25lLCBzYywgcHJpb3JpdHkpOworCQkJCQkJCSAgICB6b25lLCBzYywgcHJpb3JpdHkpOwogCQkJfQogCQl9CisJCS8qCisJCSAqIE9uIGxhcmdlIG1lbW9yeSBzeXN0ZW1zLCBzY2FuID4+IHByaW9yaXR5IGNhbiBiZWNvbWUKKwkJICogcmVhbGx5IGxhcmdlLiBUaGlzIGlzIGZpbmUgZm9yIHRoZSBzdGFydGluZyBwcmlvcml0eTsKKwkJICogd2Ugd2FudCB0byBwdXQgZXF1YWwgc2Nhbm5pbmcgcHJlc3N1cmUgb24gZWFjaCB6b25lLgorCQkgKiBIb3dldmVyLCBpZiB0aGUgVk0gaGFzIGEgaGFyZGVyIHRpbWUgb2YgZnJlZWluZyBwYWdlcywKKwkJICogd2l0aCBtdWx0aXBsZSBwcm9jZXNzZXMgcmVjbGFpbWluZyBwYWdlcywgdGhlIHRvdGFsCisJCSAqIGZyZWVpbmcgdGFyZ2V0IGNhbiBnZXQgdW5yZWFzb25hYmx5IGxhcmdlLgorCQkgKi8KKwkJaWYgKG5yX3JlY2xhaW1lZCA+IHN3YXBfY2x1c3Rlcl9tYXggJiYKKwkJCXByaW9yaXR5IDwgREVGX1BSSU9SSVRZICYmICFjdXJyZW50X2lzX2tzd2FwZCgpKQorCQkJYnJlYWs7CiAJfQogCisJc2MtPm5yX3JlY2xhaW1lZCA9IG5yX3JlY2xhaW1lZDsKKwogCS8qCiAJICogRXZlbiBpZiB3ZSBkaWQgbm90IHRyeSB0byBldmljdCBhbm9uIHBhZ2VzIGF0IGFsbCwgd2Ugd2FudCB0bwogCSAqIHJlYmFsYW5jZSB0aGUgYW5vbiBscnUgYWN0aXZlL2luYWN0aXZlIHJhdGlvLgogCSAqLwotCWlmICghc2Nhbl9nbG9iYWxfbHJ1KHNjKSB8fCBpbmFjdGl2ZV9hbm9uX2lzX2xvdyh6b25lKSkKLQkJc2hyaW5rX2FjdGl2ZV9saXN0KFNXQVBfQ0xVU1RFUl9NQVgsIHpvbmUsIHNjLCBwcmlvcml0eSwgMCk7Ci0JZWxzZSBpZiAoIXNjYW5fZ2xvYmFsX2xydShzYykpCisJaWYgKGluYWN0aXZlX2Fub25faXNfbG93KHpvbmUsIHNjKSkKIAkJc2hyaW5rX2FjdGl2ZV9saXN0KFNXQVBfQ0xVU1RFUl9NQVgsIHpvbmUsIHNjLCBwcmlvcml0eSwgMCk7CiAKIAl0aHJvdHRsZV92bV93cml0ZW91dChzYy0+Z2ZwX21hc2spOwotCXJldHVybiBucl9yZWNsYWltZWQ7CiB9CiAKIC8qCkBAIC0xNDg0LDE2ICsxNTMyLDEzIEBACiAgKiBiKSBUaGUgem9uZXMgbWF5IGJlIG92ZXIgcGFnZXNfaGlnaCBidXQgdGhleSBtdXN0IGdvICpvdmVyKiBwYWdlc19oaWdoIHRvCiAgKiAgICBzYXRpc2Z5IHRoZSBgaW5jcmVtZW50YWwgbWluJyB6b25lIGRlZmVuc2UgYWxnb3JpdGhtLgogICoKLSAqIFJldHVybnMgdGhlIG51bWJlciBvZiByZWNsYWltZWQgcGFnZXMuCi0gKgogICogSWYgYSB6b25lIGlzIGRlZW1lZCB0byBiZSBmdWxsIG9mIHBpbm5lZCBwYWdlcyB0aGVuIGp1c3QgZ2l2ZSBpdCBhIGxpZ2h0CiAgKiBzY2FuIHRoZW4gZ2l2ZSB1cCBvbiBpdC4KICAqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcgc2hyaW5rX3pvbmVzKGludCBwcmlvcml0eSwgc3RydWN0IHpvbmVsaXN0ICp6b25lbGlzdCwKK3N0YXRpYyB2b2lkIHNocmlua196b25lcyhpbnQgcHJpb3JpdHksIHN0cnVjdCB6b25lbGlzdCAqem9uZWxpc3QsCiAJCQkJCXN0cnVjdCBzY2FuX2NvbnRyb2wgKnNjKQogewogCWVudW0gem9uZV90eXBlIGhpZ2hfem9uZWlkeCA9IGdmcF96b25lKHNjLT5nZnBfbWFzayk7Ci0JdW5zaWduZWQgbG9uZyBucl9yZWNsYWltZWQgPSAwOwogCXN0cnVjdCB6b25lcmVmICp6OwogCXN0cnVjdCB6b25lICp6b25lOwogCkBAIC0xNTA1LDcgKzE1NTAsNyBAQAogCQkgKiBUYWtlIGNhcmUgbWVtb3J5IGNvbnRyb2xsZXIgcmVjbGFpbWluZyBoYXMgc21hbGwgaW5mbHVlbmNlCiAJCSAqIHRvIGdsb2JhbCBMUlUuCiAJCSAqLwotCQlpZiAoc2Nhbl9nbG9iYWxfbHJ1KHNjKSkgeworCQlpZiAoc2Nhbm5pbmdfZ2xvYmFsX2xydShzYykpIHsKIAkJCWlmICghY3B1c2V0X3pvbmVfYWxsb3dlZF9oYXJkd2FsbCh6b25lLCBHRlBfS0VSTkVMKSkKIAkJCQljb250aW51ZTsKIAkJCW5vdGVfem9uZV9zY2FubmluZ19wcmlvcml0eSh6b25lLCBwcmlvcml0eSk7CkBAIC0xNTI0LDEwICsxNTY5LDggQEAKIAkJCQkJCQlwcmlvcml0eSk7CiAJCX0KIAotCQlucl9yZWNsYWltZWQgKz0gc2hyaW5rX3pvbmUocHJpb3JpdHksIHpvbmUsIHNjKTsKKwkJc2hyaW5rX3pvbmUocHJpb3JpdHksIHpvbmUsIHNjKTsKIAl9Ci0KLQlyZXR1cm4gbnJfcmVjbGFpbWVkOwogfQogCiAvKgpAQCAtMTU1Miw3ICsxNTk1LDYgQEAKIAlpbnQgcHJpb3JpdHk7CiAJdW5zaWduZWQgbG9uZyByZXQgPSAwOwogCXVuc2lnbmVkIGxvbmcgdG90YWxfc2Nhbm5lZCA9IDA7Ci0JdW5zaWduZWQgbG9uZyBucl9yZWNsYWltZWQgPSAwOwogCXN0cnVjdCByZWNsYWltX3N0YXRlICpyZWNsYWltX3N0YXRlID0gY3VycmVudC0+cmVjbGFpbV9zdGF0ZTsKIAl1bnNpZ25lZCBsb25nIGxydV9wYWdlcyA9IDA7CiAJc3RydWN0IHpvbmVyZWYgKno7CkBAIC0xNTYxLDEyICsxNjAzLDEyIEBACiAKIAlkZWxheWFjY3RfZnJlZXBhZ2VzX3N0YXJ0KCk7CiAKLQlpZiAoc2Nhbl9nbG9iYWxfbHJ1KHNjKSkKKwlpZiAoc2Nhbm5pbmdfZ2xvYmFsX2xydShzYykpCiAJCWNvdW50X3ZtX2V2ZW50KEFMTE9DU1RBTEwpOwogCS8qCiAJICogbWVtX2Nncm91cCB3aWxsIG5vdCBkbyBzaHJpbmtfc2xhYi4KIAkgKi8KLQlpZiAoc2Nhbl9nbG9iYWxfbHJ1KHNjKSkgeworCWlmIChzY2FubmluZ19nbG9iYWxfbHJ1KHNjKSkgewogCQlmb3JfZWFjaF96b25lX3pvbmVsaXN0KHpvbmUsIHosIHpvbmVsaXN0LCBoaWdoX3pvbmVpZHgpIHsKIAogCQkJaWYgKCFjcHVzZXRfem9uZV9hbGxvd2VkX2hhcmR3YWxsKHpvbmUsIEdGUF9LRVJORUwpKQpAQCAtMTU4MCwyMSArMTYyMiwyMSBAQAogCQlzYy0+bnJfc2Nhbm5lZCA9IDA7CiAJCWlmICghcHJpb3JpdHkpCiAJCQlkaXNhYmxlX3N3YXBfdG9rZW4oKTsKLQkJbnJfcmVjbGFpbWVkICs9IHNocmlua196b25lcyhwcmlvcml0eSwgem9uZWxpc3QsIHNjKTsKKwkJc2hyaW5rX3pvbmVzKHByaW9yaXR5LCB6b25lbGlzdCwgc2MpOwogCQkvKgogCQkgKiBEb24ndCBzaHJpbmsgc2xhYnMgd2hlbiByZWNsYWltaW5nIG1lbW9yeSBmcm9tCiAJCSAqIG92ZXIgbGltaXQgY2dyb3VwcwogCQkgKi8KLQkJaWYgKHNjYW5fZ2xvYmFsX2xydShzYykpIHsKKwkJaWYgKHNjYW5uaW5nX2dsb2JhbF9scnUoc2MpKSB7CiAJCQlzaHJpbmtfc2xhYihzYy0+bnJfc2Nhbm5lZCwgc2MtPmdmcF9tYXNrLCBscnVfcGFnZXMpOwogCQkJaWYgKHJlY2xhaW1fc3RhdGUpIHsKLQkJCQlucl9yZWNsYWltZWQgKz0gcmVjbGFpbV9zdGF0ZS0+cmVjbGFpbWVkX3NsYWI7CisJCQkJc2MtPm5yX3JlY2xhaW1lZCArPSByZWNsYWltX3N0YXRlLT5yZWNsYWltZWRfc2xhYjsKIAkJCQlyZWNsYWltX3N0YXRlLT5yZWNsYWltZWRfc2xhYiA9IDA7CiAJCQl9CiAJCX0KIAkJdG90YWxfc2Nhbm5lZCArPSBzYy0+bnJfc2Nhbm5lZDsKLQkJaWYgKG5yX3JlY2xhaW1lZCA+PSBzYy0+c3dhcF9jbHVzdGVyX21heCkgewotCQkJcmV0ID0gbnJfcmVjbGFpbWVkOworCQlpZiAoc2MtPm5yX3JlY2xhaW1lZCA+PSBzYy0+c3dhcF9jbHVzdGVyX21heCkgeworCQkJcmV0ID0gc2MtPm5yX3JlY2xhaW1lZDsKIAkJCWdvdG8gb3V0OwogCQl9CiAKQEAgLTE2MTYsOCArMTY1OCw4IEBACiAJCQljb25nZXN0aW9uX3dhaXQoV1JJVEUsIEhaLzEwKTsKIAl9CiAJLyogdG9wIHByaW9yaXR5IHNocmlua196b25lcyBzdGlsbCBoYWQgbW9yZSB0byBkbz8gZG9uJ3QgT09NLCB0aGVuICovCi0JaWYgKCFzYy0+YWxsX3VucmVjbGFpbWFibGUgJiYgc2Nhbl9nbG9iYWxfbHJ1KHNjKSkKLQkJcmV0ID0gbnJfcmVjbGFpbWVkOworCWlmICghc2MtPmFsbF91bnJlY2xhaW1hYmxlICYmIHNjYW5uaW5nX2dsb2JhbF9scnUoc2MpKQorCQlyZXQgPSBzYy0+bnJfcmVjbGFpbWVkOwogb3V0OgogCS8qCiAJICogTm93IHRoYXQgd2UndmUgc2Nhbm5lZCBhbGwgdGhlIHpvbmVzIGF0IHRoaXMgcHJpb3JpdHkgbGV2ZWwsIG5vdGUKQEAgLTE2MjksNyArMTY3MSw3IEBACiAJaWYgKHByaW9yaXR5IDwgMCkKIAkJcHJpb3JpdHkgPSAwOwogCi0JaWYgKHNjYW5fZ2xvYmFsX2xydShzYykpIHsKKwlpZiAoc2Nhbm5pbmdfZ2xvYmFsX2xydShzYykpIHsKIAkJZm9yX2VhY2hfem9uZV96b25lbGlzdCh6b25lLCB6LCB6b25lbGlzdCwgaGlnaF96b25laWR4KSB7CiAKIAkJCWlmICghY3B1c2V0X3pvbmVfYWxsb3dlZF9oYXJkd2FsbCh6b25lLCBHRlBfS0VSTkVMKSkKQEAgLTE2NjUsMTkgKzE3MDcsMjQgQEAKICNpZmRlZiBDT05GSUdfQ0dST1VQX01FTV9SRVNfQ1RMUgogCiB1bnNpZ25lZCBsb25nIHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbV9jb250LAotCQkJCQkJZ2ZwX3QgZ2ZwX21hc2spCisJCQkJCSAgIGdmcF90IGdmcF9tYXNrLAorCQkJCQkgICBib29sIG5vc3dhcCwKKwkJCQkJICAgdW5zaWduZWQgaW50IHN3YXBwaW5lc3MpCiB7CiAJc3RydWN0IHNjYW5fY29udHJvbCBzYyA9IHsKIAkJLm1heV93cml0ZXBhZ2UgPSAhbGFwdG9wX21vZGUsCiAJCS5tYXlfc3dhcCA9IDEsCiAJCS5zd2FwX2NsdXN0ZXJfbWF4ID0gU1dBUF9DTFVTVEVSX01BWCwKLQkJLnN3YXBwaW5lc3MgPSB2bV9zd2FwcGluZXNzLAorCQkuc3dhcHBpbmVzcyA9IHN3YXBwaW5lc3MsCiAJCS5vcmRlciA9IDAsCiAJCS5tZW1fY2dyb3VwID0gbWVtX2NvbnQsCiAJCS5pc29sYXRlX3BhZ2VzID0gbWVtX2Nncm91cF9pc29sYXRlX3BhZ2VzLAogCX07CiAJc3RydWN0IHpvbmVsaXN0ICp6b25lbGlzdDsKIAorCWlmIChub3N3YXApCisJCXNjLm1heV9zd2FwID0gMDsKKwogCXNjLmdmcF9tYXNrID0gKGdmcF9tYXNrICYgR0ZQX1JFQ0xBSU1fTUFTSykgfAogCQkJKEdGUF9ISUdIVVNFUl9NT1ZBQkxFICYgfkdGUF9SRUNMQUlNX01BU0spOwogCXpvbmVsaXN0ID0gTk9ERV9EQVRBKG51bWFfbm9kZV9pZCgpKS0+bm9kZV96b25lbGlzdHM7CkBAIC0xNzEyLDcgKzE3NTksNiBAQAogCWludCBwcmlvcml0eTsKIAlpbnQgaTsKIAl1bnNpZ25lZCBsb25nIHRvdGFsX3NjYW5uZWQ7Ci0JdW5zaWduZWQgbG9uZyBucl9yZWNsYWltZWQ7CiAJc3RydWN0IHJlY2xhaW1fc3RhdGUgKnJlY2xhaW1fc3RhdGUgPSBjdXJyZW50LT5yZWNsYWltX3N0YXRlOwogCXN0cnVjdCBzY2FuX2NvbnRyb2wgc2MgPSB7CiAJCS5nZnBfbWFzayA9IEdGUF9LRVJORUwsCkBAIC0xNzMxLDcgKzE3NzcsNyBAQAogCiBsb29wX2FnYWluOgogCXRvdGFsX3NjYW5uZWQgPSAwOwotCW5yX3JlY2xhaW1lZCA9IDA7CisJc2MubnJfcmVjbGFpbWVkID0gMDsKIAlzYy5tYXlfd3JpdGVwYWdlID0gIWxhcHRvcF9tb2RlOwogCWNvdW50X3ZtX2V2ZW50KFBBR0VPVVRSVU4pOwogCkBAIC0xNzY2LDcgKzE4MTIsNyBAQAogCQkJICogRG8gc29tZSBiYWNrZ3JvdW5kIGFnaW5nIG9mIHRoZSBhbm9uIGxpc3QsIHRvIGdpdmUKIAkJCSAqIHBhZ2VzIGEgY2hhbmNlIHRvIGJlIHJlZmVyZW5jZWQgYmVmb3JlIHJlY2xhaW1pbmcuCiAJCQkgKi8KLQkJCWlmIChpbmFjdGl2ZV9hbm9uX2lzX2xvdyh6b25lKSkKKwkJCWlmIChpbmFjdGl2ZV9hbm9uX2lzX2xvdyh6b25lLCAmc2MpKQogCQkJCXNocmlua19hY3RpdmVfbGlzdChTV0FQX0NMVVNURVJfTUFYLCB6b25lLAogCQkJCQkJCSZzYywgcHJpb3JpdHksIDApOwogCkBAIC0xODE3LDExICsxODYzLDExIEBACiAJCQkgKi8KIAkJCWlmICghem9uZV93YXRlcm1hcmtfb2soem9uZSwgb3JkZXIsIDgqem9uZS0+cGFnZXNfaGlnaCwKIAkJCQkJCWVuZF96b25lLCAwKSkKLQkJCQlucl9yZWNsYWltZWQgKz0gc2hyaW5rX3pvbmUocHJpb3JpdHksIHpvbmUsICZzYyk7CisJCQkJc2hyaW5rX3pvbmUocHJpb3JpdHksIHpvbmUsICZzYyk7CiAJCQlyZWNsYWltX3N0YXRlLT5yZWNsYWltZWRfc2xhYiA9IDA7CiAJCQlucl9zbGFiID0gc2hyaW5rX3NsYWIoc2MubnJfc2Nhbm5lZCwgR0ZQX0tFUk5FTCwKIAkJCQkJCWxydV9wYWdlcyk7Ci0JCQlucl9yZWNsYWltZWQgKz0gcmVjbGFpbV9zdGF0ZS0+cmVjbGFpbWVkX3NsYWI7CisJCQlzYy5ucl9yZWNsYWltZWQgKz0gcmVjbGFpbV9zdGF0ZS0+cmVjbGFpbWVkX3NsYWI7CiAJCQl0b3RhbF9zY2FubmVkICs9IHNjLm5yX3NjYW5uZWQ7CiAJCQlpZiAoem9uZV9pc19hbGxfdW5yZWNsYWltYWJsZSh6b25lKSkKIAkJCQljb250aW51ZTsKQEAgLTE4MzUsNyArMTg4MSw3IEBACiAJCQkgKiBldmVuIGluIGxhcHRvcCBtb2RlCiAJCQkgKi8KIAkJCWlmICh0b3RhbF9zY2FubmVkID4gU1dBUF9DTFVTVEVSX01BWCAqIDIgJiYKLQkJCSAgICB0b3RhbF9zY2FubmVkID4gbnJfcmVjbGFpbWVkICsgbnJfcmVjbGFpbWVkIC8gMikKKwkJCSAgICB0b3RhbF9zY2FubmVkID4gc2MubnJfcmVjbGFpbWVkICsgc2MubnJfcmVjbGFpbWVkIC8gMikKIAkJCQlzYy5tYXlfd3JpdGVwYWdlID0gMTsKIAkJfQogCQlpZiAoYWxsX3pvbmVzX29rKQpAQCAtMTg1Myw3ICsxODk5LDcgQEAKIAkJICogbWF0Y2hlcyB0aGUgZGlyZWN0IHJlY2xhaW0gcGF0aCBiZWhhdmlvdXIgaW4gdGVybXMgb2YgaW1wYWN0CiAJCSAqIG9uIHpvbmUtPipfcHJpb3JpdHkuCiAJCSAqLwotCQlpZiAobnJfcmVjbGFpbWVkID49IFNXQVBfQ0xVU1RFUl9NQVgpCisJCWlmIChzYy5ucl9yZWNsYWltZWQgPj0gU1dBUF9DTFVTVEVSX01BWCkKIAkJCWJyZWFrOwogCX0KIG91dDoKQEAgLTE4NzIsMTAgKzE5MTgsMjcgQEAKIAogCQl0cnlfdG9fZnJlZXplKCk7CiAKKwkJLyoKKwkJICogRnJhZ21lbnRhdGlvbiBtYXkgbWVhbiB0aGF0IHRoZSBzeXN0ZW0gY2Fubm90IGJlCisJCSAqIHJlYmFsYW5jZWQgZm9yIGhpZ2gtb3JkZXIgYWxsb2NhdGlvbnMgaW4gYWxsIHpvbmVzLgorCQkgKiBBdCB0aGlzIHBvaW50LCBpZiBucl9yZWNsYWltZWQgPCBTV0FQX0NMVVNURVJfTUFYLAorCQkgKiBpdCBtZWFucyB0aGUgem9uZXMgaGF2ZSBiZWVuIGZ1bGx5IHNjYW5uZWQgYW5kIGFyZSBzdGlsbAorCQkgKiBub3QgYmFsYW5jZWQuIEZvciBoaWdoLW9yZGVyIGFsbG9jYXRpb25zLCB0aGVyZSBpcworCQkgKiBsaXR0bGUgcG9pbnQgdHJ5aW5nIGFsbCBvdmVyIGFnYWluIGFzIGtzd2FwZCBtYXkKKwkJICogaW5maW5pdGUgbG9vcC4KKwkJICoKKwkJICogSW5zdGVhZCwgcmVjaGVjayBhbGwgd2F0ZXJtYXJrcyBhdCBvcmRlci0wIGFzIHRoZXkKKwkJICogYXJlIHRoZSBtb3N0IGltcG9ydGFudC4gSWYgd2F0ZXJtYXJrcyBhcmUgb2ssIGtzd2FwZCB3aWxsIGdvCisJCSAqIGJhY2sgdG8gc2xlZXAuIEhpZ2gtb3JkZXIgdXNlcnMgY2FuIHN0aWxsIHBlcmZvcm0gZGlyZWN0CisJCSAqIHJlY2xhaW0gaWYgdGhleSB3aXNoLgorCQkgKi8KKwkJaWYgKHNjLm5yX3JlY2xhaW1lZCA8IFNXQVBfQ0xVU1RFUl9NQVgpCisJCQlvcmRlciA9IHNjLm9yZGVyID0gMDsKKwogCQlnb3RvIGxvb3BfYWdhaW47CiAJfQogCi0JcmV0dXJuIG5yX3JlY2xhaW1lZDsKKwlyZXR1cm4gc2MubnJfcmVjbGFpbWVkOwogfQogCiAvKgpAQCAtMjIyNyw3ICsyMjkwLDYgQEAKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAgPSBjdXJyZW50OwogCXN0cnVjdCByZWNsYWltX3N0YXRlIHJlY2xhaW1fc3RhdGU7CiAJaW50IHByaW9yaXR5OwotCXVuc2lnbmVkIGxvbmcgbnJfcmVjbGFpbWVkID0gMDsKIAlzdHJ1Y3Qgc2Nhbl9jb250cm9sIHNjID0gewogCQkubWF5X3dyaXRlcGFnZSA9ICEhKHpvbmVfcmVjbGFpbV9tb2RlICYgUkVDTEFJTV9XUklURSksCiAJCS5tYXlfc3dhcCA9ICEhKHpvbmVfcmVjbGFpbV9tb2RlICYgUkVDTEFJTV9TV0FQKSwKQEAgLTIyNjAsOSArMjMyMiw5IEBACiAJCXByaW9yaXR5ID0gWk9ORV9SRUNMQUlNX1BSSU9SSVRZOwogCQlkbyB7CiAJCQlub3RlX3pvbmVfc2Nhbm5pbmdfcHJpb3JpdHkoem9uZSwgcHJpb3JpdHkpOwotCQkJbnJfcmVjbGFpbWVkICs9IHNocmlua196b25lKHByaW9yaXR5LCB6b25lLCAmc2MpOworCQkJc2hyaW5rX3pvbmUocHJpb3JpdHksIHpvbmUsICZzYyk7CiAJCQlwcmlvcml0eS0tOwotCQl9IHdoaWxlIChwcmlvcml0eSA+PSAwICYmIG5yX3JlY2xhaW1lZCA8IG5yX3BhZ2VzKTsKKwkJfSB3aGlsZSAocHJpb3JpdHkgPj0gMCAmJiBzYy5ucl9yZWNsYWltZWQgPCBucl9wYWdlcyk7CiAJfQogCiAJc2xhYl9yZWNsYWltYWJsZSA9IHpvbmVfcGFnZV9zdGF0ZSh6b25lLCBOUl9TTEFCX1JFQ0xBSU1BQkxFKTsKQEAgLTIyODYsMTMgKzIzNDgsMTMgQEAKIAkJICogVXBkYXRlIG5yX3JlY2xhaW1lZCBieSB0aGUgbnVtYmVyIG9mIHNsYWIgcGFnZXMgd2UKIAkJICogcmVjbGFpbWVkIGZyb20gdGhpcyB6b25lLgogCQkgKi8KLQkJbnJfcmVjbGFpbWVkICs9IHNsYWJfcmVjbGFpbWFibGUgLQorCQlzYy5ucl9yZWNsYWltZWQgKz0gc2xhYl9yZWNsYWltYWJsZSAtCiAJCQl6b25lX3BhZ2Vfc3RhdGUoem9uZSwgTlJfU0xBQl9SRUNMQUlNQUJMRSk7CiAJfQogCiAJcC0+cmVjbGFpbV9zdGF0ZSA9IE5VTEw7CiAJY3VycmVudC0+ZmxhZ3MgJj0gfihQRl9NRU1BTExPQyB8IFBGX1NXQVBXUklURSk7Ci0JcmV0dXJuIG5yX3JlY2xhaW1lZCA+PSBucl9wYWdlczsKKwlyZXR1cm4gc2MubnJfcmVjbGFpbWVkID49IG5yX3BhZ2VzOwogfQogCiBpbnQgem9uZV9yZWNsYWltKHN0cnVjdCB6b25lICp6b25lLCBnZnBfdCBnZnBfbWFzaywgdW5zaWduZWQgaW50IG9yZGVyKQpAQCAtMjM5Myw2ICsyNDU1LDcgQEAKIAogCQlfX2RlY196b25lX3N0YXRlKHpvbmUsIE5SX1VORVZJQ1RBQkxFKTsKIAkJbGlzdF9tb3ZlKCZwYWdlLT5scnUsICZ6b25lLT5scnVbbF0ubGlzdCk7CisJCW1lbV9jZ3JvdXBfbW92ZV9saXN0cyhwYWdlLCBMUlVfVU5FVklDVEFCTEUsIGwpOwogCQlfX2luY196b25lX3N0YXRlKHpvbmUsIE5SX0lOQUNUSVZFX0FOT04gKyBsKTsKIAkJX19jb3VudF92bV9ldmVudChVTkVWSUNUQUJMRV9QR1JFU0NVRUQpOwogCX0gZWxzZSB7CkBAIC0yNDAxLDYgKzI0NjQsNyBAQAogCQkgKi8KIAkJU2V0UGFnZVVuZXZpY3RhYmxlKHBhZ2UpOwogCQlsaXN0X21vdmUoJnBhZ2UtPmxydSwgJnpvbmUtPmxydVtMUlVfVU5FVklDVEFCTEVdLmxpc3QpOworCQltZW1fY2dyb3VwX3JvdGF0ZV9scnVfbGlzdChwYWdlLCBMUlVfVU5FVklDVEFCTEUpOwogCQlpZiAocGFnZV9ldmljdGFibGUocGFnZSwgTlVMTCkpCiAJCQlnb3RvIHJldHJ5OwogCX0KQEAgLTI0NzIsNyArMjUzNiw3IEBACiAgKiBiYWNrIG9udG8gQHpvbmUncyB1bmV2aWN0YWJsZSBsaXN0LgogICovCiAjZGVmaW5lIFNDQU5fVU5FVklDVEFCTEVfQkFUQ0hfU0laRSAxNlVMIC8qIGFyYml0cmFyeSBsb2NrIGhvbGQgYmF0Y2ggc2l6ZSAqLwotdm9pZCBzY2FuX3pvbmVfdW5ldmljdGFibGVfcGFnZXMoc3RydWN0IHpvbmUgKnpvbmUpCitzdGF0aWMgdm9pZCBzY2FuX3pvbmVfdW5ldmljdGFibGVfcGFnZXMoc3RydWN0IHpvbmUgKnpvbmUpCiB7CiAJc3RydWN0IGxpc3RfaGVhZCAqbF91bmV2aWN0YWJsZSA9ICZ6b25lLT5scnVbTFJVX1VORVZJQ1RBQkxFXS5saXN0OwogCXVuc2lnbmVkIGxvbmcgc2NhbjsKQEAgLTI1MTQsNyArMjU3OCw3IEBACiAgKiB0aGF0IGhhcyBwb3NzaWJseS9wcm9iYWJseSBtYWRlIHNvbWUgcHJldmlvdXNseSB1bmV2aWN0YWJsZSBwYWdlcwogICogZXZpY3RhYmxlLgogICovCi12b2lkIHNjYW5fYWxsX3pvbmVzX3VuZXZpY3RhYmxlX3BhZ2VzKHZvaWQpCitzdGF0aWMgdm9pZCBzY2FuX2FsbF96b25lc191bmV2aWN0YWJsZV9wYWdlcyh2b2lkKQogewogCXN0cnVjdCB6b25lICp6b25lOwogCmRpZmYgLS1naXQgYS9uZXQvODAyMXEvdmxhbl9jb3JlLmMgYi9uZXQvODAyMXEvdmxhbl9jb3JlLmMKaW5kZXggZGQ4NmExZC4uNmMxMzIzOSAxMDA2NDQKLS0tIGEvbmV0LzgwMjFxL3ZsYW5fY29yZS5jCisrKyBiL25ldC84MDIxcS92bGFuX2NvcmUuYwpAQCAtMyw0NiArMywzNSBAQAogI2luY2x1ZGUgPGxpbnV4L2lmX3ZsYW4uaD4KICNpbmNsdWRlICJ2bGFuLmgiCiAKLXN0cnVjdCB2bGFuX2h3YWNjZWxfY2IgewotCXN0cnVjdCBuZXRfZGV2aWNlCSpkZXY7Ci19OwotCi1zdGF0aWMgaW5saW5lIHN0cnVjdCB2bGFuX2h3YWNjZWxfY2IgKnZsYW5faHdhY2NlbF9jYihzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQotewotCXJldHVybiAoc3RydWN0IHZsYW5faHdhY2NlbF9jYiAqKXNrYi0+Y2I7Ci19Ci0KIC8qIFZMQU4gcnggaHcgYWNjZWxlcmF0aW9uIGhlbHBlci4gIFRoaXMgYWN0cyBsaWtlIG5ldGlmX3tyeCxyZWNlaXZlX3NrYn0oKS4gKi8KIGludCBfX3ZsYW5faHdhY2NlbF9yeChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgdmxhbl9ncm91cCAqZ3JwLAogCQkgICAgICB1MTYgdmxhbl90Y2ksIGludCBwb2xsaW5nKQogewotCXN0cnVjdCB2bGFuX2h3YWNjZWxfY2IgKmNiID0gdmxhbl9od2FjY2VsX2NiKHNrYik7Ci0KLQlpZiAoc2tiX2JvbmRfc2hvdWxkX2Ryb3Aoc2tiKSkgewotCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOwotCQlyZXR1cm4gTkVUX1JYX0RST1A7Ci0JfQorCWlmIChza2JfYm9uZF9zaG91bGRfZHJvcChza2IpKQorCQlnb3RvIGRyb3A7CiAKIAlza2ItPnZsYW5fdGNpID0gdmxhbl90Y2k7Ci0JY2ItPmRldiA9IHZsYW5fZ3JvdXBfZ2V0X2RldmljZShncnAsIHZsYW5fdGNpICYgVkxBTl9WSURfTUFTSyk7CisJc2tiLT5kZXYgPSB2bGFuX2dyb3VwX2dldF9kZXZpY2UoZ3JwLCB2bGFuX3RjaSAmIFZMQU5fVklEX01BU0spOworCisJaWYgKCFza2ItPmRldikKKwkJZ290byBkcm9wOwogCiAJcmV0dXJuIChwb2xsaW5nID8gbmV0aWZfcmVjZWl2ZV9za2Ioc2tiKSA6IG5ldGlmX3J4KHNrYikpOworCitkcm9wOgorCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJcmV0dXJuIE5FVF9SWF9EUk9QOwogfQogRVhQT1JUX1NZTUJPTChfX3ZsYW5faHdhY2NlbF9yeCk7CiAKIGludCB2bGFuX2h3YWNjZWxfZG9fcmVjZWl2ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotCXN0cnVjdCB2bGFuX2h3YWNjZWxfY2IgKmNiID0gdmxhbl9od2FjY2VsX2NiKHNrYik7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGNiLT5kZXY7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHNrYi0+ZGV2OwogCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0czsKIAorCXNrYi0+ZGV2ID0gdmxhbl9kZXZfaW5mbyhkZXYpLT5yZWFsX2RldjsKIAluZXRpZl9uaXRfZGVsaXZlcihza2IpOwogCi0JaWYgKGRldiA9PSBOVUxMKSB7Ci0JCWtmcmVlX3NrYihza2IpOwotCQlyZXR1cm4gLTE7Ci0JfQotCiAJc2tiLT5kZXYgPSBkZXY7CiAJc2tiLT5wcmlvcml0eSA9IHZsYW5fZ2V0X2luZ3Jlc3NfcHJpb3JpdHkoZGV2LCBza2ItPnZsYW5fdGNpKTsKIAlza2ItPnZsYW5fdGNpID0gMDsKQEAgLTgwLDMgKzY5LDc5IEBACiAJcmV0dXJuIHZsYW5fZGV2X2luZm8oZGV2KS0+dmxhbl9pZDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHZsYW5fZGV2X3ZsYW5faWQpOworCitzdGF0aWMgaW50IHZsYW5fZ3JvX2NvbW1vbihzdHJ1Y3QgbmFwaV9zdHJ1Y3QgKm5hcGksIHN0cnVjdCB2bGFuX2dyb3VwICpncnAsCisJCQkgICB1bnNpZ25lZCBpbnQgdmxhbl90Y2ksIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IHNrX2J1ZmYgKnA7CisKKwlpZiAoc2tiX2JvbmRfc2hvdWxkX2Ryb3Aoc2tiKSkKKwkJZ290byBkcm9wOworCisJc2tiLT52bGFuX3RjaSA9IHZsYW5fdGNpOworCXNrYi0+ZGV2ID0gdmxhbl9ncm91cF9nZXRfZGV2aWNlKGdycCwgdmxhbl90Y2kgJiBWTEFOX1ZJRF9NQVNLKTsKKworCWlmICghc2tiLT5kZXYpCisJCWdvdG8gZHJvcDsKKworCWZvciAocCA9IG5hcGktPmdyb19saXN0OyBwOyBwID0gcC0+bmV4dCkgeworCQlOQVBJX0dST19DQihwKS0+c2FtZV9mbG93ID0gcC0+ZGV2ID09IHNrYi0+ZGV2OworCQlOQVBJX0dST19DQihwKS0+Zmx1c2ggPSAwOworCX0KKworCXJldHVybiBkZXZfZ3JvX3JlY2VpdmUobmFwaSwgc2tiKTsKKworZHJvcDoKKwlyZXR1cm4gMjsKK30KKworaW50IHZsYW5fZ3JvX3JlY2VpdmUoc3RydWN0IG5hcGlfc3RydWN0ICpuYXBpLCBzdHJ1Y3Qgdmxhbl9ncm91cCAqZ3JwLAorCQkgICAgIHVuc2lnbmVkIGludCB2bGFuX3RjaSwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlpbnQgZXJyID0gTkVUX1JYX1NVQ0NFU1M7CisKKwlzd2l0Y2ggKHZsYW5fZ3JvX2NvbW1vbihuYXBpLCBncnAsIHZsYW5fdGNpLCBza2IpKSB7CisJY2FzZSAtMToKKwkJcmV0dXJuIG5ldGlmX3JlY2VpdmVfc2tiKHNrYik7CisKKwljYXNlIDI6CisJCWVyciA9IE5FVF9SWF9EUk9QOworCQkvKiBmYWxsIHRocm91Z2ggKi8KKworCWNhc2UgMToKKwkJa2ZyZWVfc2tiKHNrYik7CisJCWJyZWFrOworCX0KKworCXJldHVybiBlcnI7Cit9CitFWFBPUlRfU1lNQk9MKHZsYW5fZ3JvX3JlY2VpdmUpOworCitpbnQgdmxhbl9ncm9fZnJhZ3Moc3RydWN0IG5hcGlfc3RydWN0ICpuYXBpLCBzdHJ1Y3Qgdmxhbl9ncm91cCAqZ3JwLAorCQkgICB1bnNpZ25lZCBpbnQgdmxhbl90Y2ksIHN0cnVjdCBuYXBpX2dyb19mcmFnaW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gbmFwaV9mcmFnaW5mb19za2IobmFwaSwgaW5mbyk7CisJaW50IGVyciA9IE5FVF9SWF9EUk9QOworCisJaWYgKCFza2IpCisJCWdvdG8gb3V0OworCisJZXJyID0gTkVUX1JYX1NVQ0NFU1M7CisKKwlzd2l0Y2ggKHZsYW5fZ3JvX2NvbW1vbihuYXBpLCBncnAsIHZsYW5fdGNpLCBza2IpKSB7CisJY2FzZSAtMToKKwkJcmV0dXJuIG5ldGlmX3JlY2VpdmVfc2tiKHNrYik7CisKKwljYXNlIDI6CisJCWVyciA9IE5FVF9SWF9EUk9QOworCQkvKiBmYWxsIHRocm91Z2ggKi8KKworCWNhc2UgMToKKwkJbmFwaV9yZXVzZV9za2IobmFwaSwgc2tiKTsKKwkJYnJlYWs7CisJfQorCitvdXQ6CisJcmV0dXJuIGVycjsKK30KK0VYUE9SVF9TWU1CT0wodmxhbl9ncm9fZnJhZ3MpOwpkaWZmIC0tZ2l0IGEvbmV0LzgwMjFxL3ZsYW5fZGV2LmMgYi9uZXQvODAyMXEvdmxhbl9kZXYuYwppbmRleCA4OWEzYmJkLi40YTE5YWNkIDEwMDY0NAotLS0gYS9uZXQvODAyMXEvdmxhbl9kZXYuYworKysgYi9uZXQvODAyMXEvdmxhbl9kZXYuYwpAQCAtNTQ2LDYgKzU0NiwxOCBAQAogCXJldHVybiBlcnI7CiB9CiAKK3N0YXRpYyBpbnQgdmxhbl9kZXZfbmVpZ2hfc2V0dXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IG5laWdoX3Bhcm1zICpwYSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqcmVhbF9kZXYgPSB2bGFuX2Rldl9pbmZvKGRldiktPnJlYWxfZGV2OworCWNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyAqb3BzID0gcmVhbF9kZXYtPm5ldGRldl9vcHM7CisJaW50IGVyciA9IDA7CisKKwlpZiAobmV0aWZfZGV2aWNlX3ByZXNlbnQocmVhbF9kZXYpICYmIG9wcy0+bmRvX25laWdoX3NldHVwKQorCQllcnIgPSBvcHMtPm5kb19uZWlnaF9zZXR1cChkZXYsIHBhKTsKKworCXJldHVybiBlcnI7Cit9CisKIHN0YXRpYyB2b2lkIHZsYW5fZGV2X2NoYW5nZV9yeF9mbGFncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgY2hhbmdlKQogewogCXN0cnVjdCBuZXRfZGV2aWNlICpyZWFsX2RldiA9IHZsYW5fZGV2X2luZm8oZGV2KS0+cmVhbF9kZXY7CkBAIC03MTMsNiArNzI1LDcgQEAKIAkubmRvX3NldF9tdWx0aWNhc3RfbGlzdAk9IHZsYW5fZGV2X3NldF9yeF9tb2RlLAogCS5uZG9fY2hhbmdlX3J4X2ZsYWdzCT0gdmxhbl9kZXZfY2hhbmdlX3J4X2ZsYWdzLAogCS5uZG9fZG9faW9jdGwJCT0gdmxhbl9kZXZfaW9jdGwsCisJLm5kb19uZWlnaF9zZXR1cAk9IHZsYW5fZGV2X25laWdoX3NldHVwLAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyB2bGFuX25ldGRldl9hY2NlbF9vcHMgPSB7CkBAIC03MjgsNiArNzQxLDcgQEAKIAkubmRvX3NldF9tdWx0aWNhc3RfbGlzdAk9IHZsYW5fZGV2X3NldF9yeF9tb2RlLAogCS5uZG9fY2hhbmdlX3J4X2ZsYWdzCT0gdmxhbl9kZXZfY2hhbmdlX3J4X2ZsYWdzLAogCS5uZG9fZG9faW9jdGwJCT0gdmxhbl9kZXZfaW9jdGwsCisJLm5kb19uZWlnaF9zZXR1cAk9IHZsYW5fZGV2X25laWdoX3NldHVwLAogfTsKIAogdm9pZCB2bGFuX3NldHVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCmRpZmYgLS1naXQgYS9uZXQvS2NvbmZpZyBiL25ldC9LY29uZmlnCmluZGV4IDZlYzJjY2UuLmJmMjc3NjAgMTAwNjQ0Ci0tLSBhL25ldC9LY29uZmlnCisrKyBiL25ldC9LY29uZmlnCkBAIC0yNTQsNiArMjU0LDggQEAKIAogZW5kaWYgIyBXSVJFTEVTUwogCitzb3VyY2UgIm5ldC93aW1heC9LY29uZmlnIgorCiBzb3VyY2UgIm5ldC9yZmtpbGwvS2NvbmZpZyIKIHNvdXJjZSAibmV0LzlwL0tjb25maWciCiAKZGlmZiAtLWdpdCBhL25ldC9NYWtlZmlsZSBiL25ldC9NYWtlZmlsZQppbmRleCBiYTQ0NjA0Li4wZmNjZTg5IDEwMDY0NAotLS0gYS9uZXQvTWFrZWZpbGUKKysrIGIvbmV0L01ha2VmaWxlCkBAIC02MywzICs2Myw0IEBACiBpZmVxICgkKENPTkZJR19ORVQpLHkpCiBvYmotJChDT05GSUdfU1lTQ1RMKQkJKz0gc3lzY3RsX25ldC5vCiBlbmRpZgorb2JqLSQoQ09ORklHX1dJTUFYKQkJKz0gd2ltYXgvCmRpZmYgLS1naXQgYS9uZXQvYXBwbGV0YWxrL2FhcnAuYyBiL25ldC9hcHBsZXRhbGsvYWFycC5jCmluZGV4IGIwM2ZmNTguLjg5Zjk5ZDMgMTAwNjQ0Ci0tLSBhL25ldC9hcHBsZXRhbGsvYWFycC5jCisrKyBiL25ldC9hcHBsZXRhbGsvYWFycC5jCkBAIC00NDMsMTMgKzQ0MywxNCBAQAogewogCXN0cnVjdCBpZnJlcSBhdHJlcTsKIAlzdHJ1Y3Qgc29ja2FkZHJfYXQgKnNhID0gKHN0cnVjdCBzb2NrYWRkcl9hdCAqKSZhdHJlcS5pZnJfYWRkcjsKKwljb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgKm9wcyA9IGlmYWNlLT5kZXYtPm5ldGRldl9vcHM7CiAKIAlzYS0+c2F0X2FkZHIuc19ub2RlID0gaWZhY2UtPmFkZHJlc3Muc19ub2RlOwogCXNhLT5zYXRfYWRkci5zX25ldCA9IG50b2hzKGlmYWNlLT5hZGRyZXNzLnNfbmV0KTsKIAogCS8qIFdlIHBhc3MgdGhlIE5ldDpOb2RlIHRvIHRoZSBkcml2ZXJzL2NhcmRzIGJ5IGEgRGV2aWNlIGlvY3RsLiAqLwotCWlmICghKGlmYWNlLT5kZXYtPmRvX2lvY3RsKGlmYWNlLT5kZXYsICZhdHJlcSwgU0lPQ1NJRkFERFIpKSkgewotCQkodm9pZClpZmFjZS0+ZGV2LT5kb19pb2N0bChpZmFjZS0+ZGV2LCAmYXRyZXEsIFNJT0NHSUZBRERSKTsKKwlpZiAoIShvcHMtPm5kb19kb19pb2N0bChpZmFjZS0+ZGV2LCAmYXRyZXEsIFNJT0NTSUZBRERSKSkpIHsKKwkJb3BzLT5uZG9fZG9faW9jdGwoaWZhY2UtPmRldiwgJmF0cmVxLCBTSU9DR0lGQUREUik7CiAJCWlmIChpZmFjZS0+YWRkcmVzcy5zX25ldCAhPSBodG9ucyhzYS0+c2F0X2FkZHIuc19uZXQpIHx8CiAJCSAgICBpZmFjZS0+YWRkcmVzcy5zX25vZGUgIT0gc2EtPnNhdF9hZGRyLnNfbm9kZSkKIAkJCWlmYWNlLT5zdGF0dXMgfD0gQVRJRl9QUk9CRV9GQUlMOwpkaWZmIC0tZ2l0IGEvbmV0L2JsdWV0b290aC9ibmVwL2JuZXAuaCBiL25ldC9ibHVldG9vdGgvYm5lcC9ibmVwLmgKaW5kZXggZDIwZjhhNC4uMGQ5ZTUwNiAxMDA2NDQKLS0tIGEvbmV0L2JsdWV0b290aC9ibmVwL2JuZXAuaAorKysgYi9uZXQvYmx1ZXRvb3RoL2JuZXAvYm5lcC5oCkBAIC0xNjUsNyArMTY1LDYgQEAKIAogCXN0cnVjdCBzb2NrZXQgICAgKnNvY2s7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKLQlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKIH07CiAKIHZvaWQgYm5lcF9uZXRfc2V0dXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CmRpZmYgLS1naXQgYS9uZXQvYmx1ZXRvb3RoL2JuZXAvY29yZS5jIGIvbmV0L2JsdWV0b290aC9ibmVwL2NvcmUuYwppbmRleCA3MGZlYThiLi41MmE2Y2UwIDEwMDY0NAotLS0gYS9uZXQvYmx1ZXRvb3RoL2JuZXAvY29yZS5jCisrKyBiL25ldC9ibHVldG9vdGgvYm5lcC9jb3JlLmMKQEAgLTMwNiw3ICszMDYsNyBAQAogCXN0cnVjdCBza19idWZmICpuc2tiOwogCXU4IHR5cGU7CiAKLQlzLT5zdGF0cy5yeF9ieXRlcyArPSBza2ItPmxlbjsKKwlkZXYtPnN0YXRzLnJ4X2J5dGVzICs9IHNrYi0+bGVuOwogCiAJdHlwZSA9ICoodTggKikgc2tiLT5kYXRhOyBza2JfcHVsbChza2IsIDEpOwogCkBAIC0zNDMsNyArMzQzLDcgQEAKIAkgKiBtYXkgbm90IGJlIG1vZGlmaWVkIGFuZCBiZWNhdXNlIG9mIHRoZSBhbGlnbm1lbnQgcmVxdWlyZW1lbnRzLiAqLwogCW5za2IgPSBhbGxvY19za2IoMiArIEVUSF9ITEVOICsgc2tiLT5sZW4sIEdGUF9LRVJORUwpOwogCWlmICghbnNrYikgewotCQlzLT5zdGF0cy5yeF9kcm9wcGVkKys7CisJCWRldi0+c3RhdHMucnhfZHJvcHBlZCsrOwogCQlrZnJlZV9za2Ioc2tiKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQpAQCAtMzc4LDE0ICszNzgsMTQgQEAKIAlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhKHNrYiwgX19za2JfcHV0KG5za2IsIHNrYi0+bGVuKSwgc2tiLT5sZW4pOwogCWtmcmVlX3NrYihza2IpOwogCi0Jcy0+c3RhdHMucnhfcGFja2V0cysrOworCWRldi0+c3RhdHMucnhfcGFja2V0cysrOwogCW5za2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7CiAJbnNrYi0+cHJvdG9jb2wgID0gZXRoX3R5cGVfdHJhbnMobnNrYiwgZGV2KTsKIAluZXRpZl9yeF9uaShuc2tiKTsKIAlyZXR1cm4gMDsKIAogYmFkZnJhbWU6Ci0Jcy0+c3RhdHMucnhfZXJyb3JzKys7CisJZGV2LT5zdGF0cy5yeF9lcnJvcnMrKzsKIAlrZnJlZV9za2Ioc2tiKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTQ0OCw4ICs0NDgsOCBAQAogCWtmcmVlX3NrYihza2IpOwogCiAJaWYgKGxlbiA+IDApIHsKLQkJcy0+c3RhdHMudHhfYnl0ZXMgKz0gbGVuOwotCQlzLT5zdGF0cy50eF9wYWNrZXRzKys7CisJCXMtPmRldi0+c3RhdHMudHhfYnl0ZXMgKz0gbGVuOworCQlzLT5kZXYtPnN0YXRzLnR4X3BhY2tldHMrKzsKIAkJcmV0dXJuIDA7CiAJfQogCmRpZmYgLS1naXQgYS9uZXQvYmx1ZXRvb3RoL2JuZXAvbmV0ZGV2LmMgYi9uZXQvYmx1ZXRvb3RoL2JuZXAvbmV0ZGV2LmMKaW5kZXggZjg5N2RhNi4uZDdhMGU5NyAxMDA2NDQKLS0tIGEvbmV0L2JsdWV0b290aC9ibmVwL25ldGRldi5jCisrKyBiL25ldC9ibHVldG9vdGgvYm5lcC9uZXRkZXYuYwpAQCAtNTUsMTIgKzU1LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpibmVwX25ldF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgYm5lcF9zZXNzaW9uICpzID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQlyZXR1cm4gJnMtPnN0YXRzOwotfQotCiBzdGF0aWMgdm9pZCBibmVwX25ldF9zZXRfbWNfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogI2lmZGVmIENPTkZJR19CVF9CTkVQX01DX0ZJTFRFUgpAQCAtMTI4LDExICsxMjIsNiBAQAogCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKIH0KIAotc3RhdGljIGludCBibmVwX25ldF9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKmlmciwgaW50IGNtZCkKLXsKLQlyZXR1cm4gLUVJTlZBTDsKLX0KLQogI2lmZGVmIENPTkZJR19CVF9CTkVQX01DX0ZJTFRFUgogc3RhdGljIGlubGluZSBpbnQgYm5lcF9uZXRfbWNfZmlsdGVyKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBibmVwX3Nlc3Npb24gKnMpCiB7CkBAIC0yMTcsNiArMjA2LDE4IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgYm5lcF9uZXRkZXZfb3BzID0geworCS5uZG9fb3BlbiAgICAgICAgICAgID0gYm5lcF9uZXRfb3BlbiwKKwkubmRvX3N0b3AgICAgICAgICAgICA9IGJuZXBfbmV0X2Nsb3NlLAorCS5uZG9fc3RhcnRfeG1pdAkgICAgID0gYm5lcF9uZXRfeG1pdCwKKwkubmRvX3ZhbGlkYXRlX2FkZHIgICA9IGV0aF92YWxpZGF0ZV9hZGRyLAorCS5uZG9fc2V0X211bHRpY2FzdF9saXN0ID0gYm5lcF9uZXRfc2V0X21jX2xpc3QsCisJLm5kb19zZXRfbWFjX2FkZHJlc3MgPSBibmVwX25ldF9zZXRfbWFjX2FkZHIsCisJLm5kb190eF90aW1lb3V0ICAgICAgPSBibmVwX25ldF90aW1lb3V0LAorCS5uZG9fY2hhbmdlX210dQkgICAgID0gZXRoX2NoYW5nZV9tdHUsCisKK307CisKIHZvaWQgYm5lcF9uZXRfc2V0dXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIApAQCAtMjI0LDE1ICsyMjUsNyBAQAogCWRldi0+YWRkcl9sZW4gPSBFVEhfQUxFTjsKIAogCWV0aGVyX3NldHVwKGRldik7Ci0KLQlkZXYtPm9wZW4gICAgICAgICAgICA9IGJuZXBfbmV0X29wZW47Ci0JZGV2LT5zdG9wICAgICAgICAgICAgPSBibmVwX25ldF9jbG9zZTsKLQlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9IGJuZXBfbmV0X3htaXQ7Ci0JZGV2LT5nZXRfc3RhdHMgICAgICAgPSBibmVwX25ldF9nZXRfc3RhdHM7Ci0JZGV2LT5kb19pb2N0bCAgICAgICAgPSBibmVwX25ldF9pb2N0bDsKLQlkZXYtPnNldF9tYWNfYWRkcmVzcyA9IGJuZXBfbmV0X3NldF9tYWNfYWRkcjsKLQlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9IGJuZXBfbmV0X3NldF9tY19saXN0OworCWRldi0+bmV0ZGV2X29wcyA9ICZibmVwX25ldGRldl9vcHM7CiAKIAlkZXYtPndhdGNoZG9nX3RpbWVvICA9IEhaICogMjsKLQlkZXYtPnR4X3RpbWVvdXQgICAgICA9IGJuZXBfbmV0X3RpbWVvdXQ7CiB9CmRpZmYgLS1naXQgYS9uZXQvY2FuL2FmX2Nhbi5jIGIvbmV0L2Nhbi9hZl9jYW4uYwppbmRleCAzZGFkYjMzLi5mYTQxN2NhIDEwMDY0NAotLS0gYS9uZXQvY2FuL2FmX2Nhbi5jCisrKyBiL25ldC9jYW4vYWZfY2FuLmMKQEAgLTQxNCw2ICs0MTQsMTIgQEAKICAqICBUaGUgZmlsdGVyIGNhbiBiZSBpbnZlcnRlZCAoQ0FOX0lOVl9GSUxURVIgYml0IHNldCBpbiBjYW5faWQpIG9yIGl0IGNhbgogICogIGZpbHRlciBmb3IgZXJyb3IgZnJhbWVzIChDQU5fRVJSX0ZMQUcgYml0IHNldCBpbiBtYXNrKS4KICAqCisgKiAgVGhlIHByb3ZpZGVkIHBvaW50ZXIgdG8gdGhlIHNrX2J1ZmYgaXMgZ3VhcmFudGVlZCB0byBiZSB2YWxpZCBhcyBsb25nIGFzCisgKiAgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIGlzIHJ1bm5pbmcuIFRoZSBjYWxsYmFjayBmdW5jdGlvbiBtdXN0ICpub3QqIGZyZWUKKyAqICB0aGUgZ2l2ZW4gc2tfYnVmZiB3aGlsZSBwcm9jZXNzaW5nIGl0J3MgdGFzay4gV2hlbiB0aGUgZ2l2ZW4gc2tfYnVmZiBpcworICogIG5lZWRlZCBhZnRlciB0aGUgZW5kIG9mIHRoZSBjYWxsYmFjayBmdW5jdGlvbiBpdCBtdXN0IGJlIGNsb25lZCBpbnNpZGUKKyAqICB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gd2l0aCBza2JfY2xvbmUoKS4KKyAqCiAgKiBSZXR1cm46CiAgKiAgMCBvbiBzdWNjZXNzCiAgKiAgLUVOT01FTSBvbiBtaXNzaW5nIGNhY2hlIG1lbSB0byBjcmVhdGUgc3Vic2NyaXB0aW9uIGVudHJ5CkBAIC01NjksMTMgKzU3NSw4IEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBkZWxpdmVyKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCByZWNlaXZlciAqcikKIHsKLQlzdHJ1Y3Qgc2tfYnVmZiAqY2xvbmUgPSBza2JfY2xvbmUoc2tiLCBHRlBfQVRPTUlDKTsKLQotCWlmIChjbG9uZSkgewotCQljbG9uZS0+c2sgPSBza2ItPnNrOwotCQlyLT5mdW5jKGNsb25lLCByLT5kYXRhKTsKLQkJci0+bWF0Y2hlcysrOwotCX0KKwlyLT5mdW5jKHNrYiwgci0+ZGF0YSk7CisJci0+bWF0Y2hlcysrOwogfQogCiBzdGF0aWMgaW50IGNhbl9yY3ZfZmlsdGVyKHN0cnVjdCBkZXZfcmN2X2xpc3RzICpkLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQpkaWZmIC0tZ2l0IGEvbmV0L2Nhbi9iY20uYyBiL25ldC9jYW4vYmNtLmMKaW5kZXggZGEwZDQyNi4uMTY0OWM4YSAxMDA2NDQKLS0tIGEvbmV0L2Nhbi9iY20uYworKysgYi9uZXQvY2FuL2JjbS5jCkBAIC03MCw3ICs3MCw3IEBACiAKICNkZWZpbmUgQ0FOX0JDTV9WRVJTSU9OIENBTl9WRVJTSU9OCiBzdGF0aWMgX19pbml0ZGF0YSBjb25zdCBjaGFyIGJhbm5lcltdID0gS0VSTl9JTkZPCi0JImNhbjogYnJvYWRjYXN0IG1hbmFnZXIgcHJvdG9jb2wgKHJldiAiIENBTl9CQ01fVkVSU0lPTiAiKVxuIjsKKwkiY2FuOiBicm9hZGNhc3QgbWFuYWdlciBwcm90b2NvbCAocmV2ICIgQ0FOX0JDTV9WRVJTSU9OICIgdClcbiI7CiAKIE1PRFVMRV9ERVNDUklQVElPTigiUEZfQ0FOIGJyb2FkY2FzdCBtYW5hZ2VyIHByb3RvY29sIik7CiBNT0RVTEVfTElDRU5TRSgiRHVhbCBCU0QvR1BMIik7CkBAIC05MCw2ICs5MCw3IEBACiAJdW5zaWduZWQgbG9uZyBmcmFtZXNfYWJzLCBmcmFtZXNfZmlsdGVyZWQ7CiAJc3RydWN0IHRpbWV2YWwgaXZhbDEsIGl2YWwyOwogCXN0cnVjdCBocnRpbWVyIHRpbWVyLCB0aHJ0aW1lcjsKKwlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgdHNrbGV0LCB0aHJ0c2tsZXQ7CiAJa3RpbWVfdCByeF9zdGFtcCwga3RfaXZhbDEsIGt0X2l2YWwyLCBrdF9sYXN0bXNnOwogCWludCByeF9pZmluZGV4OwogCWludCBjb3VudDsKQEAgLTM0MSw2ICszNDIsMjMgQEAKIAl9CiB9CiAKK3N0YXRpYyB2b2lkIGJjbV90eF90aW1lb3V0X3Rza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IGJjbV9vcCAqb3AgPSAoc3RydWN0IGJjbV9vcCAqKWRhdGE7CisJc3RydWN0IGJjbV9tc2dfaGVhZCBtc2dfaGVhZDsKKworCS8qIGNyZWF0ZSBub3RpZmljYXRpb24gdG8gdXNlciAqLworCW1zZ19oZWFkLm9wY29kZSAgPSBUWF9FWFBJUkVEOworCW1zZ19oZWFkLmZsYWdzICAgPSBvcC0+ZmxhZ3M7CisJbXNnX2hlYWQuY291bnQgICA9IG9wLT5jb3VudDsKKwltc2dfaGVhZC5pdmFsMSAgID0gb3AtPml2YWwxOworCW1zZ19oZWFkLml2YWwyICAgPSBvcC0+aXZhbDI7CisJbXNnX2hlYWQuY2FuX2lkICA9IG9wLT5jYW5faWQ7CisJbXNnX2hlYWQubmZyYW1lcyA9IDA7CisKKwliY21fc2VuZF90b191c2VyKG9wLCAmbXNnX2hlYWQsIE5VTEwsIDApOworfQorCiAvKgogICogYmNtX3R4X3RpbWVvdXRfaGFuZGxlciAtIHBlcmZvcm1lcyBjeWNsaWMgQ0FOIGZyYW1lIHRyYW5zbWlzc2lvbnMKICAqLwpAQCAtMzUyLDIwICszNzAsOCBAQAogCWlmIChvcC0+a3RfaXZhbDEudHY2NCAmJiAob3AtPmNvdW50ID4gMCkpIHsKIAogCQlvcC0+Y291bnQtLTsKLQkJaWYgKCFvcC0+Y291bnQgJiYgKG9wLT5mbGFncyAmIFRYX0NPVU5URVZUKSkgewotCQkJc3RydWN0IGJjbV9tc2dfaGVhZCBtc2dfaGVhZDsKLQotCQkJLyogY3JlYXRlIG5vdGlmaWNhdGlvbiB0byB1c2VyICovCi0JCQltc2dfaGVhZC5vcGNvZGUgID0gVFhfRVhQSVJFRDsKLQkJCW1zZ19oZWFkLmZsYWdzICAgPSBvcC0+ZmxhZ3M7Ci0JCQltc2dfaGVhZC5jb3VudCAgID0gb3AtPmNvdW50OwotCQkJbXNnX2hlYWQuaXZhbDEgICA9IG9wLT5pdmFsMTsKLQkJCW1zZ19oZWFkLml2YWwyICAgPSBvcC0+aXZhbDI7Ci0JCQltc2dfaGVhZC5jYW5faWQgID0gb3AtPmNhbl9pZDsKLQkJCW1zZ19oZWFkLm5mcmFtZXMgPSAwOwotCi0JCQliY21fc2VuZF90b191c2VyKG9wLCAmbXNnX2hlYWQsIE5VTEwsIDApOwotCQl9CisJCWlmICghb3AtPmNvdW50ICYmIChvcC0+ZmxhZ3MgJiBUWF9DT1VOVEVWVCkpCisJCQl0YXNrbGV0X3NjaGVkdWxlKCZvcC0+dHNrbGV0KTsKIAl9CiAKIAlpZiAob3AtPmt0X2l2YWwxLnR2NjQgJiYgKG9wLT5jb3VudCA+IDApKSB7CkBAIC00MDIsNiArNDA4LDkgQEAKIAlpZiAob3AtPmZyYW1lc19maWx0ZXJlZCA+IFVMT05HX01BWC8xMDApCiAJCW9wLT5mcmFtZXNfZmlsdGVyZWQgPSBvcC0+ZnJhbWVzX2FicyA9IDA7CiAKKwkvKiB0aGlzIGVsZW1lbnQgaXMgbm90IHRocm90dGxlZCBhbnltb3JlICovCisJZGF0YS0+Y2FuX2RsYyAmPSAoQkNNX0NBTl9ETENfTUFTS3xSWF9SRUNWKTsKKwogCWhlYWQub3Bjb2RlICA9IFJYX0NIQU5HRUQ7CiAJaGVhZC5mbGFncyAgID0gb3AtPmZsYWdzOwogCWhlYWQuY291bnQgICA9IG9wLT5jb3VudDsKQEAgLTQyMCwzNyArNDI5LDMyIEBACiAgKi8KIHN0YXRpYyB2b2lkIGJjbV9yeF91cGRhdGVfYW5kX3NlbmQoc3RydWN0IGJjbV9vcCAqb3AsCiAJCQkJICAgc3RydWN0IGNhbl9mcmFtZSAqbGFzdGRhdGEsCi0JCQkJICAgc3RydWN0IGNhbl9mcmFtZSAqcnhkYXRhKQorCQkJCSAgIGNvbnN0IHN0cnVjdCBjYW5fZnJhbWUgKnJ4ZGF0YSkKIHsKIAltZW1jcHkobGFzdGRhdGEsIHJ4ZGF0YSwgQ0ZTSVopOwogCi0JLyogbWFyayBhcyB1c2VkICovCi0JbGFzdGRhdGEtPmNhbl9kbGMgfD0gUlhfUkVDVjsKKwkvKiBtYXJrIGFzIHVzZWQgYW5kIHRocm90dGxlZCBieSBkZWZhdWx0ICovCisJbGFzdGRhdGEtPmNhbl9kbGMgfD0gKFJYX1JFQ1Z8UlhfVEhSKTsKIAotCS8qIHRocm90dGVsaW5nIG1vZGUgaW5hY3RpdmUgT1IgZGF0YSB1cGRhdGUgYWxyZWFkeSBvbiB0aGUgcnVuID8gKi8KLQlpZiAoIW9wLT5rdF9pdmFsMi50djY0IHx8IGhydGltZXJfY2FsbGJhY2tfcnVubmluZygmb3AtPnRocnRpbWVyKSkgeworCS8qIHRocm90dGVsaW5nIG1vZGUgaW5hY3RpdmUgPyAqLworCWlmICghb3AtPmt0X2l2YWwyLnR2NjQpIHsKIAkJLyogc2VuZCBSWF9DSEFOR0VEIHRvIHRoZSB1c2VyIGltbWVkaWF0ZWx5ICovCi0JCWJjbV9yeF9jaGFuZ2VkKG9wLCByeGRhdGEpOworCQliY21fcnhfY2hhbmdlZChvcCwgbGFzdGRhdGEpOwogCQlyZXR1cm47CiAJfQogCi0JaWYgKGhydGltZXJfYWN0aXZlKCZvcC0+dGhydGltZXIpKSB7Ci0JCS8qIG1hcmsgYXMgJ3Rocm90dGxlZCcgKi8KLQkJbGFzdGRhdGEtPmNhbl9kbGMgfD0gUlhfVEhSOworCS8qIHdpdGggYWN0aXZlIHRocm90dGxpbmcgdGltZXIgd2UgYXJlIGp1c3QgZG9uZSBoZXJlICovCisJaWYgKGhydGltZXJfYWN0aXZlKCZvcC0+dGhydGltZXIpKQogCQlyZXR1cm47Ci0JfQogCi0JaWYgKCFvcC0+a3RfbGFzdG1zZy50djY0KSB7Ci0JCS8qIHNlbmQgZmlyc3QgUlhfQ0hBTkdFRCB0byB0aGUgdXNlciBpbW1lZGlhdGVseSAqLwotCQliY21fcnhfY2hhbmdlZChvcCwgcnhkYXRhKTsKLQkJb3AtPmt0X2xhc3Rtc2cgPSBrdGltZV9nZXQoKTsKLQkJcmV0dXJuOwotCX0KKwkvKiBmaXJzdCByZWNlaXB0aW9uIHdpdGggZW5hYmxlZCB0aHJvdHRsaW5nIG1vZGUgKi8KKwlpZiAoIW9wLT5rdF9sYXN0bXNnLnR2NjQpCisJCWdvdG8gcnhfY2hhbmdlZF9zZXR0aW1lOwogCisJLyogZ290IGEgc2Vjb25kIGZyYW1lIGluc2lkZSBhIHBvdGVudGlhbCB0aHJvdHRsZSBwZXJpb2Q/ICovCiAJaWYgKGt0aW1lX3VzX2RlbHRhKGt0aW1lX2dldCgpLCBvcC0+a3RfbGFzdG1zZykgPAogCSAgICBrdGltZV90b191cyhvcC0+a3RfaXZhbDIpKSB7Ci0JCS8qIG1hcmsgYXMgJ3Rocm90dGxlZCcgYW5kIHN0YXJ0IHRpbWVyICovCi0JCWxhc3RkYXRhLT5jYW5fZGxjIHw9IFJYX1RIUjsKKwkJLyogZG8gbm90IHNlbmQgdGhlIHNhdmVkIGRhdGEgLSBvbmx5IHN0YXJ0IHRocm90dGxlIHRpbWVyICovCiAJCWhydGltZXJfc3RhcnQoJm9wLT50aHJ0aW1lciwKIAkJCSAgICAgIGt0aW1lX2FkZChvcC0+a3RfbGFzdG1zZywgb3AtPmt0X2l2YWwyKSwKIAkJCSAgICAgIEhSVElNRVJfTU9ERV9BQlMpOwpAQCAtNDU4LDcgKzQ2Miw4IEBACiAJfQogCiAJLyogdGhlIGdhcCB3YXMgdGhhdCBiaWcsIHRoYXQgdGhyb3R0bGluZyB3YXMgbm90IG5lZWRlZCBoZXJlICovCi0JYmNtX3J4X2NoYW5nZWQob3AsIHJ4ZGF0YSk7CityeF9jaGFuZ2VkX3NldHRpbWU6CisJYmNtX3J4X2NoYW5nZWQob3AsIGxhc3RkYXRhKTsKIAlvcC0+a3RfbGFzdG1zZyA9IGt0aW1lX2dldCgpOwogfQogCkBAIC00NjcsNyArNDcyLDcgQEAKICAqICAgICAgICAgICAgICAgICAgICAgICByZWNlaXZlZCBkYXRhIHN0b3JlZCBpbiBvcC0+bGFzdF9mcmFtZXNbXQogICovCiBzdGF0aWMgdm9pZCBiY21fcnhfY21wX3RvX2luZGV4KHN0cnVjdCBiY21fb3AgKm9wLCBpbnQgaW5kZXgsCi0JCQkJc3RydWN0IGNhbl9mcmFtZSAqcnhkYXRhKQorCQkJCWNvbnN0IHN0cnVjdCBjYW5fZnJhbWUgKnJ4ZGF0YSkKIHsKIAkvKgogCSAqIG5vIG9uZSB1c2VzIHRoZSBNU0JzIG9mIGNhbl9kbGMgZm9yIGNvbXBhcmF0aW9uLApAQCAtNTExLDE0ICs1MTYsMTIgQEAKIAkJaHJ0aW1lcl9zdGFydCgmb3AtPnRpbWVyLCBvcC0+a3RfaXZhbDEsIEhSVElNRVJfTU9ERV9SRUwpOwogfQogCi0vKgotICogYmNtX3J4X3RpbWVvdXRfaGFuZGxlciAtIHdoZW4gdGhlIChjeWNsaWMpIENBTiBmcmFtZSByZWNlaXB0aW9uIHRpbWVkIG91dAotICovCi1zdGF0aWMgZW51bSBocnRpbWVyX3Jlc3RhcnQgYmNtX3J4X3RpbWVvdXRfaGFuZGxlcihzdHJ1Y3QgaHJ0aW1lciAqaHJ0aW1lcikKK3N0YXRpYyB2b2lkIGJjbV9yeF90aW1lb3V0X3Rza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpCiB7Ci0Jc3RydWN0IGJjbV9vcCAqb3AgPSBjb250YWluZXJfb2YoaHJ0aW1lciwgc3RydWN0IGJjbV9vcCwgdGltZXIpOworCXN0cnVjdCBiY21fb3AgKm9wID0gKHN0cnVjdCBiY21fb3AgKilkYXRhOwogCXN0cnVjdCBiY21fbXNnX2hlYWQgbXNnX2hlYWQ7CiAKKwkvKiBjcmVhdGUgbm90aWZpY2F0aW9uIHRvIHVzZXIgKi8KIAltc2dfaGVhZC5vcGNvZGUgID0gUlhfVElNRU9VVDsKIAltc2dfaGVhZC5mbGFncyAgID0gb3AtPmZsYWdzOwogCW1zZ19oZWFkLmNvdW50ICAgPSBvcC0+Y291bnQ7CkBAIC01MjgsNiArNTMxLDE3IEBACiAJbXNnX2hlYWQubmZyYW1lcyA9IDA7CiAKIAliY21fc2VuZF90b191c2VyKG9wLCAmbXNnX2hlYWQsIE5VTEwsIDApOworfQorCisvKgorICogYmNtX3J4X3RpbWVvdXRfaGFuZGxlciAtIHdoZW4gdGhlIChjeWNsaWMpIENBTiBmcmFtZSByZWNlaXB0aW9uIHRpbWVkIG91dAorICovCitzdGF0aWMgZW51bSBocnRpbWVyX3Jlc3RhcnQgYmNtX3J4X3RpbWVvdXRfaGFuZGxlcihzdHJ1Y3QgaHJ0aW1lciAqaHJ0aW1lcikKK3sKKwlzdHJ1Y3QgYmNtX29wICpvcCA9IGNvbnRhaW5lcl9vZihocnRpbWVyLCBzdHJ1Y3QgYmNtX29wLCB0aW1lcik7CisKKwkvKiBzY2hlZHVsZSBiZWZvcmUgTkVUX1JYX1NPRlRJUlEgKi8KKwl0YXNrbGV0X2hpX3NjaGVkdWxlKCZvcC0+dHNrbGV0KTsKIAogCS8qIG5vIHJlc3RhcnQgb2YgdGhlIHRpbWVyIGlzIGRvbmUgaGVyZSEgKi8KIApAQCAtNTQxLDkgKzU1NSwyNSBAQAogfQogCiAvKgotICogYmNtX3J4X3Rocl9mbHVzaCAtIENoZWNrIGZvciB0aHJvdHRsZWQgZGF0YSBhbmQgc2VuZCBpdCB0byB0aGUgdXNlcnNwYWNlCisgKiBiY21fcnhfZG9fZmx1c2ggLSBoZWxwZXIgZm9yIGJjbV9yeF90aHJfZmx1c2gKICAqLwotc3RhdGljIGludCBiY21fcnhfdGhyX2ZsdXNoKHN0cnVjdCBiY21fb3AgKm9wKQorc3RhdGljIGlubGluZSBpbnQgYmNtX3J4X2RvX2ZsdXNoKHN0cnVjdCBiY21fb3AgKm9wLCBpbnQgdXBkYXRlLCBpbnQgaW5kZXgpCit7CisJaWYgKChvcC0+bGFzdF9mcmFtZXMpICYmIChvcC0+bGFzdF9mcmFtZXNbaW5kZXhdLmNhbl9kbGMgJiBSWF9USFIpKSB7CisJCWlmICh1cGRhdGUpCisJCQliY21fcnhfY2hhbmdlZChvcCwgJm9wLT5sYXN0X2ZyYW1lc1tpbmRleF0pOworCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBiY21fcnhfdGhyX2ZsdXNoIC0gQ2hlY2sgZm9yIHRocm90dGxlZCBkYXRhIGFuZCBzZW5kIGl0IHRvIHRoZSB1c2Vyc3BhY2UKKyAqCisgKiB1cGRhdGUgPT0gMCA6IGp1c3QgY2hlY2sgaWYgdGhyb3R0bGVkIGRhdGEgaXMgYXZhaWxhYmxlICAoYW55IGlycSBjb250ZXh0KQorICogdXBkYXRlID09IDEgOiBjaGVjayBhbmQgc2VuZCB0aHJvdHRsZWQgZGF0YSB0byB1c2Vyc3BhY2UgKHNvZnRfaXJxIGNvbnRleHQpCisgKi8KK3N0YXRpYyBpbnQgYmNtX3J4X3Rocl9mbHVzaChzdHJ1Y3QgYmNtX29wICpvcCwgaW50IHVwZGF0ZSkKIHsKIAlpbnQgdXBkYXRlZCA9IDA7CiAKQEAgLTU1MSwyNyArNTgxLDI1IEBACiAJCWludCBpOwogCiAJCS8qIGZvciBNVVggZmlsdGVyIHdlIHN0YXJ0IGF0IGluZGV4IDEgKi8KLQkJZm9yIChpID0gMTsgaSA8IG9wLT5uZnJhbWVzOyBpKyspIHsKLQkJCWlmICgob3AtPmxhc3RfZnJhbWVzKSAmJgotCQkJICAgIChvcC0+bGFzdF9mcmFtZXNbaV0uY2FuX2RsYyAmIFJYX1RIUikpIHsKLQkJCQlvcC0+bGFzdF9mcmFtZXNbaV0uY2FuX2RsYyAmPSB+UlhfVEhSOwotCQkJCWJjbV9yeF9jaGFuZ2VkKG9wLCAmb3AtPmxhc3RfZnJhbWVzW2ldKTsKLQkJCQl1cGRhdGVkKys7Ci0JCQl9Ci0JCX0KKwkJZm9yIChpID0gMTsgaSA8IG9wLT5uZnJhbWVzOyBpKyspCisJCQl1cGRhdGVkICs9IGJjbV9yeF9kb19mbHVzaChvcCwgdXBkYXRlLCBpKTsKIAogCX0gZWxzZSB7CiAJCS8qIGZvciBSWF9GSUxURVJfSUQgYW5kIHNpbXBsZSBmaWx0ZXIgKi8KLQkJaWYgKG9wLT5sYXN0X2ZyYW1lcyAmJiAob3AtPmxhc3RfZnJhbWVzWzBdLmNhbl9kbGMgJiBSWF9USFIpKSB7Ci0JCQlvcC0+bGFzdF9mcmFtZXNbMF0uY2FuX2RsYyAmPSB+UlhfVEhSOwotCQkJYmNtX3J4X2NoYW5nZWQob3AsICZvcC0+bGFzdF9mcmFtZXNbMF0pOwotCQkJdXBkYXRlZCsrOwotCQl9CisJCXVwZGF0ZWQgKz0gYmNtX3J4X2RvX2ZsdXNoKG9wLCB1cGRhdGUsIDApOwogCX0KIAogCXJldHVybiB1cGRhdGVkOwogfQogCitzdGF0aWMgdm9pZCBiY21fcnhfdGhyX3Rza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IGJjbV9vcCAqb3AgPSAoc3RydWN0IGJjbV9vcCAqKWRhdGE7CisKKwkvKiBwdXNoIHRoZSBjaGFuZ2VkIGRhdGEgdG8gdGhlIHVzZXJzcGFjZSAqLworCWJjbV9yeF90aHJfZmx1c2gob3AsIDEpOworfQorCiAvKgogICogYmNtX3J4X3Rocl9oYW5kbGVyIC0gdGhlIHRpbWUgZm9yIGJsb2NrZWQgY29udGVudCB1cGRhdGVzIGlzIG92ZXIgbm93OgogICogICAgICAgICAgICAgICAgICAgICAgQ2hlY2sgZm9yIHRocm90dGxlZCBkYXRhIGFuZCBzZW5kIGl0IHRvIHRoZSB1c2Vyc3BhY2UKQEAgLTU4MCw3ICs2MDgsOSBAQAogewogCXN0cnVjdCBiY21fb3AgKm9wID0gY29udGFpbmVyX29mKGhydGltZXIsIHN0cnVjdCBiY21fb3AsIHRocnRpbWVyKTsKIAotCWlmIChiY21fcnhfdGhyX2ZsdXNoKG9wKSkgeworCXRhc2tsZXRfc2NoZWR1bGUoJm9wLT50aHJ0c2tsZXQpOworCisJaWYgKGJjbV9yeF90aHJfZmx1c2gob3AsIDApKSB7CiAJCWhydGltZXJfZm9yd2FyZChocnRpbWVyLCBrdGltZV9nZXQoKSwgb3AtPmt0X2l2YWwyKTsKIAkJcmV0dXJuIEhSVElNRVJfUkVTVEFSVDsKIAl9IGVsc2UgewpAQCAtNTk2LDI5ICs2MjYsMjEgQEAKIHN0YXRpYyB2b2lkIGJjbV9yeF9oYW5kbGVyKHN0cnVjdCBza19idWZmICpza2IsIHZvaWQgKmRhdGEpCiB7CiAJc3RydWN0IGJjbV9vcCAqb3AgPSAoc3RydWN0IGJjbV9vcCAqKWRhdGE7Ci0Jc3RydWN0IGNhbl9mcmFtZSByeGZyYW1lOworCWNvbnN0IHN0cnVjdCBjYW5fZnJhbWUgKnJ4ZnJhbWUgPSAoc3RydWN0IGNhbl9mcmFtZSAqKXNrYi0+ZGF0YTsKIAlpbnQgaTsKIAogCS8qIGRpc2FibGUgdGltZW91dCAqLwogCWhydGltZXJfY2FuY2VsKCZvcC0+dGltZXIpOwogCi0JaWYgKHNrYi0+bGVuID09IHNpemVvZihyeGZyYW1lKSkgewotCQltZW1jcHkoJnJ4ZnJhbWUsIHNrYi0+ZGF0YSwgc2l6ZW9mKHJ4ZnJhbWUpKTsKLQkJLyogc2F2ZSByeCB0aW1lc3RhbXAgKi8KLQkJb3AtPnJ4X3N0YW1wID0gc2tiLT50c3RhbXA7Ci0JCS8qIHNhdmUgb3JpZ2luYXRvciBmb3IgcmVjdmZyb20oKSAqLwotCQlvcC0+cnhfaWZpbmRleCA9IHNrYi0+ZGV2LT5pZmluZGV4OwotCQkvKiB1cGRhdGUgc3RhdGlzdGljcyAqLwotCQlvcC0+ZnJhbWVzX2FicysrOwotCQlrZnJlZV9za2Ioc2tiKTsKLQotCX0gZWxzZSB7Ci0JCWtmcmVlX3NrYihza2IpOworCWlmIChvcC0+Y2FuX2lkICE9IHJ4ZnJhbWUtPmNhbl9pZCkKIAkJcmV0dXJuOwotCX0KIAotCWlmIChvcC0+Y2FuX2lkICE9IHJ4ZnJhbWUuY2FuX2lkKQotCQlyZXR1cm47CisJLyogc2F2ZSByeCB0aW1lc3RhbXAgKi8KKwlvcC0+cnhfc3RhbXAgPSBza2ItPnRzdGFtcDsKKwkvKiBzYXZlIG9yaWdpbmF0b3IgZm9yIHJlY3Zmcm9tKCkgKi8KKwlvcC0+cnhfaWZpbmRleCA9IHNrYi0+ZGV2LT5pZmluZGV4OworCS8qIHVwZGF0ZSBzdGF0aXN0aWNzICovCisJb3AtPmZyYW1lc19hYnMrKzsKIAogCWlmIChvcC0+ZmxhZ3MgJiBSWF9SVFJfRlJBTUUpIHsKIAkJLyogc2VuZCByZXBseSBmb3IgUlRSLXJlcXVlc3QgKHBsYWNlZCBpbiBvcC0+ZnJhbWVzWzBdKSAqLwpAQCAtNjI4LDE2ICs2NTAsMTQgQEAKIAogCWlmIChvcC0+ZmxhZ3MgJiBSWF9GSUxURVJfSUQpIHsKIAkJLyogdGhlIGVhc2llc3QgY2FzZSAqLwotCQliY21fcnhfdXBkYXRlX2FuZF9zZW5kKG9wLCAmb3AtPmxhc3RfZnJhbWVzWzBdLCAmcnhmcmFtZSk7Ci0JCWJjbV9yeF9zdGFydHRpbWVyKG9wKTsKLQkJcmV0dXJuOworCQliY21fcnhfdXBkYXRlX2FuZF9zZW5kKG9wLCAmb3AtPmxhc3RfZnJhbWVzWzBdLCByeGZyYW1lKTsKKwkJZ290byByeF9zdGFydHRpbWVyOwogCX0KIAogCWlmIChvcC0+bmZyYW1lcyA9PSAxKSB7CiAJCS8qIHNpbXBsZSBjb21wYXJlIHdpdGggaW5kZXggMCAqLwotCQliY21fcnhfY21wX3RvX2luZGV4KG9wLCAwLCAmcnhmcmFtZSk7Ci0JCWJjbV9yeF9zdGFydHRpbWVyKG9wKTsKLQkJcmV0dXJuOworCQliY21fcnhfY21wX3RvX2luZGV4KG9wLCAwLCByeGZyYW1lKTsKKwkJZ290byByeF9zdGFydHRpbWVyOwogCX0KIAogCWlmIChvcC0+bmZyYW1lcyA+IDEpIHsKQEAgLTY0OSwxNSArNjY5LDE3IEBACiAJCSAqLwogCiAJCWZvciAoaSA9IDE7IGkgPCBvcC0+bmZyYW1lczsgaSsrKSB7Ci0JCQlpZiAoKEdFVF9VNjQoJm9wLT5mcmFtZXNbMF0pICYgR0VUX1U2NCgmcnhmcmFtZSkpID09CisJCQlpZiAoKEdFVF9VNjQoJm9wLT5mcmFtZXNbMF0pICYgR0VUX1U2NChyeGZyYW1lKSkgPT0KIAkJCSAgICAoR0VUX1U2NCgmb3AtPmZyYW1lc1swXSkgJgogCQkJICAgICBHRVRfVTY0KCZvcC0+ZnJhbWVzW2ldKSkpIHsKLQkJCQliY21fcnhfY21wX3RvX2luZGV4KG9wLCBpLCAmcnhmcmFtZSk7CisJCQkJYmNtX3J4X2NtcF90b19pbmRleChvcCwgaSwgcnhmcmFtZSk7CiAJCQkJYnJlYWs7CiAJCQl9CiAJCX0KLQkJYmNtX3J4X3N0YXJ0dGltZXIob3ApOwogCX0KKworcnhfc3RhcnR0aW1lcjoKKwliY21fcnhfc3RhcnR0aW1lcihvcCk7CiB9CiAKIC8qCkBAIC02ODEsNiArNzAzLDEyIEBACiAJaHJ0aW1lcl9jYW5jZWwoJm9wLT50aW1lcik7CiAJaHJ0aW1lcl9jYW5jZWwoJm9wLT50aHJ0aW1lcik7CiAKKwlpZiAob3AtPnRza2xldC5mdW5jKQorCQl0YXNrbGV0X2tpbGwoJm9wLT50c2tsZXQpOworCisJaWYgKG9wLT50aHJ0c2tsZXQuZnVuYykKKwkJdGFza2xldF9raWxsKCZvcC0+dGhydHNrbGV0KTsKKwogCWlmICgob3AtPmZyYW1lcykgJiYgKG9wLT5mcmFtZXMgIT0gJm9wLT5zZnJhbWUpKQogCQlrZnJlZShvcC0+ZnJhbWVzKTsKIApAQCAtODkxLDYgKzkxOSwxMCBAQAogCQlocnRpbWVyX2luaXQoJm9wLT50aW1lciwgQ0xPQ0tfTU9OT1RPTklDLCBIUlRJTUVSX01PREVfUkVMKTsKIAkJb3AtPnRpbWVyLmZ1bmN0aW9uID0gYmNtX3R4X3RpbWVvdXRfaGFuZGxlcjsKIAorCQkvKiBpbml0aWFsaXplIHRhc2tsZXQgZm9yIHR4IGNvdW50ZXZlbnQgbm90aWZpY2F0aW9uICovCisJCXRhc2tsZXRfaW5pdCgmb3AtPnRza2xldCwgYmNtX3R4X3RpbWVvdXRfdHNrbGV0LAorCQkJICAgICAodW5zaWduZWQgbG9uZykgb3ApOworCiAJCS8qIGN1cnJlbnRseSB1bnVzZWQgaW4gdHhfb3BzICovCiAJCWhydGltZXJfaW5pdCgmb3AtPnRocnRpbWVyLCBDTE9DS19NT05PVE9OSUMsIEhSVElNRVJfTU9ERV9SRUwpOwogCkBAIC0xMDU0LDkgKzEwODYsMTcgQEAKIAkJaHJ0aW1lcl9pbml0KCZvcC0+dGltZXIsIENMT0NLX01PTk9UT05JQywgSFJUSU1FUl9NT0RFX1JFTCk7CiAJCW9wLT50aW1lci5mdW5jdGlvbiA9IGJjbV9yeF90aW1lb3V0X2hhbmRsZXI7CiAKKwkJLyogaW5pdGlhbGl6ZSB0YXNrbGV0IGZvciByeCB0aW1lb3V0IG5vdGlmaWNhdGlvbiAqLworCQl0YXNrbGV0X2luaXQoJm9wLT50c2tsZXQsIGJjbV9yeF90aW1lb3V0X3Rza2xldCwKKwkJCSAgICAgKHVuc2lnbmVkIGxvbmcpIG9wKTsKKwogCQlocnRpbWVyX2luaXQoJm9wLT50aHJ0aW1lciwgQ0xPQ0tfTU9OT1RPTklDLCBIUlRJTUVSX01PREVfUkVMKTsKIAkJb3AtPnRocnRpbWVyLmZ1bmN0aW9uID0gYmNtX3J4X3Rocl9oYW5kbGVyOwogCisJCS8qIGluaXRpYWxpemUgdGFza2xldCBmb3IgcnggdGhyb3R0bGUgaGFuZGxpbmcgKi8KKwkJdGFza2xldF9pbml0KCZvcC0+dGhydHNrbGV0LCBiY21fcnhfdGhyX3Rza2xldCwKKwkJCSAgICAgKHVuc2lnbmVkIGxvbmcpIG9wKTsKKwogCQkvKiBhZGQgdGhpcyBiY21fb3AgdG8gdGhlIGxpc3Qgb2YgdGhlIHJ4X29wcyAqLwogCQlsaXN0X2FkZCgmb3AtPmxpc3QsICZiby0+cnhfb3BzKTsKIApAQCAtMTEwMiw3ICsxMTQyLDcgQEAKIAkJCSAqLwogCQkJb3AtPmt0X2xhc3Rtc2cgPSBrdGltZV9zZXQoMCwgMCk7CiAJCQlocnRpbWVyX2NhbmNlbCgmb3AtPnRocnRpbWVyKTsKLQkJCWJjbV9yeF90aHJfZmx1c2gob3ApOworCQkJYmNtX3J4X3Rocl9mbHVzaChvcCwgMSk7CiAJCX0KIAogCQlpZiAoKG9wLT5mbGFncyAmIFNUQVJUVElNRVIpICYmIG9wLT5rdF9pdmFsMS50djY0KQpkaWZmIC0tZ2l0IGEvbmV0L2Nhbi9yYXcuYyBiL25ldC9jYW4vcmF3LmMKaW5kZXggMjdhYWI2My4uMDcwM2NiYSAxMDA2NDQKLS0tIGEvbmV0L2Nhbi9yYXcuYworKysgYi9uZXQvY2FuL3Jhdy5jCkBAIC05OSwxMyArOTksMTQgQEAKIAlzdHJ1Y3QgcmF3X3NvY2sgKnJvID0gcmF3X3NrKHNrKTsKIAlzdHJ1Y3Qgc29ja2FkZHJfY2FuICphZGRyOwogCi0JaWYgKCFyby0+cmVjdl9vd25fbXNncykgewotCQkvKiBjaGVjayB0aGUgcmVjZWl2ZWQgdHggc29jayByZWZlcmVuY2UgKi8KLQkJaWYgKHNrYi0+c2sgPT0gc2spIHsKLQkJCWtmcmVlX3NrYihza2IpOwotCQkJcmV0dXJuOwotCQl9Ci0JfQorCS8qIGNoZWNrIHRoZSByZWNlaXZlZCB0eCBzb2NrIHJlZmVyZW5jZSAqLworCWlmICghcm8tPnJlY3Zfb3duX21zZ3MgJiYgc2tiLT5zayA9PSBzaykKKwkJcmV0dXJuOworCisJLyogY2xvbmUgdGhlIGdpdmVuIHNrYiB0byBiZSBhYmxlIHRvIGVucXVldWUgaXQgaW50byB0aGUgcmN2IHF1ZXVlICovCisJc2tiID0gc2tiX2Nsb25lKHNrYiwgR0ZQX0FUT01JQyk7CisJaWYgKCFza2IpCisJCXJldHVybjsKIAogCS8qCiAJICogIFB1dCB0aGUgZGF0YWdyYW0gdG8gdGhlIHF1ZXVlIHNvIHRoYXQgcmF3X3JlY3Ztc2coKSBjYW4KZGlmZiAtLWdpdCBhL25ldC9jb3JlL2Rldi5jIGIvbmV0L2NvcmUvZGV2LmMKaW5kZXggYWM1NWQ4NC4uNWY3MzZmMSAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvZGV2LmMKKysrIGIvbmV0L2NvcmUvZGV2LmMKQEAgLTEzMiw2ICsxMzIsOSBAQAogLyogSW5zdGVhZCBvZiBpbmNyZWFzaW5nIHRoaXMsIHlvdSBzaG91bGQgY3JlYXRlIGEgaGFzaCB0YWJsZS4gKi8KICNkZWZpbmUgTUFYX0dST19TS0JTIDgKIAorLyogVGhpcyBzaG91bGQgYmUgaW5jcmVhc2VkIGlmIGEgcHJvdG9jb2wgd2l0aCBhIGJpZ2dlciBoZWFkIGlzIGFkZGVkLiAqLworI2RlZmluZSBHUk9fTUFYX0hFQUQgKE1BWF9IRUFERVIgKyAxMjgpCisKIC8qCiAgKglUaGUgbGlzdCBvZiBwYWNrZXQgdHlwZXMgd2Ugd2lsbCByZWNlaXZlIChhcyBvcHBvc2VkIHRvIGRpc2NhcmQpCiAgKglhbmQgdGhlIHJvdXRpbmVzIHRvIGludm9rZS4KQEAgLTIzMjYsNyArMjMyOSw3IEBACiAJc3RydWN0IGxpc3RfaGVhZCAqaGVhZCA9ICZwdHlwZV9iYXNlW250b2hzKHR5cGUpICYgUFRZUEVfSEFTSF9NQVNLXTsKIAlpbnQgZXJyID0gLUVOT0VOVDsKIAotCWlmICghc2tiX3NoaW5mbyhza2IpLT5mcmFnX2xpc3QpCisJaWYgKE5BUElfR1JPX0NCKHNrYiktPmNvdW50ID09IDEpCiAJCWdvdG8gb3V0OwogCiAJcmN1X3JlYWRfbG9jaygpOwpAQCAtMjM0Niw2ICsyMzQ5LDcgQEAKIAl9CiAKIG91dDoKKwlza2Jfc2hpbmZvKHNrYiktPmdzb19zaXplID0gMDsKIAlfX3NrYl9wdXNoKHNrYiwgLXNrYl9uZXR3b3JrX29mZnNldChza2IpKTsKIAlyZXR1cm4gbmV0aWZfcmVjZWl2ZV9za2Ioc2tiKTsKIH0KQEAgLTIzNjQsNyArMjM2OCw3IEBACiB9CiBFWFBPUlRfU1lNQk9MKG5hcGlfZ3JvX2ZsdXNoKTsKIAotaW50IG5hcGlfZ3JvX3JlY2VpdmUoc3RydWN0IG5hcGlfc3RydWN0ICpuYXBpLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoraW50IGRldl9ncm9fcmVjZWl2ZShzdHJ1Y3QgbmFwaV9zdHJ1Y3QgKm5hcGksIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJc3RydWN0IHNrX2J1ZmYgKipwcCA9IE5VTEw7CiAJc3RydWN0IHBhY2tldF90eXBlICpwdHlwZTsKQEAgLTIzNzMsNiArMjM3Nyw3IEBACiAJaW50IGNvdW50ID0gMDsKIAlpbnQgc2FtZV9mbG93OwogCWludCBtYWNfbGVuOworCWludCBmcmVlOwogCiAJaWYgKCEoc2tiLT5kZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9HUk8pKQogCQlnb3RvIG5vcm1hbDsKQEAgLTIzODksMTQgKzIzOTQsMTggQEAKIAkJc2tiLT5tYWNfbGVuID0gbWFjX2xlbjsKIAkJTkFQSV9HUk9fQ0Ioc2tiKS0+c2FtZV9mbG93ID0gMDsKIAkJTkFQSV9HUk9fQ0Ioc2tiKS0+Zmx1c2ggPSAwOworCQlOQVBJX0dST19DQihza2IpLT5mcmVlID0gMDsKIAogCQlmb3IgKHAgPSBuYXBpLT5ncm9fbGlzdDsgcDsgcCA9IHAtPm5leHQpIHsKIAkJCWNvdW50Kys7Ci0JCQlOQVBJX0dST19DQihwKS0+c2FtZV9mbG93ID0KLQkJCQlwLT5tYWNfbGVuID09IG1hY19sZW4gJiYKLQkJCQkhbWVtY21wKHNrYl9tYWNfaGVhZGVyKHApLCBza2JfbWFjX2hlYWRlcihza2IpLAotCQkJCQltYWNfbGVuKTsKLQkJCU5BUElfR1JPX0NCKHApLT5mbHVzaCA9IDA7CisKKwkJCWlmICghTkFQSV9HUk9fQ0IocCktPnNhbWVfZmxvdykKKwkJCQljb250aW51ZTsKKworCQkJaWYgKHAtPm1hY19sZW4gIT0gbWFjX2xlbiB8fAorCQkJICAgIG1lbWNtcChza2JfbWFjX2hlYWRlcihwKSwgc2tiX21hY19oZWFkZXIoc2tiKSwKKwkJCQkgICBtYWNfbGVuKSkKKwkJCQlOQVBJX0dST19DQihwKS0+c2FtZV9mbG93ID0gMDsKIAkJfQogCiAJCXBwID0gcHR5cGUtPmdyb19yZWNlaXZlKCZuYXBpLT5ncm9fbGlzdCwgc2tiKTsKQEAgLTI0MDgsNiArMjQxNyw3IEBACiAJCWdvdG8gbm9ybWFsOwogCiAJc2FtZV9mbG93ID0gTkFQSV9HUk9fQ0Ioc2tiKS0+c2FtZV9mbG93OworCWZyZWUgPSBOQVBJX0dST19DQihza2IpLT5mcmVlOwogCiAJaWYgKHBwKSB7CiAJCXN0cnVjdCBza19idWZmICpuc2tiID0gKnBwOwpAQCAtMjQyNywxNyArMjQzNywxMjQgQEAKIAl9CiAKIAlOQVBJX0dST19DQihza2IpLT5jb3VudCA9IDE7CisJc2tiX3NoaW5mbyhza2IpLT5nc29fc2l6ZSA9IHNrYi0+bGVuOwogCXNrYi0+bmV4dCA9IG5hcGktPmdyb19saXN0OwogCW5hcGktPmdyb19saXN0ID0gc2tiOwogCiBvazoKLQlyZXR1cm4gTkVUX1JYX1NVQ0NFU1M7CisJcmV0dXJuIGZyZWU7CiAKIG5vcm1hbDoKLQlyZXR1cm4gbmV0aWZfcmVjZWl2ZV9za2Ioc2tiKTsKKwlyZXR1cm4gLTE7Cit9CitFWFBPUlRfU1lNQk9MKGRldl9ncm9fcmVjZWl2ZSk7CisKK3N0YXRpYyBpbnQgX19uYXBpX2dyb19yZWNlaXZlKHN0cnVjdCBuYXBpX3N0cnVjdCAqbmFwaSwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqcDsKKworCWZvciAocCA9IG5hcGktPmdyb19saXN0OyBwOyBwID0gcC0+bmV4dCkgeworCQlOQVBJX0dST19DQihwKS0+c2FtZV9mbG93ID0gMTsKKwkJTkFQSV9HUk9fQ0IocCktPmZsdXNoID0gMDsKKwl9CisKKwlyZXR1cm4gZGV2X2dyb19yZWNlaXZlKG5hcGksIHNrYik7Cit9CisKK2ludCBuYXBpX2dyb19yZWNlaXZlKHN0cnVjdCBuYXBpX3N0cnVjdCAqbmFwaSwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzd2l0Y2ggKF9fbmFwaV9ncm9fcmVjZWl2ZShuYXBpLCBza2IpKSB7CisJY2FzZSAtMToKKwkJcmV0dXJuIG5ldGlmX3JlY2VpdmVfc2tiKHNrYik7CisKKwljYXNlIDE6CisJCWtmcmVlX3NrYihza2IpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gTkVUX1JYX1NVQ0NFU1M7CiB9CiBFWFBPUlRfU1lNQk9MKG5hcGlfZ3JvX3JlY2VpdmUpOwogCit2b2lkIG5hcGlfcmV1c2Vfc2tiKHN0cnVjdCBuYXBpX3N0cnVjdCAqbmFwaSwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzID0gMDsKKworCXNrYi0+bGVuIC09IHNrYi0+ZGF0YV9sZW47CisJc2tiLT50cnVlc2l6ZSAtPSBza2ItPmRhdGFfbGVuOworCXNrYi0+ZGF0YV9sZW4gPSAwOworCisJX19za2JfcHVsbChza2IsIHNrYl9oZWFkbGVuKHNrYikpOworCXNrYl9yZXNlcnZlKHNrYiwgTkVUX0lQX0FMSUdOIC0gc2tiX2hlYWRyb29tKHNrYikpOworCisJbmFwaS0+c2tiID0gc2tiOworfQorRVhQT1JUX1NZTUJPTChuYXBpX3JldXNlX3NrYik7CisKK3N0cnVjdCBza19idWZmICpuYXBpX2ZyYWdpbmZvX3NrYihzdHJ1Y3QgbmFwaV9zdHJ1Y3QgKm5hcGksCisJCQkJICBzdHJ1Y3QgbmFwaV9ncm9fZnJhZ2luZm8gKmluZm8pCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IG5hcGktPmRldjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gbmFwaS0+c2tiOworCisJbmFwaS0+c2tiID0gTlVMTDsKKworCWlmICghc2tiKSB7CisJCXNrYiA9IG5ldGRldl9hbGxvY19za2IoZGV2LCBHUk9fTUFYX0hFQUQgKyBORVRfSVBfQUxJR04pOworCQlpZiAoIXNrYikKKwkJCWdvdG8gb3V0OworCisJCXNrYl9yZXNlcnZlKHNrYiwgTkVUX0lQX0FMSUdOKTsKKwl9CisKKwlCVUdfT04oaW5mby0+bnJfZnJhZ3MgPiBNQVhfU0tCX0ZSQUdTKTsKKwlza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzID0gaW5mby0+bnJfZnJhZ3M7CisJbWVtY3B5KHNrYl9zaGluZm8oc2tiKS0+ZnJhZ3MsIGluZm8tPmZyYWdzLCBzaXplb2YoaW5mby0+ZnJhZ3MpKTsKKworCXNrYi0+ZGF0YV9sZW4gPSBpbmZvLT5sZW47CisJc2tiLT5sZW4gKz0gaW5mby0+bGVuOworCXNrYi0+dHJ1ZXNpemUgKz0gaW5mby0+bGVuOworCisJaWYgKCFwc2tiX21heV9wdWxsKHNrYiwgRVRIX0hMRU4pKSB7CisJCW5hcGlfcmV1c2Vfc2tiKG5hcGksIHNrYik7CisJCWdvdG8gb3V0OworCX0KKworCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGRldik7CisKKwlza2ItPmlwX3N1bW1lZCA9IGluZm8tPmlwX3N1bW1lZDsKKwlza2ItPmNzdW0gPSBpbmZvLT5jc3VtOworCitvdXQ6CisJcmV0dXJuIHNrYjsKK30KK0VYUE9SVF9TWU1CT0wobmFwaV9mcmFnaW5mb19za2IpOworCitpbnQgbmFwaV9ncm9fZnJhZ3Moc3RydWN0IG5hcGlfc3RydWN0ICpuYXBpLCBzdHJ1Y3QgbmFwaV9ncm9fZnJhZ2luZm8gKmluZm8pCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IG5hcGlfZnJhZ2luZm9fc2tiKG5hcGksIGluZm8pOworCWludCBlcnIgPSBORVRfUlhfRFJPUDsKKworCWlmICghc2tiKQorCQlnb3RvIG91dDsKKworCWVyciA9IE5FVF9SWF9TVUNDRVNTOworCisJc3dpdGNoIChfX25hcGlfZ3JvX3JlY2VpdmUobmFwaSwgc2tiKSkgeworCWNhc2UgLTE6CisJCXJldHVybiBuZXRpZl9yZWNlaXZlX3NrYihza2IpOworCisJY2FzZSAwOgorCQlnb3RvIG91dDsKKwl9CisKKwluYXBpX3JldXNlX3NrYihuYXBpLCBza2IpOworCitvdXQ6CisJcmV0dXJuIGVycjsKK30KK0VYUE9SVF9TWU1CT0wobmFwaV9ncm9fZnJhZ3MpOworCiBzdGF0aWMgaW50IHByb2Nlc3NfYmFja2xvZyhzdHJ1Y3QgbmFwaV9zdHJ1Y3QgKm5hcGksIGludCBxdW90YSkKIHsKIAlpbnQgd29yayA9IDA7CkBAIC0yNTE2LDExICsyNjMzLDEyIEBACiB7CiAJSU5JVF9MSVNUX0hFQUQoJm5hcGktPnBvbGxfbGlzdCk7CiAJbmFwaS0+Z3JvX2xpc3QgPSBOVUxMOworCW5hcGktPnNrYiA9IE5VTEw7CiAJbmFwaS0+cG9sbCA9IHBvbGw7CiAJbmFwaS0+d2VpZ2h0ID0gd2VpZ2h0OwogCWxpc3RfYWRkKCZuYXBpLT5kZXZfbGlzdCwgJmRldi0+bmFwaV9saXN0KTsKLSNpZmRlZiBDT05GSUdfTkVUUE9MTAogCW5hcGktPmRldiA9IGRldjsKKyNpZmRlZiBDT05GSUdfTkVUUE9MTAogCXNwaW5fbG9ja19pbml0KCZuYXBpLT5wb2xsX2xvY2spOwogCW5hcGktPnBvbGxfb3duZXIgPSAtMTsKICNlbmRpZgpAQCAtMjUzMyw2ICsyNjUxLDcgQEAKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCAqbmV4dDsKIAogCWxpc3RfZGVsX2luaXQoJm5hcGktPmRldl9saXN0KTsKKwlrZnJlZShuYXBpLT5za2IpOwogCiAJZm9yIChza2IgPSBuYXBpLT5ncm9fbGlzdDsgc2tiOyBza2IgPSBuZXh0KSB7CiAJCW5leHQgPSBza2ItPm5leHQ7CmRpZmYgLS1naXQgYS9uZXQvY29yZS9za2J1ZmYuYyBiL25ldC9jb3JlL3NrYnVmZi5jCmluZGV4IGI4ZDBhYmIuLjUxMTBiMzUgMTAwNjQ0Ci0tLSBhL25ldC9jb3JlL3NrYnVmZi5jCisrKyBiL25ldC9jb3JlL3NrYnVmZi5jCkBAIC0yNTk0LDYgKzI1OTQsMTcgQEAKIAogCWlmIChza2Jfc2hpbmZvKHApLT5mcmFnX2xpc3QpCiAJCWdvdG8gbWVyZ2U7CisJZWxzZSBpZiAoIXNrYl9oZWFkbGVuKHApICYmICFza2JfaGVhZGxlbihza2IpICYmCisJCSBza2Jfc2hpbmZvKHApLT5ucl9mcmFncyArIHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3MgPAorCQkgTUFYX1NLQl9GUkFHUykgeworCQltZW1jcHkoc2tiX3NoaW5mbyhwKS0+ZnJhZ3MgKyBza2Jfc2hpbmZvKHApLT5ucl9mcmFncywKKwkJICAgICAgIHNrYl9zaGluZm8oc2tiKS0+ZnJhZ3MsCisJCSAgICAgICBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzICogc2l6ZW9mKHNrYl9mcmFnX3QpKTsKKworCQlza2Jfc2hpbmZvKHApLT5ucl9mcmFncyArPSBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzOworCQlOQVBJX0dST19DQihza2IpLT5mcmVlID0gMTsKKwkJZ290byBkb25lOworCX0KIAogCWhlYWRyb29tID0gc2tiX2hlYWRyb29tKHApOwogCW5za2IgPSBuZXRkZXZfYWxsb2Nfc2tiKHAtPmRldiwgaGVhZHJvb20pOwpAQCAtMjYxMyw2ICsyNjI0LDcgQEAKIAogCSpOQVBJX0dST19DQihuc2tiKSA9ICpOQVBJX0dST19DQihwKTsKIAlza2Jfc2hpbmZvKG5za2IpLT5mcmFnX2xpc3QgPSBwOworCXNrYl9zaGluZm8obnNrYiktPmdzb19zaXplID0gc2tiX3NoaW5mbyhwKS0+Z3NvX3NpemU7CiAJc2tiX2hlYWRlcl9yZWxlYXNlKHApOwogCW5za2ItPnByZXYgPSBwOwogCkBAIC0yNjI3LDExICsyNjM5LDEyIEBACiAJcCA9IG5za2I7CiAKIG1lcmdlOgotCU5BUElfR1JPX0NCKHApLT5jb3VudCsrOwogCXAtPnByZXYtPm5leHQgPSBza2I7CiAJcC0+cHJldiA9IHNrYjsKIAlza2JfaGVhZGVyX3JlbGVhc2Uoc2tiKTsKIAorZG9uZToKKwlOQVBJX0dST19DQihwKS0+Y291bnQrKzsKIAlwLT5kYXRhX2xlbiArPSBza2ItPmxlbjsKIAlwLT50cnVlc2l6ZSArPSBza2ItPmxlbjsKIAlwLT5sZW4gKz0gc2tiLT5sZW47CmRpZmYgLS1naXQgYS9uZXQvZGNiL2RjYm5sLmMgYi9uZXQvZGNiL2RjYm5sLmMKaW5kZXggNWRiZmU1Zi4uODM3OTQ5NiAxMDA2NDQKLS0tIGEvbmV0L2RjYi9kY2JubC5jCisrKyBiL25ldC9kY2IvZGNibmwuYwpAQCAtMTkxLDcgKzE5MSw3IEBACiAJcmV0dXJuIDA7CiBubG1zZ19mYWlsdXJlOgogZXJyOgotCWtmcmVlKGRjYm5sX3NrYik7CisJa2ZyZWVfc2tiKGRjYm5sX3NrYik7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMjcyLDcgKzI3Miw3IEBACiAJcmV0dXJuIDA7CiBubG1zZ19mYWlsdXJlOgogZXJyOgotCWtmcmVlKGRjYm5sX3NrYik7CisJa2ZyZWVfc2tiKGRjYm5sX3NrYik7CiBlcnJfb3V0OgogCXJldHVybiAtRUlOVkFMOwogfQpAQCAtMzE0LDcgKzMxNCw3IEBACiAKIG5sbXNnX2ZhaWx1cmU6CiBlcnI6Ci0Ja2ZyZWUoZGNibmxfc2tiKTsKKwlrZnJlZV9za2IoZGNibmxfc2tiKTsKIGVycl9vdXQ6CiAJcmV0dXJuIC1FSU5WQUw7CiB9CkBAIC0zODAsNyArMzgwLDcgQEAKIAlyZXR1cm4gMDsKIG5sbXNnX2ZhaWx1cmU6CiBlcnI6Ci0Ja2ZyZWUoZGNibmxfc2tiKTsKKwlrZnJlZV9za2IoZGNibmxfc2tiKTsKIGVycl9vdXQ6CiAJcmV0dXJuIC1FSU5WQUw7CiB9CkBAIC00NTgsNyArNDU4LDcgQEAKIAlyZXR1cm4gMDsKIG5sbXNnX2ZhaWx1cmU6CiBlcnI6Ci0Ja2ZyZWUoZGNibmxfc2tiKTsKKwlrZnJlZV9za2IoZGNibmxfc2tiKTsKIGVycl9vdXQ6CiAJcmV0dXJuIHJldDsKIH0KQEAgLTY4Nyw3ICs2ODcsNyBAQAogCW5sYV9uZXN0X2NhbmNlbChkY2JubF9za2IsIHBnX25lc3QpOwogbmxtc2dfZmFpbHVyZToKIGVycjoKLQlrZnJlZShkY2JubF9za2IpOworCWtmcmVlX3NrYihkY2JubF9za2IpOwogZXJyX291dDoKIAlyZXQgID0gLUVJTlZBTDsKIAlyZXR1cm4gcmV0OwpAQCAtOTQ5LDcgKzk0OSw3IEBACiAJbmxhX25lc3RfY2FuY2VsKGRjYm5sX3NrYiwgYmNuX25lc3QpOwogbmxtc2dfZmFpbHVyZToKIGVycjoKLQlrZnJlZShkY2JubF9za2IpOworCWtmcmVlX3NrYihkY2JubF9za2IpOwogZXJyX291dDoKIAlyZXQgID0gLUVJTlZBTDsKIAlyZXR1cm4gcmV0OwpkaWZmIC0tZ2l0IGEvbmV0L2RjY3AvS2NvbmZpZyBiL25ldC9kY2NwL0tjb25maWcKaW5kZXggN2FhMmE3YS4uYWQ2ZGZmZCAxMDA2NDQKLS0tIGEvbmV0L2RjY3AvS2NvbmZpZworKysgYi9uZXQvZGNjcC9LY29uZmlnCkBAIC0xLDcgKzEsNiBAQAogbWVudWNvbmZpZyBJUF9EQ0NQCiAJdHJpc3RhdGUgIlRoZSBEQ0NQIFByb3RvY29sIChFWFBFUklNRU5UQUwpIgogCWRlcGVuZHMgb24gSU5FVCAmJiBFWFBFUklNRU5UQUwKLQlzZWxlY3QgSVBfRENDUF9DQ0lEMgogCS0tLWhlbHAtLS0KIAkgIERhdGFncmFtIENvbmdlc3Rpb24gQ29udHJvbCBQcm90b2NvbCAoUkZDIDQzNDApCiAKQEAgLTI1LDkgKzI0LDYgQEAKIAlkZWZfdHJpc3RhdGUgeSBpZiAoSVBfRENDUCA9IHkgJiYgSU5FVF9ESUFHID0geSkKIAlkZWZfdHJpc3RhdGUgbQogCi1jb25maWcgSVBfRENDUF9BQ0tWRUMKLQlib29sCi0KIHNvdXJjZSAibmV0L2RjY3AvY2NpZHMvS2NvbmZpZyIKIAogbWVudSAiRENDUCBLZXJuZWwgSGFja2luZyIKZGlmZiAtLWdpdCBhL25ldC9kY2NwL01ha2VmaWxlIGIvbmV0L2RjY3AvTWFrZWZpbGUKaW5kZXggZjRmODc5My4uMjk5MWVmYyAxMDA2NDQKLS0tIGEvbmV0L2RjY3AvTWFrZWZpbGUKKysrIGIvbmV0L2RjY3AvTWFrZWZpbGUKQEAgLTIsMTQgKzIsMjMgQEAKIAogZGNjcC15IDo9IGNjaWQubyBmZWF0Lm8gaW5wdXQubyBtaW5pc29ja3MubyBvcHRpb25zLm8gb3V0cHV0Lm8gcHJvdG8ubyB0aW1lci5vCiAKKyMKKyMgQ0NJRCBhbGdvcml0aG1zIHRvIGJlIHVzZWQgYnkgZGNjcC5rbworIworIyBDQ0lELTIgaXMgZGVmYXVsdCAoUkZDIDQzNDAsIHAuIDc3KSBhbmQgaGFzIEFjayBWZWN0b3JzIGFzIGRlcGVuZGVuY3kKK2RjY3AteSArPSBjY2lkcy9jY2lkMi5vIGFja3ZlYy5vCitkY2NwLSQoQ09ORklHX0lQX0RDQ1BfQ0NJRDMpCSs9IGNjaWRzL2NjaWQzLm8KK2RjY3AtJChDT05GSUdfSVBfRENDUF9URlJDX0xJQikgKz0gY2NpZHMvbGliL3RmcmMubwkJXAorCQkJCSAgIGNjaWRzL2xpYi90ZnJjX2VxdWF0aW9uLm8JXAorCQkJCSAgIGNjaWRzL2xpYi9wYWNrZXRfaGlzdG9yeS5vCVwKKwkJCQkgICBjY2lkcy9saWIvbG9zc19pbnRlcnZhbC5vCisKIGRjY3BfaXB2NC15IDo9IGlwdjQubwogCiAjIGJ1aWxkIGRjY3BfaXB2NiBhcyBtb2R1bGUgd2hlbmV2ZXIgZWl0aGVyIElQdjYgb3IgRENDUCBpcyBhIG1vZHVsZQogb2JqLSQoc3Vic3QgeSwkKENPTkZJR19JUF9EQ0NQKSwkKENPTkZJR19JUFY2KSkgKz0gZGNjcF9pcHY2Lm8KIGRjY3BfaXB2Ni15IDo9IGlwdjYubwogCi1kY2NwLSQoQ09ORklHX0lQX0RDQ1BfQUNLVkVDKSArPSBhY2t2ZWMubwotCiBvYmotJChDT05GSUdfSU5FVF9EQ0NQX0RJQUcpICs9IGRjY3BfZGlhZy5vCiBvYmotJChDT05GSUdfTkVUX0RDQ1BQUk9CRSkgKz0gZGNjcF9wcm9iZS5vCiAKQEAgLTE3LDUgKzI2LDMgQEAKIAogZGNjcF9kaWFnLXkgOj0gZGlhZy5vCiBkY2NwX3Byb2JlLXkgOj0gcHJvYmUubwotCi1vYmoteSArPSBjY2lkcy8KZGlmZiAtLWdpdCBhL25ldC9kY2NwL2Fja3ZlYy5oIGIvbmV0L2RjY3AvYWNrdmVjLmgKaW5kZXggNGNjZWUwMy4uNDVmOTVlNSAxMDA2NDQKLS0tIGEvbmV0L2RjY3AvYWNrdmVjLmgKKysrIGIvbmV0L2RjY3AvYWNrdmVjLmgKQEAgLTg0LDcgKzg0LDYgQEAKIHN0cnVjdCBzb2NrOwogc3RydWN0IHNrX2J1ZmY7CiAKLSNpZmRlZiBDT05GSUdfSVBfRENDUF9BQ0tWRUMKIGV4dGVybiBpbnQgZGNjcF9hY2t2ZWNfaW5pdCh2b2lkKTsKIGV4dGVybiB2b2lkIGRjY3BfYWNrdmVjX2V4aXQodm9pZCk7CiAKQEAgLTEwNiw1MiArMTA1LDQgQEAKIHsKIAlyZXR1cm4gYXYtPmF2X3ZlY19sZW47CiB9Ci0jZWxzZSAvKiBDT05GSUdfSVBfRENDUF9BQ0tWRUMgKi8KLXN0YXRpYyBpbmxpbmUgaW50IGRjY3BfYWNrdmVjX2luaXQodm9pZCkKLXsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGRjY3BfYWNrdmVjX2V4aXQodm9pZCkKLXsKLX0KLQotc3RhdGljIGlubGluZSBzdHJ1Y3QgZGNjcF9hY2t2ZWMgKmRjY3BfYWNrdmVjX2FsbG9jKGNvbnN0IGdmcF90IHByaW9yaXR5KQotewotCXJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgZGNjcF9hY2t2ZWNfZnJlZShzdHJ1Y3QgZGNjcF9hY2t2ZWMgKmF2KQotewotfQotCi1zdGF0aWMgaW5saW5lIGludCBkY2NwX2Fja3ZlY19hZGQoc3RydWN0IGRjY3BfYWNrdmVjICphdiwgY29uc3Qgc3RydWN0IHNvY2sgKnNrLAotCQkJCSAgY29uc3QgdTY0IGFja25vLCBjb25zdCB1OCBzdGF0ZSkKLXsKLQlyZXR1cm4gLTE7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBkY2NwX2Fja3ZlY19jaGVja19yY3ZfYWNrbm8oc3RydWN0IGRjY3BfYWNrdmVjICphdiwKLQkJCQkJICAgICAgIHN0cnVjdCBzb2NrICpzaywgY29uc3QgdTY0IGFja25vKQotewotfQotCi1zdGF0aWMgaW5saW5lIGludCBkY2NwX2Fja3ZlY19wYXJzZShzdHJ1Y3Qgc29jayAqc2ssIGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCi0JCQkJICAgIGNvbnN0IHU2NCAqYWNrbm8sIGNvbnN0IHU4IG9wdCwKLQkJCQkgICAgY29uc3QgdTggKnZhbHVlLCBjb25zdCB1OCBsZW4pCi17Ci0JcmV0dXJuIC0xOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBkY2NwX2luc2VydF9vcHRpb25fYWNrdmVjKGNvbnN0IHN0cnVjdCBzb2NrICpzaywKLQkJCQkJICAgIGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpCi17Ci0JcmV0dXJuIC0xOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBkY2NwX2Fja3ZlY19wZW5kaW5nKGNvbnN0IHN0cnVjdCBkY2NwX2Fja3ZlYyAqYXYpCi17Ci0JcmV0dXJuIDA7Ci19Ci0jZW5kaWYgLyogQ09ORklHX0lQX0RDQ1BfQUNLVkVDICovCiAjZW5kaWYgLyogX0FDS1ZFQ19IICovCmRpZmYgLS1naXQgYS9uZXQvZGNjcC9jY2lkLmMgYi9uZXQvZGNjcC9jY2lkLmMKaW5kZXggYmNjNjQzZi4uZjNlOWJhMSAxMDA2NDQKLS0tIGEvbmV0L2RjY3AvY2NpZC5jCisrKyBiL25ldC9kY2NwL2NjaWQuYwpAQCAtMTIsNTYgKzEyLDcwIEBACiAgKi8KIAogI2luY2x1ZGUgImNjaWQuaCIKKyNpbmNsdWRlICJjY2lkcy9saWIvdGZyYy5oIgogCi1zdGF0aWMgdTggYnVpbHRpbl9jY2lkc1tdID0gewotCURDQ1BDX0NDSUQyLAkJLyogQ0NJRDIgaXMgc3VwcG9ydGVkIGJ5IGRlZmF1bHQgKi8KLSNpZiBkZWZpbmVkKENPTkZJR19JUF9EQ0NQX0NDSUQzKSB8fCBkZWZpbmVkKENPTkZJR19JUF9EQ0NQX0NDSUQzX01PRFVMRSkKLQlEQ0NQQ19DQ0lEMywKK3N0YXRpYyBzdHJ1Y3QgY2NpZF9vcGVyYXRpb25zICpjY2lkc1tdID0geworCSZjY2lkMl9vcHMsCisjaWZkZWYgQ09ORklHX0lQX0RDQ1BfQ0NJRDMKKwkmY2NpZDNfb3BzLAogI2VuZGlmCiB9OwogCi1zdGF0aWMgc3RydWN0IGNjaWRfb3BlcmF0aW9ucyAqY2NpZHNbQ0NJRF9NQVhdOwotI2lmIGRlZmluZWQoQ09ORklHX1NNUCkgfHwgZGVmaW5lZChDT05GSUdfUFJFRU1QVCkKLXN0YXRpYyBhdG9taWNfdCBjY2lkc19sb2NrY3QgPSBBVE9NSUNfSU5JVCgwKTsKLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0soY2NpZHNfbG9jayk7CitzdGF0aWMgc3RydWN0IGNjaWRfb3BlcmF0aW9ucyAqY2NpZF9ieV9udW1iZXIoY29uc3QgdTggaWQpCit7CisJaW50IGk7CiAKLS8qCi0gKiBUaGUgc3RyYXRlZ3kgaXM6IG1vZGlmaWNhdGlvbnMgY2NpZHMgdmVjdG9yIGFyZSBzaG9ydCwgZG8gbm90IHNsZWVwIGFuZAotICogdmVlZXJ5IHJhcmUsIGJ1dCByZWFkIGFjY2VzcyBzaG91bGQgYmUgZnJlZSBvZiBhbnkgZXhjbHVzaXZlIGxvY2tzLgorCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGNjaWRzKTsgaSsrKQorCQlpZiAoY2NpZHNbaV0tPmNjaWRfaWQgPT0gaWQpCisJCQlyZXR1cm4gY2NpZHNbaV07CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qIGNoZWNrIHRoYXQgdXAgdG8gQGFycmF5X2xlbiBtZW1iZXJzIGluIEBjY2lkX2FycmF5IGFyZSBzdXBwb3J0ZWQgKi8KK2Jvb2wgY2NpZF9zdXBwb3J0X2NoZWNrKHU4IGNvbnN0ICpjY2lkX2FycmF5LCB1OCBhcnJheV9sZW4pCit7CisJd2hpbGUgKGFycmF5X2xlbiA+IDApCisJCWlmIChjY2lkX2J5X251bWJlcihjY2lkX2FycmF5Wy0tYXJyYXlfbGVuXSkgPT0gTlVMTCkKKwkJCXJldHVybiBmYWxzZTsKKwlyZXR1cm4gdHJ1ZTsKK30KKworLyoqCisgKiBjY2lkX2dldF9idWlsdGluX2NjaWRzICAtICBQb3B1bGF0ZSBhIGxpc3Qgb2YgYnVpbHQtaW4gQ0NJRHMKKyAqIEBjY2lkX2FycmF5OiBwb2ludGVyIHRvIGNvcHkgaW50bworICogQGFycmF5X2xlbjogdmFsdWUgdG8gcmV0dXJuIGxlbmd0aCBpbnRvCisgKiBUaGlzIGZ1bmN0aW9uIGFsbG9jYXRlcyBtZW1vcnkgLSBjYWxsZXIgbXVzdCBzZWUgdGhhdCBpdCBpcyBmcmVlZCBhZnRlciB1c2UuCiAgKi8KLXN0YXRpYyB2b2lkIGNjaWRzX3dyaXRlX2xvY2sodm9pZCkKK2ludCBjY2lkX2dldF9idWlsdGluX2NjaWRzKHU4ICoqY2NpZF9hcnJheSwgdTggKmFycmF5X2xlbikKIHsKLQlzcGluX2xvY2soJmNjaWRzX2xvY2spOwotCXdoaWxlIChhdG9taWNfcmVhZCgmY2NpZHNfbG9ja2N0KSAhPSAwKSB7Ci0JCXNwaW5fdW5sb2NrKCZjY2lkc19sb2NrKTsKLQkJeWllbGQoKTsKLQkJc3Bpbl9sb2NrKCZjY2lkc19sb2NrKTsKLQl9CisJKmNjaWRfYXJyYXkgPSBrbWFsbG9jKEFSUkFZX1NJWkUoY2NpZHMpLCBnZnBfYW55KCkpOworCWlmICgqY2NpZF9hcnJheSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0JVRlM7CisKKwlmb3IgKCphcnJheV9sZW4gPSAwOyAqYXJyYXlfbGVuIDwgQVJSQVlfU0laRShjY2lkcyk7ICphcnJheV9sZW4gKz0gMSkKKwkJKCpjY2lkX2FycmF5KVsqYXJyYXlfbGVuXSA9IGNjaWRzWyphcnJheV9sZW5dLT5jY2lkX2lkOworCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgY2NpZHNfd3JpdGVfdW5sb2NrKHZvaWQpCitpbnQgY2NpZF9nZXRzb2Nrb3B0X2J1aWx0aW5fY2NpZHMoc3RydWN0IHNvY2sgKnNrLCBpbnQgbGVuLAorCQkJCSAgY2hhciBfX3VzZXIgKm9wdHZhbCwgaW50IF9fdXNlciAqb3B0bGVuKQogewotCXNwaW5fdW5sb2NrKCZjY2lkc19sb2NrKTsKLX0KKwl1OCAqY2NpZF9hcnJheSwgYXJyYXlfbGVuOworCWludCBlcnIgPSAwOwogCi1zdGF0aWMgaW5saW5lIHZvaWQgY2NpZHNfcmVhZF9sb2NrKHZvaWQpCi17Ci0JYXRvbWljX2luYygmY2NpZHNfbG9ja2N0KTsKLQlzbXBfbWJfX2FmdGVyX2F0b21pY19pbmMoKTsKLQlzcGluX3VubG9ja193YWl0KCZjY2lkc19sb2NrKTsKLX0KKwlpZiAobGVuIDwgQVJSQVlfU0laRShjY2lkcykpCisJCXJldHVybiAtRUlOVkFMOwogCi1zdGF0aWMgaW5saW5lIHZvaWQgY2NpZHNfcmVhZF91bmxvY2sodm9pZCkKLXsKLQlhdG9taWNfZGVjKCZjY2lkc19sb2NrY3QpOwotfQorCWlmIChjY2lkX2dldF9idWlsdGluX2NjaWRzKCZjY2lkX2FycmF5LCAmYXJyYXlfbGVuKSkKKwkJcmV0dXJuIC1FTk9CVUZTOwogCi0jZWxzZQotI2RlZmluZSBjY2lkc193cml0ZV9sb2NrKCkgZG8geyB9IHdoaWxlKDApCi0jZGVmaW5lIGNjaWRzX3dyaXRlX3VubG9jaygpIGRvIHsgfSB3aGlsZSgwKQotI2RlZmluZSBjY2lkc19yZWFkX2xvY2soKSBkbyB7IH0gd2hpbGUoMCkKLSNkZWZpbmUgY2NpZHNfcmVhZF91bmxvY2soKSBkbyB7IH0gd2hpbGUoMCkKLSNlbmRpZgorCWlmIChwdXRfdXNlcihhcnJheV9sZW4sIG9wdGxlbikgfHwKKwkgICAgY29weV90b191c2VyKG9wdHZhbCwgY2NpZF9hcnJheSwgYXJyYXlfbGVuKSkKKwkJZXJyID0gLUVGQVVMVDsKKworCWtmcmVlKGNjaWRfYXJyYXkpOworCXJldHVybiBlcnI7Cit9CiAKIHN0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqY2NpZF9rbWVtX2NhY2hlX2NyZWF0ZShpbnQgb2JqX3NpemUsIGNvbnN0IGNoYXIgKmZtdCwuLi4pCiB7CkBAIC05Myw0OCArMTA3LDcgQEAKIAl9CiB9CiAKLS8qIGNoZWNrIHRoYXQgdXAgdG8gQGFycmF5X2xlbiBtZW1iZXJzIGluIEBjY2lkX2FycmF5IGFyZSBzdXBwb3J0ZWQgKi8KLWJvb2wgY2NpZF9zdXBwb3J0X2NoZWNrKHU4IGNvbnN0ICpjY2lkX2FycmF5LCB1OCBhcnJheV9sZW4pCi17Ci0JdTggaSwgaiwgZm91bmQ7Ci0KLQlmb3IgKGkgPSAwLCBmb3VuZCA9IDA7IGkgPCBhcnJheV9sZW47IGkrKywgZm91bmQgPSAwKSB7Ci0JCWZvciAoaiA9IDA7ICFmb3VuZCAmJiBqIDwgQVJSQVlfU0laRShidWlsdGluX2NjaWRzKTsgaisrKQotCQkJZm91bmQgPSAoY2NpZF9hcnJheVtpXSA9PSBidWlsdGluX2NjaWRzW2pdKTsKLQkJaWYgKCFmb3VuZCkKLQkJCXJldHVybiBmYWxzZTsKLQl9Ci0JcmV0dXJuIHRydWU7Ci19Ci0KLS8qKgotICogY2NpZF9nZXRfYnVpbHRpbl9jY2lkcyAgLSAgUHJvdmlkZSBjb3B5IG9mIGBidWlsdGluJyBDQ0lEIGFycmF5Ci0gKiBAY2NpZF9hcnJheTogcG9pbnRlciB0byBjb3B5IGludG8KLSAqIEBhcnJheV9sZW46IHZhbHVlIHRvIHJldHVybiBsZW5ndGggaW50bwotICogVGhpcyBmdW5jdGlvbiBhbGxvY2F0ZXMgbWVtb3J5IC0gY2FsbGVyIG11c3Qgc2VlIHRoYXQgaXQgaXMgZnJlZWQgYWZ0ZXIgdXNlLgotICovCi1pbnQgY2NpZF9nZXRfYnVpbHRpbl9jY2lkcyh1OCAqKmNjaWRfYXJyYXksIHU4ICphcnJheV9sZW4pCi17Ci0JKmNjaWRfYXJyYXkgPSBrbWVtZHVwKGJ1aWx0aW5fY2NpZHMsIHNpemVvZihidWlsdGluX2NjaWRzKSwgZ2ZwX2FueSgpKTsKLQlpZiAoKmNjaWRfYXJyYXkgPT0gTlVMTCkKLQkJcmV0dXJuIC1FTk9CVUZTOwotCSphcnJheV9sZW4gPSBBUlJBWV9TSVpFKGJ1aWx0aW5fY2NpZHMpOwotCXJldHVybiAwOwotfQotCi1pbnQgY2NpZF9nZXRzb2Nrb3B0X2J1aWx0aW5fY2NpZHMoc3RydWN0IHNvY2sgKnNrLCBpbnQgbGVuLAotCQkJCSAgICBjaGFyIF9fdXNlciAqb3B0dmFsLCBpbnQgX191c2VyICpvcHRsZW4pCi17Ci0JaWYgKGxlbiA8IHNpemVvZihidWlsdGluX2NjaWRzKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAocHV0X3VzZXIoc2l6ZW9mKGJ1aWx0aW5fY2NpZHMpLCBvcHRsZW4pIHx8Ci0JICAgIGNvcHlfdG9fdXNlcihvcHR2YWwsIGJ1aWx0aW5fY2NpZHMsIHNpemVvZihidWlsdGluX2NjaWRzKSkpCi0JCXJldHVybiAtRUZBVUxUOwotCXJldHVybiAwOwotfQotCi1pbnQgY2NpZF9yZWdpc3RlcihzdHJ1Y3QgY2NpZF9vcGVyYXRpb25zICpjY2lkX29wcykKK3N0YXRpYyBpbnQgY2NpZF9hY3RpdmF0ZShzdHJ1Y3QgY2NpZF9vcGVyYXRpb25zICpjY2lkX29wcykKIHsKIAlpbnQgZXJyID0gLUVOT0JVRlM7CiAKQEAgLTE1Miw3OSArMTI1LDQwIEBACiAJaWYgKGNjaWRfb3BzLT5jY2lkX2hjX3R4X3NsYWIgPT0gTlVMTCkKIAkJZ290byBvdXRfZnJlZV9yeF9zbGFiOwogCi0JY2NpZHNfd3JpdGVfbG9jaygpOwotCWVyciA9IC1FRVhJU1Q7Ci0JaWYgKGNjaWRzW2NjaWRfb3BzLT5jY2lkX2lkXSA9PSBOVUxMKSB7Ci0JCWNjaWRzW2NjaWRfb3BzLT5jY2lkX2lkXSA9IGNjaWRfb3BzOwotCQllcnIgPSAwOwotCX0KLQljY2lkc193cml0ZV91bmxvY2soKTsKLQlpZiAoZXJyICE9IDApCi0JCWdvdG8gb3V0X2ZyZWVfdHhfc2xhYjsKLQotCXByX2luZm8oIkNDSUQ6IFJlZ2lzdGVyZWQgQ0NJRCAlZCAoJXMpXG4iLAorCXByX2luZm8oIkNDSUQ6IEFjdGl2YXRlZCBDQ0lEICVkICglcylcbiIsCiAJCWNjaWRfb3BzLT5jY2lkX2lkLCBjY2lkX29wcy0+Y2NpZF9uYW1lKTsKKwllcnIgPSAwOwogb3V0OgogCXJldHVybiBlcnI7Ci1vdXRfZnJlZV90eF9zbGFiOgotCWNjaWRfa21lbV9jYWNoZV9kZXN0cm95KGNjaWRfb3BzLT5jY2lkX2hjX3R4X3NsYWIpOwotCWNjaWRfb3BzLT5jY2lkX2hjX3R4X3NsYWIgPSBOVUxMOwotCWdvdG8gb3V0Owogb3V0X2ZyZWVfcnhfc2xhYjoKIAljY2lkX2ttZW1fY2FjaGVfZGVzdHJveShjY2lkX29wcy0+Y2NpZF9oY19yeF9zbGFiKTsKIAljY2lkX29wcy0+Y2NpZF9oY19yeF9zbGFiID0gTlVMTDsKIAlnb3RvIG91dDsKIH0KIAotRVhQT1JUX1NZTUJPTF9HUEwoY2NpZF9yZWdpc3Rlcik7Ci0KLWludCBjY2lkX3VucmVnaXN0ZXIoc3RydWN0IGNjaWRfb3BlcmF0aW9ucyAqY2NpZF9vcHMpCitzdGF0aWMgdm9pZCBjY2lkX2RlYWN0aXZhdGUoc3RydWN0IGNjaWRfb3BlcmF0aW9ucyAqY2NpZF9vcHMpCiB7Ci0JY2NpZHNfd3JpdGVfbG9jaygpOwotCWNjaWRzW2NjaWRfb3BzLT5jY2lkX2lkXSA9IE5VTEw7Ci0JY2NpZHNfd3JpdGVfdW5sb2NrKCk7Ci0KIAljY2lkX2ttZW1fY2FjaGVfZGVzdHJveShjY2lkX29wcy0+Y2NpZF9oY190eF9zbGFiKTsKIAljY2lkX29wcy0+Y2NpZF9oY190eF9zbGFiID0gTlVMTDsKIAljY2lkX2ttZW1fY2FjaGVfZGVzdHJveShjY2lkX29wcy0+Y2NpZF9oY19yeF9zbGFiKTsKIAljY2lkX29wcy0+Y2NpZF9oY19yeF9zbGFiID0gTlVMTDsKIAotCXByX2luZm8oIkNDSUQ6IFVucmVnaXN0ZXJlZCBDQ0lEICVkICglcylcbiIsCisJcHJfaW5mbygiQ0NJRDogRGVhY3RpdmF0ZWQgQ0NJRCAlZCAoJXMpXG4iLAogCQljY2lkX29wcy0+Y2NpZF9pZCwgY2NpZF9vcHMtPmNjaWRfbmFtZSk7Ci0JcmV0dXJuIDA7CiB9CiAKLUVYUE9SVF9TWU1CT0xfR1BMKGNjaWRfdW5yZWdpc3Rlcik7Ci0KLXN0cnVjdCBjY2lkICpjY2lkX25ldyh1bnNpZ25lZCBjaGFyIGlkLCBzdHJ1Y3Qgc29jayAqc2ssIGludCByeCwgZ2ZwX3QgZ2ZwKQorc3RydWN0IGNjaWQgKmNjaWRfbmV3KGNvbnN0IHU4IGlkLCBzdHJ1Y3Qgc29jayAqc2ssIGJvb2wgcngpCiB7Ci0Jc3RydWN0IGNjaWRfb3BlcmF0aW9ucyAqY2NpZF9vcHM7CisJc3RydWN0IGNjaWRfb3BlcmF0aW9ucyAqY2NpZF9vcHMgPSBjY2lkX2J5X251bWJlcihpZCk7CiAJc3RydWN0IGNjaWQgKmNjaWQgPSBOVUxMOwogCi0JY2NpZHNfcmVhZF9sb2NrKCk7Ci0jaWZkZWYgQ09ORklHX01PRFVMRVMKLQlpZiAoY2NpZHNbaWRdID09IE5VTEwpIHsKLQkJLyogV2Ugb25seSB0cnkgdG8gbG9hZCBpZiBpbiBwcm9jZXNzIGNvbnRleHQgKi8KLQkJY2NpZHNfcmVhZF91bmxvY2soKTsKLQkJaWYgKGdmcCAmIEdGUF9BVE9NSUMpCi0JCQlnb3RvIG91dDsKLQkJcmVxdWVzdF9tb2R1bGUoIm5ldC1kY2NwLWNjaWQtJWQiLCBpZCk7Ci0JCWNjaWRzX3JlYWRfbG9jaygpOwotCX0KLSNlbmRpZgotCWNjaWRfb3BzID0gY2NpZHNbaWRdOwogCWlmIChjY2lkX29wcyA9PSBOVUxMKQotCQlnb3RvIG91dF91bmxvY2s7Ci0KLQlpZiAoIXRyeV9tb2R1bGVfZ2V0KGNjaWRfb3BzLT5jY2lkX293bmVyKSkKLQkJZ290byBvdXRfdW5sb2NrOwotCi0JY2NpZHNfcmVhZF91bmxvY2soKTsKKwkJZ290byBvdXQ7CiAKIAljY2lkID0ga21lbV9jYWNoZV9hbGxvYyhyeCA/IGNjaWRfb3BzLT5jY2lkX2hjX3J4X3NsYWIgOgotCQkJCSAgICAgY2NpZF9vcHMtPmNjaWRfaGNfdHhfc2xhYiwgZ2ZwKTsKKwkJCQkgICAgIGNjaWRfb3BzLT5jY2lkX2hjX3R4X3NsYWIsIGdmcF9hbnkoKSk7CiAJaWYgKGNjaWQgPT0gTlVMTCkKLQkJZ290byBvdXRfbW9kdWxlX3B1dDsKKwkJZ290byBvdXQ7CiAJY2NpZC0+Y2NpZF9vcHMgPSBjY2lkX29wczsKIAlpZiAocngpIHsKIAkJbWVtc2V0KGNjaWQgKyAxLCAwLCBjY2lkX29wcy0+Y2NpZF9oY19yeF9vYmpfc2l6ZSk7CkBAIC0yMzksNTMgKzE3Myw1NyBAQAogCX0KIG91dDoKIAlyZXR1cm4gY2NpZDsKLW91dF91bmxvY2s6Ci0JY2NpZHNfcmVhZF91bmxvY2soKTsKLQlnb3RvIG91dDsKIG91dF9mcmVlX2NjaWQ6CiAJa21lbV9jYWNoZV9mcmVlKHJ4ID8gY2NpZF9vcHMtPmNjaWRfaGNfcnhfc2xhYiA6CiAJCQljY2lkX29wcy0+Y2NpZF9oY190eF9zbGFiLCBjY2lkKTsKIAljY2lkID0gTlVMTDsKLW91dF9tb2R1bGVfcHV0OgotCW1vZHVsZV9wdXQoY2NpZF9vcHMtPmNjaWRfb3duZXIpOwogCWdvdG8gb3V0OwogfQogCi1FWFBPUlRfU1lNQk9MX0dQTChjY2lkX25ldyk7Ci0KLXN0YXRpYyB2b2lkIGNjaWRfZGVsZXRlKHN0cnVjdCBjY2lkICpjY2lkLCBzdHJ1Y3Qgc29jayAqc2ssIGludCByeCkKLXsKLQlzdHJ1Y3QgY2NpZF9vcGVyYXRpb25zICpjY2lkX29wczsKLQotCWlmIChjY2lkID09IE5VTEwpCi0JCXJldHVybjsKLQotCWNjaWRfb3BzID0gY2NpZC0+Y2NpZF9vcHM7Ci0JaWYgKHJ4KSB7Ci0JCWlmIChjY2lkX29wcy0+Y2NpZF9oY19yeF9leGl0ICE9IE5VTEwpCi0JCQljY2lkX29wcy0+Y2NpZF9oY19yeF9leGl0KHNrKTsKLQkJa21lbV9jYWNoZV9mcmVlKGNjaWRfb3BzLT5jY2lkX2hjX3J4X3NsYWIsICBjY2lkKTsKLQl9IGVsc2UgewotCQlpZiAoY2NpZF9vcHMtPmNjaWRfaGNfdHhfZXhpdCAhPSBOVUxMKQotCQkJY2NpZF9vcHMtPmNjaWRfaGNfdHhfZXhpdChzayk7Ci0JCWttZW1fY2FjaGVfZnJlZShjY2lkX29wcy0+Y2NpZF9oY190eF9zbGFiLCAgY2NpZCk7Ci0JfQotCWNjaWRzX3JlYWRfbG9jaygpOwotCWlmIChjY2lkc1tjY2lkX29wcy0+Y2NpZF9pZF0gIT0gTlVMTCkKLQkJbW9kdWxlX3B1dChjY2lkX29wcy0+Y2NpZF9vd25lcik7Ci0JY2NpZHNfcmVhZF91bmxvY2soKTsKLX0KLQogdm9pZCBjY2lkX2hjX3J4X2RlbGV0ZShzdHJ1Y3QgY2NpZCAqY2NpZCwgc3RydWN0IHNvY2sgKnNrKQogewotCWNjaWRfZGVsZXRlKGNjaWQsIHNrLCAxKTsKKwlpZiAoY2NpZCAhPSBOVUxMKSB7CisJCWlmIChjY2lkLT5jY2lkX29wcy0+Y2NpZF9oY19yeF9leGl0ICE9IE5VTEwpCisJCQljY2lkLT5jY2lkX29wcy0+Y2NpZF9oY19yeF9leGl0KHNrKTsKKwkJa21lbV9jYWNoZV9mcmVlKGNjaWQtPmNjaWRfb3BzLT5jY2lkX2hjX3J4X3NsYWIsIGNjaWQpOworCX0KIH0KIAotRVhQT1JUX1NZTUJPTF9HUEwoY2NpZF9oY19yeF9kZWxldGUpOwotCiB2b2lkIGNjaWRfaGNfdHhfZGVsZXRlKHN0cnVjdCBjY2lkICpjY2lkLCBzdHJ1Y3Qgc29jayAqc2spCiB7Ci0JY2NpZF9kZWxldGUoY2NpZCwgc2ssIDApOworCWlmIChjY2lkICE9IE5VTEwpIHsKKwkJaWYgKGNjaWQtPmNjaWRfb3BzLT5jY2lkX2hjX3R4X2V4aXQgIT0gTlVMTCkKKwkJCWNjaWQtPmNjaWRfb3BzLT5jY2lkX2hjX3R4X2V4aXQoc2spOworCQlrbWVtX2NhY2hlX2ZyZWUoY2NpZC0+Y2NpZF9vcHMtPmNjaWRfaGNfdHhfc2xhYiwgY2NpZCk7CisJfQogfQogCi1FWFBPUlRfU1lNQk9MX0dQTChjY2lkX2hjX3R4X2RlbGV0ZSk7CitpbnQgX19pbml0IGNjaWRfaW5pdGlhbGl6ZV9idWlsdGlucyh2b2lkKQoreworCWludCBpLCBlcnIgPSB0ZnJjX2xpYl9pbml0KCk7CisKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY2NpZHMpOyBpKyspIHsKKwkJZXJyID0gY2NpZF9hY3RpdmF0ZShjY2lkc1tpXSk7CisJCWlmIChlcnIpCisJCQlnb3RvIHVud2luZF9yZWdpc3RyYXRpb25zOworCX0KKwlyZXR1cm4gMDsKKwordW53aW5kX3JlZ2lzdHJhdGlvbnM6CisJd2hpbGUoLS1pID49IDApCisJCWNjaWRfZGVhY3RpdmF0ZShjY2lkc1tpXSk7CisJdGZyY19saWJfZXhpdCgpOworCXJldHVybiBlcnI7Cit9CisKK3ZvaWQgY2NpZF9jbGVhbnVwX2J1aWx0aW5zKHZvaWQpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShjY2lkcyk7IGkrKykKKwkJY2NpZF9kZWFjdGl2YXRlKGNjaWRzW2ldKTsKKwl0ZnJjX2xpYl9leGl0KCk7Cit9CmRpZmYgLS1naXQgYS9uZXQvZGNjcC9jY2lkLmggYi9uZXQvZGNjcC9jY2lkLmgKaW5kZXggMThmNjk0Mi4uZmFjZWRkMiAxMDA2NDQKLS0tIGEvbmV0L2RjY3AvY2NpZC5oCisrKyBiL25ldC9kY2NwL2NjaWQuaApAQCAtMjksNyArMjksNiBAQAogICogIEBjY2lkX2lkOiBudW1lcmljYWwgQ0NJRCBJRCAodXAgdG8gJUNDSURfTUFYLCBjZi4gdGFibGUgNSBpbiBSRkMgNDM0MCwgMTAuKQogICogIEBjY2lkX2NjbXBzOiB0aGUgQ0NNUFMgaW5jbHVkaW5nIG5ldHdvcmsvdHJhbnNwb3J0IGhlYWRlcnMgKDAgd2hlbiBkaXNhYmxlZCkKICAqICBAY2NpZF9uYW1lOiBhbHBoYWJldGljYWwgaWRlbnRpZmllciBzdHJpbmcgZm9yIEBjY2lkX2lkCi0gKiAgQGNjaWRfb3duZXI6IG1vZHVsZSB3aGljaCBpbXBsZW1lbnRzL293bnMgdGhpcyBDQ0lECiAgKiAgQGNjaWRfaGNfe3IsdH14X3NsYWI6IG1lbW9yeSBwb29sIGZvciB0aGUgcmVjZWl2ZXIvc2VuZGVyIGhhbGYtY29ubmVjdGlvbgogICogIEBjY2lkX2hjX3tyLHR9eF9vYmpfc2l6ZTogc2l6ZSBvZiB0aGUgcmVjZWl2ZXIvc2VuZGVyIGhhbGYtY29ubmVjdGlvbiBzb2NrZXQKICAqCkBAIC00OCw3ICs0Nyw2IEBACiAJdW5zaWduZWQgY2hhcgkJY2NpZF9pZDsKIAlfX3UzMgkJCWNjaWRfY2NtcHM7CiAJY29uc3QgY2hhcgkJKmNjaWRfbmFtZTsKLQlzdHJ1Y3QgbW9kdWxlCQkqY2NpZF9vd25lcjsKIAlzdHJ1Y3Qga21lbV9jYWNoZQkqY2NpZF9oY19yeF9zbGFiLAogCQkJCSpjY2lkX2hjX3R4X3NsYWI7CiAJX191MzIJCQljY2lkX2hjX3J4X29ial9zaXplLApAQCAtOTAsOCArODgsMTMgQEAKIAkJCQkJCSBpbnQgX191c2VyICpvcHRsZW4pOwogfTsKIAotZXh0ZXJuIGludCBjY2lkX3JlZ2lzdGVyKHN0cnVjdCBjY2lkX29wZXJhdGlvbnMgKmNjaWRfb3BzKTsKLWV4dGVybiBpbnQgY2NpZF91bnJlZ2lzdGVyKHN0cnVjdCBjY2lkX29wZXJhdGlvbnMgKmNjaWRfb3BzKTsKK2V4dGVybiBzdHJ1Y3QgY2NpZF9vcGVyYXRpb25zIGNjaWQyX29wczsKKyNpZmRlZiBDT05GSUdfSVBfRENDUF9DQ0lEMworZXh0ZXJuIHN0cnVjdCBjY2lkX29wZXJhdGlvbnMgY2NpZDNfb3BzOworI2VuZGlmCisKK2V4dGVybiBpbnQgIGNjaWRfaW5pdGlhbGl6ZV9idWlsdGlucyh2b2lkKTsKK2V4dGVybiB2b2lkIGNjaWRfY2xlYW51cF9idWlsdGlucyh2b2lkKTsKIAogc3RydWN0IGNjaWQgewogCXN0cnVjdCBjY2lkX29wZXJhdGlvbnMgKmNjaWRfb3BzOwpAQCAtMTA4LDggKzExMSw3IEBACiBleHRlcm4gaW50ICBjY2lkX2dldHNvY2tvcHRfYnVpbHRpbl9jY2lkcyhzdHJ1Y3Qgc29jayAqc2ssIGludCBsZW4sCiAJCQkJCSAgY2hhciBfX3VzZXIgKiwgaW50IF9fdXNlciAqKTsKIAotZXh0ZXJuIHN0cnVjdCBjY2lkICpjY2lkX25ldyh1bnNpZ25lZCBjaGFyIGlkLCBzdHJ1Y3Qgc29jayAqc2ssIGludCByeCwKLQkJCSAgICAgZ2ZwX3QgZ2ZwKTsKK2V4dGVybiBzdHJ1Y3QgY2NpZCAqY2NpZF9uZXcoY29uc3QgdTggaWQsIHN0cnVjdCBzb2NrICpzaywgYm9vbCByeCk7CiAKIHN0YXRpYyBpbmxpbmUgaW50IGNjaWRfZ2V0X2N1cnJlbnRfcnhfY2NpZChzdHJ1Y3QgZGNjcF9zb2NrICpkcCkKIHsKZGlmZiAtLWdpdCBhL25ldC9kY2NwL2NjaWRzL0tjb25maWcgYi9uZXQvZGNjcC9jY2lkcy9LY29uZmlnCmluZGV4IDEyMjc1OTQuLmIyOGJmOTYgMTAwNjQ0Ci0tLSBhL25ldC9kY2NwL2NjaWRzL0tjb25maWcKKysrIGIvbmV0L2RjY3AvY2NpZHMvS2NvbmZpZwpAQCAtMSw4MCArMSw1MSBAQAogbWVudSAiRENDUCBDQ0lEcyBDb25maWd1cmF0aW9uIChFWFBFUklNRU5UQUwpIgogCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMCiAKLWNvbmZpZyBJUF9EQ0NQX0NDSUQyCi0JdHJpc3RhdGUgIkNDSUQyIChUQ1AtTGlrZSkgKEVYUEVSSU1FTlRBTCkiCi0JZGVmX3RyaXN0YXRlIElQX0RDQ1AKLQlzZWxlY3QgSVBfRENDUF9BQ0tWRUMKLQktLS1oZWxwLS0tCi0JICBDQ0lEIDIsIFRDUC1saWtlIENvbmdlc3Rpb24gQ29udHJvbCwgZGVub3RlcyBBZGRpdGl2ZSBJbmNyZWFzZSwKLQkgIE11bHRpcGxpY2F0aXZlIERlY3JlYXNlIChBSU1EKSBjb25nZXN0aW9uIGNvbnRyb2wgd2l0aCBiZWhhdmlvcgotCSAgbW9kZWxsZWQgZGlyZWN0bHkgb24gVENQLCBpbmNsdWRpbmcgY29uZ2VzdGlvbiB3aW5kb3csIHNsb3cgc3RhcnQsCi0JICB0aW1lb3V0cywgYW5kIHNvIGZvcnRoIFtSRkMgMjU4MV0uICBDQ0lEIDIgYWNoaWV2ZXMgbWF4aW11bQotCSAgYmFuZHdpZHRoIG92ZXIgdGhlIGxvbmcgdGVybSwgY29uc2lzdGVudCB3aXRoIHRoZSB1c2Ugb2YgZW5kLXRvLWVuZAotCSAgY29uZ2VzdGlvbiBjb250cm9sLCBidXQgaGFsdmVzIGl0cyBjb25nZXN0aW9uIHdpbmRvdyBpbiByZXNwb25zZSB0bwotCSAgZWFjaCBjb25nZXN0aW9uIGV2ZW50LiAgVGhpcyBsZWFkcyB0byB0aGUgYWJydXB0IHJhdGUgY2hhbmdlcwotCSAgdHlwaWNhbCBvZiBUQ1AuICBBcHBsaWNhdGlvbnMgc2hvdWxkIHVzZSBDQ0lEIDIgaWYgdGhleSBwcmVmZXIKLQkgIG1heGltdW0gYmFuZHdpZHRoIHV0aWxpemF0aW9uIHRvIHN0ZWFkaW5lc3Mgb2YgcmF0ZS4gIFRoaXMgaXMgb2Z0ZW4KLQkgIHRoZSBjYXNlIGZvciBhcHBsaWNhdGlvbnMgdGhhdCBhcmUgbm90IHBsYXlpbmcgdGhlaXIgZGF0YSBkaXJlY3RseQotCSAgdG8gdGhlIHVzZXIuICBGb3IgZXhhbXBsZSwgYSBoeXBvdGhldGljYWwgYXBwbGljYXRpb24gdGhhdAotCSAgdHJhbnNmZXJyZWQgZmlsZXMgb3ZlciBEQ0NQLCB1c2luZyBhcHBsaWNhdGlvbi1sZXZlbCByZXRyYW5zbWlzc2lvbnMKLQkgIGZvciBsb3N0IHBhY2tldHMsIHdvdWxkIHByZWZlciBDQ0lEIDIgdG8gQ0NJRCAzLiAgT24tbGluZSBnYW1lcyBtYXkKLQkgIGFsc28gcHJlZmVyIENDSUQgMi4gIFNlZSBSRkMgNDM0MSBmb3IgZnVydGhlciBkZXRhaWxzLgotCi0JICBDQ0lEMiBpcyB0aGUgZGVmYXVsdCBDQ0lEIHVzZWQgYnkgRENDUC4KLQogY29uZmlnIElQX0RDQ1BfQ0NJRDJfREVCVUcKLQkgIGJvb2wgIkNDSUQyIGRlYnVnZ2luZyBtZXNzYWdlcyIKLQkgIGRlcGVuZHMgb24gSVBfRENDUF9DQ0lEMgotCSAgLS0taGVscC0tLQotCSAgICBFbmFibGUgQ0NJRDItc3BlY2lmaWMgZGVidWdnaW5nIG1lc3NhZ2VzLgorCWJvb2wgIkNDSUQtMiBkZWJ1Z2dpbmcgbWVzc2FnZXMiCisJLS0taGVscC0tLQorCSAgRW5hYmxlIENDSUQtMiBzcGVjaWZpYyBkZWJ1Z2dpbmcgbWVzc2FnZXMuCiAKLQkgICAgV2hlbiBjb21waWxpbmcgQ0NJRDIgYXMgYSBtb2R1bGUsIHRoaXMgZGVidWdnaW5nIG91dHB1dCBjYW4KLQkgICAgYWRkaXRpb25hbGx5IGJlIHRvZ2dsZWQgYnkgc2V0dGluZyB0aGUgY2NpZDJfZGVidWcgbW9kdWxlCi0JICAgIHBhcmFtZXRlciB0byAwIG9yIDEuCisJICBUaGUgZGVidWdnaW5nIG91dHB1dCBjYW4gYWRkaXRpb25hbGx5IGJlIHRvZ2dsZWQgYnkgc2V0dGluZyB0aGUKKwkgIGNjaWQyX2RlYnVnIHBhcmFtZXRlciB0byAwIG9yIDEuCiAKLQkgICAgSWYgaW4gZG91YnQsIHNheSBOLgorCSAgSWYgaW4gZG91YnQsIHNheSBOLgogCiBjb25maWcgSVBfRENDUF9DQ0lEMwotCXRyaXN0YXRlICJDQ0lEMyAoVENQLUZyaWVuZGx5KSAoRVhQRVJJTUVOVEFMKSIKLQlkZWZfdHJpc3RhdGUgSVBfRENDUAotCXNlbGVjdCBJUF9EQ0NQX1RGUkNfTElCCisJYm9vbCAiQ0NJRC0zIChUQ1AtRnJpZW5kbHkpIChFWFBFUklNRU5UQUwpIgorCWRlZl9ib29sIHkgaWYgKElQX0RDQ1AgPSB5IHx8IElQX0RDQ1AgPSBtKQogCS0tLWhlbHAtLS0KLQkgIENDSUQgMyBkZW5vdGVzIFRDUC1GcmllbmRseSBSYXRlIENvbnRyb2wgKFRGUkMpLCBhbiBlcXVhdGlvbi1iYXNlZAorCSAgQ0NJRC0zIGRlbm90ZXMgVENQLUZyaWVuZGx5IFJhdGUgQ29udHJvbCAoVEZSQyksIGFuIGVxdWF0aW9uLWJhc2VkCiAJICByYXRlLWNvbnRyb2xsZWQgY29uZ2VzdGlvbiBjb250cm9sIG1lY2hhbmlzbS4gIFRGUkMgaXMgZGVzaWduZWQgdG8KIAkgIGJlIHJlYXNvbmFibHkgZmFpciB3aGVuIGNvbXBldGluZyBmb3IgYmFuZHdpZHRoIHdpdGggVENQLWxpa2UgZmxvd3MsCiAJICB3aGVyZSBhIGZsb3cgaXMgInJlYXNvbmFibHkgZmFpciIgaWYgaXRzIHNlbmRpbmcgcmF0ZSBpcyBnZW5lcmFsbHkKIAkgIHdpdGhpbiBhIGZhY3RvciBvZiB0d28gb2YgdGhlIHNlbmRpbmcgcmF0ZSBvZiBhIFRDUCBmbG93IHVuZGVyIHRoZQogCSAgc2FtZSBjb25kaXRpb25zLiAgSG93ZXZlciwgVEZSQyBoYXMgYSBtdWNoIGxvd2VyIHZhcmlhdGlvbiBvZgotCSAgdGhyb3VnaHB1dCBvdmVyIHRpbWUgY29tcGFyZWQgd2l0aCBUQ1AsIHdoaWNoIG1ha2VzIENDSUQgMyBtb3JlCi0JICBzdWl0YWJsZSB0aGFuIENDSUQgMiBmb3IgYXBwbGljYXRpb25zIHN1Y2ggc3RyZWFtaW5nIG1lZGlhIHdoZXJlIGEKKwkgIHRocm91Z2hwdXQgb3ZlciB0aW1lIGNvbXBhcmVkIHdpdGggVENQLCB3aGljaCBtYWtlcyBDQ0lELTMgbW9yZQorCSAgc3VpdGFibGUgdGhhbiBDQ0lELTIgZm9yIGFwcGxpY2F0aW9ucyBzdWNoIHN0cmVhbWluZyBtZWRpYSB3aGVyZSBhCiAJICByZWxhdGl2ZWx5IHNtb290aCBzZW5kaW5nIHJhdGUgaXMgb2YgaW1wb3J0YW5jZS4KIAotCSAgQ0NJRCAzIGlzIGZ1cnRoZXIgZGVzY3JpYmVkIGluIFJGQyA0MzQyLAorCSAgQ0NJRC0zIGlzIGZ1cnRoZXIgZGVzY3JpYmVkIGluIFJGQyA0MzQyLAogCSAgaHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjNDM0Mi50eHQKIAogCSAgVGhlIFRGUkMgY29uZ2VzdGlvbiBjb250cm9sIGFsZ29yaXRobXMgd2VyZSBpbml0aWFsbHkgZGVzY3JpYmVkIGluCi0JICBSRkMgMzQ0OC4KKwkgIFJGQyA1NDQ4LgogCiAJICBUaGlzIHRleHQgd2FzIGV4dHJhY3RlZCBmcm9tIFJGQyA0MzQwIChzZWMuIDEwLjIpLAogCSAgaHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjNDM0MC50eHQKLQkgIAotCSAgVG8gY29tcGlsZSB0aGlzIENDSUQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUgd2lsbCBiZQotCSAgY2FsbGVkIGRjY3BfY2NpZDMuCiAKLQkgIElmIGluIGRvdWJ0LCBzYXkgTS4KKwkgIElmIGluIGRvdWJ0LCBzYXkgTi4KIAogY29uZmlnIElQX0RDQ1BfQ0NJRDNfREVCVUcKLQkgIGJvb2wgIkNDSUQzIGRlYnVnZ2luZyBtZXNzYWdlcyIKLQkgIGRlcGVuZHMgb24gSVBfRENDUF9DQ0lEMwotCSAgLS0taGVscC0tLQotCSAgICBFbmFibGUgQ0NJRDMtc3BlY2lmaWMgZGVidWdnaW5nIG1lc3NhZ2VzLgorCWJvb2wgIkNDSUQtMyBkZWJ1Z2dpbmcgbWVzc2FnZXMiCisJZGVwZW5kcyBvbiBJUF9EQ0NQX0NDSUQzCisJLS0taGVscC0tLQorCSAgRW5hYmxlIENDSUQtMyBzcGVjaWZpYyBkZWJ1Z2dpbmcgbWVzc2FnZXMuCiAKLQkgICAgV2hlbiBjb21waWxpbmcgQ0NJRDMgYXMgYSBtb2R1bGUsIHRoaXMgZGVidWdnaW5nIG91dHB1dCBjYW4KLQkgICAgYWRkaXRpb25hbGx5IGJlIHRvZ2dsZWQgYnkgc2V0dGluZyB0aGUgY2NpZDNfZGVidWcgbW9kdWxlCi0JICAgIHBhcmFtZXRlciB0byAwIG9yIDEuCisJICBUaGUgZGVidWdnaW5nIG91dHB1dCBjYW4gYWRkaXRpb25hbGx5IGJlIHRvZ2dsZWQgYnkgc2V0dGluZyB0aGUKKwkgIGNjaWQzX2RlYnVnIHBhcmFtZXRlciB0byAwIG9yIDEuCiAKLQkgICAgSWYgaW4gZG91YnQsIHNheSBOLgorCSAgSWYgaW4gZG91YnQsIHNheSBOLgogCiBjb25maWcgSVBfRENDUF9DQ0lEM19SVE8KIAkgIGludCAiVXNlIGhpZ2hlciBib3VuZCBmb3Igbm9mZWVkYmFjayB0aW1lciIKQEAgLTEwOCwxMiArNzksOCBAQAogCSAgICB0aGVyZWZvcmUgbm90IGJlIHBlcmZvcm1lZCBvbiBXQU5zLgogCiBjb25maWcgSVBfRENDUF9URlJDX0xJQgotCXRyaXN0YXRlCi0JZGVmYXVsdCBuCisJZGVmX2Jvb2wgeSBpZiBJUF9EQ0NQX0NDSUQzCiAKIGNvbmZpZyBJUF9EQ0NQX1RGUkNfREVCVUcKLQlib29sCi0JZGVwZW5kcyBvbiBJUF9EQ0NQX1RGUkNfTElCCi0JZGVmYXVsdCB5IGlmIElQX0RDQ1BfQ0NJRDNfREVCVUcKLQorCWRlZl9ib29sIHkgaWYgSVBfRENDUF9DQ0lEM19ERUJVRwogZW5kbWVudQpkaWZmIC0tZ2l0IGEvbmV0L2RjY3AvY2NpZHMvTWFrZWZpbGUgYi9uZXQvZGNjcC9jY2lkcy9NYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDM4ZjIwYi4uMDAwMDAwMAotLS0gYS9uZXQvZGNjcC9jY2lkcy9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotb2JqLSQoQ09ORklHX0lQX0RDQ1BfQ0NJRDMpICs9IGRjY3BfY2NpZDMubwotCi1kY2NwX2NjaWQzLXkgOj0gY2NpZDMubwotCi1vYmotJChDT05GSUdfSVBfRENDUF9DQ0lEMikgKz0gZGNjcF9jY2lkMi5vCi0KLWRjY3BfY2NpZDIteSA6PSBjY2lkMi5vCi0KLW9iai15ICs9IGxpYi8KZGlmZiAtLWdpdCBhL25ldC9kY2NwL2NjaWRzL2NjaWQyLmMgYi9uZXQvZGNjcC9jY2lkcy9jY2lkMi5jCmluZGV4IGM5ZWExOWEuLmQyMzUyOTQgMTAwNjQ0Ci0tLSBhL25ldC9kY2NwL2NjaWRzL2NjaWQyLmMKKysrIGIvbmV0L2RjY3AvY2NpZHMvY2NpZDIuYwpAQCAtNzY4LDEwICs3NjgsOSBAQAogCX0KIH0KIAotc3RhdGljIHN0cnVjdCBjY2lkX29wZXJhdGlvbnMgY2NpZDIgPSB7CitzdHJ1Y3QgY2NpZF9vcGVyYXRpb25zIGNjaWQyX29wcyA9IHsKIAkuY2NpZF9pZAkJPSBEQ0NQQ19DQ0lEMiwKIAkuY2NpZF9uYW1lCQk9ICJUQ1AtbGlrZSIsCi0JLmNjaWRfb3duZXIJCT0gVEhJU19NT0RVTEUsCiAJLmNjaWRfaGNfdHhfb2JqX3NpemUJPSBzaXplb2Yoc3RydWN0IGNjaWQyX2hjX3R4X3NvY2spLAogCS5jY2lkX2hjX3R4X2luaXQJPSBjY2lkMl9oY190eF9pbml0LAogCS5jY2lkX2hjX3R4X2V4aXQJPSBjY2lkMl9oY190eF9leGl0LApAQCAtNzg0LDIyICs3ODMsNSBAQAogCiAjaWZkZWYgQ09ORklHX0lQX0RDQ1BfQ0NJRDJfREVCVUcKIG1vZHVsZV9wYXJhbShjY2lkMl9kZWJ1ZywgYm9vbCwgMDY0NCk7Ci1NT0RVTEVfUEFSTV9ERVNDKGNjaWQyX2RlYnVnLCAiRW5hYmxlIGRlYnVnIG1lc3NhZ2VzIik7CitNT0RVTEVfUEFSTV9ERVNDKGNjaWQyX2RlYnVnLCAiRW5hYmxlIENDSUQtMiBkZWJ1ZyBtZXNzYWdlcyIpOwogI2VuZGlmCi0KLXN0YXRpYyBfX2luaXQgaW50IGNjaWQyX21vZHVsZV9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIGNjaWRfcmVnaXN0ZXIoJmNjaWQyKTsKLX0KLW1vZHVsZV9pbml0KGNjaWQyX21vZHVsZV9pbml0KTsKLQotc3RhdGljIF9fZXhpdCB2b2lkIGNjaWQyX21vZHVsZV9leGl0KHZvaWQpCi17Ci0JY2NpZF91bnJlZ2lzdGVyKCZjY2lkMik7Ci19Ci1tb2R1bGVfZXhpdChjY2lkMl9tb2R1bGVfZXhpdCk7Ci0KLU1PRFVMRV9BVVRIT1IoIkFuZHJlYSBCaXR0YXUgPGEuYml0dGF1QGNzLnVjbC5hYy51az4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiRENDUCBUQ1AtTGlrZSAoQ0NJRDIpIENDSUQiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLU1PRFVMRV9BTElBUygibmV0LWRjY3AtY2NpZC0yIik7CmRpZmYgLS1naXQgYS9uZXQvZGNjcC9jY2lkcy9jY2lkMy5jIGIvbmV0L2RjY3AvY2NpZHMvY2NpZDMuYwppbmRleCAzYjhiZDdjLi5hMjdiN2Y0IDEwMDY0NAotLS0gYS9uZXQvZGNjcC9jY2lkcy9jY2lkMy5jCisrKyBiL25ldC9kY2NwL2NjaWRzL2NjaWQzLmMKQEAgLTk0MCwxMCArOTQwLDkgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBjY2lkX29wZXJhdGlvbnMgY2NpZDMgPSB7CitzdHJ1Y3QgY2NpZF9vcGVyYXRpb25zIGNjaWQzX29wcyA9IHsKIAkuY2NpZF9pZAkJICAgPSBEQ0NQQ19DQ0lEMywKIAkuY2NpZF9uYW1lCQkgICA9ICJUQ1AtRnJpZW5kbHkgUmF0ZSBDb250cm9sIiwKLQkuY2NpZF9vd25lcgkJICAgPSBUSElTX01PRFVMRSwKIAkuY2NpZF9oY190eF9vYmpfc2l6ZQkgICA9IHNpemVvZihzdHJ1Y3QgY2NpZDNfaGNfdHhfc29jayksCiAJLmNjaWRfaGNfdHhfaW5pdAkgICA9IGNjaWQzX2hjX3R4X2luaXQsCiAJLmNjaWRfaGNfdHhfZXhpdAkgICA9IGNjaWQzX2hjX3R4X2V4aXQsCkBAIC05NjQsMjMgKzk2Myw1IEBACiAKICNpZmRlZiBDT05GSUdfSVBfRENDUF9DQ0lEM19ERUJVRwogbW9kdWxlX3BhcmFtKGNjaWQzX2RlYnVnLCBib29sLCAwNjQ0KTsKLU1PRFVMRV9QQVJNX0RFU0MoY2NpZDNfZGVidWcsICJFbmFibGUgZGVidWcgbWVzc2FnZXMiKTsKK01PRFVMRV9QQVJNX0RFU0MoY2NpZDNfZGVidWcsICJFbmFibGUgQ0NJRC0zIGRlYnVnIG1lc3NhZ2VzIik7CiAjZW5kaWYKLQotc3RhdGljIF9faW5pdCBpbnQgY2NpZDNfbW9kdWxlX2luaXQodm9pZCkKLXsKLQlyZXR1cm4gY2NpZF9yZWdpc3RlcigmY2NpZDMpOwotfQotbW9kdWxlX2luaXQoY2NpZDNfbW9kdWxlX2luaXQpOwotCi1zdGF0aWMgX19leGl0IHZvaWQgY2NpZDNfbW9kdWxlX2V4aXQodm9pZCkKLXsKLQljY2lkX3VucmVnaXN0ZXIoJmNjaWQzKTsKLX0KLW1vZHVsZV9leGl0KGNjaWQzX21vZHVsZV9leGl0KTsKLQotTU9EVUxFX0FVVEhPUigiSWFuIE1jRG9uYWxkIDxpYW4ubWNkb25hbGRAamFuZGkuY28ubno+LCAiCi0JICAgICAgIkFybmFsZG8gQ2FydmFsaG8gZGUgTWVsbyA8YWNtZUBnaG9zdHByb3RvY29scy5uZXQ+Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIkRDQ1AgVEZSQyBDQ0lEMyBDQ0lEIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci1NT0RVTEVfQUxJQVMoIm5ldC1kY2NwLWNjaWQtMyIpOwpkaWZmIC0tZ2l0IGEvbmV0L2RjY3AvY2NpZHMvbGliL01ha2VmaWxlIGIvbmV0L2RjY3AvY2NpZHMvbGliL01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OGM5M2UzLi4wMDAwMDAwCi0tLSBhL25ldC9kY2NwL2NjaWRzL2xpYi9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotb2JqLSQoQ09ORklHX0lQX0RDQ1BfVEZSQ19MSUIpICs9IGRjY3BfdGZyY19saWIubwotCi1kY2NwX3RmcmNfbGliLXkgOj0gdGZyYy5vIHRmcmNfZXF1YXRpb24ubyBwYWNrZXRfaGlzdG9yeS5vIGxvc3NfaW50ZXJ2YWwubwpkaWZmIC0tZ2l0IGEvbmV0L2RjY3AvY2NpZHMvbGliL2xvc3NfaW50ZXJ2YWwuYyBiL25ldC9kY2NwL2NjaWRzL2xpYi9sb3NzX2ludGVydmFsLmMKaW5kZXggNWIzY2UwNi4uNGQxZTQwMSAxMDA2NDQKLS0tIGEvbmV0L2RjY3AvY2NpZHMvbGliL2xvc3NfaW50ZXJ2YWwuYworKysgYi9uZXQvZGNjcC9jY2lkcy9saWIvbG9zc19pbnRlcnZhbC5jCkBAIC02MCw3ICs2MCw2IEBACiAJCQlsaC0+cmluZ1tMSUhfSU5ERVgobGgtPmNvdW50ZXIpXSA9IE5VTEw7CiAJCX0KIH0KLUVYUE9SVF9TWU1CT0xfR1BMKHRmcmNfbGhfY2xlYW51cCk7CiAKIHN0YXRpYyB2b2lkIHRmcmNfbGhfY2FsY19pX21lYW4oc3RydWN0IHRmcmNfbG9zc19oaXN0ICpsaCkKIHsKQEAgLTEyMSw3ICsxMjAsNiBAQAogCiAJcmV0dXJuIChsaC0+aV9tZWFuIDwgb2xkX2lfbWVhbik7CiB9Ci1FWFBPUlRfU1lNQk9MX0dQTCh0ZnJjX2xoX3VwZGF0ZV9pX21lYW4pOwogCiAvKiBEZXRlcm1pbmUgaWYgYG5ld19sb3NzJyBkb2VzIGJlZ2luIGEgbmV3IGxvc3MgaW50ZXJ2YWwgW1JGQyA0MzQyLCAxMC4yXSAqLwogc3RhdGljIGlubGluZSB1OCB0ZnJjX2xoX2lzX25ld19sb3NzKHN0cnVjdCB0ZnJjX2xvc3NfaW50ZXJ2YWwgKmN1ciwKQEAgLTE2OSw3ICsxNjcsNiBAQAogCX0KIAlyZXR1cm4gMTsKIH0KLUVYUE9SVF9TWU1CT0xfR1BMKHRmcmNfbGhfaW50ZXJ2YWxfYWRkKTsKIAogaW50IF9faW5pdCB0ZnJjX2xpX2luaXQodm9pZCkKIHsKZGlmZiAtLWdpdCBhL25ldC9kY2NwL2NjaWRzL2xpYi9wYWNrZXRfaGlzdG9yeS5jIGIvbmV0L2RjY3AvY2NpZHMvbGliL3BhY2tldF9oaXN0b3J5LmMKaW5kZXggNmNjMTA4YS4uYjc3ODViMyAxMDA2NDQKLS0tIGEvbmV0L2RjY3AvY2NpZHMvbGliL3BhY2tldF9oaXN0b3J5LmMKKysrIGIvbmV0L2RjY3AvY2NpZHMvbGliL3BhY2tldF9oaXN0b3J5LmMKQEAgLTk0LDcgKzk0LDYgQEAKIAkqaGVhZHAJICAgICA9IGVudHJ5OwogCXJldHVybiAwOwogfQotRVhQT1JUX1NZTUJPTF9HUEwodGZyY190eF9oaXN0X2FkZCk7CiAKIHZvaWQgdGZyY190eF9oaXN0X3B1cmdlKHN0cnVjdCB0ZnJjX3R4X2hpc3RfZW50cnkgKipoZWFkcCkKIHsKQEAgLTEwOSw3ICsxMDgsNiBAQAogCiAJKmhlYWRwID0gTlVMTDsKIH0KLUVYUE9SVF9TWU1CT0xfR1BMKHRmcmNfdHhfaGlzdF9wdXJnZSk7CiAKIHUzMiB0ZnJjX3R4X2hpc3RfcnR0KHN0cnVjdCB0ZnJjX3R4X2hpc3RfZW50cnkgKmhlYWQsIGNvbnN0IHU2NCBzZXFubywKIAkJICAgICBjb25zdCBrdGltZV90IG5vdykKQEAgLTEyNyw3ICsxMjUsNiBAQAogCiAJcmV0dXJuIHJ0dDsKIH0KLUVYUE9SVF9TWU1CT0xfR1BMKHRmcmNfdHhfaGlzdF9ydHQpOwogCiAKIC8qCkBAIC0xNzIsNyArMTY5LDYgQEAKIAogCXRmcmNfcnhfaGlzdF9lbnRyeV9mcm9tX3NrYihlbnRyeSwgc2tiLCBuZHApOwogfQotRVhQT1JUX1NZTUJPTF9HUEwodGZyY19yeF9oaXN0X2FkZF9wYWNrZXQpOwogCiAvKiBoYXMgdGhlIHBhY2tldCBjb250YWluZWQgaW4gc2tiIGJlZW4gc2VlbiBiZWZvcmU/ICovCiBpbnQgdGZyY19yeF9oaXN0X2R1cGxpY2F0ZShzdHJ1Y3QgdGZyY19yeF9oaXN0ICpoLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQpAQCAtMTg5LDcgKzE4NSw2IEBACiAKIAlyZXR1cm4gMDsKIH0KLUVYUE9SVF9TWU1CT0xfR1BMKHRmcmNfcnhfaGlzdF9kdXBsaWNhdGUpOwogCiBzdGF0aWMgdm9pZCB0ZnJjX3J4X2hpc3Rfc3dhcChzdHJ1Y3QgdGZyY19yeF9oaXN0ICpoLCBjb25zdCB1OCBhLCBjb25zdCB1OCBiKQogewpAQCAtMzkwLDcgKzM4NSw2IEBACiAJfQogCXJldHVybiBpc19uZXdfbG9zczsKIH0KLUVYUE9SVF9TWU1CT0xfR1BMKHRmcmNfcnhfaGFuZGxlX2xvc3MpOwogCiBpbnQgdGZyY19yeF9oaXN0X2FsbG9jKHN0cnVjdCB0ZnJjX3J4X2hpc3QgKmgpCiB7CkBAIC00MTIsNyArNDA2LDYgQEAKIAl9CiAJcmV0dXJuIC1FTk9CVUZTOwogfQotRVhQT1JUX1NZTUJPTF9HUEwodGZyY19yeF9oaXN0X2FsbG9jKTsKIAogdm9pZCB0ZnJjX3J4X2hpc3RfcHVyZ2Uoc3RydWN0IHRmcmNfcnhfaGlzdCAqaCkKIHsKQEAgLTQyNCw3ICs0MTcsNiBAQAogCQkJaC0+cmluZ1tpXSA9IE5VTEw7CiAJCX0KIH0KLUVYUE9SVF9TWU1CT0xfR1BMKHRmcmNfcnhfaGlzdF9wdXJnZSk7CiAKIC8qKgogICogdGZyY19yeF9oaXN0X3J0dF9sYXN0X3MgLSByZWZlcmVuY2UgZW50cnkgdG8gY29tcHV0ZSBSVFQgc2FtcGxlcyBhZ2FpbnN0CkBAIC00OTUsNCArNDg3LDMgQEAKIAogCXJldHVybiBzYW1wbGU7CiB9Ci1FWFBPUlRfU1lNQk9MX0dQTCh0ZnJjX3J4X2hpc3Rfc2FtcGxlX3J0dCk7CmRpZmYgLS1naXQgYS9uZXQvZGNjcC9jY2lkcy9saWIvdGZyYy5jIGIvbmV0L2RjY3AvY2NpZHMvbGliL3RmcmMuYwppbmRleCAxODU5MTYyLi42MGM0MTJjIDEwMDY0NAotLS0gYS9uZXQvZGNjcC9jY2lkcy9saWIvdGZyYy5jCisrKyBiL25ldC9kY2NwL2NjaWRzL2xpYi90ZnJjLmMKQEAgLTEsMjAgKzEsMTggQEAKIC8qCi0gKiBURlJDOiBtYWluIG1vZHVsZSBob2xkaW5nIHRoZSBwaWVjZXMgb2YgdGhlIFRGUkMgbGlicmFyeSB0b2dldGhlcgorICogVEZSQyBsaWJyYXJ5IGluaXRpYWxpc2F0aW9uCiAgKgogICogQ29weXJpZ2h0IChjKSAyMDA3IFRoZSBVbml2ZXJzaXR5IG9mIEFiZXJkZWVuLCBTY290bGFuZCwgVUsKICAqIENvcHlyaWdodCAoYykgMjAwNyBBcm5hbGRvIENhcnZhbGhvIGRlIE1lbG8gPGFjbWVAcmVkaGF0LmNvbT4KICAqLwotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CiAjaW5jbHVkZSAidGZyYy5oIgogCiAjaWZkZWYgQ09ORklHX0lQX0RDQ1BfVEZSQ19ERUJVRwogaW50IHRmcmNfZGVidWc7CiBtb2R1bGVfcGFyYW0odGZyY19kZWJ1ZywgYm9vbCwgMDY0NCk7Ci1NT0RVTEVfUEFSTV9ERVNDKHRmcmNfZGVidWcsICJFbmFibGUgZGVidWcgbWVzc2FnZXMiKTsKK01PRFVMRV9QQVJNX0RFU0ModGZyY19kZWJ1ZywgIkVuYWJsZSBURlJDIGRlYnVnIG1lc3NhZ2VzIik7CiAjZW5kaWYKIAotc3RhdGljIGludCBfX2luaXQgdGZyY19tb2R1bGVfaW5pdCh2b2lkKQoraW50IF9faW5pdCB0ZnJjX2xpYl9pbml0KHZvaWQpCiB7CiAJaW50IHJjID0gdGZyY19saV9pbml0KCk7CiAKQEAgLTM4LDE4ICszNiw5IEBACiAJcmV0dXJuIHJjOwogfQogCi1zdGF0aWMgdm9pZCBfX2V4aXQgdGZyY19tb2R1bGVfZXhpdCh2b2lkKQordm9pZCBfX2V4aXQgdGZyY19saWJfZXhpdCh2b2lkKQogewogCXRmcmNfcnhfcGFja2V0X2hpc3RvcnlfZXhpdCgpOwogCXRmcmNfdHhfcGFja2V0X2hpc3RvcnlfZXhpdCgpOwogCXRmcmNfbGlfZXhpdCgpOwogfQotCi1tb2R1bGVfaW5pdCh0ZnJjX21vZHVsZV9pbml0KTsKLW1vZHVsZV9leGl0KHRmcmNfbW9kdWxlX2V4aXQpOwotCi1NT0RVTEVfQVVUSE9SKCJHZXJyaXQgUmVua2VyIDxnZXJyaXRAZXJnLmFiZG4uYWMudWs+LCAiCi0JICAgICAgIklhbiBNY0RvbmFsZCA8aWFuLm1jZG9uYWxkQGphbmRpLmNvLm56PiwgIgotCSAgICAgICJBcm5hbGRvIENhcnZhbGhvIGRlIE1lbG8gPGFjbWVAcmVkaGF0LmNvbT4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiRENDUCBURlJDIGxpYnJhcnkiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL25ldC9kY2NwL2NjaWRzL2xpYi90ZnJjLmggYi9uZXQvZGNjcC9jY2lkcy9saWIvdGZyYy5oCmluZGV4IGVkOTg1NzUuLmU5NzIwYjEgMTAwNjQ0Ci0tLSBhL25ldC9kY2NwL2NjaWRzL2xpYi90ZnJjLmgKKysrIGIvbmV0L2RjY3AvY2NpZHMvbGliL3RmcmMuaApAQCAtMTcsNyArMTcsOCBAQAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvbWF0aDY0Lmg+CiAjaW5jbHVkZSAiLi4vLi4vZGNjcC5oIgotLyogaW50ZXJuYWwgaW5jbHVkZXMgdGhhdCB0aGlzIG1vZHVsZSBleHBvcnRzOiAqLworCisvKiBpbnRlcm5hbCBpbmNsdWRlcyB0aGF0IHRoaXMgbGlicmFyeSBleHBvcnRzOiAqLwogI2luY2x1ZGUgImxvc3NfaW50ZXJ2YWwuaCIKICNpbmNsdWRlICJwYWNrZXRfaGlzdG9yeS5oIgogCkBAIC02Niw0ICs2NywxMiBAQAogCiBleHRlcm4gaW50ICB0ZnJjX2xpX2luaXQodm9pZCk7CiBleHRlcm4gdm9pZCB0ZnJjX2xpX2V4aXQodm9pZCk7CisKKyNpZmRlZiBDT05GSUdfSVBfRENDUF9URlJDX0xJQgorZXh0ZXJuIGludCAgdGZyY19saWJfaW5pdCh2b2lkKTsKK2V4dGVybiB2b2lkIHRmcmNfbGliX2V4aXQodm9pZCk7CisjZWxzZQorI2RlZmluZSB0ZnJjX2xpYl9pbml0KCkgKDApCisjZGVmaW5lIHRmcmNfbGliX2V4aXQoKQorI2VuZGlmCiAjZW5kaWYgLyogX1RGUkNfSF8gKi8KZGlmZiAtLWdpdCBhL25ldC9kY2NwL2NjaWRzL2xpYi90ZnJjX2VxdWF0aW9uLmMgYi9uZXQvZGNjcC9jY2lkcy9saWIvdGZyY19lcXVhdGlvbi5jCmluZGV4IDJmMjBhMjkuLmM1ZDNhOWUgMTAwNjQ0Ci0tLSBhL25ldC9kY2NwL2NjaWRzL2xpYi90ZnJjX2VxdWF0aW9uLmMKKysrIGIvbmV0L2RjY3AvY2NpZHMvbGliL3RmcmNfZXF1YXRpb24uYwpAQCAtNjU5LDggKzY1OSw2IEBACiAJcmV0dXJuIHNjYWxlZF9kaXYzMihyZXN1bHQsIGYpOwogfQogCi1FWFBPUlRfU1lNQk9MX0dQTCh0ZnJjX2NhbGNfeCk7Ci0KIC8qKgogICogIHRmcmNfY2FsY194X3JldmVyc2VfbG9va3VwICAtICB0cnkgdG8gZmluZCBwIGdpdmVuIGYocCkKICAqCkBAIC02OTMsNSArNjkxLDMgQEAKIAlpbmRleCA9IHRmcmNfYmluc2VhcmNoKGZ2YWx1ZSwgMCk7CiAJcmV0dXJuIChpbmRleCArIDEpICogMTAwMDAwMCAvIFRGUkNfQ0FMQ19YX0FSUlNJWkU7CiB9Ci0KLUVYUE9SVF9TWU1CT0xfR1BMKHRmcmNfY2FsY194X3JldmVyc2VfbG9va3VwKTsKZGlmZiAtLWdpdCBhL25ldC9kY2NwL2RjY3AuaCBiL25ldC9kY2NwL2RjY3AuaAppbmRleCAwYmM0YzlhLi5mMjIzMGZjIDEwMDY0NAotLS0gYS9uZXQvZGNjcC9kY2NwLmgKKysrIGIvbmV0L2RjY3AvZGNjcC5oCkBAIC00MzIsMTAgKzQzMiw4IEBACiB7CiAJY29uc3Qgc3RydWN0IGRjY3Bfc29jayAqZHAgPSBkY2NwX3NrKHNrKTsKIAlyZXR1cm4gZHAtPmRjY3BzX3RpbWVzdGFtcF9lY2hvICE9IDAgfHwKLSNpZmRlZiBDT05GSUdfSVBfRENDUF9BQ0tWRUMKIAkgICAgICAgKGRwLT5kY2Nwc19oY19yeF9hY2t2ZWMgIT0gTlVMTCAmJgogCQlkY2NwX2Fja3ZlY19wZW5kaW5nKGRwLT5kY2Nwc19oY19yeF9hY2t2ZWMpKSB8fAotI2VuZGlmCiAJICAgICAgIGluZXRfY3NrX2Fja19zY2hlZHVsZWQoc2spOwogfQogCmRpZmYgLS1naXQgYS9uZXQvZGNjcC9mZWF0LmMgYi9uZXQvZGNjcC9mZWF0LmMKaW5kZXggMzBmOWZiNy4uNDE1MjMwOCAxMDA2NDQKLS0tIGEvbmV0L2RjY3AvZmVhdC5jCisrKyBiL25ldC9kY2NwL2ZlYXQuYwpAQCAtMzQsNyArMzQsNyBAQAogc3RhdGljIGludCBkY2NwX2hkbHJfY2NpZChzdHJ1Y3Qgc29jayAqc2ssIHU2NCBjY2lkLCBib29sIHJ4KQogewogCXN0cnVjdCBkY2NwX3NvY2sgKmRwID0gZGNjcF9zayhzayk7Ci0Jc3RydWN0IGNjaWQgKm5ld19jY2lkID0gY2NpZF9uZXcoY2NpZCwgc2ssIHJ4LCBnZnBfYW55KCkpOworCXN0cnVjdCBjY2lkICpuZXdfY2NpZCA9IGNjaWRfbmV3KGNjaWQsIHNrLCByeCk7CiAKIAlpZiAobmV3X2NjaWQgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07CkBAIC0xMjE0LDggKzEyMTQsNiBAQAogCXJldHVybiBOVUxMOwogfQogCi1FWFBPUlRfU1lNQk9MX0dQTChkY2NwX2ZlYXRfdHlwZW5hbWUpOwotCiBjb25zdCBjaGFyICpkY2NwX2ZlYXRfbmFtZShjb25zdCB1OCBmZWF0KQogewogCXN0YXRpYyBjb25zdCBjaGFyICpmZWF0dXJlX25hbWVzW10gPSB7CkBAIC0xMjQwLDYgKzEyMzgsNCBAQAogCiAJcmV0dXJuIGZlYXR1cmVfbmFtZXNbZmVhdF07CiB9Ci0KLUVYUE9SVF9TWU1CT0xfR1BMKGRjY3BfZmVhdF9uYW1lKTsKICNlbmRpZiAvKiBDT05GSUdfSVBfRENDUF9ERUJVRyAqLwpkaWZmIC0tZ2l0IGEvbmV0L2RjY3AvaW5wdXQuYyBiL25ldC9kY2NwL2lucHV0LmMKaW5kZXggNWViNDQzZi4uNzY0OGYzMSAxMDA2NDQKLS0tIGEvbmV0L2RjY3AvaW5wdXQuYworKysgYi9uZXQvZGNjcC9pbnB1dC5jCkBAIC03NDEsNSArNzQxLDMgQEAKIAogCXJldHVybiBkZWx0YTsKIH0KLQotRVhQT1JUX1NZTUJPTF9HUEwoZGNjcF9zYW1wbGVfcnR0KTsKZGlmZiAtLWdpdCBhL25ldC9kY2NwL3Byb3RvLmMgYi9uZXQvZGNjcC9wcm90by5jCmluZGV4IDE3NDdjY2EuLjk0NWI0ZDUgMTAwNjQ0Ci0tLSBhL25ldC9kY2NwL3Byb3RvLmMKKysrIGIvbmV0L2RjY3AvcHJvdG8uYwpAQCAtMTExOCw5ICsxMTE4LDE1IEBACiAJaWYgKHJjKQogCQlnb3RvIG91dF9hY2t2ZWNfZXhpdDsKIAorCXJjID0gY2NpZF9pbml0aWFsaXplX2J1aWx0aW5zKCk7CisJaWYgKHJjKQorCQlnb3RvIG91dF9zeXNjdGxfZXhpdDsKKwogCWRjY3BfdGltZXN0YW1waW5nX2luaXQoKTsKIG91dDoKIAlyZXR1cm4gcmM7CitvdXRfc3lzY3RsX2V4aXQ6CisJZGNjcF9zeXNjdGxfZXhpdCgpOwogb3V0X2Fja3ZlY19leGl0OgogCWRjY3BfYWNrdmVjX2V4aXQoKTsKIG91dF9mcmVlX2RjY3BfbWliOgpAQCAtMTE0Myw2ICsxMTQ5LDcgQEAKIAogc3RhdGljIHZvaWQgX19leGl0IGRjY3BfZmluaSh2b2lkKQogeworCWNjaWRfY2xlYW51cF9idWlsdGlucygpOwogCWRjY3BfbWliX2V4aXQoKTsKIAlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKWRjY3BfaGFzaGluZm8uYmhhc2gsCiAJCSAgIGdldF9vcmRlcihkY2NwX2hhc2hpbmZvLmJoYXNoX3NpemUgKgpkaWZmIC0tZ2l0IGEvbmV0L2RzYS9zbGF2ZS5jIGIvbmV0L2RzYS9zbGF2ZS5jCmluZGV4IGEzYTQxMGQuLmE2OGZkNzkgMTAwNjQ0Ci0tLSBhL25ldC9kc2Evc2xhdmUuYworKysgYi9uZXQvZHNhL3NsYXZlLmMKQEAgLTI4Niw2ICsyODYsNDIgQEAKIAkuZ2V0X3NzZXRfY291bnQJCT0gZHNhX3NsYXZlX2dldF9zc2V0X2NvdW50LAogfTsKIAorI2lmZGVmIENPTkZJR19ORVRfRFNBX1RBR19EU0EKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgZHNhX25ldGRldl9vcHMgPSB7CisJLm5kb19vcGVuCSAJPSBkc2Ffc2xhdmVfb3BlbiwKKwkubmRvX3N0b3AJCT0gZHNhX3NsYXZlX2Nsb3NlLAorCS5uZG9fc3RhcnRfeG1pdAkJPSBkc2FfeG1pdCwKKwkubmRvX2NoYW5nZV9yeF9mbGFncwk9IGRzYV9zbGF2ZV9jaGFuZ2VfcnhfZmxhZ3MsCisJLm5kb19zZXRfcnhfbW9kZQk9IGRzYV9zbGF2ZV9zZXRfcnhfbW9kZSwKKwkubmRvX3NldF9tdWx0aWNhc3RfbGlzdCA9IGRzYV9zbGF2ZV9zZXRfcnhfbW9kZSwKKwkubmRvX3NldF9tYWNfYWRkcmVzcwk9IGRzYV9zbGF2ZV9zZXRfbWFjX2FkZHJlc3MsCisJLm5kb19kb19pb2N0bAkJPSBkc2Ffc2xhdmVfaW9jdGwsCit9OworI2VuZGlmCisjaWZkZWYgQ09ORklHX05FVF9EU0FfVEFHX0VEU0EKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgZWRzYV9uZXRkZXZfb3BzID0geworCS5uZG9fb3BlbgkgCT0gZHNhX3NsYXZlX29wZW4sCisJLm5kb19zdG9wCQk9IGRzYV9zbGF2ZV9jbG9zZSwKKwkubmRvX3N0YXJ0X3htaXQJCT0gZWRzYV94bWl0LAorCS5uZG9fY2hhbmdlX3J4X2ZsYWdzCT0gZHNhX3NsYXZlX2NoYW5nZV9yeF9mbGFncywKKwkubmRvX3NldF9yeF9tb2RlCT0gZHNhX3NsYXZlX3NldF9yeF9tb2RlLAorCS5uZG9fc2V0X211bHRpY2FzdF9saXN0ID0gZHNhX3NsYXZlX3NldF9yeF9tb2RlLAorCS5uZG9fc2V0X21hY19hZGRyZXNzCT0gZHNhX3NsYXZlX3NldF9tYWNfYWRkcmVzcywKKwkubmRvX2RvX2lvY3RsCQk9IGRzYV9zbGF2ZV9pb2N0bCwKK307CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfTkVUX0RTQV9UQUdfVFJBSUxFUgorc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyB0cmFpbGVyX25ldGRldl9vcHMgPSB7CisJLm5kb19vcGVuCSAJPSBkc2Ffc2xhdmVfb3BlbiwKKwkubmRvX3N0b3AJCT0gZHNhX3NsYXZlX2Nsb3NlLAorCS5uZG9fc3RhcnRfeG1pdAkJPSB0cmFpbGVyX3htaXQsCisJLm5kb19jaGFuZ2VfcnhfZmxhZ3MJPSBkc2Ffc2xhdmVfY2hhbmdlX3J4X2ZsYWdzLAorCS5uZG9fc2V0X3J4X21vZGUJPSBkc2Ffc2xhdmVfc2V0X3J4X21vZGUsCisJLm5kb19zZXRfbXVsdGljYXN0X2xpc3QgPSBkc2Ffc2xhdmVfc2V0X3J4X21vZGUsCisJLm5kb19zZXRfbWFjX2FkZHJlc3MJPSBkc2Ffc2xhdmVfc2V0X21hY19hZGRyZXNzLAorCS5uZG9fZG9faW9jdGwJCT0gZHNhX3NsYXZlX2lvY3RsLAorfTsKKyNlbmRpZgogCiAvKiBzbGF2ZSBkZXZpY2Ugc2V0dXAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHN0cnVjdCBuZXRfZGV2aWNlICoKQEAgLTMwNiwzMiArMzQyLDI3IEBACiAJU0VUX0VUSFRPT0xfT1BTKHNsYXZlX2RldiwgJmRzYV9zbGF2ZV9ldGh0b29sX29wcyk7CiAJbWVtY3B5KHNsYXZlX2Rldi0+ZGV2X2FkZHIsIG1hc3Rlci0+ZGV2X2FkZHIsIEVUSF9BTEVOKTsKIAlzbGF2ZV9kZXYtPnR4X3F1ZXVlX2xlbiA9IDA7CisKIAlzd2l0Y2ggKGRzLT50YWdfcHJvdG9jb2wpIHsKICNpZmRlZiBDT05GSUdfTkVUX0RTQV9UQUdfRFNBCiAJY2FzZSBodG9ucyhFVEhfUF9EU0EpOgotCQlzbGF2ZV9kZXYtPmhhcmRfc3RhcnRfeG1pdCA9IGRzYV94bWl0OworCQlzbGF2ZV9kZXYtPm5ldGRldl9vcHMgPSAmZHNhX25ldGRldl9vcHM7CiAJCWJyZWFrOwogI2VuZGlmCiAjaWZkZWYgQ09ORklHX05FVF9EU0FfVEFHX0VEU0EKIAljYXNlIGh0b25zKEVUSF9QX0VEU0EpOgotCQlzbGF2ZV9kZXYtPmhhcmRfc3RhcnRfeG1pdCA9IGVkc2FfeG1pdDsKKwkJc2xhdmVfZGV2LT5uZXRkZXZfb3BzID0gJmVkc2FfbmV0ZGV2X29wczsKIAkJYnJlYWs7CiAjZW5kaWYKICNpZmRlZiBDT05GSUdfTkVUX0RTQV9UQUdfVFJBSUxFUgogCWNhc2UgaHRvbnMoRVRIX1BfVFJBSUxFUik6Ci0JCXNsYXZlX2Rldi0+aGFyZF9zdGFydF94bWl0ID0gdHJhaWxlcl94bWl0OworCQlzbGF2ZV9kZXYtPm5ldGRldl9vcHMgPSAmdHJhaWxlcl9uZXRkZXZfb3BzOwogCQlicmVhazsKICNlbmRpZgogCWRlZmF1bHQ6CiAJCUJVRygpOwogCX0KLQlzbGF2ZV9kZXYtPm9wZW4gPSBkc2Ffc2xhdmVfb3BlbjsKLQlzbGF2ZV9kZXYtPnN0b3AgPSBkc2Ffc2xhdmVfY2xvc2U7Ci0Jc2xhdmVfZGV2LT5jaGFuZ2VfcnhfZmxhZ3MgPSBkc2Ffc2xhdmVfY2hhbmdlX3J4X2ZsYWdzOwotCXNsYXZlX2Rldi0+c2V0X3J4X21vZGUgPSBkc2Ffc2xhdmVfc2V0X3J4X21vZGU7Ci0Jc2xhdmVfZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSBkc2Ffc2xhdmVfc2V0X3J4X21vZGU7Ci0Jc2xhdmVfZGV2LT5zZXRfbWFjX2FkZHJlc3MgPSBkc2Ffc2xhdmVfc2V0X21hY19hZGRyZXNzOwotCXNsYXZlX2Rldi0+ZG9faW9jdGwgPSBkc2Ffc2xhdmVfaW9jdGw7CisKIAlTRVRfTkVUREVWX0RFVihzbGF2ZV9kZXYsIHBhcmVudCk7CiAJc2xhdmVfZGV2LT52bGFuX2ZlYXR1cmVzID0gbWFzdGVyLT52bGFuX2ZlYXR1cmVzOwogCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9jaXBzb19pcHY0LmMgYi9uZXQvaXB2NC9jaXBzb19pcHY0LmMKaW5kZXggZTUyNzk5MC4uNmJiMjYzNSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvY2lwc29faXB2NC5jCisrKyBiL25ldC9pcHY0L2NpcHNvX2lwdjQuYwpAQCAtMzgsNiArMzgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvamhhc2guaD4KKyNpbmNsdWRlIDxsaW51eC9hdWRpdC5oPgogI2luY2x1ZGUgPG5ldC9pcC5oPgogI2luY2x1ZGUgPG5ldC9pY21wLmg+CiAjaW5jbHVkZSA8bmV0L3RjcC5oPgpAQCAtNDQ5LDYgKzQ1MCw3IEBACiAvKioKICAqIGNpcHNvX3Y0X2RvaV9hZGQgLSBBZGQgYSBuZXcgRE9JIHRvIHRoZSBDSVBTTyBwcm90b2NvbCBlbmdpbmUKICAqIEBkb2lfZGVmOiB0aGUgRE9JIHN0cnVjdHVyZQorICogQGF1ZGl0X2luZm86IE5ldExhYmVsIGF1ZGl0IGluZm9ybWF0aW9uCiAgKgogICogRGVzY3JpcHRpb246CiAgKiBUaGUgY2FsbGVyIGRlZmluZXMgYSBuZXcgRE9JIGZvciB1c2UgYnkgdGhlIENJUFNPIGVuZ2luZSBhbmQgY2FsbHMgdGhpcwpAQCAtNDU4LDUwICs0NjAsNzggQEAKICAqIHplcm8gb24gc3VjY2VzcyBhbmQgbm9uLXplcm8gb24gZmFpbHVyZS4KICAqCiAgKi8KLWludCBjaXBzb192NF9kb2lfYWRkKHN0cnVjdCBjaXBzb192NF9kb2kgKmRvaV9kZWYpCitpbnQgY2lwc29fdjRfZG9pX2FkZChzdHJ1Y3QgY2lwc29fdjRfZG9pICpkb2lfZGVmLAorCQkgICAgIHN0cnVjdCBuZXRsYmxfYXVkaXQgKmF1ZGl0X2luZm8pCiB7CisJaW50IHJldF92YWwgPSAtRUlOVkFMOwogCXUzMiBpdGVyOworCXUzMiBkb2k7CisJdTMyIGRvaV90eXBlOworCXN0cnVjdCBhdWRpdF9idWZmZXIgKmF1ZGl0X2J1ZjsKKworCWRvaSA9IGRvaV9kZWYtPmRvaTsKKwlkb2lfdHlwZSA9IGRvaV9kZWYtPnR5cGU7CiAKIAlpZiAoZG9pX2RlZiA9PSBOVUxMIHx8IGRvaV9kZWYtPmRvaSA9PSBDSVBTT19WNF9ET0lfVU5LTk9XTikKLQkJcmV0dXJuIC1FSU5WQUw7CisJCWdvdG8gZG9pX2FkZF9yZXR1cm47CiAJZm9yIChpdGVyID0gMDsgaXRlciA8IENJUFNPX1Y0X1RBR19NQVhDTlQ7IGl0ZXIrKykgewogCQlzd2l0Y2ggKGRvaV9kZWYtPnRhZ3NbaXRlcl0pIHsKIAkJY2FzZSBDSVBTT19WNF9UQUdfUkJJVE1BUDoKIAkJCWJyZWFrOwogCQljYXNlIENJUFNPX1Y0X1RBR19SQU5HRToKLQkJCWlmIChkb2lfZGVmLT50eXBlICE9IENJUFNPX1Y0X01BUF9QQVNTKQotCQkJCXJldHVybiAtRUlOVkFMOwotCQkJYnJlYWs7Ci0JCWNhc2UgQ0lQU09fVjRfVEFHX0lOVkFMSUQ6Ci0JCQlpZiAoaXRlciA9PSAwKQotCQkJCXJldHVybiAtRUlOVkFMOwotCQkJYnJlYWs7CiAJCWNhc2UgQ0lQU09fVjRfVEFHX0VOVU06CiAJCQlpZiAoZG9pX2RlZi0+dHlwZSAhPSBDSVBTT19WNF9NQVBfUEFTUykKLQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQlnb3RvIGRvaV9hZGRfcmV0dXJuOwogCQkJYnJlYWs7CiAJCWNhc2UgQ0lQU09fVjRfVEFHX0xPQ0FMOgogCQkJaWYgKGRvaV9kZWYtPnR5cGUgIT0gQ0lQU09fVjRfTUFQX0xPQ0FMKQotCQkJCXJldHVybiAtRUlOVkFMOworCQkJCWdvdG8gZG9pX2FkZF9yZXR1cm47CisJCQlicmVhazsKKwkJY2FzZSBDSVBTT19WNF9UQUdfSU5WQUxJRDoKKwkJCWlmIChpdGVyID09IDApCisJCQkJZ290byBkb2lfYWRkX3JldHVybjsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgotCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlnb3RvIGRvaV9hZGRfcmV0dXJuOwogCQl9CiAJfQogCiAJYXRvbWljX3NldCgmZG9pX2RlZi0+cmVmY291bnQsIDEpOwogCiAJc3Bpbl9sb2NrKCZjaXBzb192NF9kb2lfbGlzdF9sb2NrKTsKLQlpZiAoY2lwc29fdjRfZG9pX3NlYXJjaChkb2lfZGVmLT5kb2kpICE9IE5VTEwpCi0JCWdvdG8gZG9pX2FkZF9mYWlsdXJlOworCWlmIChjaXBzb192NF9kb2lfc2VhcmNoKGRvaV9kZWYtPmRvaSkgIT0gTlVMTCkgeworCQlzcGluX3VubG9jaygmY2lwc29fdjRfZG9pX2xpc3RfbG9jayk7CisJCXJldF92YWwgPSAtRUVYSVNUOworCQlnb3RvIGRvaV9hZGRfcmV0dXJuOworCX0KIAlsaXN0X2FkZF90YWlsX3JjdSgmZG9pX2RlZi0+bGlzdCwgJmNpcHNvX3Y0X2RvaV9saXN0KTsKIAlzcGluX3VubG9jaygmY2lwc29fdjRfZG9pX2xpc3RfbG9jayk7CisJcmV0X3ZhbCA9IDA7CiAKLQlyZXR1cm4gMDsKK2RvaV9hZGRfcmV0dXJuOgorCWF1ZGl0X2J1ZiA9IG5ldGxibF9hdWRpdF9zdGFydChBVURJVF9NQUNfQ0lQU09WNF9BREQsIGF1ZGl0X2luZm8pOworCWlmIChhdWRpdF9idWYgIT0gTlVMTCkgeworCQljb25zdCBjaGFyICp0eXBlX3N0cjsKKwkJc3dpdGNoIChkb2lfdHlwZSkgeworCQljYXNlIENJUFNPX1Y0X01BUF9UUkFOUzoKKwkJCXR5cGVfc3RyID0gInRyYW5zIjsKKwkJCWJyZWFrOworCQljYXNlIENJUFNPX1Y0X01BUF9QQVNTOgorCQkJdHlwZV9zdHIgPSAicGFzcyI7CisJCQlicmVhazsKKwkJY2FzZSBDSVBTT19WNF9NQVBfTE9DQUw6CisJCQl0eXBlX3N0ciA9ICJsb2NhbCI7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXR5cGVfc3RyID0gIih1bmtub3duKSI7CisJCX0KKwkJYXVkaXRfbG9nX2Zvcm1hdChhdWRpdF9idWYsCisJCQkJICIgY2lwc29fZG9pPSV1IGNpcHNvX3R5cGU9JXMgcmVzPSV1IiwKKwkJCQkgZG9pLCB0eXBlX3N0ciwgcmV0X3ZhbCA9PSAwID8gMSA6IDApOworCQlhdWRpdF9sb2dfZW5kKGF1ZGl0X2J1Zik7CisJfQogCi1kb2lfYWRkX2ZhaWx1cmU6Ci0Jc3Bpbl91bmxvY2soJmNpcHNvX3Y0X2RvaV9saXN0X2xvY2spOwotCXJldHVybiAtRUVYSVNUOworCXJldHVybiByZXRfdmFsOwogfQogCiAvKioKQEAgLTU1OSwyNSArNTg5LDM5IEBACiAgKi8KIGludCBjaXBzb192NF9kb2lfcmVtb3ZlKHUzMiBkb2ksIHN0cnVjdCBuZXRsYmxfYXVkaXQgKmF1ZGl0X2luZm8pCiB7CisJaW50IHJldF92YWw7CiAJc3RydWN0IGNpcHNvX3Y0X2RvaSAqZG9pX2RlZjsKKwlzdHJ1Y3QgYXVkaXRfYnVmZmVyICphdWRpdF9idWY7CiAKIAlzcGluX2xvY2soJmNpcHNvX3Y0X2RvaV9saXN0X2xvY2spOwogCWRvaV9kZWYgPSBjaXBzb192NF9kb2lfc2VhcmNoKGRvaSk7CiAJaWYgKGRvaV9kZWYgPT0gTlVMTCkgewogCQlzcGluX3VubG9jaygmY2lwc29fdjRfZG9pX2xpc3RfbG9jayk7Ci0JCXJldHVybiAtRU5PRU5UOworCQlyZXRfdmFsID0gLUVOT0VOVDsKKwkJZ290byBkb2lfcmVtb3ZlX3JldHVybjsKIAl9CiAJaWYgKCFhdG9taWNfZGVjX2FuZF90ZXN0KCZkb2lfZGVmLT5yZWZjb3VudCkpIHsKIAkJc3Bpbl91bmxvY2soJmNpcHNvX3Y0X2RvaV9saXN0X2xvY2spOwotCQlyZXR1cm4gLUVCVVNZOworCQlyZXRfdmFsID0gLUVCVVNZOworCQlnb3RvIGRvaV9yZW1vdmVfcmV0dXJuOwogCX0KIAlsaXN0X2RlbF9yY3UoJmRvaV9kZWYtPmxpc3QpOwogCXNwaW5fdW5sb2NrKCZjaXBzb192NF9kb2lfbGlzdF9sb2NrKTsKIAogCWNpcHNvX3Y0X2NhY2hlX2ludmFsaWRhdGUoKTsKIAljYWxsX3JjdSgmZG9pX2RlZi0+cmN1LCBjaXBzb192NF9kb2lfZnJlZV9yY3UpOworCXJldF92YWwgPSAwOwogCi0JcmV0dXJuIDA7Citkb2lfcmVtb3ZlX3JldHVybjoKKwlhdWRpdF9idWYgPSBuZXRsYmxfYXVkaXRfc3RhcnQoQVVESVRfTUFDX0NJUFNPVjRfREVMLCBhdWRpdF9pbmZvKTsKKwlpZiAoYXVkaXRfYnVmICE9IE5VTEwpIHsKKwkJYXVkaXRfbG9nX2Zvcm1hdChhdWRpdF9idWYsCisJCQkJICIgY2lwc29fZG9pPSV1IHJlcz0ldSIsCisJCQkJIGRvaSwgcmV0X3ZhbCA9PSAwID8gMSA6IDApOworCQlhdWRpdF9sb2dfZW5kKGF1ZGl0X2J1Zik7CisJfQorCisJcmV0dXJuIHJldF92YWw7CiB9CiAKIC8qKgpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvdGNwLmMgYi9uZXQvaXB2NC90Y3AuYwppbmRleCA5YjI3NWFiLi5jZTU3MmY5IDEwMDY0NAotLS0gYS9uZXQvaXB2NC90Y3AuYworKysgYi9uZXQvaXB2NC90Y3AuYwpAQCAtNTgwLDEwICs1ODAsNiBAQAogCQllbHNlIGlmICghcmV0KSB7CiAJCQlpZiAoc3BsaWNlZCkKIAkJCQlicmVhazsKLQkJCWlmIChmbGFncyAmIFNQTElDRV9GX05PTkJMT0NLKSB7Ci0JCQkJcmV0ID0gLUVBR0FJTjsKLQkJCQlicmVhazsKLQkJCX0KIAkJCWlmIChzb2NrX2ZsYWcoc2ssIFNPQ0tfRE9ORSkpCiAJCQkJYnJlYWs7CiAJCQlpZiAoc2stPnNrX2VycikgewpAQCAtMjUxOCw5ICsyNTE0LDcgQEAKIAlmbHVzaCB8PSBtZW1jbXAodGggKyAxLCB0aDIgKyAxLCB0aGxlbiAtIHNpemVvZigqdGgpKTsKIAogCXRvdGFsID0gcC0+bGVuOwotCW1zcyA9IHRvdGFsOwotCWlmIChza2Jfc2hpbmZvKHApLT5mcmFnX2xpc3QpCi0JCW1zcyA9IHNrYl9zaGluZm8ocCktPmZyYWdfbGlzdC0+bGVuOworCW1zcyA9IHNrYl9zaGluZm8ocCktPmdzb19zaXplOwogCiAJZmx1c2ggfD0gc2tiLT5sZW4gPiBtc3MgfHwgc2tiLT5sZW4gPD0gMDsKIAlmbHVzaCB8PSBudG9obCh0aDItPnNlcSkgKyB0b3RhbCAhPSBudG9obCh0aC0+c2VxKTsKQEAgLTI1NDcsNiArMjU0MSw3IEBACiAKIAlyZXR1cm4gcHA7CiB9CitFWFBPUlRfU1lNQk9MKHRjcF9ncm9fcmVjZWl2ZSk7CiAKIGludCB0Y3BfZ3JvX2NvbXBsZXRlKHN0cnVjdCBza19idWZmICpza2IpCiB7CkBAIC0yNTU2LDcgKzI1NTEsNiBAQAogCXNrYi0+Y3N1bV9vZmZzZXQgPSBvZmZzZXRvZihzdHJ1Y3QgdGNwaGRyLCBjaGVjayk7CiAJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9QQVJUSUFMOwogCi0Jc2tiX3NoaW5mbyhza2IpLT5nc29fc2l6ZSA9IHNrYl9zaGluZm8oc2tiKS0+ZnJhZ19saXN0LT5sZW47CiAJc2tiX3NoaW5mbyhza2IpLT5nc29fc2VncyA9IE5BUElfR1JPX0NCKHNrYiktPmNvdW50OwogCiAJaWYgKHRoLT5jd3IpCkBAIC0yNTY0LDYgKzI1NTgsNyBAQAogCiAJcmV0dXJuIDA7CiB9CitFWFBPUlRfU1lNQk9MKHRjcF9ncm9fY29tcGxldGUpOwogCiAjaWZkZWYgQ09ORklHX1RDUF9NRDVTSUcKIHN0YXRpYyB1bnNpZ25lZCBsb25nIHRjcF9tZDVzaWdfdXNlcnM7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9hZl9pbmV0Ni5jIGIvbmV0L2lwdjYvYWZfaW5ldDYuYwppbmRleCA0MzdiNzUwLi45NGY3NGY1IDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9hZl9pbmV0Ni5jCisrKyBiL25ldC9pcHY2L2FmX2luZXQ2LmMKQEAgLTY3Miw4ICs2NzIsNyBAQAogCiBFWFBPUlRfU1lNQk9MX0dQTChpcHY2X29wdF9hY2NlcHRlZCk7CiAKLXN0YXRpYyBzdHJ1Y3QgaW5ldDZfcHJvdG9jb2wgKmlwdjZfZ3NvX3B1bGxfZXh0aGRycyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJCQkJICAgIGludCBwcm90bykKK3N0YXRpYyBpbnQgaXB2Nl9nc29fcHVsbF9leHRoZHJzKHN0cnVjdCBza19idWZmICpza2IsIGludCBwcm90bykKIHsKIAlzdHJ1Y3QgaW5ldDZfcHJvdG9jb2wgKm9wcyA9IE5VTEw7CiAKQEAgLTcwNCw3ICs3MDMsNyBAQAogCQlfX3NrYl9wdWxsKHNrYiwgbGVuKTsKIAl9CiAKLQlyZXR1cm4gb3BzOworCXJldHVybiBwcm90bzsKIH0KIAogc3RhdGljIGludCBpcHY2X2dzb19zZW5kX2NoZWNrKHN0cnVjdCBza19idWZmICpza2IpCkBAIC03MjEsNyArNzIwLDkgQEAKIAllcnIgPSAtRVBST1RPTk9TVVBQT1JUOwogCiAJcmN1X3JlYWRfbG9jaygpOwotCW9wcyA9IGlwdjZfZ3NvX3B1bGxfZXh0aGRycyhza2IsIGlwdjZoLT5uZXh0aGRyKTsKKwlvcHMgPSByY3VfZGVyZWZlcmVuY2UoaW5ldDZfcHJvdG9zWworCQlpcHY2X2dzb19wdWxsX2V4dGhkcnMoc2tiLCBpcHY2aC0+bmV4dGhkcildKTsKKwogCWlmIChsaWtlbHkob3BzICYmIG9wcy0+Z3NvX3NlbmRfY2hlY2spKSB7CiAJCXNrYl9yZXNldF90cmFuc3BvcnRfaGVhZGVyKHNrYik7CiAJCWVyciA9IG9wcy0+Z3NvX3NlbmRfY2hlY2soc2tiKTsKQEAgLTc1Nyw3ICs3NTgsOSBAQAogCXNlZ3MgPSBFUlJfUFRSKC1FUFJPVE9OT1NVUFBPUlQpOwogCiAJcmN1X3JlYWRfbG9jaygpOwotCW9wcyA9IGlwdjZfZ3NvX3B1bGxfZXh0aGRycyhza2IsIGlwdjZoLT5uZXh0aGRyKTsKKwlvcHMgPSByY3VfZGVyZWZlcmVuY2UoaW5ldDZfcHJvdG9zWworCQlpcHY2X2dzb19wdWxsX2V4dGhkcnMoc2tiLCBpcHY2aC0+bmV4dGhkcildKTsKKwogCWlmIChsaWtlbHkob3BzICYmIG9wcy0+Z3NvX3NlZ21lbnQpKSB7CiAJCXNrYl9yZXNldF90cmFuc3BvcnRfaGVhZGVyKHNrYik7CiAJCXNlZ3MgPSBvcHMtPmdzb19zZWdtZW50KHNrYiwgZmVhdHVyZXMpOwpAQCAtNzc3LDExICs3ODAsMTA1IEBACiAJcmV0dXJuIHNlZ3M7CiB9CiAKK3N0cnVjdCBpcHY2X2dyb19jYiB7CisJc3RydWN0IG5hcGlfZ3JvX2NiIG5hcGk7CisJaW50IHByb3RvOworfTsKKworI2RlZmluZSBJUFY2X0dST19DQihza2IpICgoc3RydWN0IGlwdjZfZ3JvX2NiICopKHNrYiktPmNiKQorCitzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKippcHY2X2dyb19yZWNlaXZlKHN0cnVjdCBza19idWZmICoqaGVhZCwKKwkJCQkJIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGluZXQ2X3Byb3RvY29sICpvcHM7CisJc3RydWN0IHNrX2J1ZmYgKipwcCA9IE5VTEw7CisJc3RydWN0IHNrX2J1ZmYgKnA7CisJc3RydWN0IGlwdjZoZHIgKmlwaDsKKwl1bnNpZ25lZCBpbnQgbmxlbjsKKwlpbnQgZmx1c2ggPSAxOworCWludCBwcm90bzsKKworCWlmICh1bmxpa2VseSghcHNrYl9tYXlfcHVsbChza2IsIHNpemVvZigqaXBoKSkpKQorCQlnb3RvIG91dDsKKworCWlwaCA9IGlwdjZfaGRyKHNrYik7CisJX19za2JfcHVsbChza2IsIHNpemVvZigqaXBoKSk7CisKKwlmbHVzaCArPSBudG9ocyhpcGgtPnBheWxvYWRfbGVuKSAhPSBza2ItPmxlbjsKKworCXJjdV9yZWFkX2xvY2soKTsKKwlwcm90byA9IGlwdjZfZ3NvX3B1bGxfZXh0aGRycyhza2IsIGlwaC0+bmV4dGhkcik7CisJSVBWNl9HUk9fQ0Ioc2tiKS0+cHJvdG8gPSBwcm90bzsKKwlvcHMgPSByY3VfZGVyZWZlcmVuY2UoaW5ldDZfcHJvdG9zW3Byb3RvXSk7CisJaWYgKCFvcHMgfHwgIW9wcy0+Z3JvX3JlY2VpdmUpCisJCWdvdG8gb3V0X3VubG9jazsKKworCWZsdXNoLS07CisJc2tiX3Jlc2V0X3RyYW5zcG9ydF9oZWFkZXIoc2tiKTsKKwlubGVuID0gc2tiX25ldHdvcmtfaGVhZGVyX2xlbihza2IpOworCisJZm9yIChwID0gKmhlYWQ7IHA7IHAgPSBwLT5uZXh0KSB7CisJCXN0cnVjdCBpcHY2aGRyICppcGgyOworCisJCWlmICghTkFQSV9HUk9fQ0IocCktPnNhbWVfZmxvdykKKwkJCWNvbnRpbnVlOworCisJCWlwaDIgPSBpcHY2X2hkcihwKTsKKworCQkvKiBBbGwgZmllbGRzIG11c3QgbWF0Y2ggZXhjZXB0IGxlbmd0aC4gKi8KKwkJaWYgKG5sZW4gIT0gc2tiX25ldHdvcmtfaGVhZGVyX2xlbihwKSB8fAorCQkgICAgbWVtY21wKGlwaCwgaXBoMiwgb2Zmc2V0b2Yoc3RydWN0IGlwdjZoZHIsIHBheWxvYWRfbGVuKSkgfHwKKwkJICAgIG1lbWNtcCgmaXBoLT5uZXh0aGRyLCAmaXBoMi0+bmV4dGhkciwKKwkJCSAgIG5sZW4gLSBvZmZzZXRvZihzdHJ1Y3QgaXB2NmhkciwgbmV4dGhkcikpKSB7CisJCQlOQVBJX0dST19DQihwKS0+c2FtZV9mbG93ID0gMDsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJTkFQSV9HUk9fQ0IocCktPmZsdXNoIHw9IGZsdXNoOworCX0KKworCU5BUElfR1JPX0NCKHNrYiktPmZsdXNoIHw9IGZsdXNoOworCisJcHAgPSBvcHMtPmdyb19yZWNlaXZlKGhlYWQsIHNrYik7CisKK291dF91bmxvY2s6CisJcmN1X3JlYWRfdW5sb2NrKCk7CisKK291dDoKKwlOQVBJX0dST19DQihza2IpLT5mbHVzaCB8PSBmbHVzaDsKKworCXJldHVybiBwcDsKK30KKworc3RhdGljIGludCBpcHY2X2dyb19jb21wbGV0ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBpbmV0Nl9wcm90b2NvbCAqb3BzOworCXN0cnVjdCBpcHY2aGRyICppcGggPSBpcHY2X2hkcihza2IpOworCWludCBlcnIgPSAtRU5PU1lTOworCisJaXBoLT5wYXlsb2FkX2xlbiA9IGh0b25zKHNrYi0+bGVuIC0gc2tiX25ldHdvcmtfb2Zmc2V0KHNrYikgLQorCQkJCSBzaXplb2YoKmlwaCkpOworCisJcmN1X3JlYWRfbG9jaygpOworCW9wcyA9IHJjdV9kZXJlZmVyZW5jZShpbmV0Nl9wcm90b3NbSVBWNl9HUk9fQ0Ioc2tiKS0+cHJvdG9dKTsKKwlpZiAoV0FSTl9PTighb3BzIHx8ICFvcHMtPmdyb19jb21wbGV0ZSkpCisJCWdvdG8gb3V0X3VubG9jazsKKworCWVyciA9IG9wcy0+Z3JvX2NvbXBsZXRlKHNrYik7CisKK291dF91bmxvY2s6CisJcmN1X3JlYWRfdW5sb2NrKCk7CisKKwlyZXR1cm4gZXJyOworfQorCiBzdGF0aWMgc3RydWN0IHBhY2tldF90eXBlIGlwdjZfcGFja2V0X3R5cGUgPSB7CiAJLnR5cGUgPSBfX2NvbnN0YW50X2h0b25zKEVUSF9QX0lQVjYpLAogCS5mdW5jID0gaXB2Nl9yY3YsCiAJLmdzb19zZW5kX2NoZWNrID0gaXB2Nl9nc29fc2VuZF9jaGVjaywKIAkuZ3NvX3NlZ21lbnQgPSBpcHY2X2dzb19zZWdtZW50LAorCS5ncm9fcmVjZWl2ZSA9IGlwdjZfZ3JvX3JlY2VpdmUsCisJLmdyb19jb21wbGV0ZSA9IGlwdjZfZ3JvX2NvbXBsZXRlLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgaXB2Nl9wYWNrZXRfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvaXB2Nl9zb2NrZ2x1ZS5jIGIvbmV0L2lwdjYvaXB2Nl9zb2NrZ2x1ZS5jCmluZGV4IGVlZWFhZDIuLjQwZjMyNDYgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L2lwdjZfc29ja2dsdWUuYworKysgYi9uZXQvaXB2Ni9pcHY2X3NvY2tnbHVlLmMKQEAgLTQwNCw3ICs0MDQsNyBAQAogCQllbHNlIGlmIChvcHRsZW4gPCBzaXplb2Yoc3RydWN0IGluNl9wa3RpbmZvKSB8fCBvcHR2YWwgPT0gTlVMTCkKIAkJCWdvdG8gZV9pbnZhbDsKIAotCQlpZiAoY29weV9mcm9tX3VzZXIoJnBrdCwgb3B0dmFsLCBvcHRsZW4pKSB7CisJCWlmIChjb3B5X2Zyb21fdXNlcigmcGt0LCBvcHR2YWwsIHNpemVvZihzdHJ1Y3QgaW42X3BrdGluZm8pKSkgewogCQkJCXJldHYgPSAtRUZBVUxUOwogCQkJCWJyZWFrOwogCQl9CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9yb3V0ZS5jIGIvbmV0L2lwdjYvcm91dGUuYwppbmRleCAxOGM0ODZjLi5jNGE1OTgyIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9yb3V0ZS5jCisrKyBiL25ldC9pcHY2L3JvdXRlLmMKQEAgLTYyNyw2ICs2MjcsOSBAQAogCXJ0ID0gaXA2X3J0X2NvcHkob3J0KTsKIAogCWlmIChydCkgeworCQlzdHJ1Y3QgbmVpZ2hib3VyICpuZWlnaDsKKwkJaW50IGF0dGVtcHRzID0gIWluX3NvZnRpcnEoKTsKKwogCQlpZiAoIShydC0+cnQ2aV9mbGFncyZSVEZfR0FURVdBWSkpIHsKIAkJCWlmIChydC0+cnQ2aV9kc3QucGxlbiAhPSAxMjggJiYKIAkJCSAgICBpcHY2X2FkZHJfZXF1YWwoJnJ0LT5ydDZpX2RzdC5hZGRyLCBkYWRkcikpCkBAIC02NDYsNyArNjQ5LDM1IEBACiAJCX0KICNlbmRpZgogCi0JCXJ0LT5ydDZpX25leHRob3AgPSBuZGlzY19nZXRfbmVpZ2gocnQtPnJ0NmlfZGV2LCAmcnQtPnJ0NmlfZ2F0ZXdheSk7CisJcmV0cnk6CisJCW5laWdoID0gbmRpc2NfZ2V0X25laWdoKHJ0LT5ydDZpX2RldiwgJnJ0LT5ydDZpX2dhdGV3YXkpOworCQlpZiAoSVNfRVJSKG5laWdoKSkgeworCQkJc3RydWN0IG5ldCAqbmV0ID0gZGV2X25ldChydC0+cnQ2aV9kZXYpOworCQkJaW50IHNhdmVkX3J0X21pbl9pbnRlcnZhbCA9CisJCQkJbmV0LT5pcHY2LnN5c2N0bC5pcDZfcnRfZ2NfbWluX2ludGVydmFsOworCQkJaW50IHNhdmVkX3J0X2VsYXN0aWNpdHkgPQorCQkJCW5ldC0+aXB2Ni5zeXNjdGwuaXA2X3J0X2djX2VsYXN0aWNpdHk7CisKKwkJCWlmIChhdHRlbXB0cy0tID4gMCkgeworCQkJCW5ldC0+aXB2Ni5zeXNjdGwuaXA2X3J0X2djX2VsYXN0aWNpdHkgPSAxOworCQkJCW5ldC0+aXB2Ni5zeXNjdGwuaXA2X3J0X2djX21pbl9pbnRlcnZhbCA9IDA7CisKKwkJCQlpcDZfZHN0X2djKG5ldC0+aXB2Ni5pcDZfZHN0X29wcyk7CisKKwkJCQluZXQtPmlwdjYuc3lzY3RsLmlwNl9ydF9nY19lbGFzdGljaXR5ID0KKwkJCQkJc2F2ZWRfcnRfZWxhc3RpY2l0eTsKKwkJCQluZXQtPmlwdjYuc3lzY3RsLmlwNl9ydF9nY19taW5faW50ZXJ2YWwgPQorCQkJCQlzYXZlZF9ydF9taW5faW50ZXJ2YWw7CisJCQkJZ290byByZXRyeTsKKwkJCX0KKworCQkJaWYgKG5ldF9yYXRlbGltaXQoKSkKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkJICAgICAgICJOZWlnaGJvdXIgdGFibGUgb3ZlcmZsb3cuXG4iKTsKKwkJCWRzdF9mcmVlKCZydC0+dS5kc3QpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJcnQtPnJ0NmlfbmV4dGhvcCA9IG5laWdoOwogCiAJfQogCkBAIC05NDUsOCArOTc2LDExIEBACiAJZGV2X2hvbGQoZGV2KTsKIAlpZiAobmVpZ2gpCiAJCW5laWdoX2hvbGQobmVpZ2gpOwotCWVsc2UKKwllbHNlIHsKIAkJbmVpZ2ggPSBuZGlzY19nZXRfbmVpZ2goZGV2LCBhZGRyKTsKKwkJaWYgKElTX0VSUihuZWlnaCkpCisJCQluZWlnaCA9IE5VTEw7CisJfQogCiAJcnQtPnJ0NmlfZGV2CSAgPSBkZXY7CiAJcnQtPnJ0NmlfaWRldiAgICAgPSBpZGV2OwpAQCAtMTg4Nyw2ICsxOTIxLDcgQEAKIHsKIAlzdHJ1Y3QgbmV0ICpuZXQgPSBkZXZfbmV0KGlkZXYtPmRldik7CiAJc3RydWN0IHJ0Nl9pbmZvICpydCA9IGlwNl9kc3RfYWxsb2MobmV0LT5pcHY2LmlwNl9kc3Rfb3BzKTsKKwlzdHJ1Y3QgbmVpZ2hib3VyICpuZWlnaDsKIAogCWlmIChydCA9PSBOVUxMKQogCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKQEAgLTE5MDksMTEgKzE5NDQsMTggQEAKIAkJcnQtPnJ0NmlfZmxhZ3MgfD0gUlRGX0FOWUNBU1Q7CiAJZWxzZQogCQlydC0+cnQ2aV9mbGFncyB8PSBSVEZfTE9DQUw7Ci0JcnQtPnJ0NmlfbmV4dGhvcCA9IG5kaXNjX2dldF9uZWlnaChydC0+cnQ2aV9kZXYsICZydC0+cnQ2aV9nYXRld2F5KTsKLQlpZiAocnQtPnJ0NmlfbmV4dGhvcCA9PSBOVUxMKSB7CisJbmVpZ2ggPSBuZGlzY19nZXRfbmVpZ2gocnQtPnJ0NmlfZGV2LCAmcnQtPnJ0NmlfZ2F0ZXdheSk7CisJaWYgKElTX0VSUihuZWlnaCkpIHsKIAkJZHN0X2ZyZWUoJnJ0LT51LmRzdCk7Ci0JCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJCS8qIFdlIGFyZSBjYXN0aW5nIHRoaXMgYmVjYXVzZSB0aGF0IGlzIHRoZSByZXR1cm4KKwkJICogdmFsdWUgdHlwZS4gIEJ1dCBhbiBlcnJubyBlbmNvZGVkIHBvaW50ZXIgaXMgdGhlCisJCSAqIHNhbWUgcmVnYXJkbGVzcyBvZiB0aGUgdW5kZXJseWluZyBwb2ludGVyIHR5cGUsCisJCSAqIGFuZCB0aGF0J3Mgd2hhdCB3ZSBhcmUgcmV0dXJuaW5nLiAgU28gdGhpcyBpcyBPSy4KKwkJICovCisJCXJldHVybiAoc3RydWN0IHJ0Nl9pbmZvICopIG5laWdoOwogCX0KKwlydC0+cnQ2aV9uZXh0aG9wID0gbmVpZ2g7CiAKIAlpcHY2X2FkZHJfY29weSgmcnQtPnJ0NmlfZHN0LmFkZHIsIGFkZHIpOwogCXJ0LT5ydDZpX2RzdC5wbGVuID0gMTI4OwpAQCAtMjcxMCw3ICsyNzUyLDcgQEAKIAkJa21lbV9jYWNoZV9jcmVhdGUoImlwNl9kc3RfY2FjaGUiLCBzaXplb2Yoc3RydWN0IHJ0Nl9pbmZvKSwgMCwKIAkJCQkgIFNMQUJfSFdDQUNIRV9BTElHTiwgTlVMTCk7CiAJaWYgKCFpcDZfZHN0X29wc190ZW1wbGF0ZS5rbWVtX2NhY2hlcCkKLQkJZ290byBvdXQ7OworCQlnb3RvIG91dDsKIAogCXJldCA9IHJlZ2lzdGVyX3Blcm5ldF9zdWJzeXMoJmlwNl9yb3V0ZV9uZXRfb3BzKTsKIAlpZiAocmV0KQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvc3lzY3RsX25ldF9pcHY2LmMgYi9uZXQvaXB2Ni9zeXNjdGxfbmV0X2lwdjYuYwppbmRleCA5MDQ4ZmU3Li5hMDMxMDM0IDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9zeXNjdGxfbmV0X2lwdjYuYworKysgYi9uZXQvaXB2Ni9zeXNjdGxfbmV0X2lwdjYuYwpAQCAtMTI4LDcgKzEyOCw3IEBACiAKIGludCBpcHY2X3N5c2N0bF9yZWdpc3Rlcih2b2lkKQogewotCWludCBlcnIgPSAtRU5PTUVNOzsKKwlpbnQgZXJyID0gLUVOT01FTTsKIAogCWlwNl9oZWFkZXIgPSByZWdpc3Rlcl9uZXRfc3lzY3RsX3JvdGFibGUobmV0X2lwdjZfY3RsX3BhdGgsIGlwdjZfdGFibGUpOwogCWlmIChpcDZfaGVhZGVyID09IE5VTEwpCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni90Y3BfaXB2Ni5jIGIvbmV0L2lwdjYvdGNwX2lwdjYuYwppbmRleCA3MWNkNzA5Li5lNWI4NWQ0IDEwMDY0NAotLS0gYS9uZXQvaXB2Ni90Y3BfaXB2Ni5jCisrKyBiL25ldC9pcHY2L3RjcF9pcHY2LmMKQEAgLTEwMSw3ICsxMDEsNyBAQAogCX0KIH0KIAotc3RhdGljIF9faW5saW5lX18gX19zdW0xNiB0Y3BfdjZfY2hlY2soc3RydWN0IHRjcGhkciAqdGgsIGludCBsZW4sCitzdGF0aWMgX19pbmxpbmVfXyBfX3N1bTE2IHRjcF92Nl9jaGVjayhpbnQgbGVuLAogCQkJCSAgIHN0cnVjdCBpbjZfYWRkciAqc2FkZHIsCiAJCQkJICAgc3RydWN0IGluNl9hZGRyICpkYWRkciwKIAkJCQkgICBfX3dzdW0gYmFzZSkKQEAgLTUwMSw3ICs1MDEsNyBAQAogCWlmIChza2IpIHsKIAkJc3RydWN0IHRjcGhkciAqdGggPSB0Y3BfaGRyKHNrYik7CiAKLQkJdGgtPmNoZWNrID0gdGNwX3Y2X2NoZWNrKHRoLCBza2ItPmxlbiwKKwkJdGgtPmNoZWNrID0gdGNwX3Y2X2NoZWNrKHNrYi0+bGVuLAogCQkJCQkgJnRyZXEtPmxvY19hZGRyLCAmdHJlcS0+cm10X2FkZHIsCiAJCQkJCSBjc3VtX3BhcnRpYWwodGgsIHNrYi0+bGVuLCBza2ItPmNzdW0pKTsKIApAQCAtOTQyLDYgKzk0Miw0MSBAQAogCXJldHVybiAwOwogfQogCitzdHJ1Y3Qgc2tfYnVmZiAqKnRjcDZfZ3JvX3JlY2VpdmUoc3RydWN0IHNrX2J1ZmYgKipoZWFkLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBpcHY2aGRyICppcGggPSBpcHY2X2hkcihza2IpOworCisJc3dpdGNoIChza2ItPmlwX3N1bW1lZCkgeworCWNhc2UgQ0hFQ0tTVU1fQ09NUExFVEU6CisJCWlmICghdGNwX3Y2X2NoZWNrKHNrYi0+bGVuLCAmaXBoLT5zYWRkciwgJmlwaC0+ZGFkZHIsCisJCQkJICBza2ItPmNzdW0pKSB7CisJCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX1VOTkVDRVNTQVJZOworCQkJYnJlYWs7CisJCX0KKworCQkvKiBmYWxsIHRocm91Z2ggKi8KKwljYXNlIENIRUNLU1VNX05PTkU6CisJCU5BUElfR1JPX0NCKHNrYiktPmZsdXNoID0gMTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcmV0dXJuIHRjcF9ncm9fcmVjZWl2ZShoZWFkLCBza2IpOworfQorRVhQT1JUX1NZTUJPTCh0Y3A2X2dyb19yZWNlaXZlKTsKKworaW50IHRjcDZfZ3JvX2NvbXBsZXRlKHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGlwdjZoZHIgKmlwaCA9IGlwdjZfaGRyKHNrYik7CisJc3RydWN0IHRjcGhkciAqdGggPSB0Y3BfaGRyKHNrYik7CisKKwl0aC0+Y2hlY2sgPSB+dGNwX3Y2X2NoZWNrKHNrYi0+bGVuIC0gc2tiX3RyYW5zcG9ydF9vZmZzZXQoc2tiKSwKKwkJCQkgICZpcGgtPnNhZGRyLCAmaXBoLT5kYWRkciwgMCk7CisJc2tiX3NoaW5mbyhza2IpLT5nc29fdHlwZSA9IFNLQl9HU09fVENQVjY7CisKKwlyZXR1cm4gdGNwX2dyb19jb21wbGV0ZShza2IpOworfQorRVhQT1JUX1NZTUJPTCh0Y3A2X2dyb19jb21wbGV0ZSk7CisKIHN0YXRpYyB2b2lkIHRjcF92Nl9zZW5kX3Jlc3BvbnNlKHN0cnVjdCBza19idWZmICpza2IsIHUzMiBzZXEsIHUzMiBhY2ssIHUzMiB3aW4sCiAJCQkJIHUzMiB0cywgc3RydWN0IHRjcF9tZDVzaWdfa2V5ICprZXksIGludCByc3QpCiB7CkBAIC0xNDI5LDE0ICsxNDY0LDE0IEBACiBzdGF0aWMgX19zdW0xNiB0Y3BfdjZfY2hlY2tzdW1faW5pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCWlmIChza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9DT01QTEVURSkgewotCQlpZiAoIXRjcF92Nl9jaGVjayh0Y3BfaGRyKHNrYiksIHNrYi0+bGVuLCAmaXB2Nl9oZHIoc2tiKS0+c2FkZHIsCisJCWlmICghdGNwX3Y2X2NoZWNrKHNrYi0+bGVuLCAmaXB2Nl9oZHIoc2tiKS0+c2FkZHIsCiAJCQkJICAmaXB2Nl9oZHIoc2tiKS0+ZGFkZHIsIHNrYi0+Y3N1bSkpIHsKIAkJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlk7CiAJCQlyZXR1cm4gMDsKIAkJfQogCX0KIAotCXNrYi0+Y3N1bSA9IH5jc3VtX3VuZm9sZCh0Y3BfdjZfY2hlY2sodGNwX2hkcihza2IpLCBza2ItPmxlbiwKKwlza2ItPmNzdW0gPSB+Y3N1bV91bmZvbGQodGNwX3Y2X2NoZWNrKHNrYi0+bGVuLAogCQkJCQkgICAgICAmaXB2Nl9oZHIoc2tiKS0+c2FkZHIsCiAJCQkJCSAgICAgICZpcHY2X2hkcihza2IpLT5kYWRkciwgMCkpOwogCkBAIC0yMDYyLDYgKzIwOTcsOCBAQAogCS5lcnJfaGFuZGxlcgk9CXRjcF92Nl9lcnIsCiAJLmdzb19zZW5kX2NoZWNrCT0JdGNwX3Y2X2dzb19zZW5kX2NoZWNrLAogCS5nc29fc2VnbWVudAk9CXRjcF90c29fc2VnbWVudCwKKwkuZ3JvX3JlY2VpdmUJPQl0Y3A2X2dyb19yZWNlaXZlLAorCS5ncm9fY29tcGxldGUJPQl0Y3A2X2dyb19jb21wbGV0ZSwKIAkuZmxhZ3MJCT0JSU5FVDZfUFJPVE9fTk9QT0xJQ1l8SU5FVDZfUFJPVE9fRklOQUwsCiB9OwogCmRpZmYgLS1naXQgYS9uZXQvaXVjdi9hZl9pdWN2LmMgYi9uZXQvaXVjdi9hZl9pdWN2LmMKaW5kZXggYWYzMTkyZC4uZWI4YTJhMCAxMDA2NDQKLS0tIGEvbmV0L2l1Y3YvYWZfaXVjdi5jCisrKyBiL25ldC9pdWN2L2FmX2l1Y3YuYwpAQCAtNDk0LDcgKzQ5NCwyMSBAQAogCWlmIChlcnIpIHsKIAkJaXVjdl9wYXRoX2ZyZWUoaXVjdi0+cGF0aCk7CiAJCWl1Y3YtPnBhdGggPSBOVUxMOwotCQllcnIgPSAtRUNPTk5SRUZVU0VEOworCQlzd2l0Y2ggKGVycikgeworCQljYXNlIDB4MGI6CS8qIFRhcmdldCBjb21tdW5pY2F0b3IgaXMgbm90IGxvZ2dlZCBvbiAqLworCQkJZXJyID0gLUVORVRVTlJFQUNIOworCQkJYnJlYWs7CisJCWNhc2UgMHgwZDoJLyogTWF4IGNvbm5lY3Rpb25zIGZvciB0aGlzIGd1ZXN0IGV4Y2VlZGVkICovCisJCWNhc2UgMHgwZToJLyogTWF4IGNvbm5lY3Rpb25zIGZvciB0YXJnZXQgZ3Vlc3QgZXhjZWVkZWQgKi8KKwkJCWVyciA9IC1FQUdBSU47CisJCQlicmVhazsKKwkJY2FzZSAweDBmOgkvKiBNaXNzaW5nIElVQ1YgYXV0aG9yaXphdGlvbiAqLworCQkJZXJyID0gLUVBQ0NFUzsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZXJyID0gLUVDT05OUkVGVVNFRDsKKwkJCWJyZWFrOworCQl9CiAJCWdvdG8gZG9uZTsKIAl9CiAKQEAgLTUwNyw2ICs1MjEsMTMgQEAKIAkJcmVsZWFzZV9zb2NrKHNrKTsKIAkJcmV0dXJuIC1FQ09OTlJFRlVTRUQ7CiAJfQorCisJaWYgKGVycikgeworCQlpdWN2X3BhdGhfc2V2ZXIoaXVjdi0+cGF0aCwgTlVMTCk7CisJCWl1Y3ZfcGF0aF9mcmVlKGl1Y3YtPnBhdGgpOworCQlpdWN2LT5wYXRoID0gTlVMTDsKKwl9CisKIGRvbmU6CiAJcmVsZWFzZV9zb2NrKHNrKTsKIAlyZXR1cm4gZXJyOwpAQCAtMTAyMSwxMiArMTA0MiwxNCBAQAogCUFTQ0VCQyh1c2VyX2RhdGEsIHNpemVvZih1c2VyX2RhdGEpKTsKIAlpZiAoc2stPnNrX3N0YXRlICE9IElVQ1ZfTElTVEVOKSB7CiAJCWVyciA9IGl1Y3ZfcGF0aF9zZXZlcihwYXRoLCB1c2VyX2RhdGEpOworCQlpdWN2X3BhdGhfZnJlZShwYXRoKTsKIAkJZ290byBmYWlsOwogCX0KIAogCS8qIENoZWNrIGZvciBiYWNrbG9nIHNpemUgKi8KIAlpZiAoc2tfYWNjZXB0cV9pc19mdWxsKHNrKSkgewogCQllcnIgPSBpdWN2X3BhdGhfc2V2ZXIocGF0aCwgdXNlcl9kYXRhKTsKKwkJaXVjdl9wYXRoX2ZyZWUocGF0aCk7CiAJCWdvdG8gZmFpbDsKIAl9CiAKQEAgLTEwMzQsNiArMTA1Nyw3IEBACiAJbnNrID0gaXVjdl9zb2NrX2FsbG9jKE5VTEwsIFNPQ0tfU1RSRUFNLCBHRlBfQVRPTUlDKTsKIAlpZiAoIW5zaykgewogCQllcnIgPSBpdWN2X3BhdGhfc2V2ZXIocGF0aCwgdXNlcl9kYXRhKTsKKwkJaXVjdl9wYXRoX2ZyZWUocGF0aCk7CiAJCWdvdG8gZmFpbDsKIAl9CiAKQEAgLTEwNTcsNiArMTA4MSw4IEBACiAJZXJyID0gaXVjdl9wYXRoX2FjY2VwdChwYXRoLCAmYWZfaXVjdl9oYW5kbGVyLCBudXNlcl9kYXRhLCBuc2spOwogCWlmIChlcnIpIHsKIAkJZXJyID0gaXVjdl9wYXRoX3NldmVyKHBhdGgsIHVzZXJfZGF0YSk7CisJCWl1Y3ZfcGF0aF9mcmVlKHBhdGgpOworCQlpdWN2X3NvY2tfa2lsbChuc2spOwogCQlnb3RvIGZhaWw7CiAJfQogCmRpZmYgLS1naXQgYS9uZXQvaXVjdi9pdWN2LmMgYi9uZXQvaXVjdi9pdWN2LmMKaW5kZXggOGY1N2Q0Zi4uYTM1MjQwZiAxMDA2NDQKLS0tIGEvbmV0L2l1Y3YvaXVjdi5jCisrKyBiL25ldC9pdWN2L2l1Y3YuYwpAQCAtNTAsNyArNTAsNiBAQAogI2luY2x1ZGUgPGFzbS9lYmNkaWMuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vczM5MF9leHQuaD4KLSNpbmNsdWRlIDxhc20vczM5MF9yZGV2Lmg+CiAjaW5jbHVkZSA8YXNtL3NtcC5oPgogCiAvKgpAQCAtNTE3LDYgKzUxNiw3IEBACiAJc2l6ZV90IGFsbG9jX3NpemU7CiAJaW50IGNwdSwgcmM7CiAKKwlnZXRfb25saW5lX2NwdXMoKTsKIAlyYyA9IC1FTk9NRU07CiAJYWxsb2Nfc2l6ZSA9IGl1Y3ZfbWF4X3BhdGhpZCAqIHNpemVvZihzdHJ1Y3QgaXVjdl9wYXRoKTsKIAlpdWN2X3BhdGhfdGFibGUgPSBremFsbG9jKGFsbG9jX3NpemUsIEdGUF9LRVJORUwpOwpAQCAtNTI0LDE5ICs1MjQsMTcgQEAKIAkJZ290byBvdXQ7CiAJLyogRGVjbGFyZSBwZXIgY3B1IGJ1ZmZlcnMuICovCiAJcmMgPSAtRUlPOwotCWdldF9vbmxpbmVfY3B1cygpOwogCWZvcl9lYWNoX29ubGluZV9jcHUoY3B1KQogCQlzbXBfY2FsbF9mdW5jdGlvbl9zaW5nbGUoY3B1LCBpdWN2X2RlY2xhcmVfY3B1LCBOVUxMLCAxKTsKIAlpZiAoY3B1c19lbXB0eShpdWN2X2J1ZmZlcl9jcHVtYXNrKSkKIAkJLyogTm8gY3B1IGNvdWxkIGRlY2xhcmUgYW4gaXVjdiBidWZmZXIuICovCi0JCWdvdG8gb3V0X3BhdGg7CisJCWdvdG8gb3V0OwogCXB1dF9vbmxpbmVfY3B1cygpOwogCXJldHVybiAwOwotCi1vdXRfcGF0aDoKLQlwdXRfb25saW5lX2NwdXMoKTsKLQlrZnJlZShpdWN2X3BhdGhfdGFibGUpOwogb3V0OgorCWtmcmVlKGl1Y3ZfcGF0aF90YWJsZSk7CisJaXVjdl9wYXRoX3RhYmxlID0gTlVMTDsKKwlwdXRfb25saW5lX2NwdXMoKTsKIAlyZXR1cm4gcmM7CiB9CiAKQEAgLTU1MSw4ICs1NDksOSBAQAogewogCWdldF9vbmxpbmVfY3B1cygpOwogCW9uX2VhY2hfY3B1KGl1Y3ZfcmV0cmlldmVfY3B1LCBOVUxMLCAxKTsKLQlwdXRfb25saW5lX2NwdXMoKTsKIAlrZnJlZShpdWN2X3BhdGhfdGFibGUpOworCWl1Y3ZfcGF0aF90YWJsZSA9IE5VTEw7CisJcHV0X29ubGluZV9jcHVzKCk7CiB9CiAKIHN0YXRpYyBpbnQgX19jcHVpbml0IGl1Y3ZfY3B1X25vdGlmeShzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnNlbGYsCkBAIC01ODksMTAgKzU4OCwxNCBAQAogCWNhc2UgQ1BVX09OTElORV9GUk9aRU46CiAJY2FzZSBDUFVfRE9XTl9GQUlMRUQ6CiAJY2FzZSBDUFVfRE9XTl9GQUlMRURfRlJPWkVOOgorCQlpZiAoIWl1Y3ZfcGF0aF90YWJsZSkKKwkJCWJyZWFrOwogCQlzbXBfY2FsbF9mdW5jdGlvbl9zaW5nbGUoY3B1LCBpdWN2X2RlY2xhcmVfY3B1LCBOVUxMLCAxKTsKIAkJYnJlYWs7CiAJY2FzZSBDUFVfRE9XTl9QUkVQQVJFOgogCWNhc2UgQ1BVX0RPV05fUFJFUEFSRV9GUk9aRU46CisJCWlmICghaXVjdl9wYXRoX3RhYmxlKQorCQkJYnJlYWs7CiAJCWNwdW1hc2sgPSBpdWN2X2J1ZmZlcl9jcHVtYXNrOwogCQljcHVfY2xlYXIoY3B1LCBjcHVtYXNrKTsKIAkJaWYgKGNwdXNfZW1wdHkoY3B1bWFzaykpCkBAIC0xNjkyLDcgKzE2OTUsNyBAQAogCXJjID0gcmVnaXN0ZXJfZXh0ZXJuYWxfaW50ZXJydXB0KDB4NDAwMCwgaXVjdl9leHRlcm5hbF9pbnRlcnJ1cHQpOwogCWlmIChyYykKIAkJZ290byBvdXQ7Ci0JaXVjdl9yb290ID0gczM5MF9yb290X2Rldl9yZWdpc3RlcigiaXVjdiIpOworCWl1Y3Zfcm9vdCA9IHJvb3RfZGV2aWNlX3JlZ2lzdGVyKCJpdWN2Iik7CiAJaWYgKElTX0VSUihpdWN2X3Jvb3QpKSB7CiAJCXJjID0gUFRSX0VSUihpdWN2X3Jvb3QpOwogCQlnb3RvIG91dF9pbnQ7CkBAIC0xNzM2LDcgKzE3MzksNyBAQAogCQlrZnJlZShpdWN2X2lycV9kYXRhW2NwdV0pOwogCQlpdWN2X2lycV9kYXRhW2NwdV0gPSBOVUxMOwogCX0KLQlzMzkwX3Jvb3RfZGV2X3VucmVnaXN0ZXIoaXVjdl9yb290KTsKKwlyb290X2RldmljZV91bnJlZ2lzdGVyKGl1Y3Zfcm9vdCk7CiBvdXRfaW50OgogCXVucmVnaXN0ZXJfZXh0ZXJuYWxfaW50ZXJydXB0KDB4NDAwMCwgaXVjdl9leHRlcm5hbF9pbnRlcnJ1cHQpOwogb3V0OgpAQCAtMTc2Niw3ICsxNzY5LDcgQEAKIAkJa2ZyZWUoaXVjdl9pcnFfZGF0YVtjcHVdKTsKIAkJaXVjdl9pcnFfZGF0YVtjcHVdID0gTlVMTDsKIAl9Ci0JczM5MF9yb290X2Rldl91bnJlZ2lzdGVyKGl1Y3Zfcm9vdCk7CisJcm9vdF9kZXZpY2VfdW5yZWdpc3RlcihpdWN2X3Jvb3QpOwogCWJ1c191bnJlZ2lzdGVyKCZpdWN2X2J1cyk7CiAJdW5yZWdpc3Rlcl9leHRlcm5hbF9pbnRlcnJ1cHQoMHg0MDAwLCBpdWN2X2V4dGVybmFsX2ludGVycnVwdCk7CiB9CmRpZmYgLS1naXQgYS9uZXQvbmV0bGFiZWwvbmV0bGFiZWxfY2lwc29fdjQuYyBiL25ldC9uZXRsYWJlbC9uZXRsYWJlbF9jaXBzb192NC5jCmluZGV4IGZmZjMyYjcuLmJmMWFiMWEgMTAwNjQ0Ci0tLSBhL25ldC9uZXRsYWJlbC9uZXRsYWJlbF9jaXBzb192NC5jCisrKyBiL25ldC9uZXRsYWJlbC9uZXRsYWJlbF9jaXBzb192NC5jCkBAIC0xMzAsNiArMTMwLDcgQEAKIC8qKgogICogbmV0bGJsX2NpcHNvdjRfYWRkX3N0ZCAtIEFkZHMgYSBDSVBTTyBWNCBET0kgZGVmaW5pdGlvbgogICogQGluZm86IHRoZSBHZW5lcmljIE5FVExJTksgaW5mbyBibG9jaworICogQGF1ZGl0X2luZm86IE5ldExhYmVsIGF1ZGl0IGluZm9ybWF0aW9uCiAgKgogICogRGVzY3JpcHRpb246CiAgKiBDcmVhdGUgYSBuZXcgQ0lQU09fVjRfTUFQX1RSQU5TIERPSSBkZWZpbml0aW9uIGJhc2VkIG9uIHRoZSBnaXZlbiBBREQKQEAgLTEzNyw3ICsxMzgsOCBAQAogICogbm9uLXplcm8gb24gZXJyb3IuCiAgKgogICovCi1zdGF0aWMgaW50IG5ldGxibF9jaXBzb3Y0X2FkZF9zdGQoc3RydWN0IGdlbmxfaW5mbyAqaW5mbykKK3N0YXRpYyBpbnQgbmV0bGJsX2NpcHNvdjRfYWRkX3N0ZChzdHJ1Y3QgZ2VubF9pbmZvICppbmZvLAorCQkJCSAgc3RydWN0IG5ldGxibF9hdWRpdCAqYXVkaXRfaW5mbykKIHsKIAlpbnQgcmV0X3ZhbCA9IC1FSU5WQUw7CiAJc3RydWN0IGNpcHNvX3Y0X2RvaSAqZG9pX2RlZiA9IE5VTEw7CkBAIC0zMTYsNyArMzE4LDcgQEAKIAkJCX0KIAl9CiAKLQlyZXRfdmFsID0gY2lwc29fdjRfZG9pX2FkZChkb2lfZGVmKTsKKwlyZXRfdmFsID0gY2lwc29fdjRfZG9pX2FkZChkb2lfZGVmLCBhdWRpdF9pbmZvKTsKIAlpZiAocmV0X3ZhbCAhPSAwKQogCQlnb3RvIGFkZF9zdGRfZmFpbHVyZTsKIAlyZXR1cm4gMDsKQEAgLTMzMCw2ICszMzIsNyBAQAogLyoqCiAgKiBuZXRsYmxfY2lwc292NF9hZGRfcGFzcyAtIEFkZHMgYSBDSVBTTyBWNCBET0kgZGVmaW5pdGlvbgogICogQGluZm86IHRoZSBHZW5lcmljIE5FVExJTksgaW5mbyBibG9jaworICogQGF1ZGl0X2luZm86IE5ldExhYmVsIGF1ZGl0IGluZm9ybWF0aW9uCiAgKgogICogRGVzY3JpcHRpb246CiAgKiBDcmVhdGUgYSBuZXcgQ0lQU09fVjRfTUFQX1BBU1MgRE9JIGRlZmluaXRpb24gYmFzZWQgb24gdGhlIGdpdmVuIEFERCBtZXNzYWdlCkBAIC0zMzcsNyArMzQwLDggQEAKICAqIGVycm9yLgogICoKICAqLwotc3RhdGljIGludCBuZXRsYmxfY2lwc292NF9hZGRfcGFzcyhzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKQorc3RhdGljIGludCBuZXRsYmxfY2lwc292NF9hZGRfcGFzcyhzdHJ1Y3QgZ2VubF9pbmZvICppbmZvLAorCQkJCSAgIHN0cnVjdCBuZXRsYmxfYXVkaXQgKmF1ZGl0X2luZm8pCiB7CiAJaW50IHJldF92YWw7CiAJc3RydWN0IGNpcHNvX3Y0X2RvaSAqZG9pX2RlZiA9IE5VTEw7CkBAIC0zNTQsNyArMzU4LDcgQEAKIAlpZiAocmV0X3ZhbCAhPSAwKQogCQlnb3RvIGFkZF9wYXNzX2ZhaWx1cmU7CiAKLQlyZXRfdmFsID0gY2lwc29fdjRfZG9pX2FkZChkb2lfZGVmKTsKKwlyZXRfdmFsID0gY2lwc29fdjRfZG9pX2FkZChkb2lfZGVmLCBhdWRpdF9pbmZvKTsKIAlpZiAocmV0X3ZhbCAhPSAwKQogCQlnb3RvIGFkZF9wYXNzX2ZhaWx1cmU7CiAJcmV0dXJuIDA7CkBAIC0zNjcsNiArMzcxLDcgQEAKIC8qKgogICogbmV0bGJsX2NpcHNvdjRfYWRkX2xvY2FsIC0gQWRkcyBhIENJUFNPIFY0IERPSSBkZWZpbml0aW9uCiAgKiBAaW5mbzogdGhlIEdlbmVyaWMgTkVUTElOSyBpbmZvIGJsb2NrCisgKiBAYXVkaXRfaW5mbzogTmV0TGFiZWwgYXVkaXQgaW5mb3JtYXRpb24KICAqCiAgKiBEZXNjcmlwdGlvbjoKICAqIENyZWF0ZSBhIG5ldyBDSVBTT19WNF9NQVBfTE9DQUwgRE9JIGRlZmluaXRpb24gYmFzZWQgb24gdGhlIGdpdmVuIEFERApAQCAtMzc0LDcgKzM3OSw4IEBACiAgKiBub24temVybyBvbiBlcnJvci4KICAqCiAgKi8KLXN0YXRpYyBpbnQgbmV0bGJsX2NpcHNvdjRfYWRkX2xvY2FsKHN0cnVjdCBnZW5sX2luZm8gKmluZm8pCitzdGF0aWMgaW50IG5ldGxibF9jaXBzb3Y0X2FkZF9sb2NhbChzdHJ1Y3QgZ2VubF9pbmZvICppbmZvLAorCQkJCSAgICBzdHJ1Y3QgbmV0bGJsX2F1ZGl0ICphdWRpdF9pbmZvKQogewogCWludCByZXRfdmFsOwogCXN0cnVjdCBjaXBzb192NF9kb2kgKmRvaV9kZWYgPSBOVUxMOwpAQCAtMzkxLDcgKzM5Nyw3IEBACiAJaWYgKHJldF92YWwgIT0gMCkKIAkJZ290byBhZGRfbG9jYWxfZmFpbHVyZTsKIAotCXJldF92YWwgPSBjaXBzb192NF9kb2lfYWRkKGRvaV9kZWYpOworCXJldF92YWwgPSBjaXBzb192NF9kb2lfYWRkKGRvaV9kZWYsIGF1ZGl0X2luZm8pOwogCWlmIChyZXRfdmFsICE9IDApCiAJCWdvdG8gYWRkX2xvY2FsX2ZhaWx1cmU7CiAJcmV0dXJuIDA7CkBAIC00MTUsNDggKzQyMSwzMSBAQAogCiB7CiAJaW50IHJldF92YWwgPSAtRUlOVkFMOwotCXUzMiB0eXBlOwotCXUzMiBkb2k7CiAJY29uc3QgY2hhciAqdHlwZV9zdHIgPSAiKHVua25vd24pIjsKLQlzdHJ1Y3QgYXVkaXRfYnVmZmVyICphdWRpdF9idWY7CiAJc3RydWN0IG5ldGxibF9hdWRpdCBhdWRpdF9pbmZvOwogCiAJaWYgKCFpbmZvLT5hdHRyc1tOTEJMX0NJUFNPVjRfQV9ET0ldIHx8CiAJICAgICFpbmZvLT5hdHRyc1tOTEJMX0NJUFNPVjRfQV9NVFlQRV0pCiAJCXJldHVybiAtRUlOVkFMOwogCi0JZG9pID0gbmxhX2dldF91MzIoaW5mby0+YXR0cnNbTkxCTF9DSVBTT1Y0X0FfRE9JXSk7CiAJbmV0bGJsX25ldGxpbmtfYXVkaXRpbmZvKHNrYiwgJmF1ZGl0X2luZm8pOwotCi0JdHlwZSA9IG5sYV9nZXRfdTMyKGluZm8tPmF0dHJzW05MQkxfQ0lQU09WNF9BX01UWVBFXSk7Ci0Jc3dpdGNoICh0eXBlKSB7CisJc3dpdGNoIChubGFfZ2V0X3UzMihpbmZvLT5hdHRyc1tOTEJMX0NJUFNPVjRfQV9NVFlQRV0pKSB7CiAJY2FzZSBDSVBTT19WNF9NQVBfVFJBTlM6CiAJCXR5cGVfc3RyID0gInRyYW5zIjsKLQkJcmV0X3ZhbCA9IG5ldGxibF9jaXBzb3Y0X2FkZF9zdGQoaW5mbyk7CisJCXJldF92YWwgPSBuZXRsYmxfY2lwc292NF9hZGRfc3RkKGluZm8sICZhdWRpdF9pbmZvKTsKIAkJYnJlYWs7CiAJY2FzZSBDSVBTT19WNF9NQVBfUEFTUzoKIAkJdHlwZV9zdHIgPSAicGFzcyI7Ci0JCXJldF92YWwgPSBuZXRsYmxfY2lwc292NF9hZGRfcGFzcyhpbmZvKTsKKwkJcmV0X3ZhbCA9IG5ldGxibF9jaXBzb3Y0X2FkZF9wYXNzKGluZm8sICZhdWRpdF9pbmZvKTsKIAkJYnJlYWs7CiAJY2FzZSBDSVBTT19WNF9NQVBfTE9DQUw6CiAJCXR5cGVfc3RyID0gImxvY2FsIjsKLQkJcmV0X3ZhbCA9IG5ldGxibF9jaXBzb3Y0X2FkZF9sb2NhbChpbmZvKTsKKwkJcmV0X3ZhbCA9IG5ldGxibF9jaXBzb3Y0X2FkZF9sb2NhbChpbmZvLCAmYXVkaXRfaW5mbyk7CiAJCWJyZWFrOwogCX0KIAlpZiAocmV0X3ZhbCA9PSAwKQogCQlhdG9taWNfaW5jKCZuZXRsYWJlbF9tZ210X3Byb3RvY291bnQpOwogCi0JYXVkaXRfYnVmID0gbmV0bGJsX2F1ZGl0X3N0YXJ0X2NvbW1vbihBVURJVF9NQUNfQ0lQU09WNF9BREQsCi0JCQkJCSAgICAgICZhdWRpdF9pbmZvKTsKLQlpZiAoYXVkaXRfYnVmICE9IE5VTEwpIHsKLQkJYXVkaXRfbG9nX2Zvcm1hdChhdWRpdF9idWYsCi0JCQkJICIgY2lwc29fZG9pPSV1IGNpcHNvX3R5cGU9JXMgcmVzPSV1IiwKLQkJCQkgZG9pLAotCQkJCSB0eXBlX3N0ciwKLQkJCQkgcmV0X3ZhbCA9PSAwID8gMSA6IDApOwotCQlhdWRpdF9sb2dfZW5kKGF1ZGl0X2J1Zik7Ci0JfQotCiAJcmV0dXJuIHJldF92YWw7CiB9CiAKQEAgLTcyNSw5ICs3MTQsNyBAQAogc3RhdGljIGludCBuZXRsYmxfY2lwc292NF9yZW1vdmUoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGdlbmxfaW5mbyAqaW5mbykKIHsKIAlpbnQgcmV0X3ZhbCA9IC1FSU5WQUw7Ci0JdTMyIGRvaSA9IDA7CiAJc3RydWN0IG5ldGxibF9kb21oc2hfd2Fsa19hcmcgY2JfYXJnOwotCXN0cnVjdCBhdWRpdF9idWZmZXIgKmF1ZGl0X2J1ZjsKIAlzdHJ1Y3QgbmV0bGJsX2F1ZGl0IGF1ZGl0X2luZm87CiAJdTMyIHNraXBfYmt0ID0gMDsKIAl1MzIgc2tpcF9jaGFpbiA9IDA7CkBAIC03MzUsMjkgKzcyMiwxNyBAQAogCWlmICghaW5mby0+YXR0cnNbTkxCTF9DSVBTT1Y0X0FfRE9JXSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlkb2kgPSBubGFfZ2V0X3UzMihpbmZvLT5hdHRyc1tOTEJMX0NJUFNPVjRfQV9ET0ldKTsKIAluZXRsYmxfbmV0bGlua19hdWRpdGluZm8oc2tiLCAmYXVkaXRfaW5mbyk7Ci0KLQljYl9hcmcuZG9pID0gZG9pOworCWNiX2FyZy5kb2kgPSBubGFfZ2V0X3UzMihpbmZvLT5hdHRyc1tOTEJMX0NJUFNPVjRfQV9ET0ldKTsKIAljYl9hcmcuYXVkaXRfaW5mbyA9ICZhdWRpdF9pbmZvOwogCXJldF92YWwgPSBuZXRsYmxfZG9taHNoX3dhbGsoJnNraXBfYmt0LCAmc2tpcF9jaGFpbiwKIAkJCQkgICAgIG5ldGxibF9jaXBzb3Y0X3JlbW92ZV9jYiwgJmNiX2FyZyk7CiAJaWYgKHJldF92YWwgPT0gMCB8fCByZXRfdmFsID09IC1FTk9FTlQpIHsKLQkJcmV0X3ZhbCA9IGNpcHNvX3Y0X2RvaV9yZW1vdmUoZG9pLCAmYXVkaXRfaW5mbyk7CisJCXJldF92YWwgPSBjaXBzb192NF9kb2lfcmVtb3ZlKGNiX2FyZy5kb2ksICZhdWRpdF9pbmZvKTsKIAkJaWYgKHJldF92YWwgPT0gMCkKIAkJCWF0b21pY19kZWMoJm5ldGxhYmVsX21nbXRfcHJvdG9jb3VudCk7CiAJfQogCi0JYXVkaXRfYnVmID0gbmV0bGJsX2F1ZGl0X3N0YXJ0X2NvbW1vbihBVURJVF9NQUNfQ0lQU09WNF9ERUwsCi0JCQkJCSAgICAgICZhdWRpdF9pbmZvKTsKLQlpZiAoYXVkaXRfYnVmICE9IE5VTEwpIHsKLQkJYXVkaXRfbG9nX2Zvcm1hdChhdWRpdF9idWYsCi0JCQkJICIgY2lwc29fZG9pPSV1IHJlcz0ldSIsCi0JCQkJIGRvaSwKLQkJCQkgcmV0X3ZhbCA9PSAwID8gMSA6IDApOwotCQlhdWRpdF9sb2dfZW5kKGF1ZGl0X2J1Zik7Ci0JfQotCiAJcmV0dXJuIHJldF92YWw7CiB9CiAKZGlmZiAtLWdpdCBhL25ldC9uZXRsYWJlbC9uZXRsYWJlbF9kb21haW5oYXNoLmMgYi9uZXQvbmV0bGFiZWwvbmV0bGFiZWxfZG9tYWluaGFzaC5jCmluZGV4IDVmYWRmMTAuLjdhMTBiYmUgMTAwNjQ0Ci0tLSBhL25ldC9uZXRsYWJlbC9uZXRsYWJlbF9kb21haW5oYXNoLmMKKysrIGIvbmV0L25ldGxhYmVsL25ldGxhYmVsX2RvbWFpbmhhc2guYwpAQCAtNDgzLDYgKzQ4Myw3MyBAQAogfQogCiAvKioKKyAqIG5ldGxibF9kb21oc2hfcmVtb3ZlX2FmNCAtIFJlbW92ZXMgYW4gYWRkcmVzcyBzZWxlY3RvciBlbnRyeQorICogQGRvbWFpbjogdGhlIGRvbWFpbgorICogQGFkZHI6IElQdjQgYWRkcmVzcworICogQG1hc2s6IElQdjQgYWRkcmVzcyBtYXNrCisgKiBAYXVkaXRfaW5mbzogTmV0TGFiZWwgYXVkaXQgaW5mb3JtYXRpb24KKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFJlbW92ZXMgYW4gaW5kaXZpZHVhbCBhZGRyZXNzIHNlbGVjdG9yIGZyb20gYSBkb21haW4gbWFwcGluZyBhbmQgcG90ZW50aWFsbHkKKyAqIHRoZSBlbnRpcmUgbWFwcGluZyBpZiBpdCBpcyBlbXB0eS4gIFJldHVybnMgemVybyBvbiBzdWNjZXNzLCBuZWdhdGl2ZSB2YWx1ZXMKKyAqIG9uIGZhaWx1cmUuCisgKgorICovCitpbnQgbmV0bGJsX2RvbWhzaF9yZW1vdmVfYWY0KGNvbnN0IGNoYXIgKmRvbWFpbiwKKwkJCSAgICAgY29uc3Qgc3RydWN0IGluX2FkZHIgKmFkZHIsCisJCQkgICAgIGNvbnN0IHN0cnVjdCBpbl9hZGRyICptYXNrLAorCQkJICAgICBzdHJ1Y3QgbmV0bGJsX2F1ZGl0ICphdWRpdF9pbmZvKQoreworCXN0cnVjdCBuZXRsYmxfZG9tX21hcCAqZW50cnlfbWFwOworCXN0cnVjdCBuZXRsYmxfYWY0bGlzdCAqZW50cnlfYWRkcjsKKwlzdHJ1Y3QgbmV0bGJsX2FmNGxpc3QgKml0ZXI0OworI2lmIGRlZmluZWQoQ09ORklHX0lQVjYpIHx8IGRlZmluZWQoQ09ORklHX0lQVjZfTU9EVUxFKQorCXN0cnVjdCBuZXRsYmxfYWY2bGlzdCAqaXRlcjY7CisjZW5kaWYgLyogSVB2NiAqLworCXN0cnVjdCBuZXRsYmxfZG9tYWRkcjRfbWFwICplbnRyeTsKKworCXJjdV9yZWFkX2xvY2soKTsKKworCWlmIChkb21haW4pCisJCWVudHJ5X21hcCA9IG5ldGxibF9kb21oc2hfc2VhcmNoKGRvbWFpbik7CisJZWxzZQorCQllbnRyeV9tYXAgPSBuZXRsYmxfZG9taHNoX3NlYXJjaF9kZWYoZG9tYWluKTsKKwlpZiAoZW50cnlfbWFwID09IE5VTEwgfHwgZW50cnlfbWFwLT50eXBlICE9IE5FVExCTF9OTFRZUEVfQUREUlNFTEVDVCkKKwkJZ290byByZW1vdmVfYWY0X2ZhaWx1cmU7CisKKwlzcGluX2xvY2soJm5ldGxibF9kb21oc2hfbG9jayk7CisJZW50cnlfYWRkciA9IG5ldGxibF9hZjRsaXN0X3JlbW92ZShhZGRyLT5zX2FkZHIsIG1hc2stPnNfYWRkciwKKwkJCQkJICAgJmVudHJ5X21hcC0+dHlwZV9kZWYuYWRkcnNlbC0+bGlzdDQpOworCXNwaW5fdW5sb2NrKCZuZXRsYmxfZG9taHNoX2xvY2spOworCisJaWYgKGVudHJ5X2FkZHIgPT0gTlVMTCkKKwkJZ290byByZW1vdmVfYWY0X2ZhaWx1cmU7CisJbmV0bGJsX2FmNGxpc3RfZm9yZWFjaF9yY3UoaXRlcjQsICZlbnRyeV9tYXAtPnR5cGVfZGVmLmFkZHJzZWwtPmxpc3Q0KQorCQlnb3RvIHJlbW92ZV9hZjRfc2luZ2xlX2FkZHI7CisjaWYgZGVmaW5lZChDT05GSUdfSVBWNikgfHwgZGVmaW5lZChDT05GSUdfSVBWNl9NT0RVTEUpCisJbmV0bGJsX2FmNmxpc3RfZm9yZWFjaF9yY3UoaXRlcjYsICZlbnRyeV9tYXAtPnR5cGVfZGVmLmFkZHJzZWwtPmxpc3Q2KQorCQlnb3RvIHJlbW92ZV9hZjRfc2luZ2xlX2FkZHI7CisjZW5kaWYgLyogSVB2NiAqLworCS8qIHRoZSBkb21haW4gbWFwcGluZyBpcyBlbXB0eSBzbyByZW1vdmUgaXQgZnJvbSB0aGUgbWFwcGluZyB0YWJsZSAqLworCW5ldGxibF9kb21oc2hfcmVtb3ZlX2VudHJ5KGVudHJ5X21hcCwgYXVkaXRfaW5mbyk7CisKK3JlbW92ZV9hZjRfc2luZ2xlX2FkZHI6CisJcmN1X3JlYWRfdW5sb2NrKCk7CisJLyogeWljaywgd2UgY2FuJ3QgdXNlIGNhbGxfcmN1IGhlcmUgYmVjYXVzZSB3ZSBkb24ndCBoYXZlIGEgcmN1IGhlYWQKKwkgKiBwb2ludGVyIGJ1dCBob3BlZnVsbHkgdGhpcyBzaG91bGQgYmUgYSByYXJlIGNhc2Ugc28gdGhlIHBhdXNlCisJICogc2hvdWxkbid0IGJlIGEgcHJvYmxlbSAqLworCXN5bmNocm9uaXplX3JjdSgpOworCWVudHJ5ID0gbmV0bGJsX2RvbWhzaF9hZGRyNF9lbnRyeShlbnRyeV9hZGRyKTsKKwljaXBzb192NF9kb2lfcHV0ZGVmKGVudHJ5LT50eXBlX2RlZi5jaXBzb3Y0KTsKKwlrZnJlZShlbnRyeSk7CisJcmV0dXJuIDA7CisKK3JlbW92ZV9hZjRfZmFpbHVyZToKKwlyY3VfcmVhZF91bmxvY2soKTsKKwlyZXR1cm4gLUVOT0VOVDsKK30KKworLyoqCiAgKiBuZXRsYmxfZG9taHNoX3JlbW92ZSAtIFJlbW92ZXMgYW4gZW50cnkgZnJvbSB0aGUgZG9tYWluIGhhc2ggdGFibGUKICAqIEBkb21haW46IHRoZSBkb21haW4gdG8gcmVtb3ZlCiAgKiBAYXVkaXRfaW5mbzogTmV0TGFiZWwgYXVkaXQgaW5mb3JtYXRpb24KZGlmZiAtLWdpdCBhL25ldC9uZXRsYWJlbC9uZXRsYWJlbF9kb21haW5oYXNoLmggYi9uZXQvbmV0bGFiZWwvbmV0bGFiZWxfZG9tYWluaGFzaC5oCmluZGV4IGJmY2I2NzYuLjAyNjFkZGEgMTAwNjQ0Ci0tLSBhL25ldC9uZXRsYWJlbC9uZXRsYWJlbF9kb21haW5oYXNoLmgKKysrIGIvbmV0L25ldGxhYmVsL25ldGxhYmVsX2RvbWFpbmhhc2guaApAQCAtOTAsNiArOTAsMTAgQEAKIAkJCSAgICAgIHN0cnVjdCBuZXRsYmxfYXVkaXQgKmF1ZGl0X2luZm8pOwogaW50IG5ldGxibF9kb21oc2hfcmVtb3ZlX2VudHJ5KHN0cnVjdCBuZXRsYmxfZG9tX21hcCAqZW50cnksCiAJCQkgICAgICAgc3RydWN0IG5ldGxibF9hdWRpdCAqYXVkaXRfaW5mbyk7CitpbnQgbmV0bGJsX2RvbWhzaF9yZW1vdmVfYWY0KGNvbnN0IGNoYXIgKmRvbWFpbiwKKwkJCSAgICAgY29uc3Qgc3RydWN0IGluX2FkZHIgKmFkZHIsCisJCQkgICAgIGNvbnN0IHN0cnVjdCBpbl9hZGRyICptYXNrLAorCQkJICAgICBzdHJ1Y3QgbmV0bGJsX2F1ZGl0ICphdWRpdF9pbmZvKTsKIGludCBuZXRsYmxfZG9taHNoX3JlbW92ZShjb25zdCBjaGFyICpkb21haW4sIHN0cnVjdCBuZXRsYmxfYXVkaXQgKmF1ZGl0X2luZm8pOwogaW50IG5ldGxibF9kb21oc2hfcmVtb3ZlX2RlZmF1bHQoc3RydWN0IG5ldGxibF9hdWRpdCAqYXVkaXRfaW5mbyk7CiBzdHJ1Y3QgbmV0bGJsX2RvbV9tYXAgKm5ldGxibF9kb21oc2hfZ2V0ZW50cnkoY29uc3QgY2hhciAqZG9tYWluKTsKZGlmZiAtLWdpdCBhL25ldC9uZXRsYWJlbC9uZXRsYWJlbF9rYXBpLmMgYi9uZXQvbmV0bGFiZWwvbmV0bGFiZWxfa2FwaS5jCmluZGV4IGIzMmVjZWIuLmZkOTIyOWQgMTAwNjQ0Ci0tLSBhL25ldC9uZXRsYWJlbC9uZXRsYWJlbF9rYXBpLmMKKysrIGIvbmV0L25ldGxhYmVsL25ldGxhYmVsX2thcGkuYwpAQCAtMzEsNyArMzEsMTAgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9hdWRpdC5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvaW42Lmg+CiAjaW5jbHVkZSA8bmV0L2lwLmg+CisjaW5jbHVkZSA8bmV0L2lwdjYuaD4KICNpbmNsdWRlIDxuZXQvbmV0bGFiZWwuaD4KICNpbmNsdWRlIDxuZXQvY2lwc29faXB2NC5oPgogI2luY2x1ZGUgPGFzbS9idWcuaD4KQEAgLTQyLDYgKzQ1LDcgQEAKICNpbmNsdWRlICJuZXRsYWJlbF9jaXBzb192NC5oIgogI2luY2x1ZGUgIm5ldGxhYmVsX3VzZXIuaCIKICNpbmNsdWRlICJuZXRsYWJlbF9tZ210LmgiCisjaW5jbHVkZSAibmV0bGFiZWxfYWRkcmxpc3QuaCIKIAogLyoKICAqIENvbmZpZ3VyYXRpb24gRnVuY3Rpb25zCkBAIC01MCw2ICs1NCw5IEBACiAvKioKICAqIG5ldGxibF9jZmdfbWFwX2RlbCAtIFJlbW92ZSBhIE5ldExhYmVsL0xTTSBkb21haW4gbWFwcGluZwogICogQGRvbWFpbjogdGhlIGRvbWFpbiBtYXBwaW5nIHRvIHJlbW92ZQorICogQGZhbWlseTogYWRkcmVzcyBmYW1pbHkKKyAqIEBhZGRyOiBJUCBhZGRyZXNzCisgKiBAbWFzazogSVAgYWRkcmVzcyBtYXNrCiAgKiBAYXVkaXRfaW5mbzogTmV0TGFiZWwgYXVkaXQgaW5mb3JtYXRpb24KICAqCiAgKiBEZXNjcmlwdGlvbjoKQEAgLTU4LDE0ICs2NSwzMiBAQAogICogdmFsdWVzIG9uIGZhaWx1cmUuCiAgKgogICovCi1pbnQgbmV0bGJsX2NmZ19tYXBfZGVsKGNvbnN0IGNoYXIgKmRvbWFpbiwgc3RydWN0IG5ldGxibF9hdWRpdCAqYXVkaXRfaW5mbykKK2ludCBuZXRsYmxfY2ZnX21hcF9kZWwoY29uc3QgY2hhciAqZG9tYWluLAorCQkgICAgICAgdTE2IGZhbWlseSwKKwkJICAgICAgIGNvbnN0IHZvaWQgKmFkZHIsCisJCSAgICAgICBjb25zdCB2b2lkICptYXNrLAorCQkgICAgICAgc3RydWN0IG5ldGxibF9hdWRpdCAqYXVkaXRfaW5mbykKIHsKLQlyZXR1cm4gbmV0bGJsX2RvbWhzaF9yZW1vdmUoZG9tYWluLCBhdWRpdF9pbmZvKTsKKwlpZiAoYWRkciA9PSBOVUxMICYmIG1hc2sgPT0gTlVMTCkgeworCQlyZXR1cm4gbmV0bGJsX2RvbWhzaF9yZW1vdmUoZG9tYWluLCBhdWRpdF9pbmZvKTsKKwl9IGVsc2UgaWYgKGFkZHIgIT0gTlVMTCAmJiBtYXNrICE9IE5VTEwpIHsKKwkJc3dpdGNoIChmYW1pbHkpIHsKKwkJY2FzZSBBRl9JTkVUOgorCQkJcmV0dXJuIG5ldGxibF9kb21oc2hfcmVtb3ZlX2FmNChkb21haW4sIGFkZHIsIG1hc2ssCisJCQkJCQkJYXVkaXRfaW5mbyk7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVQRk5PU1VQUE9SVDsKKwkJfQorCX0gZWxzZQorCQlyZXR1cm4gLUVJTlZBTDsKIH0KIAogLyoqCi0gKiBuZXRsYmxfY2ZnX3VubGJsX2FkZF9tYXAgLSBBZGQgYW4gdW5sYWJlbGVkIE5ldExhYmVsL0xTTSBkb21haW4gbWFwcGluZworICogbmV0bGJsX2NmZ191bmxibF9tYXBfYWRkIC0gQWRkIGEgbmV3IHVubGFiZWxlZCBtYXBwaW5nCiAgKiBAZG9tYWluOiB0aGUgZG9tYWluIG1hcHBpbmcgdG8gYWRkCisgKiBAZmFtaWx5OiBhZGRyZXNzIGZhbWlseQorICogQGFkZHI6IElQIGFkZHJlc3MKKyAqIEBtYXNrOiBJUCBhZGRyZXNzIG1hc2sKICAqIEBhdWRpdF9pbmZvOiBOZXRMYWJlbCBhdWRpdCBpbmZvcm1hdGlvbgogICoKICAqIERlc2NyaXB0aW9uOgpAQCAtNzQsMTEgKzk5LDE5IEBACiAgKiBuZWdhdGl2ZSB2YWx1ZXMgb24gZmFpbHVyZS4KICAqCiAgKi8KLWludCBuZXRsYmxfY2ZnX3VubGJsX2FkZF9tYXAoY29uc3QgY2hhciAqZG9tYWluLAoraW50IG5ldGxibF9jZmdfdW5sYmxfbWFwX2FkZChjb25zdCBjaGFyICpkb21haW4sCisJCQkgICAgIHUxNiBmYW1pbHksCisJCQkgICAgIGNvbnN0IHZvaWQgKmFkZHIsCisJCQkgICAgIGNvbnN0IHZvaWQgKm1hc2ssCiAJCQkgICAgIHN0cnVjdCBuZXRsYmxfYXVkaXQgKmF1ZGl0X2luZm8pCiB7CiAJaW50IHJldF92YWwgPSAtRU5PTUVNOwogCXN0cnVjdCBuZXRsYmxfZG9tX21hcCAqZW50cnk7CisJc3RydWN0IG5ldGxibF9kb21hZGRyX21hcCAqYWRkcm1hcCA9IE5VTEw7CisJc3RydWN0IG5ldGxibF9kb21hZGRyNF9tYXAgKm1hcDQgPSBOVUxMOworCXN0cnVjdCBuZXRsYmxfZG9tYWRkcjZfbWFwICptYXA2ID0gTlVMTDsKKwljb25zdCBzdHJ1Y3QgaW5fYWRkciAqYWRkcjQsICptYXNrNDsKKwljb25zdCBzdHJ1Y3QgaW42X2FkZHIgKmFkZHI2LCAqbWFzazY7CiAKIAllbnRyeSA9IGt6YWxsb2Moc2l6ZW9mKCplbnRyeSksIEdGUF9BVE9NSUMpOwogCWlmIChlbnRyeSA9PSBOVUxMKQpAQCAtODYsNDkgKzExOSwyMjUgQEAKIAlpZiAoZG9tYWluICE9IE5VTEwpIHsKIAkJZW50cnktPmRvbWFpbiA9IGtzdHJkdXAoZG9tYWluLCBHRlBfQVRPTUlDKTsKIAkJaWYgKGVudHJ5LT5kb21haW4gPT0gTlVMTCkKLQkJCWdvdG8gY2ZnX3VubGJsX2FkZF9tYXBfZmFpbHVyZTsKKwkJCWdvdG8gY2ZnX3VubGJsX21hcF9hZGRfZmFpbHVyZTsKIAl9Ci0JZW50cnktPnR5cGUgPSBORVRMQkxfTkxUWVBFX1VOTEFCRUxFRDsKKworCWlmIChhZGRyID09IE5VTEwgJiYgbWFzayA9PSBOVUxMKQorCQllbnRyeS0+dHlwZSA9IE5FVExCTF9OTFRZUEVfVU5MQUJFTEVEOworCWVsc2UgaWYgKGFkZHIgIT0gTlVMTCAmJiBtYXNrICE9IE5VTEwpIHsKKwkJYWRkcm1hcCA9IGt6YWxsb2Moc2l6ZW9mKCphZGRybWFwKSwgR0ZQX0FUT01JQyk7CisJCWlmIChhZGRybWFwID09IE5VTEwpCisJCQlnb3RvIGNmZ191bmxibF9tYXBfYWRkX2ZhaWx1cmU7CisJCUlOSVRfTElTVF9IRUFEKCZhZGRybWFwLT5saXN0NCk7CisJCUlOSVRfTElTVF9IRUFEKCZhZGRybWFwLT5saXN0Nik7CisKKwkJc3dpdGNoIChmYW1pbHkpIHsKKwkJY2FzZSBBRl9JTkVUOgorCQkJYWRkcjQgPSBhZGRyOworCQkJbWFzazQgPSBtYXNrOworCQkJbWFwNCA9IGt6YWxsb2Moc2l6ZW9mKCptYXA0KSwgR0ZQX0FUT01JQyk7CisJCQlpZiAobWFwNCA9PSBOVUxMKQorCQkJCWdvdG8gY2ZnX3VubGJsX21hcF9hZGRfZmFpbHVyZTsKKwkJCW1hcDQtPnR5cGUgPSBORVRMQkxfTkxUWVBFX1VOTEFCRUxFRDsKKwkJCW1hcDQtPmxpc3QuYWRkciA9IGFkZHI0LT5zX2FkZHIgJiBtYXNrNC0+c19hZGRyOworCQkJbWFwNC0+bGlzdC5tYXNrID0gbWFzazQtPnNfYWRkcjsKKwkJCW1hcDQtPmxpc3QudmFsaWQgPSAxOworCQkJcmV0X3ZhbCA9IG5ldGxibF9hZjRsaXN0X2FkZCgmbWFwNC0+bGlzdCwKKwkJCQkJCSAgICAgJmFkZHJtYXAtPmxpc3Q0KTsKKwkJCWlmIChyZXRfdmFsICE9IDApCisJCQkJZ290byBjZmdfdW5sYmxfbWFwX2FkZF9mYWlsdXJlOworCQkJYnJlYWs7CisJCWNhc2UgQUZfSU5FVDY6CisJCQlhZGRyNiA9IGFkZHI7CisJCQltYXNrNiA9IG1hc2s7CisJCQltYXA2ID0ga3phbGxvYyhzaXplb2YoKm1hcDYpLCBHRlBfQVRPTUlDKTsKKwkJCWlmIChtYXA0ID09IE5VTEwpCisJCQkJZ290byBjZmdfdW5sYmxfbWFwX2FkZF9mYWlsdXJlOworCQkJbWFwNi0+dHlwZSA9IE5FVExCTF9OTFRZUEVfVU5MQUJFTEVEOworCQkJaXB2Nl9hZGRyX2NvcHkoJm1hcDYtPmxpc3QuYWRkciwgYWRkcjYpOworCQkJbWFwNi0+bGlzdC5hZGRyLnM2X2FkZHIzMlswXSAmPSBtYXNrNi0+czZfYWRkcjMyWzBdOworCQkJbWFwNi0+bGlzdC5hZGRyLnM2X2FkZHIzMlsxXSAmPSBtYXNrNi0+czZfYWRkcjMyWzFdOworCQkJbWFwNi0+bGlzdC5hZGRyLnM2X2FkZHIzMlsyXSAmPSBtYXNrNi0+czZfYWRkcjMyWzJdOworCQkJbWFwNi0+bGlzdC5hZGRyLnM2X2FkZHIzMlszXSAmPSBtYXNrNi0+czZfYWRkcjMyWzNdOworCQkJaXB2Nl9hZGRyX2NvcHkoJm1hcDYtPmxpc3QubWFzaywgbWFzazYpOworCQkJbWFwNi0+bGlzdC52YWxpZCA9IDE7CisJCQlyZXRfdmFsID0gbmV0bGJsX2FmNGxpc3RfYWRkKCZtYXA0LT5saXN0LAorCQkJCQkJICAgICAmYWRkcm1hcC0+bGlzdDQpOworCQkJaWYgKHJldF92YWwgIT0gMCkKKwkJCQlnb3RvIGNmZ191bmxibF9tYXBfYWRkX2ZhaWx1cmU7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWdvdG8gY2ZnX3VubGJsX21hcF9hZGRfZmFpbHVyZTsKKwkJCWJyZWFrOworCQl9CisKKwkJZW50cnktPnR5cGVfZGVmLmFkZHJzZWwgPSBhZGRybWFwOworCQllbnRyeS0+dHlwZSA9IE5FVExCTF9OTFRZUEVfQUREUlNFTEVDVDsKKwl9IGVsc2UgeworCQlyZXRfdmFsID0gLUVJTlZBTDsKKwkJZ290byBjZmdfdW5sYmxfbWFwX2FkZF9mYWlsdXJlOworCX0KIAogCXJldF92YWwgPSBuZXRsYmxfZG9taHNoX2FkZChlbnRyeSwgYXVkaXRfaW5mbyk7CiAJaWYgKHJldF92YWwgIT0gMCkKLQkJZ290byBjZmdfdW5sYmxfYWRkX21hcF9mYWlsdXJlOworCQlnb3RvIGNmZ191bmxibF9tYXBfYWRkX2ZhaWx1cmU7CiAKIAlyZXR1cm4gMDsKIAotY2ZnX3VubGJsX2FkZF9tYXBfZmFpbHVyZToKK2NmZ191bmxibF9tYXBfYWRkX2ZhaWx1cmU6CiAJaWYgKGVudHJ5ICE9IE5VTEwpCiAJCWtmcmVlKGVudHJ5LT5kb21haW4pOwogCWtmcmVlKGVudHJ5KTsKKwlrZnJlZShhZGRybWFwKTsKKwlrZnJlZShtYXA0KTsKKwlrZnJlZShtYXA2KTsKIAlyZXR1cm4gcmV0X3ZhbDsKIH0KIAorCiAvKioKLSAqIG5ldGxibF9jZmdfY2lwc292NF9hZGRfbWFwIC0gQWRkIGEgbmV3IENJUFNPdjQgRE9JIGRlZmluaXRpb24gYW5kIG1hcHBpbmcKLSAqIEBkb2lfZGVmOiB0aGUgRE9JIGRlZmluaXRpb24KLSAqIEBkb21haW46IHRoZSBkb21haW4gbWFwcGluZyB0byBhZGQKKyAqIG5ldGxibF9jZmdfdW5sYmxfc3RhdGljX2FkZCAtIEFkZHMgYSBuZXcgc3RhdGljIGxhYmVsCisgKiBAbmV0OiBuZXR3b3JrIG5hbWVzcGFjZQorICogQGRldl9uYW1lOiBpbnRlcmZhY2UgbmFtZQorICogQGFkZHI6IElQIGFkZHJlc3MgaW4gbmV0d29yayBieXRlIG9yZGVyIChzdHJ1Y3QgaW5bNl1fYWRkcikKKyAqIEBtYXNrOiBhZGRyZXNzIG1hc2sgaW4gbmV0d29yayBieXRlIG9yZGVyIChzdHJ1Y3QgaW5bNl1fYWRkcikKKyAqIEBmYW1pbHk6IGFkZHJlc3MgZmFtaWx5CisgKiBAc2VjaWQ6IExTTSBzZWNpZCB2YWx1ZSBmb3IgdGhlIGVudHJ5CiAgKiBAYXVkaXRfaW5mbzogTmV0TGFiZWwgYXVkaXQgaW5mb3JtYXRpb24KICAqCiAgKiBEZXNjcmlwdGlvbjoKLSAqIEFkZCBhIG5ldyBDSVBTT3Y0IERPSSBkZWZpbml0aW9uIGFuZCBOZXRMYWJlbC9MU00gZG9tYWluIG1hcHBpbmcgZm9yIHRoaXMKLSAqIG5ldyBET0kgZGVmaW5pdGlvbiB0byB0aGUgTmV0TGFiZWwgc3Vic3lzdGVtLiAgQSBAZG9tYWluIHZhbHVlIG9mIE5VTEwgYWRkcwotICogYSBuZXcgZGVmYXVsdCBkb21haW4gbWFwcGluZy4gIFJldHVybnMgemVybyBvbiBzdWNjZXNzLCBuZWdhdGl2ZSB2YWx1ZXMgb24KLSAqIGZhaWx1cmUuCisgKiBBZGRzIGEgbmV3IE5ldExhYmVsIHN0YXRpYyBsYWJlbCB0byBiZSB1c2VkIHdoZW4gcHJvdG9jb2wgcHJvdmlkZWQgbGFiZWxzCisgKiBhcmUgbm90IHByZXNlbnQgb24gaW5jb21pbmcgdHJhZmZpYy4gIElmIEBkZXZfbmFtZSBpcyBOVUxMIHRoZW4gdGhlIGRlZmF1bHQKKyAqIGludGVyZmFjZSB3aWxsIGJlIHVzZWQuICBSZXR1cm5zIHplcm8gb24gc3VjY2VzcywgbmVnYXRpdmUgdmFsdWVzIG9uIGZhaWx1cmUuCiAgKgogICovCi1pbnQgbmV0bGJsX2NmZ19jaXBzb3Y0X2FkZF9tYXAoc3RydWN0IGNpcHNvX3Y0X2RvaSAqZG9pX2RlZiwKK2ludCBuZXRsYmxfY2ZnX3VubGJsX3N0YXRpY19hZGQoc3RydWN0IG5ldCAqbmV0LAorCQkJCWNvbnN0IGNoYXIgKmRldl9uYW1lLAorCQkJCWNvbnN0IHZvaWQgKmFkZHIsCisJCQkJY29uc3Qgdm9pZCAqbWFzaywKKwkJCQl1MTYgZmFtaWx5LAorCQkJCXUzMiBzZWNpZCwKKwkJCQlzdHJ1Y3QgbmV0bGJsX2F1ZGl0ICphdWRpdF9pbmZvKQoreworCXUzMiBhZGRyX2xlbjsKKworCXN3aXRjaCAoZmFtaWx5KSB7CisJY2FzZSBBRl9JTkVUOgorCQlhZGRyX2xlbiA9IHNpemVvZihzdHJ1Y3QgaW5fYWRkcik7CisJCWJyZWFrOworCWNhc2UgQUZfSU5FVDY6CisJCWFkZHJfbGVuID0gc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRVBGTk9TVVBQT1JUOworCX0KKworCXJldHVybiBuZXRsYmxfdW5saHNoX2FkZChuZXQsCisJCQkJIGRldl9uYW1lLCBhZGRyLCBtYXNrLCBhZGRyX2xlbiwKKwkJCQkgc2VjaWQsIGF1ZGl0X2luZm8pOworfQorCisvKioKKyAqIG5ldGxibF9jZmdfdW5sYmxfc3RhdGljX2RlbCAtIFJlbW92ZXMgYW4gZXhpc3Rpbmcgc3RhdGljIGxhYmVsCisgKiBAbmV0OiBuZXR3b3JrIG5hbWVzcGFjZQorICogQGRldl9uYW1lOiBpbnRlcmZhY2UgbmFtZQorICogQGFkZHI6IElQIGFkZHJlc3MgaW4gbmV0d29yayBieXRlIG9yZGVyIChzdHJ1Y3QgaW5bNl1fYWRkcikKKyAqIEBtYXNrOiBhZGRyZXNzIG1hc2sgaW4gbmV0d29yayBieXRlIG9yZGVyIChzdHJ1Y3QgaW5bNl1fYWRkcikKKyAqIEBmYW1pbHk6IGFkZHJlc3MgZmFtaWx5CisgKiBAc2VjaWQ6IExTTSBzZWNpZCB2YWx1ZSBmb3IgdGhlIGVudHJ5CisgKiBAYXVkaXRfaW5mbzogTmV0TGFiZWwgYXVkaXQgaW5mb3JtYXRpb24KKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFJlbW92ZXMgYW4gZXhpc3RpbmcgTmV0TGFiZWwgc3RhdGljIGxhYmVsIHVzZWQgd2hlbiBwcm90b2NvbCBwcm92aWRlZCBsYWJlbHMKKyAqIGFyZSBub3QgcHJlc2VudCBvbiBpbmNvbWluZyB0cmFmZmljLiAgSWYgQGRldl9uYW1lIGlzIE5VTEwgdGhlbiB0aGUgZGVmYXVsdAorICogaW50ZXJmYWNlIHdpbGwgYmUgdXNlZC4gIFJldHVybnMgemVybyBvbiBzdWNjZXNzLCBuZWdhdGl2ZSB2YWx1ZXMgb24gZmFpbHVyZS4KKyAqCisgKi8KK2ludCBuZXRsYmxfY2ZnX3VubGJsX3N0YXRpY19kZWwoc3RydWN0IG5ldCAqbmV0LAorCQkJCWNvbnN0IGNoYXIgKmRldl9uYW1lLAorCQkJCWNvbnN0IHZvaWQgKmFkZHIsCisJCQkJY29uc3Qgdm9pZCAqbWFzaywKKwkJCQl1MTYgZmFtaWx5LAorCQkJCXN0cnVjdCBuZXRsYmxfYXVkaXQgKmF1ZGl0X2luZm8pCit7CisJdTMyIGFkZHJfbGVuOworCisJc3dpdGNoIChmYW1pbHkpIHsKKwljYXNlIEFGX0lORVQ6CisJCWFkZHJfbGVuID0gc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKTsKKwkJYnJlYWs7CisJY2FzZSBBRl9JTkVUNjoKKwkJYWRkcl9sZW4gPSBzaXplb2Yoc3RydWN0IGluNl9hZGRyKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FUEZOT1NVUFBPUlQ7CisJfQorCisJcmV0dXJuIG5ldGxibF91bmxoc2hfcmVtb3ZlKG5ldCwKKwkJCQkgICAgZGV2X25hbWUsIGFkZHIsIG1hc2ssIGFkZHJfbGVuLAorCQkJCSAgICBhdWRpdF9pbmZvKTsKK30KKworLyoqCisgKiBuZXRsYmxfY2ZnX2NpcHNvdjRfYWRkIC0gQWRkIGEgbmV3IENJUFNPdjQgRE9JIGRlZmluaXRpb24KKyAqIEBkb2lfZGVmOiBDSVBTTyBET0kgZGVmaW5pdGlvbgorICogQGF1ZGl0X2luZm86IE5ldExhYmVsIGF1ZGl0IGluZm9ybWF0aW9uCisgKgorICogRGVzY3JpcHRpb246CisgKiBBZGQgYSBuZXcgQ0lQU08gRE9JIGRlZmluaXRpb24gYXMgZGVmaW5lZCBieSBAZG9pX2RlZi4gIFJldHVybnMgemVybyBvbgorICogc3VjY2VzcyBhbmQgbmVnYXRpdmUgdmFsdWVzIG9uIGZhaWx1cmUuCisgKgorICovCitpbnQgbmV0bGJsX2NmZ19jaXBzb3Y0X2FkZChzdHJ1Y3QgY2lwc29fdjRfZG9pICpkb2lfZGVmLAorCQkJICAgc3RydWN0IG5ldGxibF9hdWRpdCAqYXVkaXRfaW5mbykKK3sKKwlyZXR1cm4gY2lwc29fdjRfZG9pX2FkZChkb2lfZGVmLCBhdWRpdF9pbmZvKTsKK30KKworLyoqCisgKiBuZXRsYmxfY2ZnX2NpcHNvdjRfZGVsIC0gUmVtb3ZlIGFuIGV4aXN0aW5nIENJUFNPdjQgRE9JIGRlZmluaXRpb24KKyAqIEBkb2k6IENJUFNPIERPSQorICogQGF1ZGl0X2luZm86IE5ldExhYmVsIGF1ZGl0IGluZm9ybWF0aW9uCisgKgorICogRGVzY3JpcHRpb246CisgKiBSZW1vdmUgYW4gZXhpc3RpbmcgQ0lQU08gRE9JIGRlZmluaXRpb24gbWF0Y2hpbmcgQGRvaS4gIFJldHVybnMgemVybyBvbgorICogc3VjY2VzcyBhbmQgbmVnYXRpdmUgdmFsdWVzIG9uIGZhaWx1cmUuCisgKgorICovCit2b2lkIG5ldGxibF9jZmdfY2lwc292NF9kZWwodTMyIGRvaSwgc3RydWN0IG5ldGxibF9hdWRpdCAqYXVkaXRfaW5mbykKK3sKKwljaXBzb192NF9kb2lfcmVtb3ZlKGRvaSwgYXVkaXRfaW5mbyk7Cit9CisKKy8qKgorICogbmV0bGJsX2NmZ19jaXBzb3Y0X21hcF9hZGQgLSBBZGQgYSBuZXcgQ0lQU092NCBET0kgbWFwcGluZworICogQGRvaTogdGhlIENJUFNPIERPSQorICogQGRvbWFpbjogdGhlIGRvbWFpbiBtYXBwaW5nIHRvIGFkZAorICogQGFkZHI6IElQIGFkZHJlc3MKKyAqIEBtYXNrOiBJUCBhZGRyZXNzIG1hc2sKKyAqIEBhdWRpdF9pbmZvOiBOZXRMYWJlbCBhdWRpdCBpbmZvcm1hdGlvbgorICoKKyAqIERlc2NyaXB0aW9uOgorICogQWRkIGEgbmV3IE5ldExhYmVsL0xTTSBkb21haW4gbWFwcGluZyBmb3IgdGhlIGdpdmVuIENJUFNPIERPSSB0byB0aGUgTmV0TGFiZWwKKyAqIHN1YnN5c3RlbS4gIEEgQGRvbWFpbiB2YWx1ZSBvZiBOVUxMIGFkZHMgYSBuZXcgZGVmYXVsdCBkb21haW4gbWFwcGluZy4KKyAqIFJldHVybnMgemVybyBvbiBzdWNjZXNzLCBuZWdhdGl2ZSB2YWx1ZXMgb24gZmFpbHVyZS4KKyAqCisgKi8KK2ludCBuZXRsYmxfY2ZnX2NpcHNvdjRfbWFwX2FkZCh1MzIgZG9pLAogCQkJICAgICAgIGNvbnN0IGNoYXIgKmRvbWFpbiwKKwkJCSAgICAgICBjb25zdCBzdHJ1Y3QgaW5fYWRkciAqYWRkciwKKwkJCSAgICAgICBjb25zdCBzdHJ1Y3QgaW5fYWRkciAqbWFzaywKIAkJCSAgICAgICBzdHJ1Y3QgbmV0bGJsX2F1ZGl0ICphdWRpdF9pbmZvKQogewogCWludCByZXRfdmFsID0gLUVOT01FTTsKLQl1MzIgZG9pOwotCXUzMiBkb2lfdHlwZTsKKwlzdHJ1Y3QgY2lwc29fdjRfZG9pICpkb2lfZGVmOwogCXN0cnVjdCBuZXRsYmxfZG9tX21hcCAqZW50cnk7Ci0JY29uc3QgY2hhciAqdHlwZV9zdHI7Ci0Jc3RydWN0IGF1ZGl0X2J1ZmZlciAqYXVkaXRfYnVmOworCXN0cnVjdCBuZXRsYmxfZG9tYWRkcl9tYXAgKmFkZHJtYXAgPSBOVUxMOworCXN0cnVjdCBuZXRsYmxfZG9tYWRkcjRfbWFwICphZGRyaW5mbyA9IE5VTEw7CiAKLQlkb2kgPSBkb2lfZGVmLT5kb2k7Ci0JZG9pX3R5cGUgPSBkb2lfZGVmLT50eXBlOworCWRvaV9kZWYgPSBjaXBzb192NF9kb2lfZ2V0ZGVmKGRvaSk7CisJaWYgKGRvaV9kZWYgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9FTlQ7CiAKIAllbnRyeSA9IGt6YWxsb2Moc2l6ZW9mKCplbnRyeSksIEdGUF9BVE9NSUMpOwogCWlmIChlbnRyeSA9PSBOVUxMKQpAQCAtMTM2LDU2ICszNDUsNTIgQEAKIAlpZiAoZG9tYWluICE9IE5VTEwpIHsKIAkJZW50cnktPmRvbWFpbiA9IGtzdHJkdXAoZG9tYWluLCBHRlBfQVRPTUlDKTsKIAkJaWYgKGVudHJ5LT5kb21haW4gPT0gTlVMTCkKLQkJCWdvdG8gY2ZnX2NpcHNvdjRfYWRkX21hcF9mYWlsdXJlOworCQkJZ290byBjZmdfY2lwc292NF9tYXBfYWRkX2ZhaWx1cmU7CiAJfQogCi0JcmV0X3ZhbCA9IGNpcHNvX3Y0X2RvaV9hZGQoZG9pX2RlZik7Ci0JaWYgKHJldF92YWwgIT0gMCkKLQkJZ290byBjZmdfY2lwc292NF9hZGRfbWFwX2ZhaWx1cmVfcmVtb3ZlX2RvaTsKLQllbnRyeS0+dHlwZSA9IE5FVExCTF9OTFRZUEVfQ0lQU09WNDsKLQllbnRyeS0+dHlwZV9kZWYuY2lwc292NCA9IGNpcHNvX3Y0X2RvaV9nZXRkZWYoZG9pKTsKLQlpZiAoZW50cnktPnR5cGVfZGVmLmNpcHNvdjQgPT0gTlVMTCkgewotCQlyZXRfdmFsID0gLUVOT0VOVDsKLQkJZ290byBjZmdfY2lwc292NF9hZGRfbWFwX2ZhaWx1cmVfcmVtb3ZlX2RvaTsKKwlpZiAoYWRkciA9PSBOVUxMICYmIG1hc2sgPT0gTlVMTCkgeworCQllbnRyeS0+dHlwZV9kZWYuY2lwc292NCA9IGRvaV9kZWY7CisJCWVudHJ5LT50eXBlID0gTkVUTEJMX05MVFlQRV9DSVBTT1Y0OworCX0gZWxzZSBpZiAoYWRkciAhPSBOVUxMICYmIG1hc2sgIT0gTlVMTCkgeworCQlhZGRybWFwID0ga3phbGxvYyhzaXplb2YoKmFkZHJtYXApLCBHRlBfQVRPTUlDKTsKKwkJaWYgKGFkZHJtYXAgPT0gTlVMTCkKKwkJCWdvdG8gY2ZnX2NpcHNvdjRfbWFwX2FkZF9mYWlsdXJlOworCQlJTklUX0xJU1RfSEVBRCgmYWRkcm1hcC0+bGlzdDQpOworCQlJTklUX0xJU1RfSEVBRCgmYWRkcm1hcC0+bGlzdDYpOworCisJCWFkZHJpbmZvID0ga3phbGxvYyhzaXplb2YoKmFkZHJpbmZvKSwgR0ZQX0FUT01JQyk7CisJCWlmIChhZGRyaW5mbyA9PSBOVUxMKQorCQkJZ290byBjZmdfY2lwc292NF9tYXBfYWRkX2ZhaWx1cmU7CisJCWFkZHJpbmZvLT50eXBlX2RlZi5jaXBzb3Y0ID0gZG9pX2RlZjsKKwkJYWRkcmluZm8tPnR5cGUgPSBORVRMQkxfTkxUWVBFX0NJUFNPVjQ7CisJCWFkZHJpbmZvLT5saXN0LmFkZHIgPSBhZGRyLT5zX2FkZHIgJiBtYXNrLT5zX2FkZHI7CisJCWFkZHJpbmZvLT5saXN0Lm1hc2sgPSBtYXNrLT5zX2FkZHI7CisJCWFkZHJpbmZvLT5saXN0LnZhbGlkID0gMTsKKwkJcmV0X3ZhbCA9IG5ldGxibF9hZjRsaXN0X2FkZCgmYWRkcmluZm8tPmxpc3QsICZhZGRybWFwLT5saXN0NCk7CisJCWlmIChyZXRfdmFsICE9IDApCisJCQlnb3RvIGNmZ19jaXBzb3Y0X21hcF9hZGRfZmFpbHVyZTsKKworCQllbnRyeS0+dHlwZV9kZWYuYWRkcnNlbCA9IGFkZHJtYXA7CisJCWVudHJ5LT50eXBlID0gTkVUTEJMX05MVFlQRV9BRERSU0VMRUNUOworCX0gZWxzZSB7CisJCXJldF92YWwgPSAtRUlOVkFMOworCQlnb3RvIGNmZ19jaXBzb3Y0X21hcF9hZGRfZmFpbHVyZTsKIAl9CisKIAlyZXRfdmFsID0gbmV0bGJsX2RvbWhzaF9hZGQoZW50cnksIGF1ZGl0X2luZm8pOwogCWlmIChyZXRfdmFsICE9IDApCi0JCWdvdG8gY2ZnX2NpcHNvdjRfYWRkX21hcF9mYWlsdXJlX3JlbGVhc2VfZG9pOworCQlnb3RvIGNmZ19jaXBzb3Y0X21hcF9hZGRfZmFpbHVyZTsKIAotY2ZnX2NpcHNvdjRfYWRkX21hcF9yZXR1cm46Ci0JYXVkaXRfYnVmID0gbmV0bGJsX2F1ZGl0X3N0YXJ0X2NvbW1vbihBVURJVF9NQUNfQ0lQU09WNF9BREQsCi0JCQkJCSAgICAgIGF1ZGl0X2luZm8pOwotCWlmIChhdWRpdF9idWYgIT0gTlVMTCkgewotCQlzd2l0Y2ggKGRvaV90eXBlKSB7Ci0JCWNhc2UgQ0lQU09fVjRfTUFQX1RSQU5TOgotCQkJdHlwZV9zdHIgPSAidHJhbnMiOwotCQkJYnJlYWs7Ci0JCWNhc2UgQ0lQU09fVjRfTUFQX1BBU1M6Ci0JCQl0eXBlX3N0ciA9ICJwYXNzIjsKLQkJCWJyZWFrOwotCQljYXNlIENJUFNPX1Y0X01BUF9MT0NBTDoKLQkJCXR5cGVfc3RyID0gImxvY2FsIjsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJdHlwZV9zdHIgPSAiKHVua25vd24pIjsKLQkJfQotCQlhdWRpdF9sb2dfZm9ybWF0KGF1ZGl0X2J1ZiwKLQkJCQkgIiBjaXBzb19kb2k9JXUgY2lwc29fdHlwZT0lcyByZXM9JXUiLAotCQkJCSBkb2ksIHR5cGVfc3RyLCByZXRfdmFsID09IDAgPyAxIDogMCk7Ci0JCWF1ZGl0X2xvZ19lbmQoYXVkaXRfYnVmKTsKLQl9CisJcmV0dXJuIDA7CiAKLQlyZXR1cm4gcmV0X3ZhbDsKLQotY2ZnX2NpcHNvdjRfYWRkX21hcF9mYWlsdXJlX3JlbGVhc2VfZG9pOgorY2ZnX2NpcHNvdjRfbWFwX2FkZF9mYWlsdXJlOgogCWNpcHNvX3Y0X2RvaV9wdXRkZWYoZG9pX2RlZik7Ci1jZmdfY2lwc292NF9hZGRfbWFwX2ZhaWx1cmVfcmVtb3ZlX2RvaToKLQljaXBzb192NF9kb2lfcmVtb3ZlKGRvaSwgYXVkaXRfaW5mbyk7Ci1jZmdfY2lwc292NF9hZGRfbWFwX2ZhaWx1cmU6CiAJaWYgKGVudHJ5ICE9IE5VTEwpCiAJCWtmcmVlKGVudHJ5LT5kb21haW4pOwogCWtmcmVlKGVudHJ5KTsKLQlnb3RvIGNmZ19jaXBzb3Y0X2FkZF9tYXBfcmV0dXJuOworCWtmcmVlKGFkZHJtYXApOworCWtmcmVlKGFkZHJpbmZvKTsKKwlyZXR1cm4gcmV0X3ZhbDsKIH0KIAogLyoKQEAgLTY5MSw2ICs4OTYsMjggQEAKIH0KIAogLyoKKyAqIFByb3RvY29sIEVuZ2luZSBGdW5jdGlvbnMKKyAqLworCisvKioKKyAqIG5ldGxibF9hdWRpdF9zdGFydCAtIFN0YXJ0IGFuIGF1ZGl0IG1lc3NhZ2UKKyAqIEB0eXBlOiBhdWRpdCBtZXNzYWdlIHR5cGUKKyAqIEBhdWRpdF9pbmZvOiBOZXRMYWJlbCBhdWRpdCBpbmZvcm1hdGlvbgorICoKKyAqIERlc2NyaXB0aW9uOgorICogU3RhcnQgYW4gYXVkaXQgbWVzc2FnZSB1c2luZyB0aGUgdHlwZSBzcGVjaWZpZWQgaW4gQHR5cGUgYW5kIGZpbGwgdGhlIGF1ZGl0CisgKiBtZXNzYWdlIHdpdGggc29tZSBmaWVsZHMgY29tbW9uIHRvIGFsbCBOZXRMYWJlbCBhdWRpdCBtZXNzYWdlcy4gIFRoaXMKKyAqIGZ1bmN0aW9uIHNob3VsZCBvbmx5IGJlIHVzZWQgYnkgcHJvdG9jb2wgZW5naW5lcywgbm90IExTTXMuICBSZXR1cm5zIGEKKyAqIHBvaW50ZXIgdG8gdGhlIGF1ZGl0IGJ1ZmZlciBvbiBzdWNjZXNzLCBOVUxMIG9uIGZhaWx1cmUuCisgKgorICovCitzdHJ1Y3QgYXVkaXRfYnVmZmVyICpuZXRsYmxfYXVkaXRfc3RhcnQoaW50IHR5cGUsCisJCQkJCXN0cnVjdCBuZXRsYmxfYXVkaXQgKmF1ZGl0X2luZm8pCit7CisJcmV0dXJuIG5ldGxibF9hdWRpdF9zdGFydF9jb21tb24odHlwZSwgYXVkaXRfaW5mbyk7Cit9CisKKy8qCiAgKiBTZXR1cCBGdW5jdGlvbnMKICAqLwogCmRpZmYgLS1naXQgYS9uZXQvbmV0bGFiZWwvbmV0bGFiZWxfdW5sYWJlbGVkLmMgYi9uZXQvbmV0bGFiZWwvbmV0bGFiZWxfdW5sYWJlbGVkLmMKaW5kZXggOGMwMzA4MC4uZjNjNWM2OCAxMDA2NDQKLS0tIGEvbmV0L25ldGxhYmVsL25ldGxhYmVsX3VubGFiZWxlZC5jCisrKyBiL25ldC9uZXRsYWJlbC9uZXRsYWJlbF91bmxhYmVsZWQuYwpAQCAtNDUwLDEzICs0NTAsMTMgQEAKICAqIHN1Y2Nlc3MsIG5lZ2F0aXZlIHZhbHVlcyBvbiBmYWlsdXJlLgogICoKICAqLwotc3RhdGljIGludCBuZXRsYmxfdW5saHNoX2FkZChzdHJ1Y3QgbmV0ICpuZXQsCi0JCQkgICAgIGNvbnN0IGNoYXIgKmRldl9uYW1lLAotCQkJICAgICBjb25zdCB2b2lkICphZGRyLAotCQkJICAgICBjb25zdCB2b2lkICptYXNrLAotCQkJICAgICB1MzIgYWRkcl9sZW4sCi0JCQkgICAgIHUzMiBzZWNpZCwKLQkJCSAgICAgc3RydWN0IG5ldGxibF9hdWRpdCAqYXVkaXRfaW5mbykKK2ludCBuZXRsYmxfdW5saHNoX2FkZChzdHJ1Y3QgbmV0ICpuZXQsCisJCSAgICAgIGNvbnN0IGNoYXIgKmRldl9uYW1lLAorCQkgICAgICBjb25zdCB2b2lkICphZGRyLAorCQkgICAgICBjb25zdCB2b2lkICptYXNrLAorCQkgICAgICB1MzIgYWRkcl9sZW4sCisJCSAgICAgIHUzMiBzZWNpZCwKKwkJICAgICAgc3RydWN0IG5ldGxibF9hdWRpdCAqYXVkaXRfaW5mbykKIHsKIAlpbnQgcmV0X3ZhbDsKIAlpbnQgaWZpbmRleDsKQEAgLTcyMCwxMiArNzIwLDEyIEBACiAgKiBSZXR1cm5zIHplcm8gb24gc3VjY2VzcywgbmVnYXRpdmUgdmFsdWVzIG9uIGZhaWx1cmUuCiAgKgogICovCi1zdGF0aWMgaW50IG5ldGxibF91bmxoc2hfcmVtb3ZlKHN0cnVjdCBuZXQgKm5ldCwKLQkJCQljb25zdCBjaGFyICpkZXZfbmFtZSwKLQkJCQljb25zdCB2b2lkICphZGRyLAotCQkJCWNvbnN0IHZvaWQgKm1hc2ssCi0JCQkJdTMyIGFkZHJfbGVuLAotCQkJCXN0cnVjdCBuZXRsYmxfYXVkaXQgKmF1ZGl0X2luZm8pCitpbnQgbmV0bGJsX3VubGhzaF9yZW1vdmUoc3RydWN0IG5ldCAqbmV0LAorCQkJIGNvbnN0IGNoYXIgKmRldl9uYW1lLAorCQkJIGNvbnN0IHZvaWQgKmFkZHIsCisJCQkgY29uc3Qgdm9pZCAqbWFzaywKKwkJCSB1MzIgYWRkcl9sZW4sCisJCQkgc3RydWN0IG5ldGxibF9hdWRpdCAqYXVkaXRfaW5mbykKIHsKIAlpbnQgcmV0X3ZhbDsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OwpkaWZmIC0tZ2l0IGEvbmV0L25ldGxhYmVsL25ldGxhYmVsX3VubGFiZWxlZC5oIGIvbmV0L25ldGxhYmVsL25ldGxhYmVsX3VubGFiZWxlZC5oCmluZGV4IDA2YjEzMDEuLjdhYmE2MzUgMTAwNjQ0Ci0tLSBhL25ldC9uZXRsYWJlbC9uZXRsYWJlbF91bmxhYmVsZWQuaAorKysgYi9uZXQvbmV0bGFiZWwvbmV0bGFiZWxfdW5sYWJlbGVkLmgKQEAgLTIyMSw2ICsyMjEsMjEgQEAKIC8qIEdlbmVyYWwgVW5sYWJlbGVkIGluaXQgZnVuY3Rpb24gKi8KIGludCBuZXRsYmxfdW5sYWJlbF9pbml0KHUzMiBzaXplKTsKIAorLyogU3RhdGljL0ZhbGxiYWNrIGxhYmVsIG1hbmFnZW1lbnQgZnVuY3Rpb25zICovCitpbnQgbmV0bGJsX3VubGhzaF9hZGQoc3RydWN0IG5ldCAqbmV0LAorCQkgICAgICBjb25zdCBjaGFyICpkZXZfbmFtZSwKKwkJICAgICAgY29uc3Qgdm9pZCAqYWRkciwKKwkJICAgICAgY29uc3Qgdm9pZCAqbWFzaywKKwkJICAgICAgdTMyIGFkZHJfbGVuLAorCQkgICAgICB1MzIgc2VjaWQsCisJCSAgICAgIHN0cnVjdCBuZXRsYmxfYXVkaXQgKmF1ZGl0X2luZm8pOworaW50IG5ldGxibF91bmxoc2hfcmVtb3ZlKHN0cnVjdCBuZXQgKm5ldCwKKwkJCSBjb25zdCBjaGFyICpkZXZfbmFtZSwKKwkJCSBjb25zdCB2b2lkICphZGRyLAorCQkJIGNvbnN0IHZvaWQgKm1hc2ssCisJCQkgdTMyIGFkZHJfbGVuLAorCQkJIHN0cnVjdCBuZXRsYmxfYXVkaXQgKmF1ZGl0X2luZm8pOworCiAvKiBQcm9jZXNzIFVubGFiZWxlZCBpbmNvbWluZyBuZXR3b3JrIHBhY2tldHMgKi8KIGludCBuZXRsYmxfdW5sYWJlbF9nZXRhdHRyKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCiAJCQkgICB1MTYgZmFtaWx5LApkaWZmIC0tZ2l0IGEvbmV0L25ldGxpbmsvZ2VuZXRsaW5rLmMgYi9uZXQvbmV0bGluay9nZW5ldGxpbmsuYwppbmRleCAzZTExOTFjLi4xZDNkZDMwIDEwMDY0NAotLS0gYS9uZXQvbmV0bGluay9nZW5ldGxpbmsuYworKysgYi9uZXQvbmV0bGluay9nZW5ldGxpbmsuYwpAQCAtMjI1LDYgKzIyNSw3IEBACiAJX19nZW5sX3VucmVnaXN0ZXJfbWNfZ3JvdXAoZmFtaWx5LCBncnApOwogCWdlbmxfdW5sb2NrKCk7CiB9CitFWFBPUlRfU1lNQk9MKGdlbmxfdW5yZWdpc3Rlcl9tY19ncm91cCk7CiAKIHN0YXRpYyB2b2lkIGdlbmxfdW5yZWdpc3Rlcl9tY19ncm91cHMoc3RydWN0IGdlbmxfZmFtaWx5ICpmYW1pbHkpCiB7CmRpZmYgLS1naXQgYS9uZXQvcGhvbmV0L3BlcC1ncHJzLmMgYi9uZXQvcGhvbmV0L3BlcC1ncHJzLmMKaW5kZXggYjBjZWFjMi4uNmE5MWEzMiAxMDA2NDQKLS0tIGEvbmV0L3Bob25ldC9wZXAtZ3Bycy5jCisrKyBiL25ldC9waG9uZXQvcGVwLWdwcnMuYwpAQCAtMjI3LDYgKzIyNywxMyBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIGdwcnNfbmV0ZGV2X29wcyA9IHsKKwkubmRvX29wZW4JPSBncHJzX29wZW4sCisJLm5kb19zdG9wCT0gZ3Byc19jbG9zZSwKKwkubmRvX3N0YXJ0X3htaXQJPSBncHJzX3htaXQsCisJLm5kb19jaGFuZ2VfbXR1CT0gZ3Byc19zZXRfbXR1LAorfTsKKwogc3RhdGljIHZvaWQgZ3Byc19zZXR1cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCWRldi0+ZmVhdHVyZXMJCT0gTkVUSUZfRl9GUkFHTElTVDsKQEAgLTIzNywxMSArMjQ0LDggQEAKIAlkZXYtPmFkZHJfbGVuCQk9IDA7CiAJZGV2LT50eF9xdWV1ZV9sZW4JPSAxMDsKIAorCWRldi0+bmV0ZGV2X29wcwkJPSAmZ3Byc19uZXRkZXZfb3BzOwogCWRldi0+ZGVzdHJ1Y3RvcgkJPSBmcmVlX25ldGRldjsKLQlkZXYtPm9wZW4JCT0gZ3Byc19vcGVuOwotCWRldi0+c3RvcAkJPSBncHJzX2Nsb3NlOwotCWRldi0+aGFyZF9zdGFydF94bWl0CT0gZ3Byc194bWl0OyAvKiBtYW5kYXRvcnkgKi8KLQlkZXYtPmNoYW5nZV9tdHUJCT0gZ3Byc19zZXRfbXR1OwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvbmV0L3Jma2lsbC9yZmtpbGwuYyBiL25ldC9yZmtpbGwvcmZraWxsLmMKaW5kZXggM2M5NGY3Ni4uM2VhYTM5NCAxMDA2NDQKLS0tIGEvbmV0L3Jma2lsbC9yZmtpbGwuYworKysgYi9uZXQvcmZraWxsL3Jma2lsbC5jCkBAIC01NCwxMCArNTQsMTAgQEAKIHN0YXRpYyBib29sIHJma2lsbF9lcG9fbG9ja19hY3RpdmU7CiAKIAorI2lmZGVmIENPTkZJR19SRktJTExfTEVEUwogc3RhdGljIHZvaWQgcmZraWxsX2xlZF90cmlnZ2VyKHN0cnVjdCByZmtpbGwgKnJma2lsbCwKIAkJCSAgICAgICBlbnVtIHJma2lsbF9zdGF0ZSBzdGF0ZSkKIHsKLSNpZmRlZiBDT05GSUdfUkZLSUxMX0xFRFMKIAlzdHJ1Y3QgbGVkX3RyaWdnZXIgKmxlZCA9ICZyZmtpbGwtPmxlZF90cmlnZ2VyOwogCiAJaWYgKCFsZWQtPm5hbWUpCkBAIC02NiwxMCArNjYsOCBAQAogCQlsZWRfdHJpZ2dlcl9ldmVudChsZWQsIExFRF9PRkYpOwogCWVsc2UKIAkJbGVkX3RyaWdnZXJfZXZlbnQobGVkLCBMRURfRlVMTCk7Ci0jZW5kaWYgLyogQ09ORklHX1JGS0lMTF9MRURTICovCiB9CiAKLSNpZmRlZiBDT05GSUdfUkZLSUxMX0xFRFMKIHN0YXRpYyB2b2lkIHJma2lsbF9sZWRfdHJpZ2dlcl9hY3RpdmF0ZShzdHJ1Y3QgbGVkX2NsYXNzZGV2ICpsZWQpCiB7CiAJc3RydWN0IHJma2lsbCAqcmZraWxsID0gY29udGFpbmVyX29mKGxlZC0+dHJpZ2dlciwKZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9jbHNfdTMyLmMgYi9uZXQvc2NoZWQvY2xzX3UzMi5jCmluZGV4IDA1ZDE3ODAwLi4wNzM3MmY2IDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvY2xzX3UzMi5jCisrKyBiL25ldC9zY2hlZC9jbHNfdTMyLmMKQEAgLTYzOCw4ICs2MzgsOSBAQAogCQkJCWJyZWFrOwogCiAJCW4tPm5leHQgPSAqaW5zOwotCQl3bWIoKTsKKwkJdGNmX3RyZWVfbG9jayh0cCk7CiAJCSppbnMgPSBuOworCQl0Y2ZfdHJlZV91bmxvY2sodHApOwogCiAJCSphcmcgPSAodW5zaWduZWQgbG9uZyluOwogCQlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9zY2hfc2ZxLmMgYi9uZXQvc2NoZWQvc2NoX3NmcS5jCmluZGV4IGYzOTY1ZGYuLjMzMTMzZDIgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9zY2hfc2ZxLmMKKysrIGIvbmV0L3NjaGVkL3NjaF9zZnEuYwpAQCAtNDM1LDcgKzQzNSw3IEBACiAJaW50IGk7CiAKIAlxLT5wZXJ0dXJiX3RpbWVyLmZ1bmN0aW9uID0gc2ZxX3BlcnR1cmJhdGlvbjsKLQlxLT5wZXJ0dXJiX3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZylzY2g7OworCXEtPnBlcnR1cmJfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKXNjaDsKIAlpbml0X3RpbWVyX2RlZmVycmFibGUoJnEtPnBlcnR1cmJfdGltZXIpOwogCiAJZm9yIChpID0gMDsgaSA8IFNGUV9IQVNIX0RJVklTT1I7IGkrKykKZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9zY2hfdGVxbC5jIGIvbmV0L3NjaGVkL3NjaF90ZXFsLmMKaW5kZXggY2ZjOGU3Yy4uZWM2OTdjZSAxMDA2NDQKLS0tIGEvbmV0L3NjaGVkL3NjaF90ZXFsLmMKKysrIGIvbmV0L3NjaGVkL3NjaF90ZXFsLmMKQEAgLTI4OSw5ICsyODksOSBAQAogCiAJZG8gewogCQlzdHJ1Y3QgbmV0X2RldmljZSAqc2xhdmUgPSBxZGlzY19kZXYocSk7Ci0JCXN0cnVjdCBuZXRkZXZfcXVldWUgKnNsYXZlX3R4cTsKKwkJc3RydWN0IG5ldGRldl9xdWV1ZSAqc2xhdmVfdHhxID0gbmV0ZGV2X2dldF90eF9xdWV1ZShzbGF2ZSwgMCk7CisJCWNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyAqc2xhdmVfb3BzID0gc2xhdmUtPm5ldGRldl9vcHM7CiAKLQkJc2xhdmVfdHhxID0gbmV0ZGV2X2dldF90eF9xdWV1ZShzbGF2ZSwgMCk7CiAJCWlmIChzbGF2ZV90eHEtPnFkaXNjX3NsZWVwaW5nICE9IHEpCiAJCQljb250aW51ZTsKIAkJaWYgKF9fbmV0aWZfc3VicXVldWVfc3RvcHBlZChzbGF2ZSwgc3VicSkgfHwKQEAgLTMwNSw3ICszMDUsNyBAQAogCQkJaWYgKF9fbmV0aWZfdHhfdHJ5bG9jayhzbGF2ZV90eHEpKSB7CiAJCQkJaWYgKCFuZXRpZl90eF9xdWV1ZV9zdG9wcGVkKHNsYXZlX3R4cSkgJiYKIAkJCQkgICAgIW5ldGlmX3R4X3F1ZXVlX2Zyb3plbihzbGF2ZV90eHEpICYmCi0JCQkJICAgIHNsYXZlLT5oYXJkX3N0YXJ0X3htaXQoc2tiLCBzbGF2ZSkgPT0gMCkgeworCQkJCSAgICBzbGF2ZV9vcHMtPm5kb19zdGFydF94bWl0KHNrYiwgc2xhdmUpID09IDApIHsKIAkJCQkJX19uZXRpZl90eF91bmxvY2soc2xhdmVfdHhxKTsKIAkJCQkJbWFzdGVyLT5zbGF2ZXMgPSBORVhUX1NMQVZFKHEpOwogCQkJCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CkBAIC00MjAsNiArNDIwLDE0IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgdGVxbF9uZXRkZXZfb3BzID0geworCS5uZG9fb3Blbgk9IHRlcWxfbWFzdGVyX29wZW4sCisJLm5kb19zdG9wCT0gdGVxbF9tYXN0ZXJfY2xvc2UsCisJLm5kb19zdGFydF94bWl0CT0gdGVxbF9tYXN0ZXJfeG1pdCwKKwkubmRvX2dldF9zdGF0cwk9IHRlcWxfbWFzdGVyX3N0YXRzLAorCS5uZG9fY2hhbmdlX210dQk9IHRlcWxfbWFzdGVyX210dSwKK307CisKIHN0YXRpYyBfX2luaXQgdm9pZCB0ZXFsX21hc3Rlcl9zZXR1cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCB0ZXFsX21hc3RlciAqbWFzdGVyID0gbmV0ZGV2X3ByaXYoZGV2KTsKQEAgLTQzNiwxMSArNDQ0LDcgQEAKIAlvcHMtPmRlc3Ryb3kJPQl0ZXFsX2Rlc3Ryb3k7CiAJb3BzLT5vd25lcgk9CVRISVNfTU9EVUxFOwogCi0JZGV2LT5vcGVuCQk9IHRlcWxfbWFzdGVyX29wZW47Ci0JZGV2LT5oYXJkX3N0YXJ0X3htaXQJPSB0ZXFsX21hc3Rlcl94bWl0OwotCWRldi0+c3RvcAkJPSB0ZXFsX21hc3Rlcl9jbG9zZTsKLQlkZXYtPmdldF9zdGF0cwkJPSB0ZXFsX21hc3Rlcl9zdGF0czsKLQlkZXYtPmNoYW5nZV9tdHUJCT0gdGVxbF9tYXN0ZXJfbXR1OworCWRldi0+bmV0ZGV2X29wcyA9ICAgICAgICZ0ZXFsX25ldGRldl9vcHM7CiAJZGV2LT50eXBlCQk9IEFSUEhSRF9WT0lEOwogCWRldi0+bXR1CQk9IDE1MDA7CiAJZGV2LT50eF9xdWV1ZV9sZW4JPSAxMDA7CmRpZmYgLS1naXQgYS9uZXQvc2N0cC9hdXRoLmMgYi9uZXQvc2N0cC9hdXRoLmMKaW5kZXggNTJkYjVmNi4uNTY5MzViYiAxMDA2NDQKLS0tIGEvbmV0L3NjdHAvYXV0aC5jCisrKyBiL25ldC9zY3RwL2F1dGguYwpAQCAtMTQxLDggKzE0MSw4IEBACiAvKiBDb21wYXJlIHR3byBieXRlIHZlY3RvcnMgYXMgbnVtYmVycy4gIFJldHVybiB2YWx1ZXMKICAqIGFyZToKICAqIAkgIDAgLSB2ZWN0b3JzIGFyZSBlcXVhbAotICogCTwgMCAtIHZlY3RvciAxIGlzIHNtYWxsZXIgdGhlbiB2ZWN0b3IyCi0gKiAJPiAwIC0gdmVjdG9yIDEgaXMgZ3JlYXRlciB0aGVuIHZlY3RvcjIKKyAqIAk8IDAgLSB2ZWN0b3IgMSBpcyBzbWFsbGVyIHRoYW4gdmVjdG9yMgorICogCT4gMCAtIHZlY3RvciAxIGlzIGdyZWF0ZXIgdGhhbiB2ZWN0b3IyCiAgKgogICogQWxnb3JpdGhtIGlzOgogICogCVRoaXMgaXMgcGVyZm9ybWVkIGJ5IHNlbGVjdGluZyB0aGUgbnVtZXJpY2FsbHkgc21hbGxlciBrZXkgdmVjdG9yLi4uCkBAIC00ODksNyArNDg5LDcgQEAKIAlyZXR1cm4gMDsKIAogb3V0X2VycjoKLQkvKiBDbGVhbiB1cCBhbnkgc3VjY2Vzc2Z1bGwgYWxsb2NhdGlvbnMgKi8KKwkvKiBDbGVhbiB1cCBhbnkgc3VjY2Vzc2Z1bCBhbGxvY2F0aW9ucyAqLwogCXNjdHBfYXV0aF9kZXN0cm95X2htYWNzKGVwLT5hdXRoX2htYWNzKTsKIAlyZXR1cm4gLUVOT01FTTsKIH0KZGlmZiAtLWdpdCBhL25ldC9zY3RwL3NtX3N0YXRlZnVucy5jIGIvbmV0L3NjdHAvc21fc3RhdGVmdW5zLmMKaW5kZXggMWM0ZTVkNi4uM2EwY2QwNyAxMDA2NDQKLS0tIGEvbmV0L3NjdHAvc21fc3RhdGVmdW5zLmMKKysrIGIvbmV0L3NjdHAvc21fc3RhdGVmdW5zLmMKQEAgLTQyNjgsOSArNDI2OCw5IEBACiAKIC8qCiAgKiBIYW5kbGUgYSBwcm90b2NvbCB2aW9sYXRpb24gd2hlbiB0aGUgY2h1bmsgbGVuZ3RoIGlzIGludmFsaWQuCi0gKiAiSW52YWxpZCIgbGVuZ3RoIGlzIGlkZW50aWZpZWQgYXMgc21hbGxlciB0aGVuIHRoZSBtaW5pbWFsIGxlbmd0aCBhCisgKiAiSW52YWxpZCIgbGVuZ3RoIGlzIGlkZW50aWZpZWQgYXMgc21hbGxlciB0aGFuIHRoZSBtaW5pbWFsIGxlbmd0aCBhCiAgKiBnaXZlbiBjaHVuayBjYW4gYmUuICBGb3IgZXhhbXBsZSwgYSBTQUNLIGNodW5rIGhhcyBpbnZhbGlkIGxlbmd0aAotICogaWYgaXQncyBsZW5ndGggaXMgc2V0IHRvIGJlIHNtYWxsZXIgdGhlbiB0aGUgc2l6ZSBvZiBzY3RwX3NhY2tfY2h1bmtfdC4KKyAqIGlmIGl0cyBsZW5ndGggaXMgc2V0IHRvIGJlIHNtYWxsZXIgdGhhbiB0aGUgc2l6ZSBvZiBzY3RwX3NhY2tfY2h1bmtfdC4KICAqCiAgKiBXZSBpbmZvcm0gdGhlIG90aGVyIGVuZCBieSBzZW5kaW5nIGFuIEFCT1JUIHdpdGggYSBQcm90b2NvbCBWaW9sYXRpb24KICAqIGVycm9yIGNvZGUuCkBAIC00MzAwLDcgKzQzMDAsNyBAQAogCiAvKgogICogSGFuZGxlIGEgcHJvdG9jb2wgdmlvbGF0aW9uIHdoZW4gdGhlIHBhcmFtZXRlciBsZW5ndGggaXMgaW52YWxpZC4KLSAqICJJbnZhbGlkIiBsZW5ndGggaXMgaWRlbnRpZmllZCBhcyBzbWFsbGVyIHRoZW4gdGhlIG1pbmltYWwgbGVuZ3RoIGEKKyAqICJJbnZhbGlkIiBsZW5ndGggaXMgaWRlbnRpZmllZCBhcyBzbWFsbGVyIHRoYW4gdGhlIG1pbmltYWwgbGVuZ3RoIGEKICAqIGdpdmVuIHBhcmFtZXRlciBjYW4gYmUuCiAgKi8KIHN0YXRpYyBzY3RwX2Rpc3Bvc2l0aW9uX3Qgc2N0cF9zZl92aW9sYXRpb25fcGFyYW1sZW4oCmRpZmYgLS1naXQgYS9uZXQvc2N0cC9zb2NrZXQuYyBiL25ldC9zY3RwL3NvY2tldC5jCmluZGV4IGIxNGE4ZjMuLmZmMGE4ZjggMTAwNjQ0Ci0tLSBhL25ldC9zY3RwL3NvY2tldC5jCisrKyBiL25ldC9zY3RwL3NvY2tldC5jCkBAIC0yNzE3LDcgKzI3MTcsNyBAQAogCQkJCXBhdGhzKys7CiAJCQl9CiAKLQkJCS8qIE9ubHkgdmFsaWRhdGUgYXNvY21heHJ4dCBpZiB3ZSBoYXZlIG1vcmUgdGhlbgorCQkJLyogT25seSB2YWxpZGF0ZSBhc29jbWF4cnh0IGlmIHdlIGhhdmUgbW9yZSB0aGFuCiAJCQkgKiBvbmUgcGF0aC90cmFuc3BvcnQuICBXZSBkbyB0aGlzIGJlY2F1c2UgcGF0aAogCQkJICogcmV0cmFuc21pc3Npb25zIGFyZSBvbmx5IGNvdW50ZWQgd2hlbiB3ZSBoYXZlIG1vcmUKIAkJCSAqIHRoZW4gb25lIHBhdGguCmRpZmYgLS1naXQgYS9uZXQvc2N0cC90c25tYXAuYyBiL25ldC9zY3RwL3Rzbm1hcC5jCmluZGV4IDM1YzczZTguLjliZDY0NTYgMTAwNjQ0Ci0tLSBhL25ldC9zY3RwL3Rzbm1hcC5jCisrKyBiL25ldC9zY3RwL3Rzbm1hcC5jCkBAIC0yMjcsNyArMjI3LDcgQEAKIAkJICovCiAJCWJpdG1hcF96ZXJvKG1hcC0+dHNuX21hcCwgbWFwLT5sZW4pOwogCX0gZWxzZSB7Ci0JCS8qIElmIHRoZSBnYXAgaXMgc21hbGxlciB0aGVuIHRoZSBtYXAgc2l6ZSwKKwkJLyogSWYgdGhlIGdhcCBpcyBzbWFsbGVyIHRoYW4gdGhlIG1hcCBzaXplLAogCQkgKiBzaGlmdCB0aGUgbWFwIGJ5ICdnYXAnIGJpdHMgYW5kIHVwZGF0ZSBmdXJ0aGVyLgogCQkgKi8KIAkJYml0bWFwX3NoaWZ0X3JpZ2h0KG1hcC0+dHNuX21hcCwgbWFwLT50c25fbWFwLCBnYXAsIG1hcC0+bGVuKTsKZGlmZiAtLWdpdCBhL25ldC9zdW5ycGMvY2FjaGUuYyBiL25ldC9zdW5ycGMvY2FjaGUuYwppbmRleCBjOTk2NjcxLi40NzM1Y2FhIDEwMDY0NAotLS0gYS9uZXQvc3VucnBjL2NhY2hlLmMKKysrIGIvbmV0L3N1bnJwYy9jYWNoZS5jCkBAIC05OCw3ICs5OCw3IEBACiAKIAlyZXR1cm4gbmV3OwogfQotRVhQT1JUX1NZTUJPTChzdW5ycGNfY2FjaGVfbG9va3VwKTsKK0VYUE9SVF9TWU1CT0xfR1BMKHN1bnJwY19jYWNoZV9sb29rdXApOwogCiAKIHN0YXRpYyB2b2lkIHF1ZXVlX2xvb3NlKHN0cnVjdCBjYWNoZV9kZXRhaWwgKmRldGFpbCwgc3RydWN0IGNhY2hlX2hlYWQgKmNoKTsKQEAgLTE3Myw3ICsxNzMsNyBAQAogCWNhY2hlX3B1dChvbGQsIGRldGFpbCk7CiAJcmV0dXJuIHRtcDsKIH0KLUVYUE9SVF9TWU1CT0woc3VucnBjX2NhY2hlX3VwZGF0ZSk7CitFWFBPUlRfU1lNQk9MX0dQTChzdW5ycGNfY2FjaGVfdXBkYXRlKTsKIAogc3RhdGljIGludCBjYWNoZV9tYWtlX3VwY2FsbChzdHJ1Y3QgY2FjaGVfZGV0YWlsICpkZXRhaWwsIHN0cnVjdCBjYWNoZV9oZWFkICpoKTsKIC8qCkBAIC0yNDUsNyArMjQ1LDcgQEAKIAkJY2FjaGVfcHV0KGgsIGRldGFpbCk7CiAJcmV0dXJuIHJ2OwogfQotRVhQT1JUX1NZTUJPTChjYWNoZV9jaGVjayk7CitFWFBPUlRfU1lNQk9MX0dQTChjYWNoZV9jaGVjayk7CiAKIC8qCiAgKiBjYWNoZXMgbmVlZCB0byBiZSBwZXJpb2RpY2FsbHkgY2xlYW5lZC4KQEAgLTM3Myw3ICszNzMsNyBAQAogCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmY2FjaGVfY2xlYW5lciwgMCk7CiAJcmV0dXJuIDA7CiB9Ci1FWFBPUlRfU1lNQk9MKGNhY2hlX3JlZ2lzdGVyKTsKK0VYUE9SVF9TWU1CT0xfR1BMKGNhY2hlX3JlZ2lzdGVyKTsKIAogdm9pZCBjYWNoZV91bnJlZ2lzdGVyKHN0cnVjdCBjYWNoZV9kZXRhaWwgKmNkKQogewpAQCAtMzk5LDcgKzM5OSw3IEBACiBvdXQ6CiAJcHJpbnRrKEtFUk5fRVJSICJuZnNkOiBmYWlsZWQgdG8gdW5yZWdpc3RlciAlcyBjYWNoZVxuIiwgY2QtPm5hbWUpOwogfQotRVhQT1JUX1NZTUJPTChjYWNoZV91bnJlZ2lzdGVyKTsKK0VYUE9SVF9TWU1CT0xfR1BMKGNhY2hlX3VucmVnaXN0ZXIpOwogCiAvKiBjbGVhbiBjYWNoZSB0cmllcyB0byBmaW5kIHNvbWV0aGluZyB0byBjbGVhbgogICogYW5kIGNsZWFucyBpdC4KQEAgLTUxNCw3ICs1MTQsNyBAQAogCXdoaWxlIChjYWNoZV9jbGVhbigpICE9IC0xKQogCQljb25kX3Jlc2NoZWQoKTsKIH0KLUVYUE9SVF9TWU1CT0woY2FjaGVfZmx1c2gpOworRVhQT1JUX1NZTUJPTF9HUEwoY2FjaGVfZmx1c2gpOwogCiB2b2lkIGNhY2hlX3B1cmdlKHN0cnVjdCBjYWNoZV9kZXRhaWwgKmRldGFpbCkKIHsKQEAgLTUyMyw3ICs1MjMsNyBAQAogCWNhY2hlX2ZsdXNoKCk7CiAJZGV0YWlsLT5mbHVzaF90aW1lID0gMTsKIH0KLUVYUE9SVF9TWU1CT0woY2FjaGVfcHVyZ2UpOworRVhQT1JUX1NZTUJPTF9HUEwoY2FjaGVfcHVyZ2UpOwogCiAKIC8qCkBAIC05ODgsNyArOTg4LDcgQEAKIAkqYnBwID0gYnA7CiAJKmxwID0gbGVuOwogfQotRVhQT1JUX1NZTUJPTChxd29yZF9hZGQpOworRVhQT1JUX1NZTUJPTF9HUEwocXdvcmRfYWRkKTsKIAogdm9pZCBxd29yZF9hZGRoZXgoY2hhciAqKmJwcCwgaW50ICpscCwgY2hhciAqYnVmLCBpbnQgYmxlbikKIHsKQEAgLTEwMTcsNyArMTAxNyw3IEBACiAJKmJwcCA9IGJwOwogCSpscCA9IGxlbjsKIH0KLUVYUE9SVF9TWU1CT0wocXdvcmRfYWRkaGV4KTsKK0VYUE9SVF9TWU1CT0xfR1BMKHF3b3JkX2FkZGhleCk7CiAKIHN0YXRpYyB2b2lkIHdhcm5fbm9fbGlzdGVuZXIoc3RydWN0IGNhY2hlX2RldGFpbCAqZGV0YWlsKQogewpAQCAtMTE0MCw3ICsxMTQwLDcgQEAKIAkqZGVzdCA9ICdcMCc7CiAJcmV0dXJuIGxlbjsKIH0KLUVYUE9SVF9TWU1CT0wocXdvcmRfZ2V0KTsKK0VYUE9SVF9TWU1CT0xfR1BMKHF3b3JkX2dldCk7CiAKIAogLyoKZGlmZiAtLWdpdCBhL25ldC9zdW5ycGMvcnBjX3BpcGUuYyBiL25ldC9zdW5ycGMvcnBjX3BpcGUuYwppbmRleCAxOTI0NTMyLi41NzczODVhIDEwMDY0NAotLS0gYS9uZXQvc3VucnBjL3JwY19waXBlLmMKKysrIGIvbmV0L3N1bnJwYy9ycGNfcGlwZS5jCkBAIC01MjIsOCArNTIyLDYgQEAKIAlpZiAoIWlub2RlKQogCQlyZXR1cm4gTlVMTDsKIAlpbm9kZS0+aV9tb2RlID0gbW9kZTsKLQlpbm9kZS0+aV91aWQgPSBpbm9kZS0+aV9naWQgPSAwOwotCWlub2RlLT5pX2Jsb2NrcyA9IDA7CiAJaW5vZGUtPmlfYXRpbWUgPSBpbm9kZS0+aV9tdGltZSA9IGlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FOwogCXN3aXRjaChtb2RlICYgU19JRk1UKSB7CiAJCWNhc2UgU19JRkRJUjoKZGlmZiAtLWdpdCBhL25ldC9zdW5ycGMvc3RhdHMuYyBiL25ldC9zdW5ycGMvc3RhdHMuYwppbmRleCA1MGIwNDljLi4wODUzNzJlIDEwMDY0NAotLS0gYS9uZXQvc3VucnBjL3N0YXRzLmMKKysrIGIvbmV0L3N1bnJwYy9zdGF0cy5jCkBAIC0xMDYsNyArMTA2LDcgQEAKIAkJc2VxX3B1dGMoc2VxLCAnXG4nKTsKIAl9CiB9Ci1FWFBPUlRfU1lNQk9MKHN2Y19zZXFfc2hvdyk7CitFWFBPUlRfU1lNQk9MX0dQTChzdmNfc2VxX3Nob3cpOwogCiAvKioKICAqIHJwY19hbGxvY19pb3N0YXRzIC0gYWxsb2NhdGUgYW4gcnBjX2lvc3RhdHMgc3RydWN0dXJlCkBAIC0yNDksMTQgKzI0OSwxNCBAQAogewogCXJldHVybiBkb19yZWdpc3RlcihzdGF0cC0+cHJvZ3JhbS0+cGdfbmFtZSwgc3RhdHAsIGZvcHMpOwogfQotRVhQT1JUX1NZTUJPTChzdmNfcHJvY19yZWdpc3Rlcik7CitFWFBPUlRfU1lNQk9MX0dQTChzdmNfcHJvY19yZWdpc3Rlcik7CiAKIHZvaWQKIHN2Y19wcm9jX3VucmVnaXN0ZXIoY29uc3QgY2hhciAqbmFtZSkKIHsKIAlyZW1vdmVfcHJvY19lbnRyeShuYW1lLCBwcm9jX25ldF9ycGMpOwogfQotRVhQT1JUX1NZTUJPTChzdmNfcHJvY191bnJlZ2lzdGVyKTsKK0VYUE9SVF9TWU1CT0xfR1BMKHN2Y19wcm9jX3VucmVnaXN0ZXIpOwogCiB2b2lkCiBycGNfcHJvY19pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9uZXQvc3VucnBjL3N2Yy5jIGIvbmV0L3N1bnJwYy9zdmMuYwppbmRleCA1NGM5OGQ4Li5jNTFmZWQ0IDEwMDY0NAotLS0gYS9uZXQvc3VucnBjL3N2Yy5jCisrKyBiL25ldC9zdW5ycGMvc3ZjLmMKQEAgLTQzMSw3ICs0MzEsNyBAQAogewogCXJldHVybiBfX3N2Y19jcmVhdGUocHJvZywgYnVmc2l6ZSwgLypucG9vbHMqLzEsIGZhbWlseSwgc2h1dGRvd24pOwogfQotRVhQT1JUX1NZTUJPTChzdmNfY3JlYXRlKTsKK0VYUE9SVF9TWU1CT0xfR1BMKHN2Y19jcmVhdGUpOwogCiBzdHJ1Y3Qgc3ZjX3NlcnYgKgogc3ZjX2NyZWF0ZV9wb29sZWQoc3RydWN0IHN2Y19wcm9ncmFtICpwcm9nLCB1bnNpZ25lZCBpbnQgYnVmc2l6ZSwKQEAgLTQ1MCw3ICs0NTAsNyBAQAogCiAJcmV0dXJuIHNlcnY7CiB9Ci1FWFBPUlRfU1lNQk9MKHN2Y19jcmVhdGVfcG9vbGVkKTsKK0VYUE9SVF9TWU1CT0xfR1BMKHN2Y19jcmVhdGVfcG9vbGVkKTsKIAogLyoKICAqIERlc3Ryb3kgYW4gUlBDIHNlcnZpY2UuIFNob3VsZCBiZSBjYWxsZWQgd2l0aCBhcHByb3ByaWF0ZSBsb2NraW5nIHRvCkBAIC00OTIsNyArNDkyLDcgQEAKIAlrZnJlZShzZXJ2LT5zdl9wb29scyk7CiAJa2ZyZWUoc2Vydik7CiB9Ci1FWFBPUlRfU1lNQk9MKHN2Y19kZXN0cm95KTsKK0VYUE9SVF9TWU1CT0xfR1BMKHN2Y19kZXN0cm95KTsKIAogLyoKICAqIEFsbG9jYXRlIGFuIFJQQyBzZXJ2ZXIncyBidWZmZXIgc3BhY2UuCkBAIC01NjcsNyArNTY3LDcgQEAKIG91dF9lbm9tZW06CiAJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiB9Ci1FWFBPUlRfU1lNQk9MKHN2Y19wcmVwYXJlX3RocmVhZCk7CitFWFBPUlRfU1lNQk9MX0dQTChzdmNfcHJlcGFyZV90aHJlYWQpOwogCiAvKgogICogQ2hvb3NlIGEgcG9vbCBpbiB3aGljaCB0byBjcmVhdGUgYSBuZXcgdGhyZWFkLCBmb3Igc3ZjX3NldF9udW1fdGhyZWFkcwpAQCAtNjg5LDcgKzY4OSw3IEBACiAKIAlyZXR1cm4gZXJyb3I7CiB9Ci1FWFBPUlRfU1lNQk9MKHN2Y19zZXRfbnVtX3RocmVhZHMpOworRVhQT1JUX1NZTUJPTF9HUEwoc3ZjX3NldF9udW1fdGhyZWFkcyk7CiAKIC8qCiAgKiBDYWxsZWQgZnJvbSBhIHNlcnZlciB0aHJlYWQgYXMgaXQncyBleGl0aW5nLiBDYWxsZXIgbXVzdCBob2xkIHRoZSBCS0wgb3IKQEAgLTcxNyw3ICs3MTcsNyBAQAogCWlmIChzZXJ2KQogCQlzdmNfZGVzdHJveShzZXJ2KTsKIH0KLUVYUE9SVF9TWU1CT0woc3ZjX2V4aXRfdGhyZWFkKTsKK0VYUE9SVF9TWU1CT0xfR1BMKHN2Y19leGl0X3RocmVhZCk7CiAKICNpZmRlZiBDT05GSUdfU1VOUlBDX1JFR0lTVEVSX1Y0CiAKQEAgLTEyMzEsNyArMTIzMSw3IEBACiAJc3ZjX3B1dG5sKHJlc3YsIG50b2hsKHJwY19zdGF0KSk7CiAJZ290byBzZW5kaXQ7CiB9Ci1FWFBPUlRfU1lNQk9MKHN2Y19wcm9jZXNzKTsKK0VYUE9SVF9TWU1CT0xfR1BMKHN2Y19wcm9jZXNzKTsKIAogLyoKICAqIFJldHVybiAodHJhbnNwb3J0LXNwZWNpZmljKSBsaW1pdCBvbiB0aGUgcnBjIHBheWxvYWQuCmRpZmYgLS1naXQgYS9uZXQvc3VucnBjL3N2Y194cHJ0LmMgYi9uZXQvc3VucnBjL3N2Y194cHJ0LmMKaW5kZXggYmY1YjVjZC4uZTU4OGRmNSAxMDA2NDQKLS0tIGEvbmV0L3N1bnJwYy9zdmNfeHBydC5jCisrKyBiL25ldC9zdW5ycGMvc3ZjX3hwcnQuYwpAQCAtNDQwLDcgKzQ0MCw3IEBACiAJCXN2Y194cHJ0X2VucXVldWUoeHBydCk7CiAJfQogfQotRVhQT1JUX1NZTUJPTChzdmNfcmVzZXJ2ZSk7CitFWFBPUlRfU1lNQk9MX0dQTChzdmNfcmVzZXJ2ZSk7CiAKIHN0YXRpYyB2b2lkIHN2Y194cHJ0X3JlbGVhc2Uoc3RydWN0IHN2Y19ycXN0ICpycXN0cCkKIHsKQEAgLTQ0OCw2ICs0NDgsOSBAQAogCiAJcnFzdHAtPnJxX3hwcnQtPnhwdF9vcHMtPnhwb19yZWxlYXNlX3Jxc3QocnFzdHApOwogCisJa2ZyZWUocnFzdHAtPnJxX2RlZmVycmVkKTsKKwlycXN0cC0+cnFfZGVmZXJyZWQgPSBOVUxMOworCiAJc3ZjX2ZyZWVfcmVzX3BhZ2VzKHJxc3RwKTsKIAlycXN0cC0+cnFfcmVzLnBhZ2VfbGVuID0gMDsKIAlycXN0cC0+cnFfcmVzLnBhZ2VfYmFzZSA9IDA7CkBAIC00OTgsNyArNTAxLDcgQEAKIAkJc3Bpbl91bmxvY2tfYmgoJnBvb2wtPnNwX2xvY2spOwogCX0KIH0KLUVYUE9SVF9TWU1CT0woc3ZjX3dha2VfdXApOworRVhQT1JUX1NZTUJPTF9HUEwoc3ZjX3dha2VfdXApOwogCiBpbnQgc3ZjX3BvcnRfaXNfcHJpdmlsZWdlZChzdHJ1Y3Qgc29ja2FkZHIgKnNpbikKIHsKQEAgLTUxNSw4ICs1MTgsMTAgQEAKIH0KIAogLyoKLSAqIE1ha2Ugc3VyZSB0aGF0IHdlIGRvbid0IGhhdmUgdG9vIG1hbnkgYWN0aXZlIGNvbm5lY3Rpb25zLiAgSWYgd2UKLSAqIGhhdmUsIHNvbWV0aGluZyBtdXN0IGJlIGRyb3BwZWQuCisgKiBNYWtlIHN1cmUgdGhhdCB3ZSBkb24ndCBoYXZlIHRvbyBtYW55IGFjdGl2ZSBjb25uZWN0aW9ucy4gSWYgd2UgaGF2ZSwKKyAqIHNvbWV0aGluZyBtdXN0IGJlIGRyb3BwZWQuIEl0J3Mgbm90IGNsZWFyIHdoYXQgd2lsbCBoYXBwZW4gaWYgd2UgYWxsb3cKKyAqICJ0b28gbWFueSIgY29ubmVjdGlvbnMsIGJ1dCB3aGVuIGRlYWxpbmcgd2l0aCBuZXR3b3JrLWZhY2luZyBzb2Z0d2FyZSwKKyAqIHdlIGhhdmUgdG8gY29kZSBkZWZlbnNpdmVseS4gSGVyZSB3ZSBkbyB0aGF0IGJ5IGltcG9zaW5nIGhhcmQgbGltaXRzLgogICoKICAqIFRoZXJlJ3Mgbm8gcG9pbnQgaW4gdHJ5aW5nIHRvIGRvIHJhbmRvbSBkcm9wIGhlcmUgZm9yIERvUwogICogcHJldmVudGlvbi4gVGhlIE5GUyBjbGllbnRzIGRvZXMgMSByZWNvbm5lY3QgaW4gMTUgc2Vjb25kcy4gQW4KQEAgLTUyNSwxOSArNTMwLDI3IEBACiAgKiBUaGUgb25seSBzb21ld2hhdCBlZmZpY2llbnQgbWVjaGFuaXNtIHdvdWxkIGJlIGlmIGRyb3Agb2xkCiAgKiBjb25uZWN0aW9ucyBmcm9tIHRoZSBzYW1lIElQIGZpcnN0LiBCdXQgcmlnaHQgbm93IHdlIGRvbid0IGV2ZW4KICAqIHJlY29yZCB0aGUgY2xpZW50IElQIGluIHN2Y19zb2NrLgorICoKKyAqIHNpbmdsZS10aHJlYWRlZCBzZXJ2aWNlcyB0aGF0IGV4cGVjdCBhIGxvdCBvZiBjbGllbnRzIHdpbGwgcHJvYmFibHkKKyAqIG5lZWQgdG8gc2V0IHN2X21heGNvbm4gdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgdmFsdWUgd2hpY2ggaXMgYmFzZWQKKyAqIG9uIHRoZSBudW1iZXIgb2YgdGhyZWFkcwogICovCiBzdGF0aWMgdm9pZCBzdmNfY2hlY2tfY29ubl9saW1pdHMoc3RydWN0IHN2Y19zZXJ2ICpzZXJ2KQogewotCWlmIChzZXJ2LT5zdl90bXBjbnQgPiAoc2Vydi0+c3ZfbnJ0aHJlYWRzKzMpKjIwKSB7CisJdW5zaWduZWQgaW50IGxpbWl0ID0gc2Vydi0+c3ZfbWF4Y29ubiA/IHNlcnYtPnN2X21heGNvbm4gOgorCQkJCShzZXJ2LT5zdl9ucnRocmVhZHMrMykgKiAyMDsKKworCWlmIChzZXJ2LT5zdl90bXBjbnQgPiBsaW1pdCkgewogCQlzdHJ1Y3Qgc3ZjX3hwcnQgKnhwcnQgPSBOVUxMOwogCQlzcGluX2xvY2tfYmgoJnNlcnYtPnN2X2xvY2spOwogCQlpZiAoIWxpc3RfZW1wdHkoJnNlcnYtPnN2X3RlbXBzb2NrcykpIHsKIAkJCWlmIChuZXRfcmF0ZWxpbWl0KCkpIHsKIAkJCQkvKiBUcnkgdG8gaGVscCB0aGUgYWRtaW4gKi8KIAkJCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiB0b28gbWFueSBvcGVuICAiCi0JCQkJICAgICAgICJjb25uZWN0aW9ucywgY29uc2lkZXIgaW5jcmVhc2luZyB0aGUgIgotCQkJCSAgICAgICAibnVtYmVyIG9mIG5mc2QgdGhyZWFkc1xuIiwKLQkJCQkgICAgICAgc2Vydi0+c3ZfbmFtZSk7CisJCQkJICAgICAgICJjb25uZWN0aW9ucywgY29uc2lkZXIgaW5jcmVhc2luZyAlc1xuIiwKKwkJCQkgICAgICAgc2Vydi0+c3ZfbmFtZSwgc2Vydi0+c3ZfbWF4Y29ubiA/CisJCQkJICAgICAgICJ0aGUgbWF4IG51bWJlciBvZiBjb25uZWN0aW9ucy4iIDoKKwkJCQkgICAgICAgInRoZSBudW1iZXIgb2YgdGhyZWFkcy4iKTsKIAkJCX0KIAkJCS8qCiAJCQkgKiBBbHdheXMgc2VsZWN0IHRoZSBvbGRlc3QgY29ubmVjdGlvbi4gSXQncyBub3QgZmFpciwKQEAgLTczMCw3ICs3NDMsNyBAQAogCQlzZXJ2LT5zdl9zdGF0cy0+bmV0Y250Kys7CiAJcmV0dXJuIGxlbjsKIH0KLUVYUE9SVF9TWU1CT0woc3ZjX3JlY3YpOworRVhQT1JUX1NZTUJPTF9HUEwoc3ZjX3JlY3YpOwogCiAvKgogICogRHJvcCByZXF1ZXN0CkBAIC03NDAsNyArNzUzLDcgQEAKIAlkcHJpbnRrKCJzdmM6IHhwcnQgJXAgZHJvcHBlZCByZXF1ZXN0XG4iLCBycXN0cC0+cnFfeHBydCk7CiAJc3ZjX3hwcnRfcmVsZWFzZShycXN0cCk7CiB9Ci1FWFBPUlRfU1lNQk9MKHN2Y19kcm9wKTsKK0VYUE9SVF9TWU1CT0xfR1BMKHN2Y19kcm9wKTsKIAogLyoKICAqIFJldHVybiByZXBseSB0byBjbGllbnQuCkBAIC04MzcsNiArODUwLDExIEBACiB2b2lkIHN2Y19kZWxldGVfeHBydChzdHJ1Y3Qgc3ZjX3hwcnQgKnhwcnQpCiB7CiAJc3RydWN0IHN2Y19zZXJ2CSpzZXJ2ID0geHBydC0+eHB0X3NlcnZlcjsKKwlzdHJ1Y3Qgc3ZjX2RlZmVycmVkX3JlcSAqZHI7CisKKwkvKiBPbmx5IGRvIHRoaXMgb25jZSAqLworCWlmICh0ZXN0X2FuZF9zZXRfYml0KFhQVF9ERUFELCAmeHBydC0+eHB0X2ZsYWdzKSkKKwkJcmV0dXJuOwogCiAJZHByaW50aygic3ZjOiBzdmNfZGVsZXRlX3hwcnQoJXApXG4iLCB4cHJ0KTsKIAl4cHJ0LT54cHRfb3BzLT54cG9fZGV0YWNoKHhwcnQpOwpAQCAtODUxLDEyICs4NjksMTYgQEAKIAkgKiB3aGlsZSBzdGlsbCBhdHRhY2hlZCB0byBhIHF1ZXVlLCB0aGUgcXVldWUgaXRzZWxmCiAJICogaXMgYWJvdXQgdG8gYmUgZGVzdHJveWVkIChpbiBzdmNfZGVzdHJveSkuCiAJICovCi0JaWYgKCF0ZXN0X2FuZF9zZXRfYml0KFhQVF9ERUFELCAmeHBydC0+eHB0X2ZsYWdzKSkgewotCQlCVUdfT04oYXRvbWljX3JlYWQoJnhwcnQtPnhwdF9yZWYucmVmY291bnQpIDwgMik7Ci0JCWlmICh0ZXN0X2JpdChYUFRfVEVNUCwgJnhwcnQtPnhwdF9mbGFncykpCi0JCQlzZXJ2LT5zdl90bXBjbnQtLTsKKwlpZiAodGVzdF9iaXQoWFBUX1RFTVAsICZ4cHJ0LT54cHRfZmxhZ3MpKQorCQlzZXJ2LT5zdl90bXBjbnQtLTsKKworCWZvciAoZHIgPSBzdmNfZGVmZXJyZWRfZGVxdWV1ZSh4cHJ0KTsgZHI7CisJICAgICBkciA9IHN2Y19kZWZlcnJlZF9kZXF1ZXVlKHhwcnQpKSB7CiAJCXN2Y194cHJ0X3B1dCh4cHJ0KTsKKwkJa2ZyZWUoZHIpOwogCX0KKworCXN2Y194cHJ0X3B1dCh4cHJ0KTsKIAlzcGluX3VubG9ja19iaCgmc2Vydi0+c3ZfbG9jayk7CiB9CiAKQEAgLTkwMiwxNyArOTI0LDE5IEBACiAJCWNvbnRhaW5lcl9vZihkcmVxLCBzdHJ1Y3Qgc3ZjX2RlZmVycmVkX3JlcSwgaGFuZGxlKTsKIAlzdHJ1Y3Qgc3ZjX3hwcnQgKnhwcnQgPSBkci0+eHBydDsKIAotCWlmICh0b29fbWFueSkgeworCXNwaW5fbG9jaygmeHBydC0+eHB0X2xvY2spOworCXNldF9iaXQoWFBUX0RFRkVSUkVELCAmeHBydC0+eHB0X2ZsYWdzKTsKKwlpZiAodG9vX21hbnkgfHwgdGVzdF9iaXQoWFBUX0RFQUQsICZ4cHJ0LT54cHRfZmxhZ3MpKSB7CisJCXNwaW5fdW5sb2NrKCZ4cHJ0LT54cHRfbG9jayk7CisJCWRwcmludGsoInJldmlzaXQgY2FuY2VsZWRcbiIpOwogCQlzdmNfeHBydF9wdXQoeHBydCk7CiAJCWtmcmVlKGRyKTsKIAkJcmV0dXJuOwogCX0KIAlkcHJpbnRrKCJyZXZpc2l0IHF1ZXVlZFxuIik7CiAJZHItPnhwcnQgPSBOVUxMOwotCXNwaW5fbG9jaygmeHBydC0+eHB0X2xvY2spOwogCWxpc3RfYWRkKCZkci0+aGFuZGxlLnJlY2VudCwgJnhwcnQtPnhwdF9kZWZlcnJlZCk7CiAJc3Bpbl91bmxvY2soJnhwcnQtPnhwdF9sb2NrKTsKLQlzZXRfYml0KFhQVF9ERUZFUlJFRCwgJnhwcnQtPnhwdF9mbGFncyk7CiAJc3ZjX3hwcnRfZW5xdWV1ZSh4cHJ0KTsKIAlzdmNfeHBydF9wdXQoeHBydCk7CiB9CmRpZmYgLS1naXQgYS9uZXQvc3VucnBjL3N2Y2F1dGguYyBiL25ldC9zdW5ycGMvc3ZjYXV0aC5jCmluZGV4IDhhNzNjYmIuLmU2NDEwOWIgMTAwNjQ0Ci0tLSBhL25ldC9zdW5ycGMvc3ZjYXV0aC5jCisrKyBiL25ldC9zdW5ycGMvc3ZjYXV0aC5jCkBAIC01NywxMyArNTcsMTMgQEAKIAlycXN0cC0+cnFfYXV0aG9wID0gYW9wczsKIAlyZXR1cm4gYW9wcy0+YWNjZXB0KHJxc3RwLCBhdXRocCk7CiB9Ci1FWFBPUlRfU1lNQk9MKHN2Y19hdXRoZW50aWNhdGUpOworRVhQT1JUX1NZTUJPTF9HUEwoc3ZjX2F1dGhlbnRpY2F0ZSk7CiAKIGludCBzdmNfc2V0X2NsaWVudChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwKQogewogCXJldHVybiBycXN0cC0+cnFfYXV0aG9wLT5zZXRfY2xpZW50KHJxc3RwKTsKIH0KLUVYUE9SVF9TWU1CT0woc3ZjX3NldF9jbGllbnQpOworRVhQT1JUX1NZTUJPTF9HUEwoc3ZjX3NldF9jbGllbnQpOwogCiAvKiBBIHJlcXVlc3QsIHdoaWNoIHdhcyBhdXRoZW50aWNhdGVkLCBoYXMgbm93IGV4ZWN1dGVkLgogICogVGltZSB0byBmaW5hbGlzZSB0aGUgY3JlZGVudGlhbHMgYW5kIHZlcmlmaWVyCkBAIC05NSw3ICs5NSw3IEBACiAJc3Bpbl91bmxvY2soJmF1dGh0YWJfbG9jayk7CiAJcmV0dXJuIHJ2OwogfQotRVhQT1JUX1NZTUJPTChzdmNfYXV0aF9yZWdpc3Rlcik7CitFWFBPUlRfU1lNQk9MX0dQTChzdmNfYXV0aF9yZWdpc3Rlcik7CiAKIHZvaWQKIHN2Y19hdXRoX3VucmVnaXN0ZXIocnBjX2F1dGhmbGF2b3JfdCBmbGF2b3IpCkBAIC0xMDUsNyArMTA1LDcgQEAKIAkJYXV0aHRhYltmbGF2b3JdID0gTlVMTDsKIAlzcGluX3VubG9jaygmYXV0aHRhYl9sb2NrKTsKIH0KLUVYUE9SVF9TWU1CT0woc3ZjX2F1dGhfdW5yZWdpc3Rlcik7CitFWFBPUlRfU1lNQk9MX0dQTChzdmNfYXV0aF91bnJlZ2lzdGVyKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAnYXV0aF9kb21haW5zJyBhcmUgc3RvcmVkIGluIGEgaGFzaCB0YWJsZSBpbmRleGVkIGJ5IG5hbWUuCkBAIC0xMzIsNyArMTMyLDcgQEAKIAkJc3Bpbl91bmxvY2soJmF1dGhfZG9tYWluX2xvY2spOwogCX0KIH0KLUVYUE9SVF9TWU1CT0woYXV0aF9kb21haW5fcHV0KTsKK0VYUE9SVF9TWU1CT0xfR1BMKGF1dGhfZG9tYWluX3B1dCk7CiAKIHN0cnVjdCBhdXRoX2RvbWFpbiAqCiBhdXRoX2RvbWFpbl9sb29rdXAoY2hhciAqbmFtZSwgc3RydWN0IGF1dGhfZG9tYWluICpuZXcpCkBAIC0xNTcsMTAgKzE1NywxMCBAQAogCXNwaW5fdW5sb2NrKCZhdXRoX2RvbWFpbl9sb2NrKTsKIAlyZXR1cm4gbmV3OwogfQotRVhQT1JUX1NZTUJPTChhdXRoX2RvbWFpbl9sb29rdXApOworRVhQT1JUX1NZTUJPTF9HUEwoYXV0aF9kb21haW5fbG9va3VwKTsKIAogc3RydWN0IGF1dGhfZG9tYWluICphdXRoX2RvbWFpbl9maW5kKGNoYXIgKm5hbWUpCiB7CiAJcmV0dXJuIGF1dGhfZG9tYWluX2xvb2t1cChuYW1lLCBOVUxMKTsKIH0KLUVYUE9SVF9TWU1CT0woYXV0aF9kb21haW5fZmluZCk7CitFWFBPUlRfU1lNQk9MX0dQTChhdXRoX2RvbWFpbl9maW5kKTsKZGlmZiAtLWdpdCBhL25ldC9zdW5ycGMvc3ZjYXV0aF91bml4LmMgYi9uZXQvc3VucnBjL3N2Y2F1dGhfdW5peC5jCmluZGV4IDgyMjQwZTYuLjVjODY1ZTIgMTAwNjQ0Ci0tLSBhL25ldC9zdW5ycGMvc3ZjYXV0aF91bml4LmMKKysrIGIvbmV0L3N1bnJwYy9zdmNhdXRoX3VuaXguYwpAQCAtNjQsNyArNjQsNyBAQAogCQlydiA9IGF1dGhfZG9tYWluX2xvb2t1cChuYW1lLCAmbmV3LT5oKTsKIAl9CiB9Ci1FWFBPUlRfU1lNQk9MKHVuaXhfZG9tYWluX2ZpbmQpOworRVhQT1JUX1NZTUJPTF9HUEwodW5peF9kb21haW5fZmluZCk7CiAKIHN0YXRpYyB2b2lkIHN2Y2F1dGhfdW5peF9kb21haW5fcmVsZWFzZShzdHJ1Y3QgYXV0aF9kb21haW4gKmRvbSkKIHsKQEAgLTM1OCw3ICszNTgsNyBAQAogCWVsc2UKIAkJcmV0dXJuIC1FTk9NRU07CiB9Ci1FWFBPUlRfU1lNQk9MKGF1dGhfdW5peF9hZGRfYWRkcik7CitFWFBPUlRfU1lNQk9MX0dQTChhdXRoX3VuaXhfYWRkX2FkZHIpOwogCiBpbnQgYXV0aF91bml4X2ZvcmdldF9vbGQoc3RydWN0IGF1dGhfZG9tYWluICpkb20pCiB7CkBAIC0zNzAsNyArMzcwLDcgQEAKIAl1ZG9tLT5hZGRyX2NoYW5nZXMrKzsKIAlyZXR1cm4gMDsKIH0KLUVYUE9SVF9TWU1CT0woYXV0aF91bml4X2ZvcmdldF9vbGQpOworRVhQT1JUX1NZTUJPTF9HUEwoYXV0aF91bml4X2ZvcmdldF9vbGQpOwogCiBzdHJ1Y3QgYXV0aF9kb21haW4gKmF1dGhfdW5peF9sb29rdXAoc3RydWN0IGluNl9hZGRyICphZGRyKQogewpAQCAtMzk1LDEzICszOTUsMTMgQEAKIAljYWNoZV9wdXQoJmlwbS0+aCwgJmlwX21hcF9jYWNoZSk7CiAJcmV0dXJuIHJ2OwogfQotRVhQT1JUX1NZTUJPTChhdXRoX3VuaXhfbG9va3VwKTsKK0VYUE9SVF9TWU1CT0xfR1BMKGF1dGhfdW5peF9sb29rdXApOwogCiB2b2lkIHN2Y2F1dGhfdW5peF9wdXJnZSh2b2lkKQogewogCWNhY2hlX3B1cmdlKCZpcF9tYXBfY2FjaGUpOwogfQotRVhQT1JUX1NZTUJPTChzdmNhdXRoX3VuaXhfcHVyZ2UpOworRVhQT1JUX1NZTUJPTF9HUEwoc3ZjYXV0aF91bml4X3B1cmdlKTsKIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgaXBfbWFwICoKIGlwX21hcF9jYWNoZWRfZ2V0KHN0cnVjdCBzdmNfcnFzdCAqcnFzdHApCkBAIC03MTQsNyArNzE0LDcgQEAKIAlyZXR1cm4gU1ZDX09LOwogfQogCi1FWFBPUlRfU1lNQk9MKHN2Y2F1dGhfdW5peF9zZXRfY2xpZW50KTsKK0VYUE9SVF9TWU1CT0xfR1BMKHN2Y2F1dGhfdW5peF9zZXRfY2xpZW50KTsKIAogc3RhdGljIGludAogc3ZjYXV0aF9udWxsX2FjY2VwdChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBfX2JlMzIgKmF1dGhwKQpkaWZmIC0tZ2l0IGEvbmV0L3N1bnJwYy9zdmNzb2NrLmMgYi9uZXQvc3VucnBjL3N2Y3NvY2suYwppbmRleCBlZjMyMzhkLi41NzYzZTY0IDEwMDY0NAotLS0gYS9uZXQvc3VucnBjL3N2Y3NvY2suYworKysgYi9uZXQvc3VucnBjL3N2Y3NvY2suYwpAQCAtNTksNiArNTksNyBAQAogc3RhdGljIGludAkJc3ZjX3VkcF9yZWN2ZnJvbShzdHJ1Y3Qgc3ZjX3Jxc3QgKik7CiBzdGF0aWMgaW50CQlzdmNfdWRwX3NlbmR0byhzdHJ1Y3Qgc3ZjX3Jxc3QgKik7CiBzdGF0aWMgdm9pZAkJc3ZjX3NvY2tfZGV0YWNoKHN0cnVjdCBzdmNfeHBydCAqKTsKK3N0YXRpYyB2b2lkCQlzdmNfdGNwX3NvY2tfZGV0YWNoKHN0cnVjdCBzdmNfeHBydCAqKTsKIHN0YXRpYyB2b2lkCQlzdmNfc29ja19mcmVlKHN0cnVjdCBzdmNfeHBydCAqKTsKIAogc3RhdGljIHN0cnVjdCBzdmNfeHBydCAqc3ZjX2NyZWF0ZV9zb2NrZXQoc3RydWN0IHN2Y19zZXJ2ICosIGludCwKQEAgLTEwMiw3ICsxMDMsNiBAQAogc3RhdGljIHZvaWQgc3ZjX3JlbGVhc2Vfc2tiKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHApCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHJxc3RwLT5ycV94cHJ0X2N0eHQ7Ci0Jc3RydWN0IHN2Y19kZWZlcnJlZF9yZXEgKmRyID0gcnFzdHAtPnJxX2RlZmVycmVkOwogCiAJaWYgKHNrYikgewogCQlzdHJ1Y3Qgc3ZjX3NvY2sgKnN2c2sgPQpAQCAtMTEyLDEwICsxMTIsNiBAQAogCQlkcHJpbnRrKCJzdmM6IHNlcnZpY2UgJXAsIHJlbGVhc2luZyBza2IgJXBcbiIsIHJxc3RwLCBza2IpOwogCQlza2JfZnJlZV9kYXRhZ3JhbShzdnNrLT5za19zaywgc2tiKTsKIAl9Ci0JaWYgKGRyKSB7Ci0JCXJxc3RwLT5ycV9kZWZlcnJlZCA9IE5VTEw7Ci0JCWtmcmVlKGRyKTsKLQl9CiB9CiAKIHVuaW9uIHN2Y19wa3RpbmZvX3UgewpAQCAtMjg5LDcgKzI4NSw3IEBACiAJCXJldHVybiAtRU5PRU5UOwogCXJldHVybiBsZW47CiB9Ci1FWFBPUlRfU1lNQk9MKHN2Y19zb2NrX25hbWVzKTsKK0VYUE9SVF9TWU1CT0xfR1BMKHN2Y19zb2NrX25hbWVzKTsKIAogLyoKICAqIENoZWNrIGlucHV0IHF1ZXVlIGxlbmd0aApAQCAtMTAxNyw3ICsxMDEzLDcgQEAKIAkueHBvX3JlY3Zmcm9tID0gc3ZjX3RjcF9yZWN2ZnJvbSwKIAkueHBvX3NlbmR0byA9IHN2Y190Y3Bfc2VuZHRvLAogCS54cG9fcmVsZWFzZV9ycXN0ID0gc3ZjX3JlbGVhc2Vfc2tiLAotCS54cG9fZGV0YWNoID0gc3ZjX3NvY2tfZGV0YWNoLAorCS54cG9fZGV0YWNoID0gc3ZjX3RjcF9zb2NrX2RldGFjaCwKIAkueHBvX2ZyZWUgPSBzdmNfc29ja19mcmVlLAogCS54cG9fcHJlcF9yZXBseV9oZHIgPSBzdmNfdGNwX3ByZXBfcmVwbHlfaGRyLAogCS54cG9faGFzX3dzcGFjZSA9IHN2Y190Y3BfaGFzX3dzcGFjZSwKQEAgLTExMDEsNyArMTA5Nyw3IEBACiAJfQogCXNwaW5fdW5sb2NrX2JoKCZzZXJ2LT5zdl9sb2NrKTsKIH0KLUVYUE9SVF9TWU1CT0woc3ZjX3NvY2tfdXBkYXRlX2J1ZnMpOworRVhQT1JUX1NZTUJPTF9HUEwoc3ZjX3NvY2tfdXBkYXRlX2J1ZnMpOwogCiAvKgogICogSW5pdGlhbGl6ZSBzb2NrZXQgZm9yIFJQQyB1c2UgYW5kIGNyZWF0ZSBzdmNfc29jayBzdHJ1Y3QKQEAgLTEyODcsNiArMTI4MywyNCBAQAogCXNrLT5za19zdGF0ZV9jaGFuZ2UgPSBzdnNrLT5za19vc3RhdGU7CiAJc2stPnNrX2RhdGFfcmVhZHkgPSBzdnNrLT5za19vZGF0YTsKIAlzay0+c2tfd3JpdGVfc3BhY2UgPSBzdnNrLT5za19vd3NwYWNlOworCisJaWYgKHNrLT5za19zbGVlcCAmJiB3YWl0cXVldWVfYWN0aXZlKHNrLT5za19zbGVlcCkpCisJCXdha2VfdXBfaW50ZXJydXB0aWJsZShzay0+c2tfc2xlZXApOworfQorCisvKgorICogRGlzY29ubmVjdCB0aGUgc29ja2V0LCBhbmQgcmVzZXQgdGhlIGNhbGxiYWNrcworICovCitzdGF0aWMgdm9pZCBzdmNfdGNwX3NvY2tfZGV0YWNoKHN0cnVjdCBzdmNfeHBydCAqeHBydCkKK3sKKwlzdHJ1Y3Qgc3ZjX3NvY2sgKnN2c2sgPSBjb250YWluZXJfb2YoeHBydCwgc3RydWN0IHN2Y19zb2NrLCBza194cHJ0KTsKKworCWRwcmludGsoInN2Yzogc3ZjX3RjcF9zb2NrX2RldGFjaCglcClcbiIsIHN2c2spOworCisJc3ZjX3NvY2tfZGV0YWNoKHhwcnQpOworCisJaWYgKCF0ZXN0X2JpdChYUFRfTElTVEVORVIsICZ4cHJ0LT54cHRfZmxhZ3MpKQorCQlrZXJuZWxfc29ja19zaHV0ZG93bihzdnNrLT5za19zb2NrLCBTSFVUX1JEV1IpOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvbmV0L3dpbWF4L0tjb25maWcgYi9uZXQvd2ltYXgvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODQ5NWNkCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L3dpbWF4L0tjb25maWcKQEAgLTAsMCArMSw1MiBAQAorIworIyBXaU1BWCBMQU4gZGV2aWNlIGNvbmZpZ3VyYXRpb24KKyMKKyMgTm90ZSB0aGUgdWdseSAnZGVwZW5kcyBvbicgb24gV0lNQVg6IHRoYXQgZGlzYWxsb3dzIFJGS0lMTCB0byBiZSBhCisjIG1vZHVsZSBpZiBXSU1BWCBpcyB0byBiZSBsaW5rZWQgaW4uIFRoZSBXaU1BWCBjb2RlIGlzIGRvbmUgaW4gc3VjaCBhCisjIHdheSB0aGF0IGl0IGRvZXNuJ3QgcmVxdWlyZSBhbmQgZXhwbGljaXQgZGVwZW5kZW5jeSBvbiBSRktJTEwgaW4KKyMgY2FzZSBhbiBlbWJlZGRlZCBzeXN0ZW0gd2FudHMgdG8gcmlwIGl0IG91dC4KKyMKKyMgQXMgd2VsbCwgZW5hYmxlbWVudCBvZiB0aGUgUkZLSUxMIGNvZGUgbWVhbnMgd2UgbmVlZCB0aGUgSU5QVVQgbGF5ZXIKKyMgc3VwcG9ydCB0byBpbmplY3QgZXZlbnRzIGNvbWluZyBmcm9tIGh3IHJma2lsbCBzd2l0Y2hlcy4gVGhhdAorIyBkZXBlbmRlbmN5IGNvdWxkIGJlIGtpbGxlZCBpZiBpbnB1dC5oIHByb3ZpZGVkIGFwcHJvcGlhdGUgbWVhbnMgdG8KKyMgd29yayB3aGVuIGlucHV0IGlzIGRpc2FibGVkLgorCitjb21tZW50ICJXaU1BWCBXaXJlbGVzcyBCcm9hZGJhbmQgc3VwcG9ydCByZXF1aXJlcyBDT05GSUdfSU5QVVQgZW5hYmxlZCIKKwlkZXBlbmRzIG9uIElOUFVUID0gbiAmJiBSRktJTEwgIT0gbgorCittZW51Y29uZmlnIFdJTUFYCisJdHJpc3RhdGUgIldpTUFYIFdpcmVsZXNzIEJyb2FkYmFuZCBzdXBwb3J0IgorCWRlcGVuZHMgb24gKHkgJiYgUkZLSUxMICE9IG0pIHx8IG0KKwlkZXBlbmRzIG9uIChJTlBVVCAmJiBSRktJTEwgIT0gbikgfHwgUkZLSUxMID0gbgorCWhlbHAKKworCSAgU2VsZWN0IHRvIGNvbmZpZ3VyZSBzdXBwb3J0IGZvciBkZXZpY2VzIHRoYXQgcHJvdmlkZQorCSAgd2lyZWxlc3MgYnJvYWRiYW5kIGNvbm5lY3Rpdml0eSB1c2luZyB0aGUgV2lNQVggcHJvdG9jb2wKKwkgIChJRUVFIDgwMi4xNikuCisKKwkgIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBvZiB0aGVzZSBkZXZpY2VzIHJlcXVpcmUgc2lnbmluZyB1cAorCSAgZm9yIGEgc2VydmljZSBwbGFuIHdpdGggYSBwcm92aWRlci4KKworCSAgVGhlIGRpZmZlcmVudCBXaU1BWCBkcml2ZXJzIGNhbiBiZSBlbmFibGVkIGluIHRoZSBtZW51IGVudHJ5CisKKwkgIERldmljZSBEcml2ZXJzID4gTmV0d29yayBkZXZpY2Ugc3VwcG9ydCA+IFdpTUFYIFdpcmVsZXNzCisJICBCcm9hZGJhbmQgZGV2aWNlcworCisJICBJZiB1bnN1cmUsIGl0IGlzIHNhZmUgdG8gc2VsZWN0IE0gKG1vZHVsZSkuCisKK2NvbmZpZyBXSU1BWF9ERUJVR19MRVZFTAorCWludCAiV2lNQVggZGVidWcgbGV2ZWwiCisJZGVwZW5kcyBvbiBXSU1BWAorCWRlZmF1bHQgOAorCWhlbHAKKworCSAgU2VsZWN0IHRoZSBtYXhpbXVtIGRlYnVnIHZlcmJvc2l0eSBsZXZlbCB0byBiZSBjb21waWxlZCBpbnRvCisJICB0aGUgV2lNQVggc3RhY2sgY29kZS4KKworCSAgQnkgZGVmYXVsdCwgZGVidWcgbWVzc2FnZXMgYXJlIGRpc2FibGVkIGF0IHJ1bnRpbWUgYW5kIGNhbgorCSAgYmUgc2VsZWN0aXZlbHkgZW5hYmxlZCBmb3IgZGlmZmVyZW50IHBhcnRzIG9mIHRoZSBjb2RlIHVzaW5nCisJICB0aGUgc3lzZnMgZGVidWctbGV2ZWxzIGZpbGUuCisKKwkgIElmIHNldCBhdCB6ZXJvLCB0aGlzIHdpbGwgY29tcGlsZSBvdXQgYWxsIHRoZSBkZWJ1ZyBjb2RlLgorCisJICBJdCBpcyByZWNvbW1lbmRlZCB0aGF0IGl0IGlzIGxlZnQgYXQgOC4KZGlmZiAtLWdpdCBhL25ldC93aW1heC9NYWtlZmlsZSBiL25ldC93aW1heC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjgwYjk0Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L3dpbWF4L01ha2VmaWxlCkBAIC0wLDAgKzEsMTMgQEAKKworb2JqLSQoQ09ORklHX1dJTUFYKQkJKz0gd2ltYXgubworCit3aW1heC15IDo9CQlcCisJaWQtdGFibGUubwlcCisJb3AtbXNnLm8JXAorCW9wLXJlc2V0Lm8JXAorCW9wLXJma2lsbC5vCVwKKwlzdGFjay5vCisKK3dpbWF4LSQoQ09ORklHX0RFQlVHX0ZTKSArPSBkZWJ1Z2ZzLm8KKworCmRpZmYgLS1naXQgYS9uZXQvd2ltYXgvZGVidWctbGV2ZWxzLmggYi9uZXQvd2ltYXgvZGVidWctbGV2ZWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWMyOTEyMwotLS0gL2Rldi9udWxsCisrKyBiL25ldC93aW1heC9kZWJ1Zy1sZXZlbHMuaApAQCAtMCwwICsxLDQyIEBACisvKgorICogTGludXggV2lNQVggU3RhY2sKKyAqIERlYnVnIGxldmVscyBjb250cm9sIGZpbGUgZm9yIHRoZSB3aW1heCBtb2R1bGUKKyAqCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggSW50ZWwgQ29ycG9yYXRpb24gPGxpbnV4LXdpbWF4QGludGVsLmNvbT4KKyAqIEluYWt5IFBlcmV6LUdvbnphbGV6IDxpbmFreS5wZXJlei1nb256YWxlekBpbnRlbC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBLgorICovCisjaWZuZGVmIF9fZGVidWdfbGV2ZWxzX19oX18KKyNkZWZpbmUgX19kZWJ1Z19sZXZlbHNfX2hfXworCisvKiBNYXhpbXVtIGNvbXBpbGUgYW5kIHJ1biB0aW1lIGRlYnVnIGxldmVsIGZvciBhbGwgc3VibW9kdWxlcyAqLworI2RlZmluZSBEX01PRFVMRU5BTUUgd2ltYXgKKyNkZWZpbmUgRF9NQVNURVIgQ09ORklHX1dJTUFYX0RFQlVHX0xFVkVMCisKKyNpbmNsdWRlIDxsaW51eC93aW1heC9kZWJ1Zy5oPgorCisvKiBMaXN0IG9mIGFsbCB0aGUgZW5hYmxlZCBtb2R1bGVzICovCitlbnVtIGRfbW9kdWxlIHsKKwlEX1NVQk1PRFVMRV9ERUNMQVJFKGRlYnVnZnMpLAorCURfU1VCTU9EVUxFX0RFQ0xBUkUoaWRfdGFibGUpLAorCURfU1VCTU9EVUxFX0RFQ0xBUkUob3BfbXNnKSwKKwlEX1NVQk1PRFVMRV9ERUNMQVJFKG9wX3Jlc2V0KSwKKwlEX1NVQk1PRFVMRV9ERUNMQVJFKG9wX3Jma2lsbCksCisJRF9TVUJNT0RVTEVfREVDTEFSRShzdGFjayksCit9OworCisjZW5kaWYgLyogI2lmbmRlZiBfX2RlYnVnX2xldmVsc19faF9fICovCmRpZmYgLS1naXQgYS9uZXQvd2ltYXgvZGVidWdmcy5jIGIvbmV0L3dpbWF4L2RlYnVnZnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44N2NmNDQzCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L3dpbWF4L2RlYnVnZnMuYwpAQCAtMCwwICsxLDkwIEBACisvKgorICogTGludXggV2lNQVgKKyAqIERlYnVnZnMgc3VwcG9ydAorICoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwNiBJbnRlbCBDb3Jwb3JhdGlvbiA8bGludXgtd2ltYXhAaW50ZWwuY29tPgorICogSW5ha3kgUGVyZXotR29uemFsZXogPGluYWt5LnBlcmV6LWdvbnphbGV6QGludGVsLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CisjaW5jbHVkZSA8bGludXgvd2ltYXguaD4KKyNpbmNsdWRlICJ3aW1heC1pbnRlcm5hbC5oIgorCisjZGVmaW5lIERfU1VCTU9EVUxFIGRlYnVnZnMKKyNpbmNsdWRlICJkZWJ1Zy1sZXZlbHMuaCIKKworCisvKiBEZWJ1ZyBmcmFtZXdvcmsgY29udHJvbCBvZiBkZWJ1ZyBsZXZlbHMgKi8KK3N0cnVjdCBkX2xldmVsIERfTEVWRUxbXSA9IHsKKwlEX1NVQk1PRFVMRV9ERUZJTkUoZGVidWdmcyksCisJRF9TVUJNT0RVTEVfREVGSU5FKGlkX3RhYmxlKSwKKwlEX1NVQk1PRFVMRV9ERUZJTkUob3BfbXNnKSwKKwlEX1NVQk1PRFVMRV9ERUZJTkUob3BfcmVzZXQpLAorCURfU1VCTU9EVUxFX0RFRklORShvcF9yZmtpbGwpLAorCURfU1VCTU9EVUxFX0RFRklORShzdGFjayksCit9Oworc2l6ZV90IERfTEVWRUxfU0laRSA9IEFSUkFZX1NJWkUoRF9MRVZFTCk7CisKKyNkZWZpbmUgX19kZWJ1Z2ZzX3JlZ2lzdGVyKHByZWZpeCwgbmFtZSwgcGFyZW50KQkJCVwKK2RvIHsJCQkJCQkJCQlcCisJcmVzdWx0ID0gZF9sZXZlbF9yZWdpc3Rlcl9kZWJ1Z2ZzKHByZWZpeCwgbmFtZSwgcGFyZW50KTsJXAorCWlmIChyZXN1bHQgPCAwKQkJCQkJCQlcCisJCWdvdG8gZXJyb3I7CQkJCQkJXAorfSB3aGlsZSAoMCkKKworCitpbnQgd2ltYXhfZGVidWdmc19hZGQoc3RydWN0IHdpbWF4X2RldiAqd2ltYXhfZGV2KQoreworCWludCByZXN1bHQ7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYgPSB3aW1heF9kZXYtPm5ldF9kZXY7CisJc3RydWN0IGRldmljZSAqZGV2ID0gbmV0X2Rldi0+ZGV2LnBhcmVudDsKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnk7CisJY2hhciBidWZbMTI4XTsKKworCXNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJ3aW1heDolcyIsIG5ldF9kZXYtPm5hbWUpOworCWRlbnRyeSA9IGRlYnVnZnNfY3JlYXRlX2RpcihidWYsIE5VTEwpOworCXJlc3VsdCA9IFBUUl9FUlIoZGVudHJ5KTsKKwlpZiAoSVNfRVJSKGRlbnRyeSkpIHsKKwkJaWYgKHJlc3VsdCA9PSAtRU5PREVWKQorCQkJcmVzdWx0ID0gMDsJLyogTm8gZGVidWdmcyBzdXBwb3J0ICovCisJCWVsc2UKKwkJCWRldl9lcnIoZGV2LCAiQ2FuJ3QgY3JlYXRlIGRlYnVnZnMgZGVudHJ5OiAlZFxuIiwKKwkJCQlyZXN1bHQpOworCQlnb3RvIG91dDsKKwl9CisJd2ltYXhfZGV2LT5kZWJ1Z2ZzX2RlbnRyeSA9IGRlbnRyeTsKKwlfX2RlYnVnZnNfcmVnaXN0ZXIoIndpbWF4X2RsXyIsIGRlYnVnZnMsIGRlbnRyeSk7CisJX19kZWJ1Z2ZzX3JlZ2lzdGVyKCJ3aW1heF9kbF8iLCBpZF90YWJsZSwgZGVudHJ5KTsKKwlfX2RlYnVnZnNfcmVnaXN0ZXIoIndpbWF4X2RsXyIsIG9wX21zZywgZGVudHJ5KTsKKwlfX2RlYnVnZnNfcmVnaXN0ZXIoIndpbWF4X2RsXyIsIG9wX3Jlc2V0LCBkZW50cnkpOworCV9fZGVidWdmc19yZWdpc3Rlcigid2ltYXhfZGxfIiwgb3BfcmZraWxsLCBkZW50cnkpOworCV9fZGVidWdmc19yZWdpc3Rlcigid2ltYXhfZGxfIiwgc3RhY2ssIGRlbnRyeSk7CisJcmVzdWx0ID0gMDsKK291dDoKKwlyZXR1cm4gcmVzdWx0OworCitlcnJvcjoKKwlkZWJ1Z2ZzX3JlbW92ZV9yZWN1cnNpdmUod2ltYXhfZGV2LT5kZWJ1Z2ZzX2RlbnRyeSk7CisJcmV0dXJuIHJlc3VsdDsKK30KKwordm9pZCB3aW1heF9kZWJ1Z2ZzX3JtKHN0cnVjdCB3aW1heF9kZXYgKndpbWF4X2RldikKK3sKKwlkZWJ1Z2ZzX3JlbW92ZV9yZWN1cnNpdmUod2ltYXhfZGV2LT5kZWJ1Z2ZzX2RlbnRyeSk7Cit9CisKKwpkaWZmIC0tZ2l0IGEvbmV0L3dpbWF4L2lkLXRhYmxlLmMgYi9uZXQvd2ltYXgvaWQtdGFibGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTY4NWY3Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L3dpbWF4L2lkLXRhYmxlLmMKQEAgLTAsMCArMSwxNDQgQEAKKy8qCisgKiBMaW51eCBXaU1BWAorICogTWFwcHBpbmcgb2YgZ2VuZXJpYyBuZXRsaW5rIGZhbWlseSBJRHMgdG8gbmV0IGRldmljZXMKKyAqCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1LTIwMDYgSW50ZWwgQ29ycG9yYXRpb24gPGxpbnV4LXdpbWF4QGludGVsLmNvbT4KKyAqIEluYWt5IFBlcmV6LUdvbnphbGV6IDxpbmFreS5wZXJlei1nb256YWxlekBpbnRlbC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBLgorICoKKyAqCisgKiBXZSBhc3NpZ24gYSBzaW5nbGUgZ2VuZXJpYyBuZXRsaW5rIGZhbWlseSBJRCB0byBlYWNoIGRldmljZSAodG8KKyAqIHNpbXBsaWZ5IGxvb2t1cCkuCisgKgorICogV2UgbmVlZCBhIHdheSB0byBtYXAgZmFtaWx5IElEIHRvIGEgd2ltYXhfZGV2IHBvaW50ZXIuCisgKgorICogVGhlIGlkZWEgaXMgdG8gdXNlIGEgdmVyeSBzaW1wbGUgbG9va3VwLiBVc2luZyBhIG5ldGxpbmsgYXR0cmlidXRlCisgKiB3aXRoIChmb3IgZXhhbXBsZSkgdGhlIGludGVyZmFjZSBuYW1lIGltcGxpZXMgYSBoZWF2aWVyIHNlYXJjaCBvdmVyCisgKiBhbGwgdGhlIG5ldHdvcmsgZGV2aWNlczsgc2VlbWVkIGtpbmQgb2YgYSB3YXN0ZSBnaXZlbiB0aGF0IHdlIGtub3cKKyAqIHdlIGFyZSBsb29raW5nIGZvciBhIFdpTUFYIGRldmljZSBhbmQgdGhhdCBtb3N0IHN5c3RlbXMgd2lsbCBoYXZlCisgKiBqdXN0IGEgc2luZ2xlIFdpTUFYIGFkYXB0ZXIuCisgKgorICogV2UgcHV0IGFsbCB0aGUgV2lNQVggZGV2aWNlcyBpbiB0aGUgc3lzdGVtIGluIGEgbGlua2VkIGxpc3QgYW5kCisgKiBtYXRjaCB0aGUgZ2VuZXJpYyBsaW5rIGZhbWlseSBJRCBhZ2FpbnN0IHRoZSBsaXN0LgorICoKKyAqIEJ5IHVzaW5nIGEgbGlua2VkIGxpc3QsIHRoZSBjYXNlIG9mIGEgc2luZ2xlIGFkYXB0ZXIgaW4gdGhlIHN5c3RlbQorICogYmVjb21lcyAoYWxtb3N0KSBubyBvdmVyaGVhZCwgd2hpbGUgc3RpbGwgd29ya2luZyBmb3IgbWFueSBtb3JlLiBJZgorICogaXQgZXZlciBnb2VzIGJleW9uZCB0d28sIEknbGwgYmUgc3VycHJpc2VkLgorICovCisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bmV0L2dlbmV0bGluay5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC93aW1heC5oPgorI2luY2x1ZGUgIndpbWF4LWludGVybmFsLmgiCisKKworI2RlZmluZSBEX1NVQk1PRFVMRSBpZF90YWJsZQorI2luY2x1ZGUgImRlYnVnLWxldmVscy5oIgorCisKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0sod2ltYXhfaWRfdGFibGVfbG9jayk7CitzdGF0aWMgc3RydWN0IGxpc3RfaGVhZCB3aW1heF9pZF90YWJsZSA9IExJU1RfSEVBRF9JTklUKHdpbWF4X2lkX3RhYmxlKTsKKworCisvKgorICogd2ltYXhfaWRfdGFibGVfYWRkIC0gYWRkIGEgZ2VubmV0bGluayBmYW1pbGl5IElEIC8gd2ltYXhfZGV2IG1hcHBpbmcKKyAqCisgKiBAd2ltYXhfZGV2OiBXaU1BWCBkZXZpY2UgZGVzY3JpcHRvciB0byBhc3NvY2lhdGUgdG8gdGhlIEdlbmVyaWMKKyAqICAgICBOZXRsaW5rIGZhbWlseSBJRC4KKyAqCisgKiBMb29rIGZvciBhbiBlbXB0eSBzcG90IGluIHRoZSBJRCB0YWJsZTsgaWYgbm9uZSBmb3VuZCwgZG91YmxlIHRoZQorICogdGFibGUncyBzaXplIGFuZCBnZXQgdGhlIGZpcnN0IHNwb3QuCisgKi8KK3ZvaWQgd2ltYXhfaWRfdGFibGVfYWRkKHN0cnVjdCB3aW1heF9kZXYgKndpbWF4X2RldikKK3sKKwlkX2Zuc3RhcnQoMywgTlVMTCwgIih3aW1heF9kZXYgJXApXG4iLCB3aW1heF9kZXYpOworCXNwaW5fbG9jaygmd2ltYXhfaWRfdGFibGVfbG9jayk7CisJbGlzdF9hZGQoJndpbWF4X2Rldi0+aWRfdGFibGVfbm9kZSwgJndpbWF4X2lkX3RhYmxlKTsKKwlzcGluX3VubG9jaygmd2ltYXhfaWRfdGFibGVfbG9jayk7CisJZF9mbmVuZCgzLCBOVUxMLCAiKHdpbWF4X2RldiAlcClcbiIsIHdpbWF4X2Rldik7Cit9CisKKworLyoKKyAqIHdpbWF4X2dldF9uZXRkZXZfYnlfaW5mbyAtIGxvb2t1cCBhIHdpbWF4X2RldiBmcm9tIHRoZSBnZW5uZXRsaW5rIGluZm8KKyAqCisgKiBUaGUgZ2VuZXJpYyBuZXRsaW5rIGZhbWlseSBJRCBoYXMgYmVlbiBmaWxsZWQgb3V0IGluIHRoZQorICogbmxtc2doZHItPm5sbXNnX3R5cGUgZmllbGQsIHNvIHdlIHB1bGwgaXQgZnJvbSB0aGVyZSwgbG9vayBpdCB1cCBpbgorICogdGhlIG1hcHBpbmcgdGFibGUgYW5kIHJlZmVyZW5jZSB0aGUgd2ltYXhfZGV2LgorICoKKyAqIFdoZW4gZG9uZSwgdGhlIHJlZmVyZW5jZSBzaG91bGQgYmUgZHJvcHBlZCB3aXRoCisgKiAnZGV2X3B1dCh3aW1heF9kZXYtPm5ldF9kZXYpJy4KKyAqLworc3RydWN0IHdpbWF4X2RldiAqd2ltYXhfZGV2X2dldF9ieV9nZW5sX2luZm8oCisJc3RydWN0IGdlbmxfaW5mbyAqaW5mbywgaW50IGlmaW5kZXgpCit7CisJc3RydWN0IHdpbWF4X2RldiAqd2ltYXhfZGV2ID0gTlVMTDsKKworCWRfZm5zdGFydCgzLCBOVUxMLCAiKGluZm8gJXAgaWZpbmRleCAlZClcbiIsIGluZm8sIGlmaW5kZXgpOworCXNwaW5fbG9jaygmd2ltYXhfaWRfdGFibGVfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeSh3aW1heF9kZXYsICZ3aW1heF9pZF90YWJsZSwgaWRfdGFibGVfbm9kZSkgeworCQlpZiAod2ltYXhfZGV2LT5uZXRfZGV2LT5pZmluZGV4ID09IGlmaW5kZXgpIHsKKwkJCWRldl9ob2xkKHdpbWF4X2Rldi0+bmV0X2Rldik7CisJCQlicmVhazsKKwkJfQorCX0KKwlpZiAod2ltYXhfZGV2ID09IE5VTEwpCisJCWRfcHJpbnRmKDEsIE5VTEwsICJ3aW1heDogbm8gZGV2aWNlcyBmb3VuZCB3aXRoIGlmaW5kZXggJWRcbiIsCisJCQkgaWZpbmRleCk7CisJc3Bpbl91bmxvY2soJndpbWF4X2lkX3RhYmxlX2xvY2spOworCWRfZm5lbmQoMywgTlVMTCwgIihpbmZvICVwIGlmaW5kZXggJWQpID0gJXBcbiIsCisJCWluZm8sIGlmaW5kZXgsIHdpbWF4X2Rldik7CisJcmV0dXJuIHdpbWF4X2RldjsKK30KKworCisvKgorICogd2ltYXhfaWRfdGFibGVfcm0gLSBSZW1vdmUgYSBnZW5uZXRsaW5rIGZhbWlsaXkgSUQgLyB3aW1heF9kZXYgbWFwcGluZworICoKKyAqIEBpZDogZmFtaWx5IElEIHRvIHJlbW92ZSBmcm9tIHRoZSB0YWJsZQorICovCit2b2lkIHdpbWF4X2lkX3RhYmxlX3JtKHN0cnVjdCB3aW1heF9kZXYgKndpbWF4X2RldikKK3sKKwlzcGluX2xvY2soJndpbWF4X2lkX3RhYmxlX2xvY2spOworCWxpc3RfZGVsX2luaXQoJndpbWF4X2Rldi0+aWRfdGFibGVfbm9kZSk7CisJc3Bpbl91bmxvY2soJndpbWF4X2lkX3RhYmxlX2xvY2spOworfQorCisKKy8qCisgKiBSZWxlYXNlIHRoZSBnZW5uZXRsaW5rIGZhbWlseSBpZCAvIG1hcHBpbmcgdGFibGUKKyAqCisgKiBPbiBkZWJ1ZywgdmVyaWZ5IHRoYXQgdGhlIHRhYmxlIGlzIGVtcHR5IHVwb24gcmVtb3ZhbC4gV2Ugd2FudCB0aGUKKyAqIGNvZGUgYWx3YXlzIGNvbXBpbGVkLCB0byBlbnN1cmUgaXQgZG9lc24ndCBiaXQgcm90LiBJdCB3aWxsIGJlCisgKiBjb21waWxlZCBvdXQgaWYgQ09ORklHX0JVRyBpcyBkaXNhYmxlZC4KKyAqLwordm9pZCB3aW1heF9pZF90YWJsZV9yZWxlYXNlKHZvaWQpCit7CisJc3RydWN0IHdpbWF4X2RldiAqd2ltYXhfZGV2OworCisjaWZuZGVmIENPTkZJR19CVUcKKwlyZXR1cm47CisjZW5kaWYKKwlzcGluX2xvY2soJndpbWF4X2lkX3RhYmxlX2xvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnkod2ltYXhfZGV2LCAmd2ltYXhfaWRfdGFibGUsIGlkX3RhYmxlX25vZGUpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJCVUc6ICVzIHdpbWF4X2RldiAlcCBpZmluZGV4ICVkIG5vdCBjbGVhcmVkXG4iLAorCQkgICAgICAgX19mdW5jX18sIHdpbWF4X2Rldiwgd2ltYXhfZGV2LT5uZXRfZGV2LT5pZmluZGV4KTsKKwkJV0FSTl9PTigxKTsKKwl9CisJc3Bpbl91bmxvY2soJndpbWF4X2lkX3RhYmxlX2xvY2spOworfQpkaWZmIC0tZ2l0IGEvbmV0L3dpbWF4L29wLW1zZy5jIGIvbmV0L3dpbWF4L29wLW1zZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiM2I0YWQKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvd2ltYXgvb3AtbXNnLmMKQEAgLTAsMCArMSw0MjEgQEAKKy8qCisgKiBMaW51eCBXaU1BWAorICogR2VuZXJpYyBtZXNzYWdpbmcgaW50ZXJmYWNlIGJldHdlZW4gdXNlcnNwYWNlIGFuZCBkcml2ZXIvZGV2aWNlCisgKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEludGVsIENvcnBvcmF0aW9uIDxsaW51eC13aW1heEBpbnRlbC5jb20+CisgKiBJbmFreSBQZXJlei1Hb256YWxleiA8aW5ha3kucGVyZXotZ29uemFsZXpAaW50ZWwuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEsIFVTQS4KKyAqCisgKgorICogVGhpcyBpbXBsZW1lbnRzIGEgZGlyZWN0IGNvbW11bmljYXRpb24gY2hhbm5lbCBiZXR3ZWVuIHVzZXIgc3BhY2UgYW5kCisgKiB0aGUgZHJpdmVyL2RldmljZSwgYnkgd2hpY2ggZnJlZSBmb3JtIG1lc3NhZ2VzIGNhbiBiZSBzZW50IGJhY2sgYW5kCisgKiBmb3J0aC4KKyAqCisgKiBUaGlzIGlzIGludGVuZGVkIGZvciBkZXZpY2Utc3BlY2lmaWMgZmVhdHVyZXMsIHZlbmRvciBxdWlya3MsIGV0Yy4KKyAqCisgKiBTZWUgaW5jbHVkZS9uZXQvd2ltYXguaAorICoKKyAqIEdFTkVSSUMgTkVUTElOSyBFTkNPRElORyBBTkQgQ0FQQUNJVFkKKyAqCisgKiBBIGRlc3RpbmF0aW9uICJwaXBlIG5hbWUiIGlzIGFkZGVkIHRvIGVhY2ggbWVzc2FnZTsgaXQgaXMgdXAgdG8gdGhlCisgKiBkcml2ZXJzIHRvIGFzc2lnbiBvciB1c2UgdGhvc2UgbmFtZXMgKGlmIHVzaW5nIHRoZW0gYXQgYWxsKS4KKyAqCisgKiBNZXNzYWdlcyBhcmUgZW5jb2RlZCBhcyBhIGJpbmFyeSBuZXRsaW5rIGF0dHJpYnV0ZSB1c2luZyBubGFfcHV0KCkKKyAqIHVzaW5nIHR5cGUgTkxBX1VOU1BFQyAoYXMgc29tZSB2ZXJzaW9ucyBvZiBsaWJubCBzdGlsbCBpbgorICogZGVwbG95bWVudCBkb24ndCB5ZXQgdW5kZXJzdGFuZCBOTEFfQklOQVJZKS4KKyAqCisgKiBUaGUgbWF4aW11bSBjYXBhY2l0eSBvZiB0aGlzIHRyYW5zcG9ydCBpcyBQQUdFU0laRSBwZXIgbWVzc2FnZSAoc28KKyAqIHRoZSBhY3R1YWwgcGF5bG9hZCB3aWxsIGJlIGJpdCBzbWFsbGVyIGRlcGVuZGluZyBvbiB0aGUKKyAqIG5ldGxpbmsvZ2VuZXJpYyBuZXRsaW5rIGF0dHJpYnV0ZXMgYW5kIGhlYWRlcnMpLgorICoKKyAqIFJFQ0VQVElPTiBPRiBNRVNTQUdFUworICoKKyAqIFdoZW4gYSBtZXNzYWdlIGlzIHJlY2VpdmVkIGZyb20gdXNlciBzcGFjZSwgaXQgaXMgcGFzc2VkIHZlcmJhdGltCisgKiB0byB0aGUgZHJpdmVyIGNhbGxpbmcgd2ltYXhfZGV2LT5vcF9tc2dfZnJvbV91c2VyKCkuIFRoZSByZXR1cm4KKyAqIHZhbHVlIGZyb20gdGhpcyBmdW5jdGlvbiBpcyBwYXNzZWQgYmFjayB0byB1c2VyIHNwYWNlIGFzIGFuIGFjaworICogb3ZlciB0aGUgZ2VuZXJpYyBuZXRsaW5rIHByb3RvY29sLgorICoKKyAqIFRoZSBzdGFjayBkb2Vzbid0IGRvIGFueSBwcm9jZXNzaW5nIG9yIGludGVycHJldGF0aW9uIG9mIHRoZXNlCisgKiBtZXNzYWdlcy4KKyAqCisgKiBTRU5ESU5HIE1FU1NBR0VTCisgKgorICogTWVzc2FnZXMgY2FuIGJlIHNlbnQgd2l0aCB3aW1heF9tc2coKS4KKyAqCisgKiBJZiB0aGUgbWVzc2FnZSBkZWxpdmVyeSBuZWVkcyB0byBoYXBwZW4gb24gYSBkaWZmZXJlbnQgY29udGV4dCB0bworICogdGhhdCBvZiBpdHMgY3JlYXRpb24sIHdpbWF4X21zZ19hbGxvYygpIGNhbiBiZSB1c2VkIHRvIGdldCBhCisgKiBwb2ludGVyIHRvIHRoZSBtZXNzYWdlIHRoYXQgY2FuIGJlIGRlbGl2ZXJlZCBsYXRlciBvbiB3aXRoCisgKiB3aW1heF9tc2dfc2VuZCgpLgorICoKKyAqIFJPQURNQVAKKyAqCisgKiB3aW1heF9nbmxfZG9pdF9tc2dfZnJvbV91c2VyKCkgICAgUHJvY2VzcyBhIG1lc3NhZ2UgZnJvbSB1c2VyIHNwYWNlCisgKiAgIHdpbWF4X2Rldl9nZXRfYnlfZ2VubF9pbmZvKCkKKyAqICAgd2ltYXhfZGV2LT5vcF9tc2dfZnJvbV91c2VyKCkgICBEZWxpdmVyeSBvZiBtZXNzYWdlIHRvIHRoZSBkcml2ZXIKKyAqCisgKiB3aW1heF9tc2coKSAgICAgICAgICAgICAgICAgICAgICAgU2VuZCBhIG1lc3NhZ2UgdG8gdXNlciBzcGFjZQorICogICB3aW1heF9tc2dfYWxsb2MoKQorICogICB3aW1heF9tc2dfc2VuZCgpCisgKi8KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxuZXQvZ2VuZXRsaW5rLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvd2ltYXguaD4KKyNpbmNsdWRlIDxsaW51eC9zZWN1cml0eS5oPgorI2luY2x1ZGUgIndpbWF4LWludGVybmFsLmgiCisKKworI2RlZmluZSBEX1NVQk1PRFVMRSBvcF9tc2cKKyNpbmNsdWRlICJkZWJ1Zy1sZXZlbHMuaCIKKworCisvKioKKyAqIHdpbWF4X21zZ19hbGxvYyAtIENyZWF0ZSBhIG5ldyBza2IgZm9yIHNlbmRpbmcgYSBtZXNzYWdlIHRvIHVzZXJzcGFjZQorICoKKyAqIEB3aW1heF9kZXY6IFdpTUFYIGRldmljZSBkZXNjcmlwdG9yCisgKiBAcGlwZV9uYW1lOiAibmFtZWQgcGlwZSIgdGhlIG1lc3NhZ2Ugd2lsbCBiZSBzZW50IHRvCisgKiBAbXNnOiBwb2ludGVyIHRvIHRoZSBtZXNzYWdlIGRhdGEgdG8gc2VuZAorICogQHNpemU6IHNpemUgb2YgdGhlIG1lc3NhZ2UgdG8gc2VuZCAoaW4gYnl0ZXMpLCBpbmNsdWRpbmcgdGhlIGhlYWRlci4KKyAqIEBnZnBfZmxhZ3M6IGZsYWdzIGZvciBtZW1vcnkgYWxsb2NhdGlvbi4KKyAqCisgKiBSZXR1cm5zOiAlMCBpZiBvaywgbmVnYXRpdmUgZXJybm8gY29kZSBvbiBlcnJvcgorICoKKyAqIERlc2NyaXB0aW9uOgorICoKKyAqIEFsbG9jYXRlcyBhbiBza2IgdGhhdCB3aWxsIGNvbnRhaW4gdGhlIG1lc3NhZ2UgdG8gc2VuZCB0byB1c2VyCisgKiBzcGFjZSBvdmVyIHRoZSBtZXNzYWdpbmcgcGlwZSBhbmQgaW5pdGlhbGl6ZXMgaXQsIGNvcHlpbmcgdGhlCisgKiBwYXlsb2FkLgorICoKKyAqIE9uY2UgdGhpcyBjYWxsIGlzIGRvbmUsIHlvdSBjYW4gZGVsaXZlciBpdCB3aXRoCisgKiB3aW1heF9tc2dfc2VuZCgpLgorICoKKyAqIElNUE9SVEFOVDoKKyAqCisgKiBEb24ndCB1c2Ugc2tiX3B1c2goKS9za2JfcHVsbCgpL3NrYl9yZXNlcnZlKCkgb24gdGhlIHNrYiwgYXMKKyAqIHdpbWF4X21zZ19zZW5kKCkgZGVwZW5kcyBvbiBza2ItPmRhdGEgYmVpbmcgcGxhY2VkIGF0IHRoZQorICogYmVnaW5uaW5nIG9mIHRoZSB1c2VyIG1lc3NhZ2UuCisgKi8KK3N0cnVjdCBza19idWZmICp3aW1heF9tc2dfYWxsb2Moc3RydWN0IHdpbWF4X2RldiAqd2ltYXhfZGV2LAorCQkJCWNvbnN0IGNoYXIgKnBpcGVfbmFtZSwKKwkJCQljb25zdCB2b2lkICptc2csIHNpemVfdCBzaXplLAorCQkJCWdmcF90IGdmcF9mbGFncykKK3sKKwlpbnQgcmVzdWx0OworCXN0cnVjdCBkZXZpY2UgKmRldiA9IHdpbWF4X2Rldi0+bmV0X2Rldi0+ZGV2LnBhcmVudDsKKwlzaXplX3QgbXNnX3NpemU7CisJdm9pZCAqZ2VubF9tc2c7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCW1zZ19zaXplID0gbmxhX3RvdGFsX3NpemUoc2l6ZSkKKwkJKyBubGFfdG90YWxfc2l6ZShzaXplb2YodTMyKSkKKwkJKyAocGlwZV9uYW1lID8gbmxhX3RvdGFsX3NpemUoc3RybGVuKHBpcGVfbmFtZSkpIDogMCk7CisJcmVzdWx0ID0gLUVOT01FTTsKKwlza2IgPSBnZW5sbXNnX25ldyhtc2dfc2l6ZSwgZ2ZwX2ZsYWdzKTsKKwlpZiAoc2tiID09IE5VTEwpCisJCWdvdG8gZXJyb3JfbmV3OworCWdlbmxfbXNnID0gZ2VubG1zZ19wdXQoc2tiLCAwLCAwLCAmd2ltYXhfZ25sX2ZhbWlseSwKKwkJCSAgICAgICAwLCBXSU1BWF9HTkxfT1BfTVNHX1RPX1VTRVIpOworCWlmIChnZW5sX21zZyA9PSBOVUxMKSB7CisJCWRldl9lcnIoZGV2LCAibm8gbWVtb3J5IHRvIGNyZWF0ZSBnZW5lcmljIG5ldGxpbmsgbWVzc2FnZVxuIik7CisJCWdvdG8gZXJyb3JfZ2VubG1zZ19wdXQ7CisJfQorCXJlc3VsdCA9IG5sYV9wdXRfdTMyKHNrYiwgV0lNQVhfR05MX01TR19JRklEWCwKKwkJCSAgICAgd2ltYXhfZGV2LT5uZXRfZGV2LT5pZmluZGV4KTsKKwlpZiAocmVzdWx0IDwgMCkgeworCQlkZXZfZXJyKGRldiwgIm5vIG1lbW9yeSB0byBhZGQgaWZpbmRleCBhdHRyaWJ1dGVcbiIpOworCQlnb3RvIGVycm9yX25sYV9wdXQ7CisJfQorCWlmIChwaXBlX25hbWUpIHsKKwkJcmVzdWx0ID0gbmxhX3B1dF9zdHJpbmcoc2tiLCBXSU1BWF9HTkxfTVNHX1BJUEVfTkFNRSwKKwkJCQkJcGlwZV9uYW1lKTsKKwkJaWYgKHJlc3VsdCA8IDApIHsKKwkJCWRldl9lcnIoZGV2LCAibm8gbWVtb3J5IHRvIGFkZCBwaXBlX25hbWUgYXR0cmlidXRlXG4iKTsKKwkJCWdvdG8gZXJyb3JfbmxhX3B1dDsKKwkJfQorCX0KKwlyZXN1bHQgPSBubGFfcHV0KHNrYiwgV0lNQVhfR05MX01TR19EQVRBLCBzaXplLCBtc2cpOworCWlmIChyZXN1bHQgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAibm8gbWVtb3J5IHRvIGFkZCBwYXlsb2FkIGluIGF0dHJpYnV0ZVxuIik7CisJCWdvdG8gZXJyb3JfbmxhX3B1dDsKKwl9CisJZ2VubG1zZ19lbmQoc2tiLCBnZW5sX21zZyk7CisJcmV0dXJuIHNrYjsKKworZXJyb3JfbmxhX3B1dDoKK2Vycm9yX2dlbmxtc2dfcHV0OgorZXJyb3JfbmV3OgorCW5sbXNnX2ZyZWUoc2tiKTsKKwlyZXR1cm4gRVJSX1BUUihyZXN1bHQpOworCit9CitFWFBPUlRfU1lNQk9MX0dQTCh3aW1heF9tc2dfYWxsb2MpOworCisKKy8qKgorICogd2ltYXhfbXNnX2RhdGFfbGVuIC0gUmV0dXJuIGEgcG9pbnRlciBhbmQgc2l6ZSBvZiBhIG1lc3NhZ2UncyBwYXlsb2FkCisgKgorICogQG1zZzogUG9pbnRlciB0byBhIG1lc3NhZ2UgY3JlYXRlZCB3aXRoIHdpbWF4X21zZ19hbGxvYygpCisgKiBAc2l6ZTogUG9pbnRlciB0byB3aGVyZSB0byBzdG9yZSB0aGUgbWVzc2FnZSdzIHNpemUKKyAqCisgKiBSZXR1cm5zIHRoZSBwb2ludGVyIHRvIHRoZSBtZXNzYWdlIGRhdGEuCisgKi8KK2NvbnN0IHZvaWQgKndpbWF4X21zZ19kYXRhX2xlbihzdHJ1Y3Qgc2tfYnVmZiAqbXNnLCBzaXplX3QgKnNpemUpCit7CisJc3RydWN0IG5sbXNnaGRyICpubGggPSAodm9pZCAqKSBtc2ctPmhlYWQ7CisJc3RydWN0IG5sYXR0ciAqbmxhOworCisJbmxhID0gbmxtc2dfZmluZF9hdHRyKG5saCwgc2l6ZW9mKHN0cnVjdCBnZW5sbXNnaGRyKSwKKwkJCSAgICAgIFdJTUFYX0dOTF9NU0dfREFUQSk7CisJaWYgKG5sYSA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAiQ2Fubm90IGZpbmQgYXR0cmlidXRlIFdJTUFYX0dOTF9NU0dfREFUQVxuIik7CisJCXJldHVybiBOVUxMOworCX0KKwkqc2l6ZSA9IG5sYV9sZW4obmxhKTsKKwlyZXR1cm4gbmxhX2RhdGEobmxhKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHdpbWF4X21zZ19kYXRhX2xlbik7CisKKworLyoqCisgKiB3aW1heF9tc2dfZGF0YSAtIFJldHVybiBhIHBvaW50ZXIgdG8gYSBtZXNzYWdlJ3MgcGF5bG9hZAorICoKKyAqIEBtc2c6IFBvaW50ZXIgdG8gYSBtZXNzYWdlIGNyZWF0ZWQgd2l0aCB3aW1heF9tc2dfYWxsb2MoKQorICovCitjb25zdCB2b2lkICp3aW1heF9tc2dfZGF0YShzdHJ1Y3Qgc2tfYnVmZiAqbXNnKQoreworCXN0cnVjdCBubG1zZ2hkciAqbmxoID0gKHZvaWQgKikgbXNnLT5oZWFkOworCXN0cnVjdCBubGF0dHIgKm5sYTsKKworCW5sYSA9IG5sbXNnX2ZpbmRfYXR0cihubGgsIHNpemVvZihzdHJ1Y3QgZ2VubG1zZ2hkciksCisJCQkgICAgICBXSU1BWF9HTkxfTVNHX0RBVEEpOworCWlmIChubGEgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgIkNhbm5vdCBmaW5kIGF0dHJpYnV0ZSBXSU1BWF9HTkxfTVNHX0RBVEFcbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJcmV0dXJuIG5sYV9kYXRhKG5sYSk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh3aW1heF9tc2dfZGF0YSk7CisKKworLyoqCisgKiB3aW1heF9tc2dfbGVuIC0gUmV0dXJuIGEgbWVzc2FnZSdzIHBheWxvYWQgbGVuZ3RoCisgKgorICogQG1zZzogUG9pbnRlciB0byBhIG1lc3NhZ2UgY3JlYXRlZCB3aXRoIHdpbWF4X21zZ19hbGxvYygpCisgKi8KK3NzaXplX3Qgd2ltYXhfbXNnX2xlbihzdHJ1Y3Qgc2tfYnVmZiAqbXNnKQoreworCXN0cnVjdCBubG1zZ2hkciAqbmxoID0gKHZvaWQgKikgbXNnLT5oZWFkOworCXN0cnVjdCBubGF0dHIgKm5sYTsKKworCW5sYSA9IG5sbXNnX2ZpbmRfYXR0cihubGgsIHNpemVvZihzdHJ1Y3QgZ2VubG1zZ2hkciksCisJCQkgICAgICBXSU1BWF9HTkxfTVNHX0RBVEEpOworCWlmIChubGEgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgIkNhbm5vdCBmaW5kIGF0dHJpYnV0ZSBXSU1BWF9HTkxfTVNHX0RBVEFcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIG5sYV9sZW4obmxhKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHdpbWF4X21zZ19sZW4pOworCisKKy8qKgorICogd2ltYXhfbXNnX3NlbmQgLSBTZW5kIGEgcHJlLWFsbG9jYXRlZCBtZXNzYWdlIHRvIHVzZXIgc3BhY2UKKyAqCisgKiBAd2ltYXhfZGV2OiBXaU1BWCBkZXZpY2UgZGVzY3JpcHRvcgorICoKKyAqIEBza2I6ICZzdHJ1Y3Qgc2tfYnVmZiByZXR1cm5lZCBieSB3aW1heF9tc2dfYWxsb2MoKS4gTm90ZSB0aGUKKyAqICAgICBvd25lcnNoaXAgb2YgQHNrYiBpcyB0cmFuc2ZlcnJlZCB0byB0aGlzIGZ1bmN0aW9uLgorICoKKyAqIFJldHVybnM6IDAgaWYgb2ssIDwgMCBlcnJubyBjb2RlIG9uIGVycm9yCisgKgorICogRGVzY3JpcHRpb246CisgKgorICogU2VuZHMgYSBmcmVlLWZvcm0gbWVzc2FnZSB0aGF0IHdhcyBwcmVhbGxvY2F0ZWQgd2l0aAorICogd2ltYXhfbXNnX2FsbG9jKCkgYW5kIGZpbGxlZCB1cC4KKyAqCisgKiBBc3N1bWVzIHRoYXQgb25jZSB5b3UgcGFzcyBhbiBza2IgdG8gdGhpcyBmdW5jdGlvbiBmb3Igc2VuZGluZywgaXQKKyAqIG93bnMgaXQgYW5kIHdpbGwgcmVsZWFzZSBpdCB3aGVuIGRvbmUgKG9uIHN1Y2Nlc3MpLgorICoKKyAqIElNUE9SVEFOVDoKKyAqCisgKiBEb24ndCB1c2Ugc2tiX3B1c2goKS9za2JfcHVsbCgpL3NrYl9yZXNlcnZlKCkgb24gdGhlIHNrYiwgYXMKKyAqIHdpbWF4X21zZ19zZW5kKCkgZGVwZW5kcyBvbiBza2ItPmRhdGEgYmVpbmcgcGxhY2VkIGF0IHRoZQorICogYmVnaW5uaW5nIG9mIHRoZSB1c2VyIG1lc3NhZ2UuCisgKi8KK2ludCB3aW1heF9tc2dfc2VuZChzdHJ1Y3Qgd2ltYXhfZGV2ICp3aW1heF9kZXYsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJaW50IHJlc3VsdDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSB3aW1heF9kZXYtPm5ldF9kZXYtPmRldi5wYXJlbnQ7CisJdm9pZCAqbXNnID0gc2tiLT5kYXRhOworCXNpemVfdCBzaXplID0gc2tiLT5sZW47CisJbWlnaHRfc2xlZXAoKTsKKworCWRfcHJpbnRmKDEsIGRldiwgIkNUWDogd2ltYXggbXNnLCAlenUgYnl0ZXNcbiIsIHNpemUpOworCWRfZHVtcCgyLCBkZXYsIG1zZywgc2l6ZSk7CisJcmVzdWx0ID0gZ2VubG1zZ19tdWx0aWNhc3Qoc2tiLCAwLCB3aW1heF9nbmxfbWNnLmlkLCBHRlBfS0VSTkVMKTsKKwlkX3ByaW50ZigxLCBkZXYsICJDVFg6IGdlbmwgbXVsdGljYXN0IHJlc3VsdCAlZFxuIiwgcmVzdWx0KTsKKwlpZiAocmVzdWx0ID09IC1FU1JDSCkJLyogTm9ib2R5IGNvbm5lY3RlZCwgaWdub3JlIGl0ICovCisJCXJlc3VsdCA9IDA7CS8qIGJ0dywgdGhlIHNrYiBpcyBmcmVlZCBhbHJlYWR5ICovCisJcmV0dXJuIHJlc3VsdDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHdpbWF4X21zZ19zZW5kKTsKKworCisvKioKKyAqIHdpbWF4X21zZyAtIFNlbmQgYSBtZXNzYWdlIHRvIHVzZXIgc3BhY2UKKyAqCisgKiBAd2ltYXhfZGV2OiBXaU1BWCBkZXZpY2UgZGVzY3JpcHRvciAocHJvcGVybHkgcmVmZXJlbmNlZCkKKyAqIEBwaXBlX25hbWU6ICJuYW1lZCBwaXBlIiB0aGUgbWVzc2FnZSB3aWxsIGJlIHNlbnQgdG8KKyAqIEBidWY6IHBvaW50ZXIgdG8gdGhlIG1lc3NhZ2UgdG8gc2VuZC4KKyAqIEBzaXplOiBzaXplIG9mIHRoZSBidWZmZXIgcG9pbnRlZCB0byBieSBAYnVmIChpbiBieXRlcykuCisgKiBAZ2ZwX2ZsYWdzOiBmbGFncyBmb3IgbWVtb3J5IGFsbG9jYXRpb24uCisgKgorICogUmV0dXJuczogJTAgaWYgb2ssIG5lZ2F0aXZlIGVycm5vIGNvZGUgb24gZXJyb3IuCisgKgorICogRGVzY3JpcHRpb246CisgKgorICogU2VuZHMgYSBmcmVlLWZvcm0gbWVzc2FnZSB0byB1c2VyIHNwYWNlIG9uIHRoZSBkZXZpY2UgQHdpbWF4X2Rldi4KKyAqCisgKiBOT1RFUzoKKyAqCisgKiBPbmNlIHRoZSBAc2tiIGlzIGdpdmVuIHRvIHRoaXMgZnVuY3Rpb24sIHdobyB3aWxsIG93biBpdCBhbmQgd2lsbAorICogcmVsZWFzZSBpdCB3aGVuIGRvbmUgKHVubGVzcyBpdCByZXR1cm5zIGVycm9yKS4KKyAqLworaW50IHdpbWF4X21zZyhzdHJ1Y3Qgd2ltYXhfZGV2ICp3aW1heF9kZXYsIGNvbnN0IGNoYXIgKnBpcGVfbmFtZSwKKwkgICAgICBjb25zdCB2b2lkICpidWYsIHNpemVfdCBzaXplLCBnZnBfdCBnZnBfZmxhZ3MpCit7CisJaW50IHJlc3VsdCA9IC1FTk9NRU07CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCXNrYiA9IHdpbWF4X21zZ19hbGxvYyh3aW1heF9kZXYsIHBpcGVfbmFtZSwgYnVmLCBzaXplLCBnZnBfZmxhZ3MpOworCWlmIChza2IgPT0gTlVMTCkKKwkJZ290byBlcnJvcl9tc2dfbmV3OworCXJlc3VsdCA9IHdpbWF4X21zZ19zZW5kKHdpbWF4X2Rldiwgc2tiKTsKK2Vycm9yX21zZ19uZXc6CisJcmV0dXJuIHJlc3VsdDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHdpbWF4X21zZyk7CisKKworc3RhdGljIGNvbnN0CitzdHJ1Y3QgbmxhX3BvbGljeSB3aW1heF9nbmxfbXNnX3BvbGljeVtXSU1BWF9HTkxfQVRUUl9NQVggKyAxXSA9IHsKKwlbV0lNQVhfR05MX01TR19JRklEWF0gPSB7CisJCS50eXBlID0gTkxBX1UzMiwKKwl9LAorCVtXSU1BWF9HTkxfTVNHX0RBVEFdID0geworCQkudHlwZSA9IE5MQV9VTlNQRUMsCS8qIGxpYm5sIGRvZXNuJ3QgZ3JvayBCSU5BUlkgeWV0ICovCisJfSwKK307CisKKworLyoKKyAqIFJlbGF5cyBhIG1lc3NhZ2UgZnJvbSB1c2VyIHNwYWNlIHRvIHRoZSBkcml2ZXIKKyAqCisgKiBUaGUgc2tiIGlzIHBhc3NlZCB0byB0aGUgZHJpdmVyLXNwZWNpZmljIGZ1bmN0aW9uIHdpdGggdGhlIG5ldGxpbmsKKyAqIGFuZCBnZW5lcmljIG5ldGxpbmsgaGVhZGVycyBhbHJlYWR5IHN0cmlwcGVkLgorICoKKyAqIFRoaXMgY2FsbCB3aWxsIGJsb2NrIHdoaWxlIGhhbmRsaW5nL3JlbGF5aW5nIHRoZSBtZXNzYWdlLgorICovCitzdGF0aWMKK2ludCB3aW1heF9nbmxfZG9pdF9tc2dfZnJvbV91c2VyKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pCit7CisJaW50IHJlc3VsdCwgaWZpbmRleDsKKwlzdHJ1Y3Qgd2ltYXhfZGV2ICp3aW1heF9kZXY7CisJc3RydWN0IGRldmljZSAqZGV2OworCXN0cnVjdCBubG1zZ2hkciAqbmxoID0gaW5mby0+bmxoZHI7CisJY2hhciAqcGlwZV9uYW1lOworCXZvaWQgKm1zZ19idWY7CisJc2l6ZV90IG1zZ19sZW47CisKKwltaWdodF9zbGVlcCgpOworCWRfZm5zdGFydCgzLCBOVUxMLCAiKHNrYiAlcCBpbmZvICVwKVxuIiwgc2tiLCBpbmZvKTsKKwlyZXN1bHQgPSAtRU5PREVWOworCWlmIChpbmZvLT5hdHRyc1tXSU1BWF9HTkxfTVNHX0lGSURYXSA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAiV0lNQVhfR05MX01TR19GUk9NX1VTRVI6IGNhbid0IGZpbmQgSUZJRFggIgorCQkgICAgICAgImF0dHJpYnV0ZVxuIik7CisJCWdvdG8gZXJyb3Jfbm9fd2ltYXhfZGV2OworCX0KKwlpZmluZGV4ID0gbmxhX2dldF91MzIoaW5mby0+YXR0cnNbV0lNQVhfR05MX01TR19JRklEWF0pOworCXdpbWF4X2RldiA9IHdpbWF4X2Rldl9nZXRfYnlfZ2VubF9pbmZvKGluZm8sIGlmaW5kZXgpOworCWlmICh3aW1heF9kZXYgPT0gTlVMTCkKKwkJZ290byBlcnJvcl9ub193aW1heF9kZXY7CisJZGV2ID0gd2ltYXhfZGV2X3RvX2Rldih3aW1heF9kZXYpOworCisJLyogVW5wYWNrIGFyZ3VtZW50cyAqLworCXJlc3VsdCA9IC1FSU5WQUw7CisJaWYgKGluZm8tPmF0dHJzW1dJTUFYX0dOTF9NU0dfREFUQV0gPT0gTlVMTCkgeworCQlkZXZfZXJyKGRldiwgIldJTUFYX0dOTF9NU0dfRlJPTV9VU0VSOiBjYW4ndCBmaW5kIE1TR19EQVRBICIKKwkJCSJhdHRyaWJ1dGVcbiIpOworCQlnb3RvIGVycm9yX25vX2RhdGE7CisJfQorCW1zZ19idWYgPSBubGFfZGF0YShpbmZvLT5hdHRyc1tXSU1BWF9HTkxfTVNHX0RBVEFdKTsKKwltc2dfbGVuID0gbmxhX2xlbihpbmZvLT5hdHRyc1tXSU1BWF9HTkxfTVNHX0RBVEFdKTsKKworCWlmIChpbmZvLT5hdHRyc1tXSU1BWF9HTkxfTVNHX1BJUEVfTkFNRV0gPT0gTlVMTCkKKwkJcGlwZV9uYW1lID0gTlVMTDsKKwllbHNlIHsKKwkJc3RydWN0IG5sYXR0ciAqYXR0ciA9IGluZm8tPmF0dHJzW1dJTUFYX0dOTF9NU0dfUElQRV9OQU1FXTsKKwkJc2l6ZV90IGF0dHJfbGVuID0gbmxhX2xlbihhdHRyKTsKKwkJLyogbGlibmwtMS4xIGRvZXMgbm90IHlldCBzdXBwb3J0IE5MQV9OVUxfU1RSSU5HICovCisJCXJlc3VsdCA9IC1FTk9NRU07CisJCXBpcGVfbmFtZSA9IGtzdHJuZHVwKG5sYV9kYXRhKGF0dHIpLCBhdHRyX2xlbiArIDEsIEdGUF9LRVJORUwpOworCQlpZiAocGlwZV9uYW1lID09IE5VTEwpCisJCQlnb3RvIGVycm9yX2FsbG9jOworCQlwaXBlX25hbWVbYXR0cl9sZW5dID0gMDsKKwl9CisJbXV0ZXhfbG9jaygmd2ltYXhfZGV2LT5tdXRleCk7CisJcmVzdWx0ID0gd2ltYXhfZGV2X2lzX3JlYWR5KHdpbWF4X2Rldik7CisJaWYgKHJlc3VsdCA8IDApCisJCWdvdG8gZXJyb3Jfbm90X3JlYWR5OworCXJlc3VsdCA9IC1FTk9TWVM7CisJaWYgKHdpbWF4X2Rldi0+b3BfbXNnX2Zyb21fdXNlciA9PSBOVUxMKQorCQlnb3RvIGVycm9yX25vb3A7CisKKwlkX3ByaW50ZigxLCBkZXYsCisJCSAiQ1JYOiBubG1zZ2hkciBsZW4gJXUgdHlwZSAldSBmbGFncyAweCUwNHggc2VxIDB4JXggcGlkICV1XG4iLAorCQkgbmxoLT5ubG1zZ19sZW4sIG5saC0+bmxtc2dfdHlwZSwgbmxoLT5ubG1zZ19mbGFncywKKwkJIG5saC0+bmxtc2dfc2VxLCBubGgtPm5sbXNnX3BpZCk7CisJZF9wcmludGYoMSwgZGV2LCAiQ1JYOiB3aW1heCBtZXNzYWdlICV6dSBieXRlc1xuIiwgbXNnX2xlbik7CisJZF9kdW1wKDIsIGRldiwgbXNnX2J1ZiwgbXNnX2xlbik7CisKKwlyZXN1bHQgPSB3aW1heF9kZXYtPm9wX21zZ19mcm9tX3VzZXIod2ltYXhfZGV2LCBwaXBlX25hbWUsCisJCQkJCSAgICAgbXNnX2J1ZiwgbXNnX2xlbiwgaW5mbyk7CitlcnJvcl9ub29wOgorZXJyb3Jfbm90X3JlYWR5OgorCW11dGV4X3VubG9jaygmd2ltYXhfZGV2LT5tdXRleCk7CitlcnJvcl9hbGxvYzoKKwlrZnJlZShwaXBlX25hbWUpOworZXJyb3Jfbm9fZGF0YToKKwlkZXZfcHV0KHdpbWF4X2Rldi0+bmV0X2Rldik7CitlcnJvcl9ub193aW1heF9kZXY6CisJZF9mbmVuZCgzLCBOVUxMLCAiKHNrYiAlcCBpbmZvICVwKSA9ICVkXG4iLCBza2IsIGluZm8sIHJlc3VsdCk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworCisvKgorICogR2VuZXJpYyBOZXRsaW5rIGdsdWUKKyAqLworCitzdHJ1Y3QgZ2VubF9vcHMgd2ltYXhfZ25sX21zZ19mcm9tX3VzZXIgPSB7CisJLmNtZCA9IFdJTUFYX0dOTF9PUF9NU0dfRlJPTV9VU0VSLAorCS5mbGFncyA9IEdFTkxfQURNSU5fUEVSTSwKKwkucG9saWN5ID0gd2ltYXhfZ25sX21zZ19wb2xpY3ksCisJLmRvaXQgPSB3aW1heF9nbmxfZG9pdF9tc2dfZnJvbV91c2VyLAorCS5kdW1waXQgPSBOVUxMLAorfTsKKwpkaWZmIC0tZ2l0IGEvbmV0L3dpbWF4L29wLXJlc2V0LmMgYi9uZXQvd2ltYXgvb3AtcmVzZXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTI2OTE3Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L3dpbWF4L29wLXJlc2V0LmMKQEAgLTAsMCArMSwxNDMgQEAKKy8qCisgKiBMaW51eCBXaU1BWAorICogSW1wbGVtZW50IGFuZCBleHBvcnQgYSBtZXRob2QgZm9yIHJlc2V0dGluZyBhIFdpTUFYIGRldmljZQorICoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggSW50ZWwgQ29ycG9yYXRpb24gPGxpbnV4LXdpbWF4QGludGVsLmNvbT4KKyAqIEluYWt5IFBlcmV6LUdvbnphbGV6IDxpbmFreS5wZXJlei1nb256YWxlekBpbnRlbC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBLgorICoKKyAqCisgKiBUaGlzIGltcGxlbWVudHMgYSBzaW1wbGUgc3luY2hyb25vdXMgY2FsbCB0byByZXNldCBhIFdpTUFYIGRldmljZS4KKyAqCisgKiBSZXNldHMgYWltIGF0IGJlaW5nIHdhcm0sIGtlZXBpbmcgdGhlIGRldmljZSBoYW5kbGVzIGFjdGl2ZTsKKyAqIGhvd2V2ZXIsIHdoZW4gdGhhdCBmYWlscywgaXQgZmFsbHMgYmFjayB0byBhIGNvbGQgcmVzZXQgKHRoYXQgd2lsbAorICogZGlzY29ubmVjdCBhbmQgcmVjb25uZWN0IHRoZSBkZXZpY2UpLgorICovCisKKyNpbmNsdWRlIDxuZXQvd2ltYXguaD4KKyNpbmNsdWRlIDxuZXQvZ2VuZXRsaW5rLmg+CisjaW5jbHVkZSA8bGludXgvd2ltYXguaD4KKyNpbmNsdWRlIDxsaW51eC9zZWN1cml0eS5oPgorI2luY2x1ZGUgIndpbWF4LWludGVybmFsLmgiCisKKyNkZWZpbmUgRF9TVUJNT0RVTEUgb3BfcmVzZXQKKyNpbmNsdWRlICJkZWJ1Zy1sZXZlbHMuaCIKKworCisvKioKKyAqIHdpbWF4X3Jlc2V0IC0gUmVzZXQgYSBXaU1BWCBkZXZpY2UKKyAqCisgKiBAd2ltYXhfZGV2OiBXaU1BWCBkZXZpY2UgZGVzY3JpcHRvcgorICoKKyAqIFJldHVybnM6CisgKgorICogJTAgaWYgb2sgYW5kIGEgd2FybSByZXNldCB3YXMgZG9uZSAodGhlIGRldmljZSBzdGlsbCBleGlzdHMgaW4KKyAqIHRoZSBzeXN0ZW0pLgorICoKKyAqIC0lRU5PREVWIGlmIGEgY29sZC9idXMgcmVzZXQgaGFkIHRvIGJlIGRvbmUgKGRldmljZSBoYXMKKyAqIGRpc2Nvbm5lY3RlZCBhbmQgcmVjb25uZWN0ZWQsIHNvIGN1cnJlbnQgaGFuZGxlIGlzIG5vdCB2YWxpZAorICogYW55IG1vcmUpLgorICoKKyAqIC0lRUlOVkFMIGlmIHRoZSBkZXZpY2UgaXMgbm90IGV2ZW4gcmVnaXN0ZXJlZC4KKyAqCisgKiBBbnkgb3RoZXIgbmVnYXRpdmUgZXJyb3IgY29kZSBzaGFsbCBiZSBjb25zaWRlcmVkIGFzCisgKiBub24tcmVjb3ZlcmFibGUuCisgKgorICogRGVzY3JpcHRpb246CisgKgorICogQ2FsbGVkIHdoZW4gd2FudGluZyB0byByZXNldCB0aGUgZGV2aWNlIGZvciBhbnkgcmVhc29uLiBEZXZpY2UgaXMKKyAqIHRha2VuIGJhY2sgdG8gcG93ZXIgb24gc3RhdHVzLgorICoKKyAqIFRoaXMgY2FsbCBibG9ja3M7IG9uIHN1Y2Nlc2Z1bCByZXR1cm4sIHRoZSBkZXZpY2UgaGFzIGNvbXBsZXRlZCB0aGUKKyAqIHJlc2V0IHByb2Nlc3MgYW5kIGlzIHJlYWR5IHRvIG9wZXJhdGUuCisgKi8KK2ludCB3aW1heF9yZXNldChzdHJ1Y3Qgd2ltYXhfZGV2ICp3aW1heF9kZXYpCit7CisJaW50IHJlc3VsdCA9IC1FSU5WQUw7CisJc3RydWN0IGRldmljZSAqZGV2ID0gd2ltYXhfZGV2X3RvX2Rldih3aW1heF9kZXYpOworCWVudW0gd2ltYXhfc3Qgc3RhdGU7CisKKwltaWdodF9zbGVlcCgpOworCWRfZm5zdGFydCgzLCBkZXYsICIod2ltYXhfZGV2ICVwKVxuIiwgd2ltYXhfZGV2KTsKKwltdXRleF9sb2NrKCZ3aW1heF9kZXYtPm11dGV4KTsKKwlkZXZfaG9sZCh3aW1heF9kZXYtPm5ldF9kZXYpOworCXN0YXRlID0gd2ltYXhfZGV2LT5zdGF0ZTsKKwltdXRleF91bmxvY2soJndpbWF4X2Rldi0+bXV0ZXgpOworCisJaWYgKHN0YXRlID49IFdJTUFYX1NUX0RPV04pIHsKKwkJbXV0ZXhfbG9jaygmd2ltYXhfZGV2LT5tdXRleF9yZXNldCk7CisJCXJlc3VsdCA9IHdpbWF4X2Rldi0+b3BfcmVzZXQod2ltYXhfZGV2KTsKKwkJbXV0ZXhfdW5sb2NrKCZ3aW1heF9kZXYtPm11dGV4X3Jlc2V0KTsKKwl9CisJZGV2X3B1dCh3aW1heF9kZXYtPm5ldF9kZXYpOworCisJZF9mbmVuZCgzLCBkZXYsICIod2ltYXhfZGV2ICVwKSA9ICVkXG4iLCB3aW1heF9kZXYsIHJlc3VsdCk7CisJcmV0dXJuIHJlc3VsdDsKK30KK0VYUE9SVF9TWU1CT0wod2ltYXhfcmVzZXQpOworCisKK3N0YXRpYyBjb25zdAorc3RydWN0IG5sYV9wb2xpY3kgd2ltYXhfZ25sX3Jlc2V0X3BvbGljeVtXSU1BWF9HTkxfQVRUUl9NQVggKyAxXSA9IHsKKwlbV0lNQVhfR05MX1JFU0VUX0lGSURYXSA9IHsKKwkJLnR5cGUgPSBOTEFfVTMyLAorCX0sCit9OworCisKKy8qCisgKiBFeHBvcnRpbmcgdG8gdXNlciBzcGFjZSBvdmVyIGdlbmVyaWMgbmV0bGluaworICoKKyAqIFBhcnNlIHRoZSByZXNldCBjb21tYW5kIGZyb20gdXNlciBzcGFjZSwgcmV0dXJuIGVycm9yIGNvZGUuCisgKgorICogTm8gYXR0cmlidXRlcy4KKyAqLworc3RhdGljCitpbnQgd2ltYXhfZ25sX2RvaXRfcmVzZXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGdlbmxfaW5mbyAqaW5mbykKK3sKKwlpbnQgcmVzdWx0LCBpZmluZGV4OworCXN0cnVjdCB3aW1heF9kZXYgKndpbWF4X2RldjsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisKKwlkX2Zuc3RhcnQoMywgTlVMTCwgIihza2IgJXAgaW5mbyAlcClcbiIsIHNrYiwgaW5mbyk7CisJcmVzdWx0ID0gLUVOT0RFVjsKKwlpZiAoaW5mby0+YXR0cnNbV0lNQVhfR05MX1JFU0VUX0lGSURYXSA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAiV0lNQVhfR05MX09QX1JGS0lMTDogY2FuJ3QgZmluZCBJRklEWCAiCisJCQkiYXR0cmlidXRlXG4iKTsKKwkJZ290byBlcnJvcl9ub193aW1heF9kZXY7CisJfQorCWlmaW5kZXggPSBubGFfZ2V0X3UzMihpbmZvLT5hdHRyc1tXSU1BWF9HTkxfUkVTRVRfSUZJRFhdKTsKKwl3aW1heF9kZXYgPSB3aW1heF9kZXZfZ2V0X2J5X2dlbmxfaW5mbyhpbmZvLCBpZmluZGV4KTsKKwlpZiAod2ltYXhfZGV2ID09IE5VTEwpCisJCWdvdG8gZXJyb3Jfbm9fd2ltYXhfZGV2OworCWRldiA9IHdpbWF4X2Rldl90b19kZXYod2ltYXhfZGV2KTsKKwkvKiBFeGVjdXRlIHRoZSBvcGVyYXRpb24gYW5kIHNlbmQgdGhlIHJlc3VsdCBiYWNrIHRvIHVzZXIgc3BhY2UgKi8KKwlyZXN1bHQgPSB3aW1heF9yZXNldCh3aW1heF9kZXYpOworCWRldl9wdXQod2ltYXhfZGV2LT5uZXRfZGV2KTsKK2Vycm9yX25vX3dpbWF4X2RldjoKKwlkX2ZuZW5kKDMsIE5VTEwsICIoc2tiICVwIGluZm8gJXApID0gJWRcbiIsIHNrYiwgaW5mbywgcmVzdWx0KTsKKwlyZXR1cm4gcmVzdWx0OworfQorCisKK3N0cnVjdCBnZW5sX29wcyB3aW1heF9nbmxfcmVzZXQgPSB7CisJLmNtZCA9IFdJTUFYX0dOTF9PUF9SRVNFVCwKKwkuZmxhZ3MgPSBHRU5MX0FETUlOX1BFUk0sCisJLnBvbGljeSA9IHdpbWF4X2dubF9yZXNldF9wb2xpY3ksCisJLmRvaXQgPSB3aW1heF9nbmxfZG9pdF9yZXNldCwKKwkuZHVtcGl0ID0gTlVMTCwKK307CmRpZmYgLS1naXQgYS9uZXQvd2ltYXgvb3AtcmZraWxsLmMgYi9uZXQvd2ltYXgvb3AtcmZraWxsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmI3NWFlZQotLS0gL2Rldi9udWxsCisrKyBiL25ldC93aW1heC9vcC1yZmtpbGwuYwpAQCAtMCwwICsxLDUzMiBAQAorLyoKKyAqIExpbnV4IFdpTUFYCisgKiBSRi1raWxsIGZyYW1ld29yayBpbnRlZ3JhdGlvbgorICoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggSW50ZWwgQ29ycG9yYXRpb24gPGxpbnV4LXdpbWF4QGludGVsLmNvbT4KKyAqIEluYWt5IFBlcmV6LUdvbnphbGV6IDxpbmFreS5wZXJlei1nb256YWxlekBpbnRlbC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBLgorICoKKyAqCisgKiBUaGlzIGludGVncmF0ZXMgaW50byB0aGUgTGludXggS2VybmVsIHJma2lsbCBzdXNieXN0ZW0gc28gdGhhdCB0aGUKKyAqIGRyaXZlcnMganVzdCBoYXZlIHRvIGRvIHRoZSBiYXJlIG1pbmltYWwgd29yaywgd2hpY2ggaXMgcHJvdmlkaW5nIGEKKyAqIG1ldGhvZCB0byBzZXQgdGhlIHNvZnR3YXJlIFJGLUtpbGwgc3dpdGNoIGFuZCB0byByZXBvcnQgY2hhbmdlcyBpbgorICogdGhlIHNvZnR3YXJlIGFuZCBoYXJkd2FyZSBzd2l0Y2ggc3RhdHVzLgorICoKKyAqIEEgbm9uLXBvbGxlZCBnZW5lcmljIHJma2lsbCBkZXZpY2UgaXMgZW1iZWRkZWQgaW50byB0aGUgV2lNQVgKKyAqIHN1YnN5c3RlbSdzIHJlcHJlc2VudGF0aW9uIG9mIGEgZGV2aWNlLgorICoKKyAqIEZJWE1FOiBOZWVkIHBvbGxlZCBzdXBwb3J0PyB1c2UgYSB0aW1lciBvciBhZGQgdGhlIGltcGxlbWVudGF0aW9uCisgKiAgICAgdG8gdGhlIHN0YWNrLgorICoKKyAqIEFsbCBkZXZpY2UgZHJpdmVycyBoYXZlIHRvIGRvIGlzIGFmdGVyIHdpbWF4X2Rldl9pbml0KCksIGNhbGwKKyAqIHdpbWF4X3JlcG9ydF9yZmtpbGxfaHcoKSBhbmQgd2ltYXhfcmVwb3J0X3Jma2lsbF9zdygpIHRvIHVwZGF0ZQorICogaW5pdGlhbCBzdGF0ZSBhbmQgdGhlbiBldmVyeSB0aW1lIGl0IGNoYW5nZXMuIFNlZSB3aW1heC5oOnN0cnVjdAorICogd2ltYXhfZGV2IGZvciBtb3JlIGluZm9ybWF0aW9uLgorICoKKyAqIFJPQURNQVAKKyAqCisgKiB3aW1heF9nbmxfZG9pdF9yZmtpbGwoKSAgICAgIFVzZXIgc3BhY2UgY2FsbGluZyB3aW1heF9yZmtpbGwoKQorICogICB3aW1heF9yZmtpbGwoKSAgICAgICAgICAgICBLZXJuZWwgY2FsbGluZyB3aW1heF9yZmtpbGwoKQorICogICAgIF9fd2ltYXhfcmZfdG9nZ2xlX3JhZGlvKCkKKyAqCisgKiB3aW1heF9yZmtpbGxfdG9nZ2xlX3JhZGlvKCkgIFJGLUtpbGwgc3Vic3l0ZW0gY2FsbGluZworICogICBfX3dpbWF4X3JmX3RvZ2dsZV9yYWRpbygpCisgKgorICogX193aW1heF9yZl90b2dnbGVfcmFkaW8oKQorICogICB3aW1heF9kZXYtPm9wX3Jma2lsbF9zd190b2dnbGUoKSBEcml2ZXIgYmFja2VuZAorICogICBfX3dpbWF4X3N0YXRlX2NoYW5nZSgpCisgKgorICogd2ltYXhfcmVwb3J0X3Jma2lsbF9zdygpICAgICBEcml2ZXIgcmVwb3J0cyBzdGF0ZSBjaGFuZ2UKKyAqICAgX193aW1heF9zdGF0ZV9jaGFuZ2UoKQorICoKKyAqIHdpbWF4X3JlcG9ydF9yZmtpbGxfaHcoKSAgICAgRHJpdmVyIHJlcG9ydHMgc3RhdGUgY2hhbmdlCisgKiAgIF9fd2ltYXhfc3RhdGVfY2hhbmdlKCkKKyAqCisgKiB3aW1heF9yZmtpbGxfYWRkKCkgICAgICAgICAgIEluaXRpYWxpemUvc2h1dGRvd24gcmZraWxsIHN1cHBvcnQKKyAqIHdpbWF4X3Jma2lsbF9ybSgpICAgICAgICAgICAgW2NhbGxlZCBieSB3aW1heF9kZXZfYWRkL3JtKCldCisgKi8KKworI2luY2x1ZGUgPG5ldC93aW1heC5oPgorI2luY2x1ZGUgPG5ldC9nZW5ldGxpbmsuaD4KKyNpbmNsdWRlIDxsaW51eC93aW1heC5oPgorI2luY2x1ZGUgPGxpbnV4L3NlY3VyaXR5Lmg+CisjaW5jbHVkZSA8bGludXgvcmZraWxsLmg+CisjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KKyNpbmNsdWRlICJ3aW1heC1pbnRlcm5hbC5oIgorCisjZGVmaW5lIERfU1VCTU9EVUxFIG9wX3Jma2lsbAorI2luY2x1ZGUgImRlYnVnLWxldmVscy5oIgorCisjaWYgZGVmaW5lZChDT05GSUdfUkZLSUxMKSB8fCBkZWZpbmVkKENPTkZJR19SRktJTExfTU9EVUxFKQorCisKKy8qKgorICogd2ltYXhfcmVwb3J0X3Jma2lsbF9odyAtIFJlcG9ydHMgY2hhbmdlcyBpbiB0aGUgaGFyZHdhcmUgUkYgc3dpdGNoCisgKgorICogQHdpbWF4X2RldjogV2lNQVggZGV2aWNlIGRlc2NyaXB0b3IKKyAqCisgKiBAc3RhdGU6IE5ldyBzdGF0ZSBvZiB0aGUgUkYgS2lsbCBzd2l0Y2guICVXSU1BWF9SRl9PTiByYWRpbyBvbiwKKyAqICAgICAlV0lNQVhfUkZfT0ZGIHJhZGlvIG9mZi4KKyAqCisgKiBXaGVuIHRoZSBkZXZpY2UgZGV0ZWN0cyBhIGNoYW5nZSBpbiB0aGUgc3RhdGUgb2YgdGhlaGFyZHdhcmUgUkYKKyAqIHN3aXRjaCwgaXQgbXVzdCBjYWxsIHRoaXMgZnVuY3Rpb24gdG8gbGV0IHRoZSBXaU1BWCBrZXJuZWwgc3RhY2sKKyAqIGtub3cgdGhhdCB0aGUgc3RhdGUgaGFzIGNoYW5nZWQgc28gaXQgY2FuIGJlIHByb3Blcmx5IHByb3BhZ2F0ZWQuCisgKgorICogVGhlIFdpTUFYIHN0YWNrIGNhY2hlcyB0aGUgc3RhdGUgKHRoZSBkcml2ZXIgZG9lc24ndCBuZWVkIHRvKS4gQXMKKyAqIHdlbGwsIGFzIHRoZSBjaGFuZ2UgaXMgcHJvcGFnYXRlZCBpdCB3aWxsIGNvbWUgYmFjayBhcyBhIHJlcXVlc3QgdG8KKyAqIGNoYW5nZSB0aGUgc29mdHdhcmUgc3RhdGUgdG8gbWlycm9yIHRoZSBoYXJkd2FyZSBzdGF0ZS4KKyAqCisgKiBJZiB0aGUgZGV2aWNlIGRvZXNuJ3QgaGF2ZSBhIGhhcmR3YXJlIGtpbGwgc3dpdGNoLCBqdXN0IHJlcG9ydAorICogaXQgb24gaW5pdGlhbGl6YXRpb24gYXMgYWx3YXlzIG9uICglV0lNQVhfUkZfT04sIHJhZGlvIG9uKS4KKyAqLwordm9pZCB3aW1heF9yZXBvcnRfcmZraWxsX2h3KHN0cnVjdCB3aW1heF9kZXYgKndpbWF4X2RldiwKKwkJCSAgICBlbnVtIHdpbWF4X3JmX3N0YXRlIHN0YXRlKQoreworCWludCByZXN1bHQ7CisJc3RydWN0IGRldmljZSAqZGV2ID0gd2ltYXhfZGV2X3RvX2Rldih3aW1heF9kZXYpOworCWVudW0gd2ltYXhfc3Qgd2ltYXhfc3RhdGU7CisJZW51bSByZmtpbGxfc3RhdGUgcmZraWxsX3N0YXRlOworCisJZF9mbnN0YXJ0KDMsIGRldiwgIih3aW1heF9kZXYgJXAgc3RhdGUgJXUpXG4iLCB3aW1heF9kZXYsIHN0YXRlKTsKKwlCVUdfT04oc3RhdGUgPT0gV0lNQVhfUkZfUVVFUlkpOworCUJVR19PTihzdGF0ZSAhPSBXSU1BWF9SRl9PTiAmJiBzdGF0ZSAhPSBXSU1BWF9SRl9PRkYpOworCisJbXV0ZXhfbG9jaygmd2ltYXhfZGV2LT5tdXRleCk7CisJcmVzdWx0ID0gd2ltYXhfZGV2X2lzX3JlYWR5KHdpbWF4X2Rldik7CisJaWYgKHJlc3VsdCA8IDApCisJCWdvdG8gZXJyb3Jfbm90X3JlYWR5OworCisJaWYgKHN0YXRlICE9IHdpbWF4X2Rldi0+cmZfaHcpIHsKKwkJd2ltYXhfZGV2LT5yZl9odyA9IHN0YXRlOworCQlyZmtpbGxfc3RhdGUgPSBzdGF0ZSA9PSBXSU1BWF9SRl9PTiA/CisJCQlSRktJTExfU1RBVEVfT0ZGIDogUkZLSUxMX1NUQVRFX09OOworCQlpZiAod2ltYXhfZGV2LT5yZl9odyA9PSBXSU1BWF9SRl9PTgorCQkgICAgJiYgd2ltYXhfZGV2LT5yZl9zdyA9PSBXSU1BWF9SRl9PTikKKwkJCXdpbWF4X3N0YXRlID0gV0lNQVhfU1RfUkVBRFk7CisJCWVsc2UKKwkJCXdpbWF4X3N0YXRlID0gV0lNQVhfU1RfUkFESU9fT0ZGOworCQlfX3dpbWF4X3N0YXRlX2NoYW5nZSh3aW1heF9kZXYsIHdpbWF4X3N0YXRlKTsKKwkJaW5wdXRfcmVwb3J0X2tleSh3aW1heF9kZXYtPnJma2lsbF9pbnB1dCwgS0VZX1dJTUFYLAorCQkJCSByZmtpbGxfc3RhdGUpOworCX0KK2Vycm9yX25vdF9yZWFkeToKKwltdXRleF91bmxvY2soJndpbWF4X2Rldi0+bXV0ZXgpOworCWRfZm5lbmQoMywgZGV2LCAiKHdpbWF4X2RldiAlcCBzdGF0ZSAldSkgPSB2b2lkIFslZF1cbiIsCisJCXdpbWF4X2Rldiwgc3RhdGUsIHJlc3VsdCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh3aW1heF9yZXBvcnRfcmZraWxsX2h3KTsKKworCisvKioKKyAqIHdpbWF4X3JlcG9ydF9yZmtpbGxfc3cgLSBSZXBvcnRzIGNoYW5nZXMgaW4gdGhlIHNvZnR3YXJlIFJGIHN3aXRjaAorICoKKyAqIEB3aW1heF9kZXY6IFdpTUFYIGRldmljZSBkZXNjcmlwdG9yCisgKgorICogQHN0YXRlOiBOZXcgc3RhdGUgb2YgdGhlIFJGIGtpbGwgc3dpdGNoLiAlV0lNQVhfUkZfT04gcmFkaW8gb24sCisgKiAgICAgJVdJTUFYX1JGX09GRiByYWRpbyBvZmYuCisgKgorICogUmVwb3J0cyBjaGFuZ2VzIGluIHRoZSBzb2Z0d2FyZSBSRiBzd2l0Y2ggc3RhdGUgdG8gdGhlIHRoZSBXaU1BWAorICogc3RhY2suCisgKgorICogVGhlIG1haW4gdXNlIGlzIGR1cmluZyBpbml0aWFsaXphdGlvbiwgc28gdGhlIGRyaXZlciBjYW4gcXVlcnkgdGhlCisgKiBkZXZpY2UgZm9yIGl0cyBjdXJyZW50IHNvZnR3YXJlIHJhZGlvIGtpbGwgc3dpdGNoIHN0YXRlIGFuZCBmZWVkIGl0CisgKiB0byB0aGUgc3lzdGVtLgorICoKKyAqIE9uIHRoZSBzaWRlLCB0aGUgZGV2aWNlIGRvZXMgbm90IGNoYW5nZSB0aGUgc29mdHdhcmUgc3RhdGUgYnkKKyAqIGl0c2VsZi4gSW4gcHJhY3RpY2UsIHRoaXMgY2FuIGhhcHBlbiwgYXMgdGhlIGRldmljZSBtaWdodCBkZWNpZGUgdG8KKyAqIHN3aXRjaCAoaW4gc29mdHdhcmUpIHRoZSByYWRpbyBvZmYgZm9yIGRpZmZlcmVudCByZWFzb25zLgorICovCit2b2lkIHdpbWF4X3JlcG9ydF9yZmtpbGxfc3coc3RydWN0IHdpbWF4X2RldiAqd2ltYXhfZGV2LAorCQkJICAgIGVudW0gd2ltYXhfcmZfc3RhdGUgc3RhdGUpCit7CisJaW50IHJlc3VsdDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSB3aW1heF9kZXZfdG9fZGV2KHdpbWF4X2Rldik7CisJZW51bSB3aW1heF9zdCB3aW1heF9zdGF0ZTsKKworCWRfZm5zdGFydCgzLCBkZXYsICIod2ltYXhfZGV2ICVwIHN0YXRlICV1KVxuIiwgd2ltYXhfZGV2LCBzdGF0ZSk7CisJQlVHX09OKHN0YXRlID09IFdJTUFYX1JGX1FVRVJZKTsKKwlCVUdfT04oc3RhdGUgIT0gV0lNQVhfUkZfT04gJiYgc3RhdGUgIT0gV0lNQVhfUkZfT0ZGKTsKKworCW11dGV4X2xvY2soJndpbWF4X2Rldi0+bXV0ZXgpOworCXJlc3VsdCA9IHdpbWF4X2Rldl9pc19yZWFkeSh3aW1heF9kZXYpOworCWlmIChyZXN1bHQgPCAwKQorCQlnb3RvIGVycm9yX25vdF9yZWFkeTsKKworCWlmIChzdGF0ZSAhPSB3aW1heF9kZXYtPnJmX3N3KSB7CisJCXdpbWF4X2Rldi0+cmZfc3cgPSBzdGF0ZTsKKwkJaWYgKHdpbWF4X2Rldi0+cmZfaHcgPT0gV0lNQVhfUkZfT04KKwkJICAgICYmIHdpbWF4X2Rldi0+cmZfc3cgPT0gV0lNQVhfUkZfT04pCisJCQl3aW1heF9zdGF0ZSA9IFdJTUFYX1NUX1JFQURZOworCQllbHNlCisJCQl3aW1heF9zdGF0ZSA9IFdJTUFYX1NUX1JBRElPX09GRjsKKwkJX193aW1heF9zdGF0ZV9jaGFuZ2Uod2ltYXhfZGV2LCB3aW1heF9zdGF0ZSk7CisJfQorZXJyb3Jfbm90X3JlYWR5OgorCW11dGV4X3VubG9jaygmd2ltYXhfZGV2LT5tdXRleCk7CisJZF9mbmVuZCgzLCBkZXYsICIod2ltYXhfZGV2ICVwIHN0YXRlICV1KSA9IHZvaWQgWyVkXVxuIiwKKwkJd2ltYXhfZGV2LCBzdGF0ZSwgcmVzdWx0KTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHdpbWF4X3JlcG9ydF9yZmtpbGxfc3cpOworCisKKy8qCisgKiBDYWxsYmFjayBmb3IgdGhlIFJGIEtpbGwgdG9nZ2xlIG9wZXJhdGlvbgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5OgorICoKKyAqIC0gVGhlIHJma2lsbCBzdWJzeXN0ZW0gd2hlbiB0aGUgUkYtS2lsbCBrZXkgaXMgcHJlc3NlZCBpbiB0aGUKKyAqICAgaGFyZHdhcmUgYW5kIHRoZSBkcml2ZXIgbm90aWZpZXMgdGhyb3VnaAorICogICB3aW1heF9yZXBvcnRfcmZraWxsX2h3KCkuIFRoZSByZmtpbGwgc3Vic3lzdGVtIGVuZHMgdXAgY2FsbGluZyBiYWNrCisgKiAgIGhlcmUgc28gdGhlIHNvZnR3YXJlIFJGIEtpbGwgc3dpdGNoIHN0YXRlIGlzIGNoYW5nZWQgdG8gcmVmbGVjdAorICogICB0aGUgaGFyZHdhcmUgc3dpdGNoIHN0YXRlLgorICoKKyAqIC0gV2hlbiB0aGUgdXNlciBzZXRzIHRoZSBzdGF0ZSB0aHJvdWdoIHN5c2ZzJyByZmtpbGwvc3RhdGUgZmlsZQorICoKKyAqIC0gV2hlbiB0aGUgdXNlciBjYWxscyB3aW1heF9yZmtpbGwoKS4KKyAqCisgKiBUaGlzIGNhbGwgYmxvY2tzIQorICoKKyAqIFdBUk5JTkchIFdoZW4gd2UgY2FsbCByZmtpbGxfdW5yZWdpc3RlcigpLCB0aGlzIHdpbGwgYmUgY2FsbGVkIHdpdGgKKyAqIHN0YXRlIDAhCisgKgorICogV0FSTklORzogd2ltYXhfZGV2IG11c3QgYmUgbG9ja2VkCisgKi8KK3N0YXRpYworaW50IF9fd2ltYXhfcmZfdG9nZ2xlX3JhZGlvKHN0cnVjdCB3aW1heF9kZXYgKndpbWF4X2RldiwKKwkJCSAgICBlbnVtIHdpbWF4X3JmX3N0YXRlIHN0YXRlKQoreworCWludCByZXN1bHQgPSAwOworCXN0cnVjdCBkZXZpY2UgKmRldiA9IHdpbWF4X2Rldl90b19kZXYod2ltYXhfZGV2KTsKKwllbnVtIHdpbWF4X3N0IHdpbWF4X3N0YXRlOworCisJbWlnaHRfc2xlZXAoKTsKKwlkX2Zuc3RhcnQoMywgZGV2LCAiKHdpbWF4X2RldiAlcCBzdGF0ZSAldSlcbiIsIHdpbWF4X2Rldiwgc3RhdGUpOworCWlmICh3aW1heF9kZXYtPnJmX3N3ID09IHN0YXRlKQorCQlnb3RvIG91dF9ub19jaGFuZ2U7CisJaWYgKHdpbWF4X2Rldi0+b3BfcmZraWxsX3N3X3RvZ2dsZSAhPSBOVUxMKQorCQlyZXN1bHQgPSB3aW1heF9kZXYtPm9wX3Jma2lsbF9zd190b2dnbGUod2ltYXhfZGV2LCBzdGF0ZSk7CisJZWxzZSBpZiAoc3RhdGUgPT0gV0lNQVhfUkZfT0ZGKQkvKiBObyBvcD8gY2FuJ3QgdHVybiBvZmYgKi8KKwkJcmVzdWx0ID0gLUVOWElPOworCWVsc2UJCQkJLyogTm8gb3A/IGNhbiB0dXJuIG9uICovCisJCXJlc3VsdCA9IDA7CQkvKiBzaG91bGQgbmV2ZXIgaGFwcGVuIHRobyAqLworCWlmIChyZXN1bHQgPj0gMCkgeworCQlyZXN1bHQgPSAwOworCQl3aW1heF9kZXYtPnJmX3N3ID0gc3RhdGU7CisJCXdpbWF4X3N0YXRlID0gc3RhdGUgPT0gV0lNQVhfUkZfT04gPworCQkJV0lNQVhfU1RfUkVBRFkgOiBXSU1BWF9TVF9SQURJT19PRkY7CisJCV9fd2ltYXhfc3RhdGVfY2hhbmdlKHdpbWF4X2Rldiwgd2ltYXhfc3RhdGUpOworCX0KK291dF9ub19jaGFuZ2U6CisJZF9mbmVuZCgzLCBkZXYsICIod2ltYXhfZGV2ICVwIHN0YXRlICV1KSA9ICVkXG4iLAorCQl3aW1heF9kZXYsIHN0YXRlLCByZXN1bHQpOworCXJldHVybiByZXN1bHQ7Cit9CisKKworLyoKKyAqIFRyYW5zbGF0ZSBmcm9tIHJma2lsbCBzdGF0ZSB0byB3aW1heCBzdGF0ZQorICoKKyAqIE5PVEU6IFNwZWNpYWwgc3RhdGUgaGFuZGxpbmcgcnVsZXMgaGVyZQorICoKKyAqICAgICBKdXN0IHByZXRlbmQgdGhlIGNhbGwgZGlkbid0IGhhcHBlbiBpZiB3ZSBhcmUgaW4gYSBzdGF0ZSB3aGVyZQorICogICAgIHdlIGtub3cgZm9yIHN1cmUgaXQgY2Fubm90IGJlIGhhbmRsZWQgKFdJTUFYX1NUX0RPV04gb3IKKyAqICAgICBfX1dJTUFYX1NUX1FVSUVTQ0lORykuIHJma2lsbCgpIG5lZWRzIGl0IHRvIHJlZ2lzdGVyIGFuZAorICogICAgIHVucmVnaXN0ZXIsIGFzIGl0IHdpbGwgcnVuIHRoaXMgcGF0aC4KKyAqCisgKiBOT1RFOiBUaGlzIGNhbGwgd2lsbCBibG9jayB1bnRpbCB0aGUgb3BlcmF0aW9uIGlzIGNvbXBsZXRlZC4KKyAqLworc3RhdGljCitpbnQgd2ltYXhfcmZraWxsX3RvZ2dsZV9yYWRpbyh2b2lkICpkYXRhLCBlbnVtIHJma2lsbF9zdGF0ZSBzdGF0ZSkKK3sKKwlpbnQgcmVzdWx0OworCXN0cnVjdCB3aW1heF9kZXYgKndpbWF4X2RldiA9IGRhdGE7CisJc3RydWN0IGRldmljZSAqZGV2ID0gd2ltYXhfZGV2X3RvX2Rldih3aW1heF9kZXYpOworCWVudW0gd2ltYXhfcmZfc3RhdGUgcmZfc3RhdGU7CisKKwlkX2Zuc3RhcnQoMywgZGV2LCAiKHdpbWF4X2RldiAlcCBzdGF0ZSAldSlcbiIsIHdpbWF4X2Rldiwgc3RhdGUpOworCXN3aXRjaCAoc3RhdGUpIHsKKwljYXNlIFJGS0lMTF9TVEFURV9PTjoKKwkJcmZfc3RhdGUgPSBXSU1BWF9SRl9PRkY7CisJCWJyZWFrOworCWNhc2UgUkZLSUxMX1NUQVRFX09GRjoKKwkJcmZfc3RhdGUgPSBXSU1BWF9SRl9PTjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQlVHKCk7CisJfQorCW11dGV4X2xvY2soJndpbWF4X2Rldi0+bXV0ZXgpOworCWlmICh3aW1heF9kZXYtPnN0YXRlIDw9IF9fV0lNQVhfU1RfUVVJRVNDSU5HKQorCQlyZXN1bHQgPSAwOwkvKiBqdXN0IHByZXRlbmQgaXQgZGlkbid0IGhhcHBlbiAqLworCWVsc2UKKwkJcmVzdWx0ID0gX193aW1heF9yZl90b2dnbGVfcmFkaW8od2ltYXhfZGV2LCByZl9zdGF0ZSk7CisJbXV0ZXhfdW5sb2NrKCZ3aW1heF9kZXYtPm11dGV4KTsKKwlkX2ZuZW5kKDMsIGRldiwgIih3aW1heF9kZXYgJXAgc3RhdGUgJXUpID0gJWRcbiIsCisJCXdpbWF4X2Rldiwgc3RhdGUsIHJlc3VsdCk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworCisvKioKKyAqIHdpbWF4X3Jma2lsbCAtIFNldCB0aGUgc29mdHdhcmUgUkYgc3dpdGNoIHN0YXRlIGZvciBhIFdpTUFYIGRldmljZQorICoKKyAqIEB3aW1heF9kZXY6IFdpTUFYIGRldmljZSBkZXNjcmlwdG9yCisgKgorICogQHN0YXRlOiBOZXcgUkYgc3RhdGUuCisgKgorICogUmV0dXJuczoKKyAqCisgKiA+PSAwIHRvZ2dsZSBzdGF0ZSBpZiBvaywgPCAwIGVycm5vIGNvZGUgb24gZXJyb3IuIFRoZSB0b2dnbGUgc3RhdGUKKyAqIGlzIHJldHVybmVkIGFzIGEgYml0bWFwLCBiaXQgMCBiZWluZyB0aGUgaGFyZHdhcmUgUkYgc3RhdGUsIGJpdCAxCisgKiB0aGUgc29mdHdhcmUgUkYgc3RhdGUuCisgKgorICogMCBtZWFucyBkaXNhYmxlZCAoJVdJTUFYX1JGX09OLCByYWRpbyBvbiksIDEgbWVhbnMgZW5hYmxlZCByYWRpbworICogb2ZmICglV0lNQVhfUkZfT0ZGKS4KKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCisgKiBDYWxsZWQgYnkgdGhlIHVzZXIgd2hlbiBoZSB3YW50cyB0byByZXF1ZXN0IHRoZSBXaU1BWCByYWRpbyB0byBiZQorICogc3dpdGNoZWQgb24gKCVXSU1BWF9SRl9PTikgb3Igb2ZmICglV0lNQVhfUkZfT0ZGKS4gV2l0aAorICogJVdJTUFYX1JGX1FVRVJZLCBqdXN0IHRoZSBjdXJyZW50IHN0YXRlIGlzIHJldHVybmVkLgorICoKKyAqIE5PVEU6CisgKgorICogVGhpcyBjYWxsIHdpbGwgYmxvY2sgdW50aWwgdGhlIG9wZXJhdGlvbiBpcyBjb21wbGV0ZS4KKyAqLworaW50IHdpbWF4X3Jma2lsbChzdHJ1Y3Qgd2ltYXhfZGV2ICp3aW1heF9kZXYsIGVudW0gd2ltYXhfcmZfc3RhdGUgc3RhdGUpCit7CisJaW50IHJlc3VsdDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSB3aW1heF9kZXZfdG9fZGV2KHdpbWF4X2Rldik7CisKKwlkX2Zuc3RhcnQoMywgZGV2LCAiKHdpbWF4X2RldiAlcCBzdGF0ZSAldSlcbiIsIHdpbWF4X2Rldiwgc3RhdGUpOworCW11dGV4X2xvY2soJndpbWF4X2Rldi0+bXV0ZXgpOworCXJlc3VsdCA9IHdpbWF4X2Rldl9pc19yZWFkeSh3aW1heF9kZXYpOworCWlmIChyZXN1bHQgPCAwKQorCQlnb3RvIGVycm9yX25vdF9yZWFkeTsKKwlzd2l0Y2ggKHN0YXRlKSB7CisJY2FzZSBXSU1BWF9SRl9PTjoKKwljYXNlIFdJTUFYX1JGX09GRjoKKwkJcmVzdWx0ID0gX193aW1heF9yZl90b2dnbGVfcmFkaW8od2ltYXhfZGV2LCBzdGF0ZSk7CisJCWlmIChyZXN1bHQgPCAwKQorCQkJZ290byBlcnJvcjsKKwkJYnJlYWs7CisJY2FzZSBXSU1BWF9SRl9RVUVSWToKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmVzdWx0ID0gLUVJTlZBTDsKKwkJZ290byBlcnJvcjsKKwl9CisJcmVzdWx0ID0gd2ltYXhfZGV2LT5yZl9zdyA8PCAxIHwgd2ltYXhfZGV2LT5yZl9odzsKK2Vycm9yOgorZXJyb3Jfbm90X3JlYWR5OgorCW11dGV4X3VubG9jaygmd2ltYXhfZGV2LT5tdXRleCk7CisJZF9mbmVuZCgzLCBkZXYsICIod2ltYXhfZGV2ICVwIHN0YXRlICV1KSA9ICVkXG4iLAorCQl3aW1heF9kZXYsIHN0YXRlLCByZXN1bHQpOworCXJldHVybiByZXN1bHQ7Cit9CitFWFBPUlRfU1lNQk9MKHdpbWF4X3Jma2lsbCk7CisKKworLyoKKyAqIFJlZ2lzdGVyIGEgbmV3IFdpTUFYIGRldmljZSdzIFJGIEtpbGwgc3VwcG9ydAorICoKKyAqIFdBUk5JTkc6IHdpbWF4X2Rldi0+bXV0ZXggbXVzdCBiZSB1bmxvY2tlZAorICovCitpbnQgd2ltYXhfcmZraWxsX2FkZChzdHJ1Y3Qgd2ltYXhfZGV2ICp3aW1heF9kZXYpCit7CisJaW50IHJlc3VsdDsKKwlzdHJ1Y3QgcmZraWxsICpyZmtpbGw7CisJc3RydWN0IGlucHV0X2RldiAqaW5wdXRfZGV2OworCXN0cnVjdCBkZXZpY2UgKmRldiA9IHdpbWF4X2Rldl90b19kZXYod2ltYXhfZGV2KTsKKworCWRfZm5zdGFydCgzLCBkZXYsICIod2ltYXhfZGV2ICVwKVxuIiwgd2ltYXhfZGV2KTsKKwkvKiBJbml0aWFsaXplIFJGIEtpbGwgKi8KKwlyZXN1bHQgPSAtRU5PTUVNOworCXJma2lsbCA9IHJma2lsbF9hbGxvY2F0ZShkZXYsIFJGS0lMTF9UWVBFX1dJTUFYKTsKKwlpZiAocmZraWxsID09IE5VTEwpCisJCWdvdG8gZXJyb3JfcmZraWxsX2FsbG9jYXRlOworCXdpbWF4X2Rldi0+cmZraWxsID0gcmZraWxsOworCisJcmZraWxsLT5uYW1lID0gd2ltYXhfZGV2LT5uYW1lOworCXJma2lsbC0+c3RhdGUgPSBSRktJTExfU1RBVEVfT0ZGOworCXJma2lsbC0+ZGF0YSA9IHdpbWF4X2RldjsKKwlyZmtpbGwtPnRvZ2dsZV9yYWRpbyA9IHdpbWF4X3Jma2lsbF90b2dnbGVfcmFkaW87CisJcmZraWxsLT51c2VyX2NsYWltX3Vuc3VwcG9ydGVkID0gMTsKKworCS8qIEluaXRpYWxpemUgdGhlIGlucHV0IGRldmljZSBmb3IgdGhlIGh3IGtleSAqLworCWlucHV0X2RldiA9IGlucHV0X2FsbG9jYXRlX2RldmljZSgpOworCWlmIChpbnB1dF9kZXYgPT0gTlVMTCkKKwkJZ290byBlcnJvcl9pbnB1dF9hbGxvY2F0ZTsKKwl3aW1heF9kZXYtPnJma2lsbF9pbnB1dCA9IGlucHV0X2RldjsKKwlkX3ByaW50ZigxLCBkZXYsICJyZmtpbGwgJXAgaW5wdXQgJXBcbiIsIHJma2lsbCwgaW5wdXRfZGV2KTsKKworCWlucHV0X2Rldi0+bmFtZSA9IHdpbWF4X2Rldi0+bmFtZTsKKwkvKiBGSVhNRTogZ2V0IGEgcmVhbCBkZXZpY2UgYnVzIElEIGFuZCBzdHVmZj8gZG8gd2UgY2FyZT8gKi8KKwlpbnB1dF9kZXYtPmlkLmJ1c3R5cGUgPSBCVVNfSE9TVDsKKwlpbnB1dF9kZXYtPmlkLnZlbmRvciA9IDB4ZmZmZjsKKwlpbnB1dF9kZXYtPmV2Yml0WzBdID0gQklUKEVWX0tFWSk7CisJc2V0X2JpdChLRVlfV0lNQVgsIGlucHV0X2Rldi0+a2V5Yml0KTsKKworCS8qIFJlZ2lzdGVyIGJvdGggKi8KKwlyZXN1bHQgPSBpbnB1dF9yZWdpc3Rlcl9kZXZpY2Uod2ltYXhfZGV2LT5yZmtpbGxfaW5wdXQpOworCWlmIChyZXN1bHQgPCAwKQorCQlnb3RvIGVycm9yX2lucHV0X3JlZ2lzdGVyOworCXJlc3VsdCA9IHJma2lsbF9yZWdpc3Rlcih3aW1heF9kZXYtPnJma2lsbCk7CisJaWYgKHJlc3VsdCA8IDApCisJCWdvdG8gZXJyb3JfcmZraWxsX3JlZ2lzdGVyOworCisJLyogSWYgdGhlcmUgaXMgbm8gU1cgdG9nZ2xlIG9wLCBTVyBSRktpbGwgaXMgYWx3YXlzIG9uICovCisJaWYgKHdpbWF4X2Rldi0+b3BfcmZraWxsX3N3X3RvZ2dsZSA9PSBOVUxMKQorCQl3aW1heF9kZXYtPnJmX3N3ID0gV0lNQVhfUkZfT047CisKKwlkX2ZuZW5kKDMsIGRldiwgIih3aW1heF9kZXYgJXApID0gMFxuIiwgd2ltYXhfZGV2KTsKKwlyZXR1cm4gMDsKKworCS8qIGlmIHJma2lsbF9yZWdpc3RlcigpIHN1Y2VlZHMsIGNhbid0IHVzZSByZmtpbGxfZnJlZSgpIGFueQorCSAqIG1vcmUsIG9ubHkgcmZraWxsX3VucmVnaXN0ZXIoKSBbaXQgb3ducyB0aGUgcmVmY291bnRdOyB3aXRoCisJICogdGhlIGlucHV0IGRldmljZSB3ZSBoYXZlIHRoZSBzYW1lIGlzc3VlLS1oZW5jZSB0aGUgaWYuICovCitlcnJvcl9yZmtpbGxfcmVnaXN0ZXI6CisJaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2Uod2ltYXhfZGV2LT5yZmtpbGxfaW5wdXQpOworCXdpbWF4X2Rldi0+cmZraWxsX2lucHV0ID0gTlVMTDsKK2Vycm9yX2lucHV0X3JlZ2lzdGVyOgorCWlmICh3aW1heF9kZXYtPnJma2lsbF9pbnB1dCkKKwkJaW5wdXRfZnJlZV9kZXZpY2Uod2ltYXhfZGV2LT5yZmtpbGxfaW5wdXQpOworZXJyb3JfaW5wdXRfYWxsb2NhdGU6CisJcmZraWxsX2ZyZWUod2ltYXhfZGV2LT5yZmtpbGwpOworZXJyb3JfcmZraWxsX2FsbG9jYXRlOgorCWRfZm5lbmQoMywgZGV2LCAiKHdpbWF4X2RldiAlcCkgPSAlZFxuIiwgd2ltYXhfZGV2LCByZXN1bHQpOworCXJldHVybiByZXN1bHQ7Cit9CisKKworLyoKKyAqIERlcmVnaXN0ZXIgYSBXaU1BWCBkZXZpY2UncyBSRiBLaWxsIHN1cHBvcnQKKyAqCisgKiBJY2ssIHdlIGNhbid0IGNhbGwgcmZraWxsX2ZyZWUoKSBhZnRlciByZmtpbGxfdW5yZWdpc3RlcigpLi4ub2gKKyAqIHdlbGwuCisgKgorICogV0FSTklORzogd2ltYXhfZGV2LT5tdXRleCBtdXN0IGJlIHVubG9ja2VkCisgKi8KK3ZvaWQgd2ltYXhfcmZraWxsX3JtKHN0cnVjdCB3aW1heF9kZXYgKndpbWF4X2RldikKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSB3aW1heF9kZXZfdG9fZGV2KHdpbWF4X2Rldik7CisJZF9mbnN0YXJ0KDMsIGRldiwgIih3aW1heF9kZXYgJXApXG4iLCB3aW1heF9kZXYpOworCXJma2lsbF91bnJlZ2lzdGVyKHdpbWF4X2Rldi0+cmZraWxsKTsJLyogZnJlZXMgKi8KKwlpbnB1dF91bnJlZ2lzdGVyX2RldmljZSh3aW1heF9kZXYtPnJma2lsbF9pbnB1dCk7CisJZF9mbmVuZCgzLCBkZXYsICIod2ltYXhfZGV2ICVwKVxuIiwgd2ltYXhfZGV2KTsKK30KKworCisjZWxzZSAvKiAjaWZkZWYgQ09ORklHX1JGS0lMTCAqLworCit2b2lkIHdpbWF4X3JlcG9ydF9yZmtpbGxfaHcoc3RydWN0IHdpbWF4X2RldiAqd2ltYXhfZGV2LAorCQkJICAgIGVudW0gd2ltYXhfcmZfc3RhdGUgc3RhdGUpCit7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh3aW1heF9yZXBvcnRfcmZraWxsX2h3KTsKKwordm9pZCB3aW1heF9yZXBvcnRfcmZraWxsX3N3KHN0cnVjdCB3aW1heF9kZXYgKndpbWF4X2RldiwKKwkJCSAgICBlbnVtIHdpbWF4X3JmX3N0YXRlIHN0YXRlKQoreworfQorRVhQT1JUX1NZTUJPTF9HUEwod2ltYXhfcmVwb3J0X3Jma2lsbF9zdyk7CisKK2ludCB3aW1heF9yZmtpbGwoc3RydWN0IHdpbWF4X2RldiAqd2ltYXhfZGV2LAorCQkgZW51bSB3aW1heF9yZl9zdGF0ZSBzdGF0ZSkKK3sKKwlyZXR1cm4gV0lNQVhfUkZfT04gPDwgMSB8IFdJTUFYX1JGX09OOworfQorRVhQT1JUX1NZTUJPTF9HUEwod2ltYXhfcmZraWxsKTsKKworaW50IHdpbWF4X3Jma2lsbF9hZGQoc3RydWN0IHdpbWF4X2RldiAqd2ltYXhfZGV2KQoreworCXJldHVybiAwOworfQorCit2b2lkIHdpbWF4X3Jma2lsbF9ybShzdHJ1Y3Qgd2ltYXhfZGV2ICp3aW1heF9kZXYpCit7Cit9CisKKyNlbmRpZiAvKiAjaWZkZWYgQ09ORklHX1JGS0lMTCAqLworCisKKy8qCisgKiBFeHBvcnRpbmcgdG8gdXNlciBzcGFjZSBvdmVyIGdlbmVyaWMgbmV0bGluaworICoKKyAqIFBhcnNlIHRoZSByZmtpbGwgY29tbWFuZCBmcm9tIHVzZXIgc3BhY2UsIHJldHVybiBhIGNvbWJpbmF0aW9uCisgKiB2YWx1ZSB0aGF0IGRlc2NyaWJlIHRoZSBzdGF0ZXMgb2YgdGhlIGRpZmZlcmVudCB0b2dnbGVzLgorICoKKyAqIE9ubHkgb25lIGF0dHJpYnV0ZTogdGhlIG5ldyBzdGF0ZSByZXF1ZXN0ZWQgKG9uLCBvZmYgb3Igbm8gY2hhbmdlLAorICoganVzdCBxdWVyeSkuCisgKi8KKworc3RhdGljIGNvbnN0CitzdHJ1Y3QgbmxhX3BvbGljeSB3aW1heF9nbmxfcmZraWxsX3BvbGljeVtXSU1BWF9HTkxfQVRUUl9NQVggKyAxXSA9IHsKKwlbV0lNQVhfR05MX1JGS0lMTF9JRklEWF0gPSB7CisJCS50eXBlID0gTkxBX1UzMiwKKwl9LAorCVtXSU1BWF9HTkxfUkZLSUxMX1NUQVRFXSA9IHsKKwkJLnR5cGUgPSBOTEFfVTMyCQkvKiBlbnVtIHdpbWF4X3JmX3N0YXRlICovCisJfSwKK307CisKKworc3RhdGljCitpbnQgd2ltYXhfZ25sX2RvaXRfcmZraWxsKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pCit7CisJaW50IHJlc3VsdCwgaWZpbmRleDsKKwlzdHJ1Y3Qgd2ltYXhfZGV2ICp3aW1heF9kZXY7CisJc3RydWN0IGRldmljZSAqZGV2OworCWVudW0gd2ltYXhfcmZfc3RhdGUgbmV3X3N0YXRlOworCisJZF9mbnN0YXJ0KDMsIE5VTEwsICIoc2tiICVwIGluZm8gJXApXG4iLCBza2IsIGluZm8pOworCXJlc3VsdCA9IC1FTk9ERVY7CisJaWYgKGluZm8tPmF0dHJzW1dJTUFYX0dOTF9SRktJTExfSUZJRFhdID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJXSU1BWF9HTkxfT1BfUkZLSUxMOiBjYW4ndCBmaW5kIElGSURYICIKKwkJCSJhdHRyaWJ1dGVcbiIpOworCQlnb3RvIGVycm9yX25vX3dpbWF4X2RldjsKKwl9CisJaWZpbmRleCA9IG5sYV9nZXRfdTMyKGluZm8tPmF0dHJzW1dJTUFYX0dOTF9SRktJTExfSUZJRFhdKTsKKwl3aW1heF9kZXYgPSB3aW1heF9kZXZfZ2V0X2J5X2dlbmxfaW5mbyhpbmZvLCBpZmluZGV4KTsKKwlpZiAod2ltYXhfZGV2ID09IE5VTEwpCisJCWdvdG8gZXJyb3Jfbm9fd2ltYXhfZGV2OworCWRldiA9IHdpbWF4X2Rldl90b19kZXYod2ltYXhfZGV2KTsKKwlyZXN1bHQgPSAtRUlOVkFMOworCWlmIChpbmZvLT5hdHRyc1tXSU1BWF9HTkxfUkZLSUxMX1NUQVRFXSA9PSBOVUxMKSB7CisJCWRldl9lcnIoZGV2LCAiV0lNQVhfR05MX1JGS0lMTDogY2FuJ3QgZmluZCBSRktJTExfU1RBVEUgIgorCQkJImF0dHJpYnV0ZVxuIik7CisJCWdvdG8gZXJyb3Jfbm9fcGlkOworCX0KKwluZXdfc3RhdGUgPSBubGFfZ2V0X3UzMihpbmZvLT5hdHRyc1tXSU1BWF9HTkxfUkZLSUxMX1NUQVRFXSk7CisKKwkvKiBFeGVjdXRlIHRoZSBvcGVyYXRpb24gYW5kIHNlbmQgdGhlIHJlc3VsdCBiYWNrIHRvIHVzZXIgc3BhY2UgKi8KKwlyZXN1bHQgPSB3aW1heF9yZmtpbGwod2ltYXhfZGV2LCBuZXdfc3RhdGUpOworZXJyb3Jfbm9fcGlkOgorCWRldl9wdXQod2ltYXhfZGV2LT5uZXRfZGV2KTsKK2Vycm9yX25vX3dpbWF4X2RldjoKKwlkX2ZuZW5kKDMsIE5VTEwsICIoc2tiICVwIGluZm8gJXApID0gJWRcbiIsIHNrYiwgaW5mbywgcmVzdWx0KTsKKwlyZXR1cm4gcmVzdWx0OworfQorCisKK3N0cnVjdCBnZW5sX29wcyB3aW1heF9nbmxfcmZraWxsID0geworCS5jbWQgPSBXSU1BWF9HTkxfT1BfUkZLSUxMLAorCS5mbGFncyA9IEdFTkxfQURNSU5fUEVSTSwKKwkucG9saWN5ID0gd2ltYXhfZ25sX3Jma2lsbF9wb2xpY3ksCisJLmRvaXQgPSB3aW1heF9nbmxfZG9pdF9yZmtpbGwsCisJLmR1bXBpdCA9IE5VTEwsCit9OworCmRpZmYgLS1naXQgYS9uZXQvd2ltYXgvc3RhY2suYyBiL25ldC93aW1heC9zdGFjay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0ZGE5MmYKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvd2ltYXgvc3RhY2suYwpAQCAtMCwwICsxLDU5OSBAQAorLyoKKyAqIExpbnV4IFdpTUFYCisgKiBJbml0aWFsaXphdGlvbiwgYWRkaXRpb24gYW5kIHJlbW92YWwgb2Ygd2ltYXggZGV2aWNlcworICoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwNiBJbnRlbCBDb3Jwb3JhdGlvbiA8bGludXgtd2ltYXhAaW50ZWwuY29tPgorICogSW5ha3kgUGVyZXotR29uemFsZXogPGluYWt5LnBlcmV6LWdvbnphbGV6QGludGVsLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EuCisgKgorICoKKyAqIFRoaXMgaW1wbGVtZW50czoKKyAqCisgKiAgIC0gYmFzaWMgbGlmZSBjeWNsZSBvZiAnc3RydWN0IHdpbWF4X2RldicgW3dpbWF4X2Rldl8qKCldOyBvbgorICogICAgIGFkZGl0aW9uL3JlZ2lzdHJhdGlvbiBpbml0aWFsaXplIGFsbCBzdWJmaWVsZHMgYW5kIGFsbG9jYXRlCisgKiAgICAgZ2VuZXJpYyBuZXRsaW5rIHJlc291cmNlcyBmb3IgdXNlciBzcGFjZSBjb21tdW5pY2F0aW9uLiBPbgorICogICAgIHJlbW92YWwvdW5yZWdpc3RyYXRpb24sIHVuZG8gYWxsIHRoYXQuCisgKgorICogICAtIGRldmljZSBzdGF0ZSBtYWNoaW5lIFt3aW1heF9zdGF0ZV9jaGFuZ2UoKV0gYW5kIHN1cHBvcnQgdG8gc2VuZAorICogICAgIHJlcG9ydHMgdG8gdXNlciBzcGFjZSB3aGVuIHRoZSBzdGF0ZSBjaGFuZ2VzCisgKiAgICAgW3dpbWF4X2dubF9yZV9zdGF0ZV9jaGFuZ2UqKCldLgorICoKKyAqIFNlZSBpbmNsdWRlL25ldC93aW1heC5oIGZvciByYXRpb25hbGVzIGFuZCBkZXNpZ24uCisgKgorICogUk9BRE1BUAorICoKKyAqIFtfX113aW1heF9zdGF0ZV9jaGFuZ2UoKSAgICAgQ2FsbGVkIGJ5IGRyaXZlcnMgdG8gdXBkYXRlIGRldmljZSdzIHN0YXRlCisgKiAgIHdpbWF4X2dubF9yZV9zdGF0ZV9jaGFuZ2VfYWxsb2MoKQorICogICB3aW1heF9nbmxfcmVfc3RhdGVfY2hhbmdlX3NlbmQoKQorICoKKyAqIHdpbWF4X2Rldl9pbml0KCkJICAgICAgICBJbml0IGEgZGV2aWNlCisgKiB3aW1heF9kZXZfYWRkKCkgICAgICAgICAgICAgIFJlZ2lzdGVyCisgKiAgIHdpbWF4X3Jma2lsbF9hZGQoKQorICogICB3aW1heF9nbmxfYWRkKCkgICAgICAgICAgICBSZWdpc3RlciBhbGwgdGhlIGdlbmVyaWMgbmV0bGluayByZXNvdXJjZXMuCisgKiAgIHdpbWF4X2lkX3RhYmxlX2FkZCgpCisgKiB3aW1heF9kZXZfcm0oKSAgICAgICAgICAgICAgIFVucmVnaXN0ZXIKKyAqICAgd2ltYXhfaWRfdGFibGVfcm0oKQorICogICB3aW1heF9nbmxfcm0oKQorICogICB3aW1heF9yZmtpbGxfcm0oKQorICovCisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bmV0L2dlbmV0bGluay5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3dpbWF4Lmg+CisjaW5jbHVkZSAid2ltYXgtaW50ZXJuYWwuaCIKKworCisjZGVmaW5lIERfU1VCTU9EVUxFIHN0YWNrCisjaW5jbHVkZSAiZGVidWctbGV2ZWxzLmgiCisKKy8qCisgKiBBdXRob3JpdGF0aXZlIHNvdXJjZSBmb3IgdGhlIFJFX1NUQVRFX0NIQU5HRSBhdHRyaWJ1dGUgcG9saWN5CisgKgorICogV2UgZG9uJ3QgcmVhbGx5IHVzZSBpdCBoZXJlLCBidXQgL21lIGxpa2VzIHRvIGtlZXAgdGhlIGRlZmluaXRpb24KKyAqIGNsb3NlIHRvIHdoZXJlIHRoZSBkYXRhIGlzIGdlbmVyYXRlZC4KKyAqLworLyoKK3N0YXRpYyBjb25zdAorc3RydWN0IG5sYV9wb2xpY3kgd2ltYXhfZ25sX3JlX3N0YXR1c19jaGFuZ2VbV0lNQVhfR05MX0FUVFJfTUFYICsgMV0gPSB7CisJW1dJTUFYX0dOTF9TVENIX1NUQVRFX09MRF0gPSB7IC50eXBlID0gTkxBX1U4IH0sCisJW1dJTUFYX0dOTF9TVENIX1NUQVRFX05FV10gPSB7IC50eXBlID0gTkxBX1U4IH0sCit9OworKi8KKworCisvKgorICogQWxsb2NhdGUgYSBSZXBvcnQgU3RhdGUgQ2hhbmdlIG1lc3NhZ2UKKyAqCisgKiBAaGVhZGVyOiBzYXZlIGl0LCB5b3UgbmVlZCBpdCBmb3IgX3NlbmQoKQorICoKKyAqIENyZWF0ZXMgYW5kIGZpbGxzIGEgYmFzaWMgc3RhdGUgY2hhbmdlIG1lc3NhZ2U7IGRpZmZlcmVudCBjb2RlCisgKiBwYXRocyBjYW4gdGhlbiBhZGQgbW9yZSBhdHRyaWJ1dGVzIHRvIHRoZSBtZXNzYWdlIGFzIG5lZWRlZC4KKyAqCisgKiBVc2Ugd2ltYXhfZ25sX3JlX3N0YXRlX2NoYW5nZV9zZW5kKCkgdG8gc2VuZCB0aGUgcmV0dXJuZWQgc2tiLgorICoKKyAqIFJldHVybnM6IHNrYiB3aXRoIHRoZSBnZW5sIG1lc3NhZ2UgaWYgb2ssIElTX0VSUigpIHB0ciBvbiBlcnJvcgorICogICAgIHdpdGggYW4gZXJybm8gY29kZS4KKyAqLworc3RhdGljCitzdHJ1Y3Qgc2tfYnVmZiAqd2ltYXhfZ25sX3JlX3N0YXRlX2NoYW5nZV9hbGxvYygKKwlzdHJ1Y3Qgd2ltYXhfZGV2ICp3aW1heF9kZXYsCisJZW51bSB3aW1heF9zdCBuZXdfc3RhdGUsIGVudW0gd2ltYXhfc3Qgb2xkX3N0YXRlLAorCXZvaWQgKipoZWFkZXIpCit7CisJaW50IHJlc3VsdDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSB3aW1heF9kZXZfdG9fZGV2KHdpbWF4X2Rldik7CisJdm9pZCAqZGF0YTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqcmVwb3J0X3NrYjsKKworCWRfZm5zdGFydCgzLCBkZXYsICIod2ltYXhfZGV2ICVwIG5ld19zdGF0ZSAldSBvbGRfc3RhdGUgJXUpXG4iLAorCQkgIHdpbWF4X2RldiwgbmV3X3N0YXRlLCBvbGRfc3RhdGUpOworCXJlc3VsdCA9IC1FTk9NRU07CisJcmVwb3J0X3NrYiA9IG5sbXNnX25ldyhOTE1TR19ERUZBVUxUX1NJWkUsIEdGUF9LRVJORUwpOworCWlmIChyZXBvcnRfc2tiID09IE5VTEwpIHsKKwkJZGV2X2VycihkZXYsICJSRV9TVENIOiBjYW4ndCBjcmVhdGUgbWVzc2FnZVxuIik7CisJCWdvdG8gZXJyb3JfbmV3OworCX0KKwlkYXRhID0gZ2VubG1zZ19wdXQocmVwb3J0X3NrYiwgMCwgd2ltYXhfZ25sX21jZy5pZCwgJndpbWF4X2dubF9mYW1pbHksCisJCQkgICAwLCBXSU1BWF9HTkxfUkVfU1RBVEVfQ0hBTkdFKTsKKwlpZiAoZGF0YSA9PSBOVUxMKSB7CisJCWRldl9lcnIoZGV2LCAiUkVfU1RDSDogY2FuJ3QgcHV0IGRhdGEgaW50byBtZXNzYWdlXG4iKTsKKwkJZ290byBlcnJvcl9wdXQ7CisJfQorCSpoZWFkZXIgPSBkYXRhOworCisJcmVzdWx0ID0gbmxhX3B1dF91OChyZXBvcnRfc2tiLCBXSU1BWF9HTkxfU1RDSF9TVEFURV9PTEQsIG9sZF9zdGF0ZSk7CisJaWYgKHJlc3VsdCA8IDApIHsKKwkJZGV2X2VycihkZXYsICJSRV9TVENIOiBFcnJvciBhZGRpbmcgT0xEIGF0dHI6ICVkXG4iLCByZXN1bHQpOworCQlnb3RvIGVycm9yX3B1dDsKKwl9CisJcmVzdWx0ID0gbmxhX3B1dF91OChyZXBvcnRfc2tiLCBXSU1BWF9HTkxfU1RDSF9TVEFURV9ORVcsIG5ld19zdGF0ZSk7CisJaWYgKHJlc3VsdCA8IDApIHsKKwkJZGV2X2VycihkZXYsICJSRV9TVENIOiBFcnJvciBhZGRpbmcgTkVXIGF0dHI6ICVkXG4iLCByZXN1bHQpOworCQlnb3RvIGVycm9yX3B1dDsKKwl9CisJcmVzdWx0ID0gbmxhX3B1dF91MzIocmVwb3J0X3NrYiwgV0lNQVhfR05MX1NUQ0hfSUZJRFgsCisJCQkgICAgIHdpbWF4X2Rldi0+bmV0X2Rldi0+aWZpbmRleCk7CisJaWYgKHJlc3VsdCA8IDApIHsKKwkJZGV2X2VycihkZXYsICJSRV9TVENIOiBFcnJvciBhZGRpbmcgSUZJTkRFWCBhdHRyaWJ1dGVcbiIpOworCQlnb3RvIGVycm9yX3B1dDsKKwl9CisJZF9mbmVuZCgzLCBkZXYsICIod2ltYXhfZGV2ICVwIG5ld19zdGF0ZSAldSBvbGRfc3RhdGUgJXUpID0gJXBcbiIsCisJCXdpbWF4X2RldiwgbmV3X3N0YXRlLCBvbGRfc3RhdGUsIHJlcG9ydF9za2IpOworCXJldHVybiByZXBvcnRfc2tiOworCitlcnJvcl9wdXQ6CisJbmxtc2dfZnJlZShyZXBvcnRfc2tiKTsKK2Vycm9yX25ldzoKKwlkX2ZuZW5kKDMsIGRldiwgIih3aW1heF9kZXYgJXAgbmV3X3N0YXRlICV1IG9sZF9zdGF0ZSAldSkgPSAlZFxuIiwKKwkJd2ltYXhfZGV2LCBuZXdfc3RhdGUsIG9sZF9zdGF0ZSwgcmVzdWx0KTsKKwlyZXR1cm4gRVJSX1BUUihyZXN1bHQpOworfQorCisKKy8qCisgKiBTZW5kIGEgUmVwb3J0IFN0YXRlIENoYW5nZSBtZXNzYWdlIChhcyBjcmVhdGVkIHdpdGggX2FsbG9jKS4KKyAqCisgKiBAcmVwb3J0X3NrYjogYXMgcmV0dXJuZWQgYnkgd2ltYXhfZ25sX3JlX3N0YXRlX2NoYW5nZV9hbGxvYygpCisgKiBAaGVhZGVyOiBhcyByZXR1cm5lZCBieSB3aW1heF9nbmxfcmVfc3RhdGVfY2hhbmdlX2FsbG9jKCkKKyAqCisgKiBSZXR1cm5zOiAwIGlmIG9rLCA8IDAgZXJybm8gY29kZSBvbiBlcnJvci4KKyAqCisgKiBJZiB0aGUgbWVzc2FnZSBpcyAgTlVMTCwgcHJldGVuZCBpdCBkaWRuJ3QgaGFwcGVuLgorICovCitzdGF0aWMKK2ludCB3aW1heF9nbmxfcmVfc3RhdGVfY2hhbmdlX3NlbmQoCisJc3RydWN0IHdpbWF4X2RldiAqd2ltYXhfZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqcmVwb3J0X3NrYiwKKwl2b2lkICpoZWFkZXIpCit7CisJaW50IHJlc3VsdCA9IDA7CisJc3RydWN0IGRldmljZSAqZGV2ID0gd2ltYXhfZGV2X3RvX2Rldih3aW1heF9kZXYpOworCWRfZm5zdGFydCgzLCBkZXYsICIod2ltYXhfZGV2ICVwIHJlcG9ydF9za2IgJXApXG4iLAorCQkgIHdpbWF4X2RldiwgcmVwb3J0X3NrYik7CisJaWYgKHJlcG9ydF9za2IgPT0gTlVMTCkKKwkJZ290byBvdXQ7CisJZ2VubG1zZ19lbmQocmVwb3J0X3NrYiwgaGVhZGVyKTsKKwlyZXN1bHQgPSBnZW5sbXNnX211bHRpY2FzdChyZXBvcnRfc2tiLCAwLCB3aW1heF9nbmxfbWNnLmlkLCBHRlBfS0VSTkVMKTsKKwlpZiAocmVzdWx0ID09IC1FU1JDSCkJLyogTm9ib2R5IGNvbm5lY3RlZCwgaWdub3JlIGl0ICovCisJCXJlc3VsdCA9IDA7CS8qIGJ0dywgdGhlIHNrYiBpcyBmcmVlZCBhbHJlYWR5ICovCisJaWYgKHJlc3VsdCA8IDApIHsKKwkJZGV2X2VycihkZXYsICJSRV9TVENIOiBFcnJvciBzZW5kaW5nOiAlZFxuIiwgcmVzdWx0KTsKKwkJbmxtc2dfZnJlZShyZXBvcnRfc2tiKTsKKwl9CitvdXQ6CisJZF9mbmVuZCgzLCBkZXYsICIod2ltYXhfZGV2ICVwIHJlcG9ydF9za2IgJXApID0gJWRcbiIsCisJCXdpbWF4X2RldiwgcmVwb3J0X3NrYiwgcmVzdWx0KTsKKwlyZXR1cm4gcmVzdWx0OworfQorCisKK3N0YXRpYwordm9pZCBfX2NoZWNrX25ld19zdGF0ZShlbnVtIHdpbWF4X3N0IG9sZF9zdGF0ZSwgZW51bSB3aW1heF9zdCBuZXdfc3RhdGUsCisJCSAgICAgICB1bnNpZ25lZCBhbGxvd2VkX3N0YXRlc19ibSkKK3sKKwlpZiAoV0FSTl9PTigoKDEgPDwgbmV3X3N0YXRlKSAmIGFsbG93ZWRfc3RhdGVzX2JtKSA9PSAwKSkgeworCQlwcmludGsoS0VSTl9FUlIgIlNXIEJVRyEgRm9yYmlkZGVuIHN0YXRlIGNoYW5nZSAldSAtPiAldVxuIiwKKwkJCW9sZF9zdGF0ZSwgbmV3X3N0YXRlKTsKKwl9Cit9CisKKworLyoKKyAqIFNldCB0aGUgY3VycmVudCBzdGF0ZSBvZiBhIFdpTUFYIGRldmljZSBbdW5sb2NraW5nIHZlcnNpb24gb2YKKyAqIHdpbWF4X3N0YXRlX2NoYW5nZSgpLgorICovCit2b2lkIF9fd2ltYXhfc3RhdGVfY2hhbmdlKHN0cnVjdCB3aW1heF9kZXYgKndpbWF4X2RldiwgZW51bSB3aW1heF9zdCBuZXdfc3RhdGUpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gd2ltYXhfZGV2X3RvX2Rldih3aW1heF9kZXYpOworCWVudW0gd2ltYXhfc3Qgb2xkX3N0YXRlID0gd2ltYXhfZGV2LT5zdGF0ZTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc3RjaF9za2I7CisJdm9pZCAqaGVhZGVyOworCisJZF9mbnN0YXJ0KDMsIGRldiwgIih3aW1heF9kZXYgJXAgbmV3X3N0YXRlICV1IFtvbGQgJXVdKVxuIiwKKwkJICB3aW1heF9kZXYsIG5ld19zdGF0ZSwgb2xkX3N0YXRlKTsKKworCWlmIChXQVJOX09OKG5ld19zdGF0ZSA+PSBfX1dJTUFYX1NUX0lOVkFMSUQpKSB7CisJCWRldl9lcnIoZGV2LCAiU1cgQlVHOiByZXF1ZXN0aW5nIGludmFsaWQgc3RhdGUgJXVcbiIsCisJCQluZXdfc3RhdGUpOworCQlnb3RvIG91dDsKKwl9CisJaWYgKG9sZF9zdGF0ZSA9PSBuZXdfc3RhdGUpCisJCWdvdG8gb3V0OworCWhlYWRlciA9IE5VTEw7CS8qIGdjYyBjb21wbGFpbnM/IGNhbid0IGdyb2sgd2h5ICovCisJc3RjaF9za2IgPSB3aW1heF9nbmxfcmVfc3RhdGVfY2hhbmdlX2FsbG9jKAorCQl3aW1heF9kZXYsIG5ld19zdGF0ZSwgb2xkX3N0YXRlLCAmaGVhZGVyKTsKKworCS8qIFZlcmlmeSB0aGUgc3RhdGUgdHJhbnNpdGlvbiBhbmQgZG8gZXhpdC1mcm9tLXN0YXRlIGFjdGlvbnMgKi8KKwlzd2l0Y2ggKG9sZF9zdGF0ZSkgeworCWNhc2UgX19XSU1BWF9TVF9OVUxMOgorCQlfX2NoZWNrX25ld19zdGF0ZShvbGRfc3RhdGUsIG5ld19zdGF0ZSwKKwkJCQkgIDEgPDwgV0lNQVhfU1RfRE9XTik7CisJCWJyZWFrOworCWNhc2UgV0lNQVhfU1RfRE9XTjoKKwkJX19jaGVja19uZXdfc3RhdGUob2xkX3N0YXRlLCBuZXdfc3RhdGUsCisJCQkJICAxIDw8IF9fV0lNQVhfU1RfUVVJRVNDSU5HCisJCQkJICB8IDEgPDwgV0lNQVhfU1RfVU5JTklUSUFMSVpFRAorCQkJCSAgfCAxIDw8IFdJTUFYX1NUX1JBRElPX09GRik7CisJCWJyZWFrOworCWNhc2UgX19XSU1BWF9TVF9RVUlFU0NJTkc6CisJCV9fY2hlY2tfbmV3X3N0YXRlKG9sZF9zdGF0ZSwgbmV3X3N0YXRlLCAxIDw8IFdJTUFYX1NUX0RPV04pOworCQlicmVhazsKKwljYXNlIFdJTUFYX1NUX1VOSU5JVElBTElaRUQ6CisJCV9fY2hlY2tfbmV3X3N0YXRlKG9sZF9zdGF0ZSwgbmV3X3N0YXRlLAorCQkJCSAgMSA8PCBfX1dJTUFYX1NUX1FVSUVTQ0lORworCQkJCSAgfCAxIDw8IFdJTUFYX1NUX1JBRElPX09GRik7CisJCWJyZWFrOworCWNhc2UgV0lNQVhfU1RfUkFESU9fT0ZGOgorCQlfX2NoZWNrX25ld19zdGF0ZShvbGRfc3RhdGUsIG5ld19zdGF0ZSwKKwkJCQkgIDEgPDwgX19XSU1BWF9TVF9RVUlFU0NJTkcKKwkJCQkgIHwgMSA8PCBXSU1BWF9TVF9SRUFEWSk7CisJCWJyZWFrOworCWNhc2UgV0lNQVhfU1RfUkVBRFk6CisJCV9fY2hlY2tfbmV3X3N0YXRlKG9sZF9zdGF0ZSwgbmV3X3N0YXRlLAorCQkJCSAgMSA8PCBfX1dJTUFYX1NUX1FVSUVTQ0lORworCQkJCSAgfCAxIDw8IFdJTUFYX1NUX1JBRElPX09GRgorCQkJCSAgfCAxIDw8IFdJTUFYX1NUX1NDQU5OSU5HCisJCQkJICB8IDEgPDwgV0lNQVhfU1RfQ09OTkVDVElORworCQkJCSAgfCAxIDw8IFdJTUFYX1NUX0NPTk5FQ1RFRCk7CisJCWJyZWFrOworCWNhc2UgV0lNQVhfU1RfU0NBTk5JTkc6CisJCV9fY2hlY2tfbmV3X3N0YXRlKG9sZF9zdGF0ZSwgbmV3X3N0YXRlLAorCQkJCSAgMSA8PCBfX1dJTUFYX1NUX1FVSUVTQ0lORworCQkJCSAgfCAxIDw8IFdJTUFYX1NUX1JBRElPX09GRgorCQkJCSAgfCAxIDw8IFdJTUFYX1NUX1JFQURZCisJCQkJICB8IDEgPDwgV0lNQVhfU1RfQ09OTkVDVElORworCQkJCSAgfCAxIDw8IFdJTUFYX1NUX0NPTk5FQ1RFRCk7CisJCWJyZWFrOworCWNhc2UgV0lNQVhfU1RfQ09OTkVDVElORzoKKwkJX19jaGVja19uZXdfc3RhdGUob2xkX3N0YXRlLCBuZXdfc3RhdGUsCisJCQkJICAxIDw8IF9fV0lNQVhfU1RfUVVJRVNDSU5HCisJCQkJICB8IDEgPDwgV0lNQVhfU1RfUkFESU9fT0ZGCisJCQkJICB8IDEgPDwgV0lNQVhfU1RfUkVBRFkKKwkJCQkgIHwgMSA8PCBXSU1BWF9TVF9TQ0FOTklORworCQkJCSAgfCAxIDw8IFdJTUFYX1NUX0NPTk5FQ1RFRCk7CisJCWJyZWFrOworCWNhc2UgV0lNQVhfU1RfQ09OTkVDVEVEOgorCQlfX2NoZWNrX25ld19zdGF0ZShvbGRfc3RhdGUsIG5ld19zdGF0ZSwKKwkJCQkgIDEgPDwgX19XSU1BWF9TVF9RVUlFU0NJTkcKKwkJCQkgIHwgMSA8PCBXSU1BWF9TVF9SQURJT19PRkYKKwkJCQkgIHwgMSA8PCBXSU1BWF9TVF9SRUFEWSk7CisJCW5ldGlmX3R4X2Rpc2FibGUod2ltYXhfZGV2LT5uZXRfZGV2KTsKKwkJbmV0aWZfY2Fycmllcl9vZmYod2ltYXhfZGV2LT5uZXRfZGV2KTsKKwkJYnJlYWs7CisJY2FzZSBfX1dJTUFYX1NUX0lOVkFMSUQ6CisJZGVmYXVsdDoKKwkJZGV2X2VycihkZXYsICJTVyBCVUc6IHdpbWF4X2RldiAlcCBpcyBpbiB1bmtub3duIHN0YXRlICV1XG4iLAorCQkJd2ltYXhfZGV2LCB3aW1heF9kZXYtPnN0YXRlKTsKKwkJV0FSTl9PTigxKTsKKwkJZ290byBvdXQ7CisJfQorCisJLyogRXhlY3V0ZSB0aGUgYWN0aW9ucyBvZiBlbnRyeSB0byB0aGUgbmV3IHN0YXRlICovCisJc3dpdGNoIChuZXdfc3RhdGUpIHsKKwljYXNlIF9fV0lNQVhfU1RfTlVMTDoKKwkJZGV2X2VycihkZXYsICJTVyBCVUc6IHdpbWF4X2RldiAlcCBlbnRlcmluZyBOVUxMIHN0YXRlICIKKwkJCSJmcm9tICV1XG4iLCB3aW1heF9kZXYsIHdpbWF4X2Rldi0+c3RhdGUpOworCQlXQVJOX09OKDEpOwkJLyogTm9ib2R5IGNhbiBlbnRlciB0aGlzIHN0YXRlICovCisJCWJyZWFrOworCWNhc2UgV0lNQVhfU1RfRE9XTjoKKwkJYnJlYWs7CisJY2FzZSBfX1dJTUFYX1NUX1FVSUVTQ0lORzoKKwkJYnJlYWs7CisJY2FzZSBXSU1BWF9TVF9VTklOSVRJQUxJWkVEOgorCQlicmVhazsKKwljYXNlIFdJTUFYX1NUX1JBRElPX09GRjoKKwkJYnJlYWs7CisJY2FzZSBXSU1BWF9TVF9SRUFEWToKKwkJYnJlYWs7CisJY2FzZSBXSU1BWF9TVF9TQ0FOTklORzoKKwkJYnJlYWs7CisJY2FzZSBXSU1BWF9TVF9DT05ORUNUSU5HOgorCQlicmVhazsKKwljYXNlIFdJTUFYX1NUX0NPTk5FQ1RFRDoKKwkJbmV0aWZfY2Fycmllcl9vbih3aW1heF9kZXYtPm5ldF9kZXYpOworCQluZXRpZl93YWtlX3F1ZXVlKHdpbWF4X2Rldi0+bmV0X2Rldik7CisJCWJyZWFrOworCWNhc2UgX19XSU1BWF9TVF9JTlZBTElEOgorCWRlZmF1bHQ6CisJCUJVRygpOworCX0KKwlfX3dpbWF4X3N0YXRlX3NldCh3aW1heF9kZXYsIG5ld19zdGF0ZSk7CisJaWYgKHN0Y2hfc2tiKQorCQl3aW1heF9nbmxfcmVfc3RhdGVfY2hhbmdlX3NlbmQod2ltYXhfZGV2LCBzdGNoX3NrYiwgaGVhZGVyKTsKK291dDoKKwlkX2ZuZW5kKDMsIGRldiwgIih3aW1heF9kZXYgJXAgbmV3X3N0YXRlICV1IFtvbGQgJXVdKSA9IHZvaWRcbiIsCisJCXdpbWF4X2RldiwgbmV3X3N0YXRlLCBvbGRfc3RhdGUpOworCXJldHVybjsKK30KKworCisvKioKKyAqIHdpbWF4X3N0YXRlX2NoYW5nZSAtIFNldCB0aGUgY3VycmVudCBzdGF0ZSBvZiBhIFdpTUFYIGRldmljZQorICoKKyAqIEB3aW1heF9kZXY6IFdpTUFYIGRldmljZSBkZXNjcmlwdG9yIChwcm9wZXJseSByZWZlcmVuY2VkKQorICogQG5ld19zdGF0ZTogTmV3IHN0YXRlIHRvIHN3aXRjaCB0bworICoKKyAqIFRoaXMgaW1wbGVtZW50cyB0aGUgc3RhdGUgY2hhbmdlcyBmb3IgdGhlIHdpbWF4IGRldmljZXMuIEl0IHdpbGwKKyAqCisgKiAtIHZlcmlmeSB0aGF0IHRoZSBzdGF0ZSB0cmFuc2l0aW9uIGlzIGxlZ2FsIChmb3Igbm93IGl0J2xsIGp1c3QKKyAqICAgcHJpbnQgYSB3YXJuaW5nIGlmIG5vdCkgYWNjb3JkaW5nIHRvIHRoZSB0YWJsZSBpbgorICogICBsaW51eC93aW1heC5oJ3MgZG9jdW1lbnRhdGlvbiBmb3IgJ2VudW0gd2ltYXhfc3QnLgorICoKKyAqIC0gcGVyZm9ybSB0aGUgYWN0aW9ucyBuZWVkZWQgZm9yIGxlYXZpbmcgdGhlIGN1cnJlbnQgc3RhdGUgYW5kCisgKiAgIHdoaWNoZXZlciBhcmUgbmVlZGVkIGZvciBlbnRlcmluZyB0aGUgbmV3IHN0YXRlLgorICoKKyAqIC0gaXNzdWUgYSByZXBvcnQgdG8gdXNlciBzcGFjZSBpbmRpY2F0aW5nIHRoZSBuZXcgc3RhdGUgKGFuZCBhbgorICogICBvcHRpb25hbCBwYXlsb2FkIHdpdGggaW5mb3JtYXRpb24gYWJvdXQgdGhlIG5ldyBzdGF0ZSkuCisgKgorICogTk9URTogQHdpbWF4X2RldiBtdXN0IGJlIGxvY2tlZAorICovCit2b2lkIHdpbWF4X3N0YXRlX2NoYW5nZShzdHJ1Y3Qgd2ltYXhfZGV2ICp3aW1heF9kZXYsIGVudW0gd2ltYXhfc3QgbmV3X3N0YXRlKQoreworCW11dGV4X2xvY2soJndpbWF4X2Rldi0+bXV0ZXgpOworCV9fd2ltYXhfc3RhdGVfY2hhbmdlKHdpbWF4X2RldiwgbmV3X3N0YXRlKTsKKwltdXRleF91bmxvY2soJndpbWF4X2Rldi0+bXV0ZXgpOworCXJldHVybjsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHdpbWF4X3N0YXRlX2NoYW5nZSk7CisKKworLyoqCisgKiB3aW1heF9zdGF0ZV9nZXQoKSAtIFJldHVybiB0aGUgY3VycmVudCBzdGF0ZSBvZiBhIFdpTUFYIGRldmljZQorICoKKyAqIEB3aW1heF9kZXY6IFdpTUFYIGRldmljZSBkZXNjcmlwdG9yCisgKgorICogUmV0dXJuczogQ3VycmVudCBzdGF0ZSBvZiB0aGUgZGV2aWNlIGFjY29yZGluZyB0byBpdHMgZHJpdmVyLgorICovCitlbnVtIHdpbWF4X3N0IHdpbWF4X3N0YXRlX2dldChzdHJ1Y3Qgd2ltYXhfZGV2ICp3aW1heF9kZXYpCit7CisJZW51bSB3aW1heF9zdCBzdGF0ZTsKKwltdXRleF9sb2NrKCZ3aW1heF9kZXYtPm11dGV4KTsKKwlzdGF0ZSA9IHdpbWF4X2Rldi0+c3RhdGU7CisJbXV0ZXhfdW5sb2NrKCZ3aW1heF9kZXYtPm11dGV4KTsKKwlyZXR1cm4gc3RhdGU7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh3aW1heF9zdGF0ZV9nZXQpOworCisKKy8qKgorICogd2ltYXhfZGV2X2luaXQgLSBpbml0aWFsaXplIGEgbmV3bHkgYWxsb2NhdGVkIGluc3RhbmNlCisgKgorICogQHdpbWF4X2RldjogV2lNQVggZGV2aWNlIGRlc2NyaXB0b3IgdG8gaW5pdGlhbGl6ZS4KKyAqCisgKiBJbml0aWFsaXplcyBmaWVsZHMgb2YgYSBmcmVzaGx5IGFsbG9jYXRlZCBAd2ltYXhfZGV2IGluc3RhbmNlLiBUaGlzCisgKiBmdW5jdGlvbiBhc3N1bWVzIHRoYXQgYWZ0ZXIgYWxsb2NhdGlvbiwgdGhlIG1lbW9yeSBvY2N1cGllZCBieQorICogQHdpbWF4X2RldiB3YXMgemVyb2VkLgorICovCit2b2lkIHdpbWF4X2Rldl9pbml0KHN0cnVjdCB3aW1heF9kZXYgKndpbWF4X2RldikKK3sKKwlJTklUX0xJU1RfSEVBRCgmd2ltYXhfZGV2LT5pZF90YWJsZV9ub2RlKTsKKwlfX3dpbWF4X3N0YXRlX3NldCh3aW1heF9kZXYsIFdJTUFYX1NUX1VOSU5JVElBTElaRUQpOworCW11dGV4X2luaXQoJndpbWF4X2Rldi0+bXV0ZXgpOworCW11dGV4X2luaXQoJndpbWF4X2Rldi0+bXV0ZXhfcmVzZXQpOworfQorRVhQT1JUX1NZTUJPTF9HUEwod2ltYXhfZGV2X2luaXQpOworCisvKgorICogVGhpcyBleHRlcm4gaXMgZGVjbGFyZWQgaGVyZSBiZWNhdXNlIGl0J3MgZWFzaWVyIHRvIGtlZXAgdHJhY2sgLS0KKyAqIGJvdGggZGVjbGFyYXRpb25zIGFyZSBhIGxpc3Qgb2YgdGhlIHNhbWUKKyAqLworZXh0ZXJuIHN0cnVjdCBnZW5sX29wcworCXdpbWF4X2dubF9tc2dfZnJvbV91c2VyLAorCXdpbWF4X2dubF9yZXNldCwKKwl3aW1heF9nbmxfcmZraWxsOworCitzdGF0aWMKK3N0cnVjdCBnZW5sX29wcyAqd2ltYXhfZ25sX29wc1tdID0geworCSZ3aW1heF9nbmxfbXNnX2Zyb21fdXNlciwKKwkmd2ltYXhfZ25sX3Jlc2V0LAorCSZ3aW1heF9nbmxfcmZraWxsLAorfTsKKworCitzdGF0aWMKK3NpemVfdCB3aW1heF9hZGRyX3NjbnByaW50KGNoYXIgKmFkZHJfc3RyLCBzaXplX3QgYWRkcl9zdHJfc2l6ZSwKKwkJCSAgIHVuc2lnbmVkIGNoYXIgKmFkZHIsIHNpemVfdCBhZGRyX2xlbikKK3sKKwl1bnNpZ25lZCBjbnQsIHRvdGFsOworCWZvciAodG90YWwgPSBjbnQgPSAwOyBjbnQgPCBhZGRyX2xlbjsgY250KyspCisJCXRvdGFsICs9IHNjbnByaW50ZihhZGRyX3N0ciArIHRvdGFsLCBhZGRyX3N0cl9zaXplIC0gdG90YWwsCisJCQkJICAgIiUwMnglYyIsIGFkZHJbY250XSwKKwkJCQkgICBjbnQgPT0gYWRkcl9sZW4gLSAxID8gJ1wwJyA6ICc6Jyk7CisJcmV0dXJuIHRvdGFsOworfQorCisKKy8qKgorICogd2ltYXhfZGV2X2FkZCAtIFJlZ2lzdGVyIGEgbmV3IFdpTUFYIGRldmljZQorICoKKyAqIEB3aW1heF9kZXY6IFdpTUFYIGRldmljZSBkZXNjcmlwdG9yIChhcyBlbWJlZGRlZCBpbiB5b3VyIEBuZXRfZGV2J3MKKyAqICAgICBwcml2IGRhdGEpLiBZb3UgbXVzdCBoYXZlIGNhbGxlZCB3aW1heF9kZXZfaW5pdCgpIG9uIGl0IGJlZm9yZS4KKyAqCisgKiBAbmV0X2RldjogbmV0IGRldmljZSB0aGUgQHdpbWF4X2RldiBpcyBhc3NvY2lhdGVkIHdpdGguIFRoZQorICogICAgIGZ1bmN0aW9uIGV4cGVjdHMgU0VUX05FVERFVl9ERVYoKSBhbmQgcmVnaXN0ZXJfbmV0ZGV2KCkgd2VyZQorICogICAgIGFscmVhZHkgY2FsbGVkIG9uIGl0LgorICoKKyAqIFJlZ2lzdGVycyB0aGUgbmV3IFdpTUFYIGRldmljZSwgc2V0cyB1cCB0aGUgdXNlci1rZXJuZWwgY29udHJvbAorICogaW50ZXJmYWNlIChnZW5lcmljIG5ldGxpbmspIGFuZCBjb21tb24gV2lNQVggaW5mcmFzdHJ1Y3R1cmUuCisgKgorICogTm90ZSB0aGF0IHRoZSBwYXJ0cyB0aGF0IHdpbGwgYWxsb3cgaW50ZXJhY3Rpb24gd2l0aCB1c2VyIHNwYWNlIGFyZQorICogc2V0dXAgYXQgdGhlIHZlcnkgZW5kLCB3aGVuIHRoZSByZXN0IGlzIGluIHBsYWNlLCBhcyBvbmNlIHRoYXQKKyAqIGhhcHBlbnMsIHRoZSBkcml2ZXIgbWlnaHQgZ2V0IHVzZXIgc3BhY2UgY29udHJvbCByZXF1ZXN0cyB2aWEKKyAqIG5ldGxpbmsgb3IgZnJvbSBkZWJ1Z2ZzIHRoYXQgbWlnaHQgdHJhbnNsYXRlIGludG8gY2FsbHMgaW50bworICogd2ltYXhfZGV2LT5vcF8qKCkuCisgKi8KK2ludCB3aW1heF9kZXZfYWRkKHN0cnVjdCB3aW1heF9kZXYgKndpbWF4X2Rldiwgc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpCit7CisJaW50IHJlc3VsdDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBuZXRfZGV2LT5kZXYucGFyZW50OworCWNoYXIgYWRkcl9zdHJbMzJdOworCisJZF9mbnN0YXJ0KDMsIGRldiwgIih3aW1heF9kZXYgJXAgbmV0X2RldiAlcClcbiIsIHdpbWF4X2RldiwgbmV0X2Rldik7CisKKwkvKiBEbyB0aGUgUkZLSUxMIHNldHVwIGJlZm9yZSBsb2NraW5nLCBhcyBSRktJTEwgd2lsbCBjYWxsCisJICogaW50byBvdXIgZnVuY3Rpb25zLiAqLworCXdpbWF4X2Rldi0+bmV0X2RldiA9IG5ldF9kZXY7CisJcmVzdWx0ID0gd2ltYXhfcmZraWxsX2FkZCh3aW1heF9kZXYpOworCWlmIChyZXN1bHQgPCAwKQorCQlnb3RvIGVycm9yX3Jma2lsbF9hZGQ7CisKKwkvKiBTZXQgdXAgdXNlci1zcGFjZSBpbnRlcmFjdGlvbiAqLworCW11dGV4X2xvY2soJndpbWF4X2Rldi0+bXV0ZXgpOworCXdpbWF4X2lkX3RhYmxlX2FkZCh3aW1heF9kZXYpOworCXJlc3VsdCA9IHdpbWF4X2RlYnVnZnNfYWRkKHdpbWF4X2Rldik7CisJaWYgKHJlc3VsdCA8IDApIHsKKwkJZGV2X2VycihkZXYsICJjYW5ub3QgaW5pdGlhbGl6ZSBkZWJ1Z2ZzOiAlZFxuIiwKKwkJCXJlc3VsdCk7CisJCWdvdG8gZXJyb3JfZGVidWdmc19hZGQ7CisJfQorCisJX193aW1heF9zdGF0ZV9zZXQod2ltYXhfZGV2LCBXSU1BWF9TVF9ET1dOKTsKKwltdXRleF91bmxvY2soJndpbWF4X2Rldi0+bXV0ZXgpOworCisJd2ltYXhfYWRkcl9zY25wcmludChhZGRyX3N0ciwgc2l6ZW9mKGFkZHJfc3RyKSwKKwkJCSAgICBuZXRfZGV2LT5kZXZfYWRkciwgbmV0X2Rldi0+YWRkcl9sZW4pOworCWRldl9lcnIoZGV2LCAiV2lNQVggaW50ZXJmYWNlICVzICglcykgcmVhZHlcbiIsCisJCW5ldF9kZXYtPm5hbWUsIGFkZHJfc3RyKTsKKwlkX2ZuZW5kKDMsIGRldiwgIih3aW1heF9kZXYgJXAgbmV0X2RldiAlcCkgPSAwXG4iLCB3aW1heF9kZXYsIG5ldF9kZXYpOworCXJldHVybiAwOworCitlcnJvcl9kZWJ1Z2ZzX2FkZDoKKwl3aW1heF9pZF90YWJsZV9ybSh3aW1heF9kZXYpOworCW11dGV4X3VubG9jaygmd2ltYXhfZGV2LT5tdXRleCk7CisJd2ltYXhfcmZraWxsX3JtKHdpbWF4X2Rldik7CitlcnJvcl9yZmtpbGxfYWRkOgorCWRfZm5lbmQoMywgZGV2LCAiKHdpbWF4X2RldiAlcCBuZXRfZGV2ICVwKSA9ICVkXG4iLAorCQl3aW1heF9kZXYsIG5ldF9kZXYsIHJlc3VsdCk7CisJcmV0dXJuIHJlc3VsdDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHdpbWF4X2Rldl9hZGQpOworCisKKy8qKgorICogd2ltYXhfZGV2X3JtIC0gVW5yZWdpc3RlciBhbiBleGlzdGluZyBXaU1BWCBkZXZpY2UKKyAqCisgKiBAd2ltYXhfZGV2OiBXaU1BWCBkZXZpY2UgZGVzY3JpcHRvcgorICoKKyAqIFVucmVnaXN0ZXJzIGEgV2lNQVggZGV2aWNlIHByZXZpb3VzbHkgcmVnaXN0ZXJlZCBmb3IgdXNlIHdpdGgKKyAqIHdpbWF4X2FkZF9ybSgpLgorICoKKyAqIElNUE9SVEFOVCEgTXVzdCBjYWxsIGJlZm9yZSBjYWxsaW5nIHVucmVnaXN0ZXJfbmV0ZGV2KCkuCisgKgorICogQWZ0ZXIgdGhpcyBmdW5jdGlvbiByZXR1cm5zLCB5b3Ugd2lsbCBub3QgZ2V0IGFueSBtb3JlIHVzZXIgc3BhY2UKKyAqIGNvbnRyb2wgcmVxdWVzdHMgKHZpYSBuZXRsaW5rIG9yIGRlYnVnZnMpIGFuZCB0aHVzIHRvIHdpbWF4X2Rldi0+b3BzLgorICoKKyAqIFJlZW50cmFuY3kgY29udHJvbCBpcyBlbnN1cmVkIGJ5IHNldHRpbmcgdGhlIHN0YXRlIHRvCisgKiAlX19XSU1BWF9TVF9RVUlFU0NJTkcuIHJma2lsbCBvcGVyYXRpb25zIGNvbWluZyB0aHJvdWdoCisgKiB3aW1heF8qcmZraWxsKigpIHdpbGwgYmUgc3RvcHBlZCBieSB0aGUgcXVpZXNjaW5nIHN0YXRlOyBvcHMgY29taW5nCisgKiBmcm9tIHRoZSByZmtpbGwgc3Vic3lzdGVtIHdpbGwgYmUgc3RvcHBlZCBieSB0aGUgc3VwcG9ydCBiZWluZworICogcmVtb3ZlZCBieSB3aW1heF9yZmtpbGxfcm0oKS4KKyAqLwordm9pZCB3aW1heF9kZXZfcm0oc3RydWN0IHdpbWF4X2RldiAqd2ltYXhfZGV2KQoreworCWRfZm5zdGFydCgzLCBOVUxMLCAiKHdpbWF4X2RldiAlcClcbiIsIHdpbWF4X2Rldik7CisKKwltdXRleF9sb2NrKCZ3aW1heF9kZXYtPm11dGV4KTsKKwlfX3dpbWF4X3N0YXRlX2NoYW5nZSh3aW1heF9kZXYsIF9fV0lNQVhfU1RfUVVJRVNDSU5HKTsKKwl3aW1heF9kZWJ1Z2ZzX3JtKHdpbWF4X2Rldik7CisJd2ltYXhfaWRfdGFibGVfcm0od2ltYXhfZGV2KTsKKwlfX3dpbWF4X3N0YXRlX2NoYW5nZSh3aW1heF9kZXYsIFdJTUFYX1NUX0RPV04pOworCW11dGV4X3VubG9jaygmd2ltYXhfZGV2LT5tdXRleCk7CisJd2ltYXhfcmZraWxsX3JtKHdpbWF4X2Rldik7CisJZF9mbmVuZCgzLCBOVUxMLCAiKHdpbWF4X2RldiAlcCkgPSB2b2lkXG4iLCB3aW1heF9kZXYpOworfQorRVhQT1JUX1NZTUJPTF9HUEwod2ltYXhfZGV2X3JtKTsKKworc3RydWN0IGdlbmxfZmFtaWx5IHdpbWF4X2dubF9mYW1pbHkgPSB7CisJLmlkID0gR0VOTF9JRF9HRU5FUkFURSwKKwkubmFtZSA9ICJXaU1BWCIsCisJLnZlcnNpb24gPSBXSU1BWF9HTkxfVkVSU0lPTiwKKwkuaGRyc2l6ZSA9IDAsCisJLm1heGF0dHIgPSBXSU1BWF9HTkxfQVRUUl9NQVgsCit9OworCitzdHJ1Y3QgZ2VubF9tdWx0aWNhc3RfZ3JvdXAgd2ltYXhfZ25sX21jZyA9IHsKKwkubmFtZSA9ICJtc2ciLAorfTsKKworCisKKy8qIFNodXRkb3duIHRoZSB3aW1heCBzdGFjayAqLworc3RhdGljCitpbnQgX19pbml0IHdpbWF4X3N1YnN5c19pbml0KHZvaWQpCit7CisJaW50IHJlc3VsdCwgY250OworCisJZF9mbnN0YXJ0KDQsIE5VTEwsICIoKVxuIik7CisJc25wcmludGYod2ltYXhfZ25sX2ZhbWlseS5uYW1lLCBzaXplb2Yod2ltYXhfZ25sX2ZhbWlseS5uYW1lKSwKKwkJICJXaU1BWCIpOworCXJlc3VsdCA9IGdlbmxfcmVnaXN0ZXJfZmFtaWx5KCZ3aW1heF9nbmxfZmFtaWx5KTsKKwlpZiAodW5saWtlbHkocmVzdWx0IDwgMCkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJjYW5ub3QgcmVnaXN0ZXIgZ2VuZXJpYyBuZXRsaW5rIGZhbWlseTogJWRcbiIsCisJCSAgICAgICByZXN1bHQpOworCQlnb3RvIGVycm9yX3JlZ2lzdGVyX2ZhbWlseTsKKwl9CisKKwlmb3IgKGNudCA9IDA7IGNudCA8IEFSUkFZX1NJWkUod2ltYXhfZ25sX29wcyk7IGNudCsrKSB7CisJCXJlc3VsdCA9IGdlbmxfcmVnaXN0ZXJfb3BzKCZ3aW1heF9nbmxfZmFtaWx5LAorCQkJCQkgICB3aW1heF9nbmxfb3BzW2NudF0pOworCQlkX3ByaW50Zig0LCBOVUxMLCAicmVnaXN0ZXJpbmcgZ2VuZXJpYyBuZXRsaW5rIG9wIGNvZGUgIgorCQkJICIldTogJWRcbiIsIHdpbWF4X2dubF9vcHNbY250XS0+Y21kLCByZXN1bHQpOworCQlpZiAodW5saWtlbHkocmVzdWx0IDwgMCkpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiY2Fubm90IHJlZ2lzdGVyIGdlbmVyaWMgbmV0bGluayBvcCAiCisJCQkgICAgICAgImNvZGUgJXU6ICVkXG4iLAorCQkJICAgICAgIHdpbWF4X2dubF9vcHNbY250XS0+Y21kLCByZXN1bHQpOworCQkJZ290byBlcnJvcl9yZWdpc3Rlcl9vcHM7CisJCX0KKwl9CisKKwlyZXN1bHQgPSBnZW5sX3JlZ2lzdGVyX21jX2dyb3VwKCZ3aW1heF9nbmxfZmFtaWx5LCAmd2ltYXhfZ25sX21jZyk7CisJaWYgKHJlc3VsdCA8IDApCisJCWdvdG8gZXJyb3JfbWNfZ3JvdXA7CisJZF9mbmVuZCg0LCBOVUxMLCAiKCkgPSAwXG4iKTsKKwlyZXR1cm4gMDsKKworZXJyb3JfbWNfZ3JvdXA6CitlcnJvcl9yZWdpc3Rlcl9vcHM6CisJZm9yIChjbnQtLTsgY250ID49IDA7IGNudC0tKQorCQlnZW5sX3VucmVnaXN0ZXJfb3BzKCZ3aW1heF9nbmxfZmFtaWx5LAorCQkJCSAgICB3aW1heF9nbmxfb3BzW2NudF0pOworCWdlbmxfdW5yZWdpc3Rlcl9mYW1pbHkoJndpbWF4X2dubF9mYW1pbHkpOworZXJyb3JfcmVnaXN0ZXJfZmFtaWx5OgorCWRfZm5lbmQoNCwgTlVMTCwgIigpID0gJWRcbiIsIHJlc3VsdCk7CisJcmV0dXJuIHJlc3VsdDsKKworfQorbW9kdWxlX2luaXQod2ltYXhfc3Vic3lzX2luaXQpOworCisKKy8qIFNodXRkb3duIHRoZSB3aW1heCBzdGFjayAqLworc3RhdGljCit2b2lkIF9fZXhpdCB3aW1heF9zdWJzeXNfZXhpdCh2b2lkKQoreworCWludCBjbnQ7CisJd2ltYXhfaWRfdGFibGVfcmVsZWFzZSgpOworCWdlbmxfdW5yZWdpc3Rlcl9tY19ncm91cCgmd2ltYXhfZ25sX2ZhbWlseSwgJndpbWF4X2dubF9tY2cpOworCWZvciAoY250ID0gQVJSQVlfU0laRSh3aW1heF9nbmxfb3BzKSAtIDE7IGNudCA+PSAwOyBjbnQtLSkKKwkJZ2VubF91bnJlZ2lzdGVyX29wcygmd2ltYXhfZ25sX2ZhbWlseSwKKwkJCQkgICAgd2ltYXhfZ25sX29wc1tjbnRdKTsKKwlnZW5sX3VucmVnaXN0ZXJfZmFtaWx5KCZ3aW1heF9nbmxfZmFtaWx5KTsKK30KK21vZHVsZV9leGl0KHdpbWF4X3N1YnN5c19leGl0KTsKKworTU9EVUxFX0FVVEhPUigiSW50ZWwgQ29ycG9yYXRpb24gPGxpbnV4LXdpbWF4QGludGVsLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiTGludXggV2lNQVggc3RhY2siKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKwpkaWZmIC0tZ2l0IGEvbmV0L3dpbWF4L3dpbWF4LWludGVybmFsLmggYi9uZXQvd2ltYXgvd2ltYXgtaW50ZXJuYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTc0M2QyCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L3dpbWF4L3dpbWF4LWludGVybmFsLmgKQEAgLTAsMCArMSw5MSBAQAorLyoKKyAqIExpbnV4IFdpTUFYCisgKiBJbnRlcm5hbCBBUEkgZm9yIGtlcm5lbCBzcGFjZSBXaU1BWCBzdGFjaworICoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgSW50ZWwgQ29ycG9yYXRpb24gPGxpbnV4LXdpbWF4QGludGVsLmNvbT4KKyAqIEluYWt5IFBlcmV6LUdvbnphbGV6IDxpbmFreS5wZXJlei1nb256YWxlekBpbnRlbC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBLgorICoKKyAqCisgKiBUaGlzIGhlYWRlciBmaWxlIGlzIGZvciBkZWNsYXJhdGlvbnMgYW5kIGRlZmluaXRpb25zIGludGVybmFsIHRvCisgKiB0aGUgV2lNQVggc3RhY2suIEZvciBwdWJsaWMgQVBJcyBhbmQgZG9jdW1lbnRhdGlvbiwgc2VlCisgKiBpbmNsdWRlL25ldC93aW1heC5oIGFuZCBpbmNsdWRlL2xpbnV4L3dpbWF4LmguCisgKi8KKworI2lmbmRlZiBfX1dJTUFYX0lOVEVSTkFMX0hfXworI2RlZmluZSBfX1dJTUFYX0lOVEVSTkFMX0hfXworI2lmZGVmIF9fS0VSTkVMX18KKworI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPG5ldC93aW1heC5oPgorCisKKy8qCisgKiBEZWNpZGUgaWYgYSAobG9ja2VkKSBkZXZpY2UgaXMgcmVhZHkgZm9yIHVzZQorICoKKyAqIEJlZm9yZSB1c2luZyB0aGUgZGV2aWNlIHN0cnVjdHVyZSwgaXQgbXVzdCBiZSBsb2NrZWQKKyAqICh3aW1heF9kZXYtPm11dGV4KS4gQXMgd2VsbCwgbW9zdCBvcGVyYXRpb25zIG5lZWQgdG8gY2FsbCB0aGlzCisgKiBmdW5jdGlvbiB0byBjaGVjayBpZiB0aGUgc3RhdGUgaXMgdGhlIHJpZ2h0IG9uZS4KKyAqCisgKiBBbiBlcnJvciB2YWx1ZSB3aWxsIGJlIHJldHVybmVkIGlmIHRoZSBzdGF0ZSBpcyBub3QgdGhlIHJpZ2h0CisgKiBvbmUuIEluIHRoYXQgY2FzZSwgdGhlIGNhbGxlciBzaG91bGQgbm90IGF0dGVtcHQgdG8gdXNlIHRoZSBkZXZpY2UKKyAqIGFuZCBqdXN0IHVubG9jayBpdC4KKyAqLworc3RhdGljIGlubGluZSBfX211c3RfY2hlY2sKK2ludCB3aW1heF9kZXZfaXNfcmVhZHkoc3RydWN0IHdpbWF4X2RldiAqd2ltYXhfZGV2KQoreworCWlmICh3aW1heF9kZXYtPnN0YXRlID09IF9fV0lNQVhfU1RfTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CS8qIERldmljZSBpcyBub3QgZXZlbiByZWdpc3RlcmVkISAqLworCWlmICh3aW1heF9kZXYtPnN0YXRlID09IFdJTUFYX1NUX0RPV04pCisJCXJldHVybiAtRU5PTUVESVVNOworCWlmICh3aW1heF9kZXYtPnN0YXRlID09IF9fV0lNQVhfU1RfUVVJRVNDSU5HKQorCQlyZXR1cm4gLUVTSFVURE9XTjsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW5saW5lCit2b2lkIF9fd2ltYXhfc3RhdGVfc2V0KHN0cnVjdCB3aW1heF9kZXYgKndpbWF4X2RldiwgZW51bSB3aW1heF9zdCBzdGF0ZSkKK3sKKwl3aW1heF9kZXYtPnN0YXRlID0gc3RhdGU7Cit9CitleHRlcm4gdm9pZCBfX3dpbWF4X3N0YXRlX2NoYW5nZShzdHJ1Y3Qgd2ltYXhfZGV2ICosIGVudW0gd2ltYXhfc3QpOworCisjaWZkZWYgQ09ORklHX0RFQlVHX0ZTCitleHRlcm4gaW50IHdpbWF4X2RlYnVnZnNfYWRkKHN0cnVjdCB3aW1heF9kZXYgKik7CitleHRlcm4gdm9pZCB3aW1heF9kZWJ1Z2ZzX3JtKHN0cnVjdCB3aW1heF9kZXYgKik7CisjZWxzZQorc3RhdGljIGlubGluZSBpbnQgd2ltYXhfZGVidWdmc19hZGQoc3RydWN0IHdpbWF4X2RldiAqd2ltYXhfZGV2KQoreworCXJldHVybiAwOworfQorc3RhdGljIGlubGluZSB2b2lkIHdpbWF4X2RlYnVnZnNfcm0oc3RydWN0IHdpbWF4X2RldiAqd2ltYXhfZGV2KSB7fQorI2VuZGlmCisKK2V4dGVybiB2b2lkIHdpbWF4X2lkX3RhYmxlX2FkZChzdHJ1Y3Qgd2ltYXhfZGV2ICopOworZXh0ZXJuIHN0cnVjdCB3aW1heF9kZXYgKndpbWF4X2Rldl9nZXRfYnlfZ2VubF9pbmZvKHN0cnVjdCBnZW5sX2luZm8gKiwgaW50KTsKK2V4dGVybiB2b2lkIHdpbWF4X2lkX3RhYmxlX3JtKHN0cnVjdCB3aW1heF9kZXYgKik7CitleHRlcm4gdm9pZCB3aW1heF9pZF90YWJsZV9yZWxlYXNlKHZvaWQpOworCitleHRlcm4gaW50IHdpbWF4X3Jma2lsbF9hZGQoc3RydWN0IHdpbWF4X2RldiAqKTsKK2V4dGVybiB2b2lkIHdpbWF4X3Jma2lsbF9ybShzdHJ1Y3Qgd2ltYXhfZGV2ICopOworCitleHRlcm4gc3RydWN0IGdlbmxfZmFtaWx5IHdpbWF4X2dubF9mYW1pbHk7CitleHRlcm4gc3RydWN0IGdlbmxfbXVsdGljYXN0X2dyb3VwIHdpbWF4X2dubF9tY2c7CisKKyNlbmRpZiAvKiAjaWZkZWYgX19LRVJORUxfXyAqLworI2VuZGlmIC8qICNpZm5kZWYgX19XSU1BWF9JTlRFUk5BTF9IX18gKi8KZGlmZiAtLWdpdCBhL25ldC93aXJlbGVzcy93ZXh0LmMgYi9uZXQvd2lyZWxlc3Mvd2V4dC5jCmluZGV4IGU0OWEyZDEuLmNiNmE1YmIgMTAwNjQ0Ci0tLSBhL25ldC93aXJlbGVzcy93ZXh0LmMKKysrIGIvbmV0L3dpcmVsZXNzL3dleHQuYwpAQCAtMTA1NSw4ICsxMDU1LDggQEAKIAkJCXJldHVybiBwcml2YXRlKGRldiwgaXdyLCBjbWQsIGluZm8sIGhhbmRsZXIpOwogCX0KIAkvKiBPbGQgZHJpdmVyIEFQSSA6IGNhbGwgZHJpdmVyIGlvY3RsIGhhbmRsZXIgKi8KLQlpZiAoZGV2LT5kb19pb2N0bCkKLQkJcmV0dXJuIGRldi0+ZG9faW9jdGwoZGV2LCBpZnIsIGNtZCk7CisJaWYgKGRldi0+bmV0ZGV2X29wcy0+bmRvX2RvX2lvY3RsKQorCQlyZXR1cm4gZGV2LT5uZXRkZXZfb3BzLT5uZG9fZG9faW9jdGwoZGV2LCBpZnIsIGNtZCk7CiAJcmV0dXJuIC1FT1BOT1RTVVBQOwogfQogCmRpZmYgLS1naXQgYS9zYW1wbGVzL2Zpcm13YXJlX2NsYXNzL2Zpcm13YXJlX3NhbXBsZV9kcml2ZXIuYyBiL3NhbXBsZXMvZmlybXdhcmVfY2xhc3MvZmlybXdhcmVfc2FtcGxlX2RyaXZlci5jCmluZGV4IDExMTE0ZjMuLjIxOWEyOTggMTAwNjQ0Ci0tLSBhL3NhbXBsZXMvZmlybXdhcmVfY2xhc3MvZmlybXdhcmVfc2FtcGxlX2RyaXZlci5jCisrKyBiL3NhbXBsZXMvZmlybXdhcmVfY2xhc3MvZmlybXdhcmVfc2FtcGxlX2RyaXZlci5jCkBAIC0xMDAsNyArMTAwLDcgQEAKIAkJICAgICAgICIgcmVxdWVzdF9maXJtd2FyZV9ub3dhaXQgZmFpbGVkXG4iKTsKIH0KIAotc3RhdGljIGludCBzYW1wbGVfaW5pdCh2b2lkKQorc3RhdGljIGludCBfX2luaXQgc2FtcGxlX2luaXQodm9pZCkKIHsKIAlkZXZpY2VfaW5pdGlhbGl6ZSgmZ2hvc3RfZGV2aWNlKTsKIAkvKiBzaW5jZSB0aGVyZSBpcyBubyByZWFsIGhhcmR3YXJlIGluc2VydGlvbiBJIGp1c3QgY2FsbCB0aGUKZGlmZiAtLWdpdCBhL3NhbXBsZXMva29iamVjdC9rb2JqZWN0LWV4YW1wbGUuYyBiL3NhbXBsZXMva29iamVjdC9rb2JqZWN0LWV4YW1wbGUuYwppbmRleCAwOGQwZDNmLi44ZDliNTVhIDEwMDY0NAotLS0gYS9zYW1wbGVzL2tvYmplY3Qva29iamVjdC1leGFtcGxlLmMKKysrIGIvc2FtcGxlcy9rb2JqZWN0L2tvYmplY3QtZXhhbXBsZS5jCkBAIC0xMDEsNyArMTAxLDcgQEAKIAogc3RhdGljIHN0cnVjdCBrb2JqZWN0ICpleGFtcGxlX2tvYmo7CiAKLXN0YXRpYyBpbnQgZXhhbXBsZV9pbml0KHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCBleGFtcGxlX2luaXQodm9pZCkKIHsKIAlpbnQgcmV0dmFsOwogCkBAIC0xMjYsNyArMTI2LDcgQEAKIAlyZXR1cm4gcmV0dmFsOwogfQogCi1zdGF0aWMgdm9pZCBleGFtcGxlX2V4aXQodm9pZCkKK3N0YXRpYyB2b2lkIF9fZXhpdCBleGFtcGxlX2V4aXQodm9pZCkKIHsKIAlrb2JqZWN0X3B1dChleGFtcGxlX2tvYmopOwogfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9rb2JqZWN0L2tzZXQtZXhhbXBsZS5jIGIvc2FtcGxlcy9rb2JqZWN0L2tzZXQtZXhhbXBsZS5jCmluZGV4IDczOTVjMGIuLjQ1YjdkNTYgMTAwNjQ0Ci0tLSBhL3NhbXBsZXMva29iamVjdC9rc2V0LWV4YW1wbGUuYworKysgYi9zYW1wbGVzL2tvYmplY3Qva3NldC1leGFtcGxlLmMKQEAgLTIyOSw3ICsyMjksNyBAQAogCWtvYmplY3RfcHV0KCZmb28tPmtvYmopOwogfQogCi1zdGF0aWMgaW50IGV4YW1wbGVfaW5pdCh2b2lkKQorc3RhdGljIGludCBfX2luaXQgZXhhbXBsZV9pbml0KHZvaWQpCiB7CiAJLyoKIAkgKiBDcmVhdGUgYSBrc2V0IHdpdGggdGhlIG5hbWUgb2YgImtzZXRfZXhhbXBsZSIsCkBAIC0yNjQsNyArMjY0LDcgQEAKIAlyZXR1cm4gLUVJTlZBTDsKIH0KIAotc3RhdGljIHZvaWQgZXhhbXBsZV9leGl0KHZvaWQpCitzdGF0aWMgdm9pZCBfX2V4aXQgZXhhbXBsZV9leGl0KHZvaWQpCiB7CiAJZGVzdHJveV9mb29fb2JqKGJhel9vYmopOwogCWRlc3Ryb3lfZm9vX29iaihiYXJfb2JqKTsKZGlmZiAtLWdpdCBhL3NhbXBsZXMvbWFya2Vycy9tYXJrZXItZXhhbXBsZS5jIGIvc2FtcGxlcy9tYXJrZXJzL21hcmtlci1leGFtcGxlLmMKaW5kZXggZTkwZGM1ZC4uZTljZDljMCAxMDA2NDQKLS0tIGEvc2FtcGxlcy9tYXJrZXJzL21hcmtlci1leGFtcGxlLmMKKysrIGIvc2FtcGxlcy9tYXJrZXJzL21hcmtlci1leGFtcGxlLmMKQEAgLTMwLDcgKzMwLDcgQEAKIAkub3BlbiA9IG15X29wZW4sCiB9OwogCi1zdGF0aWMgaW50IGV4YW1wbGVfaW5pdCh2b2lkKQorc3RhdGljIGludCBfX2luaXQgZXhhbXBsZV9pbml0KHZvaWQpCiB7CiAJcHJpbnRrKEtFUk5fQUxFUlQgImV4YW1wbGUgaW5pdFxuIik7CiAJcGVudHJ5X2V4YW1wbGUgPSBwcm9jX2NyZWF0ZSgibWFya2VyLWV4YW1wbGUiLCAwNDQ0LCBOVUxMLCAmbWFya19vcHMpOwpAQCAtMzksNyArMzksNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBleGFtcGxlX2V4aXQodm9pZCkKK3N0YXRpYyB2b2lkIF9fZXhpdCBleGFtcGxlX2V4aXQodm9pZCkKIHsKIAlwcmludGsoS0VSTl9BTEVSVCAiZXhhbXBsZSBleGl0XG4iKTsKIAlyZW1vdmVfcHJvY19lbnRyeSgibWFya2VyLWV4YW1wbGUiLCBOVUxMKTsKZGlmZiAtLWdpdCBhL3NhbXBsZXMvdHJhY2Vwb2ludHMvdHJhY2Vwb2ludC1wcm9iZS1zYW1wbGUuYyBiL3NhbXBsZXMvdHJhY2Vwb2ludHMvdHJhY2Vwb2ludC1wcm9iZS1zYW1wbGUuYwppbmRleCBlM2E5NjQ4Li45ZTYwZWI2IDEwMDY0NAotLS0gYS9zYW1wbGVzL3RyYWNlcG9pbnRzL3RyYWNlcG9pbnQtcHJvYmUtc2FtcGxlLmMKKysrIGIvc2FtcGxlcy90cmFjZXBvaW50cy90cmFjZXBvaW50LXByb2JlLXNhbXBsZS5jCkBAIC0yOCw3ICsyOCw3IEBACiAJcHJpbnRrKEtFUk5fSU5GTyAiRXZlbnQgQiBpcyBlbmNvdW50ZXJlZFxuIik7CiB9CiAKLWludCBfX2luaXQgdHBfc2FtcGxlX3RyYWNlX2luaXQodm9pZCkKK3N0YXRpYyBpbnQgX19pbml0IHRwX3NhbXBsZV90cmFjZV9pbml0KHZvaWQpCiB7CiAJaW50IHJldDsKIApAQCAtNDIsNyArNDIsNyBAQAogCiBtb2R1bGVfaW5pdCh0cF9zYW1wbGVfdHJhY2VfaW5pdCk7CiAKLXZvaWQgX19leGl0IHRwX3NhbXBsZV90cmFjZV9leGl0KHZvaWQpCitzdGF0aWMgdm9pZCBfX2V4aXQgdHBfc2FtcGxlX3RyYWNlX2V4aXQodm9pZCkKIHsKIAl1bnJlZ2lzdGVyX3RyYWNlX3N1YnN5c19ldmVudGIocHJvYmVfc3Vic3lzX2V2ZW50Yik7CiAJdW5yZWdpc3Rlcl90cmFjZV9zdWJzeXNfZXZlbnQocHJvYmVfc3Vic3lzX2V2ZW50KTsKZGlmZiAtLWdpdCBhL3NhbXBsZXMvdHJhY2Vwb2ludHMvdHJhY2Vwb2ludC1wcm9iZS1zYW1wbGUyLmMgYi9zYW1wbGVzL3RyYWNlcG9pbnRzL3RyYWNlcG9pbnQtcHJvYmUtc2FtcGxlMi5jCmluZGV4IDY4NWE1YWMuLmJlMmE5NjAgMTAwNjQ0Ci0tLSBhL3NhbXBsZXMvdHJhY2Vwb2ludHMvdHJhY2Vwb2ludC1wcm9iZS1zYW1wbGUyLmMKKysrIGIvc2FtcGxlcy90cmFjZXBvaW50cy90cmFjZXBvaW50LXByb2JlLXNhbXBsZTIuYwpAQCAtMTgsNyArMTgsNyBAQAogCQlpbm9kZS0+aV9pbm8pOwogfQogCi1pbnQgX19pbml0IHRwX3NhbXBsZV90cmFjZV9pbml0KHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCB0cF9zYW1wbGVfdHJhY2VfaW5pdCh2b2lkKQogewogCWludCByZXQ7CiAKQEAgLTMwLDcgKzMwLDcgQEAKIAogbW9kdWxlX2luaXQodHBfc2FtcGxlX3RyYWNlX2luaXQpOwogCi12b2lkIF9fZXhpdCB0cF9zYW1wbGVfdHJhY2VfZXhpdCh2b2lkKQorc3RhdGljIHZvaWQgX19leGl0IHRwX3NhbXBsZV90cmFjZV9leGl0KHZvaWQpCiB7CiAJdW5yZWdpc3Rlcl90cmFjZV9zdWJzeXNfZXZlbnQocHJvYmVfc3Vic3lzX2V2ZW50KTsKIAl0cmFjZXBvaW50X3N5bmNocm9uaXplX3VucmVnaXN0ZXIoKTsKZGlmZiAtLWdpdCBhL3NhbXBsZXMvdHJhY2Vwb2ludHMvdHJhY2Vwb2ludC1zYW1wbGUuYyBiL3NhbXBsZXMvdHJhY2Vwb2ludHMvdHJhY2Vwb2ludC1zYW1wbGUuYwppbmRleCAwMGQxNjk3Li42OGQ1ZGMwIDEwMDY0NAotLS0gYS9zYW1wbGVzL3RyYWNlcG9pbnRzL3RyYWNlcG9pbnQtc2FtcGxlLmMKKysrIGIvc2FtcGxlcy90cmFjZXBvaW50cy90cmFjZXBvaW50LXNhbXBsZS5jCkBAIC0zMiw3ICszMiw3IEBACiAJLm9wZW4gPSBteV9vcGVuLAogfTsKIAotc3RhdGljIGludCBleGFtcGxlX2luaXQodm9pZCkKK3N0YXRpYyBpbnQgX19pbml0IGV4YW1wbGVfaW5pdCh2b2lkKQogewogCXByaW50ayhLRVJOX0FMRVJUICJleGFtcGxlIGluaXRcbiIpOwogCXBlbnRyeV9leGFtcGxlID0gcHJvY19jcmVhdGUoInRyYWNlcG9pbnQtZXhhbXBsZSIsIDA0NDQsIE5VTEwsCkBAIC00Miw3ICs0Miw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIGV4YW1wbGVfZXhpdCh2b2lkKQorc3RhdGljIHZvaWQgX19leGl0IGV4YW1wbGVfZXhpdCh2b2lkKQogewogCXByaW50ayhLRVJOX0FMRVJUICJleGFtcGxlIGV4aXRcbiIpOwogCXJlbW92ZV9wcm9jX2VudHJ5KCJ0cmFjZXBvaW50LWV4YW1wbGUiLCBOVUxMKTsKZGlmZiAtLWdpdCBhL3NjcmlwdHMvLmdpdGlnbm9yZSBiL3NjcmlwdHMvLmdpdGlnbm9yZQppbmRleCBiOTM5ZmJkLi4wOWUyNDA2IDEwMDY0NAotLS0gYS9zY3JpcHRzLy5naXRpZ25vcmUKKysrIGIvc2NyaXB0cy8uZ2l0aWdub3JlCkBAIC0xLDYgKzEsNyBAQAogIwogIyBHZW5lcmF0ZWQgZmlsZXMKICMKK2loZXgyZncKIGNvbm1ha2VoYXNoCiBrYWxsc3ltcwogcG5tdG9sb2dvCmRpZmYgLS1naXQgYS9zY3JpcHRzL01ha2VmaWxlIGIvc2NyaXB0cy9NYWtlZmlsZQppbmRleCBhYWZkZjA2Li4wMzUxODJlIDEwMDY0NAotLS0gYS9zY3JpcHRzL01ha2VmaWxlCisrKyBiL3NjcmlwdHMvTWFrZWZpbGUKQEAgLTIsMTEgKzIsMTIgQEAKICMgc2NyaXB0cyBjb250YWlucyBzb3VyY2VzIGZvciB2YXJpb3VzIGhlbHBlciBwcm9ncmFtcyB1c2VkIHRocm91Z2hvdXQKICMgdGhlIGtlcm5lbCBmb3IgdGhlIGJ1aWxkIHByb2Nlc3MuCiAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBpaGV4MmZ3OiAgICAgICBQYXJzZXIvbG9hZGVyIGZvciBJSEVYIGZvcm1hdHRlZCBkYXRhCiAjIGthbGxzeW1zOiAgICAgIEZpbmQgYWxsIHN5bWJvbHMgaW4gdm1saW51eAogIyBwbm10dG9sb2dvOiAgICBDb252ZXJ0IHBubSBmaWxlcyB0byBsb2dvIGZpbGVzCi0jIGNvbm1ha2VoYXNoOiAgIENyZWF0ZSBjaGFydGFibGUKICMgY29ubWFrZWhhc2g6CSBDcmVhdGUgYXJyYXlzIGZvciBpbml0aWFsaXppbmcgdGhlIGtlcm5lbCBjb25zb2xlIHRhYmxlcwogCitob3N0cHJvZ3MteSAgICAgICAgICAgICAgICAgICAgICA6PSBpaGV4MmZ3CiBob3N0cHJvZ3MtJChDT05GSUdfS0FMTFNZTVMpICAgICArPSBrYWxsc3ltcwogaG9zdHByb2dzLSQoQ09ORklHX0xPR08pICAgICAgICAgKz0gcG5tdG9sb2dvCiBob3N0cHJvZ3MtJChDT05GSUdfVlQpICAgICAgICAgICArPSBjb25tYWtlaGFzaApkaWZmIC0tZ2l0IGEvc2NyaXB0cy9ib290Z3JhcGgucGwgYi9zY3JpcHRzL2Jvb3RncmFwaC5wbAppbmRleCBmMGFmOWFhLi4wYTQ5OGUzIDEwMDY0NAotLS0gYS9zY3JpcHRzL2Jvb3RncmFwaC5wbAorKysgYi9zY3JpcHRzL2Jvb3RncmFwaC5wbApAQCAtODgsNyArODgsNyBAQAogfQogCiBwcmludCAiPD94bWwgdmVyc2lvbj1cIjEuMFwiIHN0YW5kYWxvbmU9XCJub1wiPz4gXG4iOwotcHJpbnQgIjxzdmcgd2lkdGg9XCIxMDAwXCIgaGVpZ2h0PVwiMTAwJVwiIHZlcnNpb249XCIxLjFcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4iOworcHJpbnQgIjxzdmcgd2lkdGg9XCIyMDAwXCIgaGVpZ2h0PVwiMTAwJVwiIHZlcnNpb249XCIxLjFcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4iOwogCiBteSBAc3R5bGVzOwogCkBAIC0xMDUsOCArMTA1LDkgQEAKICRzdHlsZXNbMTBdID0gImZpbGw6cmdiKDI1NSwxMjgsMjU1KTtmaWxsLW9wYWNpdHk6MC41O3N0cm9rZS13aWR0aDoxO3N0cm9rZTpyZ2IoMCwwLDApIjsKICRzdHlsZXNbMTFdID0gImZpbGw6cmdiKDEyOCwyNTUsMjU1KTtmaWxsLW9wYWNpdHk6MC41O3N0cm9rZS13aWR0aDoxO3N0cm9rZTpyZ2IoMCwwLDApIjsKIAotbXkgJG11bHQgPSA5NTAuMCAvICgkbWF4dGltZSAtICRmaXJzdHRpbWUpOwotbXkgJHRocmVzaG9sZCA9ICgkbWF4dGltZSAtICRmaXJzdHRpbWUpIC8gNjAuMDsKK215ICRtdWx0ID0gMTk1MC4wIC8gKCRtYXh0aW1lIC0gJGZpcnN0dGltZSk7CitteSAkdGhyZXNob2xkMiA9ICgkbWF4dGltZSAtICRmaXJzdHRpbWUpIC8gMTIwLjA7CitteSAkdGhyZXNob2xkID0gJHRocmVzaG9sZDIvMTA7CiBteSAkc3R5bGVjb3VudGVyID0gMDsKIG15ICVyb3dzOwogbXkgJHJvd3Njb3VudCA9IDE7CkBAIC0xMTYsNyArMTE3LDcgQEAKIAlteSAkZHVyYXRpb24gPSAkZW5keyRrZXl9IC0gJHN0YXJ0eyRrZXl9OwogCiAJaWYgKCRkdXJhdGlvbiA+PSAkdGhyZXNob2xkKSB7Ci0JCW15ICgkcywgJHMyLCAkZSwgJHcsICR5LCAkeTIsICRzdHlsZSk7CisJCW15ICgkcywgJHMyLCAkczMsICRlLCAkdywgJHksICR5MiwgJHN0eWxlKTsKIAkJbXkgJHBpZCA9ICRwaWRzeyRrZXl9OwogCiAJCWlmICghZGVmaW5lZCgkcm93c3skcGlkfSkpIHsKQEAgLTEyNSw2ICsxMjYsNyBAQAogCQl9CiAJCSRzID0gKCRzdGFydHska2V5fSAtICRmaXJzdHRpbWUpICogJG11bHQ7CiAJCSRzMiA9ICRzICsgNjsKKwkJJHMzID0gJHMgKyAxOwogCQkkZSA9ICgkZW5keyRrZXl9IC0gJGZpcnN0dGltZSkgKiAkbXVsdDsKIAkJJHcgPSAkZSAtICRzOwogCkBAIC0xMzgsNyArMTQwLDExIEBACiAJCX07CiAKIAkJcHJpbnQgIjxyZWN0IHg9XCIkc1wiIHdpZHRoPVwiJHdcIiB5PVwiJHlcIiBoZWlnaHQ9XCIxNDVcIiBzdHlsZT1cIiRzdHlsZVwiLz5cbiI7Ci0JCXByaW50ICI8dGV4dCB0cmFuc2Zvcm09XCJ0cmFuc2xhdGUoJHMyLCR5Mikgcm90YXRlKDkwKVwiPiRrZXk8L3RleHQ+XG4iOworCQlpZiAoJGR1cmF0aW9uID49ICR0aHJlc2hvbGQyKSB7CisJCQlwcmludCAiPHRleHQgdHJhbnNmb3JtPVwidHJhbnNsYXRlKCRzMiwkeTIpIHJvdGF0ZSg5MClcIj4ka2V5PC90ZXh0PlxuIjsKKwkJfSBlbHNlIHsKKwkJCXByaW50ICI8dGV4dCB0cmFuc2Zvcm09XCJ0cmFuc2xhdGUoJHMzLCR5Mikgcm90YXRlKDkwKVwiIGZvbnQtc2l6ZT1cIjNwdFwiPiRrZXk8L3RleHQ+XG4iOworCQl9CiAJfQogfQogCmRpZmYgLS1naXQgYS9zY3JpcHRzL2NoZWNrcGF0Y2gucGwgYi9zY3JpcHRzL2NoZWNrcGF0Y2gucGwKaW5kZXggZjg4YmIzZS4uN2JlZDRlZCAxMDA3NTUKLS0tIGEvc2NyaXB0cy9jaGVja3BhdGNoLnBsCisrKyBiL3NjcmlwdHMvY2hlY2twYXRjaC5wbApAQCAtMSw3ICsxLDggQEAKICMhL3Vzci9iaW4vcGVybCAtdwogIyAoYykgMjAwMSwgRGF2ZSBKb25lcy4gPGRhdmVqQHJlZGhhdC5jb20+ICh0aGUgZmlsZSBoYW5kbGluZyBiaXQpCiAjIChjKSAyMDA1LCBKb2VsIFNjaG9wcCA8anNjaG9wcEBhdXN0aW4uaWJtLmNvbT4gKHRoZSB1Z2x5IGJpdCkKLSMgKGMpIDIwMDcsIEFuZHkgV2hpdGNyb2Z0IDxhcHdAdWsuaWJtLmNvbT4gKG5ldyBjb25kaXRpb25zLCB0ZXN0IHN1aXRlLCBldGMpCisjIChjKSAyMDA3LDIwMDgsIEFuZHkgV2hpdGNyb2Z0IDxhcHdAdWsuaWJtLmNvbT4gKG5ldyBjb25kaXRpb25zLCB0ZXN0IHN1aXRlKQorIyAoYykgMjAwOCwgQW5keSBXaGl0Y3JvZnQgPGFwd0BjYW5vbmljYWwuY29tPgogIyBMaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEwgTGljZW5zZSB2ZXJzaW9uIDIKIAogdXNlIHN0cmljdDsKQEAgLTksNyArMTAsNyBAQAogbXkgJFAgPSAkMDsKICRQID1+IHNALiovQEBnOwogCi1teSAkViA9ICcwLjI0JzsKK215ICRWID0gJzAuMjYnOwogCiB1c2UgR2V0b3B0OjpMb25nIHF3KDpjb25maWcgbm9fYXV0b19hYmJyZXYpOwogCkBAIC02OCw3ICs2OSw5IEBACiBteSAkZGJnX3R5cGUgPSAwOwogbXkgJGRiZ19hdHRyID0gMDsKIGZvciBteSAka2V5IChrZXlzICVkZWJ1ZykgewotCWV2YWwgIlwke2RiZ18ka2V5fSA9ICckZGVidWd7JGtleX0nOyIKKwkjIyBubyBjcml0aWMKKwlldmFsICJcJHtkYmdfJGtleX0gPSAnJGRlYnVneyRrZXl9JzsiOworCWRpZSAiJEAiIGlmICgkQCk7CiB9CiAKIGlmICgkdGVyc2UpIHsKQEAgLTExNiw3ICsxMTksOCBAQAogCQkJX18oPzptZW18Y3B1fGRldnwpKD86aW5pdGRhdGF8aW5pdCl8CiAJCQlfX19fY2FjaGVsaW5lX2FsaWduZWR8CiAJCQlfX19fY2FjaGVsaW5lX2FsaWduZWRfaW5fc21wfAotCQkJX19fX2NhY2hlbGluZV9pbnRlcm5vZGVhbGlnbmVkX2luX3NtcAorCQkJX19fX2NhY2hlbGluZV9pbnRlcm5vZGVhbGlnbmVkX2luX3NtcHwKKwkJCV9fd2VhawogCQkgIH14Owogb3VyICRNb2RpZmllcjsKIG91ciAkSW5saW5lCT0gcXJ7aW5saW5lfF9fYWx3YXlzX2lubGluZXxub2lubGluZX07CkBAIC0xMjUsNiArMTI5LDcgQEAKIAogb3VyICRDb25zdGFudAk9IHFyeyg/OlswLTldK3wweFswLTlhLWZBLUZdKylbVUxdKn07CiBvdXIgJEFzc2lnbm1lbnQJPSBxcnsoPzpcKlw9fC89fCU9fFwrPXwtPXw8PD18Pj49fCY9fFxePXxcfD18PSl9Oworb3VyICRDb21wYXJlICAgID0gcXJ7PD18Pj18PT18IT18PHw+fTsKIG91ciAkT3BlcmF0b3JzCT0gcXJ7CiAJCQk8PXw+PXw9PXwhPXwKIAkJCT0+fC0+fDw8fD4+fDx8PnwhfH58CkBAIC0xOTAsNyArMTk1LDcgQEAKIAkJICB9eDsKIAkkVHlwZQk9IHFyewogCQkJJE5vbnB0clR5cGUKLQkJCSg/OlxzKlwqK1xzKmNvbnN0fFxzKlwqK3woPzpccypcW1xzKlxdKSspPworCQkJKD86W1xzXCpdK1xzKmNvbnN0fFtcc1wqXSt8KD86XHMqXFtccypcXSkrKT8KIAkJCSg/OlxzKyRJbmxpbmV8XHMrJE1vZGlmaWVyKSoKIAkJICB9eDsKIAkkRGVjbGFyZQk9IHFyeyg/OiRTdG9yYWdlXHMrKT8kVHlwZX07CkBAIC0yMDMsOSArMjA4LDkgQEAKIG15IEBkZXBfZnVuY3Rpb25zID0gKCk7CiBteSAkcmVtb3ZhbCA9ICJEb2N1bWVudGF0aW9uL2ZlYXR1cmUtcmVtb3ZhbC1zY2hlZHVsZS50eHQiOwogaWYgKCR0cmVlICYmIC1mICIkcm9vdC8kcmVtb3ZhbCIpIHsKLQlvcGVuKFJFTU9WRSwgIjwkcm9vdC8kcmVtb3ZhbCIpIHx8CisJb3BlbihteSAkUkVNT1ZFLCAnPCcsICIkcm9vdC8kcmVtb3ZhbCIpIHx8CiAJCQkJZGllICIkUDogJHJlbW92YWw6IG9wZW4gZmFpbGVkIC0gJCFcbiI7Ci0Jd2hpbGUgKDxSRU1PVkU+KSB7CisJd2hpbGUgKDwkUkVNT1ZFPikgewogCQlpZiAoL15DaGVjazpccysoLipcUykvKSB7CiAJCQlmb3IgbXkgJGVudHJ5IChzcGxpdCgvWywgXSsvLCAkMSkpIHsKIAkJCQlpZiAoJGVudHJ5ID1+IG1AaW5jbHVkZS8oLiopQCkgewpAQCAtMjE3LDE3ICsyMjIsMjEgQEAKIAkJCX0KIAkJfQogCX0KKwljbG9zZSgkUkVNT1ZFKTsKIH0KIAogbXkgQHJhd2xpbmVzID0gKCk7CiBteSBAbGluZXMgPSAoKTsKIG15ICR2bmFtZTsKIGZvciBteSAkZmlsZW5hbWUgKEBBUkdWKSB7CisJbXkgJEZJTEU7CiAJaWYgKCRmaWxlKSB7Ci0JCW9wZW4oRklMRSwgImRpZmYgLXUgL2Rldi9udWxsICRmaWxlbmFtZXwiKSB8fAorCQlvcGVuKCRGSUxFLCAnLXwnLCAiZGlmZiAtdSAvZGV2L251bGwgJGZpbGVuYW1lIikgfHwKIAkJCWRpZSAiJFA6ICRmaWxlbmFtZTogZGlmZiBmYWlsZWQgLSAkIVxuIjsKKwl9IGVsc2lmICgkZmlsZW5hbWUgZXEgJy0nKSB7CisJCW9wZW4oJEZJTEUsICc8JlNURElOJyk7CiAJfSBlbHNlIHsKLQkJb3BlbihGSUxFLCAiPCRmaWxlbmFtZSIpIHx8CisJCW9wZW4oJEZJTEUsICc8JywgIiRmaWxlbmFtZSIpIHx8CiAJCQlkaWUgIiRQOiAkZmlsZW5hbWU6IG9wZW4gZmFpbGVkIC0gJCFcbiI7CiAJfQogCWlmICgkZmlsZW5hbWUgZXEgJy0nKSB7CkBAIC0yMzUsMTEgKzI0NCwxMSBAQAogCX0gZWxzZSB7CiAJCSR2bmFtZSA9ICRmaWxlbmFtZTsKIAl9Ci0Jd2hpbGUgKDxGSUxFPikgeworCXdoaWxlICg8JEZJTEU+KSB7CiAJCWNob21wOwogCQlwdXNoKEByYXdsaW5lcywgJF8pOwogCX0KLQljbG9zZShGSUxFKTsKKwljbG9zZSgkRklMRSk7CiAJaWYgKCFwcm9jZXNzKCRmaWxlbmFtZSkpIHsKIAkJJGV4aXQgPSAxOwogCX0KQEAgLTM2Niw3ICszNzUsNyBAQAogCQkJfQogCQl9CiAKLQkJI3ByaW50ICJTUTokc2FuaXRpc2VfcXVvdGVcbiI7CisJCSNwcmludCAiYzwkYz4gU1E8JHNhbml0aXNlX3F1b3RlPlxuIjsKIAkJaWYgKCRvZmYgIT0gMCAmJiAkc2FuaXRpc2VfcXVvdGUgZXEgJyovJyAmJiAkYyBuZSAiXHQiKSB7CiAJCQlzdWJzdHIoJHJlcywgJG9mZiwgMSwgJDspOwogCQl9IGVsc2lmICgkb2ZmICE9IDAgJiYgJHNhbml0aXNlX3F1b3RlICYmICRjIG5lICJcdCIpIHsKQEAgLTQwMiw2ICs0MTEsNyBAQAogCiAJbXkgJHR5cGUgPSAnJzsKIAlteSAkbGV2ZWwgPSAwOworCW15IEBzdGFjayA9IChbJHR5cGUsICRsZXZlbF0pOwogCW15ICRwOwogCW15ICRjOwogCW15ICRsZW4gPSAwOwpAQCAtNDMzLDYgKzQ0MywxNiBAQAogCQkkcmVtYWluZGVyID0gc3Vic3RyKCRibGssICRvZmYpOwogCiAJCSN3YXJuICJDU0I6IGM8JGM+IHR5cGU8JHR5cGU+IGxldmVsPCRsZXZlbD4gcmVtYWluZGVyPCRyZW1haW5kZXI+IGNvZmZfc2V0PCRjb2ZmX3NldD5cbiI7CisKKwkJIyBIYW5kbGUgbmVzdGVkICNpZi8jZWxzZS4KKwkJaWYgKCRyZW1haW5kZXIgPX4gL14jXHMqKD86aWZuZGVmfGlmZGVmfGlmKVxzLykgeworCQkJcHVzaChAc3RhY2ssIFsgJHR5cGUsICRsZXZlbCBdKTsKKwkJfSBlbHNpZiAoJHJlbWFpbmRlciA9fiAvXiNccyooPzplbHNlfGVsaWYpXGIvKSB7CisJCQkoJHR5cGUsICRsZXZlbCkgPSBAeyRzdGFja1skI3N0YWNrIC0gMV19OworCQl9IGVsc2lmICgkcmVtYWluZGVyID1+IC9eI1xzKmVuZGlmXGIvKSB7CisJCQkoJHR5cGUsICRsZXZlbCkgPSBAe3BvcChAc3RhY2spfTsKKwkJfQorCiAJCSMgU3RhdGVtZW50IGVuZHMgYXQgdGhlICc7JyBvciBhIGNsb3NlICd9JyBhdCB0aGUKIAkJIyBvdXRlcm1vc3QgbGV2ZWwuCiAJCWlmICgkbGV2ZWwgPT0gMCAmJiAkYyBlcSAnOycpIHsKQEAgLTU3OSwxMSArNTk5LDIyIEBACiAJbXkgQHJlcyA9ICgpOwogCiAJbXkgJGxldmVsID0gMDsKKwlteSBAc3RhY2sgPSAoJGxldmVsKTsKIAlmb3IgKCRsaW5lID0gJHN0YXJ0OyAkcmVtYWluID4gMDsgJGxpbmUrKykgewogCQluZXh0IGlmICgkcmF3bGluZXNbJGxpbmVdID1+IC9eLS8pOwogCQkkcmVtYWluLS07CiAKIAkJJGJsayAuPSAkcmF3bGluZXNbJGxpbmVdOworCisJCSMgSGFuZGxlIG5lc3RlZCAjaWYvI2Vsc2UuCisJCWlmICgkcmF3bGluZXNbJGxpbmVdID1+IC9eLlxzKiNccyooPzppZm5kZWZ8aWZkZWZ8aWYpXHMvKSB7CisJCQlwdXNoKEBzdGFjaywgJGxldmVsKTsKKwkJfSBlbHNpZiAoJHJhd2xpbmVzWyRsaW5lXSA9fiAvXi5ccyojXHMqKD86ZWxzZXxlbGlmKVxiLykgeworCQkJJGxldmVsID0gJHN0YWNrWyQjc3RhY2sgLSAxXTsKKwkJfSBlbHNpZiAoJHJhd2xpbmVzWyRsaW5lXSA9fiAvXi5ccyojXHMqZW5kaWZcYi8pIHsKKwkJCSRsZXZlbCA9IHBvcChAc3RhY2spOworCQl9CisKIAkJZm9yZWFjaCBteSAkYyAoc3BsaXQoLy8sICRyYXdsaW5lc1skbGluZV0pKSB7CiAJCQkjI3ByaW50ICJDPCRjPkw8JGxldmVsPjwkb3BlbiRjbG9zZT5PPCRvZmY+XG4iOwogCQkJaWYgKCRvZmYgPiAwKSB7CkBAIC04NDMsMTEgKzg3NCwxMSBAQAogCQkJJHR5cGUgPSAnVic7CiAJCQkkYXZfcGVuZGluZyA9ICdWJzsKIAotCQl9IGVsc2lmICgkY3VyID1+IC9eKCRJZGVudFxzKik6LykgewotCQkJaWYgKCR0eXBlIGVxICdFJykgewotCQkJCSRhdl9wZW5kX2NvbG9uID0gJ0wnOwotCQkJfSBlbHNpZiAoJHR5cGUgZXEgJ1QnKSB7CisJCX0gZWxzaWYgKCRjdXIgPX4gL14oJElkZW50XHMqKTooPzpccypcZCtccyooLHw9fDspKT8vKSB7CisJCQlpZiAoZGVmaW5lZCAkMiAmJiAkdHlwZSBlcSAnQycgfHwgJHR5cGUgZXEgJ1QnKSB7CiAJCQkJJGF2X3BlbmRfY29sb24gPSAnQic7CisJCQl9IGVsc2lmICgkdHlwZSBlcSAnRScpIHsKKwkJCQkkYXZfcGVuZF9jb2xvbiA9ICdMJzsKIAkJCX0KIAkJCXByaW50ICJJREVOVF9DT0xPTigkMSwkdHlwZT4kYXZfcGVuZF9jb2xvbilcbiIgaWYgKCRkYmdfdmFsdWVzID4gMSk7CiAJCQkkdHlwZSA9ICdWJzsKQEAgLTg2NSw2ICs4OTYsMTAgQEAKIAkJCSR0eXBlID0gJ0UnOwogCQkJJGF2X3BlbmRfY29sb24gPSAnTyc7CiAKKwkJfSBlbHNpZiAoJGN1ciA9fi9eKCwpLykgeworCQkJcHJpbnQgIkNPTU1BKCQxKVxuIiBpZiAoJGRiZ192YWx1ZXMgPiAxKTsKKwkJCSR0eXBlID0gJ0MnOworCiAJCX0gZWxzaWYgKCRjdXIgPX4gL14oXD8pL28pIHsKIAkJCXByaW50ICJRVUVTVElPTigkMSlcbiIgaWYgKCRkYmdfdmFsdWVzID4gMSk7CiAJCQkkdHlwZSA9ICdOJzsKQEAgLTg4MCw3ICs5MTUsNyBAQAogCQkJfQogCQkJJGF2X3BlbmRfY29sb24gPSAnTyc7CiAKLQkJfSBlbHNpZiAoJGN1ciA9fiAvXig7fFxbKS9vKSB7CisJCX0gZWxzaWYgKCRjdXIgPX4gL14oXFspL28pIHsKIAkJCXByaW50ICJDTE9TRSgkMSlcbiIgaWYgKCRkYmdfdmFsdWVzID4gMSk7CiAJCQkkdHlwZSA9ICdOJzsKIApAQCAtMTA1MSw2ICsxMDg2LDcgQEAKIAlteSAkaW5fY29tbWVudCA9IDA7CiAJbXkgJGNvbW1lbnRfZWRnZSA9IDA7CiAJbXkgJGZpcnN0X2xpbmUgPSAwOworCW15ICRwMV9wcmVmaXggPSAnJzsKIAogCW15ICRwcmV2X3ZhbHVlcyA9ICdFJzsKIApAQCAtMTA5Nyw5ICsxMTMzLDEyIEBACiAJCQkJCSAkcmF3bGluZXNbJGxuIC0gMV0gPX4gL14tLyk7CiAJCQkJJGNudC0tOwogCQkJCSNwcmludCAiUkFXPCRyYXdsaW5lc1skbG4gLSAxXT5cbiI7Ci0JCQkJKCRlZGdlKSA9IChkZWZpbmVkICRyYXdsaW5lc1skbG4gLSAxXSAmJgotCQkJCQkkcmF3bGluZXNbJGxuIC0gMV0gPX4gbUAoL1wqfFwqLylAKTsKLQkJCQlsYXN0IGlmIChkZWZpbmVkICRlZGdlKTsKKwkJCQlsYXN0IGlmICghZGVmaW5lZCAkcmF3bGluZXNbJGxuIC0gMV0pOworCQkJCWlmICgkcmF3bGluZXNbJGxuIC0gMV0gPX4gbUAoL1wqfFwqLylAICYmCisJCQkJICAgICRyYXdsaW5lc1skbG4gLSAxXSAhfiBtQCJbXiJdKig/Oi9cKnxcKi8pW14iXSoiQCkgeworCQkJCQkoJGVkZ2UpID0gJDE7CisJCQkJCWxhc3Q7CisJCQkJfQogCQkJfQogCQkJaWYgKGRlZmluZWQgJGVkZ2UgJiYgJGVkZ2UgZXEgJyovJykgewogCQkJCSRpbl9jb21tZW50ID0gMTsKQEAgLTExMDksNyArMTE0OCw3IEBACiAJCQkjIGlzIHRoZSBzdGFydCBvZiBhIGRpZmYgYmxvY2sgYW5kIHRoaXMgbGluZSBzdGFydHMKIAkJCSMgJyAqJyB0aGVuIGl0IGlzIHZlcnkgbGlrZWx5IGEgY29tbWVudC4KIAkJCWlmICghZGVmaW5lZCAkZWRnZSAmJgotCQkJICAgICRyYXdsaW5lc1skbGluZW5yXSA9fiBtQF4uXHMqIFwqKD86XHN8JClAKQorCQkJICAgICRyYXdsaW5lc1skbGluZW5yXSA9fiBtQF4uXHMqKD86XCpcKit8IFwqKSg/OlxzfCQpQCkKIAkJCXsKIAkJCQkkaW5fY29tbWVudCA9IDE7CiAJCQl9CkBAIC0xMTk2LDcgKzEyMzUsMTIgQEAKIAkJIyBleHRyYWN0IHRoZSBmaWxlbmFtZSBhcyBpdCBwYXNzZXMKIAkJaWYgKCRsaW5lPX4vXlwrXCtcK1xzKyhcUyspLykgewogCQkJJHJlYWxmaWxlID0gJDE7Ci0JCQkkcmVhbGZpbGUgPX4gc0BeW14vXSovQEA7CisJCQkkcmVhbGZpbGUgPX4gc0BeKFteL10qKS9AQDsKKworCQkJJHAxX3ByZWZpeCA9ICQxOworCQkJaWYgKCR0cmVlICYmICRwMV9wcmVmaXggbmUgJycgJiYgLWUgIiRyb290LyRwMV9wcmVmaXgiKSB7CisJCQkJV0FSTigicGF0Y2ggcHJlZml4ICckcDFfcHJlZml4JyBleGlzdHMsIGFwcGVhcnMgdG8gYmUgYSAtcDAgcGF0Y2hcbiIpOworCQkJfQogCiAJCQlpZiAoJHJlYWxmaWxlID1+IG1AXmluY2x1ZGUvYXNtL0ApIHsKIAkJCQlFUlJPUigiZG8gbm90IG1vZGlmeSBmaWxlcyBpbiBpbmNsdWRlL2FzbSwgY2hhbmdlIGFyY2hpdGVjdHVyZSBzcGVjaWZpYyBmaWxlcyBpbiBpbmNsdWRlL2FzbS08YXJjaGl0ZWN0dXJlPlxuIiAuICIkaGVyZSRyYXdsaW5lXG4iKTsKQEAgLTEzMzYsNyArMTM4MCw3IEBACiAJCQl9CiAKIAkJCSMgYW55IChmb28gLi4uICopIGlzIGEgcG9pbnRlciBjYXN0LCBhbmQgZm9vIGlzIGEgdHlwZQotCQkJd2hpbGUgKCRzID1+IC9cKCgkSWRlbnQpKD86XHMrJFNwYXJzZSkqXHMqXCorXHMqXCkvc2cpIHsKKwkJCXdoaWxlICgkcyA9fiAvXCgoJElkZW50KSg/OlxzKyRTcGFyc2UpKltcc1wqXStccypcKS9zZykgewogCQkJCXBvc3NpYmxlKCQxLCAiQzoiIC4gJHMpOwogCQkJfQogCkBAIC0xNTk0LDcgKzE2MzgsNyBAQAogCQkJCSRoZXJlY3Vycik7CiAJCX0KICMgY2hlY2sgZm9yIHN0YXRpYyBpbml0aWFsaXNlcnMuCi0JCWlmICgkbGluZSA9fiAvXHMqc3RhdGljXHMuKj1ccyooMHxOVUxMfGZhbHNlKVxzKjsvKSB7CisJCWlmICgkbGluZSA9fiAvXGJzdGF0aWNccy4qPVxzKigwfE5VTEx8ZmFsc2UpXHMqOy8pIHsKIAkJCUVSUk9SKCJkbyBub3QgaW5pdGlhbGlzZSBzdGF0aWNzIHRvIDAgb3IgTlVMTFxuIiAuCiAJCQkJJGhlcmVjdXJyKTsKIAkJfQpAQCAtMTYwMiw3ICsxNjQ2LDcgQEAKICMgY2hlY2sgZm9yIG5ldyB0eXBlZGVmcywgb25seSBmdW5jdGlvbiBwYXJhbWV0ZXJzIGFuZCBzcGFyc2UgYW5ub3RhdGlvbnMKICMgbWFrZSBzZW5zZS4KIAkJaWYgKCRsaW5lID1+IC9cYnR5cGVkZWZccy8gJiYKLQkJICAgICRsaW5lICF+IC9cYnR5cGVkZWZccyskVHlwZVxzK1woXHMqXCo/JElkZW50XHMqXClccypcKC8gJiYKKwkJICAgICRsaW5lICF+IC9cYnR5cGVkZWZccyskVHlwZVxzKlwoXHMqXCo/JElkZW50XHMqXClccypcKC8gJiYKIAkJICAgICRsaW5lICF+IC9cYnR5cGVkZWZccyskVHlwZVxzKyRJZGVudFxzKlwoLyAmJgogCQkgICAgJGxpbmUgIX4gL1xiJHR5cGVUeXBlZGVmc1xiLyAmJgogCQkgICAgJGxpbmUgIX4gL1xiX19iaXR3aXNlKD86X198KVxiLykgewpAQCAtMTYxMCwyMSArMTY1NCwzOSBAQAogCQl9CiAKICMgKiBnb2VzIG9uIHZhcmlhYmxlIG5vdCBvbiB0eXBlCi0JCWlmICgkbGluZSA9fiBte1woJE5vbnB0clR5cGUoXCorKSg/OlxzK2NvbnN0KT9cKX0pIHsKLQkJCUVSUk9SKCJcIihmb28kMSlcIiBzaG91bGQgYmUgXCIoZm9vICQxKVwiXG4iIC4KLQkJCQkkaGVyZWN1cnIpOworCQkjIChjaGFyKlsgY29uc3RdKQorCQlpZiAoJGxpbmUgPX4gbXtcKCROb25wdHJUeXBlKFxzKlwqW1xzXCpdKig/OiRNb2RpZmllclxzKikqKVwpfSkgeworCQkJbXkgKCRmcm9tLCAkdG8pID0gKCQxLCAkMSk7CiAKLQkJfSBlbHNpZiAoJGxpbmUgPX4gbXtcKCROb25wdHJUeXBlXHMrKFwqKykoPyFccytjb25zdClccytcKX0pIHsKLQkJCUVSUk9SKCJcIihmb28gJDEgKVwiIHNob3VsZCBiZSBcIihmb28gJDEpXCJcbiIgLgotCQkJCSRoZXJlY3Vycik7CisJCQkjIFNob3VsZCBzdGFydCB3aXRoIGEgc3BhY2UuCisJCQkkdG8gPX4gcy9eKFxTKS8gJDEvOworCQkJIyBTaG91bGQgbm90IGVuZCB3aXRoIGEgc3BhY2UuCisJCQkkdG8gPX4gcy9ccyskLy87CisJCQkjICcqJ3Mgc2hvdWxkIG5vdCBoYXZlIHNwYWNlcyBiZXR3ZWVuLgorCQkJd2hpbGUgKCR0byA9fiBzLyguKVxzXCovJDFcKi8pIHsKKwkJCX0KIAotCQl9IGVsc2lmICgkbGluZSA9fiBte1xiJE5vbnB0clR5cGUoXCorKSg/OlxzKyg/OiRBdHRyaWJ1dGV8JFNwYXJzZSkpP1xzK1tBLVphLXpcZF9dK30pIHsKLQkJCUVSUk9SKCJcImZvbyQxIGJhclwiIHNob3VsZCBiZSBcImZvbyAkMWJhclwiXG4iIC4KLQkJCQkkaGVyZWN1cnIpOworCQkJI3ByaW50ICJmcm9tPCRmcm9tPiB0bzwkdG8+XG4iOworCQkJaWYgKCRmcm9tIG5lICR0bykgeworCQkJCUVSUk9SKCJcIihmb28kZnJvbSlcIiBzaG91bGQgYmUgXCIoZm9vJHRvKVwiXG4iIC4gICRoZXJlY3Vycik7CisJCQl9CisJCX0gZWxzaWYgKCRsaW5lID1+IG17XGIkTm9ucHRyVHlwZShccypcKltcc1wqXSooPzokTW9kaWZpZXJccyopPykoJElkZW50KX0pIHsKKwkJCW15ICgkZnJvbSwgJHRvLCAkaWRlbnQpID0gKCQxLCAkMSwgJDIpOwogCi0JCX0gZWxzaWYgKCRsaW5lID1+IG17XGIkTm9ucHRyVHlwZVxzKyhcKispKD8hXHMrKD86JEF0dHJpYnV0ZXwkU3BhcnNlKSlccytbQS1aYS16XGRfXSt9KSB7Ci0JCQlFUlJPUigiXCJmb28gJDEgYmFyXCIgc2hvdWxkIGJlIFwiZm9vICQxYmFyXCJcbiIgLgotCQkJCSRoZXJlY3Vycik7CisJCQkjIFNob3VsZCBzdGFydCB3aXRoIGEgc3BhY2UuCisJCQkkdG8gPX4gcy9eKFxTKS8gJDEvOworCQkJIyBTaG91bGQgbm90IGVuZCB3aXRoIGEgc3BhY2UuCisJCQkkdG8gPX4gcy9ccyskLy87CisJCQkjICcqJ3Mgc2hvdWxkIG5vdCBoYXZlIHNwYWNlcyBiZXR3ZWVuLgorCQkJd2hpbGUgKCR0byA9fiBzLyguKVxzXCovJDFcKi8pIHsKKwkJCX0KKwkJCSMgTW9kaWZpZXJzIHNob3VsZCBoYXZlIHNwYWNlcy4KKwkJCSR0byA9fiBzLyhcYiRNb2RpZmllciQpLyQxIC87CisKKwkJCSNwcmludCAiZnJvbTwkZnJvbT4gdG88JHRvPlxuIjsKKwkJCWlmICgkZnJvbSBuZSAkdG8pIHsKKwkJCQlFUlJPUigiXCJmb28ke2Zyb219YmFyXCIgc2hvdWxkIGJlIFwiZm9vJHt0b31iYXJcIlxuIiAuICAkaGVyZWN1cnIpOworCQkJfQogCQl9CiAKICMgIyBubyBCVUcoKSBvciBCVUdfT04oKQpAQCAtMTc1OSw3ICsxODIxLDcgQEAKIAkJCQkJJGMgPSAnQycgaWYgKCRlbGVtZW50c1skbiArIDJdID1+IC9eJDsvKTsKIAkJCQkJJGMgPSAnQicgaWYgKCRlbGVtZW50c1skbiArIDJdID1+IC9eKFwpfFxdfDspLyk7CiAJCQkJCSRjID0gJ08nIGlmICgkZWxlbWVudHNbJG4gKyAyXSBlcSAnJyk7Ci0JCQkJCSRjID0gJ0UnIGlmICgkZWxlbWVudHNbJG4gKyAyXSA9fiAvXHMqXFwkLyk7CisJCQkJCSRjID0gJ0UnIGlmICgkZWxlbWVudHNbJG4gKyAyXSA9fiAvXlxzKlxcJC8pOwogCQkJCX0gZWxzZSB7CiAJCQkJCSRjID0gJ0UnOwogCQkJCX0KQEAgLTE5NTAsOSArMjAxMiw5IEBACiAJCQlteSAkc3BhY2luZyA9ICQxOwogCQkJbXkgJHZhbHVlID0gJDI7CiAKLQkJCSMgRmxhdHRlbiBhbnkgcGFyZW50aGVzZXMgYW5kIGJyYWNlcworCQkJIyBGbGF0dGVuIGFueSBwYXJlbnRoZXNlcwogCQkJJHZhbHVlID1+IHMvXClcKC9cKSBcKC9nOwotCQkJd2hpbGUgKCR2YWx1ZSA9fiBzL1woW15cKFwpXSpcKS8xLykgeworCQkJd2hpbGUgKCR2YWx1ZSAhfiAvKD86JElkZW50fC0/JENvbnN0YW50KVxzKiRDb21wYXJlXHMqKD86JElkZW50fC0/JENvbnN0YW50KS8gJiYgJHZhbHVlID1+IHMvXChbXlwoXCldKlwpLzEvKSB7CiAJCQl9CiAKIAkJCWlmICgkdmFsdWUgPX4gL14oPzokSWRlbnR8LT8kQ29uc3RhbnQpJC8pIHsKQEAgLTE5OTIsNyArMjA1NCw3IEBACiAJCSAgICAkbGluZSA9fiAvXGIoPzppZnx3aGlsZXxmb3IpXHMqXCgvICYmICRsaW5lICF+IC9eLlxzKiMvKSB7CiAJCQlteSAoJHMsICRjKSA9ICgkc3RhdCwgJGNvbmQpOwogCi0JCQlpZiAoJGMgPX4gL1xiaWZccypcKC4qW148PiE9XT1bXj1dLiovKSB7CisJCQlpZiAoJGMgPX4gL1xiaWZccypcKC4qW148PiE9XT1bXj1dLiovcykgewogCQkJCUVSUk9SKCJkbyBub3QgdXNlIGFzc2lnbm1lbnQgaW4gaWYgY29uZGl0aW9uXG4iIC4gJGhlcmVjdXJyKTsKIAkJCX0KIApAQCAtMjE2Nyw5ICsyMjI5LDEwIEBACiAJCQkJTU9EVUxFX1BBUkFNX0RFU0N8CiAJCQkJREVDTEFSRV9QRVJfQ1BVfAogCQkJCURFRklORV9QRVJfQ1BVfAotCQkJCV9fdHlwZW9mX19cKAorCQkJCV9fdHlwZW9mX19cKHwKKwkJCQlcLiRJZGVudFxzKj1ccyoKIAkJCX14OwotCQkJI3ByaW50ICJSRVNUPCRyZXN0PlxuIjsKKwkJCSNwcmludCAiUkVTVDwkcmVzdD4gZHN0YXQ8JGRzdGF0PlxuIjsKIAkJCWlmICgkcmVzdCBuZSAnJykgewogCQkJCWlmICgkcmVzdCAhfiAvd2hpbGVccypcKC8gJiYKIAkJCQkgICAgJGRzdGF0ICF+IC8kZXhjZXB0aW9ucy8pCkBAIC0yMTg5LDYgKzIyNTIsMTUgQEAKIAkJCX0KIAkJfQogCisjIG1ha2Ugc3VyZSBzeW1ib2xzIGFyZSBhbHdheXMgd3JhcHBlZCB3aXRoIFZNTElOVVhfU1lNQk9MKCkgLi4uCisjIGFsbCBhc3NpZ25tZW50cyBtYXkgaGF2ZSBvbmx5IG9uZSBvZiB0aGUgZm9sbG93aW5nIHdpdGggYW4gYXNzaWdubWVudDoKKyMJLgorIwlBTElHTiguLi4pCisjCVZNTElOVVhfU1lNQk9MKC4uLikKKwkJaWYgKCRyZWFsZmlsZSBlcSAndm1saW51eC5sZHMuaCcgJiYgJGxpbmUgPX4gLyg/Oig/Ol58XHMpJElkZW50XHMqPXw9XHMqJElkZW50KD86XHN8JCkpLykgeworCQkJV0FSTigidm1saW51eC5sZHMuaCBuZWVkcyBWTUxJTlVYX1NZTUJPTCgpIGFyb3VuZCBDLXZpc2libGUgc3ltYm9sc1xuIiAuICRoZXJlY3Vycik7CisJCX0KKwogIyBjaGVjayBmb3IgcmVkdW5kYW50IGJyYWNpbmcgcm91bmQgaWYgZXRjCiAJCWlmICgkbGluZSA9fiAvKF4uKilcYmlmXGIvICYmICQxICF+IC9lbHNlXHMqJC8pIHsKIAkJCW15ICgkbGV2ZWwsICRlbmRsbiwgQGNodW5rcykgPQpAQCAtMjQ0Myw2ICsyNTE1LDExIEBACiAJCWlmICgkbGluZSA9fiAvXi5ccypfX2luaXRjYWxsXHMqXCgvKSB7CiAJCQlXQVJOKCJwbGVhc2UgdXNlIGRldmljZV9pbml0Y2FsbCgpIGluc3RlYWQgb2YgX19pbml0Y2FsbCgpXG4iIC4gJGhlcmVjdXJyKTsKIAkJfQorIyBjaGVjayBmb3Igc3RydWN0IGZpbGVfb3BlcmF0aW9ucywgZW5zdXJlIHRoZXkgYXJlIGNvbnN0LgorCQlpZiAoJGxpbmUgPX4gL1xic3RydWN0XHMrZmlsZV9vcGVyYXRpb25zXGIvICYmCisJCSAgICAkbGluZSAhfiAvXGJjb25zdFxiLykgeworCQkJV0FSTigic3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzaG91bGQgbm9ybWFsbHkgYmUgY29uc3RcbiIgLiAkaGVyZWN1cnIpOworCQl9CiAKICMgdXNlIG9mIE5SX0NQVVMgaXMgdXN1YWxseSB3cm9uZwogIyBpZ25vcmUgZGVmaW5pdGlvbnMgb2YgTlJfQ1BVUyBhbmQgdXNhZ2UgdG8gZGVmaW5lIGFycmF5cyBhcyBsaWtlbHkgcmlnaHQKQEAgLTI0NjYsNiArMjU0MywxNSBAQAogCQkJCWxhc3Q7CiAJCQl9CiAJCX0KKworIyB3aGluZSBtaWdodGx5IGFib3V0IGluX2F0b21pYworCQlpZiAoJGxpbmUgPX4gL1xiaW5fYXRvbWljXHMqXCgvKSB7CisJCQlpZiAoJHJlYWxmaWxlID1+IG1AXmRyaXZlcnMvQCkgeworCQkJCUVSUk9SKCJkbyBub3QgdXNlIGluX2F0b21pYyBpbiBkcml2ZXJzXG4iIC4gJGhlcmVjdXJyKTsKKwkJCX0gZWxzZSB7CisJCQkJV0FSTigidXNlIG9mIGluX2F0b21pYygpIGlzIGluY29ycmVjdCBvdXRzaWRlIGNvcmUga2VybmVsIGNvZGVcbiIgLiAkaGVyZWN1cnIpOworCQkJfQorCQl9CiAJfQogCiAJIyBJZiB3ZSBoYXZlIG5vIGlucHV0IGF0IGFsbCwgdGhlbiB0aGVyZSBpcyBub3RoaW5nIHRvIHJlcG9ydCBvbgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9jb25maWcgYi9zY3JpcHRzL2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42OGI5NzYxCi0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9jb25maWcKQEAgLTAsMCArMSwxNTAgQEAKKyMhL2Jpbi9iYXNoCisjIE1hbmlwdWxhdGUgb3B0aW9ucyBpbiBhIC5jb25maWcgZmlsZSBmcm9tIHRoZSBjb21tYW5kIGxpbmUKKwordXNhZ2UoKSB7CisJY2F0ID4mMiA8PEVPTAorTWFuaXB1bGF0ZSBvcHRpb25zIGluIGEgLmNvbmZpZyBmaWxlIGZyb20gdGhlIGNvbW1hbmQgbGluZS4KK1VzYWdlOgorY29uZmlnIG9wdGlvbnMgY29tbWFuZCAuLi4KK2NvbW1hbmRzOgorCS0tZW5hYmxlfC1lIG9wdGlvbiAgIEVuYWJsZSBvcHRpb24KKwktLWRpc2FibGV8LWQgb3B0aW9uICBEaXNhYmxlIG9wdGlvbgorCS0tbW9kdWxlfC1tIG9wdGlvbiAgICAgIFR1cm4gb3B0aW9uIGludG8gYSBtb2R1bGUKKwktLXN0YXRlfC1zIG9wdGlvbiAgICAgICBQcmludCBzdGF0ZSBvZiBvcHRpb24gKG4seSxtLHVuZGVmKQorCisJLS1lbmFibGUtYWZ0ZXJ8LUUgYmVmb3Jlb3B0IG9wdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbmFibGUgb3B0aW9uIGRpcmVjdGx5IGFmdGVyIG90aGVyIG9wdGlvbgorCS0tZGlzYWJsZS1hZnRlcnwtRCBiZWZvcmVvcHQgb3B0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpc2FibGUgb3B0aW9uIGRpcmVjdGx5IGFmdGVyIG90aGVyIG9wdGlvbgorCS0tbW9kdWxlLWFmdGVyfC1NIGJlZm9yZW9wdCBvcHRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHVybiBvcHRpb24gaW50byBtb2R1bGUgZGlyZWN0bHkgYWZ0ZXIgb3RoZXIgb3B0aW9uCisKKwljb21tYW5kcyBjYW4gYmUgcmVwZWF0ZWQgbXVsdGlwbGUgdGltZXMKKworb3B0aW9uczoKKwktLWZpbGUgLmNvbmZpZyBmaWxlIHRvIGNoYW5nZSAoZGVmYXVsdCAuY29uZmlnKQorCitjb25maWcgZG9lc24ndCBjaGVjayB0aGUgdmFsaWRpdHkgb2YgdGhlIC5jb25maWcgZmlsZS4gVGhpcyBpcyBkb25lIGF0IG5leHQKKyBtYWtlIHRpbWUuCitUaGUgb3B0aW9ucyBuZWVkIHRvIGJlIGFscmVhZHkgaW4gdGhlIGZpbGUgYmVmb3JlIHRoZXkgY2FuIGJlIGNoYW5nZWQsCitidXQgc29tZXRpbWVzIHlvdSBjYW4gY2hlYXQgd2l0aCB0aGUgLS0qLWFmdGVyIG9wdGlvbnMuCitFT0wKKwlleGl0IDEKK30KKworY2hlY2thcmcoKSB7CisJQVJHPSIkMSIKKwlpZiBbICIkQVJHIiA9ICIiIF0gOyB0aGVuCisJCXVzYWdlCisJZmkKKwljYXNlICIkQVJHIiBpbgorCUNPTkZJR18qKQorCQlBUkc9IiR7QVJHL0NPTkZJR18vfSIKKwkJOzsKKwllc2FjCisJQVJHPSJgZWNobyAkQVJHIHwgdHIgYS16IEEtWmAiCit9CisKK3JlcGxhY2UoKSB7CisJc2VkIC1pIC1lICIkQCIgJEZOCit9CisKK2lmIFsgIiQxIiA9ICItLWZpbGUiIF07IHRoZW4KKwlGTj0iJDIiCisJaWYgWyAiJEZOIiA9ICIiIF0gOyB0aGVuCisJCXVzYWdlCisJZmkKKwlzaGlmdAorCXNoaWZ0CitlbHNlCisJRk49LmNvbmZpZworZmkKKword2hpbGUgWyAiJDEiICE9ICIiIF0gOyBkbworCUNNRD0iJDEiCisJc2hpZnQKKwljYXNlICIkQ01EIiBpbgorCS0tZW5hYmxlfC1lKQorCQljaGVja2FyZyAiJDEiCisJCXJlcGxhY2UgInMvIyBDT05GSUdfJEFSRyBpcyBub3Qgc2V0L0NPTkZJR18kQVJHPXkvIgorCQlzaGlmdAorCQk7OworCisJLS1kaXNhYmxlfC1kKQorCQljaGVja2FyZyAiJDEiCisJCXJlcGxhY2UgInMvQ09ORklHXyRBUkc9W215XS8jIENPTkZJR18kQVJHIGlzIG5vdCBzZXQvIgorCQlzaGlmdAorCQk7OworCisJLS1tb2R1bGV8LW0pCisJCWNoZWNrYXJnICIkMSIKKwkJcmVwbGFjZSAicy9DT05GSUdfJEFSRz15L0NPTkZJR18kQVJHPW0vIiBcCisJCQktZSAicy8jIENPTkZJR18kQVJHIGlzIG5vdCBzZXQvQ09ORklHXyRBUkc9bS8iCisJCXNoaWZ0CisJCTs7CisKKwktLXN0YXRlfC1zKQorCQljaGVja2FyZyAiJDEiCisJCWlmIGdyZXAgLXEgIiMgQ09ORklHXyRBUkcgaXMgbm90IHNldCIgJEZOIDsgdGhlbgorCQkJZWNobyBuCisJCWVsc2UKKwkJCVY9IiQoZ3JlcCAiXkNPTkZJR18kQVJHPSIgJEZOKSIKKwkJCWlmIFsgJD8gIT0gMCBdIDsgdGhlbgorCQkJCWVjaG8gdW5kZWYKKwkJCWVsc2UKKwkJCQlWPSIke1YvQ09ORklHXyRBUkc9L30iCisJCQkJVj0iJHtWL1wiL30iCisJCQkJZWNobyAiJFYiCisJCQlmaQorCQlmaQorCQlzaGlmdAorCQk7OworCisJLS1lbmFibGUtYWZ0ZXJ8LUUpCisJCWNoZWNrYXJnICIkMSIKKwkJQT0kQVJHCisJCWNoZWNrYXJnICIkMiIKKwkJQj0kQVJHCisJCXJlcGxhY2UgIi9DT05GSUdfJEE9W215XS9hQ09ORklHXyRCPXkiIFwKKwkJCS1lICIvIyBDT05GSUdfJEFSRyBpcyBub3Qgc2V0L2EvQ09ORklHXyRBUkc9eSIgXAorCQkJLWUgInMvIyBDT05GSUdfJEFSRyBpcyBub3Qgc2V0L0NPTkZJR18kQVJHPXkvIgorCQlzaGlmdAorCQlzaGlmdAorCQk7OworCisJLS1kaXNhYmxlLWFmdGVyfC1EKQorCQljaGVja2FyZyAiJDEiCisJCUE9JEFSRworCQljaGVja2FyZyAiJDIiCisJCUI9JEFSRworCQlyZXBsYWNlICIvQ09ORklHXyRBPVtteV0vYSMgQ09ORklHXyRCIGlzIG5vdCBzZXQiIFwKKwkJLWUgIi8jIENPTkZJR18kQVJHIGlzIG5vdCBzZXQvYS8jIENPTkZJR18kQVJHIGlzIG5vdCBzZXQiIFwKKwkJLWUgInMvQ09ORklHXyRBUkc9W215XS8jIENPTkZJR18kQVJHIGlzIG5vdCBzZXQvIgorCQlzaGlmdAorCQlzaGlmdAorCQk7OworCisJLS1tb2R1bGUtYWZ0ZXJ8LU0pCisJCWNoZWNrYXJnICIkMSIKKwkJQT0kQVJHCisJCWNoZWNrYXJnICIkMiIKKwkJQj0kQVJHCisJCXJlcGxhY2UgIi9DT05GSUdfJEE9W215XS9hQ09ORklHXyRCPW0iIFwKKwkJCS1lICIvIyBDT05GSUdfJEFSRyBpcyBub3Qgc2V0L2EvQ09ORklHXyRBUkc9bSIgXAorCQkJLWUgInMvQ09ORklHXyRBUkc9eS9DT05GSUdfJEFSRz1tLyIgXAorCQkJLWUgInMvIyBDT05GSUdfJEFSRyBpcyBub3Qgc2V0L0NPTkZJR18kQVJHPW0vIgorCQlzaGlmdAorCQlzaGlmdAorCQk7OworCisJIyB1bmRvY3VtZW50ZWQgYmVjYXVzZSBpdCBpZ25vcmVzIC0tZmlsZSAoZml4bWUpCisJLS1yZWZyZXNoKQorCQl5ZXMgIiIgfCBtYWtlIG9sZGNvbmZpZworCQk7OworCisJKikKKwkJdXNhZ2UKKwkJOzsKKwllc2FjCitkb25lCisKZGlmZiAtLWdpdCBhL2Zpcm13YXJlL2loZXgyZncuYyBiL3NjcmlwdHMvaWhleDJmdy5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBmaXJtd2FyZS9paGV4MmZ3LmMKcmVuYW1lIHRvIHNjcmlwdHMvaWhleDJmdy5jCmRpZmYgLS1naXQgYS9zY3JpcHRzL21hcmt1cF9vb3BzLnBsIGIvc2NyaXB0cy9tYXJrdXBfb29wcy5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDBhN2E2Ci0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9tYXJrdXBfb29wcy5wbApAQCAtMCwwICsxLDE2MiBAQAorIyEvdXNyL2Jpbi9wZXJsIC13CisKKyMgQ29weXJpZ2h0IDIwMDgsIEludGVsIENvcnBvcmF0aW9uCisjCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMaW51eCBrZXJuZWwKKyMKKyMgVGhpcyBwcm9ncmFtIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorIyB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UuCisjCisjIEF1dGhvcnM6CisjIAlBcmphbiB2YW4gZGUgVmVuIDxhcmphbkBsaW51eC5pbnRlbC5jb20+CisKKworbXkgJHZtbGludXhfbmFtZSA9ICRBUkdWWzBdOworCisjCisjIFN0ZXAgMTogUGFyc2UgdGhlIG9vcHMgdG8gZmluZCB0aGUgRUlQIHZhbHVlCisjCisKK215ICR0YXJnZXQgPSAiMCI7Cit3aGlsZSAoPFNURElOPikgeworCWlmICgkXyA9fiAvRUlQOiAwMDYwOlxbXDwoW2EtejAtOV0rKVw+XF0vKSB7CisJCSR0YXJnZXQgPSAkMTsKKwl9Cit9CisKK2lmICgkdGFyZ2V0ID1+IC9eZjgvKSB7CisJcHJpbnQgIlRoaXMgc2NyaXB0IGRvZXMgbm90IHdvcmsgb24gbW9kdWxlcyAuLi4gXG4iOworCWV4aXQ7Cit9CisKK2lmICgkdGFyZ2V0IGVxICIwIikgeworCXByaW50ICJObyBvb3BzIGZvdW5kIVxuIjsKKwlwcmludCAiVXNhZ2U6IFxuIjsKKwlwcmludCAiICAgIGRtZXNnIHwgcGVybCBzY3JpcHRzL21hcmt1cF9vb3BzLnBsIHZtbGludXhcbiI7CisJZXhpdDsKK30KKworbXkgJGNvdW50ZXIgPSAwOworbXkgJHN0YXRlICAgPSAwOworbXkgJGNlbnRlciAgPSAwOworbXkgQGxpbmVzOworCitzdWIgSW5SYW5nZSB7CisJbXkgKCRhZGRyZXNzLCAkdGFyZ2V0KSA9IEBfOworCW15ICRhZCA9ICIweCIuJGFkZHJlc3M7CisJbXkgJHRhID0gIjB4Ii4kdGFyZ2V0OworCW15ICRkZWx0YSA9IGhleCgkYWQpIC0gaGV4KCR0YSk7CisKKwlpZiAoKCRkZWx0YSA+IC00MDk2KSAmJiAoJGRlbHRhIDwgNDA5NikpIHsKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCisKKworIyBmaXJzdCwgcGFyc2UgdGhlIGlucHV0IGludG8gdGhlIGxpbmVzIGFycmF5LCBidXQgdG8ga2VlcCBzaXplIGRvd24sCisjIHdlIG9ubHkgZG8gdGhpcyBmb3IgNEtiIGFyb3VuZCB0aGUgc3dlZXQgc3BvdAorCitteSAkZmlsZW5hbWU7CisKK29wZW4oRklMRSwgIm9iamR1bXAgLWRTICR2bWxpbnV4X25hbWUgfCIpIHx8IGRpZSAiQ2Fubm90IHN0YXJ0IG9iamR1bXAiOworCit3aGlsZSAoPEZJTEU+KSB7CisJbXkgJGxpbmUgPSAkXzsKKwljaG9tcCgkbGluZSk7CisJaWYgKCRzdGF0ZSA9PSAwKSB7CisJCWlmICgkbGluZSA9fiAvXihbYS1mMC05XSspXDovKSB7CisJCQlpZiAoSW5SYW5nZSgkMSwgJHRhcmdldCkpIHsKKwkJCQkkc3RhdGUgPSAxOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJaWYgKCRsaW5lID1+IC9eKFthLWYwLTldW2EtZjAtOV1bYS1mMC05XVthLWYwLTldW2EtZjAtOV1bYS1mMC05XSspXDovKSB7CisJCQlteSAkdmFsID0gJDE7CisJCQlpZiAoIUluUmFuZ2UoJHZhbCwgJHRhcmdldCkpIHsKKwkJCQlsYXN0OworCQkJfQorCQkJaWYgKCR2YWwgZXEgJHRhcmdldCkgeworCQkJCSRjZW50ZXIgPSAkY291bnRlcjsKKwkJCX0KKwkJfQorCQkkbGluZXNbJGNvdW50ZXJdID0gJGxpbmU7CisKKwkJJGNvdW50ZXIgPSAkY291bnRlciArIDE7CisJfQorfQorCitjbG9zZShGSUxFKTsKKworaWYgKCRjb3VudGVyID09IDApIHsKKwlwcmludCAiTm8gbWF0Y2hpbmcgY29kZSBmb3VuZCBcbiI7CisJZXhpdDsKK30KKworaWYgKCRjZW50ZXIgPT0gMCkgeworCXByaW50ICJObyBtYXRjaGluZyBjb2RlIGZvdW5kIFxuIjsKKwlleGl0OworfQorCitteSAkc3RhcnQ7CitteSAkZmluaXNoOworbXkgJGNvZGVsaW5lcyA9IDA7CitteSAkYmluYXJ5bGluZXMgPSAwOworIyBub3cgd2UgZ28gdXAgYW5kIGRvd24gaW4gdGhlIGFycmF5IHRvIGZpbmQgaG93IG11Y2ggd2Ugd2FudCB0byBwcmludAorCiskc3RhcnQgPSAkY2VudGVyOworCit3aGlsZSAoJHN0YXJ0ID4gMSkgeworCSRzdGFydCA9ICRzdGFydCAtIDE7CisJbXkgJGxpbmUgPSAkbGluZXNbJHN0YXJ0XTsKKwlpZiAoJGxpbmUgPX4gL14oW2EtZjAtOV0rKVw6LykgeworCQkkYmluYXJ5bGluZXMgPSAkYmluYXJ5bGluZXMgKyAxOworCX0gZWxzZSB7CisJCSRjb2RlbGluZXMgPSAkY29kZWxpbmVzICsgMTsKKwl9CisJaWYgKCRjb2RlbGluZXMgPiAxMCkgeworCQlsYXN0OworCX0KKwlpZiAoJGJpbmFyeWxpbmVzID4gMjApIHsKKwkJbGFzdDsKKwl9Cit9CisKKworJGZpbmlzaCA9ICRjZW50ZXI7CiskY29kZWxpbmVzID0gMDsKKyRiaW5hcnlsaW5lcyA9IDA7Cit3aGlsZSAoJGZpbmlzaCA8ICRjb3VudGVyKSB7CisJJGZpbmlzaCA9ICRmaW5pc2ggKyAxOworCW15ICRsaW5lID0gJGxpbmVzWyRmaW5pc2hdOworCWlmICgkbGluZSA9fiAvXihbYS1mMC05XSspXDovKSB7CisJCSRiaW5hcnlsaW5lcyA9ICRiaW5hcnlsaW5lcyArIDE7CisJfSBlbHNlIHsKKwkJJGNvZGVsaW5lcyA9ICRjb2RlbGluZXMgKyAxOworCX0KKwlpZiAoJGNvZGVsaW5lcyA+IDEwKSB7CisJCWxhc3Q7CisJfQorCWlmICgkYmluYXJ5bGluZXMgPiAyMCkgeworCQlsYXN0OworCX0KK30KKworCitteSAkaTsKKworbXkgJGZ1bGx0ZXh0ID0gIiI7CiskaSA9ICRzdGFydDsKK3doaWxlICgkaSA8ICRmaW5pc2gpIHsKKwlpZiAoJGkgPT0gJGNlbnRlcikgeworCQkkZnVsbHRleHQgPSAkZnVsbHRleHQgLiAiKiRsaW5lc1skaV0gICAgIDwtLS0tLSBmYXVsdGluZyBpbnN0cnVjdGlvblxuIjsKKwl9IGVsc2UgeworCQkkZnVsbHRleHQgPSAkZnVsbHRleHQgLiAgIiAkbGluZXNbJGldXG4iOworCX0KKwkkaSA9ICRpICsxOworfQorCitwcmludCAkZnVsbHRleHQ7CisKZGlmZiAtLWdpdCBhL3NjcmlwdHMvdGFncy5zaCBiL3NjcmlwdHMvdGFncy5zaAppbmRleCA5ZTM0NTFkLi5mZGJlNzhiIDEwMDc1NQotLS0gYS9zY3JpcHRzL3RhZ3Muc2gKKysrIGIvc2NyaXB0cy90YWdzLnNoCkBAIC0yNCw2ICsyNCwxMSBAQAogCXRyZWU9JHtzcmN0cmVlfS8KIGZpCiAKKyMgRGV0ZWN0IGlmIEFMTFNPVVJDRV9BUkNIUyBpcyBzZXQuIElmIG5vdCwgd2UgYXNzdW1lIFNSQ0FSQ0gKK2lmIFsgIiR7QUxMU09VUkNFX0FSQ0hTfSIgPSAiIiBdOyB0aGVuCisJQUxMU09VUkNFX0FSQ0hTPSR7U1JDQVJDSH0KK2ZpCisKICMgZmluZCBzb3VyY2VzIGluIGFyY2gvJEFSQ0gKIGZpbmRfYXJjaF9zb3VyY2VzKCkKIHsKQEAgLTU0LDI2ICs1OSwyOSBAQAogZmluZF9zb3VyY2VzKCkKIHsKIAlmaW5kX2FyY2hfc291cmNlcyAkMSAiJDIiCi0JZmluZF9pbmNsdWRlX3NvdXJjZXMgIiQyIgotCWZpbmRfb3RoZXJfc291cmNlcyAiJDIiCiB9CiAKIGFsbF9zb3VyY2VzKCkKIHsKLQlmaW5kX3NvdXJjZXMgJFNSQ0FSQ0ggJyouW2NoU10nCisJZm9yIGFyY2ggaW4gJEFMTFNPVVJDRV9BUkNIUworCWRvCisJCWZpbmRfc291cmNlcyAkYXJjaCAnKi5bY2hTXScKKwlkb25lCiAJaWYgWyAhIC16ICIkYXJjaGluY2x1ZGUiIF07IHRoZW4KIAkJZmluZF9hcmNoX2luY2x1ZGVfc291cmNlcyAkYXJjaGluY2x1ZGUgJyouW2NoU10nCiAJZmkKKwlmaW5kX2luY2x1ZGVfc291cmNlcyAnKi5bY2hTXScKKwlmaW5kX290aGVyX3NvdXJjZXMgJyouW2NoU10nCiB9CiAKIGFsbF9rY29uZmlncygpCiB7Ci0JZmluZF9zb3VyY2VzICRTUkNBUkNIICdLY29uZmlnKicKKwlmaW5kX3NvdXJjZXMgJEFMTFNPVVJDRV9BUkNIUyAnS2NvbmZpZyonCiB9CiAKIGFsbF9kZWZjb25maWdzKCkKIHsKLQlmaW5kX3NvdXJjZXMgJFNSQ0FSQ0ggImRlZmNvbmZpZyIKKwlmaW5kX3NvdXJjZXMgJEFMTFNPVVJDRV9BUkNIUyAiZGVmY29uZmlnIgogfQogCiBkb2NzY29wZSgpCmRpZmYgLS1naXQgYS9zZWN1cml0eS9jb21tb25jYXAuYyBiL3NlY3VyaXR5L2NvbW1vbmNhcC5jCmluZGV4IDc5NzEzNTQuLjdjZDYxYTUgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L2NvbW1vbmNhcC5jCisrKyBiL3NlY3VyaXR5L2NvbW1vbmNhcC5jCkBAIC00NSwyNiArNDUsMjIgQEAKIC8qKgogICogY2FwX2NhcGFibGUgLSBEZXRlcm1pbmUgd2hldGhlciBhIHRhc2sgaGFzIGEgcGFydGljdWxhciBlZmZlY3RpdmUgY2FwYWJpbGl0eQogICogQHRzazogVGhlIHRhc2sgdG8gcXVlcnkKKyAqIEBjcmVkOiBUaGUgY3JlZGVudGlhbHMgdG8gdXNlCiAgKiBAY2FwOiBUaGUgY2FwYWJpbGl0eSB0byBjaGVjayBmb3IKICAqIEBhdWRpdDogV2hldGhlciB0byB3cml0ZSBhbiBhdWRpdCBtZXNzYWdlIG9yIG5vdAogICoKICAqIERldGVybWluZSB3aGV0aGVyIHRoZSBub21pbmF0ZWQgdGFzayBoYXMgdGhlIHNwZWNpZmllZCBjYXBhYmlsaXR5IGFtb25nc3QKICAqIGl0cyBlZmZlY3RpdmUgc2V0LCByZXR1cm5pbmcgMCBpZiBpdCBkb2VzLCAtdmUgaWYgaXQgZG9lcyBub3QuCiAgKgotICogTk9URSBXRUxMOiBjYXBfY2FwYWJsZSgpIGNhbm5vdCBiZSB1c2VkIGxpa2UgdGhlIGtlcm5lbCdzIGNhcGFibGUoKQotICogZnVuY3Rpb24uICBUaGF0IGlzLCBpdCBoYXMgdGhlIHJldmVyc2Ugc2VtYW50aWNzOiBjYXBfY2FwYWJsZSgpIHJldHVybnMgMAotICogd2hlbiBhIHRhc2sgaGFzIGEgY2FwYWJpbGl0eSwgYnV0IHRoZSBrZXJuZWwncyBjYXBhYmxlKCkgcmV0dXJucyAxIGZvciB0aGlzCi0gKiBjYXNlLgorICogTk9URSBXRUxMOiBjYXBfaGFzX2NhcGFiaWxpdHkoKSBjYW5ub3QgYmUgdXNlZCBsaWtlIHRoZSBrZXJuZWwncyBjYXBhYmxlKCkKKyAqIGFuZCBoYXNfY2FwYWJpbGl0eSgpIGZ1bmN0aW9ucy4gIFRoYXQgaXMsIGl0IGhhcyB0aGUgcmV2ZXJzZSBzZW1hbnRpY3M6CisgKiBjYXBfaGFzX2NhcGFiaWxpdHkoKSByZXR1cm5zIDAgd2hlbiBhIHRhc2sgaGFzIGEgY2FwYWJpbGl0eSwgYnV0IHRoZQorICoga2VybmVsJ3MgY2FwYWJsZSgpIGFuZCBoYXNfY2FwYWJpbGl0eSgpIHJldHVybnMgMSBmb3IgdGhpcyBjYXNlLgogICovCi1pbnQgY2FwX2NhcGFibGUoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIGludCBjYXAsIGludCBhdWRpdCkKK2ludCBjYXBfY2FwYWJsZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgY29uc3Qgc3RydWN0IGNyZWQgKmNyZWQsIGludCBjYXAsCisJCWludCBhdWRpdCkKIHsKLQlfX3UzMiBjYXBfcmFpc2VkOwotCi0JLyogRGVyaXZlZCBmcm9tIGluY2x1ZGUvbGludXgvc2NoZWQuaDpjYXBhYmxlLiAqLwotCXJjdV9yZWFkX2xvY2soKTsKLQljYXBfcmFpc2VkID0gY2FwX3JhaXNlZChfX3Rhc2tfY3JlZCh0c2spLT5jYXBfZWZmZWN0aXZlLCBjYXApOwotCXJjdV9yZWFkX3VubG9jaygpOwotCXJldHVybiBjYXBfcmFpc2VkID8gMCA6IC1FUEVSTTsKKwlyZXR1cm4gY2FwX3JhaXNlZChjcmVkLT5jYXBfZWZmZWN0aXZlLCBjYXApID8gMCA6IC1FUEVSTTsKIH0KIAogLyoqCkBAIC0xNjAsNyArMTU2LDggQEAKIAkvKiB0aGV5IGFyZSBzbyBsaW1pdGVkIHVubGVzcyB0aGUgY3VycmVudCB0YXNrIGhhcyB0aGUgQ0FQX1NFVFBDQVAKIAkgKiBjYXBhYmlsaXR5CiAJICovCi0JaWYgKGNhcF9jYXBhYmxlKGN1cnJlbnQsIENBUF9TRVRQQ0FQLCBTRUNVUklUWV9DQVBfQVVESVQpID09IDApCisJaWYgKGNhcF9jYXBhYmxlKGN1cnJlbnQsIGN1cnJlbnRfY3JlZCgpLCBDQVBfU0VUUENBUCwKKwkJCVNFQ1VSSVRZX0NBUF9BVURJVCkgPT0gMCkKIAkJcmV0dXJuIDA7CiAjZW5kaWYKIAlyZXR1cm4gMTsKQEAgLTIzOCw3ICsyMzUsNyBAQAogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CiAJaW50IGVycm9yOwogCi0JaWYgKCFpbm9kZS0+aV9vcCB8fCAhaW5vZGUtPmlfb3AtPmdldHhhdHRyKQorCWlmICghaW5vZGUtPmlfb3AtPmdldHhhdHRyKQogCSAgICAgICByZXR1cm4gMDsKIAogCWVycm9yID0gaW5vZGUtPmlfb3AtPmdldHhhdHRyKGRlbnRyeSwgWEFUVFJfTkFNRV9DQVBTLCBOVUxMLCAwKTsKQEAgLTI1OSw3ICsyNTYsNyBAQAogewogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CiAKLQlpZiAoIWlub2RlLT5pX29wIHx8ICFpbm9kZS0+aV9vcC0+cmVtb3ZleGF0dHIpCisJaWYgKCFpbm9kZS0+aV9vcC0+cmVtb3ZleGF0dHIpCiAJICAgICAgIHJldHVybiAwOwogCiAJcmV0dXJuIGlub2RlLT5pX29wLT5yZW1vdmV4YXR0cihkZW50cnksIFhBVFRSX05BTUVfQ0FQUyk7CkBAIC0zMTcsNyArMzE0LDcgQEAKIAogCW1lbXNldChjcHVfY2FwcywgMCwgc2l6ZW9mKHN0cnVjdCBjcHVfdmZzX2NhcF9kYXRhKSk7CiAKLQlpZiAoIWlub2RlIHx8ICFpbm9kZS0+aV9vcCB8fCAhaW5vZGUtPmlfb3AtPmdldHhhdHRyKQorCWlmICghaW5vZGUgfHwgIWlub2RlLT5pX29wLT5nZXR4YXR0cikKIAkJcmV0dXJuIC1FTk9EQVRBOwogCiAJc2l6ZSA9IGlub2RlLT5pX29wLT5nZXR4YXR0cigoc3RydWN0IGRlbnRyeSAqKWRlbnRyeSwgWEFUVFJfTkFNRV9DQVBTLCAmY2FwcywKQEAgLTg2OSw3ICs4NjYsOCBAQAogCQkgICAgICYgKG5ldy0+c2VjdXJlYml0cyBeIGFyZzIpKQkJCS8qWzFdKi8KIAkJICAgIHx8ICgobmV3LT5zZWN1cmViaXRzICYgU0VDVVJFX0FMTF9MT0NLUyAmIH5hcmcyKSkJLypbMl0qLwogCQkgICAgfHwgKGFyZzIgJiB+KFNFQ1VSRV9BTExfTE9DS1MgfCBTRUNVUkVfQUxMX0JJVFMpKQkvKlszXSovCi0JCSAgICB8fCAoY2FwX2NhcGFibGUoY3VycmVudCwgQ0FQX1NFVFBDQVAsIFNFQ1VSSVRZX0NBUF9BVURJVCkgIT0gMCkgLypbNF0qLworCQkgICAgfHwgKGNhcF9jYXBhYmxlKGN1cnJlbnQsIGN1cnJlbnRfY3JlZCgpLCBDQVBfU0VUUENBUCwKKwkJCQkgICAgU0VDVVJJVFlfQ0FQX0FVRElUKSAhPSAwKQkJLypbNF0qLwogCQkJLyoKIAkJCSAqIFsxXSBubyBjaGFuZ2luZyBvZiBiaXRzIHRoYXQgYXJlIGxvY2tlZAogCQkJICogWzJdIG5vIHVubG9ja2luZyBvZiBsb2NrcwpAQCAtOTUwLDcgKzk0OCw4IEBACiB7CiAJaW50IGNhcF9zeXNfYWRtaW4gPSAwOwogCi0JaWYgKGNhcF9jYXBhYmxlKGN1cnJlbnQsIENBUF9TWVNfQURNSU4sIFNFQ1VSSVRZX0NBUF9OT0FVRElUKSA9PSAwKQorCWlmIChjYXBfY2FwYWJsZShjdXJyZW50LCBjdXJyZW50X2NyZWQoKSwgQ0FQX1NZU19BRE1JTiwKKwkJCVNFQ1VSSVRZX0NBUF9OT0FVRElUKSA9PSAwKQogCQljYXBfc3lzX2FkbWluID0gMTsKIAlyZXR1cm4gX192bV9lbm91Z2hfbWVtb3J5KG1tLCBwYWdlcywgY2FwX3N5c19hZG1pbik7CiB9CmRpZmYgLS1naXQgYS9zZWN1cml0eS9kZXZpY2VfY2dyb3VwLmMgYi9zZWN1cml0eS9kZXZpY2VfY2dyb3VwLmMKaW5kZXggNWJhNzg3MC4uM2FhY2QwZiAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvZGV2aWNlX2Nncm91cC5jCisrKyBiL3NlY3VyaXR5L2RldmljZV9jZ3JvdXAuYwpAQCAtNTEzLDExICs1MTMsMTQgQEAKIAlzdHJ1Y3QgZGV2X2Nncm91cCAqZGV2X2Nncm91cDsKIAlzdHJ1Y3QgZGV2X3doaXRlbGlzdF9pdGVtICp3aDsKIAorCWlmICghU19JU0JMSyhtb2RlKSAmJiAhU19JU0NIUihtb2RlKSkKKwkJcmV0dXJuIDA7CisKIAlyY3VfcmVhZF9sb2NrKCk7CiAKIAlkZXZfY2dyb3VwID0gdGFza19kZXZjZ3JvdXAoY3VycmVudCk7CiAKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHdoLCAmZGV2X2Nncm91cC0+d2hpdGVsaXN0LCBsaXN0KSB7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3Uod2gsICZkZXZfY2dyb3VwLT53aGl0ZWxpc3QsIGxpc3QpIHsKIAkJaWYgKHdoLT50eXBlICYgREVWX0FMTCkKIAkJCWdvdG8gYWNjX2NoZWNrOwogCQlpZiAoKHdoLT50eXBlICYgREVWX0JMT0NLKSAmJiAhU19JU0JMSyhtb2RlKSkKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L2lub2RlLmMgYi9zZWN1cml0eS9pbm9kZS5jCmluZGV4IGVmZWE1YTYuLjAwN2VmMjUgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L2lub2RlLmMKKysrIGIvc2VjdXJpdHkvaW5vZGUuYwpAQCAtNjEsOSArNjEsNiBAQAogCiAJaWYgKGlub2RlKSB7CiAJCWlub2RlLT5pX21vZGUgPSBtb2RlOwotCQlpbm9kZS0+aV91aWQgPSAwOwotCQlpbm9kZS0+aV9naWQgPSAwOwotCQlpbm9kZS0+aV9ibG9ja3MgPSAwOwogCQlpbm9kZS0+aV9hdGltZSA9IGlub2RlLT5pX210aW1lID0gaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUU7CiAJCXN3aXRjaCAobW9kZSAmIFNfSUZNVCkgewogCQlkZWZhdWx0OgpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkva2V5cy9rZXljdGwuYyBiL3NlY3VyaXR5L2tleXMva2V5Y3RsLmMKaW5kZXggNjY4ODc2NS4uMDk3OTY3OSAxMDA2NDQKLS0tIGEvc2VjdXJpdHkva2V5cy9rZXljdGwuYworKysgYi9zZWN1cml0eS9rZXlzL2tleWN0bC5jCkBAIC0xMjk0LDcgKzEyOTQsNyBAQAogCiAJY2FzZSBLRVlDVExfR0VUX1NFQ1VSSVRZOgogCQlyZXR1cm4ga2V5Y3RsX2dldF9zZWN1cml0eSgoa2V5X3NlcmlhbF90KSBhcmcyLAotCQkJCQkgICAoY2hhciAqKSBhcmczLAorCQkJCQkgICAoY2hhciBfX3VzZXIgKikgYXJnMywKIAkJCQkJICAgKHNpemVfdCkgYXJnNCk7CiAKIAlkZWZhdWx0OgpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc2VjdXJpdHkuYyBiL3NlY3VyaXR5L3NlY3VyaXR5LmMKaW5kZXggNjc4ZDRkMC4uYzM1ODZjMCAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc2VjdXJpdHkuYworKysgYi9zZWN1cml0eS9zZWN1cml0eS5jCkBAIC0xNTQsMTQgKzE1NCwzMiBAQAogCQkJCSAgICBlZmZlY3RpdmUsIGluaGVyaXRhYmxlLCBwZXJtaXR0ZWQpOwogfQogCi1pbnQgc2VjdXJpdHlfY2FwYWJsZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgaW50IGNhcCkKK2ludCBzZWN1cml0eV9jYXBhYmxlKGludCBjYXApCiB7Ci0JcmV0dXJuIHNlY3VyaXR5X29wcy0+Y2FwYWJsZSh0c2ssIGNhcCwgU0VDVVJJVFlfQ0FQX0FVRElUKTsKKwlyZXR1cm4gc2VjdXJpdHlfb3BzLT5jYXBhYmxlKGN1cnJlbnQsIGN1cnJlbnRfY3JlZCgpLCBjYXAsCisJCQkJICAgICBTRUNVUklUWV9DQVBfQVVESVQpOwogfQogCi1pbnQgc2VjdXJpdHlfY2FwYWJsZV9ub2F1ZGl0KHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCBpbnQgY2FwKQoraW50IHNlY3VyaXR5X3JlYWxfY2FwYWJsZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgaW50IGNhcCkKIHsKLQlyZXR1cm4gc2VjdXJpdHlfb3BzLT5jYXBhYmxlKHRzaywgY2FwLCBTRUNVUklUWV9DQVBfTk9BVURJVCk7CisJY29uc3Qgc3RydWN0IGNyZWQgKmNyZWQ7CisJaW50IHJldDsKKworCWNyZWQgPSBnZXRfdGFza19jcmVkKHRzayk7CisJcmV0ID0gc2VjdXJpdHlfb3BzLT5jYXBhYmxlKHRzaywgY3JlZCwgY2FwLCBTRUNVUklUWV9DQVBfQVVESVQpOworCXB1dF9jcmVkKGNyZWQpOworCXJldHVybiByZXQ7Cit9CisKK2ludCBzZWN1cml0eV9yZWFsX2NhcGFibGVfbm9hdWRpdChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgaW50IGNhcCkKK3sKKwljb25zdCBzdHJ1Y3QgY3JlZCAqY3JlZDsKKwlpbnQgcmV0OworCisJY3JlZCA9IGdldF90YXNrX2NyZWQodHNrKTsKKwlyZXQgPSBzZWN1cml0eV9vcHMtPmNhcGFibGUodHNrLCBjcmVkLCBjYXAsIFNFQ1VSSVRZX0NBUF9OT0FVRElUKTsKKwlwdXRfY3JlZChjcmVkKTsKKwlyZXR1cm4gcmV0OwogfQogCiBpbnQgc2VjdXJpdHlfYWNjdChzdHJ1Y3QgZmlsZSAqZmlsZSkKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NlbGludXgvS2NvbmZpZyBiL3NlY3VyaXR5L3NlbGludXgvS2NvbmZpZwppbmRleCAyNjMwMWRkLi5iY2ExYjc0IDEwMDY0NAotLS0gYS9zZWN1cml0eS9zZWxpbnV4L0tjb25maWcKKysrIGIvc2VjdXJpdHkvc2VsaW51eC9LY29uZmlnCkBAIC05NCwzMyArOTQsNiBAQAogCiAJICBJZiB5b3UgYXJlIHVuc3VyZSBob3cgdG8gYW5zd2VyIHRoaXMgcXVlc3Rpb24sIGFuc3dlciAxLgogCi1jb25maWcgU0VDVVJJVFlfU0VMSU5VWF9FTkFCTEVfU0VDTUFSS19ERUZBVUxUCi0JYm9vbCAiTlNBIFNFTGludXggZW5hYmxlIG5ldyBzZWNtYXJrIG5ldHdvcmsgY29udHJvbHMgYnkgZGVmYXVsdCIKLQlkZXBlbmRzIG9uIFNFQ1VSSVRZX1NFTElOVVgKLQlkZWZhdWx0IG4KLQloZWxwCi0JICBUaGlzIG9wdGlvbiBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIG5ldyBzZWNtYXJrLWJhc2VkIG5ldHdvcmsKLQkgIGNvbnRyb2xzIHdpbGwgYmUgZW5hYmxlZCBieSBkZWZhdWx0LiAgSWYgbm90LCB0aGUgb2xkIGludGVybmFsCi0JICBwZXItcGFja2V0IGNvbnRyb2xzIHdpbGwgYmUgZW5hYmxlZCBieSBkZWZhdWx0LCBwcmVzZXJ2aW5nCi0JICBvbGQgYmVoYXZpb3IuCi0KLQkgIElmIHlvdSBlbmFibGUgdGhlIG5ldyBjb250cm9scywgeW91IHdpbGwgbmVlZCB1cGRhdGVkCi0JICBTRUxpbnV4IHVzZXJzcGFjZSBsaWJyYXJpZXMsIHRvb2xzIGFuZCBwb2xpY3kuICBUeXBpY2FsbHksCi0JICB5b3VyIGRpc3RyaWJ1dGlvbiB3aWxsIHByb3ZpZGUgdGhlc2UgYW5kIGVuYWJsZSB0aGUgbmV3IGNvbnRyb2xzCi0JICBpbiB0aGUga2VybmVsIHRoZXkgYWxzbyBkaXN0cmlidXRlLgotCi0JICBOb3RlIHRoYXQgdGhpcyBvcHRpb24gY2FuIGJlIG92ZXJyaWRkZW4gYXQgYm9vdCB3aXRoIHRoZQotCSAgc2VsaW51eF9jb21wYXRfbmV0IHBhcmFtZXRlciwgYW5kIGFmdGVyIGJvb3QgdmlhCi0JICAvc2VsaW51eC9jb21wYXRfbmV0LiAgU2VlIERvY3VtZW50YXRpb24va2VybmVsLXBhcmFtZXRlcnMudHh0Ci0JICBmb3IgZGV0YWlscyBvbiB0aGlzIHBhcmFtZXRlci4KLQotCSAgSWYgeW91IGVuYWJsZSB0aGUgbmV3IG5ldHdvcmsgY29udHJvbHMsIHlvdSB3aWxsIGxpa2VseQotCSAgYWxzbyByZXF1aXJlIHRoZSBTRUNNQVJLIGFuZCBDT05OU0VDTUFSSyB0YXJnZXRzLCBhcwotCSAgd2VsbCBhcyBhbnkgY29ubnRyYWNrIGhlbHBlcnMgZm9yIHByb3RvY29scyB3aGljaCB5b3UKLQkgIHdpc2ggdG8gY29udHJvbC4KLQotCSAgSWYgeW91IGFyZSB1bnN1cmUgd2hhdCB0byBkbyBoZXJlLCBzZWxlY3QgTi4KLQogY29uZmlnIFNFQ1VSSVRZX1NFTElOVVhfUE9MSUNZREJfVkVSU0lPTl9NQVgKIAlib29sICJOU0EgU0VMaW51eCBtYXhpbXVtIHN1cHBvcnRlZCBwb2xpY3kgZm9ybWF0IHZlcnNpb24iCiAJZGVwZW5kcyBvbiBTRUNVUklUWV9TRUxJTlVYCmRpZmYgLS1naXQgYS9zZWN1cml0eS9zZWxpbnV4L2F2Yy5jIGIvc2VjdXJpdHkvc2VsaW51eC9hdmMuYwppbmRleCBkNDNiZDZiLi5lYjQxZjQzIDEwMDY0NAotLS0gYS9zZWN1cml0eS9zZWxpbnV4L2F2Yy5jCisrKyBiL3NlY3VyaXR5L3NlbGludXgvYXZjLmMKQEAgLTUzLDE4ICs1MywyMCBAQAogI3VuZGVmIFNfCiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYXZfaW5oZXJpdCBhdl9pbmhlcml0W10gPSB7Ci0jZGVmaW5lIFNfKGMsIGksIGIpIHsgYywgY29tbW9uXyMjaSMjX3Blcm1fdG9fc3RyaW5nLCBiIH0sCisjZGVmaW5lIFNfKGMsIGksIGIpIHsJLnRjbGFzcyA9IGMsXAorCQkJLmNvbW1vbl9wdHMgPSBjb21tb25fIyNpIyNfcGVybV90b19zdHJpbmcsXAorCQkJLmNvbW1vbl9iYXNlID0gIGIgfSwKICNpbmNsdWRlICJhdl9pbmhlcml0LmgiCiAjdW5kZWYgU18KIH07CiAKIGNvbnN0IHN0cnVjdCBzZWxpbnV4X2NsYXNzX3Blcm0gc2VsaW51eF9jbGFzc19wZXJtID0gewotCWF2X3Blcm1fdG9fc3RyaW5nLAotCUFSUkFZX1NJWkUoYXZfcGVybV90b19zdHJpbmcpLAotCWNsYXNzX3RvX3N0cmluZywKLQlBUlJBWV9TSVpFKGNsYXNzX3RvX3N0cmluZyksCi0JYXZfaW5oZXJpdCwKLQlBUlJBWV9TSVpFKGF2X2luaGVyaXQpCisJLmF2X3Blcm1fdG9fc3RyaW5nID0gYXZfcGVybV90b19zdHJpbmcsCisJLmF2X3B0c19sZW4gPSBBUlJBWV9TSVpFKGF2X3Blcm1fdG9fc3RyaW5nKSwKKwkuY2xhc3NfdG9fc3RyaW5nID0gY2xhc3NfdG9fc3RyaW5nLAorCS5jdHNfbGVuID0gQVJSQVlfU0laRShjbGFzc190b19zdHJpbmcpLAorCS5hdl9pbmhlcml0ID0gYXZfaW5oZXJpdCwKKwkuYXZfaW5oZXJpdF9sZW4gPSBBUlJBWV9TSVpFKGF2X2luaGVyaXQpCiB9OwogCiAjZGVmaW5lIEFWQ19DQUNIRV9TTE9UUwkJCTUxMgpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc2VsaW51eC9ob29rcy5jIGIvc2VjdXJpdHkvc2VsaW51eC9ob29rcy5jCmluZGV4IGRiZWFhNzguLjAwODE1OTcgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NlbGludXgvaG9va3MuYworKysgYi9zZWN1cml0eS9zZWxpbnV4L2hvb2tzLmMKQEAgLTE0MzMsMTIgKzE0MzMsMTMgQEAKIAogLyogQ2hlY2sgd2hldGhlciBhIHRhc2sgaXMgYWxsb3dlZCB0byB1c2UgYSBjYXBhYmlsaXR5LiAqLwogc3RhdGljIGludCB0YXNrX2hhc19jYXBhYmlsaXR5KHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLAorCQkJICAgICAgIGNvbnN0IHN0cnVjdCBjcmVkICpjcmVkLAogCQkJICAgICAgIGludCBjYXAsIGludCBhdWRpdCkKIHsKIAlzdHJ1Y3QgYXZjX2F1ZGl0X2RhdGEgYWQ7CiAJc3RydWN0IGF2X2RlY2lzaW9uIGF2ZDsKIAl1MTYgc2NsYXNzOwotCXUzMiBzaWQgPSB0YXNrX3NpZCh0c2spOworCXUzMiBzaWQgPSBjcmVkX3NpZChjcmVkKTsKIAl1MzIgYXYgPSBDQVBfVE9fTUFTSyhjYXApOwogCWludCByYzsKIApAQCAtMTg2NSwxNSArMTg2NiwxNiBAQAogCXJldHVybiBjcmVkX2hhc19wZXJtKG9sZCwgbmV3LCBQUk9DRVNTX19TRVRDQVApOwogfQogCi1zdGF0aWMgaW50IHNlbGludXhfY2FwYWJsZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgaW50IGNhcCwgaW50IGF1ZGl0KQorc3RhdGljIGludCBzZWxpbnV4X2NhcGFibGUoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIGNvbnN0IHN0cnVjdCBjcmVkICpjcmVkLAorCQkJICAgaW50IGNhcCwgaW50IGF1ZGl0KQogewogCWludCByYzsKIAotCXJjID0gc2Vjb25kYXJ5X29wcy0+Y2FwYWJsZSh0c2ssIGNhcCwgYXVkaXQpOworCXJjID0gc2Vjb25kYXJ5X29wcy0+Y2FwYWJsZSh0c2ssIGNyZWQsIGNhcCwgYXVkaXQpOwogCWlmIChyYykKIAkJcmV0dXJuIHJjOwogCi0JcmV0dXJuIHRhc2tfaGFzX2NhcGFiaWxpdHkodHNrLCBjYXAsIGF1ZGl0KTsKKwlyZXR1cm4gdGFza19oYXNfY2FwYWJpbGl0eSh0c2ssIGNyZWQsIGNhcCwgYXVkaXQpOwogfQogCiBzdGF0aWMgaW50IHNlbGludXhfc3lzY3RsX2dldF9zaWQoY3RsX3RhYmxlICp0YWJsZSwgdTE2IHRjbGFzcywgdTMyICpzaWQpCkBAIC0yMDM3LDcgKzIwMzksOCBAQAogewogCWludCByYywgY2FwX3N5c19hZG1pbiA9IDA7CiAKLQlyYyA9IHNlbGludXhfY2FwYWJsZShjdXJyZW50LCBDQVBfU1lTX0FETUlOLCBTRUNVUklUWV9DQVBfTk9BVURJVCk7CisJcmMgPSBzZWxpbnV4X2NhcGFibGUoY3VycmVudCwgY3VycmVudF9jcmVkKCksIENBUF9TWVNfQURNSU4sCisJCQkgICAgIFNFQ1VSSVRZX0NBUF9OT0FVRElUKTsKIAlpZiAocmMgPT0gMCkKIAkJY2FwX3N5c19hZG1pbiA9IDE7CiAKQEAgLTI4ODAsNyArMjg4Myw4IEBACiAJICogYW5kIGxhY2sgb2YgcGVybWlzc2lvbiBqdXN0IG1lYW5zIHRoYXQgd2UgZmFsbCBiYWNrIHRvIHRoZQogCSAqIGluLWNvcmUgY29udGV4dCB2YWx1ZSwgbm90IGEgZGVuaWFsLgogCSAqLwotCWVycm9yID0gc2VsaW51eF9jYXBhYmxlKGN1cnJlbnQsIENBUF9NQUNfQURNSU4sIFNFQ1VSSVRZX0NBUF9OT0FVRElUKTsKKwllcnJvciA9IHNlbGludXhfY2FwYWJsZShjdXJyZW50LCBjdXJyZW50X2NyZWQoKSwgQ0FQX01BQ19BRE1JTiwKKwkJCQlTRUNVUklUWV9DQVBfTk9BVURJVCk7CiAJaWYgKCFlcnJvcikKIAkJZXJyb3IgPSBzZWN1cml0eV9zaWRfdG9fY29udGV4dF9mb3JjZShpc2VjLT5zaWQsICZjb250ZXh0LAogCQkJCQkJICAgICAgJnNpemUpOwpAQCAtNDE4NSw3ICs0MTg5LDcgQEAKIHN0YXRpYyBpbnQgc2VsaW51eF9zb2NrX3Jjdl9za2JfY29tcGF0KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCQkgICAgICAgdTE2IGZhbWlseSkKIHsKLQlpbnQgZXJyOworCWludCBlcnIgPSAwOwogCXN0cnVjdCBza19zZWN1cml0eV9zdHJ1Y3QgKnNrc2VjID0gc2stPnNrX3NlY3VyaXR5OwogCXUzMiBwZWVyX3NpZDsKIAl1MzIgc2tfc2lkID0gc2tzZWMtPnNpZDsKQEAgLTQyMDIsNyArNDIwNiw3IEBACiAJaWYgKHNlbGludXhfY29tcGF0X25ldCkKIAkJZXJyID0gc2VsaW51eF9zb2NrX3Jjdl9za2JfaXB0YWJsZXNfY29tcGF0KHNrLCBza2IsICZhZCwKIAkJCQkJCQkgICBmYW1pbHksIGFkZHJwKTsKLQllbHNlCisJZWxzZSBpZiAoc2VsaW51eF9zZWNtYXJrX2VuYWJsZWQoKSkKIAkJZXJyID0gYXZjX2hhc19wZXJtKHNrX3NpZCwgc2tiLT5zZWNtYXJrLCBTRUNDTEFTU19QQUNLRVQsCiAJCQkJICAgUEFDS0VUX19SRUNWLCAmYWQpOwogCWlmIChlcnIpCkBAIC00NzA1LDcgKzQ3MDksNyBAQAogCQlpZiAoc2VsaW51eF9pcF9wb3N0cm91dGVfaXB0YWJsZXNfY29tcGF0KHNrYi0+c2ssIGlmaW5kZXgsCiAJCQkJCQkJICZhZCwgZmFtaWx5LCBhZGRycCkpCiAJCQlyZXR1cm4gTkZfRFJPUDsKLQl9IGVsc2UgeworCX0gZWxzZSBpZiAoc2VsaW51eF9zZWNtYXJrX2VuYWJsZWQoKSkgewogCQlpZiAoYXZjX2hhc19wZXJtKHNrc2VjLT5zaWQsIHNrYi0+c2VjbWFyaywKIAkJCQkgU0VDQ0xBU1NfUEFDS0VULCBQQUNLRVRfX1NFTkQsICZhZCkpCiAJCQlyZXR1cm4gTkZfRFJPUDsKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NlbGludXgvaW5jbHVkZS9hdmNfc3MuaCBiL3NlY3VyaXR5L3NlbGludXgvaW5jbHVkZS9hdmNfc3MuaAppbmRleCBjMGQzMTRkLi5iYjFlYzgwIDEwMDY0NAotLS0gYS9zZWN1cml0eS9zZWxpbnV4L2luY2x1ZGUvYXZjX3NzLmgKKysrIGIvc2VjdXJpdHkvc2VsaW51eC9pbmNsdWRlL2F2Y19zcy5oCkBAIC0xNywxNiArMTcsMTYgQEAKIH07CiAKIHN0cnVjdCBhdl9pbmhlcml0IHsKLQl1MTYgdGNsYXNzOwogCWNvbnN0IGNoYXIgKipjb21tb25fcHRzOwogCXUzMiBjb21tb25fYmFzZTsKKwl1MTYgdGNsYXNzOwogfTsKIAogc3RydWN0IHNlbGludXhfY2xhc3NfcGVybSB7CiAJY29uc3Qgc3RydWN0IGF2X3Blcm1fdG9fc3RyaW5nICphdl9wZXJtX3RvX3N0cmluZzsKIAl1MzIgYXZfcHRzX2xlbjsKLQljb25zdCBjaGFyICoqY2xhc3NfdG9fc3RyaW5nOwogCXUzMiBjdHNfbGVuOworCWNvbnN0IGNoYXIgKipjbGFzc190b19zdHJpbmc7CiAJY29uc3Qgc3RydWN0IGF2X2luaGVyaXQgKmF2X2luaGVyaXQ7CiAJdTMyIGF2X2luaGVyaXRfbGVuOwogfTsKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NlbGludXgvc2VsaW51eGZzLmMgYi9zZWN1cml0eS9zZWxpbnV4L3NlbGludXhmcy5jCmluZGV4IGU1NTIwOTkuLjAxZWM2ZDIgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NlbGludXgvc2VsaW51eGZzLmMKKysrIGIvc2VjdXJpdHkvc2VsaW51eC9zZWxpbnV4ZnMuYwpAQCAtNDcsMTMgKzQ3LDcgQEAKIAogdW5zaWduZWQgaW50IHNlbGludXhfY2hlY2tyZXFwcm90ID0gQ09ORklHX1NFQ1VSSVRZX1NFTElOVVhfQ0hFQ0tSRVFQUk9UX1ZBTFVFOwogCi0jaWZkZWYgQ09ORklHX1NFQ1VSSVRZX1NFTElOVVhfRU5BQkxFX1NFQ01BUktfREVGQVVMVAotI2RlZmluZSBTRUxJTlVYX0NPTVBBVF9ORVRfVkFMVUUgMAotI2Vsc2UKLSNkZWZpbmUgU0VMSU5VWF9DT01QQVRfTkVUX1ZBTFVFIDEKLSNlbmRpZgotCi1pbnQgc2VsaW51eF9jb21wYXRfbmV0ID0gU0VMSU5VWF9DT01QQVRfTkVUX1ZBTFVFOworaW50IHNlbGludXhfY29tcGF0X25ldCA9IDA7CiAKIHN0YXRpYyBpbnQgX19pbml0IGNoZWNrcmVxcHJvdF9zZXR1cChjaGFyICpzdHIpCiB7CkBAIC00OTQsNyArNDg4LDEzIEBACiAJaWYgKHNzY2FuZihwYWdlLCAiJWQiLCAmbmV3X3ZhbHVlKSAhPSAxKQogCQlnb3RvIG91dDsKIAotCXNlbGludXhfY29tcGF0X25ldCA9IG5ld192YWx1ZSA/IDEgOiAwOworCWlmIChuZXdfdmFsdWUpIHsKKwkJcHJpbnRrKEtFUk5fTk9USUNFCisJCSAgICAgICAiU0VMaW51eDogY29tcGF0X25ldCBpcyBkZXByZWNhdGVkLCBwbGVhc2UgdXNlIHNlY21hcmsiCisJCSAgICAgICAiIGluc3RlYWRcbiIpOworCQlzZWxpbnV4X2NvbXBhdF9uZXQgPSAxOworCX0gZWxzZQorCQlzZWxpbnV4X2NvbXBhdF9uZXQgPSAwOwogCWxlbmd0aCA9IGNvdW50Owogb3V0OgogCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZykgcGFnZSk7CkBAIC04NDcsOCArODQ3LDYgQEAKIAogCWlmIChyZXQpIHsKIAkJcmV0LT5pX21vZGUgPSBtb2RlOwotCQlyZXQtPmlfdWlkID0gcmV0LT5pX2dpZCA9IDA7Ci0JCXJldC0+aV9ibG9ja3MgPSAwOwogCQlyZXQtPmlfYXRpbWUgPSByZXQtPmlfbXRpbWUgPSByZXQtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUU7CiAJfQogCXJldHVybiByZXQ7CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zZWxpbnV4L3NzL2NvbnRleHQuaCBiL3NlY3VyaXR5L3NlbGludXgvc3MvY29udGV4dC5oCmluZGV4IDY1OGMyYmQuLmQ5ZGQ3YTIgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NlbGludXgvc3MvY29udGV4dC5oCisrKyBiL3NlY3VyaXR5L3NlbGludXgvc3MvY29udGV4dC5oCkBAIC0yNyw5ICsyNyw5IEBACiAJdTMyIHVzZXI7CiAJdTMyIHJvbGU7CiAJdTMyIHR5cGU7CisJdTMyIGxlbjsgICAgICAgIC8qIGxlbmd0aCBvZiBzdHJpbmcgaW4gYnl0ZXMgKi8KIAlzdHJ1Y3QgbWxzX3JhbmdlIHJhbmdlOwogCWNoYXIgKnN0cjsJLyogc3RyaW5nIHJlcHJlc2VudGF0aW9uIGlmIGNvbnRleHQgY2Fubm90IGJlIG1hcHBlZC4gKi8KLQl1MzIgbGVuOyAgICAgICAgLyogbGVuZ3RoIG9mIHN0cmluZyBpbiBieXRlcyAqLwogfTsKIAogc3RhdGljIGlubGluZSB2b2lkIG1sc19jb250ZXh0X2luaXQoc3RydWN0IGNvbnRleHQgKmMpCmRpZmYgLS1naXQgYS9zZWN1cml0eS9zbWFjay9zbWFjay5oIGIvc2VjdXJpdHkvc21hY2svc21hY2suaAppbmRleCAzMWRjZTU1Li5iNzk1ODJlIDEwMDY0NAotLS0gYS9zZWN1cml0eS9zbWFjay9zbWFjay5oCisrKyBiL3NlY3VyaXR5L3NtYWNrL3NtYWNrLmgKQEAgLTE2LDYgKzE2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9zZWN1cml0eS5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CiAjaW5jbHVkZSA8bmV0L25ldGxhYmVsLmg+CiAKIC8qCkBAIC0zOSw2ICs0MCw3IEBACiBzdHJ1Y3Qgc29ja2V0X3NtYWNrIHsKIAljaGFyCQkqc21rX291dDsJCQkvKiBvdXRib3VuZCBsYWJlbCAqLwogCWNoYXIJCSpzbWtfaW47CQkJLyogaW5ib3VuZCBsYWJlbCAqLworCWludAkJc21rX2xhYmVsZWQ7CQkJLyogbGFiZWwgc2NoZW1lICovCiAJY2hhcgkJc21rX3BhY2tldFtTTUtfTEFCRUxMRU5dOwkvKiBUQ1AgcGVlciBsYWJlbCAqLwogfTsKIApAQCAtODAsNiArODIsMTYgQEAKIH07CiAKIC8qCisgKiBBbiBlbnRyeSBpbiB0aGUgdGFibGUgaWRlbnRpZnlpbmcgaG9zdHMuCisgKi8KK3N0cnVjdCBzbWtfbmV0bGJsYWRkciB7CisJc3RydWN0IHNta19uZXRsYmxhZGRyCSpzbWtfbmV4dDsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4Jc21rX2hvc3Q7CS8qIG5ldHdvcmsgYWRkcmVzcyAqLworCXN0cnVjdCBpbl9hZGRyCQlzbWtfbWFzazsJLyogbmV0d29yayBtYXNrICovCisJY2hhcgkJCSpzbWtfbGFiZWw7CS8qIGxhYmVsICovCit9OworCisvKgogICogVGhpcyBpcyB0aGUgcmVwb3NpdG9yeSBmb3IgbGFiZWxzIHNlZW4gc28gdGhhdCBpdCBpcwogICogbm90IG5lY2Vzc2FyeSB0byBrZWVwIGFsbG9jYXRpbmcgdGlueSBjaHVuY2tzIG9mIG1lbW9yeQogICogYW5kIHNvIHRoYXQgdGhleSBjYW4gYmUgc2hhcmVkLgpAQCAtMTI3LDYgKzEzOSwyMCBAQAogI2RlZmluZSBYQVRUUl9OQU1FX1NNQUNLSVBPVVQJWEFUVFJfU0VDVVJJVFlfUFJFRklYIFhBVFRSX1NNQUNLX0lQT1VUCiAKIC8qCisgKiBIb3cgY29tbXVuaWNhdGlvbnMgb24gdGhpcyBzb2NrZXQgYXJlIHRyZWF0ZWQuCisgKiBVc3VhbGx5IGl0J3MgZGV0ZXJtaW5lZCBieSB0aGUgdW5kZXJseWluZyBuZXRsYWJlbCBjb2RlCisgKiBidXQgdGhlcmUgYXJlIGNlcnRhaW4gY2FzZXMsIGluY2x1ZGluZyBzaW5nbGUgbGFiZWwgaG9zdHMKKyAqIGFuZCBwb3RlbnRpYWxseSBzaW5nbGUgbGFiZWwgaW50ZXJmYWNlcyBmb3Igd2hpY2ggdGhlCisgKiB0cmVhdG1lbnQgY2FuIG5vdCBiZSBrbm93biBpbiBhZHZhbmNlLgorICoKKyAqIFRoZSBwb3NzaWJpbGl0eSBvZiBhZGRpdGlvbmFsIGxhYmVsaW5nIHNjaGVtZXMgYmVpbmcKKyAqIGludHJvZHVjZWQgaW4gdGhlIGZ1dHVyZSBleGlzdHMgYXMgd2VsbC4KKyAqLworI2RlZmluZSBTTUFDS19VTkxBQkVMRURfU09DS0VUCTAKKyNkZWZpbmUgU01BQ0tfQ0lQU09fU09DS0VUCTEKKworLyoKKyAqIHNtYWNrZnMgbWFnaWMgbnVtYmVyCiAgKiBzbWFja2ZzIG1hY2ljIG51bWJlcgogICovCiAjZGVmaW5lIFNNQUNLX01BR0lDCTB4NDM0MTVkNTMgLyogIlNNQUMiICovCkBAIC0xNDEsNiArMTY3LDcgQEAKICAqIENJUFNPIGRlZmF1bHRzLgogICovCiAjZGVmaW5lIFNNQUNLX0NJUFNPX0RPSV9ERUZBVUxUCQkzCS8qIEhpc3RvcmljYWwgKi8KKyNkZWZpbmUgU01BQ0tfQ0lQU09fRE9JX0lOVkFMSUQJCS0xCS8qIE5vdCBhIERPSSAqLwogI2RlZmluZSBTTUFDS19DSVBTT19ESVJFQ1RfREVGQVVMVAkyNTAJLyogQXJiaXRyYXJ5ICovCiAjZGVmaW5lIFNNQUNLX0NJUFNPX01BWENBVFZBTAkJNjMJLyogQmlnZ2VyIGdldHMgaGFyZGVyICovCiAjZGVmaW5lIFNNQUNLX0NJUFNPX01BWExFVkVMICAgICAgICAgICAgMjU1ICAgICAvKiBDSVBTTyAyLjIgc3RhbmRhcmQgKi8KQEAgLTE3Niw3ICsyMDMsNiBAQAogICogU2hhcmVkIGRhdGEuCiAgKi8KIGV4dGVybiBpbnQgc21hY2tfY2lwc29fZGlyZWN0OwotZXh0ZXJuIGludCBzbWFja19uZXRfbmx0eXBlOwogZXh0ZXJuIGNoYXIgKnNtYWNrX25ldF9hbWJpZW50OwogZXh0ZXJuIGNoYXIgKnNtYWNrX29ubHljYXA7CiAKQEAgLTE4Niw5ICsyMTIsMTAgQEAKIGV4dGVybiBzdHJ1Y3Qgc21hY2tfa25vd24gc21hY2tfa25vd25faHVoOwogZXh0ZXJuIHN0cnVjdCBzbWFja19rbm93biBzbWFja19rbm93bl9pbnZhbGlkOwogZXh0ZXJuIHN0cnVjdCBzbWFja19rbm93biBzbWFja19rbm93bl9zdGFyOwotZXh0ZXJuIHN0cnVjdCBzbWFja19rbm93biBzbWFja19rbm93bl91bnNldDsKK2V4dGVybiBzdHJ1Y3Qgc21hY2tfa25vd24gc21hY2tfa25vd25fd2ViOwogCiBleHRlcm4gc3RydWN0IHNta19saXN0X2VudHJ5ICpzbWFja19saXN0OworZXh0ZXJuIHN0cnVjdCBzbWtfbmV0bGJsYWRkciAqc21hY2tfbmV0bGJsYWRkcnM7CiBleHRlcm4gc3RydWN0IHNlY3VyaXR5X29wZXJhdGlvbnMgc21hY2tfb3BzOwogCiAvKgpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc21hY2svc21hY2tfYWNjZXNzLmMgYi9zZWN1cml0eS9zbWFjay9zbWFja19hY2Nlc3MuYwppbmRleCAyNDdjZWMzLi4yZTBiODNlIDEwMDY0NAotLS0gYS9zZWN1cml0eS9zbWFjay9zbWFja19hY2Nlc3MuYworKysgYi9zZWN1cml0eS9zbWFjay9zbWFja19hY2Nlc3MuYwpAQCAtMTUsMTUgKzE1LDggQEAKICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgInNtYWNrLmgiCiAKLXN0cnVjdCBzbWFja19rbm93biBzbWFja19rbm93bl91bnNldCA9IHsKLQkuc21rX25leHQJPSBOVUxMLAotCS5zbWtfa25vd24JPSAiVU5TRVQiLAotCS5zbWtfc2VjaWQJPSAxLAotCS5zbWtfY2lwc28JPSBOVUxMLAotfTsKLQogc3RydWN0IHNtYWNrX2tub3duIHNtYWNrX2tub3duX2h1aCA9IHsKLQkuc21rX25leHQJPSAmc21hY2tfa25vd25fdW5zZXQsCisJLnNta19uZXh0CT0gTlVMTCwKIAkuc21rX2tub3duCT0gIj8iLAogCS5zbWtfc2VjaWQJPSAyLAogCS5zbWtfY2lwc28JPSBOVUxMLApAQCAtNTcsNyArNTAsMTQgQEAKIAkuc21rX2NpcHNvCT0gTlVMTCwKIH07CiAKLXN0cnVjdCBzbWFja19rbm93biAqc21hY2tfa25vd24gPSAmc21hY2tfa25vd25faW52YWxpZDsKK3N0cnVjdCBzbWFja19rbm93biBzbWFja19rbm93bl93ZWIgPSB7CisJLnNta19uZXh0CT0gJnNtYWNrX2tub3duX2ludmFsaWQsCisJLnNta19rbm93bgk9ICJAIiwKKwkuc21rX3NlY2lkCT0gNywKKwkuc21rX2NpcHNvCT0gTlVMTCwKK307CisKK3N0cnVjdCBzbWFja19rbm93biAqc21hY2tfa25vd24gPSAmc21hY2tfa25vd25fd2ViOwogCiAvKgogICogVGhlIGluaXRpYWwgdmFsdWUgbmVlZHMgdG8gYmUgYmlnZ2VyIHRoYW4gYW55IG9mIHRoZQpAQCAtOTksNiArOTksMTYgQEAKIAkgICAgc3RyY21wKHN1YmplY3RfbGFiZWwsIHNtYWNrX2tub3duX3N0YXIuc21rX2tub3duKSA9PSAwKQogCQlyZXR1cm4gLUVBQ0NFUzsKIAkvKgorCSAqIEFuIGludGVybmV0IG9iamVjdCBjYW4gYmUgYWNjZXNzZWQgYnkgYW55IHN1YmplY3QuCisJICogVGFza3MgY2Fubm90IGJlIGFzc2lnbmVkIHRoZSBpbnRlcm5ldCBsYWJlbC4KKwkgKiBBbiBpbnRlcm5ldCBzdWJqZWN0IGNhbiBhY2Nlc3MgYW55IG9iamVjdC4KKwkgKi8KKwlpZiAob2JqZWN0X2xhYmVsID09IHNtYWNrX2tub3duX3dlYi5zbWtfa25vd24gfHwKKwkgICAgc3ViamVjdF9sYWJlbCA9PSBzbWFja19rbm93bl93ZWIuc21rX2tub3duIHx8CisJICAgIHN0cmNtcChvYmplY3RfbGFiZWwsIHNtYWNrX2tub3duX3dlYi5zbWtfa25vd24pID09IDAgfHwKKwkgICAgc3RyY21wKHN1YmplY3RfbGFiZWwsIHNtYWNrX2tub3duX3dlYi5zbWtfa25vd24pID09IDApCisJCXJldHVybiAwOworCS8qCiAJICogQSBzdGFyIG9iamVjdCBjYW4gYmUgYWNjZXNzZWQgYnkgYW55IHN1YmplY3QuCiAJICovCiAJaWYgKG9iamVjdF9sYWJlbCA9PSBzbWFja19rbm93bl9zdGFyLnNta19rbm93biB8fApkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc21hY2svc21hY2tfbHNtLmMgYi9zZWN1cml0eS9zbWFjay9zbWFja19sc20uYwppbmRleCA4NDgyMTJmLi4wMjc4YmMwIDEwMDY0NAotLS0gYS9zZWN1cml0eS9zbWFjay9zbWFja19sc20uYworKysgYi9zZWN1cml0eS9zbWFjay9zbWFja19sc20uYwpAQCAtMTI3Nyw2ICsxMjc3LDcgQEAKIAogCXNzcC0+c21rX2luID0gY3NwOwogCXNzcC0+c21rX291dCA9IGNzcDsKKwlzc3AtPnNta19sYWJlbGVkID0gU01BQ0tfQ0lQU09fU09DS0VUOwogCXNzcC0+c21rX3BhY2tldFswXSA9ICdcMCc7CiAKIAlzay0+c2tfc2VjdXJpdHkgPSBzc3A7CkBAIC0xMzQxLDQ1ICsxMzQyLDY5IEBACiAJc3RydWN0IHNtYWNrX2NpcHNvIGNpcHNvOwogCWludCByYzsKIAotCXN3aXRjaCAoc21hY2tfbmV0X25sdHlwZSkgewotCWNhc2UgTkVUTEJMX05MVFlQRV9DSVBTT1Y0OgotCQlubHNwLT5kb21haW4gPSBzbWFjazsKLQkJbmxzcC0+ZmxhZ3MgPSBORVRMQkxfU0VDQVRUUl9ET01BSU4gfCBORVRMQkxfU0VDQVRUUl9NTFNfTFZMOworCW5sc3AtPmRvbWFpbiA9IHNtYWNrOworCW5sc3AtPmZsYWdzID0gTkVUTEJMX1NFQ0FUVFJfRE9NQUlOIHwgTkVUTEJMX1NFQ0FUVFJfTUxTX0xWTDsKIAotCQlyYyA9IHNtYWNrX3RvX2NpcHNvKHNtYWNrLCAmY2lwc28pOwotCQlpZiAocmMgPT0gMCkgewotCQkJbmxzcC0+YXR0ci5tbHMubHZsID0gY2lwc28uc21rX2xldmVsOwotCQkJc21hY2tfc2V0X2NhdHNldChjaXBzby5zbWtfY2F0c2V0LCBubHNwKTsKLQkJfSBlbHNlIHsKLQkJCW5sc3AtPmF0dHIubWxzLmx2bCA9IHNtYWNrX2NpcHNvX2RpcmVjdDsKLQkJCXNtYWNrX3NldF9jYXRzZXQoc21hY2ssIG5sc3ApOwotCQl9Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWJyZWFrOworCXJjID0gc21hY2tfdG9fY2lwc28oc21hY2ssICZjaXBzbyk7CisJaWYgKHJjID09IDApIHsKKwkJbmxzcC0+YXR0ci5tbHMubHZsID0gY2lwc28uc21rX2xldmVsOworCQlzbWFja19zZXRfY2F0c2V0KGNpcHNvLnNta19jYXRzZXQsIG5sc3ApOworCX0gZWxzZSB7CisJCW5sc3AtPmF0dHIubWxzLmx2bCA9IHNtYWNrX2NpcHNvX2RpcmVjdDsKKwkJc21hY2tfc2V0X2NhdHNldChzbWFjaywgbmxzcCk7CiAJfQogfQogCiAvKioKICAqIHNtYWNrX25ldGxhYmVsIC0gU2V0IHRoZSBzZWNhdHRyIG9uIGEgc29ja2V0CiAgKiBAc2s6IHRoZSBzb2NrZXQKKyAqIEBsYWJlbGVkOiBzb2NrZXQgbGFiZWwgc2NoZW1lCiAgKgogICogQ29udmVydCB0aGUgb3V0Ym91bmQgc21hY2sgdmFsdWUgKHNta19vdXQpIHRvIGEKICAqIHNlY2F0dHIgYW5kIGF0dGFjaCBpdCB0byB0aGUgc29ja2V0LgogICoKICAqIFJldHVybnMgMCBvbiBzdWNjZXNzIG9yIGFuIGVycm9yIGNvZGUKICAqLwotc3RhdGljIGludCBzbWFja19uZXRsYWJlbChzdHJ1Y3Qgc29jayAqc2spCitzdGF0aWMgaW50IHNtYWNrX25ldGxhYmVsKHN0cnVjdCBzb2NrICpzaywgaW50IGxhYmVsZWQpCiB7CiAJc3RydWN0IHNvY2tldF9zbWFjayAqc3NwOwogCXN0cnVjdCBuZXRsYmxfbHNtX3NlY2F0dHIgc2VjYXR0cjsKLQlpbnQgcmM7CisJaW50IHJjID0gMDsKIAogCXNzcCA9IHNrLT5za19zZWN1cml0eTsKLQluZXRsYmxfc2VjYXR0cl9pbml0KCZzZWNhdHRyKTsKLQlzbWFja190b19zZWNhdHRyKHNzcC0+c21rX291dCwgJnNlY2F0dHIpOwotCXJjID0gbmV0bGJsX3NvY2tfc2V0YXR0cihzaywgJnNlY2F0dHIpOwotCW5ldGxibF9zZWNhdHRyX2Rlc3Ryb3koJnNlY2F0dHIpOworCS8qCisJICogVXN1YWxseSB0aGUgbmV0bGFiZWwgY29kZSB3aWxsIGhhbmRsZSBjaGFuZ2luZyB0aGUKKwkgKiBwYWNrZXQgbGFiZWxpbmcgYmFzZWQgb24gdGhlIGxhYmVsLgorCSAqIFRoZSBjYXNlIG9mIGEgc2luZ2xlIGxhYmVsIGhvc3QgaXMgZGlmZmVyZW50LCBiZWNhdXNlCisJICogYSBzaW5nbGUgbGFiZWwgaG9zdCBzaG91bGQgbmV2ZXIgZ2V0IGEgbGFiZWxlZCBwYWNrZXQKKwkgKiBldmVuIHRob3VnaCB0aGUgbGFiZWwgaXMgdXN1YWxseSBhc3NvY2lhdGVkIHdpdGggYSBwYWNrZXQKKwkgKiBsYWJlbC4KKwkgKi8KKwlsb2NhbF9iaF9kaXNhYmxlKCk7CisJYmhfbG9ja19zb2NrX25lc3RlZChzayk7CisKKwlpZiAoc3NwLT5zbWtfb3V0ID09IHNtYWNrX25ldF9hbWJpZW50IHx8CisJICAgIGxhYmVsZWQgPT0gU01BQ0tfVU5MQUJFTEVEX1NPQ0tFVCkKKwkJbmV0bGJsX3NvY2tfZGVsYXR0cihzayk7CisJZWxzZSB7CisJCW5ldGxibF9zZWNhdHRyX2luaXQoJnNlY2F0dHIpOworCQlzbWFja190b19zZWNhdHRyKHNzcC0+c21rX291dCwgJnNlY2F0dHIpOworCQlyYyA9IG5ldGxibF9zb2NrX3NldGF0dHIoc2ssICZzZWNhdHRyKTsKKwkJbmV0bGJsX3NlY2F0dHJfZGVzdHJveSgmc2VjYXR0cik7CisJfQorCisJYmhfdW5sb2NrX3NvY2soc2spOworCWxvY2FsX2JoX2VuYWJsZSgpOworCS8qCisJICogUmVtZW1iZXIgdGhlIGxhYmVsIHNjaGVtZSB1c2VkIHNvIHRoYXQgaXQgaXMgbm90CisJICogbmVjZXNzYXJ5IHRvIGRvIHRoZSBuZXRsYWJlbCBzZXR0aW5nIGlmIGl0IGhhcyBub3QKKwkgKiBjaGFuZ2VkIHRoZSBuZXh0IHRpbWUgdGhyb3VnaC4KKwkgKgorCSAqIFRoZSAtRURFU1RBRERSUkVRIGNhc2UgaXMgYW4gaW5kaWNhdGlvbiB0aGF0IHRoZXJlJ3MKKwkgKiBhIHNpbmdsZSBsZXZlbCBob3N0IGludm9sdmVkLgorCSAqLworCWlmIChyYyA9PSAwKQorCQlzc3AtPnNta19sYWJlbGVkID0gbGFiZWxlZDsKIAogCXJldHVybiByYzsKIH0KQEAgLTE0MzIsNyArMTQ1Nyw3IEBACiAJCXNzcC0+c21rX2luID0gc3A7CiAJZWxzZSBpZiAoc3RyY21wKG5hbWUsIFhBVFRSX1NNQUNLX0lQT1VUKSA9PSAwKSB7CiAJCXNzcC0+c21rX291dCA9IHNwOwotCQlyYyA9IHNtYWNrX25ldGxhYmVsKHNvY2stPnNrKTsKKwkJcmMgPSBzbWFja19uZXRsYWJlbChzb2NrLT5zaywgU01BQ0tfQ0lQU09fU09DS0VUKTsKIAkJaWYgKHJjICE9IDApCiAJCQlwcmludGsoS0VSTl9XQVJOSU5HICJTbWFjazogXCIlc1wiIG5ldGxibCBlcnJvciAlZC5cbiIsCiAJCQkgICAgICAgX19mdW5jX18sIC1yYyk7CkBAIC0xNDYyLDcgKzE0ODcsMTA4IEBACiAJLyoKIAkgKiBTZXQgdGhlIG91dGJvdW5kIG5ldGxibC4KIAkgKi8KLQlyZXR1cm4gc21hY2tfbmV0bGFiZWwoc29jay0+c2spOworCXJldHVybiBzbWFja19uZXRsYWJlbChzb2NrLT5zaywgU01BQ0tfQ0lQU09fU09DS0VUKTsKK30KKworCisvKioKKyAqIHNtYWNrX2hvc3RfbGFiZWwgLSBjaGVjayBob3N0IGJhc2VkIHJlc3RyaWN0aW9ucworICogQHNpcDogdGhlIG9iamVjdCBlbmQKKyAqCisgKiBsb29rcyBmb3IgaG9zdCBiYXNlZCBhY2Nlc3MgcmVzdHJpY3Rpb25zCisgKgorICogVGhpcyB2ZXJzaW9uIHdpbGwgb25seSBiZSBhcHByb3ByaWF0ZSBmb3IgcmVhbGx5IHNtYWxsCisgKiBzZXRzIG9mIHNpbmdsZSBsYWJlbCBob3N0cy4gQmVjYXVzZSBvZiB0aGUgbWFza2luZworICogaXQgY2Fubm90IHNob3J0Y3V0IG91dCBvbiB0aGUgZmlyc3QgbWF0Y2guIFRoZXJlIGFyZQorICogbnVtZXJpb3VzIHdheXMgdG8gYWRkcmVzcyB0aGUgcHJvYmxlbSwgYnV0IG5vbmUgb2YgdGhlbQorICogaGF2ZSBiZWVuIGFwcGxpZWQgaGVyZS4KKyAqCisgKiBSZXR1cm5zIHRoZSBsYWJlbCBvZiB0aGUgZmFyIGVuZCBvciBOVUxMIGlmIGl0J3Mgbm90IHNwZWNpYWwuCisgKi8KK3N0YXRpYyBjaGFyICpzbWFja19ob3N0X2xhYmVsKHN0cnVjdCBzb2NrYWRkcl9pbiAqc2lwKQoreworCXN0cnVjdCBzbWtfbmV0bGJsYWRkciAqc25wOworCWNoYXIgKmJlc3RsYWJlbCA9IE5VTEw7CisJc3RydWN0IGluX2FkZHIgKnNpYXAgPSAmc2lwLT5zaW5fYWRkcjsKKwlzdHJ1Y3QgaW5fYWRkciAqbGlhcDsKKwlzdHJ1Y3QgaW5fYWRkciAqbWlhcDsKKwlzdHJ1Y3QgaW5fYWRkciBiZXN0bWFzazsKKworCWlmIChzaWFwLT5zX2FkZHIgPT0gMCkKKwkJcmV0dXJuIE5VTEw7CisKKwliZXN0bWFzay5zX2FkZHIgPSAwOworCisJZm9yIChzbnAgPSBzbWFja19uZXRsYmxhZGRyczsgc25wICE9IE5VTEw7IHNucCA9IHNucC0+c21rX25leHQpIHsKKwkJbGlhcCA9ICZzbnAtPnNta19ob3N0LnNpbl9hZGRyOworCQltaWFwID0gJnNucC0+c21rX21hc2s7CisJCS8qCisJCSAqIElmIHRoZSBhZGRyZXNzZXMgbWF0Y2ggYWZ0ZXIgYXBwbHlpbmcgdGhlIGxpc3QgZW50cnkgbWFzaworCQkgKiB0aGUgZW50cnkgbWF0Y2hlcyB0aGUgYWRkcmVzcy4gSWYgaXQgZG9lc24ndCBtb3ZlIGFsb25nIHRvCisJCSAqIHRoZSBuZXh0IGVudHJ5LgorCQkgKi8KKwkJaWYgKChsaWFwLT5zX2FkZHIgJiBtaWFwLT5zX2FkZHIpICE9CisJCSAgICAoc2lhcC0+c19hZGRyICYgbWlhcC0+c19hZGRyKSkKKwkJCWNvbnRpbnVlOworCQkvKgorCQkgKiBJZiB0aGUgbGlzdCBlbnRyeSBtYXNrIGlkZW50aWZpZXMgYSBzaW5nbGUgYWRkcmVzcworCQkgKiBpdCBjYW4ndCBnZXQgYW55IG1vcmUgc3BlY2lmaWMuCisJCSAqLworCQlpZiAobWlhcC0+c19hZGRyID09IDB4ZmZmZmZmZmYpCisJCQlyZXR1cm4gc25wLT5zbWtfbGFiZWw7CisJCS8qCisJCSAqIElmIHRoZSBsaXN0IGVudHJ5IG1hc2sgaXMgbGVzcyBzcGVjaWZpYyB0aGFuIHRoZSBiZXN0CisJCSAqIGFscmVhZHkgZm91bmQgdGhpcyBlbnRyeSBpcyB1bmludGVyZXN0aW5nLgorCQkgKi8KKwkJaWYgKChtaWFwLT5zX2FkZHIgfCBiZXN0bWFzay5zX2FkZHIpID09IGJlc3RtYXNrLnNfYWRkcikKKwkJCWNvbnRpbnVlOworCQkvKgorCQkgKiBUaGlzIGlzIGJldHRlciB0aGFuIGFueSBlbnRyeSBmb3VuZCBzbyBmYXIuCisJCSAqLworCQliZXN0bWFzay5zX2FkZHIgPSBtaWFwLT5zX2FkZHI7CisJCWJlc3RsYWJlbCA9IHNucC0+c21rX2xhYmVsOworCX0KKworCXJldHVybiBiZXN0bGFiZWw7Cit9CisKKy8qKgorICogc21hY2tfc29ja2V0X2Nvbm5lY3QgLSBjb25uZWN0IGFjY2VzcyBjaGVjaworICogQHNvY2s6IHRoZSBzb2NrZXQKKyAqIEBzYXA6IHRoZSBvdGhlciBlbmQKKyAqIEBhZGRybGVuOiBzaXplIG9mIHNhcAorICoKKyAqIFZlcmlmaWVzIHRoYXQgYSBjb25uZWN0aW9uIG1heSBiZSBwb3NzaWJsZQorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCBhbmQgZXJyb3IgY29kZSBvdGhlcndpc2UKKyAqLworc3RhdGljIGludCBzbWFja19zb2NrZXRfY29ubmVjdChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3Qgc29ja2FkZHIgKnNhcCwKKwkJCQlpbnQgYWRkcmxlbikKK3sKKwlzdHJ1Y3Qgc29ja2V0X3NtYWNrICpzc3AgPSBzb2NrLT5zay0+c2tfc2VjdXJpdHk7CisJY2hhciAqaG9zdHNwOworCWludCByYzsKKworCWlmIChzb2NrLT5zayA9PSBOVUxMIHx8IHNvY2stPnNrLT5za19mYW1pbHkgIT0gUEZfSU5FVCkKKwkJcmV0dXJuIDA7CisKKwlpZiAoYWRkcmxlbiA8IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWhvc3RzcCA9IHNtYWNrX2hvc3RfbGFiZWwoKHN0cnVjdCBzb2NrYWRkcl9pbiAqKXNhcCk7CisJaWYgKGhvc3RzcCA9PSBOVUxMKSB7CisJCWlmIChzc3AtPnNta19sYWJlbGVkICE9IFNNQUNLX0NJUFNPX1NPQ0tFVCkKKwkJCXJldHVybiBzbWFja19uZXRsYWJlbChzb2NrLT5zaywgU01BQ0tfQ0lQU09fU09DS0VUKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmMgPSBzbWtfYWNjZXNzKHNzcC0+c21rX291dCwgaG9zdHNwLCBNQVlfV1JJVEUpOworCWlmIChyYyAhPSAwKQorCQlyZXR1cm4gcmM7CisKKwlpZiAoc3NwLT5zbWtfbGFiZWxlZCAhPSBTTUFDS19VTkxBQkVMRURfU09DS0VUKQorCQlyZXR1cm4gc21hY2tfbmV0bGFiZWwoc29jay0+c2ssIFNNQUNLX1VOTEFCRUxFRF9TT0NLRVQpOworCXJldHVybiAwOwogfQogCiAvKioKQEAgLTIxMDEsOCArMjIyNywxNCBAQAogCWlmIChuZXdzbWFjayA9PSBOVUxMKQogCQlyZXR1cm4gLUVJTlZBTDsKIAorCS8qCisJICogTm8gcHJvY2VzcyBpcyBldmVyIGFsbG93ZWQgdGhlIHdlYiAoIkAiKSBsYWJlbC4KKwkgKi8KKwlpZiAobmV3c21hY2sgPT0gc21hY2tfa25vd25fd2ViLnNta19rbm93bikKKwkJcmV0dXJuIC1FUEVSTTsKKwogCW5ldyA9IHByZXBhcmVfY3JlZHMoKTsKLQlpZiAoIW5ldykKKwlpZiAobmV3ID09IE5VTEwpCiAJCXJldHVybiAtRU5PTUVNOwogCW5ldy0+c2VjdXJpdHkgPSBuZXdzbWFjazsKIAljb21taXRfY3JlZHMobmV3KTsKQEAgLTIxNDQsNiArMjI3Niw0OSBAQAogfQogCiAvKioKKyAqIHNtYWNrX3NvY2tldF9zZW5kbXNnIC0gU21hY2sgY2hlY2sgYmFzZWQgb24gZGVzdGluYXRpb24gaG9zdAorICogQHNvY2s6IHRoZSBzb2NrZXQKKyAqIEBtc2doZHI6IHRoZSBtZXNzYWdlCisgKiBAc2l6ZTogdGhlIHNpemUgb2YgdGhlIG1lc3NhZ2UKKyAqCisgKiBSZXR1cm4gMCBpZiB0aGUgY3VycmVudCBzdWJqZWN0IGNhbiB3cml0ZSB0byB0aGUgZGVzdGluYXRpb24KKyAqIGhvc3QuIFRoaXMgaXMgb25seSBhIHF1ZXN0aW9uIGlmIHRoZSBkZXN0aW5hdGlvbiBpcyBhIHNpbmdsZQorICogbGFiZWwgaG9zdC4KKyAqLworc3RhdGljIGludCBzbWFja19zb2NrZXRfc2VuZG1zZyhzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3QgbXNnaGRyICptc2csCisJCQkJaW50IHNpemUpCit7CisJc3RydWN0IHNvY2thZGRyX2luICpzaXAgPSAoc3RydWN0IHNvY2thZGRyX2luICopIG1zZy0+bXNnX25hbWU7CisJc3RydWN0IHNvY2tldF9zbWFjayAqc3NwID0gc29jay0+c2stPnNrX3NlY3VyaXR5OworCWNoYXIgKmhvc3RzcDsKKwlpbnQgcmM7CisKKwkvKgorCSAqIFBlcmZlY3RseSByZWFzb25hYmxlIGZvciB0aGlzIHRvIGJlIE5VTEwKKwkgKi8KKwlpZiAoc2lwID09IE5VTEwgfHwgc2lwLT5zaW5fZmFtaWx5ICE9IFBGX0lORVQpCisJCXJldHVybiAwOworCisJaG9zdHNwID0gc21hY2tfaG9zdF9sYWJlbChzaXApOworCWlmIChob3N0c3AgPT0gTlVMTCkgeworCQlpZiAoc3NwLT5zbWtfbGFiZWxlZCAhPSBTTUFDS19DSVBTT19TT0NLRVQpCisJCQlyZXR1cm4gc21hY2tfbmV0bGFiZWwoc29jay0+c2ssIFNNQUNLX0NJUFNPX1NPQ0tFVCk7CisJCXJldHVybiAwOworCX0KKworCXJjID0gc21rX2FjY2Vzcyhzc3AtPnNta19vdXQsIGhvc3RzcCwgTUFZX1dSSVRFKTsKKwlpZiAocmMgIT0gMCkKKwkJcmV0dXJuIHJjOworCisJaWYgKHNzcC0+c21rX2xhYmVsZWQgIT0gU01BQ0tfVU5MQUJFTEVEX1NPQ0tFVCkKKwkJcmV0dXJuIHNtYWNrX25ldGxhYmVsKHNvY2stPnNrLCBTTUFDS19VTkxBQkVMRURfU09DS0VUKTsKKworCXJldHVybiAwOworCit9CisKKworLyoqCiAgKiBzbWFja19mcm9tX3NlY2F0dHIgLSBDb252ZXJ0IGEgbmV0bGFiZWwgYXR0ci5tbHMubHZsL2F0dHIubWxzLmNhdAogICogCXBhaXIgdG8gc21hY2sKICAqIEBzYXA6IG5ldGxhYmVsIHNlY2F0dHIKQEAgLTIxNTQsNDQgKzIzMjksNjYgQEAKIHN0YXRpYyB2b2lkIHNtYWNrX2Zyb21fc2VjYXR0cihzdHJ1Y3QgbmV0bGJsX2xzbV9zZWNhdHRyICpzYXAsIGNoYXIgKnNpcCkKIHsKIAljaGFyIHNtYWNrW1NNS19MQUJFTExFTl07CisJY2hhciAqc3A7CiAJaW50IHBjYXQ7CiAKLQlpZiAoKHNhcC0+ZmxhZ3MgJiBORVRMQkxfU0VDQVRUUl9NTFNfTFZMKSA9PSAwKSB7CisJaWYgKChzYXAtPmZsYWdzICYgTkVUTEJMX1NFQ0FUVFJfTUxTX0xWTCkgIT0gMCkgewogCQkvKgorCQkgKiBMb29rcyBsaWtlIGEgQ0lQU08gcGFja2V0LgogCQkgKiBJZiB0aGVyZSBhcmUgZmxhZ3MgYnV0IG5vIGxldmVsIG5ldGxhYmVsIGlzbid0CiAJCSAqIGJlaGF2aW5nIHRoZSB3YXkgd2UgZXhwZWN0IGl0IHRvLgogCQkgKgorCQkgKiBHZXQgdGhlIGNhdGVnb3JpZXMsIGlmIGFueQogCQkgKiBXaXRob3V0IGd1aWRhbmNlIHJlZ2FyZGluZyB0aGUgc21hY2sgdmFsdWUKIAkJICogZm9yIHRoZSBwYWNrZXQgZmFsbCBiYWNrIG9uIHRoZSBuZXR3b3JrCiAJCSAqIGFtYmllbnQgdmFsdWUuCiAJCSAqLwotCQlzdHJuY3B5KHNpcCwgc21hY2tfbmV0X2FtYmllbnQsIFNNS19NQVhMRU4pOwotCQlyZXR1cm47Ci0JfQotCS8qCi0JICogR2V0IHRoZSBjYXRlZ29yaWVzLCBpZiBhbnkKLQkgKi8KLQltZW1zZXQoc21hY2ssICdcMCcsIFNNS19MQUJFTExFTik7Ci0JaWYgKChzYXAtPmZsYWdzICYgTkVUTEJMX1NFQ0FUVFJfTUxTX0NBVCkgIT0gMCkKLQkJZm9yIChwY2F0ID0gLTE7OykgewotCQkJcGNhdCA9IG5ldGxibF9zZWNhdHRyX2NhdG1hcF93YWxrKHNhcC0+YXR0ci5tbHMuY2F0LAotCQkJCQkJCSAgcGNhdCArIDEpOwotCQkJaWYgKHBjYXQgPCAwKQotCQkJCWJyZWFrOwotCQkJc21hY2tfY2F0c2V0X2JpdChwY2F0LCBzbWFjayk7CisJCW1lbXNldChzbWFjaywgJ1wwJywgU01LX0xBQkVMTEVOKTsKKwkJaWYgKChzYXAtPmZsYWdzICYgTkVUTEJMX1NFQ0FUVFJfTUxTX0NBVCkgIT0gMCkKKwkJCWZvciAocGNhdCA9IC0xOzspIHsKKwkJCQlwY2F0ID0gbmV0bGJsX3NlY2F0dHJfY2F0bWFwX3dhbGsoCisJCQkJCXNhcC0+YXR0ci5tbHMuY2F0LCBwY2F0ICsgMSk7CisJCQkJaWYgKHBjYXQgPCAwKQorCQkJCQlicmVhazsKKwkJCQlzbWFja19jYXRzZXRfYml0KHBjYXQsIHNtYWNrKTsKKwkJCX0KKwkJLyoKKwkJICogSWYgaXQgaXMgQ0lQU08gdXNpbmcgc21hY2sgZGlyZWN0IG1hcHBpbmcKKwkJICogd2UgYXJlIGFscmVhZHkgZG9uZS4gV2VlSGVlLgorCQkgKi8KKwkJaWYgKHNhcC0+YXR0ci5tbHMubHZsID09IHNtYWNrX2NpcHNvX2RpcmVjdCkgeworCQkJbWVtY3B5KHNpcCwgc21hY2ssIFNNS19NQVhMRU4pOworCQkJcmV0dXJuOwogCQl9Ci0JLyoKLQkgKiBJZiBpdCBpcyBDSVBTTyB1c2luZyBzbWFjayBkaXJlY3QgbWFwcGluZwotCSAqIHdlIGFyZSBhbHJlYWR5IGRvbmUuIFdlZUhlZS4KLQkgKi8KLQlpZiAoc2FwLT5hdHRyLm1scy5sdmwgPT0gc21hY2tfY2lwc29fZGlyZWN0KSB7Ci0JCW1lbWNweShzaXAsIHNtYWNrLCBTTUtfTUFYTEVOKTsKKwkJLyoKKwkJICogTG9vayBpdCB1cCBpbiB0aGUgc3VwcGxpZWQgdGFibGUgaWYgaXQgaXMgbm90CisJCSAqIGEgZGlyZWN0IG1hcHBpbmcuCisJCSAqLworCQlzbWFja19mcm9tX2NpcHNvKHNhcC0+YXR0ci5tbHMubHZsLCBzbWFjaywgc2lwKTsKKwkJcmV0dXJuOworCX0KKwlpZiAoKHNhcC0+ZmxhZ3MgJiBORVRMQkxfU0VDQVRUUl9TRUNJRCkgIT0gMCkgeworCQkvKgorCQkgKiBMb29rcyBsaWtlIGEgZmFsbGJhY2ssIHdoaWNoIGdpdmVzIHVzIGEgc2VjaWQuCisJCSAqLworCQlzcCA9IHNtYWNrX2Zyb21fc2VjaWQoc2FwLT5hdHRyLnNlY2lkKTsKKwkJLyoKKwkJICogVGhpcyBoYXMgZ290IHRvIGJlIGEgYnVnIGJlY2F1c2UgaXQgaXMKKwkJICogaW1wb3NzaWJsZSB0byBzcGVjaWZ5IGEgZmFsbGJhY2sgd2l0aG91dAorCQkgKiBzcGVjaWZ5aW5nIHRoZSBsYWJlbCwgd2hpY2ggd2lsbCBlbnN1cmUKKwkJICogaXQgaGFzIGEgc2VjaWQsIGFuZCB0aGUgb25seSB3YXkgdG8gZ2V0IGEKKwkJICogc2VjaWQgaXMgZnJvbSBhIGZhbGxiYWNrLgorCQkgKi8KKwkJQlVHX09OKHNwID09IE5VTEwpOworCQlzdHJuY3B5KHNpcCwgc3AsIFNNS19NQVhMRU4pOwogCQlyZXR1cm47CiAJfQogCS8qCi0JICogTG9vayBpdCB1cCBpbiB0aGUgc3VwcGxpZWQgdGFibGUgaWYgaXQgaXMgbm90IGEgZGlyZWN0IG1hcHBpbmcuCisJICogV2l0aG91dCBndWlkYW5jZSByZWdhcmRpbmcgdGhlIHNtYWNrIHZhbHVlCisJICogZm9yIHRoZSBwYWNrZXQgZmFsbCBiYWNrIG9uIHRoZSBuZXR3b3JrCisJICogYW1iaWVudCB2YWx1ZS4KIAkgKi8KLQlzbWFja19mcm9tX2NpcHNvKHNhcC0+YXR0ci5tbHMubHZsLCBzbWFjaywgc2lwKTsKKwlzdHJuY3B5KHNpcCwgc21hY2tfbmV0X2FtYmllbnQsIFNNS19NQVhMRU4pOwogCXJldHVybjsKIH0KIApAQCAtMjIwNyw2ICsyNDA0LDcgQEAKIAlzdHJ1Y3QgbmV0bGJsX2xzbV9zZWNhdHRyIHNlY2F0dHI7CiAJc3RydWN0IHNvY2tldF9zbWFjayAqc3NwID0gc2stPnNrX3NlY3VyaXR5OwogCWNoYXIgc21hY2tbU01LX0xBQkVMTEVOXTsKKwljaGFyICpjc3A7CiAJaW50IHJjOwogCiAJaWYgKHNrLT5za19mYW1pbHkgIT0gUEZfSU5FVCAmJiBzay0+c2tfZmFtaWx5ICE9IFBGX0lORVQ2KQpAQCAtMjIxNSwyMSArMjQxMywyNCBAQAogCS8qCiAJICogVHJhbnNsYXRlIHdoYXQgbmV0bGFiZWwgZ2F2ZSB1cy4KIAkgKi8KLQltZW1zZXQoc21hY2ssICdcMCcsIFNNS19MQUJFTExFTik7CiAJbmV0bGJsX3NlY2F0dHJfaW5pdCgmc2VjYXR0cik7CisKIAlyYyA9IG5ldGxibF9za2J1ZmZfZ2V0YXR0cihza2IsIHNrLT5za19mYW1pbHksICZzZWNhdHRyKTsKLQlpZiAocmMgPT0gMCkKKwlpZiAocmMgPT0gMCkgewogCQlzbWFja19mcm9tX3NlY2F0dHIoJnNlY2F0dHIsIHNtYWNrKTsKLQllbHNlCi0JCXN0cm5jcHkoc21hY2ssIHNtYWNrX25ldF9hbWJpZW50LCBTTUtfTUFYTEVOKTsKKwkJY3NwID0gc21hY2s7CisJfSBlbHNlCisJCWNzcCA9IHNtYWNrX25ldF9hbWJpZW50OworCiAJbmV0bGJsX3NlY2F0dHJfZGVzdHJveSgmc2VjYXR0cik7CisKIAkvKgogCSAqIFJlY2VpdmluZyBhIHBhY2tldCByZXF1aXJlcyB0aGF0IHRoZSBvdGhlciBlbmQKIAkgKiBiZSBhYmxlIHRvIHdyaXRlIGhlcmUuIFJlYWQgYWNjZXNzIGlzIG5vdCByZXF1aXJlZC4KIAkgKiBUaGlzIGlzIHRoZSBzaW1wbGlzdCBwb3NzaWJsZSBzZWN1cml0eSBtb2RlbAogCSAqIGZvciBuZXR3b3JraW5nLgogCSAqLwotCXJjID0gc21rX2FjY2VzcyhzbWFjaywgc3NwLT5zbWtfaW4sIE1BWV9XUklURSk7CisJcmMgPSBzbWtfYWNjZXNzKGNzcCwgc3NwLT5zbWtfaW4sIE1BWV9XUklURSk7CiAJaWYgKHJjICE9IDApCiAJCW5ldGxibF9za2J1ZmZfZXJyKHNrYiwgcmMsIDApOwogCXJldHVybiByYzsKQEAgLTIyOTgsNyArMjQ5OSw2IEBACiAJLyoKIAkgKiBUcmFuc2xhdGUgd2hhdCBuZXRsYWJlbCBnYXZlIHVzLgogCSAqLwotCW1lbXNldChzbWFjaywgJ1wwJywgU01LX0xBQkVMTEVOKTsKIAluZXRsYmxfc2VjYXR0cl9pbml0KCZzZWNhdHRyKTsKIAlyYyA9IG5ldGxibF9za2J1ZmZfZ2V0YXR0cihza2IsIGZhbWlseSwgJnNlY2F0dHIpOwogCWlmIChyYyA9PSAwKQpAQCAtMjM0MSw3ICsyNTQxLDcgQEAKIAlzc3AtPnNta19pbiA9IHNzcC0+c21rX291dCA9IGN1cnJlbnRfc2VjdXJpdHkoKTsKIAlzc3AtPnNta19wYWNrZXRbMF0gPSAnXDAnOwogCi0JcmMgPSBzbWFja19uZXRsYWJlbChzayk7CisJcmMgPSBzbWFja19uZXRsYWJlbChzaywgU01BQ0tfQ0lQU09fU09DS0VUKTsKIAlpZiAocmMgIT0gMCkKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiU21hY2s6IFwiJXNcIiBuZXRsYmwgZXJyb3IgJWQuXG4iLAogCQkgICAgICAgX19mdW5jX18sIC1yYyk7CkBAIC0yMzY3LDcgKzI1NjcsNiBAQAogCWlmIChza2IgPT0gTlVMTCkKIAkJcmV0dXJuIC1FQUNDRVM7CiAKLQltZW1zZXQoc21hY2ssICdcMCcsIFNNS19MQUJFTExFTik7CiAJbmV0bGJsX3NlY2F0dHJfaW5pdCgmc2tiX3NlY2F0dHIpOwogCXJjID0gbmV0bGJsX3NrYnVmZl9nZXRhdHRyKHNrYiwgc2stPnNrX2ZhbWlseSwgJnNrYl9zZWNhdHRyKTsKIAlpZiAocmMgPT0gMCkKQEAgLTI3MzIsNiArMjkzMSw4IEBACiAJLnVuaXhfbWF5X3NlbmQgPSAJCXNtYWNrX3VuaXhfbWF5X3NlbmQsCiAKIAkuc29ja2V0X3Bvc3RfY3JlYXRlID0gCQlzbWFja19zb2NrZXRfcG9zdF9jcmVhdGUsCisJLnNvY2tldF9jb25uZWN0ID0JCXNtYWNrX3NvY2tldF9jb25uZWN0LAorCS5zb2NrZXRfc2VuZG1zZyA9CQlzbWFja19zb2NrZXRfc2VuZG1zZywKIAkuc29ja2V0X3NvY2tfcmN2X3NrYiA9IAkJc21hY2tfc29ja2V0X3NvY2tfcmN2X3NrYiwKIAkuc29ja2V0X2dldHBlZXJzZWNfc3RyZWFtID0Jc21hY2tfc29ja2V0X2dldHBlZXJzZWNfc3RyZWFtLAogCS5zb2NrZXRfZ2V0cGVlcnNlY19kZ3JhbSA9CXNtYWNrX3NvY2tldF9nZXRwZWVyc2VjX2RncmFtLApAQCAtMjc4Myw3ICsyOTg0LDYgQEAKIAkvKgogCSAqIEluaXRpYWxpemUgbG9ja3MKIAkgKi8KLQlzcGluX2xvY2tfaW5pdCgmc21hY2tfa25vd25fdW5zZXQuc21rX2NpcHNvbG9jayk7CiAJc3Bpbl9sb2NrX2luaXQoJnNtYWNrX2tub3duX2h1aC5zbWtfY2lwc29sb2NrKTsKIAlzcGluX2xvY2tfaW5pdCgmc21hY2tfa25vd25faGF0LnNta19jaXBzb2xvY2spOwogCXNwaW5fbG9ja19pbml0KCZzbWFja19rbm93bl9zdGFyLnNta19jaXBzb2xvY2spOwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc21hY2svc21hY2tmcy5jIGIvc2VjdXJpdHkvc21hY2svc21hY2tmcy5jCmluZGV4IDI0N2RjOWUuLjcxZTJiOTEgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NtYWNrL3NtYWNrZnMuYworKysgYi9zZWN1cml0eS9zbWFjay9zbWFja2ZzLmMKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CiAjaW5jbHVkZSA8bGludXgvc2VjdXJpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPG5ldC9uZXRfbmFtZXNwYWNlLmg+CiAjaW5jbHVkZSA8bmV0L25ldGxhYmVsLmg+CiAjaW5jbHVkZSA8bmV0L2NpcHNvX2lwdjQuaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgpAQCAtMzgsNyArMzksNyBAQAogCVNNS19ET0kJCT0gNSwJLyogQ0lQU08gRE9JICovCiAJU01LX0RJUkVDVAk9IDYsCS8qIENJUFNPIGxldmVsIGluZGljYXRpbmcgZGlyZWN0IGxhYmVsICovCiAJU01LX0FNQklFTlQJPSA3LAkvKiBpbnRlcm5ldCBhbWJpZW50IGxhYmVsICovCi0JU01LX05MVFlQRQk9IDgsCS8qIGxhYmVsIHNjaGVtZSB0byB1c2UgYnkgZGVmYXVsdCAqLworCVNNS19ORVRMQkxBRERSCT0gOCwJLyogc2luZ2xlIGxhYmVsIGhvc3RzICovCiAJU01LX09OTFlDQVAJPSA5LAkvKiB0aGUgb25seSAiY2FwYWJsZSIgbGFiZWwgKi8KIH07CiAKQEAgLTQ4LDYgKzQ5LDcgQEAKIHN0YXRpYyBERUZJTkVfTVVURVgoc21hY2tfbGlzdF9sb2NrKTsKIHN0YXRpYyBERUZJTkVfTVVURVgoc21hY2tfY2lwc29fbG9jayk7CiBzdGF0aWMgREVGSU5FX01VVEVYKHNtYWNrX2FtYmllbnRfbG9jayk7CitzdGF0aWMgREVGSU5FX01VVEVYKHNta19uZXRsYmxhZGRyX2xvY2spOwogCiAvKgogICogVGhpcyBpcyB0aGUgImFtYmllbnQiIGxhYmVsIGZvciBuZXR3b3JrIHRyYWZmaWMuCkBAIC01NywxMiArNTksNiBAQAogY2hhciAqc21hY2tfbmV0X2FtYmllbnQgPSBzbWFja19rbm93bl9mbG9vci5zbWtfa25vd247CiAKIC8qCi0gKiBUaGlzIGlzIHRoZSBkZWZhdWx0IHBhY2tldCBtYXJraW5nIHNjaGVtZSBmb3IgbmV0d29yayB0cmFmZmljLgotICogSXQgY2FuIGJlIHJlc2V0IHZpYSBzbWFja2ZzL25sdHlwZQotICovCi1pbnQgc21hY2tfbmV0X25sdHlwZSA9IE5FVExCTF9OTFRZUEVfQ0lQU09WNDsKLQotLyoKICAqIFRoaXMgaXMgdGhlIGxldmVsIGluIGEgQ0lQU08gaGVhZGVyIHRoYXQgaW5kaWNhdGVzIGEKICAqIHNtYWNrIGxhYmVsIGlzIGNvbnRhaW5lZCBkaXJlY3RseSBpbiB0aGUgY2F0ZWdvcnkgc2V0LgogICogSXQgY2FuIGJlIHJlc2V0IHZpYSBzbWFja2ZzL2RpcmVjdApAQCAtNzksNiArNzUsMTMgQEAKICAqLwogY2hhciAqc21hY2tfb25seWNhcDsKIAorLyoKKyAqIENlcnRhaW4gSVAgYWRkcmVzc2VzIG1heSBiZSBkZXNpZ25hdGVkIGFzIHNpbmdsZSBsYWJlbCBob3N0cy4KKyAqIFBhY2tldHMgYXJlIHNlbnQgdGhlcmUgdW5sYWJlbGVkLCBidXQgb25seSBmcm9tIHRhc2tzIHRoYXQKKyAqIGNhbiB3cml0ZSB0byB0aGUgc3BlY2lmaWVkIGxhYmVsLgorICovCitzdHJ1Y3Qgc21rX25ldGxibGFkZHIgKnNtYWNrX25ldGxibGFkZHJzOworCiBzdGF0aWMgaW50IHNta19jaXBzb19kb2lfdmFsdWUgPSBTTUFDS19DSVBTT19ET0lfREVGQVVMVDsKIHN0cnVjdCBzbWtfbGlzdF9lbnRyeSAqc21hY2tfbGlzdDsKIApAQCAtMTA0LDYgKzEwNywyNCBAQAogI2RlZmluZSBTTUtfQUNDRVNTTEVOIChzaXplb2YoU01LX0FDQ0VTUykgLSAxKQogI2RlZmluZSBTTUtfTE9BRExFTiAgIChTTUtfTEFCRUxMRU4gKyBTTUtfTEFCRUxMRU4gKyBTTUtfQUNDRVNTTEVOKQogCisvKioKKyAqIHNta19uZXRsYWJlbF9hdWRpdF9zZXQgLSBmaWxsIGEgbmV0bGJsX2F1ZGl0IHN0cnVjdAorICogQG5hcDogc3RydWN0dXJlIHRvIGZpbGwKKyAqLworc3RhdGljIHZvaWQgc21rX25ldGxhYmVsX2F1ZGl0X3NldChzdHJ1Y3QgbmV0bGJsX2F1ZGl0ICpuYXApCit7CisJbmFwLT5sb2dpbnVpZCA9IGF1ZGl0X2dldF9sb2dpbnVpZChjdXJyZW50KTsKKwluYXAtPnNlc3Npb25pZCA9IGF1ZGl0X2dldF9zZXNzaW9uaWQoY3VycmVudCk7CisJbmFwLT5zZWNpZCA9IHNtYWNrX3RvX3NlY2lkKGN1cnJlbnRfc2VjdXJpdHkoKSk7Cit9CisKKy8qCisgKiBWYWx1ZXMgZm9yIHBhcnNpbmcgc2luZ2xlIGxhYmVsIGhvc3QgcnVsZXMKKyAqICIxLjIuMy40IFgiCisgKiAiMTkyLjE2OC4xMzguMTI5LzMyIGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3IgorICovCisjZGVmaW5lIFNNS19ORVRMQkxBRERSTUlOCTkKKyNkZWZpbmUgU01LX05FVExCTEFERFJNQVgJNDIKIAogLyoKICAqIFNlcV9maWxlIHJlYWQgb3BlcmF0aW9ucyBmb3IgL3NtYWNrL2xvYWQKQEAgLTM0NCwxMyArMzY1LDExIEBACiB7CiAJaW50IHJjOwogCXN0cnVjdCBjaXBzb192NF9kb2kgKmRvaXA7Ci0Jc3RydWN0IG5ldGxibF9hdWRpdCBhdWRpdF9pbmZvOworCXN0cnVjdCBuZXRsYmxfYXVkaXQgbmFpOwogCi0JYXVkaXRfaW5mby5sb2dpbnVpZCA9IGF1ZGl0X2dldF9sb2dpbnVpZChjdXJyZW50KTsKLQlhdWRpdF9pbmZvLnNlc3Npb25pZCA9IGF1ZGl0X2dldF9zZXNzaW9uaWQoY3VycmVudCk7Ci0JYXVkaXRfaW5mby5zZWNpZCA9IHNtYWNrX3RvX3NlY2lkKGN1cnJlbnRfc2VjdXJpdHkoKSk7CisJc21rX25ldGxhYmVsX2F1ZGl0X3NldCgmbmFpKTsKIAotCXJjID0gbmV0bGJsX2NmZ19tYXBfZGVsKE5VTEwsICZhdWRpdF9pbmZvKTsKKwlyYyA9IG5ldGxibF9jZmdfbWFwX2RlbChOVUxMLCBQRl9JTkVULCBOVUxMLCBOVUxMLCAmbmFpKTsKIAlpZiAocmMgIT0gMCkKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6JWQgcmVtb3ZlIHJjID0gJWRcbiIsCiAJCSAgICAgICBfX2Z1bmNfXywgX19MSU5FX18sIHJjKTsKQEAgLTM2NSwxMSArMzg0LDE5IEBACiAJZm9yIChyYyA9IDE7IHJjIDwgQ0lQU09fVjRfVEFHX01BWENOVDsgcmMrKykKIAkJZG9pcC0+dGFnc1tyY10gPSBDSVBTT19WNF9UQUdfSU5WQUxJRDsKIAotCXJjID0gbmV0bGJsX2NmZ19jaXBzb3Y0X2FkZF9tYXAoZG9pcCwgTlVMTCwgJmF1ZGl0X2luZm8pOworCXJjID0gbmV0bGJsX2NmZ19jaXBzb3Y0X2FkZChkb2lwLCAmbmFpKTsKIAlpZiAocmMgIT0gMCkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczolZCBhZGQgcmMgPSAlZFxuIiwKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6JWQgY2lwc28gYWRkIHJjID0gJWRcbiIsCiAJCSAgICAgICBfX2Z1bmNfXywgX19MSU5FX18sIHJjKTsKIAkJa2ZyZWUoZG9pcCk7CisJCXJldHVybjsKKwl9CisJcmMgPSBuZXRsYmxfY2ZnX2NpcHNvdjRfbWFwX2FkZChkb2lwLT5kb2ksIE5VTEwsIE5VTEwsIE5VTEwsICZuYWkpOworCWlmIChyYyAhPSAwKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiVkIG1hcCBhZGQgcmMgPSAlZFxuIiwKKwkJICAgICAgIF9fZnVuY19fLCBfX0xJTkVfXywgcmMpOworCQlrZnJlZShkb2lwKTsKKwkJcmV0dXJuOwogCX0KIH0KIApAQCAtMzc5LDIwICs0MDYsMTkgQEAKIHN0YXRpYyB2b2lkIHNta191bmxibF9hbWJpZW50KGNoYXIgKm9sZGFtYmllbnQpCiB7CiAJaW50IHJjOwotCXN0cnVjdCBuZXRsYmxfYXVkaXQgYXVkaXRfaW5mbzsKKwlzdHJ1Y3QgbmV0bGJsX2F1ZGl0IG5haTsKIAotCWF1ZGl0X2luZm8ubG9naW51aWQgPSBhdWRpdF9nZXRfbG9naW51aWQoY3VycmVudCk7Ci0JYXVkaXRfaW5mby5zZXNzaW9uaWQgPSBhdWRpdF9nZXRfc2Vzc2lvbmlkKGN1cnJlbnQpOwotCWF1ZGl0X2luZm8uc2VjaWQgPSBzbWFja190b19zZWNpZChjdXJyZW50X3NlY3VyaXR5KCkpOworCXNta19uZXRsYWJlbF9hdWRpdF9zZXQoJm5haSk7CiAKIAlpZiAob2xkYW1iaWVudCAhPSBOVUxMKSB7Ci0JCXJjID0gbmV0bGJsX2NmZ19tYXBfZGVsKG9sZGFtYmllbnQsICZhdWRpdF9pbmZvKTsKKwkJcmMgPSBuZXRsYmxfY2ZnX21hcF9kZWwob2xkYW1iaWVudCwgUEZfSU5FVCwgTlVMTCwgTlVMTCwgJm5haSk7CiAJCWlmIChyYyAhPSAwKQogCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6JWQgcmVtb3ZlIHJjID0gJWRcbiIsCiAJCQkgICAgICAgX19mdW5jX18sIF9fTElORV9fLCByYyk7CiAJfQogCi0JcmMgPSBuZXRsYmxfY2ZnX3VubGJsX2FkZF9tYXAoc21hY2tfbmV0X2FtYmllbnQsICZhdWRpdF9pbmZvKTsKKwlyYyA9IG5ldGxibF9jZmdfdW5sYmxfbWFwX2FkZChzbWFja19uZXRfYW1iaWVudCwgUEZfSU5FVCwKKwkJCQkgICAgICBOVUxMLCBOVUxMLCAmbmFpKTsKIAlpZiAocmMgIT0gMCkKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6JWQgYWRkIHJjID0gJWRcbiIsCiAJCSAgICAgICBfX2Z1bmNfXywgX19MSU5FX18sIHJjKTsKQEAgLTU0Myw3ICs1NjksNyBAQAogCWlmIChza3AgPT0gTlVMTCkKIAkJZ290byBvdXQ7CiAKLQlydWxlICs9IFNNS19MQUJFTExFTjs7CisJcnVsZSArPSBTTUtfTEFCRUxMRU47CiAJcmV0ID0gc3NjYW5mKHJ1bGUsICIlZCIsICZtYXBsZXZlbCk7CiAJaWYgKHJldCAhPSAxIHx8IG1hcGxldmVsID4gU01BQ0tfQ0lQU09fTUFYTEVWRUwpCiAJCWdvdG8gb3V0OwpAQCAtNjAzLDYgKzYyOSwyMDEgQEAKIAkucmVsZWFzZSAgICAgICAgPSBzZXFfcmVsZWFzZSwKIH07CiAKKy8qCisgKiBTZXFfZmlsZSByZWFkIG9wZXJhdGlvbnMgZm9yIC9zbWFjay9uZXRsYWJlbAorICovCisKK3N0YXRpYyB2b2lkICpuZXRsYmxhZGRyX3NlcV9zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIGxvZmZfdCAqcG9zKQoreworCWlmICgqcG9zID09IFNFUV9SRUFEX0ZJTklTSEVEKQorCQlyZXR1cm4gTlVMTDsKKworCXJldHVybiBzbWFja19uZXRsYmxhZGRyczsKK30KKworc3RhdGljIHZvaWQgKm5ldGxibGFkZHJfc2VxX25leHQoc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICp2LCBsb2ZmX3QgKnBvcykKK3sKKwlzdHJ1Y3Qgc21rX25ldGxibGFkZHIgKnNrcCA9ICgoc3RydWN0IHNta19uZXRsYmxhZGRyICopIHYpLT5zbWtfbmV4dDsKKworCWlmIChza3AgPT0gTlVMTCkKKwkJKnBvcyA9IFNFUV9SRUFEX0ZJTklTSEVEOworCisJcmV0dXJuIHNrcDsKK30KKy8qCisjZGVmaW5lIEJFTUFTSwkweDgwMDAwMDAwCisqLworI2RlZmluZSBCRU1BU0sJMHgwMDAwMDAwMQorI2RlZmluZSBCRUJJVFMJKHNpemVvZihfX2JlMzIpICogOCkKKworLyoKKyAqIFByaW50IGhvc3QvbGFiZWwgcGFpcnMKKyAqLworc3RhdGljIGludCBuZXRsYmxhZGRyX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqdikKK3sKKwlzdHJ1Y3Qgc21rX25ldGxibGFkZHIgKnNrcCA9IChzdHJ1Y3Qgc21rX25ldGxibGFkZHIgKikgdjsKKwl1bnNpZ25lZCBjaGFyICpocCA9IChjaGFyICopICZza3AtPnNta19ob3N0LnNpbl9hZGRyLnNfYWRkcjsKKwlfX2JlMzIgYmViaXRzOworCWludCBtYXNrbiA9IDA7CisKKwlmb3IgKGJlYml0cyA9IEJFTUFTSzsgYmViaXRzICE9IDA7IG1hc2tuKyssIGJlYml0cyA8PD0gMSkKKwkJaWYgKChza3AtPnNta19tYXNrLnNfYWRkciAmIGJlYml0cykgPT0gMCkKKwkJCWJyZWFrOworCisJc2VxX3ByaW50ZihzLCAiJXUuJXUuJXUuJXUvJWQgJXNcbiIsCisJCWhwWzBdLCBocFsxXSwgaHBbMl0sIGhwWzNdLCBtYXNrbiwgc2twLT5zbWtfbGFiZWwpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG5ldGxibGFkZHJfc2VxX3N0b3Aoc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICp2KQoreworCS8qIE5vLW9wICovCit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgbmV0bGJsYWRkcl9zZXFfb3BzID0geworCS5zdGFydCA9IG5ldGxibGFkZHJfc2VxX3N0YXJ0LAorCS5zdG9wICA9IG5ldGxibGFkZHJfc2VxX3N0b3AsCisJLm5leHQgID0gbmV0bGJsYWRkcl9zZXFfbmV4dCwKKwkuc2hvdyAgPSBuZXRsYmxhZGRyX3NlcV9zaG93LAorfTsKKworLyoqCisgKiBzbWtfb3Blbl9uZXRsYmxhZGRyIC0gb3BlbigpIGZvciAvc21hY2svbmV0bGFiZWwKKyAqIEBpbm9kZTogaW5vZGUgc3RydWN0dXJlIHJlcHJlc2VudGluZyBmaWxlCisgKiBAZmlsZTogIm5ldGxhYmVsIiBmaWxlIHBvaW50ZXIKKyAqCisgKiBDb25uZWN0IG91ciBuZXRsYmxhZGRyX3NlcV8qIG9wZXJhdGlvbnMgd2l0aCAvc21hY2svbmV0bGFiZWwKKyAqIGZpbGVfb3BlcmF0aW9ucworICovCitzdGF0aWMgaW50IHNta19vcGVuX25ldGxibGFkZHIoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIHNlcV9vcGVuKGZpbGUsICZuZXRsYmxhZGRyX3NlcV9vcHMpOworfQorCisvKioKKyAqIHNta193cml0ZV9uZXRsYmxhZGRyIC0gd3JpdGUoKSBmb3IgL3NtYWNrL25ldGxhYmVsCisgKiBAZmlscDogZmlsZSBwb2ludGVyLCBub3QgYWN0dWFsbHkgdXNlZAorICogQGJ1Zjogd2hlcmUgdG8gZ2V0IHRoZSBkYXRhIGZyb20KKyAqIEBjb3VudDogYnl0ZXMgc2VudAorICogQHBwb3M6IHdoZXJlIHRvIHN0YXJ0CisgKgorICogQWNjZXB0cyBvbmx5IG9uZSBuZXRsYmxhZGRyIHBlciB3cml0ZSBjYWxsLgorICogUmV0dXJucyBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiBvciBlcnJvciBjb2RlLCBhcyBhcHByb3ByaWF0ZQorICovCitzdGF0aWMgc3NpemVfdCBzbWtfd3JpdGVfbmV0bGJsYWRkcihzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3Qgc21rX25ldGxibGFkZHIgKnNrcDsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gbmV3bmFtZTsKKwljaGFyIHNtYWNrW1NNS19MQUJFTExFTl07CisJY2hhciAqc3A7CisJY2hhciBkYXRhW1NNS19ORVRMQkxBRERSTUFYXTsKKwljaGFyICpob3N0ID0gKGNoYXIgKikmbmV3bmFtZS5zaW5fYWRkci5zX2FkZHI7CisJaW50IHJjOworCXN0cnVjdCBuZXRsYmxfYXVkaXQgYXVkaXRfaW5mbzsKKwlzdHJ1Y3QgaW5fYWRkciBtYXNrOworCXVuc2lnbmVkIGludCBtOworCV9fYmUzMiBiZWJpdHMgPSBCRU1BU0s7CisJX19iZTMyIG5zYTsKKworCS8qCisJICogTXVzdCBoYXZlIHByaXZpbGVnZS4KKwkgKiBObyBwYXJ0aWFsIHdyaXRlcy4KKwkgKiBFbm91Z2ggZGF0YSBtdXN0IGJlIHByZXNlbnQuCisJICogIjxhZGRyL21hc2ssIGFzIGEuYi5jLmQvZT48c3BhY2U+PGxhYmVsPiIKKwkgKiAiPGFkZHIsIGFzIGEuYi5jLmQ+PHNwYWNlPjxsYWJlbD4iCisJICovCisJaWYgKCFjYXBhYmxlKENBUF9NQUNfQURNSU4pKQorCQlyZXR1cm4gLUVQRVJNOworCWlmICgqcHBvcyAhPSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoY291bnQgPCBTTUtfTkVUTEJMQUREUk1JTiB8fCBjb3VudCA+IFNNS19ORVRMQkxBRERSTUFYKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoY29weV9mcm9tX3VzZXIoZGF0YSwgYnVmLCBjb3VudCkgIT0gMCkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlkYXRhW2NvdW50XSA9ICdcMCc7CisKKwlyYyA9IHNzY2FuZihkYXRhLCAiJWhoZC4laGhkLiVoaGQuJWhoZC8lZCAlcyIsCisJCSZob3N0WzBdLCAmaG9zdFsxXSwgJmhvc3RbMl0sICZob3N0WzNdLCAmbSwgc21hY2spOworCWlmIChyYyAhPSA2KSB7CisJCXJjID0gc3NjYW5mKGRhdGEsICIlaGhkLiVoaGQuJWhoZC4laGhkICVzIiwKKwkJCSZob3N0WzBdLCAmaG9zdFsxXSwgJmhvc3RbMl0sICZob3N0WzNdLCBzbWFjayk7CisJCWlmIChyYyAhPSA1KQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCW0gPSBCRUJJVFM7CisJfQorCWlmIChtID4gQkVCSVRTKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNwID0gc21rX2ltcG9ydChzbWFjaywgMCk7CisJaWYgKHNwID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJZm9yIChtYXNrLnNfYWRkciA9IDA7IG0gPiAwOyBtLS0pIHsKKwkJbWFzay5zX2FkZHIgfD0gYmViaXRzOworCQliZWJpdHMgPDw9IDE7CisJfQorCS8qCisJICogT25seSBhbGxvdyBvbmUgd3JpdGVyIGF0IGEgdGltZS4gV3JpdGVzIHNob3VsZCBiZQorCSAqIHF1aXRlIHJhcmUgYW5kIHNtYWxsIGluIGFueSBjYXNlLgorCSAqLworCW11dGV4X2xvY2soJnNta19uZXRsYmxhZGRyX2xvY2spOworCisJbnNhID0gbmV3bmFtZS5zaW5fYWRkci5zX2FkZHI7CisJZm9yIChza3AgPSBzbWFja19uZXRsYmxhZGRyczsgc2twICE9IE5VTEw7IHNrcCA9IHNrcC0+c21rX25leHQpCisJCWlmIChza3AtPnNta19ob3N0LnNpbl9hZGRyLnNfYWRkciA9PSBuc2EgJiYKKwkJICAgIHNrcC0+c21rX21hc2suc19hZGRyID09IG1hc2suc19hZGRyKQorCQkJYnJlYWs7CisKKwlzbWtfbmV0bGFiZWxfYXVkaXRfc2V0KCZhdWRpdF9pbmZvKTsKKworCWlmIChza3AgPT0gTlVMTCkgeworCQlza3AgPSBremFsbG9jKHNpemVvZigqc2twKSwgR0ZQX0tFUk5FTCk7CisJCWlmIChza3AgPT0gTlVMTCkKKwkJCXJjID0gLUVOT01FTTsKKwkJZWxzZSB7CisJCQlyYyA9IDA7CisJCQlza3AtPnNta19ob3N0LnNpbl9hZGRyLnNfYWRkciA9IG5ld25hbWUuc2luX2FkZHIuc19hZGRyOworCQkJc2twLT5zbWtfbWFzay5zX2FkZHIgPSBtYXNrLnNfYWRkcjsKKwkJCXNrcC0+c21rX25leHQgPSBzbWFja19uZXRsYmxhZGRyczsKKwkJCXNrcC0+c21rX2xhYmVsID0gc3A7CisJCQlzbWFja19uZXRsYmxhZGRycyA9IHNrcDsKKwkJfQorCX0gZWxzZSB7CisJCXJjID0gbmV0bGJsX2NmZ191bmxibF9zdGF0aWNfZGVsKCZpbml0X25ldCwgTlVMTCwKKwkJCSZza3AtPnNta19ob3N0LnNpbl9hZGRyLCAmc2twLT5zbWtfbWFzaywKKwkJCVBGX0lORVQsICZhdWRpdF9pbmZvKTsKKwkJc2twLT5zbWtfbGFiZWwgPSBzcDsKKwl9CisKKwkvKgorCSAqIE5vdyB0ZWxsIG5ldGxhYmVsIGFib3V0IHRoZSBzaW5nbGUgbGFiZWwgbmF0dXJlIG9mCisJICogdGhpcyBob3N0IHNvIHRoYXQgaW5jb21pbmcgcGFja2V0cyBnZXQgbGFiZWxlZC4KKwkgKi8KKworCWlmIChyYyA9PSAwKQorCQlyYyA9IG5ldGxibF9jZmdfdW5sYmxfc3RhdGljX2FkZCgmaW5pdF9uZXQsIE5VTEwsCisJCQkmc2twLT5zbWtfaG9zdC5zaW5fYWRkciwgJnNrcC0+c21rX21hc2ssIFBGX0lORVQsCisJCQlzbWFja190b19zZWNpZChza3AtPnNta19sYWJlbCksICZhdWRpdF9pbmZvKTsKKworCWlmIChyYyA9PSAwKQorCQlyYyA9IGNvdW50OworCisJbXV0ZXhfdW5sb2NrKCZzbWtfbmV0bGJsYWRkcl9sb2NrKTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgc21rX25ldGxibGFkZHJfb3BzID0geworCS5vcGVuICAgICAgICAgICA9IHNta19vcGVuX25ldGxibGFkZHIsCisJLnJlYWQJCT0gc2VxX3JlYWQsCisJLmxsc2VlayAgICAgICAgID0gc2VxX2xzZWVrLAorCS53cml0ZQkJPSBzbWtfd3JpdGVfbmV0bGJsYWRkciwKKwkucmVsZWFzZSAgICAgICAgPSBzZXFfcmVsZWFzZSwKK307CisKIC8qKgogICogc21rX3JlYWRfZG9pIC0gcmVhZCgpIGZvciAvc21hY2svZG9pCiAgKiBAZmlscDogZmlsZSBwb2ludGVyLCBub3QgYWN0dWFsbHkgdXNlZApAQCAtODkxLDExMCArMTExMiw2IEBACiAJLndyaXRlCQk9IHNta193cml0ZV9vbmx5Y2FwLAogfTsKIAotc3RydWN0IG9wdGlvbl9uYW1lcyB7Ci0JaW50CW9fbnVtYmVyOwotCWNoYXIJKm9fbmFtZTsKLQljaGFyCSpvX2FsaWFzOwotfTsKLQotc3RhdGljIHN0cnVjdCBvcHRpb25fbmFtZXMgbmV0bGJsX2Nob2ljZXNbXSA9IHsKLQl7IE5FVExCTF9OTFRZUEVfUklQU08sCi0JCU5FVExCTF9OTFRZUEVfUklQU09fTkFNRSwJInJpcHNvIiB9LAotCXsgTkVUTEJMX05MVFlQRV9DSVBTT1Y0LAotCQlORVRMQkxfTkxUWVBFX0NJUFNPVjRfTkFNRSwJImNpcHNvdjQiIH0sCi0JeyBORVRMQkxfTkxUWVBFX0NJUFNPVjQsCi0JCU5FVExCTF9OTFRZUEVfQ0lQU09WNF9OQU1FLAkiY2lwc28iIH0sCi0JeyBORVRMQkxfTkxUWVBFX0NJUFNPVjYsCi0JCU5FVExCTF9OTFRZUEVfQ0lQU09WNl9OQU1FLAkiY2lwc292NiIgfSwKLQl7IE5FVExCTF9OTFRZUEVfVU5MQUJFTEVELAotCQlORVRMQkxfTkxUWVBFX1VOTEFCRUxFRF9OQU1FLAkidW5sYWJlbGVkIiB9LAotfTsKLQotLyoqCi0gKiBzbWtfcmVhZF9ubHR5cGUgLSByZWFkKCkgZm9yIC9zbWFjay9ubHR5cGUKLSAqIEBmaWxwOiBmaWxlIHBvaW50ZXIsIG5vdCBhY3R1YWxseSB1c2VkCi0gKiBAYnVmOiB3aGVyZSB0byBwdXQgdGhlIHJlc3VsdAotICogQGNvdW50OiBtYXhpbXVtIHRvIHNlbmQgYWxvbmcKLSAqIEBwcG9zOiB3aGVyZSB0byBzdGFydAotICoKLSAqIFJldHVybnMgbnVtYmVyIG9mIGJ5dGVzIHJlYWQgb3IgZXJyb3IgY29kZSwgYXMgYXBwcm9wcmlhdGUKLSAqLwotc3RhdGljIHNzaXplX3Qgc21rX3JlYWRfbmx0eXBlKHN0cnVjdCBmaWxlICpmaWxwLCBjaGFyIF9fdXNlciAqYnVmLAotCQkJICAgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQotewotCWNoYXIgYm91bmRbNDBdOwotCXNzaXplX3QgcmM7Ci0JaW50IGk7Ci0KLQlpZiAoY291bnQgPCBTTUtfTEFCRUxMRU4pCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKCpwcG9zICE9IDApCi0JCXJldHVybiAwOwotCi0Jc3ByaW50Zihib3VuZCwgInVua25vd24iKTsKLQotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG5ldGxibF9jaG9pY2VzKTsgaSsrKQotCQlpZiAoc21hY2tfbmV0X25sdHlwZSA9PSBuZXRsYmxfY2hvaWNlc1tpXS5vX251bWJlcikgewotCQkJc3ByaW50Zihib3VuZCwgIiVzIiwgbmV0bGJsX2Nob2ljZXNbaV0ub19uYW1lKTsKLQkJCWJyZWFrOwotCQl9Ci0KLQlyYyA9IHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKGJ1ZiwgY291bnQsIHBwb3MsIGJvdW5kLCBzdHJsZW4oYm91bmQpKTsKLQotCXJldHVybiByYzsKLX0KLQotLyoqCi0gKiBzbWtfd3JpdGVfbmx0eXBlIC0gd3JpdGUoKSBmb3IgL3NtYWNrL25sdHlwZQotICogQGZpbHA6IGZpbGUgcG9pbnRlciwgbm90IGFjdHVhbGx5IHVzZWQKLSAqIEBidWY6IHdoZXJlIHRvIGdldCB0aGUgZGF0YSBmcm9tCi0gKiBAY291bnQ6IGJ5dGVzIHNlbnQKLSAqIEBwcG9zOiB3aGVyZSB0byBzdGFydAotICoKLSAqIFJldHVybnMgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gb3IgZXJyb3IgY29kZSwgYXMgYXBwcm9wcmlhdGUKLSAqLwotc3RhdGljIHNzaXplX3Qgc21rX3dyaXRlX25sdHlwZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKLQkJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKLXsKLQljaGFyIGJvdW5kWzQwXTsKLQljaGFyICpjcDsKLQlpbnQgaTsKLQotCWlmICghY2FwYWJsZShDQVBfTUFDX0FETUlOKSkKLQkJcmV0dXJuIC1FUEVSTTsKLQotCWlmIChjb3VudCA+PSA0MCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAoY29weV9mcm9tX3VzZXIoYm91bmQsIGJ1ZiwgY291bnQpICE9IDApCi0JCXJldHVybiAtRUZBVUxUOwotCi0JYm91bmRbY291bnRdID0gJ1wwJzsKLQljcCA9IHN0cmNocihib3VuZCwgJyAnKTsKLQlpZiAoY3AgIT0gTlVMTCkKLQkJKmNwID0gJ1wwJzsKLQljcCA9IHN0cmNocihib3VuZCwgJ1xuJyk7Ci0JaWYgKGNwICE9IE5VTEwpCi0JCSpjcCA9ICdcMCc7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShuZXRsYmxfY2hvaWNlcyk7IGkrKykKLQkJaWYgKHN0cmNtcChib3VuZCwgbmV0bGJsX2Nob2ljZXNbaV0ub19uYW1lKSA9PSAwIHx8Ci0JCSAgICBzdHJjbXAoYm91bmQsIG5ldGxibF9jaG9pY2VzW2ldLm9fYWxpYXMpID09IDApIHsKLQkJCXNtYWNrX25ldF9ubHR5cGUgPSBuZXRsYmxfY2hvaWNlc1tpXS5vX251bWJlcjsKLQkJCXJldHVybiBjb3VudDsKLQkJfQotCS8qCi0JICogTm90IGEgdmFsaWQgY2hvaWNlLgotCSAqLwotCXJldHVybiAtRUlOVkFMOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzbWtfbmx0eXBlX29wcyA9IHsKLQkucmVhZAkJPSBzbWtfcmVhZF9ubHR5cGUsCi0JLndyaXRlCQk9IHNta193cml0ZV9ubHR5cGUsCi19OwotCiAvKioKICAqIHNta19maWxsX3N1cGVyIC0gZmlsbCB0aGUgL3NtYWNrZnMgc3VwZXJibG9jawogICogQHNiOiB0aGUgZW1wdHkgc3VwZXJibG9jawpAQCAtMTAyMSw4ICsxMTM4LDggQEAKIAkJCXsiZGlyZWN0IiwgJnNta19kaXJlY3Rfb3BzLCBTX0lSVUdPfFNfSVdVU1J9LAogCQlbU01LX0FNQklFTlRdCT0KIAkJCXsiYW1iaWVudCIsICZzbWtfYW1iaWVudF9vcHMsIFNfSVJVR098U19JV1VTUn0sCi0JCVtTTUtfTkxUWVBFXQk9Ci0JCQl7Im5sdHlwZSIsICZzbWtfbmx0eXBlX29wcywgU19JUlVHT3xTX0lXVVNSfSwKKwkJW1NNS19ORVRMQkxBRERSXSA9CisJCQl7Im5ldGxhYmVsIiwgJnNta19uZXRsYmxhZGRyX29wcywgU19JUlVHT3xTX0lXVVNSfSwKIAkJW1NNS19PTkxZQ0FQXQk9CiAJCQl7Im9ubHljYXAiLCAmc21rX29ubHljYXBfb3BzLCBTX0lSVUdPfFNfSVdVU1J9LAogCQkvKiBsYXN0IG9uZSAqLyB7IiJ9CmRpZmYgLS1naXQgYS9zb3VuZC9hcm0vcHhhMnh4LWFjOTctbGliLmMgYi9zb3VuZC9hcm0vcHhhMnh4LWFjOTctbGliLmMKaW5kZXggZWY2NTM5ZS4uMzVhZmQwYyAxMDA2NDQKLS0tIGEvc291bmQvYXJtL3B4YTJ4eC1hYzk3LWxpYi5jCisrKyBiL3NvdW5kL2FybS9weGEyeHgtYWM5Ny1saWIuYwpAQCAtMzIxLDEwICszMjEsNiBAQAogewogCWludCByZXQ7CiAKLQlyZXQgPSByZXF1ZXN0X2lycShJUlFfQUM5NywgcHhhMnh4X2FjOTdfaXJxLCAwLCAiQUM5NyIsIE5VTEwpOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIGVycjsKLQogCWlmIChjcHVfaXNfcHhhMjV4KCkgfHwgY3B1X2lzX3B4YTI3eCgpKSB7CiAJCXB4YV9ncGlvX21vZGUoR1BJTzMxX1NZTkNfQUM5N19NRCk7CiAJCXB4YV9ncGlvX21vZGUoR1BJTzMwX1NEQVRBX09VVF9BQzk3X01EKTsKQEAgLTMzOSw3ICszMzUsNyBAQAogCQlpZiAoSVNfRVJSKGFjOTdjb25mX2NsaykpIHsKIAkJCXJldCA9IFBUUl9FUlIoYWM5N2NvbmZfY2xrKTsKIAkJCWFjOTdjb25mX2NsayA9IE5VTEw7Ci0JCQlnb3RvIGVycl9pcnE7CisJCQlnb3RvIGVycl9jb25mOwogCQl9CiAJfQogCkBAIC0zNDcsMTkgKzM0MywzMCBAQAogCWlmIChJU19FUlIoYWM5N19jbGspKSB7CiAJCXJldCA9IFBUUl9FUlIoYWM5N19jbGspOwogCQlhYzk3X2NsayA9IE5VTEw7Ci0JCWdvdG8gZXJyX2lycTsKKwkJZ290byBlcnJfY2xrOwogCX0KIAotCXJldHVybiBjbGtfZW5hYmxlKGFjOTdfY2xrKTsKKwlyZXQgPSBjbGtfZW5hYmxlKGFjOTdfY2xrKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9jbGsyOworCisJcmV0ID0gcmVxdWVzdF9pcnEoSVJRX0FDOTcsIHB4YTJ4eF9hYzk3X2lycSwgSVJRRl9ESVNBQkxFRCwgIkFDOTciLCBOVUxMKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJfaXJxOworCisJcmV0dXJuIDA7CiAKIGVycl9pcnE6CiAJR0NSIHw9IEdDUl9BQ0xJTktfT0ZGOworZXJyX2NsazI6CisJY2xrX3B1dChhYzk3X2Nsayk7CisJYWM5N19jbGsgPSBOVUxMOworZXJyX2NsazoKIAlpZiAoYWM5N2NvbmZfY2xrKSB7CiAJCWNsa19wdXQoYWM5N2NvbmZfY2xrKTsKIAkJYWM5N2NvbmZfY2xrID0gTlVMTDsKIAl9Ci0JZnJlZV9pcnEoSVJRX0FDOTcsIE5VTEwpOwotZXJyOgorZXJyX2NvbmY6CiAJcmV0dXJuIHJldDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHB4YTJ4eF9hYzk3X2h3X3Byb2JlKTsKZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvc291bmQuYyBiL3NvdW5kL2NvcmUvc291bmQuYwppbmRleCA0NGE2OWJiLi43ODcyYTAyIDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL3NvdW5kLmMKKysrIGIvc291bmQvY29yZS9zb3VuZC5jCkBAIC0xNTIsNiArMTUyLDEwIEBACiAJfQogCW9sZF9mb3BzID0gZmlsZS0+Zl9vcDsKIAlmaWxlLT5mX29wID0gZm9wc19nZXQobXB0ci0+Zl9vcHMpOworCWlmIChmaWxlLT5mX29wID09IE5VTEwpIHsKKwkJZmlsZS0+Zl9vcCA9IG9sZF9mb3BzOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CiAJaWYgKGZpbGUtPmZfb3AtPm9wZW4pCiAJCWVyciA9IGZpbGUtPmZfb3AtPm9wZW4oaW5vZGUsIGZpbGUpOwogCWlmIChlcnIpIHsKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9hZWRzcDE2LmMgYi9zb3VuZC9vc3MvYWVkc3AxNi5jCmluZGV4IGEwMjc0ZjMuLjNlZTk5MDAgMTAwNjQ0Ci0tLSBhL3NvdW5kL29zcy9hZWRzcDE2LmMKKysrIGIvc291bmQvb3NzL2FlZHNwMTYuYwpAQCAtMTU3LDcgKzE1Nyw3IEBACiAKICAgIFN0YXJ0ZWQgRnJpIE1hciAxNyAxNjoxMzoxOCBNRVQgMTk5NQogCi0gICB2MC4xIChBTFBIQSwgd2FzIGFuIHVzZXItbGV2ZWwgcHJvZ3JhbSBjYWxsZWQgQXVkaW9FeGNlbERTUDE2LmMpCisgICB2MC4xIChBTFBIQSwgd2FzIGEgdXNlci1sZXZlbCBwcm9ncmFtIGNhbGxlZCBBdWRpb0V4Y2VsRFNQMTYuYykKICAgIC0gSW5pdGlhbCBjb2RlLgogICAgdjAuMiAoQUxQSEEpCiAgICAtIENsZWFudXBzLgpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9wYXRjaF9jb25leGFudC5jIGIvc291bmQvcGNpL2hkYS9wYXRjaF9jb25leGFudC5jCmluZGV4IGIyMGUxY2UuLjc1ZGU0MGEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9oZGEvcGF0Y2hfY29uZXhhbnQuYworKysgYi9zb3VuZC9wY2kvaGRhL3BhdGNoX2NvbmV4YW50LmMKQEAgLTI1LDYgKzI1LDggQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgorI2luY2x1ZGUgPHNvdW5kL2phY2suaD4KKwogI2luY2x1ZGUgImhkYV9jb2RlYy5oIgogI2luY2x1ZGUgImhkYV9sb2NhbC5oIgogCkBAIC0zNyw3ICszOSwyMCBAQAogI2RlZmluZSBDT05FWEFOVF9IUF9FVkVOVAkweDM3CiAjZGVmaW5lIENPTkVYQU5UX01JQ19FVkVOVAkweDM4CiAKKy8qIENvbmV4YW50IDUwNTEgc3BlY2lmaWMgKi8KIAorI2RlZmluZSBDWFQ1MDUxX1NQRElGX09VVAkweDFDCisjZGVmaW5lIENYVDUwNTFfUE9SVEJfRVZFTlQJMHgzOAorI2RlZmluZSBDWFQ1MDUxX1BPUlRDX0VWRU5UCTB4MzkKKworCitzdHJ1Y3QgY29uZXhhbnRfamFjayB7CisKKwloZGFfbmlkX3QgbmlkOworCWludCB0eXBlOworCXN0cnVjdCBzbmRfamFjayAqamFjazsKKworfTsKIAogc3RydWN0IGNvbmV4YW50X3NwZWMgewogCkBAIC04Myw2ICs5OCw5IEBACiAKIAl1bnNpZ25lZCBpbnQgc3BkaWZfcm91dGU7CiAKKwkvKiBqYWNrIGRldGVjdGlvbiAqLworCXN0cnVjdCBzbmRfYXJyYXkgamFja3M7CisKIAkvKiBkeW5hbWljIGNvbnRyb2xzLCBpbml0X3ZlcmJzIGFuZCBpbnB1dF9tdXggKi8KIAlzdHJ1Y3QgYXV0b19waW5fY2ZnIGF1dG9jZmc7CiAJc3RydWN0IGhkYV9pbnB1dF9tdXggcHJpdmF0ZV9pbXV4OwpAQCAtMzI5LDYgKzM0Nyw4NiBAQAogCQkJCSAgICAgJnNwZWMtPmN1cl9tdXhbYWRjX2lkeF0pOwogfQogCitzdGF0aWMgaW50IGNvbmV4YW50X2FkZF9qYWNrKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAorCQloZGFfbmlkX3QgbmlkLCBpbnQgdHlwZSkKK3sKKwlzdHJ1Y3QgY29uZXhhbnRfc3BlYyAqc3BlYzsKKwlzdHJ1Y3QgY29uZXhhbnRfamFjayAqamFjazsKKwljb25zdCBjaGFyICpuYW1lOworCisJc3BlYyA9IGNvZGVjLT5zcGVjOworCXNuZF9hcnJheV9pbml0KCZzcGVjLT5qYWNrcywgc2l6ZW9mKCpqYWNrKSwgMzIpOworCWphY2sgPSBzbmRfYXJyYXlfbmV3KCZzcGVjLT5qYWNrcyk7CisJbmFtZSA9ICh0eXBlID09IFNORF9KQUNLX0hFQURQSE9ORSkgPyAiSGVhZHBob25lIiA6ICJNaWMiIDsKKworCWlmICghamFjaykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlqYWNrLT5uaWQgPSBuaWQ7CisJamFjay0+dHlwZSA9IHR5cGU7CisKKwlyZXR1cm4gc25kX2phY2tfbmV3KGNvZGVjLT5idXMtPmNhcmQsIG5hbWUsIHR5cGUsICZqYWNrLT5qYWNrKTsKK30KKworc3RhdGljIHZvaWQgY29uZXhhbnRfcmVwb3J0X2phY2soc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGhkYV9uaWRfdCBuaWQpCit7CisJc3RydWN0IGNvbmV4YW50X3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKwlzdHJ1Y3QgY29uZXhhbnRfamFjayAqamFja3MgPSBzcGVjLT5qYWNrcy5saXN0OworCisJaWYgKGphY2tzKSB7CisJCWludCBpOworCQlmb3IgKGkgPSAwOyBpIDwgc3BlYy0+amFja3MudXNlZDsgaSsrKSB7CisJCQlpZiAoamFja3MtPm5pZCA9PSBuaWQpIHsKKwkJCQl1bnNpZ25lZCBpbnQgcHJlc2VudDsKKwkJCQlwcmVzZW50ID0gc25kX2hkYV9jb2RlY19yZWFkKGNvZGVjLCBuaWQsIDAsCisJCQkJCQlBQ19WRVJCX0dFVF9QSU5fU0VOU0UsIDApICYKKwkJCQkJQUNfUElOU0VOU0VfUFJFU0VOQ0U7CisKKwkJCQlwcmVzZW50ID0gKHByZXNlbnQpID8gamFja3MtPnR5cGUgOiAwIDsKKworCQkJCXNuZF9qYWNrX3JlcG9ydChqYWNrcy0+amFjaywKKwkJCQkJCXByZXNlbnQpOworCQkJfQorCQkJamFja3MrKzsKKwkJfQorCX0KK30KKworc3RhdGljIGludCBjb25leGFudF9pbml0X2phY2tzKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworI2lmZGVmIENPTkZJR19TTkRfSkFDSworCXN0cnVjdCBjb25leGFudF9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgc3BlYy0+bnVtX2luaXRfdmVyYnM7IGkrKykgeworCQljb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgKmh2OworCisJCWh2ID0gc3BlYy0+aW5pdF92ZXJic1tpXTsKKwkJd2hpbGUgKGh2LT5uaWQpIHsKKwkJCWludCBlcnIgPSAwOworCQkJc3dpdGNoIChodi0+cGFyYW0gXiBBQ19VU1JTUF9FTikgeworCQkJY2FzZSBDT05FWEFOVF9IUF9FVkVOVDoKKwkJCQllcnIgPSBjb25leGFudF9hZGRfamFjayhjb2RlYywgaHYtPm5pZCwKKwkJCQkJCVNORF9KQUNLX0hFQURQSE9ORSk7CisJCQkJY29uZXhhbnRfcmVwb3J0X2phY2soY29kZWMsIGh2LT5uaWQpOworCQkJCWJyZWFrOworCQkJY2FzZSBDWFQ1MDUxX1BPUlRDX0VWRU5UOgorCQkJY2FzZSBDT05FWEFOVF9NSUNfRVZFTlQ6CisJCQkJZXJyID0gY29uZXhhbnRfYWRkX2phY2soY29kZWMsIGh2LT5uaWQsCisJCQkJCQlTTkRfSkFDS19NSUNST1BIT05FKTsKKwkJCQljb25leGFudF9yZXBvcnRfamFjayhjb2RlYywgaHYtPm5pZCk7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoZXJyIDwgMCkKKwkJCQlyZXR1cm4gZXJyOworCQkJKytodjsKKwkJfQorCX0KKyNlbmRpZgorCXJldHVybiAwOworCit9CisKIHN0YXRpYyBpbnQgY29uZXhhbnRfaW5pdChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKIHsKIAlzdHJ1Y3QgY29uZXhhbnRfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwpAQCAtMzQxLDYgKzQzOSwxNiBAQAogCiBzdGF0aWMgdm9pZCBjb25leGFudF9mcmVlKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQogeworI2lmZGVmIENPTkZJR19TTkRfSkFDSworCXN0cnVjdCBjb25leGFudF9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJaWYgKHNwZWMtPmphY2tzLmxpc3QpIHsKKwkJc3RydWN0IGNvbmV4YW50X2phY2sgKmphY2tzID0gc3BlYy0+amFja3MubGlzdDsKKwkJaW50IGk7CisJCWZvciAoaSA9IDA7IGkgPCBzcGVjLT5qYWNrcy51c2VkOyBpKyspCisJCQlzbmRfZGV2aWNlX2ZyZWUoY29kZWMtPmJ1cy0+Y2FyZCwgJmphY2tzW2ldLmphY2spOworCQlzbmRfYXJyYXlfZnJlZSgmc3BlYy0+amFja3MpOworCX0KKyNlbmRpZgogCWtmcmVlKGNvZGVjLT5zcGVjKTsKIH0KIApAQCAtMTUyNiw5ICsxNjM0LDYgQEAKIC8qIENvbmV4YW50IDUwNTEgc3BlY2lmaWMgKi8KIHN0YXRpYyBoZGFfbmlkX3QgY3h0NTA1MV9kYWNfbmlkc1sxXSA9IHsgMHgxMCB9Owogc3RhdGljIGhkYV9uaWRfdCBjeHQ1MDUxX2FkY19uaWRzWzJdID0geyAweDE0LCAweDE1IH07Ci0jZGVmaW5lIENYVDUwNTFfU1BESUZfT1VUCTB4MUMKLSNkZWZpbmUgQ1hUNTA1MV9QT1JUQl9FVkVOVAkweDM4Ci0jZGVmaW5lIENYVDUwNTFfUE9SVENfRVZFTlQJMHgzOQogCiBzdGF0aWMgc3RydWN0IGhkYV9jaGFubmVsX21vZGUgY3h0NTA1MV9tb2Rlc1sxXSA9IHsKIAl7IDIsIE5VTEwgfSwKQEAgLTE2MDgsNiArMTcxMyw3IEBACiBzdGF0aWMgdm9pZCBjeHQ1MDUxX2hwX3Vuc29sX2V2ZW50KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAogCQkJCSAgIHVuc2lnbmVkIGludCByZXMpCiB7CisJaW50IG5pZCA9IChyZXMgJiBBQ19VTlNPTF9SRVNfU1VCVEFHKSA+PiAyMDsKIAlzd2l0Y2ggKHJlcyA+PiAyNikgewogCWNhc2UgQ09ORVhBTlRfSFBfRVZFTlQ6CiAJCWN4dDUwNTFfaHBfYXV0b211dGUoY29kZWMpOwpAQCAtMTYxOSw2ICsxNzI1LDcgQEAKIAkJY3h0NTA1MV9wb3J0Y19hdXRvbWljKGNvZGVjKTsKIAkJYnJlYWs7CiAJfQorCWNvbmV4YW50X3JlcG9ydF9qYWNrKGNvZGVjLCBuaWQpOwogfQogCiBzdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgY3h0NTA1MV9taXhlcnNbXSA9IHsKQEAgLTE2OTMsNiArMTgwMCw3IEBACiBzdGF0aWMgaW50IGN4dDUwNTFfaW5pdChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKIHsKIAljb25leGFudF9pbml0KGNvZGVjKTsKKwljb25leGFudF9pbml0X2phY2tzKGNvZGVjKTsKIAlpZiAoY29kZWMtPnBhdGNoX29wcy51bnNvbF9ldmVudCkgewogCQljeHQ1MDUxX2hwX2F1dG9tdXRlKGNvZGVjKTsKIAkJY3h0NTA1MV9wb3J0Yl9hdXRvbWljKGNvZGVjKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvcGF0Y2hfcmVhbHRlay5jIGIvc291bmQvcGNpL2hkYS9wYXRjaF9yZWFsdGVrLmMKaW5kZXggMGJkNGU2Yi4uOTA2NWViZiAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2hkYS9wYXRjaF9yZWFsdGVrLmMKKysrIGIvc291bmQvcGNpL2hkYS9wYXRjaF9yZWFsdGVrLmMKQEAgLTg0NjcsNiArODQ2Nyw3IEBACiAJU05EX1BDSV9RVUlSSygweDEwM2MsIDB4MmE0ZiwgIkhQIFNhbWJhIiwgQUxDODg4XzNTVF9IUCksCiAJU05EX1BDSV9RVUlSSygweDEwM2MsIDB4MmE2MCwgIkhQIEx1Y2tub3ciLCBBTEM4ODhfM1NUX0hQKSwKIAlTTkRfUENJX1FVSVJLKDB4MTAzYywgMHgyYTYxLCAiSFAgTmV0dGxlIiwgQUxDODgzXzZTVF9ESUcpLAorCVNORF9QQ0lfUVVJUksoMHgxMDNjLCAweDJhNjYsICJIUCBBY2FjaWEiLCBBTEM4ODhfM1NUX0hQKSwKIAlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxODczLCAiQXN1cyBNOTBWIiwgQUxDODg4X0FTVVNfTTkwViksCiAJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4ODI0OSwgIkFzdXMgTTJBLVZNIEhETUkiLCBBTEM4ODNfM1NUXzZjaF9ESUcpLAogCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDgyZmUsICJBc3VzIFA1US1FTSBIRE1JIiwgQUxDMTIwMF9BU1VTX1A1USksCkBAIC0xNjYzOCw5ICsxNjYzOSw5IEBACiAJICAucGF0Y2ggPSBwYXRjaF9hbGM4ODIgfSwgLyogc2hvdWxkIGJlIHBhdGNoX2FsYzg4MygpIGluIGZ1dHVyZSAqLwogCXsgLmlkID0gMHgxMGVjMDg4NSwgLm5hbWUgPSAiQUxDODg1IiwgLnBhdGNoID0gcGF0Y2hfYWxjODgyIH0sCiAJeyAuaWQgPSAweDEwZWMwODg3LCAubmFtZSA9ICJBTEM4ODciLCAucGF0Y2ggPSBwYXRjaF9hbGM4ODMgfSwKLQl7IC5pZCA9IDB4MTBlYzA4ODgsIC5uYW1lID0gIkFMQzg4OCIsIC5wYXRjaCA9IHBhdGNoX2FsYzg4MyB9LAogCXsgLmlkID0gMHgxMGVjMDg4OCwgLnJldiA9IDB4MTAwMTAxLCAubmFtZSA9ICJBTEMxMjAwIiwKIAkgIC5wYXRjaCA9IHBhdGNoX2FsYzg4MyB9LAorCXsgLmlkID0gMHgxMGVjMDg4OCwgLm5hbWUgPSAiQUxDODg4IiwgLnBhdGNoID0gcGF0Y2hfYWxjODgzIH0sCiAJeyAuaWQgPSAweDEwZWMwODg5LCAubmFtZSA9ICJBTEM4ODkiLCAucGF0Y2ggPSBwYXRjaF9hbGM4ODMgfSwKIAl7fSAvKiB0ZXJtaW5hdG9yICovCiB9OwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2ljZTE3MTIvaWNlMTcyNC5jIGIvc291bmQvcGNpL2ljZTE3MTIvaWNlMTcyNC5jCmluZGV4IDBkZmEwNTQuLmJiOGQ4YzcgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9pY2UxNzEyL2ljZTE3MjQuYworKysgYi9zb3VuZC9wY2kvaWNlMTcxMi9pY2UxNzI0LmMKQEAgLTEyMzksNyArMTIzOSw3IEBACiAJaWYgKGljZS0+Zm9yY2VfcGRtYTQgfHwgaWNlLT5mb3JjZV9yZG1hMSkKIAkJbmFtZSA9ICJJQ0UxNzI0IFNlY29uZGFyeSI7CiAJZWxzZQotCQluYW1lID0gIklFQzE3MjQgSUVDOTU4IjsKKwkJbmFtZSA9ICJJQ0UxNzI0IElFQzk1OCI7CiAJZXJyID0gc25kX3BjbV9uZXcoaWNlLT5jYXJkLCBuYW1lLCBkZXZpY2UsIHBsYXksIGNhcHQsICZwY20pOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2F0bWVsL3NhbTlnMjBfd204NzMxLmMgYi9zb3VuZC9zb2MvYXRtZWwvc2FtOWcyMF93bTg3MzEuYwppbmRleCAxZmI1OWE5Li42ZWEwNGJlIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvYXRtZWwvc2FtOWcyMF93bTg3MzEuYworKysgYi9zb3VuZC9zb2MvYXRtZWwvc2FtOWcyMF93bTg3MzEuYwpAQCAtMjIxLDggKzIyMSw4IEBACiAJc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoY29kZWMsIGludGVyY29uLCBBUlJBWV9TSVpFKGludGVyY29uKSk7CiAKIAkvKiBub3QgY29ubmVjdGVkICovCi0Jc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGNvZGVjLCAiUkxJTkVJTiIpOwotCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbihjb2RlYywgIkxMSU5FSU4iKTsKKwlzbmRfc29jX2RhcG1fbmNfcGluKGNvZGVjLCAiUkxJTkVJTiIpOworCXNuZF9zb2NfZGFwbV9uY19waW4oY29kZWMsICJMTElORUlOIik7CiAKIAkvKiBhbHdheXMgY29ubmVjdGVkICovCiAJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oY29kZWMsICJJbnQgTWljIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvYXUxeC9kYmRtYTIuYyBiL3NvdW5kL3NvYy9hdTF4L2RiZG1hMi5jCmluZGV4IDc0YzgyM2QuLmJjOGQ2NTQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9hdTF4L2RiZG1hMi5jCisrKyBiL3NvdW5kL3NvYy9hdTF4L2RiZG1hMi5jCkBAIC0xODcsNyArMTg3LDcgQEAKIAkJCQkJYXUxeF9wY21fZG1hdHhfY2IsICh2b2lkICopcGNkKTsKIAogCWlmICghcGNkLT5kZG1hX2NoYW4pCi0JCXJldHVybiAtRU5PTUVNOzsKKwkJcmV0dXJuIC1FTk9NRU07CiAKIAlhdTF4eHhfZGJkbWFfc2V0X2RldndpZHRoKHBjZC0+ZGRtYV9jaGFuLCBtc2JpdHMpOwogCWF1MXh4eF9kYmRtYV9yaW5nX2FsbG9jKHBjZC0+ZGRtYV9jaGFuLCAyKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvS2NvbmZpZyBiL3NvdW5kL3NvYy9jb2RlY3MvS2NvbmZpZwppbmRleCBjNDEyODliLi5kMGUwZDY5IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL0tjb25maWcKKysrIGIvc291bmQvc29jL2NvZGVjcy9LY29uZmlnCkBAIC0xLDMgKzEsMTMgQEAKKyMgSGVscGVyIHRvIHJlc29sdmUgaXNzdWVzIHdpdGggY29uZmlncyB0aGF0IGhhdmUgU1BJIGVuYWJsZWQgYnV0IEkyQworIyBtb2R1bGFyLCBtZWFuaW5nIHdlIGNhbid0IGJ1aWxkIHRoZSBjb2RlYyBkcml2ZXIgaW4gd2l0aCBJMkMgc3VwcG9ydC4KKyMgV2UgdXNlIGFuIG9yZGVyZWQgbGlzdCBvZiBjb25kaXRpb25hbCBkZWZhdWx0cyB0byBwaWNrIHRoZSBhcHByb3ByaWF0ZQorIyBzZXR0aW5nIC0gU1BJIGNhbid0IGJlIG1vZHVsYXIgc28gdGhhdCBjYXNlIGRvZXNuJ3QgbmVlZCB0byBiZSBjb3ZlcmVkLgorY29uZmlnIFNORF9TT0NfSTJDX0FORF9TUEkKKwl0cmlzdGF0ZQorCWRlZmF1bHQgbSBpZiBJMkM9bQorCWRlZmF1bHQgeSBpZiBJMkM9eQorCWRlZmF1bHQgeSBpZiBTUElfTUFTVEVSPXkKKwogY29uZmlnIFNORF9TT0NfQUxMX0NPREVDUwogCXRyaXN0YXRlICJCdWlsZCBhbGwgQVNvQyBDT0RFQyBkcml2ZXJzIgogCXNlbGVjdCBTTkRfU09DX0FDOTdfQ09ERUMgaWYgU05EX1NPQ19BQzk3X0JVUwpAQCAtMTQsMTIgKzI0LDEyIEBACiAJc2VsZWN0IFNORF9TT0NfVURBMTM0WAogCXNlbGVjdCBTTkRfU09DX1VEQTEzODAgaWYgSTJDCiAJc2VsZWN0IFNORF9TT0NfV004MzUwIGlmIE1GRF9XTTgzNTAKLQlzZWxlY3QgU05EX1NPQ19XTTg1MTAgaWYgKEkyQyB8fCBTUElfTUFTVEVSKQorCXNlbGVjdCBTTkRfU09DX1dNODUxMCBpZiBTTkRfU09DX0kyQ19BTkRfU1BJCiAJc2VsZWN0IFNORF9TT0NfV004NTgwIGlmIEkyQwotCXNlbGVjdCBTTkRfU09DX1dNODcyOCBpZiAoSTJDIHx8IFNQSV9NQVNURVIpCi0Jc2VsZWN0IFNORF9TT0NfV004NzMxIGlmIChJMkMgfHwgU1BJX01BU1RFUikKLQlzZWxlY3QgU05EX1NPQ19XTTg3NTAgaWYgKEkyQyB8fCBTUElfTUFTVEVSKQotCXNlbGVjdCBTTkRfU09DX1dNODc1MyBpZiAoSTJDIHx8IFNQSV9NQVNURVIpCisJc2VsZWN0IFNORF9TT0NfV004NzI4IGlmIFNORF9TT0NfSTJDX0FORF9TUEkKKwlzZWxlY3QgU05EX1NPQ19XTTg3MzEgaWYgU05EX1NPQ19JMkNfQU5EX1NQSQorCXNlbGVjdCBTTkRfU09DX1dNODc1MCBpZiBTTkRfU09DX0kyQ19BTkRfU1BJCisJc2VsZWN0IFNORF9TT0NfV004NzUzIGlmIFNORF9TT0NfSTJDX0FORF9TUEkKIAlzZWxlY3QgU05EX1NPQ19XTTg5MDAgaWYgSTJDCiAJc2VsZWN0IFNORF9TT0NfV004OTAzIGlmIEkyQwogCXNlbGVjdCBTTkRfU09DX1dNODk3MSBpZiBJMkMKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvdHdsNDAzMC5jIGIvc291bmQvc29jL2NvZGVjcy90d2w0MDMwLmMKaW5kZXggNTE4NDg4OC4uZmQwZjMzOCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy90d2w0MDMwLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy90d2w0MDMwLmMKQEAgLTE5MiwzOSArMTkyLDUxIEBACiAKIC8qIEVhcnBpZWNlICovCiBzdGF0aWMgY29uc3QgY2hhciAqdHdsNDAzMF9lYXJwaWVjZV90ZXh0c1tdID0KLQkJeyJPZmYiLCAiREFDTDEiLCAiREFDTDIiLCAiSW52YWxpZCIsICJEQUNSMSJ9OworCQl7Ik9mZiIsICJEQUNMMSIsICJEQUNMMiIsICJEQUNSMSJ9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHR3bDQwMzBfZWFycGllY2VfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFRXTDQwMzBfUkVHX0VBUl9DVEwsIDEsCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHR3bDQwMzBfZWFycGllY2VfdmFsdWVzW10gPQorCQl7MHgwLCAweDEsIDB4MiwgMHg0fTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfdmFsdWVfZW51bSB0d2w0MDMwX2VhcnBpZWNlX2VudW0gPQorCVNPQ19WQUxVRV9FTlVNX1NJTkdMRShUV0w0MDMwX1JFR19FQVJfQ1RMLCAxLCAweDcsCiAJCQlBUlJBWV9TSVpFKHR3bDQwMzBfZWFycGllY2VfdGV4dHMpLAotCQkJdHdsNDAzMF9lYXJwaWVjZV90ZXh0cyk7CisJCQl0d2w0MDMwX2VhcnBpZWNlX3RleHRzLAorCQkJdHdsNDAzMF9lYXJwaWVjZV92YWx1ZXMpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdHdsNDAzMF9kYXBtX2VhcnBpZWNlX2NvbnRyb2wgPQotU09DX0RBUE1fRU5VTSgiUm91dGUiLCB0d2w0MDMwX2VhcnBpZWNlX2VudW0pOworU09DX0RBUE1fVkFMVUVfRU5VTSgiUm91dGUiLCB0d2w0MDMwX2VhcnBpZWNlX2VudW0pOwogCiAvKiBQcmVEcml2ZSBMZWZ0ICovCiBzdGF0aWMgY29uc3QgY2hhciAqdHdsNDAzMF9wcmVkcml2ZWxfdGV4dHNbXSA9Ci0JCXsiT2ZmIiwgIkRBQ0wxIiwgIkRBQ0wyIiwgIkludmFsaWQiLCAiREFDUjIifTsKKwkJeyJPZmYiLCAiREFDTDEiLCAiREFDTDIiLCAiREFDUjIifTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSB0d2w0MDMwX3ByZWRyaXZlbF9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoVFdMNDAzMF9SRUdfUFJFRExfQ1RMLCAxLAorc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB0d2w0MDMwX3ByZWRyaXZlbF92YWx1ZXNbXSA9CisJCXsweDAsIDB4MSwgMHgyLCAweDR9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY192YWx1ZV9lbnVtIHR3bDQwMzBfcHJlZHJpdmVsX2VudW0gPQorCVNPQ19WQUxVRV9FTlVNX1NJTkdMRShUV0w0MDMwX1JFR19QUkVETF9DVEwsIDEsIDB4NywKIAkJCUFSUkFZX1NJWkUodHdsNDAzMF9wcmVkcml2ZWxfdGV4dHMpLAotCQkJdHdsNDAzMF9wcmVkcml2ZWxfdGV4dHMpOworCQkJdHdsNDAzMF9wcmVkcml2ZWxfdGV4dHMsCisJCQl0d2w0MDMwX3ByZWRyaXZlbF92YWx1ZXMpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdHdsNDAzMF9kYXBtX3ByZWRyaXZlbF9jb250cm9sID0KLVNPQ19EQVBNX0VOVU0oIlJvdXRlIiwgdHdsNDAzMF9wcmVkcml2ZWxfZW51bSk7CitTT0NfREFQTV9WQUxVRV9FTlVNKCJSb3V0ZSIsIHR3bDQwMzBfcHJlZHJpdmVsX2VudW0pOwogCiAvKiBQcmVEcml2ZSBSaWdodCAqLwogc3RhdGljIGNvbnN0IGNoYXIgKnR3bDQwMzBfcHJlZHJpdmVyX3RleHRzW10gPQotCQl7Ik9mZiIsICJEQUNSMSIsICJEQUNSMiIsICJJbnZhbGlkIiwgIkRBQ0wyIn07CisJCXsiT2ZmIiwgIkRBQ1IxIiwgIkRBQ1IyIiwgIkRBQ0wyIn07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gdHdsNDAzMF9wcmVkcml2ZXJfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFRXTDQwMzBfUkVHX1BSRURSX0NUTCwgMSwKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgdHdsNDAzMF9wcmVkcml2ZXJfdmFsdWVzW10gPQorCQl7MHgwLCAweDEsIDB4MiwgMHg0fTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfdmFsdWVfZW51bSB0d2w0MDMwX3ByZWRyaXZlcl9lbnVtID0KKwlTT0NfVkFMVUVfRU5VTV9TSU5HTEUoVFdMNDAzMF9SRUdfUFJFRFJfQ1RMLCAxLCAweDcsCiAJCQlBUlJBWV9TSVpFKHR3bDQwMzBfcHJlZHJpdmVyX3RleHRzKSwKLQkJCXR3bDQwMzBfcHJlZHJpdmVyX3RleHRzKTsKKwkJCXR3bDQwMzBfcHJlZHJpdmVyX3RleHRzLAorCQkJdHdsNDAzMF9wcmVkcml2ZXJfdmFsdWVzKTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHR3bDQwMzBfZGFwbV9wcmVkcml2ZXJfY29udHJvbCA9Ci1TT0NfREFQTV9FTlVNKCJSb3V0ZSIsIHR3bDQwMzBfcHJlZHJpdmVyX2VudW0pOworU09DX0RBUE1fVkFMVUVfRU5VTSgiUm91dGUiLCB0d2w0MDMwX3ByZWRyaXZlcl9lbnVtKTsKIAogLyogSGVhZHNldCBMZWZ0ICovCiBzdGF0aWMgY29uc3QgY2hhciAqdHdsNDAzMF9oc29sX3RleHRzW10gPQpAQCAtMjk4LDI4ICszMTAsOTAgQEAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB0d2w0MDMwX2RhcG1faGFuZHNmcmVlcl9jb250cm9sID0KIFNPQ19EQVBNX0VOVU0oIlJvdXRlIiwgdHdsNDAzMF9oYW5kc2ZyZWVyX2VudW0pOwogCi1zdGF0aWMgaW50IG91dG1peGVyX2V2ZW50KHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAorLyogTGVmdCBhbmFsb2cgbWljcm9waG9uZSBzZWxlY3Rpb24gKi8KK3N0YXRpYyBjb25zdCBjaGFyICp0d2w0MDMwX2FuYWxvZ2xtaWNfdGV4dHNbXSA9CisJCXsiT2ZmIiwgIk1haW4gbWljIiwgIkhlYWRzZXQgbWljIiwgIkFVWEwiLCAiQ2Fya2l0IG1pYyJ9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHR3bDQwMzBfYW5hbG9nbG1pY192YWx1ZXNbXSA9CisJCXsweDAsIDB4MSwgMHgyLCAweDQsIDB4OH07CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX3ZhbHVlX2VudW0gdHdsNDAzMF9hbmFsb2dsbWljX2VudW0gPQorCVNPQ19WQUxVRV9FTlVNX1NJTkdMRShUV0w0MDMwX1JFR19BTkFNSUNMLCAwLCAweGYsCisJCQlBUlJBWV9TSVpFKHR3bDQwMzBfYW5hbG9nbG1pY190ZXh0cyksCisJCQl0d2w0MDMwX2FuYWxvZ2xtaWNfdGV4dHMsCisJCQl0d2w0MDMwX2FuYWxvZ2xtaWNfdmFsdWVzKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHR3bDQwMzBfZGFwbV9hbmFsb2dsbWljX2NvbnRyb2wgPQorU09DX0RBUE1fVkFMVUVfRU5VTSgiUm91dGUiLCB0d2w0MDMwX2FuYWxvZ2xtaWNfZW51bSk7CisKKy8qIFJpZ2h0IGFuYWxvZyBtaWNyb3Bob25lIHNlbGVjdGlvbiAqLworc3RhdGljIGNvbnN0IGNoYXIgKnR3bDQwMzBfYW5hbG9ncm1pY190ZXh0c1tdID0KKwkJeyJPZmYiLCAiU3ViIG1pYyIsICJBVVhSIn07CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgdHdsNDAzMF9hbmFsb2dybWljX3ZhbHVlc1tdID0KKwkJezB4MCwgMHgxLCAweDR9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY192YWx1ZV9lbnVtIHR3bDQwMzBfYW5hbG9ncm1pY19lbnVtID0KKwlTT0NfVkFMVUVfRU5VTV9TSU5HTEUoVFdMNDAzMF9SRUdfQU5BTUlDUiwgMCwgMHg1LAorCQkJQVJSQVlfU0laRSh0d2w0MDMwX2FuYWxvZ3JtaWNfdGV4dHMpLAorCQkJdHdsNDAzMF9hbmFsb2dybWljX3RleHRzLAorCQkJdHdsNDAzMF9hbmFsb2dybWljX3ZhbHVlcyk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB0d2w0MDMwX2RhcG1fYW5hbG9ncm1pY19jb250cm9sID0KK1NPQ19EQVBNX1ZBTFVFX0VOVU0oIlJvdXRlIiwgdHdsNDAzMF9hbmFsb2dybWljX2VudW0pOworCisvKiBUWDEgTC9SIEFuYWxvZy9EaWdpdGFsIG1pY3JvcGhvbmUgc2VsZWN0aW9uICovCitzdGF0aWMgY29uc3QgY2hhciAqdHdsNDAzMF9taWNwYXRodHgxX3RleHRzW10gPQorCQl7IkFuYWxvZyIsICJEaWdpbWljMCJ9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHR3bDQwMzBfbWljcGF0aHR4MV9lbnVtID0KKwlTT0NfRU5VTV9TSU5HTEUoVFdMNDAzMF9SRUdfQURDTUlDU0VMLCAwLAorCQkJQVJSQVlfU0laRSh0d2w0MDMwX21pY3BhdGh0eDFfdGV4dHMpLAorCQkJdHdsNDAzMF9taWNwYXRodHgxX3RleHRzKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHR3bDQwMzBfZGFwbV9taWNwYXRodHgxX2NvbnRyb2wgPQorU09DX0RBUE1fRU5VTSgiUm91dGUiLCB0d2w0MDMwX21pY3BhdGh0eDFfZW51bSk7CisKKy8qIFRYMiBML1IgQW5hbG9nL0RpZ2l0YWwgbWljcm9waG9uZSBzZWxlY3Rpb24gKi8KK3N0YXRpYyBjb25zdCBjaGFyICp0d2w0MDMwX21pY3BhdGh0eDJfdGV4dHNbXSA9CisJCXsiQW5hbG9nIiwgIkRpZ2ltaWMxIn07CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gdHdsNDAzMF9taWNwYXRodHgyX2VudW0gPQorCVNPQ19FTlVNX1NJTkdMRShUV0w0MDMwX1JFR19BRENNSUNTRUwsIDIsCisJCQlBUlJBWV9TSVpFKHR3bDQwMzBfbWljcGF0aHR4Ml90ZXh0cyksCisJCQl0d2w0MDMwX21pY3BhdGh0eDJfdGV4dHMpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdHdsNDAzMF9kYXBtX21pY3BhdGh0eDJfY29udHJvbCA9CitTT0NfREFQTV9FTlVNKCJSb3V0ZSIsIHR3bDQwMzBfbWljcGF0aHR4Ml9lbnVtKTsKKworc3RhdGljIGludCBtaWNwYXRoX2V2ZW50KHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAogCXN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLCBpbnQgZXZlbnQpCiB7Ci0Jc3RydWN0IHNvY19lbnVtICplID0gKHN0cnVjdCBzb2NfZW51bSAqKWtjb250cm9sLT5wcml2YXRlX3ZhbHVlOwotCWludCByZXQgPSAwOwotCWludCB2YWw7CisJc3RydWN0IHNvY19lbnVtICplID0gKHN0cnVjdCBzb2NfZW51bSAqKXctPmtjb250cm9scy0+cHJpdmF0ZV92YWx1ZTsKKwl1bnNpZ25lZCBjaGFyIGFkY21pY3NlbCwgbWljYmlhc19jdGw7CiAKLQlzd2l0Y2ggKGUtPnJlZykgewotCWNhc2UgVFdMNDAzMF9SRUdfUFJFRExfQ1RMOgotCWNhc2UgVFdMNDAzMF9SRUdfUFJFRFJfQ1RMOgotCWNhc2UgVFdMNDAzMF9SRUdfRUFSX0NUTDoKLQkJdmFsID0gdy0+dmFsdWUgPj4gZS0+c2hpZnRfbDsKLQkJaWYgKHZhbCA9PSAzKSB7Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HCi0JCQkiSW52YWxpZCBNVVggc2V0dGluZyBmb3IgcmVnaXN0ZXIgMHglMDJ4ICglZClcbiIsCi0JCQkgICAgICBlLT5yZWcsIHZhbCk7Ci0JCQlyZXQgPSAtMTsKLQkJfQotCQlicmVhazsKKwlhZGNtaWNzZWwgPSB0d2w0MDMwX3JlYWRfcmVnX2NhY2hlKHctPmNvZGVjLCBUV0w0MDMwX1JFR19BRENNSUNTRUwpOworCW1pY2JpYXNfY3RsID0gdHdsNDAzMF9yZWFkX3JlZ19jYWNoZSh3LT5jb2RlYywgVFdMNDAzMF9SRUdfTUlDQklBU19DVEwpOworCS8qIFByZXBhcmUgdGhlIGJpdHMgZm9yIHRoZSBnaXZlbiBUWCBwYXRoOgorCSAqIHNoaWZ0X2wgPT0gMDogVFgxIG1pY3JvcGhvbmUgcGF0aAorCSAqIHNoaWZ0X2wgPT0gMjogVFgyIG1pY3JvcGhvbmUgcGF0aCAqLworCWlmIChlLT5zaGlmdF9sKSB7CisJCS8qIFRYMiBtaWNyb3Bob25lIHBhdGggKi8KKwkJaWYgKGFkY21pY3NlbCAmIFRXTDQwMzBfVFgySU5fU0VMKQorCQkJbWljYmlhc19jdGwgfD0gVFdMNDAzMF9NSUNCSUFTMl9DVEw7IC8qIGRpZ2ltaWMgKi8KKwkJZWxzZQorCQkJbWljYmlhc19jdGwgJj0gflRXTDQwMzBfTUlDQklBUzJfQ1RMOworCX0gZWxzZSB7CisJCS8qIFRYMSBtaWNyb3Bob25lIHBhdGggKi8KKwkJaWYgKGFkY21pY3NlbCAmIFRXTDQwMzBfVFgxSU5fU0VMKQorCQkJbWljYmlhc19jdGwgfD0gVFdMNDAzMF9NSUNCSUFTMV9DVEw7IC8qIGRpZ2ltaWMgKi8KKwkJZWxzZQorCQkJbWljYmlhc19jdGwgJj0gflRXTDQwMzBfTUlDQklBUzFfQ1RMOwogCX0KIAotCXJldHVybiByZXQ7CisJdHdsNDAzMF93cml0ZSh3LT5jb2RlYywgVFdMNDAzMF9SRUdfTUlDQklBU19DVEwsIG1pY2JpYXNfY3RsKTsKKworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IGhhbmRzZnJlZV9ldmVudChzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywKQEAgLTUwMywxNjIgKzU3Nyw2IEBACiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIGludCB0d2w0MDMwX2dldF9sZWZ0X2lucHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGtjb250cm9sLT5wcml2YXRlX2RhdGE7Ci0JdTggcmVnID0gdHdsNDAzMF9yZWFkX3JlZ19jYWNoZShjb2RlYywgVFdMNDAzMF9SRUdfQU5BTUlDTCk7Ci0JaW50IHJlc3VsdCA9IDA7Ci0KLQkvKiBvbmUgYml0IG11c3QgYmUgc2V0IGEgdGltZSAqLwotCXJlZyAmPSBUV0w0MDMwX0NLTUlDX0VOIHwgVFdMNDAzMF9BVVhMX0VOIHwgVFdMNDAzMF9IU01JQ19FTgotCQkJfCBUV0w0MDMwX01BSU5NSUNfRU47Ci0JaWYgKHJlZyAhPSAwKSB7Ci0JCXJlc3VsdCsrOwotCQl3aGlsZSAoKHJlZyAmIDEpID09IDApIHsKLQkJCXJlc3VsdCsrOwotCQkJcmVnID4+PSAxOwotCQl9Ci0JfQotCi0JdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSByZXN1bHQ7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdHdsNDAzMF9wdXRfbGVmdF9pbnB1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBrY29udHJvbC0+cHJpdmF0ZV9kYXRhOwotCWludCB2YWx1ZSA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOwotCXU4IGFuYW1pY2wsIG1pY2JpYXMsIGF2YWRjX2N0bDsKLQotCWFuYW1pY2wgPSB0d2w0MDMwX3JlYWRfcmVnX2NhY2hlKGNvZGVjLCBUV0w0MDMwX1JFR19BTkFNSUNMKTsKLQlhbmFtaWNsICY9IH4oVFdMNDAzMF9DS01JQ19FTiB8IFRXTDQwMzBfQVVYTF9FTiB8IFRXTDQwMzBfSFNNSUNfRU4KLQkJCXwgVFdMNDAzMF9NQUlOTUlDX0VOKTsKLQltaWNiaWFzID0gdHdsNDAzMF9yZWFkX3JlZ19jYWNoZShjb2RlYywgVFdMNDAzMF9SRUdfTUlDQklBU19DVEwpOwotCW1pY2JpYXMgJj0gfihUV0w0MDMwX0hTTUlDQklBU19FTiB8IFRXTDQwMzBfTUlDQklBUzFfRU4pOwotCWF2YWRjX2N0bCA9IHR3bDQwMzBfcmVhZF9yZWdfY2FjaGUoY29kZWMsIFRXTDQwMzBfUkVHX0FWQURDX0NUTCk7Ci0KLQlzd2l0Y2ggKHZhbHVlKSB7Ci0JY2FzZSAxOgotCQlhbmFtaWNsIHw9IFRXTDQwMzBfTUFJTk1JQ19FTjsKLQkJbWljYmlhcyB8PSBUV0w0MDMwX01JQ0JJQVMxX0VOOwotCQlicmVhazsKLQljYXNlIDI6Ci0JCWFuYW1pY2wgfD0gVFdMNDAzMF9IU01JQ19FTjsKLQkJbWljYmlhcyB8PSBUV0w0MDMwX0hTTUlDQklBU19FTjsKLQkJYnJlYWs7Ci0JY2FzZSAzOgotCQlhbmFtaWNsIHw9IFRXTDQwMzBfQVVYTF9FTjsKLQkJYnJlYWs7Ci0JY2FzZSA0OgotCQlhbmFtaWNsIHw9IFRXTDQwMzBfQ0tNSUNfRU47Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KLQotCS8qIElmIHNvbWUgaW5wdXQgaXMgc2VsZWN0ZWQsIGVuYWJsZSBhbXAgYW5kIEFEQyAqLwotCWlmICh2YWx1ZSAhPSAwKSB7Ci0JCWFuYW1pY2wgfD0gVFdMNDAzMF9NSUNBTVBMX0VOOwotCQlhdmFkY19jdGwgfD0gVFdMNDAzMF9BRENMX0VOOwotCX0gZWxzZSB7Ci0JCWFuYW1pY2wgJj0gflRXTDQwMzBfTUlDQU1QTF9FTjsKLQkJYXZhZGNfY3RsICY9IH5UV0w0MDMwX0FEQ0xfRU47Ci0JfQotCi0JdHdsNDAzMF93cml0ZShjb2RlYywgVFdMNDAzMF9SRUdfQU5BTUlDTCwgYW5hbWljbCk7Ci0JdHdsNDAzMF93cml0ZShjb2RlYywgVFdMNDAzMF9SRUdfTUlDQklBU19DVEwsIG1pY2JpYXMpOwotCXR3bDQwMzBfd3JpdGUoY29kZWMsIFRXTDQwMzBfUkVHX0FWQURDX0NUTCwgYXZhZGNfY3RsKTsKLQotCXJldHVybiAxOwotfQotCi1zdGF0aWMgaW50IHR3bDQwMzBfZ2V0X3JpZ2h0X2lucHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGtjb250cm9sLT5wcml2YXRlX2RhdGE7Ci0JdTggcmVnID0gdHdsNDAzMF9yZWFkX3JlZ19jYWNoZShjb2RlYywgVFdMNDAzMF9SRUdfQU5BTUlDUik7Ci0JaW50IHZhbHVlID0gMDsKLQotCXJlZyAmPSBUV0w0MDMwX1NVQk1JQ19FTnxUV0w0MDMwX0FVWFJfRU47Ci0Jc3dpdGNoIChyZWcpIHsKLQljYXNlIFRXTDQwMzBfU1VCTUlDX0VOOgotCQl2YWx1ZSA9IDE7Ci0JCWJyZWFrOwotCWNhc2UgVFdMNDAzMF9BVVhSX0VOOgotCQl2YWx1ZSA9IDI7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KLQotCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gdmFsdWU7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdHdsNDAzMF9wdXRfcmlnaHRfaW5wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0Jc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0ga2NvbnRyb2wtPnByaXZhdGVfZGF0YTsKLQlpbnQgdmFsdWUgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKLQl1OCBhbmFtaWNyLCBtaWNiaWFzLCBhdmFkY19jdGw7Ci0KLQlhbmFtaWNyID0gdHdsNDAzMF9yZWFkX3JlZ19jYWNoZShjb2RlYywgVFdMNDAzMF9SRUdfQU5BTUlDUik7Ci0JYW5hbWljciAmPSB+KFRXTDQwMzBfU1VCTUlDX0VOfFRXTDQwMzBfQVVYUl9FTik7Ci0JbWljYmlhcyA9IHR3bDQwMzBfcmVhZF9yZWdfY2FjaGUoY29kZWMsIFRXTDQwMzBfUkVHX01JQ0JJQVNfQ1RMKTsKLQltaWNiaWFzICY9IH5UV0w0MDMwX01JQ0JJQVMyX0VOOwotCWF2YWRjX2N0bCA9IHR3bDQwMzBfcmVhZF9yZWdfY2FjaGUoY29kZWMsIFRXTDQwMzBfUkVHX0FWQURDX0NUTCk7Ci0KLQlzd2l0Y2ggKHZhbHVlKSB7Ci0JY2FzZSAxOgotCQlhbmFtaWNyIHw9IFRXTDQwMzBfU1VCTUlDX0VOOwotCQltaWNiaWFzIHw9IFRXTDQwMzBfTUlDQklBUzJfRU47Ci0JCWJyZWFrOwotCWNhc2UgMjoKLQkJYW5hbWljciB8PSBUV0w0MDMwX0FVWFJfRU47Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KLQotCWlmICh2YWx1ZSAhPSAwKSB7Ci0JCWFuYW1pY3IgfD0gVFdMNDAzMF9NSUNBTVBSX0VOOwotCQlhdmFkY19jdGwgfD0gVFdMNDAzMF9BRENSX0VOOwotCX0gZWxzZSB7Ci0JCWFuYW1pY3IgJj0gflRXTDQwMzBfTUlDQU1QUl9FTjsKLQkJYXZhZGNfY3RsICY9IH5UV0w0MDMwX0FEQ1JfRU47Ci0JfQotCi0JdHdsNDAzMF93cml0ZShjb2RlYywgVFdMNDAzMF9SRUdfQU5BTUlDUiwgYW5hbWljcik7Ci0JdHdsNDAzMF93cml0ZShjb2RlYywgVFdMNDAzMF9SRUdfTUlDQklBU19DVEwsIG1pY2JpYXMpOwotCXR3bDQwMzBfd3JpdGUoY29kZWMsIFRXTDQwMzBfUkVHX0FWQURDX0NUTCwgYXZhZGNfY3RsKTsKLQotCXJldHVybiAxOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqdHdsNDAzMF9sZWZ0X2luX3NlbFtdID0gewotCSJOb25lIiwKLQkiTWFpbiBNaWMiLAotCSJIZWFkc2V0IE1pYyIsCi0JIkxpbmUgSW4iLAotCSJDYXJraXQgTWljIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICp0d2w0MDMwX3JpZ2h0X2luX3NlbFtdID0gewotCSJOb25lIiwKLQkiU3ViIE1pYyIsCi0JIkxpbmUgSW4iLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSB0d2w0MDMwX2xlZnRfaW5wdXRfbXV4ID0KLQlTT0NfRU5VTV9TSU5HTEVfRVhUKEFSUkFZX1NJWkUodHdsNDAzMF9sZWZ0X2luX3NlbCksCi0JCXR3bDQwMzBfbGVmdF9pbl9zZWwpOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHR3bDQwMzBfcmlnaHRfaW5wdXRfbXV4ID0KLQlTT0NfRU5VTV9TSU5HTEVfRVhUKEFSUkFZX1NJWkUodHdsNDAzMF9yaWdodF9pbl9zZWwpLAotCQl0d2w0MDMwX3JpZ2h0X2luX3NlbCk7Ci0KIC8qCiAgKiBGR0FJTiB2b2x1bWUgY29udHJvbDoKICAqIGZyb20gLTYyIHRvIDAgZEIgaW4gMSBkQiBzdGVwcyAobXV0ZSBpbnN0ZWFkIG9mIC02MyBkQikKQEAgLTc0MSwxOCArNjU5LDE1IEBACiAJCVRXTDQwMzBfUkVHX0VBUl9DVEwsIDQsIDMsIDAsIG91dHB1dF90dmwpLAogCiAJLyogQ29tbW9uIGNhcHR1cmUgZ2FpbiBjb250cm9scyAqLwotCVNPQ19ET1VCTEVfUl9UTFYoIkNhcHR1cmUgVm9sdW1lIiwKKwlTT0NfRE9VQkxFX1JfVExWKCJUWDEgRGlnaXRhbCBDYXB0dXJlIFZvbHVtZSIsCiAJCVRXTDQwMzBfUkVHX0FUWEwxUEdBLCBUV0w0MDMwX1JFR19BVFhSMVBHQSwKIAkJMCwgMHgxZiwgMCwgZGlnaXRhbF9jYXB0dXJlX3RsdiksCisJU09DX0RPVUJMRV9SX1RMVigiVFgyIERpZ2l0YWwgQ2FwdHVyZSBWb2x1bWUiLAorCQlUV0w0MDMwX1JFR19BVlRYTDJQR0EsIFRXTDQwMzBfUkVHX0FWVFhSMlBHQSwKKwkJMCwgMHgxZiwgMCwgZGlnaXRhbF9jYXB0dXJlX3RsdiksCiAKLQlTT0NfRE9VQkxFX1RMVigiSW5wdXQgQm9vc3QgVm9sdW1lIiwgVFdMNDAzMF9SRUdfQU5BTUlDX0dBSU4sCisJU09DX0RPVUJMRV9UTFYoIkFuYWxvZyBDYXB0dXJlIFZvbHVtZSIsIFRXTDQwMzBfUkVHX0FOQU1JQ19HQUlOLAogCQkwLCAzLCA1LCAwLCBpbnB1dF9nYWluX3RsdiksCi0KLQkvKiBJbnB1dCBzb3VyY2UgY29udHJvbHMgKi8KLQlTT0NfRU5VTV9FWFQoIkxlZnQgSW5wdXQgU291cmNlIiwgdHdsNDAzMF9sZWZ0X2lucHV0X211eCwKLQkJdHdsNDAzMF9nZXRfbGVmdF9pbnB1dCwgdHdsNDAzMF9wdXRfbGVmdF9pbnB1dCksCi0JU09DX0VOVU1fRVhUKCJSaWdodCBJbnB1dCBTb3VyY2UiLCB0d2w0MDMwX3JpZ2h0X2lucHV0X211eCwKLQkJdHdsNDAzMF9nZXRfcmlnaHRfaW5wdXQsIHR3bDQwMzBfcHV0X3JpZ2h0X2lucHV0KSwKIH07CiAKIC8qIGFkZCBub24gZGFwbSBjb250cm9scyAqLwpAQCAtNzcyLDkgKzY4NywxOSBAQAogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgdHdsNDAzMF9kYXBtX3dpZGdldHNbXSA9IHsKLQlTTkRfU09DX0RBUE1fSU5QVVQoIklOTCIpLAotCVNORF9TT0NfREFQTV9JTlBVVCgiSU5SIiksCisJLyogTGVmdCBjaGFubmVsIGlucHV0cyAqLworCVNORF9TT0NfREFQTV9JTlBVVCgiTUFJTk1JQyIpLAorCVNORF9TT0NfREFQTV9JTlBVVCgiSFNNSUMiKSwKKwlTTkRfU09DX0RBUE1fSU5QVVQoIkFVWEwiKSwKKwlTTkRfU09DX0RBUE1fSU5QVVQoIkNBUktJVE1JQyIpLAorCS8qIFJpZ2h0IGNoYW5uZWwgaW5wdXRzICovCisJU05EX1NPQ19EQVBNX0lOUFVUKCJTVUJNSUMiKSwKKwlTTkRfU09DX0RBUE1fSU5QVVQoIkFVWFIiKSwKKwkvKiBEaWdpdGFsIG1pY3JvcGhvbmVzIChTdGVyZW8pICovCisJU05EX1NPQ19EQVBNX0lOUFVUKCJESUdJTUlDMCIpLAorCVNORF9TT0NfREFQTV9JTlBVVCgiRElHSU1JQzEiKSwKIAorCS8qIE91dHB1dHMgKi8KIAlTTkRfU09DX0RBUE1fT1VUUFVUKCJPVVRMIiksCiAJU05EX1NPQ19EQVBNX09VVFBVVCgiT1VUUiIpLAogCVNORF9TT0NfREFQTV9PVVRQVVQoIkVBUlBJRUNFIiksCkBAIC04MDksMTYgKzczNCwxMyBAQAogCiAJLyogT3V0cHV0IE1VWCBjb250cm9scyAqLwogCS8qIEVhcnBpZWNlICovCi0JU05EX1NPQ19EQVBNX01VWF9FKCJFYXJwaWVjZSBNdXgiLCBTTkRfU09DX05PUE0sIDAsIDAsCi0JCSZ0d2w0MDMwX2RhcG1fZWFycGllY2VfY29udHJvbCwgb3V0bWl4ZXJfZXZlbnQsCi0JCVNORF9TT0NfREFQTV9QUkVfUkVHKSwKKwlTTkRfU09DX0RBUE1fVkFMVUVfTVVYKCJFYXJwaWVjZSBNdXgiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCSZ0d2w0MDMwX2RhcG1fZWFycGllY2VfY29udHJvbCksCiAJLyogUHJlRHJpdkwvUiAqLwotCVNORF9TT0NfREFQTV9NVVhfRSgiUHJlZHJpdmVMIE11eCIsIFNORF9TT0NfTk9QTSwgMCwgMCwKLQkJJnR3bDQwMzBfZGFwbV9wcmVkcml2ZWxfY29udHJvbCwgb3V0bWl4ZXJfZXZlbnQsCi0JCVNORF9TT0NfREFQTV9QUkVfUkVHKSwKLQlTTkRfU09DX0RBUE1fTVVYX0UoIlByZWRyaXZlUiBNdXgiLCBTTkRfU09DX05PUE0sIDAsIDAsCi0JCSZ0d2w0MDMwX2RhcG1fcHJlZHJpdmVyX2NvbnRyb2wsIG91dG1peGVyX2V2ZW50LAotCQlTTkRfU09DX0RBUE1fUFJFX1JFRyksCisJU05EX1NPQ19EQVBNX1ZBTFVFX01VWCgiUHJlZHJpdmVMIE11eCIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJJnR3bDQwMzBfZGFwbV9wcmVkcml2ZWxfY29udHJvbCksCisJU05EX1NPQ19EQVBNX1ZBTFVFX01VWCgiUHJlZHJpdmVSIE11eCIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJJnR3bDQwMzBfZGFwbV9wcmVkcml2ZXJfY29udHJvbCksCiAJLyogSGVhZHNldEwvUiAqLwogCVNORF9TT0NfREFQTV9NVVgoIkhlYWRzZXRMIE11eCIsIFNORF9TT0NfTk9QTSwgMCwgMCwKIAkJJnR3bDQwMzBfZGFwbV9oc29sX2NvbnRyb2wpLApAQCAtODM3LDggKzc1OSw0OCBAQAogCQkmdHdsNDAzMF9kYXBtX2hhbmRzZnJlZXJfY29udHJvbCwgaGFuZHNmcmVlX2V2ZW50LAogCQlTTkRfU09DX0RBUE1fUE9TVF9QTVV8U05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKIAotCVNORF9TT0NfREFQTV9BREMoIkFEQ0wiLCAiTGVmdCBDYXB0dXJlIiwgU05EX1NPQ19OT1BNLCAwLCAwKSwKLQlTTkRfU09DX0RBUE1fQURDKCJBRENSIiwgIlJpZ2h0IENhcHR1cmUiLCBTTkRfU09DX05PUE0sIDAsIDApLAorCS8qIEludHJvZHVjaW5nIGZvdXIgdmlydHVhbCBBREMsIHNpbmNlIFRXTDQwMzAgaGF2ZSBmb3VyIGNoYW5uZWwgZm9yCisJICAgY2FwdHVyZSAqLworCVNORF9TT0NfREFQTV9BREMoIkFEQyBWaXJ0dWFsIExlZnQxIiwgIkxlZnQgRnJvbnQgQ2FwdHVyZSIsCisJCVNORF9TT0NfTk9QTSwgMCwgMCksCisJU05EX1NPQ19EQVBNX0FEQygiQURDIFZpcnR1YWwgUmlnaHQxIiwgIlJpZ2h0IEZyb250IENhcHR1cmUiLAorCQlTTkRfU09DX05PUE0sIDAsIDApLAorCVNORF9TT0NfREFQTV9BREMoIkFEQyBWaXJ0dWFsIExlZnQyIiwgIkxlZnQgUmVhciBDYXB0dXJlIiwKKwkJU05EX1NPQ19OT1BNLCAwLCAwKSwKKwlTTkRfU09DX0RBUE1fQURDKCJBREMgVmlydHVhbCBSaWdodDIiLCAiUmlnaHQgUmVhciBDYXB0dXJlIiwKKwkJU05EX1NPQ19OT1BNLCAwLCAwKSwKKworCS8qIEFuYWxvZy9EaWdpdGFsIG1pYyBwYXRoIHNlbGVjdGlvbi4KKwkgICBUWDEgTGVmdC9SaWdodDogZWl0aGVyIGFuYWxvZyBMZWZ0L1JpZ2h0IG9yIERpZ2ltaWMwCisJICAgVFgyIExlZnQvUmlnaHQ6IGVpdGhlciBhbmFsb2cgTGVmdC9SaWdodCBvciBEaWdpbWljMSAqLworCVNORF9TT0NfREFQTV9NVVhfRSgiVFgxIENhcHR1cmUgUm91dGUiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCSZ0d2w0MDMwX2RhcG1fbWljcGF0aHR4MV9jb250cm9sLCBtaWNwYXRoX2V2ZW50LAorCQlTTkRfU09DX0RBUE1fUE9TVF9QTVV8U05EX1NPQ19EQVBNX1BPU1RfUE1EfAorCQlTTkRfU09DX0RBUE1fUE9TVF9SRUcpLAorCVNORF9TT0NfREFQTV9NVVhfRSgiVFgyIENhcHR1cmUgUm91dGUiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCSZ0d2w0MDMwX2RhcG1fbWljcGF0aHR4Ml9jb250cm9sLCBtaWNwYXRoX2V2ZW50LAorCQlTTkRfU09DX0RBUE1fUE9TVF9QTVV8U05EX1NPQ19EQVBNX1BPU1RfUE1EfAorCQlTTkRfU09DX0RBUE1fUE9TVF9SRUcpLAorCisJLyogQW5hbG9nIGlucHV0IG11eGVzIHdpdGggcG93ZXIgc3dpdGNoIGZvciB0aGUgcGh5c2ljYWwgQURDTC9SICovCisJU05EX1NPQ19EQVBNX1ZBTFVFX01VWCgiQW5hbG9nIExlZnQgQ2FwdHVyZSBSb3V0ZSIsCisJCVRXTDQwMzBfUkVHX0FWQURDX0NUTCwgMywgMCwgJnR3bDQwMzBfZGFwbV9hbmFsb2dsbWljX2NvbnRyb2wpLAorCVNORF9TT0NfREFQTV9WQUxVRV9NVVgoIkFuYWxvZyBSaWdodCBDYXB0dXJlIFJvdXRlIiwKKwkJVFdMNDAzMF9SRUdfQVZBRENfQ1RMLCAxLCAwLCAmdHdsNDAzMF9kYXBtX2FuYWxvZ3JtaWNfY29udHJvbCksCisKKwlTTkRfU09DX0RBUE1fUEdBKCJBbmFsb2cgTGVmdCBBbXBsaWZpZXIiLAorCQlUV0w0MDMwX1JFR19BTkFNSUNMLCA0LCAwLCBOVUxMLCAwKSwKKwlTTkRfU09DX0RBUE1fUEdBKCJBbmFsb2cgUmlnaHQgQW1wbGlmaWVyIiwKKwkJVFdMNDAzMF9SRUdfQU5BTUlDUiwgNCwgMCwgTlVMTCwgMCksCisKKwlTTkRfU09DX0RBUE1fUEdBKCJEaWdpbWljMCBFbmFibGUiLAorCQlUV0w0MDMwX1JFR19BRENNSUNTRUwsIDEsIDAsIE5VTEwsIDApLAorCVNORF9TT0NfREFQTV9QR0EoIkRpZ2ltaWMxIEVuYWJsZSIsCisJCVRXTDQwMzBfUkVHX0FEQ01JQ1NFTCwgMywgMCwgTlVMTCwgMCksCisKKwlTTkRfU09DX0RBUE1fTUlDQklBUygiTWljIEJpYXMgMSIsIFRXTDQwMzBfUkVHX01JQ0JJQVNfQ1RMLCAwLCAwKSwKKwlTTkRfU09DX0RBUE1fTUlDQklBUygiTWljIEJpYXMgMiIsIFRXTDQwMzBfUkVHX01JQ0JJQVNfQ1RMLCAxLCAwKSwKKwlTTkRfU09DX0RBUE1fTUlDQklBUygiSGVhZHNldCBNaWMgQmlhcyIsIFRXTDQwMzBfUkVHX01JQ0JJQVNfQ1RMLCAyLCAwKSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3JvdXRlIGludGVyY29uW10gPSB7CkBAIC04OTQsOSArODU2LDM5IEBACiAJeyJIRkwiLCBOVUxMLCAiSGFuZHNmcmVlTCBNdXgifSwKIAl7IkhGUiIsIE5VTEwsICJIYW5kc2ZyZWVSIE11eCJ9LAogCi0JLyogaW5wdXRzICovCi0JeyJBRENMIiwgTlVMTCwgIklOTCJ9LAotCXsiQURDUiIsIE5VTEwsICJJTlIifSwKKwkvKiBDYXB0dXJlIHBhdGggKi8KKwl7IkFuYWxvZyBMZWZ0IENhcHR1cmUgUm91dGUiLCAiTWFpbiBtaWMiLCAiTUFJTk1JQyJ9LAorCXsiQW5hbG9nIExlZnQgQ2FwdHVyZSBSb3V0ZSIsICJIZWFkc2V0IG1pYyIsICJIU01JQyJ9LAorCXsiQW5hbG9nIExlZnQgQ2FwdHVyZSBSb3V0ZSIsICJBVVhMIiwgIkFVWEwifSwKKwl7IkFuYWxvZyBMZWZ0IENhcHR1cmUgUm91dGUiLCAiQ2Fya2l0IG1pYyIsICJDQVJLSVRNSUMifSwKKworCXsiQW5hbG9nIFJpZ2h0IENhcHR1cmUgUm91dGUiLCAiU3ViIG1pYyIsICJTVUJNSUMifSwKKwl7IkFuYWxvZyBSaWdodCBDYXB0dXJlIFJvdXRlIiwgIkFVWFIiLCAiQVVYUiJ9LAorCisJeyJBbmFsb2cgTGVmdCBBbXBsaWZpZXIiLCBOVUxMLCAiQW5hbG9nIExlZnQgQ2FwdHVyZSBSb3V0ZSJ9LAorCXsiQW5hbG9nIFJpZ2h0IEFtcGxpZmllciIsIE5VTEwsICJBbmFsb2cgUmlnaHQgQ2FwdHVyZSBSb3V0ZSJ9LAorCisJeyJEaWdpbWljMCBFbmFibGUiLCBOVUxMLCAiRElHSU1JQzAifSwKKwl7IkRpZ2ltaWMxIEVuYWJsZSIsIE5VTEwsICJESUdJTUlDMSJ9LAorCisJLyogVFgxIExlZnQgY2FwdHVyZSBwYXRoICovCisJeyJUWDEgQ2FwdHVyZSBSb3V0ZSIsICJBbmFsb2ciLCAiQW5hbG9nIExlZnQgQW1wbGlmaWVyIn0sCisJeyJUWDEgQ2FwdHVyZSBSb3V0ZSIsICJEaWdpbWljMCIsICJEaWdpbWljMCBFbmFibGUifSwKKwkvKiBUWDEgUmlnaHQgY2FwdHVyZSBwYXRoICovCisJeyJUWDEgQ2FwdHVyZSBSb3V0ZSIsICJBbmFsb2ciLCAiQW5hbG9nIFJpZ2h0IEFtcGxpZmllciJ9LAorCXsiVFgxIENhcHR1cmUgUm91dGUiLCAiRGlnaW1pYzAiLCAiRGlnaW1pYzAgRW5hYmxlIn0sCisJLyogVFgyIExlZnQgY2FwdHVyZSBwYXRoICovCisJeyJUWDIgQ2FwdHVyZSBSb3V0ZSIsICJBbmFsb2ciLCAiQW5hbG9nIExlZnQgQW1wbGlmaWVyIn0sCisJeyJUWDIgQ2FwdHVyZSBSb3V0ZSIsICJEaWdpbWljMSIsICJEaWdpbWljMSBFbmFibGUifSwKKwkvKiBUWDIgUmlnaHQgY2FwdHVyZSBwYXRoICovCisJeyJUWDIgQ2FwdHVyZSBSb3V0ZSIsICJBbmFsb2ciLCAiQW5hbG9nIFJpZ2h0IEFtcGxpZmllciJ9LAorCXsiVFgyIENhcHR1cmUgUm91dGUiLCAiRGlnaW1pYzEiLCAiRGlnaW1pYzEgRW5hYmxlIn0sCisKKwl7IkFEQyBWaXJ0dWFsIExlZnQxIiwgTlVMTCwgIlRYMSBDYXB0dXJlIFJvdXRlIn0sCisJeyJBREMgVmlydHVhbCBSaWdodDEiLCBOVUxMLCAiVFgxIENhcHR1cmUgUm91dGUifSwKKwl7IkFEQyBWaXJ0dWFsIExlZnQyIiwgTlVMTCwgIlRYMiBDYXB0dXJlIFJvdXRlIn0sCisJeyJBREMgVmlydHVhbCBSaWdodDIiLCBOVUxMLCAiVFgyIENhcHR1cmUgUm91dGUifSwKKwogfTsKIAogc3RhdGljIGludCB0d2w0MDMwX2FkZF93aWRnZXRzKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKQEAgLTkyMyw2ICs5MTUsNyBAQAogCXR3bDQwMzBfd3JpdGUoY29kZWMsIFRXTDQwMzBfUkVHX0FOQU1JQ0wsCiAJCWFuYW1pY2wgfCBUV0w0MDMwX0NOQ0xfT0ZGU0VUX1NUQVJUKTsKIAorCiAJLyogd2FpdCBmb3Igb2Zmc2V0IGNhbmNlbGxhdGlvbiB0byBjb21wbGV0ZSAqLwogCWRvIHsKIAkJLyogdGhpcyB0YWtlcyBhIGxpdHRsZSB3aGlsZSwgc28gZG9uJ3Qgc2xhbSBpMmMgKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvdHdsNDAzMC5oIGIvc291bmQvc29jL2NvZGVjcy90d2w0MDMwLmgKaW5kZXggNTQ2MTVjNy4uNDQyZTVhOCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy90d2w0MDMwLmgKKysrIGIvc291bmQvc29jL2NvZGVjcy90d2w0MDMwLmgKQEAgLTE0Nyw2ICsxNDcsMTMgQEAKICNkZWZpbmUgVFdMNDAzMF9BVkFEQ19DTEtfUFJJT1JJVFkJMHgwNAogI2RlZmluZSBUV0w0MDMwX0FEQ1JfRU4JCQkweDAyCiAKKy8qIFRXTDQwMzBfUkVHX0FEQ01JQ1NFTCAoMHgwOCkgRmllbGRzICovCisKKyNkZWZpbmUgVFdMNDAzMF9ESUdNSUMxX0VOCQkweDA4CisjZGVmaW5lIFRXTDQwMzBfVFgySU5fU0VMCQkweDA0CisjZGVmaW5lIFRXTDQwMzBfRElHTUlDMF9FTgkJMHgwMgorI2RlZmluZSBUV0w0MDMwX1RYMUlOX1NFTAkJMHgwMQorCiAvKiBBVURJT19JRiAoMHgwRSkgRmllbGRzICovCiAKICNkZWZpbmUgVFdMNDAzMF9BSUZfU0xBVkVfRU4JCTB4ODAKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9kYXZpbmNpL2RhdmluY2ktZXZtLmMgYi9zb3VuZC9zb2MvZGF2aW5jaS9kYXZpbmNpLWV2bS5jCmluZGV4IDAxYjk0OGIuLjU0ODUxZjMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9kYXZpbmNpL2RhdmluY2ktZXZtLmMKKysrIGIvc291bmQvc29jL2RhdmluY2kvZGF2aW5jaS1ldm0uYwpAQCAtMjYsNyArMjYsNiBAQAogI2luY2x1ZGUgImRhdmluY2ktcGNtLmgiCiAjaW5jbHVkZSAiZGF2aW5jaS1pMnMuaCIKIAotI2RlZmluZSBFVk1fQ09ERUNfQ0xPQ0sgMjI1NzkyMDAKIAogI2RlZmluZSBBVURJT19GT1JNQVQgKFNORF9TT0NfREFJRk1UX0RTUF9CIHwgXAogCQlTTkRfU09DX0RBSUZNVF9DQk1fQ0ZNIHwgU05EX1NPQ19EQUlGTVRfSUJfTkYpCkBAIC0zNyw2ICszNiwyMSBAQAogCXN0cnVjdCBzbmRfc29jX2RhaSAqY29kZWNfZGFpID0gcnRkLT5kYWktPmNvZGVjX2RhaTsKIAlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNwdV9kYWkgPSBydGQtPmRhaS0+Y3B1X2RhaTsKIAlpbnQgcmV0ID0gMDsKKwl1bnNpZ25lZCBzeXNjbGs7CisKKwkvKiBBU1AxIG9uIERNMzU1IEVWTSBpcyBjbG9ja2VkIGJ5IGFuIGV4dGVybmFsIG9zY2lsbGF0b3IgKi8KKwlpZiAobWFjaGluZV9pc19kYXZpbmNpX2RtMzU1X2V2bSgpKQorCQlzeXNjbGsgPSAyNzAwMDAwMDsKKworCS8qIEFTUDAgaW4gRE02NDQ2IEVWTSBpcyBjbG9ja2VkIGJ5IFU1NSwgYXMgY29uZmlndXJlZCBieQorCSAqIGJvYXJkLWRtNjQ0eC1ldm0uYyB1c2luZyBHUElPcyBmcm9tIFUxOC4gIFRoZXJlIGFyZSBzaXgKKwkgKiBvcHRpb25zOyBoZXJlIHdlICJrbm93IiB3ZSB1c2UgYSA0OCBLSHogc2FtcGxlIHJhdGUuCisJICovCisJZWxzZSBpZiAobWFjaGluZV9pc19kYXZpbmNpX2V2bSgpKQorCQlzeXNjbGsgPSAxMjI4ODAwMDsKKworCWVsc2UKKwkJcmV0dXJuIC1FSU5WQUw7CiAKIAkvKiBzZXQgY29kZWMgREFJIGNvbmZpZ3VyYXRpb24gKi8KIAlyZXQgPSBzbmRfc29jX2RhaV9zZXRfZm10KGNvZGVjX2RhaSwgQVVESU9fRk9STUFUKTsKQEAgLTQ5LDggKzYzLDcgQEAKIAkJcmV0dXJuIHJldDsKIAogCS8qIHNldCB0aGUgY29kZWMgc3lzdGVtIGNsb2NrICovCi0JcmV0ID0gc25kX3NvY19kYWlfc2V0X3N5c2Nsayhjb2RlY19kYWksIDAsIEVWTV9DT0RFQ19DTE9DSywKLQkJCQkJICAgIFNORF9TT0NfQ0xPQ0tfT1VUKTsKKwlyZXQgPSBzbmRfc29jX2RhaV9zZXRfc3lzY2xrKGNvZGVjX2RhaSwgMCwgc3lzY2xrLCBTTkRfU09DX0NMT0NLX09VVCk7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9kYXZpbmNpL2RhdmluY2ktcGNtLmMgYi9zb3VuZC9zb2MvZGF2aW5jaS9kYXZpbmNpLXBjbS5jCmluZGV4IDc0YWJjOWIuLjM2NjA0OWQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9kYXZpbmNpL2RhdmluY2ktcGNtLmMKKysrIGIvc291bmQvc29jL2RhdmluY2kvZGF2aW5jaS1wY20uYwpAQCAtMjEyLDcgKzIxMiw3IEBACiAJaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spCiAJCWNvdW50ID0gc3JjIC0gcnVudGltZS0+ZG1hX2FkZHI7CiAJZWxzZQotCQljb3VudCA9IGRzdCAtIHJ1bnRpbWUtPmRtYV9hZGRyOzsKKwkJY291bnQgPSBkc3QgLSBydW50aW1lLT5kbWFfYWRkcjsKIAogCXNwaW5fdW5sb2NrKCZwcnRkLT5sb2NrKTsKIApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2RhdmluY2kvZGF2aW5jaS1zZmZzZHIuYyBiL3NvdW5kL3NvYy9kYXZpbmNpL2RhdmluY2ktc2Zmc2RyLmMKaW5kZXggZjY3NTc5ZC4uNDkzNWQxYiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2RhdmluY2kvZGF2aW5jaS1zZmZzZHIuYworKysgYi9zb3VuZC9zb2MvZGF2aW5jaS9kYXZpbmNpLXNmZnNkci5jCkBAIC0yNCw2ICsyNCw3IEBACiAjaW5jbHVkZSA8c291bmQvc29jLWRhcG0uaD4KIAogI2luY2x1ZGUgPGFzbS9kbWEuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9wbGF0LXNmZnNkci9zZmZzZHItZnBnYS5oPgogCiAjaW5jbHVkZSA8bWFjaC9tY2JzcC5oPgpAQCAtMTE1LDYgKzExNiw5IEBACiB7CiAJaW50IHJldDsKIAorCWlmICghbWFjaGluZV9pc19zZmZzZHIoKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKIAlzZmZzZHJfc25kX2RldmljZSA9IHBsYXRmb3JtX2RldmljZV9hbGxvYygic29jLWF1ZGlvIiwgMCk7CiAJaWYgKCFzZmZzZHJfc25kX2RldmljZSkgewogCQlwcmludGsoS0VSTl9FUlIgInBsYXRmb3JtIGRldmljZSBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvb21hcC9LY29uZmlnIGIvc291bmQvc29jL29tYXAvS2NvbmZpZwppbmRleCBhN2IxZDc3Li40ZjdmMDQwIDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvb21hcC9LY29uZmlnCisrKyBiL3NvdW5kL3NvYy9vbWFwL0tjb25maWcKQEAgLTEwLDYgKzEwLDcgQEAKIAl0cmlzdGF0ZSAiU29DIEF1ZGlvIHN1cHBvcnQgZm9yIE5va2lhIE44MTAiCiAJZGVwZW5kcyBvbiBTTkRfT01BUF9TT0MgJiYgTUFDSF9OT0tJQV9OODEwCiAJc2VsZWN0IFNORF9PTUFQX1NPQ19NQ0JTUAorCXNlbGVjdCBPTUFQX01VWAogCXNlbGVjdCBTTkRfU09DX1RMVjMyMEFJQzNYCiAJaGVscAogCSAgU2F5IFkgaWYgeW91IHdhbnQgdG8gYWRkIHN1cHBvcnQgZm9yIFNvQyBhdWRpbyBvbiBOb2tpYSBOODEwLgpkaWZmIC0tZ2l0IGEvc291bmQvc29jL29tYXAvb21hcDNwYW5kb3JhLmMgYi9zb3VuZC9zb2Mvb21hcC9vbWFwM3BhbmRvcmEuYwppbmRleCBiZDkxNTk0Li5mY2MyZjVkIDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvb21hcC9vbWFwM3BhbmRvcmEuYworKysgYi9zb3VuZC9zb2Mvb21hcC9vbWFwM3BhbmRvcmEuYwpAQCAtMTgwLDYgKzE4MCwxOSBAQAogewogCWludCByZXQ7CiAKKwkvKiBBbGwgVFdMNDAzMCBvdXRwdXQgcGlucyBhcmUgZmxvYXRpbmcgKi8KKwlzbmRfc29jX2RhcG1fbmNfcGluKGNvZGVjLCAiT1VUTCIpLAorCXNuZF9zb2NfZGFwbV9uY19waW4oY29kZWMsICJPVVRSIiksCisJc25kX3NvY19kYXBtX25jX3Bpbihjb2RlYywgIkVBUlBJRUNFIiksCisJc25kX3NvY19kYXBtX25jX3Bpbihjb2RlYywgIlBSRURSSVZFTCIpLAorCXNuZF9zb2NfZGFwbV9uY19waW4oY29kZWMsICJQUkVEUklWRVIiKSwKKwlzbmRfc29jX2RhcG1fbmNfcGluKGNvZGVjLCAiSFNPTCIpLAorCXNuZF9zb2NfZGFwbV9uY19waW4oY29kZWMsICJIU09SIiksCisJc25kX3NvY19kYXBtX25jX3Bpbihjb2RlYywgIkNBUktJVEwiKSwKKwlzbmRfc29jX2RhcG1fbmNfcGluKGNvZGVjLCAiQ0FSS0lUUiIpLAorCXNuZF9zb2NfZGFwbV9uY19waW4oY29kZWMsICJIRkwiKSwKKwlzbmRfc29jX2RhcG1fbmNfcGluKGNvZGVjLCAiSEZSIiksCisKIAlyZXQgPSBzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKGNvZGVjLCBvbWFwM3BhbmRvcmFfaW5fZGFwbV93aWRnZXRzLAogCQkJCUFSUkFZX1NJWkUob21hcDNwYW5kb3JhX2luX2RhcG1fd2lkZ2V0cykpOwogCWlmIChyZXQgPCAwKQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3B4YS9weGEyeHgtcGNtLmMgYi9zb3VuZC9zb2MvcHhhL3B4YTJ4eC1wY20uYwppbmRleCBjNjcwZDA4Li41M2I5ZmIxIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvcHhhL3B4YTJ4eC1wY20uYworKysgYi9zb3VuZC9zb2MvcHhhL3B4YTJ4eC1wY20uYwpAQCAtNjEsOSArNjEsOSBAQAogCiAJX19weGEyeHhfcGNtX2h3X2ZyZWUoc3Vic3RyZWFtKTsKIAotCWlmIChwcnRkLT5kbWFfY2gpIHsKKwlpZiAocHJ0ZC0+ZG1hX2NoID49IDApIHsKIAkJcHhhX2ZyZWVfZG1hKHBydGQtPmRtYV9jaCk7Ci0JCXBydGQtPmRtYV9jaCA9IDA7CisJCXBydGQtPmRtYV9jaCA9IC0xOwogCX0KIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NvYy1jb3JlLmMgYi9zb3VuZC9zb2Mvc29jLWNvcmUuYwppbmRleCBiMDk4YzBiLi42Y2JlN2U4IDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvc29jLWNvcmUuYworKysgYi9zb3VuZC9zb2Mvc29jLWNvcmUuYwpAQCAtMTMwMCw2ICsxMzAwLDggQEAKIC8qKgogICogc25kX3NvY19uZXdfcGNtcyAtIGNyZWF0ZSBuZXcgc291bmQgY2FyZCBhbmQgcGNtcwogICogQHNvY2RldjogdGhlIFNvQyBhdWRpbyBkZXZpY2UKKyAqIEBpZHg6IEFMU0EgY2FyZCBpbmRleAorICogQHhpZDogY2FyZCBpZGVudGlmaWNhdGlvbgogICoKICAqIENyZWF0ZSBhIG5ldyBzb3VuZCBjYXJkIGJhc2VkIHVwb24gdGhlIGNvZGVjIGFuZCBpbnRlcmZhY2UgcGNtcy4KICAqCkBAIC0xNDcyLDcgKzE0NzQsNyBAQAogICogc25kX3NvY19jbmV3IC0gY3JlYXRlIG5ldyBjb250cm9sCiAgKiBAX3RlbXBsYXRlOiBjb250cm9sIHRlbXBsYXRlCiAgKiBAZGF0YTogY29udHJvbCBwcml2YXRlIGRhdGEKLSAqIEBsbm5nX25hbWU6IGNvbnRyb2wgbG9uZyBuYW1lCisgKiBAbG9uZ19uYW1lOiBjb250cm9sIGxvbmcgbmFtZQogICoKICAqIENyZWF0ZSBhIG5ldyBtaXhlciBjb250cm9sIGZyb20gYSB0ZW1wbGF0ZSBjb250cm9sLgogICoKQEAgLTE1MjIsNyArMTUyNCw3IEBACiAvKioKICAqIHNuZF9zb2NfZ2V0X2VudW1fZG91YmxlIC0gZW51bWVyYXRlZCBkb3VibGUgbWl4ZXIgZ2V0IGNhbGxiYWNrCiAgKiBAa2NvbnRyb2w6IG1peGVyIGNvbnRyb2wKLSAqIEB1aW5mbzogY29udHJvbCBlbGVtZW50IGluZm9ybWF0aW9uCisgKiBAdWNvbnRyb2w6IGNvbnRyb2wgZWxlbWVudCBpbmZvcm1hdGlvbgogICoKICAqIENhbGxiYWNrIHRvIGdldCB0aGUgdmFsdWUgb2YgYSBkb3VibGUgZW51bWVyYXRlZCBtaXhlci4KICAqCkBAIC0xNTUxLDcgKzE1NTMsNyBAQAogLyoqCiAgKiBzbmRfc29jX3B1dF9lbnVtX2RvdWJsZSAtIGVudW1lcmF0ZWQgZG91YmxlIG1peGVyIHB1dCBjYWxsYmFjawogICogQGtjb250cm9sOiBtaXhlciBjb250cm9sCi0gKiBAdWluZm86IGNvbnRyb2wgZWxlbWVudCBpbmZvcm1hdGlvbgorICogQHVjb250cm9sOiBjb250cm9sIGVsZW1lbnQgaW5mb3JtYXRpb24KICAqCiAgKiBDYWxsYmFjayB0byBzZXQgdGhlIHZhbHVlIG9mIGEgZG91YmxlIGVudW1lcmF0ZWQgbWl4ZXIuCiAgKgpAQCAtMTU4Myw2ICsxNTg1LDExMyBAQAogRVhQT1JUX1NZTUJPTF9HUEwoc25kX3NvY19wdXRfZW51bV9kb3VibGUpOwogCiAvKioKKyAqIHNuZF9zb2NfaW5mb192YWx1ZV9lbnVtX2RvdWJsZSAtIHNlbWkgZW51bWVyYXRlZCBkb3VibGUgbWl4ZXIgaW5mbyBjYWxsYmFjaworICogQGtjb250cm9sOiBtaXhlciBjb250cm9sCisgKiBAdWluZm86IGNvbnRyb2wgZWxlbWVudCBpbmZvcm1hdGlvbgorICoKKyAqIENhbGxiYWNrIHRvIHByb3ZpZGUgaW5mb3JtYXRpb24gYWJvdXQgYSBkb3VibGUgc2VtaSBlbnVtZXJhdGVkCisgKiBtaXhlciBjb250cm9sLgorICoKKyAqIFNlbWkgZW51bWVyYXRlZCBtaXhlcjogdGhlIGVudW1lcmF0ZWQgaXRlbXMgYXJlIHJlZmVycmVkIGFzIHZhbHVlcy4gQ2FuIGJlCisgKiB1c2VkIGZvciBoYW5kbGluZyBiaXRmaWVsZCBjb2RlZCBlbnVtZXJhdGlvbiBmb3IgZXhhbXBsZS4KKyAqCisgKiBSZXR1cm5zIDAgZm9yIHN1Y2Nlc3MuCisgKi8KK2ludCBzbmRfc29jX2luZm9fdmFsdWVfZW51bV9kb3VibGUoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICp1aW5mbykKK3sKKwlzdHJ1Y3Qgc29jX3ZhbHVlX2VudW0gKmUgPSAoc3RydWN0IHNvY192YWx1ZV9lbnVtICopCisJCQlrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKKworCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9FTlVNRVJBVEVEOworCXVpbmZvLT5jb3VudCA9IGUtPnNoaWZ0X2wgPT0gZS0+c2hpZnRfciA/IDEgOiAyOworCXVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1zID0gZS0+bWF4OworCisJaWYgKHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW0gPiBlLT5tYXggLSAxKQorCQl1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtID0gZS0+bWF4IC0gMTsKKwlzdHJjcHkodWluZm8tPnZhbHVlLmVudW1lcmF0ZWQubmFtZSwKKwkJZS0+dGV4dHNbdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbV0pOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc25kX3NvY19pbmZvX3ZhbHVlX2VudW1fZG91YmxlKTsKKworLyoqCisgKiBzbmRfc29jX2dldF92YWx1ZV9lbnVtX2RvdWJsZSAtIHNlbWkgZW51bWVyYXRlZCBkb3VibGUgbWl4ZXIgZ2V0IGNhbGxiYWNrCisgKiBAa2NvbnRyb2w6IG1peGVyIGNvbnRyb2wKKyAqIEB1Y29udHJvbDogY29udHJvbCBlbGVtZW50IGluZm9ybWF0aW9uCisgKgorICogQ2FsbGJhY2sgdG8gZ2V0IHRoZSB2YWx1ZSBvZiBhIGRvdWJsZSBzZW1pIGVudW1lcmF0ZWQgbWl4ZXIuCisgKgorICogU2VtaSBlbnVtZXJhdGVkIG1peGVyOiB0aGUgZW51bWVyYXRlZCBpdGVtcyBhcmUgcmVmZXJyZWQgYXMgdmFsdWVzLiBDYW4gYmUKKyAqIHVzZWQgZm9yIGhhbmRsaW5nIGJpdGZpZWxkIGNvZGVkIGVudW1lcmF0aW9uIGZvciBleGFtcGxlLgorICoKKyAqIFJldHVybnMgMCBmb3Igc3VjY2Vzcy4KKyAqLworaW50IHNuZF9zb2NfZ2V0X3ZhbHVlX2VudW1fZG91YmxlKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlzdHJ1Y3Qgc29jX3ZhbHVlX2VudW0gKmUgPSAoc3RydWN0IHNvY192YWx1ZV9lbnVtICopCisJCQlrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKKwl1bnNpZ25lZCBzaG9ydCByZWdfdmFsLCB2YWwsIG11eDsKKworCXJlZ192YWwgPSBzbmRfc29jX3JlYWQoY29kZWMsIGUtPnJlZyk7CisJdmFsID0gKHJlZ192YWwgPj4gZS0+c2hpZnRfbCkgJiBlLT5tYXNrOworCWZvciAobXV4ID0gMDsgbXV4IDwgZS0+bWF4OyBtdXgrKykgeworCQlpZiAodmFsID09IGUtPnZhbHVlc1ttdXhdKQorCQkJYnJlYWs7CisJfQorCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPSBtdXg7CisJaWYgKGUtPnNoaWZ0X2wgIT0gZS0+c2hpZnRfcikgeworCQl2YWwgPSAocmVnX3ZhbCA+PiBlLT5zaGlmdF9yKSAmIGUtPm1hc2s7CisJCWZvciAobXV4ID0gMDsgbXV4IDwgZS0+bWF4OyBtdXgrKykgeworCQkJaWYgKHZhbCA9PSBlLT52YWx1ZXNbbXV4XSkKKwkJCQlicmVhazsKKwkJfQorCQl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzFdID0gbXV4OworCX0KKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc25kX3NvY19nZXRfdmFsdWVfZW51bV9kb3VibGUpOworCisvKioKKyAqIHNuZF9zb2NfcHV0X3ZhbHVlX2VudW1fZG91YmxlIC0gc2VtaSBlbnVtZXJhdGVkIGRvdWJsZSBtaXhlciBwdXQgY2FsbGJhY2sKKyAqIEBrY29udHJvbDogbWl4ZXIgY29udHJvbAorICogQHVjb250cm9sOiBjb250cm9sIGVsZW1lbnQgaW5mb3JtYXRpb24KKyAqCisgKiBDYWxsYmFjayB0byBzZXQgdGhlIHZhbHVlIG9mIGEgZG91YmxlIHNlbWkgZW51bWVyYXRlZCBtaXhlci4KKyAqCisgKiBTZW1pIGVudW1lcmF0ZWQgbWl4ZXI6IHRoZSBlbnVtZXJhdGVkIGl0ZW1zIGFyZSByZWZlcnJlZCBhcyB2YWx1ZXMuIENhbiBiZQorICogdXNlZCBmb3IgaGFuZGxpbmcgYml0ZmllbGQgY29kZWQgZW51bWVyYXRpb24gZm9yIGV4YW1wbGUuCisgKgorICogUmV0dXJucyAwIGZvciBzdWNjZXNzLgorICovCitpbnQgc25kX3NvY19wdXRfdmFsdWVfZW51bV9kb3VibGUoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXN0cnVjdCBzb2NfdmFsdWVfZW51bSAqZSA9IChzdHJ1Y3Qgc29jX3ZhbHVlX2VudW0gKikKKwkJCWtjb250cm9sLT5wcml2YXRlX3ZhbHVlOworCXVuc2lnbmVkIHNob3J0IHZhbDsKKwl1bnNpZ25lZCBzaG9ydCBtYXNrOworCisJaWYgKHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPiBlLT5tYXggLSAxKQorCQlyZXR1cm4gLUVJTlZBTDsKKwl2YWwgPSBlLT52YWx1ZXNbdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXV0gPDwgZS0+c2hpZnRfbDsKKwltYXNrID0gZS0+bWFzayA8PCBlLT5zaGlmdF9sOworCWlmIChlLT5zaGlmdF9sICE9IGUtPnNoaWZ0X3IpIHsKKwkJaWYgKHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMV0gPiBlLT5tYXggLSAxKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCXZhbCB8PSBlLT52YWx1ZXNbdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVsxXV0gPDwgZS0+c2hpZnRfcjsKKwkJbWFzayB8PSBlLT5tYXNrIDw8IGUtPnNoaWZ0X3I7CisJfQorCisJcmV0dXJuIHNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIGUtPnJlZywgbWFzaywgdmFsKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNuZF9zb2NfcHV0X3ZhbHVlX2VudW1fZG91YmxlKTsKKworLyoqCiAgKiBzbmRfc29jX2luZm9fZW51bV9leHQgLSBleHRlcm5hbCBlbnVtZXJhdGVkIHNpbmdsZSBtaXhlciBpbmZvIGNhbGxiYWNrCiAgKiBAa2NvbnRyb2w6IG1peGVyIGNvbnRyb2wKICAqIEB1aW5mbzogY29udHJvbCBlbGVtZW50IGluZm9ybWF0aW9uCkBAIC0xNjY4LDcgKzE3NzcsNyBAQAogLyoqCiAgKiBzbmRfc29jX2dldF92b2xzdyAtIHNpbmdsZSBtaXhlciBnZXQgY2FsbGJhY2sKICAqIEBrY29udHJvbDogbWl4ZXIgY29udHJvbAotICogQHVpbmZvOiBjb250cm9sIGVsZW1lbnQgaW5mb3JtYXRpb24KKyAqIEB1Y29udHJvbDogY29udHJvbCBlbGVtZW50IGluZm9ybWF0aW9uCiAgKgogICogQ2FsbGJhY2sgdG8gZ2V0IHRoZSB2YWx1ZSBvZiBhIHNpbmdsZSBtaXhlciBjb250cm9sLgogICoKQEAgLTE3MDcsNyArMTgxNiw3IEBACiAvKioKICAqIHNuZF9zb2NfcHV0X3ZvbHN3IC0gc2luZ2xlIG1peGVyIHB1dCBjYWxsYmFjawogICogQGtjb250cm9sOiBtaXhlciBjb250cm9sCi0gKiBAdWluZm86IGNvbnRyb2wgZWxlbWVudCBpbmZvcm1hdGlvbgorICogQHVjb250cm9sOiBjb250cm9sIGVsZW1lbnQgaW5mb3JtYXRpb24KICAqCiAgKiBDYWxsYmFjayB0byBzZXQgdGhlIHZhbHVlIG9mIGEgc2luZ2xlIG1peGVyIGNvbnRyb2wuCiAgKgpAQCAtMTc3NSw3ICsxODg0LDcgQEAKIC8qKgogICogc25kX3NvY19nZXRfdm9sc3dfMnIgLSBkb3VibGUgbWl4ZXIgZ2V0IGNhbGxiYWNrCiAgKiBAa2NvbnRyb2w6IG1peGVyIGNvbnRyb2wKLSAqIEB1aW5mbzogY29udHJvbCBlbGVtZW50IGluZm9ybWF0aW9uCisgKiBAdWNvbnRyb2w6IGNvbnRyb2wgZWxlbWVudCBpbmZvcm1hdGlvbgogICoKICAqIENhbGxiYWNrIHRvIGdldCB0aGUgdmFsdWUgb2YgYSBkb3VibGUgbWl4ZXIgY29udHJvbCB0aGF0IHNwYW5zIDIgcmVnaXN0ZXJzLgogICoKQEAgLTE4MTIsNyArMTkyMSw3IEBACiAvKioKICAqIHNuZF9zb2NfcHV0X3ZvbHN3XzJyIC0gZG91YmxlIG1peGVyIHNldCBjYWxsYmFjawogICogQGtjb250cm9sOiBtaXhlciBjb250cm9sCi0gKiBAdWluZm86IGNvbnRyb2wgZWxlbWVudCBpbmZvcm1hdGlvbgorICogQHVjb250cm9sOiBjb250cm9sIGVsZW1lbnQgaW5mb3JtYXRpb24KICAqCiAgKiBDYWxsYmFjayB0byBzZXQgdGhlIHZhbHVlIG9mIGEgZG91YmxlIG1peGVyIGNvbnRyb2wgdGhhdCBzcGFucyAyIHJlZ2lzdGVycy4KICAqCkBAIC0xODgyLDcgKzE5OTEsNyBAQAogLyoqCiAgKiBzbmRfc29jX2dldF92b2xzd19zOCAtIHNpZ25lZCBtaXhlciBnZXQgY2FsbGJhY2sKICAqIEBrY29udHJvbDogbWl4ZXIgY29udHJvbAotICogQHVpbmZvOiBjb250cm9sIGVsZW1lbnQgaW5mb3JtYXRpb24KKyAqIEB1Y29udHJvbDogY29udHJvbCBlbGVtZW50IGluZm9ybWF0aW9uCiAgKgogICogQ2FsbGJhY2sgdG8gZ2V0IHRoZSB2YWx1ZSBvZiBhIHNpZ25lZCBtaXhlciBjb250cm9sLgogICoKQEAgLTE5MDksNyArMjAxOCw3IEBACiAvKioKICAqIHNuZF9zb2NfcHV0X3ZvbHN3X3NnbiAtIHNpZ25lZCBtaXhlciBwdXQgY2FsbGJhY2sKICAqIEBrY29udHJvbDogbWl4ZXIgY29udHJvbAotICogQHVpbmZvOiBjb250cm9sIGVsZW1lbnQgaW5mb3JtYXRpb24KKyAqIEB1Y29udHJvbDogY29udHJvbCBlbGVtZW50IGluZm9ybWF0aW9uCiAgKgogICogQ2FsbGJhY2sgdG8gc2V0IHRoZSB2YWx1ZSBvZiBhIHNpZ25lZCBtaXhlciBjb250cm9sLgogICoKQEAgLTE5NTQsNyArMjA2Myw3IEBACiAvKioKICAqIHNuZF9zb2NfZGFpX3NldF9jbGtkaXYgLSBjb25maWd1cmUgREFJIGNsb2NrIGRpdmlkZXJzLgogICogQGRhaTogREFJCi0gKiBAY2xrX2lkOiBEQUkgc3BlY2lmaWMgY2xvY2sgZGl2aWRlciBJRAorICogQGRpdl9pZDogREFJIHNwZWNpZmljIGNsb2NrIGRpdmlkZXIgSUQKICAqIEBkaXY6IG5ldyBjbG9jayBkaXZpc29yLgogICoKICAqIENvbmZpZ3VyZXMgdGhlIGNsb2NrIGRpdmlkZXJzLiBUaGlzIGlzIHVzZWQgdG8gZGVyaXZlIHRoZSBiZXN0IERBSSBiaXQgYW5kCkBAIC0yMDYwLDcgKzIxNjksNyBAQAogLyoqCiAgKiBzbmRfc29jX3JlZ2lzdGVyX2NhcmQgLSBSZWdpc3RlciBhIGNhcmQgd2l0aCB0aGUgQVNvQyBjb3JlCiAgKgotICogQHBhcmFtIGNhcmQgQ2FyZCB0byByZWdpc3RlcgorICogQGNhcmQ6IENhcmQgdG8gcmVnaXN0ZXIKICAqCiAgKiBOb3RlIHRoYXQgY3VycmVudGx5IHRoaXMgaXMgYW4gaW50ZXJuYWwgb25seSBmdW5jdGlvbjogaXQgd2lsbCBiZQogICogZXhwb3NlZCB0byBtYWNoaW5lIGRyaXZlcnMgYWZ0ZXIgZnVydGhlciBiYWNrcG9ydGluZyBvZiBBU29DIHYyCkBAIC0yMDg3LDcgKzIxOTYsNyBAQAogLyoqCiAgKiBzbmRfc29jX3VucmVnaXN0ZXJfY2FyZCAtIFVucmVnaXN0ZXIgYSBjYXJkIHdpdGggdGhlIEFTb0MgY29yZQogICoKLSAqIEBwYXJhbSBjYXJkIENhcmQgdG8gdW5yZWdpc3RlcgorICogQGNhcmQ6IENhcmQgdG8gdW5yZWdpc3RlcgogICoKICAqIE5vdGUgdGhhdCBjdXJyZW50bHkgdGhpcyBpcyBhbiBpbnRlcm5hbCBvbmx5IGZ1bmN0aW9uOiBpdCB3aWxsIGJlCiAgKiBleHBvc2VkIHRvIG1hY2hpbmUgZHJpdmVycyBhZnRlciBmdXJ0aGVyIGJhY2twb3J0aW5nIG9mIEFTb0MgdjIKQEAgLTIxMDcsNyArMjIxNiw3IEBACiAvKioKICAqIHNuZF9zb2NfcmVnaXN0ZXJfZGFpIC0gUmVnaXN0ZXIgYSBEQUkgd2l0aCB0aGUgQVNvQyBjb3JlCiAgKgotICogQHBhcmFtIGRhaSBEQUkgdG8gcmVnaXN0ZXIKKyAqIEBkYWk6IERBSSB0byByZWdpc3RlcgogICovCiBpbnQgc25kX3NvY19yZWdpc3Rlcl9kYWkoc3RydWN0IHNuZF9zb2NfZGFpICpkYWkpCiB7CkBAIC0yMTM0LDcgKzIyNDMsNyBAQAogLyoqCiAgKiBzbmRfc29jX3VucmVnaXN0ZXJfZGFpIC0gVW5yZWdpc3RlciBhIERBSSBmcm9tIHRoZSBBU29DIGNvcmUKICAqCi0gKiBAcGFyYW0gZGFpIERBSSB0byB1bnJlZ2lzdGVyCisgKiBAZGFpOiBEQUkgdG8gdW5yZWdpc3RlcgogICovCiB2b2lkIHNuZF9zb2NfdW5yZWdpc3Rlcl9kYWkoc3RydWN0IHNuZF9zb2NfZGFpICpkYWkpCiB7CkBAIC0yMTQ5LDggKzIyNTgsOCBAQAogLyoqCiAgKiBzbmRfc29jX3JlZ2lzdGVyX2RhaXMgLSBSZWdpc3RlciBtdWx0aXBsZSBEQUlzIHdpdGggdGhlIEFTb0MgY29yZQogICoKLSAqIEBwYXJhbSBkYWkgQXJyYXkgb2YgREFJcyB0byByZWdpc3RlcgotICogQHBhcmFtIGNvdW50IE51bWJlciBvZiBEQUlzCisgKiBAZGFpOiBBcnJheSBvZiBEQUlzIHRvIHJlZ2lzdGVyCisgKiBAY291bnQ6IE51bWJlciBvZiBEQUlzCiAgKi8KIGludCBzbmRfc29jX3JlZ2lzdGVyX2RhaXMoc3RydWN0IHNuZF9zb2NfZGFpICpkYWksIHNpemVfdCBjb3VudCkKIHsKQEAgLTIxNzUsOCArMjI4NCw4IEBACiAvKioKICAqIHNuZF9zb2NfdW5yZWdpc3Rlcl9kYWlzIC0gVW5yZWdpc3RlciBtdWx0aXBsZSBEQUlzIGZyb20gdGhlIEFTb0MgY29yZQogICoKLSAqIEBwYXJhbSBkYWkgQXJyYXkgb2YgREFJcyB0byB1bnJlZ2lzdGVyCi0gKiBAcGFyYW0gY291bnQgTnVtYmVyIG9mIERBSXMKKyAqIEBkYWk6IEFycmF5IG9mIERBSXMgdG8gdW5yZWdpc3RlcgorICogQGNvdW50OiBOdW1iZXIgb2YgREFJcwogICovCiB2b2lkIHNuZF9zb2NfdW5yZWdpc3Rlcl9kYWlzKHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpLCBzaXplX3QgY291bnQpCiB7CkBAIC0yMTkwLDcgKzIyOTksNyBAQAogLyoqCiAgKiBzbmRfc29jX3JlZ2lzdGVyX3BsYXRmb3JtIC0gUmVnaXN0ZXIgYSBwbGF0Zm9ybSB3aXRoIHRoZSBBU29DIGNvcmUKICAqCi0gKiBAcGFyYW0gcGxhdGZvcm0gcGxhdGZvcm0gdG8gcmVnaXN0ZXIKKyAqIEBwbGF0Zm9ybTogcGxhdGZvcm0gdG8gcmVnaXN0ZXIKICAqLwogaW50IHNuZF9zb2NfcmVnaXN0ZXJfcGxhdGZvcm0oc3RydWN0IHNuZF9zb2NfcGxhdGZvcm0gKnBsYXRmb3JtKQogewpAQCAtMjIxMyw3ICsyMzIyLDcgQEAKIC8qKgogICogc25kX3NvY191bnJlZ2lzdGVyX3BsYXRmb3JtIC0gVW5yZWdpc3RlciBhIHBsYXRmb3JtIGZyb20gdGhlIEFTb0MgY29yZQogICoKLSAqIEBwYXJhbSBwbGF0Zm9ybSBwbGF0Zm9ybSB0byB1bnJlZ2lzdGVyCisgKiBAcGxhdGZvcm06IHBsYXRmb3JtIHRvIHVucmVnaXN0ZXIKICAqLwogdm9pZCBzbmRfc29jX3VucmVnaXN0ZXJfcGxhdGZvcm0oc3RydWN0IHNuZF9zb2NfcGxhdGZvcm0gKnBsYXRmb3JtKQogewpAQCAtMjIyOCw3ICsyMzM3LDcgQEAKIC8qKgogICogc25kX3NvY19yZWdpc3Rlcl9jb2RlYyAtIFJlZ2lzdGVyIGEgY29kZWMgd2l0aCB0aGUgQVNvQyBjb3JlCiAgKgotICogQHBhcmFtIGNvZGVjIGNvZGVjIHRvIHJlZ2lzdGVyCisgKiBAY29kZWM6IGNvZGVjIHRvIHJlZ2lzdGVyCiAgKi8KIGludCBzbmRfc29jX3JlZ2lzdGVyX2NvZGVjKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKIHsKQEAgLTIyNTUsNyArMjM2NCw3IEBACiAvKioKICAqIHNuZF9zb2NfdW5yZWdpc3Rlcl9jb2RlYyAtIFVucmVnaXN0ZXIgYSBjb2RlYyBmcm9tIHRoZSBBU29DIGNvcmUKICAqCi0gKiBAcGFyYW0gY29kZWMgY29kZWMgdG8gdW5yZWdpc3RlcgorICogQGNvZGVjOiBjb2RlYyB0byB1bnJlZ2lzdGVyCiAgKi8KIHZvaWQgc25kX3NvY191bnJlZ2lzdGVyX2NvZGVjKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKIHsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9zb2MtZGFwbS5jIGIvc291bmQvc29jL3NvYy1kYXBtLmMKaW5kZXggODg2M2VkZC4uYWQwZDgwMSAxMDA2NDQKLS0tIGEvc291bmQvc29jL3NvYy1kYXBtLmMKKysrIGIvc291bmQvc29jL3NvYy1kYXBtLmMKQEAgLTUzLDEzICs1MywxNSBAQAogLyogZGFwbSBwb3dlciBzZXF1ZW5jZXMgLSBtYWtlIHRoaXMgcGVyIGNvZGVjIGluIHRoZSBmdXR1cmUgKi8KIHN0YXRpYyBpbnQgZGFwbV91cF9zZXFbXSA9IHsKIAlzbmRfc29jX2RhcG1fcHJlLCBzbmRfc29jX2RhcG1fbWljYmlhcywgc25kX3NvY19kYXBtX21pYywKLQlzbmRfc29jX2RhcG1fbXV4LCBzbmRfc29jX2RhcG1fZGFjLCBzbmRfc29jX2RhcG1fbWl4ZXIsIHNuZF9zb2NfZGFwbV9wZ2EsCi0Jc25kX3NvY19kYXBtX2FkYywgc25kX3NvY19kYXBtX2hwLCBzbmRfc29jX2RhcG1fc3BrLCBzbmRfc29jX2RhcG1fcG9zdAorCXNuZF9zb2NfZGFwbV9tdXgsIHNuZF9zb2NfZGFwbV92YWx1ZV9tdXgsIHNuZF9zb2NfZGFwbV9kYWMsCisJc25kX3NvY19kYXBtX21peGVyLCBzbmRfc29jX2RhcG1fcGdhLCBzbmRfc29jX2RhcG1fYWRjLCBzbmRfc29jX2RhcG1faHAsCisJc25kX3NvY19kYXBtX3Nwaywgc25kX3NvY19kYXBtX3Bvc3QKIH07CiBzdGF0aWMgaW50IGRhcG1fZG93bl9zZXFbXSA9IHsKIAlzbmRfc29jX2RhcG1fcHJlLCBzbmRfc29jX2RhcG1fYWRjLCBzbmRfc29jX2RhcG1faHAsIHNuZF9zb2NfZGFwbV9zcGssCiAJc25kX3NvY19kYXBtX3BnYSwgc25kX3NvY19kYXBtX21peGVyLCBzbmRfc29jX2RhcG1fZGFjLCBzbmRfc29jX2RhcG1fbWljLAotCXNuZF9zb2NfZGFwbV9taWNiaWFzLCBzbmRfc29jX2RhcG1fbXV4LCBzbmRfc29jX2RhcG1fcG9zdAorCXNuZF9zb2NfZGFwbV9taWNiaWFzLCBzbmRfc29jX2RhcG1fbXV4LCBzbmRfc29jX2RhcG1fdmFsdWVfbXV4LAorCXNuZF9zb2NfZGFwbV9wb3N0CiB9OwogCiBzdGF0aWMgaW50IGRhcG1fc3RhdHVzID0gMTsKQEAgLTEzNCw2ICsxMzYsMjUgQEAKIAkJfQogCX0KIAlicmVhazsKKwljYXNlIHNuZF9zb2NfZGFwbV92YWx1ZV9tdXg6IHsKKwkJc3RydWN0IHNvY192YWx1ZV9lbnVtICplID0gKHN0cnVjdCBzb2NfdmFsdWVfZW51bSAqKQorCQkJdy0+a2NvbnRyb2xzW2ldLnByaXZhdGVfdmFsdWU7CisJCWludCB2YWwsIGl0ZW07CisKKwkJdmFsID0gc25kX3NvY19yZWFkKHctPmNvZGVjLCBlLT5yZWcpOworCQl2YWwgPSAodmFsID4+IGUtPnNoaWZ0X2wpICYgZS0+bWFzazsKKwkJZm9yIChpdGVtID0gMDsgaXRlbSA8IGUtPm1heDsgaXRlbSsrKSB7CisJCQlpZiAodmFsID09IGUtPnZhbHVlc1tpdGVtXSkKKwkJCQlicmVhazsKKwkJfQorCisJCXAtPmNvbm5lY3QgPSAwOworCQlmb3IgKGkgPSAwOyBpIDwgZS0+bWF4OyBpKyspIHsKKwkJCWlmICghKHN0cmNtcChwLT5uYW1lLCBlLT50ZXh0c1tpXSkpICYmIGl0ZW0gPT0gaSkKKwkJCQlwLT5jb25uZWN0ID0gMTsKKwkJfQorCX0KKwlicmVhazsKIAkvKiBkb2VzIG5vdCBlZmZlY3Qgcm91dGluZyAtIGFsd2F5cyBjb25uZWN0ZWQgKi8KIAljYXNlIHNuZF9zb2NfZGFwbV9wZ2E6CiAJY2FzZSBzbmRfc29jX2RhcG1fb3V0cHV0OgpAQCAtMTc5LDYgKzIwMCwzMCBAQAogCXJldHVybiAtRU5PREVWOwogfQogCisvKiBjb25uZWN0IHZhbHVlX211eCB3aWRnZXQgdG8gaXQncyBpbnRlcmNvbm5lY3RpbmcgYXVkaW8gcGF0aHMgKi8KK3N0YXRpYyBpbnQgZGFwbV9jb25uZWN0X3ZhbHVlX211eChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKnNyYywgc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKmRlc3QsCisJc3RydWN0IHNuZF9zb2NfZGFwbV9wYXRoICpwYXRoLCBjb25zdCBjaGFyICpjb250cm9sX25hbWUsCisJY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgKmtjb250cm9sKQoreworCXN0cnVjdCBzb2NfdmFsdWVfZW51bSAqZSA9IChzdHJ1Y3Qgc29jX3ZhbHVlX2VudW0gKikKKwkJCWtjb250cm9sLT5wcml2YXRlX3ZhbHVlOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGUtPm1heDsgaSsrKSB7CisJCWlmICghKHN0cmNtcChjb250cm9sX25hbWUsIGUtPnRleHRzW2ldKSkpIHsKKwkJCWxpc3RfYWRkKCZwYXRoLT5saXN0LCAmY29kZWMtPmRhcG1fcGF0aHMpOworCQkJbGlzdF9hZGQoJnBhdGgtPmxpc3Rfc2luaywgJmRlc3QtPnNvdXJjZXMpOworCQkJbGlzdF9hZGQoJnBhdGgtPmxpc3Rfc291cmNlLCAmc3JjLT5zaW5rcyk7CisJCQlwYXRoLT5uYW1lID0gKGNoYXIgKillLT50ZXh0c1tpXTsKKwkJCWRhcG1fc2V0X3BhdGhfc3RhdHVzKGRlc3QsIHBhdGgsIDApOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlyZXR1cm4gLUVOT0RFVjsKK30KKwogLyogY29ubmVjdCBtaXhlciB3aWRnZXQgdG8gaXQncyBpbnRlcmNvbm5lY3RpbmcgYXVkaW8gcGF0aHMgKi8KIHN0YXRpYyBpbnQgZGFwbV9jb25uZWN0X21peGVyKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKIAlzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqc3JjLCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqZGVzdCwKQEAgLTY1Myw2ICs2OTgsNyBAQAogCQljYXNlIHNuZF9zb2NfZGFwbV92bWlkOgogCQkJY29udGludWU7CiAJCWNhc2Ugc25kX3NvY19kYXBtX211eDoKKwkJY2FzZSBzbmRfc29jX2RhcG1fdmFsdWVfbXV4OgogCQljYXNlIHNuZF9zb2NfZGFwbV9vdXRwdXQ6CiAJCWNhc2Ugc25kX3NvY19kYXBtX2lucHV0OgogCQljYXNlIHNuZF9zb2NfZGFwbV9zd2l0Y2g6CkBAIC03MjgsNiArNzc0LDQ1IEBACiAJcmV0dXJuIDA7CiB9CiAKKy8qIHRlc3QgYW5kIHVwZGF0ZSB0aGUgcG93ZXIgc3RhdHVzIG9mIGEgdmFsdWVfbXV4IHdpZGdldCAqLworc3RhdGljIGludCBkYXBtX3ZhbHVlX211eF91cGRhdGVfcG93ZXIoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKndpZGdldCwKKwkJCQkgc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIGludCBtYXNrLAorCQkJCSBpbnQgbXV4LCBpbnQgdmFsLCBzdHJ1Y3Qgc29jX3ZhbHVlX2VudW0gKmUpCit7CisJc3RydWN0IHNuZF9zb2NfZGFwbV9wYXRoICpwYXRoOworCWludCBmb3VuZCA9IDA7CisKKwlpZiAod2lkZ2V0LT5pZCAhPSBzbmRfc29jX2RhcG1fdmFsdWVfbXV4KQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmICghc25kX3NvY190ZXN0X2JpdHMod2lkZ2V0LT5jb2RlYywgZS0+cmVnLCBtYXNrLCB2YWwpKQorCQlyZXR1cm4gMDsKKworCS8qIGZpbmQgZGFwbSB3aWRnZXQgcGF0aCBhc3NvYyB3aXRoIGtjb250cm9sICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeShwYXRoLCAmd2lkZ2V0LT5jb2RlYy0+ZGFwbV9wYXRocywgbGlzdCkgeworCQlpZiAocGF0aC0+a2NvbnRyb2wgIT0ga2NvbnRyb2wpCisJCQljb250aW51ZTsKKworCQlpZiAoIXBhdGgtPm5hbWUgfHwgIWUtPnRleHRzW211eF0pCisJCQljb250aW51ZTsKKworCQlmb3VuZCA9IDE7CisJCS8qIHdlIG5vdyBuZWVkIHRvIG1hdGNoIHRoZSBzdHJpbmcgaW4gdGhlIGVudW0gdG8gdGhlIHBhdGggKi8KKwkJaWYgKCEoc3RyY21wKHBhdGgtPm5hbWUsIGUtPnRleHRzW211eF0pKSkKKwkJCXBhdGgtPmNvbm5lY3QgPSAxOyAvKiBuZXcgY29ubmVjdGlvbiAqLworCQllbHNlCisJCQlwYXRoLT5jb25uZWN0ID0gMDsgLyogb2xkIGNvbm5lY3Rpb24gbXVzdCBiZQorCQkJCQkgICAgICBwb3dlcmVkIGRvd24gKi8KKwl9CisKKwlpZiAoZm91bmQpIHsKKwkJZGFwbV9wb3dlcl93aWRnZXRzKHdpZGdldC0+Y29kZWMsIFNORF9TT0NfREFQTV9TVFJFQU1fTk9QKTsKKwkJZHVtcF9kYXBtKHdpZGdldC0+Y29kZWMsICJtdXggcG93ZXIgdXBkYXRlIik7CisJfQorCisJcmV0dXJuIDA7Cit9CisKIC8qIHRlc3QgYW5kIHVwZGF0ZSB0aGUgcG93ZXIgc3RhdHVzIG9mIGEgbWl4ZXIgb3Igc3dpdGNoIHdpZGdldCAqLwogc3RhdGljIGludCBkYXBtX21peGVyX3VwZGF0ZV9wb3dlcihzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqd2lkZ2V0LAogCQkJCSAgIHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLCBpbnQgcmVnLApAQCAtOTY1LDYgKzEwNTAsMTIgQEAKIAkJaWYgKHJldCAhPSAwKQogCQkJZ290byBlcnI7CiAJCWJyZWFrOworCWNhc2Ugc25kX3NvY19kYXBtX3ZhbHVlX211eDoKKwkJcmV0ID0gZGFwbV9jb25uZWN0X3ZhbHVlX211eChjb2RlYywgd3NvdXJjZSwgd3NpbmssIHBhdGgsCisJCQljb250cm9sLCAmd3NpbmstPmtjb250cm9sc1swXSk7CisJCWlmIChyZXQgIT0gMCkKKwkJCWdvdG8gZXJyOworCQlicmVhazsKIAljYXNlIHNuZF9zb2NfZGFwbV9zd2l0Y2g6CiAJY2FzZSBzbmRfc29jX2RhcG1fbWl4ZXI6CiAJCXJldCA9IGRhcG1fY29ubmVjdF9taXhlcihjb2RlYywgd3NvdXJjZSwgd3NpbmssIHBhdGgsIGNvbnRyb2wpOwpAQCAtMTA0Nyw2ICsxMTM4LDcgQEAKIAkJCWRhcG1fbmV3X21peGVyKGNvZGVjLCB3KTsKIAkJCWJyZWFrOwogCQljYXNlIHNuZF9zb2NfZGFwbV9tdXg6CisJCWNhc2Ugc25kX3NvY19kYXBtX3ZhbHVlX211eDoKIAkJCWRhcG1fbmV3X211eChjb2RlYywgdyk7CiAJCQlicmVhazsKIAkJY2FzZSBzbmRfc29jX2RhcG1fYWRjOgpAQCAtMTA3Nyw3ICsxMTY5LDcgQEAKIC8qKgogICogc25kX3NvY19kYXBtX2dldF92b2xzdyAtIGRhcG0gbWl4ZXIgZ2V0IGNhbGxiYWNrCiAgKiBAa2NvbnRyb2w6IG1peGVyIGNvbnRyb2wKLSAqIEB1aW5mbzogY29udHJvbCBlbGVtZW50IGluZm9ybWF0aW9uCisgKiBAdWNvbnRyb2w6IGNvbnRyb2wgZWxlbWVudCBpbmZvcm1hdGlvbgogICoKICAqIENhbGxiYWNrIHRvIGdldCB0aGUgdmFsdWUgb2YgYSBkYXBtIG1peGVyIGNvbnRyb2wuCiAgKgpAQCAtMTEyMiw3ICsxMjE0LDcgQEAKIC8qKgogICogc25kX3NvY19kYXBtX3B1dF92b2xzdyAtIGRhcG0gbWl4ZXIgc2V0IGNhbGxiYWNrCiAgKiBAa2NvbnRyb2w6IG1peGVyIGNvbnRyb2wKLSAqIEB1aW5mbzogY29udHJvbCBlbGVtZW50IGluZm9ybWF0aW9uCisgKiBAdWNvbnRyb2w6IGNvbnRyb2wgZWxlbWVudCBpbmZvcm1hdGlvbgogICoKICAqIENhbGxiYWNrIHRvIHNldCB0aGUgdmFsdWUgb2YgYSBkYXBtIG1peGVyIGNvbnRyb2wuCiAgKgpAQCAtMTE5Myw3ICsxMjg1LDcgQEAKIC8qKgogICogc25kX3NvY19kYXBtX2dldF9lbnVtX2RvdWJsZSAtIGRhcG0gZW51bWVyYXRlZCBkb3VibGUgbWl4ZXIgZ2V0IGNhbGxiYWNrCiAgKiBAa2NvbnRyb2w6IG1peGVyIGNvbnRyb2wKLSAqIEB1aW5mbzogY29udHJvbCBlbGVtZW50IGluZm9ybWF0aW9uCisgKiBAdWNvbnRyb2w6IGNvbnRyb2wgZWxlbWVudCBpbmZvcm1hdGlvbgogICoKICAqIENhbGxiYWNrIHRvIGdldCB0aGUgdmFsdWUgb2YgYSBkYXBtIGVudW1lcmF0ZWQgZG91YmxlIG1peGVyIGNvbnRyb2wuCiAgKgpAQCAtMTIyMSw3ICsxMzEzLDcgQEAKIC8qKgogICogc25kX3NvY19kYXBtX3B1dF9lbnVtX2RvdWJsZSAtIGRhcG0gZW51bWVyYXRlZCBkb3VibGUgbWl4ZXIgc2V0IGNhbGxiYWNrCiAgKiBAa2NvbnRyb2w6IG1peGVyIGNvbnRyb2wKLSAqIEB1aW5mbzogY29udHJvbCBlbGVtZW50IGluZm9ybWF0aW9uCisgKiBAdWNvbnRyb2w6IGNvbnRyb2wgZWxlbWVudCBpbmZvcm1hdGlvbgogICoKICAqIENhbGxiYWNrIHRvIHNldCB0aGUgdmFsdWUgb2YgYSBkYXBtIGVudW1lcmF0ZWQgZG91YmxlIG1peGVyIGNvbnRyb2wuCiAgKgpAQCAtMTI3NCw2ICsxMzY2LDEwNSBAQAogRVhQT1JUX1NZTUJPTF9HUEwoc25kX3NvY19kYXBtX3B1dF9lbnVtX2RvdWJsZSk7CiAKIC8qKgorICogc25kX3NvY19kYXBtX2dldF92YWx1ZV9lbnVtX2RvdWJsZSAtIGRhcG0gc2VtaSBlbnVtZXJhdGVkIGRvdWJsZSBtaXhlciBnZXQKKyAqCQkJCQljYWxsYmFjaworICogQGtjb250cm9sOiBtaXhlciBjb250cm9sCisgKiBAdWNvbnRyb2w6IGNvbnRyb2wgZWxlbWVudCBpbmZvcm1hdGlvbgorICoKKyAqIENhbGxiYWNrIHRvIGdldCB0aGUgdmFsdWUgb2YgYSBkYXBtIHNlbWkgZW51bWVyYXRlZCBkb3VibGUgbWl4ZXIgY29udHJvbC4KKyAqCisgKiBTZW1pIGVudW1lcmF0ZWQgbWl4ZXI6IHRoZSBlbnVtZXJhdGVkIGl0ZW1zIGFyZSByZWZlcnJlZCBhcyB2YWx1ZXMuIENhbiBiZQorICogdXNlZCBmb3IgaGFuZGxpbmcgYml0ZmllbGQgY29kZWQgZW51bWVyYXRpb24gZm9yIGV4YW1wbGUuCisgKgorICogUmV0dXJucyAwIGZvciBzdWNjZXNzLgorICovCitpbnQgc25kX3NvY19kYXBtX2dldF92YWx1ZV9lbnVtX2RvdWJsZShzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqd2lkZ2V0ID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXN0cnVjdCBzb2NfdmFsdWVfZW51bSAqZSA9IChzdHJ1Y3Qgc29jX3ZhbHVlX2VudW0gKikKKwkJCWtjb250cm9sLT5wcml2YXRlX3ZhbHVlOworCXVuc2lnbmVkIHNob3J0IHJlZ192YWwsIHZhbCwgbXV4OworCisJcmVnX3ZhbCA9IHNuZF9zb2NfcmVhZCh3aWRnZXQtPmNvZGVjLCBlLT5yZWcpOworCXZhbCA9IChyZWdfdmFsID4+IGUtPnNoaWZ0X2wpICYgZS0+bWFzazsKKwlmb3IgKG11eCA9IDA7IG11eCA8IGUtPm1heDsgbXV4KyspIHsKKwkJaWYgKHZhbCA9PSBlLT52YWx1ZXNbbXV4XSkKKwkJCWJyZWFrOworCX0KKwl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0gbXV4OworCWlmIChlLT5zaGlmdF9sICE9IGUtPnNoaWZ0X3IpIHsKKwkJdmFsID0gKHJlZ192YWwgPj4gZS0+c2hpZnRfcikgJiBlLT5tYXNrOworCQlmb3IgKG11eCA9IDA7IG11eCA8IGUtPm1heDsgbXV4KyspIHsKKwkJCWlmICh2YWwgPT0gZS0+dmFsdWVzW211eF0pCisJCQkJYnJlYWs7CisJCX0KKwkJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVsxXSA9IG11eDsKKwl9CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNuZF9zb2NfZGFwbV9nZXRfdmFsdWVfZW51bV9kb3VibGUpOworCisvKioKKyAqIHNuZF9zb2NfZGFwbV9wdXRfdmFsdWVfZW51bV9kb3VibGUgLSBkYXBtIHNlbWkgZW51bWVyYXRlZCBkb3VibGUgbWl4ZXIgc2V0CisgKgkJCQkJY2FsbGJhY2sKKyAqIEBrY29udHJvbDogbWl4ZXIgY29udHJvbAorICogQHVjb250cm9sOiBjb250cm9sIGVsZW1lbnQgaW5mb3JtYXRpb24KKyAqCisgKiBDYWxsYmFjayB0byBzZXQgdGhlIHZhbHVlIG9mIGEgZGFwbSBzZW1pIGVudW1lcmF0ZWQgZG91YmxlIG1peGVyIGNvbnRyb2wuCisgKgorICogU2VtaSBlbnVtZXJhdGVkIG1peGVyOiB0aGUgZW51bWVyYXRlZCBpdGVtcyBhcmUgcmVmZXJyZWQgYXMgdmFsdWVzLiBDYW4gYmUKKyAqIHVzZWQgZm9yIGhhbmRsaW5nIGJpdGZpZWxkIGNvZGVkIGVudW1lcmF0aW9uIGZvciBleGFtcGxlLgorICoKKyAqIFJldHVybnMgMCBmb3Igc3VjY2Vzcy4KKyAqLworaW50IHNuZF9zb2NfZGFwbV9wdXRfdmFsdWVfZW51bV9kb3VibGUoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKndpZGdldCA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlzdHJ1Y3Qgc29jX3ZhbHVlX2VudW0gKmUgPSAoc3RydWN0IHNvY192YWx1ZV9lbnVtICopCisJCQlrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKKwl1bnNpZ25lZCBzaG9ydCB2YWwsIG11eDsKKwl1bnNpZ25lZCBzaG9ydCBtYXNrOworCWludCByZXQgPSAwOworCisJaWYgKHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPiBlLT5tYXggLSAxKQorCQlyZXR1cm4gLUVJTlZBTDsKKwltdXggPSB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdOworCXZhbCA9IGUtPnZhbHVlc1t1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdXSA8PCBlLT5zaGlmdF9sOworCW1hc2sgPSBlLT5tYXNrIDw8IGUtPnNoaWZ0X2w7CisJaWYgKGUtPnNoaWZ0X2wgIT0gZS0+c2hpZnRfcikgeworCQlpZiAodWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVsxXSA+IGUtPm1heCAtIDEpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJdmFsIHw9IGUtPnZhbHVlc1t1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzFdXSA8PCBlLT5zaGlmdF9yOworCQltYXNrIHw9IGUtPm1hc2sgPDwgZS0+c2hpZnRfcjsKKwl9CisKKwltdXRleF9sb2NrKCZ3aWRnZXQtPmNvZGVjLT5tdXRleCk7CisJd2lkZ2V0LT52YWx1ZSA9IHZhbDsKKwlkYXBtX3ZhbHVlX211eF91cGRhdGVfcG93ZXIod2lkZ2V0LCBrY29udHJvbCwgbWFzaywgbXV4LCB2YWwsIGUpOworCWlmICh3aWRnZXQtPmV2ZW50KSB7CisJCWlmICh3aWRnZXQtPmV2ZW50X2ZsYWdzICYgU05EX1NPQ19EQVBNX1BSRV9SRUcpIHsKKwkJCXJldCA9IHdpZGdldC0+ZXZlbnQod2lkZ2V0LAorCQkJCWtjb250cm9sLCBTTkRfU09DX0RBUE1fUFJFX1JFRyk7CisJCQlpZiAocmV0IDwgMCkKKwkJCQlnb3RvIG91dDsKKwkJfQorCQlyZXQgPSBzbmRfc29jX3VwZGF0ZV9iaXRzKHdpZGdldC0+Y29kZWMsIGUtPnJlZywgbWFzaywgdmFsKTsKKwkJaWYgKHdpZGdldC0+ZXZlbnRfZmxhZ3MgJiBTTkRfU09DX0RBUE1fUE9TVF9SRUcpCisJCQlyZXQgPSB3aWRnZXQtPmV2ZW50KHdpZGdldCwKKwkJCQlrY29udHJvbCwgU05EX1NPQ19EQVBNX1BPU1RfUkVHKTsKKwl9IGVsc2UKKwkJcmV0ID0gc25kX3NvY191cGRhdGVfYml0cyh3aWRnZXQtPmNvZGVjLCBlLT5yZWcsIG1hc2ssIHZhbCk7CisKK291dDoKKwltdXRleF91bmxvY2soJndpZGdldC0+Y29kZWMtPm11dGV4KTsKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTF9HUEwoc25kX3NvY19kYXBtX3B1dF92YWx1ZV9lbnVtX2RvdWJsZSk7CisKKy8qKgogICogc25kX3NvY19kYXBtX25ld19jb250cm9sIC0gY3JlYXRlIG5ldyBkYXBtIGNvbnRyb2wKICAqIEBjb2RlYzogYXVkaW8gY29kZWMKICAqIEB3aWRnZXQ6IHdpZGdldCB0ZW1wbGF0ZQpAQCAtMTQxOSw3ICsxNjEwLDcgQEAKIAogLyoqCiAgKiBzbmRfc29jX2RhcG1fZW5hYmxlX3BpbiAtIGVuYWJsZSBwaW4uCi0gKiBAc25kX3NvY19jb2RlYzogU29DIGNvZGVjCisgKiBAY29kZWM6IFNvQyBjb2RlYwogICogQHBpbjogcGluIG5hbWUKICAqCiAgKiBFbmFibGVzIGlucHV0L291dHB1dCBwaW4gYW5kIGl0J3MgcGFyZW50cyBvciBjaGlsZHJlbiB3aWRnZXRzIGlmZiB0aGVyZSBpcwpkaWZmIC0tZ2l0IGEvc291bmQvc3BhcmMvY3M0MjMxLmMgYi9zb3VuZC9zcGFyYy9jczQyMzEuYwppbmRleCBkNDRiZjk4Li40MWMzODc1IDEwMDY0NAotLS0gYS9zb3VuZC9zcGFyYy9jczQyMzEuYworKysgYi9zb3VuZC9zcGFyYy9jczQyMzEuYwpAQCAtMjA1Nyw3ICsyMDU3LDcgQEAKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwogCi0Jc3ByaW50ZihjYXJkLT5sb25nbmFtZSwgIiVzIGF0IDB4JWx4LCBpcnEgJWQiLAorCXNwcmludGYoY2FyZC0+bG9uZ25hbWUsICIlcyBhdCAweCVsbHgsIGlycSAlZCIsCiAJCWNhcmQtPnNob3J0bmFtZSwKIAkJb3AtPnJlc291cmNlWzBdLnN0YXJ0LAogCQlvcC0+aXJxc1swXSk7CmRpZmYgLS1naXQgYS9zb3VuZC91c2IvY2FpYXEvY2FpYXEtZGV2aWNlLmMgYi9zb3VuZC91c2IvY2FpYXEvY2FpYXEtZGV2aWNlLmMKaW5kZXggYjE0M2VmNy4uYTYyNTAwZSAxMDA2NDQKLS0tIGEvc291bmQvdXNiL2NhaWFxL2NhaWFxLWRldmljZS5jCisrKyBiL3NvdW5kL3VzYi9jYWlhcS9jYWlhcS1kZXZpY2UuYwpAQCAtNDQ2LDcgKzQ0Niw3IEBACiAJaWYgKCFjYXJkKQogCQlyZXR1cm4gLUVOT01FTTsKIAkJCQotCWRldl9zZXRfZHJ2ZGF0YSgmaW50Zi0+ZGV2LCBjYXJkKTsKKwl1c2Jfc2V0X2ludGZkYXRhKGludGYsIGNhcmQpOwogCXJldCA9IGluaXRfY2FyZChjYWlhcWRldihjYXJkKSk7CiAJaWYgKHJldCA8IDApIHsKIAkJbG9nKCJ1bmFibGUgdG8gaW5pdCBjYXJkISAocmV0PSVkKVxuIiwgcmV0KTsKQEAgLTQ2MCw3ICs0NjAsNyBAQAogc3RhdGljIHZvaWQgc25kX2Rpc2Nvbm5lY3Qoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCiB7CiAJc3RydWN0IHNuZF91c2JfY2FpYXFkZXYgKmRldjsKLQlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQgPSBkZXZfZ2V0X2RydmRhdGEoJmludGYtPmRldik7CisJc3RydWN0IHNuZF9jYXJkICpjYXJkID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsKIAogCWRlYnVnKCIlcyglcClcbiIsIF9fZnVuY19fLCBpbnRmKTsKIApkaWZmIC0tZ2l0IGEvc291bmQvdXNiL3VzYmF1ZGlvLmMgYi9zb3VuZC91c2IvdXNiYXVkaW8uYwppbmRleCBiYmQ3MGQ1Li5jNzA5Yjk1IDEwMDY0NAotLS0gYS9zb3VuZC91c2IvdXNiYXVkaW8uYworKysgYi9zb3VuZC91c2IvdXNiYXVkaW8uYwpAQCAtMzcwOSw3ICszNzA5LDcgQEAKIAl2b2lkICpjaGlwOwogCWNoaXAgPSBzbmRfdXNiX2F1ZGlvX3Byb2JlKGludGVyZmFjZV90b191c2JkZXYoaW50ZiksIGludGYsIGlkKTsKIAlpZiAoY2hpcCkgewotCQlkZXZfc2V0X2RydmRhdGEoJmludGYtPmRldiwgY2hpcCk7CisJCXVzYl9zZXRfaW50ZmRhdGEoaW50ZiwgY2hpcCk7CiAJCXJldHVybiAwOwogCX0gZWxzZQogCQlyZXR1cm4gLUVJTzsKQEAgLTM3MTgsMTMgKzM3MTgsMTMgQEAKIHN0YXRpYyB2b2lkIHVzYl9hdWRpb19kaXNjb25uZWN0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQogewogCXNuZF91c2JfYXVkaW9fZGlzY29ubmVjdChpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpLAotCQkJCSBkZXZfZ2V0X2RydmRhdGEoJmludGYtPmRldikpOworCQkJCSB1c2JfZ2V0X2ludGZkYXRhKGludGYpKTsKIH0KIAogI2lmZGVmIENPTkZJR19QTQogc3RhdGljIGludCB1c2JfYXVkaW9fc3VzcGVuZChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwgcG1fbWVzc2FnZV90IG1lc3NhZ2UpCiB7Ci0Jc3RydWN0IHNuZF91c2JfYXVkaW8gKmNoaXAgPSBkZXZfZ2V0X2RydmRhdGEoJmludGYtPmRldik7CisJc3RydWN0IHNuZF91c2JfYXVkaW8gKmNoaXAgPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOwogCXN0cnVjdCBsaXN0X2hlYWQgKnA7CiAJc3RydWN0IHNuZF91c2Jfc3RyZWFtICphczsKIApAQCAtMzc0NCw3ICszNzQ0LDcgQEAKIAogc3RhdGljIGludCB1c2JfYXVkaW9fcmVzdW1lKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQogewotCXN0cnVjdCBzbmRfdXNiX2F1ZGlvICpjaGlwID0gZGV2X2dldF9kcnZkYXRhKCZpbnRmLT5kZXYpOworCXN0cnVjdCBzbmRfdXNiX2F1ZGlvICpjaGlwID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsKIAogCWlmIChjaGlwID09ICh2b2lkICopLTFMKQogCQlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL3NvdW5kL3VzYi91c2JtaWRpLmMgYi9zb3VuZC91c2IvdXNibWlkaS5jCmluZGV4IDZkOWY5YjEuLjMyMDY0MWEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3VzYi91c2JtaWRpLmMKKysrIGIvc291bmQvdXNiL3VzYm1pZGkuYwpAQCAtMTM5Miw4ICsxMzkyLDcgQEAKIAlmb3IgKGkgPSAwOyBpIDwgaW50ZmQtPmJOdW1FbmRwb2ludHM7ICsraSkgewogCQlob3N0ZXAgPSAmaG9zdGlmLT5lbmRwb2ludFtpXTsKIAkJZXAgPSBnZXRfZXBfZGVzYyhob3N0ZXApOwotCQlpZiAoKGVwLT5ibUF0dHJpYnV0ZXMgJiBVU0JfRU5EUE9JTlRfWEZFUlRZUEVfTUFTSykgIT0gVVNCX0VORFBPSU5UX1hGRVJfQlVMSyAmJgotCQkgICAgKGVwLT5ibUF0dHJpYnV0ZXMgJiBVU0JfRU5EUE9JTlRfWEZFUlRZUEVfTUFTSykgIT0gVVNCX0VORFBPSU5UX1hGRVJfSU5UKQorCQlpZiAoIXVzYl9lbmRwb2ludF94ZmVyX2J1bGsoZXApICYmICF1c2JfZW5kcG9pbnRfeGZlcl9pbnQoZXApKQogCQkJY29udGludWU7CiAJCW1zX2VwID0gKHN0cnVjdCB1c2JfbXNfZW5kcG9pbnRfZGVzY3JpcHRvciopaG9zdGVwLT5leHRyYTsKIAkJaWYgKGhvc3RlcC0+ZXh0cmFsZW4gPCA0IHx8CkBAIC0xNDAxLDE1ICsxNDAwLDE1IEBACiAJCSAgICBtc19lcC0+YkRlc2NyaXB0b3JUeXBlICE9IFVTQl9EVF9DU19FTkRQT0lOVCB8fAogCQkgICAgbXNfZXAtPmJEZXNjcmlwdG9yU3VidHlwZSAhPSBNU19HRU5FUkFMKQogCQkJY29udGludWU7Ci0JCWlmICgoZXAtPmJFbmRwb2ludEFkZHJlc3MgJiBVU0JfRU5EUE9JTlRfRElSX01BU0spID09IFVTQl9ESVJfT1VUKSB7CisJCWlmICh1c2JfZW5kcG9pbnRfZGlyX291dChlcCkpIHsKIAkJCWlmIChlbmRwb2ludHNbZXBpZHhdLm91dF9lcCkgewogCQkJCWlmICgrK2VwaWR4ID49IE1JRElfTUFYX0VORFBPSU5UUykgewogCQkJCQlzbmRfcHJpbnRrKEtFUk5fV0FSTklORyAidG9vIG1hbnkgZW5kcG9pbnRzXG4iKTsKIAkJCQkJYnJlYWs7CiAJCQkJfQogCQkJfQotCQkJZW5kcG9pbnRzW2VwaWR4XS5vdXRfZXAgPSBlcC0+YkVuZHBvaW50QWRkcmVzcyAmIFVTQl9FTkRQT0lOVF9OVU1CRVJfTUFTSzsKLQkJCWlmICgoZXAtPmJtQXR0cmlidXRlcyAmIFVTQl9FTkRQT0lOVF9YRkVSVFlQRV9NQVNLKSA9PSBVU0JfRU5EUE9JTlRfWEZFUl9JTlQpCisJCQllbmRwb2ludHNbZXBpZHhdLm91dF9lcCA9IHVzYl9lbmRwb2ludF9udW0oZXApOworCQkJaWYgKHVzYl9lbmRwb2ludF94ZmVyX2ludChlcCkpCiAJCQkJZW5kcG9pbnRzW2VwaWR4XS5vdXRfaW50ZXJ2YWwgPSBlcC0+YkludGVydmFsOwogCQkJZWxzZSBpZiAoc25kX3VzYl9nZXRfc3BlZWQodW1pZGktPmNoaXAtPmRldikgPT0gVVNCX1NQRUVEX0xPVykKIAkJCQkvKgpAQCAtMTQyOCw4ICsxNDI3LDggQEAKIAkJCQkJYnJlYWs7CiAJCQkJfQogCQkJfQotCQkJZW5kcG9pbnRzW2VwaWR4XS5pbl9lcCA9IGVwLT5iRW5kcG9pbnRBZGRyZXNzICYgVVNCX0VORFBPSU5UX05VTUJFUl9NQVNLOwotCQkJaWYgKChlcC0+Ym1BdHRyaWJ1dGVzICYgVVNCX0VORFBPSU5UX1hGRVJUWVBFX01BU0spID09IFVTQl9FTkRQT0lOVF9YRkVSX0lOVCkKKwkJCWVuZHBvaW50c1tlcGlkeF0uaW5fZXAgPSB1c2JfZW5kcG9pbnRfbnVtKGVwKTsKKwkJCWlmICh1c2JfZW5kcG9pbnRfeGZlcl9pbnQoZXApKQogCQkJCWVuZHBvaW50c1tlcGlkeF0uaW5faW50ZXJ2YWwgPSBlcC0+YkludGVydmFsOwogCQkJZWxzZSBpZiAoc25kX3VzYl9nZXRfc3BlZWQodW1pZGktPmNoaXAtPmRldikgPT0gVVNCX1NQRUVEX0xPVykKIAkJCQllbmRwb2ludHNbZXBpZHhdLmluX2ludGVydmFsID0gMTsKQEAgLTE0OTUsMjAgKzE0OTQsMjAgQEAKIAogCWZvciAoaSA9IDA7IGkgPCBpbnRmZC0+Yk51bUVuZHBvaW50czsgKytpKSB7CiAJCWVwZCA9IGdldF9lbmRwb2ludChob3N0aWYsIGkpOwotCQlpZiAoKGVwZC0+Ym1BdHRyaWJ1dGVzICYgVVNCX0VORFBPSU5UX1hGRVJUWVBFX01BU0spICE9IFVTQl9FTkRQT0lOVF9YRkVSX0JVTEsgJiYKLQkJICAgIChlcGQtPmJtQXR0cmlidXRlcyAmIFVTQl9FTkRQT0lOVF9YRkVSVFlQRV9NQVNLKSAhPSBVU0JfRU5EUE9JTlRfWEZFUl9JTlQpCisJCWlmICghdXNiX2VuZHBvaW50X3hmZXJfYnVsayhlcGQpICYmCisJCSAgICAhdXNiX2VuZHBvaW50X3hmZXJfaW50KGVwZCkpCiAJCQljb250aW51ZTsKIAkJaWYgKG91dF9lcHMgPCBtYXhfZW5kcG9pbnRzICYmCi0JCSAgICAoZXBkLT5iRW5kcG9pbnRBZGRyZXNzICYgVVNCX0VORFBPSU5UX0RJUl9NQVNLKSA9PSBVU0JfRElSX09VVCkgewotCQkJZW5kcG9pbnRbb3V0X2Vwc10ub3V0X2VwID0gZXBkLT5iRW5kcG9pbnRBZGRyZXNzICYgVVNCX0VORFBPSU5UX05VTUJFUl9NQVNLOwotCQkJaWYgKChlcGQtPmJtQXR0cmlidXRlcyAmIFVTQl9FTkRQT0lOVF9YRkVSVFlQRV9NQVNLKSA9PSBVU0JfRU5EUE9JTlRfWEZFUl9JTlQpCisJCSAgICB1c2JfZW5kcG9pbnRfZGlyX291dChlcGQpKSB7CisJCQllbmRwb2ludFtvdXRfZXBzXS5vdXRfZXAgPSB1c2JfZW5kcG9pbnRfbnVtKGVwZCk7CisJCQlpZiAodXNiX2VuZHBvaW50X3hmZXJfaW50KGVwZCkpCiAJCQkJZW5kcG9pbnRbb3V0X2Vwc10ub3V0X2ludGVydmFsID0gZXBkLT5iSW50ZXJ2YWw7CiAJCQkrK291dF9lcHM7CiAJCX0KIAkJaWYgKGluX2VwcyA8IG1heF9lbmRwb2ludHMgJiYKLQkJICAgIChlcGQtPmJFbmRwb2ludEFkZHJlc3MgJiBVU0JfRU5EUE9JTlRfRElSX01BU0spID09IFVTQl9ESVJfSU4pIHsKLQkJCWVuZHBvaW50W2luX2Vwc10uaW5fZXAgPSBlcGQtPmJFbmRwb2ludEFkZHJlc3MgJiBVU0JfRU5EUE9JTlRfTlVNQkVSX01BU0s7Ci0JCQlpZiAoKGVwZC0+Ym1BdHRyaWJ1dGVzICYgVVNCX0VORFBPSU5UX1hGRVJUWVBFX01BU0spID09IFVTQl9FTkRQT0lOVF9YRkVSX0lOVCkKKwkJICAgIHVzYl9lbmRwb2ludF9kaXJfaW4oZXBkKSkgeworCQkJZW5kcG9pbnRbaW5fZXBzXS5pbl9lcCA9IHVzYl9lbmRwb2ludF9udW0oZXBkKTsKKwkJCWlmICh1c2JfZW5kcG9pbnRfeGZlcl9pbnQoZXBkKSkKIAkJCQllbmRwb2ludFtpbl9lcHNdLmluX2ludGVydmFsID0gZXBkLT5iSW50ZXJ2YWw7CiAJCQkrK2luX2VwczsKIAkJfQpAQCAtMTYwNywyMSArMTYwNiwxOSBAQAogCX0KIAogCWVwZCA9IGdldF9lbmRwb2ludChob3N0aWYsIDApOwotCWlmICgoZXBkLT5iRW5kcG9pbnRBZGRyZXNzICYgVVNCX0VORFBPSU5UX0RJUl9NQVNLKSAhPSBVU0JfRElSX0lOIHx8Ci0JICAgIChlcGQtPmJtQXR0cmlidXRlcyAmIFVTQl9FTkRQT0lOVF9YRkVSVFlQRV9NQVNLKSAhPSBVU0JfRU5EUE9JTlRfWEZFUl9JTlQpIHsKKwlpZiAoIXVzYl9lbmRwb2ludF9kaXJfaW4oZXBkKSB8fCAhdXNiX2VuZHBvaW50X3hmZXJfaW50KGVwZCkpIHsKIAkJc25kX3ByaW50ZGQoS0VSTl9FUlIgImVuZHBvaW50WzBdIGlzbid0IGludGVycnVwdFxuIik7CiAJCXJldHVybiAtRU5YSU87CiAJfQogCWVwZCA9IGdldF9lbmRwb2ludChob3N0aWYsIDIpOwotCWlmICgoZXBkLT5iRW5kcG9pbnRBZGRyZXNzICYgVVNCX0VORFBPSU5UX0RJUl9NQVNLKSAhPSBVU0JfRElSX09VVCB8fAotCSAgICAoZXBkLT5ibUF0dHJpYnV0ZXMgJiBVU0JfRU5EUE9JTlRfWEZFUlRZUEVfTUFTSykgIT0gVVNCX0VORFBPSU5UX1hGRVJfQlVMSykgeworCWlmICghdXNiX2VuZHBvaW50X2Rpcl9vdXQoZXBkKSB8fCAhdXNiX2VuZHBvaW50X3hmZXJfYnVsayhlcGQpKSB7CiAJCXNuZF9wcmludGRkKEtFUk5fRVJSICJlbmRwb2ludFsyXSBpc24ndCBidWxrIG91dHB1dFxuIik7CiAJCXJldHVybiAtRU5YSU87CiAJfQogCWlmIChlbmRwb2ludC0+b3V0X2NhYmxlcyA+IDB4MDAwMSkgewogCQllcGQgPSBnZXRfZW5kcG9pbnQoaG9zdGlmLCA0KTsKLQkJaWYgKChlcGQtPmJFbmRwb2ludEFkZHJlc3MgJiBVU0JfRU5EUE9JTlRfRElSX01BU0spICE9IFVTQl9ESVJfT1VUIHx8Ci0JCSAgICAoZXBkLT5ibUF0dHJpYnV0ZXMgJiBVU0JfRU5EUE9JTlRfWEZFUlRZUEVfTUFTSykgIT0gVVNCX0VORFBPSU5UX1hGRVJfQlVMSykgeworCQlpZiAoIXVzYl9lbmRwb2ludF9kaXJfb3V0KGVwZCkgfHwKKwkJICAgICF1c2JfZW5kcG9pbnRfeGZlcl9idWxrKGVwZCkpIHsKIAkJCXNuZF9wcmludGRkKEtFUk5fRVJSICJlbmRwb2ludFs0XSBpc24ndCBidWxrIG91dHB1dFxuIik7CiAJCQlyZXR1cm4gLUVOWElPOwogCQl9CmRpZmYgLS1naXQgYS9zb3VuZC91c2IvdXNibWl4ZXIuYyBiL3NvdW5kL3VzYi91c2JtaXhlci5jCmluZGV4IGE0OTI0NjEuLjAwMzk3YzggMTAwNjQ0Ci0tLSBhL3NvdW5kL3VzYi91c2JtaXhlci5jCisrKyBiL3NvdW5kL3VzYi91c2JtaXhlci5jCkBAIC0xNzU1LDExICsxNzU1LDEwIEBACiAJaWYgKGdldF9pZmFjZV9kZXNjKGhvc3RpZiktPmJOdW1FbmRwb2ludHMgPCAxKQogCQlyZXR1cm4gMDsKIAllcCA9IGdldF9lbmRwb2ludChob3N0aWYsIDApOwotCWlmICgoZXAtPmJFbmRwb2ludEFkZHJlc3MgJiBVU0JfRU5EUE9JTlRfRElSX01BU0spICE9IFVTQl9ESVJfSU4gfHwKLQkgICAgKGVwLT5ibUF0dHJpYnV0ZXMgJiBVU0JfRU5EUE9JTlRfWEZFUlRZUEVfTUFTSykgIT0gVVNCX0VORFBPSU5UX1hGRVJfSU5UKQorCWlmICghdXNiX2VuZHBvaW50X2Rpcl9pbihlcCkgfHwgIXVzYl9lbmRwb2ludF94ZmVyX2ludChlcCkpCiAJCXJldHVybiAwOwogCi0JZXBudW0gPSBlcC0+YkVuZHBvaW50QWRkcmVzcyAmIFVTQl9FTkRQT0lOVF9OVU1CRVJfTUFTSzsKKwllcG51bSA9IHVzYl9lbmRwb2ludF9udW0oZXApOwogCWJ1ZmZlcl9sZW5ndGggPSBsZTE2X3RvX2NwdShlcC0+d01heFBhY2tldFNpemUpOwogCXRyYW5zZmVyX2J1ZmZlciA9IGttYWxsb2MoYnVmZmVyX2xlbmd0aCwgR0ZQX0tFUk5FTCk7CiAJaWYgKCF0cmFuc2Zlcl9idWZmZXIpCmRpZmYgLS1naXQgYS9zb3VuZC91c2IvdXN4MnkvdXMxMjJsLmMgYi9zb3VuZC91c2IvdXN4MnkvdXMxMjJsLmMKaW5kZXggYzI1MTViNi4uNzNlNTlmNCAxMDA2NDQKLS0tIGEvc291bmQvdXNiL3VzeDJ5L3VzMTIybC5jCisrKyBiL3NvdW5kL3VzYi91c3gyeS91czEyMmwuYwpAQCAtNTg5LDcgKzU4OSw3IEBACiAJc3RydWN0IHVzMTIybCAqdXMxMjJsOwogCXN0cnVjdCBsaXN0X2hlYWQgKnA7CiAKLQljYXJkID0gZGV2X2dldF9kcnZkYXRhKCZpbnRmLT5kZXYpOworCWNhcmQgPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOwogCWlmICghY2FyZCkKIAkJcmV0dXJuIDA7CiAJc25kX3Bvd2VyX2NoYW5nZV9zdGF0ZShjYXJkLCBTTkRSVl9DVExfUE9XRVJfRDNob3QpOwpAQCAtNjE1LDcgKzYxNSw3IEBACiAJc3RydWN0IGxpc3RfaGVhZCAqcDsKIAlpbnQgZXJyOwogCi0JY2FyZCA9IGRldl9nZXRfZHJ2ZGF0YSgmaW50Zi0+ZGV2KTsKKwljYXJkID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsKIAlpZiAoIWNhcmQpCiAJCXJldHVybiAwOwogCmRpZmYgLS1naXQgYS9zb3VuZC91c2IvdXN4MnkvdXNidXN4MnkuYyBiL3NvdW5kL3VzYi91c3gyeS91c2J1c3gyeS5jCmluZGV4IGU1OTgxYTYuLjExNjM5YmQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3VzYi91c3gyeS91c2J1c3gyeS5jCisrKyBiL3NvdW5kL3VzYi91c3gyeS91c2J1c3gyeS5jCkBAIC0yMzgsNyArMjM4LDcgQEAKIAkJCQkJc2VuZCA9IDA7CiAJCQkJZm9yIChqID0gMDsgaiA8IFVSQlNfQXN5bmNTZXEgICYmICAhZXJyOyArK2opCiAJCQkJCWlmICgwID09IHVzWDJZLT5BUzA0LnVyYltqXS0+c3RhdHVzKSB7Ci0JCQkJCQlzdHJ1Y3QgdXM0MjhfcDRvdXQgKnA0b3V0ID0gdXM0MjhjdGxzLT5wNG91dCArIHNlbmQ7CS8vIEZJWE1FIGlmIG1vcmUgdGhlbiAxIHA0b3V0IGlzIG5ldywgMSBnZXRzIGxvc3QuCisJCQkJCQlzdHJ1Y3QgdXM0MjhfcDRvdXQgKnA0b3V0ID0gdXM0MjhjdGxzLT5wNG91dCArIHNlbmQ7CS8vIEZJWE1FIGlmIG1vcmUgdGhhbiAxIHA0b3V0IGlzIG5ldywgMSBnZXRzIGxvc3QuCiAJCQkJCQl1c2JfZmlsbF9idWxrX3VyYih1c1gyWS0+QVMwNC51cmJbal0sIHVzWDJZLT5jaGlwLmRldiwKIAkJCQkJCQkJICB1c2Jfc25kYnVsa3BpcGUodXNYMlktPmNoaXAuZGV2LCAweDA0KSwgJnA0b3V0LT52YWwudm9sLCAKIAkJCQkJCQkJICBwNG91dC0+dHlwZSA9PSBlTFRfTGlnaHQgPyBzaXplb2Yoc3RydWN0IHVzNDI4X2xpZ2h0cykgOiA1LApAQCAtMzkyLDcgKzM5Miw3IEBACiAJdm9pZCAqY2hpcDsKIAljaGlwID0gdXNYMllfdXNiX3Byb2JlKGludGVyZmFjZV90b191c2JkZXYoaW50ZiksIGludGYsIGlkKTsKIAlpZiAoY2hpcCkgewotCQlkZXZfc2V0X2RydmRhdGEoJmludGYtPmRldiwgY2hpcCk7CisJCXVzYl9zZXRfaW50ZmRhdGEoaW50ZiwgY2hpcCk7CiAJCXJldHVybiAwOwogCX0gZWxzZQogCQlyZXR1cm4gLUVJTzsKQEAgLTQwMSw3ICs0MDEsNyBAQAogc3RhdGljIHZvaWQgc25kX3VzWDJZX2Rpc2Nvbm5lY3Qoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCiB7CiAJdXNYMllfdXNiX2Rpc2Nvbm5lY3QoaW50ZXJmYWNlX3RvX3VzYmRldihpbnRmKSwKLQkJCQkgZGV2X2dldF9kcnZkYXRhKCZpbnRmLT5kZXYpKTsKKwkJCQkgdXNiX2dldF9pbnRmZGF0YShpbnRmKSk7CiB9CiAKIE1PRFVMRV9ERVZJQ0VfVEFCTEUodXNiLCBzbmRfdXNYMllfdXNiX2lkX3RhYmxlKTsK